diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5321793dd39..7ed24723f90 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -93,6 +93,52 @@ jobs: limit-access-to-actor: true limit-access-to-users: hashdata-build wait-timeout-minutes: 60 + ic-singlenode-test: + needs: build + runs-on: [ self-hosted, example ] + env: + MAKE_TEST_COMMAND: "-C src/test installcheck-singlenode" + NUM_PRIMARY_MIRROR_PAIRS: "0" + TEST_OS: "centos" + DUMP_DB: "true" + steps: + - uses: actions/checkout@v3 + with: + path: "gpdb_src" + - uses: actions/download-artifact@v3 + with: + name: cbdb-variables + path: /opt/ + - uses: actions/download-artifact@v3 + with: + name: cbdb-package + path: /opt/ + - name: Run icw-test script + run: | + mkdir /code + cp -a gpdb_src/ /code + cd /code + echo $GITHUB_RUN_ID > gpdb_src/BUILD_NUMBER + gpdb_src/hd-ci/icw_cbdb.bash $FTS_MODE + - uses: actions/upload-artifact@v3 + if: failure() + with: + name: cbdb-ic-singlenode-test-log + path: | + /code/gpdb_src/src/test/singlenode_regress/regression.out + /code/gpdb_src/src/test/singlenode_regress/regression.diffs + /code/gpdb_src/src/test/singlenode_regress/results/ + /code/gpdb_src/src/test/singlenode_regress/expected/ + /code/gpdb_src/src/test/singlenode_isolation2/regression.out + /code/gpdb_src/src/test/singlenode_isolation2/regression.diffs + /code/gpdb_src/src/test/singlenode_isolation2/results/ + /code/gpdb_src/src/test/singlenode_isolation2/expected/ + /code/gpdb_src/src/test/isolation/regression.out + /code/gpdb_src/src/test/isolation/regression.diffs + /code/gpdb_src/src/test/isolation/output_iso/results/ + /code/gpdb_src/src/test/isolation/expected/ + /code/gpdb_src/gpAux/gpdemo/datadirs/standby/log/ + /code/gpdb_src/gpAux/gpdemo/datadirs/singlenodedir/demoDataDir-1/log/ icw-orca-test: needs: build runs-on: [self-hosted, example] diff --git a/GNUmakefile.in b/GNUmakefile.in index d01ebbe76f8..a2198afd404 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -126,6 +126,10 @@ distclean maintainer-clean: installcheck-resgroup: $(MAKE) -C src/test/isolation2 $@ +# Create a demo singlenode deployment. +create-demo-singlenode: + $(MAKE) -C gpAux/gpdemo create-demo-cluster NUM_PRIMARY_MIRROR_PAIRS=0 + # Create or destroy a demo cluster. create-demo-cluster: $(MAKE) -C gpAux/gpdemo create-demo-cluster diff --git a/gpAux/gpdemo/demo_cluster.sh b/gpAux/gpdemo/demo_cluster.sh index a89c3ac114a..d04521480bb 100755 --- a/gpAux/gpdemo/demo_cluster.sh +++ b/gpAux/gpdemo/demo_cluster.sh @@ -22,6 +22,14 @@ SEG_PREFIX=demoDataDir STANDBYDIR=$DATADIRS/standby EXTERNAL_FTS_ENABLED="false" +SINGLENODE_OPTS="" +SINGLENODE_MODE="" +if [ "${NUM_PRIMARY_MIRROR_PAIRS}" -eq "0" ]; then + SINGLENODE_MODE="true" + SINGLENODE_OPTS="--singlenodeMode=true" + QDDIR=$DATADIRS/singlenodedir +fi + # ====================================================================== # Database Ports # ====================================================================== @@ -391,33 +399,33 @@ if [ -f "${CLUSTER_CONFIG_POSTGRES_ADDONS}" ]; then if [ $EXTERNAL_FTS_ENABLED == "true" ]; then echo "==========================================================================================" echo "executing:" - echo " $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs -U 1 -p ${CLUSTER_CONFIG_POSTGRES_ADDONS} ${STANDBY_INIT_OPTS} \"$@\"" + echo " $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs -U 1 -p ${CLUSTER_CONFIG_POSTGRES_ADDONS} ${STANDBY_INIT_OPTS} ${SINGLENODE_OPTS} \"$@\"" echo "==========================================================================================" echo "" - $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs -U 1 -p ${CLUSTER_CONFIG_POSTGRES_ADDONS} ${STANDBY_INIT_OPTS} "$@" + $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs -U 1 -p ${CLUSTER_CONFIG_POSTGRES_ADDONS} ${STANDBY_INIT_OPTS} ${SINGLENODE_OPTS} "$@" else echo "==========================================================================================" echo "executing:" - echo " $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs -p ${CLUSTER_CONFIG_POSTGRES_ADDONS} ${STANDBY_INIT_OPTS} \"$@\"" + echo " $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs -p ${CLUSTER_CONFIG_POSTGRES_ADDONS} ${STANDBY_INIT_OPTS} ${SINGLENODE_OPTS} \"$@\"" echo "==========================================================================================" echo "" - $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs -p ${CLUSTER_CONFIG_POSTGRES_ADDONS} ${STANDBY_INIT_OPTS} "$@" + $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs -p ${CLUSTER_CONFIG_POSTGRES_ADDONS} ${STANDBY_INIT_OPTS} ${SINGLENODE_OPTS} "$@" fi else if [ $EXTERNAL_FTS_ENABLED == "true" ]; then echo "==========================================================================================" echo "executing:" - echo " $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -U 1 -l $DATADIRS/gpAdminLogs ${STANDBY_INIT_OPTS} \"$@\"" + echo " $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -U 1 -l $DATADIRS/gpAdminLogs ${STANDBY_INIT_OPTS} ${SINGLENODE_OPTS} \"$@\"" echo "==========================================================================================" echo "" - $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -U 1 -l $DATADIRS/gpAdminLogs ${STANDBY_INIT_OPTS} "$@" + $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -U 1 -l $DATADIRS/gpAdminLogs ${STANDBY_INIT_OPTS} ${SINGLENODE_OPTS} "$@" else echo "==========================================================================================" echo "executing:" - echo " $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs ${STANDBY_INIT_OPTS} \"$@\"" + echo " $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs ${STANDBY_INIT_OPTS} ${SINGLENODE_OPTS} \"$@\"" echo "==========================================================================================" echo "" - $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs ${STANDBY_INIT_OPTS} "$@" + $GPPATH/gpinitsystem -a -c $CLUSTER_CONFIG -l $DATADIRS/gpAdminLogs ${STANDBY_INIT_OPTS} ${SINGLENODE_OPTS} "$@" fi fi RETURN=$? diff --git a/gpMgmt/bin/gpconfig b/gpMgmt/bin/gpconfig index d6e8defbaf3..be56567521f 100755 --- a/gpMgmt/bin/gpconfig +++ b/gpMgmt/bin/gpconfig @@ -254,7 +254,7 @@ def get_gucs_from_database(gucname): def _print_gucs(gucname, gucs, options): - collection = GucCollection() + collection = GucCollection(options) collection.update_list(gucs) if _show_all_segment_values_always(options): diff --git a/gpMgmt/bin/gpconfig_modules/guc_collection.py b/gpMgmt/bin/gpconfig_modules/guc_collection.py index 1f1978e751e..febbcb4fdbb 100644 --- a/gpMgmt/bin/gpconfig_modules/guc_collection.py +++ b/gpMgmt/bin/gpconfig_modules/guc_collection.py @@ -9,8 +9,9 @@ class GucCollection: """ COORDINATOR_KEY = '-1' - def __init__(self): + def __init__(self, options): self.gucs = {} + self.options = options def update_list(self, guc_list): for guc in guc_list: @@ -51,7 +52,7 @@ def _check_consistency_within_single_segment(self): return True def validate(self): - if len(self.gucs) < 2 or self.COORDINATOR_KEY not in self.gucs: + if (len(self.gucs) < 2 and not self.options.coordinatoronly) or self.COORDINATOR_KEY not in self.gucs: raise Exception("Collections must have at least a coordinator and segment value") def values(self): diff --git a/gpMgmt/bin/gpinitsystem b/gpMgmt/bin/gpinitsystem index a31a164a571..eb816dcc707 100755 --- a/gpMgmt/bin/gpinitsystem +++ b/gpMgmt/bin/gpinitsystem @@ -62,6 +62,7 @@ LOG_STATEMENT_TXT="#log_statement =" LISTEN_ADR_TXT="listen_addresses" CONTENT_ID_TXT="gp_contentid" DBID_TXT="gp_dbid" +SINGLENODE_MODE_TXT="gp_internal_is_singlenode" INIT_STANDBY_PROG=$GPINITSTANDBY QE_MIRROR_ARRAY="" GP_PASSWD=gparray @@ -89,6 +90,7 @@ declare -a FTS_HOST_MACHINE_LIST USE_EXTERNAL_FTS=0 DEMO_CLUSTER_HOST="127.0.0.1" ETCD_EXIST="false" +SINGLENODE_MODE="false" #****************************************************************************** # DCA Specific Variables @@ -334,7 +336,7 @@ CHK_PARAMS () { if [ x"" = x"$SEG_PREFIX" ]; then ERROR_EXIT "[FATAL]:-SEG_PREFIX not specified in $CLUSTER_CONFIG file, is this the correct instance configuration file." fi - if [ x"" = x"$DATA_DIRECTORY" ]; then + if [ "$SINGLENODE_MODE" == "false" ] && [ x"" = x"$DATA_DIRECTORY" ]; then ERROR_EXIT "[FATAL]:-DATA_DIRECTORY not specified in $CLUSTER_CONFIG file, is this the correct instance configuration file." fi @@ -411,7 +413,7 @@ CHK_PARAMS () { # DATA_DIRECTORY ((QE_PRIMARY_COUNT=${#DATA_DIRECTORY[@]})) - if [ $QE_PRIMARY_COUNT -eq 0 ]; then + if [ "$SINGLENODE_MODE" == "false" ] && [ $QE_PRIMARY_COUNT -eq 0 ]; then ERROR_EXIT "[FATAL]:-Number of primary directories 0 (zero)" fi @@ -469,7 +471,7 @@ CHK_PARAMS () { fi # Number of QE hosts in this configuration ((NUM_QES=${#MACHINE_LIST[*]})) - if [ $NUM_QES -eq 0 ]; then + if [ "$SINGLENODE_MODE" == "false" ] && [ $NUM_QES -eq 0 ]; then ERROR_EXIT "[FATAL]:-Number of Segment instances's 0 (zero)" else LOG_MSG "[INFO]:-Number of segment instance hosts = $NUM_QES" @@ -1029,7 +1031,7 @@ CREATE_QE_ARRAY () { LAST_HOST=$QE_HOST done if [ $DEBUG_LEVEL -eq 0 ] && [ x"" != x"$VERBOSE" ];then $ECHO;fi - if [ $MIRRORING -eq 1 ] ;then + if [ $MIRRORING -eq 1 ] && [ "$SINGLENODE_MODE" == "false" ] ;then ((MIRROR_OFFSET=$MIRROR_PORT_BASE-$PORT_BASE)) if [ $MIRROR_TYPE -eq 1 ];then CREATE_SPREAD_MIRROR_ARRAY @@ -1330,6 +1332,12 @@ CREATE_QD_DB () { SED_PG_CONF ${GP_DIR}/$PG_INTERNAL_CONF "$DBID_TXT" "gp_dbid=$GP_DBID" 0 ERROR_CHK $? "set gp_dbid=$GP_DBID in ${GP_DIR}/$PG_INTERNAL_CONF" 1 + if [ "$SINGLENODE_MODE" == "true" ]; then + LOG_MSG "[INFO]:-Setting Coordinator singlenodeMode" + SED_PG_CONF ${GP_DIR}/$PG_CONF "$SINGLENODE_MODE_TXT" "gp_internal_is_singlenode=on" 0 + ERROR_CHK $? "set gp_internal_is_singlenode=on in ${GP_DIR}/$PG_CONF" 1 + fi + if [ x"" != x"$PG_CONF_ADD_FILE" ]; then LOG_MSG "[INFO]:-Processing additional configuration parameters" for NEW_PARAM in `$CAT $PG_CONF_ADD_FILE|$TR -s ' '|$TR -d ' '|$GREP -v "^#"` @@ -1368,7 +1376,9 @@ CREATE_QD_DB () { fi UPDATE_GPCONFIG $GP_PORT $GP_DBID $GP_CONTENT $GP_HOSTNAME $GP_HOSTADDRESS $GP_PORT $GP_DIR p SET_LOCALE_VARS_BASED_ON_COORDINATOR - LOAD_QE_SYSTEM_DATA $DEFAULTDB + if [ "$SINGLENODE_MODE" == "false" ]; then + LOAD_QE_SYSTEM_DATA $DEFAULTDB + fi SET_VAR $QD_PRIMARY_ARRAY LOG_MSG "[INFO]:-End Function $FUNCNAME" } @@ -2128,6 +2138,7 @@ while getopts ":vaqe:c:l:-:p:m:h:n:s:P:S:b:DB:I:O:E:F:M:U:T:C" opt NAME=${OPTARG%%=*} VAL=${OPTARG#*=} case $NAME in + "singlenodeMode" ) SINGLENODE_MODE=$VAL ;; "max_connections" ) COORDINATOR_MAX_CONNECT=$VAL ;; "shared_buffers" ) NEW_BUFFERS=$VAL ;; "su_password" ) GP_PASSWD=$VAL ;; @@ -2199,7 +2210,10 @@ else CHK_MULTI_HOME CREATE_QE_ARRAY CHK_QE_ARRAY_PORT_RANGES - CHK_QES + + if [ "$SINGLENODE_MODE" == "false" ] ; then + CHK_QES + fi if [ x"" != x"$OUTPUT_CONFIG" ] ; then DUMP_OUTPUT_CONFIG @@ -2207,7 +2221,9 @@ else fi DISPLAY_CONFIG - ARRAY_REORDER + if [ "$SINGLENODE_MODE" == "false" ] ; then + ARRAY_REORDER + fi fi if [ $USE_EXTERNAL_FTS -ne 0 ];then @@ -2224,19 +2240,21 @@ CREATE_QD_DB CREATE_ARRAY_SORTED_ON_CONTENT_ID -CREATE_SEGMENT IS_PRIMARY -if [ $REPORT_FAIL -ne 0 ];then - LOG_MSG "[FATAL]:-Errors generated from parallel processes" 1 - LOG_MSG "[INFO]:-Dumped contents of status file to the log file" 1 - ERROR_EXIT "[FATAL]:-Failures detected, see log file $LOG_FILE for more detail" -else - LOG_MSG "[INFO]:-Removing back out file" 1 - $RM -f $BACKOUT_FILE - LOG_MSG "[INFO]:-No errors generated from parallel processes" 1 -fi +if [ "$SINGLENODE_MODE" == "false" ]; then + CREATE_SEGMENT IS_PRIMARY + if [ $REPORT_FAIL -ne 0 ];then + LOG_MSG "[FATAL]:-Errors generated from parallel processes" 1 + LOG_MSG "[INFO]:-Dumped contents of status file to the log file" 1 + ERROR_EXIT "[FATAL]:-Failures detected, see log file $LOG_FILE for more detail" + else + LOG_MSG "[INFO]:-Removing back out file" 1 + $RM -f $BACKOUT_FILE + LOG_MSG "[INFO]:-No errors generated from parallel processes" 1 + fi -if [ -f $DCA_VERSION_FILE ]; then - SET_DCA_CONFIG_SETTINGS + if [ -f $DCA_VERSION_FILE ]; then + SET_DCA_CONFIG_SETTINGS + fi fi if [ $USE_EXTERNAL_FTS -ne 0 ];then diff --git a/gpMgmt/bin/gppylib/gparray.py b/gpMgmt/bin/gppylib/gparray.py index 8ee8852911b..a87c66de587 100755 --- a/gpMgmt/bin/gppylib/gparray.py +++ b/gpMgmt/bin/gppylib/gparray.py @@ -959,6 +959,9 @@ def initFromCatalog(dbURL, utility=False): if not version.isVersionCurrentRelease(): raise Exception("Cannot connect to GPDB version %s from installed version %s"%(version.getVersionRelease(), MAIN_VERSION[0])) + # Get gp_internal_is_singlenode GUC + is_singlenode = dbconn.querySingleton(conn, "SHOW gp_internal_is_singlenode") == "on" + config_rows = dbconn.query(conn, ''' SELECT dbid, content, role, preferred_role, mode, status, hostname, address, port, datadir @@ -993,6 +996,7 @@ def initFromCatalog(dbURL, utility=False): array = GpArray(segments, origSegments) array.__version = version + array.is_singlenode = is_singlenode array.recoveredSegmentDbids = recoveredSegmentDbids array.hasMirrors = hasMirrors diff --git a/gpMgmt/bin/gppylib/programs/clsRecoverSegment.py b/gpMgmt/bin/gppylib/programs/clsRecoverSegment.py index 82339a35ab5..6304e5d0cfb 100644 --- a/gpMgmt/bin/gppylib/programs/clsRecoverSegment.py +++ b/gpMgmt/bin/gppylib/programs/clsRecoverSegment.py @@ -267,7 +267,7 @@ def run(self): gpArray = confProvider.loadSystemConfig(useUtilityMode=False) - if not gpArray.hasMirrors: + if not gpArray.hasMirrors and not gpArray.standbyCoordinator: raise ExceptionNoStackTraceNeeded( 'GPDB Mirroring replication is not configured for this Cloudberry Database instance.') diff --git a/gpMgmt/bin/gpstart b/gpMgmt/bin/gpstart index 933d41fe1f2..817e735a46b 100755 --- a/gpMgmt/bin/gpstart +++ b/gpMgmt/bin/gpstart @@ -77,6 +77,7 @@ class GpStart: self.fts_hosts = fts_hosts self.etcd_hosts = etcd_hosts self.is_external_fts = is_external_fts + self.singlenodemode = False # # Some variables that are set during execution @@ -169,6 +170,12 @@ class GpStart: self._startCoordinator() logger.info("Coordinator Started...") + self.singlenodemode = self.gparray.is_singlenode + if self.singlenodemode: + logger.warning("SinglenodeMode has been enabled, no segment will be created.") + standby_was_started = self._start_standby() + return 0 + if self.coordinatoronly: if self.is_external_fts: self._start_all_fts() diff --git a/gpMgmt/bin/gpstop b/gpMgmt/bin/gpstop index 48c0a193388..92c401b1bcf 100755 --- a/gpMgmt/bin/gpstop +++ b/gpMgmt/bin/gpstop @@ -163,7 +163,12 @@ class GpStop: """ self._prepare() + if self.gparray.get_segment_count() == 0: + self.coordinatoronly = True + if self.coordinatoronly: + if self.sighup: + return self._sighup_cluster() if self.interactive: if not userinput.ask_yesno(None, "\nContinue with coordinator-only shutdown", 'N'): raise UserAbortedException() @@ -180,6 +185,10 @@ class GpStop: self._clean_fts() if self.etcd_hosts is not None: self._clean_etcd() + if self.restart: + logger.info("Restarting System...") + gp.NewGpStart.local('restarting system', verbose=logging_is_verbose(), coordinatorOnly=self.coordinatoronly, + nostandby=not self.stopstandby, coordinatorDirectory=self.coordinator_datadir) else: if self.sighup: return self._sighup_cluster() diff --git a/gpMgmt/doc/gpinitsystem_help b/gpMgmt/doc/gpinitsystem_help index aa3f66383cf..05770849158 100755 --- a/gpMgmt/doc/gpinitsystem_help +++ b/gpMgmt/doc/gpinitsystem_help @@ -14,6 +14,7 @@ gpinitsystem -c [-p ] [-s [-P ] [ {-S | --standby-datadir} ] + [--singlenodeMode={true|false}] [-m number | --max_connections=] [--shared_buffers=] [-n locale | --locale=] [--lc-collate=] [--lc-ctype=] [--lc-messages=] @@ -245,6 +246,13 @@ such as AES256, SM4. change default passwords immediately after installation. +--singlenodeMode={true|false} + + Optional. Starts a Cloudberry instance in singlenode mode. Only one coordinator + and one coordinator standby will be started in gp_role=utility. No segment will + be started. The default is false. + + --mirror-mode={group|spread} Uses the specified mirroring mode. The default is to group the set of mirror diff --git a/gpcontrib/gp_exttable_fdw/extaccess.c b/gpcontrib/gp_exttable_fdw/extaccess.c index 28f8e05db25..3bff165aec0 100644 --- a/gpcontrib/gp_exttable_fdw/extaccess.c +++ b/gpcontrib/gp_exttable_fdw/extaccess.c @@ -193,7 +193,13 @@ external_beginscan(Relation relation, uint32 scancounter, uri = (char *) strVal(v); } } - else if (Gp_role == GP_ROLE_DISPATCH && isMasterOnly) + /* + * SINGLENODE_FIXME: + * In utility mode, it cannot pass "at least one entry and one segment database" check. + * In singlenode mode, we have one entry database. We might support it in utility mode + * in the future too. + */ + else if ((Gp_role == GP_ROLE_DISPATCH && isMasterOnly) || IS_SINGLENODE()) { /* this is a ON COORDINATOR table. Only get uri if we are the master */ if (segindex == -1) diff --git a/gpcontrib/zstd/expected/compression_zstd.out b/gpcontrib/zstd/expected/compression_zstd.out index f466096e05e..9e5e68d3cf2 100644 --- a/gpcontrib/zstd/expected/compression_zstd.out +++ b/gpcontrib/zstd/expected/compression_zstd.out @@ -18,8 +18,8 @@ SELECT reloptions FROM pg_class WHERE relname = 'zstdtest'; INSERT INTO zstdtest SELECT g, 'foo' || g FROM generate_series(1, 100000) g; INSERT INTO zstdtest SELECT g, 'bar' || g FROM generate_series(1, 100000) g; --- Check that we actually compressed data. With libzstd-1.4.4, the ratio is 2.66. With libzstd-1.3.7, the ratio is 2.62. -SELECT get_ao_compression_ratio('zstdtest') IN (2.62, 2.66); +-- Check that we actually compressed data. With libzstd-1.4.4, the ratio is 2.66. With libzstd-1.3.7, the ratio is 2.62. With libzstd-1.3.3, the ration is 2.63. +SELECT get_ao_compression_ratio('zstdtest') IN (2.62, 2.63, 2.66); ?column? ---------- t diff --git a/gpcontrib/zstd/sql/compression_zstd.sql b/gpcontrib/zstd/sql/compression_zstd.sql index f2f0122ead7..a2f7c28d476 100644 --- a/gpcontrib/zstd/sql/compression_zstd.sql +++ b/gpcontrib/zstd/sql/compression_zstd.sql @@ -11,8 +11,8 @@ SELECT reloptions FROM pg_class WHERE relname = 'zstdtest'; INSERT INTO zstdtest SELECT g, 'foo' || g FROM generate_series(1, 100000) g; INSERT INTO zstdtest SELECT g, 'bar' || g FROM generate_series(1, 100000) g; --- Check that we actually compressed data. With libzstd-1.4.4, the ratio is 2.66. With libzstd-1.3.7, the ratio is 2.62. -SELECT get_ao_compression_ratio('zstdtest') IN (2.62, 2.66); +-- Check that we actually compressed data. With libzstd-1.4.4, the ratio is 2.66. With libzstd-1.3.7, the ratio is 2.62. With libzstd-1.3.3, the ration is 2.63. +SELECT get_ao_compression_ratio('zstdtest') IN (2.62, 2.63, 2.66); -- Check contents, at the beginning of the table and at the end. SELECT * FROM zstdtest ORDER BY (id, t) LIMIT 5; diff --git a/src/backend/access/aocs/aocsam_handler.c b/src/backend/access/aocs/aocsam_handler.c index a84b84f6a09..ebe8cb587bd 100644 --- a/src/backend/access/aocs/aocsam_handler.c +++ b/src/backend/access/aocs/aocsam_handler.c @@ -1614,8 +1614,8 @@ aoco_index_build_range_scan(Relation heapRelation, /* Appendoptimized catalog tables are not supported. */ Assert(!is_system_catalog); - /* Appendoptimized tables have no data on master. */ - if (IS_QUERY_DISPATCHER()) + /* Appendoptimized tables have no data on master unless we are in singlenode mode. */ + if (IS_QUERY_DISPATCHER() && Gp_role != GP_ROLE_UTILITY) return 0; /* See whether we're verifying uniqueness/exclusion properties */ diff --git a/src/backend/access/aocs/aocssegfiles.c b/src/backend/access/aocs/aocssegfiles.c index 79cc8850e1c..585f5d4e914 100644 --- a/src/backend/access/aocs/aocssegfiles.c +++ b/src/backend/access/aocs/aocssegfiles.c @@ -885,7 +885,7 @@ AOCSFileSegInfoAddVpe(Relation prel, int32 segno, int i; int j; - if (Gp_role == GP_ROLE_UTILITY) + if (IS_UTILITY_BUT_NOT_SINGLENODE()) { elog(ERROR, "cannot add column in utility mode, relation %s, segno %d", RelationGetRelationName(prel), segno); diff --git a/src/backend/access/appendonly/aosegfiles.c b/src/backend/access/appendonly/aosegfiles.c index c1c8c7da081..f905f924c67 100644 --- a/src/backend/access/appendonly/aosegfiles.c +++ b/src/backend/access/appendonly/aosegfiles.c @@ -1343,6 +1343,12 @@ get_ao_distribution(PG_FUNCTION_ARGS) Relation aosegrel; int ret; + if (IS_SINGLENODE()) + { + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("get_ao_distribution not supported in singlenode mode."))); + } Assert(Gp_role == GP_ROLE_DISPATCH); /* diff --git a/src/backend/access/appendonly/appendonlyam_handler.c b/src/backend/access/appendonly/appendonlyam_handler.c index 8abaedecabc..8574d702eba 100644 --- a/src/backend/access/appendonly/appendonlyam_handler.c +++ b/src/backend/access/appendonly/appendonlyam_handler.c @@ -1504,8 +1504,8 @@ appendonly_index_build_range_scan(Relation heapRelation, /* Appendoptimized catalog tables are not supported. */ Assert(!is_system_catalog); - /* Appendoptimized tables have no data on master. */ - if (IS_QUERY_DISPATCHER()) + /* Appendoptimized tables have no data on master unless we are in singlenode mode. */ + if (IS_QUERY_DISPATCHER() && !IS_SINGLENODE()) return 0; /* See whether we're verifying uniqueness/exclusion properties */ diff --git a/src/backend/access/external/external.c b/src/backend/access/external/external.c index 2f498c84e5a..3909194062b 100644 --- a/src/backend/access/external/external.c +++ b/src/backend/access/external/external.c @@ -509,6 +509,9 @@ create_external_scan_uri_list(ExtTableEntry *ext, bool *ismasteronly) if (SEGMENT_IS_ACTIVE_PRIMARY(p)) total_primaries++; } + /* In single node mode, we only have one primary which is coordinator. */ + if (IS_SINGLENODE()) + total_primaries = 1; /* * initialize a file-to-segdb mapping. segdb_file_map string array indexes @@ -617,6 +620,13 @@ create_external_scan_uri_list(ExtTableEntry *ext, bool *ismasteronly) } } + /* If we're in SingleNode mode, we can only handle one external location. */ + if (IS_SINGLENODE() && segdb_file_map[0] == NULL) + { + segdb_file_map[0] = pstrdup(uri_str); + found_match = true; + } + /* * We failed to find a segdb for this URI. */ @@ -661,7 +671,7 @@ create_external_scan_uri_list(ExtTableEntry *ext, bool *ismasteronly) uri->protocol == URI_GPFDISTS || uri->protocol == URI_CUSTOM)) { - if ((strcmp(on_clause, "COORDINATOR_ONLY") == 0) && (uri->protocol == URI_CUSTOM)) + if ((strcmp(on_clause, "COORDINATOR_ONLY") == 0 || Gp_role == GP_ROLE_UTILITY) && (uri->protocol == URI_CUSTOM)) { const char *uri_str = strVal(linitial(ext->urilocations)); segdb_file_map[0] = pstrdup(uri_str); @@ -669,6 +679,12 @@ create_external_scan_uri_list(ExtTableEntry *ext, bool *ismasteronly) } else { + /* We currently don't support gpfdist in SINGLE NODE mode. */ + if (Gp_role == GP_ROLE_UTILITY) + { + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("gpfdist is not supported in single node mode"))); + } /* * Re-write the location list for GPFDIST or GPFDISTS before mapping to segments. * diff --git a/src/backend/access/table/table.c b/src/backend/access/table/table.c index 1a4b69bbec9..88d8a897fe9 100644 --- a/src/backend/access/table/table.c +++ b/src/backend/access/table/table.c @@ -208,12 +208,16 @@ CdbTryOpenTable(Oid relid, LOCKMODE reqmode, bool *lockUpgraded) * only be possible when GUC allow_system_table_mods is set), the * update or delete does not hold locks on catalog on segments, so * we do not need to consider lock-upgrade for DML on catalogs. + * + * In singlenode mode, since local deadlock detection can already + * detect and solve deadlocks, we act as if the global deadlock + * detector is enabled. */ if (reqmode == RowExclusiveLock && - Gp_role == GP_ROLE_DISPATCH && + (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && relid >= FirstNormalObjectId) { - if (!gp_enable_global_deadlock_detector) + if (!gp_enable_global_deadlock_detector && !IS_SINGLENODE()) { /* * Without GDD, to avoid global deadlock, always diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 0df851f2fd0..fe15e161875 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -2824,7 +2824,7 @@ CommitTransaction(void) AtEOXact_SharedSnapshot(); /* Perform any Resource Scheduler commit procesing. */ - if (Gp_role == GP_ROLE_DISPATCH && IsResQueueEnabled()) + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && IsResQueueEnabled()) AtCommit_ResScheduler(); /* @@ -3026,7 +3026,7 @@ CommitTransaction(void) * worry about aborts as we release session level locks automatically during * an abort as opposed to a commit. */ - if(Gp_role == GP_ROLE_DISPATCH) + if(Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) MoveDbSessionLockRelease(); AtCommit_TablespaceStorage(); @@ -3555,7 +3555,7 @@ AbortTransaction(void) AtEOXact_SharedSnapshot(); /* Perform any Resource Scheduler abort procesing. */ - if (Gp_role == GP_ROLE_DISPATCH && IsResQueueEnabled()) + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && IsResQueueEnabled()) AtAbort_ResScheduler(); AtEOXact_DispatchOids(false); diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index 0f61d9dfeda..066f8c75d63 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -611,7 +611,12 @@ ExecuteGrantStmt(GrantStmt *stmt) * To make that a little bit less confusing, emit a NOTICE, when * REVOKE find no permissions to remove. */ - if (!revoked_something && !stmt->is_grant && Gp_role == GP_ROLE_DISPATCH) + /* + * SINGLENODE: It used to ereport only in dispatch mode. We should do it in singlenode mode for sure. + * But for utility mode? Ummm, I don't know, let's reconsider it in the future. + * Personally, I think using grant in utility mode makes no sense. + */ + if (!revoked_something && !stmt->is_grant && (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE())) { ereport(NOTICE, (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED), diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index defb20ec39b..917a541c6c0 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -3122,8 +3122,13 @@ index_build(Relation heapRelation, * only btree has support for parallel builds. * * Note that planner considers parallel safety for us. + * + * SINGLENODE_FIXME: Disable parallel index building for now. + * Parallel is not supported for singlenode currently, but it can still use + * parallel index while creating table. In the future, it should be considered + * to introduce parallelism to singlenode mode. */ - if (parallel && IsNormalProcessingMode() && + if (parallel && !IS_SINGLENODE() && IsNormalProcessingMode() && indexRelation->rd_rel->relam == BTREE_AM_OID) indexInfo->ii_ParallelWorkers = plan_create_index_workers(RelationGetRelid(heapRelation), diff --git a/src/backend/catalog/oid_dispatch.c b/src/backend/catalog/oid_dispatch.c index 78e5294ed8e..fe7bf12a8f2 100644 --- a/src/backend/catalog/oid_dispatch.c +++ b/src/backend/catalog/oid_dispatch.c @@ -358,7 +358,7 @@ GetNewOrPreassignedOid(Relation relation, Oid indexId, AttrNumber oidcolumn, if (IS_QUERY_DISPATCHER() && IsBinaryUpgrade && Gp_role == GP_ROLE_UTILITY) /* * If it hits here on the QD, it must be (IsBinaryUpgrade && - * Gp_role == GP_ROLE_UTILITY) already, however, check those + * IS_UTILITY_OR_SINGLENODE(Gp_role)) already, however, check those * too in case we have new GP roles in the future, and for * better code readability. */ diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 357011c9404..a077f595df0 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -773,6 +773,14 @@ CREATE VIEW pg_stat_sys_tables AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; +-- In singlenode mode, the result of pg_stat_sys_tables will be messed up, +-- since we don't have segments. +-- We create a new view for single node mode. +CREATE VIEW pg_stat_sys_tables_single_node AS + SELECT * FROM pg_stat_all_tables_internal + WHERE schemaname IN ('pg_catalog', 'information_schema') OR + schemaname ~ '^pg_toast'; + CREATE VIEW pg_stat_xact_sys_tables AS SELECT * FROM pg_stat_xact_all_tables WHERE schemaname IN ('pg_catalog', 'information_schema') OR @@ -783,6 +791,14 @@ CREATE VIEW pg_stat_user_tables AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; +-- In singlenode mode, the result of pg_stat_user_tables will be messed up, +-- since we don't have segments. +-- We create a new view for single node mode. +CREATE VIEW pg_stat_user_tables_single_node AS + SELECT * FROM pg_stat_all_tables_internal + WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND + schemaname !~ '^pg_toast'; + CREATE VIEW pg_stat_xact_user_tables AS SELECT * FROM pg_stat_xact_all_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND diff --git a/src/backend/cdb/cdbutil.c b/src/backend/cdb/cdbutil.c index ecdc1df6f08..69d6ffda974 100644 --- a/src/backend/cdb/cdbutil.c +++ b/src/backend/cdb/cdbutil.c @@ -447,7 +447,10 @@ getCdbComponentInfo(void) * Validate that there exists at least one entry and one segment database * in the configuration */ - if (component_databases->total_segment_dbs == 0) + /* + * In singlenode deployment, total_segment_dbs is zero and it should still work. + */ + if (component_databases->total_segment_dbs == 0 && !IS_SINGLENODE()) { ereport(ERROR, (errcode(ERRCODE_CARDINALITY_VIOLATION), @@ -464,8 +467,8 @@ getCdbComponentInfo(void) * Now sort the data by segindex, isprimary desc */ qsort(component_databases->segment_db_info, - component_databases->total_segment_dbs, sizeof(CdbComponentDatabaseInfo), - CdbComponentDatabaseInfoCompare); + component_databases->total_segment_dbs, sizeof(CdbComponentDatabaseInfo), + CdbComponentDatabaseInfoCompare); qsort(component_databases->entry_db_info, component_databases->total_entry_dbs, sizeof(CdbComponentDatabaseInfo), @@ -1068,7 +1071,7 @@ cdb_setup(void) { elog(DEBUG1, "Initializing Cloudberry components..."); - if (Gp_role != GP_ROLE_UTILITY) + if (Gp_role != GP_ROLE_UTILITY && !IS_SINGLENODE()) { if (!CurrentMotionIPCLayer) { ereport(ERROR, @@ -1128,7 +1131,7 @@ cdb_cleanup(int code pg_attribute_unused(), Datum arg } } - if (Gp_role != GP_ROLE_UTILITY) + if (Gp_role != GP_ROLE_UTILITY && !IS_SINGLENODE()) { /* shutdown our listener socket */ CurrentMotionIPCLayer->CleanUpMotionLayerIPC(); @@ -1857,7 +1860,13 @@ getgpsegmentCount(void) IsBinaryUpgrade && IS_QUERY_DISPATCHER()) { - numsegments = cdbcomponent_getCdbComponents()->total_segments; + /* + * While upgrading in single node mode, we will get zero total + * segment count, which will cause assertion error in makeGpPolicy. + * + * Segment number should be set to a value not less than 1 anyway. + */ + numsegments = Max(cdbcomponent_getCdbComponents()->total_segments, 1); } return numsegments; @@ -3419,7 +3428,7 @@ cdb_setup(void) { elog(DEBUG1, "Initializing Cloudberry components..."); - if (Gp_role != GP_ROLE_UTILITY) + if (Gp_role != GP_ROLE_UTILITY && !IS_SINGLENODE()) { if (!CurrentMotionIPCLayer) { ereport(ERROR, @@ -3478,7 +3487,7 @@ cdb_cleanup(int code pg_attribute_unused(), Datum arg } } - if (Gp_role != GP_ROLE_UTILITY) + if (Gp_role != GP_ROLE_UTILITY && !IS_SINGLENODE()) { /* shutdown our listener socket */ CurrentMotionIPCLayer->CleanUpMotionLayerIPC(); diff --git a/src/backend/cdb/cdbvars.c b/src/backend/cdb/cdbvars.c index ee2ef069ef0..6127cc475ed 100644 --- a/src/backend/cdb/cdbvars.c +++ b/src/backend/cdb/cdbvars.c @@ -47,7 +47,7 @@ * ---------------- */ - +bool gp_internal_is_singlenode; /* CBDB#69: true if we are in singlenode mode (no segments) */ GpRoleValue Gp_role; /* Role paid by this Cloudberry Database * backend */ @@ -441,7 +441,7 @@ assign_gp_role(const char *newval, void *extra) { Gp_role = string_to_role(newval); - if (Gp_role == GP_ROLE_UTILITY && MyProc != NULL) + if (IS_UTILITY_BUT_NOT_SINGLENODE() && MyProc != NULL) MyProc->mppIsWriter = false; } diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index bc5ae95a688..ba05e78b3d7 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -1586,6 +1586,11 @@ CopyFrom(CopyFromState cstate) ReportSrehResults(cstate->cdbsreh, total_rejected); } } + /* In dispatcher, we have the report for rejected count. We should have it in singlenode too. */ + else if (IS_SINGLENODE() && cstate->cdbsreh) + { + ReportSrehResults(cstate->cdbsreh, cstate->cdbsreh->rejectcount); + } /* Execute AFTER STATEMENT insertion triggers */ ExecASInsertTriggers(estate, target_resultRelInfo, cstate->transition_capture); diff --git a/src/backend/commands/exttablecmds.c b/src/backend/commands/exttablecmds.c index 0d6d1bc70b7..af3a20db3a9 100644 --- a/src/backend/commands/exttablecmds.c +++ b/src/backend/commands/exttablecmds.c @@ -488,7 +488,14 @@ transformExecOnClause(List *on_clause) ListCell *exec_location_opt; char *exec_location_str = NULL; - if (on_clause == NIL) + /* + * In single node, we only have one node which behave like QD in many aspects. + * And set exec_location_str as "COORDINATOR_ONLY" will force the execution be + * execute on the only node in singlenode mode, which is what we want. + */ + if (IS_SINGLENODE()) + exec_location_str = "COORDINATOR_ONLY"; + else if (on_clause == NIL) exec_location_str = "ALL_SEGMENTS"; else { diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c index eb3f5a45c88..ca08bcd51ee 100644 --- a/src/backend/commands/portalcmds.c +++ b/src/backend/commands/portalcmds.c @@ -534,7 +534,7 @@ PersistHoldablePortal(Portal portal) * don't want to reset the position because we are already in * the position we need to be. Allow this only in utility mode. */ - if(Gp_role == GP_ROLE_UTILITY) + if (Gp_role == GP_ROLE_UTILITY) { if (portal->atEnd) { diff --git a/src/backend/commands/queue.c b/src/backend/commands/queue.c index abe8a1007d5..35b8213464d 100644 --- a/src/backend/commands/queue.c +++ b/src/backend/commands/queue.c @@ -938,7 +938,11 @@ CreateQueue(CreateQueueStmt *stmt) * Create the in-memory resource queue, if resource scheduling is on, * otherwise don't - and gripe a little about it. */ - if (Gp_role == GP_ROLE_DISPATCH) + /* + * SINGLENODE_FIXME: Do we need support resource queue for utility mode. If so, + * what is the semantic? Should it be a global shared one? + */ + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) { if (IsResQueueEnabled()) { @@ -1351,7 +1355,7 @@ AlterQueue(AlterQueueStmt *stmt) * for the in-memory queue. * otherwise don't - and gripe a little about it. */ - if (Gp_role == GP_ROLE_DISPATCH) + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) { if (IsResQueueEnabled()) { @@ -1505,7 +1509,7 @@ DropQueue(DropQueueStmt *stmt) * If resource scheduling is on, see if we can destroy the in-memory queue. * otherwise don't - and gripe a little about it. */ - if (Gp_role == GP_ROLE_DISPATCH) + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) { if (IsResQueueEnabled()) { diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 8d796cc2b70..63e1ee76d87 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -2845,7 +2845,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * current transaction, such as being used in some manner by an * enclosing command. */ - if (is_partition && (Gp_role != GP_ROLE_DISPATCH)) + /* SINGLENODE_FIXME: check and enable partition operations */ + if (is_partition && (Gp_role != GP_ROLE_DISPATCH && !IS_SINGLENODE())) CheckTableNotInUse(relation, "CREATE TABLE .. PARTITION OF or ALTER TABLE ADD PARTITION"); /* @@ -5314,6 +5315,12 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_MISC; break; case AT_SetDistributedBy: /* SET DISTRIBUTED BY */ + /* Setting distributed by is meaningless in utility mode. */ + if (Gp_role == GP_ROLE_UTILITY) + { + pass = AT_PASS_MISC; + break; + } ATSimplePermissions(rel, ATT_TABLE); if (!recursing) /* MPP-5772, MPP-5784 */ @@ -10465,7 +10472,7 @@ ATAddCheckConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, * constraint creation only if there are no children currently. Error out * otherwise. */ - if (Gp_role == GP_ROLE_DISPATCH && children && !recurse) + if ((Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_UTILITY) && children && !recurse) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("constraint must be added to child tables too"))); @@ -18776,6 +18783,12 @@ make_distributedby_for_rel(Relation rel) dist = makeNode(DistributedBy); + if (Gp_role == GP_ROLE_UTILITY) + { + Assert(policy->ptype == POLICYTYPE_ENTRY); + return NULL; + } + Assert(policy->ptype != POLICYTYPE_ENTRY); if (GpPolicyIsReplicated(policy)) diff --git a/src/backend/commands/tablecmds_gp.c b/src/backend/commands/tablecmds_gp.c index 3e1cba49875..dcd221d6941 100644 --- a/src/backend/commands/tablecmds_gp.c +++ b/src/backend/commands/tablecmds_gp.c @@ -1478,7 +1478,8 @@ ATExecGPPartCmds(Relation origrel, AlterTableCmd *cmd) * pg_stat_last_operation for GPDB specific alter partition * commands. */ - if (Gp_role == GP_ROLE_DISPATCH) + /* In singlenode mode, the same metadata as in the cluster should be tracked. */ + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) GpAlterPartMetaTrackUpdObject(RelationGetRelid(rel), cmd->subtype); } diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0e1f84cf118..583d84efbcb 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -1637,7 +1637,7 @@ vac_update_relstats(Relation relation, * Because there's a chance that we overwrite perfectly good stats with zeros */ - bool ifUpdate = ! (IS_QUERY_DISPATCHER() && Gp_role == GP_ROLE_UTILITY); + bool ifUpdate = ! (IS_QUERY_DISPATCHER() && Gp_role == GP_ROLE_UTILITY) || IS_SINGLENODE(); dirty = false; if (pgcform->relpages != (int32) num_pages && ifUpdate) @@ -2672,13 +2672,20 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * Don't dispatch auto-vacuum. Each segment performs auto-vacuum as per * its own need. */ - if (Gp_role == GP_ROLE_DISPATCH && !recursing && + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && !recursing && !IsAutoVacuumWorkerProcess() && (!is_appendoptimized || ao_vacuum_phase)) { VacuumStatsContext stats_context; char *vsubtype; + /* + * SINGLENODE_FIXME: + * From my understanding, we don't need to open a transaction here since + * we don't need to dispatch. + * However, there is some assert below to make sure we are in a transaction. + * Make it more reasonable in the future. + */ /* * Dispatching needs a transaction. At least in some error scenarios, * it uses TopTransactionContext to store stuff. @@ -2686,9 +2693,12 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, StartTransactionCommand(); PushActiveSnapshot(GetTransactionSnapshot()); - stats_context.updated_stats = NIL; - dispatchVacuum(params, relid, &stats_context); - vac_update_relstats_from_list(&stats_context); + if (Gp_role == GP_ROLE_DISPATCH) + { + stats_context.updated_stats = NIL; + dispatchVacuum(params, relid, &stats_context); + vac_update_relstats_from_list(&stats_context); + } /* Also update pg_stat_last_operation */ if (IsAutoVacuumWorkerProcess()) @@ -3096,7 +3106,7 @@ vacuum_combine_stats(VacuumStatsContext *stats_context, CdbPgResults *cdb_pgresu * */ for(result_no = 0; result_no < cdb_pgresults->numResults; result_no++) - { + { struct pg_result *pgresult = cdb_pgresults->pg_results[result_no]; if (pgresult->extras == NULL || pgresult->extraType != PGExtraTypeVacuumStats) @@ -3120,7 +3130,7 @@ vacuum_combine_stats(VacuumStatsContext *stats_context, CdbPgResults *cdb_pgresu tmp_stats_combo->rel_pages += pgclass_stats_combo->rel_pages; tmp_stats_combo->rel_tuples += pgclass_stats_combo->rel_tuples; tmp_stats_combo->relallvisible += pgclass_stats_combo->relallvisible; - /* + /* * Accumulate the number of QEs, assuming sending only once * per QE for each relid in the VACUUM scenario. */ @@ -3240,20 +3250,20 @@ vac_update_relstats_from_list(VacuumStatsContext *stats_context) * while others may not. Only the QEs which dropping dead segfiles could go to * vacuum indexes path then update and send the statistics to QD, QD just * collected part of QEs' stats hence should not be as the final result to - * overwrite QD's stats. - * + * overwrite QD's stats. + * * One may think why not having the stats update only happens in the final * phase (POST_CLEANUP_PHASE), yes that's an alternative to get a final stats - * accurately for QD. - * + * accurately for QD. + * * Given the AO/CO VACUUM is a multi-phases process which may have an interval * between each phase. In real circumstance, concurrent VACUUM is mostly a heavy * job and this interval could get longer than normal cases, hence it seems - * better to collect and update QD's stats timely. So current strategy is, QD always + * better to collect and update QD's stats timely. So current strategy is, QD always * collect QE's stats across phases, once we collected the expected number (means * same as dispatched QE number) of QE's stats, we update QD's stats subsequently, * instead of updating at the final phase. - * + * * Set the logging level to LOG as skipping sending stats here is not considered as * a real issue, displaying it in log may be helpful to hint. */ @@ -3332,7 +3342,7 @@ vacuumStatement_IsTemporary(Relation onerel) * GPDB: Check whether needs to update or send stats from QE to QD. * This is GPDB specific check in vacuum-index scenario for collecting * QEs' stats (such as index->relpages and index->reltuples) on QD. - * GPDB needs accumulating all QEs' stats for updating corresponding + * GPDB needs accumulating all QEs' stats for updating corresponding * statistics into QD's pg_class correctly. So if current instance is * acting as QE, it should scan and send its current stats to QD instead * of skipping them for cost saving. diff --git a/src/backend/executor/execCurrent.c b/src/backend/executor/execCurrent.c index 635c1ce74c4..e17fbff9b74 100644 --- a/src/backend/executor/execCurrent.c +++ b/src/backend/executor/execCurrent.c @@ -93,8 +93,14 @@ execCurrentOf(CurrentOfExpr *cexpr, } else { - getCurrentOf(cexpr, econtext, table_oid, current_tid, + bool res = getCurrentOf(cexpr, econtext, table_oid, current_tid, ¤t_gp_segment_id, ¤t_table_oid, NULL); + /* + * In singlenode mode, we don't bother to check segment match. + * And if we have partitioned table, we will do the table oid check inside getCurrentOf. + */ + if (IS_SINGLENODE()) + return res; } /* @@ -120,8 +126,10 @@ execCurrentOf(CurrentOfExpr *cexpr, * * GPDB calls it before dispatching to make QEs get the same current position * of the cursor. + * + * Returns true if a row was identified. */ -void +bool getCurrentOf(CurrentOfExpr *cexpr, ExprContext *econtext, Oid table_oid, @@ -217,14 +225,34 @@ getCurrentOf(CurrentOfExpr *cexpr, relispartition || get_rel_persistence(table_oid) == RELPERSISTENCE_TEMP) { + bool matchInhertitanceTable; + Index i; + + matchInhertitanceTable = false; + if (Gp_role == GP_ROLE_UTILITY && queryDesc->estate->es_rowmarks != NULL) + { + for (i = 0; i < queryDesc->estate->es_range_table_size; i++) + { + ExecRowMark *thiserm = queryDesc->estate->es_rowmarks[i]; + if (thiserm == NULL || + !RowMarkRequiresRowShareLock(thiserm->markType)) + continue; /* ignore non-FOR UPDATE/SHARE items */ + + if (thiserm->relid == table_oid) + { + matchInhertitanceTable = true; + } + } + } + /* * The target relation must directly match the cursor's relation. This throws out * the simple case in which a cursor is declared against table X and the update is - * issued against Y. Moreover, this disallows some subtler inheritance cases where - * Y inherits from X. While such cases could be implemented, it seems wiser to - * simply error out cleanly. + * issued against Y. + * However, this disallows some subtler inheritance cases where Y inherits from X. + * So we also need to check all range tables match before this check. */ - if (table_oid != queryDesc->plannedstmt->simplyUpdatableRel) + if (!matchInhertitanceTable && table_oid != queryDesc->plannedstmt->simplyUpdatableRel) ereport(ERROR, (errcode(ERRCODE_INVALID_CURSOR_STATE), errmsg("cursor \"%s\" is not a simply updatable scan of table \"%s\"", @@ -486,11 +514,14 @@ getCurrentOf(CurrentOfExpr *cexpr, * by tableoid is, indeed, simply updatable. */ (void) isSimplyUpdatableRelation(*current_table_oid, false /* noerror */); + if (Gp_role == GP_ROLE_UTILITY && *current_table_oid != table_oid) + return false; } if (p_cursor_name) *p_cursor_name = pstrdup(cursor_name); } + return true; } /* diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index 87dabadc84f..a26db1b75ea 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -3161,8 +3161,8 @@ ExecInitSubscriptingRef(ExprEvalStep *scratch, SubscriptingRef *sbsref, * trees in which each level of assignment has its own CaseTestExpr, and the * recursive structure appears within the newvals or refassgnexpr field. * There is an exception, though: if the array is an array-of-domain, we will - * have a CoerceToDomain as the refassgnexpr, and we need to be able to look - * through that. + * have a CoerceToDomain or RelabelType as the refassgnexpr, and we need to + * be able to look through that. */ static bool isAssignmentIndirectionExpr(Expr *expr) @@ -3189,6 +3189,12 @@ isAssignmentIndirectionExpr(Expr *expr) return isAssignmentIndirectionExpr(cd->arg); } + else if (IsA(expr, RelabelType)) + { + RelabelType *r = (RelabelType *) expr; + + return isAssignmentIndirectionExpr(r->arg); + } return false; } diff --git a/src/backend/executor/instrument.c b/src/backend/executor/instrument.c index 57baf6aa96a..efac4315eb9 100644 --- a/src/backend/executor/instrument.c +++ b/src/backend/executor/instrument.c @@ -312,7 +312,7 @@ InstrShmemSize(void) Size number_slots; /* If start in utility mode, disallow Instrumentation on Shmem */ - if (Gp_role == GP_ROLE_UTILITY) + if (IS_UTILITY_BUT_NOT_SINGLENODE()) return size; /* If GUCs not enabled, bypass Instrumentation on Shmem */ @@ -404,7 +404,7 @@ static bool shouldPickInstrInShmem(NodeTag tag) { /* For utility mode, don't alloc in shmem */ - if (Gp_role == GP_ROLE_UTILITY) + if (IS_UTILITY_BUT_NOT_SINGLENODE()) return false; if (!gp_enable_query_metrics || NULL == InstrumentGlobal) diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 4736f6bf5ea..30e400d31d5 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -2899,7 +2899,7 @@ _SPI_pquery(QueryDesc *queryDesc, bool fire_triggers, uint64 tcount) * If the Active portal already hold a lock on the queue, we cannot * acquire it again. */ - if (Gp_role == GP_ROLE_DISPATCH && IsResQueueEnabled() && !superuser()) + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && IsResQueueEnabled() && !superuser()) { /* * This is SELECT, so we should have planTree anyway. diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 87a277512f5..70d457e5780 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -60,6 +60,7 @@ #include "cdb/cdbmutate.h" /* cdbmutate_warn_ctid_without_segid */ #include "cdb/cdbpath.h" /* cdbpath_rows() */ #include "cdb/cdbutil.h" +#include "cdb/cdbvars.h" // TODO: these planner gucs need to be refactored into PlannerConfig. bool gp_enable_sort_limit = false; @@ -2474,7 +2475,7 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, */ safetyInfo.unsafeLeaky = rte->security_barrier; - forceDistRand = rte->forceDistRandom; + forceDistRand = rte->forceDistRandom && !IS_SINGLENODE(); /* CDB: Could be a preplanned subquery from window_planner. */ if (rte->subquery_root == NULL) { diff --git a/src/backend/optimizer/plan/joinpartprune.c b/src/backend/optimizer/plan/joinpartprune.c index 1446b86d83b..0fb1fee3570 100644 --- a/src/backend/optimizer/plan/joinpartprune.c +++ b/src/backend/optimizer/plan/joinpartprune.c @@ -114,6 +114,7 @@ push_partition_selector_candidate_for_join(PlannerInfo *root, JoinPath *join_pat bool good_type = false; PartitionSelectorCandidateInfo *candidate; + /* SINGLENODE_FIXME: enable partition selector in the future? */ if (Gp_role != GP_ROLE_DISPATCH || !gp_dynamic_partition_pruning) { root->partition_selector_candidates = lcons(NULL, root->partition_selector_candidates); diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 59e436b2ed4..5447e311d8f 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -491,8 +491,9 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, /* * GPDB: allow to use parallel or not. + * SINGLENODE_FIXME: We'll enable parallel in singlenode mode later. */ - if (!enable_parallel) + if (!enable_parallel || IS_SINGLENODE()) glob->parallelModeOK = false; /* diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index b6ac3a5462b..c9a49579eef 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -5780,7 +5780,22 @@ DistributedBy: DISTRIBUTED BY '(' distributed_by_list ')' } ; -OptDistributedBy: DistributedBy { $$ = $1; } +OptDistributedBy: DistributedBy + { + /* + * In singlenode mode, distributed by clause has no real effect. + * We simply ignore it and issue a warning to ensure compatibility. + */ + if (IS_SINGLENODE()) + { + ereport(WARNING, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("DISTRIBUTED BY clause has no effect in singlenode mode"))); + $$ = NULL; + } + else + $$ = $1; + } | /*EMPTY*/ { $$ = NULL; } ; @@ -16919,7 +16934,19 @@ table_value_select_clause: SelectStmt scatter_clause { SelectStmt *s = (SelectStmt *) $1; - s->scatterClause = $2; + /* + * In singlenode mode, scatter clause has no real effect. + * We simply ignore it and issue a warning to ensure compatibility. + */ + if (IS_SINGLENODE()) + { + ereport(WARNING, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("SCATTER BY clause has no effect in singlenode mode"))); + s->scatterClause = NIL; + } + else + s->scatterClause = $2; $$ = (Node *) s; } ; diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index 19a88d160a3..21709b72ba3 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -762,8 +762,7 @@ check_agg_arguments_walker(Node *node, context->min_agglevel > agglevelsup) context->min_agglevel = agglevelsup; } - /* no need to examine args of the inner aggregate */ - return false; + /* Continue and descend into subtree */ } if (IsA(node, GroupingFunc)) { diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 63eb7ef5689..7db57c7e106 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -646,7 +646,11 @@ transformRangeFunction(ParseState *pstate, RangeFunction *r) rte = addRangeTableEntry(pstate, rel, r->alias, false, true); /* Now we set our special attribute in the rte. */ - rte->p_rte->forceDistRandom = true; + /* + * However, in singlenode mode distribution is meaningless and might introduce unexpected + * motions in the plan, which will lead to some assert failures. + */ + rte->p_rte->forceDistRandom = !IS_SINGLENODE(); return rte; } diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 36879297d9b..d33b5e2e6a5 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1588,7 +1588,7 @@ AutoVacWorkerMain(int argc, char *argv[]) am_autovacuum_worker = true; /* MPP-4990: Autovacuum always runs as utility-mode */ - if (IS_QUERY_DISPATCHER()) + if (IS_QUERY_DISPATCHER() && !IS_SINGLENODE()) Gp_role = GP_ROLE_DISPATCH; else Gp_role = GP_ROLE_UTILITY; diff --git a/src/backend/postmaster/backoff.c b/src/backend/postmaster/backoff.c index 82e53df457b..dbaea8654b4 100644 --- a/src/backend/postmaster/backoff.c +++ b/src/backend/postmaster/backoff.c @@ -405,7 +405,7 @@ getBackoffEntryRO(int index) static inline BackoffBackendSharedEntry * getBackoffEntryRW(int index) { - Assert(Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE || isSweeperProcess); + Assert(Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE || isSweeperProcess); Assert(index >= 0 && index < backoffSingleton->numEntries); return &backoffSingleton->backendEntries[index]; } @@ -425,7 +425,7 @@ BackoffBackendEntryInit(int sessionid, int commandcount, Oid queueId) Assert(sessionid > -1); Assert(commandcount > -1); - Assert(Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE); + Assert(Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE); Assert(!isSweeperProcess); /* Shared information */ @@ -618,7 +618,7 @@ BackoffBackendTickExpired(void) backoffTickCounter = 0; - if (!(Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE) + if (!(Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE) || !IsResQueueEnabled() || !gp_enable_resqueue_priority || !IsUnderPostmaster @@ -1005,7 +1005,7 @@ void BackoffBackendEntryExit() { if (MyBackendId >= 0 - && (Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE)) + && (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE)) { BackoffBackendSharedEntry *se = myBackoffSharedEntry(); @@ -1083,7 +1083,7 @@ gp_adjust_priority_int(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errmsg("only superuser can re-prioritize a query after it has begun execution")))); - if (Gp_role == GP_ROLE_UTILITY) + if (IS_UTILITY_BUT_NOT_SINGLENODE()) elog(ERROR, "Query prioritization does not work in utility mode."); if (wt <= 0) diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 11324d659a3..c4dff0d3f02 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -157,7 +157,7 @@ CreateSharedMemoryAndSemaphores(void) size = add_size(size, LockShmemSize()); size = add_size(size, PredicateLockShmemSize()); - if (IsResQueueEnabled() && Gp_role == GP_ROLE_DISPATCH) + if (IsResQueueEnabled() && (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE())) { size = add_size(size, ResSchedulerShmemSize()); size = add_size(size, ResPortalIncrementShmemSize()); diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 768b585863e..cc934e684b4 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -525,11 +525,11 @@ InitProcess(void) * connection on master. */ if (IS_QUERY_DISPATCHER() && - Gp_role == GP_ROLE_DISPATCH && + (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && gp_session_id == InvalidGpSessionId) gp_session_id = mppLocalProcessSerial; - AssertImply(Gp_role == GP_ROLE_UTILITY && !IS_QUERY_DISPATCHER(), + AssertImply(IS_UTILITY_BUT_NOT_SINGLENODE() && !IS_QUERY_DISPATCHER(), gp_session_id == InvalidGpSessionId); MyProc->mppSessionId = gp_session_id; @@ -902,7 +902,7 @@ LockErrorCleanup(void) } /* Don't try to cancel resource locks.*/ - if (Gp_role == GP_ROLE_DISPATCH && IsResQueueEnabled() && + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && IsResQueueEnabled() && LOCALLOCK_LOCKMETHOD(*lockAwaited) == RESOURCE_LOCKMETHOD) return; @@ -1028,7 +1028,7 @@ ProcKill(int code, Datum arg) * Cleanup for any resource locks on portals - from holdable cursors or * unclean process abort (assertion failures). */ - if (Gp_role == GP_ROLE_DISPATCH && IsResQueueEnabled()) + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && IsResQueueEnabled()) AtExitCleanup_ResPortals(); /* @@ -2094,7 +2094,7 @@ CheckDeadLock(void) * return from the signal handler. */ Assert(MyProc->waitLock != NULL); - if (Gp_role == GP_ROLE_DISPATCH && IsResQueueEnabled() && + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && IsResQueueEnabled() && LOCK_LOCKMETHOD(*(MyProc->waitLock)) == RESOURCE_LOCKMETHOD) { /* diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 319ec8516c7..3974f6ad0d2 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -202,7 +202,7 @@ ProcessQuery(Portal portal, queryDesc->plannedstmt->query_mem = ResourceManagerGetQueryMemoryLimit(queryDesc->plannedstmt); - if (Gp_role == GP_ROLE_DISPATCH) + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) { /* * If resource scheduling is enabled and we are locking non SELECT @@ -646,7 +646,7 @@ PortalStart(Portal portal, ParamListInfo params, queryDesc->plannedstmt->query_mem = ResourceManagerGetQueryMemoryLimit(queryDesc->plannedstmt); - if (Gp_role == GP_ROLE_DISPATCH) + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) { /* * If resource scheduling is enabled, lock the portal here. @@ -1965,7 +1965,7 @@ static void PortalBackoffEntryInit(Portal portal) { if (gp_enable_resqueue_priority && - (Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE) && + (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE) && gp_session_id > -1) { /* Initialize the SHM backend entry */ diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 998d3efc02e..28808d63113 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -686,7 +686,14 @@ standard_ProcessUtility(PlannedStmt *pstmt, break; case TRANS_STMT_PREPARE: - if (Gp_role == GP_ROLE_DISPATCH) + /* + * SINGLENODE_FIXME: + * It seems like `PREPARE TRANSACTION` works in singlenode mode, + * but currently we just disable it to make it behaves closer + * to cluster mode. + * Maybe reconsider it in the future. + */ + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) { ereport(ERROR, (errcode(ERRCODE_GP_COMMAND_ERROR), errmsg("PREPARE TRANSACTION is not yet supported in Cloudberry Database"))); @@ -1046,8 +1053,11 @@ standard_ProcessUtility(PlannedStmt *pstmt, * transaction block because the shared memory structures are not * cleaned up on abort, resulting in "leaked", unreachable queues. */ - - if (Gp_role == GP_ROLE_DISPATCH) + /* + * SINGLENODE_FIXME: not sure if it's happening in single node, + * let's just keep it behaving the same as greenplum for safety. + */ + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) PreventInTransactionBlock(isTopLevel, "CREATE RESOURCE QUEUE"); CreateQueue((CreateQueueStmt *) parsetree); diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index d3401eb548d..9a8902c24a4 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -803,7 +803,7 @@ InitializeSessionUserId(const char *rolename, Oid roleid) * queue. Do this even in standalone backend mode, just in case someone * gives the superuser a resource queue. */ - if ((Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE) && IsResQueueEnabled()) + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE) && IsResQueueEnabled()) { SetResQueueId(); } @@ -873,7 +873,7 @@ SetSessionAuthorization(Oid userid, bool is_superuser) SetSessionUserId(userid, is_superuser); /* If resource scheduling enabled, set the cached queue for the new role.*/ - if ((Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE) && IsResQueueEnabled()) + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE) && IsResQueueEnabled()) { SetResQueueId(); } @@ -936,7 +936,7 @@ SetCurrentRoleId(Oid roleid, bool is_superuser) SetOuterUserId(roleid); /* If resource scheduling enabled, set the cached queue for the new role.*/ - if ((Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE) && IsResQueueEnabled()) + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE) && IsResQueueEnabled()) { SetResQueueId(); } diff --git a/src/backend/utils/misc/guc_gp.c b/src/backend/utils/misc/guc_gp.c index 27dc2c7f7ac..e19ebd0e951 100644 --- a/src/backend/utils/misc/guc_gp.c +++ b/src/backend/utils/misc/guc_gp.c @@ -2972,6 +2972,17 @@ struct config_bool ConfigureNamesBool_gp[] = NULL, NULL, NULL }, + { + {"gp_internal_is_singlenode", PGC_POSTMASTER, UNGROUPED, + gettext_noop("Is in SingleNode mode (no segments). WARNING: user SHOULD NOT set this by any means."), + NULL, + GUC_IS_NAME | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_WHILE_SEC_REST + }, + &gp_internal_is_singlenode, + false, + NULL, NULL, NULL + }, + /* End-of-list marker */ { {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 2ffcacf00cd..635d0ba3dfe 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -321,6 +321,8 @@ max_prepared_transactions = 250 # can be 0 or more # - Standby Servers - +#gp_internal_is_singlenode = off # is in SingleNode mode or not. WARNING: user SHOULD NOT change this by any means. + # These settings are ignored on a primary server. #primary_conninfo = '' # connection string to sending server diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 302e42c6c34..a21a7bfb2d6 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -228,7 +228,7 @@ CreatePortal(const char *name, bool allowDup, bool dupSilent) if (IsResQueueEnabled()) { /* Only QD needs to set portal id if have enabled resource scheduling */ - if (Gp_role == GP_ROLE_DISPATCH) + if (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) { portal->portalId = ResCreatePortalId(name); portal->queueId = GetResQueueId(); diff --git a/src/backend/utils/resource_manager/memquota.c b/src/backend/utils/resource_manager/memquota.c index 66e1b830f1e..648b9c1f09d 100644 --- a/src/backend/utils/resource_manager/memquota.c +++ b/src/backend/utils/resource_manager/memquota.c @@ -960,7 +960,7 @@ PolicyEagerFreeAssignOperatorMemoryKB(PlannedStmt *stmt, uint64 memAvailableByte int64 ResourceManagerGetQueryMemoryLimit(PlannedStmt* stmt) { - if (Gp_role != GP_ROLE_DISPATCH) + if (Gp_role != GP_ROLE_DISPATCH && !IS_SINGLENODE()) return 0; /* no limits in single user mode. */ diff --git a/src/backend/utils/resource_manager/resource_manager.c b/src/backend/utils/resource_manager/resource_manager.c index f3ad159bf19..7853659dbd4 100644 --- a/src/backend/utils/resource_manager/resource_manager.c +++ b/src/backend/utils/resource_manager/resource_manager.c @@ -40,7 +40,7 @@ bool ResGroupActivated = false; void ResManagerShmemInit(void) { - if (IsResQueueEnabled() && Gp_role == GP_ROLE_DISPATCH) + if (IsResQueueEnabled() && (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE())) { InitResScheduler(); InitResPortalIncrementHash(); @@ -54,7 +54,7 @@ ResManagerShmemInit(void) void InitResManager(void) { - if (IsResQueueEnabled() && Gp_role == GP_ROLE_DISPATCH && !am_walsender) + if (IsResQueueEnabled() && (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && !am_walsender) { gp_resmanager_memory_policy = (ResManagerMemoryPolicy *) &gp_resqueue_memory_policy; gp_log_resmanager_memory = &gp_log_resqueue_memory; @@ -64,7 +64,7 @@ InitResManager(void) InitResQueues(); } else if (IsResGroupEnabled() && - (Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE) && + (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE) && IsUnderPostmaster && !amAuxiliaryBgWorker() && !am_walsender && !am_ftshandler && !am_faulthandler) @@ -100,6 +100,6 @@ InitResManager(void) if (MySessionState && !IsBackgroundWorker && - (Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_EXECUTE)) + (Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE() || Gp_role == GP_ROLE_EXECUTE)) GPMemoryProtect_TrackStartupMemory(); } diff --git a/src/backend/utils/resscheduler/resscheduler.c b/src/backend/utils/resscheduler/resscheduler.c index 4887729442d..6b4327c6b7c 100644 --- a/src/backend/utils/resscheduler/resscheduler.c +++ b/src/backend/utils/resscheduler/resscheduler.c @@ -1064,7 +1064,7 @@ ResHandleUtilityStmt(Portal portal, Node *stmt) return; } - if (Gp_role == GP_ROLE_DISPATCH + if ((Gp_role == GP_ROLE_DISPATCH || IS_SINGLENODE()) && IsResQueueEnabled() && (!ResourceSelectOnly) && !superuser()) diff --git a/src/include/cdb/cdbvars.h b/src/include/cdb/cdbvars.h index 71b09a2d780..d5d92786bf5 100644 --- a/src/include/cdb/cdbvars.h +++ b/src/include/cdb/cdbvars.h @@ -70,6 +70,11 @@ typedef enum GP_ROLE_EXECUTE, /* Operating as a parallel query executor */ } GpRoleValue; +extern bool gp_internal_is_singlenode; /* CBDB#69: support single node (no segment) mode */ + +#define IS_SINGLENODE() (gp_internal_is_singlenode) +#define IS_UTILITY_BUT_NOT_SINGLENODE() (Gp_role == GP_ROLE_UTILITY && !IS_SINGLENODE()) + extern GpRoleValue Gp_role; /* GUC var - server operating mode. */ extern char *gp_role_string; /* Use by guc.c as staging area for value. */ diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index e53ed647a93..dc6b633fea3 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -113,7 +113,7 @@ extern bool ExecMaterializesOutput(NodeTag plantype); /* * prototypes from functions in execCurrent.c */ -extern void getCurrentOf(CurrentOfExpr *cexpr, +extern bool getCurrentOf(CurrentOfExpr *cexpr, ExprContext *econtext, Oid table_oid, ItemPointer current_tid, diff --git a/src/include/utils/unsync_guc_name.h b/src/include/utils/unsync_guc_name.h index d8593b503c4..ffb4a8edaad 100644 --- a/src/include/utils/unsync_guc_name.h +++ b/src/include/utils/unsync_guc_name.h @@ -278,6 +278,7 @@ "gp_resqueue_priority_sweeper_interval", "gp_retrieve_conn", "gp_role", + "gp_internal_is_singlenode", "gp_safefswritesize", "gp_segment_connect_timeout", "gp_segments_for_planner", diff --git a/src/test/Makefile b/src/test/Makefile index 8e1a906f4d6..77cf7f472ee 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -17,7 +17,7 @@ include $(top_builddir)/src/Makefile.global # removed "subscription" test from below list. SUBDIRS = perl regress isolation modules authentication recovery -SUBDIRS += fsync walrep heap_checksum isolation2 fdw +SUBDIRS += fsync walrep heap_checksum isolation2 fdw singlenode_regress singlenode_isolation2 # Test suites that are not safe by default but can be run if selected # by the user via the whitespace-separated list in variable @@ -63,4 +63,8 @@ check_dirs := regress isolation2 installcheck-cbdb-parallel: install $(call recurse,installcheck-cbdb-parallel,$(check_dirs)) +singlenode_check_dirs := singlenode_regress isolation singlenode_isolation2 +installcheck-singlenode: install + $(call recurse,installcheck-singlenode,$(singlenode_check_dirs)) + $(recurse_always) diff --git a/src/test/isolation/Makefile b/src/test/isolation/Makefile index 3e0a3a28056..2e249571841 100644 --- a/src/test/isolation/Makefile +++ b/src/test/isolation/Makefile @@ -89,6 +89,10 @@ installcheck: all gpdiff.pl gpstringsubs.pl install-tests $(pg_isolation_regress_installcheck) --init-file=$(srcdir)/init_file --load-extension=pageinspect --schedule=$(srcdir)/isolation_schedule $(bindir)/dropdb --if-exists isolation_regression +installcheck-singlenode: all gpdiff.pl gpstringsubs.pl install-tests + $(pg_isolation_regress_installcheck) --init-file=$(srcdir)/init_file --load-extension=pageinspect --schedule=$(srcdir)/isolation_schedule + $(bindir)/dropdb --if-exists isolation_regression + check: all $(pg_isolation_regress_check) --schedule=$(srcdir)/isolation_schedule diff --git a/src/test/isolation2/Makefile b/src/test/isolation2/Makefile index 9ac85e8d756..2404e6fa9b7 100644 --- a/src/test/isolation2/Makefile +++ b/src/test/isolation2/Makefile @@ -55,6 +55,7 @@ pg_isolation2_regress$(X): isolation2_main.o pg_regress.o submake-libpq submake- clean distclean: rm -f pg_isolation2_regress$(X) $(OBJS) isolation2_main.o + rm -f isolation2_regress.so rm -f pg_regress.o rm -f gpstringsubs.pl gpdiff.pl atmsort.pm explain.pm rm -f data diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index 7bc915f1d56..c47e03dfd88 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -1295,6 +1295,12 @@ select (select max(min(unique1)) from int8_tbl) from tenk1; ERROR: aggregate function calls cannot be nested LINE 1: select (select max(min(unique1)) from int8_tbl) from tenk1; ^ +select avg((select avg(a1.col1 order by (select avg(a2.col2) from tenk1 a3)) + from tenk1 a1(col1))) +from tenk1 a2(col2); +ERROR: aggregate function calls cannot be nested +LINE 1: select avg((select avg(a1.col1 order by (select avg(a2.col2)... + ^ -- -- Test removal of redundant GROUP BY columns -- diff --git a/src/test/regress/expected/aggregates_optimizer.out b/src/test/regress/expected/aggregates_optimizer.out index 2f6a3f2cc47..33b127d375e 100644 --- a/src/test/regress/expected/aggregates_optimizer.out +++ b/src/test/regress/expected/aggregates_optimizer.out @@ -1306,6 +1306,12 @@ select (select max(min(unique1)) from int8_tbl) from tenk1; ERROR: aggregate function calls cannot be nested LINE 1: select (select max(min(unique1)) from int8_tbl) from tenk1; ^ +select avg((select avg(a1.col1 order by (select avg(a2.col2) from tenk1 a3)) + from tenk1 a1(col1))) +from tenk1 a2(col2); +ERROR: aggregate function calls cannot be nested +LINE 1: select avg((select avg(a1.col1 order by (select avg(a2.col2)... + ^ -- -- Test removal of redundant GROUP BY columns -- diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index 4502133cbc9..cdf0f02a4d5 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -570,6 +570,15 @@ table dcomptable; {"(1,5)"} (1 row) +-- if there's no constraints, a different code path is taken: +alter domain dcomptype drop constraint dcomptype_check; +update dcomptable set f1[1].cf1 = -1; -- now ok +table dcomptable; + f1 +------------ + {"(-1,5)"} +(1 row) + drop table dcomptable; drop type comptype cascade; NOTICE: drop cascades to type dcomptype diff --git a/src/test/regress/expected/domain_optimizer.out b/src/test/regress/expected/domain_optimizer.out index 61ead8c9cf1..aff8c789597 100755 --- a/src/test/regress/expected/domain_optimizer.out +++ b/src/test/regress/expected/domain_optimizer.out @@ -576,6 +576,15 @@ HINT: For non-partitioned tables, run analyze (). For {"(1,5)"} (1 row) +-- if there's no constraints, a different code path is taken: +alter domain dcomptype drop constraint dcomptype_check; +update dcomptable set f1[1].cf1 = -1; -- now ok +table dcomptable; + f1 +------------ + {"(-1,5)"} +(1 row) + drop table dcomptable; drop type comptype cascade; NOTICE: drop cascades to type dcomptype diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index f56260fa1e7..d327ffd2c64 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -96,6 +96,7 @@ bool optimizer_enabled = false; bool resgroup_enabled = false; bool external_fts = false; bool force_parallel_enabled = false; +bool is_singlenode_mode = false; static _stringlist *loadextension = NULL; static int max_connections = 0; static int max_concurrent_tests = 0; @@ -151,7 +152,7 @@ static bool detectCgroupMountPoint(char *cgdir, int len); static bool should_exclude_test(char *test); static int run_diff(const char *cmd, const char *filename); -static char *content_zero_hostname = NULL; +static char *content_zero_hostname = NULL; // hostname of content 0 in cluster mode but of content 1 in singlenode mode static char *get_host_name(int16 contentid, char role); static bool cluster_healthy(void); @@ -940,7 +941,7 @@ convert_sourcefiles_in(const char *source_subdir, const char *dest_dir, const ch static void convert_sourcefiles(void) { - content_zero_hostname = get_host_name(0, 'p'); + content_zero_hostname = get_host_name(is_singlenode_mode ? -1 : 0, 'p'); convert_sourcefiles_in("input", outputdir, "sql", "sql"); convert_sourcefiles_in("output", outputdir, "expected", "out"); @@ -1351,7 +1352,6 @@ initialize_environment(void) printf(_("(using postmaster on Unix socket, default port)\n")); } - convert_sourcefiles(); load_resultmap(); } @@ -3395,10 +3395,16 @@ regression_main(int argc, char *argv[], resgroup_enabled = check_feature_status("gp_resource_manager", "group", "Resource group enabled. Using resource group answer files whenever possible", "Resource group disabled. Using default answer files"); + is_singlenode_mode = check_feature_status("gp_internal_is_singlenode", "on", + "Single node (no segments) mode enabled. Replace '@hostname@' by hostname of contentid = -1", + "Normal cluster detected. Replace '@hostname@' by hostname of contentid = 0"); force_parallel_enabled = check_feature_status("force_parallel_mode", "on", "Force parallel mode enabled. Result diffs will ignore plans.", "Force parallel mode disabled. Using default answer files"); + + convert_sourcefiles(); + /* * Ready to run the tests */ diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 4e5c9b4db8f..9268a11b3df 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -434,6 +434,9 @@ drop table minmaxtest cascade; -- check for correct detection of nested-aggregate errors select max(min(unique1)) from tenk1; select (select max(min(unique1)) from int8_tbl) from tenk1; +select avg((select avg(a1.col1 order by (select avg(a2.col2) from tenk1 a3)) + from tenk1 a1(col1))) +from tenk1 a2(col2); -- -- Test removal of redundant GROUP BY columns diff --git a/src/test/regress/sql/domain.sql b/src/test/regress/sql/domain.sql index 75820ceaa93..0316749040f 100644 --- a/src/test/regress/sql/domain.sql +++ b/src/test/regress/sql/domain.sql @@ -292,6 +292,10 @@ table dcomptable; update dcomptable set f1[1].cf1 = -1; -- fail update dcomptable set f1[1].cf1 = 1; table dcomptable; +-- if there's no constraints, a different code path is taken: +alter domain dcomptype drop constraint dcomptype_check; +update dcomptable set f1[1].cf1 = -1; -- now ok +table dcomptable; drop table dcomptable; drop type comptype cascade; diff --git a/src/test/singlenode_isolation2/.gitignore b/src/test/singlenode_isolation2/.gitignore new file mode 100644 index 00000000000..dfdc927f342 --- /dev/null +++ b/src/test/singlenode_isolation2/.gitignore @@ -0,0 +1,32 @@ +regression.diffs +regression.out +*/dummy.sql +*/dummy.out +sql/ao_upgrade.sql +expected/ao_upgrade.out +expected/ao_upgrade_optimizer.out +sql/external_table.sql +expected/external_table.out +sql/fts_manual_probe.sql +expected/fts_manual_probe.out +sql/workfile_mgr_test.sql +expected/workfile_mgr_test.out + +-- ignore generated pg_basebackup tests +/sql/pg_basebackup*.sql +/expected/pg_basebackup*.out + +# Local binaries and symbolic links +/extended_protocol_test +/pg_isolation2_regress +/test_parallel_retrieve_cursor_extended_query +/test_parallel_retrieve_cursor_extended_query_error +/atmsort.pm +/explain.pm +/GPTest.pm +/gpdiff.pl +/gpstringsubs.pl +/data + +# Generated subdirectories +/results/ diff --git a/src/test/singlenode_isolation2/Makefile b/src/test/singlenode_isolation2/Makefile new file mode 100644 index 00000000000..ced54ee8b10 --- /dev/null +++ b/src/test/singlenode_isolation2/Makefile @@ -0,0 +1,64 @@ +# +# Makefile for isolation2 tests +# + +subdir = src/test/isolation2 +top_builddir = ../../.. +include $(top_builddir)/src/Makefile.global + +NAME = isolation2_regress +include $(top_srcdir)/src/Makefile.shlib + +ifeq ($(PORTNAME), win32) +LDLIBS += -lws2_32 +endif + +override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) -I$(srcdir)/../regress $(CPPFLAGS) +override LDLIBS := $(libpq_pgport) $(LDLIBS) + +all: pg_isolation2_regress$(X) data + +pg_regress.o: + $(MAKE) -C $(top_builddir)/src/test/regress pg_regress.o + rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/pg_regress.o . + +gpstringsubs.pl: + rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/gpstringsubs.pl + +gpdiff.pl: atmsort.pm explain.pm GPTest.pm + rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/gpdiff.pl + +GPTest.pm: + rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/GPTest.pm + +atmsort.pm: + rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/atmsort.pm + +explain.pm: + rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/explain.pm + +data: + rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/data + +submake-isolation2: + $(MAKE) -C $(top_builddir)/src/test/isolation2 install + rm -rf isolation2_regress.so && $(LN_S) $(top_builddir)/src/test/isolation2/isolation2_regress.so + +pg_isolation2_regress$(X): submake-isolation2 pg_regress.o submake-libpq submake-libpgport + rm -rf pg_isolation2_regress && $(LN_S) $(top_builddir)/src/test/isolation2/pg_isolation2_regress + +clean distclean: + rm -f pg_regress.o + rm -f isolation2_regress.so + rm -f gpstringsubs.pl gpdiff.pl atmsort.pm explain.pm + rm -f data + rm -rf $(pg_regress_clean_files) + +install: all gpdiff.pl gpstringsubs.pl + +installcheck-singlenode: all + (\ + gpconfig -c gp_appendonly_insert_files -v 0; \ + gpstop -u; \ + $(pg_isolation2_regress_installcheck) --init-file=$(top_builddir)/src/test/regress/init_file --init-file=./init_file_isolation2 --schedule=$(srcdir)/isolation2_schedule \ + ) diff --git a/src/test/singlenode_isolation2/README b/src/test/singlenode_isolation2/README new file mode 100644 index 00000000000..fcd31481972 --- /dev/null +++ b/src/test/singlenode_isolation2/README @@ -0,0 +1,7 @@ +This directory contains additional "isolation"-style tests. That is, +tests that require multiple simultaneous connections to the database. + +Some of these could be moved to the main isolation test suite, in +src/test/isolation, but for historical reasons, these tests use a different +syntax for specifying the tests. See sql_isolation_testcase.py for more +details on the syntax. diff --git a/src/test/singlenode_isolation2/expected/.gitignore b/src/test/singlenode_isolation2/expected/.gitignore new file mode 100644 index 00000000000..ae2644431fc --- /dev/null +++ b/src/test/singlenode_isolation2/expected/.gitignore @@ -0,0 +1,26 @@ +# ignores only for this directory +/ao_upgrade.out +/ao_upgrade_optimizer.out +/external_table.out +/fts_manual_probe.out +/gp_collation.out +/pg_basebackup.out +/pg_basebackup_with_tablespaces.out +/pt_io_in_progress_deadlock.out + +# ignores including sub-directories +autovacuum-analyze.out +disable_resgroup.out +enable_resgroup.out +enable_resgroup_validate.out +resgroup_alter_memory.out +resgroup_bypass.out +resgroup_bypass_optimizer.out +resgroup_bypass_optimizer_1.out +resgroup_cpu_rate_limit.out +resgroup_cpuset.out +resgroup_memory_limit.out +resgroup_memory_statistic.out +resgroup_memory_runaway.out +resgroup_move_query.out +workfile_mgr_test.out diff --git a/src/test/singlenode_isolation2/expected/add_column_after_vacuum_skip_drop_column.out b/src/test/singlenode_isolation2/expected/add_column_after_vacuum_skip_drop_column.out new file mode 100644 index 00000000000..74b4423cc06 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/add_column_after_vacuum_skip_drop_column.out @@ -0,0 +1,69 @@ +-- @Description Ensures that an ALTER TABLE ADD COLUMN will drop segfiles in +-- AOSEG_STATE_AWAITING_DROP state left over by a previous vacuum +-- +CREATE TABLE aoco_add_column_after_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true, orientation=column); +CREATE +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 + +DELETE FROM aoco_add_column_after_vacuum_skip_drop; +DELETE 10 + +-- We should see all aocssegs in state 1 +0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); + segno | column_num | state +-------+------------+------- + 1 | 0 | 1 + 1 | 1 | 1 +(2 rows) + +-- VACUUM while another session holds lock +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM aoco_add_column_after_vacuum_skip_drop; + count +------- + 0 +(1 row) +2: VACUUM aoco_add_column_after_vacuum_skip_drop; +VACUUM +1: END; +END + +-- 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'); + segno | column_num | state +-------+------------+------- + 1 | 0 | 2 + 1 | 1 | 2 + 2 | 0 | 1 + 2 | 1 | 1 +(4 rows) + +-- 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 +0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); + segno | column_num | state +-------+------------+------- + 1 | 0 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 2 | 0 | 1 + 2 | 1 | 1 + 2 | 2 | 1 +(6 rows) + +-- 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 +0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); + segno | ?column? | state +-------+----------+------- + 1 | t | 1 + 1 | t | 1 + 1 | t | 1 + 2 | f | 1 + 2 | f | 1 + 2 | f | 1 +(6 rows) diff --git a/src/test/singlenode_isolation2/expected/alter_blocks_for_update_and_viceversa.out b/src/test/singlenode_isolation2/expected/alter_blocks_for_update_and_viceversa.out new file mode 100644 index 00000000000..18ef845b750 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/alter_blocks_for_update_and_viceversa.out @@ -0,0 +1,38 @@ +-- setup +1: drop table if exists alter_block; +DROP +1: create table alter_block(a int, b int) distributed by (a); +CREATE +1: insert into alter_block select 1, 1; +INSERT 1 +-- Validate UPDATE blocks the Alter +2: BEGIN; +BEGIN +2: UPDATE alter_block SET b = b + 1; +UPDATE 1 +1&: ALTER TABLE alter_block SET DISTRIBUTED BY (b); +-- Alter process should be blocked +2: SELECT wait_event_type FROM pg_stat_activity where query like 'ALTER TABLE alter_block %'; + wait_event_type +----------------- + Lock +(1 row) +2: COMMIT; +COMMIT +1<: <... completed> +ALTER +-- Now validate ALTER blocks the UPDATE +2: BEGIN; +BEGIN +2: ALTER TABLE alter_block SET DISTRIBUTED BY (a); +ALTER +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 +----------------- + Lock +(1 row) +2: COMMIT; +COMMIT +1<: <... completed> +UPDATE 1 diff --git a/src/test/singlenode_isolation2/expected/ao_partition_lock.out b/src/test/singlenode_isolation2/expected/ao_partition_lock.out new file mode 100644 index 00000000000..7b564ea5b86 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/ao_partition_lock.out @@ -0,0 +1,29 @@ +-- Previously, even directly insert into a partition ao +-- table's child partition, the transaction will lock +-- all the tables' aoseg table in this partition on +-- each segment. This test case is to test that extra +-- lock is not acquired. + +create table test_ao_partition_lock ( field_dk integer ,field_part integer) with (appendonly=true) PARTITION BY LIST(field_part) ( partition val1 values(1), partition val2 values(2), partition val3 values(3) ); +CREATE + +1: begin; +BEGIN +1: insert into test_ao_partition_lock_1_prt_val1 values(1,1); +INSERT 1 + +2: begin; +BEGIN +2: alter table test_ao_partition_lock truncate partition for (2); +ALTER +2: end; +END + +1: end; +END + +1q: ... +2q: ... + +drop table test_ao_partition_lock; +DROP diff --git a/src/test/singlenode_isolation2/expected/ao_same_trans_truncate_crash.out b/src/test/singlenode_isolation2/expected/ao_same_trans_truncate_crash.out new file mode 100644 index 00000000000..318de3ce104 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/ao_same_trans_truncate_crash.out @@ -0,0 +1,77 @@ +-- setup +-- Set fsync on since we need to test the fsync code logic. +!\retcode gpconfig -c fsync -v on --skipvalidation; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore + +-- end_ignore +(exited with code 0) +-- skip FTS probes to avoid segment being marked down on restart +SELECT gp_inject_fault_infinite('fts_probe', 'skip', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + + +-- test scenario + +-- The test is to validate crash recovery can be completed, for WAL +-- records generated by same transaction create and truncate followed +-- by abort transaction. Context is table created in same transaction +-- on truncate command performs unsafe truncate operation where it +-- emits WAL record for file truncate and truncates the file. During +-- crash recovery, file truncate WAL record replay will queue fsync +-- request. Replay of abort record will unlink the file. There used to +-- bug where abort record replay didn't emit forget fsync request +-- before unlink the file. This cased the crash recovery to PANIC as +-- couldn't complete the stale fsync request registered by file +-- truncate WAL record. +-- Also this is a chance of simply testing SyncAllXLogFile() thats fsync wal +-- files only during crash recovery. +1: CHECKPOINT; +CHECKPOINT +1: BEGIN; +BEGIN +1: CREATE TABLE ao_same_trans_truncate(a int, b int) WITH (appendonly=true, orientation=column); +CREATE +1: TRUNCATE TABLE ao_same_trans_truncate; +TRUNCATE +1: ABORT; +ABORT +-- restart (immediate) to invoke crash recovery +1: SELECT pg_ctl(datadir, 'restart') FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; + pg_ctl +-------- + OK + OK + OK +(3 rows) +-- validate the segments recovered fine and able to serve queries +2: SELECT oid from gp_dist_random('pg_class') WHERE relname='ao_same_trans_truncate'; + oid +----- +(0 rows) + +-- cleanup +SELECT gp_inject_fault('fts_probe', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +!\retcode gpconfig -c fsync -v off --skipvalidation; +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore + +-- end_ignore +(exited with code 0) diff --git a/src/test/singlenode_isolation2/expected/bitmap_index_ao_sparse.out b/src/test/singlenode_isolation2/expected/bitmap_index_ao_sparse.out new file mode 100644 index 00000000000..7ae6356c927 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/bitmap_index_ao_sparse.out @@ -0,0 +1,126 @@ +-- +-- Test, run Bitmap Heap Scan on AO/AOCS table's sparse bitmap index. +-- Here start two transactions in the same time to insert tuples +-- into different seg file. Then create bitmap index on it. +-- This will lead to very sparse bitmap index. +-- Since the tid in bitmap index for AO is composed of segfile no, +-- and row no. +-- + +-- Test AO table. +CREATE TABLE ao_sparse (id int) with(appendonly = true); +CREATE + +1: begin; +BEGIN +2: begin; +BEGIN + +1: INSERT INTO ao_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +2: INSERT INTO ao_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 + +1: commit; +COMMIT +2: commit; +COMMIT + +-- Let's check the total tuple count with id=97,99 without bitmap index. +SELECT count(*) FROM ao_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + count +------- + 600 +(1 row) + +CREATE INDEX idx_ao_sparse_id ON ao_sparse USING bitmap (id); +CREATE + + +-- Should generate Bitmap Heap Scan on the bitmap index. +1: set optimizer = off; +SET +1: EXPLAIN (COSTS OFF) SELECT * FROM ao_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + QUERY PLAN +------------------------------------------------- + Bitmap Heap Scan on ao_sparse + Recheck Cond: ((id >= 97) AND (id <= 99)) + Filter: (gp_segment_id = '-1'::integer) + -> Bitmap Index Scan on idx_ao_sparse_id + Index Cond: ((id >= 97) AND (id <= 99)) + Optimizer: Postgres query optimizer +(6 rows) + +-- We used to hit assertion failure since it generates a empty bitmap for a block's PagetableEntry. +-- In BitmapHeapNext, if table_scan_bitmap_next_block returns false(which means the block should be +-- skipped), but we still try to fetch tuple through table_scan_bitmap_next_tuple, and it didn't find +-- the PagetableEntry is empty. +-- This error happens only when we fetch multiple LOVs when doing bitmap heap scan on bitmap index for +-- AO tables. AOCS table and "SELECT count(*) FROM ao_sparse WHERE id = 97" works fine. +1: SELECT count(*) FROM ao_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + count +------- + 600 +(1 row) + +-- This query doesn't have any issue. +1: SELECT count(*) FROM ao_sparse WHERE id = 97; + count +------- + 200 +(1 row) + + +-- Test AOCS table. +CREATE TABLE aocs_sparse (id int) with(appendonly = true, orientation = COLUMN); +CREATE + +1: begin; +BEGIN +2: begin; +BEGIN + +1: INSERT INTO aocs_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +2: INSERT INTO aocs_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 + +1: commit; +COMMIT +2: commit; +COMMIT + +-- Let's check the total tuple count with id=97 without bitmap index. +SELECT count(*) FROM aocs_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + count +------- + 600 +(1 row) + +CREATE INDEX idx_ao_sparse_id ON aocs_sparse USING bitmap (id); +ERROR: relation "idx_ao_sparse_id" already exists + + +-- Should generate Bitmap Heap Scan on the bitmap index. +1: EXPLAIN (COSTS OFF) SELECT * FROM aocs_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + QUERY PLAN +--------------------------------------------------------------------------- + Seq Scan on aocs_sparse + Filter: ((id >= 97) AND (id <= 99) AND (gp_segment_id = '-1'::integer)) + Optimizer: Postgres query optimizer +(3 rows) + +-- This doesn't have any issue, but let's make sure it will not make any error in future. +1: SELECT count(*) FROM aocs_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + count +------- + 600 +(1 row) + +-- This query doesn't have any issue. +1: SELECT count(*) FROM ao_sparse WHERE id = 97; + count +------- + 200 +(1 row) + diff --git a/src/test/singlenode_isolation2/expected/bitmap_index_concurrent.out b/src/test/singlenode_isolation2/expected/bitmap_index_concurrent.out new file mode 100644 index 00000000000..2a7d0e8a0e3 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/bitmap_index_concurrent.out @@ -0,0 +1,510 @@ +-- +-- Concurrent scan on bitmap index when there's insert running in the backend +-- may cause the bitmap scan read wrong tid. +-- If a LOV has multiple bitmap pages, and the index insert tries to insert a tid +-- into a compressed word on a full bitmap page(Let's call the page `PAGE_FULL`). +-- Then it'll try to find free space on next bitmap page(Let's call the page `PAGE_NEXT`) +-- and rearrange the words and copy extra words into the next bitmap page. +-- So when the above insertion happens, imagine below case: +-- 1. Query on bitmap: A query starts and reads all bitmap pages to `PAGE_FULL`, increase +-- next tid to fetch, release lock after reading each page. +-- 2. Concurrent insert: insert a tid into `PAGE_FULL` cause expand compressed words to +-- new words, and rearrange words into `PAGE_NEXT`. +-- 3. Query on bitmap: fetch `PAGE_NEXT` and expect the first tid in it should equal the +-- saved next tid. But actually `PAGE_NEXT` now contains words used to belong in `PAGE_FULL`. +-- This causes the real next tid less than the expected next tid. But our scan keeps increasing +-- the wrong tid. And then this leads to a wrong result. +-- This related to issue: https://github.com/greenplum-db/gpdb/issues/11308 +-- + +-- Here we use append optimized table to speed up create full bitmap pages +-- since each transaction use different seg file number. And ao table's AOTupleId +-- is composed of (seg file number, row number). So this will lead to lots of +-- compressed words in the first bitmap page. +-- With the below transacions in each session, on seg0, the bitmap for id=97 +-- 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 + +1: begin; +BEGIN +2: begin; +BEGIN +3: begin; +BEGIN +4: begin; +BEGIN +5: begin; +BEGIN +6: begin; +BEGIN +7: begin; +BEGIN +8: begin; +BEGIN +9: begin; +BEGIN +10: begin; +BEGIN +11: begin; +BEGIN +12: begin; +BEGIN +13: begin; +BEGIN +14: begin; +BEGIN +15: begin; +BEGIN +16: begin; +BEGIN +17: begin; +BEGIN +18: begin; +BEGIN +19: begin; +BEGIN +20: begin; +BEGIN +21: begin; +BEGIN +22: begin; +BEGIN + +1: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +2: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +3: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +4: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +5: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +6: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +7: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +8: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +9: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +10: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +11: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +12: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +13: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +14: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +15: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +16: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +17: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +18: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +19: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +20: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +21: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 +22: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +INSERT 1000000 + +1: commit; +COMMIT +2: commit; +COMMIT +3: commit; +COMMIT +4: commit; +COMMIT +5: commit; +COMMIT +6: commit; +COMMIT +7: commit; +COMMIT +8: commit; +COMMIT +9: commit; +COMMIT +10: commit; +COMMIT +11: commit; +COMMIT +12: commit; +COMMIT +13: commit; +COMMIT +14: commit; +COMMIT +15: commit; +COMMIT +16: commit; +COMMIT +17: commit; +COMMIT +18: commit; +COMMIT +19: commit; +COMMIT +20: commit; +COMMIT +21: commit; +COMMIT +22: commit; +COMMIT + +-- Let's check the total tuple count with id=97 without bitmap index. +SELECT count(*) FROM bmupdate WHERE id = 97; + count +------- + 2200 +(1 row) + +CREATE INDEX idx_bmupdate__id ON bmupdate USING bitmap (id); +CREATE + +-- +-- Test 1, run Bitmap Heap Scan on the bitmap index when there's +-- backend insert running. +-- +-- Inject fault after read the first bitmap page when query the table. +SELECT gp_inject_fault_infinite('after_read_one_bitmap_idx_page', 'suspend', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Inject fault when insert new tid cause rearrange words from current +-- bitmap page to next bitmap page. +SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +1: set optimizer = off; +SET +1: set enable_seqscan=off; +SET +-- Should generate Bitmap Heap Scan on the bitmap index. +1: EXPLAIN (COSTS OFF) SELECT * FROM bmupdate WHERE id = 97; + QUERY PLAN +--------------------------------------------------- + Gather Motion 1:1 (slice1; segments: 1) + -> Bitmap Heap Scan on bmupdate + Recheck Cond: (id = 97) + -> Bitmap Index Scan on idx_bmupdate__id + Index Cond: (id = 97) + Optimizer: Postgres query optimizer +(6 rows) +-- Query should suspend on the first fault injection which finish read the first bitmap page. +1&: SELECT count(*) FROM bmupdate WHERE id = 97; + +-- Insert will insert new tid in the first bitmap page and cause the word expand +-- and rearrange exceed words to next bitmap page. +-- 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 + +-- Query should read the first page(buffer lock released), and then INSERT insert to +-- the first page which will trigger rearrange words. +SELECT gp_wait_until_triggered_fault('rearrange_word_to_next_bitmap_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('rearrange_word_to_next_bitmap_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Insert triggered rearrange +SELECT gp_wait_until_triggered_fault('after_read_one_bitmap_idx_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('after_read_one_bitmap_idx_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Should return the correct tuple count with id=97. It used to raise assertion failure for +-- AO tables. This is because the wrong tid transform to an invalud AOTupleId. +1<: <... completed> + count +------- + 2200 +(1 row) + +-- Let's check the total tuple count after the test. +SELECT count(*) FROM bmupdate WHERE id = 97; + count +------- + 2201 +(1 row) + +-- +-- Test 2, run Index Scan on the bitmap index when there's backend +-- insert running. +-- +-- Inject fault after read the first bitmap page when query the table. +SELECT gp_inject_fault_infinite('after_read_one_bitmap_idx_page', 'suspend', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Inject fault when insert new tid cause rearrange words from current +-- bitmap page to next bitmap page. +SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +1: set enable_bitmapscan=off; +SET +-- Should generate Index Scan on the bitmap index. +1: EXPLAIN (COSTS OFF) SELECT * FROM bmupdate WHERE id = 97; + QUERY PLAN +----------------------------------------------------- + Gather Motion 1:1 (slice1; segments: 1) + -> Index Scan using idx_bmupdate__id on bmupdate + Index Cond: (id = 97) + Optimizer: Postgres query optimizer +(4 rows) +-- Query should suspend on the first fault injection which finish read the first bitmap page. +1&: SELECT count(*) FROM bmupdate WHERE id = 97; + +-- Insert will insert new tid in the first bitmap page and cause the word expand +-- and rearrange exceed words to next bitmap page. +-- 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 + +-- Query should read the first page(buffer lock released), and then INSERT insert to +-- the first page which will trigger rearrange words. +SELECT gp_wait_until_triggered_fault('rearrange_word_to_next_bitmap_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('rearrange_word_to_next_bitmap_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Insert triggered rearrange +SELECT gp_wait_until_triggered_fault('after_read_one_bitmap_idx_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('after_read_one_bitmap_idx_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Should return the correct tuple count with id=97. It used to raise assertion failure for +-- AO tables. This is because the wrong tid transform to an invalud AOTupleId. +1<: <... completed> + count +------- + 2201 +(1 row) + +-- +-- Test 3, run Index Scan on the bitmap index that match multiple keys when there's backend +-- insert running. +-- +-- Let's check the total tuple count before the test. +SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + count +------- + 4402 +(1 row) + +-- Inject fault after read the first bitmap page when query the table. +SELECT gp_inject_fault_infinite('after_read_one_bitmap_idx_page', 'suspend', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Inject fault when insert new tid cause rearrange words from current +-- bitmap page to next bitmap page. +SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Should generate Index Scan on the bitmap index that match multiple keys. +1: EXPLAIN (COSTS OFF) SELECT * FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + QUERY PLAN +----------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) + -> Index Scan using idx_bmupdate__id on bmupdate + Index Cond: ((id >= 97) AND (id <= 99)) + Filter: (gp_segment_id = 0) + Optimizer: Postgres query optimizer +(5 rows) +-- Query should suspend on the first fault injection which finish read the first bitmap page. +1&: SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + +-- Insert will insert new tid in the first bitmap page and cause the word expand +-- and rearrange exceed words to next bitmap page. +-- 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. +-- Here insert both values to make sure update on full bitmap happens for one LOV. +2: INSERT INTO bmupdate VALUES (97); +INSERT 1 +2: INSERT INTO bmupdate VALUES (99); +INSERT 1 + +-- Query should read the first page(buffer lock released), and then INSERT insert to +-- the first page which will trigger rearrange words. +SELECT gp_wait_until_triggered_fault('rearrange_word_to_next_bitmap_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('rearrange_word_to_next_bitmap_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Insert triggered rearrange +SELECT gp_wait_until_triggered_fault('after_read_one_bitmap_idx_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('after_read_one_bitmap_idx_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Should return the correct tuple count with id=97. It used to raise assertion failure for +-- AO tables. This is because the wrong tid transform to an invalud AOTupleId. +1<: <... completed> + count +------- + 4402 +(1 row) + +-- Let's check the total tuple count after the test. +SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + count +------- + 4404 +(1 row) + +-- +-- Test 4, run Bitmap Heap Scan on the bitmap index that match multiple keys when there's backend +-- insert running. +-- + +-- Inject fault after read the first bitmap page when query the table. +SELECT gp_inject_fault_infinite('after_read_one_bitmap_idx_page', 'suspend', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Inject fault when insert new tid cause rearrange words from current +-- bitmap page to next bitmap page. +SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +1: set enable_bitmapscan=on; +SET +-- Should generate Bitmap HEAP Scan on the bitmap index that match multiple keys. +1: EXPLAIN (COSTS OFF) SELECT * FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + QUERY PLAN +------------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) + -> Bitmap Heap Scan on bmupdate + Recheck Cond: ((id >= 97) AND (id <= 99)) + Filter: (gp_segment_id = 0) + -> Bitmap Index Scan on idx_bmupdate__id + Index Cond: ((id >= 97) AND (id <= 99)) + Optimizer: Postgres query optimizer +(7 rows) +-- Query should suspend on the first fault injection which finish read the first bitmap page. +1&: SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + +-- Insert will insert new tid in the first bitmap page and cause the word expand +-- and rearrange exceed words to next bitmap page. +-- 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. +-- 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 +2: INSERT INTO bmupdate SELECT 99 FROM generate_series(1, 1000); +INSERT 1000 + +-- Query should read the first page(buffer lock released), and then INSERT insert to +-- the first page which will trigger rearrange words. +SELECT gp_wait_until_triggered_fault('rearrange_word_to_next_bitmap_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('rearrange_word_to_next_bitmap_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Insert triggered rearrange +SELECT gp_wait_until_triggered_fault('after_read_one_bitmap_idx_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('after_read_one_bitmap_idx_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Should return the correct tuple count with id=97. It used to raise assertion failure for +-- AO tables. This is because the wrong tid transform to an invalud AOTupleId. +1<: <... completed> + count +------- + 4404 +(1 row) + +-- Let's check the total tuple count after the test. +SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + count +------- + 6404 +(1 row) + +DROP TABLE bmupdate; +DROP + diff --git a/src/test/singlenode_isolation2/expected/bitmap_index_crash.out b/src/test/singlenode_isolation2/expected/bitmap_index_crash.out new file mode 100644 index 00000000000..773c414ab2c --- /dev/null +++ b/src/test/singlenode_isolation2/expected/bitmap_index_crash.out @@ -0,0 +1,95 @@ +-- Test to validate bitmap index is fine after crash recovery in-case +-- meta-page buffer eviction happens. There used to be bug if the +-- metapage is not present in shared buffers, it will not be fetched +-- from disk. Instead, a zeroed out page will be returned. A +-- subsequent flush of the metapage will lead to an inadvertent +-- overwrite. +1:CREATE EXTENSION IF NOT EXISTS gp_inject_fault; +CREATE +-- 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 +-------------------------- + Success: +(1 row) +1:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +-- test setup +1:CREATE TABLE bm(a int); +CREATE +1:CREATE INDEX ON bm USING bitmap (a); +CREATE +-- 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 +-------------------------- + Success: + Success: + Success: + Success: +(4 rows) +1:CHECKPOINT; +CHECKPOINT + +-- this insert's WAL we wish to replay +1:insert into bm select generate_series(1, 5000); +INSERT 5000 +1U:select pg_relation_size(oid)/current_setting('block_size')::bigint from pg_class where relname = 'bm_a_idx'; + ?column? +---------- + 29 +(1 row) + +-- set small shared_buffers to make sure META_PAGE of bitmap index evicts out +1U: ALTER SYSTEM set shared_buffers to 20; +ALTER +1:SELECT pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' and content = 1; + pg_ctl +-------- + OK +(1 row) + +-- force index scan and make sure the index is fine +2:SET enable_seqscan to off; +SET +2:SELECT * FROM bm WHERE a < 10; + a +--- + 1 + 5 + 6 + 9 + 2 + 3 + 4 + 7 + 8 +(9 rows) + +-- teardown cleanup for the test +1Uq: ... +1U:ALTER SYSTEM reset shared_buffers; +ALTER +2:SELECT pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' and content = 1; + pg_ctl +-------- + OK +(1 row) +3:SELECT gp_inject_fault_infinite('checkpoint', 'reset', dbid) FROM gp_segment_configuration WHERE role='p'; + gp_inject_fault_infinite +-------------------------- + Success: + Success: + Success: + Success: +(4 rows) + +3:SELECT gp_inject_fault('fts_probe', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/bitmap_index_inspect.out b/src/test/singlenode_isolation2/expected/bitmap_index_inspect.out new file mode 100644 index 00000000000..30ef8520ab6 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/bitmap_index_inspect.out @@ -0,0 +1,68 @@ +-- This tests the bitmap index pageinspect functions. The tests reside here, as opposed to +-- contrib/pageinspect because we want to leverage isolation2's utility mode syntax (since the +-- inspect functions run against a single node, as opposed to the entire GP cluster) + +-- Setup +1U: CREATE EXTENSION pageinspect; +CREATE +1U: CREATE TABLE bmtest_t1(i int, bmfield int); +CREATE +1U: CREATE INDEX bmtest_i1 ON bmtest_t1 USING bitmap(bmfield); +CREATE +1U: INSERT INTO bmtest_t1 SELECT i,1 FROM generate_series(1, 1000) i; +INSERT 1000 +1U: INSERT INTO bmtest_t1 SELECT i,2 FROM generate_series(1, 1000) i; +INSERT 1000 + +-- start_matchsubs +-- m/bmfuncs.c:\d+/ +-- s/bmfuncs.c:\d+/bmfuncs.c:XXX/g +-- end_matchsubs + +-- Test metapage +1U: SELECT magic, version, regexp_replace(auxrelid::regclass::text,'[[:digit:]]+', 'auxrelid') AS auxrelname, regexp_replace(auxindexrelid::regclass::text,'[[:digit:]]+', 'auxindrelid') AS auxindexrelname FROM bm_metap('bmtest_i1'); + magic | version | auxrelname | auxindexrelname +------------+---------+-------------------------------+---------------------------------------- + 1112101965 | 2 | pg_bitmapindex.pg_bm_auxrelid | pg_bitmapindex.pg_bm_auxindrelid_index +(1 row) + +-- Test LOV item pages +-- Negative cases (not a LOV page) +1U: SELECT * FROM bm_lov_page_items('bmtest_i1', 0); +ERROR: block 0 is a meta page (bmfuncs.c:246) +1U: SELECT * FROM bm_lov_page_items('bmtest_i1', 2); +ERROR: block 2 is not an LOV page, it is a bitmap page (bmfuncs.c:273) +-- Positive test +1U: SELECT * FROM bm_lov_page_items('bmtest_i1', 1) order by itemoffset; + itemoffset | lov_head_blkno | lov_tail_blkno | last_complete_word | last_word | last_tid | last_setbit_tid | is_last_complete_word_fill | is_last_word_fill +------------+----------------+----------------+-------------------------+-------------------------+----------+-----------------+----------------------------+------------------- + 1 | 4294967295 | 4294967295 | ff ff ff ff ff ff ff ff | 00 00 00 00 00 00 00 00 | 0 | 0 | f | f + 2 | 2 | 2 | 80 00 00 00 00 00 00 01 | 00 00 00 00 07 ff ff ff | 65600 | 65627 | t | f + 3 | 3 | 3 | 80 00 00 00 00 00 00 02 | 00 3f ff ff ff ff ff ff | 131200 | 131254 | t | f +(3 rows) + +-- Test bitmap pages +-- Negative cases (not a bitmap page) +1U: SELECT * FROM bm_bitmap_page_items('bmtest_i1', 0); +ERROR: block 0 is a meta page (bmfuncs.c:480) +1U: SELECT * FROM bm_bitmap_page_items('bmtest_i1', 1); +ERROR: block 1 is not a bitmap page, it is a LOV item page (bmfuncs.c:507) +-- Positive test +1U: SELECT * FROM bm_bitmap_page_header('bmtest_i1', 2); + num_words | next_blkno | last_tid +-----------+------------+---------- + 3 | 4294967295 | 65536 +(1 row) +1U: SELECT * FROM bm_bitmap_page_items('bmtest_i1', 2) order by word_num; + word_num | compressed | content_word +----------+------------+------------------------- + 0 | t | 80 00 00 00 00 00 00 0e + 1 | f | 00 00 00 00 00 00 1f ff + 2 | t | 00 00 00 00 00 00 03 f1 +(3 rows) + +-- cleanup +1U: DROP TABLE bmtest_t1; +DROP +1U: DROP EXTENSION pageinspect; +DROP diff --git a/src/test/singlenode_isolation2/expected/bitmap_union.out b/src/test/singlenode_isolation2/expected/bitmap_union.out new file mode 100644 index 00000000000..d5f2d24be6c --- /dev/null +++ b/src/test/singlenode_isolation2/expected/bitmap_union.out @@ -0,0 +1,67 @@ +-- +-- Test union bitmap batch words for multivalues index scan like where x in (x1, x2) or x > v +-- which creates BitmapAnd plan on two bitmap indexs that match multiple keys by using in in where clause +-- +CREATE TABLE bmunion (a int, b int); +CREATE +INSERT INTO bmunion SELECT (r%53), (r%59) FROM generate_series(1,70000) r; +INSERT 70000 +CREATE INDEX i_bmtest2_a ON bmunion USING BITMAP(a); +CREATE +CREATE INDEX i_bmtest2_b ON bmunion USING BITMAP(b); +CREATE +INSERT INTO bmunion SELECT 53, 1 FROM generate_series(1, 1000); +INSERT 1000 + +SET optimizer_enable_tablescan=OFF; +SET +SET optimizer_enable_dynamictablescan=OFF; +SET +-- Inject fault for planner so that it could produce bitMapAnd plan node. +SELECT gp_inject_fault('simulate_bitmap_and', 'skip', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +EXPLAIN (COSTS OFF) SELECT count(*) FROM bmunion WHERE a = 53 AND b < 3; + QUERY PLAN +---------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on bmunion + Recheck Cond: ((b < 3) AND (a = 53)) + -> BitmapAnd + -> Bitmap Index Scan on i_bmtest2_b + Index Cond: (b < 3) + -> Bitmap Index Scan on i_bmtest2_a + Index Cond: (a = 53) + Optimizer: Postgres query optimizer +(9 rows) +SELECT gp_inject_fault('simulate_bitmap_and', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = -1; + gp_inject_fault +----------------- + Success: +(1 row) + +SELECT gp_inject_fault('simulate_bitmap_and', 'skip', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +SELECT count(*) FROM bmunion WHERE a = 53 AND b < 3; + count +------- + 1000 +(1 row) +SELECT gp_inject_fault('simulate_bitmap_and', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = -1; + gp_inject_fault +----------------- + Success: +(1 row) + +RESET optimizer_enable_tablescan; +RESET +RESET optimizer_enable_dynamictablescan; +RESET + +DROP TABLE bmunion; +DROP diff --git a/src/test/singlenode_isolation2/expected/bitmap_update_words_backup_block.out b/src/test/singlenode_isolation2/expected/bitmap_update_words_backup_block.out new file mode 100644 index 00000000000..950f91d36be --- /dev/null +++ b/src/test/singlenode_isolation2/expected/bitmap_update_words_backup_block.out @@ -0,0 +1,65 @@ +-- Setup fault injectors. +CREATE EXTENSION IF NOT EXISTS gp_inject_fault; +CREATE + +-- 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 +-------------------------- + Success: +(1 row) +1:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +CREATE TABLE bm_update_words_backup_block (id int) WITH (appendonly = true); +CREATE + +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 +2: INSERT INTO bm_update_words_backup_block SELECT i%100 FROM generate_series(1, 200) AS i; +INSERT 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 + +-- 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 +2: INSERT INTO bm_update_words_backup_block VALUES (97), (99); +INSERT 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 + +-- Do an immediate restart to force crash recovery. The above INSERT +-- should be replayed with the backup blocks. +1: SELECT pg_ctl(datadir, 'restart') FROM gp_segment_configuration WHERE role = 'p' AND content = 0; + pg_ctl +-------- + OK +(1 row) +3: INSERT INTO bm_update_words_backup_block VALUES (97); +INSERT 1 + +-- Turn FTS back on. +3:SELECT gp_inject_fault('fts_probe', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/cancel_plpython.out b/src/test/singlenode_isolation2/expected/cancel_plpython.out new file mode 100644 index 00000000000..37964e3b04c --- /dev/null +++ b/src/test/singlenode_isolation2/expected/cancel_plpython.out @@ -0,0 +1,102 @@ +-- start_ignore +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 OR REPLACE FUNCTION pysleep() RETURNS double precision AS $$ import time time.sleep(100) return 1 $$ LANGUAGE plpython3u; +CREATE + +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 OR REPLACE FUNCTION pynestsleep() RETURNS double precision AS $$ # container: plc_python_shared rv = plpy.execute("select pyspisleep()") return 1 $$ LANGUAGE plpython3u; +CREATE + +CREATE OR REPLACE FUNCTION pynestsleep2() RETURNS double precision AS $$ # container: plc_python_shared rv = plpy.execute("select pysleep()") return 1 $$ LANGUAGE plpython3u; +CREATE + + +CREATE TABLE a(i int); +CREATE +insert into a values(1),(10),(20),(100); +INSERT 4 + +1&: select pybusyloop(); +2&: select pybusyloop() from a; +3&: select pysleep(); +4&: select pysleep() from a; +5&: select pyspisleep(); +6&: select pynestsleep(); +7&: select pynestsleep2(); + + +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') FROM pg_stat_activity WHERE query LIKE 'select pybusyloop()%' ORDER BY pid LIMIT 2; + pg_cancel_backend +------------------- + t + t +(2 rows) +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') FROM pg_stat_activity WHERE query LIKE 'select pysleep()%' ORDER BY pid LIMIT 2; + pg_cancel_backend +------------------- + t + t +(2 rows) +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') FROM pg_stat_activity WHERE query LIKE 'select pyspisleep()%' ORDER BY pid LIMIT 1; + pg_cancel_backend +------------------- + t +(1 row) +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') FROM pg_stat_activity WHERE query LIKE 'select pynestsleep()%' ORDER BY pid LIMIT 1; + pg_cancel_backend +------------------- + t +(1 row) +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') FROM pg_stat_activity WHERE query LIKE 'select pynestsleep2()%' ORDER BY pid LIMIT 1; + pg_cancel_backend +------------------- + t +(1 row) +-- start_ignore +-- start_ignore +-- start_ignore +-- start_ignore +1<: <... completed> +ERROR: canceling statement due to user request: "test pg_cancel_backend" +CONTEXT: PL/Python function "pybusyloop" +1q: ... +2<: <... completed> +ERROR: canceling statement due to user request: "test pg_cancel_backend" +2q: ... +3<: <... completed> +ERROR: canceling statement due to user request: "test pg_cancel_backend" +CONTEXT: PL/Python function "pysleep" +3q: ... +4<: <... completed> +ERROR: canceling statement due to user request: "test pg_cancel_backend" +4q: ... +5<: <... completed> +ERROR: spiexceptions.QueryCanceled: canceling statement due to user request: "test pg_cancel_backend" +CONTEXT: Traceback (most recent call last): + PL/Python function "pyspisleep", line 3, in + rv = plpy.execute("select pg_sleep(100)") +PL/Python function "pyspisleep" +5q: ... +6<: <... completed> +ERROR: spiexceptions.QueryCanceled: spiexceptions.QueryCanceled: canceling statement due to user request: "test pg_cancel_backend" +CONTEXT: Traceback (most recent call last): + PL/Python function "pynestsleep", line 3, in + rv = plpy.execute("select pyspisleep()") +PL/Python function "pynestsleep" +6q: ... +7<: <... completed> +ERROR: spiexceptions.QueryCanceled: canceling statement due to user request: "test pg_cancel_backend" +CONTEXT: Traceback (most recent call last): + PL/Python function "pynestsleep2", line 3, in + rv = plpy.execute("select pysleep()") +PL/Python function "pynestsleep2" +7q: ... +-- end_ignore + diff --git a/src/test/singlenode_isolation2/expected/cancel_query.out b/src/test/singlenode_isolation2/expected/cancel_query.out new file mode 100644 index 00000000000..16b8e3b9857 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/cancel_query.out @@ -0,0 +1,45 @@ +CREATE EXTENSION IF NOT EXISTS gp_inject_fault; +CREATE + +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') 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 +0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2018-01-01 10:00:00', 1, 3); +INSERT 1 +0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2019-01-01 12:00:00', 2, 4); +INSERT 1 +0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2020-01-01 13:00:00', 3, 5); +INSERT 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 +----------------- + Success: +(1 row) +0&: SELECT gp_wait_until_triggered_fault('zlib_decompress_after_decompress_fn', 1, dbid) FROM gp_segment_configuration WHERE content=-1 AND role='p'; + +-- ANALYZE on AO/CO table with zlib compression will hit and fault injection +-- 'zlib_decompress_after_decompress_fn' +1&: ANALYZE a_partition_table_for_analyze_cancellation_1_prt_p3; + +-- It should still be possible to cancel the ANALYZE backend +2: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND application_name='pg_regress'; + pg_cancel_backend +------------------- + t + t + t +(3 rows) +0<: <... completed> + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +1<: <... completed> +ERROR: canceling statement due to user request + +SELECT gp_inject_fault('zlib_decompress_after_decompress_fn', 'reset', dbid) FROM gp_segment_configuration; + gp_inject_fault +----------------- + Success: + Success: +(2 rows) diff --git a/src/test/singlenode_isolation2/expected/check_gxid.out b/src/test/singlenode_isolation2/expected/check_gxid.out new file mode 100644 index 00000000000..f12c6dd935b --- /dev/null +++ b/src/test/singlenode_isolation2/expected/check_gxid.out @@ -0,0 +1,57 @@ +select gp_segment_id, gp_get_next_gxid() < (select gp_get_next_gxid()) from gp_dist_random('gp_id'); + gp_segment_id | ?column? +---------------+---------- + 1 | t + 2 | t + 0 | t +(3 rows) +-- start_ignore +select gp_segment_id,gp_get_next_gxid() on_seg, (select gp_get_next_gxid() on_cor) from gp_dist_random('gp_id'); + gp_segment_id | on_seg | on_cor +---------------+--------+-------- + 0 | 53830 | 53831 + 1 | 53830 | 53831 + 2 | 53830 | 53831 +(3 rows) +-- end_ignore + +-- trigger master panic and wait until master down before running any new query. +1&: SELECT wait_till_master_shutsdown(); +2: SELECT gp_inject_fault('before_read_command', 'panic', 1); + gp_inject_fault +----------------- + Success: +(1 row) +2: SELECT 1; +PANIC: fault triggered, fault name:'before_read_command' fault type:'panic' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +1<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- wait until master is up for querying. +3: SELECT 1; + ?column? +---------- + 1 +(1 row) + +3: select gp_segment_id, gp_get_next_gxid() < (select gp_get_next_gxid()) from gp_dist_random('gp_id'); + gp_segment_id | ?column? +---------------+---------- + 2 | t + 0 | t + 1 | t +(3 rows) +-- start_ignore +3: select gp_segment_id,gp_get_next_gxid() on_seg, (select gp_get_next_gxid() on_cor) from gp_dist_random('gp_id'); + gp_segment_id | on_seg | on_cor +---------------+--------+-------- + 0 | 53830 | 61997 + 1 | 53830 | 61997 + 2 | 53830 | 61997 +(3 rows) +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/checkpoint_dtx_info.out b/src/test/singlenode_isolation2/expected/checkpoint_dtx_info.out new file mode 100644 index 00000000000..570ffb1800a --- /dev/null +++ b/src/test/singlenode_isolation2/expected/checkpoint_dtx_info.out @@ -0,0 +1,89 @@ +-- Scenario to test, CHECKPOINT getting distributed transaction +-- information between COMMIT processing time window +-- `XLogInsert(RM_XACT_ID, XLOG_XACT_DISTRIBUTED_COMMIT)` and +-- insertedDistributedCommitted(). `delayChkpt` protects this +-- case. There used to bug in placement of getDtxCheckPointInfo() in +-- checkpoint code causing, transaction to be committed on coordinator +-- and aborted on segments. Test case is meant to validate +-- getDtxCheckPointInfo() gets called after +-- GetVirtualXIDsDelayingChkpt(). +-- +-- Test controls the progress of COMMIT executed in session 1 and of +-- CHECKPOINT executed in the checkpointer process, with high-level +-- flow: +-- +-- 1. session 1: COMMIT is blocked at start_insertedDistributedCommitted +-- 2. checkpointer: Start a CHECKPOINT and wait to reach before_wait_VirtualXIDsDelayingChkpt +-- 3. session 1: COMMIT is resumed +-- 4. checkpointer: CHECKPOINT is resumed and executes to keep_log_seg to finally introduce panic and perform crash recovery +-- +-- Bug existed when getDtxCheckPointInfo() was invoked before +-- GetVirtualXIDsDelayingChkpt(), getDtxCheckPointInfo() will not +-- contain the distributed transaction in session1 whose state is +-- DTX_STATE_INSERTED_COMMITTED. Therefore, after crash recovery, the +-- 2PC transaction that has been committed on coordinator will be +-- considered as orphaned prepared transaction hence is aborted at +-- segments. As a result the SELECT executed by session3 used to fail +-- because the twopcbug table only existed on the coordinator. +-- +1: select gp_inject_fault_infinite('start_insertedDistributedCommitted', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1: begin; +BEGIN +1: create table twopcbug(i int, j int); +CREATE +1&: commit; +2: select gp_inject_fault_infinite('before_wait_VirtualXIDsDelayingChkpt', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +33&: checkpoint; +2: select gp_inject_fault_infinite('keep_log_seg', 'panic', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- wait to make sure we don't resume commit processing before this +-- step in checkpoint +2: select gp_wait_until_triggered_fault('before_wait_VirtualXIDsDelayingChkpt', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- reason for this inifinite wait is just to avoid test flake. Without +-- this joining step "1<" may see "COMMIT" sometimes or "server closed +-- the connection unexpectedly" otherwise. With this its always +-- "server closed the connection unexpectedly". +2: select gp_inject_fault_infinite('after_xlog_xact_distributed_commit', 'infinite_loop', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2: select gp_inject_fault_infinite('start_insertedDistributedCommitted', 'resume', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +33<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- wait until coordinator is up for querying. +3: select 1; + ?column? +---------- + 1 +(1 row) +3: select count(1) from twopcbug; + count +------- + 0 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/commit_transaction_block_checkpoint.out b/src/test/singlenode_isolation2/expected/commit_transaction_block_checkpoint.out new file mode 100644 index 00000000000..0857b3b7a2a --- /dev/null +++ b/src/test/singlenode_isolation2/expected/commit_transaction_block_checkpoint.out @@ -0,0 +1,78 @@ +-- TEST 1: block checkpoint on segments + +-- pause the 2PC after setting inCommit flag +select gp_inject_fault_infinite('before_xlog_xact_commit_prepared', 'suspend', 3); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- trigger a 2PC, and it will block at commit; +2: checkpoint; +CHECKPOINT +2: begin; +BEGIN +2: create table t_commit_transaction_block_checkpoint (c int) distributed by (c); +CREATE +2&: commit; + +-- wait for the fault to trigger since following checkpoint could be faster +select gp_wait_until_triggered_fault('before_xlog_xact_commit_prepared', 1, 3); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- do checkpoint on segment content 1 in utility mode, and it should block +1U&: checkpoint; + +-- resume the 2PC after setting inCommit flag +select gp_inject_fault('before_xlog_xact_commit_prepared', 'reset', 3); + gp_inject_fault +----------------- + Success: +(1 row) +2<: <... completed> +COMMIT +1U<: <... completed> +CHECKPOINT + +-- TEST 2: block checkpoint on master + +-- pause the CommitTransaction right before persistent table cleanup after +-- notifyCommittedDtxTransaction() +select gp_inject_fault_infinite('onephase_transaction_commit', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- trigger a 2PC, and it will block at commit; +2: checkpoint; +CHECKPOINT +2: begin; +BEGIN +2: drop table t_commit_transaction_block_checkpoint; +DROP +2&: commit; + +-- wait for the fault to trigger since following checkpoint could be faster +select gp_wait_until_triggered_fault('onephase_transaction_commit', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- do checkpoint on master in utility mode, and it should block +-1U&: checkpoint; + +-- resume the 2PC +select gp_inject_fault('onephase_transaction_commit', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +2<: <... completed> +COMMIT +-1U<: <... completed> +CHECKPOINT diff --git a/src/test/singlenode_isolation2/expected/concurrent_drop_truncate_tablespace.out b/src/test/singlenode_isolation2/expected/concurrent_drop_truncate_tablespace.out new file mode 100644 index 00000000000..3d870054f41 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/concurrent_drop_truncate_tablespace.out @@ -0,0 +1,66 @@ +-- While a tablespace is being dropped, if any table is created +-- in the same tablespace, the data of that table should not be deleted + +-- create a tablespace directory +!\retcode rm -rf /tmp/concurrent_tblspace; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode mkdir -p /tmp/concurrent_tblspace; +-- start_ignore + +-- end_ignore +(exited with code 0) + +CREATE TABLESPACE concurrent_tblspace LOCATION '/tmp/concurrent_tblspace'; +CREATE + +-- 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: + Success: + Success: +(3 rows) +1&:DROP TABLESPACE concurrent_tblspace; + +-- wait for the fault to be triggered +SELECT gp_wait_until_triggered_fault('AfterTablespaceCreateLockRelease', 1, dbid) from gp_segment_configuration where content <> -1 and role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: + Success: + Success: +(3 rows) + +-- create a table in the same tablespace which is being dropped via a concurrent session +CREATE TABLE drop_tablespace_tbl(a int, b int) TABLESPACE concurrent_tblspace DISTRIBUTED BY (a); +CREATE +INSERT INTO drop_tablespace_tbl SELECT i, i FROM generate_series(1,100)i; +INSERT 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: + Success: + Success: +(3 rows) +1<: <... completed> +DROP +-- 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 +SELECT count(*) FROM drop_tablespace_tbl; + count +------- + 100 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/concurrent_index_creation_should_not_deadlock.out b/src/test/singlenode_isolation2/expected/concurrent_index_creation_should_not_deadlock.out new file mode 100644 index 00000000000..ff042b6fd92 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/concurrent_index_creation_should_not_deadlock.out @@ -0,0 +1,31 @@ +-- Create an append only table, popluated with data +CREATE TABLE index_deadlocking_test_table (value int) WITH (appendonly=true); +CREATE + +-- Setup a fault to ensure that the first session pauses while creating an index, +-- ensuring a concurrent index creation. +SELECT gp_inject_fault('before_acquire_lock_during_create_ao_blkdir_table', 'suspend', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Attempt to concurrently create an index +1>: CREATE INDEX index_deadlocking_test_table_idx1 ON index_deadlocking_test_table (value); +SELECT gp_wait_until_triggered_fault('before_acquire_lock_during_create_ao_blkdir_table', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +2>: CREATE INDEX index_deadlocking_test_table_idx2 ON index_deadlocking_test_table (value); +SELECT gp_inject_fault('before_acquire_lock_during_create_ao_blkdir_table', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Both index creation attempts should succeed +1<: <... completed> +CREATE +2<: <... completed> +CREATE diff --git a/src/test/singlenode_isolation2/expected/crash_recovery.out b/src/test/singlenode_isolation2/expected/crash_recovery.out new file mode 100644 index 00000000000..a5078dd4657 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/crash_recovery.out @@ -0,0 +1,127 @@ +1:CREATE TABLE crash_test_table(c1 int); +CREATE + +1: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 +(8 rows) +-- transaction of session 2 and session 3 inserted 'COMMIT' record before checkpoint +1:select gp_inject_fault_infinite('dtm_broadcast_commit_prepared', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2&:insert into crash_test_table values (1), (11), (111), (1111); +3&:create table crash_test_ddl(c1 int); + +-- wait session 2 and session 3 hit inject point +1:select gp_wait_until_triggered_fault('dtm_broadcast_commit_prepared', 2, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +1:CHECKPOINT; +CHECKPOINT + +-- transaction of session 4 inserted 'COMMIT' record after checkpoint +4&:insert into crash_test_table values (2), (22), (222), (2222); + +-- wait session 4 hit inject point +1:select gp_wait_until_triggered_fault('dtm_broadcast_commit_prepared', 3, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- transaction of session 5 didn't insert 'COMMIT' record +1:select gp_inject_fault_infinite('transaction_abort_after_distributed_prepared', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +5&:INSERT INTO crash_test_table VALUES (3), (33), (333), (3333); + +-- wait session 5 hit inject point +1:select gp_wait_until_triggered_fault('transaction_abort_after_distributed_prepared', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- check injector status +1:select gp_inject_fault('dtm_broadcast_commit_prepared', 'status', 1); + gp_inject_fault +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'dtm_broadcast_commit_prepared' fault type:'suspend' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'3' + +(1 row) +1:select gp_inject_fault('transaction_abort_after_distributed_prepared', 'status', 1); + gp_inject_fault +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'transaction_abort_after_distributed_prepared' fault type:'suspend' 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) + +-- trigger crash on QD +1:select gp_inject_fault('exec_simple_query_start', 'panic', current_setting('gp_dbid')::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +-- verify master panic happens. The PANIC message does not emit sometimes so +-- mask it. +-- start_matchsubs +-- m/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n/ +-- s/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n// +-- end_matchsubs +1:select 1; +PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +2<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +3<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +4<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +5<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- transaction of session 2, session 3 and session 4 will be committed during recovery. +-- SELECT from a heap table, result order is uncertain. +-- Strangely, the test framework does not sort this output. +-- So to make things correct, we add `order by` here. +6:select * from crash_test_table order by 1; + c1 +------ + 1 + 2 + 11 + 22 + 111 + 222 + 1111 + 2222 +(8 rows) +6:select * from crash_test_ddl order by 1; + c1 +---- +(0 rows) diff --git a/src/test/singlenode_isolation2/expected/crash_recovery_dtm.out b/src/test/singlenode_isolation2/expected/crash_recovery_dtm.out new file mode 100644 index 00000000000..ae1faf9690a --- /dev/null +++ b/src/test/singlenode_isolation2/expected/crash_recovery_dtm.out @@ -0,0 +1,493 @@ +-- Test scenarios covering crash recovery for some specific DTM point. +-- +-- start_matchsubs +-- +-- # create a match/subs expression +-- +-- s/\s+\(.*\.[ch]:\d+\)/ (SOMEFILE:SOMEFUNC)/ +-- m/(PANIC):.*unable to complete*/ +-- +-- m/^ERROR: Error on receive from seg0.*: server closed the connection unexpectedly/ +-- s/^ERROR: Error on receive from seg0.*: server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/ +-- +-- end_matchsubs + +-- 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 +select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +1: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 +(8 rows) +-- Scenario 1: Test to fail broadcasting of COMMIT PREPARED to one +-- segment and hence trigger PANIC in master while after completing +-- phase 2 of 2PC. Master's recovery cycle should correctly broadcast +-- COMMIT PREPARED again because master should find distributed commit +-- record in its xlog during recovery. Verify that the transaction is +-- committed after recovery. This scenario used to create cluster +-- inconsistency due to bug fixed now, as transaction used to get +-- committed on all segments except one where COMMIT PREPARED +-- broadcast failed before recovery. Master used to miss sending the +-- COMMIT PREPARED across restart and instead abort the transaction +-- after querying in-doubt prepared transactions from segments. +-- Inject fault to fail the COMMIT PREPARED on one segment. +-- Temporarily disable retry finish prepared in this session, because +-- we are not interested in testing the retry logic. This makes it +-- suffice to trigger the fault only once. Otherwise, the fault may +-- continue to trigger even after PANIC on coordinator, impacting +-- finish prepared operation during crash recovery. +1: SET dtx_phase2_retry_second = 0; +SET +1: SELECT gp_inject_fault('finish_prepared_start_of_function', 'error', dbid) from gp_segment_configuration where content=0 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +-- Start looping in background, till master panics and closes the session +3&: SELECT wait_till_master_shutsdown(); +-- Start transaction which should hit PANIC as COMMIT PREPARED will fail to one segment +1: CREATE TABLE commit_phase1_panic(a int, b int); +PANIC: unable to complete 'Commit Prepared' broadcast (cdbtm.c:604) +DETAIL: gid=1630210, state=Retry Commit Prepared +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- Reset the fault in utility mode because normal mode connection will +-- not be accepted until DTX recovery is finished. +-1U: SELECT gp_inject_fault('finish_prepared_start_of_function', 'reset', dbid) from gp_segment_configuration where content=0 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +-1Uq: ... +-- Join back to know master has completed postmaster reset. +3<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- Start a session on master which would complete the DTM recovery and hence COMMIT PREPARED +4: SELECT * from commit_phase1_panic; + a | b +---+--- +(0 rows) +4: INSERT INTO commit_phase1_panic select i,i from generate_series(1, 10)i; +INSERT 10 +4: SELECT count(*) from commit_phase1_panic; + count +------- + 10 +(1 row) + +-- Scenario 2: Inject FATAL on master after recording commit but +-- before broadcasting COMMIT_PREPARED to segments. FATAL must convert +-- to PANIC and make sure to complete the 2PC processing and not leave +-- dangling prepared transaction. There used to bug as a result the +-- master backend process would just die, leaving dangling prepared +-- transaction on segment but commited on master. + +-- Start looping in background, till master panics and closes the +-- session +5&: SELECT wait_till_master_shutsdown(); +6: SELECT gp_inject_fault('dtm_broadcast_commit_prepared', 'fatal', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +6: CREATE TABLE commit_fatal_fault_test_table(a int, b int); +PANIC: fault triggered, fault name:'dtm_broadcast_commit_prepared' fault type:'fatal' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +5<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- Start a session on master which would complete the DTM recovery and hence COMMIT PREPARED +7: SELECT count(*) from commit_fatal_fault_test_table; + count +------- + 0 +(1 row) +7: SELECT * FROM gp_dist_random('pg_prepared_xacts'); + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) +7: SELECT gp_inject_fault('dtm_broadcast_commit_prepared', 'reset', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Scenario 3: Inject ERROR after prepare phase has completed to +-- trigger abort. Then on abort inject FATAL on master before sending +-- ABORT_PREPARED. FATAL must convert to PANIC and make sure to +-- complete the 2PC processing and not leave dangling prepared +-- transaction. There used to bug as a result the master backend +-- process would just die, leaving dangling prepared transaction on +-- segment but aborted on master. + +-- Start looping in background, till master panics and closes the +-- session +8&: SELECT wait_till_master_shutsdown(); +9: SELECT gp_inject_fault('transaction_abort_after_distributed_prepared', 'error', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +9: SELECT gp_inject_fault('dtm_broadcast_abort_prepared', 'fatal', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +9: CREATE TABLE abort_fatal_fault_test_table(a int, b int); +ERROR: fault triggered, fault name:'transaction_abort_after_distributed_prepared' fault type:'error' +PANIC: fault triggered, fault name:'dtm_broadcast_abort_prepared' fault type:'fatal' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +8<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +10: SELECT count(*) from abort_fatal_fault_test_table; +ERROR: relation "abort_fatal_fault_test_table" does not exist +LINE 1: SELECT count(*) from abort_fatal_fault_test_table; + ^ +10: SELECT * FROM gp_dist_random('pg_prepared_xacts'); + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) +10: SELECT gp_inject_fault('transaction_abort_after_distributed_prepared', 'reset', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +10: SELECT gp_inject_fault('dtm_broadcast_abort_prepared', 'reset', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Scenario 4: QE panics after writing prepare xlog record. This +-- 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 +11: INSERT INTO QE_panic_test_table SELECT * from generate_series(0, 9); +INSERT 10 +-- To help speedy recovery +11: CHECKPOINT; +CHECKPOINT +-- Increase 2PC retry timeout to avoid any failures. Alter +-- 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 +11: select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) +-- skip FTS probes always +11: SELECT gp_inject_fault_infinite('fts_probe', 'skip', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +11: SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +11: SELECT gp_inject_fault('end_prepare_two_phase', 'infinite_loop', dbid) from gp_segment_configuration where role='p' and content=0; + gp_inject_fault +----------------- + Success: +(1 row) +-- statement to trigger fault after writing prepare record +12&: DELETE FROM QE_panic_test_table; +11: SELECT gp_wait_until_triggered_fault('end_prepare_two_phase', 1, dbid) from gp_segment_configuration where role='p' and content=0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +11: SELECT pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' and content = 0; + pg_ctl +-------- + OK +(1 row) +12<: <... completed> +ERROR: Error on receive from seg0 127.0.0.1:7002 pid=25361: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +13: SELECT count(*) from QE_panic_test_table; + count +------- + 10 +(1 row) +13: SELECT * FROM gp_dist_random('pg_prepared_xacts'); + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) +13: SELECT gp_inject_fault('fts_probe', 'reset', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +13: alter system reset dtx_phase2_retry_second; +ALTER +13: select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +-- 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: 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 +-------------------------- + Success: +(1 row) +15: SELECT gp_inject_fault_infinite('after_xlog_xact_prepare_flushed', 'skip', dbid) from gp_segment_configuration where role = 'p' and content = 1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +16&: INSERT INTO master_reset SELECT a from generate_series(1, 10) a; +15: SELECT gp_wait_until_triggered_fault('before_xlog_xact_prepare', 1, dbid) from gp_segment_configuration where role = 'p' and content = 1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- set gucs to speed up testing +15: ALTER SYSTEM SET gp_dtx_recovery_prepared_period to 0; +ALTER +15: ALTER SYSTEM SET gp_dtx_recovery_interval to 5; +ALTER +15: SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +-- trigger master panic and wait until master down before running any new query. +17&: SELECT wait_till_master_shutsdown(); +18: SELECT gp_inject_fault('exec_simple_query_start', 'panic', current_setting('gp_dbid')::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +18: SELECT 1; +PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +16<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +17<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- wait until master is up for querying. +19: SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- master suspends before running periodical checking of orphaned prepared transactions. +19: SELECT gp_inject_fault_infinite('before_orphaned_check', 'suspend', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +19: SELECT gp_wait_until_triggered_fault('before_orphaned_check', 1, dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- let prepare finish else dtx recovery can not abort the prepared transaction. +19: SELECT gp_inject_fault_infinite('before_xlog_xact_prepare', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = 1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +19: SELECT gp_wait_until_triggered_fault('after_xlog_xact_prepare_flushed', 1, dbid) from gp_segment_configuration where role = 'p' and content = 1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +19: SELECT gp_inject_fault_infinite('after_xlog_xact_prepare_flushed', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = 1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- should exist an orphaned prepared transaction. +1U: SELECT count(*) from pg_prepared_xacts; + count +------- + 1 +(1 row) + +-- if there is orphaned prepared transaction, drop would hang since +-- the orphaned prepared transaction holds lock of the table that conflicts +-- with required lock of the drop operation. +19: SELECT gp_inject_fault_infinite('before_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: ALTER SYSTEM RESET gp_dtx_recovery_interval; +ALTER +19: ALTER SYSTEM RESET gp_dtx_recovery_prepared_period; +ALTER +19: SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +-- ensure the orphaned prepared transaction is gone. +1U: SELECT * from pg_prepared_xacts; + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) + +-- Scenario 6: retry Abort Prepared on QD fails but won't cause panic. The dtx +-- recovery process finally aborts it. + +-- speed up testing by setting some gucs. +20: ALTER SYSTEM SET gp_dtx_recovery_prepared_period to 0; +ALTER +20: ALTER SYSTEM SET gp_dtx_recovery_interval to 5; +ALTER +20: ALTER SYSTEM SET dtx_phase2_retry_second to 5; +ALTER +20: SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +20: CREATE TABLE test_retry_abort(a int); +CREATE + +-- master: set fault to trigger abort prepare +-- primary 0: set fault so that retry prepared abort fails. +20: SELECT gp_inject_fault('dtm_broadcast_prepare', 'error', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +20: SELECT gp_inject_fault_infinite('finish_prepared_start_of_function', 'error', dbid) from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- run two phase query. +21: INSERT INTO test_retry_abort SELECT generate_series(1,10); +ERROR: fault triggered, fault name:'dtm_broadcast_prepare' fault type:'error' + +-- verify the transaction was aborted and there is one orphaned prepared +-- transaction on seg0. +20: SELECT * from test_retry_abort; + a +--- +(0 rows) +0U: SELECT count(*) from pg_prepared_xacts; + count +------- + 1 +(1 row) + +-- dtx recovery ready to handle the orphaned prepared transaction. +20: SELECT gp_inject_fault_infinite('before_orphaned_check', 'suspend', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +20: SELECT gp_wait_until_triggered_fault('before_orphaned_check', 1, dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +20: SELECT gp_inject_fault_infinite('after_orphaned_check', 'skip', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- kick off abort prepared on seg0 and then dtx recovery will abort that one. +20: SELECT gp_inject_fault_infinite('finish_prepared_start_of_function', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +20: SELECT gp_inject_fault_infinite('before_orphaned_check', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- verify there is no orphaned prepared transaction on seg0. +20: 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) +0U: SELECT * from pg_prepared_xacts; + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) + +-- cleanup +20: ALTER SYSTEM RESET gp_dtx_recovery_interval; +ALTER +20: ALTER SYSTEM RESET gp_dtx_recovery_prepared_period; +ALTER +20: ALTER SYSTEM RESET dtx_phase2_retry_second; +ALTER +20: SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) +20: SELECT gp_inject_fault('dtm_broadcast_prepare', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +20: 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) +20: DROP TABLE test_retry_abort; +DROP diff --git a/src/test/singlenode_isolation2/expected/crash_recovery_redundant_dtx.out b/src/test/singlenode_isolation2/expected/crash_recovery_redundant_dtx.out new file mode 100644 index 00000000000..3db508d527f --- /dev/null +++ b/src/test/singlenode_isolation2/expected/crash_recovery_redundant_dtx.out @@ -0,0 +1,84 @@ +1:CREATE TABLE crash_test_redundant(c1 int); +CREATE + +1: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 +(8 rows) +-- transaction of session 2 suspend after inserted 'COMMIT' record +1:select gp_inject_fault_infinite('dtm_broadcast_commit_prepared', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- checkpoint suspend before scanning proc array +1:select gp_inject_fault_infinite('checkpoint_dtx_info', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1&:CHECKPOINT; + +-- wait till checkpoint reaches intended point +2:select gp_wait_until_triggered_fault('checkpoint_dtx_info', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- the 'COMMIT' record is logically after REDO pointer +2&:insert into crash_test_redundant values (1), (2), (3); + +-- resume checkpoint +3:select gp_inject_fault('checkpoint_dtx_info', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +1<: <... completed> +CHECKPOINT + +-- wait till insert reaches intended point +1:select gp_wait_until_triggered_fault('dtm_broadcast_commit_prepared', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- trigger crash on QD +1:select gp_inject_fault('exec_simple_query_start', 'panic', current_setting('gp_dbid')::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +-- verify master panic happens. The PANIC message does not emit sometimes so +-- mask it. +-- start_matchsubs +-- m/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n/ +-- s/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n// +-- end_matchsubs +1:select 1; +PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +2<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- transaction of session 2 should be recovered properly +4:select * from crash_test_redundant; + c1 +---- + 1 + 2 + 3 +(3 rows) diff --git a/src/test/singlenode_isolation2/expected/create_memory_accounting_tables.out b/src/test/singlenode_isolation2/expected/create_memory_accounting_tables.out new file mode 100644 index 00000000000..f311164b13b --- /dev/null +++ b/src/test/singlenode_isolation2/expected/create_memory_accounting_tables.out @@ -0,0 +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 nation ( n_nationkey INTEGER, n_name CHAR(25), n_regionkey INTEGER, n_comment VARCHAR(152) ); +CREATE + +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 region ( r_regionkey INTEGER, r_name CHAR(25), r_comment VARCHAR(152) ); +CREATE + +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 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 partsupp ( ps_partkey INTEGER, ps_suppkey INTEGER, ps_availqty INTEGER, ps_supplycost DECIMAL(15, 2), ps_comment VARCHAR(199) ) ; +CREATE + +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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 INTO supplier VALUES (2,'Supplier#000000002','89eJ5ksX3ImxJQBvxObC,',5,'15-679-861-2259',4032.68,'slyly bold instructions. idle dependen'); +INSERT 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 INTO supplier VALUES (4,'Supplier#000000004','Bk7ah4CK8SYQTepEmvMkkgMwg',15,'25-843-787-7479',4641.08,'riously even requests above the exp'); +INSERT 1 +INSERT INTO supplier VALUES (5,'Supplier#000000005','Gcdm2rJRzl5qlTVzc',11,'21-151-690-3663',-283.84,'. slyly regular pinto bea'); +INSERT 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 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 INTO supplier VALUES (8,'Supplier#000000008','9Sq4bBH2FQEmaFOocY45sRTxo6yuoG',17,'27-498-742-3860',7627.85,'al pinto beans. asymptotes haggl'); +INSERT 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 INTO supplier VALUES (10,'Supplier#000000010','Saygah3gYWMp72i PY',24,'34-852-489-8585',3891.91,'ing waters. regular requests ar'); +INSERT 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 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 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 INTO supplier VALUES (14,'Supplier#000000014','EXsnO5pTNj4iZRm',15,'25-656-247-5058',9189.82,'l accounts boost. fluffily bold warhorses wake'); +INSERT 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 INTO supplier VALUES (16,'Supplier#000000016','YjP5C55zHDXL7LalK27zfQnwejdpin4AMpvh',22,'32-822-502-4215',2972.26,'ously express ideas haggle quickly dugouts? fu'); +INSERT 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 INTO supplier VALUES (18,'Supplier#000000018','PGGVE5PWAMwKDZw',16,'26-729-551-1115',7040.82,'accounts snooze slyly furiously bold'); +INSERT 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 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 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 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 INTO orders VALUES (1,370,'O',172799.49,'1996-01-02','5-LOW','Clerk#000000951',0,'nstructions sleep furiously among'); +INSERT 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 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 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 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 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 INTO orders VALUES (7,392,'O',271885.66,'1996-01-10','2-HIGH','Clerk#000000470',0,'ly special requests'); +INSERT 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 INTO orders VALUES (33,670,'F',146567.24,'1993-10-27','3-MEDIUM','Clerk#000000409',0,'uriously. furiously final request'); +INSERT 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 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 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 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 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 INTO orders VALUES (39,818,'O',326565.37,'1996-09-20','3-MEDIUM','Clerk#000000659',0,'ole express, ironic requests: ir'); +INSERT 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 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 INTO orders VALUES (66,1292,'F',104190.66,'1994-01-20','5-LOW','Clerk#000000743',0,'y pending requests integrate'); +INSERT 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 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 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 INTO orders VALUES (70,644,'F',125705.32,'1993-12-18','5-LOW','Clerk#000000322',0,'carefully ironic request'); +INSERT 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 INTO orders VALUES (96,1078,'F',64364.30,'1994-04-17','2-HIGH','Clerk#000000395',0,'oost furiously. pinto'); +INSERT 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 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 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 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 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 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 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 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 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 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 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 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 INTO orders VALUES (133,440,'O',95971.06,'1997-11-29','1-URGENT','Clerk#000000738',0,'usly final asymptotes'); +INSERT 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 INTO customer VALUES (14,'Customer#000000014','KXkletMlL2JQEA',1,'11-845-129-3851',5266.30,'FURNITURE',', ironic packages across the unus'); +INSERT 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 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 INTO customer VALUES (17,'Customer#000000017','izrh 6jdqtp2eqdtbkswDD8SG4SzXruMfIXyR7',2,'12-970-682-3487',6.34,'AUTOMOBILE','packages wake! blithely even pint'); +INSERT 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 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 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 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 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 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 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 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 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 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 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 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 INTO customer VALUES (30,'Customer#000000030','nJDsELGAavU63Jl0c5NKsKfL8rIJQQkQnYL2QJY',1,'11-764-165-5076',9321.01,'BUILDING','lithely final requests. furiously unusual account'); +INSERT 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 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 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 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 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 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 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 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 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 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 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 INTO nation VALUES (0,'ALGERIA',0,'haggle. carefully final deposits detect slyly agai'); +INSERT 1 +INSERT INTO nation VALUES (1,'ARGENTINA',1,'al foxes promise slyly according to the regular accounts. bold requests alon'); +INSERT 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 INTO nation VALUES (3,'CANADA',1,'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold'); +INSERT 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 INTO nation VALUES (5,'ETHIOPIA',0,'ven packages wake quickly. regu'); +INSERT 1 +INSERT INTO nation VALUES (6,'FRANCE',3,'refully final requests. regular, ironi'); +INSERT 1 +INSERT INTO nation VALUES (7,'GERMANY',3,'l platelets. regular accounts x-ray: unusual, regular acco'); +INSERT 1 +INSERT INTO nation VALUES (8,'INDIA',2,'ss excuses cajole slyly across the packages. deposits print aroun'); +INSERT 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 INTO nation VALUES (10,'IRAN',4,'efully alongside of the slyly final dependencies.'); +INSERT 1 +INSERT INTO nation VALUES (11,'IRAQ',4,'nic deposits boost atop the quickly final requests? quickly regula'); +INSERT 1 +INSERT INTO nation VALUES (12,'JAPAN',2,'ously. final, express gifts cajole a'); +INSERT 1 +INSERT INTO nation VALUES (13,'JORDAN',4,'ic deposits are blithely about the carefully regular pa'); +INSERT 1 +INSERT INTO nation VALUES (14,'KENYA',0,'pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t'); +INSERT 1 +INSERT INTO nation VALUES (15,'MOROCCO',0,'rns. blithely bold courts among the closely regular packages use furiously bold platelets?'); +INSERT 1 +INSERT INTO nation VALUES (16,'MOZAMBIQUE',0,'s. ironic, unusual asymptotes wake blithely r'); +INSERT 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 INTO nation VALUES (18,'CHINA',2,'c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos'); +INSERT 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 INTO nation VALUES (20,'SAUDI ARABIA',4,'ts. silent requests haggle. closely express packages sleep across the blithely'); +INSERT 1 +INSERT INTO nation VALUES (21,'VIETNAM',2,'hely enticingly express accounts. even, final'); +INSERT 1 +INSERT INTO nation VALUES (22,'RUSSIA',3,'requests against the platelets use never according to the quickly regular pint'); +INSERT 1 +INSERT INTO nation VALUES (23,'UNITED KINGDOM',3,'eans boost carefully special requests. accounts are. carefull'); +INSERT 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 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 INTO partsupp VALUES (1,27,8076,993.49,'ven ideas. quickly even packages print. pending multipliers must have to are fluff'); +INSERT 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 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 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 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 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 INTO partsupp VALUES (2,78,3025,306.39,'olites. deposits wake carefully. even, express requests cajole. carefully regular ex'); +INSERT 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 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 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 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 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 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 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 INTO partsupp VALUES (4,80,2480,444.37,'requests sleep quickly regular accounts. theodolites detect. carefully final depths w'); +INSERT 1 +INSERT INTO partsupp VALUES (5,6,3735,255.88,'arefully even requests. ironic requests cajole carefully even dolphin'); +INSERT 1 +INSERT INTO partsupp VALUES (5,31,9653,50.52,'y stealthy deposits. furiously final pinto beans wake furiou'); +INSERT 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 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 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 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 INTO partsupp VALUES (6,57,3336,642.13,'final instructions. courts wake packages. blithely unusual realms along the multipliers nag'); +INSERT 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 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 INTO partsupp VALUES (7,33,2770,149.66,'hould have to nag after the blithely final asymptotes. fluffily spe'); +INSERT 1 diff --git a/src/test/singlenode_isolation2/expected/deadlock_under_entry_db_singleton.out b/src/test/singlenode_isolation2/expected/deadlock_under_entry_db_singleton.out new file mode 100644 index 00000000000..d097b84db6e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/deadlock_under_entry_db_singleton.out @@ -0,0 +1,98 @@ +-- Test to validate that ENTRY_DB_SINGLETON reader does not cause a +-- deadlock. +-- +-- The deadlock used to happen when ENTRY_DB_SINGLETON enters +-- LockAcquire with its writer already holding the lock. And the +-- requested lockmode conflicts with another session's requested +-- lockmode who is waiting on the same lock. The waitMask check in +-- LockAcquire would put the ENTRY_DB_SINGLETON into wait queue. If +-- the ENTRY_DB_SINGLETON is supposed to produce some tuples that need +-- to be consumed by other nodes in the plan, either QEs or the writer +-- QD may wait for ENTRY_DB_SINGLETON and we will have a wait cycle, +-- causing deadlock. +-- +-- This test creates one such scenario using a volatile function. It +-- is critical that the function be volatile, otherwise, +-- ENTRY_DB_SIGNLETON reader is not spawned to execute the query. +-- +-- This thread on gpdb-dev has more details: +-- https://groups.google.com/a/greenplum.org/d/msg/gpdb-dev/OS1-ODIK0P4/ZIzayBbMBwAJ +-- Since global deadlock detector has been added into gpdb, UPDATE on heap +-- table does not acquire an Exclusive Relation Lock on QD. Therefore, we change +-- the table to ao table here. + +CREATE TABLE deadlock_entry_db_singleton_table (c int, d int) WITH (appendonly=true); +CREATE +INSERT INTO deadlock_entry_db_singleton_table select i, i+1 from generate_series(1,10) i; +INSERT 10 + +-- Function that needs ExclusiveLock on a table. Use a non-SQL +-- language for this function so that parser cannot understand its +-- definition. That way, ExclusiveLock is requested during execution +-- 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 + +-- inject fault on QD +select gp_inject_fault('transaction_start_under_entry_db_singleton', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +select gp_inject_fault_infinite('transaction_start_under_entry_db_singleton', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2&: select gp_wait_until_triggered_fault('transaction_start_under_entry_db_singleton', 1, 1); + +-- The QD should already hold RowExclusiveLock and ExclusiveLock on +-- deadlock_entry_db_singleton_table and the QE ENTRY_DB_SINGLETON +-- will stop at in StartTransaction due to suspend fault. +1&:UPDATE deadlock_entry_db_singleton_table set d = d + 1 FROM (select 1 from deadlock_entry_db_singleton_table, function_volatile(5)) t; + +-- verify the fault hit +2<: <... completed> + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- This session will wait for ExclusiveLock on +-- deadlock_entry_db_singleton_table. +2&: update deadlock_entry_db_singleton_table set d = d + 1; + +-- The ENTRY_DB_SINGLETON will acquire exclusive lock on +-- deadlock_entry_db_singleton_table. The lockmode conflicts with the +-- lock's waitMask due to session2 already waiting for the same lock. +-- In spite of the waitMask conflict the lock should be granted to +-- ENTRY_DB_SINGLETON reader because its writer already holds the +-- lock. Otherwise, we may have a deadlock. +select gp_inject_fault('transaction_start_under_entry_db_singleton', 'resume', 1); + gp_inject_fault +----------------- + Success: +(1 row) +select gp_inject_fault('transaction_start_under_entry_db_singleton', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- verify the deadlock across multiple pids with same mpp session id +with lock_on_deadlock_entry_db_singleton_table as (select * from pg_locks where relation = 'deadlock_entry_db_singleton_table'::regclass and gp_segment_id = -1) select count(*) as FoundDeadlockProcess from lock_on_deadlock_entry_db_singleton_table where granted = false and mppsessionid in ( select mppsessionid from lock_on_deadlock_entry_db_singleton_table where granted = true ); + founddeadlockprocess +---------------------- + 0 +(1 row) + +-- join the session1 and session2 +-- we expect to see an ERROR message here due to function_volatile function +-- tried to update table from ENTRY_DB_SINGLETON (which is read-only) in session1 +1<: <... completed> +ERROR: function cannot execute on a QE slice because it issues a non-SELECT statement (entry db 127.0.0.1:15432 pid=94879) +CONTEXT: SQL statement "UPDATE deadlock_entry_db_singleton_table SET d = d + 1 WHERE c = $1" +PL/pgSQL function function_volatile(integer) line 3 at SQL statement +2<: <... completed> +UPDATE 10 diff --git a/src/test/singlenode_isolation2/expected/disable_autovacuum.out b/src/test/singlenode_isolation2/expected/disable_autovacuum.out new file mode 100644 index 00000000000..a3af2dee1a1 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/disable_autovacuum.out @@ -0,0 +1,7 @@ +alter system set autovacuum = off; +ALTER +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 +---------------+---------------- + -1 | t +(1 row) diff --git a/src/test/singlenode_isolation2/expected/dispatcher_fts_error.out b/src/test/singlenode_isolation2/expected/dispatcher_fts_error.out new file mode 100644 index 00000000000..700fc83925c --- /dev/null +++ b/src/test/singlenode_isolation2/expected/dispatcher_fts_error.out @@ -0,0 +1,348 @@ +-- Tests FTS can handle DNS error. +-- start_matchsubs +-- m/^ERROR: Error on receive from .*: server closed the connection unexpectedly/ +-- s/^ERROR: Error on receive from .*: server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/ +-- end_matchsubs + +-- to make test deterministic and fast +!\retcode gpconfig -c gp_fts_probe_retries -v 2 --masteronly; +-- start_ignore +20180920:05:00:20:030048 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-c gp_fts_probe_retries -v 2 --masteronly' + +-- end_ignore +(exited with code 0) + +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 30 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 127 --skipvalidation --masteronly; +-- start_ignore +20180920:05:00:21:030140 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-c gp_gang_creation_retry_count -v 127 --skipvalidation --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 250 --skipvalidation --masteronly; +-- start_ignore +20180920:05:00:21:030228 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-c gp_gang_creation_retry_timer -v 250 --skipvalidation --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +20180920:05:00:22:030314 gpstop:gpdbvm:gpadmin-[INFO]:-Starting gpstop with args: -u +20180920:05:00:22:030314 gpstop:gpdbvm:gpadmin-[INFO]:-Gathering information and validating the environment... +20180920:05:00:22:030314 gpstop:gpdbvm:gpadmin-[INFO]:-Obtaining Cloudberry Master catalog information +20180920:05:00:22:030314 gpstop:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180920:05:00:22:030314 gpstop:gpdbvm:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.9598.gc5dfd9c build dev-oss' +20180920:05:00:22:030314 gpstop:gpdbvm:gpadmin-[INFO]:-Signalling all postmaster processes to reload +. + +-- end_ignore +(exited with code 0) + +-- start_ignore +create language plpython3u; +CREATE +-- end_ignore + +create or replace function pg_ctl(datadir text, command text) returns text as $$ import subprocess +cmd = 'pg_ctl -D %s ' % datadir if command in ('stop'): cmd = cmd + '-w -m immediate %s' % command else: return 'Invalid command input' +return subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).replace('.', '') $$ language plpython3u; +CREATE + +-- no segment down. +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +1:BEGIN; +BEGIN +1:END; +END +2:BEGIN; +BEGIN +3:BEGIN; +BEGIN +3:CREATE TEMP TABLE tmp3 (c1 int, c2 int); +CREATE +3:DECLARE c1 CURSOR for select * from tmp3; +DECLARE +4:CREATE TEMP TABLE tmp4 (c1 int, c2 int); +CREATE +5:BEGIN; +BEGIN +5:CREATE TEMP TABLE tmp5 (c1 int, c2 int); +CREATE +5:SAVEPOINT s1; +SAVEPOINT +5:CREATE TEMP TABLE tmp51 (c1 int, c2 int); +CREATE + +-- 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 +-- process. As if that happens, due to race condition will not trigger +-- the fault and fail the test. +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +-- stop a primary in order to trigger a mirror promotion +select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=0), 'stop'); + pg_ctl +------------------------------------------------------ + waiting for server to shut down done + server stopped + +(1 row) + +-- trigger failover +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +-- verify a segment is down +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 1 +(1 row) +-- session 1: in no transaction and no temp table created, it's safe to +-- update cdb_component_dbs and use the new promoted primary +1:BEGIN; +BEGIN +1:END; +END +-- session 2: in transaction, gxid is dispatched to writer gang, cann't +-- update cdb_component_dbs, following query should fail +2:END; +ERROR: Error on receive from seg0 127.0.0.1:25432 pid=30365: server closed the connection unexpectedly +DETAIL: + This probably means the server terminated abnormally + before or while processing the request. +-- session 3: in transaction and has a cursor, cann't update +-- cdb_component_dbs, following query should fail +3:FETCH ALL FROM c1; + c1 | c2 +----+---- +(0 rows) +3:END; +ERROR: Error on receive from seg0 127.0.0.1:25432 pid=30374: server closed the connection unexpectedly +DETAIL: + This probably means the server terminated abnormally + before or while processing the request. +-- session 4: not in transaction but has temp table, cann't update +-- cdb_component_dbs, following query should fail and session +-- is reset +4:select * from tmp4; +ERROR: Error on receive from seg0 slice1 127.0.0.1:25432 pid=30391: server closed the connection unexpectedly +DETAIL: + This probably means the server terminated abnormally + before or while processing the request. +4:select * from tmp4; +ERROR: relation "tmp4" does not exist +LINE 1: select * from tmp4; + ^ +-- session 5: has a subtransaction, cann't update cdb_component_dbs, +-- following query should fail +5:select * from tmp51; +ERROR: Error on receive from seg0 slice1 127.0.0.1:25432 pid=30399: server closed the connection unexpectedly +DETAIL: + This probably means the server terminated abnormally + before or while processing the request. +5:ROLLBACK TO SAVEPOINT s1; +ERROR: Could not rollback to savepoint (ROLLBACK TO SAVEPOINT s1) +5:END; +END +1q: ... +2q: ... +3q: ... +4q: ... +5q: ... + +-- fully recover the failed primary as new mirror +!\retcode gprecoverseg -aF; +-- start_ignore +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting gprecoverseg with args: -aF +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.9598.gc5dfd9c build dev-oss' +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-master Cloudberry Version: 'PostgreSQL 9.2beta2 (Cloudberry Database 6.0.0-alpha.0+dev.9598.gc5dfd9c build dev-oss) on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit compiled on Sep 20 2018 03:50:32 (with assert checking)' +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Heap checksum setting is consistent between master and the segments that are candidates for recoverseg +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery type = Standard +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery 1 of 1 +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Synchronization mode = Full +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance host = gpdbvm +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance address = gpdbvm +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast1/demoDataDir0 +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance port = 25432 +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance host = gpdbvm +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance address = gpdbvm +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror1/demoDataDir0 +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance port = 25435 +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Target = in-place +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-1 segment(s) to recover +20180920:05:00:25:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Ensuring 1 failed segment(s) are stopped + +20180920:05:00:26:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Ensuring that shared memory is cleaned up for stopped segments +20180920:05:00:26:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Validating remote directories +. +20180920:05:00:27:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Configuring new segments +. +20180920:05:00:29:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Updating mirrors +. +20180920:05:00:30:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting mirrors +20180920:05:00:30:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-era is e0110b50959363aa_180920041106 +20180920:05:00:30:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait... +. +20180920:05:00:31:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Process results... +20180920:05:00:31:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Triggering FTS probe +20180920:05:00:31:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** +20180920:05:00:31:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Updating segments for streaming is completed. +20180920:05:00:31:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-For segments updated successfully, streaming will continue in the background. +20180920:05:00:31:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Use gpstate -s to check the streaming progress. +20180920:05:00:31:030437 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +do $$ begin /* in func */ for i in 1..120 loop /* in func */ if (select mode = 's' from gp_segment_configuration where content = 0 limit 1) then /* in func */ return; /* in func */ end if; /* in func */ perform gp_request_fts_probe_scan(); /* in func */ end loop; /* in func */ end; /* in func */ $$; +DO + +!\retcode gprecoverseg -ar; +-- start_ignore +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting gprecoverseg with args: -ar +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.9598.gc5dfd9c build dev-oss' +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-master Cloudberry Version: 'PostgreSQL 9.2beta2 (Cloudberry Database 6.0.0-alpha.0+dev.9598.gc5dfd9c build dev-oss) on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit compiled on Sep 20 2018 03:50:32 (with assert checking)' +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery type = Rebalance +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Unbalanced segment 1 of 2 +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance host = gpdbvm +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance address = gpdbvm +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror1/demoDataDir0 +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance port = 25435 +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Balanced role = Mirror +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Current role = Primary +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Unbalanced segment 2 of 2 +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance host = gpdbvm +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance address = gpdbvm +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast1/demoDataDir0 +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance port = 25432 +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Balanced role = Primary +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Current role = Mirror +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Getting unbalanced segments +20180920:05:00:31:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Stopping unbalanced primary segments... +. +20180920:05:00:32:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Triggering segment reconfiguration +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting segment synchronization +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-=============================START ANOTHER RECOVER========================================= +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.9598.gc5dfd9c build dev-oss' +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-master Cloudberry Version: 'PostgreSQL 9.2beta2 (Cloudberry Database 6.0.0-alpha.0+dev.9598.gc5dfd9c build dev-oss) on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit compiled on Sep 20 2018 03:50:32 (with assert checking)' +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Heap checksum setting is consistent between master and the segments that are candidates for recoverseg +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery type = Standard +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery 1 of 1 +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Synchronization mode = Full +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance host = gpdbvm +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance address = gpdbvm +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror1/demoDataDir0 +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance port = 25435 +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance host = gpdbvm +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance address = gpdbvm +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast1/demoDataDir0 +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance port = 25432 +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Target = in-place +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-1 segment(s) to recover +20180920:05:00:34:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Ensuring 1 failed segment(s) are stopped + +20180920:05:00:35:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Ensuring that shared memory is cleaned up for stopped segments +20180920:05:00:36:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Validating remote directories +. +20180920:05:00:37:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Configuring new segments +.. +20180920:05:00:39:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Updating mirrors +. +20180920:05:00:40:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting mirrors +20180920:05:00:40:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-era is e0110b50959363aa_180920041106 +20180920:05:00:40:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait... +. +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Process results... +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Triggering FTS probe +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Updating segments for streaming is completed. +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-For segments updated successfully, streaming will continue in the background. +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Use gpstate -s to check the streaming progress. +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-==============================END ANOTHER RECOVER========================================== +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-The rebalance operation has completed successfully. +20180920:05:00:41:030745 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +do $$ begin /* in func */ for i in 1..120 loop /* in func */ if (select mode = 's' from gp_segment_configuration where content = 0 limit 1) then /* in func */ return; /* in func */ end if; /* in func */ perform gp_request_fts_probe_scan(); /* in func */ end loop; /* in func */ end; /* in func */ $$; +DO + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +!\retcode gpconfig -r gp_fts_probe_retries --masteronly; +-- start_ignore +20180920:05:00:42:031183 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-r gp_fts_probe_retries --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +-- start_ignore +20180920:05:00:43:031272 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-r gp_gang_creation_retry_count --skipvalidation --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +-- start_ignore +20180920:05:00:43:031356 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-r gp_gang_creation_retry_timer --skipvalidation --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +20180920:05:00:43:031440 gpstop:gpdbvm:gpadmin-[INFO]:-Starting gpstop with args: -u +20180920:05:00:43:031440 gpstop:gpdbvm:gpadmin-[INFO]:-Gathering information and validating the environment... +20180920:05:00:43:031440 gpstop:gpdbvm:gpadmin-[INFO]:-Obtaining Cloudberry Master catalog information +20180920:05:00:43:031440 gpstop:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180920:05:00:43:031440 gpstop:gpdbvm:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.9598.gc5dfd9c build dev-oss' +20180920:05:00:43:031440 gpstop:gpdbvm:gpadmin-[INFO]:-Signalling all postmaster processes to reload +. + +-- end_ignore +(exited with code 0) + + diff --git a/src/test/singlenode_isolation2/expected/distributed_snapshot.out b/src/test/singlenode_isolation2/expected/distributed_snapshot.out new file mode 100644 index 00000000000..882d4ffd307 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/distributed_snapshot.out @@ -0,0 +1,531 @@ +-- Distributed snapshot tests + +-- Scenario1: Test to validate GetSnapshotData()'s computation of globalXmin using +-- distributed snapshot. It mainly uses a old read-only transaction to help +-- create situation where globalXmin can be lower than distributed oldestXmin +-- when calling DistributedLog_AdvanceOldestXmin(). + +-- Setup +CREATE TABLE distributed_snapshot_test1 (a int); +CREATE + +1: BEGIN; +BEGIN +1: INSERT INTO distributed_snapshot_test1 values(1); +INSERT 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; +BEGIN +2: SELECT * from distributed_snapshot_test1; + a +--- +(0 rows) +-- Complete transaction 1, so that it no more appears in in-progress transaction +-- list for following transactions. +1: COMMIT; +COMMIT + +-- Transaction to bump the latestCompletedXid +1: INSERT INTO distributed_snapshot_test1 values(1); +INSERT 1 + +-- Hold after walking over ProcArray in GetSnpashotData(), right at start of +-- DistributedLog_AdvanceOldestXmin() +1: SELECT gp_inject_fault('distributedlog_advance_oldest_xmin', 'suspend', '', 'postgres', '', 1, -1, 5, dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +3&:@db_name postgres: SELECT count(*) > 0 from gp_dist_random('gp_id'); +1: SELECT gp_wait_until_triggered_fault('distributedlog_advance_oldest_xmin', 1, dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +2: COMMIT; +COMMIT + +-- Transaction used to bump the distributed oldestXmin +1: INSERT INTO distributed_snapshot_test1 values(1); +INSERT 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 +----------------- + Success: +(1 row) +3<: <... completed> + ?column? +---------- + t +(1 row) + +-- Scenario2: This scenario tests the boundary condition for Xmax in distributed snapshot + +-- Setup +CREATE TABLE distributed_snapshot_test2 (a int); +CREATE + +-- 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 +-- here, take distributed snapshot +1: SELECT 123 AS "establish snapshot"; + establish snapshot +-------------------- + 123 +(1 row) +2: INSERT INTO distributed_snapshot_test2 VALUES(2); +INSERT 1 +-- expected to see just VALUES(1) +1: SELECT * FROM distributed_snapshot_test2; + a +--- + 1 +(1 row) +1: COMMIT; +COMMIT + +DROP TABLE distributed_snapshot_test2; +DROP + +-- Scenario3: Test the one-phase commit transactions don't break repeatable read isolation. +-- +-- Direct dispatch causes the select statements to be dispatched only to one of +-- the three demo cluster segments. A segment acquires local snapshot only when it +-- receives the dispatched statement. If one phase commit relied on local +-- snapshots only, wrong results are possible depending on the order of local +-- snapshot acquisition by the segments. This scenario validates that distributed +-- snapshot is used by the segments to evaluate tuple visibility in case of +-- one-phase commit and correct results are returned. +-- +-- connection 40 inserts 100, 100 and 300 serially using one-phase commit +-- 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 +10: BEGIN ISOLATION LEVEL REPEATABLE READ; +BEGIN +20: BEGIN ISOLATION LEVEL REPEATABLE READ; +BEGIN +30: BEGIN ISOLATION LEVEL REPEATABLE READ; +BEGIN +40: INSERT INTO distributed_snapshot_test3 VALUES(100); +INSERT 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 +30: SELECT 123 AS "establish snapshot"; + establish snapshot +-------------------- + 123 +(1 row) +40: INSERT INTO distributed_snapshot_test3 VALUES(300); +INSERT 1 +10: SELECT gp_segment_id, * FROM distributed_snapshot_test3; + gp_segment_id | a +---------------+----- + 2 | 100 +(1 row) +20: SELECT gp_segment_id, * FROM distributed_snapshot_test3; + gp_segment_id | a +---------------+----- + 1 | 300 + 2 | 100 + 2 | 100 +(3 rows) +30: SELECT gp_segment_id, * FROM distributed_snapshot_test3; + gp_segment_id | a +---------------+----- + 2 | 100 + 2 | 100 +(2 rows) +10: COMMIT; +COMMIT +20: COMMIT; +COMMIT +30: COMMIT; +COMMIT +DROP TABLE distributed_snapshot_test3; +DROP + +-- The following test cases are to test that QEs can get +-- latest distribute snapshot to scan normal tables (not catalog). +-- Cloudberry tests the visibility of heap tuples firstly using +-- distributed snapshot. Distributed snapshot is generated on +-- QD and then dispatched to QEs. Some utility statement needs +-- to work under latest snapshot when executing, so that they +-- invoke the function `GetLatestSnapshot` in QEs. But remember +-- we cannot get the latest distributed snapshot. + +-- Subtle cases are: Alter Table or Alter Domain statements on QD +-- get snapshot in Portal Run and then try to hold locks on the +-- target table in ProcessUtilitySlow. Here is the key point: +-- 1. try to hold lock ==> it might be blocked by other transcations +-- 2. then it will be waked up to continue +-- 3. when it can continue, the world has changed because other transcations +-- then blocks it have been over + +-- Previously, on QD we do not getsnapshot before we dispatch utility +-- statement to QEs which leads to the distributed snapshot does not +-- reflect the "world change". This will lead to some bugs. For example, +-- if the first transaction is to rewrite the whole heap, and then +-- the second Alter Table or Alter Domain statements continues with +-- the distributed snapshot that txn1 does not commit yet, it will +-- see no tuples in the new heap! +-- See Github issue https://github.com/greenplum-db/gpdb/issues/10216 + +-- Now this has been fixed, the following cases are tests to check this. + +-- Case 1: concurrently alter column type (will do rewrite heap) +create table t_alter_snapshot_test(a int, b int, c int); +CREATE +insert into t_alter_snapshot_test values (1, 1, 1), (1, 1, 1); +INSERT 2 + +select * from t_alter_snapshot_test; + a | b | c +---+---+--- + 1 | 1 | 1 + 1 | 1 | 1 +(2 rows) + +1: begin; +BEGIN +1: alter table t_alter_snapshot_test alter column b type text; +ALTER + +-- the following statement will hang +2&: alter table t_alter_snapshot_test alter column c type text; + +1: end; +END +-- after 1 commit, 2 can continue, it should use latest distributed +-- snapshot so that the data will not be lost. +2<: <... completed> +ALTER + +select * from t_alter_snapshot_test; + a | b | c +---+---+--- + 1 | 1 | 1 + 1 | 1 | 1 +(2 rows) +drop table t_alter_snapshot_test; +DROP + +-- Case 2: concurrently add exclude constrain +create table t_alter_snapshot_test(a int, b int); +CREATE +insert into t_alter_snapshot_test values (1, 1), (1, 1); +INSERT 2 + +select a from t_alter_snapshot_test; + a +--- + 1 + 1 +(2 rows) + +1: begin; +BEGIN +1: alter table t_alter_snapshot_test alter column b type int using b::int; +ALTER + +2&: alter table t_alter_snapshot_test add exclude using btree (a WITH =); + +1: end; +END +-- 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 + +-- 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 + +insert into t_alter_snapshot_test select i,i,i from generate_series(1, 100)i; +INSERT 100 +select count(*) from t_alter_snapshot_test; + count +------- + 100 +(1 row) + +1: begin; +BEGIN +1: alter table t_alter_snapshot_test alter column rank type text; +ALTER + +2&: alter table t_alter_snapshot_test split partition for (5) at (5) into (partition pa, partition pb); + +1: end; +END +-- after 1 commit, 2 can go on and it should not lose data +2<: <... completed> +ALTER + +select count(*) from t_alter_snapshot_test; + count +------- + 100 +(1 row) +drop table t_alter_snapshot_test; +DROP + +-- case 4: concurrently validate check +create table t_alter_snapshot_test(a int, b int); +CREATE +insert into t_alter_snapshot_test values (1, 1), (2, 2); +INSERT 2 +alter table t_alter_snapshot_test ADD CONSTRAINT mychk CHECK(a > 20) NOT VALID; +ALTER + +1: begin; +BEGIN +1: alter table t_alter_snapshot_test alter column b type text; +ALTER + +2&: alter table t_alter_snapshot_test validate CONSTRAINT mychk; + +1: end; +END +-- 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 + +-- case 5: concurrently domain check +create domain domain_snapshot_test as int; +CREATE +create table t_alter_snapshot_test(i domain_snapshot_test, j int, k int); +CREATE +insert into t_alter_snapshot_test values(200,1,1); +INSERT 1 +alter domain domain_snapshot_test ADD CONSTRAINT mychk CHECK(VALUE > 300) NOT VALID; +ALTER + +1: begin; +BEGIN +1: alter table t_alter_snapshot_test alter column k type text; +ALTER + +2&: alter domain domain_snapshot_test validate CONSTRAINT mychk; + +1:end; +END +-- 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 domain domain_snapshot_test; +DROP + +-- case 6: alter table expand table +create table t_alter_snapshot_test(a int, b int); +CREATE +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 +select gp_segment_id, * from t_alter_snapshot_test; + gp_segment_id | a | b +---------------+----+---- + 0 | 2 | 2 + 0 | 3 | 3 + 0 | 4 | 4 + 0 | 6 | 6 + 0 | 7 | 7 + 0 | 8 | 8 + 0 | 9 | 9 + 0 | 10 | 10 + 1 | 1 | 1 + 1 | 5 | 5 +(10 rows) + +1: begin; +BEGIN +1: alter table t_alter_snapshot_test alter column b type text; +ALTER + +2&: alter table t_alter_snapshot_test expand table; + +1: end; +END +-- after 1 commit, 2 can go on and data should not be lost +2<: <... completed> +ALTER + +select gp_segment_id, * from t_alter_snapshot_test; + gp_segment_id | a | b +---------------+----+---- + 0 | 2 | 2 + 0 | 3 | 3 + 0 | 4 | 4 + 0 | 7 | 7 + 0 | 8 | 8 + 1 | 1 | 1 + 2 | 6 | 6 + 2 | 9 | 9 + 2 | 10 | 10 + 2 | 5 | 5 +(10 rows) +drop table t_alter_snapshot_test; +DROP + +-- case 7: alter table set distributed by +create table t_alter_snapshot_test(a int, b int) distributed randomly; +CREATE +insert into t_alter_snapshot_test select i,i from generate_series(1, 10)i; +INSERT 10 +select count(*) from t_alter_snapshot_test; + count +------- + 10 +(1 row) + +1: begin; +BEGIN +1: alter table t_alter_snapshot_test alter column b type text; +ALTER + +2&: alter table t_alter_snapshot_test set distributed by (a); + +1: end; +END +-- after 1 commit, 2 can continue and data should not be lost +2<: <... completed> +ALTER + +select count(*) from t_alter_snapshot_test; + count +------- + 10 +(1 row) +drop table t_alter_snapshot_test; +DROP + +-- case 8: DML concurrent with Alter Table +create table t_alter_snapshot_test(a int, b int); +CREATE + +---- test for insert +1: begin; +BEGIN +1: insert into t_alter_snapshot_test values (1, 1); +INSERT 1 +2&: alter table t_alter_snapshot_test alter column b type text; +1: end; +END +-- 2 can continue, and we should not lose data +2<: <... completed> +ALTER +select * from t_alter_snapshot_test; + a | b +---+--- + 1 | 1 +(1 row) + +---- test for update +truncate t_alter_snapshot_test; +TRUNCATE +insert into t_alter_snapshot_test values (1, 1); +INSERT 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 +-- 2 can continue and we should see the data has been updated +2<: <... completed> +ALTER +select * from t_alter_snapshot_test; + a | b +---+--- + 1 | 3 +(1 row) + +---- test for delete +truncate t_alter_snapshot_test; +TRUNCATE +insert into t_alter_snapshot_test values (1, 1); +INSERT 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 +-- 2 can continue and we should see the data has been deleted +2<: <... completed> +ALTER +select * from t_alter_snapshot_test; + a | b +---+--- +(0 rows) +drop table t_alter_snapshot_test; +DROP + +-- Case 9: Repeatable Read Isolation Level Test +create table t_alter_snapshot_test(a int, b int); +CREATE +insert into t_alter_snapshot_test values (1, 1); +INSERT 1 +1: begin; +BEGIN +1: insert into t_alter_snapshot_test values (1, 1); +INSERT 1 + +2: begin isolation level repeatable read; +BEGIN +2: select * from t_alter_snapshot_test; + a | b +---+--- + 1 | 1 +(1 row) +2&: alter table t_alter_snapshot_test alter column b type text; + +1: end; +END +-- 2 can continue and after its alter rewrite the heap +-- it can see all the data even under repeatable read +2<: <... completed> +ALTER +2: select * from t_alter_snapshot_test; + a | b +---+--- + 1 | 1 + 1 | 1 +(2 rows) +2: end; +END + +select * from t_alter_snapshot_test; + a | b +---+--- + 1 | 1 + 1 | 1 +(2 rows) +drop table t_alter_snapshot_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/distributed_transactions.out b/src/test/singlenode_isolation2/expected/distributed_transactions.out new file mode 100644 index 00000000000..1135a126d13 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/distributed_transactions.out @@ -0,0 +1,55 @@ +-- Test error after ProcArrayEndTransaction + +-- abort fail on QD +SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', 1); + gp_inject_fault +----------------- + Success: +(1 row) +BEGIN; +BEGIN +CREATE TABLE test_xact_abort_failure(a int); +CREATE +ABORT; +ERROR: fault triggered, fault name:'abort_after_procarray_end' fault type:'error' +SELECT gp_inject_fault( 'abort_after_procarray_end', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- abort fail on QE +SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', dbid) from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +BEGIN; +BEGIN +CREATE TABLE test_xact_abort_failure(a int); +CREATE +ABORT; +ABORT +SELECT gp_inject_fault( 'abort_after_procarray_end', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- abort fail in local transaction +SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', dbid) from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +0U: BEGIN; +BEGIN +0U: CREATE TABLE test_xact_abort_failure(a int); +CREATE +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; + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/distributedlog-bug.out b/src/test/singlenode_isolation2/expected/distributedlog-bug.out new file mode 100644 index 00000000000..829c96b3dc5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/distributedlog-bug.out @@ -0,0 +1,44 @@ +-- +-- Test for a bug in checking tuple visibility against a distributed snapshot +-- that turned up during merge PostgreSQL 9.6. We incorrectly set the +-- HEAP_XMAX_DISTRIBUTED_SNAPSHOT_IGNORE hint bit on a tuple, when the +-- transaction was in fact a distributed transaction that was still +-- in-progress. +-- +CREATE TABLE distributed_snapshot_test ( id INTEGER, f FLOAT); +CREATE + +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +2: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; +SET +2: select 'dummy select to establish snapshot'; + ?column? +------------------------------------ + dummy select to establish snapshot +(1 row) +1: select count(*) > 0 as tbl_found from gp_dist_random('pg_class') where relname = 'distributed_snapshot_test'; + tbl_found +----------- + t +(1 row) + +-- Drop table in a transaction +1: drop table distributed_snapshot_test; +DROP + +3: vacuum pg_class; +VACUUM + +-- Commit the DROP. +1: COMMIT; +COMMIT + +-- The table should still be visible to transaction 2's snapshot. +2: select count(*) > 0 as tbl_found from gp_dist_random('pg_class') where relname = 'distributed_snapshot_test'; + tbl_found +----------- + t +(1 row) diff --git a/src/test/singlenode_isolation2/expected/drop_rename.out b/src/test/singlenode_isolation2/expected/drop_rename.out new file mode 100644 index 00000000000..93458d014b0 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/drop_rename.out @@ -0,0 +1,110 @@ +-- Test if ALTER RENAME followed by ANALYZE executed concurrently with +-- DROP does not introduce inconsistency between master and segments. +-- DROP should be blocked because of ALTER-ANALYZE. After being +-- unblocked, DROP should lookup the old name again and fail with +-- relation does not exist error. + +1:drop table if exists t1; +DROP +1:drop table if exists newt1; +DROP +1:create table t1 (a int, b text); +CREATE +1:insert into t1 select i, 'abc '||i from generate_series(1,10)i; +INSERT 10 +1:begin; +BEGIN +1:alter table t1 rename to newt1; +ALTER +1:analyze newt1; +ANALYZE +-- this drop should block to acquire AccessExclusive lock on t1's OID. +2&:drop table t1; +1:commit; +COMMIT +2<: <... completed> +ERROR: table "t1" does not exist +2:select count(*) from newt1; + count +------- + 10 +(1 row) + +-- DROP is executed concurrently with ALTER RENAME but not ANALYZE. +1:drop table if exists t2; +DROP +1:drop table if exists newt2; +DROP +1:create table t2 (a int, b text); +CREATE +1:insert into t2 select i, 'pqr '||i from generate_series(1,10)i; +INSERT 10 +1:begin; +BEGIN +1:alter table t2 rename to newt2; +ALTER +2&:drop table t2; +1:commit; +COMMIT +2<: <... completed> +ERROR: table "t2" does not exist +2:select count(*) from newt2; + count +------- + 10 +(1 row) + +-- 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 +1:create table t3 (a int, b text); +CREATE +1:insert into t3 select i, '123 '||i from generate_series(1,10)i; +INSERT 10 +1:begin; +BEGIN +1:alter table t3 rename to t3_new; +ALTER +2&:drop table if exists t3; +1:commit; +COMMIT +2<: <... completed> +DROP +2:select count(*) from t3; +ERROR: relation "t3" does not exist +LINE 1: select count(*) from t3; + ^ +2:select relname from pg_class where relname like 't3%'; + relname +--------- + t3_new +(1 row) +2:select relname from gp_dist_random('pg_class') where relname like 't3%'; + relname +--------- + t3_new +(1 row) + +1:drop table if exists t3; +DROP +1:create table t3 (a int, b text); +CREATE +1:insert into t3 select i, '123 '||i from generate_series(1,10)i; +INSERT 10 +1:begin; +BEGIN +1:drop table t3; +DROP +2&:drop table if exists t3; +3&:drop table t3; +1:commit; +COMMIT +3<: <... completed> +ERROR: table "t3" does not exist +2<: <... completed> +DROP +2:select count(*) from t3; +ERROR: relation "t3" does not exist +LINE 1: select count(*) from t3; + ^ diff --git a/src/test/singlenode_isolation2/expected/enable_autovacuum.out b/src/test/singlenode_isolation2/expected/enable_autovacuum.out new file mode 100644 index 00000000000..e2e2d67e059 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/enable_autovacuum.out @@ -0,0 +1,7 @@ +alter system set autovacuum = on; +ALTER +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 +---------------+---------------- + -1 | t +(1 row) diff --git a/src/test/singlenode_isolation2/expected/execute_on_utilitymode.out b/src/test/singlenode_isolation2/expected/execute_on_utilitymode.out new file mode 100644 index 00000000000..84c397c7776 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/execute_on_utilitymode.out @@ -0,0 +1,102 @@ +-- +-- Test using functions with EXECUTE ON options in utility mode. +-- + +-- 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_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 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 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 + +-- 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 +-- we're connected to, ignoring the EXECUTE ON directives. +-- +-- 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 +insert into fewrows select g from generate_series(1, 10) g; +INSERT 10 + +-1U: select * from srf_on_master() as srf (x) left join fewrows on x = t; + x | t +--------+--- + foo -1 | + bar -1 | +(2 rows) +-1U: select * from srf_on_all_segments() as srf (x) left join fewrows on x = t; + x | t +--------+--- + foo -1 | + bar -1 | +(2 rows) +-1U: select * from srf_on_any() as srf (x) left join fewrows on x = t; + x | t +--------+--- + foo -1 | + bar -1 | +(2 rows) +-1U: select * from srf_on_initplan() as srf (x) left join fewrows on x = t; + x | t +--------+--- + foo -1 | + bar -1 | +(2 rows) + +1U: select * from srf_on_master(), fewrows; + srf_on_master | t +---------------+--- + foo 1 | 2 + foo 1 | 3 + foo 1 | 4 + foo 1 | 7 + bar 1 | 2 + bar 1 | 3 + bar 1 | 4 + bar 1 | 7 +(8 rows) +1U: select * from srf_on_all_segments(), fewrows; + srf_on_all_segments | t +---------------------+--- + foo 1 | 2 + foo 1 | 3 + foo 1 | 4 + foo 1 | 7 + bar 1 | 2 + bar 1 | 3 + bar 1 | 4 + bar 1 | 7 +(8 rows) +1U: select * from srf_on_any(), fewrows; + srf_on_any | t +------------+--- + foo 1 | 2 + foo 1 | 3 + foo 1 | 4 + foo 1 | 7 + bar 1 | 2 + bar 1 | 3 + bar 1 | 4 + bar 1 | 7 +(8 rows) +1U: select * from srf_on_initplan(), fewrows; + srf_on_initplan | t +-----------------+--- + foo 1 | 2 + foo 1 | 3 + foo 1 | 4 + foo 1 | 7 + bar 1 | 2 + bar 1 | 3 + bar 1 | 4 + bar 1 | 7 +(8 rows) diff --git a/src/test/singlenode_isolation2/expected/fsync_ao.out b/src/test/singlenode_isolation2/expected/fsync_ao.out new file mode 100644 index 00000000000..74559654ec3 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/fsync_ao.out @@ -0,0 +1,239 @@ +-- Validate that the mirror replay process forwards fsync requests for +-- append-optimized tables to the checkpointer. This is done using a +-- fault point that is reached only in a checkpointer process. Note +-- that checkpointer process runs on primary as well as mirror. We +-- are concerned with the checkpointer running on mirror in this test. +-- +-- Starting with a clean slate (no pending fsync requests), the test +-- performs operations such as insert, vacuum, drop on AO row and +-- column oriented tables. It validates that fsync was performed by +-- checkpointer for expected number of AO files at the end of each +-- operation. + +-- Set the GUC to perform replay of checkpoint records immediately. +-- It speeds up the test. +!\retcode gpconfig -c create_restartpoint_on_ckpt_record_replay -v on --skipvalidation; +(exited with code 0) +-- Set fsync on since we need to test the fsync code logic. +!\retcode gpconfig -c fsync -v on --skipvalidation; +(exited with code 0) +!\retcode gpstop -u; +(exited with code 0) + +create table fsync_ao(a int, b int) with (appendoptimized = true); +CREATE +create table fsync_co(a int, b int) with (appendoptimized = true, orientation = column); +CREATE +-- 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; +CREATE + +insert into fsync_ao select i, i from generate_series(1,10)i; +INSERT 10 +insert into fsync_co select i, i from generate_series(1,10)i; +INSERT 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 = -1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Start with a clean slate. +checkpoint; +CHECKPOINT + +-- Wait until restartpoint flush happens. +select gp_wait_until_triggered_fault('restartpoint_guts', 1, dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- We have just created a checkpoint. The next automatic checkpoint +-- will be triggered only after 5 minutes or after CheckPointSegments +-- wal segments. Neither of that can happen until this test calls +-- explicit checkpoint. + +-- Inject fault to count relfiles fsync'ed by checkpointer on mirror. +select gp_inject_fault_infinite('ao_fsync_counter', 'skip', dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- 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 into fsync_co select i, i from generate_series(1,20)i; +INSERT 20 +insert into ul_fsync_co select i, i, i from generate_series(1,20)i; +INSERT 20 + +checkpoint; +CHECKPOINT + +-- Wait until restartpoint happens again. +select gp_wait_until_triggered_fault('restartpoint_guts', 2, dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Validate that the number of files fsync'ed by checkpointer (on +-- mirror). `num times hit` is corresponding to the number of files +-- synced by `ao_fsync_counter` fault. +select gp_inject_fault('ao_fsync_counter', 'status', dbid) from gp_segment_configuration where content=-1 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:'3' + +(1 row) + +-- Test vacuum compaction with more than one segment file per table. +-- Perform concurrent inserts before vacuum to get multiple segment +-- files. Validation criterion is the next checkpoint succeeds on the +-- mirror. +1: begin; +BEGIN +1: insert into fsync_ao select i, i from generate_series(1,20)i; +INSERT 20 +1: insert into fsync_co select i, i from generate_series(1,20)i; +INSERT 20 +1: insert into ul_fsync_co select i, i, i from generate_series(1,20)i; +INSERT 20 +insert into fsync_ao select i, i from generate_series(21,40)i; +INSERT 20 +insert into fsync_co select i, i from generate_series(21,40)i; +INSERT 20 +insert into ul_fsync_co select i, i, i from generate_series(1,40)i; +INSERT 40 +1: end; +END +-- Generate some invisible tuples in both the tables so as to trigger +-- compaction during vacuum. +delete from fsync_ao where a > 20; +DELETE 20 +update fsync_co set b = -a; +UPDATE 70 +delete from ul_fsync_co where b < 20; +DELETE 57 + +-- Expect two segment files for each table (ao table) or each column (co table). +select segment_id, segno, state from gp_toolkit.__gp_aoseg('fsync_ao'); + segment_id | segno | state +------------+-------+------- + -1 | 0 | 1 + -1 | 1 | 1 +(2 rows) +select segment_id, segno, column_num, physical_segno, state from gp_toolkit.__gp_aocsseg('fsync_co'); + segment_id | segno | column_num | physical_segno | state +------------+-------+------------+----------------+------- + -1 | 0 | 0 | 0 | 1 + -1 | 0 | 1 | 128 | 1 + -1 | 1 | 0 | 1 | 1 + -1 | 1 | 1 | 129 | 1 +(4 rows) +select segment_id, segno, column_num, physical_segno, state from gp_toolkit.__gp_aocsseg('ul_fsync_co'); + segment_id | segno | column_num | physical_segno | state +------------+-------+------------+----------------+------- + -1 | 0 | 0 | 0 | 1 + -1 | 0 | 1 | 128 | 1 + -1 | 0 | 2 | 256 | 1 + -1 | 1 | 0 | 1 | 1 + -1 | 1 | 1 | 129 | 1 + -1 | 1 | 2 | 257 | 1 +(6 rows) +vacuum fsync_ao; +VACUUM +vacuum fsync_co; +VACUUM +vacuum ul_fsync_co; +VACUUM +checkpoint; +CHECKPOINT +-- Wait until restartpoint happens again. +select gp_wait_until_triggered_fault('restartpoint_guts', 3, dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Expect the segment files that were updated by vacuum to be fsync'ed. +select gp_inject_fault('ao_fsync_counter', 'status', dbid) from gp_segment_configuration where content=-1 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:'12' +(1 row) + +-- Test that replay of drop table operation removes fsync requests +-- previously registed with the checkpointer. +update fsync_co set b = -a; +UPDATE 70 +drop table fsync_co; +DROP +update ul_fsync_co set c = -a; +UPDATE 23 +drop table ul_fsync_co; +DROP +-- Drop but don't commit the transaction. +begin; +BEGIN +update fsync_ao set b = -a; +UPDATE 50 +drop table fsync_ao; +DROP +abort; +ABORT +-- Fsync request for the following insert should not be forgotten. +insert into fsync_ao select * from generate_series(41,60)i; +INSERT 20 + +checkpoint; +CHECKPOINT +-- Wait until restartpoint happens again. +select gp_wait_until_triggered_fault('restartpoint_guts', 4, dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Expect that fsync is only performed for fsync_ao table (1 file) but +-- not for fsync_co table because it was dropped after being updated. +select gp_inject_fault('ao_fsync_counter', 'status', dbid) from gp_segment_configuration where content=-1 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. +select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration where content = -1; + gp_inject_fault +----------------- + Success: + Success: +(2 rows) + +!\retcode gpconfig -r create_restartpoint_on_ckpt_record_replay --skipvalidation; +-- start_ignore +20191204:17:13:13:024809 gpconfig:asimmac:apraveen-[INFO]:-completed successfully with parameters '-r create_restartpoint_on_ckpt_record_replay --skipvalidation' + +-- end_ignore +(exited with code 0) +!\retcode gpconfig -c fsync -v off --skipvalidation; +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +20191204:17:13:27:024927 gpstop:asimmac:apraveen-[INFO]:-Starting gpstop with args: -u +20191204:17:13:27:024927 gpstop:asimmac:apraveen-[INFO]:-Gathering information and validating the environment... +20191204:17:13:27:024927 gpstop:asimmac:apraveen-[INFO]:-Obtaining Cloudberry Master catalog information +20191204:17:13:27:024927 gpstop:asimmac:apraveen-[INFO]:-Obtaining Segment details from master... +20191204:17:13:27:024927 gpstop:asimmac:apraveen-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.5242.gb96afb4d9fa build dev' +20191204:17:13:27:024927 gpstop:asimmac:apraveen-[INFO]:-Signalling all postmaster processes to reload + +-- end_ignore +(exited with code 0) diff --git a/src/test/singlenode_isolation2/expected/fts_dns_error.out b/src/test/singlenode_isolation2/expected/fts_dns_error.out new file mode 100644 index 00000000000..6a823154a1b --- /dev/null +++ b/src/test/singlenode_isolation2/expected/fts_dns_error.out @@ -0,0 +1,260 @@ +-- Tests FTS can handle DNS error. +-- to make test deterministic and fast +!\retcode gpconfig -c gp_fts_probe_retries -v 2 --masteronly; +-- start_ignore +20180815:04:37:38:022354 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-c gp_fts_probe_retries -v 2 --masteronly' + +-- end_ignore +(exited with code 0) + +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 30 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 127 --skipvalidation --masteronly; +-- start_ignore +20180815:04:37:38:022446 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-c gp_gang_creation_retry_count -v 127 --skipvalidation --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 250 --skipvalidation --masteronly; +-- start_ignore +20180815:04:37:39:022532 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-c gp_gang_creation_retry_timer -v 250 --skipvalidation --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +20180815:04:37:39:022618 gpstop:gpdbvm:gpadmin-[INFO]:-Starting gpstop with args: -u +20180815:04:37:39:022618 gpstop:gpdbvm:gpadmin-[INFO]:-Gathering information and validating the environment... +20180815:04:37:39:022618 gpstop:gpdbvm:gpadmin-[INFO]:-Obtaining Cloudberry Master catalog information +20180815:04:37:39:022618 gpstop:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180815:04:37:39:022618 gpstop:gpdbvm:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.7526.g2508fd0 build dev-oss' +20180815:04:37:39:022618 gpstop:gpdbvm:gpadmin-[INFO]:-Signalling all postmaster processes to reload +. + +-- end_ignore +(exited with code 0) + +-- no down segment in the beginning +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +-- 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 +-- process. As if that happens, due to race condition will not trigger +-- the fault and fail the test. +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +-- trigger a DNS error +select gp_inject_fault_infinite('get_dns_cached_address', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +select gp_inject_fault_infinite('get_dns_cached_address', 'reset', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- verify a fts failover happens +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 1 +(1 row) + +-- fully recover the failed primary as new mirror +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting gprecoverseg with args: -aF +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.7526.g2508fd0 build dev-oss' +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-master Cloudberry Version: 'PostgreSQL 9.1beta2 (Cloudberry Database 6.0.0-alpha.0+dev.7526.g2508fd0 build dev-oss) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit compiled on Aug 15 2018 00:06:20 (with assert checking)' +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Heap checksum setting is consistent between master and the segments that are candidates for recoverseg +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery type = Standard +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery 1 of 1 +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Synchronization mode = Full +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance host = gpdbvm +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance address = gpdbvm +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast1/demoDataDir0 +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance port = 25432 +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance host = gpdbvm +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance address = gpdbvm +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror1/demoDataDir0 +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance port = 25435 +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Target = in-place +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-1 segment(s) to recover +20180815:04:37:43:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Ensuring 1 failed segment(s) are stopped +20180815:04:37:45:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-20031: /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast1/demoDataDir0 +. +20180815:04:37:46:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Ensuring that shared memory is cleaned up for stopped segments +20180815:04:37:47:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Validating remote directories +. +20180815:04:37:48:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Configuring new segments +. +20180815:04:37:49:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Updating mirrors +. +20180815:04:37:50:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting mirrors +20180815:04:37:50:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-era is e0110b50959363aa_180815043625 +20180815:04:37:50:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait... +. +20180815:04:37:51:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Process results... +20180815:04:37:51:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Triggering FTS probe +20180815:04:37:51:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** +20180815:04:37:51:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Updating segments for streaming is completed. +20180815:04:37:51:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-For segments updated successfully, streaming will continue in the background. +20180815:04:37:51:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Use gpstate -s to check the streaming progress. +20180815:04:37:51:022680 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +do $$ begin /* in func */ for i in 1..120 loop /* in func */ if (select mode = 's' from gp_segment_configuration where content = 0 limit 1) then /* in func */ return; /* in func */ end if; /* in func */ perform gp_request_fts_probe_scan(); /* in func */ end loop; /* in func */ end; /* in func */ $$; +DO + +!\retcode gprecoverseg -ar; +-- start_ignore +20180815:04:37:51:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting gprecoverseg with args: -ar +20180815:04:37:51:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.7526.g2508fd0 build dev-oss' +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-master Cloudberry Version: 'PostgreSQL 9.1beta2 (Cloudberry Database 6.0.0-alpha.0+dev.7526.g2508fd0 build dev-oss) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit compiled on Aug 15 2018 00:06:20 (with assert checking)' +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery type = Rebalance +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Unbalanced segment 1 of 2 +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance host = gpdbvm +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance address = gpdbvm +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror1/demoDataDir0 +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance port = 25435 +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Balanced role = Mirror +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Current role = Primary +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Unbalanced segment 2 of 2 +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance host = gpdbvm +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance address = gpdbvm +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast1/demoDataDir0 +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Unbalanced instance port = 25432 +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Balanced role = Primary +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Current role = Mirror +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Getting unbalanced segments +20180815:04:37:52:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Stopping unbalanced primary segments... +. +20180815:04:37:53:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Triggering segment reconfiguration +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting segment synchronization +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-=============================START ANOTHER RECOVER========================================= +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.7526.g2508fd0 build dev-oss' +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-master Cloudberry Version: 'PostgreSQL 9.1beta2 (Cloudberry Database 6.0.0-alpha.0+dev.7526.g2508fd0 build dev-oss) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit compiled on Aug 15 2018 00:06:20 (with assert checking)' +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Heap checksum setting is consistent between master and the segments that are candidates for recoverseg +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery type = Standard +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Recovery 1 of 1 +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Synchronization mode = Full +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance host = gpdbvm +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance address = gpdbvm +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror1/demoDataDir0 +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Failed instance port = 25435 +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance host = gpdbvm +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance address = gpdbvm +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast1/demoDataDir0 +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Source instance port = 25432 +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:- Recovery Target = in-place +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:---------------------------------------------------------- +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-1 segment(s) to recover +20180815:04:37:55:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Ensuring 1 failed segment(s) are stopped + +20180815:04:37:56:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Ensuring that shared memory is cleaned up for stopped segments +20180815:04:37:56:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Validating remote directories +. +20180815:04:37:57:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Configuring new segments +. +20180815:04:37:59:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Updating mirrors +. +20180815:04:38:00:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Starting mirrors +20180815:04:38:00:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-era is e0110b50959363aa_180815043625 +20180815:04:38:00:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait... +. +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Process results... +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Triggering FTS probe +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Updating segments for streaming is completed. +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-For segments updated successfully, streaming will continue in the background. +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-Use gpstate -s to check the streaming progress. +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-==============================END ANOTHER RECOVER========================================== +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-The rebalance operation has completed successfully. +20180815:04:38:01:023173 gprecoverseg:gpdbvm:gpadmin-[INFO]:-****************************************************************** + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +do $$ begin /* in func */ for i in 1..120 loop /* in func */ if (select mode = 's' from gp_segment_configuration where content = 0 limit 1) then /* in func */ return; /* in func */ end if; /* in func */ perform gp_request_fts_probe_scan(); /* in func */ end loop; /* in func */ end; /* in func */ $$; +DO + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +!\retcode gpconfig -r gp_fts_probe_retries --masteronly; +-- start_ignore +20180815:04:38:01:023620 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-r gp_fts_probe_retries --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +-- start_ignore +20180815:04:38:02:023710 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-r gp_gang_creation_retry_count --skipvalidation --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +-- start_ignore +20180815:04:38:03:023794 gpconfig:gpdbvm:gpadmin-[INFO]:-completed successfully with parameters '-r gp_gang_creation_retry_timer --skipvalidation --masteronly' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +20180815:04:38:03:023878 gpstop:gpdbvm:gpadmin-[INFO]:-Starting gpstop with args: -u +20180815:04:38:03:023878 gpstop:gpdbvm:gpadmin-[INFO]:-Gathering information and validating the environment... +20180815:04:38:03:023878 gpstop:gpdbvm:gpadmin-[INFO]:-Obtaining Cloudberry Master catalog information +20180815:04:38:03:023878 gpstop:gpdbvm:gpadmin-[INFO]:-Obtaining Segment details from master... +20180815:04:38:03:023878 gpstop:gpdbvm:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 6.0.0-alpha.0+dev.7526.g2508fd0 build dev-oss' +20180815:04:38:03:023878 gpstop:gpdbvm:gpadmin-[INFO]:-Signalling all postmaster processes to reload +. + +-- end_ignore +(exited with code 0) + + diff --git a/src/test/singlenode_isolation2/expected/fts_errors.out b/src/test/singlenode_isolation2/expected/fts_errors.out new file mode 100644 index 00000000000..69cb7a2a38c --- /dev/null +++ b/src/test/singlenode_isolation2/expected/fts_errors.out @@ -0,0 +1,256 @@ +-- This test triggers failover of content 0 and content 1 +-- Content 0 is used to test if FTS can handle DNS errors +-- Content 1 is used to test the gang interaction in various +-- sessions when a failover is triggered and mirror is promoted +-- to primary + +-- start_matchsubs +-- m/^ERROR: Error on receive from .*: server closed the connection unexpectedly/ +-- s/^ERROR: Error on receive from .*: server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/ +-- end_matchsubs + +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 120 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 120 --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 1000 --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(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 + +-- no segment down. +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +drop table if exists fts_errors_test; +DROP +create table fts_errors_test(a int); +CREATE + +1:BEGIN; +BEGIN +1:END; +END +2:BEGIN; +BEGIN +2:INSERT INTO fts_errors_test SELECT * FROM generate_series(1,100); +INSERT 100 +3:BEGIN; +BEGIN +3:CREATE TEMP TABLE tmp3 (c1 int, c2 int); +CREATE +3:DECLARE c1 CURSOR for select * from tmp3; +DECLARE +4:CREATE TEMP TABLE tmp4 (c1 int, c2 int); +CREATE +5:BEGIN; +BEGIN +5:CREATE TEMP TABLE tmp5 (c1 int, c2 int); +CREATE +5:SAVEPOINT s1; +SAVEPOINT +5:CREATE TEMP TABLE tmp51 (c1 int, c2 int); +CREATE + +-- 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 +-- process. As if that happens, due to race condition will not trigger +-- the fault and fail the test. +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- stop a primary in order to trigger a mirror promotion for content 1 +select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=1), 'stop'); + pg_ctl +-------- + OK +(1 row) + +-- trigger a DNS error. This fault internally gets trigerred for content 0 +select gp_inject_fault_infinite('get_dns_cached_address', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- trigger failover +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +select pg_sleep(5); + pg_sleep +---------- + +(1 row) + +-- Since both gp_request_fts_probe_scan() and gp_inject_fault() will +-- call the cdbcomponent_updateCdbComponents(), there is a plausible +-- race condition between the fts_probes and the reset of the fault +-- injector; if the reset triggers the fault before the fts probe +-- completes, the primary will be taken down without removing the fault +-- To avoid the race condition, the test waits until both the segments +-- go down before removing the fault. +-- The test expect the following 2 segments to go down: +-- 1. pg_ctl stop for dbid=3(content 1, primary) +-- 2. get_dns_cached_address fault injected for dbid=2(content 0, primary) + +-- get_dns_cached_address will make FTS update failed +-- should check no segment is down +-- start_ignore +-1U: select wait_until_segments_are_down(0); + wait_until_segments_are_down +------------------------------ + t +(1 row) +-- end_ignore +select gp_inject_fault('get_dns_cached_address', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- session 1: in no transaction and no temp table created, it's safe to +-- update cdb_component_dbs and use the new promoted primary +1:BEGIN; +BEGIN +1:END; +END +-- session 2: in transaction, gxid is dispatched to writer gang, cann't +-- update cdb_component_dbs, following query should fail +-- start_ignore +2:END; +ERROR: Error on receive from seg1 127.0.1.1:7003 pid=19840: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- end_ignore +-- session 3: in transaction and has a cursor, cann't update +-- cdb_component_dbs, following query should fail +3:FETCH ALL FROM c1; + c1 | c2 +----+---- +(0 rows) +3:END; +ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) +-- session 4: not in transaction but has temp table, cann't update +-- cdb_component_dbs, following query should fail and session +-- is reset +4:select * from tmp4; +ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) +4:select * from tmp4; +ERROR: relation "tmp4" does not exist +LINE 1: select * from tmp4; + ^ +-- session 5: has a subtransaction, cann't update cdb_component_dbs, +-- following query should fail +5:select * from tmp51; +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 +1q: ... +2q: ... +3q: ... +4q: ... +5q: ... + +-- immediate stop mirror for content 0. This is just to speed up the test, next +-- step gprecovertseg will do the same but it uses gpstop fast mode and not +-- immediate, which add time to tests. +select pg_ctl((select datadir from gp_segment_configuration c where c.role='m' and c.content=0), 'stop'); + pg_ctl +-------- + OK +(1 row) +select pg_sleep(60); + pg_sleep +---------- + +(1 row) + +-- fully recover the failed primary as new mirror +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +!\retcode gprecoverseg -ar; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 0) + + diff --git a/src/test/singlenode_isolation2/expected/fts_errors_1.out b/src/test/singlenode_isolation2/expected/fts_errors_1.out new file mode 100644 index 00000000000..945b669d7f6 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/fts_errors_1.out @@ -0,0 +1,229 @@ +-- This test triggers failover of content 0 and content 1 +-- Content 0 is used to test if FTS can handle DNS errors +-- Content 1 is used to test the gang interaction in various +-- sessions when a failover is triggered and mirror is promoted +-- to primary + +-- start_matchsubs +-- m/^ERROR: Error on receive from .*: server closed the connection unexpectedly/ +-- s/^ERROR: Error on receive from .*: server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/ +-- end_matchsubs + +-- to make test deterministic and fast +!\retcode gpconfig -c gp_fts_probe_retries -v 2 --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 120 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 120 --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 1000 --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(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 := 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 + +-- no segment down. +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +drop table if exists fts_errors_test; +DROP +create table fts_errors_test(a int); +CREATE + +1:BEGIN; +BEGIN +1:END; +END +2:BEGIN; +BEGIN +2:INSERT INTO fts_errors_test SELECT * FROM generate_series(1,100); +INSERT 100 +3:BEGIN; +BEGIN +3:CREATE TEMP TABLE tmp3 (c1 int, c2 int); +CREATE +3:DECLARE c1 CURSOR for select * from tmp3; +DECLARE +4:CREATE TEMP TABLE tmp4 (c1 int, c2 int); +CREATE +5:BEGIN; +BEGIN +5:CREATE TEMP TABLE tmp5 (c1 int, c2 int); +CREATE +5:SAVEPOINT s1; +SAVEPOINT +5:CREATE TEMP TABLE tmp51 (c1 int, c2 int); +CREATE + +-- 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 +-- process. As if that happens, due to race condition will not trigger +-- the fault and fail the test. +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +-- stop a primary in order to trigger a mirror promotion for content 1 +select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=1), 'stop'); + pg_ctl +-------- + OK +(1 row) + +-- trigger a DNS error. This fault internally gets trigerred for content 0 +select gp_inject_fault_infinite('get_dns_cached_address', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- trigger failover +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +-- Since both gp_request_fts_probe_scan() and gp_inject_fault() will +-- call the cdbcomponent_updateCdbComponents(), there is a plausible +-- race condition between the fts_probes and the reset of the fault +-- injector; if the reset triggers the fault before the fts probe +-- completes, the primary will be taken down without removing the fault +-- To avoid the race condition, the test waits until both the segments +-- go down before removing the fault. +-- The test expect the following 2 segments to go down: +-- 1. pg_ctl stop for dbid=3(content 1, primary) +-- 2. get_dns_cached_address fault injected for dbid=2(content 0, primary) +-1U: select wait_until_segments_are_down(2); + wait_until_segments_are_down +------------------------------ + t +(1 row) + +select gp_inject_fault('get_dns_cached_address', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- session 1: in no transaction and no temp table created, it's safe to +-- update cdb_component_dbs and use the new promoted primary +1:BEGIN; +BEGIN +1:END; +END +-- session 2: in transaction, gxid is dispatched to writer gang, cann't +-- update cdb_component_dbs, following query should fail +2:END; +ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) +-- session 3: in transaction and has a cursor, cann't update +-- cdb_component_dbs, following query should fail +3:FETCH ALL FROM c1; + c1 | c2 +----+---- +(0 rows) +3:END; +ERROR: Error on receive from seg1 slice1 127.0.1.1:7003 pid=31911: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- session 4: not in transaction but has temp table, cann't update +-- cdb_component_dbs, following query should fail and session +-- is reset +4:select * from tmp4; +ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) +4:select * from tmp4; +ERROR: relation "tmp4" does not exist +LINE 1: select * from tmp4; + ^ +-- session 5: has a subtransaction, cann't update cdb_component_dbs, +-- following query should fail +5:select * from tmp51; +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 +1q: ... +2q: ... +3q: ... +4q: ... +5q: ... + +-- immediate stop mirror for content 0. This is just to speed up the test, next +-- step gprecovertseg will do the same but it uses gpstop fast mode and not +-- immediate, which add time to tests. +select pg_ctl((select datadir from gp_segment_configuration c where c.role='m' and c.content=0), 'stop'); + pg_ctl +-------- + OK +(1 row) + +-- fully recover the failed primary as new mirror +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +!\retcode gprecoverseg -ar; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +!\retcode gpconfig -r gp_fts_probe_retries --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 0) + + diff --git a/src/test/singlenode_isolation2/expected/fts_session_reset.out b/src/test/singlenode_isolation2/expected/fts_session_reset.out new file mode 100644 index 00000000000..afeef05ed74 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/fts_session_reset.out @@ -0,0 +1,119 @@ +-- This test performs segment reconfiguration when a distributed +-- transaction is in progress. The expectation is that the first +-- command in the transaction after reconfiguration should fail. It +-- verifies a bug where a stale gang was reused in such a case, if the +-- failed primary happened to be up and listening. + +-- set these values purely to cut down test time, as default ts trigger is +-- every min and 5 retries + +create table test_fts_session_reset(c1 int); +CREATE + +1:BEGIN; +BEGIN +-- let the dispatcher create a gang +1:insert into test_fts_session_reset select * from generate_series(1,20); +INSERT 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 +-------------------------- + Success: +(1 row) +2:select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -R 0 -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +2:select status = 'd' from gp_segment_configuration where content = 0 and role = 'm'; + ?column? +---------- + t +(1 row) +-- At this point, content 0 mirror is promoted and the primary is marked down. +-- the gang used by the previous insert is no longer valid. It must be destroyed +-- and the transaction must be aborted. +1:insert into test_fts_session_reset select * from generate_series(21,40); +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) +1:select count(*) from test_fts_session_reset; + count +------- + 0 +(1 row) +2:select pg_sleep(30); + pg_sleep +---------- + +(1 row) +2:select gp_inject_fault('fts_conn_startup_packet', 'reset', dbid) from gp_segment_configuration where content=0; + gp_inject_fault +----------------- + Success: + Success: +(2 rows) +1q: ... +2q: ... + +-- expect one primary is down and mirror is promoted to primary +select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0 order by role; + content | preferred_role | role | status | mode +---------+----------------+------+--------+------ + 0 | p | m | d | n + 0 | m | p | u | n +(2 rows) + +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +!\retcode gprecoverseg -ar; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/gdd/avoid-qd-deadlock.out b/src/test/singlenode_isolation2/expected/gdd/avoid-qd-deadlock.out new file mode 100644 index 00000000000..81825036cbc --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/avoid-qd-deadlock.out @@ -0,0 +1,43 @@ +DROP TABLE IF EXISTS tsudf; +DROP + +CREATE TABLE tsudf (c int, d int); +CREATE + +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 + +INSERT INTO tsudf select i, i+1 from generate_series(1,10) i; +INSERT 10 + +SELECT gp_inject_fault('upgrade_row_lock', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('upgrade_row_lock', 'sleep', '', '', '', 1, -1, 10, 1); + gp_inject_fault +----------------- + Success: +(1 row) + +3&: SELECT * FROM func1(1); +4: SELECT * FROM func1(2); + func1 +------- + 2 +(1 row) + +3<: <... completed> + func1 +------- + 1 +(1 row) +3q: ... +4q: ... + +SELECT gp_inject_fault('upgrade_row_lock', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/gdd/concurrent_update.out b/src/test/singlenode_isolation2/expected/gdd/concurrent_update.out new file mode 100644 index 00000000000..89de957bdb8 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/concurrent_update.out @@ -0,0 +1,325 @@ +-- Test concurrent update a table with a varying length type +CREATE TABLE t_concurrent_update(a int, b int, c char(84)); +CREATE +INSERT INTO t_concurrent_update VALUES(1,1,'test'); +INSERT 1 + +1: BEGIN; +BEGIN +1: SET optimizer=off; +SET +1: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; +UPDATE 1 +2: SET optimizer=off; +SET +2&: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; +1: END; +END +2<: <... completed> +UPDATE 1 +1: SELECT * FROM t_concurrent_update; + a | b | c +---+----+-------------------------------------------------------------------------------------- + 1 | 21 | test +(1 row) +1q: ... +2q: ... + +DROP TABLE t_concurrent_update; +DROP + +-- Test the concurrent update transaction order on the segment is reflected on master +1: CREATE TABLE t_concurrent_update(a int, b int); +CREATE +1: INSERT INTO t_concurrent_update VALUES(1,1); +INSERT 1 + +2: BEGIN; +BEGIN +2: SET optimizer=off; +SET +2: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; +UPDATE 1 +3: BEGIN; +BEGIN +3: SET optimizer=off; +SET +-- transaction 3 will wait transaction 2 on the segment +3&: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; + +-- transaction 2 suspend before commit, but it will wake up transaction 3 on segment +2: select gp_inject_fault('before_xact_end_procarray', 'suspend', '', 'isolation2test', '', 1, 1, 0, dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +2&: END; +1: select gp_wait_until_triggered_fault('before_xact_end_procarray', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- transaction 3 should wait transaction 2 commit on master +3<: <... completed> +UPDATE 1 +3&: END; +-- the query should not get the incorrect distributed snapshot: transaction 1 in-progress +-- and transaction 2 finished +1: SELECT * FROM t_concurrent_update; + a | b +---+--- + 1 | 1 +(1 row) +1: select gp_inject_fault('before_xact_end_procarray', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +2<: <... completed> +END +3<: <... completed> +END +2q: ... +3q: ... + +1: SELECT * FROM t_concurrent_update; + a | b +---+---- + 1 | 21 +(1 row) +1q: ... + +-- Same test as the above, except the first transaction commits before the +-- second transaction check the wait gxid, it should get the gxid from +-- pg_distributedlog instead of the procarray. +4: BEGIN; +BEGIN +4: SET optimizer=off; +SET +4: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; +UPDATE 1 + +5: BEGIN; +BEGIN +5: SET optimizer=off; +SET +-- suspend before get 'wait gxid' +5: SELECT gp_inject_fault('before_get_distributed_xid', 'suspend', dbid) FROM gp_segment_configuration WHERE role='p' AND content=1; + gp_inject_fault +----------------- + Success: +(1 row) +5&: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; + +6: SELECT gp_wait_until_triggered_fault('before_get_distributed_xid', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content=1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +4: END; +END +4: SELECT gp_inject_fault('before_get_distributed_xid', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=1; + gp_inject_fault +----------------- + Success: +(1 row) + +5<: <... completed> +UPDATE 1 +5: END; +END +6: SELECT * FROM t_concurrent_update; + a | b +---+---- + 1 | 41 +(1 row) +6: DROP TABLE t_concurrent_update; +DROP +4q: ... +5q: ... +6q: ... + +-- Test update distkey +-- IF we enable the GDD, then the lock maybe downgrade to +-- RowExclusiveLock, when we UPDATE the distribution keys, +-- A SplitUpdate node will add to the Plan, then an UPDATE +-- operator may split to DELETE and INSERT. +-- IF we UPDATE the distribution keys concurrently, the +-- DELETE operator will not execute EvalPlanQual and the +-- INSERT operator can not be *blocked*, so it will +-- generate more tuples in the tables. +-- We raise an error when the GDD is enabled and the +-- distribution keys is updated. + +0: create table tab_update_hashcol (c1 int, c2 int) distributed by(c1); +CREATE +0: insert into tab_update_hashcol values(1,1); +INSERT 1 +0: select * from tab_update_hashcol; + c1 | c2 +----+---- + 1 | 1 +(1 row) + +1: begin; +BEGIN +2: begin; +BEGIN +1: update tab_update_hashcol set c1 = c1 + 1 where c1 = 1; +UPDATE 1 +2&: update tab_update_hashcol set c1 = c1 + 1 where c1 = 1; +1: end; +END +2<: <... completed> +ERROR: EvalPlanQual can not handle subPlan with Motion node (seg1 127.0.1.1:7003 pid=34629) +2: end; +END +0: select * from tab_update_hashcol; + c1 | c2 +----+---- + 2 | 1 +(1 row) +0: drop table tab_update_hashcol; +DROP + +-- Test EvalplanQual +-- If we enable the GDD, then the lock maybe downgrade to +-- RowExclusiveLock, so UPDATE/Delete can be executed +-- concurrently, it may trigger the EvalPlanQual function +-- to recheck the qualifications. +-- If the subPlan have Motion node, then we can not execute +-- EvalPlanQual correctly, so we raise an error when +-- GDD is enabled and EvalPlanQual is tiggered. + +0: create table tab_update_epq1 (c1 int, c2 int) distributed randomly; +CREATE +0: create table tab_update_epq2 (c1 int, c2 int) distributed randomly; +CREATE +0: insert into tab_update_epq1 values(1,1); +INSERT 1 +0: insert into tab_update_epq2 values(1,1); +INSERT 1 +0: select * from tab_update_epq1; + c1 | c2 +----+---- + 1 | 1 +(1 row) +0: select * from tab_update_epq2; + c1 | c2 +----+---- + 1 | 1 +(1 row) + +1: set optimizer = off; +SET +2: set optimizer = off; +SET + +1: begin; +BEGIN +2: begin; +BEGIN +1: update tab_update_epq1 set c1 = c1 + 1 where c2 = 1; +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 +2<: <... completed> +ERROR: EvalPlanQual can not handle subPlan with Motion node (seg0 127.0.1.1:7002 pid=108407) +2: end; +END + +0: select * from tab_update_epq1; + c1 | c2 +----+---- + 2 | 1 +(1 row) +0: drop table tab_update_epq1; +DROP +0: drop table tab_update_epq2; +DROP +0q: ... + +-- split update is to implement updating on hash keys, +-- it deletes the tuple and insert a new tuple in a +-- new segment, so it is not easy for other transaction +-- to follow the update link to fetch the new tuple. The +-- other transaction should raise error for such case. +-- the following case should be tested with GDD enabled. +-- 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 +0:insert into t_splitupdate_raise_error values (1, 1); +INSERT 1 + +-- test delete will throw error +1: begin; +BEGIN +1: update t_splitupdate_raise_error set a = a + 1; +UPDATE 1 + +2: begin; +BEGIN +2&: delete from t_splitupdate_raise_error; + +1: end; +END +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 +1q: ... +2q: ... + +-- test norm update will throw error +1: begin; +BEGIN +1: update t_splitupdate_raise_error set a = a + 1; +UPDATE 1 + +2: begin; +BEGIN +2&: update t_splitupdate_raise_error set b = 999; + +1: end; +END +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 +1q: ... +2q: ... + +-- test select for update will throw error +-- Currently, select for update will reduce lock-level +-- under some very simple cases, see checkCanOptSelectLockingClause +-- for details. + +1: begin; +BEGIN +1: update t_splitupdate_raise_error set a = a + 1; +UPDATE 1 + +2: begin; +BEGIN +-- TODO: turn off orca, we should fix this until ORCA +-- can generate lockrows plannode. +2: set optimizer = off; +SET +2&: select * from t_splitupdate_raise_error for update; + +1: end; +END +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 +1q: ... +2q: ... + +0:drop table t_splitupdate_raise_error; +DROP diff --git a/src/test/singlenode_isolation2/expected/gdd/delete-deadlock-root-leaf-concurrent-op.out b/src/test/singlenode_isolation2/expected/gdd/delete-deadlock-root-leaf-concurrent-op.out new file mode 100644 index 00000000000..1b4dd43bf0a --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/delete-deadlock-root-leaf-concurrent-op.out @@ -0,0 +1,47 @@ +DROP TABLE IF EXISTS part_tbl; +DROP +CREATE TABLE part_tbl (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(2) EVERY(1)); +CREATE +INSERT INTO part_tbl SELECT i, 1, i FROM generate_series(1,100)i; +INSERT 100 + +-- check gdd is enabled +show gp_enable_global_deadlock_detector; + gp_enable_global_deadlock_detector +------------------------------------ + on +(1 row) +1:BEGIN; +BEGIN +1:DELETE FROM part_tbl_1_prt_1 WHERE c = segid(2,1); +DELETE 1 + +2:BEGIN; +BEGIN +2:DELETE FROM part_tbl WHERE c = segid(1,1); +DELETE 1 + +-- the below delete will wait to acquire the transaction lock to delete the tuple +-- held by Session 2 +1&:DELETE FROM part_tbl_1_prt_1 WHERE c = segid(1,1); + +-- the below delete will wait to acquire the transaction lock to delete the tuple +-- held by Session 1 +-- +-- It is possible that GDD gets triggered immediately, so use '2>:' instead of +-- '2&:' for stable output. +2>:DELETE FROM part_tbl WHERE c = segid(2,1); + +1<: <... completed> +DELETE 1 +2<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" + +-- since gdd is on, Session 2 will be cancelled. + +1:ROLLBACK; +ROLLBACK +2:ROLLBACK; +ROLLBACK +DROP TABLE IF EXISTS part_tbl; +DROP diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-01.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-01.out new file mode 100644 index 00000000000..3cedc30f509 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-01.out @@ -0,0 +1,38 @@ +DROP TABLE IF EXISTS t01; +DROP +CREATE TABLE t01 (id int, val int); +CREATE +INSERT INTO t01 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN + +10: UPDATE t01 SET val=val WHERE id=segid(0,1); +UPDATE 1 + +20: UPDATE t01 SET val=val WHERE id=segid(1,1); +UPDATE 1 +-- seg 0: con20 ==> con10, xid lock +20&: UPDATE t01 SET val=val WHERE id=segid(0,1); + +-- seg 1: con10 ==> con20, xid lock +10>: UPDATE t01 SET val=val WHERE id=segid(1,1); + +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +UPDATE 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-04.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-04.out new file mode 100644 index 00000000000..c393a69b54b --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-04.out @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS t04a; +DROP +CREATE TABLE t04a (id int, val int); +CREATE +INSERT INTO t04a (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +DROP TABLE IF EXISTS t04b; +DROP + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN + +10: UPDATE t04a SET val=val WHERE id=segid(0,1); +UPDATE 1 +10: CREATE TABLE t04b (id int); +CREATE + +20: UPDATE t04a SET val=val WHERE id=segid(1,1); +UPDATE 1 + +-- seg 1: con10 ==> con20, xid lock +10&: UPDATE t04a SET val=val WHERE id=segid(1,1); + +-- seg -1: con20 ==> con10, xid lock +20>: CREATE TABLE t04b (id int); + +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +UPDATE 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-05.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-05.out new file mode 100644 index 00000000000..57a8dced788 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-05.out @@ -0,0 +1,36 @@ +DROP TABLE IF EXISTS t05; +DROP +CREATE TABLE t05 (id int primary key); +CREATE + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN + +10: INSERT INTO t05 VALUES(segid(0,1)); +INSERT 1 + +20: INSERT INTO t05 VALUES(segid(1,1)); +INSERT 1 +-- seg 0: con20 ==> con10, xid lock +20&: INSERT INTO t05 VALUES(segid(0,1)); + +-- seg 1: con10 ==> con20, xid lock +10>: INSERT INTO t05 VALUES(segid(1,1)); + +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +INSERT 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-06.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-06.out new file mode 100644 index 00000000000..08202fcc758 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-06.out @@ -0,0 +1,39 @@ +DROP TABLE IF EXISTS t06; +DROP +CREATE TABLE t06 (id int, val int); +CREATE +INSERT INTO t06 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN + +10: UPDATE t06 SET val=7 WHERE val=segid(0,1); +UPDATE 1 + +20: UPDATE t06 SET val=8 WHERE val=segid(1,1); +UPDATE 1 + +-- seg 1: con10 ==> con20, xid lock +10&: UPDATE t06 SET val=8 WHERE val=segid(1,1); + +-- seg 0: con20 ==> con10, xid lock +20>: UPDATE t06 SET val=7 WHERE val=segid(0,1); + +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +UPDATE 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-07.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-07.out new file mode 100644 index 00000000000..40e2fa8253d --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-07.out @@ -0,0 +1,69 @@ +DROP TABLE IF EXISTS t07a; +DROP +DROP TABLE IF EXISTS t07b; +DROP +CREATE TABLE t07a (c1 int, c2 int); +CREATE +CREATE TABLE t07b (c1 int, c2 int); +CREATE +INSERT INTO t07a (c1, c2) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 +INSERT INTO t07b (c1, c2) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET +30: RESET optimizer; +RESET +40: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN +40: BEGIN; +BEGIN + +10: UPDATE t07b SET c2 = 11 WHERE c1 = segid(0,1); +UPDATE 1 + +20: UPDATE t07b SET c2 = 22 WHERE c1 = segid(1,1); +UPDATE 1 + +30: LOCK t07a; +LOCK +-- seg 0: con30 ==> con10, xid lock +30&: UPDATE t07b SET c2 = 21 WHERE c1 = segid(0,1); + +-- seg 1: con10 ==> con20, xid lock +10&: UPDATE t07b SET c2 = 12 WHERE c1 = segid(1,1); + +40: UPDATE t07b SET c2 = 13 WHERE c1 = segid(0,2); +UPDATE 1 +-- seg -1: con40 ==> con30, relation lock +40&: LOCK t07a; + +-- set 0: con20 ==> con40, xid lock +20>: UPDATE t07b SET c2 = 23 WHERE c1 = segid(0,2); + +-- con40 will be cancelled by gdd +40<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +40q: ... + +-- no more deadlock +20<: <... completed> +UPDATE 1 +20q: ... +10<: <... completed> +UPDATE 1 +10q: ... +30<: <... completed> +UPDATE 1 +30q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-102.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-102.out new file mode 100644 index 00000000000..c7ecda8664e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-102.out @@ -0,0 +1,46 @@ +DROP TABLE IF EXISTS t102; +DROP +CREATE TABLE t102 (id int, val int); +CREATE +INSERT INTO t102 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET +30: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN + +30: UPDATE t102 SET val=30 WHERE id=segid(1,1); +UPDATE 1 + +10: UPDATE t102 SET val=10 WHERE id=segid(0,1); +UPDATE 1 + +20: UPDATE t102 SET val=10 WHERE id=segid(1,2); +UPDATE 1 +-- seg 0: con20 ==> con10, xid lock +-- seg 1: con20 ==> con30, xid lock +20&: UPDATE t102 SET val=20 WHERE id IN (segid(0,1), segid(1,1)); + +-- seg 1: con10 ==> con20, xid lock +10>: UPDATE t102 SET val=10 WHERE id=segid(1,2); + +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +UPDATE 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-103.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-103.out new file mode 100644 index 00000000000..befd5eaab5d --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-103.out @@ -0,0 +1,50 @@ +DROP TABLE IF EXISTS t103; +DROP +CREATE TABLE t103 (id int, val int); +CREATE +INSERT INTO t103 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET +30: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN + +10: UPDATE t103 SET val=val WHERE id=segid(0,1); +UPDATE 1 +10: UPDATE t103 SET val=val WHERE id=segid(1,2); +UPDATE 1 + +20: UPDATE t103 SET val=val WHERE id=segid(1,1); +UPDATE 1 +-- seg 0: con20 ==> con10, xid lock +20&: UPDATE t103 SET val=val WHERE id=segid(0,1); + +-- seg 1: con30 ==> con10, xid lock +30>: UPDATE t103 SET val=val WHERE id=segid(1,2); + +-- seg 1: con10 ==> con20, xid lock +10>: UPDATE t103 SET val=val WHERE id=segid(1,1); + +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +UPDATE 1 +10q: ... +30<: <... completed> +UPDATE 1 +30q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-104.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-104.out new file mode 100644 index 00000000000..7feeb022c89 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-104.out @@ -0,0 +1,83 @@ +DROP TABLE IF EXISTS t104; +DROP +CREATE TABLE t104 (id int, val int); +CREATE +INSERT INTO t104 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET +30: RESET optimizer; +RESET +40: RESET optimizer; +RESET +50: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN +40: BEGIN; +BEGIN +50: BEGIN; +BEGIN + +10: UPDATE t104 SET val=val WHERE id=segid(0,1); +UPDATE 1 + +40: UPDATE t104 SET val=val WHERE id=segid(1,4); +UPDATE 1 + +30: UPDATE t104 SET val=val WHERE id IN (segid(0,3), segid(1,3)); +UPDATE 2 +-- seg 1: con30 ==> con40, xid lock +30&: UPDATE t104 SET val=val WHERE id=segid(1,4); + +50: UPDATE t104 SET val=val WHERE id=segid(1,5); +UPDATE 1 +-- seg 1: con50 ==> con30, xid lock +50&: UPDATE t104 SET val=val WHERE id=segid(1,3); + +20: UPDATE t104 SET val=val WHERE id=segid(1,2); +UPDATE 1 +-- seg 0: con20 ==> con10, xid lock +-- seg 1: con20 ==> con50, xid lock +20&: UPDATE t104 SET val=val WHERE id IN (segid(0,1), segid(1,5)); + +-- below two queries will cause two connected small deadlocks which form a big +-- deadlock, to break this big one at least two transactions should be +-- cancelled, but current logic will cancel the youngest transactions in turn, +-- so one extra transaction will be cancelled. +-- +-- this might be improved in the future. + +-- seg 0: con40 ==> con30, xid lock +40>: UPDATE t104 SET val=val WHERE id=segid(0,3); + +-- seg 1: con10 ==> con20, xid lock +10>: UPDATE t104 SET val=val WHERE id=segid(1,2); + +-- con50, con40, con20 will be cancelled by gdd +50<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +50q: ... +40<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +40q: ... +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +30<: <... completed> +UPDATE 1 +30q: ... +10<: <... completed> +UPDATE 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-106.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-106.out new file mode 100644 index 00000000000..4441f8d94ef --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-106.out @@ -0,0 +1,55 @@ +DROP TABLE IF EXISTS t106; +DROP +CREATE TABLE t106 (id int, val int); +CREATE +INSERT INTO t106 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET +30: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN + +30: UPDATE t106 SET val=30 WHERE id=segid(1,1); +UPDATE 1 + +10: UPDATE t106 SET val=10 WHERE val=segid(0,2); +UPDATE 1 + +-- seg 1: con20 ==> con30, xid lock +20&: UPDATE t106 SET val=20 WHERE val=segid(1,1); + +SELECT barrier(); + barrier +--------- + +(1 row) + +-- seg 1: con10 ~~> con20, tuple lock +10&: UPDATE t106 SET val=10 WHERE val=segid(1,1); + +-- seg 0: con30 ==> con10, xid lock +30>: UPDATE t106 SET val=30 WHERE id=segid(0,2); + +-- con30 will be cancelled by gdd +30<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +30q: ... + +-- no more deadlock +20<: <... completed> +UPDATE 1 +20q: ... +10<: <... completed> +UPDATE 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-upsert.out b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-upsert.out new file mode 100644 index 00000000000..db209932428 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/dist-deadlock-upsert.out @@ -0,0 +1,61 @@ +-- See github issue: https://github.com/greenplum-db/gpdb/issues/9449 +-- insert into t values (x, x) on conflict (a, b) do update set b = yyy. +-- this kind of statement may lock tuples in segment and may lead to +-- global deadlock when GDD is enabled. + +DROP TABLE IF EXISTS t_upsert; +DROP +CREATE TABLE t_upsert (id int, val int) distributed by (id); +CREATE +CREATE UNIQUE INDEX uidx_t_upsert on t_upsert(id, val); +CREATE +INSERT INTO t_upsert (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: 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 + +20: INSERT INTO t_upsert VALUES (segid(1,1), segid(1,1)) on conflict (id, val) do update set val = 888; +INSERT 1 + +select gp_inject_fault('gdd_probe', 'suspend', dbid) from gp_segment_configuration where content=-1 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +select gp_wait_until_triggered_fault('gdd_probe', 1, dbid) from gp_segment_configuration where content=-1 and role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- seg 0: con20 ==> con10, xid lock +20&: INSERT INTO t_upsert VALUES (segid(0,1), segid(0,1)) on conflict (id, val) do update set val = 666; + +-- seg 1: con10 ~~> con20, tuple lock +10&: INSERT INTO t_upsert VALUES (segid(1,1), segid(1,1)) on conflict (id, val) do update set val = 777; + +select gp_inject_fault('gdd_probe', 'reset', dbid) from gp_segment_configuration where content=-1 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +INSERT 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/end.out b/src/test/singlenode_isolation2/expected/gdd/end.out new file mode 100644 index 00000000000..01a10b8a47a --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/end.out @@ -0,0 +1,25 @@ +ALTER SYSTEM RESET gp_enable_global_deadlock_detector; +ALTER +ALTER SYSTEM RESET gp_global_deadlock_detector_period; +ALTER + +-- Use utility session on seg 0 to restart master. This way avoids the +-- situation where session issuing the restart doesn't disappear +-- itself. +1U:SELECT pg_ctl(dir, 'restart') from datadir; + pg_ctl +-------- + OK +(1 row) +-- Start new session on master to make sure it has fully completed +-- recovery and up and running again. +1: SHOW gp_enable_global_deadlock_detector; + gp_enable_global_deadlock_detector +------------------------------------ + off +(1 row) +1: SHOW gp_global_deadlock_detector_period; + gp_global_deadlock_detector_period +------------------------------------ + 2min +(1 row) diff --git a/src/test/singlenode_isolation2/expected/gdd/extended_protocol_test.out b/src/test/singlenode_isolation2/expected/gdd/extended_protocol_test.out new file mode 100644 index 00000000000..1d3fa7784cd --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/extended_protocol_test.out @@ -0,0 +1,3 @@ +! ./extended_protocol_test dbname=isolation2test; +extended_protocol_test test ok! + diff --git a/src/test/singlenode_isolation2/expected/gdd/local-deadlock-03.out b/src/test/singlenode_isolation2/expected/gdd/local-deadlock-03.out new file mode 100644 index 00000000000..0a0fc49e086 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/local-deadlock-03.out @@ -0,0 +1,74 @@ + +-- gdd can also detect local deadlocks, however it might break at +-- different node with the local deadlock detector. To make the local +-- 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 +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) +-- start new session, which should always have newly reflected value +1: SHOW gp_global_deadlock_detector_period; + gp_global_deadlock_detector_period +------------------------------------ + 2min +(1 row) + +DROP TABLE IF EXISTS t03; +DROP +CREATE TABLE t03 (id int, val int); +CREATE +INSERT INTO t03 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET +30: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN + +10: UPDATE t03 SET val=val WHERE id IN (segid(0,2), segid(1,2)); +UPDATE 2 + +20: UPDATE t03 SET val=val WHERE id=segid(0,1); +UPDATE 1 + +30: UPDATE t03 SET val=val WHERE id=segid(1,1); +UPDATE 1 + +-- seg 0: con10 ==> con20, xid lock +-- seg 1: con10 ==> con30, xid lock +10&: UPDATE t03 SET val=val WHERE id IN (segid(0,1), segid(1,1)); + +-- seg 1: con30 ==> con10, xid lock +30>: UPDATE t03 SET val=val WHERE id=segid(1,2); + +-- a local deadlock between con10 & con30 is formed on seg1, +-- con10 will be cancelled by local deadlock detector. +-- note, we must join c20 before c10, otherwise the test will run into infinite +-- waiting if the local deadlock detector cancels c30 instead of c10. +30<: <... completed> +UPDATE 1 +30q: ... +20<: <... completed> +FAILED: Execution failed +20q: ... +10<: <... completed> +ERROR: deadlock detected (seg1 127.0.1.1:7003 pid=52248) +DETAIL: Process 52248 waits for ShareLock on transaction 632; blocked by process 52265. +Process 52265 waits for ShareLock on transaction 631; blocked by process 52248. +HINT: See server log for query details. +CONTEXT: while updating tuple (0,1) in relation "t03" +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/non-lock-105.out b/src/test/singlenode_isolation2/expected/gdd/non-lock-105.out new file mode 100644 index 00000000000..781e6d9929d --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/non-lock-105.out @@ -0,0 +1,62 @@ +DROP TABLE IF EXISTS t105; +DROP +CREATE TABLE t105 (id int, val int); +CREATE +INSERT INTO t105 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +RESET +20: RESET optimizer; +RESET +30: RESET optimizer; +RESET + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN + +30: UPDATE t105 SET val=30 WHERE id=segid(1,1); +UPDATE 1 + +10: UPDATE t105 SET val=10 WHERE val=segid(0,2); +UPDATE 1 + +-- seg 0: con20 ==> con10, xid lock +-- seg 1: con20 ==> con30, xid lock +20&: UPDATE t105 SET val=20 WHERE val=segid(0,2) OR id=segid(1,1); + +SELECT barrier(); + barrier +--------- + +(1 row) + +-- seg 1: con10 ~~> con20, tuple lock +10&: UPDATE t105 SET val=10 WHERE val=segid(1,1); + +-- so far there is no deadlock yet as con30 is idle in transaction +SELECT pg_sleep(20); + pg_sleep +---------- + +(1 row) + +-- when con30 quits the edge from con10 to con20 on seg 1 will change: +-- seg 1: con10 ==> con20, xid lock +-- then a global deadlock is formed +30q: ... + +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +UPDATE 1 +10q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/non-lock-107.out b/src/test/singlenode_isolation2/expected/gdd/non-lock-107.out new file mode 100644 index 00000000000..15cfd6ed4e7 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/non-lock-107.out @@ -0,0 +1,64 @@ +DROP TABLE IF EXISTS t107; +DROP +CREATE TABLE t107 (id int, val int); +CREATE +INSERT INTO t107 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN +40: BEGIN; +BEGIN + +30: UPDATE t107 SET val=30 WHERE id=segid(1,1); +UPDATE 1 + +10: UPDATE t107 SET val=10 WHERE val=segid(0,2); +UPDATE 1 + +20: UPDATE t107 SET val=20 WHERE id=segid(1,2); +UPDATE 1 +-- seg 0: con20 ==> con10, xid lock +-- seg 1: con20 ==> con30, xid lock +20&: UPDATE t107 SET val=20 WHERE val=segid(0,2) OR id=segid(1,1); + +SELECT barrier(); + barrier +--------- + +(1 row) + +-- seg 1: con10 ~~> con20, tuple lock +10&: UPDATE t107 SET val=10 WHERE val=segid(1,1); + +-- seg 1: con40 ==> con20, xid lock +40&: UPDATE t107 SET val=40 WHERE id=segid(1,2); + +-- so far there is no deadlock yet as con30 is idle in transaction +SELECT pg_sleep(20); + pg_sleep +---------- + +(1 row) + +-- when con30 quits the edge from con10 to con20 on seg 1 will change: +-- seg 1: con10 ==> con20, xid lock +-- then a global deadlock is formed +30q: ... + +-- con20 will be cancelled by gdd +20<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" +20q: ... + +-- no more deadlock +10<: <... completed> +UPDATE 1 +10q: ... +40<: <... completed> +UPDATE 1 +40q: ... diff --git a/src/test/singlenode_isolation2/expected/gdd/non-lock-108.out b/src/test/singlenode_isolation2/expected/gdd/non-lock-108.out new file mode 100644 index 00000000000..38ad24eacfa --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/non-lock-108.out @@ -0,0 +1,50 @@ +DROP TABLE IF EXISTS t108; +DROP +CREATE TABLE t108 (id int, val int); +CREATE +INSERT INTO t108 (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +10: BEGIN; +BEGIN +20: BEGIN; +BEGIN +30: BEGIN; +BEGIN + +10: INSERT INTO t108 VALUES(segid(1,1),segid(1,1)); +INSERT 1 + +20: INSERT INTO t108 VALUES(segid(1,1),segid(1,1)); +INSERT 1 + +30: INSERT INTO t108 VALUES(segid(1,1),segid(1,1)); +INSERT 1 + +-- ANALYZE holds ShareUpdateExclusiveLock, they conflict with each other. +-- But they are not conflict with INSERT, So GDD graph on seg1 should be +-- 20 -> 10 and 30 -> 10 and no cycle in this case. +10: ANALYZE t108; +ANALYZE + +20&: ANALYZE t108; + +30&: ANALYZE t108; + +SELECT pg_sleep(20); + pg_sleep +---------- + +(1 row) + +-- con10/20/30 should finish normally. +10q: ... + +20<: <... completed> +ANALYZE +20q: ... + +30<: <... completed> +ANALYZE +30q: ... + diff --git a/src/test/singlenode_isolation2/expected/gdd/prepare.out b/src/test/singlenode_isolation2/expected/gdd/prepare.out new file mode 100644 index 00000000000..d8940c2d3cf --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/prepare.out @@ -0,0 +1,94 @@ +-- t0r is the reference table to provide the data distribution info. +DROP TABLE IF EXISTS t0p; +DROP +CREATE TABLE t0p (id int, val int); +CREATE +INSERT INTO t0p (id, val) SELECT i, i FROM generate_series(1, 100) i; +INSERT 100 + +DROP TABLE IF EXISTS t0r; +DROP +CREATE TABLE t0r (id int, val int, segid int) DISTRIBUTED REPLICATED; +CREATE +INSERT INTO t0r (id, val, segid) SELECT id, val, gp_segment_id from t0p; +INSERT 100 + +-- GDD tests rely on the data distribution, but depends on the number of +-- the segments the distribution might be different. +-- so we provide this helper function to return the nth id on a segment. +-- * `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 + +-- 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 +-- in below case the order of 10 and 20 on segments results in different +-- waiting relations: +-- +-- 30: UPDATE t SET val=val WHERE id=1; +-- 10&: UPDATE t SET val=val WHERE val=1; +-- 20&: UPDATE t SET val=val WHERE val=1; +-- +-- There is no perfect way to ensure this. The '&' command in the isolation2 +-- framework only ensures that the QD is being blocked, but this might not be +-- true on segments. In fact on slow machines this exception occurs quite +-- offen on heave load. (e.g. when multiple testcases are executed in parallel) +-- +-- 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 + +-- verify the function +-- Data distribution is sensitive to the underlying hash algorithm, we need each +-- segment has enough tuples for test, 10 should be enough. +SELECT segid(0,10) is not null; + ?column? +---------- + t +(1 row) +SELECT segid(1,10) is not null; + ?column? +---------- + t +(1 row) +SELECT segid(2,10) is not null; + ?column? +---------- + t +(1 row) + +--enable GDD + +-- table to just store the master's data directory path on segment. +CREATE TABLE datadir(a int, dir text); +CREATE +INSERT INTO datadir select 1,datadir from gp_segment_configuration where role='p' and content=-1; +INSERT 1 + +ALTER SYSTEM SET gp_enable_global_deadlock_detector TO on; +ALTER +ALTER SYSTEM SET gp_global_deadlock_detector_period TO 5; +ALTER + +-- Use utility session on seg 0 to restart master. This way avoids the +-- situation where session issuing the restart doesn't disappear +-- itself. +1U:SELECT pg_ctl(dir, 'restart') from datadir; + pg_ctl +-------- + OK +(1 row) +-- Start new session on master to make sure it has fully completed +-- recovery and up and running again. +1: SHOW gp_enable_global_deadlock_detector; + gp_enable_global_deadlock_detector +------------------------------------ + on +(1 row) +1: SHOW gp_global_deadlock_detector_period; + gp_global_deadlock_detector_period +------------------------------------ + 5s +(1 row) diff --git a/src/test/singlenode_isolation2/expected/gdd/update-deadlock-root-leaf-concurrent-op.out b/src/test/singlenode_isolation2/expected/gdd/update-deadlock-root-leaf-concurrent-op.out new file mode 100644 index 00000000000..c88976980b4 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gdd/update-deadlock-root-leaf-concurrent-op.out @@ -0,0 +1,47 @@ +DROP TABLE IF EXISTS part_tbl; +DROP +CREATE TABLE part_tbl (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(2) EVERY(1)); +CREATE +INSERT INTO part_tbl SELECT i, 1, i FROM generate_series(1,100)i; +INSERT 100 + +-- check gdd is enabled +show gp_enable_global_deadlock_detector; + gp_enable_global_deadlock_detector +------------------------------------ + on +(1 row) +1:BEGIN; +BEGIN +1:UPDATE part_tbl_1_prt_1 SET c = segid(2,1) WHERE c = segid(2,1); +UPDATE 1 + +2:BEGIN; +BEGIN +2:UPDATE part_tbl SET c = segid(1,1) WHERE c = segid(1,1); +UPDATE 1 + +-- the below update will wait to acquire the transaction lock to update the tuple +-- held by Session 2 +1&:UPDATE part_tbl_1_prt_1 SET c = segid(1,1) WHERE c = segid(1,1); + +-- the below update will wait to acquire the transaction lock to update the tuple +-- held by Session 1 +-- +-- It is possible that GDD gets triggered immediately, so use '2>:' instead of +-- '2&:' for stable output. +2>:UPDATE part_tbl SET c = segid(2,1) WHERE c = segid(2,1); + +1<: <... completed> +UPDATE 1 +2<: <... completed> +ERROR: canceling statement due to user request: "cancelled by global deadlock detector" + +-- since gdd is on, Session 2 will be cancelled. + +1:ROLLBACK; +ROLLBACK +2:ROLLBACK; +ROLLBACK +DROP TABLE IF EXISTS part_tbl; +DROP diff --git a/src/test/singlenode_isolation2/expected/gp_terminate_mpp_backends.out b/src/test/singlenode_isolation2/expected/gp_terminate_mpp_backends.out new file mode 100644 index 00000000000..941ccef8ddc --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gp_terminate_mpp_backends.out @@ -0,0 +1,15 @@ +-- test gp_terminate_mpp_backends +1:create table gp_terminate_mpp_backends_t (a int); +CREATE + +select gp_terminate_mpp_backends() from gp_dist_random('gp_id'); + gp_terminate_mpp_backends +--------------------------- + + + +(3 rows) + +-- expect following to fail as writer gang was killed +1:select count(*) from gp_terminate_mpp_backends_t; +ERROR: terminating connection due to administrator command (seg0 slice1 10.138.0.26:7002 pid=26162) diff --git a/src/test/singlenode_isolation2/expected/gpdispatch.out b/src/test/singlenode_isolation2/expected/gpdispatch.out new file mode 100644 index 00000000000..f3e54481655 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gpdispatch.out @@ -0,0 +1,236 @@ +-- Try to verify that a session fatal due to OOM should have no effect on other sessions. +-- Report on https://github.com/greenplum-db/gpdb/issues/12399 + +create extension if not exists gp_inject_fault; +CREATE + +1: select gp_inject_fault('make_dispatch_result_error', 'skip', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +2: begin; +BEGIN + +-- session1 will be fatal. +1: select count(*) > 0 from gp_dist_random('pg_class'); +FATAL: could not allocate resources for segworker communication (cdbdisp_async.c:319) +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- session2 should be ok. +2: select count(*) > 0 from gp_dist_random('pg_class'); + ?column? +---------- + t +(1 row) +2: commit; +COMMIT +1q: ... +2q: ... + +select gp_inject_fault('make_dispatch_result_error', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) + +-- +-- Test case for the WaitEvent of ShareInputScan +-- + +create table test_waitevent(i int); +CREATE +insert into test_waitevent select generate_series(1,1000); +INSERT 1000 + +1: set optimizer = off; +SET +1: set gp_cte_sharing to on; +SET +1: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'suspend', 2); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +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 +-- end_ignore +2: select gp_wait_until_triggered_fault('shareinput_writer_notifyready', 1, 2); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +2: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'resume', 2); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'reset', 2); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2q: ... +1<: <... completed> + sum +-------- + 500500 + 1000 +(2 rows) +1q: ... + +!\retcode grep ShareInputScan /tmp/_gpdb_test_output.txt; +-- start_ignore +(100897,9460,10,"",active,"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;",IPC,ShareInputScan,"Sat Mar 12 23:51:16.151757 2022 PST","Sat Mar 12 23:51:16.151757 2022 PST","Sat Mar 12 23:51:16.14545 2022 PST","Sat Mar 12 23:51:16.151797 2022 PST",127.0.0.1,,63602,,7398,"client backend",f,,,,,,,,f,,f,247,0,unknown) + +-- end_ignore +(exited with code 0) + +-- +-- Test for issue https://github.com/greenplum-db/gpdb/issues/12703 +-- + +-- Case for cdbgang_createGang_async +1: create table t_12703(a int); +CREATE + +1:begin; +BEGIN +-- make a cursor so that we have a named portal +1: declare cur12703 cursor for select * from t_12703; +DECLARE + +2: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=1), 'stop'); + pg_ctl +-------- + OK +(1 row) +-- next sql will trigger FTS to mark seg1 as down +2: select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +-- sleep some seconds until the promotion of mirror 0 is done +2: select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +-- this will go to cdbgang_createGang_async's code path +-- for some segments are DOWN. It should not PANIC even +-- with a named portal existing. +1: select * from t_12703; +ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) +1: abort; +ABORT + +1q: ... +2q: ... + +-- Case for cdbCopyEndInternal +-- Provide some data to copy in +4: insert into t_12703 select * from generate_series(1, 10)i; +INSERT 10 +4: copy t_12703 to '/tmp/t_12703'; +COPY 10 +-- make copy in statement hang at the entry point of cdbCopyEndInternal +4: select gp_inject_fault('cdb_copy_end_internal_start', 'suspend', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +4q: ... +1&: copy t_12703 from '/tmp/t_12703'; +select gp_wait_until_triggered_fault('cdb_copy_end_internal_start', 1, dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- make Gang connection is BAD +select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=2), 'stop'); + pg_ctl +-------- + OK +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +2: select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +2: begin; +BEGIN +select gp_inject_fault('cdb_copy_end_internal_start', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +-- continue copy it should not PANIC +1<: <... completed> +ERROR: MPP detected 1 segment failures, system is reconnected +1q: ... +-- session 2 still alive (means not PANIC happens) +2: select 1; + ?column? +---------- + 1 +(1 row) +2: end; +END +2q: ... + +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +!\retcode gprecoverseg -ar; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/gpdispatch_1.out b/src/test/singlenode_isolation2/expected/gpdispatch_1.out new file mode 100644 index 00000000000..53eb9428415 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gpdispatch_1.out @@ -0,0 +1,377 @@ +-- Try to verify that a session fatal due to OOM should have no effect on other sessions. +-- Report on https://github.com/greenplum-db/gpdb/issues/12399 + +create extension if not exists gp_inject_fault; +CREATE + +1: select gp_inject_fault('make_dispatch_result_error', 'skip', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +2: begin; +BEGIN + +-- session1 will be fatal. +1: select count(*) > 0 from gp_dist_random('pg_class'); +FATAL: could not allocate resources for segworker communication (cdbdisp_async.c:319) +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- session2 should be ok. +2: select count(*) > 0 from gp_dist_random('pg_class'); + ?column? +---------- + t +(1 row) +2: commit; +COMMIT +1q: ... +2q: ... + +select gp_inject_fault('make_dispatch_result_error', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) + +-- +-- Test case for the WaitEvent of ShareInputScan +-- + +create table test_waitevent(i int); +CREATE +insert into test_waitevent select generate_series(1,1000); +INSERT 1000 + +1: set optimizer = off; +SET +1: set gp_cte_sharing to on; +SET +1: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'suspend', 2); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +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 +-- end_ignore +2: select gp_wait_until_triggered_fault('shareinput_writer_notifyready', 1, 2); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +2: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'resume', 2); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'reset', 2); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2q: ... +1<: <... completed> + sum +-------- + 500500 + 1000 +(2 rows) +1q: ... + +!\retcode grep ShareInputScan /tmp/_gpdb_test_output.txt; +-- start_ignore +(100897,9460,10,"",active,"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;",IPC,ShareInputScan,"Sat Mar 12 23:51:16.151757 2022 PST","Sat Mar 12 23:51:16.151757 2022 PST","Sat Mar 12 23:51:16.14545 2022 PST","Sat Mar 12 23:51:16.151797 2022 PST",127.0.0.1,,63602,,7398,"client backend",f,,,,,,,,f,,f,247,0,unknown) + +-- end_ignore +(exited with code 0) + +-- +-- Test for issue https://github.com/greenplum-db/gpdb/issues/12703 +-- + +-- Case for cdbgang_createGang_async +1: create table t_12703(a int); +CREATE + +1:begin; +BEGIN +-- make a cursor so that we have a named portal +1: declare cur12703 cursor for select * from t_12703; +DECLARE + +2: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=1), 'stop'); + pg_ctl +-------- + OK +(1 row) +-- next sql will trigger FTS to mark seg1 as down +2: select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +-- this will go to cdbgang_createGang_async's code path +-- for some segments are DOWN. It should not PANIC even +-- with a named portal existing. +1: select * from t_12703; +ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) +ERROR: Error on receive from seg1 slice1 127.0.1.1:7003 pid=58391: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +1: abort; +ABORT + +1q: ... +2q: ... + +-- Case for cdbCopyEndInternal +-- Provide some data to copy in +4: insert into t_12703 select * from generate_series(1, 10)i; +INSERT 10 +4: copy t_12703 to '/tmp/t_12703'; +COPY 10 +-- make copy in statement hang at the entry point of cdbCopyEndInternal +4: select gp_inject_fault('cdb_copy_end_internal_start', 'suspend', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +4q: ... +1&: copy t_12703 from '/tmp/t_12703'; +select gp_wait_until_triggered_fault('cdb_copy_end_internal_start', 1, dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- make Gang connection is BAD +select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=2), 'stop'); + pg_ctl +-------- + OK +(1 row) +2: select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +2: begin; +BEGIN +select gp_inject_fault('cdb_copy_end_internal_start', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; + gp_inject_fault +----------------- + Success: +(1 row) +-- continue copy it should not PANIC +1<: <... completed> +ERROR: MPP detected 1 segment failures, system is reconnected +1q: ... +-- session 2 still alive (means not PANIC happens) +2: select 1; + ?column? +---------- + 1 +(1 row) +2: end; +END +2q: ... + +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +20211101:14:57:13:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Starting gprecoverseg with args: -aF --no-progress +20211101:14:57:13:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.14950.gaf07f2a6fe build dev' +20211101:14:57:13:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-coordinator Cloudberry Version: 'PostgreSQL 12beta2 (Cloudberry Database 7.0.0-alpha.0+dev.14950.gaf07f2a6fe build dev) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit compiled on Nov 1 2021 11:23:12 (with assert checking)' +20211101:14:57:13:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Obtaining Segment details from coordinator... +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Heap checksum setting is consistent between coordinator and the segments that are candidates for recoverseg +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovery type = Standard +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovery 1 of 2 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Synchronization mode = Full +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance host = zlyu +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance address = zlyu +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast2/demoDataDir1 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance port = 7003 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance host = zlyu +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance address = zlyu +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror2/demoDataDir1 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance port = 7006 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Target = in-place +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovery 2 of 2 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Synchronization mode = Full +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance host = zlyu +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance address = zlyu +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast3/demoDataDir2 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance port = 7004 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance host = zlyu +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance address = zlyu +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror3/demoDataDir2 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance port = 7007 +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Target = in-place +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:14:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Starting to create new pg_hba.conf on primary segments +20211101:14:57:15:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Successfully modified pg_hba.conf on primary segments to allow replication connections +20211101:14:57:15:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-2 segment(s) to recover +20211101:14:57:15:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Ensuring 2 failed segment(s) are stopped +20211101:14:57:17:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Validating remote directories +20211101:14:57:18:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Configuring new segments +. +20211101:14:57:20:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Updating configuration with new mirrors +20211101:14:57:20:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Updating mirrors +20211101:14:57:20:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Starting mirrors +20211101:14:57:20:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-era is fbb165f204b577b2_211101145214 +20211101:14:57:20:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait... +20211101:14:57:21:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Process results... +20211101:14:57:21:101597 gprecoverseg:zlyu:gpadmin-[INFO]:- +20211101:14:57:21:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Triggering FTS probe +20211101:14:57:21:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-******************************** +20211101:14:57:21:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Segments successfully recovered. +20211101:14:57:21:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-******************************** +20211101:14:57:21:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovered mirror segments need to sync WAL with primary segments. +20211101:14:57:21:101597 gprecoverseg:zlyu:gpadmin-[INFO]:-Use 'gpstate -e' to check progress of WAL sync remaining bytes + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +!\retcode gprecoverseg -ar; +-- start_ignore +20211101:14:57:21:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Starting gprecoverseg with args: -ar +20211101:14:57:21:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.14950.gaf07f2a6fe build dev' +20211101:14:57:21:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-coordinator Cloudberry Version: 'PostgreSQL 12beta2 (Cloudberry Database 7.0.0-alpha.0+dev.14950.gaf07f2a6fe build dev) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit compiled on Nov 1 2021 11:23:12 (with assert checking)' +20211101:14:57:21:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Obtaining Segment details from coordinator... +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovery type = Rebalance +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Unbalanced segment 1 of 4 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance host = zlyu +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance address = zlyu +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror2/demoDataDir1 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance port = 7006 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Balanced role = Mirror +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Current role = Primary +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Unbalanced segment 2 of 4 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance host = zlyu +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance address = zlyu +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast2/demoDataDir1 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance port = 7003 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Balanced role = Primary +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Current role = Mirror +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Unbalanced segment 3 of 4 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance host = zlyu +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance address = zlyu +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror3/demoDataDir2 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance port = 7007 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Balanced role = Mirror +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Current role = Primary +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Unbalanced segment 4 of 4 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance host = zlyu +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance address = zlyu +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast3/demoDataDir2 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Unbalanced instance port = 7004 +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Balanced role = Primary +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Current role = Mirror +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Determining primary and mirror segment pairs to rebalance +20211101:14:57:22:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Stopping unbalanced primary segments... +20211101:14:57:23:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Triggering segment reconfiguration +20211101:14:57:28:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Starting segment synchronization +20211101:14:57:28:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-=============================START ANOTHER RECOVER========================================= +20211101:14:57:28:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-local Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.14950.gaf07f2a6fe build dev' +20211101:14:57:28:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-coordinator Cloudberry Version: 'PostgreSQL 12beta2 (Cloudberry Database 7.0.0-alpha.0+dev.14950.gaf07f2a6fe build dev) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit compiled on Nov 1 2021 11:23:12 (with assert checking)' +20211101:14:57:28:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Obtaining Segment details from coordinator... +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Heap checksum setting is consistent between coordinator and the segments that are candidates for recoverseg +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Cloudberry instance recovery parameters +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovery type = Standard +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovery 1 of 2 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Synchronization mode = Incremental +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance host = zlyu +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance address = zlyu +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror2/demoDataDir1 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance port = 7006 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance host = zlyu +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance address = zlyu +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast2/demoDataDir1 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance port = 7003 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Target = in-place +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovery 2 of 2 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Synchronization mode = Incremental +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance host = zlyu +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance address = zlyu +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast_mirror3/demoDataDir2 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Failed instance port = 7007 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance host = zlyu +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance address = zlyu +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance directory = /home/gpadmin/workspace/gpdb/gpAux/gpdemo/datadirs/dbfast3/demoDataDir2 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Source instance port = 7004 +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- Recovery Target = in-place +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:---------------------------------------------------------- +20211101:14:57:29:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Starting to create new pg_hba.conf on primary segments +20211101:14:57:30:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Successfully modified pg_hba.conf on primary segments to allow replication connections +20211101:14:57:30:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-2 segment(s) to recover +20211101:14:57:30:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Ensuring 2 failed segment(s) are stopped +20211101:14:57:32:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Updating configuration with new mirrors +20211101:14:57:32:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Updating mirrors +20211101:14:57:32:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Running pg_rewind on failed segments +zlyu (dbid 6): pg_rewind: no rewind required +zlyu (dbid 7): pg_rewind: no rewind required +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Starting mirrors +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-era is fbb165f204b577b2_211101145214 +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait... +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Process results... +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:- +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Triggering FTS probe +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-******************************** +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Segments successfully recovered. +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-******************************** +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Recovered mirror segments need to sync WAL with primary segments. +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-Use 'gpstate -e' to check progress of WAL sync remaining bytes +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-==============================END ANOTHER RECOVER========================================== +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-****************************************************************** +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-The rebalance operation has completed successfully. +20211101:14:57:36:103065 gprecoverseg:zlyu:gpadmin-[INFO]:-****************************************************************** + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/gpexpand_catalog_lock.out b/src/test/singlenode_isolation2/expected/gpexpand_catalog_lock.out new file mode 100644 index 00000000000..b060a23cfcc --- /dev/null +++ b/src/test/singlenode_isolation2/expected/gpexpand_catalog_lock.out @@ -0,0 +1,249 @@ +drop table if exists t20; +DROP +drop table if exists t30; +DROP + +create table t20 (c1 int, c2 int) distributed by (c1); +CREATE +create table t30 (c1 int, c2 int) distributed by (c1); +CREATE + +-- c10, c11 simulate gpexpand's catalog lock protection +-- they will acquire the catalog lock in exclusive mode + +-- c20, c30 simulate client sessions +-- they will acquire the catalog lock in shared mode + +-- +-- the catalog lock can not be acquired concurrently in exclusive mode +-- + +10: begin; +BEGIN +11: begin; +BEGIN + +-- c10 acquired the catalog lock in exclusive mode +10: select gp_expand_lock_catalog(); + gp_expand_lock_catalog +------------------------ + +(1 row) + +-- c11 has to wait for c10 +11&: select gp_expand_lock_catalog(); + +10: end; +END + +-- c10 released the lock, c11 acquired it now +11<: <... completed> + gp_expand_lock_catalog +------------------------ + +(1 row) +11: end; +END + +-- +-- client sessions do not block each other on catalog changes +-- + +20: begin; +BEGIN +30: begin; +BEGIN + +-- c20 and c30 both acquired the catalog lock in shared mode +20: create table t21 (c1 int, c2 int) distributed by (c1); +CREATE +30: create table t31 (c1 int, c2 int) distributed by (c1); +CREATE + +20: insert into t21 values (1,1); +INSERT 1 +30: insert into t31 values (1,1); +INSERT 1 + +20: rollback; +ROLLBACK +30: rollback; +ROLLBACK + +-- +-- gpexpand must wait for in progress catalog changes to commit/rollback +-- + +10: begin; +BEGIN +20: begin; +BEGIN +30: begin; +BEGIN + +-- c20 and c30 both acquired the catalog lock in shared mode +20: create table t21 (c1 int, c2 int) distributed by (c1); +CREATE +30: create table t31 (c1 int, c2 int) distributed by (c1); +CREATE + +-- c10 can not acquire the lock in exclusive mode ... +10&: select gp_expand_lock_catalog(); + +20: insert into t21 values (1,1); +INSERT 1 +30: insert into t31 values (1,1); +INSERT 1 + +20: rollback; +ROLLBACK +30: rollback; +ROLLBACK + +-- ... until both c20 and c30 released it +10<: <... completed> + gp_expand_lock_catalog +------------------------ + +(1 row) +10: end; +END + +-- +-- the catalog lock can be acquired in order +-- + +10: begin; +BEGIN +20: begin; +BEGIN +30: begin; +BEGIN + +-- c20 acquired the catalog lock in shared mode +20: create table t21 (c1 int, c2 int) distributed by (c1); +CREATE + +-- c10 has to wait for c20 +10&: select gp_expand_lock_catalog(); + +-- c30 can not acquire it already, even in shared mode +30: create table t31 (c1 int, c2 int) distributed by (c1); +ERROR: gpexpand in progress, catalog changes are disallowed. +30: rollback; +ROLLBACK + +-- c20 can still make catalog changes +20: drop table t21; +DROP + +20: rollback; +ROLLBACK + +-- c20 released the lock, c10 acquired it now +10<: <... completed> + gp_expand_lock_catalog +------------------------ + +(1 row) +10: end; +END + +-- +-- gpexpand does not block DMLs or readonly queries to catalogs +-- + +10: begin; +BEGIN +20: begin; +BEGIN +30: begin; +BEGIN + +-- c10 acquired the catalog lock in exclusive mode +10: select gp_expand_lock_catalog(); + gp_expand_lock_catalog +------------------------ + +(1 row) + +-- c20 and c30 can still run DMLs +20: insert into t20 values (1,1); +INSERT 1 +20: select * from t20; + c1 | c2 +----+---- + 1 | 1 +(1 row) +20: update t20 set c2=c1+1; +UPDATE 1 +20: delete from t20; +DELETE 1 + +30: insert into t30 values (1,1); +INSERT 1 +30: select * from t30; + c1 | c2 +----+---- + 1 | 1 +(1 row) +30: update t30 set c2=c1+1; +UPDATE 1 +30: delete from t30; +DELETE 1 + +-- c20 and c30 can also run query catalogs +20: select relname from pg_class where oid='t20'::regclass; + relname +--------- + t20 +(1 row) +30: select relname from pg_class where oid='t30'::regclass; + relname +--------- + t30 +(1 row) + +20: rollback; +ROLLBACK +30: rollback; +ROLLBACK + +10: end; +END + +-- +-- catalog changes are disallowed when gpexpand is in progress +-- + +10: begin; +BEGIN + +-- c20 has an old transaction +20: begin; +BEGIN + +-- c10 acquired the catalog lock in exclusive mode +10: select gp_expand_lock_catalog(); + gp_expand_lock_catalog +------------------------ + +(1 row) + +-- c30 has a new transaction +30: begin; +BEGIN + +-- neither c20 nor c30 are allowed to make catalog changes +20: create table t21 (c1 int, c2 int) distributed by (c1); +ERROR: gpexpand in progress, catalog changes are disallowed. +30: create table t31 (c1 int, c2 int) distributed by (c1); +ERROR: gpexpand in progress, catalog changes are disallowed. + +20: rollback; +ROLLBACK +30: rollback; +ROLLBACK + +10: end; +END diff --git a/src/test/singlenode_isolation2/expected/instr_in_shmem_setup.out b/src/test/singlenode_isolation2/expected/instr_in_shmem_setup.out new file mode 100644 index 00000000000..0a01c288885 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/instr_in_shmem_setup.out @@ -0,0 +1,3 @@ +-- start_ignore +! gpconfig -c gp_enable_query_metrics -v on; ! gpstop -rai; +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/instr_in_shmem_terminate.out b/src/test/singlenode_isolation2/expected/instr_in_shmem_terminate.out new file mode 100644 index 00000000000..6a5dcfa4cb3 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/instr_in_shmem_terminate.out @@ -0,0 +1,283 @@ +-- start_ignore +-- Isolation test for instrumentation in shmem +-- One session executing a query then another session +-- try to cancel/terminate the query, instrumentation +-- slots in shmem should be recycled correctly. + +DROP SCHEMA IF EXISTS QUERY_METRICS CASCADE; +DROP +CREATE SCHEMA QUERY_METRICS; +CREATE +SET SEARCH_PATH=QUERY_METRICS; +SET + +CREATE EXTERNAL WEB TABLE __gp_localid ( localid int ) EXECUTE E'echo $GP_SEGMENT_ID' FORMAT 'TEXT'; +CREATE +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; +GRANT + +CREATE FUNCTION gp_instrument_shmem_detail_f() RETURNS SETOF RECORD AS '$libdir/gp_instrument_shmem', 'gp_instrument_shmem_detail' LANGUAGE C IMMUTABLE; +CREATE +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 TABLE a (id int, c char) DISTRIBUTED BY (id); +CREATE +INSERT INTO a SELECT *, 'a' FROM generate_series(1, 50); +INSERT 50 +SET OPTIMIZER=OFF; +SET +ANALYZE a; +ANALYZE +-- end_ignore + +-- test 1: pg_terminate_backend +-- only this query in instrument slots, expected 1 +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + count +------- + 1 +(1 row) + +CREATE TABLE foo AS SELECT i a, i b FROM generate_series(1, 10) i; +CREATE 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; +-- terminate above query +SELECT pg_terminate_backend(pid, 'test pg_terminate_backend') FROM pg_stat_activity WHERE query LIKE 'EXPLAIN ANALYZE CREATE TEMP TABLE t1 AS SELECT%' ORDER BY pid LIMIT 1; + pg_terminate_backend +---------------------- + t +(1 row) +-- start_ignore +1<: <... completed> +FATAL: terminating connection due to administrator command: "test pg_terminate_backend" +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +1q: ... +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + count +------- + 10 +(1 row) + +-- test 2: pg_cancel_backend +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + count +------- + 1 +(1 row) + +-- this query will be cancelled by 'test pg_cancel_backend' +2&:EXPLAIN ANALYZE CREATE TEMP TABLE t2 AS SELECT count(*) FROM QUERY_METRICS.foo WHERE pg_sleep(200) IS NULL; +-- cancel above query +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') FROM pg_stat_activity WHERE query LIKE 'EXPLAIN ANALYZE CREATE TEMP TABLE t2 AS SELECT%' ORDER BY pid LIMIT 1; + pg_cancel_backend +------------------- + t +(1 row) +-- start_ignore +2<: <... completed> +ERROR: canceling statement due to user request: "test pg_cancel_backend" +2q: ... +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + count +------- + 10 +(1 row) + +-- test 3: DML should expose plan_node_id for whole plan tree +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + count +------- + 1 +(1 row) + +-- this query will be cancelled by 'test pg_cancel_backend' +3&:SET OPTIMIZER TO off;EXPLAIN ANALYZE INSERT INTO QUERY_METRICS.a SELECT *, pg_sleep(20) FROM generate_series(1,10); + +-- validate plan nodes exist in instrument solts +SELECT count(*) FROM pg_sleep(1); + count +------- + 1 +(1 row) +-- segment make no sense in SINGLE_NODE_MODE +-- start_ignore +SELECT ro, CASE WHEN max(nid) > 2 THEN 'ok' ELSE 'wrong' END isok FROM ( SELECT CASE WHEN segid >= 0 THEN 's' ELSE 'm' END ro, nid FROM gp_instrument_shmem_detail WHERE ssid <> (SELECT setting FROM pg_settings WHERE name = 'gp_session_id')::int AND nid > 0 ) dt GROUP BY (ro) ORDER BY ro; + ro | isok +----+------ + m | ok + s | ok +(2 rows) +-- validate no different tmid across segments +SELECT count(*) FROM (SELECT DISTINCT tmid FROM gp_instrument_shmem_detail) t; + count +------- + 1 +(1 row) +-- end_ignore +-- cancel the query +SELECT pg_cancel_backend(pid, 'test DML') FROM pg_stat_activity WHERE query LIKE 'SET OPTIMIZER TO off;EXPLAIN ANALYZE INSERT INTO QUERY_METRICS.a SELECT%' ORDER BY pid LIMIT 1; + pg_cancel_backend +------------------- + t +(1 row) + +-- start_ignore +3<: <... completed> +ERROR: canceling statement due to user request: "test DML" +3q: ... +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + count +------- + 10 +(1 row) + +-- 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) ; +CREATE +INSERT INTO QUERY_METRICS.mergeappend_test SELECT g/100, g/100, g FROM generate_series(1, 500) g; +INSERT 500 +ANALYZE QUERY_METRICS.mergeappend_test; +ANALYZE + +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + count +------- + 1 +(1 row) + +-- this query will be cancelled by 'test pg_cancel_backend' +4&:SET OPTIMIZER TO off;SELECT a, b, array_dims(array_agg(x)) FROM QUERY_METRICS.mergeappend_test r GROUP BY a, b UNION ALL SELECT NULL, NULL, array_dims(array_agg(x)) FROM QUERY_METRICS.mergeappend_test r, pg_sleep(200) ORDER BY 1,2; + +-- validate plan nodes exist in instrument solts +SELECT count(*) FROM pg_sleep(1); + count +------- + 1 +(1 row) +-- segment make no sense in SINGLE_NODE_MODE +-- start_ignore +SELECT ro, CASE WHEN max(nid) > 5 THEN 'ok' ELSE 'wrong' END isok FROM ( SELECT CASE WHEN segid >= 0 THEN 's' ELSE 'm' END ro, nid FROM gp_instrument_shmem_detail WHERE ssid <> (SELECT setting FROM pg_settings WHERE name = 'gp_session_id')::int AND nid > 0 ) dt GROUP BY (ro) ORDER BY ro; + ro | isok +----+------ + m | ok + s | ok +(2 rows) +-- validate no different tmid across segments +SELECT count(*) FROM (SELECT DISTINCT tmid FROM gp_instrument_shmem_detail) t; + count +------- + 1 +(1 row) +-- end_ignore +-- cancel the query +SELECT pg_cancel_backend(pid, 'test MergeAppend') FROM pg_stat_activity WHERE query LIKE 'SET OPTIMIZER TO off;SELECT a, b, array_dims(array_agg(x)) FROM QUERY_METRICS.mergeappend_test%' ORDER BY pid LIMIT 1; + pg_cancel_backend +------------------- + t +(1 row) + +-- start_ignore +4<: <... completed> +ERROR: canceling statement due to user request: "test MergeAppend" +4q: ... +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + count +------- + 10 +(1 row) + +-- test 5: entrydb +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + count +------- + 1 +(1 row) + +-- this query will be cancelled by 'test pg_cancel_backend' +5&:SET OPTIMIZER TO off;EXPLAIN ANALYZE INSERT INTO QUERY_METRICS.a(id) SELECT oid FROM pg_class, pg_sleep(200); + +-- validate QD and entrydb have instrumentations on each backend process +SELECT count(*) FROM pg_sleep(1); + count +------- + 1 +(1 row) +-- segment make no sense in SINGLE_NODE_MODE +-- start_ignore +SELECT count(DISTINCT pid) FROM gp_instrument_shmem_detail WHERE ssid <> (SELECT setting FROM pg_settings WHERE name = 'gp_session_id')::int AND segid < 0 AND nid >= 4; + count +------- + 2 +(1 row) +-- validate no different tmid across segments +SELECT count(*) FROM (SELECT DISTINCT tmid FROM gp_instrument_shmem_detail) t; + count +------- + 1 +(1 row) +-- end_ignore +-- cancel the query +SELECT pg_cancel_backend(pid, 'test entrydb') FROM pg_stat_activity WHERE query LIKE 'SET OPTIMIZER TO off;EXPLAIN ANALYZE INSERT INTO QUERY_METRICS.a(id) SELECT%' ORDER BY pid LIMIT 1; + pg_cancel_backend +------------------- + t +(1 row) + +-- start_ignore +5<: <... completed> +ERROR: canceling statement due to user request: "test entrydb" +5q: ... +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + count +------- + 10 +(1 row) + +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + count +------- + 1 +(1 row) + +-- start_ignore +DROP SCHEMA IF EXISTS QUERY_METRICS CASCADE; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/invalidated_toast_index.out b/src/test/singlenode_isolation2/expected/invalidated_toast_index.out new file mode 100644 index 00000000000..2c7e974813e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/invalidated_toast_index.out @@ -0,0 +1,63 @@ +-- +-- Test to make sure the error for an invalidated toast index is sane. This is +-- done as an isolation2 test to make it easy to update the catalogs on all +-- segments. +-- + +CREATE TABLE toastable_heap(a text, b varchar, c int); +CREATE + +-- Force external storage for toasted columns. +ALTER TABLE toastable_heap ALTER COLUMN a SET STORAGE EXTERNAL; +ALTER +ALTER TABLE toastable_heap ALTER COLUMN b SET STORAGE EXTERNAL; +ALTER + +-- Insert two values that we know will be toasted. +INSERT INTO toastable_heap VALUES(repeat('a',100000), repeat('b',100001), 1); +INSERT 1 +INSERT INTO toastable_heap VALUES(repeat('A',100000), repeat('B',100001), 2); +INSERT 1 + +-- start_ignore +-- +-- Invalidate the index of the toast table for our relation. Because this is a +-- catalog change, we have to execute it on the master and all segments. +-- +-- This is done in an ignore block so it can run correctly with any number of +-- segments. +*U: SET allow_system_table_mods = true; +SET + +SET + +SET + +SET +*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 + +UPDATE 1 + +UPDATE 1 +-- end_ignore + +-- Fetch, slice, save, and delete should all fail. +SELECT * FROM toastable_heap; +ERROR: no valid index found for toast relation with Oid 107484 (tuptoaster.c:101) (seg0 slice1 127.0.0.1:25432 pid=41177) (cdbdisp.c:254) +SELECT substr(a, 500, 1) FROM toastable_heap; +ERROR: no valid index found for toast relation with Oid 107484 (tuptoaster.c:101) (seg0 slice1 127.0.0.1:25432 pid=41177) (cdbdisp.c:254) +UPDATE toastable_heap SET b = repeat('b',100001) WHERE c = 2; +ERROR: no valid index found for toast relation with Oid 107484 (tuptoaster.c:101) (seg0 127.0.0.1:25432 pid=41177) (cdbdisp.c:254) +DELETE FROM toastable_heap WHERE c = 1; +ERROR: no valid index found for toast relation with Oid 107484 (tuptoaster.c:101) (seg2 127.0.0.1:25434 pid=41179) (cdbdisp.c:254) + +-- Don't leave an unusable table in the DB for others to trip over. +DROP TABLE toastable_heap; +DROP diff --git a/src/test/singlenode_isolation2/expected/lockmodes.out b/src/test/singlenode_isolation2/expected/lockmodes.out new file mode 100644 index 00000000000..8ec759ee242 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/lockmodes.out @@ -0,0 +1,1091 @@ +-- table to just store the master's data directory path on segment. +CREATE TABLE lockmodes_datadir(a int, dir text); +CREATE +INSERT INTO lockmodes_datadir select 1,datadir from gp_segment_configuration where role='p' and content=-1; +INSERT 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 + +show gp_enable_global_deadlock_detector; + gp_enable_global_deadlock_detector +------------------------------------ + off +(1 row) + + +-- 1. The firs part of test is with +-- gp_enable_global_deadlock_detector off +-- +-- because local deadlock detector can already detect and handle deadlocks in +-- singlenode mode, locking is acted as if GDD is enabled to provide better +-- concurrency, so locks won't be elevated from RowExclusive to Exclusive, +-- thus the following results are different from cluster mode. + +-- 1.1 test for heap tables +create table t_lockmods (c int); +CREATE +insert into t_lockmods select * from generate_series(1, 5); +INSERT 5 +analyze t_lockmods; +ANALYZE + +create table t_lockmods1 (c int); +CREATE + +create table t_lockmods_rep(c int); +CREATE + +-- 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) ; +CREATE +create unique index uidx_t_lockmodes_upsert on t_lockmods_upsert(a, b); +CREATE +-- add analyze to avoid auto vacuum when executing first insert +analyze t_lockmods_upsert; +ANALYZE + +-- 1.1.1 select for (update|share|key share|no key update) should hold ExclusiveLock on range tables +1: begin; +BEGIN +1: explain select * from t_lockmods for update; + QUERY PLAN +----------------------------------------------------------- + Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods for update; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------ + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods +(2 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods for no key update; + QUERY PLAN +----------------------------------------------------------- + Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods for no key update; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------ + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods +(2 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods for share; + QUERY PLAN +----------------------------------------------------------- + Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods for share; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------ + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods +(2 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods for key share; + QUERY PLAN +----------------------------------------------------------- + Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods for key share; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------ + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods +(2 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods, t_lockmods1 for update; + QUERY PLAN +------------------------------------------------------------------------ + Nested Loop (cost=10000000000.00..10000000752.74 rows=51150 width=20) + -> Seq Scan on t_lockmods1 (cost=0.00..112.30 rows=10230 width=10) + -> Materialize (cost=0.00..1.07 rows=5 width=10) + -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(5 rows) +1: select * from t_lockmods, t_lockmods1 for update; + c | c +---+--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------- + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods + relation | AccessShareLock | t | t_lockmods1 + relation | ExclusiveLock | t | t_lockmods1 +(4 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods, t_lockmods1 for no key update; + QUERY PLAN +------------------------------------------------------------------------ + Nested Loop (cost=10000000000.00..10000000752.74 rows=51150 width=20) + -> Seq Scan on t_lockmods1 (cost=0.00..112.30 rows=10230 width=10) + -> Materialize (cost=0.00..1.07 rows=5 width=10) + -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(5 rows) +1: select * from t_lockmods, t_lockmods1 for no key update; + c | c +---+--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------- + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods + relation | AccessShareLock | t | t_lockmods1 + relation | ExclusiveLock | t | t_lockmods1 +(4 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods, t_lockmods1 for share; + QUERY PLAN +------------------------------------------------------------------------ + Nested Loop (cost=10000000000.00..10000000752.74 rows=51150 width=20) + -> Seq Scan on t_lockmods1 (cost=0.00..112.30 rows=10230 width=10) + -> Materialize (cost=0.00..1.07 rows=5 width=10) + -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(5 rows) +1: select * from t_lockmods, t_lockmods1 for share; + c | c +---+--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------- + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods + relation | AccessShareLock | t | t_lockmods1 + relation | ExclusiveLock | t | t_lockmods1 +(4 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods, t_lockmods1 for key share; + QUERY PLAN +------------------------------------------------------------------------ + Nested Loop (cost=10000000000.00..10000000752.74 rows=51150 width=20) + -> Seq Scan on t_lockmods1 (cost=0.00..112.30 rows=10230 width=10) + -> Materialize (cost=0.00..1.07 rows=5 width=10) + -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(5 rows) +1: select * from t_lockmods, t_lockmods1 for key share; + c | c +---+--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------- + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods + relation | AccessShareLock | t | t_lockmods1 + relation | ExclusiveLock | t | t_lockmods1 +(4 rows) +1: abort; +ABORT + +-- 1.1.2 update | delete should hold ExclusiveLock on result relations +1: begin; +BEGIN +1: update t_lockmods set c = c + 0; +UPDATE 5 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------ + relation | RowExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: delete from t_lockmods; +DELETE 5 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------ + relation | RowExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +-- 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 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------ + relation | RowExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +-- 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 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------------- + relation | RowExclusiveLock | t | t_lockmods_upsert +(1 row) +1: abort; +ABORT + +-- 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; +PREPARE +1: prepare select_for_nokeyupdate as select * from t_lockmods for no key update; +PREPARE +1: prepare select_for_share as select * from t_lockmods for share; +PREPARE +1: prepare select_for_keyshare as select * from t_lockmods for key share; +PREPARE +1: prepare update_tlockmods as update t_lockmods set c = c + 0; +PREPARE +1: prepare delete_tlockmods as delete from t_lockmods; +PREPARE +1: prepare insert_tlockmods as insert into t_lockmods select * from generate_series(1, 5); +PREPARE +1: prepare upsert_tlockmods as insert into t_lockmods_upsert values (1, 1) on conflict(a, b) do update set b = 99; +PREPARE + +1: begin; +BEGIN +1: execute select_for_update; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+------------ + relation | ExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute select_for_nokeyupdate; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+------------ + relation | ExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute select_for_share; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+------------ + relation | ExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute select_for_keyshare; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+------------ + relation | ExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute update_tlockmods; +EXECUTE 5 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------ + relation | RowExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute delete_tlockmods; +EXECUTE 5 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------ + relation | RowExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute insert_tlockmods; +EXECUTE 5 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------ + relation | RowExclusiveLock | t | t_lockmods +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute upsert_tlockmods; +EXECUTE 1 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------------- + relation | RowExclusiveLock | t | t_lockmods_upsert +(1 row) +1: abort; +ABORT + +-- 1.2 test for AO table +create table t_lockmods_ao (c int) with (appendonly=true); +CREATE +insert into t_lockmods_ao select * from generate_series(1, 8); +INSERT 8 +analyze t_lockmods_ao; +ANALYZE +create table t_lockmods_ao1 (c int) with (appendonly=true); +CREATE + +-- 1.2.1 select for (update|share|key share|no key update) should hold ExclusiveLock on range tables +1: begin; +BEGIN +1: explain select * from t_lockmods_ao for update; + QUERY PLAN +-------------------------------------------------------------- + Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods_ao for update; + c +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(8 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+--------------- + relation | AccessShareLock | t | t_lockmods_ao + relation | ExclusiveLock | t | t_lockmods_ao +(2 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods_ao for no key update; + QUERY PLAN +-------------------------------------------------------------- + Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods_ao for no key update; + c +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(8 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+--------------- + relation | AccessShareLock | t | t_lockmods_ao + relation | ExclusiveLock | t | t_lockmods_ao +(2 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods_ao for share; + QUERY PLAN +-------------------------------------------------------------- + Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods_ao for share; + c +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(8 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+--------------- + relation | AccessShareLock | t | t_lockmods_ao + relation | ExclusiveLock | t | t_lockmods_ao +(2 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods_ao for key share; + QUERY PLAN +-------------------------------------------------------------- + Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods_ao for key share; + c +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(8 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+--------------- + relation | AccessShareLock | t | t_lockmods_ao + relation | ExclusiveLock | t | t_lockmods_ao +(2 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods_ao, t_lockmods_ao1 for update; + QUERY PLAN +--------------------------------------------------------------------- + Nested Loop (cost=10000000000.00..10000000001.24 rows=8 width=20) + -> Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10) + -> Seq Scan on t_lockmods_ao1 (cost=0.00..0.01 rows=1 width=10) + Optimizer: Postgres query optimizer +(4 rows) +1: select * from t_lockmods_ao, t_lockmods_ao1 for update; + c | c +---+--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+---------------- + relation | AccessShareLock | t | t_lockmods_ao + relation | ExclusiveLock | t | t_lockmods_ao + relation | AccessShareLock | t | t_lockmods_ao1 + relation | ExclusiveLock | t | t_lockmods_ao1 +(4 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods_ao, t_lockmods_ao1 for no key update; + QUERY PLAN +--------------------------------------------------------------------- + Nested Loop (cost=10000000000.00..10000000001.24 rows=8 width=20) + -> Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10) + -> Seq Scan on t_lockmods_ao1 (cost=0.00..0.01 rows=1 width=10) + Optimizer: Postgres query optimizer +(4 rows) +1: select * from t_lockmods_ao, t_lockmods_ao1 for no key update; + c | c +---+--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+---------------- + relation | AccessShareLock | t | t_lockmods_ao + relation | ExclusiveLock | t | t_lockmods_ao + relation | AccessShareLock | t | t_lockmods_ao1 + relation | ExclusiveLock | t | t_lockmods_ao1 +(4 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods_ao, t_lockmods_ao1 for share; + QUERY PLAN +--------------------------------------------------------------------- + Nested Loop (cost=10000000000.00..10000000001.24 rows=8 width=20) + -> Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10) + -> Seq Scan on t_lockmods_ao1 (cost=0.00..0.01 rows=1 width=10) + Optimizer: Postgres query optimizer +(4 rows) +1: select * from t_lockmods_ao, t_lockmods_ao1 for share; + c | c +---+--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+---------------- + relation | AccessShareLock | t | t_lockmods_ao + relation | ExclusiveLock | t | t_lockmods_ao + relation | AccessShareLock | t | t_lockmods_ao1 + relation | ExclusiveLock | t | t_lockmods_ao1 +(4 rows) +1: abort; +ABORT + +1: begin; +BEGIN +1: explain select * from t_lockmods_ao, t_lockmods_ao1 for key share; + QUERY PLAN +--------------------------------------------------------------------- + Nested Loop (cost=10000000000.00..10000000001.24 rows=8 width=20) + -> Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10) + -> Seq Scan on t_lockmods_ao1 (cost=0.00..0.01 rows=1 width=10) + Optimizer: Postgres query optimizer +(4 rows) +1: select * from t_lockmods_ao, t_lockmods_ao1 for key share; + c | c +---+--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+---------------- + relation | AccessShareLock | t | t_lockmods_ao + relation | ExclusiveLock | t | t_lockmods_ao + relation | AccessShareLock | t | t_lockmods_ao1 + relation | ExclusiveLock | t | t_lockmods_ao1 +(4 rows) +1: abort; +ABORT + +-- 1.2.2 update | delete should hold ExclusiveLock on result relations +1: begin; +BEGIN +1: update t_lockmods_ao set c = c + 0; +UPDATE 8 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+--------------- + relation | ExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: delete from t_lockmods_ao; +DELETE 8 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+--------------- + relation | ExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +-- 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 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+--------------- + relation | RowExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +-- 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; +PREPARE +1: prepare select_for_nokeyupdate_ao as select * from t_lockmods_ao for no key update; +PREPARE +1: prepare select_for_share_ao as select * from t_lockmods_ao for share; +PREPARE +1: prepare select_for_keyshare_ao as select * from t_lockmods_ao for key share; +PREPARE +1: prepare update_tlockmods_ao as update t_lockmods_ao set c = c + 0; +PREPARE +1: prepare delete_tlockmods_ao as delete from t_lockmods_ao; +PREPARE +1: prepare insert_tlockmods_ao as insert into t_lockmods_ao select * from generate_series(1, 5); +PREPARE + +1: begin; +BEGIN +1: execute select_for_update_ao; + c +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(8 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+--------------- + relation | ExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute select_for_nokeyupdate_ao; + c +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(8 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+--------------- + relation | ExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute select_for_share_ao; + c +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(8 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+--------------- + relation | ExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute select_for_keyshare_ao; + c +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(8 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+--------------- + relation | ExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute update_tlockmods_ao; +EXECUTE 8 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+--------------- + relation | ExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute delete_tlockmods_ao; +EXECUTE 8 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+---------------+---------+--------------- + relation | ExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +1: begin; +BEGIN +1: execute insert_tlockmods_ao; +EXECUTE 5 +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+--------------- + relation | RowExclusiveLock | t | t_lockmods_ao +(1 row) +1: abort; +ABORT + +-- 1.3 With limit clause, such case should +-- acquire ExclusiveLock on the whole table and do not generate lockrows node +1: begin; +BEGIN +1: explain select * from t_lockmods order by c limit 1 for update; + QUERY PLAN +----------------------------------------------------------------------- + Limit (cost=1.07..1.08 rows=1 width=10) + -> Sort (cost=1.07..1.09 rows=5 width=10) + Sort Key: c + -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(5 rows) +1: select * from t_lockmods order by c limit 1 for update; + c +--- + 1 +(1 row) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------ + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods +(2 rows) +1: abort; +ABORT + +-- 1.4 For replicated table, we should lock the entire table on ExclusiveLock +1: begin; +BEGIN +1: explain select * from t_lockmods_rep for update; + QUERY PLAN +--------------------------------------------------------------------- + Seq Scan on t_lockmods_rep (cost=0.00..112.30 rows=10230 width=10) + Optimizer: Postgres query optimizer +(2 rows) +1: select * from t_lockmods_rep for update; + c +--- +(0 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+---------------- + relation | AccessShareLock | t | t_lockmods_rep + relation | ExclusiveLock | t | t_lockmods_rep +(2 rows) +1: abort; +ABORT + +-- 1.5 test order-by's plan +1: begin; +BEGIN +1: explain select * from t_lockmods order by c for update; + QUERY PLAN +----------------------------------------------------------------- + Sort (cost=1.11..1.12 rows=5 width=10) + Sort Key: c + -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10) + Optimizer: Postgres query optimizer +(4 rows) +1: select * from t_lockmods order by c for update; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+------------ + relation | AccessShareLock | t | t_lockmods + relation | ExclusiveLock | t | t_lockmods +(2 rows) +1: abort; +ABORT + +-- 1.6 select for update NOWAIT/SKIP LOCKED +-- NOWAIT/SKIP LOCKED should not affect the table-level lock +1: begin; +BEGIN +1: select * from t_lockmods for share; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2&: select * from t_lockmods for update nowait; +1: abort; +ABORT +2<: <... completed> + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) + +1: begin; +BEGIN +1: select * from t_lockmods for share; + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) +2&: select * from t_lockmods for update skip locked; +1: abort; +ABORT +2<: <... completed> + c +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) + +1q: ... +2q: ... + +-- 1.8 Test on DML lock behavior on Partition tables on QDs. +-- This suite will test: +-- * DML on root +-- * DML on one specific leaf +-- For detailed behavior and notes, please refer below +-- cases's comments. +-- Details: https://groups.google.com/a/greenplum.org/g/gpdb-dev/c/wAPKpJzhbpM +-- start_ignore +1:DROP TABLE IF EXISTS t_lockmods_part_tbl_upd_del; +DROP +-- end_ignore + +1:CREATE TABLE t_lockmods_part_tbl_upd_del (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(3) EVERY(1)); +CREATE +1:INSERT INTO t_lockmods_part_tbl_upd_del SELECT i, 1, i FROM generate_series(1,10)i; +INSERT 10 + +-- +1: BEGIN; +BEGIN +1: DELETE FROM t_lockmods_part_tbl_upd_del; +DELETE 10 +-- on QD, there's a lock on the root and the target partition +1: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------------------------------- + relation | RowExclusiveLock | t | t_lockmods_part_tbl_upd_del_1_prt_2 + relation | RowExclusiveLock | t | t_lockmods_part_tbl_upd_del_1_prt_1 + relation | RowExclusiveLock | t | t_lockmods_part_tbl_upd_del +(3 rows) +1: ROLLBACK; +ROLLBACK + +-- +-- The session cannot be reused. +-- +-- The macro RELCACHE_FORCE_RELEASE is defined iff USE_ASSERT_CHECKING is +-- defined, and when RELCACHE_FORCE_RELEASE is defined the relcache is +-- forcefully released when closing the relation. +-- +-- The function generate_partition_qual() will behave differently depends on +-- the existence of the relcache. +-- +-- - if the relation is not cached, it will open it in AccessShareLock mode, +-- and save the relpartbound in the relcache; +-- - if the relation is already cached, it will load the relpartbound from the +-- cache directly without opening the relation; +-- +-- So as a result, in the following transactions we will see an extra +-- AccessShareLock lock in a --enable-cassert build compared to a +-- --disable-cassert build. +-- +-- To make the test results stable, we do not reuse the sessions in the test, +-- all the tests are performed without the relcache. +1q: ... + +1: BEGIN; +BEGIN +1: UPDATE t_lockmods_part_tbl_upd_del SET c = 1 WHERE c = 1; +UPDATE 1 +-- on QD, there's a lock on the root and the target partition +1: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------------------------------- + relation | RowExclusiveLock | t | t_lockmods_part_tbl_upd_del_1_prt_2 + relation | RowExclusiveLock | t | t_lockmods_part_tbl_upd_del_1_prt_1 + relation | AccessShareLock | t | t_lockmods_part_tbl_upd_del + relation | RowExclusiveLock | t | t_lockmods_part_tbl_upd_del +(4 rows) +1: ROLLBACK; +ROLLBACK +1q: ... + +1: BEGIN; +BEGIN +1: DELETE FROM t_lockmods_part_tbl_upd_del_1_prt_1; +DELETE 10 +-- since the delete operation is on leaf part, there will be a lock on QD +1: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------------------------------- + relation | RowExclusiveLock | t | t_lockmods_part_tbl_upd_del_1_prt_1 +(1 row) +1: ROLLBACK; +ROLLBACK +1q: ... + +1: BEGIN; +BEGIN +1: UPDATE t_lockmods_part_tbl_upd_del_1_prt_1 SET c = 1 WHERE c = 1; +UPDATE 1 +-- since the update operation is on leaf part, there will be a lock on QD +1: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+------------------+---------+------------------------------------- + relation | AccessShareLock | t | t_lockmods_part_tbl_upd_del + relation | RowExclusiveLock | t | t_lockmods_part_tbl_upd_del_1_prt_1 +(2 rows) +1: ROLLBACK; +ROLLBACK +1q: ... diff --git a/src/test/singlenode_isolation2/expected/mark_all_aoseg_await_drop.out b/src/test/singlenode_isolation2/expected/mark_all_aoseg_await_drop.out new file mode 100644 index 00000000000..2bdc65236f8 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/mark_all_aoseg_await_drop.out @@ -0,0 +1,68 @@ +-- Ensure all segfiles crossing vacuum threshold but cannot compact +-- due to concurrent transaction should be marked in state +-- AOSEG_STATE_AWAITING_DROP. + +CREATE TABLE mark_all_aoseg_await_drop (a int) WITH (appendonly=true); +CREATE + +-- Create 3 aoseg entries +0: BEGIN; +BEGIN +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +0: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; +INSERT 10 +1: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; +INSERT 10 +2: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; +INSERT 10 +0: COMMIT; +COMMIT +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT + +DELETE FROM mark_all_aoseg_await_drop; +DELETE 30 + +-- We should see all 3 aosegs in state 1 +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('mark_all_aoseg_await_drop'); + segno | state +-------+------- + 1 | 1 + 2 | 1 + 3 | 1 +(3 rows) + +-- VACUUM while another session holds lock +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM mark_all_aoseg_await_drop; + count +------- + 0 +(1 row) +1: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; +INSERT 10 +2: VACUUM mark_all_aoseg_await_drop; +VACUUM +1: END; +END + +-- 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 +-- marked as state 2 because a concurrent transaction has written to +-- it and did not commit before the vacuum got to it. The vacuum +-- correctly skipped segno 1 and continued to cycle through the aoseg +-- entries. +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('mark_all_aoseg_await_drop'); + segno | state +-------+------- + 1 | 1 + 2 | 2 + 3 | 2 + 4 | 1 +(4 rows) diff --git a/src/test/singlenode_isolation2/expected/misc.out b/src/test/singlenode_isolation2/expected/misc.out new file mode 100644 index 00000000000..c4c876ba780 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/misc.out @@ -0,0 +1,75 @@ +-- +-- Validate GPDB can create unique index on a table created in utility mode +-- +-- NOTICE: we must connect to master in utility mode because the oid of table is +-- 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 +-1U: create unique index idx_utilitymode_c1 on utilitymode_primary_key_tab (c1); +CREATE +-1U: drop table utilitymode_primary_key_tab; +DROP + +-- 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.) +0U: begin; +BEGIN +0U: set local enable_seqscan=off; +SET +-- start_ignore +0U: explain analyze select * from gp_segment_configuration order by dbid; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------- + Sort (cost=0.02..0.03 rows=1 width=116) (actual time=0.078..0.087 rows=1 loops=1) + Sort Key: gp_get_segment_configuration.dbid + Sort Method: quicksort Memory: 25kB + -> Function Scan on gp_get_segment_configuration (cost=0.00..0.01 rows=1 width=116) (actual time=0.006..0.008 rows=1 loops=1) + Planning Time: 0.470 ms + (slice0) Executor memory: 134K bytes (seg0). Work_mem: 17K bytes max. + Optimizer: Postgres query optimizer + Execution Time: 0.128 ms +(8 rows) +-- end_ignore +0U: reset enable_seqscan; +RESET +0U: set local enable_indexscan=off; +SET +-- start_ignore +0U: explain analyze select * from gp_segment_configuration order by dbid; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------ + Sort (cost=168.75..174.75 rows=2400 width=108) (actual time=0.067..0.071 rows=4 loops=1) + Sort Key: dbid + Sort Method: quicksort Memory: 50kB + -> Function Scan on gp_get_segment_configuration (cost=0.00..0.01 rows=1 width=116) (actual time=0.002..0.002 rows=1 loops=1) + Planning Time: 0.331 ms + (slice0) Executor memory: 59K bytes (seg0). + Optimizer: Postgres query optimizer + Execution Time: 0.136 ms +(8 rows) +-- end_ignore +0U: rollback; +ROLLBACK + +-- +-- Temp tables should have a different schema name pattern in utility mode. +-- +-- A temp table's schema name used to be pg_temp_ in normal mode +-- and pg_temp_ in utility mode, once the normal-mode session id +-- equals to the utility-mode backend id they will conflict with each other and +-- cause catalog corruption on the segment. +-- +-- 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 +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 +----------- + pg_temp_0 +(1 row) +0U: SELECT substring(n2.nspname FROM 1 FOR 15) FROM pg_namespace n1 JOIN pg_class c ON n1.oid = c.relnamespace JOIN pg_namespace n2 ON n2.nspname = 'pg_toast_temp_0' || substring(n1.nspname FROM 10) WHERE c.relname = 'utilitymode_tmp_tab'; + substring +----------------- + pg_toast_temp_0 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/modify_table_data_corrupt.out b/src/test/singlenode_isolation2/expected/modify_table_data_corrupt.out new file mode 100644 index 00000000000..e5fc04f36f0 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/modify_table_data_corrupt.out @@ -0,0 +1,203 @@ +-- start_matchsubs +-- m/nodeModifyTable.c:\d+/ +-- s/nodeModifyTable.c:\d+/nodeModifyTable.c:XXX/ +-- end_matchsubs + +-- start_ignore +drop table tab1; +DROP +drop table tab2; +DROP +drop table tab3; +DROP +-- end_ignore + +-- We do some check to verify the tuple to delete|update +-- is from the segment it scans out. This case is to test +-- such check. +-- We build a plan that will add motion above result relation, +-- however, does not contain explicit motion to send tuples back, +-- and then login in segment using utility mode to insert some +-- bad data. +-- Then we carefully build some plans for orca and planner, +-- when reading these test cases, pay attention to the bad tuple +-- and see if it is motioned to other segments. + +create table tab1(a int, b int) distributed by (b); +CREATE +create table tab2(a int, b int) distributed by (a); +CREATE +create table tab3 (a int, b int) distributed by (b); +CREATE + +insert into tab1 values (1, 1); +INSERT 1 +insert into tab2 values (1, 1); +INSERT 1 +insert into tab3 values (1, 1); +INSERT 1 + +analyze tab1; +ANALYZE +analyze tab2; +ANALYZE +analyze tab3; +ANALYZE + +set allow_system_table_mods=true; +SET +update pg_class set relpages = 10000 where relname='tab2'; +UPDATE 1 +update pg_class set reltuples = 100000000 where relname='tab2'; +UPDATE 1 +update pg_class set relpages = 100000000 where relname='tab3'; +UPDATE 1 +update pg_class set reltuples = 100000 where relname='tab3'; +UPDATE 1 + +0U: insert into tab1 values (1, 1); +INSERT 1 + +select gp_segment_id, * from tab1; + gp_segment_id | a | b +---------------+---+--- + 1 | 1 | 1 + 0 | 1 | 1 +(2 rows) + +-- For planner, this will error out +explain (costs off) delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; + QUERY PLAN +------------------------------------------------------------------------------------ + Delete on tab1 + -> Hash Join + Hash Cond: (tab3.b = tab1.b) + -> Seq Scan on tab3 + -> Hash + -> Redistribute Motion 3:3 (slice1; segments: 3) + Hash Key: tab1.b + -> Hash Join + Hash Cond: (tab2.a = tab1.a) + -> Seq Scan on tab2 + -> Hash + -> Redistribute Motion 3:3 (slice2; segments: 3) + Hash Key: tab1.a + -> Seq Scan on tab1 + Optimizer: Postgres query optimizer +(15 rows) +begin; +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 + +-- 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; + QUERY PLAN +------------------------------------------------------------------------------------ + Update on tab1 + -> Hash Join + Hash Cond: (tab3.b = tab1.b) + -> Seq Scan on tab3 + -> Hash + -> Redistribute Motion 3:3 (slice1; segments: 3) + Hash Key: tab1.b + -> Hash Join + Hash Cond: (tab2.a = tab1.a) + -> Seq Scan on tab2 + -> Hash + -> Redistribute Motion 3:3 (slice2; segments: 3) + Hash Key: tab1.a + -> Seq Scan on tab1 + Optimizer: Postgres query optimizer +(15 rows) +begin; +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 + +-- 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; + QUERY PLAN +------------------------------------------------------------------------------------------ + Delete on tab1 + -> Explicit Redistribute Motion 3:3 (slice1; segments: 3) + -> Hash Join + Hash Cond: (tab3.a = tab1.b) + -> Seq Scan on tab3 + -> Hash + -> Broadcast Motion 3:3 (slice2; segments: 3) + -> Hash Join + Hash Cond: (tab2.a = tab1.a) + -> Seq Scan on tab2 + -> Hash + -> Redistribute Motion 3:3 (slice3; segments: 3) + Hash Key: tab1.a + -> Seq Scan on tab1 + Optimizer: Postgres query optimizer +(15 rows) +begin; +BEGIN +delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; +DELETE 2 +abort; +ABORT + +-- 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; + QUERY PLAN +------------------------------------------------------------------------------------------ + Update on tab1 + -> Explicit Redistribute Motion 3:3 (slice1; segments: 3) + -> Hash Join + Hash Cond: (tab3.a = tab1.b) + -> Seq Scan on tab3 + -> Hash + -> Broadcast Motion 3:3 (slice2; segments: 3) + -> Hash Join + Hash Cond: (tab2.a = tab1.a) + -> Seq Scan on tab2 + -> Hash + -> Redistribute Motion 3:3 (slice3; segments: 3) + Hash Key: tab1.a + -> Seq Scan on tab1 + Optimizer: Postgres query optimizer +(15 rows) +begin; +BEGIN +update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; +UPDATE 2 +abort; +ABORT + +-- test splitupdate. +-- For orca, the plan contains a redistribute motion, so that +-- this following statement will error out. +-- For planner, the plan is using explicit redistribute motion, +-- the to-delete tuple is set to send back where it is from, so +-- it will not error out. +explain (costs off) update tab1 set b = b + 1; + QUERY PLAN +--------------------------------------------------------------- + Update on tab1 + -> Explicit Redistribute Motion 3:3 (slice1; segments: 3) + -> Split + -> Seq Scan on tab1 + Optimizer: Postgres query optimizer +(5 rows) +begin; +BEGIN +update tab1 set b = b + 1; +UPDATE 2 +abort; +ABORT + +drop table tab1; +DROP +drop table tab2; +DROP +drop table tab3; +DROP diff --git a/src/test/singlenode_isolation2/expected/oom_abort.out b/src/test/singlenode_isolation2/expected/oom_abort.out new file mode 100644 index 00000000000..e93b3c89a2e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/oom_abort.out @@ -0,0 +1,3 @@ +select count(1) from lineitem as a, lineitem as b where a.l_orderkey = b.l_orderkey; +ERROR: Out of memory (seg0 slice1 172.17.0.2:25432 pid=4410) +DETAIL: Per-query VM protect limit reached: current limit is 2048 kB, requested 8388712 bytes, available 1 MB diff --git a/src/test/singlenode_isolation2/expected/oom_mixed_1.out b/src/test/singlenode_isolation2/expected/oom_mixed_1.out new file mode 100644 index 00000000000..036510ebfa7 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/oom_mixed_1.out @@ -0,0 +1,37 @@ +show gp_vmem_protect_limit; + gp_vmem_protect_limit +----------------------- + 20 +(1 row) + +-- start_ignore +select 3 as oom_test; + oom_test +---------- + 3 +(1 row) +(select count(*) from (select o0.o_orderkey from (orders o0 left outer join orders o1 on o0.o_orderkey = o1.o_orderkey left outer join orders o2 on o1.o_orderkey = o2.o_orderkey left outer join orders o3 on o2.o_orderkey = o3.o_orderkey left outer join orders o4 on o3.o_orderkey = o4.o_orderkey left outer join orders o5 on o4.o_orderkey = o5.o_orderkey left outer join orders o6 on o5.o_orderkey = o6.o_orderkey left outer join orders o7 on o6.o_orderkey = o7.o_orderkey left outer join orders o8 on o7.o_orderkey = o8.o_orderkey left outer join orders o9 on o8.o_orderkey = o9.o_orderkey left outer join orders o10 on o9.o_orderkey = o10.o_orderkey left outer join orders o11 on o10.o_orderkey = o11.o_orderkey left outer join orders o12 on o11.o_orderkey = o12.o_orderkey left outer join orders o13 on o12.o_orderkey = o13.o_orderkey left outer join orders o14 on o13.o_orderkey = o14.o_orderkey left outer join orders o15 on o14.o_orderkey = o15.o_orderkey) order by o0.o_orderkey) as foo ); +ERROR: Out of memory (seg0 slice1 172.17.0.2:25432 pid=3154) +DETAIL: Per-query VM protect limit reached: current limit is 2048 kB, requested 524392 bytes, available 0 MB +-- end_ignore + +select count(*) from orders; + count +------- + 40 +(1 row) +select pg_sleep(10); + pg_sleep +---------- + +(1 row) +select * from lineitem where l_orderkey < 100 order by 1, 2, 3, 4 ,5; +ERROR: Out of memory (seg0 slice1 172.17.0.2:25432 pid=3751) +DETAIL: Per-query VM protect limit reached: current limit is 2048 kB, requested 524312 bytes, available 0 MB +-- start_ignore +select count(ps_suppkey) from partsupp where ps_partkey < 10 group by ps_suppkey limit 1; + count +------- + 1 +(1 row) +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/oom_mixed_2.out b/src/test/singlenode_isolation2/expected/oom_mixed_2.out new file mode 100644 index 00000000000..c84a69066bf --- /dev/null +++ b/src/test/singlenode_isolation2/expected/oom_mixed_2.out @@ -0,0 +1,46 @@ +select count(*) from orders; + count +------- + 40 +(1 row) +select pg_sleep(10); + pg_sleep +---------- + +(1 row) +select * from lineitem where l_orderkey < 100 order by 1, 2, 3, 4, 5; +ERROR: Out of memory +DETAIL: Per-query VM protect limit reached: current limit is 2048 kB, requested 1048600 bytes, available 0 MB +-- start_ignore +select count(ps_suppkey) from partsupp where ps_partkey < 10 group by ps_suppkey; + count +------- + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +(22 rows) + +explain analyze select 'foo7', supp_nation, cust_nation, l_year, sum(volume) as revenue from ( select n1.n_name as supp_nation, n2.n_name as cust_nation, extract(year from l_shipdate) as l_year, l_extendedprice * (1 - l_discount) as volume from supplier, lineitem, orders, customer, nation n1, nation n2 where s_suppkey = l_suppkey and o_orderkey = l_orderkey and c_custkey = o_custkey and s_nationkey = n1.n_nationkey and c_nationkey = n2.n_nationkey and ( (n1.n_name = 'MOZAMBIQUE' and n2.n_name = 'GERMANY') or (n1.n_name = 'GERMANY' and n2.n_name = 'MOZAMBIQUE') ) and l_shipdate between date '1995-01-01' and date '1996-12-31' ) as shipping group by supp_nation, cust_nation, l_year order by supp_nation, cust_nation, l_year; +ERROR: Out of memory (seg0 slice3 127.0.0.1:25432 pid=26430) +DETAIL: Per-query VM protect limit reached: current limit is 2048 kB, requested 83200 bytes, available 0 MB +-- end_ignore + diff --git a/src/test/singlenode_isolation2/expected/oom_simple.out b/src/test/singlenode_isolation2/expected/oom_simple.out new file mode 100644 index 00000000000..5dbc5922cbb --- /dev/null +++ b/src/test/singlenode_isolation2/expected/oom_simple.out @@ -0,0 +1,10 @@ +select count(*) from partsupp; + count +------- + 26 +(1 row) +select pg_sleep(20); + pg_sleep +---------- + +(1 row) diff --git a/src/test/singlenode_isolation2/expected/oom_sleep.out b/src/test/singlenode_isolation2/expected/oom_sleep.out new file mode 100644 index 00000000000..d80373dc26b --- /dev/null +++ b/src/test/singlenode_isolation2/expected/oom_sleep.out @@ -0,0 +1,10 @@ +-- start_ignore +1&: SELECT COUNT(1) from lineitem, (SELECT pg_sleep(50)) AS t; +2&: SELECT COUNT(1) from lineitem, (SELECT pg_sleep(50)) AS t; +1<: <... completed> +ERROR: Out of memory (seg0 slice1 172.17.0.2:25432 pid=27988) +DETAIL: Per-query VM protect limit reached: current limit is 2048 kB, requested 26376 bytes, available 0 MB +2<: <... completed> +ERROR: Out of memory (seg0 slice1 172.17.0.2:25432 pid=27997) +DETAIL: Per-query VM protect limit reached: current limit is 2048 kB, requested 524312 bytes, available 0 MB +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/oom_startup_memory.out b/src/test/singlenode_isolation2/expected/oom_startup_memory.out new file mode 100644 index 00000000000..08c1134f81d --- /dev/null +++ b/src/test/singlenode_isolation2/expected/oom_startup_memory.out @@ -0,0 +1,105 @@ +-- OOM should be raised when there are too many idle processes. +-- +-- We have below assumptions in the tests: +-- - number of primary segments: 3; +-- - the startup memory cost for a postgres process: 8MB ~ 14MB; +-- - per query limit: 20MB; +-- - per segment limit: 60MB; + +-- start_matchsubs +-- +-- m/DETAIL: Per-query memory limit reached: current limit is \d+ kB, requested \d+ bytes, has \d+ MB avaiable for this query/ +-- s/\d+/XXX/g +-- +-- m/DETAIL: Vmem limit reached, failed to allocate \d+ bytes from tracker, which has \d+ MB available/ +-- s/\d+/XXX/g +-- +-- m/DETAIL: System memory limit reached, failed to allocate \d+ bytes from system/ +-- s/\d+/XXX/g +-- +-- m/DETAIL: connection to server at .* failed: FATAL: Out of memory/ +-- s/DETAIL: connection to server at .* failed: FATAL: Out of memory/DETAIL: FATAL: Out of memory/ +-- +-- m/(seg\d+ \d+.\d+.\d+.\d+:\d+)/ +-- s/(.*)/(seg IP:PORT)/ +-- +-- end_matchsubs + +-- +-- To reach the per query limit we need at least 3 slices in one query. +-- + +1: select * from gp_dist_random('gp_id') t1 join gp_dist_random('gp_id') t2 using(gpname) join gp_dist_random('gp_id') t3 using(gpname) join gp_dist_random('gp_id') t4 using(gpname) ; + gpname | numsegments | dbid | content | numsegments | dbid | content | numsegments | dbid | content | numsegments | dbid | content +------------+-------------+------+---------+-------------+------+---------+-------------+------+---------+-------------+------+--------- + Cloudberry | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 +(1 row) +1q: ... + +-- +-- To reach the per segment limit we need at least 8 concurrent sessions. +-- + +-- However the per segment limit is not enforced on QD, so below QD-only +-- sessions could all run successfully. +1: select 1; + ?column? +---------- + 1 +(1 row) +2: select 1; + ?column? +---------- + 1 +(1 row) +3: select 1; + ?column? +---------- + 1 +(1 row) +4: select 1; + ?column? +---------- + 1 +(1 row) +5: select 1; + ?column? +---------- + 1 +(1 row) +6: select 1; + ?column? +---------- + 1 +(1 row) +7: select 1; + ?column? +---------- + 1 +(1 row) +8: select 1; + ?column? +---------- + 1 +(1 row) + +-- The per segment limit should be reached on one or more QEs in below +-- sessions, we only care about the last one. +-- start_ignore +1: set gp_vmem_idle_resource_timeout to '1h'; +SET +2: set gp_vmem_idle_resource_timeout to '1h'; +SET +3: set gp_vmem_idle_resource_timeout to '1h'; +SET +4: set gp_vmem_idle_resource_timeout to '1h'; +SET +5: set gp_vmem_idle_resource_timeout to '1h'; +SET +6: set gp_vmem_idle_resource_timeout to '1h'; +SET +7: set gp_vmem_idle_resource_timeout to '1h'; +SET +-- end_ignore +8: set gp_vmem_idle_resource_timeout to '1h'; +SET diff --git a/src/test/singlenode_isolation2/expected/orphan_temp_table.out b/src/test/singlenode_isolation2/expected/orphan_temp_table.out new file mode 100644 index 00000000000..51e02e64231 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/orphan_temp_table.out @@ -0,0 +1,43 @@ +-- Test orphan temp table on coordinator. +-- 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 + +-- panic on segment 0 +1: SELECT gp_inject_fault('before_exec_scan', 'panic', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- trigger 'before_exec_scan' panic in ExecScan +1: SELECT * FROM test_temp_table_cleanup; +ERROR: fault triggered, fault name:'before_exec_scan' fault type:'panic' (seg0 slice1 172.17.0.4:7002 pid=437900) + +-- we should not see the temp table on the coordinator +1: SELECT oid, relname, relnamespace FROM pg_class where relname = 'test_temp_table_cleanup'; + oid | relname | relnamespace +-----+---------+-------------- +(0 rows) + + +-- the temp table is left on segment 0, it should be dropped by autovacuum later +0U: SELECT relname FROM pg_class where relname = 'test_temp_table_cleanup'; + relname +------------------------- + test_temp_table_cleanup +(1 row) + +-- no temp table left on other segments +1U: SELECT oid, relname, relnamespace FROM pg_class where relname = 'test_temp_table_cleanup'; + oid | relname | relnamespace +-----+---------+-------------- +(0 rows) + +1: SELECT gp_inject_fault('before_exec_scan', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/packcore.out b/src/test/singlenode_isolation2/expected/packcore.out new file mode 100644 index 00000000000..b0075dd55b3 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/packcore.out @@ -0,0 +1,26 @@ +-- start_ignore +CREATE LANGUAGE plpython3u; +CREATE +-- end_ignore + +DO LANGUAGE plpython3u $$ import os import sys import glob import shutil import subprocess +if sys.platform not in ('linux', 'linux2'): # packcore only works on linux return +def check_call(cmds): ret = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out = ret.communicate() if ret.returncode != 0: raise SystemError('''\ Command {cmds} returned non-zero exit status {retcode} stdout: {stdout} stderr: {stderr} '''.format(cmds=cmds, retcode=ret.returncode, stdout=out[0], stderr=out[1])) +# generate and verify a packcore tarball # # TODO: packcore can list shared libraries with gdb, ldd, or ld-linux.so, # we should verify all of them, but so far there is no cmdline option to # specify it. although we could rename the commands to fallback to others, # we should not do it, it requires root permission and might corrupt the # developer system. on concourse, gdb is not installed by default, so the # gdb way is not covered by the pipelines. def test_packcore(cmds): # cleanup old files and dirs shutil.rmtree(tarball, ignore_errors=True) shutil.rmtree(dirname, ignore_errors=True) +# generate the tarball, the packcore command should return 0 check_call(cmds) assert os.path.isfile(tarball) +# extract the tarball check_call(['tar', '-zxf', tarball]) assert os.path.isdir(dirname) +# verify that binary and shared libraries are included assert os.path.exists('{}/postgres'.format(dirname)) assert os.path.exists('{}/lib64/ld-linux-x86-64.so.2'.format(dirname)) +if os.path.exists('/usr/bin/gdb'): # load the coredump and run some simple gdb commands os.chdir(dirname) # remove LD_LIBRARY_PATH before invoking gdb ld_library_path = None if 'LD_LIBRARY_PATH' in os.environ: ld_library_path = os.environ.pop('LD_LIBRARY_PATH') check_call(['./runGDB.sh', '--batch', '--nx', '--eval-command=bt', '--eval-command=p main', '--eval-command=p fork']) # restore LD_LIBRARY_PATH to its previous value if ld_library_path is not None: os.environ['LD_LIBRARY_PATH'] = ld_library_path os.chdir('..') +# gzip runs much faster with -1 os.putenv('GZIP', '-1') +# do not put the packcore results under master data, that will cause # failures in other tests os.chdir('/tmp') +gphome = os.getenv('GPHOME') assert gphome +postgres = '{}/bin/postgres'.format(gphome) assert os.path.exists(postgres) +packcore = '{}/sbin/packcore'.format(gphome) assert os.path.exists(packcore) +# 'packcore --help' should return 0 check_call([packcore, '--help']) check_call([packcore, '-h']) +# 'packcore --version' should return 0 check_call([packcore, '--version']) +cores = glob.glob('/tmp/core.postgres.*') if not cores: # no postgres coredump found, skip the packcore tests return +corefile = cores[0] corename = os.path.basename(corefile) tarball = 'packcore-{}.tgz'.format(corename) dirname = 'packcore-{}'.format(corename) +# 'packcore core' should work test_packcore([packcore, corefile]) +# 'packcore -b postgres core' should work test_packcore([packcore, '--binary={}'.format(postgres), corefile]) test_packcore([packcore, '--binary', postgres, corefile]) test_packcore([packcore, '-b', postgres, corefile]) $$; +DO +-- vi: sw=4 et : diff --git a/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/.gitignore b/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/.gitignore new file mode 100644 index 00000000000..68eef9d8974 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/.gitignore @@ -0,0 +1,13 @@ +corner.out +explain.out +extended_query.out +fault_inject.out +privilege.out +replicated_table.out +retrieve_quit_check.out +retrieve_quit_wait.out +security.out +special_query.out +status_check.out +status_wait.out +syntax.out diff --git a/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/set.out b/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/set.out new file mode 100644 index 00000000000..fafeb8a196c --- /dev/null +++ b/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/set.out @@ -0,0 +1,9 @@ +-- Before running test, set statement_timeout to 1 minute so that even if some +-- error make 'gp_wait_parallel_retrieve_cursor()' hang, it will be canceled +-- when timeout. + +!\retcode gpconfig -c statement_timeout -v 60000; +(exited with code 0) +!\retcode gpstop -u; +(exited with code 0) + diff --git a/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/unset.out b/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/unset.out new file mode 100644 index 00000000000..99ee18cb629 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/parallel_retrieve_cursor/unset.out @@ -0,0 +1,4 @@ +!\retcode gpconfig -r statement_timeout; +(exited with code 0) +!\retcode gpstop -u; +(exited with code 0) diff --git a/src/test/singlenode_isolation2/expected/pg_rewind_fail_missing_xlog.out b/src/test/singlenode_isolation2/expected/pg_rewind_fail_missing_xlog.out new file mode 100644 index 00000000000..105ea1de929 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/pg_rewind_fail_missing_xlog.out @@ -0,0 +1,254 @@ +-- Test the bug that if checkpoint.redo before the oldest replication slot LSN +-- is removed/recylced in checkpointer, gprecoverseg (based on pg_rewind) would +-- would fail. + +CREATE TABLE tst_missing_tbl (a int); +CREATE +INSERT INTO tst_missing_tbl values(2),(1),(5); +INSERT 3 + +-- make the test faster. +!\retcode gpconfig -c wal_keep_size -v 128; +(exited with code 0) +!\retcode gpstop -ari; +(exited with code 0) + +-- Test 1: primary was marked down by the master but acetually it keeps running +-- and previously, checkpoints could recycle/remove the checkpoint.redo wal +-- file before the oldest replication slot LSN and thus make pg_rewind fail due +-- to missing xlog file. + +-- Run a checkpoint so that the below sqls won't cause a checkpoint +-- until an explicit checkpoint command is issued by the test. +-- checkpoint_timeout is by default 300 but the below test should be able to +-- finish in 300 seconds. +1: CHECKPOINT; +CHECKPOINT + +0U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); + ?column? +---------- + t +(1 row) +1: INSERT INTO tst_missing_tbl values(2),(1),(5); +INSERT 3 +0U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); + ?column? +---------- + t +(1 row) +1: INSERT INTO tst_missing_tbl values(2),(1),(5); +INSERT 3 +0U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); + ?column? +---------- + t +(1 row) +1: INSERT INTO tst_missing_tbl values(2),(1),(5); +INSERT 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(); + ?column? +---------- + t +(1 row) +1: INSERT INTO tst_missing_tbl values(2),(1),(5); +INSERT 3 + +-- Mark down the primary with content 0 via fts fault injection. +1: SELECT gp_inject_fault_infinite('fts_handle_message', 'error', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Trigger failover and double check. +1: SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +1: SELECT role, preferred_role from gp_segment_configuration where content = 0; + role | preferred_role +------+---------------- + m | p + p | m +(2 rows) + +-- Run two more checkpoints. Previously this causes the checkpoint.redo wal +-- file before the oldest replication slot LSN is recycled/removed. +0M: CHECKPOINT; +CHECKPOINT +0M: CHECKPOINT; +CHECKPOINT + +-- Wait some seconds until the promotion is done. When the query comes too early, +-- the promoted primary is still hot-standby, but we don't support hot-standby now. +2: select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +-- Write something (promote adds a 'End Of Recovery' xlog that causes the +-- divergence between primary and mirror, but I add a write here so that we +-- 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 +2: SELECT gp_segment_id, count(*) from tst_missing_tbl group by gp_segment_id; + gp_segment_id | count +---------------+------- + 0 | 6 + 1 | 6 + 2 | 6 +(3 rows) + +-- Ensure that pg_rewind succeeds. Previously it could fail since the divergence +-- LSN wal file is missing. +!\retcode gprecoverseg -av; +(exited with code 0) +-- In case it fails it should not affect subsequent testing. +!\retcode gprecoverseg -aF; +(exited with code 0) +2: SELECT wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- Test 2 +-- primary is abnormally shutdown, but pg_rewind would call single mode +-- postgres to ensure it clean shutdown and that causes two checkpoints. + +-- See previous comment for why. +3: CHECKPOINT; +CHECKPOINT + +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 +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 +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 +-- 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(); + ?column? +---------- + t +(1 row) +3: INSERT INTO tst_missing_tbl values(2),(1),(5); +INSERT 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; + gp_inject_fault +----------------- + Success: +(1 row) +1U&: CHECKPOINT; +3: SELECT gp_wait_until_triggered_fault('checkpoint_after_redo_calculated', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content = 1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Stop the primary immediately and promote the mirror. +3: SELECT pg_ctl(datadir, 'stop', 'immediate') FROM gp_segment_configuration WHERE role='p' AND content = 1; + pg_ctl +-------- + OK +(1 row) +3: SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +-- Wait for the end of recovery CHECKPOINT completed after the mirror was promoted +3: SELECT gp_inject_fault('checkpoint_after_redo_calculated', 'skip', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 1; + gp_inject_fault +----------------- + Success: +(1 row) +3: SELECT gp_wait_until_triggered_fault('checkpoint_after_redo_calculated', 1, dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +3: SELECT gp_inject_fault('checkpoint_after_redo_calculated', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 1; + gp_inject_fault +----------------- + Success: +(1 row) +3: SELECT role, preferred_role from gp_segment_configuration where content = 1; + role | preferred_role +------+---------------- + m | p + p | m +(2 rows) + +4: INSERT INTO tst_missing_tbl values(2),(1),(5); +INSERT 3 +4: SELECT gp_segment_id, count(*) from tst_missing_tbl group by gp_segment_id; + gp_segment_id | count +---------------+------- + 1 | 11 + 0 | 11 + 2 | 11 +(3 rows) + +-- CHECKPOINT should fail now. +1U<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +1Uq: ... + +-- Ensure that pg_rewind succeeds. For unclean shutdown, there are two +-- checkpoints are introduced in pg_rewind when running single-mode postgres +-- (one is the checkpoint after crash recovery and another is the shutdown +-- checkpoint) and previously the checkpoints clean up the wal files that +-- include the previous checkpoint (before divergence LSN) for pg_rewind and +-- thus makes gprecoverseg (pg_rewind) fail. +!\retcode gprecoverseg -av; +(exited with code 0) +-- In case it fails it should not affect subsequent testing. +!\retcode gprecoverseg -aF; +(exited with code 0) +4: SELECT wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- Cleanup +5: DROP TABLE tst_missing_tbl; +DROP +!\retcode gprecoverseg -ar; +(exited with code 0) +5: SELECT wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) +!\retcode gpconfig -r wal_keep_size; +(exited with code 0) +!\retcode gpstop -ari; +(exited with code 0) diff --git a/src/test/singlenode_isolation2/expected/pg_terminate_backend.out b/src/test/singlenode_isolation2/expected/pg_terminate_backend.out new file mode 100644 index 00000000000..9e803c7222e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/pg_terminate_backend.out @@ -0,0 +1,45 @@ +1:create table terminate_backend_t (a int) ; +CREATE + +-- 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'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- expect this command to be terminated by 'test pg_terminate_backend' +1&: insert into terminate_backend_t values (1); + +select gp_wait_until_triggered_fault('heap_insert', 1, dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- extract the pid for the previous query +SELECT pg_terminate_backend(pid,'test pg_terminate_backend') FROM pg_stat_activity WHERE query like 'insert into terminate_backend_t%' ORDER BY pid LIMIT 1; + pg_terminate_backend +---------------------- + t +(1 row) + +-- EXPECT: session 1 terminated with 'test pg_terminate_backend' +1<: <... completed> +FATAL: terminating connection due to administrator command: "test pg_terminate_backend" +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- query backend to ensure no PANIC on postmaster +select gp_inject_fault('heap_insert', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- the table should be empty if insert was terminated +select * from terminate_backend_t; + a +--- +(0 rows) diff --git a/src/test/singlenode_isolation2/expected/pg_views_concurrent_drop.out b/src/test/singlenode_isolation2/expected/pg_views_concurrent_drop.out new file mode 100644 index 00000000000..aa3c86fc664 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/pg_views_concurrent_drop.out @@ -0,0 +1,36 @@ +1:drop view if exists concurrent_drop_view cascade; +DROP +1:create view concurrent_drop_view as select * from pg_class; +CREATE +1:select viewname from pg_views where viewname = 'concurrent_drop_view'; + viewname +---------------------- + concurrent_drop_view +(1 row) + +-- One transaction drops the view, and before it commits, another +-- transaction selects its definition from pg_views. The view is still +-- visible to the second transaction, but deparsing the view's +-- definition will block until the first transaction ends. And if the +-- first transaction committed, the definition cannot be fetched. +-- It's returned as NULL in that case. (PostgreSQL throws an ERROR, +-- but getting a spurious ERROR when all you do is query pg_views is +-- not nice.) +1:begin; +BEGIN +1:drop view concurrent_drop_view; +DROP +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); + wait_until_waiting_for_required_lock +-------------------------------------- + t +(1 row) +1:commit; +COMMIT +2<: <... completed> + viewname | definition +----------------------+------------ + concurrent_drop_view | +(1 row) diff --git a/src/test/singlenode_isolation2/expected/prepare_limit.out b/src/test/singlenode_isolation2/expected/prepare_limit.out new file mode 100644 index 00000000000..c9479617b27 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/prepare_limit.out @@ -0,0 +1,123 @@ +-- test to verify a bug that causes standby startup fatal with message like +-- "the limit of xxx distributed transactions has been reached". +-- Refer comment in https://github.com/greenplum-db/gpdb/issues/9207 for the +-- context. + +-- We will reset the value to 250 finally so sanity check the current value here. +6: show max_prepared_transactions; + max_prepared_transactions +--------------------------- + 250 +(1 row) +!\retcode gpconfig -c max_prepared_transactions -v 3 --skipvalidation; +(exited with code 0) +-- Enable gp_autostats_mode to make sure the single value insert triger 2pc +!\retcode gpconfig -c gp_autostats_mode -v 'on_no_stats' --skipvalidation; +(exited with code 0) +!\retcode gpstop -ari; +(exited with code 0) + +5: create table prepare_limit1 (a int); +CREATE +5: create table prepare_limit2 (a int); +CREATE +5: create table prepare_limit3 (a int); +CREATE +5: create table prepare_limit4 (a int); +CREATE + +5: select gp_inject_fault_infinite('dtm_before_insert_forget_comitted', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Note first insert after table create triggers auto_stats and leads to 2pc +-- transaction. + +-- (2) is on seg0 +1&: insert into prepare_limit1 values(2); +2&: insert into prepare_limit2 values(2); + +-- (1) is on seg1 +3&: insert into prepare_limit3 values(1); +4&: insert into prepare_limit4 values(1); + +-- wait until these 2pc reach before inserting forget commit. +5: SELECT gp_wait_until_triggered_fault('dtm_before_insert_forget_comitted', 4, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- wait until standby catches up and replays all xlogs. +5: select wait_for_replication_replay (-1, 5000); + wait_for_replication_replay +----------------------------- + t +(1 row) + +-- reset to make testing continue +5: select gp_inject_fault('dtm_before_insert_forget_comitted', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +1<: <... completed> +INSERT 1 +2<: <... completed> +INSERT 1 +3<: <... completed> +INSERT 1 +4<: <... completed> +INSERT 1 + +-- verify that standby is correctly wal streaming. +5: select state from pg_stat_replication; + state +----------- + streaming +(1 row) + +-- verify the tuples are on correct segments so the test assumption is +-- correct. (i.e. tuple 2, 1 are on different segments). +5: select gp_segment_id, * from prepare_limit1; + gp_segment_id | a +---------------+--- + 0 | 2 +(1 row) +5: select gp_segment_id, * from prepare_limit2; + gp_segment_id | a +---------------+--- + 0 | 2 +(1 row) +5: select gp_segment_id, * from prepare_limit3; + gp_segment_id | a +---------------+--- + 1 | 1 +(1 row) +5: select gp_segment_id, * from prepare_limit4; + gp_segment_id | a +---------------+--- + 1 | 1 +(1 row) + +-- cleanup +5: drop table prepare_limit1; +DROP +5: drop table prepare_limit2; +DROP +5: drop table prepare_limit3; +DROP +5: drop table prepare_limit4; +DROP + +-- 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 +-- to 250 which is the default value when demo cluster is created. +!\retcode gpconfig -c max_prepared_transactions -v 250 --skipvalidation; +(exited with code 0) +!\retcode gpconfig -c gp_autostats_mode -v 'none' --skipvalidation; +(exited with code 0) +!\retcode gpstop -ari; +(exited with code 0) diff --git a/src/test/singlenode_isolation2/expected/prepared_xact_deadlock_pg_rewind.out b/src/test/singlenode_isolation2/expected/prepared_xact_deadlock_pg_rewind.out new file mode 100644 index 00000000000..cb59647769e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/prepared_xact_deadlock_pg_rewind.out @@ -0,0 +1,120 @@ +-- Test a recovered (in startup) prepared transaction does not block +-- pg_rewind due to lock conflict of database template1 when it runs the single +-- mode instance to ensure clean shutdown on the target postgres instance. + +-- start_ignore +-- set GUCs to speed-up the test +1: alter system set gp_fts_probe_retries to 2; +ALTER +1: alter system set gp_fts_probe_timeout to 5; +ALTER +1: select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) +--end_ignore + +1: select gp_inject_fault('after_xlog_xact_prepare_flushed', 'suspend', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +2&: create database db_orphan_prepare; +1: select gp_wait_until_triggered_fault('after_xlog_xact_prepare_flushed', 1, dbid) from gp_segment_configuration where role='p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- immediate shutdown the primary and then promote the mirror. +1: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=0), 'stop'); + pg_ctl +-------- + OK +(1 row) +1: select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +1: select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0; + content | preferred_role | role | status | mode +---------+----------------+------+--------+------ + 0 | p | m | d | n + 0 | m | p | u | n +(2 rows) +-- start_ignore +1: select gp_inject_fault('after_xlog_xact_prepare_flushed', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +--end_ignore + +-- wait until promote is finished. +select pg_sleep(2); + pg_sleep +---------- + +(1 row) +0U: select 1; + ?column? +---------- + 1 +(1 row) +0Uq: ... +2<: <... completed> +ERROR: Error on receive from seg0 10.152.8.141:7002 pid=20285: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- restore the cluster. Previously there is a bug the incremental recovery +-- hangs in pg_rewind due to lock conflict. pg_rewinds runs a single-mode +-- postgres to ensure clean shutdown of the postgres. That will recover the +-- unhandled prepared transactions into memory which will hold locks. For +-- example, "create database" will hold the lock of template1 on pg_database +-- with mode 5, but that conflicts with the mode 3 lock which is needed during +-- postgres starting in InitPostgres() and thus pg_rewind hangs forever. +!\retcode gprecoverseg -a; +(exited with code 0) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) +!\retcode gprecoverseg -ar; +(exited with code 0) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- start_ignore +-- reset fts GUCs. +3: alter system reset gp_fts_probe_retries; +ALTER +3: alter system reset gp_fts_probe_timeout; +ALTER +3: select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/prevent_ao_wal.out b/src/test/singlenode_isolation2/expected/prevent_ao_wal.out new file mode 100644 index 00000000000..9b6c36805e4 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/prevent_ao_wal.out @@ -0,0 +1,142 @@ +-- For AO/AOCO tables, their WAL records are only +-- generated for replication purposes (they are not used for crash +-- recovery because AO/AOCO table operations are crash-safe). To decrease +-- disk space usage and to improve performance of AO/AOCO operations, we +-- suppress generation of XLOG_APPENDONLY_INSERT and +-- XLOG_APPENDONLY_TRUNCATE WAL records when wal_level=minimal is +-- specified. +-- This test is supposed to ensure that XLOG_APPENDONLY_INSERT and +-- XLOG_APPENDONLY_TRUNCATE WAL records are not generated when +-- wal_level=minimal is set. +-- Because on mirrored cluster primary segments have replication slots +-- and that conflict with the wal_level=minimal GUC +-- we connect to coordinator in utility mode for AO/AOCO operations and +-- validate WAL records on the coordinator. + +GP_IGNORE: formatted by atmsort.pm +-- start_matchignore +-- m/pg_waldump: fatal: error in WAL record at */ +-- m/.*The 'DISTRIBUTED BY' clause determines the distribution of data*/ +-- m/.*Table doesn't have 'DISTRIBUTED BY' clause*/ +-- end_matchignore +GP_IGNORE: defined new match expression + +-- start_matchsubs +-- m/tx:\s+\d+/ +-- s/tx:\s+\d+/tx: ##/ + +-- m/lsn: \d\/[0-9a-fA-F]+, prev \d\/[0-9a-fA-F]+/ +-- s/lsn: \d\/[0-9a-fA-F]+, prev \d\/[0-9a-fA-F]+/lsn: #\/########, prev #\/########/ + +-- m/rel \d+\/\d+\/\d+/ +-- s/rel \d+\/\d+\/\d+/rel ####\/######\/######/ +-- end_matchsubs +GP_IGNORE: defined new match expression + +-- Create tables (AO, AOCO) +-1U: CREATE TABLE ao_foo (n int) WITH (appendonly=true); +CREATE +-1U: CREATE TABLE aoco_foo (n int, m int) WITH (appendonly=true, orientation=column); +CREATE + +-- Switch WAL file +-1U: SELECT true FROM pg_switch_wal(); + bool +------ + t +(1 row) +-- Insert data (AO) +-1U: INSERT INTO ao_foo SELECT generate_series(1,10); +INSERT 10 +-- Insert data (AOCO) +-1U: INSERT INTO aoco_foo SELECT generate_series(1,10), generate_series(1,10); +INSERT 10 +-- Delete data and run vacuum (AO) +-1U: DELETE FROM ao_foo WHERE n > 5; +DELETE 5 +-1U: VACUUM; +VACUUM +-- Delete data and run vacuum (AOCO) +-1U: DELETE FROM aoco_foo WHERE n > 5; +DELETE 5 +-1U: VACUUM; +VACUUM +-1Uq: ... + +-- 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; +rmgr: Appendonly len (rec/tot): 194/ 194, tx: 12661, lsn: 0/F8000178, prev 0/F8000128, desc: APPENDONLY_INSERT insert: rel 1663/221728/180472 seg/offset:0/0 len:136 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 12662, lsn: 0/F8000400, prev 0/F80003C0, desc: APPENDONLY_INSERT insert: rel 1663/221728/180476 seg/offset:128/0 len:0 +rmgr: Appendonly len (rec/tot): 138/ 138, tx: 12662, lsn: 0/F8000490, prev 0/F8000440, desc: APPENDONLY_INSERT insert: rel 1663/221728/180476 seg/offset:0/0 len:80 +rmgr: Appendonly len (rec/tot): 138/ 138, tx: 12662, lsn: 0/F8000520, prev 0/F8000490, desc: APPENDONLY_INSERT insert: rel 1663/221728/180476 seg/offset:128/0 len:80 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F8000840, prev 0/F8000810, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180472 seg/offset:0/136 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 12664, lsn: 0/F8000A18, prev 0/F80009D8, desc: APPENDONLY_INSERT insert: rel 1663/221728/180472 seg/offset:1/0 len:0 +rmgr: Appendonly len (rec/tot): 146/ 146, tx: 12664, lsn: 0/F8000B38, prev 0/F8000AF8, desc: APPENDONLY_INSERT insert: rel 1663/221728/180472 seg/offset:1/0 len:88 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 12665, lsn: 0/F8000C98, prev 0/F8000C68, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180472 seg/offset:0/0 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F80412F8, prev 0/F80412C8, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180476 seg/offset:0/80 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F8041338, prev 0/F80412F8, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180476 seg/offset:128/80 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F80D2020, prev 0/F80D1FF0, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180445 seg/offset:0/112 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F8307118, prev 0/F83070E8, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180472 seg/offset:1/88 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F8307158, prev 0/F8307118, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180472 seg/offset:0/0 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F8307208, prev 0/F83071D8, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180476 seg/offset:0/80 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F8307248, prev 0/F8307208, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180476 seg/offset:128/80 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 12673, lsn: 0/F8307440, prev 0/F8307400, desc: APPENDONLY_INSERT insert: rel 1663/221728/180476 seg/offset:1/0 len:0 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 12673, lsn: 0/F8307480, prev 0/F8307440, desc: APPENDONLY_INSERT insert: rel 1663/221728/180476 seg/offset:129/0 len:0 +rmgr: Appendonly len (rec/tot): 122/ 122, tx: 12673, lsn: 0/F83075A0, prev 0/F8307560, desc: APPENDONLY_INSERT insert: rel 1663/221728/180476 seg/offset:1/0 len:64 +rmgr: Appendonly len (rec/tot): 122/ 122, tx: 12673, lsn: 0/F8307620, prev 0/F83075A0, desc: APPENDONLY_INSERT insert: rel 1663/221728/180476 seg/offset:129/0 len:64 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 12674, lsn: 0/F8307780, prev 0/F8307750, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180476 seg/offset:0/0 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 12674, lsn: 0/F83077C0, prev 0/F8307780, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180476 seg/offset:128/0 +rmgr: Appendonly len (rec/tot): 58/ 58, tx: 0, lsn: 0/F8327BF0, prev 0/F8327BC0, desc: APPENDONLY_TRUNCATE truncate: rel 1663/221728/180445 seg/offset:0/112 + + +-- *********** Set wal_level=minimal ************** +!\retcode gpconfig -c wal_level -v minimal --masteronly; +(exited with code 0) +-- Set max_wal_senders to 0 because a non-zero value requires wal_level >= 'archive' +!\retcode gpconfig -c max_wal_senders -v 0 --masteronly; +(exited with code 0) +-- Restart QD +!\retcode pg_ctl -l /dev/null -D $COORDINATOR_DATA_DIRECTORY restart -w -t 600 -m fast; +(exited with code 0) + +-- Switch WAL file +-1U: SELECT true FROM pg_switch_wal(); + bool +------ + t +(1 row) +-- Insert data (AO) +-1U: INSERT INTO ao_foo SELECT generate_series(1,10); +INSERT 10 +-- Insert data (AOCO) +-1U: INSERT INTO aoco_foo SELECT generate_series(1,10), generate_series(1,10); +INSERT 10 +-- Delete data and run vacuum (AO) +-1U: DELETE FROM ao_foo WHERE n > 5; +DELETE 5 +-1U: VACUUM; +VACUUM +-- Delete data and run vacuum (AOCO) +-1U: DELETE FROM aoco_foo WHERE n > 5; +DELETE 5 +-1U: VACUUM; +VACUUM + +-- 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; +DROP +-1U: DROP TABLE aoco_foo; +DROP + +-- Reset wal_level +!\retcode gpconfig -r wal_level --masteronly; +(exited with code 0) +-- Reset max_wal_senders +!\retcode gpconfig -r max_wal_senders --masteronly; +(exited with code 0) +-- Restart QD +!\retcode pg_ctl -l /dev/null -D $COORDINATOR_DATA_DIRECTORY restart -w -t 600 -m fast; +(exited with code 0) diff --git a/src/test/singlenode_isolation2/expected/reader_waits_for_lock.out b/src/test/singlenode_isolation2/expected/reader_waits_for_lock.out new file mode 100644 index 00000000000..df9cf7de46f --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reader_waits_for_lock.out @@ -0,0 +1,52 @@ +-- This test validates that a reader process waits if lock is not +-- available. There used to be a bug where reader didn't wait even if +-- lock was held by some other session. + +-- 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 +1: create table reader_waits_for_lock_table(a int, b int) distributed by (a); +CREATE +1: insert into reader_waits_for_lock_table select 1, 1; +INSERT 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 +-- 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. +0U: show gp_session_id; + gp_session_id +--------------- + -1 +(1 row) +-- Run the same query involving at least one reader gang. It should +-- block this time. +1&: SELECT t1.* FROM reader_waits_for_lock_table t1 INNER JOIN reader_waits_for_lock_table t2 ON t1.b = t2.b; +-- At least one reader process from session 1 should be blocked on +-- AccessExclusiveLock held by 0U. That distinct is needed because +-- plans for above select query differ between Orca and planner. +-- Planner generates three slices such that the two reader backends +-- are blocked for the lock. Orca generates two slices such that the +-- reader and as well as the writer are blocked. We get two rows (due +-- to "mppwriter=false" predicate) with planner and one row with Orca. +0U: select check_readers_are_blocked(); + check_readers_are_blocked +--------------------------- + t +(1 row) +0U: select distinct relation::regclass, mode, query 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; + relation | mode | query +-----------------------------+-----------------+----------------------------------------------------------------------------------------------------------- + reader_waits_for_lock_table | AccessShareLock | SELECT t1.* FROM reader_waits_for_lock_table t1 INNER JOIN reader_waits_for_lock_table t2 ON t1.b = t2.b; +(1 row) +0U: COMMIT; +COMMIT +1<: <... completed> + a | b +---+--- + 1 | 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex.out b/src/test/singlenode_isolation2/expected/reindex.out new file mode 100644 index 00000000000..a9eac24f660 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex.out @@ -0,0 +1,66 @@ +-- Dropping table while reindex database should not fail reindex +CREATE DATABASE reindexdb1 TEMPLATE template1; +CREATE +-- halt reindex after scanning the pg_class and getting the relids +SELECT gp_inject_fault_infinite('reindex_db', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1:@db_name reindexdb1: CREATE TABLE heap1(a INT, b INT); +CREATE +1&:REINDEX DATABASE reindexdb1; +SELECT gp_wait_until_triggered_fault('reindex_db', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +2:@db_name reindexdb1:DROP TABLE heap1; +DROP +SELECT gp_inject_fault('reindex_db', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- reindex should complete fine +1<: <... completed> +REINDEX +1q: ... +2q: ... + +-- Adding index after scanning indexes for relation to reindex should +-- not fail reindex +BEGIN; +BEGIN +CREATE TABLE reindex_index1(a int, b int); +CREATE +CREATE INDEX reindex_index1_idx1 on reindex_index1 (b); +CREATE +insert into reindex_index1 select i,i+1 from generate_series(1, 10)i; +INSERT 10 +COMMIT; +COMMIT +SELECT gp_inject_fault_infinite('reindex_relation', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +3&: REINDEX TABLE reindex_index1; +SELECT gp_wait_until_triggered_fault('reindex_relation', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- create one more index +CREATE INDEX reindex_index1_idx2 on reindex_index1 (a); +CREATE +SELECT gp_inject_fault('reindex_relation', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +3<: <... completed> +REINDEX + +DROP DATABASE reindexdb1; +DROP diff --git a/src/test/singlenode_isolation2/expected/reindex/abort_reindex.out b/src/test/singlenode_isolation2/expected/reindex/abort_reindex.out new file mode 100644 index 00000000000..ad5c7d1cef2 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/abort_reindex.out @@ -0,0 +1,45 @@ +DROP TABLE IF EXISTS reindex_abort_ao; +DROP + +CREATE TABLE reindex_abort_ao (a INT) WITH (appendonly=true, orientation=column); +CREATE +insert into reindex_abort_ao select generate_series(1,1000); +INSERT 1000 +create index idx_btree_reindex_abort_ao on reindex_abort_ao(a); +CREATE + +-- start_ignore +drop table if exists reindex_abort_ao_old; +DROP +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 +-- 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); + have_same_number_of_rows +-------------------------- + 1 +(1 row) +-- @Description Ensures that relnode for an index does not change if reindex command is aborted +-- + +1: BEGIN; +BEGIN +1: REINDEX index idx_btree_reindex_abort_ao; +REINDEX +1: ROLLBACK; +ROLLBACK +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_btree_reindex_abort_ao' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) +3: SELECT 1 as relfilenode_didnot_change from pg_class pc, reindex_abort_ao_old re where pc.relname = 'idx_btree_reindex_abort_ao' and pc.relfilenode = re.c_relfilenode and pc.gp_segment_id = re.c_gp_segment_id; + relfilenode_didnot_change +--------------------------- + 1 +(1 row) +3: SELECT * from reindex_abort_ao_old o where o.c_gp_segment_id > -1 and exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') g where relname = 'idx_btree_reindex_abort_ao' and o.c_oid = g.oid and o.c_gp_segment_id = g.gp_segment_id and o.c_relfilenode != g.relfilenode); + c_oid | c_gp_segment_id | c_relfilenode +-------+-----------------+--------------- +(0 rows) diff --git a/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_heap_gist.out b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_heap_gist.out new file mode 100644 index 00000000000..9698c3c04b5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_heap_gist.out @@ -0,0 +1,72 @@ +DROP TABLE IF EXISTS reindex_heap_gist; +DROP + +CREATE TABLE reindex_heap_gist ( 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 + +insert into reindex_heap_gist (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 into reindex_heap_gist (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 + +create index idx_gist_reindex_heap on reindex_heap_gist USING Gist(target); +CREATE + +-- Verify oid is same on all the segments +SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_gist_reindex_heap' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) +-- @Description Ensures that a create index during reindex operations on GiST index is ok +-- + +DELETE FROM reindex_heap_gist WHERE id < 128; +DELETE 254 +1: BEGIN; +BEGIN +1: REINDEX index idx_gist_reindex_heap; +REINDEX +2: create index idx_gist_reindex_heap2 on reindex_heap_gist USING Gist(target); +CREATE +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: SELECT COUNT(*) FROM reindex_heap_gist WHERE id = 1500; + count +------- + 0 +(1 row) +3: select count(*) from reindex_heap_gist; + count +------- + 1746 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_heap_gist; + count +------- + 1746 +(1 row) + +3: insert into reindex_heap_gist (id, owner, description, property, poli, target) values(1500, 'gpadmin', 'Reindex Concurrency test', '((1500, 1500), (1560, 1580))', '( (111, 112), (114, 115), (110, 110) )', '( (96, 86), 96)' ); +INSERT 1 +3: SELECT COUNT(*) FROM reindex_heap_gist WHERE id = 1500; + count +------- + 1 +(1 row) +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_gist_reindex_heap' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_gist_reindex_heap2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_ao_bitmap.out b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_ao_bitmap.out new file mode 100644 index 00000000000..dbcb25dce16 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_ao_bitmap.out @@ -0,0 +1,45 @@ +DROP TABLE IF EXISTS reindex_crtab_ao_bitmap; +DROP + +CREATE TABLE reindex_crtab_ao_bitmap (a INT) WITH (appendonly=true); +CREATE +insert into reindex_crtab_ao_bitmap select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_ao_bitmap select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_ao_bitmap on reindex_crtab_ao_bitmap USING bitmap(a); +CREATE +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 +---------------------- + 1 +(1 row) + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_ao_bitmap WHERE a < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: REINDEX index idx_reindex_crtab_ao_bitmap; +REINDEX +2&: create index idx_reindex_crtab_ao_bitmap2 on reindex_crtab_ao_bitmap USING bitmap(a); +1: COMMIT; +COMMIT +2<: <... completed> +CREATE +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); + oid_same_on_all_segs +---------------------- + 1 +(1 row) +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_ao_bitmap2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_ao_btree.out b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_ao_btree.out new file mode 100644 index 00000000000..61ad0013e20 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_ao_btree.out @@ -0,0 +1,45 @@ +DROP TABLE IF EXISTS reindex_crtab_ao_btree; +DROP + +CREATE TABLE reindex_crtab_ao_btree (a INT) WITH (appendonly=true); +CREATE +insert into reindex_crtab_ao_btree select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_ao_btree select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_ao_btree on reindex_crtab_ao_btree(a); +CREATE +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 +---------------------- + 1 +(1 row) + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_ao_btree WHERE a < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: REINDEX index idx_reindex_crtab_ao_btree; +REINDEX +2&: create index idx_reindex_crtab_ao_btree2 on reindex_crtab_ao_btree(a); +1: COMMIT; +COMMIT +2<: <... completed> +CREATE +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); + oid_same_on_all_segs +---------------------- + 1 +(1 row) +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_ao_btree2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_aoco_bitmap.out b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_aoco_bitmap.out new file mode 100644 index 00000000000..7d00040a7dc --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_aoco_bitmap.out @@ -0,0 +1,45 @@ +DROP TABLE IF EXISTS reindex_crtab_aoco_bitmap; +DROP + +CREATE TABLE reindex_crtab_aoco_bitmap (a INT) WITH (appendonly=true, orientation=column); +CREATE +insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_aoco_bitmap on reindex_crtab_aoco_bitmap USING bitmap(a); +CREATE +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 +---------------------- + 1 +(1 row) + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_aoco_bitmap WHERE a < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: REINDEX index idx_reindex_crtab_aoco_bitmap; +REINDEX +2&: create index idx_reindex_crtab_aoco_bitmap2 on reindex_crtab_aoco_bitmap USING bitmap(a); +1: COMMIT; +COMMIT +2<: <... completed> +CREATE +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); + oid_same_on_all_segs +---------------------- + 1 +(1 row) +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_aoco_bitmap2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_aoco_btree.out b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_aoco_btree.out new file mode 100644 index 00000000000..1c7b58dc7f7 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_aoco_btree.out @@ -0,0 +1,45 @@ +DROP TABLE IF EXISTS reindex_crtab_aoco_btree; +DROP + +CREATE TABLE reindex_crtab_aoco_btree (a INT) WITH (appendonly=true, orientation=column); +CREATE +insert into reindex_crtab_aoco_btree select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_aoco_btree select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_aoco_btree on reindex_crtab_aoco_btree(a); +CREATE +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 +---------------------- + 1 +(1 row) + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_aoco_btree WHERE a < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: REINDEX index idx_reindex_crtab_aoco_btree; +REINDEX +2&: create index idx_reindex_crtab_aoco_btree2 on reindex_crtab_aoco_btree(a); +1: COMMIT; +COMMIT +2<: <... completed> +CREATE +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); + oid_same_on_all_segs +---------------------- + 1 +(1 row) +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_aoco_btree2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_heap_bitmap.out b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_heap_bitmap.out new file mode 100644 index 00000000000..15bbec1e6a7 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_heap_bitmap.out @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS reindex_crtab_heap_bitmap; +DROP + +CREATE TABLE reindex_crtab_heap_bitmap (a INT); +CREATE +insert into reindex_crtab_heap_bitmap select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_heap_bitmap select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_heap_bitmap on reindex_crtab_heap_bitmap(a); +CREATE +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 +---------------------- + 1 +(1 row) + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_heap_bitmap WHERE a < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +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 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: 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 +---------------------- + 1 +(1 row) +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_heap_bitmap2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_heap_btree.out b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_heap_btree.out new file mode 100644 index 00000000000..7bae7e1d940 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/createidx_while_reindex_idx_heap_btree.out @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS reindex_crtab_heap_btree; +DROP + +CREATE TABLE reindex_crtab_heap_btree (a INT); +CREATE +insert into reindex_crtab_heap_btree select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_heap_btree select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_heap_btree on reindex_crtab_heap_btree(a); +CREATE +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 +---------------------- + 1 +(1 row) + +-- @Description Ensures that a create table during reindex operations is ok +-- + +DELETE FROM reindex_crtab_heap_btree WHERE a < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +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 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: 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 +---------------------- + 1 +(1 row) +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_heap_btree2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs +---------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_ao_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_ao_part_btree.out new file mode 100644 index 00000000000..cefd1bf866b --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_ao_part_btree.out @@ -0,0 +1,84 @@ +DROP TABLE IF EXISTS reindex_crtabforadd_part_ao_btree; +DROP + +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 + +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 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 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 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 + +create index on reindex_crtabforadd_part_ao_btree(id); +CREATE + +-- 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 +-- 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); + c_relname | have_same_number_of_rows +------------------------------------------------------------+-------------------------- + reindex_crtabforadd_part_ao_btree_id_idx | 1 + reindex_crtabforadd_part_ao_btree_1_prt_sales_sep13_id_idx | 1 + reindex_crtabforadd_part_ao_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforadd_part_ao_btree_1_prt_sales_aug13_id_idx | 1 +(4 rows) +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab add partition operations is ok +-- + +DELETE FROM reindex_crtabforadd_part_ao_btree WHERE id < 12; +DELETE 8 +1: BEGIN; +BEGIN +1: LOCK reindex_crtabforadd_part_ao_btree IN ACCESS EXCLUSIVE MODE; +LOCK +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; +COMMIT +2<: <... completed> +REINDEX +3<: <... completed> +ALTER +3: Insert into reindex_crtabforadd_part_ao_btree values(9,'2013-05-22',14.22); +INSERT 1 +3: select count(*) from reindex_crtabforadd_part_ao_btree where id = 29; + count +------- + 4 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtabforadd_part_ao_btree where id = 29; + count +------- + 4 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforadd_part_ao_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_ao_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +------------------------------------------------------------+----------------------- + reindex_crtabforadd_part_ao_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforadd_part_ao_btree_1_prt_sales_sep13_id_idx | 1 + reindex_crtabforadd_part_ao_btree_1_prt_sales_jul13_id_idx | 1 +(3 rows) + +3: select 1 AS oid_same_on_all_segs_partition_new_data from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_ao_btree_1_prt_p1' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs_partition_new_data +----------------------------------------- + 1 +(1 row) +3: select 1 AS oid_same_on_all_segs_partition_new_idx from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_ao_btree_1_prt_p1_id_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs_partition_new_idx +---------------------------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_aoco_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_aoco_part_btree.out new file mode 100644 index 00000000000..89d80f1a9fb --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_aoco_part_btree.out @@ -0,0 +1,84 @@ +DROP TABLE IF EXISTS reindex_crtabforadd_part_aoco_btree; +DROP + +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 + +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 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 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 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 + +create index on reindex_crtabforadd_part_aoco_btree(id); +CREATE + +-- 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 +-- 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); + c_relname | have_same_number_of_rows +--------------------------------------------------------------+-------------------------- + reindex_crtabforadd_part_aoco_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforadd_part_aoco_btree_1_prt_sales_sep13_id_idx | 1 + reindex_crtabforadd_part_aoco_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforadd_part_aoco_btree_id_idx | 1 +(4 rows) +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab add partition operations is ok +-- + +DELETE FROM reindex_crtabforadd_part_aoco_btree WHERE id < 12; +DELETE 8 +1: BEGIN; +BEGIN +1: LOCK reindex_crtabforadd_part_aoco_btree IN ACCESS EXCLUSIVE MODE; +LOCK +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; +COMMIT +2<: <... completed> +REINDEX +3<: <... completed> +ALTER +3: Insert into reindex_crtabforadd_part_aoco_btree values(29,'2013-04-22',12.52); +INSERT 1 +3: select count(*) from reindex_crtabforadd_part_aoco_btree where id = 29; + count +------- + 5 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtabforadd_part_aoco_btree where id = 29; + count +------- + 5 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforadd_part_aoco_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_aoco_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +--------------------------------------------------------------+----------------------- + reindex_crtabforadd_part_aoco_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforadd_part_aoco_btree_1_prt_sales_sep13_id_idx | 1 + reindex_crtabforadd_part_aoco_btree_1_prt_sales_jul13_id_idx | 1 +(3 rows) + +3: select 1 AS oid_same_on_all_segs_partition_new_data from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_aoco_btree_1_prt_part_others' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs_partition_new_data +----------------------------------------- + 1 +(1 row) +3: select 1 AS oid_same_on_all_segs_partition_new_idx from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_aoco_btree_1_prt_part_others_id_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs_partition_new_idx +---------------------------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_heap_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_heap_part_btree.out new file mode 100644 index 00000000000..eed3c9c024e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_addpart_heap_part_btree.out @@ -0,0 +1,84 @@ +DROP TABLE IF EXISTS reindex_crtabforadd_part_heap_btree; +DROP + +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 + +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 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 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 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 + +create index on reindex_crtabforadd_part_heap_btree(id); +CREATE + +-- 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 +-- 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); + c_relname | have_same_number_of_rows +--------------------------------------------------------------+-------------------------- + reindex_crtabforadd_part_heap_btree_id_idx | 1 + reindex_crtabforadd_part_heap_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforadd_part_heap_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforadd_part_heap_btree_1_prt_sales_sep13_id_idx | 1 +(4 rows) +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab add partition operations is ok +-- + +DELETE FROM reindex_crtabforadd_part_heap_btree WHERE id < 12; +DELETE 8 +1: BEGIN; +BEGIN +1: LOCK reindex_crtabforadd_part_heap_btree IN ACCESS EXCLUSIVE MODE; +LOCK +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; +COMMIT +2<: <... completed> +REINDEX +3<: <... completed> +ALTER +3: Insert into reindex_crtabforadd_part_heap_btree values(29,'2013-06-09',14.20); +INSERT 1 +3: select count(*) from reindex_crtabforadd_part_heap_btree where id = 29; + count +------- + 5 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtabforadd_part_heap_btree where id = 29; + count +------- + 5 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforadd_part_heap_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_heap_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +--------------------------------------------------------------+----------------------- + reindex_crtabforadd_part_heap_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforadd_part_heap_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforadd_part_heap_btree_1_prt_sales_sep13_id_idx | 1 +(3 rows) + +3: select 1 AS oid_same_on_all_segs_partition_new_data from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_heap_btree_1_prt_new_p' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs_partition_new_data +----------------------------------------- + 1 +(1 row) +3: select 1 AS oid_same_on_all_segs_partition_new_idx from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_heap_btree_1_prt_new_p_id_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + oid_same_on_all_segs_partition_new_idx +---------------------------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_ao_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_ao_part_btree.out new file mode 100644 index 00000000000..52b56766ec5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_ao_part_btree.out @@ -0,0 +1,77 @@ +DROP TABLE IF EXISTS reindex_crtabforalter_part_ao_btree; +DROP + +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 + +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 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 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 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 + +create index on reindex_crtabforalter_part_ao_btree(id); +CREATE + +-- 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 +-- 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); + c_relname | have_same_number_of_rows +--------------------------------------------------------------+-------------------------- + reindex_crtabforalter_part_ao_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforalter_part_ao_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforalter_part_ao_btree_id_idx | 1 + reindex_crtabforalter_part_ao_btree_1_prt_sales_sep13_id_idx | 1 +(4 rows) +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab drop col operations is ok +-- + +DELETE FROM reindex_crtabforalter_part_ao_btree WHERE id < 12; +DELETE 8 +1: BEGIN; +BEGIN +1: LOCK reindex_crtabforalter_part_ao_btree IN ACCESS EXCLUSIVE MODE; +LOCK +2&: REINDEX TABLE reindex_crtabforalter_part_ao_btree; +3&: alter table reindex_crtabforalter_part_ao_btree drop column amt; +1: COMMIT; +COMMIT +2<: <... completed> +REINDEX +3<: <... completed> +ALTER +3: select count(*) from reindex_crtabforalter_part_ao_btree where id = 29; + count +------- + 4 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtabforalter_part_ao_btree where id = 29; + count +------- + 4 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforalter_part_ao_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_ao_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +--------------------------------------------------------------+----------------------- + reindex_crtabforalter_part_ao_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforalter_part_ao_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforalter_part_ao_btree_1_prt_sales_sep13_id_idx | 1 +(3 rows) + +3: select count(*) from pg_attribute where attname = 'amt' and attrelid = (select oid from pg_class where relname = 'reindex_crtabforalter_part_ao_btree'); + count +------- + 0 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_aoco_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_aoco_part_btree.out new file mode 100644 index 00000000000..6780e137f16 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_aoco_part_btree.out @@ -0,0 +1,77 @@ +DROP TABLE IF EXISTS reindex_crtabforalter_part_aoco_btree; +DROP + +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 + +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 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 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 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 + +create index on reindex_crtabforalter_part_aoco_btree(id); +CREATE + +-- 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 +-- 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); + c_relname | have_same_number_of_rows +----------------------------------------------------------------+-------------------------- + reindex_crtabforalter_part_aoco_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforalter_part_aoco_btree_id_idx | 1 + reindex_crtabforalter_part_aoco_btree_1_prt_sales_sep13_id_idx | 1 + reindex_crtabforalter_part_aoco_btree_1_prt_sales_aug13_id_idx | 1 +(4 rows) +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab drop col operations is ok +-- + +DELETE FROM reindex_crtabforalter_part_aoco_btree WHERE id < 12; +DELETE 8 +1: BEGIN; +BEGIN +1: LOCK reindex_crtabforalter_part_aoco_btree IN ACCESS EXCLUSIVE MODE; +LOCK +2&: REINDEX TABLE reindex_crtabforalter_part_aoco_btree; +3&: alter table reindex_crtabforalter_part_aoco_btree drop column amt; +1: COMMIT; +COMMIT +2<: <... completed> +REINDEX +3<: <... completed> +ALTER +3: select count(*) from reindex_crtabforalter_part_aoco_btree where id = 29; + count +------- + 4 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtabforalter_part_aoco_btree where id = 29; + count +------- + 4 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforalter_part_aoco_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_aoco_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +----------------------------------------------------------------+----------------------- + reindex_crtabforalter_part_aoco_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforalter_part_aoco_btree_1_prt_sales_sep13_id_idx | 1 + reindex_crtabforalter_part_aoco_btree_1_prt_sales_aug13_id_idx | 1 +(3 rows) + +3: select count(*) from pg_attribute where attname = 'amt' and attrelid = (select oid from pg_class where relname = 'reindex_crtabforalter_part_aoco_btree'); + count +------- + 0 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_heap_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_heap_part_btree.out new file mode 100644 index 00000000000..0a63be4559e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_altertable_heap_part_btree.out @@ -0,0 +1,77 @@ +DROP TABLE IF EXISTS reindex_crtabforalter_part_heap_btree; +DROP + +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 + +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 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 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 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 + +create index on reindex_crtabforalter_part_heap_btree(id); +CREATE + +-- 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 +-- 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); + c_relname | have_same_number_of_rows +----------------------------------------------------------------+-------------------------- + reindex_crtabforalter_part_heap_btree_1_prt_sales_jul13_id_idx | 1 + reindex_crtabforalter_part_heap_btree_id_idx | 1 + reindex_crtabforalter_part_heap_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforalter_part_heap_btree_1_prt_sales_sep13_id_idx | 1 +(4 rows) +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab drop col operations is ok +-- + +DELETE FROM reindex_crtabforalter_part_heap_btree WHERE id < 12; +DELETE 8 +1: BEGIN; +BEGIN +1: LOCK reindex_crtabforalter_part_heap_btree IN ACCESS EXCLUSIVE MODE; +LOCK +2&: REINDEX TABLE reindex_crtabforalter_part_heap_btree; +3&: alter table reindex_crtabforalter_part_heap_btree drop column amt; +1: COMMIT; +COMMIT +2<: <... completed> +REINDEX +3<: <... completed> +ALTER +3: select count(*) from reindex_crtabforalter_part_heap_btree where id = 29; + count +------- + 4 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtabforalter_part_heap_btree where id = 29; + count +------- + 4 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforalter_part_heap_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_heap_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +----------------------------------------------------------------+----------------------- + reindex_crtabforalter_part_heap_btree_1_prt_sales_aug13_id_idx | 1 + reindex_crtabforalter_part_heap_btree_1_prt_sales_sep13_id_idx | 1 + reindex_crtabforalter_part_heap_btree_1_prt_sales_jul13_id_idx | 1 +(3 rows) + +3: select count(*) from pg_attribute where attname = 'amt' and attrelid = (select oid from pg_class where relname = 'reindex_crtabforalter_part_heap_btree'); + count +------- + 0 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_ao_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_ao_part_btree.out new file mode 100644 index 00000000000..68757501029 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_ao_part_btree.out @@ -0,0 +1,75 @@ +CREATE TABLE reindex_dropindex_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 +insert into reindex_dropindex_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 into reindex_dropindex_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 +create index on reindex_dropindex_crtab_part_ao_btree(id); +CREATE +create index on reindex_dropindex_crtab_part_ao_btree(owner); +CREATE + +-- start_ignore +create table before_reindex_dropindex_crtab_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_dropindex_crtab_part_ao_btree%_id_idx'; +CREATE 9 +-- end_ignore + +select c_relname, 1 as have_same_number_of_rows from before_reindex_dropindex_crtab_part_ao_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); + c_relname | have_same_number_of_rows +-------------------------------------------------------------+-------------------------- + reindex_dropindex_crtab_part_ao_btree_1_prt_p_one_id_idx | 1 + reindex_dropindex_crtab_part_ao_btree_id_idx | 1 + reindex_dropindex_crtab_part_ao_btree_1_prt_de_fault_id_idx | 1 +(3 rows) + +select 1 AS index_exists_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'reindex_dropindex_crtab_part_ao_btree_owner_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + index_exists_on_all_segs +-------------------------- + 1 +(1 row) +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_dropindex_crtab_part_ao_btree WHERE id < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: REINDEX TABLE reindex_dropindex_crtab_part_ao_btree; +REINDEX +2&: DROP INDEX reindex_dropindex_crtab_part_ao_btree_owner_idx; +1: COMMIT; +COMMIT +2<: <... completed> +DROP +2: COMMIT; +COMMIT +3: select count(*) from reindex_dropindex_crtab_part_ao_btree where id = 998; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_dropindex_crtab_part_ao_btree where id = 999; + count +------- + 2 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_dropindex_crtab_part_ao_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_dropindex_crtab_part_ao_btree%_id_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +-------------------------------------------------------------+----------------------- + reindex_dropindex_crtab_part_ao_btree_1_prt_p_one_id_idx | 1 + reindex_dropindex_crtab_part_ao_btree_1_prt_de_fault_id_idx | 1 +(2 rows) + +-- expect only the index on parent table to be dropped; drop index will not drop indexes on child partitions +3: select 1-count(1) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'reindex_dropindex_crtab_part_ao_btree_owner_idx'; + index_dropped +--------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_aoco_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_aoco_part_btree.out new file mode 100644 index 00000000000..3e030221a8c --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_aoco_part_btree.out @@ -0,0 +1,76 @@ +CREATE TABLE reindex_dropindex_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 +insert into reindex_dropindex_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 into reindex_dropindex_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 +create index on reindex_dropindex_crtab_part_aoco_btree(id); +CREATE +create index on reindex_dropindex_crtab_part_aoco_btree(owner); +CREATE + +-- start_ignore +create table before_reindex_dropindex_crtab_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_dropindex_crtab_part_aoco_btree%_id_idx'; +CREATE 9 +-- end_ignore + +select c_relname, 1 as have_same_number_of_rows from before_reindex_dropindex_crtab_part_aoco_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); + c_relname | have_same_number_of_rows +---------------------------------------------------------------+-------------------------- + reindex_dropindex_crtab_part_aoco_btree_id_idx | 1 + reindex_dropindex_crtab_part_aoco_btree_1_prt_p_one_id_idx | 1 + reindex_dropindex_crtab_part_aoco_btree_1_prt_de_fault_id_idx | 1 +(3 rows) + +select 1 AS index_exists_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'reindex_dropindex_crtab_part_aoco_btree_owner_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + index_exists_on_all_segs +-------------------------- + 1 +(1 row) +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_dropindex_crtab_part_aoco_btree WHERE id < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: REINDEX TABLE reindex_dropindex_crtab_part_aoco_btree; +REINDEX +2&: DROP INDEX reindex_dropindex_crtab_part_aoco_btree_owner_idx; +1: COMMIT; +COMMIT +2<: <... completed> +DROP +2: COMMIT; +COMMIT +3: select count(*) from reindex_dropindex_crtab_part_aoco_btree where id = 998; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_dropindex_crtab_part_aoco_btree where id = 999; + count +------- + 2 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_dropindex_crtab_part_aoco_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_dropindex_crtab_part_aoco_btree%_id_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +---------------------------------------------------------------+----------------------- + reindex_dropindex_crtab_part_aoco_btree_1_prt_p_one_id_idx | 1 + reindex_dropindex_crtab_part_aoco_btree_1_prt_de_fault_id_idx | 1 +(2 rows) + +-- expect only the index on parent table to be dropped; drop index will not drop indexes on child partitions +3: select 1-count(1) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'reindex_dropindex_crtab_part_aoco_btree_owner_idx'; + index_dropped +--------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_heap_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_heap_part_btree.out new file mode 100644 index 00000000000..56982949631 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_dropindex_heap_part_btree.out @@ -0,0 +1,75 @@ +CREATE TABLE reindex_dropindex_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 +insert into reindex_dropindex_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 into reindex_dropindex_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 +create index on reindex_dropindex_crtab_part_heap_btree(id); +CREATE +create index on reindex_dropindex_crtab_part_heap_btree(owner); +CREATE + +-- start_ignore +create table before_reindex_dropindex_crtab_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_dropindex_crtab_part_heap_btree%_id_idx'; +CREATE 9 +-- end_ignore + +select c_relname, 1 as have_same_number_of_rows from before_reindex_dropindex_crtab_part_heap_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); + c_relname | have_same_number_of_rows +---------------------------------------------------------------+-------------------------- + reindex_dropindex_crtab_part_heap_btree_1_prt_p_one_id_idx | 1 + reindex_dropindex_crtab_part_heap_btree_1_prt_de_fault_id_idx | 1 + reindex_dropindex_crtab_part_heap_btree_id_idx | 1 +(3 rows) + +select 1 AS index_exists_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'reindex_dropindex_crtab_part_heap_btree_owner_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); + index_exists_on_all_segs +-------------------------- + 1 +(1 row) +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_dropindex_crtab_part_heap_btree WHERE id < 128; +DELETE 254 +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: REINDEX TABLE reindex_dropindex_crtab_part_heap_btree; +REINDEX +2&: DROP INDEX reindex_dropindex_crtab_part_heap_btree_owner_idx; +1: COMMIT; +COMMIT +2<: <... completed> +DROP +2: COMMIT; +COMMIT +3: select count(*) from reindex_dropindex_crtab_part_heap_btree where id = 998; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_dropindex_crtab_part_heap_btree where id = 999; + count +------- + 2 +(1 row) + +3: select c_relname, 1 as different_relfilenode from before_reindex_dropindex_crtab_part_heap_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_dropindex_crtab_part_heap_btree%_id_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + c_relname | different_relfilenode +---------------------------------------------------------------+----------------------- + reindex_dropindex_crtab_part_heap_btree_1_prt_p_one_id_idx | 1 + reindex_dropindex_crtab_part_heap_btree_1_prt_de_fault_id_idx | 1 +(2 rows) + +-- expect only the index on parent table to be dropped; drop index will not drop indexes on child partitions +3: select 1-count(1) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'reindex_dropindex_crtab_part_heap_btree_owner_idx'; + index_dropped +--------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_ao_bitmap.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_ao_bitmap.out new file mode 100644 index 00000000000..ed48fe86ad7 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_ao_bitmap.out @@ -0,0 +1,68 @@ +DROP TABLE IF EXISTS reindex_crtab_ao_bitmap; +DROP + +CREATE TABLE reindex_crtab_ao_bitmap (a INT) WITH (appendonly=true); +CREATE +insert into reindex_crtab_ao_bitmap select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_ao_bitmap select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_ao_bitmap on reindex_crtab_ao_bitmap USING BITMAP(a); +CREATE +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_ao_bitmap WHERE a < 128; +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 +2: BEGIN; +BEGIN +1: REINDEX index idx_reindex_crtab_ao_bitmap; +REINDEX +2&: REINDEX TABLE reindex_crtab_ao_bitmap; +1: COMMIT; +COMMIT +2<: <... completed> +REINDEX +-- Session 2 has not committed yet. Session 1 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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 +-- 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 +-------+----------------------------- + 2 | idx_reindex_crtab_ao_bitmap +(1 row) +2: COMMIT; +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 +-- 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 +-------+----------------------------- + 3 | idx_reindex_crtab_ao_bitmap +(1 row) + +3: select count(*) from reindex_crtab_ao_bitmap where a = 1000; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtab_ao_bitmap where a = 1000; + count +------- + 2 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_ao_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_ao_part_btree.out new file mode 100644 index 00000000000..e4ecb970000 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_ao_part_btree.out @@ -0,0 +1,76 @@ +DROP TABLE IF EXISTS reindex_crtab_part_ao_btree; +DROP + +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 +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 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 +create index on reindex_crtab_part_ao_btree(id); +CREATE +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +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 +1: BEGIN; +BEGIN +1: LOCK reindex_crtab_part_ao_btree IN ACCESS EXCLUSIVE MODE; +LOCK +2&: REINDEX TABLE reindex_crtab_part_ao_btree; +3:BEGIN; +BEGIN +3&: reindex index reindex_crtab_part_ao_btree_1_prt_de_fault_id_idx; +1: COMMIT; +COMMIT +3<: <... completed> +REINDEX +-- Session 2 has not committed yet. Session 3 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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 +-- Expect two distinct relfilenodes for one segment in old_relfilenodes table. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + count | relname +-------+--------------------------------------------------- + 1 | reindex_crtab_part_ao_btree_1_prt_p_one_id_idx + 2 | reindex_crtab_part_ao_btree_1_prt_de_fault_id_idx + 1 | reindex_crtab_part_ao_btree_id_idx +(3 rows) +3: COMMIT; +COMMIT +-- After session 3 commits, session 2 could complete, the relfilenode it assigned to the +-- "1_prt_de_fault" index is visible to session 3. +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 +-- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + count | relname +-------+--------------------------------------------------- + 3 | reindex_crtab_part_ao_btree_1_prt_de_fault_id_idx + 2 | reindex_crtab_part_ao_btree_1_prt_p_one_id_idx + 1 | reindex_crtab_part_ao_btree_id_idx +(3 rows) + +3: select count(*) from reindex_crtab_part_ao_btree where id = 998; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtab_part_ao_btree where id = 999; + count +------- + 2 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_bitmap.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_bitmap.out new file mode 100644 index 00000000000..8c766da8fc8 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_bitmap.out @@ -0,0 +1,68 @@ +DROP TABLE IF EXISTS reindex_crtab_aoco_bitmap; +DROP + +CREATE TABLE reindex_crtab_aoco_bitmap (a INT) WITH (appendonly=true, orientation=column); +CREATE +insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_aoco_bitmap on reindex_crtab_aoco_bitmap USING BITMAP(a); +CREATE +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_aoco_bitmap WHERE a < 128; +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 +2: BEGIN; +BEGIN +1: REINDEX index idx_reindex_crtab_aoco_bitmap; +REINDEX +2&: REINDEX TABLE reindex_crtab_aoco_bitmap; +1: COMMIT; +COMMIT +2<: <... completed> +REINDEX +-- Session 2 has not committed yet. Session 1 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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 +-- 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 +-------+------------------------------- + 2 | idx_reindex_crtab_aoco_bitmap +(1 row) +2: COMMIT; +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 +-- 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 +-------+------------------------------- + 3 | idx_reindex_crtab_aoco_bitmap +(1 row) + +3: select count(*) from reindex_crtab_aoco_bitmap where a = 1000; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtab_aoco_bitmap where a = 1000; + count +------- + 2 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_part_btree.out new file mode 100644 index 00000000000..6e816e6739e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_part_btree.out @@ -0,0 +1,76 @@ +DROP TABLE IF EXISTS reindex_crtab_part_aoco_btree; +DROP + +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 +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 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 +create index on reindex_crtab_part_aoco_btree(id); +CREATE +-- @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 +1: BEGIN; +BEGIN +1: LOCK reindex_crtab_part_aoco_btree IN ACCESS EXCLUSIVE MODE; +LOCK +2&: REINDEX TABLE reindex_crtab_part_aoco_btree; +3: BEGIN; +BEGIN +3&: reindex index reindex_crtab_part_aoco_btree_1_prt_de_fault_id_idx; +1: COMMIT; +COMMIT +3<: <... completed> +REINDEX +-- Session 2 has not committed yet. Session 3 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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 +-- Expect two distinct relfilenodes for one segment in old_relfilenodes table. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + count | relname +-------+----------------------------------------------------- + 2 | reindex_crtab_part_aoco_btree_1_prt_de_fault_id_idx + 1 | reindex_crtab_part_aoco_btree_1_prt_p_one_id_idx + 1 | reindex_crtab_part_aoco_btree_id_idx +(3 rows) +3: COMMIT; +COMMIT +-- After session 3 commits, session 2 could complete, the relfilenode it assigned to the +-- "1_prt_de_fault" index is visible to session 3. +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 +-- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + count | relname +-------+----------------------------------------------------- + 1 | reindex_crtab_part_aoco_btree_id_idx + 2 | reindex_crtab_part_aoco_btree_1_prt_p_one_id_idx + 3 | reindex_crtab_part_aoco_btree_1_prt_de_fault_id_idx +(3 rows) + +3: select count(*) from reindex_crtab_part_aoco_btree where id = 998; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtab_part_aoco_btree where id = 999; + count +------- + 2 +(1 row) + diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_heap_bitmap.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_heap_bitmap.out new file mode 100644 index 00000000000..0a9689cb030 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_heap_bitmap.out @@ -0,0 +1,68 @@ +DROP TABLE IF EXISTS reindex_crtab_heap_bitmap; +DROP + +CREATE TABLE reindex_crtab_heap_bitmap (a INT); +CREATE +insert into reindex_crtab_heap_bitmap select generate_series(1,1000); +INSERT 1000 +insert into reindex_crtab_heap_bitmap select generate_series(1,1000); +INSERT 1000 +create index idx_reindex_crtab_heap_bitmap on reindex_crtab_heap_bitmap USING BITMAP(a); +CREATE +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_heap_bitmap WHERE a < 128; +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 +2: BEGIN; +BEGIN +1: REINDEX index idx_reindex_crtab_heap_bitmap; +REINDEX +2&: REINDEX TABLE reindex_crtab_heap_bitmap; +1: COMMIT; +COMMIT +2<: <... completed> +REINDEX +-- Session 2 has not committed yet. Session 1 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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 +-- 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 +-------+------------------------------- + 2 | idx_reindex_crtab_heap_bitmap +(1 row) +2: COMMIT; +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 +-- 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 +-------+------------------------------- + 3 | idx_reindex_crtab_heap_bitmap +(1 row) + +3: select count(*) from reindex_crtab_heap_bitmap where a = 1000; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtab_heap_bitmap where a = 1000; + count +------- + 2 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_heap_part_btree.out b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_heap_part_btree.out new file mode 100644 index 00000000000..16cb468a86d --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/reindextable_while_reindex_idx_heap_part_btree.out @@ -0,0 +1,75 @@ +DROP TABLE IF EXISTS reindex_crtab_part_heap_btree; +DROP + +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 +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 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 +create index on reindex_crtab_part_heap_btree(id); +CREATE +-- @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 +1: BEGIN; +BEGIN +1: LOCK reindex_crtab_part_heap_btree IN ACCESS EXCLUSIVE MODE; +LOCK +2&: REINDEX TABLE reindex_crtab_part_heap_btree; +3: BEGIN; +BEGIN +3&: reindex index reindex_crtab_part_heap_btree_1_prt_de_fault_id_idx; +1: COMMIT; +COMMIT +3<: <... completed> +REINDEX +-- Session 2 has not committed yet. Session 3 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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 +-- Expect two distinct relfilenodes for one segment in old_relfilenodes table. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + count | relname +-------+----------------------------------------------------- + 1 | reindex_crtab_part_heap_btree_id_idx + 2 | reindex_crtab_part_heap_btree_1_prt_de_fault_id_idx + 1 | reindex_crtab_part_heap_btree_1_prt_p_one_id_idx +(3 rows) +3: COMMIT; +COMMIT +-- After session 3 commits, session 2 could complete, the relfilenode it assigned to the +-- "1_prt_de_fault" index is visible to session 3. +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 +-- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + count | relname +-------+----------------------------------------------------- + 1 | reindex_crtab_part_heap_btree_id_idx + 3 | reindex_crtab_part_heap_btree_1_prt_de_fault_id_idx + 2 | reindex_crtab_part_heap_btree_1_prt_p_one_id_idx +(3 rows) + +3: select count(*) from reindex_crtab_part_heap_btree where id = 998; + count +------- + 2 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_crtab_part_heap_btree where id = 999; + count +------- + 2 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/repeatable_read_reindex_with_insert_heap.out b/src/test/singlenode_isolation2/expected/reindex/repeatable_read_reindex_with_insert_heap.out new file mode 100644 index 00000000000..03fd18bee3f --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/repeatable_read_reindex_with_insert_heap.out @@ -0,0 +1,76 @@ +DROP TABLE IF EXISTS reindex_serialize_tab_heap; +DROP + +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 +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 +create index idxa_reindex_serialize_tab_heap on reindex_serialize_tab_heap(a); +CREATE +create index idxb_reindex_serialize_tab_heap on reindex_serialize_tab_heap(b); +CREATE +create index idxc_reindex_serialize_tab_heap on reindex_serialize_tab_heap(c); +CREATE +create index idxd_reindex_serialize_tab_heap on reindex_serialize_tab_heap(d); +CREATE +create index idxe_reindex_serialize_tab_heap on reindex_serialize_tab_heap(e); +CREATE +create index idxf_reindex_serialize_tab_heap on reindex_serialize_tab_heap(f); +CREATE +create index idxg_reindex_serialize_tab_heap on reindex_serialize_tab_heap(g); +CREATE +-- start_ignore +SET gp_create_table_random_default_distribution=off; +SET +-- end_ignore +1: BEGIN; +BEGIN +1: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; +SET +1: select 'dummy select to establish snapshot'; + ?column? +------------------------------------ + dummy select to establish snapshot +(1 row) +2: BEGIN; +BEGIN +2: insert into reindex_serialize_tab_heap values(99,'green',now(),10,15.10); +INSERT 1 +2: COMMIT; +COMMIT +1: select a,b,d,e,f,g from reindex_serialize_tab_heap order by 1; + a | b | d | e | f | g +----+-------+---------+-------+------------+------- + 1 | abc1 | 100.43 | -187 | a-1 | 2.23 + 2 | abc2 | 200.86 | -374 | a-2 | 4.46 + 3 | abc3 | 301.29 | -561 | a-3 | 6.69 + 4 | abc4 | 401.72 | -748 | a-4 | 8.92 + 5 | abc5 | 502.15 | -935 | a-5 | 11.15 + 6 | abc6 | 602.58 | -1122 | a-6 | 13.38 + 7 | abc7 | 703.01 | -1309 | a-7 | 15.61 + 8 | abc8 | 803.44 | -1496 | a-8 | 17.84 + 9 | abc9 | 903.87 | -1683 | a-9 | 20.07 + 10 | abc10 | 1004.30 | -1870 | a-10 | 22.3 +(10 rows) +1: select a,b,d,e,f,g from reindex_serialize_tab_heap where a = 99; + a | b | d | e | f | g +---+---+---+---+---+--- +(0 rows) +1: reindex table reindex_serialize_tab_heap; +REINDEX +1: COMMIT; +COMMIT +4: select a,b,d,e,f,g from reindex_serialize_tab_heap where a = 99; + a | b | d | e | f | g +----+-------+----+----+---+--- + 99 | green | 10 | 15 | | +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select a,b,d,e,f,g from reindex_serialize_tab_heap where a = 99; + a | b | d | e | f | g +----+-------+----+----+---+--- + 99 | green | 10 | 15 | | +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_column_heap.out b/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_column_heap.out new file mode 100644 index 00000000000..e4218e9ccd5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_column_heap.out @@ -0,0 +1,88 @@ +DROP TABLE IF EXISTS reindex_serialize_tab_heap; +DROP + +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 +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 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 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 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 +create index idxa_reindex_serialize_tab_heap on reindex_serialize_tab_heap(a); +CREATE +create index idxb_reindex_serialize_tab_heap on reindex_serialize_tab_heap(b); +CREATE +create index idxc_reindex_serialize_tab_heap on reindex_serialize_tab_heap(c); +CREATE +create index idxd_reindex_serialize_tab_heap on reindex_serialize_tab_heap(d); +CREATE +create index idxe_reindex_serialize_tab_heap on reindex_serialize_tab_heap(e); +CREATE +create index idxf_reindex_serialize_tab_heap on reindex_serialize_tab_heap(f); +CREATE +create index idxg_reindex_serialize_tab_heap on reindex_serialize_tab_heap(g); +CREATE +-- start_ignore +SET gp_create_table_random_default_distribution=off; +SET +-- end_ignore +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SET +2: select 'dummy select to establish snapshot'; + ?column? +------------------------------------ + dummy select to establish snapshot +(1 row) +1: alter table reindex_serialize_tab_heap drop column c; +ALTER +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 +2: reindex table reindex_serialize_tab_heap; +REINDEX +2: COMMIT; +COMMIT +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +2: select oldrels.* from old_relfilenodes oldrels join (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') where relname like 'idx%_reindex_serialize_tab_heap' union all select gp_segment_id as dbid, relfilenode, relname from pg_class where relname like 'idx%_reindex_serialize_tab_heap') newrels on oldrels.relfilenode = newrels.relfilenode and oldrels.dbid = newrels.dbid and oldrels.relname = newrels.relname; + dbid | relfilenode | oid | relname +------+-------------+-----+--------- +(0 rows) +3: select count(*) from reindex_serialize_tab_heap where a = 1; + count +------- + 4000 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_serialize_tab_heap where a = 1; + count +------- + 4000 +(1 row) + +-- expect index to be dropped +3: select 1-count(*) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'idxi_reindex_serialize_tab_heap'; + index_dropped +--------------- + 1 +(1 row) + +-- expect column to be dropped +3: select 1-count(*) as attribute_dropped from (select * from pg_attribute union all select * from gp_dist_random('pg_attribute')) t where t.attrelid = 'reindex_serialize_tab_heap'::regclass and t.attname = 'c'; + attribute_dropped +------------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_index_ao.out b/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_index_ao.out new file mode 100644 index 00000000000..93c1a82b07e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_index_ao.out @@ -0,0 +1,81 @@ +DROP TABLE IF EXISTS reindex_serialize_tab_ao; +DROP + +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 +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 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 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 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 +create index idxa_reindex_serialize_tab_ao on reindex_serialize_tab_ao(a); +CREATE +create index idxb_reindex_serialize_tab_ao on reindex_serialize_tab_ao(b); +CREATE +create index idxc_reindex_serialize_tab_ao on reindex_serialize_tab_ao(c); +CREATE +create index idxd_reindex_serialize_tab_ao on reindex_serialize_tab_ao(d); +CREATE +create index idxe_reindex_serialize_tab_ao on reindex_serialize_tab_ao(e); +CREATE +create index idxf_reindex_serialize_tab_ao on reindex_serialize_tab_ao(f); +CREATE +create index idxg_reindex_serialize_tab_ao on reindex_serialize_tab_ao(g); +CREATE +-- start_ignore +SET gp_create_table_random_default_distribution=off; +SET +-- end_ignore +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SET +2: select 'dummy select to establish snapshot'; + ?column? +------------------------------------ + dummy select to establish snapshot +(1 row) +1: drop index idxg_reindex_serialize_tab_ao; +DROP +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 +2: reindex table reindex_serialize_tab_ao; +REINDEX +2: COMMIT; +COMMIT +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +2: select oldrels.* from old_ao_relfilenodes oldrels join (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') where relname like 'idx%_reindex_serialize_tab_ao' union all select gp_segment_id as dbid, relfilenode, relname from pg_class where relname like 'idx%_reindex_serialize_tab_ao') newrels on oldrels.relfilenode = newrels.relfilenode and oldrels.dbid = newrels.dbid and oldrels.relname = newrels.relname; + dbid | relfilenode | oid | relname +------+-------------+-----+--------- +(0 rows) +3: select count(*) from reindex_serialize_tab_ao where a = 1; + count +------- + 4000 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_serialize_tab_ao where a = 1; + count +------- + 4000 +(1 row) + +-- expect index to be dropped +3: select 1-count(*) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'idxg_reindex_serialize_tab_ao'; + index_dropped +--------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_index_heap.out b/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_index_heap.out new file mode 100644 index 00000000000..16382071948 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/serializable_reindex_with_drop_index_heap.out @@ -0,0 +1,79 @@ +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 +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 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 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 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 +create index idxa_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(a); +CREATE +create index idxb_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(b); +CREATE +create index idxc_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(c); +CREATE +create index idxd_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(d); +CREATE +create index idxe_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(e); +CREATE +create index idxf_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(f); +CREATE +create index idxg_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(g); +CREATE +-- start_ignore +SET gp_create_table_random_default_distribution=off; +SET +-- end_ignore +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SET +2: select 'dummy select to establish snapshot'; + ?column? +------------------------------------ + dummy select to establish snapshot +(1 row) +1: drop index idxg_reindex_dropindex_serialize_tab_heap; +DROP +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 +2: reindex table reindex_dropindex_serialize_tab_heap; +REINDEX +2: COMMIT; +COMMIT +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +2: select oldrels.* from old_heap_relfilenodes oldrels join (select gp_segment_id as dbid, relfilenode, 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, relname from pg_class where relname like 'idx%_reindex_dropindex_serialize_tab_heap') newrels on oldrels.relfilenode = newrels.relfilenode and oldrels.dbid = newrels.dbid and oldrels.relname = newrels.relname; + dbid | relfilenode | oid | relname +------+-------------+-----+--------- +(0 rows) + +3: select count(*) from reindex_dropindex_serialize_tab_heap where a = 1; + count +------- + 4000 +(1 row) +3: set enable_seqscan=false; +SET +3: set enable_indexscan=true; +SET +3: select count(*) from reindex_dropindex_serialize_tab_heap where a = 1; + count +------- + 4000 +(1 row) + +-- expect index to be dropped +3: select 1-count(*) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'idxg_reindex_dropindex_serialize_tab_heap'; + index_dropped +--------------- + 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/reindex/vacuum_analyze_while_reindex_ao_btree.out b/src/test/singlenode_isolation2/expected/reindex/vacuum_analyze_while_reindex_ao_btree.out new file mode 100644 index 00000000000..a7ab01a3611 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/vacuum_analyze_while_reindex_ao_btree.out @@ -0,0 +1,61 @@ +DROP TABLE IF EXISTS reindex_ao; +DROP + +CREATE TABLE reindex_ao (a INT) WITH (appendonly=true); +CREATE +insert into reindex_ao select generate_series(1,1000); +INSERT 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); + reltuples_same_as_count +------------------------- + 1 +(1 row) +insert into reindex_ao select generate_series(1,1000); +INSERT 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 +-- @Description Ensures that a vacuum during reindex operations is ok +-- + +DELETE FROM reindex_ao WHERE a < 128; +DELETE 254 +1: BEGIN; +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 +1: REINDEX index idx_btree_reindex_vacuum_analyze_ao; +REINDEX +2&: VACUUM ANALYZE reindex_ao; +1: COMMIT; +COMMIT +2<: <... completed> +VACUUM +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +1: select oldrels.* from old_relfilenodes oldrels join (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') where relname = 'idx_btree_reindex_vacuum_analyze_ao' union all select gp_segment_id as dbid, relfilenode, relname from pg_class where relname = 'idx_btree_reindex_vacuum_analyze_ao') newrels on oldrels.relfilenode = newrels.relfilenode and oldrels.dbid = newrels.dbid and oldrels.relname = newrels.relname; + dbid | relfilenode | oid | relname +------+-------------+-----+--------- +(0 rows) +2: COMMIT; +COMMIT +3: SELECT COUNT(*) FROM reindex_ao WHERE a = 1500; + count +------- + 0 +(1 row) + +3: 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 +------------------------- + 1 +(1 row) +3: INSERT INTO reindex_ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_ao_bitmap.out b/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_ao_bitmap.out new file mode 100644 index 00000000000..6c3c5b14514 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_ao_bitmap.out @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS reindex_ao; +DROP + +CREATE TABLE reindex_ao (a INT) WITH (appendonly=true); +CREATE +insert into reindex_ao select generate_series(1,1000); +INSERT 1000 +insert into reindex_ao select generate_series(1,1000); +INSERT 1000 +create index idx_bitmap_reindex_ao on reindex_ao USING bitmap(a); +CREATE +-- @Description Ensures that a vacuum during reindex operations is ok +-- + +DELETE FROM reindex_ao WHERE a < 128; +DELETE 254 +1: BEGIN; +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 +1: REINDEX index idx_bitmap_reindex_ao; +REINDEX +2&: VACUUM reindex_ao; +1: COMMIT; +COMMIT +2<: <... completed> +VACUUM +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +1: select oldrels.* from old_relfilenodes oldrels join (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') where relname = 'idx_bitmap_reindex_ao' union all select gp_segment_id as dbid, relfilenode, relname from pg_class where relname = 'idx_bitmap_reindex_ao') newrels on oldrels.relfilenode = newrels.relfilenode and oldrels.dbid = newrels.dbid and oldrels.relname = newrels.relname; + dbid | relfilenode | oid | relname +------+-------------+-----+--------- +(0 rows) +2: COMMIT; +COMMIT +3: SELECT COUNT(*) FROM reindex_ao WHERE a = 1500; + count +------- + 0 +(1 row) +3: INSERT INTO reindex_ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_heap_btree.out b/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_heap_btree.out new file mode 100644 index 00000000000..c049f48081f --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_heap_btree.out @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS reindex_heap; +DROP + +CREATE TABLE reindex_heap (a INT); +CREATE +insert into reindex_heap select generate_series(1,1000); +INSERT 1000 +insert into reindex_heap select generate_series(1,1000); +INSERT 1000 +create index idx_btree_reindex_heap on reindex_heap(a); +CREATE +-- @Description Ensures that a vacuum during reindex operations is ok +-- + +DELETE FROM reindex_heap WHERE a < 128; +DELETE 254 +1: BEGIN; +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 +1: REINDEX index idx_btree_reindex_heap; +REINDEX +2&: VACUUM reindex_heap; +1: COMMIT; +COMMIT +2<: <... completed> +VACUUM +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +1: select oldrels.* from old_relfilenodes oldrels join (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') where relname = 'idx_btree_reindex_heap' union all select gp_segment_id as dbid, relfilenode, relname from pg_class where relname = 'idx_btree_reindex_heap') newrels on oldrels.relfilenode = newrels.relfilenode and oldrels.dbid = newrels.dbid and oldrels.relname = newrels.relname; + dbid | relfilenode | oid | relname +------+-------------+-----+--------- +(0 rows) +2: COMMIT; +COMMIT +3: SELECT COUNT(*) FROM reindex_heap WHERE a = 1500; + count +------- + 0 +(1 row) +3: INSERT INTO reindex_heap VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_heap_btree_toast.out b/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_heap_btree_toast.out new file mode 100644 index 00000000000..6b6254e7230 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex/vacuum_while_reindex_heap_btree_toast.out @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS reindex_toast_heap; +DROP + +CREATE TABLE reindex_toast_heap (a text, b int); +CREATE +alter table reindex_toast_heap alter column a set storage external; +ALTER +insert into reindex_toast_heap select repeat('123456789',10000), i from generate_series(1,100) i; +INSERT 100 +create index idx_btree_reindex_toast_heap on reindex_toast_heap(b); +CREATE +-- @Description Ensures that a vacuum during reindex operations is ok +-- + +DELETE FROM reindex_toast_heap WHERE b % 4 = 0 ; +DELETE 25 +1: BEGIN; +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 +1: REINDEX index idx_btree_reindex_toast_heap; +REINDEX +2&: VACUUM reindex_toast_heap; +1: COMMIT; +COMMIT +2<: <... completed> +VACUUM +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +1: select oldrels.* from old_relfilenodes oldrels join (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') where relname = 'idx_btree_reindex_toast_heap' union all select gp_segment_id as dbid, relfilenode, relname from pg_class where relname = 'idx_btree_reindex_toast_heap') newrels on oldrels.relfilenode = newrels.relfilenode and oldrels.dbid = newrels.dbid and oldrels.relname = newrels.relname; + dbid | relfilenode | oid | relname +------+-------------+-----+--------- +(0 rows) +2: COMMIT; +COMMIT +3: SELECT COUNT(*) FROM reindex_toast_heap WHERE a = '1500'; + count +------- + 0 +(1 row) +3: INSERT INTO reindex_toast_heap VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/expected/reindex_gpfastsequence.out b/src/test/singlenode_isolation2/expected/reindex_gpfastsequence.out new file mode 100644 index 00000000000..785a0d00aee --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reindex_gpfastsequence.out @@ -0,0 +1,60 @@ +-- 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 index test_fastseqence_idx on test_fastseqence(b); +CREATE +insert into test_fastseqence select i , 'aa'||i from generate_series(1,100) i; +INSERT 100 + +select gp_inject_fault_infinite('reindex_relation', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- The reindex_relation fault should be hit +1&: reindex table gp_fastsequence; +2: select gp_wait_until_triggered_fault('reindex_relation', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- The insert should for reindex in session 1 +2&: insert into test_fastseqence select i , 'aa'||i from generate_series(1,100) i; + +select gp_inject_fault('reindex_relation', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +1<: <... completed> +REINDEX +2<: <... completed> +INSERT 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); + oid_same_on_all_segs +---------------------- + 1 +(1 row) + +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 +--------------- + 400 +(1 row) + +insert into test_fastseqence select i , 'aa'||i from generate_series(1,100) i; +INSERT 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 +--------------- + 600 +(1 row) + +-- Final validation should be performed by gpcheckcat, which runs at +-- the end of ICW in CI. diff --git a/src/test/singlenode_isolation2/expected/reorganize_after_ao_vacuum_skip_drop.out b/src/test/singlenode_isolation2/expected/reorganize_after_ao_vacuum_skip_drop.out new file mode 100644 index 00000000000..604c84856a0 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/reorganize_after_ao_vacuum_skip_drop.out @@ -0,0 +1,57 @@ +-- Ensure segfiles in AOSEG_STATE_AWAITING_DROP are not leaked in +-- AppendOnlyHash after doing an AT_SetDistributedBy operation which +-- rewrites the relation differently than other ALTER operations. + +CREATE TABLE reorganize_after_ao_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true); +CREATE +INSERT INTO reorganize_after_ao_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; +INSERT 10 + +DELETE FROM reorganize_after_ao_vacuum_skip_drop; +DELETE 10 + +-- We should see all aosegs in state 1 +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); + segno | state +-------+------- + 1 | 1 +(1 row) + +-- VACUUM while another session holds lock +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM reorganize_after_ao_vacuum_skip_drop; + count +------- + 0 +(1 row) +2: VACUUM reorganize_after_ao_vacuum_skip_drop; +VACUUM +1: END; +END + +-- 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'); + segno | state +-------+------- + 1 | 2 + 2 | 1 +(2 rows) + +-- The AO relation should be rewritten and AppendOnlyHash entry invalidated +1: ALTER TABLE reorganize_after_ao_vacuum_skip_drop SET WITH (reorganize=true); +ALTER +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); + segno | state +-------+------- +(0 rows) + +-- 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 +0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); + segno | ?column? | state +-------+----------+------- + 1 | t | 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/resgroup/.gitignore b/src/test/singlenode_isolation2/expected/resgroup/.gitignore new file mode 100644 index 00000000000..99fc2b81f18 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/.gitignore @@ -0,0 +1,2 @@ +resgroup_memory_runaway.out +resgroup_move_query.out diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_alter_concurrency.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_alter_concurrency.out new file mode 100644 index 00000000000..4775a18158c --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_alter_concurrency.out @@ -0,0 +1,696 @@ +-- create a resource group when gp_resource_manager is queue +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=10); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE + +-- 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 + +-- +-- 1. increase concurrency after pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER + +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN + +21:SET ROLE role_concurrency_test; +SET +22:SET ROLE role_concurrency_test; +SET +21&:BEGIN; +22&:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +ALTER + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +11:END; +END +11q: ... +21<: <... completed> +BEGIN +22<: <... completed> +BEGIN + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; +(2 rows) + +21:END; +END +22:END; +END +21q: ... +22q: ... + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +-- +-- 2. increase concurrency before pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER + +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +ALTER + +21:SET ROLE role_concurrency_test; +SET +22:SET ROLE role_concurrency_test; +SET +21&:BEGIN; +22&:BEGIN; + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +11:END; +END +11q: ... +21<: <... completed> +BEGIN +22<: <... completed> +BEGIN + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; +(2 rows) + +21:END; +END +22:END; +END +21q: ... +22q: ... + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +-- +-- 3. increase both concurrency & memory_shared_quota after pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 60; +ALTER + +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN + +21:SET ROLE role_concurrency_test; +SET +22:SET ROLE role_concurrency_test; +SET +21&:BEGIN; +22&:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +ALTER + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 20; +ALTER + +21<: <... completed> +BEGIN + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +11:END; +END +11q: ... +22<: <... completed> +BEGIN + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; +(2 rows) + +21:END; +END +22:END; +END +21q: ... +22q: ... + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +-- +-- 4. increase both concurrency & memory_shared_quota before pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 60; +ALTER + +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 20; +ALTER + +21:SET ROLE role_concurrency_test; +SET +22:SET ROLE role_concurrency_test; +SET +21:BEGIN; +BEGIN +22&:BEGIN; + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +11:END; +END +11q: ... +22<: <... completed> +BEGIN + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; +(2 rows) + +21:END; +END +22:END; +END +21q: ... +22q: ... + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +-- +-- 5. increase both concurrency & memory_limit after pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 0; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 30; +ALTER + +-- proc 11 gets a quota of 30/1=30 +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN + +21:SET ROLE role_concurrency_test; +SET +22:SET ROLE role_concurrency_test; +SET +21&:BEGIN; +22&:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +ALTER +-- now a new query needs a quota of 30/2=15 to run, +-- there is no free quota at the moment, so 21 & 22 are still pending +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 50; +ALTER +-- now a new query needs a quota of 50/2=25 to run, +-- but there is only 50-30=20 free quota, so 21 & 22 are still pending +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 60; +ALTER +-- now a new query needs a quota of 60/2=30 to run, +-- and there is 60-30=30 free quota, so 21 gets executed and 22 is still pending + +21<: <... completed> +BEGIN + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +11:END; +END +-- 11 releases its quota, so there is now 30 free quota, +-- so 22 gets executed +11q: ... +22<: <... completed> +BEGIN + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; +(2 rows) + +21:END; +END +22:END; +END +21q: ... +22q: ... + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +-- +-- 6. increase both concurrency & memory_limit before pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 0; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 30; +ALTER + +-- proc 11 gets a quota of 30/1=30 +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +ALTER +-- now a new query needs a quota of 30/2=15 to run, +-- there is no free quota at the moment +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; +(1 row) + +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 60; +ALTER +-- now a new query needs a quota of 60/2=30 to run, +-- and there is 60-30=30 free quota, +-- so one new query can get executed immediately + +21:SET ROLE role_concurrency_test; +SET +22:SET ROLE role_concurrency_test; +SET +21:BEGIN; +BEGIN +-- proc 21 gets executed, there is no free quota now, +-- so proc 22 is pending +22&:BEGIN; + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(3 rows) + +11:END; +END +-- 11 releases its quota, so there is now 30 free quota, +-- so 22 gets executed +11q: ... +22<: <... completed> +BEGIN + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | Client | idle in transaction | BEGIN; +(2 rows) + +21:END; +END +22:END; +END +21q: ... +22q: ... + +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +-- +-- 7. decrease concurrency +-- +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 50; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 0; +ALTER +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 10; +ALTER +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN + +12:SET ROLE role_concurrency_test; +SET +12:BEGIN; +BEGIN + +13:SET ROLE role_concurrency_test; +SET +13:BEGIN; +BEGIN + +14:SET ROLE role_concurrency_test; +SET +14:BEGIN; +BEGIN + +15:SET ROLE role_concurrency_test; +SET +15:BEGIN; +BEGIN + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER + +11q: ... +12q: ... +13q: ... +14q: ... +15q: ... +-- start_ignore +-- The 'q' command returns before the underlying segments all actually quit, +-- so a following DROP command might fail. Add a delay here as a workaround. +SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +-- end_ignore + +-- +-- 8. increase concurrency from 0 +-- +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_rate_limit=20, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=10); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE + +11:SET ROLE role_concurrency_test; +SET +11&:BEGIN; +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+--------+-------- + rg_concurrency_test | ResourceGroup | active | BEGIN; +(1 row) + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER + +11<: <... completed> +BEGIN +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; +(1 row) + +11:END; +END +11q: ... + +-- +-- 9.1 decrease concurrency to 0, +-- without running queries, +-- without pending queries. +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; +ALTER +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +-- +-- 9.2 decrease concurrency to 0, +-- with running queries, +-- without pending queries. +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; +(1 row) + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; +ALTER +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; +(1 row) + +11:END; +END +11q: ... + +-- +-- 9.3 decrease concurrency to 0, +-- with running queries, +-- with pending queries. +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +11:SET ROLE role_concurrency_test; +SET +11:BEGIN; +BEGIN +12:SET ROLE role_concurrency_test; +SET +12&:BEGIN; +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(2 rows) + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; +ALTER +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+---------------------+-------- + rg_concurrency_test | Client | idle in transaction | BEGIN; + rg_concurrency_test | ResourceGroup | active | BEGIN; +(2 rows) + +11:END; +END +11q: ... +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------------------+-----------------+--------+-------- + rg_concurrency_test | ResourceGroup | active | BEGIN; +(1 row) + +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; + pg_cancel_backend +------------------- + t +(1 row) +12<: <... completed> +ERROR: canceling statement due to user request +12q: ... +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +---------+-----------------+-------+------- +(0 rows) + +-- 10: drop a resgroup with concurrency=0 and pending queries +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +DROP +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +61:SET ROLE role_concurrency_test; +SET +61&:BEGIN; + +ALTER ROLE role_concurrency_test RESOURCE GROUP none; +ALTER +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +61<: <... completed> +BEGIN +61:END; +END +61q: ... + +-- 11: drop a role with concurrency=0 and pending queries +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +61:SET ROLE role_concurrency_test; +SET +61&:BEGIN; + +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +61<: <... completed> +ERROR: role with Oid 213301 was dropped +DETAIL: Cannot execute commands anymore, please terminate this session. +61q: ... + +-- cleanup +-- start_ignore +DROP VIEW rg_activity_status; +DROP +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +ERROR: resource group "rg_concurrency_test" does not exist +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_alter_memory_spill_ratio.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_alter_memory_spill_ratio.out new file mode 100644 index 00000000000..34fb75542c8 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_alter_memory_spill_ratio.out @@ -0,0 +1,74 @@ +-- start_ignore +DROP RESOURCE GROUP rg_spill_test; +ERROR: resource group "rg_spill_test" does not exist +-- end_ignore +CREATE RESOURCE GROUP rg_spill_test WITH (concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=20, memory_spill_ratio=10); +CREATE + +CREATE OR REPLACE VIEW rg_spill_status AS SELECT groupname, memory_shared_quota, memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_spill_test'; +CREATE + +-- ALTER MEMORY_SPILL_RATIO + +SELECT * FROM rg_spill_status; + groupname | memory_shared_quota | memory_spill_ratio +---------------+---------------------+-------------------- + rg_spill_test | 20 | 10 +(1 row) + +-- positive +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 20; +ALTER +SELECT * FROM rg_spill_status; + groupname | memory_shared_quota | memory_spill_ratio +---------------+---------------------+-------------------- + rg_spill_test | 20 | 20 +(1 row) + +-- positive, memory_spill_ratio range is [0, 100] +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 0; +ALTER +SELECT * FROM rg_spill_status; + groupname | memory_shared_quota | memory_spill_ratio +---------------+---------------------+-------------------- + rg_spill_test | 20 | 0 +(1 row) + +-- positive: no limit on the sum of shared and spill +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 81; +ALTER +SELECT * FROM rg_spill_status; + groupname | memory_shared_quota | memory_spill_ratio +---------------+---------------------+-------------------- + rg_spill_test | 20 | 81 +(1 row) + +-- negative: memory_spill_ratio is invalid +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 20.0; +ERROR: syntax error at or near "20.0" +LINE 1: ...ER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 20.0; + ^ +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO a; +ERROR: syntax error at or near "a" +LINE 1: ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO a; + ^ +SELECT * FROM rg_spill_status; + groupname | memory_shared_quota | memory_spill_ratio +---------------+---------------------+-------------------- + rg_spill_test | 20 | 81 +(1 row) + +-- negative: memory_spill_ratio is larger than RESGROUP_MAX_MEMORY_SPILL_RATIO +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 101; +ERROR: memory_spill_ratio range is [0, 100] +SELECT * FROM rg_spill_status; + groupname | memory_shared_quota | memory_spill_ratio +---------------+---------------------+-------------------- + rg_spill_test | 20 | 81 +(1 row) + +-- cleanup +DROP VIEW rg_spill_status; +DROP +DROP RESOURCE GROUP rg_spill_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_assign_slot_fail.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_assign_slot_fail.out new file mode 100644 index 00000000000..da279543021 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_assign_slot_fail.out @@ -0,0 +1,48 @@ +-- If the function AssignResGroupOnMaster() fails after getting a slot, +-- test the slot will be unassigned correctly. + +DROP ROLE IF EXISTS role_test; +DROP +-- 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_rate_limit=10, memory_limit=10); +CREATE +CREATE ROLE role_test RESOURCE GROUP rg_test; +CREATE + +1: SET ROLE role_test; +SET +1: BEGIN; +BEGIN +2: SET ROLE role_test; +SET +-- start_ignore +SELECT gp_inject_fault('resgroup_assigned_on_master', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('resgroup_assigned_on_master', 'error', 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- end_ignore +2: BEGIN; +ERROR: fault triggered, fault name:'resgroup_assigned_on_master' fault type:'error' +2: BEGIN; +BEGIN +1: END; +END +2: END; +END +1q: ... +2q: ... + +--clean up +DROP ROLE role_test; +DROP +DROP RESOURCE GROUP rg_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_bypass_memory_limit.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_bypass_memory_limit.out new file mode 100644 index 00000000000..1f2c8e885c5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_bypass_memory_limit.out @@ -0,0 +1,960 @@ +-- +-- set timezone will accumulate the memory usage in session. +-- here is used to test bypass memory limit is query level instead of session level. +-- +SET TIMEZONE TO 'Japan'; +SET +SET TIMEZONE TO 'Portugal'; +SET +SET TIMEZONE TO 'Canada/Eastern'; +SET +SET TIMEZONE TO 'Canada/Central'; +SET +SET TIMEZONE TO 'Canada/Newfoundland'; +SET +SET TIMEZONE TO 'Canada/Mountain'; +SET +SET TIMEZONE TO 'Canada/Saskatchewan'; +SET +SET TIMEZONE TO 'Canada/Yukon'; +SET +SET TIMEZONE TO 'Canada/Pacific'; +SET +SET TIMEZONE TO 'Canada/Atlantic'; +SET +SET TIMEZONE TO 'CET'; +SET +SET TIMEZONE TO 'ROK'; +SET +SET TIMEZONE TO 'Arctic/Longyearbyen'; +SET +SET TIMEZONE TO 'PRC'; +SET +SET TIMEZONE TO 'GMT-0'; +SET +SET TIMEZONE TO 'Iran'; +SET +SET TIMEZONE TO 'GB-Eire'; +SET +SET TIMEZONE TO 'Jamaica'; +SET +SET TIMEZONE TO 'Europe/Tiraspol'; +SET +SET TIMEZONE TO 'Europe/Vaduz'; +SET +SET TIMEZONE TO 'Europe/Berlin'; +SET +SET TIMEZONE TO 'Europe/San_Marino'; +SET +SET TIMEZONE TO 'Europe/Guernsey'; +SET +SET TIMEZONE TO 'Europe/Ljubljana'; +SET +SET TIMEZONE TO 'Europe/Simferopol'; +SET +SET TIMEZONE TO 'Europe/Belgrade'; +SET +SET TIMEZONE TO 'Europe/Chisinau'; +SET +SET TIMEZONE TO 'Europe/London'; +SET +SET TIMEZONE TO 'Europe/Vatican'; +SET +SET TIMEZONE TO 'Europe/Skopje'; +SET +SET TIMEZONE TO 'Europe/Saratov'; +SET +SET TIMEZONE TO 'Europe/Jersey'; +SET +SET TIMEZONE TO 'Europe/Samara'; +SET +SET TIMEZONE TO 'Europe/Oslo'; +SET +SET TIMEZONE TO 'Europe/Helsinki'; +SET +SET TIMEZONE TO 'Europe/Luxembourg'; +SET +SET TIMEZONE TO 'Europe/Bucharest'; +SET +SET TIMEZONE TO 'Europe/Podgorica'; +SET +SET TIMEZONE TO 'Europe/Madrid'; +SET +SET TIMEZONE TO 'Europe/Sarajevo'; +SET +SET TIMEZONE TO 'Europe/Busingen'; +SET +SET TIMEZONE TO 'Europe/Monaco'; +SET +SET TIMEZONE TO 'Europe/Belfast'; +SET +SET TIMEZONE TO 'Europe/Zagreb'; +SET +SET TIMEZONE TO 'Europe/Warsaw'; +SET +SET TIMEZONE TO 'Europe/Sofia'; +SET +SET TIMEZONE TO 'Europe/Tallinn'; +SET +SET TIMEZONE TO 'Europe/Brussels'; +SET +SET TIMEZONE TO 'Europe/Isle_of_Man'; +SET +SET TIMEZONE TO 'Europe/Stockholm'; +SET +SET TIMEZONE TO 'Europe/Lisbon'; +SET +SET TIMEZONE TO 'Europe/Istanbul'; +SET +SET TIMEZONE TO 'Europe/Copenhagen'; +SET +SET TIMEZONE TO 'Europe/Tirane'; +SET +SET TIMEZONE TO 'Europe/Dublin'; +SET +SET TIMEZONE TO 'Europe/Gibraltar'; +SET +SET TIMEZONE TO 'Europe/Athens'; +SET +SET TIMEZONE TO 'Europe/Zurich'; +SET +SET TIMEZONE TO 'Europe/Vilnius'; +SET +SET TIMEZONE TO 'Europe/Malta'; +SET +SET TIMEZONE TO 'Europe/Riga'; +SET +SET TIMEZONE TO 'Europe/Vienna'; +SET +SET TIMEZONE TO 'Europe/Moscow'; +SET +SET TIMEZONE TO 'Europe/Ulyanovsk'; +SET +SET TIMEZONE TO 'Europe/Rome'; +SET +SET TIMEZONE TO 'Europe/Kirov'; +SET +SET TIMEZONE TO 'Europe/Uzhgorod'; +SET +SET TIMEZONE TO 'Europe/Kaliningrad'; +SET +SET TIMEZONE TO 'Europe/Mariehamn'; +SET +SET TIMEZONE TO 'Europe/Budapest'; +SET +SET TIMEZONE TO 'Europe/Astrakhan'; +SET +SET TIMEZONE TO 'Europe/Volgograd'; +SET +SET TIMEZONE TO 'Europe/Kiev'; +SET +SET TIMEZONE TO 'Europe/Paris'; +SET +SET TIMEZONE TO 'Europe/Andorra'; +SET +SET TIMEZONE TO 'Europe/Amsterdam'; +SET +SET TIMEZONE TO 'Europe/Nicosia'; +SET +SET TIMEZONE TO 'Europe/Bratislava'; +SET +SET TIMEZONE TO 'Europe/Minsk'; +SET +SET TIMEZONE TO 'Europe/Prague'; +SET +SET TIMEZONE TO 'Europe/Zaporozhye'; +SET +SET TIMEZONE TO 'Egypt'; +SET +SET TIMEZONE TO 'Zulu'; +SET +SET TIMEZONE TO 'Etc/GMT+6'; +SET +SET TIMEZONE TO 'Etc/GMT-8'; +SET +SET TIMEZONE TO 'Etc/GMT-0'; +SET +SET TIMEZONE TO 'Etc/GMT+3'; +SET +SET TIMEZONE TO 'Etc/GMT-12'; +SET +SET TIMEZONE TO 'Etc/GMT+7'; +SET +SET TIMEZONE TO 'Etc/GMT-14'; +SET +SET TIMEZONE TO 'Etc/GMT-10'; +SET +SET TIMEZONE TO 'Etc/Zulu'; +SET +SET TIMEZONE TO 'Etc/GMT-4'; +SET +SET TIMEZONE TO 'Etc/GMT+5'; +SET +SET TIMEZONE TO 'Etc/GMT'; +SET +SET TIMEZONE TO 'Etc/GMT-11'; +SET +SET TIMEZONE TO 'Etc/GMT-5'; +SET +SET TIMEZONE TO 'Etc/GMT+1'; +SET +SET TIMEZONE TO 'Etc/GMT+10'; +SET +SET TIMEZONE TO 'Etc/UCT'; +SET +SET TIMEZONE TO 'Etc/GMT+11'; +SET +SET TIMEZONE TO 'Etc/GMT-3'; +SET +SET TIMEZONE TO 'Etc/Greenwich'; +SET +SET TIMEZONE TO 'Etc/GMT-13'; +SET +SET TIMEZONE TO 'Etc/GMT-9'; +SET +SET TIMEZONE TO 'Etc/GMT-7'; +SET +SET TIMEZONE TO 'Etc/GMT-6'; +SET +SET TIMEZONE TO 'Etc/GMT+4'; +SET +SET TIMEZONE TO 'Etc/GMT+2'; +SET +SET TIMEZONE TO 'Etc/Universal'; +SET +SET TIMEZONE TO 'Etc/GMT+9'; +SET +SET TIMEZONE TO 'Etc/GMT+0'; +SET +SET TIMEZONE TO 'Etc/GMT-2'; +SET +SET TIMEZONE TO 'Etc/GMT+12'; +SET +SET TIMEZONE TO 'Etc/GMT-1'; +SET +SET TIMEZONE TO 'Etc/UTC'; +SET +SET TIMEZONE TO 'Etc/GMT+8'; +SET +SET TIMEZONE TO 'Etc/GMT0'; +SET +SET TIMEZONE TO 'Australia/Currie'; +SET +SET TIMEZONE TO 'Australia/Lindeman'; +SET +SET TIMEZONE TO 'Australia/Melbourne'; +SET +SET TIMEZONE TO 'Australia/Yancowinna'; +SET +SET TIMEZONE TO 'Australia/Eucla'; +SET +SET TIMEZONE TO 'Australia/South'; +SET +SET TIMEZONE TO 'Australia/Lord_Howe'; +SET +SET TIMEZONE TO 'Australia/Perth'; +SET +SET TIMEZONE TO 'Australia/Canberra'; +SET +SET TIMEZONE TO 'Australia/Hobart'; +SET +SET TIMEZONE TO 'Australia/North'; +SET +SET TIMEZONE TO 'Australia/Broken_Hill'; +SET +SET TIMEZONE TO 'Australia/NSW'; +SET +SET TIMEZONE TO 'Australia/Victoria'; +SET +SET TIMEZONE TO 'Australia/Adelaide'; +SET +SET TIMEZONE TO 'Australia/Queensland'; +SET +SET TIMEZONE TO 'Australia/Darwin'; +SET +SET TIMEZONE TO 'Australia/West'; +SET +SET TIMEZONE TO 'Australia/LHI'; +SET +SET TIMEZONE TO 'Australia/ACT'; +SET +SET TIMEZONE TO 'Australia/Sydney'; +SET +SET TIMEZONE TO 'Australia/Brisbane'; +SET +SET TIMEZONE TO 'Australia/Tasmania'; +SET +SET TIMEZONE TO 'W-SU'; +SET +SET TIMEZONE TO 'Africa/Kigali'; +SET +SET TIMEZONE TO 'Africa/Dar_es_Salaam'; +SET +SET TIMEZONE TO 'Africa/Niamey'; +SET +SET TIMEZONE TO 'Africa/Brazzaville'; +SET +SET TIMEZONE TO 'Africa/Addis_Ababa'; +SET +SET TIMEZONE TO 'Africa/Kampala'; +SET +SET TIMEZONE TO 'Africa/Kinshasa'; +SET +SET TIMEZONE TO 'Africa/Lagos'; +SET +SET TIMEZONE TO 'Africa/Accra'; +SET +SET TIMEZONE TO 'Africa/Bangui'; +SET +SET TIMEZONE TO 'Africa/Maputo'; +SET +SET TIMEZONE TO 'Africa/Asmara'; +SET +SET TIMEZONE TO 'Africa/Juba'; +SET +SET TIMEZONE TO 'Africa/Tunis'; +SET +SET TIMEZONE TO 'Africa/Bissau'; +SET +SET TIMEZONE TO 'Africa/Freetown'; +SET +SET TIMEZONE TO 'Africa/Tripoli'; +SET +SET TIMEZONE TO 'Africa/Windhoek'; +SET +SET TIMEZONE TO 'Africa/Casablanca'; +SET +SET TIMEZONE TO 'Africa/Mbabane'; +SET +SET TIMEZONE TO 'Africa/Harare'; +SET +SET TIMEZONE TO 'Africa/Mogadishu'; +SET +SET TIMEZONE TO 'Africa/Banjul'; +SET +SET TIMEZONE TO 'Africa/Djibouti'; +SET +SET TIMEZONE TO 'Africa/Malabo'; +SET +SET TIMEZONE TO 'Africa/Nouakchott'; +SET +SET TIMEZONE TO 'Africa/Lubumbashi'; +SET +SET TIMEZONE TO 'Africa/Luanda'; +SET +SET TIMEZONE TO 'Africa/Bamako'; +SET +SET TIMEZONE TO 'Africa/Nairobi'; +SET +SET TIMEZONE TO 'Africa/Lusaka'; +SET +SET TIMEZONE TO 'Africa/Ouagadougou'; +SET +SET TIMEZONE TO 'Africa/Asmera'; +SET +SET TIMEZONE TO 'Africa/Douala'; +SET +SET TIMEZONE TO 'Africa/Dakar'; +SET +SET TIMEZONE TO 'Africa/Khartoum'; +SET +SET TIMEZONE TO 'Africa/Libreville'; +SET +SET TIMEZONE TO 'Africa/Maseru'; +SET +SET TIMEZONE TO 'Africa/Lome'; +SET +SET TIMEZONE TO 'Africa/Abidjan'; +SET +SET TIMEZONE TO 'Africa/Ceuta'; +SET +SET TIMEZONE TO 'Africa/El_Aaiun'; +SET +SET TIMEZONE TO 'Africa/Algiers'; +SET +SET TIMEZONE TO 'Africa/Ndjamena'; +SET +SET TIMEZONE TO 'Africa/Gaborone'; +SET +SET TIMEZONE TO 'Africa/Blantyre'; +SET +SET TIMEZONE TO 'Africa/Sao_Tome'; +SET +SET TIMEZONE TO 'Africa/Monrovia'; +SET +SET TIMEZONE TO 'Africa/Johannesburg'; +SET +SET TIMEZONE TO 'Africa/Timbuktu'; +SET +SET TIMEZONE TO 'Africa/Cairo'; +SET +SET TIMEZONE TO 'Africa/Porto-Novo'; +SET +SET TIMEZONE TO 'Africa/Bujumbura'; +SET +SET TIMEZONE TO 'Africa/Conakry'; +SET +SET TIMEZONE TO 'PST8PDT'; +SET +SET TIMEZONE TO 'Indian/Maldives'; +SET +SET TIMEZONE TO 'Indian/Mahe'; +SET +SET TIMEZONE TO 'Indian/Christmas'; +SET +SET TIMEZONE TO 'Indian/Mauritius'; +SET +SET TIMEZONE TO 'Indian/Chagos'; +SET +SET TIMEZONE TO 'Indian/Mayotte'; +SET +SET TIMEZONE TO 'Indian/Reunion'; +SET +SET TIMEZONE TO 'Indian/Antananarivo'; +SET +SET TIMEZONE TO 'Indian/Kerguelen'; +SET +SET TIMEZONE TO 'Indian/Cocos'; +SET +SET TIMEZONE TO 'Indian/Comoro'; +SET +SET TIMEZONE TO 'MET'; +SET +SET TIMEZONE TO 'ROC'; +SET +SET TIMEZONE TO 'EET'; +SET +SET TIMEZONE TO 'GMT'; +SET +SET TIMEZONE TO 'EST'; +SET +SET TIMEZONE TO 'Hongkong'; +SET +SET TIMEZONE TO 'Turkey'; +SET +SET TIMEZONE TO 'Iceland'; +SET +SET TIMEZONE TO 'Poland'; +SET +SET TIMEZONE TO 'GB'; +SET +SET TIMEZONE TO 'Israel'; +SET +SET TIMEZONE TO 'UCT'; +SET +SET TIMEZONE TO 'Navajo'; +SET +SET TIMEZONE TO 'Greenwich'; +SET +SET TIMEZONE TO 'Antarctica/Davis'; +SET +SET TIMEZONE TO 'Antarctica/Casey'; +SET +SET TIMEZONE TO 'Antarctica/Troll'; +SET +SET TIMEZONE TO 'Antarctica/DumontDUrville'; +SET +SET TIMEZONE TO 'Antarctica/South_Pole'; +SET +SET TIMEZONE TO 'Antarctica/Vostok'; +SET +SET TIMEZONE TO 'Antarctica/Syowa'; +SET +SET TIMEZONE TO 'Antarctica/Mawson'; +SET +SET TIMEZONE TO 'Antarctica/McMurdo'; +SET +SET TIMEZONE TO 'Antarctica/Palmer'; +SET +SET TIMEZONE TO 'Antarctica/Macquarie'; +SET +SET TIMEZONE TO 'Antarctica/Rothera'; +SET +SET TIMEZONE TO 'CST6CDT'; +SET +SET TIMEZONE TO 'Libya'; +SET +SET TIMEZONE TO 'Kwajalein'; +SET +SET TIMEZONE TO 'Cuba'; +SET +SET TIMEZONE TO 'Mexico/BajaNorte'; +SET +SET TIMEZONE TO 'Mexico/General'; +SET +SET TIMEZONE TO 'Mexico/BajaSur'; +SET +SET TIMEZONE TO 'WET'; +SET +SET TIMEZONE TO 'Singapore'; +SET +SET TIMEZONE TO 'Brazil/DeNoronha'; +SET +SET TIMEZONE TO 'Brazil/Acre'; +SET +SET TIMEZONE TO 'Brazil/West'; +SET +SET TIMEZONE TO 'Brazil/East'; +SET +SET TIMEZONE TO 'MST7MDT'; +SET +SET TIMEZONE TO 'US/Aleutian'; +SET +SET TIMEZONE TO 'US/Samoa'; +SET +SET TIMEZONE TO 'US/Eastern'; +SET +SET TIMEZONE TO 'US/Alaska'; +SET +SET TIMEZONE TO 'US/Indiana-Starke'; +SET +SET TIMEZONE TO 'US/Michigan'; +SET +SET TIMEZONE TO 'US/Central'; +SET +SET TIMEZONE TO 'US/East-Indiana'; +SET +SET TIMEZONE TO 'US/Mountain'; +SET +SET TIMEZONE TO 'US/Hawaii'; +SET +SET TIMEZONE TO 'US/Pacific'; +SET +SET TIMEZONE TO 'US/Arizona'; +SET +SET TIMEZONE TO 'Universal'; +SET +SET TIMEZONE TO 'Asia/Dushanbe'; +SET +SET TIMEZONE TO 'Asia/Oral'; +SET +SET TIMEZONE TO 'Asia/Magadan'; +SET +SET TIMEZONE TO 'Asia/Hong_Kong'; +SET +SET TIMEZONE TO 'Asia/Aden'; +SET +SET TIMEZONE TO 'Asia/Tomsk'; +SET +SET TIMEZONE TO 'Asia/Aqtobe'; +SET +SET TIMEZONE TO 'Asia/Pontianak'; +SET +SET TIMEZONE TO 'Asia/Kuching'; +SET +SET TIMEZONE TO 'Asia/Tbilisi'; +SET +SET TIMEZONE TO 'Asia/Novosibirsk'; +SET +SET TIMEZONE TO 'Asia/Chita'; +SET +SET TIMEZONE TO 'Asia/Hebron'; +SET +SET TIMEZONE TO 'Asia/Choibalsan'; +SET +SET TIMEZONE TO 'Asia/Qyzylorda'; +SET +SET TIMEZONE TO 'Asia/Jakarta'; +SET +SET TIMEZONE TO 'Asia/Colombo'; +SET +SET TIMEZONE TO 'Asia/Dili'; +SET +SET TIMEZONE TO 'Asia/Thimphu'; +SET +SET TIMEZONE TO 'Asia/Tashkent'; +SET +SET TIMEZONE TO 'Asia/Ujung_Pandang'; +SET +SET TIMEZONE TO 'Asia/Ulaanbaatar'; +SET +SET TIMEZONE TO 'Asia/Jerusalem'; +SET +SET TIMEZONE TO 'Asia/Pyongyang'; +SET +SET TIMEZONE TO 'Asia/Vladivostok'; +SET +SET TIMEZONE TO 'Asia/Samarkand'; +SET +SET TIMEZONE TO 'Asia/Beirut'; +SET +SET TIMEZONE TO 'Asia/Shanghai'; +SET +SET TIMEZONE TO 'Asia/Kabul'; +SET +SET TIMEZONE TO 'Asia/Bangkok'; +SET +SET TIMEZONE TO 'Asia/Almaty'; +SET +SET TIMEZONE TO 'Asia/Kathmandu'; +SET +SET TIMEZONE TO 'Asia/Ust-Nera'; +SET +SET TIMEZONE TO 'Asia/Yangon'; +SET +SET TIMEZONE TO 'Asia/Novokuznetsk'; +SET +SET TIMEZONE TO 'Asia/Qatar'; +SET +SET TIMEZONE TO 'Asia/Baghdad'; +SET +SET TIMEZONE TO 'Asia/Srednekolymsk'; +SET +SET TIMEZONE TO 'Asia/Hovd'; +SET +SET TIMEZONE TO 'Asia/Istanbul'; +SET +SET TIMEZONE TO 'Asia/Omsk'; +SET +SET TIMEZONE TO 'Asia/Macau'; +SET +SET TIMEZONE TO 'Asia/Yekaterinburg'; +SET +SET TIMEZONE TO 'Asia/Vientiane'; +SET +SET TIMEZONE TO 'Asia/Famagusta'; +SET +SET TIMEZONE TO 'Asia/Urumqi'; +SET +SET TIMEZONE TO 'Asia/Kuwait'; +SET +SET TIMEZONE TO 'Asia/Dhaka'; +SET +SET TIMEZONE TO 'Asia/Ulan_Bator'; +SET +SET TIMEZONE TO 'Asia/Dubai'; +SET +SET TIMEZONE TO 'Asia/Saigon'; +SET +SET TIMEZONE TO 'Asia/Muscat'; +SET +SET TIMEZONE TO 'Asia/Tehran'; +SET +SET TIMEZONE TO 'Asia/Ho_Chi_Minh'; +SET +SET TIMEZONE TO 'Asia/Aqtau'; +SET +SET TIMEZONE TO 'Asia/Bishkek'; +SET +SET TIMEZONE TO 'Asia/Kashgar'; +SET +SET TIMEZONE TO 'Asia/Gaza'; +SET +SET TIMEZONE TO 'Asia/Riyadh'; +SET +SET TIMEZONE TO 'Asia/Ashkhabad'; +SET +SET TIMEZONE TO 'Asia/Khandyga'; +SET +SET TIMEZONE TO 'Asia/Anadyr'; +SET +SET TIMEZONE TO 'Asia/Brunei'; +SET +SET TIMEZONE TO 'Asia/Phnom_Penh'; +SET +SET TIMEZONE TO 'Asia/Baku'; +SET +SET TIMEZONE TO 'Asia/Sakhalin'; +SET +SET TIMEZONE TO 'Asia/Atyrau'; +SET +SET TIMEZONE TO 'Asia/Ashgabat'; +SET +SET TIMEZONE TO 'Asia/Thimbu'; +SET +SET TIMEZONE TO 'Asia/Damascus'; +SET +SET TIMEZONE TO 'Asia/Kolkata'; +SET +SET TIMEZONE TO 'Asia/Jayapura'; +SET +SET TIMEZONE TO 'Asia/Tokyo'; +SET +SET TIMEZONE TO 'Asia/Katmandu'; +SET +SET TIMEZONE TO 'Asia/Bahrain'; +SET +SET TIMEZONE TO 'Asia/Tel_Aviv'; +SET +SET TIMEZONE TO 'Asia/Singapore'; +SET +SET TIMEZONE TO 'Asia/Krasnoyarsk'; +SET +SET TIMEZONE TO 'Asia/Seoul'; +SET +SET TIMEZONE TO 'Asia/Barnaul'; +SET +SET TIMEZONE TO 'Asia/Yakutsk'; +SET +SET TIMEZONE TO 'Asia/Irkutsk'; +SET +SET TIMEZONE TO 'Asia/Macao'; +SET +SET TIMEZONE TO 'Asia/Taipei'; +SET +SET TIMEZONE TO 'Asia/Kamchatka'; +SET +SET TIMEZONE TO 'Asia/Yerevan'; +SET +SET TIMEZONE TO 'Asia/Harbin'; +SET +SET TIMEZONE TO 'Asia/Manila'; +SET +SET TIMEZONE TO 'Asia/Qostanay'; +SET +SET TIMEZONE TO 'Asia/Amman'; +SET +SET TIMEZONE TO 'Asia/Nicosia'; +SET +SET TIMEZONE TO 'Asia/Karachi'; +SET +SET TIMEZONE TO 'Asia/Rangoon'; +SET +SET TIMEZONE TO 'Asia/Chungking'; +SET +SET TIMEZONE TO 'Asia/Chongqing'; +SET +SET TIMEZONE TO 'Asia/Makassar'; +SET +SET TIMEZONE TO 'Asia/Dacca'; +SET +SET TIMEZONE TO 'Asia/Kuala_Lumpur'; +SET +SET TIMEZONE TO 'Asia/Calcutta'; +SET +SET TIMEZONE TO 'EST5EDT'; +SET +SET TIMEZONE TO 'GMT+0'; +SET +SET TIMEZONE TO 'Pacific/Wake'; +SET +SET TIMEZONE TO 'Pacific/Samoa'; +SET +SET TIMEZONE TO 'Pacific/Efate'; +SET +SET TIMEZONE TO 'Pacific/Niue'; +SET +SET TIMEZONE TO 'Pacific/Pago_Pago'; +SET +SET TIMEZONE TO 'Pacific/Pitcairn'; +SET +SET TIMEZONE TO 'Pacific/Saipan'; +SET +SET TIMEZONE TO 'Pacific/Norfolk'; +SET +SET TIMEZONE TO 'Pacific/Yap'; +SET +SET TIMEZONE TO 'Pacific/Enderbury'; +SET +SET TIMEZONE TO 'Pacific/Port_Moresby'; +SET +SET TIMEZONE TO 'Pacific/Funafuti'; +SET +SET TIMEZONE TO 'Pacific/Apia'; +SET +SET TIMEZONE TO 'Pacific/Rarotonga'; +SET +SET TIMEZONE TO 'Pacific/Ponape'; +SET +SET TIMEZONE TO 'Pacific/Wallis'; +SET +SET TIMEZONE TO 'Pacific/Johnston'; +SET +SET TIMEZONE TO 'Pacific/Guam'; +SET +SET TIMEZONE TO 'Pacific/Guadalcanal'; +SET +SET TIMEZONE TO 'Pacific/Chatham'; +SET +SET TIMEZONE TO 'Pacific/Truk'; +SET +SET TIMEZONE TO 'Pacific/Fakaofo'; +SET +SET TIMEZONE TO 'Pacific/Kosrae'; +SET +SET TIMEZONE TO 'Pacific/Kiritimati'; +SET +SET TIMEZONE TO 'Pacific/Gambier'; +SET +SET TIMEZONE TO 'Pacific/Kwajalein'; +SET +SET TIMEZONE TO 'Pacific/Midway'; +SET +SET TIMEZONE TO 'Pacific/Pohnpei'; +SET +SET TIMEZONE TO 'Pacific/Majuro'; +SET +SET TIMEZONE TO 'Pacific/Tahiti'; +SET +SET TIMEZONE TO 'Pacific/Fiji'; +SET +SET TIMEZONE TO 'Pacific/Tongatapu'; +SET +SET TIMEZONE TO 'Pacific/Palau'; +SET +SET TIMEZONE TO 'Pacific/Galapagos'; +SET +SET TIMEZONE TO 'Pacific/Marquesas'; +SET +SET TIMEZONE TO 'Pacific/Bougainville'; +SET +SET TIMEZONE TO 'Pacific/Honolulu'; +SET +SET TIMEZONE TO 'Pacific/Noumea'; +SET +SET TIMEZONE TO 'Pacific/Auckland'; +SET +SET TIMEZONE TO 'Pacific/Chuuk'; +SET +SET TIMEZONE TO 'Pacific/Nauru'; +SET +SET TIMEZONE TO 'Pacific/Easter'; +SET +SET TIMEZONE TO 'Pacific/Tarawa'; +SET +SET TIMEZONE TO 'America/Detroit'; +SET +SET TIMEZONE TO 'America/Barbados'; +SET +SET TIMEZONE TO 'America/North_Dakota/New_Salem'; +SET +SET TIMEZONE TO 'America/North_Dakota/Center'; +SET +SET TIMEZONE TO 'America/North_Dakota/Beulah'; +SET +SET TIMEZONE TO 'America/Thunder_Bay'; +SET +SET TIMEZONE TO 'America/Panama'; +SET +SET TIMEZONE TO 'America/Cancun'; +SET +SET TIMEZONE TO 'America/Santo_Domingo'; +SET +SET TIMEZONE TO 'America/Matamoros'; +SET +SET TIMEZONE TO 'America/Port-au-Prince'; +SET +SET TIMEZONE TO 'America/Atikokan'; +SET +SET TIMEZONE TO 'America/Knox_IN'; +SET +SET TIMEZONE TO 'America/Cayenne'; +SET +SET TIMEZONE TO 'America/Kralendijk'; +SET +SET TIMEZONE TO 'America/Iqaluit'; +SET +SET TIMEZONE TO 'America/Paramaribo'; +SET +SET TIMEZONE TO 'America/Aruba'; +SET +SET TIMEZONE TO 'America/Vancouver'; +SET +SET TIMEZONE TO 'America/Noronha'; +SET +SET TIMEZONE TO 'America/Ojinaga'; +SET +SET TIMEZONE TO 'America/Atka'; +SET +SET TIMEZONE TO 'America/St_Johns'; +SET +SET TIMEZONE TO 'America/Mexico_City'; +SET +SET TIMEZONE TO 'America/Rosario'; +SET +SET TIMEZONE TO 'America/Nipigon'; +SET +SET TIMEZONE TO 'America/Costa_Rica'; +SET +SET TIMEZONE TO 'America/Regina'; +SET +SET TIMEZONE TO 'America/La_Paz'; +SET +SET TIMEZONE TO 'America/Jamaica'; +SET +SET TIMEZONE TO 'America/Anchorage'; +SET +SET TIMEZONE TO 'America/St_Kitts'; +SET +SET TIMEZONE TO 'America/Godthab'; +SET +SET TIMEZONE TO 'America/Swift_Current'; +SET +SET TIMEZONE TO 'America/Danmarkshavn'; +SET +SET TIMEZONE TO 'America/Phoenix'; +SET +SET TIMEZONE TO 'America/Lower_Princes'; +SET +SET TIMEZONE TO 'America/Yakutat'; +SET +SET TIMEZONE TO 'America/Menominee'; +SET +SET TIMEZONE TO 'America/Bahia'; +SET +SET TIMEZONE TO 'America/Montserrat'; +SET +SET TIMEZONE TO 'America/Miquelon'; +SET +SET TIMEZONE TO 'America/Anguilla'; +SET +SET TIMEZONE TO 'America/Grand_Turk'; +SET +SET TIMEZONE TO 'America/Coral_Harbour'; +SET +SET TIMEZONE TO 'America/Glace_Bay'; +SET +SET TIMEZONE TO 'America/Boa_Vista'; +SET +SET TIMEZONE TO 'America/Dominica'; +SET +SET TIMEZONE TO 'America/Goose_Bay'; +SET +SET TIMEZONE TO 'America/Caracas'; +SET +SET TIMEZONE TO 'America/Boise'; +SET +SET TIMEZONE TO 'America/Cayman'; +SET +SET TIMEZONE TO 'America/Puerto_Rico'; +SET +SET TIMEZONE TO 'America/Guyana'; +SET +SET TIMEZONE TO 'America/Metlakatla'; +SET +SET TIMEZONE TO 'America/Cuiaba'; +SET +SET TIMEZONE TO 'America/Virgin'; +SET +SET TIMEZONE TO 'America/Campo_Grande'; +SET +SET TIMEZONE TO 'America/Maceio'; +SET +SET TIMEZONE TO 'America/Scoresbysund'; +SET +SET TIMEZONE TO 'America/Guadeloupe'; +SET +SET TIMEZONE TO 'America/Indiana/Vevay'; +SET +SET TIMEZONE TO 'America/Indiana/Winamac'; +SET +SET TIMEZONE TO 'America/Indiana/Petersburg'; +SET +SET TIMEZONE TO 'America/Indiana/Marengo'; +SET +SET TIMEZONE TO 'America/Indiana/Knox'; +SET +SET TIMEZONE TO 'America/Indiana/Indianapolis'; +SET +SET TIMEZONE TO 'America/Indiana/Vincennes'; +SET +SET TIMEZONE TO 'America/Indiana/Tell_City'; +SET +SET TIMEZONE TO 'America/Manaus'; +SET +SET TIMEZONE TO 'America/Resolute'; +SET +SET TIMEZONE TO 'America/Pangnirtung'; +SET +SET TIMEZONE TO 'America/Winnipeg'; +SET diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_cancel_terminate_concurrency.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_cancel_terminate_concurrency.out new file mode 100644 index 00000000000..d1aa7e0703a --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_cancel_terminate_concurrency.out @@ -0,0 +1,300 @@ +-- test1: cancel a query that is waiting for a slot +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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 RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +1:SET ROLE role_concurrency_test; +SET +1:BEGIN; +BEGIN +2:SET ROLE role_concurrency_test; +SET +2&:BEGIN; +3:SET ROLE role_concurrency_test; +SET +3&:BEGIN; +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+---------------------+--------+--------------------- + t | Client | idle in transaction | BEGIN; | rg_concurrency_test + t | ResourceGroup | active | BEGIN; | rg_concurrency_test + t | ResourceGroup | active | BEGIN; | rg_concurrency_test +(3 rows) +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; + pg_cancel_backend +------------------- + t + t +(2 rows) +1:END; +END +2<: <... completed> +ERROR: canceling statement due to user request +3<: <... completed> +ERROR: canceling statement due to user request +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+-------+--------+--------------------- + t | Client | idle | BEGIN; | rg_concurrency_test + t | Client | idle | BEGIN; | rg_concurrency_test +(2 rows) +1q: ... +2q: ... +3q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- test2: terminate a query that is waiting for a slot +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +1:SET ROLE role_concurrency_test; +SET +1:BEGIN; +BEGIN +2:SET ROLE role_concurrency_test; +SET +2&:BEGIN; +3:SET ROLE role_concurrency_test; +SET +3&:BEGIN; +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+---------------------+--------+--------------------- + t | Client | idle in transaction | BEGIN; | rg_concurrency_test + t | ResourceGroup | active | BEGIN; | rg_concurrency_test + t | ResourceGroup | active | BEGIN; | rg_concurrency_test +(3 rows) +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; + pg_terminate_backend +---------------------- + t + t +(2 rows) +1:END; +END +2<: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +3<: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+-------+-------+--------- +(0 rows) +1q: ... +2q: ... +3q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- test3: cancel a query that is running +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +1:SET ROLE role_concurrency_test; +SET +1&:SELECT pg_sleep(10000); +2:SET ROLE role_concurrency_test; +SET +2&:SELECT pg_sleep(10000); +6:SET ROLE role_concurrency_test; +SET +6&:BEGIN; +7:SET ROLE role_concurrency_test; +SET +7&:BEGIN; +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+--------+-------------------------+--------------------- + t | Timeout | active | SELECT pg_sleep(10000); | rg_concurrency_test + t | Timeout | active | SELECT pg_sleep(10000); | rg_concurrency_test + t | ResourceGroup | active | BEGIN; | rg_concurrency_test + t | ResourceGroup | active | BEGIN; | rg_concurrency_test +(4 rows) +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type = 'Timeout' AND rsgname='rg_concurrency_test'; + pg_cancel_backend +------------------- + t + t +(2 rows) +1<: <... completed> +ERROR: canceling statement due to user request +2<: <... completed> +ERROR: canceling statement due to user request +6<: <... completed> +BEGIN +7<: <... completed> +BEGIN +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+---------------------+--------+--------------------- + t | Client | idle in transaction | BEGIN; | rg_concurrency_test + t | Client | idle in transaction | BEGIN; | rg_concurrency_test +(2 rows) +1q: ... +2q: ... +6q: ... +7q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- test4: terminate a query that is running +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +1:SET ROLE role_concurrency_test; +SET +1&:SELECT pg_sleep(10000); +2:SET ROLE role_concurrency_test; +SET +2&:SELECT pg_sleep(10000); +6:SET ROLE role_concurrency_test; +SET +6&:BEGIN; +7:SET ROLE role_concurrency_test; +SET +7&:BEGIN; +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+--------+-------------------------+--------------------- + t | Timeout | active | SELECT pg_sleep(10000); | rg_concurrency_test + t | Timeout | active | SELECT pg_sleep(10000); | rg_concurrency_test + t | ResourceGroup | active | BEGIN; | rg_concurrency_test + t | ResourceGroup | active | BEGIN; | rg_concurrency_test +(4 rows) +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type = 'Timeout' AND rsgname='rg_concurrency_test'; + pg_terminate_backend +---------------------- + t + t +(2 rows) +1<: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +2<: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +6<: <... completed> +BEGIN +7<: <... completed> +BEGIN +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+---------------------+--------+--------------------- + t | Client | idle in transaction | BEGIN; | rg_concurrency_test + t | Client | idle in transaction | BEGIN; | rg_concurrency_test +(2 rows) +1q: ... +2q: ... +6q: ... +7q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- test5: terminate a query waiting for a slot, that opens a transaction on exit callback +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +1:SET ROLE role_concurrency_test; +SET +1:CREATE TEMP TABLE tmp(a INT); +CREATE +2:SET ROLE role_concurrency_test; +SET +2:BEGIN; +BEGIN +1&:SELECT 1; +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+---------------------+-----------+--------------------- + t | Client | idle in transaction | BEGIN; | rg_concurrency_test + t | ResourceGroup | active | SELECT 1; | rg_concurrency_test +(2 rows) +-- Upon receiving the terminate request, session 1 should start a new transaction to cleanup temp table. +-- Note, that session 1 has already been waiting for resource group slot, its new transaction will bypass +-- resource group since it's exiting. +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; + pg_terminate_backend +---------------------- + t +(1 row) +1<: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +2:COMMIT; +COMMIT +SELECT * FROM rg_concurrency_view; + waiting | wait_event_type | state | query | rsgname +---------+-----------------+-------+-------+--------- +(0 rows) +1q: ... +2q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +DROP VIEW rg_concurrency_view; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_concurrency.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_concurrency.out new file mode 100644 index 00000000000..7d30d7633ce --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_concurrency.out @@ -0,0 +1,506 @@ +-- 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 +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE + +-- no query has been assigned to the this 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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 0 | 0 | 0 | 0 +(1 row) +2:SET ROLE role_concurrency_test; +SET +2:BEGIN; +BEGIN +3:SET ROLE role_concurrency_test; +SET +3:BEGIN; +BEGIN +4:SET ROLE role_concurrency_test; +SET +4&:BEGIN; + +-- new transaction will be blocked when the concurrency limit of the resource group is reached. +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 2 | 1 | 1 | 2 +(1 row) +SELECT wait_event from pg_stat_activity where query = 'BEGIN;' and state = 'active' and rsgname = 'rg_concurrency_test' and wait_event_type='ResourceGroup'; + wait_event +--------------------- + rg_concurrency_test +(1 row) +2:END; +END +3:END; +END +4<: <... completed> +BEGIN +4:END; +END +2q: ... +3q: ... +4q: ... +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 0 | 0 | 1 | 3 +(1 row) +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- 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 +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +12:SET ROLE role_concurrency_test; +SET +12:BEGIN; +BEGIN +13:SET ROLE role_concurrency_test; +SET +13:BEGIN; +BEGIN +14:SET ROLE role_concurrency_test; +SET +14&:BEGIN; +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 2 | 1 | 1 | 2 +(1 row) +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; + concurrency +------------- + 2 +(1 row) +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 3; +ALTER +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 2 | 1 | 1 | 2 +(1 row) +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; + concurrency +------------- + 3 +(1 row) +12:END; +END +13:END; +END +14<: <... completed> +BEGIN +14:END; +END +12q: ... +13q: ... +14q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- 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 +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +22:SET ROLE role_concurrency_test; +SET +22:BEGIN; +BEGIN +23:SET ROLE role_concurrency_test; +SET +23:BEGIN; +BEGIN +24:SET ROLE role_concurrency_test; +SET +24:BEGIN; +BEGIN +25:SET ROLE role_concurrency_test; +SET +25&:BEGIN; +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 3 | 1 | 1 | 3 +(1 row) +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; + concurrency +------------- + 3 +(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 +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; + concurrency +------------- + 2 +(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 +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 2 | 1 | 1 | 3 +(1 row) +-- New transaction will be queued, there're 2 running and 2 queueing transactions. +24&:BEGIN; +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 2 | 2 | 2 | 3 +(1 row) +-- Finish another transaction, one queueing transaction will be woken up, there're 2 running transactions and 1 queueing transaction. +22:END; +END +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 2 | 1 | 2 | 4 +(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 +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; + concurrency +------------- + 2 +(1 row) +-- Finish another transaction, one queueing transaction will be woken up, there're 2 running transactions and 0 queueing transaction. +23:END; +END +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 +---------------------+-------------+--------------+------------+-------------- + rg_concurrency_test | 2 | 0 | 2 | 5 +(1 row) +24<: <... completed> +BEGIN +25<: <... completed> +BEGIN +25:END; +END +24:END; +END +22q: ... +23q: ... +24q: ... +25q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- test4: concurrently drop resource group + +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE + +-- DROP should fail if there're running transactions +32:SET ROLE role_concurrency_test; +SET +32:BEGIN; +BEGIN +DROP ROLE role_concurrency_test; +DROP +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 + +DROP ROLE IF EXISTS role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- test5: QD exit before QE +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +51:SET ROLE role_concurrency_test; +SET +51:BEGIN; +BEGIN +52:SET ROLE role_concurrency_test; +SET +52&:BEGIN; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; + pg_cancel_backend +------------------- + t +(1 row) +52<: <... completed> +ERROR: canceling statement due to user request +52&:BEGIN; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; + pg_cancel_backend +------------------- + t +(1 row) +52<: <... completed> +ERROR: canceling statement due to user request +51q: ... +52q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- test6: cancel a query that is waiting for a slot +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +51:SET ROLE role_concurrency_test; +SET +51:BEGIN; +BEGIN +52:SET ROLE role_concurrency_test; +SET +52&:BEGIN; +51q: ... +52<: <... completed> +BEGIN +52q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + + +-- test7: terminate a query that is waiting for a slot +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +61:SET ROLE role_concurrency_test; +SET +61:BEGIN; +BEGIN +62:SET ROLE role_concurrency_test; +SET +62&:BEGIN; +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; + pg_terminate_backend +---------------------- + t +(1 row) +62<: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +61q: ... +62q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- test8: create a resgroup with concurrency=0 +DROP ROLE IF EXISTS role_concurrency_test; +DROP +-- 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_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE +61:SET ROLE role_concurrency_test; +SET +61&:BEGIN; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; + pg_cancel_backend +------------------- + t +(1 row) +61<: <... completed> +ERROR: canceling statement due to user request +61q: ... +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP + +-- +-- Test cursors, pl/* functions only take one slot. +-- +-- set concurrency to 1 +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +CREATE + +-- 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 +71:CREATE TABLE bar_concurrency_test as select i as c1 , i as c2 from generate_series(1, 1000) i; +CREATE 1000 +71:BEGIN; +BEGIN +71:DECLARE c1 CURSOR for select c1, c2 from foo_concurrency_test order by c1 limit 10; +DECLARE +71:DECLARE c2 CURSOR for select c1, c2 from bar_concurrency_test order by c1 limit 10; +DECLARE +71:DECLARE c3 CURSOR for select count(*) from foo_concurrency_test t1, bar_concurrency_test t2 where t1.c2 = t2.c2; +DECLARE +71:Fetch ALL FROM c1; + c1 | c2 +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 +(10 rows) +71:Fetch ALL FROM c2; + c1 | c2 +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 +(10 rows) +71:Fetch ALL FROM c3; + count +------- + 1000 +(1 row) +71:END; +END + +-- 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 + +71: select func_concurrency_test(); + func_concurrency_test +----------------------- + 1000 +(1 row) + +-- Prepare/execute statements and verify that it only takes one resource group slot. +71:BEGIN; +BEGIN +71:PREPARE p1 (integer) as select * from foo_concurrency_test where c2=$1; +PREPARE +71:PREPARE p2 (integer) as select * from bar_concurrency_test where c2=$1; +PREPARE +71:EXECUTE p1(1); + c1 | c2 +----+---- + 1 | 1 +(1 row) +71:EXECUTE p2(2); + c1 | c2 +----+---- + 2 | 2 +(1 row) +71:END; +END +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; +PREPARE +71:EXECUTE p3(1); + c1 | c2 +----+---- + 1 | 1 +(1 row) +71:EXECUTE p4(2); + c1 | c2 +----+---- + 2 | 2 +(1 row) + +DROP TABLE foo_concurrency_test; +DROP +DROP TABLE bar_concurrency_test; +DROP +DROP ROLE role_concurrency_test; +DROP +DROP RESOURCE GROUP rg_concurrency_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_cpuset_empty_default.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_cpuset_empty_default.out new file mode 100644 index 00000000000..160f6cd7db3 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_cpuset_empty_default.out @@ -0,0 +1,38 @@ +-- A regression test for cpuset. +-- +-- When all the cpu cores are allocated the default cpuset group should +-- fallback to core 0. However this fallback logic was only added on +-- CREATE / ALTER RESOURCE GROUP, but missing in startup logic, an empty cpu +-- core list "" is set to cgroup and cause a runtime error: +-- +-- can't write data to file '/sys/fs/cgroup/cpuset/gpdb/1/cpuset.cpus': +-- No space left on device (resgroup-ops-linux.c:916) +-- +-- To trigger the issue we create a resource group, allocate all the cpu cores +-- to it, and restart the cluster. + +-- start_ignore +DROP RESOURCE GROUP rg1_cpuset_test; +-- end_ignore + +-- Create a resource group with all the cpu cores. +-- The isolation2 test framework does not support \set so we have to plan with +-- some tricks. +! psql -d isolation2resgrouptest -Ac "CREATE RESOURCE GROUP rg1_cpuset_test WITH (memory_limit=10, cpuset='0-$(($(nproc)-1))')"; +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 +! psql -d isolation2resgrouptest -Ac "ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '0-$(($(nproc)-1))'"; +ALTER RESOURCE GROUP + + +-- start_ignore +! gpstop -rai; +-- end_ignore + +-- Cleanup in a new connection as the default one is disconnected by gpstop +10: DROP RESOURCE GROUP rg1_cpuset_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_dumpinfo.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_dumpinfo.out new file mode 100644 index 00000000000..d9ab35ad819 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_dumpinfo.out @@ -0,0 +1,78 @@ +DROP ROLE IF EXISTS role_dumpinfo_test; +DROP +DROP ROLE IF EXISTS role_permission; +DROP +-- start_ignore +DROP RESOURCE GROUP rg_dumpinfo_test; +ERROR: resource group "rg_dumpinfo_test" does not exist +CREATE LANGUAGE plpython3u; +CREATE +-- end_ignore + +CREATE FUNCTION dump_test_check() RETURNS bool as $$ import json import pg +def validate(json_obj, segnum): array = json_obj.get("info") #validate segnum if len(array) != segnum: return False qd_info = [j for j in array if j["segid"] == -1][0] #validate keys keys = ["segid", "segmentsOnMaster", "loaded", "totalChunks", "freeChunks", "chunkSizeInBits", "groups"] for key in keys: if key not in qd_info: return False +groups = [g for g in qd_info["groups"] if g["group_id"] > 6438] #validate user created group if len(groups) != 1: return False group = groups[0] #validate group keys keys = ["group_id", "nRunning", "locked_for_drop", "memExpected", "memQuotaGranted", "memSharedGranted", "memQuotaUsed", "memUsage", "memSharedUsage"] for key in keys: if key not in group: return False +#validate waitqueue wait_queue = group["wait_queue"] if wait_queue["wait_queue_size"] != 1: return False #validate nrunning nrunning = group["nRunning"] if nrunning != 2: return False +return True +conn = pg.connect(dbname="postgres") +r = conn.query("select count(*) from gp_segment_configuration where role = 'p';") n = r.getresult()[0][0] +r = conn.query("select value from pg_resgroup_get_status_kv('dump');") json_text = r.getresult()[0][0] json_obj = json.loads(json_text) +return validate(json_obj, n) +$$ LANGUAGE plpython3u; +CREATE + +CREATE RESOURCE GROUP rg_dumpinfo_test WITH (concurrency=2, cpu_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_dumpinfo_test RESOURCE GROUP rg_dumpinfo_test; +CREATE + +2:SET ROLE role_dumpinfo_test; +SET +2:BEGIN; +BEGIN +3:SET ROLE role_dumpinfo_test; +SET +3:BEGIN; +BEGIN +4:SET ROLE role_dumpinfo_test; +SET +4&:BEGIN; + +SELECT dump_test_check(); + dump_test_check +----------------- + t +(1 row) + +2:END; +END +3:END; +END +4<: <... completed> +BEGIN +4:END; +END +2q: ... +3q: ... +4q: ... + +CREATE ROLE role_permission; +CREATE +SET ROLE role_permission; +SET +select value from pg_resgroup_get_status_kv('dump'); +ERROR: only superusers can call this function + +RESET ROLE; +RESET + +DROP ROLE role_dumpinfo_test; +DROP +DROP ROLE role_permission; +DROP +DROP RESOURCE GROUP rg_dumpinfo_test; +DROP +-- start_ignore +DROP LANGUAGE plpython3u CASCADE; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_functions.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_functions.out new file mode 100644 index 00000000000..9e0c1e8a894 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_functions.out @@ -0,0 +1,17 @@ +-- start_ignore +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, cpu_usage, memory_usage); + groupid | num_running | num_queueing | num_queued | num_executed +---------+-------------+--------------+------------+-------------- +(0 rows) +-- end_ignore +CREATE TEMP TABLE resgroup_function_test(LIKE gp_toolkit.gp_resgroup_status); +CREATE + +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, cpu_usage, memory_usage) LIMIT 1; +INSERT 1 + +SELECT count(num_executed)>0 FROM resgroup_function_test WHERE num_executed IS NOT NULL; + ?column? +---------- + t +(1 row) diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_hashagg_spill.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_hashagg_spill.out new file mode 100644 index 00000000000..d3422c7a85f --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_hashagg_spill.out @@ -0,0 +1,161 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema hashagg_spill; +CREATE +set search_path to hashagg_spill; +SET + +-- start_ignore +create language plpython3u; +CREATE +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function hashagg_spill.is_workfile_created(explain_query text) returns setof int as $$ import re query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" rv = plpy.execute(query) nsegments = int(rv[0]['nsegments']) rv = plpy.execute(explain_query) search_text = 'Work_mem used' result = [] for i in range(len(rv)): cur_line = rv[i]['QUERY PLAN'] if search_text.lower() in cur_line.lower(): p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') m = p.match(cur_line) if not m: continue workfile_created = int(m.group(2)) cur_row = int(workfile_created == nsegments) result.append(cur_row) return result $$ language plpython3u; +CREATE + +create table testhagg (i1 int, i2 int, i3 int, i4 int); +CREATE +insert into testhagg select i,i,i,i from (select generate_series(1, nsegments * 17000) as i from (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; +INSERT 51000 + + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +-- end_ignore +CREATE ROLE role1_memory_test SUPERUSER; +CREATE +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=10); +CREATE +SET ROLE TO role1_memory_test; +SET + +0: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SPILL_RATIO 2; +ALTER +0: ALTER ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +ALTER +set gp_resgroup_print_operator_memory_limits=on; +SET + +-- the number of rows returned by the query varies depending on the number of segments, so +-- only print the first 10 +select * from (select max(i1) from testhagg group by i2) foo order by 1 limit 10; + max +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) +select * from hashagg_spill.is_workfile_created('explain analyze select max(i1) from testhagg group by i2;'); + is_workfile_created +--------------------- + 1 +(1 row) +select * from hashagg_spill.is_workfile_created('explain analyze select max(i1) from testhagg group by i2 limit 45000;'); + is_workfile_created +--------------------- + 1 +(1 row) + + +-- Test HashAgg with increasing amount of overflows + +reset all; +RESET + +-- Returns the number of overflows from EXPLAIN ANALYZE output +create or replace function hashagg_spill.num_hashagg_overflows(explain_query text) returns setof int as $$ import re query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" rv = plpy.execute(query) rv = plpy.execute(explain_query) result = [] for i in range(len(rv)): cur_line = rv[i]['QUERY PLAN'] p = re.compile('.+\((seg[\d]+).+ ([\d+]) overflows;') m = p.match(cur_line) if m: overflows = int(m.group(2)) result.append(overflows) return result $$ language plpython3u; +CREATE + +-- Test agg spilling scenarios +drop table if exists aggspill; +DROP +create table aggspill (i int, j int, t text) distributed by (i); +CREATE +insert into aggspill select i, i*2, i::text from generate_series(1, 10000) i; +INSERT 10000 +insert into aggspill select i, i*2, i::text from generate_series(1, 100000) i; +INSERT 100000 +insert into aggspill select i, i*2, i::text from generate_series(1, 1000000) i; +INSERT 1000000 + +-- No spill with large statement memory +0: ALTER ROLE role1_memory_test RESOURCE GROUP none; +ALTER +0: DROP RESOURCE GROUP rg1_memory_test; +DROP +0: CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=1, cpu_rate_limit=10, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=30); +CREATE +0: ALTER ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +ALTER +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 1) g; + count +-------- + 900000 +(1 row) + +-- Reduce the statement memory to induce spilling +0: ALTER ROLE role1_memory_test RESOURCE GROUP none; +ALTER +0: DROP RESOURCE GROUP rg1_memory_test; +DROP +0: CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=10); +CREATE +0: ALTER ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +ALTER +select overflows >= 1 from hashagg_spill.num_hashagg_overflows('explain analyze select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 2) g') overflows; + ?column? +---------- + t +(1 row) +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 2) g; + count +------- + 90000 +(1 row) + +-- Reduce the statement memory, nbatches and entrysize even further to cause multiple overflows +set gp_hashagg_default_nbatches = 4; +SET +0: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SPILL_RATIO 5; +ALTER +0: ALTER ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +ALTER + +select overflows > 1 from hashagg_spill.num_hashagg_overflows('explain analyze select count(*) from (select i, count(*) from aggspill group by i,j,t having count(*) = 3) g') overflows; + ?column? +---------- + t +(1 row) + +select count(*) from (select i, count(*) from aggspill group by i,j,t having count(*) = 3) g; + count +------- + 10000 +(1 row) + +drop schema hashagg_spill cascade; +DROP +drop table aggspill; +DROP + +-- start_ignore +RESET ROLE; +RESET +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_hashjoin_spill.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_hashjoin_spill.out new file mode 100644 index 00000000000..4fea4e63a49 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_hashjoin_spill.out @@ -0,0 +1,105 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema hashjoin_spill; +CREATE +set search_path to hashjoin_spill; +SET + +-- start_ignore +create language plpython3u; +ERROR: language "plpython3u" already exists +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function hashjoin_spill.is_workfile_created(explain_query text) returns setof int as $$ import re query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" rv = plpy.execute(query) nsegments = int(rv[0]['nsegments']) rv = plpy.execute(explain_query) search_text = 'Work_mem used' result = [] for i in range(len(rv)): cur_line = rv[i]['QUERY PLAN'] if search_text.lower() in cur_line.lower(): p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') m = p.match(cur_line) workfile_created = int(m.group(2)) cur_row = int(workfile_created == nsegments) result.append(cur_row) return result $$ language plpython3u; +CREATE + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=1); +CREATE +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +CREATE +SET ROLE TO role1_memory_test; +SET + +CREATE TABLE test_hj_spill (i1 int, i2 int, i3 int, i4 int, i5 int, i6 int, i7 int, i8 int); +CREATE +insert into test_hj_spill SELECT i,i,i%1000,i,i,i,i,i from (select generate_series(1, nsegments * 15000) as i from (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; +INSERT 45000 +set gp_resgroup_print_operator_memory_limits=on; +SET + +set gp_workfile_type_hashjoin=buffile; +SET +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; + avg +------- + 499.5 +(1 row) +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2;'); + is_workfile_created +--------------------- + 1 +(1 row) +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 15000;'); + is_workfile_created +--------------------- + 1 +(1 row) + +set gp_workfile_type_hashjoin=bfz; +SET +set gp_workfile_compress_algorithm=zlib; +SET +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; + avg +------- + 499.5 +(1 row) +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2'); + is_workfile_created +--------------------- + 1 +(1 row) +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 15000;'); + is_workfile_created +--------------------- + 1 +(1 row) + +set gp_workfile_compress_algorithm=NONE; +SET +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; + avg +------- + 499.5 +(1 row) +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2'); + is_workfile_created +--------------------- + 1 +(1 row) +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 15000;'); + is_workfile_created +--------------------- + 1 +(1 row) + +drop schema hashjoin_spill cascade; +DROP + +-- start_ignore +RESET ROLE; +RESET +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_materialize_spill.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_materialize_spill.out new file mode 100644 index 00000000000..8df1d3b0744 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_materialize_spill.out @@ -0,0 +1,122 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema materialize_spill; +CREATE +set search_path to materialize_spill; +SET + +-- start_ignore +create language plpython3u; +CREATE +-- end_ignore + +-- Helper function to verify that a plan spilled to disk. For each node +-- in the plan that used Workfiles (Materialize or Sort nodes, currently), +-- return the number of segments where the node spilled to disk. +create or replace function num_workfiles_created(explain_query text) returns setof int as $$ import re rv = plpy.execute(explain_query) search_text = 'Work_mem used' result = [] for i in range(len(rv)): cur_line = rv[i]['QUERY PLAN'] if search_text.lower() in cur_line.lower(): p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') m = p.match(cur_line) workfile_created = int(m.group(2)) result.append(workfile_created) return result $$ language plpython3u; +CREATE + +-- Run a query that contains a Materialize node that spills to disk. +-- +-- The expected plan is something like this: +-- +-- Gather Motion 3:1 +-- -> Nested Loop Left Join +-- Join Filter: t1.i1 = t2.i2 +-- -> Seq Scan on test_mat_small t1 +-- -> Materialize +-- -> Redistribute Motion 3:3 +-- Hash Key: t2.i2 +-- -> Seq Scan on test_mat_large t2 +-- +-- The planner will put a Materialize node on the inner side, to shield +-- the Motion node from rewinding. Because the larger table doesn't fit +-- in memory, the Materialize will spill to disk. +-- +CREATE TABLE test_mat_small (i1 int); +CREATE +INSERT INTO test_mat_small SELECT i from generate_series(101, 105) i; +INSERT 5 + +-- Scale the larger table's size with the number of segments, so that there is enough +-- data on every segment to cause spilling. +CREATE TABLE test_mat_large (i1 int, i2 int, i3 int, i4 int, i5 int, i6 int, i7 int, i8 int); +CREATE +INSERT INTO test_mat_large SELECT i,i,i,i,i,i,i,i from (select generate_series(1, nsegments * 50000) as i from (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; +INSERT 150000 + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=1); +CREATE +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +CREATE +SET ROLE TO role1_memory_test; +SET + +set gp_resgroup_print_operator_memory_limits=on; +SET +set enable_hashjoin = false; +SET +set enable_nestloop = true; +SET +-- ORCA doesn't honor enable_nestloop/enable_hashjoin, so this won't produce +-- the kind of plan we're looking for. +set optimizer=off; +SET + +-- This is the actual test query. +select * FROM test_mat_small as t1 left outer join test_mat_large AS t2 on t1.i1=t2.i2; + i1 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 +-----+-----+-----+-----+-----+-----+-----+-----+----- + 101 | 101 | 101 | 101 | 101 | 101 | 101 | 101 | 101 + 102 | 102 | 102 | 102 | 102 | 102 | 102 | 102 | 102 + 103 | 103 | 103 | 103 | 103 | 103 | 103 | 103 | 103 + 104 | 104 | 104 | 104 | 104 | 104 | 104 | 104 | 104 + 105 | 105 | 105 | 105 | 105 | 105 | 105 | 105 | 105 +(5 rows) + +-- Check that the Materialize node spilled to disk, to make sure we're testing spilling +-- as intended. The inner side of the join with the Materialize will not get executed on +-- segments that have no data for the outer side. Therefore, we expect the Materialize +-- node to only be executed, and spilled, on as many segments as there nodes that hold +-- data from test_mat_small. +select n - (select count (distinct gp_segment_id) from test_mat_small) as difference from num_workfiles_created($$ explain analyze select * FROM test_mat_small as t1 left outer join test_mat_large AS t2 on t1.i1=t2.i2 $$) as n; + difference +------------ + 0 +(1 row) + +-- Repeat, with a LIMIT. This causes the underlying scan to finish earlier. +select * FROM test_mat_small as t1 left outer join test_mat_large AS t2 on t1.i1=t2.i2 limit 10; + i1 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 +-----+-----+-----+-----+-----+-----+-----+-----+----- + 101 | 101 | 101 | 101 | 101 | 101 | 101 | 101 | 101 + 102 | 102 | 102 | 102 | 102 | 102 | 102 | 102 | 102 + 103 | 103 | 103 | 103 | 103 | 103 | 103 | 103 | 103 + 104 | 104 | 104 | 104 | 104 | 104 | 104 | 104 | 104 + 105 | 105 | 105 | 105 | 105 | 105 | 105 | 105 | 105 +(5 rows) +select n - (select count (distinct gp_segment_id) from test_mat_small) as difference from num_workfiles_created($$ explain analyze select * FROM test_mat_small as t1 left outer join test_mat_large AS t2 on t1.i1=t2.i2 limit 10 $$) as n; + difference +------------ + 0 +(1 row) + +drop schema materialize_spill cascade; +DROP + +-- start_ignore +RESET ROLE; +RESET +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sisc_mat_sort.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sisc_mat_sort.out new file mode 100644 index 00000000000..b40d944f5ce --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sisc_mat_sort.out @@ -0,0 +1,102 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema sisc_mat_sort; +CREATE +set search_path to sisc_mat_sort; +SET + +-- start_ignore +create language plpython3u; +ERROR: language "plpython3u" already exists +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function sisc_mat_sort.is_workfile_created(explain_query text) returns setof int as $$ import re query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" rv = plpy.execute(query) nsegments = int(rv[0]['nsegments']) rv = plpy.execute(explain_query) search_text = 'Work_mem used' result = [] for i in range(len(rv)): cur_line = rv[i]['QUERY PLAN'] if search_text.lower() in cur_line.lower(): p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') m = p.match(cur_line) workfile_created = int(m.group(2)) cur_row = int(workfile_created == nsegments) result.append(cur_row) return result $$ language plpython3u; +CREATE + +create table testsiscm (i1 int, i2 int, i3 int, i4 int); +CREATE +insert into testsiscm select i, i % 1000, i % 100000, i % 75 from (select generate_series(1, nsegments * 150000) as i from (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; +INSERT 300000 + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=3); +CREATE +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +CREATE +SET ROLE TO role1_memory_test; +SET + + +set gp_resgroup_print_operator_memory_limits=on; +SET +set gp_cte_sharing=on; +SET +set gp_enable_mk_sort=on; +SET +-- The expected output is very sensitive to the kind of plan this produces. +-- We're testing the executor, not the planner, so force ORCA off, to get +-- the particular plan +set optimizer=off; +SET + +select count(*) from (with ctesisc as (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) select * from ctesisc as t1, ctesisc as t2 where t1.c1 = t2.c1 and t1.c3 = t2.c3) foo; + count +-------- + 100000 +(1 row) +select * from sisc_mat_sort.is_workfile_created('explain analyze with ctesisc as (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) select * from ctesisc as t1, ctesisc as t2 where t1.c1 = t2.c1 and t1.c3 = t2.c3;'); + is_workfile_created +--------------------- + 1 + 0 + 1 +(3 rows) +select * from sisc_mat_sort.is_workfile_created('explain analyze with ctesisc as (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) select * from ctesisc as t1, ctesisc as t2 where t1.c1 = t2.c1 and t1.c3 = t2.c3 limit 50000;'); + is_workfile_created +--------------------- + 1 + 0 + 1 +(3 rows) + +set gp_enable_mk_sort=off; +SET +select count(*) from (with ctesisc as (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) select * from ctesisc as t1, ctesisc as t2 where t1.c1 = t2.c1 and t1.c3 = t2.c3) foo; + count +-------- + 100000 +(1 row) +select * from sisc_mat_sort.is_workfile_created('explain analyze with ctesisc as (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) select * from ctesisc as t1, ctesisc as t2 where t1.c1 = t2.c1 and t1.c3 = t2.c3;'); + is_workfile_created +--------------------- + 1 + 0 + 1 +(3 rows) +select * from sisc_mat_sort.is_workfile_created('explain analyze with ctesisc as (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) select * from ctesisc as t1, ctesisc as t2 where t1.c1 = t2.c1 and t1.c3 = t2.c3 limit 50000;'); + is_workfile_created +--------------------- + 1 + 0 + 1 +(3 rows) + +drop schema sisc_mat_sort cascade; +DROP + +-- start_ignore +RESET ROLE; +RESET +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sisc_sort_spill.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sisc_sort_spill.out new file mode 100644 index 00000000000..09e2bf31ee4 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sisc_sort_spill.out @@ -0,0 +1,100 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema sisc_sort_spill; +CREATE +set search_path to sisc_sort_spill; +SET + +-- start_ignore +create language plpython3u; +ERROR: language "plpython3u" already exists +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function sisc_sort_spill.is_workfile_created(explain_query text) returns setof int as $$ import re query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" rv = plpy.execute(query) nsegments = int(rv[0]['nsegments']) rv = plpy.execute(explain_query) search_text = 'Work_mem used' result = [] for i in range(len(rv)): cur_line = rv[i]['QUERY PLAN'] if search_text.lower() in cur_line.lower(): p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') m = p.match(cur_line) workfile_created = int(m.group(2)) cur_row = int(workfile_created == nsegments) result.append(cur_row) return result $$ language plpython3u; +CREATE + +create table testsisc (i1 int, i2 int, i3 int, i4 int); +CREATE +insert into testsisc select i, i % 1000, i % 100000, i % 75 from (select generate_series(1, nsegments * 50000) as i from (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; +INSERT 100000 + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=2); +CREATE +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +CREATE +SET ROLE TO role1_memory_test; +SET + +set gp_resgroup_print_operator_memory_limits=on; +SET +set gp_cte_sharing=on; +SET +-- ORCA optimizes away the ORDER BY in our test query, and therefore doesn't exercise +-- a Sort that spills. +set optimizer=off; +SET + +set gp_enable_mk_sort=on; +SET +select avg(i3) from ( with ctesisc as (select * from testsisc order by i2) select t1.i3, t2.i2 from ctesisc as t1, ctesisc as t2 where t1.i1 = t2.i2 ) foo; + avg +----- + 500 +(1 row) + +select * from sisc_sort_spill.is_workfile_created('explain analyze with ctesisc as (select * from testsisc order by i2) select t1.i3, t2.i2 from ctesisc as t1, ctesisc as t2 where t1.i1 = t2.i2 ;'); + is_workfile_created +--------------------- + 1 + 1 +(2 rows) +select * from sisc_sort_spill.is_workfile_created('explain analyze with ctesisc as (select * from testsisc order by i2) select t1.i3, t2.i2 from ctesisc as t1, ctesisc as t2 where t1.i1 = t2.i2 limit 50000;'); + is_workfile_created +--------------------- + 1 + 1 +(2 rows) + + +set gp_enable_mk_sort=off; +SET +select avg(i3) from ( with ctesisc as (select * from testsisc order by i2) select t1.i3, t2.i2 from ctesisc as t1, ctesisc as t2 where t1.i1 = t2.i2 ) foo; + avg +----- + 500 +(1 row) + +select * from sisc_sort_spill.is_workfile_created('explain analyze with ctesisc as (select * from testsisc order by i2) select t1.i3, t2.i2 from ctesisc as t1, ctesisc as t2 where t1.i1 = t2.i2 ;'); + is_workfile_created +--------------------- + 1 + 1 +(2 rows) + +select * from sisc_sort_spill.is_workfile_created('explain analyze with ctesisc as (select * from testsisc order by i2) select t1.i3, t2.i2 from ctesisc as t1, ctesisc as t2 where t1.i1 = t2.i2 limit 50000;'); + is_workfile_created +--------------------- + 1 + 1 +(2 rows) + +drop schema sisc_sort_spill cascade; +DROP + +-- start_ignore +RESET ROLE; +RESET +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sort_spill.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sort_spill.out new file mode 100644 index 00000000000..75d90836bac --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_sort_spill.out @@ -0,0 +1,87 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema sort_spill; +CREATE +set search_path to sort_spill; +SET + +-- start_ignore +create language plpython3u; +ERROR: language "plpython3u" already exists +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function sort_spill.is_workfile_created(explain_query text) returns setof int as $$ import re query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" rv = plpy.execute(query) nsegments = int(rv[0]['nsegments']) rv = plpy.execute(explain_query) search_text = 'Work_mem used' result = [] for i in range(len(rv)): cur_line = rv[i]['QUERY PLAN'] if search_text.lower() in cur_line.lower(): p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') m = p.match(cur_line) workfile_created = int(m.group(2)) cur_row = int(workfile_created == nsegments) result.append(cur_row) return result $$ language plpython3u; +CREATE + + +create table testsort (i1 int, i2 int, i3 int, i4 int); +CREATE +insert into testsort select i, i % 1000, i % 100000, i % 75 from (select generate_series(1, nsegments * 50000) as i from (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; +INSERT 100000 + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=1); +CREATE +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +CREATE +SET ROLE TO role1_memory_test; +SET + +set gp_resgroup_print_operator_memory_limits=on; +SET + +set gp_enable_mk_sort=on; +SET +select avg(i2) from (select i1,i2 from testsort order by i2) foo; + avg +------- + 499.5 +(1 row) +select * from sort_spill.is_workfile_created('explain analyze select i1,i2 from testsort order by i2;'); + is_workfile_created +--------------------- + 1 +(1 row) +select * from sort_spill.is_workfile_created('explain analyze select i1,i2 from testsort order by i2 limit 50000;'); + is_workfile_created +--------------------- + 1 +(1 row) + +set gp_enable_mk_sort=off; +SET +select avg(i2) from (select i1,i2 from testsort order by i2) foo; + avg +------- + 499.5 +(1 row) +select * from sort_spill.is_workfile_created('explain analyze select i1,i2 from testsort order by i2;'); + is_workfile_created +--------------------- + 1 +(1 row) +select * from sort_spill.is_workfile_created('explain analyze select i1,i2 from testsort order by i2 limit 50000;'); + is_workfile_created +--------------------- + 1 +(1 row) + +drop schema sort_spill cascade; +DROP + +-- start_ignore +RESET ROLE; +RESET +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_spilltodisk.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_spilltodisk.out new file mode 100644 index 00000000000..eeaa44474a2 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_memory_spilltodisk.out @@ -0,0 +1,163 @@ +-- up the admin_group memory limits +ALTER RESOURCE GROUP admin_group SET memory_limit 30; +ALTER + +-- Test Mark/Restore in Material Node +create table spilltest1 (a integer); +CREATE +create table spilltest2 (a integer); +CREATE +insert into spilltest1 select a from generate_series(1,400000) a; +INSERT 400000 +insert into spilltest2 select a from generate_series(1,400000) a; +INSERT 400000 + +-- go back to the default admin_group limit +ALTER RESOURCE GROUP admin_group SET memory_limit 10; +ALTER + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=10); +CREATE +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +CREATE +SET ROLE TO role1_memory_test; +SET + +set enable_hashagg=off; +SET +set enable_mergejoin=on; +SET +set enable_hashjoin=off; +SET +set enable_nestloop=off; +SET + +create temporary table spilltestresult1 as select t1.a as t1a, t2.a as t2a from (select a from spilltest1 group by a) t1, (select a from spilltest2 group by a) t2 where t1.a = t2.a; +CREATE 400000 + +-- check that the result looks sane +select count(*), sum(t1a), sum(t2a), sum(t1a - t2a) from spilltestresult1; + count | sum | sum | sum +--------+-------------+-------------+----- + 400000 | 80000200000 | 80000200000 | 0 +(1 row) + +-- Test Hash Aggregation when the work mem is too small for the hash table +create table spilltest (a integer, b integer); +CREATE +insert into spilltest select a, a%25 from generate_series(1,8000) a; +INSERT 8000 +analyze; +ANALYZE +set enable_hashagg=on; +SET +set enable_groupagg=off; +SET + +select b,count(*) from spilltest group by b order by b; + b | count +----+------- + 0 | 320 + 1 | 320 + 2 | 320 + 3 | 320 + 4 | 320 + 5 | 320 + 6 | 320 + 7 | 320 + 8 | 320 + 9 | 320 + 10 | 320 + 11 | 320 + 12 | 320 + 13 | 320 + 14 | 320 + 15 | 320 + 16 | 320 + 17 | 320 + 18 | 320 + 19 | 320 + 20 | 320 + 21 | 320 + 22 | 320 + 23 | 320 + 24 | 320 +(25 rows) + +select b,count(*) from spilltest group by b order by b; + b | count +----+------- + 0 | 320 + 1 | 320 + 2 | 320 + 3 | 320 + 4 | 320 + 5 | 320 + 6 | 320 + 7 | 320 + 8 | 320 + 9 | 320 + 10 | 320 + 11 | 320 + 12 | 320 + 13 | 320 + 14 | 320 + 15 | 320 + 16 | 320 + 17 | 320 + 18 | 320 + 19 | 320 + 20 | 320 + 21 | 320 + 22 | 320 + 23 | 320 + 24 | 320 +(25 rows) +-- Test Hash Join when the work mem is too small for the hash table +drop table if exists spilltest; +DROP +create table spilltest (a integer, b integer); +CREATE +insert into spilltest select a, a%25 from generate_series(1,800000) a; +INSERT 800000 +analyze; -- We have to do an analyze to force a hash join set enable_mergejoin=off; +ANALYZE; +set enable_nestloop=off; +SET +set enable_hashjoin=on; +SET + +create temporary table spilltestresult2 as select t1.a as t1a, t1.b as t1b, t2.a as t2a, t2.b as t2b from spilltest t1, spilltest t2 where t1.a = t2.a; +CREATE 800000 +-- check that the result looks sane +select count(*), sum(t1a), sum(t2a), sum(t2a), sum(t2b), sum(t1a * t1b) from spilltestresult2; + count | sum | sum | sum | sum | sum +--------+--------------+--------------+--------------+---------+--------------- + 800000 | 320000400000 | 320000400000 | 320000400000 | 9600000 | 3840036800000 +(1 row) + +drop table spilltest1; +DROP +drop table spilltest2; +DROP +drop table spilltest; +DROP +drop table spilltestresult1; +DROP +drop table spilltestresult2; +DROP + +-- start_ignore +RESET ROLE; +RESET +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_name_convention.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_name_convention.out new file mode 100644 index 00000000000..97e03cf54c5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_name_convention.out @@ -0,0 +1,438 @@ +-- +-- Test the resource group name convention. +-- +-- Resource group names follow the general object name convention: +-- https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS +-- +-- Besides that there are 3 reserved names: +-- * default_group, admin_group: names of the 2 default resource groups; +-- * none: a special name usually used in ALTER ROLE command to reset +-- to the proper default resource group; +-- +-- This case is put under isolation2 dir as other resource group cases, +-- although it does not require any extended feature of the isolation2 +-- test framework. +-- + +-- +-- setup +-- + +CREATE OR REPLACE VIEW rg_name_view AS SELECT S.rsgname, 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' ORDER BY C.groupid; +CREATE + +-- TODO: need to cleanup all existing resgroups + +-- +-- positive +-- + +-- by default resgroup names have the form of [_a-zA-Z][_a-zA-Z0-9]* +CREATE RESOURCE GROUP rgNameTest01 WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP rgNameTest01 SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +--------------+------------- + rgnametest01 | 2 +(1 row) +DROP RESOURCE GROUP rgNameTest01; +DROP +CREATE RESOURCE GROUP __rg_name_test_01__ WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP __rg_name_test_01__ SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------------------+------------- + __rg_name_test_01__ | 2 +(1 row) +DROP RESOURCE GROUP __rg_name_test_01__; +DROP + +-- min length is 1 character +CREATE RESOURCE GROUP Z WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +DROP RESOURCE GROUP Z; +DROP + +-- max length is 63 characters +CREATE RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789 WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789 SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +-----------------------------------------------------------------+------------- + max012345678901234567890123456789012345678901234567890123456789 | 2 +(1 row) +DROP RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789; +DROP +-- characters exceed the max length are ignored +CREATE RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789further WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789are SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +-----------------------------------------------------------------+------------- + max012345678901234567890123456789012345678901234567890123456789 | 2 +(1 row) +DROP RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789ignored; +DROP + +-- 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_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "newlines s p a c e s t a b s" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +------------------------------+------------- + newlines +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 +-- punctuations +CREATE RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +-------------------------------+------------- + !#$%&`()*+,-./:;<=>?@[]^_{|}~ | 2 +(1 row) +DROP RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~"; +DROP +-- quotation marks +CREATE RESOURCE GROUP "'' are 2 single quotation marks" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "'' are 2 single quotation marks" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------------------------------+------------- + '' are 2 single quotation marks | 2 +(1 row) +DROP RESOURCE GROUP "'' are 2 single quotation marks"; +DROP +CREATE RESOURCE GROUP """ is 1 double quotation mark" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP """ is 1 double quotation mark" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +------------------------------+------------- + " is 1 double quotation mark | 2 +(1 row) +DROP RESOURCE GROUP """ is 1 double quotation mark"; +DROP + +-- nothing special with leading character +CREATE RESOURCE GROUP "0 as prefix" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "0 as prefix" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +-------------+------------- + 0 as prefix | 2 +(1 row) +DROP RESOURCE GROUP "0 as prefix"; +DROP +CREATE RESOURCE GROUP " leading space" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP " leading space" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +----------------+------------- + leading space | 2 +(1 row) +DROP RESOURCE GROUP " leading space"; +DROP + +-- backslash is not used as the escape character +CREATE RESOURCE GROUP "\\ are two backslashes" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "\\ are two backslashes" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +------------------------+------------- + \\ are two backslashes | 2 +(1 row) +DROP RESOURCE GROUP "\\ are two backslashes"; +DROP +-- below are octal, hex and unicode representations of "rg1" +CREATE RESOURCE GROUP "\o162\o147\o61" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +CREATE RESOURCE GROUP "\x72\x67\x31" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +CREATE RESOURCE GROUP "\u0072\u0067\u0031" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "\o162\o147\o61" SET concurrency 2; +ALTER +ALTER RESOURCE GROUP "\x72\x67\x31" SET concurrency 2; +ALTER +ALTER RESOURCE GROUP "\u0072\u0067\u0031" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +--------------------+------------- + \o162\o147\o61 | 2 + \x72\x67\x31 | 2 + \u0072\u0067\u0031 | 2 +(3 rows) +-- but as \o, \x and \u are not supported, +-- so they are just 3 different names, +-- none of them equals to "rg1". +DROP RESOURCE GROUP "rg1"; +ERROR: resource group "rg1" does not exist +DROP RESOURCE GROUP "\o162\o147\o61"; +DROP +DROP RESOURCE GROUP "\x72\x67\x31"; +DROP +DROP RESOURCE GROUP "\u0072\u0067\u0031"; +DROP + +-- unicode escapes are supported +CREATE RESOURCE GROUP U&"\0441\043B\043E\043D" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP U&"\0441\043B\043E\043D" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + слон | 2 +(1 row) +DROP RESOURCE GROUP U&"\0441\043B\043E\043D"; +DROP +-- unicode representation of "rg1" +CREATE RESOURCE GROUP U&"\0072\0067\0031" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "rg1" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + rg1 | 2 +(1 row) +DROP RESOURCE GROUP "rg1"; +DROP + +-- CJK characters are allowed with or without double quotation marks +CREATE RESOURCE GROUP 资源组 WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "资源组" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + 资源组 | 2 +(1 row) +DROP RESOURCE GROUP 资源组; +DROP +CREATE RESOURCE GROUP リソース・グループ WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "リソース・グループ" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +-----------+------------- + リソース・グループ | 2 +(1 row) +DROP RESOURCE GROUP リソース・グループ; +DROP +CREATE RESOURCE GROUP 자원그룹 WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "자원그룹" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + 자원그룹 | 2 +(1 row) +DROP RESOURCE GROUP 자원그룹; +DROP + +-- names are case sensitive, +-- but are always converted to lower case unless around with quotation marks +CREATE RESOURCE GROUP "RG_NAME_TEST" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +CREATE RESOURCE GROUP rg_Name_Test WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +CREATE RESOURCE GROUP "rg_name_test" WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "rg_name_test" already exists +ALTER RESOURCE GROUP Rg_NaMe_TeSt SET concurrency 2; +ALTER +ALTER RESOURCE GROUP "RG_NAME_TEST" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +--------------+------------- + RG_NAME_TEST | 2 + rg_name_test | 2 +(2 rows) +DROP RESOURCE GROUP "RG_NAME_TEST"; +DROP +DROP RESOURCE GROUP RG_nAME_tEST; +DROP + +-- 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_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "None" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + None | 2 +(1 row) +DROP RESOURCE GROUP "None"; +DROP +CREATE RESOURCE GROUP "NONE" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "NONE" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + NONE | 2 +(1 row) +DROP RESOURCE GROUP "NONE"; +DROP +CREATE RESOURCE GROUP "DEFAULT_GROup" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "DEFAULT_GROup" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------------+------------- + DEFAULT_GROup | 2 +(1 row) +DROP RESOURCE GROUP "DEFAULT_GROup"; +DROP +CREATE RESOURCE GROUP "ADMIN_GROUP" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "ADMIN_GROUP" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +-------------+------------- + ADMIN_GROUP | 2 +(1 row) +DROP RESOURCE GROUP "ADMIN_GROUP"; +DROP + +CREATE RESOURCE GROUP "with" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "with" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + with | 2 +(1 row) +DROP RESOURCE GROUP "with"; +DROP +CREATE RESOURCE GROUP "WITH" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "WITH" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + WITH | 2 +(1 row) +DROP RESOURCE GROUP "WITH"; +DROP +CREATE RESOURCE GROUP "group" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "group" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + group | 2 +(1 row) +DROP RESOURCE GROUP "group"; +DROP +CREATE RESOURCE GROUP "create" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP "create" SET concurrency 2; +ALTER +SELECT * FROM rg_name_view; + rsgname | concurrency +---------+------------- + create | 2 +(1 row) +DROP RESOURCE GROUP "create"; +DROP + +-- +-- negative +-- + +-- does not support single quotation marks around the name +CREATE RESOURCE GROUP 'must_fail' WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: syntax error at or near "'must_fail'" +LINE 1: CREATE RESOURCE GROUP 'must_fail' WITH (cpu_rate_limit=10, m... + ^ + +-- does not support leading numbers +CREATE RESOURCE GROUP 0_must_fail WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: syntax error at or near "0" +LINE 1: CREATE RESOURCE GROUP 0_must_fail WITH (cpu_rate_limit=10, m... + ^ + +-- reserved names are not allowed even with double quotation marks +CREATE RESOURCE GROUP "default_group" WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "default_group" already exists +CREATE RESOURCE GROUP "admin_group" WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "admin_group" already exists +CREATE RESOURCE GROUP "none" WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group name "none" is reserved +CREATE RESOURCE GROUP default_group WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "default_group" already exists +CREATE RESOURCE GROUP admin_group WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "admin_group" already exists +CREATE RESOURCE GROUP none WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group name "none" is reserved +CREATE RESOURCE GROUP DEFAULT_GROUP WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "default_group" already exists +CREATE RESOURCE GROUP Admin_Group WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "admin_group" already exists +CREATE RESOURCE GROUP NONE WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group name "none" is reserved + +-- keywords are not allowed without quotation marks +CREATE RESOURCE GROUP with WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: syntax error at or near "with" +LINE 1: CREATE RESOURCE GROUP with WITH (cpu_rate_limit=10, memory_l... + ^ +CREATE RESOURCE GROUP WITH WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: syntax error at or near "WITH" +LINE 1: CREATE RESOURCE GROUP WITH WITH (cpu_rate_limit=10, memory_l... + ^ +CREATE RESOURCE GROUP group WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: syntax error at or near "group" +LINE 1: CREATE RESOURCE GROUP group WITH (cpu_rate_limit=10, memory_... + ^ +CREATE RESOURCE GROUP CREATE WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: syntax error at or near "CREATE" +LINE 1: CREATE RESOURCE GROUP CREATE WITH (cpu_rate_limit=10, memory... + ^ + +-- min length is 1 character +CREATE RESOURCE GROUP "" WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: zero-length delimited identifier at or near """" +LINE 1: CREATE RESOURCE GROUP "" WITH (cpu_rate_limit=10, memory_lim... + ^ + diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_operator_memory.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_operator_memory.out new file mode 100644 index 00000000000..ae5aedfc26f --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_operator_memory.out @@ -0,0 +1,286 @@ +SET optimizer TO off; +SET + +-- +-- setup +-- + +--start_ignore +DROP VIEW IF EXISTS many_ops; +DROP ROLE r1_opmem_test; +DROP RESOURCE GROUP rg1_opmem_test; +DROP RESOURCE GROUP rg2_opmem_test; +CREATE LANGUAGE plpython3u; +--end_ignore + +-- a helper function to run query via SPI +CREATE OR REPLACE FUNCTION f1_opmem_test() RETURNS void AS $$ plpy.execute("""select * from gp_dist_random('gp_id')""") $$ LANGUAGE plpython3u; +CREATE + +-- this view contains many operators in the plan, which is used to trigger +-- the issue. gp_toolkit.gp_resgroup_config is a large JOIN view of many +-- relations, to prevent the source relations being optimized out from the plan +-- we have to keep the columns provided by them in the target list, instead of +-- composing a long SELECT c1,c2,... list we use SELECT * here, but we should +-- not output the groupid as it changes each time. +-- +-- hashagg may not work with a small operator memory, so we use UNION ALL +-- instead of UNION to prevent putting a hashagg on top of the append node, +-- and we use a always-false WHERE condition to prevent too much output. +CREATE OR REPLACE VIEW many_ops AS SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 ; +CREATE + +-- we must ensure spill to be small enough but still > 0. +-- - rg1's memory quota is 682 * 1% = 6; +-- - per-xact quota is 6/3=2; +-- - spill memory is 2 * 60% = 1; +CREATE RESOURCE GROUP rg1_opmem_test WITH (cpu_rate_limit=10, memory_limit=1, memory_shared_quota=0, concurrency=3, memory_spill_ratio=60); +CREATE + +CREATE ROLE r1_opmem_test RESOURCE GROUP rg1_opmem_test; +CREATE +GRANT ALL ON many_ops TO r1_opmem_test; +GRANT + +-- rg1 has very low per-xact memory quota, there will be no enough operator +-- memory reserved, however in resource group mode we assign at least 100KB to +-- each operator, no matter it is memory intensive or not. As long as there is +-- enough shared memory the query should be executed successfully. + +-- +-- positive: there is enough global shared memory +-- + +SET gp_resgroup_memory_policy TO none; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +SET gp_resgroup_memory_policy TO eager_free; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +SET gp_resgroup_memory_policy TO auto; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +-- +-- negative: there is not enough shared memory +-- + +-- rg1 has no group level shared memory, and most memory are granted to rg2, +-- there is only very little global shared memory due to integer rounding. +CREATE RESOURCE GROUP rg2_opmem_test WITH (cpu_rate_limit=10, memory_limit=59); +CREATE + +-- this query can execute but will raise OOM error. + +SET gp_resgroup_memory_policy TO none; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; +ERROR: Out of memory +DETAIL: Resource group memory limit reached +RESET role; +RESET + +SET gp_resgroup_memory_policy TO eager_free; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; +ERROR: Out of memory +DETAIL: Resource group memory limit reached +RESET role; +RESET + +SET gp_resgroup_memory_policy TO auto; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; +ERROR: Out of memory +DETAIL: Resource group memory limit reached +RESET role; +RESET + +-- +-- positive: there is enough group shared memory +-- + +ALTER RESOURCE GROUP rg2_opmem_test SET memory_limit 40; +ALTER +ALTER RESOURCE GROUP rg1_opmem_test SET memory_limit 20; +ALTER +ALTER RESOURCE GROUP rg1_opmem_test SET memory_shared_quota 100; +ALTER +ALTER RESOURCE GROUP rg1_opmem_test SET memory_spill_ratio 20; +ALTER + +SET gp_resgroup_memory_policy TO none; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +SET gp_resgroup_memory_policy TO eager_free; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +SET gp_resgroup_memory_policy TO auto; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +-- +-- positive: the spill memory is large enough, no adjustment is needed +-- + +DROP RESOURCE GROUP rg2_opmem_test; +DROP +ALTER RESOURCE GROUP rg1_opmem_test SET memory_limit 40; +ALTER +ALTER RESOURCE GROUP rg1_opmem_test SET memory_shared_quota 50; +ALTER +ALTER RESOURCE GROUP rg1_opmem_test SET memory_spill_ratio 30; +ALTER +ALTER RESOURCE GROUP rg1_opmem_test SET concurrency 1; +ALTER + +SET gp_resgroup_memory_policy TO none; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +SET gp_resgroup_memory_policy TO eager_free; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +SET gp_resgroup_memory_policy TO auto; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +RESET role; +RESET + +-- +-- positive: when spill memory is zero, work memory is used +-- + +ALTER RESOURCE GROUP rg1_opmem_test SET memory_spill_ratio 0; +ALTER + +SET gp_resgroup_memory_policy TO none; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +SELECT f1_opmem_test(); + f1_opmem_test +--------------- + +(1 row) +RESET role; +RESET + +SET gp_resgroup_memory_policy TO eager_free; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +SELECT f1_opmem_test(); + f1_opmem_test +--------------- + +(1 row) +RESET role; +RESET + +SET gp_resgroup_memory_policy TO auto; +SET +SET ROLE TO r1_opmem_test; +SET +SELECT * FROM many_ops; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+-----------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- +(0 rows) +SELECT f1_opmem_test(); + f1_opmem_test +--------------- + +(1 row) +RESET role; +RESET + +-- +-- cleanup +-- + +DROP VIEW many_ops; +DROP +DROP ROLE r1_opmem_test; +DROP +DROP RESOURCE GROUP rg1_opmem_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_parallel_queries.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_parallel_queries.out new file mode 100644 index 00000000000..53e7b03dacb --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_parallel_queries.out @@ -0,0 +1,598 @@ +-- start_matchsubs +-- m/ERROR: tuple concurrently updated \(heapam\.c\:\d+\)/ +-- s/\(heapam\.c:\d+\)// +-- end_matchsubs +CREATE EXTENSION dblink; +CREATE + +-- This function execute commands N times. +-- % in command will be replaced by number specified by range1 sequentially +-- # in command will be replaced by number specified by range2 randomly +-- range, eg: 1-10 +-- Notice: now it only support SELECT statement return single integer +CREATE or replace FUNCTION exec_commands_n /*in func*/ (dl_name text, command1 text, /*in func*/ command2 text, command3 text, /*in func*/ times integer, range1 text, range2 text, fail_on_error bool) /*in func*/ RETURNS integer AS $$ /*in func*/ DECLARE /*in func*/ cmd text; /*in func*/ res int; /*in func*/ s_r1 int; /*in func*/ e_r1 int; /*in func*/ s_r2 int; /*in func*/ e_r2 int; /*in func*/ BEGIN /*in func*/ s_r1 = 0; /*in func*/ e_r1 = 0; /*in func*/ s_r2 = 0; /*in func*/ e_r2 = 0; /*in func*/ IF length(range1) > 0 THEN /*in func*/ select t[1]::int, t[2]::int into s_r1, e_r1 from regexp_split_to_array(range1, '-') t; /*in func*/ END IF; /*in func*/ IF length(range2) > 0 THEN /*in func*/ select t[1]::int, t[2]::int into s_r2, e_r2 from regexp_split_to_array(range2, '-') t; /*in func*/ END IF; /*in func*/ FOR i IN 0..(times - 1) LOOP /*in func*/ IF length(command1) > 0 THEN /*in func*/ cmd = regexp_replace(command1, '%', (s_r1 + i % (e_r1 - s_r1 + 1))::text, 'g'); /*in func*/ cmd = regexp_replace(cmd, '#', (s_r2 + ((random()*100)::int) % (e_r2 - s_r2 + 1))::text, 'g'); /*in func*/ RAISE NOTICE '%', cmd; /*in func*/ IF lower(cmd) like 'select %' THEN /*in func*/ select * into res from dblink(dl_name, cmd, fail_on_error) t(c1 integer); /*in func*/ ELSE /*in func*/ perform dblink_exec(dl_name, cmd , fail_on_error); /*in func*/ END IF; /*in func*/ END IF; /*in func*/ IF length(command2) > 0 THEN /*in func*/ cmd = regexp_replace(command2, '%', (s_r1 + i % (e_r1 - s_r1 + 1))::text, 'g'); /*in func*/ cmd = regexp_replace(cmd, '#', (s_r2 + ((random()*100)::int) % (e_r2 - s_r2 + 1))::text, 'g'); /*in func*/ RAISE NOTICE '%', cmd; /*in func*/ IF lower(cmd) like 'select %' THEN /*in func*/ select * into res from dblink(dl_name, cmd, fail_on_error) t(c1 integer); /*in func*/ ELSE /*in func*/ perform dblink_exec(dl_name, cmd, fail_on_error); /*in func*/ END IF; /*in func*/ END IF; /*in func*/ IF length(command3) > 0 THEN /*in func*/ cmd = regexp_replace(command3, '%', (s_r1 + i % (e_r1 - s_r1 + 1))::text, 'g'); /*in func*/ cmd = regexp_replace(cmd, '#', (s_r2 + ((random()*100)::int) % (e_r2 - s_r2 + 1))::text, 'g'); /*in func*/ RAISE NOTICE '%', cmd; /*in func*/ IF lower(cmd) like 'select %' THEN /*in func*/ select * into res from dblink(dl_name, cmd, fail_on_error) t(c1 integer); /*in func*/ ELSE /*in func*/ perform dblink_exec(dl_name, cmd, fail_on_error); /*in func*/ END IF; /*in func*/ END IF; /*in func*/ END LOOP; /*in func*/ return times; /*in func*/ END;$$ /*in func*/ LANGUAGE 'plpgsql'; +CREATE + +-- +-- DDLs vs DDLs +-- +1:select dblink_connect('dblink_rg_test1', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +2:select dblink_connect('dblink_rg_test2', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +3:select dblink_connect('dblink_rg_test3', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +4:select dblink_connect('dblink_rg_test4', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +5:select dblink_connect('dblink_rg_test5', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +6:select dblink_connect('dblink_rg_test6', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) + +1>:select exec_commands_n('dblink_rg_test1','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set concurrency #', 60, '', '1-6', false); +2>:select exec_commands_n('dblink_rg_test2','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set concurrency#', 60, '', '1-6', false); +3>:select exec_commands_n('dblink_rg_test3','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set cpu_rate_limit #', 60, '', '1-6', false); +4>:select exec_commands_n('dblink_rg_test4','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set memory_limit #', 60, '', '1-6', false); +5>:select exec_commands_n('dblink_rg_test5','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set memory_shared_quota #', 60, '', '1-6', false); +6>:select exec_commands_n('dblink_rg_test6','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set memory_limit #', 60, '', '1-6', false); + +1<: <... completed> + exec_commands_n +----------------- + 60 +(1 row) +2<: <... completed> + exec_commands_n +----------------- + 60 +(1 row) +3<: <... completed> + exec_commands_n +----------------- + 60 +(1 row) +4<: <... completed> + exec_commands_n +----------------- + 60 +(1 row) +5<: <... completed> + exec_commands_n +----------------- + 60 +(1 row) +6<: <... completed> + exec_commands_n +----------------- + 60 +(1 row) + +1: select dblink_disconnect('dblink_rg_test1'); + dblink_disconnect +------------------- + OK +(1 row) +2: select dblink_disconnect('dblink_rg_test2'); + dblink_disconnect +------------------- + OK +(1 row) +3: select dblink_disconnect('dblink_rg_test3'); + dblink_disconnect +------------------- + OK +(1 row) +4: select dblink_disconnect('dblink_rg_test4'); + dblink_disconnect +------------------- + OK +(1 row) +5: select dblink_disconnect('dblink_rg_test5'); + dblink_disconnect +------------------- + OK +(1 row) +6: select dblink_disconnect('dblink_rg_test6'); + dblink_disconnect +------------------- + OK +(1 row) + + +1q: ... +2q: ... +3q: ... +4q: ... +5q: ... +6q: ... +-- +-- DDLs vs DMLs +-- +-- Prepare resource groups and roles and tables +create table rg_test_foo as select i as c1, i as c2 from generate_series(1,1000) i; +CREATE 1000 +create table rg_test_bar as select i as c1, i as c2 from generate_series(1,1000) i; +CREATE 1000 +grant all on rg_test_foo to public; +GRANT +grant all on rg_test_bar to public; +GRANT + +-- start_ignore +select dblink_connect('dblink_rg_test', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +select exec_commands_n('dblink_rg_test','DROP ROLE rg_test_r%', '', '', 7, '1-7', '', false); + exec_commands_n +----------------- + 7 +(1 row) +select exec_commands_n('dblink_rg_test','DROP RESOURCE GROUP rg_test_g%', '', '', 7, '1-7', '', false); + exec_commands_n +----------------- + 7 +(1 row) +-- end_ignore + +-- create 6 roles and 6 resource groups +select exec_commands_n('dblink_rg_test','CREATE RESOURCE GROUP rg_test_g% WITH (concurrency=9, cpu_rate_limit=1, memory_limit=7)', '', '', 6, '1-6', '', true); + exec_commands_n +----------------- + 6 +(1 row) +select exec_commands_n('dblink_rg_test','CREATE ROLE rg_test_r% login resource group rg_test_g%;', '', '', 6, '1-6', '', true); + exec_commands_n +----------------- + 6 +(1 row) +select exec_commands_n('dblink_rg_test','GRANT ALL ON rg_test_foo to rg_test_r%;', '', '', 6, '1-6', '', true); + exec_commands_n +----------------- + 6 +(1 row) +select exec_commands_n('dblink_rg_test','GRANT ALL ON rg_test_bar to rg_test_r%;', '', '', 6, '1-6', '', true); + exec_commands_n +----------------- + 6 +(1 row) + +select dblink_disconnect('dblink_rg_test'); + dblink_disconnect +------------------- + OK +(1 row) + +select groupname, concurrency, cpu_rate_limit from gp_toolkit.gp_resgroup_config where groupname like 'rg_test_g%' order by groupname; + groupname | concurrency | cpu_rate_limit +------------+-------------+---------------- + rg_test_g1 | 9 | 1 + rg_test_g2 | 9 | 1 + rg_test_g3 | 9 | 1 + rg_test_g4 | 9 | 1 + rg_test_g5 | 9 | 1 + rg_test_g6 | 9 | 1 +(6 rows) + +-- +-- 2* : DMLs +-- +-- start 6 session to concurrently change resource group and run simple queries randomly +-- BEGIN/END +21: select dblink_connect('dblink_rg_test21', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +21>: select exec_commands_n('dblink_rg_test21', 'set role rg_test_r#', 'BEGIN', 'END', 24000, '', '1-6', true); +-- BEGIN/ABORT +22: select dblink_connect('dblink_rg_test22', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +22>: select exec_commands_n('dblink_rg_test22', 'set role rg_test_r#', 'BEGIN', 'ABORT', 24000, '', '1-6', true); +-- query with memory sensitive node +23: select dblink_connect('dblink_rg_test23', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +23>: select exec_commands_n('dblink_rg_test23', 'set role rg_test_r#', 'insert into rg_test_foo values (#, #)', 'select count(*) from rg_test_bar t1, rg_test_foo t2 where t1.c2=t2.c2 group by t1.c2', 3000, '', '1-6', true); +-- high cpu +24: select dblink_connect('dblink_rg_test24', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +24>: select exec_commands_n('dblink_rg_test24', 'set role rg_test_r#', 'insert into rg_test_bar values (#, #)', 'select count(*) from rg_test_bar where c2! = 1000', 60, '', '1-6', true); +-- simple select +25: select dblink_connect('dblink_rg_test25', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +25>: select exec_commands_n('dblink_rg_test25', 'set role rg_test_r#', 'select count(*) from rg_test_foo', 'select count(*) from rg_test_bar', 6000, '', '1-6', true); +-- vacuum +26: select dblink_connect('dblink_rg_test26', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +26>: select exec_commands_n('dblink_rg_test26', 'set role rg_test_r#', 'vacuum rg_test_bar', 'vacuum rg_test_foo', 6000, '', '1-6', true); + +-- +-- 3* : Alter groups +-- +-- start a new session to alter concurrency randomly +31: select dblink_connect('dblink_rg_test31', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +31>: select exec_commands_n('dblink_rg_test31', 'alter resource group rg_test_g% set concurrency #', 'select 1 from pg_sleep(0.1)', '', 1000, '1-6', '0-5', true); + +-- start a new session to alter cpu_rate_limit randomly +32: select dblink_connect('dblink_rg_test32', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +32>: select exec_commands_n('dblink_rg_test32', 'alter resource group rg_test_g% set cpu_rate_limit #', 'select 1 from pg_sleep(0.1)', '', 1000, '1-6', '1-6', true); + +-- start a new session to alter memory_limit randomly +33: select dblink_connect('dblink_rg_test33', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +33>: select exec_commands_n('dblink_rg_test33', 'alter resource group rg_test_g% set memory_limit #', 'select 1 from pg_sleep(0.1)', '', 1000, '1-6', '1-7', true); + +-- start a new session to alter memory_shared_quota randomly +34: select dblink_connect('dblink_rg_test34', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +34>: select exec_commands_n('dblink_rg_test34', 'alter resource group rg_test_g% set memory_shared_quota #', 'select 1 from pg_sleep(0.1)', '', 1000, '1-6', '1-80', true); + +-- +-- 4* : CREATE/DROP tables & groups +-- +-- start a new session to create and drop table, it will cause massive catchup interrupt. +41: select dblink_connect('dblink_rg_test41', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +41>: select exec_commands_n('dblink_rg_test41', 'drop table if exists rg_test_t%', 'create table rg_test_t% (c1 int, c2 int)' ,'', 3000, '1-6', '', true); + +-- start a new session to create & drop resource group +42: select dblink_connect('dblink_rg_test42', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +42>: select exec_commands_n('dblink_rg_test42', 'create resource group rg_test_g7 with (cpu_rate_limit=1, memory_limit=1)', 'drop resource group rg_test_g7', '', 1000, '', '', true); + +31<: <... completed> + exec_commands_n +----------------- + 1000 +(1 row) +31: select exec_commands_n('dblink_rg_test31', 'alter resource group rg_test_g% set concurrency #', 'select 1 from pg_sleep(0.1)', '', 6, '1-6', '1-5', true); + exec_commands_n +----------------- + 6 +(1 row) + +-- start a new session to acquire the status of resource groups +44: select dblink_connect('dblink_rg_test44', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +44>: select exec_commands_n('dblink_rg_test44', 'select count(*) from gp_toolkit.gp_resgroup_status;', '', '', 100, '', '', true); + +-- wait all sessions to finish +21<: <... completed> + exec_commands_n +----------------- + 24000 +(1 row) +22<: <... completed> + exec_commands_n +----------------- + 24000 +(1 row) +23<: <... completed> + exec_commands_n +----------------- + 3000 +(1 row) +24<: <... completed> + exec_commands_n +----------------- + 60 +(1 row) +25<: <... completed> + exec_commands_n +----------------- + 6000 +(1 row) +26<: <... completed> + exec_commands_n +----------------- + 6000 +(1 row) +32<: <... completed> + exec_commands_n +----------------- + 1000 +(1 row) +33<: <... completed> + exec_commands_n +----------------- + 1000 +(1 row) +34<: <... completed> + exec_commands_n +----------------- + 1000 +(1 row) +41<: <... completed> + exec_commands_n +----------------- + 3000 +(1 row) +42<: <... completed> + exec_commands_n +----------------- + 1000 +(1 row) +44<: <... completed> + exec_commands_n +----------------- + 100 +(1 row) + +21: select dblink_disconnect('dblink_rg_test21'); + dblink_disconnect +------------------- + OK +(1 row) +22: select dblink_disconnect('dblink_rg_test22'); + dblink_disconnect +------------------- + OK +(1 row) +23: select dblink_disconnect('dblink_rg_test23'); + dblink_disconnect +------------------- + OK +(1 row) +24: select dblink_disconnect('dblink_rg_test24'); + dblink_disconnect +------------------- + OK +(1 row) +25: select dblink_disconnect('dblink_rg_test25'); + dblink_disconnect +------------------- + OK +(1 row) +26: select dblink_disconnect('dblink_rg_test26'); + dblink_disconnect +------------------- + OK +(1 row) +31: select dblink_disconnect('dblink_rg_test31'); + dblink_disconnect +------------------- + OK +(1 row) +32: select dblink_disconnect('dblink_rg_test32'); + dblink_disconnect +------------------- + OK +(1 row) +33: select dblink_disconnect('dblink_rg_test33'); + dblink_disconnect +------------------- + OK +(1 row) +34: select dblink_disconnect('dblink_rg_test34'); + dblink_disconnect +------------------- + OK +(1 row) +41: select dblink_disconnect('dblink_rg_test41'); + dblink_disconnect +------------------- + OK +(1 row) +42: select dblink_disconnect('dblink_rg_test42'); + dblink_disconnect +------------------- + OK +(1 row) +44: select dblink_disconnect('dblink_rg_test44'); + dblink_disconnect +------------------- + OK +(1 row) + +21q: ... +22q: ... +23q: ... +24q: ... +25q: ... +26q: ... +31q: ... +32q: ... +33q: ... +34q: ... +41q: ... +42q: ... + +select groupname, concurrency::int < 7, cpu_rate_limit::int < 7 from gp_toolkit.gp_resgroup_config where groupname like 'rg_test_g%' order by groupname; + groupname | ?column? | ?column? +------------+----------+---------- + rg_test_g1 | t | t + rg_test_g2 | t | t + rg_test_g3 | t | t + rg_test_g4 | t | t + rg_test_g5 | t | t + rg_test_g6 | t | t +(6 rows) + +-- Beacuse concurrency of each resource group is changed between 1..6, so the num_queued must be larger than 0 +select num_queued > 0 from gp_toolkit.gp_resgroup_status where rsgname like 'rg_test_g%' order by rsgname; + ?column? +---------- + t + t + t + t + t + t +(6 rows) + +-- After all queries finished in each resource group, the memory_usage should be zero, no memory leak +with t_1 as ( select rsgname, row_to_json(json_each(memory_usage::json)) as j from gp_toolkit.gp_resgroup_status where rsgname like 'rg_test_g%' order by rsgname ) select rsgname, sum(((j->'value')->>'used')::int) from t_1 group by rsgname ; + rsgname | sum +------------+----- + rg_test_g1 | 0 + rg_test_g2 | 0 + rg_test_g3 | 0 + rg_test_g4 | 0 + rg_test_g5 | 0 + rg_test_g6 | 0 +(6 rows) + +-- start_ignore +drop table rg_test_foo; +DROP +drop table rg_test_bar; +DROP +select dblink_connect('dblink_rg_test', 'dbname=isolation2resgrouptest'); + dblink_connect +---------------- + OK +(1 row) +select exec_commands_n('dblink_rg_test','DROP ROLE rg_test_r%', '', '', 6, '1-6', '', true); + exec_commands_n +----------------- + 6 +(1 row) +select exec_commands_n('dblink_rg_test','DROP RESOURCE GROUP rg_test_g%', '', '', 6, '1-6', '', true); + exec_commands_n +----------------- + 6 +(1 row) +select dblink_disconnect('dblink_rg_test'); + dblink_disconnect +------------------- + OK +(1 row) +-- end_ignore + +-- +-- 5*: Test connections in utility mode are not governed by resource group +-- +create resource group rg_test_g8 with (concurrency= 1, cpu_rate_limit=1, memory_limit=1); +CREATE +create role rg_test_r8 login resource group rg_test_g8; +CREATE +51:select dblink_connect('dblink_rg_test51', 'dbname=isolation2resgrouptest user=rg_test_r8 options=''-c gp_role=utility'''); + dblink_connect +---------------- + OK +(1 row) +52:select dblink_connect('dblink_rg_test52', 'dbname=isolation2resgrouptest user=rg_test_r8 options=''-c gp_role=utility'''); + dblink_connect +---------------- + OK +(1 row) +53:select dblink_connect('dblink_rg_test53', 'dbname=isolation2resgrouptest user=rg_test_r8 options=''-c gp_role=utility'''); + dblink_connect +---------------- + OK +(1 row) + +51>:select exec_commands_n('dblink_rg_test51', 'select 1', 'begin', 'end', 100, '', '', true); +51<: <... completed> + exec_commands_n +----------------- + 100 +(1 row) +52>:select exec_commands_n('dblink_rg_test52', 'select 1', 'select 1', 'select 1', 100, '', '', true); +52<: <... completed> + exec_commands_n +----------------- + 100 +(1 row) +53>:select exec_commands_n('dblink_rg_test53', 'select 1', 'begin', 'abort', 100, '', '', true); +53<: <... completed> + exec_commands_n +----------------- + 100 +(1 row) + +51: select dblink_disconnect('dblink_rg_test51'); + dblink_disconnect +------------------- + OK +(1 row) +52: select dblink_disconnect('dblink_rg_test52'); + dblink_disconnect +------------------- + OK +(1 row) +53: select dblink_disconnect('dblink_rg_test53'); + dblink_disconnect +------------------- + OK +(1 row) + +51q: ... +52q: ... +53q: ... + +-- num_executed and num_queued must be zero +select num_queued, num_executed from gp_toolkit.gp_resgroup_status where rsgname = 'rg_test_g8'; + num_queued | num_executed +------------+-------------- + 0 | 0 +(1 row) +drop role rg_test_r8; +DROP +drop resource group rg_test_g8; +DROP + +-- clean up +select * from gp_toolkit.gp_resgroup_config; + groupid | groupname | concurrency | proposed_concurrency | cpu_rate_limit | memory_limit | proposed_memory_limit | memory_shared_quota | proposed_memory_shared_quota | memory_spill_ratio | proposed_memory_spill_ratio +---------+---------------+-------------+----------------------+----------------+--------------+-----------------------+---------------------+------------------------------+--------------------+----------------------------- + 6437 | default_group | 20 | 20 | 30 | 30 | 30 | 50 | 50 | 20 | 20 + 6438 | admin_group | 40 | 40 | 10 | 10 | 10 | 50 | 50 | 20 | 20 +(2 rows) diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_recreate.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_recreate.out new file mode 100644 index 00000000000..0c6560835cb --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_recreate.out @@ -0,0 +1,37 @@ +-- start_ignore +DROP ROLE IF EXISTS r1; +DROP +DROP RESOURCE GROUP rg1; +ERROR: resource group "rg1" does not exist +-- end_ignore + +CREATE RESOURCE GROUP rg1 WITH (concurrency=2, cpu_rate_limit=10, memory_limit=50, memory_shared_quota=0); +CREATE +CREATE ROLE r1 RESOURCE GROUP rg1; +CREATE + +1: SET ROLE r1; +SET +1: BEGIN; +BEGIN +1: END; +END + +ALTER ROLE r1 RESOURCE GROUP none; +ALTER +DROP RESOURCE GROUP rg1; +DROP +CREATE RESOURCE GROUP rg1 WITH (concurrency=2, cpu_rate_limit=10, memory_limit=50, memory_shared_quota=0); +CREATE +ALTER ROLE r1 RESOURCE GROUP rg1; +ALTER + +1: BEGIN; +BEGIN +1: END; +END + +DROP ROLE r1; +DROP +DROP RESOURCE GROUP rg1; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_seg_down_2pc.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_seg_down_2pc.out new file mode 100644 index 00000000000..04d7824f205 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_seg_down_2pc.out @@ -0,0 +1,120 @@ +-- This test performs segment reconfiguration when "alter resource group" is executed in the two phase commit. +-- The steps are, when run "alter resource group", before QD broadcasts commit prepared command to QEs(the +-- second phase of 2PC), we trigger an error and cause one primary segment down. +-- 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. + +-- 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 set gp_fts_probe_retries to 0; +ALTER +select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +1:create resource group rgroup_seg_down with (CPU_RATE_LIMIT=35, MEMORY_LIMIT=35, CONCURRENCY=10); +CREATE + +-- 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; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- this session will pend here since the above injected fault +1&:alter resource group rgroup_seg_down set CONCURRENCY 20; +-- this injected fault can make dispatcher think the primary is down +2:select gp_inject_fault('fts_conn_startup_packet', 'error', dbid) from gp_segment_configuration where role='p' and content=0; + gp_inject_fault +----------------- + Success: +(1 row) +2:select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +-- make sure one primary segment is down. +2:select status = 'd' from gp_segment_configuration where content = 0 and role = 'm'; + ?column? +---------- + t +(1 row) +-- reset the injected fault on QD and the "alter resource group" in session1 can continue +2:select gp_inject_fault('dtm_broadcast_commit_prepared', 'reset', dbid) from gp_segment_configuration where role='p' and content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +-- reset the injected fault on primary segment +2:select gp_inject_fault('fts_conn_startup_packet', 'reset', dbid) from gp_segment_configuration where content=0; + gp_inject_fault +----------------- + Success: + Success: +(2 rows) +1<: <... completed> +ALTER +-- make sure "alter resource group" has taken effect. +1:select concurrency from gp_toolkit.gp_resgroup_config where groupname = 'rgroup_seg_down'; + concurrency +------------- + 20 +(1 row) +2q: ... + +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +1:select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +!\retcode gprecoverseg -ar; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +1:select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- verify no segment is down after recovery +1:select count(*) from gp_segment_configuration where status = 'd'; + count +------- + 0 +(1 row) + +-- verify resource group +1:select concurrency from gp_toolkit.gp_resgroup_config where groupname = 'rgroup_seg_down'; + concurrency +------------- + 20 +(1 row) +1:drop resource group rgroup_seg_down; +DROP + +1:alter system reset gp_fts_probe_interval; +ALTER +1:alter system reset gp_fts_probe_retries; +ALTER +1:select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) +1q: ... + diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_set_memory_spill_ratio.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_set_memory_spill_ratio.out new file mode 100644 index 00000000000..f3adbc83c4a --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_set_memory_spill_ratio.out @@ -0,0 +1,197 @@ +-- This query must be the first one in this case. +-- SHOW command will be bypassed in resgroup, when it's the first command +-- in a connection it needs special handling to show memory_spill_ratio +-- correctly. Verify that it shows the correct value 10 instead of default 20. +SHOW memory_spill_ratio; + memory_spill_ratio +-------------------- + 10 +(1 row) + +--start_ignore +DROP ROLE role1_spill_test; +ERROR: role "role1_spill_test" does not exist +DROP ROLE role2_spill_test; +ERROR: role "role2_spill_test" does not exist +DROP RESOURCE GROUP rg1_spill_test; +ERROR: resource group "rg1_spill_test" does not exist +DROP RESOURCE GROUP rg2_spill_test; +ERROR: resource group "rg2_spill_test" does not exist +--end_ignore + +CREATE RESOURCE GROUP rg1_spill_test WITH (CONCURRENCY=10, MEMORY_LIMIT=10, CPU_RATE_LIMIT=10, memory_shared_quota=20, memory_spill_ratio=30); +CREATE +CREATE RESOURCE GROUP rg2_spill_test WITH (CONCURRENCY=10, MEMORY_LIMIT=10, CPU_RATE_LIMIT=10, memory_shared_quota=50, memory_spill_ratio=10); +CREATE +CREATE ROLE role1_spill_test RESOURCE GROUP rg1_spill_test; +CREATE +CREATE ROLE role2_spill_test RESOURCE GROUP rg2_spill_test; +CREATE + +-- positive set to resource group level +--start_ignore +SET ROLE role1_spill_test; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 30 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) +--end_ignore + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 70; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 70 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- positive fallback to statement_mem at session level +SET MEMORY_SPILL_RATIO TO 0; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 0 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- negative set to session level +SET MEMORY_SPILL_RATIO TO 101; +ERROR: 101 is outside the valid range for parameter "memory_spill_ratio" (0 .. 100) +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 0 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 90; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 90 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 20; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 20 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- reset to resource group level +RESET MEMORY_SPILL_RATIO; +RESET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 30 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 60; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 60 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- change role, positive for session level +SET ROLE role2_spill_test; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 60 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 20; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 20 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- reset to resource group level +RESET MEMORY_SPILL_RATIO; +RESET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 10 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- cleanup +RESET ROLE; +RESET +DROP ROLE role1_spill_test; +DROP +DROP ROLE role2_spill_test; +DROP +DROP RESOURCE GROUP rg1_spill_test; +DROP +DROP RESOURCE GROUP rg2_spill_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_syntax.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_syntax.out new file mode 100644 index 00000000000..4f293d7c8d3 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_syntax.out @@ -0,0 +1,614 @@ +-- ---------------------------------------------------------------------- +-- Test: assign/alter a role to a resource group +-- ---------------------------------------------------------------------- + +DROP ROLE IF EXISTS rg_test_role; +DROP + +-- positive +CREATE ROLE rg_test_role; +CREATE +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role'; + rolresgroup +------------- + 6437 +(1 row) +CREATE ROLE rg_test_role_super SUPERUSER; +CREATE +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; + rolresgroup +------------- + 6438 +(1 row) +ALTER ROLE rg_test_role_super NOSUPERUSER; +ALTER +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; + rolresgroup +------------- + 6437 +(1 row) +ALTER ROLE rg_test_role_super SUPERUSER; +ALTER +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; + rolresgroup +------------- + 6438 +(1 row) + +ALTER ROLE rg_test_role RESOURCE GROUP none; +ALTER +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role'; + rolresgroup +------------- + 6437 +(1 row) +ALTER ROLE rg_test_role_super RESOURCE GROUP none; +ALTER +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; + rolresgroup +------------- + 6438 +(1 row) + +ALTER ROLE rg_test_role RESOURCE GROUP default_group; +ALTER +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 +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; + rolresgroup +------------- + 6438 +(1 row) + + +-- negative +ALTER ROLE rg_test_role RESOURCE GROUP non_exist_group; +ERROR: resource group "non_exist_group" does not exist +ALTER ROLE rg_test_role RESOURCE GROUP admin_group; +ERROR: only superuser can be assigned to admin resgroup + +CREATE ROLE rg_test_role1 RESOURCE GROUP non_exist_group; +ERROR: resource group "non_exist_group" does not exist +-- nonsuper user should not be assigned to admin group +CREATE ROLE rg_test_role1 RESOURCE GROUP admin_group; +ERROR: only superuser can be assigned to admin resgroup + +-- cleanup +DROP ROLE rg_test_role; +DROP +DROP ROLE rg_test_role_super; +DROP + +-- ---------------------------------------------------------------------- +-- Test: create/drop a resource group +-- ---------------------------------------------------------------------- + +--start_ignore +DROP RESOURCE GROUP rg_test_group; +ERROR: resource group "rg_test_group" does not exist +--end_ignore + +SELECT * FROM gp_toolkit.gp_resgroup_config; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+---------------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- + 6437 | default_group | 20 | 30 | 30 | 80 | 10 | vmtracker | -1 + 6438 | admin_group | 2 | 10 | 10 | 80 | 10 | vmtracker | -1 +(2 rows) + +-- negative + +-- can't create the reserved resource groups +CREATE RESOURCE GROUP default_group WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "default_group" already exists +CREATE RESOURCE GROUP admin_group WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "admin_group" already exists +CREATE RESOURCE GROUP none WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group name "none" is reserved +-- multiple resource groups can't share the same name +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10); +ERROR: resource group "rg_test_group" already exists +DROP RESOURCE GROUP rg_test_group; +DROP +-- must specify cpu_rate_limit or cpuset +CREATE RESOURCE GROUP rg_test_group WITH (memory_limit=10); +ERROR: must specify cpu_rate_limit or cpuset +-- can't specify the resource limit type multiple times +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpu_rate_limit=5, memory_limit=5, concurrency=1); +ERROR: found duplicate resource group resource type: concurrency +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5, cpu_rate_limit=5); +ERROR: found duplicate resource group resource type: cpu_rate_limit +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5, memory_limit=5); +ERROR: found duplicate resource group resource type: memory_limit +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5, memory_shared_quota=70, memory_shared_quota=80); +ERROR: found duplicate resource group resource type: memory_shared_quota +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0', cpuset='0', memory_limit=5); +ERROR: found duplicate resource group resource type: cpuset +-- can't specify both cpu_rate_limit and cpuset +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, cpuset='0', memory_limit=5); +ERROR: can't specify both cpu_rate_limit and cpuset +-- can't specify invalid cpuset +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='', memory_limit=5); +ERROR: cpuset invalid +CREATE RESOURCE GROUP rg_test_group WITH (cpuset=',', memory_limit=5); +ERROR: cpuset invalid +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='-', memory_limit=5); +ERROR: cpuset invalid +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='a', memory_limit=5); +ERROR: cpuset invalid +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='12a', memory_limit=5); +ERROR: cpuset invalid +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0-,', memory_limit=5); +ERROR: cpuset invalid +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='-1', memory_limit=5); +ERROR: cpuset invalid +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='3-1', memory_limit=5); +ERROR: cpuset invalid +CREATE RESOURCE GROUP rg_test_group WITH (cpuset=' 0 ', memory_limit=5); +ERROR: cpuset invalid +---- suppose the core numbered 1024 is not exist +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='1024', memory_limit=5); +ERROR: cpu cores 1024 are unavailable on the system +CREATE RESOURCE GROUP rg_test_group WITH (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,', memory_limit=5); +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', memory_limit=5); +CREATE +ALTER RESOURCE GROUP rg_test_group set CPUSET ''; +ERROR: cpuset invalid +ALTER RESOURCE GROUP rg_test_group set CPUSET ','; +ERROR: cpuset invalid +ALTER RESOURCE GROUP rg_test_group set CPUSET '-'; +ERROR: cpuset invalid +ALTER RESOURCE GROUP rg_test_group set CPUSET 'a'; +ERROR: cpuset invalid +ALTER RESOURCE GROUP rg_test_group set CPUSET '12a'; +ERROR: cpuset invalid +ALTER RESOURCE GROUP rg_test_group set CPUSET '0-'; +ERROR: cpuset invalid +ALTER RESOURCE GROUP rg_test_group set CPUSET '-1'; +ERROR: cpuset invalid +ALTER RESOURCE GROUP rg_test_group set CPUSET '3-1'; +ERROR: cpuset invalid +ALTER RESOURCE GROUP rg_test_group set CPUSET ' 0 '; +ERROR: cpuset invalid +---- suppose the core numbered 1024 is not exist +ALTER RESOURCE GROUP rg_test_group set CPUSET '1024'; +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 +-- can't drop non-exist resource group +DROP RESOURCE GROUP non_exist_group; +ERROR: resource group "non_exist_group" does not exist +-- can't drop reserved resource groups +DROP RESOURCE GROUP default_group; +ERROR: cannot drop default resource group "default_group" +DROP RESOURCE GROUP admin_group; +ERROR: cannot drop default resource group "admin_group" +DROP RESOURCE GROUP none; +ERROR: resource group "none" does not exist + +-- positive +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +SELECT groupname,concurrency,cpu_rate_limit,memory_limit,memory_shared_quota,memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; + groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio +---------------+-------------+----------------+--------------+---------------------+-------------------- + rg_test_group | 20 | 10 | 10 | 80 | 0 +(1 row) +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpuset='0', memory_limit=10, memory_shared_quota=70, memory_spill_ratio=30); +CREATE +SELECT groupname,concurrency,cpu_rate_limit,memory_limit,memory_shared_quota,memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; + groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio +---------------+-------------+----------------+--------------+---------------------+-------------------- + rg_test_group | 1 | -1 | 10 | 70 | 30 +(1 row) +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10); +CREATE +SELECT groupname,concurrency,cpu_rate_limit,memory_limit,memory_shared_quota,memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; + groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio +---------------+-------------+----------------+--------------+---------------------+-------------------- + rg_test_group | 20 | 10 | 0 | 80 | 0 +(1 row) +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0'); +CREATE +SELECT groupname,concurrency,cpu_rate_limit,memory_limit,memory_shared_quota,memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; + groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio +---------------+-------------+----------------+--------------+---------------------+-------------------- + rg_test_group | 20 | -1 | 0 | 80 | 0 +(1 row) +DROP RESOURCE GROUP rg_test_group; +DROP + +-- ---------------------------------------------------------------------- +-- Test: boundary check in create resource group syntax +-- ---------------------------------------------------------------------- + +-- negative: cpu_rate_limit & memory_limit should be in [1, 100] +-- if cpu_rate_limit equals -1, it will not be involved in sum +CREATE RESOURCE GROUP rg_test_group1 WITH (memory_limit=10, cpuset='0'); +CREATE +CREATE RESOURCE GROUP rg_test_group2 WITH (cpu_rate_limit=60, memory_limit=10); +CREATE +CREATE RESOURCE GROUP rg_test_group3 WITH (cpu_rate_limit=1, memory_limit=10); +ERROR: total cpu_rate_limit exceeded the limit of 100 +DROP RESOURCE GROUP rg_test_group1; +DROP +DROP RESOURCE GROUP rg_test_group2; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=61, memory_limit=10); +ERROR: total cpu_rate_limit exceeded the limit of 100 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=91); +ERROR: total memory_limit exceeded the limit of 100 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=0, memory_limit=10); +ERROR: cpu_rate_limit range is [1, 100] +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=-1); +ERROR: memory_limit range is [0, 100] +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=0.9); +ERROR: invalid input syntax for type bigint: "0.9" +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=1.9); +ERROR: invalid input syntax for type bigint: "1.9" +-- negative: concurrency should be in [1, max_connections] +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=-1, cpu_rate_limit=10, memory_limit=10); +ERROR: concurrency range is [0, 'max_connections'] +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=26, cpu_rate_limit=10, memory_limit=10); +ERROR: concurrency range is [0, 'max_connections'] +-- negative: memory_auditor should be 'vmtracker' or 'cgroup' +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=0, cpu_rate_limit=10, memory_limit=10, memory_auditor="randomtext"); +ERROR: memory_auditor should be "vmtracker" or "cgroup" +-- negative: concurrency should be zero for cgroup audited resource group +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpu_rate_limit=10, memory_limit=10, memory_auditor="cgroup"); +ERROR: resource group concurrency must be 0 when group memory_auditor is cgroup +-- negative: the cores of cpuset in different groups mustn't overlap +CREATE RESOURCE GROUP rg_test_group1 WITH (cpuset='0', memory_limit=10); +CREATE +CREATE RESOURCE GROUP rg_test_group2 WITH (cpuset='0', memory_limit=10); +ERROR: cpu cores 0 are used by resource group rg_test_group1 +DROP RESOURCE GROUP rg_test_group1; +DROP + +-- memory_spill_ratio range is [0, 100] +-- no limit on the sum of memory_shared_quota and memory_spill_ratio +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=10, memory_spill_ratio=0); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=50, memory_spill_ratio=51); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=10, memory_spill_ratio=-1); +ERROR: memory_spill_ratio range is [0, 100] +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=-1, memory_spill_ratio=10); +ERROR: memory_shared_quota range is [0, 100] + +-- positive: cpu_rate_limit & memory_limit should be in [1, 100] +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=60, memory_limit=10); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=60); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=1, memory_limit=10); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=1); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +-- positive: concurrency should be in [0, max_connections] +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=0, cpu_rate_limit=10, memory_limit=10); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpu_rate_limit=10, memory_limit=10); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=25, cpu_rate_limit=10, memory_limit=10); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg1_test_group WITH (concurrency=1, cpu_rate_limit=10, memory_limit=10); +CREATE +CREATE RESOURCE GROUP rg2_test_group WITH (concurrency=1, cpu_rate_limit=50, memory_limit=50); +CREATE +DROP RESOURCE GROUP rg1_test_group; +DROP +DROP RESOURCE GROUP rg2_test_group; +DROP +CREATE RESOURCE GROUP rg1_test_group WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE +CREATE RESOURCE GROUP rg2_test_group WITH (concurrency=1, cpu_rate_limit=40, memory_limit=40); +CREATE +DROP RESOURCE GROUP rg1_test_group; +DROP +DROP RESOURCE GROUP rg2_test_group; +DROP +CREATE RESOURCE GROUP rg1_test_group WITH (concurrency=1, cpu_rate_limit=30, memory_limit=30); +CREATE +CREATE RESOURCE GROUP rg2_test_group WITH (concurrency=1, cpu_rate_limit=30, memory_limit=30); +CREATE +DROP RESOURCE GROUP rg1_test_group; +DROP +DROP RESOURCE GROUP rg2_test_group; +DROP +-- positive: concurrency should be zero for cgroup audited resource group +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=0, cpu_rate_limit=10, memory_limit=10, memory_auditor="cgroup"); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP + +-- memory_spill_ratio range is [0, 100] +-- no limit on the sum of memory_shared_quota and memory_spill_ratio +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=0, memory_spill_ratio=1); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=50, memory_spill_ratio=50); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=0, memory_spill_ratio=100); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=99, memory_spill_ratio=1); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP + +-- negative: memory_spill_ratio does not accept out of range percentage values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=-1); +ERROR: memory_spill_ratio range is [0, 100] +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=101); +ERROR: memory_spill_ratio range is [0, 100] + +-- negative: memory_spill_ratio does not accept string values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio='0'); +ERROR: memory_spill_ratio requires a numeric value +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio='10'); +ERROR: memory_spill_ratio requires a numeric value + +-- negative: memory_spill_ratio does not accept float values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=10.5); +ERROR: invalid input syntax for type bigint: "10.5" + +-- negative: when memory_limit is unlimited memory_spill_ratio must be set to 0 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=0, memory_spill_ratio=10); +ERROR: when memory_limit is unlimited memory_spill_ratio must be set to 0 + +-- positive +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=0, memory_spill_ratio=0); +CREATE +DROP RESOURCE GROUP rg_test_group; +DROP + +-- ---------------------------------------------------------------------- +-- Test: alter a resource group +-- ---------------------------------------------------------------------- +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +CREATE + +-- ALTER RESOURCE GROUP SET CONCURRENCY N +-- negative: concurrency should be in [1, max_connections] +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 0; +ERROR: admin_group must have at least one concurrency +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY -1; +ERROR: concurrency range is [0, 'max_connections'] +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 26; +ERROR: concurrency range is [0, 'max_connections'] +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY -0.5; +ERROR: syntax error at or near "0.5" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY -0.5; + ^ +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 0.5; +ERROR: syntax error at or near "0.5" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 0.5; + ^ +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY a; +ERROR: syntax error at or near "a" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY a; + ^ +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 'abc'; +ERROR: syntax error at or near "'abc'" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 'abc'; + ^ +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY '1'; +ERROR: syntax error at or near "'1'" +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 rg_test_group SET CONCURRENCY 1; +ALTER +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 25; +ALTER + +-- ALTER RESOURCE GROUP SET CPU_RATE_LIMIT VALUE +-- negative: cpu_rate_limit & memory_limit should be in [1, 100] +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT -0.1; +ERROR: syntax error at or near "0.1" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT -0.1; + ^ +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT -1; +ERROR: cpu_rate_limit range is [1, 100] +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 0; +ERROR: cpu_rate_limit range is [1, 100] +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 0.7; +ERROR: syntax error at or near "0.7" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 0.7; + ^ +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 1.7; +ERROR: syntax error at or near "1.7" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 1.7; + ^ +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 61; +ERROR: total cpu_rate_limit exceeded the limit of 100 +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT a; +ERROR: syntax error at or near "a" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT a; + ^ +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 'abc'; +ERROR: syntax error at or near "'abc'" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 'abc'; + ^ +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 20%; +ERROR: syntax error at or near "%" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 20%; + ^ +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 0.2%; +ERROR: syntax error at or near "0.2" +LINE 1: ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 0.2%; + ^ +-- positive: cpu_rate_limit & memory_limit should be in [1, 100] +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 1; +ALTER +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 2; +ALTER +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 60; +ALTER +DROP RESOURCE GROUP rg_test_group; +DROP +-- positive: total cpu_rate_limit & memory_limit should be in [1, 100] +CREATE RESOURCE GROUP rg1_test_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +CREATE RESOURCE GROUP rg2_test_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP rg1_test_group SET CPU_RATE_LIMIT 50; +ALTER +ALTER RESOURCE GROUP rg1_test_group SET CPU_RATE_LIMIT 40; +ALTER +ALTER RESOURCE GROUP rg2_test_group SET CPU_RATE_LIMIT 20; +ALTER +ALTER RESOURCE GROUP rg1_test_group SET CPU_RATE_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg2_test_group SET CPU_RATE_LIMIT 30; +ALTER +DROP RESOURCE GROUP rg1_test_group; +DROP +DROP RESOURCE GROUP rg2_test_group; +DROP +-- positive: cpuset and cpu_rate_limit are exclusive, +-- if cpu_rate_limit is set, cpuset is empty +-- if cpuset is set, cpuset is -1 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE +ALTER RESOURCE GROUP rg_test_group SET CPUSET '0'; +ALTER +SELECT groupname,cpu_rate_limit,memory_limit,cpuset FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; + groupname | cpu_rate_limit | memory_limit | cpuset +---------------+----------------+--------------+-------- + rg_test_group | -1 | 10 | 0 +(1 row) +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 10; +ALTER +SELECT groupname,cpu_rate_limit,memory_limit,cpuset FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; + groupname | cpu_rate_limit | memory_limit | cpuset +---------------+----------------+--------------+-------- + rg_test_group | 10 | 10 | -1 +(1 row) +DROP RESOURCE GROUP rg_test_group; +DROP + +CREATE RESOURCE GROUP cgroup_audited_group WITH (concurrency=0, cpu_rate_limit=10, memory_limit=10, memory_auditor="cgroup"); +CREATE +-- negative: memory_auditor cannot be altered +ALTER RESOURCE GROUP cgroup_audited_group SET MEMORY_AUDITOR "default"; +ERROR: syntax error at or near "MEMORY_AUDITOR" +LINE 1: ALTER RESOURCE GROUP cgroup_audited_group SET MEMORY_AUDITOR... + ^ +-- negative: concurrency should be zero for cgroup audited resource group +ALTER RESOURCE GROUP cgroup_audited_group SET CONCURRENCY 10; +ERROR: resource group concurrency must be 0 when group memory_auditor is cgroup +-- negative: role should not be assigned to a cgroup audited resource group +CREATE ROLE cgroup_audited_role RESOURCE GROUP cgroup_audited_group; +ERROR: you cannot assign a role to this resource group +DETAIL: The memory_auditor property for this group is not the default. +DROP RESOURCE GROUP cgroup_audited_group; +DROP + +-- positive: memory_spill_ratio accepts integer values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=20); +CREATE +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10; +ALTER +DROP RESOURCE GROUP rg_test_group; +DROP + +-- negative: memory_spill_ratio only accepts integer values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=20); +CREATE +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio '10'; +ERROR: syntax error at or near "'10'" +LINE 1: ...ER RESOURCE GROUP rg_test_group SET memory_spill_ratio '10'; + ^ +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10.5; +ERROR: syntax error at or near "10.5" +LINE 1: ...ER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10.5; + ^ +DROP RESOURCE GROUP rg_test_group; +DROP + +-- negative: memory_spill_ratio does not accept out of range values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=20); +CREATE +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio -1; +ERROR: memory_spill_ratio range is [0, 100] +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 101; +ERROR: memory_spill_ratio range is [0, 100] +DROP RESOURCE GROUP rg_test_group; +DROP + +-- positive: memory_limit can be altered to unlimited if memory_spill_ratio is 0 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=0); +CREATE +ALTER RESOURCE GROUP rg_test_group SET memory_limit 0; +ALTER +DROP RESOURCE GROUP rg_test_group; +DROP + +-- negative: memory_spill_ratio can only be set to 0 if memory_limit is unlimited +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=0, memory_spill_ratio=0); +CREATE +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10; +ERROR: when memory_limit is unlimited memory_spill_ratio must be set to 0 +DROP RESOURCE GROUP rg_test_group; +DROP + +-- positive: memory_spill_ratio accepts a percentage value only if +-- memory_limit is limited +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=0); +CREATE +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10; +ALTER +DROP RESOURCE GROUP rg_test_group; +DROP + +-- negative: memory_limit must be limited if memory_spill_ratio > 0 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=10); +CREATE +ALTER RESOURCE GROUP rg_test_group SET memory_limit 0; +ERROR: when memory_limit is unlimited memory_spill_ratio must be set to 0 +DROP RESOURCE GROUP rg_test_group; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_transaction.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_transaction.out new file mode 100644 index 00000000000..753ce211cbd --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_transaction.out @@ -0,0 +1,239 @@ +-- ---------------------------------------------------------------------- +-- Test: manage resource group in transaction +-- ---------------------------------------------------------------------- + +--start_ignore +DROP RESOURCE GROUP rg_test_group; +ERROR: resource group "rg_test_group" does not exist +--end_ignore + +-- helper view to check the resgroup status +CREATE OR REPLACE VIEW rg_test_monitor AS SELECT groupname, concurrency, cpu_rate_limit FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; +CREATE + +-- ---------------------------------------------------------------------- +-- Test: create/alter/drop a resource group in transaction block +-- ---------------------------------------------------------------------- + +-- CREATE RESOURCE GROUP cannot run inside a transaction block +BEGIN; +BEGIN +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +ERROR: CREATE RESOURCE GROUP cannot run inside a transaction block +END; +END +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +-----------+-------------+---------------- +(0 rows) + +-- ALTER RESOURCE GROUP cannot run inside a transaction block +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +CREATE +BEGIN; +BEGIN +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10; +ERROR: ALTER RESOURCE GROUP cannot run inside a transaction block +END; +END +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +---------------+-------------+---------------- + rg_test_group | 20 | 5 +(1 row) + +-- DROP RESOURCE GROUP cannot run inside a transaction block +BEGIN; +BEGIN +DROP RESOURCE GROUP rg_test_group; +ERROR: DROP RESOURCE GROUP cannot run inside a transaction block +END; +END +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +---------------+-------------+---------------- + rg_test_group | 20 | 5 +(1 row) + +DROP RESOURCE GROUP rg_test_group; +DROP + + +-- ---------------------------------------------------------------------- +-- Test: create/alter/drop a resource group and DML in transaction block +-- ---------------------------------------------------------------------- + +-- CREATE RESOURCE GROUP cannot run inside a transaction block +BEGIN; +BEGIN +SELECT 1; + ?column? +---------- + 1 +(1 row) +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +ERROR: CREATE RESOURCE GROUP cannot run inside a transaction block +END; +END +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +-----------+-------------+---------------- +(0 rows) + +-- ALTER RESOURCE GROUP cannot run inside a transaction block +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +CREATE +BEGIN; +BEGIN +SELECT 1; + ?column? +---------- + 1 +(1 row) +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10; +ERROR: ALTER RESOURCE GROUP cannot run inside a transaction block +END; +END +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +---------------+-------------+---------------- + rg_test_group | 20 | 5 +(1 row) + +-- DROP RESOURCE GROUP cannot run inside a transaction block +BEGIN; +BEGIN +SELECT 1; + ?column? +---------- + 1 +(1 row) +DROP RESOURCE GROUP rg_test_group; +ERROR: DROP RESOURCE GROUP cannot run inside a transaction block +END; +END +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +---------------+-------------+---------------- + rg_test_group | 20 | 5 +(1 row) + +DROP RESOURCE GROUP rg_test_group; +DROP + + +-- ---------------------------------------------------------------------- +-- Test: create/alter/drop a resource group in subtransaction +-- ---------------------------------------------------------------------- + +-- CREATE RESOURCE GROUP cannot run inside a subtransaction +BEGIN; +BEGIN +SAVEPOINT rg_savepoint; +SAVEPOINT +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +ERROR: CREATE RESOURCE GROUP cannot run inside a transaction block +ROLLBACK TO SAVEPOINT rg_savepoint; +ROLLBACK +ABORT; +ABORT +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +-----------+-------------+---------------- +(0 rows) + +-- ALTER RESOURCE GROUP cannot run inside a subtransaction +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +CREATE +BEGIN; +BEGIN +SAVEPOINT rg_savepoint; +SAVEPOINT +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10; +ERROR: ALTER RESOURCE GROUP cannot run inside a transaction block +ROLLBACK TO SAVEPOINT rg_savepoint; +ROLLBACK +ABORT; +ABORT +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +---------------+-------------+---------------- + rg_test_group | 20 | 5 +(1 row) + +-- DROP RESOURCE GROUP cannot run inside a subtransaction +BEGIN; +BEGIN +SAVEPOINT rg_savepoint; +SAVEPOINT +DROP RESOURCE GROUP rg_test_group; +ERROR: DROP RESOURCE GROUP cannot run inside a transaction block +ROLLBACK TO SAVEPOINT rg_savepoint; +ROLLBACK +ABORT; +ABORT +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +---------------+-------------+---------------- + rg_test_group | 20 | 5 +(1 row) + +DROP RESOURCE GROUP rg_test_group; +DROP + +-- ---------------------------------------------------------------------- +-- 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_rate_limit=5, memory_limit=5) $$ LANGUAGE SQL; +CREATE + +CREATE OR REPLACE FUNCTION rg_alter_func() RETURNS VOID AS $$ ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10 $$ LANGUAGE SQL; +CREATE + +CREATE OR REPLACE FUNCTION rg_drop_func() RETURNS VOID AS $$ DROP RESOURCE GROUP rg_test_group $$ LANGUAGE SQL; +CREATE + +-- CREATE RESOURCE GROUP cannot run inside a function call +SELECT * FROM rg_create_func(); +ERROR: CREATE RESOURCE GROUP cannot be executed from a function +CONTEXT: SQL function "rg_create_func" statement 1 +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +-----------+-------------+---------------- +(0 rows) + +-- ALTER RESOURCE GROUP cannot run inside a function call +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +CREATE +SELECT * FROM rg_alter_func(); +ERROR: ALTER RESOURCE GROUP cannot be executed from a function +CONTEXT: SQL function "rg_alter_func" statement 1 +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +---------------+-------------+---------------- + rg_test_group | 20 | 5 +(1 row) + +-- DROP RESOURCE GROUP cannot run inside a function call +SELECT * FROM rg_drop_func(); +ERROR: DROP RESOURCE GROUP cannot be executed from a function +CONTEXT: SQL function "rg_drop_func" statement 1 +SELECT * FROM rg_test_monitor; + groupname | concurrency | cpu_rate_limit +---------------+-------------+---------------- + rg_test_group | 20 | 5 +(1 row) + +DROP RESOURCE GROUP rg_test_group; +DROP +DROP FUNCTION rg_create_func(); +DROP +DROP FUNCTION rg_alter_func(); +DROP +DROP FUNCTION rg_drop_func(); +DROP + +-- cleanup +DROP VIEW rg_test_monitor; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_unassign_entrydb.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_unassign_entrydb.out new file mode 100644 index 00000000000..ce274ff2ad2 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_unassign_entrydb.out @@ -0,0 +1,100 @@ +-- Testing when we terminate a query involves entrydb, UnassignResGroup() would +-- be called on both QD and entrydb process. If that function finishes calling +-- on QD before entrydb calling, a bug could previously be triggered that leads +-- to data corruption. This test verifies this. + +-- start_ignore +DROP ROLE IF EXISTS role_test; +DROP +DROP RESOURCE GROUP rg_test; +ERROR: resource group "rg_test" does not exist +-- end_ignore + +CREATE RESOURCE GROUP rg_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=10); +CREATE +CREATE ROLE role_test RESOURCE GROUP rg_test; +CREATE + +-- By pass this session, else this affects the testing session, i.e. 1: +SET gp_resource_group_bypass = true; +SET + +1: SET ROLE role_test; +SET + +SELECT gp_inject_fault('unassign_resgroup_end_qd', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('unassign_resgroup_start_entrydb', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +SELECT gp_inject_fault('unassign_resgroup_end_qd', 'suspend', 1); + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('unassign_resgroup_start_entrydb', 'suspend', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- A query invovles entrydb. +1&: SELECT * from gp_dist_random('gp_id'), pg_sleep(15); + +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE query LIKE 'SELECT * from gp_dist_random%' ORDER BY xact_start LIMIT 1; + pg_terminate_backend +---------------------- + t +(1 row) + +-- Make sure entry db starts calling UnassignResGroup() after QD +-- finishes calling UnassignResGroup(). +SELECT gp_wait_until_triggered_fault('unassign_resgroup_end_qd', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('unassign_resgroup_start_entrydb', 'resume', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +SELECT gp_inject_fault('unassign_resgroup_end_qd', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('unassign_resgroup_start_entrydb', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +1<: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- Verify the system is ok with entrydb. +2: SET ROLE role_test; +SET +2: SELECT * from gp_dist_random('gp_id'), pg_sleep(0.1) LIMIT 1; + gpname | numsegments | dbid | content | pg_sleep +-----------+-------------+------+---------+---------- + Cloudberry | -1 | -1 | -1 | +(1 row) +2q: ... + +-- Clean up +DROP ROLE role_test; +DROP +DROP RESOURCE GROUP rg_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_unlimit_memory_spill_ratio.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_unlimit_memory_spill_ratio.out new file mode 100644 index 00000000000..67370ff8a6b --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_unlimit_memory_spill_ratio.out @@ -0,0 +1,155 @@ +-- start_ignore +DROP RESOURCE GROUP rg_spill_test; +ERROR: resource group "rg_spill_test" does not exist +-- end_ignore + +-- create +CREATE RESOURCE GROUP rg_spill_test WITH (concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=60); +CREATE +DROP RESOURCE GROUP rg_spill_test; +DROP + +CREATE RESOURCE GROUP rg_spill_test WITH (concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=0); +CREATE +DROP RESOURCE GROUP rg_spill_test; +DROP + +CREATE RESOURCE GROUP rg_spill_test WITH (concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=100); +CREATE +DROP RESOURCE GROUP rg_spill_test; +DROP + +CREATE RESOURCE GROUP rg_spill_test WITH (concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=-1); +ERROR: memory_spill_ratio range is [0, 100] +DROP RESOURCE GROUP rg_spill_test; +ERROR: resource group "rg_spill_test" does not exist + +CREATE RESOURCE GROUP rg_spill_test WITH (concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=101); +ERROR: memory_spill_ratio range is [0, 100] +DROP RESOURCE GROUP rg_spill_test; +ERROR: resource group "rg_spill_test" does not exist + +-- alter +CREATE RESOURCE GROUP rg_spill_test WITH (concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=20); +CREATE + +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 60; +ALTER +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 0; +ALTER +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 100; +ALTER +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO -1; +ERROR: memory_spill_ratio range is [0, 100] +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 101; +ERROR: memory_spill_ratio range is [0, 100] + +DROP RESOURCE GROUP rg_spill_test; +DROP + +-- set GUC +CREATE RESOURCE GROUP rg_spill_test WITH (concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=20); +CREATE + +SET MEMORY_SPILL_RATIO TO 60; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 60 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET MEMORY_SPILL_RATIO TO 0; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 0 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET MEMORY_SPILL_RATIO TO 100; +SET +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 100 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET MEMORY_SPILL_RATIO TO -1; +ERROR: -1 is outside the valid range for parameter "memory_spill_ratio" (0 .. 100) +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 100 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET MEMORY_SPILL_RATIO TO 101; +ERROR: 101 is outside the valid range for parameter "memory_spill_ratio" (0 .. 100) +SHOW MEMORY_SPILL_RATIO; + memory_spill_ratio +-------------------- + 100 +(1 row) +SELECT 1; + ?column? +---------- + 1 +(1 row) + +DROP RESOURCE GROUP rg_spill_test; +DROP + +-- test case for query_mem=0 +CREATE TABLE test_zero_workmem(c int); +CREATE + +--This test intends to build a situation that query_mem = 0 +--and verify under such condition work_mem will be used. +CREATE RESOURCE GROUP rg_zero_workmem WITH (concurrency=2, cpu_rate_limit=10, memory_limit=20, memory_shared_quota=20, memory_spill_ratio=0); +CREATE + +CREATE ROLE role_zero_workmem SUPERUSER RESOURCE GROUP rg_zero_workmem; +CREATE +SET ROLE TO role_zero_workmem; +SET + +--test query that will use spi +ANALYZE test_zero_workmem; +ANALYZE + +--test normal DML +SELECT count(*) FROM test_zero_workmem; + count +------- + 0 +(1 row) + +--clean env +RESET ROLE; +RESET +DROP TABLE test_zero_workmem; +DROP +DROP ROLE role_zero_workmem; +DROP +DROP RESOURCE GROUP rg_zero_workmem; +DROP diff --git a/src/test/singlenode_isolation2/expected/resgroup/resgroup_views.out b/src/test/singlenode_isolation2/expected/resgroup/resgroup_views.out new file mode 100644 index 00000000000..9f158654515 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/resgroup_views.out @@ -0,0 +1,59 @@ +select * from gp_toolkit.gp_resgroup_config where groupname='default_group'; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+---------------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- + 6437 | default_group | 20 | 30 | 30 | 80 | 10 | vmtracker | -1 +(1 row) + +select rsgname , groupid , num_running , num_queueing , num_queued , num_executed , cpu_usage->'-1' as qd_cpu_usage , memory_usage->'-1'->'used' as qd_memory_used , memory_usage->'-1'->'shared_used' as qd_memory_shared_used from gp_toolkit.gp_resgroup_status where rsgname='default_group'; + rsgname | groupid | num_running | num_queueing | num_queued | num_executed | qd_cpu_usage | qd_memory_used | qd_memory_shared_used +---------------+---------+-------------+--------------+------------+--------------+--------------+----------------+----------------------- + default_group | 6437 | 0 | 0 | 0 | 0 | 0 | 0 | 0 +(1 row) + +select rsgname , groupid , cpu , memory_used , memory_shared_used from gp_toolkit.gp_resgroup_status_per_host s join gp_segment_configuration c on s.hostname=c.hostname and c.content=-1 and role='p' where rsgname='default_group'; + rsgname | groupid | cpu | memory_used | memory_shared_used +---------------+---------+------+-------------+-------------------- + default_group | 6437 | 0.00 | 0 | 0 +(1 row) + +select rsgname , groupid , segment_id , cpu , memory_used , memory_shared_used from gp_toolkit.gp_resgroup_status_per_segment where rsgname='default_group' and segment_id=-1; + rsgname | groupid | segment_id | cpu | memory_used | memory_shared_used +---------------+---------+------------+------+-------------+-------------------- + default_group | 6437 | -1 | 0.00 | 0 | 0 +(1 row) + +-- also log the raw output of the views, if any of above tests failed it is +-- easier to find out the causes with these logs. + +-- start_ignore +select * from gp_toolkit.gp_resgroup_config; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+---------------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- + 6437 | default_group | 20 | 30 | 30 | 80 | 10 | vmtracker | -1 + 6438 | admin_group | 2 | 10 | 10 | 80 | 10 | vmtracker | -1 +(2 rows) +select * from gp_toolkit.gp_resgroup_status; + rsgname | groupid | num_running | num_queueing | num_queued | num_executed | total_queue_duration | cpu_usage | memory_usage +---------------+---------+-------------+--------------+------------+--------------+----------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + default_group | 6437 | 0 | 0 | 0 | 0 | @ 0 | {"-1":0.00, "0":0.00, "1":0.00, "2":0.00} | {"-1":{"used":0, "available":204, "quota_used":0, "quota_available":40, "quota_granted":40, "quota_proposed":40, "shared_used":0, "shared_available":164, "shared_granted":164, "shared_proposed":164}, "0":{"used":0, "available":204, "quota_used":0, "quota_available":40, "quota_granted":40, "quota_proposed":40, "shared_used":0, "shared_available":164, "shared_granted":164, "shared_proposed":164}, "1":{"used":0, "available":204, "quota_used":0, "quota_available":40, "quota_granted":40, "quota_proposed":40, "shared_used":0, "shared_available":164, "shared_granted":164, "shared_proposed":164}, "2":{"used":0, "available":204, "quota_used":0, "quota_available":40, "quota_granted":40, "quota_proposed":40, "shared_used":0, "shared_available":164, "shared_granted":164, "shared_proposed":164}} + admin_group | 6438 | 1 | 0 | 0 | 19 | @ 0 | {"-1":0.41, "0":0.18, "1":0.14, "2":0.10} | {"-1":{"used":0, "available":68, "quota_used":6, "quota_available":6, "quota_granted":12, "quota_proposed":12, "shared_used":0, "shared_available":56, "shared_granted":56, "shared_proposed":56}, "0":{"used":0, "available":68, "quota_used":6, "quota_available":6, "quota_granted":12, "quota_proposed":12, "shared_used":0, "shared_available":56, "shared_granted":56, "shared_proposed":56}, "1":{"used":0, "available":68, "quota_used":6, "quota_available":6, "quota_granted":12, "quota_proposed":12, "shared_used":0, "shared_available":56, "shared_granted":56, "shared_proposed":56}, "2":{"used":0, "available":68, "quota_used":6, "quota_available":6, "quota_granted":12, "quota_proposed":12, "shared_used":0, "shared_available":56, "shared_granted":56, "shared_proposed":56}} +(2 rows) +select * from gp_toolkit.gp_resgroup_status_per_host; + rsgname | groupid | hostname | cpu | memory_used | memory_available | memory_quota_used | memory_quota_available | memory_shared_used | memory_shared_available +---------------+---------+---------------+------+-------------+------------------+-------------------+------------------------+--------------------+------------------------- + admin_group | 6438 | nyu-vm-ubuntu | 0.83 | 1 | 271 | 24 | 24 | 0 | 224 + default_group | 6437 | nyu-vm-ubuntu | 0.00 | 0 | 816 | 0 | 160 | 0 | 656 +(2 rows) +select * from gp_toolkit.gp_resgroup_status_per_segment; + rsgname | groupid | hostname | segment_id | cpu | memory_used | memory_available | memory_quota_used | memory_quota_available | memory_shared_used | memory_shared_available +---------------+---------+---------------+------------+------+-------------+------------------+-------------------+------------------------+--------------------+------------------------- + admin_group | 6438 | nyu-vm-ubuntu | 0 | 0.13 | 0 | 68 | 6 | 6 | 0 | 56 + default_group | 6437 | nyu-vm-ubuntu | 1 | 0.00 | 0 | 204 | 0 | 40 | 0 | 164 + default_group | 6437 | nyu-vm-ubuntu | 0 | 0.00 | 0 | 204 | 0 | 40 | 0 | 164 + default_group | 6437 | nyu-vm-ubuntu | -1 | 0.00 | 0 | 204 | 0 | 40 | 0 | 164 + default_group | 6437 | nyu-vm-ubuntu | 2 | 0.00 | 0 | 204 | 0 | 40 | 0 | 164 + admin_group | 6438 | nyu-vm-ubuntu | 1 | 0.10 | 0 | 68 | 6 | 6 | 0 | 56 + admin_group | 6438 | nyu-vm-ubuntu | -1 | 0.26 | 1 | 67 | 6 | 6 | 0 | 56 + admin_group | 6438 | nyu-vm-ubuntu | 2 | 0.10 | 0 | 68 | 6 | 6 | 0 | 56 +(8 rows) +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/resgroup/restore_default_resgroup.out b/src/test/singlenode_isolation2/expected/resgroup/restore_default_resgroup.out new file mode 100644 index 00000000000..eec558a3c2e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resgroup/restore_default_resgroup.out @@ -0,0 +1,70 @@ +-- enable resource group and restart cluster. +-- start_ignore +! gpconfig -c gp_resource_group_cpu_limit -v 0.9; +20170830:00:35:08:440358 gpconfig:sdw6:gpadmin-[INFO]:-completed successfully with parameters '-c gp_resource_group_cpu_limit -v 0.9' + +! gpconfig -c gp_resource_group_memory_limit -v 0.9; +20170830:00:35:09:440440 gpconfig:sdw6:gpadmin-[INFO]:-completed successfully with parameters '-c gp_resource_group_memory_limit -v 0.9' + +! gpconfig -c gp_resource_manager -v group; +20170830:00:35:10:440522 gpconfig:sdw6:gpadmin-[INFO]:-completed successfully with parameters '-c gp_resource_manager -v group' + +! gpconfig -c max_connections -v 100 -m 40; +20170830:00:35:11:440726 gpconfig:sdw6:gpadmin-[INFO]:-completed successfully with parameters '-c max_connections -v 100 -m 40' + +! gpstop -rai; +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Starting gpstop with args: -rai +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Gathering information and validating the environment... +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Obtaining Cloudberry Master catalog information +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Obtaining Segment details from master... +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 5.0.0-beta.9+dev.45.g52ba809 build dev' +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-There are 0 connections to the database +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Commencing Master instance shutdown with mode='immediate' +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Master host=sdw6 +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Commencing Master instance shutdown with mode=immediate +20170830:00:35:12:440808 gpstop:sdw6:gpadmin-[INFO]:-Master segment instance directory=/data1/tpz/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20170830:00:35:13:440808 gpstop:sdw6:gpadmin-[INFO]:-Attempting forceful termination of any leftover master process +20170830:00:35:13:440808 gpstop:sdw6:gpadmin-[INFO]:-Terminating processes for segment /data1/tpz/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20170830:00:35:13:440808 gpstop:sdw6:gpadmin-[INFO]:-No standby master host configured +20170830:00:35:13:440808 gpstop:sdw6:gpadmin-[INFO]:-Commencing parallel primary segment instance shutdown, please wait... +20170830:00:35:13:440808 gpstop:sdw6:gpadmin-[INFO]:-0.00% of jobs completed +20170830:00:35:23:440808 gpstop:sdw6:gpadmin-[INFO]:-100.00% of jobs completed +20170830:00:35:23:440808 gpstop:sdw6:gpadmin-[INFO]:-Commencing parallel mirror segment instance shutdown, please wait... +20170830:00:35:23:440808 gpstop:sdw6:gpadmin-[INFO]:-0.00% of jobs completed +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:-100.00% of jobs completed +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:----------------------------------------------------- +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:- Segments stopped successfully = 6 +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:- Segments with errors during stop = 0 +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:----------------------------------------------------- +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:-Successfully shutdown 6 of 6 segment instances +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:-Database successfully shutdown with no errors reported +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:-Cleaning up leftover shared memory +20170830:00:35:33:440808 gpstop:sdw6:gpadmin-[INFO]:-Restarting System... + +-- end_ignore + +show gp_resource_manager; + gp_resource_manager +--------------------- + group +(1 row) +show gp_resource_group_cpu_limit; + gp_resource_group_cpu_limit +----------------------------- + 0.9 +(1 row) +show gp_resource_group_memory_limit; + gp_resource_group_memory_limit +-------------------------------- + 0.9 +(1 row) +show max_connections; + max_connections +----------------- + 40 +(1 row) + +-- by default admin_group has concurrency set to -1 which leads to +-- very small memory quota for each resgroup slot, correct it. +ALTER RESOURCE GROUP admin_group SET concurrency 40; +ALTER diff --git a/src/test/singlenode_isolation2/expected/resource_queue.out b/src/test/singlenode_isolation2/expected/resource_queue.out new file mode 100644 index 00000000000..51eaca4a7e6 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resource_queue.out @@ -0,0 +1,86 @@ +0:CREATE RESOURCE QUEUE rq_concurrency_test WITH (active_statements = 1); +CREATE +0:CREATE role role_concurrency_test RESOURCE QUEUE rq_concurrency_test; +CREATE + +1:SET role role_concurrency_test; +SET +1:BEGIN; +BEGIN +1:DECLARE c1 CURSOR FOR SELECT 1; +DECLARE + +2:SET role role_concurrency_test; +SET +2:PREPARE fooplan AS SELECT 1; +PREPARE +2&:EXECUTE fooplan; + +-- EXECUTE statement(cached plan) will be blocked when the concurrency limit of the resource queue is reached. +0:SELECT rsqcountvalue FROM gp_toolkit.gp_resqueue_status WHERE rsqname='rq_concurrency_test'; + rsqcountvalue +--------------- + 1 +(1 row) +0:SELECT wait_event_type, wait_event from pg_stat_activity where query = 'EXECUTE fooplan;'; + wait_event_type | wait_event +-----------------+--------------- + ResourceQueue | ResourceQueue +(1 row) + +-- This should also block. +-- +-- We used to have a bug during 9.6 merge where selecting from pg_locks caused +-- a crash, because we didn't set all the fields in the PROCLOCK struct +-- correctly. That only manifested when there were two queries blocked. +3:SET role role_concurrency_test; +SET +3:PREPARE fooplan AS SELECT 1; +PREPARE +3&:EXECUTE fooplan; + +-- Check pg_stat_activity and pg_locks again. +0:SELECT wait_event_type, wait_event from pg_stat_activity where query = 'EXECUTE fooplan;'; + wait_event_type | wait_event +-----------------+--------------- + ResourceQueue | ResourceQueue + ResourceQueue | ResourceQueue +(2 rows) +0:SELECT granted, locktype, mode FROM pg_locks where locktype = 'resource queue' and pid != pg_backend_pid(); + granted | locktype | mode +---------+----------------+--------------- + f | resource queue | ExclusiveLock + t | resource queue | ExclusiveLock + f | resource queue | ExclusiveLock +(3 rows) + +1:END; +END + +2<: <... completed> + ?column? +---------- + 1 +(1 row) +2:END; +END + +3<: <... completed> + ?column? +---------- + 1 +(1 row) +3:END; +END + +-- Sanity check: Ensure that the resource queue is now empty. +0: SELECT rsqcountlimit, rsqcountvalue from pg_resqueue_status WHERE rsqname = 'rq_concurrency_test'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 1 | 0 +(1 row) + +0:DROP role role_concurrency_test; +DROP +0:DROP RESOURCE QUEUE rq_concurrency_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resource_queue_cancel.out b/src/test/singlenode_isolation2/expected/resource_queue_cancel.out new file mode 100644 index 00000000000..40343b36cc2 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resource_queue_cancel.out @@ -0,0 +1,57 @@ +-- Simple test for cancellation of a query stuck on a resource queue when the +-- active statements limit is reached. + +0:CREATE RESOURCE QUEUE rq_cancel WITH (active_statements = 1); +CREATE +0:CREATE ROLE role_cancel RESOURCE QUEUE rq_cancel; +CREATE + +-- Consume an active statement in session 1. +1:SET ROLE role_cancel; +SET +1:BEGIN; +BEGIN +1:DECLARE c CURSOR FOR SELECT 0; +DECLARE + +-- Make session 2 wait on the resource queue lock. +2:SET ROLE role_cancel; +SET +2&:SELECT 100; + +-- Cancel SELECT from session 2. +0:SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query='SELECT 100;'; + pg_cancel_backend +------------------- + t +(1 row) + +-- 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 + +2<: <... completed> +ERROR: canceling statement due to user request +2:END; +END +2:BEGIN; +BEGIN +2:DECLARE c CURSOR FOR SELECT 0; +DECLARE + +2:END; +END + +-- Sanity check: Ensure that the resource queue is now empty. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_cancel'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 1 | 0 +(1 row) + +-- Cleanup +0:DROP ROLE role_cancel; +DROP +0:DROP RESOURCE QUEUE rq_cancel; +DROP diff --git a/src/test/singlenode_isolation2/expected/resource_queue_deadlock.out b/src/test/singlenode_isolation2/expected/resource_queue_deadlock.out new file mode 100644 index 00000000000..15d9a48c71a --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resource_queue_deadlock.out @@ -0,0 +1,68 @@ +-- This test is used to test if waiting on a resource queue lock will +-- trigger a local deadlock detection. + +0: CREATE RESOURCE QUEUE rq_deadlock_test WITH (active_statements = 1); +CREATE +0: CREATE role role_deadlock_test RESOURCE QUEUE rq_deadlock_test; +CREATE + +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 +-------------------------- + Success: +(1 row) +0&: SELECT gp_wait_until_triggered_fault('before_auto_stats', 1, dbid) FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; + +1: SET role role_deadlock_test; +SET +-- We need gp_autostats_mode to be ON_NO_STATS in this test. +1: SET gp_autostats_mode = ON_NO_STATS; +SET +1: SHOW gp_autostats_mode; + gp_autostats_mode +------------------- + on_no_stats +(1 row) +1: CREATE TABLE t_deadlock_test(c1 int); +CREATE +1&: INSERT INTO t_deadlock_test VALUES (1); +2: SET role role_deadlock_test; +SET +2: BEGIN; +BEGIN +2: analyze t_deadlock_test; +ANALYZE +0<: <... completed> + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +0: select gp_inject_fault_infinite('before_auto_stats', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2: SELECT * FROM t_deadlock_test; +ERROR: deadlock detected +DETAIL: Process 1618 waits for ExclusiveLock on resource queue 16520; blocked by process 1606. +Process 1606 waits for ShareUpdateExclusiveLock on relation 16522 of database 16478; blocked by process 1618. +HINT: See server log for query details. +2: ROLLBACK; +ROLLBACK +1<: <... completed> +INSERT 1 + +-- Sanity check: Ensure that the resource queue is now empty. +0: SELECT rsqcountlimit, rsqcountvalue from pg_resqueue_status WHERE rsqname = 'rq_deadlock_test'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 1 | 0 +(1 row) + +-- Clean up the test +0: DROP TABLE t_deadlock_test; +DROP +0: DROP ROLE role_deadlock_test; +DROP +0: DROP RESOURCE QUEUE rq_deadlock_test; +DROP diff --git a/src/test/singlenode_isolation2/expected/resource_queue_multi_portal.out b/src/test/singlenode_isolation2/expected/resource_queue_multi_portal.out new file mode 100644 index 00000000000..1684580ee03 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/resource_queue_multi_portal.out @@ -0,0 +1,180 @@ +-- Here we ensure that we clean up resource queue in-memory state gracefully +-- 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 +0:CREATE ROLE role_multi_portal RESOURCE QUEUE rq_multi_portal; +CREATE + +1:SET ROLE role_multi_portal; +SET +2:SET ROLE role_multi_portal; +SET + +-- +-- Scenario 1: +-- Multiple explicit cursors active in the same session with a deadlock. +-- + +1:BEGIN; +BEGIN +1:DECLARE c1 CURSOR FOR SELECT 1; +DECLARE + +2:BEGIN; +BEGIN +2:DECLARE c2 CURSOR FOR SELECT 1; +DECLARE + +-- There should be 2 active statements. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 2 +(1 row) + +-- This should block as it will exceed the active statements limit. +1&:DECLARE c3 CURSOR FOR SELECT 1; + +-- There should be 2 active statements. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 2 +(1 row) + +-- This should cause a deadlock. +2:DECLARE c4 CURSOR FOR SELECT 1; +DECLARE + +-- After the deadlock report, one session should have ERRORed out with the +-- deadlock report and aborted, while the other session should remain active +-- and idle in transaction. The active statement count should be 2, contributed +-- to by the session that is idle in transaction. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 2 +(1 row) +0:SELECT count(*) from pg_stat_activity WHERE query LIKE 'DECLARE c% CURSOR FOR SELECT 1;' AND state = 'idle in transaction'; + count +------- + 1 +(1 row) +0:SELECT count(*) from pg_stat_activity WHERE query LIKE 'DECLARE c% CURSOR FOR SELECT 1;' AND state = 'idle in transaction (aborted)'; + count +------- + 1 +(1 row) + +-- After ending the transactions, there should be 0 active statements. +1<: <... completed> +ERROR: deadlock detected +DETAIL: Process 738539 waits for ExclusiveLock on resource queue 90366; blocked by process 738548. +Process 738548 waits for ExclusiveLock on resource queue 90366; blocked by process 738539. +HINT: See server log for query details. +1:END; +END +2:END; +END +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 0 +(1 row) + +-- +-- Scenario 2: +-- Multiple explicit cursors active in the same session with a self deadlock. +-- +1:BEGIN; +BEGIN +1:DECLARE c1 CURSOR FOR SELECT 1; +DECLARE +1:DECLARE c2 CURSOR FOR SELECT 1; +DECLARE + +-- There should be 2 active statements. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 2 +(1 row) + +-- This should cause a self-deadlock and session 1 should error out, aborting +-- its transaction. +1:DECLARE c3 CURSOR FOR SELECT 1; +ERROR: deadlock detected, locking against self + +-- There should be 0 active statements following the transaction abort. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 0 +(1 row) + +1:END; +END + +-- +-- Scenario 3: +-- Multiple explicit cursors active in the same session with cancellation. +-- +1:BEGIN; +BEGIN +1:DECLARE c1 CURSOR FOR SELECT 1; +DECLARE + +2:BEGIN; +BEGIN +2:DECLARE c2 CURSOR FOR SELECT 1; +DECLARE + +-- This should block as it will exceed the active statements limit. +1&:DECLARE c3 CURSOR FOR SELECT 1; + +-- There should be 2 active statements. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 2 +(1 row) + +-- Cancel session 1's transaction. +0:SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query = 'DECLARE c3 CURSOR FOR SELECT 1;'; + pg_cancel_backend +------------------- + t +(1 row) + +-- There should now only be one active statement, following the abort of session +-- 1's transaction. The active statement is contributed by session 2. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 1 +(1 row) +0:SELECT query, state from pg_stat_activity WHERE query = 'DECLARE c2 CURSOR FOR SELECT 1;'; + query | state +---------------------------------+--------------------- + DECLARE c2 CURSOR FOR SELECT 1; | idle in transaction +(1 row) + +-- After ending the transactions, there should be 0 active statements. +1<: <... completed> +ERROR: canceling statement due to user request +1:END; +END +2:END; +END +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + rsqcountlimit | rsqcountvalue +---------------+--------------- + 2 | 0 +(1 row) + +-- Cleanup +0:DROP ROLE role_multi_portal; +DROP +0:DROP RESOURCE QUEUE rq_multi_portal; +DROP diff --git a/src/test/singlenode_isolation2/expected/restore_memory_accounting_default.out b/src/test/singlenode_isolation2/expected/restore_memory_accounting_default.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_isolation2/expected/runaway_query.out b/src/test/singlenode_isolation2/expected/runaway_query.out new file mode 100644 index 00000000000..ce820d61223 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/runaway_query.out @@ -0,0 +1,29 @@ +CREATE EXTENSION IF NOT EXISTS gp_inject_fault; +CREATE +CREATE OR REPLACE LANGUAGE plpgsql; +CREATE + +CREATE TABLE runaway_query_test_table(a bigint NOT NULL); +CREATE + +-- Use error fault to simulate vmem protect error and force cancel query. +SELECT gp_inject_fault_infinite('gpdbwrappers_get_comparison_operator', 'error', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Following query will trip the fault during ORCA optimization +EXPLAIN (COSTS OFF) SELECT a FROM runaway_query_test_table WHERE (a = ANY ((ARRAY[42]))); + QUERY PLAN +----------------------------------------- + Seq Scan on runaway_query_test_table + Filter: (a = ANY ('{42}'::integer[])) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT gp_inject_fault('all', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/cancel_commit_pending_replication.out b/src/test/singlenode_isolation2/expected/segwalrep/cancel_commit_pending_replication.out new file mode 100644 index 00000000000..ed5e3d201b8 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/cancel_commit_pending_replication.out @@ -0,0 +1,102 @@ +select gp_inject_fault('sync_rep_query_cancel', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +select gp_inject_fault('wal_sender_loop', 'reset', 2); + gp_inject_fault +----------------- + Success: +(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 + +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 +(8 rows) +create table store_session_id(a int, sess_id int); +CREATE +-- 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 +-- 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); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- Expect: `create table` should be blocked until reset +-- `wal_sender_loop`. We also verify the `sync_rep_query_cancel` is +-- triggered by query cancel request. +1&: create table cancel_commit_pending_replication(a int, b int); +select gp_wait_until_triggered_fault('finish_prepared_start_of_function', 1, 2); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- now pause the wal sender on primary for content 0 +select gp_inject_fault_infinite('wal_sender_loop', 'suspend', 2); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- let the transaction move forward with the commit +select gp_inject_fault('finish_prepared_start_of_function', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +-- loop to reach wait_event=SyncRep +0U: select wait_for_replication(1200); + wait_for_replication +---------------------- + t +(1 row) +-- hitting this fault, is checked for test validation +select gp_inject_fault_infinite('sync_rep_query_cancel', 'skip', 2); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +0U: select pg_cancel_backend(pid) from pg_stat_activity where wait_event='SyncRep' and sess_id in (select sess_id from store_session_id); + pg_cancel_backend +------------------- + t +(1 row) +-- EXPECT: hit this fault for QueryCancelPending +select gp_wait_until_triggered_fault('sync_rep_query_cancel', 1, 2); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- EXPECT: the query is still in waiting mode, to verify the cancel is ignored. +0U: select wait_event from pg_stat_activity where sess_id in (select sess_id from store_session_id); + wait_event +------------ + SyncRep +(1 row) +-- resume the primary on content 0 +select gp_inject_fault('wal_sender_loop', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +1<: <... completed> +CREATE +-- cleanup +select gp_inject_fault('sync_rep_query_cancel', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/commit_blocking.out b/src/test/singlenode_isolation2/expected/segwalrep/commit_blocking.out new file mode 100644 index 00000000000..5edac6d59f5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/commit_blocking.out @@ -0,0 +1,136 @@ +-- This test assumes 3 primaries and 3 mirrors from a gpdemo segwalrep cluster + +-- make sure we are in-sync for the primary we will be testing with +select content, role, preferred_role, status from gp_segment_configuration; + content | role | preferred_role | status +---------+------+----------------+-------- + -1 | p | p | u + -1 | m | m | u + 1 | p | p | u + 1 | m | m | u + 2 | p | p | u + 2 | m | m | u + 0 | p | p | u + 0 | m | m | u +(8 rows) + +-- print synchronous_standby_names should be set to '*' at start of test +0U: show synchronous_standby_names; + synchronous_standby_names +--------------------------- + * +(1 row) + +-- create table and show commits are not blocked +create table segwalrep_commit_blocking (a int) distributed by (a); +CREATE +insert into segwalrep_commit_blocking values (5); +INSERT 1 + +-- skip FTS probes always +select gp_inject_fault('fts_probe', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +select gp_inject_fault_infinite('fts_probe', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- force scan to trigger the fault +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- stop a mirror and show commit on dbid 2 will block +-1U: select pg_ctl((select datadir from gp_segment_configuration c where c.role='m' and c.content=0), 'stop'); + pg_ctl +-------- + OK +(1 row) +-- We should insert a tuple to segment 0. +-- With jump consistent hash as the underlying hash algorithm, +-- a int value of 4 is on seg0. +0U&: insert into segwalrep_commit_blocking values (4); + +-- restart primary dbid 2 +-1U: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=0), 'restart'); + pg_ctl +-------- + OK +(1 row) + +-- should show dbid 2 utility mode connection closed because of primary restart +0U<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +0Uq: ... + +-- synchronous_standby_names should be set to '*' after primary restart +0U: show synchronous_standby_names; + synchronous_standby_names +--------------------------- + * +(1 row) + +-- this should block since mirror is not up and sync replication is on +3: begin; +BEGIN +3: insert into segwalrep_commit_blocking values (4); +INSERT 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 + +-- 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 +3<: <... completed> +COMMIT + +-- resume FTS probes +select gp_inject_fault('fts_probe', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- everything should be back to normal +4: insert into segwalrep_commit_blocking select i from generate_series(1,10)i; +INSERT 10 +4: select * from segwalrep_commit_blocking order by a; + a +---- + 1 + 2 + 3 + 4 + 4 + 4 + 5 + 5 + 6 + 6 + 7 + 8 + 9 + 10 +(14 rows) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/commit_blocking_on_standby.out b/src/test/singlenode_isolation2/expected/segwalrep/commit_blocking_on_standby.out new file mode 100644 index 00000000000..a8ed254deef --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/commit_blocking_on_standby.out @@ -0,0 +1,207 @@ +-- +-- Master/standby commit blocking scenarios. These are different from +-- primary/mirror commit blocking because there is no FTS or a +-- third-party as external arbiter in case of master/standby. +-- +-- Scenario1: Commits should block until standby confirms WAL flush +-- up to commit LSN. + +-- Check that are starting with a clean slate, standby must be in sync +-- with master. + +select application_name, state from pg_stat_replication; + application_name | state +------------------+----------- + gp_walreceiver | streaming +(1 row) + +-- Inject fault on standby to skip WAL flush. +select gp_inject_fault_infinite('walrecv_skip_flush', 'skip', dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +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 + +-- Flush WAL to trigger the fault on standby. +checkpoint; +CHECKPOINT + +select gp_wait_until_triggered_fault('walrecv_skip_flush', 1, dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Should block in commit (SyncrepWaitForLSN()), waiting for commit +-- LSN to be flushed on standby. +1&: create table commit_blocking_on_standby_t1 (a int); + +-- The create table command should be seen as blocked. Wait until +-- that happens. +select wait_for_pg_stat_activity(60); + wait_for_pg_stat_activity +--------------------------- + +(1 row) +select datname, wait_event, query from pg_stat_activity where wait_event = 'SyncRep'; + datname | wait_event | query +----------------+------------+----------------------------------------------------- + isolation2test | SyncRep | create table commit_blocking_on_standby_t1 (a int); +(1 row) + +select gp_inject_fault('walrecv_skip_flush', 'reset', dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Ensure that commits are no longer blocked. +commit; +COMMIT + +1<: <... completed> +CREATE + +-- 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 + + +-- Scenario2: In CATCHUP phase, commits should not block until standby +-- has caught up within range. And thereafter, commits should start +-- blocking. + +-- In order to get master and standby in CATCHUP state, existing +-- connection, which is in STREAMING state must be closed. A new +-- connection will then be initiated by standby, beginning in STARTUP +-- then CATCHUP to STREAMING. Faults are used to suspend WAL sender +-- before entering STREAMING state. + +-- Suspend WAL sender in main loop. "infinite_loop" fault type does +-- not block signals. +select gp_inject_fault_infinite('wal_sender_loop', 'infinite_loop', dbid) from gp_segment_configuration where content=-1 and role='p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Inject fault on standby to skip WAL flush. +select gp_inject_fault_infinite('walrecv_skip_flush', 'skip', dbid) from gp_segment_configuration where content=-1 and role='m'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Kill existing walsender. WAL sender and WAL receiver processes +-- will be restarted and new connection will be established. Note +-- that the faults injected are still in effect and will affect the +-- newly forked WAL sender and receiver processes. +select pg_terminate_backend(pid) from pg_stat_replication; + pg_terminate_backend +---------------------- + t +(1 row) + +-- Should be set to 1 WAL segment by default. Standby is considered +-- caught up if its flush_lsn is less than 1 WAL segment (64MB) +-- away from sent_lsn. +show repl_catchup_within_range; + repl_catchup_within_range +--------------------------- + 1 +(1 row) + +-- Start a transaction, execute a DDL and commit. The commit should +-- not block. +begin; +BEGIN + +select wait_until_standby_in_state('catchup'); + wait_until_standby_in_state +----------------------------- + catchup +(1 row) + +select gp_wait_until_triggered_fault('wal_sender_loop', 1, dbid) from gp_segment_configuration where content=-1 and role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- WAL sender should be stuck in CATCHUP state. +select application_name, state from pg_stat_replication; + application_name | state +------------------+--------- + gp_walreceiver | catchup +(1 row) + +-- This commit should NOT block because WAL sender has not yet +-- processed caughtup within range as it is stuck at the beginning of +-- main loop. +commit; +COMMIT + +select gp_inject_fault('wal_sender_after_caughtup_within_range', 'suspend', dbid) from gp_segment_configuration where content=-1 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +select gp_inject_fault('wal_sender_loop', 'reset', dbid) from gp_segment_configuration where content=-1 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Once this fault is triggered, WAL sender should have set +-- caughtup_within_range to true because difference between +-- sent_lsn and flush_lsn is within 1 WAL segment (64) MB. +select gp_wait_until_triggered_fault( 'wal_sender_after_caughtup_within_range', 1, dbid) from gp_segment_configuration where content=-1 and role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Should block because standby is considered to have caughtup within +-- range. +1&: create table commit_blocking_on_standby_t2 (a int); + +-- The create table command should be seen as blocked. +select wait_for_pg_stat_activity(60); + wait_for_pg_stat_activity +--------------------------- + +(1 row) +select datname, wait_event, query from pg_stat_activity where wait_event = 'SyncRep'; + datname | wait_event | query +----------------+------------+----------------------------------------------------- + isolation2test | SyncRep | create table commit_blocking_on_standby_t2 (a int); +(1 row) + +-- Reset faults on primary as well as mirror. +select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration where content=-1; + gp_inject_fault +----------------- + Success: + Success: +(2 rows) + +1<: <... completed> +CREATE + +-- 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 + +select wait_until_standby_in_state('streaming'); + wait_until_standby_in_state +----------------------------- + streaming +(1 row) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/die_commit_pending_replication.out b/src/test/singlenode_isolation2/expected/segwalrep/die_commit_pending_replication.out new file mode 100644 index 00000000000..bc706f16321 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/die_commit_pending_replication.out @@ -0,0 +1,139 @@ +-- 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 +1: insert into store_session_id select 2, sess_id from pg_stat_activity where pid = pg_backend_pid(); +INSERT 1 +1: select gp_segment_id, a from store_session_id; + gp_segment_id | a +---------------+--- + 0 | 2 +(1 row) + +1: create table die_commit_pending_replication(a int, b int); +CREATE + +-- 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', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1&: insert into die_commit_pending_replication values(2),(1); +select gp_wait_until_triggered_fault('finish_prepared_start_of_function', 1, dbid) from gp_segment_configuration where role='p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Now pause the wal sender on primary for content 0 +select gp_inject_fault_infinite('wal_sender_loop', 'suspend', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Insert fault in the ProcDiePending code block. +select gp_inject_fault_infinite('sync_rep_query_die', 'skip', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Let the transaction move forward with the commit +select gp_inject_fault('finish_prepared_start_of_function', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Ensure the ProcDiePending code block is called. It implies 'SyncRep' in pg_stat_activity. +select gp_wait_until_triggered_fault('sync_rep_query_die', 1, dbid) from gp_segment_configuration where role='p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- We can terminate the backend on QE now. +0U: select pg_terminate_backend(pid) from pg_stat_activity where wait_event='SyncRep' and sess_id in (select sess_id from store_session_id); + pg_terminate_backend +---------------------- + t +(1 row) + +-- We expect two more occurrence: one for backend quitting and another for retry. +select gp_wait_until_triggered_fault('sync_rep_query_die', 3, dbid) from gp_segment_configuration where role='p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Verify that the sess_id changes due to retry. +0U: select pid,sess_id,wait_event,query from pg_stat_activity where sess_id in (select sess_id from store_session_id); + pid | sess_id | wait_event | query +-----+---------+------------+------- +(0 rows) + +-- resume the primary wal replication so that retry could complete. +select gp_inject_fault('wal_sender_loop', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +-- reset sync_rep_query_die +select gp_inject_fault('sync_rep_query_die', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) + +1<: <... completed> +INSERT 2 + +-- check if the insert fails or not. +select gp_segment_id, * from die_commit_pending_replication; + gp_segment_id | a | b +---------------+---+--- + 0 | 2 | + 1 | 1 | +(2 rows) + +-- +-- Test 1PC: if there is transaction xlog commit on QD, and QE quits during the +-- "notification" stage, QD won't panic. Previously the notification code is +-- after xlog commit code on QD so QE quitting will cause notification on QD +-- elog(ERROR) but at that moment the transaction can not be aborted (caused by +-- elog(ERROR)), else panic with message as below, "cannot abort transaction +-- %u, it was already committed". +-- + +2: create temp table die_commit_pending_replication2(a int); +CREATE +2: insert into die_commit_pending_replication2 values(2),(1); +INSERT 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; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Start an one phase query that writes commit xlog on QD. +2: begin; select txid_current(); select * from die_commit_pending_replication2; end; +ERROR: fault triggered, fault name:'start_performDtxProtocolCommitOnePhase' fault type:'error' (seg0 192.168.235.128:7002 pid=63969) + +-- Reset start_performDtxProtocolCommitOnePhase. +select gp_inject_fault_infinite('start_performDtxProtocolCommitOnePhase', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- cleanup +drop table die_commit_pending_replication; +DROP +drop table store_session_id; +DROP diff --git a/src/test/singlenode_isolation2/expected/segwalrep/dtm_recovery_on_standby.out b/src/test/singlenode_isolation2/expected/segwalrep/dtm_recovery_on_standby.out new file mode 100644 index 00000000000..76f12f54a10 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/dtm_recovery_on_standby.out @@ -0,0 +1,150 @@ +-- Validate that standby performs DTM recovery upon promotion. + +-- Check that are starting with a clean slate, standby must be in sync +-- with master. +select application_name, state, sync_state from pg_stat_replication; + application_name | state | sync_state +------------------+-----------+------------ + gp_walreceiver | streaming | sync +(1 row) + +-- Scenario1: standby broadcasts commit-prepared for a transaction +-- that was prepared on master. + +-- Suspend master backend before it sends commit-prepared +select gp_inject_fault('dtm_broadcast_commit_prepared', 'suspend', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +1&: create table committed_by_standby(a int, b int); + +select gp_wait_until_triggered_fault('dtm_broadcast_commit_prepared', 1, dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Scenario2: standby broadcasts abort-prepared for a transaction that +-- doesn't have distributed commit recorded in XLOG. Inject faults +-- such that the QD backend errors out after prepare broadcast and +-- then suspends in AbortTransaction(), before it can send abort +-- prepared broadcast. QEs still have the transaction as prepared. +select gp_inject_fault('transaction_abort_after_distributed_prepared', 'error', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +select gp_inject_fault('transaction_abort_failure', 'suspend', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +2&: create table aborted_by_standby(a int, b int); + +select gp_wait_until_triggered_fault('transaction_abort_failure', 1, dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Promote standby +select pg_ctl(datadir, 'promote') from gp_segment_configuration where content = -1 and role = 'm'; + pg_ctl +-------- + OK +(1 row) + +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +-- "-1S" means connect to standby's port assuming it's accepting +-- connections. This select should succeed because the create table +-- transaction's commit prepared broadcast must have been sent by +-- standby after promotion. +-1S: select count(*) from committed_by_standby; + count +------- + 0 +(1 row) + +-- Should fail because the create table transaction's abort prepared +-- broadcast must have been sent by standby after promotion. +-1S: select count(*) from aborted_by_standby; +ERROR: relation "aborted_by_standby" does not exist +LINE 1: select count(*) from aborted_by_standby; + ^ + +-1Sq: ... + +-- Reset faults. The suspended backend will be unblocked and try to +-- broadcast commit prepared again. QEs ignore this request, so that +-- broadcast is essentially a no-op. +select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +1<: <... completed> +CREATE +2<: <... completed> +ERROR: fault triggered, fault name:'transaction_abort_after_distributed_prepared' fault type:'error' + +-- Destroy and recreate the standby +select pg_ctl(datadir, 'stop', 'immediate') from gp_segment_configuration where content = -1 and role = 'm'; + pg_ctl +-------- + OK +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- Standby details need to be stored in a separate table because +-- reinitialize_standby() first removes standby from catalog and then +-- adds it to the catalog using gpinitstandby. If temp table is not +-- used and the function is invoked directly on +-- gp_segment_configuration, we get a deadlock. The backend started +-- by gpinitstandby needs access exclusive lock and the backend for +-- this isolation spec is already holding an access share lock on +-- gp_segment_configuration. +-- NOTE: the select query should fail since the gang for master has been +-- terminated by the dtx recovery process on standby during standby promote. We +-- do not test the result of the select query; just expect it fail so that the +-- next mpp query could recreate the gang and succeed. +-- start_ignore +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 + +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 + +select reinitialize_standby(); + reinitialize_standby +---------------------- + standby initialized +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- Sync state between master and standby must be restored at the end. +select wait_until_standby_in_state('streaming'); + wait_until_standby_in_state +----------------------------- + streaming +(1 row) + diff --git a/src/test/singlenode_isolation2/expected/segwalrep/dtx_recovery_wait_lsn.out b/src/test/singlenode_isolation2/expected/segwalrep/dtx_recovery_wait_lsn.out new file mode 100644 index 00000000000..a410a91b754 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/dtx_recovery_wait_lsn.out @@ -0,0 +1,130 @@ +-- Test this scenario: +-- mirror has latency replaying the WAL from the primary, the master is reset +-- from PANIC, master will start the DTX recovery process to recover the +-- in-progress two-phase transactions. +-- The FTS process should be able to continue probe and 'sync off' the mirror +-- while the 'dtx recovery' process is hanging recovering distributed transactions. + +1: create table t_wait_lsn(a int); +CREATE + +-- 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'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1&: insert into t_wait_lsn values(2),(1); +2: select gp_wait_until_triggered_fault('finish_prepared_start_of_function', 1, dbid) from gp_segment_configuration where content=0 and role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- let walreceiver on mirror 0 skip WAL flush +2: select gp_inject_fault_infinite('walrecv_skip_flush', 'skip', dbid) from gp_segment_configuration where content=0 and role='m'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- resume 'COMMIT PREPARED', session 1 will hang on 'SyncRepWaitForLSN' +2: select gp_inject_fault_infinite('finish_prepared_start_of_function', 'reset', dbid) from gp_segment_configuration where content=0 and role='p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +0U: select count(*) from pg_prepared_xacts; + count +------- + 1 +(1 row) + +-- stop mirror +3: SELECT pg_ctl(datadir, 'stop', 'immediate') FROM gp_segment_configuration WHERE content=0 AND role = 'm'; + pg_ctl +-------- + OK +(1 row) +!\retcode gpfts -R 1 -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +-- trigger master reset +3: select gp_inject_fault('exec_simple_query_start', 'panic', current_setting('gp_dbid')::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +-- verify master panic happens. The PANIC message does not emit sometimes so +-- mask it. +-- start_matchsubs +-- m/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n/ +-- s/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n// +-- end_matchsubs +3: select 1; +PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- wait for master finish crash recovery +-1U: select wait_until_standby_in_state('streaming'); + wait_until_standby_in_state +----------------------------- + streaming +(1 row) + +-- wait for FTS to 'sync off' the mirror, meanwhile, dtx recovery process will +-- restart repeatedly. +-- the query should succeed finally since dtx recovery process is able to quit. +-- this's what we want to test. +4: select count(*) from t_wait_lsn; + count +------- + 2 +(1 row) + +1<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +!\retcode gpfts -R 1 -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode gprecoverseg -a; +(exited with code 0) +!\retcode gpfts -R 1 -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +-- loop while segments come in sync +4: select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) +4: select pg_sleep(10); + pg_sleep +---------- + +(1 row) +4: select count(*) from t_wait_lsn; + count +------- + 2 +(1 row) +4: drop table t_wait_lsn; +DROP + +4: select gp_inject_fault('walrecv_skip_flush', 'reset', dbid) from gp_segment_configuration where content=0; + gp_inject_fault +----------------- + Success: + Success: +(2 rows) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/failover_with_many_records.out b/src/test/singlenode_isolation2/expected/segwalrep/failover_with_many_records.out new file mode 100644 index 00000000000..47a4f4f6140 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/failover_with_many_records.out @@ -0,0 +1,131 @@ +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 30 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 120 --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 1000 --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 0) + +1:CREATE TABLE t(a int, b int); +CREATE + +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 +-------------------------- + Success: +(1 row) +2&:CHECKPOINT; +3:INSERT INTO t VALUES (1, 0); +INSERT 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 + +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 +-------------------------- + Success: +(1 row) +2<: <... completed> +CHECKPOINT + +-- Here we must force immediately shutdown primary without triggering another +-- checkpoint otherwise we would undo all of our previous work to ensure that +-- checkpoint record has redo record on another wal segment. +-1U: SELECT pg_ctl((SELECT datadir FROM gp_segment_configuration c WHERE c.role='p' AND c.content=1), 'stop', 'immediate'); + pg_ctl +-------- + OK +(1 row) + +-- Make sure we see the segment is down before trying to recover... +4:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +4:SELECT role, preferred_role FROM gp_segment_configuration WHERE content = 1; + role | preferred_role +------+---------------- + m | p + p | m +(2 rows) + +SELECT count(*) FROM t; + count +------- + 26 +(1 row) +!\retcode gprecoverseg -a; +-- start_ignore +-- end_ignore +(exited with code 0) + +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +!\retcode gprecoverseg -ar; +-- start_ignore +-- end_ignore +(exited with code 0) + +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- verify no segment is down after recovery +1:SELECT COUNT(*) FROM gp_segment_configuration WHERE status = 'd'; + count +------- + 0 +(1 row) + +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 0) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/fts_unblock_primary.out b/src/test/singlenode_isolation2/expected/segwalrep/fts_unblock_primary.out new file mode 100644 index 00000000000..7a6b0b143bd --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/fts_unblock_primary.out @@ -0,0 +1,235 @@ +-- This test assumes 3 primaries and 3 mirrors from a gpdemo segwalrep cluster + +-- make sure we are in-sync for the primary we will be testing with +select content, role, preferred_role, status from gp_segment_configuration; + content | role | preferred_role | status +---------+------+----------------+-------- + -1 | p | p | u + -1 | m | m | u + 1 | p | p | u + 1 | m | m | u + 2 | p | p | u + 2 | m | m | u + 0 | p | p | u + 0 | m | m | u +(8 rows) + +-- synchronous_standby_names should be set to '*' by default on primary 2, since +-- we have a working/sync'd mirror +2U: show synchronous_standby_names; + synchronous_standby_names +--------------------------- + * +(1 row) +2U: show gp_fts_mark_mirror_down_grace_period; + gp_fts_mark_mirror_down_grace_period +-------------------------------------- + 30s +(1 row) + +!\retcode gpconfig -c gp_fts_mark_mirror_down_grace_period -v 300; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- create table and show commits are not blocked +create table fts_unblock_primary (a int) distributed by (a); +CREATE +-- 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 + +-- skip FTS probes always +select gp_inject_fault('fts_probe', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +select gp_inject_fault_infinite('fts_probe', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- force scan to trigger the fault +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +-- stop a mirror +-1U: select pg_ctl((select get_data_directory_for(2, 'm')), 'stop'); + pg_ctl +-------- + OK +(1 row) + +-- this should block since mirror is not up and sync replication is on +2: begin; +BEGIN +2: insert into fts_unblock_primary values (5); +INSERT 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 + +-- resume FTS probes +select gp_inject_fault('fts_probe', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- trigger fts probe and check to see primary marked n/u and mirror still n/u as +-- still should be in mirror down grace period. +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +select content, role, preferred_role, mode, status from gp_segment_configuration where content=2; + content | role | preferred_role | mode | status +---------+------+----------------+------+-------- + 2 | p | p | s | u + 2 | m | m | s | u +(2 rows) + +-- set mirror down grace period to zero to instantly mark mirror down +!\retcode gpconfig -c gp_fts_mark_mirror_down_grace_period -v 0; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 1) + +2U: show gp_fts_mark_mirror_down_grace_period; + gp_fts_mark_mirror_down_grace_period +-------------------------------------- + 0 +(1 row) + +-- trigger fts probe and check to see primary marked n/u and mirror n/d +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +select content, role, preferred_role, mode, status from gp_segment_configuration where content=2; + content | role | preferred_role | mode | status +---------+------+----------------+------+-------- + 2 | p | p | n | u + 2 | m | m | n | d +(2 rows) + +-- should unblock and commit after FTS sent primary a SyncRepOff libpq message +2<: <... completed> +COMMIT + +-- synchronous_standby_names should now be empty on the primary +2U: show synchronous_standby_names; + synchronous_standby_names +--------------------------- + +(1 row) + +--hold walsender in startup +select gp_inject_fault_infinite('initialize_wal_sender', 'suspend', dbid) from gp_segment_configuration where role='p' and content=2; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- bring the mirror back up and see primary s/u and mirror s/u +-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 +------------------------------- + Success: +(1 row) +-- make sure the walsender on primary is in startup +select state from gp_stat_replication where gp_segment_id=2; + state +--------- + startup +(1 row) +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +-- mirror should continue to be reported as down since walsender is in startup +select content, role, preferred_role, mode, status from gp_segment_configuration where content=2; + content | role | preferred_role | mode | status +---------+------+----------------+------+-------- + 2 | p | p | n | u + 2 | m | m | n | d +(2 rows) + +-- let the walsender proceed +select gp_inject_fault('initialize_wal_sender', 'reset', dbid) from gp_segment_configuration where role='p' and content=2; + gp_inject_fault +----------------- + Success: +(1 row) +select wait_until_segment_synchronized(2); + wait_until_segment_synchronized +--------------------------------- + OK +(1 row) +select content, role, preferred_role, mode, status from gp_segment_configuration where content=2; + content | role | preferred_role | mode | status +---------+------+----------------+------+-------- + 2 | p | p | s | u + 2 | m | m | s | u +(2 rows) + +-- everything is back to normal +insert into fts_unblock_primary select i from generate_series(1,10)i; +INSERT 10 + +-- synchronous_standby_names should be back to its original value on the primary +2U: show synchronous_standby_names; + synchronous_standby_names +--------------------------- + * +(1 row) + +!\retcode gpconfig -r gp_fts_mark_mirror_down_grace_period; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 0) +2U: show gp_fts_mark_mirror_down_grace_period; + gp_fts_mark_mirror_down_grace_period +-------------------------------------- + 30s +(1 row) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/master_wal_switch.out b/src/test/singlenode_isolation2/expected/segwalrep/master_wal_switch.out new file mode 100644 index 00000000000..867d550c745 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/master_wal_switch.out @@ -0,0 +1,77 @@ +-- Test for verifying if wal seg created while basebackup +-- dumps out data does not get cleaned + +-- Inject fault after checkpoint creation in basebackup +SELECT gp_inject_fault('base_backup_post_create_checkpoint', 'suspend', dbid) FROM gp_segment_configuration WHERE content=-1 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Run pg_basebackup which should trigger and suspend at the fault +1&: SELECT pg_basebackup(hostname, 100, port, false, NULL, '/tmp/master_wal_switch_test', true, 'fetch') from gp_segment_configuration where content=-1 and role='p'; + +-- Wait until fault has been triggered +SELECT gp_wait_until_triggered_fault('base_backup_post_create_checkpoint', 1, dbid) FROM gp_segment_configuration WHERE content=-1 and role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- See that pg_basebackup is still running +SELECT application_name, state FROM pg_stat_replication; + application_name | state +------------------+----------- + gp_walreceiver | streaming + pg_basebackup | backup +(2 rows) + +-- Switch to a new WAL segment file. Two pg_switch_wal() invocations +-- with a command that generates WAL in between the invocations are +-- suffice to generate new WAL file. +CREATE TEMP TABLE walfile(fname text); +CREATE +INSERT INTO walfile SELECT pg_walfile_name(pg_switch_wal()); +INSERT 1 +CREATE TABLE master_wal_dummy(); +CREATE +-- 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; + ?column? +---------- + f +(1 row) + +-- Checkpoint should retain WAL that is still needed by basebackup. +CHECKPOINT; +CHECKPOINT + +-- Resume basebackup +SELECT gp_inject_fault('base_backup_post_create_checkpoint', 'reset', dbid) FROM gp_segment_configuration WHERE content=-1 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Wait until basebackup finishes +1<: <... completed> + pg_basebackup +--------------- + +(1 row) + +-- Verify if basebackup completed successfully +-- See if recovery.conf exists (Yes - Pass) +SELECT application_name, state FROM pg_stat_replication; + application_name | state +------------------+----------- + gp_walreceiver | streaming +(1 row) +!\retcode ls /tmp/master_wal_switch_test/postgresql.auto.conf /tmp/master_wal_switch_test/standby.signal; +-- start_ignore +/tmp/master_wal_switch_test/postgresql.auto.conf +/tmp/master_wal_switch_test/standby.signal + +-- end_ignore +(exited with code 0) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/mirror_promotion.out b/src/test/singlenode_isolation2/expected/segwalrep/mirror_promotion.out new file mode 100644 index 00000000000..7cf2f7df8d3 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/mirror_promotion.out @@ -0,0 +1,201 @@ +-- Tests mirror promotion triggered by FTS in 2 different scenarios. +-- +-- 1st: Shut-down of primary and hence unavailability of primary +-- leading to mirror promotion. In this case the connection between +-- primary and mirror is disconnected prior to promotion and +-- walreceiver doesn't exist. +-- +-- 2nd: Primary is alive but using fault injector simulated to not +-- respond to fts. This helps to validate fts time-out logic for +-- probes. Plus also mirror promotion triggered while connection +-- between primary and mirror is still alive and hence walreceiver +-- also exist during promotion. + +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 +(8 rows) +-- stop a primary in order to trigger a mirror promotion +select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=0), 'stop'); + pg_ctl +-------- + OK +(1 row) + +-- trigger failover +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +-- wait some seconds until the promotion is done. +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- expect: to see the content 0, preferred primary is mirror and it's down +-- the preferred mirror is primary and it's up and not-in-sync +select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0; + content | preferred_role | role | status | mode +---------+----------------+------+--------+------ + 0 | p | m | d | n + 0 | m | p | u | n +(2 rows) + +-- wait some seconds until the promotion is done. +select pg_sleep(2); + pg_sleep +---------- + +(1 row) +-- wait for content 0 (earlier mirror, now primary) to finish the promotion +0U: select 1; + ?column? +---------- + 1 +(1 row) +-- Quit this utility mode session, as need to start fresh one below +0Uq: ... + +-- fully recover the failed primary as new mirror +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- expect: to see roles flipped and in sync +select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0; + content | preferred_role | role | status | mode +---------+----------------+------+--------+------ + 0 | m | p | u | s + 0 | p | m | u | s +(2 rows) + +-- start_ignore +select dbid from gp_segment_configuration where content = 0 and role = 'p'; + dbid +------ + 5 +(1 row) +-- end_ignore + +select gp_inject_fault_infinite('fts_handle_message', 'infinite_loop', dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- trigger failover +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +-- trigger one more probe right away which mostly results in sending +-- promotion request again to mirror, while its going through +-- promotion, which is nice condition to test as well. +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- expect segments restored back to its preferred role, but mirror is down +select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0; + content | preferred_role | role | status | mode +---------+----------------+------+--------+------ + 0 | m | m | d | n + 0 | p | p | u | n +(2 rows) + +-- wait some seconds until the promotion is done. +select pg_sleep(2); + pg_sleep +---------- + +(1 row) +-- start_ignore +-- reset GUCs +alter system set gp_fts_probe_retries to default; +ALTER +alter system set gp_fts_probe_timeout to default; +ALTER +select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) +-- end_ignore +-- wait some seconds until the promotion is done. +select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +-- -- wait for content 0 (earlier mirror, now primary) to finish the promotion +0U: select 1; + ?column? +---------- + 1 +(1 row) + +-- create tablespace to test if it works with gprecoverseg -F (pg_basebackup) +!\retcode mkdir -p /tmp/mirror_promotion_tablespace_loc; +-- start_ignore + +-- end_ignore +(exited with code 0) +create tablespace mirror_promotion_tablespace location '/tmp/mirror_promotion_tablespace_loc'; +CREATE +create table mirror_promotion_tblspc_heap_table (a int) tablespace mirror_promotion_tablespace; +CREATE + +-- -- now, let's fully recover the mirror +!\retcode gprecoverseg -aF --no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) + +drop table mirror_promotion_tblspc_heap_table; +DROP +drop tablespace mirror_promotion_tablespace; +DROP + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- now, the content 0 primary and mirror should be at their preferred role +-- and up and in-sync +select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0; + content | preferred_role | role | status | mode +---------+----------------+------+--------+------ + 0 | p | p | u | s + 0 | m | m | u | s +(2 rows) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/recoverseg_from_file.out b/src/test/singlenode_isolation2/expected/segwalrep/recoverseg_from_file.out new file mode 100644 index 00000000000..13d8ee0afb5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/recoverseg_from_file.out @@ -0,0 +1,171 @@ +-- Test gprecoverseg from config file uses the correct dbid. +-- +-- In github issue 9837 dbid in gp_segment_configuration is not +-- consistent with dbid in file internal.auto.conf. +-- This is caused by gprecoverseg fetch the smallest dbid in +-- gp_segment_configuration which is not occupied by others when +-- adding a new mirror. When dbid in gp_segment_configuration is not +-- continous, the inconsistent issue will happen + +-- +-- generate_recover_config_file: +-- Generate config file used by recoverseg -i, to trigger '__callSegmentAddMirror', +-- we should recover the segment to a different datadir location instead of its +-- original one. +-- +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 + +SELECT dbid, role, preferred_role, content, status FROM gp_segment_configuration order by dbid; + dbid | role | preferred_role | content | status +------+------+----------------+---------+-------- + 1 | p | p | -1 | u + 2 | p | p | 0 | u + 3 | p | p | 1 | u + 4 | p | p | 2 | u + 5 | m | m | 0 | u + 6 | m | m | 1 | u + 7 | m | m | 2 | u + 8 | m | m | -1 | u +(8 rows) +-- stop a primary in order to trigger a mirror promotion +select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=1), 'stop'); + pg_ctl +-------- + OK +(1 row) + +-- trigger failover +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +-- wait for content 1 (earlier mirror, now primary) to finish the promotion +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- generate recover config file +select generate_recover_config_file( (select datadir from gp_segment_configuration c where c.role='m' and c.content=1), (select port from gp_segment_configuration c where c.role='m' and c.content=1)::text); + generate_recover_config_file +------------------------------ + +(1 row) + +-- recover from config file, only seg with content=1 will be recovered +!\retcode gprecoverseg -a -i /tmp/recover_config_file1; +-- start_ignore + +-- end_ignore +(exited with code 0) + +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- after gprecoverseg -i, the down segemnt should be up +-- in mirror mode +select status from gp_segment_configuration where role='m' and content=1; + status +-------- + u +(1 row) + +-- recover should reuse the old dbid and not occupy dbid=2 +select dbid from gp_segment_configuration where dbid=2; + dbid +------ + 2 +(1 row) + +-- recover the segment to its original datadir +!\retcode gprecoverseg -a -i /tmp/recover_config_file2; +-- start_ignore + +-- end_ignore +(exited with code 0) + +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- rebalance the cluster +!\retcode gprecoverseg -ar; +-- start_ignore + +-- end_ignore +(exited with code 0) + +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- after rebalance walrec in mirror(content=0) will failed to connect +!\retcode gprecoverseg -a; +-- start_ignore + +-- end_ignore +(exited with code 0) + +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +-- recheck gp_segment_configuration after rebalance +SELECT dbid, role, preferred_role, content, status FROM gp_segment_configuration order by dbid; + dbid | role | preferred_role | content | status +------+------+----------------+---------+-------- + 1 | p | p | -1 | u + 2 | p | p | 0 | u + 3 | p | p | 1 | u + 4 | p | p | 2 | u + 5 | m | m | 0 | u + 6 | m | m | 1 | u + 7 | m | m | 2 | u + 8 | m | m | -1 | u +(8 rows) + +-- remove recovered segment's temp datadir +!\retcode rm -rf `cat /tmp/recover_config_file2 | awk 'BEGIN {FS=" "} {print $1}' | awk 'BEGIN {FS="|"} {print $3}'`; +-- start_ignore + +-- end_ignore +(exited with code 0) +-- remove the config file +!\retcode rm /tmp/recover_config_file1; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode rm /tmp/recover_config_file2; +-- start_ignore + +-- end_ignore +(exited with code 0) + diff --git a/src/test/singlenode_isolation2/expected/segwalrep/replication_keeps_crash.out b/src/test/singlenode_isolation2/expected/segwalrep/replication_keeps_crash.out new file mode 100644 index 00000000000..ae4e4c9f290 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/replication_keeps_crash.out @@ -0,0 +1,115 @@ +-- Tests mark mirror down if replication walsender walreceiver keep +-- crash continuously. +-- +-- Primary and mirror both alive, but wal replication crash happens +-- before start streaming data. And walsender, walreceiver keeps +-- re-connect continuously, this may block other processes. +-- GPDB will track the continuously failures for the replication. +-- If the failure times exceed a limitation, FTS will mark the mirror down +-- to avoid blocking other queries. +-- More details please refer to FTSGetReplicationDisconnectTime. + +-- modify fts gucs to speed up the test. +1: select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +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 | 1 | u + m | m | 1 | u + p | p | 2 | u + m | m | 2 | u + p | p | 0 | u + m | m | 0 | u +(8 rows) + +-- Error out before walsender streaming data +select gp_inject_fault_infinite('wal_sender_loop', 'error', dbid) from gp_segment_configuration where content=0 and role='p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- Should block in commit (SyncrepWaitForLSN()), waiting for commit +-- LSN to be flushed on mirror. +1&: create table mirror_block_t1 (a int) distributed by (a); + +select gp_wait_until_triggered_fault('wal_sender_loop', 1, dbid) from gp_segment_configuration where role='p' and content=0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- trigger fts to mark mirror down. +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- After gp_fts_replication_attempt_count attempts mirror will be marked down, and syncrep will +-- be marked off and hence the commit should get unblocked. +-- 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 + +-- expect: to see the content 0, mirror is mark down +select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0; + content | preferred_role | role | status | mode +---------+----------------+------+--------+------ + 0 | p | p | u | n + 0 | m | m | d | n +(2 rows) + +select gp_inject_fault('wal_sender_loop', 'reset', dbid) from gp_segment_configuration where content=0 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- -- now, let's recover the mirror +!\retcode gprecoverseg -a --no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) + +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 | 1 | u + m | m | 1 | u + p | p | 2 | u + m | m | 2 | u + p | p | 0 | u + m | m | 0 | u +(8 rows) + +drop table mirror_block_t1; +DROP + +1: select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) diff --git a/src/test/singlenode_isolation2/expected/segwalrep/twophase_tolerance_with_mirror_promotion.out b/src/test/singlenode_isolation2/expected/segwalrep/twophase_tolerance_with_mirror_promotion.out new file mode 100644 index 00000000000..d27c4bbae4e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/segwalrep/twophase_tolerance_with_mirror_promotion.out @@ -0,0 +1,284 @@ +-- The goal of these tests is to validate that existing transactions on the +-- primary are not hung when the mirror gets promoted. In order to validate +-- this, mirror promotion is triggered at the following two-phase commit +-- points: +-- 1) if the transaction hasn't prepared, then it should be aborted +-- 2) if the transaction is already prepared, then it should complete commit +-- on the mirror +-- 3) if the transaction has committed on the primary, but not acknowledged +-- to the master then it should complete the commit on the mirror + +-- Test setup: This test needs a minimum of 3 primary/mirror pairs. In order to +-- minimize test time, each scenario is created on a different segment. Each +-- scenario fails over to the mirror and recovery for all 3 mirrors is done at the +-- end of the test. + +-- start_matchsubs +-- +-- # create a match/subs expression +-- +-- m/ERROR: FTS detected connection lost during dispatch to seg0.*/ +-- s/seg\d+.*/seg_DUMMY/gm +-- +-- end_matchsubs + +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 30 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 127 --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 250 --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 0) +1:SELECT role, preferred_role, content FROM gp_segment_configuration; + role | preferred_role | content +------+----------------+--------- + p | p | -1 + m | m | -1 + p | p | 0 + m | m | 0 + p | p | 1 + m | m | 1 + p | p | 2 + m | m | 2 +(8 rows) + +-- Scenario 1: Not prepared +1:SELECT gp_inject_fault_infinite('start_prepare', 'infinite_loop', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1&:CREATE TABLE tolerance_test_table(an_int int); +2:SELECT gp_wait_until_triggered_fault('start_prepare', 1, dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +2:SELECT gp_inject_fault_infinite('fts_handle_message', 'error', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- do fts probe request twice to guarantee the fault is triggered +2:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +2:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +1<: <... completed> +ERROR: FTS detected connection lost during dispatch to seg0 127.0.0.1:7002 pid=5106: + +1:SELECT gp_inject_fault('start_prepare', 'reset', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +1:SELECT gp_inject_fault('fts_handle_message', 'reset', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +1:SELECT role, preferred_role FROM gp_segment_configuration WHERE content = 0; + role | preferred_role +------+---------------- + m | p + p | m +(2 rows) +-- expect to fail with table not-exists +1:INSERT INTO tolerance_test_table VALUES(42); +ERROR: relation "tolerance_test_table" does not exist +LINE 1: INSERT INTO tolerance_test_table VALUES(42); + ^ + +-- Scenario 2: Prepared but not committed +-- NOTICE: Don't use session 2 again because it's cached gang is invalid +1:SELECT gp_inject_fault_infinite('transaction_abort_after_distributed_prepared', 'suspend', dbid) FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1&:CREATE TABLE tolerance_test_table(an_int int); +3:SELECT gp_wait_until_triggered_fault('transaction_abort_after_distributed_prepared', 1, dbid) FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +3:SELECT gp_inject_fault_infinite('fts_handle_message', 'error', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- do fts probe request twice to guarantee the fault is triggered +3:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +3:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +3:SELECT gp_inject_fault('transaction_abort_after_distributed_prepared', 'resume', dbid) FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +1<: <... completed> +CREATE + +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 +----------------- + Success: +(1 row) +1:SELECT gp_inject_fault('fts_handle_message', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +1:SELECT role, preferred_role FROM gp_segment_configuration WHERE content = 1; + role | preferred_role +------+---------------- + m | p + p | m +(2 rows) +1:INSERT INTO tolerance_test_table VALUES(42); +INSERT 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 +1:SELECT gp_inject_fault_infinite('finish_prepared_start_of_function', 'infinite_loop', dbid) FROM gp_segment_configuration WHERE content = 2 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1&:DROP TABLE tolerance_test_table; +4:SELECT gp_wait_until_triggered_fault('finish_prepared_start_of_function', 1, dbid) FROM gp_segment_configuration WHERE content = 2 AND role = 'p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +4:SELECT gp_inject_fault_infinite('fts_handle_message', 'error', dbid) FROM gp_segment_configuration WHERE content = 2 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +-- do fts probe request twice to guarantee the fault is triggered +4:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +4:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +1<: <... completed> +DROP + +-- 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 +-- are exhausted and PANICs the master. +5:SELECT role, preferred_role FROM gp_segment_configuration WHERE content = 2; + role | preferred_role +------+---------------- + m | p + p | m +(2 rows) + +5:!\retcode gprecoverseg -aF \-\-no-progress; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) +5:!\retcode gprecoverseg -ar; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpfts -A -D; +-- start_ignore + +-- end_ignore +(exited with code 0) + +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +-- start_ignore +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +-- end_ignore +(exited with code 0) + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + wait_until_all_segments_synchronized +-------------------------------------- + OK +(1 row) +5:SELECT role, preferred_role, content FROM gp_segment_configuration; + role | preferred_role | content +------+----------------+--------- + p | p | -1 + m | m | -1 + p | p | 0 + m | m | 0 + p | p | 1 + m | m | 1 + p | p | 2 + m | m | 2 +(8 rows) diff --git a/src/test/singlenode_isolation2/expected/select_dropped_table.out b/src/test/singlenode_isolation2/expected/select_dropped_table.out new file mode 100644 index 00000000000..1de5825b246 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/select_dropped_table.out @@ -0,0 +1,34 @@ +-- The transaction that drop a table will +-- hold Access Exclusive Lock on that table, +-- then other transactions do select|update|delete +-- on that table will wait on that lock. + +-- Cloudberry has a upgrade-lock logic to avoid global +-- deadlock, this logic is still in the code for ao-table +-- and select-for-update cases even we have GDD now. +-- The lock-upgrade logic is implemented by `CdbTryOpenRelation`, +-- this function might return a NULL pointer if the relation is +-- dropped (or some other reasons). + +-- Previous code of parserOpenTable invokes CdbTryOpenRelation, +-- and use the result without checking if the value is a NULL +-- pointer so that leads to SIGSEGV. + +-- This bug has been fixed by adding a check in parserOpenTable. +-- This test is used to confirm the fix. + +1: create table tab_select_dropped_table (c int); +CREATE +1: begin; +BEGIN +1: drop table tab_select_dropped_table; +DROP + +2&: select * from tab_select_dropped_table; + +1: end; +END +2<: <... completed> +ERROR: relation "tab_select_dropped_table" does not exist +LINE 1: select * from tab_select_dropped_table; + ^ diff --git a/src/test/singlenode_isolation2/expected/setup.out b/src/test/singlenode_isolation2/expected/setup.out new file mode 100644 index 00000000000..193a5d76361 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/setup.out @@ -0,0 +1,135 @@ +create or replace language plpython3u; +CREATE + +-- Helper function, to call either __gp_aoseg, or gp_aocsseg, depending +-- on whether the table is row- or column-oriented. This allows us to +-- run the same test queries on both. +-- +-- The Python utility that runs this doesn't know about dollar-quoting, +-- 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 + +-- Show locks in master and in segments. Because the number of segments +-- in the cluster depends on configuration, we print only summary information +-- of the locks in segments. If a relation is locked only on one segment, +-- 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 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 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 + +-- 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 + + +-- +-- pg_ctl: +-- datadir: data directory of process to target with `pg_ctl` +-- command: commands valid for `pg_ctl` +-- command_mode: modes valid for `pg_ctl -m` +-- +create or replace function pg_ctl(datadir text, command text, command_mode text default 'immediate') returns text as $$ class PgCtlError(Exception): def __init__(self, errmsg): self.errmsg = errmsg def __str__(self): return repr(self.errmsg) +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 + +-- +-- pg_ctl_start: +-- +-- Start a specific greenplum segment +-- +-- intentionally separate from pg_ctl() because it needs more information +-- +-- 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 + +-- +-- restart_primary_segments_containing_data_for(table_name text): +-- table_name: the table containing data whose segment that needs a restart +-- +-- 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 + +-- +-- clean_restart_primary_segments_containing_data_for(table_name text): +-- table_name: the table containing data whose segment that needs a restart +-- +-- 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 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 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 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 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_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_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 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 + +-- +-- pg_basebackup: +-- host: host of the gpdb segment to back up +-- port: port of the gpdb segment to back up +-- slotname: desired slot name to create and associate with backup +-- datadir: destination data directory of the backup +-- forceoverwrite: overwrite the destination directory if it exists already +-- xlog_method: (stream/fetch) how to obtain XLOG segment files from source +-- +-- usage: `select pg_basebackup('somehost', 12345, 'some_slot_name', '/some/destination/data/directory')` +-- +create or replace function pg_basebackup(host text, dbid int, port bigint, create_slot boolean, slotname text, datadir text, force_overwrite boolean, xlog_method text) returns text as $$ import subprocess import os cmd = 'pg_basebackup --no-sync --checkpoint=fast -h %s -p %d -R -D %s --target-gp-dbid %d' % (host, port, datadir, dbid) +if create_slot: cmd += ' --create-slot' +if slotname is not None: cmd += ' --slot %s' % (slotname) +if force_overwrite: cmd += ' --force-overwrite' +if xlog_method == 'stream': cmd += ' --wal-method stream' elif xlog_method == 'fetch': cmd += ' --wal-method fetch' else: plpy.error('invalid xlog method') +# GPDB_12_MERGE_FIXME: avoid checking checksum for heap tables # till we code logic to skip/verify checksum for # appendoptimized tables. Enabling this results in basebackup # failures with appendoptimized tables. 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: " + str(e.output) +return results $$ language plpython3u; +CREATE + +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 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 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 + +-- 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 + diff --git a/src/test/singlenode_isolation2/expected/setup_memory_accounting.out b/src/test/singlenode_isolation2/expected/setup_memory_accounting.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_isolation2/expected/setup_startup_memory_accounting.out b/src/test/singlenode_isolation2/expected/setup_startup_memory_accounting.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_isolation2/expected/standby_replay_dtx_info.out b/src/test/singlenode_isolation2/expected/standby_replay_dtx_info.out new file mode 100644 index 00000000000..3d8cfc26dd9 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/standby_replay_dtx_info.out @@ -0,0 +1,96 @@ +-- Test if standby will overflow shmNumCommittedGxacts + +-- This case test if shmCommittedGxactArray will be overflowed at the following +-- scenario: When a DTX has flushed FORGET COMMITTED XLOG into disk, +-- but didn't change its own state to DTX_STATE_INSERTED_FORGET_COMMITTED. +-- If at this very moment, checkpoint process is calculating DTX info, it +-- will include the DTX into its XLOG record. + +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 + +select wait_for_standby_replay(1200); + wait_for_standby_replay +------------------------- + t +(1 row) +create table test_dtx_standby_tbl(c1 int); +CREATE + +-- We have just created a checkpoint. The next automatic checkpoint +-- will be triggered only after 5 minutes or after CheckPointSegments +-- wal segments. Neither of that can happen until this test calls +-- explicit checkpoint. +checkpoint; +CHECKPOINT + +1: select gp_inject_fault_infinite('dtm_before_insert_forget_comitted', 'suspend', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1: select gp_inject_fault_infinite('checkpoint_after_redo_calculated', 'suspend', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1&: select gp_wait_until_triggered_fault('dtm_before_insert_forget_comitted', 1, dbid) from gp_segment_configuration where content = -1 and role = 'p'; + +-- record the transaction into checkpoint XLOG and make sure commit forget XLOG is writen +-- before checkpoint XLOG. +2&: insert into test_dtx_standby_tbl select generate_series(1,10); +1<: <... completed> + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +1&: select gp_wait_until_triggered_fault('checkpoint_after_redo_calculated', 1, dbid) from gp_segment_configuration where content = -1 and role = 'p'; +3&: checkpoint; +1<: <... completed> + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +1: select gp_inject_fault_infinite('dtm_before_insert_forget_comitted', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2<: <... completed> +INSERT 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 +-------------------------- + Success: +(1 row) +3<: <... completed> +CHECKPOINT + +-- now the array may have 1 unforggten gid, and we set max_tm_gxacts to 1 +1: select gp_inject_fault_infinite('standby_gxacts_overflow', 'skip', dbid) from gp_segment_configuration where content = -1 and role = 'm'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +-- this DTX might overflow gxacts array +2: insert into test_dtx_standby_tbl select generate_series(11,20); +INSERT 10 + +-- Wait standby to replay all XLOG +select wait_for_standby_replay(1200); + wait_for_standby_replay +------------------------- + t +(1 row) + +select gp_inject_fault_infinite('standby_gxacts_overflow', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'm'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +drop table test_dtx_standby_tbl; +DROP +drop function wait_for_standby_replay(int); +DROP diff --git a/src/test/singlenode_isolation2/expected/starve_case.out b/src/test/singlenode_isolation2/expected/starve_case.out new file mode 100644 index 00000000000..51b9db4051d --- /dev/null +++ b/src/test/singlenode_isolation2/expected/starve_case.out @@ -0,0 +1,160 @@ +-- +-- Test to ensure that reader processes do not cause starvation of +-- processes already waiting on a lock. Readers must wait on a lock +-- if their writer does not already hold the lock and the requested +-- lockmode conflicts with existing waiter's lockmode (waitMask +-- conflict). +-- + +create table starve (c int); +CREATE +create table starve_helper (name varchar, sessionid int); +CREATE + +-- 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 +-- cannot understand its definition. That way, AccessShareLock is +-- requested during execution of the function. If the lock is acquired +-- during plan generation of the calling SQL statement, the +-- 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 + +-- 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 + +-- Hold access shared lock, so that session2 must wait. +1: begin; +BEGIN +1: select * from starve; + c +--- +(0 rows) + +2: insert into starve_helper select 'session2', setting::int from pg_settings where name = 'gp_session_id'; +INSERT 1 +-- Wait on access exclusive lock. +2: begin; +BEGIN +2>: alter table starve rename column c to d; + +select wait_until_locks_awaited('session2'); + wait_until_locks_awaited +-------------------------- + t +(1 row) + +3: insert into starve_helper select 'session3', setting::int from pg_settings where name = 'gp_session_id'; +INSERT 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 +-- lock on starve table. So the reader must wait. +3: begin; +BEGIN +3>: select * from starve_helper, function_starve_volatile(5); + +select wait_until_locks_awaited('session3'); + wait_until_locks_awaited +-------------------------- + t +(1 row) + +-- Check the lock table, expect both session2 and session3 to wait. +-- expect: 2 rows with AccessExclusiveLock and AccessSharedLock +select mode from pg_locks where granted=false and relation='starve'::regclass and gp_segment_id=-1; + mode +--------------------- + AccessShareLock + AccessExclusiveLock +(2 rows) + +-- Let everyone move forward. +1: commit; +COMMIT + +-- session2 is granted the lock on starve table first. +2<: <... completed> +ALTER +2: select mode from pg_locks where granted=false and relation='starve'::regclass and gp_segment_id=-1; + mode +----------------- + AccessShareLock +(1 row) +2: commit; +COMMIT + +-- session3 is granted the lock after session2 commits. We should +-- see error column 'c' doesn't exist because session2 renamed it. +3<: <... completed> +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 + + +-- +-- Test to ensure that writers do not starve processes already waiting +-- on a lock in case of waitMask conflict. +-- +truncate table starve_helper; +TRUNCATE + +-- Hold access shared lock, so that session2 must wait. +1: begin; +BEGIN +1: select * from starve; + d +--- +(0 rows) + +2: insert into starve_helper select 'session2', setting::int from pg_settings where name = 'gp_session_id'; +INSERT 1 +-- Wait on access exclusive lock. +2: begin; +BEGIN +2>: alter table starve add column e int default 0; + +select wait_until_locks_awaited('session2'); + wait_until_locks_awaited +-------------------------- + t +(1 row) + +3: insert into starve_helper select 'session3', setting::int from pg_settings where name = 'gp_session_id'; +INSERT 1 +3: begin; +BEGIN +-- Wait on RowExclusiveLock on table starve because session2 is +-- waiting on the same lock with a conflicting lockmode. +3>: insert into starve values (1), (2); + +select wait_until_locks_awaited('session3'); + wait_until_locks_awaited +-------------------------- + t +(1 row) + +1: commit; +COMMIT +-- Session2 must go first. +2<: <... completed> +ALTER +-- 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 +------------------ + RowExclusiveLock +(1 row) +2: commit; +COMMIT + +-- Session3 gets the lock only after session2 commits. +3<: <... completed> +INSERT 2 +3: commit; +COMMIT diff --git a/src/test/singlenode_isolation2/expected/sync_guc.out b/src/test/singlenode_isolation2/expected/sync_guc.out new file mode 100644 index 00000000000..b0d042fc8e6 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/sync_guc.out @@ -0,0 +1,155 @@ +-- TEST 1: Fix Github issue https://github.com/greenplum-db/gpdb/issues/9208 +1: create schema sync_np1; +CREATE +1: create schema sync_np2; +CREATE +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 +1q: ... +-- The SET command will create a Gang on the primaries, and the GUC +-- values should be the same on all QD/QEs. +2: show search_path; + search_path +----------------- + "$user", public +(1 row) +2: set search_path = 'sync_np1,sync_np2'; +SET + +-- The `reset_val` of `search_path` should be synchronized from the QD, +-- so, the GUC value will be also synchronized with the QD after RESET. +-- If the search_path is inconsistent between the QD and QEs after RESET, +-- creating the function will fail. +2: reset search_path; +RESET +2: select public.segment_setting('search_path'); + segment_setting +----------------- + "$user", public + "$user", public + "$user", public +(3 rows) +2: create or replace function sync_f1() returns int as $$ select 1234; $$language sql; +CREATE +2: select sync_f1(); + sync_f1 +--------- + 1234 +(1 row) +2: drop function sync_f1(); +DROP +2: drop schema sync_np1; +DROP +2: drop schema sync_np2; +DROP +2q: ... + +-- TEST 2: Fix Github issue https://github.com/greenplum-db/gpdb/issues/685 +-- `gp_select_invisible` is default to false. SET command will dispatch +-- the GUC's `reset_val` and changed value to the created Gang. If the QE(s) +-- use the incorrect `reset_val`, its value will be inconsistent with the QD's, +-- i.e. the `gp_select_invisible` is still false on the QEs. +3: show gp_select_invisible; + gp_select_invisible +--------------------- + off +(1 row) +3: set gp_select_invisible = on; +SET +3: reset gp_select_invisible; +RESET +3: select public.segment_setting('gp_select_invisible'); + segment_setting +----------------- + off + off + off +(3 rows) +3: create table sync_t1(i int); +CREATE +3: insert into sync_t1 select i from generate_series(1,10)i; +INSERT 10 +3: delete from sync_t1; +DELETE 10 +3: select * from sync_t1; + i +--- +(0 rows) +3: drop table sync_t1; +DROP +3q: ... + +1: drop function public.segment_setting(guc text); +DROP +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 +4: create temp table sync_t12(a int, b int) distributed by(a); +CREATE + +-- 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 +-- We'll test SET/RESET xxx will be called for all QEs in the current session. +4: select relname from sync_t11, sync_t12, pg_class; + relname +--------- +(0 rows) + +4: select gp_inject_fault('set_variable_fault', 'skip', dbid) from gp_segment_configuration where role='p'; + gp_inject_fault +----------------- + Success: + Success: + Success: + Success: +(4 rows) +4: set statement_mem = '12MB'; +SET +4: select gp_wait_until_triggered_fault('set_variable_fault', 2, dbid) from gp_segment_configuration where role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: + Success: + Success: + Success: +(4 rows) +4: select gp_inject_fault('set_variable_fault', 'reset', dbid) from gp_segment_configuration where role='p'; + gp_inject_fault +----------------- + Success: + Success: + Success: + Success: +(4 rows) + +4: select gp_inject_fault('reset_variable_fault', 'skip', dbid) from gp_segment_configuration where role='p'; + gp_inject_fault +----------------- + Success: + Success: + Success: + Success: +(4 rows) +4: reset statement_mem; +RESET +4: select gp_wait_until_triggered_fault('reset_variable_fault', 2, dbid) from gp_segment_configuration where role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: + Success: + Success: + Success: +(4 rows) +4: select gp_inject_fault('reset_variable_fault', 'reset', dbid) from gp_segment_configuration where role='p'; + gp_inject_fault +----------------- + Success: + Success: + Success: + Success: +(4 rows) +4q: ... + diff --git a/src/test/singlenode_isolation2/expected/terminate_in_gang_creation.out b/src/test/singlenode_isolation2/expected/terminate_in_gang_creation.out new file mode 100644 index 00000000000..a45558c9439 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/terminate_in_gang_creation.out @@ -0,0 +1,170 @@ +-- start_matchsubs +-- m/seg[0-9] [0-9.]+:\d+/ +-- s/seg[0-9] [0-9.]+:\d+/segN IP:PORT/ +-- m/lock \[\d+,\d+\]/ +-- s/lock \[\d+,\d+\]// +-- m/DETAIL: .* FATAL: reader could not find writer proc entry/ +-- s/DETAIL: .* FATAL: reader could not find writer proc entry/DETAIL: FATAL: reader could not find writer proc entry/ +-- end_matchsubs + +-- skip dtx recovery check to avoid hitting the fault create_gang_in_progress. +SELECT gp_inject_fault_infinite('before_orphaned_check', 'skip', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +ALTER SYSTEM SET gp_dtx_recovery_interval to 5; +ALTER +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) +SELECT gp_wait_until_triggered_fault('before_orphaned_check', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- SIGSEGV issue when freeing gangs +-- +-- When SIGTERM is handled during gang creation we used to trigger +-- a wild pointer access like below backtrace: +-- +-- #0 raise +-- #1 StandardHandlerForSigillSigsegvSigbus_OnMainThread +-- #2 +-- #3 MemoryContextFreeImpl +-- #4 cdbconn_termSegmentDescriptor +-- #5 DisconnectAndDestroyGang +-- #6 freeGangsForPortal +-- #7 AbortTransaction +-- ... +-- #14 ProcessInterrupts +-- #15 createGang_async +-- #16 createGang +-- #17 AllocateWriterGang + +DROP TABLE IF EXISTS foo; +DROP +CREATE TABLE foo (c1 int, c2 int) DISTRIBUTED BY (c1); +CREATE + +10: BEGIN; +BEGIN + +SELECT gp_inject_fault('create_gang_in_progress', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('create_gang_in_progress', 'suspend', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +10&: SELECT * FROM foo a JOIN foo b USING (c2); + +SELECT gp_wait_until_triggered_fault('create_gang_in_progress', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE query = 'SELECT * FROM foo a JOIN foo b USING (c2);'; + pg_terminate_backend +---------------------- + t +(1 row) + +SELECT gp_inject_fault('create_gang_in_progress', 'resume', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +10<: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +10q: ... + +DROP TABLE foo; +DROP + +-- 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 +-- error like this: +-- +-- ERROR: failed to acquire resources on one or more segments +-- 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. +-- (seg2 127.0.0.1:7004) +-- +-- This is ok since the writer gang is gone, but previously QD code does +-- not reset all gangs (just retry creating the new reader gang) so re-running +-- this query could always fail with the same error since the reader gang would +-- always fail to create. The below test is used to test the fix. + +-- skip FTS probes to avoid segment being marked down on restart +SELECT gp_inject_fault_infinite('fts_probe', 'skip', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +-- Prevent below pg_ctl restart timeout although the timeout should be enough. +CHECKPOINT; +CHECKPOINT + +-- not recycle idle QEs to avoid the flaky test where restarting primary takes a long time. +11: SET gp_vmem_idle_resource_timeout TO 0; +SET +11: CREATE TABLE foo (c1 int, c2 int) DISTRIBUTED BY (c1); +CREATE +-- ORCA optimizes value scan so there is no additional reader gang in below INSERT. +11: SET optimizer = off; +SET +-- the value scan (reader gang) might be on any segment so restart all segments. +SELECT pg_ctl(datadir, 'restart', 'immediate') FROM gp_segment_configuration WHERE role='p' AND content != -1; + pg_ctl +-------- + OK + OK + OK +(3 rows) +11: INSERT INTO foo values(2),(1); +ERROR: failed to acquire resources on one or more segments +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 +11: DROP TABLE foo; +DROP +11: RESET gp_vmem_idle_resource_timeout; +RESET + +SELECT gp_inject_fault('fts_probe', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault_infinite('before_orphaned_check', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +2: ALTER SYSTEM RESET gp_dtx_recovery_interval; +ALTER +2: SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) diff --git a/src/test/singlenode_isolation2/expected/truncate_after_ao_vacuum_skip_drop.out b/src/test/singlenode_isolation2/expected/truncate_after_ao_vacuum_skip_drop.out new file mode 100644 index 00000000000..3ca27f0390d --- /dev/null +++ b/src/test/singlenode_isolation2/expected/truncate_after_ao_vacuum_skip_drop.out @@ -0,0 +1,56 @@ +-- Ensure segfiles in AOSEG_STATE_AWAITING_DROP are not leaked in +-- AppendOnlyHash after doing a TRUNCATE. + +CREATE TABLE truncate_after_ao_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true); +CREATE +INSERT INTO truncate_after_ao_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; +INSERT 10 + +DELETE FROM truncate_after_ao_vacuum_skip_drop; +DELETE 10 + +-- We should see all aosegs in state 1 +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); + segno | state +-------+------- + 1 | 1 +(1 row) + +-- VACUUM while another session holds lock +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM truncate_after_ao_vacuum_skip_drop; + count +------- + 0 +(1 row) +2: VACUUM truncate_after_ao_vacuum_skip_drop; +VACUUM +1: END; +END + +-- 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'); + segno | state +-------+------- + 1 | 2 + 2 | 1 +(2 rows) + +-- The AO relation should be rewritten and AppendOnlyHash entry invalidated +1: TRUNCATE truncate_after_ao_vacuum_skip_drop; +TRUNCATE +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); + segno | state +-------+------- +(0 rows) + +-- 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 +0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); + segno | ?column? | state +-------+----------+------- + 1 | t | 1 +(1 row) diff --git a/src/test/singlenode_isolation2/expected/uao/.gitignore b/src/test/singlenode_isolation2/expected/uao/.gitignore new file mode 100644 index 00000000000..f47cb2045f1 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/uao/.gitignore @@ -0,0 +1 @@ +*.out diff --git a/src/test/singlenode_isolation2/expected/uao/README b/src/test/singlenode_isolation2/expected/uao/README new file mode 100644 index 00000000000..6d2cade1965 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/uao/README @@ -0,0 +1,2 @@ +This directory only contains generated files. +All files in this directory are ignored by .gitignore. diff --git a/src/test/singlenode_isolation2/expected/uao_crash_compaction_column.out b/src/test/singlenode_isolation2/expected/uao_crash_compaction_column.out new file mode 100644 index 00000000000..22d455582f7 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/uao_crash_compaction_column.out @@ -0,0 +1,511 @@ +-- start_matchsubs +-- +-- # create a match/subs expression +-- +-- m/ERROR:.*server closed the connection unexpectedly/ +-- s/ERROR:.*server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/gm +-- end_matchsubs + +3: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 +(8 rows) +-- +-- Test to validate crash at different points in AO/CO vacuum. +-- +-- Setup tables to test crash at different points +-- for crash_before_cleanup_phase +3:set default_table_access_method = ao_column; +SET +3:show default_table_access_method; + default_table_access_method +----------------------------- + ao_column +(1 row) +3:DROP TABLE IF EXISTS crash_before_cleanup_phase CASCADE; +DROP +3:CREATE TABLE crash_before_cleanup_phase (a INT, b INT, c CHAR(20)); +CREATE +3:CREATE INDEX crash_before_cleanup_phase_index ON crash_before_cleanup_phase(b); +CREATE +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 +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 +3:CREATE TABLE crash_vacuum_in_appendonly_insert (a INT, b INT, c CHAR(20)); +CREATE +3:CREATE INDEX crash_vacuum_in_appendonly_insert_index ON crash_vacuum_in_appendonly_insert(b); +CREATE +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 +3:UPDATE crash_vacuum_in_appendonly_insert SET b = 2; +UPDATE 10 + +-- inject panic fault. +3:SELECT gp_inject_fault('appendonly_insert', 'panic', '', '', 'crash_vacuum_in_appendonly_insert', 1, -1, 0, 2); + gp_inject_fault +----------------- + Success: +(1 row) + +-- VACUUM on crash_before_cleanup_phase will end up skipping the drop +-- phase after not being able to acquire AccessExclusiveLock because +-- we make session 3 hold AccessShareLock. This results in segment +-- file 1 remaining in drop pending state which results in segment +-- file 1 not being scheduled for any new inserts. +3:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'suspend', '', '', 'crash_before_cleanup_phase', 1, -1, 0, 2); + gp_inject_fault +----------------- + Success: +(1 row) +3:BEGIN; +BEGIN +3:SELECT count(*) FROM crash_before_cleanup_phase; + count +------- + 7 +(1 row) +1&:VACUUM crash_before_cleanup_phase; +3:SELECT gp_wait_until_triggered_fault('compaction_before_cleanup_phase', 1, 2); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +3:END; +END + +-- 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 +-- crash_recovery +3:VACUUM crash_vacuum_in_appendonly_insert; +ERROR: fault triggered, fault name:'appendonly_insert' fault type:'panic' (seg0 127.0.0.1:25432 pid=21988) +1<: <... completed> +ERROR: Error on receive from seg0 127.0.0.1:7002 pid=18463: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- wait for segment to complete recovering +0U: SELECT 1; + ?column? +---------- + 1 +(1 row) +0Uq: ... + +-- reset faults as protection incase tests failed and panic didn't happen +1:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +1:SELECT gp_inject_fault('appendonly_insert', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) + +-- perform post crash validation checks +-- for crash_before_cleanup_phase +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_before_cleanup_phase'); + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 1 | 2 | 2 + 1 | 0 | 1 | 4 | 1 | 1 + 1 | 0 | 1 | 5 | 2 | 2 + 1 | 1 | 129 | 1 | 2 | 2 + 1 | 1 | 129 | 4 | 1 | 1 + 1 | 1 | 129 | 5 | 2 | 2 + 1 | 2 | 257 | 1 | 2 | 2 + 1 | 2 | 257 | 4 | 1 | 1 + 1 | 2 | 257 | 5 | 2 | 2 + 2 | 0 | 2 | 0 | 0 | 1 + 2 | 0 | 2 | 3 | 0 | 1 + 2 | 1 | 130 | 0 | 0 | 1 + 2 | 1 | 130 | 3 | 0 | 1 + 2 | 2 | 258 | 0 | 0 | 1 + 2 | 2 | 258 | 3 | 0 | 1 +(15 rows) +1:INSERT INTO crash_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); +INSERT 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; + a | b | c +----+----+---------------------- + 1 | 1 | c + 4 | 1 | hello world + 5 | 1 | hello world + 6 | 1 | hello world + 7 | 1 | hello world + 8 | 1 | hello world + 9 | 1 | hello world + 10 | 1 | hello world + 25 | 16 | c +(9 rows) +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_before_cleanup_phase'); + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 1 | 2 | 2 + 1 | 0 | 1 | 5 | 2 | 2 + 1 | 0 | 1 | 6 | 3 | 1 + 1 | 1 | 129 | 1 | 2 | 2 + 1 | 1 | 129 | 5 | 2 | 2 + 1 | 1 | 129 | 6 | 3 | 1 + 1 | 2 | 257 | 1 | 2 | 2 + 1 | 2 | 257 | 5 | 2 | 2 + 1 | 2 | 257 | 6 | 3 | 1 + 2 | 0 | 2 | 1 | 1 | 1 + 2 | 0 | 2 | 3 | 0 | 1 + 2 | 1 | 130 | 1 | 1 | 1 + 2 | 1 | 130 | 3 | 0 | 1 + 2 | 2 | 258 | 1 | 1 | 1 + 2 | 2 | 258 | 3 | 0 | 1 +(15 rows) +-- This VACUUM removes the previous drop pending state for segment file 1 which +-- will make it available for future inserts. +1:VACUUM crash_before_cleanup_phase; +VACUUM +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_before_cleanup_phase'); + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 0 | 2 | 1 + 1 | 0 | 1 | 0 | 2 | 1 + 1 | 0 | 1 | 0 | 3 | 1 + 1 | 1 | 129 | 0 | 2 | 1 + 1 | 1 | 129 | 0 | 2 | 1 + 1 | 1 | 129 | 0 | 3 | 1 + 1 | 2 | 257 | 0 | 2 | 1 + 1 | 2 | 257 | 0 | 2 | 1 + 1 | 2 | 257 | 0 | 3 | 1 + 2 | 0 | 2 | 1 | 1 | 1 + 2 | 0 | 2 | 3 | 0 | 1 + 2 | 0 | 2 | 5 | 0 | 1 + 2 | 1 | 130 | 1 | 1 | 1 + 2 | 1 | 130 | 3 | 0 | 1 + 2 | 1 | 130 | 5 | 0 | 1 + 2 | 2 | 258 | 1 | 1 | 1 + 2 | 2 | 258 | 3 | 0 | 1 + 2 | 2 | 258 | 5 | 0 | 1 +(18 rows) +1:INSERT INTO crash_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); +INSERT 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; + a | b | c +----+----+---------------------- + 1 | 1 | c + 4 | 1 | hello world + 5 | 1 | hello world + 6 | 1 | hello world + 7 | 1 | hello world + 8 | 1 | hello world + 9 | 1 | hello world + 10 | 1 | hello world + 21 | 1 | c + 25 | 16 | c + 26 | 11 | c +(11 rows) +-- crash_vacuum_in_appendonly_insert +-- verify the old segment files are still visible after the vacuum is aborted. +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_vacuum_in_appendonly_insert') where segno = 1; + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 10 | 2 | 1 + 1 | 0 | 1 | 2 | 2 | 1 + 1 | 0 | 1 | 8 | 2 | 1 + 1 | 1 | 129 | 10 | 2 | 1 + 1 | 1 | 129 | 2 | 2 | 1 + 1 | 1 | 129 | 8 | 2 | 1 + 1 | 2 | 257 | 10 | 2 | 1 + 1 | 2 | 257 | 2 | 2 | 1 + 1 | 2 | 257 | 8 | 2 | 1 +(9 rows) +-- verify the new segment files contain no tuples. +1:SELECT sum(tupcount) FROM gp_toolkit.__gp_aocsseg('crash_vacuum_in_appendonly_insert') where segno = 2; + sum +----- + 0 +(1 row) +1:VACUUM crash_vacuum_in_appendonly_insert; +VACUUM +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_vacuum_in_appendonly_insert'); + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 0 | 2 | 1 + 1 | 0 | 1 | 0 | 2 | 1 + 1 | 0 | 1 | 0 | 2 | 1 + 1 | 1 | 129 | 0 | 2 | 1 + 1 | 1 | 129 | 0 | 2 | 1 + 1 | 1 | 129 | 0 | 2 | 1 + 1 | 2 | 257 | 0 | 2 | 1 + 1 | 2 | 257 | 0 | 2 | 1 + 1 | 2 | 257 | 0 | 2 | 1 + 2 | 0 | 2 | 1 | 0 | 1 + 2 | 0 | 2 | 4 | 0 | 1 + 2 | 0 | 2 | 5 | 0 | 1 + 2 | 1 | 130 | 1 | 0 | 1 + 2 | 1 | 130 | 4 | 0 | 1 + 2 | 1 | 130 | 5 | 0 | 1 + 2 | 2 | 258 | 1 | 0 | 1 + 2 | 2 | 258 | 4 | 0 | 1 + 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 +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; + a | b | c +----+----+---------------------- + 1 | 2 | hello world + 2 | 2 | hello world + 3 | 2 | hello world + 4 | 2 | hello world + 5 | 2 | hello world + 6 | 2 | hello world + 7 | 2 | hello world + 8 | 2 | hello world + 9 | 2 | hello world + 10 | 2 | hello world + 21 | 1 | c + 26 | 11 | c +(12 rows) + +-- +-- Setup tables to test crash at different points on master now +-- +-- for crash_master_before_cleanup_phase +2:set default_table_access_method = ao_column; +SET +2:show default_table_access_method; + default_table_access_method +----------------------------- + 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; +DELETE 3 + +-- inject panic fault +2:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'panic', '', '', 'crash_master_before_cleanup_phase', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +2:VACUUM crash_master_before_cleanup_phase; +PANIC: fault triggered, fault name:'compaction_before_cleanup_phase' fault type:'panic' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- reset faults as protection incase tests failed and panic didn't happen +4:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- perform post crash validation checks +-- for crash_master_before_cleanup_phase +4:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_master_before_cleanup_phase'); + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 1 | 2 | 2 + 1 | 0 | 1 | 4 | 1 | 1 + 1 | 0 | 1 | 5 | 2 | 2 + 1 | 1 | 129 | 1 | 2 | 2 + 1 | 1 | 129 | 4 | 1 | 1 + 1 | 1 | 129 | 5 | 2 | 2 + 1 | 2 | 257 | 1 | 2 | 2 + 1 | 2 | 257 | 4 | 1 | 1 + 1 | 2 | 257 | 5 | 2 | 2 + 2 | 0 | 2 | 0 | 0 | 1 + 2 | 0 | 2 | 3 | 0 | 1 + 2 | 1 | 130 | 0 | 0 | 1 + 2 | 1 | 130 | 3 | 0 | 1 + 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; +UPDATE 1 +4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; + a | b | c +----+----+---------------------- + 1 | 1 | c + 4 | 1 | hello world + 5 | 1 | hello world + 6 | 1 | hello world + 7 | 1 | hello world + 8 | 1 | hello world + 9 | 1 | hello world + 10 | 1 | hello world + 25 | 16 | c +(9 rows) +4:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_master_before_cleanup_phase'); + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 1 | 2 | 2 + 1 | 0 | 1 | 5 | 2 | 2 + 1 | 0 | 1 | 6 | 3 | 1 + 1 | 1 | 129 | 1 | 2 | 2 + 1 | 1 | 129 | 5 | 2 | 2 + 1 | 1 | 129 | 6 | 3 | 1 + 1 | 2 | 257 | 1 | 2 | 2 + 1 | 2 | 257 | 5 | 2 | 2 + 1 | 2 | 257 | 6 | 3 | 1 + 2 | 0 | 2 | 1 | 1 | 1 + 2 | 0 | 2 | 3 | 0 | 1 + 2 | 1 | 130 | 1 | 1 | 1 + 2 | 1 | 130 | 3 | 0 | 1 + 2 | 2 | 258 | 1 | 1 | 1 + 2 | 2 | 258 | 3 | 0 | 1 +(15 rows) +4:VACUUM crash_master_before_cleanup_phase; +VACUUM +4:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_master_before_cleanup_phase'); + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 0 | 2 | 1 + 1 | 0 | 1 | 0 | 2 | 1 + 1 | 0 | 1 | 0 | 3 | 1 + 1 | 1 | 129 | 0 | 2 | 1 + 1 | 1 | 129 | 0 | 2 | 1 + 1 | 1 | 129 | 0 | 3 | 1 + 1 | 2 | 257 | 0 | 2 | 1 + 1 | 2 | 257 | 0 | 2 | 1 + 1 | 2 | 257 | 0 | 3 | 1 + 2 | 0 | 2 | 1 | 1 | 1 + 2 | 0 | 2 | 3 | 0 | 1 + 2 | 0 | 2 | 5 | 0 | 1 + 2 | 1 | 130 | 1 | 1 | 1 + 2 | 1 | 130 | 3 | 0 | 1 + 2 | 1 | 130 | 5 | 0 | 1 + 2 | 2 | 258 | 1 | 1 | 1 + 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; +UPDATE 1 +4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; + a | b | c +----+----+---------------------- + 1 | 1 | c + 4 | 1 | hello world + 5 | 1 | hello world + 6 | 1 | hello world + 7 | 1 | hello world + 8 | 1 | hello world + 9 | 1 | hello world + 10 | 1 | hello world + 21 | 1 | c + 25 | 16 | c + 26 | 11 | c +(11 rows) + +-- Scenario for validating mirror replays fine and doesn't crash on +-- truncate record replay even if file is missing. +-- skip FTS probes to avoid marking primary status down. +4:SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +4:SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +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 +-- 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 +------- + 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 +4:UPDATE crash_vacuum_in_appendonly_insert_1 SET b = 2; +UPDATE 10 +4:SELECT gp_inject_fault('xlog_ao_insert', 'infinite_loop', 2); + gp_inject_fault +----------------- + Success: +(1 row) +-- This will cause file to be created on primary for segno 2 but crash +-- just before creating the xlog record. Hence, primary will have the +-- file but not mirror. +4&:VACUUM crash_vacuum_in_appendonly_insert_1; +5:SELECT gp_wait_until_triggered_fault('xlog_ao_insert', 1, 2); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- to make sure xlog gets flushed till this point to persist the +-- changes to pg_aocsseg. +5:CHECKPOINT; +CHECKPOINT +-- Restart the primary to interrupt vacuum at that exact point. +5:select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=0), 'restart'); + pg_ctl +-------- + OK +(1 row) +4<: <... completed> +ERROR: Error on receive from seg0 127.0.0.1:7002 pid=29553: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- Shows entries for new files added to pg_aocsseg table. These are +-- the entries next vacuum command will use to perform truncate. +0U:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_vacuum_in_appendonly_insert_1'); + segno | column_num | physical_segno | tupcount | modcount | state +-------+------------+----------------+----------+----------+------- + 1 | 0 | 1 | 10 | 2 | 1 + 1 | 1 | 129 | 10 | 2 | 1 + 1 | 2 | 257 | 10 | 2 | 1 + 2 | 0 | 2 | 0 | 0 | 1 + 2 | 1 | 130 | 0 | 0 | 1 + 2 | 2 | 258 | 0 | 0 | 1 +(6 rows) +-- generates truncate xlog record for all the files having entry in +-- pg_aocsseg table. +6:VACUUM crash_vacuum_in_appendonly_insert_1; +VACUUM +-- Make sure mirror is able to successfully replay all the truncate +-- records generated and doesn't encounter the "WAL contains +-- references to invalid pages" PANIC. +6:SELECT * from wait_for_replication_replay(0, 5000); + wait_for_replication_replay +----------------------------- + t +(1 row) +6:SELECT gp_inject_fault('fts_probe', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/uao_crash_compaction_row.out b/src/test/singlenode_isolation2/expected/uao_crash_compaction_row.out new file mode 100644 index 00000000000..5dd3bc113f0 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/uao_crash_compaction_row.out @@ -0,0 +1,339 @@ +-- start_matchsubs +-- +-- # create a match/subs expression +-- +-- m/ERROR:.*server closed the connection unexpectedly/ +-- s/ERROR:.*server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/gm +-- end_matchsubs +3: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 +(8 rows) +-- +-- Test to validate crash at different points in AO/CO vacuum. +-- +-- Setup tables to test crash at different points +-- for crash_before_cleanup_phase +3:set default_table_access_method = ao_row; +SET +3:show default_table_access_method; + default_table_access_method +----------------------------- + ao_row +(1 row) +3:DROP TABLE IF EXISTS crash_before_cleanup_phase CASCADE; +DROP +3:CREATE TABLE crash_before_cleanup_phase (a INT, b INT, c CHAR(20)); +CREATE +3:CREATE INDEX crash_before_cleanup_phase_index ON crash_before_cleanup_phase(b); +CREATE +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 +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 +3:CREATE TABLE crash_vacuum_in_appendonly_insert (a INT, b INT, c CHAR(20)); +CREATE +3:CREATE INDEX crash_vacuum_in_appendonly_insert_index ON crash_vacuum_in_appendonly_insert(b); +CREATE +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 +3:UPDATE crash_vacuum_in_appendonly_insert SET b = 2; +UPDATE 10 + +-- suspend at intended points. +3:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'suspend', '', '', 'crash_before_cleanup_phase', 1, -1, 0, 2); + gp_inject_fault +----------------- + Success: +(1 row) +1&:VACUUM crash_before_cleanup_phase; +3:SELECT gp_wait_until_triggered_fault('compaction_before_cleanup_phase', 1, 2); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- 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 +-- crash_recovery +3:SELECT gp_inject_fault('appendonly_insert', 'panic', '', '', 'crash_vacuum_in_appendonly_insert', 1, -1, 0, 2); + gp_inject_fault +----------------- + Success: +(1 row) +3:VACUUM crash_vacuum_in_appendonly_insert; +ERROR: fault triggered, fault name:'appendonly_insert' fault type:'panic' (seg0 127.0.0.1:25432 pid=21369) +1<: <... completed> +ERROR: Error on receive from seg0 127.0.0.1:7002 pid=15584: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- wait for segment to complete recovering +0U: SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- reset faults as protection incase tests failed and panic didn't happen +1:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +1:SELECT gp_inject_fault('appendonly_insert', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) + +-- perform post crash validation checks +-- for crash_before_cleanup_phase +-- the compaction should be done, but the post-cleanup should not be performed, +-- so awaiting-dropping segment file should exists in the pg_aoseg* catalog on +-- seg0, however, the status on the seg1 is undetermined, any concurrent trans +-- will delay the dropping of dead segment files. +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_before_cleanup_phase') where segment_id = 0; + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 248 | 5 | 1 | 248 | 2 | 3 | 2 + 0 | 2 | 160 | 3 | 1 | 160 | 0 | 3 | 1 +(2 rows) +-- do vacuum again, there should be no await-dropping segment files, no concurrent +-- transactions exist this time when the VACUUM is performed. +1:VACUUM crash_before_cleanup_phase; +VACUUM +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_before_cleanup_phase'); + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 0 | 2 | 160 | 3 | 1 | 160 | 0 | 3 | 1 + 1 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 1 | 2 | 0 | 0 | 0 | 0 | 0 | 3 | 1 + 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 +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; + a | b | c +----+----+---------------------- + 1 | 1 | c + 4 | 1 | hello world + 5 | 1 | hello world + 6 | 1 | hello world + 7 | 1 | hello world + 8 | 1 | hello world + 9 | 1 | hello world + 10 | 1 | hello world + 25 | 16 | c +(9 rows) +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_before_cleanup_phase'); + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 0 | 2 | 160 | 3 | 1 | 160 | 0 | 3 | 1 + 1 | 1 | 64 | 1 | 1 | 64 | 3 | 3 | 1 + 1 | 2 | 0 | 0 | 0 | 0 | 0 | 3 | 1 + 2 | 1 | 328 | 6 | 3 | 328 | 3 | 3 | 1 +(5 rows) +1:VACUUM crash_before_cleanup_phase; +VACUUM +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_before_cleanup_phase'); + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 0 | 2 | 160 | 3 | 1 | 160 | 0 | 3 | 1 + 1 | 1 | 64 | 1 | 1 | 64 | 3 | 3 | 1 + 1 | 2 | 0 | 0 | 0 | 0 | 0 | 3 | 1 + 2 | 1 | 0 | 0 | 0 | 0 | 3 | 3 | 1 + 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 +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; + a | b | c +----+----+---------------------- + 1 | 1 | c + 4 | 1 | hello world + 5 | 1 | hello world + 6 | 1 | hello world + 7 | 1 | hello world + 8 | 1 | hello world + 9 | 1 | hello world + 10 | 1 | hello world + 21 | 1 | c + 25 | 16 | c + 26 | 11 | c +(11 rows) +-- crash_vacuum_in_appendonly_insert +-- verify the old segment files are still visible after the vacuum is aborted. +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_vacuum_in_appendonly_insert') where segno = 1; + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 496 | 10 | 2 | 496 | 2 | 3 | 1 + 1 | 1 | 128 | 2 | 2 | 128 | 2 | 3 | 1 + 2 | 1 | 400 | 8 | 2 | 400 | 2 | 3 | 1 +(3 rows) +-- verify the new segment files contain no tuples. +1:SELECT sum(tupcount) FROM gp_toolkit.__gp_aoseg('crash_vacuum_in_appendonly_insert') where segno = 2; + sum +----- + 0 +(1 row) +1:VACUUM crash_vacuum_in_appendonly_insert; +VACUUM +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_vacuum_in_appendonly_insert'); + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 0 | 2 | 248 | 5 | 1 | 248 | 0 | 3 | 1 + 1 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 1 | 2 | 64 | 1 | 1 | 64 | 0 | 3 | 1 + 2 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 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 +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; + a | b | c +----+----+---------------------- + 1 | 2 | hello world + 2 | 2 | hello world + 3 | 2 | hello world + 4 | 2 | hello world + 5 | 2 | hello world + 6 | 2 | hello world + 7 | 2 | hello world + 8 | 2 | hello world + 9 | 2 | hello world + 10 | 2 | hello world + 21 | 1 | c + 26 | 11 | c +(12 rows) + +-- +-- Setup tables to test crash at different points on master now +-- +-- for crash_master_before_cleanup_phase +2:set default_table_access_method = ao_row; +SET +2:show default_table_access_method; + default_table_access_method +----------------------------- + 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; +DELETE 3 + +-- suspend at intended points +2:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'panic', '', '', 'crash_master_before_cleanup_phase', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +2:VACUUM crash_master_before_cleanup_phase; +PANIC: fault triggered, fault name:'compaction_before_cleanup_phase' fault type:'panic' +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +-- reset faults as protection incase tests failed and panic didn't happen +4:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- perform post crash validation checks +-- for crash_master_before_cleanup_phase +4:SELECT * FROM gp_toolkit.__gp_aoseg('crash_master_before_cleanup_phase'); + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 248 | 5 | 1 | 248 | 2 | 3 | 2 + 0 | 2 | 160 | 3 | 1 | 160 | 0 | 3 | 1 + 1 | 1 | 64 | 1 | 1 | 64 | 2 | 3 | 2 + 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; +UPDATE 1 +4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; + a | b | c +----+----+---------------------- + 1 | 1 | c + 4 | 1 | hello world + 5 | 1 | hello world + 6 | 1 | hello world + 7 | 1 | hello world + 8 | 1 | hello world + 9 | 1 | hello world + 10 | 1 | hello world + 25 | 16 | c +(9 rows) +4:SELECT * FROM gp_toolkit.__gp_aoseg('crash_master_before_cleanup_phase'); + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 248 | 5 | 1 | 248 | 2 | 3 | 2 + 0 | 2 | 160 | 3 | 1 | 160 | 0 | 3 | 1 + 1 | 1 | 64 | 1 | 1 | 64 | 2 | 3 | 2 + 1 | 2 | 64 | 1 | 1 | 64 | 1 | 3 | 1 + 2 | 1 | 328 | 6 | 3 | 328 | 3 | 3 | 1 +(5 rows) +4:VACUUM crash_master_before_cleanup_phase; +VACUUM +4:SELECT * FROM gp_toolkit.__gp_aoseg('crash_master_before_cleanup_phase'); + segment_id | segno | eof | tupcount | varblockcount | eof_uncompressed | modcount | formatversion | state +------------+-------+-----+----------+---------------+------------------+----------+---------------+------- + 0 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 0 | 2 | 160 | 3 | 1 | 160 | 0 | 3 | 1 + 1 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 1 + 1 | 2 | 64 | 1 | 1 | 64 | 1 | 3 | 1 + 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; +UPDATE 1 +4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; + a | b | c +----+----+---------------------- + 1 | 1 | c + 4 | 1 | hello world + 5 | 1 | hello world + 6 | 1 | hello world + 7 | 1 | hello world + 8 | 1 | hello world + 9 | 1 | hello world + 10 | 1 | hello world + 21 | 1 | c + 25 | 16 | c + 26 | 11 | c +(11 rows) diff --git a/src/test/singlenode_isolation2/expected/udf_exception_blocks_panic_scenarios.out b/src/test/singlenode_isolation2/expected/udf_exception_blocks_panic_scenarios.out new file mode 100644 index 00000000000..84b84a3ae8d --- /dev/null +++ b/src/test/singlenode_isolation2/expected/udf_exception_blocks_panic_scenarios.out @@ -0,0 +1,242 @@ +-- Tests exception handling of GPDB PL/PgSQL UDF +-- It exercises: +-- 1. PROTOCOL or SQL type of dtm_action_target +-- 2. Various levels of sub-transactions +-- 3. dtm_action_protocol(PROTOCOL): subtransaction_begin, subtransaction_rollback or subtransaction_release +-- 4. dtm_action: fail_begin_command, fail_end_command or panic_begin_comand +-- +-- debug_dtm_action: Using this can specify what action to be +-- triggered/simulated and at what point like error / panic / delay +-- and at start or end command after receiving by the segment. + +-- debug_dtm_action_segment: Using this can specify segment number to +-- trigger the specified dtm_action. + +-- debug_dtm_action_target: Allows to set target for specified +-- dtm_action should it be DTM protocol command or SQL command from +-- master to segment. + +-- debug_dtm_action_protocol: Allows to specify sub-type of DTM +-- protocol for which to perform specified dtm_action (like prepare, +-- abort_no_prepared, commit_prepared, abort_prepared, +-- subtransaction_begin, subtransaction_release, +-- subtransaction_rollback, etc... +-- +-- debug_dtm_action_sql_command_tag: If debug_dtm_action_target is sql +-- then this parameter can be used to set the type of sql that should +-- trigger the exeception. Ex: 'MPPEXEC UPDATE' + +-- debug_dtm_action_nestinglevel: This allows to optional specify at +-- which specific depth level in transaction to take the specified +-- dtm_action. This apples only to target with protocol and not SQL. +-- +-- +-- start_matchsubs +-- s/\s+\(.*\.[ch]:\d+\)/ (SOMEFILE:SOMEFUNC)/ +-- m/ / +-- m/transaction \d+/ +-- s/transaction \d+/transaction / +-- m/transaction -\d+/ +-- s/transaction -\d+/transaction/ +-- end_matchsubs + +-- skip FTS probes always +SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT gp_request_fts_probe_scan(); + 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 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 +(8 rows) +SET debug_dtm_action_segment=0; +SET +SET debug_dtm_action_target=protocol; +SET +SET debug_dtm_action_protocol=subtransaction_begin; +SET +SET debug_dtm_action=panic_begin_command; +SET +SET debug_dtm_action_nestinglevel=0; +SET +DROP TABLE IF EXISTS employees; +DROP +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 +-- make sure segment recovery is complete after panic. +0U: select 1; + ?column? +---------- + 1 +(1 row) +0Uq: ... +select * from employees; +ERROR: relation "employees" does not exist +LINE 1: select * from employees; + ^ +-- +-- +SET debug_dtm_action_segment=0; +SET +SET debug_dtm_action_target=protocol; +SET +SET debug_dtm_action_protocol=subtransaction_release; +SET +SET debug_dtm_action=panic_begin_command; +SET +SET debug_dtm_action_nestinglevel=0; +SET +DROP TABLE IF EXISTS employees; +DROP +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 +-- make sure segment recovery is complete after panic. +0U: select 1; + ?column? +---------- + 1 +(1 row) +0Uq: ... +select * from employees; +ERROR: relation "employees" does not exist +LINE 1: select * from employees; + ^ +-- +-- +SET debug_dtm_action_segment=0; +SET +SET debug_dtm_action_target=protocol; +SET +SET debug_dtm_action_protocol=subtransaction_release; +SET +SET debug_dtm_action=panic_begin_command; +SET +SET debug_dtm_action_nestinglevel=4; +SET +DROP TABLE IF EXISTS employees; +DROP +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 +-- make sure segment recovery is complete after panic. +0U: select 1; + ?column? +---------- + 1 +(1 row) +0Uq: ... +select * from employees; +ERROR: relation "employees" does not exist +LINE 1: select * from employees; + ^ +-- +-- +SET debug_dtm_action_segment=0; +SET +SET debug_dtm_action_target=protocol; +SET +SET debug_dtm_action_protocol=subtransaction_rollback; +SET +SET debug_dtm_action=panic_begin_command; +SET +SET debug_dtm_action_nestinglevel=3; +SET +DROP TABLE IF EXISTS employees; +DROP +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 +-- make sure segment recovery is complete after panic. +0U: select 1; + ?column? +---------- + 1 +(1 row) +0Uq: ... +select * from employees; +ERROR: relation "employees" does not exist +LINE 1: select * from employees; + ^ +-- +-- +SET debug_dtm_action_segment=0; +SET +SET debug_dtm_action_target=protocol; +SET +SET debug_dtm_action_protocol=subtransaction_rollback; +SET +SET debug_dtm_action=panic_begin_command; +SET +SET debug_dtm_action_nestinglevel=0; +SET +DROP TABLE IF EXISTS employees; +DROP +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 +-- make sure segment recovery is complete after panic. +0U: select 1; + ?column? +---------- + 1 +(1 row) +0Uq: ... +select * from employees; +ERROR: relation "employees" does not exist +LINE 1: select * from employees; + ^ +-- +-- +SET debug_dtm_action_segment=0; +SET +SET debug_dtm_action_target=protocol; +SET +SET debug_dtm_action_protocol=subtransaction_begin; +SET +SET debug_dtm_action=panic_begin_command; +SET +SET debug_dtm_action_nestinglevel=3; +SET +DROP TABLE IF EXISTS employees; +DROP +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 +-- make sure segment recovery is complete after panic. +0U: select 1; + ?column? +---------- + 1 +(1 row) +0Uq: ... +select * from employees; +ERROR: relation "employees" does not exist +LINE 1: select * from employees; + ^ + +SELECT gp_inject_fault('fts_probe', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/unlogged_appendonly_tables.out b/src/test/singlenode_isolation2/expected/unlogged_appendonly_tables.out new file mode 100644 index 00000000000..9931e64f408 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/unlogged_appendonly_tables.out @@ -0,0 +1,100 @@ +-- expect: create table succeeds +create unlogged table unlogged_appendonly_table_managers ( id int, name text ) with ( appendonly=true ) distributed by (id); +CREATE + +-- skip FTS probes to make the test deterministic. +SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +-- expect: insert/update/select works +insert into unlogged_appendonly_table_managers values (1, 'Joe'); +INSERT 1 +insert into unlogged_appendonly_table_managers values (2, 'Jane'); +INSERT 1 +update unlogged_appendonly_table_managers set name = 'Susan' where id = 2; +UPDATE 1 +select * from unlogged_appendonly_table_managers order by id; + id | name +----+------- + 1 | Joe + 2 | Susan +(2 rows) +select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendonly_table_managers'); + segment_id | segno | tupcount +------------+-------+---------- + 0 | 1 | 2 + 1 | 1 | 1 +(2 rows) + + +-- force an unclean stop and recovery: + +-- expect inserts/updates are truncated after crash recovery +2: select * from unlogged_appendonly_table_managers; + id | name +----+------ +(0 rows) +2: select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendonly_table_managers'); + segment_id | segno | tupcount +------------+-------+---------- +(0 rows) + + +-- expect: insert/update/select works +3: insert into unlogged_appendonly_table_managers values (1, 'Joe'); +INSERT 1 +3: insert into unlogged_appendonly_table_managers values (2, 'Jane'); +INSERT 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; + id | name +----+------- + 1 | Joe + 2 | Susan +(2 rows) +3: select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendonly_table_managers'); + segment_id | segno | tupcount +------------+-------+---------- + 0 | 1 | 2 + 1 | 1 | 1 +(2 rows) + +-- force a clean stop and recovery: + +-- expect: inserts/updates are persisted +4: select * from unlogged_appendonly_table_managers order by id; + id | name +----+------- + 1 | Joe + 2 | Susan +(2 rows) +4: select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendonly_table_managers'); + segment_id | segno | tupcount +------------+-------+---------- + 0 | 1 | 2 + 1 | 1 | 1 +(2 rows) + +-- expect: drop table succeeds +5: drop table unlogged_appendonly_table_managers; +DROP + +SELECT gp_inject_fault('fts_probe', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/unlogged_heap_tables.out b/src/test/singlenode_isolation2/expected/unlogged_heap_tables.out new file mode 100644 index 00000000000..eda1f72310e --- /dev/null +++ b/src/test/singlenode_isolation2/expected/unlogged_heap_tables.out @@ -0,0 +1,78 @@ +-- expect: create table succeeds +create unlogged table unlogged_heap_table_managers ( id int, name text ) distributed by (id); +CREATE + +-- skip FTS probes to make the test deterministic. +SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +SELECT gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +-- expect: insert/update/select works +insert into unlogged_heap_table_managers values (1, 'Joe'); +INSERT 1 +insert into unlogged_heap_table_managers values (2, 'Jane'); +INSERT 1 +update unlogged_heap_table_managers set name = 'Susan' where id = 2; +UPDATE 1 +select * from unlogged_heap_table_managers order by id; + id | name +----+------- + 1 | Joe + 2 | Susan +(2 rows) + + +-- force an unclean stop and recovery: + +-- expect inserts/updates are truncated after crash recovery +2: select * from unlogged_heap_table_managers; + id | name +----+------ +(0 rows) + + +-- expect: insert/update/select works +3: insert into unlogged_heap_table_managers values (1, 'Joe'); +INSERT 1 +3: insert into unlogged_heap_table_managers values (2, 'Jane'); +INSERT 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; + id | name +----+------- + 1 | Joe + 2 | Susan +(2 rows) + +-- force a clean stop and recovery: + +-- expect: inserts/updates are persisted +4: select * from unlogged_heap_table_managers order by id; + id | name +----+------- + 1 | Joe + 2 | Susan +(2 rows) + +-- expect: drop table succeeds +5: drop table unlogged_heap_table_managers; +DROP + +SELECT gp_inject_fault('fts_probe', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) diff --git a/src/test/singlenode_isolation2/expected/update_hash_col_utilitymode.out b/src/test/singlenode_isolation2/expected/update_hash_col_utilitymode.out new file mode 100644 index 00000000000..74cb7d728a2 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/update_hash_col_utilitymode.out @@ -0,0 +1,13 @@ +create table t_update_hash_col_utilitymode(c int, d int) distributed by (c); +CREATE + +-- This works. +1U: update t_update_hash_col_utilitymode set d = d + 1; +UPDATE 0 + +-- But this throws an error. +1U: update t_update_hash_col_utilitymode set c = c + 1; +ERROR: cannot update distribution key columns in utility mode + +drop table t_update_hash_col_utilitymode; +DROP diff --git a/src/test/singlenode_isolation2/expected/upgrade_numsegments.out b/src/test/singlenode_isolation2/expected/upgrade_numsegments.out new file mode 100644 index 00000000000..965a0468143 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/upgrade_numsegments.out @@ -0,0 +1,24 @@ +-- This test case is used to test if we can get the correct +-- numsegments when the connection is in utility mode. +-- With introducing the numsegments in gp_distribution_policy +-- pg_upgrade can not run correctly because it is run in +-- utility mode and the numsegments can not get correctly in +-- utility mode, now we support to get the numsegments in +-- utility mode when the connection is running for pg_upgrade. +-- We can sure that CREATE TABLE command will try to get +-- numsegments in utility mode, so we use it to test the +-- function. +-1U: create temp table t1(c1 int, c2 int); +CREATE +0U: create temp table t1(c1 int, c2 int); +CREATE +1U: create temp table t1(c1 int, c2 int); +CREATE +2U: create temp table t1(c1 int, c2 int); +CREATE +-- start_ignore +-1Uq: ... +0Uq: ... +1Uq: ... +2Uq: ... +-- end_ignore diff --git a/src/test/singlenode_isolation2/expected/vacuum_after_vacuum_skip_drop_column.out b/src/test/singlenode_isolation2/expected/vacuum_after_vacuum_skip_drop_column.out new file mode 100644 index 00000000000..c39460d99dd --- /dev/null +++ b/src/test/singlenode_isolation2/expected/vacuum_after_vacuum_skip_drop_column.out @@ -0,0 +1,65 @@ +-- @Description Ensures next vacuum drops segfiles in AOSEG_STATE_AWAITING_DROP +-- left over by a previous vacuum +-- +CREATE TABLE aoco_vacuum_after_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true, orientation=column); +CREATE +INSERT INTO aoco_vacuum_after_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; +INSERT 10 + +DELETE FROM aoco_vacuum_after_vacuum_skip_drop; +DELETE 10 + +-- We should see all aocssegs in state 1 +0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_vacuum_after_vacuum_skip_drop'); + segno | column_num | state +-------+------------+------- + 1 | 0 | 1 + 1 | 1 | 1 +(2 rows) + +-- VACUUM while another session holds lock +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM aoco_vacuum_after_vacuum_skip_drop; + count +------- + 0 +(1 row) +2: VACUUM aoco_vacuum_after_vacuum_skip_drop; +VACUUM +1: END; +END + +-- 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'); + segno | column_num | state +-------+------------+------- + 1 | 0 | 2 + 1 | 1 | 2 + 2 | 0 | 1 + 2 | 1 | 1 +(4 rows) + +-- The VACUUM should clean up aocssegs in state 2 (AOSEG_STATE_AWAITING_DROP) +1: VACUUM aoco_vacuum_after_vacuum_skip_drop; +VACUUM +0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_vacuum_after_vacuum_skip_drop'); + segno | column_num | state +-------+------------+------- + 1 | 0 | 1 + 1 | 1 | 1 + 2 | 0 | 1 + 2 | 1 | 1 +(4 rows) + +-- 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 +0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aocsseg('aoco_vacuum_after_vacuum_skip_drop'); + segno | ?column? | state +-------+----------+------- + 1 | t | 1 + 1 | t | 1 + 2 | f | 1 + 2 | f | 1 +(4 rows) diff --git a/src/test/singlenode_isolation2/expected/vacuum_full_interrupt.out b/src/test/singlenode_isolation2/expected/vacuum_full_interrupt.out new file mode 100644 index 00000000000..b2d7a396ba5 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/vacuum_full_interrupt.out @@ -0,0 +1,88 @@ +-- Test the scenario when the VACUUM FULL is interrupted on segment after +-- 'swap_relation_files' is finished. + +-- There was a bug that swap_relation_files inplace update the old entry in the +-- pg_class and the pg_class entry has incorrect relfrozenxid after the +-- transaction is aborted. + +1: CREATE TABLE vacuum_full_interrupt(a int, b int, c int); +CREATE +1: CREATE INDEX vacuum_full_interrupt_idx on vacuum_full_interrupt(b); +CREATE +1: INSERT INTO vacuum_full_interrupt SELECT i, i, i from generate_series(1,100)i; +INSERT 100 +1: ANALYZE vacuum_full_interrupt; +ANALYZE +-- the relfrozenxid is the same as xmin when there's concurrent transactions. +-- the reltuples is 100 +1: SELECT xmin=relfrozenxid relfrozenxid_not_changed, relhasindex, reltuples FROM pg_class WHERE relname='vacuum_full_interrupt'; + relfrozenxid_not_changed | relhasindex | reltuples +--------------------------+-------------+----------- + t | t | 100 +(1 row) + +-- break on QE after 'swap_relation_files' is finished +1: SELECT gp_inject_fault('after_swap_relation_files', 'suspend', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +2&: VACUUM FULL vacuum_full_interrupt; +1: SELECT gp_wait_until_triggered_fault('after_swap_relation_files', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- cancel VACUUM FULL +1: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query = 'VACUUM FULL vacuum_full_interrupt;'; + pg_cancel_backend +------------------- + t +(1 row) +1: SELECT gp_inject_fault('after_swap_relation_files', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +2<: <... completed> +ERROR: canceling statement due to user request + +-- the relfrozenxid should stay unchanged +-- the reltuples should be 100, but QD has already commit the transaction and the reltuples is updated to 0, this looks like a bug +2: SELECT xmin=relfrozenxid relfrozenxid_not_changed, relhasindex, reltuples FROM pg_class WHERE relname='vacuum_full_interrupt'; + relfrozenxid_not_changed | relhasindex | reltuples +--------------------------+-------------+----------- + t | t | 0 +(1 row) +0U: SELECT xmin=relfrozenxid relfrozenxid_not_changed, relhasindex, reltuples FROM pg_class WHERE relname='vacuum_full_interrupt'; + relfrozenxid_not_changed | relhasindex | reltuples +--------------------------+-------------+----------- + t | t | 38 +(1 row) + +-- 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 +2: SET optimizer=off; +SET +2: SET enable_seqscan=off; +SET +2: SET enable_bitmapscan=off; +SET +2: SET enable_indexscan=on; +SET +2: EXPLAIN SELECT * FROM vacuum_full_interrupt WHERE b=2; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) (cost=0.14..12.18 rows=2 width=12) + -> Index Scan using vacuum_full_interrupt_idx on vacuum_full_interrupt (cost=0.14..12.14 rows=1 width=12) + Index Cond: (b = 2) + Optimizer: Postgres query optimizer +(4 rows) +2: SELECT * FROM vacuum_full_interrupt WHERE b=2; + a | b | c +---+---+--- + 2 | 2 | 2 + 2 | 2 | 2 +(2 rows) diff --git a/src/test/singlenode_isolation2/expected/vacuum_full_recently_dead_tuple_due_to_distributed_snapshot.out b/src/test/singlenode_isolation2/expected/vacuum_full_recently_dead_tuple_due_to_distributed_snapshot.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_isolation2/expected/vacuum_recently_dead_tuple_due_to_distributed_snapshot.out b/src/test/singlenode_isolation2/expected/vacuum_recently_dead_tuple_due_to_distributed_snapshot.out new file mode 100644 index 00000000000..7a9a981ba06 --- /dev/null +++ b/src/test/singlenode_isolation2/expected/vacuum_recently_dead_tuple_due_to_distributed_snapshot.out @@ -0,0 +1,52 @@ +-- Test that VACUUM in utility mode doesn't remove tuples that are still +-- 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 + +insert into test_recently_dead_utility select g from generate_series(1, 100) g; +INSERT 100 + +-- A function that: +-- +-- 1. Establishes a snapshot, without launching any QE backends. It does this +-- by selecting from pg_database. +-- 2. Sleeps 10 seconds +-- 3. runs "select count(*) from test_recently_dead_utility" +-- +-- It would've been more clear to use a transaction block, "BEGIN; ... COMMIT" +-- for these steps. However, BEGIN immediately starts connections to the QE +-- nodes, and we don't want to acquire local snapshots in the QE nodes, until +-- step 3. Instead, run these steps in a function that's marked as STABLE. +-- (A VOLATILE function would acquire a different snapshot for each command +-- in the function, but we want it all to run with a single snapshot.) +-- +-- (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 + +-- In one session, launch afunc(). +1&: select afunc(); + +-- Meanwhile, delete some rows from foo. These rows should still be visible to +-- afunc(). (But first sleep a bit to make sure afunc() has established a +-- snapshot before the delete.) +2: select pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: delete from test_recently_dead_utility; +DELETE 100 + +-- Run VACUUM in utility mode. It should *not* remove the deleted tuples yet. +0U: vacuum verbose test_recently_dead_utility; +VACUUM + +-- Continue afunc(). It should see all the rows in the table, ie. 100 rows. +1<: <... completed> + afunc +------- + 100 +(1 row) diff --git a/src/test/singlenode_isolation2/global_sh_executor.sh b/src/test/singlenode_isolation2/global_sh_executor.sh new file mode 100644 index 00000000000..b408e41c8f9 --- /dev/null +++ b/src/test/singlenode_isolation2/global_sh_executor.sh @@ -0,0 +1,231 @@ +#!/bin/bash + +set -eo pipefail +# Set env var ${NL} because "\n" can not be converted to new line for unknown escaping reason +export NL=" +" + +# Retrieve cell content from $RAW_STR according to the row and column numbers, +# and set it to the given variable name. +# Arg 1 (output): Variable name. +# Arg 2 (input): Row number. +# Arg 3 (input): Column number. +# Example: +# 1: @post_run 'get_cell USER_NAME 1 2': SELECT id,name,state FROM users; +# Assume 'SELECT id,name,state FROM users;' returns: +# | id | name | state | +# |----+-------+--------| +# | 1 | Jonh | Alive | +# | 2 | Alice | Dead | +# by calling `get_cell USER_NAME 1 2' will set $USER_NAME to 'Jonh'. +get_tuple_cell() { + var_name=$1 + row=$2 + col=$3 + cmd="echo \"\$RAW_STR\" | awk -F '|' 'NR==(($row+2)) {print \$$col}' | awk '{\$1=\$1;print}'" + output=`eval $cmd` + eval $var_name="$output" +} + +# Generate $MATCHSUBS and echo the $RAWSTR based on the given original string and replacement pairs. +# Arg 1n (input): The original string to be replaced. +# Arg 2n (input): The replacement string. +# Example: +# 1: @post_run 'genereate_match_sub $USER_NAME user1 $USER_ID id1': SELECT id,name,state FROM users; +# here we assume $USER_NAME and $USER_ID has been set to 'Jonh' and '1' already. Then the above +# statement will generate $MATCHSUBS section: +# m/\bJonh\b/ +# s/\bJonh\b/user1/ +# \b here is for matching the whole word. (word boundaries) +create_match_sub() { + to_replace="" + for var in "$@" + do + if [ -z "$to_replace" ] + then + to_replace=$var + else + # \b is trying to match the whole word to make it more stable. + export MATCHSUBS="${MATCHSUBS}${NL}m/\\b${to_replace}\\b/${NL}s/\\b${to_replace}\\b/${var}/${NL}" + to_replace="" + fi + done + echo "${RAW_STR}" +} + +# Generate $MATCHSUBS and Trim the Tailing spaces. +# This is similar to create_match_sub() but dealing with the tailing spaces. +# Sometimes we have variable length cells, like userid: +# | username | userid | gender | +# |----------+--------+--------| +# | john | 12 | male | +# we need to match the 12 with a var $USERID which has been set by get_call(). +# The output source will be something like: +# | username | userid | gender | +# |----------+--------+--------| +# | john | userid1 | male | +# to match it: match_sub userid1 $USERID +# but the problem here is the userid may change for different test executions. If we +# get a 3 digits userid like '123', the diff will fail since we have one more space than +# the actual sql output. +# To deal with it, use match_sub_tt userid $USERID +# And make the output source like (note: append one space to the replaced string): +# | username | userid | gender | +# |----------+---------+--------| +# | john | userid1 | male | +# Notice here that there is no space following userid1 since we replace the whole userid with +# its tailing spaces with 'userid1'. Like '123 ' -> 'userid'. +create_match_sub_with_spaces() { + to_replace="" + for var in "$@" + do + if [ -z "$to_replace" ] + then + to_replace=$var + else + # \b is trying to match the whole word to make it more stable. + export MATCHSUBS="${MATCHSUBS}${NL}m/\\b${to_replace}\\b/${NL}s/\\b${to_replace} */${var} /${NL}" + to_replace="" + fi + done + echo "${RAW_STR}" +} + +# Substitute in the $RAW_STR and echo the result. +# Multi substitution pairs can be passed as arguments, like: +# sub "to_replace_1" "replacement_1" "to_replace_2" "replacement_2" +# This could be useful for both @pre_run and @post_run. e.g.: +# @pre_run 'sub @TOKEN1 ${TOKEN1}': SELECT state FROM GP_ENDPOINTS_STATUS_INFO() WHERE token='@TOKEN1'; +# Assume the $TOKEN has value '01234', The SQL will become: +# SELECT state FROM GP_ENDPOINTS_STATUS_INFO() WHERE token='01234'; +create_sub() { + to_replace="" + for var in "$@" + do + if [ -z "$to_replace" ] + then + to_replace=$var + else + RAW_STR=$(echo "$RAW_STR" | sed -E "s/${to_replace}/${var}/g") + to_replace="" + fi + done + echo "${RAW_STR}" +} + +# Parse the endpoint state info output and save them into environment variables for @post_run. +# Usage: parse_endpoint_info +# Output(environment variables): +# "TOKEN$postfix" +# "ENDPOINT_NAME$postfix[]" +# "ENDPOINT_TOKEN$postfix[]" +# "ENDPOINT_HOST$postfix[]" +# "ENDPOINT_PORT$postfix[]" +# e.g.: +# For the given SQL result: +# endpointname | token | hostname | port | state +# ----------------------+----------------------------------+-------------+-------+-------- +# c1_00001507_00000000 | 071500004015dc6da471b20417afed65 | host_1111 | 25432 | READY +# c1_00001507_00000001 | 071500004015dc6da471b20417afed65 | host_1112 | 25433 | READY +# c1_00001507_00000002 | 071500004015dc6da471b20417afed65 | host_1113 | 25434 | READY +# (3 rows) +# parse_endpoint_info 1 1 2 3 4 will setup below variables: +# TOEKN1='071500004015dc6da471b20417afed65' +# ENDPOINT_NAME1[0]='c1_00001507_00000000' +# ENDPOINT_TOKEN1[0]='071500004015dc6da471b20417afed65' +# ENDPOINT_HOST1[0]='host_1111' +# ENDPOINT_PORT1[0]='25432' +# ENDPOINT_NAME1[1]='c1_00001507_00000001' +# ENDPOINT_TOKEN1[1]='071500004015dc6da471b20417afed65' +# ENDPOINT_HOST1[1]='host_1112' +# ENDPOINT_PORT1[1]='25433' +# ENDPOINT_NAME1[2]='c1_00001507_00000002' +# ENDPOINT_TOKEN1[2]='071500004015dc6da471b20417afed65' +# ENDPOINT_HOST1[2]='host_1113' +# ENDPOINT_PORT1[2]='25434' +parse_endpoint_info() { + local postfix=$1 + local endpoint_name_col=$2 + local token_col=$3 + local host_col=$4 + local port_col=$5 + export CURRENT_ENDPOINT_POSTFIX="${postfix}" + + eval "ENDPOINT_NAME${postfix}=()" + eval "ENDPOINT_TOKEN${postfix}=()" + eval "ENDPOINT_HOST${postfix}=()" + eval "ENDPOINT_PORT${postfix}=()" + while IFS= read -r line ; do + local name="" + name="$(echo "${line}" | awk -F '|' "{print \$${endpoint_name_col}}" | awk '{$1=$1;print}')" + local token="" + token="$(echo "${line}" | awk -F '|' "{print \$${token_col}}" | awk '{$1=$1;print}')" + local host="" + host="$(echo "${line}" | awk -F '|' "{print \$${host_col}}" | awk '{$1=$1;print}' )" + local port="" + port="$(echo "${line}" | awk -F '|' "{print \$${port_col}}" | awk '{$1=$1;print}' )" + eval "ENDPOINT_NAME${postfix}+=(${name})" + eval "ENDPOINT_TOKEN${postfix}+=(${token})" + eval "ENDPOINT_HOST${postfix}+=(${host})" + eval "ENDPOINT_PORT${postfix}+=(${port})" + + eval "TOKEN${postfix}=${token}" + export RETRIEVE_TOKEN=${token} + + create_match_sub_with_spaces "${name}" "endpoint_id${postfix}" \ + "${port}" port_id \ + "${token}" token_id \ + "${host}" host_id > /dev/null + + # Filter out the first two lines and the last line. + done <<<"$(echo "$RAW_STR" | sed '1,2d;$d')" + # Ignore first 2 lines(table header) since hostname length may affect the diff result. + echo "${RAW_STR}" | sed '1,2d' +} + +# Find the corresponding endpoint in the environment variables saved by previous +# parse_endpoint call, and substitute in the SQL. Used by @pre_run. +# The finding process relies on the $GP_HOSTNAME and $GP_PORT to be set to the +# current postgres connection. +# Usage: set_endpoint_variable +# e.g.: +# set_endpoint_variable "@ENDPOINT1" +# This will replace "@ENDPOINT1" in the SQL statement with the corresponding endpoint name +# with postfix "1". +set_endpoint_variable() { + export CURRENT_ENDPOINT_POSTFIX="" + CURRENT_ENDPOINT_POSTFIX="$(echo "$1" | sed 's/@ENDPOINT//')" + eval "local names=(\${ENDPOINT_NAME${CURRENT_ENDPOINT_POSTFIX}[@]})" + eval "local hosts=(\"\${ENDPOINT_HOST${CURRENT_ENDPOINT_POSTFIX}[@]}\")" + eval "ports=(\${ENDPOINT_PORT${CURRENT_ENDPOINT_POSTFIX}[@]})" + local i=0 + for h in "${hosts[@]}" ; do + if [ "$GP_HOSTNAME" = "$h" ] ; then + if [ "$GP_PORT" = "${ports[$i]}" ] ; then + create_sub "$1" "${names[$i]}" + return + fi + fi + i=$((i+1)) + done + # echo "Cannot find endpoint for postfix '$CURRENT_ENDPOINT_POSTFIX', '$GP_HOSTNAME', '$GP_PORT'." + echo $RAW_STR +} + +# Return the retrieve token based on the $CURRENT_ENDPOINT_POSTFIX, $GP_HOSTNAME and $GP_PORT +get_retrieve_token() { + eval "local tokens=(\${ENDPOINT_TOKEN${CURRENT_ENDPOINT_POSTFIX}[@]})" + eval "local hosts=(\"\${ENDPOINT_HOST${CURRENT_ENDPOINT_POSTFIX}[@]}\")" + eval "ports=(\${ENDPOINT_PORT${CURRENT_ENDPOINT_POSTFIX}[@]})" + local i=0 + for h in "${hosts[@]}" ; do + if [ "$GP_HOSTNAME" = "$h" ] ; then + if [ "$GP_PORT" = "${ports[$i]}" ] ; then + echo "${tokens[$i]}" + return + fi + fi + i=$((i+1)) + done + echo "Can not find the token." +} diff --git a/src/test/singlenode_isolation2/init_file_isolation2 b/src/test/singlenode_isolation2/init_file_isolation2 new file mode 100644 index 00000000000..4b0ad2a8db7 --- /dev/null +++ b/src/test/singlenode_isolation2/init_file_isolation2 @@ -0,0 +1,62 @@ +-- start_matchsubs +# entry db matches +m/\s+\(entry db(.*)+\spid=\d+\)/ +s/\s+\(entry db(.*)+\spid=\d+\)// + +# remove beginning output of gpconfig +m/^\d+.*gpconfig.*-\[INFO\]:-/ +s/^\d+.*gpconfig.*-\[INFO\]:-// + +# line number in error message +m/\(cdbgang_async\.c\:\d+\)/ +s/\(cdbgang_async\.c:\d+\)/\(cdbgang_async\.c:LINE_NUM\)/ + +# ignore OID and file/line number diffs for invalid toast indexes +m/^ERROR: no valid index found for toast relation/ +s/with Oid \d+ \(.*\)/with Oid OID/ + +# messages from local deadlock detector +# ERROR: deadlock detected (seg1 127.0.1.1:25433 pid=29851) +# DETAIL: Process 29851 waits for ShareLock on transaction 1009; blocked by process 29968. +# Process 29968 waits for ShareLock on transaction 1008; blocked by process 29851. + +m/^ERROR: FTS detected connection lost during dispatch to/ +s/seg\d+ [0-9.]+:\d+ pid=\d+/SEG IP:PORT pid=PID/ + +m/^ERROR: deadlock detected (seg\d+ [0-9.]+:\d+ pid=\d+)/ +s/seg\d+ [0-9.]+:\d+ pid=\d+/SEG IP:PORT pid=PID/ + +# (slice1 172.17.0.2:25432 pid=23848) +m/(slice\d+ [0-9.]+:\d+ pid=\d+)/ +s/(slice\d+ [0-9.]+:\d+ pid=\d+)// + +# (172.17.0.2:25432 pid=23848) +m/([0-9.]+:\d+ pid=\d+)/ +s/([0-9.]+:\d+ pid=\d+)// + +# requested 26376 bytes + +m/requested \d+ bytes/ +s/requested \d+ bytes// + +m/^DETAIL: Process \d+ waits for ShareLock on transaction \d+; blocked by process \d+./ +s/^DETAIL: Process \d+ waits for ShareLock on transaction \d+; blocked by process \d+./DETAIL: Process PID waits for ShareLock on transaction XID; blocked by process PID./ + +# For resource queue deadlock +m/.*Process \d+ waits for ExclusiveLock on resource queue \d+; blocked by process \d+./ +s/.*Process \d+ waits for ExclusiveLock on resource queue \d+; blocked by process \d+./Process PID waits for ExclusiveLock on resource queue OID; blocked by process PID./ + +m/^Process \d+ waits for ShareLock on transaction \d+; blocked by process \d+./ +s/^Process \d+ waits for ShareLock on transaction \d+; blocked by process \d+./Process PID waits for ShareLock on transaction XID; blocked by process PID./ + +# For resource queue deadlock +m/^Process \d+ waits for ShareUpdateExclusiveLock on relation \d+ of database \d+; blocked by process \d+./ +s/^Process \d+ waits for ShareUpdateExclusiveLock on relation \d+ of database \d+; blocked by process \d+./Process PID waits for ShareUpdateExclusiveLock on relation OID of database OID; blocked by process PID./ + +m/available \d+ MB/ +s/available \d+ MB// + +m/\(cdbdisp_async\.c\:\d+\)/ +s/\(cdbdisp_async\.c:\d+\)/\(cdbdisp_async\.c:LINE_NUM\)/ + +-- end_matchsubs diff --git a/src/test/singlenode_isolation2/init_file_parallel_retrieve_cursor b/src/test/singlenode_isolation2/init_file_parallel_retrieve_cursor new file mode 100644 index 00000000000..e5db0ff2989 --- /dev/null +++ b/src/test/singlenode_isolation2/init_file_parallel_retrieve_cursor @@ -0,0 +1,18 @@ +-- start_matchsubs + +m/^ERROR: .* (seg\d+ [0-9.]+:\d+ pid=\d+)/ +s/seg\d+ [0-9.]+:\d+ pid=\d+/SEG IP:PORT pid=PID/ + +# skip specific PID in: ERROR: end point token_id3 already attached by receiver(pid: 50938) +m/^ERROR:.*\(pid: \d+\)/ +s/\(pid: \d+\)/\(pid: PID\)/ + +m/\(cdbendpointretrieve\.c\:\d+\)/ +s/\(cdbendpointretrieve\.c:\d+\)/\(cdbendpointretrieve\.c:LINE_NUM\)/ + +m/retrieve> connection to server at .* port \d+ failed: FATAL: retrieve auth token is invalid/ +s/retrieve> connection to server at .* port \d+ failed: FATAL: retrieve auth token is invalid/retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid/ + +m/retrieve> connection to server at .*, port \d+ failed: FATAL: Authentication failure \(Wrong password or no endpoint for the user\)/ +s/retrieve> connection to server at .*, port \d+ failed: FATAL: Authentication failure \(Wrong password or no endpoint for the user\)/retrieve> connection to server at "host_id", port port_id failed: FATAL: Authentication failure \(Wrong password or no endpoint for the user\)/ +-- end_matchsubs diff --git a/src/test/singlenode_isolation2/init_file_resgroup b/src/test/singlenode_isolation2/init_file_resgroup new file mode 100644 index 00000000000..eedba8901cc --- /dev/null +++ b/src/test/singlenode_isolation2/init_file_resgroup @@ -0,0 +1,18 @@ +-- start_matchignore +m/^CONTEXT: SQL function ".+" statement \d+$/ +m/^ERROR: Canceling query because of high VMEM .+/ +-- end_matchignore + +-- start_matchsubs +m/^[0-9:]+\sgpconfig:[^:]+:/ +s/^[0-9:]+\sgpconfig:[^:]+:[^-]*-\[/TIMESTAMP gpconfig:SEGMENT:USER-[/ + +m/\[\S+:cgroup is not properly configured:/ +s/\[\S+:cgroup is not properly configured:/\[SEGMENT:cgroup is not properly configured:/ + +m/^ERROR: Out of memory (seg\d slice\d \d+.\d+.\d+.\d+:\d+ pid=\d+)$/ +s/(seg\d+ slice\d+ \d+.\d+.\d+.\d+:\d+ pid=\d+)/(SEG SLICE ADDR:PORT pid=PID)/ + +m/^ERROR: role with Oid \d+ was dropped$/ +s/Oid \d+ was/Oid OID was/ +-- end_matchsubs diff --git a/src/test/singlenode_isolation2/input/ao_upgrade.source b/src/test/singlenode_isolation2/input/ao_upgrade.source new file mode 100644 index 00000000000..7c4ab8535a8 --- /dev/null +++ b/src/test/singlenode_isolation2/input/ao_upgrade.source @@ -0,0 +1,86 @@ +-- set_ao_formatversion forces an AO[CO] format to a specific version (the last +-- argument is set to true for a column-oriented table, and false otherwise). +CREATE OR REPLACE FUNCTION set_ao_formatversion(aosegrel oid, version smallint, isaocs bool) + RETURNS bool + AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'setAOFormatVersion' + LANGUAGE C + RETURNS NULL ON NULL INPUT; + +DROP TABLE IF EXISTS ao_upgrade_test; +DROP TABLE IF EXISTS aocs_upgrade_test; +DROP TABLE IF EXISTS aocs_rle_upgrade_test; + +CREATE TABLE ao_upgrade_test (rowid int, n numeric) USING ao_row; +CREATE TABLE aocs_upgrade_test (rowid int, n numeric) USING ao_column; +CREATE TABLE aocs_rle_upgrade_test (rowid int, n numeric) USING ao_column WITH (compresstype=RLE_TYPE); + +-- We want to load GPDB4 numerics into the table; to do that, add a direct cast +-- from bytea to numeric so we can hardcode what the GPDB4 data looked like. +CREATE CAST (bytea AS numeric) WITHOUT FUNCTION; + +INSERT INTO ao_upgrade_test VALUES + (1, '\x000003000c007a0d'::bytea::numeric), -- 12.345 + (2, '\x00000000'::bytea::numeric), -- 0 + (3, '\x000003400c007a0d'::bytea::numeric), -- -12.345 + (4, '\x010000000100'::bytea::numeric), -- 10000 + (5, '\xfeff0500e803'::bytea::numeric), -- 0.00001 + (6, '\xfeff0900e803'::bytea::numeric), -- 0.000010000 + (7, '\x190000000100'::bytea::numeric), -- 1e100 + (8, '\x010000002400400b'::bytea::numeric), -- 9! (362880) + (9, '\x000000c0'::bytea::numeric); -- NaN +INSERT INTO aocs_upgrade_test VALUES + (1, '\x000003000c007a0d'::bytea::numeric), -- 12.345 + (2, '\x00000000'::bytea::numeric), -- 0 + (3, '\x000003400c007a0d'::bytea::numeric), -- -12.345 + (4, '\x010000000100'::bytea::numeric), -- 10000 + (5, '\xfeff0500e803'::bytea::numeric), -- 0.00001 + (6, '\xfeff0900e803'::bytea::numeric), -- 0.000010000 + (7, '\x190000000100'::bytea::numeric), -- 1e100 + (8, '\x010000002400400b'::bytea::numeric), -- 9! (362880) + (9, '\x000000c0'::bytea::numeric); -- NaN + +-- For the RLE test case, insert a bunch of identical numerics so they will be +-- run-length compressed. +INSERT INTO aocs_rle_upgrade_test (SELECT a, '\x010000002400400b'::bytea::numeric FROM generate_series(1, 10) a); + +-- Downgrade to GPDB4 (AO version 2). +--start_ignore +*U: SELECT set_ao_formatversion( + (SELECT segrelid FROM pg_appendonly WHERE relid = 'ao_upgrade_test'::regclass), + 2::smallint, false); +*U: SELECT set_ao_formatversion( + (SELECT segrelid FROM pg_appendonly WHERE relid = 'aocs_upgrade_test'::regclass), + 2::smallint, true); +*U: SELECT set_ao_formatversion( + (SELECT segrelid FROM pg_appendonly WHERE relid = 'aocs_rle_upgrade_test'::regclass), + 2::smallint, true); +--end_ignore + +-- Scan test. The numerics should be fixed again. +SELECT * FROM ao_upgrade_test; +SELECT * FROM aocs_upgrade_test; +SELECT * FROM aocs_rle_upgrade_test; + +-- Fetch test. To force fetches, we'll add bitmap indexes and disable sequential +-- scan. +CREATE INDEX ao_bitmap_index ON ao_upgrade_test USING bitmap(n); +CREATE INDEX aocs_bitmap_index ON aocs_upgrade_test USING bitmap(n); +CREATE INDEX aocs_rle_bitmap_index ON aocs_rle_upgrade_test USING bitmap(n); + +SET enable_seqscan TO off; + +-- Ensure we're using a bitmap scan for our tests. Upgrade note to developers: +-- the only thing that this test needs to verify is that a fetch-based scan is +-- in use. Other diffs are fine. +EXPLAIN SELECT n FROM ao_upgrade_test WHERE n = factorial(9); +EXPLAIN SELECT n FROM aocs_upgrade_test WHERE n = factorial(9); +EXPLAIN SELECT n FROM aocs_rle_upgrade_test WHERE n = factorial(9); + +SELECT n FROM ao_upgrade_test WHERE n = factorial(9); +SELECT n FROM aocs_upgrade_test WHERE n = factorial(9); +SELECT n FROM aocs_rle_upgrade_test WHERE n = factorial(9); + +RESET enable_seqscan; + +DROP CAST (bytea AS numeric); +DROP FUNCTION set_ao_formatversion(oid, smallint, bool); diff --git a/src/test/singlenode_isolation2/input/autovacuum-analyze.source b/src/test/singlenode_isolation2/input/autovacuum-analyze.source new file mode 100644 index 00000000000..b35c3072a85 --- /dev/null +++ b/src/test/singlenode_isolation2/input/autovacuum-analyze.source @@ -0,0 +1,265 @@ +-- Enable auto-ANALYZE only on AUTOVACUUM launcher. When set `autovacuum` to +-- true on Master, the launcher will take care of databases' analyze job on Master. +-- VACUUM anti-XID wraparounds of 'template0' is not changed. + +-- Speed up test. +ALTER SYSTEM SET autovacuum_naptime = 5; +select * from pg_reload_conf(); + +-- +-- Test1, sanity test to make sure auto-analyze works +-- + +-- Analyze all exists relations to prevent autoanalyze on them. +-- These actually don't have too much effort for preventing +-- autoanalyze on other tables, but it could reduce some of tables. +1: ANALYZE; + +-- Prepare the table to be ANALYZEd +1: CREATE TABLE anatest (id bigint); + +-- Track report gpstat on master +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'anatest', 1, -1, 0, 1); +-- Track that we have updated the attributes stats in pg_statistic when finished +SELECT gp_inject_fault('analyze_finished_one_relation', 'skip', '', '', 'anatest', 1, -1, 0, 1); +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'anatest', 1, -1, 0, 1); + +1&: INSERT INTO anatest select i from generate_series(1, 1000) as i; + +-- Wait until report pgstat on master +SELECT gp_wait_until_triggered_fault('gp_pgstat_report_on_master', 1, 1); +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); + +1<: + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + +-- Should have statistic updated. +SELECT count(*) FROM pg_statistic where starelid = 'anatest'::regclass; +select relpages, reltuples from pg_class where oid = 'anatest'::regclass; + + +-- +-- Test2, sanity test to make sure auto-analyze works on partition leaf tables +-- + +-- 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 ); + +-- Track report gpstat on master +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'rankpart_1_prt_extra', 1, -1, 0, 1); +-- Track that we have updated the attributes stats in pg_statistic when finished +SELECT gp_inject_fault('analyze_finished_one_relation', 'skip', '', '', 'rankpart_1_prt_5', 1, -1, 0, 1); +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'rankpart_1_prt_extra', 1, -1, 0, 1); + +-- No data inserted into rankpart_1_prt_6 +1&: insert into rankpart select i, i % 8, i from generate_series(1, 1000)i; + +-- Wait until report pgstat on master +SELECT gp_wait_until_triggered_fault('gp_pgstat_report_on_master', 1, 1); +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); + +1<: + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + +-- Should have statistic updated. +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_extra'::regclass; +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_2'::regclass; +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_3'::regclass; +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_4'::regclass; +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_5'::regclass; +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_6'::regclass; +SELECT count(*) FROM pg_statistic where starelid = 'rankpart'::regclass; +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_extra'::regclass; +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_2'::regclass; +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_3'::regclass; +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_4'::regclass; +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_5'::regclass; +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_6'::regclass; +select relpages, reltuples from pg_class where oid = 'rankpart'::regclass; + + +-- +-- Test3, if another transaction want to acquire lock which conflict with +-- auto-analyze's ShareUpdateExclusiveLock, the auto-analyze should abort. +-- + +1: CREATE TABLE anaabort(id int); + +-- Track report gpstat on master +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'anaabort', 1, -1, 0, 1); +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'anaabort', 1, -1, 0, 1); +-- Suspend the autovacuum worker after holding ShareUpdateExclusiveLock. +SELECT gp_inject_fault('analyze_after_hold_lock', 'infinite_loop', '', '', 'anaabort', 1, -1, 0, 1); +-- Track the autovacuum worker abort for conflict ShareUpdateExclusiveLock. +SELECT gp_inject_fault('auto_vac_worker_abort', 'skip', '', '', 'anaabort', 1, -1, 0, 1); + +1&: INSERT INTO anaabort select i from generate_series(1, 1000) as i; + +-- Wait until report pgstat on master +SELECT gp_wait_until_triggered_fault('gp_pgstat_report_on_master', 1, 1); +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); + +1<: + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + +-- Wait until autovacuum work hold ShareUpdateExclusiveLock. +SELECT gp_wait_until_triggered_fault('analyze_after_hold_lock', 1, 1); + +-- Acquire EXCLUSIVE lock on the analyze table +1: BEGIN; +1&: LOCK TABLE anaabort in EXCLUSIVE mode; + +-- The auto-analyze should abort +SELECT gp_wait_until_triggered_fault('auto_vac_worker_abort', 1, 1); +SELECT gp_inject_fault('auto_vac_worker_abort', 'reset', 1); +SELECT gp_inject_fault('analyze_after_hold_lock', 'reset', 1); + +-- Get lock +1<: + +-- Shouldn't have statistic updated. +SELECT count(*) FROM pg_statistic where starelid = 'anaabort'::regclass; +select relpages, reltuples from pg_class where oid = 'anaabort'::regclass; + +1: END; + +-- +-- Test 4, auto-ANALYZE and auto_stats could work at the same time. +-- With `on_no_stats` mode, if insert into a empty table, ANALYZE gets triggered. +-- But this doesn't prevent auto-ANALYZE for the table. (Case 1) +-- And for `on_change` mode, if the modified tuples reach the auto_stats threshold, +-- auto_stats will get triggered, this also doesn't prevent auto-ANALYZE. (Case 2) +-- But, if not reach the auto_stats threshold, then only auto-ANALYZE will be considered. (Case 3) +-- More details, please refer to the Implementation part of +-- src/backend/postmaster/README.auto-ANALYZE. +-- + +-- Case 1 -- +2: SET gp_autostats_mode = 'on_no_stats'; + +-- Prepare the table to be ANALYZEd +2: CREATE TABLE autostatstbl (id bigint); + +-- 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); +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'autostatstbl', 1, -1, 0, 1); + +-- with auto_stats, the auto-ANALYZE still trigger +2: INSERT INTO autostatstbl select i from generate_series(1, 1000) as i; +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; +select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; +-- expect analyze_count = 1, autoanalyze_count = 0, and n_mod_since_analyze = 1000 since ANALYZE executed +-- in same transaction for the insert statement. +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + +-- we can see the auto-ANALYZE finished +select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; +-- expect analyze_count = 1, autoanalyze_count = 1, and n_mod_since_analyze = 0 +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + +-- Case 2 -- +-- with auto_stats 'on_change' mode, the auto-ANALYZE still trigger +2: SET gp_autostats_mode = 'on_change'; +2: SET gp_autostats_on_change_threshold = 500; + +-- 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); +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'autostatstbl', 1, -1, 0, 1); + +2: INSERT INTO autostatstbl select i from generate_series(1001, 2000) as i; +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; +-- expect analyze_count = 2, autoanalyze_count = 1, and n_mod_since_analyze = 1000 since ANALYZE executed +-- in same transaction for the insert statement. +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + +-- we can see the auto-ANALYZE finished, check statistic and analyze count +select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; +-- expect analyze_count = 2, autoanalyze_count = 2, and n_mod_since_analyze = 0 +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + + +-- Case 3 -- +-- reset the threshold, so auto_stats will not be triggered and then auto-ANALYZE will be triggered. +2: RESET gp_autostats_on_change_threshold; + +-- 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); +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'autostatstbl', 1, -1, 0, 1); + +2: INSERT INTO autostatstbl select i from generate_series(2001, 3000) as i; +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; +-- expect analyze_count = 2, autoanalyze_count = 2, and n_mod_since_analyze = 1000 since ANALYZE executed +-- in same transaction for the insert statement. +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + +-- we can see the auto-ANALYZE finished, check statistic and analyze count +select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; +-- expect analyze_count = 2, autoanalyze_count = 3, and n_mod_since_analyze = 0 since ANALYZE executed +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + +-- Reset GUCs. +ALTER SYSTEM RESET autovacuum_naptime; +select * from pg_reload_conf(); + diff --git a/src/test/singlenode_isolation2/input/external_table.source b/src/test/singlenode_isolation2/input/external_table.source new file mode 100644 index 00000000000..9dba0ff54aa --- /dev/null +++ b/src/test/singlenode_isolation2/input/external_table.source @@ -0,0 +1,158 @@ +CREATE EXTENSION IF NOT EXISTS gp_inject_fault; + +-- start_ignore +DROP EXTERNAL TABLE IF EXISTS exttab_cursor_1; +DROP EXTERNAL TABLE IF EXISTS exttab_cursor_2; +-- 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; +-- 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; +-- 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. +10: set CLIENT_MIN_MESSAGES=WARNING; +10: 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; +10: COMMIT; +10: reset CLIENT_MIN_MESSAGES; + +-- Fetch on external table scans with segment reject limit reached +10: SELECT gp_truncate_error_log('exttab_cursor_1'); +10: SELECT gp_truncate_error_log('exttab_cursor_2'); +-- DECLARE CURSOR implicitly initiates a FETCH on the segments. If one of +-- the segments reaches the reject limit and reports the error back to the QD +-- before the others, the transaction gets aborted. The timing of fetching the +-- results will influence the order of the ERROR in the output. +-- +-- For gp_interconnect_type=tcp: +-- If the segment errors out before QD call 'SetupInterconnect', QD will report +-- this error in 'SetupInterconnect', or else, QD will report the error in the +-- following FETCH command. +-- +-- To make this test deterministic, we use gp_inject_fault to let QD suspend +-- before 'SetupInterconnect' to make sure QD calls 'SetupInterconnect' after +-- segment errors out. + +-- Suspend QD when it is setting up interconnect. +SELECT gp_inject_fault('interconnect_setup_palloc', 'suspend', dbid) + FROM gp_segment_configuration + WHERE content=-1 AND role='p'; + +-- Inject fault on QE to determine when it aborts. +SELECT gp_inject_fault('transaction_abort_failure', 'skip', dbid) + FROM gp_segment_configuration + WHERE content=0 AND role='p'; + +-- Start a transaction with cursor that triggers error on QE +10: BEGIN; +10&: DECLARE exttab_cur1 no scroll cursor FOR + SELECT e1.i, e2.j from exttab_cursor_2 e1 INNER JOIN exttab_cursor_2 e2 ON e1.i = e2.i + UNION ALL + SELECT e1.i, e2.j from exttab_cursor_2 e1 INNER JOIN exttab_cursor_2 e2 ON e1.i = e2.i + UNION ALL + SELECT e1.i, e2.j from exttab_cursor_2 e1 INNER JOIN exttab_cursor_2 e2 ON e1.i = e2.i; + +-- Ensure that QE has hit an error +SELECT gp_wait_until_triggered_fault('transaction_abort_failure', 1, dbid) + FROM gp_segment_configuration + WHERE content=0 AND role='p'; + +SELECT gp_wait_until_triggered_fault('interconnect_setup_palloc', 1, dbid) + FROM gp_segment_configuration + WHERE content=-1 AND role='p'; + +-- Resume QD. +-- Error from QE should be reported after QD resumes +SELECT gp_inject_fault('interconnect_setup_palloc', 'resume', dbid) + FROM gp_segment_configuration + WHERE content=-1 AND role='p'; + +-- Check the result +10<: +10: COMMIT; + +-- Reset injected faults +SELECT gp_inject_fault('transaction_abort_failure', 'reset', dbid) + FROM gp_segment_configuration + WHERE content=0 AND role='p'; +SELECT gp_inject_fault('interconnect_setup_palloc', 'reset', dbid) + FROM gp_segment_configuration + WHERE content=-1 AND role='p'; + +-- This should have errors populated already +10: SELECT count(*) > 0 FROM gp_read_error_log('exttab_cursor_2'); + +-- Fetch on external table scans without reaching segment reject limit +10: SELECT gp_truncate_error_log('exttab_cursor_1'); +10: SELECT gp_truncate_error_log('exttab_cursor_2'); +10: 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); +-- Should not fail +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: FETCH exttab_cur1; +10: COMMIT; + + +-- start_ignore +DROP EXTERNAL WEB TABLE IF EXISTS ext_delim_off; +-- 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'\\'); + +-- Query the ext_delim_off table +SELECT * FROM ext_delim_off; + +-- start_ignore +DROP EXTERNAL TABLE IF EXISTS ext_delimiter_off_text; +-- 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'; + +SELECT * FROM ext_delimiter_off_text; + +-- start_ignore +DROP EXTERNAL TABLE IF EXISTS ext_delimiter_off_csv; +-- 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'; + +SELECT * FROM ext_delimiter_off_csv; + +-- start_ignore +DROP EXTERNAL TABLE IF EXISTS exttab_delimiter_escape_off; +-- 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; + +SELECT * FROM exttab_delimiter_escape_off ORDER BY a; diff --git a/src/test/singlenode_isolation2/input/fts_manual_probe.source b/src/test/singlenode_isolation2/input/fts_manual_probe.source new file mode 100644 index 00000000000..5aec26cba5a --- /dev/null +++ b/src/test/singlenode_isolation2/input/fts_manual_probe.source @@ -0,0 +1,77 @@ +-- See src/backend/fts/README for background information +-- +-- This tests two scenarios: +-- 1) Piggyback Test +-- Ensure multiple probe requests come in before the start of a new ftsLoop, +-- then all those requests share the same result. +-- +-- 2) Fresh Result Test +-- Ensure fresh results when a probe request occurs during an in progress +-- ftsLoop. +-- +-- It is useful to remember that the FtsLoop and each FtsNotifyProbe are +-- individual processes. Careful use of fault injectors are needed to have +-- complete and consistent control over the flow of the two independent +-- processes - the ftsLoop and FtsNotifyProber's. +-- +-- NOTE: you must add '--load-extension=gp_inject_fault' to the commandline +-- for a manual test. + +select gp_inject_fault('all', 'reset', 1) from master(); + +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 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 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; + +-- ensure there is no in progress ftsLoop after reloading the gp_fts_probe_interval +select gp_request_fts_probe_scan(); + +select * from get_stats; + +-- piggyback test: start multiple probes +select gp_inject_fault_infinite('ftsNotify_before', 'suspend', 1) from master(); + +1&: select gp_request_fts_probe_scan(); +2&: select gp_request_fts_probe_scan(); +3&: select gp_request_fts_probe_scan(); + +-- piggyback: ensure the probe requests are at a known starting location +select gp_wait_until_triggered_fault('ftsNotify_before', 3, 1) from master(); + +-- piggyback: ensure the ftsLoop is at a known starting location +select * from get_stats; +select gp_inject_fault('ftsNotify_before', 'resume', 1) from master(); + +select * from get_stats; + +-- fresh result test: issue a new probe request during the in progress piggyback ftsLoop +4: select gp_request_fts_probe_scan(); + +1<: +2<: +3<: + +select * from get_stats; + +-- show all raw stats for debugging +-- start_ignore +select * from get_raw_stats; +-- end_ignore diff --git a/src/test/singlenode_isolation2/input/gp_collation.source b/src/test/singlenode_isolation2/input/gp_collation.source new file mode 100644 index 00000000000..4b251e3d310 --- /dev/null +++ b/src/test/singlenode_isolation2/input/gp_collation.source @@ -0,0 +1,116 @@ +-- +-- Try and fail to import all system collations +-- +-- Simulate a locale missing on one segment at collation creation. If this +-- happens, we expect that 2PC will prevent this collation from being created. +-- +SELECT gp_inject_fault('collate_locale_os_lookup', 'error', dbid) + from gp_segment_configuration where content = 0 and role = 'p'; + +-- The fault injector should prevent all collations from being created by +-- pg_import_system_collations(). +create schema import_collation_schema; +select pg_import_system_collations( (select oid from pg_namespace where nspname = 'import_collation_schema') ); + +-- Count the number of collations in import_collation_schema. It should be +-- zero because one of the segments failed to create a collation. +select count(*) from pg_collation where collnamespace = (select oid from pg_namespace where nspname = 'import_collation_schema'); + +SELECT gp_inject_fault('collate_locale_os_lookup', 'reset', dbid) + from gp_segment_configuration where content = 0 and role = 'p'; + +-- +-- Import all system collations. +-- +select pg_import_system_collations( (select oid from pg_namespace where nspname = 'import_collation_schema') ) > 0 as collations_imported; + +-- +-- Create a collation from an on-disk locale +-- +select gp_segment_id, collname from pg_collation where collname='collation_from_disk'; +create collation "collation_from_disk" (locale="@gp_syslocale@"); +select gp_segment_id, collname from pg_collation where collname='collation_from_disk'; +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_disk'); +select count(distinct oid) from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_disk'); + +-- +-- Drop the collation, and confirm it is actually gone +-- +drop collation "collation_from_disk"; +select gp_segment_id, collname from pg_collation where collname='collation_from_disk'; +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_disk'); + + +-- +-- Create a collation from an existing collation +-- +select gp_segment_id, collname from pg_collation where collname='collation_from_db'; +create collation "collation_from_db" from "POSIX"; +select gp_segment_id, collname from pg_collation where collname='collation_from_db'; +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_db'); +select count(distinct oid) from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_db'); + +-- +-- Confirm that collation creation is protected from errors by 2PC. +-- In other words if one segment throws an error, the collation +-- should not be created on any segment. +-- +create collation "missing_on_one_segment" from "C"; +-- Drop collation from one segment +2U: drop collation "missing_on_one_segment"; +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='missing_on_one_segment'); +-- Because we dropped missing_on_one_segment from content 2, it +-- will fail to create the collation. +create collation "collation_create_fails" from "missing_on_one_segment"; +-- Confirm 'collation_create_fails' is missing from all segments. +select gp_segment_id, collname from pg_collation where collname='collation_create_fails'; +select gp_segment_id, collname from gp_dist_random('pg_collation') where collname='collation_create_fails'; + +-- Clean up table missing_on_one_segement +-1U: drop collation "missing_on_one_segment"; +0U: drop collation "missing_on_one_segment"; +1U: drop collation "missing_on_one_segment"; + +-- +-- Simulate a locale missing on one segment at collation creation. If this +-- happens, we expect that 2PC will prevent this collation from being created. +-- +SELECT gp_inject_fault('collate_locale_os_lookup', 'error', dbid) + from gp_segment_configuration where content = 0 and role = 'p'; + +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='locale_missing_on_one_segment'); +-- The fault injector should simulate a collation being missing on this segment +create collation "locale_missing_on_one_segment" (locale="@gp_syslocale@"); +-- Confirm 'collation_create_fails' is missing from all segments. +select gp_segment_id, collname from pg_collation where collname='locale_missing_on_one_segment'; +select gp_segment_id, collname from gp_dist_random('pg_collation') where collname='locale_missing_on_one_segment'; + +SELECT gp_inject_fault('collate_locale_os_lookup', 'reset', dbid) + from gp_segment_configuration where content = 0 and role = 'p'; + + +-- +-- If, for whatever reason a collation was created for a locale that is no +-- longer available on a segment, we expect that a query using that collation +-- will throw an error. +-- +select gp_segment_id, collname from pg_collation where collname='locale_missing_on_one_segment'; +create collation "locale_missing_on_one_segment" (locale="@gp_syslocale@"); +-- Confirm is on all segments. +select gp_segment_id, collname from pg_collation where collname='locale_missing_on_one_segment'; +select gp_segment_id, collname from gp_dist_random('pg_collation') where collname='locale_missing_on_one_segment'; + +create table uses_collation (a text collate locale_missing_on_one_segment); +-- 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'); + +SELECT gp_inject_fault('collate_locale_os_lookup', 'error', dbid) + from gp_segment_configuration where content = 0 and role = 'p'; + +-- This should error out +SELECT a FROM uses_collation ORDER BY a; + +SELECT gp_inject_fault('collate_locale_os_lookup', 'reset', dbid) + from gp_segment_configuration where content = 0 and role = 'p'; + diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/corner.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/corner.source new file mode 100644 index 00000000000..7c4c35738e3 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/corner.source @@ -0,0 +1,497 @@ +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); +DROP TABLE IF EXISTS t11; +CREATE TABLE t11 (a INT) DISTRIBUTED by (a); +insert into t11 select generate_series(1,100000); +DROP TABLE IF EXISTS t2; +CREATE TABLE t2 (a INT) DISTRIBUTED by (a); +DROP TABLE IF EXISTS t3; +CREATE TABLE t3 (a text) DISTRIBUTED by (a); +COPY t3 FROM PROGRAM 'for i in `seq 1 10`; do echo ${i}test; done'; +DROP TABLE IF EXISTS t4; +CREATE TABLE t4 (a text) DISTRIBUTED by (a); +DROP TABLE IF EXISTS t5; +CREATE TABLE t5 (b INT) DISTRIBUTED by (b); +INSERT INTO t5 SELECT GENERATE_SERIES(1, 10); + +-- Test1: close not executed PARALLEL RETRIEVE CURSOR +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1: CLOSE c1; +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: @pre_run 'set_endpoint_variable @ENDPOINT1': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT1'; + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +1: ROLLBACK; + +-- test for a large table +1: BEGIN; +1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t11; +1: @post_run 'parse_endpoint_info 11 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c11'; +1: CLOSE c11; +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c11'; +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: @pre_run 'set_endpoint_variable @ENDPOINT11': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT11'; + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c11', -1); +1: ROLLBACK; + +-- Test2: open many PARALLEL RETRIEVE CURSORs +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c9 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c10 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: ROLLBACK; +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints(); + +-- Test3: execute non-existing PARALLEL RETRIEVE CURSOR +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +1: ROLLBACK; +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1: ROLLBACK; +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints(); + +-- Test4: execute one of PARALLEL RETRIEVE CURSORs +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c9 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c10 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +-- test check and wait in normal way +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +-- check all endpoint state +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +1: ROLLBACK; +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +-- cleanup retrieve connections +*Rq: + +-- Test5: if conflict with normal cursors +1: BEGIN; +1: DECLARE c1 CURSOR FOR SELECT * FROM t1; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints(); +1: ROLLBACK; + +1: BEGIN; +1: DECLARE c1 CURSOR FOR SELECT * FROM t1; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test6: select order by limit +1: BEGIN; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 ORDER BY a LIMIT 10; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +-- test check and wait after finished retrieving +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test7: select order by limit 0 +1: BEGIN; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 ORDER BY a LIMIT 0; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test8: select empty table +1: BEGIN; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test9: select table with text column +1: BEGIN; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t3; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test10: select empty table with text column +1: BEGIN; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t4; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test11: endpoints on one segment. +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 WHERE a = 50; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +1U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK; +-- cleanup retrieve connections +1Rq: + +-- Test12: PARALLEL RETRIEVE CURSOR for aggregate function: sum +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT SUM(a) FROM t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +-1U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +-1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK; +-- cleanup retrieve connections +-1Rq: + +-- Test13: PARALLEL RETRIEVE CURSOR for aggregate function: avg +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT AVG(a) FROM t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + +-1U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +-1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK; +-- cleanup retrieve connections +-1Rq: + +-- Test14: PARALLEL RETRIEVE CURSOR for count(*) +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) FROM t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +-1U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +-1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK; +-- cleanup retrieve connections +-1Rq: + +-- Test15: PARALLEL RETRIEVE CURSOR for two tables' join; +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1, t5 where t1.a = t5.b; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test16: PARALLEL RETRIEVE CURSOR for the count of two tables' join; +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) FROM t1, t5 where t1.a = t5.b; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +-1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK; +-- cleanup retrieve connections +-1Rq: + +-- Test17: re-execute a PARALLEL RETRIEVE CURSOR and retrieve in same sessions. +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: CLOSE c1; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test18: re-execute a PARALLEL RETRIEVE CURSOR and retrieve in different sessions. +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +0Rq: +1Rq: +2Rq: + +1<: +1: CLOSE c1; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test19: PARALLEL RETRIEVE CURSOR and savepoint +1: BEGIN; +1: SAVEPOINT s1; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1: ROLLBACK TO s1; +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + +1: ROLLBACK; + +-- Test20: PARALLEL RETRIEVE CURSOR and savepoint +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: SAVEPOINT s1; +1: CLOSE c1; +1: ROLLBACK TO s1; +1: SELECT * FROM pg_cursors WHERE name='c1'; +1: COMMIT; + +-- Test21: Token should not be changed after cursor declared +1q: +1: BEGIN; +1: DECLARE c21a PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) from t1; +1: @post_run 'get_tuple_cell TOKEN21a 1 1 ; create_match_sub $TOKEN21a token21a' : SELECT auth_token FROM gp_endpoints() WHERE cursorname='c21a'; +-- 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; +1: DECLARE c21c PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: SELECT auth_token FROM gp_endpoints() WHERE cursorname='c21a'; +1: COMMIT; +1q: +*Rq: + +-- Test22: UDF plan should be able to run on entry db. +1: BEGIN; +1: DECLARE c22 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM generate_series(1,10); +1: @post_run 'parse_endpoint_info 22 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c22'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c22', 0); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT22': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT22'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT22': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT22"; + +-- test check and wait after finished retrieving +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c22', -1); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c22'; +1: ROLLBACK; +1q: +-1Rq: +-- cleanup retrieve connections +*Rq: + +-- Test23: Catalog scan plan should be able to run on entry db. +1: BEGIN; +1: DECLARE c23 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT relname FROM pg_class where relname='pg_class'; +1: @post_run 'parse_endpoint_info 23 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c23'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c23', 0); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT23': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT23'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT23': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT23"; + +-- test check and wait after finished retrieving +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c23', -1); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c23'; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test24: endpoint name is too long and will be truncated. +1: BEGIN; +1: DECLARE "x12345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; +1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; +1: DECLARE "x1234567890123456789012345678901234567890123456789012345678901x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; +1: @post_run 'parse_endpoint_info 24 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='x12345678901234567890123456789012345678901234567890123456789x'; +1: @post_run 'parse_endpoint_info 24_1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='x12345678901234567890123456789012345678901234567890123456789012'; +1: @post_run 'parse_endpoint_info 24_2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='x1234567890123456789012345678901234567890123456789012345678901x'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT24': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT24"; +*R: @pre_run 'set_endpoint_variable @ENDPOINT24_1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT24_1"; +*R: @pre_run 'set_endpoint_variable @ENDPOINT24_2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT24_2"; +1: ROLLBACK; +-- cleanup retrieve connections +*Rq: + +-- Test25: cursor name is too long and will be truncated. +1: BEGIN; +1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789y" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +1: ROLLBACK; + +-- Test26: Retrieve one endpoint and quit the session, then connect the segment again and retrieve twice. No crash should happen. +1: BEGIN; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t5; +1: @post_run 'parse_endpoint_info 26 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + +2R: @pre_run 'set_endpoint_variable @ENDPOINT26' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT26"; +2Rq: + +-- connect again and retrieve twice +2R: @pre_run 'set_endpoint_variable @ENDPOINT26' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT26"; +2R: @pre_run 'set_endpoint_variable @ENDPOINT26' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT26"; +2Rq: + +-- check no endpoint info +1: CLOSE C2; +1: COMMIT; + +-- Test27: General locus should run on entry db. Test23 tested Entry locus. +1: BEGIN; +1: DECLARE c27 PARALLEL RETRIEVE CURSOR FOR SELECT generate_series(1,10); +1: @post_run 'parse_endpoint_info 27 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c27'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c27', 0); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT27': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT27'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT27': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT27"; + +-- test check and wait after finished retrieving +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c27', -1); +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c27'; +-- cleanup retrieve connections +*Rq: + +-- Test28: Parallel retrieve cursor should run on the dispatcher only. +-1U: BEGIN; +-1U: DECLARE c28 PARALLEL RETRIEVE CURSOR FOR SELECT generate_series(1,10); +-1Uq: + +-- Final: clean up +DROP TABLE t1; +DROP TABLE t11; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; +DROP TABLE t5; diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/explain.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/explain.source new file mode 100644 index 00000000000..9863ba5a03a --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/explain.source @@ -0,0 +1,50 @@ +-- @Description Tests "EXPLAIN" statement for the PARALLEL RETRIEVE CURSOR +-- +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); +CREATE TABLE t2 (a INT) DISTRIBUTED RANDOMLY; +insert into t2 select generate_series(1,100); +DROP TABLE IF EXISTS rt1; +CREATE TABLE rt1 (a INT) DISTRIBUTED REPLICATED; +insert into rt1 select generate_series(1,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; +EXPLAIN (COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR WITH HOLD FOR SELECT * FROM t1; + +EXPLAIN (COSTS false) DECLARE c1 NO SCROLL PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +EXPLAIN (COSTS false) DECLARE c1 SCROLL PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; + +-- Test: explain output: Endpoint info (on coordinator/on some segments/on all segments) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 ORDER BY a; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 WHERE a=1; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 WHERE a=1 OR a=2; + +-- Test: Locus CdbLocusType_Strewn +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2; + +-- Test for system table which is accessible on coordinator +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 CURSOR FOR SELECT * FROM pg_class; + +-- Test: explain output: Endpoint info (on coordinator/on some segments/on all segments) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM pg_class; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM pg_class ORDER BY relname; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM pg_class WHERE gp_segment_id=1; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM pg_class WHERE gp_segment_id=1 OR gp_segment_id=2; + +-- Test for UDF which can be executed on coordinator +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10) as F; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10) as F ORDER BY F; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10) as F WHERE F=1; +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10) as F WHERE F=1 OR F=2; + +-- Test: explain output: Endpoint info (on coordinator/on some segments/on all segments) +-- Here because replicated table will execute on seg id: session_id % segment_number +-- Just replace the random specific seg id to SEGIDX for the output +1: @post_run 'create_sub "Endpoint: on segments: contentid \[[0-9]+\]" " Endpoint: on segments: contentid [SEGIDX]" ':EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1; +1: @post_run 'create_sub "Endpoint: on segments: contentid \[[0-9]+\]" " Endpoint: on segments: contentid [SEGIDX]" ':EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +1: @post_run 'create_sub "Endpoint: on segments: contentid \[[0-9]+\]" " Endpoint: on segments: contentid [SEGIDX]" ':EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE a=1; +1: @post_run 'create_sub "Endpoint: on segments: contentid \[[0-9]+\]" " Endpoint: on segments: contentid [SEGIDX]" ':EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE a=1 OR a=2; + diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/extended_query.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/extended_query.source new file mode 100644 index 00000000000..cad58c5d990 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/extended_query.source @@ -0,0 +1,3 @@ +!\retcode ./test_parallel_retrieve_cursor_extended_query @curusername@ postgres; +!\retcode ./test_parallel_retrieve_cursor_extended_query_error @curusername@ postgres; + diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/fault_inject.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/fault_inject.source new file mode 100644 index 00000000000..3e592b5968c --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/fault_inject.source @@ -0,0 +1,234 @@ +-- @Description Tests with faut inject +-- +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); + +--------- Test1: fault injection end-point shared memory slot full on QE +2: SELECT gp_inject_fault('alloc_endpoint_slot_full', 'reset', 2); +2: SELECT gp_inject_fault('alloc_endpoint_slot_full', 'skip', 2); + +1: BEGIN; +-- should report error on seg0 +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: ROLLBACK; +-- test same error on another session +3: BEGIN; +3: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +3: ROLLBACK; +-- reset the fault injection +2: SELECT gp_inject_fault('alloc_endpoint_slot_full_reset', 'reset', 2); +2: SELECT gp_inject_fault('alloc_endpoint_slot_full_reset', 'skip', 2); +--should work as normal +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1' or endpointname='DUMMYENDPOINTNAME'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; + +1<: +1: CLOSE c1; +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1' or endpointname='DUMMYENDPOINTNAME'; +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c1' or endpointname='DUMMYENDPOINTNAME'; + +1: ROLLBACK; + +--- Test2: fault inject while retrieving tuples from endpoint +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'interrupt', 2); + +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +2R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1<: +1: ROLLBACK; +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); + +-- Test3: fault inject at the 5th time while retrieving tuples from endpoint +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'interrupt', '', '', '', 5, 5, 0, 3::smallint); + +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +1R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; + +1<: + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +0R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +2R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; + +1<: +1: ROLLBACK; +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); + +-- Test4: error inject at the 5th time while retrieving tuples from endpoint +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'error', '', '', '', 5, 5, 0, 2::smallint); + +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +1R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +0R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; + +1<: + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +2R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; + +1<: +1: ROLLBACK; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); + +-- Test5: error inject at the 5th time while retrieving tuples from endpoint. other retrieve session still retrieving. +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 4); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 2::smallint); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 4::smallint); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'interrupt', '', '', '', 5, 5, 0, 3::smallint); + +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +0R&: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +2R&: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; + +1<: + +0R<: +2R<: + +1<: +1: ROLLBACK; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 4); + +-- Test6: close PARALLEL RETRIEVE CURSOR during retrieve +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 2::smallint); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 4::smallint); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 3::smallint); + +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +0R&: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +1R&: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +2R&: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1: CLOSE c1; + +0R<: +1R<: +2R<: + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1: END; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 4); + +DROP TABLE t1; + +-- Test7: error inject at the 1000th time while retrieving tuples from endpoint. other retrieve session finished. +DROP TABLE IF EXISTS t2; +CREATE TABLE t2 (a INT) DISTRIBUTED by (a); +insert into t2 select generate_series(1,10000); + +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) + FROM gp_segment_configuration + WHERE content=1 AND role='p'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'interrupt', '', '', '', 1000, 1000, 0, dbid) + FROM gp_segment_configuration + WHERE content=1 AND role='p'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) + FROM gp_segment_configuration + WHERE content=0 AND role='p'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 900, 900, 2, dbid) + FROM gp_segment_configuration + WHERE content=0 AND role='p'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) + FROM gp_segment_configuration + WHERE content=2 AND role='p'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 800, 800, 2, dbid) + FROM gp_segment_configuration + WHERE content=2 AND role='p'; + +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t2; +1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +0R&: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +2R&: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; +1R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; + +1<: + +0R<: +2R<: + +1<: +1: ROLLBACK; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) + FROM gp_segment_configuration + WHERE content=0 AND role='p'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) + FROM gp_segment_configuration + WHERE content=1 AND role='p'; +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) + FROM gp_segment_configuration + WHERE content=2 AND role='p'; + +DROP TABLE t2; diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/privilege.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/privilege.source new file mode 100644 index 00000000000..66a4054a295 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/privilege.source @@ -0,0 +1,161 @@ +-- @Description Tests the privileges related with endpoints +-- +DROP TABLE IF EXISTS t1; +DROP USER IF EXISTS adminuser; +DROP USER IF EXISTS u1; +DROP USER IF EXISTS uu1; +DROP USER IF EXISTS u2; +CREATE USER adminuser; +ALTER USER adminuser WITH SUPERUSER; +CREATE USER u1 with CREATEROLE; +CREATE USER u2; + +SET SESSION AUTHORIZATION u1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,10); +CREATE USER uu1; +GRANT ALL PRIVILEGES ON t1 TO uu1; +GRANT uu1 TO u1; +RESET SESSION AUTHORIZATION; + + +--------- Test1: Admin should be able to see other user's endpoint, retrieve role auth should check token and user +--- c1 is declared by superuser +1: SET SESSION AUTHORIZATION adminuser; +1: SELECT SESSION_USER, CURRENT_USER; +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1: SET SESSION AUTHORIZATION u1; +1: SELECT SESSION_USER, CURRENT_USER; +--- c2 is declared by u1 +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +--- c12 is declared by u1 on entry db +1: DECLARE c12 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10); +--- u1 is able to see all endpoints created by himself. +1: SELECT DISTINCT(cursorname), usename FROM gp_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + +--- adminuser should be able to see all the endpoints declared by u1 with state READY +2: SET SESSION AUTHORIZATION adminuser; +2: SELECT SESSION_USER, CURRENT_USER; +2: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +2: @post_run 'parse_endpoint_info 12 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c12'; +2: SELECT DISTINCT(cursorname), usename FROM gp_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + +--- adminuser should be able to see the cursor state change to READY +2: SELECT auth_token, usename, state FROM gp_endpoints() endpoints, pg_user WHERE endpoints.userid = pg_user.usesysid order by usename; + +--- adminuser should be able to see all endpoints declared by u1 in utility mode +3: @pre_run 'export CURRENT_ENDPOINT_POSTFIX=1 ; export RETRIEVE_USER="adminuser"; echo $RAW_STR ' : SELECT 1; +0R: SELECT SESSION_USER, CURRENT_USER; +0U: SELECT auth_token, usename FROM gp_segment_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; +0R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; +0Rq: +3: @pre_run 'export CURRENT_ENDPOINT_POSTFIX=2 ; export RETRIEVE_USER="u1"; echo $RAW_STR ' : SELECT 1; +--- Login as u1 and retrieve all to finish the test +0R: SELECT SESSION_USER, CURRENT_USER; +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + +1: SET ROLE uu1; +1: SELECT SESSION_USER, CURRENT_USER; +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +2: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; +--- uu1 can not see u1's endpoints. +1: SELECT DISTINCT(cursorname), usename FROM gp_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; +2: SELECT DISTINCT(cursorname), usename FROM gp_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + +3: @pre_run 'export RETRIEVE_USER="uu1"; echo $RAW_STR ' : SELECT 1; +--- Login as uu1 and retrieve, only u1 can retrieve +3R: SELECT SESSION_USER, CURRENT_USER; +3R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; + +--- Retrieve c2(which belongs to u1) but current user is uu1. +3R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +0Rq: +3Rq: +1<: +1: END; +2q: +3: @pre_run 'unset RETRIEVE_USER; echo $RAW_STR ' : SELECT 1; +3q: + + +--------- Test2: Admin should NOT be able to retrieve from other's PARALLEL RETRIEVE CURSOR +1: SET SESSION AUTHORIZATION adminuser; +1: SELECT SESSION_USER, CURRENT_USER; +1: 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; +1: SET SESSION AUTHORIZATION u1; +--- c1 is declared and executed by u1 +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +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_endpoints() WHERE cursorname='c0'; + +2: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + +--- adminuser should NOT be able to retrieve from other's PARALLEL RETRIEVE CURSOR +3: @pre_run 'export CURRENT_ENDPOINT_POSTFIX=40 ; export RETRIEVE_USER="adminuser"; echo $RAW_STR ' : SELECT 1; +*R: SET SESSION AUTHORIZATION adminuser; +*R: SELECT SESSION_USER, CURRENT_USER; +*R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; +-- cancel the no privilege retrieving endpoints, otherwise it will wait until statement_timeout +42: select pg_cancel_backend(pid) from pg_stat_activity where query like 'SELECT * FROM gp_wait_parallel_retrieve_cursor(''c1'', -1);'; + +1<: +1: CLOSE c1; +1: END; +1q: +3q: +0Rq: +1Rq: +2Rq: + + +--------- Test3: Admin should be able to close PARALLEL RETRIEVE CURSOR +--- c1 is declared and executed by u1 +1: SET SESSION AUTHORIZATION u1; +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +--- Close c1 by adminuser +1: SET SESSION AUTHORIZATION adminuser; +1: CLOSE c1; +1: END; + + +--------- Test4: u2 should NOT be able to see or retrieve from u1's endpoints +1: SET SESSION AUTHORIZATION adminuser; +1: SELECT SESSION_USER, CURRENT_USER; +1: 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; +1: @post_run 'parse_endpoint_info 50 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c0'; +1: SET SESSION AUTHORIZATION u1; +--- c4 is declared and executed by u1 +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c4'; + +--- u2 is not able to see u1's endpoints on master +1: SET SESSION AUTHORIZATION u2; +1: SELECT * from gp_endpoints(); + +--- execute the cursor by u1 +1: SET SESSION AUTHORIZATION u1; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); + +--- u2 is not able to see u1's endpoints in RETRIEVE mode +*R: @pre_run 'export CURRENT_ENDPOINT_POSTFIX=50 ; export RETRIEVE_USER="adminuser" ; echo $RAW_STR' : SET SESSION AUTHORIZATION u2; +*U: SELECT auth_token, usename FROM gp_segment_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + +--- u2 is not able to retrieve from u1's endpoints in RETRIEVE mode +*R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +-- cancel the no privilege retrieving endpoints, otherwise it will wait until statement_timeout +42: select pg_cancel_backend(pid) from pg_stat_activity where query like 'SELECT * FROM gp_wait_parallel_retrieve_cursor(''c4'', -1);'; + +1<: +1: CLOSE c4; +1: END; +0Rq: +1Rq: +2Rq: diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/replicated_table.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/replicated_table.source new file mode 100644 index 00000000000..1217d6c9517 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/replicated_table.source @@ -0,0 +1,174 @@ +-- @Description Tests the PARALLEL RETRIEVE CURSOR for select replcated table +-- +DROP TABLE IF EXISTS rt1; +CREATE TABLE rt1 (a INT) DISTRIBUTED REPLICATED; +insert into rt1 select generate_series(1,100); + +--------- Test1: Basic test for PARALLEL RETRIEVE CURSOR on replicated table + +-- Replicated table will execute on seg id: session_id % segment_number +-- Declare a cursor and check gp_endpoints(), we can find out the real +-- segment id by joining gp_segment_configuration. This should equal to +-- session_id % 3 (size of demo cluster). +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1; +1: SELECT sc.content = current_setting('gp_session_id')::int % 3 AS diff FROM gp_endpoints() ep, gp_segment_configuration sc WHERE ep.dbid = sc.dbid; +1: ROLLBACK; +1q: + +--------- Test2: Basic test for PARALLEL RETRIEVE CURSOR on replicated table +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +2: BEGIN; +2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +3: BEGIN; +3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +4: BEGIN; +4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +5: BEGIN; +5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +6: BEGIN; +6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; + +-- 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, +-- so that there should have specific session: MOD(sessionid,3)=1; +-- Get token only in specific session id and retrieve this token. +7: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE MOD(sessionid,3)=1 LIMIT 1; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +2&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +3&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +4&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +5&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +6&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; +-- cancel all 6 sessions +7: select pg_cancel_backend(pid) from pg_stat_activity, gp_endpoints() where sess_id = sessionid AND (cursorname ='c1' or cursorname='c2' or cursorname='c3' or cursorname ='c4' or cursorname='c5' or cursorname='c6'); +1<: +2<: +3<: +4<: +5<: +6<: + +1: ROLLBACK; +2: ROLLBACK; +3: ROLLBACK; +4: ROLLBACK; +5: ROLLBACK; +6: ROLLBACK; + +1q: +2q: +3q: +4q: +5q: +6q: +-1Rq: +1Rq: +2Rq: +3Rq: +4Rq: +5Rq: +6Rq: + +--------- Test3: Basic test for PARALLEL RETRIEVE CURSOR on replicated table +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +2: BEGIN; +2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +3: BEGIN; +3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +4: BEGIN; +4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +5: BEGIN; +5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +6: BEGIN; +6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; + +-- 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, +-- so that there should have specific session: MOD(sessionid,3)=1; +-- Get token only in specific session id and retrieve this token. +7: @post_run 'parse_endpoint_info 3 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE MOD(sessionid,3)=1 LIMIT 1; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +2&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +3&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +4&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +5&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +6&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +*U: @pre_run 'set_endpoint_variable @ENDPOINT3': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT3'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; +-- cancel all 6 sessions +7: select pg_cancel_backend(pid) from pg_stat_activity, gp_endpoints() where sess_id = sessionid AND (cursorname ='c1' or cursorname='c2' or cursorname='c3' or cursorname ='c4' or cursorname='c5' or cursorname='c6'); +1<: +2<: +3<: +4<: +5<: +6<: + +1: ROLLBACK; +2: ROLLBACK; +3: ROLLBACK; +4: ROLLBACK; +5: ROLLBACK; +6: ROLLBACK; + +1q: +2q: +3q: +4q: +5q: +6q: +-1Rq: +1Rq: +2Rq: +3Rq: +4Rq: +5Rq: +6Rq: + +--------- Test4: Basic test for PARALLEL RETRIEVE CURSOR on replicated table +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +2: BEGIN; +2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +3: BEGIN; +3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +4: BEGIN; +4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +5: BEGIN; +5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +6: BEGIN; +6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; + +-- 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, +-- so that there should have specific session: MOD(sessionid,3)=1; +-- Get token only in specific session id and retrieve this token. +7: @post_run 'parse_endpoint_info 4 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE MOD(sessionid,3)=1 LIMIT 1; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +2&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +3&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +4&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +5&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +6&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +*U: @pre_run 'set_endpoint_variable @ENDPOINT4': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT4'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT4"; +-- cancel all 6 sessions +7: select pg_cancel_backend(pid) from pg_stat_activity, gp_endpoints() where sess_id = sessionid AND (cursorname ='c1' or cursorname='c2' or cursorname='c3' or cursorname ='c4' or cursorname='c5' or cursorname='c6'); +1<: +2<: +3<: +4<: +5<: +6<: + +1: ROLLBACK; +2: ROLLBACK; +3: ROLLBACK; +4: ROLLBACK; +5: ROLLBACK; +6: ROLLBACK; diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/retrieve_quit_check.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/retrieve_quit_check.source new file mode 100644 index 00000000000..21e2a8a45ed --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/retrieve_quit_check.source @@ -0,0 +1,63 @@ +-- @Description Tests retrieve quit +-- Test quitting retrieve sessions interfering with multiple endpoints when calling +-- gp_wait_parallel_retrieve_cursor. +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); + +--------- Test1: test for quit retrieve will cancel all unfinished QE backend +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; + +-- in one retrieve session, retrieve multiple tokens (begin retrieving, finished retrieving, not yet retrieve) +0R: @pre_run 'set_endpoint_variable @ENDPOINT1' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT1"; +0R: @pre_run 'set_endpoint_variable @ENDPOINT2' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +-- skip TOKEN3 in this session + +-- a new retrieve session. c1 & c2 cannot be retrieved since an existing retrieve session has +-- retrieved them at least once. +3R: @pre_run 'set_endpoint_variable @ENDPOINT1' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT1"; +3R: @pre_run 'set_endpoint_variable @ENDPOINT2' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +3R: @pre_run 'set_endpoint_variable @ENDPOINT3' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; + +2: SELECT cursorname, state FROM gp_endpoints(); +-- verify endpoints on seg0 for c2 has been finishied +0U: SELECT cursorname,senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints(); +-- quit the first retrieve session +0Rq: + +-- Check quiting retrieve session won't impact on finished endpoint. +-- Now the interrupt is checked using WaitLatch() for time: WAIT_NORMAL_TIMEOUT, +-- so here the sleep time should be greater than WAIT_NORMAL_TIMEOUT. +1: SELECT pg_sleep(0.4); +-- make sure no error for c2 +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +-- When the retrieve session was terminated, the endpoint has not been fully retrieved +-- by this retrieve process should be cancelled. +-- The endpoint on seg0 for c1 should firstly become to RELEASED (the retrieve process set it), +-- and then was removed (during the endpoint QE cancelled) +2: SELECT cursorname, state FROM gp_endpoints(); + +-- verify endpoints for c1 is gone +0U: SELECT cursorname, senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints(); + +-- Now check on c1 will trigger the error, all endpoints should be aborted since the transaction +-- will be terminated. +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', 0); +2: SELECT cursorname, state FROM gp_endpoints(); + +1: END; + +2: SELECT cursorname, state FROM gp_endpoints(); + +-- quit all sessions +1q: +2q: +0Uq: diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/retrieve_quit_wait.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/retrieve_quit_wait.source new file mode 100644 index 00000000000..7bf6329fd86 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/retrieve_quit_wait.source @@ -0,0 +1,77 @@ +-- @Description Tests retrieve quit +-- Test quitting retrieve sessions interfering with multiple endpoints when calling +-- gp_wait_parallel_retrieve_cursor. +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); + +--------- Test1: test for wait for a finished endpoint +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; + +-- Wait until the c2 has been fully retrieved +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +2: SELECT cursorname, state FROM gp_endpoints(); + +-- in all retrieve sessions, retrieve multiple tokens (begin retrieving, finished retrieving, not yet retrieve) +*R: @pre_run 'set_endpoint_variable @ENDPOINT1' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT1"; +*R: @pre_run 'set_endpoint_variable @ENDPOINT2' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +-- skip TOKEN3 in this session + +-- Retrieving on C2 finished. +1<: + +0U: SELECT cursorname,senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints(); +-- quit the retrieve session +0Rq: +-- Now the interrupt is checked using WaitLatch() for time: WAIT_NORMAL_TIMEOUT, +-- so here the sleep time should be greater than WAIT_NORMAL_TIMEOUT, +-- to make sure that the cancel interrupt was handled. +1: SELECT pg_sleep(0.4); +-- When the retrieve session was terminated, the endpoint has not been fully retrieved +-- by this retrieve process should be cancelled. +-- The endpoint on seg0 for c1 should firstly become to RELEASED (the retrieve process set it), +-- and then was removed (during the endpoint QE cancelled) +2: SELECT cursorname, state FROM gp_endpoints(); + +-- Since c1 has been only partially retrieved, an error will be raised when transaction ends. +1: END; + +2: SELECT cursorname, state FROM gp_endpoints(); + +--------- Test2: test for wait for quit partially retrieving session will abort all endpoints in the transaction. + +1: BEGIN; +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c4'; +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c5'; +1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c6'; + +-- Wait until retrieving session for c4 quits +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); + +-- in one retrieve session, retrieve multiple tokens (begin retrieving, finished retrieving, not yet retrieve) +*R: @pre_run 'set_endpoint_variable @ENDPOINT4' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT4"; +*R: @pre_run 'set_endpoint_variable @ENDPOINT5' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +-- skip TOKEN3 in this session + +0U: SELECT cursorname,senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints(); +0Rq: + +-- Since retrieving session abort, waiting should be interrupted. +1<: + +-- All endpoints should be removed since error happened. +2: SELECT cursorname, state FROM gp_endpoints(); + +-- quit all sessions +1q: +2q: diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/security.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/security.source new file mode 100644 index 00000000000..cdb85ed9577 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/security.source @@ -0,0 +1,61 @@ +-- @Description Tests retrieve session functionality restriction for security. +-- +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); + +CREATE OR REPLACE FUNCTION myappend(anyarray, anyelement) RETURNS anyarray AS $$ +SELECT $1 || $2 +$$ LANGUAGE SQL; + +-- Test: Retrieve login without valid token. +1: @pre_run 'export RETRIEVE_TOKEN="123" ; echo $RAW_STR' : SELECT 1; +0R: SELECT 1; +0Rq: + +-- Test: Declare a cursor +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + +-- Test: Should not change gp_role in retrieve mode +0R: set gp_role to 'utility'; + +-- Test: limit all statement which is supported in retrieve session +0R: show gp_role; + +0R: begin; +0R: declare c1 cursor for select * from t1; +0R: fetch 5 from c1; +0R: rollback; + +0R: delete FROM t1; +0R: insert into t1 select generate_series(100,110); +0R: update t1 set a=a+100 where a<10; +0R: truncate table t1; +0R: select * from t1; + +0R: CREATE TABLE t10 (a INT) DISTRIBUTED by (a); +0R: DROP TABLE t1; + +-- copy ... on program ... is also disallowed by this retrieve session. +0R: COPY t1 to '/tmp/1.cvs'; + +-- Test: builtin function can not be allowed +0R: select '12'::int; +-- Test: UDF can not be allowed +0R: SELECT myappend(ARRAY[42,6], 21); +-- Test: Create UDF can not allowed +0R: CREATE OR REPLACE FUNCTION myappend1(anyarray, anyelement) RETURNS anyarray AS $$ +SELECT $1 || $2 +$$ LANGUAGE SQL; + +-- Test: Different illegal endpoints always lead to an error +---- invalid endpoints +1R: RETRIEVE ALL FROM ENDPOINT abc; +1R: RETRIEVE ALL FROM ENDPOINT 123; +1R: RETRIEVE ALL FROM ENDPOINT tk1122; +1R: RETRIEVE ALL FROM ENDPOINT tktt223344556677889900112233445566; + +-- Retrieve data. +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT1"; diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/special_query.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/special_query.source new file mode 100644 index 00000000000..f86d8336dca --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/special_query.source @@ -0,0 +1,55 @@ +-- @Description Tests create parallel for some special query +-- + +--------- Test1: test for PARALLEL RETRIEVE CURSOR on select transient record types +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 AS SELECT generate_series(1, 10) AS x DISTRIBUTED by (x); + +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; '; + +SELECT make_record(x) FROM t1; + +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT make_record(x) FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT1': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT1'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; + +1<: +1: CLOSE c1; + +--------- Test2: test for PARALLEL RETRIEVE CURSOR on select with join statement. +-- there was a hang issue when declaring PARALLEL RETRIEVE CURSOR with join clause. +-- for example: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2 join t2 t12 on true; +-- the root cause is if there are more than one slices for a big table, cdbdisp_checkDispatchAckMessage() +-- will block due to non-root slice is always running in a while loop to wait for motion buffer. +-- this test case is used to verify the hang issue has been fixed. + +-- gp_max_packet_size must be set out of the test session +!\retcode gpconfig -c gp_max_packet_size -v 512; +!\retcode gpstop -u; + +DROP TABLE IF EXISTS t2; +CREATE TABLE t2 (a BIGINT) DISTRIBUTED by (a); + +insert into t2 select generate_series(1,2000); + +SET gp_interconnect_snd_queue_depth=1; +SET gp_interconnect_queue_depth=1; + +-- start a new session to make sure gp_max_packet_size is reconfigured. +2: BEGIN; +2: SHOW gp_max_packet_size; +2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2 join t2 t12 on true; +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +2: CLOSE c2; +2: END; + +-- cleanup +DROP TABLE t2; +!\retcode gpconfig -r gp_max_packet_size; +!\retcode gpstop -u; diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/status_check.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/status_check.source new file mode 100644 index 00000000000..a5f176c0f59 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/status_check.source @@ -0,0 +1,258 @@ +-- @Description Tests the state for pg_endpoints AND gp_segment_endpoints(), focus in nowait mode +-- need to fault injection to gp_wait_parallel_retrieve_cursor() +-- +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); + +--------- Test1: Basic test for parallel retrieve interface & close cursor +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT1': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT1'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1: CLOSE c1; +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c1'; + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1: ROLLBACK; + +---------- Test2: enhanced test for parallel retrieve interface state & cursor auto closed when transaction closed +1: BEGIN; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +-- test RETRIEVE success on seg1 +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + +-- check initial state after "CHECK PARALLEL RETRIEVE CURSOR" +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; +-- check state if some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; +-- return 0 row instead of reporting error if finished retrieving data from this endpoint, while other endpoint have not finished retrieving. +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +-- finished retrieving all endpoints and check state +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1: COMMIT; +-- check the cursor auto closed when transaction closed +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c2'; + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1: ROLLBACK; + +---------- Test3: 2 retrieving sessions connect to the same endpoint report error & cancel QE exec backend +1: BEGIN; +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', 0); +0R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; +-- a new retrieve session should report error +3R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; +-- quit this new retrieve session +3Rq: +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +1R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID31 1 1 ; create_sub "$PID31[ \t]*" senderpid31': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); +-- run 'kill -s INT senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s INT ${PID31} && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1: SELECT pg_sleep(0.4); +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', 0); +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c3'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', 0); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c3'; + +---------- Test4: terminate (using signal QUIT) QE exec backend +1: BEGIN; +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c4'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', 0); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT4"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID41 1 1 ; create_sub "${PID41}[ \t]*" senderpid41': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); +-- run 'kill -s QUIT senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s QUIT ${PID41} && echo "${RAW_STR}" ': SELECT 1; +-- exit this session because the connection closed, so that it will re-connect next time use this session. +0Rq: +0Uq: +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1: SELECT pg_sleep(0.4); +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', 0); +-- check no endpoint info left +2q: +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c4'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', 0); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c4'; +2Rq: + +---------- Test5: terminate (using signal TERM) QE exec backend +1: BEGIN; +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c5'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', 0); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT5"; +-- 1R still bind to Test4 session, so can not retrieve from current endpoint. +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +-- Since seg1 retrieve session is bind to Test4 session. And Test4 session get killed. We need to restart it. +1Rq: +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID51 1 1 ; create_sub "${PID51}[ \t]*" senderpid51': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); +-- run 'kill -s TERM senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s TERM ${PID51} && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1: SELECT pg_sleep(0.4); +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', 0); +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c5'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', 0); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c5'; + +---------- Test6: Cancel (using signal INT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' +-- faul injection on QD +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'reset', 1); +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'sleep', '', '', '', 1, 1, 1, 1::smallint); +1: BEGIN; +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c6'; +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID61 1 1 ; create_sub "${PID61}[ \t]*" QDPid61': select pg_backend_pid(); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT6"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; +-- run 'kill -s INT QDPid' to cancel the endpoint execution backend, retrieve session still can work +-- fault injection sleep to wait for canceling the endpoint execution backend, retrieve session still can work +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', 0); +0U: @pre_run 'kill -s INT ${PID61} && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c6'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c6'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', 0); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c6'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c6'; + +---------- Test6.1: Cancel (using signal INT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' without rollback +-- faul injection on QD +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'reset', 1); +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'sleep', '', '', '', 1, 1, 1, 1::smallint); +1: BEGIN; +1: DECLARE c61 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 61 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c61'; +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID611 1 1 ; create_sub "${PID611}[ \t]*" QDPid611': select pg_backend_pid(); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT61': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT61"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT61': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT61"; +-- run 'kill -s INT QDPid' to cancel the endpoint execution backend, retrieve session still can work +-- fault injection sleep to wait for canceling the endpoint execution backend, retrieve session still can work +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c61', 0); +0U: @pre_run 'kill -s INT ${PID611} && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c61'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c61'; +-- quit the session of 'CHECK PARALLEL RETRIEVE CURSOR' and keep other session connected +1q: +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c61'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c61'; +0Rq: +1Rq: + +---------- Test7: terminate (using signal QUIT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'reset', 1); +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'sleep', '', '', '', 1, 1, 1, 1::smallint); +1: BEGIN; +1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c7'; +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID71 1 1 ; create_sub "${PID71}[ \t]*" QDPid71': select pg_backend_pid(); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT7"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; +2U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; +-- run 'kill -s QUIT QDPid' to cancel the endpoint execution backend, retrieve session still can work +-- here need to sleep sometime to wait for endpoint QE backend to detect QD connection lost. +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c7', 0); +0U: @pre_run 'kill -s QUIT ${PID71}&& sleep 5 && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- quit all sessions on the master, because connect lost +1q: +2q: +-1Uq: +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c7'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c7', -1); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c7'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; + +---------- Test8: Status visibilities for different sessions +1: BEGIN; +1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'get_tuple_cell SESSION81 1 1 ; create_match_sub_with_spaces $SESSION81 session81' : SELECT sessionid,state FROM gp_session_endpoints() WHERE cursorname='c8'; +-- Session 2 can only see its own cursors by default. +2: BEGIN; +2: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +2: @post_run 'get_tuple_cell SESSION82 1 1 ; create_match_sub_with_spaces $SESSION82 session82' : SELECT sessionid,state FROM gp_session_endpoints() WHERE cursorname='c8'; +-- Session 2 can see all cursors with gp_endpoints(). +2: SELECT sessionid,state FROM gp_endpoints() WHERE cursorname='c8' order by sessionid; + +1: CLOSE c8; +1: END; +2: CLOSE c8; +2: END; + diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/status_wait.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/status_wait.source new file mode 100644 index 00000000000..e1371aea5e8 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/status_wait.source @@ -0,0 +1,241 @@ +-- @Description Tests the state for pg_endpoints AND gp_segment_endpoints(), focus in wait mode +-- +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); + +--------- Test1: Basic test for parallel retrieve interface & close cursor +1: BEGIN; +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT1': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT1'; +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; + +1<: +1: CLOSE c1; +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c1'; + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +1: ROLLBACK; + +---------- Test2: enhanced test for parallel retrieve interface state & cursor auto closed when transaction closed +1: BEGIN; +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; +-- test RETRIEVE success on seg1 +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +-- check initial state after "CHECK PARALLEL RETRIEVE CURSOR" +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; +-- check state if some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; +-- return 0 row instead of reporting error if finished retrieving data from this endpoint, while other endpoint have not finished retrieving. +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +-- finished retrieving all endpoints and check state +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; + +1<: +1: COMMIT; +-- check the cursor auto closed when transaction closed +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c2'; + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +1: ROLLBACK; + +---------- Test3: 2 retrieving sessions connect to the same endpoint report error & cancel QE exec backend +1: BEGIN; +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +0R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; +-- a new retrieve session should report error +3R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; +-- quit this new retrieve session +3Rq: +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +1R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID31 1 1 ; create_sub "$PID31[ \t]*" senderpid31': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); +-- run 'kill -s INT senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s INT ${PID31} && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c3'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c3'; + +---------- Test4: terminate (using signal QUIT) QE exec backend +1: BEGIN; +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c4'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT4"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID41 1 1 ; create_sub "${PID41}[ \t]*" senderpid41': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); +-- run 'kill -s QUIT senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s QUIT ${PID41} && echo "${RAW_STR}" ': SELECT 1; +-- exit this session because the connection closed, so that it will re-connect next time use this session. +0Rq: +0Uq: +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- check no endpoint info left +2q: +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c4'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c4'; +2Rq: + +---------- Test5: terminate (using signal TERM) QE exec backend +1: BEGIN; +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c5'; +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT5"; +-- 1R still bind to Test4 session, so can not retrieve from current endpoint. +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +-- Since seg1 retrieve session is bind to Test4 session. And Test4 session get killed. We need to restart it. +1Rq: +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID51 1 1 ; create_sub "${PID51}[ \t]*" senderpid51': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); +-- run 'kill -s TERM senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s TERM ${PID51} && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c5'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c5'; + +---------- Test6: Cancel (using signal INT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' +1: BEGIN; +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c6'; +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID61 1 1 ; create_sub "${PID61}[ \t]*" QDPid61': select pg_backend_pid(); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT6"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; +-- run 'kill -s INT QDPid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s INT ${PID61} && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c6'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c6'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c6'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c6'; + +---------- Test6.1: Cancel (using signal INT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' without rollback +1: BEGIN; +1: DECLARE c61 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 61 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c61'; +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID611 1 1 ; create_sub "${PID611}[ \t]*" QDPid611': select pg_backend_pid(); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c61', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT61': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT61"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT61': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT61"; +-- run 'kill -s INT QDPid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s INT ${PID611} && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c61'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c61'; +-- quit the session of 'CHECK PARALLEL RETRIEVE CURSOR' and keep other session connected +1q: +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c61'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c61'; +0Rq: +1Rq: + +---------- Test7: terminate (using signal QUIT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' +1: BEGIN; +1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c7'; +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID71 1 1 ; create_sub "${PID71}[ \t]*" QDPid71': select pg_backend_pid(); +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c7', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT7"; +1R: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; +2U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; +-- run 'kill -s QUIT QDPid' to cancel the endpoint execution backend, retrieve session still can work +-- here need to sleep sometime to wait for endpoint QE backend to detect QD connection lost. +0U: @pre_run 'kill -s QUIT ${PID71}&& sleep 5 && echo "${RAW_STR}" ': SELECT 1; +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: +-- quit all sessions on the master, because connect lost +1q: +2q: +-1Uq: +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c7'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c7', -1); +1: ROLLBACK; +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c7'; +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; + +---------- Test8: Status visibilities for different sessions +1: BEGIN; +1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +1: @post_run 'get_tuple_cell SESSION81 1 1 ; create_match_sub_with_spaces $SESSION81 session81': SELECT sessionid,state FROM gp_session_endpoints() WHERE cursorname='c8'; +-- Session 2 can only see its own cursors by default. +2: BEGIN; +2: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +2: @post_run 'get_tuple_cell SESSION82 1 1 ; create_match_sub_with_spaces $SESSION82 session82': SELECT sessionid,state FROM gp_session_endpoints() WHERE cursorname='c8'; +-- Session 2 can see all cursors with gp_endpoints(). +2: SELECT sessionid,state FROM gp_endpoints() WHERE cursorname='c8' order by sessionid; + +1: CLOSE c8; +1: END; +2: CLOSE c8; +2: END; + diff --git a/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/syntax.source b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/syntax.source new file mode 100644 index 00000000000..8946b0d7f84 --- /dev/null +++ b/src/test/singlenode_isolation2/input/parallel_retrieve_cursor/syntax.source @@ -0,0 +1,47 @@ +-- @Description Tests syntax for the PARALLEL RETRIEVE CURSOR statement +-- +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +insert into t1 select generate_series(1,100); + +-- Test1: PARALLEL RETRIEVE CURSOR with other options (WITH HOLD/SCROLL) is not supported +BEGIN; +DECLARE c1 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +DECLARE c2 PARALLEL RETRIEVE CURSOR WITH HOLD FOR SELECT * FROM t1; +ROLLBACK; + +BEGIN; +DECLARE c1 NO SCROLL PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE c2 SCROLL PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +ROLLBACK; + +-- Test2: PARALLEL RETRIEVE CURSOR can not support FETCH/MOVE statement +BEGIN; +DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +FETCH ALL FROM c1; +ROLLBACK; + +BEGIN; +DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +MOVE 10 FROM c1; +ROLLBACK; + +-- Test3: non-PARALLEL RETRIEVE CURSOR can not support the PARALLEL RETRIEVE CURSOR related UDF +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM t1; +SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +ROLLBACK; +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM t1; +SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +ROLLBACK; + +-- Test4: PARALLEL RETRIEVE CURSOR can not support in SPI +BEGIN; +DECLARE c1 CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +DO $$ DECLARE i int4; c2 refcursor = 'c1'; BEGIN FETCH FROM c2 INTO i; RAISE NOTICE '%', i; END; $$; +ROLLBACK; +BEGIN; +DECLARE c3 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +DO $$ DECLARE i int4; c4 refcursor = 'c3'; BEGIN FETCH FROM c4 INTO i; RAISE NOTICE '%', i; END; $$; +ROLLBACK; diff --git a/src/test/singlenode_isolation2/input/pg_basebackup.source b/src/test/singlenode_isolation2/input/pg_basebackup.source new file mode 100644 index 00000000000..5ebc2f56639 --- /dev/null +++ b/src/test/singlenode_isolation2/input/pg_basebackup.source @@ -0,0 +1,33 @@ +-- When pg_basebackup runs with --slot and stream as wal-method +select pg_basebackup(address, dbid, port, true, 'some_replication_slot', '@testtablespace@/some_isolation2_pg_basebackup', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + +-- Then a replication slot gets created on that segment with the slot +-- name and the slot's restart_lsn is not NULL, indicating that the +-- WAL streamer process utilized this slot for streaming WAL during +-- base backup +0U: select slot_name, slot_type, active, restart_lsn is not NULL as slot_was_used from pg_get_replication_slots() where slot_name = 'some_replication_slot'; + +-- When another basebackup is run with the same slot name +select pg_basebackup(address, dbid, port, false, 'some_replication_slot', '@testtablespace@/some_other_isolation2_pg_basebackup', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + +-- Then the backup should exist on the filesystem, ready for mirroring +!\retcode cat @testtablespace@/some_other_isolation2_pg_basebackup/postgresql.auto.conf; + +-- And the replication slot information should be unchanged +0U: select slot_name, slot_type, active, restart_lsn is not NULL as slot_was_used from pg_get_replication_slots() where slot_name = 'some_replication_slot'; + +-- Given we remove the replication slot +0U: select * from pg_drop_replication_slot('some_replication_slot'); +!\retcode rm -rf @testtablespace@/some_isolation2_pg_basebackup; +!\retcode rm -rf @testtablespace@/some_other_isolation2_pg_basebackup; + +-- When pg_basebackup runs without --slot +select pg_basebackup(address, dbid, port, false, null, '@testtablespace@/some_isolation2_pg_basebackup', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + +-- Then there should NOT be a replication slot +0U: select count(1) from pg_get_replication_slots() where slot_name = 'some_replication_slot'; + + +-- Cleanup things we've created +!\retcode rm -rf @testtablespace@/some_isolation2_pg_basebackup; + diff --git a/src/test/singlenode_isolation2/input/pg_basebackup_with_tablespaces.source b/src/test/singlenode_isolation2/input/pg_basebackup_with_tablespaces.source new file mode 100644 index 00000000000..a81daf88ef7 --- /dev/null +++ b/src/test/singlenode_isolation2/input/pg_basebackup_with_tablespaces.source @@ -0,0 +1,106 @@ +-- Given a segment with a database that has a tablespace +!\retcode mkdir -p @testtablespace@/some_basebackup_tablespace; + +drop tablespace if exists some_basebackup_tablespace; +create tablespace some_basebackup_tablespace location '@testtablespace@/some_basebackup_tablespace'; + +-- And a database using the tablespace +drop database if exists some_database_with_tablespace; +create database some_database_with_tablespace tablespace some_basebackup_tablespace; + +-- And a database without using the tablespace +drop database if exists some_database_without_tablespace; +create database some_database_without_tablespace; + +-- 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; +1:@db_name some_database_without_tablespace: CREATE INDEX test_index on test(a) TABLESPACE some_basebackup_tablespace; +2:@db_name some_database_without_tablespace: CREATE TEMP TABLE test_tmp(a INT, b INT) TABLESPACE some_basebackup_tablespace; +2:@db_name some_database_without_tablespace: CREATE INDEX test_tmp_index on test_tmp(a) TABLESPACE some_basebackup_tablespace; + +1q: + +-- When we create a full backup +select pg_basebackup(address, 100, port, true, 'some_replication_slot', '@testtablespace@/some_basebackup_datadir', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + +-- Then we should have two directories in newly created target tablespace, some_database_with_tablespace and some_database_without_tablespace +select count_of_items_in_directory('@testtablespace@/some_basebackup_tablespace/100/GPDB_*/'); + +-- Then we should have two files in newly created target tablespace +-- under the some_database_without_tablespace, test, test_index. Files +-- for temp table are not copied. +select count_of_items_in_database_directory('@testtablespace@/some_basebackup_tablespace/100/GPDB_*/', oid) from pg_database where datname='some_database_without_tablespace'; + +-- Then we should have the tablespace symlink link to the mapped tablespace directory +select validate_tablespace_symlink('@testtablespace@/some_basebackup_datadir', '@testtablespace@/some_basebackup_tablespace', 100, oid) from pg_tablespace where spcname='some_basebackup_tablespace'; + +-- When we create a full backup again for the same target using force overwrite +select pg_basebackup(address, 100, port, false, 'some_replication_slot', '@testtablespace@/some_basebackup_datadir', true, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + +-- Then we should have two directories in newly created target tablespace, some_database_with_tablespace and some_database_without_tablespace +select count_of_items_in_directory('@testtablespace@/some_basebackup_tablespace/100/GPDB_*/'); + +-- Then we should have two files in newly created target tablespace +-- under the some_database_without_tablespace, test, test_index. Files +-- for temp table are not copied. +select count_of_items_in_database_directory('@testtablespace@/some_basebackup_tablespace/100/GPDB_*/', oid) from pg_database where datname='some_database_without_tablespace'; + +-- Then we should have the tablespace symlink link to the mapped tablespace directory +select validate_tablespace_symlink('@testtablespace@/some_basebackup_datadir', '@testtablespace@/some_basebackup_tablespace', 100, oid) from pg_tablespace where spcname='some_basebackup_tablespace'; + +2q: + +-- Cleanup things we've created +0U: select pg_drop_replication_slot('some_replication_slot'); +drop database some_database_with_tablespace; +-- 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. +!\retcode bash -c 'for ((i = 0; i < 5; i++)); do dropdb some_database_without_tablespace && exit 0; done; exit 1'; +drop tablespace some_basebackup_tablespace; +!\retcode rm -rf @testtablespace@/some_basebackup_datadir/; +!\retcode rm -rf @testtablespace@/some_basebackup_tablespace/100; + +-- Given a segment (content=0) with a tablespace mapped to a location different from that of other segments +!\retcode mkdir -p @testtablespace@/some_basebackup_tablespace; +!\retcode mkdir -p @testtablespace@/some_basebackup_tablespace_c0; +!\retcode mkdir -p @testtablespace@/some_basebackup_datadir; + +create tablespace some_basebackup_tablespace LOCATION '@testtablespace@/some_basebackup_tablespace' WITH (content0='@testtablespace@/some_basebackup_tablespace_c0'); + +-- And a database without using the tablespace +drop database if exists some_database_without_tablespace; +create database some_database_without_tablespace; + +-- 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; +1:@db_name some_database_without_tablespace: CREATE INDEX test_index on test(a) TABLESPACE some_basebackup_tablespace; +2:@db_name some_database_without_tablespace: CREATE TEMP TABLE test_tmp(a INT, b INT) TABLESPACE some_basebackup_tablespace; +2:@db_name some_database_without_tablespace: CREATE INDEX test_tmp_index on test_tmp(a) TABLESPACE some_basebackup_tablespace; + +1q: + +-- When we create a full backup +select pg_basebackup(address, 100, port, true, 'some_replication_slot', '@testtablespace@/some_basebackup_datadir', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + +-- Then we should have one directory in the newly created target tablespace, some_database_without_tablespace +select count_of_items_in_directory('@testtablespace@/some_basebackup_tablespace_c0/100/GPDB_*/'); + +-- Then we should have six directories under some_basebackup_tablespace - db id = {1, 3, 4, 6, 7, 8}. 100 should not be present. +select count_of_items_in_directory('@testtablespace@/some_basebackup_tablespace'); + +-- Then we should have the tablespace symlink link to the mapped tablespace directory +select validate_tablespace_symlink('@testtablespace@/some_basebackup_datadir', '@testtablespace@/some_basebackup_tablespace_c0', 100, oid) from pg_tablespace where spcname='some_basebackup_tablespace'; + +2q: + +-- Cleanup things we've created +0U: select pg_drop_replication_slot('some_replication_slot'); +-- 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. +!\retcode bash -c 'for ((i = 0; i < 5; i++)); do dropdb some_database_without_tablespace && exit 0; done; exit 1'; +drop tablespace some_basebackup_tablespace; +!\retcode rm -rf @testtablespace@/some_basebackup_datadir/; +!\retcode rm -rf @testtablespace@/some_basebackup_tablespace_c0/100; + diff --git a/src/test/singlenode_isolation2/input/resgroup/disable_resgroup.source b/src/test/singlenode_isolation2/input/resgroup/disable_resgroup.source new file mode 100644 index 00000000000..4578aa7c11d --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/disable_resgroup.source @@ -0,0 +1,22 @@ +-- for all removed resgroups the cgroup dirs should also be removed +! ls -d @cgroup_mnt_point@/cpu/gpdb/*/; +! ls -d @cgroup_mnt_point@/cpuacct/gpdb/*/; + +-- reset the GUC and restart cluster. +-- start_ignore +! gpconfig -r gp_resource_manager; +! gpconfig -r gp_resource_group_memory_limit; +! gpstop -rai; +-- end_ignore + +SHOW gp_resource_manager; + +-- reset settings +ALTER RESOURCE GROUP admin_group SET concurrency 10; +ALTER RESOURCE GROUP admin_group SET memory_spill_ratio 0; +ALTER RESOURCE GROUP admin_group SET memory_limit 10; +ALTER RESOURCE GROUP admin_group SET memory_shared_quota 80; +ALTER RESOURCE GROUP default_group SET concurrency 20; +ALTER RESOURCE GROUP default_group SET memory_spill_ratio 0; +ALTER RESOURCE GROUP default_group SET memory_limit 0; +ALTER RESOURCE GROUP default_group SET memory_shared_quota 80; diff --git a/src/test/singlenode_isolation2/input/resgroup/enable_resgroup.source b/src/test/singlenode_isolation2/input/resgroup/enable_resgroup.source new file mode 100644 index 00000000000..b6effde64f9 --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/enable_resgroup.source @@ -0,0 +1,77 @@ +-- start_ignore +CREATE LANGUAGE plpython3u; +! rmdir @cgroup_mnt_point@/cpu/gpdb; +! rmdir @cgroup_mnt_point@/cpuacct/gpdb; +! rmdir @cgroup_mnt_point@/cpuset/gpdb; +! mkdir @cgroup_mnt_point@/cpu/gpdb; +! mkdir @cgroup_mnt_point@/cpuacct/gpdb; +! mkdir @cgroup_mnt_point@/cpuset/gpdb; +-- end_ignore + +-- we want to simulate a 3-segment (both master and primary) cluster with 2GB +-- memory and gp_resource_group_memory_limit=100%, suppose: +-- +-- - total: the total memory on the system; +-- - nsegs: the max per-host segment count (including both master and primaries); +-- - limit: the gp_resource_group_memory_limit used for the simulation; +-- +-- then we have: total * limit / nsegs = 2GB * 1.0 / 3 +-- so: limit = 2GB * 1.0 / 3 * nsegs / total +-- +-- with the simulation each primary segment should manage 682MB memory. +DO LANGUAGE plpython3u $$ + import os + import psutil + + mem = psutil.virtual_memory().total + swap = psutil.swap_memory().total + overcommit = int(open('/proc/sys/vm/overcommit_ratio').readline()) + total = swap + mem * overcommit / 100. + + nsegs = int(plpy.execute(''' + SELECT count(hostname) as nsegs + FROM gp_segment_configuration + WHERE preferred_role = 'p' + GROUP BY hostname + ORDER BY count(hostname) DESC + LIMIT 1 + ''')[0]['nsegs']) + + limit = (2 << 30) * 1.0 * nsegs / 3 / total + os.system('gpconfig -c gp_resource_group_memory_limit -v {:f}'.format(limit)) +$$; + +-- enable resource group and restart cluster. +-- start_ignore +! gpconfig -c gp_resource_manager -v group; +! gpconfig -c gp_resource_group_cpu_limit -v 0.9; +! gpconfig -c max_connections -v 250 -m 25; +! gpconfig -c runaway_detector_activation_percent -v 100; +! gpstop -rai; +-- end_ignore + +-- after the restart we need a new connection to run the queries + +0: SHOW gp_resource_manager; + +-- resource queue statistics should not crash +0: SELECT * FROM pg_resqueue_status; +0: SELECT * FROM gp_toolkit.gp_resqueue_status; +0: SELECT * FROM gp_toolkit.gp_resq_priority_backend; + +-- verify the default settings +0: SELECT * from gp_toolkit.gp_resgroup_config; + +-- by default admin_group has concurrency set to -1 which leads to +-- very small memory quota for each resgroup slot, correct it. +0: ALTER RESOURCE GROUP admin_group SET concurrency 2; + +-- explicitly set memory settings +0: ALTER RESOURCE GROUP admin_group SET memory_limit 10; +0: ALTER RESOURCE GROUP default_group SET memory_limit 30; +0: ALTER RESOURCE GROUP admin_group SET memory_shared_quota 80; +0: ALTER RESOURCE GROUP default_group SET memory_shared_quota 80; +-- in later cases we will SHOW memory_spill_ratio as first command +-- to verify that it can be correctly loaded even for bypassed commands +0: ALTER RESOURCE GROUP admin_group SET memory_spill_ratio 10; +0: ALTER RESOURCE GROUP default_group SET memory_spill_ratio 10; diff --git a/src/test/singlenode_isolation2/input/resgroup/enable_resgroup_validate.source b/src/test/singlenode_isolation2/input/resgroup/enable_resgroup_validate.source new file mode 100644 index 00000000000..5e235eb5856 --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/enable_resgroup_validate.source @@ -0,0 +1,40 @@ +-- start_ignore +! chmod 755 @cgroup_mnt_point@/cpu/gpdb/*/; +! chmod 755 @cgroup_mnt_point@/cpuacct/gpdb/*/; +! chmod 755 @cgroup_mnt_point@/cpuset/gpdb/*/; +! rmdir @cgroup_mnt_point@/cpu/gpdb/*/; +! rmdir @cgroup_mnt_point@/cpuacct/gpdb/*/; +! rmdir @cgroup_mnt_point@/cpuset/gpdb/*/; +! rmdir @cgroup_mnt_point@/cpu/gpdb; +! rmdir @cgroup_mnt_point@/cpuacct/gpdb; +! rmdir @cgroup_mnt_point@/cpuset/gpdb; +-- end_ignore + +-- gpdb top group is not created +! gpconfig -c gp_resource_manager -v group; + +-- start_ignore +! mkdir @cgroup_mnt_point@/cpu/gpdb; +! mkdir @cgroup_mnt_point@/cpuacct/gpdb; +! mkdir @cgroup_mnt_point@/cpuset/gpdb; +! chmod 644 @cgroup_mnt_point@/cpu/gpdb; +! chmod 644 @cgroup_mnt_point@/cpuset/gpdb; +-- end_ignore + +-- gpdb directory should have rwx permission +! gpconfig -c gp_resource_manager -v group; + +-- start_ignore +! chmod 755 @cgroup_mnt_point@/cpu/gpdb; +! chmod 755 @cgroup_mnt_point@/cpuset/gpdb; +! chmod 444 @cgroup_mnt_point@/cpu/gpdb/cgroup.procs; +! chmod 444 @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_quota_us; +! chmod 244 @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_period_us; +! chmod 244 @cgroup_mnt_point@/cpuacct/gpdb/cpuacct.usage; +-- end_ignore + +-- cgroup.procs should have writepermission +-- cpu.cfs_quota_us should have write permission +-- cpu.cfs_period_us should have read permission +-- cpuacct.usage should have read permission +! gpconfig -c gp_resource_manager -v group; diff --git a/src/test/singlenode_isolation2/input/resgroup/resgroup_alter_memory.source b/src/test/singlenode_isolation2/input/resgroup/resgroup_alter_memory.source new file mode 100644 index 00000000000..e4ccf71db93 --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/resgroup_alter_memory.source @@ -0,0 +1,545 @@ +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP ROLE IF EXISTS role2_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +DROP RESOURCE GROUP rg2_memory_test; +-- end_ignore + +CREATE OR REPLACE FUNCTION resGroupPalloc(float) RETURNS int AS +'@abs_builddir@/../regress/regress@DLSUFFIX@', 'resGroupPalloc' +LANGUAGE C READS SQL DATA; + +CREATE OR REPLACE FUNCTION hold_memory_by_percent(int, float) RETURNS int AS $$ + SELECT * FROM resGroupPalloc($2) +$$ LANGUAGE sql; + +CREATE OR REPLACE FUNCTION hold_memory_by_percent_on_qe(int, float) RETURNS int AS $$ + SELECT resGroupPalloc($2) FROM gp_dist_random('gp_id') +$$ LANGUAGE sql; + +-- 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 in ('rg1_memory_test', 'rg2_memory_test') + AND query <> '' + ORDER BY sess_id; + +CREATE OR REPLACE VIEW rg_mem_status AS + SELECT groupname, memory_limit, memory_shared_quota + FROM gp_toolkit.gp_resgroup_config + WHERE groupname='rg1_memory_test' OR groupname='rg2_memory_test' + ORDER BY groupid; + +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=60, memory_shared_quota=0, memory_spill_ratio=5); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; + +-- +-- 1.1) alter memory shared quota with low memory usage +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 60; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 50; + +SELECT * FROM rg_mem_status; + +1: SET ROLE TO role1_memory_test; +1: BEGIN; +1: SELECT hold_memory_by_percent(1,0.1); +-- proc 1 gets a quota of 60%*50%/2=15% +-- it has consumed 60%*10%=6% +-- the group has 60%*50%-15%=15% free quota and 60%*50%=30% free shared quota + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 20; + +-- now the group has 60%*80%-15%=33% free quota and 60%*20%=12% free shared quota, +-- so memory_shared_quota shall be the new value. +SELECT * FROM rg_mem_status; + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 70; + +-- now the group has 60%*30%-15%=3% free quota and 60%*70%=42% free shared quota, +-- so memory_shared_quota shall be the new value. +SELECT * FROM rg_mem_status; + +-- +-- 1.2) alter memory shared quota with high memory usage +-- + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 80; + +-- now the group has 60%*20%-15%=-3% free quota and 60%*80%=48% free shared quota, +-- so memory_shared_quota shall be the old value. +SELECT * FROM rg_mem_status; + +1q: + +-- +-- 1.3) alter memory shared quota up and down +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 40; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 60; + +SELECT * FROM rg_mem_status; + +1: SET ROLE TO role1_memory_test; +1: BEGIN; +-- proc1 has a quota of 40%*40%/2=8% +-- rg1 still have 8% free quota + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 4; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 70; +-- rg1 should free some quota, 40%*40%/2*1-40%*30%/4*3=8%-9%=-1% +-- rg1 now have 40%*20%=8% free quota +-- each slot in rg1 requires 40%*30%/4=3% + +2: SET ROLE TO role1_memory_test; +2: BEGIN; +3: SET ROLE TO role1_memory_test; +3: BEGIN; +-- proc2&proc3 each requires a quota of 40%*30%/4=3% +-- rg1 now has 8%-3%*2=2% free quota + +4: SET ROLE TO role1_memory_test; +4&: BEGIN; +-- proc4 shall be pending + +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 40; +-- rg1 now have 40%*60%-8%-3%*2=10% free quota again +-- and now proc4 requires a quota of 40%*60%/4=6%, +-- so it shall be waken up + +4<: +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +1q: +2q: +3q: +4q: + +-- +-- 2.1) alter memory limit with low memory usage (and low memory shared usage) +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 50; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 60; + +SELECT * FROM rg_mem_status; + +1: SET ROLE TO role1_memory_test; +1: BEGIN; +1: SELECT hold_memory_by_percent(1,0.1); +-- proc 1 gets a quota of 50%*40%/2=10% +-- it has consumed 50%*10%=5% +-- the group has 50%*40%-10%=10% free quota and 50%*60%=30% free shared quota + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 60; + +-- now the group has 60%*40%-10%=14% free quota and 60%*60%=36% free shared quota, +-- so memory_limit can be the new value, however at the moment we don't update +-- value when increasing memory_limit, so it's still the old value. +SELECT * FROM rg_mem_status; + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 40; + +-- now the group has 40%*40%-10%=6% free quota and 40%*60%=24% free shared quota, +-- so memory_limit shall be the new value. +SELECT * FROM rg_mem_status; + +-- +-- 2.2) alter memory limit with high memory usage and low memory shared usage +-- + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 10; + +-- now the group has 10%*40%-10%=-6% free quota and 10%*60%=6% free shared quota, +-- so memory_limit shall be the old value. +SELECT * FROM rg_mem_status; + +-- +-- 2.3) alter memory limit with high memory usage and high memory shared usage +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 40; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 60; + +-- now the group has 40%*40%-10%=6% free quota and 40%*60%=24% free shared quota, +SELECT * FROM rg_mem_status; + +1: SELECT hold_memory_by_percent(1,0.5); +-- proc 1 has consumed another 50%*50%=25%, in total 30% +-- now it has consumed all its 10% quota, as well as 20% shared quota +-- now the group has 40%*40%-10%=6% free quota and 40%*60%-20%=4% free shared quota, + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 20; + +-- now the group has 40%*80%-10%=22% free quota and 40%*20%-20%=-12% free shared quota, +-- so memory_shared_quota shall be the old value. +SELECT * FROM rg_mem_status; + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; + +-- now the group has 30%*80%-10%=14% free quota and 30%*20%-20%=-14% free shared quota, +-- so memory_limit shall be the old value. +SELECT * FROM rg_mem_status; + +1q: + +-- +-- 3.1) decrease one group and increase another, no load +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 3; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 0; + +CREATE RESOURCE GROUP rg2_memory_test + WITH (concurrency=3, cpu_rate_limit=10, + memory_limit=30, memory_shared_quota=0, memory_spill_ratio=5); +CREATE ROLE role2_memory_test RESOURCE GROUP rg2_memory_test; + +-- default_group and admin_group consumed 40% memory_limit, +-- so with rg1+rg2=60% all memory_limit is already allocated, +-- so increasing any of them shall fail. +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 31; + +SELECT * FROM rg_mem_status; + +-- but increase could succeed if another rg is first decreased. +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 20; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 40; + +SELECT * FROM rg_mem_status; + +-- +-- 3.2) decrease one group and increase another, with load, no pending +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 3; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 0; + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_SHARED_QUOTA 0; + +SELECT * FROM rg_mem_status; + +11: SET ROLE TO role1_memory_test; +11: BEGIN; +-- proc11 gets a quota of 30%/3=10% from rg1 + +12: SET ROLE TO role1_memory_test; +12: BEGIN; +-- proc12 gets a quota of 30%/3=10% from rg1 + +13: SET ROLE TO role1_memory_test; +13: BEGIN; +-- proc13 gets a quota of 30%/3=10% from rg1 + +-- although all the memory quota is in use, +-- it's still allowed to decrease memory_limit, +-- in such a case rg2 won't get the new quota until any query in rg1 ends. +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 15; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 40; +-- now both rg1 and rg2 still have 30% quota + +21: SET ROLE TO role2_memory_test; +21: BEGIN; +-- proc21 gets a quota of 40%/2=20% from rg2 + +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +11q: +-- proc11 ends, 10%-5%=5% quota is returned to sys + +12q: +-- proc12 ends, 10%-5%=5% quota is returned to sys + +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +-- now rg2 shall be able to get 10% free quota from sys +22: SET ROLE TO role2_memory_test; +22: BEGIN; +-- proc22 gets a quota of 40%/2=20% from rg2 + +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +13q: +21q: +22q: + +-- +-- 3.3) decrease one group and increase another, with load, with pending, +-- memory_shared_quota is 0, +-- waken up by released quota memory from other group +-- + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_SHARED_QUOTA 0; + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 3; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 0; + +SELECT * FROM rg_mem_status; + +11: SET ROLE TO role1_memory_test; +11: BEGIN; +-- proc11 gets a quota of 30%/3=10% from rg1 + +12: SET ROLE TO role1_memory_test; +12: BEGIN; +-- proc12 gets a quota of 30%/3=10% from rg1 + +13: SET ROLE TO role1_memory_test; +13: BEGIN; +-- proc13 gets a quota of 30%/3=10% from rg1 + +-- although all the memory quota is in use, +-- it's still allowed to decrease memory_limit, +-- in such a case rg2 won't get the new quota until any query in rg1 ends. +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 15; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 40; +-- now both rg1 and rg2 still have 30% quota + +21: SET ROLE TO role2_memory_test; +21: BEGIN; + +22: SET ROLE TO role2_memory_test; +22&: BEGIN; + +-- proc21 gets a quota of 40%/2=20% from rg2 +-- proc22 requires a quota of 40%/2=20% from rg2, +-- but as rg2 only has 30%-20%=10% free quota now, +-- it shall be pending. +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +11: END; +11q: +-- proc11 ends, 10%-5%=5% quota is returned to sys + +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +12: END; +12q: +-- proc12 ends, 10%-5%=5% quota is returned to sys + +-- now rg2 can get 10% free quota from sys +-- so proc22 can get enough quota and get executed +22<: +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +13q: +21q: +22q: + +-- +-- 3.4) decrease one group and increase another, with load, with pending, +-- memory_shared_quota > 0 and can be freed, +-- waken up by released shared quota memory from other group +-- + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_SHARED_QUOTA 0; + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 1; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 60; + +SELECT * FROM rg_mem_status; + +11: SET ROLE TO role1_memory_test; +11: BEGIN; +-- proc11 gets a quota of 30%*40%=12% from rg1 +-- rg1 also has a shared quota of 30%*60%=18% + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 20; +-- now each slot in rg1 requires a quota of 20%*40%=8% +-- rg1 has 0% free quota and 20%*60%=12% free shared quota +-- rg1 should release some shared quota, 30%*60%-20%*60%=6% + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 4; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 40; +-- now rg2 has a quota of 30%+6%=36% +-- now each slot in rg2 requires a quota of 40%/4=10% + +21: SET ROLE TO role2_memory_test; +21: BEGIN; +22: SET ROLE TO role2_memory_test; +22: BEGIN; +23: SET ROLE TO role2_memory_test; +23: BEGIN; +-- proc21~proc23 each gets a quota of 40%/4=10% +-- rg2 still has 36%-10%*3=6% free quota + +24: SET ROLE TO role2_memory_test; +24&: BEGIN; +-- proc24 shall be pending. + +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 30; +-- now rg1 should release some shared quota, 20%*60%-20%*30%=6% +-- now rg2 can get at most 6% new quota, but as it already has 36%, +-- so rg2 actually gets 4% new quota. +-- now rg2 has 40% quota, the free quota is 40%-30%=10%, +-- just enough for proc24 to wake up. + +24<: +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +11q: +21q: +22q: +23q: +24q: + +-- +-- 3.5) decrease one group and increase another, with load, with pending +-- memory_shared_quota > 0 and can not be freed, +-- waken up by released quota memory from other group +-- + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_SHARED_QUOTA 0; + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 10; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 90; + +SELECT * FROM rg_mem_status; + +11: SET ROLE TO role1_memory_test; +11: BEGIN; +11: SELECT hold_memory_by_percent(1,0.90); +-- proc11 gets a quota of 30%*10%/10=0.3% from rg1 +-- rg1 has a free quota of 30%*10%-0.3%=2.7% +-- rg1 has a shared quota of 30%*90%=27%, +-- free shared quota is 27%-(30%*90%-0.3%)=0.3% + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 20; +-- now each slot in rg1 requires a quota of 20%*10%/10=0.2% +-- rg1 releases some quota, 0.1%*9=0.9%, +-- so new quota is 2.1%, new free quota is 2.1%-0.3%=1.8% +-- rg1 releases some shared quota, 27%-max(20%*90%,26.7%)=0.3%, +-- so new shared quota is 26.7%, new free shared quota is 0% + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 4; +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 40; +-- now rg2 has a quota of 30%+1.2%=31.2% +-- now each slot in rg2 requires a quota of 40%/4=10% + +21: SET ROLE TO role2_memory_test; +21: BEGIN; +22: SET ROLE TO role2_memory_test; +22: BEGIN; +23: SET ROLE TO role2_memory_test; +23: BEGIN; +-- proc21~proc23 each gets a quota of 40%/4=10% +-- rg2 still has 31.2%-10%*3=1.2% free quota + +24: SET ROLE TO role2_memory_test; +24&: BEGIN; +-- proc24 shall be pending. + +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 30; +-- rg1 can't free any shared quota as all of them are in use by proc11 + +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +11q: +-- rg1 releases 0.3%-0.2%=0.1% quota and 26.7%-18%=8.7% +-- so rg2 gets 8.8% new quota +-- now rg2 has 40% quota, free quota is 10% +-- so proc24 shall be waken up + +24<: +SELECT * FROM rg_mem_status; +SELECT * FROM rg_activity_status; + +21q: +22q: +23q: +24q: + +-- cleanup +DROP VIEW rg_mem_status; +DROP ROLE role1_memory_test; +DROP ROLE role2_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +DROP RESOURCE GROUP rg2_memory_test; + +-- +-- Test PrepareTransaction report an error +-- +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +CREATE ROLE rg_test_role RESOURCE GROUP rg_test_group; + +SET debug_dtm_action = "fail_begin_command"; +SET debug_dtm_action_target = "protocol"; +SET debug_dtm_action_protocol = "prepare"; +SET debug_dtm_action_segment = 0; + +-- ALTER should fail and the memory_limit in both catalog and share memory are +-- still 5% +ALTER RESOURCE GROUP rg_test_group set memory_limit 1; + +RESET debug_dtm_action; +RESET debug_dtm_action_target; +RESET debug_dtm_action_protocol; +RESET debug_dtm_action_segment; + +-- should still be 5% on both QD and QE +select memory_limit from gp_toolkit.gp_resgroup_config where groupname = 'rg_test_group'; + +-- +-- Test error happen on commit_prepare, DDL success after retry +-- +SET debug_dtm_action = "fail_begin_command"; +SET debug_dtm_action_target = "protocol"; +SET debug_dtm_action_protocol = "commit_prepared"; +SET debug_dtm_action_segment = 0; + +-- ALTER should success +ALTER RESOURCE GROUP rg_test_group set memory_limit 4; + +RESET debug_dtm_action; +RESET debug_dtm_action_target; +RESET debug_dtm_action_protocol; +RESET debug_dtm_action_segment; + +-- should still be 4% on both QD and QE +select memory_limit from gp_toolkit.gp_resgroup_config where groupname = 'rg_test_group'; + +DROP ROLE rg_test_role; +DROP RESOURCE GROUP rg_test_group; diff --git a/src/test/singlenode_isolation2/input/resgroup/resgroup_bypass.source b/src/test/singlenode_isolation2/input/resgroup/resgroup_bypass.source new file mode 100644 index 00000000000..7874bfdbd80 --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/resgroup_bypass.source @@ -0,0 +1,232 @@ +DROP ROLE IF EXISTS role_bypass_test; +-- start_ignore +DROP RESOURCE GROUP rg_bypass_test; +-- end_ignore + +-- +-- setup +-- + +CREATE RESOURCE GROUP rg_bypass_test WITH + (concurrency=2, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50); +CREATE ROLE role_bypass_test RESOURCE GROUP rg_bypass_test; + +CREATE OR REPLACE FUNCTION repeatPalloc(int, int) RETURNS int AS +'@abs_builddir@/../regress/regress@DLSUFFIX@', 'repeatPalloc' +LANGUAGE C READS SQL DATA; + +CREATE OR REPLACE FUNCTION hold_memory(int, int) RETURNS int AS $$ + SELECT * FROM repeatPalloc(1, $2) +$$ LANGUAGE sql; + +CREATE OR REPLACE VIEW eat_memory_on_qd_small AS + SELECT hold_memory(0,12); + +CREATE OR REPLACE VIEW eat_memory_on_qd_large AS + SELECT hold_memory(0,100); + +CREATE OR REPLACE VIEW eat_memory_on_one_slice AS + SELECT count(null) + FROM + gp_dist_random('gp_id') t1 + WHERE hold_memory(t1.dbid,4)=0 + ; + +CREATE OR REPLACE VIEW eat_memory_on_slices AS + SELECT count(null) + FROM + gp_dist_random('gp_id') t1, + gp_dist_random('gp_id') t2 + WHERE hold_memory(t1.dbid,4)=0 + AND hold_memory(t2.dbid,4)=0 + ; + +CREATE OR REPLACE FUNCTION round_test(float, integer) RETURNS float AS $$ + SELECT round($1 / $2) * $2 +$$ LANGUAGE sql; + +CREATE OR REPLACE VIEW memory_result AS + SELECT rsgname, ismaster, round_test(avg(memory_usage), 1) AS avg_mem + FROM( + SELECT rsgname, + CASE (j->'key')::text WHEN '"-1"'::text THEN 1 ELSE 0 END AS ismaster, + ((j->'value')->>'used')::int AS memory_usage + FROM( + SELECT rsgname, row_to_json(json_each(memory_usage::json)) AS j FROM + gp_toolkit.gp_resgroup_status + WHERE rsgname='rg_bypass_test' + )a + )b GROUP BY (rsgname, ismaster) ORDER BY rsgname, ismaster; + +GRANT ALL ON eat_memory_on_qd_small TO role_bypass_test; +GRANT ALL ON eat_memory_on_qd_large TO role_bypass_test; +GRANT ALL ON eat_memory_on_one_slice TO role_bypass_test; +GRANT ALL ON eat_memory_on_slices TO role_bypass_test; +GRANT ALL ON memory_result TO role_bypass_test; + +-- +-- SET command should be bypassed +-- + +ALTER RESOURCE GROUP rg_bypass_test SET concurrency 0; +61: SET ROLE role_bypass_test; +61&: SELECT 1; +ALTER RESOURCE GROUP rg_bypass_test set concurrency 1; +61<: +ALTER RESOURCE GROUP rg_bypass_test set concurrency 0; +61: SET enable_hashagg to on; +61: SHOW enable_hashagg; +61: invalid_syntax; +61q: + +-- +-- gp_resource_group_bypass +-- + +ALTER RESOURCE GROUP rg_bypass_test SET concurrency 0; +61: SET ROLE role_bypass_test; +61: SET gp_resource_group_bypass to on; +61: SHOW gp_resource_group_bypass; +61: CREATE TABLE table_bypass_test (c1 int); +61: INSERT INTO table_bypass_test SELECT generate_series(1,100); +61: SELECT count(*) FROM table_bypass_test; +61: DROP TABLE table_bypass_test; +61: SET gp_resource_group_bypass to off; +61: SHOW gp_resource_group_bypass; +61q: + +-- +-- gp_resource_group_bypass is not allowed inside a transaction block +-- + +61: BEGIN; +61: SET gp_resource_group_bypass to on; +61: ABORT; +61q: + +-- +-- gp_resource_group_bypass is not allowed inside a function +-- + +DROP FUNCTION IF EXISTS func_resgroup_bypass_test(int); +CREATE FUNCTION func_resgroup_bypass_test(c1 int) RETURNS INT AS $$ + SET gp_resource_group_bypass TO ON; /* inside a function */ + SELECT 1 +$$ LANGUAGE SQL; +SELECT func_resgroup_bypass_test(1); +DROP FUNCTION func_resgroup_bypass_test(int); + + +-- +-- memory limit in bypass mode, on qd +-- +-- orca will allocate 10M memory error buffer before optimization, and release +-- it after that, so if optimizer is set to on, it will fail when the memory +-- usage reaches 24M +-- +-- GPDB_12_MERGE_FIXME: when this case running under orca and without cassert +-- it will output different result from the case with cassert. This might be +-- because of without cassert, it does use less memory. To make the case green +-- to unblock merging into master, add an extra ansfile for this case. We should +-- consider adding some error interface for these cases post-merge. + +61: SET ROLE role_bypass_test; +61: SET gp_resource_group_bypass to on; +61: BEGIN; +61: SELECT * FROM eat_memory_on_qd_small; +SELECT * FROM memory_result; +61: SELECT * FROM eat_memory_on_qd_large; +SELECT * FROM memory_result; +61: ABORT; +61: BEGIN; +SELECT 1 FROM memory_result where avg_mem > 10 and ismaster = 1; +61q: + +-- +-- memory limit in bypass mode, on one slice +-- + +61: SET ROLE role_bypass_test; +61: SET gp_resource_group_bypass to on; +61: BEGIN; +61: SELECT * FROM eat_memory_on_one_slice; +SELECT * FROM memory_result; +61: SELECT * FROM eat_memory_on_one_slice; +SELECT * FROM memory_result; +61: SELECT * FROM eat_memory_on_one_slice; +SELECT * FROM memory_result; +61: ABORT; +61: BEGIN; +SELECT * FROM memory_result; +61q: + +-- +-- memory limit in bypass mode, on slices +-- + +61: SET ROLE role_bypass_test; +61: SET gp_resource_group_bypass to on; +61: BEGIN; +61: SELECT * FROM eat_memory_on_slices; +SELECT * FROM memory_result; +61: SELECT * FROM eat_memory_on_slices; +SELECT * FROM memory_result; +61: SELECT * FROM eat_memory_on_slices; +SELECT * FROM memory_result; +61: ABORT; +61: BEGIN; +SELECT * FROM memory_result; +61q: + +-- +-- gp_resgroup_status.num_running is updated in bypass mode +-- + +61: SET ROLE role_bypass_test; +61: SET gp_resource_group_bypass to on; +61&: SELECT pg_sleep(10); +62: SET ROLE role_bypass_test; +62: SET gp_resource_group_bypass to on; +62&: SELECT pg_sleep(20); +SELECT num_running FROM gp_toolkit.gp_resgroup_status + WHERE rsgname='rg_bypass_test'; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity + WHERE rsgname='rg_bypass_test'; +61<: +62<: +61q: +62q: + +-- +-- pg_stat_activity is updated in bypass mode +-- + +61: SET ROLE role_bypass_test; +61: SET gp_resource_group_bypass to on; +61&: SELECT pg_sleep(10); +62: SET ROLE role_bypass_test; +62: SET gp_resource_group_bypass to on; +62&: SELECT pg_sleep(20); +SELECT query FROM pg_stat_activity + WHERE rsgname='rg_bypass_test'; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity + WHERE rsgname='rg_bypass_test'; +61<: +62<: +61q: +62q: + +-- +-- cleanup +-- + +REVOKE ALL ON eat_memory_on_qd_small FROM role_bypass_test; +REVOKE ALL ON eat_memory_on_qd_large FROM role_bypass_test; +REVOKE ALL ON eat_memory_on_one_slice FROM role_bypass_test; +REVOKE ALL ON eat_memory_on_slices FROM role_bypass_test; +REVOKE ALL ON memory_result FROM role_bypass_test; + +DROP ROLE role_bypass_test; +DROP RESOURCE GROUP rg_bypass_test; + +-- vi:filetype=sql: diff --git a/src/test/singlenode_isolation2/input/resgroup/resgroup_cpu_rate_limit.source b/src/test/singlenode_isolation2/input/resgroup/resgroup_cpu_rate_limit.source new file mode 100644 index 00000000000..28f26303f2e --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/resgroup_cpu_rate_limit.source @@ -0,0 +1,510 @@ +-- start_ignore +DROP VIEW IF EXISTS cancel_all; +DROP ROLE IF EXISTS role1_cpu_test; +DROP ROLE IF EXISTS role2_cpu_test; +DROP RESOURCE GROUP rg1_cpu_test; +DROP RESOURCE GROUP rg2_cpu_test; + +CREATE LANGUAGE plpython3u; +-- end_ignore + +-- +-- helper functions, tables and views +-- + +DROP TABLE IF EXISTS cpu_usage_samples; +CREATE TABLE cpu_usage_samples (sample text); + +-- 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 rsgname, cpu_usage FROM gp_toolkit.gp_resgroup_status + ''') + json_text = json.dumps(dict([(row['rsgname'], json.loads(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; + +-- 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. +-- return true if the practical value is close to the expected value. +CREATE OR REPLACE FUNCTION verify_cpu_usage(groupname TEXT, expect_cpu_usage INT, err_rate INT) +RETURNS BOOL AS $$ + import json + import functools + + def add_vector(vec1, vec2): + r = dict() + for seg_id1, value1 in vec1.items(): + r[seg_id1] = value1 + vec2[seg_id1] + return r + + def verify_cpu_usage(): + all_info = plpy.execute(''' + SELECT sample::json->'{name}' AS cpu FROM cpu_usage_samples + '''.format(name=groupname)) + usage_sum = functools.reduce(add_vector, + [json.loads(row['cpu']) for row in all_info]) + usage = [(float(v) / all_info.nrows()) + for k, v in usage_sum.items() if k != "-1"] + avg = sum(usage) / len(usage) + return abs(avg - expect_cpu_usage) <= err_rate + + return verify_cpu_usage() +$$ LANGUAGE plpython3u; + +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 VIEW cancel_all AS + SELECT pg_cancel_backend(pid) + FROM pg_stat_activity + WHERE query LIKE 'SELECT * FROM % WHERE busy%'; + +-- create two resource groups +CREATE RESOURCE GROUP rg1_cpu_test WITH (concurrency=5, cpu_rate_limit=10, memory_limit=20); +CREATE RESOURCE GROUP rg2_cpu_test WITH (concurrency=5, cpu_rate_limit=20, memory_limit=20); + +-- +-- check gpdb cgroup configuration +-- +DO LANGUAGE PLPYTHON3U $$ + import subprocess + + cgroot = '@cgroup_mnt_point@' + + def get_cgroup_prop(prop): + fullpath = cgroot + '/' + prop + return int(open(fullpath).readline()) + + def run_command(cmd): + return subprocess.check_output(cmd.split()).decode() + + def show_guc(guc): + return plpy.execute('SHOW {}'.format(guc))[0][guc] + + # + # check gpdb top-level cgroup configuration + # + + # get top-level cgroup props + cfs_quota_us = get_cgroup_prop('/cpu/gpdb/cpu.cfs_quota_us') + cfs_period_us = get_cgroup_prop('/cpu/gpdb/cpu.cfs_period_us') + shares = get_cgroup_prop('/cpu/gpdb/cpu.shares') + + # get system props + ncores = int(run_command('nproc')) + + # get global gucs + gp_resource_group_cpu_limit = float(show_guc('gp_resource_group_cpu_limit')) + gp_resource_group_cpu_priority = int(show_guc('gp_resource_group_cpu_priority')) + + # cfs_quota_us := cfs_period_us * ncores * gp_resource_group_cpu_limit + assert cfs_quota_us == cfs_period_us * ncores * gp_resource_group_cpu_limit + + # shares := 1024 * gp_resource_group_cpu_priority + assert shares == 1024 * gp_resource_group_cpu_priority + + # SUB/shares := TOP/shares * cpu_rate_limit + def check_group_shares(name): + cpu_rate_limit = int(plpy.execute(''' + SELECT value + FROM pg_resgroupcapability c, pg_resgroup g + WHERE c.resgroupid=g.oid + AND reslimittype=2 + AND g.rsgname='{}' + '''.format(name))[0]['value']) + oid = int(plpy.execute(''' + SELECT oid FROM pg_resgroup WHERE rsgname='{}' + '''.format(name))[0]['oid']) + sub_shares = get_cgroup_prop('/cpu/gpdb/{}/cpu.shares'.format(oid)) + assert sub_shares == shares * cpu_rate_limit / 100 + + # check default groups + check_group_shares('default_group') + check_group_shares('admin_group') + + # check user groups + check_group_shares('rg1_cpu_test') + check_group_shares('rg2_cpu_test') +$$; + +-- lower admin_group's cpu_rate_limit to minimize its side effect +ALTER RESOURCE GROUP admin_group SET cpu_rate_limit 1; + +-- create two roles and assign them to above groups +CREATE ROLE role1_cpu_test RESOURCE GROUP rg1_cpu_test; +CREATE ROLE role2_cpu_test RESOURCE GROUP rg2_cpu_test; +GRANT ALL ON FUNCTION busy() TO role1_cpu_test; +GRANT ALL ON FUNCTION busy() TO role2_cpu_test; + +-- prepare parallel queries in the two groups +10: SET ROLE TO role1_cpu_test; +11: SET ROLE TO role1_cpu_test; +12: SET ROLE TO role1_cpu_test; +13: SET ROLE TO role1_cpu_test; +14: SET ROLE TO role1_cpu_test; + +20: SET ROLE TO role2_cpu_test; +21: SET ROLE TO role2_cpu_test; +22: SET ROLE TO role2_cpu_test; +23: SET ROLE TO role2_cpu_test; +24: SET ROLE TO role2_cpu_test; + +-- +-- now we get prepared. +-- +-- on empty load the cpu usage shall be 0% +-- + +-- +-- a group should burst to use all the cpu usage +-- when it's the only one with running queries. +-- +-- however the overall cpu usage is controlled by a GUC +-- gp_resource_group_cpu_limit which is 90% by default. +-- +-- so the cpu usage shall be 90% +-- + +10&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +11&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +12&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +13&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +14&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +-- start_ignore +TRUNCATE TABLE cpu_usage_samples; +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +TRUNCATE TABLE cpu_usage_samples; +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +-- end_ignore + +SELECT verify_cpu_usage('rg1_cpu_test', 90, 10); + +-- start_ignore +SELECT * FROM cancel_all; + +10<: +11<: +12<: +13<: +14<: +-- end_ignore + +10q: +11q: +12q: +13q: +14q: + +10: SET ROLE TO role1_cpu_test; +11: SET ROLE TO role1_cpu_test; +12: SET ROLE TO role1_cpu_test; +13: SET ROLE TO role1_cpu_test; +14: SET ROLE TO role1_cpu_test; + +-- +-- when there are multiple groups with parallel queries, +-- they should share the cpu usage by their cpu_usage settings, +-- +-- rg1_cpu_test:rg2_cpu_test is 0.1:0.2 => 1:2, so: +-- +-- - rg1_cpu_test gets 90% * 1/3 => 30%; +-- - rg2_cpu_test gets 90% * 2/3 => 60%; +-- + +10&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +11&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +12&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +13&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +14&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +20&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +21&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +22&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +23&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +24&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +-- start_ignore +TRUNCATE TABLE cpu_usage_samples; +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +TRUNCATE TABLE cpu_usage_samples; +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +SELECT fetch_sample(); +SELECT pg_sleep(1.7); +-- end_ignore + +SELECT verify_cpu_usage('rg1_cpu_test', 30, 10); +SELECT verify_cpu_usage('rg2_cpu_test', 60, 10); + +-- start_ignore +SELECT * FROM cancel_all; + +10<: +11<: +12<: +13<: +14<: + +20<: +21<: +22<: +23<: +24<: + +10q: +11q: +12q: +13q: +14q: + + +20q: +21q: +22q: +23q: +24q: +-- end_ignore + +-- start_ignore +! gpconfig -c gp_resource_group_cpu_ceiling_enforcement -v on; +! gpstop -rai; +-- end_ignore + +-- prepare parallel queries in the two groups +10: SET ROLE TO role1_cpu_test; +11: SET ROLE TO role1_cpu_test; +12: SET ROLE TO role1_cpu_test; +13: SET ROLE TO role1_cpu_test; +14: SET ROLE TO role1_cpu_test; + +20: SET ROLE TO role2_cpu_test; +21: SET ROLE TO role2_cpu_test; +22: SET ROLE TO role2_cpu_test; +23: SET ROLE TO role2_cpu_test; +24: SET ROLE TO role2_cpu_test; + +-- +-- now we get prepared. +-- +-- on empty load the cpu usage shall be 0% +-- +-- +-- a group should not burst to use all the cpu usage +-- when it's the only one with running queries. +-- +-- so the cpu usage shall be 10% +-- + +10&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +11&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +12&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +13&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +14&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +-- start_ignore +1:TRUNCATE TABLE cpu_usage_samples; +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:TRUNCATE TABLE cpu_usage_samples; +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +-- end_ignore + +1:SELECT verify_cpu_usage('rg1_cpu_test', 10, 2); + +-- start_ignore +1:SELECT * FROM cancel_all; + +10<: +11<: +12<: +13<: +14<: +-- end_ignore + +10q: +11q: +12q: +13q: +14q: + +10: SET ROLE TO role1_cpu_test; +11: SET ROLE TO role1_cpu_test; +12: SET ROLE TO role1_cpu_test; +13: SET ROLE TO role1_cpu_test; +14: SET ROLE TO role1_cpu_test; + +-- +-- when there are multiple groups with parallel queries, +-- they should follow the ceiling enforcement of the cpu usage. +-- +-- rg1_cpu_test:rg2_cpu_test is 0.1:0.2, so: +-- +-- - rg1_cpu_test gets 10%; +-- - rg2_cpu_test gets 20%; +-- + +10&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +11&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +12&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +13&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +14&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +20&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +21&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +22&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +23&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +24&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +-- start_ignore +1:TRUNCATE TABLE cpu_usage_samples; +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:TRUNCATE TABLE cpu_usage_samples; +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +1:SELECT fetch_sample(); +1:SELECT pg_sleep(1.7); +-- end_ignore + +1:SELECT verify_cpu_usage('rg1_cpu_test', 10, 2); +1:SELECT verify_cpu_usage('rg2_cpu_test', 20, 2); + +-- start_ignore +1:SELECT * FROM cancel_all; + +10<: +11<: +12<: +13<: +14<: + +20<: +21<: +22<: +23<: +24<: + +10q: +11q: +12q: +13q: +14q: + + +20q: +21q: +22q: +23q: +24q: + +1q: +-- end_ignore + +-- start_ignore +! gpconfig -c gp_resource_group_cpu_ceiling_enforcement -v off; +! gpstop -rai; +-- end_ignore + +-- restore admin_group's cpu_rate_limit +2:ALTER RESOURCE GROUP admin_group SET cpu_rate_limit 10; + +-- cleanup +2:REVOKE ALL ON FUNCTION busy() FROM role1_cpu_test; +2:REVOKE ALL ON FUNCTION busy() FROM role2_cpu_test; +2:DROP ROLE role1_cpu_test; +2:DROP ROLE role2_cpu_test; +2:DROP RESOURCE GROUP rg1_cpu_test; +2:DROP RESOURCE GROUP rg2_cpu_test; +-- start_ignore +2:DROP LANGUAGE plpython3u CASCADE; +-- end_ignore diff --git a/src/test/singlenode_isolation2/input/resgroup/resgroup_cpuset.source b/src/test/singlenode_isolation2/input/resgroup/resgroup_cpuset.source new file mode 100644 index 00000000000..f37a9d6dbac --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/resgroup_cpuset.source @@ -0,0 +1,305 @@ +-- start_ignore +DROP LANGUAGE IF EXISTS plpython3u; +DROP VIEW IF EXISTS busy; +DROP VIEW IF EXISTS cancel_all; +DROP TABLE IF EXISTS bigtable; +CREATE LANGUAGE plpython3u; +-- end_ignore + +CREATE RESOURCE GROUP rg1_cpuset_test WITH (memory_limit = 10, cpuset='0'); +CREATE ROLE role1_cpuset_test RESOURCE GROUP rg1_cpuset_test; + +-- check whether the queries running in the specific group on the specific core set +-- @param grp: the resource group queries running in +-- @param cpuset: cpu cores which the queries should only be run on them, e.g. 0,1 +-- @return bool: true/false indicating whether it corresponds to the rule +CREATE FUNCTION check_cpuset(grp TEXT, cpuset TEXT) RETURNS BOOL AS $$ +import subprocess +import pg +import time +import re + +conn = pg.connect(dbname="isolation2resgrouptest") +pt = re.compile(r'con(\d+)') + +def check(expect_cpus, sess_ids): + procs = subprocess.check_output(['ps', '-eF']).decode().split('\n') + head, proc_stats = procs[0], procs[1:] + PSR = [id for id, attr in enumerate(head.split()) if attr.strip() == 'PSR'][0] + cpus = [proc_stat.split()[PSR].strip() + for proc_stat in proc_stats + if 'postgres' in proc_stat and + pt.findall(proc_stat) and + set(pt.findall(proc_stat)).issubset(sess_ids)] + return set(cpus).issubset(set(expect_cpus)) + +def get_all_sess_ids_in_group(group_name): + sql = "select sess_id from pg_stat_activity where rsgname = '%s'" % group_name + result = conn.query(sql).getresult() + return set([str(r[0]) for r in result]) + +expect_cpu = [] +conf = cpuset +if conf == '': + fd = open("@cgroup_mnt_point@/cpuset/gpdb/cpuset.cpus") + line = fd.readline() + fd.close() + conf = line.strip('\n') + +tokens = conf.split(",") +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 a resource group that contains all the cpu cores +CREATE FUNCTION create_allcores_group(grp TEXT) RETURNS BOOL AS $$ +import pg +conn = pg.connect(dbname="isolation2resgrouptest") +file = "@cgroup_mnt_point@/cpuset/gpdb/cpuset.cpus" +fd = open(file) +line = fd.readline() +fd.close() +line = line.strip('\n') +sql = "create resource group " + grp + " with (" \ + + "memory_limit=1, cpuset='" + line + "')" +result = conn.query(sql) + +file = "@cgroup_mnt_point@/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; + +-- check whether the cpuset value in cgroup is valid according to the rule +CREATE FUNCTION check_rules() RETURNS BOOL AS $$ +import pg + +def get_all_group_which_cpuset_is_set(): + sql = "select groupid,cpuset from gp_toolkit.gp_resgroup_config where cpuset != '-1'" + result = conn.query(sql).getresult() + return result + +def parse_cpuset(line): + line = line.strip('\n') + if len(line) == 0: + return set([]) + tokens = line.split(",") + cpuset = [] + 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): + cpuset.append(str(num)) + else: + cpuset.append(token) + return set(cpuset) + +def get_cgroup_cpuset(group): + group = str(group) + if group == '0': + file = "@cgroup_mnt_point@/cpuset/gpdb/cpuset.cpus" + else: + file = "@cgroup_mnt_point@/cpuset/gpdb/" + group + "/cpuset.cpus" + fd = open(file) + line = fd.readline() + fd.close() + return parse_cpuset(line) + +conn = pg.connect(dbname="isolation2resgrouptest") +config_groups = get_all_group_which_cpuset_is_set() +groups_cpuset = set([]) +# check whether cpuset in config and cgroup are same, and have no overlap +for config_group in config_groups: + groupid = config_group[0] + cpuset_value = config_group[1] + config_cpuset = parse_cpuset(cpuset_value) + cgroup_cpuset = get_cgroup_cpuset(groupid) + if len(groups_cpuset & cgroup_cpuset) > 0: + return False + groups_cpuset |= cgroup_cpuset + 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 TABLE bigtable AS + SELECT i AS c1, 'abc' AS c2 + FROM generate_series(1,50000) i; + +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 cancel_all AS + SELECT pg_cancel_backend(pid) + FROM pg_stat_activity + WHERE query LIKE 'SELECT * FROM busy%'; + +GRANT ALL ON busy TO role1_cpuset_test; + +-- we suppose core 0 & 1 are available + +10: SET ROLE TO role1_cpuset_test; +10: BEGIN; +10&: SELECT * FROM busy; + +select pg_sleep(2); + +11: BEGIN; +11: SELECT check_cpuset('rg1_cpuset_test', '0'); + +ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '1'; +select pg_sleep(2); + +11: SELECT check_cpuset('rg1_cpuset_test', '1'); + +ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '0,1'; +select pg_sleep(2); + +11: SELECT check_cpuset('rg1_cpuset_test', '0,1'); +11: END; + +-- change to cpu_rate_limit while the transaction is running +ALTER RESOURCE GROUP rg1_cpuset_test SET cpu_rate_limit 10; + +-- cancel the transaction +-- start_ignore +select * from cancel_all; + +10<: +10q: +11q: +-- end_ignore + +-- test whether the cpu_rate_limit had taken effect +10: SET ROLE TO role1_cpuset_test; +10: BEGIN; +10&: SELECT * FROM busy; + +select pg_sleep(2); + +11: BEGIN; +11: SELECT check_cpuset('rg1_cpuset_test', ''); + +-- cancel the transaction +-- start_ignore +select * from cancel_all; + +10<: +10q: +11q: +-- end_ignore + +-- test cpu_usage +10: SET ROLE TO role1_cpuset_test; +10: BEGIN; +10&: SELECT * FROM busy; + +select pg_sleep(2); + +11: BEGIN; +11: select (cpu_usage::json->>'0')::float > 50 from gp_toolkit.gp_resgroup_status where rsgname='rg1_cpuset_test'; +-- cancel the transaction +-- start_ignore +select * from cancel_all; + +10<: +10q: +11q: +-- end_ignore + +-- positive: cgroup cpuset must correspond to config cpuset +-- default group value must be valid +-- suppose the cores numbered 0 & 1 are available +SELECT check_rules(); +CREATE RESOURCE GROUP rg1_test_group WITH (memory_limit=10, cpuset='0'); +SELECT check_rules(); +CREATE RESOURCE GROUP rg2_test_group WITH (memory_limit=10, cpuset='1'); +SELECT check_rules(); +ALTER RESOURCE GROUP rg1_test_group SET cpu_rate_limit 1; +SELECT check_rules(); +ALTER RESOURCE GROUP rg1_test_group SET cpuset '0'; +SELECT check_rules(); +ALTER RESOURCE GROUP rg1_test_group SET cpu_rate_limit 1; +SELECT check_rules(); +DROP RESOURCE GROUP rg1_test_group; +SELECT check_rules(); +DROP RESOURCE GROUP rg2_test_group; +SELECT check_rules(); +-- positive: create a resource group contains all cpu core +-- the minimum numbered core left in default cpuset group +SELECT create_allcores_group('rg1_test_group'); +SELECT check_rules(); +DROP RESOURCE GROUP rg1_test_group; +SELECT check_rules(); +-- negative: simulate DDL fail +-- create fail +SELECT gp_inject_fault('create_resource_group_fail', 'error', 1); +CREATE RESOURCE GROUP rg1_test_group WITH (memory_limit=10, cpuset='0'); +SELECT groupid, groupname, cpuset + FROM gp_toolkit.gp_resgroup_config + WHERE cpuset != '-1'; +SELECT check_rules(); +SELECT gp_inject_fault('create_resource_group_fail', 'reset', 1); +-- start_ignore +DROP RESOURCE GROUP rg1_test_group; +-- end_ignore + +REVOKE ALL ON busy FROM role1_cpuset_test; +DROP ROLE role1_cpuset_test; +DROP RESOURCE GROUP rg1_cpuset_test; +DROP FUNCTION check_rules(); +DROP FUNCTION check_cpuset(TEXT, TEXT); +DROP FUNCTION create_allcores_group(TEXT); +-- start_ignore +DROP LANGUAGE plpython3u CASCADE; +-- end_ignore +DROP VIEW cancel_all; +DROP VIEW busy; +DROP TABLE bigtable; diff --git a/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_limit.source b/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_limit.source new file mode 100644 index 00000000000..351113dec98 --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_limit.source @@ -0,0 +1,504 @@ +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +DROP RESOURCE GROUP rg2_memory_test; +-- end_ignore + +CREATE OR REPLACE FUNCTION resGroupPalloc(float) RETURNS int AS +'@abs_builddir@/../regress/regress@DLSUFFIX@', 'resGroupPalloc' +LANGUAGE C READS SQL DATA; + +CREATE OR REPLACE FUNCTION hold_memory_by_percent(float) RETURNS int AS $$ + SELECT * FROM resGroupPalloc($1) +$$ LANGUAGE sql; + +CREATE OR REPLACE VIEW rg_mem_status AS + SELECT groupname, memory_limit, memory_shared_quota + FROM gp_toolkit.gp_resgroup_config + WHERE groupname='rg1_memory_test' OR groupname='rg2_memory_test' + ORDER BY groupid; + +CREATE OR REPLACE VIEW memory_result AS SELECT rsgname, memory_usage from gp_toolkit.gp_resgroup_status; + +-- 1) single allocation +-- Group Share Quota = 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52% => 52% +-- rg1's slot quota: 52% / 2 * 2 => 52% +-- rg1's single slot quota: 52% / 2 => 26% +-- rg1's shared quota: %52 - %52 => %0 +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 52%/2 + 0% + 8% => 34% +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=52, memory_shared_quota=0); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; + +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.14 / 0.52); +1: SELECT hold_memory_by_percent(0.14 / 0.52); +1: SELECT hold_memory_by_percent(0.14 / 0.52); +1q: + +1: SET ROLE TO role1_memory_test; +1: BEGIN; +1: SELECT hold_memory_by_percent(0.14 / 0.52); +1: SELECT hold_memory_by_percent(0.14 / 0.52); +1: SELECT hold_memory_by_percent(0.14 / 0.52); +1q: + +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.42 / 0.52); +1q: + +-- 1b) on QEs +1: SET ROLE TO role1_memory_test; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.14 / 0.52)=0; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.14 / 0.52)=0; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.14 / 0.52)=0; +1q: + +1: SET ROLE TO role1_memory_test; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.42 / 0.52)=0; +1q: + +DROP ROLE role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; + +-- 2) single allocation +-- Group Share Quota > 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52 / 100 => 52% +-- rg1's slot quota: 52% * 60 /100 => 31% +-- rg1's single slot quota: 31% / 2 => 15.5% +-- rg1's shared quota: 52% - 31% => 21% +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 15.5% + 21% + 8% => 44.5% + +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=52, memory_shared_quota=40); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; + +-- 2a) on QD +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.12 / 0.52); +1: SELECT hold_memory_by_percent(0.12 / 0.52); +1: SELECT hold_memory_by_percent(0.12 / 0.52); +1: SELECT hold_memory_by_percent(0.12 / 0.52); +1q: + +1: SET ROLE TO role1_memory_test; +1: BEGIN; +1: SELECT hold_memory_by_percent(0.12 / 0.52); +1: SELECT hold_memory_by_percent(0.12 / 0.52); +1: SELECT hold_memory_by_percent(0.12 / 0.52); +1: SELECT hold_memory_by_percent(0.12 / 0.52); +1q: + +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.48 / 0.52); +1q: + +-- 2b) on QEs +1: SET ROLE TO role1_memory_test; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.12 / 0.52)=0; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.12 / 0.52)=0; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.12 / 0.52)=0; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.12 / 0.52)=0; +1q: + +1: SET ROLE TO role1_memory_test; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.48 / 0.52)=0; +1q: + +DROP ROLE role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; + +-- 3) single allocation +-- Group Share Quota > 0 +-- Global Share Quota > 0 +-- Slot Quota = 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52 / 100 => 52% +-- rg1's slot quota: 0 +-- rg1's shared quota: 52% +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 52% + 8% => 60% + +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=52, memory_shared_quota=100); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; + +-- 3a) on QD +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.25 / 0.52); +1: SELECT hold_memory_by_percent(0.25 / 0.52); +1: SELECT hold_memory_by_percent(0.25 / 0.52); +1q: + +1: SET ROLE TO role1_memory_test; +1: BEGIN; +1: SELECT hold_memory_by_percent(0.25 / 0.52); +1: SELECT hold_memory_by_percent(0.25 / 0.52); +1: SELECT hold_memory_by_percent(0.25 / 0.52); +1q: + +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.75 / 0.52); +1q: + +-- 3b) on QEs +1: SET ROLE TO role1_memory_test; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.25 / 0.52)=0; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.25 / 0.52)=0; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.25 / 0.52)=0; +1q: + +1: SET ROLE TO role1_memory_test; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.75 / 0.52)=0; +1q: + +DROP ROLE role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; + +-- 4) multi allocation in one group +-- Group Share Quota = 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52 / 100 => 52% +-- rg1's slot quota: 52% / 2 * 2 => 52% +-- rg1's single slot quota: 52% / 2 => 26% +-- rg1's shared quota: 0 +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 26% + 8% => 34% + +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=52, memory_shared_quota=0); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; + +-- 4a) on QD +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT hold_memory_by_percent(0.28 / 0.52); +2: SELECT hold_memory_by_percent(0.28 / 0.52); +1q: +2q: + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT hold_memory_by_percent(0.32 / 0.52); +2: SELECT hold_memory_by_percent(0.32 / 0.52); +1q: +2q: + +-- allocate serially +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT hold_memory_by_percent(0.32 / 0.52); +1q: +SELECT pg_sleep(1); +2: SELECT hold_memory_by_percent(0.32 / 0.52); +2q: + +-- 4b) on QEs +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.28 / 0.52)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.28 / 0.52)=0; +1q: +2q: + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.32 / 0.52)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.32 / 0.52)=0; +1q: +2q: + +-- allocate serially +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.32 / 0.52)=0; +1q: +SELECT pg_sleep(1); +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.32 / 0.52)=0; +2q: + +DROP ROLE role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; + +-- 5) multi allocation in one group +-- Group Share Quota > 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52 / 100 => 52% +-- rg1's slot quota: 52% * 50 / 100 => 26% +-- rg1's single slot quota: 26% / 2 => 13% +-- rg1's shared quota: 52% - 13% * 2 => 26% +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 13% + 26% + 8% => 47% + +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=52, memory_shared_quota=50); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; + +-- 5a) on QD +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +-- reserve all the group shared quota +1: SELECT hold_memory_by_percent(0.39 / 0.52); +-- must allocate from global share +2: SELECT hold_memory_by_percent(0.2 / 0.52); +1q: +2q: + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT hold_memory_by_percent(0.39 / 0.52); +2: SELECT hold_memory_by_percent(0.39 / 0.52); +1q: +2q: + +-- allocate serially +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT hold_memory_by_percent(0.39 / 0.52); +1q: +SELECT pg_sleep(1); +2: SELECT hold_memory_by_percent(0.39 / 0.52); +2q: + +-- 5b) on QEs +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +-- reserve all the group shared quota +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; +-- must allocate from global share +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.52)=0; +1q: +2q: + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; +1q: +2q: + +-- allocate serially +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; +1q: +SELECT pg_sleep(1); +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; +2q: + +DROP ROLE role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; + +-- 6) multi allocation in different group +-- Group Share Quota > 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 20 / 100 => 20% +-- rg1's slot quota: 20% * 60 / 100 / 2 * 2 => 12% +-- rg1's single slot quota: 12% / 2 => 6% +-- rg1's shared quota: 20% - 6% * 2 => 8% +-- rg2 same as rg1 +-- system free chunks: 100% - 10% - 30% - 100%*20/100 - 100%*20/100 => 20% +-- memory available to one slot in rg1/rg2: 6% + 8% + 20% => 34% + +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=20, memory_shared_quota=40); +CREATE RESOURCE GROUP rg2_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=20, memory_shared_quota=40); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE ROLE role2_memory_test RESOURCE GROUP rg2_memory_test; + +-- 6a) on QD +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role2_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT hold_memory_by_percent(0.2 / 0.2); +2: SELECT hold_memory_by_percent(0.2 / 0.2); +1q: +2q: + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role2_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT hold_memory_by_percent(0.3 / 0.2); +2: SELECT hold_memory_by_percent(0.3 / 0.2); +1q: +2q: + +-- allocate serially +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role2_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT hold_memory_by_percent(0.3 / 0.2); +1q: +SELECT pg_sleep(1); +2: SELECT hold_memory_by_percent(0.3 / 0.2); +2q: + +-- 6b) on QEs +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role2_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.2)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.2)=0; +1q: +2q: + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role2_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3 / 0.2)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3 / 0.2)=0; +1q: +2q: + +-- allocate serially +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role2_memory_test; +1: BEGIN; +2: BEGIN; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3 / 0.2)=0; +1q: +SELECT pg_sleep(1); +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3 / 0.2)=0; +2q: + +DROP ROLE role1_memory_test; +DROP ROLE role2_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +DROP RESOURCE GROUP rg2_memory_test; + +-- 7) DBA can increase global shared memory by decreasing +-- any existing group_memory_limit +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 30 / 100 => 30% +-- rg1's slot quota: 30% +-- rg1's single slot quota: 30% / 2 => 15% +-- rg1's shared quota: 0 +-- rg2 same as rg1 +-- system free chunks: 100% - 10% - 30% - 30% - 30% => 0 +-- memory available to one slot in rg1/rg2: 15% + 0 + 0 => 15% + +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=30, memory_shared_quota=0); +CREATE RESOURCE GROUP rg2_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=30, memory_shared_quota=0); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE ROLE role2_memory_test RESOURCE GROUP rg2_memory_test; + +-- 7a) on QD +-- not enough memory +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.2 / 0.3); +1q: + +-- alter rg2 memory_limit so last query has enough memory +ALTER RESOURCE GROUP rg2_memory_test SET memory_limit 20; +-- system free chunks: 100% - 10% - 30% - 30% - 20% => 10% +-- memory available to one slot in rg1/rg2: 15% + 0 + 10% => 25% + +-- enough memory for allocating +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.2 / 0.3); +1q: + +-- 7b) on QEs +-- not enough memory +ALTER RESOURCE GROUP rg2_memory_test SET memory_limit 30; +1: SET ROLE TO role1_memory_test; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.3)=0; +1q: + +-- alter rg2 memory_limit so last query has enough memory +ALTER RESOURCE GROUP rg2_memory_test SET memory_limit 20; +-- system free chunks: 100% - 10% - 30% - 30% - 20% => 10% +-- memory available to one slot in rg1/rg2: 15% + 0 + 10% => 25% + +-- enough memory for allocating +1: SET ROLE TO role1_memory_test; +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.3)=0; +1q: + +DROP ROLE role1_memory_test; +DROP ROLE role2_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +DROP RESOURCE GROUP rg2_memory_test; diff --git a/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_runaway.source b/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_runaway.source new file mode 100644 index 00000000000..0e99446ab25 --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_runaway.source @@ -0,0 +1,171 @@ +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +DROP RESOURCE GROUP rg2_memory_test; +-- end_ignore + +CREATE OR REPLACE FUNCTION resGroupPalloc(float) RETURNS int AS +'@abs_builddir@/../regress/regress@DLSUFFIX@', 'resGroupPalloc' +LANGUAGE C READS SQL DATA; + +CREATE OR REPLACE FUNCTION hold_memory_by_percent(float) RETURNS int AS $$ + SELECT * FROM resGroupPalloc($1) +$$ LANGUAGE sql; + +CREATE OR REPLACE VIEW rg_mem_status AS + SELECT groupname, memory_limit, memory_shared_quota + FROM gp_toolkit.gp_resgroup_config + WHERE groupname='rg1_memory_test' OR groupname='rg2_memory_test' + ORDER BY groupid; + +CREATE OR REPLACE VIEW memory_result AS SELECT rsgname, memory_usage from gp_toolkit.gp_resgroup_status; + +-- start_ignore +! gpconfig -c runaway_detector_activation_percent -v 50; +! gpstop -ari; +-- end_ignore + +-- after the restart we need a new connection to run the queries +-- 1) single allocation +-- Group Share Quota = 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 20% => 20% +-- rg1's slot quota: 20% / 2 * 2 => 20% +-- rg1's single slot quota: 20% / 2 => 10% +-- rg1's shared quota: 20% - 20% => %0 +-- system free chunks: 100% - 10% - 30% - 20% => 40% +-- global area safe threshold: 40% / 2 = 20% +1: CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=20, memory_shared_quota=0); +1: CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(1.0); +1: SELECT hold_memory_by_percent(0.3); +1: SELECT hold_memory_by_percent(0.3); +1q: + +-- 1b) on QEs +2: SELECT pg_sleep(1); +2: SET ROLE TO role1_memory_test; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(1.0)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; +2q: + +0: DROP ROLE role1_memory_test; +0: DROP RESOURCE GROUP rg1_memory_test; +0q: + + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 20% => 20% +-- rg1's slot quota: 20% / 2 => 10% +-- rg1's single slot quota: 10% / 2 => 5% +-- rg1's shared quota: %20 - %10 => %10 +-- system free chunks: 100% - 10% - 30% - 20% => 40% +-- safe threshold: 40% / 2 = 20% +1: CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=20, memory_shared_quota=50); +1: CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(1.0); +1: SELECT hold_memory_by_percent(0.3); +1: SELECT hold_memory_by_percent(0.3); +1: SELECT hold_memory_by_percent(0.3); +1q: + +-- 1b) on QEs +2: SELECT pg_sleep(1); +2: SET ROLE TO role1_memory_test; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(1.0)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; +2q: + +0: DROP ROLE role1_memory_test; +0: DROP RESOURCE GROUP rg1_memory_test; +0q: + + + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 20% => 20% +-- rg1's slot quota: 20% / 2 => 10% +-- rg1's single slot quota: 10% / 2 => 5% +-- rg1's shared quota: %20 - %10 => %10 +-- rg2's expected: 100% * 20% => 20% +-- system free chunks: 100% - 10% - 30% - 20% - 20%=> 20% +-- safe threshold: 20% / 2 = 10% +1: CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=20, memory_shared_quota=50); +1: CREATE RESOURCE GROUP rg2_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=20, memory_shared_quota=0); +1: CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(1.0); +1: SELECT hold_memory_by_percent(0.15); +1: SELECT hold_memory_by_percent(0.15); +1q: + +-- 1b) on QEs +2: SELECT pg_sleep(1); +2: SET ROLE TO role1_memory_test; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(1.0)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.15)=0; +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.15)=0; +2q: + +0: DROP ROLE role1_memory_test; +0: DROP RESOURCE GROUP rg1_memory_test; +0: DROP RESOURCE GROUP rg2_memory_test; +0q: + +-- test for the rounding issue of runaway_detector_activation_percent +-- when calculating safeChunksThreshold, we used to multiply +-- runaway_detector_activation_percent and then divide 100. This will +-- cause the small chunks to be rounded to zero. +-- set runaway_detector_activation_percent to 99 to enlarge the rounding +-- issue + +-- start_ignore +! gpconfig -c runaway_detector_activation_percent -v 99; +! gpstop -ari; +-- end_ignore + +1: CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=60, memory_shared_quota=50); +1: CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +-- trigger small chunks rounding issue by reducing memory limit in small step +-- while increasing memory limit in big step. +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 57; +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 54; +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 51; +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 48; +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 60; +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +1: SELECT hold_memory_by_percent(0.1); +1: SELECT hold_memory_by_percent(0.1); +1q: + +0: DROP ROLE role1_memory_test; +0: DROP RESOURCE GROUP rg1_memory_test; +0q: + +-- start_ignore +! gpconfig -c runaway_detector_activation_percent -v 100; +! gpstop -ari; +-- end_ignore diff --git a/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_statistic.source b/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_statistic.source new file mode 100644 index 00000000000..d4ca737dbf7 --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/resgroup_memory_statistic.source @@ -0,0 +1,155 @@ +DROP ROLE IF EXISTS role1_memory_test; +DROP ROLE IF EXISTS role2_memory_test; +-- start_ignore +DROP RESOURCE GROUP rg1_memory_test; +DROP RESOURCE GROUP rg2_memory_test; +-- end_ignore + +CREATE OR REPLACE FUNCTION repeatPalloc(int, int) RETURNS int AS +'@abs_builddir@/../regress/regress@DLSUFFIX@', 'repeatPalloc' +LANGUAGE C READS SQL DATA; + +CREATE OR REPLACE FUNCTION hold_memory(int, int) RETURNS int AS $$ + SELECT * FROM repeatPalloc(1, $2) +$$ LANGUAGE sql; + +CREATE OR REPLACE VIEW eat_memory_on_qd AS + SELECT hold_memory(0,20); + +CREATE OR REPLACE VIEW eat_memory_on_one_slice2 AS + SELECT count(null) > 0 + FROM + gp_dist_random('gp_id') t1 + WHERE hold_memory(t1.dbid,20)=0 + ; + +CREATE OR REPLACE VIEW eat_memory_on_slices2 AS + SELECT count(null) > 0 + FROM + gp_dist_random('gp_id') t1, + gp_dist_random('gp_id') t2 + WHERE hold_memory(t1.dbid,20)=0 + AND hold_memory(t2.dbid,20)=0 + ; + +CREATE OR REPLACE FUNCTION round_test(float, integer) RETURNS float AS $$ + SELECT round($1 / $2) * $2 +$$ LANGUAGE sql; + +CREATE OR REPLACE VIEW memory_result AS + SELECT rsgname, ismaster, round_test(avg(memory_usage), 10) AS avg_mem + FROM( + SELECT rsgname, + CASE (j->'key')::text WHEN '"-1"'::text THEN 1 ELSE 0 END AS ismaster, + ((j->'value')->>'used')::int AS memory_usage + FROM( + SELECT rsgname, row_to_json(json_each(memory_usage::json)) AS j FROM + gp_toolkit.gp_resgroup_status + WHERE rsgname='rg1_memory_test' OR rsgname='rg2_memory_test' + )a + )b GROUP BY (rsgname, ismaster) ORDER BY rsgname, ismaster; + +CREATE RESOURCE GROUP rg1_memory_test + WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30); +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE RESOURCE GROUP rg2_memory_test + WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30); +CREATE ROLE role2_memory_test RESOURCE GROUP rg2_memory_test; + +GRANT ALL ON eat_memory_on_qd TO role1_memory_test; +GRANT ALL ON eat_memory_on_one_slice2 TO role1_memory_test; +GRANT ALL ON eat_memory_on_slices2 TO role1_memory_test; +GRANT ALL ON memory_result TO role1_memory_test; + +GRANT ALL ON eat_memory_on_qd TO role2_memory_test; +GRANT ALL ON eat_memory_on_one_slice2 TO role2_memory_test; +GRANT ALL ON eat_memory_on_slices2 TO role2_memory_test; +GRANT ALL ON memory_result TO role2_memory_test; + +-- 1.1) QD only in transaction +1: SET ROLE TO role1_memory_test; +-- check initial state +SELECT * FROM memory_result; +1: BEGIN; +1: SELECT * FROM eat_memory_on_qd; +SELECT * FROM memory_result; +1q: + +-- 1.2) QD only +1: SET ROLE TO role1_memory_test; +-- check initial state +SELECT * FROM memory_result; +1: SELECT * FROM eat_memory_on_qd; +SELECT * FROM memory_result; +1q: + +-- 2.1) QEs on one slice +1: SET ROLE TO role1_memory_test; +1: SELECT * FROM eat_memory_on_one_slice2; +SELECT * FROM memory_result; +1q: + +-- 2.2) QEs on one slice in transaction +1: SET ROLE TO role1_memory_test; +1: BEGIN; +1: SELECT * FROM eat_memory_on_one_slice2; +SELECT * FROM memory_result; +1q: + +-- 2.3) QEs on one slice change resource group +1: SET ROLE TO role1_memory_test; +1: SELECT * FROM eat_memory_on_one_slice2; +SELECT * FROM memory_result; +1: SET ROLE TO role2_memory_test; +1: SELECT * FROM eat_memory_on_one_slice2; +SELECT * FROM memory_result; +1q: + +-- 3) QEs on multiple slices +1: SET ROLE TO role1_memory_test; +1: SELECT * FROM eat_memory_on_slices2; +SELECT * FROM memory_result; +1q: + +-- recheck after cleanup +SELECT * FROM memory_result; + +-- 4) single role concurrency test +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role1_memory_test; +-- QEs on multiple slices +1: SELECT * FROM eat_memory_on_slices2; +2: SELECT * FROM eat_memory_on_slices2; +SELECT * FROM memory_result; +1q: +2q: + +-- 5) multi role concurrency test +1: SET ROLE TO role1_memory_test; +2: SET ROLE TO role2_memory_test; +-- QEs on multiple slices +1: SELECT * FROM eat_memory_on_slices2; +2: SELECT * FROM eat_memory_on_slices2; +SELECT * FROM memory_result; +1q: +2q: + +-- cleanup +REVOKE ALL ON eat_memory_on_qd FROM role1_memory_test; +REVOKE ALL ON eat_memory_on_one_slice2 FROM role1_memory_test; +REVOKE ALL ON eat_memory_on_slices2 FROM role1_memory_test; +REVOKE ALL ON memory_result FROM role1_memory_test; + +REVOKE ALL ON eat_memory_on_qd FROM role2_memory_test; +REVOKE ALL ON eat_memory_on_one_slice2 FROM role2_memory_test; +REVOKE ALL ON eat_memory_on_slices2 FROM role2_memory_test; +REVOKE ALL ON memory_result FROM role2_memory_test; + +ALTER ROLE role1_memory_test RESOURCE GROUP none; +ALTER ROLE role2_memory_test RESOURCE GROUP none; + +DROP ROLE role1_memory_test; +DROP ROLE role2_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +DROP RESOURCE GROUP rg2_memory_test; +DROP VIEW memory_result; diff --git a/src/test/singlenode_isolation2/input/resgroup/resgroup_move_query.source b/src/test/singlenode_isolation2/input/resgroup/resgroup_move_query.source new file mode 100644 index 00000000000..b686993978e --- /dev/null +++ b/src/test/singlenode_isolation2/input/resgroup/resgroup_move_query.source @@ -0,0 +1,149 @@ +-- start_matchsubs +-- +-- m/ERROR: process \d+ is in IDLE state/ +-- s/\d+/XXX/g +-- +-- m/ERROR: group \d+ doesn't have enough memory on master, expect:\d+, available:\d+/ +-- s/\d+/XXX/g +-- +-- m/ERROR: group \d+ doesn't have enough memory on segment, expect:\d+, available:\d+/ +-- s/\d+/XXX/g +-- +-- end_matchsubs + +CREATE OR REPLACE FUNCTION resGroupPalloc(float) RETURNS int AS +'@abs_builddir@/../regress/regress@DLSUFFIX@', 'resGroupPalloc' +LANGUAGE C READS SQL DATA; + +CREATE OR REPLACE FUNCTION hold_memory_by_percent(int, float) RETURNS int AS $$ + SELECT * FROM resGroupPalloc($2) +$$ LANGUAGE sql; + +CREATE OR REPLACE FUNCTION hold_memory_by_percent_on_qe(int, float) RETURNS int AS $$ + SELECT resGroupPalloc($2) FROM gp_dist_random('gp_id') +$$ LANGUAGE sql; +-- check whether a query running in the specific group +-- @param pid: the pid of QD +-- @param groupname: resource group id +-- @return bool: true/false indicating whether it the session is in the resource group +-- start_ignore +CREATE LANGUAGE plpython3u; +-- end_ignore + +CREATE OR REPLACE FUNCTION is_session_in_group(pid integer, groupname text) RETURNS BOOL AS $$ +import subprocess +import pg +import time +import re + +conn = pg.connect(dbname="isolation2resgrouptest") +pt = re.compile(r'con(\d+)') + +sql = "select sess_id from pg_stat_activity where pid = '%d'" % pid +result = conn.query(sql).getresult() +session_id = result[0][0] + +sql = "select groupid from gp_toolkit.gp_resgroup_config where groupname='%s'" % groupname +result = conn.query(sql).getresult() +groupid = result[0][0] + +process = subprocess.Popen("ps -ef | grep postgres | grep con%d | grep -v grep | awk '{print $2}'" % session_id, shell=True, stdout=subprocess.PIPE) +session_pids = process.communicate()[0].decode().split('\n')[:-1] + +cgroups_pids = [] +path = "@cgroup_mnt_point@/cpu/gpdb/%d/cgroup.procs" % groupid +fd = open(path) +for line in fd.readlines(): + cgroups_pids.append(line.strip('\n')) + +return set(session_pids).issubset(set(cgroups_pids)) +$$ LANGUAGE plpython3u; + +DROP ROLE IF EXISTS role_move_query; +-- start_ignore +DROP RESOURCE GROUP rg_move_query; +-- end_ignore +CREATE RESOURCE GROUP rg_move_query WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_move_query RESOURCE GROUP rg_move_query; + +-- test1: cannot move IDLE sessions +1: SET ROLE role_move_query; +1: SET gp_vmem_idle_resource_timeout = 0; +SELECT pg_resgroup_move_query(pid, 'admin_group') FROM pg_stat_activity WHERE query LIKE '%gp_vmem_idle_resource_timeout%' AND state = 'idle'; +SELECT is_session_in_group(pid, 'admin_group') FROM pg_stat_activity WHERE query LIKE '%gp_vmem_idle_resource_timeout%' AND state = 'idle'; + +-- test2: cannot move sessions that are waiting for slot +1: SET ROLE role_move_query; +1: BEGIN; +2: SET ROLE role_move_query; +2&: BEGIN; +SELECT pg_resgroup_move_query(pid, 'default_group') FROM pg_stat_activity WHERE wait_event_type='ResourceGroup'; +SELECT is_session_in_group(pid, 'default_group') FROM pg_stat_activity WHERE wait_event_type='ResourceGroup'; +1: END; +2<: +2: END; + +-- test3: cannot move sessions that don't have enough memory on QD +CREATE RESOURCE GROUP rg_move_query_mem_small WITH (concurrency=1, cpu_rate_limit=20, memory_limit=10); +CREATE ROLE role_move_query_mem_small RESOURCE GROUP rg_move_query_mem_small; +1: SET ROLE role_move_query; +1: BEGIN; +1: SELECT hold_memory_by_percent(1,1.0); +SELECT pg_resgroup_move_query(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent%' AND state = 'idle in transaction'; +SELECT is_session_in_group(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent%' AND state = 'idle in transaction'; +1: END; +1q: + +-- test4: cannot move sessions that don't have enough memory on QE +1: SET ROLE role_move_query; +1: BEGIN; +1: SELECT hold_memory_by_percent_on_qe(1,1.0); +SELECT pg_resgroup_move_query(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; +SELECT is_session_in_group(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; +1: END; +1q: + +-- test5: move query will wait if the destination group doesn't have slot +1: SET ROLE role_move_query; +1: BEGIN; +1: SELECT hold_memory_by_percent_on_qe(1,0.1); +2: SET ROLE role_move_query_mem_small; +2: BEGIN; +3&: SELECT pg_resgroup_move_query(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; +2: END; +3<: +3: SELECT is_session_in_group(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; +1: END; +1q: +2q: +3q: + +-- test6: the destination group will wake up 'pg_resgroup_move_query' when a new slot become available +1: SET ROLE role_move_query; +1&: SELECT pg_sleep(5); +2: SET ROLE role_move_query_mem_small; +2&: SELECT pg_sleep(10); +3&: SELECT pg_resgroup_move_query(pid, 'rg_move_query') FROM pg_stat_activity WHERE query LIKE '%pg_sleep(10)%' AND rsgname='rg_move_query_mem_small'; +1<: +-- connection 1 finished, it will wake up connection 3 +3<: +3: SELECT rsgname, query FROM pg_stat_activity WHERE state = 'active' and query like 'SELECT%'; +2<: +1q: +2q: +3q: + +-- test7: the destination group memory_limit is 0, meaning use the global shared memory +1: ALTER RESOURCE GROUP rg_move_query SET memory_limit 0; +1: SET ROLE role_move_query_mem_small; +1: BEGIN; +1: SELECT hold_memory_by_percent_on_qe(1,0.1); +2: SELECT pg_resgroup_move_query(pid, 'rg_move_query') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND rsgname='rg_move_query_mem_small'; +2: SELECT is_session_in_group(pid, 'rg_move_query') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; +1q: +2q: + +DROP ROLE role_move_query; +DROP RESOURCE GROUP rg_move_query; +DROP ROLE role_move_query_mem_small; +DROP RESOURCE GROUP rg_move_query_mem_small; diff --git a/src/test/singlenode_isolation2/input/uao/GENERATE_ROW_AND_COLUMN_FILES b/src/test/singlenode_isolation2/input/uao/GENERATE_ROW_AND_COLUMN_FILES new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_isolation2/input/uao/alter_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/alter_while_vacuum.source new file mode 100644 index 00000000000..4d82eb88b2e --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/alter_while_vacuum.source @@ -0,0 +1,11 @@ +-- @Description Ensures that an alter table while a vacuum operation is ok +-- +CREATE TABLE alter_while_vacuum_@amname@ (a INT, b INT) USING @amname@; +INSERT INTO alter_while_vacuum_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; + +DELETE FROM alter_while_vacuum_@amname@ WHERE a < 12000; +1: SELECT COUNT(*) FROM alter_while_vacuum_@amname@; +1>: ALTER TABLE alter_while_vacuum_@amname@ ADD COLUMN d bigint DEFAULT 10; +2: VACUUM alter_while_vacuum_@amname@; +1<: +1: SELECT * FROM alter_while_vacuum_@amname@ WHERE a < 12010; diff --git a/src/test/singlenode_isolation2/input/uao/alter_while_vacuum2.source b/src/test/singlenode_isolation2/input/uao/alter_while_vacuum2.source new file mode 100644 index 00000000000..8d3b7709e55 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/alter_while_vacuum2.source @@ -0,0 +1,17 @@ +-- @Description Ensures that an alter table while a vacuum operation is ok +-- +CREATE TABLE alter_while_vacuum2_@amname@ (a INT, b INT) USING @amname@; +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; + +DELETE FROM alter_while_vacuum2_@amname@ WHERE a < 12000; +1: SELECT COUNT(*) FROM alter_while_vacuum2_@amname@; +2: set debug_appendonly_print_compaction=true; +2>: VACUUM alter_while_vacuum2_@amname@; +1: Alter table alter_while_vacuum2_@amname@ set with ( reorganize='true') distributed randomly; +2<: +1: SELECT COUNT(*) FROM alter_while_vacuum2_@amname@ WHERE a < 12010; diff --git a/src/test/singlenode_isolation2/input/uao/bitmapindex_rescan.source b/src/test/singlenode_isolation2/input/uao/bitmapindex_rescan.source new file mode 100644 index 00000000000..9b465a77b70 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/bitmapindex_rescan.source @@ -0,0 +1,29 @@ +-- start_ignore +drop table if exists bir; +drop table if exists yolo cascade; +-- end_ignore +create table bir (a int, b int); +insert into bir select i, i from generate_series(1, 5) i; + +create table yolo (a int, b int) USING @amname@; +create index yolo_idx on yolo using btree (a); + +1: begin; +2: begin; +1: insert into yolo select i, i from generate_series(1, 10000) i; +2: insert into yolo select i, i from generate_series(1, 2) i; +1: commit; +2: abort; + +analyze yolo; + +-- repro needs a plan with bitmap index join with bir on the outer side +set optimizer_enable_hashjoin = off; +set enable_nestloop = on; +set enable_hashjoin = off; +set enable_seqscan = off; + +select * +from bir left join yolo +on (bir.a = yolo.a); + diff --git a/src/test/singlenode_isolation2/input/uao/compaction_full_stats.source b/src/test/singlenode_isolation2/input/uao/compaction_full_stats.source new file mode 100644 index 00000000000..f936c1d3ce1 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/compaction_full_stats.source @@ -0,0 +1,20 @@ +-- @Description Tests the behavior of full vacuum w.r.t. the pg_class statistics +-- +DROP TABLE IF EXISTS foo; + +CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; +CREATE INDEX foo_index ON foo(b); +INSERT INTO foo SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO foo SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE foo; + +-- ensure that the scan go through the index +SET enable_seqscan=false; +SELECT relname, reltuples FROM pg_class WHERE relname = 'foo'; +SELECT relname, reltuples FROM pg_class WHERE relname = 'foo_index'; +DELETE FROM foo WHERE a < 16; +VACUUM FULL foo; +SELECT relname, reltuples FROM pg_class WHERE relname = 'foo'; +SELECT relname, reltuples FROM pg_class WHERE relname = 'foo_index'; +-- in case there's autovacuum worker running in the backend, the aoseg will not be dropped which has state = 2 +SELECT segno, tupcount,state FROM gp_ao_or_aocs_seg('foo') where state = 1 and tupcount > 0; diff --git a/src/test/singlenode_isolation2/input/uao/compaction_utility.source b/src/test/singlenode_isolation2/input/uao/compaction_utility.source new file mode 100644 index 00000000000..27bae55398a --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/compaction_utility.source @@ -0,0 +1,13 @@ +-- @Description Tests the basic behavior of (lazy) vacuum when called from utility mode +-- +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; +CREATE INDEX foo_index ON foo(b); +INSERT INTO foo SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; + +DELETE FROM foo WHERE a < 20; +SELECT COUNT(*) FROM foo; +0U: SELECT segno, state, case when tupcount = 0 then 'zero' when tupcount <= 5 then 'few' else 'many' end FROM gp_ao_or_aocs_seg('foo'); +0U: VACUUM foo; +SELECT COUNT(*) FROM foo; +0U: SELECT segno, state, case when tupcount = 0 then 'zero' when tupcount <= 5 then 'few' else 'many' end FROM gp_ao_or_aocs_seg('foo'); diff --git a/src/test/singlenode_isolation2/input/uao/compaction_utility_insert.source b/src/test/singlenode_isolation2/input/uao/compaction_utility_insert.source new file mode 100644 index 00000000000..336b709e1a2 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/compaction_utility_insert.source @@ -0,0 +1,13 @@ +-- @Description Tests the compaction of data inserted in utility mode +-- +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@ distributed randomly; +CREATE INDEX foo_index ON foo(b); + +0U: INSERT INTO foo VALUES (2, 2, 'c'); +0U: INSERT INTO foo VALUES (3, 3, 'c'); +SELECT *, segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); +DELETE FROM foo WHERE a = 2; +UPDATE foo SET b = -1 WHERE a = 3; +VACUUM foo; +SELECT segment_id, segno, tupcount, state FROM gp_ao_or_aocs_seg('foo') where state = 1 and tupcount > 0; diff --git a/src/test/singlenode_isolation2/input/uao/cursor_before_delete.source b/src/test/singlenode_isolation2/input/uao/cursor_before_delete.source new file mode 100644 index 00000000000..f604be642c3 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/cursor_before_delete.source @@ -0,0 +1,23 @@ +-- @Description Tests the visibility when a cursor has been created before the delete. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1, 100); + +1: BEGIN; +1: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +2: BEGIN; +2: DELETE FROM ao WHERE a < 5; +2: COMMIT; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: CLOSE cur; +1: COMMIT; +3: BEGIN; +3: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; +3: FETCH NEXT IN cur; +3: CLOSE cur; +3: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/cursor_before_deletevacuum.source b/src/test/singlenode_isolation2/input/uao/cursor_before_deletevacuum.source new file mode 100644 index 00000000000..81f09360ba3 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/cursor_before_deletevacuum.source @@ -0,0 +1,25 @@ +-- @Description Tests the visibility when a cursor has been created before the delete. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1, 10); + +1: BEGIN; +1: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +2: BEGIN; +2: DELETE FROM ao WHERE a < 5; +2: COMMIT; +2&: VACUUM FULL ao; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: CLOSE cur; +1: COMMIT; +2<: +3: BEGIN; +3: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; +3: FETCH NEXT IN cur; +3: CLOSE cur; +3: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/cursor_before_update.source b/src/test/singlenode_isolation2/input/uao/cursor_before_update.source new file mode 100644 index 00000000000..20e277f0079 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/cursor_before_update.source @@ -0,0 +1,23 @@ +-- @Description Tests the visibility when a cursor has been created before the update. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,100) AS i; + +1: BEGIN; +1: DECLARE cur CURSOR FOR SELECT a,b FROM ao ORDER BY a; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +2: BEGIN; +2: UPDATE ao SET b = 8 WHERE a < 5; +2: COMMIT; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: CLOSE cur; +1: COMMIT; +3: BEGIN; +3: DECLARE cur CURSOR FOR SELECT a,b FROM ao ORDER BY a; +3: FETCH NEXT IN cur; +3: CLOSE cur; +3: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/cursor_withhold.source b/src/test/singlenode_isolation2/input/uao/cursor_withhold.source new file mode 100644 index 00000000000..01c3cf6a59e --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/cursor_withhold.source @@ -0,0 +1,19 @@ +-- @Description Tests the visibility of an "with hold" cursor w.r.t. deletes. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,100); + +1: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +2: BEGIN; +2: DELETE FROM ao WHERE a < 5; +2: COMMIT; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: CLOSE cur; +3: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; +3: FETCH NEXT IN cur; +3: CLOSE cur; diff --git a/src/test/singlenode_isolation2/input/uao/cursor_withhold2.source b/src/test/singlenode_isolation2/input/uao/cursor_withhold2.source new file mode 100644 index 00000000000..f94f02c2dea --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/cursor_withhold2.source @@ -0,0 +1,22 @@ +-- @Description Tests the visibility of an "with hold" cursor w.r.t. deletes. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,10); + +1: BEGIN; +1: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: COMMIT; +2: BEGIN; +2: DELETE FROM ao WHERE a < 5; +2: COMMIT; +3: VACUUM ao; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: FETCH NEXT IN cur; +1: CLOSE cur; +3: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; +3: FETCH NEXT IN cur; +3: CLOSE cur; diff --git a/src/test/singlenode_isolation2/input/uao/delete_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/delete_while_vacuum.source new file mode 100644 index 00000000000..72805a43202 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/delete_while_vacuum.source @@ -0,0 +1,15 @@ +-- @Description Ensures that a delete before a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + + +DELETE FROM ao WHERE a < 12; +1: BEGIN; +1: SELECT COUNT(*) FROM ao; +1>: DELETE FROM ao WHERE a < 90;COMMIT; +2: VACUUM ao; +1<: +1: SELECT COUNT(*) FROM ao; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/insert_policy.source b/src/test/singlenode_isolation2/input/uao/insert_policy.source new file mode 100644 index 00000000000..3c1de1390aa --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/insert_policy.source @@ -0,0 +1,36 @@ +-- @Description Tests the AO segment file selection policy +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +-- Case 1: Both transactions insert initial segment files into aoseg. +1: BEGIN; +2: BEGIN; +1: INSERT INTO AO VALUES (1); +-- Segment file 1 should be created +3: SELECT segno FROM gp_ao_or_aocs_seg('ao'); +2: INSERT INTO AO VALUES (1); +-- Segment file 2 should be created +3: SELECT segno FROM gp_ao_or_aocs_seg('ao'); +2: COMMIT; +-- Transaction 2 should commit before 1. It validates that +-- transaction 2 chose a different segfile than transaction 1. +1: COMMIT; +3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + +-- Case 2: Concurrent inserts with existing segment files in aoseg. +1: INSERT INTO AO VALUES (1); +3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); +-- 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); +3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); +1: BEGIN; +1: INSERT INTO AO VALUES (15); +2: BEGIN; +2: INSERT INTO AO VALUES (15); +1: COMMIT; +2: COMMIT; +3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); +1: insert into ao select generate_series(1,100000); +1: INSERT INTO AO VALUES (15); +3: SELECT segno, case when tupcount = 0 then 'zero' when tupcount <= 5 then 'few' else 'many' end FROM gp_ao_or_aocs_seg('ao'); diff --git a/src/test/singlenode_isolation2/input/uao/insert_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/insert_while_vacuum.source new file mode 100644 index 00000000000..37317fd7fe6 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/insert_while_vacuum.source @@ -0,0 +1,33 @@ +-- @Description Ensures that an insert during a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); + +DELETE FROM ao WHERE a < 128; +2>: VACUUM ao; +4: 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; +2<: +3: SELECT COUNT(*) FROM ao WHERE a = 1500; +4: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/limit_indexscan_inits.source b/src/test/singlenode_isolation2/input/uao/limit_indexscan_inits.source new file mode 100644 index 00000000000..f3faedaaf77 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/limit_indexscan_inits.source @@ -0,0 +1,76 @@ +-- This is intended to test lastSequence initialization during indexscan should be limited +-- to the scope of the target scanning AO/CO segfiles, rather than the max 128 segfiles. +-- The theory is comparing the count of indexscan (or pg_stat_all_tables.idx_scan) between +-- pre and post query on bitmapheapscan(could trigger indexscan) plan. +-- We are using gp_ao_or_aocs_seg() helper UDF to obtain the number of AO/CO segfiles (segnos), +-- then plus 1 to count in segfile0 due to the implementation constraint. +-- For BTREE index, we verify the equation: post_nscans - pre_nscans == segnos + 1; +-- for BRIN index, we verify the equation: post_nscans - pre_nscans == (segnos + 1) * 2. +-- BRIN index doubles the number of nscans of BTREE because lastSequence was initialized twice +-- during BRIN indexed bitmapheapscan (in index_getbitmap and ao/co fetch_init), which is probably +-- optimizable, too. + +create or replace function test_iscan_inits_same_as_aosegs(tablename text, icol text, itype text) returns bool as $$ +declare + segnos smallint; /* in func */ + pre_nscans smallint; /* in func */ + post_nscans smallint; /* in func */ + result bool; /* in func */ +begin + select count(segno) into segnos from gp_ao_or_aocs_seg(tablename); /* in func */ + + select pg_stat_get_xact_numscans('gp_fastsequence_objid_objmod_index'::regclass) into pre_nscans; /* get idx_scan before query */ + execute 'select * from ' || quote_ident(tablename) || ' where ' || quote_ident(icol) || ' = 2'; /* vaule 2 is distributed to the segment with content 0 */ + select pg_stat_get_xact_numscans('gp_fastsequence_objid_objmod_index'::regclass) into post_nscans; /* get idx_scan after query */ + + 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 into result; /* BRIN doubles nscans(of BTREE) due to implementation constraint */ + raise notice '[BRIN] expect: post_nscans - pre_nscans == (segnos + 1) * 2'; /* 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; + +set default_table_access_method=@amname@; + +create table @amname@_limit_iscan_inits_tbl (a int, b int, c int, d int); +create index on @amname@_limit_iscan_inits_tbl(a); +create index on @amname@_limit_iscan_inits_tbl using brin (b); + +-- Start three concurrent writing sessions to generate three segment files. +1: begin; +1: insert into @amname@_limit_iscan_inits_tbl select a, a, a, a from generate_series(1, 10)a; + +2: begin; +2: insert into @amname@_limit_iscan_inits_tbl select a, a, a, a from generate_series(11, 20)a; + +3: begin; +3: insert into @amname@_limit_iscan_inits_tbl select a, a, a, a from generate_series(21, 30)a; + +1: end; +2: end; +3: end; + +-- diable seqscan +0U: set enable_seqscan = off; +-- make sure it goes to bitmapheapscan +-- start_ignore +0U: explain (costs off) select * from @amname@_limit_iscan_inits_tbl where a = 2; +0U: explain (costs off) select * from @amname@_limit_iscan_inits_tbl where b = 2; +-- end_ignore +-- expect to return true +0U: select test_iscan_inits_same_as_aosegs('@amname@_limit_iscan_inits_tbl', 'a', 'btree'); +0U: select test_iscan_inits_same_as_aosegs('@amname@_limit_iscan_inits_tbl', 'b', 'brin'); +0Uq: + +drop table @amname@_limit_iscan_inits_tbl; +drop function test_iscan_inits_same_as_aosegs; +reset default_table_access_method; diff --git a/src/test/singlenode_isolation2/input/uao/max_concurrency.source b/src/test/singlenode_isolation2/input/uao/max_concurrency.source new file mode 100644 index 00000000000..fa17d47679f --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/max_concurrency.source @@ -0,0 +1,392 @@ +-- @Description Insert into a ao relation with 127 concurrent transactions +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; + +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 130; + +1: BEGIN; +2: BEGIN; +3: BEGIN; +4: BEGIN; +5: BEGIN; +6: BEGIN; +7: BEGIN; +8: BEGIN; +9: BEGIN; +10: BEGIN; +11: BEGIN; +12: BEGIN; +13: BEGIN; +14: BEGIN; +15: BEGIN; +16: BEGIN; +17: BEGIN; +18: BEGIN; +19: BEGIN; +20: BEGIN; +21: BEGIN; +22: BEGIN; +23: BEGIN; +24: BEGIN; +25: BEGIN; +26: BEGIN; +27: BEGIN; +28: BEGIN; +29: BEGIN; +30: BEGIN; +31: BEGIN; +32: BEGIN; +33: BEGIN; +34: BEGIN; +35: BEGIN; +36: BEGIN; +37: BEGIN; +38: BEGIN; +39: BEGIN; +40: BEGIN; +41: BEGIN; +42: BEGIN; +43: BEGIN; +44: BEGIN; +45: BEGIN; +46: BEGIN; +47: BEGIN; +48: BEGIN; +49: BEGIN; +50: BEGIN; +51: BEGIN; +52: BEGIN; +53: BEGIN; +54: BEGIN; +55: BEGIN; +56: BEGIN; +57: BEGIN; +58: BEGIN; +59: BEGIN; +60: BEGIN; +61: BEGIN; +62: BEGIN; +63: BEGIN; +64: BEGIN; +65: BEGIN; +66: BEGIN; +67: BEGIN; +68: BEGIN; +69: BEGIN; +70: BEGIN; +71: BEGIN; +72: BEGIN; +73: BEGIN; +74: BEGIN; +75: BEGIN; +76: BEGIN; +77: BEGIN; +78: BEGIN; +79: BEGIN; +80: BEGIN; +81: BEGIN; +82: BEGIN; +83: BEGIN; +84: BEGIN; +85: BEGIN; +86: BEGIN; +87: BEGIN; +88: BEGIN; +89: BEGIN; +90: BEGIN; +91: BEGIN; +92: BEGIN; +93: BEGIN; +94: BEGIN; +95: BEGIN; +96: BEGIN; +97: BEGIN; +98: BEGIN; +99: BEGIN; +100: BEGIN; +101: BEGIN; +102: BEGIN; +103: BEGIN; +104: BEGIN; +105: BEGIN; +106: BEGIN; +107: BEGIN; +108: BEGIN; +109: BEGIN; +110: BEGIN; +111: BEGIN; +112: BEGIN; +113: BEGIN; +114: BEGIN; +115: BEGIN; +116: BEGIN; +117: BEGIN; +118: BEGIN; +119: BEGIN; +120: BEGIN; +121: BEGIN; +122: BEGIN; +123: BEGIN; +124: BEGIN; +125: BEGIN; +126: BEGIN; +127: BEGIN; +1: INSERT INTO AO VALUES (1, 1); +2: INSERT INTO AO VALUES (1, 1); +3: INSERT INTO AO VALUES (1, 1); +4: INSERT INTO AO VALUES (1, 1); +5: INSERT INTO AO VALUES (1, 1); +6: INSERT INTO AO VALUES (1, 1); +7: INSERT INTO AO VALUES (1, 1); +8: INSERT INTO AO VALUES (1, 1); +9: INSERT INTO AO VALUES (1, 1); +10: INSERT INTO AO VALUES (1, 1); +11: INSERT INTO AO VALUES (1, 1); +12: INSERT INTO AO VALUES (1, 1); +13: INSERT INTO AO VALUES (1, 1); +14: INSERT INTO AO VALUES (1, 1); +15: INSERT INTO AO VALUES (1, 1); +16: INSERT INTO AO VALUES (1, 1); +17: INSERT INTO AO VALUES (1, 1); +18: INSERT INTO AO VALUES (1, 1); +19: INSERT INTO AO VALUES (1, 1); +20: INSERT INTO AO VALUES (1, 1); +21: INSERT INTO AO VALUES (1, 1); +22: INSERT INTO AO VALUES (1, 1); +23: INSERT INTO AO VALUES (1, 1); +24: INSERT INTO AO VALUES (1, 1); +25: INSERT INTO AO VALUES (1, 1); +26: INSERT INTO AO VALUES (1, 1); +27: INSERT INTO AO VALUES (1, 1); +28: INSERT INTO AO VALUES (1, 1); +29: INSERT INTO AO VALUES (1, 1); +30: INSERT INTO AO VALUES (1, 1); +31: INSERT INTO AO VALUES (1, 1); +32: INSERT INTO AO VALUES (1, 1); +33: INSERT INTO AO VALUES (1, 1); +34: INSERT INTO AO VALUES (1, 1); +35: INSERT INTO AO VALUES (1, 1); +36: INSERT INTO AO VALUES (1, 1); +37: INSERT INTO AO VALUES (1, 1); +38: INSERT INTO AO VALUES (1, 1); +39: INSERT INTO AO VALUES (1, 1); +40: INSERT INTO AO VALUES (1, 1); +41: INSERT INTO AO VALUES (1, 1); +42: INSERT INTO AO VALUES (1, 1); +43: INSERT INTO AO VALUES (1, 1); +44: INSERT INTO AO VALUES (1, 1); +45: INSERT INTO AO VALUES (1, 1); +46: INSERT INTO AO VALUES (1, 1); +47: INSERT INTO AO VALUES (1, 1); +48: INSERT INTO AO VALUES (1, 1); +49: INSERT INTO AO VALUES (1, 1); +50: INSERT INTO AO VALUES (1, 1); +51: INSERT INTO AO VALUES (1, 1); +52: INSERT INTO AO VALUES (1, 1); +53: INSERT INTO AO VALUES (1, 1); +54: INSERT INTO AO VALUES (1, 1); +55: INSERT INTO AO VALUES (1, 1); +56: INSERT INTO AO VALUES (1, 1); +57: INSERT INTO AO VALUES (1, 1); +58: INSERT INTO AO VALUES (1, 1); +59: INSERT INTO AO VALUES (1, 1); +60: INSERT INTO AO VALUES (1, 1); +61: INSERT INTO AO VALUES (1, 1); +62: INSERT INTO AO VALUES (1, 1); +63: INSERT INTO AO VALUES (1, 1); +64: INSERT INTO AO VALUES (1, 1); +65: INSERT INTO AO VALUES (1, 1); +66: INSERT INTO AO VALUES (1, 1); +67: INSERT INTO AO VALUES (1, 1); +68: INSERT INTO AO VALUES (1, 1); +69: INSERT INTO AO VALUES (1, 1); +70: INSERT INTO AO VALUES (1, 1); +71: INSERT INTO AO VALUES (1, 1); +72: INSERT INTO AO VALUES (1, 1); +73: INSERT INTO AO VALUES (1, 1); +74: INSERT INTO AO VALUES (1, 1); +75: INSERT INTO AO VALUES (1, 1); +76: INSERT INTO AO VALUES (1, 1); +77: INSERT INTO AO VALUES (1, 1); +78: INSERT INTO AO VALUES (1, 1); +79: INSERT INTO AO VALUES (1, 1); +80: INSERT INTO AO VALUES (1, 1); +81: INSERT INTO AO VALUES (1, 1); +82: INSERT INTO AO VALUES (1, 1); +83: INSERT INTO AO VALUES (1, 1); +84: INSERT INTO AO VALUES (1, 1); +85: INSERT INTO AO VALUES (1, 1); +86: INSERT INTO AO VALUES (1, 1); +87: INSERT INTO AO VALUES (1, 1); +88: INSERT INTO AO VALUES (1, 1); +89: INSERT INTO AO VALUES (1, 1); +90: INSERT INTO AO VALUES (1, 1); +91: INSERT INTO AO VALUES (1, 1); +92: INSERT INTO AO VALUES (1, 1); +93: INSERT INTO AO VALUES (1, 1); +94: INSERT INTO AO VALUES (1, 1); +95: INSERT INTO AO VALUES (1, 1); +96: INSERT INTO AO VALUES (1, 1); +97: INSERT INTO AO VALUES (1, 1); +98: INSERT INTO AO VALUES (1, 1); +99: INSERT INTO AO VALUES (1, 1); +100: INSERT INTO AO VALUES (1, 1); +101: INSERT INTO AO VALUES (1, 1); +102: INSERT INTO AO VALUES (1, 1); +103: INSERT INTO AO VALUES (1, 1); +104: INSERT INTO AO VALUES (1, 1); +105: INSERT INTO AO VALUES (1, 1); +106: INSERT INTO AO VALUES (1, 1); +107: INSERT INTO AO VALUES (1, 1); +108: INSERT INTO AO VALUES (1, 1); +109: INSERT INTO AO VALUES (1, 1); +110: INSERT INTO AO VALUES (1, 1); +111: INSERT INTO AO VALUES (1, 1); +112: INSERT INTO AO VALUES (1, 1); +113: INSERT INTO AO VALUES (1, 1); +114: INSERT INTO AO VALUES (1, 1); +115: INSERT INTO AO VALUES (1, 1); +116: INSERT INTO AO VALUES (1, 1); +117: INSERT INTO AO VALUES (1, 1); +118: INSERT INTO AO VALUES (1, 1); +119: INSERT INTO AO VALUES (1, 1); +120: INSERT INTO AO VALUES (1, 1); +121: INSERT INTO AO VALUES (1, 1); +122: INSERT INTO AO VALUES (1, 1); +123: INSERT INTO AO VALUES (1, 1); +124: INSERT INTO AO VALUES (1, 1); +125: INSERT INTO AO VALUES (1, 1); +126: INSERT INTO AO VALUES (1, 1); +127: INSERT INTO AO VALUES (1, 1); +1: COMMIT; +2: COMMIT; +3: COMMIT; +4: COMMIT; +5: COMMIT; +6: COMMIT; +7: COMMIT; +8: COMMIT; +9: COMMIT; +10: COMMIT; +11: COMMIT; +12: COMMIT; +13: COMMIT; +14: COMMIT; +15: COMMIT; +16: COMMIT; +17: COMMIT; +18: COMMIT; +19: COMMIT; +20: COMMIT; +21: COMMIT; +22: COMMIT; +23: COMMIT; +24: COMMIT; +25: COMMIT; +26: COMMIT; +27: COMMIT; +28: COMMIT; +29: COMMIT; +30: COMMIT; +31: COMMIT; +32: COMMIT; +33: COMMIT; +34: COMMIT; +35: COMMIT; +36: COMMIT; +37: COMMIT; +38: COMMIT; +39: COMMIT; +40: COMMIT; +41: COMMIT; +42: COMMIT; +43: COMMIT; +44: COMMIT; +45: COMMIT; +46: COMMIT; +47: COMMIT; +48: COMMIT; +49: COMMIT; +50: COMMIT; +51: COMMIT; +52: COMMIT; +53: COMMIT; +54: COMMIT; +55: COMMIT; +56: COMMIT; +57: COMMIT; +58: COMMIT; +59: COMMIT; +60: COMMIT; +61: COMMIT; +62: COMMIT; +63: COMMIT; +64: COMMIT; +65: COMMIT; +66: COMMIT; +67: COMMIT; +68: COMMIT; +69: COMMIT; +70: COMMIT; +71: COMMIT; +72: COMMIT; +73: COMMIT; +74: COMMIT; +75: COMMIT; +76: COMMIT; +77: COMMIT; +78: COMMIT; +79: COMMIT; +80: COMMIT; +81: COMMIT; +82: COMMIT; +83: COMMIT; +84: COMMIT; +85: COMMIT; +86: COMMIT; +87: COMMIT; +88: COMMIT; +89: COMMIT; +90: COMMIT; +91: COMMIT; +92: COMMIT; +93: COMMIT; +94: COMMIT; +95: COMMIT; +96: COMMIT; +97: COMMIT; +98: COMMIT; +99: COMMIT; +100: COMMIT; +101: COMMIT; +102: COMMIT; +103: COMMIT; +104: COMMIT; +105: COMMIT; +106: COMMIT; +107: COMMIT; +108: COMMIT; +109: COMMIT; +110: COMMIT; +111: COMMIT; +112: COMMIT; +113: COMMIT; +114: COMMIT; +115: COMMIT; +116: COMMIT; +117: COMMIT; +118: COMMIT; +119: COMMIT; +120: COMMIT; +121: COMMIT; +122: COMMIT; +123: COMMIT; +124: COMMIT; +125: COMMIT; +126: COMMIT; +127: COMMIT; +SELECT * FROM ao; +SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY segno; + +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 20; diff --git a/src/test/singlenode_isolation2/input/uao/max_concurrency2.source b/src/test/singlenode_isolation2/input/uao/max_concurrency2.source new file mode 100644 index 00000000000..976048d9143 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/max_concurrency2.source @@ -0,0 +1,402 @@ +-- @Description Insert into a ao relation with 128 concurrent transactions. +-- The 128th transaction is expected to fail. +-- +-- +-- start_matchsubs +-- m/could not find segment file to use for inserting into relation "ao" .*/ +-- s/could not find segment file to use for inserting into relation "ao" .*/could not find segment file to use for inserting into relation "ao" ###/ +-- end_matchsubs + +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; + +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 130; + +1: BEGIN; +2: BEGIN; +3: BEGIN; +4: BEGIN; +5: BEGIN; +6: BEGIN; +7: BEGIN; +8: BEGIN; +9: BEGIN; +10: BEGIN; +11: BEGIN; +12: BEGIN; +13: BEGIN; +14: BEGIN; +15: BEGIN; +16: BEGIN; +17: BEGIN; +18: BEGIN; +19: BEGIN; +20: BEGIN; +21: BEGIN; +22: BEGIN; +23: BEGIN; +24: BEGIN; +25: BEGIN; +26: BEGIN; +27: BEGIN; +28: BEGIN; +29: BEGIN; +30: BEGIN; +31: BEGIN; +32: BEGIN; +33: BEGIN; +34: BEGIN; +35: BEGIN; +36: BEGIN; +37: BEGIN; +38: BEGIN; +39: BEGIN; +40: BEGIN; +41: BEGIN; +42: BEGIN; +43: BEGIN; +44: BEGIN; +45: BEGIN; +46: BEGIN; +47: BEGIN; +48: BEGIN; +49: BEGIN; +50: BEGIN; +51: BEGIN; +52: BEGIN; +53: BEGIN; +54: BEGIN; +55: BEGIN; +56: BEGIN; +57: BEGIN; +58: BEGIN; +59: BEGIN; +60: BEGIN; +61: BEGIN; +62: BEGIN; +63: BEGIN; +64: BEGIN; +65: BEGIN; +66: BEGIN; +67: BEGIN; +68: BEGIN; +69: BEGIN; +70: BEGIN; +71: BEGIN; +72: BEGIN; +73: BEGIN; +74: BEGIN; +75: BEGIN; +76: BEGIN; +77: BEGIN; +78: BEGIN; +79: BEGIN; +80: BEGIN; +81: BEGIN; +82: BEGIN; +83: BEGIN; +84: BEGIN; +85: BEGIN; +86: BEGIN; +87: BEGIN; +88: BEGIN; +89: BEGIN; +90: BEGIN; +91: BEGIN; +92: BEGIN; +93: BEGIN; +94: BEGIN; +95: BEGIN; +96: BEGIN; +97: BEGIN; +98: BEGIN; +99: BEGIN; +100: BEGIN; +101: BEGIN; +102: BEGIN; +103: BEGIN; +104: BEGIN; +105: BEGIN; +106: BEGIN; +107: BEGIN; +108: BEGIN; +109: BEGIN; +110: BEGIN; +111: BEGIN; +112: BEGIN; +113: BEGIN; +114: BEGIN; +115: BEGIN; +116: BEGIN; +117: BEGIN; +118: BEGIN; +119: BEGIN; +120: BEGIN; +121: BEGIN; +122: BEGIN; +123: BEGIN; +124: BEGIN; +125: BEGIN; +126: BEGIN; +127: BEGIN; +128: BEGIN; +1: INSERT INTO AO VALUES (1, 1); +2: INSERT INTO AO VALUES (1, 1); +3: INSERT INTO AO VALUES (1, 1); +4: INSERT INTO AO VALUES (1, 1); +5: INSERT INTO AO VALUES (1, 1); +6: INSERT INTO AO VALUES (1, 1); +7: INSERT INTO AO VALUES (1, 1); +8: INSERT INTO AO VALUES (1, 1); +9: INSERT INTO AO VALUES (1, 1); +10: INSERT INTO AO VALUES (1, 1); +11: INSERT INTO AO VALUES (1, 1); +12: INSERT INTO AO VALUES (1, 1); +13: INSERT INTO AO VALUES (1, 1); +14: INSERT INTO AO VALUES (1, 1); +15: INSERT INTO AO VALUES (1, 1); +16: INSERT INTO AO VALUES (1, 1); +17: INSERT INTO AO VALUES (1, 1); +18: INSERT INTO AO VALUES (1, 1); +19: INSERT INTO AO VALUES (1, 1); +20: INSERT INTO AO VALUES (1, 1); +21: INSERT INTO AO VALUES (1, 1); +22: INSERT INTO AO VALUES (1, 1); +23: INSERT INTO AO VALUES (1, 1); +24: INSERT INTO AO VALUES (1, 1); +25: INSERT INTO AO VALUES (1, 1); +26: INSERT INTO AO VALUES (1, 1); +27: INSERT INTO AO VALUES (1, 1); +28: INSERT INTO AO VALUES (1, 1); +29: INSERT INTO AO VALUES (1, 1); +30: INSERT INTO AO VALUES (1, 1); +31: INSERT INTO AO VALUES (1, 1); +32: INSERT INTO AO VALUES (1, 1); +33: INSERT INTO AO VALUES (1, 1); +34: INSERT INTO AO VALUES (1, 1); +35: INSERT INTO AO VALUES (1, 1); +36: INSERT INTO AO VALUES (1, 1); +37: INSERT INTO AO VALUES (1, 1); +38: INSERT INTO AO VALUES (1, 1); +39: INSERT INTO AO VALUES (1, 1); +40: INSERT INTO AO VALUES (1, 1); +41: INSERT INTO AO VALUES (1, 1); +42: INSERT INTO AO VALUES (1, 1); +43: INSERT INTO AO VALUES (1, 1); +44: INSERT INTO AO VALUES (1, 1); +45: INSERT INTO AO VALUES (1, 1); +46: INSERT INTO AO VALUES (1, 1); +47: INSERT INTO AO VALUES (1, 1); +48: INSERT INTO AO VALUES (1, 1); +49: INSERT INTO AO VALUES (1, 1); +50: INSERT INTO AO VALUES (1, 1); +51: INSERT INTO AO VALUES (1, 1); +52: INSERT INTO AO VALUES (1, 1); +53: INSERT INTO AO VALUES (1, 1); +54: INSERT INTO AO VALUES (1, 1); +55: INSERT INTO AO VALUES (1, 1); +56: INSERT INTO AO VALUES (1, 1); +57: INSERT INTO AO VALUES (1, 1); +58: INSERT INTO AO VALUES (1, 1); +59: INSERT INTO AO VALUES (1, 1); +60: INSERT INTO AO VALUES (1, 1); +61: INSERT INTO AO VALUES (1, 1); +62: INSERT INTO AO VALUES (1, 1); +63: INSERT INTO AO VALUES (1, 1); +64: INSERT INTO AO VALUES (1, 1); +65: INSERT INTO AO VALUES (1, 1); +66: INSERT INTO AO VALUES (1, 1); +67: INSERT INTO AO VALUES (1, 1); +68: INSERT INTO AO VALUES (1, 1); +69: INSERT INTO AO VALUES (1, 1); +70: INSERT INTO AO VALUES (1, 1); +71: INSERT INTO AO VALUES (1, 1); +72: INSERT INTO AO VALUES (1, 1); +73: INSERT INTO AO VALUES (1, 1); +74: INSERT INTO AO VALUES (1, 1); +75: INSERT INTO AO VALUES (1, 1); +76: INSERT INTO AO VALUES (1, 1); +77: INSERT INTO AO VALUES (1, 1); +78: INSERT INTO AO VALUES (1, 1); +79: INSERT INTO AO VALUES (1, 1); +80: INSERT INTO AO VALUES (1, 1); +81: INSERT INTO AO VALUES (1, 1); +82: INSERT INTO AO VALUES (1, 1); +83: INSERT INTO AO VALUES (1, 1); +84: INSERT INTO AO VALUES (1, 1); +85: INSERT INTO AO VALUES (1, 1); +86: INSERT INTO AO VALUES (1, 1); +87: INSERT INTO AO VALUES (1, 1); +88: INSERT INTO AO VALUES (1, 1); +89: INSERT INTO AO VALUES (1, 1); +90: INSERT INTO AO VALUES (1, 1); +91: INSERT INTO AO VALUES (1, 1); +92: INSERT INTO AO VALUES (1, 1); +93: INSERT INTO AO VALUES (1, 1); +94: INSERT INTO AO VALUES (1, 1); +95: INSERT INTO AO VALUES (1, 1); +96: INSERT INTO AO VALUES (1, 1); +97: INSERT INTO AO VALUES (1, 1); +98: INSERT INTO AO VALUES (1, 1); +99: INSERT INTO AO VALUES (1, 1); +100: INSERT INTO AO VALUES (1, 1); +101: INSERT INTO AO VALUES (1, 1); +102: INSERT INTO AO VALUES (1, 1); +103: INSERT INTO AO VALUES (1, 1); +104: INSERT INTO AO VALUES (1, 1); +105: INSERT INTO AO VALUES (1, 1); +106: INSERT INTO AO VALUES (1, 1); +107: INSERT INTO AO VALUES (1, 1); +108: INSERT INTO AO VALUES (1, 1); +109: INSERT INTO AO VALUES (1, 1); +110: INSERT INTO AO VALUES (1, 1); +111: INSERT INTO AO VALUES (1, 1); +112: INSERT INTO AO VALUES (1, 1); +113: INSERT INTO AO VALUES (1, 1); +114: INSERT INTO AO VALUES (1, 1); +115: INSERT INTO AO VALUES (1, 1); +116: INSERT INTO AO VALUES (1, 1); +117: INSERT INTO AO VALUES (1, 1); +118: INSERT INTO AO VALUES (1, 1); +119: INSERT INTO AO VALUES (1, 1); +120: INSERT INTO AO VALUES (1, 1); +121: INSERT INTO AO VALUES (1, 1); +122: INSERT INTO AO VALUES (1, 1); +123: INSERT INTO AO VALUES (1, 1); +124: INSERT INTO AO VALUES (1, 1); +125: INSERT INTO AO VALUES (1, 1); +126: INSERT INTO AO VALUES (1, 1); +127: INSERT INTO AO VALUES (1, 1); +128: INSERT INTO AO VALUES (1, 1); +1: COMMIT; +2: COMMIT; +3: COMMIT; +4: COMMIT; +5: COMMIT; +6: COMMIT; +7: COMMIT; +8: COMMIT; +9: COMMIT; +10: COMMIT; +11: COMMIT; +12: COMMIT; +13: COMMIT; +14: COMMIT; +15: COMMIT; +16: COMMIT; +17: COMMIT; +18: COMMIT; +19: COMMIT; +20: COMMIT; +21: COMMIT; +22: COMMIT; +23: COMMIT; +24: COMMIT; +25: COMMIT; +26: COMMIT; +27: COMMIT; +28: COMMIT; +29: COMMIT; +30: COMMIT; +31: COMMIT; +32: COMMIT; +33: COMMIT; +34: COMMIT; +35: COMMIT; +36: COMMIT; +37: COMMIT; +38: COMMIT; +39: COMMIT; +40: COMMIT; +41: COMMIT; +42: COMMIT; +43: COMMIT; +44: COMMIT; +45: COMMIT; +46: COMMIT; +47: COMMIT; +48: COMMIT; +49: COMMIT; +50: COMMIT; +51: COMMIT; +52: COMMIT; +53: COMMIT; +54: COMMIT; +55: COMMIT; +56: COMMIT; +57: COMMIT; +58: COMMIT; +59: COMMIT; +60: COMMIT; +61: COMMIT; +62: COMMIT; +63: COMMIT; +64: COMMIT; +65: COMMIT; +66: COMMIT; +67: COMMIT; +68: COMMIT; +69: COMMIT; +70: COMMIT; +71: COMMIT; +72: COMMIT; +73: COMMIT; +74: COMMIT; +75: COMMIT; +76: COMMIT; +77: COMMIT; +78: COMMIT; +79: COMMIT; +80: COMMIT; +81: COMMIT; +82: COMMIT; +83: COMMIT; +84: COMMIT; +85: COMMIT; +86: COMMIT; +87: COMMIT; +88: COMMIT; +89: COMMIT; +90: COMMIT; +91: COMMIT; +92: COMMIT; +93: COMMIT; +94: COMMIT; +95: COMMIT; +96: COMMIT; +97: COMMIT; +98: COMMIT; +99: COMMIT; +100: COMMIT; +101: COMMIT; +102: COMMIT; +103: COMMIT; +104: COMMIT; +105: COMMIT; +106: COMMIT; +107: COMMIT; +108: COMMIT; +109: COMMIT; +110: COMMIT; +111: COMMIT; +112: COMMIT; +113: COMMIT; +114: COMMIT; +115: COMMIT; +116: COMMIT; +117: COMMIT; +118: COMMIT; +119: COMMIT; +120: COMMIT; +121: COMMIT; +122: COMMIT; +123: COMMIT; +124: COMMIT; +125: COMMIT; +126: COMMIT; +127: COMMIT; +128: ROLLBACK; +SELECT * FROM ao; +SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY segno; + +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 20; diff --git a/src/test/singlenode_isolation2/input/uao/modcount.source b/src/test/singlenode_isolation2/input/uao/modcount.source new file mode 100644 index 00000000000..f3397db5e6e --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/modcount.source @@ -0,0 +1,13 @@ +-- @Description Tests that DML operatins change the modification count. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; + +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); +INSERT INTO ao VALUES (11, 11); +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); +DELETE FROM ao WHERE a = 11; +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); +UPDATE AO SET b = 0 WHERE a = 10; +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); diff --git a/src/test/singlenode_isolation2/input/uao/modcount_vacuum.source b/src/test/singlenode_isolation2/input/uao/modcount_vacuum.source new file mode 100644 index 00000000000..b78fe9a6779 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/modcount_vacuum.source @@ -0,0 +1,12 @@ +-- @Description Tests that vacuum is not changing the modification count. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; + +DELETE FROM ao WHERE a < 5; +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); +VACUUM ao; +-- in case there's autovacuum worker running in the backend, the aoseg will not be dropped which has state = 2 +SELECT segno, modcount FROM gp_ao_or_aocs_seg('ao'); +SELECT sum(tupcount) FROM gp_ao_or_aocs_seg('ao') where state = 1; diff --git a/src/test/singlenode_isolation2/input/uao/parallel_delete.source b/src/test/singlenode_isolation2/input/uao/parallel_delete.source new file mode 100644 index 00000000000..6e435d61498 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/parallel_delete.source @@ -0,0 +1,23 @@ +-- @Description Tests that a delete operation in progress will block all other deletes +-- until the transaction is committed. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@ DISTRIBUTED BY (a); +insert into ao select generate_series(1,100); + +-- The actual test begins +1: BEGIN; +2: BEGIN; +2: DELETE FROM ao WHERE a = 2; +2: SELECT * FROM locktest_master WHERE coalesce = 'ao'; +2: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; +-- The case here should delete a tuple at the same seg with(2). +-- Under jump hash, (2) and (3) are on the same seg(seg0). +1&: DELETE FROM ao WHERE a = 3; +2: COMMIT; +1<: +1: COMMIT; +3: BEGIN; +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; +3: COMMIT; +0U: SELECT * FROM gp_toolkit.__gp_aovisimap('ao'); diff --git a/src/test/singlenode_isolation2/input/uao/parallel_update.source b/src/test/singlenode_isolation2/input/uao/parallel_update.source new file mode 100644 index 00000000000..3ea301bf543 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/parallel_update.source @@ -0,0 +1,21 @@ +-- @Description Tests that a update operation in progress will block all other updates +-- until the transaction is committed. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; + +-- The actual test begins +1: BEGIN; +2: BEGIN; +2: UPDATE ao SET b = 42 WHERE a = 2; +2: SELECT * FROM locktest_master WHERE coalesce = 'ao'; +2: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; +-- The case here should update a tuple at the same seg with(2). +-- Under jump hash, (2) and (3) are on the same seg(seg0). +1&: UPDATE ao SET b = 42 WHERE a = 3; +2: COMMIT; +1<: +1: COMMIT; +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; +0U: SELECT * FROM gp_toolkit.__gp_aovisimap('ao'); diff --git a/src/test/singlenode_isolation2/input/uao/parallel_update_readcommitted.source b/src/test/singlenode_isolation2/input/uao/parallel_update_readcommitted.source new file mode 100644 index 00000000000..2e6450a424e --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/parallel_update_readcommitted.source @@ -0,0 +1,16 @@ +-- @Description Tests that a update operation in progress will block all other updates +-- until the transaction is committed. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; + +-- The actual test begins +1: BEGIN; +2: BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; +1: UPDATE ao SET b = 42 WHERE b = 1; +2&: UPDATE ao SET b = -1 WHERE b = 1; +1: COMMIT; +2<: +2: COMMIT; +SELECT * FROM ao WHERE b < 2; diff --git a/src/test/singlenode_isolation2/input/uao/phantom_reads.source b/src/test/singlenode_isolation2/input/uao/phantom_reads.source new file mode 100644 index 00000000000..67b22c6c57f --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/phantom_reads.source @@ -0,0 +1,14 @@ +-- @Description Tests the basic phantom read behavior of GPDB. +-- Actually, no UAO is involved here. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +1: BEGIN; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +2: BEGIN; +2: INSERT INTO ao VALUES (101, 25); +2: COMMIT; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +1: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/phantom_reads_delete.source b/src/test/singlenode_isolation2/input/uao/phantom_reads_delete.source new file mode 100644 index 00000000000..37f75c975cb --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/phantom_reads_delete.source @@ -0,0 +1,14 @@ +-- @Description Tests the basic phantom read behavior of GPDB w.r.t to delete using +-- the default isolation level. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +1: BEGIN; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +2: BEGIN; +2: DELETE FROM AO where b = 25; +2: COMMIT; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +1: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/phantom_reads_delete_serializable.source b/src/test/singlenode_isolation2/input/uao/phantom_reads_delete_serializable.source new file mode 100644 index 00000000000..7b6e295f621 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/phantom_reads_delete_serializable.source @@ -0,0 +1,14 @@ +-- @Description Tests the basic phantom read behavior of GPDB w.r.t to delete using +-- the serializable isolation level. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +2: BEGIN; +2: DELETE FROM AO where b = 25; +2: COMMIT; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +1: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/phantom_reads_serializable.source b/src/test/singlenode_isolation2/input/uao/phantom_reads_serializable.source new file mode 100644 index 00000000000..0c53f297149 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/phantom_reads_serializable.source @@ -0,0 +1,14 @@ +-- @Description Tests the basic phantom read behavior of GPDB with serializable. +-- transactions. Actually, no UAO is involved here. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +2: BEGIN; +2: INSERT INTO ao VALUES (101, 25); +2: COMMIT; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +1: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/phantom_reads_update.source b/src/test/singlenode_isolation2/input/uao/phantom_reads_update.source new file mode 100644 index 00000000000..56326fd1ddb --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/phantom_reads_update.source @@ -0,0 +1,14 @@ +-- @Description Tests the basic phantom read behavior of GPDB w.r.t to updates using +-- the default isolation level. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +1: BEGIN; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +2: BEGIN; +2: UPDATE ao SET b = -1 WHERE a = 25; +2: COMMIT; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +1: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/phantom_reads_update_serializable.source b/src/test/singlenode_isolation2/input/uao/phantom_reads_update_serializable.source new file mode 100644 index 00000000000..1039f47712e --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/phantom_reads_update_serializable.source @@ -0,0 +1,14 @@ +-- @Description Tests the basic phantom read behavior of GPDB w.r.t to updates using +-- the serializable isolation level. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +2: BEGIN; +2: UPDATE ao SET b = -1 WHERE a = 25; +2: COMMIT; +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; +1: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/select_after_vacuum.source b/src/test/singlenode_isolation2/input/uao/select_after_vacuum.source new file mode 100644 index 00000000000..56e338d4646 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/select_after_vacuum.source @@ -0,0 +1,43 @@ +-- @Description Ensures that a select after a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP TABLE IF EXISTS ao2; +CREATE TABLE ao2 (a INT) USING @amname@; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao2 select generate_series(1,1000); + +-- The actual test begins +DELETE FROM ao WHERE a < 128; +1: BEGIN; +1: SELECT COUNT(*) FROM ao2; +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'); +2: VACUUM ao; +1: SELECT COUNT(*) FROM ao; +1: SELECT * FROM locktest_master WHERE coalesce = 'ao'; +1: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; +1: COMMIT; +1: SELECT COUNT(*) FROM ao; +3: INSERT INTO ao VALUES (0); +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'); +0: SELECT * FROM gp_ao_or_aocs_seg('ao'); diff --git a/src/test/singlenode_isolation2/input/uao/select_after_vacuum_serializable.source b/src/test/singlenode_isolation2/input/uao/select_after_vacuum_serializable.source new file mode 100644 index 00000000000..43ac8a64116 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/select_after_vacuum_serializable.source @@ -0,0 +1,36 @@ +-- @Description Ensures that a serializable select before during a vacuum operation blocks the vacuum. +-- +DROP TABLE IF EXISTS ao; +DROP TABLE IF EXISTS ao2; +CREATE TABLE ao (a INT) USING @amname@; +CREATE TABLE ao2 (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao2 select generate_series(1,1000); + +DELETE FROM ao WHERE a < 128; +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +1: SELECT COUNT(*) FROM ao2; +2: VACUUM ao; +1: SELECT COUNT(*) FROM ao; +1: COMMIT; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/select_before_vacuum.source b/src/test/singlenode_isolation2/input/uao/select_before_vacuum.source new file mode 100644 index 00000000000..47dcb787a25 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/select_before_vacuum.source @@ -0,0 +1,36 @@ +-- @Description Ensures that a select before a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); + +DELETE FROM ao WHERE a < 128; +1: BEGIN; +1: SELECT COUNT(*) FROM ao; +1: SELECT * FROM locktest_master WHERE coalesce = 'ao'; +1: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; +2&: VACUUM FULL ao; +1: COMMIT; +2<: +1: SELECT COUNT(*) FROM ao; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/select_while_delete.source b/src/test/singlenode_isolation2/input/uao/select_while_delete.source new file mode 100644 index 00000000000..5fe3f9ed498 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/select_while_delete.source @@ -0,0 +1,15 @@ +-- @Description Ensures that a select during a delete operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,100); + +2: BEGIN; +2: SELECT * FROM ao WHERE a < 5 ORDER BY a; +2: DELETE FROM ao WHERE a < 5; +1: SELECT * FROM ao WHERE a >= 5 AND a < 10 ORDER BY a; +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; +2: COMMIT; +2: SELECT * FROM ao WHERE a < 5 ORDER BY a; +4: SELECT * FROM ao WHERE a < 10 ORDER BY a; +4: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/select_while_full_vacuum.source b/src/test/singlenode_isolation2/input/uao/select_while_full_vacuum.source new file mode 100644 index 00000000000..ebf36d2a6b1 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/select_while_full_vacuum.source @@ -0,0 +1,32 @@ +-- @Description Ensures that a select during a full vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); + +DELETE FROM ao WHERE a < 128; +1: BEGIN; +1>: SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;COMMIT; +2: VACUUM FULL ao; +1<: +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/select_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/select_while_vacuum.source new file mode 100644 index 00000000000..997888fbf95 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/select_while_vacuum.source @@ -0,0 +1,32 @@ +-- @Description Ensures that a select during a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); + +DELETE FROM ao WHERE a < 128; +1: BEGIN; +1>: SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;COMMIT;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;COMMIT; +2: VACUUM ao; +1<: +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/select_while_vacuum_serializable.source b/src/test/singlenode_isolation2/input/uao/select_while_vacuum_serializable.source new file mode 100644 index 00000000000..38ca50d170c --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/select_while_vacuum_serializable.source @@ -0,0 +1,31 @@ +-- @Description Ensures that a select from a serializalbe transaction is ok after vacuum +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); + +DELETE FROM ao WHERE a < 128; +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +2: VACUUM ao; +1: SELECT COUNT(*) FROM ao; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/select_while_vacuum_serializable2.source b/src/test/singlenode_isolation2/input/uao/select_while_vacuum_serializable2.source new file mode 100644 index 00000000000..c2853ecce5c --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/select_while_vacuum_serializable2.source @@ -0,0 +1,36 @@ +-- @Description Run vacuum, while a serializable transaction is holding a lock +-- on the table. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); + +DELETE FROM ao WHERE a < 128; +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +1: SELECT COUNT(*) FROM ao; +2: SELECT segment_id, segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); +2: VACUUM ao; +1: SELECT COUNT(*) FROM ao; +1: COMMIT; +3: INSERT INTO ao VALUES (0); +2: SELECT segment_id, segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); diff --git a/src/test/singlenode_isolation2/input/uao/selectinsert_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/selectinsert_while_vacuum.source new file mode 100644 index 00000000000..48da5cf78fb --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/selectinsert_while_vacuum.source @@ -0,0 +1,37 @@ +-- @Description Ensures that an insert during a vacuum operation is ok +-- +CREATE TABLE selectinsert_while_vacuum_@amname@ (a INT) USING @amname@; +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); + +DELETE FROM selectinsert_while_vacuum_@amname@ WHERE a < 128; +4: BEGIN; +4: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@; +5: BEGIN; +4: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@; +4: BEGIN; +4: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@; +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; +2<: +3: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@ WHERE a = 1500; +3: INSERT INTO selectinsert_while_vacuum_@amname@ VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/selectinsertupdate_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/selectinsertupdate_while_vacuum.source new file mode 100644 index 00000000000..46e0d7ee504 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/selectinsertupdate_while_vacuum.source @@ -0,0 +1,15 @@ +-- @Description Ensures that an update during a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; + +DELETE FROM ao WHERE a < 2; +4: BEGIN; +4: SELECT COUNT(*) FROM ao; +4: INSERT INTO ao VALUES (1, 1); +4>: UPDATE ao SET b=1 WHERE a > 5;UPDATE ao SET b=1 WHERE a > 6;COMMIT; +2: VACUUM ao; +4<: +3: SELECT COUNT(*) FROM ao WHERE b = 1; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/selectupdate_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/selectupdate_while_vacuum.source new file mode 100644 index 00000000000..7b6e0521763 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/selectupdate_while_vacuum.source @@ -0,0 +1,33 @@ +-- @Description Ensures that an update during a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; + +DELETE FROM ao WHERE a < 128; +4: BEGIN; +4: SELECT COUNT(*) FROM ao; +5: BEGIN; +4: SELECT COUNT(*) FROM ao; +4: BEGIN; +4: SELECT COUNT(*) FROM ao; +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; +2<: +3: SELECT COUNT(*) FROM ao WHERE b = 1; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/update_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/update_while_vacuum.source new file mode 100644 index 00000000000..3ab1dbc7ebe --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/update_while_vacuum.source @@ -0,0 +1,14 @@ +-- @Description Ensures that an update before a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +DELETE FROM ao WHERE a < 12; +1: BEGIN; +1: SELECT COUNT(*) FROM ao; +1>: UPDATE ao SET b=1 WHERE a > 0;COMMIT; +2: VACUUM ao; +1<: +1: SELECT COUNT(*) FROM ao; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/vacuum_cleanup.source b/src/test/singlenode_isolation2/input/uao/vacuum_cleanup.source new file mode 100644 index 00000000000..1a7ebef0799 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/vacuum_cleanup.source @@ -0,0 +1,61 @@ +-- @Description Test that when AO vacuum skips drop phase, the age of +-- the AO/AOCS table gets reduced correctly. + +-- The age of the table is 1 after the following statement +2: create table ao_@amname@_vacuum_cleanup2(a int, b int) using @amname@; +-- 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; +-- The age of the table is 7 after the following 5 statements +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; + +1: set vacuum_freeze_min_age = 0; +-- Check the age of the table just before vacuum +1: select age(relfrozenxid), regexp_replace(replace(relname, 'ao_@amname@_vacuum_cleanup2'::regclass::oid::text, ''), 'ao.*seg', '') from gp_dist_random('pg_class') where relkind in ('r','t','o','b','M') and (relname like '%' || 'ao_@amname@_vacuum_cleanup2'::regclass::oid || '%') and gp_segment_id = 0; + +-- Hold AccessShareLock to make AO VACUUM skip drop phase +2: begin; +2: select count(*) from ao_@amname@_vacuum_cleanup2; +1: vacuum ao_@amname@_vacuum_cleanup2; + +-- The age should be smaller now. All the xids before the first +-- vacuum were frozen. The relfrozenxid will be the xid of the last +-- transaction before the vacuum (in this case it is the update statement) +1: select age(relfrozenxid), regexp_replace(replace(relname, 'ao_@amname@_vacuum_cleanup2'::regclass::oid::text, ''), 'ao.*seg', '') from gp_dist_random('pg_class') where relkind in ('r','t','o','b','M') and (relname like '%' || 'ao_@amname@_vacuum_cleanup2'::regclass::oid || '%') and gp_segment_id = 0; +2: end; + +-- Check that drop phase is skipped, but still the cleanup phase is performed +-- when there are concurrent serializable transactions +1: create table ao_@amname@_vacuum_cleanup3(a int, b int) using @amname@; +1: insert into ao_@amname@_vacuum_cleanup3 select i, i from generate_series(1, 100) i; +1: delete from ao_@amname@_vacuum_cleanup3; + +-- Check the age of the table before vacuum to make sure that clean phase gets +-- performed +1: select age(relfrozenxid), regexp_replace(replace(relname, 'ao_@amname@_vacuum_cleanup3'::regclass::oid::text, ''), 'ao.*seg', '') from gp_dist_random('pg_class') where relkind in ('r','t','o','b','M') and (relname like '%' || 'ao_@amname@_vacuum_cleanup3'::regclass::oid || '%') and gp_segment_id = 0; +1: select gp_inject_fault_infinite('vacuum_relation_open_relation_during_drop_phase', 'suspend', 1); +1&: vacuum ao_@amname@_vacuum_cleanup3; + +-- Wait till compaction phase is completed and only then start the serializable +-- transaction to ensure that only drop phase runs after the serializable +-- transaction started. Because the transaction is holding a lock on the table, +-- the drop phase cannot upgrade to AccessExclusiveLock and so recycling the +-- segfiles is skipped. +2: select gp_wait_until_triggered_fault('vacuum_relation_open_relation_during_drop_phase', 1, 1); +2: begin isolation level serializable; +2: select * from ao_@amname@_vacuum_cleanup3; +2: select gp_inject_fault('vacuum_relation_open_relation_during_drop_phase', 'reset', 1); + +1<: +1: select age(relfrozenxid), regexp_replace(replace(relname, 'ao_@amname@_vacuum_cleanup3'::regclass::oid::text, ''), 'ao.*seg', '') from gp_dist_random('pg_class') where relkind in ('r','t','o','b','M') and (relname like '%' || 'ao_@amname@_vacuum_cleanup3'::regclass::oid || '%') and gp_segment_id = 0; + +-- Validate that the drop phase was skipped. segfile 1 should be in state 2 +-- (AWAITING_DROP) +-- This result is related to data distribution. +-- Current hash algorithm is jump-consistent-hash. +1: SELECT * FROM gp_ao_or_aocs_seg('ao_@amname@_vacuum_cleanup3'); + +2: commit; diff --git a/src/test/singlenode_isolation2/input/uao/vacuum_self_function.source b/src/test/singlenode_isolation2/input/uao/vacuum_self_function.source new file mode 100644 index 00000000000..09387500774 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/vacuum_self_function.source @@ -0,0 +1,35 @@ +-- @Description Test scenario where a backend accesses AO table with a snapshot +-- that was acquired before vacuum. +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +DELETE FROM ao WHERE a <= 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; + +-- Launch function into the background. +1&: select myfunc(); + +-- Meanwhile, DELETE some rows and VACUUM. VACUUM should not recycle the +-- old tuple versions that are still needed by the function later. It will +-- compact the segfile, but keep the old segfile in AWAITING_DROP state. +2: DELETE FROM ao WHERE a <= 50; +2: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); +2: VACUUM ao; +2: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); + +-- A second VACUUM shouldn't recycle them either. +2: VACUUM ao; +2: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); +1<: + +-- Now that the first transaction has finished, VACUUM can recycle. +2: VACUUM ao; +2: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); diff --git a/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable.source b/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable.source new file mode 100644 index 00000000000..66e92f39277 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable.source @@ -0,0 +1,14 @@ +-- @Description Ensures that a vacuum with serializable works ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +DELETE FROM ao WHERE a <= 30; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SELECT COUNT(*) FROM ao; +SELECT *, segno, tupcount FROM gp_ao_or_aocs_seg('ao'); +VACUUM ao; +-- in case there's autovacuum worker running in the backend, the aoseg will not be dropped which has state = 2 +SELECT *, segno, tupcount FROM gp_ao_or_aocs_seg('ao') where state = 1 and tupcount > 0; +SELECT COUNT(*) FROM ao; diff --git a/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable2.source b/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable2.source new file mode 100644 index 00000000000..142a21880c1 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable2.source @@ -0,0 +1,18 @@ +-- @Description Ensures that a vacuum with serializable works ok +-- +DROP TABLE IF EXISTS ao; +DROP TABLE IF EXISTS ao2; +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE TABLE ao2 (a INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +DELETE FROM ao WHERE a <= 30; +1: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +1: SELECT COUNT(*) FROM ao; +1: BEGIN; +1: SELECT COUNT(*) FROM ao2; +2: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); +2: VACUUM ao; +2: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); +1: SELECT COUNT(*) FROM ao; +1: COMMIT; diff --git a/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable3.source b/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable3.source new file mode 100644 index 00000000000..7dec1acbf9d --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/vacuum_self_serializable3.source @@ -0,0 +1,16 @@ +-- @Description Ensures that a vacuum with serializable works ok +-- +DROP TABLE IF EXISTS ao; +DROP TABLE IF EXISTS ao2; +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE TABLE ao2 (a INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; + +DELETE FROM ao WHERE a <= 30; +SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SELECT COUNT(*) FROM ao; +SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); +VACUUM ao; +-- in case there's autovacuum worker running in the backend, the aoseg will not be dropped which has state = 2 +SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao') where state = 1 and tupcount > 0; +SELECT COUNT(*) FROM ao; diff --git a/src/test/singlenode_isolation2/input/uao/vacuum_while_insert.source b/src/test/singlenode_isolation2/input/uao/vacuum_while_insert.source new file mode 100644 index 00000000000..ef44a02113d --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/vacuum_while_insert.source @@ -0,0 +1,56 @@ +-- @Description Ensures that a vacuum during insert operations is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT) USING @amname@; +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); +insert into ao select generate_series(1,1000); + +DELETE FROM ao WHERE a < 128; +1: BEGIN; +1>: 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; +4: 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; +2: VACUUM ao; +1<: +4<: +3: SELECT COUNT(*) FROM ao WHERE a = 1500; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/uao/vacuum_while_vacuum.source b/src/test/singlenode_isolation2/input/uao/vacuum_while_vacuum.source new file mode 100644 index 00000000000..2a2543a9901 --- /dev/null +++ b/src/test/singlenode_isolation2/input/uao/vacuum_while_vacuum.source @@ -0,0 +1,18 @@ +-- @Description Ensures that an vacuum while a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +CREATE TABLE ao (a INT, b INT) USING @amname@; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; + +DELETE FROM ao WHERE a < 1200; +1: SELECT COUNT(*) FROM ao; +1>: VACUUM ao; +2: VACUUM ao; +1<: +1: SELECT COUNT(*) FROM ao; +3: INSERT INTO ao VALUES (0); diff --git a/src/test/singlenode_isolation2/input/workfile_mgr_test.source b/src/test/singlenode_isolation2/input/workfile_mgr_test.source new file mode 100644 index 00000000000..aec099f6b45 --- /dev/null +++ b/src/test/singlenode_isolation2/input/workfile_mgr_test.source @@ -0,0 +1,118 @@ +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 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 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 OR REPLACE FUNCTION gp_workfile_mgr_create_workset(worksetname text, interXact bool, holdPin bool, closeFile bool) +RETURNS void +LANGUAGE C VOLATILE EXECUTE ON ALL SEGMENTS AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'gp_workfile_mgr_create_workset'; + +CREATE OR REPLACE FUNCTION gp_workfile_mgr_create_empty_workset(worksetname text) +RETURNS void +LANGUAGE C VOLATILE EXECUTE ON ALL SEGMENTS AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'gp_workfile_mgr_create_workset'; + +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; + +-- 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; + +-- start_ignore +!\retcode gpconfig -c gp_workfile_max_entries -v 32 --skipvalidation; +!\retcode gpstop -ari; +-- end_ignore + +-- setup for workfile made in temp tablespace test +! mkdir -p '@testtablespace@/workfile_mgr'; +1: DROP TABLESPACE IF EXISTS work_file_test_ts; +1: CREATE TABLESPACE work_file_test_ts LOCATION '@testtablespace@/workfile_mgr'; + +1: select gp_workfile_mgr_test('atomic_test', 0); + +-- test will fail when the workset exceeds gp_workfile_max_entries, the workset will be released at the end of transaction. +1: select gp_workfile_mgr_test('workfile_fill_sharedcache', 0); +1: select segid, count(*) from gp_workfile_mgr_cache_entries() group by segid order by segid; + +1: select gp_workfile_mgr_test('workfile_create_and_set_cleanup', 2000); +1: select gp_workfile_mgr_test('workfile_create_and_individual_cleanup', 2000); +1: select gp_workfile_mgr_test('workfile_made_in_temp_tablespace', 2000); +1: select gp_workfile_mgr_test('workfile_create_and_individual_cleanup_with_pinned_workfile_set', 2000); + +1: DROP TABLESPACE work_file_test_ts; + +-- start_ignore +!\retcode gpconfig -r gp_workfile_max_entries --skipvalidation; +!\retcode gpstop -ari; +-- end_ignore + +-- test workset cleanup +2: begin; +2: select gp_workfile_mgr_create_workset('short_live_workset', false, false, false); +2: select gp_workfile_mgr_create_empty_workset('long_live_workset'); +2: select segid, count(*) from gp_workfile_mgr_cache_entries() group by segid order by segid; + +3: select gp_workfile_mgr_create_workset('inter_xact_workset', true, false, false); + +-- transaction commit will cleanup the pinned workfile_set. +4: begin; +4: select gp_workfile_mgr_create_workset('commit_tnx_workset', false, true, false); +4: select gp_workfile_mgr_create_workset('commit_tnx_workset_empty', false, true, true); +4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); +4: end; +4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); + +-- transaction abort will cleanup the workset. +4: begin; +4: select gp_workfile_mgr_create_workset('abort_tnx_workset', false, false, false); +4: select gp_workfile_mgr_create_workset('abort_tnx_workset_pinned', false, true, false); +4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); +4: abort; +4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); + +-- for workset lives across transaction, e.g. with hold cursor, proc exit will cleanup the workset +3q: + +-- The "q:" step does not wait for the backend process to exit. So +-- wait at the most 1 min so that only the long lived sessions are +-- reported. If we don't wait thte test sometimes fails because +-- "inter_xact_workset" entries show up in the output of +-- gp_workfile_mgr_cache_entries(). +4: select * from report_workfile_entries(); diff --git a/src/test/singlenode_isolation2/isolation2_resgroup_schedule b/src/test/singlenode_isolation2/isolation2_resgroup_schedule new file mode 100644 index 00000000000..e94ee880a4b --- /dev/null +++ b/src/test/singlenode_isolation2/isolation2_resgroup_schedule @@ -0,0 +1,54 @@ +test: resgroup/enable_resgroup_validate +test: resgroup/enable_resgroup + +# basic syntax +test: resgroup/resgroup_views +test: resgroup/resgroup_syntax +test: resgroup/resgroup_transaction +test: resgroup/resgroup_name_convention + +# fault injection tests +test: resgroup/resgroup_assign_slot_fail +test: resgroup/resgroup_unassign_entrydb +test: resgroup/resgroup_seg_down_2pc + +# functions +test: resgroup/resgroup_concurrency +test: resgroup/resgroup_bypass +test: resgroup/resgroup_bypass_memory_limit +test: resgroup/resgroup_alter_concurrency +test: resgroup/resgroup_memory_statistic +test: resgroup/resgroup_memory_limit +test: resgroup/resgroup_memory_runaway +test: resgroup/resgroup_alter_memory +test: resgroup/resgroup_cpu_rate_limit +test: resgroup/resgroup_alter_memory_spill_ratio +test: resgroup/resgroup_cpuset +test: resgroup/resgroup_cpuset_empty_default +test: resgroup/resgroup_set_memory_spill_ratio +test: resgroup/resgroup_unlimit_memory_spill_ratio +test: resgroup/resgroup_cancel_terminate_concurrency +test: resgroup/resgroup_move_query + +# memory spill tests +#test: resgroup/resgroup_memory_hashagg_spill +#test: resgroup/resgroup_memory_hashjoin_spill +#test: resgroup/resgroup_memory_materialize_spill +#test: resgroup/resgroup_memory_sisc_mat_sort +#test: resgroup/resgroup_memory_sisc_sort_spill +#test: resgroup/resgroup_memory_sort_spill +#test: resgroup/resgroup_memory_spilltodisk + +# regression tests +test: resgroup/resgroup_recreate +test: resgroup/resgroup_operator_memory +test: resgroup/resgroup_functions + +# parallel tests +#test: resgroup/restore_default_resgroup +#test: resgroup/resgroup_parallel_queries + +# dump info +test: resgroup/resgroup_dumpinfo + +test: resgroup/disable_resgroup diff --git a/src/test/singlenode_isolation2/isolation2_schedule b/src/test/singlenode_isolation2/isolation2_schedule new file mode 100644 index 00000000000..f19caa8045c --- /dev/null +++ b/src/test/singlenode_isolation2/isolation2_schedule @@ -0,0 +1,295 @@ +# test dispatch +# test: gpdispatch + +# test if gxid is valid or not on the cluster before running the tests +# test: check_gxid + +# test: checkpoint_dtx_info +# test: autovacuum-analyze +test: lockmodes +# test: pg_rewind_fail_missing_xlog +# test: prepared_xact_deadlock_pg_rewind +test: ao_partition_lock + +test: select_dropped_table +# test: update_hash_col_utilitymode execute_on_utilitymode + +# Tests for crash recovery +# test: uao_crash_compaction_column +# test: uao_crash_compaction_row +# test: crash_recovery +# test: crash_recovery_redundant_dtx +# test: crash_recovery_dtm +# test: unlogged_heap_tables +# test: unlogged_appendonly_tables +# test: udf_exception_blocks_panic_scenarios +# test: ao_same_trans_truncate_crash + +test: prevent_ao_wal + +# Tests for packcore, will use the coredumps generated in crash_recovery_dtm, +# so must be scheduled after that one. +test: packcore + +# # Tests on global deadlock detector +# test: gdd/prepare +# test: gdd/concurrent_update +# test: gdd/dist-deadlock-01 gdd/dist-deadlock-04 gdd/dist-deadlock-05 gdd/dist-deadlock-06 gdd/dist-deadlock-07 gdd/dist-deadlock-102 gdd/dist-deadlock-103 gdd/dist-deadlock-104 gdd/dist-deadlock-106 gdd/non-lock-105 +# test: gdd/dist-deadlock-upsert +# # until we can improve below flaky case please keep it disabled +# ignore: gdd/non-lock-107 +# # keep this in a separate group +# test: gdd/extended_protocol_test +# test: gdd/avoid-qd-deadlock +# test: gdd/delete-deadlock-root-leaf-concurrent-op +# test: gdd/update-deadlock-root-leaf-concurrent-op + +# # this resets the gp_global_deadlock_detector_period guc hence should +# # be last in the group. +# test: gdd/local-deadlock-03 +# # gdd end +# test: gdd/end + +# test: modify_table_data_corrupt + +# The following test injects a fault at a generic location +# (StartTransaction). The fault can be easily triggered by a +# concurrent test, so run the test by itself. +# test: deadlock_under_entry_db_singleton + +# this case creates table & index in utility mode, which may cause oid +# conflict when running in parallel with other cases. +# test: misc + +test: pg_views_concurrent_drop drop_rename resource_queue bitmap_index_ao_sparse +# removed: alter_blocks_for_update_and_viceversa reader_waits_for_lock starve_case + +# Test deadlock situation when waiting on a resource queue lock +# test: resource_queue_deadlock + +# Test simple cancellation for resource queues and cancellation/deadlocks for +# sessions with multiple portals. +# test: resource_queue_cancel resource_queue_multi_portal + +# below test(s) inject faults so each of them need to be in a separate group +test: pg_terminate_backend +# test: gp_terminate_mpp_backends + +# below case will cause failures on catalog changes, +# please keep it in a separate test group +# test: gpexpand_catalog_lock + +test: reindex +test: reindex_gpfastsequence +# test: commit_transaction_block_checkpoint +test: instr_in_shmem_setup +test: instr_in_shmem_terminate +# test: vacuum_recently_dead_tuple_due_to_distributed_snapshot +# test: vacuum_full_interrupt +# test: distributedlog-bug +test: invalidated_toast_index +# test: distributed_snapshot +# test: gp_collation +test: ao_upgrade +# test: bitmap_index_concurrent +# test: bitmap_index_crash +# test: bitmap_update_words_backup_block +test: bitmap_union +# test: bitmap_index_inspect + +# below test utilizes fault injectors so it needs to be in a group by itself +# test: external_table + +test: fsync_ao + +# Disable auto-vacuum for below tests +test: disable_autovacuum + +# Tests on Append-Optimized tables (row-oriented). +test: concurrent_index_creation_should_not_deadlock +test: uao/alter_while_vacuum_row +# removed: uao/alter_while_vacuum2_row +test: uao/compaction_full_stats_row +# test: uao/compaction_utility_row +# test: uao/compaction_utility_insert_row +test: uao/cursor_before_delete_row +test: uao/cursor_before_deletevacuum_row +test: uao/cursor_before_update_row +test: uao/cursor_withhold_row +test: uao/cursor_withhold2_row +test: uao/delete_while_vacuum_row +# test: uao/insert_policy_row +test: uao/insert_while_vacuum_row +test: uao/max_concurrency_row +test: uao/max_concurrency2_row +test: uao/modcount_row +test: uao/modcount_vacuum_row +# test: uao/parallel_delete_row +# test: uao/parallel_update_row +test: uao/parallel_update_readcommitted_row +test: uao/phantom_reads_row +test: uao/phantom_reads_serializable_row +test: uao/phantom_reads_delete_row +test: uao/phantom_reads_delete_serializable_row +test: uao/phantom_reads_update_row +test: uao/phantom_reads_update_serializable_row +test: uao/select_after_vacuum_row +test: uao/select_after_vacuum_serializable_row +test: uao/select_before_vacuum_row +test: uao/select_while_delete_row +test: uao/select_while_full_vacuum_row +test: uao/select_while_vacuum_row +test: uao/select_while_vacuum_serializable_row +test: uao/select_while_vacuum_serializable2_row +test: uao/selectinsert_while_vacuum_row +test: uao/selectinsertupdate_while_vacuum_row +test: uao/selectupdate_while_vacuum_row +test: uao/update_while_vacuum_row +test: uao/vacuum_self_serializable_row +test: uao/vacuum_self_serializable2_row +test: uao/vacuum_self_serializable3_row +test: uao/vacuum_self_function_row +test: uao/vacuum_while_insert_row +test: uao/vacuum_while_vacuum_row +# test: uao/vacuum_cleanup_row +test: uao/bitmapindex_rescan_row +# test: uao/limit_indexscan_inits_row +# test: reorganize_after_ao_vacuum_skip_drop truncate_after_ao_vacuum_skip_drop mark_all_aoseg_await_drop +# below test(s) inject faults so each of them need to be in a separate group +test: segwalrep/master_wal_switch + +# Tests on Append-Optimized tables (column-oriented). +# test: uao/alter_while_vacuum2_column +test: uao/compaction_full_stats_column +# test: uao/compaction_utility_column +# test: uao/compaction_utility_insert_column +test: uao/cursor_before_delete_column +test: uao/cursor_before_deletevacuum_column +test: uao/cursor_before_update_column +test: uao/cursor_withhold_column +test: uao/cursor_withhold2_column +test: uao/delete_while_vacuum_column +# test: uao/insert_policy_column +test: uao/insert_while_vacuum_column +test: uao/max_concurrency_column +test: uao/max_concurrency2_column +test: uao/modcount_column +test: uao/modcount_vacuum_column +# test: uao/parallel_delete_column +# test: uao/parallel_update_column +test: uao/parallel_update_readcommitted_column +test: uao/phantom_reads_column +test: uao/phantom_reads_serializable_column +test: uao/phantom_reads_delete_column +test: uao/phantom_reads_delete_serializable_column +test: uao/phantom_reads_update_column +test: uao/phantom_reads_update_serializable_column +test: uao/select_after_vacuum_column +test: uao/select_after_vacuum_serializable_column +test: uao/select_before_vacuum_column +test: uao/select_while_delete_column +test: uao/select_while_full_vacuum_column +test: uao/select_while_vacuum_column +test: uao/select_while_vacuum_serializable_column +test: uao/select_while_vacuum_serializable2_column +test: uao/selectinsert_while_vacuum_column +test: uao/selectinsertupdate_while_vacuum_column +test: uao/selectupdate_while_vacuum_column +test: uao/update_while_vacuum_column +test: uao/vacuum_self_serializable_column +test: uao/vacuum_self_serializable2_column +test: uao/vacuum_self_serializable3_column +test: uao/vacuum_self_function_column +test: uao/vacuum_while_insert_column +test: uao/vacuum_while_vacuum_column +# test: uao/vacuum_cleanup_column +test: uao/bitmapindex_rescan_column +# test: uao/limit_indexscan_inits_column + +# this case contains fault injection, must be put in a separate test group +# test: terminate_in_gang_creation +# test: prepare_limit +# test: add_column_after_vacuum_skip_drop_column +# test: vacuum_after_vacuum_skip_drop_column +# test workfile_mgr +test: workfile_mgr_test +# test: pg_basebackup +# test: pg_basebackup_with_tablespaces +test: enable_autovacuum + +# test: segwalrep/die_commit_pending_replication + +# Tests for FTS +# test: fts_errors +# test: segwalrep/replication_keeps_crash +# test: segwalrep/commit_blocking +# test: segwalrep/fts_unblock_primary +# test: segwalrep/recoverseg_from_file +# test: segwalrep/mirror_promotion +# test: segwalrep/cancel_commit_pending_replication +# test: segwalrep/twophase_tolerance_with_mirror_promotion +# test: segwalrep/failover_with_many_records +# test: segwalrep/dtm_recovery_on_standby +test: segwalrep/commit_blocking_on_standby +# test: segwalrep/dtx_recovery_wait_lsn +# test: fts_manual_probe +# test: fts_session_reset + +# Reindex tests +# test: reindex/abort_reindex +# test: reindex/createidx_while_reindex_idx_ao_btree reindex/createidx_while_reindex_idx_heap_btree reindex/createidx_while_reindex_idx_aoco_btree +# test: reindex/createidx_while_reindex_idx_ao_bitmap reindex/createidx_while_reindex_idx_heap_bitmap reindex/createidx_while_reindex_idx_aoco_bitmap +# test: reindex/reindextable_while_addpart_ao_part_btree reindex/reindextable_while_addpart_heap_part_btree reindex/reindextable_while_addpart_aoco_part_btree +# test: reindex/reindextable_while_altertable_ao_part_btree reindex/reindextable_while_altertable_heap_part_btree reindex/reindextable_while_altertable_aoco_part_btree + +# The below tests will cause dead lock when reindexing on partitioned table and dropping index concurrently +# upstream also has this issue, so disable them for now +# test: reindex/reindextable_while_dropindex_ao_part_btree reindex/reindextable_while_dropindex_heap_part_btree reindex/reindextable_while_dropindex_aoco_part_btree + +# test: reindex/reindextable_while_reindex_idx_ao_part_btree reindex/reindextable_while_reindex_idx_heap_part_btree reindex/reindextable_while_reindex_idx_aoco_part_btree +# test: reindex/reindextable_while_reindex_idx_ao_bitmap reindex/reindextable_while_reindex_idx_heap_bitmap reindex/reindextable_while_reindex_idx_aoco_bitmap +# test: reindex/serializable_reindex_with_drop_column_heap +# test: reindex/serializable_reindex_with_drop_index_ao reindex/serializable_reindex_with_drop_index_heap +# test: reindex/repeatable_read_reindex_with_insert_heap +# test: reindex/vacuum_analyze_while_reindex_ao_btree +# test: reindex/vacuum_while_reindex_ao_bitmap reindex/vacuum_while_reindex_heap_btree reindex/vacuum_while_reindex_heap_btree_toast + +# Cancel test +test: cancel_plpython +test: cancel_query + +# Tests for getting numsegments in utility mode +# test: upgrade_numsegments +# Memory accounting tests + +# OOM tests start +test: create_memory_accounting_tables +ignore: setup_memory_accounting +ignore: oom_mixed_1 oom_mixed_2 oom_simple +ignore: restore_memory_accounting_default +# Sleep and OOM tests end + +# Startup OOM tests start +test: setup_startup_memory_accounting +test: oom_startup_memory +test: restore_memory_accounting_default +test: runaway_query + +# test: distributed_transactions + +# Test for tablespace +# test: concurrent_drop_truncate_tablespace + +# Test for distributed commit array overflow during replay on standby +# Skip standby_replay_dtx_info, it will cause standby down +# test: standby_replay_dtx_info + +# test the orphan temp table is dropped on the coordinator when panic happens on segment +# test: orphan_temp_table + +# test if gxid is valid or not on the cluster after running the tests +# test: check_gxid + +# test if GUC is synchronized from the QD to QEs. +# test: sync_guc + diff --git a/src/test/singlenode_isolation2/output/ao_upgrade.source b/src/test/singlenode_isolation2/output/ao_upgrade.source new file mode 100644 index 00000000000..5bfc56e95c3 --- /dev/null +++ b/src/test/singlenode_isolation2/output/ao_upgrade.source @@ -0,0 +1,205 @@ +-- set_ao_formatversion forces an AO[CO] format to a specific version (the last +-- argument is set to true for a column-oriented table, and false otherwise). +CREATE OR REPLACE FUNCTION set_ao_formatversion(aosegrel oid, version smallint, isaocs bool) RETURNS bool AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'setAOFormatVersion' LANGUAGE C RETURNS NULL ON NULL INPUT; +CREATE + +DROP TABLE IF EXISTS ao_upgrade_test; +DROP +DROP TABLE IF EXISTS aocs_upgrade_test; +DROP +DROP TABLE IF EXISTS aocs_rle_upgrade_test; +DROP + +CREATE TABLE ao_upgrade_test (rowid int, n numeric) USING ao_row; +CREATE +CREATE TABLE aocs_upgrade_test (rowid int, n numeric) USING ao_column; +CREATE +CREATE TABLE aocs_rle_upgrade_test (rowid int, n numeric) USING ao_column WITH (compresstype=RLE_TYPE); +CREATE + +-- We want to load GPDB4 numerics into the table; to do that, add a direct cast +-- from bytea to numeric so we can hardcode what the GPDB4 data looked like. +CREATE CAST (bytea AS numeric) WITHOUT FUNCTION; +CREATE + +INSERT INTO ao_upgrade_test VALUES (1, '\x000003000c007a0d'::bytea::numeric), -- 12.345 (2, '\x00000000'::bytea::numeric), -- 0 (3, '\x000003400c007a0d'::bytea::numeric), -- -12.345 (4, '\x010000000100'::bytea::numeric), -- 10000 (5, '\xfeff0500e803'::bytea::numeric), -- 0.00001 (6, '\xfeff0900e803'::bytea::numeric), -- 0.000010000 (7, '\x190000000100'::bytea::numeric), -- 1e100 (8, '\x010000002400400b'::bytea::numeric), -- 9! (362880) (9, '\x000000c0'::bytea::numeric); -- NaN INSERT INTO aocs_upgrade_test VALUES (1, '\x000003000c007a0d'::bytea::numeric), -- 12.345 (2, '\x00000000'::bytea::numeric), -- 0 (3, '\x000003400c007a0d'::bytea::numeric), -- -12.345 (4, '\x010000000100'::bytea::numeric), -- 10000 (5, '\xfeff0500e803'::bytea::numeric), -- 0.00001 (6, '\xfeff0900e803'::bytea::numeric), -- 0.000010000 (7, '\x190000000100'::bytea::numeric), -- 1e100 (8, '\x010000002400400b'::bytea::numeric), -- 9! (362880) (9, '\x000000c0'::bytea::numeric); -- NaN +-- For the RLE test case, insert a bunch of identical numerics so they will be +-- run-length compressed. +INSERT INTO aocs_rle_upgrade_test (SELECT a, '\x010000002400400b'::bytea::numeric FROM generate_series(1, 10) a); +INSERT 10 + +-- Downgrade to GPDB4 (AO version 2). +--start_ignore +*U: SELECT set_ao_formatversion( (SELECT segrelid FROM pg_appendonly WHERE relid = 'ao_upgrade_test'::regclass), 2::smallint, false); + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) +*U: SELECT set_ao_formatversion( (SELECT segrelid FROM pg_appendonly WHERE relid = 'aocs_upgrade_test'::regclass), 2::smallint, true); + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) +*U: SELECT set_ao_formatversion( (SELECT segrelid FROM pg_appendonly WHERE relid = 'aocs_rle_upgrade_test'::regclass), 2::smallint, true); + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) + + set_ao_formatversion +---------------------- + t +(1 row) +--end_ignore + +-- Scan test. The numerics should be fixed again. +SELECT * FROM ao_upgrade_test; + rowid | n +-------+------------------------------------------------------------------------------------------------------- + 2 | 0 + 5 | 0.00001 + 6 | 0.000010000 + 9 | NaN + 1 | 12.345 + 3 | -12.345 + 4 | 10000 + 7 | 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 8 | 362880 +(9 rows) +SELECT * FROM aocs_upgrade_test; + rowid | n +-------+------------------------------------------------------------------------------------------------------- + 2 | 0 + 5 | 0.00001 + 6 | 0.000010000 + 9 | NaN + 4 | 10000 + 7 | 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 8 | 362880 + 1 | 12.345 + 3 | -12.345 +(9 rows) +SELECT * FROM aocs_rle_upgrade_test; + rowid | n +-------+-------- + 1 | 362880 + 2 | 362880 + 3 | 362880 + 4 | 362880 + 5 | 362880 + 6 | 362880 + 7 | 362880 + 8 | 362880 + 9 | 362880 + 10 | 362880 +(10 rows) + +-- Fetch test. To force fetches, we'll add bitmap indexes and disable sequential +-- scan. +CREATE INDEX ao_bitmap_index ON ao_upgrade_test USING bitmap(n); +CREATE +CREATE INDEX aocs_bitmap_index ON aocs_upgrade_test USING bitmap(n); +CREATE +CREATE INDEX aocs_rle_bitmap_index ON aocs_rle_upgrade_test USING bitmap(n); +CREATE + +SET enable_seqscan TO off; +SET + +-- Ensure we're using a bitmap scan for our tests. Upgrade note to developers: +-- the only thing that this test needs to verify is that a fetch-based scan is +-- in use. Other diffs are fine. +EXPLAIN SELECT n FROM ao_upgrade_test WHERE n = factorial(9); + QUERY PLAN +---------------------------------------------------------------------------------------- + Index Scan using ao_bitmap_index on ao_upgrade_test (cost=0.00..8.02 rows=1 width=32) + Index Cond: (n = '362880'::numeric) + Optimizer: Postgres query optimizer +(3 rows) +EXPLAIN SELECT n FROM aocs_upgrade_test WHERE n = factorial(9); + QUERY PLAN +-------------------------------------------------------------------------------------------- + Index Scan using aocs_bitmap_index on aocs_upgrade_test (cost=0.00..8.02 rows=1 width=32) + Index Cond: (n = '362880'::numeric) + Optimizer: Postgres query optimizer +(3 rows) +EXPLAIN SELECT n FROM aocs_rle_upgrade_test WHERE n = factorial(9); + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Index Scan using aocs_rle_bitmap_index on aocs_rle_upgrade_test (cost=0.00..8.02 rows=1 width=32) + Index Cond: (n = '362880'::numeric) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT n FROM ao_upgrade_test WHERE n = factorial(9); + n +-------- + 362880 +(1 row) +SELECT n FROM aocs_upgrade_test WHERE n = factorial(9); + n +-------- + 362880 +(1 row) +SELECT n FROM aocs_rle_upgrade_test WHERE n = factorial(9); + n +-------- + 362880 + 362880 + 362880 + 362880 + 362880 + 362880 + 362880 + 362880 + 362880 + 362880 +(10 rows) + +RESET enable_seqscan; +RESET + +DROP CAST (bytea AS numeric); +DROP +DROP FUNCTION set_ao_formatversion(oid, smallint, bool); +DROP diff --git a/src/test/singlenode_isolation2/output/autovacuum-analyze.source b/src/test/singlenode_isolation2/output/autovacuum-analyze.source new file mode 100644 index 00000000000..382b443944c --- /dev/null +++ b/src/test/singlenode_isolation2/output/autovacuum-analyze.source @@ -0,0 +1,636 @@ +-- Enable auto-ANALYZE only on AUTOVACUUM launcher. When set `autovacuum` to +-- true on Master, the launcher will take care of databases' analyze job on Master. +-- VACUUM anti-XID wraparounds of 'template0' is not changed. + +-- Speed up test. +ALTER SYSTEM SET autovacuum_naptime = 5; +ALTER +select * from pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +-- +-- Test1, sanity test to make sure auto-analyze works +-- + +-- Analyze all exists relations to prevent autoanalyze on them. +-- These actually don't have too much effort for preventing +-- autoanalyze on other tables, but it could reduce some of tables. +1: ANALYZE; +ANALYZE + +-- Prepare the table to be ANALYZEd +1: CREATE TABLE anatest (id bigint); +CREATE + +-- Track report gpstat on master +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'anatest', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- Track that we have updated the attributes stats in pg_statistic when finished +SELECT gp_inject_fault('analyze_finished_one_relation', 'skip', '', '', 'anatest', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'anatest', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) + +1&: INSERT INTO anatest select i from generate_series(1, 1000) as i; + +-- Wait until report pgstat on master +SELECT gp_wait_until_triggered_fault('gp_pgstat_report_on_master', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +1<: <... completed> +INSERT 1000 + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + datname | query +----------------+---------------------------------------------------------------------------------------------------------- + isolation2test | select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + isolation2test | autovacuum: ANALYZE public.anatest +(2 rows) +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Should have statistic updated. +SELECT count(*) FROM pg_statistic where starelid = 'anatest'::regclass; + count +------- + 1 +(1 row) +select relpages, reltuples from pg_class where oid = 'anatest'::regclass; + relpages | reltuples +----------+----------- + 3 | 1000 +(1 row) + + +-- +-- Test2, sanity test to make sure auto-analyze works on partition leaf tables +-- + +-- 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 + +-- Track report gpstat on master +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'rankpart_1_prt_extra', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- Track that we have updated the attributes stats in pg_statistic when finished +SELECT gp_inject_fault('analyze_finished_one_relation', 'skip', '', '', 'rankpart_1_prt_5', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'rankpart_1_prt_extra', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- No data inserted into rankpart_1_prt_6 +1&: insert into rankpart select i, i % 8, i from generate_series(1, 1000)i; + +-- Wait until report pgstat on master +SELECT gp_wait_until_triggered_fault('gp_pgstat_report_on_master', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +1<: <... completed> +INSERT 1000 + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + datname | query +----------------+---------------------------------------------------------------------------------------------------------- + isolation2test | select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + isolation2test | autovacuum: ANALYZE public.rankpart_1_prt_extra +(2 rows) +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Should have statistic updated. +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_extra'::regclass; + count +------- + 3 +(1 row) +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_2'::regclass; + count +------- + 3 +(1 row) +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_3'::regclass; + count +------- + 3 +(1 row) +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_4'::regclass; + count +------- + 3 +(1 row) +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_5'::regclass; + count +------- + 3 +(1 row) +SELECT count(*) FROM pg_statistic where starelid = 'rankpart_1_prt_6'::regclass; + count +------- + 0 +(1 row) +SELECT count(*) FROM pg_statistic where starelid = 'rankpart'::regclass; + count +------- + 0 +(1 row) +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_extra'::regclass; + relpages | reltuples +----------+----------- + 3 | 125 +(1 row) +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_2'::regclass; + relpages | reltuples +----------+----------- + 3 | 250 +(1 row) +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_3'::regclass; + relpages | reltuples +----------+----------- + 3 | 250 +(1 row) +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_4'::regclass; + relpages | reltuples +----------+----------- + 3 | 250 +(1 row) +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_5'::regclass; + relpages | reltuples +----------+----------- + 3 | 125 +(1 row) +select relpages, reltuples from pg_class where oid = 'rankpart_1_prt_6'::regclass; + relpages | reltuples +----------+----------- + 0 | -1 +(1 row) +select relpages, reltuples from pg_class where oid = 'rankpart'::regclass; + relpages | reltuples +----------+----------- + 0 | -1 +(1 row) + + +-- +-- Test3, if another transaction want to acquire lock which conflict with +-- auto-analyze's ShareUpdateExclusiveLock, the auto-analyze should abort. +-- + +1: CREATE TABLE anaabort(id int); +CREATE + +-- Track report gpstat on master +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'anaabort', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'anaabort', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- Suspend the autovacuum worker after holding ShareUpdateExclusiveLock. +SELECT gp_inject_fault('analyze_after_hold_lock', 'infinite_loop', '', '', 'anaabort', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) +-- Track the autovacuum worker abort for conflict ShareUpdateExclusiveLock. +SELECT gp_inject_fault('auto_vac_worker_abort', 'skip', '', '', 'anaabort', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) + +1&: INSERT INTO anaabort select i from generate_series(1, 1000) as i; + +-- Wait until report pgstat on master +SELECT gp_wait_until_triggered_fault('gp_pgstat_report_on_master', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +1<: <... completed> +INSERT 1000 + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + datname | query +----------------+---------------------------------------------------------------------------------------------------------- + isolation2test | select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + isolation2test | autovacuum: ANALYZE public.anaabort +(2 rows) +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Wait until autovacuum work hold ShareUpdateExclusiveLock. +SELECT gp_wait_until_triggered_fault('analyze_after_hold_lock', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Acquire EXCLUSIVE lock on the analyze table +1: BEGIN; +BEGIN +1&: LOCK TABLE anaabort in EXCLUSIVE mode; + +-- The auto-analyze should abort +SELECT gp_wait_until_triggered_fault('auto_vac_worker_abort', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('auto_vac_worker_abort', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('analyze_after_hold_lock', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Get lock +1<: <... completed> +LOCK + +-- Shouldn't have statistic updated. +SELECT count(*) FROM pg_statistic where starelid = 'anaabort'::regclass; + count +------- + 0 +(1 row) +select relpages, reltuples from pg_class where oid = 'anaabort'::regclass; + relpages | reltuples +----------+----------- + 0 | -1 +(1 row) + +1: END; +END + +-- +-- Test 4, auto-ANALYZE and auto_stats could work at the same time. +-- With `on_no_stats` mode, if insert into a empty table, ANALYZE gets triggered. +-- But this doesn't prevent auto-ANALYZE for the table. (Case 1) +-- And for `on_change` mode, if the modified tuples reach the auto_stats threshold, +-- auto_stats will get triggered, this also doesn't prevent auto-ANALYZE. (Case 2) +-- But, if not reach the auto_stats threshold, then only auto-ANALYZE will be considered. (Case 3) +-- More details, please refer to the Implementation part of +-- src/backend/postmaster/README.auto-ANALYZE. +-- + +-- Case 1 -- +2: SET gp_autostats_mode = 'on_no_stats'; +SET + +-- Prepare the table to be ANALYZEd +2: CREATE TABLE autostatstbl (id bigint); +CREATE + +-- 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); + gp_inject_fault +----------------- + Success: +(1 row) +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'autostatstbl', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- with auto_stats, the auto-ANALYZE still trigger +2: INSERT INTO autostatstbl select i from generate_series(1, 1000) as i; +INSERT 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; + count +------- + 1 +(1 row) +select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; + relpages | reltuples +----------+----------- + 3 | 1000 +(1 row) +-- expect analyze_count = 1, autoanalyze_count = 0, and n_mod_since_analyze = 1000 since ANALYZE executed +-- in same transaction for the insert statement. +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + analyze_count | autoanalyze_count | n_mod_since_analyze +---------------+-------------------+--------------------- + 1 | 0 | 1000 +(1 row) + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + datname | query +----------------+---------------------------------------------------------------------------------------------------------- + isolation2test | select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + isolation2test | autovacuum: ANALYZE public.autostatstbl +(2 rows) +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- we can see the auto-ANALYZE finished +select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; + relpages | reltuples +----------+----------- + 3 | 1000 +(1 row) +-- expect analyze_count = 1, autoanalyze_count = 1, and n_mod_since_analyze = 0 +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + analyze_count | autoanalyze_count | n_mod_since_analyze +---------------+-------------------+--------------------- + 1 | 1 | 0 +(1 row) + +-- Case 2 -- +-- with auto_stats 'on_change' mode, the auto-ANALYZE still trigger +2: SET gp_autostats_mode = 'on_change'; +SET +2: SET gp_autostats_on_change_threshold = 500; +SET + +-- 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); + gp_inject_fault +----------------- + Success: +(1 row) +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'autostatstbl', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) + +2: INSERT INTO autostatstbl select i from generate_series(1001, 2000) as i; +INSERT 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; + relpages | reltuples +----------+----------- + 3 | 2000 +(1 row) +-- expect analyze_count = 2, autoanalyze_count = 1, and n_mod_since_analyze = 1000 since ANALYZE executed +-- in same transaction for the insert statement. +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + analyze_count | autoanalyze_count | n_mod_since_analyze +---------------+-------------------+--------------------- + 2 | 1 | 1000 +(1 row) + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + datname | query +----------------+---------------------------------------------------------------------------------------------------------- + isolation2test | select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + isolation2test | autovacuum: ANALYZE public.autostatstbl +(2 rows) +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- we can see the auto-ANALYZE finished, check statistic and analyze count +select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; + relpages | reltuples +----------+----------- + 3 | 2000 +(1 row) +-- expect analyze_count = 2, autoanalyze_count = 2, and n_mod_since_analyze = 0 +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + analyze_count | autoanalyze_count | n_mod_since_analyze +---------------+-------------------+--------------------- + 2 | 2 | 0 +(1 row) + + +-- Case 3 -- +-- reset the threshold, so auto_stats will not be triggered and then auto-ANALYZE will be triggered. +2: RESET gp_autostats_on_change_threshold; +RESET + +-- 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); + gp_inject_fault +----------------- + Success: +(1 row) +-- Suspend the autovacuum worker from analyze before +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', '', 'autostatstbl', 1, -1, 0, 1); + gp_inject_fault +----------------- + Success: +(1 row) + +2: INSERT INTO autostatstbl select i from generate_series(2001, 3000) as i; +INSERT 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; + relpages | reltuples +----------+----------- + 3 | 2000 +(1 row) +-- expect analyze_count = 2, autoanalyze_count = 2, and n_mod_since_analyze = 1000 since ANALYZE executed +-- in same transaction for the insert statement. +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + analyze_count | autoanalyze_count | n_mod_since_analyze +---------------+-------------------+--------------------- + 2 | 2 | 1000 +(1 row) + +-- Wait until autovacuum is triggered +SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + datname | query +----------------+---------------------------------------------------------------------------------------------------------- + isolation2test | select datname, query from pg_stat_activity where query like '%ANALYZE%' and datname=current_database(); + isolation2test | autovacuum: ANALYZE public.autostatstbl +(2 rows) +SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Wait until autovacuum worker updates pg_database +SELECT gp_wait_until_triggered_fault('analyze_finished_one_relation', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +SELECT gp_inject_fault('analyze_finished_one_relation', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- we can see the auto-ANALYZE finished, check statistic and analyze count +select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; + relpages | reltuples +----------+----------- + 6 | 3000 +(1 row) +-- expect analyze_count = 2, autoanalyze_count = 3, and n_mod_since_analyze = 0 since ANALYZE executed +select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_tables_internal where relname = 'autostatstbl'; + analyze_count | autoanalyze_count | n_mod_since_analyze +---------------+-------------------+--------------------- + 2 | 3 | 0 +(1 row) + +-- Reset GUCs. +ALTER SYSTEM RESET autovacuum_naptime; +ALTER +select * from pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + diff --git a/src/test/singlenode_isolation2/output/external_table.source b/src/test/singlenode_isolation2/output/external_table.source new file mode 100644 index 00000000000..c737b5ac83a --- /dev/null +++ b/src/test/singlenode_isolation2/output/external_table.source @@ -0,0 +1,255 @@ +CREATE EXTENSION IF NOT EXISTS gp_inject_fault; +CREATE + +-- start_ignore +DROP EXTERNAL TABLE IF EXISTS exttab_cursor_1; +DROP +DROP EXTERNAL TABLE IF EXISTS exttab_cursor_2; +DROP +-- 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 +-- 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 +-- 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. +10: set CLIENT_MIN_MESSAGES=WARNING; +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 +10: COMMIT; +COMMIT +10: reset CLIENT_MIN_MESSAGES; +RESET + +-- Fetch on external table scans with segment reject limit reached +10: SELECT gp_truncate_error_log('exttab_cursor_1'); + gp_truncate_error_log +----------------------- + t +(1 row) +10: SELECT gp_truncate_error_log('exttab_cursor_2'); + gp_truncate_error_log +----------------------- + t +(1 row) +-- DECLARE CURSOR implicitly initiates a FETCH on the segments. If one of +-- the segments reaches the reject limit and reports the error back to the QD +-- before the others, the transaction gets aborted. The timing of fetching the +-- results will influence the order of the ERROR in the output. +-- +-- For gp_interconnect_type=tcp: +-- If the segment errors out before QD call 'SetupInterconnect', QD will report +-- this error in 'SetupInterconnect', or else, QD will report the error in the +-- following FETCH command. +-- +-- To make this test deterministic, we use gp_inject_fault to let QD suspend +-- before 'SetupInterconnect' to make sure QD calls 'SetupInterconnect' after +-- segment errors out. + +-- Suspend QD when it is setting up interconnect. +SELECT gp_inject_fault('interconnect_setup_palloc', 'suspend', dbid) FROM gp_segment_configuration WHERE content=-1 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Inject fault on QE to determine when it aborts. +SELECT gp_inject_fault('transaction_abort_failure', 'skip', dbid) FROM gp_segment_configuration WHERE content=0 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Start a transaction with cursor that triggers error on QE +10: BEGIN; +BEGIN +10&: DECLARE exttab_cur1 no scroll cursor FOR SELECT e1.i, e2.j from exttab_cursor_2 e1 INNER JOIN exttab_cursor_2 e2 ON e1.i = e2.i UNION ALL SELECT e1.i, e2.j from exttab_cursor_2 e1 INNER JOIN exttab_cursor_2 e2 ON e1.i = e2.i UNION ALL SELECT e1.i, e2.j from exttab_cursor_2 e1 INNER JOIN exttab_cursor_2 e2 ON e1.i = e2.i; + +-- Ensure that QE has hit an error +SELECT gp_wait_until_triggered_fault('transaction_abort_failure', 1, dbid) FROM gp_segment_configuration WHERE content=0 AND role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +SELECT gp_wait_until_triggered_fault('interconnect_setup_palloc', 1, dbid) FROM gp_segment_configuration WHERE content=-1 AND role='p'; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- Resume QD. +-- Error from QE should be reported after QD resumes +SELECT gp_inject_fault('interconnect_setup_palloc', 'resume', dbid) FROM gp_segment_configuration WHERE content=-1 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Check the result +10<: <... completed> +ERROR: segment reject limit reached, aborting operation (seg0 slice1 @hostname@:25432 pid=20500) +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 + +-- Reset injected faults +SELECT gp_inject_fault('transaction_abort_failure', 'reset', dbid) FROM gp_segment_configuration WHERE content=0 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('interconnect_setup_palloc', 'reset', dbid) FROM gp_segment_configuration WHERE content=-1 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- This should have errors populated already +10: SELECT count(*) > 0 FROM gp_read_error_log('exttab_cursor_2'); + ?column? +---------- + t +(1 row) + +-- Fetch on external table scans without reaching segment reject limit +10: SELECT gp_truncate_error_log('exttab_cursor_1'); + gp_truncate_error_log +----------------------- + t +(1 row) +10: SELECT gp_truncate_error_log('exttab_cursor_2'); + gp_truncate_error_log +----------------------- + t +(1 row) +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 +-- Should not fail +10: FETCH exttab_cur1; + i | j +---+---------- + 1 | 1_number +(1 row) +10: FETCH exttab_cur1; + i | j +---+---------- + 2 | 2_number +(1 row) +10: FETCH exttab_cur1; + i | j +---+---------- + 4 | 4_number +(1 row) +10: FETCH exttab_cur1; + i | j +---+---------- + 6 | 6_number +(1 row) +10: FETCH exttab_cur1; + i | j +---+---------- + 7 | 7_number +(1 row) +10: FETCH exttab_cur1; + i | j +---+---------- + 8 | 8_number +(1 row) +10: FETCH exttab_cur1; + i | j +---+---------- + 9 | 9_number +(1 row) +10: FETCH exttab_cur1; + i | j +----+----------- + 10 | 10_number +(1 row) +10: FETCH exttab_cur1; + i | j +---+--- +(0 rows) +10: FETCH exttab_cur1; + i | j +---+--- +(0 rows) +10: COMMIT; +COMMIT + + +GP_IGNORE:-- start_ignore +GP_IGNORE:DROP EXTERNAL WEB TABLE IF EXISTS ext_delim_off; +GP_IGNORE:DROP +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 + +-- Query the ext_delim_off table +SELECT * FROM ext_delim_off; + junk +------ + hi +(1 row) + +GP_IGNORE:-- start_ignore +GP_IGNORE:DROP EXTERNAL TABLE IF EXISTS ext_delimiter_off_text; +GP_IGNORE:DROP +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 + +SELECT * FROM ext_delimiter_off_text; + a +--- + O +(1 row) + +GP_IGNORE:-- start_ignore +GP_IGNORE:DROP EXTERNAL TABLE IF EXISTS ext_delimiter_off_csv; +GP_IGNORE:DROP +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 + +SELECT * FROM ext_delimiter_off_csv; + a +--- + O +(1 row) + +-- start_ignore +DROP EXTERNAL TABLE IF EXISTS exttab_delimiter_escape_off; +DROP +-- 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 + +SELECT * FROM exttab_delimiter_escape_off ORDER BY a; + a +---------------------------------- + correct record in lower + CORRECT RECORD IN UPPER + line with backslash 3\1001300102 + Value off + Value OFF +(5 rows) diff --git a/src/test/singlenode_isolation2/output/fts_manual_probe.source b/src/test/singlenode_isolation2/output/fts_manual_probe.source new file mode 100644 index 00000000000..ed3900646d3 --- /dev/null +++ b/src/test/singlenode_isolation2/output/fts_manual_probe.source @@ -0,0 +1,115 @@ +-- See src/backend/fts/README for background information +-- +-- This tests two scenarios: +-- 1) Piggyback Test +-- Ensure multiple probe requests come in before the start of a new ftsLoop, +-- then all those requests share the same result. +-- +-- 2) Fresh Result Test +-- Ensure fresh results when a probe request occurs during an in progress +-- ftsLoop. +-- +-- It is useful to remember that the FtsLoop and each FtsNotifyProbe are +-- individual processes. Careful use of fault injectors are needed to have +-- complete and consistent control over the flow of the two independent +-- processes - the ftsLoop and FtsNotifyProber's. +-- +-- NOTE: you must add '--load-extension=gp_inject_fault' to the commandline +-- for a manual test. + +select gp_inject_fault('all', 'reset', 1) from master(); + gp_inject_fault +----------------- + Success: +(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 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 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 + +-- ensure there is no in progress ftsLoop after reloading the gp_fts_probe_interval +select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +select * from get_stats; + seq | seq_name | expected_start_delta | actual_start_delta | expected_done_delta | actual_done_delta +-----+----------+----------------------+--------------------+---------------------+------------------- +(0 rows) + +-- piggyback test: start multiple probes +select gp_inject_fault_infinite('ftsNotify_before', 'suspend', 1) from master(); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) + +1&: select gp_request_fts_probe_scan(); +2&: select gp_request_fts_probe_scan(); +3&: select gp_request_fts_probe_scan(); + +-- piggyback: ensure the probe requests are at a known starting location +select gp_wait_until_triggered_fault('ftsNotify_before', 3, 1) from master(); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) + +-- piggyback: ensure the ftsLoop is at a known starting location +select * from get_stats; + seq | seq_name | expected_start_delta | actual_start_delta | expected_done_delta | actual_done_delta +-----+----------+----------------------+--------------------+---------------------+------------------- +(0 rows) +select gp_inject_fault('ftsNotify_before', 'resume', 1) from master(); + gp_inject_fault +----------------- + Success: +(1 row) + +select * from get_stats; + seq | seq_name | expected_start_delta | actual_start_delta | expected_done_delta | actual_done_delta +-----+----------+----------------------+--------------------+---------------------+------------------- +(0 rows) + +-- fresh result test: issue a new probe request during the in progress piggyback ftsLoop +4: select gp_request_fts_probe_scan(); + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +1<: <... completed> + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +2<: <... completed> + gp_request_fts_probe_scan +--------------------------- + t +(1 row) +3<: <... completed> + gp_request_fts_probe_scan +--------------------------- + t +(1 row) + +select * from get_stats; + seq | seq_name | expected_start_delta | actual_start_delta | expected_done_delta | actual_done_delta +-----+----------+----------------------+--------------------+---------------------+------------------- +(0 rows) + +-- show all raw stats for debugging +-- start_ignore +select * from get_raw_stats; + seq | seq_name | current_started | expected_start_delta | actual_start_delta | current_done | expected_done_delta | actual_done_delta +-----+----------+-----------------+----------------------+--------------------+--------------+---------------------+------------------- +(0 rows) +-- end_ignore diff --git a/src/test/singlenode_isolation2/output/gp_collation.source b/src/test/singlenode_isolation2/output/gp_collation.source new file mode 100644 index 00000000000..47d261237cf --- /dev/null +++ b/src/test/singlenode_isolation2/output/gp_collation.source @@ -0,0 +1,231 @@ +-- +-- Try and fail to import all system collations +-- +-- Simulate a locale missing on one segment at collation creation. If this +-- happens, we expect that 2PC will prevent this collation from being created. +-- +SELECT gp_inject_fault('collate_locale_os_lookup', 'error', dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- The fault injector should prevent all collations from being created by +-- pg_import_system_collations(). +create schema import_collation_schema; +CREATE +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) + +-- Count the number of collations in import_collation_schema. It should be +-- zero because one of the segments failed to create a collation. +select count(*) from pg_collation where collnamespace = (select oid from pg_namespace where nspname = 'import_collation_schema'); + count +------- + 0 +(1 row) + +SELECT gp_inject_fault('collate_locale_os_lookup', 'reset', dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- +-- Import all system collations. +-- +select pg_import_system_collations( (select oid from pg_namespace where nspname = 'import_collation_schema') ) > 0 as collations_imported; + collations_imported +--------------------- + t +(1 row) + +-- +-- Create a collation from an on-disk locale +-- +select gp_segment_id, collname from pg_collation where collname='collation_from_disk'; + gp_segment_id | collname +---------------+---------- +(0 rows) +create collation "collation_from_disk" (locale="@gp_syslocale@"); +CREATE +select gp_segment_id, collname from pg_collation where collname='collation_from_disk'; + gp_segment_id | collname +---------------+--------------------- + -1 | collation_from_disk +(1 row) +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_disk'); + gp_segment_id | collname +---------------+--------------------- + 2 | collation_from_disk + 0 | collation_from_disk + 1 | collation_from_disk +(3 rows) +select count(distinct oid) from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_disk'); + count +------- + 1 +(1 row) + +-- +-- Drop the collation, and confirm it is actually gone +-- +drop collation "collation_from_disk"; +DROP +select gp_segment_id, collname from pg_collation where collname='collation_from_disk'; + gp_segment_id | collname +---------------+---------- +(0 rows) +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_disk'); + gp_segment_id | collname +---------------+---------- +(0 rows) + + +-- +-- Create a collation from an existing collation +-- +select gp_segment_id, collname from pg_collation where collname='collation_from_db'; + gp_segment_id | collname +---------------+---------- +(0 rows) +create collation "collation_from_db" from "POSIX"; +CREATE +select gp_segment_id, collname from pg_collation where collname='collation_from_db'; + gp_segment_id | collname +---------------+------------------- + -1 | collation_from_db +(1 row) +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_db'); + gp_segment_id | collname +---------------+------------------- + 2 | collation_from_db + 1 | collation_from_db + 0 | collation_from_db +(3 rows) +select count(distinct oid) from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='collation_from_db'); + count +------- + 1 +(1 row) + +-- +-- Confirm that collation creation is protected from errors by 2PC. +-- In other words if one segment throws an error, the collation +-- should not be created on any segment. +-- +create collation "missing_on_one_segment" from "C"; +CREATE +-- Drop collation from one segment +2U: drop collation "missing_on_one_segment"; +DROP +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 +---------------+------------------------ + 1 | missing_on_one_segment + 0 | missing_on_one_segment +(2 rows) +-- Because we dropped missing_on_one_segment from content 2, it +-- will fail to create the collation. +create collation "collation_create_fails" from "missing_on_one_segment"; +ERROR: collation "missing_on_one_segment" for encoding "UTF8" does not exist (seg2 127.0.1.1:25434 pid=1227) +-- Confirm 'collation_create_fails' is missing from all segments. +select gp_segment_id, collname from pg_collation where collname='collation_create_fails'; + gp_segment_id | collname +---------------+---------- +(0 rows) +select gp_segment_id, collname from gp_dist_random('pg_collation') where collname='collation_create_fails'; + gp_segment_id | collname +---------------+---------- +(0 rows) + +-- Clean up table missing_on_one_segement +-1U: drop collation "missing_on_one_segment"; +DROP +0U: drop collation "missing_on_one_segment"; +DROP +1U: drop collation "missing_on_one_segment"; +DROP + +-- +-- Simulate a locale missing on one segment at collation creation. If this +-- happens, we expect that 2PC will prevent this collation from being created. +-- +SELECT gp_inject_fault('collate_locale_os_lookup', 'error', dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='locale_missing_on_one_segment'); + gp_segment_id | collname +---------------+---------- +(0 rows) +-- The fault injector should simulate a collation being missing on this segment +create collation "locale_missing_on_one_segment" (locale="@gp_syslocale@"); +ERROR: fault triggered, fault name:'collate_locale_os_lookup' fault type:'error' (seg0 127.0.1.1:25432 pid=23851) +-- Confirm 'collation_create_fails' is missing from all segments. +select gp_segment_id, collname from pg_collation where collname='locale_missing_on_one_segment'; + gp_segment_id | collname +---------------+---------- +(0 rows) +select gp_segment_id, collname from gp_dist_random('pg_collation') where collname='locale_missing_on_one_segment'; + gp_segment_id | collname +---------------+---------- +(0 rows) + +SELECT gp_inject_fault('collate_locale_os_lookup', 'reset', dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + + +-- +-- If, for whatever reason a collation was created for a locale that is no +-- longer available on a segment, we expect that a query using that collation +-- will throw an error. +-- +select gp_segment_id, collname from pg_collation where collname='locale_missing_on_one_segment'; + gp_segment_id | collname +---------------+---------- +(0 rows) +create collation "locale_missing_on_one_segment" (locale="@gp_syslocale@"); +CREATE +-- Confirm is on all segments. +select gp_segment_id, collname from pg_collation where collname='locale_missing_on_one_segment'; + gp_segment_id | collname +---------------+------------------------------- + -1 | locale_missing_on_one_segment +(1 row) +select gp_segment_id, collname from gp_dist_random('pg_collation') where collname='locale_missing_on_one_segment'; + gp_segment_id | collname +---------------+------------------------------- + 0 | locale_missing_on_one_segment + 1 | locale_missing_on_one_segment + 2 | locale_missing_on_one_segment +(3 rows) + +create table uses_collation (a text collate locale_missing_on_one_segment); +CREATE +-- 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 + +SELECT gp_inject_fault('collate_locale_os_lookup', 'error', dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- This should error out +SELECT a FROM uses_collation ORDER BY a; +ERROR: fault triggered, fault name:'collate_locale_os_lookup' fault type:'error' (seg0 slice1 127.0.1.1:25432 pid=16196) + +SELECT gp_inject_fault('collate_locale_os_lookup', 'reset', dbid) from gp_segment_configuration where content = 0 and role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/corner.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/corner.source new file mode 100644 index 00000000000..20e4f6d1f42 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/corner.source @@ -0,0 +1,2300 @@ +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 100 +DROP TABLE IF EXISTS t11; +DROP +CREATE TABLE t11 (a INT) DISTRIBUTED by (a); +CREATE +insert into t11 select generate_series(1,100000); +INSERT 100000 +DROP TABLE IF EXISTS t2; +DROP +CREATE TABLE t2 (a INT) DISTRIBUTED by (a); +CREATE +DROP TABLE IF EXISTS t3; +DROP +CREATE TABLE t3 (a text) DISTRIBUTED by (a); +CREATE +COPY t3 FROM PROGRAM 'for i in `seq 1 10`; do echo ${i}test; done'; +COPY 10 +DROP TABLE IF EXISTS t4; +DROP +CREATE TABLE t4 (a text) DISTRIBUTED by (a); +CREATE +DROP TABLE IF EXISTS t5; +DROP +CREATE TABLE t5 (b INT) DISTRIBUTED by (b); +CREATE +INSERT INTO t5 SELECT GENERATE_SERIES(1, 10); +INSERT 10 + +-- Test1: close not executed PARALLEL RETRIEVE CURSOR +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_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 +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; + auth_token | state +------------+------- +(0 rows) +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: @pre_run 'set_endpoint_variable @ENDPOINT1': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT1'; + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +ERROR: cursor "c1" does not exist +1: ROLLBACK; +ROLLBACK + +-- test for a large table +1: BEGIN; +BEGIN +1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t11; +DECLARE +1: @post_run 'parse_endpoint_info 11 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_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 +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c11'; + auth_token | state +------------+------- +(0 rows) +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: @pre_run 'set_endpoint_variable @ENDPOINT11': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT11'; + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c11', -1); +ERROR: cursor "c11" does not exist +1: ROLLBACK; +ROLLBACK + +-- Test2: open many PARALLEL RETRIEVE CURSORs +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c9 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c10 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints(); + auth_token | state +------------+------- +(0 rows) + +-- Test3: execute non-existing PARALLEL RETRIEVE CURSOR +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +ERROR: cursor "c2" does not exist +1: ROLLBACK; +ROLLBACK +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +ERROR: cursor "c2" does not exist +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints(); + auth_token | state +------------+------- +(0 rows) + +-- Test4: execute one of PARALLEL RETRIEVE CURSORs +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c9 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c10 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +-- test check and wait in normal way +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + f +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + t +(1 row) +-- check all endpoint state +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +------- +(0 rows) +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test5: if conflict with normal cursors +1: BEGIN; +BEGIN +1: DECLARE c1 CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +ERROR: cursor "c1" already exists +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints(); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK + +1: BEGIN; +BEGIN +1: DECLARE c1 CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test6: select order by limit +1: BEGIN; +BEGIN +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 ORDER BY a LIMIT 10; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY +(1 row) + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- + READY +(1 row) + + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#2retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +-- test check and wait after finished retrieving +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq: ... +Sessions not started cannot be quit +Sessions not started cannot be quit +Sessions not started cannot be quit + +-- Test7: select order by limit 0 +1: BEGIN; +BEGIN +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 ORDER BY a LIMIT 0; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + f +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- + READY +(1 row) + + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +--- +(0 rows) + +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#2retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq: ... +Sessions not started cannot be quit +Sessions not started cannot be quit +Sessions not started cannot be quit + +-- Test8: select empty table +1: BEGIN; +BEGIN +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + f +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +--- +(0 rows) + + a +--- +(0 rows) + + a +--- +(0 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test9: select table with text column +1: BEGIN; +BEGIN +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t3; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + f +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +------- + 2test + 3test + 5test +(3 rows) + + a +-------- + 4test + 6test + 7test + 9test + 10test +(5 rows) + + a +------- + 1test + 8test +(2 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test10: select empty table with text column +1: BEGIN; +BEGIN +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t4; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + f +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +--- +(0 rows) + + a +--- +(0 rows) + + a +--- +(0 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test11: endpoints on one segment. +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 WHERE a = 50; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + f +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +1U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- + READY +(1 row) +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +---- + 50 +(1 row) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +1Rq: ... + +-- Test12: PARALLEL RETRIEVE CURSOR for aggregate function: sum +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT SUM(a) FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + f +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +-1U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- + READY +(1 row) +-1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + sum +------ + 5050 +(1 row) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + t +(1 row) +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +-1Rq: ... + +-- Test13: PARALLEL RETRIEVE CURSOR for aggregate function: avg +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT AVG(a) FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY +(1 row) + +-1U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- + READY +(1 row) +-1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + avg +--------------------- + 50.5000000000000000 +(1 row) + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + t +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + finished +---------- + t +(1 row) +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +-1Rq: ... + +-- Test14: PARALLEL RETRIEVE CURSOR for count(*) +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +-1U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- + READY +(1 row) +-1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + count +------- + 100 +(1 row) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +-1Rq: ... + +-- Test15: PARALLEL RETRIEVE CURSOR for two tables' join; +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1, t5 where t1.a = t5.b; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a | b +---+--- + 2 | 2 + 3 | 3 + 4 | 4 + 7 | 7 + 8 | 8 +(5 rows) + + a | b +---+--- + 1 | 1 +(1 row) + + a | b +----+---- + 5 | 5 + 6 | 6 + 9 | 9 + 10 | 10 +(4 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test16: PARALLEL RETRIEVE CURSOR for the count of two tables' join; +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) FROM t1, t5 where t1.a = t5.b; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +-1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + count +------- + 10 +(1 row) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +-1Rq: ... + +-- Test17: re-execute a PARALLEL RETRIEVE CURSOR and retrieve in same sessions. +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: CLOSE c1; +CLOSE +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test18: re-execute a PARALLEL RETRIEVE CURSOR and retrieve in different sessions. +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +0Rq: ... +1Rq: ... +2Rq: ... + +1<: <... completed> + finished +---------- + t +(1 row) +1: CLOSE c1; +CLOSE +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test19: PARALLEL RETRIEVE CURSOR and savepoint +1: BEGIN; +BEGIN +1: SAVEPOINT s1; +SAVEPOINT +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1: ROLLBACK TO s1; +ROLLBACK +1: SELECT state FROM gp_endpoints() WHERE cursorname='c1'; + state +------- +(0 rows) + +1: ROLLBACK; +ROLLBACK + +-- Test20: PARALLEL RETRIEVE CURSOR and savepoint +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: SAVEPOINT s1; +SAVEPOINT +1: CLOSE c1; +CLOSE +1: ROLLBACK TO s1; +ROLLBACK +1: SELECT * FROM pg_cursors WHERE name='c1'; + name | statement | is_holdable | is_binary | is_scrollable | creation_time | is_parallel +------+-----------+-------------+-----------+---------------+---------------+------------- +(0 rows) +1: COMMIT; +COMMIT + +-- Test21: Token should not be changed after cursor declared +1q: ... +1: BEGIN; +BEGIN +1: DECLARE c21a PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) from t1; +DECLARE +1: @post_run 'get_tuple_cell TOKEN21a 1 1 ; create_match_sub $TOKEN21a token21a' : SELECT auth_token FROM gp_endpoints() WHERE cursorname='c21a'; + auth_token +---------------------------------- + token21a +(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 +1: DECLARE c21c PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: SELECT auth_token FROM gp_endpoints() WHERE cursorname='c21a'; + auth_token +---------------------------------- + token21a +(1 row) +1: COMMIT; +COMMIT +1q: ... +*Rq:Sessions not started cannot be quit +Sessions not started cannot be quit +Sessions not started cannot be quit +Sessions not started cannot be quit + +-- Test22: UDF plan should be able to run on entry db. +1: BEGIN; +BEGIN +1: DECLARE c22 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM generate_series(1,10); +DECLARE +1: @post_run 'parse_endpoint_info 22 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c22'; + endpoint_id22 | token_id | host_id | port_id | READY +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c22', 0); + finished +---------- + f +(1 row) + +*U: @pre_run 'set_endpoint_variable @ENDPOINT22': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT22'; + state +------- + READY +(1 row) + + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT22': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT22"; + generate_series +----------------- + 1 + 10 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +(10 rows) + +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#2retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +-- test check and wait after finished retrieving +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c22', -1); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c22'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +1q: ... +-1Rq: ... +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit +Sessions not started cannot be quit +Sessions not started cannot be quit +Sessions not started cannot be quit + +-- Test23: Catalog scan plan should be able to run on entry db. +1: BEGIN; +BEGIN +1: DECLARE c23 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT relname FROM pg_class where relname='pg_class'; +DECLARE +1: @post_run 'parse_endpoint_info 23 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c23'; + endpoint_id23 | token_id | host_id | port_id | READY +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c23', 0); + finished +---------- + f +(1 row) + +*U: @pre_run 'set_endpoint_variable @ENDPOINT23': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT23'; + state +------- + READY +(1 row) + + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT23': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT23"; + relname +---------- + pg_class +(1 row) + +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#2retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +-- test check and wait after finished retrieving +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c23', -1); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c23'; + state +---------- + FINISHED +(1 row) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq: ... +Sessions not started cannot be quit +Sessions not started cannot be quit +Sessions not started cannot be quit + +-- Test24: endpoint name is too long and will be truncated. +1: BEGIN; +BEGIN +1: DECLARE "x12345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; +DECLARE +1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; +DECLARE +1: DECLARE "x1234567890123456789012345678901234567890123456789012345678901x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; +DECLARE +1: @post_run 'parse_endpoint_info 24 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='x12345678901234567890123456789012345678901234567890123456789x'; + endpoint_id24 | token_id | host_id | port_id | READY + endpoint_id24 | token_id | host_id | port_id | READY + endpoint_id24 | token_id | host_id | port_id | READY +(3 rows) +1: @post_run 'parse_endpoint_info 24_1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='x12345678901234567890123456789012345678901234567890123456789012'; + endpoint_id24_1 | token_id | host_id | port_id | READY + endpoint_id24_1 | token_id | host_id | port_id | READY + endpoint_id24_1 | token_id | host_id | port_id | READY +(3 rows) +1: @post_run 'parse_endpoint_info 24_2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='x1234567890123456789012345678901234567890123456789012345678901x'; + endpoint_id24_2 | token_id | host_id | port_id | READY + endpoint_id24_2 | token_id | host_id | port_id | READY + endpoint_id24_2 | token_id | host_id | port_id | READY +(3 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT24': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT24"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + b +--- + 2 + 3 + 4 + 7 + 8 +(5 rows) + + b +--- + 1 +(1 row) + + b +---- + 5 + 6 + 9 + 10 +(4 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT24_1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT24_1"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + b +--- + 2 + 3 + 4 + 7 + 8 +(5 rows) + + b +--- + 1 +(1 row) + + b +---- + 5 + 6 + 9 + 10 +(4 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT24_2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT24_2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + b +--- + 2 + 3 + 4 + 7 + 8 +(5 rows) + + b +--- + 1 +(1 row) + + b +---- + 5 + 6 + 9 + 10 +(4 rows) +1: ROLLBACK; +ROLLBACK +-- cleanup retrieve connections +*Rq:Sessions not started cannot be quit + ... + ... + ... + +-- Test25: cursor name is too long and will be truncated. +1: BEGIN; +BEGIN +1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +DECLARE +1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789y" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +ERROR: cursor "x12345678901234567890123456789012345678901234567890123456789012" already exists +1: ROLLBACK; +ROLLBACK + +-- Test26: Retrieve one endpoint and quit the session, then connect the segment again and retrieve twice. No crash should happen. +1: BEGIN; +BEGIN +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t5; +DECLARE +1: @post_run 'parse_endpoint_info 26 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id26 | token_id | host_id | port_id | READY + endpoint_id26 | token_id | host_id | port_id | READY + endpoint_id26 | token_id | host_id | port_id | READY +(3 rows) + +2R: @pre_run 'set_endpoint_variable @ENDPOINT26' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT26"; + b +---- + 5 + 6 + 9 + 10 +(4 rows) +2Rq: ... + +-- connect again and retrieve twice +2R: @pre_run 'set_endpoint_variable @ENDPOINT26' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT26"; +ERROR: another session (pid: 46988) used the endpoint and completed retrieving +2R: @pre_run 'set_endpoint_variable @ENDPOINT26' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT26"; +ERROR: another session (pid: 46988) used the endpoint and completed retrieving +2Rq: ... + +-- check no endpoint info +1: CLOSE C2; +CLOSE +1: COMMIT; +COMMIT + +-- Test27: General locus should run on entry db. Test23 tested Entry locus. +1: BEGIN; +BEGIN +1: DECLARE c27 PARALLEL RETRIEVE CURSOR FOR SELECT generate_series(1,10); +DECLARE +1: @post_run 'parse_endpoint_info 27 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c27'; + endpoint_id27 | token_id | host_id | port_id | READY +(1 row) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c27', 0); + finished +---------- + f +(1 row) + +*U: @pre_run 'set_endpoint_variable @ENDPOINT27': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT27'; + state +------- + READY +(1 row) + + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- +(0 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT27': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT27"; + generate_series +----------------- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#2retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +-- test check and wait after finished retrieving +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c27', -1); + finished +---------- + t +(1 row) +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c27'; + state +---------- + FINISHED +(1 row) +-- cleanup retrieve connections +*Rq: ... +Sessions not started cannot be quit +Sessions not started cannot be quit +Sessions not started cannot be quit + +-- Test28: Parallel retrieve cursor should run on the dispatcher only. +-1U: BEGIN; +BEGIN +-1U: DECLARE c28 PARALLEL RETRIEVE CURSOR FOR SELECT generate_series(1,10); +ERROR: Parallel retrieve cursor should run on the dispatcher only +-1Uq: ... + +-- Final: clean up +DROP TABLE t1; +DROP +DROP TABLE t11; +DROP +DROP TABLE t2; +DROP +DROP TABLE t3; +DROP +DROP TABLE t4; +DROP +DROP TABLE t5; +DROP diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/explain.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/explain.source new file mode 100644 index 00000000000..fe23fe05a90 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/explain.source @@ -0,0 +1,226 @@ +-- @Description Tests "EXPLAIN" statement for the PARALLEL RETRIEVE CURSOR +-- +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 100 +CREATE TABLE t2 (a INT) DISTRIBUTED RANDOMLY; +CREATE +insert into t2 select generate_series(1,100); +INSERT 100 +DROP TABLE IF EXISTS rt1; +DROP +CREATE TABLE rt1 (a INT) DISTRIBUTED REPLICATED; +CREATE +insert into rt1 select generate_series(1,100); +INSERT 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; + QUERY PLAN +------------------------------------- + Seq Scan on t1 + Endpoint: on all 3 segments + Optimizer: Postgres query optimizer +(3 rows) +EXPLAIN (COSTS false) DECLARE c1 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 + +EXPLAIN (COSTS false) DECLARE c1 NO SCROLL PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; + QUERY PLAN +------------------------------------- + Seq Scan on t1 + Endpoint: on all 3 segments + Optimizer: Postgres query optimizer +(3 rows) +EXPLAIN (COSTS false) DECLARE c1 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 + +-- Test: explain output: Endpoint info (on coordinator/on some segments/on all segments) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; + QUERY PLAN +------------------------------------- + Seq Scan on public.t1 + Output: a + Endpoint: on all 3 segments + Optimizer: Postgres query optimizer +(4 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 ORDER BY a; + QUERY PLAN +------------------------------------------ + Gather Motion 3:1 (slice1; segments: 3) + Output: a + Merge Key: a + -> Sort + Output: a + Sort Key: t1.a + -> Seq Scan on public.t1 + Output: a + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(10 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 WHERE a=1; + QUERY PLAN +-------------------------------------- + Seq Scan on public.t1 + Output: a + Filter: (t1.a = 1) + Endpoint: on segments: contentid [1] + Optimizer: Postgres query optimizer +(5 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 WHERE a=1 OR a=2; + QUERY PLAN +----------------------------------------- + Seq Scan on public.t1 + Output: a + Filter: ((t1.a = 1) OR (t1.a = 2)) + Endpoint: on segments: contentid [1, 0] + Optimizer: Postgres query optimizer +(5 rows) + +-- Test: Locus CdbLocusType_Strewn +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2; + QUERY PLAN +------------------------------------- + Seq Scan on public.t2 + Output: a + Endpoint: on all 3 segments + Optimizer: Postgres query optimizer +(4 rows) + +-- Test for system table which is accessible on coordinator +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 CURSOR FOR SELECT * FROM pg_class; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Seq Scan on pg_catalog.pg_class + Output: oid, relname, relnamespace, reltype, reloftype, relowner, relam, relfilenode, reltablespace, relpages, reltuples, relallvisible, reltoastrelid, relhasindex, relisshared, relpersistence, relkind, relnatts, relchecks, relhasrules, relhastriggers, relhassubclass, relrowsecurity, relforcerowsecurity, relispopulated, relreplident, relispartition, relrewrite, relfrozenxid, relminmxid, relacl, reloptions, relpartbound + Optimizer: Postgres query optimizer +(3 rows) + +-- Test: explain output: Endpoint info (on coordinator/on some segments/on all segments) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM pg_class; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Seq Scan on pg_catalog.pg_class + Output: oid, relname, relnamespace, reltype, reloftype, relowner, relam, relfilenode, reltablespace, relpages, reltuples, relallvisible, reltoastrelid, relhasindex, relisshared, relpersistence, relkind, relnatts, relchecks, relhasrules, relhastriggers, relhassubclass, relrowsecurity, relforcerowsecurity, relispopulated, relreplident, relispartition, relrewrite, relfrozenxid, relminmxid, relacl, reloptions, relpartbound + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(4 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM pg_class ORDER BY relname; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Sort + Output: oid, relname, relnamespace, reltype, reloftype, relowner, relam, relfilenode, reltablespace, relpages, reltuples, relallvisible, reltoastrelid, relhasindex, relisshared, relpersistence, relkind, relnatts, relchecks, relhasrules, relhastriggers, relhassubclass, relrowsecurity, relforcerowsecurity, relispopulated, relreplident, relispartition, relrewrite, relfrozenxid, relminmxid, relacl, reloptions, relpartbound + Sort Key: pg_class.relname + -> Seq Scan on pg_catalog.pg_class + Output: oid, relname, relnamespace, reltype, reloftype, relowner, relam, relfilenode, reltablespace, relpages, reltuples, relallvisible, reltoastrelid, relhasindex, relisshared, relpersistence, relkind, relnatts, relchecks, relhasrules, relhastriggers, relhassubclass, relrowsecurity, relforcerowsecurity, relispopulated, relreplident, relispartition, relrewrite, relfrozenxid, relminmxid, relacl, reloptions, relpartbound + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(7 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM pg_class WHERE gp_segment_id=1; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Seq Scan on pg_catalog.pg_class + Output: oid, relname, relnamespace, reltype, reloftype, relowner, relam, relfilenode, reltablespace, relpages, reltuples, relallvisible, reltoastrelid, relhasindex, relisshared, relpersistence, relkind, relnatts, relchecks, relhasrules, relhastriggers, relhassubclass, relrowsecurity, relforcerowsecurity, relispopulated, relreplident, relispartition, relrewrite, relfrozenxid, relminmxid, relacl, reloptions, relpartbound + Filter: (pg_class.gp_segment_id = 1) + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(5 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM pg_class WHERE gp_segment_id=1 OR gp_segment_id=2; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Seq Scan on pg_catalog.pg_class + Output: oid, relname, relnamespace, reltype, reloftype, relowner, relam, relfilenode, reltablespace, relpages, reltuples, relallvisible, reltoastrelid, relhasindex, relisshared, relpersistence, relkind, relnatts, relchecks, relhasrules, relhastriggers, relhassubclass, relrowsecurity, relforcerowsecurity, relispopulated, relreplident, relispartition, relrewrite, relfrozenxid, relminmxid, relacl, reloptions, relpartbound + Filter: ((pg_class.gp_segment_id = 1) OR (pg_class.gp_segment_id = 2)) + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(5 rows) + +-- Test for UDF which can be executed on coordinator +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10) as F; + QUERY PLAN +----------------------------------------------- + Function Scan on pg_catalog.generate_series f + Output: f + Function Call: generate_series(1, 10) + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(5 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10) as F ORDER BY F; + QUERY PLAN +----------------------------------------------------- + Sort + Output: f + Sort Key: f.f + -> Function Scan on pg_catalog.generate_series f + Output: f + Function Call: generate_series(1, 10) + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(8 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10) as F WHERE F=1; + QUERY PLAN +----------------------------------------------- + Function Scan on pg_catalog.generate_series f + Output: f + Function Call: generate_series(1, 10) + Filter: (f.f = 1) + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(6 rows) +EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10) as F WHERE F=1 OR F=2; + QUERY PLAN +----------------------------------------------- + Function Scan on pg_catalog.generate_series f + Output: f + Function Call: generate_series(1, 10) + Filter: ((f.f = 1) OR (f.f = 2)) + Endpoint: "on coordinator" + Optimizer: Postgres query optimizer +(6 rows) + +-- Test: explain output: Endpoint info (on coordinator/on some segments/on all segments) +-- Here because replicated table will execute on seg id: session_id % segment_number +-- Just replace the random specific seg id to SEGIDX for the output +1: @post_run 'create_sub "Endpoint: on segments: contentid \[[0-9]+\]" " Endpoint: on segments: contentid [SEGIDX]" ':EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1; + QUERY PLAN +--------------------------------------- + Seq Scan on public.rt1 + Output: a + Endpoint: "on segment: contentid [SEGIDX]" + Optimizer: Postgres query optimizer +(4 rows) +1: @post_run 'create_sub "Endpoint: on segments: contentid \[[0-9]+\]" " Endpoint: on segments: contentid [SEGIDX]" ':EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; + QUERY PLAN +--------------------------------------- + Sort + Output: a + Sort Key: rt1.a + -> Seq Scan on public.rt1 + Output: a + Endpoint: "on segment: contentid [SEGIDX]" + Optimizer: Postgres query optimizer +(7 rows) +1: @post_run 'create_sub "Endpoint: on segments: contentid \[[0-9]+\]" " Endpoint: on segments: contentid [SEGIDX]" ':EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE a=1; + QUERY PLAN +--------------------------------------- + Seq Scan on public.rt1 + Output: a + Filter: (rt1.a = 1) + Endpoint: "on segment: contentid [SEGIDX]" + Optimizer: Postgres query optimizer +(5 rows) +1: @post_run 'create_sub "Endpoint: on segments: contentid \[[0-9]+\]" " Endpoint: on segments: contentid [SEGIDX]" ':EXPLAIN (VERBOSE, COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE a=1 OR a=2; + QUERY PLAN +---------------------------------------- + Seq Scan on public.rt1 + Output: a + Filter: ((rt1.a = 1) OR (rt1.a = 2)) + Endpoint: "on segment: contentid [SEGIDX]" + Optimizer: Postgres query optimizer +(5 rows) + diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/extended_query.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/extended_query.source new file mode 100644 index 00000000000..53927ef2667 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/extended_query.source @@ -0,0 +1,5 @@ +!\retcode ./test_parallel_retrieve_cursor_extended_query @curusername@ postgres; +(exited with code 0) +!\retcode ./test_parallel_retrieve_cursor_extended_query_error @curusername@ postgres; +(exited with code 0) + diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/fault_inject.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/fault_inject.source new file mode 100644 index 00000000000..a047a0c8294 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/fault_inject.source @@ -0,0 +1,724 @@ +-- @Description Tests with faut inject +-- +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 100 + +--------- Test1: fault injection end-point shared memory slot full on QE +2: SELECT gp_inject_fault('alloc_endpoint_slot_full', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +2: SELECT gp_inject_fault('alloc_endpoint_slot_full', 'skip', 2); + gp_inject_fault +----------------- + Success: +(1 row) + +1: BEGIN; +BEGIN +-- should report error on seg0 +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +ERROR: failed to allocate endpoint +1: ROLLBACK; +ROLLBACK +-- test same error on another session +3: BEGIN; +BEGIN +3: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +ERROR: failed to allocate endpoint +3: ROLLBACK; +ROLLBACK +-- reset the fault injection +2: SELECT gp_inject_fault('alloc_endpoint_slot_full_reset', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +2: SELECT gp_inject_fault('alloc_endpoint_slot_full_reset', 'skip', 2); + gp_inject_fault +----------------- + Success: +(1 row) +--should work as normal +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_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&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1' or endpointname='DUMMYENDPOINTNAME'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: CLOSE c1; +CLOSE +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1' or endpointname='DUMMYENDPOINTNAME'; + auth_token | state +------------+------- +(0 rows) +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c1' or endpointname='DUMMYENDPOINTNAME'; + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + +1: ROLLBACK; +ROLLBACK + +--- Test2: fault inject while retrieving tuples from endpoint +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'interrupt', 2); + gp_inject_fault +----------------- + Success: +(1 row) + +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +ERROR: canceling statement due to user request + +1<: <... completed> +ERROR: canceling MPP operation: "Endpoint retrieve statement aborted" + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- +(0 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +ERROR: the endpoint endpoint_id2 does not exist in the session + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- +(0 rows) +2R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +ERROR: the endpoint endpoint_id2 does not exist in the session + +1<: <... completed> +FAILED: Execution failed +1: ROLLBACK; +ROLLBACK +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; + auth_token | state +------------+------- +(0 rows) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Test3: fault inject at the 5th time while retrieving tuples from endpoint +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'interrupt', '', '', '', 5, 5, 0, 3::smallint); + gp_inject_fault +----------------- + Success: +(1 row) + +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +1R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; +ERROR: canceling statement due to user request + +1<: <... completed> +ERROR: canceling MPP operation: "Endpoint retrieve statement aborted" + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- +(0 rows) +0R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; +ERROR: the endpoint endpoint_id3 does not exist in the session + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- +(0 rows) +2R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; +ERROR: the endpoint endpoint_id3 does not exist in the session + +1<: <... completed> +FAILED: Execution failed +1: ROLLBACK; +ROLLBACK +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; + auth_token | state +------------+------- +(0 rows) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Test4: error inject at the 5th time while retrieving tuples from endpoint +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'error', '', '', '', 5, 5, 0, 2::smallint); + gp_inject_fault +----------------- + Success: +(1 row) + +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +1R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +0R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; +ERROR: fault triggered, fault name:'fetch_tuples_from_endpoint' fault type:'error' + +1<: <... completed> +ERROR: canceling MPP operation: "Endpoint retrieve statement aborted" (seg0 127.0.0.1:25432 pid=31406) + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- +(0 rows) +2R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; +ERROR: the endpoint endpoint_id4 does not exist in the session + +1<: <... completed> +FAILED: Execution failed +1: ROLLBACK; +ROLLBACK +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Test5: error inject at the 5th time while retrieving tuples from endpoint. other retrieve session still retrieving. +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 4); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 2::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 4::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'interrupt', '', '', '', 5, 5, 0, 3::smallint); + gp_inject_fault +----------------- + Success: +(1 row) + +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +0R&: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +2R&: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +ERROR: canceling statement due to user request + +1<: <... completed> +ERROR: canceling MPP operation: "Endpoint retrieve statement aborted" + +0R<: <... completed> +ERROR: endpoint is not available because the parallel retrieve cursor was aborted (cdbendpointretrieve.c:245) +2R<: <... completed> +ERROR: endpoint is not available because the parallel retrieve cursor was aborted (cdbendpointretrieve.c:245) + +1<: <... completed> +FAILED: Execution failed +1: ROLLBACK; +ROLLBACK +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 4); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Test6: close PARALLEL RETRIEVE CURSOR during retrieve +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 2::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 4::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 5, 6, 3, 3::smallint); + gp_inject_fault +----------------- + Success: +(1 row) + +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; +DECLARE +1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id7 | token_id | host_id | port_id | READY + endpoint_id7 | token_id | host_id | port_id | READY + endpoint_id7 | token_id | host_id | port_id | READY +(3 rows) + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +0R&: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +1R&: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +2R&: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + f +(1 row) +1: CLOSE c1; +CLOSE + +0R<: <... completed> +ERROR: endpoint is not available because the parallel retrieve cursor was aborted (cdbendpointretrieve.c:245) +1R<: <... completed> +ERROR: endpoint is not available because the parallel retrieve cursor was aborted (cdbendpointretrieve.c:245) +2R<: <... completed> +ERROR: endpoint is not available because the parallel retrieve cursor was aborted (cdbendpointretrieve.c:245) + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +ERROR: cursor "c1" does not exist +1: END; +END +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 3); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 4); + gp_inject_fault +----------------- + Success: +(1 row) + +DROP TABLE t1; +DROP + +-- Test7: error inject at the 1000th time while retrieving tuples from endpoint. other retrieve session finished. +DROP TABLE IF EXISTS t2; +DROP +CREATE TABLE t2 (a INT) DISTRIBUTED by (a); +CREATE +insert into t2 select generate_series(1,10000); +INSERT 10000 + +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) FROM gp_segment_configuration WHERE content=1 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'interrupt', '', '', '', 1000, 1000, 0, dbid) FROM gp_segment_configuration WHERE content=1 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) FROM gp_segment_configuration WHERE content=0 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 900, 900, 2, dbid) FROM gp_segment_configuration WHERE content=0 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) FROM gp_segment_configuration WHERE content=2 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'sleep', '', '', '', 800, 800, 2, dbid) FROM gp_segment_configuration WHERE content=2 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t2; +DECLARE +1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id6 | token_id | host_id | port_id | READY + endpoint_id6 | token_id | host_id | port_id | READY + endpoint_id6 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +0U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +0R&: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; + +2U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +2R&: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; + +1U: SELECT state FROM gp_segment_endpoints() WHERE cursorname='c1'; + state +------- + READY +(1 row) +1R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; +ERROR: canceling statement due to user request + +1<: <... completed> +ERROR: canceling MPP operation: "Endpoint retrieve statement aborted" + +0R<: <... completed> +ERROR: endpoint is not available because the parallel retrieve cursor was aborted (cdbendpointretrieve.c:245) +2R<: <... completed> +ERROR: endpoint is not available because the parallel retrieve cursor was aborted (cdbendpointretrieve.c:245) + +1<: <... completed> +FAILED: Execution failed +1: ROLLBACK; +ROLLBACK +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) FROM gp_segment_configuration WHERE content=0 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) FROM gp_segment_configuration WHERE content=1 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) FROM gp_segment_configuration WHERE content=2 AND role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +DROP TABLE t2; +DROP diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/privilege.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/privilege.source new file mode 100644 index 00000000000..20bd6837e80 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/privilege.source @@ -0,0 +1,424 @@ +-- @Description Tests the privileges related with endpoints +-- +DROP TABLE IF EXISTS t1; +DROP +DROP USER IF EXISTS adminuser; +DROP +DROP USER IF EXISTS u1; +DROP +DROP USER IF EXISTS uu1; +DROP +DROP USER IF EXISTS u2; +DROP +CREATE USER adminuser; +CREATE +ALTER USER adminuser WITH SUPERUSER; +ALTER +CREATE USER u1 with CREATEROLE; +CREATE +CREATE USER u2; +CREATE + +SET SESSION AUTHORIZATION u1; +SET +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,10); +INSERT 10 +CREATE USER uu1; +CREATE +GRANT ALL PRIVILEGES ON t1 TO uu1; +GRANT +GRANT uu1 TO u1; +GRANT +RESET SESSION AUTHORIZATION; +RESET + + +--------- Test1: Admin should be able to see other user's endpoint, retrieve role auth should check token and user +--- c1 is declared by superuser +1: SET SESSION AUTHORIZATION adminuser; +SET +1: SELECT SESSION_USER, CURRENT_USER; + session_user | current_user +--------------+-------------- + adminuser | adminuser +(1 row) +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_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: SET SESSION AUTHORIZATION u1; +SET +1: SELECT SESSION_USER, CURRENT_USER; + session_user | current_user +--------------+-------------- + u1 | u1 +(1 row) +--- c2 is declared by u1 +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +--- c12 is declared by u1 on entry db +1: DECLARE c12 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10); +DECLARE +--- u1 is able to see all endpoints created by himself. +1: SELECT DISTINCT(cursorname), usename FROM gp_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + cursorname | usename +------------+--------- + c12 | u1 + c2 | u1 +(2 rows) + +--- adminuser should be able to see all the endpoints declared by u1 with state READY +2: SET SESSION AUTHORIZATION adminuser; +SET +2: SELECT SESSION_USER, CURRENT_USER; + session_user | current_user +--------------+-------------- + adminuser | adminuser +(1 row) +2: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +2: @post_run 'parse_endpoint_info 12 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c12'; + endpoint_id12 | token_id | host_id | port_id | READY +(1 row) +2: SELECT DISTINCT(cursorname), usename FROM gp_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + cursorname | usename +------------+----------- + c1 | adminuser + c12 | u1 + c2 | u1 +(3 rows) + +--- adminuser should be able to see the cursor state change to READY +2: SELECT auth_token, usename, state FROM gp_endpoints() endpoints, pg_user WHERE endpoints.userid = pg_user.usesysid order by usename; + auth_token | usename | state +----------------------------------+-----------+------- + token_id | adminuser | READY + token_id | adminuser | READY + token_id | adminuser | READY + token_id | u1 | READY + token_id | u1 | READY + token_id | u1 | READY + token_id | u1 | READY +(7 rows) + +--- adminuser should be able to see all endpoints declared by u1 in utility mode +3: @pre_run 'export CURRENT_ENDPOINT_POSTFIX=1 ; export RETRIEVE_USER="adminuser"; echo $RAW_STR ' : SELECT 1; + ?column? +---------- + 1 +(1 row) +0R: SELECT SESSION_USER, CURRENT_USER; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0U: SELECT auth_token, usename FROM gp_segment_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + auth_token | usename +----------------------------------+----------- + token_id | adminuser + token_id | u1 +(2 rows) +0R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; + a +--- + 2 + 3 + 4 + 7 + 8 +(5 rows) +0Rq: ... +3: @pre_run 'export CURRENT_ENDPOINT_POSTFIX=2 ; export RETRIEVE_USER="u1"; echo $RAW_STR ' : SELECT 1; + ?column? +---------- + 1 +(1 row) +--- Login as u1 and retrieve all to finish the test +0R: SELECT SESSION_USER, CURRENT_USER; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +--- + 2 + 3 + 4 + 7 + 8 +(5 rows) + +1: SET ROLE uu1; +SET +1: SELECT SESSION_USER, CURRENT_USER; + session_user | current_user +--------------+-------------- + u1 | uu1 +(1 row) +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +2: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY +(3 rows) +--- uu1 can not see u1's endpoints. +1: SELECT DISTINCT(cursorname), usename FROM gp_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + cursorname | usename +------------+--------- +(0 rows) +2: SELECT DISTINCT(cursorname), usename FROM gp_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + cursorname | usename +------------+----------- + c1 | adminuser + c12 | u1 + c2 | u1 + c3 | u1 +(4 rows) + +3: @pre_run 'export RETRIEVE_USER="uu1"; echo $RAW_STR ' : SELECT 1; + ?column? +---------- + 1 +(1 row) +--- Login as uu1 and retrieve, only u1 can retrieve +3R: SELECT SESSION_USER, CURRENT_USER; +#3retrieve> connection to server at "host_id", port port_id failed: FATAL: Authentication failure (Wrong password or no endpoint for the user) + +3R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; +#3retrieve> connection to server at "host_id", port port_id failed: FATAL: Authentication failure (Wrong password or no endpoint for the user) + + +--- Retrieve c2(which belongs to u1) but current user is uu1. +3R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#3retrieve> connection to server at "host_id", port port_id failed: FATAL: Authentication failure (Wrong password or no endpoint for the user) + +0Rq: ... +3Rq:Sessions not started cannot be quit +1<: <... completed> +FAILED: Execution failed +1: END; +END +2q: ... +3: @pre_run 'unset RETRIEVE_USER; echo $RAW_STR ' : SELECT 1; + ?column? +---------- + 1 +(1 row) +3q: ... + + +--------- Test2: Admin should NOT be able to retrieve from other's PARALLEL RETRIEVE CURSOR +1: SET SESSION AUTHORIZATION adminuser; +SET +1: SELECT SESSION_USER, CURRENT_USER; + session_user | current_user +--------------+-------------- + adminuser | adminuser +(1 row) +1: BEGIN; +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 +1: SET SESSION AUTHORIZATION u1; +SET +--- c1 is declared and executed by u1 +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +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_endpoints() WHERE cursorname='c0'; + endpoint_id40 | token_id | host_id | port_id | READY + endpoint_id40 | token_id | host_id | port_id | READY + endpoint_id40 | token_id | host_id | port_id | READY +(3 rows) + +2: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c1'; + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY +(3 rows) + +--- adminuser should NOT be able to retrieve from other's PARALLEL RETRIEVE CURSOR +3: @pre_run 'export CURRENT_ENDPOINT_POSTFIX=40 ; export RETRIEVE_USER="adminuser"; echo $RAW_STR ' : SELECT 1; + ?column? +---------- + 1 +(1 row) +*R: SET SESSION AUTHORIZATION adminuser; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +*R: SELECT SESSION_USER, CURRENT_USER; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +*R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +ERROR: the PARALLEL RETRIEVE CURSOR was created by a different user +HINT: Using the same user as the PARALLEL RETRIEVE CURSOR creator to retrieve. + +ERROR: the PARALLEL RETRIEVE CURSOR was created by a different user +HINT: Using the same user as the PARALLEL RETRIEVE CURSOR creator to retrieve. + +ERROR: the PARALLEL RETRIEVE CURSOR was created by a different user +HINT: Using the same user as the PARALLEL RETRIEVE CURSOR creator to retrieve. +-- cancel the no privilege retrieving endpoints, otherwise it will wait until statement_timeout +42: select pg_cancel_backend(pid) from pg_stat_activity where query like 'SELECT * FROM gp_wait_parallel_retrieve_cursor(''c1'', -1);'; + pg_cancel_backend +------------------- + t +(1 row) + +1<: <... completed> +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 +1q: ... +3q: ... +0Rq: ... +1Rq: ... +2Rq: ... + + +--------- Test3: Admin should be able to close PARALLEL RETRIEVE CURSOR +--- c1 is declared and executed by u1 +1: SET SESSION AUTHORIZATION u1; +SET +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +--- Close c1 by adminuser +1: SET SESSION AUTHORIZATION adminuser; +SET +1: CLOSE c1; +CLOSE +1: END; +END + + +--------- Test4: u2 should NOT be able to see or retrieve from u1's endpoints +1: SET SESSION AUTHORIZATION adminuser; +SET +1: SELECT SESSION_USER, CURRENT_USER; + session_user | current_user +--------------+-------------- + adminuser | adminuser +(1 row) +1: BEGIN; +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 +1: @post_run 'parse_endpoint_info 50 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c0'; + endpoint_id50 | token_id | host_id | port_id | READY + endpoint_id50 | token_id | host_id | port_id | READY + endpoint_id50 | token_id | host_id | port_id | READY +(3 rows) +1: SET SESSION AUTHORIZATION u1; +SET +--- c4 is declared and executed by u1 +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c4'; + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY +(3 rows) + +--- u2 is not able to see u1's endpoints on master +1: SET SESSION AUTHORIZATION u2; +SET +1: SELECT * from gp_endpoints(); + dbid | auth_token | cursorname | sessionid | hostname | port | userid | state | endpointname +------+------------+------------+-----------+----------+------+--------+-------+-------------- +(0 rows) + +--- execute the cursor by u1 +1: SET SESSION AUTHORIZATION u1; +SET +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); + +--- u2 is not able to see u1's endpoints in RETRIEVE mode +*R: @pre_run 'export CURRENT_ENDPOINT_POSTFIX=50 ; export RETRIEVE_USER="adminuser" ; echo $RAW_STR' : SET SESSION AUTHORIZATION u2; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +*U: SELECT auth_token, usename FROM gp_segment_endpoints() AS e, pg_user AS u where e.userid = u.usesysid; + auth_token | usename +------------+--------- +(0 rows) + + auth_token | usename +----------------------------------+----------- + token_id | adminuser + token_id | u1 +(2 rows) + + auth_token | usename +----------------------------------+----------- + token_id | adminuser + token_id | u1 +(2 rows) + + auth_token | usename +----------------------------------+----------- + token_id | adminuser + token_id | u1 +(2 rows) + +--- u2 is not able to retrieve from u1's endpoints in RETRIEVE mode +*R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +ERROR: the PARALLEL RETRIEVE CURSOR was created by a different user +HINT: Using the same user as the PARALLEL RETRIEVE CURSOR creator to retrieve. + +ERROR: the PARALLEL RETRIEVE CURSOR was created by a different user +HINT: Using the same user as the PARALLEL RETRIEVE CURSOR creator to retrieve. + +ERROR: the PARALLEL RETRIEVE CURSOR was created by a different user +HINT: Using the same user as the PARALLEL RETRIEVE CURSOR creator to retrieve. +-- cancel the no privilege retrieving endpoints, otherwise it will wait until statement_timeout +42: select pg_cancel_backend(pid) from pg_stat_activity where query like 'SELECT * FROM gp_wait_parallel_retrieve_cursor(''c4'', -1);'; + pg_cancel_backend +------------------- + t +(1 row) + +1<: <... completed> +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 +0Rq: ... +1Rq: ... +2Rq: ... diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/replicated_table.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/replicated_table.source new file mode 100644 index 00000000000..b1623895081 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/replicated_table.source @@ -0,0 +1,403 @@ +-- @Description Tests the PARALLEL RETRIEVE CURSOR for select replcated table +-- +DROP TABLE IF EXISTS rt1; +DROP +CREATE TABLE rt1 (a INT) DISTRIBUTED REPLICATED; +CREATE +insert into rt1 select generate_series(1,100); +INSERT 100 + +--------- Test1: Basic test for PARALLEL RETRIEVE CURSOR on replicated table + +-- Replicated table will execute on seg id: session_id % segment_number +-- Declare a cursor and check gp_endpoints(), we can find out the real +-- segment id by joining gp_segment_configuration. This should equal to +-- session_id % 3 (size of demo cluster). +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1; +DECLARE +1: SELECT sc.content = current_setting('gp_session_id')::int % 3 AS diff FROM gp_endpoints() ep, gp_segment_configuration sc WHERE ep.dbid = sc.dbid; + diff +------ + t +(1 row) +1: ROLLBACK; +ROLLBACK +1q: ... + +--------- Test2: Basic test for PARALLEL RETRIEVE CURSOR on replicated table +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +DECLARE +2: BEGIN; +BEGIN +2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +DECLARE +3: BEGIN; +BEGIN +3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +DECLARE +4: BEGIN; +BEGIN +4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +DECLARE +5: BEGIN; +BEGIN +5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +DECLARE +6: BEGIN; +BEGIN +6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; +DECLARE + +-- 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, +-- so that there should have specific session: MOD(sessionid,3)=1; +-- Get token only in specific session id and retrieve this token. +7: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE MOD(sessionid,3)=1 LIMIT 1; + endpoint_id2 | token_id | host_id | port_id | READY +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +2&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +3&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +4&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +5&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +6&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +*U: @pre_run 'set_endpoint_variable @ENDPOINT2': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT2'; + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- +(0 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +#2retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + +-- cancel all 6 sessions +7: select pg_cancel_backend(pid) from pg_stat_activity, gp_endpoints() where sess_id = sessionid AND (cursorname ='c1' or cursorname='c2' or cursorname='c3' or cursorname ='c4' or cursorname='c5' or cursorname='c6'); + pg_cancel_backend +------------------- + t + t + t + t + t + t +(6 rows) +1<: <... completed> +ERROR: canceling statement due to user request +2<: <... completed> +ERROR: canceling statement due to user request +3<: <... completed> +ERROR: canceling statement due to user request +4<: <... completed> +ERROR: canceling statement due to user request +5<: <... completed> +ERROR: canceling statement due to user request +6<: <... completed> +ERROR: canceling statement due to user request + +1: ROLLBACK; +ROLLBACK +2: ROLLBACK; +ROLLBACK +3: ROLLBACK; +ROLLBACK +4: ROLLBACK; +ROLLBACK +5: ROLLBACK; +ROLLBACK +6: ROLLBACK; +ROLLBACK + +1q: ... +2q: ... +3q: ... +4q: ... +5q: ... +6q: ... +-1Rq:Sessions not started cannot be quit +1Rq: ... +2Rq:Sessions not started cannot be quit +3Rq:Sessions not started cannot be quit +4Rq:Sessions not started cannot be quit +5Rq:Sessions not started cannot be quit +6Rq:Sessions not started cannot be quit + +--------- Test3: Basic test for PARALLEL RETRIEVE CURSOR on replicated table +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +DECLARE +2: BEGIN; +BEGIN +2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +DECLARE +3: BEGIN; +BEGIN +3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +DECLARE +4: BEGIN; +BEGIN +4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +DECLARE +5: BEGIN; +BEGIN +5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +DECLARE +6: BEGIN; +BEGIN +6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; +DECLARE + +-- 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, +-- so that there should have specific session: MOD(sessionid,3)=1; +-- Get token only in specific session id and retrieve this token. +7: @post_run 'parse_endpoint_info 3 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE MOD(sessionid,3)=1 LIMIT 1; + endpoint_id3 | token_id | host_id | port_id | READY +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +2&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +3&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +4&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +5&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +6&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +*U: @pre_run 'set_endpoint_variable @ENDPOINT3': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT3'; + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- +(0 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 1 + 4 + 7 + 10 + 13 + 16 + 19 + 22 + 25 + 28 +(10 rows) + +#2retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + +-- cancel all 6 sessions +7: select pg_cancel_backend(pid) from pg_stat_activity, gp_endpoints() where sess_id = sessionid AND (cursorname ='c1' or cursorname='c2' or cursorname='c3' or cursorname ='c4' or cursorname='c5' or cursorname='c6'); + pg_cancel_backend +------------------- + t + t + t + t + t + t +(6 rows) +1<: <... completed> +ERROR: canceling statement due to user request +2<: <... completed> +ERROR: canceling statement due to user request +3<: <... completed> +ERROR: canceling statement due to user request +4<: <... completed> +ERROR: canceling statement due to user request +5<: <... completed> +ERROR: canceling statement due to user request +6<: <... completed> +ERROR: canceling statement due to user request + +1: ROLLBACK; +ROLLBACK +2: ROLLBACK; +ROLLBACK +3: ROLLBACK; +ROLLBACK +4: ROLLBACK; +ROLLBACK +5: ROLLBACK; +ROLLBACK +6: ROLLBACK; +ROLLBACK + +1q: ... +2q: ... +3q: ... +4q: ... +5q: ... +6q: ... +-1Rq:Sessions not started cannot be quit +1Rq: ... +2Rq:Sessions not started cannot be quit +3Rq:Sessions not started cannot be quit +4Rq:Sessions not started cannot be quit +5Rq:Sessions not started cannot be quit +6Rq:Sessions not started cannot be quit + +--------- Test4: Basic test for PARALLEL RETRIEVE CURSOR on replicated table +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +DECLARE +2: BEGIN; +BEGIN +2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +DECLARE +3: BEGIN; +BEGIN +3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +DECLARE +4: BEGIN; +BEGIN +4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +DECLARE +5: BEGIN; +BEGIN +5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +DECLARE +6: BEGIN; +BEGIN +6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; +DECLARE + +-- 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, +-- so that there should have specific session: MOD(sessionid,3)=1; +-- Get token only in specific session id and retrieve this token. +7: @post_run 'parse_endpoint_info 4 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE MOD(sessionid,3)=1 LIMIT 1; + endpoint_id4 | token_id | host_id | port_id | READY +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +2&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); +3&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +4&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +5&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +6&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +*U: @pre_run 'set_endpoint_variable @ENDPOINT4': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT4'; + state +------- +(0 rows) + + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- +(0 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT4"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 1 + 2 + 4 + 5 + 7 + 8 + 10 + 11 + 13 + 14 +(10 rows) + +#2retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + +-- cancel all 6 sessions +7: select pg_cancel_backend(pid) from pg_stat_activity, gp_endpoints() where sess_id = sessionid AND (cursorname ='c1' or cursorname='c2' or cursorname='c3' or cursorname ='c4' or cursorname='c5' or cursorname='c6'); + pg_cancel_backend +------------------- + t + t + t + t + t + t +(6 rows) +1<: <... completed> +ERROR: canceling statement due to user request +2<: <... completed> +ERROR: canceling statement due to user request +3<: <... completed> +ERROR: canceling statement due to user request +4<: <... completed> +ERROR: canceling statement due to user request +5<: <... completed> +ERROR: canceling statement due to user request +6<: <... completed> +ERROR: canceling statement due to user request + +1: ROLLBACK; +ROLLBACK +2: ROLLBACK; +ROLLBACK +3: ROLLBACK; +ROLLBACK +4: ROLLBACK; +ROLLBACK +5: ROLLBACK; +ROLLBACK +6: ROLLBACK; +ROLLBACK diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/retrieve_quit_check.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/retrieve_quit_check.source new file mode 100644 index 00000000000..98675ab8522 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/retrieve_quit_check.source @@ -0,0 +1,204 @@ +-- @Description Tests retrieve quit +-- Test quitting retrieve sessions interfering with multiple endpoints when calling +-- gp_wait_parallel_retrieve_cursor. +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 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 +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_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: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY +(3 rows) + +-- in one retrieve session, retrieve multiple tokens (begin retrieving, finished retrieving, not yet retrieve) +0R: @pre_run 'set_endpoint_variable @ENDPOINT1' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT1"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +0R: @pre_run 'set_endpoint_variable @ENDPOINT2' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) +-- skip TOKEN3 in this session + +-- a new retrieve session. c1 & c2 cannot be retrieved since an existing retrieve session has +-- retrieved them at least once. +3R: @pre_run 'set_endpoint_variable @ENDPOINT1' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT1"; +ERROR: endpoint endpoint_id1 was already attached by receiver(pid: PID) +DETAIL: An endpoint can only be attached by one retrieving session. +3R: @pre_run 'set_endpoint_variable @ENDPOINT2' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +ERROR: another session (pid: 49941) used the endpoint and completed retrieving +3R: @pre_run 'set_endpoint_variable @ENDPOINT3' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) + +2: SELECT cursorname, state FROM gp_endpoints(); + cursorname | state +------------+---------- + c1 | ATTACHED + c1 | READY + c1 | READY + c2 | FINISHED + c2 | READY + c2 | READY + c3 | ATTACHED + c3 | READY + c3 | READY +(9 rows) +-- verify endpoints on seg0 for c2 has been finishied +0U: SELECT cursorname,senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints(); + cursorname | ?column? | ?column? | state +------------+----------+----------+---------- + c1 | t | t | ATTACHED + c2 | f | t | FINISHED + c3 | t | t | ATTACHED +(3 rows) +-- quit the first retrieve session +0Rq: ... + +-- Check quiting retrieve session won't impact on finished endpoint. +-- Now the interrupt is checked using WaitLatch() for time: WAIT_NORMAL_TIMEOUT, +-- so here the sleep time should be greater than WAIT_NORMAL_TIMEOUT. +1: SELECT pg_sleep(0.4); + pg_sleep +---------- + +(1 row) +-- make sure no error for c2 +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + f +(1 row) +-- When the retrieve session was terminated, the endpoint has not been fully retrieved +-- by this retrieve process should be cancelled. +-- The endpoint on seg0 for c1 should firstly become to RELEASED (the retrieve process set it), +-- and then was removed (during the endpoint QE cancelled) +2: SELECT cursorname, state FROM gp_endpoints(); + cursorname | state +------------+---------- + c1 | READY + c1 | READY + c2 | FINISHED + c2 | READY + c2 | READY + c3 | ATTACHED + c3 | READY + c3 | READY +(8 rows) + +-- verify endpoints for c1 is gone +0U: SELECT cursorname, senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints(); + cursorname | ?column? | ?column? | state +------------+----------+----------+---------- + c2 | f | t | FINISHED + c3 | t | t | ATTACHED +(2 rows) + +-- Now check on c1 will trigger the error, all endpoints should be aborted since the transaction +-- will be terminated. +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +ERROR: canceling MPP operation: "Endpoint retrieve session is quitting. All unfinished parallel retrieve cursors on the session will be terminated." (seg0 192.168.235.128:7002 pid=78585) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', 0); +ERROR: current transaction is aborted, commands ignored until end of transaction block +2: SELECT cursorname, state FROM gp_endpoints(); + cursorname | state +------------+------- +(0 rows) + +1: END; +END + +2: SELECT cursorname, state FROM gp_endpoints(); + cursorname | state +------------+------- +(0 rows) + +-- quit all sessions +1q: ... +2q: ... +0Uq: ... diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/retrieve_quit_wait.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/retrieve_quit_wait.source new file mode 100644 index 00000000000..b330089e9a7 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/retrieve_quit_wait.source @@ -0,0 +1,479 @@ +-- @Description Tests retrieve quit +-- Test quitting retrieve sessions interfering with multiple endpoints when calling +-- gp_wait_parallel_retrieve_cursor. +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 100 + +--------- Test1: test for wait for a finished endpoint +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_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: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY +(3 rows) + +-- Wait until the c2 has been fully retrieved +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +2: SELECT cursorname, state FROM gp_endpoints(); + cursorname | state +------------+------- + c1 | READY + c2 | READY + c3 | READY + c1 | READY + c2 | READY + c3 | READY + c1 | READY + c2 | READY + c3 | READY +(9 rows) + +-- in all retrieve sessions, retrieve multiple tokens (begin retrieving, finished retrieving, not yet retrieve) +*R: @pre_run 'set_endpoint_variable @ENDPOINT1' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT1"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 +(10 rows) + + a +---- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 +(10 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT2' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) +-- skip TOKEN3 in this session + +-- Retrieving on C2 finished. +1<: <... completed> + finished +---------- + t +(1 row) + +0U: SELECT cursorname,senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints(); + cursorname | ?column? | ?column? | state +------------+----------+----------+---------- + c1 | t | t | ATTACHED + c2 | f | t | FINISHED + c3 | t | f | READY +(3 rows) +-- quit the retrieve session +0Rq: ... +-- Now the interrupt is checked using WaitLatch() for time: WAIT_NORMAL_TIMEOUT, +-- so here the sleep time should be greater than WAIT_NORMAL_TIMEOUT, +-- to make sure that the cancel interrupt was handled. +1: SELECT pg_sleep(0.4); + pg_sleep +---------- + +(1 row) +-- When the retrieve session was terminated, the endpoint has not been fully retrieved +-- by this retrieve process should be cancelled. +-- The endpoint on seg0 for c1 should firstly become to RELEASED (the retrieve process set it), +-- and then was removed (during the endpoint QE cancelled) +2: SELECT cursorname, state FROM gp_endpoints(); + cursorname | state +------------+---------- + c1 | ATTACHED + c1 | ATTACHED + c2 | FINISHED + c2 | FINISHED + c2 | FINISHED + c3 | READY + c3 | READY + c3 | READY +(8 rows) + +-- Since c1 has been only partially retrieved, an error will be raised when transaction ends. +1: END; +ERROR: canceling MPP operation: "Endpoint retrieve session is quitting. All unfinished parallel retrieve cursors on the session will be terminated." (seg0 192.168.235.128:7002 pid=69967) + +2: SELECT cursorname, state FROM gp_endpoints(); + cursorname | state +------------+------- +(0 rows) + +--------- Test2: test for wait for quit partially retrieving session will abort all endpoints in the transaction. + +1: BEGIN; +BEGIN +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c4'; + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY +(3 rows) +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c5'; + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY +(3 rows) +1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c6'; + endpoint_id6 | token_id | host_id | port_id | READY + endpoint_id6 | token_id | host_id | port_id | READY + endpoint_id6 | token_id | host_id | port_id | READY +(3 rows) + +-- Wait until retrieving session for c4 quits +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); + +-- in one retrieve session, retrieve multiple tokens (begin retrieving, finished retrieving, not yet retrieve) +*R: @pre_run 'set_endpoint_variable @ENDPOINT4' : RETRIEVE 10 FROM ENDPOINT "@ENDPOINT4"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 +(10 rows) + + a +---- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 +(10 rows) +*R: @pre_run 'set_endpoint_variable @ENDPOINT5' : RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) +-- skip TOKEN3 in this session + +0U: SELECT cursorname,senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints(); + cursorname | ?column? | ?column? | state +------------+----------+----------+---------- + c4 | t | t | ATTACHED + c5 | f | t | FINISHED + c6 | t | f | READY +(3 rows) +0Rq: ... + +-- Since retrieving session abort, waiting should be interrupted. +1<: <... completed> +ERROR: canceling MPP operation: "Endpoint retrieve session is quitting. All unfinished parallel retrieve cursors on the session will be terminated." (seg0 192.168.235.128:7002 pid=70221) + +-- All endpoints should be removed since error happened. +2: SELECT cursorname, state FROM gp_endpoints(); + cursorname | state +------------+------- +(0 rows) + +-- quit all sessions +1q: ... +2q: ... diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/security.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/security.source new file mode 100644 index 00000000000..5f33e046087 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/security.source @@ -0,0 +1,140 @@ +-- @Description Tests retrieve session functionality restriction for security. +-- +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 100 + +CREATE OR REPLACE FUNCTION myappend(anyarray, anyelement) RETURNS anyarray AS $$ SELECT $1 || $2 $$ LANGUAGE SQL; +CREATE + +-- Test: Retrieve login without valid token. +1: @pre_run 'export RETRIEVE_TOKEN="123" ; echo $RAW_STR' : SELECT 1; + ?column? +---------- + 1 +(1 row) +0R: SELECT 1; +#0retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + +0Rq:Sessions not started cannot be quit + +-- Test: Declare a cursor +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_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) + +-- Test: Should not change gp_role in retrieve mode +0R: set gp_role to 'utility'; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +-- Test: limit all statement which is supported in retrieve session +0R: show gp_role; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +0R: begin; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: declare c1 cursor for select * from t1; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: fetch 5 from c1; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: rollback; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +0R: delete FROM t1; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: insert into t1 select generate_series(100,110); +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: update t1 set a=a+100 where a<10; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: truncate table t1; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: select * from t1; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +0R: CREATE TABLE t10 (a INT) DISTRIBUTED by (a); +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +0R: DROP TABLE t1; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +-- copy ... on program ... is also disallowed by this retrieve session. +0R: COPY t1 to '/tmp/1.cvs'; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +-- Test: builtin function can not be allowed +0R: select '12'::int; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +-- Test: UDF can not be allowed +0R: SELECT myappend(ARRAY[42,6], 21); +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. +-- Test: Create UDF can not allowed +0R: CREATE OR REPLACE FUNCTION myappend1(anyarray, anyelement) RETURNS anyarray AS $$ SELECT $1 || $2 $$ LANGUAGE SQL; +ERROR: This is a retrieve connection, but the query is not a RETRIEVE. + +-- Test: Different illegal endpoints always lead to an error +---- invalid endpoints +1R: RETRIEVE ALL FROM ENDPOINT abc; +ERROR: the endpoint abc does not exist in the session +1R: RETRIEVE ALL FROM ENDPOINT 123; +ERROR: syntax error at or near "123" +LINE 1: RETRIEVE ALL FROM ENDPOINT 123; + ^ +1R: RETRIEVE ALL FROM ENDPOINT tk1122; +ERROR: the endpoint tk1122 does not exist in the session +1R: RETRIEVE ALL FROM ENDPOINT tktt223344556677889900112233445566; +ERROR: the endpoint tktt223344556677889900112233445566 does not exist in the session + +-- Retrieve data. +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT1"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 16 + 18 + 19 + 2 + 22 + 24 + 3 + 4 + 7 + 8 +(10 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 +(10 rows) + + a +---- + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 5 + 6 + 9 +(10 rows) diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/special_query.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/special_query.source new file mode 100644 index 00000000000..33dd1a94ca5 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/special_query.source @@ -0,0 +1,178 @@ +-- @Description Tests create parallel for some special query +-- + +--------- Test1: test for PARALLEL RETRIEVE CURSOR on select transient record types +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 AS SELECT generate_series(1, 10) AS x DISTRIBUTED by (x); +CREATE 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 + +SELECT make_record(x) FROM t1; + make_record +------------- + (1) + (1,2,3,4,5) + (1,2,3,4,5) + (1,2,3,4,5) + (1,2,3,4,5) + (1,2) + (1,2,3) + (1,2,3,4) + (1,2,3,4,5) + (1,2,3,4,5) +(10 rows) + +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT make_record(x) FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_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: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + f +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT1': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT1'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + make_record +------------- + (1,2) + (1,2,3) + (1,2,3,4) + (1,2,3,4,5) + (1,2,3,4,5) +(5 rows) + + make_record +------------- + (1) +(1 row) + + make_record +------------- + (1,2,3,4,5) + (1,2,3,4,5) + (1,2,3,4,5) + (1,2,3,4,5) +(4 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: CLOSE c1; +CLOSE + +--------- Test2: test for PARALLEL RETRIEVE CURSOR on select with join statement. +-- there was a hang issue when declaring PARALLEL RETRIEVE CURSOR with join clause. +-- for example: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2 join t2 t12 on true; +-- the root cause is if there are more than one slices for a big table, cdbdisp_checkDispatchAckMessage() +-- will block due to non-root slice is always running in a while loop to wait for motion buffer. +-- this test case is used to verify the hang issue has been fixed. + +-- gp_max_packet_size must be set out of the test session +!\retcode gpconfig -c gp_max_packet_size -v 512; +-- start_ignore +20210729:16:19:41:030632 gpconfig:lhlgpdb7:gpadmin-[INFO]:-completed successfully with parameters '-c gp_max_packet_size -v 512' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +20210729:16:19:41:030829 gpstop:lhlgpdb7:gpadmin-[INFO]:-Starting gpstop with args: -u +20210729:16:19:41:030829 gpstop:lhlgpdb7:gpadmin-[INFO]:-Gathering information and validating the environment... +20210729:16:19:41:030829 gpstop:lhlgpdb7:gpadmin-[INFO]:-Obtaining Cloudberry Coordinator catalog information +20210729:16:19:41:030829 gpstop:lhlgpdb7:gpadmin-[INFO]:-Obtaining Segment details from coordinator... +20210729:16:19:41:030829 gpstop:lhlgpdb7:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.14885.ga86b597 build dev' +20210729:16:19:41:030829 gpstop:lhlgpdb7:gpadmin-[INFO]:-Signalling all postmaster processes to reload + +-- end_ignore +(exited with code 0) + +DROP TABLE IF EXISTS t2; +DROP +CREATE TABLE t2 (a BIGINT) DISTRIBUTED by (a); +CREATE + +insert into t2 select generate_series(1,2000); +INSERT 2000 + +SET gp_interconnect_snd_queue_depth=1; +SET +SET gp_interconnect_queue_depth=1; +SET + +-- start a new session to make sure gp_max_packet_size is reconfigured. +2: BEGIN; +BEGIN +2: SHOW gp_max_packet_size; + gp_max_packet_size +-------------------- + 512 +(1 row) +2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2 join t2 t12 on true; +DECLARE +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +------- + READY + READY + READY +(3 rows) +2: CLOSE c2; +CLOSE +2: END; +END + +-- cleanup +DROP TABLE t2; +DROP +!\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' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +20210729:16:23:43:000702 gpstop:lhlgpdb7:gpadmin-[INFO]:-Starting gpstop with args: -u +20210729:16:23:43:000702 gpstop:lhlgpdb7:gpadmin-[INFO]:-Gathering information and validating the environment... +20210729:16:23:43:000702 gpstop:lhlgpdb7:gpadmin-[INFO]:-Obtaining Cloudberry Coordinator catalog information +20210729:16:23:43:000702 gpstop:lhlgpdb7:gpadmin-[INFO]:-Obtaining Segment details from coordinator... +20210729:16:23:43:000702 gpstop:lhlgpdb7:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.14885.ga86b597 build dev' +20210729:16:23:43:000702 gpstop:lhlgpdb7:gpadmin-[INFO]:-Signalling all postmaster processes to reload + +-- end_ignore +(exited with code 0) diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/status_check.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/status_check.source new file mode 100644 index 00000000000..4f9a55498c7 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/status_check.source @@ -0,0 +1,1396 @@ +-- @Description Tests the state for pg_endpoints AND gp_segment_endpoints(), focus in nowait mode +-- need to fault injection to gp_wait_parallel_retrieve_cursor() +-- +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 100 + +--------- Test1: Basic test for parallel retrieve interface & close cursor +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_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: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + f +(1 row) + +*U: @pre_run 'set_endpoint_variable @ENDPOINT1': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT1'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); + finished +---------- + t +(1 row) +1: CLOSE c1; +CLOSE +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; + auth_token | state +------------+------- +(0 rows) +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c1'; + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +ERROR: cursor "c1" does not exist +1: ROLLBACK; +ROLLBACK + +---------- Test2: enhanced test for parallel retrieve interface state & cursor auto closed when transaction closed +1: BEGIN; +BEGIN +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +-- test RETRIEVE success on seg1 +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + f +(1 row) + +-- check initial state after "CHECK PARALLEL RETRIEVE CURSOR" +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + ATTACHED + READY + READY +(3 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+---------- + t | t | ATTACHED +(1 row) + + ?column? | ?column? | state +----------+----------+------- + t | f | READY +(1 row) + + ?column? | ?column? | state +----------+----------+------- + t | f | READY +(1 row) +-- check state if some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; + a +---- + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + ATTACHED + FINISHED + READY +(3 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+---------- + t | t | ATTACHED +(1 row) + + ?column? | ?column? | state +----------+----------+---------- + f | t | FINISHED +(1 row) + + ?column? | ?column? | state +----------+----------+------- + t | f | READY +(1 row) +-- return 0 row instead of reporting error if finished retrieving data from this endpoint, while other endpoint have not finished retrieving. +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +--- +(0 rows) +-- finished retrieving all endpoints and check state +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(18 rows) + + a +--- +(0 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+---------- + f | t | FINISHED +(1 row) + + ?column? | ?column? | state +----------+----------+---------- + f | t | FINISHED +(1 row) + + ?column? | ?column? | state +----------+----------+---------- + f | t | FINISHED +(1 row) + +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); + finished +---------- + t +(1 row) +1: COMMIT; +COMMIT +-- check the cursor auto closed when transaction closed +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +------- +(0 rows) +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c2'; + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +ERROR: cursor "c2" does not exist +1: ROLLBACK; +ROLLBACK + +---------- Test3: 2 retrieving sessions connect to the same endpoint report error & cancel QE exec backend +1: BEGIN; +BEGIN +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY +(3 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', 0); + finished +---------- + f +(1 row) +0R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +-- a new retrieve session should report error +3R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; +ERROR: endpoint endpoint_id3 was already attached by receiver(pid: PID) +DETAIL: An endpoint can only be attached by one retrieving session. +-- quit this new retrieve session +3Rq: ... +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +1R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID31 1 1 ; create_sub "$PID31[ \t]*" senderpid31': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); + senderpid | ?column? | state +-----------+----------+---------- + senderpid31| t | ATTACHED +(1 row) +-- run 'kill -s INT senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s INT ${PID31} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1: SELECT pg_sleep(0.4); + pg_sleep +---------- + +(1 row) +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; + state +---------- + FINISHED + READY +(2 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', 0); +ERROR: canceling MPP operation (seg0 192.168.235.128:7002 pid=67934) +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c3'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', 0); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c3'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + +---------- Test4: terminate (using signal QUIT) QE exec backend +1: BEGIN; +BEGIN +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c4'; + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY +(3 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', 0); + finished +---------- + f +(1 row) +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT4"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID41 1 1 ; create_sub "${PID41}[ \t]*" senderpid41': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); + senderpid | ?column? | state +-----------+----------+---------- + senderpid41| t | ATTACHED +(1 row) +-- run 'kill -s QUIT senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s QUIT ${PID41} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- exit this session because the connection closed, so that it will re-connect next time use this session. +0Rq: ... +0Uq: ... +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1: SELECT pg_sleep(0.4); + pg_sleep +---------- + +(1 row) +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; +ERROR: Error on receive from seg0 10.34.58.56:25432 pid=41925: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', 0); +ERROR: Error on receive from seg0 192.168.235.128:7002 pid=68097: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- check no endpoint info left +2q: ... +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c4'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', 0); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c4'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +2Rq: ... + +---------- Test5: terminate (using signal TERM) QE exec backend +1: BEGIN; +BEGIN +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c5'; + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY +(3 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', 0); + finished +---------- + f +(1 row) +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT5"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +-- 1R still bind to Test4 session, so can not retrieve from current endpoint. +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +ERROR: the endpoint endpoint_id5 does not exist in the session +-- Since seg1 retrieve session is bind to Test4 session. And Test4 session get killed. We need to restart it. +1Rq: ... +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID51 1 1 ; create_sub "${PID51}[ \t]*" senderpid51': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); + senderpid | ?column? | state +-----------+----------+---------- + senderpid51| t | ATTACHED +(1 row) +-- run 'kill -s TERM senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s TERM ${PID51} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1: SELECT pg_sleep(0.4); + pg_sleep +---------- + +(1 row) +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; + state +---------- + FINISHED + READY +(2 rows) +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', 0); +ERROR: terminating connection due to administrator command (seg0 192.168.235.128:7002 pid=68210) +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c5'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', 0); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c5'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + +---------- Test6: Cancel (using signal INT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' +-- faul injection on QD +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'sleep', '', '', '', 1, 1, 1, 1::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +1: BEGIN; +BEGIN +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c6'; + endpoint_id6 | token_id | host_id | port_id | READY + endpoint_id6 | token_id | host_id | port_id | READY + endpoint_id6 | token_id | host_id | port_id | READY +(3 rows) +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID61 1 1 ; create_sub "${PID61}[ \t]*" QDPid61': select pg_backend_pid(); + pg_backend_pid +---------------- + QDPid61 +(1 row) +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT6"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- run 'kill -s INT QDPid' to cancel the endpoint execution backend, retrieve session still can work +-- fault injection sleep to wait for canceling the endpoint execution backend, retrieve session still can work +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', 0); +0U: @pre_run 'kill -s INT ${PID61} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +ERROR: canceling statement due to user request +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c6'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c6'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', 0); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c6'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c6'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + +---------- Test6.1: Cancel (using signal INT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' without rollback +-- faul injection on QD +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'sleep', '', '', '', 1, 1, 1, 1::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +1: BEGIN; +BEGIN +1: DECLARE c61 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 61 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c61'; + endpoint_id61 | token_id | host_id | port_id | READY + endpoint_id61 | token_id | host_id | port_id | READY + endpoint_id61 | token_id | host_id | port_id | READY +(3 rows) +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID611 1 1 ; create_sub "${PID611}[ \t]*" QDPid611': select pg_backend_pid(); + pg_backend_pid +---------------- + QDPid611 +(1 row) +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT61': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT61"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT61': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT61"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- run 'kill -s INT QDPid' to cancel the endpoint execution backend, retrieve session still can work +-- fault injection sleep to wait for canceling the endpoint execution backend, retrieve session still can work +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c61', 0); +0U: @pre_run 'kill -s INT ${PID611} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +ERROR: canceling statement due to user request +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c61'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c61'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- quit the session of 'CHECK PARALLEL RETRIEVE CURSOR' and keep other session connected +1q: ... +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c61'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c61'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +0Rq: ... +1Rq: ... + +---------- Test7: terminate (using signal QUIT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) +1: SELECT gp_inject_fault('gp_wait_parallel_retrieve_cursor_after_udf', 'sleep', '', '', '', 1, 1, 1, 1::smallint); + gp_inject_fault +----------------- + Success: +(1 row) +1: BEGIN; +BEGIN +1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c7'; + endpoint_id7 | token_id | host_id | port_id | READY + endpoint_id7 | token_id | host_id | port_id | READY + endpoint_id7 | token_id | host_id | port_id | READY +(3 rows) +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID71 1 1 ; create_sub "${PID71}[ \t]*" QDPid71': select pg_backend_pid(); + pg_backend_pid +---------------- + QDPid71 +(1 row) +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT7"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +2U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; + ?column? | ?column? | state +----------+----------+------- + t | f | READY +(1 row) +-- run 'kill -s QUIT QDPid' to cancel the endpoint execution backend, retrieve session still can work +-- here need to sleep sometime to wait for endpoint QE backend to detect QD connection lost. +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c7', 0); +0U: @pre_run 'kill -s QUIT ${PID71}&& sleep 5 && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- quit all sessions on the master, because connect lost +1q: ... +2q: ... +-1Uq: ... +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c7'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c7', -1); +ERROR: cursor "c7" does not exist +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c7'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + +---------- Test8: Status visibilities for different sessions +1: BEGIN; +BEGIN +1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'get_tuple_cell SESSION81 1 1 ; create_match_sub_with_spaces $SESSION81 session81' : SELECT sessionid,state FROM gp_session_endpoints() WHERE cursorname='c8'; + sessionid | state +-----------+------- + session81 | READY + session81 | READY + session81 | READY +(3 rows) +-- Session 2 can only see its own cursors by default. +2: BEGIN; +BEGIN +2: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +2: @post_run 'get_tuple_cell SESSION82 1 1 ; create_match_sub_with_spaces $SESSION82 session82' : SELECT sessionid,state FROM gp_session_endpoints() WHERE cursorname='c8'; + sessionid | state +-----------+------- + session82 | READY + session82 | READY + session82 | READY +(3 rows) +-- Session 2 can see all cursors with gp_endpoints(). +2: SELECT sessionid,state FROM gp_endpoints() WHERE cursorname='c8' order by sessionid; + sessionid | state +-----------+------- + session82 | READY + session82 | READY + session82 | READY + session81 | READY + session81 | READY + session81 | READY +(6 rows) + +1: CLOSE c8; +CLOSE +1: END; +END +2: CLOSE c8; +CLOSE +2: END; +END + diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/status_wait.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/status_wait.source new file mode 100644 index 00000000000..21d46b76c84 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/status_wait.source @@ -0,0 +1,1310 @@ +-- @Description Tests the state for pg_endpoints AND gp_segment_endpoints(), focus in wait mode +-- +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 100 + +--------- Test1: Basic test for parallel retrieve interface & close cursor +1: BEGIN; +BEGIN +1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_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&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); + +*U: @pre_run 'set_endpoint_variable @ENDPOINT1': SELECT state FROM gp_segment_endpoints() WHERE endpointname='@ENDPOINT1'; + state +------- +(0 rows) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) + + state +------- + READY +(1 row) +*R: @pre_run 'set_endpoint_variable @ENDPOINT1': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT1"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(38 rows) + + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) + +1<: <... completed> + finished +---------- + t +(1 row) +1: CLOSE c1; +CLOSE +-- check no endpoint info +1: SELECT auth_token,state FROM gp_endpoints() WHERE cursorname='c1'; + auth_token | state +------------+------- +(0 rows) +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c1'; + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +ERROR: cursor "c1" does not exist +1: ROLLBACK; +ROLLBACK + +---------- Test2: enhanced test for parallel retrieve interface state & cursor auto closed when transaction closed +1: BEGIN; +BEGIN +1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c2'; + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY + endpoint_id2 | token_id | host_id | port_id | READY +(3 rows) +-- test RETRIEVE success on seg1 +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; + a +---- + 16 + 18 + 19 + 2 + 22 + 24 + 3 + 7 + 8 + 4 +(10 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); + +-- check initial state after "CHECK PARALLEL RETRIEVE CURSOR" +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + ATTACHED + READY + READY +(3 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+---------- + t | t | ATTACHED +(1 row) + + ?column? | ?column? | state +----------+----------+------- + t | f | READY +(1 row) + + ?column? | ?column? | state +----------+----------+------- + t | f | READY +(1 row) +-- check state if some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT2"; + a +---- + 27 + 29 + 34 + 37 + 39 + 41 + 42 + 45 + 51 + 53 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + ATTACHED + FINISHED + READY +(3 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+---------- + t | t | ATTACHED +(1 row) + + ?column? | ?column? | state +----------+----------+---------- + f | t | FINISHED +(1 row) + + ?column? | ?column? | state +----------+----------+------- + t | f | READY +(1 row) +-- return 0 row instead of reporting error if finished retrieving data from this endpoint, while other endpoint have not finished retrieving. +1R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; + a +--- +(0 rows) +-- finished retrieving all endpoints and check state +*R: @pre_run 'set_endpoint_variable @ENDPOINT2': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT2"; +#-1retrieve> connection to server at "host_id", port port_id failed: FATAL: retrieve auth token is invalid + + + a +---- + 54 + 55 + 59 + 60 + 65 + 66 + 70 + 75 + 77 + 80 + 81 + 84 + 90 + 92 + 93 + 94 + 97 + 99 +(18 rows) + + a +--- +(0 rows) + + a +----- + 5 + 6 + 9 + 10 + 11 + 13 + 14 + 17 + 21 + 25 + 28 + 32 + 33 + 43 + 52 + 56 + 58 + 62 + 63 + 67 + 73 + 82 + 85 + 96 + 100 +(25 rows) +2: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +---------- + FINISHED + FINISHED + FINISHED +(3 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c2'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+---------- + f | t | FINISHED +(1 row) + + ?column? | ?column? | state +----------+----------+---------- + f | t | FINISHED +(1 row) + + ?column? | ?column? | state +----------+----------+---------- + f | t | FINISHED +(1 row) + +1<: <... completed> + finished +---------- + t +(1 row) +1: COMMIT; +COMMIT +-- check the cursor auto closed when transaction closed +-- check no endpoint info +1: SELECT state FROM gp_endpoints() WHERE cursorname='c2'; + state +------- +(0 rows) +-- check no token info on QE after close PARALLEL RETRIEVE CURSOR +*U: SELECT * FROM gp_segment_endpoints() WHERE cursorname='c2'; + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + + auth_token | databaseid | senderpid | receiverpid | state | dbid | sessionid | userid | endpointname | cursorname +------------+------------+-----------+-------------+-------+------+-----------+--------+--------------+------------ +(0 rows) + +-- error out for closed cursor +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); +ERROR: cursor "c2" does not exist +1: ROLLBACK; +ROLLBACK + +---------- Test3: 2 retrieving sessions connect to the same endpoint report error & cancel QE exec backend +1: BEGIN; +BEGIN +1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c3'; + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY + endpoint_id3 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +0R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +-- a new retrieve session should report error +3R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT3"; +ERROR: endpoint endpoint_id3 was already attached by receiver(pid: PID) +DETAIL: An endpoint can only be attached by one retrieving session. +-- quit this new retrieve session +3Rq: ... +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +1R: @pre_run 'set_endpoint_variable @ENDPOINT3': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT3"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID31 1 1 ; create_sub "$PID31[ \t]*" senderpid31': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); + senderpid | ?column? | state +-----------+----------+---------- + senderpid31| t | ATTACHED +(1 row) +-- run 'kill -s INT senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s INT ${PID31} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +ERROR: canceling MPP operation +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c3'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c3', -1); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c3'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c3'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + +---------- Test4: terminate (using signal QUIT) QE exec backend +1: BEGIN; +BEGIN +1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c4'; + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY + endpoint_id4 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT4"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT4': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT4"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID41 1 1 ; create_sub "${PID41}[ \t]*" senderpid41': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); + senderpid | ?column? | state +-----------+----------+---------- + senderpid41| t | ATTACHED +(1 row) +-- run 'kill -s QUIT senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s QUIT ${PID41} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- exit this session because the connection closed, so that it will re-connect next time use this session. +0Rq: ... +0Uq: ... +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +ERROR: Error on receive from seg0 10.34.50.67:25432 pid=12603: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- check no endpoint info left +2q: ... +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c4'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c4', -1); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c4'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c4'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +2Rq: ... + +---------- Test5: terminate (using signal TERM) QE exec backend +1: BEGIN; +BEGIN +1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c5'; + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY + endpoint_id5 | token_id | host_id | port_id | READY +(3 rows) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT5"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +-- 1R still bind to Test4 session, so can not retrieve from current endpoint. +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; +ERROR: the endpoint endpoint_id5 does not exist in the session +-- Since seg1 retrieve session is bind to Test4 session. And Test4 session get killed. We need to restart it. +1Rq: ... +1R: @pre_run 'set_endpoint_variable @ENDPOINT5': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT5"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- get senderpid which is endpoint execution backend +0U: @post_run 'get_tuple_cell PID51 1 1 ; create_sub "${PID51}[ \t]*" senderpid51': SELECT senderpid, receiverpid<>-1, state FROM gp_segment_endpoints(); + senderpid | ?column? | state +-----------+----------+---------- + senderpid51| t | ATTACHED +(1 row) +-- run 'kill -s TERM senderpid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s TERM ${PID51} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +ERROR: terminating connection due to administrator command (seg0 10.34.50.67:25432 pid=12905) +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c5'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c5', -1); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c5'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c5'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + +---------- Test6: Cancel (using signal INT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' +1: BEGIN; +BEGIN +1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c6'; + endpoint_id6 | token_id | host_id | port_id | READY + endpoint_id6 | token_id | host_id | port_id | READY + endpoint_id6 | token_id | host_id | port_id | READY +(3 rows) +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID61 1 1 ; create_sub "${PID61}[ \t]*" QDPid61': select pg_backend_pid(); + pg_backend_pid +---------------- + QDPid61 +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT6"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT6': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT6"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- run 'kill -s INT QDPid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s INT ${PID61} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +ERROR: canceling statement due to user request +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c6'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c6'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c6', -1); +ERROR: current transaction is aborted, commands ignored until end of transaction block +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c6'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c6'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + +---------- Test6.1: Cancel (using signal INT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' without rollback +1: BEGIN; +BEGIN +1: DECLARE c61 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 61 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c61'; + endpoint_id61 | token_id | host_id | port_id | READY + endpoint_id61 | token_id | host_id | port_id | READY + endpoint_id61 | token_id | host_id | port_id | READY +(3 rows) +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID611 1 1 ; create_sub "${PID611}[ \t]*" QDPid611': select pg_backend_pid(); + pg_backend_pid +---------------- + QDPid611 +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c61', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT61': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT61"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT61': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT61"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +-- run 'kill -s INT QDPid' to cancel the endpoint execution backend, retrieve session still can work +42: @pre_run 'kill -s INT ${PID611} && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +ERROR: canceling statement due to user request +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c61'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c61'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- quit the session of 'CHECK PARALLEL RETRIEVE CURSOR' and keep other session connected +1q: ... +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c61'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c61'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +0Rq: ... +1Rq: ... + +---------- Test7: terminate (using signal QUIT) the process of 'CHECK PARALLEL RETRIEVE CURSOR' +1: BEGIN; +BEGIN +1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_endpoints() WHERE cursorname='c7'; + endpoint_id7 | token_id | host_id | port_id | READY + endpoint_id7 | token_id | host_id | port_id | READY + endpoint_id7 | token_id | host_id | port_id | READY +(3 rows) +-- get backend pid of this session which run 'gp_wait_parallel_retrieve_cursor' +1: @post_run 'get_tuple_cell PID71 1 1 ; create_sub "${PID71}[ \t]*" QDPid71': select pg_backend_pid(); + pg_backend_pid +---------------- + QDPid71 +(1 row) +1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c7', -1); +-- some endpoint retrieve partial results, some endpoint finished retrieving, some endpoint not start retrieving +0R: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE 10 FROM ENDPOINT "@ENDPOINT7"; + a +---- + 2 + 3 + 4 + 7 + 8 + 16 + 18 + 19 + 22 + 24 +(10 rows) +1R: @pre_run 'set_endpoint_variable @ENDPOINT7': RETRIEVE ALL FROM ENDPOINT "@ENDPOINT7"; + a +---- + 1 + 12 + 15 + 20 + 23 + 26 + 30 + 31 + 35 + 36 + 38 + 40 + 44 + 46 + 47 + 48 + 49 + 50 + 57 + 61 + 64 + 68 + 69 + 71 + 72 + 74 + 76 + 78 + 79 + 83 + 86 + 87 + 88 + 89 + 91 + 95 + 98 +(37 rows) +2U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; + ?column? | ?column? | state +----------+----------+------- + t | f | READY +(1 row) +-- run 'kill -s QUIT QDPid' to cancel the endpoint execution backend, retrieve session still can work +-- here need to sleep sometime to wait for endpoint QE backend to detect QD connection lost. +0U: @pre_run 'kill -s QUIT ${PID71}&& sleep 5 && echo "${RAW_STR}" ': SELECT 1; + ?column? +---------- + 1 +(1 row) +-- check it can cancel the "gp_wait_parallel_retrieve_cursor" +1<: <... completed> +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +-- quit all sessions on the master, because connect lost +1q: ... +2q: ... +-1Uq: ... +-- check no endpoint info left +2: SELECT state FROM gp_endpoints() WHERE cursorname='c7'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) +-- report error for EXECUTE canceled PARALLEL RETRIEVE CURSOR +1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c7', -1); +ERROR: cursor "c7" does not exist +1: ROLLBACK; +ROLLBACK +-- check no endpoint info +2: SELECT state FROM gp_endpoints() WHERE cursorname='c7'; + state +------- +(0 rows) +*U: SELECT senderpid<>-1, receiverpid<>-1, state FROM gp_segment_endpoints() WHERE cursorname='c7'; + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + + ?column? | ?column? | state +----------+----------+------- +(0 rows) + +---------- Test8: Status visibilities for different sessions +1: BEGIN; +BEGIN +1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +1: @post_run 'get_tuple_cell SESSION81 1 1 ; create_match_sub_with_spaces $SESSION81 session81': SELECT sessionid,state FROM gp_session_endpoints() WHERE cursorname='c8'; + sessionid | state +-----------+------- + session81 | READY + session81 | READY + session81 | READY +(3 rows) +-- Session 2 can only see its own cursors by default. +2: BEGIN; +BEGIN +2: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +2: @post_run 'get_tuple_cell SESSION82 1 1 ; create_match_sub_with_spaces $SESSION82 session82': SELECT sessionid,state FROM gp_session_endpoints() WHERE cursorname='c8'; + sessionid | state +-----------+------- + session82 | READY + session82 | READY + session82 | READY +(3 rows) +-- Session 2 can see all cursors with gp_endpoints(). +2: SELECT sessionid,state FROM gp_endpoints() WHERE cursorname='c8' order by sessionid; + sessionid | state +-----------+------- + session82 | READY + session82 | READY + session82 | READY + session81 | READY + session81 | READY + session81 | READY +(6 rows) + +1: CLOSE c8; +CLOSE +1: END; +END +2: CLOSE c8; +CLOSE +2: END; +END + diff --git a/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/syntax.source b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/syntax.source new file mode 100644 index 00000000000..40d92067636 --- /dev/null +++ b/src/test/singlenode_isolation2/output/parallel_retrieve_cursor/syntax.source @@ -0,0 +1,87 @@ +-- @Description Tests syntax for the PARALLEL RETRIEVE CURSOR statement +-- +DROP TABLE IF EXISTS t1; +DROP +CREATE TABLE t1 (a INT) DISTRIBUTED by (a); +CREATE +insert into t1 select generate_series(1,100); +INSERT 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 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 +ROLLBACK; +ROLLBACK + +BEGIN; +BEGIN +DECLARE c1 NO SCROLL PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +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 +ROLLBACK; +ROLLBACK + +-- Test2: PARALLEL RETRIEVE CURSOR can not support FETCH/MOVE statement +BEGIN; +BEGIN +DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +FETCH ALL FROM c1; +ERROR: cannot specify 'FETCH' for PARALLEL RETRIEVE CURSOR +HINT: Use 'RETRIEVE' statement on endpoint instead. +ROLLBACK; +ROLLBACK + +BEGIN; +BEGIN +DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; +DECLARE +MOVE 10 FROM c1; +ERROR: the 'MOVE' statement for PARALLEL RETRIEVE CURSOR is not supported +ROLLBACK; +ROLLBACK + +-- Test3: non-PARALLEL RETRIEVE CURSOR can not support the PARALLEL RETRIEVE CURSOR related UDF +BEGIN; +BEGIN +DECLARE c1 CURSOR FOR SELECT * FROM t1; +DECLARE +SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); +ERROR: cursor is not a PARALLEL RETRIEVE CURSOR +ROLLBACK; +ROLLBACK +BEGIN; +BEGIN +DECLARE c1 CURSOR FOR SELECT * FROM t1; +DECLARE +SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); +ERROR: cursor is not a PARALLEL RETRIEVE CURSOR +ROLLBACK; +ROLLBACK + +-- Test4: PARALLEL RETRIEVE CURSOR can not support in SPI +BEGIN; +BEGIN +DECLARE c1 CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +DECLARE +DO $$ DECLARE i int4; c2 refcursor = 'c1'; BEGIN FETCH FROM c2 INTO i; RAISE NOTICE '%', i; END; $$; +DO +ROLLBACK; +ROLLBACK +BEGIN; +BEGIN +DECLARE c3 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; +DECLARE +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. +CONTEXT: PL/pgSQL function inline_code_block line 1 at FETCH +ROLLBACK; +ROLLBACK diff --git a/src/test/singlenode_isolation2/output/pg_basebackup.source b/src/test/singlenode_isolation2/output/pg_basebackup.source new file mode 100644 index 00000000000..e6fae99b905 --- /dev/null +++ b/src/test/singlenode_isolation2/output/pg_basebackup.source @@ -0,0 +1,80 @@ +-- When pg_basebackup runs with --slot and stream as wal-method +select pg_basebackup(address, dbid, port, true, 'some_replication_slot', '@testtablespace@/some_isolation2_pg_basebackup', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + pg_basebackup +--------------- + +(1 row) + +-- Then a replication slot gets created on that segment with the slot +-- name and the slot's restart_lsn is not NULL, indicating that the +-- WAL streamer process utilized this slot for streaming WAL during +-- base backup +0U: select slot_name, slot_type, active, restart_lsn is not NULL as slot_was_used from pg_get_replication_slots() where slot_name = 'some_replication_slot'; + slot_name | slot_type | active | slot_was_used +-----------------------+-----------+--------+--------------- + some_replication_slot | physical | f | t +(1 row) + +-- When another basebackup is run with the same slot name +select pg_basebackup(address, dbid, port, false, 'some_replication_slot', '@testtablespace@/some_other_isolation2_pg_basebackup', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + pg_basebackup +--------------- + +(1 row) + +-- Then the backup should exist on the filesystem, ready for mirroring +!\retcode cat @testtablespace@/some_other_isolation2_pg_basebackup/postgresql.auto.conf; +-- start_ignore +standby_mode = 'on' +primary_conninfo = 'user=adamberlin host=adamberlin-linux port=25432 sslmode=disable sslcompression=1 application_name=gp_walreceiver' +primary_slot_name = 'some_replication_slot' + +-- end_ignore +(exited with code 0) + +-- And the replication slot information should be unchanged +0U: select slot_name, slot_type, active, restart_lsn is not NULL as slot_was_used from pg_get_replication_slots() where slot_name = 'some_replication_slot'; + slot_name | slot_type | active | slot_was_used +-----------------------+-----------+--------+--------------- + some_replication_slot | physical | f | t +(1 row) + +-- Given we remove the replication slot +0U: select * from pg_drop_replication_slot('some_replication_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) +!\retcode rm -rf @testtablespace@/some_isolation2_pg_basebackup; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode rm -rf @testtablespace@/some_other_isolation2_pg_basebackup; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- When pg_basebackup runs without --slot +select pg_basebackup(address, dbid, port, false, null, '@testtablespace@/some_isolation2_pg_basebackup', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + pg_basebackup +--------------- + +(1 row) + +-- Then there should NOT be a replication slot +0U: select count(1) from pg_get_replication_slots() where slot_name = 'some_replication_slot'; + count +------- + 0 +(1 row) + + +-- Cleanup things we've created +!\retcode rm -rf @testtablespace@/some_isolation2_pg_basebackup; +-- start_ignore + +-- end_ignore +(exited with code 0) + diff --git a/src/test/singlenode_isolation2/output/pg_basebackup_with_tablespaces.source b/src/test/singlenode_isolation2/output/pg_basebackup_with_tablespaces.source new file mode 100644 index 00000000000..fc8ceda2d41 --- /dev/null +++ b/src/test/singlenode_isolation2/output/pg_basebackup_with_tablespaces.source @@ -0,0 +1,222 @@ +-- Given a segment with a database that has a tablespace +!\retcode mkdir -p @testtablespace@/some_basebackup_tablespace; +-- start_ignore + +-- end_ignore +(exited with code 0) + +drop tablespace if exists some_basebackup_tablespace; +DROP +create tablespace some_basebackup_tablespace location '@testtablespace@/some_basebackup_tablespace'; +CREATE + +-- And a database using the tablespace +drop database if exists some_database_with_tablespace; +DROP +create database some_database_with_tablespace tablespace some_basebackup_tablespace; +CREATE + +-- And a database without using the tablespace +drop database if exists some_database_without_tablespace; +DROP +create database some_database_without_tablespace; +CREATE + +-- 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 +1:@db_name some_database_without_tablespace: CREATE INDEX test_index on test(a) TABLESPACE some_basebackup_tablespace; +CREATE +2:@db_name some_database_without_tablespace: CREATE TEMP TABLE test_tmp(a INT, b INT) TABLESPACE some_basebackup_tablespace; +CREATE +2:@db_name some_database_without_tablespace: CREATE INDEX test_tmp_index on test_tmp(a) TABLESPACE some_basebackup_tablespace; +CREATE + +1q: ... + +-- When we create a full backup +select pg_basebackup(address, 100, port, true, 'some_replication_slot', '@testtablespace@/some_basebackup_datadir', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + pg_basebackup +--------------- + +(1 row) + +-- Then we should have two directories in newly created target tablespace, some_database_with_tablespace and some_database_without_tablespace +select count_of_items_in_directory('@testtablespace@/some_basebackup_tablespace/100/GPDB_*/'); + count_of_items_in_directory +----------------------------- + 2 +(1 row) + +-- Then we should have two files in newly created target tablespace +-- under the some_database_without_tablespace, test, test_index. Files +-- for temp table are not copied. +select count_of_items_in_database_directory('@testtablespace@/some_basebackup_tablespace/100/GPDB_*/', oid) from pg_database where datname='some_database_without_tablespace'; + count_of_items_in_database_directory +-------------------------------------- + 2 +(1 row) + +-- Then we should have the tablespace symlink link to the mapped tablespace directory +select validate_tablespace_symlink('@testtablespace@/some_basebackup_datadir', '@testtablespace@/some_basebackup_tablespace', 100, oid) from pg_tablespace where spcname='some_basebackup_tablespace'; + validate_tablespace_symlink +----------------------------- + t +(1 row) + +-- When we create a full backup again for the same target using force overwrite +select pg_basebackup(address, 100, port, false, 'some_replication_slot', '@testtablespace@/some_basebackup_datadir', true, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + pg_basebackup +--------------- + +(1 row) + +-- Then we should have two directories in newly created target tablespace, some_database_with_tablespace and some_database_without_tablespace +select count_of_items_in_directory('@testtablespace@/some_basebackup_tablespace/100/GPDB_*/'); + count_of_items_in_directory +----------------------------- + 2 +(1 row) + +-- Then we should have two files in newly created target tablespace +-- under the some_database_without_tablespace, test, test_index. Files +-- for temp table are not copied. +select count_of_items_in_database_directory('@testtablespace@/some_basebackup_tablespace/100/GPDB_*/', oid) from pg_database where datname='some_database_without_tablespace'; + count_of_items_in_database_directory +-------------------------------------- + 2 +(1 row) + +-- Then we should have the tablespace symlink link to the mapped tablespace directory +select validate_tablespace_symlink('@testtablespace@/some_basebackup_datadir', '@testtablespace@/some_basebackup_tablespace', 100, oid) from pg_tablespace where spcname='some_basebackup_tablespace'; + validate_tablespace_symlink +----------------------------- + t +(1 row) + +2q: ... + +-- Cleanup things we've created +0U: select pg_drop_replication_slot('some_replication_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) +drop database some_database_with_tablespace; +DROP +-- 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. +!\retcode bash -c 'for ((i = 0; i < 5; i++)); do dropdb some_database_without_tablespace && exit 0; done; exit 1'; +-- start_ignore + +-- end_ignore +(exited with code 0) +drop tablespace some_basebackup_tablespace; +DROP +!\retcode rm -rf @testtablespace@/some_basebackup_datadir/; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode rm -rf @testtablespace@/some_basebackup_tablespace/100; +-- start_ignore + +-- end_ignore +(exited with code 0) + +-- Given a segment (content=0) with a tablespace mapped to a location different from that of other segments +!\retcode mkdir -p @testtablespace@/some_basebackup_tablespace; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode mkdir -p @testtablespace@/some_basebackup_tablespace_c0; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode mkdir -p @testtablespace@/some_basebackup_datadir; +-- start_ignore + +-- end_ignore +(exited with code 0) + +create tablespace some_basebackup_tablespace LOCATION '@testtablespace@/some_basebackup_tablespace' WITH (content0='@testtablespace@/some_basebackup_tablespace_c0'); +CREATE + +-- And a database without using the tablespace +drop database if exists some_database_without_tablespace; +DROP +create database some_database_without_tablespace; +CREATE + +-- 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 +1:@db_name some_database_without_tablespace: CREATE INDEX test_index on test(a) TABLESPACE some_basebackup_tablespace; +CREATE +2:@db_name some_database_without_tablespace: CREATE TEMP TABLE test_tmp(a INT, b INT) TABLESPACE some_basebackup_tablespace; +CREATE +2:@db_name some_database_without_tablespace: CREATE INDEX test_tmp_index on test_tmp(a) TABLESPACE some_basebackup_tablespace; +CREATE + +1q: ... + +-- When we create a full backup +select pg_basebackup(address, 100, port, true, 'some_replication_slot', '@testtablespace@/some_basebackup_datadir', false, 'stream') from gp_segment_configuration where content = 0 and role = 'p'; + pg_basebackup +--------------- + +(1 row) + +-- Then we should have one directory in the newly created target tablespace, some_database_without_tablespace +select count_of_items_in_directory('@testtablespace@/some_basebackup_tablespace_c0/100/GPDB_*/'); + count_of_items_in_directory +----------------------------- + 1 +(1 row) + +-- Then we should have six directories under some_basebackup_tablespace - db id = {1, 3, 4, 6, 7, 8}. 100 should not be present. +select count_of_items_in_directory('@testtablespace@/some_basebackup_tablespace'); + count_of_items_in_directory +----------------------------- + 6 +(1 row) + +-- Then we should have the tablespace symlink link to the mapped tablespace directory +select validate_tablespace_symlink('@testtablespace@/some_basebackup_datadir', '@testtablespace@/some_basebackup_tablespace_c0', 100, oid) from pg_tablespace where spcname='some_basebackup_tablespace'; + validate_tablespace_symlink +----------------------------- + t +(1 row) + +2q: ... + +-- Cleanup things we've created +0U: select pg_drop_replication_slot('some_replication_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) +-- 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. +!\retcode bash -c 'for ((i = 0; i < 5; i++)); do dropdb some_database_without_tablespace && exit 0; done; exit 1'; +-- start_ignore + +-- end_ignore +(exited with code 0) +drop tablespace some_basebackup_tablespace; +DROP +!\retcode rm -rf @testtablespace@/some_basebackup_datadir/; +-- start_ignore + +-- end_ignore +(exited with code 0) +!\retcode rm -rf @testtablespace@/some_basebackup_tablespace_c0/100; +-- start_ignore + +-- end_ignore +(exited with code 0) + diff --git a/src/test/singlenode_isolation2/output/resgroup/disable_resgroup.source b/src/test/singlenode_isolation2/output/resgroup/disable_resgroup.source new file mode 100644 index 00000000000..36467bc37d9 --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/disable_resgroup.source @@ -0,0 +1,40 @@ +-- for all removed resgroups the cgroup dirs should also be removed +! ls -d @cgroup_mnt_point@/cpu/gpdb/*/; +@cgroup_mnt_point@/cpu/gpdb/6437/ +@cgroup_mnt_point@/cpu/gpdb/6438/ + +! ls -d @cgroup_mnt_point@/cpuacct/gpdb/*/; +@cgroup_mnt_point@/cpuacct/gpdb/6437/ +@cgroup_mnt_point@/cpuacct/gpdb/6438/ + + +-- reset the GUC and restart cluster. +-- start_ignore +! gpconfig -r gp_resource_manager; + +! gpstop -rai; +-- end_ignore + +SHOW gp_resource_manager; + gp_resource_manager +--------------------- + queue +(1 row) + +-- reset settings +ALTER RESOURCE GROUP admin_group SET concurrency 10; +ALTER +ALTER RESOURCE GROUP admin_group SET memory_spill_ratio 0; +ALTER +ALTER RESOURCE GROUP admin_group SET memory_limit 10; +ALTER +ALTER RESOURCE GROUP admin_group SET memory_shared_quota 80; +ALTER +ALTER RESOURCE GROUP default_group SET concurrency 20; +ALTER +ALTER RESOURCE GROUP default_group SET memory_spill_ratio 0; +ALTER +ALTER RESOURCE GROUP default_group SET memory_limit 0; +ALTER +ALTER RESOURCE GROUP default_group SET memory_shared_quota 80; +ALTER diff --git a/src/test/singlenode_isolation2/output/resgroup/enable_resgroup.source b/src/test/singlenode_isolation2/output/resgroup/enable_resgroup.source new file mode 100644 index 00000000000..6811af1ef51 --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/enable_resgroup.source @@ -0,0 +1,99 @@ +-- start_ignore +CREATE LANGUAGE plpython3u; +CREATE + +! rmdir @cgroup_mnt_point@/cpu/gpdb; + +! rmdir @cgroup_mnt_point@/cpuacct/gpdb; + +! rmdir @cgroup_mnt_point@/cpuset/gpdb; + +! mkdir @cgroup_mnt_point@/cpu/gpdb; + +! mkdir @cgroup_mnt_point@/cpuacct/gpdb; + +! mkdir @cgroup_mnt_point@/cpuset/gpdb; + +-- end_ignore + +-- we want to simulate a 3-segment (both master and primary) cluster with 2GB +-- memory and gp_resource_group_memory_limit=100%, suppose: +-- +-- - total: the total memory on the system; +-- - nsegs: the max per-host segment count (including both master and primaries); +-- - limit: the gp_resource_group_memory_limit used for the simulation; +-- +-- then we have: total * limit / nsegs = 2GB * 1.0 / 3 +-- so: limit = 2GB * 1.0 / 3 * nsegs / total +-- +-- with the simulation each primary segment should manage 682MB memory. +DO LANGUAGE plpython3u $$ import os import psutil +mem = psutil.virtual_memory().total swap = psutil.swap_memory().total overcommit = int(open('/proc/sys/vm/overcommit_ratio').readline()) total = swap + mem * overcommit / 100. +nsegs = int(plpy.execute(''' SELECT count(hostname) as nsegs FROM gp_segment_configuration WHERE preferred_role = 'p' GROUP BY hostname ORDER BY count(hostname) DESC LIMIT 1 ''')[0]['nsegs']) +limit = (2 << 30) * 1.0 * nsegs / 3 / total os.system('gpconfig -c gp_resource_group_memory_limit -v {:f}'.format(limit)) $$; +DO + +-- enable resource group and restart cluster. +-- start_ignore +! gpconfig -c gp_resource_manager -v group; +20170502:01:28:13:000367 gpconfig:sdw6:gpadmin-[INFO]:-completed successfully + +! gpconfig -c gp_resource_group_cpu_limit -v 0.9; +20170731:09:42:33:021079 gpconfig:sdw8:nyu-[INFO]:-completed successfully + +! gpconfig -c max_connections -v 250 -m 25; +20170731:09:42:34:021163 gpconfig:sdw8:nyu-[INFO]:-completed successfully + +! gpstop -rai; +-- end_ignore + +-- after the restart we need a new connection to run the queries + +0: SHOW gp_resource_manager; + gp_resource_manager +--------------------- + group +(1 row) + +-- resource queue statistics should not crash +0: SELECT * FROM pg_resqueue_status; + rsqname | rsqcountlimit | rsqcountvalue | rsqcostlimit | rsqcostvalue | rsqwaiters | rsqholders +---------+---------------+---------------+--------------+--------------+------------+------------ +(0 rows) +0: SELECT * FROM gp_toolkit.gp_resqueue_status; + queueid | rsqname | rsqcountlimit | rsqcountvalue | rsqcostlimit | rsqcostvalue | rsqmemorylimit | rsqmemoryvalue | rsqwaiters | rsqholders +---------+---------+---------------+---------------+--------------+--------------+----------------+----------------+------------+------------ +(0 rows) +0: SELECT * FROM gp_toolkit.gp_resq_priority_backend; + rqpsession | rqpcommand | rqppriority | rqpweight +------------+------------+-------------+----------- +(0 rows) + +-- verify the default settings +0: SELECT * from gp_toolkit.gp_resgroup_config; + groupid | groupname | concurrency | cpu_rate_limit | memory_limit | memory_shared_quota | memory_spill_ratio | memory_auditor | cpuset +---------+---------------+-------------+----------------+--------------+---------------------+--------------------+----------------+-------- + 6437 | default_group | 20 | 30 | 0 | 80 | 0 | vmtracker | -1 + 6438 | admin_group | 10 | 10 | 10 | 80 | 0 | vmtracker | -1 +(2 rows) + +-- by default admin_group has concurrency set to -1 which leads to +-- very small memory quota for each resgroup slot, correct it. +0: ALTER RESOURCE GROUP admin_group SET concurrency 2; +ALTER + +-- explicitly set memory settings +0: ALTER RESOURCE GROUP admin_group SET memory_limit 10; +ALTER +0: ALTER RESOURCE GROUP default_group SET memory_limit 30; +ALTER +0: ALTER RESOURCE GROUP admin_group SET memory_shared_quota 80; +ALTER +0: ALTER RESOURCE GROUP default_group SET memory_shared_quota 80; +ALTER +-- in later cases we will SHOW memory_spill_ratio as first command +-- to verify that it can be correctly loaded even for bypassed commands +0: ALTER RESOURCE GROUP admin_group SET memory_spill_ratio 10; +ALTER +0: ALTER RESOURCE GROUP default_group SET memory_spill_ratio 10; +ALTER diff --git a/src/test/singlenode_isolation2/output/resgroup/enable_resgroup_validate.source b/src/test/singlenode_isolation2/output/resgroup/enable_resgroup_validate.source new file mode 100644 index 00000000000..68ff0f17d5d --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/enable_resgroup_validate.source @@ -0,0 +1,69 @@ +-- start_ignore +! chmod 755 @cgroup_mnt_point@/cpu/gpdb/*/; + +! chmod 755 @cgroup_mnt_point@/cpuacct/gpdb/*/; + +! chmod 755 @cgroup_mnt_point@/cpuset/gpdb/*/; + +! rmdir @cgroup_mnt_point@/cpu/gpdb/*/; + +! rmdir @cgroup_mnt_point@/cpuacct/gpdb/*/; + +! rmdir @cgroup_mnt_point@/cpuset/gpdb/*/; + +! rmdir @cgroup_mnt_point@/cpu/gpdb; + +! rmdir @cgroup_mnt_point@/cpuacct/gpdb; + +! rmdir @cgroup_mnt_point@/cpuset/gpdb; + +-- end_ignore + +-- gpdb top group is not created +! gpconfig -c gp_resource_manager -v group; +20170517:11:54:18:011348 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '@cgroup_mnt_point@/cpu/gpdb/' does not exist] +new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '@cgroup_mnt_point@/cpu/gpdb/' does not exist] + + +-- start_ignore +! mkdir @cgroup_mnt_point@/cpu/gpdb; + +! mkdir @cgroup_mnt_point@/cpuacct/gpdb; + +! mkdir @cgroup_mnt_point@/cpuset/gpdb; + +! chmod 644 @cgroup_mnt_point@/cpu/gpdb; + +! chmod 644 @cgroup_mnt_point@/cpuset/gpdb; + +-- end_ignore + +-- gpdb directory should have rwx permission +! gpconfig -c gp_resource_manager -v group; +20170517:11:54:18:011409 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '@cgroup_mnt_point@/cpu/gpdb/' permission denied: require permission 'rwx'] +new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '@cgroup_mnt_point@/cpu/gpdb/' permission denied: require permission 'rwx'] + + +-- start_ignore +! chmod 755 @cgroup_mnt_point@/cpu/gpdb; + +! chmod 755 @cgroup_mnt_point@/cpuset/gpdb; + +! chmod 444 @cgroup_mnt_point@/cpu/gpdb/cgroup.procs; + +! chmod 444 @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_quota_us; + +! chmod 244 @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_period_us; + +! chmod 244 @cgroup_mnt_point@/cpuacct/gpdb/cpuacct.usage; + +-- end_ignore + +-- cgroup.procs should have writepermission +-- cpu.cfs_quota_us should have write permission +-- cpu.cfs_period_us should have read permission +-- cpuacct.usage should have read permission +! gpconfig -c gp_resource_manager -v group; +20170517:11:54:18:011466 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: file '@cgroup_mnt_point@/cpu/gpdb/cgroup.procs' permission denied: require permission 'rw'] +new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: file '@cgroup_mnt_point@/cpu/gpdb/cgroup.procs' permission denied: require permission 'rw'] + diff --git a/src/test/singlenode_isolation2/output/resgroup/resgroup_alter_memory.source b/src/test/singlenode_isolation2/output/resgroup/resgroup_alter_memory.source new file mode 100644 index 00000000000..2a84c970a5a --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/resgroup_alter_memory.source @@ -0,0 +1,942 @@ +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP ROLE IF EXISTS role2_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +DROP RESOURCE GROUP rg2_memory_test; +ERROR: resource group "rg2_memory_test" does not exist +-- end_ignore + +CREATE OR REPLACE FUNCTION resGroupPalloc(float) RETURNS int AS '@abs_builddir@/../regress/regress@DLSUFFIX@', 'resGroupPalloc' LANGUAGE C READS SQL DATA; +CREATE + +CREATE OR REPLACE FUNCTION hold_memory_by_percent(int, float) RETURNS int AS $$ SELECT * FROM resGroupPalloc($2) $$ LANGUAGE sql; +CREATE + +CREATE OR REPLACE FUNCTION hold_memory_by_percent_on_qe(int, float) RETURNS int AS $$ SELECT resGroupPalloc($2) FROM gp_dist_random('gp_id') $$ LANGUAGE sql; +CREATE + +-- 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 in ('rg1_memory_test', 'rg2_memory_test') AND query <> '' ORDER BY sess_id; +CREATE + +CREATE OR REPLACE VIEW rg_mem_status AS SELECT groupname, memory_limit, memory_shared_quota FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg1_memory_test' OR groupname='rg2_memory_test' ORDER BY groupid; +CREATE + +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=5); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE + +-- +-- 1.1) alter memory shared quota with low memory usage +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 60; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 50; +ALTER + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 60 | 50 +(1 row) + +1: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(1,0.1); + hold_memory_by_percent +------------------------ + 0 +(1 row) +-- proc 1 gets a quota of 60%*50%/2=15% +-- it has consumed 60%*10%=6% +-- the group has 60%*50%-15%=15% free quota and 60%*50%=30% free shared quota + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 20; +ALTER + +-- now the group has 60%*80%-15%=33% free quota and 60%*20%=12% free shared quota, +-- so memory_shared_quota shall be the new value. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 60 | 20 +(1 row) + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 70; +ALTER + +-- now the group has 60%*30%-15%=3% free quota and 60%*70%=42% free shared quota, +-- so memory_shared_quota shall be the new value. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 60 | 70 +(1 row) + +-- +-- 1.2) alter memory shared quota with high memory usage +-- + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 80; +ALTER + +-- now the group has 60%*20%-15%=-3% free quota and 60%*80%=48% free shared quota, +-- so memory_shared_quota shall be the old value. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 60 | 80 +(1 row) + +1q: ... + +-- +-- 1.3) alter memory shared quota up and down +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 40; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 60; +ALTER + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 40 | 60 +(1 row) + +1: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +-- proc1 has a quota of 40%*40%/2=8% +-- rg1 still have 8% free quota + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 4; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 70; +ALTER +-- rg1 should free some quota, 40%*40%/2*1-40%*30%/4*3=8%-9%=-1% +-- rg1 now have 40%*20%=8% free quota +-- each slot in rg1 requires 40%*30%/4=3% + +2: SET ROLE TO role1_memory_test; +SET +2: BEGIN; +BEGIN +3: SET ROLE TO role1_memory_test; +SET +3: BEGIN; +BEGIN +-- proc2&proc3 each requires a quota of 40%*30%/4=3% +-- rg1 now has 8%-3%*2=2% free quota + +4: SET ROLE TO role1_memory_test; +SET +4&: BEGIN; +-- proc4 shall be pending + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 40 | 70 +(1 row) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | ResourceGroup | active | BEGIN; +(4 rows) + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 40; +ALTER +-- rg1 now have 40%*60%-8%-3%*2=10% free quota again +-- and now proc4 requires a quota of 40%*60%/4=6%, +-- so it shall be waken up + +4<: <... completed> +BEGIN +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 40 | 40 +(1 row) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; +(4 rows) + +1q: ... +2q: ... +3q: ... +4q: ... + +-- +-- 2.1) alter memory limit with low memory usage (and low memory shared usage) +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 50; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 60; +ALTER + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 50 | 60 +(1 row) + +1: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(1,0.1); + hold_memory_by_percent +------------------------ + 0 +(1 row) +-- proc 1 gets a quota of 50%*40%/2=10% +-- it has consumed 50%*10%=5% +-- the group has 50%*40%-10%=10% free quota and 50%*60%=30% free shared quota + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 60; +ALTER + +-- now the group has 60%*40%-10%=14% free quota and 60%*60%=36% free shared quota, +-- so memory_limit can be the new value, however at the moment we don't update +-- value when increasing memory_limit, so it's still the old value. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 60 | 60 +(1 row) + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 40; +ALTER + +-- now the group has 40%*40%-10%=6% free quota and 40%*60%=24% free shared quota, +-- so memory_limit shall be the new value. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 40 | 60 +(1 row) + +-- +-- 2.2) alter memory limit with high memory usage and low memory shared usage +-- + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 10; +ALTER + +-- now the group has 10%*40%-10%=-6% free quota and 10%*60%=6% free shared quota, +-- so memory_limit shall be the old value. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 10 | 60 +(1 row) + +-- +-- 2.3) alter memory limit with high memory usage and high memory shared usage +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 40; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 60; +ALTER + +-- now the group has 40%*40%-10%=6% free quota and 40%*60%=24% free shared quota, +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 40 | 60 +(1 row) + +1: SELECT hold_memory_by_percent(1,0.5); + hold_memory_by_percent +------------------------ + 0 +(1 row) +-- proc 1 has consumed another 50%*50%=25%, in total 30% +-- now it has consumed all its 10% quota, as well as 20% shared quota +-- now the group has 40%*40%-10%=6% free quota and 40%*60%-20%=4% free shared quota, + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 20; +ALTER + +-- now the group has 40%*80%-10%=22% free quota and 40%*20%-20%=-12% free shared quota, +-- so memory_shared_quota shall be the old value. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 40 | 20 +(1 row) + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER + +-- now the group has 30%*80%-10%=14% free quota and 30%*20%-20%=-14% free shared quota, +-- so memory_limit shall be the old value. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 30 | 20 +(1 row) + +1q: ... + +-- +-- 3.1) decrease one group and increase another, no load +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 3; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 0; +ALTER + +CREATE RESOURCE GROUP rg2_memory_test WITH (concurrency=3, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=5); +CREATE +CREATE ROLE role2_memory_test RESOURCE GROUP rg2_memory_test; +CREATE + +-- default_group and admin_group consumed 40% memory_limit, +-- so with rg1+rg2=60% all memory_limit is already allocated, +-- so increasing any of them shall fail. +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 31; +ERROR: total memory_limit exceeded the limit of 100 + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 30 | 0 + rg2_memory_test | 30 | 0 +(2 rows) + +-- but increase could succeed if another rg is first decreased. +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 20; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 40; +ALTER + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 40 | 0 + rg2_memory_test | 20 | 0 +(2 rows) + +-- +-- 3.2) decrease one group and increase another, with load, no pending +-- + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 3; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 0; +ALTER + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_SHARED_QUOTA 0; +ALTER + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 30 | 0 + rg2_memory_test | 30 | 0 +(2 rows) + +11: SET ROLE TO role1_memory_test; +SET +11: BEGIN; +BEGIN +-- proc11 gets a quota of 30%/3=10% from rg1 + +12: SET ROLE TO role1_memory_test; +SET +12: BEGIN; +BEGIN +-- proc12 gets a quota of 30%/3=10% from rg1 + +13: SET ROLE TO role1_memory_test; +SET +13: BEGIN; +BEGIN +-- proc13 gets a quota of 30%/3=10% from rg1 + +-- although all the memory quota is in use, +-- it's still allowed to decrease memory_limit, +-- in such a case rg2 won't get the new quota until any query in rg1 ends. +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 15; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 40; +ALTER +-- now both rg1 and rg2 still have 30% quota + +21: SET ROLE TO role2_memory_test; +SET +21: BEGIN; +BEGIN +-- proc21 gets a quota of 40%/2=20% from rg2 + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 15 | 0 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; +(4 rows) + +11q: ... +-- proc11 ends, 10%-5%=5% quota is returned to sys + +12q: ... +-- proc12 ends, 10%-5%=5% quota is returned to sys + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 15 | 0 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; +(2 rows) + +-- now rg2 shall be able to get 10% free quota from sys +22: SET ROLE TO role2_memory_test; +SET +22: BEGIN; +BEGIN +-- proc22 gets a quota of 40%/2=20% from rg2 + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 15 | 0 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; +(3 rows) + +13q: ... +21q: ... +22q: ... + +-- +-- 3.3) decrease one group and increase another, with load, with pending, +-- memory_shared_quota is 0, +-- waken up by released quota memory from other group +-- + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_SHARED_QUOTA 0; +ALTER + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 3; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 0; +ALTER + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 30 | 0 + rg2_memory_test | 30 | 0 +(2 rows) + +11: SET ROLE TO role1_memory_test; +SET +11: BEGIN; +BEGIN +-- proc11 gets a quota of 30%/3=10% from rg1 + +12: SET ROLE TO role1_memory_test; +SET +12: BEGIN; +BEGIN +-- proc12 gets a quota of 30%/3=10% from rg1 + +13: SET ROLE TO role1_memory_test; +SET +13: BEGIN; +BEGIN +-- proc13 gets a quota of 30%/3=10% from rg1 + +-- although all the memory quota is in use, +-- it's still allowed to decrease memory_limit, +-- in such a case rg2 won't get the new quota until any query in rg1 ends. +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 15; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 40; +ALTER +-- now both rg1 and rg2 still have 30% quota + +21: SET ROLE TO role2_memory_test; +SET +21: BEGIN; +BEGIN + +22: SET ROLE TO role2_memory_test; +SET +22&: BEGIN; + +-- proc21 gets a quota of 40%/2=20% from rg2 +-- proc22 requires a quota of 40%/2=20% from rg2, +-- but as rg2 only has 30%-20%=10% free quota now, +-- it shall be pending. +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 15 | 0 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | ResourceGroup | active | BEGIN; +(5 rows) + +11: END; +END +11q: ... +-- proc11 ends, 10%-5%=5% quota is returned to sys + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 15 | 0 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg1_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | ResourceGroup | active | BEGIN; +(4 rows) + +12: END; +END +12q: ... +-- proc12 ends, 10%-5%=5% quota is returned to sys + +-- now rg2 can get 10% free quota from sys +-- so proc22 can get enough quota and get executed +22<: <... completed> +BEGIN +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 15 | 0 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; +(3 rows) + +13q: ... +21q: ... +22q: ... + +-- +-- 3.4) decrease one group and increase another, with load, with pending, +-- memory_shared_quota > 0 and can be freed, +-- waken up by released shared quota memory from other group +-- + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_SHARED_QUOTA 0; +ALTER + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 1; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 60; +ALTER + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 30 | 60 + rg2_memory_test | 30 | 0 +(2 rows) + +11: SET ROLE TO role1_memory_test; +SET +11: BEGIN; +BEGIN +-- proc11 gets a quota of 30%*40%=12% from rg1 +-- rg1 also has a shared quota of 30%*60%=18% + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 20; +ALTER +-- now each slot in rg1 requires a quota of 20%*40%=8% +-- rg1 has 0% free quota and 20%*60%=12% free shared quota +-- rg1 should release some shared quota, 30%*60%-20%*60%=6% + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 4; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 40; +ALTER +-- now rg2 has a quota of 30%+6%=36% +-- now each slot in rg2 requires a quota of 40%/4=10% + +21: SET ROLE TO role2_memory_test; +SET +21: BEGIN; +BEGIN +22: SET ROLE TO role2_memory_test; +SET +22: BEGIN; +BEGIN +23: SET ROLE TO role2_memory_test; +SET +23: BEGIN; +BEGIN +-- proc21~proc23 each gets a quota of 40%/4=10% +-- rg2 still has 36%-10%*3=6% free quota + +24: SET ROLE TO role2_memory_test; +SET +24&: BEGIN; +-- proc24 shall be pending. + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 20 | 60 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | ResourceGroup | active | BEGIN; +(5 rows) + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 30; +ALTER +-- now rg1 should release some shared quota, 20%*60%-20%*30%=6% +-- now rg2 can get at most 6% new quota, but as it already has 36%, +-- so rg2 actually gets 4% new quota. +-- now rg2 has 40% quota, the free quota is 40%-30%=10%, +-- just enough for proc24 to wake up. + +24<: <... completed> +BEGIN +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 20 | 30 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg1_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; +(5 rows) + +11q: ... +21q: ... +22q: ... +23q: ... +24q: ... + +-- +-- 3.5) decrease one group and increase another, with load, with pending +-- memory_shared_quota > 0 and can not be freed, +-- waken up by released quota memory from other group +-- + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 2; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_SHARED_QUOTA 0; +ALTER + +ALTER RESOURCE GROUP rg1_memory_test SET CONCURRENCY 10; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 30; +ALTER +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 90; +ALTER + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 30 | 90 + rg2_memory_test | 30 | 0 +(2 rows) + +11: SET ROLE TO role1_memory_test; +SET +11: BEGIN; +BEGIN +11: SELECT hold_memory_by_percent(1,0.90); + hold_memory_by_percent +------------------------ + 0 +(1 row) +-- proc11 gets a quota of 30%*10%/10=0.3% from rg1 +-- rg1 has a free quota of 30%*10%-0.3%=2.7% +-- rg1 has a shared quota of 30%*90%=27%, +-- free shared quota is 27%-(30%*90%-0.3%)=0.3% + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 20; +ALTER +-- now each slot in rg1 requires a quota of 20%*10%/10=0.2% +-- rg1 releases some quota, 0.1%*9=0.9%, +-- so new quota is 2.1%, new free quota is 2.1%-0.3%=1.8% +-- rg1 releases some shared quota, 27%-max(20%*90%,26.7%)=0.3%, +-- so new shared quota is 26.7%, new free shared quota is 0% + +ALTER RESOURCE GROUP rg2_memory_test SET CONCURRENCY 4; +ALTER +ALTER RESOURCE GROUP rg2_memory_test SET MEMORY_LIMIT 40; +ALTER +-- now rg2 has a quota of 30%+1.2%=31.2% +-- now each slot in rg2 requires a quota of 40%/4=10% + +21: SET ROLE TO role2_memory_test; +SET +21: BEGIN; +BEGIN +22: SET ROLE TO role2_memory_test; +SET +22: BEGIN; +BEGIN +23: SET ROLE TO role2_memory_test; +SET +23: BEGIN; +BEGIN +-- proc21~proc23 each gets a quota of 40%/4=10% +-- rg2 still has 31.2%-10%*3=1.2% free quota + +24: SET ROLE TO role2_memory_test; +SET +24&: BEGIN; +-- proc24 shall be pending. + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 20 | 90 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+---------------------------------------- + rg1_memory_test | Client | idle in transaction | SELECT hold_memory_by_percent(1,0.90); + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | ResourceGroup | active | BEGIN; +(5 rows) + +ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SHARED_QUOTA 30; +ALTER +-- rg1 can't free any shared quota as all of them are in use by proc11 + +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 20 | 30 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+---------------------------------------- + rg1_memory_test | Client | idle in transaction | SELECT hold_memory_by_percent(1,0.90); + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | ResourceGroup | active | BEGIN; +(5 rows) + +11q: ... +-- rg1 releases 0.3%-0.2%=0.1% quota and 26.7%-18%=8.7% +-- so rg2 gets 8.8% new quota +-- now rg2 has 40% quota, free quota is 10% +-- so proc24 shall be waken up + +24<: <... completed> +BEGIN +SELECT * FROM rg_mem_status; + groupname | memory_limit | memory_shared_quota +-----------------+--------------+--------------------- + rg1_memory_test | 20 | 30 + rg2_memory_test | 40 | 0 +(2 rows) +SELECT * FROM rg_activity_status; + rsgname | wait_event_type | state | query +-----------------+-----------------+---------------------+-------- + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; + rg2_memory_test | Client | idle in transaction | BEGIN; +(4 rows) + +21q: ... +22q: ... +23q: ... +24q: ... + +-- cleanup +DROP VIEW rg_mem_status; +DROP +DROP ROLE role1_memory_test; +DROP +DROP ROLE role2_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +DROP RESOURCE GROUP rg2_memory_test; +DROP + +-- +-- Test PrepareTransaction report an error +-- +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +CREATE +CREATE ROLE rg_test_role RESOURCE GROUP rg_test_group; +CREATE + +SET debug_dtm_action = "fail_begin_command"; +SET +SET debug_dtm_action_target = "protocol"; +SET +SET debug_dtm_action_protocol = "prepare"; +SET +SET debug_dtm_action_segment = 0; +SET + +-- ALTER should fail and the memory_limit in both catalog and share memory are +-- still 5% +ALTER RESOURCE GROUP rg_test_group set memory_limit 1; +ERROR: Raise ERROR for debug_dtm_action = 2, debug_dtm_action_protocol = Distributed Prepare + +RESET debug_dtm_action; +RESET +RESET debug_dtm_action_target; +RESET +RESET debug_dtm_action_protocol; +RESET +RESET debug_dtm_action_segment; +RESET + +-- should still be 5% on both QD and QE +select memory_limit from gp_toolkit.gp_resgroup_config where groupname = 'rg_test_group'; + memory_limit +-------------- + 5 +(1 row) + +-- +-- Test error happen on commit_prepare, DDL success after retry +-- +SET debug_dtm_action = "fail_begin_command"; +SET +SET debug_dtm_action_target = "protocol"; +SET +SET debug_dtm_action_protocol = "commit_prepared"; +SET +SET debug_dtm_action_segment = 0; +SET + +-- ALTER should success +ALTER RESOURCE GROUP rg_test_group set memory_limit 4; +ALTER + +RESET debug_dtm_action; +RESET +RESET debug_dtm_action_target; +RESET +RESET debug_dtm_action_protocol; +RESET +RESET debug_dtm_action_segment; +RESET + +-- should still be 4% on both QD and QE +select memory_limit from gp_toolkit.gp_resgroup_config where groupname = 'rg_test_group'; + memory_limit +-------------- + 4 +(1 row) + +DROP ROLE rg_test_role; +DROP +DROP RESOURCE GROUP rg_test_group; +DROP diff --git a/src/test/singlenode_isolation2/output/resgroup/resgroup_bypass.source b/src/test/singlenode_isolation2/output/resgroup/resgroup_bypass.source new file mode 100644 index 00000000000..c73d4abb3fc --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/resgroup_bypass.source @@ -0,0 +1,389 @@ +DROP ROLE IF EXISTS role_bypass_test; +DROP +-- start_ignore +DROP RESOURCE GROUP rg_bypass_test; +DROP +-- end_ignore + +-- +-- setup +-- + +CREATE RESOURCE GROUP rg_bypass_test WITH (concurrency=2, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50); +CREATE +CREATE ROLE role_bypass_test RESOURCE GROUP rg_bypass_test; +CREATE + +CREATE OR REPLACE FUNCTION repeatPalloc(int, int) RETURNS int AS '@abs_builddir@/../regress/regress@DLSUFFIX@', 'repeatPalloc' LANGUAGE C READS SQL DATA; +CREATE + +CREATE OR REPLACE FUNCTION hold_memory(int, int) RETURNS int AS $$ SELECT * FROM repeatPalloc(1, $2) $$ LANGUAGE sql; +CREATE + +CREATE OR REPLACE VIEW eat_memory_on_qd_small AS SELECT hold_memory(0,12); +CREATE + +CREATE OR REPLACE VIEW eat_memory_on_qd_large AS SELECT hold_memory(0,100); +CREATE + +CREATE OR REPLACE VIEW eat_memory_on_one_slice AS SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory(t1.dbid,4)=0 ; +CREATE + +CREATE OR REPLACE VIEW eat_memory_on_slices AS SELECT count(null) FROM gp_dist_random('gp_id') t1, gp_dist_random('gp_id') t2 WHERE hold_memory(t1.dbid,4)=0 AND hold_memory(t2.dbid,4)=0 ; +CREATE + +CREATE OR REPLACE FUNCTION round_test(float, integer) RETURNS float AS $$ SELECT round($1 / $2) * $2 $$ LANGUAGE sql; +CREATE + +CREATE OR REPLACE VIEW memory_result AS SELECT rsgname, ismaster, round_test(avg(memory_usage), 1) AS avg_mem FROM( SELECT rsgname, CASE (j->'key')::text WHEN '"-1"'::text THEN 1 ELSE 0 END AS ismaster, ((j->'value')->>'used')::int AS memory_usage FROM( SELECT rsgname, row_to_json(json_each(memory_usage::json)) AS j FROM gp_toolkit.gp_resgroup_status WHERE rsgname='rg_bypass_test' )a )b GROUP BY (rsgname, ismaster) ORDER BY rsgname, ismaster; +CREATE + +GRANT ALL ON eat_memory_on_qd_small TO role_bypass_test; +GRANT +GRANT ALL ON eat_memory_on_qd_large TO role_bypass_test; +GRANT +GRANT ALL ON eat_memory_on_one_slice TO role_bypass_test; +GRANT +GRANT ALL ON eat_memory_on_slices TO role_bypass_test; +GRANT +GRANT ALL ON memory_result TO role_bypass_test; +GRANT + +-- +-- SET command should be bypassed +-- + +ALTER RESOURCE GROUP rg_bypass_test SET concurrency 0; +ALTER +61: SET ROLE role_bypass_test; +SET +61&: SELECT 1; +ALTER RESOURCE GROUP rg_bypass_test set concurrency 1; +ALTER +61<: <... completed> + ?column? +---------- + 1 +(1 row) +ALTER RESOURCE GROUP rg_bypass_test set concurrency 0; +ALTER +61: SET enable_hashagg to on; +SET +61: SHOW enable_hashagg; + enable_hashagg +---------------- + on +(1 row) +61: invalid_syntax; +ERROR: syntax error at or near "invalid_syntax" +LINE 1: invalid_syntax; + ^ +61q: ... + +-- +-- gp_resource_group_bypass +-- + +ALTER RESOURCE GROUP rg_bypass_test SET concurrency 0; +ALTER +61: SET ROLE role_bypass_test; +SET +61: SET gp_resource_group_bypass to on; +SET +61: SHOW gp_resource_group_bypass; + gp_resource_group_bypass +-------------------------- + on +(1 row) +61: CREATE TABLE table_bypass_test (c1 int); +CREATE +61: INSERT INTO table_bypass_test SELECT generate_series(1,100); +INSERT 100 +61: SELECT count(*) FROM table_bypass_test; + count +------- + 100 +(1 row) +61: DROP TABLE table_bypass_test; +DROP +61: SET gp_resource_group_bypass to off; +SET +61: SHOW gp_resource_group_bypass; + gp_resource_group_bypass +-------------------------- + off +(1 row) +61q: ... + +-- +-- gp_resource_group_bypass is not allowed inside a transaction block +-- + +61: BEGIN; +BEGIN +61: SET gp_resource_group_bypass to on; +ERROR: SET gp_resource_group_bypass cannot run inside a transaction block +61: ABORT; +ABORT +61q: ... + +-- +-- gp_resource_group_bypass is not allowed inside a function +-- + +DROP FUNCTION IF EXISTS func_resgroup_bypass_test(int); +DROP +CREATE FUNCTION func_resgroup_bypass_test(c1 int) RETURNS INT AS $$ SET gp_resource_group_bypass TO ON; /* inside a function */ SELECT 1 $$ LANGUAGE SQL; +CREATE +SELECT func_resgroup_bypass_test(1); +ERROR: SET gp_resource_group_bypass cannot run inside a transaction block +CONTEXT: SQL function "func_resgroup_bypass_test" statement 1 +DROP FUNCTION func_resgroup_bypass_test(int); +DROP + + +-- +-- memory limit in bypass mode, on qd +-- +-- orca will allocate 10M memory error buffer before optimization, and release +-- it after that, so if optimizer is set to on, it will fail when the memory +-- usage reaches 24M +-- +-- GPDB_12_MERGE_FIXME: when this case running under orca and without cassert +-- it will output different result from the case with cassert. This might be +-- because of without cassert, it does use less memory. To make the case green +-- to unblock merging into master, add an extra ansfile for this case. We should +-- consider adding some error interface for these cases post-merge. + +61: SET ROLE role_bypass_test; +SET +61: SET gp_resource_group_bypass to on; +SET +61: BEGIN; +BEGIN +61: SELECT * FROM eat_memory_on_qd_small; + hold_memory +------------- + 0 +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 0 + rg_bypass_test | 1 | 12 +(2 rows) +61: SELECT * FROM eat_memory_on_qd_large; +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory" statement 1 +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 0 + rg_bypass_test | 1 | 0 +(2 rows) +61: ABORT; +ABORT +61: BEGIN; +BEGIN +SELECT 1 FROM memory_result where avg_mem > 10 and ismaster = 1; + ?column? +---------- + 1 +(1 row) +61q: ... + +-- +-- memory limit in bypass mode, on one slice +-- + +61: SET ROLE role_bypass_test; +SET +61: SET gp_resource_group_bypass to on; +SET +61: BEGIN; +BEGIN +61: SELECT * FROM eat_memory_on_one_slice; + count +------- + 0 +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 4 + rg_bypass_test | 1 | 0 +(2 rows) +61: SELECT * FROM eat_memory_on_one_slice; + count +------- + 0 +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 8 + rg_bypass_test | 1 | 0 +(2 rows) +61: SELECT * FROM eat_memory_on_one_slice; +ERROR: Out of memory (seg0 slice1 127.0.0.1:25432 pid=336) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory" statement 1 +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 0 + rg_bypass_test | 1 | 0 +(2 rows) +61: ABORT; +ABORT +61: BEGIN; +BEGIN +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 0 + rg_bypass_test | 1 | 0 +(2 rows) +61q: ... + +-- +-- memory limit in bypass mode, on slices +-- + +61: SET ROLE role_bypass_test; +SET +61: SET gp_resource_group_bypass to on; +SET +61: BEGIN; +BEGIN +61: SELECT * FROM eat_memory_on_slices; + count +------- + 0 +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 4 + rg_bypass_test | 1 | 0 +(2 rows) +61: SELECT * FROM eat_memory_on_slices; + count +------- + 0 +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 8 + rg_bypass_test | 1 | 0 +(2 rows) +61: SELECT * FROM eat_memory_on_slices; +ERROR: Out of memory (seg0 slice2 127.0.0.1:25432 pid=354) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory" statement 1 +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 0 + rg_bypass_test | 1 | 0 +(2 rows) +61: ABORT; +ABORT +61: BEGIN; +BEGIN +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +----------------+----------+--------- + rg_bypass_test | 0 | 0 + rg_bypass_test | 1 | 0 +(2 rows) +61q: ... + +-- +-- gp_resgroup_status.num_running is updated in bypass mode +-- + +61: SET ROLE role_bypass_test; +SET +61: SET gp_resource_group_bypass to on; +SET +61&: SELECT pg_sleep(10); +62: SET ROLE role_bypass_test; +SET +62: SET gp_resource_group_bypass to on; +SET +62&: SELECT pg_sleep(20); +SELECT num_running FROM gp_toolkit.gp_resgroup_status WHERE rsgname='rg_bypass_test'; + num_running +------------- + 2 +(1 row) +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE rsgname='rg_bypass_test'; + pg_cancel_backend +------------------- + t + t +(2 rows) +61<: <... completed> +ERROR: canceling statement due to user request +62<: <... completed> +ERROR: canceling statement due to user request +61q: ... +62q: ... + +-- +-- pg_stat_activity is updated in bypass mode +-- + +61: SET ROLE role_bypass_test; +SET +61: SET gp_resource_group_bypass to on; +SET +61&: SELECT pg_sleep(10); +62: SET ROLE role_bypass_test; +SET +62: SET gp_resource_group_bypass to on; +SET +62&: SELECT pg_sleep(20); +SELECT query FROM pg_stat_activity WHERE rsgname='rg_bypass_test'; + query +---------------------- + SELECT pg_sleep(10); + SELECT pg_sleep(20); +(2 rows) +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE rsgname='rg_bypass_test'; + pg_cancel_backend +------------------- + t + t +(2 rows) +61<: <... completed> +ERROR: canceling statement due to user request +62<: <... completed> +ERROR: canceling statement due to user request +61q: ... +62q: ... + +-- +-- cleanup +-- + +REVOKE ALL ON eat_memory_on_qd_small FROM role_bypass_test; +REVOKE +REVOKE ALL ON eat_memory_on_qd_large FROM role_bypass_test; +REVOKE +REVOKE ALL ON eat_memory_on_one_slice FROM role_bypass_test; +REVOKE +REVOKE ALL ON eat_memory_on_slices FROM role_bypass_test; +REVOKE +REVOKE ALL ON memory_result FROM role_bypass_test; +REVOKE + +DROP ROLE role_bypass_test; +DROP +DROP RESOURCE GROUP rg_bypass_test; +DROP + +-- vi:filetype=sql: diff --git a/src/test/singlenode_isolation2/output/resgroup/resgroup_cpu_rate_limit.source b/src/test/singlenode_isolation2/output/resgroup/resgroup_cpu_rate_limit.source new file mode 100644 index 00000000000..baa5e382e8f --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/resgroup_cpu_rate_limit.source @@ -0,0 +1,954 @@ +-- start_ignore +DROP VIEW IF EXISTS cancel_all; +DROP +DROP ROLE IF EXISTS role1_cpu_test; +DROP +DROP ROLE IF EXISTS role2_cpu_test; +DROP +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 +-- end_ignore + +-- +-- helper functions, tables and views +-- + +DROP TABLE IF EXISTS cpu_usage_samples; +DROP +CREATE TABLE cpu_usage_samples (sample text); +CREATE + +-- 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 rsgname, cpu_usage FROM gp_toolkit.gp_resgroup_status ''') json_text = json.dumps(dict([(row['rsgname'], json.loads(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 + +-- 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. +-- return true if the practical value is close to the expected value. +CREATE OR REPLACE FUNCTION verify_cpu_usage(groupname TEXT, expect_cpu_usage INT, err_rate INT) RETURNS BOOL AS $$ import json import functools +def add_vector(vec1, vec2): r = dict() for seg_id1, value1 in vec1.items(): r[seg_id1] = value1 + vec2[seg_id1] return r +def verify_cpu_usage(): all_info = plpy.execute(''' SELECT sample::json->'{name}' AS cpu FROM cpu_usage_samples '''.format(name=groupname)) usage_sum = functools.reduce(add_vector, [json.loads(row['cpu']) for row in all_info]) usage = [(float(v) / all_info.nrows()) for k, v in usage_sum.items() if k != "-1"] avg = sum(usage) / len(usage) return abs(avg - expect_cpu_usage) <= err_rate +return verify_cpu_usage() $$ LANGUAGE plpython3u; +CREATE + +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 VIEW cancel_all AS SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query LIKE 'SELECT * FROM % WHERE busy%'; +CREATE + +-- create two resource groups +CREATE RESOURCE GROUP rg1_cpu_test WITH (concurrency=5, cpu_rate_limit=10, memory_limit=20); +CREATE +CREATE RESOURCE GROUP rg2_cpu_test WITH (concurrency=5, cpu_rate_limit=20, memory_limit=20); +CREATE + +-- +-- check gpdb cgroup configuration +-- +DO LANGUAGE PLPYTHON3U $$ import subprocess +cgroot = '@cgroup_mnt_point@' +def get_cgroup_prop(prop): fullpath = cgroot + '/' + prop return int(open(fullpath).readline()) +def run_command(cmd): return subprocess.check_output(cmd.split()).decode() +def show_guc(guc): return plpy.execute('SHOW {}'.format(guc))[0][guc] +# # check gpdb top-level cgroup configuration # +# get top-level cgroup props cfs_quota_us = get_cgroup_prop('/cpu/gpdb/cpu.cfs_quota_us') cfs_period_us = get_cgroup_prop('/cpu/gpdb/cpu.cfs_period_us') shares = get_cgroup_prop('/cpu/gpdb/cpu.shares') +# get system props ncores = int(run_command('nproc')) +# get global gucs gp_resource_group_cpu_limit = float(show_guc('gp_resource_group_cpu_limit')) gp_resource_group_cpu_priority = int(show_guc('gp_resource_group_cpu_priority')) +# cfs_quota_us := cfs_period_us * ncores * gp_resource_group_cpu_limit assert cfs_quota_us == cfs_period_us * ncores * gp_resource_group_cpu_limit +# shares := 1024 * gp_resource_group_cpu_priority assert shares == 1024 * gp_resource_group_cpu_priority +# SUB/shares := TOP/shares * cpu_rate_limit def check_group_shares(name): cpu_rate_limit = int(plpy.execute(''' SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='{}' '''.format(name))[0]['value']) oid = int(plpy.execute(''' SELECT oid FROM pg_resgroup WHERE rsgname='{}' '''.format(name))[0]['oid']) sub_shares = get_cgroup_prop('/cpu/gpdb/{}/cpu.shares'.format(oid)) assert sub_shares == shares * cpu_rate_limit / 100 +# check default groups check_group_shares('default_group') check_group_shares('admin_group') +# check user groups check_group_shares('rg1_cpu_test') check_group_shares('rg2_cpu_test') $$; +DO + +-- lower admin_group's cpu_rate_limit to minimize its side effect +ALTER RESOURCE GROUP admin_group SET cpu_rate_limit 1; +ALTER + +-- create two roles and assign them to above groups +CREATE ROLE role1_cpu_test RESOURCE GROUP rg1_cpu_test; +CREATE +CREATE ROLE role2_cpu_test RESOURCE GROUP rg2_cpu_test; +CREATE +GRANT ALL ON FUNCTION busy() TO role1_cpu_test; +GRANT +GRANT ALL ON FUNCTION busy() TO role2_cpu_test; +GRANT + +-- prepare parallel queries in the two groups +10: SET ROLE TO role1_cpu_test; +SET +11: SET ROLE TO role1_cpu_test; +SET +12: SET ROLE TO role1_cpu_test; +SET +13: SET ROLE TO role1_cpu_test; +SET +14: SET ROLE TO role1_cpu_test; +SET + +20: SET ROLE TO role2_cpu_test; +SET +21: SET ROLE TO role2_cpu_test; +SET +22: SET ROLE TO role2_cpu_test; +SET +23: SET ROLE TO role2_cpu_test; +SET +24: SET ROLE TO role2_cpu_test; +SET + +-- +-- now we get prepared. +-- +-- on empty load the cpu usage shall be 0% +-- + +-- +-- a group should burst to use all the cpu usage +-- when it's the only one with running queries. +-- +-- however the overall cpu usage is controlled by a GUC +-- gp_resource_group_cpu_limit which is 90% by default. +-- +-- so the cpu usage shall be 90% +-- + +10&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +11&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +12&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +13&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +14&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +-- start_ignore +TRUNCATE TABLE cpu_usage_samples; +TRUNCATE +SELECT fetch_sample(); + fetch_sample +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 89.900000000000006, "0": 89.569999999999993, "2": 89.650000000000006, "-1": 90.480000000000004}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.01, "0": 0.01, "2": 0.01, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 90.109999999999999, "0": 90.209999999999994, "2": 90.090000000000003, "-1": 88.549999999999997}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.01, "0": 0.02, "2": 0.02, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 90.040000000000006, "0": 90.069999999999993, "2": 90.049999999999997, "-1": 87.859999999999999}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.02, "0": 0.02, "2": 0.01, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 90.030000000000001, "0": 90.260000000000005, "2": 90.140000000000001, "-1": 90.290000000000006}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.0, "0": 0.02, "2": 0.01, "-1": 0.080000000000000002}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 90.019999999999996, "0": 90.310000000000002, "2": 90.049999999999997, "-1": 90.700000000000003}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.02, "0": 0.02, "2": 0.02, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +TRUNCATE TABLE cpu_usage_samples; +TRUNCATE +SELECT fetch_sample(); + fetch_sample +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 90.129999999999995, "0": 90.159999999999997, "2": 90.120000000000005, "-1": 88.640000000000001}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.01, "0": 0.02, "2": 0.01, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 90.299999999999997, "0": 90.079999999999998, "2": 90.030000000000001, "-1": 90.730000000000004}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.02, "0": 0.02, "2": 0.01, "-1": 0.11}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 88.870000000000005, "0": 88.939999999999998, "2": 88.709999999999994, "-1": 89.810000000000002}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.01, "0": 0.029999999999999999, "2": 0.01, "-1": 0.089999999999999997}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"rg1_cpu_test": {"1": 90.049999999999997, "0": 90.129999999999995, "2": 90.049999999999997, "-1": 88.400000000000006}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.01, "0": 0.02, "2": 0.01, "-1": 0.080000000000000002}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 90.269999999999996, "0": 90.079999999999998, "2": 90.269999999999996, "-1": 87.700000000000003}, "rg2_cpu_test": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}, "admin_group": {"1": 0.029999999999999999, "0": 0.01, "2": 0.02, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +-- end_ignore + +SELECT verify_cpu_usage('rg1_cpu_test', 90, 10); + verify_cpu_usage +------------------ + t +(1 row) + +-- start_ignore +SELECT * FROM cancel_all; + pg_cancel_backend +------------------- + t + t + t + t + t +(5 rows) + +10<: <... completed> +ERROR: canceling statement due to user request +11<: <... completed> +ERROR: canceling statement due to user request +12<: <... completed> +ERROR: canceling statement due to user request +13<: <... completed> +ERROR: canceling statement due to user request +14<: <... completed> +ERROR: canceling statement due to user request +-- end_ignore + +10q: ... +11q: ... +12q: ... +13q: ... +14q: ... + +10: SET ROLE TO role1_cpu_test; +SET +11: SET ROLE TO role1_cpu_test; +SET +12: SET ROLE TO role1_cpu_test; +SET +13: SET ROLE TO role1_cpu_test; +SET +14: SET ROLE TO role1_cpu_test; +SET + +-- +-- when there are multiple groups with parallel queries, +-- they should share the cpu usage by their cpu_usage settings, +-- +-- rg1_cpu_test:rg2_cpu_test is 0.1:0.2 => 1:2, so: +-- +-- - rg1_cpu_test gets 90% * 1/3 => 30%; +-- - rg2_cpu_test gets 90% * 2/3 => 60%; +-- + +10&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +11&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +12&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +13&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +14&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +20&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +21&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +22&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +23&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +24&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +-- start_ignore +TRUNCATE TABLE cpu_usage_samples; +TRUNCATE +SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 30.23, "0": 30.09, "2": 29.989999999999998, "-1": 29.57}, "rg2_cpu_test": {"1": 59.609999999999999, "0": 59.859999999999999, "2": 59.810000000000002, "-1": 58.880000000000003}, "admin_group": {"1": 0.02, "0": 0.029999999999999999, "2": 0.02, "-1": 0.080000000000000002}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 30.32, "0": 30.25, "2": 30.239999999999998, "-1": 29.260000000000002}, "rg2_cpu_test": {"1": 59.93, "0": 59.909999999999997, "2": 59.950000000000003, "-1": 58.520000000000003}, "admin_group": {"1": 0.01, "0": 0.02, "2": 0.02, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"rg1_cpu_test": {"1": 31.75, "0": 31.66, "2": 31.699999999999999, "-1": 30.84}, "rg2_cpu_test": {"1": 58.630000000000003, "0": 58.640000000000001, "2": 58.579999999999998, "-1": 57.439999999999998}, "admin_group": {"1": 0.02, "0": 0.029999999999999999, "2": 0.01, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 30.190000000000001, "0": 30.109999999999999, "2": 30.09, "-1": 30.039999999999999}, "rg2_cpu_test": {"1": 59.899999999999999, "0": 60.119999999999997, "2": 59.920000000000002, "-1": 60.520000000000003}, "admin_group": {"1": 0.02, "0": 0.02, "2": 0.01, "-1": 0.11}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 29.23, "0": 29.239999999999998, "2": 29.260000000000002, "-1": 29.219999999999999}, "rg2_cpu_test": {"1": 60.729999999999997, "0": 60.68, "2": 60.780000000000001, "-1": 60.969999999999999}, "admin_group": {"1": 0.029999999999999999, "0": 0.01, "2": 0.02, "-1": 0.089999999999999997}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +TRUNCATE TABLE cpu_usage_samples; +TRUNCATE +SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 25.890000000000001, "0": 25.879999999999999, "2": 25.879999999999999, "-1": 26.109999999999999}, "rg2_cpu_test": {"1": 64.090000000000003, "0": 64.069999999999993, "2": 64.069999999999993, "-1": 64.329999999999998}, "admin_group": {"1": 0.0, "0": 0.02, "2": 0.02, "-1": 0.11}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 25.940000000000001, "0": 25.879999999999999, "2": 25.809999999999999, "-1": 26.149999999999999}, "rg2_cpu_test": {"1": 63.57, "0": 63.710000000000001, "2": 62.909999999999997, "-1": 63.32}, "admin_group": {"1": 0.01, "0": 0.02, "2": 0.02, "-1": 0.089999999999999997}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"rg1_cpu_test": {"1": 27.920000000000002, "0": 28.18, "2": 27.949999999999999, "-1": 27.629999999999999}, "rg2_cpu_test": {"1": 62.170000000000002, "0": 62.119999999999997, "2": 62.350000000000001, "-1": 60.600000000000001}, "admin_group": {"1": 0.029999999999999999, "0": 0.01, "2": 0.02, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"rg1_cpu_test": {"1": 29.350000000000001, "0": 29.350000000000001, "2": 29.359999999999999, "-1": 29.600000000000001}, "rg2_cpu_test": {"1": 60.68, "0": 60.689999999999998, "2": 60.700000000000003, "-1": 60.82}, "admin_group": {"1": 0.02, "0": 0.01, "2": 0.01, "-1": 0.11}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"rg1_cpu_test": {"1": 27.969999999999999, "0": 27.84, "2": 27.760000000000002, "-1": 27.399999999999999}, "rg2_cpu_test": {"1": 62.109999999999999, "0": 62.149999999999999, "2": 62.159999999999997, "-1": 60.960000000000001}, "admin_group": {"1": 0.02, "0": 0.029999999999999999, "2": 0.029999999999999999, "-1": 0.10000000000000001}, "default_group": {"1": 0.0, "0": 0.0, "2": 0.0, "-1": 0.0}} +(1 row) +SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +-- end_ignore + +SELECT verify_cpu_usage('rg1_cpu_test', 30, 10); + verify_cpu_usage +------------------ + t +(1 row) +SELECT verify_cpu_usage('rg2_cpu_test', 60, 10); + verify_cpu_usage +------------------ + t +(1 row) + +-- start_ignore +SELECT * FROM cancel_all; + pg_cancel_backend +------------------- + t + t + t + t + t + t + t + t + t + t +(10 rows) + +10<: <... completed> +ERROR: canceling statement due to user request +11<: <... completed> +ERROR: canceling statement due to user request +12<: <... completed> +ERROR: canceling statement due to user request +13<: <... completed> +ERROR: canceling statement due to user request +14<: <... completed> +ERROR: canceling statement due to user request + +20<: <... completed> +ERROR: canceling statement due to user request +21<: <... completed> +ERROR: canceling statement due to user request +22<: <... completed> +ERROR: canceling statement due to user request +23<: <... completed> +ERROR: canceling statement due to user request +24<: <... completed> +ERROR: canceling statement due to user request + +10q: ... +11q: ... +12q: ... +13q: ... +14q: ... + + +20q: ... +21q: ... +22q: ... +23q: ... +24q: ... +-- end_ignore + +-- start_ignore +! gpconfig -c gp_resource_group_cpu_ceiling_enforcement -v on; +20210405:09:43:44:019995 gpconfig:hubert-gp-centos:huanzhang-[INFO]:-completed successfully with parameters '-c gp_resource_group_cpu_ceiling_enforcement -v on' + +! gpstop -rai; +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Starting gpstop with args: -rai +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Gathering information and validating the environment... +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Obtaining Cloudberry Coordinator catalog information +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Obtaining Segment details from coordinator... +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.14449.gd1235cef56 build dev' +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing Coordinator instance shutdown with mode='immediate' +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Coordinator segment instance directory=/home/huanzhang/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Attempting forceful termination of any leftover coordinator process +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Terminating processes for segment /home/huanzhang/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20210405:09:43:44:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Stopping coordinator standby host hubert-gp-centos mode=immediate +20210405:09:43:46:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Successfully shutdown standby process on hubert-gp-centos +20210405:09:43:46:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Targeting dbid [2, 5, 3, 6, 4, 7] for shutdown +20210405:09:43:46:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing parallel primary segment instance shutdown, please wait... +20210405:09:43:46:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-0.00% of jobs completed +20210405:09:43:47:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-100.00% of jobs completed +20210405:09:43:47:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing parallel mirror segment instance shutdown, please wait... +20210405:09:43:47:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-0.00% of jobs completed +20210405:09:43:48:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-100.00% of jobs completed +20210405:09:43:48:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:----------------------------------------------------- +20210405:09:43:48:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:- Segments stopped successfully = 6 +20210405:09:43:48:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:- Segments with errors during stop = 0 +20210405:09:43:48:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:----------------------------------------------------- +20210405:09:43:48:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Successfully shutdown 6 of 6 segment instances +20210405:09:43:48:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Database successfully shutdown with no errors reported +20210405:09:43:48:020373 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Restarting System... + +-- end_ignore + +-- prepare parallel queries in the two groups +10: SET ROLE TO role1_cpu_test; +SET +11: SET ROLE TO role1_cpu_test; +SET +12: SET ROLE TO role1_cpu_test; +SET +13: SET ROLE TO role1_cpu_test; +SET +14: SET ROLE TO role1_cpu_test; +SET + +20: SET ROLE TO role2_cpu_test; +SET +21: SET ROLE TO role2_cpu_test; +SET +22: SET ROLE TO role2_cpu_test; +SET +23: SET ROLE TO role2_cpu_test; +SET +24: SET ROLE TO role2_cpu_test; +SET + +-- +-- now we get prepared. +-- +-- on empty load the cpu usage shall be 0% +-- +-- +-- a group should not burst to use all the cpu usage +-- when it's the only one with running queries. +-- +-- so the cpu usage shall be 10% +-- + +10&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +11&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +12&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +13&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +14&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +-- start_ignore +1:TRUNCATE TABLE cpu_usage_samples; +TRUNCATE +1:SELECT fetch_sample(); + fetch_sample +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.32, "0": 0.1, "1": 0.15, "2": 0.13}, "rg1_cpu_test": {"-1": 9.76, "0": 11.32, "1": 11.78, "2": 10.05}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.16, "0": 0.09, "1": 0.09, "2": 0.06}, "rg1_cpu_test": {"-1": 10.25, "0": 10.16, "1": 10.17, "2": 9.95}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.15, "0": 0.05, "1": 0.05, "2": 0.05}, "rg1_cpu_test": {"-1": 9.94, "0": 9.97, "1": 9.97, "2": 9.97}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.12, "0": 0.07, "1": 0.07, "2": 0.07}, "rg1_cpu_test": {"-1": 9.97, "0": 10.0, "1": 10.0, "2": 10.0}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.15, "0": 0.06, "1": 0.06, "2": 0.05}, "rg1_cpu_test": {"-1": 10.05, "0": 10.08, "1": 10.08, "2": 10.08}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:TRUNCATE TABLE cpu_usage_samples; +TRUNCATE +1:SELECT fetch_sample(); + fetch_sample +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.14, "0": 0.07, "1": 0.11, "2": 0.04}, "rg1_cpu_test": {"-1": 10.1, "0": 10.14, "1": 10.12, "2": 10.14}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.15, "0": 0.08, "1": 0.08, "2": 0.07}, "rg1_cpu_test": {"-1": 9.92, "0": 9.95, "1": 9.95, "2": 9.95}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.14, "0": 0.04, "1": 0.08, "2": 0.04}, "rg1_cpu_test": {"-1": 10.13, "0": 10.15, "1": 10.16, "2": 10.15}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.15, "0": 0.09, "1": 0.07, "2": 0.07}, "rg1_cpu_test": {"-1": 10.13, "0": 10.13, "1": 9.92, "2": 10.14}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.11, "0": 0.06, "1": 0.03, "2": 0.03}, "rg1_cpu_test": {"-1": 10.13, "0": 10.15, "1": 10.16, "2": 10.16}, "rg2_cpu_test": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +-- end_ignore + +1:SELECT verify_cpu_usage('rg1_cpu_test', 10, 2); + verify_cpu_usage +------------------ + t +(1 row) + +-- start_ignore +1:SELECT * FROM cancel_all; + pg_cancel_backend +------------------- + t + t + t + t + t +(5 rows) + +10<: <... completed> +ERROR: canceling statement due to user request +11<: <... completed> +ERROR: canceling statement due to user request +12<: <... completed> +ERROR: canceling statement due to user request +13<: <... completed> +ERROR: canceling statement due to user request +14<: <... completed> +ERROR: canceling statement due to user request +-- end_ignore + +10q: ... +11q: ... +12q: ... +13q: ... +14q: ... + +10: SET ROLE TO role1_cpu_test; +SET +11: SET ROLE TO role1_cpu_test; +SET +12: SET ROLE TO role1_cpu_test; +SET +13: SET ROLE TO role1_cpu_test; +SET +14: SET ROLE TO role1_cpu_test; +SET + +-- +-- when there are multiple groups with parallel queries, +-- they should follow the ceiling enforcement of the cpu usage. +-- +-- rg1_cpu_test:rg2_cpu_test is 0.1:0.2, so: +-- +-- - rg1_cpu_test gets 10%; +-- - rg2_cpu_test gets 20%; +-- + +10&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +11&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +12&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +13&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +14&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +20&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +21&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +22&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +23&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; +24&: SELECT * FROM gp_dist_random('gp_id') WHERE busy() IS NULL; + +-- start_ignore +1:TRUNCATE TABLE cpu_usage_samples; +TRUNCATE +1:SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.14, "0": 0.02, "1": 0.05, "2": 0.05}, "rg1_cpu_test": {"-1": 10.07, "0": 10.06, "1": 10.06, "2": 10.06}, "rg2_cpu_test": {"-1": 19.88, "0": 19.93, "1": 19.93, "2": 19.93}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.2, "0": 0.07, "1": 0.05, "2": 0.1}, "rg1_cpu_test": {"-1": 9.87, "0": 9.93, "1": 9.93, "2": 9.91}, "rg2_cpu_test": {"-1": 19.93, "0": 20.03, "1": 20.03, "2": 19.99}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.17, "0": 0.03, "1": 0.05, "2": 0.07}, "rg1_cpu_test": {"-1": 9.97, "0": 10.01, "1": 10.01, "2": 10.01}, "rg2_cpu_test": {"-1": 19.9, "0": 19.98, "1": 19.98, "2": 19.98}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.15, "0": 0.03, "1": 0.03, "2": 0.04}, "rg1_cpu_test": {"-1": 10.03, "0": 9.98, "1": 9.99, "2": 9.99}, "rg2_cpu_test": {"-1": 20.51, "0": 20.28, "1": 20.29, "2": 20.3}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.14, "0": 0.05, "1": 0.05, "2": 0.02}, "rg1_cpu_test": {"-1": 9.95, "0": 9.97, "1": 9.97, "2": 9.98}, "rg2_cpu_test": {"-1": 19.87, "0": 19.92, "1": 19.92, "2": 19.93}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:TRUNCATE TABLE cpu_usage_samples; +TRUNCATE +1:SELECT fetch_sample(); + fetch_sample +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.16, "0": 0.07, "1": 0.06, "2": 0.06}, "rg1_cpu_test": {"-1": 10.49, "0": 9.89, "1": 9.81, "2": 10.15}, "rg2_cpu_test": {"-1": 21.55, "0": 20.42, "1": 20.5, "2": 20.39}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.15, "0": 0.06, "1": 0.05, "2": 0.03}, "rg1_cpu_test": {"-1": 9.93, "0": 9.92, "1": 9.92, "2": 9.92}, "rg2_cpu_test": {"-1": 19.84, "0": 19.9, "1": 19.9, "2": 19.9}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.14, "0": 0.06, "1": 0.06, "2": 0.06}, "rg1_cpu_test": {"-1": 9.67, "0": 9.46, "1": 9.54, "2": 9.53}, "rg2_cpu_test": {"-1": 21.12, "0": 20.67, "1": 20.88, "2": 20.88}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.12, "0": 0.08, "1": 0.08, "2": 0.08}, "rg1_cpu_test": {"-1": 9.9, "0": 9.92, "1": 9.92, "2": 9.93}, "rg2_cpu_test": {"-1": 19.91, "0": 19.96, "1": 19.96, "2": 19.96}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +1:SELECT fetch_sample(); + fetch_sample +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"default_group": {"-1": 0.0, "0": 0.0, "1": 0.0, "2": 0.0}, "admin_group": {"-1": 0.13, "0": 0.06, "1": 0.07, "2": 0.09}, "rg1_cpu_test": {"-1": 8.71, "0": 9.96, "1": 10.1, "2": 10.5}, "rg2_cpu_test": {"-1": 17.65, "0": 20.94, "1": 20.1, "2": 21.04}} +(1 row) +1:SELECT pg_sleep(1.7); + pg_sleep +---------- + +(1 row) +-- end_ignore + +1:SELECT verify_cpu_usage('rg1_cpu_test', 10, 2); + verify_cpu_usage +------------------ + t +(1 row) +1:SELECT verify_cpu_usage('rg2_cpu_test', 20, 2); + verify_cpu_usage +------------------ + t +(1 row) + +-- start_ignore +1:SELECT * FROM cancel_all; + pg_cancel_backend +------------------- + t + t + t + t + t + t + t + t + t + t +(10 rows) + +10<: <... completed> +ERROR: canceling statement due to user request +11<: <... completed> +ERROR: canceling statement due to user request +12<: <... completed> +ERROR: canceling statement due to user request +13<: <... completed> +ERROR: canceling statement due to user request +14<: <... completed> +ERROR: canceling statement due to user request + +20<: <... completed> +ERROR: canceling statement due to user request +21<: <... completed> +ERROR: canceling statement due to user request +22<: <... completed> +ERROR: canceling statement due to user request +23<: <... completed> +ERROR: canceling statement due to user request +24<: <... completed> +ERROR: canceling statement due to user request + +10q: ... +11q: ... +12q: ... +13q: ... +14q: ... + + +20q: ... +21q: ... +22q: ... +23q: ... +24q: ... + +1q: ... +-- end_ignore + +-- start_ignore +! gpconfig -c gp_resource_group_cpu_ceiling_enforcement -v off; +20210405:09:44:48:022326 gpconfig:hubert-gp-centos:huanzhang-[INFO]:-completed successfully with parameters '-c gp_resource_group_cpu_ceiling_enforcement -v off' + +! gpstop -rai; +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Starting gpstop with args: -rai +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Gathering information and validating the environment... +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Obtaining Cloudberry Coordinator catalog information +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Obtaining Segment details from coordinator... +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.14449.gd1235cef56 build dev' +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing Coordinator instance shutdown with mode='immediate' +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Coordinator segment instance directory=/home/huanzhang/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Attempting forceful termination of any leftover coordinator process +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Terminating processes for segment /home/huanzhang/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20210405:09:44:48:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Stopping coordinator standby host hubert-gp-centos mode=immediate +20210405:09:44:49:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Successfully shutdown standby process on hubert-gp-centos +20210405:09:44:49:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Targeting dbid [2, 5, 3, 6, 4, 7] for shutdown +20210405:09:44:49:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing parallel primary segment instance shutdown, please wait... +20210405:09:44:49:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-0.00% of jobs completed +20210405:09:44:50:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-100.00% of jobs completed +20210405:09:44:50:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing parallel mirror segment instance shutdown, please wait... +20210405:09:44:50:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-0.00% of jobs completed +20210405:09:44:51:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-100.00% of jobs completed +20210405:09:44:51:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:----------------------------------------------------- +20210405:09:44:51:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:- Segments stopped successfully = 6 +20210405:09:44:51:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:- Segments with errors during stop = 0 +20210405:09:44:51:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:----------------------------------------------------- +20210405:09:44:51:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Successfully shutdown 6 of 6 segment instances +20210405:09:44:51:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Database successfully shutdown with no errors reported +20210405:09:44:51:022698 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Restarting System... + +-- end_ignore + +-- restore admin_group's cpu_rate_limit +2:ALTER RESOURCE GROUP admin_group SET cpu_rate_limit 10; +ALTER + +-- cleanup +2:REVOKE ALL ON FUNCTION busy() FROM role1_cpu_test; +REVOKE +2:REVOKE ALL ON FUNCTION busy() FROM role2_cpu_test; +REVOKE +2:DROP ROLE role1_cpu_test; +DROP +2:DROP ROLE role2_cpu_test; +DROP +2:DROP RESOURCE GROUP rg1_cpu_test; +DROP +2:DROP RESOURCE GROUP rg2_cpu_test; +DROP +-- start_ignore +2:DROP LANGUAGE plpython3u CASCADE; +DROP +-- end_ignore diff --git a/src/test/singlenode_isolation2/output/resgroup/resgroup_cpuset.source b/src/test/singlenode_isolation2/output/resgroup/resgroup_cpuset.source new file mode 100644 index 00000000000..925cfe57959 --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/resgroup_cpuset.source @@ -0,0 +1,308 @@ + +CREATE RESOURCE GROUP rg1_cpuset_test WITH (memory_limit = 10, cpuset='0'); +CREATE +CREATE ROLE role1_cpuset_test RESOURCE GROUP rg1_cpuset_test; +CREATE + +-- check whether the queries running in the specific group on the specific core set +-- @param grp: the resource group queries running in +-- @param cpuset: cpu cores which the queries should only be run on them, e.g. 0,1 +-- @return bool: true/false indicating whether it corresponds to the rule +CREATE FUNCTION check_cpuset(grp TEXT, cpuset TEXT) RETURNS BOOL AS $$ import subprocess import pg import time import re +conn = pg.connect(dbname="isolation2resgrouptest") pt = re.compile(r'con(\d+)') +def check(expect_cpus, sess_ids): procs = subprocess.check_output(['ps', '-eF']).decode().split('\n') head, proc_stats = procs[0], procs[1:] PSR = [id for id, attr in enumerate(head.split()) if attr.strip() == 'PSR'][0] cpus = [proc_stat.split()[PSR].strip() for proc_stat in proc_stats if 'postgres' in proc_stat and pt.findall(proc_stat) and set(pt.findall(proc_stat)).issubset(sess_ids)] return set(cpus).issubset(set(expect_cpus)) +def get_all_sess_ids_in_group(group_name): sql = "select sess_id from pg_stat_activity where rsgname = '%s'" % group_name result = conn.query(sql).getresult() return set([str(r[0]) for r in result]) +expect_cpu = [] conf = cpuset if conf == '': fd = open("@cgroup_mnt_point@/cpuset/gpdb/cpuset.cpus") line = fd.readline() fd.close() conf = line.strip('\n') +tokens = conf.split(",") 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 a resource group that contains all the cpu cores +CREATE FUNCTION create_allcores_group(grp TEXT) RETURNS BOOL AS $$ import pg conn = pg.connect(dbname="isolation2resgrouptest") file = "@cgroup_mnt_point@/cpuset/gpdb/cpuset.cpus" fd = open(file) line = fd.readline() fd.close() line = line.strip('\n') sql = "create resource group " + grp + " with (" \ + "memory_limit=1, cpuset='" + line + "')" result = conn.query(sql) +file = "@cgroup_mnt_point@/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 + +-- check whether the cpuset value in cgroup is valid according to the rule +CREATE FUNCTION check_rules() RETURNS BOOL AS $$ import pg +def get_all_group_which_cpuset_is_set(): sql = "select groupid,cpuset from gp_toolkit.gp_resgroup_config where cpuset != '-1'" result = conn.query(sql).getresult() return result +def parse_cpuset(line): line = line.strip('\n') if len(line) == 0: return set([]) tokens = line.split(",") cpuset = [] 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): cpuset.append(str(num)) else: cpuset.append(token) return set(cpuset) +def get_cgroup_cpuset(group): group = str(group) if group == '0': file = "@cgroup_mnt_point@/cpuset/gpdb/cpuset.cpus" else: file = "@cgroup_mnt_point@/cpuset/gpdb/" + group + "/cpuset.cpus" fd = open(file) line = fd.readline() fd.close() return parse_cpuset(line) +conn = pg.connect(dbname="isolation2resgrouptest") config_groups = get_all_group_which_cpuset_is_set() groups_cpuset = set([]) # check whether cpuset in config and cgroup are same, and have no overlap for config_group in config_groups: groupid = config_group[0] cpuset_value = config_group[1] config_cpuset = parse_cpuset(cpuset_value) cgroup_cpuset = get_cgroup_cpuset(groupid) if len(groups_cpuset & cgroup_cpuset) > 0: return False groups_cpuset |= cgroup_cpuset 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 TABLE bigtable AS SELECT i AS c1, 'abc' AS c2 FROM generate_series(1,50000) i; +CREATE 50000 + +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 cancel_all AS SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query LIKE 'SELECT * FROM busy%'; +CREATE + +GRANT ALL ON busy TO role1_cpuset_test; +GRANT + +-- we suppose core 0 & 1 are available + +10: SET ROLE TO role1_cpuset_test; +SET +10: BEGIN; +BEGIN +10&: SELECT * FROM busy; + +select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +11: BEGIN; +BEGIN +11: SELECT check_cpuset('rg1_cpuset_test', '0'); + check_cpuset +-------------- + t +(1 row) + +ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '1'; +ALTER +select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +11: SELECT check_cpuset('rg1_cpuset_test', '1'); + check_cpuset +-------------- + t +(1 row) + +ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '0,1'; +ALTER +select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +11: SELECT check_cpuset('rg1_cpuset_test', '0,1'); + check_cpuset +-------------- + t +(1 row) +11: END; +END + +-- change to cpu_rate_limit while the transaction is running +ALTER RESOURCE GROUP rg1_cpuset_test SET cpu_rate_limit 10; +ALTER + +-- cancel the transaction +-- start_ignore +select * from cancel_all; + pg_cancel_backend +------------------- + t +(1 row) + +10<: <... completed> +ERROR: canceling statement due to user request +10q: ... +11q: ... +-- end_ignore + +-- test whether the cpu_rate_limit had taken effect +10: SET ROLE TO role1_cpuset_test; +SET +10: BEGIN; +BEGIN +10&: SELECT * FROM busy; + +select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +11: BEGIN; +BEGIN +11: SELECT check_cpuset('rg1_cpuset_test', ''); + check_cpuset +-------------- + t +(1 row) + +-- cancel the transaction +-- start_ignore +select * from cancel_all; + pg_cancel_backend +------------------- + t +(1 row) + +10<: <... completed> +ERROR: canceling statement due to user request +10q: ... +11q: ... +-- end_ignore + +-- test cpu_usage +10: SET ROLE TO role1_cpuset_test; +SET +10: BEGIN; +BEGIN +10&: SELECT * FROM busy; + +select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +11: BEGIN; +BEGIN +11: select (cpu_usage::json->>'0')::float > 50 from gp_toolkit.gp_resgroup_status where rsgname='rg1_cpuset_test'; + ?column? +---------- + t +(1 row) +-- cancel the transaction +-- start_ignore +select * from cancel_all; + pg_cancel_backend +------------------- + t +(1 row) + +10<: <... completed> +ERROR: canceling statement due to user request +10q: ... +11q: ... +-- end_ignore + +-- positive: cgroup cpuset must correspond to config cpuset +-- default group value must be valid +-- suppose the cores numbered 0 & 1 are available +SELECT check_rules(); + check_rules +------------- + t +(1 row) +CREATE RESOURCE GROUP rg1_test_group WITH (memory_limit=10, cpuset='0'); +CREATE +SELECT check_rules(); + check_rules +------------- + t +(1 row) +CREATE RESOURCE GROUP rg2_test_group WITH (memory_limit=10, cpuset='1'); +CREATE +SELECT check_rules(); + check_rules +------------- + t +(1 row) +ALTER RESOURCE GROUP rg1_test_group SET cpu_rate_limit 1; +ALTER +SELECT check_rules(); + check_rules +------------- + t +(1 row) +ALTER RESOURCE GROUP rg1_test_group SET cpuset '0'; +ALTER +SELECT check_rules(); + check_rules +------------- + t +(1 row) +ALTER RESOURCE GROUP rg1_test_group SET cpu_rate_limit 1; +ALTER +SELECT check_rules(); + check_rules +------------- + t +(1 row) +DROP RESOURCE GROUP rg1_test_group; +DROP +SELECT check_rules(); + check_rules +------------- + t +(1 row) +DROP RESOURCE GROUP rg2_test_group; +DROP +SELECT check_rules(); + check_rules +------------- + t +(1 row) +-- positive: create a resource group contains all cpu core +-- the minimum numbered core left in default cpuset group +SELECT create_allcores_group('rg1_test_group'); + create_allcores_group +----------------------- + t +(1 row) +SELECT check_rules(); + check_rules +------------- + t +(1 row) +DROP RESOURCE GROUP rg1_test_group; +DROP +SELECT check_rules(); + check_rules +------------- + t +(1 row) +-- negative: simulate DDL fail +-- create fail +SELECT gp_inject_fault('create_resource_group_fail', 'error', 1); + gp_inject_fault +----------------- + Success: +(1 row) +CREATE RESOURCE GROUP rg1_test_group WITH (memory_limit=10, cpuset='0'); +ERROR: fault triggered, fault name:'create_resource_group_fail' fault type:'error' +SELECT groupid, groupname, cpuset FROM gp_toolkit.gp_resgroup_config WHERE cpuset != '-1'; + groupid | groupname | cpuset +---------+-----------+-------- +(0 rows) +SELECT check_rules(); + check_rules +------------- + t +(1 row) +SELECT gp_inject_fault('create_resource_group_fail', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +REVOKE ALL ON busy FROM role1_cpuset_test; +REVOKE +DROP ROLE role1_cpuset_test; +DROP +DROP RESOURCE GROUP rg1_cpuset_test; +DROP +DROP FUNCTION check_rules(); +DROP +DROP FUNCTION check_cpuset(TEXT, TEXT); +DROP +DROP FUNCTION create_allcores_group(TEXT); +DROP +-- start_ignore +DROP LANGUAGE plpython3u CASCADE; +DROP +-- end_ignore +DROP VIEW cancel_all; +DROP +DROP VIEW busy; +DROP +DROP TABLE bigtable; +DROP diff --git a/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_limit.source b/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_limit.source new file mode 100644 index 00000000000..fc2c3f5b0ff --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_limit.source @@ -0,0 +1,923 @@ +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +DROP RESOURCE GROUP rg2_memory_test; +ERROR: resource group "rg2_memory_test" does not exist +-- end_ignore + +CREATE OR REPLACE FUNCTION resGroupPalloc(float) RETURNS int AS '@abs_builddir@/../regress/regress@DLSUFFIX@', 'resGroupPalloc' LANGUAGE C READS SQL DATA; +CREATE + +CREATE OR REPLACE FUNCTION hold_memory_by_percent(float) RETURNS int AS $$ SELECT * FROM resGroupPalloc($1) $$ LANGUAGE sql; +CREATE + +CREATE OR REPLACE VIEW rg_mem_status AS SELECT groupname, memory_limit, memory_shared_quota FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg1_memory_test' OR groupname='rg2_memory_test' ORDER BY groupid; +CREATE + +CREATE OR REPLACE VIEW memory_result AS SELECT rsgname, memory_usage from gp_toolkit.gp_resgroup_status; +CREATE + +-- 1) single allocation +-- Group Share Quota = 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52% => 52% +-- rg1's slot quota: 52% / 2 * 2 => 52% +-- rg1's single slot quota: 52% / 2 => 26% +-- rg1's shared quota: %52 - %52 => %0 +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 52%/2 + 0% + 8% => 34% +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=52, memory_shared_quota=0); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE + +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.14 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.14 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.14 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.14 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.14 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.14 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.42 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +-- 1b) on QEs +1: SET ROLE TO role1_memory_test; +SET +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.14 / 0.52)=0; + count +------- + 0 +(1 row) +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.14 / 0.52)=0; + count +------- + 0 +(1 row) +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.14 / 0.52)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=18610) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.42 / 0.52)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=18619) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +DROP ROLE role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP + +-- 2) single allocation +-- Group Share Quota > 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52 / 100 => 52% +-- rg1's slot quota: 52% * 60 /100 => 31% +-- rg1's single slot quota: 31% / 2 => 15.5% +-- rg1's shared quota: 52% - 31% => 21% +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 15.5% + 21% + 8% => 44.5% + +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=52, memory_shared_quota=40); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE + +-- 2a) on QD +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.12 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.12 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.12 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.12 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.12 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.12 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.12 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.12 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.48 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +-- 2b) on QEs +1: SET ROLE TO role1_memory_test; +SET +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.12 / 0.52)=0; + count +------- + 0 +(1 row) +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.12 / 0.52)=0; + count +------- + 0 +(1 row) +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.12 / 0.52)=0; + count +------- + 0 +(1 row) +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.12 / 0.52)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=19259) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.48 / 0.52)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=19269) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +DROP ROLE role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP + +-- 3) single allocation +-- Group Share Quota > 0 +-- Global Share Quota > 0 +-- Slot Quota = 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52 / 100 => 52% +-- rg1's slot quota: 0 +-- rg1's shared quota: 52% +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 52% + 8% => 60% + +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=52, memory_shared_quota=100); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE + +-- 3a) on QD +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.25 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.25 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.25 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.25 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.25 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.25 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.75 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +-- 3b) on QEs +1: SET ROLE TO role1_memory_test; +SET +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.25 / 0.52)=0; + count +------- + 0 +(1 row) +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.25 / 0.52)=0; + count +------- + 0 +(1 row) +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.25 / 0.52)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=19875) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +1: SET ROLE TO role1_memory_test; +SET +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.75 / 0.52)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=19884) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +DROP ROLE role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP + +-- 4) multi allocation in one group +-- Group Share Quota = 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52 / 100 => 52% +-- rg1's slot quota: 52% / 2 * 2 => 52% +-- rg1's single slot quota: 52% / 2 => 26% +-- rg1's shared quota: 0 +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 26% + 8% => 34% + +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=52, memory_shared_quota=0); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE + +-- 4a) on QD +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.28 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +2: SELECT hold_memory_by_percent(0.28 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1q: ... +2q: ... + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.32 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +2: SELECT hold_memory_by_percent(0.32 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... +2q: ... + +-- allocate serially +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.32 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1q: ... +SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SELECT hold_memory_by_percent(0.32 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +2q: ... + +-- 4b) on QEs +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.28 / 0.52)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.28 / 0.52)=0; + count +------- + 0 +(1 row) +1q: ... +2q: ... + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.32 / 0.52)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.32 / 0.52)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=21102) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... +2q: ... + +-- allocate serially +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.32 / 0.52)=0; + count +------- + 0 +(1 row) +1q: ... +SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.32 / 0.52)=0; + count +------- + 0 +(1 row) +2q: ... + +DROP ROLE role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP + +-- 5) multi allocation in one group +-- Group Share Quota > 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 52 / 100 => 52% +-- rg1's slot quota: 52% * 50 / 100 => 26% +-- rg1's single slot quota: 26% / 2 => 13% +-- rg1's shared quota: 52% - 13% * 2 => 26% +-- system free chunks: 100% - 10% - 30% - 52% => 8% +-- memory available to one slot in rg1: 13% + 26% + 8% => 47% + +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=52, memory_shared_quota=50); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE + +-- 5a) on QD +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +-- reserve all the group shared quota +1: SELECT hold_memory_by_percent(0.39 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +-- must allocate from global share +2: SELECT hold_memory_by_percent(0.2 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1q: ... +2q: ... + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.39 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +2: SELECT hold_memory_by_percent(0.39 / 0.52); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... +2q: ... + +-- allocate serially +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.39 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1q: ... +SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SELECT hold_memory_by_percent(0.39 / 0.52); + hold_memory_by_percent +------------------------ + 0 +(1 row) +2q: ... + +-- 5b) on QEs +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +-- reserve all the group shared quota +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; + count +------- + 0 +(1 row) +-- must allocate from global share +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.52)=0; + count +------- + 0 +(1 row) +1q: ... +2q: ... + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=21783) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... +2q: ... + +-- allocate serially +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; + count +------- + 0 +(1 row) +1q: ... +SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.39 / 0.52)=0; + count +------- + 0 +(1 row) +2q: ... + +DROP ROLE role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP + +-- 6) multi allocation in different group +-- Group Share Quota > 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 20 / 100 => 20% +-- rg1's slot quota: 20% * 60 / 100 / 2 * 2 => 12% +-- rg1's single slot quota: 12% / 2 => 6% +-- rg1's shared quota: 20% - 6% * 2 => 8% +-- rg2 same as rg1 +-- system free chunks: 100% - 10% - 30% - 100%*20/100 - 100%*20/100 => 20% +-- memory available to one slot in rg1/rg2: 6% + 8% + 20% => 34% + +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=20, memory_shared_quota=40); +CREATE +CREATE RESOURCE GROUP rg2_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=20, memory_shared_quota=40); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE +CREATE ROLE role2_memory_test RESOURCE GROUP rg2_memory_test; +CREATE + +-- 6a) on QD +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role2_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.2 / 0.2); + hold_memory_by_percent +------------------------ + 0 +(1 row) +2: SELECT hold_memory_by_percent(0.2 / 0.2); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1q: ... +2q: ... + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role2_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.3 / 0.2); + hold_memory_by_percent +------------------------ + 0 +(1 row) +2: SELECT hold_memory_by_percent(0.3 / 0.2); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... +2q: ... + +-- allocate serially +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role2_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(0.3 / 0.2); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1q: ... +SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SELECT hold_memory_by_percent(0.3 / 0.2); + hold_memory_by_percent +------------------------ + 0 +(1 row) +2q: ... + +-- 6b) on QEs +-- not exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role2_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.2)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.2)=0; + count +------- + 0 +(1 row) +1q: ... +2q: ... + +-- exceed the global share +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role2_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3 / 0.2)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3 / 0.2)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=22464) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... +2q: ... + +-- allocate serially +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role2_memory_test; +SET +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3 / 0.2)=0; + count +------- + 0 +(1 row) +1q: ... +SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3 / 0.2)=0; + count +------- + 0 +(1 row) +2q: ... + +DROP ROLE role1_memory_test; +DROP +DROP ROLE role2_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +DROP RESOURCE GROUP rg2_memory_test; +DROP + +-- 7) DBA can increase global shared memory by decreasing +-- any existing group_memory_limit +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 30 / 100 => 30% +-- rg1's slot quota: 30% +-- rg1's single slot quota: 30% / 2 => 15% +-- rg1's shared quota: 0 +-- rg2 same as rg1 +-- system free chunks: 100% - 10% - 30% - 30% - 30% => 0 +-- memory available to one slot in rg1/rg2: 15% + 0 + 0 => 15% + +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0); +CREATE +CREATE RESOURCE GROUP rg2_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE +CREATE ROLE role2_memory_test RESOURCE GROUP rg2_memory_test; +CREATE + +-- 7a) on QD +-- not enough memory +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.2 / 0.3); +ERROR: Out of memory +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +-- alter rg2 memory_limit so last query has enough memory +ALTER RESOURCE GROUP rg2_memory_test SET memory_limit 20; +ALTER +-- system free chunks: 100% - 10% - 30% - 30% - 20% => 10% +-- memory available to one slot in rg1/rg2: 15% + 0 + 10% => 25% + +-- enough memory for allocating +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.2 / 0.3); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1q: ... + +-- 7b) on QEs +-- not enough memory +ALTER RESOURCE GROUP rg2_memory_test SET memory_limit 30; +ALTER +1: SET ROLE TO role1_memory_test; +SET +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.3)=0; +ERROR: Out of memory (seg0 slice1 10.152.10.56:25432 pid=23131) +DETAIL: Resource group memory limit reached +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +-- alter rg2 memory_limit so last query has enough memory +ALTER RESOURCE GROUP rg2_memory_test SET memory_limit 20; +ALTER +-- system free chunks: 100% - 10% - 30% - 30% - 20% => 10% +-- memory available to one slot in rg1/rg2: 15% + 0 + 10% => 25% + +-- enough memory for allocating +1: SET ROLE TO role1_memory_test; +SET +1: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.2 / 0.3)=0; + count +------- + 0 +(1 row) +1q: ... + +DROP ROLE role1_memory_test; +DROP +DROP ROLE role2_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +DROP RESOURCE GROUP rg2_memory_test; +DROP diff --git a/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_runaway.source b/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_runaway.source new file mode 100644 index 00000000000..030654258ce --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_runaway.source @@ -0,0 +1,303 @@ +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +DROP RESOURCE GROUP rg2_memory_test; +ERROR: resource group "rg2_memory_test" does not exist +-- end_ignore + +CREATE OR REPLACE FUNCTION resGroupPalloc(float) RETURNS int AS '@abs_builddir@/../regress/regress@DLSUFFIX@', 'resGroupPalloc' LANGUAGE C READS SQL DATA; +CREATE + +CREATE OR REPLACE FUNCTION hold_memory_by_percent(float) RETURNS int AS $$ SELECT * FROM resGroupPalloc($1) $$ LANGUAGE sql; +CREATE + +CREATE OR REPLACE VIEW rg_mem_status AS SELECT groupname, memory_limit, memory_shared_quota FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg1_memory_test' OR groupname='rg2_memory_test' ORDER BY groupid; +CREATE + +CREATE OR REPLACE VIEW memory_result AS SELECT rsgname, memory_usage from gp_toolkit.gp_resgroup_status; +CREATE + +-- start_ignore +! gpconfig -c runaway_detector_activation_percent -v 50; +20191213:05:03:47:014263 gpconfig:hubert-gp-centos:huanzhang-[INFO]:-completed successfully with parameters '-c runaway_detector_activation_percent -v 50' + +! gpstop -ari; +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Starting gpstop with args: -ari +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Gathering information and validating the environment... +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Obtaining Cloudberry Master catalog information +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Obtaining Segment details from master... +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.5211.gf5c0dd1 build dev' +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing Master instance shutdown with mode='immediate' +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Master segment instance directory=/home/huanzhang/workspace/gpdb7/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Attempting forceful termination of any leftover master process +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Terminating processes for segment /home/huanzhang/workspace/gpdb7/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Stopping master standby host hubert-gp-centos mode=immediate +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Successfully shutdown standby process on hubert-gp-centos +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Targeting dbid [2, 5, 3, 6, 4, 7] for shutdown +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing parallel primary segment instance shutdown, please wait... +20191213:05:03:48:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-0.00% of jobs completed +20191213:05:03:49:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-100.00% of jobs completed +20191213:05:03:49:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Commencing parallel mirror segment instance shutdown, please wait... +20191213:05:03:49:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-0.00% of jobs completed +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-100.00% of jobs completed +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:----------------------------------------------------- +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:- Segments stopped successfully = 6 +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:- Segments with errors during stop = 0 +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:----------------------------------------------------- +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Successfully shutdown 6 of 6 segment instances +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Database successfully shutdown with no errors reported +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Cleaning up leftover shared memory +20191213:05:03:50:014419 gpstop:hubert-gp-centos:huanzhang-[INFO]:-Restarting System... + +-- end_ignore + +-- after the restart we need a new connection to run the queries +-- 1) single allocation +-- Group Share Quota = 0 +-- Global Share Quota > 0 +-- Slot Quota > 0 +-- ----------------------- + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 20% => 20% +-- rg1's slot quota: 20% / 2 * 2 => 20% +-- rg1's single slot quota: 20% / 2 => 10% +-- rg1's shared quota: 20% - 20% => %0 +-- system free chunks: 100% - 10% - 30% - 20% => 40% +-- global area safe threshold: 40% / 2 = 20% +1: CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=20, memory_shared_quota=0); +CREATE +1: CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(1.0); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.3); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.3); +ERROR: Canceling query because of high VMEM usage. current group id is 806868, group memory usage 218 MB, group shared memory quota is 0 MB, slot memory quota is 68 MB, global freechunks memory is 124 MB, global safe memory threshold is 137 MB (runaway_cleaner.c:197) +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +-- 1b) on QEs +2: SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SET ROLE TO role1_memory_test; +SET +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(1.0)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; +ERROR: Canceling query because of high VMEM usage. current group id is 806868, group memory usage 218 MB, group shared memory quota is 0 MB, slot memory quota is 68 MB, global freechunks memory is 124 MB, global safe memory threshold is 137 MB (runaway_cleaner.c:197) (seg0 slice1 10.146.0.4:7002 pid=10883) (runaway_cleaner.c:197) +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +2q: ... + +0: DROP ROLE role1_memory_test; +DROP +0: DROP RESOURCE GROUP rg1_memory_test; +DROP +0q: ... + + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 20% => 20% +-- rg1's slot quota: 20% / 2 => 10% +-- rg1's single slot quota: 10% / 2 => 5% +-- rg1's shared quota: %20 - %10 => %10 +-- system free chunks: 100% - 10% - 30% - 20% => 40% +-- safe threshold: 40% / 2 = 20% +1: CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=20, memory_shared_quota=50); +CREATE +1: CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(1.0); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.3); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.3); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.3); +ERROR: Canceling query because of high VMEM usage. current group id is 806877, group memory usage 259 MB, group shared memory quota is 68 MB, slot memory quota is 34 MB, global freechunks memory is 117 MB, global safe memory threshold is 137 MB (runaway_cleaner.c:197) +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +-- 1b) on QEs +2: SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SET ROLE TO role1_memory_test; +SET +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(1.0)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.3)=0; +ERROR: Canceling query because of high VMEM usage. current group id is 806877, group memory usage 259 MB, group shared memory quota is 68 MB, slot memory quota is 34 MB, global freechunks memory is 117 MB, global safe memory threshold is 137 MB (runaway_cleaner.c:197) (seg0 slice1 10.146.0.4:7002 pid=10918) (runaway_cleaner.c:197) +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +2q: ... + +0: DROP ROLE role1_memory_test; +DROP +0: DROP RESOURCE GROUP rg1_memory_test; +DROP +0q: ... + + + +-- we assume system total chunks is 100% +-- rg1's expected: 100% * 20% => 20% +-- rg1's slot quota: 20% / 2 => 10% +-- rg1's single slot quota: 10% / 2 => 5% +-- rg1's shared quota: %20 - %10 => %10 +-- rg2's expected: 100% * 20% => 20% +-- system free chunks: 100% - 10% - 30% - 20% - 20%=> 20% +-- safe threshold: 20% / 2 = 10% +1: CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=20, memory_shared_quota=50); +CREATE +1: CREATE RESOURCE GROUP rg2_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=20, memory_shared_quota=0); +CREATE +1: CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(1.0); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.15); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.15); +ERROR: Canceling query because of high VMEM usage. current group id is 806886, group memory usage 178 MB, group shared memory quota is 68 MB, slot memory quota is 34 MB, global freechunks memory is 62 MB, global safe memory threshold is 69 MB (runaway_cleaner.c:197) +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +1q: ... + +-- 1b) on QEs +2: SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) +2: SET ROLE TO role1_memory_test; +SET +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(1.0)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.15)=0; + count +------- + 0 +(1 row) +2: SELECT count(null) FROM gp_dist_random('gp_id') t1 WHERE hold_memory_by_percent(0.15)=0; +ERROR: Canceling query because of high VMEM usage. current group id is 806886, group memory usage 178 MB, group shared memory quota is 68 MB, slot memory quota is 34 MB, global freechunks memory is 62 MB, global safe memory threshold is 69 MB (runaway_cleaner.c:197) (seg0 slice1 10.146.0.4:7002 pid=10952) (runaway_cleaner.c:197) +CONTEXT: SQL function "hold_memory_by_percent" statement 1 +2q: ... + +0: DROP ROLE role1_memory_test; +DROP +0: DROP RESOURCE GROUP rg1_memory_test; +DROP +0: DROP RESOURCE GROUP rg2_memory_test; +DROP +0q: ... + +-- test for the rounding issue of runaway_detector_activation_percent +-- when calculating safeChunksThreshold, we used to multiply +-- runaway_detector_activation_percent and then divide 100. This will +-- cause the small chunks to be rounded to zero. +-- set runaway_detector_activation_percent to 99 to enlarge the rounding +-- issue + +-- start_ignore +! gpconfig -c runaway_detector_activation_percent -v 99; +! gpstop -ari; +-- end_ignore + +1: CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=60, memory_shared_quota=50); +CREATE +1: CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE +-- trigger small chunks rounding issue by reducing memory limit in small step +-- while increasing memory limit in big step. +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 57; +ALTER +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 54; +ALTER +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 51; +ALTER +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 48; +ALTER +1: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_LIMIT 60; +ALTER +-- 1a) on QD +1: SET ROLE TO role1_memory_test; +SET +1: SELECT hold_memory_by_percent(0.1); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1: SELECT hold_memory_by_percent(0.1); + hold_memory_by_percent +------------------------ + 0 +(1 row) +1q: ... + +0: DROP ROLE role1_memory_test; +DROP +0: DROP RESOURCE GROUP rg1_memory_test; +DROP +0q: ... + diff --git a/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_statistic.source b/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_statistic.source new file mode 100644 index 00000000000..e712194ef0d --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/resgroup_memory_statistic.source @@ -0,0 +1,302 @@ +DROP ROLE IF EXISTS role1_memory_test; +DROP +DROP ROLE IF EXISTS role2_memory_test; +DROP +-- start_ignore +DROP RESOURCE GROUP rg1_memory_test; +ERROR: resource group "rg1_memory_test" does not exist +DROP RESOURCE GROUP rg2_memory_test; +ERROR: resource group "rg2_memory_test" does not exist +-- end_ignore + +CREATE OR REPLACE FUNCTION repeatPalloc(int, int) RETURNS int AS '@abs_builddir@/../regress/regress@DLSUFFIX@', 'repeatPalloc' LANGUAGE C READS SQL DATA; +CREATE + +CREATE OR REPLACE FUNCTION hold_memory(int, int) RETURNS int AS $$ SELECT * FROM repeatPalloc(1, $2) $$ LANGUAGE sql; +CREATE + +CREATE OR REPLACE VIEW eat_memory_on_qd AS SELECT hold_memory(0,20); +CREATE + +CREATE OR REPLACE VIEW eat_memory_on_one_slice2 AS SELECT count(null) > 0 FROM gp_dist_random('gp_id') t1 WHERE hold_memory(t1.dbid,20)=0 ; +CREATE + +CREATE OR REPLACE VIEW eat_memory_on_slices2 AS SELECT count(null) > 0 FROM gp_dist_random('gp_id') t1, gp_dist_random('gp_id') t2 WHERE hold_memory(t1.dbid,20)=0 AND hold_memory(t2.dbid,20)=0 ; +CREATE + +CREATE OR REPLACE FUNCTION round_test(float, integer) RETURNS float AS $$ SELECT round($1 / $2) * $2 $$ LANGUAGE sql; +CREATE + +CREATE OR REPLACE VIEW memory_result AS SELECT rsgname, ismaster, round_test(avg(memory_usage), 10) AS avg_mem FROM( SELECT rsgname, CASE (j->'key')::text WHEN '"-1"'::text THEN 1 ELSE 0 END AS ismaster, ((j->'value')->>'used')::int AS memory_usage FROM( SELECT rsgname, row_to_json(json_each(memory_usage::json)) AS j FROM gp_toolkit.gp_resgroup_status WHERE rsgname='rg1_memory_test' OR rsgname='rg2_memory_test' )a )b GROUP BY (rsgname, ismaster) ORDER BY rsgname, ismaster; +CREATE + +CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30); +CREATE +CREATE ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +CREATE +CREATE RESOURCE GROUP rg2_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30); +CREATE +CREATE ROLE role2_memory_test RESOURCE GROUP rg2_memory_test; +CREATE + +GRANT ALL ON eat_memory_on_qd TO role1_memory_test; +GRANT +GRANT ALL ON eat_memory_on_one_slice2 TO role1_memory_test; +GRANT +GRANT ALL ON eat_memory_on_slices2 TO role1_memory_test; +GRANT +GRANT ALL ON memory_result TO role1_memory_test; +GRANT + +GRANT ALL ON eat_memory_on_qd TO role2_memory_test; +GRANT +GRANT ALL ON eat_memory_on_one_slice2 TO role2_memory_test; +GRANT +GRANT ALL ON eat_memory_on_slices2 TO role2_memory_test; +GRANT +GRANT ALL ON memory_result TO role2_memory_test; +GRANT + +-- 1.1) QD only in transaction +1: SET ROLE TO role1_memory_test; +SET +-- check initial state +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1: BEGIN; +BEGIN +1: SELECT * FROM eat_memory_on_qd; + hold_memory +------------- + 0 +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 20 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1q: ... + +-- 1.2) QD only +1: SET ROLE TO role1_memory_test; +SET +-- check initial state +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1: SELECT * FROM eat_memory_on_qd; + hold_memory +------------- + 0 +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1q: ... + +-- 2.1) QEs on one slice +1: SET ROLE TO role1_memory_test; +SET +1: SELECT * FROM eat_memory_on_one_slice2; + ?column? +---------- + f +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1q: ... + +-- 2.2) QEs on one slice in transaction +1: SET ROLE TO role1_memory_test; +SET +1: BEGIN; +BEGIN +1: SELECT * FROM eat_memory_on_one_slice2; + ?column? +---------- + f +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 20 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1q: ... + +-- 2.3) QEs on one slice change resource group +1: SET ROLE TO role1_memory_test; +SET +1: SELECT * FROM eat_memory_on_one_slice2; + ?column? +---------- + f +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1: SET ROLE TO role2_memory_test; +SET +1: SELECT * FROM eat_memory_on_one_slice2; + ?column? +---------- + f +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1q: ... + +-- 3) QEs on multiple slices +1: SET ROLE TO role1_memory_test; +SET +1: SELECT * FROM eat_memory_on_slices2; + ?column? +---------- + f +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1q: ... + +-- recheck after cleanup +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) + +-- 4) single role concurrency test +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role1_memory_test; +SET +-- QEs on multiple slices +1: SELECT * FROM eat_memory_on_slices2; + ?column? +---------- + f +(1 row) +2: SELECT * FROM eat_memory_on_slices2; + ?column? +---------- + f +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1q: ... +2q: ... + +-- 5) multi role concurrency test +1: SET ROLE TO role1_memory_test; +SET +2: SET ROLE TO role2_memory_test; +SET +-- QEs on multiple slices +1: SELECT * FROM eat_memory_on_slices2; + ?column? +---------- + f +(1 row) +2: SELECT * FROM eat_memory_on_slices2; + ?column? +---------- + f +(1 row) +SELECT * FROM memory_result; + rsgname | ismaster | avg_mem +-----------------+----------+--------- + rg1_memory_test | 0 | 0 + rg1_memory_test | 1 | 0 + rg2_memory_test | 0 | 0 + rg2_memory_test | 1 | 0 +(4 rows) +1q: ... +2q: ... + +-- cleanup +REVOKE ALL ON eat_memory_on_qd FROM role1_memory_test; +REVOKE +REVOKE ALL ON eat_memory_on_one_slice2 FROM role1_memory_test; +REVOKE +REVOKE ALL ON eat_memory_on_slices2 FROM role1_memory_test; +REVOKE +REVOKE ALL ON memory_result FROM role1_memory_test; +REVOKE + +REVOKE ALL ON eat_memory_on_qd FROM role2_memory_test; +REVOKE +REVOKE ALL ON eat_memory_on_one_slice2 FROM role2_memory_test; +REVOKE +REVOKE ALL ON eat_memory_on_slices2 FROM role2_memory_test; +REVOKE +REVOKE ALL ON memory_result FROM role2_memory_test; +REVOKE + +ALTER ROLE role1_memory_test RESOURCE GROUP none; +ALTER +ALTER ROLE role2_memory_test RESOURCE GROUP none; +ALTER + +DROP ROLE role1_memory_test; +DROP +DROP ROLE role2_memory_test; +DROP +DROP RESOURCE GROUP rg1_memory_test; +DROP +DROP RESOURCE GROUP rg2_memory_test; +DROP +DROP VIEW memory_result; +DROP diff --git a/src/test/singlenode_isolation2/output/resgroup/resgroup_move_query.source b/src/test/singlenode_isolation2/output/resgroup/resgroup_move_query.source new file mode 100644 index 00000000000..056ddc47f40 --- /dev/null +++ b/src/test/singlenode_isolation2/output/resgroup/resgroup_move_query.source @@ -0,0 +1,231 @@ +-- start_matchsubs +-- +-- m/ERROR: process \d+ is in IDLE state/ +-- s/\d+/XXX/g +-- +-- m/ERROR: group \d+ doesn't have enough memory on master, expect:\d+, available:\d+/ +-- s/\d+/XXX/g +-- +-- m/ERROR: group \d+ doesn't have enough memory on segment, expect:\d+, available:\d+/ +-- s/\d+/XXX/g +-- +-- end_matchsubs + +CREATE OR REPLACE FUNCTION resGroupPalloc(float) RETURNS int AS '@abs_builddir@/../regress/regress@DLSUFFIX@', 'resGroupPalloc' LANGUAGE C READS SQL DATA; +CREATE + +CREATE OR REPLACE FUNCTION hold_memory_by_percent(int, float) RETURNS int AS $$ SELECT * FROM resGroupPalloc($2) $$ LANGUAGE sql; +CREATE + +CREATE OR REPLACE FUNCTION hold_memory_by_percent_on_qe(int, float) RETURNS int AS $$ SELECT resGroupPalloc($2) FROM gp_dist_random('gp_id') $$ LANGUAGE sql; +CREATE +-- check whether a query running in the specific group +-- @param pid: the pid of QD +-- @param groupname: resource group id +-- @return bool: true/false indicating whether it the session is in the resource group +-- start_ignore +CREATE LANGUAGE plpython3u; +CREATE +-- end_ignore + +CREATE OR REPLACE FUNCTION is_session_in_group(pid integer, groupname text) RETURNS BOOL AS $$ import subprocess import pg import time import re +conn = pg.connect(dbname="isolation2resgrouptest") pt = re.compile(r'con(\d+)') +sql = "select sess_id from pg_stat_activity where pid = '%d'" % pid result = conn.query(sql).getresult() session_id = result[0][0] +sql = "select groupid from gp_toolkit.gp_resgroup_config where groupname='%s'" % groupname result = conn.query(sql).getresult() groupid = result[0][0] +process = subprocess.Popen("ps -ef | grep postgres | grep con%d | grep -v grep | awk '{print $2}'" % session_id, shell=True, stdout=subprocess.PIPE) session_pids = process.communicate()[0].decode().split('\n')[:-1] +cgroups_pids = [] path = "@cgroup_mnt_point@/cpu/gpdb/%d/cgroup.procs" % groupid fd = open(path) for line in fd.readlines(): cgroups_pids.append(line.strip('\n')) +return set(session_pids).issubset(set(cgroups_pids)) $$ LANGUAGE plpython3u; +CREATE + +DROP ROLE IF EXISTS role_move_query; +DROP +-- start_ignore +DROP RESOURCE GROUP rg_move_query; +ERROR: resource group "rg_move_query" does not exist +-- end_ignore +CREATE RESOURCE GROUP rg_move_query WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE +CREATE ROLE role_move_query RESOURCE GROUP rg_move_query; +CREATE + +-- test1: cannot move IDLE sessions +1: SET ROLE role_move_query; +SET +1: SET gp_vmem_idle_resource_timeout = 0; +SET +SELECT pg_resgroup_move_query(pid, 'admin_group') FROM pg_stat_activity WHERE query LIKE '%gp_vmem_idle_resource_timeout%' AND state = 'idle'; +ERROR: process 506053 is in IDLE state +SELECT is_session_in_group(pid, 'admin_group') FROM pg_stat_activity WHERE query LIKE '%gp_vmem_idle_resource_timeout%' AND state = 'idle'; + is_session_in_group +--------------------- + f +(1 row) + +-- test2: cannot move sessions that are waiting for slot +1: SET ROLE role_move_query; +SET +1: BEGIN; +BEGIN +2: SET ROLE role_move_query; +SET +2&: BEGIN; +SELECT pg_resgroup_move_query(pid, 'default_group') FROM pg_stat_activity WHERE wait_event_type='ResourceGroup'; +ERROR: process 506070 is in IDLE state +SELECT is_session_in_group(pid, 'default_group') FROM pg_stat_activity WHERE wait_event_type='ResourceGroup'; + is_session_in_group +--------------------- + f +(1 row) +1: END; +END +2<: <... completed> +BEGIN +2: END; +END + +-- test3: cannot move sessions that don't have enough memory on QD +CREATE RESOURCE GROUP rg_move_query_mem_small WITH (concurrency=1, cpu_rate_limit=20, memory_limit=10); +CREATE +CREATE ROLE role_move_query_mem_small RESOURCE GROUP rg_move_query_mem_small; +CREATE +1: SET ROLE role_move_query; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent(1,1.0); + hold_memory_by_percent +------------------------ + 0 +(1 row) +SELECT pg_resgroup_move_query(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent%' AND state = 'idle in transaction'; +ERROR: group 115315 doesn't have enough memory on master, expect:2956, available:1478 (resgroup.c:4582) +SELECT is_session_in_group(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent%' AND state = 'idle in transaction'; + is_session_in_group +--------------------- + f +(1 row) +1: END; +END +1q: ... + +-- test4: cannot move sessions that don't have enough memory on QE +1: SET ROLE role_move_query; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent_on_qe(1,1.0); + hold_memory_by_percent_on_qe +------------------------------ + 0 +(1 row) +SELECT pg_resgroup_move_query(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; +ERROR: group 115315 doesn't have enough memory on segment, expect:2956, available:1478 (resgroup.c:4608) +SELECT is_session_in_group(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; + is_session_in_group +--------------------- + f +(1 row) +1: END; +END +1q: ... + +-- test5: move query will wait if the destination group doesn't have slot +1: SET ROLE role_move_query; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent_on_qe(1,0.1); + hold_memory_by_percent_on_qe +------------------------------ + 0 +(1 row) +2: SET ROLE role_move_query_mem_small; +SET +2: BEGIN; +BEGIN +3&: SELECT pg_resgroup_move_query(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; +2: END; +END +3<: <... completed> + pg_resgroup_move_query +------------------------ + t +(1 row) +3: SELECT is_session_in_group(pid, 'rg_move_query_mem_small') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; + is_session_in_group +--------------------- + t +(1 row) +1: END; +END +1q: ... +2q: ... +3q: ... + +-- test6: the destination group will wake up 'pg_resgroup_move_query' when a new slot become available +1: SET ROLE role_move_query; +SET +1&: SELECT pg_sleep(5); +2: SET ROLE role_move_query_mem_small; +SET +2&: SELECT pg_sleep(10); +3&: SELECT pg_resgroup_move_query(pid, 'rg_move_query') FROM pg_stat_activity WHERE query LIKE '%pg_sleep(10)%' AND rsgname='rg_move_query_mem_small'; +1<: <... completed> + pg_sleep +---------- + +(1 row) +-- connection 1 finished, it will wake up connection 3 +3<: <... completed> + pg_resgroup_move_query +------------------------ + t +(1 row) +3: SELECT rsgname, query FROM pg_stat_activity WHERE state = 'active' and query like 'SELECT%'; + rsgname | query +---------------+---------------------------------------------------------------------------------------------- + rg_move_query | SELECT pg_sleep(10); + admin_group | SELECT rsgname, query FROM pg_stat_activity WHERE state = 'active' and query like 'SELECT%'; +(2 rows) +2<: <... completed> + pg_sleep +---------- + +(1 row) +1q: ... +2q: ... +3q: ... + +-- test7: the destination group memory_limit is 0, meaning use the global shared memory +1: ALTER RESOURCE GROUP rg_move_query SET memory_limit 0; +ALTER +1: SET ROLE role_move_query_mem_small; +SET +1: BEGIN; +BEGIN +1: SELECT hold_memory_by_percent_on_qe(1,0.1); + hold_memory_by_percent_on_qe +------------------------------ + 0 +(1 row) +2: SELECT pg_resgroup_move_query(pid, 'rg_move_query') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND rsgname='rg_move_query_mem_small'; + pg_resgroup_move_query +------------------------ + t +(1 row) +2: SELECT is_session_in_group(pid, 'rg_move_query') FROM pg_stat_activity WHERE query LIKE '%hold_memory_by_percent_on_qe%' AND state = 'idle in transaction'; + is_session_in_group +--------------------- + t +(1 row) +1q: ... +2q: ... + +DROP ROLE role_move_query; +DROP +DROP RESOURCE GROUP rg_move_query; +DROP +DROP ROLE role_move_query_mem_small; +DROP +DROP RESOURCE GROUP rg_move_query_mem_small; +DROP diff --git a/src/test/singlenode_isolation2/output/uao/GENERATE_ROW_AND_COLUMN_FILES b/src/test/singlenode_isolation2/output/uao/GENERATE_ROW_AND_COLUMN_FILES new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_isolation2/output/uao/alter_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/alter_while_vacuum.source new file mode 100644 index 00000000000..3c3d0d06391 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/alter_while_vacuum.source @@ -0,0 +1,33 @@ +-- @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 +INSERT INTO alter_while_vacuum_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT 100000 + +DELETE FROM alter_while_vacuum_@amname@ WHERE a < 12000; +DELETE 11999 +1: SELECT COUNT(*) FROM alter_while_vacuum_@amname@; + count +------- + 88001 +(1 row) +1>: ALTER TABLE alter_while_vacuum_@amname@ ADD COLUMN d bigint DEFAULT 10; +2: VACUUM alter_while_vacuum_@amname@; +VACUUM +1<: <... completed> +ALTER +1: SELECT * FROM alter_while_vacuum_@amname@ WHERE a < 12010; + a | b | d +-------+-------+---- + 12000 | 12000 | 10 + 12001 | 12001 | 10 + 12002 | 12002 | 10 + 12003 | 12003 | 10 + 12004 | 12004 | 10 + 12005 | 12005 | 10 + 12006 | 12006 | 10 + 12007 | 12007 | 10 + 12008 | 12008 | 10 + 12009 | 12009 | 10 +(10 rows) diff --git a/src/test/singlenode_isolation2/output/uao/alter_while_vacuum2.source b/src/test/singlenode_isolation2/output/uao/alter_while_vacuum2.source new file mode 100644 index 00000000000..94b4c86cddd --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/alter_while_vacuum2.source @@ -0,0 +1,36 @@ +-- @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 +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT 100000 +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT 100000 +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT 100000 +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT 100000 +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT 100000 +INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; +INSERT 100000 + +DELETE FROM alter_while_vacuum2_@amname@ WHERE a < 12000; +DELETE 71994 +1: SELECT COUNT(*) FROM alter_while_vacuum2_@amname@; + count +-------- + 528006 +(1 row) +2: set debug_appendonly_print_compaction=true; +SET +2>: VACUUM alter_while_vacuum2_@amname@; +1: Alter table alter_while_vacuum2_@amname@ set with ( reorganize='true') distributed randomly; +ALTER +2<: <... completed> +VACUUM +1: SELECT COUNT(*) FROM alter_while_vacuum2_@amname@ WHERE a < 12010; + count +------- + 60 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/bitmapindex_rescan.source b/src/test/singlenode_isolation2/output/uao/bitmapindex_rescan.source new file mode 100644 index 00000000000..526f322b6d9 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/bitmapindex_rescan.source @@ -0,0 +1,50 @@ +-- start_ignore +drop table if exists bir; +drop table if exists yolo cascade; +-- end_ignore +create table bir (a int, b int); +CREATE +insert into bir select i, i from generate_series(1, 5) i; +INSERT 5 + +create table yolo (a int, b int) USING @amname@; +CREATE +create index yolo_idx on yolo using btree (a); +CREATE + +1: begin; +BEGIN +2: begin; +BEGIN +1: insert into yolo select i, i from generate_series(1, 10000) i; +INSERT 10000 +2: insert into yolo select i, i from generate_series(1, 2) i; +INSERT 2 +1: commit; +COMMIT +2: abort; +ABORT + +analyze yolo; +ANALYZE + +-- repro needs a plan with bitmap index join with bir on the outer side +set optimizer_enable_hashjoin = off; +SET +set enable_nestloop = on; +SET +set enable_hashjoin = off; +SET +set enable_seqscan = off; +SET + +select * from bir left join yolo on (bir.a = yolo.a); + a | b | a | b +---+---+---+--- + 1 | 1 | 1 | 1 + 2 | 2 | 2 | 2 + 3 | 3 | 3 | 3 + 4 | 4 | 4 | 4 + 5 | 5 | 5 | 5 +(5 rows) + diff --git a/src/test/singlenode_isolation2/output/uao/compaction_full_stats.source b/src/test/singlenode_isolation2/output/uao/compaction_full_stats.source new file mode 100644 index 00000000000..e21b39c4248 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/compaction_full_stats.source @@ -0,0 +1,49 @@ +-- @Description Tests the behavior of full vacuum w.r.t. the pg_class statistics +-- +DROP TABLE IF EXISTS foo; +DROP + +CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; +CREATE +CREATE INDEX foo_index ON foo(b); +CREATE +INSERT INTO foo SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT 50 +INSERT INTO foo SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +INSERT 50 +ANALYZE foo; +ANALYZE + +-- ensure that the scan go through the index +SET enable_seqscan=false; +SET +SELECT relname, reltuples FROM pg_class WHERE relname = 'foo'; + relname | reltuples +---------+----------- + foo | 100 +(1 row) +SELECT relname, reltuples FROM pg_class WHERE relname = 'foo_index'; + relname | reltuples +-----------+----------- + foo_index | 100 +(1 row) +DELETE FROM foo WHERE a < 16; +DELETE 15 +VACUUM FULL foo; +VACUUM +SELECT relname, reltuples FROM pg_class WHERE relname = 'foo'; + relname | reltuples +---------+----------- + foo | 85 +(1 row) +SELECT relname, reltuples FROM pg_class WHERE relname = 'foo_index'; + relname | reltuples +-----------+----------- + foo_index | 85 +(1 row) +-- in case there's autovacuum worker running in the backend, the aoseg will not be dropped which has state = 2 +SELECT segno, tupcount,state FROM gp_ao_or_aocs_seg('foo') where state = 1 and tupcount > 0; + segno | tupcount | state +-------+----------+------- + 1 | 85 | 1 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/compaction_utility.source b/src/test/singlenode_isolation2/output/uao/compaction_utility.source new file mode 100644 index 00000000000..0ae471d7212 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/compaction_utility.source @@ -0,0 +1,36 @@ +-- @Description Tests the basic behavior of (lazy) vacuum when called from utility mode +-- +DROP TABLE IF EXISTS foo; +DROP +CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; +CREATE +CREATE INDEX foo_index ON foo(b); +CREATE +INSERT INTO foo SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; +INSERT 100 + +DELETE FROM foo WHERE a < 20; +DELETE 19 +SELECT COUNT(*) FROM foo; + count +------- + 81 +(1 row) +0U: SELECT segno, state, case when tupcount = 0 then 'zero' when tupcount <= 5 then 'few' else 'many' end FROM gp_ao_or_aocs_seg('foo'); + segno | state | case +-------+-------+------ + 1 | 1 | many +(1 row) +0U: VACUUM foo; +VACUUM +SELECT COUNT(*) FROM foo; + count +------- + 81 +(1 row) +0U: SELECT segno, state, case when tupcount = 0 then 'zero' when tupcount <= 5 then 'few' else 'many' end FROM gp_ao_or_aocs_seg('foo'); + segno | state | case +-------+-------+------ + 0 | 1 | many + 1 | 2 | many +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/compaction_utility_2.source b/src/test/singlenode_isolation2/output/uao/compaction_utility_2.source new file mode 100644 index 00000000000..d3c2c5c9ebd --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/compaction_utility_2.source @@ -0,0 +1,31 @@ +-- @Description Tests the basic behavior of (lazy) vacuum when called from utility mode +-- +DROP TABLE IF EXISTS foo; +DROP +CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; +CREATE +CREATE INDEX foo_index ON foo(b); +CREATE +INSERT INTO foo SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; +INSERT 100 + +DELETE FROM foo WHERE a < 20; +DELETE 19 +SELECT COUNT(*) FROM foo; + count +------- + 81 +(1 row) +2U: VACUUM foo; +VACUUM +SELECT COUNT(*) FROM foo; + count +------- + 81 +(1 row) +2U: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('foo'); + segno | tupcount +-------+---------- + 0 | 40 + 1 | 0 +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/compaction_utility_insert.source b/src/test/singlenode_isolation2/output/uao/compaction_utility_insert.source new file mode 100644 index 00000000000..ba037d2ee6c --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/compaction_utility_insert.source @@ -0,0 +1,29 @@ +-- @Description Tests the compaction of data inserted in utility mode +-- +DROP TABLE IF EXISTS foo; +DROP +CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@ distributed randomly; +CREATE +CREATE INDEX foo_index ON foo(b); +CREATE + +0U: INSERT INTO foo VALUES (2, 2, 'c'); +INSERT 1 +0U: INSERT INTO foo VALUES (3, 3, 'c'); +INSERT 1 +SELECT *, segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); + segment_id | segno | tupcount | modcount | formatversion | state | segno | tupcount | state +------------+-------+----------+----------+---------------+-------+-------+----------+------- + 0 | 0 | 2 | 2 | 3 | 1 | 0 | 2 | 1 +(1 row) +DELETE FROM foo WHERE a = 2; +DELETE 1 +UPDATE foo SET b = -1 WHERE a = 3; +UPDATE 1 +VACUUM foo; +VACUUM +SELECT segment_id, segno, tupcount, state FROM gp_ao_or_aocs_seg('foo') where state = 1 and tupcount > 0; + segment_id | segno | tupcount | state +------------+-------+----------+------- + 0 | 1 | 1 | 1 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/compaction_utility_insert_2.source b/src/test/singlenode_isolation2/output/uao/compaction_utility_insert_2.source new file mode 100644 index 00000000000..f3bc1a0f400 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/compaction_utility_insert_2.source @@ -0,0 +1,52 @@ +-- @Description Tests the compaction of data inserted in utility mode +-- +DROP TABLE IF EXISTS foo; +DROP +CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; +CREATE +CREATE INDEX foo_index ON foo(b); +CREATE + +INSERT INTO foo VALUES (1, 1, 'c'); +INSERT 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 +2U: INSERT INTO foo VALUES (3, 3, 'c'); +INSERT 1 +2U: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); + segno | tupcount | state +-------+----------+------- + 0 | 2 | 1 + 1 | 1 | 1 +(2 rows) +-- We know that the master does update its tupcount yet +SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); + segno | tupcount | state +-------+----------+------- + 1 | 1 | 1 +(1 row) +DELETE FROM foo WHERE a = 2; +DELETE 0 +UPDATE foo SET b = -1 WHERE a = 3; +UPDATE 1 +VACUUM foo; +VACUUM +2U: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); + segno | tupcount | state +-------+----------+------- + 0 | 0 | 1 + 1 | 2 | 1 + 2 | 1 | 1 + 3 | 0 | 1 +(4 rows) +SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); + segno | tupcount | state +-------+----------+------- + 1 | 2 | 1 + 2 | 1 | 1 +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/cursor_before_delete.source b/src/test/singlenode_isolation2/output/uao/cursor_before_delete.source new file mode 100644 index 00000000000..c7a9ddc8fc0 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/cursor_before_delete.source @@ -0,0 +1,61 @@ +-- @Description Tests the visibility when a cursor has been created before the delete. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1, 100); +INSERT 100 + +1: BEGIN; +BEGIN +1: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; +DECLARE +1: FETCH NEXT IN cur; + a +--- + 1 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 2 +(1 row) +2: BEGIN; +BEGIN +2: DELETE FROM ao WHERE a < 5; +DELETE 4 +2: COMMIT; +COMMIT +1: FETCH NEXT IN cur; + a +--- + 3 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 4 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 5 +(1 row) +1: CLOSE cur; +CLOSE +1: COMMIT; +COMMIT +3: BEGIN; +BEGIN +3: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; +DECLARE +3: FETCH NEXT IN cur; + a +--- + 5 +(1 row) +3: CLOSE cur; +CLOSE +3: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/cursor_before_deletevacuum.source b/src/test/singlenode_isolation2/output/uao/cursor_before_deletevacuum.source new file mode 100644 index 00000000000..ee1dddd8d58 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/cursor_before_deletevacuum.source @@ -0,0 +1,64 @@ +-- @Description Tests the visibility when a cursor has been created before the delete. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1, 10); +INSERT 10 + +1: BEGIN; +BEGIN +1: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; +DECLARE +1: FETCH NEXT IN cur; + a +--- + 1 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 2 +(1 row) +2: BEGIN; +BEGIN +2: DELETE FROM ao WHERE a < 5; +DELETE 4 +2: COMMIT; +COMMIT +2&: VACUUM FULL ao; +1: FETCH NEXT IN cur; + a +--- + 3 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 4 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 5 +(1 row) +1: CLOSE cur; +CLOSE +1: COMMIT; +COMMIT +2<: <... completed> +VACUUM +3: BEGIN; +BEGIN +3: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; +DECLARE +3: FETCH NEXT IN cur; + a +--- + 5 +(1 row) +3: CLOSE cur; +CLOSE +3: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/cursor_before_update.source b/src/test/singlenode_isolation2/output/uao/cursor_before_update.source new file mode 100644 index 00000000000..f0998ea3e68 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/cursor_before_update.source @@ -0,0 +1,61 @@ +-- @Description Tests the visibility when a cursor has been created before the update. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,100) AS i; +INSERT 100 + +1: BEGIN; +BEGIN +1: DECLARE cur CURSOR FOR SELECT a,b FROM ao ORDER BY a; +DECLARE +1: FETCH NEXT IN cur; + a | b +---+--- + 1 | 1 +(1 row) +1: FETCH NEXT IN cur; + a | b +---+--- + 2 | 2 +(1 row) +2: BEGIN; +BEGIN +2: UPDATE ao SET b = 8 WHERE a < 5; +UPDATE 4 +2: COMMIT; +COMMIT +1: FETCH NEXT IN cur; + a | b +---+--- + 3 | 3 +(1 row) +1: FETCH NEXT IN cur; + a | b +---+--- + 4 | 4 +(1 row) +1: FETCH NEXT IN cur; + a | b +---+--- + 5 | 5 +(1 row) +1: CLOSE cur; +CLOSE +1: COMMIT; +COMMIT +3: BEGIN; +BEGIN +3: DECLARE cur CURSOR FOR SELECT a,b FROM ao ORDER BY a; +DECLARE +3: FETCH NEXT IN cur; + a | b +---+--- + 1 | 8 +(1 row) +3: CLOSE cur; +CLOSE +3: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/cursor_withhold.source b/src/test/singlenode_isolation2/output/uao/cursor_withhold.source new file mode 100644 index 00000000000..eec08b9c2af --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/cursor_withhold.source @@ -0,0 +1,53 @@ +-- @Description Tests the visibility of an "with hold" cursor w.r.t. deletes. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,100); +INSERT 100 + +1: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; +DECLARE +1: FETCH NEXT IN cur; + a +--- + 1 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 2 +(1 row) +2: BEGIN; +BEGIN +2: DELETE FROM ao WHERE a < 5; +DELETE 4 +2: COMMIT; +COMMIT +1: FETCH NEXT IN cur; + a +--- + 3 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 4 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 5 +(1 row) +1: CLOSE cur; +CLOSE +3: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; +DECLARE +3: FETCH NEXT IN cur; + a +--- + 5 +(1 row) +3: CLOSE cur; +CLOSE diff --git a/src/test/singlenode_isolation2/output/uao/cursor_withhold2.source b/src/test/singlenode_isolation2/output/uao/cursor_withhold2.source new file mode 100644 index 00000000000..3a63dbd2c0f --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/cursor_withhold2.source @@ -0,0 +1,59 @@ +-- @Description Tests the visibility of an "with hold" cursor w.r.t. deletes. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,10); +INSERT 10 + +1: BEGIN; +BEGIN +1: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; +DECLARE +1: FETCH NEXT IN cur; + a +--- + 1 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 2 +(1 row) +1: COMMIT; +COMMIT +2: BEGIN; +BEGIN +2: DELETE FROM ao WHERE a < 5; +DELETE 4 +2: COMMIT; +COMMIT +3: VACUUM ao; +VACUUM +1: FETCH NEXT IN cur; + a +--- + 3 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 4 +(1 row) +1: FETCH NEXT IN cur; + a +--- + 5 +(1 row) +1: CLOSE cur; +CLOSE +3: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; +DECLARE +3: FETCH NEXT IN cur; + a +--- + 5 +(1 row) +3: CLOSE cur; +CLOSE diff --git a/src/test/singlenode_isolation2/output/uao/delete_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/delete_while_vacuum.source new file mode 100644 index 00000000000..c32d7c805a6 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/delete_while_vacuum.source @@ -0,0 +1,31 @@ +-- @Description Ensures that a delete before a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + + +DELETE FROM ao WHERE a < 12; +DELETE 11 +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM ao; + count +------- + 89 +(1 row) +1>: DELETE FROM ao WHERE a < 90;COMMIT; +2: VACUUM ao; +VACUUM +1<: <... completed> +DELETE +1: SELECT COUNT(*) FROM ao; + count +------- + 11 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/insert_policy.source b/src/test/singlenode_isolation2/output/uao/insert_policy.source new file mode 100644 index 00000000000..9d5bbf9cfb1 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/insert_policy.source @@ -0,0 +1,90 @@ +-- @Description Tests the AO segment file selection policy +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +-- Case 1: Both transactions insert initial segment files into aoseg. +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: INSERT INTO AO VALUES (1); +INSERT 1 +-- Segment file 1 should be created +3: SELECT segno FROM gp_ao_or_aocs_seg('ao'); + segno +------- + 1 +(1 row) +2: INSERT INTO AO VALUES (1); +INSERT 1 +-- Segment file 2 should be created +3: SELECT segno FROM gp_ao_or_aocs_seg('ao'); + segno +------- + 1 + 2 +(2 rows) +2: COMMIT; +COMMIT +-- Transaction 2 should commit before 1. It validates that +-- transaction 2 chose a different segfile than transaction 1. +1: COMMIT; +COMMIT +3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 1 | 1 + 2 | 1 +(2 rows) + +-- Case 2: Concurrent inserts with existing segment files in aoseg. +1: INSERT INTO AO VALUES (1); +INSERT 1 +3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 1 | 2 + 2 | 1 +(2 rows) +-- 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 +3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 1 | 2 + 2 | 2 +(2 rows) +1: BEGIN; +BEGIN +1: INSERT INTO AO VALUES (15); +INSERT 1 +2: BEGIN; +BEGIN +2: INSERT INTO AO VALUES (15); +INSERT 1 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 1 | 3 + 2 | 3 +(2 rows) +1: insert into ao select generate_series(1,100000); +INSERT 100000 +1: INSERT INTO AO VALUES (15); +INSERT 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 +-------+------ + 1 | many + 1 | many + 1 | many + 2 | few +(4 rows) diff --git a/src/test/singlenode_isolation2/output/uao/insert_policy_2.source b/src/test/singlenode_isolation2/output/uao/insert_policy_2.source new file mode 100644 index 00000000000..a763a89bb7d --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/insert_policy_2.source @@ -0,0 +1,300 @@ +-- @Description Tests the AO segment file selection policy +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 +1: INSERT INTO AO VALUES (1); +INSERT 1 + +-- Actual test begins +1: INSERT INTO AO VALUES (1); +INSERT 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 +2U: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 1 | 127 +(1 row) +1: BEGIN; +BEGIN +1: INSERT INTO AO VALUES (2); +INSERT 1 +2: BEGIN; +BEGIN +2: INSERT INTO AO VALUES (2); +INSERT 1 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +2U: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 1 | 127 +(1 row) +1: insert into ao select generate_series(1,100000); +INSERT 100000 +1: INSERT INTO AO VALUES (2); +INSERT 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 +-------+------ + 1 | many +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/insert_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/insert_while_vacuum.source new file mode 100644 index 00000000000..8203db799f3 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/insert_while_vacuum.source @@ -0,0 +1,65 @@ +-- @Description Ensures that an insert during a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +2>: VACUUM ao; +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 +2<: <... completed> +VACUUM +3: SELECT COUNT(*) FROM ao WHERE a = 1500; + count +------- + 20 +(1 row) +4: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/limit_indexscan_inits.source b/src/test/singlenode_isolation2/output/uao/limit_indexscan_inits.source new file mode 100644 index 00000000000..18c52dbdc27 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/limit_indexscan_inits.source @@ -0,0 +1,95 @@ +-- This is intended to test lastSequence initialization during indexscan should be limited +-- to the scope of the target scanning AO/CO segfiles, rather than the max 128 segfiles. +-- The theory is comparing the count of indexscan (or pg_stat_all_tables.idx_scan) between +-- pre and post query on bitmapheapscan(could trigger indexscan) plan. +-- We are using gp_ao_or_aocs_seg() helper UDF to obtain the number of AO/CO segfiles (segnos), +-- then plus 1 to count in segfile0 due to the implementation constraint. +-- For BTREE index, we verify the equation: post_nscans - pre_nscans == segnos + 1; +-- for BRIN index, we verify the equation: post_nscans - pre_nscans == (segnos + 1) * 2. +-- BRIN index doubles the number of nscans of BTREE because lastSequence was initialized twice +-- during BRIN indexed bitmapheapscan (in index_getbitmap and ao/co fetch_init), which is probably +-- optimizable, too. + +create or replace function test_iscan_inits_same_as_aosegs(tablename text, icol text, itype text) returns bool as $$ declare segnos smallint; /* in func */ pre_nscans smallint; /* in func */ post_nscans smallint; /* in func */ result bool; /* in func */ begin select count(segno) into segnos from gp_ao_or_aocs_seg(tablename); /* in func */ +select pg_stat_get_xact_numscans('gp_fastsequence_objid_objmod_index'::regclass) into pre_nscans; /* get idx_scan before query */ execute 'select * from ' || quote_ident(tablename) || ' where ' || quote_ident(icol) || ' = 2'; /* vaule 2 is distributed to the segment with content 0 */ select pg_stat_get_xact_numscans('gp_fastsequence_objid_objmod_index'::regclass) into post_nscans; /* get idx_scan after query */ +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 into result; /* BRIN doubles nscans(of BTREE) due to implementation constraint */ raise notice '[BRIN] expect: post_nscans - pre_nscans == (segnos + 1) * 2'; /* 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 + +set default_table_access_method=@amname@; +SET + +create table @amname@_limit_iscan_inits_tbl (a int, b int, c int, d int); +CREATE +create index on @amname@_limit_iscan_inits_tbl(a); +CREATE +create index on @amname@_limit_iscan_inits_tbl using brin (b); +CREATE + +-- 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 + +2: begin; +BEGIN +2: insert into @amname@_limit_iscan_inits_tbl select a, a, a, a from generate_series(11, 20)a; +INSERT 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 + +1: end; +END +2: end; +END +3: end; +END + +-- diable seqscan +0U: set enable_seqscan = off; +SET +-- make sure it goes to bitmapheapscan +-- start_ignore +0U: explain (costs off) select * from @amname@_limit_iscan_inits_tbl where a = 2; + QUERY PLAN +------------------------------------------------------------------ + Bitmap Heap Scan on @amname@_limit_iscan_inits_tbl + Recheck Cond: (a = 2) + -> Bitmap Index Scan on @amname@_limit_iscan_inits_tbl_a_idx + Index Cond: (a = 2) + Optimizer: Postgres query optimizer +(5 rows) +0U: explain (costs off) select * from @amname@_limit_iscan_inits_tbl where b = 2; + QUERY PLAN +------------------------------------------------------------------ + Bitmap Heap Scan on @amname@_limit_iscan_inits_tbl + Recheck Cond: (b = 2) + -> Bitmap Index Scan on @amname@_limit_iscan_inits_tbl_a_idx + Index Cond: (b = 2) + Optimizer: Postgres query optimizer +(5 rows) +-- end_ignore +-- expect to return true +0U: select test_iscan_inits_same_as_aosegs('@amname@_limit_iscan_inits_tbl', 'a', 'btree'); + test_iscan_inits_same_as_aosegs +--------------------------------- + t +(1 row) +0U: select test_iscan_inits_same_as_aosegs('@amname@_limit_iscan_inits_tbl', 'b', 'brin'); + test_iscan_inits_same_as_aosegs +--------------------------------- + t +(1 row) +0Uq: ... + +drop table @amname@_limit_iscan_inits_tbl; +DROP +drop function test_iscan_inits_same_as_aosegs; +DROP +reset default_table_access_method; +RESET diff --git a/src/test/singlenode_isolation2/output/uao/max_concurrency.source b/src/test/singlenode_isolation2/output/uao/max_concurrency.source new file mode 100644 index 00000000000..ceef158ed08 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/max_concurrency.source @@ -0,0 +1,1037 @@ +-- @Description Insert into a ao relation with 127 concurrent transactions +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE + +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 130; +ALTER + +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +3: BEGIN; +BEGIN +4: BEGIN; +BEGIN +5: BEGIN; +BEGIN +6: BEGIN; +BEGIN +7: BEGIN; +BEGIN +8: BEGIN; +BEGIN +9: BEGIN; +BEGIN +10: BEGIN; +BEGIN +11: BEGIN; +BEGIN +12: BEGIN; +BEGIN +13: BEGIN; +BEGIN +14: BEGIN; +BEGIN +15: BEGIN; +BEGIN +16: BEGIN; +BEGIN +17: BEGIN; +BEGIN +18: BEGIN; +BEGIN +19: BEGIN; +BEGIN +20: BEGIN; +BEGIN +21: BEGIN; +BEGIN +22: BEGIN; +BEGIN +23: BEGIN; +BEGIN +24: BEGIN; +BEGIN +25: BEGIN; +BEGIN +26: BEGIN; +BEGIN +27: BEGIN; +BEGIN +28: BEGIN; +BEGIN +29: BEGIN; +BEGIN +30: BEGIN; +BEGIN +31: BEGIN; +BEGIN +32: BEGIN; +BEGIN +33: BEGIN; +BEGIN +34: BEGIN; +BEGIN +35: BEGIN; +BEGIN +36: BEGIN; +BEGIN +37: BEGIN; +BEGIN +38: BEGIN; +BEGIN +39: BEGIN; +BEGIN +40: BEGIN; +BEGIN +41: BEGIN; +BEGIN +42: BEGIN; +BEGIN +43: BEGIN; +BEGIN +44: BEGIN; +BEGIN +45: BEGIN; +BEGIN +46: BEGIN; +BEGIN +47: BEGIN; +BEGIN +48: BEGIN; +BEGIN +49: BEGIN; +BEGIN +50: BEGIN; +BEGIN +51: BEGIN; +BEGIN +52: BEGIN; +BEGIN +53: BEGIN; +BEGIN +54: BEGIN; +BEGIN +55: BEGIN; +BEGIN +56: BEGIN; +BEGIN +57: BEGIN; +BEGIN +58: BEGIN; +BEGIN +59: BEGIN; +BEGIN +60: BEGIN; +BEGIN +61: BEGIN; +BEGIN +62: BEGIN; +BEGIN +63: BEGIN; +BEGIN +64: BEGIN; +BEGIN +65: BEGIN; +BEGIN +66: BEGIN; +BEGIN +67: BEGIN; +BEGIN +68: BEGIN; +BEGIN +69: BEGIN; +BEGIN +70: BEGIN; +BEGIN +71: BEGIN; +BEGIN +72: BEGIN; +BEGIN +73: BEGIN; +BEGIN +74: BEGIN; +BEGIN +75: BEGIN; +BEGIN +76: BEGIN; +BEGIN +77: BEGIN; +BEGIN +78: BEGIN; +BEGIN +79: BEGIN; +BEGIN +80: BEGIN; +BEGIN +81: BEGIN; +BEGIN +82: BEGIN; +BEGIN +83: BEGIN; +BEGIN +84: BEGIN; +BEGIN +85: BEGIN; +BEGIN +86: BEGIN; +BEGIN +87: BEGIN; +BEGIN +88: BEGIN; +BEGIN +89: BEGIN; +BEGIN +90: BEGIN; +BEGIN +91: BEGIN; +BEGIN +92: BEGIN; +BEGIN +93: BEGIN; +BEGIN +94: BEGIN; +BEGIN +95: BEGIN; +BEGIN +96: BEGIN; +BEGIN +97: BEGIN; +BEGIN +98: BEGIN; +BEGIN +99: BEGIN; +BEGIN +100: BEGIN; +BEGIN +101: BEGIN; +BEGIN +102: BEGIN; +BEGIN +103: BEGIN; +BEGIN +104: BEGIN; +BEGIN +105: BEGIN; +BEGIN +106: BEGIN; +BEGIN +107: BEGIN; +BEGIN +108: BEGIN; +BEGIN +109: BEGIN; +BEGIN +110: BEGIN; +BEGIN +111: BEGIN; +BEGIN +112: BEGIN; +BEGIN +113: BEGIN; +BEGIN +114: BEGIN; +BEGIN +115: BEGIN; +BEGIN +116: BEGIN; +BEGIN +117: BEGIN; +BEGIN +118: BEGIN; +BEGIN +119: BEGIN; +BEGIN +120: BEGIN; +BEGIN +121: BEGIN; +BEGIN +122: BEGIN; +BEGIN +123: BEGIN; +BEGIN +124: BEGIN; +BEGIN +125: BEGIN; +BEGIN +126: BEGIN; +BEGIN +127: BEGIN; +BEGIN +1: INSERT INTO AO VALUES (1, 1); +INSERT 1 +2: INSERT INTO AO VALUES (1, 1); +INSERT 1 +3: INSERT INTO AO VALUES (1, 1); +INSERT 1 +4: INSERT INTO AO VALUES (1, 1); +INSERT 1 +5: INSERT INTO AO VALUES (1, 1); +INSERT 1 +6: INSERT INTO AO VALUES (1, 1); +INSERT 1 +7: INSERT INTO AO VALUES (1, 1); +INSERT 1 +8: INSERT INTO AO VALUES (1, 1); +INSERT 1 +9: INSERT INTO AO VALUES (1, 1); +INSERT 1 +10: INSERT INTO AO VALUES (1, 1); +INSERT 1 +11: INSERT INTO AO VALUES (1, 1); +INSERT 1 +12: INSERT INTO AO VALUES (1, 1); +INSERT 1 +13: INSERT INTO AO VALUES (1, 1); +INSERT 1 +14: INSERT INTO AO VALUES (1, 1); +INSERT 1 +15: INSERT INTO AO VALUES (1, 1); +INSERT 1 +16: INSERT INTO AO VALUES (1, 1); +INSERT 1 +17: INSERT INTO AO VALUES (1, 1); +INSERT 1 +18: INSERT INTO AO VALUES (1, 1); +INSERT 1 +19: INSERT INTO AO VALUES (1, 1); +INSERT 1 +20: INSERT INTO AO VALUES (1, 1); +INSERT 1 +21: INSERT INTO AO VALUES (1, 1); +INSERT 1 +22: INSERT INTO AO VALUES (1, 1); +INSERT 1 +23: INSERT INTO AO VALUES (1, 1); +INSERT 1 +24: INSERT INTO AO VALUES (1, 1); +INSERT 1 +25: INSERT INTO AO VALUES (1, 1); +INSERT 1 +26: INSERT INTO AO VALUES (1, 1); +INSERT 1 +27: INSERT INTO AO VALUES (1, 1); +INSERT 1 +28: INSERT INTO AO VALUES (1, 1); +INSERT 1 +29: INSERT INTO AO VALUES (1, 1); +INSERT 1 +30: INSERT INTO AO VALUES (1, 1); +INSERT 1 +31: INSERT INTO AO VALUES (1, 1); +INSERT 1 +32: INSERT INTO AO VALUES (1, 1); +INSERT 1 +33: INSERT INTO AO VALUES (1, 1); +INSERT 1 +34: INSERT INTO AO VALUES (1, 1); +INSERT 1 +35: INSERT INTO AO VALUES (1, 1); +INSERT 1 +36: INSERT INTO AO VALUES (1, 1); +INSERT 1 +37: INSERT INTO AO VALUES (1, 1); +INSERT 1 +38: INSERT INTO AO VALUES (1, 1); +INSERT 1 +39: INSERT INTO AO VALUES (1, 1); +INSERT 1 +40: INSERT INTO AO VALUES (1, 1); +INSERT 1 +41: INSERT INTO AO VALUES (1, 1); +INSERT 1 +42: INSERT INTO AO VALUES (1, 1); +INSERT 1 +43: INSERT INTO AO VALUES (1, 1); +INSERT 1 +44: INSERT INTO AO VALUES (1, 1); +INSERT 1 +45: INSERT INTO AO VALUES (1, 1); +INSERT 1 +46: INSERT INTO AO VALUES (1, 1); +INSERT 1 +47: INSERT INTO AO VALUES (1, 1); +INSERT 1 +48: INSERT INTO AO VALUES (1, 1); +INSERT 1 +49: INSERT INTO AO VALUES (1, 1); +INSERT 1 +50: INSERT INTO AO VALUES (1, 1); +INSERT 1 +51: INSERT INTO AO VALUES (1, 1); +INSERT 1 +52: INSERT INTO AO VALUES (1, 1); +INSERT 1 +53: INSERT INTO AO VALUES (1, 1); +INSERT 1 +54: INSERT INTO AO VALUES (1, 1); +INSERT 1 +55: INSERT INTO AO VALUES (1, 1); +INSERT 1 +56: INSERT INTO AO VALUES (1, 1); +INSERT 1 +57: INSERT INTO AO VALUES (1, 1); +INSERT 1 +58: INSERT INTO AO VALUES (1, 1); +INSERT 1 +59: INSERT INTO AO VALUES (1, 1); +INSERT 1 +60: INSERT INTO AO VALUES (1, 1); +INSERT 1 +61: INSERT INTO AO VALUES (1, 1); +INSERT 1 +62: INSERT INTO AO VALUES (1, 1); +INSERT 1 +63: INSERT INTO AO VALUES (1, 1); +INSERT 1 +64: INSERT INTO AO VALUES (1, 1); +INSERT 1 +65: INSERT INTO AO VALUES (1, 1); +INSERT 1 +66: INSERT INTO AO VALUES (1, 1); +INSERT 1 +67: INSERT INTO AO VALUES (1, 1); +INSERT 1 +68: INSERT INTO AO VALUES (1, 1); +INSERT 1 +69: INSERT INTO AO VALUES (1, 1); +INSERT 1 +70: INSERT INTO AO VALUES (1, 1); +INSERT 1 +71: INSERT INTO AO VALUES (1, 1); +INSERT 1 +72: INSERT INTO AO VALUES (1, 1); +INSERT 1 +73: INSERT INTO AO VALUES (1, 1); +INSERT 1 +74: INSERT INTO AO VALUES (1, 1); +INSERT 1 +75: INSERT INTO AO VALUES (1, 1); +INSERT 1 +76: INSERT INTO AO VALUES (1, 1); +INSERT 1 +77: INSERT INTO AO VALUES (1, 1); +INSERT 1 +78: INSERT INTO AO VALUES (1, 1); +INSERT 1 +79: INSERT INTO AO VALUES (1, 1); +INSERT 1 +80: INSERT INTO AO VALUES (1, 1); +INSERT 1 +81: INSERT INTO AO VALUES (1, 1); +INSERT 1 +82: INSERT INTO AO VALUES (1, 1); +INSERT 1 +83: INSERT INTO AO VALUES (1, 1); +INSERT 1 +84: INSERT INTO AO VALUES (1, 1); +INSERT 1 +85: INSERT INTO AO VALUES (1, 1); +INSERT 1 +86: INSERT INTO AO VALUES (1, 1); +INSERT 1 +87: INSERT INTO AO VALUES (1, 1); +INSERT 1 +88: INSERT INTO AO VALUES (1, 1); +INSERT 1 +89: INSERT INTO AO VALUES (1, 1); +INSERT 1 +90: INSERT INTO AO VALUES (1, 1); +INSERT 1 +91: INSERT INTO AO VALUES (1, 1); +INSERT 1 +92: INSERT INTO AO VALUES (1, 1); +INSERT 1 +93: INSERT INTO AO VALUES (1, 1); +INSERT 1 +94: INSERT INTO AO VALUES (1, 1); +INSERT 1 +95: INSERT INTO AO VALUES (1, 1); +INSERT 1 +96: INSERT INTO AO VALUES (1, 1); +INSERT 1 +97: INSERT INTO AO VALUES (1, 1); +INSERT 1 +98: INSERT INTO AO VALUES (1, 1); +INSERT 1 +99: INSERT INTO AO VALUES (1, 1); +INSERT 1 +100: INSERT INTO AO VALUES (1, 1); +INSERT 1 +101: INSERT INTO AO VALUES (1, 1); +INSERT 1 +102: INSERT INTO AO VALUES (1, 1); +INSERT 1 +103: INSERT INTO AO VALUES (1, 1); +INSERT 1 +104: INSERT INTO AO VALUES (1, 1); +INSERT 1 +105: INSERT INTO AO VALUES (1, 1); +INSERT 1 +106: INSERT INTO AO VALUES (1, 1); +INSERT 1 +107: INSERT INTO AO VALUES (1, 1); +INSERT 1 +108: INSERT INTO AO VALUES (1, 1); +INSERT 1 +109: INSERT INTO AO VALUES (1, 1); +INSERT 1 +110: INSERT INTO AO VALUES (1, 1); +INSERT 1 +111: INSERT INTO AO VALUES (1, 1); +INSERT 1 +112: INSERT INTO AO VALUES (1, 1); +INSERT 1 +113: INSERT INTO AO VALUES (1, 1); +INSERT 1 +114: INSERT INTO AO VALUES (1, 1); +INSERT 1 +115: INSERT INTO AO VALUES (1, 1); +INSERT 1 +116: INSERT INTO AO VALUES (1, 1); +INSERT 1 +117: INSERT INTO AO VALUES (1, 1); +INSERT 1 +118: INSERT INTO AO VALUES (1, 1); +INSERT 1 +119: INSERT INTO AO VALUES (1, 1); +INSERT 1 +120: INSERT INTO AO VALUES (1, 1); +INSERT 1 +121: INSERT INTO AO VALUES (1, 1); +INSERT 1 +122: INSERT INTO AO VALUES (1, 1); +INSERT 1 +123: INSERT INTO AO VALUES (1, 1); +INSERT 1 +124: INSERT INTO AO VALUES (1, 1); +INSERT 1 +125: INSERT INTO AO VALUES (1, 1); +INSERT 1 +126: INSERT INTO AO VALUES (1, 1); +INSERT 1 +127: INSERT INTO AO VALUES (1, 1); +INSERT 1 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: COMMIT; +COMMIT +4: COMMIT; +COMMIT +5: COMMIT; +COMMIT +6: COMMIT; +COMMIT +7: COMMIT; +COMMIT +8: COMMIT; +COMMIT +9: COMMIT; +COMMIT +10: COMMIT; +COMMIT +11: COMMIT; +COMMIT +12: COMMIT; +COMMIT +13: COMMIT; +COMMIT +14: COMMIT; +COMMIT +15: COMMIT; +COMMIT +16: COMMIT; +COMMIT +17: COMMIT; +COMMIT +18: COMMIT; +COMMIT +19: COMMIT; +COMMIT +20: COMMIT; +COMMIT +21: COMMIT; +COMMIT +22: COMMIT; +COMMIT +23: COMMIT; +COMMIT +24: COMMIT; +COMMIT +25: COMMIT; +COMMIT +26: COMMIT; +COMMIT +27: COMMIT; +COMMIT +28: COMMIT; +COMMIT +29: COMMIT; +COMMIT +30: COMMIT; +COMMIT +31: COMMIT; +COMMIT +32: COMMIT; +COMMIT +33: COMMIT; +COMMIT +34: COMMIT; +COMMIT +35: COMMIT; +COMMIT +36: COMMIT; +COMMIT +37: COMMIT; +COMMIT +38: COMMIT; +COMMIT +39: COMMIT; +COMMIT +40: COMMIT; +COMMIT +41: COMMIT; +COMMIT +42: COMMIT; +COMMIT +43: COMMIT; +COMMIT +44: COMMIT; +COMMIT +45: COMMIT; +COMMIT +46: COMMIT; +COMMIT +47: COMMIT; +COMMIT +48: COMMIT; +COMMIT +49: COMMIT; +COMMIT +50: COMMIT; +COMMIT +51: COMMIT; +COMMIT +52: COMMIT; +COMMIT +53: COMMIT; +COMMIT +54: COMMIT; +COMMIT +55: COMMIT; +COMMIT +56: COMMIT; +COMMIT +57: COMMIT; +COMMIT +58: COMMIT; +COMMIT +59: COMMIT; +COMMIT +60: COMMIT; +COMMIT +61: COMMIT; +COMMIT +62: COMMIT; +COMMIT +63: COMMIT; +COMMIT +64: COMMIT; +COMMIT +65: COMMIT; +COMMIT +66: COMMIT; +COMMIT +67: COMMIT; +COMMIT +68: COMMIT; +COMMIT +69: COMMIT; +COMMIT +70: COMMIT; +COMMIT +71: COMMIT; +COMMIT +72: COMMIT; +COMMIT +73: COMMIT; +COMMIT +74: COMMIT; +COMMIT +75: COMMIT; +COMMIT +76: COMMIT; +COMMIT +77: COMMIT; +COMMIT +78: COMMIT; +COMMIT +79: COMMIT; +COMMIT +80: COMMIT; +COMMIT +81: COMMIT; +COMMIT +82: COMMIT; +COMMIT +83: COMMIT; +COMMIT +84: COMMIT; +COMMIT +85: COMMIT; +COMMIT +86: COMMIT; +COMMIT +87: COMMIT; +COMMIT +88: COMMIT; +COMMIT +89: COMMIT; +COMMIT +90: COMMIT; +COMMIT +91: COMMIT; +COMMIT +92: COMMIT; +COMMIT +93: COMMIT; +COMMIT +94: COMMIT; +COMMIT +95: COMMIT; +COMMIT +96: COMMIT; +COMMIT +97: COMMIT; +COMMIT +98: COMMIT; +COMMIT +99: COMMIT; +COMMIT +100: COMMIT; +COMMIT +101: COMMIT; +COMMIT +102: COMMIT; +COMMIT +103: COMMIT; +COMMIT +104: COMMIT; +COMMIT +105: COMMIT; +COMMIT +106: COMMIT; +COMMIT +107: COMMIT; +COMMIT +108: COMMIT; +COMMIT +109: COMMIT; +COMMIT +110: COMMIT; +COMMIT +111: COMMIT; +COMMIT +112: COMMIT; +COMMIT +113: COMMIT; +COMMIT +114: COMMIT; +COMMIT +115: COMMIT; +COMMIT +116: COMMIT; +COMMIT +117: COMMIT; +COMMIT +118: COMMIT; +COMMIT +119: COMMIT; +COMMIT +120: COMMIT; +COMMIT +121: COMMIT; +COMMIT +122: COMMIT; +COMMIT +123: COMMIT; +COMMIT +124: COMMIT; +COMMIT +125: COMMIT; +COMMIT +126: COMMIT; +COMMIT +127: COMMIT; +COMMIT +SELECT * FROM ao; + a | b +---+--- + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 +(127 rows) +SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY segno; + segment_id | segno | tupcount | modcount | formatversion | state +------------+-------+----------+----------+---------------+------- + -1 | 0 | 1 | 1 | 3 | 1 + -1 | 1 | 1 | 1 | 3 | 1 + -1 | 2 | 1 | 1 | 3 | 1 + -1 | 3 | 1 | 1 | 3 | 1 + -1 | 4 | 1 | 1 | 3 | 1 + -1 | 5 | 1 | 1 | 3 | 1 + -1 | 6 | 1 | 1 | 3 | 1 + -1 | 7 | 1 | 1 | 3 | 1 + -1 | 8 | 1 | 1 | 3 | 1 + -1 | 9 | 1 | 1 | 3 | 1 + -1 | 10 | 1 | 1 | 3 | 1 + -1 | 11 | 1 | 1 | 3 | 1 + -1 | 12 | 1 | 1 | 3 | 1 + -1 | 13 | 1 | 1 | 3 | 1 + -1 | 14 | 1 | 1 | 3 | 1 + -1 | 15 | 1 | 1 | 3 | 1 + -1 | 16 | 1 | 1 | 3 | 1 + -1 | 17 | 1 | 1 | 3 | 1 + -1 | 18 | 1 | 1 | 3 | 1 + -1 | 19 | 1 | 1 | 3 | 1 + -1 | 20 | 1 | 1 | 3 | 1 + -1 | 21 | 1 | 1 | 3 | 1 + -1 | 22 | 1 | 1 | 3 | 1 + -1 | 23 | 1 | 1 | 3 | 1 + -1 | 24 | 1 | 1 | 3 | 1 + -1 | 25 | 1 | 1 | 3 | 1 + -1 | 26 | 1 | 1 | 3 | 1 + -1 | 27 | 1 | 1 | 3 | 1 + -1 | 28 | 1 | 1 | 3 | 1 + -1 | 29 | 1 | 1 | 3 | 1 + -1 | 30 | 1 | 1 | 3 | 1 + -1 | 31 | 1 | 1 | 3 | 1 + -1 | 32 | 1 | 1 | 3 | 1 + -1 | 33 | 1 | 1 | 3 | 1 + -1 | 34 | 1 | 1 | 3 | 1 + -1 | 35 | 1 | 1 | 3 | 1 + -1 | 36 | 1 | 1 | 3 | 1 + -1 | 37 | 1 | 1 | 3 | 1 + -1 | 38 | 1 | 1 | 3 | 1 + -1 | 39 | 1 | 1 | 3 | 1 + -1 | 40 | 1 | 1 | 3 | 1 + -1 | 41 | 1 | 1 | 3 | 1 + -1 | 42 | 1 | 1 | 3 | 1 + -1 | 43 | 1 | 1 | 3 | 1 + -1 | 44 | 1 | 1 | 3 | 1 + -1 | 45 | 1 | 1 | 3 | 1 + -1 | 46 | 1 | 1 | 3 | 1 + -1 | 47 | 1 | 1 | 3 | 1 + -1 | 48 | 1 | 1 | 3 | 1 + -1 | 49 | 1 | 1 | 3 | 1 + -1 | 50 | 1 | 1 | 3 | 1 + -1 | 51 | 1 | 1 | 3 | 1 + -1 | 52 | 1 | 1 | 3 | 1 + -1 | 53 | 1 | 1 | 3 | 1 + -1 | 54 | 1 | 1 | 3 | 1 + -1 | 55 | 1 | 1 | 3 | 1 + -1 | 56 | 1 | 1 | 3 | 1 + -1 | 57 | 1 | 1 | 3 | 1 + -1 | 58 | 1 | 1 | 3 | 1 + -1 | 59 | 1 | 1 | 3 | 1 + -1 | 60 | 1 | 1 | 3 | 1 + -1 | 61 | 1 | 1 | 3 | 1 + -1 | 62 | 1 | 1 | 3 | 1 + -1 | 63 | 1 | 1 | 3 | 1 + -1 | 64 | 1 | 1 | 3 | 1 + -1 | 65 | 1 | 1 | 3 | 1 + -1 | 66 | 1 | 1 | 3 | 1 + -1 | 67 | 1 | 1 | 3 | 1 + -1 | 68 | 1 | 1 | 3 | 1 + -1 | 69 | 1 | 1 | 3 | 1 + -1 | 70 | 1 | 1 | 3 | 1 + -1 | 71 | 1 | 1 | 3 | 1 + -1 | 72 | 1 | 1 | 3 | 1 + -1 | 73 | 1 | 1 | 3 | 1 + -1 | 74 | 1 | 1 | 3 | 1 + -1 | 75 | 1 | 1 | 3 | 1 + -1 | 76 | 1 | 1 | 3 | 1 + -1 | 77 | 1 | 1 | 3 | 1 + -1 | 78 | 1 | 1 | 3 | 1 + -1 | 79 | 1 | 1 | 3 | 1 + -1 | 80 | 1 | 1 | 3 | 1 + -1 | 81 | 1 | 1 | 3 | 1 + -1 | 82 | 1 | 1 | 3 | 1 + -1 | 83 | 1 | 1 | 3 | 1 + -1 | 84 | 1 | 1 | 3 | 1 + -1 | 85 | 1 | 1 | 3 | 1 + -1 | 86 | 1 | 1 | 3 | 1 + -1 | 87 | 1 | 1 | 3 | 1 + -1 | 88 | 1 | 1 | 3 | 1 + -1 | 89 | 1 | 1 | 3 | 1 + -1 | 90 | 1 | 1 | 3 | 1 + -1 | 91 | 1 | 1 | 3 | 1 + -1 | 92 | 1 | 1 | 3 | 1 + -1 | 93 | 1 | 1 | 3 | 1 + -1 | 94 | 1 | 1 | 3 | 1 + -1 | 95 | 1 | 1 | 3 | 1 + -1 | 96 | 1 | 1 | 3 | 1 + -1 | 97 | 1 | 1 | 3 | 1 + -1 | 98 | 1 | 1 | 3 | 1 + -1 | 99 | 1 | 1 | 3 | 1 + -1 | 100 | 1 | 1 | 3 | 1 + -1 | 101 | 1 | 1 | 3 | 1 + -1 | 102 | 1 | 1 | 3 | 1 + -1 | 103 | 1 | 1 | 3 | 1 + -1 | 104 | 1 | 1 | 3 | 1 + -1 | 105 | 1 | 1 | 3 | 1 + -1 | 106 | 1 | 1 | 3 | 1 + -1 | 107 | 1 | 1 | 3 | 1 + -1 | 108 | 1 | 1 | 3 | 1 + -1 | 109 | 1 | 1 | 3 | 1 + -1 | 110 | 1 | 1 | 3 | 1 + -1 | 111 | 1 | 1 | 3 | 1 + -1 | 112 | 1 | 1 | 3 | 1 + -1 | 113 | 1 | 1 | 3 | 1 + -1 | 114 | 1 | 1 | 3 | 1 + -1 | 115 | 1 | 1 | 3 | 1 + -1 | 116 | 1 | 1 | 3 | 1 + -1 | 117 | 1 | 1 | 3 | 1 + -1 | 118 | 1 | 1 | 3 | 1 + -1 | 119 | 1 | 1 | 3 | 1 + -1 | 120 | 1 | 1 | 3 | 1 + -1 | 121 | 1 | 1 | 3 | 1 + -1 | 122 | 1 | 1 | 3 | 1 + -1 | 123 | 1 | 1 | 3 | 1 + -1 | 124 | 1 | 1 | 3 | 1 + -1 | 125 | 1 | 1 | 3 | 1 + -1 | 126 | 1 | 1 | 3 | 1 +(127 rows) + +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 20; +ALTER diff --git a/src/test/singlenode_isolation2/output/uao/max_concurrency2.source b/src/test/singlenode_isolation2/output/uao/max_concurrency2.source new file mode 100644 index 00000000000..d5d6e86c708 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/max_concurrency2.source @@ -0,0 +1,1052 @@ +-- @Description Insert into a ao relation with 128 concurrent transactions. +-- The 128th transaction is expected to fail. +-- +-- +-- start_matchsubs +-- m/could not find segment file to use for inserting into relation "ao" .*/ +-- s/could not find segment file to use for inserting into relation "ao" .*/could not find segment file to use for inserting into relation "ao" ###/ +-- end_matchsubs +GP_IGNORE: defined new match expression + +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE + +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 130; +ALTER + +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +3: BEGIN; +BEGIN +4: BEGIN; +BEGIN +5: BEGIN; +BEGIN +6: BEGIN; +BEGIN +7: BEGIN; +BEGIN +8: BEGIN; +BEGIN +9: BEGIN; +BEGIN +10: BEGIN; +BEGIN +11: BEGIN; +BEGIN +12: BEGIN; +BEGIN +13: BEGIN; +BEGIN +14: BEGIN; +BEGIN +15: BEGIN; +BEGIN +16: BEGIN; +BEGIN +17: BEGIN; +BEGIN +18: BEGIN; +BEGIN +19: BEGIN; +BEGIN +20: BEGIN; +BEGIN +21: BEGIN; +BEGIN +22: BEGIN; +BEGIN +23: BEGIN; +BEGIN +24: BEGIN; +BEGIN +25: BEGIN; +BEGIN +26: BEGIN; +BEGIN +27: BEGIN; +BEGIN +28: BEGIN; +BEGIN +29: BEGIN; +BEGIN +30: BEGIN; +BEGIN +31: BEGIN; +BEGIN +32: BEGIN; +BEGIN +33: BEGIN; +BEGIN +34: BEGIN; +BEGIN +35: BEGIN; +BEGIN +36: BEGIN; +BEGIN +37: BEGIN; +BEGIN +38: BEGIN; +BEGIN +39: BEGIN; +BEGIN +40: BEGIN; +BEGIN +41: BEGIN; +BEGIN +42: BEGIN; +BEGIN +43: BEGIN; +BEGIN +44: BEGIN; +BEGIN +45: BEGIN; +BEGIN +46: BEGIN; +BEGIN +47: BEGIN; +BEGIN +48: BEGIN; +BEGIN +49: BEGIN; +BEGIN +50: BEGIN; +BEGIN +51: BEGIN; +BEGIN +52: BEGIN; +BEGIN +53: BEGIN; +BEGIN +54: BEGIN; +BEGIN +55: BEGIN; +BEGIN +56: BEGIN; +BEGIN +57: BEGIN; +BEGIN +58: BEGIN; +BEGIN +59: BEGIN; +BEGIN +60: BEGIN; +BEGIN +61: BEGIN; +BEGIN +62: BEGIN; +BEGIN +63: BEGIN; +BEGIN +64: BEGIN; +BEGIN +65: BEGIN; +BEGIN +66: BEGIN; +BEGIN +67: BEGIN; +BEGIN +68: BEGIN; +BEGIN +69: BEGIN; +BEGIN +70: BEGIN; +BEGIN +71: BEGIN; +BEGIN +72: BEGIN; +BEGIN +73: BEGIN; +BEGIN +74: BEGIN; +BEGIN +75: BEGIN; +BEGIN +76: BEGIN; +BEGIN +77: BEGIN; +BEGIN +78: BEGIN; +BEGIN +79: BEGIN; +BEGIN +80: BEGIN; +BEGIN +81: BEGIN; +BEGIN +82: BEGIN; +BEGIN +83: BEGIN; +BEGIN +84: BEGIN; +BEGIN +85: BEGIN; +BEGIN +86: BEGIN; +BEGIN +87: BEGIN; +BEGIN +88: BEGIN; +BEGIN +89: BEGIN; +BEGIN +90: BEGIN; +BEGIN +91: BEGIN; +BEGIN +92: BEGIN; +BEGIN +93: BEGIN; +BEGIN +94: BEGIN; +BEGIN +95: BEGIN; +BEGIN +96: BEGIN; +BEGIN +97: BEGIN; +BEGIN +98: BEGIN; +BEGIN +99: BEGIN; +BEGIN +100: BEGIN; +BEGIN +101: BEGIN; +BEGIN +102: BEGIN; +BEGIN +103: BEGIN; +BEGIN +104: BEGIN; +BEGIN +105: BEGIN; +BEGIN +106: BEGIN; +BEGIN +107: BEGIN; +BEGIN +108: BEGIN; +BEGIN +109: BEGIN; +BEGIN +110: BEGIN; +BEGIN +111: BEGIN; +BEGIN +112: BEGIN; +BEGIN +113: BEGIN; +BEGIN +114: BEGIN; +BEGIN +115: BEGIN; +BEGIN +116: BEGIN; +BEGIN +117: BEGIN; +BEGIN +118: BEGIN; +BEGIN +119: BEGIN; +BEGIN +120: BEGIN; +BEGIN +121: BEGIN; +BEGIN +122: BEGIN; +BEGIN +123: BEGIN; +BEGIN +124: BEGIN; +BEGIN +125: BEGIN; +BEGIN +126: BEGIN; +BEGIN +127: BEGIN; +BEGIN +128: BEGIN; +BEGIN +1: INSERT INTO AO VALUES (1, 1); +INSERT 1 +2: INSERT INTO AO VALUES (1, 1); +INSERT 1 +3: INSERT INTO AO VALUES (1, 1); +INSERT 1 +4: INSERT INTO AO VALUES (1, 1); +INSERT 1 +5: INSERT INTO AO VALUES (1, 1); +INSERT 1 +6: INSERT INTO AO VALUES (1, 1); +INSERT 1 +7: INSERT INTO AO VALUES (1, 1); +INSERT 1 +8: INSERT INTO AO VALUES (1, 1); +INSERT 1 +9: INSERT INTO AO VALUES (1, 1); +INSERT 1 +10: INSERT INTO AO VALUES (1, 1); +INSERT 1 +11: INSERT INTO AO VALUES (1, 1); +INSERT 1 +12: INSERT INTO AO VALUES (1, 1); +INSERT 1 +13: INSERT INTO AO VALUES (1, 1); +INSERT 1 +14: INSERT INTO AO VALUES (1, 1); +INSERT 1 +15: INSERT INTO AO VALUES (1, 1); +INSERT 1 +16: INSERT INTO AO VALUES (1, 1); +INSERT 1 +17: INSERT INTO AO VALUES (1, 1); +INSERT 1 +18: INSERT INTO AO VALUES (1, 1); +INSERT 1 +19: INSERT INTO AO VALUES (1, 1); +INSERT 1 +20: INSERT INTO AO VALUES (1, 1); +INSERT 1 +21: INSERT INTO AO VALUES (1, 1); +INSERT 1 +22: INSERT INTO AO VALUES (1, 1); +INSERT 1 +23: INSERT INTO AO VALUES (1, 1); +INSERT 1 +24: INSERT INTO AO VALUES (1, 1); +INSERT 1 +25: INSERT INTO AO VALUES (1, 1); +INSERT 1 +26: INSERT INTO AO VALUES (1, 1); +INSERT 1 +27: INSERT INTO AO VALUES (1, 1); +INSERT 1 +28: INSERT INTO AO VALUES (1, 1); +INSERT 1 +29: INSERT INTO AO VALUES (1, 1); +INSERT 1 +30: INSERT INTO AO VALUES (1, 1); +INSERT 1 +31: INSERT INTO AO VALUES (1, 1); +INSERT 1 +32: INSERT INTO AO VALUES (1, 1); +INSERT 1 +33: INSERT INTO AO VALUES (1, 1); +INSERT 1 +34: INSERT INTO AO VALUES (1, 1); +INSERT 1 +35: INSERT INTO AO VALUES (1, 1); +INSERT 1 +36: INSERT INTO AO VALUES (1, 1); +INSERT 1 +37: INSERT INTO AO VALUES (1, 1); +INSERT 1 +38: INSERT INTO AO VALUES (1, 1); +INSERT 1 +39: INSERT INTO AO VALUES (1, 1); +INSERT 1 +40: INSERT INTO AO VALUES (1, 1); +INSERT 1 +41: INSERT INTO AO VALUES (1, 1); +INSERT 1 +42: INSERT INTO AO VALUES (1, 1); +INSERT 1 +43: INSERT INTO AO VALUES (1, 1); +INSERT 1 +44: INSERT INTO AO VALUES (1, 1); +INSERT 1 +45: INSERT INTO AO VALUES (1, 1); +INSERT 1 +46: INSERT INTO AO VALUES (1, 1); +INSERT 1 +47: INSERT INTO AO VALUES (1, 1); +INSERT 1 +48: INSERT INTO AO VALUES (1, 1); +INSERT 1 +49: INSERT INTO AO VALUES (1, 1); +INSERT 1 +50: INSERT INTO AO VALUES (1, 1); +INSERT 1 +51: INSERT INTO AO VALUES (1, 1); +INSERT 1 +52: INSERT INTO AO VALUES (1, 1); +INSERT 1 +53: INSERT INTO AO VALUES (1, 1); +INSERT 1 +54: INSERT INTO AO VALUES (1, 1); +INSERT 1 +55: INSERT INTO AO VALUES (1, 1); +INSERT 1 +56: INSERT INTO AO VALUES (1, 1); +INSERT 1 +57: INSERT INTO AO VALUES (1, 1); +INSERT 1 +58: INSERT INTO AO VALUES (1, 1); +INSERT 1 +59: INSERT INTO AO VALUES (1, 1); +INSERT 1 +60: INSERT INTO AO VALUES (1, 1); +INSERT 1 +61: INSERT INTO AO VALUES (1, 1); +INSERT 1 +62: INSERT INTO AO VALUES (1, 1); +INSERT 1 +63: INSERT INTO AO VALUES (1, 1); +INSERT 1 +64: INSERT INTO AO VALUES (1, 1); +INSERT 1 +65: INSERT INTO AO VALUES (1, 1); +INSERT 1 +66: INSERT INTO AO VALUES (1, 1); +INSERT 1 +67: INSERT INTO AO VALUES (1, 1); +INSERT 1 +68: INSERT INTO AO VALUES (1, 1); +INSERT 1 +69: INSERT INTO AO VALUES (1, 1); +INSERT 1 +70: INSERT INTO AO VALUES (1, 1); +INSERT 1 +71: INSERT INTO AO VALUES (1, 1); +INSERT 1 +72: INSERT INTO AO VALUES (1, 1); +INSERT 1 +73: INSERT INTO AO VALUES (1, 1); +INSERT 1 +74: INSERT INTO AO VALUES (1, 1); +INSERT 1 +75: INSERT INTO AO VALUES (1, 1); +INSERT 1 +76: INSERT INTO AO VALUES (1, 1); +INSERT 1 +77: INSERT INTO AO VALUES (1, 1); +INSERT 1 +78: INSERT INTO AO VALUES (1, 1); +INSERT 1 +79: INSERT INTO AO VALUES (1, 1); +INSERT 1 +80: INSERT INTO AO VALUES (1, 1); +INSERT 1 +81: INSERT INTO AO VALUES (1, 1); +INSERT 1 +82: INSERT INTO AO VALUES (1, 1); +INSERT 1 +83: INSERT INTO AO VALUES (1, 1); +INSERT 1 +84: INSERT INTO AO VALUES (1, 1); +INSERT 1 +85: INSERT INTO AO VALUES (1, 1); +INSERT 1 +86: INSERT INTO AO VALUES (1, 1); +INSERT 1 +87: INSERT INTO AO VALUES (1, 1); +INSERT 1 +88: INSERT INTO AO VALUES (1, 1); +INSERT 1 +89: INSERT INTO AO VALUES (1, 1); +INSERT 1 +90: INSERT INTO AO VALUES (1, 1); +INSERT 1 +91: INSERT INTO AO VALUES (1, 1); +INSERT 1 +92: INSERT INTO AO VALUES (1, 1); +INSERT 1 +93: INSERT INTO AO VALUES (1, 1); +INSERT 1 +94: INSERT INTO AO VALUES (1, 1); +INSERT 1 +95: INSERT INTO AO VALUES (1, 1); +INSERT 1 +96: INSERT INTO AO VALUES (1, 1); +INSERT 1 +97: INSERT INTO AO VALUES (1, 1); +INSERT 1 +98: INSERT INTO AO VALUES (1, 1); +INSERT 1 +99: INSERT INTO AO VALUES (1, 1); +INSERT 1 +100: INSERT INTO AO VALUES (1, 1); +INSERT 1 +101: INSERT INTO AO VALUES (1, 1); +INSERT 1 +102: INSERT INTO AO VALUES (1, 1); +INSERT 1 +103: INSERT INTO AO VALUES (1, 1); +INSERT 1 +104: INSERT INTO AO VALUES (1, 1); +INSERT 1 +105: INSERT INTO AO VALUES (1, 1); +INSERT 1 +106: INSERT INTO AO VALUES (1, 1); +INSERT 1 +107: INSERT INTO AO VALUES (1, 1); +INSERT 1 +108: INSERT INTO AO VALUES (1, 1); +INSERT 1 +109: INSERT INTO AO VALUES (1, 1); +INSERT 1 +110: INSERT INTO AO VALUES (1, 1); +INSERT 1 +111: INSERT INTO AO VALUES (1, 1); +INSERT 1 +112: INSERT INTO AO VALUES (1, 1); +INSERT 1 +113: INSERT INTO AO VALUES (1, 1); +INSERT 1 +114: INSERT INTO AO VALUES (1, 1); +INSERT 1 +115: INSERT INTO AO VALUES (1, 1); +INSERT 1 +116: INSERT INTO AO VALUES (1, 1); +INSERT 1 +117: INSERT INTO AO VALUES (1, 1); +INSERT 1 +118: INSERT INTO AO VALUES (1, 1); +INSERT 1 +119: INSERT INTO AO VALUES (1, 1); +INSERT 1 +120: INSERT INTO AO VALUES (1, 1); +INSERT 1 +121: INSERT INTO AO VALUES (1, 1); +INSERT 1 +122: INSERT INTO AO VALUES (1, 1); +INSERT 1 +123: INSERT INTO AO VALUES (1, 1); +INSERT 1 +124: INSERT INTO AO VALUES (1, 1); +INSERT 1 +125: INSERT INTO AO VALUES (1, 1); +INSERT 1 +126: INSERT INTO AO VALUES (1, 1); +INSERT 1 +127: INSERT INTO AO VALUES (1, 1); +INSERT 1 +128: INSERT INTO AO VALUES (1, 1); +INSERT 1 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: COMMIT; +COMMIT +4: COMMIT; +COMMIT +5: COMMIT; +COMMIT +6: COMMIT; +COMMIT +7: COMMIT; +COMMIT +8: COMMIT; +COMMIT +9: COMMIT; +COMMIT +10: COMMIT; +COMMIT +11: COMMIT; +COMMIT +12: COMMIT; +COMMIT +13: COMMIT; +COMMIT +14: COMMIT; +COMMIT +15: COMMIT; +COMMIT +16: COMMIT; +COMMIT +17: COMMIT; +COMMIT +18: COMMIT; +COMMIT +19: COMMIT; +COMMIT +20: COMMIT; +COMMIT +21: COMMIT; +COMMIT +22: COMMIT; +COMMIT +23: COMMIT; +COMMIT +24: COMMIT; +COMMIT +25: COMMIT; +COMMIT +26: COMMIT; +COMMIT +27: COMMIT; +COMMIT +28: COMMIT; +COMMIT +29: COMMIT; +COMMIT +30: COMMIT; +COMMIT +31: COMMIT; +COMMIT +32: COMMIT; +COMMIT +33: COMMIT; +COMMIT +34: COMMIT; +COMMIT +35: COMMIT; +COMMIT +36: COMMIT; +COMMIT +37: COMMIT; +COMMIT +38: COMMIT; +COMMIT +39: COMMIT; +COMMIT +40: COMMIT; +COMMIT +41: COMMIT; +COMMIT +42: COMMIT; +COMMIT +43: COMMIT; +COMMIT +44: COMMIT; +COMMIT +45: COMMIT; +COMMIT +46: COMMIT; +COMMIT +47: COMMIT; +COMMIT +48: COMMIT; +COMMIT +49: COMMIT; +COMMIT +50: COMMIT; +COMMIT +51: COMMIT; +COMMIT +52: COMMIT; +COMMIT +53: COMMIT; +COMMIT +54: COMMIT; +COMMIT +55: COMMIT; +COMMIT +56: COMMIT; +COMMIT +57: COMMIT; +COMMIT +58: COMMIT; +COMMIT +59: COMMIT; +COMMIT +60: COMMIT; +COMMIT +61: COMMIT; +COMMIT +62: COMMIT; +COMMIT +63: COMMIT; +COMMIT +64: COMMIT; +COMMIT +65: COMMIT; +COMMIT +66: COMMIT; +COMMIT +67: COMMIT; +COMMIT +68: COMMIT; +COMMIT +69: COMMIT; +COMMIT +70: COMMIT; +COMMIT +71: COMMIT; +COMMIT +72: COMMIT; +COMMIT +73: COMMIT; +COMMIT +74: COMMIT; +COMMIT +75: COMMIT; +COMMIT +76: COMMIT; +COMMIT +77: COMMIT; +COMMIT +78: COMMIT; +COMMIT +79: COMMIT; +COMMIT +80: COMMIT; +COMMIT +81: COMMIT; +COMMIT +82: COMMIT; +COMMIT +83: COMMIT; +COMMIT +84: COMMIT; +COMMIT +85: COMMIT; +COMMIT +86: COMMIT; +COMMIT +87: COMMIT; +COMMIT +88: COMMIT; +COMMIT +89: COMMIT; +COMMIT +90: COMMIT; +COMMIT +91: COMMIT; +COMMIT +92: COMMIT; +COMMIT +93: COMMIT; +COMMIT +94: COMMIT; +COMMIT +95: COMMIT; +COMMIT +96: COMMIT; +COMMIT +97: COMMIT; +COMMIT +98: COMMIT; +COMMIT +99: COMMIT; +COMMIT +100: COMMIT; +COMMIT +101: COMMIT; +COMMIT +102: COMMIT; +COMMIT +103: COMMIT; +COMMIT +104: COMMIT; +COMMIT +105: COMMIT; +COMMIT +106: COMMIT; +COMMIT +107: COMMIT; +COMMIT +108: COMMIT; +COMMIT +109: COMMIT; +COMMIT +110: COMMIT; +COMMIT +111: COMMIT; +COMMIT +112: COMMIT; +COMMIT +113: COMMIT; +COMMIT +114: COMMIT; +COMMIT +115: COMMIT; +COMMIT +116: COMMIT; +COMMIT +117: COMMIT; +COMMIT +118: COMMIT; +COMMIT +119: COMMIT; +COMMIT +120: COMMIT; +COMMIT +121: COMMIT; +COMMIT +122: COMMIT; +COMMIT +123: COMMIT; +COMMIT +124: COMMIT; +COMMIT +125: COMMIT; +COMMIT +126: COMMIT; +COMMIT +127: COMMIT; +COMMIT +128: ROLLBACK; +ROLLBACK +SELECT * FROM ao; + a | b +---+--- + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 +(127 rows) +SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY segno; + segment_id | segno | tupcount | modcount | formatversion | state +------------+-------+----------+----------+---------------+------- + -1 | 0 | 1 | 1 | 3 | 1 + -1 | 1 | 1 | 1 | 3 | 1 + -1 | 2 | 1 | 1 | 3 | 1 + -1 | 3 | 1 | 1 | 3 | 1 + -1 | 4 | 1 | 1 | 3 | 1 + -1 | 5 | 1 | 1 | 3 | 1 + -1 | 6 | 1 | 1 | 3 | 1 + -1 | 7 | 1 | 1 | 3 | 1 + -1 | 8 | 1 | 1 | 3 | 1 + -1 | 9 | 1 | 1 | 3 | 1 + -1 | 10 | 1 | 1 | 3 | 1 + -1 | 11 | 1 | 1 | 3 | 1 + -1 | 12 | 1 | 1 | 3 | 1 + -1 | 13 | 1 | 1 | 3 | 1 + -1 | 14 | 1 | 1 | 3 | 1 + -1 | 15 | 1 | 1 | 3 | 1 + -1 | 16 | 1 | 1 | 3 | 1 + -1 | 17 | 1 | 1 | 3 | 1 + -1 | 18 | 1 | 1 | 3 | 1 + -1 | 19 | 1 | 1 | 3 | 1 + -1 | 20 | 1 | 1 | 3 | 1 + -1 | 21 | 1 | 1 | 3 | 1 + -1 | 22 | 1 | 1 | 3 | 1 + -1 | 23 | 1 | 1 | 3 | 1 + -1 | 24 | 1 | 1 | 3 | 1 + -1 | 25 | 1 | 1 | 3 | 1 + -1 | 26 | 1 | 1 | 3 | 1 + -1 | 27 | 1 | 1 | 3 | 1 + -1 | 28 | 1 | 1 | 3 | 1 + -1 | 29 | 1 | 1 | 3 | 1 + -1 | 30 | 1 | 1 | 3 | 1 + -1 | 31 | 1 | 1 | 3 | 1 + -1 | 32 | 1 | 1 | 3 | 1 + -1 | 33 | 1 | 1 | 3 | 1 + -1 | 34 | 1 | 1 | 3 | 1 + -1 | 35 | 1 | 1 | 3 | 1 + -1 | 36 | 1 | 1 | 3 | 1 + -1 | 37 | 1 | 1 | 3 | 1 + -1 | 38 | 1 | 1 | 3 | 1 + -1 | 39 | 1 | 1 | 3 | 1 + -1 | 40 | 1 | 1 | 3 | 1 + -1 | 41 | 1 | 1 | 3 | 1 + -1 | 42 | 1 | 1 | 3 | 1 + -1 | 43 | 1 | 1 | 3 | 1 + -1 | 44 | 1 | 1 | 3 | 1 + -1 | 45 | 1 | 1 | 3 | 1 + -1 | 46 | 1 | 1 | 3 | 1 + -1 | 47 | 1 | 1 | 3 | 1 + -1 | 48 | 1 | 1 | 3 | 1 + -1 | 49 | 1 | 1 | 3 | 1 + -1 | 50 | 1 | 1 | 3 | 1 + -1 | 51 | 1 | 1 | 3 | 1 + -1 | 52 | 1 | 1 | 3 | 1 + -1 | 53 | 1 | 1 | 3 | 1 + -1 | 54 | 1 | 1 | 3 | 1 + -1 | 55 | 1 | 1 | 3 | 1 + -1 | 56 | 1 | 1 | 3 | 1 + -1 | 57 | 1 | 1 | 3 | 1 + -1 | 58 | 1 | 1 | 3 | 1 + -1 | 59 | 1 | 1 | 3 | 1 + -1 | 60 | 1 | 1 | 3 | 1 + -1 | 61 | 1 | 1 | 3 | 1 + -1 | 62 | 1 | 1 | 3 | 1 + -1 | 63 | 1 | 1 | 3 | 1 + -1 | 64 | 1 | 1 | 3 | 1 + -1 | 65 | 1 | 1 | 3 | 1 + -1 | 66 | 1 | 1 | 3 | 1 + -1 | 67 | 1 | 1 | 3 | 1 + -1 | 68 | 1 | 1 | 3 | 1 + -1 | 69 | 1 | 1 | 3 | 1 + -1 | 70 | 1 | 1 | 3 | 1 + -1 | 71 | 1 | 1 | 3 | 1 + -1 | 72 | 1 | 1 | 3 | 1 + -1 | 73 | 1 | 1 | 3 | 1 + -1 | 74 | 1 | 1 | 3 | 1 + -1 | 75 | 1 | 1 | 3 | 1 + -1 | 76 | 1 | 1 | 3 | 1 + -1 | 77 | 1 | 1 | 3 | 1 + -1 | 78 | 1 | 1 | 3 | 1 + -1 | 79 | 1 | 1 | 3 | 1 + -1 | 80 | 1 | 1 | 3 | 1 + -1 | 81 | 1 | 1 | 3 | 1 + -1 | 82 | 1 | 1 | 3 | 1 + -1 | 83 | 1 | 1 | 3 | 1 + -1 | 84 | 1 | 1 | 3 | 1 + -1 | 85 | 1 | 1 | 3 | 1 + -1 | 86 | 1 | 1 | 3 | 1 + -1 | 87 | 1 | 1 | 3 | 1 + -1 | 88 | 1 | 1 | 3 | 1 + -1 | 89 | 1 | 1 | 3 | 1 + -1 | 90 | 1 | 1 | 3 | 1 + -1 | 91 | 1 | 1 | 3 | 1 + -1 | 92 | 1 | 1 | 3 | 1 + -1 | 93 | 1 | 1 | 3 | 1 + -1 | 94 | 1 | 1 | 3 | 1 + -1 | 95 | 1 | 1 | 3 | 1 + -1 | 96 | 1 | 1 | 3 | 1 + -1 | 97 | 1 | 1 | 3 | 1 + -1 | 98 | 1 | 1 | 3 | 1 + -1 | 99 | 1 | 1 | 3 | 1 + -1 | 100 | 1 | 1 | 3 | 1 + -1 | 101 | 1 | 1 | 3 | 1 + -1 | 102 | 1 | 1 | 3 | 1 + -1 | 103 | 1 | 1 | 3 | 1 + -1 | 104 | 1 | 1 | 3 | 1 + -1 | 105 | 1 | 1 | 3 | 1 + -1 | 106 | 1 | 1 | 3 | 1 + -1 | 107 | 1 | 1 | 3 | 1 + -1 | 108 | 1 | 1 | 3 | 1 + -1 | 109 | 1 | 1 | 3 | 1 + -1 | 110 | 1 | 1 | 3 | 1 + -1 | 111 | 1 | 1 | 3 | 1 + -1 | 112 | 1 | 1 | 3 | 1 + -1 | 113 | 1 | 1 | 3 | 1 + -1 | 114 | 1 | 1 | 3 | 1 + -1 | 115 | 1 | 1 | 3 | 1 + -1 | 116 | 1 | 1 | 3 | 1 + -1 | 117 | 1 | 1 | 3 | 1 + -1 | 118 | 1 | 1 | 3 | 1 + -1 | 119 | 1 | 1 | 3 | 1 + -1 | 120 | 1 | 1 | 3 | 1 + -1 | 121 | 1 | 1 | 3 | 1 + -1 | 122 | 1 | 1 | 3 | 1 + -1 | 123 | 1 | 1 | 3 | 1 + -1 | 124 | 1 | 1 | 3 | 1 + -1 | 125 | 1 | 1 | 3 | 1 + -1 | 126 | 1 | 1 | 3 | 1 + -1 | 127 | 0 | 0 | 3 | 1 +(128 rows) + +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 20; +ALTER diff --git a/src/test/singlenode_isolation2/output/uao/modcount.source b/src/test/singlenode_isolation2/output/uao/modcount.source new file mode 100644 index 00000000000..75db6e50019 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/modcount.source @@ -0,0 +1,35 @@ +-- @Description Tests that DML operatins change the modification count. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; +INSERT 10 + +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); + state | tupcount | modcount +-------+----------+---------- + 1 | 10 | 1 +(1 row) +INSERT INTO ao VALUES (11, 11); +INSERT 1 +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); + state | tupcount | modcount +-------+----------+---------- + 1 | 11 | 2 +(1 row) +DELETE FROM ao WHERE a = 11; +DELETE 1 +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); + state | tupcount | modcount +-------+----------+---------- + 1 | 11 | 3 +(1 row) +UPDATE AO SET b = 0 WHERE a = 10; +UPDATE 1 +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); + state | tupcount | modcount +-------+----------+---------- + 1 | 12 | 4 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/modcount_vacuum.source b/src/test/singlenode_isolation2/output/uao/modcount_vacuum.source new file mode 100644 index 00000000000..f3f03867ac6 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/modcount_vacuum.source @@ -0,0 +1,30 @@ +-- @Description Tests that vacuum is not changing the modification count. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; +INSERT 10 + +DELETE FROM ao WHERE a < 5; +DELETE 4 +SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); + state | tupcount | modcount +-------+----------+---------- + 1 | 10 | 2 +(1 row) +VACUUM ao; +VACUUM +-- in case there's autovacuum worker running in the backend, the aoseg will not be dropped which has state = 2 +SELECT segno, modcount FROM gp_ao_or_aocs_seg('ao'); + segno | modcount +-------+---------- + 0 | 2 + 1 | 0 +(2 rows) +SELECT sum(tupcount) FROM gp_ao_or_aocs_seg('ao') where state = 1; + sum +----- + 6 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/parallel_delete.source b/src/test/singlenode_isolation2/output/uao/parallel_delete.source new file mode 100644 index 00000000000..0ac8859d81a --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/parallel_delete.source @@ -0,0 +1,52 @@ +-- @Description Tests that a delete operation in progress will block all other deletes +-- until the transaction is committed. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@ DISTRIBUTED BY (a); +CREATE +insert into ao select generate_series(1,100); +INSERT 100 + +-- The actual test begins +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +2: DELETE FROM ao WHERE a = 2; +DELETE 1 +2: SELECT * FROM locktest_master WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+---------------+----------+-------- + ao | ExclusiveLock | relation | master +(1 row) +2: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+---------------+----------+----------- + ao | ExclusiveLock | relation | 1 segment +(1 row) +-- The case here should delete a tuple at the same seg with(2). +-- Under jump hash, (2) and (3) are on the same seg(seg0). +1&: DELETE FROM ao WHERE a = 3; +2: COMMIT; +COMMIT +1<: <... completed> +DELETE 1 +1: COMMIT; +COMMIT +3: BEGIN; +BEGIN +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a +--- + 1 + 4 +(2 rows) +3: COMMIT; +COMMIT +0U: SELECT * FROM gp_toolkit.__gp_aovisimap('ao'); + tid | segno | row_num +--------------+-------+--------- + (33554432,2) | 1 | 1 + (33554432,3) | 1 | 2 +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/parallel_delete_2.source b/src/test/singlenode_isolation2/output/uao/parallel_delete_2.source new file mode 100644 index 00000000000..0723a997aab --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/parallel_delete_2.source @@ -0,0 +1,50 @@ +-- @Description Tests that a delete operation in progress will block all other deletes +-- until the transaction is committed. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@ DISTRIBUTED BY (a); +CREATE +insert into ao select generate_series(1,100); +INSERT 100 + +-- The actual test begins +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +2: DELETE FROM ao WHERE a = 1; +DELETE 1 +2: SELECT * FROM locktest_master WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+---------------------+--------------------------+-------- + ao | AccessExclusiveLock | append-only segment file | master + ao | ExclusiveLock | relation | master +(2 rows) +2: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+------------------+----------+----------- + ao | RowExclusiveLock | relation | 1 segment +(1 row) +1&: DELETE FROM ao WHERE a = 2; +2: COMMIT; +COMMIT +1<: <... completed> +DELETE 1 +1: COMMIT; +COMMIT +3: BEGIN; +BEGIN +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a +--- + 3 + 4 +(2 rows) +3: COMMIT; +COMMIT +2U: SELECT * FROM gp_toolkit.__gp_aovisimap('ao'); + tid | segno | row_num +------------------+-------+--------- + (33554432,32769) | 1 | 1 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/parallel_update.source b/src/test/singlenode_isolation2/output/uao/parallel_update.source new file mode 100644 index 00000000000..35077903916 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/parallel_update.source @@ -0,0 +1,50 @@ +-- @Description Tests that a update operation in progress will block all other updates +-- until the transaction is committed. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; +INSERT 10 + +-- The actual test begins +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +2: UPDATE ao SET b = 42 WHERE a = 2; +UPDATE 1 +2: SELECT * FROM locktest_master WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+---------------+----------+-------- + ao | ExclusiveLock | relation | master +(1 row) +2: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+---------------+----------+----------- + ao | ExclusiveLock | relation | 1 segment +(1 row) +-- The case here should update a tuple at the same seg with(2). +-- Under jump hash, (2) and (3) are on the same seg(seg0). +1&: UPDATE ao SET b = 42 WHERE a = 3; +2: COMMIT; +COMMIT +1<: <... completed> +UPDATE 1 +1: COMMIT; +COMMIT +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a | b +---+---- + 1 | 1 + 2 | 42 + 3 | 42 + 4 | 4 +(4 rows) +0U: SELECT * FROM gp_toolkit.__gp_aovisimap('ao'); + tid | segno | row_num +--------------+-------+--------- + (33554432,2) | 1 | 1 + (33554432,3) | 1 | 2 +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/parallel_update_2.source b/src/test/singlenode_isolation2/output/uao/parallel_update_2.source new file mode 100644 index 00000000000..d190b8852d9 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/parallel_update_2.source @@ -0,0 +1,49 @@ +-- @Description Tests that a update operation in progress will block all other updates +-- until the transaction is committed. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; +INSERT 10 + +-- The actual test begins +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +2: UPDATE ao SET b = 42 WHERE a = 1; +UPDATE 1 +2: SELECT * FROM locktest_master WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+---------------------+--------------------------+-------- + ao | AccessExclusiveLock | append-only segment file | master + ao | ExclusiveLock | relation | master +(2 rows) +2: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+---------------------+--------------------------+----------- + ao | AccessExclusiveLock | append-only segment file | 1 segment + ao | RowExclusiveLock | relation | 1 segment +(2 rows) +1&: UPDATE ao SET b = 42 WHERE a = 2; +2: COMMIT; +COMMIT +1<: <... completed> +UPDATE 1 +1: COMMIT; +COMMIT +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a | b +---+---- + 1 | 42 + 2 | 42 + 3 | 3 + 4 | 4 +(4 rows) +2U: SELECT * FROM gp_toolkit.__gp_aovisimap('ao'); + tid | segno | row_num +------------------+-------+--------- + (33554432,32769) | 1 | 1 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/parallel_update_readcommitted.source b/src/test/singlenode_isolation2/output/uao/parallel_update_readcommitted.source new file mode 100644 index 00000000000..d9ca48fc74c --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/parallel_update_readcommitted.source @@ -0,0 +1,28 @@ +-- @Description Tests that a update operation in progress will block all other updates +-- until the transaction is committed. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; +INSERT 10 + +-- The actual test begins +1: BEGIN; +BEGIN +2: BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; +BEGIN +1: UPDATE ao SET b = 42 WHERE b = 1; +UPDATE 1 +2&: UPDATE ao SET b = -1 WHERE b = 1; +1: COMMIT; +COMMIT +2<: <... completed> +UPDATE 0 +2: COMMIT; +COMMIT +SELECT * FROM ao WHERE b < 2; + a | b +---+--- +(0 rows) diff --git a/src/test/singlenode_isolation2/output/uao/phantom_reads.source b/src/test/singlenode_isolation2/output/uao/phantom_reads.source new file mode 100644 index 00000000000..849b6a45fd5 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/phantom_reads.source @@ -0,0 +1,51 @@ +-- @Description Tests the basic phantom read behavior of GPDB. +-- Actually, no UAO is involved here. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +1: BEGIN; +BEGIN +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +2: BEGIN; +BEGIN +2: INSERT INTO ao VALUES (101, 25); +INSERT 1 +2: COMMIT; +COMMIT +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +-----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 + 101 | 25 +(12 rows) +1: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/phantom_reads_delete.source b/src/test/singlenode_isolation2/output/uao/phantom_reads_delete.source new file mode 100644 index 00000000000..7a6a33d470e --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/phantom_reads_delete.source @@ -0,0 +1,49 @@ +-- @Description Tests the basic phantom read behavior of GPDB w.r.t to delete using +-- the default isolation level. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +1: BEGIN; +BEGIN +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +2: BEGIN; +BEGIN +2: DELETE FROM AO where b = 25; +DELETE 1 +2: COMMIT; +COMMIT +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(10 rows) +1: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/phantom_reads_delete_serializable.source b/src/test/singlenode_isolation2/output/uao/phantom_reads_delete_serializable.source new file mode 100644 index 00000000000..a0d814acc45 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/phantom_reads_delete_serializable.source @@ -0,0 +1,50 @@ +-- @Description Tests the basic phantom read behavior of GPDB w.r.t to delete using +-- the serializable isolation level. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +2: BEGIN; +BEGIN +2: DELETE FROM AO where b = 25; +DELETE 1 +2: COMMIT; +COMMIT +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +1: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/phantom_reads_serializable.source b/src/test/singlenode_isolation2/output/uao/phantom_reads_serializable.source new file mode 100644 index 00000000000..0b1a7b00f62 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/phantom_reads_serializable.source @@ -0,0 +1,50 @@ +-- @Description Tests the basic phantom read behavior of GPDB with serializable. +-- transactions. Actually, no UAO is involved here. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +2: BEGIN; +BEGIN +2: INSERT INTO ao VALUES (101, 25); +INSERT 1 +2: COMMIT; +COMMIT +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +1: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/phantom_reads_update.source b/src/test/singlenode_isolation2/output/uao/phantom_reads_update.source new file mode 100644 index 00000000000..65e2428c6d4 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/phantom_reads_update.source @@ -0,0 +1,49 @@ +-- @Description Tests the basic phantom read behavior of GPDB w.r.t to updates using +-- the default isolation level. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +1: BEGIN; +BEGIN +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +2: BEGIN; +BEGIN +2: UPDATE ao SET b = -1 WHERE a = 25; +UPDATE 1 +2: COMMIT; +COMMIT +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(10 rows) +1: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/phantom_reads_update_serializable.source b/src/test/singlenode_isolation2/output/uao/phantom_reads_update_serializable.source new file mode 100644 index 00000000000..6d7665642a2 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/phantom_reads_update_serializable.source @@ -0,0 +1,50 @@ +-- @Description Tests the basic phantom read behavior of GPDB w.r.t to updates using +-- the serializable isolation level. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +2: BEGIN; +BEGIN +2: UPDATE ao SET b = -1 WHERE a = 25; +UPDATE 1 +2: COMMIT; +COMMIT +1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; + a | b +----+---- + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 +(11 rows) +1: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/select_after_vacuum.source b/src/test/singlenode_isolation2/output/uao/select_after_vacuum.source new file mode 100644 index 00000000000..d0170c261d3 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_after_vacuum.source @@ -0,0 +1,107 @@ +-- @Description Ensures that a select after a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +DROP TABLE IF EXISTS ao2; +DROP +CREATE TABLE ao2 (a INT) USING @amname@; +CREATE +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao2 select generate_series(1,1000); +INSERT 1000 + +-- The actual test begins +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM ao2; + count +------- + 1000 +(1 row) +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 +-------+------ + 0 | many +(1 row) +2: VACUUM ao; +VACUUM +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +1: SELECT * FROM locktest_master WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+-----------------+----------+-------- + ao | AccessShareLock | relation | master +(1 row) +1: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+------+----------+------ +(0 rows) +1: COMMIT; +COMMIT +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 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 +-------+------ + 0 | one + 1 | many +(2 rows) +0: SELECT * FROM gp_ao_or_aocs_seg('ao'); + segment_id | segno | tupcount | modcount | formatversion | state +------------+-------+----------+----------+---------------+------- + -1 | 0 | 1 | 23 | 3 | 1 + -1 | 1 | 18333 | 0 | 3 | 1 +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/select_after_vacuum_2.source b/src/test/singlenode_isolation2/output/uao/select_after_vacuum_2.source new file mode 100644 index 00000000000..db52d4ca806 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_after_vacuum_2.source @@ -0,0 +1,103 @@ +-- @Description Ensures that a select after a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +DROP TABLE IF EXISTS ao2; +DROP +CREATE TABLE ao2 (a INT) USING @amname@; +CREATE +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao2 select generate_series(1,1000); +INSERT 1000 + +-- The actual test begins +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM ao2; + count +------- + 1000 +(1 row) +2U: 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 +-------+------ + 1 | many +(1 row) +2: VACUUM ao; +VACUUM +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +1: SELECT * FROM locktest_master WHERE coalesce = 'ao'; +1: SELECT * FROM locktest_master WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+-----------------+----------+-------- + ao | AccessShareLock | relation | master +(1 row) +1: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+-----------------+----------+------------ + ao | AccessShareLock | relation | n segments +(1 row) +1: COMMIT; +COMMIT +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 +2U: 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 +-------+------ + 1 | zero + 2 | many +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/select_after_vacuum_serializable.source b/src/test/singlenode_isolation2/output/uao/select_after_vacuum_serializable.source new file mode 100644 index 00000000000..3542fe507da --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_after_vacuum_serializable.source @@ -0,0 +1,75 @@ +-- @Description Ensures that a serializable select before during a vacuum operation blocks the vacuum. +-- +DROP TABLE IF EXISTS ao; +DROP +DROP TABLE IF EXISTS ao2; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +CREATE TABLE ao2 (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao2 select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN +1: SELECT COUNT(*) FROM ao2; + count +------- + 1000 +(1 row) +2: VACUUM ao; +VACUUM +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +1: COMMIT; +COMMIT +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/select_before_delete.source b/src/test/singlenode_isolation2/output/uao/select_before_delete.source new file mode 100644 index 00000000000..05b34d0b8b9 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_before_delete.source @@ -0,0 +1,34 @@ +1: SELECT * FROM ao WHERE a < 5; + a +--- + 1 + 2 + 3 + 4 +(4 rows) + +2: BEGIN; +BEGIN +2: SELECT * FROM ao WHERE a < 5; + a +--- + 1 + 2 + 3 + 4 +(4 rows) +2: DELETE FROM ao WHERE a < 5; +DELETE 4 +2: COMMIT; +COMMIT +2: SELECT * FROM ao WHERE a < 5; + a +--- +(0 rows) + +3: SELECT * FROM ao WHERE a < 5; + a +--- +(0 rows) + + diff --git a/src/test/singlenode_isolation2/output/uao/select_before_vacuum.source b/src/test/singlenode_isolation2/output/uao/select_before_vacuum.source new file mode 100644 index 00000000000..3ce8260bbdd --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_before_vacuum.source @@ -0,0 +1,79 @@ +-- @Description Ensures that a select before a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +1: SELECT * FROM locktest_master WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+-----------------+----------+-------- + ao | AccessShareLock | relation | master +(1 row) +1: SELECT * FROM locktest_segments WHERE coalesce = 'ao'; + coalesce | mode | locktype | node +----------+------+----------+------ +(0 rows) +2&: VACUUM FULL ao; +1: COMMIT; +COMMIT +2<: <... completed> +VACUUM +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/select_while_delete.source b/src/test/singlenode_isolation2/output/uao/select_while_delete.source new file mode 100644 index 00000000000..529c9453da8 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_while_delete.source @@ -0,0 +1,55 @@ +-- @Description Ensures that a select during a delete operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,100); +INSERT 100 + +2: BEGIN; +BEGIN +2: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a +--- + 1 + 2 + 3 + 4 +(4 rows) +2: DELETE FROM ao WHERE a < 5; +DELETE 4 +1: SELECT * FROM ao WHERE a >= 5 AND a < 10 ORDER BY a; + a +--- + 5 + 6 + 7 + 8 + 9 +(5 rows) +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a +--- + 1 + 2 + 3 + 4 +(4 rows) +2: COMMIT; +COMMIT +2: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a +--- +(0 rows) +4: SELECT * FROM ao WHERE a < 10 ORDER BY a; + a +--- + 5 + 6 + 7 + 8 + 9 +(5 rows) +4: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/select_while_delete_2.source b/src/test/singlenode_isolation2/output/uao/select_while_delete_2.source new file mode 100644 index 00000000000..6c0afed2d39 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_while_delete_2.source @@ -0,0 +1,61 @@ +-- @Description Ensures that a select during a delete operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,100); +INSERT 100 + +2: BEGIN; +BEGIN +2: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a +--- + 1 + 2 + 3 + 4 +(4 rows) +2: DELETE FROM ao WHERE a < 5; +DELETE 4 +1: SELECT * FROM ao WHERE a >= 5 AND a < 10 ORDER BY a; + a +--- + 5 + 6 + 7 + 8 + 9 +(5 rows) +3: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a +--- + 1 + 2 + 3 + 4 +(4 rows) +2: COMMIT; +COMMIT +2: SELECT * FROM ao WHERE a < 5 ORDER BY a; + a +--- +(0 rows) +4: SELECT * FROM ao WHERE a < 10 ORDER BY a; + a +--- + 5 + 6 + 7 + 8 + 9 +(5 rows) +2U: SELECT * FROM gp_toolkit.__gp_aovisimap_name('ao'); + tid | segno | row_num +------------------+-------+--------- + (33554432,32769) | 1 | 1 + (33554432,32770) | 1 | 2 +(2 rows) +4: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/select_while_full_vacuum.source b/src/test/singlenode_isolation2/output/uao/select_while_full_vacuum.source new file mode 100644 index 00000000000..dc32c7fa917 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_while_full_vacuum.source @@ -0,0 +1,60 @@ +-- @Description Ensures that a select during a full vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN; +BEGIN +1>: SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;COMMIT; +2: VACUUM FULL ao; +VACUUM +1<: <... completed> +SELECT +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/select_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/select_while_vacuum.source new file mode 100644 index 00000000000..39a501a0460 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_while_vacuum.source @@ -0,0 +1,60 @@ +-- @Description Ensures that a select during a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN; +BEGIN +1>: SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;COMMIT;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;COMMIT; +2: VACUUM ao; +VACUUM +1<: <... completed> +SELECT +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable.source b/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable.source new file mode 100644 index 00000000000..9c6ecbd5a71 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable.source @@ -0,0 +1,62 @@ +-- @Description Ensures that a select from a serializalbe transaction is ok after vacuum +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN +2: VACUUM ao; +VACUUM +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable2.source b/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable2.source new file mode 100644 index 00000000000..1b884b28cdc --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable2.source @@ -0,0 +1,81 @@ +-- @Description Run vacuum, while a serializable transaction is holding a lock +-- on the table. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +2: SELECT segment_id, segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); + segment_id | segno | tupcount | state +------------+-------+----------+------- + -1 | 0 | 21000 | 1 +(1 row) +2: VACUUM ao; +VACUUM +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +1: COMMIT; +COMMIT +3: INSERT INTO ao VALUES (0); +INSERT 1 +2: SELECT segment_id, segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); + segment_id | segno | tupcount | state +------------+-------+----------+------- + -1 | 0 | 21000 | 2 + -1 | 1 | 18334 | 1 +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable2_2.source b/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable2_2.source new file mode 100644 index 00000000000..8315e44218b --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/select_while_vacuum_serializable2_2.source @@ -0,0 +1,79 @@ +-- @Description Ensures that a serializable select before during a vacuum operation avoids the compaction. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +2U: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 1 | 10521 +(1 row) +2: VACUUM ao; +VACUUM +1: SELECT COUNT(*) FROM ao; + count +------- + 18333 +(1 row) +1: COMMIT; +COMMIT +3: INSERT INTO ao VALUES (0); +INSERT 1 +2U: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 1 | 10521 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/selectinsert_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/selectinsert_while_vacuum.source new file mode 100644 index 00000000000..88d50af5fb0 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/selectinsert_while_vacuum.source @@ -0,0 +1,82 @@ +-- @Description Ensures that an insert during a vacuum operation is ok +-- +CREATE TABLE selectinsert_while_vacuum_@amname@ (a INT) USING @amname@; +CREATE +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 +insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); +INSERT 1000 + +DELETE FROM selectinsert_while_vacuum_@amname@ WHERE a < 128; +DELETE 2667 +4: BEGIN; +BEGIN +4: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@; + count +------- + 18333 +(1 row) +5: BEGIN; +BEGIN +4: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@; + count +------- + 18333 +(1 row) +4: BEGIN; +BEGIN +4: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@; + count +------- + 18333 +(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 +2<: <... completed> +VACUUM +3: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@ WHERE a = 1500; + count +------- + 20 +(1 row) +3: INSERT INTO selectinsert_while_vacuum_@amname@ VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/selectinsertupdate_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/selectinsertupdate_while_vacuum.source new file mode 100644 index 00000000000..fb69f657b5e --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/selectinsertupdate_while_vacuum.source @@ -0,0 +1,32 @@ +-- @Description Ensures that an update during a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; +INSERT 10 + +DELETE FROM ao WHERE a < 2; +DELETE 1 +4: BEGIN; +BEGIN +4: SELECT COUNT(*) FROM ao; + count +------- + 9 +(1 row) +4: INSERT INTO ao VALUES (1, 1); +INSERT 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 +3: SELECT COUNT(*) FROM ao WHERE b = 1; + count +------- + 6 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/selectupdate_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/selectupdate_while_vacuum.source new file mode 100644 index 00000000000..b5e37aedf2c --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/selectupdate_while_vacuum.source @@ -0,0 +1,74 @@ +-- @Description Ensures that an update during a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2032 +4: BEGIN; +BEGIN +4: SELECT COUNT(*) FROM ao; + count +------- + 13968 +(1 row) +5: BEGIN; +BEGIN +4: SELECT COUNT(*) FROM ao; + count +------- + 13968 +(1 row) +4: BEGIN; +BEGIN +4: SELECT COUNT(*) FROM ao; + count +------- + 13968 +(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 +2<: <... completed> +VACUUM +3: SELECT COUNT(*) FROM ao WHERE b = 1; + count +------- + 9600 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/setup-test-schema.out b/src/test/singlenode_isolation2/output/uao/setup-test-schema.out new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_isolation2/output/uao/update_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/update_while_vacuum.source new file mode 100644 index 00000000000..881f19c8a20 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/update_while_vacuum.source @@ -0,0 +1,30 @@ +-- @Description Ensures that an update before a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +DELETE FROM ao WHERE a < 12; +DELETE 11 +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM ao; + count +------- + 89 +(1 row) +1>: UPDATE ao SET b=1 WHERE a > 0;COMMIT; +2: VACUUM ao; +VACUUM +1<: <... completed> +UPDATE +1: SELECT COUNT(*) FROM ao; + count +------- + 89 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/vacuum_cleanup.source b/src/test/singlenode_isolation2/output/uao/vacuum_cleanup.source new file mode 100644 index 00000000000..920ddfaf530 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/vacuum_cleanup.source @@ -0,0 +1,126 @@ +-- @Description Test that when AO vacuum skips drop phase, the age of +-- the AO/AOCS table gets reduced correctly. + +-- 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 +-- 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 +-- The age of the table is 7 after the following 5 statements +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +UPDATE 100 +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +UPDATE 100 +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +UPDATE 100 +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +UPDATE 100 +2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; +UPDATE 100 + +1: set vacuum_freeze_min_age = 0; +SET +-- Check the age of the table just before vacuum +1: select age(relfrozenxid), regexp_replace(replace(relname, 'ao_@amname@_vacuum_cleanup2'::regclass::oid::text, ''), 'ao.*seg', '') from gp_dist_random('pg_class') where relkind in ('r','t','o','b','M') and (relname like '%' || 'ao_@amname@_vacuum_cleanup2'::regclass::oid || '%') and gp_segment_id = 0; + age | regexp_replace +-----+-------------------- + 7 | pg__ + 7 | pg_aovisimap_ +(2 rows) + +-- Hold AccessShareLock to make AO VACUUM skip drop phase +2: begin; +BEGIN +2: select count(*) from ao_@amname@_vacuum_cleanup2; + count +------- + 100 +(1 row) +1: vacuum ao_@amname@_vacuum_cleanup2; +VACUUM + +-- The age should be smaller now. All the xids before the first +-- vacuum were frozen. The relfrozenxid will be the xid of the last +-- transaction before the vacuum (in this case it is the update statement) +1: select age(relfrozenxid), regexp_replace(replace(relname, 'ao_@amname@_vacuum_cleanup2'::regclass::oid::text, ''), 'ao.*seg', '') from gp_dist_random('pg_class') where relkind in ('r','t','o','b','M') and (relname like '%' || 'ao_@amname@_vacuum_cleanup2'::regclass::oid || '%') and gp_segment_id = 0; + age | regexp_replace +-----+-------------------- + 2 | pg__ + 2 | pg_aovisimap_ +(2 rows) +2: end; +END + +-- Check that drop phase is skipped, but still the cleanup phase is performed +-- when there are concurrent serializable transactions +1: create table ao_@amname@_vacuum_cleanup3(a int, b int) using @amname@; +CREATE +1: insert into ao_@amname@_vacuum_cleanup3 select i, i from generate_series(1, 100) i; +INSERT 100 +1: delete from ao_@amname@_vacuum_cleanup3; +DELETE 100 + +-- Check the age of the table before vacuum to make sure that clean phase gets +-- performed +1: select age(relfrozenxid), regexp_replace(replace(relname, 'ao_@amname@_vacuum_cleanup3'::regclass::oid::text, ''), 'ao.*seg', '') from gp_dist_random('pg_class') where relkind in ('r','t','o','b','M') and (relname like '%' || 'ao_@amname@_vacuum_cleanup3'::regclass::oid || '%') and gp_segment_id = 0; + age | regexp_replace +-----+-------------------- + 3 | pg__ + 3 | pg_aovisimap_ +(2 rows) +1: select gp_inject_fault_infinite('vacuum_relation_open_relation_during_drop_phase', 'suspend', 1); + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +1&: vacuum ao_@amname@_vacuum_cleanup3; + +-- Wait till compaction phase is completed and only then start the serializable +-- transaction to ensure that only drop phase runs after the serializable +-- transaction started. Because the transaction is holding a lock on the table, +-- the drop phase cannot upgrade to AccessExclusiveLock and so recycling the +-- segfiles is skipped. +2: select gp_wait_until_triggered_fault('vacuum_relation_open_relation_during_drop_phase', 1, 1); + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +2: begin isolation level serializable; +BEGIN +2: select * from ao_@amname@_vacuum_cleanup3; + a | b +---+--- +(0 rows) +2: select gp_inject_fault('vacuum_relation_open_relation_during_drop_phase', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +1<: <... completed> +VACUUM +1: select age(relfrozenxid), regexp_replace(replace(relname, 'ao_@amname@_vacuum_cleanup3'::regclass::oid::text, ''), 'ao.*seg', '') from gp_dist_random('pg_class') where relkind in ('r','t','o','b','M') and (relname like '%' || 'ao_@amname@_vacuum_cleanup3'::regclass::oid || '%') and gp_segment_id = 0; + age | regexp_replace +-----+-------------------- + 2 | pg__ + 2 | pg_aovisimap_ +(2 rows) + +-- Validate that the drop phase was skipped. segfile 1 should be in state 2 +-- (AWAITING_DROP) +-- This result is related to data distribution. +-- Current hash algorithm is jump-consistent-hash. +1: SELECT * FROM gp_ao_or_aocs_seg('ao_@amname@_vacuum_cleanup3'); + segment_id | segno | tupcount | modcount | formatversion | state +------------+-------+----------+----------+---------------+------- + 2 | 1 | 25 | 2 | 3 | 2 + 2 | 2 | 0 | 0 | 3 | 1 + 1 | 1 | 37 | 2 | 3 | 2 + 1 | 2 | 0 | 0 | 3 | 1 + 0 | 1 | 38 | 2 | 3 | 2 + 0 | 2 | 0 | 0 | 3 | 1 +(6 rows) + +2: commit; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/vacuum_self_function.source b/src/test/singlenode_isolation2/output/uao/vacuum_self_function.source new file mode 100644 index 00000000000..6ea3f2f09f9 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/vacuum_self_function.source @@ -0,0 +1,62 @@ +-- @Description Test scenario where a backend accesses AO table with a snapshot +-- that was acquired before vacuum. +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 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 + +-- Launch function into the background. +1&: select myfunc(); + +-- Meanwhile, DELETE some rows and VACUUM. VACUUM should not recycle the +-- old tuple versions that are still needed by the function later. It will +-- compact the segfile, but keep the old segfile in AWAITING_DROP state. +2: DELETE FROM ao WHERE a <= 50; +DELETE 20 +2: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount | state +-------+----------+------- + 0 | 100 | 1 +(1 row) +2: VACUUM ao; +VACUUM +2: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount | state +-------+----------+------- + 0 | 100 | 2 + 1 | 50 | 1 +(2 rows) + +-- A second VACUUM shouldn't recycle them either. +2: VACUUM ao; +VACUUM +2: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount | state +-------+----------+------- + 0 | 100 | 2 + 1 | 50 | 1 +(2 rows) +1<: <... completed> + myfunc +-------- + 70 +(1 row) + +-- Now that the first transaction has finished, VACUUM can recycle. +2: VACUUM ao; +VACUUM +2: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount | state +-------+----------+------- + 0 | 0 | 1 + 1 | 50 | 1 +(2 rows) diff --git a/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable.source b/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable.source new file mode 100644 index 00000000000..704f0640ca8 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable.source @@ -0,0 +1,36 @@ +-- @Description Ensures that a vacuum with serializable works ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +DELETE FROM ao WHERE a <= 30; +DELETE 30 +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SET +SELECT COUNT(*) FROM ao; + count +------- + 70 +(1 row) +SELECT *, segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segment_id | segno | tupcount | modcount | formatversion | state | segno | tupcount +------------+-------+----------+----------+---------------+-------+-------+---------- + -1 | 0 | 100 | 2 | 3 | 1 | 0 | 100 +(1 row) +VACUUM ao; +VACUUM +-- in case there's autovacuum worker running in the backend, the aoseg will not be dropped which has state = 2 +SELECT *, segno, tupcount FROM gp_ao_or_aocs_seg('ao') where state = 1 and tupcount > 0; + segment_id | segno | tupcount | modcount | formatversion | state | segno | tupcount +------------+-------+----------+----------+---------------+-------+-------+---------- + -1 | 1 | 70 | 0 | 3 | 1 | 1 | 70 +(1 row) +SELECT COUNT(*) FROM ao; + count +------- + 70 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable2.source b/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable2.source new file mode 100644 index 00000000000..9b29a8a6bc1 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable2.source @@ -0,0 +1,49 @@ +-- @Description Ensures that a vacuum with serializable works ok +-- +DROP TABLE IF EXISTS ao; +DROP +DROP TABLE IF EXISTS ao2; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +CREATE TABLE ao2 (a INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +DELETE FROM ao WHERE a <= 30; +DELETE 30 +1: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SET +1: SELECT COUNT(*) FROM ao; + count +------- + 70 +(1 row) +1: BEGIN; +BEGIN +1: SELECT COUNT(*) FROM ao2; + count +------- + 0 +(1 row) +2: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 0 | 100 +(1 row) +2: VACUUM ao; +VACUUM +2: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 0 | 0 + 1 | 70 +(2 rows) +1: SELECT COUNT(*) FROM ao; + count +------- + 70 +(1 row) +1: COMMIT; +COMMIT diff --git a/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable3.source b/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable3.source new file mode 100644 index 00000000000..47a962e9c44 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/vacuum_self_serializable3.source @@ -0,0 +1,40 @@ +-- @Description Ensures that a vacuum with serializable works ok +-- +DROP TABLE IF EXISTS ao; +DROP +DROP TABLE IF EXISTS ao2; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +CREATE TABLE ao2 (a INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; +INSERT 100 + +DELETE FROM ao WHERE a <= 30; +DELETE 30 +SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SET +SELECT COUNT(*) FROM ao; + count +------- + 70 +(1 row) +SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); + segno | tupcount +-------+---------- + 0 | 100 +(1 row) +VACUUM ao; +VACUUM +-- in case there's autovacuum worker running in the backend, the aoseg will not be dropped which has state = 2 +SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao') where state = 1 and tupcount > 0; + segno | tupcount +-------+---------- + 1 | 70 +(1 row) +SELECT COUNT(*) FROM ao; + count +------- + 70 +(1 row) diff --git a/src/test/singlenode_isolation2/output/uao/vacuum_while_insert.source b/src/test/singlenode_isolation2/output/uao/vacuum_while_insert.source new file mode 100644 index 00000000000..ab89f7c2007 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/vacuum_while_insert.source @@ -0,0 +1,70 @@ +-- @Description Ensures that a vacuum during insert operations is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT) USING @amname@; +CREATE +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 +insert into ao select generate_series(1,1000); +INSERT 1000 + +DELETE FROM ao WHERE a < 128; +DELETE 2667 +1: BEGIN; +BEGIN +1>: 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; +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; +2: VACUUM ao; +VACUUM +1<: <... completed> +INSERT +4<: <... completed> +INSERT +3: SELECT COUNT(*) FROM ao WHERE a = 1500; + count +------- + 40 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/uao/vacuum_while_vacuum.source b/src/test/singlenode_isolation2/output/uao/vacuum_while_vacuum.source new file mode 100644 index 00000000000..4e7578ab986 --- /dev/null +++ b/src/test/singlenode_isolation2/output/uao/vacuum_while_vacuum.source @@ -0,0 +1,38 @@ +-- @Description Ensures that an vacuum while a vacuum operation is ok +-- +DROP TABLE IF EXISTS ao; +DROP +CREATE TABLE ao (a INT, b INT) USING @amname@; +CREATE +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT 10000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT 10000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT 10000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT 10000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT 10000 +INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; +INSERT 10000 + +DELETE FROM ao WHERE a < 1200; +DELETE 7194 +1: SELECT COUNT(*) FROM ao; + count +------- + 52806 +(1 row) +1>: VACUUM ao; +2: VACUUM ao; +VACUUM +1<: <... completed> +VACUUM +1: SELECT COUNT(*) FROM ao; + count +------- + 52806 +(1 row) +3: INSERT INTO ao VALUES (0); +INSERT 1 diff --git a/src/test/singlenode_isolation2/output/workfile_mgr_test.source b/src/test/singlenode_isolation2/output/workfile_mgr_test.source new file mode 100644 index 00000000000..af85e1100e2 --- /dev/null +++ b/src/test/singlenode_isolation2/output/workfile_mgr_test.source @@ -0,0 +1,238 @@ +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 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 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 OR REPLACE FUNCTION gp_workfile_mgr_create_workset(worksetname text, interXact bool, holdPin bool, closeFile bool) RETURNS void LANGUAGE C VOLATILE EXECUTE ON ALL SEGMENTS AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'gp_workfile_mgr_create_workset'; +CREATE + +CREATE OR REPLACE FUNCTION gp_workfile_mgr_create_empty_workset(worksetname text) RETURNS void LANGUAGE C VOLATILE EXECUTE ON ALL SEGMENTS AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'gp_workfile_mgr_create_workset'; +CREATE + +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 + +-- 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 + +-- start_ignore +!\retcode gpconfig -c gp_workfile_max_entries -v 32 --skipvalidation; +-- start_ignore +20200923:12:05:57:013768 gpconfig:mdw:gpadmin-[INFO]:-completed successfully with parameters '-c gp_workfile_max_entries -v 32 --skipvalidation' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -ari; +-- start_ignore +20200923:12:05:57:014232 gpstop:mdw:gpadmin-[INFO]:-Starting gpstop with args: -ari +20200923:12:05:57:014232 gpstop:mdw:gpadmin-[INFO]:-Gathering information and validating the environment... +20200923:12:05:57:014232 gpstop:mdw:gpadmin-[INFO]:-Obtaining Cloudberry Master catalog information +20200923:12:05:57:014232 gpstop:mdw:gpadmin-[INFO]:-Obtaining Segment details from master... +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.7339.g02578435d1 build dev' +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Commencing Master instance shutdown with mode='immediate' +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Master segment instance directory=/home/gpadmin/Documents/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Attempting forceful termination of any leftover master process +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Terminating processes for segment /home/gpadmin/Documents/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Stopping master standby host mdw mode=immediate +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Successfully shutdown standby process on mdw +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Targeting dbid [2, 5, 3, 6, 4, 7] for shutdown +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-Commencing parallel primary segment instance shutdown, please wait... +20200923:12:05:58:014232 gpstop:mdw:gpadmin-[INFO]:-0.00% of jobs completed +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:-100.00% of jobs completed +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:-Commencing parallel mirror segment instance shutdown, please wait... +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:-0.00% of jobs completed +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:-100.00% of jobs completed +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:----------------------------------------------------- +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:- Segments stopped successfully = 6 +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:- Segments with errors during stop = 0 +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:----------------------------------------------------- +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:-Successfully shutdown 6 of 6 segment instances +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:-Database successfully shutdown with no errors reported +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:-Cleaning up leftover shared memory +20200923:12:05:59:014232 gpstop:mdw:gpadmin-[INFO]:-Restarting System... + +-- end_ignore +(exited with code 0) +-- end_ignore + +-- setup for workfile made in temp tablespace test +! mkdir -p '@testtablespace@/workfile_mgr'; + +1: DROP TABLESPACE IF EXISTS work_file_test_ts; +DROP +1: CREATE TABLESPACE work_file_test_ts LOCATION '@testtablespace@/workfile_mgr'; +CREATE + +1: select gp_workfile_mgr_test('atomic_test', 0); + gp_workfile_mgr_test +---------------------- + f + f +(2 rows) + +-- test will fail when the workset exceeds gp_workfile_max_entries, the workset will be released at the end of transaction. +1: select gp_workfile_mgr_test('workfile_fill_sharedcache', 0); +ERROR: could not create workfile manager entry: exceeded number of concurrent spilling queries +CONTEXT: SQL function "gp_workfile_mgr_test" statement 1 +1: select segid, count(*) from gp_workfile_mgr_cache_entries() group by segid order by segid; + segid | count +-------+------- +(0 rows) + +1: select gp_workfile_mgr_test('workfile_create_and_set_cleanup', 2000); + gp_workfile_mgr_test +---------------------- + t + t +(2 rows) +1: select gp_workfile_mgr_test('workfile_create_and_individual_cleanup', 2000); + gp_workfile_mgr_test +---------------------- + t + t +(2 rows) +1: select gp_workfile_mgr_test('workfile_made_in_temp_tablespace', 2000); + gp_workfile_mgr_test +---------------------- + t + t +(2 rows) +1: select gp_workfile_mgr_test('workfile_create_and_individual_cleanup_with_pinned_workfile_set', 2000); + gp_workfile_mgr_test +---------------------- + t + t +(2 rows) + +1: DROP TABLESPACE work_file_test_ts; +DROP + +-- start_ignore +!\retcode gpconfig -r gp_workfile_max_entries --skipvalidation; +-- start_ignore +20230630:09:01:14:025230 gpconfig:merge:gpadmin-[INFO]:-completed successfully with parameters '-r gp_workfile_max_entries --skipvalidation' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -ari; +-- start_ignore +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Starting gpstop with args: -ari +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Gathering information and validating the environment... +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Obtaining Cloudberry Coordinator catalog information +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Obtaining Segment details from coordinator... +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 1.0.0+dev.57.g0120e5d169f build dev' +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Commencing Coordinator instance shutdown with mode='immediate' +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Coordinator segment instance directory=/home/gpadmin/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Attempting forceful termination of any leftover coordinator process +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Terminating processes for segment /home/gpadmin/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1 +20230630:09:01:15:025313 gpstop:merge:gpadmin-[INFO]:-Restarting System... + +-- end_ignore +(exited with code 0) +-- end_ignore + +-- test workset cleanup +2: begin; +BEGIN +2: select gp_workfile_mgr_create_workset('short_live_workset', false, false, false); + gp_workfile_mgr_create_workset +-------------------------------- + +(1 row) +2: select gp_workfile_mgr_create_empty_workset('long_live_workset'); + gp_workfile_mgr_create_empty_workset +-------------------------------------- + +(1 row) +2: select segid, count(*) from gp_workfile_mgr_cache_entries() group by segid order by segid; + segid | count +-------+------- + -1 | 1 +(1 row) + +3: select gp_workfile_mgr_create_workset('inter_xact_workset', true, false, false); + gp_workfile_mgr_create_workset +-------------------------------- + +(1 row) + +-- transaction commit will cleanup the pinned workfile_set. +4: begin; +BEGIN +4: select gp_workfile_mgr_create_workset('commit_tnx_workset', false, true, false); + gp_workfile_mgr_create_workset +-------------------------------- + +(1 row) +4: select gp_workfile_mgr_create_workset('commit_tnx_workset_empty', false, true, true); + gp_workfile_mgr_create_workset +-------------------------------- + +(1 row) +4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); + segid | prefix | size | operation | slice | numfiles +-------+----------------------------+------+--------------------------+-------+---------- + -1 | commit_tnx_workset_3 | 0 | commit_tnx_workset | -1 | 0 + -1 | commit_tnx_workset_empty_4 | 0 | commit_tnx_workset_empty | -1 | 0 + -1 | inter_xact_workset_2 | 0 | inter_xact_workset | -1 | 1 + -1 | long_live_workset_1 | 0 | long_live_workset | -1 | 0 +(4 rows) +4: end; +END +4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); + segid | prefix | size | operation | slice | numfiles +-------+----------------------+------+--------------------+-------+---------- + -1 | inter_xact_workset_2 | 0 | inter_xact_workset | -1 | 1 + -1 | long_live_workset_1 | 0 | long_live_workset | -1 | 0 +(2 rows) + +-- transaction abort will cleanup the workset. +4: begin; +BEGIN +4: select gp_workfile_mgr_create_workset('abort_tnx_workset', false, false, false); + gp_workfile_mgr_create_workset +-------------------------------- + +(1 row) +4: select gp_workfile_mgr_create_workset('abort_tnx_workset_pinned', false, true, false); + gp_workfile_mgr_create_workset +-------------------------------- + +(1 row) +4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); + segid | prefix | size | operation | slice | numfiles +-------+----------------------------+------+--------------------------+-------+---------- + -1 | abort_tnx_workset_pinned_4 | 0 | abort_tnx_workset_pinned | -1 | 0 + -1 | inter_xact_workset_2 | 0 | inter_xact_workset | -1 | 1 + -1 | long_live_workset_1 | 0 | long_live_workset | -1 | 0 +(3 rows) +4: abort; +ABORT +4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); + segid | prefix | size | operation | slice | numfiles +-------+----------------------+------+--------------------+-------+---------- + -1 | inter_xact_workset_2 | 0 | inter_xact_workset | -1 | 1 + -1 | long_live_workset_1 | 0 | long_live_workset | -1 | 0 +(2 rows) + +-- for workset lives across transaction, e.g. with hold cursor, proc exit will cleanup the workset +3q: ... + +-- The "q:" step does not wait for the backend process to exit. So +-- wait at the most 1 min so that only the long lived sessions are +-- reported. If we don't wait thte test sometimes fails because +-- "inter_xact_workset" entries show up in the output of +-- gp_workfile_mgr_cache_entries(). +4: select * from report_workfile_entries(); + segid | prefix | size | operation | slice | numfiles +-------+---------------------+------+-------------------+-------+---------- + -1 | long_live_workset_1 | 0 | long_live_workset | -1 | 0 +(1 row) diff --git a/src/test/singlenode_isolation2/parallel_retrieve_cursor_schedule b/src/test/singlenode_isolation2/parallel_retrieve_cursor_schedule new file mode 100644 index 00000000000..c2a53ea9dd6 --- /dev/null +++ b/src/test/singlenode_isolation2/parallel_retrieve_cursor_schedule @@ -0,0 +1,15 @@ +test: parallel_retrieve_cursor/set +test: parallel_retrieve_cursor/extended_query +test: parallel_retrieve_cursor/corner +test: parallel_retrieve_cursor/explain +test: parallel_retrieve_cursor/replicated_table +test: parallel_retrieve_cursor/special_query +test: parallel_retrieve_cursor/status_check +test: parallel_retrieve_cursor/status_wait +test: parallel_retrieve_cursor/syntax +test: parallel_retrieve_cursor/retrieve_quit_check +test: parallel_retrieve_cursor/retrieve_quit_wait +test: parallel_retrieve_cursor/fault_inject +test: parallel_retrieve_cursor/security +test: parallel_retrieve_cursor/privilege +test: parallel_retrieve_cursor/unset diff --git a/src/test/singlenode_isolation2/sql/.gitignore b/src/test/singlenode_isolation2/sql/.gitignore new file mode 100644 index 00000000000..98c8e3fd3fb --- /dev/null +++ b/src/test/singlenode_isolation2/sql/.gitignore @@ -0,0 +1,23 @@ +# ignores only for this directory +/ao_upgrade.sql +/external_table.sql +/fts_manual_probe.sql +/gp_collation.sql +/pg_basebackup.sql +/pg_basebackup_with_tablespaces.sql +/pt_io_in_progress_deadlock.sql + +# ignores including sub-directories +autovacuum-analyze.sql +disable_resgroup.sql +enable_resgroup.sql +enable_resgroup_validate.sql +resgroup_alter_memory.sql +resgroup_bypass.sql +resgroup_cpu_rate_limit.sql +resgroup_cpuset.sql +resgroup_memory_limit.sql +resgroup_memory_statistic.sql +resgroup_memory_runaway.sql +resgroup_move_query.sql +workfile_mgr_test.sql diff --git a/src/test/singlenode_isolation2/sql/add_column_after_vacuum_skip_drop_column.sql b/src/test/singlenode_isolation2/sql/add_column_after_vacuum_skip_drop_column.sql new file mode 100644 index 00000000000..f1db7898cfb --- /dev/null +++ b/src/test/singlenode_isolation2/sql/add_column_after_vacuum_skip_drop_column.sql @@ -0,0 +1,27 @@ +-- @Description Ensures that an ALTER TABLE ADD COLUMN will drop segfiles in +-- AOSEG_STATE_AWAITING_DROP state left over by a previous vacuum +-- +CREATE TABLE aoco_add_column_after_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true, orientation=column); +INSERT INTO aoco_add_column_after_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; + +DELETE FROM aoco_add_column_after_vacuum_skip_drop; + +-- We should see all aocssegs in state 1 +0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); + +-- VACUUM while another session holds lock +1: BEGIN; +1: SELECT COUNT(*) FROM aoco_add_column_after_vacuum_skip_drop; +2: VACUUM aoco_add_column_after_vacuum_skip_drop; +1: END; + +-- 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'); + +-- 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; +0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); + +-- 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; +0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); diff --git a/src/test/singlenode_isolation2/sql/alter_blocks_for_update_and_viceversa.sql b/src/test/singlenode_isolation2/sql/alter_blocks_for_update_and_viceversa.sql new file mode 100644 index 00000000000..b22000f13c3 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/alter_blocks_for_update_and_viceversa.sql @@ -0,0 +1,19 @@ +-- setup +1: drop table if exists alter_block; +1: create table alter_block(a int, b int) distributed by (a); +1: insert into alter_block select 1, 1; +-- Validate UPDATE blocks the Alter +2: BEGIN; +2: UPDATE alter_block SET b = b + 1; +1&: ALTER TABLE alter_block SET DISTRIBUTED BY (b); +-- Alter process should be blocked +2: SELECT wait_event_type FROM pg_stat_activity where query like 'ALTER TABLE alter_block %'; +2: COMMIT; +1<: +-- Now validate ALTER blocks the UPDATE +2: BEGIN; +2: ALTER TABLE alter_block SET DISTRIBUTED BY (a); +1&: UPDATE alter_block SET b = b + 1; +2: SELECT wait_event_type FROM pg_stat_activity where query like 'UPDATE alter_block SET %'; +2: COMMIT; +1<: diff --git a/src/test/singlenode_isolation2/sql/ao_partition_lock.sql b/src/test/singlenode_isolation2/sql/ao_partition_lock.sql new file mode 100644 index 00000000000..c997a1628de --- /dev/null +++ b/src/test/singlenode_isolation2/sql/ao_partition_lock.sql @@ -0,0 +1,29 @@ +-- Previously, even directly insert into a partition ao +-- table's child partition, the transaction will lock +-- all the tables' aoseg table in this partition on +-- each segment. This test case is to test that extra +-- lock is not acquired. + +create table test_ao_partition_lock +( field_dk integer ,field_part integer) +with (appendonly=true) +PARTITION BY LIST(field_part) +( + partition val1 values(1), + partition val2 values(2), + partition val3 values(3) +); + +1: begin; +1: insert into test_ao_partition_lock_1_prt_val1 values(1,1); + +2: begin; +2: alter table test_ao_partition_lock truncate partition for (2); +2: end; + +1: end; + +1q: +2q: + +drop table test_ao_partition_lock; diff --git a/src/test/singlenode_isolation2/sql/ao_same_trans_truncate_crash.sql b/src/test/singlenode_isolation2/sql/ao_same_trans_truncate_crash.sql new file mode 100644 index 00000000000..225a8397bc6 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/ao_same_trans_truncate_crash.sql @@ -0,0 +1,40 @@ +-- setup +-- Set fsync on since we need to test the fsync code logic. +!\retcode gpconfig -c fsync -v on --skipvalidation; +!\retcode gpstop -u; +-- skip FTS probes to avoid segment being marked down on restart +SELECT gp_inject_fault_infinite('fts_probe', 'skip', dbid) + FROM gp_segment_configuration WHERE role='p' AND content=-1; +SELECT gp_request_fts_probe_scan(); + + +-- test scenario + +-- The test is to validate crash recovery can be completed, for WAL +-- records generated by same transaction create and truncate followed +-- by abort transaction. Context is table created in same transaction +-- on truncate command performs unsafe truncate operation where it +-- emits WAL record for file truncate and truncates the file. During +-- crash recovery, file truncate WAL record replay will queue fsync +-- request. Replay of abort record will unlink the file. There used to +-- bug where abort record replay didn't emit forget fsync request +-- before unlink the file. This cased the crash recovery to PANIC as +-- couldn't complete the stale fsync request registered by file +-- truncate WAL record. +-- Also this is a chance of simply testing SyncAllXLogFile() thats fsync wal +-- files only during crash recovery. +1: CHECKPOINT; +1: BEGIN; +1: CREATE TABLE ao_same_trans_truncate(a int, b int) WITH (appendonly=true, orientation=column); +1: TRUNCATE TABLE ao_same_trans_truncate; +1: ABORT; +-- restart (immediate) to invoke crash recovery +1: SELECT pg_ctl(datadir, 'restart') FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; +-- validate the segments recovered fine and able to serve queries +2: SELECT oid from gp_dist_random('pg_class') WHERE relname='ao_same_trans_truncate'; + +-- cleanup +SELECT gp_inject_fault('fts_probe', 'reset', dbid) +FROM gp_segment_configuration WHERE role='p' AND content=-1; +!\retcode gpconfig -c fsync -v off --skipvalidation; +!\retcode gpstop -u; diff --git a/src/test/singlenode_isolation2/sql/bitmap_index_ao_sparse.sql b/src/test/singlenode_isolation2/sql/bitmap_index_ao_sparse.sql new file mode 100644 index 00000000000..499a85f28d6 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/bitmap_index_ao_sparse.sql @@ -0,0 +1,70 @@ +-- +-- Test, run Bitmap Heap Scan on AO/AOCS table's sparse bitmap index. +-- Here start two transactions in the same time to insert tuples +-- into different seg file. Then create bitmap index on it. +-- This will lead to very sparse bitmap index. +-- Since the tid in bitmap index for AO is composed of segfile no, +-- and row no. +-- + +-- Test AO table. +CREATE TABLE ao_sparse (id int) with(appendonly = true); + +1: begin; +2: begin; + +1: INSERT INTO ao_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; +2: INSERT INTO ao_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; + +1: commit; +2: commit; + +-- Let's check the total tuple count with id=97,99 without bitmap index. +SELECT count(*) FROM ao_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + +CREATE INDEX idx_ao_sparse_id ON ao_sparse USING bitmap (id); + + +-- Should generate Bitmap Heap Scan on the bitmap index. +1: set optimizer = off; +1: EXPLAIN (COSTS OFF) SELECT * FROM ao_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + +-- We used to hit assertion failure since it generates a empty bitmap for a block's PagetableEntry. +-- In BitmapHeapNext, if table_scan_bitmap_next_block returns false(which means the block should be +-- skipped), but we still try to fetch tuple through table_scan_bitmap_next_tuple, and it didn't find +-- the PagetableEntry is empty. +-- This error happens only when we fetch multiple LOVs when doing bitmap heap scan on bitmap index for +-- AO tables. AOCS table and "SELECT count(*) FROM ao_sparse WHERE id = 97" works fine. +1: SELECT count(*) FROM ao_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + +-- This query doesn't have any issue. +1: SELECT count(*) FROM ao_sparse WHERE id = 97; + + +-- Test AOCS table. +CREATE TABLE aocs_sparse (id int) with(appendonly = true, orientation = COLUMN); + +1: begin; +2: begin; + +1: INSERT INTO aocs_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; +2: INSERT INTO aocs_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; + +1: commit; +2: commit; + +-- Let's check the total tuple count with id=97 without bitmap index. +SELECT count(*) FROM aocs_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + +CREATE INDEX idx_ao_sparse_id ON aocs_sparse USING bitmap (id); + + +-- Should generate Bitmap Heap Scan on the bitmap index. +1: EXPLAIN (COSTS OFF) SELECT * FROM aocs_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + +-- This doesn't have any issue, but let's make sure it will not make any error in future. +1: SELECT count(*) FROM aocs_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = -1; + +-- This query doesn't have any issue. +1: SELECT count(*) FROM ao_sparse WHERE id = 97; + diff --git a/src/test/singlenode_isolation2/sql/bitmap_index_concurrent.sql b/src/test/singlenode_isolation2/sql/bitmap_index_concurrent.sql new file mode 100644 index 00000000000..bbac9e91d64 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/bitmap_index_concurrent.sql @@ -0,0 +1,265 @@ +-- +-- Concurrent scan on bitmap index when there's insert running in the backend +-- may cause the bitmap scan read wrong tid. +-- If a LOV has multiple bitmap pages, and the index insert tries to insert a tid +-- into a compressed word on a full bitmap page(Let's call the page `PAGE_FULL`). +-- Then it'll try to find free space on next bitmap page(Let's call the page `PAGE_NEXT`) +-- and rearrange the words and copy extra words into the next bitmap page. +-- So when the above insertion happens, imagine below case: +-- 1. Query on bitmap: A query starts and reads all bitmap pages to `PAGE_FULL`, increase +-- next tid to fetch, release lock after reading each page. +-- 2. Concurrent insert: insert a tid into `PAGE_FULL` cause expand compressed words to +-- new words, and rearrange words into `PAGE_NEXT`. +-- 3. Query on bitmap: fetch `PAGE_NEXT` and expect the first tid in it should equal the +-- saved next tid. But actually `PAGE_NEXT` now contains words used to belong in `PAGE_FULL`. +-- This causes the real next tid less than the expected next tid. But our scan keeps increasing +-- the wrong tid. And then this leads to a wrong result. +-- This related to issue: https://github.com/greenplum-db/gpdb/issues/11308 +-- + +-- Here we use append optimized table to speed up create full bitmap pages +-- since each transaction use different seg file number. And ao table's AOTupleId +-- is composed of (seg file number, row number). So this will lead to lots of +-- compressed words in the first bitmap page. +-- With the below transacions in each session, on seg0, the bitmap for id=97 +-- 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); + +1: begin; +2: begin; +3: begin; +4: begin; +5: begin; +6: begin; +7: begin; +8: begin; +9: begin; +10: begin; +11: begin; +12: begin; +13: begin; +14: begin; +15: begin; +16: begin; +17: begin; +18: begin; +19: begin; +20: begin; +21: begin; +22: begin; + +1: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +2: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +3: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +4: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +5: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +6: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +7: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +8: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +9: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +10: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +11: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +12: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +13: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +14: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +15: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +16: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +17: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +18: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +19: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +20: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +21: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; +22: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; + +1: commit; +2: commit; +3: commit; +4: commit; +5: commit; +6: commit; +7: commit; +8: commit; +9: commit; +10: commit; +11: commit; +12: commit; +13: commit; +14: commit; +15: commit; +16: commit; +17: commit; +18: commit; +19: commit; +20: commit; +21: commit; +22: commit; + +-- Let's check the total tuple count with id=97 without bitmap index. +SELECT count(*) FROM bmupdate WHERE id = 97; + +CREATE INDEX idx_bmupdate__id ON bmupdate USING bitmap (id); + +-- +-- Test 1, run Bitmap Heap Scan on the bitmap index when there's +-- backend insert running. +-- +-- Inject fault after read the first bitmap page when query the table. +SELECT gp_inject_fault_infinite('after_read_one_bitmap_idx_page', 'suspend', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Inject fault when insert new tid cause rearrange words from current +-- bitmap page to next bitmap page. +SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +1: set optimizer = off; +1: set enable_seqscan=off; +-- Should generate Bitmap Heap Scan on the bitmap index. +1: EXPLAIN (COSTS OFF) SELECT * FROM bmupdate WHERE id = 97; +-- Query should suspend on the first fault injection which finish read the first bitmap page. +1&: SELECT count(*) FROM bmupdate WHERE id = 97; + +-- Insert will insert new tid in the first bitmap page and cause the word expand +-- and rearrange exceed words to next bitmap page. +-- 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); + +-- Query should read the first page(buffer lock released), and then INSERT insert to +-- the first page which will trigger rearrange words. +SELECT gp_wait_until_triggered_fault('rearrange_word_to_next_bitmap_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; +SELECT gp_inject_fault('rearrange_word_to_next_bitmap_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Insert triggered rearrange +SELECT gp_wait_until_triggered_fault('after_read_one_bitmap_idx_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; +SELECT gp_inject_fault('after_read_one_bitmap_idx_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Should return the correct tuple count with id=97. It used to raise assertion failure for +-- AO tables. This is because the wrong tid transform to an invalud AOTupleId. +1<: + +-- Let's check the total tuple count after the test. +SELECT count(*) FROM bmupdate WHERE id = 97; + +-- +-- Test 2, run Index Scan on the bitmap index when there's backend +-- insert running. +-- +-- Inject fault after read the first bitmap page when query the table. +SELECT gp_inject_fault_infinite('after_read_one_bitmap_idx_page', 'suspend', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Inject fault when insert new tid cause rearrange words from current +-- bitmap page to next bitmap page. +SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +1: set enable_bitmapscan=off; +-- Should generate Index Scan on the bitmap index. +1: EXPLAIN (COSTS OFF) SELECT * FROM bmupdate WHERE id = 97; +-- Query should suspend on the first fault injection which finish read the first bitmap page. +1&: SELECT count(*) FROM bmupdate WHERE id = 97; + +-- Insert will insert new tid in the first bitmap page and cause the word expand +-- and rearrange exceed words to next bitmap page. +-- 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); + +-- Query should read the first page(buffer lock released), and then INSERT insert to +-- the first page which will trigger rearrange words. +SELECT gp_wait_until_triggered_fault('rearrange_word_to_next_bitmap_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; +SELECT gp_inject_fault('rearrange_word_to_next_bitmap_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Insert triggered rearrange +SELECT gp_wait_until_triggered_fault('after_read_one_bitmap_idx_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; +SELECT gp_inject_fault('after_read_one_bitmap_idx_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Should return the correct tuple count with id=97. It used to raise assertion failure for +-- AO tables. This is because the wrong tid transform to an invalud AOTupleId. +1<: + +-- +-- Test 3, run Index Scan on the bitmap index that match multiple keys when there's backend +-- insert running. +-- +-- Let's check the total tuple count before the test. +SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + +-- Inject fault after read the first bitmap page when query the table. +SELECT gp_inject_fault_infinite('after_read_one_bitmap_idx_page', 'suspend', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Inject fault when insert new tid cause rearrange words from current +-- bitmap page to next bitmap page. +SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Should generate Index Scan on the bitmap index that match multiple keys. +1: EXPLAIN (COSTS OFF) SELECT * FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; +-- Query should suspend on the first fault injection which finish read the first bitmap page. +1&: SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + +-- Insert will insert new tid in the first bitmap page and cause the word expand +-- and rearrange exceed words to next bitmap page. +-- 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. +-- Here insert both values to make sure update on full bitmap happens for one LOV. +2: INSERT INTO bmupdate VALUES (97); +2: INSERT INTO bmupdate VALUES (99); + +-- Query should read the first page(buffer lock released), and then INSERT insert to +-- the first page which will trigger rearrange words. +SELECT gp_wait_until_triggered_fault('rearrange_word_to_next_bitmap_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; +SELECT gp_inject_fault('rearrange_word_to_next_bitmap_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Insert triggered rearrange +SELECT gp_wait_until_triggered_fault('after_read_one_bitmap_idx_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; +SELECT gp_inject_fault('after_read_one_bitmap_idx_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Should return the correct tuple count with id=97. It used to raise assertion failure for +-- AO tables. This is because the wrong tid transform to an invalud AOTupleId. +1<: + +-- Let's check the total tuple count after the test. +SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + +-- +-- Test 4, run Bitmap Heap Scan on the bitmap index that match multiple keys when there's backend +-- insert running. +-- + +-- Inject fault after read the first bitmap page when query the table. +SELECT gp_inject_fault_infinite('after_read_one_bitmap_idx_page', 'suspend', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Inject fault when insert new tid cause rearrange words from current +-- bitmap page to next bitmap page. +SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +1: set enable_bitmapscan=on; +-- Should generate Bitmap HEAP Scan on the bitmap index that match multiple keys. +1: EXPLAIN (COSTS OFF) SELECT * FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; +-- Query should suspend on the first fault injection which finish read the first bitmap page. +1&: SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + +-- Insert will insert new tid in the first bitmap page and cause the word expand +-- and rearrange exceed words to next bitmap page. +-- 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. +-- 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); +2: INSERT INTO bmupdate SELECT 99 FROM generate_series(1, 1000); + +-- Query should read the first page(buffer lock released), and then INSERT insert to +-- the first page which will trigger rearrange words. +SELECT gp_wait_until_triggered_fault('rearrange_word_to_next_bitmap_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; +SELECT gp_inject_fault('rearrange_word_to_next_bitmap_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Insert triggered rearrange +SELECT gp_wait_until_triggered_fault('after_read_one_bitmap_idx_page', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = 0; +SELECT gp_inject_fault('after_read_one_bitmap_idx_page', 'reset', dbid) FROM gp_segment_configuration where role = 'p' and content = 0; + +-- Should return the correct tuple count with id=97. It used to raise assertion failure for +-- AO tables. This is because the wrong tid transform to an invalud AOTupleId. +1<: + +-- Let's check the total tuple count after the test. +SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; + +DROP TABLE bmupdate; + diff --git a/src/test/singlenode_isolation2/sql/bitmap_index_crash.sql b/src/test/singlenode_isolation2/sql/bitmap_index_crash.sql new file mode 100644 index 00000000000..0d7d171b77e --- /dev/null +++ b/src/test/singlenode_isolation2/sql/bitmap_index_crash.sql @@ -0,0 +1,38 @@ +-- Test to validate bitmap index is fine after crash recovery in-case +-- meta-page buffer eviction happens. There used to be bug if the +-- metapage is not present in shared buffers, it will not be fetched +-- from disk. Instead, a zeroed out page will be returned. A +-- subsequent flush of the metapage will lead to an inadvertent +-- overwrite. +1:CREATE EXTENSION IF NOT EXISTS gp_inject_fault; +-- 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; +1:SELECT gp_request_fts_probe_scan(); + +-- test setup +1:CREATE TABLE bm(a int); +1:CREATE INDEX ON bm USING bitmap (a); +-- 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'; +1:CHECKPOINT; + +-- this insert's WAL we wish to replay +1:insert into bm select generate_series(1, 5000); +1U:select pg_relation_size(oid)/current_setting('block_size')::bigint from pg_class where relname = 'bm_a_idx'; + +-- set small shared_buffers to make sure META_PAGE of bitmap index evicts out +1U: ALTER SYSTEM set shared_buffers to 20; +1:SELECT pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' and content = 1; + +-- force index scan and make sure the index is fine +2:SET enable_seqscan to off; +2:SELECT * FROM bm WHERE a < 10; + +-- teardown cleanup for the test +1Uq: +1U:ALTER SYSTEM reset shared_buffers; +2:SELECT pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' and content = 1; +3:SELECT gp_inject_fault_infinite('checkpoint', 'reset', dbid) FROM gp_segment_configuration WHERE role='p'; + +3:SELECT gp_inject_fault('fts_probe', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; diff --git a/src/test/singlenode_isolation2/sql/bitmap_index_inspect.sql b/src/test/singlenode_isolation2/sql/bitmap_index_inspect.sql new file mode 100644 index 00000000000..b80fab9f287 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/bitmap_index_inspect.sql @@ -0,0 +1,38 @@ +-- This tests the bitmap index pageinspect functions. The tests reside here, as opposed to +-- contrib/pageinspect because we want to leverage isolation2's utility mode syntax (since the +-- inspect functions run against a single node, as opposed to the entire GP cluster) + +-- Setup +1U: CREATE EXTENSION pageinspect; +1U: CREATE TABLE bmtest_t1(i int, bmfield int); +1U: CREATE INDEX bmtest_i1 ON bmtest_t1 USING bitmap(bmfield); +1U: INSERT INTO bmtest_t1 SELECT i,1 FROM generate_series(1, 1000) i; +1U: INSERT INTO bmtest_t1 SELECT i,2 FROM generate_series(1, 1000) i; + +-- start_matchsubs +-- m/bmfuncs.c:\d+/ +-- s/bmfuncs.c:\d+/bmfuncs.c:XXX/g +-- end_matchsubs + +-- Test metapage +1U: SELECT magic, version, regexp_replace(auxrelid::regclass::text,'[[:digit:]]+', 'auxrelid') AS auxrelname, + regexp_replace(auxindexrelid::regclass::text,'[[:digit:]]+', 'auxindrelid') AS auxindexrelname FROM bm_metap('bmtest_i1'); + +-- Test LOV item pages +-- Negative cases (not a LOV page) +1U: SELECT * FROM bm_lov_page_items('bmtest_i1', 0); +1U: SELECT * FROM bm_lov_page_items('bmtest_i1', 2); +-- Positive test +1U: SELECT * FROM bm_lov_page_items('bmtest_i1', 1) order by itemoffset; + +-- Test bitmap pages +-- Negative cases (not a bitmap page) +1U: SELECT * FROM bm_bitmap_page_items('bmtest_i1', 0); +1U: SELECT * FROM bm_bitmap_page_items('bmtest_i1', 1); +-- Positive test +1U: SELECT * FROM bm_bitmap_page_header('bmtest_i1', 2); +1U: SELECT * FROM bm_bitmap_page_items('bmtest_i1', 2) order by word_num; + +-- cleanup +1U: DROP TABLE bmtest_t1; +1U: DROP EXTENSION pageinspect; diff --git a/src/test/singlenode_isolation2/sql/bitmap_union.sql b/src/test/singlenode_isolation2/sql/bitmap_union.sql new file mode 100644 index 00000000000..68268353171 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/bitmap_union.sql @@ -0,0 +1,27 @@ +-- +-- Test union bitmap batch words for multivalues index scan like where x in (x1, x2) or x > v +-- which creates BitmapAnd plan on two bitmap indexs that match multiple keys by using in in where clause +-- +CREATE TABLE bmunion (a int, b int); +INSERT INTO bmunion + SELECT (r%53), (r%59) + FROM generate_series(1,70000) r; +CREATE INDEX i_bmtest2_a ON bmunion USING BITMAP(a); +CREATE INDEX i_bmtest2_b ON bmunion USING BITMAP(b); +INSERT INTO bmunion SELECT 53, 1 FROM generate_series(1, 1000); + +SET optimizer_enable_tablescan=OFF; +SET optimizer_enable_dynamictablescan=OFF; +-- Inject fault for planner so that it could produce bitMapAnd plan node. +SELECT gp_inject_fault('simulate_bitmap_and', 'skip', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = -1; +EXPLAIN (COSTS OFF) SELECT count(*) FROM bmunion WHERE a = 53 AND b < 3; +SELECT gp_inject_fault('simulate_bitmap_and', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = -1; + +SELECT gp_inject_fault('simulate_bitmap_and', 'skip', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = -1; +SELECT count(*) FROM bmunion WHERE a = 53 AND b < 3; +SELECT gp_inject_fault('simulate_bitmap_and', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = -1; + +RESET optimizer_enable_tablescan; +RESET optimizer_enable_dynamictablescan; + +DROP TABLE bmunion; diff --git a/src/test/singlenode_isolation2/sql/bitmap_update_words_backup_block.sql b/src/test/singlenode_isolation2/sql/bitmap_update_words_backup_block.sql new file mode 100644 index 00000000000..639f27d13bf --- /dev/null +++ b/src/test/singlenode_isolation2/sql/bitmap_update_words_backup_block.sql @@ -0,0 +1,36 @@ +-- Setup fault injectors. +CREATE EXTENSION IF NOT EXISTS gp_inject_fault; + +-- 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; +1:SELECT gp_request_fts_probe_scan(); +CREATE TABLE bm_update_words_backup_block (id int) WITH (appendonly = true); + +1: BEGIN; +2: BEGIN; +1: INSERT INTO bm_update_words_backup_block SELECT i%100 FROM generate_series(1, 200) AS i; +2: INSERT INTO bm_update_words_backup_block SELECT i%100 FROM generate_series(1, 200) AS i; +1: COMMIT; +2: COMMIT; + +CREATE INDEX bm_update_words_backup_block_idx ON bm_update_words_backup_block USING bitmap (id); + +-- 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); +2: INSERT INTO bm_update_words_backup_block VALUES (97), (99); + +-- 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; +2: INSERT INTO bm_update_words_backup_block VALUES (97); + +-- Do an immediate restart to force crash recovery. The above INSERT +-- should be replayed with the backup blocks. +1: SELECT pg_ctl(datadir, 'restart') FROM gp_segment_configuration WHERE role = 'p' AND content = 0; +3: INSERT INTO bm_update_words_backup_block VALUES (97); + +-- 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/singlenode_isolation2/sql/cancel_plpython.sql b/src/test/singlenode_isolation2/sql/cancel_plpython.sql new file mode 100644 index 00000000000..0c78b5a7115 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/cancel_plpython.sql @@ -0,0 +1,77 @@ +-- start_ignore +CREATE LANGUAGE plpython3u; +-- end_ignore +CREATE OR REPLACE FUNCTION pybusyloop() RETURNS double precision AS $$ +import math +while True: + a = 1 +return 1 +$$ LANGUAGE plpython3u; + +CREATE OR REPLACE FUNCTION pysleep() RETURNS double precision AS $$ +import time +time.sleep(100) +return 1 +$$ LANGUAGE plpython3u; + +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 OR REPLACE FUNCTION pynestsleep() RETURNS double precision AS $$ +# container: plc_python_shared +rv = plpy.execute("select pyspisleep()") +return 1 +$$ LANGUAGE plpython3u; + +CREATE OR REPLACE FUNCTION pynestsleep2() RETURNS double precision AS $$ +# container: plc_python_shared +rv = plpy.execute("select pysleep()") +return 1 +$$ LANGUAGE plpython3u; + + +CREATE TABLE a(i int); +insert into a values(1),(10),(20),(100); + +1&: select pybusyloop(); +2&: select pybusyloop() from a; +3&: select pysleep(); +4&: select pysleep() from a; +5&: select pyspisleep(); +6&: select pynestsleep(); +7&: select pynestsleep2(); + + +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') +FROM pg_stat_activity WHERE query LIKE 'select pybusyloop()%' ORDER BY pid LIMIT 2; +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') +FROM pg_stat_activity WHERE query LIKE 'select pysleep()%' ORDER BY pid LIMIT 2; +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') +FROM pg_stat_activity WHERE query LIKE 'select pyspisleep()%' ORDER BY pid LIMIT 1; +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') +FROM pg_stat_activity WHERE query LIKE 'select pynestsleep()%' ORDER BY pid LIMIT 1; +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') +FROM pg_stat_activity WHERE query LIKE 'select pynestsleep2()%' ORDER BY pid LIMIT 1; +-- start_ignore +-- start_ignore +-- start_ignore +-- start_ignore +1<: +1q: +2<: +2q: +3<: +3q: +4<: +4q: +5<: +5q: +6<: +6q: +7<: +7q: +-- end_ignore + diff --git a/src/test/singlenode_isolation2/sql/cancel_query.sql b/src/test/singlenode_isolation2/sql/cancel_query.sql new file mode 100644 index 00000000000..c454a44ddc1 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/cancel_query.sql @@ -0,0 +1,40 @@ +CREATE EXTENSION IF NOT EXISTS gp_inject_fault; + +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') +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) + ); +0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2018-01-01 10:00:00', 1, 3); +0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2019-01-01 12:00:00', 2, 4); +0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2020-01-01 13:00:00', 3, 5); + +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'; +0&: SELECT gp_wait_until_triggered_fault('zlib_decompress_after_decompress_fn', 1, dbid) FROM gp_segment_configuration WHERE content=-1 AND role='p'; + +-- ANALYZE on AO/CO table with zlib compression will hit and fault injection +-- 'zlib_decompress_after_decompress_fn' +1&: ANALYZE a_partition_table_for_analyze_cancellation_1_prt_p3; + +-- It should still be possible to cancel the ANALYZE backend +2: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND application_name='pg_regress'; +0<: +1<: + +SELECT gp_inject_fault('zlib_decompress_after_decompress_fn', 'reset', dbid) FROM gp_segment_configuration; diff --git a/src/test/singlenode_isolation2/sql/check_gxid.sql b/src/test/singlenode_isolation2/sql/check_gxid.sql new file mode 100644 index 00000000000..5d6af896977 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/check_gxid.sql @@ -0,0 +1,18 @@ +select gp_segment_id, gp_get_next_gxid() < (select gp_get_next_gxid()) from gp_dist_random('gp_id'); +-- start_ignore +select gp_segment_id,gp_get_next_gxid() on_seg, (select gp_get_next_gxid() on_cor) from gp_dist_random('gp_id'); +-- end_ignore + +-- trigger master panic and wait until master down before running any new query. +1&: SELECT wait_till_master_shutsdown(); +2: SELECT gp_inject_fault('before_read_command', 'panic', 1); +2: SELECT 1; +1<: + +-- wait until master is up for querying. +3: SELECT 1; + +3: select gp_segment_id, gp_get_next_gxid() < (select gp_get_next_gxid()) from gp_dist_random('gp_id'); +-- start_ignore +3: select gp_segment_id,gp_get_next_gxid() on_seg, (select gp_get_next_gxid() on_cor) from gp_dist_random('gp_id'); +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/checkpoint_dtx_info.sql b/src/test/singlenode_isolation2/sql/checkpoint_dtx_info.sql new file mode 100644 index 00000000000..b7fe6df3a7d --- /dev/null +++ b/src/test/singlenode_isolation2/sql/checkpoint_dtx_info.sql @@ -0,0 +1,49 @@ +-- Scenario to test, CHECKPOINT getting distributed transaction +-- information between COMMIT processing time window +-- `XLogInsert(RM_XACT_ID, XLOG_XACT_DISTRIBUTED_COMMIT)` and +-- insertedDistributedCommitted(). `delayChkpt` protects this +-- case. There used to bug in placement of getDtxCheckPointInfo() in +-- checkpoint code causing, transaction to be committed on coordinator +-- and aborted on segments. Test case is meant to validate +-- getDtxCheckPointInfo() gets called after +-- GetVirtualXIDsDelayingChkpt(). +-- +-- Test controls the progress of COMMIT executed in session 1 and of +-- CHECKPOINT executed in the checkpointer process, with high-level +-- flow: +-- +-- 1. session 1: COMMIT is blocked at start_insertedDistributedCommitted +-- 2. checkpointer: Start a CHECKPOINT and wait to reach before_wait_VirtualXIDsDelayingChkpt +-- 3. session 1: COMMIT is resumed +-- 4. checkpointer: CHECKPOINT is resumed and executes to keep_log_seg to finally introduce panic and perform crash recovery +-- +-- Bug existed when getDtxCheckPointInfo() was invoked before +-- GetVirtualXIDsDelayingChkpt(), getDtxCheckPointInfo() will not +-- contain the distributed transaction in session1 whose state is +-- DTX_STATE_INSERTED_COMMITTED. Therefore, after crash recovery, the +-- 2PC transaction that has been committed on coordinator will be +-- considered as orphaned prepared transaction hence is aborted at +-- segments. As a result the SELECT executed by session3 used to fail +-- because the twopcbug table only existed on the coordinator. +-- +1: select gp_inject_fault_infinite('start_insertedDistributedCommitted', 'suspend', 1); +1: begin; +1: create table twopcbug(i int, j int); +1&: commit; +2: select gp_inject_fault_infinite('before_wait_VirtualXIDsDelayingChkpt', 'skip', 1); +33&: checkpoint; +2: select gp_inject_fault_infinite('keep_log_seg', 'panic', 1); +-- wait to make sure we don't resume commit processing before this +-- step in checkpoint +2: select gp_wait_until_triggered_fault('before_wait_VirtualXIDsDelayingChkpt', 1, 1); +-- reason for this inifinite wait is just to avoid test flake. Without +-- this joining step "1<" may see "COMMIT" sometimes or "server closed +-- the connection unexpectedly" otherwise. With this its always +-- "server closed the connection unexpectedly". +2: select gp_inject_fault_infinite('after_xlog_xact_distributed_commit', 'infinite_loop', 1); +2: select gp_inject_fault_infinite('start_insertedDistributedCommitted', 'resume', 1); +1<: +33<: +-- wait until coordinator is up for querying. +3: select 1; +3: select count(1) from twopcbug; diff --git a/src/test/singlenode_isolation2/sql/commit_transaction_block_checkpoint.sql b/src/test/singlenode_isolation2/sql/commit_transaction_block_checkpoint.sql new file mode 100644 index 00000000000..5101b6132fe --- /dev/null +++ b/src/test/singlenode_isolation2/sql/commit_transaction_block_checkpoint.sql @@ -0,0 +1,44 @@ +-- TEST 1: block checkpoint on segments + +-- pause the 2PC after setting inCommit flag +select gp_inject_fault_infinite('before_xlog_xact_commit_prepared', 'suspend', 3); + +-- trigger a 2PC, and it will block at commit; +2: checkpoint; +2: begin; +2: create table t_commit_transaction_block_checkpoint (c int) distributed by (c); +2&: commit; + +-- wait for the fault to trigger since following checkpoint could be faster +select gp_wait_until_triggered_fault('before_xlog_xact_commit_prepared', 1, 3); + +-- do checkpoint on segment content 1 in utility mode, and it should block +1U&: checkpoint; + +-- resume the 2PC after setting inCommit flag +select gp_inject_fault('before_xlog_xact_commit_prepared', 'reset', 3); +2<: +1U<: + +-- TEST 2: block checkpoint on master + +-- pause the CommitTransaction right before persistent table cleanup after +-- notifyCommittedDtxTransaction() +select gp_inject_fault_infinite('onephase_transaction_commit', 'suspend', 1); + +-- trigger a 2PC, and it will block at commit; +2: checkpoint; +2: begin; +2: drop table t_commit_transaction_block_checkpoint; +2&: commit; + +-- wait for the fault to trigger since following checkpoint could be faster +select gp_wait_until_triggered_fault('onephase_transaction_commit', 1, 1); + +-- do checkpoint on master in utility mode, and it should block +-1U&: checkpoint; + +-- resume the 2PC +select gp_inject_fault('onephase_transaction_commit', 'reset', 1); +2<: +-1U<: diff --git a/src/test/singlenode_isolation2/sql/concurrent_drop_truncate_tablespace.sql b/src/test/singlenode_isolation2/sql/concurrent_drop_truncate_tablespace.sql new file mode 100644 index 00000000000..6ac4648b039 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/concurrent_drop_truncate_tablespace.sql @@ -0,0 +1,28 @@ +-- While a tablespace is being dropped, if any table is created +-- in the same tablespace, the data of that table should not be deleted + +-- create a tablespace directory +!\retcode rm -rf /tmp/concurrent_tblspace; +!\retcode mkdir -p /tmp/concurrent_tblspace; + +CREATE TABLESPACE concurrent_tblspace LOCATION '/tmp/concurrent_tblspace'; + +-- suspend execution after TablespaceCreateLock is released +SELECT gp_inject_fault('AfterTablespaceCreateLockRelease', 'suspend', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; +1&:DROP TABLESPACE concurrent_tblspace; + +-- wait for the fault to be triggered +SELECT gp_wait_until_triggered_fault('AfterTablespaceCreateLockRelease', 1, dbid) + from gp_segment_configuration where content <> -1 and role='p'; + +-- create a table in the same tablespace which is being dropped via a concurrent session +CREATE TABLE drop_tablespace_tbl(a int, b int) TABLESPACE concurrent_tblspace DISTRIBUTED BY (a); +INSERT INTO drop_tablespace_tbl SELECT i, i FROM generate_series(1,100)i; +-- 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'; +1<: +-- check data exists +SELECT count(*) FROM drop_tablespace_tbl; +-- move to another tablespace and check the data. +ALTER TABLE drop_tablespace_tbl SET TABLESPACE pg_default; +SELECT count(*) FROM drop_tablespace_tbl; diff --git a/src/test/singlenode_isolation2/sql/concurrent_index_creation_should_not_deadlock.sql b/src/test/singlenode_isolation2/sql/concurrent_index_creation_should_not_deadlock.sql new file mode 100644 index 00000000000..1174660c4ad --- /dev/null +++ b/src/test/singlenode_isolation2/sql/concurrent_index_creation_should_not_deadlock.sql @@ -0,0 +1,16 @@ +-- Create an append only table, popluated with data +CREATE TABLE index_deadlocking_test_table (value int) WITH (appendonly=true); + +-- Setup a fault to ensure that the first session pauses while creating an index, +-- ensuring a concurrent index creation. +SELECT gp_inject_fault('before_acquire_lock_during_create_ao_blkdir_table', 'suspend', 1); + +-- Attempt to concurrently create an index +1>: CREATE INDEX index_deadlocking_test_table_idx1 ON index_deadlocking_test_table (value); +SELECT gp_wait_until_triggered_fault('before_acquire_lock_during_create_ao_blkdir_table', 1, 1); +2>: CREATE INDEX index_deadlocking_test_table_idx2 ON index_deadlocking_test_table (value); +SELECT gp_inject_fault('before_acquire_lock_during_create_ao_blkdir_table', 'reset', 1); + +-- Both index creation attempts should succeed +1<: +2<: diff --git a/src/test/singlenode_isolation2/sql/crash_recovery.sql b/src/test/singlenode_isolation2/sql/crash_recovery.sql new file mode 100644 index 00000000000..a7351c8f7d8 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/crash_recovery.sql @@ -0,0 +1,50 @@ +1:CREATE TABLE crash_test_table(c1 int); + +1:SELECT role, preferred_role, content, status FROM gp_segment_configuration; +-- transaction of session 2 and session 3 inserted 'COMMIT' record before checkpoint +1:select gp_inject_fault_infinite('dtm_broadcast_commit_prepared', 'suspend', 1); +2&:insert into crash_test_table values (1), (11), (111), (1111); +3&:create table crash_test_ddl(c1 int); + +-- wait session 2 and session 3 hit inject point +1:select gp_wait_until_triggered_fault('dtm_broadcast_commit_prepared', 2, 1); +1:CHECKPOINT; + +-- transaction of session 4 inserted 'COMMIT' record after checkpoint +4&:insert into crash_test_table values (2), (22), (222), (2222); + +-- wait session 4 hit inject point +1:select gp_wait_until_triggered_fault('dtm_broadcast_commit_prepared', 3, 1); + +-- transaction of session 5 didn't insert 'COMMIT' record +1:select gp_inject_fault_infinite('transaction_abort_after_distributed_prepared', 'suspend', 1); +5&:INSERT INTO crash_test_table VALUES (3), (33), (333), (3333); + +-- wait session 5 hit inject point +1:select gp_wait_until_triggered_fault('transaction_abort_after_distributed_prepared', 1, 1); + +-- check injector status +1:select gp_inject_fault('dtm_broadcast_commit_prepared', 'status', 1); +1:select gp_inject_fault('transaction_abort_after_distributed_prepared', 'status', 1); + +-- trigger crash on QD +1:select gp_inject_fault('exec_simple_query_start', 'panic', current_setting('gp_dbid')::smallint); +-- verify master panic happens. The PANIC message does not emit sometimes so +-- mask it. +-- start_matchsubs +-- m/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n/ +-- s/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n// +-- end_matchsubs +1:select 1; + +2<: +3<: +4<: +5<: + +-- transaction of session 2, session 3 and session 4 will be committed during recovery. +-- SELECT from a heap table, result order is uncertain. +-- Strangely, the test framework does not sort this output. +-- So to make things correct, we add `order by` here. +6:select * from crash_test_table order by 1; +6:select * from crash_test_ddl order by 1; diff --git a/src/test/singlenode_isolation2/sql/crash_recovery_dtm.sql b/src/test/singlenode_isolation2/sql/crash_recovery_dtm.sql new file mode 100644 index 00000000000..b946b961c14 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/crash_recovery_dtm.sql @@ -0,0 +1,242 @@ +-- Test scenarios covering crash recovery for some specific DTM point. +-- +-- start_matchsubs +-- +-- # create a match/subs expression +-- +-- s/\s+\(.*\.[ch]:\d+\)/ (SOMEFILE:SOMEFUNC)/ +-- m/(PANIC):.*unable to complete*/ +-- +-- m/^ERROR: Error on receive from seg0.*: server closed the connection unexpectedly/ +-- s/^ERROR: Error on receive from seg0.*: server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/ +-- +-- end_matchsubs + +-- 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; +select pg_reload_conf(); + +1:SELECT role, preferred_role, content, status FROM gp_segment_configuration; +-- Scenario 1: Test to fail broadcasting of COMMIT PREPARED to one +-- segment and hence trigger PANIC in master while after completing +-- phase 2 of 2PC. Master's recovery cycle should correctly broadcast +-- COMMIT PREPARED again because master should find distributed commit +-- record in its xlog during recovery. Verify that the transaction is +-- committed after recovery. This scenario used to create cluster +-- inconsistency due to bug fixed now, as transaction used to get +-- committed on all segments except one where COMMIT PREPARED +-- broadcast failed before recovery. Master used to miss sending the +-- COMMIT PREPARED across restart and instead abort the transaction +-- after querying in-doubt prepared transactions from segments. +-- Inject fault to fail the COMMIT PREPARED on one segment. +-- Temporarily disable retry finish prepared in this session, because +-- we are not interested in testing the retry logic. This makes it +-- suffice to trigger the fault only once. Otherwise, the fault may +-- continue to trigger even after PANIC on coordinator, impacting +-- finish prepared operation during crash recovery. +1: SET dtx_phase2_retry_second = 0; +1: SELECT gp_inject_fault('finish_prepared_start_of_function', 'error', dbid) + from gp_segment_configuration where content=0 and role='p'; +-- Start looping in background, till master panics and closes the session +3&: SELECT wait_till_master_shutsdown(); +-- Start transaction which should hit PANIC as COMMIT PREPARED will fail to one segment +1: CREATE TABLE commit_phase1_panic(a int, b int); +-- Reset the fault in utility mode because normal mode connection will +-- not be accepted until DTX recovery is finished. +-1U: SELECT gp_inject_fault('finish_prepared_start_of_function', 'reset', dbid) + from gp_segment_configuration where content=0 and role='p'; +-1Uq: +-- Join back to know master has completed postmaster reset. +3<: +-- Start a session on master which would complete the DTM recovery and hence COMMIT PREPARED +4: SELECT * from commit_phase1_panic; +4: INSERT INTO commit_phase1_panic select i,i from generate_series(1, 10)i; +4: SELECT count(*) from commit_phase1_panic; + +-- Scenario 2: Inject FATAL on master after recording commit but +-- before broadcasting COMMIT_PREPARED to segments. FATAL must convert +-- to PANIC and make sure to complete the 2PC processing and not leave +-- dangling prepared transaction. There used to bug as a result the +-- master backend process would just die, leaving dangling prepared +-- transaction on segment but commited on master. + +-- Start looping in background, till master panics and closes the +-- session +5&: SELECT wait_till_master_shutsdown(); +6: SELECT gp_inject_fault('dtm_broadcast_commit_prepared', 'fatal', dbid) + from gp_segment_configuration where role='p' and content=-1; +6: CREATE TABLE commit_fatal_fault_test_table(a int, b int); +5<: +-- Start a session on master which would complete the DTM recovery and hence COMMIT PREPARED +7: SELECT count(*) from commit_fatal_fault_test_table; +7: SELECT * FROM gp_dist_random('pg_prepared_xacts'); +7: SELECT gp_inject_fault('dtm_broadcast_commit_prepared', 'reset', dbid) + from gp_segment_configuration where role='p' and content=-1; + +-- Scenario 3: Inject ERROR after prepare phase has completed to +-- trigger abort. Then on abort inject FATAL on master before sending +-- ABORT_PREPARED. FATAL must convert to PANIC and make sure to +-- complete the 2PC processing and not leave dangling prepared +-- transaction. There used to bug as a result the master backend +-- process would just die, leaving dangling prepared transaction on +-- segment but aborted on master. + +-- Start looping in background, till master panics and closes the +-- session +8&: SELECT wait_till_master_shutsdown(); +9: SELECT gp_inject_fault('transaction_abort_after_distributed_prepared', 'error', dbid) + from gp_segment_configuration where role='p' and content=-1; +9: SELECT gp_inject_fault('dtm_broadcast_abort_prepared', 'fatal', dbid) + from gp_segment_configuration where role='p' and content=-1; +9: CREATE TABLE abort_fatal_fault_test_table(a int, b int); +8<: +10: SELECT count(*) from abort_fatal_fault_test_table; +10: SELECT * FROM gp_dist_random('pg_prepared_xacts'); +10: SELECT gp_inject_fault('transaction_abort_after_distributed_prepared', 'reset', dbid) + from gp_segment_configuration where role='p' and content=-1; +10: SELECT gp_inject_fault('dtm_broadcast_abort_prepared', 'reset', dbid) + from gp_segment_configuration where role='p' and content=-1; + +-- Scenario 4: QE panics after writing prepare xlog record. This +-- 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); +11: INSERT INTO QE_panic_test_table SELECT * from generate_series(0, 9); +-- To help speedy recovery +11: CHECKPOINT; +-- Increase 2PC retry timeout to avoid any failures. Alter +-- 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; +11: select pg_reload_conf(); +-- skip FTS probes always +11: SELECT gp_inject_fault_infinite('fts_probe', 'skip', dbid) + from gp_segment_configuration where role='p' and content=-1; +11: SELECT gp_request_fts_probe_scan(); +11: SELECT gp_inject_fault('end_prepare_two_phase', 'infinite_loop', dbid) + from gp_segment_configuration where role='p' and content=0; +-- statement to trigger fault after writing prepare record +12&: DELETE FROM QE_panic_test_table; +11: SELECT gp_wait_until_triggered_fault('end_prepare_two_phase', 1, dbid) + from gp_segment_configuration where role='p' and content=0; +11: SELECT pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' and content = 0; +12<: +13: SELECT count(*) from QE_panic_test_table; +13: SELECT * FROM gp_dist_random('pg_prepared_xacts'); +13: SELECT gp_inject_fault('fts_probe', 'reset', dbid) + from gp_segment_configuration where role='p' and content=-1; +13: alter system reset dtx_phase2_retry_second; +13: select pg_reload_conf(); + +-- 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); +15: SELECT gp_inject_fault_infinite('before_xlog_xact_prepare', 'suspend', dbid) + from gp_segment_configuration where role = 'p' and content = 1; +15: SELECT gp_inject_fault_infinite('after_xlog_xact_prepare_flushed', 'skip', dbid) + from gp_segment_configuration where role = 'p' and content = 1; +16&: INSERT INTO master_reset SELECT a from generate_series(1, 10) a; +15: SELECT gp_wait_until_triggered_fault('before_xlog_xact_prepare', 1, dbid) + from gp_segment_configuration where role = 'p' and content = 1; + +-- set gucs to speed up testing +15: ALTER SYSTEM SET gp_dtx_recovery_prepared_period to 0; +15: ALTER SYSTEM SET gp_dtx_recovery_interval to 5; +15: SELECT pg_reload_conf(); + +-- trigger master panic and wait until master down before running any new query. +17&: SELECT wait_till_master_shutsdown(); +18: SELECT gp_inject_fault('exec_simple_query_start', 'panic', current_setting('gp_dbid')::smallint); +18: SELECT 1; +16<: +17<: + +-- wait until master is up for querying. +19: SELECT 1; + +-- master suspends before running periodical checking of orphaned prepared transactions. +19: SELECT gp_inject_fault_infinite('before_orphaned_check', 'suspend', dbid) + from gp_segment_configuration where role = 'p' and content = -1; +19: SELECT gp_wait_until_triggered_fault('before_orphaned_check', 1, dbid) + from gp_segment_configuration where role = 'p' and content = -1; + +-- let prepare finish else dtx recovery can not abort the prepared transaction. +19: SELECT gp_inject_fault_infinite('before_xlog_xact_prepare', 'reset', dbid) + from gp_segment_configuration where role = 'p' and content = 1; +19: SELECT gp_wait_until_triggered_fault('after_xlog_xact_prepare_flushed', 1, dbid) + from gp_segment_configuration where role = 'p' and content = 1; +19: SELECT gp_inject_fault_infinite('after_xlog_xact_prepare_flushed', 'reset', dbid) + from gp_segment_configuration where role = 'p' and content = 1; + +-- should exist an orphaned prepared transaction. +1U: SELECT count(*) from pg_prepared_xacts; + +-- if there is orphaned prepared transaction, drop would hang since +-- the orphaned prepared transaction holds lock of the table that conflicts +-- with required lock of the drop operation. +19: SELECT gp_inject_fault_infinite('before_orphaned_check', 'reset', dbid) + from gp_segment_configuration where role = 'p' and content = -1; +19: DROP TABLE master_reset; +19: ALTER SYSTEM RESET gp_dtx_recovery_interval; +19: ALTER SYSTEM RESET gp_dtx_recovery_prepared_period; +19: SELECT pg_reload_conf(); + +-- ensure the orphaned prepared transaction is gone. +1U: SELECT * from pg_prepared_xacts; + +-- Scenario 6: retry Abort Prepared on QD fails but won't cause panic. The dtx +-- recovery process finally aborts it. + +-- speed up testing by setting some gucs. +20: ALTER SYSTEM SET gp_dtx_recovery_prepared_period to 0; +20: ALTER SYSTEM SET gp_dtx_recovery_interval to 5; +20: ALTER SYSTEM SET dtx_phase2_retry_second to 5; +20: SELECT pg_reload_conf(); + +20: CREATE TABLE test_retry_abort(a int); + +-- master: set fault to trigger abort prepare +-- primary 0: set fault so that retry prepared abort fails. +20: SELECT gp_inject_fault('dtm_broadcast_prepare', 'error', dbid) + from gp_segment_configuration where role = 'p' and content = -1; +20: SELECT gp_inject_fault_infinite('finish_prepared_start_of_function', 'error', dbid) + from gp_segment_configuration where role = 'p' and content = 0; + +-- run two phase query. +21: INSERT INTO test_retry_abort SELECT generate_series(1,10); + +-- verify the transaction was aborted and there is one orphaned prepared +-- transaction on seg0. +20: SELECT * from test_retry_abort; +0U: SELECT count(*) from pg_prepared_xacts; + +-- dtx recovery ready to handle the orphaned prepared transaction. +20: SELECT gp_inject_fault_infinite('before_orphaned_check', 'suspend', dbid) + from gp_segment_configuration where role = 'p' and content = -1; +20: SELECT gp_wait_until_triggered_fault('before_orphaned_check', 1, dbid) + from gp_segment_configuration where role = 'p' and content = -1; +20: SELECT gp_inject_fault_infinite('after_orphaned_check', 'skip', dbid) + from gp_segment_configuration where role = 'p' and content = -1; + +-- kick off abort prepared on seg0 and then dtx recovery will abort that one. +20: SELECT gp_inject_fault_infinite('finish_prepared_start_of_function', 'reset', dbid) + from gp_segment_configuration where role = 'p' and content = 0; +20: SELECT gp_inject_fault_infinite('before_orphaned_check', 'reset', dbid) + from gp_segment_configuration where role = 'p' and content = -1; + +-- verify there is no orphaned prepared transaction on seg0. +20: SELECT gp_wait_until_triggered_fault('after_orphaned_check', 1, dbid) + from gp_segment_configuration where role = 'p' and content = -1; +0U: SELECT * from pg_prepared_xacts; + +-- cleanup +20: ALTER SYSTEM RESET gp_dtx_recovery_interval; +20: ALTER SYSTEM RESET gp_dtx_recovery_prepared_period; +20: ALTER SYSTEM RESET dtx_phase2_retry_second; +20: SELECT pg_reload_conf(); +20: SELECT gp_inject_fault('dtm_broadcast_prepare', 'reset', dbid) + from gp_segment_configuration where role = 'p' and content = -1; +20: SELECT gp_inject_fault_infinite('after_orphaned_check', 'reset', dbid) + from gp_segment_configuration where role = 'p' and content = -1; +20: DROP TABLE test_retry_abort; diff --git a/src/test/singlenode_isolation2/sql/crash_recovery_redundant_dtx.sql b/src/test/singlenode_isolation2/sql/crash_recovery_redundant_dtx.sql new file mode 100644 index 00000000000..138701a3224 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/crash_recovery_redundant_dtx.sql @@ -0,0 +1,34 @@ +1:CREATE TABLE crash_test_redundant(c1 int); + +1:SELECT role, preferred_role, content, status FROM gp_segment_configuration; +-- transaction of session 2 suspend after inserted 'COMMIT' record +1:select gp_inject_fault_infinite('dtm_broadcast_commit_prepared', 'suspend', 1); +-- checkpoint suspend before scanning proc array +1:select gp_inject_fault_infinite('checkpoint_dtx_info', 'suspend', 1); +1&:CHECKPOINT; + +-- wait till checkpoint reaches intended point +2:select gp_wait_until_triggered_fault('checkpoint_dtx_info', 1, 1); +-- the 'COMMIT' record is logically after REDO pointer +2&:insert into crash_test_redundant values (1), (2), (3); + +-- resume checkpoint +3:select gp_inject_fault('checkpoint_dtx_info', 'reset', 1); +1<: + +-- wait till insert reaches intended point +1:select gp_wait_until_triggered_fault('dtm_broadcast_commit_prepared', 1, 1); +-- trigger crash on QD +1:select gp_inject_fault('exec_simple_query_start', 'panic', current_setting('gp_dbid')::smallint); +-- verify master panic happens. The PANIC message does not emit sometimes so +-- mask it. +-- start_matchsubs +-- m/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n/ +-- s/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n// +-- end_matchsubs +1:select 1; + +2<: + +-- transaction of session 2 should be recovered properly +4:select * from crash_test_redundant; diff --git a/src/test/singlenode_isolation2/sql/create_memory_accounting_tables.sql b/src/test/singlenode_isolation2/sql/create_memory_accounting_tables.sql new file mode 100644 index 00000000000..5e7fcbb620e --- /dev/null +++ b/src/test/singlenode_isolation2/sql/create_memory_accounting_tables.sql @@ -0,0 +1,280 @@ +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 TABLE nation + ( + n_nationkey INTEGER, + n_name CHAR(25), + n_regionkey INTEGER, + n_comment VARCHAR(152) + ); + +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 TABLE region + ( + r_regionkey INTEGER, + r_name CHAR(25), + r_comment VARCHAR(152) + ); + +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 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 TABLE partsupp + ( + ps_partkey INTEGER, + ps_suppkey INTEGER, + ps_availqty INTEGER, + ps_supplycost DECIMAL(15, 2), + ps_comment VARCHAR(199) + ) ; + + 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 INTO supplier VALUES (1,'Supplier#000000001','N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ',17,'27-918-335-1736',5755.94,'each slyly above the careful'); + INSERT INTO supplier VALUES (2,'Supplier#000000002','89eJ5ksX3ImxJQBvxObC,',5,'15-679-861-2259',4032.68,'slyly bold instructions. idle dependen'); + 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 INTO supplier VALUES (4,'Supplier#000000004','Bk7ah4CK8SYQTepEmvMkkgMwg',15,'25-843-787-7479',4641.08,'riously even requests above the exp'); + INSERT INTO supplier VALUES (5,'Supplier#000000005','Gcdm2rJRzl5qlTVzc',11,'21-151-690-3663',-283.84,'. slyly regular pinto bea'); + 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 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 INTO supplier VALUES (8,'Supplier#000000008','9Sq4bBH2FQEmaFOocY45sRTxo6yuoG',17,'27-498-742-3860',7627.85,'al pinto beans. asymptotes haggl'); + 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 INTO supplier VALUES (10,'Supplier#000000010','Saygah3gYWMp72i PY',24,'34-852-489-8585',3891.91,'ing waters. regular requests ar'); + 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 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 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 INTO supplier VALUES (14,'Supplier#000000014','EXsnO5pTNj4iZRm',15,'25-656-247-5058',9189.82,'l accounts boost. fluffily bold warhorses wake'); + 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 INTO supplier VALUES (16,'Supplier#000000016','YjP5C55zHDXL7LalK27zfQnwejdpin4AMpvh',22,'32-822-502-4215',2972.26,'ously express ideas haggle quickly dugouts? fu'); + 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 INTO supplier VALUES (18,'Supplier#000000018','PGGVE5PWAMwKDZw',16,'26-729-551-1115',7040.82,'accounts snooze slyly furiously bold'); + 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 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 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 INTO supplier VALUES (22,'Supplier#000000022','okiiQFk 8lm6EVX6Q0,bEcO',4,'14-144-830-2814',-966.20,'ironically among the deposits. closely expre'); + + + + INSERT INTO orders VALUES (1,370,'O',172799.49,'1996-01-02','5-LOW','Clerk#000000951',0,'nstructions sleep furiously among'); + 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 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 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 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 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 INTO orders VALUES (7,392,'O',271885.66,'1996-01-10','2-HIGH','Clerk#000000470',0,'ly special requests'); + 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 INTO orders VALUES (33,670,'F',146567.24,'1993-10-27','3-MEDIUM','Clerk#000000409',0,'uriously. furiously final request'); + 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 INTO orders VALUES (35,1276,'O',194641.93,'1995-10-23','4-NOT SPECIFIED','Clerk#000000259',0,'zzle. carefully enticing deposits nag furio'); + 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 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 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 INTO orders VALUES (39,818,'O',326565.37,'1996-09-20','3-MEDIUM','Clerk#000000659',0,'ole express, ironic requests: ir'); + 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 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 INTO orders VALUES (66,1292,'F',104190.66,'1994-01-20','5-LOW','Clerk#000000743',0,'y pending requests integrate'); + 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 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 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 INTO orders VALUES (70,644,'F',125705.32,'1993-12-18','5-LOW','Clerk#000000322',0,'carefully ironic request'); + 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 INTO orders VALUES (96,1078,'F',64364.30,'1994-04-17','2-HIGH','Clerk#000000395',0,'oost furiously. pinto'); + 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 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 INTO orders VALUES (99,890,'F',108594.87,'1994-03-13','4-NOT SPECIFIED','Clerk#000000973',0,'e carefully ironic packages. pending'); + 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 INTO orders VALUES (101,280,'O',118448.39,'1996-03-17','3-MEDIUM','Clerk#000000419',0,'ding accounts above the slyly final asymptote'); + 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 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 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 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 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 INTO orders VALUES (131,928,'F',140726.47,'1994-06-08','3-MEDIUM','Clerk#000000625',0,'after the fluffily special foxes integrate s'); + 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 INTO orders VALUES (133,440,'O',95971.06,'1997-11-29','1-URGENT','Clerk#000000738',0,'usly final asymptotes'); + INSERT INTO orders VALUES (134,62,'F',208201.46,'1992-05-01','4-NOT SPECIFIED','Clerk#000000711',0,'lar theodolites boos'); + INSERT INTO orders VALUES (135,605,'O',230472.84,'1995-10-21','4-NOT SPECIFIED','Clerk#000000804',0,'l platelets use according t'); + 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 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 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 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 INTO customer VALUES (4,'Customer#000000004','XxVSJsLAGtn',4,'14-128-190-5944',2866.83,'MACHINERY','requests. final, regular ideas sleep final accou'); + 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 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 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 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 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 INTO customer VALUES (10,'Customer#000000010','6LrEaV6KR6PLVcgl2ArL Q3rqzLzcT1 v2',5,'15-741-346-9870',2753.54,'HOUSEHOLD','es regular deposits haggle. fur'); + 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 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 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 INTO customer VALUES (14,'Customer#000000014','KXkletMlL2JQEA',1,'11-845-129-3851',5266.30,'FURNITURE',', ironic packages across the unus'); + 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 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 INTO customer VALUES (17,'Customer#000000017','izrh 6jdqtp2eqdtbkswDD8SG4SzXruMfIXyR7',2,'12-970-682-3487',6.34,'AUTOMOBILE','packages wake! blithely even pint'); + 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 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 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 INTO customer VALUES (21,'Customer#000000021','XYmVpr9yAHDEn',8,'18-902-614-8344',1428.25,'MACHINERY','quickly final accounts integrate blithely furiously u'); + 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 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 INTO customer VALUES (24,'Customer#000000024','HXAFgIAyjxtdqwimt13Y3OZO 4xeLe7U8PqG',13,'23-127-851-8031',9255.67,'MACHINERY','into beans. fluffily final ideas haggle fluffily'); + 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 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 INTO customer VALUES (27,'Customer#000000027','IS8GIyxpBrLpMT0u7',3,'13-137-193-2709',5679.84,'BUILDING','about the carefully ironic pinto beans. accoun'); + 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 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 INTO customer VALUES (30,'Customer#000000030','nJDsELGAavU63Jl0c5NKsKfL8rIJQQkQnYL2QJY',1,'11-764-165-5076',9321.01,'BUILDING','lithely final requests. furiously unusual account'); + 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 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 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 INTO customer VALUES (34,'Customer#000000034','Q6G9wZ6dnczmtOx509xgE,M2KV',15,'25-344-968-5422',8589.70,'HOUSEHOLD','nder against the even, pending accounts. even'); + INSERT INTO customer VALUES (35,'Customer#000000035','TEjWGE4nBzJL2',17,'27-566-888-7431',1228.24,'HOUSEHOLD','requests. special, express requests nag slyly furiousl'); + 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 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 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 INTO customer VALUES (39,'Customer#000000039','nnbRg,Pvy33dfkorYE FdeZ60',2,'12-387-467-6509',6264.31,'AUTOMOBILE','tions. slyly silent excuses slee'); + 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 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 INTO nation VALUES (0,'ALGERIA',0,'haggle. carefully final deposits detect slyly agai'); + INSERT INTO nation VALUES (1,'ARGENTINA',1,'al foxes promise slyly according to the regular accounts. bold requests alon'); + INSERT INTO nation VALUES (2,'BRAZIL',1,'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special'); + INSERT INTO nation VALUES (3,'CANADA',1,'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold'); + INSERT INTO nation VALUES (4,'EGYPT',4,'y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d'); + INSERT INTO nation VALUES (5,'ETHIOPIA',0,'ven packages wake quickly. regu'); + INSERT INTO nation VALUES (6,'FRANCE',3,'refully final requests. regular, ironi'); + INSERT INTO nation VALUES (7,'GERMANY',3,'l platelets. regular accounts x-ray: unusual, regular acco'); + INSERT INTO nation VALUES (8,'INDIA',2,'ss excuses cajole slyly across the packages. deposits print aroun'); + INSERT INTO nation VALUES (9,'INDONESIA',2,'slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull'); + INSERT INTO nation VALUES (10,'IRAN',4,'efully alongside of the slyly final dependencies.'); + INSERT INTO nation VALUES (11,'IRAQ',4,'nic deposits boost atop the quickly final requests? quickly regula'); + INSERT INTO nation VALUES (12,'JAPAN',2,'ously. final, express gifts cajole a'); + INSERT INTO nation VALUES (13,'JORDAN',4,'ic deposits are blithely about the carefully regular pa'); + INSERT INTO nation VALUES (14,'KENYA',0,'pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t'); + INSERT INTO nation VALUES (15,'MOROCCO',0,'rns. blithely bold courts among the closely regular packages use furiously bold platelets?'); + INSERT INTO nation VALUES (16,'MOZAMBIQUE',0,'s. ironic, unusual asymptotes wake blithely r'); + INSERT INTO nation VALUES (17,'PERU',1,'platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun'); + INSERT INTO nation VALUES (18,'CHINA',2,'c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos'); + INSERT INTO nation VALUES (19,'ROMANIA',3,'ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account'); + INSERT INTO nation VALUES (20,'SAUDI ARABIA',4,'ts. silent requests haggle. closely express packages sleep across the blithely'); + INSERT INTO nation VALUES (21,'VIETNAM',2,'hely enticingly express accounts. even, final'); + INSERT INTO nation VALUES (22,'RUSSIA',3,'requests against the platelets use never according to the quickly regular pint'); + INSERT INTO nation VALUES (23,'UNITED KINGDOM',3,'eans boost carefully special requests. accounts are. carefull'); + 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 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 INTO partsupp VALUES (1,27,8076,993.49,'ven ideas. quickly even packages print. pending multipliers must have to are fluff'); + 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 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 INTO partsupp VALUES (2,3,8895,378.49,'nic accounts. final accounts sleep furiously about the ironic, bold packages. regular, regular accounts'); + 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 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 INTO partsupp VALUES (2,78,3025,306.39,'olites. deposits wake carefully. even, express requests cajole. carefully regular ex'); + 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 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 INTO partsupp VALUES (3,54,3917,645.40,'of the blithely regular theodolites. final theodolites haggle blithely carefully unusual ideas. blithely even f'); + 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 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 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 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 INTO partsupp VALUES (4,80,2480,444.37,'requests sleep quickly regular accounts. theodolites detect. carefully final depths w'); + INSERT INTO partsupp VALUES (5,6,3735,255.88,'arefully even requests. ironic requests cajole carefully even dolphin'); + INSERT INTO partsupp VALUES (5,31,9653,50.52,'y stealthy deposits. furiously final pinto beans wake furiou'); + 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 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 INTO partsupp VALUES (6,7,8851,130.72,'usly final packages. slyly ironic accounts poach across the even, sly requests. carefully pending request'); + 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 INTO partsupp VALUES (6,57,3336,642.13,'final instructions. courts wake packages. blithely unusual realms along the multipliers nag'); + 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 INTO partsupp VALUES (7,8,7454,763.98,'y express tithes haggle furiously even foxes. furiously ironic deposits sleep toward the furiously unusual'); + INSERT INTO partsupp VALUES (7,33,2770,149.66,'hould have to nag after the blithely final asymptotes. fluffily spe'); diff --git a/src/test/singlenode_isolation2/sql/deadlock_under_entry_db_singleton.sql b/src/test/singlenode_isolation2/sql/deadlock_under_entry_db_singleton.sql new file mode 100644 index 00000000000..d263906035e --- /dev/null +++ b/src/test/singlenode_isolation2/sql/deadlock_under_entry_db_singleton.sql @@ -0,0 +1,77 @@ +-- Test to validate that ENTRY_DB_SINGLETON reader does not cause a +-- deadlock. +-- +-- The deadlock used to happen when ENTRY_DB_SINGLETON enters +-- LockAcquire with its writer already holding the lock. And the +-- requested lockmode conflicts with another session's requested +-- lockmode who is waiting on the same lock. The waitMask check in +-- LockAcquire would put the ENTRY_DB_SINGLETON into wait queue. If +-- the ENTRY_DB_SINGLETON is supposed to produce some tuples that need +-- to be consumed by other nodes in the plan, either QEs or the writer +-- QD may wait for ENTRY_DB_SINGLETON and we will have a wait cycle, +-- causing deadlock. +-- +-- This test creates one such scenario using a volatile function. It +-- is critical that the function be volatile, otherwise, +-- ENTRY_DB_SIGNLETON reader is not spawned to execute the query. +-- +-- This thread on gpdb-dev has more details: +-- https://groups.google.com/a/greenplum.org/d/msg/gpdb-dev/OS1-ODIK0P4/ZIzayBbMBwAJ +-- Since global deadlock detector has been added into gpdb, UPDATE on heap +-- table does not acquire an Exclusive Relation Lock on QD. Therefore, we change +-- the table to ao table here. + +CREATE TABLE deadlock_entry_db_singleton_table (c int, d int) WITH (appendonly=true); +INSERT INTO deadlock_entry_db_singleton_table select i, i+1 from generate_series(1,10) i; + +-- Function that needs ExclusiveLock on a table. Use a non-SQL +-- language for this function so that parser cannot understand its +-- definition. That way, ExclusiveLock is requested during execution +-- 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; + +-- inject fault on QD +select gp_inject_fault('transaction_start_under_entry_db_singleton', 'reset', 1); +select gp_inject_fault_infinite('transaction_start_under_entry_db_singleton', 'suspend', 1); +2&: select gp_wait_until_triggered_fault('transaction_start_under_entry_db_singleton', 1, 1); + +-- The QD should already hold RowExclusiveLock and ExclusiveLock on +-- deadlock_entry_db_singleton_table and the QE ENTRY_DB_SINGLETON +-- will stop at in StartTransaction due to suspend fault. +1&:UPDATE deadlock_entry_db_singleton_table set d = d + 1 FROM (select 1 from deadlock_entry_db_singleton_table, function_volatile(5)) t; + +-- verify the fault hit +2<: + +-- This session will wait for ExclusiveLock on +-- deadlock_entry_db_singleton_table. +2&: update deadlock_entry_db_singleton_table set d = d + 1; + +-- The ENTRY_DB_SINGLETON will acquire exclusive lock on +-- deadlock_entry_db_singleton_table. The lockmode conflicts with the +-- lock's waitMask due to session2 already waiting for the same lock. +-- In spite of the waitMask conflict the lock should be granted to +-- ENTRY_DB_SINGLETON reader because its writer already holds the +-- lock. Otherwise, we may have a deadlock. +select gp_inject_fault('transaction_start_under_entry_db_singleton', 'resume', 1); +select gp_inject_fault('transaction_start_under_entry_db_singleton', 'reset', 1); + +-- verify the deadlock across multiple pids with same mpp session id +with lock_on_deadlock_entry_db_singleton_table as (select * from pg_locks +where relation = 'deadlock_entry_db_singleton_table'::regclass and gp_segment_id = -1) +select count(*) as FoundDeadlockProcess from lock_on_deadlock_entry_db_singleton_table +where granted = false and mppsessionid in ( + select mppsessionid from lock_on_deadlock_entry_db_singleton_table where granted = true +); + +-- join the session1 and session2 +-- we expect to see an ERROR message here due to function_volatile function +-- tried to update table from ENTRY_DB_SINGLETON (which is read-only) in session1 +1<: +2<: diff --git a/src/test/singlenode_isolation2/sql/disable_autovacuum.sql b/src/test/singlenode_isolation2/sql/disable_autovacuum.sql new file mode 100644 index 00000000000..7b75d061b46 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/disable_autovacuum.sql @@ -0,0 +1,2 @@ +alter system set autovacuum = off; +select gp_segment_id, pg_reload_conf() from gp_id union select gp_segment_id, pg_reload_conf() from gp_dist_random('gp_id'); diff --git a/src/test/singlenode_isolation2/sql/distributed_snapshot.sql b/src/test/singlenode_isolation2/sql/distributed_snapshot.sql new file mode 100644 index 00000000000..d30b05afec1 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/distributed_snapshot.sql @@ -0,0 +1,298 @@ +-- Distributed snapshot tests + +-- Scenario1: Test to validate GetSnapshotData()'s computation of globalXmin using +-- distributed snapshot. It mainly uses a old read-only transaction to help +-- create situation where globalXmin can be lower than distributed oldestXmin +-- when calling DistributedLog_AdvanceOldestXmin(). + +-- Setup +CREATE TABLE distributed_snapshot_test1 (a int); + +1: BEGIN; +1: INSERT INTO distributed_snapshot_test1 values(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; +2: SELECT * from distributed_snapshot_test1; +-- Complete transaction 1, so that it no more appears in in-progress transaction +-- list for following transactions. +1: COMMIT; + +-- Transaction to bump the latestCompletedXid +1: INSERT INTO distributed_snapshot_test1 values(1); + +-- Hold after walking over ProcArray in GetSnpashotData(), right at start of +-- DistributedLog_AdvanceOldestXmin() +1: SELECT gp_inject_fault('distributedlog_advance_oldest_xmin', 'suspend', + '', 'postgres', '', 1, -1, 5, dbid) from gp_segment_configuration + where content = 0 and role = 'p'; +3&:@db_name postgres: SELECT count(*) > 0 from gp_dist_random('gp_id'); +1: SELECT gp_wait_until_triggered_fault('distributedlog_advance_oldest_xmin', 1, dbid) + from gp_segment_configuration where content = 0 and role = 'p'; +2: COMMIT; + +-- Transaction used to bump the distributed oldestXmin +1: INSERT INTO distributed_snapshot_test1 values(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'; +3<: + +-- Scenario2: This scenario tests the boundary condition for Xmax in distributed snapshot + +-- Setup +CREATE TABLE distributed_snapshot_test2 (a int); + +-- start transaction assigns distributed xid. +1: BEGIN ISOLATION LEVEL REPEATABLE READ; +-- this sets latestCompletedXid +2: INSERT INTO distributed_snapshot_test2 VALUES(1); +-- here, take distributed snapshot +1: SELECT 123 AS "establish snapshot"; +2: INSERT INTO distributed_snapshot_test2 VALUES(2); +-- expected to see just VALUES(1) +1: SELECT * FROM distributed_snapshot_test2; +1: COMMIT; + +DROP TABLE distributed_snapshot_test2; + +-- Scenario3: Test the one-phase commit transactions don't break repeatable read isolation. +-- +-- Direct dispatch causes the select statements to be dispatched only to one of +-- the three demo cluster segments. A segment acquires local snapshot only when it +-- receives the dispatched statement. If one phase commit relied on local +-- snapshots only, wrong results are possible depending on the order of local +-- snapshot acquisition by the segments. This scenario validates that distributed +-- snapshot is used by the segments to evaluate tuple visibility in case of +-- one-phase commit and correct results are returned. +-- +-- connection 40 inserts 100, 100 and 300 serially using one-phase commit +-- protocol. Repeatable read transactions may read (100), (100,100) or +-- (100,100,300), but not (100, 300). +CREATE TABLE distributed_snapshot_test3 (a int); +10: BEGIN ISOLATION LEVEL REPEATABLE READ; +20: BEGIN ISOLATION LEVEL REPEATABLE READ; +30: BEGIN ISOLATION LEVEL REPEATABLE READ; +40: INSERT INTO distributed_snapshot_test3 VALUES(100); +10: SELECT gp_segment_id, * FROM distributed_snapshot_test3 where a = 100; +40: INSERT INTO distributed_snapshot_test3 VALUES(100); +30: SELECT 123 AS "establish snapshot"; +40: INSERT INTO distributed_snapshot_test3 VALUES(300); +10: SELECT gp_segment_id, * FROM distributed_snapshot_test3; +20: SELECT gp_segment_id, * FROM distributed_snapshot_test3; +30: SELECT gp_segment_id, * FROM distributed_snapshot_test3; +10: COMMIT; +20: COMMIT; +30: COMMIT; +DROP TABLE distributed_snapshot_test3; + +-- The following test cases are to test that QEs can get +-- latest distribute snapshot to scan normal tables (not catalog). +-- Cloudberry tests the visibility of heap tuples firstly using +-- distributed snapshot. Distributed snapshot is generated on +-- QD and then dispatched to QEs. Some utility statement needs +-- to work under latest snapshot when executing, so that they +-- invoke the function `GetLatestSnapshot` in QEs. But remember +-- we cannot get the latest distributed snapshot. + +-- Subtle cases are: Alter Table or Alter Domain statements on QD +-- get snapshot in Portal Run and then try to hold locks on the +-- target table in ProcessUtilitySlow. Here is the key point: +-- 1. try to hold lock ==> it might be blocked by other transcations +-- 2. then it will be waked up to continue +-- 3. when it can continue, the world has changed because other transcations +-- then blocks it have been over + +-- Previously, on QD we do not getsnapshot before we dispatch utility +-- statement to QEs which leads to the distributed snapshot does not +-- reflect the "world change". This will lead to some bugs. For example, +-- if the first transaction is to rewrite the whole heap, and then +-- the second Alter Table or Alter Domain statements continues with +-- the distributed snapshot that txn1 does not commit yet, it will +-- see no tuples in the new heap! +-- See Github issue https://github.com/greenplum-db/gpdb/issues/10216 + +-- Now this has been fixed, the following cases are tests to check this. + +-- Case 1: concurrently alter column type (will do rewrite heap) +create table t_alter_snapshot_test(a int, b int, c int); +insert into t_alter_snapshot_test values (1, 1, 1), (1, 1, 1); + +select * from t_alter_snapshot_test; + +1: begin; +1: alter table t_alter_snapshot_test alter column b type text; + +-- the following statement will hang +2&: alter table t_alter_snapshot_test alter column c type text; + +1: end; +-- after 1 commit, 2 can continue, it should use latest distributed +-- snapshot so that the data will not be lost. +2<: + +select * from t_alter_snapshot_test; +drop table t_alter_snapshot_test; + +-- Case 2: concurrently add exclude constrain +create table t_alter_snapshot_test(a int, b int); +insert into t_alter_snapshot_test values (1, 1), (1, 1); + +select a from t_alter_snapshot_test; + +1: begin; +1: alter table t_alter_snapshot_test alter column b type int using b::int; + +2&: alter table t_alter_snapshot_test add exclude using btree (a WITH =); + +1: end; +-- after 1 commit, 2 can go on and it should fail +2<: + +drop table t_alter_snapshot_test; + +-- 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 ); + +insert into t_alter_snapshot_test select i,i,i from generate_series(1, 100)i; +select count(*) from t_alter_snapshot_test; + +1: begin; +1: alter table t_alter_snapshot_test alter column rank type text; + +2&: alter table t_alter_snapshot_test split partition for (5) at (5) into (partition pa, partition pb); + +1: end; +-- after 1 commit, 2 can go on and it should not lose data +2<: + +select count(*) from t_alter_snapshot_test; +drop table t_alter_snapshot_test; + +-- case 4: concurrently validate check +create table t_alter_snapshot_test(a int, b int); +insert into t_alter_snapshot_test values (1, 1), (2, 2); +alter table t_alter_snapshot_test ADD CONSTRAINT mychk CHECK(a > 20) NOT VALID; + +1: begin; +1: alter table t_alter_snapshot_test alter column b type text; + +2&: alter table t_alter_snapshot_test validate CONSTRAINT mychk; + +1: end; +-- after 1 commit, 2 can go on and it should fail +2<: + +drop table t_alter_snapshot_test; + +-- case 5: concurrently domain check +create domain domain_snapshot_test as int; +create table t_alter_snapshot_test(i domain_snapshot_test, j int, k int); +insert into t_alter_snapshot_test values(200,1,1); +alter domain domain_snapshot_test ADD CONSTRAINT mychk CHECK(VALUE > 300) NOT VALID; + +1: begin; +1: alter table t_alter_snapshot_test alter column k type text; + +2&: alter domain domain_snapshot_test validate CONSTRAINT mychk; + +1:end; +-- after 1 commit, 2 can go on and it should fail +2<: + +drop table t_alter_snapshot_test; +drop domain domain_snapshot_test; + +-- case 6: alter table expand table +create table t_alter_snapshot_test(a int, b int); +set allow_system_table_mods = on; +update gp_distribution_policy set numsegments = 2 where localoid = 't_alter_snapshot_test'::regclass::oid; +insert into t_alter_snapshot_test select i,i from generate_series(1, 10)i; +select gp_segment_id, * from t_alter_snapshot_test; + +1: begin; +1: alter table t_alter_snapshot_test alter column b type text; + +2&: alter table t_alter_snapshot_test expand table; + +1: end; +-- after 1 commit, 2 can go on and data should not be lost +2<: + +select gp_segment_id, * from t_alter_snapshot_test; +drop table t_alter_snapshot_test; + +-- case 7: alter table set distributed by +create table t_alter_snapshot_test(a int, b int) distributed randomly; +insert into t_alter_snapshot_test select i,i from generate_series(1, 10)i; +select count(*) from t_alter_snapshot_test; + +1: begin; +1: alter table t_alter_snapshot_test alter column b type text; + +2&: alter table t_alter_snapshot_test set distributed by (a); + +1: end; +-- after 1 commit, 2 can continue and data should not be lost +2<: + +select count(*) from t_alter_snapshot_test; +drop table t_alter_snapshot_test; + +-- case 8: DML concurrent with Alter Table +create table t_alter_snapshot_test(a int, b int); + +---- test for insert +1: begin; +1: insert into t_alter_snapshot_test values (1, 1); +2&: alter table t_alter_snapshot_test alter column b type text; +1: end; +-- 2 can continue, and we should not lose data +2<: +select * from t_alter_snapshot_test; + +---- test for update +truncate t_alter_snapshot_test; +insert into t_alter_snapshot_test values (1, 1); +1: begin; +1: update t_alter_snapshot_test set b = '3'; +2&: alter table t_alter_snapshot_test alter column b type int using b::int; +1: end; +-- 2 can continue and we should see the data has been updated +2<: +select * from t_alter_snapshot_test; + +---- test for delete +truncate t_alter_snapshot_test; +insert into t_alter_snapshot_test values (1, 1); +1: begin; +1: delete from t_alter_snapshot_test; +2&: alter table t_alter_snapshot_test alter column b type text; +1: end; +-- 2 can continue and we should see the data has been deleted +2<: +select * from t_alter_snapshot_test; +drop table t_alter_snapshot_test; + +-- Case 9: Repeatable Read Isolation Level Test +create table t_alter_snapshot_test(a int, b int); +insert into t_alter_snapshot_test values (1, 1); +1: begin; +1: insert into t_alter_snapshot_test values (1, 1); + +2: begin isolation level repeatable read; +2: select * from t_alter_snapshot_test; +2&: alter table t_alter_snapshot_test alter column b type text; + +1: end; +-- 2 can continue and after its alter rewrite the heap +-- it can see all the data even under repeatable read +2<: +2: select * from t_alter_snapshot_test; +2: end; + +select * from t_alter_snapshot_test; +drop table t_alter_snapshot_test; diff --git a/src/test/singlenode_isolation2/sql/distributed_transactions.sql b/src/test/singlenode_isolation2/sql/distributed_transactions.sql new file mode 100644 index 00000000000..5dc08309904 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/distributed_transactions.sql @@ -0,0 +1,22 @@ +-- Test error after ProcArrayEndTransaction + +-- abort fail on QD +SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', 1); +BEGIN; +CREATE TABLE test_xact_abort_failure(a int); +ABORT; +SELECT gp_inject_fault( 'abort_after_procarray_end', 'reset', 1); + +-- abort fail on QE +SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', dbid) from gp_segment_configuration where role = 'p' and content = 0; +BEGIN; +CREATE TABLE test_xact_abort_failure(a int); +ABORT; +SELECT gp_inject_fault( 'abort_after_procarray_end', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = 0; + +-- abort fail in local transaction +SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', dbid) from gp_segment_configuration where role = 'p' and content = 0; +0U: BEGIN; +0U: CREATE TABLE test_xact_abort_failure(a int); +0U: ABORT; +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/singlenode_isolation2/sql/distributedlog-bug.sql b/src/test/singlenode_isolation2/sql/distributedlog-bug.sql new file mode 100644 index 00000000000..f177f4ed601 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/distributedlog-bug.sql @@ -0,0 +1,25 @@ +-- +-- Test for a bug in checking tuple visibility against a distributed snapshot +-- that turned up during merge PostgreSQL 9.6. We incorrectly set the +-- HEAP_XMAX_DISTRIBUTED_SNAPSHOT_IGNORE hint bit on a tuple, when the +-- transaction was in fact a distributed transaction that was still +-- in-progress. +-- +CREATE TABLE distributed_snapshot_test ( id INTEGER, f FLOAT); + +1: BEGIN; +2: BEGIN; +2: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; +2: select 'dummy select to establish snapshot'; +1: select count(*) > 0 as tbl_found from gp_dist_random('pg_class') where relname = 'distributed_snapshot_test'; + +-- Drop table in a transaction +1: drop table distributed_snapshot_test; + +3: vacuum pg_class; + +-- Commit the DROP. +1: COMMIT; + +-- The table should still be visible to transaction 2's snapshot. +2: select count(*) > 0 as tbl_found from gp_dist_random('pg_class') where relname = 'distributed_snapshot_test'; diff --git a/src/test/singlenode_isolation2/sql/drop_rename.sql b/src/test/singlenode_isolation2/sql/drop_rename.sql new file mode 100644 index 00000000000..76ac2727e86 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/drop_rename.sql @@ -0,0 +1,56 @@ +-- Test if ALTER RENAME followed by ANALYZE executed concurrently with +-- DROP does not introduce inconsistency between master and segments. +-- DROP should be blocked because of ALTER-ANALYZE. After being +-- unblocked, DROP should lookup the old name again and fail with +-- relation does not exist error. + +1:drop table if exists t1; +1:drop table if exists newt1; +1:create table t1 (a int, b text); +1:insert into t1 select i, 'abc '||i from generate_series(1,10)i; +1:begin; +1:alter table t1 rename to newt1; +1:analyze newt1; +-- this drop should block to acquire AccessExclusive lock on t1's OID. +2&:drop table t1; +1:commit; +2<: +2:select count(*) from newt1; + +-- DROP is executed concurrently with ALTER RENAME but not ANALYZE. +1:drop table if exists t2; +1:drop table if exists newt2; +1:create table t2 (a int, b text); +1:insert into t2 select i, 'pqr '||i from generate_series(1,10)i; +1:begin; +1:alter table t2 rename to newt2; +2&:drop table t2; +1:commit; +2<: +2:select count(*) from newt2; + +-- 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; +1:create table t3 (a int, b text); +1:insert into t3 select i, '123 '||i from generate_series(1,10)i; +1:begin; +1:alter table t3 rename to t3_new; +2&:drop table if exists t3; +1:commit; +2<: +2:select count(*) from t3; +2:select relname from pg_class where relname like 't3%'; +2:select relname from gp_dist_random('pg_class') where relname like 't3%'; + +1:drop table if exists t3; +1:create table t3 (a int, b text); +1:insert into t3 select i, '123 '||i from generate_series(1,10)i; +1:begin; +1:drop table t3; +2&:drop table if exists t3; +3&:drop table t3; +1:commit; +3<: +2<: +2:select count(*) from t3; diff --git a/src/test/singlenode_isolation2/sql/enable_autovacuum.sql b/src/test/singlenode_isolation2/sql/enable_autovacuum.sql new file mode 100644 index 00000000000..a128f5f570c --- /dev/null +++ b/src/test/singlenode_isolation2/sql/enable_autovacuum.sql @@ -0,0 +1,2 @@ +alter system set autovacuum = on; +select gp_segment_id, pg_reload_conf() from gp_id union select gp_segment_id, pg_reload_conf() from gp_dist_random('gp_id'); diff --git a/src/test/singlenode_isolation2/sql/execute_on_utilitymode.sql b/src/test/singlenode_isolation2/sql/execute_on_utilitymode.sql new file mode 100644 index 00000000000..28ffe5f41c1 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/execute_on_utilitymode.sql @@ -0,0 +1,52 @@ +-- +-- Test using functions with EXECUTE ON options in utility mode. +-- + +-- 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 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 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 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; + +-- 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 +-- we're connected to, ignoring the EXECUTE ON directives. +-- +-- 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); +insert into fewrows select g from generate_series(1, 10) g; + +-1U: select * from srf_on_master() as srf (x) left join fewrows on x = t; +-1U: select * from srf_on_all_segments() as srf (x) left join fewrows on x = t; +-1U: select * from srf_on_any() as srf (x) left join fewrows on x = t; +-1U: select * from srf_on_initplan() as srf (x) left join fewrows on x = t; + +1U: select * from srf_on_master(), fewrows; +1U: select * from srf_on_all_segments(), fewrows; +1U: select * from srf_on_any(), fewrows; +1U: select * from srf_on_initplan(), fewrows; diff --git a/src/test/singlenode_isolation2/sql/fsync_ao.sql b/src/test/singlenode_isolation2/sql/fsync_ao.sql new file mode 100644 index 00000000000..076d19fbe6d --- /dev/null +++ b/src/test/singlenode_isolation2/sql/fsync_ao.sql @@ -0,0 +1,129 @@ +-- Validate that the mirror replay process forwards fsync requests for +-- append-optimized tables to the checkpointer. This is done using a +-- fault point that is reached only in a checkpointer process. Note +-- that checkpointer process runs on primary as well as mirror. We +-- are concerned with the checkpointer running on mirror in this test. +-- +-- Starting with a clean slate (no pending fsync requests), the test +-- performs operations such as insert, vacuum, drop on AO row and +-- column oriented tables. It validates that fsync was performed by +-- checkpointer for expected number of AO files at the end of each +-- operation. + +-- Set the GUC to perform replay of checkpoint records immediately. +-- It speeds up the test. +!\retcode gpconfig -c create_restartpoint_on_ckpt_record_replay -v on --skipvalidation; +-- Set fsync on since we need to test the fsync code logic. +!\retcode gpconfig -c fsync -v on --skipvalidation; +!\retcode gpstop -u; + +create table fsync_ao(a int, b int) with (appendoptimized = true); +create table fsync_co(a int, b int) with (appendoptimized = true, orientation = column); +-- 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; + +insert into fsync_ao select i, i from generate_series(1,10)i; +insert into fsync_co select i, i from generate_series(1,10)i; + +-- 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 = -1; + +-- Start with a clean slate. +checkpoint; + +-- Wait until restartpoint flush happens. +select gp_wait_until_triggered_fault('restartpoint_guts', 1, dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- We have just created a checkpoint. The next automatic checkpoint +-- will be triggered only after 5 minutes or after CheckPointSegments +-- wal segments. Neither of that can happen until this test calls +-- explicit checkpoint. + +-- Inject fault to count relfiles fsync'ed by checkpointer on mirror. +select gp_inject_fault_infinite('ao_fsync_counter', 'skip', dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- 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 into fsync_co select i, i from generate_series(1,20)i; +insert into ul_fsync_co select i, i, i from generate_series(1,20)i; + +checkpoint; + +-- Wait until restartpoint happens again. +select gp_wait_until_triggered_fault('restartpoint_guts', 2, dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- Validate that the number of files fsync'ed by checkpointer (on +-- mirror). `num times hit` is corresponding to the number of files +-- synced by `ao_fsync_counter` fault. +select gp_inject_fault('ao_fsync_counter', 'status', dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- Test vacuum compaction with more than one segment file per table. +-- Perform concurrent inserts before vacuum to get multiple segment +-- files. Validation criterion is the next checkpoint succeeds on the +-- mirror. +1: begin; +1: insert into fsync_ao select i, i from generate_series(1,20)i; +1: insert into fsync_co select i, i from generate_series(1,20)i; +1: insert into ul_fsync_co select i, i, i from generate_series(1,20)i; +insert into fsync_ao select i, i from generate_series(21,40)i; +insert into fsync_co select i, i from generate_series(21,40)i; +insert into ul_fsync_co select i, i, i from generate_series(1,40)i; +1: end; +-- Generate some invisible tuples in both the tables so as to trigger +-- compaction during vacuum. +delete from fsync_ao where a > 20; +update fsync_co set b = -a; +delete from ul_fsync_co where b < 20; + +-- Expect two segment files for each table (ao table) or each column (co table). +select segment_id, segno, state from gp_toolkit.__gp_aoseg('fsync_ao'); +select segment_id, segno, column_num, physical_segno, state from gp_toolkit.__gp_aocsseg('fsync_co'); +select segment_id, segno, column_num, physical_segno, state from gp_toolkit.__gp_aocsseg('ul_fsync_co'); +vacuum fsync_ao; +vacuum fsync_co; +vacuum ul_fsync_co; +checkpoint; +-- Wait until restartpoint happens again. +select gp_wait_until_triggered_fault('restartpoint_guts', 3, dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- Expect the segment files that were updated by vacuum to be fsync'ed. +select gp_inject_fault('ao_fsync_counter', 'status', dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- Test that replay of drop table operation removes fsync requests +-- previously registed with the checkpointer. +update fsync_co set b = -a; +drop table fsync_co; +update ul_fsync_co set c = -a; +drop table ul_fsync_co; +-- Drop but don't commit the transaction. +begin; +update fsync_ao set b = -a; +drop table fsync_ao; +abort; +-- Fsync request for the following insert should not be forgotten. +insert into fsync_ao select * from generate_series(41,60)i; + +checkpoint; +-- Wait until restartpoint happens again. +select gp_wait_until_triggered_fault('restartpoint_guts', 4, dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- Expect that fsync is only performed for fsync_ao table (1 file) but +-- not for fsync_co table because it was dropped after being updated. +select gp_inject_fault('ao_fsync_counter', 'status', dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- Reset all faults. +select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration where content = -1; + +!\retcode gpconfig -r create_restartpoint_on_ckpt_record_replay --skipvalidation; +!\retcode gpconfig -c fsync -v off --skipvalidation; +!\retcode gpstop -u; diff --git a/src/test/singlenode_isolation2/sql/fts_dns_error.sql b/src/test/singlenode_isolation2/sql/fts_dns_error.sql new file mode 100644 index 00000000000..b1b9deba691 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/fts_dns_error.sql @@ -0,0 +1,49 @@ +-- Tests FTS can handle DNS error. + +-- to make test deterministic and fast +!\retcode gpconfig -c gp_fts_probe_retries -v 2 --masteronly; + +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 30 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 127 --skipvalidation --masteronly; +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 250 --skipvalidation --masteronly; +!\retcode gpstop -u; + +-- no down segment in the beginning +select count(*) from gp_segment_configuration where status = 'd'; + +-- 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 +-- process. As if that happens, due to race condition will not trigger +-- the fault and fail the test. +select gp_request_fts_probe_scan(); +-- trigger a DNS error +select gp_inject_fault_infinite('get_dns_cached_address', 'skip', 1); +select gp_request_fts_probe_scan(); +select gp_inject_fault_infinite('get_dns_cached_address', 'reset', 1); + +-- verify a fts failover happens +select count(*) from gp_segment_configuration where status = 'd'; + +-- fully recover the failed primary as new mirror +!\retcode gprecoverseg -aF --no-progress; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized() + +!\retcode gprecoverseg -ar; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized() + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + +!\retcode gpconfig -r gp_fts_probe_retries --masteronly; +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +!\retcode gpstop -u; + + diff --git a/src/test/singlenode_isolation2/sql/fts_errors.sql b/src/test/singlenode_isolation2/sql/fts_errors.sql new file mode 100644 index 00000000000..01781cc3ec2 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/fts_errors.sql @@ -0,0 +1,159 @@ +-- This test triggers failover of content 0 and content 1 +-- Content 0 is used to test if FTS can handle DNS errors +-- Content 1 is used to test the gang interaction in various +-- sessions when a failover is triggered and mirror is promoted +-- to primary + +-- start_matchsubs +-- m/^ERROR: Error on receive from .*: server closed the connection unexpectedly/ +-- s/^ERROR: Error on receive from .*: server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/ +-- end_matchsubs + +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 120 seconds. +-- start_ignore +set statement_timeout='720s'; +-- end_ignore +!\retcode gpconfig -c gp_gang_creation_retry_count -v 120 --skipvalidation --masteronly; +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 1000 --skipvalidation --masteronly; +!\retcode gpstop -u; + +-- 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; + +-- no segment down. +select count(*) from gp_segment_configuration where status = 'd'; + +drop table if exists fts_errors_test; +create table fts_errors_test(a int); + +1:BEGIN; +1:END; +2:BEGIN; +2:INSERT INTO fts_errors_test SELECT * FROM generate_series(1,100); +3:BEGIN; +3:CREATE TEMP TABLE tmp3 (c1 int, c2 int); +3:DECLARE c1 CURSOR for select * from tmp3; +4:CREATE TEMP TABLE tmp4 (c1 int, c2 int); +5:BEGIN; +5:CREATE TEMP TABLE tmp5 (c1 int, c2 int); +5:SAVEPOINT s1; +5:CREATE TEMP TABLE tmp51 (c1 int, c2 int); + +-- 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 +-- process. As if that happens, due to race condition will not trigger +-- the fault and fail the test. +select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; + +-- stop a primary in order to trigger a mirror promotion for content 1 +select pg_ctl((select datadir from gp_segment_configuration c +where c.role='p' and c.content=1), 'stop'); + +-- trigger a DNS error. This fault internally gets trigerred for content 0 +select gp_inject_fault_infinite('get_dns_cached_address', 'skip', 1); + +-- trigger failover +select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +select pg_sleep(5); + +-- Since both gp_request_fts_probe_scan() and gp_inject_fault() will +-- call the cdbcomponent_updateCdbComponents(), there is a plausible +-- race condition between the fts_probes and the reset of the fault +-- injector; if the reset triggers the fault before the fts probe +-- completes, the primary will be taken down without removing the fault +-- To avoid the race condition, the test waits until both the segments +-- go down before removing the fault. +-- The test expect the following 2 segments to go down: +-- 1. pg_ctl stop for dbid=3(content 1, primary) +-- 2. get_dns_cached_address fault injected for dbid=2(content 0, primary) + +-- get_dns_cached_address will make FTS update failed +-- should check no segment is down +-- start_ignore +-1U: select wait_until_segments_are_down(0); +-- end_ignore +select gp_inject_fault('get_dns_cached_address', 'reset', 1); + +-- session 1: in no transaction and no temp table created, it's safe to +-- update cdb_component_dbs and use the new promoted primary +1:BEGIN; +1:END; +-- session 2: in transaction, gxid is dispatched to writer gang, cann't +-- update cdb_component_dbs, following query should fail +-- start_ignore +2:END; +-- end_ignore +-- session 3: in transaction and has a cursor, cann't update +-- cdb_component_dbs, following query should fail +3:FETCH ALL FROM c1; +3:END; +-- session 4: not in transaction but has temp table, cann't update +-- cdb_component_dbs, following query should fail and session +-- is reset +4:select * from tmp4; +4:select * from tmp4; +-- session 5: has a subtransaction, cann't update cdb_component_dbs, +-- following query should fail +5:select * from tmp51; +5:ROLLBACK TO SAVEPOINT s1; +5:END; +1q: +2q: +3q: +4q: +5q: + +-- immediate stop mirror for content 0. This is just to speed up the test, next +-- step gprecovertseg will do the same but it uses gpstop fast mode and not +-- immediate, which add time to tests. +select pg_ctl((select datadir from gp_segment_configuration c +where c.role='m' and c.content=0), 'stop'); +select pg_sleep(60); + +-- fully recover the failed primary as new mirror +!\retcode gprecoverseg -aF --no-progress; +!\retcode gpfts -A -D; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +!\retcode gprecoverseg -ar; +!\retcode gpfts -A -D; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; + +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +!\retcode gpstop -u; +-- start_ignore +reset statement_timeout; +-- end_ignore + + diff --git a/src/test/singlenode_isolation2/sql/fts_session_reset.sql b/src/test/singlenode_isolation2/sql/fts_session_reset.sql new file mode 100644 index 00000000000..16d948400e3 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/fts_session_reset.sql @@ -0,0 +1,51 @@ +-- This test performs segment reconfiguration when a distributed +-- transaction is in progress. The expectation is that the first +-- command in the transaction after reconfiguration should fail. It +-- verifies a bug where a stale gang was reused in such a case, if the +-- failed primary happened to be up and listening. + +-- set these values purely to cut down test time, as default ts trigger is +-- every min and 5 retries + +create table test_fts_session_reset(c1 int); + +1:BEGIN; +-- let the dispatcher create a gang +1:insert into test_fts_session_reset select * from generate_series(1,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; +2:select gp_request_fts_probe_scan(); +!\retcode gpfts -R 0 -A -D; +2:select status = 'd' from gp_segment_configuration where content = 0 and role = 'm'; +-- At this point, content 0 mirror is promoted and the primary is marked down. +-- the gang used by the previous insert is no longer valid. It must be destroyed +-- and the transaction must be aborted. +1:insert into test_fts_session_reset select * from generate_series(21,40); +1:select count(*) from test_fts_session_reset; +1:END; +1:select pg_sleep(30); +1:select count(*) from test_fts_session_reset; +2:select pg_sleep(30); +2:select gp_inject_fault('fts_conn_startup_packet', 'reset', dbid) from gp_segment_configuration where content=0; +1q: +2q: + +-- expect one primary is down and mirror is promoted to primary +select content, preferred_role, role, status, mode +from gp_segment_configuration +where content = 0 order by role; + +!\retcode gprecoverseg -aF --no-progress; +!\retcode gpfts -A -D; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +!\retcode gprecoverseg -ar; +!\retcode gpfts -A -D; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; diff --git a/src/test/singlenode_isolation2/sql/gdd/avoid-qd-deadlock.sql b/src/test/singlenode_isolation2/sql/gdd/avoid-qd-deadlock.sql new file mode 100644 index 00000000000..81fb519b8bb --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/avoid-qd-deadlock.sql @@ -0,0 +1,25 @@ +DROP TABLE IF EXISTS tsudf; + +CREATE TABLE tsudf (c int, d int); + +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; + +INSERT INTO tsudf select i, i+1 from generate_series(1,10) i; + +SELECT gp_inject_fault('upgrade_row_lock', 'reset', 1); +SELECT gp_inject_fault('upgrade_row_lock', 'sleep', '', '', '', 1, -1, 10, 1); + +3&: SELECT * FROM func1(1); +4: SELECT * FROM func1(2); + +3<: +3q: +4q: + +SELECT gp_inject_fault('upgrade_row_lock', 'reset', 1); diff --git a/src/test/singlenode_isolation2/sql/gdd/concurrent_update.sql b/src/test/singlenode_isolation2/sql/gdd/concurrent_update.sql new file mode 100644 index 00000000000..bfe80b093e2 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/concurrent_update.sql @@ -0,0 +1,192 @@ +-- Test concurrent update a table with a varying length type +CREATE TABLE t_concurrent_update(a int, b int, c char(84)); +INSERT INTO t_concurrent_update VALUES(1,1,'test'); + +1: BEGIN; +1: SET optimizer=off; +1: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; +2: SET optimizer=off; +2&: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; +1: END; +2<: +1: SELECT * FROM t_concurrent_update; +1q: +2q: + +DROP TABLE t_concurrent_update; + +-- Test the concurrent update transaction order on the segment is reflected on master +1: CREATE TABLE t_concurrent_update(a int, b int); +1: INSERT INTO t_concurrent_update VALUES(1,1); + +2: BEGIN; +2: SET optimizer=off; +2: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; +3: BEGIN; +3: SET optimizer=off; +-- transaction 3 will wait transaction 2 on the segment +3&: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; + +-- transaction 2 suspend before commit, but it will wake up transaction 3 on segment +2: select gp_inject_fault('before_xact_end_procarray', 'suspend', '', 'isolation2test', '', 1, 1, 0, dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; +2&: END; +1: select gp_wait_until_triggered_fault('before_xact_end_procarray', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; +-- transaction 3 should wait transaction 2 commit on master +3<: +3&: END; +-- the query should not get the incorrect distributed snapshot: transaction 1 in-progress +-- and transaction 2 finished +1: SELECT * FROM t_concurrent_update; +1: select gp_inject_fault('before_xact_end_procarray', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; +2<: +3<: +2q: +3q: + +1: SELECT * FROM t_concurrent_update; +1q: + +-- Same test as the above, except the first transaction commits before the +-- second transaction check the wait gxid, it should get the gxid from +-- pg_distributedlog instead of the procarray. +4: BEGIN; +4: SET optimizer=off; +4: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; + +5: BEGIN; +5: SET optimizer=off; +-- suspend before get 'wait gxid' +5: SELECT gp_inject_fault('before_get_distributed_xid', 'suspend', dbid) FROM gp_segment_configuration WHERE role='p' AND content=1; +5&: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; + +6: SELECT gp_wait_until_triggered_fault('before_get_distributed_xid', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content=1; +4: END; +4: SELECT gp_inject_fault('before_get_distributed_xid', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=1; + +5<: +5: END; +6: SELECT * FROM t_concurrent_update; +6: DROP TABLE t_concurrent_update; +4q: +5q: +6q: + +-- Test update distkey +-- IF we enable the GDD, then the lock maybe downgrade to +-- RowExclusiveLock, when we UPDATE the distribution keys, +-- A SplitUpdate node will add to the Plan, then an UPDATE +-- operator may split to DELETE and INSERT. +-- IF we UPDATE the distribution keys concurrently, the +-- DELETE operator will not execute EvalPlanQual and the +-- INSERT operator can not be *blocked*, so it will +-- generate more tuples in the tables. +-- We raise an error when the GDD is enabled and the +-- distribution keys is updated. + +0: create table tab_update_hashcol (c1 int, c2 int) distributed by(c1); +0: insert into tab_update_hashcol values(1,1); +0: select * from tab_update_hashcol; + +1: begin; +2: begin; +1: update tab_update_hashcol set c1 = c1 + 1 where c1 = 1; +2&: update tab_update_hashcol set c1 = c1 + 1 where c1 = 1; +1: end; +2<: +2: end; +0: select * from tab_update_hashcol; +0: drop table tab_update_hashcol; + +-- Test EvalplanQual +-- If we enable the GDD, then the lock maybe downgrade to +-- RowExclusiveLock, so UPDATE/Delete can be executed +-- concurrently, it may trigger the EvalPlanQual function +-- to recheck the qualifications. +-- If the subPlan have Motion node, then we can not execute +-- EvalPlanQual correctly, so we raise an error when +-- GDD is enabled and EvalPlanQual is tiggered. + +0: create table tab_update_epq1 (c1 int, c2 int) distributed randomly; +0: create table tab_update_epq2 (c1 int, c2 int) distributed randomly; +0: insert into tab_update_epq1 values(1,1); +0: insert into tab_update_epq2 values(1,1); +0: select * from tab_update_epq1; +0: select * from tab_update_epq2; + +1: set optimizer = off; +2: set optimizer = off; + +1: begin; +2: begin; +1: update tab_update_epq1 set c1 = c1 + 1 where c2 = 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; +2<: +2: end; + +0: select * from tab_update_epq1; +0: drop table tab_update_epq1; +0: drop table tab_update_epq2; +0q: + +-- split update is to implement updating on hash keys, +-- it deletes the tuple and insert a new tuple in a +-- new segment, so it is not easy for other transaction +-- to follow the update link to fetch the new tuple. The +-- other transaction should raise error for such case. +-- the following case should be tested with GDD enabled. +-- 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); +0:insert into t_splitupdate_raise_error values (1, 1); + +-- test delete will throw error +1: begin; +1: update t_splitupdate_raise_error set a = a + 1; + +2: begin; +2&: delete from t_splitupdate_raise_error; + +1: end; +2<: + +2: abort; +1q: +2q: + +-- test norm update will throw error +1: begin; +1: update t_splitupdate_raise_error set a = a + 1; + +2: begin; +2&: update t_splitupdate_raise_error set b = 999; + +1: end; +2<: + +2: abort; +1q: +2q: + +-- test select for update will throw error +-- Currently, select for update will reduce lock-level +-- under some very simple cases, see checkCanOptSelectLockingClause +-- for details. + +1: begin; +1: update t_splitupdate_raise_error set a = a + 1; + +2: begin; +-- TODO: turn off orca, we should fix this until ORCA +-- can generate lockrows plannode. +2: set optimizer = off; +2&: select * from t_splitupdate_raise_error for update; + +1: end; +2<: + +2: abort; +1q: +2q: + +0:drop table t_splitupdate_raise_error; diff --git a/src/test/singlenode_isolation2/sql/gdd/delete-deadlock-root-leaf-concurrent-op.sql b/src/test/singlenode_isolation2/sql/gdd/delete-deadlock-root-leaf-concurrent-op.sql new file mode 100644 index 00000000000..5ddb685cadc --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/delete-deadlock-root-leaf-concurrent-op.sql @@ -0,0 +1,31 @@ +DROP TABLE IF EXISTS part_tbl; +CREATE TABLE part_tbl (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(2) EVERY(1)); +INSERT INTO part_tbl SELECT i, 1, i FROM generate_series(1,100)i; + +-- check gdd is enabled +show gp_enable_global_deadlock_detector; +1:BEGIN; +1:DELETE FROM part_tbl_1_prt_1 WHERE c = segid(2,1); + +2:BEGIN; +2:DELETE FROM part_tbl WHERE c = segid(1,1); + +-- the below delete will wait to acquire the transaction lock to delete the tuple +-- held by Session 2 +1&:DELETE FROM part_tbl_1_prt_1 WHERE c = segid(1,1); + +-- the below delete will wait to acquire the transaction lock to delete the tuple +-- held by Session 1 +-- +-- It is possible that GDD gets triggered immediately, so use '2>:' instead of +-- '2&:' for stable output. +2>:DELETE FROM part_tbl WHERE c = segid(2,1); + +1<: +2<: + +-- since gdd is on, Session 2 will be cancelled. + +1:ROLLBACK; +2:ROLLBACK; +DROP TABLE IF EXISTS part_tbl; diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-01.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-01.sql new file mode 100644 index 00000000000..79df0ebe1d0 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-01.sql @@ -0,0 +1,27 @@ +DROP TABLE IF EXISTS t01; +CREATE TABLE t01 (id int, val int); +INSERT INTO t01 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; + +10: BEGIN; +20: BEGIN; + +10: UPDATE t01 SET val=val WHERE id=segid(0,1); + +20: UPDATE t01 SET val=val WHERE id=segid(1,1); +-- seg 0: con20 ==> con10, xid lock +20&: UPDATE t01 SET val=val WHERE id=segid(0,1); + +-- seg 1: con10 ==> con20, xid lock +10>: UPDATE t01 SET val=val WHERE id=segid(1,1); + +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-04.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-04.sql new file mode 100644 index 00000000000..fa5c5bf2a23 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-04.sql @@ -0,0 +1,31 @@ +DROP TABLE IF EXISTS t04a; +CREATE TABLE t04a (id int, val int); +INSERT INTO t04a (id, val) SELECT i, i FROM generate_series(1, 100) i; + +DROP TABLE IF EXISTS t04b; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; + +10: BEGIN; +20: BEGIN; + +10: UPDATE t04a SET val=val WHERE id=segid(0,1); +10: CREATE TABLE t04b (id int); + +20: UPDATE t04a SET val=val WHERE id=segid(1,1); + +-- seg 1: con10 ==> con20, xid lock +10&: UPDATE t04a SET val=val WHERE id=segid(1,1); + +-- seg -1: con20 ==> con10, xid lock +20>: CREATE TABLE t04b (id int); + +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-05.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-05.sql new file mode 100644 index 00000000000..2607ad6cfe5 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-05.sql @@ -0,0 +1,26 @@ +DROP TABLE IF EXISTS t05; +CREATE TABLE t05 (id int primary key); + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; + +10: BEGIN; +20: BEGIN; + +10: INSERT INTO t05 VALUES(segid(0,1)); + +20: INSERT INTO t05 VALUES(segid(1,1)); +-- seg 0: con20 ==> con10, xid lock +20&: INSERT INTO t05 VALUES(segid(0,1)); + +-- seg 1: con10 ==> con20, xid lock +10>: INSERT INTO t05 VALUES(segid(1,1)); + +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-06.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-06.sql new file mode 100644 index 00000000000..aa997eb6d3a --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-06.sql @@ -0,0 +1,28 @@ +DROP TABLE IF EXISTS t06; +CREATE TABLE t06 (id int, val int); +INSERT INTO t06 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; + +10: BEGIN; +20: BEGIN; + +10: UPDATE t06 SET val=7 WHERE val=segid(0,1); + +20: UPDATE t06 SET val=8 WHERE val=segid(1,1); + +-- seg 1: con10 ==> con20, xid lock +10&: UPDATE t06 SET val=8 WHERE val=segid(1,1); + +-- seg 0: con20 ==> con10, xid lock +20>: UPDATE t06 SET val=7 WHERE val=segid(0,1); + +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-07.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-07.sql new file mode 100644 index 00000000000..fddc0f5d4ec --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-07.sql @@ -0,0 +1,47 @@ +DROP TABLE IF EXISTS t07a; +DROP TABLE IF EXISTS t07b; +CREATE TABLE t07a (c1 int, c2 int); +CREATE TABLE t07b (c1 int, c2 int); +INSERT INTO t07a (c1, c2) SELECT i, i FROM generate_series(1, 100) i; +INSERT INTO t07b (c1, c2) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; +40: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; +40: BEGIN; + +10: UPDATE t07b SET c2 = 11 WHERE c1 = segid(0,1); + +20: UPDATE t07b SET c2 = 22 WHERE c1 = segid(1,1); + +30: LOCK t07a; +-- seg 0: con30 ==> con10, xid lock +30&: UPDATE t07b SET c2 = 21 WHERE c1 = segid(0,1); + +-- seg 1: con10 ==> con20, xid lock +10&: UPDATE t07b SET c2 = 12 WHERE c1 = segid(1,1); + +40: UPDATE t07b SET c2 = 13 WHERE c1 = segid(0,2); +-- seg -1: con40 ==> con30, relation lock +40&: LOCK t07a; + +-- set 0: con20 ==> con40, xid lock +20>: UPDATE t07b SET c2 = 23 WHERE c1 = segid(0,2); + +-- con40 will be cancelled by gdd +40<: +40q: + +-- no more deadlock +20<: +20q: +10<: +10q: +30<: +30q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-102.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-102.sql new file mode 100644 index 00000000000..72f31517388 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-102.sql @@ -0,0 +1,32 @@ +DROP TABLE IF EXISTS t102; +CREATE TABLE t102 (id int, val int); +INSERT INTO t102 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; + +30: UPDATE t102 SET val=30 WHERE id=segid(1,1); + +10: UPDATE t102 SET val=10 WHERE id=segid(0,1); + +20: UPDATE t102 SET val=10 WHERE id=segid(1,2); +-- seg 0: con20 ==> con10, xid lock +-- seg 1: con20 ==> con30, xid lock +20&: UPDATE t102 SET val=20 WHERE id IN (segid(0,1), segid(1,1)); + +-- seg 1: con10 ==> con20, xid lock +10>: UPDATE t102 SET val=10 WHERE id=segid(1,2); + +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-103.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-103.sql new file mode 100644 index 00000000000..e9e17a4815f --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-103.sql @@ -0,0 +1,35 @@ +DROP TABLE IF EXISTS t103; +CREATE TABLE t103 (id int, val int); +INSERT INTO t103 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; + +10: UPDATE t103 SET val=val WHERE id=segid(0,1); +10: UPDATE t103 SET val=val WHERE id=segid(1,2); + +20: UPDATE t103 SET val=val WHERE id=segid(1,1); +-- seg 0: con20 ==> con10, xid lock +20&: UPDATE t103 SET val=val WHERE id=segid(0,1); + +-- seg 1: con30 ==> con10, xid lock +30>: UPDATE t103 SET val=val WHERE id=segid(1,2); + +-- seg 1: con10 ==> con20, xid lock +10>: UPDATE t103 SET val=val WHERE id=segid(1,1); + +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: +30<: +30q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-104.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-104.sql new file mode 100644 index 00000000000..36f204a0c3a --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-104.sql @@ -0,0 +1,60 @@ +DROP TABLE IF EXISTS t104; +CREATE TABLE t104 (id int, val int); +INSERT INTO t104 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; +40: RESET optimizer; +50: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; +40: BEGIN; +50: BEGIN; + +10: UPDATE t104 SET val=val WHERE id=segid(0,1); + +40: UPDATE t104 SET val=val WHERE id=segid(1,4); + +30: UPDATE t104 SET val=val WHERE id IN (segid(0,3), segid(1,3)); +-- seg 1: con30 ==> con40, xid lock +30&: UPDATE t104 SET val=val WHERE id=segid(1,4); + +50: UPDATE t104 SET val=val WHERE id=segid(1,5); +-- seg 1: con50 ==> con30, xid lock +50&: UPDATE t104 SET val=val WHERE id=segid(1,3); + +20: UPDATE t104 SET val=val WHERE id=segid(1,2); +-- seg 0: con20 ==> con10, xid lock +-- seg 1: con20 ==> con50, xid lock +20&: UPDATE t104 SET val=val WHERE id IN (segid(0,1), segid(1,5)); + +-- below two queries will cause two connected small deadlocks which form a big +-- deadlock, to break this big one at least two transactions should be +-- cancelled, but current logic will cancel the youngest transactions in turn, +-- so one extra transaction will be cancelled. +-- +-- this might be improved in the future. + +-- seg 0: con40 ==> con30, xid lock +40>: UPDATE t104 SET val=val WHERE id=segid(0,3); + +-- seg 1: con10 ==> con20, xid lock +10>: UPDATE t104 SET val=val WHERE id=segid(1,2); + +-- con50, con40, con20 will be cancelled by gdd +50<: +50q: +40<: +40q: +20<: +20q: + +-- no more deadlock +30<: +30q: +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-106.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-106.sql new file mode 100644 index 00000000000..e19a36a4051 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-106.sql @@ -0,0 +1,37 @@ +DROP TABLE IF EXISTS t106; +CREATE TABLE t106 (id int, val int); +INSERT INTO t106 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; + +30: UPDATE t106 SET val=30 WHERE id=segid(1,1); + +10: UPDATE t106 SET val=10 WHERE val=segid(0,2); + +-- seg 1: con20 ==> con30, xid lock +20&: UPDATE t106 SET val=20 WHERE val=segid(1,1); + +SELECT barrier(); + +-- seg 1: con10 ~~> con20, tuple lock +10&: UPDATE t106 SET val=10 WHERE val=segid(1,1); + +-- seg 0: con30 ==> con10, xid lock +30>: UPDATE t106 SET val=30 WHERE id=segid(0,2); + +-- con30 will be cancelled by gdd +30<: +30q: + +-- no more deadlock +20<: +20q: +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-upsert.sql b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-upsert.sql new file mode 100644 index 00000000000..b0a55db9be2 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/dist-deadlock-upsert.sql @@ -0,0 +1,40 @@ +-- See github issue: https://github.com/greenplum-db/gpdb/issues/9449 +-- insert into t values (x, x) on conflict (a, b) do update set b = yyy. +-- this kind of statement may lock tuples in segment and may lead to +-- global deadlock when GDD is enabled. + +DROP TABLE IF EXISTS t_upsert; +CREATE TABLE t_upsert (id int, val int) distributed by (id); +CREATE UNIQUE INDEX uidx_t_upsert on t_upsert(id, val); +INSERT INTO t_upsert (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; + +10: BEGIN; +20: BEGIN; + +10: INSERT INTO t_upsert VALUES (segid(0,1), segid(0,1)) on conflict (id, val) do update set val = 999; + +20: INSERT INTO t_upsert VALUES (segid(1,1), segid(1,1)) on conflict (id, val) do update set val = 888; + +select gp_inject_fault('gdd_probe', 'suspend', dbid) + from gp_segment_configuration where content=-1 and role='p'; +select gp_wait_until_triggered_fault('gdd_probe', 1, dbid) + from gp_segment_configuration where content=-1 and role='p'; +-- seg 0: con20 ==> con10, xid lock +20&: INSERT INTO t_upsert VALUES (segid(0,1), segid(0,1)) on conflict (id, val) do update set val = 666; + +-- seg 1: con10 ~~> con20, tuple lock +10&: INSERT INTO t_upsert VALUES (segid(1,1), segid(1,1)) on conflict (id, val) do update set val = 777; + +select gp_inject_fault('gdd_probe', 'reset', dbid) + from gp_segment_configuration where content=-1 and role='p'; +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/end.sql b/src/test/singlenode_isolation2/sql/gdd/end.sql new file mode 100644 index 00000000000..1d1b8e1ed50 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/end.sql @@ -0,0 +1,11 @@ +ALTER SYSTEM RESET gp_enable_global_deadlock_detector; +ALTER SYSTEM RESET gp_global_deadlock_detector_period; + +-- Use utility session on seg 0 to restart master. This way avoids the +-- situation where session issuing the restart doesn't disappear +-- itself. +1U:SELECT pg_ctl(dir, 'restart') from datadir; +-- Start new session on master to make sure it has fully completed +-- recovery and up and running again. +1: SHOW gp_enable_global_deadlock_detector; +1: SHOW gp_global_deadlock_detector_period; diff --git a/src/test/singlenode_isolation2/sql/gdd/extended_protocol_test.sql b/src/test/singlenode_isolation2/sql/gdd/extended_protocol_test.sql new file mode 100644 index 00000000000..e043acc75c3 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/extended_protocol_test.sql @@ -0,0 +1 @@ +! ./extended_protocol_test dbname=isolation2test; diff --git a/src/test/singlenode_isolation2/sql/gdd/local-deadlock-03.sql b/src/test/singlenode_isolation2/sql/gdd/local-deadlock-03.sql new file mode 100644 index 00000000000..bc78de92d0b --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/local-deadlock-03.sql @@ -0,0 +1,46 @@ + +-- gdd can also detect local deadlocks, however it might break at +-- different node with the local deadlock detector. To make the local +-- 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'; +SELECT pg_reload_conf(); +-- start new session, which should always have newly reflected value +1: SHOW gp_global_deadlock_detector_period; + +DROP TABLE IF EXISTS t03; +CREATE TABLE t03 (id int, val int); +INSERT INTO t03 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; + +10: UPDATE t03 SET val=val WHERE id IN (segid(0,2), segid(1,2)); + +20: UPDATE t03 SET val=val WHERE id=segid(0,1); + +30: UPDATE t03 SET val=val WHERE id=segid(1,1); + +-- seg 0: con10 ==> con20, xid lock +-- seg 1: con10 ==> con30, xid lock +10&: UPDATE t03 SET val=val WHERE id IN (segid(0,1), segid(1,1)); + +-- seg 1: con30 ==> con10, xid lock +30>: UPDATE t03 SET val=val WHERE id=segid(1,2); + +-- a local deadlock between con10 & con30 is formed on seg1, +-- con10 will be cancelled by local deadlock detector. +-- note, we must join c20 before c10, otherwise the test will run into infinite +-- waiting if the local deadlock detector cancels c30 instead of c10. +30<: +30q: +20<: +20q: +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/non-lock-105.sql b/src/test/singlenode_isolation2/sql/gdd/non-lock-105.sql new file mode 100644 index 00000000000..778acae0636 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/non-lock-105.sql @@ -0,0 +1,41 @@ +DROP TABLE IF EXISTS t105; +CREATE TABLE t105 (id int, val int); +INSERT INTO t105 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; + +30: UPDATE t105 SET val=30 WHERE id=segid(1,1); + +10: UPDATE t105 SET val=10 WHERE val=segid(0,2); + +-- seg 0: con20 ==> con10, xid lock +-- seg 1: con20 ==> con30, xid lock +20&: UPDATE t105 SET val=20 WHERE val=segid(0,2) OR id=segid(1,1); + +SELECT barrier(); + +-- seg 1: con10 ~~> con20, tuple lock +10&: UPDATE t105 SET val=10 WHERE val=segid(1,1); + +-- so far there is no deadlock yet as con30 is idle in transaction +SELECT pg_sleep(20); + +-- when con30 quits the edge from con10 to con20 on seg 1 will change: +-- seg 1: con10 ==> con20, xid lock +-- then a global deadlock is formed +30q: + +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: diff --git a/src/test/singlenode_isolation2/sql/gdd/non-lock-107.sql b/src/test/singlenode_isolation2/sql/gdd/non-lock-107.sql new file mode 100644 index 00000000000..8866c451e2c --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/non-lock-107.sql @@ -0,0 +1,49 @@ +DROP TABLE IF EXISTS t107; +CREATE TABLE t107 (id int, val int); +INSERT INTO t107 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; +40: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; +40: BEGIN; + +30: UPDATE t107 SET val=30 WHERE id=segid(1,1); + +10: UPDATE t107 SET val=10 WHERE val=segid(0,2); + +20: UPDATE t107 SET val=20 WHERE id=segid(1,2); +-- seg 0: con20 ==> con10, xid lock +-- seg 1: con20 ==> con30, xid lock +20&: UPDATE t107 SET val=20 WHERE val=segid(0,2) OR id=segid(1,1); + +SELECT barrier(); + +-- seg 1: con10 ~~> con20, tuple lock +10&: UPDATE t107 SET val=10 WHERE val=segid(1,1); + +-- seg 1: con40 ==> con20, xid lock +40&: UPDATE t107 SET val=40 WHERE id=segid(1,2); + +-- so far there is no deadlock yet as con30 is idle in transaction +SELECT pg_sleep(20); + +-- when con30 quits the edge from con10 to con20 on seg 1 will change: +-- seg 1: con10 ==> con20, xid lock +-- then a global deadlock is formed +30q: + +-- con20 will be cancelled by gdd +20<: +20q: + +-- no more deadlock +10<: +10q: +40<: +40q: diff --git a/src/test/singlenode_isolation2/sql/gdd/non-lock-108.sql b/src/test/singlenode_isolation2/sql/gdd/non-lock-108.sql new file mode 100644 index 00000000000..b1c3b59b9e2 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/non-lock-108.sql @@ -0,0 +1,39 @@ +DROP TABLE IF EXISTS t108; +CREATE TABLE t108 (id int, val int); +INSERT INTO t108 (id, val) SELECT i, i FROM generate_series(1, 100) i; + +-- gang creation order is important, reset any guc to force the creation +10: RESET optimizer; +20: RESET optimizer; +30: RESET optimizer; + +10: BEGIN; +20: BEGIN; +30: BEGIN; + +10: INSERT INTO t108 VALUES(segid(1,1),segid(1,1)); + +20: INSERT INTO t108 VALUES(segid(1,1),segid(1,1)); + +30: INSERT INTO t108 VALUES(segid(1,1),segid(1,1)); + +-- ANALYZE holds ShareUpdateExclusiveLock, they conflict with each other. +-- But they are not conflict with INSERT, So GDD graph on seg1 should be +-- 20 -> 10 and 30 -> 10 and no cycle in this case. +10: ANALYZE t108; + +20&: ANALYZE t108; + +30&: ANALYZE t108; + +SELECT pg_sleep(20); + +-- con10/20/30 should finish normally. +10q: + +20<: +20q: + +30<: +30q: + diff --git a/src/test/singlenode_isolation2/sql/gdd/prepare.sql b/src/test/singlenode_isolation2/sql/gdd/prepare.sql new file mode 100644 index 00000000000..96448e512f1 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/prepare.sql @@ -0,0 +1,66 @@ +-- t0r is the reference table to provide the data distribution info. +DROP TABLE IF EXISTS t0p; +CREATE TABLE t0p (id int, val int); +INSERT INTO t0p (id, val) SELECT i, i FROM generate_series(1, 100) i; + +DROP TABLE IF EXISTS t0r; +CREATE TABLE t0r (id int, val int, segid int) DISTRIBUTED REPLICATED; +INSERT INTO t0r (id, val, segid) SELECT id, val, gp_segment_id from t0p; + +-- GDD tests rely on the data distribution, but depends on the number of +-- the segments the distribution might be different. +-- so we provide this helper function to return the nth id on a segment. +-- * `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; + +-- 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 +-- in below case the order of 10 and 20 on segments results in different +-- waiting relations: +-- +-- 30: UPDATE t SET val=val WHERE id=1; +-- 10&: UPDATE t SET val=val WHERE val=1; +-- 20&: UPDATE t SET val=val WHERE val=1; +-- +-- There is no perfect way to ensure this. The '&' command in the isolation2 +-- framework only ensures that the QD is being blocked, but this might not be +-- true on segments. In fact on slow machines this exception occurs quite +-- offen on heave load. (e.g. when multiple testcases are executed in parallel) +-- +-- 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; + +-- verify the function +-- Data distribution is sensitive to the underlying hash algorithm, we need each +-- segment has enough tuples for test, 10 should be enough. +SELECT segid(0,10) is not null; +SELECT segid(1,10) is not null; +SELECT segid(2,10) is not null; + +--enable GDD + +-- table to just store the master's data directory path on segment. +CREATE TABLE datadir(a int, dir text); +INSERT INTO datadir select 1,datadir from gp_segment_configuration where role='p' and content=-1; + +ALTER SYSTEM SET gp_enable_global_deadlock_detector TO on; +ALTER SYSTEM SET gp_global_deadlock_detector_period TO 5; + +-- Use utility session on seg 0 to restart master. This way avoids the +-- situation where session issuing the restart doesn't disappear +-- itself. +1U:SELECT pg_ctl(dir, 'restart') from datadir; +-- Start new session on master to make sure it has fully completed +-- recovery and up and running again. +1: SHOW gp_enable_global_deadlock_detector; +1: SHOW gp_global_deadlock_detector_period; diff --git a/src/test/singlenode_isolation2/sql/gdd/update-deadlock-root-leaf-concurrent-op.sql b/src/test/singlenode_isolation2/sql/gdd/update-deadlock-root-leaf-concurrent-op.sql new file mode 100644 index 00000000000..107cf22e5a6 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gdd/update-deadlock-root-leaf-concurrent-op.sql @@ -0,0 +1,31 @@ +DROP TABLE IF EXISTS part_tbl; +CREATE TABLE part_tbl (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(2) EVERY(1)); +INSERT INTO part_tbl SELECT i, 1, i FROM generate_series(1,100)i; + +-- check gdd is enabled +show gp_enable_global_deadlock_detector; +1:BEGIN; +1:UPDATE part_tbl_1_prt_1 SET c = segid(2,1) WHERE c = segid(2,1); + +2:BEGIN; +2:UPDATE part_tbl SET c = segid(1,1) WHERE c = segid(1,1); + +-- the below update will wait to acquire the transaction lock to update the tuple +-- held by Session 2 +1&:UPDATE part_tbl_1_prt_1 SET c = segid(1,1) WHERE c = segid(1,1); + +-- the below update will wait to acquire the transaction lock to update the tuple +-- held by Session 1 +-- +-- It is possible that GDD gets triggered immediately, so use '2>:' instead of +-- '2&:' for stable output. +2>:UPDATE part_tbl SET c = segid(2,1) WHERE c = segid(2,1); + +1<: +2<: + +-- since gdd is on, Session 2 will be cancelled. + +1:ROLLBACK; +2:ROLLBACK; +DROP TABLE IF EXISTS part_tbl; diff --git a/src/test/singlenode_isolation2/sql/gp_terminate_mpp_backends.sql b/src/test/singlenode_isolation2/sql/gp_terminate_mpp_backends.sql new file mode 100644 index 00000000000..30639442c8c --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gp_terminate_mpp_backends.sql @@ -0,0 +1,7 @@ +-- test gp_terminate_mpp_backends +1:create table gp_terminate_mpp_backends_t (a int); + +select gp_terminate_mpp_backends() from gp_dist_random('gp_id'); + +-- expect following to fail as writer gang was killed +1:select count(*) from gp_terminate_mpp_backends_t; diff --git a/src/test/singlenode_isolation2/sql/gpdispatch.sql b/src/test/singlenode_isolation2/sql/gpdispatch.sql new file mode 100644 index 00000000000..a6b142fa310 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gpdispatch.sql @@ -0,0 +1,107 @@ +-- Try to verify that a session fatal due to OOM should have no effect on other sessions. +-- Report on https://github.com/greenplum-db/gpdb/issues/12399 + +create extension if not exists gp_inject_fault; + +1: select gp_inject_fault('make_dispatch_result_error', 'skip', dbid) from gp_segment_configuration where role = 'p' and content = -1; +2: begin; + +-- session1 will be fatal. +1: select count(*) > 0 from gp_dist_random('pg_class'); + +-- session2 should be ok. +2: select count(*) > 0 from gp_dist_random('pg_class'); +2: commit; +1q: +2q: + +select gp_inject_fault('make_dispatch_result_error', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; + +-- +-- Test case for the WaitEvent of ShareInputScan +-- + +create table test_waitevent(i int); +insert into test_waitevent select generate_series(1,1000); + +1: set optimizer = off; +1: set gp_cte_sharing to on; +1: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'suspend', 2); +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 +-- query pg_stat_get_activity on segment to watch the ShareInputScan event +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'; +-- end_ignore +2: select gp_wait_until_triggered_fault('shareinput_writer_notifyready', 1, 2); +2: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'resume', 2); +2: select gp_inject_fault_infinite('shareinput_writer_notifyready', 'reset', 2); +2q: +1<: +1q: + +!\retcode grep ShareInputScan /tmp/_gpdb_test_output.txt; + +-- +-- Test for issue https://github.com/greenplum-db/gpdb/issues/12703 +-- + +-- Case for cdbgang_createGang_async +1: create table t_12703(a int); + +1:begin; +-- make a cursor so that we have a named portal +1: declare cur12703 cursor for select * from t_12703; + +2: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=1), 'stop'); +-- next sql will trigger FTS to mark seg1 as down +2: select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +-- sleep some seconds until the promotion of mirror 0 is done +2: select pg_sleep(2); + +-- this will go to cdbgang_createGang_async's code path +-- for some segments are DOWN. It should not PANIC even +-- with a named portal existing. +1: select * from t_12703; +1: abort; + +1q: +2q: + +-- Case for cdbCopyEndInternal +-- Provide some data to copy in +4: insert into t_12703 select * from generate_series(1, 10)i; +4: copy t_12703 to '/tmp/t_12703'; +-- make copy in statement hang at the entry point of cdbCopyEndInternal +4: select gp_inject_fault('cdb_copy_end_internal_start', 'suspend', dbid) from gp_segment_configuration where role = 'p' and content = -1; +4q: +1&: copy t_12703 from '/tmp/t_12703'; +select gp_wait_until_triggered_fault('cdb_copy_end_internal_start', 1, dbid) from gp_segment_configuration where role = 'p' and content = -1; +-- make Gang connection is BAD +select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=2), 'stop'); +!\retcode gpfts -A -D; +2: select gp_request_fts_probe_scan(); +2: begin; +select gp_inject_fault('cdb_copy_end_internal_start', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; +-- continue copy it should not PANIC +1<: +1q: +-- session 2 still alive (means not PANIC happens) +2: select 1; +2: end; +2q: + +!\retcode gprecoverseg -aF --no-progress; + +-- loop while segments come in sync +!\retcode gpfts -A -D; +select wait_until_all_segments_synchronized(); + +!\retcode gprecoverseg -ar; + +-- loop while segments come in sync +!\retcode gpfts -A -D; +select wait_until_all_segments_synchronized(); + +-- verify no segment is down after recovery +select count(*) from gp_segment_configuration where status = 'd'; diff --git a/src/test/singlenode_isolation2/sql/gpexpand_catalog_lock.sql b/src/test/singlenode_isolation2/sql/gpexpand_catalog_lock.sql new file mode 100644 index 00000000000..321343ec454 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/gpexpand_catalog_lock.sql @@ -0,0 +1,154 @@ +drop table if exists t20; +drop table if exists t30; + +create table t20 (c1 int, c2 int) distributed by (c1); +create table t30 (c1 int, c2 int) distributed by (c1); + +-- c10, c11 simulate gpexpand's catalog lock protection +-- they will acquire the catalog lock in exclusive mode + +-- c20, c30 simulate client sessions +-- they will acquire the catalog lock in shared mode + +-- +-- the catalog lock can not be acquired concurrently in exclusive mode +-- + +10: begin; +11: begin; + +-- c10 acquired the catalog lock in exclusive mode +10: select gp_expand_lock_catalog(); + +-- c11 has to wait for c10 +11&: select gp_expand_lock_catalog(); + +10: end; + +-- c10 released the lock, c11 acquired it now +11<: +11: end; + +-- +-- client sessions do not block each other on catalog changes +-- + +20: begin; +30: begin; + +-- c20 and c30 both acquired the catalog lock in shared mode +20: create table t21 (c1 int, c2 int) distributed by (c1); +30: create table t31 (c1 int, c2 int) distributed by (c1); + +20: insert into t21 values (1,1); +30: insert into t31 values (1,1); + +20: rollback; +30: rollback; + +-- +-- gpexpand must wait for in progress catalog changes to commit/rollback +-- + +10: begin; +20: begin; +30: begin; + +-- c20 and c30 both acquired the catalog lock in shared mode +20: create table t21 (c1 int, c2 int) distributed by (c1); +30: create table t31 (c1 int, c2 int) distributed by (c1); + +-- c10 can not acquire the lock in exclusive mode ... +10&: select gp_expand_lock_catalog(); + +20: insert into t21 values (1,1); +30: insert into t31 values (1,1); + +20: rollback; +30: rollback; + +-- ... until both c20 and c30 released it +10<: +10: end; + +-- +-- the catalog lock can be acquired in order +-- + +10: begin; +20: begin; +30: begin; + +-- c20 acquired the catalog lock in shared mode +20: create table t21 (c1 int, c2 int) distributed by (c1); + +-- c10 has to wait for c20 +10&: select gp_expand_lock_catalog(); + +-- c30 can not acquire it already, even in shared mode +30: create table t31 (c1 int, c2 int) distributed by (c1); +30: rollback; + +-- c20 can still make catalog changes +20: drop table t21; + +20: rollback; + +-- c20 released the lock, c10 acquired it now +10<: +10: end; + +-- +-- gpexpand does not block DMLs or readonly queries to catalogs +-- + +10: begin; +20: begin; +30: begin; + +-- c10 acquired the catalog lock in exclusive mode +10: select gp_expand_lock_catalog(); + +-- c20 and c30 can still run DMLs +20: insert into t20 values (1,1); +20: select * from t20; +20: update t20 set c2=c1+1; +20: delete from t20; + +30: insert into t30 values (1,1); +30: select * from t30; +30: update t30 set c2=c1+1; +30: delete from t30; + +-- c20 and c30 can also run query catalogs +20: select relname from pg_class where oid='t20'::regclass; +30: select relname from pg_class where oid='t30'::regclass; + +20: rollback; +30: rollback; + +10: end; + +-- +-- catalog changes are disallowed when gpexpand is in progress +-- + +10: begin; + +-- c20 has an old transaction +20: begin; + +-- c10 acquired the catalog lock in exclusive mode +10: select gp_expand_lock_catalog(); + +-- c30 has a new transaction +30: begin; + +-- neither c20 nor c30 are allowed to make catalog changes +20: create table t21 (c1 int, c2 int) distributed by (c1); +30: create table t31 (c1 int, c2 int) distributed by (c1); + +20: rollback; +30: rollback; + +10: end; diff --git a/src/test/singlenode_isolation2/sql/instr_in_shmem_setup.sql b/src/test/singlenode_isolation2/sql/instr_in_shmem_setup.sql new file mode 100644 index 00000000000..911e5135561 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/instr_in_shmem_setup.sql @@ -0,0 +1,4 @@ +-- start_ignore +! gpconfig -c gp_enable_query_metrics -v on; +! gpstop -rai; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/instr_in_shmem_terminate.sql b/src/test/singlenode_isolation2/sql/instr_in_shmem_terminate.sql new file mode 100644 index 00000000000..d2d7d8ceda4 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/instr_in_shmem_terminate.sql @@ -0,0 +1,198 @@ +-- start_ignore +-- Isolation test for instrumentation in shmem +-- One session executing a query then another session +-- try to cancel/terminate the query, instrumentation +-- slots in shmem should be recycled correctly. + +DROP SCHEMA IF EXISTS QUERY_METRICS CASCADE; +CREATE SCHEMA QUERY_METRICS; +SET SEARCH_PATH=QUERY_METRICS; + +CREATE EXTERNAL WEB TABLE __gp_localid +( + localid int +) +EXECUTE E'echo $GP_SEGMENT_ID' FORMAT 'TEXT'; +GRANT SELECT ON TABLE __gp_localid TO public; + +CREATE EXTERNAL WEB TABLE __gp_masterid +( + masterid int +) +EXECUTE E'echo $GP_SEGMENT_ID' ON COORDINATOR FORMAT 'TEXT'; +GRANT SELECT ON TABLE __gp_masterid TO public; + +CREATE FUNCTION gp_instrument_shmem_detail_f() +RETURNS SETOF RECORD +AS '$libdir/gp_instrument_shmem', 'gp_instrument_shmem_detail' +LANGUAGE C IMMUTABLE; +GRANT EXECUTE ON FUNCTION gp_instrument_shmem_detail_f() TO public; + +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 TABLE a (id int, c char) ; +INSERT INTO a SELECT *, 'a' FROM generate_series(1, 50); +SET OPTIMIZER=OFF; +ANALYZE a; +-- end_ignore + +-- test 1: pg_terminate_backend +-- only this query in instrument slots, expected 1 +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + +CREATE TABLE foo AS SELECT i a, i b FROM generate_series(1, 10) i; + +-- 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; +-- terminate above query +SELECT pg_terminate_backend(pid, 'test pg_terminate_backend') +FROM pg_stat_activity WHERE query LIKE 'EXPLAIN ANALYZE CREATE TEMP TABLE t1 AS SELECT%' ORDER BY pid LIMIT 1; +-- start_ignore +1<: +1q: +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + +-- test 2: pg_cancel_backend +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + +-- this query will be cancelled by 'test pg_cancel_backend' +2&:EXPLAIN ANALYZE CREATE TEMP TABLE t2 AS SELECT count(*) FROM QUERY_METRICS.foo WHERE pg_sleep(200) IS NULL; +-- cancel above query +SELECT pg_cancel_backend(pid, 'test pg_cancel_backend') +FROM pg_stat_activity WHERE query LIKE 'EXPLAIN ANALYZE CREATE TEMP TABLE t2 AS SELECT%' ORDER BY pid LIMIT 1; +-- start_ignore +2<: +2q: +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + +-- test 3: DML should expose plan_node_id for whole plan tree +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + +-- this query will be cancelled by 'test pg_cancel_backend' +3&:SET OPTIMIZER TO off;EXPLAIN ANALYZE INSERT INTO QUERY_METRICS.a SELECT *, pg_sleep(20) FROM generate_series(1,10); + +-- validate plan nodes exist in instrument solts +SELECT count(*) FROM pg_sleep(1); +-- segment make no sense in SINGLE_NODE_MODE +-- start_ignore +SELECT ro, CASE WHEN max(nid) > 2 THEN 'ok' ELSE 'wrong' END isok FROM ( + SELECT CASE WHEN segid >= 0 THEN 's' ELSE 'm' END ro, nid FROM gp_instrument_shmem_detail + WHERE ssid <> (SELECT setting FROM pg_settings WHERE name = 'gp_session_id')::int AND nid > 0 +) dt +GROUP BY (ro) ORDER BY ro; +-- validate no different tmid across segments +SELECT count(*) FROM (SELECT DISTINCT tmid FROM gp_instrument_shmem_detail) t; +-- end_ignore +-- cancel the query +SELECT pg_cancel_backend(pid, 'test DML') +FROM pg_stat_activity WHERE query LIKE 'SET OPTIMIZER TO off;EXPLAIN ANALYZE INSERT INTO QUERY_METRICS.a SELECT%' ORDER BY pid LIMIT 1; + +-- start_ignore +3<: +3q: +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +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) ; +INSERT INTO QUERY_METRICS.mergeappend_test SELECT g/100, g/100, g FROM generate_series(1, 500) g; +ANALYZE QUERY_METRICS.mergeappend_test; + +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + +-- this query will be cancelled by 'test pg_cancel_backend' +4&:SET OPTIMIZER TO off;SELECT a, b, array_dims(array_agg(x)) FROM QUERY_METRICS.mergeappend_test r GROUP BY a, b +UNION ALL +SELECT NULL, NULL, array_dims(array_agg(x)) FROM QUERY_METRICS.mergeappend_test r, pg_sleep(200) +ORDER BY 1,2; + +-- validate plan nodes exist in instrument solts +SELECT count(*) FROM pg_sleep(1); +-- segment make no sense in SINGLE_NODE_MODE +-- start_ignore +SELECT ro, CASE WHEN max(nid) > 5 THEN 'ok' ELSE 'wrong' END isok FROM ( + SELECT CASE WHEN segid >= 0 THEN 's' ELSE 'm' END ro, nid FROM gp_instrument_shmem_detail + WHERE ssid <> (SELECT setting FROM pg_settings WHERE name = 'gp_session_id')::int AND nid > 0 +) dt +GROUP BY (ro) ORDER BY ro; +-- validate no different tmid across segments +SELECT count(*) FROM (SELECT DISTINCT tmid FROM gp_instrument_shmem_detail) t; +-- end_ignore +-- cancel the query +SELECT pg_cancel_backend(pid, 'test MergeAppend') +FROM pg_stat_activity WHERE query LIKE 'SET OPTIMIZER TO off;SELECT a, b, array_dims(array_agg(x)) FROM QUERY_METRICS.mergeappend_test%' ORDER BY pid LIMIT 1; + +-- start_ignore +4<: +4q: +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + +-- test 5: entrydb +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + +-- this query will be cancelled by 'test pg_cancel_backend' +5&:SET OPTIMIZER TO off;EXPLAIN ANALYZE INSERT INTO QUERY_METRICS.a(id) SELECT oid FROM pg_class, pg_sleep(200); + +-- validate QD and entrydb have instrumentations on each backend process +SELECT count(*) FROM pg_sleep(1); +-- segment make no sense in SINGLE_NODE_MODE +-- start_ignore +SELECT count(DISTINCT pid) FROM gp_instrument_shmem_detail +WHERE ssid <> (SELECT setting FROM pg_settings WHERE name = 'gp_session_id')::int + AND segid < 0 AND nid >= 4; +-- validate no different tmid across segments +SELECT count(*) FROM (SELECT DISTINCT tmid FROM gp_instrument_shmem_detail) t; +-- end_ignore +-- cancel the query +SELECT pg_cancel_backend(pid, 'test entrydb') +FROM pg_stat_activity WHERE query LIKE 'SET OPTIMIZER TO off;EXPLAIN ANALYZE INSERT INTO QUERY_METRICS.a(id) SELECT%' ORDER BY pid LIMIT 1; + +-- start_ignore +5<: +5q: +-- end_ignore + +-- query backend to ensure no PANIC on postmaster and wait cleanup done +SELECT count(*) FROM foo, pg_sleep(2); + +-- Expected result is 1 row, means only current query in instrument slots, +-- If more than one row returned, means previous test has leaked slots. +SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, ccnt) t; + +-- start_ignore +DROP SCHEMA IF EXISTS QUERY_METRICS CASCADE; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/invalidated_toast_index.sql b/src/test/singlenode_isolation2/sql/invalidated_toast_index.sql new file mode 100644 index 00000000000..524308643a3 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/invalidated_toast_index.sql @@ -0,0 +1,39 @@ +-- +-- Test to make sure the error for an invalidated toast index is sane. This is +-- done as an isolation2 test to make it easy to update the catalogs on all +-- segments. +-- + +CREATE TABLE toastable_heap(a text, b varchar, c int); + +-- Force external storage for toasted columns. +ALTER TABLE toastable_heap ALTER COLUMN a SET STORAGE EXTERNAL; +ALTER TABLE toastable_heap ALTER COLUMN b SET STORAGE EXTERNAL; + +-- Insert two values that we know will be toasted. +INSERT INTO toastable_heap VALUES(repeat('a',100000), repeat('b',100001), 1); +INSERT INTO toastable_heap VALUES(repeat('A',100000), repeat('B',100001), 2); + +-- start_ignore +-- +-- Invalidate the index of the toast table for our relation. Because this is a +-- catalog change, we have to execute it on the master and all segments. +-- +-- This is done in an ignore block so it can run correctly with any number of +-- segments. +*U: SET allow_system_table_mods = true; +*U: UPDATE pg_index + SET indisvalid = false + FROM pg_class heap + WHERE indrelid = heap.reltoastrelid + AND heap.oid = 'toastable_heap'::regclass; +-- end_ignore + +-- Fetch, slice, save, and delete should all fail. +SELECT * FROM toastable_heap; +SELECT substr(a, 500, 1) FROM toastable_heap; +UPDATE toastable_heap SET b = repeat('b',100001) WHERE c = 2; +DELETE FROM toastable_heap WHERE c = 1; + +-- Don't leave an unusable table in the DB for others to trip over. +DROP TABLE toastable_heap; diff --git a/src/test/singlenode_isolation2/sql/lockmodes.sql b/src/test/singlenode_isolation2/sql/lockmodes.sql new file mode 100644 index 00000000000..25f071769c0 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/lockmodes.sql @@ -0,0 +1,383 @@ +-- table to just store the master's data directory path on segment. +CREATE TABLE lockmodes_datadir(a int, dir text); +INSERT INTO lockmodes_datadir select 1,datadir from gp_segment_configuration where role='p' and content=-1; + +1: set optimizer = off; + +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%'; + +show gp_enable_global_deadlock_detector; + + +-- 1. The firs part of test is with +-- gp_enable_global_deadlock_detector off +-- +-- because local deadlock detector can already detect and handle deadlocks in +-- singlenode mode, locking is acted as if GDD is enabled to provide better +-- concurrency, so locks won't be elevated from RowExclusive to Exclusive, +-- thus the following results are different from cluster mode. + +-- 1.1 test for heap tables +create table t_lockmods (c int); +insert into t_lockmods select * from generate_series(1, 5); +analyze t_lockmods; + +create table t_lockmods1 (c int); + +create table t_lockmods_rep(c int); + +-- 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) ; +create unique index uidx_t_lockmodes_upsert on t_lockmods_upsert(a, b); +-- add analyze to avoid auto vacuum when executing first insert +analyze t_lockmods_upsert; + +-- 1.1.1 select for (update|share|key share|no key update) should hold ExclusiveLock on range tables +1: begin; +1: explain select * from t_lockmods for update; +1: select * from t_lockmods for update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods for no key update; +1: select * from t_lockmods for no key update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods for share; +1: select * from t_lockmods for share; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods for key share; +1: select * from t_lockmods for key share; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods, t_lockmods1 for update; +1: select * from t_lockmods, t_lockmods1 for update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods, t_lockmods1 for no key update; +1: select * from t_lockmods, t_lockmods1 for no key update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods, t_lockmods1 for share; +1: select * from t_lockmods, t_lockmods1 for share; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods, t_lockmods1 for key share; +1: select * from t_lockmods, t_lockmods1 for key share; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.1.2 update | delete should hold ExclusiveLock on result relations +1: begin; +1: update t_lockmods set c = c + 0; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: delete from t_lockmods; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.1.3 insert should hold RowExclusiveLock on result relations +1: begin; +1: insert into t_lockmods select * from generate_series(1, 5); +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.1.4 upsert should hold ExclusiveLock on result relations +1: begin; +1: insert into t_lockmods_upsert values (1, 1) on conflict(a, b) do update set b = 99; +2: select * from show_locks_lockmodes; +1: abort; + +-- 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; +1: prepare select_for_nokeyupdate as select * from t_lockmods for no key update; +1: prepare select_for_share as select * from t_lockmods for share; +1: prepare select_for_keyshare as select * from t_lockmods for key share; +1: prepare update_tlockmods as update t_lockmods set c = c + 0; +1: prepare delete_tlockmods as delete from t_lockmods; +1: prepare insert_tlockmods as insert into t_lockmods select * from generate_series(1, 5); +1: prepare upsert_tlockmods as insert into t_lockmods_upsert values (1, 1) on conflict(a, b) do update set b = 99; + +1: begin; +1: execute select_for_update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute select_for_nokeyupdate; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute select_for_share; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute select_for_keyshare; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute update_tlockmods; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute delete_tlockmods; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute insert_tlockmods; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute upsert_tlockmods; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.2 test for AO table +create table t_lockmods_ao (c int) with (appendonly=true); +insert into t_lockmods_ao select * from generate_series(1, 8); +analyze t_lockmods_ao; +create table t_lockmods_ao1 (c int) with (appendonly=true); + +-- 1.2.1 select for (update|share|key share|no key update) should hold ExclusiveLock on range tables +1: begin; +1: explain select * from t_lockmods_ao for update; +1: select * from t_lockmods_ao for update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods_ao for no key update; +1: select * from t_lockmods_ao for no key update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods_ao for share; +1: select * from t_lockmods_ao for share; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods_ao for key share; +1: select * from t_lockmods_ao for key share; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods_ao, t_lockmods_ao1 for update; +1: select * from t_lockmods_ao, t_lockmods_ao1 for update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods_ao, t_lockmods_ao1 for no key update; +1: select * from t_lockmods_ao, t_lockmods_ao1 for no key update; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods_ao, t_lockmods_ao1 for share; +1: select * from t_lockmods_ao, t_lockmods_ao1 for share; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: explain select * from t_lockmods_ao, t_lockmods_ao1 for key share; +1: select * from t_lockmods_ao, t_lockmods_ao1 for key share; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.2.2 update | delete should hold ExclusiveLock on result relations +1: begin; +1: update t_lockmods_ao set c = c + 0; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: delete from t_lockmods_ao; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.2.3 insert should hold RowExclusiveLock on result relations +1: begin; +1: insert into t_lockmods_ao select * from generate_series(1, 5); +2: select * from show_locks_lockmodes; +1: abort; + +-- 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; +1: prepare select_for_nokeyupdate_ao as select * from t_lockmods_ao for no key update; +1: prepare select_for_share_ao as select * from t_lockmods_ao for share; +1: prepare select_for_keyshare_ao as select * from t_lockmods_ao for key share; +1: prepare update_tlockmods_ao as update t_lockmods_ao set c = c + 0; +1: prepare delete_tlockmods_ao as delete from t_lockmods_ao; +1: prepare insert_tlockmods_ao as insert into t_lockmods_ao select * from generate_series(1, 5); + +1: begin; +1: execute select_for_update_ao; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute select_for_nokeyupdate_ao; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute select_for_share_ao; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute select_for_keyshare_ao; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute update_tlockmods_ao; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute delete_tlockmods_ao; +2: select * from show_locks_lockmodes; +1: abort; + +1: begin; +1: execute insert_tlockmods_ao; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.3 With limit clause, such case should +-- acquire ExclusiveLock on the whole table and do not generate lockrows node +1: begin; +1: explain select * from t_lockmods order by c limit 1 for update; +1: select * from t_lockmods order by c limit 1 for update; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.4 For replicated table, we should lock the entire table on ExclusiveLock +1: begin; +1: explain select * from t_lockmods_rep for update; +1: select * from t_lockmods_rep for update; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.5 test order-by's plan +1: begin; +1: explain select * from t_lockmods order by c for update; +1: select * from t_lockmods order by c for update; +2: select * from show_locks_lockmodes; +1: abort; + +-- 1.6 select for update NOWAIT/SKIP LOCKED +-- NOWAIT/SKIP LOCKED should not affect the table-level lock +1: begin; +1: select * from t_lockmods for share; +2&: select * from t_lockmods for update nowait; +1: abort; +2<: + +1: begin; +1: select * from t_lockmods for share; +2&: select * from t_lockmods for update skip locked; +1: abort; +2<: + +1q: +2q: + +-- 1.8 Test on DML lock behavior on Partition tables on QDs. +-- This suite will test: +-- * DML on root +-- * DML on one specific leaf +-- For detailed behavior and notes, please refer below +-- cases's comments. +-- Details: https://groups.google.com/a/greenplum.org/g/gpdb-dev/c/wAPKpJzhbpM +-- start_ignore +1:DROP TABLE IF EXISTS t_lockmods_part_tbl_upd_del; +-- end_ignore + +1:CREATE TABLE t_lockmods_part_tbl_upd_del (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(3) EVERY(1)); +1:INSERT INTO t_lockmods_part_tbl_upd_del SELECT i, 1, i FROM generate_series(1,10)i; + +-- +1: BEGIN; +1: DELETE FROM t_lockmods_part_tbl_upd_del; +-- on QD, there's a lock on the root and the target partition +1: select * from show_locks_lockmodes; +1: ROLLBACK; + +-- +-- The session cannot be reused. +-- +-- The macro RELCACHE_FORCE_RELEASE is defined iff USE_ASSERT_CHECKING is +-- defined, and when RELCACHE_FORCE_RELEASE is defined the relcache is +-- forcefully released when closing the relation. +-- +-- The function generate_partition_qual() will behave differently depends on +-- the existence of the relcache. +-- +-- - if the relation is not cached, it will open it in AccessShareLock mode, +-- and save the relpartbound in the relcache; +-- - if the relation is already cached, it will load the relpartbound from the +-- cache directly without opening the relation; +-- +-- So as a result, in the following transactions we will see an extra +-- AccessShareLock lock in a --enable-cassert build compared to a +-- --disable-cassert build. +-- +-- To make the test results stable, we do not reuse the sessions in the test, +-- all the tests are performed without the relcache. +1q: + +1: BEGIN; +1: UPDATE t_lockmods_part_tbl_upd_del SET c = 1 WHERE c = 1; +-- on QD, there's a lock on the root and the target partition +1: select * from show_locks_lockmodes; +1: ROLLBACK; +1q: + +1: BEGIN; +1: DELETE FROM t_lockmods_part_tbl_upd_del_1_prt_1; +-- since the delete operation is on leaf part, there will be a lock on QD +1: select * from show_locks_lockmodes; +1: ROLLBACK; +1q: + +1: BEGIN; +1: UPDATE t_lockmods_part_tbl_upd_del_1_prt_1 SET c = 1 WHERE c = 1; +-- since the update operation is on leaf part, there will be a lock on QD +1: select * from show_locks_lockmodes; +1: ROLLBACK; +1q: diff --git a/src/test/singlenode_isolation2/sql/mark_all_aoseg_await_drop.sql b/src/test/singlenode_isolation2/sql/mark_all_aoseg_await_drop.sql new file mode 100644 index 00000000000..8cdf3b3ac80 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/mark_all_aoseg_await_drop.sql @@ -0,0 +1,36 @@ +-- Ensure all segfiles crossing vacuum threshold but cannot compact +-- due to concurrent transaction should be marked in state +-- AOSEG_STATE_AWAITING_DROP. + +CREATE TABLE mark_all_aoseg_await_drop (a int) WITH (appendonly=true); + +-- Create 3 aoseg entries +0: BEGIN; +1: BEGIN; +2: BEGIN; +0: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; +1: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; +2: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; +0: COMMIT; +1: COMMIT; +2: COMMIT; + +DELETE FROM mark_all_aoseg_await_drop; + +-- We should see all 3 aosegs in state 1 +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('mark_all_aoseg_await_drop'); + +-- VACUUM while another session holds lock +1: BEGIN; +1: SELECT COUNT(*) FROM mark_all_aoseg_await_drop; +1: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; +2: VACUUM mark_all_aoseg_await_drop; +1: END; + +-- 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 +-- marked as state 2 because a concurrent transaction has written to +-- it and did not commit before the vacuum got to it. The vacuum +-- correctly skipped segno 1 and continued to cycle through the aoseg +-- entries. +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('mark_all_aoseg_await_drop'); diff --git a/src/test/singlenode_isolation2/sql/misc.sql b/src/test/singlenode_isolation2/sql/misc.sql new file mode 100644 index 00000000000..9cdf2863972 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/misc.sql @@ -0,0 +1,46 @@ +-- +-- Validate GPDB can create unique index on a table created in utility mode +-- +-- NOTICE: we must connect to master in utility mode because the oid of table is +-- 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); +-1U: create unique index idx_utilitymode_c1 on utilitymode_primary_key_tab (c1); +-1U: drop table utilitymode_primary_key_tab; + +-- 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.) +0U: begin; +0U: set local enable_seqscan=off; +-- start_ignore +0U: explain analyze select * from gp_segment_configuration order by dbid; +-- end_ignore +0U: reset enable_seqscan; +0U: set local enable_indexscan=off; +-- start_ignore +0U: explain analyze select * from gp_segment_configuration order by dbid; +-- end_ignore +0U: rollback; + +-- +-- Temp tables should have a different schema name pattern in utility mode. +-- +-- A temp table's schema name used to be pg_temp_ in normal mode +-- and pg_temp_ in utility mode, once the normal-mode session id +-- equals to the utility-mode backend id they will conflict with each other and +-- cause catalog corruption on the segment. +-- +-- We have changed the name to pg_temp_0 in utility mode. +0U: CREATE TEMP TABLE utilitymode_tmp_tab (c1 int) DISTRIBUTED BY (c1); +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'; +0U: SELECT substring(n2.nspname FROM 1 FOR 15) + FROM pg_namespace n1 + JOIN pg_class c + ON n1.oid = c.relnamespace + JOIN pg_namespace n2 + ON n2.nspname = 'pg_toast_temp_0' || substring(n1.nspname FROM 10) + WHERE c.relname = 'utilitymode_tmp_tab'; diff --git a/src/test/singlenode_isolation2/sql/modify_table_data_corrupt.sql b/src/test/singlenode_isolation2/sql/modify_table_data_corrupt.sql new file mode 100644 index 00000000000..75256921b50 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/modify_table_data_corrupt.sql @@ -0,0 +1,82 @@ +-- start_matchsubs +-- m/nodeModifyTable.c:\d+/ +-- s/nodeModifyTable.c:\d+/nodeModifyTable.c:XXX/ +-- end_matchsubs + +-- start_ignore +drop table tab1; +drop table tab2; +drop table tab3; +-- end_ignore + +-- We do some check to verify the tuple to delete|update +-- is from the segment it scans out. This case is to test +-- such check. +-- We build a plan that will add motion above result relation, +-- however, does not contain explicit motion to send tuples back, +-- and then login in segment using utility mode to insert some +-- bad data. +-- Then we carefully build some plans for orca and planner, +-- when reading these test cases, pay attention to the bad tuple +-- and see if it is motioned to other segments. + +create table tab1(a int, b int) distributed by (b); +create table tab2(a int, b int) distributed by (a); +create table tab3 (a int, b int) distributed by (b); + +insert into tab1 values (1, 1); +insert into tab2 values (1, 1); +insert into tab3 values (1, 1); + +analyze tab1; +analyze tab2; +analyze tab3; + +set allow_system_table_mods=true; +update pg_class set relpages = 10000 where relname='tab2'; +update pg_class set reltuples = 100000000 where relname='tab2'; +update pg_class set relpages = 100000000 where relname='tab3'; +update pg_class set reltuples = 100000 where relname='tab3'; + +0U: insert into tab1 values (1, 1); + +select gp_segment_id, * from tab1; + +-- For planner, this will error out +explain (costs off) delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; +begin; +delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; +abort; + +-- 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; +begin; +update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; +abort; + +-- 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; +begin; +delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; +abort; + +-- 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; +begin; +update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; +abort; + +-- test splitupdate. +-- For orca, the plan contains a redistribute motion, so that +-- this following statement will error out. +-- For planner, the plan is using explicit redistribute motion, +-- the to-delete tuple is set to send back where it is from, so +-- it will not error out. +explain (costs off) update tab1 set b = b + 1; +begin; +update tab1 set b = b + 1; +abort; + +drop table tab1; +drop table tab2; +drop table tab3; diff --git a/src/test/singlenode_isolation2/sql/oom_abort.sql b/src/test/singlenode_isolation2/sql/oom_abort.sql new file mode 100644 index 00000000000..23bd733bf6b --- /dev/null +++ b/src/test/singlenode_isolation2/sql/oom_abort.sql @@ -0,0 +1 @@ +select count(1) from lineitem as a, lineitem as b where a.l_orderkey = b.l_orderkey; diff --git a/src/test/singlenode_isolation2/sql/oom_mixed_1.sql b/src/test/singlenode_isolation2/sql/oom_mixed_1.sql new file mode 100644 index 00000000000..14821e99ddc --- /dev/null +++ b/src/test/singlenode_isolation2/sql/oom_mixed_1.sql @@ -0,0 +1,32 @@ +show gp_vmem_protect_limit; + +-- start_ignore +select 3 as oom_test; +(select count(*) from +(select o0.o_orderkey from +(orders o0 +left outer join orders o1 on o0.o_orderkey = o1.o_orderkey +left outer join orders o2 on o1.o_orderkey = o2.o_orderkey +left outer join orders o3 on o2.o_orderkey = o3.o_orderkey +left outer join orders o4 on o3.o_orderkey = o4.o_orderkey +left outer join orders o5 on o4.o_orderkey = o5.o_orderkey +left outer join orders o6 on o5.o_orderkey = o6.o_orderkey +left outer join orders o7 on o6.o_orderkey = o7.o_orderkey +left outer join orders o8 on o7.o_orderkey = o8.o_orderkey +left outer join orders o9 on o8.o_orderkey = o9.o_orderkey +left outer join orders o10 on o9.o_orderkey = o10.o_orderkey +left outer join orders o11 on o10.o_orderkey = o11.o_orderkey +left outer join orders o12 on o11.o_orderkey = o12.o_orderkey +left outer join orders o13 on o12.o_orderkey = o13.o_orderkey +left outer join orders o14 on o13.o_orderkey = o14.o_orderkey +left outer join orders o15 on o14.o_orderkey = o15.o_orderkey) +order by o0.o_orderkey) as foo +); +-- end_ignore + +select count(*) from orders; +select pg_sleep(10); +select * from lineitem where l_orderkey < 100 order by 1, 2, 3, 4 ,5; +-- start_ignore +select count(ps_suppkey) from partsupp where ps_partkey < 10 group by ps_suppkey limit 1; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/oom_mixed_2.sql b/src/test/singlenode_isolation2/sql/oom_mixed_2.sql new file mode 100644 index 00000000000..d38f3a4d498 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/oom_mixed_2.sql @@ -0,0 +1,47 @@ +select count(*) from orders; +select pg_sleep(10); +select * from lineitem where l_orderkey < 100 order by 1, 2, 3, 4, 5; +-- start_ignore +select count(ps_suppkey) from partsupp where ps_partkey < 10 group by ps_suppkey; + +explain analyze select 'foo7', +supp_nation, +cust_nation, +l_year, +sum(volume) as revenue +from +( +select +n1.n_name as supp_nation, +n2.n_name as cust_nation, +extract(year from l_shipdate) as l_year, +l_extendedprice * (1 - l_discount) as volume +from +supplier, +lineitem, +orders, +customer, +nation n1, +nation n2 +where +s_suppkey = l_suppkey +and o_orderkey = l_orderkey +and c_custkey = o_custkey +and s_nationkey = n1.n_nationkey +and c_nationkey = n2.n_nationkey +and ( +(n1.n_name = 'MOZAMBIQUE' and n2.n_name = 'GERMANY') +or (n1.n_name = 'GERMANY' and n2.n_name = 'MOZAMBIQUE') +) +and l_shipdate between date '1995-01-01' and date '1996-12-31' +) as shipping +group by +supp_nation, +cust_nation, +l_year +order by +supp_nation, +cust_nation, +l_year; +-- end_ignore + diff --git a/src/test/singlenode_isolation2/sql/oom_simple.sql b/src/test/singlenode_isolation2/sql/oom_simple.sql new file mode 100644 index 00000000000..5ea6a3496e0 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/oom_simple.sql @@ -0,0 +1,2 @@ +select count(*) from partsupp; +select pg_sleep(20); diff --git a/src/test/singlenode_isolation2/sql/oom_startup_memory.sql b/src/test/singlenode_isolation2/sql/oom_startup_memory.sql new file mode 100644 index 00000000000..ed19bd6bd78 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/oom_startup_memory.sql @@ -0,0 +1,66 @@ +-- OOM should be raised when there are too many idle processes. +-- +-- We have below assumptions in the tests: +-- - number of primary segments: 3; +-- - the startup memory cost for a postgres process: 8MB ~ 14MB; +-- - per query limit: 20MB; +-- - per segment limit: 60MB; + +-- start_matchsubs +-- +-- m/DETAIL: Per-query memory limit reached: current limit is \d+ kB, requested \d+ bytes, has \d+ MB avaiable for this query/ +-- s/\d+/XXX/g +-- +-- m/DETAIL: Vmem limit reached, failed to allocate \d+ bytes from tracker, which has \d+ MB available/ +-- s/\d+/XXX/g +-- +-- m/DETAIL: System memory limit reached, failed to allocate \d+ bytes from system/ +-- s/\d+/XXX/g +-- +-- m/DETAIL: connection to server at .* failed: FATAL: Out of memory/ +-- s/DETAIL: connection to server at .* failed: FATAL: Out of memory/DETAIL: FATAL: Out of memory/ +-- +-- m/(seg\d+ \d+.\d+.\d+.\d+:\d+)/ +-- s/(.*)/(seg IP:PORT)/ +-- +-- end_matchsubs + +-- +-- To reach the per query limit we need at least 3 slices in one query. +-- + +1: select * + from gp_dist_random('gp_id') t1 + join gp_dist_random('gp_id') t2 using(gpname) + join gp_dist_random('gp_id') t3 using(gpname) + join gp_dist_random('gp_id') t4 using(gpname) + ; +1q: + +-- +-- To reach the per segment limit we need at least 8 concurrent sessions. +-- + +-- However the per segment limit is not enforced on QD, so below QD-only +-- sessions could all run successfully. +1: select 1; +2: select 1; +3: select 1; +4: select 1; +5: select 1; +6: select 1; +7: select 1; +8: select 1; + +-- The per segment limit should be reached on one or more QEs in below +-- sessions, we only care about the last one. +-- start_ignore +1: set gp_vmem_idle_resource_timeout to '1h'; +2: set gp_vmem_idle_resource_timeout to '1h'; +3: set gp_vmem_idle_resource_timeout to '1h'; +4: set gp_vmem_idle_resource_timeout to '1h'; +5: set gp_vmem_idle_resource_timeout to '1h'; +6: set gp_vmem_idle_resource_timeout to '1h'; +7: set gp_vmem_idle_resource_timeout to '1h'; +-- end_ignore +8: set gp_vmem_idle_resource_timeout to '1h'; diff --git a/src/test/singlenode_isolation2/sql/orphan_temp_table.sql b/src/test/singlenode_isolation2/sql/orphan_temp_table.sql new file mode 100644 index 00000000000..a6a75487187 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/orphan_temp_table.sql @@ -0,0 +1,23 @@ +-- Test orphan temp table on coordinator. +-- 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); + +-- panic on segment 0 +1: SELECT gp_inject_fault('before_exec_scan', 'panic', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; + +-- trigger 'before_exec_scan' panic in ExecScan +1: SELECT * FROM test_temp_table_cleanup; + +-- we should not see the temp table on the coordinator +1: SELECT oid, relname, relnamespace FROM pg_class where relname = 'test_temp_table_cleanup'; + + +-- the temp table is left on segment 0, it should be dropped by autovacuum later +0U: SELECT relname FROM pg_class where relname = 'test_temp_table_cleanup'; + +-- no temp table left on other segments +1U: SELECT oid, relname, relnamespace FROM pg_class where relname = 'test_temp_table_cleanup'; + +1: SELECT gp_inject_fault('before_exec_scan', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; diff --git a/src/test/singlenode_isolation2/sql/packcore.sql b/src/test/singlenode_isolation2/sql/packcore.sql new file mode 100644 index 00000000000..04cce1674d2 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/packcore.sql @@ -0,0 +1,119 @@ +-- start_ignore +CREATE LANGUAGE plpython3u; +-- end_ignore + +DO LANGUAGE plpython3u $$ + import os + import sys + import glob + import shutil + import subprocess + + if sys.platform not in ('linux', 'linux2'): + # packcore only works on linux + return + + def check_call(cmds): + ret = subprocess.Popen(cmds, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out = ret.communicate() + if ret.returncode != 0: + raise SystemError('''\ +Command {cmds} returned non-zero exit status {retcode} +stdout: {stdout} +stderr: {stderr} +'''.format(cmds=cmds, retcode=ret.returncode, stdout=out[0], stderr=out[1])) + + # generate and verify a packcore tarball + # + # TODO: packcore can list shared libraries with gdb, ldd, or ld-linux.so, + # we should verify all of them, but so far there is no cmdline option to + # specify it. although we could rename the commands to fallback to others, + # we should not do it, it requires root permission and might corrupt the + # developer system. on concourse, gdb is not installed by default, so the + # gdb way is not covered by the pipelines. + def test_packcore(cmds): + # cleanup old files and dirs + shutil.rmtree(tarball, ignore_errors=True) + shutil.rmtree(dirname, ignore_errors=True) + + # generate the tarball, the packcore command should return 0 + check_call(cmds) + assert os.path.isfile(tarball) + + # extract the tarball + check_call(['tar', '-zxf', tarball]) + assert os.path.isdir(dirname) + + # verify that binary and shared libraries are included + assert os.path.exists('{}/postgres'.format(dirname)) + assert os.path.exists('{}/lib64/ld-linux-x86-64.so.2'.format(dirname)) + + if os.path.exists('/usr/bin/gdb'): + # load the coredump and run some simple gdb commands + os.chdir(dirname) + # remove LD_LIBRARY_PATH before invoking gdb + ld_library_path = None + if 'LD_LIBRARY_PATH' in os.environ: + ld_library_path = os.environ.pop('LD_LIBRARY_PATH') + check_call(['./runGDB.sh', + '--batch', + '--nx', + '--eval-command=bt', + '--eval-command=p main', + '--eval-command=p fork']) + # restore LD_LIBRARY_PATH to its previous value + if ld_library_path is not None: + os.environ['LD_LIBRARY_PATH'] = ld_library_path + os.chdir('..') + + # gzip runs much faster with -1 + os.putenv('GZIP', '-1') + + # do not put the packcore results under master data, that will cause + # failures in other tests + os.chdir('/tmp') + + gphome = os.getenv('GPHOME') + assert gphome + + postgres = '{}/bin/postgres'.format(gphome) + assert os.path.exists(postgres) + + packcore = '{}/sbin/packcore'.format(gphome) + assert os.path.exists(packcore) + + # 'packcore --help' should return 0 + check_call([packcore, '--help']) + check_call([packcore, '-h']) + + # 'packcore --version' should return 0 + check_call([packcore, '--version']) + + cores = glob.glob('/tmp/core.postgres.*') + if not cores: + # no postgres coredump found, skip the packcore tests + return + + corefile = cores[0] + corename = os.path.basename(corefile) + tarball = 'packcore-{}.tgz'.format(corename) + dirname = 'packcore-{}'.format(corename) + + # 'packcore core' should work + test_packcore([packcore, + corefile]) + + # 'packcore -b postgres core' should work + test_packcore([packcore, + '--binary={}'.format(postgres), + corefile]) + test_packcore([packcore, + '--binary', postgres, + corefile]) + test_packcore([packcore, + '-b', postgres, + corefile]) +$$; +-- vi: sw=4 et : diff --git a/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/.gitignore b/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/.gitignore new file mode 100644 index 00000000000..10e7ab0b8c6 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/.gitignore @@ -0,0 +1,13 @@ +corner.sql +explain.sql +extended_query.sql +fault_inject.sql +privilege.sql +replicated_table.sql +retrieve_quit_check.sql +retrieve_quit_wait.sql +security.sql +special_query.sql +status_check.sql +status_wait.sql +syntax.sql diff --git a/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/set.sql b/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/set.sql new file mode 100644 index 00000000000..0986a1f8a98 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/set.sql @@ -0,0 +1,7 @@ +-- Before running test, set statement_timeout to 1 minute so that even if some +-- error make 'gp_wait_parallel_retrieve_cursor()' hang, it will be canceled +-- when timeout. + +!\retcode gpconfig -c statement_timeout -v 60000; +!\retcode gpstop -u; + diff --git a/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/unset.sql b/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/unset.sql new file mode 100644 index 00000000000..e6dec37c074 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/parallel_retrieve_cursor/unset.sql @@ -0,0 +1,2 @@ +!\retcode gpconfig -r statement_timeout; +!\retcode gpstop -u; diff --git a/src/test/singlenode_isolation2/sql/pg_rewind_fail_missing_xlog.sql b/src/test/singlenode_isolation2/sql/pg_rewind_fail_missing_xlog.sql new file mode 100644 index 00000000000..b0af3910f6c --- /dev/null +++ b/src/test/singlenode_isolation2/sql/pg_rewind_fail_missing_xlog.sql @@ -0,0 +1,119 @@ +-- Test the bug that if checkpoint.redo before the oldest replication slot LSN +-- is removed/recylced in checkpointer, gprecoverseg (based on pg_rewind) would +-- would fail. + +CREATE TABLE tst_missing_tbl (a int); +INSERT INTO tst_missing_tbl values(2),(1),(5); + +-- make the test faster. +!\retcode gpconfig -c wal_keep_size -v 128; +!\retcode gpstop -ari; + +-- Test 1: primary was marked down by the master but acetually it keeps running +-- and previously, checkpoints could recycle/remove the checkpoint.redo wal +-- file before the oldest replication slot LSN and thus make pg_rewind fail due +-- to missing xlog file. + +-- Run a checkpoint so that the below sqls won't cause a checkpoint +-- until an explicit checkpoint command is issued by the test. +-- checkpoint_timeout is by default 300 but the below test should be able to +-- finish in 300 seconds. +1: CHECKPOINT; + +0U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); +1: INSERT INTO tst_missing_tbl values(2),(1),(5); +0U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); +1: INSERT INTO tst_missing_tbl values(2),(1),(5); +0U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); +1: INSERT INTO tst_missing_tbl values(2),(1),(5); +-- 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(); +1: INSERT INTO tst_missing_tbl values(2),(1),(5); + +-- Mark down the primary with content 0 via fts fault injection. +1: SELECT gp_inject_fault_infinite('fts_handle_message', 'error', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + +-- Trigger failover and double check. +1: SELECT gp_request_fts_probe_scan(); +1: SELECT role, preferred_role from gp_segment_configuration where content = 0; + +-- Run two more checkpoints. Previously this causes the checkpoint.redo wal +-- file before the oldest replication slot LSN is recycled/removed. +0M: CHECKPOINT; +0M: CHECKPOINT; + +-- Wait some seconds until the promotion is done. When the query comes too early, +-- the promoted primary is still hot-standby, but we don't support hot-standby now. +2: select pg_sleep(2); + +-- Write something (promote adds a 'End Of Recovery' xlog that causes the +-- divergence between primary and mirror, but I add a write here so that we +-- 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); +2: SELECT gp_segment_id, count(*) from tst_missing_tbl group by gp_segment_id; + +-- Ensure that pg_rewind succeeds. Previously it could fail since the divergence +-- LSN wal file is missing. +!\retcode gprecoverseg -av; +-- In case it fails it should not affect subsequent testing. +!\retcode gprecoverseg -aF; +2: SELECT wait_until_all_segments_synchronized(); + +-- Test 2 +-- primary is abnormally shutdown, but pg_rewind would call single mode +-- postgres to ensure it clean shutdown and that causes two checkpoints. + +-- See previous comment for why. +3: CHECKPOINT; + +1U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); +3: INSERT INTO tst_missing_tbl values(2),(1),(5); +1U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); +3: INSERT INTO tst_missing_tbl values(2),(1),(5); +1U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); +3: INSERT INTO tst_missing_tbl values(2),(1),(5); +-- 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(); +3: INSERT INTO tst_missing_tbl values(2),(1),(5); + +-- 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; +1U&: CHECKPOINT; +3: SELECT gp_wait_until_triggered_fault('checkpoint_after_redo_calculated', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content = 1; + +-- Stop the primary immediately and promote the mirror. +3: SELECT pg_ctl(datadir, 'stop', 'immediate') FROM gp_segment_configuration WHERE role='p' AND content = 1; +3: SELECT gp_request_fts_probe_scan(); +-- Wait for the end of recovery CHECKPOINT completed after the mirror was promoted +3: SELECT gp_inject_fault('checkpoint_after_redo_calculated', 'skip', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 1; +3: SELECT gp_wait_until_triggered_fault('checkpoint_after_redo_calculated', 1, dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 1; +3: SELECT gp_inject_fault('checkpoint_after_redo_calculated', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 1; +3: SELECT role, preferred_role from gp_segment_configuration where content = 1; + +4: INSERT INTO tst_missing_tbl values(2),(1),(5); +4: SELECT gp_segment_id, count(*) from tst_missing_tbl group by gp_segment_id; + +-- CHECKPOINT should fail now. +1U<: +1Uq: + +-- Ensure that pg_rewind succeeds. For unclean shutdown, there are two +-- checkpoints are introduced in pg_rewind when running single-mode postgres +-- (one is the checkpoint after crash recovery and another is the shutdown +-- checkpoint) and previously the checkpoints clean up the wal files that +-- include the previous checkpoint (before divergence LSN) for pg_rewind and +-- thus makes gprecoverseg (pg_rewind) fail. +!\retcode gprecoverseg -av; +-- In case it fails it should not affect subsequent testing. +!\retcode gprecoverseg -aF; +4: SELECT wait_until_all_segments_synchronized(); + +-- Cleanup +5: DROP TABLE tst_missing_tbl; +!\retcode gprecoverseg -ar; +5: SELECT wait_until_all_segments_synchronized(); +!\retcode gpconfig -r wal_keep_size; +!\retcode gpstop -ari; diff --git a/src/test/singlenode_isolation2/sql/pg_terminate_backend.sql b/src/test/singlenode_isolation2/sql/pg_terminate_backend.sql new file mode 100644 index 00000000000..fed8066a8a1 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/pg_terminate_backend.sql @@ -0,0 +1,28 @@ +1:create table terminate_backend_t (a int) ; + +-- 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'; + +-- expect this command to be terminated by 'test pg_terminate_backend' +1&: insert into terminate_backend_t values (1); + +select gp_wait_until_triggered_fault('heap_insert', 1, dbid) +from gp_segment_configuration where content = -1 and role = 'p'; + +-- extract the pid for the previous query +SELECT pg_terminate_backend(pid,'test pg_terminate_backend') +FROM pg_stat_activity WHERE query like 'insert into terminate_backend_t%' +ORDER BY pid LIMIT 1; + +-- EXPECT: session 1 terminated with 'test pg_terminate_backend' +1<: + +-- query backend to ensure no PANIC on postmaster +select gp_inject_fault('heap_insert', 'reset', dbid) + from gp_segment_configuration + where content = -1 and role = 'p'; + +-- the table should be empty if insert was terminated +select * from terminate_backend_t; diff --git a/src/test/singlenode_isolation2/sql/pg_views_concurrent_drop.sql b/src/test/singlenode_isolation2/sql/pg_views_concurrent_drop.sql new file mode 100644 index 00000000000..40d5142d86b --- /dev/null +++ b/src/test/singlenode_isolation2/sql/pg_views_concurrent_drop.sql @@ -0,0 +1,19 @@ +1:drop view if exists concurrent_drop_view cascade; +1:create view concurrent_drop_view as select * from pg_class; +1:select viewname from pg_views where viewname = 'concurrent_drop_view'; + +-- One transaction drops the view, and before it commits, another +-- transaction selects its definition from pg_views. The view is still +-- visible to the second transaction, but deparsing the view's +-- definition will block until the first transaction ends. And if the +-- first transaction committed, the definition cannot be fetched. +-- It's returned as NULL in that case. (PostgreSQL throws an ERROR, +-- but getting a spurious ERROR when all you do is query pg_views is +-- not nice.) +1:begin; +1:drop view concurrent_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); +1:commit; +2<: diff --git a/src/test/singlenode_isolation2/sql/prepare_limit.sql b/src/test/singlenode_isolation2/sql/prepare_limit.sql new file mode 100644 index 00000000000..c3fc5831bfb --- /dev/null +++ b/src/test/singlenode_isolation2/sql/prepare_limit.sql @@ -0,0 +1,65 @@ +-- test to verify a bug that causes standby startup fatal with message like +-- "the limit of xxx distributed transactions has been reached". +-- Refer comment in https://github.com/greenplum-db/gpdb/issues/9207 for the +-- context. + +-- We will reset the value to 250 finally so sanity check the current value here. +6: show max_prepared_transactions; +!\retcode gpconfig -c max_prepared_transactions -v 3 --skipvalidation; +-- Enable gp_autostats_mode to make sure the single value insert triger 2pc +!\retcode gpconfig -c gp_autostats_mode -v 'on_no_stats' --skipvalidation; +!\retcode gpstop -ari; + +5: create table prepare_limit1 (a int); +5: create table prepare_limit2 (a int); +5: create table prepare_limit3 (a int); +5: create table prepare_limit4 (a int); + +5: select gp_inject_fault_infinite('dtm_before_insert_forget_comitted', 'suspend', 1); + +-- Note first insert after table create triggers auto_stats and leads to 2pc +-- transaction. + +-- (2) is on seg0 +1&: insert into prepare_limit1 values(2); +2&: insert into prepare_limit2 values(2); + +-- (1) is on seg1 +3&: insert into prepare_limit3 values(1); +4&: insert into prepare_limit4 values(1); + +-- wait until these 2pc reach before inserting forget commit. +5: SELECT gp_wait_until_triggered_fault('dtm_before_insert_forget_comitted', 4, 1); + +-- wait until standby catches up and replays all xlogs. +5: select wait_for_replication_replay (-1, 5000); + +-- reset to make testing continue +5: select gp_inject_fault('dtm_before_insert_forget_comitted', 'reset', 1); +1<: +2<: +3<: +4<: + +-- verify that standby is correctly wal streaming. +5: select state from pg_stat_replication; + +-- verify the tuples are on correct segments so the test assumption is +-- correct. (i.e. tuple 2, 1 are on different segments). +5: select gp_segment_id, * from prepare_limit1; +5: select gp_segment_id, * from prepare_limit2; +5: select gp_segment_id, * from prepare_limit3; +5: select gp_segment_id, * from prepare_limit4; + +-- cleanup +5: drop table prepare_limit1; +5: drop table prepare_limit2; +5: drop table prepare_limit3; +5: drop table prepare_limit4; + +-- 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 +-- to 250 which is the default value when demo cluster is created. +!\retcode gpconfig -c max_prepared_transactions -v 250 --skipvalidation; +!\retcode gpconfig -c gp_autostats_mode -v 'none' --skipvalidation; +!\retcode gpstop -ari; diff --git a/src/test/singlenode_isolation2/sql/prepared_xact_deadlock_pg_rewind.sql b/src/test/singlenode_isolation2/sql/prepared_xact_deadlock_pg_rewind.sql new file mode 100644 index 00000000000..2bbd838ad8e --- /dev/null +++ b/src/test/singlenode_isolation2/sql/prepared_xact_deadlock_pg_rewind.sql @@ -0,0 +1,50 @@ +-- Test a recovered (in startup) prepared transaction does not block +-- pg_rewind due to lock conflict of database template1 when it runs the single +-- mode instance to ensure clean shutdown on the target postgres instance. + +-- start_ignore +-- set GUCs to speed-up the test +1: alter system set gp_fts_probe_retries to 2; +1: alter system set gp_fts_probe_timeout to 5; +1: select pg_reload_conf(); +--end_ignore + +1: select gp_inject_fault('after_xlog_xact_prepare_flushed', 'suspend', dbid) from gp_segment_configuration where role='p' and content = 0; +2&: create database db_orphan_prepare; +1: select gp_wait_until_triggered_fault('after_xlog_xact_prepare_flushed', 1, dbid) from gp_segment_configuration where role='p' and content = 0; + +-- immediate shutdown the primary and then promote the mirror. +1: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=0), 'stop'); +1: select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +1: select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0; +-- start_ignore +1: select gp_inject_fault('after_xlog_xact_prepare_flushed', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; +-- end_ignore + +-- wait until promote is finished. +select pg_sleep(2); +0U: select 1; +0Uq: +2<: + +-- restore the cluster. Previously there is a bug the incremental recovery +-- hangs in pg_rewind due to lock conflict. pg_rewinds runs a single-mode +-- postgres to ensure clean shutdown of the postgres. That will recover the +-- unhandled prepared transactions into memory which will hold locks. For +-- example, "create database" will hold the lock of template1 on pg_database +-- with mode 5, but that conflicts with the mode 3 lock which is needed during +-- postgres starting in InitPostgres() and thus pg_rewind hangs forever. +!\retcode gprecoverseg -a; +!\retcode gpfts -A -D; +select wait_until_all_segments_synchronized(); +!\retcode gprecoverseg -ar; +!\retcode gpfts -A -D; +select wait_until_all_segments_synchronized(); + +-- start_ignore +-- reset fts GUCs. +3: alter system reset gp_fts_probe_retries; +3: alter system reset gp_fts_probe_timeout; +3: select pg_reload_conf(); +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/prevent_ao_wal.sql b/src/test/singlenode_isolation2/sql/prevent_ao_wal.sql new file mode 100644 index 00000000000..cfee9b0dc43 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/prevent_ao_wal.sql @@ -0,0 +1,85 @@ +-- For AO/AOCO tables, their WAL records are only +-- generated for replication purposes (they are not used for crash +-- recovery because AO/AOCO table operations are crash-safe). To decrease +-- disk space usage and to improve performance of AO/AOCO operations, we +-- suppress generation of XLOG_APPENDONLY_INSERT and +-- XLOG_APPENDONLY_TRUNCATE WAL records when wal_level=minimal is +-- specified. +-- This test is supposed to ensure that XLOG_APPENDONLY_INSERT and +-- XLOG_APPENDONLY_TRUNCATE WAL records are not generated when +-- wal_level=minimal is set. +-- Because on mirrored cluster primary segments have replication slots +-- and that conflict with the wal_level=minimal GUC +-- we connect to coordinator in utility mode for AO/AOCO operations and +-- validate WAL records on the coordinator. + +-- start_matchignore +-- m/pg_waldump: fatal: error in WAL record at */ +-- m/.*The 'DISTRIBUTED BY' clause determines the distribution of data*/ +-- m/.*Table doesn't have 'DISTRIBUTED BY' clause*/ +-- end_matchignore + +-- start_matchsubs +-- m/tx:\s+\d+/ +-- s/tx:\s+\d+/tx: ##/ + +-- m/lsn: \d\/[0-9a-fA-F]+, prev \d\/[0-9a-fA-F]+/ +-- s/lsn: \d\/[0-9a-fA-F]+, prev \d\/[0-9a-fA-F]+/lsn: #\/########, prev #\/########/ + +-- m/rel \d+\/\d+\/\d+/ +-- s/rel \d+\/\d+\/\d+/rel ####\/######\/######/ +-- end_matchsubs + +-- Create tables (AO, AOCO) +-1U: CREATE TABLE ao_foo (n int) WITH (appendonly=true); +-1U: CREATE TABLE aoco_foo (n int, m int) WITH (appendonly=true, orientation=column); + +-- Switch WAL file +-1U: SELECT true FROM pg_switch_wal(); +-- Insert data (AO) +-1U: INSERT INTO ao_foo SELECT generate_series(1,10); +-- Insert data (AOCO) +-1U: INSERT INTO aoco_foo SELECT generate_series(1,10), generate_series(1,10); +-- Delete data and run vacuum (AO) +-1U: DELETE FROM ao_foo WHERE n > 5; +-1U: VACUUM; +-- Delete data and run vacuum (AOCO) +-1U: DELETE FROM aoco_foo WHERE n > 5; +-1U: VACUUM; +-1Uq: + +-- 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; + +-- *********** Set wal_level=minimal ************** +!\retcode gpconfig -c wal_level -v minimal --masteronly; +-- Set max_wal_senders to 0 because a non-zero value requires wal_level >= 'archive' +!\retcode gpconfig -c max_wal_senders -v 0 --masteronly; +-- Restart QD +!\retcode pg_ctl -l /dev/null -D $COORDINATOR_DATA_DIRECTORY restart -w -t 600 -m fast; + +-- Switch WAL file +-1U: SELECT true FROM pg_switch_wal(); +-- Insert data (AO) +-1U: INSERT INTO ao_foo SELECT generate_series(1,10); +-- Insert data (AOCO) +-1U: INSERT INTO aoco_foo SELECT generate_series(1,10), generate_series(1,10); +-- Delete data and run vacuum (AO) +-1U: DELETE FROM ao_foo WHERE n > 5; +-1U: VACUUM; +-- Delete data and run vacuum (AOCO) +-1U: DELETE FROM aoco_foo WHERE n > 5; +-1U: VACUUM; + +-- 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 aoco_foo; + +-- Reset wal_level +!\retcode gpconfig -r wal_level --masteronly; +-- Reset max_wal_senders +!\retcode gpconfig -r max_wal_senders --masteronly; +-- Restart QD +!\retcode pg_ctl -l /dev/null -D $COORDINATOR_DATA_DIRECTORY restart -w -t 600 -m fast; diff --git a/src/test/singlenode_isolation2/sql/reader_waits_for_lock.sql b/src/test/singlenode_isolation2/sql/reader_waits_for_lock.sql new file mode 100644 index 00000000000..6a9ee3b460d --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reader_waits_for_lock.sql @@ -0,0 +1,57 @@ +-- This test validates that a reader process waits if lock is not +-- available. There used to be a bug where reader didn't wait even if +-- lock was held by some other session. + +-- 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; +1: create table reader_waits_for_lock_table(a int, b int) distributed by (a); +1: insert into reader_waits_for_lock_table select 1, 1; + +-- Aquire a conflicting lock in utility mode on seg0. +0U: BEGIN; +0U: LOCK reader_waits_for_lock_table IN ACCESS EXCLUSIVE MODE; +-- 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. +0U: show gp_session_id; +-- Run the same query involving at least one reader gang. It should +-- block this time. +1&: SELECT t1.* FROM reader_waits_for_lock_table t1 INNER JOIN reader_waits_for_lock_table t2 ON t1.b = t2.b; +-- At least one reader process from session 1 should be blocked on +-- AccessExclusiveLock held by 0U. That distinct is needed because +-- plans for above select query differ between Orca and planner. +-- Planner generates three slices such that the two reader backends +-- are blocked for the lock. Orca generates two slices such that the +-- reader and as well as the writer are blocked. We get two rows (due +-- to "mppwriter=false" predicate) with planner and one row with Orca. +0U: select check_readers_are_blocked(); +0U: select distinct relation::regclass, mode, query + 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; +0U: COMMIT; +1<: diff --git a/src/test/singlenode_isolation2/sql/reindex.sql b/src/test/singlenode_isolation2/sql/reindex.sql new file mode 100644 index 00000000000..9dbc68debf0 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex.sql @@ -0,0 +1,30 @@ +-- Dropping table while reindex database should not fail reindex +CREATE DATABASE reindexdb1 TEMPLATE template1; +-- halt reindex after scanning the pg_class and getting the relids +SELECT gp_inject_fault_infinite('reindex_db', 'suspend', 1); +1:@db_name reindexdb1: CREATE TABLE heap1(a INT, b INT); +1&:REINDEX DATABASE reindexdb1; +SELECT gp_wait_until_triggered_fault('reindex_db', 1, 1); +2:@db_name reindexdb1:DROP TABLE heap1; +SELECT gp_inject_fault('reindex_db', 'reset', 1); +-- reindex should complete fine +1<: +1q: +2q: + +-- Adding index after scanning indexes for relation to reindex should +-- not fail reindex +BEGIN; +CREATE TABLE reindex_index1(a int, b int); +CREATE INDEX reindex_index1_idx1 on reindex_index1 (b); +insert into reindex_index1 select i,i+1 from generate_series(1, 10)i; +COMMIT; +SELECT gp_inject_fault_infinite('reindex_relation', 'suspend', 1); +3&: REINDEX TABLE reindex_index1; +SELECT gp_wait_until_triggered_fault('reindex_relation', 1, 1); +-- create one more index +CREATE INDEX reindex_index1_idx2 on reindex_index1 (a); +SELECT gp_inject_fault('reindex_relation', 'reset', 1); +3<: + +DROP DATABASE reindexdb1; diff --git a/src/test/singlenode_isolation2/sql/reindex/abort_reindex.sql b/src/test/singlenode_isolation2/sql/reindex/abort_reindex.sql new file mode 100644 index 00000000000..d90de1f9109 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/abort_reindex.sql @@ -0,0 +1,23 @@ +DROP TABLE IF EXISTS reindex_abort_ao; + +CREATE TABLE reindex_abort_ao (a INT) WITH (appendonly=true, orientation=column); +insert into reindex_abort_ao select generate_series(1,1000); +create index idx_btree_reindex_abort_ao on reindex_abort_ao(a); + +-- start_ignore +drop table if exists reindex_abort_ao_old; +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'); +-- 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); +-- @Description Ensures that relnode for an index does not change if reindex command is aborted +-- + +1: BEGIN; +1: REINDEX index idx_btree_reindex_abort_ao; +1: ROLLBACK; +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_btree_reindex_abort_ao' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +3: SELECT 1 as relfilenode_didnot_change from pg_class pc, reindex_abort_ao_old re where pc.relname = 'idx_btree_reindex_abort_ao' and pc.relfilenode = re.c_relfilenode and pc.gp_segment_id = re.c_gp_segment_id; +3: SELECT * from reindex_abort_ao_old o where o.c_gp_segment_id > -1 and exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') g where relname = 'idx_btree_reindex_abort_ao' and o.c_oid = g.oid and o.c_gp_segment_id = g.gp_segment_id and o.c_relfilenode != g.relfilenode); diff --git a/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_heap_gist.sql b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_heap_gist.sql new file mode 100644 index 00000000000..470d7558c59 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_heap_gist.sql @@ -0,0 +1,49 @@ +DROP TABLE IF EXISTS reindex_heap_gist; + +CREATE TABLE reindex_heap_gist ( + 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 + ) ; + +insert into reindex_heap_gist (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 into reindex_heap_gist (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 ; + +create index idx_gist_reindex_heap on reindex_heap_gist USING Gist(target); + +-- Verify oid is same on all the segments +SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_gist_reindex_heap' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +-- @Description Ensures that a create index during reindex operations on GiST index is ok +-- + +DELETE FROM reindex_heap_gist WHERE id < 128; +1: BEGIN; +1: REINDEX index idx_gist_reindex_heap; +2: create index idx_gist_reindex_heap2 on reindex_heap_gist USING Gist(target); +1: COMMIT; +2: COMMIT; +3: SELECT COUNT(*) FROM reindex_heap_gist WHERE id = 1500; +3: select count(*) from reindex_heap_gist; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_heap_gist; + +3: insert into reindex_heap_gist (id, owner, description, property, poli, target) values(1500, 'gpadmin', 'Reindex Concurrency test', '((1500, 1500), (1560, 1580))', '( (111, 112), (114, 115), (110, 110) )', '( (96, 86), 96)' ); +3: SELECT COUNT(*) FROM reindex_heap_gist WHERE id = 1500; +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_gist_reindex_heap' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_gist_reindex_heap2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_ao_bitmap.sql b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_ao_bitmap.sql new file mode 100644 index 00000000000..a61fd054414 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_ao_bitmap.sql @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS reindex_crtab_ao_bitmap; + +CREATE TABLE reindex_crtab_ao_bitmap (a INT) WITH (appendonly=true); +insert into reindex_crtab_ao_bitmap select generate_series(1,1000); +insert into reindex_crtab_ao_bitmap select generate_series(1,1000); +create index idx_reindex_crtab_ao_bitmap on reindex_crtab_ao_bitmap USING bitmap(a); +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); + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_ao_bitmap WHERE a < 128; +1: BEGIN; +2: BEGIN; +1: REINDEX index idx_reindex_crtab_ao_bitmap; +2&: create index idx_reindex_crtab_ao_bitmap2 on reindex_crtab_ao_bitmap USING bitmap(a); +1: COMMIT; +2<: +2: 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); +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_ao_bitmap2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_ao_btree.sql b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_ao_btree.sql new file mode 100644 index 00000000000..8d5188b3c2d --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_ao_btree.sql @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS reindex_crtab_ao_btree; + +CREATE TABLE reindex_crtab_ao_btree (a INT) WITH (appendonly=true); +insert into reindex_crtab_ao_btree select generate_series(1,1000); +insert into reindex_crtab_ao_btree select generate_series(1,1000); +create index idx_reindex_crtab_ao_btree on reindex_crtab_ao_btree(a); +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); + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_ao_btree WHERE a < 128; +1: BEGIN; +2: BEGIN; +1: REINDEX index idx_reindex_crtab_ao_btree; +2&: create index idx_reindex_crtab_ao_btree2 on reindex_crtab_ao_btree(a); +1: COMMIT; +2<: +2: 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); +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_ao_btree2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_aoco_bitmap.sql b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_aoco_bitmap.sql new file mode 100644 index 00000000000..e6ad8c457a9 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_aoco_bitmap.sql @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS reindex_crtab_aoco_bitmap; + +CREATE TABLE reindex_crtab_aoco_bitmap (a INT) WITH (appendonly=true, orientation=column); +insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); +insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); +create index idx_reindex_crtab_aoco_bitmap on reindex_crtab_aoco_bitmap USING bitmap(a); +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); + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_aoco_bitmap WHERE a < 128; +1: BEGIN; +2: BEGIN; +1: REINDEX index idx_reindex_crtab_aoco_bitmap; +2&: create index idx_reindex_crtab_aoco_bitmap2 on reindex_crtab_aoco_bitmap USING bitmap(a); +1: COMMIT; +2<: +2: 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); +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_aoco_bitmap2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_aoco_btree.sql b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_aoco_btree.sql new file mode 100644 index 00000000000..17493387410 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_aoco_btree.sql @@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS reindex_crtab_aoco_btree; + +CREATE TABLE reindex_crtab_aoco_btree (a INT) WITH (appendonly=true, orientation=column); +insert into reindex_crtab_aoco_btree select generate_series(1,1000); +insert into reindex_crtab_aoco_btree select generate_series(1,1000); +create index idx_reindex_crtab_aoco_btree on reindex_crtab_aoco_btree(a); +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); + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_aoco_btree WHERE a < 128; +1: BEGIN; +2: BEGIN; +1: REINDEX index idx_reindex_crtab_aoco_btree; +2&: create index idx_reindex_crtab_aoco_btree2 on reindex_crtab_aoco_btree(a); +1: COMMIT; +2<: +2: 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); +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_aoco_btree2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_heap_bitmap.sql b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_heap_bitmap.sql new file mode 100644 index 00000000000..e9071aae43f --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_heap_bitmap.sql @@ -0,0 +1,20 @@ +DROP TABLE IF EXISTS reindex_crtab_heap_bitmap; + +CREATE TABLE reindex_crtab_heap_bitmap (a INT); +insert into reindex_crtab_heap_bitmap select generate_series(1,1000); +insert into reindex_crtab_heap_bitmap select generate_series(1,1000); +create index idx_reindex_crtab_heap_bitmap on reindex_crtab_heap_bitmap(a); +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); + +-- @Description Ensures that a create index during reindex operations is ok +-- + +DELETE FROM reindex_crtab_heap_bitmap WHERE a < 128; +1: BEGIN; +2: BEGIN; +1: REINDEX index idx_reindex_crtab_heap_bitmap; +2: create index idx_reindex_crtab_heap_bitmap2 on reindex_crtab_heap_bitmap(a); +1: COMMIT; +2: COMMIT; +3: 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); +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_heap_bitmap2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_heap_btree.sql b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_heap_btree.sql new file mode 100644 index 00000000000..d2d7bb39f88 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/createidx_while_reindex_idx_heap_btree.sql @@ -0,0 +1,20 @@ +DROP TABLE IF EXISTS reindex_crtab_heap_btree; + +CREATE TABLE reindex_crtab_heap_btree (a INT); +insert into reindex_crtab_heap_btree select generate_series(1,1000); +insert into reindex_crtab_heap_btree select generate_series(1,1000); +create index idx_reindex_crtab_heap_btree on reindex_crtab_heap_btree(a); +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); + +-- @Description Ensures that a create table during reindex operations is ok +-- + +DELETE FROM reindex_crtab_heap_btree WHERE a < 128; +1: BEGIN; +2: BEGIN; +1: REINDEX index idx_reindex_crtab_heap_btree; +2: create index idx_reindex_crtab_heap_btree2 on reindex_crtab_heap_btree(a); +1: COMMIT; +2: COMMIT; +3: 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); +3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_heap_btree2' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_ao_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_ao_part_btree.sql new file mode 100644 index 00000000000..15e64ce6f66 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_ao_part_btree.sql @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS reindex_crtabforadd_part_ao_btree; + +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 ); + +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 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 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 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; + +create index on reindex_crtabforadd_part_ao_btree(id); + +-- 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'; +-- 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); +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab add partition operations is ok +-- + +DELETE FROM reindex_crtabforadd_part_ao_btree WHERE id < 12; +1: BEGIN; +1: LOCK reindex_crtabforadd_part_ao_btree IN ACCESS EXCLUSIVE MODE; +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; +2<: +3<: +3: Insert into reindex_crtabforadd_part_ao_btree values(9,'2013-05-22',14.22); +3: select count(*) from reindex_crtabforadd_part_ao_btree where id = 29; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtabforadd_part_ao_btree where id = 29; + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforadd_part_ao_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_ao_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +3: select 1 AS oid_same_on_all_segs_partition_new_data from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_ao_btree_1_prt_p1' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +3: select 1 AS oid_same_on_all_segs_partition_new_idx from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_ao_btree_1_prt_p1_id_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_aoco_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_aoco_part_btree.sql new file mode 100644 index 00000000000..9bffb21cdd4 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_aoco_part_btree.sql @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS reindex_crtabforadd_part_aoco_btree; + +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 ); + +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 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 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 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; + +create index on reindex_crtabforadd_part_aoco_btree(id); + +-- 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'; +-- 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); +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab add partition operations is ok +-- + +DELETE FROM reindex_crtabforadd_part_aoco_btree WHERE id < 12; +1: BEGIN; +1: LOCK reindex_crtabforadd_part_aoco_btree IN ACCESS EXCLUSIVE MODE; +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; +2<: +3<: +3: Insert into reindex_crtabforadd_part_aoco_btree values(29,'2013-04-22',12.52); +3: select count(*) from reindex_crtabforadd_part_aoco_btree where id = 29; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtabforadd_part_aoco_btree where id = 29; + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforadd_part_aoco_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_aoco_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +3: select 1 AS oid_same_on_all_segs_partition_new_data from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_aoco_btree_1_prt_part_others' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +3: select 1 AS oid_same_on_all_segs_partition_new_idx from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_aoco_btree_1_prt_part_others_id_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_heap_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_heap_part_btree.sql new file mode 100644 index 00000000000..29adfe062b6 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_addpart_heap_part_btree.sql @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS reindex_crtabforadd_part_heap_btree; + +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 ); + +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 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 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 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; + +create index on reindex_crtabforadd_part_heap_btree(id); + +-- 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'; +-- 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); +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab add partition operations is ok +-- + +DELETE FROM reindex_crtabforadd_part_heap_btree WHERE id < 12; +1: BEGIN; +1: LOCK reindex_crtabforadd_part_heap_btree IN ACCESS EXCLUSIVE MODE; +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; +2<: +3<: +3: Insert into reindex_crtabforadd_part_heap_btree values(29,'2013-06-09',14.20); +3: select count(*) from reindex_crtabforadd_part_heap_btree where id = 29; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtabforadd_part_heap_btree where id = 29; + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforadd_part_heap_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_heap_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +3: select 1 AS oid_same_on_all_segs_partition_new_data from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_heap_btree_1_prt_new_p' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +3: select 1 AS oid_same_on_all_segs_partition_new_idx from gp_dist_random('pg_class') WHERE relname = 'reindex_crtabforadd_part_heap_btree_1_prt_new_p_id_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_ao_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_ao_part_btree.sql new file mode 100644 index 00000000000..b9226fe6157 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_ao_part_btree.sql @@ -0,0 +1,42 @@ +DROP TABLE IF EXISTS reindex_crtabforalter_part_ao_btree; + +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 ); + +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 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 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 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; + +create index on reindex_crtabforalter_part_ao_btree(id); + +-- 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'; +-- 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); +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab drop col operations is ok +-- + +DELETE FROM reindex_crtabforalter_part_ao_btree WHERE id < 12; +1: BEGIN; +1: LOCK reindex_crtabforalter_part_ao_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_crtabforalter_part_ao_btree; +3&: alter table reindex_crtabforalter_part_ao_btree drop column amt; +1: COMMIT; +2<: +3<: +3: select count(*) from reindex_crtabforalter_part_ao_btree where id = 29; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtabforalter_part_ao_btree where id = 29; + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforalter_part_ao_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_ao_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +3: select count(*) from pg_attribute where attname = 'amt' and attrelid = (select oid from pg_class where relname = 'reindex_crtabforalter_part_ao_btree'); diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_aoco_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_aoco_part_btree.sql new file mode 100644 index 00000000000..532228435ce --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_aoco_part_btree.sql @@ -0,0 +1,42 @@ +DROP TABLE IF EXISTS reindex_crtabforalter_part_aoco_btree; + +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 ); + +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 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 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 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; + +create index on reindex_crtabforalter_part_aoco_btree(id); + +-- 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'; +-- 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); +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab drop col operations is ok +-- + +DELETE FROM reindex_crtabforalter_part_aoco_btree WHERE id < 12; +1: BEGIN; +1: LOCK reindex_crtabforalter_part_aoco_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_crtabforalter_part_aoco_btree; +3&: alter table reindex_crtabforalter_part_aoco_btree drop column amt; +1: COMMIT; +2<: +3<: +3: select count(*) from reindex_crtabforalter_part_aoco_btree where id = 29; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtabforalter_part_aoco_btree where id = 29; + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforalter_part_aoco_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_aoco_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +3: select count(*) from pg_attribute where attname = 'amt' and attrelid = (select oid from pg_class where relname = 'reindex_crtabforalter_part_aoco_btree'); diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_heap_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_heap_part_btree.sql new file mode 100644 index 00000000000..ba885b9ff86 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_altertable_heap_part_btree.sql @@ -0,0 +1,42 @@ +DROP TABLE IF EXISTS reindex_crtabforalter_part_heap_btree; + +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 ); + +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 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 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 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; + +create index on reindex_crtabforalter_part_heap_btree(id); + +-- 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'; +-- 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); +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during alter tab drop col operations is ok +-- + +DELETE FROM reindex_crtabforalter_part_heap_btree WHERE id < 12; +1: BEGIN; +1: LOCK reindex_crtabforalter_part_heap_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_crtabforalter_part_heap_btree; +3&: alter table reindex_crtabforalter_part_heap_btree drop column amt; +1: COMMIT; +2<: +3<: +3: select count(*) from reindex_crtabforalter_part_heap_btree where id = 29; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtabforalter_part_heap_btree where id = 29; + +3: select c_relname, 1 as different_relfilenode from before_reindex_crtabforalter_part_heap_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_heap_btree%_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +3: select count(*) from pg_attribute where attname = 'amt' and attrelid = (select oid from pg_class where relname = 'reindex_crtabforalter_part_heap_btree'); diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_ao_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_ao_part_btree.sql new file mode 100644 index 00000000000..7a6a9762fa5 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_ao_part_btree.sql @@ -0,0 +1,33 @@ +CREATE TABLE reindex_dropindex_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 ); +insert into reindex_dropindex_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 into reindex_dropindex_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 ; +create index on reindex_dropindex_crtab_part_ao_btree(id); +create index on reindex_dropindex_crtab_part_ao_btree(owner); + +-- start_ignore +create table before_reindex_dropindex_crtab_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_dropindex_crtab_part_ao_btree%_id_idx'; +-- end_ignore + +select c_relname, 1 as have_same_number_of_rows from before_reindex_dropindex_crtab_part_ao_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); + +select 1 AS index_exists_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'reindex_dropindex_crtab_part_ao_btree_owner_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_dropindex_crtab_part_ao_btree WHERE id < 128; +1: BEGIN; +1: LOCK reindex_dropindex_crtab_part_ao_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_dropindex_crtab_part_ao_btree; +3&: DROP INDEX reindex_dropindex_crtab_part_ao_btree_owner_idx; +1: COMMIT; +2<: +3<: +3: select count(*) from reindex_dropindex_crtab_part_ao_btree where id = 998; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_dropindex_crtab_part_ao_btree where id = 999; + +3: select c_relname, 1 as different_relfilenode from before_reindex_dropindex_crtab_part_ao_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_dropindex_crtab_part_ao_btree%_id_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +-- expect only the index on parent table to be dropped; drop index will not drop indexes on child partitions +3: select 1-count(1) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'reindex_dropindex_crtab_part_ao_btree_owner_idx'; diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_aoco_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_aoco_part_btree.sql new file mode 100644 index 00000000000..ee69c35c099 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_aoco_part_btree.sql @@ -0,0 +1,34 @@ +CREATE TABLE reindex_dropindex_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 ); +insert into reindex_dropindex_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 into reindex_dropindex_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 ; +create index on reindex_dropindex_crtab_part_aoco_btree(id); +create index on reindex_dropindex_crtab_part_aoco_btree(owner); + +-- start_ignore +create table before_reindex_dropindex_crtab_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_dropindex_crtab_part_aoco_btree%_id_idx'; +-- end_ignore + +select c_relname, 1 as have_same_number_of_rows from before_reindex_dropindex_crtab_part_aoco_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); + +select 1 AS index_exists_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'reindex_dropindex_crtab_part_aoco_btree_owner_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_dropindex_crtab_part_aoco_btree WHERE id < 128; +1: BEGIN; +1: LOCK reindex_dropindex_crtab_part_aoco_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_dropindex_crtab_part_aoco_btree; +3&: DROP INDEX reindex_dropindex_crtab_part_aoco_btree_owner_idx; +1: COMMIT; +2<: +3<: +3: select count(*) from reindex_dropindex_crtab_part_aoco_btree where id = 998; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_dropindex_crtab_part_aoco_btree where id = 999; + +3: select c_relname, 1 as different_relfilenode from before_reindex_dropindex_crtab_part_aoco_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_dropindex_crtab_part_aoco_btree%_id_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +-- expect only the index on parent table to be dropped; drop index will not drop indexes on child partitions +3: select 1-count(1) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'reindex_dropindex_crtab_part_aoco_btree_owner_idx'; diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_heap_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_heap_part_btree.sql new file mode 100644 index 00000000000..5e8888d16a4 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_dropindex_heap_part_btree.sql @@ -0,0 +1,33 @@ +CREATE TABLE reindex_dropindex_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 ); +insert into reindex_dropindex_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 into reindex_dropindex_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 ; +create index on reindex_dropindex_crtab_part_heap_btree(id); +create index on reindex_dropindex_crtab_part_heap_btree(owner); + +-- start_ignore +create table before_reindex_dropindex_crtab_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_dropindex_crtab_part_heap_btree%_id_idx'; +-- end_ignore + +select c_relname, 1 as have_same_number_of_rows from before_reindex_dropindex_crtab_part_heap_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); + +select 1 AS index_exists_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'reindex_dropindex_crtab_part_heap_btree_owner_idx' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_dropindex_crtab_part_heap_btree WHERE id < 128; +1: BEGIN; +1: LOCK reindex_dropindex_crtab_part_heap_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_dropindex_crtab_part_heap_btree; +3&: DROP INDEX reindex_dropindex_crtab_part_heap_btree_owner_idx; +1: COMMIT; +2<: +3<: +3: select count(*) from reindex_dropindex_crtab_part_heap_btree where id = 998; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_dropindex_crtab_part_heap_btree where id = 999; + +3: select c_relname, 1 as different_relfilenode from before_reindex_dropindex_crtab_part_heap_btree b where exists (select oid, gp_segment_id, relfilenode from gp_dist_random('pg_class') where relname like 'reindex_dropindex_crtab_part_heap_btree%_id_idx' and b.c_oid = oid and b.c_gp_segment_id = gp_segment_id and b.c_relfilenode != relfilenode) group by b.c_oid, b.c_relname; + +-- expect only the index on parent table to be dropped; drop index will not drop indexes on child partitions +3: select 1-count(1) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'reindex_dropindex_crtab_part_heap_btree_owner_idx'; diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_ao_bitmap.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_ao_bitmap.sql new file mode 100644 index 00000000000..df21ceab49f --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_ao_bitmap.sql @@ -0,0 +1,50 @@ +DROP TABLE IF EXISTS reindex_crtab_ao_bitmap; + +CREATE TABLE reindex_crtab_ao_bitmap (a INT) WITH (appendonly=true); +insert into reindex_crtab_ao_bitmap select generate_series(1,1000); +insert into reindex_crtab_ao_bitmap select generate_series(1,1000); +create index idx_reindex_crtab_ao_bitmap on reindex_crtab_ao_bitmap USING BITMAP(a); +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_ao_bitmap WHERE a < 128; +1: 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'); +2: BEGIN; +1: REINDEX index idx_reindex_crtab_ao_bitmap; +2&: REINDEX TABLE reindex_crtab_ao_bitmap; +1: COMMIT; +2<: +-- Session 2 has not committed yet. Session 1 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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'); +-- Expect two distinct relfilenodes per segment in old_relfilenodes table. +1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; +2: 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'); +-- Expect three distinct relfilenodes per segment in old_relfilenodes table. +1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + +3: select count(*) from reindex_crtab_ao_bitmap where a = 1000; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtab_ao_bitmap where a = 1000; diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_ao_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_ao_part_btree.sql new file mode 100644 index 00000000000..c8fefdc7adb --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_ao_part_btree.sql @@ -0,0 +1,53 @@ +DROP TABLE IF EXISTS reindex_crtab_part_ao_btree; + +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 ); +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 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 ; +create index on reindex_crtab_part_ao_btree(id); +-- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_part_ao_btree WHERE id < 128; +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'); +1: BEGIN; +1: LOCK reindex_crtab_part_ao_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_crtab_part_ao_btree; +3:BEGIN; +3&: reindex index reindex_crtab_part_ao_btree_1_prt_de_fault_id_idx; +1: COMMIT; +3<: +-- Session 2 has not committed yet. Session 3 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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'); +-- Expect two distinct relfilenodes for one segment in old_relfilenodes table. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; +3: COMMIT; +-- After session 3 commits, session 2 could complete, the relfilenode it assigned to the +-- "1_prt_de_fault" index is visible to session 3. +2<: +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'); +-- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + +3: select count(*) from reindex_crtab_part_ao_btree where id = 998; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtab_part_ao_btree where id = 999; diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_aoco_bitmap.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_aoco_bitmap.sql new file mode 100644 index 00000000000..2635787e498 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_aoco_bitmap.sql @@ -0,0 +1,50 @@ +DROP TABLE IF EXISTS reindex_crtab_aoco_bitmap; + +CREATE TABLE reindex_crtab_aoco_bitmap (a INT) WITH (appendonly=true, orientation=column); +insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); +insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); +create index idx_reindex_crtab_aoco_bitmap on reindex_crtab_aoco_bitmap USING BITMAP(a); +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_aoco_bitmap WHERE a < 128; +1: 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'); +2: BEGIN; +1: REINDEX index idx_reindex_crtab_aoco_bitmap; +2&: REINDEX TABLE reindex_crtab_aoco_bitmap; +1: COMMIT; +2<: +-- Session 2 has not committed yet. Session 1 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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'); +-- Expect two distinct relfilenodes per segment in old_relfilenodes table. +1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; +2: 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'); +-- Expect three distinct relfilenodes per segment in old_relfilenodes table. +1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + +3: select count(*) from reindex_crtab_aoco_bitmap where a = 1000; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtab_aoco_bitmap where a = 1000; diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_aoco_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_aoco_part_btree.sql new file mode 100644 index 00000000000..c4e54482cd6 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_aoco_part_btree.sql @@ -0,0 +1,53 @@ +DROP TABLE IF EXISTS reindex_crtab_part_aoco_btree; + +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 ); +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 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 ; +create index on reindex_crtab_part_aoco_btree(id); +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_part_aoco_btree WHERE id < 128; +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'); +1: BEGIN; +1: LOCK reindex_crtab_part_aoco_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_crtab_part_aoco_btree; +3: BEGIN; +3&: reindex index reindex_crtab_part_aoco_btree_1_prt_de_fault_id_idx; +1: COMMIT; +3<: +-- Session 2 has not committed yet. Session 3 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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'); +-- Expect two distinct relfilenodes for one segment in old_relfilenodes table. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; +3: COMMIT; +-- After session 3 commits, session 2 could complete, the relfilenode it assigned to the +-- "1_prt_de_fault" index is visible to session 3. +2<: +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'); +-- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + +3: select count(*) from reindex_crtab_part_aoco_btree where id = 998; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtab_part_aoco_btree where id = 999; + diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_heap_bitmap.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_heap_bitmap.sql new file mode 100644 index 00000000000..5305fc0dd50 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_heap_bitmap.sql @@ -0,0 +1,50 @@ +DROP TABLE IF EXISTS reindex_crtab_heap_bitmap; + +CREATE TABLE reindex_crtab_heap_bitmap (a INT); +insert into reindex_crtab_heap_bitmap select generate_series(1,1000); +insert into reindex_crtab_heap_bitmap select generate_series(1,1000); +create index idx_reindex_crtab_heap_bitmap on reindex_crtab_heap_bitmap USING BITMAP(a); +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_heap_bitmap WHERE a < 128; +1: 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'); +2: BEGIN; +1: REINDEX index idx_reindex_crtab_heap_bitmap; +2&: REINDEX TABLE reindex_crtab_heap_bitmap; +1: COMMIT; +2<: +-- Session 2 has not committed yet. Session 1 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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'); +-- Expect two distinct relfilenodes per segment in old_relfilenodes table. +1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; +2: 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'); +-- Expect three distinct relfilenodes per segment in old_relfilenodes table. +1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + +3: select count(*) from reindex_crtab_heap_bitmap where a = 1000; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtab_heap_bitmap where a = 1000; diff --git a/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_heap_part_btree.sql b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_heap_part_btree.sql new file mode 100644 index 00000000000..165ea0bc9d8 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/reindextable_while_reindex_idx_heap_part_btree.sql @@ -0,0 +1,52 @@ +DROP TABLE IF EXISTS reindex_crtab_part_heap_btree; + +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 ); +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 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 ; +create index on reindex_crtab_part_heap_btree(id); +-- @Description Ensures that a reindex table during reindex index operations is ok +-- + +DELETE FROM reindex_crtab_part_heap_btree WHERE id < 128; +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'); +1: BEGIN; +1: LOCK reindex_crtab_part_heap_btree IN ACCESS EXCLUSIVE MODE; +2&: REINDEX TABLE reindex_crtab_part_heap_btree; +3: BEGIN; +3&: reindex index reindex_crtab_part_heap_btree_1_prt_de_fault_id_idx; +1: COMMIT; +3<: +-- Session 2 has not committed yet. Session 3 should see effects of +-- its own reindex command above in pg_class. The following query +-- 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'); +-- Expect two distinct relfilenodes for one segment in old_relfilenodes table. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; +3: COMMIT; +-- After session 3 commits, session 2 could complete, the relfilenode it assigned to the +-- "1_prt_de_fault" index is visible to session 3. +2<: +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'); +-- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. +3: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; + +3: select count(*) from reindex_crtab_part_heap_btree where id = 998; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_crtab_part_heap_btree where id = 999; diff --git a/src/test/singlenode_isolation2/sql/reindex/repeatable_read_reindex_with_insert_heap.sql b/src/test/singlenode_isolation2/sql/reindex/repeatable_read_reindex_with_insert_heap.sql new file mode 100644 index 00000000000..5b8df7c0d30 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/repeatable_read_reindex_with_insert_heap.sql @@ -0,0 +1,28 @@ +DROP TABLE IF EXISTS reindex_serialize_tab_heap; + +CREATE TABLE reindex_serialize_tab_heap (a INT, b text, c date, d numeric, e bigint, f char(10), g float) distributed by (a); +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; +create index idxa_reindex_serialize_tab_heap on reindex_serialize_tab_heap(a); +create index idxb_reindex_serialize_tab_heap on reindex_serialize_tab_heap(b); +create index idxc_reindex_serialize_tab_heap on reindex_serialize_tab_heap(c); +create index idxd_reindex_serialize_tab_heap on reindex_serialize_tab_heap(d); +create index idxe_reindex_serialize_tab_heap on reindex_serialize_tab_heap(e); +create index idxf_reindex_serialize_tab_heap on reindex_serialize_tab_heap(f); +create index idxg_reindex_serialize_tab_heap on reindex_serialize_tab_heap(g); +-- start_ignore +SET gp_create_table_random_default_distribution=off; +-- end_ignore +1: BEGIN; +1: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; +1: select 'dummy select to establish snapshot'; +2: BEGIN; +2: insert into reindex_serialize_tab_heap values(99,'green',now(),10,15.10); +2: COMMIT; +1: select a,b,d,e,f,g from reindex_serialize_tab_heap order by 1; +1: select a,b,d,e,f,g from reindex_serialize_tab_heap where a = 99; +1: reindex table reindex_serialize_tab_heap; +1: COMMIT; +4: select a,b,d,e,f,g from reindex_serialize_tab_heap where a = 99; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select a,b,d,e,f,g from reindex_serialize_tab_heap where a = 99; diff --git a/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_column_heap.sql b/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_column_heap.sql new file mode 100644 index 00000000000..672b4c80547 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_column_heap.sql @@ -0,0 +1,54 @@ +DROP TABLE IF EXISTS reindex_serialize_tab_heap; + +CREATE TABLE reindex_serialize_tab_heap (a INT, b text, c date, d numeric, e bigint, f char(10), g float) distributed by (a); +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 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 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 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; +create index idxa_reindex_serialize_tab_heap on reindex_serialize_tab_heap(a); +create index idxb_reindex_serialize_tab_heap on reindex_serialize_tab_heap(b); +create index idxc_reindex_serialize_tab_heap on reindex_serialize_tab_heap(c); +create index idxd_reindex_serialize_tab_heap on reindex_serialize_tab_heap(d); +create index idxe_reindex_serialize_tab_heap on reindex_serialize_tab_heap(e); +create index idxf_reindex_serialize_tab_heap on reindex_serialize_tab_heap(f); +create index idxg_reindex_serialize_tab_heap on reindex_serialize_tab_heap(g); +-- start_ignore +SET gp_create_table_random_default_distribution=off; +-- end_ignore +1: BEGIN; +2: BEGIN; +2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +2: select 'dummy select to establish snapshot'; +1: alter table reindex_serialize_tab_heap drop column c; +1: 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'); +2: reindex table reindex_serialize_tab_heap; +2: COMMIT; +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +2: select oldrels.* from old_relfilenodes oldrels join + (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') + where relname like 'idx%_reindex_serialize_tab_heap' + union all + select gp_segment_id as dbid, relfilenode, relname from pg_class + where relname like 'idx%_reindex_serialize_tab_heap') newrels + on oldrels.relfilenode = newrels.relfilenode + and oldrels.dbid = newrels.dbid + and oldrels.relname = newrels.relname; +3: select count(*) from reindex_serialize_tab_heap where a = 1; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_serialize_tab_heap where a = 1; + +-- expect index to be dropped +3: select 1-count(*) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'idxi_reindex_serialize_tab_heap'; + +-- expect column to be dropped +3: select 1-count(*) as attribute_dropped from (select * from pg_attribute union all select * from gp_dist_random('pg_attribute')) t where t.attrelid = 'reindex_serialize_tab_heap'::regclass and t.attname = 'c'; diff --git a/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_index_ao.sql b/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_index_ao.sql new file mode 100644 index 00000000000..ecc37782dbd --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_index_ao.sql @@ -0,0 +1,51 @@ +DROP TABLE IF EXISTS reindex_serialize_tab_ao; + +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); +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 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 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 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; +create index idxa_reindex_serialize_tab_ao on reindex_serialize_tab_ao(a); +create index idxb_reindex_serialize_tab_ao on reindex_serialize_tab_ao(b); +create index idxc_reindex_serialize_tab_ao on reindex_serialize_tab_ao(c); +create index idxd_reindex_serialize_tab_ao on reindex_serialize_tab_ao(d); +create index idxe_reindex_serialize_tab_ao on reindex_serialize_tab_ao(e); +create index idxf_reindex_serialize_tab_ao on reindex_serialize_tab_ao(f); +create index idxg_reindex_serialize_tab_ao on reindex_serialize_tab_ao(g); +-- start_ignore +SET gp_create_table_random_default_distribution=off; +-- end_ignore +1: BEGIN; +2: BEGIN; +2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +2: select 'dummy select to establish snapshot'; +1: drop index idxg_reindex_serialize_tab_ao; +1: 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'); +2: reindex table reindex_serialize_tab_ao; +2: COMMIT; +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +2: select oldrels.* from old_ao_relfilenodes oldrels join + (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') + where relname like 'idx%_reindex_serialize_tab_ao' + union all + select gp_segment_id as dbid, relfilenode, relname from pg_class + where relname like 'idx%_reindex_serialize_tab_ao') newrels + on oldrels.relfilenode = newrels.relfilenode + and oldrels.dbid = newrels.dbid + and oldrels.relname = newrels.relname; +3: select count(*) from reindex_serialize_tab_ao where a = 1; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_serialize_tab_ao where a = 1; + +-- expect index to be dropped +3: select 1-count(*) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'idxg_reindex_serialize_tab_ao'; diff --git a/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_index_heap.sql b/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_index_heap.sql new file mode 100644 index 00000000000..521b9b5f574 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/serializable_reindex_with_drop_index_heap.sql @@ -0,0 +1,50 @@ +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); +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 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 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 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; +create index idxa_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(a); +create index idxb_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(b); +create index idxc_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(c); +create index idxd_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(d); +create index idxe_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(e); +create index idxf_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(f); +create index idxg_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(g); +-- start_ignore +SET gp_create_table_random_default_distribution=off; +-- end_ignore +1: BEGIN; +2: BEGIN; +2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +2: select 'dummy select to establish snapshot'; +1: drop index idxg_reindex_dropindex_serialize_tab_heap; +1: 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'); +2: reindex table reindex_dropindex_serialize_tab_heap; +2: COMMIT; +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +2: select oldrels.* from old_heap_relfilenodes oldrels join + (select gp_segment_id as dbid, relfilenode, 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, relname from pg_class + where relname like 'idx%_reindex_dropindex_serialize_tab_heap') newrels + on oldrels.relfilenode = newrels.relfilenode + and oldrels.dbid = newrels.dbid + and oldrels.relname = newrels.relname; + +3: select count(*) from reindex_dropindex_serialize_tab_heap where a = 1; +3: set enable_seqscan=false; +3: set enable_indexscan=true; +3: select count(*) from reindex_dropindex_serialize_tab_heap where a = 1; + +-- expect index to be dropped +3: select 1-count(*) as index_dropped from (select * from pg_class union all select * from gp_dist_random('pg_class')) t where t.relname = 'idxg_reindex_dropindex_serialize_tab_heap'; diff --git a/src/test/singlenode_isolation2/sql/reindex/vacuum_analyze_while_reindex_ao_btree.sql b/src/test/singlenode_isolation2/sql/reindex/vacuum_analyze_while_reindex_ao_btree.sql new file mode 100644 index 00000000000..282cafb66f3 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/vacuum_analyze_while_reindex_ao_btree.sql @@ -0,0 +1,42 @@ +DROP TABLE IF EXISTS reindex_ao; + +CREATE TABLE reindex_ao (a INT) WITH (appendonly=true); +insert into reindex_ao select generate_series(1,1000); +analyze reindex_ao; +select 1 as reltuples_same_as_count from pg_class where relname = 'reindex_ao' and reltuples = (select count(*) from reindex_ao); +insert into reindex_ao select generate_series(1,1000); +select 1 as reltuples_same_as_count from pg_class where relname = 'reindex_ao' and reltuples = (select count(*) from reindex_ao); +create index idx_btree_reindex_vacuum_analyze_ao on reindex_ao(a); +-- @Description Ensures that a vacuum during reindex operations is ok +-- + +DELETE FROM reindex_ao WHERE a < 128; +1: 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'); +1: REINDEX index idx_btree_reindex_vacuum_analyze_ao; +2&: VACUUM ANALYZE reindex_ao; +1: COMMIT; +2<: +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +1: select oldrels.* from old_relfilenodes oldrels join + (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') + where relname = 'idx_btree_reindex_vacuum_analyze_ao' + union all + select gp_segment_id as dbid, relfilenode, relname from pg_class + where relname = 'idx_btree_reindex_vacuum_analyze_ao') newrels + on oldrels.relfilenode = newrels.relfilenode + and oldrels.dbid = newrels.dbid + and oldrels.relname = newrels.relname; +2: COMMIT; +3: SELECT COUNT(*) FROM reindex_ao WHERE a = 1500; + +3: SELECT 1 as reltuples_same_as_count from pg_class where relname = 'reindex_ao' and reltuples = (SELECT count(*) from reindex_ao); +3: INSERT INTO reindex_ao VALUES (0); diff --git a/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_ao_bitmap.sql b/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_ao_bitmap.sql new file mode 100644 index 00000000000..acb88b68db9 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_ao_bitmap.sql @@ -0,0 +1,37 @@ +DROP TABLE IF EXISTS reindex_ao; + +CREATE TABLE reindex_ao (a INT) WITH (appendonly=true); +insert into reindex_ao select generate_series(1,1000); +insert into reindex_ao select generate_series(1,1000); +create index idx_bitmap_reindex_ao on reindex_ao USING bitmap(a); +-- @Description Ensures that a vacuum during reindex operations is ok +-- + +DELETE FROM reindex_ao WHERE a < 128; +1: 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'); +1: REINDEX index idx_bitmap_reindex_ao; +2&: VACUUM reindex_ao; +1: COMMIT; +2<: +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +1: select oldrels.* from old_relfilenodes oldrels join + (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') + where relname = 'idx_bitmap_reindex_ao' + union all + select gp_segment_id as dbid, relfilenode, relname from pg_class + where relname = 'idx_bitmap_reindex_ao') newrels + on oldrels.relfilenode = newrels.relfilenode + and oldrels.dbid = newrels.dbid + and oldrels.relname = newrels.relname; +2: COMMIT; +3: SELECT COUNT(*) FROM reindex_ao WHERE a = 1500; +3: INSERT INTO reindex_ao VALUES (0); diff --git a/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_heap_btree.sql b/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_heap_btree.sql new file mode 100644 index 00000000000..ecf0a4fbc90 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_heap_btree.sql @@ -0,0 +1,37 @@ +DROP TABLE IF EXISTS reindex_heap; + +CREATE TABLE reindex_heap (a INT); +insert into reindex_heap select generate_series(1,1000); +insert into reindex_heap select generate_series(1,1000); +create index idx_btree_reindex_heap on reindex_heap(a); +-- @Description Ensures that a vacuum during reindex operations is ok +-- + +DELETE FROM reindex_heap WHERE a < 128; +1: 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'); +1: REINDEX index idx_btree_reindex_heap; +2&: VACUUM reindex_heap; +1: COMMIT; +2<: +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +1: select oldrels.* from old_relfilenodes oldrels join + (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') + where relname = 'idx_btree_reindex_heap' + union all + select gp_segment_id as dbid, relfilenode, relname from pg_class + where relname = 'idx_btree_reindex_heap') newrels + on oldrels.relfilenode = newrels.relfilenode + and oldrels.dbid = newrels.dbid + and oldrels.relname = newrels.relname; +2: COMMIT; +3: SELECT COUNT(*) FROM reindex_heap WHERE a = 1500; +3: INSERT INTO reindex_heap VALUES (0); diff --git a/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_heap_btree_toast.sql b/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_heap_btree_toast.sql new file mode 100644 index 00000000000..8380fced0c3 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex/vacuum_while_reindex_heap_btree_toast.sql @@ -0,0 +1,37 @@ +DROP TABLE IF EXISTS reindex_toast_heap; + +CREATE TABLE reindex_toast_heap (a text, b int); +alter table reindex_toast_heap alter column a set storage external; +insert into reindex_toast_heap select repeat('123456789',10000), i from generate_series(1,100) i; +create index idx_btree_reindex_toast_heap on reindex_toast_heap(b); +-- @Description Ensures that a vacuum during reindex operations is ok +-- + +DELETE FROM reindex_toast_heap WHERE b % 4 = 0 ; +1: 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'); +1: REINDEX index idx_btree_reindex_toast_heap; +2&: VACUUM reindex_toast_heap; +1: COMMIT; +2<: +-- Validate that reindex changed all index relfilenodes on master as well as +-- segments. The following query should return 0 tuples. +1: select oldrels.* from old_relfilenodes oldrels join + (select gp_segment_id as dbid, relfilenode, relname from gp_dist_random('pg_class') + where relname = 'idx_btree_reindex_toast_heap' + union all + select gp_segment_id as dbid, relfilenode, relname from pg_class + where relname = 'idx_btree_reindex_toast_heap') newrels + on oldrels.relfilenode = newrels.relfilenode + and oldrels.dbid = newrels.dbid + and oldrels.relname = newrels.relname; +2: COMMIT; +3: SELECT COUNT(*) FROM reindex_toast_heap WHERE a = '1500'; +3: INSERT INTO reindex_toast_heap VALUES (0); diff --git a/src/test/singlenode_isolation2/sql/reindex_gpfastsequence.sql b/src/test/singlenode_isolation2/sql/reindex_gpfastsequence.sql new file mode 100644 index 00000000000..a58d4278a8f --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reindex_gpfastsequence.sql @@ -0,0 +1,37 @@ +-- 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 index test_fastseqence_idx on test_fastseqence(b); +insert into test_fastseqence select i , 'aa'||i from generate_series(1,100) i; + +select gp_inject_fault_infinite('reindex_relation', 'suspend', 1); + +-- The reindex_relation fault should be hit +1&: reindex table gp_fastsequence; +2: select gp_wait_until_triggered_fault('reindex_relation', 1, 1); +-- The insert should for reindex in session 1 +2&: insert into test_fastseqence select i , 'aa'||i from generate_series(1,100) i; + +select gp_inject_fault('reindex_relation', 'reset', 1); + +1<: +2<: + +-- 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); + +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')); + +insert into test_fastseqence select i , 'aa'||i from generate_series(1,100) i; + +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')); + +-- Final validation should be performed by gpcheckcat, which runs at +-- the end of ICW in CI. diff --git a/src/test/singlenode_isolation2/sql/reorganize_after_ao_vacuum_skip_drop.sql b/src/test/singlenode_isolation2/sql/reorganize_after_ao_vacuum_skip_drop.sql new file mode 100644 index 00000000000..5af338e6c5a --- /dev/null +++ b/src/test/singlenode_isolation2/sql/reorganize_after_ao_vacuum_skip_drop.sql @@ -0,0 +1,29 @@ +-- Ensure segfiles in AOSEG_STATE_AWAITING_DROP are not leaked in +-- AppendOnlyHash after doing an AT_SetDistributedBy operation which +-- rewrites the relation differently than other ALTER operations. + +CREATE TABLE reorganize_after_ao_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true); +INSERT INTO reorganize_after_ao_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; + +DELETE FROM reorganize_after_ao_vacuum_skip_drop; + +-- We should see all aosegs in state 1 +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); + +-- VACUUM while another session holds lock +1: BEGIN; +1: SELECT COUNT(*) FROM reorganize_after_ao_vacuum_skip_drop; +2: VACUUM reorganize_after_ao_vacuum_skip_drop; +1: END; + +-- 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'); + +-- The AO relation should be rewritten and AppendOnlyHash entry invalidated +1: ALTER TABLE reorganize_after_ao_vacuum_skip_drop SET WITH (reorganize=true); +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); + +-- 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; +0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); diff --git a/src/test/singlenode_isolation2/sql/resgroup/.gitignore b/src/test/singlenode_isolation2/sql/resgroup/.gitignore new file mode 100644 index 00000000000..b9ca196e52b --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/.gitignore @@ -0,0 +1,2 @@ +resgroup_memory_runaway.sql +resgroup_move_query.sql diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_alter_concurrency.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_alter_concurrency.sql new file mode 100644 index 00000000000..0a3c01e2afe --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_alter_concurrency.sql @@ -0,0 +1,405 @@ +-- create a resource group when gp_resource_manager is queue +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore +CREATE RESOURCE GROUP rg_concurrency_test WITH +(concurrency=1, cpu_rate_limit=20, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=10); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; + +-- 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 <> ''; + +-- +-- 1. increase concurrency after pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; + +11:SET ROLE role_concurrency_test; +11:BEGIN; + +21:SET ROLE role_concurrency_test; +22:SET ROLE role_concurrency_test; +21&:BEGIN; +22&:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; + +SELECT * FROM rg_activity_status; + +11:END; +11q: +21<: +22<: + +SELECT * FROM rg_activity_status; + +21:END; +22:END; +21q: +22q: + +SELECT * FROM rg_activity_status; + +-- +-- 2. increase concurrency before pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; + +11:SET ROLE role_concurrency_test; +11:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; + +21:SET ROLE role_concurrency_test; +22:SET ROLE role_concurrency_test; +21&:BEGIN; +22&:BEGIN; + +SELECT * FROM rg_activity_status; + +11:END; +11q: +21<: +22<: + +SELECT * FROM rg_activity_status; + +21:END; +22:END; +21q: +22q: + +SELECT * FROM rg_activity_status; + +-- +-- 3. increase both concurrency & memory_shared_quota after pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 60; + +11:SET ROLE role_concurrency_test; +11:BEGIN; + +21:SET ROLE role_concurrency_test; +22:SET ROLE role_concurrency_test; +21&:BEGIN; +22&:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; + +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 20; + +21<: + +SELECT * FROM rg_activity_status; + +11:END; +11q: +22<: + +SELECT * FROM rg_activity_status; + +21:END; +22:END; +21q: +22q: + +SELECT * FROM rg_activity_status; + +-- +-- 4. increase both concurrency & memory_shared_quota before pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 60; + +11:SET ROLE role_concurrency_test; +11:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 20; + +21:SET ROLE role_concurrency_test; +22:SET ROLE role_concurrency_test; +21:BEGIN; +22&:BEGIN; + +SELECT * FROM rg_activity_status; + +11:END; +11q: +22<: + +SELECT * FROM rg_activity_status; + +21:END; +22:END; +21q: +22q: + +SELECT * FROM rg_activity_status; + +-- +-- 5. increase both concurrency & memory_limit after pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 0; +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 30; + +-- proc 11 gets a quota of 30/1=30 +11:SET ROLE role_concurrency_test; +11:BEGIN; + +21:SET ROLE role_concurrency_test; +22:SET ROLE role_concurrency_test; +21&:BEGIN; +22&:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +-- now a new query needs a quota of 30/2=15 to run, +-- there is no free quota at the moment, so 21 & 22 are still pending +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 50; +-- now a new query needs a quota of 50/2=25 to run, +-- but there is only 50-30=20 free quota, so 21 & 22 are still pending +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 60; +-- now a new query needs a quota of 60/2=30 to run, +-- and there is 60-30=30 free quota, so 21 gets executed and 22 is still pending + +21<: + +SELECT * FROM rg_activity_status; + +11:END; +-- 11 releases its quota, so there is now 30 free quota, +-- so 22 gets executed +11q: +22<: + +SELECT * FROM rg_activity_status; + +21:END; +22:END; +21q: +22q: + +SELECT * FROM rg_activity_status; + +-- +-- 6. increase both concurrency & memory_limit before pending queries +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 0; +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 30; + +-- proc 11 gets a quota of 30/1=30 +11:SET ROLE role_concurrency_test; +11:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +-- now a new query needs a quota of 30/2=15 to run, +-- there is no free quota at the moment +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 60; +-- now a new query needs a quota of 60/2=30 to run, +-- and there is 60-30=30 free quota, +-- so one new query can get executed immediately + +21:SET ROLE role_concurrency_test; +22:SET ROLE role_concurrency_test; +21:BEGIN; +-- proc 21 gets executed, there is no free quota now, +-- so proc 22 is pending +22&:BEGIN; + +SELECT * FROM rg_activity_status; + +11:END; +-- 11 releases its quota, so there is now 30 free quota, +-- so 22 gets executed +11q: +22<: + +SELECT * FROM rg_activity_status; + +21:END; +22:END; +21q: +22q: + +SELECT * FROM rg_activity_status; + +-- +-- 7. decrease concurrency +-- +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_LIMIT 50; +ALTER RESOURCE GROUP rg_concurrency_test SET MEMORY_SHARED_QUOTA 0; +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 10; +11:SET ROLE role_concurrency_test; +11:BEGIN; + +12:SET ROLE role_concurrency_test; +12:BEGIN; + +13:SET ROLE role_concurrency_test; +13:BEGIN; + +14:SET ROLE role_concurrency_test; +14:BEGIN; + +15:SET ROLE role_concurrency_test; +15:BEGIN; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; + +11q: +12q: +13q: +14q: +15q: +-- start_ignore +-- The 'q' command returns before the underlying segments all actually quit, +-- so a following DROP command might fail. Add a delay here as a workaround. +SELECT pg_sleep(1); +-- end_ignore + +-- +-- 8. increase concurrency from 0 +-- +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; +CREATE RESOURCE GROUP rg_concurrency_test WITH +(concurrency=0, cpu_rate_limit=20, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=10); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; + +11:SET ROLE role_concurrency_test; +11&:BEGIN; +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; + +11<: +SELECT * FROM rg_activity_status; + +11:END; +11q: + +-- +-- 9.1 decrease concurrency to 0, +-- without running queries, +-- without pending queries. +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; +SELECT * FROM rg_activity_status; + +-- +-- 9.2 decrease concurrency to 0, +-- with running queries, +-- without pending queries. +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +SELECT * FROM rg_activity_status; + +11:SET ROLE role_concurrency_test; +11:BEGIN; +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; +SELECT * FROM rg_activity_status; + +11:END; +11q: + +-- +-- 9.3 decrease concurrency to 0, +-- with running queries, +-- with pending queries. +-- + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; +SELECT * FROM rg_activity_status; + +11:SET ROLE role_concurrency_test; +11:BEGIN; +12:SET ROLE role_concurrency_test; +12&:BEGIN; +SELECT * FROM rg_activity_status; + +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; +SELECT * FROM rg_activity_status; + +11:END; +11q: +SELECT * FROM rg_activity_status; + +SELECT pg_cancel_backend(pid) FROM pg_stat_activity +WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; +12<: +12q: +SELECT * FROM rg_activity_status; + +-- 10: drop a resgroup with concurrency=0 and pending queries +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +61:SET ROLE role_concurrency_test; +61&:BEGIN; + +ALTER ROLE role_concurrency_test RESOURCE GROUP none; +DROP RESOURCE GROUP rg_concurrency_test; + +61<: +61:END; +61q: + +-- 11: drop a role with concurrency=0 and pending queries +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +61:SET ROLE role_concurrency_test; +61&:BEGIN; + +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +61<: +61q: + +-- cleanup +-- start_ignore +DROP VIEW rg_activity_status; +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_alter_memory_spill_ratio.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_alter_memory_spill_ratio.sql new file mode 100644 index 00000000000..cd86cbccc80 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_alter_memory_spill_ratio.sql @@ -0,0 +1,39 @@ +-- start_ignore +DROP RESOURCE GROUP rg_spill_test; +-- end_ignore +CREATE RESOURCE GROUP rg_spill_test WITH +(concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=20, memory_spill_ratio=10); + +CREATE OR REPLACE VIEW rg_spill_status AS + SELECT groupname, memory_shared_quota, memory_spill_ratio + FROM gp_toolkit.gp_resgroup_config + WHERE groupname='rg_spill_test'; + +-- ALTER MEMORY_SPILL_RATIO + +SELECT * FROM rg_spill_status; + +-- positive +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 20; +SELECT * FROM rg_spill_status; + +-- positive, memory_spill_ratio range is [0, 100] +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 0; +SELECT * FROM rg_spill_status; + +-- positive: no limit on the sum of shared and spill +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 81; +SELECT * FROM rg_spill_status; + +-- negative: memory_spill_ratio is invalid +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 20.0; +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO a; +SELECT * FROM rg_spill_status; + +-- negative: memory_spill_ratio is larger than RESGROUP_MAX_MEMORY_SPILL_RATIO +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 101; +SELECT * FROM rg_spill_status; + +-- cleanup +DROP VIEW rg_spill_status; +DROP RESOURCE GROUP rg_spill_test; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_assign_slot_fail.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_assign_slot_fail.sql new file mode 100644 index 00000000000..bf25e6c2ab2 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_assign_slot_fail.sql @@ -0,0 +1,27 @@ +-- If the function AssignResGroupOnMaster() fails after getting a slot, +-- test the slot will be unassigned correctly. + +DROP ROLE IF EXISTS role_test; +-- start_ignore +DROP RESOURCE GROUP rg_test; +-- end_ignore +CREATE RESOURCE GROUP rg_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=10); +CREATE ROLE role_test RESOURCE GROUP rg_test; + +1: SET ROLE role_test; +1: BEGIN; +2: SET ROLE role_test; +-- start_ignore +SELECT gp_inject_fault('resgroup_assigned_on_master', 'reset', 1); +SELECT gp_inject_fault('resgroup_assigned_on_master', 'error', 1); +-- end_ignore +2: BEGIN; +2: BEGIN; +1: END; +2: END; +1q: +2q: + +--clean up +DROP ROLE role_test; +DROP RESOURCE GROUP rg_test; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_bypass_memory_limit.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_bypass_memory_limit.sql new file mode 100644 index 00000000000..15eac23c04e --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_bypass_memory_limit.sql @@ -0,0 +1,482 @@ +-- +-- set timezone will accumulate the memory usage in session. +-- here is used to test bypass memory limit is query level instead of session level. +-- +SET TIMEZONE TO 'Japan'; +SET TIMEZONE TO 'Portugal'; +SET TIMEZONE TO 'Canada/Eastern'; +SET TIMEZONE TO 'Canada/Central'; +SET TIMEZONE TO 'Canada/Newfoundland'; +SET TIMEZONE TO 'Canada/Mountain'; +SET TIMEZONE TO 'Canada/Saskatchewan'; +SET TIMEZONE TO 'Canada/Yukon'; +SET TIMEZONE TO 'Canada/Pacific'; +SET TIMEZONE TO 'Canada/Atlantic'; +SET TIMEZONE TO 'CET'; +SET TIMEZONE TO 'ROK'; +SET TIMEZONE TO 'Arctic/Longyearbyen'; +SET TIMEZONE TO 'PRC'; +SET TIMEZONE TO 'GMT-0'; +SET TIMEZONE TO 'Iran'; +SET TIMEZONE TO 'GB-Eire'; +SET TIMEZONE TO 'Jamaica'; +SET TIMEZONE TO 'Europe/Tiraspol'; +SET TIMEZONE TO 'Europe/Vaduz'; +SET TIMEZONE TO 'Europe/Berlin'; +SET TIMEZONE TO 'Europe/San_Marino'; +SET TIMEZONE TO 'Europe/Guernsey'; +SET TIMEZONE TO 'Europe/Ljubljana'; +SET TIMEZONE TO 'Europe/Simferopol'; +SET TIMEZONE TO 'Europe/Belgrade'; +SET TIMEZONE TO 'Europe/Chisinau'; +SET TIMEZONE TO 'Europe/London'; +SET TIMEZONE TO 'Europe/Vatican'; +SET TIMEZONE TO 'Europe/Skopje'; +SET TIMEZONE TO 'Europe/Saratov'; +SET TIMEZONE TO 'Europe/Jersey'; +SET TIMEZONE TO 'Europe/Samara'; +SET TIMEZONE TO 'Europe/Oslo'; +SET TIMEZONE TO 'Europe/Helsinki'; +SET TIMEZONE TO 'Europe/Luxembourg'; +SET TIMEZONE TO 'Europe/Bucharest'; +SET TIMEZONE TO 'Europe/Podgorica'; +SET TIMEZONE TO 'Europe/Madrid'; +SET TIMEZONE TO 'Europe/Sarajevo'; +SET TIMEZONE TO 'Europe/Busingen'; +SET TIMEZONE TO 'Europe/Monaco'; +SET TIMEZONE TO 'Europe/Belfast'; +SET TIMEZONE TO 'Europe/Zagreb'; +SET TIMEZONE TO 'Europe/Warsaw'; +SET TIMEZONE TO 'Europe/Sofia'; +SET TIMEZONE TO 'Europe/Tallinn'; +SET TIMEZONE TO 'Europe/Brussels'; +SET TIMEZONE TO 'Europe/Isle_of_Man'; +SET TIMEZONE TO 'Europe/Stockholm'; +SET TIMEZONE TO 'Europe/Lisbon'; +SET TIMEZONE TO 'Europe/Istanbul'; +SET TIMEZONE TO 'Europe/Copenhagen'; +SET TIMEZONE TO 'Europe/Tirane'; +SET TIMEZONE TO 'Europe/Dublin'; +SET TIMEZONE TO 'Europe/Gibraltar'; +SET TIMEZONE TO 'Europe/Athens'; +SET TIMEZONE TO 'Europe/Zurich'; +SET TIMEZONE TO 'Europe/Vilnius'; +SET TIMEZONE TO 'Europe/Malta'; +SET TIMEZONE TO 'Europe/Riga'; +SET TIMEZONE TO 'Europe/Vienna'; +SET TIMEZONE TO 'Europe/Moscow'; +SET TIMEZONE TO 'Europe/Ulyanovsk'; +SET TIMEZONE TO 'Europe/Rome'; +SET TIMEZONE TO 'Europe/Kirov'; +SET TIMEZONE TO 'Europe/Uzhgorod'; +SET TIMEZONE TO 'Europe/Kaliningrad'; +SET TIMEZONE TO 'Europe/Mariehamn'; +SET TIMEZONE TO 'Europe/Budapest'; +SET TIMEZONE TO 'Europe/Astrakhan'; +SET TIMEZONE TO 'Europe/Volgograd'; +SET TIMEZONE TO 'Europe/Kiev'; +SET TIMEZONE TO 'Europe/Paris'; +SET TIMEZONE TO 'Europe/Andorra'; +SET TIMEZONE TO 'Europe/Amsterdam'; +SET TIMEZONE TO 'Europe/Nicosia'; +SET TIMEZONE TO 'Europe/Bratislava'; +SET TIMEZONE TO 'Europe/Minsk'; +SET TIMEZONE TO 'Europe/Prague'; +SET TIMEZONE TO 'Europe/Zaporozhye'; +SET TIMEZONE TO 'Egypt'; +SET TIMEZONE TO 'Zulu'; +SET TIMEZONE TO 'Etc/GMT+6'; +SET TIMEZONE TO 'Etc/GMT-8'; +SET TIMEZONE TO 'Etc/GMT-0'; +SET TIMEZONE TO 'Etc/GMT+3'; +SET TIMEZONE TO 'Etc/GMT-12'; +SET TIMEZONE TO 'Etc/GMT+7'; +SET TIMEZONE TO 'Etc/GMT-14'; +SET TIMEZONE TO 'Etc/GMT-10'; +SET TIMEZONE TO 'Etc/Zulu'; +SET TIMEZONE TO 'Etc/GMT-4'; +SET TIMEZONE TO 'Etc/GMT+5'; +SET TIMEZONE TO 'Etc/GMT'; +SET TIMEZONE TO 'Etc/GMT-11'; +SET TIMEZONE TO 'Etc/GMT-5'; +SET TIMEZONE TO 'Etc/GMT+1'; +SET TIMEZONE TO 'Etc/GMT+10'; +SET TIMEZONE TO 'Etc/UCT'; +SET TIMEZONE TO 'Etc/GMT+11'; +SET TIMEZONE TO 'Etc/GMT-3'; +SET TIMEZONE TO 'Etc/Greenwich'; +SET TIMEZONE TO 'Etc/GMT-13'; +SET TIMEZONE TO 'Etc/GMT-9'; +SET TIMEZONE TO 'Etc/GMT-7'; +SET TIMEZONE TO 'Etc/GMT-6'; +SET TIMEZONE TO 'Etc/GMT+4'; +SET TIMEZONE TO 'Etc/GMT+2'; +SET TIMEZONE TO 'Etc/Universal'; +SET TIMEZONE TO 'Etc/GMT+9'; +SET TIMEZONE TO 'Etc/GMT+0'; +SET TIMEZONE TO 'Etc/GMT-2'; +SET TIMEZONE TO 'Etc/GMT+12'; +SET TIMEZONE TO 'Etc/GMT-1'; +SET TIMEZONE TO 'Etc/UTC'; +SET TIMEZONE TO 'Etc/GMT+8'; +SET TIMEZONE TO 'Etc/GMT0'; +SET TIMEZONE TO 'Australia/Currie'; +SET TIMEZONE TO 'Australia/Lindeman'; +SET TIMEZONE TO 'Australia/Melbourne'; +SET TIMEZONE TO 'Australia/Yancowinna'; +SET TIMEZONE TO 'Australia/Eucla'; +SET TIMEZONE TO 'Australia/South'; +SET TIMEZONE TO 'Australia/Lord_Howe'; +SET TIMEZONE TO 'Australia/Perth'; +SET TIMEZONE TO 'Australia/Canberra'; +SET TIMEZONE TO 'Australia/Hobart'; +SET TIMEZONE TO 'Australia/North'; +SET TIMEZONE TO 'Australia/Broken_Hill'; +SET TIMEZONE TO 'Australia/NSW'; +SET TIMEZONE TO 'Australia/Victoria'; +SET TIMEZONE TO 'Australia/Adelaide'; +SET TIMEZONE TO 'Australia/Queensland'; +SET TIMEZONE TO 'Australia/Darwin'; +SET TIMEZONE TO 'Australia/West'; +SET TIMEZONE TO 'Australia/LHI'; +SET TIMEZONE TO 'Australia/ACT'; +SET TIMEZONE TO 'Australia/Sydney'; +SET TIMEZONE TO 'Australia/Brisbane'; +SET TIMEZONE TO 'Australia/Tasmania'; +SET TIMEZONE TO 'W-SU'; +SET TIMEZONE TO 'Africa/Kigali'; +SET TIMEZONE TO 'Africa/Dar_es_Salaam'; +SET TIMEZONE TO 'Africa/Niamey'; +SET TIMEZONE TO 'Africa/Brazzaville'; +SET TIMEZONE TO 'Africa/Addis_Ababa'; +SET TIMEZONE TO 'Africa/Kampala'; +SET TIMEZONE TO 'Africa/Kinshasa'; +SET TIMEZONE TO 'Africa/Lagos'; +SET TIMEZONE TO 'Africa/Accra'; +SET TIMEZONE TO 'Africa/Bangui'; +SET TIMEZONE TO 'Africa/Maputo'; +SET TIMEZONE TO 'Africa/Asmara'; +SET TIMEZONE TO 'Africa/Juba'; +SET TIMEZONE TO 'Africa/Tunis'; +SET TIMEZONE TO 'Africa/Bissau'; +SET TIMEZONE TO 'Africa/Freetown'; +SET TIMEZONE TO 'Africa/Tripoli'; +SET TIMEZONE TO 'Africa/Windhoek'; +SET TIMEZONE TO 'Africa/Casablanca'; +SET TIMEZONE TO 'Africa/Mbabane'; +SET TIMEZONE TO 'Africa/Harare'; +SET TIMEZONE TO 'Africa/Mogadishu'; +SET TIMEZONE TO 'Africa/Banjul'; +SET TIMEZONE TO 'Africa/Djibouti'; +SET TIMEZONE TO 'Africa/Malabo'; +SET TIMEZONE TO 'Africa/Nouakchott'; +SET TIMEZONE TO 'Africa/Lubumbashi'; +SET TIMEZONE TO 'Africa/Luanda'; +SET TIMEZONE TO 'Africa/Bamako'; +SET TIMEZONE TO 'Africa/Nairobi'; +SET TIMEZONE TO 'Africa/Lusaka'; +SET TIMEZONE TO 'Africa/Ouagadougou'; +SET TIMEZONE TO 'Africa/Asmera'; +SET TIMEZONE TO 'Africa/Douala'; +SET TIMEZONE TO 'Africa/Dakar'; +SET TIMEZONE TO 'Africa/Khartoum'; +SET TIMEZONE TO 'Africa/Libreville'; +SET TIMEZONE TO 'Africa/Maseru'; +SET TIMEZONE TO 'Africa/Lome'; +SET TIMEZONE TO 'Africa/Abidjan'; +SET TIMEZONE TO 'Africa/Ceuta'; +SET TIMEZONE TO 'Africa/El_Aaiun'; +SET TIMEZONE TO 'Africa/Algiers'; +SET TIMEZONE TO 'Africa/Ndjamena'; +SET TIMEZONE TO 'Africa/Gaborone'; +SET TIMEZONE TO 'Africa/Blantyre'; +SET TIMEZONE TO 'Africa/Sao_Tome'; +SET TIMEZONE TO 'Africa/Monrovia'; +SET TIMEZONE TO 'Africa/Johannesburg'; +SET TIMEZONE TO 'Africa/Timbuktu'; +SET TIMEZONE TO 'Africa/Cairo'; +SET TIMEZONE TO 'Africa/Porto-Novo'; +SET TIMEZONE TO 'Africa/Bujumbura'; +SET TIMEZONE TO 'Africa/Conakry'; +SET TIMEZONE TO 'PST8PDT'; +SET TIMEZONE TO 'Indian/Maldives'; +SET TIMEZONE TO 'Indian/Mahe'; +SET TIMEZONE TO 'Indian/Christmas'; +SET TIMEZONE TO 'Indian/Mauritius'; +SET TIMEZONE TO 'Indian/Chagos'; +SET TIMEZONE TO 'Indian/Mayotte'; +SET TIMEZONE TO 'Indian/Reunion'; +SET TIMEZONE TO 'Indian/Antananarivo'; +SET TIMEZONE TO 'Indian/Kerguelen'; +SET TIMEZONE TO 'Indian/Cocos'; +SET TIMEZONE TO 'Indian/Comoro'; +SET TIMEZONE TO 'MET'; +SET TIMEZONE TO 'ROC'; +SET TIMEZONE TO 'EET'; +SET TIMEZONE TO 'GMT'; +SET TIMEZONE TO 'EST'; +SET TIMEZONE TO 'Hongkong'; +SET TIMEZONE TO 'Turkey'; +SET TIMEZONE TO 'Iceland'; +SET TIMEZONE TO 'Poland'; +SET TIMEZONE TO 'GB'; +SET TIMEZONE TO 'Israel'; +SET TIMEZONE TO 'UCT'; +SET TIMEZONE TO 'Navajo'; +SET TIMEZONE TO 'Greenwich'; +SET TIMEZONE TO 'Antarctica/Davis'; +SET TIMEZONE TO 'Antarctica/Casey'; +SET TIMEZONE TO 'Antarctica/Troll'; +SET TIMEZONE TO 'Antarctica/DumontDUrville'; +SET TIMEZONE TO 'Antarctica/South_Pole'; +SET TIMEZONE TO 'Antarctica/Vostok'; +SET TIMEZONE TO 'Antarctica/Syowa'; +SET TIMEZONE TO 'Antarctica/Mawson'; +SET TIMEZONE TO 'Antarctica/McMurdo'; +SET TIMEZONE TO 'Antarctica/Palmer'; +SET TIMEZONE TO 'Antarctica/Macquarie'; +SET TIMEZONE TO 'Antarctica/Rothera'; +SET TIMEZONE TO 'CST6CDT'; +SET TIMEZONE TO 'Libya'; +SET TIMEZONE TO 'Kwajalein'; +SET TIMEZONE TO 'Cuba'; +SET TIMEZONE TO 'Mexico/BajaNorte'; +SET TIMEZONE TO 'Mexico/General'; +SET TIMEZONE TO 'Mexico/BajaSur'; +SET TIMEZONE TO 'WET'; +SET TIMEZONE TO 'Singapore'; +SET TIMEZONE TO 'Brazil/DeNoronha'; +SET TIMEZONE TO 'Brazil/Acre'; +SET TIMEZONE TO 'Brazil/West'; +SET TIMEZONE TO 'Brazil/East'; +SET TIMEZONE TO 'MST7MDT'; +SET TIMEZONE TO 'US/Aleutian'; +SET TIMEZONE TO 'US/Samoa'; +SET TIMEZONE TO 'US/Eastern'; +SET TIMEZONE TO 'US/Alaska'; +SET TIMEZONE TO 'US/Indiana-Starke'; +SET TIMEZONE TO 'US/Michigan'; +SET TIMEZONE TO 'US/Central'; +SET TIMEZONE TO 'US/East-Indiana'; +SET TIMEZONE TO 'US/Mountain'; +SET TIMEZONE TO 'US/Hawaii'; +SET TIMEZONE TO 'US/Pacific'; +SET TIMEZONE TO 'US/Arizona'; +SET TIMEZONE TO 'Universal'; +SET TIMEZONE TO 'Asia/Dushanbe'; +SET TIMEZONE TO 'Asia/Oral'; +SET TIMEZONE TO 'Asia/Magadan'; +SET TIMEZONE TO 'Asia/Hong_Kong'; +SET TIMEZONE TO 'Asia/Aden'; +SET TIMEZONE TO 'Asia/Tomsk'; +SET TIMEZONE TO 'Asia/Aqtobe'; +SET TIMEZONE TO 'Asia/Pontianak'; +SET TIMEZONE TO 'Asia/Kuching'; +SET TIMEZONE TO 'Asia/Tbilisi'; +SET TIMEZONE TO 'Asia/Novosibirsk'; +SET TIMEZONE TO 'Asia/Chita'; +SET TIMEZONE TO 'Asia/Hebron'; +SET TIMEZONE TO 'Asia/Choibalsan'; +SET TIMEZONE TO 'Asia/Qyzylorda'; +SET TIMEZONE TO 'Asia/Jakarta'; +SET TIMEZONE TO 'Asia/Colombo'; +SET TIMEZONE TO 'Asia/Dili'; +SET TIMEZONE TO 'Asia/Thimphu'; +SET TIMEZONE TO 'Asia/Tashkent'; +SET TIMEZONE TO 'Asia/Ujung_Pandang'; +SET TIMEZONE TO 'Asia/Ulaanbaatar'; +SET TIMEZONE TO 'Asia/Jerusalem'; +SET TIMEZONE TO 'Asia/Pyongyang'; +SET TIMEZONE TO 'Asia/Vladivostok'; +SET TIMEZONE TO 'Asia/Samarkand'; +SET TIMEZONE TO 'Asia/Beirut'; +SET TIMEZONE TO 'Asia/Shanghai'; +SET TIMEZONE TO 'Asia/Kabul'; +SET TIMEZONE TO 'Asia/Bangkok'; +SET TIMEZONE TO 'Asia/Almaty'; +SET TIMEZONE TO 'Asia/Kathmandu'; +SET TIMEZONE TO 'Asia/Ust-Nera'; +SET TIMEZONE TO 'Asia/Yangon'; +SET TIMEZONE TO 'Asia/Novokuznetsk'; +SET TIMEZONE TO 'Asia/Qatar'; +SET TIMEZONE TO 'Asia/Baghdad'; +SET TIMEZONE TO 'Asia/Srednekolymsk'; +SET TIMEZONE TO 'Asia/Hovd'; +SET TIMEZONE TO 'Asia/Istanbul'; +SET TIMEZONE TO 'Asia/Omsk'; +SET TIMEZONE TO 'Asia/Macau'; +SET TIMEZONE TO 'Asia/Yekaterinburg'; +SET TIMEZONE TO 'Asia/Vientiane'; +SET TIMEZONE TO 'Asia/Famagusta'; +SET TIMEZONE TO 'Asia/Urumqi'; +SET TIMEZONE TO 'Asia/Kuwait'; +SET TIMEZONE TO 'Asia/Dhaka'; +SET TIMEZONE TO 'Asia/Ulan_Bator'; +SET TIMEZONE TO 'Asia/Dubai'; +SET TIMEZONE TO 'Asia/Saigon'; +SET TIMEZONE TO 'Asia/Muscat'; +SET TIMEZONE TO 'Asia/Tehran'; +SET TIMEZONE TO 'Asia/Ho_Chi_Minh'; +SET TIMEZONE TO 'Asia/Aqtau'; +SET TIMEZONE TO 'Asia/Bishkek'; +SET TIMEZONE TO 'Asia/Kashgar'; +SET TIMEZONE TO 'Asia/Gaza'; +SET TIMEZONE TO 'Asia/Riyadh'; +SET TIMEZONE TO 'Asia/Ashkhabad'; +SET TIMEZONE TO 'Asia/Khandyga'; +SET TIMEZONE TO 'Asia/Anadyr'; +SET TIMEZONE TO 'Asia/Brunei'; +SET TIMEZONE TO 'Asia/Phnom_Penh'; +SET TIMEZONE TO 'Asia/Baku'; +SET TIMEZONE TO 'Asia/Sakhalin'; +SET TIMEZONE TO 'Asia/Atyrau'; +SET TIMEZONE TO 'Asia/Ashgabat'; +SET TIMEZONE TO 'Asia/Thimbu'; +SET TIMEZONE TO 'Asia/Damascus'; +SET TIMEZONE TO 'Asia/Kolkata'; +SET TIMEZONE TO 'Asia/Jayapura'; +SET TIMEZONE TO 'Asia/Tokyo'; +SET TIMEZONE TO 'Asia/Katmandu'; +SET TIMEZONE TO 'Asia/Bahrain'; +SET TIMEZONE TO 'Asia/Tel_Aviv'; +SET TIMEZONE TO 'Asia/Singapore'; +SET TIMEZONE TO 'Asia/Krasnoyarsk'; +SET TIMEZONE TO 'Asia/Seoul'; +SET TIMEZONE TO 'Asia/Barnaul'; +SET TIMEZONE TO 'Asia/Yakutsk'; +SET TIMEZONE TO 'Asia/Irkutsk'; +SET TIMEZONE TO 'Asia/Macao'; +SET TIMEZONE TO 'Asia/Taipei'; +SET TIMEZONE TO 'Asia/Kamchatka'; +SET TIMEZONE TO 'Asia/Yerevan'; +SET TIMEZONE TO 'Asia/Harbin'; +SET TIMEZONE TO 'Asia/Manila'; +SET TIMEZONE TO 'Asia/Qostanay'; +SET TIMEZONE TO 'Asia/Amman'; +SET TIMEZONE TO 'Asia/Nicosia'; +SET TIMEZONE TO 'Asia/Karachi'; +SET TIMEZONE TO 'Asia/Rangoon'; +SET TIMEZONE TO 'Asia/Chungking'; +SET TIMEZONE TO 'Asia/Chongqing'; +SET TIMEZONE TO 'Asia/Makassar'; +SET TIMEZONE TO 'Asia/Dacca'; +SET TIMEZONE TO 'Asia/Kuala_Lumpur'; +SET TIMEZONE TO 'Asia/Calcutta'; +SET TIMEZONE TO 'EST5EDT'; +SET TIMEZONE TO 'GMT+0'; +SET TIMEZONE TO 'Pacific/Wake'; +SET TIMEZONE TO 'Pacific/Samoa'; +SET TIMEZONE TO 'Pacific/Efate'; +SET TIMEZONE TO 'Pacific/Niue'; +SET TIMEZONE TO 'Pacific/Pago_Pago'; +SET TIMEZONE TO 'Pacific/Pitcairn'; +SET TIMEZONE TO 'Pacific/Saipan'; +SET TIMEZONE TO 'Pacific/Norfolk'; +SET TIMEZONE TO 'Pacific/Yap'; +SET TIMEZONE TO 'Pacific/Enderbury'; +SET TIMEZONE TO 'Pacific/Port_Moresby'; +SET TIMEZONE TO 'Pacific/Funafuti'; +SET TIMEZONE TO 'Pacific/Apia'; +SET TIMEZONE TO 'Pacific/Rarotonga'; +SET TIMEZONE TO 'Pacific/Ponape'; +SET TIMEZONE TO 'Pacific/Wallis'; +SET TIMEZONE TO 'Pacific/Johnston'; +SET TIMEZONE TO 'Pacific/Guam'; +SET TIMEZONE TO 'Pacific/Guadalcanal'; +SET TIMEZONE TO 'Pacific/Chatham'; +SET TIMEZONE TO 'Pacific/Truk'; +SET TIMEZONE TO 'Pacific/Fakaofo'; +SET TIMEZONE TO 'Pacific/Kosrae'; +SET TIMEZONE TO 'Pacific/Kiritimati'; +SET TIMEZONE TO 'Pacific/Gambier'; +SET TIMEZONE TO 'Pacific/Kwajalein'; +SET TIMEZONE TO 'Pacific/Midway'; +SET TIMEZONE TO 'Pacific/Pohnpei'; +SET TIMEZONE TO 'Pacific/Majuro'; +SET TIMEZONE TO 'Pacific/Tahiti'; +SET TIMEZONE TO 'Pacific/Fiji'; +SET TIMEZONE TO 'Pacific/Tongatapu'; +SET TIMEZONE TO 'Pacific/Palau'; +SET TIMEZONE TO 'Pacific/Galapagos'; +SET TIMEZONE TO 'Pacific/Marquesas'; +SET TIMEZONE TO 'Pacific/Bougainville'; +SET TIMEZONE TO 'Pacific/Honolulu'; +SET TIMEZONE TO 'Pacific/Noumea'; +SET TIMEZONE TO 'Pacific/Auckland'; +SET TIMEZONE TO 'Pacific/Chuuk'; +SET TIMEZONE TO 'Pacific/Nauru'; +SET TIMEZONE TO 'Pacific/Easter'; +SET TIMEZONE TO 'Pacific/Tarawa'; +SET TIMEZONE TO 'America/Detroit'; +SET TIMEZONE TO 'America/Barbados'; +SET TIMEZONE TO 'America/North_Dakota/New_Salem'; +SET TIMEZONE TO 'America/North_Dakota/Center'; +SET TIMEZONE TO 'America/North_Dakota/Beulah'; +SET TIMEZONE TO 'America/Thunder_Bay'; +SET TIMEZONE TO 'America/Panama'; +SET TIMEZONE TO 'America/Cancun'; +SET TIMEZONE TO 'America/Santo_Domingo'; +SET TIMEZONE TO 'America/Matamoros'; +SET TIMEZONE TO 'America/Port-au-Prince'; +SET TIMEZONE TO 'America/Atikokan'; +SET TIMEZONE TO 'America/Knox_IN'; +SET TIMEZONE TO 'America/Cayenne'; +SET TIMEZONE TO 'America/Kralendijk'; +SET TIMEZONE TO 'America/Iqaluit'; +SET TIMEZONE TO 'America/Paramaribo'; +SET TIMEZONE TO 'America/Aruba'; +SET TIMEZONE TO 'America/Vancouver'; +SET TIMEZONE TO 'America/Noronha'; +SET TIMEZONE TO 'America/Ojinaga'; +SET TIMEZONE TO 'America/Atka'; +SET TIMEZONE TO 'America/St_Johns'; +SET TIMEZONE TO 'America/Mexico_City'; +SET TIMEZONE TO 'America/Rosario'; +SET TIMEZONE TO 'America/Nipigon'; +SET TIMEZONE TO 'America/Costa_Rica'; +SET TIMEZONE TO 'America/Regina'; +SET TIMEZONE TO 'America/La_Paz'; +SET TIMEZONE TO 'America/Jamaica'; +SET TIMEZONE TO 'America/Anchorage'; +SET TIMEZONE TO 'America/St_Kitts'; +SET TIMEZONE TO 'America/Godthab'; +SET TIMEZONE TO 'America/Swift_Current'; +SET TIMEZONE TO 'America/Danmarkshavn'; +SET TIMEZONE TO 'America/Phoenix'; +SET TIMEZONE TO 'America/Lower_Princes'; +SET TIMEZONE TO 'America/Yakutat'; +SET TIMEZONE TO 'America/Menominee'; +SET TIMEZONE TO 'America/Bahia'; +SET TIMEZONE TO 'America/Montserrat'; +SET TIMEZONE TO 'America/Miquelon'; +SET TIMEZONE TO 'America/Anguilla'; +SET TIMEZONE TO 'America/Grand_Turk'; +SET TIMEZONE TO 'America/Coral_Harbour'; +SET TIMEZONE TO 'America/Glace_Bay'; +SET TIMEZONE TO 'America/Boa_Vista'; +SET TIMEZONE TO 'America/Dominica'; +SET TIMEZONE TO 'America/Goose_Bay'; +SET TIMEZONE TO 'America/Caracas'; +SET TIMEZONE TO 'America/Boise'; +SET TIMEZONE TO 'America/Cayman'; +SET TIMEZONE TO 'America/Puerto_Rico'; +SET TIMEZONE TO 'America/Guyana'; +SET TIMEZONE TO 'America/Metlakatla'; +SET TIMEZONE TO 'America/Cuiaba'; +SET TIMEZONE TO 'America/Virgin'; +SET TIMEZONE TO 'America/Campo_Grande'; +SET TIMEZONE TO 'America/Maceio'; +SET TIMEZONE TO 'America/Scoresbysund'; +SET TIMEZONE TO 'America/Guadeloupe'; +SET TIMEZONE TO 'America/Indiana/Vevay'; +SET TIMEZONE TO 'America/Indiana/Winamac'; +SET TIMEZONE TO 'America/Indiana/Petersburg'; +SET TIMEZONE TO 'America/Indiana/Marengo'; +SET TIMEZONE TO 'America/Indiana/Knox'; +SET TIMEZONE TO 'America/Indiana/Indianapolis'; +SET TIMEZONE TO 'America/Indiana/Vincennes'; +SET TIMEZONE TO 'America/Indiana/Tell_City'; +SET TIMEZONE TO 'America/Manaus'; +SET TIMEZONE TO 'America/Resolute'; +SET TIMEZONE TO 'America/Pangnirtung'; +SET TIMEZONE TO 'America/Winnipeg'; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_cancel_terminate_concurrency.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_cancel_terminate_concurrency.sql new file mode 100644 index 00000000000..90eeb44cd70 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_cancel_terminate_concurrency.sql @@ -0,0 +1,144 @@ +-- test1: cancel a query that is waiting for a slot +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- 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 RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +1:SET ROLE role_concurrency_test; +1:BEGIN; +2:SET ROLE role_concurrency_test; +2&:BEGIN; +3:SET ROLE role_concurrency_test; +3&:BEGIN; +SELECT * FROM rg_concurrency_view; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; +1:END; +2<: +3<: +SELECT * FROM rg_concurrency_view; +1q: +2q: +3q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- test2: terminate a query that is waiting for a slot +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +1:SET ROLE role_concurrency_test; +1:BEGIN; +2:SET ROLE role_concurrency_test; +2&:BEGIN; +3:SET ROLE role_concurrency_test; +3&:BEGIN; +SELECT * FROM rg_concurrency_view; +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; +1:END; +2<: +3<: +SELECT * FROM rg_concurrency_view; +1q: +2q: +3q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- test3: cancel a query that is running +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +1:SET ROLE role_concurrency_test; +1&:SELECT pg_sleep(10000); +2:SET ROLE role_concurrency_test; +2&:SELECT pg_sleep(10000); +6:SET ROLE role_concurrency_test; +6&:BEGIN; +7:SET ROLE role_concurrency_test; +7&:BEGIN; +SELECT * FROM rg_concurrency_view; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type = 'Timeout' AND rsgname='rg_concurrency_test'; +1<: +2<: +6<: +7<: +SELECT * FROM rg_concurrency_view; +1q: +2q: +6q: +7q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- test4: terminate a query that is running +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +1:SET ROLE role_concurrency_test; +1&:SELECT pg_sleep(10000); +2:SET ROLE role_concurrency_test; +2&:SELECT pg_sleep(10000); +6:SET ROLE role_concurrency_test; +6&:BEGIN; +7:SET ROLE role_concurrency_test; +7&:BEGIN; +SELECT * FROM rg_concurrency_view; +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type = 'Timeout' AND rsgname='rg_concurrency_test'; +1<: +2<: +6<: +7<: +SELECT * FROM rg_concurrency_view; +1q: +2q: +6q: +7q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- test5: terminate a query waiting for a slot, that opens a transaction on exit callback +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +1:SET ROLE role_concurrency_test; +1:CREATE TEMP TABLE tmp(a INT); +2:SET ROLE role_concurrency_test; +2:BEGIN; +1&:SELECT 1; +SELECT * FROM rg_concurrency_view; +-- Upon receiving the terminate request, session 1 should start a new transaction to cleanup temp table. +-- Note, that session 1 has already been waiting for resource group slot, its new transaction will bypass +-- resource group since it's exiting. +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; +1<: +2:COMMIT; +SELECT * FROM rg_concurrency_view; +1q: +2q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +DROP VIEW rg_concurrency_view; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_concurrency.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_concurrency.sql new file mode 100644 index 00000000000..1459bcafbef --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_concurrency.sql @@ -0,0 +1,265 @@ +-- 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; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; + +-- no query has been assigned to the this 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'; +2:SET ROLE role_concurrency_test; +2:BEGIN; +3:SET ROLE role_concurrency_test; +3:BEGIN; +4:SET ROLE role_concurrency_test; +4&:BEGIN; + +-- new transaction will be blocked when the concurrency limit of the resource group is reached. +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'; +SELECT wait_event from pg_stat_activity where query = 'BEGIN;' and state = 'active' and rsgname = 'rg_concurrency_test' and wait_event_type='ResourceGroup'; +2:END; +3:END; +4<: +4:END; +2q: +3q: +4q: +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'; +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- 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; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +12:SET ROLE role_concurrency_test; +12:BEGIN; +13:SET ROLE role_concurrency_test; +13:BEGIN; +14:SET ROLE role_concurrency_test; +14&:BEGIN; +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'; +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 3; +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'; +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; +12:END; +13:END; +14<: +14:END; +12q: +13q: +14q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- 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; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=3, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +22:SET ROLE role_concurrency_test; +22:BEGIN; +23:SET ROLE role_concurrency_test; +23:BEGIN; +24:SET ROLE role_concurrency_test; +24:BEGIN; +25:SET ROLE role_concurrency_test; +25&:BEGIN; +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'; +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; +-- Alter concurrency 3->2, the 'value' of pg_resgroupcapability will be set to 2. +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; +-- When one transaction is finished, queueing transaction won't be woken up. There're 2 running transactions and 1 queueing transaction. +24:END; +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'; +-- New transaction will be queued, there're 2 running and 2 queueing transactions. +24&:BEGIN; +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'; +-- Finish another transaction, one queueing transaction will be woken up, there're 2 running transactions and 1 queueing transaction. +22:END; +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'; +-- Alter concurrency 2->2, the 'value' of pg_resgroupcapability will be set to 2. +ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; +SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; +-- Finish another transaction, one queueing transaction will be woken up, there're 2 running transactions and 0 queueing transaction. +23:END; +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'; +24<: +25<: +25:END; +24:END; +22q: +23q: +24q: +25q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- test4: concurrently drop resource group + +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; + +-- DROP should fail if there're running transactions +32:SET ROLE role_concurrency_test; +32:BEGIN; +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; +32:END; + +DROP ROLE IF EXISTS role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- test5: QD exit before QE +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +51:SET ROLE role_concurrency_test; +51:BEGIN; +52:SET ROLE role_concurrency_test; +52&:BEGIN; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; +52<: +52&:BEGIN; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; +52<: +51q: +52q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- test6: cancel a query that is waiting for a slot +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +51:SET ROLE role_concurrency_test; +51:BEGIN; +52:SET ROLE role_concurrency_test; +52&:BEGIN; +51q: +52<: +52q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + + +-- test7: terminate a query that is waiting for a slot +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +61:SET ROLE role_concurrency_test; +61:BEGIN; +62:SET ROLE role_concurrency_test; +62&:BEGIN; +SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; +62<: +61q: +62q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- test8: create a resgroup with concurrency=0 +DROP ROLE IF EXISTS role_concurrency_test; +-- start_ignore +DROP RESOURCE GROUP rg_concurrency_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; +61:SET ROLE role_concurrency_test; +61&:BEGIN; +SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test'; +61<: +61q: +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; + +-- +-- Test cursors, pl/* functions only take one slot. +-- +-- set concurrency to 1 +CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; + +-- declare cursors and verify that it only takes one resource group slot +71:SET ROLE TO role_concurrency_test; +71:CREATE TABLE foo_concurrency_test as select i as c1 , i as c2 from generate_series(1, 1000) i; +71:CREATE TABLE bar_concurrency_test as select i as c1 , i as c2 from generate_series(1, 1000) i; +71:BEGIN; +71:DECLARE c1 CURSOR for select c1, c2 from foo_concurrency_test order by c1 limit 10; +71:DECLARE c2 CURSOR for select c1, c2 from bar_concurrency_test order by c1 limit 10; +71:DECLARE c3 CURSOR for select count(*) from foo_concurrency_test t1, bar_concurrency_test t2 where t1.c2 = t2.c2; +71:Fetch ALL FROM c1; +71:Fetch ALL FROM c2; +71:Fetch ALL FROM c3; +71:END; + +-- 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; + +71: select func_concurrency_test(); + +-- Prepare/execute statements and verify that it only takes one resource group slot. +71:BEGIN; +71:PREPARE p1 (integer) as select * from foo_concurrency_test where c2=$1; +71:PREPARE p2 (integer) as select * from bar_concurrency_test where c2=$1; +71:EXECUTE p1(1); +71:EXECUTE p2(2); +71:END; +71:PREPARE p3 (integer) as select * from foo_concurrency_test where c2=$1; +71:PREPARE p4 (integer) as select * from bar_concurrency_test where c2=$1; +71:EXECUTE p3(1); +71:EXECUTE p4(2); + +DROP TABLE foo_concurrency_test; +DROP TABLE bar_concurrency_test; +DROP ROLE role_concurrency_test; +DROP RESOURCE GROUP rg_concurrency_test; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_cpuset_empty_default.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_cpuset_empty_default.sql new file mode 100644 index 00000000000..fb2811f3865 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_cpuset_empty_default.sql @@ -0,0 +1,32 @@ +-- A regression test for cpuset. +-- +-- When all the cpu cores are allocated the default cpuset group should +-- fallback to core 0. However this fallback logic was only added on +-- CREATE / ALTER RESOURCE GROUP, but missing in startup logic, an empty cpu +-- core list "" is set to cgroup and cause a runtime error: +-- +-- can't write data to file '/sys/fs/cgroup/cpuset/gpdb/1/cpuset.cpus': +-- No space left on device (resgroup-ops-linux.c:916) +-- +-- To trigger the issue we create a resource group, allocate all the cpu cores +-- to it, and restart the cluster. + +-- start_ignore +DROP RESOURCE GROUP rg1_cpuset_test; +-- end_ignore + +-- Create a resource group with all the cpu cores. +-- The isolation2 test framework does not support \set so we have to plan with +-- some tricks. +! psql -d isolation2resgrouptest -Ac "CREATE RESOURCE GROUP rg1_cpuset_test WITH (memory_limit=10, cpuset='0-$(($(nproc)-1))')"; + +-- Alter a resource group from / to all the cpu cores should also work. +ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '0'; +! psql -d isolation2resgrouptest -Ac "ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '0-$(($(nproc)-1))'"; + +-- start_ignore +! gpstop -rai; +-- end_ignore + +-- Cleanup in a new connection as the default one is disconnected by gpstop +10: DROP RESOURCE GROUP rg1_cpuset_test; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_dumpinfo.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_dumpinfo.sql new file mode 100644 index 00000000000..3254575cc66 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_dumpinfo.sql @@ -0,0 +1,94 @@ +DROP ROLE IF EXISTS role_dumpinfo_test; +DROP ROLE IF EXISTS role_permission; +-- start_ignore +DROP RESOURCE GROUP rg_dumpinfo_test; +CREATE LANGUAGE plpython3u; +-- end_ignore + +CREATE FUNCTION dump_test_check() RETURNS bool +as $$ +import json +import pg + +def validate(json_obj, segnum): + array = json_obj.get("info") + #validate segnum + if len(array) != segnum: + return False + qd_info = [j for j in array if j["segid"] == -1][0] + #validate keys + keys = ["segid", "segmentsOnMaster", "loaded", "totalChunks", + "freeChunks", "chunkSizeInBits", "groups"] + for key in keys: + if key not in qd_info: + return False + + groups = [g for g in qd_info["groups"] if g["group_id"] > 6438] + #validate user created group + if len(groups) != 1: + return False + group = groups[0] + #validate group keys + keys = ["group_id", "nRunning", "locked_for_drop", "memExpected", + "memQuotaGranted", "memSharedGranted", "memQuotaUsed", + "memUsage", "memSharedUsage"] + for key in keys: + if key not in group: + return False + + #validate waitqueue + wait_queue = group["wait_queue"] + if wait_queue["wait_queue_size"] != 1: + return False + #validate nrunning + nrunning = group["nRunning"] + if nrunning != 2: + return False + + return True + +conn = pg.connect(dbname="postgres") + +r = conn.query("select count(*) from gp_segment_configuration where role = 'p';") +n = r.getresult()[0][0] + +r = conn.query("select value from pg_resgroup_get_status_kv('dump');") +json_text = r.getresult()[0][0] +json_obj = json.loads(json_text) + +return validate(json_obj, n) + +$$ LANGUAGE plpython3u; + +CREATE RESOURCE GROUP rg_dumpinfo_test WITH (concurrency=2, cpu_rate_limit=20, memory_limit=20); +CREATE ROLE role_dumpinfo_test RESOURCE GROUP rg_dumpinfo_test; + +2:SET ROLE role_dumpinfo_test; +2:BEGIN; +3:SET ROLE role_dumpinfo_test; +3:BEGIN; +4:SET ROLE role_dumpinfo_test; +4&:BEGIN; + +SELECT dump_test_check(); + +2:END; +3:END; +4<: +4:END; +2q: +3q: +4q: + +CREATE ROLE role_permission; +SET ROLE role_permission; +select value from pg_resgroup_get_status_kv('dump'); + +RESET ROLE; + +DROP ROLE role_dumpinfo_test; +DROP ROLE role_permission; +DROP RESOURCE GROUP rg_dumpinfo_test; +-- start_ignore +DROP LANGUAGE plpython3u CASCADE; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_functions.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_functions.sql new file mode 100644 index 00000000000..e9d08e6c54f --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_functions.sql @@ -0,0 +1,11 @@ +-- start_ignore +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, cpu_usage, memory_usage); +-- end_ignore +CREATE TEMP TABLE resgroup_function_test(LIKE gp_toolkit.gp_resgroup_status); + +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, cpu_usage, memory_usage) LIMIT 1; + +SELECT count(num_executed)>0 FROM resgroup_function_test WHERE num_executed IS NOT NULL; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_hashagg_spill.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_hashagg_spill.sql new file mode 100644 index 00000000000..77bb99e56b7 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_hashagg_spill.sql @@ -0,0 +1,127 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema hashagg_spill; +set search_path to hashagg_spill; + +-- start_ignore +create language plpython3u; +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function hashagg_spill.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'Work_mem used' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') + m = p.match(cur_line) + if not m: + continue + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; + +create table testhagg (i1 int, i2 int, i3 int, i4 int); +insert into testhagg select i,i,i,i from + (select generate_series(1, nsegments * 17000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; + + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore +CREATE ROLE role1_memory_test SUPERUSER; +CREATE RESOURCE GROUP rg1_memory_test WITH +(concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=10); +SET ROLE TO role1_memory_test; + +0: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SPILL_RATIO 2; +0: ALTER ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +set gp_resgroup_print_operator_memory_limits=on; + +-- the number of rows returned by the query varies depending on the number of segments, so +-- only print the first 10 +select * from (select max(i1) from testhagg group by i2) foo order by 1 limit 10; +select * from hashagg_spill.is_workfile_created('explain analyze select max(i1) from testhagg group by i2;'); +select * from hashagg_spill.is_workfile_created('explain analyze select max(i1) from testhagg group by i2 limit 45000;'); + + +-- Test HashAgg with increasing amount of overflows + +reset all; + +-- Returns the number of overflows from EXPLAIN ANALYZE output +create or replace function hashagg_spill.num_hashagg_overflows(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" +rv = plpy.execute(query) +rv = plpy.execute(explain_query) +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + p = re.compile('.+\((seg[\d]+).+ ([\d+]) overflows;') + m = p.match(cur_line) + if m: + overflows = int(m.group(2)) + result.append(overflows) +return result +$$ +language plpython3u; + +-- Test agg spilling scenarios +drop table if exists aggspill; +create table aggspill (i int, j int, t text) distributed by (i); +insert into aggspill select i, i*2, i::text from generate_series(1, 10000) i; +insert into aggspill select i, i*2, i::text from generate_series(1, 100000) i; +insert into aggspill select i, i*2, i::text from generate_series(1, 1000000) i; + +-- No spill with large statement memory +0: ALTER ROLE role1_memory_test RESOURCE GROUP none; +0: DROP RESOURCE GROUP rg1_memory_test; +0: CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=1, cpu_rate_limit=10, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=30); +0: ALTER ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 1) g; + +-- Reduce the statement memory to induce spilling +0: ALTER ROLE role1_memory_test RESOURCE GROUP none; +0: DROP RESOURCE GROUP rg1_memory_test; +0: CREATE RESOURCE GROUP rg1_memory_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=10); +0: ALTER ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; +select overflows >= 1 from hashagg_spill.num_hashagg_overflows('explain analyze +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 2) g') overflows; +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 2) g; + +-- Reduce the statement memory, nbatches and entrysize even further to cause multiple overflows +set gp_hashagg_default_nbatches = 4; +0: ALTER RESOURCE GROUP rg1_memory_test SET MEMORY_SPILL_RATIO 5; +0: ALTER ROLE role1_memory_test RESOURCE GROUP rg1_memory_test; + +select overflows > 1 from hashagg_spill.num_hashagg_overflows('explain analyze +select count(*) from (select i, count(*) from aggspill group by i,j,t having count(*) = 3) g') overflows; + +select count(*) from (select i, count(*) from aggspill group by i,j,t having count(*) = 3) g; + +drop schema hashagg_spill cascade; +drop table aggspill; + +-- start_ignore +RESET ROLE; +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_hashjoin_spill.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_hashjoin_spill.sql new file mode 100644 index 00000000000..edfb33ce080 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_hashjoin_spill.sql @@ -0,0 +1,72 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema hashjoin_spill; +set search_path to hashjoin_spill; + +-- start_ignore +create language plpython3u; +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function hashjoin_spill.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'Work_mem used' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH +(concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=1); +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +SET ROLE TO role1_memory_test; + +CREATE TABLE test_hj_spill (i1 int, i2 int, i3 int, i4 int, i5 int, i6 int, i7 int, i8 int); +insert into test_hj_spill SELECT i,i,i%1000,i,i,i,i,i from + (select generate_series(1, nsegments * 15000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; +set gp_resgroup_print_operator_memory_limits=on; + +set gp_workfile_type_hashjoin=buffile; +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2;'); +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 15000;'); + +set gp_workfile_type_hashjoin=bfz; +set gp_workfile_compress_algorithm=zlib; +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2'); +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 15000;'); + +set gp_workfile_compress_algorithm=NONE; +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2'); +select * from hashjoin_spill.is_workfile_created('explain analyze SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 15000;'); + +drop schema hashjoin_spill cascade; + +-- start_ignore +RESET ROLE; +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_materialize_spill.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_materialize_spill.sql new file mode 100644 index 00000000000..90c1a8b28aa --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_materialize_spill.sql @@ -0,0 +1,104 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema materialize_spill; +set search_path to materialize_spill; + +-- start_ignore +create language plpython3u; +-- end_ignore + +-- Helper function to verify that a plan spilled to disk. For each node +-- in the plan that used Workfiles (Materialize or Sort nodes, currently), +-- return the number of segments where the node spilled to disk. +create or replace function num_workfiles_created(explain_query text) +returns setof int as +$$ +import re +rv = plpy.execute(explain_query) +search_text = 'Work_mem used' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + result.append(workfile_created) +return result +$$ +language plpython3u; + +-- Run a query that contains a Materialize node that spills to disk. +-- +-- The expected plan is something like this: +-- +-- Gather Motion 3:1 +-- -> Nested Loop Left Join +-- Join Filter: t1.i1 = t2.i2 +-- -> Seq Scan on test_mat_small t1 +-- -> Materialize +-- -> Redistribute Motion 3:3 +-- Hash Key: t2.i2 +-- -> Seq Scan on test_mat_large t2 +-- +-- The planner will put a Materialize node on the inner side, to shield +-- the Motion node from rewinding. Because the larger table doesn't fit +-- in memory, the Materialize will spill to disk. +-- +CREATE TABLE test_mat_small (i1 int); +INSERT INTO test_mat_small SELECT i from generate_series(101, 105) i; + +-- Scale the larger table's size with the number of segments, so that there is enough +-- data on every segment to cause spilling. +CREATE TABLE test_mat_large (i1 int, i2 int, i3 int, i4 int, i5 int, i6 int, i7 int, i8 int); +INSERT INTO test_mat_large SELECT i,i,i,i,i,i,i,i from + (select generate_series(1, nsegments * 50000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH +(concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=1); +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +SET ROLE TO role1_memory_test; + +set gp_resgroup_print_operator_memory_limits=on; +set enable_hashjoin = false; +set enable_nestloop = true; +-- ORCA doesn't honor enable_nestloop/enable_hashjoin, so this won't produce +-- the kind of plan we're looking for. +set optimizer=off; + +-- This is the actual test query. +select * FROM test_mat_small as t1 left outer join test_mat_large AS t2 on t1.i1=t2.i2; + +-- Check that the Materialize node spilled to disk, to make sure we're testing spilling +-- as intended. The inner side of the join with the Materialize will not get executed on +-- segments that have no data for the outer side. Therefore, we expect the Materialize +-- node to only be executed, and spilled, on as many segments as there nodes that hold +-- data from test_mat_small. +select n - (select count (distinct gp_segment_id) from test_mat_small) as difference +from num_workfiles_created($$ + explain analyze + select * FROM test_mat_small as t1 left outer join test_mat_large AS t2 on t1.i1=t2.i2 +$$) as n; + +-- Repeat, with a LIMIT. This causes the underlying scan to finish earlier. +select * FROM test_mat_small as t1 left outer join test_mat_large AS t2 on t1.i1=t2.i2 limit 10; +select n - (select count (distinct gp_segment_id) from test_mat_small) as difference +from num_workfiles_created($$ + explain analyze + select * FROM test_mat_small as t1 left outer join test_mat_large AS t2 on t1.i1=t2.i2 limit 10 +$$) as n; + +drop schema materialize_spill cascade; + +-- start_ignore +RESET ROLE; +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sisc_mat_sort.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sisc_mat_sort.sql new file mode 100644 index 00000000000..35ff681a3d3 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sisc_mat_sort.sql @@ -0,0 +1,101 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema sisc_mat_sort; +set search_path to sisc_mat_sort; + +-- start_ignore +create language plpython3u; +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function sisc_mat_sort.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'Work_mem used' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; + +create table testsiscm (i1 int, i2 int, i3 int, i4 int); +insert into testsiscm select i, i % 1000, i % 100000, i % 75 from + (select generate_series(1, nsegments * 150000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH +(concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=3); +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +SET ROLE TO role1_memory_test; + + +set gp_resgroup_print_operator_memory_limits=on; +set gp_cte_sharing=on; +set gp_enable_mk_sort=on; +-- The expected output is very sensitive to the kind of plan this produces. +-- We're testing the executor, not the planner, so force ORCA off, to get +-- the particular plan +set optimizer=off; + +select count(*) from (with ctesisc as + (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) +select * +from ctesisc as t1, ctesisc as t2 +where t1.c1 = t2.c1 and t1.c3 = t2.c3) foo; +select * from sisc_mat_sort.is_workfile_created('explain analyze +with ctesisc as + (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) +select * +from ctesisc as t1, ctesisc as t2 +where t1.c1 = t2.c1 and t1.c3 = t2.c3;'); +select * from sisc_mat_sort.is_workfile_created('explain analyze +with ctesisc as + (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) +select * +from ctesisc as t1, ctesisc as t2 +where t1.c1 = t2.c1 and t1.c3 = t2.c3 limit 50000;'); + +set gp_enable_mk_sort=off; +select count(*) from (with ctesisc as + (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) +select * +from ctesisc as t1, ctesisc as t2 +where t1.c1 = t2.c1 and t1.c3 = t2.c3) foo; +select * from sisc_mat_sort.is_workfile_created('explain analyze +with ctesisc as + (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) +select * +from ctesisc as t1, ctesisc as t2 +where t1.c1 = t2.c1 and t1.c3 = t2.c3;'); +select * from sisc_mat_sort.is_workfile_created('explain analyze +with ctesisc as + (select count(i1) as c1, i2 as c2, i3 as c3 from testsiscm group by i2, i3) +select * +from ctesisc as t1, ctesisc as t2 +where t1.c1 = t2.c1 and t1.c3 = t2.c3 limit 50000;'); + +drop schema sisc_mat_sort cascade; + +-- start_ignore +RESET ROLE; +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sisc_sort_spill.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sisc_sort_spill.sql new file mode 100644 index 00000000000..673a11c4ca9 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sisc_sort_spill.sql @@ -0,0 +1,105 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema sisc_sort_spill; +set search_path to sisc_sort_spill; + +-- start_ignore +create language plpython3u; +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function sisc_sort_spill.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'Work_mem used' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; + +create table testsisc (i1 int, i2 int, i3 int, i4 int); +insert into testsisc select i, i % 1000, i % 100000, i % 75 from + (select generate_series(1, nsegments * 50000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH +(concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=2); +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +SET ROLE TO role1_memory_test; + +set gp_resgroup_print_operator_memory_limits=on; +set gp_cte_sharing=on; +-- ORCA optimizes away the ORDER BY in our test query, and therefore doesn't exercise +-- a Sort that spills. +set optimizer=off; + +set gp_enable_mk_sort=on; +select avg(i3) from ( + with ctesisc as (select * from testsisc order by i2) + select t1.i3, t2.i2 + from ctesisc as t1, ctesisc as t2 + where t1.i1 = t2.i2 +) foo; + +select * from sisc_sort_spill.is_workfile_created('explain analyze + with ctesisc as (select * from testsisc order by i2) + select t1.i3, t2.i2 + from ctesisc as t1, ctesisc as t2 + where t1.i1 = t2.i2 +;'); +select * from sisc_sort_spill.is_workfile_created('explain analyze + with ctesisc as (select * from testsisc order by i2) + select t1.i3, t2.i2 + from ctesisc as t1, ctesisc as t2 + where t1.i1 = t2.i2 +limit 50000;'); + + +set gp_enable_mk_sort=off; +select avg(i3) from ( + with ctesisc as (select * from testsisc order by i2) + select t1.i3, t2.i2 + from ctesisc as t1, ctesisc as t2 + where t1.i1 = t2.i2 +) foo; + +select * from sisc_sort_spill.is_workfile_created('explain analyze + with ctesisc as (select * from testsisc order by i2) + select t1.i3, t2.i2 + from ctesisc as t1, ctesisc as t2 + where t1.i1 = t2.i2 +;'); + +select * from sisc_sort_spill.is_workfile_created('explain analyze + with ctesisc as (select * from testsisc order by i2) + select t1.i3, t2.i2 + from ctesisc as t1, ctesisc as t2 + where t1.i1 = t2.i2 +limit 50000;'); + +drop schema sisc_sort_spill cascade; + +-- start_ignore +RESET ROLE; +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sort_spill.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sort_spill.sql new file mode 100644 index 00000000000..bf36a9d7a7b --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_sort_spill.sql @@ -0,0 +1,68 @@ +-- start_matchsubs +-- m/INSERT \d+/ +-- s/INSERT \d+/INSERT/ +-- end_matchsubs +create schema sort_spill; +set search_path to sort_spill; + +-- start_ignore +create language plpython3u; +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function sort_spill.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'Work_mem used' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((seg[\d]+).+ Workfile: \(([\d+]) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; + + +create table testsort (i1 int, i2 int, i3 int, i4 int); +insert into testsort select i, i % 1000, i % 100000, i % 75 from + (select generate_series(1, nsegments * 50000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= 0) foo) bar; + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH +(concurrency=2, cpu_rate_limit=10, memory_limit=30, memory_shared_quota=0, memory_spill_ratio=1); +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +SET ROLE TO role1_memory_test; + +set gp_resgroup_print_operator_memory_limits=on; + +set gp_enable_mk_sort=on; +select avg(i2) from (select i1,i2 from testsort order by i2) foo; +select * from sort_spill.is_workfile_created('explain analyze select i1,i2 from testsort order by i2;'); +select * from sort_spill.is_workfile_created('explain analyze select i1,i2 from testsort order by i2 limit 50000;'); + +set gp_enable_mk_sort=off; +select avg(i2) from (select i1,i2 from testsort order by i2) foo; +select * from sort_spill.is_workfile_created('explain analyze select i1,i2 from testsort order by i2;'); +select * from sort_spill.is_workfile_created('explain analyze select i1,i2 from testsort order by i2 limit 50000;'); + +drop schema sort_spill cascade; + +-- start_ignore +RESET ROLE; +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_spilltodisk.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_spilltodisk.sql new file mode 100644 index 00000000000..eba39b45037 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_memory_spilltodisk.sql @@ -0,0 +1,70 @@ +-- up the admin_group memory limits +ALTER RESOURCE GROUP admin_group SET memory_limit 30; + +-- Test Mark/Restore in Material Node +create table spilltest1 (a integer); +create table spilltest2 (a integer); +insert into spilltest1 select a from generate_series(1,400000) a; +insert into spilltest2 select a from generate_series(1,400000) a; + +-- go back to the default admin_group limit +ALTER RESOURCE GROUP admin_group SET memory_limit 10; + +-- start_ignore +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore +CREATE RESOURCE GROUP rg1_memory_test WITH +(concurrency=2, cpu_rate_limit=10, memory_limit=60, memory_shared_quota=0, memory_spill_ratio=10); +CREATE ROLE role1_memory_test SUPERUSER RESOURCE GROUP rg1_memory_test; +SET ROLE TO role1_memory_test; + +set enable_hashagg=off; +set enable_mergejoin=on; +set enable_hashjoin=off; +set enable_nestloop=off; + +create temporary table spilltestresult1 as +select t1.a as t1a, t2.a as t2a +from (select a from spilltest1 group by a) t1, + (select a from spilltest2 group by a) t2 +where t1.a = t2.a; + +-- check that the result looks sane +select count(*), sum(t1a), sum(t2a), sum(t1a - t2a) from spilltestresult1; + +-- Test Hash Aggregation when the work mem is too small for the hash table +create table spilltest (a integer, b integer); +insert into spilltest select a, a%25 from generate_series(1,8000) a; +analyze; +set enable_hashagg=on; +set enable_groupagg=off; + +select b,count(*) from spilltest group by b order by b; + +select b,count(*) from spilltest group by b order by b; +-- Test Hash Join when the work mem is too small for the hash table +drop table if exists spilltest; +create table spilltest (a integer, b integer); +insert into spilltest select a, a%25 from generate_series(1,800000) a; +analyze; -- We have to do an analyze to force a hash join +set enable_mergejoin=off; +set enable_nestloop=off; +set enable_hashjoin=on; + +create temporary table spilltestresult2 as +select t1.a as t1a, t1.b as t1b, t2.a as t2a, t2.b as t2b from spilltest t1, spilltest t2 where t1.a = t2.a; +-- check that the result looks sane +select count(*), sum(t1a), sum(t2a), sum(t2a), sum(t2b), sum(t1a * t1b) from spilltestresult2; + +drop table spilltest1; +drop table spilltest2; +drop table spilltest; +drop table spilltestresult1; +drop table spilltestresult2; + +-- start_ignore +RESET ROLE; +DROP ROLE IF EXISTS role1_memory_test; +DROP RESOURCE GROUP rg1_memory_test; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_name_convention.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_name_convention.sql new file mode 100644 index 00000000000..662128bad35 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_name_convention.sql @@ -0,0 +1,219 @@ +-- +-- Test the resource group name convention. +-- +-- Resource group names follow the general object name convention: +-- https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS +-- +-- Besides that there are 3 reserved names: +-- * default_group, admin_group: names of the 2 default resource groups; +-- * none: a special name usually used in ALTER ROLE command to reset +-- to the proper default resource group; +-- +-- This case is put under isolation2 dir as other resource group cases, +-- although it does not require any extended feature of the isolation2 +-- test framework. +-- + +-- +-- setup +-- + +CREATE OR REPLACE VIEW rg_name_view AS + SELECT S.rsgname, 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' + ORDER BY C.groupid; + +-- TODO: need to cleanup all existing resgroups + +-- +-- positive +-- + +-- by default resgroup names have the form of [_a-zA-Z][_a-zA-Z0-9]* +CREATE RESOURCE GROUP rgNameTest01 WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP rgNameTest01 SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP rgNameTest01; +CREATE RESOURCE GROUP __rg_name_test_01__ WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP __rg_name_test_01__ SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP __rg_name_test_01__; + +-- min length is 1 character +CREATE RESOURCE GROUP Z WITH (cpu_rate_limit=10, memory_limit=10); +DROP RESOURCE GROUP Z; + +-- max length is 63 characters +CREATE RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789 WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789 SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789; +-- characters exceed the max length are ignored +CREATE RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789further WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789are SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789ignored; + +-- 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_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "newlines +s p a c e s +t a b s" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "newlines +s p a c e s +t a b s"; +-- punctuations +CREATE RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~"; +-- quotation marks +CREATE RESOURCE GROUP "'' are 2 single quotation marks" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "'' are 2 single quotation marks" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "'' are 2 single quotation marks"; +CREATE RESOURCE GROUP """ is 1 double quotation mark" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP """ is 1 double quotation mark" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP """ is 1 double quotation mark"; + +-- nothing special with leading character +CREATE RESOURCE GROUP "0 as prefix" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "0 as prefix" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "0 as prefix"; +CREATE RESOURCE GROUP " leading space" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP " leading space" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP " leading space"; + +-- backslash is not used as the escape character +CREATE RESOURCE GROUP "\\ are two backslashes" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "\\ are two backslashes" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "\\ are two backslashes"; +-- below are octal, hex and unicode representations of "rg1" +CREATE RESOURCE GROUP "\o162\o147\o61" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP "\x72\x67\x31" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP "\u0072\u0067\u0031" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "\o162\o147\o61" SET concurrency 2; +ALTER RESOURCE GROUP "\x72\x67\x31" SET concurrency 2; +ALTER RESOURCE GROUP "\u0072\u0067\u0031" SET concurrency 2; +SELECT * FROM rg_name_view; +-- but as \o, \x and \u are not supported, +-- so they are just 3 different names, +-- none of them equals to "rg1". +DROP RESOURCE GROUP "rg1"; +DROP RESOURCE GROUP "\o162\o147\o61"; +DROP RESOURCE GROUP "\x72\x67\x31"; +DROP RESOURCE GROUP "\u0072\u0067\u0031"; + +-- unicode escapes are supported +CREATE RESOURCE GROUP U&"\0441\043B\043E\043D" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP U&"\0441\043B\043E\043D" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP U&"\0441\043B\043E\043D"; +-- unicode representation of "rg1" +CREATE RESOURCE GROUP U&"\0072\0067\0031" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "rg1" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "rg1"; + +-- CJK characters are allowed with or without double quotation marks +CREATE RESOURCE GROUP 资源组 WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "资源组" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP 资源组; +CREATE RESOURCE GROUP リソース・グループ WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "リソース・グループ" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP リソース・グループ; +CREATE RESOURCE GROUP 자원그룹 WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "자원그룹" SET concurrency 2; +SELECT * FROM rg_name_view; +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_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP rg_Name_Test WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP "rg_name_test" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP Rg_NaMe_TeSt SET concurrency 2; +ALTER RESOURCE GROUP "RG_NAME_TEST" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "RG_NAME_TEST"; +DROP RESOURCE GROUP RG_nAME_tEST; + +-- 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_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "None" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "None"; +CREATE RESOURCE GROUP "NONE" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "NONE" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "NONE"; +CREATE RESOURCE GROUP "DEFAULT_GROup" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "DEFAULT_GROup" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "DEFAULT_GROup"; +CREATE RESOURCE GROUP "ADMIN_GROUP" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "ADMIN_GROUP" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "ADMIN_GROUP"; + +CREATE RESOURCE GROUP "with" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "with" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "with"; +CREATE RESOURCE GROUP "WITH" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "WITH" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "WITH"; +CREATE RESOURCE GROUP "group" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "group" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "group"; +CREATE RESOURCE GROUP "create" WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP "create" SET concurrency 2; +SELECT * FROM rg_name_view; +DROP RESOURCE GROUP "create"; + +-- +-- negative +-- + +-- does not support single quotation marks around the name +CREATE RESOURCE GROUP 'must_fail' WITH (cpu_rate_limit=10, memory_limit=10); + +-- does not support leading numbers +CREATE RESOURCE GROUP 0_must_fail WITH (cpu_rate_limit=10, memory_limit=10); + +-- reserved names are not allowed even with double quotation marks +CREATE RESOURCE GROUP "default_group" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP "admin_group" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP "none" WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP default_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP admin_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP none WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP DEFAULT_GROUP WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP Admin_Group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP NONE WITH (cpu_rate_limit=10, memory_limit=10); + +-- keywords are not allowed without quotation marks +CREATE RESOURCE GROUP with WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP WITH WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP CREATE WITH (cpu_rate_limit=10, memory_limit=10); + +-- min length is 1 character +CREATE RESOURCE GROUP "" WITH (cpu_rate_limit=10, memory_limit=10); + diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_operator_memory.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_operator_memory.sql new file mode 100644 index 00000000000..06227192cf4 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_operator_memory.sql @@ -0,0 +1,193 @@ +SET optimizer TO off; + +-- +-- setup +-- + +--start_ignore +DROP VIEW IF EXISTS many_ops; +DROP ROLE r1_opmem_test; +DROP RESOURCE GROUP rg1_opmem_test; +DROP RESOURCE GROUP rg2_opmem_test; +CREATE LANGUAGE plpython3u; +--end_ignore + +-- a helper function to run query via SPI +CREATE OR REPLACE FUNCTION f1_opmem_test() RETURNS void AS $$ + plpy.execute("""select * from gp_dist_random('gp_id')""") +$$ LANGUAGE plpython3u; + +-- this view contains many operators in the plan, which is used to trigger +-- the issue. gp_toolkit.gp_resgroup_config is a large JOIN view of many +-- relations, to prevent the source relations being optimized out from the plan +-- we have to keep the columns provided by them in the target list, instead of +-- composing a long SELECT c1,c2,... list we use SELECT * here, but we should +-- not output the groupid as it changes each time. +-- +-- hashagg may not work with a small operator memory, so we use UNION ALL +-- instead of UNION to prevent putting a hashagg on top of the append node, +-- and we use a always-false WHERE condition to prevent too much output. +CREATE OR REPLACE VIEW many_ops AS + SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +UNION ALL SELECT * FROM gp_toolkit.gp_resgroup_config WHERE groupid=0 +; + +-- we must ensure spill to be small enough but still > 0. +-- - rg1's memory quota is 682 * 1% = 6; +-- - per-xact quota is 6/3=2; +-- - spill memory is 2 * 60% = 1; +CREATE RESOURCE GROUP rg1_opmem_test + WITH (cpu_rate_limit=10, memory_limit=1, memory_shared_quota=0, + concurrency=3, memory_spill_ratio=60); + +CREATE ROLE r1_opmem_test RESOURCE GROUP rg1_opmem_test; +GRANT ALL ON many_ops TO r1_opmem_test; + +-- rg1 has very low per-xact memory quota, there will be no enough operator +-- memory reserved, however in resource group mode we assign at least 100KB to +-- each operator, no matter it is memory intensive or not. As long as there is +-- enough shared memory the query should be executed successfully. + +-- +-- positive: there is enough global shared memory +-- + +SET gp_resgroup_memory_policy TO none; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +SET gp_resgroup_memory_policy TO eager_free; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +SET gp_resgroup_memory_policy TO auto; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +-- +-- negative: there is not enough shared memory +-- + +-- rg1 has no group level shared memory, and most memory are granted to rg2, +-- there is only very little global shared memory due to integer rounding. +CREATE RESOURCE GROUP rg2_opmem_test + WITH (cpu_rate_limit=10, memory_limit=59); + +-- this query can execute but will raise OOM error. + +SET gp_resgroup_memory_policy TO none; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +SET gp_resgroup_memory_policy TO eager_free; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +SET gp_resgroup_memory_policy TO auto; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +-- +-- positive: there is enough group shared memory +-- + +ALTER RESOURCE GROUP rg2_opmem_test SET memory_limit 40; +ALTER RESOURCE GROUP rg1_opmem_test SET memory_limit 20; +ALTER RESOURCE GROUP rg1_opmem_test SET memory_shared_quota 100; +ALTER RESOURCE GROUP rg1_opmem_test SET memory_spill_ratio 20; + +SET gp_resgroup_memory_policy TO none; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +SET gp_resgroup_memory_policy TO eager_free; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +SET gp_resgroup_memory_policy TO auto; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +-- +-- positive: the spill memory is large enough, no adjustment is needed +-- + +DROP RESOURCE GROUP rg2_opmem_test; +ALTER RESOURCE GROUP rg1_opmem_test SET memory_limit 40; +ALTER RESOURCE GROUP rg1_opmem_test SET memory_shared_quota 50; +ALTER RESOURCE GROUP rg1_opmem_test SET memory_spill_ratio 30; +ALTER RESOURCE GROUP rg1_opmem_test SET concurrency 1; + +SET gp_resgroup_memory_policy TO none; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +SET gp_resgroup_memory_policy TO eager_free; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +SET gp_resgroup_memory_policy TO auto; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +RESET role; + +-- +-- positive: when spill memory is zero, work memory is used +-- + +ALTER RESOURCE GROUP rg1_opmem_test SET memory_spill_ratio 0; + +SET gp_resgroup_memory_policy TO none; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +SELECT f1_opmem_test(); +RESET role; + +SET gp_resgroup_memory_policy TO eager_free; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +SELECT f1_opmem_test(); +RESET role; + +SET gp_resgroup_memory_policy TO auto; +SET ROLE TO r1_opmem_test; +SELECT * FROM many_ops; +SELECT f1_opmem_test(); +RESET role; + +-- +-- cleanup +-- + +DROP VIEW many_ops; +DROP ROLE r1_opmem_test; +DROP RESOURCE GROUP rg1_opmem_test; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_parallel_queries.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_parallel_queries.sql new file mode 100644 index 00000000000..a0748913dd1 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_parallel_queries.sql @@ -0,0 +1,286 @@ +-- start_matchsubs +-- m/ERROR: tuple concurrently updated \(heapam\.c\:\d+\)/ +-- s/\(heapam\.c:\d+\)// +-- end_matchsubs +CREATE EXTENSION dblink; + +-- This function execute commands N times. +-- % in command will be replaced by number specified by range1 sequentially +-- # in command will be replaced by number specified by range2 randomly +-- range, eg: 1-10 +-- Notice: now it only support SELECT statement return single integer +CREATE or replace FUNCTION exec_commands_n /*in func*/ + (dl_name text, command1 text, /*in func*/ + command2 text, command3 text, /*in func*/ + times integer, range1 text, range2 text, fail_on_error bool) /*in func*/ +RETURNS integer AS $$ /*in func*/ +DECLARE /*in func*/ + cmd text; /*in func*/ + res int; /*in func*/ + s_r1 int; /*in func*/ + e_r1 int; /*in func*/ + s_r2 int; /*in func*/ + e_r2 int; /*in func*/ +BEGIN /*in func*/ + s_r1 = 0; /*in func*/ + e_r1 = 0; /*in func*/ + s_r2 = 0; /*in func*/ + e_r2 = 0; /*in func*/ + IF length(range1) > 0 THEN /*in func*/ + select t[1]::int, t[2]::int into s_r1, e_r1 from regexp_split_to_array(range1, '-') t; /*in func*/ + END IF; /*in func*/ + IF length(range2) > 0 THEN /*in func*/ + select t[1]::int, t[2]::int into s_r2, e_r2 from regexp_split_to_array(range2, '-') t; /*in func*/ + END IF; /*in func*/ + FOR i IN 0..(times - 1) LOOP /*in func*/ + IF length(command1) > 0 THEN /*in func*/ + cmd = regexp_replace(command1, '%', (s_r1 + i % (e_r1 - s_r1 + 1))::text, 'g'); /*in func*/ + cmd = regexp_replace(cmd, '#', (s_r2 + ((random()*100)::int) % (e_r2 - s_r2 + 1))::text, 'g'); /*in func*/ + RAISE NOTICE '%', cmd; /*in func*/ + IF lower(cmd) like 'select %' THEN /*in func*/ + select * into res from dblink(dl_name, cmd, fail_on_error) t(c1 integer); /*in func*/ + ELSE /*in func*/ + perform dblink_exec(dl_name, cmd , fail_on_error); /*in func*/ + END IF; /*in func*/ + END IF; /*in func*/ + IF length(command2) > 0 THEN /*in func*/ + cmd = regexp_replace(command2, '%', (s_r1 + i % (e_r1 - s_r1 + 1))::text, 'g'); /*in func*/ + cmd = regexp_replace(cmd, '#', (s_r2 + ((random()*100)::int) % (e_r2 - s_r2 + 1))::text, 'g'); /*in func*/ + RAISE NOTICE '%', cmd; /*in func*/ + IF lower(cmd) like 'select %' THEN /*in func*/ + select * into res from dblink(dl_name, cmd, fail_on_error) t(c1 integer); /*in func*/ + ELSE /*in func*/ + perform dblink_exec(dl_name, cmd, fail_on_error); /*in func*/ + END IF; /*in func*/ + END IF; /*in func*/ + IF length(command3) > 0 THEN /*in func*/ + cmd = regexp_replace(command3, '%', (s_r1 + i % (e_r1 - s_r1 + 1))::text, 'g'); /*in func*/ + cmd = regexp_replace(cmd, '#', (s_r2 + ((random()*100)::int) % (e_r2 - s_r2 + 1))::text, 'g'); /*in func*/ + RAISE NOTICE '%', cmd; /*in func*/ + IF lower(cmd) like 'select %' THEN /*in func*/ + select * into res from dblink(dl_name, cmd, fail_on_error) t(c1 integer); /*in func*/ + ELSE /*in func*/ + perform dblink_exec(dl_name, cmd, fail_on_error); /*in func*/ + END IF; /*in func*/ + END IF; /*in func*/ + END LOOP; /*in func*/ + return times; /*in func*/ +END;$$ /*in func*/ +LANGUAGE 'plpgsql'; + +-- +-- DDLs vs DDLs +-- +1:select dblink_connect('dblink_rg_test1', 'dbname=isolation2resgrouptest'); +2:select dblink_connect('dblink_rg_test2', 'dbname=isolation2resgrouptest'); +3:select dblink_connect('dblink_rg_test3', 'dbname=isolation2resgrouptest'); +4:select dblink_connect('dblink_rg_test4', 'dbname=isolation2resgrouptest'); +5:select dblink_connect('dblink_rg_test5', 'dbname=isolation2resgrouptest'); +6:select dblink_connect('dblink_rg_test6', 'dbname=isolation2resgrouptest'); + +1>:select exec_commands_n('dblink_rg_test1','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set concurrency #', 60, '', '1-6', false); +2>:select exec_commands_n('dblink_rg_test2','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set concurrency#', 60, '', '1-6', false); +3>:select exec_commands_n('dblink_rg_test3','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set cpu_rate_limit #', 60, '', '1-6', false); +4>:select exec_commands_n('dblink_rg_test4','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set memory_limit #', 60, '', '1-6', false); +5>:select exec_commands_n('dblink_rg_test5','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set memory_shared_quota #', 60, '', '1-6', false); +6>:select exec_commands_n('dblink_rg_test6','CREATE RESOURCE GROUP rg_test_g# WITH (concurrency=#, cpu_rate_limit=#, memory_limit=#)', 'DROP RESOURCE GROUP rg_test_g#', 'ALTER RESOURCE GROUP rg_test_g# set memory_limit #', 60, '', '1-6', false); + +1<: +2<: +3<: +4<: +5<: +6<: + +1: select dblink_disconnect('dblink_rg_test1'); +2: select dblink_disconnect('dblink_rg_test2'); +3: select dblink_disconnect('dblink_rg_test3'); +4: select dblink_disconnect('dblink_rg_test4'); +5: select dblink_disconnect('dblink_rg_test5'); +6: select dblink_disconnect('dblink_rg_test6'); + + +1q: +2q: +3q: +4q: +5q: +6q: +-- +-- DDLs vs DMLs +-- +-- Prepare resource groups and roles and tables +create table rg_test_foo as select i as c1, i as c2 from generate_series(1,1000) i; +create table rg_test_bar as select i as c1, i as c2 from generate_series(1,1000) i; +grant all on rg_test_foo to public; +grant all on rg_test_bar to public; + +-- start_ignore +select dblink_connect('dblink_rg_test', 'dbname=isolation2resgrouptest'); +select exec_commands_n('dblink_rg_test','DROP ROLE rg_test_r%', '', '', 7, '1-7', '', false); +select exec_commands_n('dblink_rg_test','DROP RESOURCE GROUP rg_test_g%', '', '', 7, '1-7', '', false); +-- end_ignore + +-- create 6 roles and 6 resource groups +select exec_commands_n('dblink_rg_test','CREATE RESOURCE GROUP rg_test_g% WITH (concurrency=9, cpu_rate_limit=1, memory_limit=7)', '', '', 6, '1-6', '', true); +select exec_commands_n('dblink_rg_test','CREATE ROLE rg_test_r% login resource group rg_test_g%;', '', '', 6, '1-6', '', true); +select exec_commands_n('dblink_rg_test','GRANT ALL ON rg_test_foo to rg_test_r%;', '', '', 6, '1-6', '', true); +select exec_commands_n('dblink_rg_test','GRANT ALL ON rg_test_bar to rg_test_r%;', '', '', 6, '1-6', '', true); + +select dblink_disconnect('dblink_rg_test'); + +select groupname, concurrency, cpu_rate_limit from gp_toolkit.gp_resgroup_config where groupname like 'rg_test_g%' order by groupname; + +-- +-- 2* : DMLs +-- +-- start 6 session to concurrently change resource group and run simple queries randomly +-- BEGIN/END +21: select dblink_connect('dblink_rg_test21', 'dbname=isolation2resgrouptest'); +21>: select exec_commands_n('dblink_rg_test21', 'set role rg_test_r#', 'BEGIN', 'END', 24000, '', '1-6', true); +-- BEGIN/ABORT +22: select dblink_connect('dblink_rg_test22', 'dbname=isolation2resgrouptest'); +22>: select exec_commands_n('dblink_rg_test22', 'set role rg_test_r#', 'BEGIN', 'ABORT', 24000, '', '1-6', true); +-- query with memory sensitive node +23: select dblink_connect('dblink_rg_test23', 'dbname=isolation2resgrouptest'); +23>: select exec_commands_n('dblink_rg_test23', 'set role rg_test_r#', 'insert into rg_test_foo values (#, #)', 'select count(*) from rg_test_bar t1, rg_test_foo t2 where t1.c2=t2.c2 group by t1.c2', 3000, '', '1-6', true); +-- high cpu +24: select dblink_connect('dblink_rg_test24', 'dbname=isolation2resgrouptest'); +24>: select exec_commands_n('dblink_rg_test24', 'set role rg_test_r#', 'insert into rg_test_bar values (#, #)', 'select count(*) from rg_test_bar where c2! = 1000', 60, '', '1-6', true); +-- simple select +25: select dblink_connect('dblink_rg_test25', 'dbname=isolation2resgrouptest'); +25>: select exec_commands_n('dblink_rg_test25', 'set role rg_test_r#', 'select count(*) from rg_test_foo', 'select count(*) from rg_test_bar', 6000, '', '1-6', true); +-- vacuum +26: select dblink_connect('dblink_rg_test26', 'dbname=isolation2resgrouptest'); +26>: select exec_commands_n('dblink_rg_test26', 'set role rg_test_r#', 'vacuum rg_test_bar', 'vacuum rg_test_foo', 6000, '', '1-6', true); + +-- +-- 3* : Alter groups +-- +-- start a new session to alter concurrency randomly +31: select dblink_connect('dblink_rg_test31', 'dbname=isolation2resgrouptest'); +31>: select exec_commands_n('dblink_rg_test31', 'alter resource group rg_test_g% set concurrency #', 'select 1 from pg_sleep(0.1)', '', 1000, '1-6', '0-5', true); + +-- start a new session to alter cpu_rate_limit randomly +32: select dblink_connect('dblink_rg_test32', 'dbname=isolation2resgrouptest'); +32>: select exec_commands_n('dblink_rg_test32', 'alter resource group rg_test_g% set cpu_rate_limit #', 'select 1 from pg_sleep(0.1)', '', 1000, '1-6', '1-6', true); + +-- start a new session to alter memory_limit randomly +33: select dblink_connect('dblink_rg_test33', 'dbname=isolation2resgrouptest'); +33>: select exec_commands_n('dblink_rg_test33', 'alter resource group rg_test_g% set memory_limit #', 'select 1 from pg_sleep(0.1)', '', 1000, '1-6', '1-7', true); + +-- start a new session to alter memory_shared_quota randomly +34: select dblink_connect('dblink_rg_test34', 'dbname=isolation2resgrouptest'); +34>: select exec_commands_n('dblink_rg_test34', 'alter resource group rg_test_g% set memory_shared_quota #', 'select 1 from pg_sleep(0.1)', '', 1000, '1-6', '1-80', true); + +-- +-- 4* : CREATE/DROP tables & groups +-- +-- start a new session to create and drop table, it will cause massive catchup interrupt. +41: select dblink_connect('dblink_rg_test41', 'dbname=isolation2resgrouptest'); +41>: select exec_commands_n('dblink_rg_test41', 'drop table if exists rg_test_t%', 'create table rg_test_t% (c1 int, c2 int)' ,'', 3000, '1-6', '', true); + +-- start a new session to create & drop resource group +42: select dblink_connect('dblink_rg_test42', 'dbname=isolation2resgrouptest'); +42>: select exec_commands_n('dblink_rg_test42', 'create resource group rg_test_g7 with (cpu_rate_limit=1, memory_limit=1)', 'drop resource group rg_test_g7', '', 1000, '', '', true); + +31<: +31: select exec_commands_n('dblink_rg_test31', 'alter resource group rg_test_g% set concurrency #', 'select 1 from pg_sleep(0.1)', '', 6, '1-6', '1-5', true); + +-- start a new session to acquire the status of resource groups +44: select dblink_connect('dblink_rg_test44', 'dbname=isolation2resgrouptest'); +44>: select exec_commands_n('dblink_rg_test44', 'select count(*) from gp_toolkit.gp_resgroup_status;', '', '', 100, '', '', true); + +-- wait all sessions to finish +21<: +22<: +23<: +24<: +25<: +26<: +32<: +33<: +34<: +41<: +42<: +44<: + +21: select dblink_disconnect('dblink_rg_test21'); +22: select dblink_disconnect('dblink_rg_test22'); +23: select dblink_disconnect('dblink_rg_test23'); +24: select dblink_disconnect('dblink_rg_test24'); +25: select dblink_disconnect('dblink_rg_test25'); +26: select dblink_disconnect('dblink_rg_test26'); +31: select dblink_disconnect('dblink_rg_test31'); +32: select dblink_disconnect('dblink_rg_test32'); +33: select dblink_disconnect('dblink_rg_test33'); +34: select dblink_disconnect('dblink_rg_test34'); +41: select dblink_disconnect('dblink_rg_test41'); +42: select dblink_disconnect('dblink_rg_test42'); +44: select dblink_disconnect('dblink_rg_test44'); + +21q: +22q: +23q: +24q: +25q: +26q: +31q: +32q: +33q: +34q: +41q: +42q: + +select groupname, concurrency::int < 7, cpu_rate_limit::int < 7 from gp_toolkit.gp_resgroup_config where groupname like 'rg_test_g%' order by groupname; + +-- Beacuse concurrency of each resource group is changed between 1..6, so the num_queued must be larger than 0 +select num_queued > 0 from gp_toolkit.gp_resgroup_status where rsgname like 'rg_test_g%' order by rsgname; + +-- After all queries finished in each resource group, the memory_usage should be zero, no memory leak +with t_1 as +( + select rsgname, row_to_json(json_each(memory_usage::json)) as j from gp_toolkit.gp_resgroup_status where rsgname like 'rg_test_g%' order by rsgname +) +select rsgname, sum(((j->'value')->>'used')::int) from t_1 group by rsgname ; + +-- start_ignore +drop table rg_test_foo; +drop table rg_test_bar; +select dblink_connect('dblink_rg_test', 'dbname=isolation2resgrouptest'); +select exec_commands_n('dblink_rg_test','DROP ROLE rg_test_r%', '', '', 6, '1-6', '', true); +select exec_commands_n('dblink_rg_test','DROP RESOURCE GROUP rg_test_g%', '', '', 6, '1-6', '', true); +select dblink_disconnect('dblink_rg_test'); +-- end_ignore + +-- +-- 5*: Test connections in utility mode are not governed by resource group +-- +create resource group rg_test_g8 with (concurrency= 1, cpu_rate_limit=1, memory_limit=1); +create role rg_test_r8 login resource group rg_test_g8; +51:select dblink_connect('dblink_rg_test51', 'dbname=isolation2resgrouptest user=rg_test_r8 options=''-c gp_role=utility'''); +52:select dblink_connect('dblink_rg_test52', 'dbname=isolation2resgrouptest user=rg_test_r8 options=''-c gp_role=utility'''); +53:select dblink_connect('dblink_rg_test53', 'dbname=isolation2resgrouptest user=rg_test_r8 options=''-c gp_role=utility'''); + +51>:select exec_commands_n('dblink_rg_test51', 'select 1', 'begin', 'end', 100, '', '', true); +51<: +52>:select exec_commands_n('dblink_rg_test52', 'select 1', 'select 1', 'select 1', 100, '', '', true); +52<: +53>:select exec_commands_n('dblink_rg_test53', 'select 1', 'begin', 'abort', 100, '', '', true); +53<: + +51: select dblink_disconnect('dblink_rg_test51'); +52: select dblink_disconnect('dblink_rg_test52'); +53: select dblink_disconnect('dblink_rg_test53'); + +51q: +52q: +53q: + +-- num_executed and num_queued must be zero +select num_queued, num_executed from gp_toolkit.gp_resgroup_status where rsgname = 'rg_test_g8'; +drop role rg_test_r8; +drop resource group rg_test_g8; + +-- clean up +select * from gp_toolkit.gp_resgroup_config; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_recreate.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_recreate.sql new file mode 100644 index 00000000000..d49bbd3025b --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_recreate.sql @@ -0,0 +1,24 @@ +-- start_ignore +DROP ROLE IF EXISTS r1; +DROP RESOURCE GROUP rg1; +-- end_ignore + +CREATE RESOURCE GROUP rg1 WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=50, memory_shared_quota=0); +CREATE ROLE r1 RESOURCE GROUP rg1; + +1: SET ROLE r1; +1: BEGIN; +1: END; + +ALTER ROLE r1 RESOURCE GROUP none; +DROP RESOURCE GROUP rg1; +CREATE RESOURCE GROUP rg1 WITH (concurrency=2, cpu_rate_limit=10, + memory_limit=50, memory_shared_quota=0); +ALTER ROLE r1 RESOURCE GROUP rg1; + +1: BEGIN; +1: END; + +DROP ROLE r1; +DROP RESOURCE GROUP rg1; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_seg_down_2pc.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_seg_down_2pc.sql new file mode 100644 index 00000000000..dc74ee25cb7 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_seg_down_2pc.sql @@ -0,0 +1,54 @@ +-- This test performs segment reconfiguration when "alter resource group" is executed in the two phase commit. +-- The steps are, when run "alter resource group", before QD broadcasts commit prepared command to QEs(the +-- second phase of 2PC), we trigger an error and cause one primary segment down. +-- 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. + +-- 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 system set gp_fts_probe_retries to 0; +select pg_reload_conf(); + +1:create resource group rgroup_seg_down with (CPU_RATE_LIMIT=35, MEMORY_LIMIT=35, CONCURRENCY=10); + +-- 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; +-- this session will pend here since the above injected fault +1&:alter resource group rgroup_seg_down set CONCURRENCY 20; +-- this injected fault can make dispatcher think the primary is down +2:select gp_inject_fault('fts_conn_startup_packet', 'error', dbid) from gp_segment_configuration where role='p' and content=0; +2:select gp_request_fts_probe_scan(); +-- make sure one primary segment is down. +2:select status = 'd' from gp_segment_configuration where content = 0 and role = 'm'; +-- reset the injected fault on QD and the "alter resource group" in session1 can continue +2:select gp_inject_fault('dtm_broadcast_commit_prepared', 'reset', dbid) from gp_segment_configuration where role='p' and content=-1; +-- reset the injected fault on primary segment +2:select gp_inject_fault('fts_conn_startup_packet', 'reset', dbid) from gp_segment_configuration where content=0; +1<: +-- make sure "alter resource group" has taken effect. +1:select concurrency from gp_toolkit.gp_resgroup_config where groupname = 'rgroup_seg_down'; +2q: + +!\retcode gprecoverseg -aF --no-progress; + +-- loop while segments come in sync +1:select wait_until_all_segments_synchronized(); + +!\retcode gprecoverseg -ar; + +-- loop while segments come in sync +1:select wait_until_all_segments_synchronized(); + +-- verify no segment is down after recovery +1:select count(*) from gp_segment_configuration where status = 'd'; + +-- verify resource group +1:select concurrency from gp_toolkit.gp_resgroup_config where groupname = 'rgroup_seg_down'; +1:drop resource group rgroup_seg_down; + +1:alter system reset gp_fts_probe_interval; +1:alter system reset gp_fts_probe_retries; +1:select pg_reload_conf(); +1q: + diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_set_memory_spill_ratio.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_set_memory_spill_ratio.sql new file mode 100644 index 00000000000..c29bbde7a0e --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_set_memory_spill_ratio.sql @@ -0,0 +1,83 @@ +-- This query must be the first one in this case. +-- SHOW command will be bypassed in resgroup, when it's the first command +-- in a connection it needs special handling to show memory_spill_ratio +-- correctly. Verify that it shows the correct value 10 instead of default 20. +SHOW memory_spill_ratio; + +--start_ignore +DROP ROLE role1_spill_test; +DROP ROLE role2_spill_test; +DROP RESOURCE GROUP rg1_spill_test; +DROP RESOURCE GROUP rg2_spill_test; +--end_ignore + +CREATE RESOURCE GROUP rg1_spill_test WITH + (CONCURRENCY=10, MEMORY_LIMIT=10, CPU_RATE_LIMIT=10, memory_shared_quota=20, memory_spill_ratio=30); +CREATE RESOURCE GROUP rg2_spill_test WITH + (CONCURRENCY=10, MEMORY_LIMIT=10, CPU_RATE_LIMIT=10, memory_shared_quota=50, memory_spill_ratio=10); +CREATE ROLE role1_spill_test RESOURCE GROUP rg1_spill_test; +CREATE ROLE role2_spill_test RESOURCE GROUP rg2_spill_test; + +-- positive set to resource group level +--start_ignore +SET ROLE role1_spill_test; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; +--end_ignore + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 70; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- positive fallback to statement_mem at session level +SET MEMORY_SPILL_RATIO TO 0; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- negative set to session level +SET MEMORY_SPILL_RATIO TO 101; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 90; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 20; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- reset to resource group level +RESET MEMORY_SPILL_RATIO; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 60; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- change role, positive for session level +SET ROLE role2_spill_test; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- positive set to session level +SET MEMORY_SPILL_RATIO TO 20; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- reset to resource group level +RESET MEMORY_SPILL_RATIO; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +-- cleanup +RESET ROLE; +DROP ROLE role1_spill_test; +DROP ROLE role2_spill_test; +DROP RESOURCE GROUP rg1_spill_test; +DROP RESOURCE GROUP rg2_spill_test; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_syntax.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_syntax.sql new file mode 100644 index 00000000000..3a6a07e3c14 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_syntax.sql @@ -0,0 +1,321 @@ +-- ---------------------------------------------------------------------- +-- Test: assign/alter a role to a resource group +-- ---------------------------------------------------------------------- + +DROP ROLE IF EXISTS rg_test_role; + +-- positive +CREATE ROLE rg_test_role; +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role'; +CREATE ROLE rg_test_role_super SUPERUSER; +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; +ALTER ROLE rg_test_role_super NOSUPERUSER; +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; +ALTER ROLE rg_test_role_super SUPERUSER; +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; + +ALTER ROLE rg_test_role RESOURCE GROUP none; +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role'; +ALTER ROLE rg_test_role_super RESOURCE GROUP none; +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; + +ALTER ROLE rg_test_role RESOURCE GROUP default_group; +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role'; +ALTER ROLE rg_test_role_super RESOURCE GROUP admin_group; +SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; + + +-- negative +ALTER ROLE rg_test_role RESOURCE GROUP non_exist_group; +ALTER ROLE rg_test_role RESOURCE GROUP admin_group; + +CREATE ROLE rg_test_role1 RESOURCE GROUP non_exist_group; +-- nonsuper user should not be assigned to admin group +CREATE ROLE rg_test_role1 RESOURCE GROUP admin_group; + +-- cleanup +DROP ROLE rg_test_role; +DROP ROLE rg_test_role_super; + +-- ---------------------------------------------------------------------- +-- Test: create/drop a resource group +-- ---------------------------------------------------------------------- + +--start_ignore +DROP RESOURCE GROUP rg_test_group; +--end_ignore + +SELECT * FROM gp_toolkit.gp_resgroup_config; + +-- negative + +-- can't create the reserved resource groups +CREATE RESOURCE GROUP default_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP admin_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP none WITH (cpu_rate_limit=10, memory_limit=10); +-- multiple resource groups can't share the same name +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10); +DROP RESOURCE GROUP rg_test_group; +-- must specify cpu_rate_limit or cpuset +CREATE RESOURCE GROUP rg_test_group WITH (memory_limit=10); +-- can't specify the resource limit type multiple times +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpu_rate_limit=5, memory_limit=5, concurrency=1); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5, cpu_rate_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5, memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5, memory_shared_quota=70, memory_shared_quota=80); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0', cpuset='0', memory_limit=5); +-- can't specify both cpu_rate_limit and cpuset +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, cpuset='0', memory_limit=5); +-- can't specify invalid cpuset +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset=',', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='-', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='a', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='12a', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0-,', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='-1', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='3-1', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (cpuset=' 0 ', memory_limit=5); +---- suppose the core numbered 1024 is not exist +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='1024', memory_limit=5); +CREATE RESOURCE GROUP rg_test_group WITH (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,', memory_limit=5); +-- can't alter to invalid cpuset +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0', memory_limit=5); +ALTER RESOURCE GROUP rg_test_group set CPUSET ''; +ALTER RESOURCE GROUP rg_test_group set CPUSET ','; +ALTER RESOURCE GROUP rg_test_group set CPUSET '-'; +ALTER RESOURCE GROUP rg_test_group set CPUSET 'a'; +ALTER RESOURCE GROUP rg_test_group set CPUSET '12a'; +ALTER RESOURCE GROUP rg_test_group set CPUSET '0-'; +ALTER RESOURCE GROUP rg_test_group set CPUSET '-1'; +ALTER RESOURCE GROUP rg_test_group set CPUSET '3-1'; +ALTER RESOURCE GROUP rg_test_group set CPUSET ' 0 '; +---- suppose the core numbered 1024 is not exist +ALTER RESOURCE GROUP rg_test_group set CPUSET '1024'; +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,'; +DROP RESOURCE GROUP rg_test_group; +-- can't drop non-exist resource group +DROP RESOURCE GROUP non_exist_group; +-- can't drop reserved resource groups +DROP RESOURCE GROUP default_group; +DROP RESOURCE GROUP admin_group; +DROP RESOURCE GROUP none; + +-- positive +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10); +SELECT groupname,concurrency,cpu_rate_limit,memory_limit,memory_shared_quota,memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpuset='0', memory_limit=10, memory_shared_quota=70, memory_spill_ratio=30); +SELECT groupname,concurrency,cpu_rate_limit,memory_limit,memory_shared_quota,memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10); +SELECT groupname,concurrency,cpu_rate_limit,memory_limit,memory_shared_quota,memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0'); +SELECT groupname,concurrency,cpu_rate_limit,memory_limit,memory_shared_quota,memory_spill_ratio FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; +DROP RESOURCE GROUP rg_test_group; + +-- ---------------------------------------------------------------------- +-- Test: boundary check in create resource group syntax +-- ---------------------------------------------------------------------- + +-- negative: cpu_rate_limit & memory_limit should be in [1, 100] +-- if cpu_rate_limit equals -1, it will not be involved in sum +CREATE RESOURCE GROUP rg_test_group1 WITH (memory_limit=10, cpuset='0'); +CREATE RESOURCE GROUP rg_test_group2 WITH (cpu_rate_limit=60, memory_limit=10); +CREATE RESOURCE GROUP rg_test_group3 WITH (cpu_rate_limit=1, memory_limit=10); +DROP RESOURCE GROUP rg_test_group1; +DROP RESOURCE GROUP rg_test_group2; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=61, memory_limit=10); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=91); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=0, memory_limit=10); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=-1); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=0.9); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=1.9); +-- negative: concurrency should be in [1, max_connections] +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=-1, cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=26, cpu_rate_limit=10, memory_limit=10); +-- negative: memory_auditor should be 'vmtracker' or 'cgroup' +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=0, cpu_rate_limit=10, memory_limit=10, memory_auditor="randomtext"); +-- negative: concurrency should be zero for cgroup audited resource group +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpu_rate_limit=10, memory_limit=10, memory_auditor="cgroup"); +-- negative: the cores of cpuset in different groups mustn't overlap +CREATE RESOURCE GROUP rg_test_group1 WITH (cpuset='0', memory_limit=10); +CREATE RESOURCE GROUP rg_test_group2 WITH (cpuset='0', memory_limit=10); +DROP RESOURCE GROUP rg_test_group1; + +-- memory_spill_ratio range is [0, 100] +-- no limit on the sum of memory_shared_quota and memory_spill_ratio +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=10, memory_spill_ratio=0); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=50, memory_spill_ratio=51); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=10, memory_spill_ratio=-1); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=-1, memory_spill_ratio=10); + +-- positive: cpu_rate_limit & memory_limit should be in [1, 100] +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=60, memory_limit=10); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=60); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=1, memory_limit=10); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=1); +DROP RESOURCE GROUP rg_test_group; +-- positive: concurrency should be in [0, max_connections] +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=0, cpu_rate_limit=10, memory_limit=10); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpu_rate_limit=10, memory_limit=10); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=25, cpu_rate_limit=10, memory_limit=10); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg1_test_group WITH (concurrency=1, cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP rg2_test_group WITH (concurrency=1, cpu_rate_limit=50, memory_limit=50); +DROP RESOURCE GROUP rg1_test_group; +DROP RESOURCE GROUP rg2_test_group; +CREATE RESOURCE GROUP rg1_test_group WITH (concurrency=1, cpu_rate_limit=20, memory_limit=20); +CREATE RESOURCE GROUP rg2_test_group WITH (concurrency=1, cpu_rate_limit=40, memory_limit=40); +DROP RESOURCE GROUP rg1_test_group; +DROP RESOURCE GROUP rg2_test_group; +CREATE RESOURCE GROUP rg1_test_group WITH (concurrency=1, cpu_rate_limit=30, memory_limit=30); +CREATE RESOURCE GROUP rg2_test_group WITH (concurrency=1, cpu_rate_limit=30, memory_limit=30); +DROP RESOURCE GROUP rg1_test_group; +DROP RESOURCE GROUP rg2_test_group; +-- positive: concurrency should be zero for cgroup audited resource group +CREATE RESOURCE GROUP rg_test_group WITH (concurrency=0, cpu_rate_limit=10, memory_limit=10, memory_auditor="cgroup"); +DROP RESOURCE GROUP rg_test_group; + +-- memory_spill_ratio range is [0, 100] +-- no limit on the sum of memory_shared_quota and memory_spill_ratio +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=0, memory_spill_ratio=1); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=50, memory_spill_ratio=50); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=0, memory_spill_ratio=100); +DROP RESOURCE GROUP rg_test_group; +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_shared_quota=99, memory_spill_ratio=1); +DROP RESOURCE GROUP rg_test_group; + +-- negative: memory_spill_ratio does not accept out of range percentage values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=-1); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=101); + +-- negative: memory_spill_ratio does not accept string values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio='0'); +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio='10'); + +-- negative: memory_spill_ratio does not accept float values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=10.5); + +-- negative: when memory_limit is unlimited memory_spill_ratio must be set to 0 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=0, memory_spill_ratio=10); + +-- positive +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=0, memory_spill_ratio=0); +DROP RESOURCE GROUP rg_test_group; + +-- ---------------------------------------------------------------------- +-- Test: alter a resource group +-- ---------------------------------------------------------------------- +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); + +-- ALTER RESOURCE GROUP SET CONCURRENCY N +-- negative: concurrency should be in [1, max_connections] +ALTER RESOURCE GROUP admin_group SET CONCURRENCY 0; +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY -1; +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 26; +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY -0.5; +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 0.5; +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY a; +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 'abc'; +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 RESOURCE GROUP rg_test_group SET CONCURRENCY 1; +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 2; +ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 25; + +-- ALTER RESOURCE GROUP SET CPU_RATE_LIMIT VALUE +-- negative: cpu_rate_limit & memory_limit should be in [1, 100] +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT -0.1; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT -1; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 0; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 0.7; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 1.7; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 61; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT a; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 'abc'; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 20%; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 0.2%; +-- positive: cpu_rate_limit & memory_limit should be in [1, 100] +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 1; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 2; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 60; +DROP RESOURCE GROUP rg_test_group; +-- positive: total cpu_rate_limit & memory_limit should be in [1, 100] +CREATE RESOURCE GROUP rg1_test_group WITH (cpu_rate_limit=10, memory_limit=10); +CREATE RESOURCE GROUP rg2_test_group WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP rg1_test_group SET CPU_RATE_LIMIT 50; +ALTER RESOURCE GROUP rg1_test_group SET CPU_RATE_LIMIT 40; +ALTER RESOURCE GROUP rg2_test_group SET CPU_RATE_LIMIT 20; +ALTER RESOURCE GROUP rg1_test_group SET CPU_RATE_LIMIT 30; +ALTER RESOURCE GROUP rg2_test_group SET CPU_RATE_LIMIT 30; +DROP RESOURCE GROUP rg1_test_group; +DROP RESOURCE GROUP rg2_test_group; +-- positive: cpuset and cpu_rate_limit are exclusive, +-- if cpu_rate_limit is set, cpuset is empty +-- if cpuset is set, cpuset is -1 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10); +ALTER RESOURCE GROUP rg_test_group SET CPUSET '0'; +SELECT groupname,cpu_rate_limit,memory_limit,cpuset FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; +ALTER RESOURCE GROUP rg_test_group SET CPU_RATE_LIMIT 10; +SELECT groupname,cpu_rate_limit,memory_limit,cpuset FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; +DROP RESOURCE GROUP rg_test_group; + +CREATE RESOURCE GROUP cgroup_audited_group WITH (concurrency=0, cpu_rate_limit=10, memory_limit=10, memory_auditor="cgroup"); +-- negative: memory_auditor cannot be altered +ALTER RESOURCE GROUP cgroup_audited_group SET MEMORY_AUDITOR "default"; +-- negative: concurrency should be zero for cgroup audited resource group +ALTER RESOURCE GROUP cgroup_audited_group SET CONCURRENCY 10; +-- negative: role should not be assigned to a cgroup audited resource group +CREATE ROLE cgroup_audited_role RESOURCE GROUP cgroup_audited_group; +DROP RESOURCE GROUP cgroup_audited_group; + +-- positive: memory_spill_ratio accepts integer values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=20); +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10; +DROP RESOURCE GROUP rg_test_group; + +-- negative: memory_spill_ratio only accepts integer values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=20); +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio '10'; +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10.5; +DROP RESOURCE GROUP rg_test_group; + +-- negative: memory_spill_ratio does not accept out of range values +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=20); +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio -1; +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 101; +DROP RESOURCE GROUP rg_test_group; + +-- positive: memory_limit can be altered to unlimited if memory_spill_ratio is 0 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=0); +ALTER RESOURCE GROUP rg_test_group SET memory_limit 0; +DROP RESOURCE GROUP rg_test_group; + +-- negative: memory_spill_ratio can only be set to 0 if memory_limit is unlimited +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=0, memory_spill_ratio=0); +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10; +DROP RESOURCE GROUP rg_test_group; + +-- positive: memory_spill_ratio accepts a percentage value only if +-- memory_limit is limited +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=0); +ALTER RESOURCE GROUP rg_test_group SET memory_spill_ratio 10; +DROP RESOURCE GROUP rg_test_group; + +-- negative: memory_limit must be limited if memory_spill_ratio > 0 +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=10, memory_limit=10, memory_spill_ratio=10); +ALTER RESOURCE GROUP rg_test_group SET memory_limit 0; +DROP RESOURCE GROUP rg_test_group; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_transaction.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_transaction.sql new file mode 100644 index 00000000000..d805ca3bc79 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_transaction.sql @@ -0,0 +1,136 @@ +-- ---------------------------------------------------------------------- +-- Test: manage resource group in transaction +-- ---------------------------------------------------------------------- + +--start_ignore +DROP RESOURCE GROUP rg_test_group; +--end_ignore + +-- helper view to check the resgroup status +CREATE OR REPLACE VIEW rg_test_monitor AS + SELECT groupname, concurrency, cpu_rate_limit + FROM gp_toolkit.gp_resgroup_config + WHERE groupname='rg_test_group'; + +-- ---------------------------------------------------------------------- +-- Test: create/alter/drop a resource group in transaction block +-- ---------------------------------------------------------------------- + +-- CREATE RESOURCE GROUP cannot run inside a transaction block +BEGIN; + CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +END; +SELECT * FROM rg_test_monitor; + +-- ALTER RESOURCE GROUP cannot run inside a transaction block +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +BEGIN; + ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10; +END; +SELECT * FROM rg_test_monitor; + +-- DROP RESOURCE GROUP cannot run inside a transaction block +BEGIN; + DROP RESOURCE GROUP rg_test_group; +END; +SELECT * FROM rg_test_monitor; + +DROP RESOURCE GROUP rg_test_group; + + +-- ---------------------------------------------------------------------- +-- Test: create/alter/drop a resource group and DML in transaction block +-- ---------------------------------------------------------------------- + +-- CREATE RESOURCE GROUP cannot run inside a transaction block +BEGIN; + SELECT 1; + CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +END; +SELECT * FROM rg_test_monitor; + +-- ALTER RESOURCE GROUP cannot run inside a transaction block +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +BEGIN; + SELECT 1; + ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10; +END; +SELECT * FROM rg_test_monitor; + +-- DROP RESOURCE GROUP cannot run inside a transaction block +BEGIN; + SELECT 1; + DROP RESOURCE GROUP rg_test_group; +END; +SELECT * FROM rg_test_monitor; + +DROP RESOURCE GROUP rg_test_group; + + +-- ---------------------------------------------------------------------- +-- Test: create/alter/drop a resource group in subtransaction +-- ---------------------------------------------------------------------- + +-- CREATE RESOURCE GROUP cannot run inside a subtransaction +BEGIN; + SAVEPOINT rg_savepoint; + CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); + ROLLBACK TO SAVEPOINT rg_savepoint; +ABORT; +SELECT * FROM rg_test_monitor; + +-- ALTER RESOURCE GROUP cannot run inside a subtransaction +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +BEGIN; + SAVEPOINT rg_savepoint; + ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10; + ROLLBACK TO SAVEPOINT rg_savepoint; +ABORT; +SELECT * FROM rg_test_monitor; + +-- DROP RESOURCE GROUP cannot run inside a subtransaction +BEGIN; + SAVEPOINT rg_savepoint; + DROP RESOURCE GROUP rg_test_group; + ROLLBACK TO SAVEPOINT rg_savepoint; +ABORT; +SELECT * FROM rg_test_monitor; + +DROP RESOURCE GROUP rg_test_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_rate_limit=5, memory_limit=5) $$ +LANGUAGE SQL; + +CREATE OR REPLACE FUNCTION rg_alter_func() RETURNS VOID +AS $$ ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10 $$ +LANGUAGE SQL; + +CREATE OR REPLACE FUNCTION rg_drop_func() RETURNS VOID +AS $$ DROP RESOURCE GROUP rg_test_group $$ +LANGUAGE SQL; + +-- CREATE RESOURCE GROUP cannot run inside a function call +SELECT * FROM rg_create_func(); +SELECT * FROM rg_test_monitor; + +-- ALTER RESOURCE GROUP cannot run inside a function call +CREATE RESOURCE GROUP rg_test_group WITH (cpu_rate_limit=5, memory_limit=5); +SELECT * FROM rg_alter_func(); +SELECT * FROM rg_test_monitor; + +-- DROP RESOURCE GROUP cannot run inside a function call +SELECT * FROM rg_drop_func(); +SELECT * FROM rg_test_monitor; + +DROP RESOURCE GROUP rg_test_group; +DROP FUNCTION rg_create_func(); +DROP FUNCTION rg_alter_func(); +DROP FUNCTION rg_drop_func(); + +-- cleanup +DROP VIEW rg_test_monitor; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_unassign_entrydb.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_unassign_entrydb.sql new file mode 100644 index 00000000000..69516f7469d --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_unassign_entrydb.sql @@ -0,0 +1,50 @@ +-- Testing when we terminate a query involves entrydb, UnassignResGroup() would +-- be called on both QD and entrydb process. If that function finishes calling +-- on QD before entrydb calling, a bug could previously be triggered that leads +-- to data corruption. This test verifies this. + +-- start_ignore +DROP ROLE IF EXISTS role_test; +DROP RESOURCE GROUP rg_test; +-- end_ignore + +CREATE RESOURCE GROUP rg_test WITH (concurrency=2, cpu_rate_limit=10, memory_limit=10); +CREATE ROLE role_test RESOURCE GROUP rg_test; + +-- By pass this session, else this affects the testing session, i.e. 1: +SET gp_resource_group_bypass = true; + +1: SET ROLE role_test; + +SELECT gp_inject_fault('unassign_resgroup_end_qd', 'reset', 1); +SELECT gp_inject_fault('unassign_resgroup_start_entrydb', 'reset', 1); + +SELECT gp_inject_fault('unassign_resgroup_end_qd', 'suspend', 1); +SELECT gp_inject_fault('unassign_resgroup_start_entrydb', 'suspend', 1); + +-- A query invovles entrydb. +1&: SELECT * from gp_dist_random('gp_id'), pg_sleep(15); + +SELECT pg_terminate_backend(pid) + FROM pg_stat_activity WHERE query LIKE + 'SELECT * from gp_dist_random%' + ORDER BY xact_start LIMIT 1; + +-- Make sure entry db starts calling UnassignResGroup() after QD +-- finishes calling UnassignResGroup(). +SELECT gp_wait_until_triggered_fault('unassign_resgroup_end_qd', 1, 1); +SELECT gp_inject_fault('unassign_resgroup_start_entrydb', 'resume', 1); + +SELECT gp_inject_fault('unassign_resgroup_end_qd', 'reset', 1); +SELECT gp_inject_fault('unassign_resgroup_start_entrydb', 'reset', 1); + +1<: + +-- Verify the system is ok with entrydb. +2: SET ROLE role_test; +2: SELECT * from gp_dist_random('gp_id'), pg_sleep(0.1) LIMIT 1; +2q: + +-- Clean up +DROP ROLE role_test; +DROP RESOURCE GROUP rg_test; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_unlimit_memory_spill_ratio.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_unlimit_memory_spill_ratio.sql new file mode 100644 index 00000000000..683bfc0680f --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_unlimit_memory_spill_ratio.sql @@ -0,0 +1,85 @@ +-- start_ignore +DROP RESOURCE GROUP rg_spill_test; +-- end_ignore + +-- create +CREATE RESOURCE GROUP rg_spill_test WITH +(concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=60); +DROP RESOURCE GROUP rg_spill_test; + +CREATE RESOURCE GROUP rg_spill_test WITH +(concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=0); +DROP RESOURCE GROUP rg_spill_test; + +CREATE RESOURCE GROUP rg_spill_test WITH +(concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=100); +DROP RESOURCE GROUP rg_spill_test; + +CREATE RESOURCE GROUP rg_spill_test WITH +(concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=-1); +DROP RESOURCE GROUP rg_spill_test; + +CREATE RESOURCE GROUP rg_spill_test WITH +(concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=101); +DROP RESOURCE GROUP rg_spill_test; + +-- alter +CREATE RESOURCE GROUP rg_spill_test WITH +(concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=20); + +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 60; +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 0; +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 100; +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO -1; +ALTER RESOURCE GROUP rg_spill_test SET MEMORY_SPILL_RATIO 101; + +DROP RESOURCE GROUP rg_spill_test; + +-- set GUC +CREATE RESOURCE GROUP rg_spill_test WITH +(concurrency=10, cpu_rate_limit=20, memory_limit=20, memory_shared_quota=50, memory_spill_ratio=20); + +SET MEMORY_SPILL_RATIO TO 60; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +SET MEMORY_SPILL_RATIO TO 0; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +SET MEMORY_SPILL_RATIO TO 100; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +SET MEMORY_SPILL_RATIO TO -1; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +SET MEMORY_SPILL_RATIO TO 101; +SHOW MEMORY_SPILL_RATIO; +SELECT 1; + +DROP RESOURCE GROUP rg_spill_test; + +-- test case for query_mem=0 +CREATE TABLE test_zero_workmem(c int); + +--This test intends to build a situation that query_mem = 0 +--and verify under such condition work_mem will be used. +CREATE RESOURCE GROUP rg_zero_workmem WITH +(concurrency=2, cpu_rate_limit=10, memory_limit=20, memory_shared_quota=20, memory_spill_ratio=0); + +CREATE ROLE role_zero_workmem SUPERUSER RESOURCE GROUP rg_zero_workmem; +SET ROLE TO role_zero_workmem; + +--test query that will use spi +ANALYZE test_zero_workmem; + +--test normal DML +SELECT count(*) FROM test_zero_workmem; + +--clean env +RESET ROLE; +DROP TABLE test_zero_workmem; +DROP ROLE role_zero_workmem; +DROP RESOURCE GROUP rg_zero_workmem; diff --git a/src/test/singlenode_isolation2/sql/resgroup/resgroup_views.sql b/src/test/singlenode_isolation2/sql/resgroup/resgroup_views.sql new file mode 100644 index 00000000000..15cdb09948f --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/resgroup_views.sql @@ -0,0 +1,45 @@ +select * + from gp_toolkit.gp_resgroup_config + where groupname='default_group'; + +select rsgname + , groupid + , num_running + , num_queueing + , num_queued + , num_executed + , cpu_usage->'-1' as qd_cpu_usage + , memory_usage->'-1'->'used' as qd_memory_used + , memory_usage->'-1'->'shared_used' as qd_memory_shared_used + from gp_toolkit.gp_resgroup_status + where rsgname='default_group'; + +select rsgname + , groupid + , cpu + , memory_used + , memory_shared_used + from gp_toolkit.gp_resgroup_status_per_host s + join gp_segment_configuration c + on s.hostname=c.hostname and c.content=-1 and role='p' + where rsgname='default_group'; + +select rsgname + , groupid + , segment_id + , cpu + , memory_used + , memory_shared_used + from gp_toolkit.gp_resgroup_status_per_segment + where rsgname='default_group' + and segment_id=-1; + +-- also log the raw output of the views, if any of above tests failed it is +-- easier to find out the causes with these logs. + +-- start_ignore +select * from gp_toolkit.gp_resgroup_config; +select * from gp_toolkit.gp_resgroup_status; +select * from gp_toolkit.gp_resgroup_status_per_host; +select * from gp_toolkit.gp_resgroup_status_per_segment; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/resgroup/restore_default_resgroup.sql b/src/test/singlenode_isolation2/sql/resgroup/restore_default_resgroup.sql new file mode 100644 index 00000000000..de498aefffc --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resgroup/restore_default_resgroup.sql @@ -0,0 +1,20 @@ +-- enable resource group and restart cluster. +-- start_ignore +! gpconfig -c gp_resource_group_cpu_limit -v 0.9; +! gpconfig -c gp_resource_group_memory_limit -v 0.9; +! gpconfig -c gp_resource_manager -v group; + +-- 40 should be enough for the following cases and some +-- weak test agents may not adopt a higher max_connections +! gpconfig -c max_connections -v 100 -m 40; +! gpstop -rai; +-- end_ignore + +show gp_resource_manager; +show gp_resource_group_cpu_limit; +show gp_resource_group_memory_limit; +show max_connections; + +-- by default admin_group has concurrency set to -1 which leads to +-- very small memory quota for each resgroup slot, correct it. +ALTER RESOURCE GROUP admin_group SET concurrency 40; diff --git a/src/test/singlenode_isolation2/sql/resource_queue.sql b/src/test/singlenode_isolation2/sql/resource_queue.sql new file mode 100644 index 00000000000..a49f289cc8b --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resource_queue.sql @@ -0,0 +1,41 @@ +0:CREATE RESOURCE QUEUE rq_concurrency_test WITH (active_statements = 1); +0:CREATE role role_concurrency_test RESOURCE QUEUE rq_concurrency_test; + +1:SET role role_concurrency_test; +1:BEGIN; +1:DECLARE c1 CURSOR FOR SELECT 1; + +2:SET role role_concurrency_test; +2:PREPARE fooplan AS SELECT 1; +2&:EXECUTE fooplan; + +-- EXECUTE statement(cached plan) will be blocked when the concurrency limit of the resource queue is reached. +0:SELECT rsqcountvalue FROM gp_toolkit.gp_resqueue_status WHERE rsqname='rq_concurrency_test'; +0:SELECT wait_event_type, wait_event from pg_stat_activity where query = 'EXECUTE fooplan;'; + +-- This should also block. +-- +-- We used to have a bug during 9.6 merge where selecting from pg_locks caused +-- a crash, because we didn't set all the fields in the PROCLOCK struct +-- correctly. That only manifested when there were two queries blocked. +3:SET role role_concurrency_test; +3:PREPARE fooplan AS SELECT 1; +3&:EXECUTE fooplan; + +-- Check pg_stat_activity and pg_locks again. +0:SELECT wait_event_type, wait_event from pg_stat_activity where query = 'EXECUTE fooplan;'; +0:SELECT granted, locktype, mode FROM pg_locks where locktype = 'resource queue' and pid != pg_backend_pid(); + +1:END; + +2<: +2:END; + +3<: +3:END; + +-- Sanity check: Ensure that the resource queue is now empty. +0: SELECT rsqcountlimit, rsqcountvalue from pg_resqueue_status WHERE rsqname = 'rq_concurrency_test'; + +0:DROP role role_concurrency_test; +0:DROP RESOURCE QUEUE rq_concurrency_test; diff --git a/src/test/singlenode_isolation2/sql/resource_queue_cancel.sql b/src/test/singlenode_isolation2/sql/resource_queue_cancel.sql new file mode 100644 index 00000000000..c2c3d1404bc --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resource_queue_cancel.sql @@ -0,0 +1,36 @@ +-- Simple test for cancellation of a query stuck on a resource queue when the +-- active statements limit is reached. + +0:CREATE RESOURCE QUEUE rq_cancel WITH (active_statements = 1); +0:CREATE ROLE role_cancel RESOURCE QUEUE rq_cancel; + +-- Consume an active statement in session 1. +1:SET ROLE role_cancel; +1:BEGIN; +1:DECLARE c CURSOR FOR SELECT 0; + +-- Make session 2 wait on the resource queue lock. +2:SET ROLE role_cancel; +2&:SELECT 100; + +-- Cancel SELECT from session 2. +0:SELECT pg_cancel_backend(pid) FROM pg_stat_activity + WHERE query='SELECT 100;'; + +-- Now once we end session 1's transaction, we should be able to consume the +-- vacated active statement slot in session 2. +1:END; + +2<: +2:END; +2:BEGIN; +2:DECLARE c CURSOR FOR SELECT 0; + +2:END; + +-- Sanity check: Ensure that the resource queue is now empty. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_cancel'; + +-- Cleanup +0:DROP ROLE role_cancel; +0:DROP RESOURCE QUEUE rq_cancel; diff --git a/src/test/singlenode_isolation2/sql/resource_queue_deadlock.sql b/src/test/singlenode_isolation2/sql/resource_queue_deadlock.sql new file mode 100644 index 00000000000..d1730aeb554 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resource_queue_deadlock.sql @@ -0,0 +1,31 @@ +-- This test is used to test if waiting on a resource queue lock will +-- trigger a local deadlock detection. + +0: CREATE RESOURCE QUEUE rq_deadlock_test WITH (active_statements = 1); +0: CREATE role role_deadlock_test RESOURCE QUEUE rq_deadlock_test; + +0: SELECT gp_inject_fault_infinite('before_auto_stats', 'suspend', dbid) FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; +0&: SELECT gp_wait_until_triggered_fault('before_auto_stats', 1, dbid) FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; + +1: SET role role_deadlock_test; +-- We need gp_autostats_mode to be ON_NO_STATS in this test. +1: SET gp_autostats_mode = ON_NO_STATS; +1: SHOW gp_autostats_mode; +1: CREATE TABLE t_deadlock_test(c1 int); +1&: INSERT INTO t_deadlock_test VALUES (1); +2: SET role role_deadlock_test; +2: BEGIN; +2: analyze t_deadlock_test; +0<: +0: select gp_inject_fault_infinite('before_auto_stats', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'p'; +2: SELECT * FROM t_deadlock_test; +2: ROLLBACK; +1<: + +-- Sanity check: Ensure that the resource queue is now empty. +0: SELECT rsqcountlimit, rsqcountvalue from pg_resqueue_status WHERE rsqname = 'rq_deadlock_test'; + +-- Clean up the test +0: DROP TABLE t_deadlock_test; +0: DROP ROLE role_deadlock_test; +0: DROP RESOURCE QUEUE rq_deadlock_test; diff --git a/src/test/singlenode_isolation2/sql/resource_queue_multi_portal.sql b/src/test/singlenode_isolation2/sql/resource_queue_multi_portal.sql new file mode 100644 index 00000000000..06959f3132e --- /dev/null +++ b/src/test/singlenode_isolation2/sql/resource_queue_multi_portal.sql @@ -0,0 +1,103 @@ +-- Here we ensure that we clean up resource queue in-memory state gracefully +-- 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); +0:CREATE ROLE role_multi_portal RESOURCE QUEUE rq_multi_portal; + +1:SET ROLE role_multi_portal; +2:SET ROLE role_multi_portal; + +-- +-- Scenario 1: +-- Multiple explicit cursors active in the same session with a deadlock. +-- + +1:BEGIN; +1:DECLARE c1 CURSOR FOR SELECT 1; + +2:BEGIN; +2:DECLARE c2 CURSOR FOR SELECT 1; + +-- There should be 2 active statements. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + +-- This should block as it will exceed the active statements limit. +1&:DECLARE c3 CURSOR FOR SELECT 1; + +-- There should be 2 active statements. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + +-- This should cause a deadlock. +2:DECLARE c4 CURSOR FOR SELECT 1; + +-- After the deadlock report, one session should have ERRORed out with the +-- deadlock report and aborted, while the other session should remain active +-- and idle in transaction. The active statement count should be 2, contributed +-- to by the session that is idle in transaction. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; +0:SELECT count(*) from pg_stat_activity WHERE query LIKE 'DECLARE c% CURSOR FOR SELECT 1;' + AND state = 'idle in transaction'; +0:SELECT count(*) from pg_stat_activity WHERE query LIKE 'DECLARE c% CURSOR FOR SELECT 1;' + AND state = 'idle in transaction (aborted)'; + +-- After ending the transactions, there should be 0 active statements. +1<: +1:END; +2:END; +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + +-- +-- Scenario 2: +-- Multiple explicit cursors active in the same session with a self deadlock. +-- +1:BEGIN; +1:DECLARE c1 CURSOR FOR SELECT 1; +1:DECLARE c2 CURSOR FOR SELECT 1; + +-- There should be 2 active statements. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + +-- This should cause a self-deadlock and session 1 should error out, aborting +-- its transaction. +1:DECLARE c3 CURSOR FOR SELECT 1; + +-- There should be 0 active statements following the transaction abort. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + +1:END; + +-- +-- Scenario 3: +-- Multiple explicit cursors active in the same session with cancellation. +-- +1:BEGIN; +1:DECLARE c1 CURSOR FOR SELECT 1; + +2:BEGIN; +2:DECLARE c2 CURSOR FOR SELECT 1; + +-- This should block as it will exceed the active statements limit. +1&:DECLARE c3 CURSOR FOR SELECT 1; + +-- There should be 2 active statements. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + +-- Cancel session 1's transaction. +0:SELECT pg_cancel_backend(pid) FROM pg_stat_activity + WHERE query = 'DECLARE c3 CURSOR FOR SELECT 1;'; + +-- There should now only be one active statement, following the abort of session +-- 1's transaction. The active statement is contributed by session 2. +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; +0:SELECT query, state from pg_stat_activity + WHERE query = 'DECLARE c2 CURSOR FOR SELECT 1;'; + +-- After ending the transactions, there should be 0 active statements. +1<: +1:END; +2:END; +0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; + +-- Cleanup +0:DROP ROLE role_multi_portal; +0:DROP RESOURCE QUEUE rq_multi_portal; diff --git a/src/test/singlenode_isolation2/sql/restore_memory_accounting_default.sql b/src/test/singlenode_isolation2/sql/restore_memory_accounting_default.sql new file mode 100644 index 00000000000..4d5ba979c80 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/restore_memory_accounting_default.sql @@ -0,0 +1,6 @@ +-- start_ignore +! gpconfig -c gp_vmem_limit_per_query -v '0' --skipvalidation +! gpconfig -c gp_vmem_protect_limit -v '8192' +! gpconfig -c runaway_detector_activation_percent -v 0 +! gpstop -rai; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/runaway_query.sql b/src/test/singlenode_isolation2/sql/runaway_query.sql new file mode 100644 index 00000000000..eaaddb0d21c --- /dev/null +++ b/src/test/singlenode_isolation2/sql/runaway_query.sql @@ -0,0 +1,12 @@ +CREATE EXTENSION IF NOT EXISTS gp_inject_fault; +CREATE OR REPLACE LANGUAGE plpgsql; + +CREATE TABLE runaway_query_test_table(a bigint NOT NULL); + +-- Use error fault to simulate vmem protect error and force cancel query. +SELECT gp_inject_fault_infinite('gpdbwrappers_get_comparison_operator', 'error', 1); + +-- Following query will trip the fault during ORCA optimization +EXPLAIN (COSTS OFF) SELECT a FROM runaway_query_test_table WHERE (a = ANY ((ARRAY[42]))); + +SELECT gp_inject_fault('all', 'reset', 1); diff --git a/src/test/singlenode_isolation2/sql/segwalrep/cancel_commit_pending_replication.sql b/src/test/singlenode_isolation2/sql/segwalrep/cancel_commit_pending_replication.sql new file mode 100644 index 00000000000..fef5e5ea811 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/cancel_commit_pending_replication.sql @@ -0,0 +1,47 @@ +select gp_inject_fault('sync_rep_query_cancel', 'reset', 2); +select gp_inject_fault('wal_sender_loop', 'reset', 2); + +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; + +SELECT role, preferred_role, content, status FROM gp_segment_configuration; +create table store_session_id(a int, sess_id int); +-- 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(); +-- 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); +-- Expect: `create table` should be blocked until reset +-- `wal_sender_loop`. We also verify the `sync_rep_query_cancel` is +-- triggered by query cancel request. +1&: create table cancel_commit_pending_replication(a int, b int); +select gp_wait_until_triggered_fault('finish_prepared_start_of_function', 1, 2); +-- now pause the wal sender on primary for content 0 +select gp_inject_fault_infinite('wal_sender_loop', 'suspend', 2); +-- let the transaction move forward with the commit +select gp_inject_fault('finish_prepared_start_of_function', 'reset', 2); +-- loop to reach wait_event=SyncRep +0U: select wait_for_replication(1200); +-- hitting this fault, is checked for test validation +select gp_inject_fault_infinite('sync_rep_query_cancel', 'skip', 2); +0U: select pg_cancel_backend(pid) from pg_stat_activity where wait_event='SyncRep' and sess_id in (select sess_id from store_session_id); +-- EXPECT: hit this fault for QueryCancelPending +select gp_wait_until_triggered_fault('sync_rep_query_cancel', 1, 2); +-- EXPECT: the query is still in waiting mode, to verify the cancel is ignored. +0U: select wait_event from pg_stat_activity where sess_id in (select sess_id from store_session_id); +-- resume the primary on content 0 +select gp_inject_fault('wal_sender_loop', 'reset', 2); +1<: +-- cleanup +select gp_inject_fault('sync_rep_query_cancel', 'reset', 2); diff --git a/src/test/singlenode_isolation2/sql/segwalrep/commit_blocking.sql b/src/test/singlenode_isolation2/sql/segwalrep/commit_blocking.sql new file mode 100644 index 00000000000..aeac3756b3a --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/commit_blocking.sql @@ -0,0 +1,56 @@ +-- This test assumes 3 primaries and 3 mirrors from a gpdemo segwalrep cluster + +-- make sure we are in-sync for the primary we will be testing with +select content, role, preferred_role, status from gp_segment_configuration; + +-- print synchronous_standby_names should be set to '*' at start of test +0U: show synchronous_standby_names; + +-- create table and show commits are not blocked +create table segwalrep_commit_blocking (a int) distributed by (a); +insert into segwalrep_commit_blocking values (5); + +-- skip FTS probes always +select gp_inject_fault('fts_probe', 'reset', 1); +select gp_inject_fault_infinite('fts_probe', 'skip', 1); +-- force scan to trigger the fault +select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; + +-- stop a mirror and show commit on dbid 2 will block +-1U: select pg_ctl((select datadir from gp_segment_configuration c where c.role='m' and c.content=0), 'stop'); +-- We should insert a tuple to segment 0. +-- With jump consistent hash as the underlying hash algorithm, +-- a int value of 4 is on seg0. +0U&: insert into segwalrep_commit_blocking values (4); + +-- restart primary dbid 2 +-1U: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=0), 'restart'); + +-- should show dbid 2 utility mode connection closed because of primary restart +0U<: +0Uq: + +-- synchronous_standby_names should be set to '*' after primary restart +0U: show synchronous_standby_names; + +-- this should block since mirror is not up and sync replication is on +3: begin; +3: insert into segwalrep_commit_blocking values (4); +3&: commit; + +-- this should not block due to direct dispatch to primary with active synced mirror +4: insert into segwalrep_commit_blocking values (6); + +-- bring the mirror back up +-1U: select pg_ctl_start(datadir, port) from gp_segment_configuration where role = 'm' and content = 0; + +-- should unblock and commit now that mirror is back up and in-sync +3<: + +-- resume FTS probes +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; +4: select * from segwalrep_commit_blocking order by a; diff --git a/src/test/singlenode_isolation2/sql/segwalrep/commit_blocking_on_standby.sql b/src/test/singlenode_isolation2/sql/segwalrep/commit_blocking_on_standby.sql new file mode 100644 index 00000000000..2edee9a8b15 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/commit_blocking_on_standby.sql @@ -0,0 +1,148 @@ +-- +-- Master/standby commit blocking scenarios. These are different from +-- primary/mirror commit blocking because there is no FTS or a +-- third-party as external arbiter in case of master/standby. +-- +-- Scenario1: Commits should block until standby confirms WAL flush +-- up to commit LSN. + +-- Check that are starting with a clean slate, standby must be in sync +-- with master. + +select application_name, state from pg_stat_replication; + +-- Inject fault on standby to skip WAL flush. +select gp_inject_fault_infinite('walrecv_skip_flush', 'skip', dbid) +from gp_segment_configuration where content=-1 and role='m'; + +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; + +-- Flush WAL to trigger the fault on standby. +checkpoint; + +select gp_wait_until_triggered_fault('walrecv_skip_flush', 1, dbid) +from gp_segment_configuration where content=-1 and role='m'; + +-- Should block in commit (SyncrepWaitForLSN()), waiting for commit +-- LSN to be flushed on standby. +1&: create table commit_blocking_on_standby_t1 (a int); + +-- The create table command should be seen as blocked. Wait until +-- that happens. +select wait_for_pg_stat_activity(60); +select datname, wait_event, query from pg_stat_activity +where wait_event = 'SyncRep'; + +select gp_inject_fault('walrecv_skip_flush', 'reset', dbid) +from gp_segment_configuration where content=-1 and role='m'; + +-- Ensure that commits are no longer blocked. +commit; + +1<: + +-- The blocked commit must have finished and the table should be ready +-- for insert. +insert into commit_blocking_on_standby_t1 values (1); + + +-- Scenario2: In CATCHUP phase, commits should not block until standby +-- has caught up within range. And thereafter, commits should start +-- blocking. + +-- In order to get master and standby in CATCHUP state, existing +-- connection, which is in STREAMING state must be closed. A new +-- connection will then be initiated by standby, beginning in STARTUP +-- then CATCHUP to STREAMING. Faults are used to suspend WAL sender +-- before entering STREAMING state. + +-- Suspend WAL sender in main loop. "infinite_loop" fault type does +-- not block signals. +select gp_inject_fault_infinite('wal_sender_loop', 'infinite_loop', dbid) + from gp_segment_configuration where content=-1 and role='p'; + +-- Inject fault on standby to skip WAL flush. +select gp_inject_fault_infinite('walrecv_skip_flush', 'skip', dbid) + from gp_segment_configuration where content=-1 and role='m'; + +-- Kill existing walsender. WAL sender and WAL receiver processes +-- will be restarted and new connection will be established. Note +-- that the faults injected are still in effect and will affect the +-- newly forked WAL sender and receiver processes. +select pg_terminate_backend(pid) from pg_stat_replication; + +-- Should be set to 1 WAL segment by default. Standby is considered +-- caught up if its flush_lsn is less than 1 WAL segment (64MB) +-- away from sent_lsn. +show repl_catchup_within_range; + +-- Start a transaction, execute a DDL and commit. The commit should +-- not block. +begin; + +select wait_until_standby_in_state('catchup'); + +select gp_wait_until_triggered_fault('wal_sender_loop', 1, dbid) + from gp_segment_configuration where content=-1 and role='p'; + +-- WAL sender should be stuck in CATCHUP state. +select application_name, state from pg_stat_replication; + +-- This commit should NOT block because WAL sender has not yet +-- processed caughtup within range as it is stuck at the beginning of +-- main loop. +commit; + +select gp_inject_fault('wal_sender_after_caughtup_within_range', 'suspend', dbid) + from gp_segment_configuration where content=-1 and role='p'; + +select gp_inject_fault('wal_sender_loop', 'reset', dbid) + from gp_segment_configuration where content=-1 and role='p'; + +-- Once this fault is triggered, WAL sender should have set +-- caughtup_within_range to true because difference between +-- sent_lsn and flush_lsn is within 1 WAL segment (64) MB. +select gp_wait_until_triggered_fault( + 'wal_sender_after_caughtup_within_range', 1, dbid) + from gp_segment_configuration where content=-1 and role='p'; + +-- Should block because standby is considered to have caughtup within +-- range. +1&: create table commit_blocking_on_standby_t2 (a int); + +-- The create table command should be seen as blocked. +select wait_for_pg_stat_activity(60); +select datname, wait_event, query from pg_stat_activity +where wait_event = 'SyncRep'; + +-- Reset faults on primary as well as mirror. +select gp_inject_fault('all', 'reset', dbid) + from gp_segment_configuration where content=-1; + +1<: + +-- Create table transaction must have committed and the table should +-- be ready for insert. +insert into commit_blocking_on_standby_t2 values (1); + +select wait_until_standby_in_state('streaming'); diff --git a/src/test/singlenode_isolation2/sql/segwalrep/die_commit_pending_replication.sql b/src/test/singlenode_isolation2/sql/segwalrep/die_commit_pending_replication.sql new file mode 100644 index 00000000000..51c3a87d620 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/die_commit_pending_replication.sql @@ -0,0 +1,76 @@ +-- Adding `2` as first column as the distribution column. +-- `2` should be on the first segment. let's double check here. +-- start_ignore +drop table if exists store_session_id; +-- end_ignore +create table store_session_id(a int, sess_id int); +1: insert into store_session_id select 2, sess_id from pg_stat_activity where pid = pg_backend_pid(); +1: select gp_segment_id, a from store_session_id; + +1: create table die_commit_pending_replication(a int, b int); + +-- 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', dbid) from gp_segment_configuration where role='p' and content = 0; +1&: insert into die_commit_pending_replication values(2),(1); +select gp_wait_until_triggered_fault('finish_prepared_start_of_function', 1, dbid) from gp_segment_configuration where role='p' and content = 0; + +-- Now pause the wal sender on primary for content 0 +select gp_inject_fault_infinite('wal_sender_loop', 'suspend', dbid) from gp_segment_configuration where role='p' and content = 0; + +-- Insert fault in the ProcDiePending code block. +select gp_inject_fault_infinite('sync_rep_query_die', 'skip', dbid) from gp_segment_configuration where role='p' and content = 0; + +-- Let the transaction move forward with the commit +select gp_inject_fault('finish_prepared_start_of_function', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + +-- Ensure the ProcDiePending code block is called. It implies 'SyncRep' in pg_stat_activity. +select gp_wait_until_triggered_fault('sync_rep_query_die', 1, dbid) from gp_segment_configuration where role='p' and content = 0; + +-- We can terminate the backend on QE now. +0U: select pg_terminate_backend(pid) from pg_stat_activity + where wait_event='SyncRep' and + sess_id in (select sess_id from store_session_id); + +-- We expect two more occurrence: one for backend quitting and another for retry. +select gp_wait_until_triggered_fault('sync_rep_query_die', 3, dbid) from gp_segment_configuration where role='p' and content = 0; + +-- Verify that the sess_id changes due to retry. +0U: select pid,sess_id,wait_event,query from pg_stat_activity + where sess_id in (select sess_id from store_session_id); + +-- resume the primary wal replication so that retry could complete. +select gp_inject_fault('wal_sender_loop', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + +-- reset sync_rep_query_die +select gp_inject_fault('sync_rep_query_die', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + +1<: + +-- check if the insert fails or not. +select gp_segment_id, * from die_commit_pending_replication; + +-- +-- Test 1PC: if there is transaction xlog commit on QD, and QE quits during the +-- "notification" stage, QD won't panic. Previously the notification code is +-- after xlog commit code on QD so QE quitting will cause notification on QD +-- elog(ERROR) but at that moment the transaction can not be aborted (caused by +-- elog(ERROR)), else panic with message as below, "cannot abort transaction +-- %u, it was already committed". +-- + +2: create temp table die_commit_pending_replication2(a int); +2: insert into die_commit_pending_replication2 values(2),(1); + +-- 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; + +-- Start an one phase query that writes commit xlog on QD. +2: begin; select txid_current(); select * from die_commit_pending_replication2; end; + +-- Reset start_performDtxProtocolCommitOnePhase. +select gp_inject_fault_infinite('start_performDtxProtocolCommitOnePhase', 'reset', dbid) from gp_segment_configuration where role='p' and content = 0; + +-- cleanup +drop table die_commit_pending_replication; +drop table store_session_id; diff --git a/src/test/singlenode_isolation2/sql/segwalrep/dtm_recovery_on_standby.sql b/src/test/singlenode_isolation2/sql/segwalrep/dtm_recovery_on_standby.sql new file mode 100644 index 00000000000..15e97d213f0 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/dtm_recovery_on_standby.sql @@ -0,0 +1,119 @@ +-- Validate that standby performs DTM recovery upon promotion. +-- start_ignore +set statement_timeout='180s'; +-- end_ignore + +-- Check that are starting with a clean slate, standby must be in sync +-- with master. +select application_name, state, sync_state from pg_stat_replication; + +-- Scenario1: standby broadcasts commit-prepared for a transaction +-- that was prepared on master. + +-- Suspend master backend before it sends commit-prepared +select gp_inject_fault('dtm_broadcast_commit_prepared', 'suspend', dbid) +from gp_segment_configuration where content = -1 and role = 'p'; + +1&: create table committed_by_standby(a int, b int); + +select gp_wait_until_triggered_fault('dtm_broadcast_commit_prepared', 1, dbid) +from gp_segment_configuration where content = -1 and role = 'p'; + +-- Scenario2: standby broadcasts abort-prepared for a transaction that +-- doesn't have distributed commit recorded in XLOG. Inject faults +-- such that the QD backend errors out after prepare broadcast and +-- then suspends in AbortTransaction(), before it can send abort +-- prepared broadcast. QEs still have the transaction as prepared. +select gp_inject_fault('transaction_abort_after_distributed_prepared', 'error', dbid) +from gp_segment_configuration where content = -1 and role = 'p'; +select gp_inject_fault('transaction_abort_failure', 'suspend', dbid) +from gp_segment_configuration where content = -1 and role = 'p'; + +2&: create table aborted_by_standby(a int, b int); + +select gp_wait_until_triggered_fault('transaction_abort_failure', 1, dbid) +from gp_segment_configuration where content = -1 and role = 'p'; + +-- Promote standby +select pg_ctl(datadir, 'promote') from gp_segment_configuration +where content = -1 and role = 'm'; + +!\retcode gpfts -A -D; +-- "-1S" means connect to standby's port assuming it's accepting +-- connections. This select should succeed because the create table +-- transaction's commit prepared broadcast must have been sent by +-- standby after promotion. +-1S: select count(*) from committed_by_standby; + +-- Should fail because the create table transaction's abort prepared +-- broadcast must have been sent by standby after promotion. +-1S: select count(*) from aborted_by_standby; + +-1Sq: + +-- Reset faults. The suspended backend will be unblocked and try to +-- broadcast commit prepared again. QEs ignore this request, so that +-- broadcast is essentially a no-op. +select gp_inject_fault('all', 'reset', dbid) +from gp_segment_configuration where content = -1 and role = 'p'; +1<: +2<: + +-- Destroy and recreate the standby +select pg_ctl(datadir, 'stop', 'immediate') from gp_segment_configuration +where content = -1 and role = 'm'; +!\retcode gpfts -A -D; + +-- Standby details need to be stored in a separate table because +-- reinitialize_standby() first removes standby from catalog and then +-- adds it to the catalog using gpinitstandby. If temp table is not +-- used and the function is invoked directly on +-- gp_segment_configuration, we get a deadlock. The backend started +-- by gpinitstandby needs access exclusive lock and the backend for +-- this isolation spec is already holding an access share lock on +-- gp_segment_configuration. +-- NOTE: the select query should fail since the gang for master has been +-- terminated by the dtx recovery process on standby during standby promote. We +-- do not test the result of the select query; just expect it fail so that the +-- next mpp query could recreate the gang and succeed. +-- start_ignore +select count(*) from committed_by_standby; +-- end_ignore +create table standby_config as (select hostname, datadir, port, role +from gp_segment_configuration where content = -1) distributed by (hostname); + +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; + +select reinitialize_standby(); +!\retcode gpfts -A -D; + +-- Sync state between master and standby must be restored at the end. +select wait_until_standby_in_state('streaming'); + +-- start_ignore +reset statement_timeout; +-- end_ignore \ No newline at end of file diff --git a/src/test/singlenode_isolation2/sql/segwalrep/dtx_recovery_wait_lsn.sql b/src/test/singlenode_isolation2/sql/segwalrep/dtx_recovery_wait_lsn.sql new file mode 100644 index 00000000000..e9e61f2d0d6 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/dtx_recovery_wait_lsn.sql @@ -0,0 +1,55 @@ +-- Test this scenario: +-- mirror has latency replaying the WAL from the primary, the master is reset +-- from PANIC, master will start the DTX recovery process to recover the +-- in-progress two-phase transactions. +-- The FTS process should be able to continue probe and 'sync off' the mirror +-- while the 'dtx recovery' process is hanging recovering distributed transactions. + +1: create table t_wait_lsn(a int); + +-- 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'; +1&: insert into t_wait_lsn values(2),(1); +2: select gp_wait_until_triggered_fault('finish_prepared_start_of_function', 1, dbid) from gp_segment_configuration where content=0 and role='p'; + +-- let walreceiver on mirror 0 skip WAL flush +2: select gp_inject_fault_infinite('walrecv_skip_flush', 'skip', dbid) from gp_segment_configuration where content=0 and role='m'; +-- resume 'COMMIT PREPARED', session 1 will hang on 'SyncRepWaitForLSN' +2: select gp_inject_fault_infinite('finish_prepared_start_of_function', 'reset', dbid) from gp_segment_configuration where content=0 and role='p'; + +0U: select count(*) from pg_prepared_xacts; + +-- stop mirror +3: SELECT pg_ctl(datadir, 'stop', 'immediate') FROM gp_segment_configuration WHERE content=0 AND role = 'm'; +!\retcode gpfts -R 1 -A -D; +-- trigger master reset +3: select gp_inject_fault('exec_simple_query_start', 'panic', current_setting('gp_dbid')::smallint); +-- verify master panic happens. The PANIC message does not emit sometimes so +-- mask it. +-- start_matchsubs +-- m/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n/ +-- s/PANIC: fault triggered, fault name:'exec_simple_query_start' fault type:'panic'\n// +-- end_matchsubs +3: select 1; + +-- wait for master finish crash recovery +-1U: select wait_until_standby_in_state('streaming'); + +-- wait for FTS to 'sync off' the mirror, meanwhile, dtx recovery process will +-- restart repeatedly. +-- the query should succeed finally since dtx recovery process is able to quit. +-- this's what we want to test. +4: select count(*) from t_wait_lsn; + +1<: + +!\retcode gpfts -R 1 -A -D; +!\retcode gprecoverseg -a; +!\retcode gpfts -R 1 -A -D; +-- loop while segments come in sync +4: select wait_until_all_segments_synchronized(); +4: select pg_sleep(10); +4: select count(*) from t_wait_lsn; +4: drop table t_wait_lsn; + +4: select gp_inject_fault('walrecv_skip_flush', 'reset', dbid) from gp_segment_configuration where content=0; diff --git a/src/test/singlenode_isolation2/sql/segwalrep/failover_with_many_records.sql b/src/test/singlenode_isolation2/sql/segwalrep/failover_with_many_records.sql new file mode 100644 index 00000000000..f2fcabd1eb3 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/failover_with_many_records.sql @@ -0,0 +1,54 @@ +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 30 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 120 --skipvalidation --masteronly; +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 1000 --skipvalidation --masteronly; +!\retcode gpstop -u; + +1:CREATE TABLE t(a int, b int); + +1:SELECT gp_inject_fault_infinite('checkpoint_after_redo_calculated', 'suspend', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 1; +2&:CHECKPOINT; +3:INSERT INTO t VALUES (1, 0); + +-- 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; + +1:SELECT gp_inject_fault_infinite('checkpoint_after_redo_calculated', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 1; +2<: + +-- Here we must force immediately shutdown primary without triggering another +-- checkpoint otherwise we would undo all of our previous work to ensure that +-- checkpoint record has redo record on another wal segment. +-1U: SELECT pg_ctl((SELECT datadir FROM gp_segment_configuration c WHERE c.role='p' AND c.content=1), 'stop', 'immediate'); + +-- Make sure we see the segment is down before trying to recover... +4:SELECT gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +4:SELECT role, preferred_role FROM gp_segment_configuration WHERE content = 1; + +SELECT count(*) FROM t; +!\retcode gprecoverseg -a; + +!\retcode gpfts -A -D; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +!\retcode gprecoverseg -ar; + +!\retcode gpfts -A -D; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +-- verify no segment is down after recovery +1:SELECT COUNT(*) FROM gp_segment_configuration WHERE status = 'd'; + +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +!\retcode gpstop -u; diff --git a/src/test/singlenode_isolation2/sql/segwalrep/fts_unblock_primary.sql b/src/test/singlenode_isolation2/sql/segwalrep/fts_unblock_primary.sql new file mode 100644 index 00000000000..70f18828bd0 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/fts_unblock_primary.sql @@ -0,0 +1,92 @@ +-- This test assumes 3 primaries and 3 mirrors from a gpdemo segwalrep cluster + +-- make sure we are in-sync for the primary we will be testing with +select content, role, preferred_role, status from gp_segment_configuration; + +-- synchronous_standby_names should be set to '*' by default on primary 2, since +-- we have a working/sync'd mirror +2U: show synchronous_standby_names; +2U: show gp_fts_mark_mirror_down_grace_period; + +!\retcode gpconfig -c gp_fts_mark_mirror_down_grace_period -v 300; +!\retcode gpstop -u; + +-- create table and show commits are not blocked +create table fts_unblock_primary (a int) distributed by (a); +-- 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); + +-- skip FTS probes always +select gp_inject_fault('fts_probe', 'reset', 1); +select gp_inject_fault_infinite('fts_probe', 'skip', 1); +-- force scan to trigger the fault +select gp_request_fts_probe_scan(); + +-- stop a mirror +-1U: select pg_ctl((select get_data_directory_for(2, 'm')), 'stop'); + +-- this should block since mirror is not up and sync replication is on +2: begin; +2: insert into fts_unblock_primary values (5); +2&: commit; + +-- this should not block due to direct dispatch to primary with active synced mirror +insert into fts_unblock_primary values (2); + +-- resume FTS probes +select gp_inject_fault('fts_probe', 'reset', 1); + +-- trigger fts probe and check to see primary marked n/u and mirror still n/u as +-- still should be in mirror down grace period. +select gp_request_fts_probe_scan(); +select content, role, preferred_role, mode, status from gp_segment_configuration where content=2; + +-- set mirror down grace period to zero to instantly mark mirror down +!\retcode gpconfig -c gp_fts_mark_mirror_down_grace_period -v 0; +!\retcode gpstop -u; + +2U: show gp_fts_mark_mirror_down_grace_period; + +-- trigger fts probe and check to see primary marked n/u and mirror n/d +select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +select content, role, preferred_role, mode, status from gp_segment_configuration where content=2; + +-- should unblock and commit after FTS sent primary a SyncRepOff libpq message +2<: + +-- synchronous_standby_names should now be empty on the primary +2U: show synchronous_standby_names; + +--hold walsender in startup +select gp_inject_fault_infinite('initialize_wal_sender', 'suspend', dbid) +from gp_segment_configuration where role='p' and content=2; + +-- bring the mirror back up and see primary s/u and mirror s/u +-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')); +select gp_wait_until_triggered_fault('initialize_wal_sender', 1, dbid) +from gp_segment_configuration where role='p' and content=2; +-- make sure the walsender on primary is in startup +select state from gp_stat_replication where gp_segment_id=2; +select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +-- mirror should continue to be reported as down since walsender is in startup +select content, role, preferred_role, mode, status from gp_segment_configuration where content=2; + +-- let the walsender proceed +select gp_inject_fault('initialize_wal_sender', 'reset', dbid) +from gp_segment_configuration where role='p' and content=2; +select wait_until_segment_synchronized(2); +select content, role, preferred_role, mode, status from gp_segment_configuration where content=2; + +-- everything is back to normal +insert into fts_unblock_primary select i from generate_series(1,10)i; + +-- synchronous_standby_names should be back to its original value on the primary +2U: show synchronous_standby_names; + +!\retcode gpconfig -r gp_fts_mark_mirror_down_grace_period; +!\retcode gpstop -u; +2U: show gp_fts_mark_mirror_down_grace_period; diff --git a/src/test/singlenode_isolation2/sql/segwalrep/master_wal_switch.sql b/src/test/singlenode_isolation2/sql/segwalrep/master_wal_switch.sql new file mode 100644 index 00000000000..9b3c68eba8f --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/master_wal_switch.sql @@ -0,0 +1,43 @@ +-- Test for verifying if wal seg created while basebackup +-- dumps out data does not get cleaned + +-- Inject fault after checkpoint creation in basebackup +SELECT gp_inject_fault('base_backup_post_create_checkpoint', 'suspend', dbid) +FROM gp_segment_configuration WHERE content=-1 and role='p'; + +-- Run pg_basebackup which should trigger and suspend at the fault +1&: SELECT pg_basebackup(hostname, 100, port, false, NULL, + '/tmp/master_wal_switch_test', true, 'fetch') + from gp_segment_configuration where content=-1 and role='p'; + +-- Wait until fault has been triggered +SELECT gp_wait_until_triggered_fault('base_backup_post_create_checkpoint', 1, dbid) +FROM gp_segment_configuration WHERE content=-1 and role='p'; + +-- See that pg_basebackup is still running +SELECT application_name, state FROM pg_stat_replication; + +-- Switch to a new WAL segment file. Two pg_switch_wal() invocations +-- with a command that generates WAL in between the invocations are +-- suffice to generate new WAL file. +CREATE TEMP TABLE walfile(fname text); +INSERT INTO walfile SELECT pg_walfile_name(pg_switch_wal()); +CREATE TABLE master_wal_dummy(); +-- 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; + +-- Checkpoint should retain WAL that is still needed by basebackup. +CHECKPOINT; + +-- Resume basebackup +SELECT gp_inject_fault('base_backup_post_create_checkpoint', 'reset', dbid) +FROM gp_segment_configuration WHERE content=-1 and role='p'; + +-- Wait until basebackup finishes +1<: + +-- Verify if basebackup completed successfully +-- See if recovery.conf exists (Yes - Pass) +SELECT application_name, state FROM pg_stat_replication; +!\retcode ls /tmp/master_wal_switch_test/postgresql.auto.conf /tmp/master_wal_switch_test/standby.signal; diff --git a/src/test/singlenode_isolation2/sql/segwalrep/mirror_promotion.sql b/src/test/singlenode_isolation2/sql/segwalrep/mirror_promotion.sql new file mode 100644 index 00000000000..c461b03786c --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/mirror_promotion.sql @@ -0,0 +1,106 @@ +-- Tests mirror promotion triggered by FTS in 2 different scenarios. +-- +-- 1st: Shut-down of primary and hence unavailability of primary +-- leading to mirror promotion. In this case the connection between +-- primary and mirror is disconnected prior to promotion and +-- walreceiver doesn't exist. +-- +-- 2nd: Primary is alive but using fault injector simulated to not +-- respond to fts. This helps to validate fts time-out logic for +-- probes. Plus also mirror promotion triggered while connection +-- between primary and mirror is still alive and hence walreceiver +-- also exist during promotion. + +SELECT role, preferred_role, content, status FROM gp_segment_configuration; +-- stop a primary in order to trigger a mirror promotion +select pg_ctl((select datadir from gp_segment_configuration c +where c.role='p' and c.content=0), 'stop'); + +-- trigger failover +select gp_request_fts_probe_scan(); +-- wait some seconds until the promotion is done. +!\retcode gpfts -A -D; + +-- expect: to see the content 0, preferred primary is mirror and it's down +-- the preferred mirror is primary and it's up and not-in-sync +select content, preferred_role, role, status, mode +from gp_segment_configuration +where content = 0; + +-- wait some seconds until the promotion is done. +select pg_sleep(2); +-- wait for content 0 (earlier mirror, now primary) to finish the promotion +0U: select 1; +-- Quit this utility mode session, as need to start fresh one below +0Uq: + +-- fully recover the failed primary as new mirror +!\retcode gprecoverseg -aF --no-progress; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +-- expect: to see roles flipped and in sync +select content, preferred_role, role, status, mode +from gp_segment_configuration +where content = 0; + +-- start_ignore +-- set GUCs to speed-up the test +alter system set gp_fts_probe_retries to 2; +alter system set gp_fts_probe_timeout to 5; +select pg_reload_conf(); + +select dbid from gp_segment_configuration where content = 0 and role = 'p'; +-- end_ignore + +select gp_inject_fault_infinite('fts_handle_message', 'infinite_loop', dbid) +from gp_segment_configuration +where content = 0 and role = 'p'; + +-- trigger failover +select gp_request_fts_probe_scan(); +-- trigger one more probe right away which mostly results in sending +-- promotion request again to mirror, while its going through +-- promotion, which is nice condition to test as well. +select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; + +-- expect segments restored back to its preferred role, but mirror is down +select content, preferred_role, role, status, mode +from gp_segment_configuration +where content = 0; + +-- wait some seconds until the promotion is done. +select pg_sleep(2); +-- start_ignore +-- reset GUCs +alter system set gp_fts_probe_retries to default; +alter system set gp_fts_probe_timeout to default; +select pg_reload_conf(); +-- end_ignore +-- wait some seconds until the promotion is done. +select pg_sleep(2); + +-- -- wait for content 0 (earlier mirror, now primary) to finish the promotion +0U: select 1; + +-- create tablespace to test if it works with gprecoverseg -F (pg_basebackup) +!\retcode mkdir -p /tmp/mirror_promotion_tablespace_loc; +create tablespace mirror_promotion_tablespace location '/tmp/mirror_promotion_tablespace_loc'; +create table mirror_promotion_tblspc_heap_table (a int) tablespace mirror_promotion_tablespace; + +-- -- now, let's fully recover the mirror +!\retcode gprecoverseg -aF --no-progress; + +drop table mirror_promotion_tblspc_heap_table; +drop tablespace mirror_promotion_tablespace; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +-- now, the content 0 primary and mirror should be at their preferred role +-- and up and in-sync +select content, preferred_role, role, status, mode +from gp_segment_configuration +where content = 0; diff --git a/src/test/singlenode_isolation2/sql/segwalrep/recoverseg_from_file.sql b/src/test/singlenode_isolation2/sql/segwalrep/recoverseg_from_file.sql new file mode 100644 index 00000000000..5f756962e4b --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/recoverseg_from_file.sql @@ -0,0 +1,98 @@ +-- Test gprecoverseg from config file uses the correct dbid. +-- +-- In github issue 9837 dbid in gp_segment_configuration is not +-- consistent with dbid in file internal.auto.conf. +-- This is caused by gprecoverseg fetch the smallest dbid in +-- gp_segment_configuration which is not occupied by others when +-- adding a new mirror. When dbid in gp_segment_configuration is not +-- continous, the inconsistent issue will happen + +-- +-- generate_recover_config_file: +-- Generate config file used by recoverseg -i, to trigger '__callSegmentAddMirror', +-- we should recover the segment to a different datadir location instead of its +-- original one. +-- +-- start_ignore +set statement_timeout='180s'; +-- end_ignore +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; + +SELECT dbid, role, preferred_role, content, status FROM gp_segment_configuration order by dbid; +-- stop a primary in order to trigger a mirror promotion +select pg_ctl((select datadir from gp_segment_configuration c +where c.role='p' and c.content=1), 'stop'); + +-- trigger failover +select gp_request_fts_probe_scan(); + +-- wait for content 1 (earlier mirror, now primary) to finish the promotion +!\retcode gpfts -A -D; + +-- generate recover config file +select generate_recover_config_file( + (select datadir from gp_segment_configuration c where c.role='m' and c.content=1), + (select port from gp_segment_configuration c where c.role='m' and c.content=1)::text); + +-- recover from config file, only seg with content=1 will be recovered +!\retcode gprecoverseg -a -i /tmp/recover_config_file1; + +!\retcode gpfts -A -D; + +-- after gprecoverseg -i, the down segemnt should be up +-- in mirror mode +select status from gp_segment_configuration +where role='m' and content=1; + +-- recover should reuse the old dbid and not occupy dbid=2 +select dbid from gp_segment_configuration where dbid=2; + +-- recover the segment to its original datadir +!\retcode gprecoverseg -a -i /tmp/recover_config_file2; + +!\retcode gpfts -A -D; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +-- rebalance the cluster +!\retcode gprecoverseg -ar; + +!\retcode gpfts -A -D; + +-- after rebalance walrec in mirror(content=0) will failed to connect +!\retcode gprecoverseg -a; + +!\retcode gpfts -A -D; +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +-- recheck gp_segment_configuration after rebalance +SELECT dbid, role, preferred_role, content, status FROM gp_segment_configuration order by dbid; + +-- remove recovered segment's temp datadir +!\retcode rm -rf `cat /tmp/recover_config_file2 | awk 'BEGIN {FS=" "} {print $1}' | awk 'BEGIN {FS="|"} {print $3}'`; +-- remove the config file +!\retcode rm /tmp/recover_config_file1; +!\retcode rm /tmp/recover_config_file2; + +-- start_ignore +reset statement_timeout; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/segwalrep/replication_keeps_crash.sql b/src/test/singlenode_isolation2/sql/segwalrep/replication_keeps_crash.sql new file mode 100644 index 00000000000..176075ef324 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/replication_keeps_crash.sql @@ -0,0 +1,55 @@ +-- Tests mark mirror down if replication walsender walreceiver keep +-- crash continuously. +-- +-- Primary and mirror both alive, but wal replication crash happens +-- before start streaming data. And walsender, walreceiver keeps +-- re-connect continuously, this may block other processes. +-- GPDB will track the continuously failures for the replication. +-- If the failure times exceed a limitation, FTS will mark the mirror down +-- to avoid blocking other queries. +-- More details please refer to FTSGetReplicationDisconnectTime. + +-- modify fts gucs to speed up the test. +1: select pg_reload_conf(); + +SELECT role, preferred_role, content, status FROM gp_segment_configuration; + +-- Error out before walsender streaming data +select gp_inject_fault_infinite('wal_sender_loop', 'error', dbid) + from gp_segment_configuration where content=0 and role='p'; + +-- Should block in commit (SyncrepWaitForLSN()), waiting for commit +-- LSN to be flushed on mirror. +1&: create table mirror_block_t1 (a int) distributed by (a); + +select gp_wait_until_triggered_fault('wal_sender_loop', 1, dbid) from gp_segment_configuration where role='p' and content=0; + +-- trigger fts to mark mirror down. +select gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; + +-- After gp_fts_replication_attempt_count attempts mirror will be marked down, and syncrep will +-- be marked off and hence the commit should get unblocked. +-- Without gp_fts_replication_attempt_count mirror will continuously connect and re-connect and +-- be in grace period to not be marked down. +1<: + +-- expect: to see the content 0, mirror is mark down +select content, preferred_role, role, status, mode +from gp_segment_configuration +where content = 0; + +select gp_inject_fault('wal_sender_loop', 'reset', dbid) + from gp_segment_configuration where content=0 and role='p'; + +-- -- now, let's recover the mirror +!\retcode gprecoverseg -a --no-progress; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); + +SELECT role, preferred_role, content, status FROM gp_segment_configuration; + +drop table mirror_block_t1; + +1: select pg_reload_conf(); diff --git a/src/test/singlenode_isolation2/sql/segwalrep/twophase_tolerance_with_mirror_promotion.sql b/src/test/singlenode_isolation2/sql/segwalrep/twophase_tolerance_with_mirror_promotion.sql new file mode 100644 index 00000000000..9976b155da2 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/segwalrep/twophase_tolerance_with_mirror_promotion.sql @@ -0,0 +1,114 @@ +-- The goal of these tests is to validate that existing transactions on the +-- primary are not hung when the mirror gets promoted. In order to validate +-- this, mirror promotion is triggered at the following two-phase commit +-- points: +-- 1) if the transaction hasn't prepared, then it should be aborted +-- 2) if the transaction is already prepared, then it should complete commit +-- on the mirror +-- 3) if the transaction has committed on the primary, but not acknowledged +-- to the master then it should complete the commit on the mirror + +-- Test setup: This test needs a minimum of 3 primary/mirror pairs. In order to +-- minimize test time, each scenario is created on a different segment. Each +-- scenario fails over to the mirror and recovery for all 3 mirrors is done at the +-- end of the test. + +-- start_matchsubs +-- +-- # create a match/subs expression +-- +-- m/ERROR: FTS detected connection lost during dispatch to seg0.*/ +-- s/seg\d+.*/seg_DUMMY/gm +-- +-- end_matchsubs + +-- Allow extra time for mirror promotion to complete recovery to avoid +-- gprecoverseg BEGIN failures due to gang creation failure as some primaries +-- are not up. Setting these increase the number of retries in gang creation in +-- case segment is in recovery. Approximately we want to wait 30 seconds. +!\retcode gpconfig -c gp_gang_creation_retry_count -v 127 --skipvalidation --masteronly; +!\retcode gpconfig -c gp_gang_creation_retry_timer -v 250 --skipvalidation --masteronly; +!\retcode gpstop -u; +1:SELECT role, preferred_role, content FROM gp_segment_configuration; + +-- Scenario 1: Not prepared +1:SELECT gp_inject_fault_infinite('start_prepare', 'infinite_loop', dbid) + FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; +1&:CREATE TABLE tolerance_test_table(an_int int); +2:SELECT gp_wait_until_triggered_fault('start_prepare', 1, dbid) + FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; +2:SELECT gp_inject_fault_infinite('fts_handle_message', 'error', dbid) + FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; +-- do fts probe request twice to guarantee the fault is triggered +2:SELECT gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +2:SELECT gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +1<: + +1:SELECT gp_inject_fault('start_prepare', 'reset', dbid) + FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; +1:SELECT gp_inject_fault('fts_handle_message', 'reset', dbid) + FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; +1:SELECT role, preferred_role FROM gp_segment_configuration WHERE content = 0; +-- expect to fail with table not-exists +1:INSERT INTO tolerance_test_table VALUES(42); + +-- Scenario 2: Prepared but not committed +-- NOTICE: Don't use session 2 again because it's cached gang is invalid +1:SELECT gp_inject_fault_infinite('transaction_abort_after_distributed_prepared', 'suspend', dbid) + FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; +1&:CREATE TABLE tolerance_test_table(an_int int); +3:SELECT gp_wait_until_triggered_fault('transaction_abort_after_distributed_prepared', 1, dbid) + FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; +3:SELECT gp_inject_fault_infinite('fts_handle_message', 'error', dbid) + FROM gp_segment_configuration WHERE content = 1 AND role = 'p'; +-- do fts probe request twice to guarantee the fault is triggered +3:SELECT gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +3:SELECT gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +3:SELECT gp_inject_fault('transaction_abort_after_distributed_prepared', 'resume', dbid) + FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; +1<: + +1:SELECT gp_inject_fault('transaction_abort_after_distributed_prepared', 'reset', dbid) + FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; +1:SELECT gp_inject_fault('fts_handle_message', 'reset', dbid) + FROM gp_segment_configuration WHERE content = 1 AND role = 'p'; +1:SELECT role, preferred_role FROM gp_segment_configuration WHERE content = 1; +1:INSERT INTO tolerance_test_table VALUES(42); + +-- 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 +1:SELECT gp_inject_fault_infinite('finish_prepared_start_of_function', 'infinite_loop', dbid) + FROM gp_segment_configuration WHERE content = 2 AND role = 'p'; +1&:DROP TABLE tolerance_test_table; +4:SELECT gp_wait_until_triggered_fault('finish_prepared_start_of_function', 1, dbid) + FROM gp_segment_configuration WHERE content = 2 AND role = 'p'; +4:SELECT gp_inject_fault_infinite('fts_handle_message', 'error', dbid) + FROM gp_segment_configuration WHERE content = 2 AND role = 'p'; +-- do fts probe request twice to guarantee the fault is triggered +4:SELECT gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +4:SELECT gp_request_fts_probe_scan(); +!\retcode gpfts -A -D; +1<: + +-- 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 +-- are exhausted and PANICs the master. +5:SELECT role, preferred_role FROM gp_segment_configuration WHERE content = 2; + +5:!\retcode gprecoverseg -aF \-\-no-progress; +!\retcode gpfts -A -D; +5:!\retcode gprecoverseg -ar; +!\retcode gpfts -A -D; + +!\retcode gpconfig -r gp_gang_creation_retry_count --skipvalidation --masteronly; +!\retcode gpconfig -r gp_gang_creation_retry_timer --skipvalidation --masteronly; +!\retcode gpstop -u; + +-- loop while segments come in sync +select wait_until_all_segments_synchronized(); +5:SELECT role, preferred_role, content FROM gp_segment_configuration; diff --git a/src/test/singlenode_isolation2/sql/select_dropped_table.sql b/src/test/singlenode_isolation2/sql/select_dropped_table.sql new file mode 100644 index 00000000000..f58d7fb4cc9 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/select_dropped_table.sql @@ -0,0 +1,27 @@ +-- The transaction that drop a table will +-- hold Access Exclusive Lock on that table, +-- then other transactions do select|update|delete +-- on that table will wait on that lock. + +-- Cloudberry has a upgrade-lock logic to avoid global +-- deadlock, this logic is still in the code for ao-table +-- and select-for-update cases even we have GDD now. +-- The lock-upgrade logic is implemented by `CdbTryOpenRelation`, +-- this function might return a NULL pointer if the relation is +-- dropped (or some other reasons). + +-- Previous code of parserOpenTable invokes CdbTryOpenRelation, +-- and use the result without checking if the value is a NULL +-- pointer so that leads to SIGSEGV. + +-- This bug has been fixed by adding a check in parserOpenTable. +-- This test is used to confirm the fix. + +1: create table tab_select_dropped_table (c int); +1: begin; +1: drop table tab_select_dropped_table; + +2&: select * from tab_select_dropped_table; + +1: end; +2<: diff --git a/src/test/singlenode_isolation2/sql/setup.sql b/src/test/singlenode_isolation2/sql/setup.sql new file mode 100644 index 00000000000..a3afc9487ea --- /dev/null +++ b/src/test/singlenode_isolation2/sql/setup.sql @@ -0,0 +1,393 @@ +create or replace language plpython3u; + +-- Helper function, to call either __gp_aoseg, or gp_aocsseg, depending +-- on whether the table is row- or column-oriented. This allows us to +-- run the same test queries on both. +-- +-- The Python utility that runs this doesn't know about dollar-quoting, +-- 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; + +-- Show locks in master and in segments. Because the number of segments +-- in the cluster depends on configuration, we print only summary information +-- of the locks in segments. If a relation is locked only on one segment, +-- 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 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 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; + +-- 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; + + +-- +-- pg_ctl: +-- datadir: data directory of process to target with `pg_ctl` +-- command: commands valid for `pg_ctl` +-- command_mode: modes valid for `pg_ctl -m` +-- +create or replace function pg_ctl(datadir text, command text, command_mode text default 'immediate') +returns text as $$ + class PgCtlError(Exception): + def __init__(self, errmsg): + self.errmsg = errmsg + def __str__(self): + return repr(self.errmsg) + + 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; + +-- +-- pg_ctl_start: +-- +-- Start a specific greenplum segment +-- +-- intentionally separate from pg_ctl() because it needs more information +-- +-- 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; + +-- +-- restart_primary_segments_containing_data_for(table_name text): +-- table_name: the table containing data whose segment that needs a restart +-- +-- 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; + +-- +-- clean_restart_primary_segments_containing_data_for(table_name text): +-- table_name: the table containing data whose segment that needs a restart +-- +-- 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 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 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 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 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 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 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 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; + +-- +-- pg_basebackup: +-- host: host of the gpdb segment to back up +-- port: port of the gpdb segment to back up +-- slotname: desired slot name to create and associate with backup +-- datadir: destination data directory of the backup +-- forceoverwrite: overwrite the destination directory if it exists already +-- xlog_method: (stream/fetch) how to obtain XLOG segment files from source +-- +-- usage: `select pg_basebackup('somehost', 12345, 'some_slot_name', '/some/destination/data/directory')` +-- +create or replace function pg_basebackup(host text, dbid int, port bigint, create_slot boolean, slotname text, datadir text, force_overwrite boolean, xlog_method text) returns text as $$ + import subprocess + import os + cmd = 'pg_basebackup --no-sync --checkpoint=fast -h %s -p %d -R -D %s --target-gp-dbid %d' % (host, port, datadir, dbid) + + if create_slot: + cmd += ' --create-slot' + + if slotname is not None: + cmd += ' --slot %s' % (slotname) + + if force_overwrite: + cmd += ' --force-overwrite' + + if xlog_method == 'stream': + cmd += ' --wal-method stream' + elif xlog_method == 'fetch': + cmd += ' --wal-method fetch' + else: + plpy.error('invalid xlog method') + + # GPDB_12_MERGE_FIXME: avoid checking checksum for heap tables + # till we code logic to skip/verify checksum for + # appendoptimized tables. Enabling this results in basebackup + # failures with appendoptimized tables. + 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: " + str(e.output) + + return results +$$ language plpython3u; + +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 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 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; + +-- 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; + +-- start_ignore +set statement_timeout='180s'; +-- end_ignore \ No newline at end of file diff --git a/src/test/singlenode_isolation2/sql/setup_memory_accounting.sql b/src/test/singlenode_isolation2/sql/setup_memory_accounting.sql new file mode 100644 index 00000000000..44d03f9f581 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/setup_memory_accounting.sql @@ -0,0 +1,6 @@ +-- start_ignore +! gpconfig -c gp_vmem_limit_per_query -v '2MB' --skipvalidation +! gpconfig -c gp_vmem_protect_limit -v '20' +! gpconfig -c runaway_detector_activation_percent -v 0 +! gpstop -rai; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/setup_startup_memory_accounting.sql b/src/test/singlenode_isolation2/sql/setup_startup_memory_accounting.sql new file mode 100644 index 00000000000..b32f659ab56 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/setup_startup_memory_accounting.sql @@ -0,0 +1,6 @@ +-- start_ignore +! gpconfig -c gp_vmem_limit_per_query -v '20MB' --skipvalidation +! gpconfig -c gp_vmem_protect_limit -v '60' +! gpconfig -c runaway_detector_activation_percent -v 0 +! gpstop -rai; +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/standby_replay_dtx_info.sql b/src/test/singlenode_isolation2/sql/standby_replay_dtx_info.sql new file mode 100644 index 00000000000..532ac1ef1ae --- /dev/null +++ b/src/test/singlenode_isolation2/sql/standby_replay_dtx_info.sql @@ -0,0 +1,73 @@ +-- Test if standby will overflow shmNumCommittedGxacts + +-- This case test if shmCommittedGxactArray will be overflowed at the following +-- scenario: When a DTX has flushed FORGET COMMITTED XLOG into disk, +-- but didn't change its own state to DTX_STATE_INSERTED_FORGET_COMMITTED. +-- If at this very moment, checkpoint process is calculating DTX info, it +-- will include the DTX into its XLOG record. + +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; + +select wait_for_standby_replay(1200); +create table test_dtx_standby_tbl(c1 int); + +-- We have just created a checkpoint. The next automatic checkpoint +-- will be triggered only after 5 minutes or after CheckPointSegments +-- wal segments. Neither of that can happen until this test calls +-- explicit checkpoint. +checkpoint; + +1: select gp_inject_fault_infinite('dtm_before_insert_forget_comitted', 'suspend', dbid) from gp_segment_configuration where content = -1 and role = 'p'; +1: select gp_inject_fault_infinite('checkpoint_after_redo_calculated', 'suspend', dbid) from gp_segment_configuration where content = -1 and role = 'p'; +1&: select gp_wait_until_triggered_fault('dtm_before_insert_forget_comitted', 1, dbid) from gp_segment_configuration where content = -1 and role = 'p'; + +-- record the transaction into checkpoint XLOG and make sure commit forget XLOG is writen +-- before checkpoint XLOG. +2&: insert into test_dtx_standby_tbl select generate_series(1,10); +1<: +1&: select gp_wait_until_triggered_fault('checkpoint_after_redo_calculated', 1, dbid) from gp_segment_configuration where content = -1 and role = 'p'; +3&: checkpoint; +1<: +1: select gp_inject_fault_infinite('dtm_before_insert_forget_comitted', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'p'; +2<: +1: select gp_inject_fault_infinite('checkpoint_after_redo_calculated', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'p'; +3<: + +-- now the array may have 1 unforggten gid, and we set max_tm_gxacts to 1 +1: select gp_inject_fault_infinite('standby_gxacts_overflow', 'skip', dbid) from gp_segment_configuration where content = -1 and role = 'm'; + +-- this DTX might overflow gxacts array +2: insert into test_dtx_standby_tbl select generate_series(11,20); + +-- Wait standby to replay all XLOG +select wait_for_standby_replay(1200); + +select gp_inject_fault_infinite('standby_gxacts_overflow', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'm'; +drop table test_dtx_standby_tbl; +drop function wait_for_standby_replay(int); diff --git a/src/test/singlenode_isolation2/sql/starve_case.sql b/src/test/singlenode_isolation2/sql/starve_case.sql new file mode 100644 index 00000000000..fa651371417 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/starve_case.sql @@ -0,0 +1,131 @@ +-- +-- Test to ensure that reader processes do not cause starvation of +-- processes already waiting on a lock. Readers must wait on a lock +-- if their writer does not already hold the lock and the requested +-- lockmode conflicts with existing waiter's lockmode (waitMask +-- conflict). +-- + +create table starve (c int); +create table starve_helper (name varchar, sessionid int); + +-- 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 +-- cannot understand its definition. That way, AccessShareLock is +-- requested during execution of the function. If the lock is acquired +-- during plan generation of the calling SQL statement, the +-- 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; + +-- 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; + +-- Hold access shared lock, so that session2 must wait. +1: begin; +1: select * from starve; + +2: insert into starve_helper select 'session2', setting::int from pg_settings + where name = 'gp_session_id'; +-- Wait on access exclusive lock. +2: begin; +2>: alter table starve rename column c to d; + +select wait_until_locks_awaited('session2'); + +3: insert into starve_helper select 'session3', setting::int + from pg_settings where name = 'gp_session_id'; +-- 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 +-- lock on starve table. So the reader must wait. +3: begin; +3>: select * from starve_helper, function_starve_volatile(5); + +select wait_until_locks_awaited('session3'); + +-- Check the lock table, expect both session2 and session3 to wait. +-- expect: 2 rows with AccessExclusiveLock and AccessSharedLock +select mode from pg_locks where granted=false and relation='starve'::regclass +and gp_segment_id=-1; + +-- Let everyone move forward. +1: commit; + +-- session2 is granted the lock on starve table first. +2<: +2: select mode from pg_locks where granted=false and + relation='starve'::regclass and gp_segment_id=-1; +2: commit; + +-- session3 is granted the lock after session2 commits. We should +-- see error column 'c' doesn't exist because session2 renamed it. +3<: +3: commit; + + +-- +-- Test to ensure that writers do not starve processes already waiting +-- on a lock in case of waitMask conflict. +-- +truncate table starve_helper; + +-- Hold access shared lock, so that session2 must wait. +1: begin; +1: select * from starve; + +2: insert into starve_helper select 'session2', setting::int from + pg_settings where name = 'gp_session_id'; +-- Wait on access exclusive lock. +2: begin; +2>: alter table starve add column e int default 0; + +select wait_until_locks_awaited('session2'); + +3: insert into starve_helper select 'session3', setting::int from pg_settings + where name = 'gp_session_id'; +3: begin; +-- Wait on RowExclusiveLock on table starve because session2 is +-- waiting on the same lock with a conflicting lockmode. +3>: insert into starve values (1), (2); + +select wait_until_locks_awaited('session3'); + +1: commit; +-- Session2 must go first. +2<: +-- Ensure that session3 is still waiting. +2: select mode from pg_locks where granted=false and relation='starve'::regclass + and gp_segment_id=-1; +2: commit; + +-- Session3 gets the lock only after session2 commits. +3<: +3: commit; diff --git a/src/test/singlenode_isolation2/sql/sync_guc.sql b/src/test/singlenode_isolation2/sql/sync_guc.sql new file mode 100644 index 00000000000..606b5ae9d3d --- /dev/null +++ b/src/test/singlenode_isolation2/sql/sync_guc.sql @@ -0,0 +1,72 @@ +-- TEST 1: Fix Github issue https://github.com/greenplum-db/gpdb/issues/9208 +1: create schema sync_np1; +1: create schema sync_np2; +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; +1q: +-- The SET command will create a Gang on the primaries, and the GUC +-- values should be the same on all QD/QEs. +2: show search_path; +2: set search_path = 'sync_np1,sync_np2'; + +-- The `reset_val` of `search_path` should be synchronized from the QD, +-- so, the GUC value will be also synchronized with the QD after RESET. +-- If the search_path is inconsistent between the QD and QEs after RESET, +-- creating the function will fail. +2: reset search_path; +2: select public.segment_setting('search_path'); +2: create or replace function sync_f1() returns int as $$ select 1234; $$language sql; +2: select sync_f1(); +2: drop function sync_f1(); +2: drop schema sync_np1; +2: drop schema sync_np2; +2q: + +-- TEST 2: Fix Github issue https://github.com/greenplum-db/gpdb/issues/685 +-- `gp_select_invisible` is default to false. SET command will dispatch +-- the GUC's `reset_val` and changed value to the created Gang. If the QE(s) +-- use the incorrect `reset_val`, its value will be inconsistent with the QD's, +-- i.e. the `gp_select_invisible` is still false on the QEs. +3: show gp_select_invisible; +3: set gp_select_invisible = on; +3: reset gp_select_invisible; +3: select public.segment_setting('gp_select_invisible'); +3: create table sync_t1(i int); +3: insert into sync_t1 select i from generate_series(1,10)i; +3: delete from sync_t1; +3: select * from sync_t1; +3: drop table sync_t1; +3q: + +1: drop function public.segment_setting(guc text); +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); +4: create temp table sync_t12(a int, b int) distributed by(a); + +-- 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 +-- We'll test SET/RESET xxx will be called for all QEs in the current session. +4: select relname from sync_t11, sync_t12, pg_class; + +4: select gp_inject_fault('set_variable_fault', 'skip', dbid) + from gp_segment_configuration where role='p'; +4: set statement_mem = '12MB'; +4: select gp_wait_until_triggered_fault('set_variable_fault', 2, dbid) + from gp_segment_configuration where role='p'; +4: select gp_inject_fault('set_variable_fault', 'reset', dbid) + from gp_segment_configuration where role='p'; + +4: select gp_inject_fault('reset_variable_fault', 'skip', dbid) + from gp_segment_configuration where role='p'; +4: reset statement_mem; +4: select gp_wait_until_triggered_fault('reset_variable_fault', 2, dbid) + from gp_segment_configuration where role='p'; +4: select gp_inject_fault('reset_variable_fault', 'reset', dbid) + from gp_segment_configuration where role='p'; +4q: + diff --git a/src/test/singlenode_isolation2/sql/terminate_in_gang_creation.sql b/src/test/singlenode_isolation2/sql/terminate_in_gang_creation.sql new file mode 100644 index 00000000000..7d0ade7e15c --- /dev/null +++ b/src/test/singlenode_isolation2/sql/terminate_in_gang_creation.sql @@ -0,0 +1,98 @@ +-- start_matchsubs +-- m/seg[0-9] [0-9.]+:\d+/ +-- s/seg[0-9] [0-9.]+:\d+/segN IP:PORT/ +-- m/lock \[\d+,\d+\]/ +-- s/lock \[\d+,\d+\]// +-- m/DETAIL: .* FATAL: reader could not find writer proc entry/ +-- s/DETAIL: .* FATAL: reader could not find writer proc entry/DETAIL: FATAL: reader could not find writer proc entry/ +-- end_matchsubs + +-- skip dtx recovery check to avoid hitting the fault create_gang_in_progress. +SELECT gp_inject_fault_infinite('before_orphaned_check', 'skip', dbid) + FROM gp_segment_configuration WHERE role='p' AND content=-1; +ALTER SYSTEM SET gp_dtx_recovery_interval to 5; +SELECT pg_reload_conf(); +SELECT gp_wait_until_triggered_fault('before_orphaned_check', 1, dbid) + FROM gp_segment_configuration WHERE role='p' AND content=-1; + +-- SIGSEGV issue when freeing gangs +-- +-- When SIGTERM is handled during gang creation we used to trigger +-- a wild pointer access like below backtrace: +-- +-- #0 raise +-- #1 StandardHandlerForSigillSigsegvSigbus_OnMainThread +-- #2 +-- #3 MemoryContextFreeImpl +-- #4 cdbconn_termSegmentDescriptor +-- #5 DisconnectAndDestroyGang +-- #6 freeGangsForPortal +-- #7 AbortTransaction +-- ... +-- #14 ProcessInterrupts +-- #15 createGang_async +-- #16 createGang +-- #17 AllocateWriterGang + +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (c1 int, c2 int) DISTRIBUTED BY (c1); + +10: BEGIN; + +SELECT gp_inject_fault('create_gang_in_progress', 'reset', 1); +SELECT gp_inject_fault('create_gang_in_progress', 'suspend', 1); + +10&: SELECT * FROM foo a JOIN foo b USING (c2); + +SELECT gp_wait_until_triggered_fault('create_gang_in_progress', 1, 1); + +SELECT pg_terminate_backend(pid) FROM pg_stat_activity + WHERE query = 'SELECT * FROM foo a JOIN foo b USING (c2);'; + +SELECT gp_inject_fault('create_gang_in_progress', 'resume', 1); + +10<: +10q: + +DROP TABLE foo; + +-- 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 +-- error like this: +-- +-- ERROR: failed to acquire resources on one or more segments +-- 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. +-- (seg2 127.0.0.1:7004) +-- +-- This is ok since the writer gang is gone, but previously QD code does +-- not reset all gangs (just retry creating the new reader gang) so re-running +-- this query could always fail with the same error since the reader gang would +-- always fail to create. The below test is used to test the fix. + +-- skip FTS probes to avoid segment being marked down on restart +SELECT gp_inject_fault_infinite('fts_probe', 'skip', dbid) + FROM gp_segment_configuration WHERE role='p' AND content=-1; +SELECT gp_request_fts_probe_scan(); +-- Prevent below pg_ctl restart timeout although the timeout should be enough. +CHECKPOINT; + +-- not recycle idle QEs to avoid the flaky test where restarting primary takes a long time. +11: SET gp_vmem_idle_resource_timeout TO 0; +11: CREATE TABLE foo (c1 int, c2 int) DISTRIBUTED BY (c1); +-- ORCA optimizes value scan so there is no additional reader gang in below INSERT. +11: SET optimizer = off; +-- the value scan (reader gang) might be on any segment so restart all segments. +SELECT pg_ctl(datadir, 'restart', 'immediate') + FROM gp_segment_configuration WHERE role='p' AND content != -1; +11: INSERT INTO foo values(2),(1); +11: INSERT INTO foo values(2),(1); +11: DROP TABLE foo; +11: RESET gp_vmem_idle_resource_timeout; + +SELECT gp_inject_fault('fts_probe', 'reset', dbid) + FROM gp_segment_configuration WHERE role='p' AND content=-1; +SELECT gp_inject_fault_infinite('before_orphaned_check', 'reset', dbid) + FROM gp_segment_configuration WHERE role='p' AND content=-1; +2: ALTER SYSTEM RESET gp_dtx_recovery_interval; +2: SELECT pg_reload_conf(); diff --git a/src/test/singlenode_isolation2/sql/truncate_after_ao_vacuum_skip_drop.sql b/src/test/singlenode_isolation2/sql/truncate_after_ao_vacuum_skip_drop.sql new file mode 100644 index 00000000000..956728741ad --- /dev/null +++ b/src/test/singlenode_isolation2/sql/truncate_after_ao_vacuum_skip_drop.sql @@ -0,0 +1,28 @@ +-- Ensure segfiles in AOSEG_STATE_AWAITING_DROP are not leaked in +-- AppendOnlyHash after doing a TRUNCATE. + +CREATE TABLE truncate_after_ao_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true); +INSERT INTO truncate_after_ao_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; + +DELETE FROM truncate_after_ao_vacuum_skip_drop; + +-- We should see all aosegs in state 1 +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); + +-- VACUUM while another session holds lock +1: BEGIN; +1: SELECT COUNT(*) FROM truncate_after_ao_vacuum_skip_drop; +2: VACUUM truncate_after_ao_vacuum_skip_drop; +1: END; + +-- 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'); + +-- The AO relation should be rewritten and AppendOnlyHash entry invalidated +1: TRUNCATE truncate_after_ao_vacuum_skip_drop; +0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); + +-- 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; +0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); diff --git a/src/test/singlenode_isolation2/sql/uao/.gitignore b/src/test/singlenode_isolation2/sql/uao/.gitignore new file mode 100644 index 00000000000..d1b811b7de5 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/uao/.gitignore @@ -0,0 +1 @@ +*.sql diff --git a/src/test/singlenode_isolation2/sql/uao/README b/src/test/singlenode_isolation2/sql/uao/README new file mode 100644 index 00000000000..6d2cade1965 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/uao/README @@ -0,0 +1,2 @@ +This directory only contains generated files. +All files in this directory are ignored by .gitignore. diff --git a/src/test/singlenode_isolation2/sql/uao_crash_compaction_column.sql b/src/test/singlenode_isolation2/sql/uao_crash_compaction_column.sql new file mode 100644 index 00000000000..52b517f8538 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/uao_crash_compaction_column.sql @@ -0,0 +1,149 @@ +-- start_matchsubs +-- +-- # create a match/subs expression +-- +-- m/ERROR:.*server closed the connection unexpectedly/ +-- s/ERROR:.*server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/gm +-- end_matchsubs + +3:SELECT role, preferred_role, content, status FROM gp_segment_configuration; +-- +-- Test to validate crash at different points in AO/CO vacuum. +-- +-- Setup tables to test crash at different points +-- for crash_before_cleanup_phase +3:set default_table_access_method = ao_column; +3:show default_table_access_method; +3:DROP TABLE IF EXISTS crash_before_cleanup_phase CASCADE; +3:CREATE TABLE crash_before_cleanup_phase (a INT, b INT, c CHAR(20)); +3:CREATE INDEX crash_before_cleanup_phase_index ON crash_before_cleanup_phase(b); +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; +3:DELETE FROM crash_before_cleanup_phase WHERE a < 4; +-- for crash_vacuum_in_appendonly_insert +3:DROP TABLE IF EXISTS crash_vacuum_in_appendonly_insert CASCADE; +3:CREATE TABLE crash_vacuum_in_appendonly_insert (a INT, b INT, c CHAR(20)); +3:CREATE INDEX crash_vacuum_in_appendonly_insert_index ON crash_vacuum_in_appendonly_insert(b); +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; +3:UPDATE crash_vacuum_in_appendonly_insert SET b = 2; + +-- inject panic fault. +3:SELECT gp_inject_fault('appendonly_insert', 'panic', '', '', 'crash_vacuum_in_appendonly_insert', 1, -1, 0, 2); + +-- VACUUM on crash_before_cleanup_phase will end up skipping the drop +-- phase after not being able to acquire AccessExclusiveLock because +-- we make session 3 hold AccessShareLock. This results in segment +-- file 1 remaining in drop pending state which results in segment +-- file 1 not being scheduled for any new inserts. +3:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'suspend', '', '', 'crash_before_cleanup_phase', 1, -1, 0, 2); +3:BEGIN; +3:SELECT count(*) FROM crash_before_cleanup_phase; +1&:VACUUM crash_before_cleanup_phase; +3:SELECT gp_wait_until_triggered_fault('compaction_before_cleanup_phase', 1, 2); +3:END; + +-- 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 +-- crash_recovery +3:VACUUM crash_vacuum_in_appendonly_insert; +1<: + +-- wait for segment to complete recovering +0U: SELECT 1; +0Uq: + +-- reset faults as protection incase tests failed and panic didn't happen +1:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'reset', 2); +1:SELECT gp_inject_fault('appendonly_insert', 'reset', 2); + +-- perform post crash validation checks +-- for crash_before_cleanup_phase +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_before_cleanup_phase'); +1:INSERT INTO crash_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); +1:UPDATE crash_before_cleanup_phase SET b = b+10 WHERE a=25; +1:SELECT * FROM crash_before_cleanup_phase ORDER BY a,b; +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_before_cleanup_phase'); +-- This VACUUM removes the previous drop pending state for segment file 1 which +-- will make it available for future inserts. +1:VACUUM crash_before_cleanup_phase; +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_before_cleanup_phase'); +1:INSERT INTO crash_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); +1:UPDATE crash_before_cleanup_phase SET b = b+10 WHERE a=26; +1:SELECT * FROM crash_before_cleanup_phase ORDER BY a,b; +-- crash_vacuum_in_appendonly_insert +-- verify the old segment files are still visible after the vacuum is aborted. +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_vacuum_in_appendonly_insert') where segno = 1; +-- verify the new segment files contain no tuples. +1:SELECT sum(tupcount) FROM gp_toolkit.__gp_aocsseg('crash_vacuum_in_appendonly_insert') where segno = 2; +1:VACUUM crash_vacuum_in_appendonly_insert; +1:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_vacuum_in_appendonly_insert'); +1:INSERT INTO crash_vacuum_in_appendonly_insert VALUES(21, 1, 'c'), (26, 1, 'c'); +1:UPDATE crash_vacuum_in_appendonly_insert SET b = b+10 WHERE a=26; +1:SELECT * FROM crash_vacuum_in_appendonly_insert ORDER BY a,b; + +-- +-- Setup tables to test crash at different points on master now +-- +-- for crash_master_before_cleanup_phase +2:set default_table_access_method = ao_column; +2:show default_table_access_method; +2:DROP TABLE IF EXISTS crash_master_before_cleanup_phase CASCADE; +2:CREATE TABLE crash_master_before_cleanup_phase (a INT, b INT, c CHAR(20)); +2:CREATE INDEX crash_master_before_cleanup_phase_index ON crash_master_before_cleanup_phase(b); +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; +2:DELETE FROM crash_master_before_cleanup_phase WHERE a < 4; + +-- inject panic fault +2:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'panic', '', '', 'crash_master_before_cleanup_phase', 1, -1, 0, 1); +2:VACUUM crash_master_before_cleanup_phase; + +-- reset faults as protection incase tests failed and panic didn't happen +4:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'reset', 1); + +-- perform post crash validation checks +-- for crash_master_before_cleanup_phase +4:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_master_before_cleanup_phase'); +4:INSERT INTO crash_master_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); +4:UPDATE crash_master_before_cleanup_phase SET b = b+10 WHERE a=25; +4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; +4:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_master_before_cleanup_phase'); +4:VACUUM crash_master_before_cleanup_phase; +4:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_master_before_cleanup_phase'); +4:INSERT INTO crash_master_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); +4:UPDATE crash_master_before_cleanup_phase SET b = b+10 WHERE a=26; +4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; + +-- Scenario for validating mirror replays fine and doesn't crash on +-- truncate record replay even if file is missing. +-- skip FTS probes to avoid marking primary status down. +4:SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); +4:SELECT gp_request_fts_probe_scan(); +4:SET default_table_access_method = ao_column; +4:CREATE TABLE crash_vacuum_in_appendonly_insert_1 (a INT, b INT, c CHAR(20)); +-- 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'); +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; +4:UPDATE crash_vacuum_in_appendonly_insert_1 SET b = 2; +4:SELECT gp_inject_fault('xlog_ao_insert', 'infinite_loop', 2); +-- This will cause file to be created on primary for segno 2 but crash +-- just before creating the xlog record. Hence, primary will have the +-- file but not mirror. +4&:VACUUM crash_vacuum_in_appendonly_insert_1; +5:SELECT gp_wait_until_triggered_fault('xlog_ao_insert', 1, 2); +-- to make sure xlog gets flushed till this point to persist the +-- changes to pg_aocsseg. +5:CHECKPOINT; +-- Restart the primary to interrupt vacuum at that exact point. +5:select pg_ctl((select datadir from gp_segment_configuration c +where c.role='p' and c.content=0), 'restart'); +4<: +-- Shows entries for new files added to pg_aocsseg table. These are +-- the entries next vacuum command will use to perform truncate. +0U:SELECT segno,column_num,physical_segno,tupcount,modcount,state FROM gp_toolkit.__gp_aocsseg('crash_vacuum_in_appendonly_insert_1'); +-- generates truncate xlog record for all the files having entry in +-- pg_aocsseg table. +6:VACUUM crash_vacuum_in_appendonly_insert_1; +-- Make sure mirror is able to successfully replay all the truncate +-- records generated and doesn't encounter the "WAL contains +-- references to invalid pages" PANIC. +6:SELECT * from wait_for_replication_replay(0, 5000); +6:SELECT gp_inject_fault('fts_probe', 'reset', 1); diff --git a/src/test/singlenode_isolation2/sql/uao_crash_compaction_row.sql b/src/test/singlenode_isolation2/sql/uao_crash_compaction_row.sql new file mode 100644 index 00000000000..a7282845e4d --- /dev/null +++ b/src/test/singlenode_isolation2/sql/uao_crash_compaction_row.sql @@ -0,0 +1,108 @@ +-- start_matchsubs +-- +-- # create a match/subs expression +-- +-- m/ERROR:.*server closed the connection unexpectedly/ +-- s/ERROR:.*server closed the connection unexpectedly/ERROR: server closed the connection unexpectedly/gm +-- end_matchsubs +3:SELECT role, preferred_role, content, status FROM gp_segment_configuration; +-- +-- Test to validate crash at different points in AO/CO vacuum. +-- +-- Setup tables to test crash at different points +-- for crash_before_cleanup_phase +3:set default_table_access_method = ao_row; +3:show default_table_access_method; +3:DROP TABLE IF EXISTS crash_before_cleanup_phase CASCADE; +3:CREATE TABLE crash_before_cleanup_phase (a INT, b INT, c CHAR(20)); +3:CREATE INDEX crash_before_cleanup_phase_index ON crash_before_cleanup_phase(b); +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; +3:DELETE FROM crash_before_cleanup_phase WHERE a < 4; +-- for crash_vacuum_in_appendonly_insert +3:DROP TABLE IF EXISTS crash_vacuum_in_appendonly_insert CASCADE; +3:CREATE TABLE crash_vacuum_in_appendonly_insert (a INT, b INT, c CHAR(20)); +3:CREATE INDEX crash_vacuum_in_appendonly_insert_index ON crash_vacuum_in_appendonly_insert(b); +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; +3:UPDATE crash_vacuum_in_appendonly_insert SET b = 2; + +-- suspend at intended points. +3:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'suspend', '', '', 'crash_before_cleanup_phase', 1, -1, 0, 2); +1&:VACUUM crash_before_cleanup_phase; +3:SELECT gp_wait_until_triggered_fault('compaction_before_cleanup_phase', 1, 2); + +-- 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 +-- crash_recovery +3:SELECT gp_inject_fault('appendonly_insert', 'panic', '', '', 'crash_vacuum_in_appendonly_insert', 1, -1, 0, 2); +3:VACUUM crash_vacuum_in_appendonly_insert; +1<: + +-- wait for segment to complete recovering +0U: SELECT 1; + +-- reset faults as protection incase tests failed and panic didn't happen +1:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'reset', 2); +1:SELECT gp_inject_fault('appendonly_insert', 'reset', 2); + +-- perform post crash validation checks +-- for crash_before_cleanup_phase +-- the compaction should be done, but the post-cleanup should not be performed, +-- so awaiting-dropping segment file should exists in the pg_aoseg* catalog on +-- seg0, however, the status on the seg1 is undetermined, any concurrent trans +-- will delay the dropping of dead segment files. +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_before_cleanup_phase') where segment_id = 0; +-- do vacuum again, there should be no await-dropping segment files, no concurrent +-- transactions exist this time when the VACUUM is performed. +1:VACUUM crash_before_cleanup_phase; +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_before_cleanup_phase'); +1:INSERT INTO crash_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); +1:UPDATE crash_before_cleanup_phase SET b = b+10 WHERE a=25; +1:SELECT * FROM crash_before_cleanup_phase ORDER BY a,b; +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_before_cleanup_phase'); +1:VACUUM crash_before_cleanup_phase; +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_before_cleanup_phase'); +1:INSERT INTO crash_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); +1:UPDATE crash_before_cleanup_phase SET b = b+10 WHERE a=26; +1:SELECT * FROM crash_before_cleanup_phase ORDER BY a,b; +-- crash_vacuum_in_appendonly_insert +-- verify the old segment files are still visible after the vacuum is aborted. +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_vacuum_in_appendonly_insert') where segno = 1; +-- verify the new segment files contain no tuples. +1:SELECT sum(tupcount) FROM gp_toolkit.__gp_aoseg('crash_vacuum_in_appendonly_insert') where segno = 2; +1:VACUUM crash_vacuum_in_appendonly_insert; +1:SELECT * FROM gp_toolkit.__gp_aoseg('crash_vacuum_in_appendonly_insert'); +1:INSERT INTO crash_vacuum_in_appendonly_insert VALUES(21, 1, 'c'), (26, 1, 'c'); +1:UPDATE crash_vacuum_in_appendonly_insert SET b = b+10 WHERE a=26; +1:SELECT * FROM crash_vacuum_in_appendonly_insert ORDER BY a,b; + +-- +-- Setup tables to test crash at different points on master now +-- +-- for crash_master_before_cleanup_phase +2:set default_table_access_method = ao_row; +2:show default_table_access_method; +2:DROP TABLE IF EXISTS crash_master_before_cleanup_phase CASCADE; +2:CREATE TABLE crash_master_before_cleanup_phase (a INT, b INT, c CHAR(20)); +2:CREATE INDEX crash_master_before_cleanup_phase_index ON crash_master_before_cleanup_phase(b); +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; +2:DELETE FROM crash_master_before_cleanup_phase WHERE a < 4; + +-- suspend at intended points +2:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'panic', '', '', 'crash_master_before_cleanup_phase', 1, -1, 0, 1); +2:VACUUM crash_master_before_cleanup_phase; + +-- reset faults as protection incase tests failed and panic didn't happen +4:SELECT gp_inject_fault('compaction_before_cleanup_phase', 'reset', 1); + +-- perform post crash validation checks +-- for crash_master_before_cleanup_phase +4:SELECT * FROM gp_toolkit.__gp_aoseg('crash_master_before_cleanup_phase'); +4:INSERT INTO crash_master_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); +4:UPDATE crash_master_before_cleanup_phase SET b = b+10 WHERE a=25; +4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; +4:SELECT * FROM gp_toolkit.__gp_aoseg('crash_master_before_cleanup_phase'); +4:VACUUM crash_master_before_cleanup_phase; +4:SELECT * FROM gp_toolkit.__gp_aoseg('crash_master_before_cleanup_phase'); +4:INSERT INTO crash_master_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); +4:UPDATE crash_master_before_cleanup_phase SET b = b+10 WHERE a=26; +4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; diff --git a/src/test/singlenode_isolation2/sql/udf_exception_blocks_panic_scenarios.sql b/src/test/singlenode_isolation2/sql/udf_exception_blocks_panic_scenarios.sql new file mode 100644 index 00000000000..ba72bb081c8 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/udf_exception_blocks_panic_scenarios.sql @@ -0,0 +1,175 @@ +-- Tests exception handling of GPDB PL/PgSQL UDF +-- It exercises: +-- 1. PROTOCOL or SQL type of dtm_action_target +-- 2. Various levels of sub-transactions +-- 3. dtm_action_protocol(PROTOCOL): subtransaction_begin, subtransaction_rollback or subtransaction_release +-- 4. dtm_action: fail_begin_command, fail_end_command or panic_begin_comand +-- +-- debug_dtm_action: Using this can specify what action to be +-- triggered/simulated and at what point like error / panic / delay +-- and at start or end command after receiving by the segment. + +-- debug_dtm_action_segment: Using this can specify segment number to +-- trigger the specified dtm_action. + +-- debug_dtm_action_target: Allows to set target for specified +-- dtm_action should it be DTM protocol command or SQL command from +-- master to segment. + +-- debug_dtm_action_protocol: Allows to specify sub-type of DTM +-- protocol for which to perform specified dtm_action (like prepare, +-- abort_no_prepared, commit_prepared, abort_prepared, +-- subtransaction_begin, subtransaction_release, +-- subtransaction_rollback, etc... +-- +-- debug_dtm_action_sql_command_tag: If debug_dtm_action_target is sql +-- then this parameter can be used to set the type of sql that should +-- trigger the exeception. Ex: 'MPPEXEC UPDATE' + +-- debug_dtm_action_nestinglevel: This allows to optional specify at +-- which specific depth level in transaction to take the specified +-- dtm_action. This apples only to target with protocol and not SQL. +-- +-- +-- start_matchsubs +-- s/\s+\(.*\.[ch]:\d+\)/ (SOMEFILE:SOMEFUNC)/ +-- m/ / +-- m/transaction \d+/ +-- s/transaction \d+/transaction / +-- m/transaction -\d+/ +-- s/transaction -\d+/transaction/ +-- end_matchsubs + +-- skip FTS probes always +SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); +SELECT gp_request_fts_probe_scan(); +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 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; +SELECT role, preferred_role, content, status FROM gp_segment_configuration; +SET debug_dtm_action_segment=0; +SET debug_dtm_action_target=protocol; +SET debug_dtm_action_protocol=subtransaction_begin; +SET debug_dtm_action=panic_begin_command; +SET debug_dtm_action_nestinglevel=0; +DROP TABLE IF EXISTS employees; +select test_protocol_allseg(1, 2,'f'); +-- make sure segment recovery is complete after panic. +0U: select 1; +0Uq: +select * from employees; +-- +-- +SET debug_dtm_action_segment=0; +SET debug_dtm_action_target=protocol; +SET debug_dtm_action_protocol=subtransaction_release; +SET debug_dtm_action=panic_begin_command; +SET debug_dtm_action_nestinglevel=0; +DROP TABLE IF EXISTS employees; +select test_protocol_allseg(1, 2,'f'); +-- make sure segment recovery is complete after panic. +0U: select 1; +0Uq: +select * from employees; +-- +-- +SET debug_dtm_action_segment=0; +SET debug_dtm_action_target=protocol; +SET debug_dtm_action_protocol=subtransaction_release; +SET debug_dtm_action=panic_begin_command; +SET debug_dtm_action_nestinglevel=4; +DROP TABLE IF EXISTS employees; +select test_protocol_allseg(1, 2,'f'); +-- make sure segment recovery is complete after panic. +0U: select 1; +0Uq: +select * from employees; +-- +-- +SET debug_dtm_action_segment=0; +SET debug_dtm_action_target=protocol; +SET debug_dtm_action_protocol=subtransaction_rollback; +SET debug_dtm_action=panic_begin_command; +SET debug_dtm_action_nestinglevel=3; +DROP TABLE IF EXISTS employees; +select test_protocol_allseg(1, 2,'f'); +-- make sure segment recovery is complete after panic. +0U: select 1; +0Uq: +select * from employees; +-- +-- +SET debug_dtm_action_segment=0; +SET debug_dtm_action_target=protocol; +SET debug_dtm_action_protocol=subtransaction_rollback; +SET debug_dtm_action=panic_begin_command; +SET debug_dtm_action_nestinglevel=0; +DROP TABLE IF EXISTS employees; +select test_protocol_allseg(1, 2,'f'); +-- make sure segment recovery is complete after panic. +0U: select 1; +0Uq: +select * from employees; +-- +-- +SET debug_dtm_action_segment=0; +SET debug_dtm_action_target=protocol; +SET debug_dtm_action_protocol=subtransaction_begin; +SET debug_dtm_action=panic_begin_command; +SET debug_dtm_action_nestinglevel=3; +DROP TABLE IF EXISTS employees; +select test_protocol_allseg(1, 2,'f'); +-- make sure segment recovery is complete after panic. +0U: select 1; +0Uq: +select * from employees; + +SELECT gp_inject_fault('fts_probe', 'reset', 1); diff --git a/src/test/singlenode_isolation2/sql/unlogged_appendonly_tables.sql b/src/test/singlenode_isolation2/sql/unlogged_appendonly_tables.sql new file mode 100644 index 00000000000..b0170628ae7 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/unlogged_appendonly_tables.sql @@ -0,0 +1,51 @@ +-- expect: create table succeeds +create unlogged table unlogged_appendonly_table_managers ( + id int, + name text +) with ( + appendonly=true +) distributed by (id); + +-- skip FTS probes to make the test deterministic. +SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); +SELECT gp_request_fts_probe_scan(); +SELECT gp_request_fts_probe_scan(); + +-- expect: insert/update/select works +insert into unlogged_appendonly_table_managers values (1, 'Joe'); +insert into unlogged_appendonly_table_managers values (2, 'Jane'); +update unlogged_appendonly_table_managers set name = 'Susan' where id = 2; +select * from unlogged_appendonly_table_managers order by id; +select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendonly_table_managers'); + + +-- force an unclean stop and recovery: +-- start_ignore +select restart_primary_segments_containing_data_for('unlogged_appendonly_table_managers'); +-- end_ignore + +-- expect inserts/updates are truncated after crash recovery +2: select * from unlogged_appendonly_table_managers; +2: select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendonly_table_managers'); + + +-- expect: insert/update/select works +3: insert into unlogged_appendonly_table_managers values (1, 'Joe'); +3: insert into unlogged_appendonly_table_managers values (2, 'Jane'); +3: update unlogged_appendonly_table_managers set name = 'Susan' where id = 2; +3: select * from unlogged_appendonly_table_managers order by id; +3: select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendonly_table_managers'); + +-- force a clean stop and recovery: +-- start_ignore +select clean_restart_primary_segments_containing_data_for('unlogged_appendonly_table_managers'); +-- end_ignore + +-- expect: inserts/updates are persisted +4: select * from unlogged_appendonly_table_managers order by id; +4: select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendonly_table_managers'); + +-- expect: drop table succeeds +5: drop table unlogged_appendonly_table_managers; + +SELECT gp_inject_fault('fts_probe', 'reset', 1); diff --git a/src/test/singlenode_isolation2/sql/unlogged_heap_tables.sql b/src/test/singlenode_isolation2/sql/unlogged_heap_tables.sql new file mode 100644 index 00000000000..b7535384537 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/unlogged_heap_tables.sql @@ -0,0 +1,45 @@ +-- expect: create table succeeds +create unlogged table unlogged_heap_table_managers ( + id int, + name text +) distributed by (id); + +-- skip FTS probes to make the test deterministic. +SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); +SELECT gp_request_fts_probe_scan(); +SELECT gp_request_fts_probe_scan(); + +-- expect: insert/update/select works +insert into unlogged_heap_table_managers values (1, 'Joe'); +insert into unlogged_heap_table_managers values (2, 'Jane'); +update unlogged_heap_table_managers set name = 'Susan' where id = 2; +select * from unlogged_heap_table_managers order by id; + + +-- force an unclean stop and recovery: +-- start_ignore +select restart_primary_segments_containing_data_for('unlogged_heap_table_managers'); +-- end_ignore + +-- expect inserts/updates are truncated after crash recovery +2: select * from unlogged_heap_table_managers; + + +-- expect: insert/update/select works +3: insert into unlogged_heap_table_managers values (1, 'Joe'); +3: insert into unlogged_heap_table_managers values (2, 'Jane'); +3: update unlogged_heap_table_managers set name = 'Susan' where id = 2; +3: select * from unlogged_heap_table_managers order by id; + +-- force a clean stop and recovery: +-- start_ignore +select clean_restart_primary_segments_containing_data_for('unlogged_heap_table_managers'); +-- end_ignore + +-- expect: inserts/updates are persisted +4: select * from unlogged_heap_table_managers order by id; + +-- expect: drop table succeeds +5: drop table unlogged_heap_table_managers; + +SELECT gp_inject_fault('fts_probe', 'reset', 1); diff --git a/src/test/singlenode_isolation2/sql/update_hash_col_utilitymode.sql b/src/test/singlenode_isolation2/sql/update_hash_col_utilitymode.sql new file mode 100644 index 00000000000..376e7cadbf7 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/update_hash_col_utilitymode.sql @@ -0,0 +1,9 @@ +create table t_update_hash_col_utilitymode(c int, d int) distributed by (c); + +-- This works. +1U: update t_update_hash_col_utilitymode set d = d + 1; + +-- But this throws an error. +1U: update t_update_hash_col_utilitymode set c = c + 1; + +drop table t_update_hash_col_utilitymode; diff --git a/src/test/singlenode_isolation2/sql/upgrade_numsegments.sql b/src/test/singlenode_isolation2/sql/upgrade_numsegments.sql new file mode 100644 index 00000000000..fd81ffb03b9 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/upgrade_numsegments.sql @@ -0,0 +1,20 @@ +-- This test case is used to test if we can get the correct +-- numsegments when the connection is in utility mode. +-- With introducing the numsegments in gp_distribution_policy +-- pg_upgrade can not run correctly because it is run in +-- utility mode and the numsegments can not get correctly in +-- utility mode, now we support to get the numsegments in +-- utility mode when the connection is running for pg_upgrade. +-- We can sure that CREATE TABLE command will try to get +-- numsegments in utility mode, so we use it to test the +-- function. +-1U: create temp table t1(c1 int, c2 int); +0U: create temp table t1(c1 int, c2 int); +1U: create temp table t1(c1 int, c2 int); +2U: create temp table t1(c1 int, c2 int); +-- start_ignore +-1Uq: +0Uq: +1Uq: +2Uq: +-- end_ignore diff --git a/src/test/singlenode_isolation2/sql/vacuum_after_vacuum_skip_drop_column.sql b/src/test/singlenode_isolation2/sql/vacuum_after_vacuum_skip_drop_column.sql new file mode 100644 index 00000000000..54763e8f37c --- /dev/null +++ b/src/test/singlenode_isolation2/sql/vacuum_after_vacuum_skip_drop_column.sql @@ -0,0 +1,27 @@ +-- @Description Ensures next vacuum drops segfiles in AOSEG_STATE_AWAITING_DROP +-- left over by a previous vacuum +-- +CREATE TABLE aoco_vacuum_after_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true, orientation=column); +INSERT INTO aoco_vacuum_after_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; + +DELETE FROM aoco_vacuum_after_vacuum_skip_drop; + +-- We should see all aocssegs in state 1 +0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_vacuum_after_vacuum_skip_drop'); + +-- VACUUM while another session holds lock +1: BEGIN; +1: SELECT COUNT(*) FROM aoco_vacuum_after_vacuum_skip_drop; +2: VACUUM aoco_vacuum_after_vacuum_skip_drop; +1: END; + +-- 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'); + +-- The VACUUM should clean up aocssegs in state 2 (AOSEG_STATE_AWAITING_DROP) +1: VACUUM aoco_vacuum_after_vacuum_skip_drop; +0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_vacuum_after_vacuum_skip_drop'); + +-- 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; +0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aocsseg('aoco_vacuum_after_vacuum_skip_drop'); diff --git a/src/test/singlenode_isolation2/sql/vacuum_full_interrupt.sql b/src/test/singlenode_isolation2/sql/vacuum_full_interrupt.sql new file mode 100644 index 00000000000..ca9510a42a8 --- /dev/null +++ b/src/test/singlenode_isolation2/sql/vacuum_full_interrupt.sql @@ -0,0 +1,38 @@ +-- Test the scenario when the VACUUM FULL is interrupted on segment after +-- 'swap_relation_files' is finished. + +-- There was a bug that swap_relation_files inplace update the old entry in the +-- pg_class and the pg_class entry has incorrect relfrozenxid after the +-- transaction is aborted. + +1: CREATE TABLE vacuum_full_interrupt(a int, b int, c int); +1: CREATE INDEX vacuum_full_interrupt_idx on vacuum_full_interrupt(b); +1: INSERT INTO vacuum_full_interrupt SELECT i, i, i from generate_series(1,100)i; +1: ANALYZE vacuum_full_interrupt; +-- the relfrozenxid is the same as xmin when there's concurrent transactions. +-- the reltuples is 100 +1: SELECT xmin=relfrozenxid relfrozenxid_not_changed, relhasindex, reltuples FROM pg_class WHERE relname='vacuum_full_interrupt'; + +-- break on QE after 'swap_relation_files' is finished +1: SELECT gp_inject_fault('after_swap_relation_files', 'suspend', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; +2&: VACUUM FULL vacuum_full_interrupt; +1: SELECT gp_wait_until_triggered_fault('after_swap_relation_files', 1, dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; + +-- cancel VACUUM FULL +1: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query = 'VACUUM FULL vacuum_full_interrupt;'; +1: SELECT gp_inject_fault('after_swap_relation_files', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; +2<: + +-- the relfrozenxid should stay unchanged +-- the reltuples should be 100, but QD has already commit the transaction and the reltuples is updated to 0, this looks like a bug +2: SELECT xmin=relfrozenxid relfrozenxid_not_changed, relhasindex, reltuples FROM pg_class WHERE relname='vacuum_full_interrupt'; +0U: SELECT xmin=relfrozenxid relfrozenxid_not_changed, relhasindex, reltuples FROM pg_class WHERE relname='vacuum_full_interrupt'; + +-- 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; +2: SET optimizer=off; +2: SET enable_seqscan=off; +2: SET enable_bitmapscan=off; +2: SET enable_indexscan=on; +2: EXPLAIN SELECT * FROM vacuum_full_interrupt WHERE b=2; +2: SELECT * FROM vacuum_full_interrupt WHERE b=2; diff --git a/src/test/singlenode_isolation2/sql/vacuum_recently_dead_tuple_due_to_distributed_snapshot.sql b/src/test/singlenode_isolation2/sql/vacuum_recently_dead_tuple_due_to_distributed_snapshot.sql new file mode 100644 index 00000000000..de6719883cb --- /dev/null +++ b/src/test/singlenode_isolation2/sql/vacuum_recently_dead_tuple_due_to_distributed_snapshot.sql @@ -0,0 +1,39 @@ +-- Test that VACUUM in utility mode doesn't remove tuples that are still +-- 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); + +insert into test_recently_dead_utility select g from generate_series(1, 100) g; + +-- A function that: +-- +-- 1. Establishes a snapshot, without launching any QE backends. It does this +-- by selecting from pg_database. +-- 2. Sleeps 10 seconds +-- 3. runs "select count(*) from test_recently_dead_utility" +-- +-- It would've been more clear to use a transaction block, "BEGIN; ... COMMIT" +-- for these steps. However, BEGIN immediately starts connections to the QE +-- nodes, and we don't want to acquire local snapshots in the QE nodes, until +-- step 3. Instead, run these steps in a function that's marked as STABLE. +-- (A VOLATILE function would acquire a different snapshot for each command +-- in the function, but we want it all to run with a single snapshot.) +-- +-- (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; + +-- In one session, launch afunc(). +1&: select afunc(); + +-- Meanwhile, delete some rows from foo. These rows should still be visible to +-- afunc(). (But first sleep a bit to make sure afunc() has established a +-- snapshot before the delete.) +2: select pg_sleep(1); +2: delete from test_recently_dead_utility; + +-- Run VACUUM in utility mode. It should *not* remove the deleted tuples yet. +0U: vacuum verbose test_recently_dead_utility; + +-- Continue afunc(). It should see all the rows in the table, ie. 100 rows. +1<: diff --git a/src/test/singlenode_isolation2/sql_isolation_testcase.py b/src/test/singlenode_isolation2/sql_isolation_testcase.py new file mode 100644 index 00000000000..cd2fdfaf6e6 --- /dev/null +++ b/src/test/singlenode_isolation2/sql_isolation_testcase.py @@ -0,0 +1,1074 @@ +""" +Copyright (c) 2004-Present VMware, Inc. or its affiliates. + +This program and the accompanying materials are made available under +the terms of the under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import pg +import pty +import os +import subprocess +import re +import multiprocessing +import tempfile +import time +import sys +import socket +from optparse import OptionParser +import traceback +import select + +def is_digit(n): + try: + int(n) + return True + 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 + 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() + + ConnectionInfo.__instance = self + for content, _, _, _ in ConnectionInfo.__instance._conn_map: + if content >= self.max_content_id: + self.max_content_id = content + 1 + + @staticmethod + def __get_instance(): + if ConnectionInfo.__instance is None: + return ConnectionInfo() + return ConnectionInfo.__instance + + @staticmethod + def get_hostname_port(name, role_name): + content_id = int(name) + conn_map = ConnectionInfo.__get_instance()._conn_map + max_content_id = ConnectionInfo.__get_instance().max_content_id + real_content_id = content_id % max_content_id if content_id >= 0 else content_id % (-max_content_id) + for content, host, port, role in conn_map: + if real_content_id == content and role == role_name: + return (host, port) + raise Exception("Cannont find a connection with content_id=%d, role=%c" % (content_id, role_name)) + + +class GlobalShellExecutor(object): + BASH_PS1 = 'test_sh$>' + + class ExecutionError(Exception): + "" + pass + + def __init__(self, output_file='', initfile_prefix=''): + self.output_file = output_file + self.initfile_prefix = initfile_prefix + self.v_cnt = 0 + # open pseudo-terminal to interact with subprocess + self.master_fd, self.slave_fd = pty.openpty() + self.sh_proc = subprocess.Popen(['/bin/bash', '--noprofile', '--norc', '--noediting', '-i'], + stdin=self.slave_fd, + stdout=self.slave_fd, + stderr=self.slave_fd, + universal_newlines=True) + self.bash_log_file = open("%s.log" % self.initfile_prefix, "w+") + self.__run_command("export PS1='%s'" % GlobalShellExecutor.BASH_PS1) + self.__run_command("export PS2=''") + self.__run_command("source global_sh_executor.sh") + + def terminate(self, with_error = False): + if self.sh_proc == None: + return + # If write the matchsubs section directly to the output, the generated token id will be compared by gpdiff.pl + # so here just write all matchsubs section into an auto generated init file when this test case file finished. + if not with_error and self.initfile_prefix != None and len(self.initfile_prefix) > 1: + output_init_file = "%s.ini" % self.initfile_prefix + cmd = ''' [ ! -z "${MATCHSUBS}" ] && echo "-- start_matchsubs ${NL} ${MATCHSUBS} ${NL}-- end_matchsubs" > %s ''' % output_init_file + self.exec_global_shell(cmd, False) + + if self.bash_log_file: + self.bash_log_file.close() + try: + self.sh_proc.terminate() + except OSError as e: + # Ignore the exception if the process doesn't exist. + pass + self.sh_proc = None + + def __run_command(self, sh_cmd): + # Strip the newlines at the end. It will be added later. + sh_cmd = sh_cmd.rstrip() + bytes_written = os.write(self.master_fd, sh_cmd.encode()) + bytes_written += os.write(self.master_fd, b'\n') + + output = "" + while self.sh_proc.poll() is None: + # If not returns in 10 seconds, consider it as an fatal error. + r, w, e = select.select([self.master_fd], [], [self.master_fd], 10) + if e: + # Terminate the shell when we get any output from stderr + o = os.read(self.master_fd, 10240) + self.bash_log_file.write(o) + self.bash_log_file.flush() + self.terminate(True) + raise GlobalShellExecutor.ExecutionError("Error happened to the bash daemon, see %s for details." % self.bash_log_file.name) + + if r: + o = os.read(self.master_fd, 10240).decode() + self.bash_log_file.write(o) + self.bash_log_file.flush() + output += o + if o.endswith(GlobalShellExecutor.BASH_PS1): + lines = output.splitlines() + return lines[len(sh_cmd.splitlines()):len(lines) - 1] + + if not r and not e: + self.terminate(True) + raise GlobalShellExecutor.ExecutionError("Timeout happened to the bash daemon, see %s for details." % self.bash_log_file.name) + + self.terminate(True) + raise GlobalShellExecutor.ExecutionError("Bash daemon has been stopped, see %s for details." % self.bash_log_file.name) + + # execute global shell cmd in bash deamon, and fetch result without blocking + def exec_global_shell(self, sh_cmd, is_trip_output_end_blanklines): + if self.sh_proc == None: + raise GlobalShellExecutor.ExecutionError("The bash daemon has been terminated abnormally, see %s for details." % self.bash_log_file.name) + + # get the output of shell command + output = self.__run_command(sh_cmd) + if is_trip_output_end_blanklines: + for i in range(len(output)-1, 0, -1): + if len(output[i].strip()) == 0: + del output[i] + else: + break + + return output + + # execute gobal shell: + # 1) set input stream -> $RAW_STR + # 2) execute shell command from input + # if error, write error message to err_log_file + + def exec_global_shell_with_orig_str(self, input, sh_cmd, is_trip_output_end_blanklines): + self.v_cnt = 1 + self.v_cnt + escape_in = input.replace('\'', "'\\''") + # send shell cmd and set the temp RAW_STR + cmd = ''' export RAW_STR%d='%s' && export RAW_STR=$RAW_STR%d && %s ; unset RAW_STR ''' % ( + self.v_cnt, escape_in, self.v_cnt, sh_cmd) + return self.exec_global_shell(cmd, is_trip_output_end_blanklines) + + # extract shell, sql part from one line with format: @header '': SQL + # return row: (found the header or not?, the extracted shell, the SQL in the left part) + def extract_sh_cmd(self, header, input_str): + start = len(header) + is_start = False + end = 0 + is_trip_comma = False + res_cmd = "" + res_sql = "" + + input_str = input_str.lstrip() + if not input_str.startswith(header): + return (False, None, None) + + for i in range(start, len(input_str)): + if end == 0 and input_str[i] == '\'': + if not is_start: + # find shell begin postion + is_start = True + start = i+1 + continue + cnt = 0 + for j in range(i-1, 0, -1): + if input_str[j] == '\\': + cnt = 1 + cnt + else: + break + if cnt % 2 == 1: + continue + # find shell end postion + res_cmd = input_str[start: i] + end = i + continue + if end != 0: + # skip space until ':' + if input_str[i] == ' ': + continue + elif input_str[i] == ':': + is_trip_comma = True + res_sql = input_str[i+1:] + break + if not is_start or end == 0 or not is_trip_comma: + raise Exception("Invalid format: %s", input_str) + #unescape \' to ' and \\ to ' + res_cmd = res_cmd.replace('\\\'', '\'') + res_cmd = res_cmd.replace('\\\\', '\\') + return (True, res_cmd, res_sql) + +class SQLIsolationExecutor(object): + def __init__(self, dbname=''): + self.processes = {} + # The re.S flag makes the "." in the regex match newlines. + # When matched against a command in process_command(), all + # lines in the command are matched and sent as SQL query. + self.command_pattern = re.compile(r"^(-?\d+|[*])([&\\<\\>URSMq]*?)\:(.*)", re.S) + if dbname: + self.dbname = dbname + else: + self.dbname = os.environ.get('PGDATABASE') + + # To indicate the session has not been created or terminated. + class SessionError(Exception): + def __init__(self, name, mode, msg): + super(SQLIsolationExecutor.SessionError, self).__init__(msg) + self.name = name + self.mode = mode + + class SQLConnection(object): + def __init__(self, out_file, name, mode, dbname, user = None, passwd = None): + self.name = name + self.mode = mode + self.out_file = out_file + self.dbname = dbname + self.user = user + self.passwd = passwd + + parent_conn, child_conn = multiprocessing.Pipe(True) + self.p = multiprocessing.Process(target=self.session_process, args=(child_conn,)) + self.pipe = parent_conn + self.has_open = False + self.p.start() + + # Close "our" copy of the child's handle, so that if the child dies, + # recv() on the pipe will fail. + child_conn.close() + + self.out_file = out_file + + def session_process(self, pipe): + sp = SQLIsolationExecutor.SQLSessionProcess(self.name, + self.mode, pipe, self.dbname, user=self.user, passwd=self.passwd) + sp.do() + + def query(self, command, post_run_cmd = None, global_sh_executor = None): + print(file=self.out_file) + self.out_file.flush() + if len(command.strip()) == 0: + return + if self.has_open: + raise Exception("Cannot query command while waiting for results") + + self.pipe.send((command, False)) + r = self.pipe.recv() + if r is None: + raise Exception("Execution failed") + if re.match(r"^#.*:", r): + raise SQLIsolationExecutor.SessionError(self.name, self.mode, r) + + if post_run_cmd != None: + new_out = global_sh_executor.exec_global_shell_with_orig_str(r.rstrip(), post_run_cmd, True) + for line in new_out: + print(line.rstrip(), file=self.out_file) + else: + print(r.rstrip(), file=self.out_file) + + def fork(self, command, blocking, global_sh_executor): + print(" ", file=self.out_file) + self.pipe.send((command, True)) + + if blocking: + time.sleep(0.5) + if self.pipe.poll(0): + p = self.pipe.recv() + raise Exception("Forked command is not blocking; got output: %s" % p.strip()) + self.has_open = True + + def join(self): + r = None + print(" <... completed>", file=self.out_file) + if self.has_open: + r = self.pipe.recv() + if r is None: + raise Exception("Execution failed") + print(r.rstrip(), file=self.out_file) + self.has_open = False + + def stop(self): + self.pipe.send(("", False)) + self.p.join() + if self.has_open: + raise Exception("Should not finish test case while waiting for results") + + def quit(self): + print(" ... ", file=self.out_file) + self.stop() + + def terminate(self): + self.pipe.close() + self.p.terminate() + + class SQLSessionProcess(object): + def __init__(self, name, mode, pipe, dbname, user = None, passwd = None): + """ + Constructor + """ + self.name = name + self.mode = mode + self.pipe = pipe + self.dbname = dbname + self.passwd = passwd + self.user = user + # If there is an exception thrown when creating session, save it and send + # it to pipe when we get the first execute_command call. + self.create_exception = None + if self.mode == "utility": + (hostname, port) = self.get_hostname_port(name, 'p') + self.con = self.connectdb(given_dbname=self.dbname, + given_host=hostname, + given_port=port, + given_opt="-c gp_role=utility", + given_user=user, + given_passwd=passwd) + elif self.mode == "standby": + # Connect to standby even when its role is recorded + # as mirror. This is useful for scenarios where a + # test needs to promote a standby without using + # gpactivatestandby. + (hostname, port) = self.get_hostname_port(name, 'm') + self.con = self.connectdb(given_dbname=self.dbname, + given_host=hostname, + given_port=port, + given_user=user, + given_passwd=passwd) + elif self.mode == "retrieve": + (hostname, port) = ConnectionInfo.get_hostname_port(name, 'p') + self.con = self.connectdb(given_dbname=self.dbname, + given_host=hostname, + given_port=port, + given_opt="-c gp_retrieve_conn=true", + given_user=user, + given_passwd=passwd) + elif self.mode == "mirror": + # Connect to mirror even when it's role is recorded + # as mirror. This is useful for scenarios where a + # primary is marked down but could actually accept + # connection. This implies utility connection. + (hostname, port) = self.get_hostname_port(name, 'm') + self.con = self.connectdb(given_dbname=self.dbname, + given_host=hostname, + given_port=port, + given_opt="-c gp_role=utility") + else: + self.con = self.connectdb(self.dbname) + + def connectdb(self, given_dbname, given_host = None, given_port = None, given_opt = None, given_user = None, given_passwd = None): + con = None + 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) + 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)): + self.create_exception = e + break + elif (("the database system is starting up" in str(e) or + "the database system is in recovery mode" in str(e)) and + retry > 1): + retry -= 1 + time.sleep(0.1) + else: + raise + if con is not None: + con.set_notice_receiver(null_notice_receiver) + return con + + 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): + """ + Print out a pygresql 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.) + """ + widths = [] + + # Figure out the widths of each column. + fields = r.listfields() + for f in fields: + widths.append(len(str(f))) + + rset = r.getresult() + for row in rset: + colno = 0 + for col in row: + if col is None: + col = "" + widths[colno] = max(widths[colno], len(str(col))) + colno = colno + 1 + + # Start printing. Header first. + result = "" + colno = 0 + for f in fields: + if colno > 0: + result += "|" + result += " " + f.ljust(widths[colno]) + " " + colno = colno + 1 + result += "\n" + + # Then the bar ("----+----") + colno = 0 + for f in fields: + if colno > 0: + result += "+" + result += "".ljust(widths[colno] + 2, "-") + colno = colno + 1 + result += "\n" + + # Then the result set itself + for row in rset: + colno = 0 + for col in row: + if colno > 0: + result += "|" + if isinstance(col, float): + col = format(col, "g") + elif isinstance(col, bool): + if col: + col = 't' + else: + col = 'f' + elif col is None: + col = "" + result += " " + str(col).ljust(widths[colno]) + " " + colno = colno + 1 + result += "\n" + + # Finally, the row count + if len(rset) == 1: + result += "(1 row)\n" + else: + result += "(" + str(len(rset)) + " rows)\n" + + return result + + 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) + 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: + return str(e) + + def do(self): + """ + Process loop. + Ends when the command None is received + """ + (c, wait) = self.pipe.recv() + while c: + if wait: + time.sleep(0.1) + if self.create_exception: + # When parent process received this, it should know the connection has not been + # created. Thus, the process entry should be cleared. + self.pipe.send("#%s%s> %s" % (self.name, self.mode, str(self.create_exception))) + else: + r = self.execute_command(c) + self.pipe.send(r) + r = None + + (c, wait) = self.pipe.recv() + + + def get_process(self, out_file, name, mode="", dbname="", user=None, passwd=None): + """ + Gets or creates the process by the given name + """ + if len(name) > 0 and not is_digit(name): + raise Exception("Name should be a number") + if len(name) > 0 and mode != "utility" and int(name) >= 1024: + raise Exception("Session name should be smaller than 1024 unless it is utility mode number") + + if not (name, mode) in self.processes: + if not dbname: + dbname = self.dbname + self.processes[(name, mode)] = SQLIsolationExecutor.SQLConnection(out_file, name, mode, dbname, user, passwd) + return self.processes[(name, mode)] + + def quit_process(self, out_file, name, mode="", dbname=""): + """ + Quits a process with the given name + """ + if len(name) > 0 and not is_digit(name): + raise Exception("Name should be a number") + if len(name) > 0 and mode != "utility" and int(name) >= 1024: + raise Exception("Session name should be smaller than 1024 unless it is utility mode number") + + if not (name, mode) in self.processes: + raise Exception("Sessions not started cannot be quit") + + self.processes[(name, mode)].quit() + del self.processes[(name, mode)] + + def get_all_primary_contentids(self, dbname): + """ + Retrieves all primary content IDs (including the master). Intended for + use by *U queries. + """ + 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] + + def __preprocess_sql(self, name, pre_run_cmd, sql, global_sh_executor): + if not pre_run_cmd: + return sql + + (hostname, port) = ConnectionInfo.get_hostname_port(name, 'p') + # Inject the current hostname and port to the shell. + global_sh_executor.exec_global_shell("GP_HOSTNAME=%s" % hostname, True) + global_sh_executor.exec_global_shell("GP_PORT=%s" % port, True) + sqls = global_sh_executor.exec_global_shell_with_orig_str(sql, pre_run_cmd, True) + if (len(sqls) != 1): + raise Exception("Invalid shell command: %s" % "\n".join(sqls)) + + return sqls[0] + + def __get_retrieve_user_token(self, name, global_sh_executor): + (hostname, port) = ConnectionInfo.get_hostname_port(name, 'p') + global_sh_executor.exec_global_shell("GP_HOSTNAME=%s" % hostname, True) + global_sh_executor.exec_global_shell("GP_PORT=%s" % port, True) + out = global_sh_executor.exec_global_shell("get_retrieve_token", True) + if (len(out) > 0): + token = out[0] + out = global_sh_executor.exec_global_shell("echo ${RETRIEVE_USER}", True) + if (len(out) > 0): + user = out[0] + return (user, token) + + def process_command(self, command, output_file, global_sh_executor): + """ + Processes the given command. + The command at this point still includes the isolation behavior + flags, e.g. which session to use. + """ + process_name = "" + sql = command + flag = "" + con_mode = "" + dbname = "" + retrieve_token = None + retrieve_user = None + pre_run_cmd = None + post_run_cmd = None + m = self.command_pattern.match(command) + if m: + process_name = m.groups()[0] + flag = m.groups()[1] + if flag and flag[0] == "U": + con_mode = "utility" + elif flag and flag[0] == "S": + if len(flag) > 1: + flag = flag[1:] + con_mode = "standby" + elif flag and flag[0] == "R": + con_mode = "retrieve" + elif flag and flag[0] == "M": + con_mode = "mirror" + sql = m.groups()[2] + sql = sql.lstrip() + # If db_name is specifed , it should be of the following syntax: + # 1:@db_name : + if sql.startswith('@db_name'): + sql_parts = sql.split(':', 2) + if not len(sql_parts) == 2: + raise Exception("Invalid syntax with dbname, should be of the form 1:@db_name : ") + if not sql_parts[0].startswith('@db_name'): + raise Exception("Invalid syntax with dbname, should be of the form 1:@db_name : ") + if not len(sql_parts[0].split()) == 2: + raise Exception("Invalid syntax with dbname, should be of the form 1:@db_name : ") + dbname = sql_parts[0].split()[1].strip() + if not dbname: + raise Exception("Invalid syntax with dbname, should be of the form 1:@db_name : ") + sql = sql_parts[1] + else: + (found_hd, pre_run_cmd, ex_sql) = global_sh_executor.extract_sh_cmd('@pre_run', sql) + if found_hd: + sql = ex_sql + else: + (found_hd, post_run_cmd, ex_sql) = global_sh_executor.extract_sh_cmd('@post_run', sql) + if found_hd: + sql = ex_sql + + if not flag: + if sql.startswith('!'): + sql = sql[1:] + + # Check for execution mode. E.g. + # !\retcode path/to/executable --option1 --option2 ... + # + # At the moment, we only recognize the \retcode mode, which + # ignores all program output in the diff (it's still printed) + # and adds the return code. + mode = None + if sql.startswith('\\'): + mode, sql = sql.split(None, 1) + if mode != '\\retcode': + raise Exception('Invalid execution mode: {}'.format(mode)) + + cmd_output = subprocess.Popen(sql.strip(), stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True) + stdout, _ = cmd_output.communicate() + print(file=output_file) + if mode == '\\retcode': + print('-- start_ignore', file=output_file) + print(stdout.decode(), file=output_file) + if mode == '\\retcode': + print('-- end_ignore', file=output_file) + print('(exited with code {})'.format(cmd_output.returncode), file=output_file) + else: + sql_new = self.__preprocess_sql(process_name, pre_run_cmd, sql.strip(), global_sh_executor) + self.get_process(output_file, process_name, con_mode, dbname=dbname).query(sql_new, post_run_cmd, global_sh_executor) + elif flag == "&": + self.get_process(output_file, process_name, con_mode, dbname=dbname).fork(sql.strip(), True, global_sh_executor) + elif flag == ">": + self.get_process(output_file, process_name, con_mode, dbname=dbname).fork(sql.strip(), False, global_sh_executor) + elif flag == "<": + if len(sql) > 0: + raise Exception("No query should be given on join") + self.get_process(output_file, process_name, con_mode, dbname=dbname).join() + elif flag == "q": + if len(sql) > 0: + raise Exception("No query should be given on quit") + self.quit_process(output_file, process_name, con_mode, dbname=dbname) + elif flag == "U": + if process_name == '*': + process_names = [str(content) for content in self.get_all_primary_contentids(dbname)] + else: + process_names = [process_name] + + for name in process_names: + sql_new = self.__preprocess_sql(name, pre_run_cmd, sql.strip(), global_sh_executor) + self.get_process(output_file, name, con_mode, dbname=dbname).query(sql_new, post_run_cmd, global_sh_executor) + elif flag == "U&": + sql_new = self.__preprocess_sql(process_name, pre_run_cmd, sql.strip(), global_sh_executor) + self.get_process(output_file, process_name, con_mode, dbname=dbname).fork(sql_new, True, global_sh_executor) + elif flag == "U<": + if len(sql) > 0: + raise Exception("No query should be given on join") + self.get_process(output_file, process_name, con_mode, dbname=dbname).join() + elif flag == "Uq": + if len(sql) > 0: + raise Exception("No query should be given on quit") + self.quit_process(output_file, process_name, con_mode, dbname=dbname) + elif flag == "S": + sql_new = self.__preprocess_sql(process_name, pre_run_cmd, sql.strip(), global_sh_executor) + self.get_process(output_file, process_name, con_mode, dbname=dbname).query(sql_new, post_run_cmd, global_sh_executor) + elif flag == "R": + if process_name == '*': + process_names = [str(content) for content in self.get_all_primary_contentids(dbname)] + else: + process_names = [process_name] + + for name in process_names: + try: + sql_new = self.__preprocess_sql(name, pre_run_cmd, sql.strip(), global_sh_executor) + (retrieve_user, retrieve_token) = self.__get_retrieve_user_token(name, global_sh_executor) + self.get_process(output_file, name, con_mode, dbname=dbname, user=retrieve_user, passwd=retrieve_token).query(sql_new, post_run_cmd, global_sh_executor) + except SQLIsolationExecutor.SessionError as e: + print(str(e), file=output_file) + self.processes[(e.name, e.mode)].terminate() + del self.processes[(e.name, e.mode)] + elif flag == "R&": + sql_new = self.__preprocess_sql(process_name, pre_run_cmd, sql.strip(), global_sh_executor) + (retrieve_user, retrieve_token) = self.__get_retrieve_user_token(process_name, global_sh_executor) + self.get_process(output_file, process_name, con_mode, dbname=dbname, user=retrieve_user, passwd=retrieve_token).fork(sql_new, True, global_sh_executor) + elif flag == "R<": + if len(sql) > 0: + raise Exception("No query should be given on join") + (retrieve_user, retrieve_token) = self.__get_retrieve_user_token(process_name, global_sh_executor) + self.get_process(output_file, process_name, con_mode, dbname=dbname, user=retrieve_user, passwd=retrieve_token).join() + elif flag == "Rq": + if len(sql) > 0: + raise Exception("No query should be given on quit") + + if process_name == '*': + process_names = [str(content) for content in self.get_all_primary_contentids(dbname)] + else: + process_names = [process_name] + + for name in process_names: + try: + self.quit_process(output_file, name, con_mode, dbname=dbname) + except Exception as e: + print(str(e), file=output_file) + pass + elif flag == "M": + self.get_process(output_file, process_name, con_mode, dbname=dbname).query(sql.strip(), post_run_cmd, global_sh_executor) + else: + raise Exception("Invalid isolation flag") + + def process_isolation_file(self, sql_file, output_file, initfile_prefix): + """ + Processes the given sql file and writes the output + to output file + """ + shell_executor = GlobalShellExecutor(output_file, initfile_prefix) + try: + command = "" + newline = False + for line in sql_file: + # this logic replicates the python2 behavior of a trailing comma at the end of print + # i.e. ''' print >>output_file, line.strip(), ''' + print((" " if command and not newline else "") + line.strip(), end="", file=output_file) + newline = False + if line[0] == "!": + command_part = line # shell commands can use -- for multichar options like --include + elif re.match(r";.*--", line) or re.match(r"^--", line): + command_part = line.partition("--")[0] # remove comment from line + else: + command_part = line + if command_part == "" or command_part == "\n": + print(file=output_file) + newline = True + elif re.match(r".*;\s*$", command_part) or re.match(r"^\d+[q\\<]:\s*$", line) or re.match(r"^\*Rq:$", line) or re.match(r"^-?\d+[SUR][q\\<]:\s*$", line): + command += command_part + try: + self.process_command(command, output_file, shell_executor) + except GlobalShellExecutor.ExecutionError as e: + # error in the daemon shell cannot be recovered + raise + except Exception as e: + print("FAILED: ", e, file=output_file) + command = "" + else: + command += command_part + + for process in list(self.processes.values()): + process.stop() + except: + for process in list(self.processes.values()): + process.terminate() + shell_executor.terminate() + raise + finally: + for process in list(self.processes.values()): + process.terminate() + shell_executor.terminate() + +class SQLIsolationTestCase: + """ + The isolation test case allows a fine grained control of interleaved + executing transactions. This is mainly used to test isolation behavior. + + [<#>[flag]:] | ! + #: either an integer indicating a unique session, or a content-id if + followed by U (for utility-mode connections) or R (for retrieve-mode + connection). In 'U' mode or 'R' mode, the + content-id can alternatively be an asterisk '*' to perform a + utility-mode/retrieve-mode query on the master and all primary segments. + If you want to create multiple connections to the same content-id, just + increase N in: "content-id + {gpdb segment node number} * N", + e.g. if gpdb cluster segment number is 3, then: + (1) the master utility connections can be: -1U, -4U, -7U; + (2) the seg0 connections can be: 0U, 3U, 6U; + (3) the seg1 connections can be: 1U, 4U, 7U; + (4) the seg2 connections can be: 2U, 5U, 8U; + flag: + &: expect blocking behavior + >: running in background without blocking + <: join an existing session + q: quit the given session without blocking + + U: connect in utility mode to primary contentid from gp_segment_configuration + U&: expect blocking behavior in utility mode (does not currently support an asterisk target) + U<: join an existing utility mode session (does not currently support an asterisk target) + + R|R&|R<: similar to 'U' meaning execept that the connect is in retrieve mode, here don't + thinking about retrieve mode authentication, just using the normal authentication directly. + + An example is: + + Execute BEGIN in transaction 1 + Execute BEGIN in transaction 2 + Execute INSERT in transaction 2 + Execute SELECT in transaction 1 + Execute COMMIT in transaction 2 + Execute SELECT in transaction 1 + + The isolation tests are specified identical to sql-scripts in normal + SQLTestCases. However, it is possible to prefix a SQL line with + an tranaction identifier followed by a colon (":"). + The above example would be defined by + 1: BEGIN; + 2: BEGIN; + 2: INSERT INTO a VALUES (1); + 1: SELECT * FROM a; + 2: COMMIT; + 1: SELECT * FROM a; + + Blocking behavior can be tested by forking and joining. + 1: BEGIN; + 2: BEGIN; + 1: DELETE FROM foo WHERE a = 4; + 2&: DELETE FROM foo WHERE a = 4; + 1: COMMIT; + 2<: + 2: COMMIT; + + 2& forks the command. It is executed in the background. If the + command is NOT blocking at this point, it is considered an error. + 2< joins the background command and outputs the result of the + command execution. + + Session ids should be smaller than 1024. + + 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: + + 1:@db_name testdb: + 2:@db_name test2db: + 1: + 2: + etc + + Here session 1 will be connected to testdb and session 2 will be connected to test2db. You can specify @db_name only at the beginning of the session. For eg:, following would error out: + + 1:@db_name testdb: + 2:@db_name test2db: + 1: @db_name testdb: + 2: + etc + + Quitting sessions: + By default, all opened sessions will be stopped only at the end of the sql file execution. If you want to explicitly quit a session + in the middle of the test execution, you can specify a flag 'q' with the session identifier. For eg: + + 1:@db_name testdb: + 2:@db_name test2db: + 1: + 2: + 1q: + 2: + 3: + 2q: + 3: + 2: @db_name test: + + 1q: ---> Will quit the session established with testdb. + 2q: ---> Will quit the session established with test2db. + + The subsequent 2: @db_name test: will open a new session with the database test and execute the sql against that session. + Note: Do not expect blocking behavior from explicit quit statements. + This implies that a subsequent statement can execute while the relevant + session is still undergoing exit. + + Shell Execution for SQL or Output: + + @pre_run can be used for executing shell command to change input (i.e. each SQL statement) or get input info; + @post_run can be used for executing shell command to change ouput (i.e. the result set printed for each SQL execution) + or get output info. Just use the env variable ${RAW_STR} to refer to the input/out stream before shell execution, + and the output of the shell command will be used as the SQL exeucted or output printed into results file. + + 1: @post_run ' TOKEN1=` echo "${RAW_STR}" | awk \'NR==3\' | awk \'{print $1}\'` && export MATCHSUBS="${MATCHSUBS}${NL}m/${TOKEN1}/${NL}s/${TOKEN1}/token_id1/${NL}" && echo "${RAW_STR}" ': SELECT token,hostname,status FROM GP_ENDPOINTS WHERE cursorname='c1'; + 2R: @pre_run ' echo "${RAW_STR}" | sed "s#@TOKEN1#${TOKEN1}#" ': RETRIEVE ALL FROM "@TOKEN1"; + + These 2 sample is to: + - Sample 1: set env variable ${TOKEN1} to the cell (row 3, col 1) of the result set, and print the raw result. + The env var ${MATCHSUBS} is used to store the matchsubs section so that we can store it into initfile when + this test case file is finished executing. + - Sample 2: replaceing "@TOKEN1" by generated token which is fetch in sample1 + + There are some helper functions which will be sourced automatically to make above + cases easier. See global_sh_executor.sh for more information. + $RETRIEVE_USER is a special environment vars which will be read by python to use them + as the username for retrieve mode session. `None` will be used if the value has not + been set when start retrieve mode session. See the get_retrieve_token in global_sh_executor.sh + for more information about how to get the retrieve session password. + + Catalog Modification: + + Some tests are easier to write if it's possible to modify a system + catalog across the *entire* cluster. To perform a utility-mode query on + all segments and the master, you can use *U commands: + + *U: SET allow_system_table_mods = true; + *U: UPDATE pg_catalog. SET = WHERE ; + + Since the number of query results returned by a *U command depends on + the developer's cluster configuration, it can be useful to wrap them in + a start_/end_ignore block. (Unfortunately, this also hides legitimate + failures; a better long-term solution is needed.) + + Block/join flags are not currently supported with *U. + + Line continuation: + If a line is not ended by a semicolon ';' which is followed by 0 or more spaces, the line will be combined with next line and + sent together as a single statement. + + e.g.: Send to the server separately: + 1: SELECT * FROM t1; -> send "SELECT * FROM t1;" + SELECT * FROM t2; -> send "SELECT * FROM t2;" + + e.g.: Send to the server once: + 1: SELECT * FROM + t1; SELECT * FROM t2; -> "send SELECT * FROM t1; SELECT * FROM t2;" + + ATTENTION: + Send multi SQL statements once: + Multi SQL statements can be sent at once, but there are some known issues. Generally only the last query result will be printed. + But due to the difficulties of dealing with semicolons insides quotes, we always echo the first SQL command instead of the last + one if query() returns None. This created some strange issues like: + + CREATE TABLE t1 (a INT); INSERT INTO t1 SELECT generate_series(1,1000); + CREATE 1000 (Should be INSERT 1000, but here the CREATE is taken due to the limitation) + """ + + def run_sql_file(self, sql_file, out_file = None, out_dir = None, optimizer = None): + """ + Given a sql file and an ans file, this adds the specified gucs (self.gucs) to the sql file , runs the sql + against the test case database (self.db_name) and verifies the output with the ans file. + If an 'init_file' exists in the same location as the sql_file, this will be used + while doing gpdiff. + """ + # Add gucs to the test sql and form the actual sql file to be run + if not out_dir: + out_dir = self.get_out_dir() + + if not os.path.exists(out_dir): + TINCSystem.make_dirs(out_dir, ignore_exists_error = True) + + if optimizer is None: + gucs_sql_file = os.path.join(out_dir, os.path.basename(sql_file)) + else: + # sql file will be _opt.sql or _planner.sql based on optimizer + gucs_sql_file = os.path.join(out_dir, os.path.basename(sql_file).replace('.sql', '_%s.sql' %self._optimizer_suffix(optimizer))) + + self._add_gucs_to_sql_file(sql_file, gucs_sql_file, optimizer) + self.test_artifacts.append(gucs_sql_file) + + + if not out_file: + if optimizer is None: + out_file = os.path.join(self.get_out_dir(), os.path.basename(sql_file).replace('.sql', '.out')) + else: + # out file will be *_opt.out or *_planner.out based on optimizer + out_file = os.path.join(self.get_out_dir(), os.path.basename(sql_file).replace('.sql', '_%s.out' %self._optimizer_suffix(optimizer))) + + self.test_artifacts.append(out_file) + executor = SQLIsolationExecutor(dbname=self.db_name) + with open(out_file, "w") as f: + executor.process_isolation_file(open(sql_file), f, out_file) + f.flush() + + if out_file[-2:] == '.t': + out_file = out_file[:-2] + + return out_file + +if __name__ == "__main__": + + parser = OptionParser() + parser.add_option("--dbname", dest="dbname", + help="connect to database DBNAME", metavar="DBNAME") + parser.add_option("--initfile_prefix", dest="initfile_prefix", + help="The file path prefix for automatically generated initfile", metavar="INITFILE_PREFIX") + (options, args) = parser.parse_args() + + # Explicitly set multiprocessing start method to 'fork' (Unix + # default) to make isolation2 work with python3.8+ on MacOS. + if sys.version_info >= (3, 8) and sys.platform == "darwin": + multiprocessing.set_start_method('fork') + + executor = SQLIsolationExecutor(dbname=options.dbname) + + executor.process_isolation_file(sys.stdin, sys.stdout, options.initfile_prefix) diff --git a/src/test/singlenode_isolation2/test_parallel_retrieve_cursor_extended_query.c b/src/test/singlenode_isolation2/test_parallel_retrieve_cursor_extended_query.c new file mode 100644 index 00000000000..09f1e7ee0f9 --- /dev/null +++ b/src/test/singlenode_isolation2/test_parallel_retrieve_cursor_extended_query.c @@ -0,0 +1,546 @@ +/* + * src/test/examples/test_parallel_cursor_extended_query.c + * + * this program is to show extended query with the PARALLEL RETRIEVE CURSOR. + */ +#include +#include +#include +#include +#include "libpq-fe.h" + +#define MASTER_CONNECT_INDEX -1 + +static void +finish_conn_nicely(PGconn *master_conn, PGconn *endpoint_conns[], size_t endpoint_conns_num) +{ + int i; + + if (master_conn) + PQfinish(master_conn); + + for (i = 0; i < endpoint_conns_num; i++) + { + if (endpoint_conns[i]) + PQfinish(endpoint_conns[i]); + } + + free(endpoint_conns); + endpoint_conns_num = 0; +} + +static void +check_prepare_conn(PGconn *conn, const char *dbName, int conn_idx) +{ + PGresult *res; + + /* check to see that the backend connection was successfully made */ + if (PQstatus(conn) != CONNECTION_OK) + { + fprintf(stderr, "Connection to database \"%s\" failed: %s", + dbName, PQerrorMessage(conn)); + exit(1); + } + + if (conn_idx == MASTER_CONNECT_INDEX) + { + /* + * Set always-secure search path, so malicous users can't take + * control. + */ + res = PQexec(conn, + "SELECT pg_catalog.set_config('search_path', '', false)"); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + fprintf(stderr, "SET failed: %s", PQerrorMessage(conn)); + PQclear(res); + exit(1); + } + PQclear(res); + } +} + +/* execute sql and check it is a command without result set returned */ +static int +exec_sql_without_resultset(PGconn *conn, const char *sql, int conn_idx) +{ + PGresult *res1; + + if (conn_idx == MASTER_CONNECT_INDEX) + printf("\nExec SQL on Master:\n\t> %s\n", sql); + else + printf("\nExec SQL on EndPoint[%d]:\n\t> %s\n", conn_idx, sql); + + res1 = PQexec(conn, sql); + if (PQresultStatus(res1) != PGRES_COMMAND_OK) + { + fprintf(stderr, "execute sql failed: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + + /* + * make sure to PQclear() a PGresult whenever it is no longer needed to + * avoid memory leaks + */ + PQclear(res1); + return 0; +} + +/* execute sql and print the result set */ +static int +exec_sql_with_resultset_in_extended_query_protocol(PGconn *conn, const char *sql, int conn_idx) +{ + PGresult *res1; + int nFields; + int i, + j; + const char *paramValues[1]; + + paramValues[0] = "0"; + + if (conn_idx == MASTER_CONNECT_INDEX) + printf("\nExec SQL on Master:\n\t> %s\n", sql); + else + printf("\nExec SQL on EndPoint[%d]:\n\t> %s\n", conn_idx, sql); + + /* + * Just for simplicity, here for different connect index, call different + * API in the extended query protocol + */ + switch (conn_idx) + { + case 0: + res1 = PQprepare(conn, "extend_query_cursor", + sql, + 0, NULL); + + if (PQresultStatus(res1) != PGRES_TUPLES_OK && PQresultStatus(res1) != PGRES_COMMAND_OK) + { + fprintf(stdout, "PQprepare() didn't return properly: resultStatus: %d: \"%s\"\nfailed %s", PQresultStatus(res1), sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + res1 = PQexecPrepared(conn, "extend_query_cursor", 0, + paramValues, NULL, NULL, 0); + + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "PQexecPrepared() didn't return tuples properly: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + break; + case 1: + res1 = PQexecParams(conn, + sql, + 0, /* one param */ + NULL, /* let the backend deduce param type */ + paramValues, + NULL, /* don't need param lengths since text */ + NULL, /* default to all text params */ + 0); /* ask for binary results */ + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "PQexecParams() didn't return tuples properly: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + break; + case 2: + default: + res1 = PQexec(conn, sql); + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "PQexec() didn't return tuples properly: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + break; + } + + /* first, print out the attribute names */ + nFields = PQnfields(res1); + for (i = 0; i < nFields; i++) + printf("%-15s", PQfname(res1, i)); + printf("\n---------\n"); + + /* next, print out the instances */ + for (i = 0; i < PQntuples(res1); i++) + { + for (j = 0; j < nFields; j++) + printf("%-15s", PQgetvalue(res1, i, j)); + printf("\n"); + } + + PQclear(res1); + return 0; +} + +/* execute sql and print the result set */ +static int +exec_sql_with_resultset(PGconn *conn, const char *sql, int conn_idx) +{ + PGresult *res1; + int nFields; + int i, + j; + + if (conn_idx == MASTER_CONNECT_INDEX) + printf("\nExec SQL on Master:\n\t> %s\n", sql); + else + printf("\nExec SQL on EndPoint[%d]:\n\t> %s\n", conn_idx, sql);; + + res1 = PQexec(conn, sql); + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "Query didn't return tuples properly: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + + /* first, print out the attribute names */ + nFields = PQnfields(res1); + for (i = 0; i < nFields; i++) + printf("%-15s", PQfname(res1, i)); + printf("\n---------\n"); + + /* next, print out the instances */ + for (i = 0; i < PQntuples(res1); i++) + { + for (j = 0; j < nFields; j++) + printf("%-15s", PQgetvalue(res1, i, j)); + printf("\n"); + } + + PQclear(res1); + return 0; +} + +/* this function is in the master connection */ +static int +exec_check_parallel_cursor(PGconn *master_conn, int isCheckFinish) +{ + int result = 0; + PGresult *res1; + const char *check_sql = "SELECT * FROM gp_wait_parallel_retrieve_cursor('myportal', 0);"; + + + printf("\n------ Begin checking parallel retrieve cursor status ------\n"); + /* call wait mode monitor UDF and it will wait for finish retrieving. */ + if (!isCheckFinish) + { + result = exec_sql_with_resultset(master_conn, check_sql, MASTER_CONNECT_INDEX); + } + else + { + printf("\nExec SQL on Master:\n\t> %s\n", check_sql); + res1 = PQexec(master_conn, check_sql); + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "\"%s\" didn't return tuples properly\n", check_sql); + PQclear(res1); + return 1; + } + /* firstly check that the row == 1 */ + int ntup = PQntuples(res1); + + if (ntup != 1) + { + fprintf(stderr, "\"%s\" doesn't return correct row number\n", check_sql); + return 1; + } + + result = strcmp(PQgetvalue(res1, 0, 0), "t"); + PQclear(res1); + if (result) + { + fprintf(stderr, "\"%s\" doesn't return 'true'\n", check_sql); + return 1; + } + } + + printf("\n------ End checking parallel retrieve cursor status ------\n"); + return result; +} + +int +main(int argc, char **argv) +{ + char *pghost, + *pgport, + *pgoptions, + *pgoptions_retrieve_mode, + *pgtty; + char *dbName, + *dbUser; + int i; + int retVal; /* return value for this func */ + + PGconn *master_conn, + **endpoint_conns = NULL; + size_t endpoint_conns_num = 0; + char **tokens = NULL, + **endpoint_names = NULL; + + + /* + * PGresult *res1, *res2; + */ + PGresult *res1; + + if (argc != 3) + { + fprintf(stderr, "usage: %s dbUser dbName\n", argv[0]); + fprintf(stderr, " show how to use PARALLEL RETRIEVE CURSOR to parallelly retrieve data from multiple endpoints.\n"); + exit(1); + } + dbUser = argv[1]; + dbName = argv[2]; + + /* + * begin, by setting the parameters for a backend connection if the + * parameters are null, then the system will try to use reasonable + * defaults by looking up environment variables or, failing that, using + * hardwired constants + */ + pghost = NULL; /* host name of the backend */ + pgport = NULL; /* port of the backend */ + pgoptions = NULL; /* special options to start up the backend + * server */ + pgoptions_retrieve_mode = "-c gp_retrieve_conn=true"; /* specify this + * connection is for + * retrieve only */ + pgtty = NULL; /* debugging tty for the backend */ + + /* make a connection to the database */ + master_conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); + check_prepare_conn(master_conn, dbName, MASTER_CONNECT_INDEX); + + /* do some preparation for test */ + if (exec_sql_without_resultset(master_conn, "DROP TABLE IF EXISTS public.tab_parallel_cursor;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + if (exec_sql_without_resultset(master_conn, "CREATE TABLE public.tab_parallel_cursor AS SELECT id FROM pg_catalog.generate_series(1,100) id;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* + * start a transaction block because PARALLEL RETRIEVE CURSOR only support + * WITHOUT HOLD option + */ + if (exec_sql_without_resultset(master_conn, "BEGIN;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* declare PARALLEL RETRIEVE CURSOR for this table */ + if (exec_sql_without_resultset(master_conn, "DECLARE myportal PARALLEL RETRIEVE CURSOR FOR select * from public.tab_parallel_cursor;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* + * get the endpoints info of this PARALLEL RETRIEVE CURSOR + */ + const char *sql1 = "select hostname,port,auth_token,endpointname from pg_catalog.gp_endpoints() where cursorname='myportal';"; + + printf("\nExec SQL on the coordinator:\n\t> %s\n", sql1); + res1 = PQexec(master_conn, sql1); + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "Cannot get the endpoint information for cursor myportal\n"); + PQclear(res1); + goto LABEL_ERR; + } + /* firstly check that the endpoint info rows > 0 */ + int ntup = PQntuples(res1); + + if (ntup <= 0) + { + fprintf(stderr, "No rows for the endpoint (cursor myportal)\n"); + goto LABEL_ERR; + } + + endpoint_conns = malloc(ntup * sizeof(PGconn *)); + tokens = malloc(ntup * sizeof(char **)); + endpoint_names = malloc(ntup * sizeof(char *)); + endpoint_conns_num = ntup; + + /* + * create retrieve mode connection to endpoints according to the endpoints + * info fetched + */ + for (i = 0; i < ntup; i++) + { + char *host = PQgetvalue(res1, i, 0); + char *port = PQgetvalue(res1, i, 1); + + tokens[i] = strdup(PQgetvalue(res1, i, 2)); + endpoint_names[i] = strdup(PQgetvalue(res1, i, 3)); + + endpoint_conns[i] = PQsetdbLogin(host, port, pgoptions_retrieve_mode, + pgtty, dbName, + dbUser, tokens[i]); + check_prepare_conn(endpoint_conns[i], dbName, i); + } + PQclear(res1); + + /* + * Now the endpoint becomes 'READY' after "DECLARE ... PARALLEL RETRIEVE + * CURSOR" returns, then we can retrieve the result of the endpoints in + * parallel. This section can be executed parallely on different host or + * in different threads/processes on the same host. For simplicity, here + * just use loop in one process. + */ + for (i = 0; i < endpoint_conns_num; i++) + { + char sql[256]; + + /* + * Run nowait mode monitor UDF to check the parallel retrieve cursor + * status at specific time in master connection, so that if any error + * occurs, it will detect ASAP. + */ + if (exec_check_parallel_cursor(master_conn, 0)) + { + fprintf(stderr, "Error during check the PARALLEL RETRIEVE CURSOR\n"); + goto LABEL_ERR; + } + + /* + * the endpoint is ready to be retrieved when 'DECLARE PARALLEL + * RETRIEVE CURSOR returns, here begin to retrieve + */ + printf("\n------ Begin retrieving data from Endpoint %d# ------\n", i); + snprintf(sql, sizeof(sql), "RETRIEVE ALL FROM ENDPOINT %s;", endpoint_names[i]); + if (exec_sql_with_resultset_in_extended_query_protocol(endpoint_conns[i], sql, i)) + { + fprintf(stderr, "Error during retrieving result on endpoint.\n"); + goto LABEL_ERR; + } + + printf("\n------ End retrieving data from Endpoint %d# ------.\n", i); + } + + /* Check the status returns finished */ + if (exec_check_parallel_cursor(master_conn, 1)) + { + fprintf(stderr, "Error during check the PARALLEL RETRIEVE CURSOR\n"); + goto LABEL_ERR; + } + + /* close the cursor */ + if (exec_sql_without_resultset(master_conn, "CLOSE myportal;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* end the transaction */ + if (exec_sql_without_resultset(master_conn, "END;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* + * Test the fast path(PQfn) is forbidden in retrieve mode. + */ + { + printf("\n------ Begin to test fast path(PQfn) in retrieve mode # ------.\n"); + Oid foid; + PQArgBlock argv[2]; + PGresult *res; + int ret; + int result_len; + const char *query; + + query = "SELECT oid FROM pg_catalog.pg_proc WHERE proname LIKE 'mod' " + "AND prosrc LIKE 'int4mod'"; + res = PQexec(master_conn, query); + if (res == NULL) + { + printf("Failed in executing SQL: %s \n", query); + goto LABEL_ERR; + } + + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + PQclear(res); + printf("Can not find the mod() function. \n"); + goto LABEL_ERR; + } + + foid = (Oid) atoi(PQgetvalue(res, 0, 0)); + PQclear(res); + + if (foid == InvalidOid) + { + goto LABEL_ERR; + } + + /* + * Calculate the mod of argv[0] and argv[1], mod(10, 3) via master + * connection, can get the correct result. + */ + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = 10; + + argv[1].isint = 1; + argv[1].len = 4; + argv[1].u.integer = 3; + + res = PQfn(master_conn, foid, &ret, &result_len, 1, argv, 2); + if (PQresultStatus(res) == PGRES_COMMAND_OK) + { + PQclear(res); + printf("Get the result of mod(10, 3) : %d \n", ret); + } + else + { + printf("test PQfn error: %s \n", PQresultErrorMessage(res)); + PQclear(res); + goto LABEL_ERR; + } + + /* + * Call PQfn() via retrieve mode connection should be forbidden. + */ + res = PQfn(endpoint_conns[0], foid, &ret, &result_len, 1, argv, 2); + if (PQresultStatus(res) == PGRES_COMMAND_OK) + { + printf("Call PQfn() via retrieve mode connection should be forbidden: %d \n", PQresultStatus(res)); + PQclear(res); + goto LABEL_ERR; + } + printf("Expected forbidden: Call PQfn() via retrieve mode connection: %s \n", PQresultErrorMessage(res)); + + PQclear(res); + printf("\n------ End of testing fast path(PQfn) in retrieve mode # ------.\n"); + } + + /* fclose(debug); */ + retVal = 0; + goto LABEL_FINISH; + +LABEL_ERR: + retVal = 1; + +LABEL_FINISH: + /* close the connections to the database and cleanup */ + finish_conn_nicely(master_conn, endpoint_conns, endpoint_conns_num); + + if (tokens) + { + int i; + + for (i = 0; i < endpoint_conns_num; i++) + { + if (tokens[i]) + free(tokens[i]); + } + free(tokens); + } + + if (endpoint_names) + { + for (i = 0; i < endpoint_conns_num; i++) + { + if (endpoint_names[i]) + free(endpoint_names[i]); + } + free(endpoint_names); + } + + return retVal; +} diff --git a/src/test/singlenode_isolation2/test_parallel_retrieve_cursor_extended_query_error.c b/src/test/singlenode_isolation2/test_parallel_retrieve_cursor_extended_query_error.c new file mode 100644 index 00000000000..1bf731d4a89 --- /dev/null +++ b/src/test/singlenode_isolation2/test_parallel_retrieve_cursor_extended_query_error.c @@ -0,0 +1,476 @@ +/* + * src/test/examples/test_parallel_cursor_extended_query_error.c + * + * + * this program is to test: RETRIEVE statement not allowed in the non-retrieve + * mode for extended query protocol. + */ +#include +#include +#include +#include +#include "libpq-fe.h" + +#define MASTER_CONNECT_INDEX -1 + +static void +finish_conn_nicely(PGconn *master_conn, PGconn *endpoint_conns[], size_t endpoint_conns_num) +{ + int i; + + if (master_conn) + PQfinish(master_conn); + + for (i = 0; i < endpoint_conns_num; i++) + { + if (endpoint_conns[i]) + PQfinish(endpoint_conns[i]); + } + + free(endpoint_conns); + endpoint_conns_num = 0; +} + +static void +check_prepare_conn(PGconn *conn, const char *dbName, int conn_idx) +{ + PGresult *res; + + /* check to see that the backend connection was successfully made */ + if (PQstatus(conn) != CONNECTION_OK) + { + fprintf(stderr, "Connection to database \"%s\" failed: %s", + dbName, PQerrorMessage(conn)); + exit(1); + } + + if (conn_idx == MASTER_CONNECT_INDEX) + { + /* + * Set always-secure search path, so malicous users can't take + * control. + */ + res = PQexec(conn, + "SELECT pg_catalog.set_config('search_path', '', false)"); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + fprintf(stderr, "SET failed: %s", PQerrorMessage(conn)); + PQclear(res); + exit(1); + } + PQclear(res); + } +} + +/* execute sql and check it is a command without result set returned */ +static int +exec_sql_without_resultset(PGconn *conn, const char *sql, int conn_idx) +{ + PGresult *res1; + + if (conn_idx == MASTER_CONNECT_INDEX) + printf("\nExec SQL on Master:\n\t> %s\n", sql); + else + printf("\nExec SQL on EndPoint[%d]:\n\t> %s\n", conn_idx, sql); + + res1 = PQexec(conn, sql); + if (PQresultStatus(res1) != PGRES_COMMAND_OK) + { + fprintf(stderr, "execute sql failed: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + + /* + * make sure to PQclear() a PGresult whenever it is no longer needed to + * avoid memory leaks + */ + PQclear(res1); + return 0; +} + +/* execute sql and print the result set */ +static int +exec_sql_with_resultset_in_extended_query_protocol(PGconn *conn, const char *sql, int conn_idx) +{ + PGresult *res1; + int nFields; + int i, + j; + const char *paramValues[1]; + + paramValues[0] = "0"; + + if (conn_idx == MASTER_CONNECT_INDEX) + printf("\nExec SQL on Master:\n\t> %s\n", sql); + else + printf("\nExec SQL on EndPoint[%d]:\n\t> %s\n", conn_idx, sql); + + /* + * Just for simplicity, here for different connect index, call different + * API in the extended query protocol + */ + switch (conn_idx) + { + case 0: + res1 = PQprepare(conn, "extend_query_cursor", + sql, + 0, NULL); + + if (PQresultStatus(res1) != PGRES_TUPLES_OK && PQresultStatus(res1) != PGRES_COMMAND_OK) + { + fprintf(stdout, "PQprepare() didn't return properly: resultStatus: %d: \"%s\"\nfailed %s", PQresultStatus(res1), sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + res1 = PQexecPrepared(conn, "extend_query_cursor", 0, + paramValues, NULL, NULL, 0); + + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "PQexecPrepared() didn't return tuples properly: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + break; + case 1: + res1 = PQexecParams(conn, + sql, + 0, /* one param */ + NULL, /* let the backend deduce param type */ + paramValues, + NULL, /* don't need param lengths since text */ + NULL, /* default to all text params */ + 0); /* ask for binary results */ + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "PQexecParams() didn't return tuples properly: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + break; + case 2: + default: + res1 = PQexec(conn, sql); + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "PQexec() didn't return tuples properly: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + break; + } + + + /* first, print out the attribute names */ + nFields = PQnfields(res1); + for (i = 0; i < nFields; i++) + printf("%-15s", PQfname(res1, i)); + printf("\n---------\n"); + + /* next, print out the instances */ + for (i = 0; i < PQntuples(res1); i++) + { + for (j = 0; j < nFields; j++) + printf("%-15s", PQgetvalue(res1, i, j)); + printf("\n"); + } + + PQclear(res1); + return 0; +} + +/* execute sql and print the result set */ +static int +exec_sql_with_resultset(PGconn *conn, const char *sql, int conn_idx) +{ + PGresult *res1; + int nFields; + int i, + j; + + if (conn_idx == MASTER_CONNECT_INDEX) + printf("\nExec SQL on Master:\n\t> %s\n", sql); + else + printf("\nExec SQL on EndPoint[%d]:\n\t> %s\n", conn_idx, sql);; + + res1 = PQexec(conn, sql); + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "Query didn't return tuples properly: \"%s\"\nfailed %s", sql, PQerrorMessage(conn)); + PQclear(res1); + return 1; + } + + /* first, print out the attribute names */ + nFields = PQnfields(res1); + for (i = 0; i < nFields; i++) + printf("%-15s", PQfname(res1, i)); + printf("\n---------\n"); + + /* next, print out the instances */ + for (i = 0; i < PQntuples(res1); i++) + { + for (j = 0; j < nFields; j++) + printf("%-15s", PQgetvalue(res1, i, j)); + printf("\n"); + } + + PQclear(res1); + return 0; +} + +/* this function is in the master connection */ +static int +exec_check_parallel_cursor(PGconn *master_conn, int isCheckFinish) +{ + int result = 0; + PGresult *res1; + const char *check_sql = "SELECT * FROM gp_wait_parallel_retrieve_cursor('myportal', 0);"; + + + printf("\n------ Begin checking parallel retrieve cursor status ------\n"); + /* call wait mode monitor UDF and it will wait for finish retrieving. */ + if (!isCheckFinish) + { + result = exec_sql_with_resultset(master_conn, check_sql, MASTER_CONNECT_INDEX); + } + else + { + printf("\nExec SQL on Master:\n\t> %s\n", check_sql); + res1 = PQexec(master_conn, check_sql); + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "\"%s\" didn't return tuples properly\n", check_sql); + PQclear(res1); + return 1; + } + /* firstly check that the row == 1 */ + int ntup = PQntuples(res1); + + if (ntup != 1) + { + fprintf(stderr, "\"%s\" doesn't return correct row number\n", check_sql); + return 1; + } + + result = strcmp(PQgetvalue(res1, 0, 0), "t"); + PQclear(res1); + if (result) + { + fprintf(stderr, "\"%s\" doesn't return 'true'\n", check_sql); + return 1; + } + } + + printf("\n------ End checking parallel retrieve cursor status ------\n"); + return result; +} + +int +main(int argc, char **argv) +{ + char *pghost, + *pgport, + *pgoptions, + *pgoptions_utility_mode, + *pgtty; + char *dbName, + *dbUser; + int i; + int retVal; /* return value for this func */ + + PGconn *master_conn, + **endpoint_conns = NULL; + size_t endpoint_conns_num = 0; + char **tokens = NULL, + **endpoint_names = NULL; + + + /* + * PGresult *res1, *res2; + */ + PGresult *res1; + + if (argc != 3) + { + fprintf(stderr, "usage: %s dbUser dbName\n", argv[0]); + fprintf(stderr, " show how to use PARALLEL RETRIEVE CURSOR to parallelly retrieve data from multiple endpoints.\n"); + exit(1); + } + dbUser = argv[1]; + dbName = argv[2]; + + /* + * begin, by setting the parameters for a backend connection if the + * parameters are null, then the system will try to use reasonable + * defaults by looking up environment variables or, failing that, using + * hardwired constants + */ + pghost = NULL; /* host name of the backend */ + pgport = NULL; /* port of the backend */ + pgoptions = NULL; /* special options to start up the backend + * server */ + pgoptions_utility_mode = "-c gp_role=utility"; + pgtty = NULL; /* debugging tty for the backend */ + + /* make a connection to the database */ + master_conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); + check_prepare_conn(master_conn, dbName, MASTER_CONNECT_INDEX); + + /* do some preparation for test */ + if (exec_sql_without_resultset(master_conn, "DROP TABLE IF EXISTS public.tab_parallel_cursor;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + if (exec_sql_without_resultset(master_conn, "CREATE TABLE public.tab_parallel_cursor AS SELECT id FROM pg_catalog.generate_series(1,100) id;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* + * start a transaction block because PARALLEL RETRIEVE CURSOR only support + * WITHOUT HOLD option + */ + if (exec_sql_without_resultset(master_conn, "BEGIN;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* declare PARALLEL RETRIEVE CURSOR for this table */ + if (exec_sql_without_resultset(master_conn, "DECLARE myportal PARALLEL RETRIEVE CURSOR FOR select * from public.tab_parallel_cursor;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* + * get the endpoints info of this PARALLEL RETRIEVE CURSOR + */ + const char *sql1 = "select hostname,port,auth_token,endpointname from pg_catalog.gp_endpoints() where cursorname='myportal';"; + + printf("\nExec SQL on Master:\n\t> %s\n", sql1); + res1 = PQexec(master_conn, sql1); + if (PQresultStatus(res1) != PGRES_TUPLES_OK) + { + fprintf(stderr, "Cannot find the endpoint for parallel retrieve cursor myportal\n"); + PQclear(res1); + goto LABEL_ERR; + } + /* firstly check that the endpoint info rows > 0 */ + int ntup = PQntuples(res1); + + if (ntup <= 0) + { + fprintf(stderr, "No rows for the endpoint (cursor myportal)\n"); + goto LABEL_ERR; + } + + endpoint_conns = malloc(ntup * sizeof(PGconn *)); + tokens = malloc(ntup * sizeof(char **)); + endpoint_names = malloc(ntup * sizeof(char *)); + endpoint_conns_num = ntup; + + /* + * create utility mode connection to endpoints according to the endpoints + * info fetched, so that the RETRIEVE statement should failed. + */ + for (i = 0; i < ntup; i++) + { + char *host = PQgetvalue(res1, i, 0); + char *port = PQgetvalue(res1, i, 1); + + tokens[i] = strdup(PQgetvalue(res1, i, 2)); + endpoint_names[i] = strdup(PQgetvalue(res1, i, 3)); + + endpoint_conns[i] = PQsetdbLogin(host, port, pgoptions_utility_mode, + pgtty, dbName, + dbUser, tokens[i]); + check_prepare_conn(endpoint_conns[i], dbName, i); + } + PQclear(res1); + + /* + * Now the endpoint becomes 'READY' after "DECLARE ... PARALLEL RETRIEVE + * CURSOR" returns, then we can retrieve the result of the endpoints in + * parallel. This section can be executed parallely on different host or + * in different threads/processes on the same host. For simplicity, here + * just use loop in one process. + */ + for (i = 0; i < endpoint_conns_num; i++) + { + char sql[256]; + + /* + * Run nowait mode monitor UDF to check the parallel retrieve cursor + * status at specific time in master connection, so that if any error + * occurs, it will detect ASAP. + */ + if (exec_check_parallel_cursor(master_conn, 0)) + { + fprintf(stderr, "Error when checking the PARALLEL RETRIEVE CURSOR\n"); + goto LABEL_ERR; + } + + /* + * the endpoint is ready to be retrieved when 'DECLARE PARALLEL + * RETRIEVE CURSOR returns, here begin to retrieve + */ + printf("\n------ Begin retrieving data from Endpoint %d# ------\n", i); + snprintf(sql, sizeof(sql), "RETRIEVE ALL FROM ENDPOINT %s;", endpoint_names[i]); + if (exec_sql_with_resultset_in_extended_query_protocol(endpoint_conns[i], sql, i)) + { + /* + * This test is to confirmed that all endpoints should be failed + * when execute RETRIEVE in UTITILY mode + */ + fprintf(stderr, "Error as expected during retrieving result on endpoint.\n"); + printf("\n------ Skip End retrieving data from Endpoint %d# ------.\n", i); + continue; + } + + printf("\n------ End retrieving data from Endpoint %d# ------.\n", i); + } + + /* Check the status returns not finished */ + if (!exec_check_parallel_cursor(master_conn, 1)) + { + fprintf(stderr, "Error during check the PARALLEL RETRIEVE CURSOR\n"); + goto LABEL_ERR; + } + + /* close the cursor */ + if (exec_sql_without_resultset(master_conn, "CLOSE myportal;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + /* end the transaction */ + if (exec_sql_without_resultset(master_conn, "END;", MASTER_CONNECT_INDEX) != 0) + goto LABEL_ERR; + + + /* fclose(debug); */ + retVal = 0; + goto LABEL_FINISH; + +LABEL_ERR: + retVal = 1; + +LABEL_FINISH: + /* close the connections to the database and cleanup */ + finish_conn_nicely(master_conn, endpoint_conns, endpoint_conns_num); + + if (tokens) + { + int i; + + for (i = 0; i < endpoint_conns_num; i++) + { + if (tokens[i]) + free(tokens[i]); + } + free(tokens); + } + + if (endpoint_names) + { + for (i = 0; i < endpoint_conns_num; i++) + { + if (endpoint_names[i]) + free(endpoint_names[i]); + } + free(endpoint_names); + } + + return retVal; +} diff --git a/src/test/singlenode_regress/.gitignore b/src/test/singlenode_regress/.gitignore new file mode 100644 index 00000000000..560a728ceb9 --- /dev/null +++ b/src/test/singlenode_regress/.gitignore @@ -0,0 +1,35 @@ +# Local binaries +/pg_regress + +# Generated subdirectories +/tmp_check/ +/results/ +/log/ + +# Configure-generated files +/GPTest.pm + + +# ignore test tablespaces +/testtablespace_default_tablespace/ +/testtablespace_temp_tablespace/ + +twophase_pqexecparams + +data/wet_csv?.tbl +data/wet_text?.tbl +data/wet_syntax?.tbl +data/wet_execute.tbl + +data/gpsd-without-hll.sql +data/gpsd-with-hll.sql +data/minirepro.sql + +regression.diffs +regression.out + +stdin +stdout +# Note: regression.* are only left behind on a failure; that's why they're not ignored +#/regression.diffs +#/regression.out diff --git a/src/test/singlenode_regress/Makefile b/src/test/singlenode_regress/Makefile new file mode 100644 index 00000000000..185bf13ae68 --- /dev/null +++ b/src/test/singlenode_regress/Makefile @@ -0,0 +1,58 @@ +# +# Makefile for singlenode regress tests +# + +PGFILEDESC = "singlenode_pg_regress - test driver" +PGAPPICON = win32 + +subdir = src/test/singlenode_regress +top_builddir = ../../.. +include $(top_builddir)/src/Makefile.global + +override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) \ + -I$(srcdir)/../regress $(CPPFLAGS) + +OBJS = \ + $(WIN32RES) + +submake-regress: + $(MAKE) -C $(top_builddir)/src/test/regress all + +regress.so: | submake-regress + rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/regress.so . + +refint$(DLSUFFIX): $(top_builddir)/contrib/spi/refint$(DLSUFFIX) + cp $< $@ + +autoinc$(DLSUFFIX): $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX) + cp $< $@ + +all: refint$(DLSUFFIX) autoinc$(DLSUFFIX) regress.so + +clean distclean: + rm -f refint$(DLSUFFIX) + rm -f autoinc$(DLSUFFIX) + rm -f regress.so + +## +## Run tests +## + +REGRESS_OPTS = --dlpath=. --max-concurrent-tests=24 --init-file=$(srcdir)/init_file --make-testtablespace-dir \ + $(EXTRA_REGRESS_OPTS) + +installcheck-singlenode: installcheck-good-singlenode + +installcheck-small-singlenode: all + (\ + gpconfig -c gp_appendonly_insert_files -v 0; \ + gpstop -u; \ + $(pg_regress_installcheck) $(REGRESS_OPTS) --schedule=$(srcdir)/parallel_schedule $(EXTRA_TESTS) \ + ) + +installcheck-good-singlenode: all + (\ + gpconfig -c gp_appendonly_insert_files -v 0; \ + gpstop -u; \ + $(pg_regress_installcheck) $(REGRESS_OPTS) --schedule=$(srcdir)/parallel_schedule --schedule=$(srcdir)/greenplum_schedule $(EXTRA_TESTS) \ + ) diff --git a/src/test/singlenode_regress/data/.gitignore b/src/test/singlenode_regress/data/.gitignore new file mode 100644 index 00000000000..82b0e51ecda --- /dev/null +++ b/src/test/singlenode_regress/data/.gitignore @@ -0,0 +1 @@ +wet_region.out diff --git a/src/test/singlenode_regress/data/PropertyInfo.txt b/src/test/singlenode_regress/data/PropertyInfo.txt new file mode 100644 index 00000000000..73489e29f44 --- /dev/null +++ b/src/test/singlenode_regress/data/PropertyInfo.txt @@ -0,0 +1,18 @@ +1,Snidely Whiplash, "an empire dreamt of but as yet unbuilt", "( (0,0), (1, 1) )", "( (0,0), (1,1), (2,2), (3,3) )", "( (0,0), 0)",,,,,, +2,Theodore Turner, "a ranch and reserve", "((2000,2000), (2100, 2100))", "( (1,1), (2,1), (1,2) )", "( (2,2), 2)",,,,,, +3,Theodore Roosevelt, "overlooks Yellowstone River", "( (1800, 2200), (1801, 2201) )", "( (3,3), (3, 4), (4, 3) )", "( (3,3), 3)",,,,,, +4,Donald Duck, "overlooks Colorado River", "( (1000, 1000), (1001, 1001) )", "( (4,4), (4, 5), (5, 4), (5,5) )", "( (4,4), 4)",,,,,, +5,Roger Rabbit, "Toon Town, unit 127", "( (-1000000, -100000), (-999999, -999999) )", "( (5, -1), (5, -2), (5, -5) )", "( (5, 5), 5 )",,,,,, +6,James T. Kirk, "Utopia Planetia", "( (123456789, 123456789), (123456790, 123456790) )", "( (6,7), (6,5), (5,7) )", "( (6,6), 6)",,,,,, +7,Albus Dumbledore, "Hogwarts", "( (-12000000, -12000000), (-11999990, -11999990) )", "( (7,7), (7,8), (6,7) )", "( (7,7), 7)",,,,,, +8,"Neil, Nell, and Noel Newall", "Null Knoll",,,,,,,,, +9,"Hyquotia P. Cucumber","Radical Vegan Farms", "( (40, 20), (42, 25) )", "( (9,9), (9,8), (8,10) )", "( (9,9), 9)",,,,,, +10,Junipero Serra,California, "( (0, 0), (200, 1000) )", "( (10,10), (10,9), (8,11) )", "( (10,10), 10)",,,,,, +18,K. Serra,California, "( (0, 0), (200, 1000) )", "( (18,18), (18,19), (17,19) )", "( (18,18), 18)",,,,,, +19,Kay Serra,California, "( (0, 0), (200, 1000) )", "( (19,19), (19,18), (20,19) )", "( (19,19), 19)",,,,,, +38,Que Sera,California, "( (0, 0), (200, 1000) )", "( (38,38), (38,39), (37,38) )", "( (38,38), 38)",,,,,, +59,Hypatia,Greece,"( (6050, 20), (7052, 250) )", "( (59,59), (59,60), (60,59) )", "( (59,59), 59)",,,,,, +70, Patty, Cake,"( (6050, 20), (7052, 250) )", "( (70,70), (70,60), (60,70) )", "( (70,70), 70)",,,,,, +80, Leading space man, Leading space woman," ((1,2),(3,4)) ", "( (80,80), (80,79), (79,80) )", "( (80,80), 80)",,,,,, +81,Trailing space man ,trailing space woman ," ((1,2),(3,4)) ", "( (81,81), (81,80), (80,81) )", "( (81,81), 81)",,,,,, +82, Leading and trailing spaces , leading and trailing spaces ," ((1,2),(3,4)) ", "( (82,82), (82,80), (80,82) )", "( (82,82), 82)",,,,,, diff --git a/src/test/singlenode_regress/data/agg.data b/src/test/singlenode_regress/data/agg.data new file mode 100644 index 00000000000..d92c7df4d0d --- /dev/null +++ b/src/test/singlenode_regress/data/agg.data @@ -0,0 +1,4 @@ +56 7.8 +100 99.097 +0 0.09561 +42 324.78 diff --git a/src/test/singlenode_regress/data/array.data b/src/test/singlenode_regress/data/array.data new file mode 100644 index 00000000000..394d851fc35 --- /dev/null +++ b/src/test/singlenode_regress/data/array.data @@ -0,0 +1,103 @@ +1 {92,75,71,52,64,83} {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} +2 {3,6} {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} +3 {37,64,95,43,3,41,13,30,11,43} {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} +4 {71,39,99,55,33,75,45} {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} +5 {50,42,77,50,4} {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} +6 {39,35,5,94,17,92,60,32} {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} +7 {12,51,88,64,8} {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} +8 {60,84} {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} +9 {56,52,35,27,80,44,81,22} {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} +10 {71,5,45} {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} +11 {41,86,74,48,22,74,47,50} {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} +12 {17,99,18,52,91,72,0,43,96,23} {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} +13 {3,52,34,23} {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} +14 {78,57,19} {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} +15 {17,14,16,63,67} {AA6416,AAAAAAAAAA646,AAAAA95309} +16 {14,63,85,11} {AAAAAA66777} +17 {7,10,81,85} {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} +18 {1} {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} +19 {52,82,17,74,23,46,69,51,75} {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} +20 {72,89,70,51,54,37,8,49,79} {AAAAAA58494} +21 {2,8,65,10,5,79,43} {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} +22 {11,6,56,62,53,30} {AAAAAAAA72908} +23 {40,90,5,38,72,40,30,10,43,55} {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} +24 {94,61,99,35,48} {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} +25 {31,1,10,11,27,79,38} {AAAAAAAAAAAAAAAAAA59334,45449} +26 {71,10,9,69,75} {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} +27 {94} {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} +28 {14,33,6,34,14} {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} +29 {39,21} {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} +30 {26,81,47,91,34} {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} +31 {80,24,18,21,54} {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} +32 {58,79,82,80,67,75,98,10,41} {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} +33 {74,73} {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} +34 {70,45} {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} +35 {23,40} {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} +36 {79,82,14,52,30,5,79} {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} +37 {53,11,81,39,3,78,58,64,74} {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} +38 {59,5,4,95,28} {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} +39 {82,43,99,16,74} {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} +40 {34} {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} +41 {19,26,63,12,93,73,27,94} {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} +42 {15,76,82,75,8,91} {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} +43 {39,87,91,97,79,28} {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} +44 {40,58,68,29,54} {AAAAAAA81898,AAAAAA66777,AAAAAA98232} +45 {99,45} {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} +46 {53,24} {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} +47 {98,23,64,12,75,61} {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} +48 {76,14} {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} +49 {56,5,54,37,49} {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} +50 {20,12,37,64,93} {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} +51 {47} {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} +52 {89,0} {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} +53 {38,17} {AAAAAAAAAAA21658} +54 {70,47} {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} +55 {47,79,47,64,72,25,71,24,93} {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} +56 {33,7,60,54,93,90,77,85,39} {AAAAAAAAAAAAAAAAAA32918,AA42406} +57 {23,45,10,42,36,21,9,96} {AAAAAAAAAAAAAAAAAAA70415} +58 {92} {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} +59 {9,69,46,77} {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} +60 {62,2,59,38,89} {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} +61 {72,2,44,95,54,54,13} {AAAAAAAAAAAAAAAAAAA91804} +62 {83,72,29,73} {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} +63 {11,4,61,87} {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} +64 {26,19,34,24,81,78} {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} +65 {61,5,76,59,17} {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} +66 {31,23,70,52,4,33,48,25} {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} +67 {31,94,7,10} {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} +68 {90,43,38} {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} +69 {67,35,99,85,72,86,44} {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} +70 {56,70,83} {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} +71 {74,26} {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} +72 {22,1,16,78,20,91,83} {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} +73 {88,25,96,78,65,15,29,19} {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} +74 {32} {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} +75 {12,96,83,24,71,89,55} {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} +76 {92,55,10,7} {AAAAAAAAAAAAAAA67062} +77 {97,15,32,17,55,59,18,37,50,39} {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} +78 {55,89,44,84,34} {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} +79 {45} {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} +80 {74,89,44,80,0} {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} +81 {63,77,54,48,61,53,97} {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} +82 {34,60,4,79,78,16,86,89,42,50} {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} +83 {14,10} {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} +84 {11,83,35,13,96,94} {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} +85 {39,60} {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} +86 {33,81,72,74,45,36,82} {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} +87 {57,27,50,12,97,68} {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} +88 {41,90,77,24,6,24} {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} +89 {40,32,17,6,30,88} {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} +90 {88,75} {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} +91 {78} {AAAAAAAAAAAAA62007,AAA99043} +92 {85,63,49,45} {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} +93 {11} {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} +94 {98,9,85,62,88,91,60,61,38,86} {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} +95 {47,77} {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} +96 {23,97,43} {AAAAAAAAAA646,A87088} +97 {54,2,86,65} {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} +98 {38,34,32,89} {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} +99 {37,86} {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} +100 {85,32,57,39,49,84,32,3,30} {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +101 {} {} +102 {NULL} {NULL} +103 \N \N diff --git a/src/test/singlenode_regress/data/bad_data1.data b/src/test/singlenode_regress/data/bad_data1.data new file mode 100755 index 00000000000..46f09182669 --- /dev/null +++ b/src/test/singlenode_regress/data/bad_data1.data @@ -0,0 +1,18 @@ +1|1|1 +2 +3| +4|4|4|4 +5|5|5 +6|6|6 +7|7|bad +bad|8|8 +9|9|9 +10|10|10 +eleven +12|||| +13|,13, +14|14|14 +15 +sixteen +\. + diff --git a/src/test/singlenode_regress/data/bad_data3.data b/src/test/singlenode_regress/data/bad_data3.data new file mode 100755 index 00000000000..887892ebe05 --- /dev/null +++ b/src/test/singlenode_regress/data/bad_data3.data @@ -0,0 +1,301 @@ +1|1|1 +1|1|1 +1|1|1 +1|1|1 +BAD|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +10|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +BAD|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +20|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +30|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +40|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +50|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +BAD|1|1 +BAD|1|1 +1|1|1 +1|1|1 +1|1|1 +60|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +70|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +80|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +90|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +100|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +BAD|1|1 +1|1|1 +1|1|1 +110|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +120|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +130|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +BAD|1|1 +1|1|1 +1|1|1 +1|1|1 +140|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +150|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +160|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +170|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +180|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +190|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +200|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +210|1|1 +1|1|1 +1|1|1 +BAD|1|1 +BAD|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +220|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +230|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +240|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +250|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +260|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +270|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +280|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +BAD|1|1 +1|1|1 +1|1|1 +1|1|1 +290|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +1|1|1 +300|1|1 +\. diff --git a/src/test/singlenode_regress/data/bytea.data b/src/test/singlenode_regress/data/bytea.data new file mode 100644 index 00000000000..21ed6303388 --- /dev/null +++ b/src/test/singlenode_regress/data/bytea.data @@ -0,0 +1,4 @@ +2,\x74747474736466736466 +1,\x546869732069732072617720746578742064617461 +3,\x013d7d16d7ad4fefb61bd95b765c8ceb +4,\x013d7d16d7ad4fefb61bdT5b765c8ceb diff --git a/src/test/singlenode_regress/data/city.data b/src/test/singlenode_regress/data/city.data new file mode 100644 index 00000000000..02f50c521b4 --- /dev/null +++ b/src/test/singlenode_regress/data/city.data @@ -0,0 +1,4079 @@ +1 Kabul AFG Kabol 1780000 +2 Qandahar AFG Qandahar 237500 +3 Herat AFG Herat 186800 +4 Mazar-e-Sharif AFG Balkh 127800 +5 Amsterdam NLD Noord-Holland 731200 +6 Rotterdam NLD Zuid-Holland 593321 +7 Haag NLD Zuid-Holland 440900 +8 Utrecht NLD Utrecht 234323 +9 Eindhoven NLD Noord-Brabant 201843 +10 Tilburg NLD Noord-Brabant 193238 +11 Groningen NLD Groningen 172701 +12 Breda NLD Noord-Brabant 160398 +13 Apeldoorn NLD Gelderland 153491 +14 Nijmegen NLD Gelderland 152463 +15 Enschede NLD Overijssel 149544 +16 Haarlem NLD Noord-Holland 148772 +17 Almere NLD Flevoland 142465 +18 Arnhem NLD Gelderland 138020 +19 Zaanstad NLD Noord-Holland 135621 +20 s-Hertogenbosch NLD Noord-Brabant 129170 +21 Amersfoort NLD Utrecht 126270 +22 Maastricht NLD Limburg 122087 +23 Dordrecht NLD Zuid-Holland 119811 +24 Leiden NLD Zuid-Holland 117196 +25 Haarlemmermeer NLD Noord-Holland 110722 +26 Zoetermeer NLD Zuid-Holland 110214 +27 Emmen NLD Drenthe 105853 +28 Zwolle NLD Overijssel 105819 +29 Ede NLD Gelderland 101574 +30 Delft NLD Zuid-Holland 95268 +31 Heerlen NLD Limburg 95052 +32 Alkmaar NLD Noord-Holland 92713 +33 Willemstad ANT Curacao 2345 +34 Tirana ALB Tirana 270000 +35 Alger DZA Alger 2168000 +36 Oran DZA Oran 609823 +37 Constantine DZA Constantine 443727 +38 Annaba DZA Annaba 222518 +39 Batna DZA Batna 183377 +40 Setif DZA Setif 179055 +41 Sidi Bel Abbes DZA Sidi Bel Abbes 153106 +42 Skikda DZA Skikda 128747 +43 Biskra DZA Biskra 128281 +44 Blida (el-Boulaida) DZA Blida 127284 +45 Bejaia DZA Bejaia 117162 +46 Mostaganem DZA Mostaganem 115212 +47 Tebessa DZA Tebessa 112007 +48 Tlemcen (Tilimsen) DZA Tlemcen 110242 +49 Bechar DZA Bechar 107311 +50 Tiaret DZA Tiaret 100118 +51 Ech-Chleff (el-Asnam) DZA Chlef 96794 +52 Ghardaia DZA Ghardaia 89415 +53 Tafuna ASM Tutuila 5200 +54 Fagatogo ASM Tutuila 2323 +55 Andorra la Vella AND Andorra la Vella 21189 +56 Luanda AGO Luanda 2022000 +57 Huambo AGO Huambo 163100 +58 Lobito AGO Benguela 130000 +59 Benguela AGO Benguela 128300 +60 Namibe AGO Namibe 118200 +61 South Hill AIA A 961 +62 The Valley AIA A 595 +63 Saint Johns ATG St John 24000 +64 Dubai ARE Dubai 669181 +65 Abu Dhabi ARE Abu Dhabi 398695 +66 Sharja ARE Sharja 320095 +67 al-Ayn ARE Abu Dhabi 225970 +68 Ajman ARE Ajman 114395 +69 Buenos Aires ARG Distrito Federal 2982146 +70 La Matanza ARG Buenos Aires 1266461 +71 Cordoba ARG Cordoba 1157507 +72 Rosario ARG Santa Fe 907718 +73 Lomas de Zamora ARG Buenos Aires 622013 +74 Quilmes ARG Buenos Aires 559249 +75 Almirante Brown ARG Buenos Aires 538918 +76 La Plata ARG Buenos Aires 521936 +77 Mar del Plata ARG Buenos Aires 512880 +78 San Miguel de Tucuman ARG Tucuman 470809 +79 Lanus ARG Buenos Aires 469735 +80 Merlo ARG Buenos Aires 463846 +81 General San Martin ARG Buenos Aires 422542 +82 Salta ARG Salta 367550 +83 Moreno ARG Buenos Aires 356993 +84 Santa Fe ARG Santa Fe 353063 +85 Avellaneda ARG Buenos Aires 353046 +86 Tres de Febrero ARG Buenos Aires 352311 +87 Moron ARG Buenos Aires 349246 +88 Florencio Varela ARG Buenos Aires 315432 +89 San Isidro ARG Buenos Aires 306341 +90 Tigre ARG Buenos Aires 296226 +91 Malvinas Argentinas ARG Buenos Aires 290335 +92 Vicente Lopez ARG Buenos Aires 288341 +93 Berazategui ARG Buenos Aires 276916 +94 Corrientes ARG Corrientes 258103 +95 San Miguel ARG Buenos Aires 248700 +96 Bahia Blanca ARG Buenos Aires 239810 +97 Esteban Echeverria ARG Buenos Aires 235760 +98 Resistencia ARG Chaco 229212 +99 Jose C. Paz ARG Buenos Aires 221754 +100 Parana ARG Entre Rios 207041 +101 Godoy Cruz ARG Mendoza 206998 +102 Posadas ARG Misiones 201273 +103 Guaymallen ARG Mendoza 200595 +104 Santiago del Estero ARG Santiago del Estero 189947 +105 San Salvador de Jujuy ARG Jujuy 178748 +106 Hurlingham ARG Buenos Aires 170028 +107 Neuquen ARG Neuquen 167296 +108 Ituzaingo ARG Buenos Aires 158197 +109 San Fernando ARG Buenos Aires 153036 +110 Formosa ARG Formosa 147636 +111 Las Heras ARG Mendoza 145823 +112 La Rioja ARG La Rioja 138117 +113 San Fernando del Valle de Cata ARG Catamarca 134935 +114 Rio Cuarto ARG Cordoba 134355 +115 Comodoro Rivadavia ARG Chubut 124104 +116 Mendoza ARG Mendoza 123027 +117 San Nicolas de los Arroyos ARG Buenos Aires 119302 +118 San Juan ARG San Juan 119152 +119 Escobar ARG Buenos Aires 116675 +120 Concordia ARG Entre Rios 116485 +121 Pilar ARG Buenos Aires 113428 +122 San Luis ARG San Luis 110136 +123 Ezeiza ARG Buenos Aires 99578 +124 San Rafael ARG Mendoza 94651 +125 Tandil ARG Buenos Aires 91101 +126 Yerevan ARM Yerevan 1248700 +127 Gjumri ARM Girak 211700 +128 Vanadzor ARM Lori 172700 +129 Oranjestad ABW A 29034 +130 Sydney AUS New South Wales 3276207 +131 Melbourne AUS Victoria 2865329 +132 Brisbane AUS Queensland 1291117 +133 Perth AUS West Australia 1096829 +134 Adelaide AUS South Australia 978100 +135 Canberra AUS Capital Region 322723 +136 Gold Coast AUS Queensland 311932 +137 Newcastle AUS New South Wales 270324 +138 Central Coast AUS New South Wales 227657 +139 Wollongong AUS New South Wales 219761 +140 Hobart AUS Tasmania 126118 +141 Geelong AUS Victoria 125382 +142 Townsville AUS Queensland 109914 +143 Cairns AUS Queensland 92273 +144 Baku AZE Baki 1787800 +145 Ganca AZE Ganca 299300 +146 Sumqayit AZE Sumqayit 283000 +147 Mingacevir AZE Mingacevir 93900 +148 Nassau BHS New Providence 172000 +149 al-Manama BHR al-Manama 148000 +150 Dhaka BGD Dhaka 3612850 +151 Chittagong BGD Chittagong 1392860 +152 Khulna BGD Khulna 663340 +153 Rajshahi BGD Rajshahi 294056 +154 Narayanganj BGD Dhaka 202134 +155 Rangpur BGD Rajshahi 191398 +156 Mymensingh BGD Dhaka 188713 +157 Barisal BGD Barisal 170232 +158 Tungi BGD Dhaka 168702 +159 Jessore BGD Khulna 139710 +160 Comilla BGD Chittagong 135313 +161 Nawabganj BGD Rajshahi 130577 +162 Dinajpur BGD Rajshahi 127815 +163 Bogra BGD Rajshahi 120170 +164 Sylhet BGD Sylhet 117396 +165 Brahmanbaria BGD Chittagong 109032 +166 Tangail BGD Dhaka 106004 +167 Jamalpur BGD Dhaka 103556 +168 Pabna BGD Rajshahi 103277 +169 Naogaon BGD Rajshahi 101266 +170 Sirajganj BGD Rajshahi 99669 +171 Narsinghdi BGD Dhaka 98342 +172 Saidpur BGD Rajshahi 96777 +173 Gazipur BGD Dhaka 96717 +174 Bridgetown BRB St Michael 6070 +175 Antwerpen BEL Antwerpen 446525 +176 Gent BEL East Flanderi 224180 +177 Charleroi BEL Hainaut 200827 +178 Liege BEL Liege 185639 +179 Bruxelles [Brussel] BEL Bryssel 133859 +180 Brugge BEL West Flanderi 116246 +181 Schaerbeek BEL Bryssel 105692 +182 Namur BEL Namur 105419 +183 Mons BEL Hainaut 90935 +184 Belize City BLZ Belize City 55810 +185 Belmopan BLZ Cayo 7105 +186 Cotonou BEN Atlantique 536827 +187 Porto-Novo BEN Oueme 194000 +188 Djougou BEN Atacora 134099 +189 Parakou BEN Borgou 103577 +190 Saint George BMU Saint Georges 1800 +191 Hamilton BMU Hamilton 1200 +192 Thimphu BTN Thimphu 22000 +193 Santa Cruz de la Sierra BOL Santa Cruz 935361 +194 La Paz BOL La Paz 758141 +195 El Alto BOL La Paz 534466 +196 Cochabamba BOL Cochabamba 482800 +197 Oruro BOL Oruro 223553 +198 Sucre BOL Chuquisaca 178426 +199 Potosi BOL Potosi 140642 +200 Tarija BOL Tarija 125255 +201 Sarajevo BIH Federaatio 360000 +202 Banja Luka BIH Republika Srpska 143079 +203 Zenica BIH Federaatio 96027 +204 Gaborone BWA Gaborone 213017 +205 Francistown BWA Francistown 101805 +206 Sao Paulo BRA Sao Paulo 9968485 +207 Rio de Janeiro BRA Rio de Janeiro 5598953 +208 Salvador BRA Bahia 2302832 +209 Belo Horizonte BRA Minas Gerais 2139125 +210 Fortaleza BRA Ceara 2097757 +211 Brasilia BRA Distrito Federal 1969868 +212 Curitiba BRA Parana 1584232 +213 Recife BRA Pernambuco 1378087 +214 Porto Alegre BRA Rio Grande do Sul 1314032 +215 Manaus BRA Amazonas 1255049 +216 Belem BRA Para 1186926 +217 Guarulhos BRA Sao Paulo 1095874 +218 Goiania BRA Goias 1056330 +219 Campinas BRA Sao Paulo 950043 +220 Sao Goncalo BRA Rio de Janeiro 869254 +221 Nova Iguacu BRA Rio de Janeiro 862225 +222 Sao Luis BRA Maranhao 837588 +223 Maceio BRA Alagoas 786288 +224 Duque de Caxias BRA Rio de Janeiro 746758 +225 Sao Bernardo do Campo BRA Sao Paulo 723132 +226 Teresina BRA Piaui 691942 +227 Natal BRA Rio Grande do Norte 688955 +228 Osasco BRA Sao Paulo 659604 +229 Campo Grande BRA Mato Grosso do Sul 649593 +230 Santo Andre BRA Sao Paulo 630073 +231 Joao Pessoa BRA Paraiba 584029 +232 Jaboatao dos Guararapes BRA Pernambuco 558680 +233 Contagem BRA Minas Gerais 520801 +234 Sao Jose dos Campos BRA Sao Paulo 515553 +235 Uberlandia BRA Minas Gerais 487222 +236 Feira de Santana BRA Bahia 479992 +237 Ribeirao Preto BRA Sao Paulo 473276 +238 Sorocaba BRA Sao Paulo 466823 +239 Niteroi BRA Rio de Janeiro 459884 +240 Cuiaba BRA Mato Grosso 453813 +241 Juiz de Fora BRA Minas Gerais 450288 +242 Aracaju BRA Sergipe 445555 +243 Sao Joao de Meriti BRA Rio de Janeiro 440052 +244 Londrina BRA Parana 432257 +245 Joinville BRA Santa Catarina 428011 +246 Belford Roxo BRA Rio de Janeiro 425194 +247 Santos BRA Sao Paulo 408748 +248 Ananindeua BRA Para 400940 +249 Campos dos Goytacazes BRA Rio de Janeiro 398418 +250 Maua BRA Sao Paulo 375055 +251 Carapicuiba BRA Sao Paulo 357552 +252 Olinda BRA Pernambuco 354732 +253 Campina Grande BRA Paraiba 352497 +254 Sao Jose do Rio Preto BRA Sao Paulo 351944 +255 Caxias do Sul BRA Rio Grande do Sul 349581 +256 Moji das Cruzes BRA Sao Paulo 339194 +257 Diadema BRA Sao Paulo 335078 +258 Aparecida de Goiania BRA Goias 324662 +259 Piracicaba BRA Sao Paulo 319104 +260 Cariacica BRA Espirito Santo 319033 +261 Vila Velha BRA Espirito Santo 318758 +262 Pelotas BRA Rio Grande do Sul 315415 +263 Bauru BRA Sao Paulo 313670 +264 Porto Velho BRA Rondonia 309750 +265 Serra BRA Espirito Santo 302666 +266 Betim BRA Minas Gerais 302108 +267 Jundiai BRA Sao Paulo 296127 +268 Canoas BRA Rio Grande do Sul 294125 +269 Franca BRA Sao Paulo 290139 +270 Sao Vicente BRA Sao Paulo 286848 +271 Maringa BRA Parana 286461 +272 Montes Claros BRA Minas Gerais 286058 +273 Anapolis BRA Goias 282197 +274 Florianopolis BRA Santa Catarina 281928 +275 Petropolis BRA Rio de Janeiro 279183 +276 Itaquaquecetuba BRA Sao Paulo 270874 +277 Vitoria BRA Espirito Santo 270626 +278 Ponta Grossa BRA Parana 268013 +279 Rio Branco BRA Acre 259537 +280 Foz do Iguacu BRA Parana 259425 +281 Macapa BRA Amapa 256033 +282 Ilheus BRA Bahia 254970 +283 Vitoria da Conquista BRA Bahia 253587 +284 Uberaba BRA Minas Gerais 249225 +285 Paulista BRA Pernambuco 248473 +286 Limeira BRA Sao Paulo 245497 +287 Blumenau BRA Santa Catarina 244379 +288 Caruaru BRA Pernambuco 244247 +289 Santarem BRA Para 241771 +290 Volta Redonda BRA Rio de Janeiro 240315 +291 Novo Hamburgo BRA Rio Grande do Sul 239940 +292 Caucaia BRA Ceara 238738 +293 Santa Maria BRA Rio Grande do Sul 238473 +294 Cascavel BRA Parana 237510 +295 Guaruja BRA Sao Paulo 237206 +296 Ribeirao das Neves BRA Minas Gerais 232685 +297 Governador Valadares BRA Minas Gerais 231724 +298 Taubate BRA Sao Paulo 229130 +299 Imperatriz BRA Maranhao 224564 +300 Gravatai BRA Rio Grande do Sul 223011 +301 Embu BRA Sao Paulo 222223 +302 Mossoro BRA Rio Grande do Norte 214901 +303 Varzea Grande BRA Mato Grosso 214435 +304 Petrolina BRA Pernambuco 210540 +305 Barueri BRA Sao Paulo 208426 +306 Viamao BRA Rio Grande do Sul 207557 +307 Ipatinga BRA Minas Gerais 206338 +308 Juazeiro BRA Bahia 201073 +309 Juazeiro do Norte BRA Ceara 199636 +310 Taboao da Serra BRA Sao Paulo 197550 +311 Sao Jose dos Pinhais BRA Parana 196884 +312 Mage BRA Rio de Janeiro 196147 +313 Suzano BRA Sao Paulo 195434 +314 Sao Leopoldo BRA Rio Grande do Sul 189258 +315 Marilia BRA Sao Paulo 188691 +316 Sao Carlos BRA Sao Paulo 187122 +317 Sumare BRA Sao Paulo 186205 +318 Presidente Prudente BRA Sao Paulo 185340 +319 Divinopolis BRA Minas Gerais 185047 +320 Sete Lagoas BRA Minas Gerais 182984 +321 Rio Grande BRA Rio Grande do Sul 182222 +322 Itabuna BRA Bahia 182148 +323 Jequie BRA Bahia 179128 +324 Arapiraca BRA Alagoas 178988 +325 Colombo BRA Parana 177764 +326 Americana BRA Sao Paulo 177409 +327 Alvorada BRA Rio Grande do Sul 175574 +328 Araraquara BRA Sao Paulo 174381 +329 Itaborai BRA Rio de Janeiro 173977 +330 Santa Barbara dOeste BRA Sao Paulo 171657 +331 Nova Friburgo BRA Rio de Janeiro 170697 +332 Jacarei BRA Sao Paulo 170356 +333 Aracatuba BRA Sao Paulo 169303 +334 Barra Mansa BRA Rio de Janeiro 168953 +335 Praia Grande BRA Sao Paulo 168434 +336 Maraba BRA Para 167795 +337 Criciuma BRA Santa Catarina 167661 +338 Boa Vista BRA Roraima 167185 +339 Passo Fundo BRA Rio Grande do Sul 166343 +340 Dourados BRA Mato Grosso do Sul 164716 +341 Santa Luzia BRA Minas Gerais 164704 +342 Rio Claro BRA Sao Paulo 163551 +343 Maracanau BRA Ceara 162022 +344 Guarapuava BRA Parana 160510 +345 Rondonopolis BRA Mato Grosso 155115 +346 Sao Jose BRA Santa Catarina 155105 +347 Cachoeiro de Itapemirim BRA Espirito Santo 155024 +348 Nilopolis BRA Rio de Janeiro 153383 +349 Itapevi BRA Sao Paulo 150664 +350 Cabo de Santo Agostinho BRA Pernambuco 149964 +351 Camacari BRA Bahia 149146 +352 Sobral BRA Ceara 146005 +353 Itajai BRA Santa Catarina 145197 +354 Chapeco BRA Santa Catarina 144158 +355 Cotia BRA Sao Paulo 140042 +356 Lages BRA Santa Catarina 139570 +357 Ferraz de Vasconcelos BRA Sao Paulo 139283 +358 Indaiatuba BRA Sao Paulo 135968 +359 Hortolandia BRA Sao Paulo 135755 +360 Caxias BRA Maranhao 133980 +361 Sao Caetano do Sul BRA Sao Paulo 133321 +362 Itu BRA Sao Paulo 132736 +363 Nossa Senhora do Socorro BRA Sergipe 131351 +364 Parnaiba BRA Piaui 129756 +365 Pocos de Caldas BRA Minas Gerais 129683 +366 Teresopolis BRA Rio de Janeiro 128079 +367 Barreiras BRA Bahia 127801 +368 Castanhal BRA Para 127634 +369 Alagoinhas BRA Bahia 126820 +370 Itapecerica da Serra BRA Sao Paulo 126672 +371 Uruguaiana BRA Rio Grande do Sul 126305 +372 Paranagua BRA Parana 126076 +373 Ibirite BRA Minas Gerais 125982 +374 Timon BRA Maranhao 125812 +375 Luziania BRA Goias 125597 +376 Macae BRA Rio de Janeiro 125597 +377 Teofilo Otoni BRA Minas Gerais 124489 +378 Moji-Guacu BRA Sao Paulo 123782 +379 Palmas BRA Tocantins 121919 +380 Pindamonhangaba BRA Sao Paulo 121904 +381 Francisco Morato BRA Sao Paulo 121197 +382 Bage BRA Rio Grande do Sul 120793 +383 Sapucaia do Sul BRA Rio Grande do Sul 120217 +384 Cabo Frio BRA Rio de Janeiro 119503 +385 Itapetininga BRA Sao Paulo 119391 +386 Patos de Minas BRA Minas Gerais 119262 +387 Camaragibe BRA Pernambuco 118968 +388 Braganca Paulista BRA Sao Paulo 116929 +389 Queimados BRA Rio de Janeiro 115020 +390 Araguaina BRA Tocantins 114948 +391 Garanhuns BRA Pernambuco 114603 +392 Vitoria de Santo Antao BRA Pernambuco 113595 +393 Santa Rita BRA Paraiba 113135 +394 Barbacena BRA Minas Gerais 113079 +395 Abaetetuba BRA Para 111258 +396 Jau BRA Sao Paulo 109965 +397 Lauro de Freitas BRA Bahia 109236 +398 Franco da Rocha BRA Sao Paulo 108964 +399 Teixeira de Freitas BRA Bahia 108441 +400 Varginha BRA Minas Gerais 108314 +401 Ribeirao Pires BRA Sao Paulo 108121 +402 Sabara BRA Minas Gerais 107781 +403 Catanduva BRA Sao Paulo 107761 +404 Rio Verde BRA Goias 107755 +405 Botucatu BRA Sao Paulo 107663 +406 Colatina BRA Espirito Santo 107354 +407 Santa Cruz do Sul BRA Rio Grande do Sul 106734 +408 Linhares BRA Espirito Santo 106278 +409 Apucarana BRA Parana 105114 +410 Barretos BRA Sao Paulo 104156 +411 Guaratingueta BRA Sao Paulo 103433 +412 Cachoeirinha BRA Rio Grande do Sul 103240 +413 Codo BRA Maranhao 103153 +414 Jaragua do Sul BRA Santa Catarina 102580 +415 Cubatao BRA Sao Paulo 102372 +416 Itabira BRA Minas Gerais 102217 +417 Itaituba BRA Para 101320 +418 Araras BRA Sao Paulo 101046 +419 Resende BRA Rio de Janeiro 100627 +420 Atibaia BRA Sao Paulo 100356 +421 Pouso Alegre BRA Minas Gerais 100028 +422 Toledo BRA Parana 99387 +423 Crato BRA Ceara 98965 +424 Passos BRA Minas Gerais 98570 +425 Araguari BRA Minas Gerais 98399 +426 Sao Jose de Ribamar BRA Maranhao 98318 +427 Pinhais BRA Parana 98198 +428 Sertaozinho BRA Sao Paulo 98140 +429 Conselheiro Lafaiete BRA Minas Gerais 97507 +430 Paulo Afonso BRA Bahia 97291 +431 Angra dos Reis BRA Rio de Janeiro 96864 +432 Eunapolis BRA Bahia 96610 +433 Salto BRA Sao Paulo 96348 +434 Ourinhos BRA Sao Paulo 96291 +435 Parnamirim BRA Rio Grande do Norte 96210 +436 Jacobina BRA Bahia 96131 +437 Coronel Fabriciano BRA Minas Gerais 95933 +438 Birigui BRA Sao Paulo 94685 +439 Tatui BRA Sao Paulo 93897 +440 Ji-Parana BRA Rondonia 93346 +441 Bacabal BRA Maranhao 93121 +442 Cameta BRA Para 92779 +443 Guaiba BRA Rio Grande do Sul 92224 +444 Sao Lourenco da Mata BRA Pernambuco 91999 +445 Santana do Livramento BRA Rio Grande do Sul 91779 +446 Votorantim BRA Sao Paulo 91777 +447 Campo Largo BRA Parana 91203 +448 Patos BRA Paraiba 90519 +449 Ituiutaba BRA Minas Gerais 90507 +450 Corumba BRA Mato Grosso do Sul 90111 +451 Palhoca BRA Santa Catarina 89465 +452 Barra do Pirai BRA Rio de Janeiro 89388 +453 Bento Goncalves BRA Rio Grande do Sul 89254 +454 Poa BRA Sao Paulo 89236 +455 Aguas Lindas de Goias BRA Goias 89200 +456 London GBR England 7285000 +457 Birmingham GBR England 1013000 +458 Glasgow GBR Scotland 619680 +459 Liverpool GBR England 461000 +460 Edinburgh GBR Scotland 450180 +461 Sheffield GBR England 431607 +462 Manchester GBR England 430000 +463 Leeds GBR England 424194 +464 Bristol GBR England 402000 +465 Cardiff GBR Wales 321000 +466 Coventry GBR England 304000 +467 Leicester GBR England 294000 +468 Bradford GBR England 289376 +469 Belfast GBR North Ireland 287500 +470 Nottingham GBR England 287000 +471 Kingston upon Hull GBR England 262000 +472 Plymouth GBR England 253000 +473 Stoke-on-Trent GBR England 252000 +474 Wolverhampton GBR England 242000 +475 Derby GBR England 236000 +476 Swansea GBR Wales 230000 +477 Southampton GBR England 216000 +478 Aberdeen GBR Scotland 213070 +479 Northampton GBR England 196000 +480 Dudley GBR England 192171 +481 Portsmouth GBR England 190000 +482 Newcastle upon Tyne GBR England 189150 +483 Sunderland GBR England 183310 +484 Luton GBR England 183000 +485 Swindon GBR England 180000 +486 Southend-on-Sea GBR England 176000 +487 Walsall GBR England 174739 +488 Bournemouth GBR England 162000 +489 Peterborough GBR England 156000 +490 Brighton GBR England 156124 +491 Blackpool GBR England 151000 +492 Dundee GBR Scotland 146690 +493 West Bromwich GBR England 146386 +494 Reading GBR England 148000 +495 Oldbury/Smethwick (Warley) GBR England 145542 +496 Middlesbrough GBR England 145000 +497 Huddersfield GBR England 143726 +498 Oxford GBR England 144000 +499 Poole GBR England 141000 +500 Bolton GBR England 139020 +501 Blackburn GBR England 140000 +502 Newport GBR Wales 139000 +503 Preston GBR England 135000 +504 Stockport GBR England 132813 +505 Norwich GBR England 124000 +506 Rotherham GBR England 121380 +507 Cambridge GBR England 121000 +508 Watford GBR England 113080 +509 Ipswich GBR England 114000 +510 Slough GBR England 112000 +511 Exeter GBR England 111000 +512 Cheltenham GBR England 106000 +513 Gloucester GBR England 107000 +514 Saint Helens GBR England 106293 +515 Sutton Coldfield GBR England 106001 +516 York GBR England 104425 +517 Oldham GBR England 103931 +518 Basildon GBR England 100924 +519 Worthing GBR England 100000 +520 Chelmsford GBR England 97451 +521 Colchester GBR England 96063 +522 Crawley GBR England 97000 +523 Gillingham GBR England 92000 +524 Solihull GBR England 94531 +525 Rochdale GBR England 94313 +526 Birkenhead GBR England 93087 +527 Worcester GBR England 95000 +528 Hartlepool GBR England 92000 +529 Halifax GBR England 91069 +530 Woking/Byfleet GBR England 92000 +531 Southport GBR England 90959 +532 Maidstone GBR England 90878 +533 Eastbourne GBR England 90000 +534 Grimsby GBR England 89000 +535 Saint Helier GBR Jersey 27523 +536 Douglas GBR A 23487 +537 Road Town VGB Tortola 8000 +538 Bandar Seri Begawan BRN Brunei and Muara 21484 +539 Sofija BGR Grad Sofija 1122302 +540 Plovdiv BGR Plovdiv 342584 +541 Varna BGR Varna 299801 +542 Burgas BGR Burgas 195255 +543 Ruse BGR Ruse 166467 +544 Stara Zagora BGR Haskovo 147939 +545 Pleven BGR Lovec 121952 +546 Sliven BGR Burgas 105530 +547 Dobric BGR Varna 100399 +548 Gumen BGR Varna 94686 +549 Ouagadougou BFA Kadiogo 824000 +550 Bobo-Dioulasso BFA Houet 300000 +551 Koudougou BFA Boulkiemde 105000 +552 Bujumbura BDI Bujumbura 300000 +553 George Town CYM Grand Cayman 19600 +554 Santiago de Chile CHL Santiago 4703954 +555 Puente Alto CHL Santiago 386236 +556 Viaa del Mar CHL Valparaiso 312493 +557 Valparaiso CHL Valparaiso 293800 +558 Talcahuano CHL Biobio 277752 +559 Antofagasta CHL Antofagasta 251429 +560 San Bernardo CHL Santiago 241910 +561 Temuco CHL La Araucania 233041 +562 Concepcion CHL Biobio 217664 +563 Rancagua CHL OHiggins 212977 +564 Arica CHL Tarapaca 189036 +565 Talca CHL Maule 187557 +566 Chillan CHL Biobio 178182 +567 Iquique CHL Tarapaca 177892 +568 Los Angeles CHL Biobio 158215 +569 Puerto Montt CHL Los Lagos 152194 +570 Coquimbo CHL Coquimbo 143353 +571 Osorno CHL Los Lagos 141468 +572 La Serena CHL Coquimbo 137409 +573 Calama CHL Antofagasta 137265 +574 Valdivia CHL Los Lagos 133106 +575 Punta Arenas CHL Magallanes 125631 +576 Copiapo CHL Atacama 120128 +577 Quilpue CHL Valparaiso 118857 +578 Curico CHL Maule 115766 +579 Ovalle CHL Coquimbo 94854 +580 Coronel CHL Biobio 93061 +581 San Pedro de la Paz CHL Biobio 91684 +582 Melipilla CHL Santiago 91056 +583 Avarua COK Rarotonga 11900 +584 San Jose CRI San Jose 339131 +585 Djibouti DJI Djibouti 383000 +586 Roseau DMA St George 16243 +587 Santo Domingo de Guzman DOM Distrito Nacional 1609966 +588 Santiago de los Caballeros DOM Santiago 365463 +589 La Romana DOM La Romana 140204 +590 San Pedro de Macoris DOM San Pedro de Macoris 124735 +591 San Francisco de Macoris DOM Duarte 108485 +592 San Felipe de Puerto Plata DOM Puerto Plata 89423 +593 Guayaquil ECU Guayas 2070040 +594 Quito ECU Pichincha 1573458 +595 Cuenca ECU Azuay 270353 +596 Machala ECU El Oro 210368 +597 Santo Domingo de los Colorados ECU Pichincha 202111 +598 Portoviejo ECU Manabi 176413 +599 Ambato ECU Tungurahua 169612 +600 Manta ECU Manabi 164739 +601 Duran [Eloy Alfaro] ECU Guayas 152514 +602 Ibarra ECU Imbabura 130643 +603 Quevedo ECU Los Rios 129631 +604 Milagro ECU Guayas 124177 +605 Loja ECU Loja 123875 +606 Riobamba ECU Chimborazo 123163 +607 Esmeraldas ECU Esmeraldas 123045 +608 Cairo EGY Kairo 6789479 +609 Alexandria EGY Aleksandria 3328196 +610 Giza EGY Giza 2221868 +611 Shubra al-Khayma EGY al-Qalyubiya 870716 +612 Port Said EGY Port Said 469533 +613 Suez EGY Suez 417610 +614 al-Mahallat al-Kubra EGY al-Gharbiya 395402 +615 Tanta EGY al-Gharbiya 371010 +616 al-Mansura EGY al-Daqahliya 369621 +617 Luxor EGY Luxor 360503 +618 Asyut EGY Asyut 343498 +619 Bahtim EGY al-Qalyubiya 275807 +620 Zagazig EGY al-Sharqiya 267351 +621 al-Faiyum EGY al-Faiyum 260964 +622 Ismailia EGY Ismailia 254477 +623 Kafr al-Dawwar EGY al-Buhayra 231978 +624 Assuan EGY Assuan 219017 +625 Damanhur EGY al-Buhayra 212203 +626 al-Minya EGY al-Minya 201360 +627 Bani Suwayf EGY Bani Suwayf 172032 +628 Qina EGY Qina 171275 +629 Sawhaj EGY Sawhaj 170125 +630 Shibin al-Kawm EGY al-Minufiya 159909 +631 Bulaq al-Dakrur EGY Giza 148787 +632 Banha EGY al-Qalyubiya 145792 +633 Warraq al-Arab EGY Giza 127108 +634 Kafr al-Shaykh EGY Kafr al-Shaykh 124819 +635 Mallawi EGY al-Minya 119283 +636 Bilbays EGY al-Sharqiya 113608 +637 Mit Ghamr EGY al-Daqahliya 101801 +638 al-Arish EGY Shamal Sina 100447 +639 Talkha EGY al-Daqahliya 97700 +640 Qalyub EGY al-Qalyubiya 97200 +641 Jirja EGY Sawhaj 95400 +642 Idfu EGY Qina 94200 +643 al-Hawamidiya EGY Giza 91700 +644 Disuq EGY Kafr al-Shaykh 91300 +645 San Salvador SLV San Salvador 415346 +646 Santa Ana SLV Santa Ana 139389 +647 Mejicanos SLV San Salvador 138800 +648 Soyapango SLV San Salvador 129800 +649 San Miguel SLV San Miguel 127696 +650 Nueva San Salvador SLV La Libertad 98400 +651 Apopa SLV San Salvador 88800 +652 Asmara ERI Maekel 431000 +653 Madrid ESP Madrid 2879052 +654 Barcelona ESP Katalonia 1503451 +655 Valencia ESP Valencia 739412 +656 Sevilla ESP Andalusia 701927 +657 Zaragoza ESP Aragonia 603367 +658 Malaga ESP Andalusia 530553 +659 Bilbao ESP Baskimaa 357589 +660 Las Palmas de Gran Canaria ESP Canary Islands 354757 +661 Murcia ESP Murcia 353504 +662 Palma de Mallorca ESP Balears 326993 +663 Valladolid ESP Castilla and Leon 319998 +664 Cordoba ESP Andalusia 311708 +665 Vigo ESP Galicia 283670 +666 Alicante [Alacant] ESP Valencia 272432 +667 Gijon ESP Asturia 267980 +668 LHospitalet de Llobregat ESP Katalonia 247986 +669 Granada ESP Andalusia 244767 +670 A Coruaa (La Coruaa) ESP Galicia 243402 +671 Vitoria-Gasteiz ESP Baskimaa 217154 +672 Santa Cruz de Tenerife ESP Canary Islands 213050 +673 Badalona ESP Katalonia 209635 +674 Oviedo ESP Asturia 200453 +675 Mostoles ESP Madrid 195351 +676 Elche [Elx] ESP Valencia 193174 +677 Sabadell ESP Katalonia 184859 +678 Santander ESP Cantabria 184165 +679 Jerez de la Frontera ESP Andalusia 182660 +680 Pamplona [Iruaa] ESP Navarra 180483 +681 Donostia-San Sebastian ESP Baskimaa 179208 +682 Cartagena ESP Murcia 177709 +683 Leganes ESP Madrid 173163 +684 Fuenlabrada ESP Madrid 171173 +685 Almeria ESP Andalusia 169027 +686 Terrassa ESP Katalonia 168695 +687 Alcala de Henares ESP Madrid 164463 +688 Burgos ESP Castilla and Leon 162802 +689 Salamanca ESP Castilla and Leon 158720 +690 Albacete ESP Kastilia-La Mancha 147527 +691 Getafe ESP Madrid 145371 +692 Cadiz ESP Andalusia 142449 +693 Alcorcon ESP Madrid 142048 +694 Huelva ESP Andalusia 140583 +695 Leon ESP Castilla and Leon 139809 +696 Castellon de la Plana [Castell ESP Valencia 139712 +697 Badajoz ESP Extremadura 136613 +698 [San Cristobal de] la Laguna ESP Canary Islands 127945 +699 Logroao ESP La Rioja 127093 +700 Santa Coloma de Gramenet ESP Katalonia 120802 +701 Tarragona ESP Katalonia 113016 +702 Lleida (Lerida) ESP Katalonia 112207 +703 Jaen ESP Andalusia 109247 +704 Ourense (Orense) ESP Galicia 109120 +705 Mataro ESP Katalonia 104095 +706 Algeciras ESP Andalusia 103106 +707 Marbella ESP Andalusia 101144 +708 Barakaldo ESP Baskimaa 98212 +709 Dos Hermanas ESP Andalusia 94591 +710 Santiago de Compostela ESP Galicia 93745 +711 Torrejon de Ardoz ESP Madrid 92262 +712 Cape Town ZAF Western Cape 2352121 +713 Soweto ZAF Gauteng 904165 +714 Johannesburg ZAF Gauteng 756653 +715 Port Elizabeth ZAF Eastern Cape 752319 +716 Pretoria ZAF Gauteng 658630 +717 Inanda ZAF KwaZulu-Natal 634065 +718 Durban ZAF KwaZulu-Natal 566120 +719 Vanderbijlpark ZAF Gauteng 468931 +720 Kempton Park ZAF Gauteng 442633 +721 Alberton ZAF Gauteng 410102 +722 Pinetown ZAF KwaZulu-Natal 378810 +723 Pietermaritzburg ZAF KwaZulu-Natal 370190 +724 Benoni ZAF Gauteng 365467 +725 Randburg ZAF Gauteng 341288 +726 Umlazi ZAF KwaZulu-Natal 339233 +727 Bloemfontein ZAF Free State 334341 +728 Vereeniging ZAF Gauteng 328535 +729 Wonderboom ZAF Gauteng 283289 +730 Roodepoort ZAF Gauteng 279340 +731 Boksburg ZAF Gauteng 262648 +732 Klerksdorp ZAF North West 261911 +733 Soshanguve ZAF Gauteng 242727 +734 Newcastle ZAF KwaZulu-Natal 222993 +735 East London ZAF Eastern Cape 221047 +736 Welkom ZAF Free State 203296 +737 Kimberley ZAF Northern Cape 197254 +738 Uitenhage ZAF Eastern Cape 192120 +739 Chatsworth ZAF KwaZulu-Natal 189885 +740 Mdantsane ZAF Eastern Cape 182639 +741 Krugersdorp ZAF Gauteng 181503 +742 Botshabelo ZAF Free State 177971 +743 Brakpan ZAF Gauteng 171363 +744 Witbank ZAF Mpumalanga 167183 +745 Oberholzer ZAF Gauteng 164367 +746 Germiston ZAF Gauteng 164252 +747 Springs ZAF Gauteng 162072 +748 Westonaria ZAF Gauteng 159632 +749 Randfontein ZAF Gauteng 120838 +750 Paarl ZAF Western Cape 105768 +751 Potchefstroom ZAF North West 101817 +752 Rustenburg ZAF North West 97008 +753 Nigel ZAF Gauteng 96734 +754 George ZAF Western Cape 93818 +755 Ladysmith ZAF KwaZulu-Natal 89292 +756 Addis Abeba ETH Addis Abeba 2495000 +757 Dire Dawa ETH Dire Dawa 164851 +758 Nazret ETH Oromia 127842 +759 Gonder ETH Amhara 112249 +760 Dese ETH Amhara 97314 +761 Mekele ETH Tigray 96938 +762 Bahir Dar ETH Amhara 96140 +763 Stanley FLK East Falkland 1636 +764 Suva FJI Central 77366 +765 Quezon PHL National Capital Reg 2173831 +766 Manila PHL National Capital Reg 1581082 +767 Kalookan PHL National Capital Reg 1177604 +768 Davao PHL Southern Mindanao 1147116 +769 Cebu PHL Central Visayas 718821 +770 Zamboanga PHL Western Mindanao 601794 +771 Pasig PHL National Capital Reg 505058 +772 Valenzuela PHL National Capital Reg 485433 +773 Las Piaas PHL National Capital Reg 472780 +774 Antipolo PHL Southern Tagalog 470866 +775 Taguig PHL National Capital Reg 467375 +776 Cagayan de Oro PHL Northern Mindanao 461877 +777 Paraaaque PHL National Capital Reg 449811 +778 Makati PHL National Capital Reg 444867 +779 Bacolod PHL Western Visayas 429076 +780 General Santos PHL Southern Mindanao 411822 +781 Marikina PHL National Capital Reg 391170 +782 Dasmariaas PHL Southern Tagalog 379520 +783 Muntinlupa PHL National Capital Reg 379310 +784 Iloilo PHL Western Visayas 365820 +785 Pasay PHL National Capital Reg 354908 +786 Malabon PHL National Capital Reg 338855 +787 San Jose del Monte PHL Central Luzon 315807 +788 Bacoor PHL Southern Tagalog 305699 +789 Iligan PHL Central Mindanao 285061 +790 Calamba PHL Southern Tagalog 281146 +791 Mandaluyong PHL National Capital Reg 278474 +792 Butuan PHL Caraga 267279 +793 Angeles PHL Central Luzon 263971 +794 Tarlac PHL Central Luzon 262481 +795 Mandaue PHL Central Visayas 259728 +796 Baguio PHL CAR 252386 +797 Batangas PHL Southern Tagalog 247588 +798 Cainta PHL Southern Tagalog 242511 +799 San Pedro PHL Southern Tagalog 231403 +800 Navotas PHL National Capital Reg 230403 +801 Cabanatuan PHL Central Luzon 222859 +802 San Fernando PHL Central Luzon 221857 +803 Lipa PHL Southern Tagalog 218447 +804 Lapu-Lapu PHL Central Visayas 217019 +805 San Pablo PHL Southern Tagalog 207927 +806 Biaan PHL Southern Tagalog 201186 +807 Taytay PHL Southern Tagalog 198183 +808 Lucena PHL Southern Tagalog 196075 +809 Imus PHL Southern Tagalog 195482 +810 Olongapo PHL Central Luzon 194260 +811 Binangonan PHL Southern Tagalog 187691 +812 Santa Rosa PHL Southern Tagalog 185633 +813 Tagum PHL Southern Mindanao 179531 +814 Tacloban PHL Eastern Visayas 178639 +815 Malolos PHL Central Luzon 175291 +816 Mabalacat PHL Central Luzon 171045 +817 Cotabato PHL Central Mindanao 163849 +818 Meycauayan PHL Central Luzon 163037 +819 Puerto Princesa PHL Southern Tagalog 161912 +820 Legazpi PHL Bicol 157010 +821 Silang PHL Southern Tagalog 156137 +822 Ormoc PHL Eastern Visayas 154297 +823 San Carlos PHL Ilocos 154264 +824 Kabankalan PHL Western Visayas 149769 +825 Talisay PHL Central Visayas 148110 +826 Valencia PHL Northern Mindanao 147924 +827 Calbayog PHL Eastern Visayas 147187 +828 Santa Maria PHL Central Luzon 144282 +829 Pagadian PHL Western Mindanao 142515 +830 Cadiz PHL Western Visayas 141954 +831 Bago PHL Western Visayas 141721 +832 Toledo PHL Central Visayas 141174 +833 Naga PHL Bicol 137810 +834 San Mateo PHL Southern Tagalog 135603 +835 Panabo PHL Southern Mindanao 133950 +836 Koronadal PHL Southern Mindanao 133786 +837 Marawi PHL Central Mindanao 131090 +838 Dagupan PHL Ilocos 130328 +839 Sagay PHL Western Visayas 129765 +840 Roxas PHL Western Visayas 126352 +841 Lubao PHL Central Luzon 125699 +842 Digos PHL Southern Mindanao 125171 +843 San Miguel PHL Central Luzon 123824 +844 Malaybalay PHL Northern Mindanao 123672 +845 Tuguegarao PHL Cagayan Valley 120645 +846 Ilagan PHL Cagayan Valley 119990 +847 Baliuag PHL Central Luzon 119675 +848 Surigao PHL Caraga 118534 +849 San Carlos PHL Western Visayas 118259 +850 San Juan del Monte PHL National Capital Reg 117680 +851 Tanauan PHL Southern Tagalog 117539 +852 Concepcion PHL Central Luzon 115171 +853 Rodriguez (Montalban) PHL Southern Tagalog 115167 +854 Sariaya PHL Southern Tagalog 114568 +855 Malasiqui PHL Ilocos 113190 +856 General Mariano Alvarez PHL Southern Tagalog 112446 +857 Urdaneta PHL Ilocos 111582 +858 Hagonoy PHL Central Luzon 111425 +859 San Jose PHL Southern Tagalog 111009 +860 Polomolok PHL Southern Mindanao 110709 +861 Santiago PHL Cagayan Valley 110531 +862 Tanza PHL Southern Tagalog 110517 +863 Ozamis PHL Northern Mindanao 110420 +864 Mexico PHL Central Luzon 109481 +865 San Jose PHL Central Luzon 108254 +866 Silay PHL Western Visayas 107722 +867 General Trias PHL Southern Tagalog 107691 +868 Tabaco PHL Bicol 107166 +869 Cabuyao PHL Southern Tagalog 106630 +870 Calapan PHL Southern Tagalog 105910 +871 Mati PHL Southern Mindanao 105908 +872 Midsayap PHL Central Mindanao 105760 +873 Cauayan PHL Cagayan Valley 103952 +874 Gingoog PHL Northern Mindanao 102379 +875 Dumaguete PHL Central Visayas 102265 +876 San Fernando PHL Ilocos 102082 +877 Arayat PHL Central Luzon 101792 +878 Bayawan (Tulong) PHL Central Visayas 101391 +879 Kidapawan PHL Central Mindanao 101205 +880 Daraga (Locsin) PHL Bicol 101031 +881 Marilao PHL Central Luzon 101017 +882 Malita PHL Southern Mindanao 100000 +883 Dipolog PHL Western Mindanao 99862 +884 Cavite PHL Southern Tagalog 99367 +885 Danao PHL Central Visayas 98781 +886 Bislig PHL Caraga 97860 +887 Talavera PHL Central Luzon 97329 +888 Guagua PHL Central Luzon 96858 +889 Bayambang PHL Ilocos 96609 +890 Nasugbu PHL Southern Tagalog 96113 +891 Baybay PHL Eastern Visayas 95630 +892 Capas PHL Central Luzon 95219 +893 Sultan Kudarat PHL ARMM 94861 +894 Laoag PHL Ilocos 94466 +895 Bayugan PHL Caraga 93623 +896 Malungon PHL Southern Mindanao 93232 +897 Santa Cruz PHL Southern Tagalog 92694 +898 Sorsogon PHL Bicol 92512 +899 Candelaria PHL Southern Tagalog 92429 +900 Ligao PHL Bicol 90603 +901 Torshavn FRO Streymoyar 14542 +902 Libreville GAB Estuaire 419000 +903 Serekunda GMB Kombo St Mary 102600 +904 Banjul GMB Banjul 42326 +905 Tbilisi GEO Tbilisi 1235200 +906 Kutaisi GEO Imereti 240900 +907 Rustavi GEO Kvemo Kartli 155400 +908 Batumi GEO Adzaria [Atdara] 137700 +909 Sohumi GEO Abhasia [Aphazeti] 111700 +910 Accra GHA Greater Accra 1070000 +911 Kumasi GHA Ashanti 385192 +912 Tamale GHA Northern 151069 +913 Tema GHA Greater Accra 109975 +914 Sekondi-Takoradi GHA Western 103653 +915 Gibraltar GIB A 27025 +916 Saint Georges GRD St George 4621 +917 Nuuk GRL Kitaa 13445 +918 Les Abymes GLP Grande-Terre 62947 +919 Basse-Terre GLP Basse-Terre 12433 +920 Tamuning GUM A 9500 +921 Agaaa GUM A 1139 +922 Ciudad de Guatemala GTM Guatemala 823301 +923 Mixco GTM Guatemala 209791 +924 Villa Nueva GTM Guatemala 101295 +925 Quetzaltenango GTM Quetzaltenango 90801 +926 Conakry GIN Conakry 1090610 +927 Bissau GNB Bissau 241000 +928 Georgetown GUY Georgetown 254000 +929 Port-au-Prince HTI Ouest 884472 +930 Carrefour HTI Ouest 290204 +931 Delmas HTI Ouest 240429 +932 Le-Cap-Haitien HTI Nord 102233 +933 Tegucigalpa HND Distrito Central 813900 +934 San Pedro Sula HND Cortes 383900 +935 La Ceiba HND Atlantida 89200 +936 Kowloon and New Kowloon HKG Kowloon and New Kowl 1987996 +937 Victoria HKG Hongkong 1312637 +938 Longyearbyen SJM Lansimaa 1438 +939 Jakarta IDN Jakarta Raya 9604900 +940 Surabaya IDN East Java 2663820 +941 Bandung IDN West Java 2429000 +942 Medan IDN Sumatera Utara 1843919 +943 Palembang IDN Sumatera Selatan 1222764 +944 Tangerang IDN West Java 1198300 +945 Semarang IDN Central Java 1104405 +946 Ujung Pandang IDN Sulawesi Selatan 1060257 +947 Malang IDN East Java 716862 +948 Bandar Lampung IDN Lampung 680332 +949 Bekasi IDN West Java 644300 +950 Padang IDN Sumatera Barat 534474 +951 Surakarta IDN Central Java 518600 +952 Banjarmasin IDN Kalimantan Selatan 482931 +953 Pekan Baru IDN Riau 438638 +954 Denpasar IDN Bali 435000 +955 Yogyakarta IDN Yogyakarta 418944 +956 Pontianak IDN Kalimantan Barat 409632 +957 Samarinda IDN Kalimantan Timur 399175 +958 Jambi IDN Jambi 385201 +959 Depok IDN West Java 365200 +960 Cimahi IDN West Java 344600 +961 Balikpapan IDN Kalimantan Timur 338752 +962 Manado IDN Sulawesi Utara 332288 +963 Mataram IDN Nusa Tenggara Barat 306600 +964 Pekalongan IDN Central Java 301504 +965 Tegal IDN Central Java 289744 +966 Bogor IDN West Java 285114 +967 Ciputat IDN West Java 270800 +968 Pondokgede IDN West Java 263200 +969 Cirebon IDN West Java 254406 +970 Kediri IDN East Java 253760 +971 Ambon IDN Molukit 249312 +972 Jember IDN East Java 218500 +973 Cilacap IDN Central Java 206900 +974 Cimanggis IDN West Java 205100 +975 Pematang Siantar IDN Sumatera Utara 203056 +976 Purwokerto IDN Central Java 202500 +977 Ciomas IDN West Java 187400 +978 Tasikmalaya IDN West Java 179800 +979 Madiun IDN East Java 171532 +980 Bengkulu IDN Bengkulu 146439 +981 Karawang IDN West Java 145000 +982 Banda Aceh IDN Aceh 143409 +983 Palu IDN Sulawesi Tengah 142800 +984 Pasuruan IDN East Java 134019 +985 Kupang IDN Nusa Tenggara Timur 129300 +986 Tebing Tinggi IDN Sumatera Utara 129300 +987 Percut Sei Tuan IDN Sumatera Utara 129000 +988 Binjai IDN Sumatera Utara 127222 +989 Sukabumi IDN West Java 125766 +990 Waru IDN East Java 124300 +991 Pangkal Pinang IDN Sumatera Selatan 124000 +992 Magelang IDN Central Java 123800 +993 Blitar IDN East Java 122600 +994 Serang IDN West Java 122400 +995 Probolinggo IDN East Java 120770 +996 Cilegon IDN West Java 117000 +997 Cianjur IDN West Java 114300 +998 Ciparay IDN West Java 111500 +999 Lhokseumawe IDN Aceh 109600 +1000 Taman IDN East Java 107000 +1001 Depok IDN Yogyakarta 106800 +1002 Citeureup IDN West Java 105100 +1003 Pemalang IDN Central Java 103500 +1004 Klaten IDN Central Java 103300 +1005 Salatiga IDN Central Java 103000 +1006 Cibinong IDN West Java 101300 +1007 Palangka Raya IDN Kalimantan Tengah 99693 +1008 Mojokerto IDN East Java 96626 +1009 Purwakarta IDN West Java 95900 +1010 Garut IDN West Java 95800 +1011 Kudus IDN Central Java 95300 +1012 Kendari IDN Sulawesi Tenggara 94800 +1013 Jaya Pura IDN West Irian 94700 +1014 Gorontalo IDN Sulawesi Utara 94058 +1015 Majalaya IDN West Java 93200 +1016 Pondok Aren IDN West Java 92700 +1017 Jombang IDN East Java 92600 +1018 Sunggal IDN Sumatera Utara 92300 +1019 Batam IDN Riau 91871 +1020 Padang Sidempuan IDN Sumatera Utara 91200 +1021 Sawangan IDN West Java 91100 +1022 Banyuwangi IDN East Java 89900 +1023 Tanjung Pinang IDN Riau 89900 +1024 Mumbai (Bombay) IND Maharashtra 10500000 +1025 Delhi IND Delhi 7206704 +1026 Calcutta [Kolkata] IND West Bengali 4399819 +1027 Chennai (Madras) IND Tamil Nadu 3841396 +1028 Hyderabad IND Andhra Pradesh 2964638 +1029 Ahmedabad IND Gujarat 2876710 +1030 Bangalore IND Karnataka 2660088 +1031 Kanpur IND Uttar Pradesh 1874409 +1032 Nagpur IND Maharashtra 1624752 +1033 Lucknow IND Uttar Pradesh 1619115 +1034 Pune IND Maharashtra 1566651 +1035 Surat IND Gujarat 1498817 +1036 Jaipur IND Rajasthan 1458483 +1037 Indore IND Madhya Pradesh 1091674 +1038 Bhopal IND Madhya Pradesh 1062771 +1039 Ludhiana IND Punjab 1042740 +1040 Vadodara (Baroda) IND Gujarat 1031346 +1041 Kalyan IND Maharashtra 1014557 +1042 Madurai IND Tamil Nadu 977856 +1043 Haora (Howrah) IND West Bengali 950435 +1044 Varanasi (Benares) IND Uttar Pradesh 929270 +1045 Patna IND Bihar 917243 +1046 Srinagar IND Jammu and Kashmir 892506 +1047 Agra IND Uttar Pradesh 891790 +1048 Coimbatore IND Tamil Nadu 816321 +1049 Thane (Thana) IND Maharashtra 803389 +1050 Allahabad IND Uttar Pradesh 792858 +1051 Meerut IND Uttar Pradesh 753778 +1052 Vishakhapatnam IND Andhra Pradesh 752037 +1053 Jabalpur IND Madhya Pradesh 741927 +1054 Amritsar IND Punjab 708835 +1055 Faridabad IND Haryana 703592 +1056 Vijayawada IND Andhra Pradesh 701827 +1057 Gwalior IND Madhya Pradesh 690765 +1058 Jodhpur IND Rajasthan 666279 +1059 Nashik (Nasik) IND Maharashtra 656925 +1060 Hubli-Dharwad IND Karnataka 648298 +1061 Solapur (Sholapur) IND Maharashtra 604215 +1062 Ranchi IND Jharkhand 599306 +1063 Bareilly IND Uttar Pradesh 587211 +1064 Guwahati (Gauhati) IND Assam 584342 +1065 Shambajinagar (Aurangabad) IND Maharashtra 573272 +1066 Cochin (Kochi) IND Kerala 564589 +1067 Rajkot IND Gujarat 559407 +1068 Kota IND Rajasthan 537371 +1069 Thiruvananthapuram (Trivandrum IND Kerala 524006 +1070 Pimpri-Chinchwad IND Maharashtra 517083 +1071 Jalandhar (Jullundur) IND Punjab 509510 +1072 Gorakhpur IND Uttar Pradesh 505566 +1073 Chandigarh IND Chandigarh 504094 +1074 Mysore IND Karnataka 480692 +1075 Aligarh IND Uttar Pradesh 480520 +1076 Guntur IND Andhra Pradesh 471051 +1077 Jamshedpur IND Jharkhand 460577 +1078 Ghaziabad IND Uttar Pradesh 454156 +1079 Warangal IND Andhra Pradesh 447657 +1080 Raipur IND Chhatisgarh 438639 +1081 Moradabad IND Uttar Pradesh 429214 +1082 Durgapur IND West Bengali 425836 +1083 Amravati IND Maharashtra 421576 +1084 Calicut (Kozhikode) IND Kerala 419831 +1085 Bikaner IND Rajasthan 416289 +1086 Bhubaneswar IND Orissa 411542 +1087 Kolhapur IND Maharashtra 406370 +1088 Kataka (Cuttack) IND Orissa 403418 +1089 Ajmer IND Rajasthan 402700 +1090 Bhavnagar IND Gujarat 402338 +1091 Tiruchirapalli IND Tamil Nadu 387223 +1092 Bhilai IND Chhatisgarh 386159 +1093 Bhiwandi IND Maharashtra 379070 +1094 Saharanpur IND Uttar Pradesh 374945 +1095 Ulhasnagar IND Maharashtra 369077 +1096 Salem IND Tamil Nadu 366712 +1097 Ujjain IND Madhya Pradesh 362266 +1098 Malegaon IND Maharashtra 342595 +1099 Jamnagar IND Gujarat 341637 +1100 Bokaro Steel City IND Jharkhand 333683 +1101 Akola IND Maharashtra 328034 +1102 Belgaum IND Karnataka 326399 +1103 Rajahmundry IND Andhra Pradesh 324851 +1104 Nellore IND Andhra Pradesh 316606 +1105 Udaipur IND Rajasthan 308571 +1106 New Bombay IND Maharashtra 307297 +1107 Bhatpara IND West Bengali 304952 +1108 Gulbarga IND Karnataka 304099 +1109 New Delhi IND Delhi 301297 +1110 Jhansi IND Uttar Pradesh 300850 +1111 Gaya IND Bihar 291675 +1112 Kakinada IND Andhra Pradesh 279980 +1113 Dhule (Dhulia) IND Maharashtra 278317 +1114 Panihati IND West Bengali 275990 +1115 Nanded (Nander) IND Maharashtra 275083 +1116 Mangalore IND Karnataka 273304 +1117 Dehra Dun IND Uttaranchal 270159 +1118 Kamarhati IND West Bengali 266889 +1119 Davangere IND Karnataka 266082 +1120 Asansol IND West Bengali 262188 +1121 Bhagalpur IND Bihar 253225 +1122 Bellary IND Karnataka 245391 +1123 Barddhaman (Burdwan) IND West Bengali 245079 +1124 Rampur IND Uttar Pradesh 243742 +1125 Jalgaon IND Maharashtra 242193 +1126 Muzaffarpur IND Bihar 241107 +1127 Nizamabad IND Andhra Pradesh 241034 +1128 Muzaffarnagar IND Uttar Pradesh 240609 +1129 Patiala IND Punjab 238368 +1130 Shahjahanpur IND Uttar Pradesh 237713 +1131 Kurnool IND Andhra Pradesh 236800 +1132 Tiruppur (Tirupper) IND Tamil Nadu 235661 +1133 Rohtak IND Haryana 233400 +1134 South Dum Dum IND West Bengali 232811 +1135 Mathura IND Uttar Pradesh 226691 +1136 Chandrapur IND Maharashtra 226105 +1137 Barahanagar (Baranagar) IND West Bengali 224821 +1138 Darbhanga IND Bihar 218391 +1139 Siliguri (Shiliguri) IND West Bengali 216950 +1140 Raurkela IND Orissa 215489 +1141 Ambattur IND Tamil Nadu 215424 +1142 Panipat IND Haryana 215218 +1143 Firozabad IND Uttar Pradesh 215128 +1144 Ichalkaranji IND Maharashtra 214950 +1145 Jammu IND Jammu and Kashmir 214737 +1146 Ramagundam IND Andhra Pradesh 214384 +1147 Eluru IND Andhra Pradesh 212866 +1148 Brahmapur IND Orissa 210418 +1149 Alwar IND Rajasthan 205086 +1150 Pondicherry IND Pondicherry 203065 +1151 Thanjavur IND Tamil Nadu 202013 +1152 Bihar Sharif IND Bihar 201323 +1153 Tuticorin IND Tamil Nadu 199854 +1154 Imphal IND Manipur 198535 +1155 Latur IND Maharashtra 197408 +1156 Sagar IND Madhya Pradesh 195346 +1157 Farrukhabad-cum-Fatehgarh IND Uttar Pradesh 194567 +1158 Sangli IND Maharashtra 193197 +1159 Parbhani IND Maharashtra 190255 +1160 Nagar Coil IND Tamil Nadu 190084 +1161 Bijapur IND Karnataka 186939 +1162 Kukatpalle IND Andhra Pradesh 185378 +1163 Bally IND West Bengali 184474 +1164 Bhilwara IND Rajasthan 183965 +1165 Ratlam IND Madhya Pradesh 183375 +1166 Avadi IND Tamil Nadu 183215 +1167 Dindigul IND Tamil Nadu 182477 +1168 Ahmadnagar IND Maharashtra 181339 +1169 Bilaspur IND Chhatisgarh 179833 +1170 Shimoga IND Karnataka 179258 +1171 Kharagpur IND West Bengali 177989 +1172 Mira Bhayandar IND Maharashtra 175372 +1173 Vellore IND Tamil Nadu 175061 +1174 Jalna IND Maharashtra 174985 +1175 Burnpur IND West Bengali 174933 +1176 Anantapur IND Andhra Pradesh 174924 +1177 Allappuzha (Alleppey) IND Kerala 174666 +1178 Tirupati IND Andhra Pradesh 174369 +1179 Karnal IND Haryana 173751 +1180 Burhanpur IND Madhya Pradesh 172710 +1181 Hisar (Hissar) IND Haryana 172677 +1182 Tiruvottiyur IND Tamil Nadu 172562 +1183 Mirzapur-cum-Vindhyachal IND Uttar Pradesh 169336 +1184 Secunderabad IND Andhra Pradesh 167461 +1185 Nadiad IND Gujarat 167051 +1186 Dewas IND Madhya Pradesh 164364 +1187 Murwara (Katni) IND Madhya Pradesh 163431 +1188 Ganganagar IND Rajasthan 161482 +1189 Vizianagaram IND Andhra Pradesh 160359 +1190 Erode IND Tamil Nadu 159232 +1191 Machilipatnam (Masulipatam) IND Andhra Pradesh 159110 +1192 Bhatinda (Bathinda) IND Punjab 159042 +1193 Raichur IND Karnataka 157551 +1194 Agartala IND Tripura 157358 +1195 Arrah (Ara) IND Bihar 157082 +1196 Satna IND Madhya Pradesh 156630 +1197 Lalbahadur Nagar IND Andhra Pradesh 155500 +1198 Aizawl IND Mizoram 155240 +1199 Uluberia IND West Bengali 155172 +1200 Katihar IND Bihar 154367 +1201 Cuddalore IND Tamil Nadu 153086 +1202 Hugli-Chinsurah IND West Bengali 151806 +1203 Dhanbad IND Jharkhand 151789 +1204 Raiganj IND West Bengali 151045 +1205 Sambhal IND Uttar Pradesh 150869 +1206 Durg IND Chhatisgarh 150645 +1207 Munger (Monghyr) IND Bihar 150112 +1208 Kanchipuram IND Tamil Nadu 150100 +1209 North Dum Dum IND West Bengali 149965 +1210 Karimnagar IND Andhra Pradesh 148583 +1211 Bharatpur IND Rajasthan 148519 +1212 Sikar IND Rajasthan 148272 +1213 Hardwar (Haridwar) IND Uttaranchal 147305 +1214 Dabgram IND West Bengali 147217 +1215 Morena IND Madhya Pradesh 147124 +1216 Noida IND Uttar Pradesh 146514 +1217 Hapur IND Uttar Pradesh 146262 +1218 Bhusawal IND Maharashtra 145143 +1219 Khandwa IND Madhya Pradesh 145133 +1220 Yamuna Nagar IND Haryana 144346 +1221 Sonipat (Sonepat) IND Haryana 143922 +1222 Tenali IND Andhra Pradesh 143726 +1223 Raurkela Civil Township IND Orissa 140408 +1224 Kollam (Quilon) IND Kerala 139852 +1225 Kumbakonam IND Tamil Nadu 139483 +1226 Ingraj Bazar (English Bazar) IND West Bengali 139204 +1227 Timkur IND Karnataka 138903 +1228 Amroha IND Uttar Pradesh 137061 +1229 Serampore IND West Bengali 137028 +1230 Chapra IND Bihar 136877 +1231 Pali IND Rajasthan 136842 +1232 Maunath Bhanjan IND Uttar Pradesh 136697 +1233 Adoni IND Andhra Pradesh 136182 +1234 Jaunpur IND Uttar Pradesh 136062 +1235 Tirunelveli IND Tamil Nadu 135825 +1236 Bahraich IND Uttar Pradesh 135400 +1237 Gadag Betigeri IND Karnataka 134051 +1238 Proddatur IND Andhra Pradesh 133914 +1239 Chittoor IND Andhra Pradesh 133462 +1240 Barrackpur IND West Bengali 133265 +1241 Bharuch (Broach) IND Gujarat 133102 +1242 Naihati IND West Bengali 132701 +1243 Shillong IND Meghalaya 131719 +1244 Sambalpur IND Orissa 131138 +1245 Junagadh IND Gujarat 130484 +1246 Rae Bareli IND Uttar Pradesh 129904 +1247 Rewa IND Madhya Pradesh 128981 +1248 Gurgaon IND Haryana 128608 +1249 Khammam IND Andhra Pradesh 127992 +1250 Bulandshahr IND Uttar Pradesh 127201 +1251 Navsari IND Gujarat 126089 +1252 Malkajgiri IND Andhra Pradesh 126066 +1253 Midnapore (Medinipur) IND West Bengali 125498 +1254 Miraj IND Maharashtra 125407 +1255 Raj Nandgaon IND Chhatisgarh 125371 +1256 Alandur IND Tamil Nadu 125244 +1257 Puri IND Orissa 125199 +1258 Navadwip IND West Bengali 125037 +1259 Sirsa IND Haryana 125000 +1260 Korba IND Chhatisgarh 124501 +1261 Faizabad IND Uttar Pradesh 124437 +1262 Etawah IND Uttar Pradesh 124072 +1263 Pathankot IND Punjab 123930 +1264 Gandhinagar IND Gujarat 123359 +1265 Palghat (Palakkad) IND Kerala 123289 +1266 Veraval IND Gujarat 123000 +1267 Hoshiarpur IND Punjab 122705 +1268 Ambala IND Haryana 122596 +1269 Sitapur IND Uttar Pradesh 121842 +1270 Bhiwani IND Haryana 121629 +1271 Cuddapah IND Andhra Pradesh 121463 +1272 Bhimavaram IND Andhra Pradesh 121314 +1273 Krishnanagar IND West Bengali 121110 +1274 Chandannagar IND West Bengali 120378 +1275 Mandya IND Karnataka 120265 +1276 Dibrugarh IND Assam 120127 +1277 Nandyal IND Andhra Pradesh 119813 +1278 Balurghat IND West Bengali 119796 +1279 Neyveli IND Tamil Nadu 118080 +1280 Fatehpur IND Uttar Pradesh 117675 +1281 Mahbubnagar IND Andhra Pradesh 116833 +1282 Budaun IND Uttar Pradesh 116695 +1283 Porbandar IND Gujarat 116671 +1284 Silchar IND Assam 115483 +1285 Berhampore (Baharampur) IND West Bengali 115144 +1286 Purnea (Purnia) IND Jharkhand 114912 +1287 Bankura IND West Bengali 114876 +1288 Rajapalaiyam IND Tamil Nadu 114202 +1289 Titagarh IND West Bengali 114085 +1290 Halisahar IND West Bengali 114028 +1291 Hathras IND Uttar Pradesh 113285 +1292 Bhir (Bid) IND Maharashtra 112434 +1293 Pallavaram IND Tamil Nadu 111866 +1294 Anand IND Gujarat 110266 +1295 Mango IND Jharkhand 110024 +1296 Santipur IND West Bengali 109956 +1297 Bhind IND Madhya Pradesh 109755 +1298 Gondiya IND Maharashtra 109470 +1299 Tiruvannamalai IND Tamil Nadu 109196 +1300 Yeotmal (Yavatmal) IND Maharashtra 108578 +1301 Kulti-Barakar IND West Bengali 108518 +1302 Moga IND Punjab 108304 +1303 Shivapuri IND Madhya Pradesh 108277 +1304 Bidar IND Karnataka 108016 +1305 Guntakal IND Andhra Pradesh 107592 +1306 Unnao IND Uttar Pradesh 107425 +1307 Barasat IND West Bengali 107365 +1308 Tambaram IND Tamil Nadu 107187 +1309 Abohar IND Punjab 107163 +1310 Pilibhit IND Uttar Pradesh 106605 +1311 Valparai IND Tamil Nadu 106523 +1312 Gonda IND Uttar Pradesh 106078 +1313 Surendranagar IND Gujarat 105973 +1314 Qutubullapur IND Andhra Pradesh 105380 +1315 Beawar IND Rajasthan 105363 +1316 Hindupur IND Andhra Pradesh 104651 +1317 Gandhidham IND Gujarat 104585 +1318 Haldwani-cum-Kathgodam IND Uttaranchal 104195 +1319 Tellicherry (Thalassery) IND Kerala 103579 +1320 Wardha IND Maharashtra 102985 +1321 Rishra IND West Bengali 102649 +1322 Bhuj IND Gujarat 102176 +1323 Modinagar IND Uttar Pradesh 101660 +1324 Gudivada IND Andhra Pradesh 101656 +1325 Basirhat IND West Bengali 101409 +1326 Uttarpara-Kotrung IND West Bengali 100867 +1327 Ongole IND Andhra Pradesh 100836 +1328 North Barrackpur IND West Bengali 100513 +1329 Guna IND Madhya Pradesh 100490 +1330 Haldia IND West Bengali 100347 +1331 Habra IND West Bengali 100223 +1332 Kanchrapara IND West Bengali 100194 +1333 Tonk IND Rajasthan 100079 +1334 Champdani IND West Bengali 98818 +1335 Orai IND Uttar Pradesh 98640 +1336 Pudukkottai IND Tamil Nadu 98619 +1337 Sasaram IND Bihar 98220 +1338 Hazaribag IND Jharkhand 97712 +1339 Palayankottai IND Tamil Nadu 97662 +1340 Banda IND Uttar Pradesh 97227 +1341 Godhra IND Gujarat 96813 +1342 Hospet IND Karnataka 96322 +1343 Ashoknagar-Kalyangarh IND West Bengali 96315 +1344 Achalpur IND Maharashtra 96216 +1345 Patan IND Gujarat 96109 +1346 Mandasor IND Madhya Pradesh 95758 +1347 Damoh IND Madhya Pradesh 95661 +1348 Satara IND Maharashtra 95133 +1349 Meerut Cantonment IND Uttar Pradesh 94876 +1350 Dehri IND Bihar 94526 +1351 Delhi Cantonment IND Delhi 94326 +1352 Chhindwara IND Madhya Pradesh 93731 +1353 Bansberia IND West Bengali 93447 +1354 Nagaon IND Assam 93350 +1355 Kanpur Cantonment IND Uttar Pradesh 93109 +1356 Vidisha IND Madhya Pradesh 92917 +1357 Bettiah IND Bihar 92583 +1358 Purulia IND Jharkhand 92574 +1359 Hassan IND Karnataka 90803 +1360 Ambala Sadar IND Haryana 90712 +1361 Baidyabati IND West Bengali 90601 +1362 Morvi IND Gujarat 90357 +1363 Raigarh IND Chhatisgarh 89166 +1364 Vejalpur IND Gujarat 89053 +1365 Baghdad IRQ Baghdad 4336000 +1366 Mosul IRQ Ninawa 879000 +1367 Irbil IRQ Irbil 485968 +1368 Kirkuk IRQ al-Tamim 418624 +1369 Basra IRQ Basra 406296 +1370 al-Sulaymaniya IRQ al-Sulaymaniya 364096 +1371 al-Najaf IRQ al-Najaf 309010 +1372 Karbala IRQ Karbala 296705 +1373 al-Hilla IRQ Babil 268834 +1374 al-Nasiriya IRQ DhiQar 265937 +1375 al-Amara IRQ Maysan 208797 +1376 al-Diwaniya IRQ al-Qadisiya 196519 +1377 al-Ramadi IRQ al-Anbar 192556 +1378 al-Kut IRQ Wasit 183183 +1379 Baquba IRQ Diyala 114516 +1380 Teheran IRN Teheran 6758845 +1381 Mashhad IRN Khorasan 1887405 +1382 Esfahan IRN Esfahan 1266072 +1383 Tabriz IRN East Azerbaidzan 1191043 +1384 Shiraz IRN Fars 1053025 +1385 Karaj IRN Teheran 940968 +1386 Ahvaz IRN Khuzestan 804980 +1387 Qom IRN Qom 777677 +1388 Kermanshah IRN Kermanshah 692986 +1389 Urmia IRN West Azerbaidzan 435200 +1390 Zahedan IRN Sistan va Baluchesta 419518 +1391 Rasht IRN Gilan 417748 +1392 Hamadan IRN Hamadan 401281 +1393 Kerman IRN Kerman 384991 +1394 Arak IRN Markazi 380755 +1395 Ardebil IRN Ardebil 340386 +1396 Yazd IRN Yazd 326776 +1397 Qazvin IRN Qazvin 291117 +1398 Zanjan IRN Zanjan 286295 +1399 Sanandaj IRN Kordestan 277808 +1400 Bandar-e-Abbas IRN Hormozgan 273578 +1401 Khorramabad IRN Lorestan 272815 +1402 Eslamshahr IRN Teheran 265450 +1403 Borujerd IRN Lorestan 217804 +1404 Abadan IRN Khuzestan 206073 +1405 Dezful IRN Khuzestan 202639 +1406 Kashan IRN Esfahan 201372 +1407 Sari IRN Mazandaran 195882 +1408 Gorgan IRN Golestan 188710 +1409 Najafabad IRN Esfahan 178498 +1410 Sabzevar IRN Khorasan 170738 +1411 Khomeynishahr IRN Esfahan 165888 +1412 Amol IRN Mazandaran 159092 +1413 Neyshabur IRN Khorasan 158847 +1414 Babol IRN Mazandaran 158346 +1415 Khoy IRN West Azerbaidzan 148944 +1416 Malayer IRN Hamadan 144373 +1417 Bushehr IRN Bushehr 143641 +1418 Qaemshahr IRN Mazandaran 143286 +1419 Qarchak IRN Teheran 142690 +1420 Qods IRN Teheran 138278 +1421 Sirjan IRN Kerman 135024 +1422 Bojnurd IRN Khorasan 134835 +1423 Maragheh IRN East Azerbaidzan 132318 +1424 Birjand IRN Khorasan 127608 +1425 Ilam IRN Ilam 126346 +1426 Bukan IRN West Azerbaidzan 120020 +1427 Masjed-e-Soleyman IRN Khuzestan 116883 +1428 Saqqez IRN Kordestan 115394 +1429 Gonbad-e Qabus IRN Mazandaran 111253 +1430 Saveh IRN Qom 111245 +1431 Mahabad IRN West Azerbaidzan 107799 +1432 Varamin IRN Teheran 107233 +1433 Andimeshk IRN Khuzestan 106923 +1434 Khorramshahr IRN Khuzestan 105636 +1435 Shahrud IRN Semnan 104765 +1436 Marv Dasht IRN Fars 103579 +1437 Zabol IRN Sistan va Baluchesta 100887 +1438 Shahr-e Kord IRN Chaharmahal va Bakht 100477 +1439 Bandar-e Anzali IRN Gilan 98500 +1440 Rafsanjan IRN Kerman 98300 +1441 Marand IRN East Azerbaidzan 96400 +1442 Torbat-e Heydariyeh IRN Khorasan 94600 +1443 Jahrom IRN Fars 94200 +1444 Semnan IRN Semnan 91045 +1445 Miandoab IRN West Azerbaidzan 90100 +1446 Qomsheh IRN Esfahan 89800 +1447 Dublin IRL Leinster 481854 +1448 Cork IRL Munster 127187 +1449 Reykjavik ISL Hofuoborgarsvaoi 109184 +1450 Jerusalem ISR Jerusalem 633700 +1451 Tel Aviv-Jaffa ISR Tel Aviv 348100 +1452 Haifa ISR Haifa 265700 +1453 Rishon Le Ziyyon ISR Ha Merkaz 188200 +1454 Beerseba ISR Ha Darom 163700 +1455 Holon ISR Tel Aviv 163100 +1456 Petah Tiqwa ISR Ha Merkaz 159400 +1457 Ashdod ISR Ha Darom 155800 +1458 Netanya ISR Ha Merkaz 154900 +1459 Bat Yam ISR Tel Aviv 137000 +1460 Bene Beraq ISR Tel Aviv 133900 +1461 Ramat Gan ISR Tel Aviv 126900 +1462 Ashqelon ISR Ha Darom 92300 +1463 Rehovot ISR Ha Merkaz 90300 +1464 Roma ITA Latium 2643581 +1465 Milano ITA Lombardia 1300977 +1466 Napoli ITA Campania 1002619 +1467 Torino ITA Piemonte 903705 +1468 Palermo ITA Sisilia 683794 +1469 Genova ITA Liguria 636104 +1470 Bologna ITA Emilia-Romagna 381161 +1471 Firenze ITA Toscana 376662 +1472 Catania ITA Sisilia 337862 +1473 Bari ITA Apulia 331848 +1474 Venezia ITA Veneto 277305 +1475 Messina ITA Sisilia 259156 +1476 Verona ITA Veneto 255268 +1477 Trieste ITA Friuli-Venezia Giuli 216459 +1478 Padova ITA Veneto 211391 +1479 Taranto ITA Apulia 208214 +1480 Brescia ITA Lombardia 191317 +1481 Reggio di Calabria ITA Calabria 179617 +1482 Modena ITA Emilia-Romagna 176022 +1483 Prato ITA Toscana 172473 +1484 Parma ITA Emilia-Romagna 168717 +1485 Cagliari ITA Sardinia 165926 +1486 Livorno ITA Toscana 161673 +1487 Perugia ITA Umbria 156673 +1488 Foggia ITA Apulia 154891 +1489 Reggio nell Emilia ITA Emilia-Romagna 143664 +1490 Salerno ITA Campania 142055 +1491 Ravenna ITA Emilia-Romagna 138418 +1492 Ferrara ITA Emilia-Romagna 132127 +1493 Rimini ITA Emilia-Romagna 131062 +1494 Syrakusa ITA Sisilia 126282 +1495 Sassari ITA Sardinia 120803 +1496 Monza ITA Lombardia 119516 +1497 Bergamo ITA Lombardia 117837 +1498 Pescara ITA Abruzzit 115698 +1499 Latina ITA Latium 114099 +1500 Vicenza ITA Veneto 109738 +1501 Terni ITA Umbria 107770 +1502 Forli ITA Emilia-Romagna 107475 +1503 Trento ITA Trentino-Alto Adige 104906 +1504 Novara ITA Piemonte 102037 +1505 Piacenza ITA Emilia-Romagna 98384 +1506 Ancona ITA Marche 98329 +1507 Lecce ITA Apulia 98208 +1508 Bolzano ITA Trentino-Alto Adige 97232 +1509 Catanzaro ITA Calabria 96700 +1510 La Spezia ITA Liguria 95504 +1511 Udine ITA Friuli-Venezia Giuli 94932 +1512 Torre del Greco ITA Campania 94505 +1513 Andria ITA Apulia 94443 +1514 Brindisi ITA Apulia 93454 +1515 Giugliano in Campania ITA Campania 93286 +1516 Pisa ITA Toscana 92379 +1517 Barletta ITA Apulia 91904 +1518 Arezzo ITA Toscana 91729 +1519 Alessandria ITA Piemonte 90289 +1520 Cesena ITA Emilia-Romagna 89852 +1521 Pesaro ITA Marche 88987 +1522 Dili TMP Dili 47900 +1523 Wien AUT Wien 1608144 +1524 Graz AUT Steiermark 240967 +1525 Linz AUT North Austria 188022 +1526 Salzburg AUT Salzburg 144247 +1527 Innsbruck AUT Tiroli 111752 +1528 Klagenfurt AUT Karnten 91141 +1529 Spanish Town JAM St. Catherine 110379 +1530 Kingston JAM St. Andrew 103962 +1531 Portmore JAM St. Andrew 99799 +1532 Tokyo JPN Tokyo-to 7980230 +1533 Jokohama [Yokohama] JPN Kanagawa 3339594 +1534 Osaka JPN Osaka 2595674 +1535 Nagoya JPN Aichi 2154376 +1536 Sapporo JPN Hokkaido 1790886 +1537 Kioto JPN Kyoto 1461974 +1538 Kobe JPN Hyogo 1425139 +1539 Fukuoka JPN Fukuoka 1308379 +1540 Kawasaki JPN Kanagawa 1217359 +1541 Hiroshima JPN Hiroshima 1119117 +1542 Kitakyushu JPN Fukuoka 1016264 +1543 Sendai JPN Miyagi 989975 +1544 Chiba JPN Chiba 863930 +1545 Sakai JPN Osaka 797735 +1546 Kumamoto JPN Kumamoto 656734 +1547 Okayama JPN Okayama 624269 +1548 Sagamihara JPN Kanagawa 586300 +1549 Hamamatsu JPN Shizuoka 568796 +1550 Kagoshima JPN Kagoshima 549977 +1551 Funabashi JPN Chiba 545299 +1552 Higashiosaka JPN Osaka 517785 +1553 Hachioji JPN Tokyo-to 513451 +1554 Niigata JPN Niigata 497464 +1555 Amagasaki JPN Hyogo 481434 +1556 Himeji JPN Hyogo 475167 +1557 Shizuoka JPN Shizuoka 473854 +1558 Urawa JPN Saitama 469675 +1559 Matsuyama JPN Ehime 466133 +1560 Matsudo JPN Chiba 461126 +1561 Kanazawa JPN Ishikawa 455386 +1562 Kawaguchi JPN Saitama 452155 +1563 Ichikawa JPN Chiba 441893 +1564 Omiya JPN Saitama 441649 +1565 Utsunomiya JPN Tochigi 440353 +1566 Oita JPN Oita 433401 +1567 Nagasaki JPN Nagasaki 432759 +1568 Yokosuka JPN Kanagawa 430200 +1569 Kurashiki JPN Okayama 425103 +1570 Gifu JPN Gifu 408007 +1571 Hirakata JPN Osaka 403151 +1572 Nishinomiya JPN Hyogo 397618 +1573 Toyonaka JPN Osaka 396689 +1574 Wakayama JPN Wakayama 391233 +1575 Fukuyama JPN Hiroshima 376921 +1576 Fujisawa JPN Kanagawa 372840 +1577 Asahikawa JPN Hokkaido 364813 +1578 Machida JPN Tokyo-to 364197 +1579 Nara JPN Nara 362812 +1580 Takatsuki JPN Osaka 361747 +1581 Iwaki JPN Fukushima 361737 +1582 Nagano JPN Nagano 361391 +1583 Toyohashi JPN Aichi 360066 +1584 Toyota JPN Aichi 346090 +1585 Suita JPN Osaka 345750 +1586 Takamatsu JPN Kagawa 332471 +1587 Koriyama JPN Fukushima 330335 +1588 Okazaki JPN Aichi 328711 +1589 Kawagoe JPN Saitama 327211 +1590 Tokorozawa JPN Saitama 325809 +1591 Toyama JPN Toyama 325790 +1592 Kochi JPN Kochi 324710 +1593 Kashiwa JPN Chiba 320296 +1594 Akita JPN Akita 314440 +1595 Miyazaki JPN Miyazaki 303784 +1596 Koshigaya JPN Saitama 301446 +1597 Naha JPN Okinawa 299851 +1598 Aomori JPN Aomori 295969 +1599 Hakodate JPN Hokkaido 294788 +1600 Akashi JPN Hyogo 292253 +1601 Yokkaichi JPN Mie 288173 +1602 Fukushima JPN Fukushima 287525 +1603 Morioka JPN Iwate 287353 +1604 Maebashi JPN Gumma 284473 +1605 Kasugai JPN Aichi 282348 +1606 Otsu JPN Shiga 282070 +1607 Ichihara JPN Chiba 279280 +1608 Yao JPN Osaka 276421 +1609 Ichinomiya JPN Aichi 270828 +1610 Tokushima JPN Tokushima 269649 +1611 Kakogawa JPN Hyogo 266281 +1612 Ibaraki JPN Osaka 261020 +1613 Neyagawa JPN Osaka 257315 +1614 Shimonoseki JPN Yamaguchi 257263 +1615 Yamagata JPN Yamagata 255617 +1616 Fukui JPN Fukui 254818 +1617 Hiratsuka JPN Kanagawa 254207 +1618 Mito JPN Ibaragi 246559 +1619 Sasebo JPN Nagasaki 244240 +1620 Hachinohe JPN Aomori 242979 +1621 Takasaki JPN Gumma 239124 +1622 Shimizu JPN Shizuoka 239123 +1623 Kurume JPN Fukuoka 235611 +1624 Fuji JPN Shizuoka 231527 +1625 Soka JPN Saitama 222768 +1626 Fuchu JPN Tokyo-to 220576 +1627 Chigasaki JPN Kanagawa 216015 +1628 Atsugi JPN Kanagawa 212407 +1629 Numazu JPN Shizuoka 211382 +1630 Ageo JPN Saitama 209442 +1631 Yamato JPN Kanagawa 208234 +1632 Matsumoto JPN Nagano 206801 +1633 Kure JPN Hiroshima 206504 +1634 Takarazuka JPN Hyogo 205993 +1635 Kasukabe JPN Saitama 201838 +1636 Chofu JPN Tokyo-to 201585 +1637 Odawara JPN Kanagawa 200171 +1638 Kofu JPN Yamanashi 199753 +1639 Kushiro JPN Hokkaido 197608 +1640 Kishiwada JPN Osaka 197276 +1641 Hitachi JPN Ibaragi 196622 +1642 Nagaoka JPN Niigata 192407 +1643 Itami JPN Hyogo 190886 +1644 Uji JPN Kyoto 188735 +1645 Suzuka JPN Mie 184061 +1646 Hirosaki JPN Aomori 177522 +1647 Ube JPN Yamaguchi 175206 +1648 Kodaira JPN Tokyo-to 174984 +1649 Takaoka JPN Toyama 174380 +1650 Obihiro JPN Hokkaido 173685 +1651 Tomakomai JPN Hokkaido 171958 +1652 Saga JPN Saga 170034 +1653 Sakura JPN Chiba 168072 +1654 Kamakura JPN Kanagawa 167661 +1655 Mitaka JPN Tokyo-to 167268 +1656 Izumi JPN Osaka 166979 +1657 Hino JPN Tokyo-to 166770 +1658 Hadano JPN Kanagawa 166512 +1659 Ashikaga JPN Tochigi 165243 +1660 Tsu JPN Mie 164543 +1661 Sayama JPN Saitama 162472 +1662 Yachiyo JPN Chiba 161222 +1663 Tsukuba JPN Ibaragi 160768 +1664 Tachikawa JPN Tokyo-to 159430 +1665 Kumagaya JPN Saitama 157171 +1666 Moriguchi JPN Osaka 155941 +1667 Otaru JPN Hokkaido 155784 +1668 Anjo JPN Aichi 153823 +1669 Narashino JPN Chiba 152849 +1670 Oyama JPN Tochigi 152820 +1671 Ogaki JPN Gifu 151758 +1672 Matsue JPN Shimane 149821 +1673 Kawanishi JPN Hyogo 149794 +1674 Hitachinaka JPN Tokyo-to 148006 +1675 Niiza JPN Saitama 147744 +1676 Nagareyama JPN Chiba 147738 +1677 Tottori JPN Tottori 147523 +1678 Tama JPN Ibaragi 146712 +1679 Iruma JPN Saitama 145922 +1680 Ota JPN Gumma 145317 +1681 Omuta JPN Fukuoka 142889 +1682 Komaki JPN Aichi 139827 +1683 Ome JPN Tokyo-to 139216 +1684 Kadoma JPN Osaka 138953 +1685 Yamaguchi JPN Yamaguchi 138210 +1686 Higashimurayama JPN Tokyo-to 136970 +1687 Yonago JPN Tottori 136461 +1688 Matsubara JPN Osaka 135010 +1689 Musashino JPN Tokyo-to 134426 +1690 Tsuchiura JPN Ibaragi 134072 +1691 Joetsu JPN Niigata 133505 +1692 Miyakonojo JPN Miyazaki 133183 +1693 Misato JPN Saitama 132957 +1694 Kakamigahara JPN Gifu 131831 +1695 Daito JPN Osaka 130594 +1696 Seto JPN Aichi 130470 +1697 Kariya JPN Aichi 127969 +1698 Urayasu JPN Chiba 127550 +1699 Beppu JPN Oita 127486 +1700 Niihama JPN Ehime 127207 +1701 Minoo JPN Osaka 127026 +1702 Fujieda JPN Shizuoka 126897 +1703 Abiko JPN Chiba 126670 +1704 Nobeoka JPN Miyazaki 125547 +1705 Tondabayashi JPN Osaka 125094 +1706 Ueda JPN Nagano 124217 +1707 Kashihara JPN Nara 124013 +1708 Matsusaka JPN Mie 123582 +1709 Isesaki JPN Gumma 123285 +1710 Zama JPN Kanagawa 122046 +1711 Kisarazu JPN Chiba 121967 +1712 Noda JPN Chiba 121030 +1713 Ishinomaki JPN Miyagi 120963 +1714 Fujinomiya JPN Shizuoka 119714 +1715 Kawachinagano JPN Osaka 119666 +1716 Imabari JPN Ehime 119357 +1717 Aizuwakamatsu JPN Fukushima 119287 +1718 Higashihiroshima JPN Hiroshima 119166 +1719 Habikino JPN Osaka 118968 +1720 Ebetsu JPN Hokkaido 118805 +1721 Hofu JPN Yamaguchi 118751 +1722 Kiryu JPN Gumma 118326 +1723 Okinawa JPN Okinawa 117748 +1724 Yaizu JPN Shizuoka 117258 +1725 Toyokawa JPN Aichi 115781 +1726 Ebina JPN Kanagawa 115571 +1727 Asaka JPN Saitama 114815 +1728 Higashikurume JPN Tokyo-to 111666 +1729 Ikoma JPN Nara 111645 +1730 Kitami JPN Hokkaido 111295 +1731 Koganei JPN Tokyo-to 110969 +1732 Iwatsuki JPN Saitama 110034 +1733 Mishima JPN Shizuoka 109699 +1734 Handa JPN Aichi 108600 +1735 Muroran JPN Hokkaido 108275 +1736 Komatsu JPN Ishikawa 107937 +1737 Yatsushiro JPN Kumamoto 107661 +1738 Iida JPN Nagano 107583 +1739 Tokuyama JPN Yamaguchi 107078 +1740 Kokubunji JPN Tokyo-to 106996 +1741 Akishima JPN Tokyo-to 106914 +1742 Iwakuni JPN Yamaguchi 106647 +1743 Kusatsu JPN Shiga 106232 +1744 Kuwana JPN Mie 106121 +1745 Sanda JPN Hyogo 105643 +1746 Hikone JPN Shiga 105508 +1747 Toda JPN Saitama 103969 +1748 Tajimi JPN Gifu 103171 +1749 Ikeda JPN Osaka 102710 +1750 Fukaya JPN Saitama 102156 +1751 Ise JPN Mie 101732 +1752 Sakata JPN Yamagata 101651 +1753 Kasuga JPN Fukuoka 101344 +1754 Kamagaya JPN Chiba 100821 +1755 Tsuruoka JPN Yamagata 100713 +1756 Hoya JPN Tokyo-to 100313 +1757 Nishio JPN Chiba 100032 +1758 Tokai JPN Aichi 99738 +1759 Inazawa JPN Aichi 98746 +1760 Sakado JPN Saitama 98221 +1761 Isehara JPN Kanagawa 98123 +1762 Takasago JPN Hyogo 97632 +1763 Fujimi JPN Saitama 96972 +1764 Urasoe JPN Okinawa 96002 +1765 Yonezawa JPN Yamagata 95592 +1766 Konan JPN Aichi 95521 +1767 Yamatokoriyama JPN Nara 95165 +1768 Maizuru JPN Kyoto 94784 +1769 Onomichi JPN Hiroshima 93756 +1770 Higashimatsuyama JPN Saitama 93342 +1771 Kimitsu JPN Chiba 93216 +1772 Isahaya JPN Nagasaki 93058 +1773 Kanuma JPN Tochigi 93053 +1774 Izumisano JPN Osaka 92583 +1775 Kameoka JPN Kyoto 92398 +1776 Mobara JPN Chiba 91664 +1777 Narita JPN Chiba 91470 +1778 Kashiwazaki JPN Niigata 91229 +1779 Tsuyama JPN Okayama 91170 +1780 Sanaa YEM Sanaa 503600 +1781 Aden YEM Aden 398300 +1782 Taizz YEM Taizz 317600 +1783 Hodeida YEM Hodeida 298500 +1784 al-Mukalla YEM Hadramawt 122400 +1785 Ibb YEM Ibb 103300 +1786 Amman JOR Amman 1000000 +1787 al-Zarqa JOR al-Zarqa 389815 +1788 Irbid JOR Irbid 231511 +1789 al-Rusayfa JOR al-Zarqa 137247 +1790 Wadi al-Sir JOR Amman 89104 +1791 Flying Fish Cove CXR A 700 +1792 Beograd YUG Central Serbia 1204000 +1793 Novi Sad YUG Vojvodina 179626 +1794 Nid YUG Central Serbia 175391 +1795 Pridtina YUG Kosovo and Metohija 155496 +1796 Kragujevac YUG Central Serbia 147305 +1797 Podgorica YUG Montenegro 135000 +1798 Subotica YUG Vojvodina 100386 +1799 Prizren YUG Kosovo and Metohija 92303 +1800 Phnom Penh KHM Phnom Penh 570155 +1801 Battambang KHM Battambang 129800 +1802 Siem Reap KHM Siem Reap 105100 +1803 Douala CMR Littoral 1448300 +1804 Yaounde CMR Centre 1372800 +1805 Garoua CMR Nord 177000 +1806 Maroua CMR Extreme-Nord 143000 +1807 Bamenda CMR Nord-Ouest 138000 +1808 Bafoussam CMR Ouest 131000 +1809 Nkongsamba CMR Littoral 112454 +1810 Montreal CAN Quebec 1016376 +1811 Calgary CAN Alberta 768082 +1812 Toronto CAN Ontario 688275 +1813 North York CAN Ontario 622632 +1814 Winnipeg CAN Manitoba 618477 +1815 Edmonton CAN Alberta 616306 +1816 Mississauga CAN Ontario 608072 +1817 Scarborough CAN Ontario 594501 +1818 Vancouver CAN British Colombia 514008 +1819 Etobicoke CAN Ontario 348845 +1820 London CAN Ontario 339917 +1821 Hamilton CAN Ontario 335614 +1822 Ottawa CAN Ontario 335277 +1823 Laval CAN Quebec 330393 +1824 Surrey CAN British Colombia 304477 +1825 Brampton CAN Ontario 296711 +1826 Windsor CAN Ontario 207588 +1827 Saskatoon CAN Saskatchewan 193647 +1828 Kitchener CAN Ontario 189959 +1829 Markham CAN Ontario 189098 +1830 Regina CAN Saskatchewan 180400 +1831 Burnaby CAN British Colombia 179209 +1832 Quebec CAN Quebec 167264 +1833 York CAN Ontario 154980 +1834 Richmond CAN British Colombia 148867 +1835 Vaughan CAN Ontario 147889 +1836 Burlington CAN Ontario 145150 +1837 Oshawa CAN Ontario 140173 +1838 Oakville CAN Ontario 139192 +1839 Saint Catharines CAN Ontario 136216 +1840 Longueuil CAN Quebec 127977 +1841 Richmond Hill CAN Ontario 116428 +1842 Thunder Bay CAN Ontario 115913 +1843 Nepean CAN Ontario 115100 +1844 Cape Breton CAN Nova Scotia 114733 +1845 East York CAN Ontario 114034 +1846 Halifax CAN Nova Scotia 113910 +1847 Cambridge CAN Ontario 109186 +1848 Gloucester CAN Ontario 107314 +1849 Abbotsford CAN British Colombia 105403 +1850 Guelph CAN Ontario 103593 +1851 Saint Johns CAN Newfoundland 101936 +1852 Coquitlam CAN British Colombia 101820 +1853 Saanich CAN British Colombia 101388 +1854 Gatineau CAN Quebec 100702 +1855 Delta CAN British Colombia 95411 +1856 Sudbury CAN Ontario 92686 +1857 Kelowna CAN British Colombia 89442 +1858 Barrie CAN Ontario 89269 +1859 Praia CPV Sao Tiago 94800 +1860 Almaty KAZ Almaty Qalasy 1129400 +1861 Qaraghandy KAZ Qaraghandy 436900 +1862 Shymkent KAZ South Kazakstan 360100 +1863 Taraz KAZ Taraz 330100 +1864 Astana KAZ Astana 311200 +1865 Oskemen KAZ East Kazakstan 311000 +1866 Pavlodar KAZ Pavlodar 300500 +1867 Semey KAZ East Kazakstan 269600 +1868 Aqtobe KAZ Aqtobe 253100 +1869 Qostanay KAZ Qostanay 221400 +1870 Petropavl KAZ North Kazakstan 203500 +1871 Oral KAZ West Kazakstan 195500 +1872 Temirtau KAZ Qaraghandy 170500 +1873 Qyzylorda KAZ Qyzylorda 157400 +1874 Aqtau KAZ Mangghystau 143400 +1875 Atyrau KAZ Atyrau 142500 +1876 Ekibastuz KAZ Pavlodar 127200 +1877 Kokshetau KAZ North Kazakstan 123400 +1878 Rudnyy KAZ Qostanay 109500 +1879 Taldyqorghan KAZ Almaty 98000 +1880 Zhezqazghan KAZ Qaraghandy 90000 +1881 Nairobi KEN Nairobi 2290000 +1882 Mombasa KEN Coast 461753 +1883 Kisumu KEN Nyanza 192733 +1884 Nakuru KEN Rift Valley 163927 +1885 Machakos KEN Eastern 116293 +1886 Eldoret KEN Rift Valley 111882 +1887 Meru KEN Eastern 94947 +1888 Nyeri KEN Central 91258 +1889 Bangui CAF Bangui 524000 +1890 Shanghai CHN Shanghai 9696300 +1891 Peking CHN Peking 7472000 +1892 Chongqing CHN Chongqing 6351600 +1893 Tianjin CHN Tianjin 5286800 +1894 Wuhan CHN Hubei 4344600 +1895 Harbin CHN Heilongjiang 4289800 +1896 Shenyang CHN Liaoning 4265200 +1897 Kanton [Guangzhou] CHN Guangdong 4256300 +1898 Chengdu CHN Sichuan 3361500 +1899 Nanking [Nanjing] CHN Jiangsu 2870300 +1900 Changchun CHN Jilin 2812000 +1901 Xian CHN Shaanxi 2761400 +1902 Dalian CHN Liaoning 2697000 +1903 Qingdao CHN Shandong 2596000 +1904 Jinan CHN Shandong 2278100 +1905 Hangzhou CHN Zhejiang 2190500 +1906 Zhengzhou CHN Henan 2107200 +1907 Shijiazhuang CHN Hebei 2041500 +1908 Taiyuan CHN Shanxi 1968400 +1909 Kunming CHN Yunnan 1829500 +1910 Changsha CHN Hunan 1809800 +1911 Nanchang CHN Jiangxi 1691600 +1912 Fuzhou CHN Fujian 1593800 +1913 Lanzhou CHN Gansu 1565800 +1914 Guiyang CHN Guizhou 1465200 +1915 Ningbo CHN Zhejiang 1371200 +1916 Hefei CHN Anhui 1369100 +1917 Urumtdi [Urumqi] CHN Xinxiang 1310100 +1918 Anshan CHN Liaoning 1200000 +1919 Fushun CHN Liaoning 1200000 +1920 Nanning CHN Guangxi 1161800 +1921 Zibo CHN Shandong 1140000 +1922 Qiqihar CHN Heilongjiang 1070000 +1923 Jilin CHN Jilin 1040000 +1924 Tangshan CHN Hebei 1040000 +1925 Baotou CHN Inner Mongolia 980000 +1926 Shenzhen CHN Guangdong 950500 +1927 Hohhot CHN Inner Mongolia 916700 +1928 Handan CHN Hebei 840000 +1929 Wuxi CHN Jiangsu 830000 +1930 Xuzhou CHN Jiangsu 810000 +1931 Datong CHN Shanxi 800000 +1932 Yichun CHN Heilongjiang 800000 +1933 Benxi CHN Liaoning 770000 +1934 Luoyang CHN Henan 760000 +1935 Suzhou CHN Jiangsu 710000 +1936 Xining CHN Qinghai 700200 +1937 Huainan CHN Anhui 700000 +1938 Jixi CHN Heilongjiang 683885 +1939 Daqing CHN Heilongjiang 660000 +1940 Fuxin CHN Liaoning 640000 +1941 Amoy [Xiamen] CHN Fujian 627500 +1942 Liuzhou CHN Guangxi 610000 +1943 Shantou CHN Guangdong 580000 +1944 Jinzhou CHN Liaoning 570000 +1945 Mudanjiang CHN Heilongjiang 570000 +1946 Yinchuan CHN Ningxia 544500 +1947 Changzhou CHN Jiangsu 530000 +1948 Zhangjiakou CHN Hebei 530000 +1949 Dandong CHN Liaoning 520000 +1950 Hegang CHN Heilongjiang 520000 +1951 Kaifeng CHN Henan 510000 +1952 Jiamusi CHN Heilongjiang 493409 +1953 Liaoyang CHN Liaoning 492559 +1954 Hengyang CHN Hunan 487148 +1955 Baoding CHN Hebei 483155 +1956 Hunjiang CHN Jilin 482043 +1957 Xinxiang CHN Henan 473762 +1958 Huangshi CHN Hubei 457601 +1959 Haikou CHN Hainan 454300 +1960 Yantai CHN Shandong 452127 +1961 Bengbu CHN Anhui 449245 +1962 Xiangtan CHN Hunan 441968 +1963 Weifang CHN Shandong 428522 +1964 Wuhu CHN Anhui 425740 +1965 Pingxiang CHN Jiangxi 425579 +1966 Yingkou CHN Liaoning 421589 +1967 Anyang CHN Henan 420332 +1968 Panzhihua CHN Sichuan 415466 +1969 Pingdingshan CHN Henan 410775 +1970 Xiangfan CHN Hubei 410407 +1971 Zhuzhou CHN Hunan 409924 +1972 Jiaozuo CHN Henan 409100 +1973 Wenzhou CHN Zhejiang 401871 +1974 Zhangjiang CHN Guangdong 400997 +1975 Zigong CHN Sichuan 393184 +1976 Shuangyashan CHN Heilongjiang 386081 +1977 Zaozhuang CHN Shandong 380846 +1978 Yakeshi CHN Inner Mongolia 377869 +1979 Yichang CHN Hubei 371601 +1980 Zhenjiang CHN Jiangsu 368316 +1981 Huaibei CHN Anhui 366549 +1982 Qinhuangdao CHN Hebei 364972 +1983 Guilin CHN Guangxi 364130 +1984 Liupanshui CHN Guizhou 363954 +1985 Panjin CHN Liaoning 362773 +1986 Yangquan CHN Shanxi 362268 +1987 Jinxi CHN Liaoning 357052 +1988 Liaoyuan CHN Jilin 354141 +1989 Lianyungang CHN Jiangsu 354139 +1990 Xianyang CHN Shaanxi 352125 +1991 Taian CHN Shandong 350696 +1992 Chifeng CHN Inner Mongolia 350077 +1993 Shaoguan CHN Guangdong 350043 +1994 Nantong CHN Jiangsu 343341 +1995 Leshan CHN Sichuan 341128 +1996 Baoji CHN Shaanxi 337765 +1997 Linyi CHN Shandong 324720 +1998 Tonghua CHN Jilin 324600 +1999 Siping CHN Jilin 317223 +2000 Changzhi CHN Shanxi 317144 +2001 Tengzhou CHN Shandong 315083 +2002 Chaozhou CHN Guangdong 313469 +2003 Yangzhou CHN Jiangsu 312892 +2004 Dongwan CHN Guangdong 308669 +2005 Maanshan CHN Anhui 305421 +2006 Foshan CHN Guangdong 303160 +2007 Yueyang CHN Hunan 302800 +2008 Xingtai CHN Hebei 302789 +2009 Changde CHN Hunan 301276 +2010 Shihezi CHN Xinxiang 299676 +2011 Yancheng CHN Jiangsu 296831 +2012 Jiujiang CHN Jiangxi 291187 +2013 Dongying CHN Shandong 281728 +2014 Shashi CHN Hubei 281352 +2015 Xintai CHN Shandong 281248 +2016 Jingdezhen CHN Jiangxi 281183 +2017 Tongchuan CHN Shaanxi 280657 +2018 Zhongshan CHN Guangdong 278829 +2019 Shiyan CHN Hubei 273786 +2020 Tieli CHN Heilongjiang 265683 +2021 Jining CHN Shandong 265248 +2022 Wuhai CHN Inner Mongolia 264081 +2023 Mianyang CHN Sichuan 262947 +2024 Luzhou CHN Sichuan 262892 +2025 Zunyi CHN Guizhou 261862 +2026 Shizuishan CHN Ningxia 257862 +2027 Neijiang CHN Sichuan 256012 +2028 Tongliao CHN Inner Mongolia 255129 +2029 Tieling CHN Liaoning 254842 +2030 Wafangdian CHN Liaoning 251733 +2031 Anqing CHN Anhui 250718 +2032 Shaoyang CHN Hunan 247227 +2033 Laiwu CHN Shandong 246833 +2034 Chengde CHN Hebei 246799 +2035 Tianshui CHN Gansu 244974 +2036 Nanyang CHN Henan 243303 +2037 Cangzhou CHN Hebei 242708 +2038 Yibin CHN Sichuan 241019 +2039 Huaiyin CHN Jiangsu 239675 +2040 Dunhua CHN Jilin 235100 +2041 Yanji CHN Jilin 230892 +2042 Jiangmen CHN Guangdong 230587 +2043 Tongling CHN Anhui 228017 +2044 Suihua CHN Heilongjiang 227881 +2045 Gongziling CHN Jilin 226569 +2046 Xiantao CHN Hubei 222884 +2047 Chaoyang CHN Liaoning 222394 +2048 Ganzhou CHN Jiangxi 220129 +2049 Huzhou CHN Zhejiang 218071 +2050 Baicheng CHN Jilin 217987 +2051 Shangzi CHN Heilongjiang 215373 +2052 Yangjiang CHN Guangdong 215196 +2053 Qitaihe CHN Heilongjiang 214957 +2054 Gejiu CHN Yunnan 214294 +2055 Jiangyin CHN Jiangsu 213659 +2056 Hebi CHN Henan 212976 +2057 Jiaxing CHN Zhejiang 211526 +2058 Wuzhou CHN Guangxi 210452 +2059 Meihekou CHN Jilin 209038 +2060 Xuchang CHN Henan 208815 +2061 Liaocheng CHN Shandong 207844 +2062 Haicheng CHN Liaoning 205560 +2063 Qianjiang CHN Hubei 205504 +2064 Baiyin CHN Gansu 204970 +2065 Beian CHN Heilongjiang 204899 +2066 Yixing CHN Jiangsu 200824 +2067 Laizhou CHN Shandong 198664 +2068 Qaramay CHN Xinxiang 197602 +2069 Acheng CHN Heilongjiang 197595 +2070 Dezhou CHN Shandong 195485 +2071 Nanping CHN Fujian 195064 +2072 Zhaoqing CHN Guangdong 194784 +2073 Beipiao CHN Liaoning 194301 +2074 Fengcheng CHN Jiangxi 193784 +2075 Fuyu CHN Jilin 192981 +2076 Xinyang CHN Henan 192509 +2077 Dongtai CHN Jiangsu 192247 +2078 Yuci CHN Shanxi 191356 +2079 Honghu CHN Hubei 190772 +2080 Ezhou CHN Hubei 190123 +2081 Heze CHN Shandong 189293 +2082 Daxian CHN Sichuan 188101 +2083 Linfen CHN Shanxi 187309 +2084 Tianmen CHN Hubei 186332 +2085 Yiyang CHN Hunan 185818 +2086 Quanzhou CHN Fujian 185154 +2087 Rizhao CHN Shandong 185048 +2088 Deyang CHN Sichuan 182488 +2089 Guangyuan CHN Sichuan 182241 +2090 Changshu CHN Jiangsu 181805 +2091 Zhangzhou CHN Fujian 181424 +2092 Hailar CHN Inner Mongolia 180650 +2093 Nanchong CHN Sichuan 180273 +2094 Jiutai CHN Jilin 180130 +2095 Zhaodong CHN Heilongjiang 179976 +2096 Shaoxing CHN Zhejiang 179818 +2097 Fuyang CHN Anhui 179572 +2098 Maoming CHN Guangdong 178683 +2099 Qujing CHN Yunnan 178669 +2100 Ghulja CHN Xinxiang 177193 +2101 Jiaohe CHN Jilin 176367 +2102 Puyang CHN Henan 175988 +2103 Huadian CHN Jilin 175873 +2104 Jiangyou CHN Sichuan 175753 +2105 Qashqar CHN Xinxiang 174570 +2106 Anshun CHN Guizhou 174142 +2107 Fuling CHN Sichuan 173878 +2108 Xinyu CHN Jiangxi 173524 +2109 Hanzhong CHN Shaanxi 169930 +2110 Danyang CHN Jiangsu 169603 +2111 Chenzhou CHN Hunan 169400 +2112 Xiaogan CHN Hubei 166280 +2113 Shangqiu CHN Henan 164880 +2114 Zhuhai CHN Guangdong 164747 +2115 Qingyuan CHN Guangdong 164641 +2116 Aqsu CHN Xinxiang 164092 +2117 Jining CHN Inner Mongolia 163552 +2118 Xiaoshan CHN Zhejiang 162930 +2119 Zaoyang CHN Hubei 162198 +2120 Xinghua CHN Jiangsu 161910 +2121 Hami CHN Xinxiang 161315 +2122 Huizhou CHN Guangdong 161023 +2123 Jinmen CHN Hubei 160794 +2124 Sanming CHN Fujian 160691 +2125 Ulanhot CHN Inner Mongolia 159538 +2126 Korla CHN Xinxiang 159344 +2127 Wanxian CHN Sichuan 156823 +2128 Ruian CHN Zhejiang 156468 +2129 Zhoushan CHN Zhejiang 156317 +2130 Liangcheng CHN Shandong 156307 +2131 Jiaozhou CHN Shandong 153364 +2132 Taizhou CHN Jiangsu 152442 +2133 Suzhou CHN Anhui 151862 +2134 Yichun CHN Jiangxi 151585 +2135 Taonan CHN Jilin 150168 +2136 Pingdu CHN Shandong 150123 +2137 Jian CHN Jiangxi 148583 +2138 Longkou CHN Shandong 148362 +2139 Langfang CHN Hebei 148105 +2140 Zhoukou CHN Henan 146288 +2141 Suining CHN Sichuan 146086 +2142 Yulin CHN Guangxi 144467 +2143 Jinhua CHN Zhejiang 144280 +2144 Liuan CHN Anhui 144248 +2145 Shuangcheng CHN Heilongjiang 142659 +2146 Suizhou CHN Hubei 142302 +2147 Ankang CHN Shaanxi 142170 +2148 Weinan CHN Shaanxi 140169 +2149 Longjing CHN Jilin 139417 +2150 Daan CHN Jilin 138963 +2151 Lengshuijiang CHN Hunan 137994 +2152 Laiyang CHN Shandong 137080 +2153 Xianning CHN Hubei 136811 +2154 Dali CHN Yunnan 136554 +2155 Anda CHN Heilongjiang 136446 +2156 Jincheng CHN Shanxi 136396 +2157 Longyan CHN Fujian 134481 +2158 Xichang CHN Sichuan 134419 +2159 Wendeng CHN Shandong 133910 +2160 Hailun CHN Heilongjiang 133565 +2161 Binzhou CHN Shandong 133555 +2162 Linhe CHN Inner Mongolia 133183 +2163 Wuwei CHN Gansu 133101 +2164 Duyun CHN Guizhou 132971 +2165 Mishan CHN Heilongjiang 132744 +2166 Shangrao CHN Jiangxi 132455 +2167 Changji CHN Xinxiang 132260 +2168 Meixian CHN Guangdong 132156 +2169 Yushu CHN Jilin 131861 +2170 Tiefa CHN Liaoning 131807 +2171 Huaian CHN Jiangsu 131149 +2172 Leiyang CHN Hunan 130115 +2173 Zalantun CHN Inner Mongolia 130031 +2174 Weihai CHN Shandong 128888 +2175 Loudi CHN Hunan 128418 +2176 Qingzhou CHN Shandong 128258 +2177 Qidong CHN Jiangsu 126872 +2178 Huaihua CHN Hunan 126785 +2179 Luohe CHN Henan 126438 +2180 Chuzhou CHN Anhui 125341 +2181 Kaiyuan CHN Liaoning 124219 +2182 Linqing CHN Shandong 123958 +2183 Chaohu CHN Anhui 123676 +2184 Laohekou CHN Hubei 123366 +2185 Dujiangyan CHN Sichuan 123357 +2186 Zhumadian CHN Henan 123232 +2187 Linchuan CHN Jiangxi 121949 +2188 Jiaonan CHN Shandong 121397 +2189 Sanmenxia CHN Henan 120523 +2190 Heyuan CHN Guangdong 120101 +2191 Manzhouli CHN Inner Mongolia 120023 +2192 Lhasa CHN Tibet 120000 +2193 Lianyuan CHN Hunan 118858 +2194 Kuytun CHN Xinxiang 118553 +2195 Puqi CHN Hubei 117264 +2196 Hongjiang CHN Hunan 116188 +2197 Qinzhou CHN Guangxi 114586 +2198 Renqiu CHN Hebei 114256 +2199 Yuyao CHN Zhejiang 114065 +2200 Guigang CHN Guangxi 114025 +2201 Kaili CHN Guizhou 113958 +2202 Yanan CHN Shaanxi 113277 +2203 Beihai CHN Guangxi 112673 +2204 Xuangzhou CHN Anhui 112673 +2205 Quzhou CHN Zhejiang 112373 +2206 Yongan CHN Fujian 111762 +2207 Zixing CHN Hunan 110048 +2208 Liyang CHN Jiangsu 109520 +2209 Yizheng CHN Jiangsu 109268 +2210 Yumen CHN Gansu 109234 +2211 Liling CHN Hunan 108504 +2212 Yuncheng CHN Shanxi 108359 +2213 Shanwei CHN Guangdong 107847 +2214 Cixi CHN Zhejiang 107329 +2215 Yuanjiang CHN Hunan 107004 +2216 Bozhou CHN Anhui 106346 +2217 Jinchang CHN Gansu 105287 +2218 Fuan CHN Fujian 105265 +2219 Suqian CHN Jiangsu 105021 +2220 Shishou CHN Hubei 104571 +2221 Hengshui CHN Hebei 104269 +2222 Danjiangkou CHN Hubei 103211 +2223 Fujin CHN Heilongjiang 103104 +2224 Sanya CHN Hainan 102820 +2225 Guangshui CHN Hubei 102770 +2226 Huangshan CHN Anhui 102628 +2227 Xingcheng CHN Liaoning 102384 +2228 Zhucheng CHN Shandong 102134 +2229 Kunshan CHN Jiangsu 102052 +2230 Haining CHN Zhejiang 100478 +2231 Pingliang CHN Gansu 99265 +2232 Fuqing CHN Fujian 99193 +2233 Xinzhou CHN Shanxi 98667 +2234 Jieyang CHN Guangdong 98531 +2235 Zhangjiagang CHN Jiangsu 97994 +2236 Tong Xian CHN Peking 97168 +2237 Yaan CHN Sichuan 95900 +2238 Jinzhou CHN Liaoning 95761 +2239 Emeishan CHN Sichuan 94000 +2240 Enshi CHN Hubei 93056 +2241 Bose CHN Guangxi 93009 +2242 Yuzhou CHN Henan 92889 +2243 Kaiyuan CHN Yunnan 91999 +2244 Tumen CHN Jilin 91471 +2245 Putian CHN Fujian 91030 +2246 Linhai CHN Zhejiang 90870 +2247 Xilin Hot CHN Inner Mongolia 90646 +2248 Shaowu CHN Fujian 90286 +2249 Junan CHN Shandong 90222 +2250 Huaying CHN Sichuan 89400 +2251 Pingyi CHN Shandong 89373 +2252 Huangyan CHN Zhejiang 89288 +2253 Bishkek KGZ Bishkek shaary 589400 +2254 Osh KGZ Osh 222700 +2255 Bikenibeu KIR South Tarawa 5055 +2256 Bairiki KIR South Tarawa 2226 +2257 Santafe de Bogota COL Santafe de Bogota 6260862 +2258 Cali COL Valle 2077386 +2259 Medellin COL Antioquia 1861265 +2260 Barranquilla COL Atlantico 1223260 +2261 Cartagena COL Bolivar 805757 +2262 Cucuta COL Norte de Santander 606932 +2263 Bucaramanga COL Santander 515555 +2264 Ibague COL Tolima 393664 +2265 Pereira COL Risaralda 381725 +2266 Santa Marta COL Magdalena 359147 +2267 Manizales COL Caldas 337580 +2268 Bello COL Antioquia 333470 +2269 Pasto COL Nariao 332396 +2270 Neiva COL Huila 300052 +2271 Soledad COL Atlantico 295058 +2272 Armenia COL Quindio 288977 +2273 Villavicencio COL Meta 273140 +2274 Soacha COL Cundinamarca 272058 +2275 Valledupar COL Cesar 263247 +2276 Monteria COL Cordoba 248245 +2277 Itagui COL Antioquia 228985 +2278 Palmira COL Valle 226509 +2279 Buenaventura COL Valle 224336 +2280 Floridablanca COL Santander 221913 +2281 Sincelejo COL Sucre 220704 +2282 Popayan COL Cauca 200719 +2283 Barrancabermeja COL Santander 178020 +2284 Dos Quebradas COL Risaralda 159363 +2285 Tulua COL Valle 152488 +2286 Envigado COL Antioquia 135848 +2287 Cartago COL Valle 125884 +2288 Girardot COL Cundinamarca 110963 +2289 Buga COL Valle 110699 +2290 Tunja COL Boyaca 109740 +2291 Florencia COL Caqueta 108574 +2292 Maicao COL La Guajira 108053 +2293 Sogamoso COL Boyaca 107728 +2294 Giron COL Santander 90688 +2295 Moroni COM Njazidja 36000 +2296 Brazzaville COG Brazzaville 950000 +2297 Pointe-Noire COG Kouilou 500000 +2298 Kinshasa COD Kinshasa 5064000 +2299 Lubumbashi COD Shaba 851381 +2300 Mbuji-Mayi COD East Kasai 806475 +2301 Kolwezi COD Shaba 417810 +2302 Kisangani COD Haute-Zaire 417517 +2303 Kananga COD West Kasai 393030 +2304 Likasi COD Shaba 299118 +2305 Bukavu COD South Kivu 201569 +2306 Kikwit COD Bandundu 182142 +2307 Tshikapa COD West Kasai 180860 +2308 Matadi COD Bas-Zaire 172730 +2309 Mbandaka COD Equateur 169841 +2310 Mwene-Ditu COD East Kasai 137459 +2311 Boma COD Bas-Zaire 135284 +2312 Uvira COD South Kivu 115590 +2313 Butembo COD North Kivu 109406 +2314 Goma COD North Kivu 109094 +2315 Kalemie COD Shaba 101309 +2316 Bantam CCK Home Island 503 +2317 West Island CCK West Island 167 +2318 Pyongyang PRK Pyongyang-si 2484000 +2319 Hamhung PRK Hamgyong N 709730 +2320 Chongjin PRK Hamgyong P 582480 +2321 Nampo PRK Nampo-si 566200 +2322 Sinuiju PRK Pyongan P 326011 +2323 Wonsan PRK Kangwon 300148 +2324 Phyongsong PRK Pyongan N 272934 +2325 Sariwon PRK Hwanghae P 254146 +2326 Haeju PRK Hwanghae N 229172 +2327 Kanggye PRK Chagang 223410 +2328 Kimchaek PRK Hamgyong P 179000 +2329 Hyesan PRK Yanggang 178020 +2330 Kaesong PRK Kaesong-si 171500 +2331 Seoul KOR Seoul 9981619 +2332 Pusan KOR Pusan 3804522 +2333 Inchon KOR Inchon 2559424 +2334 Taegu KOR Taegu 2548568 +2335 Taejon KOR Taejon 1425835 +2336 Kwangju KOR Kwangju 1368341 +2337 Ulsan KOR Kyongsangnam 1084891 +2338 Songnam KOR Kyonggi 869094 +2339 Puchon KOR Kyonggi 779412 +2340 Suwon KOR Kyonggi 755550 +2341 Anyang KOR Kyonggi 591106 +2342 Chonju KOR Chollabuk 563153 +2343 Chongju KOR Chungchongbuk 531376 +2344 Koyang KOR Kyonggi 518282 +2345 Ansan KOR Kyonggi 510314 +2346 Pohang KOR Kyongsangbuk 508899 +2347 Chang-won KOR Kyongsangnam 481694 +2348 Masan KOR Kyongsangnam 441242 +2349 Kwangmyong KOR Kyonggi 350914 +2350 Chonan KOR Chungchongnam 330259 +2351 Chinju KOR Kyongsangnam 329886 +2352 Iksan KOR Chollabuk 322685 +2353 Pyongtaek KOR Kyonggi 312927 +2354 Kumi KOR Kyongsangbuk 311431 +2355 Uijongbu KOR Kyonggi 276111 +2356 Kyongju KOR Kyongsangbuk 272968 +2357 Kunsan KOR Chollabuk 266569 +2358 Cheju KOR Cheju 258511 +2359 Kimhae KOR Kyongsangnam 256370 +2360 Sunchon KOR Chollanam 249263 +2361 Mokpo KOR Chollanam 247452 +2362 Yong-in KOR Kyonggi 242643 +2363 Wonju KOR Kang-won 237460 +2364 Kunpo KOR Kyonggi 235233 +2365 Chunchon KOR Kang-won 234528 +2366 Namyangju KOR Kyonggi 229060 +2367 Kangnung KOR Kang-won 220403 +2368 Chungju KOR Chungchongbuk 205206 +2369 Andong KOR Kyongsangbuk 188443 +2370 Yosu KOR Chollanam 183596 +2371 Kyongsan KOR Kyongsangbuk 173746 +2372 Paju KOR Kyonggi 163379 +2373 Yangsan KOR Kyongsangnam 163351 +2374 Ichon KOR Kyonggi 155332 +2375 Asan KOR Chungchongnam 154663 +2376 Koje KOR Kyongsangnam 147562 +2377 Kimchon KOR Kyongsangbuk 147027 +2378 Nonsan KOR Chungchongnam 146619 +2379 Kuri KOR Kyonggi 142173 +2380 Chong-up KOR Chollabuk 139111 +2381 Chechon KOR Chungchongbuk 137070 +2382 Sosan KOR Chungchongnam 134746 +2383 Shihung KOR Kyonggi 133443 +2384 Tong-yong KOR Kyongsangnam 131717 +2385 Kongju KOR Chungchongnam 131229 +2386 Yongju KOR Kyongsangbuk 131097 +2387 Chinhae KOR Kyongsangnam 125997 +2388 Sangju KOR Kyongsangbuk 124116 +2389 Poryong KOR Chungchongnam 122604 +2390 Kwang-yang KOR Chollanam 122052 +2391 Miryang KOR Kyongsangnam 121501 +2392 Hanam KOR Kyonggi 115812 +2393 Kimje KOR Chollabuk 115427 +2394 Yongchon KOR Kyongsangbuk 113511 +2395 Sachon KOR Kyongsangnam 113494 +2396 Uiwang KOR Kyonggi 108788 +2397 Naju KOR Chollanam 107831 +2398 Namwon KOR Chollabuk 103544 +2399 Tonghae KOR Kang-won 95472 +2400 Mun-gyong KOR Kyongsangbuk 92239 +2401 Athenai GRC Attika 772072 +2402 Thessaloniki GRC Central Macedonia 383967 +2403 Pireus GRC Attika 182671 +2404 Patras GRC West Greece 153344 +2405 Peristerion GRC Attika 137288 +2406 Herakleion GRC Crete 116178 +2407 Kallithea GRC Attika 114233 +2408 Larisa GRC Thessalia 113090 +2409 Zagreb HRV Grad Zagreb 706770 +2410 Split HRV Split-Dalmatia 189388 +2411 Rijeka HRV Primorje-Gorski Kota 167964 +2412 Osijek HRV Osijek-Baranja 104761 +2413 La Habana CUB La Habana 2256000 +2414 Santiago de Cuba CUB Santiago de Cuba 433180 +2415 Camaguey CUB Camaguey 298726 +2416 Holguin CUB Holguin 249492 +2417 Santa Clara CUB Villa Clara 207350 +2418 Guantanamo CUB Guantanamo 205078 +2419 Pinar del Rio CUB Pinar del Rio 142100 +2420 Bayamo CUB Granma 141000 +2421 Cienfuegos CUB Cienfuegos 132770 +2422 Victoria de las Tunas CUB Las Tunas 132350 +2423 Matanzas CUB Matanzas 123273 +2424 Manzanillo CUB Granma 109350 +2425 Sancti-Spiritus CUB Sancti-Spiritus 100751 +2426 Ciego de Avila CUB Ciego de Avila 98505 +2427 al-Salimiya KWT Hawalli 130215 +2428 Jalib al-Shuyukh KWT Hawalli 102178 +2429 Kuwait KWT al-Asima 28859 +2430 Nicosia CYP Nicosia 195000 +2431 Limassol CYP Limassol 154400 +2432 Vientiane LAO Viangchan 531800 +2433 Savannakhet LAO Savannakhet 96652 +2434 Riga LVA Riika 764328 +2435 Daugavpils LVA Daugavpils 114829 +2436 Liepaja LVA Liepaja 89439 +2437 Maseru LSO Maseru 297000 +2438 Beirut LBN Beirut 1100000 +2439 Tripoli LBN al-Shamal 240000 +2440 Monrovia LBR Montserrado 850000 +2441 Tripoli LBY Tripoli 1682000 +2442 Bengasi LBY Bengasi 804000 +2443 Misrata LBY Misrata 121669 +2444 al-Zawiya LBY al-Zawiya 89338 +2445 Schaan LIE Schaan 5346 +2446 Vaduz LIE Vaduz 5043 +2447 Vilnius LTU Vilna 577969 +2448 Kaunas LTU Kaunas 412639 +2449 Klaipeda LTU Klaipeda 202451 +2450 Giauliai LTU Giauliai 146563 +2451 Panevezys LTU Panevezys 133695 +2452 Luxembourg [Luxemburg/Letzebuerg] LUX Luxembourg 80700 +2453 El-Aaiun ESH El-Aaiun 169000 +2454 Macao MAC Macau 437500 +2455 Antananarivo MDG Antananarivo 675669 +2456 Toamasina MDG Toamasina 127441 +2457 Antsirabe MDG Antananarivo 120239 +2458 Mahajanga MDG Mahajanga 100807 +2459 Fianarantsoa MDG Fianarantsoa 99005 +2460 Skopje MKD Skopje 444299 +2461 Blantyre MWI Blantyre 478155 +2462 Lilongwe MWI Lilongwe 435964 +2463 Male MDV Maale 71000 +2464 Kuala Lumpur MYS Wilayah Persekutuan 1297526 +2465 Ipoh MYS Perak 382853 +2466 Johor Baharu MYS Johor 328436 +2467 Petaling Jaya MYS Selangor 254350 +2468 Kelang MYS Selangor 243355 +2469 Kuala Terengganu MYS Terengganu 228119 +2470 Pinang MYS Pulau Pinang 219603 +2471 Kota Bharu MYS Kelantan 219582 +2472 Kuantan MYS Pahang 199484 +2473 Taiping MYS Perak 183261 +2474 Seremban MYS Negeri Sembilan 182869 +2475 Kuching MYS Sarawak 148059 +2476 Sibu MYS Sarawak 126381 +2477 Sandakan MYS Sabah 125841 +2478 Alor Setar MYS Kedah 124412 +2479 Selayang Baru MYS Selangor 124228 +2480 Sungai Petani MYS Kedah 114763 +2481 Shah Alam MYS Selangor 102019 +2482 Bamako MLI Bamako 809552 +2483 Birkirkara MLT Outer Harbour 21445 +2484 Valletta MLT Inner Harbour 7073 +2485 Casablanca MAR Casablanca 2940623 +2486 Rabat MAR Rabat-Sale-Zammour-Z 623457 +2487 Marrakech MAR Marrakech-Tensift-Al 621914 +2488 Fes MAR Fes-Boulemane 541162 +2489 Tanger MAR Tanger-Tetouan 521735 +2490 Sale MAR Rabat-Sale-Zammour-Z 504420 +2491 Meknes MAR Meknes-Tafilalet 460000 +2492 Oujda MAR Oriental 365382 +2493 Kenitra MAR Gharb-Chrarda-Beni H 292600 +2494 Tetouan MAR Tanger-Tetouan 277516 +2495 Safi MAR Doukkala-Abda 262300 +2496 Agadir MAR Souss Massa-Draa 155244 +2497 Mohammedia MAR Casablanca 154706 +2498 Khouribga MAR Chaouia-Ouardigha 152090 +2499 Beni-Mellal MAR Tadla-Azilal 140212 +2500 Temara MAR Rabat-Sale-Zammour-Z 126303 +2501 El Jadida MAR Doukkala-Abda 119083 +2502 Nador MAR Oriental 112450 +2503 Ksar el Kebir MAR Tanger-Tetouan 107065 +2504 Settat MAR Chaouia-Ouardigha 96200 +2505 Taza MAR Taza-Al Hoceima-Taou 92700 +2506 El Araich MAR Tanger-Tetouan 90400 +2507 Dalap-Uliga-Darrit MHL Majuro 28000 +2508 Fort-de-France MTQ Fort-de-France 94050 +2509 Nouakchott MRT Nouakchott 667300 +2510 Nouadhibou MRT Dakhlet Nouadhibou 97600 +2511 Port-Louis MUS Port-Louis 138200 +2512 Beau Bassin-Rose Hill MUS Plaines Wilhelms 100616 +2513 Vacoas-Phoenix MUS Plaines Wilhelms 98464 +2514 Mamoutzou MYT Mamoutzou 12000 +2515 Ciudad de Mexico MEX Distrito Federal 8591309 +2516 Guadalajara MEX Jalisco 1647720 +2517 Ecatepec de Morelos MEX Mexico 1620303 +2518 Puebla MEX Puebla 1346176 +2519 Nezahualcoyotl MEX Mexico 1224924 +2520 Juarez MEX Chihuahua 1217818 +2521 Tijuana MEX Baja California 1212232 +2522 Leon MEX Guanajuato 1133576 +2523 Monterrey MEX Nuevo Leon 1108499 +2524 Zapopan MEX Jalisco 1002239 +2525 Naucalpan de Juarez MEX Mexico 857511 +2526 Mexicali MEX Baja California 764902 +2527 Culiacan MEX Sinaloa 744859 +2528 Acapulco de Juarez MEX Guerrero 721011 +2529 Tlalnepantla de Baz MEX Mexico 720755 +2530 Merida MEX Yucatan 703324 +2531 Chihuahua MEX Chihuahua 670208 +2532 San Luis Potosi MEX San Luis Potosi 669353 +2533 Guadalupe MEX Nuevo Leon 668780 +2534 Toluca MEX Mexico 665617 +2535 Aguascalientes MEX Aguascalientes 643360 +2536 Queretaro MEX Queretaro de Arteaga 639839 +2537 Morelia MEX Michoacan de Ocampo 619958 +2538 Hermosillo MEX Sonora 608697 +2539 Saltillo MEX Coahuila de Zaragoza 577352 +2540 Torreon MEX Coahuila de Zaragoza 529093 +2541 Centro (Villahermosa) MEX Tabasco 519873 +2542 San Nicolas de los Garza MEX Nuevo Leon 495540 +2543 Durango MEX Durango 490524 +2544 Chimalhuacan MEX Mexico 490245 +2545 Tlaquepaque MEX Jalisco 475472 +2546 Atizapan de Zaragoza MEX Mexico 467262 +2547 Veracruz MEX Veracruz 457119 +2548 Cuautitlan Izcalli MEX Mexico 452976 +2549 Irapuato MEX Guanajuato 440039 +2550 Tuxtla Gutierrez MEX Chiapas 433544 +2551 Tultitlan MEX Mexico 432411 +2552 Reynosa MEX Tamaulipas 419776 +2553 Benito Juarez MEX Quintana Roo 419276 +2554 Matamoros MEX Tamaulipas 416428 +2555 Xalapa MEX Veracruz 390058 +2556 Celaya MEX Guanajuato 382140 +2557 Mazatlan MEX Sinaloa 380265 +2558 Ensenada MEX Baja California 369573 +2559 Ahome MEX Sinaloa 358663 +2560 Cajeme MEX Sonora 355679 +2561 Cuernavaca MEX Morelos 337966 +2562 Tonala MEX Jalisco 336109 +2563 Valle de Chalco Solidaridad MEX Mexico 323113 +2564 Nuevo Laredo MEX Tamaulipas 310277 +2565 Tepic MEX Nayarit 305025 +2566 Tampico MEX Tamaulipas 294789 +2567 Ixtapaluca MEX Mexico 293160 +2568 Apodaca MEX Nuevo Leon 282941 +2569 Guasave MEX Sinaloa 277201 +2570 Gomez Palacio MEX Durango 272806 +2571 Tapachula MEX Chiapas 271141 +2572 Nicolas Romero MEX Mexico 269393 +2573 Coatzacoalcos MEX Veracruz 267037 +2574 Uruapan MEX Michoacan de Ocampo 265211 +2575 Victoria MEX Tamaulipas 262686 +2576 Oaxaca de Juarez MEX Oaxaca 256848 +2577 Coacalco de Berriozabal MEX Mexico 252270 +2578 Pachuca de Soto MEX Hidalgo 244688 +2579 General Escobedo MEX Nuevo Leon 232961 +2580 Salamanca MEX Guanajuato 226864 +2581 Santa Catarina MEX Nuevo Leon 226573 +2582 Tehuacan MEX Puebla 225943 +2583 Chalco MEX Mexico 222201 +2584 Cardenas MEX Tabasco 216903 +2585 Campeche MEX Campeche 216735 +2586 La Paz MEX Mexico 213045 +2587 Othon P. Blanco (Chetumal) MEX Quintana Roo 208014 +2588 Texcoco MEX Mexico 203681 +2589 La Paz MEX Baja California Sur 196708 +2590 Metepec MEX Mexico 194265 +2591 Monclova MEX Coahuila de Zaragoza 193657 +2592 Huixquilucan MEX Mexico 193156 +2593 Chilpancingo de los Bravo MEX Guerrero 192509 +2594 Puerto Vallarta MEX Jalisco 183741 +2595 Fresnillo MEX Zacatecas 182744 +2596 Ciudad Madero MEX Tamaulipas 182012 +2597 Soledad de Graciano Sanchez MEX San Luis Potosi 179956 +2598 San Juan del Rio MEX Queretaro 179300 +2599 San Felipe del Progreso MEX Mexico 177330 +2600 Cordoba MEX Veracruz 176952 +2601 Tecamac MEX Mexico 172410 +2602 Ocosingo MEX Chiapas 171495 +2603 Carmen MEX Campeche 171367 +2604 Lazaro Cardenas MEX Michoacan de Ocampo 170878 +2605 Jiutepec MEX Morelos 170428 +2606 Papantla MEX Veracruz 170123 +2607 Comalcalco MEX Tabasco 164640 +2608 Zamora MEX Michoacan de Ocampo 161191 +2609 Nogales MEX Sonora 159103 +2610 Huimanguillo MEX Tabasco 158335 +2611 Cuautla MEX Morelos 153132 +2612 Minatitlan MEX Veracruz 152983 +2613 Poza Rica de Hidalgo MEX Veracruz 152678 +2614 Ciudad Valles MEX San Luis Potosi 146411 +2615 Navolato MEX Sinaloa 145396 +2616 San Luis Rio Colorado MEX Sonora 145276 +2617 Penjamo MEX Guanajuato 143927 +2618 San Andres Tuxtla MEX Veracruz 142251 +2619 Guanajuato MEX Guanajuato 141215 +2620 Navojoa MEX Sonora 140495 +2621 Zitacuaro MEX Michoacan de Ocampo 137970 +2622 Boca del Rio MEX Veracruz-Llave 135721 +2623 Allende MEX Guanajuato 134645 +2624 Silao MEX Guanajuato 134037 +2625 Macuspana MEX Tabasco 133795 +2626 San Juan Bautista Tuxtepec MEX Oaxaca 133675 +2627 San Cristobal de las Casas MEX Chiapas 132317 +2628 Valle de Santiago MEX Guanajuato 130557 +2629 Guaymas MEX Sonora 130108 +2630 Colima MEX Colima 129454 +2631 Dolores Hidalgo MEX Guanajuato 128675 +2632 Lagos de Moreno MEX Jalisco 127949 +2633 Piedras Negras MEX Coahuila de Zaragoza 127898 +2634 Altamira MEX Tamaulipas 127490 +2635 Tuxpam MEX Veracruz 126475 +2636 San Pedro Garza Garcia MEX Nuevo Leon 126147 +2637 Cuauhtemoc MEX Chihuahua 124279 +2638 Manzanillo MEX Colima 124014 +2639 Iguala de la Independencia MEX Guerrero 123883 +2640 Zacatecas MEX Zacatecas 123700 +2641 Tlajomulco de Zuaiga MEX Jalisco 123220 +2642 Tulancingo de Bravo MEX Hidalgo 121946 +2643 Zinacantepec MEX Mexico 121715 +2644 San Martin Texmelucan MEX Puebla 121093 +2645 Tepatitlan de Morelos MEX Jalisco 118948 +2646 Martinez de la Torre MEX Veracruz 118815 +2647 Orizaba MEX Veracruz 118488 +2648 Apatzingan MEX Michoacan de Ocampo 117849 +2649 Atlixco MEX Puebla 117019 +2650 Delicias MEX Chihuahua 116132 +2651 Ixtlahuaca MEX Mexico 115548 +2652 El Mante MEX Tamaulipas 112453 +2653 Lerdo MEX Durango 112272 +2654 Almoloya de Juarez MEX Mexico 110550 +2655 Acambaro MEX Guanajuato 110487 +2656 Acuaa MEX Coahuila de Zaragoza 110388 +2657 Guadalupe MEX Zacatecas 108881 +2658 Huejutla de Reyes MEX Hidalgo 108017 +2659 Hidalgo MEX Michoacan de Ocampo 106198 +2660 Los Cabos MEX Baja California Sur 105199 +2661 Comitan de Dominguez MEX Chiapas 104986 +2662 Cunduacan MEX Tabasco 104164 +2663 Rio Bravo MEX Tamaulipas 103901 +2664 Temapache MEX Veracruz 102824 +2665 Chilapa de Alvarez MEX Guerrero 102716 +2666 Hidalgo del Parral MEX Chihuahua 100881 +2667 San Francisco del Rincon MEX Guanajuato 100149 +2668 Taxco de Alarcon MEX Guerrero 99907 +2669 Zumpango MEX Mexico 99781 +2670 San Pedro Cholula MEX Puebla 99734 +2671 Lerma MEX Mexico 99714 +2672 Tecoman MEX Colima 99296 +2673 Las Margaritas MEX Chiapas 97389 +2674 Cosoleacaque MEX Veracruz 97199 +2675 San Luis de la Paz MEX Guanajuato 96763 +2676 Jose Azueta MEX Guerrero 95448 +2677 Santiago Ixcuintla MEX Nayarit 95311 +2678 San Felipe MEX Guanajuato 95305 +2679 Tejupilco MEX Mexico 94934 +2680 Tantoyuca MEX Veracruz 94709 +2681 Salvatierra MEX Guanajuato 94322 +2682 Tultepec MEX Mexico 93364 +2683 Temixco MEX Morelos 92686 +2684 Matamoros MEX Coahuila de Zaragoza 91858 +2685 Panuco MEX Veracruz 90551 +2686 El Fuerte MEX Sinaloa 89556 +2687 Tierra Blanca MEX Veracruz 89143 +2688 Weno FSM Chuuk 22000 +2689 Palikir FSM Pohnpei 8600 +2690 Chisinau MDA Chisinau 719900 +2691 Tiraspol MDA Dnjestria 194300 +2692 Balti MDA Balti 153400 +2693 Bender (Tighina) MDA Bender (Tighina) 125700 +2694 Monte-Carlo MCO A 13154 +2695 Monaco-Ville MCO A 1234 +2696 Ulan Bator MNG Ulaanbaatar 773700 +2697 Plymouth MSR Plymouth 2000 +2698 Maputo MOZ Maputo 1018938 +2699 Matola MOZ Maputo 424662 +2700 Beira MOZ Sofala 397368 +2701 Nampula MOZ Nampula 303346 +2702 Chimoio MOZ Manica 171056 +2703 Nacala-Porto MOZ Nampula 158248 +2704 Quelimane MOZ Zambezia 150116 +2705 Mocuba MOZ Zambezia 124700 +2706 Tete MOZ Tete 101984 +2707 Xai-Xai MOZ Gaza 99442 +2708 Gurue MOZ Zambezia 99300 +2709 Maxixe MOZ Inhambane 93985 +2710 Rangoon (Yangon) MMR Rangoon [Yangon] 3361700 +2711 Mandalay MMR Mandalay 885300 +2712 Moulmein (Mawlamyine) MMR Mon 307900 +2713 Pegu (Bago) MMR Pegu [Bago] 190900 +2714 Bassein (Pathein) MMR Irrawaddy [Ayeyarwad 183900 +2715 Monywa MMR Sagaing 138600 +2716 Sittwe (Akyab) MMR Rakhine 137600 +2717 Taunggyi (Taunggye) MMR Shan 131500 +2718 Meikhtila MMR Mandalay 129700 +2719 Mergui (Myeik) MMR Tenasserim [Tanintha 122700 +2720 Lashio (Lasho) MMR Shan 107600 +2721 Prome (Pyay) MMR Pegu [Bago] 105700 +2722 Henzada (Hinthada) MMR Irrawaddy [Ayeyarwad 104700 +2723 Myingyan MMR Mandalay 103600 +2724 Tavoy (Dawei) MMR Tenasserim [Tanintha 96800 +2725 Pagakku (Pakokku) MMR Magwe [Magway] 94800 +2726 Windhoek NAM Khomas 169000 +2727 Yangor NRU A 4050 +2728 Yaren NRU A 559 +2729 Kathmandu NPL Central 591835 +2730 Biratnagar NPL Eastern 157764 +2731 Pokhara NPL Western 146318 +2732 Lalitapur NPL Central 145847 +2733 Birgunj NPL Central 90639 +2734 Managua NIC Managua 959000 +2735 Leon NIC Leon 123865 +2736 Chinandega NIC Chinandega 97387 +2737 Masaya NIC Masaya 88971 +2738 Niamey NER Niamey 420000 +2739 Zinder NER Zinder 120892 +2740 Maradi NER Maradi 112965 +2741 Lagos NGA Lagos 1518000 +2742 Ibadan NGA Oyo & Osun 1432000 +2743 Ogbomosho NGA Oyo & Osun 730000 +2744 Kano NGA Kano & Jigawa 674100 +2745 Oshogbo NGA Oyo & Osun 476800 +2746 Ilorin NGA Kwara & Kogi 475800 +2747 Abeokuta NGA Ogun 427400 +2748 Port Harcourt NGA Rivers & Bayelsa 410000 +2749 Zaria NGA Kaduna 379200 +2750 Ilesha NGA Oyo & Osun 378400 +2751 Onitsha NGA Anambra & Enugu & Eb 371900 +2752 Iwo NGA Oyo & Osun 362000 +2753 Ado-Ekiti NGA Ondo & Ekiti 359400 +2754 Abuja NGA Federal Capital Dist 350100 +2755 Kaduna NGA Kaduna 342200 +2756 Mushin NGA Lagos 333200 +2757 Maiduguri NGA Borno & Yobe 320000 +2758 Enugu NGA Anambra & Enugu & Eb 316100 +2759 Ede NGA Oyo & Osun 307100 +2760 Aba NGA Imo & Abia 298900 +2761 Ife NGA Oyo & Osun 296800 +2762 Ila NGA Oyo & Osun 264000 +2763 Oyo NGA Oyo & Osun 256400 +2764 Ikerre NGA Ondo & Ekiti 244600 +2765 Benin City NGA Edo & Delta 229400 +2766 Iseyin NGA Oyo & Osun 217300 +2767 Katsina NGA Katsina 206500 +2768 Jos NGA Plateau & Nassarawa 206300 +2769 Sokoto NGA Sokoto & Kebbi & Zam 204900 +2770 Ilobu NGA Oyo & Osun 199000 +2771 Offa NGA Kwara & Kogi 197200 +2772 Ikorodu NGA Lagos 184900 +2773 Ilawe-Ekiti NGA Ondo & Ekiti 184500 +2774 Owo NGA Ondo & Ekiti 183500 +2775 Ikirun NGA Oyo & Osun 181400 +2776 Shaki NGA Oyo & Osun 174500 +2777 Calabar NGA Cross River 174400 +2778 Ondo NGA Ondo & Ekiti 173600 +2779 Akure NGA Ondo & Ekiti 162300 +2780 Gusau NGA Sokoto & Kebbi & Zam 158000 +2781 Ijebu-Ode NGA Ogun 156400 +2782 Effon-Alaiye NGA Oyo & Osun 153100 +2783 Kumo NGA Bauchi & Gombe 148000 +2784 Shomolu NGA Lagos 147700 +2785 Oka-Akoko NGA Ondo & Ekiti 142900 +2786 Ikare NGA Ondo & Ekiti 140800 +2787 Sapele NGA Edo & Delta 139200 +2788 Deba Habe NGA Bauchi & Gombe 138600 +2789 Minna NGA Niger 136900 +2790 Warri NGA Edo & Delta 126100 +2791 Bida NGA Niger 125500 +2792 Ikire NGA Oyo & Osun 123300 +2793 Makurdi NGA Benue 123100 +2794 Lafia NGA Plateau & Nassarawa 122500 +2795 Inisa NGA Oyo & Osun 119800 +2796 Shagamu NGA Ogun 117200 +2797 Awka NGA Anambra & Enugu & Eb 111200 +2798 Gombe NGA Bauchi & Gombe 107800 +2799 Igboho NGA Oyo & Osun 106800 +2800 Ejigbo NGA Oyo & Osun 105900 +2801 Agege NGA Lagos 105000 +2802 Ise-Ekiti NGA Ondo & Ekiti 103400 +2803 Ugep NGA Cross River 102600 +2804 Epe NGA Lagos 101000 +2805 Alofi NIU A 682 +2806 Kingston NFK A 800 +2807 Oslo NOR Oslo 508726 +2808 Bergen NOR Hordaland 230948 +2809 Trondheim NOR Sor-Trondelag 150166 +2810 Stavanger NOR Rogaland 108848 +2811 Barum NOR Akershus 101340 +2812 Abidjan CIV Abidjan 2500000 +2813 Bouake CIV Bouake 329850 +2814 Yamoussoukro CIV Yamoussoukro 130000 +2815 Daloa CIV Daloa 121842 +2816 Korhogo CIV Korhogo 109445 +2817 al-Sib OMN Masqat 155000 +2818 Salala OMN Zufar 131813 +2819 Bawshar OMN Masqat 107500 +2820 Suhar OMN al-Batina 90814 +2821 Masqat OMN Masqat 51969 +2822 Karachi PAK Sindh 9269265 +2823 Lahore PAK Punjab 5063499 +2824 Faisalabad PAK Punjab 1977246 +2825 Rawalpindi PAK Punjab 1406214 +2826 Multan PAK Punjab 1182441 +2827 Hyderabad PAK Sindh 1151274 +2828 Gujranwala PAK Punjab 1124749 +2829 Peshawar PAK Nothwest Border Prov 988005 +2830 Quetta PAK Baluchistan 560307 +2831 Islamabad PAK Islamabad 524500 +2832 Sargodha PAK Punjab 455360 +2833 Sialkot PAK Punjab 417597 +2834 Bahawalpur PAK Punjab 403408 +2835 Sukkur PAK Sindh 329176 +2836 Jhang PAK Punjab 292214 +2837 Sheikhupura PAK Punjab 271875 +2838 Larkana PAK Sindh 270366 +2839 Gujrat PAK Punjab 250121 +2840 Mardan PAK Nothwest Border Prov 244511 +2841 Kasur PAK Punjab 241649 +2842 Rahim Yar Khan PAK Punjab 228479 +2843 Sahiwal PAK Punjab 207388 +2844 Okara PAK Punjab 200901 +2845 Wah PAK Punjab 198400 +2846 Dera Ghazi Khan PAK Punjab 188100 +2847 Mirpur Khas PAK Sind 184500 +2848 Nawabshah PAK Sind 183100 +2849 Mingora PAK Nothwest Border Prov 174500 +2850 Chiniot PAK Punjab 169300 +2851 Kamoke PAK Punjab 151000 +2852 Mandi Burewala PAK Punjab 149900 +2853 Jhelum PAK Punjab 145800 +2854 Sadiqabad PAK Punjab 141500 +2855 Jacobabad PAK Sind 137700 +2856 Shikarpur PAK Sind 133300 +2857 Khanewal PAK Punjab 133000 +2858 Hafizabad PAK Punjab 130200 +2859 Kohat PAK Nothwest Border Prov 125300 +2860 Muzaffargarh PAK Punjab 121600 +2861 Khanpur PAK Punjab 117800 +2862 Gojra PAK Punjab 115000 +2863 Bahawalnagar PAK Punjab 109600 +2864 Muridke PAK Punjab 108600 +2865 Pak Pattan PAK Punjab 107800 +2866 Abottabad PAK Nothwest Border Prov 106000 +2867 Tando Adam PAK Sind 103400 +2868 Jaranwala PAK Punjab 103300 +2869 Khairpur PAK Sind 102200 +2870 Chishtian Mandi PAK Punjab 101700 +2871 Daska PAK Punjab 101500 +2872 Dadu PAK Sind 98600 +2873 Mandi Bahauddin PAK Punjab 97300 +2874 Ahmadpur East PAK Punjab 96000 +2875 Kamalia PAK Punjab 95300 +2876 Khuzdar PAK Baluchistan 93100 +2877 Vihari PAK Punjab 92300 +2878 Dera Ismail Khan PAK Nothwest Border Prov 90400 +2879 Wazirabad PAK Punjab 89700 +2880 Nowshera PAK Nothwest Border Prov 89400 +2881 Koror PLW Koror 12000 +2882 Ciudad de Panama PAN Panama 471373 +2883 San Miguelito PAN San Miguelito 315382 +2884 Port Moresby PNG National Capital Dis 247000 +2885 Asuncion PRY Asuncion 557776 +2886 Ciudad del Este PRY Alto Parana 133881 +2887 San Lorenzo PRY Central 133395 +2888 Lambare PRY Central 99681 +2889 Fernando de la Mora PRY Central 95287 +2890 Lima PER Lima 6464693 +2891 Arequipa PER Arequipa 762000 +2892 Trujillo PER La Libertad 652000 +2893 Chiclayo PER Lambayeque 517000 +2894 Callao PER Callao 424294 +2895 Iquitos PER Loreto 367000 +2896 Chimbote PER Ancash 336000 +2897 Huancayo PER Junin 327000 +2898 Piura PER Piura 325000 +2899 Cusco PER Cusco 291000 +2900 Pucallpa PER Ucayali 220866 +2901 Tacna PER Tacna 215683 +2902 Ica PER Ica 194820 +2903 Sullana PER Piura 147361 +2904 Juliaca PER Puno 142576 +2905 Huanuco PER Huanuco 129688 +2906 Ayacucho PER Ayacucho 118960 +2907 Chincha Alta PER Ica 110016 +2908 Cajamarca PER Cajamarca 108009 +2909 Puno PER Puno 101578 +2910 Ventanilla PER Callao 101056 +2911 Castilla PER Piura 90642 +2912 Adamstown PCN A 42 +2913 Garapan MNP Saipan 9200 +2914 Lisboa PRT Lisboa 563210 +2915 Porto PRT Porto 273060 +2916 Amadora PRT Lisboa 122106 +2917 Coimbra PRT Coimbra 96100 +2918 Braga PRT Braga 90535 +2919 San Juan PRI San Juan 434374 +2920 Bayamon PRI Bayamon 224044 +2921 Ponce PRI Ponce 186475 +2922 Carolina PRI Carolina 186076 +2923 Caguas PRI Caguas 140502 +2924 Arecibo PRI Arecibo 100131 +2925 Guaynabo PRI Guaynabo 100053 +2926 Mayaguez PRI Mayaguez 98434 +2927 Toa Baja PRI Toa Baja 94085 +2928 Warszawa POL Mazowieckie 1615369 +2929 Lodz POL Lodzkie 800110 +2930 Krakow POL Malopolskie 738150 +2931 Wroclaw POL Dolnoslaskie 636765 +2932 Poznan POL Wielkopolskie 576899 +2933 Gdansk POL Pomorskie 458988 +2934 Szczecin POL Zachodnio-Pomorskie 416988 +2935 Bydgoszcz POL Kujawsko-Pomorskie 386855 +2936 Lublin POL Lubelskie 356251 +2937 Katowice POL Slaskie 345934 +2938 Bialystok POL Podlaskie 283937 +2939 Czestochowa POL Slaskie 257812 +2940 Gdynia POL Pomorskie 253521 +2941 Sosnowiec POL Slaskie 244102 +2942 Radom POL Mazowieckie 232262 +2943 Kielce POL Swietokrzyskie 212383 +2944 Gliwice POL Slaskie 212164 +2945 Torun POL Kujawsko-Pomorskie 206158 +2946 Bytom POL Slaskie 205560 +2947 Zabrze POL Slaskie 200177 +2948 Bielsko-Biala POL Slaskie 180307 +2949 Olsztyn POL Warminsko-Mazurskie 170904 +2950 Rzeszow POL Podkarpackie 162049 +2951 Ruda Slaska POL Slaskie 159665 +2952 Rybnik POL Slaskie 144582 +2953 Walbrzych POL Dolnoslaskie 136923 +2954 Tychy POL Slaskie 133178 +2955 Dabrowa Gornicza POL Slaskie 131037 +2956 Plock POL Mazowieckie 131011 +2957 Elblag POL Warminsko-Mazurskie 129782 +2958 Opole POL Opolskie 129553 +2959 Gorzow Wielkopolski POL Lubuskie 126019 +2960 Wloclawek POL Kujawsko-Pomorskie 123373 +2961 Chorzow POL Slaskie 121708 +2962 Tarnow POL Malopolskie 121494 +2963 Zielona Gora POL Lubuskie 118182 +2964 Koszalin POL Zachodnio-Pomorskie 112375 +2965 Legnica POL Dolnoslaskie 109335 +2966 Kalisz POL Wielkopolskie 106641 +2967 Grudziadz POL Kujawsko-Pomorskie 102434 +2968 Slupsk POL Pomorskie 102370 +2969 Jastrzebie-Zdroj POL Slaskie 102294 +2970 Jaworzno POL Slaskie 97929 +2971 Jelenia Gora POL Dolnoslaskie 93901 +2972 Malabo GNQ Bioko 40000 +2973 Doha QAT Doha 355000 +2974 Paris FRA Ile-de-France 2125246 +2975 Marseille FRA Provence-Alpes-Cote 798430 +2976 Lyon FRA Rhone-Alpes 445452 +2977 Toulouse FRA Midi-Pyrenees 390350 +2978 Nice FRA Provence-Alpes-Cote 342738 +2979 Nantes FRA Pays de la Loire 270251 +2980 Strasbourg FRA Alsace 264115 +2981 Montpellier FRA Languedoc-Roussillon 225392 +2982 Bordeaux FRA Aquitaine 215363 +2983 Rennes FRA Haute-Normandie 206229 +2984 Le Havre FRA Champagne-Ardenne 190905 +2985 Reims FRA Nord-Pas-de-Calais 187206 +2986 Lille FRA Rhone-Alpes 184657 +2987 St-Etienne FRA Bretagne 180210 +2988 Toulon FRA Provence-Alpes-Cote 160639 +2989 Grenoble FRA Rhone-Alpes 153317 +2990 Angers FRA Pays de la Loire 151279 +2991 Dijon FRA Bourgogne 149867 +2992 Brest FRA Bretagne 149634 +2993 Le Mans FRA Pays de la Loire 146105 +2994 Clermont-Ferrand FRA Auvergne 137140 +2995 Amiens FRA Picardie 135501 +2996 Aix-en-Provence FRA Provence-Alpes-Cote 134222 +2997 Limoges FRA Limousin 133968 +2998 Nimes FRA Languedoc-Roussillon 133424 +2999 Tours FRA Centre 132820 +3000 Villeurbanne FRA Rhone-Alpes 124215 +3001 Metz FRA Lorraine 123776 +3002 Besancon FRA Franche-Comte 117733 +3003 Caen FRA Basse-Normandie 113987 +3004 Orleans FRA Centre 113126 +3005 Mulhouse FRA Alsace 110359 +3006 Rouen FRA Haute-Normandie 106592 +3007 Boulogne-Billancourt FRA Ile-de-France 106367 +3008 Perpignan FRA Languedoc-Roussillon 105115 +3009 Nancy FRA Lorraine 103605 +3010 Roubaix FRA Nord-Pas-de-Calais 96984 +3011 Argenteuil FRA Ile-de-France 93961 +3012 Tourcoing FRA Nord-Pas-de-Calais 93540 +3013 Montreuil FRA Ile-de-France 90674 +3014 Cayenne GUF Cayenne 50699 +3015 Faaa PYF Tahiti 25888 +3016 Papeete PYF Tahiti 25553 +3017 Saint-Denis REU Saint-Denis 131480 +3018 Bucuresti ROM Bukarest 2016131 +3019 Iasi ROM Iasi 348070 +3020 Constanta ROM Constanta 342264 +3021 Cluj-Napoca ROM Cluj 332498 +3022 Galati ROM Galati 330276 +3023 Timisoara ROM Timis 324304 +3024 Brasov ROM Brasov 314225 +3025 Craiova ROM Dolj 313530 +3026 Ploiesti ROM Prahova 251348 +3027 Braila ROM Braila 233756 +3028 Oradea ROM Bihor 222239 +3029 Bacau ROM Bacau 209235 +3030 Pitesti ROM Arges 187170 +3031 Arad ROM Arad 184408 +3032 Sibiu ROM Sibiu 169611 +3033 Targu Mures ROM Mures 165153 +3034 Baia Mare ROM Maramures 149665 +3035 Buzau ROM Buzau 148372 +3036 Satu Mare ROM Satu Mare 130059 +3037 Botosani ROM Botosani 128730 +3038 Piatra Neamt ROM Neamt 125070 +3039 Ramnicu Valcea ROM Valcea 119741 +3040 Suceava ROM Suceava 118549 +3041 Drobeta-Turnu Severin ROM Mehedinti 117865 +3042 Targoviste ROM Dambovita 98980 +3043 Focsani ROM Vrancea 98979 +3044 Targu Jiu ROM Gorj 98524 +3045 Tulcea ROM Tulcea 96278 +3046 Resita ROM Caras-Severin 93976 +3047 Kigali RWA Kigali 286000 +3048 Stockholm SWE Lisboa 750348 +3049 Gothenburg [Goteborg] SWE West Gotanmaan lan 466990 +3050 Malmo SWE Skane lan 259579 +3051 Uppsala SWE Uppsala lan 189569 +3052 Linkoping SWE East Gotanmaan lan 133168 +3053 Vasteras SWE Vastmanlands lan 126328 +3054 Orebro SWE Orebros lan 124207 +3055 Norrkoping SWE East Gotanmaan lan 122199 +3056 Helsingborg SWE Skane lan 117737 +3057 Jonkoping SWE Jonkopings lan 117095 +3058 Umea SWE Vasterbottens lan 104512 +3059 Lund SWE Skane lan 98948 +3060 Boras SWE West Gotanmaan lan 96883 +3061 Sundsvall SWE Vasternorrlands lan 93126 +3062 Gavle SWE Gavleborgs lan 90742 +3063 Jamestown SHN Saint Helena 1500 +3064 Basseterre KNA St George Basseterre 11600 +3065 Castries LCA Castries 2301 +3066 Kingstown VCT St George 17100 +3067 Saint-Pierre SPM Saint-Pierre 5808 +3068 Berlin DEU Berliini 3386667 +3069 Hamburg DEU Hamburg 1704735 +3070 Munich [Munchen] DEU Baijeri 1194560 +3071 Koln DEU Nordrhein-Westfalen 962507 +3072 Frankfurt am Main DEU Hessen 643821 +3073 Essen DEU Nordrhein-Westfalen 599515 +3074 Dortmund DEU Nordrhein-Westfalen 590213 +3075 Stuttgart DEU Baden-Wurttemberg 582443 +3076 Dusseldorf DEU Nordrhein-Westfalen 568855 +3077 Bremen DEU Bremen 540330 +3078 Duisburg DEU Nordrhein-Westfalen 519793 +3079 Hannover DEU Niedersachsen 514718 +3080 Leipzig DEU Saksi 489532 +3081 Nurnberg DEU Baijeri 486628 +3082 Dresden DEU Saksi 476668 +3083 Bochum DEU Nordrhein-Westfalen 392830 +3084 Wuppertal DEU Nordrhein-Westfalen 368993 +3085 Bielefeld DEU Nordrhein-Westfalen 321125 +3086 Mannheim DEU Baden-Wurttemberg 307730 +3087 Bonn DEU Nordrhein-Westfalen 301048 +3088 Gelsenkirchen DEU Nordrhein-Westfalen 281979 +3089 Karlsruhe DEU Baden-Wurttemberg 277204 +3090 Wiesbaden DEU Hessen 268716 +3091 Munster DEU Nordrhein-Westfalen 264670 +3092 Monchengladbach DEU Nordrhein-Westfalen 263697 +3093 Chemnitz DEU Saksi 263222 +3094 Augsburg DEU Baijeri 254867 +3095 Halle/Saale DEU Anhalt Sachsen 254360 +3096 Braunschweig DEU Niedersachsen 246322 +3097 Aachen DEU Nordrhein-Westfalen 243825 +3098 Krefeld DEU Nordrhein-Westfalen 241769 +3099 Magdeburg DEU Anhalt Sachsen 235073 +3100 Kiel DEU Schleswig-Holstein 233795 +3101 Oberhausen DEU Nordrhein-Westfalen 222349 +3102 Lubeck DEU Schleswig-Holstein 213326 +3103 Hagen DEU Nordrhein-Westfalen 205201 +3104 Rostock DEU Mecklenburg-Vorpomme 203279 +3105 Freiburg im Breisgau DEU Baden-Wurttemberg 202455 +3106 Erfurt DEU Thuringen 201267 +3107 Kassel DEU Hessen 196211 +3108 Saarbrucken DEU Saarland 183836 +3109 Mainz DEU Rheinland-Pfalz 183134 +3110 Hamm DEU Nordrhein-Westfalen 181804 +3111 Herne DEU Nordrhein-Westfalen 175661 +3112 Mulheim an der Ruhr DEU Nordrhein-Westfalen 173895 +3113 Solingen DEU Nordrhein-Westfalen 165583 +3114 Osnabruck DEU Niedersachsen 164539 +3115 Ludwigshafen am Rhein DEU Rheinland-Pfalz 163771 +3116 Leverkusen DEU Nordrhein-Westfalen 160841 +3117 Oldenburg DEU Niedersachsen 154125 +3118 Neuss DEU Nordrhein-Westfalen 149702 +3119 Heidelberg DEU Baden-Wurttemberg 139672 +3120 Darmstadt DEU Hessen 137776 +3121 Paderborn DEU Nordrhein-Westfalen 137647 +3122 Potsdam DEU Brandenburg 128983 +3123 Wurzburg DEU Baijeri 127350 +3124 Regensburg DEU Baijeri 125236 +3125 Recklinghausen DEU Nordrhein-Westfalen 125022 +3126 Gottingen DEU Niedersachsen 124775 +3127 Bremerhaven DEU Bremen 122735 +3128 Wolfsburg DEU Niedersachsen 121954 +3129 Bottrop DEU Nordrhein-Westfalen 121097 +3130 Remscheid DEU Nordrhein-Westfalen 120125 +3131 Heilbronn DEU Baden-Wurttemberg 119526 +3132 Pforzheim DEU Baden-Wurttemberg 117227 +3133 Offenbach am Main DEU Hessen 116627 +3134 Ulm DEU Baden-Wurttemberg 116103 +3135 Ingolstadt DEU Baijeri 114826 +3136 Gera DEU Thuringen 114718 +3137 Salzgitter DEU Niedersachsen 112934 +3138 Cottbus DEU Brandenburg 110894 +3139 Reutlingen DEU Baden-Wurttemberg 110343 +3140 Furth DEU Baijeri 109771 +3141 Siegen DEU Nordrhein-Westfalen 109225 +3142 Koblenz DEU Rheinland-Pfalz 108003 +3143 Moers DEU Nordrhein-Westfalen 106837 +3144 Bergisch Gladbach DEU Nordrhein-Westfalen 106150 +3145 Zwickau DEU Saksi 104146 +3146 Hildesheim DEU Niedersachsen 104013 +3147 Witten DEU Nordrhein-Westfalen 103384 +3148 Schwerin DEU Mecklenburg-Vorpomme 102878 +3149 Erlangen DEU Baijeri 100750 +3150 Kaiserslautern DEU Rheinland-Pfalz 100025 +3151 Trier DEU Rheinland-Pfalz 99891 +3152 Jena DEU Thuringen 99779 +3153 Iserlohn DEU Nordrhein-Westfalen 99474 +3154 Gutersloh DEU Nordrhein-Westfalen 95028 +3155 Marl DEU Nordrhein-Westfalen 93735 +3156 Lunen DEU Nordrhein-Westfalen 92044 +3157 Duren DEU Nordrhein-Westfalen 91092 +3158 Ratingen DEU Nordrhein-Westfalen 90951 +3159 Velbert DEU Nordrhein-Westfalen 89881 +3160 Esslingen am Neckar DEU Baden-Wurttemberg 89667 +3161 Honiara SLB Honiara 50100 +3162 Lusaka ZMB Lusaka 1317000 +3163 Ndola ZMB Copperbelt 329200 +3164 Kitwe ZMB Copperbelt 288600 +3165 Kabwe ZMB Central 154300 +3166 Chingola ZMB Copperbelt 142400 +3167 Mufulira ZMB Copperbelt 123900 +3168 Luanshya ZMB Copperbelt 118100 +3169 Apia WSM Upolu 35900 +3170 Serravalle SMR Serravalle/Dogano 4802 +3171 San Marino SMR San Marino 2294 +3172 Sao Tome STP Aqua Grande 49541 +3173 Riyadh SAU Riyadh 3324000 +3174 Jedda SAU Mekka 2046300 +3175 Mekka SAU Mekka 965700 +3176 Medina SAU Medina 608300 +3177 al-Dammam SAU al-Sharqiya 482300 +3178 al-Taif SAU Mekka 416100 +3179 Tabuk SAU Tabuk 292600 +3180 Burayda SAU al-Qasim 248600 +3181 al-Hufuf SAU al-Sharqiya 225800 +3182 al-Mubarraz SAU al-Sharqiya 219100 +3183 Khamis Mushayt SAU Asir 217900 +3184 Hail SAU Hail 176800 +3185 al-Kharj SAU Riad 152100 +3186 al-Khubar SAU al-Sharqiya 141700 +3187 Jubayl SAU al-Sharqiya 140800 +3188 Hafar al-Batin SAU al-Sharqiya 137800 +3189 al-Tuqba SAU al-Sharqiya 125700 +3190 Yanbu SAU Medina 119800 +3191 Abha SAU Asir 112300 +3192 Araar SAU al-Khudud al-Samaliy 108100 +3193 al-Qatif SAU al-Sharqiya 98900 +3194 al-Hawiya SAU Mekka 93900 +3195 Unayza SAU Qasim 91100 +3196 Najran SAU Najran 91000 +3197 Pikine SEN Cap-Vert 855287 +3198 Dakar SEN Cap-Vert 785071 +3199 Thies SEN Thies 248000 +3200 Kaolack SEN Kaolack 199000 +3201 Ziguinchor SEN Ziguinchor 192000 +3202 Rufisque SEN Cap-Vert 150000 +3203 Saint-Louis SEN Saint-Louis 132400 +3204 Mbour SEN Thies 109300 +3205 Diourbel SEN Diourbel 99400 +3206 Victoria SYC Mahe 41000 +3207 Freetown SLE Western 850000 +3208 Singapore SGP A 4017733 +3209 Bratislava SVK Bratislava 448292 +3210 Kodice SVK Vychodne Slovensko 241874 +3211 Predov SVK Vychodne Slovensko 93977 +3212 Ljubljana SVN Osrednjeslovenska 270986 +3213 Maribor SVN Podravska 115532 +3214 Mogadishu SOM Banaadir 997000 +3215 Hargeysa SOM Woqooyi Galbeed 90000 +3216 Kismaayo SOM Jubbada Hoose 90000 +3217 Colombo LKA Western 645000 +3218 Dehiwala LKA Western 203000 +3219 Moratuwa LKA Western 190000 +3220 Jaffna LKA Northern 149000 +3221 Kandy LKA Central 140000 +3222 Sri Jayawardenepura Kotte LKA Western 118000 +3223 Negombo LKA Western 100000 +3224 Omdurman SDN Khartum 1271403 +3225 Khartum SDN Khartum 947483 +3226 Sharq al-Nil SDN Khartum 700887 +3227 Port Sudan SDN al-Bahr al-Ahmar 308195 +3228 Kassala SDN Kassala 234622 +3229 Obeid SDN Kurdufan al-Shamaliy 229425 +3230 Nyala SDN Darfur al-Janubiya 227183 +3231 Wad Madani SDN al-Jazira 211362 +3232 al-Qadarif SDN al-Qadarif 191164 +3233 Kusti SDN al-Bahr al-Abyad 173599 +3234 al-Fashir SDN Darfur al-Shamaliya 141884 +3235 Juba SDN Bahr al-Jabal 114980 +3236 Helsinki [Helsingfors] FIN Newmaa 555474 +3237 Espoo FIN Newmaa 213271 +3238 Tampere FIN Pirkanmaa 195468 +3239 Vantaa FIN Newmaa 178471 +3240 Turku [Abo] FIN Varsinais-Suomi 172561 +3241 Oulu FIN Pohjois-Pohjanmaa 120753 +3242 Lahti FIN Paijat-Hame 96921 +3243 Paramaribo SUR Paramaribo 112000 +3244 Mbabane SWZ Hhohho 61000 +3245 Zurich CHE Zurich 336800 +3246 Geneve CHE Geneve 173500 +3247 Basel CHE Basel-Stadt 166700 +3248 Bern CHE Bern 122700 +3249 Lausanne CHE Vaud 114500 +3250 Damascus SYR Damascus 1347000 +3251 Aleppo SYR Aleppo 1261983 +3252 Hims SYR Hims 507404 +3253 Hama SYR Hama 343361 +3254 Latakia SYR Latakia 264563 +3255 al-Qamishliya SYR al-Hasaka 144286 +3256 Dayr al-Zawr SYR Dayr al-Zawr 140459 +3257 Jaramana SYR Damaskos 138469 +3258 Duma SYR Damaskos 131158 +3259 al-Raqqa SYR al-Raqqa 108020 +3260 Idlib SYR Idlib 91081 +3261 Dushanbe TJK Karotegin 524000 +3262 Khujand TJK Khujand 161500 +3263 Taipei TWN Taipei 2641312 +3264 Kaohsiung TWN Kaohsiung 1475505 +3265 Taichung TWN Taichung 940589 +3266 Tainan TWN Tainan 728060 +3267 Panchiao TWN Taipei 523850 +3268 Chungho TWN Taipei 392176 +3269 Keelung (Chilung) TWN Keelung 385201 +3270 Sanchung TWN Taipei 380084 +3271 Hsinchuang TWN Taipei 365048 +3272 Hsinchu TWN Hsinchu 361958 +3273 Chungli TWN Taoyuan 318649 +3274 Fengshan TWN Kaohsiung 318562 +3275 Taoyuan TWN Taoyuan 316438 +3276 Chiayi TWN Chiayi 265109 +3277 Hsintien TWN Taipei 263603 +3278 Changhwa TWN Changhwa 227715 +3279 Yungho TWN Taipei 227700 +3280 Tucheng TWN Taipei 224897 +3281 Pingtung TWN Pingtung 214727 +3282 Yungkang TWN Tainan 193005 +3283 Pingchen TWN Taoyuan 188344 +3284 Tali TWN Taichung 171940 +3285 Taiping TWN 165524 +3286 Pate TWN Taoyuan 161700 +3287 Fengyuan TWN Taichung 161032 +3288 Luchou TWN Taipei 160516 +3289 Hsichuh TWN Taipei 154976 +3290 Shulin TWN Taipei 151260 +3291 Yuanlin TWN Changhwa 126402 +3292 Yangmei TWN Taoyuan 126323 +3293 Taliao TWN 115897 +3294 Kueishan TWN 112195 +3295 Tanshui TWN Taipei 111882 +3296 Taitung TWN Taitung 111039 +3297 Hualien TWN Hualien 108407 +3298 Nantou TWN Nantou 104723 +3299 Lungtan TWN Taipei 103088 +3300 Touliu TWN Yunlin 98900 +3301 Tsaotun TWN Nantou 96800 +3302 Kangshan TWN Kaohsiung 92200 +3303 Ilan TWN Ilan 92000 +3304 Miaoli TWN Miaoli 90000 +3305 Dar es Salaam TZA Dar es Salaam 1747000 +3306 Dodoma TZA Dodoma 189000 +3307 Mwanza TZA Mwanza 172300 +3308 Zanzibar TZA Zanzibar West 157634 +3309 Tanga TZA Tanga 137400 +3310 Mbeya TZA Mbeya 130800 +3311 Morogoro TZA Morogoro 117800 +3312 Arusha TZA Arusha 102500 +3313 Moshi TZA Kilimanjaro 96800 +3314 Tabora TZA Tabora 92800 +3315 Kobenhavn DNK Kobenhavn 495699 +3316 Arhus DNK Arhus 284846 +3317 Odense DNK Fyn 183912 +3318 Aalborg DNK Nordjylland 161161 +3319 Frederiksberg DNK Frederiksberg 90327 +3320 Bangkok THA Bangkok 6320174 +3321 Nonthaburi THA Nonthaburi 292100 +3322 Nakhon Ratchasima THA Nakhon Ratchasima 181400 +3323 Chiang Mai THA Chiang Mai 171100 +3324 Udon Thani THA Udon Thani 158100 +3325 Hat Yai THA Songkhla 148632 +3326 Khon Kaen THA Khon Kaen 126500 +3327 Pak Kret THA Nonthaburi 126055 +3328 Nakhon Sawan THA Nakhon Sawan 123800 +3329 Ubon Ratchathani THA Ubon Ratchathani 116300 +3330 Songkhla THA Songkhla 94900 +3331 Nakhon Pathom THA Nakhon Pathom 94100 +3332 Lome TGO Maritime 375000 +3333 Fakaofo TKL Fakaofo 300 +3334 Nukualofa TON Tongatapu 22400 +3335 Chaguanas TTO Caroni 56601 +3336 Port-of-Spain TTO Port-of-Spain 43396 +3337 NDjamena TCD Chari-Baguirmi 530965 +3338 Moundou TCD Logone Occidental 99500 +3339 Praha CZE Hlavni mesto Praha 1181126 +3340 Brno CZE Jizni Morava 381862 +3341 Ostrava CZE Severni Morava 320041 +3342 Plzen CZE Zapadni Cechy 166759 +3343 Olomouc CZE Severni Morava 102702 +3344 Liberec CZE Severni Cechy 99155 +3345 Ceske Budejovice CZE Jizni Cechy 98186 +3346 Hradec Kralove CZE Vychodni Cechy 98080 +3347 Usti nad Labem CZE Severni Cechy 95491 +3348 Pardubice CZE Vychodni Cechy 91309 +3349 Tunis TUN Tunis 690600 +3350 Sfax TUN Sfax 257800 +3351 Ariana TUN Ariana 197000 +3352 Ettadhamen TUN Ariana 178600 +3353 Sousse TUN Sousse 145900 +3354 Kairouan TUN Kairouan 113100 +3355 Biserta TUN Biserta 108900 +3356 Gabes TUN Gabes 106600 +3357 Istanbul TUR Istanbul 8787958 +3358 Ankara TUR Ankara 3038159 +3359 Izmir TUR Izmir 2130359 +3360 Adana TUR Adana 1131198 +3361 Bursa TUR Bursa 1095842 +3362 Gaziantep TUR Gaziantep 789056 +3363 Konya TUR Konya 628364 +3364 Mersin (Icel) TUR Icel 587212 +3365 Antalya TUR Antalya 564914 +3366 Diyarbakir TUR Diyarbakir 479884 +3367 Kayseri TUR Kayseri 475657 +3368 Eskisehir TUR Eskisehir 470781 +3369 Sanliurfa TUR Sanliurfa 405905 +3370 Samsun TUR Samsun 339871 +3371 Malatya TUR Malatya 330312 +3372 Gebze TUR Kocaeli 264170 +3373 Denizli TUR Denizli 253848 +3374 Sivas TUR Sivas 246642 +3375 Erzurum TUR Erzurum 246535 +3376 Tarsus TUR Adana 246206 +3377 Kahramanmaras TUR Kahramanmaras 245772 +3378 Elazig TUR Elazig 228815 +3379 Van TUR Van 219319 +3380 Sultanbeyli TUR Istanbul 211068 +3381 Izmit (Kocaeli) TUR Kocaeli 210068 +3382 Manisa TUR Manisa 207148 +3383 Batman TUR Batman 203793 +3384 Balikesir TUR Balikesir 196382 +3385 Sakarya (Adapazari) TUR Sakarya 190641 +3386 Iskenderun TUR Hatay 153022 +3387 Osmaniye TUR Osmaniye 146003 +3388 Corum TUR Corum 145495 +3389 Kutahya TUR Kutahya 144761 +3390 Hatay (Antakya) TUR Hatay 143982 +3391 Kirikkale TUR Kirikkale 142044 +3392 Adiyaman TUR Adiyaman 141529 +3393 Trabzon TUR Trabzon 138234 +3394 Ordu TUR Ordu 133642 +3395 Aydin TUR Aydin 128651 +3396 Usak TUR Usak 128162 +3397 Edirne TUR Edirne 123383 +3398 Corlu TUR Tekirdag 123300 +3399 Isparta TUR Isparta 121911 +3400 Karabuk TUR Karabuk 118285 +3401 Kilis TUR Kilis 118245 +3402 Alanya TUR Antalya 117300 +3403 Kiziltepe TUR Mardin 112000 +3404 Zonguldak TUR Zonguldak 111542 +3405 Siirt TUR Siirt 107100 +3406 Viransehir TUR Sanliurfa 106400 +3407 Tekirdag TUR Tekirdag 106077 +3408 Karaman TUR Karaman 104200 +3409 Afyon TUR Afyon 103984 +3410 Aksaray TUR Aksaray 102681 +3411 Ceyhan TUR Adana 102412 +3412 Erzincan TUR Erzincan 102304 +3413 Bismil TUR Diyarbakir 101400 +3414 Nazilli TUR Aydin 99900 +3415 Tokat TUR Tokat 99500 +3416 Kars TUR Kars 93000 +3417 Inegol TUR Bursa 90500 +3418 Bandirma TUR Balikesir 90200 +3419 Ashgabat TKM Ahal 540600 +3420 Charjew TKM Lebap 189200 +3421 Dashhowuz TKM Dashhowuz 141800 +3422 Mary TKM Mary 101000 +3423 Cockburn Town TCA Grand Turk 4800 +3424 Funafuti TUV Funafuti 4600 +3425 Kampala UGA Central 890800 +3426 Kyiv UKR Kiova 2624000 +3427 Harkova [Harkiv] UKR Harkova 1500000 +3428 Dnipropetrovsk UKR Dnipropetrovsk 1103000 +3429 Donetsk UKR Donetsk 1050000 +3430 Odesa UKR Odesa 1011000 +3431 Zaporizzja UKR Zaporizzja 848000 +3432 Lviv UKR Lviv 788000 +3433 Kryvyi Rig UKR Dnipropetrovsk 703000 +3434 Mykolajiv UKR Mykolajiv 508000 +3435 Mariupol UKR Donetsk 490000 +3436 Lugansk UKR Lugansk 469000 +3437 Vinnytsja UKR Vinnytsja 391000 +3438 Makijivka UKR Donetsk 384000 +3439 Herson UKR Herson 353000 +3440 Sevastopol UKR Krim 348000 +3441 Simferopol UKR Krim 339000 +3442 Pultava [Poltava] UKR Pultava 313000 +3443 Tdernigiv UKR Tdernigiv 313000 +3444 Tderkasy UKR Tderkasy 309000 +3445 Gorlivka UKR Donetsk 299000 +3446 Zytomyr UKR Zytomyr 297000 +3447 Sumy UKR Sumy 294000 +3448 Dniprodzerzynsk UKR Dnipropetrovsk 270000 +3449 Kirovograd UKR Kirovograd 265000 +3450 Hmelnytskyi UKR Hmelnytskyi 262000 +3451 Tdernivtsi UKR Tdernivtsi 259000 +3452 Rivne UKR Rivne 245000 +3453 Krementduk UKR Pultava 239000 +3454 Ivano-Frankivsk UKR Ivano-Frankivsk 237000 +3455 Ternopil UKR Ternopil 236000 +3456 Lutsk UKR Volynia 217000 +3457 Bila Tserkva UKR Kiova 215000 +3458 Kramatorsk UKR Donetsk 186000 +3459 Melitopol UKR Zaporizzja 169000 +3460 Kertd UKR Krim 162000 +3461 Nikopol UKR Dnipropetrovsk 149000 +3462 Berdjansk UKR Zaporizzja 130000 +3463 Pavlograd UKR Dnipropetrovsk 127000 +3464 Sjeverodonetsk UKR Lugansk 127000 +3465 Slovjansk UKR Donetsk 127000 +3466 Uzgorod UKR Taka-Karpatia 127000 +3467 Altdevsk UKR Lugansk 119000 +3468 Lysytdansk UKR Lugansk 116000 +3469 Jevpatorija UKR Krim 112000 +3470 Kamjanets-Podilskyi UKR Hmelnytskyi 109000 +3471 Jenakijeve UKR Donetsk 105000 +3472 Krasnyi Lutd UKR Lugansk 101000 +3473 Stahanov UKR Lugansk 101000 +3474 Oleksandrija UKR Kirovograd 99000 +3475 Konotop UKR Sumy 96000 +3476 Kostjantynivka UKR Donetsk 95000 +3477 Berdytdiv UKR Zytomyr 90000 +3478 Izmajil UKR Odesa 90000 +3479 Gostka UKR Sumy 90000 +3480 Uman UKR Tderkasy 90000 +3481 Brovary UKR Kiova 89000 +3482 Mukatdeve UKR Taka-Karpatia 89000 +3483 Budapest HUN Budapest 1811552 +3484 Debrecen HUN Hajdu-Bihar 203648 +3485 Miskolc HUN Borsod-Abauj-Zemplen 172357 +3486 Szeged HUN Csongrad 158158 +3487 Pecs HUN Baranya 157332 +3488 Gyor HUN Gyor-Moson-Sopron 127119 +3489 Nyiregyhaza HUN Szabolcs-Szatmar-Ber 112419 +3490 Kecskemet HUN Bacs-Kiskun 105606 +3491 Szekesfehervar HUN Fejer 105119 +3492 Montevideo URY Montevideo 1236000 +3493 Noumea NCL A 76293 +3494 Auckland NZL Auckland 381800 +3495 Christchurch NZL Canterbury 324200 +3496 Manukau NZL Auckland 281800 +3497 North Shore NZL Auckland 187700 +3498 Waitakere NZL Auckland 170600 +3499 Wellington NZL Wellington 166700 +3500 Dunedin NZL Dunedin 119600 +3501 Hamilton NZL Hamilton 117100 +3502 Lower Hutt NZL Wellington 98100 +3503 Toskent UZB Toskent Shahri 2117500 +3504 Namangan UZB Namangan 370500 +3505 Samarkand UZB Samarkand 361800 +3506 Andijon UZB Andijon 318600 +3507 Buhoro UZB Buhoro 237100 +3508 Karsi UZB Qashqadaryo 194100 +3509 Nukus UZB Karakalpakistan 194100 +3510 KuKon UZB Fargona 190100 +3511 Fargona UZB Fargona 180500 +3512 Circik UZB Toskent 146400 +3513 Margilon UZB Fargona 140800 +3514 Urgenc UZB Khorazm 138900 +3515 Angren UZB Toskent 128000 +3516 Cizah UZB Cizah 124800 +3517 Navoi UZB Navoi 116300 +3518 Olmalik UZB Toskent 114900 +3519 Termiz UZB Surkhondaryo 109500 +3520 Minsk BLR Horad Minsk 1674000 +3521 Gomel BLR Gomel 475000 +3522 Mogiljov BLR Mogiljov 356000 +3523 Vitebsk BLR Vitebsk 340000 +3524 Grodno BLR Grodno 302000 +3525 Brest BLR Brest 286000 +3526 Bobruisk BLR Mogiljov 221000 +3527 Baranovitdi BLR Brest 167000 +3528 Borisov BLR Minsk 151000 +3529 Pinsk BLR Brest 130000 +3530 Orda BLR Vitebsk 124000 +3531 Mozyr BLR Gomel 110000 +3532 Novopolotsk BLR Vitebsk 106000 +3533 Lida BLR Grodno 101000 +3534 Soligorsk BLR Minsk 101000 +3535 Molodetdno BLR Minsk 97000 +3536 Mata-Utu WLF Wallis 1137 +3537 Port-Vila VUT Shefa 33700 +3538 Citta del Vaticano VAT A 455 +3539 Caracas VEN Distrito Federal 1975294 +3540 Maracaibo VEN Zulia 1304776 +3541 Barquisimeto VEN Lara 877239 +3542 Valencia VEN Carabobo 794246 +3543 Ciudad Guayana VEN Bolivar 663713 +3544 Petare VEN Miranda 488868 +3545 Maracay VEN Aragua 444443 +3546 Barcelona VEN Anzoategui 322267 +3547 Maturin VEN Monagas 319726 +3548 San Cristobal VEN Tachira 319373 +3549 Ciudad Bolivar VEN Bolivar 301107 +3550 Cumana VEN Sucre 293105 +3551 Merida VEN Merida 224887 +3552 Cabimas VEN Zulia 221329 +3553 Barinas VEN Barinas 217831 +3554 Turmero VEN Aragua 217499 +3555 Baruta VEN Miranda 207290 +3556 Puerto Cabello VEN Carabobo 187722 +3557 Santa Ana de Coro VEN Falcon 185766 +3558 Los Teques VEN Miranda 178784 +3559 Punto Fijo VEN Falcon 167215 +3560 Guarenas VEN Miranda 165889 +3561 Acarigua VEN Portuguesa 158954 +3562 Puerto La Cruz VEN Anzoategui 155700 +3563 Ciudad Losada VEN 134501 +3564 Guacara VEN Carabobo 131334 +3565 Valera VEN Trujillo 130281 +3566 Guanare VEN Portuguesa 125621 +3567 Carupano VEN Sucre 119639 +3568 Catia La Mar VEN Distrito Federal 117012 +3569 El Tigre VEN Anzoategui 116256 +3570 Guatire VEN Miranda 109121 +3571 Calabozo VEN Guarico 107146 +3572 Pozuelos VEN Anzoategui 105690 +3573 Ciudad Ojeda VEN Zulia 99354 +3574 Ocumare del Tuy VEN Miranda 97168 +3575 Valle de la Pascua VEN Guarico 95927 +3576 Araure VEN Portuguesa 94269 +3577 San Fernando de Apure VEN Apure 93809 +3578 San Felipe VEN Yaracuy 90940 +3579 El Limon VEN Aragua 90000 +3580 Moscow RUS Moscow (City) 8389200 +3581 St Petersburg RUS Pietari 4694000 +3582 Novosibirsk RUS Novosibirsk 1398800 +3583 Nizni Novgorod RUS Nizni Novgorod 1357000 +3584 Jekaterinburg RUS Sverdlovsk 1266300 +3585 Samara RUS Samara 1156100 +3586 Omsk RUS Omsk 1148900 +3587 Kazan RUS Tatarstan 1101000 +3588 Ufa RUS Badkortostan 1091200 +3589 Tdeljabinsk RUS Tdeljabinsk 1083200 +3590 Rostov-na-Donu RUS Rostov-na-Donu 1012700 +3591 Perm RUS Perm 1009700 +3592 Volgograd RUS Volgograd 993400 +3593 Voronez RUS Voronez 907700 +3594 Krasnojarsk RUS Krasnojarsk 875500 +3595 Saratov RUS Saratov 874000 +3596 Toljatti RUS Samara 722900 +3597 Uljanovsk RUS Uljanovsk 667400 +3598 Izevsk RUS Udmurtia 652800 +3599 Krasnodar RUS Krasnodar 639000 +3600 Jaroslavl RUS Jaroslavl 616700 +3601 Habarovsk RUS Habarovsk 609400 +3602 Vladivostok RUS Primorje 606200 +3603 Irkutsk RUS Irkutsk 593700 +3604 Barnaul RUS Altai 580100 +3605 Novokuznetsk RUS Kemerovo 561600 +3606 Penza RUS Penza 532200 +3607 Rjazan RUS Rjazan 529900 +3608 Orenburg RUS Orenburg 523600 +3609 Lipetsk RUS Lipetsk 521000 +3610 Nabereznyje Tdelny RUS Tatarstan 514700 +3611 Tula RUS Tula 506100 +3612 Tjumen RUS Tjumen 503400 +3613 Kemerovo RUS Kemerovo 492700 +3614 Astrahan RUS Astrahan 486100 +3615 Tomsk RUS Tomsk 482100 +3616 Kirov RUS Kirov 466200 +3617 Ivanovo RUS Ivanovo 459200 +3618 Tdeboksary RUS Tduvassia 459200 +3619 Brjansk RUS Brjansk 457400 +3620 Tver RUS Tver 454900 +3621 Kursk RUS Kursk 443500 +3622 Magnitogorsk RUS Tdeljabinsk 427900 +3623 Kaliningrad RUS Kaliningrad 424400 +3624 Nizni Tagil RUS Sverdlovsk 390900 +3625 Murmansk RUS Murmansk 376300 +3626 Ulan-Ude RUS Burjatia 370400 +3627 Kurgan RUS Kurgan 364700 +3628 Arkangeli RUS Arkangeli 361800 +3629 Sotdi RUS Krasnodar 358600 +3630 Smolensk RUS Smolensk 353400 +3631 Orjol RUS Orjol 344500 +3632 Stavropol RUS Stavropol 343300 +3633 Belgorod RUS Belgorod 342000 +3634 Kaluga RUS Kaluga 339300 +3635 Vladimir RUS Vladimir 337100 +3636 Mahatdkala RUS Dagestan 332800 +3637 Tderepovets RUS Vologda 324400 +3638 Saransk RUS Mordva 314800 +3639 Tambov RUS Tambov 312000 +3640 Vladikavkaz RUS North Ossetia-Alania 310100 +3641 Tdita RUS Tdita 309900 +3642 Vologda RUS Vologda 302500 +3643 Veliki Novgorod RUS Novgorod 299500 +3644 Komsomolsk-na-Amure RUS Habarovsk 291600 +3645 Kostroma RUS Kostroma 288100 +3646 Volzski RUS Volgograd 286900 +3647 Taganrog RUS Rostov-na-Donu 284400 +3648 Petroskoi RUS Karjala 282100 +3649 Bratsk RUS Irkutsk 277600 +3650 Dzerzinsk RUS Nizni Novgorod 277100 +3651 Surgut RUS Hanti-Mansia 274900 +3652 Orsk RUS Orenburg 273900 +3653 Sterlitamak RUS Badkortostan 265200 +3654 Angarsk RUS Irkutsk 264700 +3655 Jodkar-Ola RUS Marinmaa 249200 +3656 Rybinsk RUS Jaroslavl 239600 +3657 Prokopjevsk RUS Kemerovo 237300 +3658 Niznevartovsk RUS Hanti-Mansia 233900 +3659 Naltdik RUS Kabardi-Balkaria 233400 +3660 Syktyvkar RUS Komi 229700 +3661 Severodvinsk RUS Arkangeli 229300 +3662 Bijsk RUS Altai 225000 +3663 Niznekamsk RUS Tatarstan 223400 +3664 Blagovedtdensk RUS Amur 222000 +3665 Gahty RUS Rostov-na-Donu 221800 +3666 Staryi Oskol RUS Belgorod 213800 +3667 Zelenograd RUS Moscow (City) 207100 +3668 Balakovo RUS Saratov 206000 +3669 Novorossijsk RUS Krasnodar 203300 +3670 Pihkova RUS Pihkova 201500 +3671 Zlatoust RUS Tdeljabinsk 196900 +3672 Jakutsk RUS Saha (Jakutia) 195400 +3673 Podolsk RUS Moskova 194300 +3674 Petropavlovsk-Kamtdatski RUS Kamtdatka 194100 +3675 Kamensk-Uralski RUS Sverdlovsk 190600 +3676 Engels RUS Saratov 189000 +3677 Syzran RUS Samara 186900 +3678 Grozny RUS Tdetdenia 186000 +3679 Novotderkassk RUS Rostov-na-Donu 184400 +3680 Berezniki RUS Perm 181900 +3681 Juzno-Sahalinsk RUS Sahalin 179200 +3682 Volgodonsk RUS Rostov-na-Donu 178200 +3683 Abakan RUS Hakassia 169200 +3684 Maikop RUS Adygea 167300 +3685 Miass RUS Tdeljabinsk 166200 +3686 Armavir RUS Krasnodar 164900 +3687 Ljubertsy RUS Moskova 163900 +3688 Rubtsovsk RUS Altai 162600 +3689 Kovrov RUS Vladimir 159900 +3690 Nahodka RUS Primorje 157700 +3691 Ussurijsk RUS Primorje 157300 +3692 Salavat RUS Badkortostan 156800 +3693 Mytidtdi RUS Moskova 155700 +3694 Kolomna RUS Moskova 150700 +3695 Elektrostal RUS Moskova 147000 +3696 Murom RUS Vladimir 142400 +3697 Kolpino RUS Pietari 141200 +3698 Norilsk RUS Krasnojarsk 140800 +3699 Almetjevsk RUS Tatarstan 140700 +3700 Novomoskovsk RUS Tula 138100 +3701 Dimitrovgrad RUS Uljanovsk 137000 +3702 Pervouralsk RUS Sverdlovsk 136100 +3703 Himki RUS Moskova 133700 +3704 Baladiha RUS Moskova 132900 +3705 Nevinnomyssk RUS Stavropol 132600 +3706 Pjatigorsk RUS Stavropol 132500 +3707 Korolev RUS Moskova 132400 +3708 Serpuhov RUS Moskova 132000 +3709 Odintsovo RUS Moskova 127400 +3710 Orehovo-Zujevo RUS Moskova 124900 +3711 Kamydin RUS Volgograd 124600 +3712 Novotdeboksarsk RUS Tduvassia 123400 +3713 Tderkessk RUS Karatdai-Tderkessia 121700 +3714 Atdinsk RUS Krasnojarsk 121600 +3715 Magadan RUS Magadan 121000 +3716 Mitdurinsk RUS Tambov 120700 +3717 Kislovodsk RUS Stavropol 120400 +3718 Jelets RUS Lipetsk 119400 +3719 Seversk RUS Tomsk 118600 +3720 Noginsk RUS Moskova 117200 +3721 Velikije Luki RUS Pihkova 116300 +3722 Novokuibydevsk RUS Samara 116200 +3723 Neftekamsk RUS Badkortostan 115700 +3724 Leninsk-Kuznetski RUS Kemerovo 113800 +3725 Oktjabrski RUS Badkortostan 111500 +3726 Sergijev Posad RUS Moskova 111100 +3727 Arzamas RUS Nizni Novgorod 110700 +3728 Kiseljovsk RUS Kemerovo 110000 +3729 Novotroitsk RUS Orenburg 109600 +3730 Obninsk RUS Kaluga 108300 +3731 Kansk RUS Krasnojarsk 107400 +3732 Glazov RUS Udmurtia 106300 +3733 Solikamsk RUS Perm 106000 +3734 Sarapul RUS Udmurtia 105700 +3735 Ust-Ilimsk RUS Irkutsk 105200 +3736 Gtdolkovo RUS Moskova 104900 +3737 Mezduretdensk RUS Kemerovo 104400 +3738 Usolje-Sibirskoje RUS Irkutsk 103500 +3739 Elista RUS Kalmykia 103300 +3740 Novodahtinsk RUS Rostov-na-Donu 101900 +3741 Votkinsk RUS Udmurtia 101700 +3742 Kyzyl RUS Tyva 101100 +3743 Serov RUS Sverdlovsk 100400 +3744 Zelenodolsk RUS Tatarstan 100200 +3745 Zeleznodoroznyi RUS Moskova 100100 +3746 Kinedma RUS Ivanovo 100000 +3747 Kuznetsk RUS Penza 98200 +3748 Uhta RUS Komi 98000 +3749 Jessentuki RUS Stavropol 97900 +3750 Tobolsk RUS Tjumen 97600 +3751 Neftejugansk RUS Hanti-Mansia 97400 +3752 Bataisk RUS Rostov-na-Donu 97300 +3753 Nojabrsk RUS Yamalin Nenetsia 97300 +3754 Baladov RUS Saratov 97100 +3755 Zeleznogorsk RUS Kursk 96900 +3756 Zukovski RUS Moskova 96500 +3757 Anzero-Sudzensk RUS Kemerovo 96100 +3758 Bugulma RUS Tatarstan 94100 +3759 Zeleznogorsk RUS Krasnojarsk 94000 +3760 Novouralsk RUS Sverdlovsk 93300 +3761 Pudkin RUS Pietari 92900 +3762 Vorkuta RUS Komi 92600 +3763 Derbent RUS Dagestan 92300 +3764 Kirovo-Tdepetsk RUS Kirov 91600 +3765 Krasnogorsk RUS Moskova 91000 +3766 Klin RUS Moskova 90000 +3767 Tdaikovski RUS Perm 90000 +3768 Novyi Urengoi RUS Yamalin Nenetsia 89800 +3769 Ho Chi Minh City VNM Ho Chi Minh City 3980000 +3770 Hanoi VNM Hanoi 1410000 +3771 Haiphong VNM Haiphong 783133 +3772 Da Nang VNM Quang Nam-Da Nang 382674 +3773 Bien Hoa VNM Dong Nai 282095 +3774 Nha Trang VNM Khanh Hoa 221331 +3775 Hue VNM Thua Thien-Hue 219149 +3776 Can Tho VNM Can Tho 215587 +3777 Cam Pha VNM Quang Binh 209086 +3778 Nam Dinh VNM Nam Ha 171699 +3779 Quy Nhon VNM Binh Dinh 163385 +3780 Vung Tau VNM Ba Ria-Vung Tau 145145 +3781 Rach Gia VNM Kien Giang 141132 +3782 Long Xuyen VNM An Giang 132681 +3783 Thai Nguyen VNM Bac Thai 127643 +3784 Hong Gai VNM Quang Ninh 127484 +3785 Phan Thiet VNM Binh Thuan 114236 +3786 Cam Ranh VNM Khanh Hoa 114041 +3787 Vinh VNM Nghe An 112455 +3788 My Tho VNM Tien Giang 108404 +3789 Da Lat VNM Lam Dong 106409 +3790 Buon Ma Thuot VNM Dac Lac 97044 +3791 Tallinn EST Harjumaa 403981 +3792 Tartu EST Tartumaa 101246 +3793 New York USA New York 8008278 +3794 Los Angeles USA California 3694820 +3795 Chicago USA Illinois 2896016 +3796 Houston USA Texas 1953631 +3797 Philadelphia USA Pennsylvania 1517550 +3798 Phoenix USA Arizona 1321045 +3799 San Diego USA California 1223400 +3800 Dallas USA Texas 1188580 +3801 San Antonio USA Texas 1144646 +3802 Detroit USA Michigan 951270 +3803 San Jose USA California 894943 +3804 Indianapolis USA Indiana 791926 +3805 San Francisco USA California 776733 +3806 Jacksonville USA Florida 735167 +3807 Columbus USA Ohio 711470 +3808 Austin USA Texas 656562 +3809 Baltimore USA Maryland 651154 +3810 Memphis USA Tennessee 650100 +3811 Milwaukee USA Wisconsin 596974 +3812 Boston USA Massachusetts 589141 +3813 Washington USA District of Columbia 572059 +3814 Nashville-Davidson USA Tennessee 569891 +3815 El Paso USA Texas 563662 +3816 Seattle USA Washington 563374 +3817 Denver USA Colorado 554636 +3818 Charlotte USA North Carolina 540828 +3819 Fort Worth USA Texas 534694 +3820 Portland USA Oregon 529121 +3821 Oklahoma City USA Oklahoma 506132 +3822 Tucson USA Arizona 486699 +3823 New Orleans USA Louisiana 484674 +3824 Las Vegas USA Nevada 478434 +3825 Cleveland USA Ohio 478403 +3826 Long Beach USA California 461522 +3827 Albuquerque USA New Mexico 448607 +3828 Kansas City USA Missouri 441545 +3829 Fresno USA California 427652 +3830 Virginia Beach USA Virginia 425257 +3831 Atlanta USA Georgia 416474 +3832 Sacramento USA California 407018 +3833 Oakland USA California 399484 +3834 Mesa USA Arizona 396375 +3835 Tulsa USA Oklahoma 393049 +3836 Omaha USA Nebraska 390007 +3837 Minneapolis USA Minnesota 382618 +3838 Honolulu USA Hawaii 371657 +3839 Miami USA Florida 362470 +3840 Colorado Springs USA Colorado 360890 +3841 Saint Louis USA Missouri 348189 +3842 Wichita USA Kansas 344284 +3843 Santa Ana USA California 337977 +3844 Pittsburgh USA Pennsylvania 334563 +3845 Arlington USA Texas 332969 +3846 Cincinnati USA Ohio 331285 +3847 Anaheim USA California 328014 +3848 Toledo USA Ohio 313619 +3849 Tampa USA Florida 303447 +3850 Buffalo USA New York 292648 +3851 Saint Paul USA Minnesota 287151 +3852 Corpus Christi USA Texas 277454 +3853 Aurora USA Colorado 276393 +3854 Raleigh USA North Carolina 276093 +3855 Newark USA New Jersey 273546 +3856 Lexington-Fayette USA Kentucky 260512 +3857 Anchorage USA Alaska 260283 +3858 Louisville USA Kentucky 256231 +3859 Riverside USA California 255166 +3860 Saint Petersburg USA Florida 248232 +3861 Bakersfield USA California 247057 +3862 Stockton USA California 243771 +3863 Birmingham USA Alabama 242820 +3864 Jersey City USA New Jersey 240055 +3865 Norfolk USA Virginia 234403 +3866 Baton Rouge USA Louisiana 227818 +3867 Hialeah USA Florida 226419 +3868 Lincoln USA Nebraska 225581 +3869 Greensboro USA North Carolina 223891 +3870 Plano USA Texas 222030 +3871 Rochester USA New York 219773 +3872 Glendale USA Arizona 218812 +3873 Akron USA Ohio 217074 +3874 Garland USA Texas 215768 +3875 Madison USA Wisconsin 208054 +3876 Fort Wayne USA Indiana 205727 +3877 Fremont USA California 203413 +3878 Scottsdale USA Arizona 202705 +3879 Montgomery USA Alabama 201568 +3880 Shreveport USA Louisiana 200145 +3881 Augusta-Richmond County USA Georgia 199775 +3882 Lubbock USA Texas 199564 +3883 Chesapeake USA Virginia 199184 +3884 Mobile USA Alabama 198915 +3885 Des Moines USA Iowa 198682 +3886 Grand Rapids USA Michigan 197800 +3887 Richmond USA Virginia 197790 +3888 Yonkers USA New York 196086 +3889 Spokane USA Washington 195629 +3890 Glendale USA California 194973 +3891 Tacoma USA Washington 193556 +3892 Irving USA Texas 191615 +3893 Huntington Beach USA California 189594 +3894 Modesto USA California 188856 +3895 Durham USA North Carolina 187035 +3896 Columbus USA Georgia 186291 +3897 Orlando USA Florida 185951 +3898 Boise City USA Idaho 185787 +3899 Winston-Salem USA North Carolina 185776 +3900 San Bernardino USA California 185401 +3901 Jackson USA Mississippi 184256 +3902 Little Rock USA Arkansas 183133 +3903 Salt Lake City USA Utah 181743 +3904 Reno USA Nevada 180480 +3905 Newport News USA Virginia 180150 +3906 Chandler USA Arizona 176581 +3907 Laredo USA Texas 176576 +3908 Henderson USA Nevada 175381 +3909 Arlington USA Virginia 174838 +3910 Knoxville USA Tennessee 173890 +3911 Amarillo USA Texas 173627 +3912 Providence USA Rhode Island 173618 +3913 Chula Vista USA California 173556 +3914 Worcester USA Massachusetts 172648 +3915 Oxnard USA California 170358 +3916 Dayton USA Ohio 166179 +3917 Garden Grove USA California 165196 +3918 Oceanside USA California 161029 +3919 Tempe USA Arizona 158625 +3920 Huntsville USA Alabama 158216 +3921 Ontario USA California 158007 +3922 Chattanooga USA Tennessee 155554 +3923 Fort Lauderdale USA Florida 152397 +3924 Springfield USA Massachusetts 152082 +3925 Springfield USA Missouri 151580 +3926 Santa Clarita USA California 151088 +3927 Salinas USA California 151060 +3928 Tallahassee USA Florida 150624 +3929 Rockford USA Illinois 150115 +3930 Pomona USA California 149473 +3931 Metairie USA Louisiana 149428 +3932 Paterson USA New Jersey 149222 +3933 Overland Park USA Kansas 149080 +3934 Santa Rosa USA California 147595 +3935 Syracuse USA New York 147306 +3936 Kansas City USA Kansas 146866 +3937 Hampton USA Virginia 146437 +3938 Lakewood USA Colorado 144126 +3939 Vancouver USA Washington 143560 +3940 Irvine USA California 143072 +3941 Aurora USA Illinois 142990 +3942 Moreno Valley USA California 142381 +3943 Pasadena USA California 141674 +3944 Hayward USA California 140030 +3945 Brownsville USA Texas 139722 +3946 Bridgeport USA Connecticut 139529 +3947 Hollywood USA Florida 139357 +3948 Warren USA Michigan 138247 +3949 Torrance USA California 137946 +3950 Eugene USA Oregon 137893 +3951 Pembroke Pines USA Florida 137427 +3952 Salem USA Oregon 136924 +3953 Pasadena USA Texas 133936 +3954 Escondido USA California 133559 +3955 Sunnyvale USA California 131760 +3956 Savannah USA Georgia 131510 +3957 Fontana USA California 128929 +3958 Orange USA California 128821 +3959 Naperville USA Illinois 128358 +3960 Alexandria USA Virginia 128283 +3961 Rancho Cucamonga USA California 127743 +3962 Grand Prairie USA Texas 127427 +3963 East Los Angeles USA California 126379 +3964 Fullerton USA California 126003 +3965 Corona USA California 124966 +3966 Flint USA Michigan 124943 +3967 Paradise USA Nevada 124682 +3968 Mesquite USA Texas 124523 +3969 Sterling Heights USA Michigan 124471 +3970 Sioux Falls USA South Dakota 123975 +3971 New Haven USA Connecticut 123626 +3972 Topeka USA Kansas 122377 +3973 Concord USA California 121780 +3974 Evansville USA Indiana 121582 +3975 Hartford USA Connecticut 121578 +3976 Fayetteville USA North Carolina 121015 +3977 Cedar Rapids USA Iowa 120758 +3978 Elizabeth USA New Jersey 120568 +3979 Lansing USA Michigan 119128 +3980 Lancaster USA California 118718 +3981 Fort Collins USA Colorado 118652 +3982 Coral Springs USA Florida 117549 +3983 Stamford USA Connecticut 117083 +3984 Thousand Oaks USA California 117005 +3985 Vallejo USA California 116760 +3986 Palmdale USA California 116670 +3987 Columbia USA South Carolina 116278 +3988 El Monte USA California 115965 +3989 Abilene USA Texas 115930 +3990 North Las Vegas USA Nevada 115488 +3991 Ann Arbor USA Michigan 114024 +3992 Beaumont USA Texas 113866 +3993 Waco USA Texas 113726 +3994 Macon USA Georgia 113336 +3995 Independence USA Missouri 113288 +3996 Peoria USA Illinois 112936 +3997 Inglewood USA California 112580 +3998 Springfield USA Illinois 111454 +3999 Simi Valley USA California 111351 +4000 Lafayette USA Louisiana 110257 +4001 Gilbert USA Arizona 109697 +4002 Carrollton USA Texas 109576 +4003 Bellevue USA Washington 109569 +4004 West Valley City USA Utah 108896 +4005 Clarksville USA Tennessee 108787 +4006 Costa Mesa USA California 108724 +4007 Peoria USA Arizona 108364 +4008 South Bend USA Indiana 107789 +4009 Downey USA California 107323 +4010 Waterbury USA Connecticut 107271 +4011 Manchester USA New Hampshire 107006 +4012 Allentown USA Pennsylvania 106632 +4013 McAllen USA Texas 106414 +4014 Joliet USA Illinois 106221 +4015 Lowell USA Massachusetts 105167 +4016 Provo USA Utah 105166 +4017 West Covina USA California 105080 +4018 Wichita Falls USA Texas 104197 +4019 Erie USA Pennsylvania 103717 +4020 Daly City USA California 103621 +4021 Citrus Heights USA California 103455 +4022 Norwalk USA California 103298 +4023 Gary USA Indiana 102746 +4024 Berkeley USA California 102743 +4025 Santa Clara USA California 102361 +4026 Green Bay USA Wisconsin 102313 +4027 Cape Coral USA Florida 102286 +4028 Arvada USA Colorado 102153 +4029 Pueblo USA Colorado 102121 +4030 Sandy USA Utah 101853 +4031 Athens-Clarke County USA Georgia 101489 +4032 Cambridge USA Massachusetts 101355 +4033 Westminster USA Colorado 100940 +4034 San Buenaventura USA California 100916 +4035 Portsmouth USA Virginia 100565 +4036 Livonia USA Michigan 100545 +4037 Burbank USA California 100316 +4038 Clearwater USA Florida 99936 +4039 Midland USA Texas 98293 +4040 Davenport USA Iowa 98256 +4041 Mission Viejo USA California 98049 +4042 Miami Beach USA Florida 97855 +4043 Sunrise Manor USA Nevada 95362 +4044 New Bedford USA Massachusetts 94780 +4045 El Cajon USA California 94578 +4046 Norman USA Oklahoma 94193 +4047 Richmond USA California 94100 +4048 Albany USA New York 93994 +4049 Brockton USA Massachusetts 93653 +4050 Roanoke USA Virginia 93357 +4051 Billings USA Montana 92988 +4052 Compton USA California 92864 +4053 Gainesville USA Florida 92291 +4054 Fairfield USA California 92256 +4055 Arden-Arcade USA California 92040 +4056 San Mateo USA California 91799 +4057 Visalia USA California 91762 +4058 Boulder USA Colorado 91238 +4059 Cary USA North Carolina 91213 +4060 Santa Monica USA California 91084 +4061 Fall River USA Massachusetts 90555 +4062 Kenosha USA Wisconsin 89447 +4063 Elgin USA Illinois 89408 +4064 Odessa USA Texas 89293 +4065 Carson USA California 89089 +4066 Charleston USA South Carolina 89063 +4067 Charlotte Amalie VIR St Thomas 13000 +4068 Harare ZWE Harare 1410000 +4069 Bulawayo ZWE Bulawayo 621742 +4070 Chitungwiza ZWE Harare 274912 +4071 Mount Darwin ZWE Harare 164362 +4072 Mutare ZWE Manicaland 131367 +4073 Gweru ZWE Midlands 128037 +4074 Gaza PSE Gaza 353632 +4075 Khan Yunis PSE Khan Yunis 123175 +4076 Hebron PSE Hebron 119401 +4077 Jabaliya PSE North Gaza 113901 +4078 Nablus PSE Nablus 100231 +4079 Rafah PSE Rafah 92020 diff --git a/src/test/singlenode_regress/data/constrf.data b/src/test/singlenode_regress/data/constrf.data new file mode 100644 index 00000000000..6ae26eb4829 --- /dev/null +++ b/src/test/singlenode_regress/data/constrf.data @@ -0,0 +1,2 @@ +5 !check failed 6 +7 check failed 6 diff --git a/src/test/singlenode_regress/data/constro.data b/src/test/singlenode_regress/data/constro.data new file mode 100644 index 00000000000..00f8af4a30d --- /dev/null +++ b/src/test/singlenode_regress/data/constro.data @@ -0,0 +1,2 @@ +4 !check failed 5 +6 OK 4 diff --git a/src/test/singlenode_regress/data/country.data b/src/test/singlenode_regress/data/country.data new file mode 100644 index 00000000000..b52a78f1901 --- /dev/null +++ b/src/test/singlenode_regress/data/country.data @@ -0,0 +1,239 @@ +AFG Afghanistan Asia Southern and Central Asia 652090 1919 22720000 45.900002 5976.00 1 Afganistan/Afqanestan Islamic Emirate Mohammad Omar 1 AF +NLD Netherlands Europe Western Europe 41526 1581 15864000 78.300003 371362.00 360478.00 Nederland Constitutional Monarchy Beatrix 5 NL +ANT Netherlands Antilles North America Caribbean 800 217000 74.699997 1941.00 Nederlandse Antillen Nonmetropolitan Territory of The Netherlands Beatrix 33 AN +ALB Albania Europe Southern Europe 28748 1912 3401200 71.599998 3205.00 2500.00 Shqiperia Republic Rexhep Mejdani 34 AL +DZA Algeria Africa Northern Africa 2381741 1962 31471000 69.699997 49982.00 46966.00 Al-Jazaeir/Algerie Republic Abdelaziz Bouteflika 35 DZ +ASM American Samoa Oceania Polynesia 199 68000 75.099998 334.00 Amerika Samoa US Territory George W. Bush 54 AS +AND Andorra Europe Southern Europe 468 1278 78000 83.5 1630.00 Andorra Parliamentary Coprincipality 55 AD +AGO Angola Africa Central Africa 1246700 1975 12878000 38.299999 6648.00 7984.00 Angola Republic Jose Eduardo dos Santos 56 AO +AIA Anguilla North America Caribbean 96 8000 76.099998 63.20 Anguilla Dependent Territory of the UK Elisabeth II 62 AI +ATG Antigua and Barbuda North America Caribbean 442 1981 68000 70.5 612.00 584.00 Antigua and Barbuda Constitutional Monarchy Elisabeth II 63 AG +ARE United Arab Emirates Asia Middle East 83600 1971 2441000 74.099998 37966.00 36846.00 Al-Imarat al-Arabiya al-Muttahida Emirate Federation Zayid bin Sultan al-Nahayan 65 AE +ARG Argentina South America South America 2780400 1816 37032000 75.099998 340238.00 323310.00 Argentina Federal Republic Fernando de la Rua 69 AR +ARM Armenia Asia Middle East 29800 1991 3520000 66.400002 1813.00 1627.00 Hajastan Republic Robert Kotdarjan 126 AM +ABW Aruba North America Caribbean 193 103000 78.400002 828.00 793.00 Aruba Nonmetropolitan Territory of The Netherlands Beatrix 129 AW +AUS Australia Oceania Australia and New Zealand 7741220 1901 18886000 79.800003 351182.00 392911.00 Australia Constitutional Monarchy, Federation Elisabeth II 135 AU +AZE Azerbaijan Asia Middle East 86600 1991 7734000 62.900002 4127.00 4100.00 Azarbaycan Federal Republic Heydar Aliyev 144 AZ +BHS Bahamas North America Caribbean 13878 1973 307000 71.099998 3527.00 3347.00 The Bahamas Constitutional Monarchy Elisabeth II 148 BS +BHR Bahrain Asia Middle East 694 1971 617000 73 6366.00 6097.00 Al-Bahrayn Monarchy (Emirate) Hamad ibn Isa al-Khalifa 149 BH +BGD Bangladesh Asia Southern and Central Asia 143998 1971 129155000 60.200001 32852.00 31966.00 Bangladesh Republic Shahabuddin Ahmad 150 BD +BRB Barbados North America Caribbean 430 1966 270000 73 2223.00 2186.00 Barbados Constitutional Monarchy Elisabeth II 174 BB +BEL Belgium Europe Western Europe 30518 1830 10239000 77.800003 249704.00 243948.00 Belgie/Belgique Constitutional Monarchy, Federation Albert II 179 BE +BLZ Belize North America Central America 22696 1981 241000 70.900002 630.00 616.00 Belize Constitutional Monarchy Elisabeth II 185 BZ +BEN Benin Africa Western Africa 112622 1960 6097000 50.200001 2357.00 2141.00 Benin Republic Mathieu Kerekou 187 BJ +BMU Bermuda North America North America 53 65000 76.900002 2328.00 2190.00 Bermuda Dependent Territory of the UK Elisabeth II 191 BM +BTN Bhutan Asia Southern and Central Asia 47000 1910 2124000 52.400002 372.00 383.00 Druk-Yul Monarchy Jigme Singye Wangchuk 192 BT +BOL Bolivia South America South America 1098581 1825 8329000 63.700001 8571.00 7967.00 Bolivia Republic Hugo Banzer Suarez 194 BO +BIH Bosnia and Herzegovina Europe Southern Europe 51197 1992 3972000 71.5 2841.00 Bosna i Hercegovina Federal Republic Ante Jelavic 201 BA +BWA Botswana Africa Southern Africa 581730 1966 1622000 39.299999 4834.00 4935.00 Botswana Republic Festus G. Mogae 204 BW +BRA Brazil South America South America 8547403 1822 170115000 62.900002 776739.00 804108.00 Brasil Federal Republic Fernando Henrique Cardoso 211 BR +GBR United Kingdom Europe British Islands 242900 1066 59623400 77.699997 1378330.00 1296830.00 United Kingdom Constitutional Monarchy Elisabeth II 456 GB +VGB Virgin Islands, British North America Caribbean 151 21000 75.400002 612.00 573.00 British Virgin Islands Dependent Territory of the UK Elisabeth II 537 VG +BRN Brunei Asia Southeast Asia 5765 1984 328000 73.599998 11705.00 12460.00 Brunei Darussalam Monarchy (Sultanate) Haji Hassan al-Bolkiah 538 BN +BGR Bulgaria Europe Eastern Europe 110994 1908 8190900 70.900002 12178.00 10169.00 Balgarija Republic Petar Stojanov 539 BG +BFA Burkina Faso Africa Western Africa 274000 1960 11937000 46.700001 2425.00 2201.00 Burkina Faso Republic Blaise Compaore 549 BF +BDI Burundi Africa Eastern Africa 27834 1962 6695000 46.200001 903.00 982.00 Burundi/Uburundi Republic Pierre Buyoya 552 BI +CYM Cayman Islands North America Caribbean 264 38000 78.900002 1263.00 1186.00 Cayman Islands Dependent Territory of the UK Elisabeth II 553 KY +CHL Chile South America South America 756626 1810 15211000 75.699997 72949.00 75780.00 Chile Republic Ricardo Lagos Escobar 554 CL +COK Cook Islands Oceania Polynesia 236 20000 71.099998 100.00 The Cook Islands Nonmetropolitan Territory of New Zealand Elisabeth II 583 CK +CRI Costa Rica North America Central America 51100 1821 4023000 75.800003 10226.00 9757.00 Costa Rica Republic Miguel Angel Rodriguez Echeverria 584 CR +DJI Djibouti Africa Eastern Africa 23200 1977 638000 50.799999 382.00 373.00 Djibouti/Jibuti Republic Ismail Omar Guelleh 585 DJ +DMA Dominica North America Caribbean 751 1978 71000 73.400002 256.00 243.00 Dominica Republic Vernon Shaw 586 DM +DOM Dominican Republic North America Caribbean 48511 1844 8495000 73.199997 15846.00 15076.00 Republica Dominicana Republic Hipolito Mejia Dominguez 587 DO +ECU Ecuador South America South America 283561 1822 12646000 71.099998 19770.00 19769.00 Ecuador Republic Gustavo Noboa Bejarano 594 EC +EGY Egypt Africa Northern Africa 1001449 1922 68470000 63.299999 82710.00 75617.00 Misr Republic Hosni Mubarak 608 EG +SLV El Salvador North America Central America 21041 1841 6276000 69.699997 11863.00 11203.00 El Salvador Republic Francisco Guillermo Flores Perez 645 SV +ERI Eritrea Africa Eastern Africa 117600 1993 3850000 55.799999 650.00 755.00 Ertra Republic Isayas Afewerki [Isaias Afwerki] 652 ER +ESP Spain Europe Southern Europe 505992 1492 39441700 78.800003 553233.00 532031.00 Espaaa Constitutional Monarchy Juan Carlos I 653 ES +ZAF South Africa Africa Southern Africa 1221037 1910 40377000 51.099998 116729.00 129092.00 South Africa Republic Thabo Mbeki 716 ZA +ETH Ethiopia Africa Eastern Africa 1104300 -1000 62565000 45.200001 6353.00 6180.00 YeItyopiya Republic Negasso Gidada 756 ET +FLK Falkland Islands South America South America 12173 2000 0.00 Falkland Islands Dependent Territory of the UK Elisabeth II 763 FK +FJI Fiji Islands Oceania Melanesia 18274 1970 817000 67.900002 1536.00 2149.00 Fiji Islands Republic Josefa Iloilo 764 FJ +PHL Philippines Asia Southeast Asia 300000 1946 75967000 67.5 65107.00 82239.00 Pilipinas Republic Gloria Macapagal-Arroyo 766 PH +FRO Faroe Islands Europe Nordic Countries 1399 43000 78.400002 0.00 Foroyar Part of Denmark Margrethe II 901 FO +GAB Gabon Africa Central Africa 267668 1960 1226000 50.099998 5493.00 5279.00 Le Gabon Republic Omar Bongo 902 GA +GMB Gambia Africa Western Africa 11295 1965 1305000 53.200001 320.00 325.00 The Gambia Republic Yahya Jammeh 904 GM +GEO Georgia Asia Middle East 69700 1991 4968000 64.5 6064.00 5924.00 Sakartvelo Republic Eduard Gevardnadze 905 GE +GHA Ghana Africa Western Africa 238533 1957 20212000 57.400002 7137.00 6884.00 Ghana Republic John Kufuor 910 GH +GIB Gibraltar Europe Southern Europe 6 25000 79 258.00 Gibraltar Dependent Territory of the UK Elisabeth II 915 GI +GRD Grenada North America Caribbean 344 1974 94000 64.5 318.00 Grenada Constitutional Monarchy Elisabeth II 916 GD +GRL Greenland North America North America 2166090 56000 68.099998 0.00 Kalaallit Nunaat/Gronland Part of Denmark Margrethe II 917 GL +GLP Guadeloupe North America Caribbean 1705 456000 77 3501.00 Guadeloupe Overseas Department of France Jacques Chirac 919 GP +GUM Guam Oceania Micronesia 549 168000 77.800003 1197.00 1136.00 Guam US Territory George W. Bush 921 GU +GTM Guatemala North America Central America 108889 1821 11385000 66.199997 19008.00 17797.00 Guatemala Republic Alfonso Portillo Cabrera 922 GT +GIN Guinea Africa Western Africa 245857 1958 7430000 45.599998 2352.00 2383.00 Guinee Republic Lansana Conte 926 GN +GNB Guinea-Bissau Africa Western Africa 36125 1974 1213000 49 293.00 272.00 Guine-Bissau Republic Kumba Iala 927 GW +GUY Guyana South America South America 214969 1966 861000 64 722.00 743.00 Guyana Republic Bharrat Jagdeo 928 GY +HTI Haiti North America Caribbean 27750 1804 8222000 49.200001 3459.00 3107.00 Haiti/Dayti Republic Jean-Bertrand Aristide 929 HT +HND Honduras North America Central America 112088 1838 6485000 69.900002 5333.00 4697.00 Honduras Republic Carlos Roberto Flores Facusse 933 HN +HKG Hong Kong Asia Eastern Asia 1075 6782000 79.5 166448.00 173610.00 Xianggang/Hong Kong Special Administrative Region of China Jiang Zemin 937 HK +SJM Svalbard and Jan Mayen Europe Nordic Countries 62422 3200 0.00 Svalbard og Jan Mayen Dependent Territory of Norway Harald V 938 SJ +IDN Indonesia Asia Southeast Asia 1904569 1945 212107000 68 84982.00 215002.00 Indonesia Republic Abdurrahman Wahid 939 ID +IND India Asia Southern and Central Asia 3287263 1947 1013662000 62.5 447114.00 430572.00 Bharat/India Federal Republic Kocheril Raman Narayanan 1109 IN +IRQ Iraq Asia Middle East 438317 1932 23115000 66.5 11500.00 Al-Iraq Republic Saddam Hussein al-Takriti 1365 IQ +IRN Iran Asia Southern and Central Asia 1648195 1906 67702000 69.699997 195746.00 160151.00 Iran Islamic Republic Ali Mohammad Khatami-Ardakani 1380 IR +IRL Ireland Europe British Islands 70273 1921 3775100 76.800003 75921.00 73132.00 Ireland/Eire Republic Mary McAleese 1447 IE +ISL Iceland Europe Nordic Countries 103000 1944 279000 79.400002 8255.00 7474.00 Island Republic Olafur Ragnar Grimsson 1449 IS +ISR Israel Asia Middle East 21056 1948 6217000 78.599998 97477.00 98577.00 Yisraeel/Israeil Republic Moshe Katzav 1450 IL +ITA Italy Europe Southern Europe 301316 1861 57680000 79 1161755.00 1145372.00 Italia Republic Carlo Azeglio Ciampi 1464 IT +TMP East Timor Asia Southeast Asia 14874 885000 46 0.00 Timor Timur Administrated by the UN Jose Alexandre Gusmao 1522 TP +AUT Austria Europe Western Europe 83859 1918 8091800 77.699997 211860.00 206025.00 Osterreich Federal Republic Thomas Klestil 1523 AT +JAM Jamaica North America Caribbean 10990 1962 2583000 75.199997 6871.00 6722.00 Jamaica Constitutional Monarchy Elisabeth II 1530 JM +JPN Japan Asia Eastern Asia 377829 -660 126714000 80.699997 3787042.00 4192638.00 Nihon/Nippon Constitutional Monarchy Akihito 1532 JP +YEM Yemen Asia Middle East 527968 1918 18112000 59.799999 6041.00 5729.00 Al-Yaman Republic Ali Abdallah Salih 1780 YE +JOR Jordan Asia Middle East 88946 1946 5083000 77.400002 7526.00 7051.00 Al-Urdunn Constitutional Monarchy Abdullah II 1786 JO +CXR Christmas Island Oceania Australia and New Zealand 135 2500 0.00 Christmas Island Territory of Australia Elisabeth II 1791 CX +YUG Yugoslavia Europe Southern Europe 102173 1918 10640000 72.400002 17000.00 Jugoslavija Federal Republic Vojislav Kodtunica 1792 YU +KHM Cambodia Asia Southeast Asia 181035 1953 11168000 56.5 5121.00 5670.00 Kampuchea Constitutional Monarchy Norodom Sihanouk 1800 KH +CMR Cameroon Africa Central Africa 475442 1960 15085000 54.799999 9174.00 8596.00 Cameroun/Cameroon Republic Paul Biya 1804 CM +CAN Canada North America North America 9970610 1867 31147000 79.400002 598862.00 625626.00 Canada Constitutional Monarchy, Federation Elisabeth II 1822 CA +CPV Cape Verde Africa Western Africa 4033 1975 428000 68.900002 435.00 420.00 Cabo Verde Republic Antonio Mascarenhas Monteiro 1859 CV +KAZ Kazakstan Asia Southern and Central Asia 2724900 1991 16223000 63.200001 24375.00 23383.00 Qazaqstan Republic Nursultan Nazarbajev 1864 KZ +KEN Kenya Africa Eastern Africa 580367 1963 30080000 48 9217.00 10241.00 Kenya Republic Daniel arap Moi 1881 KE +CAF Central African Republic Africa Central Africa 622984 1960 3615000 44 1054.00 993.00 Centrafrique/Be-Afrika Republic Ange-Felix Patasse 1889 CF +CHN China Asia Eastern Asia 9572900 -1523 1277558000 71.400002 982268.00 917719.00 Zhongquo People'sRepublic Jiang Zemin 1891 CN +KGZ Kyrgyzstan Asia Southern and Central Asia 199900 1991 4699000 63.400002 1626.00 1767.00 Kyrgyzstan Republic Askar Akajev 2253 KG +KIR Kiribati Oceania Micronesia 726 1979 83000 59.799999 40.70 Kiribati Republic Teburoro Tito 2256 KI +COL Colombia South America South America 1138914 1810 42321000 70.300003 102896.00 105116.00 Colombia Republic Andres Pastrana Arango 2257 CO +COM Comoros Africa Eastern Africa 1862 1975 578000 60 4401.00 4361.00 Komori/Comores Republic Azali Assoumani 2295 KM +COG Congo Africa Central Africa 342000 1960 2943000 47.400002 2108.00 2287.00 Congo Republic Denis Sassou-Nguesso 2296 CG +COD Congo, The Democratic Republic of the Africa Central Africa 2344858 1960 51654000 48.799999 6964.00 2474.00 Republique Democratique du Congo Republic Joseph Kabila 2298 CD +CCK Cocos (Keeling) Islands Oceania Australia and New Zealand 14 600 0.00 Cocos (Keeling) Islands Territory of Australia Elisabeth II 2317 CC +PRK North Korea Asia Eastern Asia 120538 1948 24039000 70.699997 5332.00 Choson Minjujuui Inmin Konghwaguk (Bukhan) Socialistic Republic Kim Jong-il 2318 KP +KOR South Korea Asia Eastern Asia 99434 1948 46844000 74.400002 320749.00 442544.00 Taehan Mineguk (Namhan) Republic Kim Dae-jung 2331 KR +GRC Greece Europe Southern Europe 131626 1830 10545700 78.400002 120724.00 119946.00 Ellada Republic Kostis Stefanopoulos 2401 GR +HRV Croatia Europe Southern Europe 56538 1991 4473000 73.699997 20208.00 19300.00 Hrvatska Republic Gtipe Mesic 2409 HR +CUB Cuba North America Caribbean 110861 1902 11201000 76.199997 17843.00 18862.00 Cuba Socialistic Republic Fidel Castro Ruz 2413 CU +KWT Kuwait Asia Middle East 17818 1961 1972000 76.099998 27037.00 30373.00 Al-Kuwayt Constitutional Monarchy (Emirate) Jabir al-Ahmad al-Jabir al-Sabah 2429 KW +CYP Cyprus Asia Middle East 9251 1960 754700 76.699997 9333.00 8246.00 Kypros/Kibris Republic Glafkos Klerides 2430 CY +LAO Laos Asia Southeast Asia 236800 1953 5433000 53.099998 1292.00 1746.00 Lao Republic Khamtay Siphandone 2432 LA +LVA Latvia Europe Baltic Countries 64589 1991 2424200 68.400002 6398.00 5639.00 Latvija Republic Vaira Vike-Freiberga 2434 LV +LSO Lesotho Africa Southern Africa 30355 1966 2153000 50.799999 1061.00 1161.00 Lesotho Constitutional Monarchy Letsie III 2437 LS +LBN Lebanon Asia Middle East 10400 1941 3282000 71.300003 17121.00 15129.00 Lubnan Republic Emile Lahoud 2438 LB +LBR Liberia Africa Western Africa 111369 1847 3154000 51 2012.00 Liberia Republic Charles Taylor 2440 LR +LBY Libyan Arab Jamahiriya Africa Northern Africa 1759540 1951 5605000 75.5 44806.00 40562.00 Libiya Socialistic State Muammar al-Qadhafi 2441 LY +LIE Liechtenstein Europe Western Europe 160 1806 32300 78.800003 1119.00 1084.00 Liechtenstein Constitutional Monarchy Hans-Adam II 2446 LI +LTU Lithuania Europe Baltic Countries 65301 1991 3698500 69.099998 10692.00 9585.00 Lietuva Republic Valdas Adamkus 2447 LT +LUX Luxembourg Europe Western Europe 2586 1867 435700 77.099998 16321.00 15519.00 Luxembourg/Letzebuerg Constitutional Monarchy Henri 2452 LU +ESH Western Sahara Africa Northern Africa 266000 293000 49.799999 60.00 As-Sahrawiya Occupied by Marocco Mohammed Abdel Aziz 2453 EH +MAC Macao Asia Eastern Asia 18 473000 81.599998 5749.00 5940.00 Macau/Aomen Special Administrative Region of China Jiang Zemin 2454 MO +MDG Madagascar Africa Eastern Africa 587041 1960 15942000 55 3750.00 3545.00 Madagasikara/Madagascar Federal Republic Didier Ratsiraka 2455 MG +MKD Macedonia Europe Southern Europe 25713 1991 2024000 73.800003 1694.00 1915.00 Makedonija Republic Boris Trajkovski 2460 MK +MWI Malawi Africa Eastern Africa 118484 1964 10925000 37.599998 1687.00 2527.00 Malawi Republic Bakili Muluzi 2462 MW +MDV Maldives Asia Southern and Central Asia 298 1965 286000 62.200001 199.00 Dhivehi Raajje/Maldives Republic Maumoon Abdul Gayoom 2463 MV +MYS Malaysia Asia Southeast Asia 329758 1957 22244000 70.800003 69213.00 97884.00 Malaysia Constitutional Monarchy, Federation Salahuddin Abdul Aziz Shah Alhaj 2464 MY +MLI Mali Africa Western Africa 1240192 1960 11234000 46.700001 2642.00 2453.00 Mali Republic Alpha Oumar Konare 2482 ML +MLT Malta Europe Southern Europe 316 1964 380200 77.900002 3512.00 3338.00 Malta Republic Guido de Marco 2484 MT +MAR Morocco Africa Northern Africa 446550 1956 28351000 69.099998 36124.00 33514.00 Al-Maghrib Constitutional Monarchy Mohammed VI 2486 MA +MHL Marshall Islands Oceania Micronesia 181 1990 64000 65.5 97.00 Marshall Islands/Majol Republic Kessai Note 2507 MH +MTQ Martinique North America Caribbean 1102 395000 78.300003 2731.00 2559.00 Martinique Overseas Department of France Jacques Chirac 2508 MQ +MRT Mauritania Africa Western Africa 1025520 1960 2670000 50.799999 998.00 1081.00 Muritaniya/Mauritanie Republic Maaouiya Ould SidAhmad Taya 2509 MR +MUS Mauritius Africa Eastern Africa 2040 1968 1158000 71 4251.00 4186.00 Mauritius Republic Cassam Uteem 2511 MU +MYT Mayotte Africa Eastern Africa 373 149000 59.5 0.00 Mayotte Territorial Collectivity of France Jacques Chirac 2514 YT +MEX Mexico North America Central America 1958201 1810 98881000 71.5 414972.00 401461.00 Mexico Federal Republic Vicente Fox Quesada 2515 MX +FSM Micronesia, Federated States of Oceania Micronesia 702 1990 119000 68.599998 212.00 Micronesia Federal Republic Leo A. Falcam 2689 FM +MDA Moldova Europe Eastern Europe 33851 1991 4380000 64.5 1579.00 1872.00 Moldova Republic Vladimir Voronin 2690 MD +MCO Monaco Europe Western Europe 1.5 1861 34000 78.800003 776.00 Monaco Constitutional Monarchy Rainier III 2695 MC +MNG Mongolia Asia Eastern Asia 1566500 1921 2662000 67.300003 1043.00 933.00 Mongol Uls Republic Natsagiin Bagabandi 2696 MN +MSR Montserrat North America Caribbean 102 11000 78 109.00 Montserrat Dependent Territory of the UK Elisabeth II 2697 MS +MOZ Mozambique Africa Eastern Africa 801590 1975 19680000 37.5 2891.00 2711.00 Mocambique Republic Joaquim A. Chissano 2698 MZ +MMR Myanmar Asia Southeast Asia 676578 1948 45611000 54.900002 180375.00 171028.00 Myanma Pye Republic kenraali Than Shwe 2710 MM +NAM Namibia Africa Southern Africa 824292 1990 1726000 42.5 3101.00 3384.00 Namibia Republic Sam Nujoma 2726 NA +NRU Nauru Oceania Micronesia 21 1968 12000 60.799999 197.00 Naoero/Nauru Republic Bernard Dowiyogo 2728 NR +NPL Nepal Asia Southern and Central Asia 147181 1769 23930000 57.799999 4768.00 4837.00 Nepal Constitutional Monarchy Gyanendra Bir Bikram 2729 NP +NIC Nicaragua North America Central America 130000 1838 5074000 68.699997 1988.00 2023.00 Nicaragua Republic Arnoldo Aleman Lacayo 2734 NI +NER Niger Africa Western Africa 1267000 1960 10730000 41.299999 1706.00 1580.00 Niger Republic Mamadou Tandja 2738 NE +NGA Nigeria Africa Western Africa 923768 1960 111506000 51.599998 65707.00 58623.00 Nigeria Federal Republic Olusegun Obasanjo 2754 NG +NIU Niue Oceania Polynesia 260 2000 0.00 Niue Nonmetropolitan Territory of New Zealand Elisabeth II 2805 NU +NFK Norfolk Island Oceania Australia and New Zealand 36 2000 0.00 Norfolk Island Territory of Australia Elisabeth II 2806 NF +NOR Norway Europe Nordic Countries 323877 1905 4478500 78.699997 145895.00 153370.00 Norge Constitutional Monarchy Harald V 2807 NO +CIV Cote deIvoire Africa Western Africa 322463 1960 14786000 45.200001 11345.00 10285.00 Cote deIvoire Republic Laurent Gbagbo 2814 CI +OMN Oman Asia Middle East 309500 1951 2542000 71.800003 16904.00 16153.00 Uman Monarchy (Sultanate) Qabus ibn Said 2821 OM +PAK Pakistan Asia Southern and Central Asia 796095 1947 156483000 61.099998 61289.00 58549.00 Pakistan Republic Mohammad Rafiq Tarar 2831 PK +PLW Palau Oceania Micronesia 459 1994 19000 68.599998 105.00 Belau/Palau Republic Kuniwo Nakamura 2881 PW +PAN Panama North America Central America 75517 1903 2856000 75.5 9131.00 8700.00 Panama Republic Mireya Elisa Moscoso Rodriguez 2882 PA +PNG Papua New Guinea Oceania Melanesia 462840 1975 4807000 63.099998 4988.00 6328.00 Papua New Guinea/Papua Niugini Constitutional Monarchy Elisabeth II 2884 PG +PRY Paraguay South America South America 406752 1811 5496000 73.699997 8444.00 9555.00 Paraguay Republic Luis Angel Gonzalez Macchi 2885 PY +PER Peru South America South America 1285216 1821 25662000 70 64140.00 65186.00 Peru/Piruw Republic Valentin Paniagua Corazao 2890 PE +PCN Pitcairn Oceania Polynesia 49 50 0.00 Pitcairn Dependent Territory of the UK Elisabeth II 2912 PN +MNP Northern Mariana Islands Oceania Micronesia 464 78000 75.5 0.00 Northern Mariana Islands Commonwealth of the US George W. Bush 2913 MP +PRT Portugal Europe Southern Europe 91982 1143 9997600 75.800003 105954.00 102133.00 Portugal Republic Jorge Sampaio 2914 PT +PRI Puerto Rico North America Caribbean 8875 3869000 75.599998 34100.00 32100.00 Puerto Rico Commonwealth of the US George W. Bush 2919 PR +POL Poland Europe Eastern Europe 323250 1918 38653600 73.199997 151697.00 135636.00 Polska Republic Aleksander Kwasniewski 2928 PL +GNQ Equatorial Guinea Africa Central Africa 28051 1968 453000 53.599998 283.00 542.00 Guinea Ecuatorial Republic Teodoro Obiang Nguema Mbasogo 2972 GQ +QAT Qatar Asia Middle East 11000 1971 599000 72.400002 9472.00 8920.00 Qatar Monarchy Hamad ibn Khalifa al-Thani 2973 QA +FRA France Europe Western Europe 551500 843 59225700 78.800003 1424285.00 1392448.00 France Republic Jacques Chirac 2974 FR +GUF French Guiana South America South America 90000 181000 76.099998 681.00 Guyane francaise Overseas Department of France Jacques Chirac 3014 GF +PYF French Polynesia Oceania Polynesia 4000 235000 74.800003 818.00 781.00 Polynesie francaise Nonmetropolitan Territory of France Jacques Chirac 3016 PF +REU Reunion Africa Eastern Africa 2510 699000 72.699997 8287.00 7988.00 Reunion Overseas Department of France Jacques Chirac 3017 RE +ROM Romania Europe Eastern Europe 238391 1878 22455500 69.900002 38158.00 34843.00 Romania Republic Ion Iliescu 3018 RO +RWA Rwanda Africa Eastern Africa 26338 1962 7733000 39.299999 2036.00 1863.00 Rwanda/Urwanda Republic Paul Kagame 3047 RW +SWE Sweden Europe Nordic Countries 449964 836 8861400 79.599998 226492.00 227757.00 Sverige Constitutional Monarchy Carl XVI Gustaf 3048 SE +SHN Saint Helena Africa Western Africa 314 6000 76.800003 0.00 Saint Helena Dependent Territory of the UK Elisabeth II 3063 SH +KNA Saint Kitts and Nevis North America Caribbean 261 1983 38000 70.699997 299.00 Saint Kitts and Nevis Constitutional Monarchy Elisabeth II 3064 KN +LCA Saint Lucia North America Caribbean 622 1979 154000 72.300003 571.00 Saint Lucia Constitutional Monarchy Elisabeth II 3065 LC +VCT Saint Vincent and the Grenadines North America Caribbean 388 1979 114000 72.300003 285.00 Saint Vincent and the Grenadines Constitutional Monarchy Elisabeth II 3066 VC +SPM Saint Pierre and Miquelon North America North America 242 7000 77.599998 0.00 Saint-Pierre-et-Miquelon Territorial Collectivity of France Jacques Chirac 3067 PM +DEU Germany Europe Western Europe 357022 1955 82164700 77.400002 2133367.00 2102826.00 Deutschland Federal Republic Johannes Rau 3068 DE +SLB Solomon Islands Oceania Melanesia 28896 1978 444000 71.300003 182.00 220.00 Solomon Islands Constitutional Monarchy Elisabeth II 3161 SB +ZMB Zambia Africa Eastern Africa 752618 1964 9169000 37.200001 3377.00 3922.00 Zambia Republic Frederick Chiluba 3162 ZM +WSM Samoa Oceania Polynesia 2831 1962 180000 69.199997 141.00 157.00 Samoa Parlementary Monarchy Malietoa Tanumafili II 3169 WS +SMR San Marino Europe Southern Europe 61 885 27000 81.099998 510.00 San Marino Republic 3171 SM +STP Sao Tome and Principe Africa Central Africa 964 1975 147000 65.300003 6.00 Sao Tome e Principe Republic Miguel Trovoada 3172 ST +SAU Saudi Arabia Asia Middle East 2149690 1932 21607000 67.800003 137635.00 146171.00 Al-Arabiya as-Saudiya Monarchy Fahd ibn Abdul-Aziz al-Saud 3173 SA +SEN Senegal Africa Western Africa 196722 1960 9481000 62.200001 4787.00 4542.00 Senegal/Sounougal Republic Abdoulaye Wade 3198 SN +SYC Seychelles Africa Eastern Africa 455 1976 77000 70.400002 536.00 539.00 Sesel/Seychelles Republic France-Albert Rene 3206 SC +SLE Sierra Leone Africa Western Africa 71740 1961 4854000 45.299999 746.00 858.00 Sierra Leone Republic Ahmed Tejan Kabbah 3207 SL +SGP Singapore Asia Southeast Asia 618 1965 3567000 80.099998 86503.00 96318.00 Singapore/Singapura/Xinjiapo/Singapur Republic Sellapan Rama Nathan 3208 SG +SVK Slovakia Europe Eastern Europe 49012 1993 5398700 73.699997 20594.00 19452.00 Slovensko Republic Rudolf Schuster 3209 SK +SVN Slovenia Europe Southern Europe 20256 1991 1987800 74.900002 19756.00 18202.00 Slovenija Republic Milan Kucan 3212 SI +SOM Somalia Africa Eastern Africa 637657 1960 10097000 46.200001 935.00 Soomaaliya Republic Abdiqassim Salad Hassan 3214 SO +LKA Sri Lanka Asia Southern and Central Asia 65610 1948 18827000 71.800003 15706.00 15091.00 Sri Lanka/Ilankai Republic Chandrika Kumaratunga 3217 LK +SDN Sudan Africa Northern Africa 2505813 1956 29490000 56.599998 10162.00 As-Sudan Islamic Republic Omar Hassan Ahmad al-Bashir 3225 SD +FIN Finland Europe Nordic Countries 338145 1917 5171300 77.400002 121914.00 119833.00 Suomi Republic Tarja Halonen 3236 FI +SUR Suriname South America South America 163265 1975 417000 71.400002 870.00 706.00 Suriname Republic Ronald Venetiaan 3243 SR +SWZ Swaziland Africa Southern Africa 17364 1968 1008000 40.400002 1206.00 1312.00 kaNgwane Monarchy Mswati III 3244 SZ +CHE Switzerland Europe Western Europe 41284 1499 7160400 79.599998 264478.00 256092.00 Schweiz/Suisse/Svizzera/Svizra Federation Adolf Ogi 3248 CH +SYR Syria Asia Middle East 185180 1941 16125000 68.5 65984.00 64926.00 Suriya Republic Bashar al-Assad 3250 SY +TJK Tajikistan Asia Southern and Central Asia 143100 1991 6188000 64.099998 1990.00 1056.00 Tocikiston Republic Emomali Rahmonov 3261 TJ +TWN Taiwan Asia Eastern Asia 36188 1945 22256000 76.400002 256254.00 263451.00 Teai-wan Republic Chen Shui-bian 3263 TW +TZA Tanzania Africa Eastern Africa 883749 1961 33517000 52.299999 8005.00 7388.00 Tanzania Republic Benjamin William Mkapa 3306 TZ +DNK Denmark Europe Nordic Countries 43094 800 5330000 76.5 174099.00 169264.00 Danmark Constitutional Monarchy Margrethe II 3315 DK +THA Thailand Asia Southeast Asia 513115 1350 61399000 68.599998 116416.00 153907.00 Prathet Thai Constitutional Monarchy Bhumibol Adulyadej 3320 TH +TGO Togo Africa Western Africa 56785 1960 4629000 54.700001 1449.00 1400.00 Togo Republic Gnassingbe Eyadema 3332 TG +TKL Tokelau Oceania Polynesia 12 2000 0.00 Tokelau Nonmetropolitan Territory of New Zealand Elisabeth II 3333 TK +TON Tonga Oceania Polynesia 650 1970 99000 67.900002 146.00 170.00 Tonga Monarchy Taufa'ahau Tupou IV 3334 TO +TTO Trinidad and Tobago North America Caribbean 5130 1962 1295000 68 6232.00 5867.00 Trinidad and Tobago Republic Arthur N. R. Robinson 3336 TT +TCD Chad Africa Central Africa 1284000 1960 7651000 50.5 1208.00 1102.00 Tchad/Tshad Republic Idriss Deby 3337 TD +CZE Czech Republic Europe Eastern Europe 78866 1993 10278100 74.5 55017.00 52037.00 esko Republic Vaclav Havel 3339 CZ +TUN Tunisia Africa Northern Africa 163610 1956 9586000 73.699997 20026.00 18898.00 Tunis/Tunisie Republic Zine al-Abidine Ben Ali 3349 TN +TUR Turkey Asia Middle East 774815 1923 66591000 71 210721.00 189122.00 Turkiye Republic Ahmet Necdet Sezer 3358 TR +TKM Turkmenistan Asia Southern and Central Asia 488100 1991 4459000 60.900002 4397.00 2000.00 Turkmenostan Republic Saparmurad Nijazov 3419 TM +TCA Turks and Caicos Islands North America Caribbean 430 17000 73.300003 96.00 The Turks and Caicos Islands Dependent Territory of the UK Elisabeth II 3423 TC +TUV Tuvalu Oceania Polynesia 26 1978 12000 66.300003 6.00 Tuvalu Constitutional Monarchy Elisabeth II 3424 TV +UGA Uganda Africa Eastern Africa 241038 1962 21778000 42.900002 6313.00 6887.00 Uganda Republic Yoweri Museveni 3425 UG +UKR Ukraine Europe Eastern Europe 603700 1991 50456000 66 42168.00 49677.00 Ukrajina Republic Leonid Kutdma 3426 UA +HUN Hungary Europe Eastern Europe 93030 1918 10043200 71.400002 48267.00 45914.00 Magyarorszag Republic Ferenc Madl 3483 HU +URY Uruguay South America South America 175016 1828 3337000 75.199997 20831.00 19967.00 Uruguay Republic Jorge Batlle Ibaaez 3492 UY +NCL New Caledonia Oceania Melanesia 18575 214000 72.800003 3563.00 Nouvelle-Caledonie Nonmetropolitan Territory of France Jacques Chirac 3493 NC +NZL New Zealand Oceania Australia and New Zealand 270534 1907 3862000 77.800003 54669.00 64960.00 New Zealand/Aotearoa Constitutional Monarchy Elisabeth II 3499 NZ +UZB Uzbekistan Asia Southern and Central Asia 447400 1991 24318000 63.700001 14194.00 21300.00 Uzbekiston Republic Islam Karimov 3503 UZ +BLR Belarus Europe Eastern Europe 207600 1991 10236000 68 13714.00 Belarus Republic Aljaksandr Lukadenka 3520 BY +WLF Wallis and Futuna Oceania Polynesia 200 15000 0.00 Wallis-et-Futuna Nonmetropolitan Territory of France Jacques Chirac 3536 WF +VUT Vanuatu Oceania Melanesia 12189 1980 190000 60.599998 261.00 246.00 Vanuatu Republic John Bani 3537 VU +VAT Holy See (Vatican City State) Europe Southern Europe 0.40000001 1929 1000 9.00 Santa Sede/Citta del Vaticano Independent Church State Johannes Paavali II 3538 VA +VEN Venezuela South America South America 912050 1811 24170000 73.099998 95023.00 88434.00 Venezuela Federal Republic Hugo Chavez Frias 3539 VE +RUS Russian Federation Europe Eastern Europe 17075400 1991 146934000 67.199997 276608.00 442989.00 Rossija Federal Republic Vladimir Putin 3580 RU +VNM Vietnam Asia Southeast Asia 331689 1945 79832000 69.300003 21929.00 22834.00 Viet Nam Socialistic Republic Tran Duc Luong 3770 VN +EST Estonia Europe Baltic Countries 45227 1991 1439200 69.5 5328.00 3371.00 Eesti Republic Lennart Meri 3791 EE +USA United States North America North America 9363520 1776 278357000 77.099998 8510700.00 8110900.00 United States Federal Republic George W. Bush 3813 US +VIR Virgin Islands, U.S. North America Caribbean 347 93000 78.099998 0.00 Virgin Islands of the United States US Territory George W. Bush 4067 VI +ZWE Zimbabwe Africa Eastern Africa 390757 1980 11669000 37.799999 5951.00 8670.00 Zimbabwe Republic Robert G. Mugabe 4068 ZW +PSE Palestine Asia Middle East 6257 3101000 71.400002 4173.00 Filastin Autonomous Area Yasser (Yasir) Arafat 4074 PS +ATA Antarctica Antarctica Antarctica 13120000 0 0.00 A Co-administrated AQ +BVT Bouvet Island Antarctica Antarctica 59 0 0.00 Bouvetoya Dependent Territory of Norway Harald V BV +IOT British Indian Ocean Territory Africa Eastern Africa 78 0 0.00 British Indian Ocean Territory Dependent Territory of the UK Elisabeth II IO +SGS South Georgia and the South Sandwich Islands Antarctica Antarctica 3903 0 0.00 South Georgia and the South Sandwich Islands Dependent Territory of the UK Elisabeth II GS +HMD Heard Island and McDonald Islands Antarctica Antarctica 359 0 0.00 Heard and McDonald Islands Territory of Australia Elisabeth II HM +ATF French Southern territories Antarctica Antarctica 7780 0 0.00 Terres australes francaises Nonmetropolitan Territory of France Jacques Chirac TF +UMI United States Minor Outlying Islands Oceania Micronesia/Caribbean 16 0 0.00 United States Minor Outlying Islands Dependent Territory of the US George W. Bush UM diff --git a/src/test/singlenode_regress/data/countrylanguage.data b/src/test/singlenode_regress/data/countrylanguage.data new file mode 100644 index 00000000000..01a8e8653b4 --- /dev/null +++ b/src/test/singlenode_regress/data/countrylanguage.data @@ -0,0 +1,984 @@ +AFG Pashto t 52.400002 +NLD Dutch t 95.599998 +ANT Papiamento t 86.199997 +ALB Albaniana t 97.900002 +DZA Arabic t 86 +ASM Samoan t 90.599998 +AND Spanish f 44.599998 +AGO Ovimbundu f 37.200001 +AIA English t 0 +ATG Creole English f 95.699997 +ARE Arabic t 42 +ARG Spanish t 96.800003 +ARM Armenian t 93.400002 +ABW Papiamento f 76.699997 +AUS English t 81.199997 +AZE Azerbaijani t 89 +BHS Creole English f 89.699997 +BHR Arabic t 67.699997 +BGD Bengali t 97.699997 +BRB Bajan f 95.099998 +BEL Dutch t 59.200001 +BLZ English t 50.799999 +BEN Fon f 39.799999 +BMU English t 100 +BTN Dzongkha t 50 +BOL Spanish t 87.699997 +BIH Serbo-Croatian t 99.199997 +BWA Tswana f 75.5 +BRA Portuguese t 97.5 +GBR English t 97.300003 +VGB English t 0 +BRN Malay t 45.5 +BGR Bulgariana t 83.199997 +BFA Mossi f 50.200001 +BDI Kirundi t 98.099998 +CYM English t 0 +CHL Spanish t 89.699997 +COK Maori t 0 +CRI Spanish t 97.5 +DJI Somali f 43.900002 +DMA Creole English f 100 +DOM Spanish t 98 +ECU Spanish t 93 +EGY Arabic t 98.800003 +SLV Spanish t 100 +ERI Tigrinja t 49.099998 +ESP Spanish t 74.400002 +ZAF Zulu t 22.700001 +ETH Oromo f 31 +FLK English t 0 +FJI Fijian t 50.799999 +PHL Pilipino t 29.299999 +FRO Faroese t 100 +GAB Fang f 35.799999 +GMB Malinke f 34.099998 +GEO Georgiana t 71.699997 +GHA Akan f 52.400002 +GIB English t 88.900002 +GRD Creole English f 100 +GRL Greenlandic t 87.5 +GLP Creole French f 95 +GUM English t 37.5 +GTM Spanish t 64.699997 +GIN Ful f 38.599998 +GNB Crioulo f 36.400002 +GUY Creole English f 96.400002 +HTI Haiti Creole f 100 +HND Spanish t 97.199997 +HKG Canton Chinese f 88.699997 +SJM Norwegian t 0 +IDN Javanese f 39.400002 +IND Hindi t 39.900002 +IRQ Arabic t 77.199997 +IRN Persian t 45.700001 +IRL English t 98.400002 +ISL Icelandic t 95.699997 +ISR Hebrew t 63.099998 +ITA Italian t 94.099998 +TMP Sunda f 0 +AUT German t 92 +JAM Creole English f 94.199997 +JPN Japanese t 99.099998 +YEM Arabic t 99.599998 +JOR Arabic t 97.900002 +CXR Chinese f 0 +YUG Serbo-Croatian t 75.199997 +KHM Khmer t 88.599998 +CMR Fang f 19.700001 +CAN English t 60.400002 +CPV Crioulo f 100 +KAZ Kazakh t 46 +KEN Kikuyu f 20.9 +CAF Gbaya f 23.799999 +CHN Chinese t 92 +KGZ Kirgiz t 59.700001 +KIR Kiribati t 98.900002 +COL Spanish t 99 +COM Comorian t 75 +COG Kongo f 51.5 +COD Luba f 18 +CCK Malay f 0 +PRK Korean t 99.900002 +KOR Korean t 99.900002 +GRC Greek t 98.5 +HRV Serbo-Croatian t 95.900002 +CUB Spanish t 100 +KWT Arabic t 78.099998 +CYP Greek t 74.099998 +LAO Lao t 67.199997 +LVA Latvian t 55.099998 +LSO Sotho t 85 +LBN Arabic t 93 +LBR Kpelle f 19.5 +LBY Arabic t 96 +LIE German t 89 +LTU Lithuanian t 81.599998 +LUX Luxembourgish t 64.400002 +ESH Arabic t 100 +MAC Canton Chinese f 85.599998 +MDG Malagasy t 98.900002 +MKD Macedonian t 66.5 +MWI Chichewa t 58.299999 +MDV Dhivehi t 100 +MYS Malay t 58.400002 +MLI Bambara f 31.799999 +MLT Maltese t 95.800003 +MAR Arabic t 65 +MHL Marshallese t 96.800003 +MTQ Creole French f 96.599998 +MRT Hassaniya f 81.699997 +MUS Creole French f 70.599998 +MYT Mahore f 41.900002 +MEX Spanish t 92.099998 +FSM Trukese f 41.599998 +MDA Romanian t 61.900002 +MCO French t 41.900002 +MNG Mongolian t 78.800003 +MSR English t 0 +MOZ Makua f 27.799999 +MMR Burmese t 69 +NAM Ovambo f 50.700001 +NRU Nauru t 57.5 +NPL Nepali t 50.400002 +NIC Spanish t 97.599998 +NER Hausa f 53.099998 +NGA Joruba f 21.4 +NIU Niue f 0 +NFK English t 0 +NOR Norwegian t 96.599998 +CIV Akan f 30 +OMN Arabic t 76.699997 +PAK Punjabi f 48.200001 +PLW Palau t 82.199997 +PAN Spanish t 76.800003 +PNG Papuan Languages f 78.099998 +PRY Spanish t 55.099998 +PER Spanish t 79.800003 +PCN Pitcairnese f 0 +MNP Philippene Languages f 34.099998 +PRT Portuguese t 99 +PRI Spanish t 51.299999 +POL Polish t 97.599998 +GNQ Fang f 84.800003 +QAT Arabic t 40.700001 +FRA French t 93.599998 +GUF Creole French f 94.300003 +PYF Tahitian f 46.400002 +REU Creole French f 91.5 +ROM Romanian t 90.699997 +RWA Rwanda t 100 +SWE Swedish t 89.5 +SHN English t 0 +KNA Creole English f 100 +LCA Creole French f 80 +VCT Creole English f 99.099998 +SPM French t 0 +DEU German t 91.300003 +SLB Malenasian Languages f 85.599998 +ZMB Bemba f 29.700001 +WSM Samoan-English f 52 +SMR Italian t 100 +STP Crioulo f 86.300003 +SAU Arabic t 95 +SEN Wolof t 48.099998 +SYC Seselwa f 91.300003 +SLE Mende f 34.799999 +SGP Chinese t 77.099998 +SVK Slovak t 85.599998 +SVN Slovene t 87.900002 +SOM Somali t 98.300003 +LKA Singali t 60.299999 +SDN Arabic t 49.400002 +FIN Finnish t 92.699997 +SUR Sranantonga f 81 +SWZ Swazi t 89.900002 +CHE German t 63.599998 +SYR Arabic t 90 +TJK Tadzhik t 62.200001 +TWN Min f 66.699997 +TZA Nyamwesi f 21.1 +DNK Danish t 93.5 +THA Thai t 52.599998 +TGO Ewe t 23.200001 +TKL Tokelau f 0 +TON Tongan t 98.300003 +TTO English f 93.5 +TCD Sara f 27.700001 +CZE Czech t 81.199997 +TUN Arabic t 69.900002 +TUR Turkish t 87.599998 +TKM Turkmenian t 76.699997 +TCA English t 0 +TUV Tuvalu t 92.5 +UGA Ganda f 18.1 +UKR Ukrainian t 64.699997 +HUN Hungarian t 98.5 +URY Spanish t 95.699997 +NCL Malenasian Languages f 45.400002 +NZL English t 87 +UZB Uzbek t 72.599998 +BLR Belorussian t 65.599998 +WLF Wallis f 0 +VUT Bislama t 56.599998 +VAT Italian t 0 +VEN Spanish t 96.900002 +RUS Russian t 86.599998 +VNM Vietnamese t 86.800003 +EST Estonian t 65.300003 +USA English t 86.199997 +VIR English t 81.699997 +UMI English t 0 +ZWE Shona f 72.099998 +PSE Arabic f 95.900002 +AFG Dari t 32.099998 +NLD Fries f 3.7 +ANT English f 7.8000002 +ALB Greek f 1.8 +DZA Berberi f 14 +ASM English t 3.0999999 +AND Catalan t 32.299999 +AGO Mbundu f 21.6 +ATG English t 0 +ARE Hindi f 0 +ARG Italian f 1.7 +ARM Azerbaijani f 2.5999999 +ABW English f 9.5 +AUS Italian f 2.2 +AZE Russian f 3 +BHS Creole French f 10.3 +BHR English f 0 +BGD Chakma f 0.40000001 +BRB English t 0 +BEL French t 32.599998 +BLZ Spanish f 31.6 +BEN Joruba f 12.2 +BTN Nepali f 34.799999 +BOL Ketdua t 8.1000004 +BWA Shona f 12.3 +BRA German f 0.5 +GBR Kymri f 0.89999998 +BRN Malay-English f 28.799999 +BGR Turkish f 9.3999996 +BFA Ful f 9.6999998 +BDI French t 0 +CHL Araucan f 9.6000004 +COK English f 0 +CRI Creole English f 2 +DJI Afar f 34.799999 +DMA Creole French f 0 +DOM Creole French f 2 +ECU Ketdua f 7 +EGY Sinaberberi f 0 +SLV Nahua f 0 +ERI Tigre f 31.700001 +ESP Catalan f 16.9 +ZAF Xhosa t 17.700001 +ETH Amhara f 30 +FJI Hindi f 43.700001 +PHL Cebuano f 23.299999 +FRO Danish t 0 +GAB Punu-sira-nzebi f 17.1 +GMB Ful f 16.200001 +GEO Russian f 8.8000002 +GHA Mossi f 15.8 +GIB Arabic f 7.4000001 +GRL Danish t 12.5 +GLP French t 0 +GUM Chamorro t 29.6 +GTM Quiche f 10.1 +GIN Malinke f 23.200001 +GNB Ful f 16.6 +GUY Caribbean f 2.2 +HTI French t 0 +HND Garifuna f 1.3 +HKG English t 2.2 +SJM Russian f 0 +IDN Sunda f 15.8 +IND Bengali f 8.1999998 +IRQ Kurdish f 19 +IRN Azerbaijani f 16.799999 +IRL Irish t 1.6 +ISL English f 0 +ISR Arabic t 18 +ITA Sardinian f 2.7 +TMP Portuguese t 0 +AUT Serbo-Croatian f 2.2 +JAM Hindi f 1.9 +JPN Korean f 0.5 +YEM Soqutri f 0 +JOR Circassian f 1 +CXR English t 0 +YUG Albaniana f 16.5 +KHM Vietnamese f 5.5 +CMR Bamileke-bamum f 18.6 +CAN French t 23.4 +CPV Portuguese t 0 +KAZ Russian f 34.700001 +KEN Luhya f 13.8 +CAF Banda f 23.5 +CHN Zhuang f 1.4 +KGZ Russian t 16.200001 +KIR Tuvalu f 0.5 +COL Chibcha f 0.40000001 +COM Comorian-French f 12.9 +COG Teke f 17.299999 +COD Kongo f 16 +CCK English t 0 +PRK Chinese f 0.1 +KOR Chinese f 0.1 +GRC Turkish f 0.89999998 +HRV Slovene f 0 +KWT English f 0 +CYP Turkish t 22.4 +LAO Mon-khmer f 16.5 +LVA Russian f 32.5 +LSO Zulu f 15 +LBN Armenian f 5.9000001 +LBR Bassa f 13.7 +LBY Berberi f 1 +LIE Italian f 2.5 +LTU Russian f 8.1000004 +LUX Portuguese f 13 +MAC Portuguese t 2.3 +MDG French t 0 +MKD Albaniana f 22.9 +MWI Lomwe f 18.4 +MDV English f 0 +MYS Chinese f 9 +MLI Ful f 13.9 +MLT English t 2.0999999 +MAR Berberi f 33 +MHL English t 0 +MTQ French t 0 +MRT Wolof f 6.5999999 +MUS Bhojpuri f 21.1 +MYT French t 20.299999 +MEX Nahuatl f 1.8 +FSM Pohnpei f 23.799999 +MDA Russian f 23.200001 +MCO Monegasque f 16.1 +MNG Kazakh f 5.9000001 +MOZ Tsonga f 12.4 +MMR Shan f 8.5 +NAM Nama f 12.4 +NRU Kiribati f 17.9 +NPL Maithili f 11.9 +NIC Miskito f 1.6 +NER Songhai-zerma f 21.200001 +NGA Hausa f 21.1 +NIU English t 0 +NOR English f 0.5 +CIV Gur f 11.7 +OMN Balochi f 0 +PAK Pashto f 13.1 +PLW Philippene Languages f 9.1999998 +PAN Creole English f 14 +PNG Malenasian Languages f 20 +PRY Guarani t 40.099998 +PER Ketdua t 16.4 +MNP Chamorro f 30 +PRI English f 47.400002 +POL German f 1.3 +GNQ Bubi f 8.6999998 +QAT Urdu f 0 +FRA Arabic f 2.5 +GUF Indian Languages f 1.9 +PYF French t 40.799999 +REU Chinese f 2.8 +ROM Hungarian f 7.1999998 +RWA French t 0 +SWE Finnish f 2.4000001 +KNA English t 0 +LCA English t 20 +VCT English t 0 +DEU Turkish f 2.5999999 +SLB Papuan Languages f 8.6000004 +ZMB Tongan f 11 +WSM Samoan t 47.5 +STP French f 0.69999999 +SEN Ful f 21.700001 +SYC English t 3.8 +SLE Temne f 31.799999 +SGP Malay t 14.1 +SVK Hungarian f 10.5 +SVN Serbo-Croatian f 7.9000001 +SOM Arabic t 0 +LKA Tamil t 19.6 +SDN Dinka f 11.5 +FIN Swedish t 5.6999998 +SUR Hindi f 0 +SWZ Zulu f 2 +CHE French t 19.200001 +SYR Kurdish f 9 +TJK Uzbek f 23.200001 +TWN Mandarin Chinese t 20.1 +TZA Swahili t 8.8000002 +DNK Turkish f 0.80000001 +THA Lao f 26.9 +TGO Kabye t 13.8 +TKL English t 0 +TON English t 0 +TTO Hindi f 3.4000001 +TCD Arabic t 12.3 +CZE Moravian f 12.9 +TUN Arabic-French f 26.299999 +TUR Kurdish f 10.6 +TKM Uzbek f 9.1999998 +TUV Kiribati f 7.5 +UGA Nkole f 10.7 +UKR Russian f 32.900002 +HUN Romani f 0.5 +NCL French t 34.299999 +NZL Maori f 4.3000002 +UZB Russian f 10.9 +BLR Russian t 32 +WLF Futuna f 0 +VUT English t 28.299999 +VEN Goajiro f 0.40000001 +RUS Tatar f 3.2 +VNM Tho f 1.8 +EST Russian f 27.799999 +USA Spanish f 7.5 +VIR Spanish f 13.3 +ZWE Ndebele f 16.200001 +PSE Hebrew f 4.0999999 +AFG Uzbek f 8.8000002 +NLD Arabic f 0.89999998 +ANT Dutch t 0 +ALB Macedonian f 0.1 +ASM Tongan f 3.0999999 +AND Portuguese f 10.8 +AGO Kongo f 13.2 +ARG Indian Languages f 0.30000001 +ABW Spanish f 7.4000001 +AUS Greek f 1.6 +AZE Lezgian f 2.3 +BGD Marma f 0.2 +BEL Italian f 2.4000001 +BLZ Maya Languages f 9.6000004 +BEN Adja f 11.1 +BTN Asami f 15.2 +BOL Aimara t 3.2 +BWA San f 3.5 +BRA Italian f 0.40000001 +GBR Gaeli f 0.1 +BRN Chinese f 9.3000002 +BGR Romani f 3.7 +BFA Gurma f 5.6999998 +BDI Swahili f 0 +CHL Aimara f 0.5 +CRI Chibcha f 0.30000001 +DJI Arabic t 10.6 +ERI Afar f 4.3000002 +ESP Galecian f 6.4000001 +ZAF Afrikaans t 14.3 +ETH Tigrinja f 7.1999998 +PHL Ilocano f 9.3000002 +GAB Mpongwe f 14.6 +GMB Wolof f 12.6 +GEO Armenian f 6.8000002 +GHA Ewe f 11.9 +GUM Philippene Languages f 19.700001 +GTM Cakchiquel f 8.8999996 +GIN Susu f 11 +GNB Balante f 14.6 +GUY Arawakan f 1.4 +HND Creole English f 0.2 +HKG Fukien f 1.9 +IDN Malay t 12.1 +IND Telugu f 7.8000002 +IRQ Azerbaijani f 1.7 +IRN Kurdish f 9.1000004 +ISR Russian f 8.8999996 +ITA Friuli f 1.2 +AUT Turkish f 1.5 +JPN Chinese f 0.2 +JOR Armenian f 1 +YUG Hungarian f 3.4000001 +KHM Chinese f 3.0999999 +CMR Duala f 10.9 +CAN Chinese f 2.5 +KAZ Ukrainian f 5 +KEN Luo f 12.8 +CAF Mandjia f 14.8 +CHN Mantdu f 0.89999998 +KGZ Uzbek f 14.1 +COL Creole English f 0.1 +COM Comorian-madagassi f 5.5 +COG Mboshi f 11.4 +COD Mongo f 13.5 +LAO Thai f 7.8000002 +LVA Belorussian f 4.0999999 +LSO English t 0 +LBN French f 0 +LBR Grebo f 8.8999996 +LIE Turkish f 2.5 +LTU Polish f 7 +LUX Italian f 4.5999999 +MAC Mandarin Chinese f 1.2 +MKD Turkish f 4 +MWI Yao f 13.2 +MYS Tamil f 3.9000001 +MLI Senufo and Minianka f 12 +MRT Tukulor f 5.4000001 +MUS French f 3.4000001 +MYT Malagasy f 16.1 +MEX Yucatec f 1.1 +FSM Mortlock f 7.5999999 +MDA Ukrainian f 8.6000004 +MCO Italian f 16.1 +MNG Dorbet f 2.7 +MOZ Sena f 9.3999996 +MMR Karen f 6.1999998 +NAM Kavango f 9.6999998 +NRU Chinese f 8.5 +NPL Bhojpuri f 7.5 +NIC Creole English f 0.5 +NER Tamashek f 10.4 +NGA Ibo f 18.1 +NOR Danish f 0.40000001 +CIV Malinke f 11.4 +PAK Sindhi f 11.8 +PLW English t 3.2 +PAN Guaymi f 5.3000002 +PRY Portuguese f 3.2 +PER Aimara t 2.3 +MNP Chinese f 7.0999999 +POL Ukrainian f 0.60000002 +FRA Portuguese f 1.2 +PYF Chinese f 2.9000001 +REU Comorian f 2.8 +ROM Romani t 0.69999999 +SWE Southern Slavic Languages f 1.3 +DEU Southern Slavic Languages f 1.4 +SLB Polynesian Languages f 3.8 +ZMB Nyanja f 7.8000002 +WSM English t 0.60000002 +SEN Serer f 12.5 +SYC French t 1.3 +SLE Limba f 8.3000002 +SGP Tamil t 7.4000001 +SVK Romani f 1.7 +SVN Hungarian f 0.5 +LKA Mixed Languages f 19.6 +SDN Nubian Languages f 8.1000004 +FIN Russian f 0.40000001 +CHE Italian t 7.6999998 +TJK Russian f 9.6999998 +TWN Hakka f 11 +TZA Hehet f 6.9000001 +DNK Arabic f 0.69999999 +THA Chinese f 12.1 +TGO Watyi f 10.3 +TTO Creole English f 2.9000001 +TCD Mayo-kebbi f 11.5 +CZE Slovak f 3.0999999 +TUN Arabic-French-English f 3.2 +TUR Arabic f 1.4 +TKM Russian f 6.6999998 +TUV English t 0 +UGA Kiga f 8.3000002 +UKR Romanian f 0.69999999 +HUN German f 0.40000001 +NCL Polynesian Languages f 11.6 +UZB Tadzhik f 4.4000001 +BLR Ukrainian f 1.3 +VUT French t 14.2 +VEN Warrau f 0.1 +RUS Ukrainian f 1.3 +VNM Thai f 1.6 +EST Ukrainian f 2.8 +USA French f 0.69999999 +VIR French f 2.5 +ZWE English t 2.2 +AFG Turkmenian f 1.9 +NLD Turkish f 0.80000001 +AND French f 6.1999998 +AGO Luimbe-nganguela f 5.4000001 +ABW Dutch t 5.3000002 +AUS Canton Chinese f 1.1 +AZE Armenian f 2 +BGD Garo f 0.1 +BEL Arabic f 1.6 +BLZ Garifuna f 6.8000002 +BEN Aizo f 8.6999998 +BOL Guarani f 0.1 +BWA Khoekhoe f 2.5 +BRA Japanese f 0.40000001 +BRN English f 3.0999999 +BGR Macedonian f 2.5999999 +BFA Busansi f 3.5 +CHL Rapa nui f 0.2 +CRI Chinese f 0.2 +ERI Hadareb f 3.8 +ESP Basque f 1.6 +ZAF Northsotho f 9.1000004 +ETH Gurage f 4.6999998 +PHL Hiligaynon f 9.1000004 +GAB Mbete f 13.8 +GMB Diola f 9.1999998 +GEO Azerbaijani f 5.5 +GHA Ga-adangme f 7.8000002 +GUM Korean f 3.3 +GTM Kekchi f 4.9000001 +GIN Kissi f 6 +GNB Portuguese t 8.1000004 +HND Miskito f 0.2 +HKG Hakka f 1.6 +IDN Madura f 4.3000002 +IND Marathi f 7.4000001 +IRQ Assyrian f 0.80000001 +IRN Gilaki f 5.3000002 +ITA French f 0.5 +AUT Hungarian f 0.40000001 +JPN English f 0.1 +YUG Romani f 1.4 +KHM Tdam f 2.4000001 +CMR Ful f 9.6000004 +CAN Italian f 1.7 +KAZ German f 3.0999999 +KEN Kamba f 11.2 +CAF Ngbaka f 7.5 +CHN Hui f 0.80000001 +KGZ Ukrainian f 1.7 +COL Arawakan f 0.1 +COM Comorian-Arabic f 1.6 +COG Mbete f 4.8000002 +COD Rwanda f 10.3 +LAO Lao-Soung f 5.1999998 +LVA Ukrainian f 2.9000001 +LBR Gio f 7.9000001 +LTU Belorussian f 1.4 +LUX French t 4.1999998 +MAC English f 0.5 +MKD Romani f 2.3 +MWI Ngoni f 6.6999998 +MYS Iban f 2.8 +MLI Soninke f 8.6999998 +MRT Soninke f 2.7 +MUS Hindi f 1.2 +MEX Zapotec f 0.60000002 +FSM Kosrean f 7.3000002 +MDA Gagauzi f 3.2 +MCO English f 6.5 +MNG Bajad f 1.9 +MOZ Lomwe f 7.8000002 +MMR Rakhine f 4.5 +NAM Afrikaans f 9.5 +NRU Tuvalu f 8.5 +NPL Tharu f 5.4000001 +NIC Sumo f 0.2 +NER Ful f 9.6999998 +NGA Ful f 11.3 +NOR Swedish f 0.30000001 +CIV Kru f 10.5 +PAK Saraiki f 9.8000002 +PLW Chinese f 1.6 +PAN Cuna f 2 +PRY German f 0.89999998 +MNP Korean f 6.5 +POL Belorussian f 0.5 +FRA Italian f 0.40000001 +REU Malagasy f 1.4 +ROM German f 0.40000001 +SWE Arabic f 0.80000001 +DEU Italian f 0.69999999 +ZMB Lozi f 6.4000001 +SEN Diola f 5 +SLE Kono-vai f 5.0999999 +SVK Czech and Moravian f 1.1 +SDN Beja f 6.4000001 +FIN Estonian f 0.2 +CHE Romansh t 0.60000002 +TWN Ami f 0.60000002 +TZA Haya f 5.9000001 +DNK German f 0.5 +THA Malay f 3.5999999 +TGO Kotokoli f 5.6999998 +TCD Kanem-bornu f 9 +CZE Polish f 0.60000002 +TKM Kazakh f 2 +UGA Soga f 8.1999998 +UKR Bulgariana f 0.30000001 +HUN Serbo-Croatian f 0.2 +UZB Kazakh f 3.8 +BLR Polish f 0.60000002 +RUS Chuvash f 0.89999998 +VNM Muong f 1.5 +EST Belorussian f 1.4 +USA German f 0.69999999 +ZWE Nyanja f 2.2 +AFG Balochi f 0.89999998 +AGO Nyaneka-nkhumbi f 5.4000001 +AUS Arabic f 1 +BGD Khasi f 0.1 +BEL German t 1 +BEN Bariba f 8.6999998 +BWA Ndebele f 1.3 +BRA Indian Languages f 0.2 +BFA Dagara f 3.0999999 +ERI Bilin f 3 +ZAF English t 8.5 +ETH Somali f 4.0999999 +PHL Bicol f 5.6999998 +GMB Soninke f 7.5999999 +GEO Osseetti f 2.4000001 +GHA Gurma f 3.3 +GUM Japanese f 2 +GTM Mam f 2.7 +GIN Kpelle f 4.5999999 +GNB Malinke f 6.9000001 +HKG Chiu chau f 1.4 +IDN Minangkabau f 2.4000001 +IND Tamil f 6.3000002 +IRQ Persian f 0.80000001 +IRN Luri f 4.3000002 +ITA German f 0.5 +AUT Slovene f 0.40000001 +JPN Philippene Languages f 0.1 +YUG Slovak f 0.69999999 +CMR Tikar f 7.4000001 +CAN German f 1.6 +KAZ Uzbek f 2.3 +KEN Kalenjin f 10.8 +CAF Sara f 6.4000001 +CHN Miao f 0.69999999 +KGZ Tatar f 1.3 +COL Caribbean f 0.1 +COM Comorian-Swahili f 0.5 +COG Punu f 2.9000001 +COD Zande f 6.0999999 +LVA Polish f 2.0999999 +LBR Kru f 7.1999998 +LTU Ukrainian f 1.1 +LUX German t 2.3 +MKD Serbo-Croatian f 2 +MYS English f 1.6 +MLI Tamashek f 7.3000002 +MRT Ful f 1.2 +MUS Tamil f 0.80000001 +MEX Mixtec f 0.60000002 +FSM Yap f 5.8000002 +MDA Bulgariana f 1.6 +MNG Buryat f 1.7 +MOZ Shona f 6.5 +MMR Mon f 2.4000001 +NAM Herero f 8 +NRU English t 7.5 +NPL Tamang f 4.9000001 +NER Kanuri f 4.4000001 +NGA Ibibio f 5.5999999 +NOR Saame f 0 +CIV [South]Mande f 7.6999998 +PAK Urdu t 7.5999999 +PAN Embera f 0.60000002 +MNP English t 4.8000002 +FRA Spanish f 0.40000001 +REU Tamil f 0 +ROM Ukrainian f 0.30000001 +SWE Spanish f 0.60000002 +DEU Greek f 0.40000001 +ZMB Chewa f 5.6999998 +SEN Malinke f 3.8 +SLE Bullom-sherbro f 3.8 +SVK Ukrainian and Russian f 0.60000002 +SDN Nuer f 4.9000001 +FIN Saame f 0 +TWN Atayal f 0.40000001 +TZA Makonde f 5.9000001 +DNK English f 0.30000001 +THA Khmer f 1.3 +TGO Ane f 5.6999998 +TCD Ouaddai f 8.6999998 +CZE German f 0.5 +UGA Teso f 6 +UKR Hungarian f 0.30000001 +HUN Romanian f 0.1 +UZB Karakalpak f 2 +RUS Bashkir f 0.69999999 +VNM Chinese f 1.4 +EST Finnish f 0.69999999 +USA Italian f 0.60000002 +AGO Chokwe f 4.1999998 +AUS Vietnamese f 0.80000001 +BGD Santhali f 0.1 +BEL Turkish f 0.89999998 +BEN Somba f 6.6999998 +BFA Dyula f 2.5999999 +ERI Saho f 3 +ZAF Tswana f 8.1000004 +ETH Sidamo f 3.2 +PHL Waray-waray f 3.8 +GEO Abhyasi f 1.7 +GHA Joruba f 1.3 +GIN Yalunka f 2.9000001 +GNB Mandyako f 4.9000001 +IDN Batakki f 2.2 +IND Urdu f 5.0999999 +IRN Mazandarani f 3.5999999 +ITA Albaniana f 0.2 +AUT Polish f 0.2 +JPN Ainu f 0 +YUG Macedonian f 0.5 +CMR Mandara f 5.6999998 +CAN Polish f 0.69999999 +KAZ Tatar f 2 +KEN Gusii f 6.0999999 +CAF Mbum f 6.4000001 +CHN Uighur f 0.60000002 +KGZ Kazakh f 0.80000001 +COG Sango f 2.5999999 +COD Ngala and Bangi f 5.8000002 +LVA Lithuanian f 1.2 +LBR Mano f 7.1999998 +MYS Dusun f 1.1 +MLI Songhai f 6.9000001 +MRT Zenaga f 1.2 +MUS Marathi f 0.69999999 +MEX Otomi f 0.40000001 +FSM Wolea f 3.7 +MNG Dariganga f 1.4 +MOZ Tswa f 6 +MMR Chin f 2.2 +NAM Caprivi f 4.6999998 +NPL Newari f 3.7 +NGA Kanuri f 4.0999999 +PAK Balochi f 3 +PAN Arabic f 0.60000002 +MNP Carolinian f 4.8000002 +FRA Turkish f 0.40000001 +ROM Serbo-Croatian f 0.1 +SWE Norwegian f 0.5 +DEU Polish f 0.30000001 +ZMB Nsenga f 4.3000002 +SEN Soninke f 1.3 +SLE Ful f 3.8 +SDN Zande f 2.7 +TWN Paiwan f 0.30000001 +TZA Nyakusa f 5.4000001 +DNK Swedish f 0.30000001 +THA Kuy f 1.1 +TGO Moba f 5.4000001 +TCD Hadjarai f 6.6999998 +CZE Silesiana f 0.40000001 +UGA Lango f 5.9000001 +UKR Belorussian f 0.30000001 +HUN Slovak f 0.1 +UZB Tatar f 1.8 +RUS Chechen f 0.60000002 +VNM Khmer f 1.4 +USA Chinese f 0.60000002 +AGO Luvale f 3.5999999 +AUS Serbo-Croatian f 0.60000002 +BGD Tripuri f 0.1 +BEN Ful f 5.5999999 +ZAF Southsotho f 7.5999999 +ETH Walaita f 2.8 +PHL Pampango f 3 +GIN Loma f 2.3 +IDN Bugi f 2.2 +IND Gujarati f 4.8000002 +IRN Balochi f 2.3 +ITA Slovene f 0.2 +AUT Czech f 0.2 +CMR Maka f 4.9000001 +CAN Spanish f 0.69999999 +KEN Meru f 5.5 +CHN Yi f 0.60000002 +KGZ Tadzhik f 0.80000001 +COD Rundi f 3.8 +LBR Loma f 5.8000002 +MOZ Chuabo f 5.6999998 +MMR Kachin f 1.4 +NAM San f 1.9 +NPL Hindi f 3 +NGA Edo f 3.3 +PAK Hindko f 2.4000001 +SLE Kuranko f 3.4000001 +SDN Bari f 2.5 +TZA Chaga and Pare f 4.9000001 +DNK Norwegian f 0.30000001 +TGO Naudemba f 4.0999999 +TCD Tandjile f 6.5 +CZE Romani f 0.30000001 +UGA Lugbara f 4.6999998 +UKR Polish f 0.1 +RUS Mordva f 0.5 +VNM Nung f 1.1 +USA Tagalog f 0.40000001 +AGO Ambo f 2.4000001 +AUS German f 0.60000002 +ZAF Tsonga f 4.3000002 +PHL Pangasinan f 1.8 +IDN Banja f 1.8 +IND Kannada f 3.9000001 +IRN Arabic f 2.2 +ITA Romani f 0.2 +AUT Romanian f 0.2 +CMR Masana f 3.9000001 +CAN Portuguese f 0.69999999 +KEN Nyika f 4.8000002 +CHN Tujia f 0.5 +COD Teke f 2.7 +LBR Malinke f 5.0999999 +MOZ Ronga f 3.7 +MMR Kayah f 0.40000001 +NAM German f 0.89999998 +NGA Tiv f 2.3 +PAK Brahui f 1.2 +SLE Yalunka f 3.4000001 +SDN Fur f 2.0999999 +TZA Luguru f 4.9000001 +TGO Gurma f 3.4000001 +TCD Gorane f 6.1999998 +CZE Hungarian f 0.2 +UGA Gisu f 4.5 +RUS Kazakh f 0.40000001 +VNM Miao f 0.89999998 +USA Polish f 0.30000001 +AGO Luchazi f 2.4000001 +ZAF Swazi f 2.5 +PHL Maguindanao f 1.4 +IDN Bali f 1.7 +IND Malajalam f 3.5999999 +IRN Bakhtyari f 1.7 +CAN Punjabi f 0.69999999 +KEN Masai f 1.6 +CHN Mongolian f 0.40000001 +COD Boa f 2.3 +MOZ Marendje f 3.5 +NGA Ijo f 1.8 +SDN Chilluk f 1.7 +TZA Shambala f 4.3000002 +UGA Acholi f 4.4000001 +RUS Avarian f 0.40000001 +VNM Man f 0.69999999 +USA Korean f 0.30000001 +ZAF Venda f 2.2 +PHL Maranao f 1.3 +IND Orija f 3.3 +IRN Turkmenian f 1.6 +CAN Ukrainian f 0.60000002 +KEN Turkana f 1.4 +CHN Tibetan f 0.40000001 +COD Chokwe f 1.8 +MOZ Nyanja f 3.3 +NGA Bura f 1.6 +SDN Lotuko f 1.5 +TZA Gogo f 3.9000001 +UGA Rwanda f 3.2 +RUS Mari f 0.40000001 +USA Vietnamese f 0.2 +ZAF Ndebele f 1.5 +IND Punjabi f 2.8 +CAN Dutch f 0.5 +CHN Puyi f 0.2 +TZA Ha f 3.5 +RUS Udmur f 0.30000001 +USA Japanese f 0.2 +IND Asami f 1.5 +CAN Eskimo Languages f 0.1 +CHN Dong f 0.2 +RUS Belorussian f 0.30000001 +USA Portuguese f 0.2 diff --git a/src/test/singlenode_regress/data/customer.csv b/src/test/singlenode_regress/data/customer.csv new file mode 100644 index 00000000000..aa7d7202862 --- /dev/null +++ b/src/test/singlenode_regress/data/customer.csv @@ -0,0 +1,1500 @@ +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 +2|Customer#000000002|XSTf4,NCwDVaWNe6tEgvwfmRchLXak|13|23-768-687-3665|121.65|AUTOMOBILE|l accounts. blithely ironic theodolites integrate boldly: caref +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 +4|Customer#000000004|XxVSJsLAGtn|4|14-128-190-5944|2866.83|MACHINERY| requests. final, regular ideas sleep final accou +5|Customer#000000005|KvpyuHCplrB84WgAiGV6sYpZq7Tj|3|13-750-942-6364|794.47|HOUSEHOLD|n accounts will have to unwind. foxes cajole accor +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 +7|Customer#000000007|TcGe5gaZNgVePxU5kRrvXBfkasDTea|18|28-190-982-9759|9561.95|AUTOMOBILE|ainst the ironic, express theodolites. express, even pinto beans among the exp +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 +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 +10|Customer#000000010|6LrEaV6KR6PLVcgl2ArL Q3rqzLzcT1 v2|5|15-741-346-9870|2753.54|HOUSEHOLD|es regular deposits haggle. fur +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. +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 +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 +14|Customer#000000014|KXkletMlL2JQEA |1|11-845-129-3851|5266.30|FURNITURE|, ironic packages across the unus +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 +16|Customer#000000016|cYiaeMLZSMAOQ2 d0W,|10|20-781-609-3107|4681.03|FURNITURE|kly silent courts. thinly regular theodolites sleep fluffily after +17|Customer#000000017|izrh 6jdqtp2eqdtbkswDD8SG4SzXruMfIXyR7|2|12-970-682-3487|6.34|AUTOMOBILE|packages wake! blithely even pint +18|Customer#000000018|3txGO AiuFux3zT0Z9NYaFRnZt|6|16-155-215-1315|5494.43|BUILDING|s sleep. carefully even instructions nag furiously alongside of t +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 +20|Customer#000000020|JrPk8Pqplj4Ne|22|32-957-234-8742|7603.40|FURNITURE|g alongside of the special excuses-- fluffily enticing packages wake +21|Customer#000000021|XYmVpr9yAHDEn|8|18-902-614-8344|1428.25|MACHINERY| quickly final accounts integrate blithely furiously u +22|Customer#000000022|QI6p41,FNs5k7RZoCCVPUTkUdYpB|3|13-806-545-9701|591.98|MACHINERY|s nod furiously above the furiously ironic ideas. +23|Customer#000000023|OdY W13N7Be3OC5MpgfmcYss0Wn6TKT|3|13-312-472-8245|3332.02|HOUSEHOLD|deposits. special deposits cajole slyly. fluffily special deposits about the furiously +24|Customer#000000024|HXAFgIAyjxtdqwimt13Y3OZO 4xeLe7U8PqG|13|23-127-851-8031|9255.67|MACHINERY|into beans. fluffily final ideas haggle fluffily +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 +26|Customer#000000026|8ljrc5ZeMl7UciP|22|32-363-455-4837|5182.05|AUTOMOBILE|c requests use furiously ironic requests. slyly ironic dependencies us +27|Customer#000000027|IS8GIyxpBrLpMT0u7|3|13-137-193-2709|5679.84|BUILDING| about the carefully ironic pinto beans. accoun +28|Customer#000000028|iVyg0daQ,Tha8x2WPWA9m2529m|8|18-774-241-1462|1007.18|FURNITURE| along the regular deposits. furiously final pac +29|Customer#000000029|sJ5adtfyAkCK63df2,vF25zyQMVYE34uh|0|10-773-203-7342|7618.27|FURNITURE|its after the carefully final platelets x-ray against +30|Customer#000000030|nJDsELGAavU63Jl0c5NKsKfL8rIJQQkQnYL2QJY|1|11-764-165-5076|9321.01|BUILDING|lithely final requests. furiously unusual account +31|Customer#000000031|LUACbO0viaAv6eXOAebryDB xjVst|23|33-197-837-7094|5236.89|HOUSEHOLD|s use among the blithely pending depo +32|Customer#000000032|jD2xZzi UmId,DCtNBLXKj9q0Tlp2iQ6ZcO3J|15|25-430-914-2194|3471.53|BUILDING|cial ideas. final, furious requests across the e +33|Customer#000000033|qFSlMuLucBmx9xnn5ib2csWUweg D|17|27-375-391-1280|-78.56|AUTOMOBILE|s. slyly regular accounts are furiously. carefully pending requests +34|Customer#000000034|Q6G9wZ6dnczmtOx509xgE,M2KV|15|25-344-968-5422|8589.70|HOUSEHOLD|nder against the even, pending accounts. even +35|Customer#000000035|TEjWGE4nBzJL2|17|27-566-888-7431|1228.24|HOUSEHOLD|requests. special, express requests nag slyly furiousl +36|Customer#000000036|3TvCzjuPzpJ0,DdJ8kW5U|21|31-704-669-5769|4987.27|BUILDING|haggle. enticing, quiet platelets grow quickly bold sheaves. carefully regular acc +37|Customer#000000037|7EV4Pwh,3SboctTWt|8|18-385-235-7162|-917.75|FURNITURE|ilent packages are carefully among the deposits. furiousl +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 +39|Customer#000000039|nnbRg,Pvy33dfkorYE FdeZ60|2|12-387-467-6509|6264.31|AUTOMOBILE|tions. slyly silent excuses slee +40|Customer#000000040|gOnGWAyhSV1ofv|3|13-652-915-8939|1335.30|BUILDING|rges impress after the slyly ironic courts. foxes are. blithely +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 +42|Customer#000000042|ziSrvyyBke|5|15-416-330-4175|8727.01|BUILDING|ssly according to the pinto beans: carefully special requests across the even, pending accounts wake special +43|Customer#000000043|ouSbjHk8lh5fKX3zGso3ZSIj9Aa3PoaFd|19|29-316-665-2897|9904.28|MACHINERY|ial requests: carefully pending foxes detect quickly. carefully final courts cajole quickly. carefully +44|Customer#000000044|Oi,dOSPwDu4jo4x,,P85E0dmhZGvNtBwi|16|26-190-260-5375|7315.94|AUTOMOBILE|r requests around the unusual, bold a +45|Customer#000000045|4v3OcpFgoOmMG,CbnF,4mdC|9|19-715-298-9917|9983.38|AUTOMOBILE|nto beans haggle slyly alongside of t +46|Customer#000000046|eaTXWWm10L9|6|16-357-681-2007|5744.59|AUTOMOBILE|ctions. accounts sleep furiously even requests. regular, regular accounts cajole blithely around the final pa +47|Customer#000000047|b0UgocSqEW5 gdVbhNT|2|12-427-271-9466|274.58|BUILDING|ions. express, ironic instructions sleep furiously ironic ideas. furi +48|Customer#000000048|0UU iPhBupFvemNB|0|10-508-348-5882|3792.50|BUILDING|re fluffily pending foxes. pending, bold platelets sleep slyly. even platelets cajo +49|Customer#000000049|cNgAeX7Fqrdf7HQN9EwjUa4nxT,68L FKAxzl|10|20-908-631-4424|4573.94|FURNITURE|nusual foxes! fluffily pending packages maintain to the regular +50|Customer#000000050|9SzDYlkzxByyJ1QeTI o|6|16-658-112-3221|4266.13|MACHINERY|ts. furiously ironic accounts cajole furiously slyly ironic dinos. +51|Customer#000000051|uR,wEaiTvo4|12|22-344-885-4251|855.87|FURNITURE|eposits. furiously regular requests integrate carefully packages. furious +52|Customer#000000052|7 QOqGqqSy9jfV51BC71jcHJSD0|11|21-186-284-5998|5630.28|HOUSEHOLD|ic platelets use evenly even accounts. stealthy theodolites cajole furiou +53|Customer#000000053|HnaxHzTfFTZs8MuCpJyTbZ47Cm4wFOOgib|15|25-168-852-5363|4113.64|HOUSEHOLD|ar accounts are. even foxes are blithely. fluffily pending deposits boost +54|Customer#000000054|,k4vf 5vECGWFy,hosTE,|4|14-776-370-4745|868.90|AUTOMOBILE|sual, silent accounts. furiously express accounts cajole special deposits. final, final accounts use furi +55|Customer#000000055|zIRBR4KNEl HzaiV3a i9n6elrxzDEh8r8pDom|10|20-180-440-8525|4572.11|MACHINERY|ully unusual packages wake bravely bold packages. unusual requests boost deposits! blithely ironic packages ab +56|Customer#000000056|BJYZYJQk4yD5B|10|20-895-685-6920|6530.86|FURNITURE|. notornis wake carefully. carefully fluffy requests are furiously even accounts. slyly expre +57|Customer#000000057|97XYbsuOPRXPWU|21|31-835-306-1650|4151.93|AUTOMOBILE|ove the carefully special packages. even, unusual deposits sleep slyly pend +58|Customer#000000058|g9ap7Dk1Sv9fcXEWjpMYpBZIRUohi T|13|23-244-493-2508|6478.46|HOUSEHOLD|ideas. ironic ideas affix furiously express, final instructions. regular excuses use quickly e +59|Customer#000000059|zLOCP0wh92OtBihgspOGl4|1|11-355-584-3112|3458.60|MACHINERY|ously final packages haggle blithely after the express deposits. furiou +60|Customer#000000060|FyodhjwMChsZmUz7Jz0H|12|22-480-575-5866|2741.87|MACHINERY|latelets. blithely unusual courts boost furiously about the packages. blithely final instruct +61|Customer#000000061|9kndve4EAJxhg3veF BfXr7AqOsT39o gtqjaYE|17|27-626-559-8599|1536.24|FURNITURE|egular packages shall have to impress along the +62|Customer#000000062|upJK2Dnw13,|7|17-361-978-7059|595.61|MACHINERY|kly special dolphins. pinto beans are slyly. quickly regular accounts are furiously a +63|Customer#000000063|IXRSpVWWZraKII|21|31-952-552-9584|9331.13|AUTOMOBILE|ithely even accounts detect slyly above the fluffily ir +64|Customer#000000064|MbCeGY20kaKK3oalJD,OT|3|13-558-731-7204|-646.64|BUILDING|structions after the quietly ironic theodolites cajole be +65|Customer#000000065|RGT yzQ0y4l0H90P783LG4U95bXQFDRXbWa1sl,X|23|33-733-623-5267|8795.16|AUTOMOBILE|y final foxes serve carefully. theodolites are carefully. pending i +66|Customer#000000066|XbsEqXH1ETbJYYtA1A|22|32-213-373-5094|242.77|HOUSEHOLD|le slyly accounts. carefully silent packages benea +67|Customer#000000067|rfG0cOgtr5W8 xILkwp9fpCS8|9|19-403-114-4356|8166.59|MACHINERY|indle furiously final, even theodo +68|Customer#000000068|o8AibcCRkXvQFh8hF,7o|12|22-918-832-2411|6853.37|HOUSEHOLD| pending pinto beans impress realms. final dependencies +69|Customer#000000069|Ltx17nO9Wwhtdbe9QZVxNgP98V7xW97uvSH1prEw|9|19-225-978-5670|1709.28|HOUSEHOLD|thely final ideas around the quickly final dependencies affix carefully quickly final theodolites. final accounts c +70|Customer#000000070|mFowIuhnHjp2GjCiYYavkW kUwOjIaTCQ|22|32-828-107-2832|4867.52|FURNITURE|fter the special asymptotes. ideas after the unusual frets cajole quickly regular pinto be +71|Customer#000000071|TlGalgdXWBmMV,6agLyWYDyIz9MKzcY8gl,w6t1B|7|17-710-812-5403|-611.19|HOUSEHOLD|g courts across the regular, final pinto beans are blithely pending ac +72|Customer#000000072|putjlmskxE,zs,HqeIA9Wqu7dhgH5BVCwDwHHcf|2|12-759-144-9689|-362.86|FURNITURE|ithely final foxes sleep always quickly bold accounts. final wat +73|Customer#000000073|8IhIxreu4Ug6tt5mog4|0|10-473-439-3214|4288.50|BUILDING|usual, unusual packages sleep busily along the furiou +74|Customer#000000074|IkJHCA3ZThF7qL7VKcrU nRLl,kylf |4|14-199-862-7209|2764.43|MACHINERY|onic accounts. blithely slow packages would haggle carefully. qui +75|Customer#000000075|Dh 6jZ,cwxWLKQfRKkiGrzv6pm|18|28-247-803-9025|6684.10|AUTOMOBILE| instructions cajole even, even deposits. finally bold deposits use above the even pains. slyl +76|Customer#000000076|m3sbCvjMOHyaOofH,e UkGPtqc4|0|10-349-718-3044|5745.33|FURNITURE|pecial deposits. ironic ideas boost blithely according to the closely ironic theodolites! furiously final deposits n +77|Customer#000000077|4tAE5KdMFGD4byHtXF92vx|17|27-269-357-4674|1738.87|BUILDING|uffily silent requests. carefully ironic asymptotes among the ironic hockey players are carefully bli +78|Customer#000000078|HBOta,ZNqpg3U2cSL0kbrftkPwzX|9|19-960-700-9191|7136.97|FURNITURE|ests. blithely bold pinto beans h +79|Customer#000000079|n5hH2ftkVRwW8idtD,BmM2|15|25-147-850-4166|5121.28|MACHINERY|es. packages haggle furiously. regular, special requests poach after the quickly express ideas. blithely pending re +80|Customer#000000080|K,vtXp8qYB |0|10-267-172-7101|7383.53|FURNITURE|tect among the dependencies. bold accounts engage closely even pinto beans. ca +81|Customer#000000081|SH6lPA7JiiNC6dNTrR|20|30-165-277-3269|2023.71|BUILDING|r packages. fluffily ironic requests cajole fluffily. ironically regular theodolit +82|Customer#000000082|zhG3EZbap4c992Gj3bK,3Ne,Xn|18|28-159-442-5305|9468.34|AUTOMOBILE|s wake. bravely regular accounts are furiously. regula +83|Customer#000000083|HnhTNB5xpnSF20JBH4Ycs6psVnkC3RDf|22|32-817-154-4122|6463.51|BUILDING|ccording to the quickly bold warhorses. final, regular foxes integrate carefully. bold packages nag blithely ev +84|Customer#000000084|lpXz6Fwr9945rnbtMc8PlueilS1WmASr CB|11|21-546-818-3802|5174.71|FURNITURE|ly blithe foxes. special asymptotes haggle blithely against the furiously regular depo +85|Customer#000000085|siRerlDwiolhYR 8FgksoezycLj|5|15-745-585-8219|3386.64|FURNITURE|ronic ideas use above the slowly pendin +86|Customer#000000086|US6EGGHXbTTXPL9SBsxQJsuvy|0|10-677-951-2353|3306.32|HOUSEHOLD|quests. pending dugouts are carefully aroun +87|Customer#000000087|hgGhHVSWQl 6jZ6Ev|23|33-869-884-7053|6327.54|FURNITURE|hely ironic requests integrate according to the ironic accounts. slyly regular pla +88|Customer#000000088|wtkjBN9eyrFuENSMmMFlJ3e7jE5KXcg|16|26-516-273-2566|8031.44|AUTOMOBILE|s are quickly above the quickly ironic instructions; even requests about the carefully final deposi +89|Customer#000000089|dtR, y9JQWUO6FoJExyp8whOU|14|24-394-451-5404|1530.76|FURNITURE|counts are slyly beyond the slyly final accounts. quickly final ideas wake. r +90|Customer#000000090|QxCzH7VxxYUWwfL7|16|26-603-491-1238|7354.23|BUILDING|sly across the furiously even +91|Customer#000000091|S8OMYFrpHwoNHaGBeuS6E 6zhHGZiprw1b7 q|8|18-239-400-3677|4643.14|AUTOMOBILE|onic accounts. fluffily silent pinto beans boost blithely according to the fluffily exp +92|Customer#000000092|obP PULk2LH LqNF,K9hcbNqnLAkJVsl5xqSrY,|2|12-446-416-8471|1182.91|MACHINERY|. pinto beans hang slyly final deposits. ac +93|Customer#000000093|EHXBr2QGdh|7|17-359-388-5266|2182.52|MACHINERY|press deposits. carefully regular platelets r +94|Customer#000000094|IfVNIN9KtkScJ9dUjK3Pg5gY1aFeaXewwf|9|19-953-499-8833|5500.11|HOUSEHOLD|latelets across the bold, final requests sleep according to the fluffily bold accounts. unusual deposits amon +95|Customer#000000095|EU0xvmWvOmUUn5J,2z85DQyG7QCJ9Xq7|15|25-923-255-2929|5327.38|MACHINERY|ithely. ruthlessly final requests wake slyly alongside of the furiously silent pinto beans. even the +96|Customer#000000096|vWLOrmXhRR|8|18-422-845-1202|6323.92|AUTOMOBILE|press requests believe furiously. carefully final instructions snooze carefully. +97|Customer#000000097|OApyejbhJG,0Iw3j rd1M|17|27-588-919-5638|2164.48|AUTOMOBILE|haggle slyly. bold, special ideas are blithely above the thinly bold theo +98|Customer#000000098|7yiheXNSpuEAwbswDW|12|22-885-845-6889|-551.37|BUILDING|ages. furiously pending accounts are quickly carefully final foxes: busily pe +99|Customer#000000099|szsrOiPtCHVS97Lt|15|25-515-237-9232|4088.65|HOUSEHOLD|cajole slyly about the regular theodolites! furiously bold requests nag along the pending, regular packages. somas +100|Customer#000000100|fptUABXcmkC5Wx|20|30-749-445-4907|9889.89|FURNITURE|was furiously fluffily quiet deposits. silent, pending requests boost against +101|Customer#000000101|sMmL2rNeHDltovSm Y|2|12-514-298-3699|7470.96|MACHINERY| sleep. pending packages detect slyly ironic pack +102|Customer#000000102|UAtflJ06 fn9zBfKjInkQZlWtqaA|19|29-324-978-8538|8462.17|BUILDING|ously regular dependencies nag among the furiously express dinos. blithely final +103|Customer#000000103|8KIsQX4LJ7QMsj6DrtFtXu0nUEdV,8a|9|19-216-107-2107|2757.45|BUILDING|furiously pending notornis boost slyly around the blithely ironic ideas? final, even instructions cajole fl +104|Customer#000000104|9mcCK L7rt0SwiYtrbO88DiZS7U d7M|10|20-966-284-8065|-588.38|FURNITURE|rate carefully slyly special pla +105|Customer#000000105|4iSJe4L SPjg7kJj98Yz3z0B|10|20-793-553-6417|9091.82|MACHINERY|l pains cajole even accounts. quietly final instructi +106|Customer#000000106|xGCOEAUjUNG|1|11-751-989-4627|3288.42|MACHINERY|lose slyly. ironic accounts along the evenly regular theodolites wake about the special, final gifts. +107|Customer#000000107|Zwg64UZ,q7GRqo3zm7P1tZIRshBDz|15|25-336-529-9919|2514.15|AUTOMOBILE|counts cajole slyly. regular requests wake. furiously regular deposits about the blithely final fo +108|Customer#000000108|GPoeEvpKo1|5|15-908-619-7526|2259.38|BUILDING|refully ironic deposits sleep. regular, unusual requests wake slyly +109|Customer#000000109|OOOkYBgCMzgMQXUmkocoLb56rfrdWp2NE2c|16|26-992-422-8153|-716.10|BUILDING|es. fluffily final dependencies sleep along the blithely even pinto beans. final deposits haggle furiously furiou +110|Customer#000000110|mymPfgphaYXNYtk|10|20-893-536-2069|7462.99|AUTOMOBILE|nto beans cajole around the even, final deposits. quickly bold packages according to the furiously regular dept +111|Customer#000000111|CBSbPyOWRorloj2TBvrK9qp9tHBs|22|32-582-283-7528|6505.26|MACHINERY|ly unusual instructions detect fluffily special deposits-- theodolites nag carefully during the ironic dependencies +112|Customer#000000112|RcfgG3bO7QeCnfjqJT1|19|29-233-262-8382|2953.35|FURNITURE|rmanently unusual multipliers. blithely ruthless deposits are furiously along the +113|Customer#000000113|eaOl5UBXIvdY57rglaIzqvfPD,MYfK|12|22-302-930-4756|2912.00|BUILDING|usly regular theodolites boost furiously doggedly pending instructio +114|Customer#000000114|xAt 5f5AlFIU|14|24-805-212-7646|1027.46|FURNITURE|der the carefully express theodolites are after the packages. packages are. bli +115|Customer#000000115|0WFt1IXENmUT2BgbsB0ShVKJZt0HCBCbFl0aHc|8|18-971-699-1843|7508.92|HOUSEHOLD|sits haggle above the carefully ironic theodolite +116|Customer#000000116|yCuVxIgsZ3,qyK2rloThy3u|16|26-632-309-5792|8403.99|BUILDING|as. quickly final sauternes haggle slyly carefully even packages. brave, ironic pinto beans are above the furious +117|Customer#000000117|uNhM,PzsRA3S,5Y Ge5Npuhi|24|34-403-631-3505|3950.83|FURNITURE|affix. instructions are furiously sl +118|Customer#000000118|OVnFuHygK9wx3xpg8|18|28-639-943-7051|3582.37|AUTOMOBILE|uick packages alongside of the furiously final deposits haggle above the fluffily even foxes. blithely dogged dep +119|Customer#000000119|M1ETOIecuvH8DtM0Y0nryXfW|7|17-697-919-8406|3930.35|FURNITURE|express ideas. blithely ironic foxes thrash. special acco +120|Customer#000000120|zBNna00AEInqyO1|12|22-291-534-1571|363.75|MACHINERY| quickly. slyly ironic requests cajole blithely furiously final dependen +121|Customer#000000121|tv nCR2YKupGN73mQudO|17|27-411-990-2959|6428.32|BUILDING|uriously stealthy ideas. carefully final courts use carefully +122|Customer#000000122|yp5slqoNd26lAENZW3a67wSfXA6hTF|3|13-702-694-4520|7865.46|HOUSEHOLD| the special packages hinder blithely around the permanent requests. bold depos +123|Customer#000000123|YsOnaaER8MkvK5cpf4VSlq|5|15-817-151-1168|5897.83|BUILDING|ependencies. regular, ironic requests are fluffily regu +124|Customer#000000124|aTbyVAW5tCd,v09O|18|28-183-750-7809|1842.49|AUTOMOBILE|le fluffily even dependencies. quietly s +125|Customer#000000125|,wSZXdVR xxIIfm9s8ITyLl3kgjT6UC07GY0Y|19|29-261-996-3120|-234.12|FURNITURE|x-ray finally after the packages? regular requests c +126|Customer#000000126|ha4EHmbx3kg DYCsP6DFeUOmavtQlHhcfaqr|22|32-755-914-7592|1001.39|HOUSEHOLD|s about the even instructions boost carefully furiously ironic pearls. ruthless, +127|Customer#000000127|Xyge4DX2rXKxXyye1Z47LeLVEYMLf4Bfcj|21|31-101-672-2951|9280.71|MACHINERY|ic, unusual theodolites nod silently after the final, ironic instructions: pending r +128|Customer#000000128|AmKUMlJf2NRHcKGmKjLS|4|14-280-874-8044|-986.96|HOUSEHOLD|ing packages integrate across the slyly unusual dugouts. blithely silent ideas sublate carefully. blithely expr +129|Customer#000000129|q7m7rbMM0BpaCdmxloCgBDRCleXsXkdD8kf|7|17-415-148-7416|9127.27|HOUSEHOLD| unusual deposits boost carefully furiously silent ideas. pending accounts cajole slyly across +130|Customer#000000130|RKPx2OfZy0Vn 8wGWZ7F2EAvmMORl1k8iH|9|19-190-993-9281|5073.58|HOUSEHOLD|ix slowly. express packages along the furiously ironic requests integrate daringly deposits. fur +131|Customer#000000131|jyN6lAjb1FtH10rMC,XzlWyCBrg75|11|21-840-210-3572|8595.53|HOUSEHOLD|jole special packages. furiously final dependencies about the furiously speci +132|Customer#000000132|QM5YabAsTLp9|4|14-692-150-9717|162.57|HOUSEHOLD|uickly carefully special theodolites. carefully regular requests against the blithely unusual instructions +133|Customer#000000133|IMCuXdpIvdkYO92kgDGuyHgojcUs88p|17|27-408-997-8430|2314.67|AUTOMOBILE|t packages. express pinto beans are blithely along the unusual, even theodolites. silent packages use fu +134|Customer#000000134|sUiZ78QCkTQPICKpA9OBzkUp2FM|11|21-200-159-5932|4608.90|BUILDING|yly fluffy foxes boost final ideas. b +135|Customer#000000135|oZK,oC0 fdEpqUML|19|29-399-293-6241|8732.91|FURNITURE| the slyly final accounts. deposits cajole carefully. carefully sly packag +136|Customer#000000136|QoLsJ0v5C1IQbh,DS1|7|17-501-210-4726|-842.39|FURNITURE|ackages sleep ironic, final courts. even requests above the blithely bold requests g +137|Customer#000000137|cdW91p92rlAEHgJafqYyxf1Q|16|26-777-409-5654|7838.30|HOUSEHOLD|carefully regular theodolites use. silent dolphins cajo +138|Customer#000000138|5uyLAeY7HIGZqtu66Yn08f|5|15-394-860-4589|430.59|MACHINERY|ts doze on the busy ideas. regular +139|Customer#000000139|3ElvBwudHKL02732YexGVFVt |9|19-140-352-1403|7897.78|MACHINERY|nstructions. quickly ironic ideas are carefully. bold, +140|Customer#000000140|XRqEPiKgcETII,iOLDZp5jA|4|14-273-885-6505|9963.15|MACHINERY|ies detect slyly ironic accounts. slyly ironic theodolites hag +141|Customer#000000141|5IW,WROVnikc3l7DwiUDGQNGsLBGOL6Dc0|1|11-936-295-6204|6706.14|FURNITURE|packages nag furiously. carefully unusual accounts snooze according to the fluffily regular pinto beans. slyly spec +142|Customer#000000142|AnJ5lxtLjioClr2khl9pb8NLxG2,|9|19-407-425-2584|2209.81|AUTOMOBILE|. even, express theodolites upo +143|Customer#000000143|681r22uL452zqk 8By7I9o9enQfx0|16|26-314-406-7725|2186.50|MACHINERY|across the blithely unusual requests haggle theodo +144|Customer#000000144|VxYZ3ebhgbltnetaGjNC8qCccjYU05 fePLOno8y|1|11-717-379-4478|6417.31|MACHINERY|ges. slyly regular accounts are slyly. bold, idle reque +145|Customer#000000145|kQjHmt2kcec cy3hfMh969u|13|23-562-444-8454|9748.93|HOUSEHOLD|ests? express, express instructions use. blithely fina +146|Customer#000000146|GdxkdXG9u7iyI1,,y5tq4ZyrcEy|3|13-835-723-3223|3328.68|FURNITURE|ffily regular dinos are slyly unusual requests. slyly specia +147|Customer#000000147|6VvIwbVdmcsMzuu,C84GtBWPaipGfi7DV|18|28-803-187-4335|8071.40|AUTOMOBILE|ress packages above the blithely regular packages sleep fluffily blithely ironic accounts. +148|Customer#000000148|BhSPlEWGvIJyT9swk vCWE|11|21-562-498-6636|2135.60|HOUSEHOLD|ing to the carefully ironic requests. carefully regular dependencies about the theodolites wake furious +149|Customer#000000149|3byTHCp2mNLPigUrrq|19|29-797-439-6760|8959.65|AUTOMOBILE|al instructions haggle against the slyly bold w +150|Customer#000000150|zeoGShTjCwGPplOWFkLURrh41O0AZ8dwNEEN4 |18|28-328-564-7630|3849.48|MACHINERY|ole blithely among the furiously pending packages. furiously bold ideas wake fluffily ironic idea +151|Customer#000000151|LlyEtNEXT6kkZ,kGP46H|19|29-433-197-6339|5187.02|HOUSEHOLD|regular dugouts: blithely even dolphins cajole furiously carefull +152|Customer#000000152|PDrllSkScKLh4lr19gmUZnK|8|18-585-850-3926|1215.18|BUILDING|ously ironic accounts. furiously even accounts accord +153|Customer#000000153|kDzx11sIjjWJm1|6|16-342-316-2815|5454.26|HOUSEHOLD|promise carefully. unusual deposits x-ray. carefully regular tithes u +154|Customer#000000154|2LAlU fDHkOqbXjHHDqw1mJQNC|19|29-522-835-6914|4695.12|FURNITURE|nic packages haggle blithely across the +155|Customer#000000155|l,sSphiStMgdrxpxi|0|10-566-282-8705|5902.85|AUTOMOBILE| sleep ironic, bold requests. regular packages on the quiet dependencies +156|Customer#000000156|5OS0edX2Y6B1cf9wJNuOQWgrrZccXk9|9|19-723-913-3943|9302.95|AUTOMOBILE| regular foxes above the theodolites haggle +157|Customer#000000157|HGEouzCcFrNd nBAdsCRjsMxKOvYZdbwA7he5w9v|15|25-207-442-1556|9768.73|BUILDING| pinto beans against the carefully bold requests wake quickly alongside of the final accounts. accounts +158|Customer#000000158|2HaYxi0J1620aoI1CdFyrW,rWOy|10|20-383-680-1329|6160.95|AUTOMOBILE|ecoys. fluffily quick requests use flu +159|Customer#000000159|KotsdDO6EHnysVu922s6pjZpG,vlT|10|20-888-668-2668|2060.06|HOUSEHOLD|cingly express somas haggle above the theodolites. pinto beans use special theodolites. theodolites sleep +160|Customer#000000160|5soVQ3dOCRBWBS|13|23-428-666-4806|4363.17|MACHINERY|olites. silently ironic accounts cajole furious +161|Customer#000000161|2oRkx,NtjFUh|7|17-805-718-2449|3714.06|MACHINERY|ptotes nag carefully instructions. silent accounts are. furiously even accounts alongside +162|Customer#000000162|JE398sXZt2QuKXfJd7poNpyQFLFtth|8|18-131-101-2267|6268.99|MACHINERY|accounts along the doggedly special asymptotes boost blithely during the quickly regular theodolites. slyly +163|Customer#000000163|OgrGcOnm4whd0f|21|31-863-349-4121|2948.61|FURNITURE| nag furiously furiously final requests. slyly s +164|Customer#000000164|YDW51PBWLXLnbQlKC|4|14-565-638-9768|208.45|HOUSEHOLD|ironic, special pinto beans. ironic +165|Customer#000000165|8pc6kwBmwBdEnfVP53aqL9DM4LymC4|0|10-927-209-5601|3349.92|HOUSEHOLD| requests. final ideas cajole quickly at the special, ironic acco +166|Customer#000000166|15HWGtwoP77EJfd95HxtMSTZUelV8NOKne2|10|20-320-530-5920|2042.21|FURNITURE|the packages. blithely final packages are furiously unusual asymptotes. regular frets promise carefully u +167|Customer#000000167|QNc2eOlRIzL6jpthwgDuB866uCIUPiOX|5|15-288-395-5501|1468.09|AUTOMOBILE|espite the ironic excuses. furiously final deposits wake slyly. slyly ex +168|Customer#000000168|GDcL5qU86P8,oaTwVBCLE6asM8rlxpE,211uziU|12|22-354-984-5361|-808.56|FURNITURE|blithely final accounts sleep quickly along the regular ideas. furiously sly foxes nag across the +169|Customer#000000169|NjhmHa7xrcjE|18|28-362-499-3728|4483.83|FURNITURE|fully unusual pinto beans. blithely express asymptotes lose carefully regular instructions? accounts b +170|Customer#000000170|5QmxmYubNhn6HAgLwTvphevM3OmpZTGsM|15|25-879-984-9818|7687.89|BUILDING| regular requests. carefully regu +171|Customer#000000171|RIhjJCrth89EU7xRSvN|7|17-513-603-7451|2379.91|MACHINERY|ly furiously final requests. slyly final requests wake silently pending, silent accounts. exp +172|Customer#000000172|KwgdKUL1G2WacsMNF50yX|22|32-178-964-1847|1134.40|MACHINERY|losely regular, unusual instructions. +173|Customer#000000173|Aue7KVz,FinSHpov Vk5ed,wSQ2BRSioJ0|9|19-443-196-8008|845.84|BUILDING|s pinto beans use thinly slyly regular packages. instructions print along the s +174|Customer#000000174|R5 fCPMSeDXtUpp5Ax|23|33-845-455-8799|1944.73|FURNITURE|oldly even requests haggle quickly blithely ironic accounts. idly final foxes doze slyly pending dep +175|Customer#000000175|8YK1ZyTqoY3wMWnExl4itPMLL793GpEZb6T|10|20-427-617-9922|1975.35|FURNITURE|ly final platelets are final pinto b +176|Customer#000000176|9hBepY2uz88HlCqToOLgeU770u81FeL|13|23-432-942-8830|-375.76|FURNITURE|uriously. final requests sleep ironic packages. quickly +177|Customer#000000177|6wzEKPyZE9dmBCJZ8e7x7fiiK,k|1|11-917-786-9955|7457.50|BUILDING|nal dolphins: blithely bold gifts wake slyly afte +178|Customer#000000178|p HUSDg8Cgan4Fj8Drvcdz4gi4dSqV0a7n 0ag|21|31-436-268-6327|2272.50|FURNITURE|unts. blithely regular dependencies kindle pending deposits. quietly express deposits wake above the Tiresias-- ex +179|Customer#000000179|djez3CWg0nnCiu60jsF|4|14-703-953-2987|-43.08|MACHINERY|st furiously. idly regular instructions wake fluffily slyl +180|Customer#000000180|DSGW3RFoYJE opVw,Y3wGCGcNULZi|13|23-678-802-2105|-92.58|FURNITURE|lar accounts sublate above the slyly final +181|Customer#000000181|YNviWd WrRkZvSw1OxIewBq|9|19-653-305-8440|3929.96|FURNITURE|final requests cajole furiously acro +182|Customer#000000182|tdwvgepG316CCTHtMaF8Q|3|13-199-211-9023|4810.22|AUTOMOBILE|quickly against the blithely even deposits; epitaphs unwind quickly along the carefully regular excuses. furio +183|Customer#000000183|aMAB2QSb8 86MAx|22|32-771-279-8154|4419.89|HOUSEHOLD|sual accounts across the slyl +184|Customer#000000184|uoOpBuRr42f1WIqnVYAhxbAA9bkK6HUGpOt|21|31-739-340-5476|170.46|AUTOMOBILE|hely according to the furiously unusual accounts. furiously bold platele +185|Customer#000000185|iHXzQgienOQ|5|15-760-572-8760|2788.76|BUILDING|t the ironic accounts. fluffily regular requests wake slyly ironic pinto beans. slyly unusu +186|Customer#000000186|BeVr6MzaobBENXRBC8pmOmkByMJI|3|13-518-743-2576|8737.50|HOUSEHOLD|e slyly final dependencies. unusual instructions against the carefully pending instructions boost quickly +187|Customer#000000187|OIlgR6oIRXV5g63q5YGudCjRD8kpod2p|4|14-716-294-6674|-774.22|FURNITURE|r deposits. carefully silent packages after the fluffily even instructio +188|Customer#000000188|58Srs6gEEoD3ZfwgXDM1OayRiaSY6K9YsveWwV|5|15-613-528-7811|9533.37|BUILDING|st slyly special platelets. bold, +189|Customer#000000189|r51HSq Rg8wQgF1CBfG1Vbye3GK|22|32-980-348-1114|-594.05|MACHINERY|sly express patterns. ideas on the regular d +190|Customer#000000190|F2X,GhSqLz8k u0gWsirsraFaEDEo6vIGtOTaO1T|11|21-730-373-8193|1657.46|AUTOMOBILE|uickly-- fluffily pending instructions boo +191|Customer#000000191|P1eCXsPWkv2y6ENQv|16|26-811-707-6869|2945.16|BUILDING|o beans hinder slyly bold accounts. +192|Customer#000000192|rDmB2c9d1BJQ y6R9jTx86YI77D|10|20-750-712-2481|8239.96|MACHINERY|ely unusual packages are fluffily +193|Customer#000000193|dUT4dtsPTZ6ZpkWLc,KGJCHY6JDJgPFH4|23|33-182-978-6287|8024.55|MACHINERY|y even theodolites. final foxes print along the final pinto beans. theodoli +194|Customer#000000194|mksKhdWuQ1pjbc4yffHp8rRmLOMcJ|16|26-597-636-3003|6696.49|HOUSEHOLD|quickly across the fluffily dogged requests. regular platelets around the ironic, even requests cajole quickl +195|Customer#000000195|WiqQD8hscyKekjMcSBA7AX 0AbxvBV|22|32-757-684-6845|4873.91|AUTOMOBILE| should detect blithely. quickly even packages above the deposits wak +196|Customer#000000196|68RstNo6a2B|18|28-135-177-2472|7760.33|FURNITURE|accounts wake. express instructions according to the s +197|Customer#000000197|UeVqssepNuXmtZ38D|1|11-107-312-6585|9860.22|AUTOMOBILE|ickly final accounts cajole. furiously re +198|Customer#000000198|,7fcZHIUn,fUaQtK8U,Q8|1|11-237-758-6141|3824.76|AUTOMOBILE|tions. slyly ironic waters wa +199|Customer#000000199|lBU3xll,a7e9TYm3 UyjDPCVMvnHKpq,9HW1X|4|14-136-924-5232|7654.31|FURNITURE|fully busy pinto beans. packages cajole around the express, bold packages! quickly ironic tithes +200|Customer#000000200|x1 H5c66DUgH2pgNTJhw6eZKgrAz|16|26-472-302-4189|9967.60|BUILDING|e after the ironic, even realms. fluffily regular packages doze-- courts haggle carefully! blithely +201|Customer#000000201|yWLtmd5usyjsCvyL1QJsBorC|2|12-759-183-9859|4614.40|MACHINERY| blithely even packages sleep carefully bold, unus +202|Customer#000000202|Q0uJ1frCbi9yvu|7|17-905-805-4635|2237.64|AUTOMOBILE|fully along the carefully pending Tiresias; special packages along the carefully special deposits try to +203|Customer#000000203|2fRlubh lWRinCs1nimADdn|1|11-886-563-6149|7960.63|MACHINERY| packages are. requests integrate regularly across th +204|Customer#000000204|7U7u2KryFP|6|16-761-837-4820|-627.76|BUILDING|ages. accounts wake slyly. dolphins nag blithely. final, regular requests haggle blithely furiously even +205|Customer#000000205|jOTQBGb nhfBMu3,LIN62WogLDBO0w|12|22-356-437-1311|7161.52|BUILDING| furiously pending accounts. ideas along the slyly final deposits cajole blithel +206|Customer#000000206|xsg,ehRHS5OKqyBR5YtoPm8myz|9|19-976-832-3312|-274.79|AUTOMOBILE| the carefully regular foxes. regular accounts wake furiously braids. bold ideas are carefu +207|Customer#000000207|ewz5JNnxJPmPGY|21|31-562-675-6475|-439.98|AUTOMOBILE|n theodolites against the evenly even requests boost carefully pinto beans! fi +208|Customer#000000208|Abye1MwcNfY0KO6yqv,Wwe|19|29-859-139-6234|6239.89|MACHINERY|le carefully according to the quickly silent packages. quickly ironic packages affix according to the ruthles +209|Customer#000000209|iBvmxOZV3qXMYQW3W4Oo7YFhdV|16|26-207-121-7721|8873.46|FURNITURE|deposits. furiously regular ideas across the quietly regular accounts cajole about the express packages. quickly reg +210|Customer#000000210|13cFL9sG1nrGERURN9WZI0|20|30-876-248-9750|7250.14|HOUSEHOLD|nusual instructions sleep regular acc +211|Customer#000000211|URhlVPzz4FqXem|13|23-965-335-9471|4198.72|BUILDING|furiously regular foxes boost fluffily special ideas. carefully regular dependencies are. slyly ironic +212|Customer#000000212|19U0iZ3GtDdrsn|7|17-382-405-4333|957.58|BUILDING|symptotes are blithely special pinto beans. blithely ironic +213|Customer#000000213|NpqMYBhBcWk8mnEta|24|34-768-700-9764|9987.71|HOUSEHOLD|al deposits. final instructions boost carefully. even deposits sleep quickly. furiously regul +214|Customer#000000214|MpCwhcLrbcIM7AeKS9tRM09by|8|18-180-678-6165|1526.59|MACHINERY|grow. fluffily regular pinto beans according to the regular accounts affix quickly pe +215|Customer#000000215|8H76xbBhde HY70BrYqGEFmVPXqlm8pgjjxh|9|19-564-446-4758|3379.20|FURNITURE|al pinto beans. ironic foxes serve. i +216|Customer#000000216|LXH7wSv4I6GG6TAkLOyLcMh559a8Y|21|31-296-111-5448|-776.08|FURNITURE|hely at the pending warhorses; blithe +217|Customer#000000217|YIy05RMdthrXqdfnNKud|23|33-159-298-3849|378.33|AUTOMOBILE|ven frays wake according to the carefully +218|Customer#000000218| V1FCIeSseuyNGYfHS Rx0,sc4IsBfReV|4|14-480-931-8567|9541.19|MACHINERY|lar courts. furiously pending dependencies cajole blithely? fluffily regular deposits cajol +219|Customer#000000219|eTjiL01eyoKiAe2WQoz3EpPg2lvSLeOu2X2wyxK|11|21-159-138-6090|9858.57|AUTOMOBILE|ckly multipliers. carefully eve +220|Customer#000000220|TbUHVhkttz|16|26-201-301-7371|9131.64|BUILDING| even, even accounts are. ironic +221|Customer#000000221|ripNyyPOewg8AahnZlsM|16|26-351-738-1001|1609.39|BUILDING| instructions above the regular requests cajole packages. pending, even +222|Customer#000000222|gAPkFjwxX1Zq 2Yq6 FIfLdJ4yUOt4Al7DL18Ou|1|11-722-672-5418|8893.76|BUILDING|regular accounts haggle furiously around the c +223|Customer#000000223|ftau6Pk,brboMyEl,,kFm|20|30-193-643-1517|7476.20|BUILDING|al, regular requests run furiously blithely silent packages. blithely ironic accounts across the furious +224|Customer#000000224|4tCJvf30WagGfacqcAqmfCptu2cbMVcj2M7Y0W|15|25-224-867-3668|8465.15|BUILDING|counts. bold packages doubt according to the furiously pending packages. bold, regular pinto beans +225|Customer#000000225|2HFk1E0fmqs|13|23-979-183-7021|8893.20|AUTOMOBILE|ages boost among the special foxes. quiet, final foxes lose carefully about the furiously unusual th +226|Customer#000000226|ToEmqB90fM TkLqyEgX8MJ8T8NkK|3|13-452-318-7709|9008.61|AUTOMOBILE|ic packages. ideas cajole furiously slyly special theodolites: carefully express pinto beans acco +227|Customer#000000227|7wlpEBswtXBPNODASgCUt8OZQ|13|23-951-816-2439|1808.23|MACHINERY|lar, ironic pinto beans use! quickly regular theodolites maintain slyly pending pac +228|Customer#000000228|A1Zvuxjdpt8TZP6i41H3fn9csGqOJUm5x0NIS1LA|20|30-435-915-1603|6868.12|FURNITURE| blithely ironic theodolites +229|Customer#000000229|Sbvjxgmwy4u6Ks1FH7lxo7toMmeU5dG|1|11-243-298-4029|7568.07|BUILDING|bold accounts haggle furiously even deposits. regular instruct +230|Customer#000000230|CnR8xt3MYqID0tiHwYh|21|31-744-950-8047|1682.83|MACHINERY|c decoys impress even deposits. thinly final asymptotes +231|Customer#000000231|WFOhG9Z9ohRdsyuYnPvBSv|10|20-825-880-1065|283.55|BUILDING|ly final deposits. fluffily ironic requests wake carefully carefully regular accounts. quickly sp +232|Customer#000000232|oA9o,3YOXu2rzKONdd,cxpqCFXUv5kuxBYKp|22|32-283-563-2674|554.71|HOUSEHOLD|ges sleep. final, bold theodolites are quickly final packages. furiously ironic packages are slyly fi +233|Customer#000000233|mFm45wZ7rV4VIbEE1F4|3|13-574-104-3221|3998.24|FURNITURE|st the special instructions. theodolites detect blithely according +234|Customer#000000234|ILyuJbixVmrNEVxsfQOMFxByySs|18|28-243-424-1393|8383.51|AUTOMOBILE| fluffily regular ideas play s +235|Customer#000000235|bp0rIBMh4fMdQnHBmMnB|3|13-350-790-6416|754.41|AUTOMOBILE|hely ruthless instructions again +236|Customer#000000236|kcW,mM0rhIstAcVaol1,6DVkS FPKlhY|14|24-808-967-4503|5384.59|AUTOMOBILE|te slyly along the requests. carefully final requests sleep slyly blithe frets. furiously ruthless dep +237|Customer#000000237|R dtznB5ocPPo|19|29-414-970-5238|-160.02|HOUSEHOLD|regular pinto beans sleep furiously ironically silent theodolites. quickly ironic courts after the deposits sleep f +238|Customer#000000238|tE0lVKK3tz5AG2 Hal2XHwE485g5MX7|16|26-307-925-1236|3482.32|HOUSEHOLD|uffily ironic theodolites are. regular, regular ideas cajole according to the blithely pending epitaphs. slyly +239|Customer#000000239|w8eRmMOmUTjVOkucbfcGDh2AqCixTOC|9|19-699-117-6988|5398.77|FURNITURE|uctions. furiously even dolphins haggle fluffily according to the furiously regular dep +240|Customer#000000240|SXfeEOwRZsXArtY3C5UWqXgLcJBAMmaynaTJs8|9|19-756-548-7835|7139.68|MACHINERY|al accounts about the slyly pending p +241|Customer#000000241|FBuwHkPR450PvnZnAezcaeMaS,hX3Ifdk|9|19-344-614-2207|6569.34|AUTOMOBILE| across the enticingly even requests. blithely iro +242|Customer#000000242|apgzK3HWAjKHFteJ16Tg3OERViesqBbx|3|13-324-350-3564|1975.41|MACHINERY|riously ironic pinto beans cajole silently. regular foxes wake slyly. bravely +243|Customer#000000243|te2FOn8xJzJinZc|7|17-297-684-7972|620.73|AUTOMOBILE|nic deposits. evenly pending deposits boost fluffily careful +244|Customer#000000244|FBVbCpEVaFaP8KogqQO2VuXeVx|15|25-621-225-8173|2506.38|HOUSEHOLD|encies. requests nag carefully. regularly final accounts h +245|Customer#000000245|IseFIO7jTGPTzAdZPoO2X4VX48Hy|12|22-952-232-2729|3720.15|MACHINERY|s. regular foxes against the s +246|Customer#000000246|WrRUR0ds6iypmopww9y9t0NJBRbke78qJm|15|25-608-618-2590|9584.96|AUTOMOBILE| requests shall have to integrate furiously pending courts. sil +247|Customer#000000247|N8q4W4QQG2mHY47Dg6|20|30-151-905-3513|8495.92|HOUSEHOLD|es affix furiously regular deposits. blithely ironic asymptotes after the blithely e +248|Customer#000000248|mgT15r8asLyaED|10|20-447-727-8914|8908.35|FURNITURE|s detect blithely. blithely pending dolphins along the fluffily final accounts haggle fu +249|Customer#000000249|0XE2fhX7j2uivaHBrFuRl1NoJnaTSIQT|3|13-226-455-7727|-234.01|MACHINERY|its are after the special deposits. ironic, final deposits against the slyl +250|Customer#000000250|9hif3yif6z8w8pW88F755PU7uz|16|26-464-852-1461|2869.97|FURNITURE|s. slyly unusual instructions cajole quickly carefully bold dep +251|Customer#000000251|Z9fdQmv07C3k hxwt9nchhuQiqC4wox85se8EW7L|13|23-975-623-5949|9585.32|HOUSEHOLD|fully blithely regular requests. fluffily even dugouts detect furiously final ideas. sometimes ironic depos +252|Customer#000000252|db1bPFF xUkJYzvE3cBtqYeDn2 u|16|26-330-347-9201|3561.74|FURNITURE|ngside of the pending foxes. furiously ironic requests wake. blithely ironic acco +253|Customer#000000253|naGyIRPFPH E|15|25-461-140-9884|9139.52|AUTOMOBILE| regular deposits sleep against the accounts. foxes cajole carefully special +254|Customer#000000254|vQ,pEzMQaFgJzK4TJ2eA|1|11-451-622-6325|1915.35|MACHINERY|equests. carefully ironic deposits detect carefully abo +255|Customer#000000255|I8Wz9sJBZTnEFG08lhcbfTZq3S|3|13-924-679-8287|3196.07|BUILDING|ges mold. bold, regular courts boost furiously at the +256|Customer#000000256|eJ6AggYh80JMEzZNwYK4CIC2flT|10|20-229-271-4429|1299.92|HOUSEHOLD|ld boost about the carefully ironic foxes. slyly special packages cajole alongside of the slyly final accounts. q +257|Customer#000000257|LyIa26EXYaSU|7|17-816-687-2155|-339.85|AUTOMOBILE|s cajole quickly along the ironic pinto beans: even, regular foxes are +258|Customer#000000258|7VbADek8qYezQYotxNUmnNI|12|22-278-425-9944|6022.27|MACHINERY|about the regular, bold accounts; pending packages use furiously stealthy warhorses. bold accounts sleep fur +259|Customer#000000259|kwh9i86Wj1Zq14nwTdhxapIkLEI|5|15-907-674-2046|3335.29|HOUSEHOLD|furiously unusual instructions. s +260|Customer#000000260|CrHY2zx4vner4|1|11-708-529-9446|9196.11|MACHINERY|carefully. furiously bold accounts nag furiously carefully regular accounts-- final decoys prin +261|Customer#000000261|dXkVi8qahjP|12|22-494-898-7855|7094.22|AUTOMOBILE|he special instructions integrate carefully final request +262|Customer#000000262|DcUOAFBxMu8oGKvIqbDx7xgeZ|4|14-698-169-5201|1561.80|AUTOMOBILE|ress packages above the ironic accounts are against the ironic pinto beans. carefully final accoun +263|Customer#000000263|Y2pxeGWkTyaq,0RCzIbZ3|1|11-276-906-3193|1162.03|FURNITURE|usly ironic theodolites cajole furiously. final ep +264|Customer#000000264|24Akixb4hqpRD|11|21-881-683-3829|3195.83|MACHINERY|ular packages cajole blithely a +265|Customer#000000265|sthiqpj6CPAKbD7BBSz9ulRuF9d,ebfaiTc|17|27-716-734-2046|8275.80|MACHINERY|lar, ironic platelets. furiously unu +266|Customer#000000266|VSIEruiMdDvjDaTQxkuK60Yw3AGxO|0|10-474-243-3974|5481.00|HOUSEHOLD|ccounts. quickly ironic excuses after the regular foxes wake along the ironic, fina +267|Customer#000000267|el7 bYzj1USp6T5i3KpfZ43jKegbdO,Jd69|15|25-402-954-8909|3166.94|AUTOMOBILE| detect slyly alongside of the foxes. closely regular pinto beans nag quickly of the blithely bold r +268|Customer#000000268|tkSLQoOpfOa601itad05EcN0UmhjZXdyKRc0r|3|13-720-469-5207|6821.01|MACHINERY|press ideas print quickly. fluffily unusual deposits use blithely eve +269|Customer#000000269|J7kLF9iPOQA 7CVwAmQRpwfZPDJ2q5Seu2Vj1gh|14|24-570-874-6232|7667.35|MACHINERY| close packages-- quickly regular instructions sleep. carefully +270|Customer#000000270|,rdHVwNKXKAgREU|7|17-241-806-3530|9192.50|AUTOMOBILE|ldly final instructions mold carefully along the ironic accounts. +271|Customer#000000271|O,HceV3 XE77Yx|6|16-621-282-5689|1490.35|MACHINERY|ly pending deposits cajole slyly sl +272|Customer#000000272| YDjKpjXEe0A6rDE|2|12-324-877-9650|-746.03|MACHINERY|he regular requests. slyly special +273|Customer#000000273|sOA,alhAw1juArjRLOd|2|12-197-772-5736|-675.05|FURNITURE|ng frets sleep. slyly express dolphins doubt ironically ironic accounts. final de +274|Customer#000000274|adesXwNumnPqsKgsE1groEAwdKNgZ|19|29-330-389-1442|4425.42|FURNITURE|gular dependencies. ironic foxes haggle du +275|Customer#000000275|M1UCTKrZLOgSyr|22|32-194-864-6861|5067.31|AUTOMOBILE|y regular deposits. fluffily ironic packages cajole along the +276|Customer#000000276|iSWxETEMKe5cF|16|26-716-357-3851|2292.67|AUTOMOBILE|eans. even, ironic accounts affix sl +277|Customer#000000277|BWGsQevHk0BfRJV3RRB ElFc|23|33-696-831-5394|8876.10|BUILDING|phins; bold, final accounts print. carefully silent +278|Customer#000000278|4jqLjG 2aeYMFEJi|20|30-445-570-5841|7621.56|BUILDING| pending, express requests cajole carefully special packages. blithely pending accounts affix furiously. fluffily +279|Customer#000000279|9t2Wo1jK1TYnDGg6ODSMGf1W9hRT3F3VK5zxJOC|9|19-220-605-9025|9663.23|AUTOMOBILE|l platelets sleep fluffily against the fluffily enticing excuses. blithely special requests wake somet +280|Customer#000000280|3fDiGmN64En0ei|11|21-537-461-3965|3952.84|BUILDING|accounts. quiet deposits sleep. slyly even instructions detect about the blithely bold instru +281|Customer#000000281|x5gJ8IGm2Fo9Jigt|6|16-809-382-6446|4361.70|BUILDING|fully quiet ideas detect quickly even packages. regular instructions accor +282|Customer#000000282|wcCc, y1996DnOwnXu1i|18|28-251-599-2415|1125.45|HOUSEHOLD|ole daringly against the carefully ir +283|Customer#000000283|jysHDuTKUKYEjdBhtI LqTttTp 7i2kvx1 O3A|7|17-111-303-1282|4450.03|AUTOMOBILE|y alongside of the accounts. slyly express dependencies wake quickly above the carefully ironic package +284|Customer#000000284|2ZgAkaBgb6aigORfIfUd3kHbPi42|6|16-161-235-2690|593.52|AUTOMOBILE|lar gifts. carefully even deposits boost! furiously even braids use afte +285|Customer#000000285|ApUL7bgFMUXGXewpoQyQOSnLeL9Vc1rrkW |20|30-235-130-1313|7276.72|FURNITURE|dolphins after the slyly ironic packages boost furiously among the furiously pending theodolites. bl +286|Customer#000000286|7 7uVDrpkWuozyEd|22|32-274-308-4633|-109.73|HOUSEHOLD|ly special accounts haggle slyly slyly fluffy req +287|Customer#000000287|KTsaTAJRC0eMYkyFm7EK3eeamHs7s|4|14-330-840-6321|1734.18|MACHINERY|requests. bold, silent depths lose f +288|Customer#000000288|eEs5rwc9AOJaKhvV|2|12-674-136-5397|5339.43|HOUSEHOLD| furiously about the carefully ironic packages. express reques +289|Customer#000000289|NUilehg0nVOkK3K1SW0,BAHCeST2JqKzuTMoGS|10|20-456-773-7693|-215.75|AUTOMOBILE|ending foxes across the carefully +290|Customer#000000290|8OlPT9G 8UqVXmVZNbmxVTPO8|4|14-458-625-5633|1811.35|MACHINERY|sts. blithely pending requests sleep fluffily on the regular excuses. carefully expre +291|Customer#000000291|ZlLNbGxnQYMubQ9K|8|18-657-656-2318|4261.68|HOUSEHOLD|e slyly silent deposits. bold deposits haggle slyly special packages. furiously bold requests cajole carefully abo +292|Customer#000000292|hCXh3vxC4uje9|11|21-457-910-2923|2975.43|HOUSEHOLD|usly regular, ironic accounts. blithely regular platelets are carefully. blithely unusual ideas affi +293|Customer#000000293|7ynwX7lZ3o2cmAWSkKAc3edKa 8yT|2|12-887-984-5485|-43.79|MACHINERY|ironic foxes are final packages. requests about the furiousl +294|Customer#000000294|hSaNqI1P2IyEFHY0r0PsPkMqt|18|28-187-946-4260|-994.79|BUILDING|bold packages. regular, final asymptotes use quickly fluffily even waters. blithely express requests wake into th +295|Customer#000000295|mk649IH6njR14woTVZ1cxtlNs URxBHD5o5z2|0|10-340-773-4322|9497.89|HOUSEHOLD|play according to the quickly ironic instructions-- unusual, bol +296|Customer#000000296|4eyqk2zpg4m V JGEtgwNmCq3c|15|25-875-178-1959|8081.52|BUILDING|es need to affix furiously. ironic, final foxes are against the regular instructions: pinto beans haggle q +297|Customer#000000297|hzg,409pj0|15|25-915-518-8800|7096.32|HOUSEHOLD|de of the regular asymptotes detect slyly ironic theod +298|Customer#000000298|jFKF3w 8aegECg7mP,qtuR9IsTSYQlEXq|21|31-542-157-4074|3812.84|BUILDING|sleep slyly. stealthy, bold pinto beans sleep blit +299|Customer#000000299|3F3Q0fTkjIv1UfJbcN7|4|14-948-474-7353|5380.50|HOUSEHOLD|tes sleep fluffily. furiously regular requests boost fluffily evenly even asympt +300|Customer#000000300|I0fJfo60DRqQ|7|17-165-193-5964|8084.92|AUTOMOBILE|p fluffily among the slyly express grouches. furiously express instruct +301|Customer#000000301|FtFq9Cgg5UAzUL|7|17-265-345-9265|9305.05|HOUSEHOLD|ular, regular notornis sleep along the furiously pending foxes +302|Customer#000000302|cJ3cHoAjAiaxTU2t87EJM|4|14-152-594-2967|1107.42|MACHINERY|dolphins haggle fluffily across the final requests. regularly unusual sentiments detect fluffily requests. regular +303|Customer#000000303|5pSw0OIoNRcpyTEEI1gZ6zRMyJ0UGhJdD|3|13-184-254-6407|9339.57|AUTOMOBILE|mise ironically against the unusual foxes. deposits cajole asymptotes. ironic ideas shall have to sleep +304|Customer#000000304|Cilvb3k8ghDX4|0|10-321-698-7663|9217.55|MACHINERY|s integrate at the carefully ironic instructions. fin +305|Customer#000000305|x8kcl,R4Wk|11|21-250-654-3339|4356.59|FURNITURE|nts. even, regular courts nag. dugouts use blithely a +306|Customer#000000306|ADoOEIr5aQcLIoGJM6nCvPEP 91|10|20-109-305-9629|3268.01|AUTOMOBILE|ill have to are. final, express deposits hag +307|Customer#000000307|xvkJ13gs7GH|13|23-836-934-5394|346.59|FURNITURE| ironic platelets nag against the bold pinto +308|Customer#000000308|c9WuNBiEYmGxeBmZaELg WWb|9|19-992-128-2013|4150.76|HOUSEHOLD|ilent accounts haggle carefully unusual dolphins. carefully regular requests wake along the +309|Customer#000000309|6Jg4ECVS2u7i,E|21|31-231-377-9535|8824.78|FURNITURE|lyly. furiously enticing instructions haggle. carefull +310|Customer#000000310|QZnc5mkLIPh6JGrzcHmRzCiL0AmdE92vyM|1|11-838-647-9285|3186.57|FURNITURE|mise fluffily blithely ironic courts +311|Customer#000000311|dvpNARle3mR19GD4s2gpEbkL2mZV3uvV6P|23|33-919-292-8822|6589.50|AUTOMOBILE|essly even escapades. blithely regular Tiresias cajole blithely furiously close packages. furiously ironic pi +312|Customer#000000312|cH6XucXV0V|6|16-316-482-2555|-178.84|AUTOMOBILE|e slyly. furiously regular pinto beans wake slyly according to the fluffily even excuses. ca +313|Customer#000000313|Ay52vCrTXsSmp7TmQ1kujvuItfLGx|0|10-401-786-6040|6115.81|HOUSEHOLD|g to the even dependencies. accoun +314|Customer#000000314|8,tdTVYGYoYRaAKwG 6aDJna4Cfjt,F9DDCC2|13|23-366-243-4713|2394.92|MACHINERY|ets alongside of the slyly pending pinto bean +315|Customer#000000315|pXaKKTCTyc UI3tglBaWRimosymG6ZyOCyb6Vb3M|7|17-442-286-3594|348.58|FURNITURE|s. slyly regular sentiments are carefully. slyly ironic asymptot +316|Customer#000000316|zE dN3aqjaG|8|18-171-394-5011|4571.78|MACHINERY|egular ideas cajole around the ironic, pending deposits. furiously pending dolphins serve blithely regular +317|Customer#000000317|uOeuL8DG1j|19|29-615-537-8871|956.88|HOUSEHOLD|ages. hockey players are. dependencie +318|Customer#000000318|PtJQn0IjYtShb1f2uYTYBnnmUeGNiwcALU|0|10-229-548-7118|9149.98|HOUSEHOLD|nding requests. special, bold instruction +319|Customer#000000319| UQ5mF3sdoZT2|6|16-734-928-1642|1834.36|FURNITURE| packages use slyly always ironic deposits. unusual, even notornis above +320|Customer#000000320|pO8rWSwK j|12|22-358-857-3698|6082.74|MACHINERY|ing requests. furiously regular accounts hinder slyly. final, regular theodolites against the slyly quiet requests +321|Customer#000000321|g3,8g XHACSvjZtJuiNk5BYiyPFnIxg|20|30-114-675-9153|7718.77|FURNITURE|special requests! express dugouts can affix furiously blithely regular platelets. fu +322|Customer#000000322|bWRyCyjH5OfGX|20|30-660-202-7517|4489.98|HOUSEHOLD|usual sauternes are among the slyly even instructions! thinly regular +323|Customer#000000323|ZLnVZ CXRi2,QDrlo|18|28-347-223-6024|1137.67|AUTOMOBILE|ely special foxes. express, final excuses across the packages are quickly amon +324|Customer#000000324|fiW1n6dLSVRkXj7kU1768UI2w1vMxEde5a |2|12-722-560-7023|806.59|FURNITURE|, regular requests kindle slyly furio +325|Customer#000000325|Z I43vl3ta3iYmjXNaSM d6Pe24ibjhdvPSi|15|25-823-702-9630|2377.34|HOUSEHOLD|nal foxes alongside of the always bold +326|Customer#000000326|nWDOTh6X019pfBtV3ikACYZiMjGykLrFnuyAo2|2|12-447-614-7494|1906.52|HOUSEHOLD|ckey players. carefully ironic a +327|Customer#000000327|UyKulwfNnX4l4ba1vQtwCWw8WNP50U8DCU|8|18-606-718-3062|8762.16|MACHINERY| unusual braids. daringly final ideas are quickly c +328|Customer#000000328|9pu j2HoEf1uhiY3jxE9l9fCRfjoVU|5|15-817-180-1487|6709.90|BUILDING|y about the daring accounts. furiously thin escapades integrate furiously against the furiously ironi +329|Customer#000000329|67r6XnIxUVgAc3pRX8tmGOw|11|21-106-357-8302|-651.91|BUILDING|ans. fluffily unusual instructions haggle about the slyly ironic platelets. never regular pinto beans sleep fl +330|Customer#000000330|UfNb7T9CTCnsfN3b|20|30-476-852-2371|8244.73|MACHINERY|en pinto beans. quickly final excuses haggle furiously. slyly pendin +331|Customer#000000331|Ug e2IBbl,LJuqjNz5XeQV|5|15-411-430-7917|170.27|AUTOMOBILE|r the silent ideas. carefully ironic deposits was carefully above the furiously even excuses. evenly regu +332|Customer#000000332|Jfosq,G6ziag7M04IvCx7SMRafyYvSI,Do|22|32-767-972-2596|-267.09|HOUSEHOLD| around the pinto beans. final theodolites haggle +333|Customer#000000333|heiloGYs Yey7NKhEFoiNhUBb,QFbjtn5wt|11|21-908-534-7709|8018.89|AUTOMOBILE|uriously close theodolites! slyly express foxes cajole-- final pinto beans boost blithely along the ironic +334|Customer#000000334|OPN1N7t4aQ23TnCpc|4|14-947-291-5002|-405.91|BUILDING|fully busily special ideas. carefully final excuses lose slyly carefully express accounts. even, ironic platelets ar +335|Customer#000000335|d2JCYLr2F9tC1AZMIvbIYPDQA|21|31-772-165-3138|6837.46|HOUSEHOLD| requests haggle carefully about the quickly special escapades. regular a +336|Customer#000000336|yC zy1i6AGrnykrV McJyjg|2|12-345-190-9898|9241.49|AUTOMOBILE|es. dependencies lose carefully blithely regular deposits. t +337|Customer#000000337|EluRTlO4pE7u0XSKKyvKvVyt4sADWFRLZuiyn|0|10-337-165-1106|-270.59|MACHINERY|ld requests sleep quickly. carefully express tithes wake carefully ac +338|Customer#000000338| aiYAeWgI0okGSJv7OgvKqMvPLhxF3blT8josX|23|33-302-620-7535|4092.49|FURNITURE|ckages nag blithely regular requests: carefully final packages between the slyly regular instructions sleep +339|Customer#000000339|jUs1Im28boIduGhp5vbKK50gM5ov7xH9G|24|34-992-529-2023|8438.07|HOUSEHOLD|ix. ironic, special tithes detect dog +340|Customer#000000340|WRnPrKQmAmoMQgHQERoVOhyTklcHMajJlc|2|12-730-681-4571|4667.12|BUILDING|es sleep according to the even, unusual Tiresias. carefully bold packages haggle. furiously pending s +341|Customer#000000341|4,zQfld2YV9TSeNgCSOvqlxhJvVW8WD|9|19-870-813-8585|8247.11|FURNITURE|low, special platelets alongside of the even, bold theodolites are carefully +342|Customer#000000342|SpDDdUfraEAfCULAuGLE|18|28-690-119-9571|7186.74|AUTOMOBILE|luffily final ideas. finally unusual requests boost slyly above the furio +343|Customer#000000343|ejvvSNHIkJVm8I1zpQINNn5yyJbA|3|13-877-910-5134|5521.36|HOUSEHOLD| unusual requests cajole blithely about the carefully express ideas. blithely even excuses above the pint +344|Customer#000000344|Zasc8,E0VVY|2|12-810-788-6699|-544.95|FURNITURE|le according to the regular instruction +345|Customer#000000345|dGFK ICPKxnsAzlX4UYOUf,n200yyEWhIeG|9|19-209-576-4513|1936.77|AUTOMOBILE|en pinto beans nag along the slyly regular deposits. slyly ir +346|Customer#000000346|K61SvIue3Emcwfel,7f9tO5WyJ58MbT7k3iS|2|12-100-890-4659|238.14|FURNITURE|ickly even pinto beans affix across the bravel +347|Customer#000000347|qRT7WRrnykLDfTc5Ei|1|11-519-832-9913|7348.92|BUILDING|ts use blithely blithely regular theodolites. even requests after the +348|Customer#000000348|ciP7BWkhOe1IbbVGlqJePBI6ZwqENkS|13|23-986-141-5327|3310.49|HOUSEHOLD|al foxes are on the carefully final excuses. careful dependen +349|Customer#000000349|vjJBjxjW9uoRZP02nS p6XY5wU6Ic,6xHpxUKA|23|33-818-229-3473|-565.35|BUILDING|y. bold, ironic instructions after the theodolites sleep blithely ironic packages. ideas c +350|Customer#000000350|G vBMGVmIOHl7tc4HeNMiMkKY|15|25-960-809-3690|19.31|BUILDING|tions. quietly unusual accounts sleep blithely afte +351|Customer#000000351|De35Hx1QiyS0uy|7|17-873-420-4342|3419.54|AUTOMOBILE|telets haggle blithely against the ironic +352|Customer#000000352|HqhIE5GRTK0dFtWpJUQENU4aa1bwdsUBEWtzUw|9|19-906-158-8420|6257.88|HOUSEHOLD|ts are. blithely special requests wake. furiously bold packages among the blithely eve +353|Customer#000000353|eftGCmL4b5rAKdvUe9biJXzAH|10|20-733-644-2244|3199.03|BUILDING|nal theodolites nag carefully. requests wake. slyly ironic ideas according to the blithely pe +354|Customer#000000354|sV3WgvJA06WngO4|2|12-545-101-2447|7095.95|BUILDING|. regular, final requests cajole fluffily. express attainments wake slyly until the even acco +355|Customer#000000355|205r3Xg9ZWjPZNX1z|14|24-656-787-6091|8727.90|FURNITURE|ly bold requests detect furiously. unusual instructions sleep aft +356|Customer#000000356|9RfNXUJivKTonL2bp1eG5IT|10|20-415-457-4421|2934.06|FURNITURE|al packages haggle always. daringly bold inst +357|Customer#000000357|l2C0Xkdib4t4 qKFUcRDOhRQMK7U0|18|28-452-965-8560|8747.36|AUTOMOBILE|ress platelets cajole fluffily final accounts: slyly ironic foxes s +358|Customer#000000358|F z jplpUKWz1Hn7p3ez2qTsiIh|5|15-457-255-3822|-44.66|MACHINERY|e furiously pending requests. slyly bold requests wake deposits. furiously express +359|Customer#000000359|z4lUH9ssc3K2w0UjRIuNRrdqw|14|24-608-547-4751|6375.23|FURNITURE|ifts wake fluffily ironic ideas. slyly ironic deposits above the +360|Customer#000000360|S,6ajyDFO3WUQ0Qr|17|27-604-646-1645|6542.83|FURNITURE|engage. quickly final platelets about the fluffily unusual accounts wake +361|Customer#000000361|l0F8jMJVe63cb|20|30-164-267-4590|7451.84|BUILDING|fully busy ideas. regular foxes cajole +362|Customer#000000362|UscV00TNrNTDddxF7BTk|17|27-651-653-4122|6149.01|AUTOMOBILE|ut the fluffily ironic platelets. ironi +363|Customer#000000363|2Koh mYARhsVcFn0U2Abt35qIyedAr1TxP|17|27-460-529-3937|-573.86|HOUSEHOLD|s. carefully unusual deposits are foxes. furiously even foxes nag carefully according to the furiously express +364|Customer#000000364|SQ3b5Q5OtrmmZjJ87tq,o1TiXKVJQ0M7ZOuud|23|33-492-647-4972|32.24|HOUSEHOLD| dependencies? pending requests use carefull +365|Customer#000000365|QiZRz y1xU|24|34-708-696-5226|737.03|HOUSEHOLD|counts. unusual packages are blithely foxes. unusual dinos +366|Customer#000000366|pPQektSfn55AC7s9SRFkj07I2yXqakvCa|3|13-915-531-6826|-729.74|MACHINERY|nos wake quickly. regular, regula +367|Customer#000000367|yZaDoEZCqt2VMTVKoZUkf6gJ4yj|13|23-939-319-4691|9108.65|HOUSEHOLD|eodolites under the ironic, stealthy requests affix furiously among the unusual tit +368|Customer#000000368|9p ReFA4fseKWYUaUHi|22|32-552-596-4994|84.72|MACHINERY|ic asymptotes. quickly special packages along the bravely bold depos +369|Customer#000000369|ge1XhgI3ADIkvLr5GPMqpup,hzlTVv|8|18-333-644-9832|2881.06|FURNITURE| theodolites? quickly quick foxes are fluffily slyly regular instructions. fluffily +370|Customer#000000370|oyAPndV IN|12|22-524-280-8721|8982.79|FURNITURE|ges. final packages haggle quickly. slyly bold +371|Customer#000000371|dnxjCYwhuSHx 9KX38nV0R16fG|22|32-119-346-2028|7789.14|AUTOMOBILE|equests shall boost furiously special pinto beans. express, ironic ideas sleep across the ironi +372|Customer#000000372|aKPMNZfbgV0neVIBo|19|29-226-339-6392|-921.91|MACHINERY|. furiously even foxes sleep at the forges. bold accounts sleep after the ironic theodolites. ironi +373|Customer#000000373|2hrQ wHkbaNlJCzY,mVkugMIE 8ryNlaA3JHDTjJ|20|30-883-170-4010|2354.06|MACHINERY|requests wake blithely even packages. slyly ironic deposits haggle blithely +374|Customer#000000374|fg4eklU1,UaFOan|22|32-282-723-3627|6718.78|AUTOMOBILE|ges are carefully. slyly ironic deposits about the fin +375|Customer#000000375|e53JADEeGvM1ikhN7aa|15|25-575-273-9756|5562.22|HOUSEHOLD|st the pending accounts. final courts above the pending pinto beans use furiously ironic requests. dolphins +376|Customer#000000376|4NwsvFQU T4mSgzvU1Rx2ZtHOGyaNyhe|16|26-437-952-8986|4231.45|AUTOMOBILE|gs cajole quickly. bold asymptotes wake regularly along the quickly +377|Customer#000000377|PA4levhyD,Rvr0JHQ4QNOqJ9gW YXE|23|33-260-610-4079|1043.72|MACHINERY|. slyly regular ideas cajole blithely. slyly ironic foxes are carefully after the thinly special accou +378|Customer#000000378|133stqM9 LT,a2BSlbm49 nXreFggaZgW6P6J|22|32-147-793-4825|5718.05|BUILDING|ackages haggle fluffily ironic packages. +379|Customer#000000379|t3QzCf,q1NbshmjOIUY|7|17-228-550-9246|5348.11|AUTOMOBILE|l deposits cajole blithely blithely final deposits. express, even foxes grow carefully about the sile +380|Customer#000000380|n2w3Jd1bipwICbOVgrELzcNRexmWSklo|21|31-538-493-4229|2755.46|BUILDING|riously special accounts. slyly final accounts sleep; blithely special requests integrate carefully slyly en +381|Customer#000000381|w3zVseYDbjBbzLld|5|15-860-208-7093|9931.71|BUILDING|t regular, bold accounts. carefully quick packages haggle. care +382|Customer#000000382|UdgAMamK5JnSykA,ZPfR5W5zRFatDUye|8|18-942-650-6657|6269.42|AUTOMOBILE|. blithely express notornis according to the blithely even requests are never fina +383|Customer#000000383|iBIHYgXvVDpu6qq7FlqXVcAIDAzv4qs|2|12-868-920-9034|-849.44|MACHINERY|slyly express ideas haggle blithely unusual dugouts. ironic pinto beans are ironic ideas. +384|Customer#000000384|kDDMb3ML nUSu2Sn7CUHyZVedAFUx9|9|19-271-453-8361|-614.30|HOUSEHOLD|olites. express, unusual dolphins cajole carefully about the +385|Customer#000000385|zJvPI24TSPpiFzYfu3RvTKQ9|3|13-741-675-6890|2457.09|AUTOMOBILE|rs. blithely ironic deposits nag furiously across the furiously ironic accounts. bold deposits sleep express +386|Customer#000000386|DeQxsCxixT8RQ7JV6mddRYGDGQ2WM94|24|34-193-143-1425|232.01|BUILDING|counts. blithely permanent deposits wake slyly! unusual, even theodolites u +387|Customer#000000387|Yj 9g1mNu00rKRkc1ovOmptsPI|18|28-694-363-3673|3404.23|HOUSEHOLD|oach. blithely regular instructions sublate across the quickly regular ideas. qui +388|Customer#000000388|dV4lqEufXkF8R|7|17-856-814-6352|1938.05|HOUSEHOLD| carefully bold deposits: final pinto beans sleep slyly idl +389|Customer#000000389|ij8KNM0,HRvIvnvY w8jQK4zvr1EOO9YM|9|19-264-943-1253|-307.61|AUTOMOBILE|o beans affix fluffily. slyly ironic notornis wake +390|Customer#000000390|Nsc3VZZnVsw0mLAnqqzVz,|4|14-812-253-6693|8862.18|HOUSEHOLD| final packages promise quickly. pending theodolites haggle quickly above the doggedly ironic +391|Customer#000000391|q10SV05KB1038lzUR8P|11|21-604-451-4462|4801.30|HOUSEHOLD|le blithely final forges. furiously even deposits cajole fluffily even patterns. furious +392|Customer#000000392|H7M6JObndO|17|27-601-793-2507|8492.33|BUILDING|efully bold ideas. bold requests sleep carefully blithe instructions. carefully final accounts are blithely quickly +393|Customer#000000393|RSELskV44I3LFA9VLGY2Qe|20|30-749-949-5915|3593.57|FURNITURE|ake furiously express notornis. pending accounts hang slyly slyly blithe theod +394|Customer#000000394|nxW1jt,MQvImdr z72gAt1bslnfEipCh,bKZN|23|33-422-600-6936|5200.96|MACHINERY| instructions. carefully special ideas after the fluffily unusual r +395|Customer#000000395|b06rg6Cl5W|15|25-804-388-6600|4582.28|HOUSEHOLD|s mold blithely regular platelets. slyly silent instructions use slowly slyly specia +396|Customer#000000396|miE7JrCdGpQkF4zYJ27tBdSu IYhQ HXx0 |22|32-902-936-4845|1433.50|BUILDING|xcuses. regular pains wake slyly across the ruthlessly ironic dependencies. e +397|Customer#000000397|EzR2BKJ85SmBDS|7|17-103-357-8777|709.46|FURNITURE|al theodolites. regular accounts are regular, silent foxes. unusual asymptotes above t +398|Customer#000000398|cq9NmtIT4b6JB8L79iLzljlHs4 3|15|25-110-215-3747|8865.61|HOUSEHOLD|l deposits breach slyly ironic asymptotes. carefully pend +399|Customer#000000399|ZBvzMa6N1wdCGaPmG13xVusIxdjSiA94jTXN|8|18-882-664-5454|7358.53|BUILDING|yly even excuses. ironic theodolites wake furiously. blithely regular pinto beans cajole. fin +400|Customer#000000400|U23zy17EPxqmJn7neVc|14|24-522-746-1247|-98.46|BUILDING|fully bold accounts cajole bravel +401|Customer#000000401|aKALIG526OK4veQfUh2KmKcE,oRyg|19|29-667-766-5291|4146.43|BUILDING|l instructions wake. slyly express deposits us +402|Customer#000000402|8Cw4p1m1gKYVUgomkAq,es1ZtrnmHaO|6|16-950-729-1638|2106.67|AUTOMOBILE|dolites. furiously regular theodolites integrate furiously. bravely bold requests are. furiously +403|Customer#000000403|9,BVYegfkFLsEMDkeVW|14|24-753-433-1769|6693.36|HOUSEHOLD|al hockey players; ironic dependencies after t +404|Customer#000000404|2orgvLJ05jOvM292mhkS7iJmHG0jk|22|32-840-785-1776|7408.73|BUILDING|uickly brave requests haggle furiously carefully special idea +405|Customer#000000405|mCQNH1rJtqjjQ9Piauc2bZr4pRFydscZtbD9d|10|20-509-301-7901|7519.14|MACHINERY|nts. pending, express foxes sleep? ironic, pending instructions haggle. ironic, pending theodolites detect slyly. bl +406|Customer#000000406|j1fOG9WsIr2JI6Yi9jgJ M|9|19-426-693-4043|4286.94|FURNITURE|nal foxes. unusual pinto beans wake. special excuses cajole ironic +407|Customer#000000407|cfCP9bE3HnI|1|11-975-454-8499|9537.08|MACHINERY|ect among the carefully regular theodolites. regular dep +408|Customer#000000408|TBjb3m,3aea4JtP833HD4VDk7STz2Y9FB|10|20-177-807-5661|6825.37|BUILDING|unts. furiously ironic depths among the instructions wake carefully along the blithely ironi +409|Customer#000000409|mtrMiDvQxNsy1Cj0cU4ITEW5wGKLPQ2IPHNE9r4|11|21-466-412-4731|3969.86|FURNITURE|fily pending courts. express, regular packages are furiously along the quickly regular packages. +410|Customer#000000410|nYak2u Q9,gYUiLfh1N|7|17-576-345-5940|4349.27|BUILDING| sublate across the pending, express asymptotes. quickly +411|Customer#000000411|V3e,FX5x50scsQDzt5,ESxfOQBt4OzjHRoTZxF|18|28-483-924-1955|1209.32|HOUSEHOLD|refully. slyly even packages above the evenly regular asymptotes are blithely ironic dependencies. deposi +412|Customer#000000412|5IN2Y,QrhDJ2YBVGKiDbMpzi2hk1fmozIy2zQ|22|32-940-318-3191|6044.02|BUILDING|ithely silent notornis haggle. regular requests haggle according to the ironic deposits. blithely final dep +413|Customer#000000413|,4Jm5N0ruhJCB7cBR6Kw|6|16-158-285-7336|5817.90|FURNITURE|ular packages integrate furiously fluffily final accounts. carefully regular +414|Customer#000000414|i49DWI61AFb 45vb1RMH|19|29-552-380-2475|527.78|AUTOMOBILE|sily silent, even accounts. careful, final ideas boost fluffily. slyly final pinto be +415|Customer#000000415|334jCRiUb,gx3|23|33-346-876-2972|2317.93|FURNITURE|egular deposits. blithely ironic inst +416|Customer#000000416|fm7H7k6sYhKfXttOT|12|22-651-146-4780|4365.28|MACHINERY|p the pending pinto beans. furiously express reques +417|Customer#000000417|X3LMSpIn4FgjgJxldHVUlUvKzyX|11|21-794-364-5100|6187.73|BUILDING|lent multipliers. quickly express theodolites kindle blithely. ironic re +418|Customer#000000418|,e0q82drO rgVHXHrJRQ0GDrRoUOl|5|15-826-508-1218|1211.39|FURNITURE|d foxes against the furiously special packages snooze blithely quickly +419|Customer#000000419|gvbZNJ4UVBAo5yOZ2UOWcvV9TeTj|16|26-338-447-2399|7786.69|BUILDING|ideas affix alongside of the final accounts. quickly ironic deposits abo +420|Customer#000000420|HV0YB82MWw93 9K|20|30-776-366-5869|1999.35|BUILDING|ideas wake. fluffily ironic packages hang furiously above the regular, even platelets; packages haggle slyly +421|Customer#000000421|it3mUlkZAe9J8gmy|13|23-918-228-2560|7073.17|FURNITURE|lithely final deposits haggle furiously above the +422|Customer#000000422|AyNzZBvmIDo42JtjP9xzaK3pnvkh Qc0o08ssnvq|9|19-299-247-2444|-272.14|HOUSEHOLD|eposits; furiously ironic packages accordi +423|Customer#000000423|Y2B EbOg39GpFLS0n|13|23-201-501-7824|95.79|BUILDING|ts cajole after the silent, pending instructions. ironic, even asymptotes use carefully. furi +424|Customer#000000424|i4cf3kmRE9IJr,cu,1|19|29-891-311-6778|1866.42|HOUSEHOLD|bove the express, final deposits wake furiously furiou +425|Customer#000000425|lp3aCRBK11qFY|16|26-756-407-4828|5824.88|HOUSEHOLD|ajole even, pending accounts. carefully brave accounts +426|Customer#000000426|GjFjM4zjbyhNrV6XlE|19|29-768-330-6311|7818.25|HOUSEHOLD|ar instructions are against the ironic platelets. slyly final acc +427|Customer#000000427|LHzXa71U2AGqfbqj1yYYqw2MEXq99dWmY|2|12-124-309-3821|4376.80|MACHINERY|y even multipliers according to the regu +428|Customer#000000428|TCVjlzbX7x,kWcHN33LRdEjO38mAGmPR|21|31-587-557-8211|1952.36|BUILDING|furiously quick accounts. slyly bold dependencies cajole carefully. quickly even requests int +429|Customer#000000429|kZBtY,LQAFu4iaSagjfIk8Q8dzgmT|15|25-989-936-1954|9247.21|FURNITURE|ly regular requests haggle enticing excuses. carefully ironic requests on th +430|Customer#000000430|s2yfPEGGOqHfgkVSs5Rs6 qh,SuVmR|3|13-406-611-4228|7905.17|BUILDING|ly slyly ironic attainments. slyly special instructions until the deposits nag quickly whithout the bo +431|Customer#000000431|RNfSXbUJkgUlBBPn|6|16-326-904-6643|2273.50|HOUSEHOLD|e quickly. final, even excuses against the even accounts sleep agai +432|Customer#000000432|FDConiq g20GI9dH QTM ZNX4OB9KU|23|33-307-912-9016|5715.64|BUILDING|wake carefully close, special deposits. regu +433|Customer#000000433|7XFuE4 euQR0w|20|30-659-445-3595|8746.23|FURNITURE|sual ideas affix carefully always regular accou +434|Customer#000000434|6LGAf2hv4MB5MJhfvNsg|3|13-325-443-1474|2940.46|MACHINERY|lly final Tiresias. blithely regular ideas nag stealthily about the furiously +435|Customer#000000435|diwjNQSb3wLYLy WfCDATo5rc1I3 s|2|12-741-309-6377|6217.46|MACHINERY|quickly excuses. blithely express theodolites poach slyly along the theodolites. slyly reg +436|Customer#000000436|4DCNzAT842cVYTcaUS94kR0QXHSRM5oco0D6Z|19|29-927-687-6390|5896.87|FURNITURE|olites engage carefully. slyly ironic asymptotes about the ironi +437|Customer#000000437|0PM1xuHd0q2ElcJp 77F2MykOVBSQnZR8u3jkn|4|14-364-492-8498|7760.52|AUTOMOBILE| foxes sleep across the slyly unusual pack +438|Customer#000000438|eqo9A9oaE2CA7 7,L|23|33-394-388-4375|2131.13|MACHINERY|al deposits mold alongside of the fluffily brave requests. +439|Customer#000000439|3deBblz2syRv8yMf0yAVKkE4mDH20uDRj4tJVHUm|14|24-873-368-6801|-61.29|BUILDING|ions may impress thinly for the deposits? even packages towa +440|Customer#000000440|w4fKMgiBuGmV,nLn7NgJl1DoUWwNQMV8z 5,R|3|13-244-480-5751|1809.04|MACHINERY| even theodolites: fluffily final requests cajole about the quickly regular +441|Customer#000000441|gjYpcBx6MP8GvDa6|23|33-438-355-3491|9451.84|HOUSEHOLD|r requests wake theodolites. quickly final ideas haggle fluffily. blithely f +442|Customer#000000442|rvgayfJFLO2cjzMA|1|11-240-523-8711|4157.00|FURNITURE|lets would affix fluffily. regular, regular ideas ought to haggle carefully blit +443|Customer#000000443|UdyNGZ6GSz5aNpMO5N2|3|13-241-131-1632|3726.22|FURNITURE|t the special, final platelets. bold req +444|Customer#000000444|D8l4G8i9aZ7KRbqp6ajvR8h1wjr|1|11-402-300-1949|1505.27|HOUSEHOLD| express accounts along the pending deposits lose carefully above the furiously regular requests. pen +445|Customer#000000445|MX1UA0KUJzIGyWM p2hbLg5dCpVLws8KNcwEsP|20|30-849-846-6070|8018.81|FURNITURE|e ironic, special accounts. quickly regular packages integrate fluffily slyly +446|Customer#000000446|mJOJwYfch izLCuw70,qhlJSmH|24|34-321-168-5681|9225.60|FURNITURE|ending instructions. boldly ironic foxes across the regularly ironic pains sleep along the carefully final deposits. +447|Customer#000000447|hVZBzP8Pii|3|13-438-344-7007|7665.98|HOUSEHOLD|telets around the furiously unusual foxes detect carefully against the +448|Customer#000000448|BH4vtnDpabk0NgoGNJWu4OUXnidfJ|24|34-985-422-6009|8117.27|BUILDING|unts. final pinto beans boost carefully. furiously even foxes according to the express, regular pa +449|Customer#000000449|DiUXazp8EYcJFsX2a7nciEpo9W5BRB4iqdb9HWL|4|14-893-381-6454|3001.94|MACHINERY|posits boost slyly carefully regular requests. final, bold fo +450|Customer#000000450|KVpuYa4dDW8lZZVBttyK614C2qdS|9|19-782-397-9006|5544.42|HOUSEHOLD|gular decoys nod slyly express requests. slyly bold theodolites are along the regular +451|Customer#000000451|ZJKTC1Ck,B01fYZ xdN2|20|30-939-275-3248|2110.59|HOUSEHOLD|quests grow furiously final deposits. ironic, even pi +452|Customer#000000452|,TI7FdTc gCXUMi09qD|6|16-335-974-9174|6633.70|BUILDING|aggle quickly. unusual instructions i +453|Customer#000000453|PZ4mmWL7R,El0MtLWMfLXp120lo0,itmO|8|18-209-381-8571|5678.18|HOUSEHOLD|sts. slyly even dolphins across the bold, regular foxes haggle blithely +454|Customer#000000454|d9oQCm3onNsFlIoteVjFcQDv|7|17-818-915-9400|6134.40|AUTOMOBILE|ions print slyly platelets. carefully regular packages according to the fluffy, even foxes wake carefu +455|Customer#000000455|sssuscPJ,ZYQ8viO|6|16-863-225-9454|6860.34|BUILDING|l wake. blithely final instructions integrate furiously above the final, regular req +456|Customer#000000456|IgUSuulguDJ5|0|10-784-971-7777|8815.78|FURNITURE|ly even warhorses. quickly even requests wake slyly. +457|Customer#000000457|eaAWe Vqr0x17Uwj1uzQRb wQpXxZVDWS3Wg|20|30-543-684-2857|5867.61|FURNITURE|the foxes. carefully pending instructions integrate fluffily blithely pending packages. careful +458|Customer#000000458|iIKwI3HrgNlD9|4|14-651-706-4016|-38.42|BUILDING|ng. final, express requests are furious +459|Customer#000000459|CkGH34iK 9vAHXeY7 wAQIzJa1cmA8DAEA7m|6|16-927-662-8584|1207.97|MACHINERY|ronic, regular dependencies use above the ironic deposits. carefully express packages use car +460|Customer#000000460|Gbx5Hnw,ctlI7|11|21-643-955-6555|5222.83|FURNITURE|old dependencies mold slyly above the foxes. dogged, express ins +461|Customer#000000461|5vxNLzSASzkbrUr8CRf5|21|31-533-226-4307|9177.63|AUTOMOBILE|sits breach blithely. slyly regular ideas haggle fluffily; special ideas cajole q +462|Customer#000000462|MSqsCvNEkowp7FnscRXP6OUWm|21|31-157-561-4106|4522.60|HOUSEHOLD|ly special accounts? ideas engage regular dependencies. fluffily even pinto beans x-ray blith +463|Customer#000000463|LV7MN7Tkm2NSo4Q3lwvjxGQyRJjRZRf,M|8|18-167-214-5805|-654.50|HOUSEHOLD| quickly along the final ideas. slyly regular accounts are iro +464|Customer#000000464|kAALP9gEt3,G9XtxCXjv38HjKBEP|9|19-269-971-9738|8730.85|AUTOMOBILE|efully express accounts play. special requests use carefully. regular courts sle +465|Customer#000000465|gngnTNn7azjgQlQJnakTZto|2|12-137-838-1346|8432.74|FURNITURE|es. quick asymptotes integrate carefully alongside of the ideas. even requests believe slyly even ac +466|Customer#000000466|ZI1c8,ZanegEu5CEQxNf5,bkuYPwn7H7JIK7|12|22-280-738-3240|3168.41|MACHINERY|foxes. express, ironic accounts boost? carefully silent deposits engage. accou +467|Customer#000000467|amwRkh0nDQ6r6MU|11|21-449-581-5158|9398.51|MACHINERY|manently special warthogs. final ideas a +468|Customer#000000468|IcbihAtOVWcnswfyE|10|20-489-960-5023|9834.19|FURNITURE| accounts cajole quickly above the blithely final packages. even, express package +469|Customer#000000469|JWOULMa5Qtt|12|22-406-988-6460|6343.64|BUILDING|cajole carefully slyly regular packages. +470|Customer#000000470|v9 gWSuP4WrOjNJRgyJtjbNCChQME|20|30-507-458-4433|3597.53|HOUSEHOLD|ilent excuses. never ironic requests sleep furiously. daringly f +471|Customer#000000471|tGr0DtrK 91IgzfeZrSPpPIia3|4|14-574-118-1005|5716.90|FURNITURE|es. unusual accounts try to solve ca +472|Customer#000000472|hWgfnsmTAEOx9Mqp87YwztGrgLLqNkjMPh4|12|22-940-478-1933|7929.90|MACHINERY|deas sleep slyly blithely final foxes. slyly final e +473|Customer#000000473|zO3W9pYj PvlsQGe|9|19-209-647-5704|-202.22|HOUSEHOLD|ter the quickly pending requests sleep above the carefully iron +474|Customer#000000474|mvEKw,6zT0V8Yb2yTG hu990UX|21|31-247-536-6143|9165.47|MACHINERY|ns integrate against the quickly special courts. slyly +475|Customer#000000475|JJMbj6myLUzMlbUmg63hNtFv4pWL8nq|14|24-485-422-9361|9043.55|BUILDING|egular requests. ironic requests detect furiously; deposits ha +476|Customer#000000476|68r87HCBbQkVYaVfes8mgKs|2|12-996-628-9902|5973.10|BUILDING|sly. carefully quick instructions sleep carefully deposits. final, pending pinto beans use closely fluffily final in +477|Customer#000000477|5aW5WHphNgFdIS1Qdp2cIJXG8ER8|23|33-845-877-6997|1836.61|AUTOMOBILE|totes are blithely among the furiously final foxes. slyly +478|Customer#000000478|clyq458DIkXXt4qLyHlbe,n JueoniF|1|11-655-291-2694|-210.40|BUILDING|o the foxes. ironic requests sleep. c +479|Customer#000000479|RdIiG8NbwYtamReRwhR|18|28-336-406-1631|3653.64|AUTOMOBILE|ages. bravely even foxes detect careful +480|Customer#000000480|XyQSPswCeO WPD37K3 mYZ4hnCMJO5p|7|17-231-147-5851|2750.71|FURNITURE|posits. slyly ironic theodolites nag carefully about the quickly final accounts. s +481|Customer#000000481|o4xa7J20NqHM8E0ykH,NKe1gPz04OqIn|21|31-363-392-6461|7157.21|FURNITURE|s can nag slyly instructions. regular, regular asymptotes haggle sly +482|Customer#000000482|389RgNCsmVUKiRskmrQQm90xx JiIxOM0|13|23-732-448-1610|4333.37|HOUSEHOLD|carefully bold instructions. carefully final instructions wake carefully accounts. accounts cajole slyly ironic acc +483|Customer#000000483|Yv1QV 1JsV 9sVbNufRvdnprt0grx52|11|21-799-189-1135|8877.20|MACHINERY|pecial ideas. furiously final i +484|Customer#000000484|ismzlUzrqRMRGWmCEUUjkBsi|20|30-777-953-8902|4245.00|BUILDING|y against the express, even packages. blithely pending pearls haggle furiously above the fur +485|Customer#000000485|XeFbvXCQ,J|19|29-434-961-1623|8695.45|MACHINERY|ecial pinto beans. instructions ought to cajole even +486|Customer#000000486|2cXXa6MSx9CGU|21|31-787-534-8723|7487.40|AUTOMOBILE|nstructions. unusual, special pinto beans sleep about the slyly pending requests. fu +487|Customer#000000487|oTc,l9dAf8O0qOOMP4P0WFTuGS|2|12-111-401-4259|9749.37|AUTOMOBILE|as. excuses use carefully carefully pending i +488|Customer#000000488|bBcMjFPTysSTaTdHcoO|3|13-513-778-1881|-275.58|AUTOMOBILE|thely above the carefully ironic accounts. excuse +489|Customer#000000489|GIdW4IVgeqWMBXnNFZGHS8kmhw|4|14-916-241-6195|8255.83|AUTOMOBILE|lar accounts. finally pending dependencies solve fluffily +490|Customer#000000490| 66fG3Fyb946cVQsH9Z3VMNzR,yfHMKIEB|22|32-268-147-7824|-213.85|FURNITURE|ash carefully never bold instructions. regular, bold asymptotes cajole regularly. quickly bold foxes wak +491|Customer#000000491|r3zPOuenxHl0oqInxWlEyLP1ZH|0|10-856-259-7548|785.37|AUTOMOBILE| slyly special requests hang dogged, express epitaphs. +492|Customer#000000492|JexAgMLuUHoElYFaKx,hJcAP1b1GknYoYHQLyx|8|18-686-244-1077|8635.18|AUTOMOBILE|gle furiously furiously final packages. carefully bold pinto beans promise quickly alongside of the close +493|Customer#000000493|G dRBjxmBBug1 xRSa6VwRchFDtU5b|16|26-514-558-7246|6582.04|MACHINERY|er the furiously express excuses use above the regular accounts. regular instructions after the +494|Customer#000000494|GKgTjHFlQrDZWcketSqhZCopBhmChknI|10|20-330-453-6579|6295.47|FURNITURE|al courts. regular, ironic requests serve furiously. pending +495|Customer#000000495|QhFbEv6KbQIwfZs 1krt1eACKI31v3iyM|7|17-400-405-6060|7997.81|BUILDING| dependencies. silent accounts cajole quickly furiously pendin +496|Customer#000000496|Y8oYLlHme6Z4fEzkTu|12|22-173-644-7922|8174.82|MACHINERY| quickly bold packages. decoys among the blithely pending accounts lose according to the deposits. +497|Customer#000000497|0 qRRXAxUbo1J KDwDMjFde5fXDwn |23|33-937-724-3506|2191.59|BUILDING|fluffy ideas detect carefully +498|Customer#000000498|1Wnja9i7KAC3HxS5yATK,In8Q6AHcEUr0f5Tp|19|29-210-810-1479|3945.64|BUILDING|yly pending requests according to the slyly special asymptotes sleep carefully against the slyly even pack +499|Customer#000000499|m1hO3VXQVbwTbJ99Hw|14|24-387-817-9149|4293.76|HOUSEHOLD|old sentiments cajole carefully among the blithely unusual requests. final packages nag careful +500|Customer#000000500|fy7qx5fHLhcbFL93duj9|4|14-194-736-4233|3300.82|AUTOMOBILE|s boost furiously. slyly special deposits sleep quickly above the furiously i +501|Customer#000000501|lzkYA5C6wa,wX|13|23-867-672-1331|1909.35|FURNITURE|ual deposits wake. quickly ironic platelets along the careful deposits haggle +502|Customer#000000502|nouAF6kednGsWEhQYyVpSnnPt|11|21-405-590-9919|1378.67|HOUSEHOLD|even asymptotes haggle. final, unusual theodolites haggle. carefully bo +503|Customer#000000503|7xCLYGLCpFU,toJBIPIrJbLIuLok81h IxK ae5Z|20|30-441-755-3094|3213.66|MACHINERY| even deposits haggle. packages i +504|Customer#000000504|2GuRx4pOLEQWU7fJOa, DYiK8IuMsXRLO5D 0|10|20-916-264-7594|0.51|FURNITURE|slyly final theodolites are across the carefully +505|Customer#000000505|MAUkwAyEvg61RlCMomspMs0WzYa,Ns|2|12-530-647-8313|6557.51|HOUSEHOLD|mptotes haggle around the theodolites. furiously bold accounts detect quickly packages. special pinto beans +506|Customer#000000506|dT kFaJww1B|13|23-895-781-8227|1179.85|HOUSEHOLD| idle instructions impress blithely along the carefully unusual notornis. furiously even packages +507|Customer#000000507|QlA0Fc 6e,r67ugESzq|14|24-158-185-4455|5727.00|MACHINERY|nst the furiously even deposits cajole slyly among the furiously ironic requests. blithely unusual depo +508|Customer#000000508|q9Vq9 nTrUvx|18|28-344-250-3166|1685.90|BUILDING|uses dazzle since the carefully regular accounts. patterns around the furiously even accounts wake blithely abov +509|Customer#000000509|LHLR0IKQJHVF1 0UvBNPLq0|4|14-115-338-1002|7885.50|FURNITURE|ily! requests cajole fluffily. slyly regular waters na +510|Customer#000000510|r6f34uxtNID YBuAXpO94BKyqjkM0qmT5n0Rmd9L|5|15-846-260-5139|1572.48|HOUSEHOLD|symptotes. furiously careful re +511|Customer#000000511|lQC9KfW W77IYtJjAgSZguNzxjY rYk3t6lcxfSh|13|23-247-728-9743|4571.31|FURNITURE|he slyly close deposits. special, ironic ideas detect furiously carefull +512|Customer#000000512|e5 kymvjf6Vja7tNsL 3dfiK|2|12-144-416-6035|3937.58|BUILDING|packages are slyly after the slyly express packages. bold d +513|Customer#000000513|sbWV6FIPas6C0puqgnKUI|1|11-861-303-6887|955.37|HOUSEHOLD|press along the quickly regular instructions. regular requests against the carefully ironic s +514|Customer#000000514|0qD6Nwp3tG3QqCq9qvRAzT6N8L|23|33-194-775-6756|5840.97|BUILDING|carefully final ideas. quickly final packages are. requests haggle slyly. blithely pending sauternes lose bl +515|Customer#000000515|oXxHtgXP5pXYTh|15|25-204-592-4731|3225.07|BUILDING|ackages cajole furiously special, ironic deposits. carefully even Tiresias according to +516|Customer#000000516|EJwOQMTQnFwvd8r Y7f9i5POy6ZlNkIYxCL hg8t|6|16-947-309-2690|4768.96|MACHINERY|final requests after the furiously +517|Customer#000000517|mSo5eI8F4E6Kgl63nWtU84vfyQjOBg4y|10|20-475-741-4234|3959.71|FURNITURE|al, ironic foxes. packages wake according to the pending +518|Customer#000000518|EsCrt4chk,3IRIzwMHTu 6VQWrfh|17|27-651-256-7682|9871.66|BUILDING|as. quickly regular requests are carefully above th +519|Customer#000000519|Z6ke6Y9J2pYuPBp7jE|5|15-452-860-5592|9074.45|BUILDING|es. fluffily regular accounts should have to sleep quickly against the carefully ironic foxes. furiously daring +520|Customer#000000520|yaOGc9Ve92Bi4F6e0GcheU2MmEOXJE0zqyDT sEA|3|13-612-111-7765|8315.09|HOUSEHOLD| haggle across the even, bold instructions. final, even ideas might wake blithely against the +521|Customer#000000521|MUEAEA1ZuvRofNY453Ckr4Apqk1GlOe|2|12-539-480-8897|5830.69|MACHINERY|ackages. stealthily even attainments sleep carefull +522|Customer#000000522|gPz4FuAGpjvaU4YB9J,fGSnLBr9scEovGO1KkTx|12|22-771-454-9561|6358.46|BUILDING|instructions. doggedly express requests doze blithely. regular theodolites hagg +523|Customer#000000523|sHeOSgsSnJi6pwYSr0v5ugiGhgnx7ZB|10|20-638-320-5977|-275.73|BUILDING| fluffily deposits. slyly regular instructions sleep e +524|Customer#000000524|bpsO77xiAmjwOxqIgAszRu4Y|9|19-844-888-9800|5706.19|HOUSEHOLD|ending pinto beans unwind slyly. slyly final theodolites above the quickly ironic pinto beans haggle ev +525|Customer#000000525|w0pOG5FhH45aYg7mKtHQhAWQKe|19|29-365-641-8287|3931.68|AUTOMOBILE| blithely bold accounts about the quietl +526|Customer#000000526|0oAVPhh1I4JdrDafVG2Z8|1|11-170-679-3115|705.93|HOUSEHOLD|ctions cajole after the furiously unusual ideas. ironic packages among the instructions are carefully carefully iro +527|Customer#000000527|giJAUjnTtxX,HXIy0adwwvg,uu5Y3RVP|13|23-139-567-9286|4429.81|HOUSEHOLD|ending, ironic instructions. blithely regular deposits about the deposits wake pinto beans. closely silent +528|Customer#000000528|SRYjG5Wgp8ZG8GyDFhRIR5ep8yNs3nrCmYa|15|25-985-381-5453|1802.50|AUTOMOBILE| the slyly even instructions. carefully idle packages sleep about the platelets. bol +529|Customer#000000529|oGKgweC odpyORKPJ9oxTqzzdlYyFOwXm2F97C|15|25-383-240-7326|9647.58|FURNITURE| deposits after the fluffily special foxes integrate carefully blithely dogged dolphins. enticingly bold d +530|Customer#000000530|wG6AC7G6Y0DRuzJiroWCByzbrkqeySQDvRXzH|13|23-614-884-1055|4990.92|BUILDING|uctions cajole blithely across the ironic packages. slyly regular deposits wa +531|Customer#000000531|ceI1iHfAaZ4DVVcm6GU370dAuIEmUW1wxG|19|29-151-567-1296|5342.82|HOUSEHOLD|e the brave, pending accounts. pending pinto beans above the +532|Customer#000000532|xwWO3lWjgVJTZwhnltyH6zj5ddkzgH8RbF|15|25-875-978-2232|1725.68|MACHINERY|usly regular deposits kindle. quickly even depos +533|Customer#000000533|mSt8Gj4JqXXeDScn2CB PIrlnhvqxY,w6Ohku|15|25-525-957-4486|5432.77|HOUSEHOLD|even dolphins boost furiously among the theodo +534|Customer#000000534|3PI4ZATXq8yaHFt,sZOQccGl Fc1TA3Y 2|1|11-137-389-2888|6520.97|AUTOMOBILE|deas. blithely regular foxes use carefully bold accounts-- ruth +535|Customer#000000535|,2Y kklprPasEp6DcthUibs|2|12-787-866-1808|2912.80|BUILDING|even dinos breach. fluffily ironic +536|Customer#000000536|jf8PSOQDvqQj4uF8|12|22-521-348-9030|3342.75|MACHINERY|tes? blithely enticing theodolites wake. braids sleep. sly +537|Customer#000000537|wyXvxD,4jc|10|20-337-488-6765|2614.79|FURNITURE|e carefully blithely pending platelets. furiously final packages dazzle. ironic foxes wake f +538|Customer#000000538|u9jYEMPoKwrH5wXivkSebbxAx1PU|19|29-632-471-2852|-303.95|MACHINERY|uffily special requests nag around the quickly stealthy +539|Customer#000000539|FoGcDu9llpFiB LELF3rdjaiw RQe1S|6|16-166-785-8571|4390.33|HOUSEHOLD|ent instructions. pending patter +540|Customer#000000540|YkaXu3o1X8|16|26-933-117-7482|9195.77|MACHINERY| enticingly express excuses. quickly regular notornis cajole near th +541|Customer#000000541|,Cris88wkHw4Q0XlCLLYVOAJfkxw|0|10-362-308-9442|1295.54|FURNITURE|according to the final platelets. final, busy requests wake blithely across th +542|Customer#000000542|XU2ffxnW3TQasrfF0u2KwKWmMarPyY4q7Q|16|26-674-545-2517|3109.96|BUILDING|r forges! requests alongside of the bold, final deposits +543|Customer#000000543|JvbSKX7RG3xuqiKQ93C|17|27-972-408-3265|6089.13|AUTOMOBILE|l, even theodolites. carefully bold accounts sleep about the sly +544|Customer#000000544|Jv7vcm,oE,HEyxekXKia1V5H1up23|5|15-572-651-1323|4974.68|AUTOMOBILE|bout the packages integrate above the regular instructions. regular ideas hinder s +545|Customer#000000545|AsYw6k,nDUQcMOpEws|10|20-849-123-8918|7505.33|AUTOMOBILE| carefully final deposits. slyly unusual pinto beans may wake bold requests. unusual courts alongside +546|Customer#000000546|GZtBXX3OaqFLbC9JNi1hmF1JFLbmRs9|19|29-936-444-8248|3116.50|MACHINERY|ly fluffy braids. blithely special theodolites use express deposits-- slyly regular attainments +547|Customer#000000547|4h SK3dVkE1tQ0NCh|22|32-696-724-2981|6058.08|BUILDING|y express deposits. slyly ironic deposits nod slyly slyly ironic instructions. carefully quick idea +548|Customer#000000548|98nP31ToAGK tCCkYm7HqBZt0dLjy0JzlMMRCmkj|4|14-787-370-8722|90.45|BUILDING|c pinto beans. quickly even requests haggle against the blithel +549|Customer#000000549|v5uqfeHLiL1IELejUDnagWqP5pKWa9LtoemziGV|24|34-825-998-8579|91.53|BUILDING|n asymptotes grow blithely. blithely fluffy deposits boost furiously. busily fu +550|Customer#000000550|q5 gKwc7PBQOyd,H|17|27-938-997-6262|7270.82|FURNITURE|ully regular deposits. slyly ironic requests wake along the depos +551|Customer#000000551|holp1DkjYzznatSwjG|15|25-209-544-4006|-334.89|MACHINERY|y special ideas. slyly ironic foxes wake. regular packages alongside of the deposit +552|Customer#000000552|EbjtaRaiok7eqbQ5VJi7q|2|12-669-784-2191|1353.24|FURNITURE|ickly final accounts cajole fluffily according to the bold, regular accounts. +553|Customer#000000553|8tTlavJ sT|4|14-454-146-3094|4804.57|BUILDING|ully regular requests are blithely about the express, bold platelets. slyly permanent deposits across the +554|Customer#000000554|RluaguNRAJhYXmn,CWxcOC,Ly7|2|12-938-503-7317|8395.57|HOUSEHOLD|jole along the blithely bold +555|Customer#000000555|chm8jY6TfQ8CEnsvpuL6azNZzkqGcZcO8|15|25-548-367-9974|5486.52|BUILDING|lites are blithely ironic ideas. blithely special pinto beans dazzl +556|Customer#000000556|UMHllVkuyQUQ3aLXCVRxrXatsyd0AL6Xw|1|11-934-412-5846|7944.22|MACHINERY|nt excuses! carefully final requests solve quick +557|Customer#000000557|Nt6FUuDR7v|15|25-390-153-6699|9559.04|BUILDING|furiously pending dolphins use. carefully unusual ideas must have to are carefully. express instructions a +558|Customer#000000558|PB1ZV4kQnRHiC|17|27-866-273-7672|1912.23|HOUSEHOLD|ly final requests. regular requests hag +559|Customer#000000559|A3ACFoVbP,gPe xknVJMWC,wmRxb Nmg fWFS,UP|7|17-395-429-6655|5872.94|AUTOMOBILE|al accounts cajole carefully across the accounts. furiously pending pinto beans across the +560|Customer#000000560|gU5FQf0WM0sxTYQ|19|29-618-467-8489|1469.59|BUILDING|sly pending packages boost slyly-- fluffily ironic ideas bel +561|Customer#000000561|Z1kPCTbeTqGfdly2Ab9KEdE,jIKW|18|28-286-185-3047|2323.45|FURNITURE|across the furiously ironic theodolites. final requests cajole. slowly unusual foxes haggle carefully +562|Customer#000000562|04xjB,zuffnhVyEY0 PeiJPtdjh 0ji|15|25-271-465-6971|9234.50|BUILDING|accounts. ideas cajole. quick +563|Customer#000000563|2RSC1g7cVd,j23HusdkhdCGmiiE|12|22-544-152-1215|3231.71|FURNITURE| pinto beans believe fluffily. excuses wake blithely silent requests. b +564|Customer#000000564|qPQOo94iVl|4|14-865-332-8571|6307.59|MACHINERY|onic patterns about the furiously pending +565|Customer#000000565|HCBXAou,1eP6Z3IynHFI7XmEBgu27Sx|4|14-798-211-2891|2688.88|FURNITURE|e. carefully bold deposits sleep regu +566|Customer#000000566|5NmdMIwTpF8tj7O92363ycA6EL5Yh,vW|24|34-443-780-3708|1928.10|FURNITURE|ke express, ironic requests. regularly even sauternes detect de +567|Customer#000000567|KNE6mpW69IgTjVN|21|31-389-883-3371|8475.17|BUILDING|blithe, even ideas. fluffily special requests wake. c +568|Customer#000000568|ZddVCnzeABTTBgV3GvkvNtw9,KOHHpME2GELhz|13|23-603-795-8611|1317.56|BUILDING|gular decoys haggle slyly. blithely special packages slee +569|Customer#000000569|Kk20Q5HiysjcPpMlL6pNUZXXuE|2|12-648-567-6776|-795.23|MACHINERY|sh. blithely special excuses sleep. blithely ironic accounts slee +570|Customer#000000570|0Zo0P6m,sie 1,VXacPX2ccDIyWFolj6R|15|25-264-442-3057|8480.87|AUTOMOBILE|gular instructions unwind bold escapades. special asymptotes snooze according to the +571|Customer#000000571|hCrDDrMzGhsa6,5K4rGXQ|2|12-115-414-4819|8993.23|HOUSEHOLD|le fluffily. ironic, pending accounts poach quickly iron +572|Customer#000000572|Nf4Yqb49BqGkzmmtf6|11|21-425-209-5033|7252.65|AUTOMOBILE|leep. pending requests affix blithely. ironic theodol +573|Customer#000000573|BEluH7it7jUcWqb tNLbMIKjU9hrnL7K|4|14-354-826-9743|2333.96|HOUSEHOLD|as. furiously even packages sleep quickly final excu +574|Customer#000000574|ratVLdmp070|8|18-676-218-1058|9787.56|FURNITURE|al pinto beans. carefully ironic foxes cajole idly finally express theodolites. fluff +575|Customer#000000575|4K6h0pYH,bg2FS5cYL,qqejhvp7EfTlBjRjeVPkq|1|11-980-134-7627|3652.29|BUILDING| final requests cajole after the ironic, bold instructio +576|Customer#000000576|JI7ZI3BRrkt40uuUmg oyZC3pQ2lS65SnSGL|1|11-777-499-8213|2091.63|HOUSEHOLD|sual platelets. furiously final theodolit +577|Customer#000000577|a73SSq2cip7C8nSzdmmscpZyLCZ7KL|14|24-662-826-1317|7059.15|FURNITURE|int furiously. slyly express pin +578|Customer#000000578|nxUZ BCBO1 HAymUcopl2NtyWMuWVnE3bqPVDB|14|24-278-860-9263|6181.23|FURNITURE|ly. carefully pending packages cajole among the carefu +579|Customer#000000579|9ST2x,snyY3s|0|10-374-175-6181|1924.96|MACHINERY|ndencies detect slyly fluffil +580|Customer#000000580|wpvPbaPtx5QN|11|21-444-589-3830|-181.63|BUILDING|dependencies. final asymptotes haggle among the bold packages. slyly silent +581|Customer#000000581|s9SoN9XeVuCri|24|34-415-978-2518|3242.10|MACHINERY|ns. quickly regular pinto beans must sleep fluffily +582|Customer#000000582|KqH6uOztVK55zDxLA9kvdtny i5OYXt|3|13-484-591-9280|4879.55|MACHINERY|carefully against the quickly s +583|Customer#000000583|V3i6Gu9,LZtvdnNppXnI2eKQFx0b36WvL,F |13|23-234-625-4041|3686.07|HOUSEHOLD| haggle. regular, regular accounts hinder carefully i +584|Customer#000000584|jebKvptmHtS9,YE1qOjl2AOw38P,8skngJZh|15|25-352-778-1041|8825.71|MACHINERY|ages boost regular deposits. blithely stealthy depo +585|Customer#000000585|OAnZOqr6A,,77WC001ck8BAqvJTW6,dRGoRdX|16|26-397-693-4170|7820.26|MACHINERY|ickly ironic requests sleep regularly pending requ +586|Customer#000000586|vGaA9XBtn,hlswFhSjLIXGlLEDD2flE8UXwj|11|21-239-369-7791|5134.35|AUTOMOBILE|above the blithely express ideas. slyly r +587|Customer#000000587|J2UwoJEQzAOTtuBrxGVag9iWSUPTp|6|16-585-233-5906|7077.79|AUTOMOBILE|ve the final asymptotes. carefully final deposits wake fu +588|Customer#000000588|ex9SkK7K uM,ki1dsO7PgZLlIuQFKJUQZpD2oS|17|27-988-546-2598|483.89|FURNITURE|ic requests haggle quickly across the deposits. regular, express ideas along the +589|Customer#000000589|TvdYNogIzDfr 1UyJE4b9RTENPmffmIoH|19|29-479-316-3576|1647.05|FURNITURE|s; blithely ironic theodolites sleep-- accounts haggle around the furiously silent ideas. silent, final packages in +590|Customer#000000590|4sHhhAZWHYRxJVz0KRgjW9IlKu,55IuT|8|18-734-215-6394|3993.54|MACHINERY|es. regular dependencies cajole furiously blithely regular ideas. regular dependencies cajole carefully a +591|Customer#000000591|wGE7AnEtiX7cmCkYA|20|30-584-309-7885|6344.66|MACHINERY| regular requests after the deposits cajole blithely ironic pinto beans. platelets about the regular, sp +592|Customer#000000592|srNO5Hu10z1Ru4rRPU,QpXzFwY8759wqZ|24|34-832-574-7217|9712.75|BUILDING|lithely final requests use slyly. special theodolites nag carefully-- carefully pending deposits cajol +593|Customer#000000593|SYyEL2nytJXBbFemMseCiivA32USVEDbvGzZS|9|19-621-217-1535|233.51|AUTOMOBILE|ve the regular, ironic deposits. requests along the special, regular theodolites lose furi +594|Customer#000000594|sbcKWltfCAnXrc Z27ZYDzsH1ztd,ZhgaD9xIMsh|9|19-286-925-8440|6518.42|HOUSEHOLD|. fluffily final instructions are slyly toward the slyly +595|Customer#000000595|7Q17BacxM,liY2AwhnHGR0Pjf1180sMz1U|19|29-554-215-7805|4177.17|HOUSEHOLD|gular accounts x-ray carefully against the slyl +596|Customer#000000596|hoByQV2JchlIWfzPFW8I0nCI|5|15-484-811-5482|1722.88|MACHINERY|ecial deposits after the slyly regular packages dazzle furiously across the courts. accounts wake. reg +597|Customer#000000597|Dbv,XVGzl4X|15|25-687-952-9485|2443.52|AUTOMOBILE|es across the slyly brave packages maintain quickly quickly dogged excuses +598|Customer#000000598|9ICLFWFZa6|9|19-113-384-3847|3244.78|FURNITURE|es. furiously pending packages haggle fluffily carefully silent foxes. carefully unusual dependencies boost fu +599|Customer#000000599|fIvpza0tlXAVjOAPkWN5,DiU0DO4e5NkfgOlXpDI|4|14-916-825-6916|6004.52|HOUSEHOLD|thely even requests wake carefully regular theodolites. instructions haggle alongside of the f +600|Customer#000000600|LOtVjPC,Eu,0I2BRCqWf,K|12|22-675-907-7888|2003.44|HOUSEHOLD|nstructions sleep among the final, even pinto beans. fluffily pending theodolites according to the +601|Customer#000000601|P3 Dv,6yllTNmL9yt6NUZZPZjvM2coWJd|1|11-104-635-9839|9768.21|BUILDING|ly according to the unusual foxes. carefully ironic accounts haggle accounts-- regular dolphins will integ +602|Customer#000000602|NCryKIpG3W,FDV2|13|23-434-900-7213|8404.90|BUILDING|nstructions. asymptotes above the forges are against the carefully +603|Customer#000000603|DFAIWiyqZ0GzuF6AWCZX3DcDxyICb3EWxEw|19|29-629-573-6194|8161.13|AUTOMOBILE|n packages wake carefully. special requests haggle slyly carefully bold deposits. furiously regular pinto b +604|Customer#000000604|qCQsFELZ3W hlmi,zOHBcZGo0PZl3jbFu1jsijqE|21|31-757-951-9827|3195.96|HOUSEHOLD|le furiously express instructions. ideas hag +605|Customer#000000605|QAxZ0IXgCzUfNjseQCLfh95HEi|23|33-269-948-8039|-549.73|HOUSEHOLD|ly regular foxes are quickly +606|Customer#000000606|vBIUd7LjRJ5rZXSzITHIvpZwBCClyt4Hjr Tlnf,|1|11-284-540-8460|9676.98|AUTOMOBILE|, bold packages. regular, final theodolites haggle slyly carefully final accounts. silently specia +607|Customer#000000607|m61hvYPASIGmNJx7Tu|24|34-601-151-4029|4038.45|FURNITURE|ymptotes. blithely bold requests shall are about the furiously final platelets. +608|Customer#000000608|luMI1JpfrrILCEeTgz8k98z|16|26-767-193-8671|2256.36|BUILDING|ld packages. special requests along the accounts are after the carefully unusual deposits. blithely quiet excuses c +609|Customer#000000609|dSpUFl8IR8Gh|21|31-869-580-1707|3651.06|FURNITURE|pending, express platelets poach furiously after th +610|Customer#000000610|Fo8RfPq1kgzD 0|11|21-782-663-7023|3374.92|BUILDING|uriously final deposits against the deposits detect alongsi +611|Customer#000000611|E1dtWGHE7NrLfnSKLPFU|19|29-924-242-5243|4272.43|HOUSEHOLD|inst the slyly final accounts. final packages wake after the even pinto beans. carefully +612|Customer#000000612|oNFqorGhq3a3woEp5q8xVDX|14|24-818-339-9984|7669.16|HOUSEHOLD|ns wake quickly quickly ironic accounts. regular accounts toward the +613|Customer#000000613|AJT,26RbanTdEHOBgTWg|4|14-275-416-1669|6679.75|AUTOMOBILE|ironic, pending deposits: quickl +614|Customer#000000614|YKweqHJfVok|18|28-698-510-6194|9630.24|FURNITURE|y even multipliers. pinto beans nag busily after the busily ironic reques +615|Customer#000000615|6aITapYMqM1fJQKuJD05Yb,6FhjrW|2|12-639-391-3956|-482.48|BUILDING|yly. blithely even accounts sleep blithely unusual in +616|Customer#000000616|yvUE7Qy3Ub6uGhPkuEJeOI|1|11-275-121-4443|6898.65|FURNITURE|ts. blithely bold packages sleep +617|Customer#000000617|Ifjxbt3Y4mGu|14|24-527-532-7752|3625.93|HOUSEHOLD|deas sleep slyly? final, even gifts about the furiously regular +618|Customer#000000618|9O4fhgteQdyFvCkrFm|0|10-675-573-1877|-932.38|HOUSEHOLD|uickly even ideas sleep slyly pending foxes. final, pending foxes nag slyly. permanent instructio +619|Customer#000000619|6bxrNxQA oes7cMa23R 5lDmIOIRThvd|24|34-245-618-6317|2336.99|FURNITURE|ts breach slyly after the slyly regu +620|Customer#000000620|3ztw9KQqKGNsiMM,I1 6g2f,u2Pm5LhlSEe8ZK1k|8|18-466-916-8135|5795.15|AUTOMOBILE|ructions boost furiously among the slyly final dolphins. regular, regular ideas w +621|Customer#000000621|IpFo6e22CRink74PUEPthY9DJJnSeORmQJ4|17|27-667-987-3718|3164.28|HOUSEHOLD|nstructions! final dependencies s +622|Customer#000000622|qdRHTTnVf9O2iFMG1sDm2GSnlM24tKWK|13|23-925-151-9771|5974.11|FURNITURE| asymptotes. slyly ironic excus +623|Customer#000000623|HXiFb9oWlgqZXrJPUCEJ6zZIPxAM4m6|9|19-113-202-7085|7887.60|BUILDING| requests. dolphins above the busily regular dependencies cajole after +624|Customer#000000624|L1hGsNrx4BiN5DIZGk7WMsB90T4ag|4|14-558-935-8773|3907.11|MACHINERY|le carefully. sly asymptotes sleep fluffily unusual packages. final deposi +625|Customer#000000625|uvgDE6eQ2bJp4BkHyVdpYYC8|13|23-789-801-2873|5744.89|FURNITURE|, pending deposits. sly theodolites along the carefully unusual +626|Customer#000000626|PDeE61VY2Q96efuewIZ|5|15-540-121-5663|5447.12|FURNITURE|t brave foxes. slyly pending packages wake furiously along the deposits. carefully pendin +627|Customer#000000627|uOFz ,iMYi02Ksr13Q2nBCETCpSp|15|25-811-790-3533|5826.68|FURNITURE|ages. regular ideas sleep. bold foxes affix. regular instructions haggle. bravely unusual requests haggl +628|Customer#000000628|Vzraru5KbgcC3V|17|27-367-742-4090|4954.25|FURNITURE|l dependencies. pending warhorses haggle. fluffily final accounts slee +629|Customer#000000629|LeXGhXX1mFQ0Cq,7taW ruvRHTpG3q,KkW|12|22-260-205-9116|5100.77|AUTOMOBILE|ic attainments. stealthily pending pinto beans affix carefully ironic theodolites. fluffily final deposits sleep da +630|Customer#000000630|XAw3WrAa mt0DnOuycb16LG9zbUv04DXsS|24|34-396-743-8684|3649.05|HOUSEHOLD|ely across the blithely stealthy ac +631|Customer#000000631|By LIK3TbJ67sJLlpaoOCXZheuX|19|29-864-813-2575|2603.00|MACHINERY|bold platelets haggle. slyly even pearls can solve slyly among the final foxes. slyly unusual r +632|Customer#000000632|sUlni97rSK6DIL|3|13-310-645-6928|-487.92|MACHINERY|ld dependencies sleep slyly along the special requests. furiously regular asymptotes use furiously accounts. +633|Customer#000000633|0pgCxndi1coDLkAV,UJJDMV0wtVVahCQaQap 0M|2|12-450-116-1239|3385.52|HOUSEHOLD|ully. even, final requests use slyly. blithely special packages wake carefully furiously busy +634|Customer#000000634|O09TejHJ6UszNfmqTR cmal8zcs|20|30-997-704-1110|6397.58|FURNITURE|e above the regular deposits. slyly even requests integrate slyly blithely express forges. regular platele +635|Customer#000000635|Ftqi0UYvzz56Ov,J6,ySp5WE4vJ2rtY|2|12-399-186-7550|8216.79|AUTOMOBILE|efully bold deposits doubt above the clos +636|Customer#000000636|7urmO1zY77WBPOWn7pXA OqCm3upL9gOtL4V|7|17-420-712-5063|3660.47|FURNITURE|ions boost furiously at the final dolphins. blithe +637|Customer#000000637|Ey7g4q2oH Q1vs|7|17-983-923-8985|7511.17|HOUSEHOLD|ly furiously even accounts: final, unusual Tiresias do snooze theodolites. slyly regular dependenci +638|Customer#000000638|yyRRorZ HHzU1yJwNJwF72dvUVJ nMlzpKAXEb|24|34-102-347-8343|2258.40|HOUSEHOLD|nts x-ray fluffily across the theodolites. carefully final pearls cajole ruthl +639|Customer#000000639|8OiPHefIPoalRjUoCIwbXz|15|25-221-133-2233|4899.15|MACHINERY|ly bold asymptotes. ironic, even d +640|Customer#000000640|j3vjr0 n,pJFG4gIOtC|2|12-702-315-6637|3025.84|HOUSEHOLD|lly. furiously quick deposits haggle quickly regular packages. pinto +641|Customer#000000641|gbIvFlCygHjj5NG7U|24|34-761-987-7777|339.49|AUTOMOBILE|uriously final requests boost regular, final ideas. fluffily busy packages promise? requests along the bold, s +642|Customer#000000642|6Y1gEH0gMLh0yzlipNR|22|32-925-597-9911|5684.01|AUTOMOBILE| requests cajole blithely quick +643|Customer#000000643|9T 2avhfyF PQ|0|10-978-597-2747|5184.70|FURNITURE|fily along the quickly ironic ideas. final, final +644|Customer#000000644|bfZrdZE0QHtMc,ksudO|18|28-489-845-4801|6183.15|HOUSEHOLD|ke slyly alongside of the silent, even req +645|Customer#000000645|I,Kso,IZ,AL2rK4HhIB1wRWWrx3 yoaZlFs|11|21-242-974-5799|1146.49|BUILDING|. special packages haggle ruthles +646|Customer#000000646|gogI8kweD 2H6U,01lbIp0UWUwljSue,KRcC|2|12-177-329-4316|6074.42|HOUSEHOLD|ptotes. silent requests cajole fluffily along the slyly permanent ideas. pending instr +647|Customer#000000647|2Bx7,7i87h5cagC,ZBz49lyiziLqQoD|1|11-873-931-2886|-132.97|BUILDING|. excuses use alongside of the furiously final deposits. blithely express foxes wake furiously. blithely +648|Customer#000000648|pYCT1OLD5Y7rBjjAKnf0Lqd 41RC,0n,nT3oNWz9|7|17-473-731-8352|7029.24|FURNITURE| wake carefully outside the ironic, bold packages. blithely special dependencies boost slyly even ideas. careful +649|Customer#000000649|EntXL7MF4lU|11|21-656-678-1337|9442.55|BUILDING|unusual deposits engage along the carefully pen +650|Customer#000000650|1hqwYdlDhaqnkRrovbulo0rrDhJZgUz|5|15-842-586-1263|2086.91|AUTOMOBILE|g to the final deposits. quickly regular requests dazzle along the slyly express courts. +651|Customer#000000651|K7rCTwTb3UX9wAO6ihvYxwBOuJNx51|9|19-610-541-4787|4716.31|HOUSEHOLD| fluffily quick dependencies cajole slyly along the blithely final dependencies. carefully pen +652|Customer#000000652|0WlNKsoRqdjU9,5 Qz,bgm5swI,i0Kg|20|30-254-389-5987|-919.65|AUTOMOBILE|p carefully blithely bold platelets. furiously unusual deposits wake. sl +653|Customer#000000653|la,ROBPJ4I2YNzQw,RpbB0sTOjyv3F ZBeWRiQ|11|21-715-573-6928|7307.55|BUILDING|aggle bravely deposits. even du +654|Customer#000000654|Ip,OhnmOeHu9PezZBvw7AHJcBDOWVoVUJKsJyA|16|26-416-434-3449|1067.04|AUTOMOBILE| nag slyly. final deposits sleep along the ironic, bold i +655|Customer#000000655|SceikyyffYL5OUI8rFnAgrT5E|14|24-916-820-5158|1724.68|FURNITURE|e accounts. unusual, pending platelets are quickly. req +656|Customer#000000656|DeZPec2K1U1fCBR2Ul9mnBNjKuXPcRcm|5|15-379-993-4446|-390.09|AUTOMOBILE|uests cajole quickly. final, pending pinto beans wake furiously among the requests. ironic foxes with the forg +657|Customer#000000657|BpXQ3sbx8bCU0|19|29-952-164-8914|8729.97|FURNITURE|ies boost slyly bravely express instructions. fluffily even theodolites integrate s +658|Customer#000000658|9SboxGtXimmJg49IyT3Zt|1|11-675-750-9832|4716.68|HOUSEHOLD|r ideas about the slyly ironic theodolites integrate according to +659|Customer#000000659|ThR9miOedPuwVEZyz 3MMjHPwB|0|10-834-287-1466|5297.68|HOUSEHOLD|s cajole final, regular dependencies. final accounts sleep! furiously regular requests wake slyly silent +660|Customer#000000660|ZD4fphyxb5pyE|0|10-987-901-3986|2110.30|MACHINERY|ding excuses haggle furiously regular foxes. finally +661|Customer#000000661|1MqWuuRVM5y5NlT1kakwke|4|14-983-203-6472|1735.44|HOUSEHOLD| regular theodolites. brave platelets +662|Customer#000000662|ss AgOrB5VFubLk bsmTgbw2ddJD|0|10-728-355-4532|4517.33|BUILDING|ckages haggle: quickly regular ideas are after the furi +663|Customer#000000663| fqLQWxHWWC40GUOgVvb4idYDbE1Gxc6|9|19-613-882-5677|9698.21|AUTOMOBILE|r the slyly final packages. slyly bold attainments detect blithely acco +664|Customer#000000664|viRe1P6HiyL4LXpU7HPwu|15|25-329-655-5068|8878.22|BUILDING|yly ironic requests cajole pending pla +665|Customer#000000665|Fo9QgQsDOP28D3zR|22|32-759-858-2984|-616.79|BUILDING|y along the special requests. blithely regular waters thrash abou +666|Customer#000000666|dD32Q8kL6KW|2|12-594-508-9621|4538.54|AUTOMOBILE| special packages boost across the even accounts. ironic accounts serv +667|Customer#000000667|oQqeEC,OD9XC1JXyOsHqcpv0fPUdP9ek5KKb70tQ|6|16-917-453-2490|3288.76|AUTOMOBILE|lithely about the furiously sil +668|Customer#000000668|PCmw0r6KkLjXZsljablJ|15|25-582-501-2346|8184.21|FURNITURE|uffy excuses are carefully regular, ironic pinto +669|Customer#000000669|axdO3iaVyYXSxnqnwC0p2Dx6Mn3lDDMp|10|20-471-280-4789|6019.20|MACHINERY|ronic decoys. blithely ironic accoun +670|Customer#000000670|RJtcLv6Tjpx|2|12-839-426-4266|6738.93|BUILDING|y unusual deposits are carefully regular foxes. packages dazzle carefully. furiously unusual d +671|Customer#000000671|ic6qGrt0giB,HDEiBK,,FYGHXQpc|21|31-593-213-9388|3227.87|FURNITURE|bold ideas above the ironic packages affix blithely about the furiou +672|Customer#000000672|Rsq8zHIbqRRB8VlgldFlU56j,0SN |18|28-774-971-2700|7778.95|BUILDING|ake. regular requests about the idle asymptotes haggle slyly final, silent packages. carefully special +673|Customer#000000673|Q2S9DoW6mQN5iQ0A8DxD6UxNmPZky|4|14-769-230-8609|3942.58|MACHINERY|ons will cajole blithely. always even packages dazzle blithely across the regular, unusual +674|Customer#000000674|GLZCUQrtiNTrPKdK 0O86ZF|5|15-543-819-4391|7889.64|BUILDING|ites cajole ironic accounts. regular, ironic gifts nag furiously against the blithely express deposits; unusual, +675|Customer#000000675|canew8kOzr8RDTmenqJOn|20|30-299-640-9565|5295.26|HOUSEHOLD|riously even requests boost slowly. ex +676|Customer#000000676|JzJnD kA3KTjTYl|24|34-710-820-8362|5527.61|HOUSEHOLD|es. slyly even theodolites across the slyly ironic accounts nag from the slyly even accounts. accounts are. +677|Customer#000000677|,wTtWOOr wqX2sL,h79myT6nxG1EgY|3|13-398-309-9122|5582.63|AUTOMOBILE|ly brave ideas haggle slyly blithe acc +678|Customer#000000678|BiQyhSp oiDp,,MFVxyrOwMT810qiQlISEPye|9|19-508-735-4910|6302.93|AUTOMOBILE|gainst the carefully pending requests-- furiously special requests haggle? not +679|Customer#000000679|IJf1FlZL9I9m,rvofcoKy5pRUOjUQV|10|20-146-696-9508|1394.44|AUTOMOBILE|ely pending frays boost carefully +680|Customer#000000680|TuONtFVII8TR2QtJyl1lS5f0iagaWWsBm1IQo|12|22-593-663-2200|4366.23|AUTOMOBILE|kages: final deposits believe unusual deposits: b +681|Customer#000000681|x85ncT W41KEcUQCtxE,LD iMNO6j4Hh4x|20|30-809-878-5822|235.53|MACHINERY|ate carefully. accounts hang carefully along the blithely final theodolites. bravely sile +682|Customer#000000682|y5J0HJVI6Mb k4rXTAPbxE9aw|15|25-233-924-7389|7420.60|AUTOMOBILE|he bold, even accounts breach +683|Customer#000000683|G0, q8c6vBykpiLvcuSJLYvqE|6|16-566-251-5446|9120.93|MACHINERY| somas use-- slyly express foxes wake quickly blithely iro +684|Customer#000000684|5kSJ3qMS,7YKdfmwBFzQN4y8EgPiH,8ln19|15|25-456-286-6398|8545.90|HOUSEHOLD| of the bold requests. blithely regular accounts nag alongside of the carefully silent dolphins. carefully +685|Customer#000000685|eRvmYOdl5v|17|27-269-224-9902|2039.84|MACHINERY|nusual ideas. pending packages use carefully. slyly special sentiments cajole after the blithely even accounts. blit +686|Customer#000000686|1j C80VWHe ITCVCV|6|16-682-293-3599|5503.36|HOUSEHOLD| even deposits print quickly. foxes wake. furiously ironic asymptotes across the bold foxes +687|Customer#000000687|UJTC3 WtzvoD39r1GuoCP|21|31-149-119-1456|4999.31|FURNITURE|special packages haggle carefully slyly ironic pinto beans. sl +688|Customer#000000688|2QBxK8WIryWMZTsDM JS7GxWCB6Y71Swa,f1EUxk|8|18-210-546-2836|3354.47|HOUSEHOLD| use alongside of the ironic, pending foxes. final packages use. ironic, unusual dependencies haggle +689|Customer#000000689|Gcie9Q,Wc6J0QvKcefqflajjOtOVchnxqBn9|24|34-325-146-3591|1481.24|MACHINERY|ions. furiously unusual platelets cajole blithely. caref +690|Customer#000000690|xH61m,Si5X4REvi|3|13-489-760-5455|103.45|HOUSEHOLD|nt deposits. final, unusual requests use blithely. slyly unusual packages against the carefully bol +691|Customer#000000691|0RkDX6OLU1hISYCLmdLD C|16|26-741-688-4189|9566.15|MACHINERY|p. ironic, regular foxes against the ironic, special theodolites nod carefully quietly unusu +692|Customer#000000692|d6XE9sg, wINvIz8aZS b8n XuhAQU5|19|29-804-421-1703|276.71|AUTOMOBILE|cuses. slyly even asymptotes doubt quickly. fluffily thin theodolites boost. ca +693|Customer#000000693|r5gn5SUW0tsfkOw42x84|1|11-391-870-8153|6577.21|AUTOMOBILE|onic packages. carefully final sauternes across the even, express deposits h +694|Customer#000000694|3ToF2HqyF9mEcP1QgW NMN,6,KsFq6x4u14MS|10|20-646-375-1939|2222.65|BUILDING|efully final requests detect blithely. furiously ironic p +695|Customer#000000695|fbT9dQCc,su7JboB5FWI6|8|18-131-151-7466|9126.54|FURNITURE|ly express deposits according to the fina +696|Customer#000000696|dYyj4azN0EE GqeZxv|22|32-923-916-5643|3778.97|HOUSEHOLD| ironic ideas among the carefully bold foxes na +697|Customer#000000697|LFwdGCTUYDenZGoA9|4|14-613-651-2263|8121.84|AUTOMOBILE|he regular pinto beans. courts cajole carefully according to the blithely even theodolites. quickly +698|Customer#000000698|FLZ2NG5pKHpPtAh|23|33-282-178-6799|2894.22|BUILDING| sauternes. gifts cajole. slyly pending platelets cajole at the iron +699|Customer#000000699|4R6pspbuk5Sp,036VraUEKPBzs|4|14-865-140-8680|-809.22|HOUSEHOLD|. finally even ideas wake slyly pending dolphins. slyly even instructions wake whithout the p +700|Customer#000000700|zyWvi,SGc,tXTls|0|10-351-119-7514|4367.53|MACHINERY| bold excuses. furiously even asymptotes across the carefully regular dugouts cajole fur +701|Customer#000000701|yQU8LcjocNHkk1hse30M0U1f46MrU6dB|2|12-323-784-5793|148.98|FURNITURE|c packages. blithely final instructions according to the regular pinto beans +702|Customer#000000702|BDKtDAva8rBuCWXT6jXb2JJY7YoRS|3|13-549-296-5659|4782.05|FURNITURE| silent accounts. regular, regul +703|Customer#000000703|ge1GEYt4ewGUiSeqBA4rNB5JhyQ92uKF|6|16-741-513-6919|3998.42|AUTOMOBILE|arefully final accounts cajole quickly blith +704|Customer#000000704|41s9yU0ossOKgBvjPPSTZqhfciy|9|19-998-886-1551|441.44|AUTOMOBILE|ously ironic instructions believe about the pending, regular deposits; final accounts cajole alongside of t +705|Customer#000000705|YKdZRFEGcclF6rmdoiNCY8|18|28-991-405-7914|3199.00|BUILDING|s pinto beans sleep busily. ironic, bold theo +706|Customer#000000706|ycxysGDuWHN98FS4lZ2obT9ZPNRWjJTsHbQXvi|19|29-468-275-6045|6496.08|AUTOMOBILE|ses cajole furiously after the ironic requests. pinto beans sleep busi +707|Customer#000000707|DT0nzkijELHyI|21|31-796-903-4461|2619.52|FURNITURE| the deposits. fluffily ironic pinto beans wake quickly. slyly even foxes sleep slyly quickly final deposits. ev +708|Customer#000000708|9iJJ868sXAdFgZyo0V8cfPRTRaUc3d|17|27-796-490-6026|2297.33|BUILDING|p along the carefully ironic pinto beans. even pinto beans are fluffily against the furiously quick dolphins. s +709|Customer#000000709|drDnC6YXTJgcdfJkpbhrQ7z7XmCsoym2t22jwg|18|28-117-812-5493|-867.94|BUILDING|g the blithely ironic multipliers sleep a +710|Customer#000000710|OCLSZuXw1AEK NLvlofMkuK,YNe,bJD40a|22|32-459-427-9559|7412.12|FURNITURE|ges integrate express, even ideas +711|Customer#000000711|EmACeG3r2Y9bxf7KLLgX,ZdQlATjGaafINO|15|25-306-725-3622|9591.51|MACHINERY|ackages promise. theodolites haggle along the express dolphins. special, special deposits affix slyly final pac +712|Customer#000000712| 8w2pIiA4wWAhtjAdXR|6|16-843-486-5087|8667.09|BUILDING| express dependencies use fluffily final platelets. furiously regular accounts wake furiously. carefully careful cou +713|Customer#000000713|ov fZJgESFHP P|10|20-595-832-3185|3829.03|MACHINERY|lites sleep slyly furiously express requests. even, even notornis affix furious, ironic p +714|Customer#000000714|2,ARep1aMyhgNZqrkc,toQ3XY6FOiCZqNW|9|19-209-782-4244|2438.10|BUILDING|cross the bold pains. bold instructions haggle. even accounts wake slowly. carefully busy ideas need to x-ray sly +715|Customer#000000715|9qLvF42uxUarKl4I 2pEKOMNJmo8Ro5EK|19|29-500-408-6392|85.05|AUTOMOBILE|hins boost quickly. quickly regular epitaphs haggle fluffily quickly bold pinto beans. regular +716|Customer#000000716|jbXpMEcV9j,6ciftBXEMXDjE|12|22-501-849-6084|8364.99|AUTOMOBILE|as. even accounts about the slyly pending excuses lose bl +717|Customer#000000717|TqWi1c aNhdExPcDD7KQ18W|12|22-660-518-8009|8510.94|MACHINERY|ns poach slyly. carefully express pinto beans ab +718|Customer#000000718|w,GXCSSI4NEHAFPKG|20|30-605-635-8197|8438.40|HOUSEHOLD| regular packages-- pinto beans detect ironically. furiously even accounts detect unusual, pendin +719|Customer#000000719|wry Gj3xd8QX ylUCulG|15|25-498-699-7824|-774.47|HOUSEHOLD|gly express pinto beans sleep furiously around the quick foxes. +720|Customer#000000720|8shFEL7J9sq1NJXR8dixBqaTO,kbSx|22|32-575-838-4260|5357.32|HOUSEHOLD|furiously above the furiously ironic c +721|Customer#000000721|N6hr4gV9EkPBuE3Ayu |21|31-174-552-2949|3420.64|AUTOMOBILE|ar instructions. packages haggle stealthily ironic deposits. even platelets detect quickly. even sheaves along +722|Customer#000000722|aymiuXFyrALTRIzfbLDvtaj37ydq|20|30-633-109-9587|2724.80|BUILDING|leep sometimes express accounts. regular theodolites wake quickly ab +723|Customer#000000723|5tKvCvmVB0yxyAF|21|31-542-178-2520|738.57|BUILDING|e quickly against the blithely final requests. regular pinto beans nag fluffily fur +724|Customer#000000724|dF80enl1y5MfccEMqYz0JSY|5|15-316-638-4703|3035.29|AUTOMOBILE|s. bold accounts about the carefully final packages detect slyly pending platele +725|Customer#000000725|fm8t3X05Wm,PQxPSPHZy,rHI,wUBLTFO5S |16|26-923-317-3870|5030.24|FURNITURE|ts. accounts after the even pinto beans boost across the ironic, silent accounts. reques +726|Customer#000000726|4w7DOLtN9Hy,xzZMR|3|13-168-233-7513|6253.81|BUILDING|wake after the regular, final instructions. final epitaphs mold fluffily blithely ironic id +727|Customer#000000727|wLIX8hKnk0qjUAAGqm|18|28-815-316-3525|807.37|FURNITURE| requests-- quickly regular pinto beans need to detect +728|Customer#000000728|uACufK5vIMlsq,v9d4U5ZWi,|24|34-195-384-1105|4349.73|BUILDING|re stealthily furiously bold requests. carefully final pinto beans lose slyly +729|Customer#000000729|YZxBLBAqBmW53g2ia6s4u,MlJ4WhW|20|30-900-572-2883|8947.26|MACHINERY| packages about the furiously even foxes sleep furiously furiously pending ideas. slyly ironic epitaphs +730|Customer#000000730|ORP6ofUwyD1|2|12-513-973-2702|4718.23|AUTOMOBILE|foxes would cajole furiously slyly special forges; slyly regular pinto beans inste +731|Customer#000000731|D0ceqTVRO3EctrC|7|17-731-915-9753|9311.17|MACHINERY|lar dolphins are carefully slyly final theodolites. unusual accounts integrate across the regular, final deposit +732|Customer#000000732|tQ,r4voHok7oeKw9msDh4ORGje|16|26-154-285-2634|4830.51|BUILDING|structions are after the even deposits +733|Customer#000000733|Ks7Ed2g7zDP905tLGdGcFtomDNchNdaPK2cd|13|23-110-948-6754|4351.09|HOUSEHOLD| furiously. pending, quiet packages nag slyly. stealthy pinto beans haggle +734|Customer#000000734|xULRxhbfzPT5nBh|18|28-880-175-5173|9750.71|AUTOMOBILE|tions against the ideas haggle furiously quickly regular forges. carefully final requests solve even, +735|Customer#000000735|8Gn WOTY4cgGaoHwezrZ,JN,Px8e sr|5|15-959-576-4327|293.88|BUILDING|ites. furiously unusual frets boost among the slyly ironic theodolites. packages cajole +736|Customer#000000736|zQNs5e2aFcVY8MigFQEBtoCaQ9e|1|11-617-726-2039|9114.68|MACHINERY| the deposits. blithely regular asymptotes boost q +737|Customer#000000737|NdjG1k243iCLSoy1lYqMIrpvuH1Uf75|18|28-658-938-1102|2501.74|AUTOMOBILE|ding to the final platelets. regular packages against the carefully final ideas hag +738|Customer#000000738|iecb89zRRNeN3KywZSaPXEWMjz|10|20-722-370-5220|2734.95|MACHINERY| carefully slow instructions. furiously express dependencies alongside of the ca +739|Customer#000000739|pAROUfTi3wCEHi1PXu|14|24-309-302-6776|6344.18|HOUSEHOLD|ly regular accounts. blithely final theodolites sleep blithely. furiously regular decoys cajole blithely. bold de +740|Customer#000000740|FCerGpsfsWAsBrQTyqdzMxUQnbQembHKGg|10|20-215-156-3727|1733.76|BUILDING|ets. final, blithe theodolites abou +741|Customer#000000741|jiPAOQuJ5gIauMfvcbE8lKUVPMp|12|22-560-854-2068|9195.41|HOUSEHOLD|ve the fluffily regular accounts wake carefully ironic grouches. slyly bold theodo +742|Customer#000000742|2qRObRkFktME6SsNV0Pa3L8txbA0AFtXuWsKrkW|12|22-610-582-8610|6381.24|HOUSEHOLD|eodolites alongside of the daringly ironic deposi +743|Customer#000000743|WJ lVLsFSgZJCHHLqwRmvCjWvYlCs0c2TvO|20|30-743-559-7934|8450.37|HOUSEHOLD|ptotes. furiously even accounts haggle slyly. ironic foxes sl +744|Customer#000000744| nYSoGuQkf|7|17-121-555-4268|2458.81|HOUSEHOLD|n packages. furiously silent foxes sleep regular, regular accounts. slyly ironic patterns cajole fluffily +745|Customer#000000745|vjuHvDKdaomsivy l|18|28-913-438-9403|7115.14|FURNITURE|o beans. bold, regular theodolites haggle carefully about the quickl +746|Customer#000000746|JOKj8N2QKUm8Gi,F4qX0fLVy|20|30-154-354-9928|1164.46|MACHINERY| final theodolites. final pinto beans haggle-- furiously +747|Customer#000000747|uuichgTY7NjlZaaRZ6S7KzvapZWvAiCUWAQr|8|18-793-504-2931|67.95|FURNITURE|eodolites. blithely regular pinto bea +748|Customer#000000748|1 nkl3GMSnweulTNAMPeB8Sa5aSIk|23|33-403-226-2580|6959.09|AUTOMOBILE|nts. special excuses thrash blithe +749|Customer#000000749|U1Dvu0r793a|24|34-158-697-9591|7491.42|MACHINERY|accounts was. final, final requests wake. theodolites was slyly. blithely even foxes wake carefully ac +750|Customer#000000750|5OyNRajjgjjbaXtI rkxvB2lX4c6u|8|18-235-587-1274|269.90|BUILDING|s. regular, regular deposits sleep carefully blithely bol +751|Customer#000000751|e OSrreG6sx7l1t3wAg8u11DWk D 9|0|10-658-550-2257|2130.98|FURNITURE|ges sleep furiously bold deposits. furiously regular requests cajole slyly. unusual accounts nag unusual ide +752|Customer#000000752|KtdEacPUecPdPLt99kwZrnH9oIxUxpw|8|18-924-993-6038|8363.66|MACHINERY|mong the ironic, final waters. regular deposits above the fluffily ironic instructions +753|Customer#000000753|9k2PLlDRbMq4oSvW5Hh7Ak5iRDH|17|27-817-126-3646|8114.44|HOUSEHOLD|cies. deposits snooze. final, regular excuses wake furiously about the furiously final foxes. dependencies +754|Customer#000000754|8r5wwhhlL9MkAxOhRK|0|10-646-595-5871|-566.86|BUILDING|er regular accounts against the furiously unusual somas sleep carefull +755|Customer#000000755|F2YYbRT2EV|16|26-395-247-2207|7631.94|HOUSEHOLD|xpress instructions breach; pending request +756|Customer#000000756|Lv7cG by4Wyd8Hzmumwp8hSIZg9|14|24-267-298-7503|8116.99|AUTOMOBILE|ly unusual deposits. fluffily express deposits nag blithely above the silent, even instructions. expr +757|Customer#000000757|VFnouow3LhLvEDy|3|13-704-408-2991|9334.82|AUTOMOBILE|riously furiously unusual asymptotes. slyly +758|Customer#000000758|8fJLXfS5Zup0GQ3xBKL3eAC Q|17|27-175-799-9168|6352.14|HOUSEHOLD|eposits. blithely unusual deposits affix care +759|Customer#000000759|IX1uj4NFhOmu0V xDtiYzHVzWfi8bl,5EHtJ|1|11-731-806-1019|3477.59|FURNITURE|above the quickly pending requests nag final, ex +760|Customer#000000760|jp8DYJ7GPQSDQC|2|12-176-116-3113|2883.24|BUILDING|uriously alongside of the ironic deposits. slyly thin pinto beans a +761|Customer#000000761|oObRVLlulGS5xikRk8La|19|29-835-631-4258|1525.96|BUILDING|ress Tiresias haggle across the never ironic ideas. blithely pending theodolites cajole ironically +762|Customer#000000762|n5QsjD,gTSrdNRoRpvWqS|11|21-757-455-7898|3764.90|FURNITURE| sublate carefully carefully regular deposits. bold foxes along the gifts nag +763|Customer#000000763|ACMrkbcf3a2J3aobVEmU5hGnHuc|1|11-232-719-3610|2650.27|BUILDING| ironic asymptotes are. slyly bold realms alongside of the fluffily specia +764|Customer#000000764|F8WBznjtO2bX2knXl4ghnsp ixWylkf|16|26-714-322-4800|2061.45|MACHINERY|tructions. quick theodolites kindle +765|Customer#000000765|b7w2edOUZNe0QX 3Ab3y5RFlMZX|20|30-544-657-7473|5683.33|AUTOMOBILE|ter the blithely regular foxes. slyly bold packages use bl +766|Customer#000000766|zGTH6uWKoQxIE|16|26-283-847-8946|4677.55|BUILDING|ly special deposits boost blithely above the slyly ruthless ideas. carefully bold asymptotes unwind about the e +767|Customer#000000767|9f3 XsYXdvP0E39ZBi7r7oRCns3PTx,H|17|27-526-143-3959|7647.09|BUILDING|ngly express dolphins boost carefu +768|Customer#000000768| ,cIZ,06Kg|18|28-851-493-8588|9618.84|BUILDING|to cajole blithely express asymptotes. foxes use quickly. carefully special ideas could have to are bravely bl +769|Customer#000000769|0eGzsjpDFsN0|5|15-102-635-4835|5950.86|HOUSEHOLD|ggle slyly pinto beans. furiously even excuses above the +770|Customer#000000770|IjwJR6TjBJZbKIeouH2d|8|18-856-112-5677|2066.79|AUTOMOBILE|dolites haggle express, express requests. furiou +771|Customer#000000771|J9UMiYJznHVHZDuCG,ErV0iiMStETS|23|33-761-371-4753|7461.74|AUTOMOBILE|arefully unusual accounts shall boost unusual pinto beans. ironic, final ideas boost. slyly i +772|Customer#000000772|TBxlR0AAHeSYl0vyK 8joF|20|30-405-614-4887|7555.16|MACHINERY|ular requests. final ideas sleep. regular, even platelets could haggle blithely bol +773|Customer#000000773|NyRSeog kIkD7YOb0EuSfSGxfptN5nkX26Mk6|8|18-456-377-3723|4578.24|FURNITURE|hely silent ideas could doubt carefully al +774|Customer#000000774|95 O8gd08tdtmJwM0ebHUnDc|11|21-463-652-6686|-506.37|HOUSEHOLD|nd the bold platelets affix furiously doggedly express accounts. carefully unusual deposits serve furiousl +775|Customer#000000775|Cg3M4gTXeIY7llMN2puop7D2|17|27-903-936-7924|1376.67|BUILDING|ts. blithely regular requests upon the ironic, final courts haggle sly, regular deposits. final requests +776|Customer#000000776|rzhIStRHsiWoc6K,7yv3YMqVdrz|15|25-941-650-8313|2669.01|AUTOMOBILE| express accounts. furiously ironic theodolites serve blithely. blithely thin packages are among the eve +777|Customer#000000777|27adTXaVp7araW|20|30-765-163-9750|9097.52|AUTOMOBILE|pinto beans; furiously special platelets haggle quickly against the slyly unusual foxes. +778|Customer#000000778|tCuRA2W9y5iiGrcT7a4TzK|23|33-702-179-3134|52.43|MACHINERY|hely ironic instructions. regular, ironic requests affix along the carefully +779|Customer#000000779|2cTZiS4ulZ74edT,RmDnh4ZaCrphMMh Ff2|5|15-940-483-5702|-902.48|HOUSEHOLD|old dependencies. pains haggle fluffily carefull +780|Customer#000000780|CMxcdzgEUkCWP1|8|18-844-576-7345|9874.12|FURNITURE|, final packages use slyly regular deposits. slyly ironic instructions nag careful +781|Customer#000000781|FQCAkyfV0 kL3,FNA1OlBjABak|18|28-478-388-5881|6403.62|MACHINERY|ake blithely blithely final foxes. blithely silent pinto beans haggle furiously. fluffily bold acco +782|Customer#000000782|HFuyemzqz0g QhkL|19|29-850-576-7450|-326.32|AUTOMOBILE|usly bold deposits-- furiously ironic accoun +783|Customer#000000783|01bR7OOM6zPqo29DpAq|1|11-920-256-8525|2436.32|FURNITURE| slyly carefully pending packages; doggedly bold theodolites boost slyly slyly dogged excuses: slyly expr +784|Customer#000000784|evcGXqbosO6,qhx|14|24-975-574-2063|3170.47|BUILDING|cajole quickly. ironic dependencies wake quickly. silent ideas use furiously +785|Customer#000000785|gEkI8kSq8RYgO6tiTA0AB7urZX8s2w03JGwtMi9|18|28-808-670-2983|108.14|BUILDING|nal theodolites. dogged, ironic deposits wake carefully. slyly regular requests after the furiously ironic +786|Customer#000000786|viZtkiJ gbMcPrINM3Ez,33vOJW|13|23-413-365-2022|400.03|MACHINERY|ccording to the regular deposits. carefully final packages run. slyly final deposits h +787|Customer#000000787|wwPe2vMZZ1n1Mm2z0qzDfS43FPj2Ndn|10|20-210-617-3870|212.16|AUTOMOBILE|e. ironic theodolites serve regular foxes. pending requests haggle slyly busy instruct +788|Customer#000000788|LbFHoDpNUSu3AyDS7KLgjoQBJV|16|26-388-689-9272|-330.69|FURNITURE|. unusual packages against the +789|Customer#000000789|DW0NMV Ci5V2bnsX0Al98plG1J0QZqNwcjEVW|9|19-176-517-4263|6038.60|BUILDING|as. quickly special courts integrate slowly final accounts. ironic packages are slyly about th +790|Customer#000000790|CR bzmYYVP|0|10-368-832-9671|2724.98|BUILDING|riously final requests haggle to the blithely special requests. blithely pending gifts after the carefully silent id +791|Customer#000000791|3ZWQ5xexnnLDEmxpmbg|13|23-575-775-4059|3694.81|HOUSEHOLD|posits cajole carefully along the slyly final packages +792|Customer#000000792|icVt7HjGs,p3YL3nr1MHgaQIY5Gmzej57nB,b|7|17-392-500-4370|1672.46|AUTOMOBILE|latelets along the carefully even packages cajole blithely packages-- even pinto beans haggle +793|Customer#000000793| SltK1IMp2Xvwb,A0x3Co1uhcwr|0|10-404-953-9048|2072.99|BUILDING|uickly silent foxes use after the +794|Customer#000000794|RMY8 LyGnJ67NGc5cxPYiIDSF|23|33-633-470-5945|1709.50|FURNITURE|gular patterns cajole slyly blithely final ideas? furiously unusual courts wake among +795|Customer#000000795|droXvSIcNEElsEYS|14|24-973-990-6608|8443.18|HOUSEHOLD|packages cajole furiously since the slyly +796|Customer#000000796|79bj5Rk3jJj9ked7M|3|13-554-411-6773|2584.23|HOUSEHOLD|re slyly even deposits. pending pac +797|Customer#000000797|bdGkzA5duas6LZ1ywB96K6Av3x 99q95h|0|10-994-609-7082|3063.11|HOUSEHOLD|iously regular packages mold fluffily. express, idle accounts nag furiously across the carefully ironic req +798|Customer#000000798|wW2OgnHj6dBz tO9OXFqCLm|4|14-670-423-7529|-391.13|HOUSEHOLD|sleep slyly ironic, express ideas. slyly special packag +799|Customer#000000799|LVk8ljWeIYTQQFMKCmxEeRpWQT|12|22-909-693-7833|2263.25|MACHINERY|ets haggle. busily final packages nag carefully after the bo +800|Customer#000000800|mpI6pkdnWLZsBbQi4,uUC5Y3TcM9vmRIgZelrQ|14|24-555-630-2261|9443.39|AUTOMOBILE|ly alongside of the carefully ironic deposits. blithely ironic packages are blithely agains +801|Customer#000000801|UQ67hfDJlxgX68hiFPmDuHav12Vx|16|26-439-495-8236|5207.32|FURNITURE|sits wake blithely according to the slyly un +802|Customer#000000802|ZDk4Suvi8gMp2LLAOW6nFA 3u|0|10-606-236-5778|1377.52|BUILDING|the carefully even pinto beans. carefully unusual pinto beans against the asymptotes cajol +803|Customer#000000803|zm7Xs6RJJJfZ|18|28-855-429-9109|6003.09|BUILDING|. blithely special instructions +804|Customer#000000804|u6xYwCLD,Vd4ODt8|24|34-861-760-4796|3.43|AUTOMOBILE|usly. final accounts integrate slyly above the furiously sly pinto beans. furiously unusual ideas +805|Customer#000000805|wCKx5zcHvwpSffyc9qfi9dvqcm9LT,cLAG|10|20-732-989-5653|511.69|BUILDING|busy sentiments. pending packages haggle among the express requests-- slyly regular excuses above the slyl +806|Customer#000000806|FTM62Dujm2BoblKFY w|12|22-888-883-2475|6859.28|FURNITURE|the carefully regular accounts breach above +807|Customer#000000807|zKjtrn5FGIs|17|27-333-779-5333|1929.89|MACHINERY|y final patterns? carefully pendi +808|Customer#000000808|S2WkSKCGtnbhcFOp6MWcuB3rzFlFemVNrg |19|29-531-319-7726|5561.93|BUILDING| unusual deposits. furiously even packages against the furiously even ac +809|Customer#000000809|eApaa5hW3Mqp11ZuOP|16|26-776-223-5427|-594.23|HOUSEHOLD|ackages. quickly unusual dugouts c +810|Customer#000000810|3J1wwVhwzVT7XM1v3Rzx90a8c4|9|19-997-929-2765|9632.77|FURNITURE|ep pending deposits. quickly bold accounts are carefully instructions. ruth +811|Customer#000000811|Rau3ADOLCNXM42D6fjQTFuueQce2BHw9r|15|25-575-731-2159|9010.02|BUILDING|kly pending foxes dazzle fluffily after the furiously bold packages. fluffy +812|Customer#000000812|u9uI3BE68quHja6k0,UXRYFgvLHl3jKhn|17|27-714-618-2239|3428.67|BUILDING|ar packages. packages thrash amo +813|Customer#000000813|VBNrCYm67O|9|19-585-173-1514|5673.47|HOUSEHOLD|ts cajole silently bold pinto be +814|Customer#000000814|KmMC1nd5iOXTRlhzMu13Wtx|15|25-342-269-3824|4011.18|BUILDING|yly at the blithely regular excuses. carefully thin pinto beans boost slyly furiously regu +815|Customer#000000815|TmpTFwt3b0 WQUmljE1LKbg50dtQszn67qEog|12|22-941-606-7227|5841.33|HOUSEHOLD|unusual accounts. slyly ironic pinto beans nag against the regular, regular requests. slyly p +816|Customer#000000816|k2dnnQZowe|24|34-457-910-7430|9239.32|BUILDING|accounts cajole slyly quickly express platelets. carefully silent theodolites wake carefully. pe +817|Customer#000000817|jDJt0Wfk0,Wcx5HOI5itS XqUJmMpjzJ|0|10-566-341-4382|7297.64|MACHINERY|y against the carefully special patterns. unusual accounts sleep quickly final instructions. +818|Customer#000000818|CvQvKClYoh9lPjMngrjbCoxqqnp2QFiTe8eF|20|30-943-141-5174|-574.39|BUILDING|yly. blithely final platelets haggle regular, regular ideas: furiously r +819|Customer#000000819|cug3zDy qHUaZMQNEtYlWK3R,mGrid4Of|12|22-424-990-1743|2152.05|MACHINERY|y final accounts sleep slyly express ideas. carefully express foxes sleep. carefully stealthy pin +820|Customer#000000820|xsYy3Nu7RhNYyBqL8dD0fONh|4|14-993-368-5047|-614.28|AUTOMOBILE|g, final ideas. slyly ironic packages dazz +821|Customer#000000821|PVdTfF7cfPueJS0MBncE5v4bKfPV64Zg|5|15-901-460-2033|2691.42|FURNITURE|wake carefully. slyly express deposits wake furiously among the fluffily final deposits. pa +822|Customer#000000822|ZoRr18ZiDTtkRduo6PO60gNRg,b46zOe QdS8B|13|23-410-801-1644|736.47|BUILDING|ding dependencies hang alongs +823|Customer#000000823|HuoOuJLxx7S8YDQhexfmIX|0|10-109-430-5638|738.79|AUTOMOBILE|l requests are against the slyly ironic pinto beans. blithely unusual packages wake alongsid +824|Customer#000000824|qHxq5m g6Ug,SDq7R17|18|28-454-124-5859|6840.29|AUTOMOBILE|ffily unusual packages. furiously final ideas +825|Customer#000000825|L8P98o,xq9E78kmuadw,Z7Rwy|10|20-492-863-1129|1809.01|HOUSEHOLD| busy deposits. careful, bold foxes eat furiously according to the final as +826|Customer#000000826|f5Y UZoE nR|13|23-762-328-7631|8938.14|BUILDING|usly final dinos. final depths wake slyly across the final, bold requests. bl +827|Customer#000000827|fmmKD8aBlF9bFndkYf402cHVrUj8FhGZtHeL|14|24-196-343-6537|5411.20|HOUSEHOLD|om the carefully even requests are slowly along the regular +828|Customer#000000828|0PkG ELwBIgU4AsNcjDc5Q,9Gj|23|33-108-680-4317|7059.68|BUILDING|cial instructions. accounts nod special accounts. slowly even deposits belie +829|Customer#000000829|4oht3f64ZWA1,ACbBP9DNxjjG1CbIqOCK|8|18-404-707-6095|4086.56|MACHINERY|deposits cajole slyly ironic, express packages. asymptotes cajole ruthlessly +830|Customer#000000830|4fNmWCmfys1jUI|23|33-408-548-6806|7775.65|AUTOMOBILE|ironic packages integrate alo +831|Customer#000000831|1DyQwHuUncB7BSnQUiW8ksexb|20|30-495-591-5384|3401.49|AUTOMOBILE|c instructions. fluffily bold requests are furiously quickly ironic deposits. carefully +832|Customer#000000832|eNIy9PatAWlh0|19|29-264-864-8387|-201.49|HOUSEHOLD|the special ideas. finally ironic accounts doubt. slyly regular ideas +833|Customer#000000833|t3qDCo,Yh MZcJFV6PibeY,MUunz|6|16-624-307-4875|-526.14|FURNITURE|uickly final orbits across the blithely express accounts integrate furiously among the final sheaves. blithe +834|Customer#000000834|y4mA, TY6DW4gAY|14|24-637-803-7812|-976.25|MACHINERY|regular dolphins. furiously careful ideas eat beyond the bravely regular packages. slyly unusual deposi +835|Customer#000000835|Sjqs42jh111|21|31-700-242-6347|2106.81|BUILDING|gside of the furiously final packages wake quiet, permanent accounts. unusual packages into the unusual, ironic req +836|Customer#000000836|rayz3tXswDbL4hyIr5SMrEIOTqvmok48e|12|22-181-313-6281|9184.72|FURNITURE|press deposits-- fluffily express accounts cajole carefully according to the daringly even deposits-- furi +837|Customer#000000837|mMNC8wjT5aC655e3|9|19-572-730-8324|2701.29|BUILDING|he bold, pending theodolites. special, bold accounts haggle. blithely regular ideas nag fluffily regular packages +838|Customer#000000838|BxDlz44b56kXjsTpl|5|15-919-192-7197|1605.76|AUTOMOBILE|elets. never express accounts haggle slyly. depths along the requests haggle bl +839|Customer#000000839|Ch8 wZk5UKK45BSq1uZLJL0Z A8UUoms|22|32-435-825-7973|2924.78|HOUSEHOLD| close accounts. unusual pinto beans sleep quickly slyly bold instructions. blithely unusu +840|Customer#000000840|9wA4l70okCEW3GnYQvlIAXetDgD50l|22|32-802-156-1748|6799.00|AUTOMOBILE|usly according to the slyly regular pinto beans. blithely regula +841|Customer#000000841|pSISKRxFIgVasW71fLyaEuODHZQLBfd6E c7jo|9|19-556-695-9964|884.20|FURNITURE|ly. slyly special instructions wake. carefully even accounts sleep quickly slyly silent deposits. s +842|Customer#000000842|stRBRwdFCkdN|0|10-272-126-1413|8635.49|FURNITURE| silent pinto beans. bold, pending platelets sleep furiously express theodolites. fluffily express reque +843|Customer#000000843|OEJ7AElvHgEtDpjcrXgLK|14|24-979-584-7928|675.73|HOUSEHOLD|ronic somas. accounts was among the carefully unusual requests. unusual pinto beans are blithely regular depths. s +844|Customer#000000844|1nUzjsH9HS1sPAGLwDIom9IESivLeEh1BvyynjU|11|21-285-410-4046|2954.90|BUILDING|ymptotes. ironic, unusual notornis wake after the ironic, special deposits. blithely fina +845|Customer#000000845|fIq5p0GpDtw6FIsPMdbqNYgfSw3gL9ep|13|23-125-871-9246|6898.89|AUTOMOBILE|deposits above the deposits wake bold instructions. special accounts cajole. ideas along the regu +846|Customer#000000846|EWQcGkx0CU5ZGUNcTV9bBCQ4qnuKsHC|18|28-766-714-9136|7650.73|MACHINERY|s. quickly thin requests against the ironic, bold requests haggle above the final foxe +847|Customer#000000847|oR9VbMI LkR2GUv4MRmylhb|23|33-645-447-3944|4822.08|HOUSEHOLD|haggle carefully. pending, bold foxes play carefully ironic frets: slyly unusual ins +848|Customer#000000848|a nIm5Bk7 RMqMZ6|15|25-655-714-7125|5685.59|BUILDING|st furiously blithely pending packages. deposits across the +849|Customer#000000849|kqRGW2JQtTM,a6 DzJMgcU9U|24|34-718-798-7751|9670.64|MACHINERY|ly silent ideas. fluffily even packages boost carefully fur +850|Customer#000000850|GdhPVh9rkPqSt v17ZuxIlx8c1N8G|22|32-546-203-4000|7576.55|FURNITURE|ly ironic accounts whithout the regular waters are blithely abo +851|Customer#000000851|H9HRTaOz4yI9elrUUiS|9|19-678-843-9850|1144.23|FURNITURE|cross the final packages. blithely ironic excuses serve slyly about the final accounts. fluffily +852|Customer#000000852|fR1Cq8d6m,zJwS3FFrOBV7u|5|15-252-941-6247|1098.98|AUTOMOBILE|unts thrash quickly through the express, regular theodolites. +853|Customer#000000853|U0 9PrwAgWK8AE0GHmnCGtH9BTexWWv87k|2|12-869-161-3468|-444.73|MACHINERY|yly special deposits wake alongside of +854|Customer#000000854|flSR,SlEXwxrDcm3uedfK1Oiq,c9mZI|0|10-544-967-2382|3393.86|AUTOMOBILE|t slyly after the furiously even escapades. carefully regular pa +855|Customer#000000855|i8mS 0Plk2tI8HG1Mnzj8v5RIl5JqmwTSW2Wq|1|11-379-392-2701|3550.49|BUILDING|s. carefully final deposits detect furiously slyly even packages. final, special accounts eat along +856|Customer#000000856|X4U7LH4YtDzephie|15|25-336-316-9641|6988.55|FURNITURE|y bold pinto beans according to the pending foxes +857|Customer#000000857|TFCCMlSEyrItYvEZy068NhrUxJz|5|15-856-649-3113|7537.16|AUTOMOBILE|g to the deposits cajole furiously final deposits. furiously silent dependencies agains +858|Customer#000000858|8qSqHq,Fc378KIPPbTNmaL 0bpAwO|8|18-509-453-8977|-829.37|BUILDING|, special accounts. ironic, pending requests might cajole flu +859|Customer#000000859|yp6dlWnpbzQboP5Xj8W|17|27-379-135-4463|6737.18|BUILDING|uffy foxes boost about the eve +860|Customer#000000860|t0GtEsh39KvInVMH7CDn0xi|12|22-895-319-1388|6836.89|BUILDING| deposits above the blithe requests maintain furiously slyly even packages. slyly regular requests boost. blith +861|Customer#000000861|GvlCZ4fJYbHTOTYczE1iH2k6K9edUyNxWZsl6x|14|24-939-734-5650|-336.80|BUILDING|arefully regular requests unwind slyly +862|Customer#000000862|zkaZ,iOp8t9MBK9T,JIPGL5hmBmK,xjkjHEP|2|12-479-479-6941|2338.92|MACHINERY|yly regular foxes sleep. quickly ironic foxes use furiously express deposits! carefully regular +863|Customer#000000863| oaBBxuQLKPawG1yqOc7cyVhOezCy|3|13-801-392-5922|5274.52|AUTOMOBILE|d accounts detect. bold pinto beans against the slyly ironic +864|Customer#000000864|lKcUKtfu0myNF5msATCFVHHXfMg3,cdb|12|22-897-966-6672|8932.76|AUTOMOBILE| instructions detect slyly. never pending dependencies use slyly enticing accounts. slowl +865|Customer#000000865|UIv4t5cbA7j1ftOSatj2EKah3p|9|19-245-153-1471|3016.38|BUILDING|nic deposits print blithely slyly final accounts. special, express accounts are fluffily a +866|Customer#000000866|u,b0GdP7dZg|20|30-436-285-7224|6265.88|FURNITURE|ts. bravely express pinto beans after the blithely bold requests x-ray busy orbits. furiously pending +867|Customer#000000867|KmET9DxfPVs15pIUUWQ|14|24-522-194-4543|5680.23|FURNITURE|t according to the careful packages. regular +868|Customer#000000868|cFG8Fa5h1e uvHJ9pgZAO|22|32-850-421-3334|7616.48|FURNITURE|the requests. regular dinos at the even requests use furiously around the sheaves. slyly final theodolites bo +869|Customer#000000869|PDGU7BXDNXAo0vmo7QtDm,yCMVcD|2|12-379-344-7132|1228.06|HOUSEHOLD|. final packages wake slyly? blithely even deposits haggle carefully regular packages. unusual requests +870|Customer#000000870|6wGPZX1SbXLGtweqx8jK|2|12-953-532-5903|1970.76|BUILDING|es cajole slyly. furiously even asymptotes are furiously regular packages. special, final ideas s +871|Customer#000000871|KcLmBKitbx7NvU7bpu9clIyccxWG|20|30-933-714-8982|-395.89|HOUSEHOLD|ts. blithely silent courts doze. regular atta +872|Customer#000000872|vLP7iNZBK4B,HANFTKabVI3AO Y9O8H|17|27-357-139-7164|-858.61|BUILDING| detect. packages wake slyly express foxes. even deposits ru +873|Customer#000000873|XFnr9C2bANXL|6|16-375-385-5712|-797.38|AUTOMOBILE|lithely ironic, silent forges. furious +874|Customer#000000874|rdo knkGhtvpH6dbLkQon8QsrK1z4LFUpaVDTOn2|0|10-886-494-4217|5391.74|AUTOMOBILE|st the deposits. furiously even requests cajole slyly. bol +875|Customer#000000875|8pQ4YUYox0d|3|13-146-810-5423|-949.28|FURNITURE|ar theodolites snooze slyly. furiously express packages cajole blithely around the carefully r +876|Customer#000000876|NMzgtdV zCuRIMK0vV,DP9ynDd6Z9X3T|20|30-320-481-3076|4367.63|MACHINERY|ronic requests haggle blithely. slowly ironic ideas against the fluffily +877|Customer#000000877|uYO2BKogrHcOcHEgzjlmZAa1QYyR45i8|16|26-400-912-7812|1755.33|MACHINERY|packages cajole carefully. slyly regular pinto beans bo +878|Customer#000000878|hUCH2juGwk4OtThyY8p35Hi0,IfOGA|15|25-465-180-9022|8781.53|FURNITURE|the quickly pending deposits cajole care +879|Customer#000000879|EJcG18hFrS0SPT0yvl1b|2|12-878-466-6505|2235.20|HOUSEHOLD|ntegrate by the carefully special requests. dolphins sleep e +880|Customer#000000880|ogwHmUUFa1QB69pAoYAAoB0rjbdsVpAQ552e5Q,|8|18-763-990-8618|-77.63|FURNITURE|regular requests. regular deposits ar +881|Customer#000000881|XJ94RTR2oXI omeh|4|14-127-261-7876|2141.71|FURNITURE|pinto beans. asymptotes about the slowly even theodolites are pending requests +882|Customer#000000882|hsKaXwHCLD|2|12-437-842-6799|1650.12|HOUSEHOLD|ts. quickly regular packages alongside of the furiously silent theodolites nag slyly after +883|Customer#000000883|qVQ8rWNU5KZYDcS|3|13-526-239-6950|479.96|FURNITURE|uctions are carefully across the regular, regular asymptote +884|Customer#000000884|5KyisO0Tv9ZtlJhzyI7vAe88|21|31-483-489-6172|1601.60|FURNITURE| among the quickly express theodolites. accounts sleep furiously along the special, pending depende +885|Customer#000000885|nNUbC73nPBCKLg0|5|15-874-471-4903|-959.94|HOUSEHOLD|sits impress regular deposits. slyly silent excuses grow +886|Customer#000000886|QOTGbGPJjNPD7IrfAILA1da|12|22-771-691-7229|1194.33|AUTOMOBILE|slyly even foxes according to the pending, special accounts use carefully against the courts. regular, +887|Customer#000000887|CoInl1fmf5MjYn15AdA|1|11-136-651-8293|7009.42|MACHINERY|ording to the fluffily regular foxes nag fluffily instructions. thinly careful accounts around the furio +888|Customer#000000888|3vlJp0W8cniEXV|12|22-855-455-1154|6358.04|HOUSEHOLD|sleep carefully quick pinto beans. packages hinder beneath the instructions? ironic, unusual theodoli +889|Customer#000000889|pLvfd7drswfAcH8oh2seEct|13|23-625-369-6714|3635.35|FURNITURE|inal ideas. slowly pending frays are. fluff +890|Customer#000000890|rvsLCrRX9z,IPaaF9kqwvLLxueobbPiH4pz|4|14-938-708-4678|3329.21|BUILDING|ironic accounts cajole ruthlessly above the carefully pending accounts. quickly regular theodolites cajole. iro +891|Customer#000000891|AW0m6YSpe,BNPHvBj|11|21-439-958-7518|6032.18|FURNITURE|sits. final foxes run. quickly pendin +892|Customer#000000892|N KwiRAwIk6KL9WJ6vt0G|9|19-589-784-1249|4799.98|FURNITURE|ses are carefully. quickly regular theodolites cajole. carefully express accounts wake sly +893|Customer#000000893|W6m7LofOZoik72ku|13|23-827-724-6816|8250.87|BUILDING|ets. ironic instructions nag even, regular courts. slyly iro +894|Customer#000000894|5y7m8Ts4kDf|16|26-844-679-1540|4483.42|AUTOMOBILE|carefully regular accounts sleep carefully slyly ironic dependencies. blithely ironic accounts wa +895|Customer#000000895|MDaJr8ekGTS79bS7CH8f1WgWPU|0|10-933-819-2037|904.43|AUTOMOBILE|ggle final packages. slyly regular instructions affix fur +896|Customer#000000896|Tu1ZBNgiSEL9Ns|0|10-425-565-3199|7659.72|AUTOMOBILE|affix carefully unusual requests. furiously fin +897|Customer#000000897|nW1X1Hl9uWycuBEu3F3|6|16-988-776-4568|1999.42|MACHINERY|riously regular ideas sleep into the final, unusual +898|Customer#000000898|JrvrIEzAre,VJzJCi3SEmib1T2,YVXVvOGxaVZwR|3|13-265-738-4361|8137.24|AUTOMOBILE|s haggle around the special dependencies. slyly regular requests are according to the idly sly ideas! fluffily final +899|Customer#000000899|Th5XO5ImeCe9nHFQfQMCkNcmf5WHSeYQaR5TJ|2|12-594-534-9654|8605.53|FURNITURE|rding to the furiously unusual accounts. express, express accounts nag furiously. ide +900|Customer#000000900|kEhE1Y,OoZTDv,Auh d5G ALINN0rND|1|11-422-328-1612|3195.39|BUILDING| packages sleep slyly around the quickly special packages. final accounts are furiously. bol +901|Customer#000000901|QUyXt94YM6Ou6rDqK|12|22-202-667-4372|938.35|HOUSEHOLD| foxes maintain. theodolites sleep above the regular deposits. slyly bold excuses boost careful +902|Customer#000000902|A1hnMyYPSkXf7QgOPD2H|4|14-209-883-5797|5858.48|AUTOMOBILE| sometimes regular epitaphs. furiously regular gifts against +903|Customer#000000903|URTiQupkhObWG39,kZ3CfU|7|17-706-779-2078|509.23|FURNITURE|kly doggedly even instructions. regular, regular accounts along the even, bold packa +904|Customer#000000904|YdJEbNygDU6DrgWXQY6orasq|5|15-940-929-4572|9562.82|BUILDING|nic dolphins alongside of the slyly final ideas run +905|Customer#000000905|f iyVEgCU2lZZPCebx5bGp5|3|13-803-156-2231|-600.73|BUILDING|slyly closely ironic dolphins. blithely ironic asymptotes haggle carefully ironic theodolites. furiously +906|Customer#000000906|1Uavkms1A5z|6|16-594-569-6627|-613.45|HOUSEHOLD| accounts. furiously silent ins +907|Customer#000000907|UeVLwnnpccsG1pbQmN7pzD|10|20-501-816-7673|5751.31|HOUSEHOLD|sits haggle quickly above the excuses. slyly ironic packages print furiously. carefully pending reques +908|Customer#000000908|Fa5bchMKUMsaNKOXAiu9pX ME|12|22-814-669-9320|3215.96|AUTOMOBILE|quickly express packages. blithely fina +909|Customer#000000909|b 2X284A5AGpt8skuYwMvTyK68srMKikPst6X|24|34-717-350-9722|5565.58|MACHINERY|se carefully around the special, regular requests. ironic theodolites cajole quickly theodolites. regular, ev +910|Customer#000000910|Qg8TJTCT1mJ9H|9|19-899-463-4292|5794.69|BUILDING|uctions. silent requests after the regular theodolites haggle furiously across the ca +911|Customer#000000911|VS0fia,lJ RvUf68 l4Unv,Vx|13|23-121-746-7339|6364.60|BUILDING|gular foxes! permanently regular packages wake. quickly regular deposits detect blithely. carefully express +912|Customer#000000912|dQA12NEPQK1A5mvD|14|24-348-437-3105|3861.36|FURNITURE|sits use slyly carefully final dependen +913|Customer#000000913|aohNRUjsMbBNE1Ax|14|24-500-946-3315|6935.16|FURNITURE|y blithely final dugouts. accounts wake accounts. asymptotes above the even +914|Customer#000000914| LErnJFeOuDeMgvVzPKHS|5|15-915-758-7313|1230.79|MACHINERY|accounts. slyly final attainments boost slyly express, pen +915|Customer#000000915|mtGezp1BRzcfPVl,1,G8Wl|0|10-452-398-2445|3776.53|AUTOMOBILE|r ideas. final dependencies haggle fluffily. express ideas behin +916|Customer#000000916|9Zo7nkmzJla4Q4PE5mbw|23|33-511-587-8754|130.59|MACHINERY|sual ideas cajole carefully ironic excuses. final platelets use slyly. quickly special instructions nag. bold escapa +917|Customer#000000917|KZ TS0omSFmUQkIOmzlXhwQS,OcF3wzz5|1|11-100-917-5264|3679.65|HOUSEHOLD|arefully fluffy pinto beans. enticingly silent requests affix furiously busily regular ide +918|Customer#000000918|WSptkDdGQQyJ6|19|29-992-318-6425|-155.06|MACHINERY|s boost furiously slyly final dependencies! fluffily regular sheaves nag fluffily. slyly even courts sleep sl +919|Customer#000000919|cHGtsqVvXRiK|9|19-537-180-2200|9774.97|MACHINERY|lar instructions. blithely final deposits haggle furiously bold pinto bean +920|Customer#000000920|oDBFWKIP6M6OlYRPmqCBkVpVSj6uFa|2|12-905-464-3299|990.58|HOUSEHOLD|. ironic, pending frets haggle carefully. ironic, +921|Customer#000000921|XYBVDdDifSYrW gUeDPhITqMjpjtbnc|8|18-765-936-2316|3651.09|HOUSEHOLD|g the furiously unusual theodolites are carefully accounts. slyl +922|Customer#000000922|Az9RFaut7NkPnc5zSD2PwHgVwr4jRzq|7|17-945-916-9648|3869.25|BUILDING|luffily fluffy deposits. packages c +923|Customer#000000923|ckBLWkfYtn2VZXWWqUGbDgbP|11|21-476-142-5086|7462.20|HOUSEHOLD|s. furiously express depths boost. regular requests boost furiously. even, unusual deposits cajole blithely. expre +924|Customer#000000924|yKEtokQYXiuSSh8ZP5|15|25-518-232-9865|4212.53|BUILDING|ake slyly furiously even deposits. express pinto beans are carefully quic +925|Customer#000000925|jn Razhw70hWtHN4iRBWsf1UmrFUPn36Ni562ex|10|20-753-609-6699|1939.39|AUTOMOBILE|ironic accounts cajole carefully. even, expre +926|Customer#000000926| 3b8K2YhfbGDJOpSAUrvq82MnkhHBdwL|16|26-783-803-1329|274.50|AUTOMOBILE|ly quickly unusual foxes. fluffily regular ideas among the regular plat +927|Customer#000000927|Uy7xvOwo4Ndha1tSxDKrQ gXUTdS ,YDqwE2YSO|17|27-332-891-1391|2417.65|MACHINERY|es affix quickly carefully regular platelets. slyly special theodolites would sleep furiously after the special, +928|Customer#000000928|A9 UduEb48ffOe27FxMXF|21|31-508-509-6393|8330.70|HOUSEHOLD| instructions cajole fluffily alongside of the blithely regular re +929|Customer#000000929|c dPfaAmmoLjR3m|23|33-487-459-1026|4079.18|MACHINERY|ously silent foxes cajole slyly pe +930|Customer#000000930|84jHYR8u2XvhyT|19|29-562-904-5451|4787.20|FURNITURE|sual ideas according to the furiously regul +931|Customer#000000931|M,lWVafqdRIO, WnAyLLt|0|10-349-498-1720|2409.69|BUILDING|s the carefully regular packages: pending +932|Customer#000000932|HN9Ap0NsJG7Mb8O|13|23-300-708-7927|6553.37|BUILDING|packages boost slyly along the furiously express foxes. ev +933|Customer#000000933|V0SPv2VbrNo7Pj|14|24-623-803-8018|8541.16|MACHINERY| accounts haggle quickly against the blithely even accounts. deposits sleep blithely quickly p +934|Customer#000000934|UMAFCPYfCxn LhawyoEYoU9GZC7TORCX|12|22-119-576-7222|-592.69|AUTOMOBILE|fluffily requests. carefully even ideas snooze above the accounts. blithely bold platelets cajole +935|Customer#000000935|XkVT4jvetY4JV76IAkd91sSp9CqsICE|0|10-724-445-8323|2531.25|MACHINERY| furiously pending ideas. daringly +936|Customer#000000936|hwJIFpxofea6CLEbWZFsWUxNrGFLANp|11|21-100-538-9635|3650.90|MACHINERY| furiously enticingly final foxes. pending requests wake quickly according to the slyly regu +937|Customer#000000937|usrG6ohdPROyd98c9|23|33-869-990-3946|668.51|AUTOMOBILE|ickly alongside of the express, express ideas. sly +938|Customer#000000938|wrq9S3rEW8zXUVCXpa7uKi|12|22-157-321-7590|2584.52|BUILDING| the quickly special accounts are regular patt +939|Customer#000000939|jYaDdfxAlL1aVKPfN|19|29-627-844-1293|8059.51|FURNITURE|ages integrate carefully. sometimes even sheaves wake sometimes unusual ac +940|Customer#000000940|T7ROXBXdajS,vkwy3VuC8wNvA|19|29-958-573-1004|253.59|AUTOMOBILE|ent accounts. slyly even accounts breach across the dolphins. quickly regular pains dazzle carefully. sl +941|Customer#000000941|297w97UgOfpV3pv2QniJUWBKq0BRpcawOfpj|19|29-745-875-1061|2990.18|FURNITURE|e furiously along the slyly bold pains. ironic, ironic foxes affix quickly even deposits. packages caj +942|Customer#000000942|y0OKxFyfXeYuklJDY9RwujlNIC2ETXo9HxZCVhg1|18|28-560-449-7675|5898.17|HOUSEHOLD|lar depths! carefully regular pinto beans after the deposits wake about the packages. final, final instruc +943|Customer#000000943|74dBRGOKLFEQEqCgH2x8WGL9tubtgJAbHu|5|15-483-251-8603|7541.05|FURNITURE| quickly along the silent, express braids. quickly pending packages boost fluffily furiously regular foxes? a +944|Customer#000000944|8lO9F4WK6PKWXiocyE,ojIfPNfVY8|4|14-485-139-5142|9454.78|BUILDING|ilent pinto beans are according to the regular, final somas. idle, bold foxes was. som +945|Customer#000000945|300zKNJ9lg|15|25-542-662-1673|9615.39|BUILDING|. ironic deposits haggle among the carefully regular excuse +946|Customer#000000946|ufHQOmRhQoLSiyfQ|21|31-152-357-9762|2990.73|FURNITURE|ly after the furiously regular asymptotes. foxes play quickly ironic packages. dinos along the silently expre +947|Customer#000000947|JnzDRxqCwjRPyeq70wrxzKWLXI|22|32-838-393-6825|4092.24|BUILDING| blithely final instructions grow furiously ironic requests. furiously special theodolites sleep after +948|Customer#000000948|yxBr7nLGxxwECEk|17|27-125-968-3750|4346.90|AUTOMOBILE|he final, even deposits. furiously special pl +949|Customer#000000949|tOBbBIfhWM lNI3YxTYH8Or8Ki|2|12-391-316-1861|5340.67|AUTOMOBILE|pecial, pending dolphins. slyly final ideas boost quickly. carefull +950|Customer#000000950|mi3o6cp47mo8Miqh9d R1XWStjxatcQqHQZW|15|25-849-760-2017|9609.77|FURNITURE|s wake quickly after the carefully brave multipliers. regular excuses wake care +951|Customer#000000951|PnC4Xlds,v|0|10-813-916-8297|7499.47|FURNITURE|ts. permanently special accounts mold quickly. requests boost slyly bo +952|Customer#000000952|jg0YsHARdoULvVtP2vGHLVoAfWKFNz6QdTeAi|24|34-527-524-9172|3710.14|AUTOMOBILE|slyly regular ideas. even theodolite +953|Customer#000000953|5HJQ8UzSSl1PJv28MpZqWvNwUm|22|32-829-961-2870|6292.06|BUILDING| according to the carefully bold dependencies use boldly slyly express deposits. car +954|Customer#000000954|rr0Gz2iuYNuLgrIcLCdi5Zr2SnY8,wpzD9A|19|29-639-437-3775|5740.00|FURNITURE| haggle furiously. furiously ironic +955|Customer#000000955|FIis0dJhR5DwVCLy|0|10-918-863-8880|138.31|AUTOMOBILE|ts cajole quickly according to the pending, unusual dolphins. special, ironic c +956|Customer#000000956|aI12bsLSd1Y4dIx2Me5BLbGDCZPn |20|30-627-947-8311|1587.14|HOUSEHOLD|eans. regular, regular foxes wake furiously carefully even pinto beans. furiously r +957|Customer#000000957|9F8p,XsLLxyiZ3b8NN|19|29-941-553-8245|9076.68|FURNITURE|al excuses boost to the ideas. unusual requests are across the slyly +958|Customer#000000958|OrOUBBV7NlzVFXtuSOECmQFOkw8r|5|15-455-954-2914|1791.65|FURNITURE|s deposits. blithely even packages sleep carefully ironic deposits. quickly ironic accou +959|Customer#000000959|O FdrkZxCx PK|4|14-546-329-6898|3266.14|FURNITURE|press accounts wake busily after the furiously final theodolites: fluffily final deposits above the carefully iro +960|Customer#000000960|meekxaMlz5c1uE3wV7a,u h WcU,1OJz|4|14-664-604-8633|1932.59|HOUSEHOLD|s are carefully after the permanent foxes. fluffily +961|Customer#000000961|5,81YDLFuRR47KKzv8GXdmi3zyP37PlPn|12|22-989-463-6089|6963.68|MACHINERY|e final requests: busily final accounts believe a +962|Customer#000000962|lDp572JGdrL34kB YOQuC|4|14-792-232-1645|7557.00|BUILDING|. carefully brave foxes wake furiously final orbits. furiously pending theodolites along the bold the +963|Customer#000000963|40EdWkddaWhQyiQ6FfUo8VOZwgb MetJ2jV,QPL|13|23-921-332-7635|2557.49|HOUSEHOLD|ns snooze slyly daringly pending instructions. regular requests above the regular, even requests sleep blithely fin +964|Customer#000000964|ZnBNwMqvW7y3FSn6025pwkzgTDfsG2A|12|22-974-772-2802|4756.58|FURNITURE|al accounts haggle blithely! regular platelets haggle blit +965|Customer#000000965|UigBc,9d1iLtQAVatnWACSDc9mNx0mYl|2|12-893-735-6415|4768.80|MACHINERY|lly enticing pinto beans haggle requests. evenly express grouch +966|Customer#000000966|V9c8SR8WK7wEd|8|18-539-933-5176|1283.26|MACHINERY|ts. regular accounts cajole about the ideas. slyly unusual idea +967|Customer#000000967|xKdAl6HSWvAmptzHgQHX3cMmxZDhfyrMqx|23|33-687-917-3598|5710.41|BUILDING|iously quickly silent ideas. blithely pending pinto beans except t +968|Customer#000000968|eu 5FA1WHs9jq0pcdlVVA|0|10-470-740-2657|8921.97|BUILDING|ic foxes haggle slyly according to the dependencies. even, regular acc +969|Customer#000000969|N9NSGc0Bj6FlSw3d9k GI7VAd1jW|8|18-148-790-2039|8601.63|BUILDING|lithely according to the fluffily silent patterns. furiously fin +970|Customer#000000970|DXEgz7JHSFW401|14|24-266-486-1615|3623.60|MACHINERY|ronic requests sleep slyly at the slyl +971|Customer#000000971|z29DUY Utsi6mWKI|1|11-256-718-6928|3914.88|AUTOMOBILE|ular theodolites haggle carefully: f +972|Customer#000000972|ImKvHrrNc3rfWejksbCPyIQ|4|14-405-229-6174|4453.46|MACHINERY|deposits: slyly regular deposits among the furiously bold asymptotes are furiously along the slyly even +973|Customer#000000973|FT4jTOdVCpmYW|0|10-749-928-5415|3229.18|FURNITURE|sly special requests integrate carefully along the special foxes. regular, silent +974|Customer#000000974|7RcY6fOjTMbbOnVaFV,,6Dk5FIiHGrCpwXJNI|20|30-473-948-7149|7826.10|HOUSEHOLD|uickly. regular, ironic waters sleep blithely. blithely regular foxes are blithel +975|Customer#000000975|qPFceGMB0xDjY6BhTGdIxe2Z F4MVuKIXHqQ1|16|26-428-220-2070|4364.06|FURNITURE|furiously express packages. even, bold sheaves haggle fluffily. slyly ironic accounts wake slyly across the quickl +976|Customer#000000976|I78UJ2ks3sbcd0c2NQ7aH|19|29-436-660-4732|7772.85|BUILDING|special requests wake carefully regular somas. special theodolites wake regular, unusual pinto beans. furi +977|Customer#000000977|JcKxPwHPM7akg5IiCs,ZVAfO73KE3|2|12-602-807-5055|311.00|FURNITURE|lly against the busily unusual requests! busily even requests haggle blit +978|Customer#000000978|zpvQ6LYE89Inl40Yz,7NJ|24|34-261-243-2624|-50.51|BUILDING|ely unusual packages nag fluffily above the quickly regular requests. regular accounts run. blithely +979|Customer#000000979|DvzUxD35ohKtUnalLGO9kDsCzZxtfcjO|18|28-113-574-4962|7055.13|MACHINERY|. accounts wake carefully special accounts. de +980|Customer#000000980|UsrigSqZBnmbXhXNR6ibloq60qHBUj42kwX|1|11-572-281-8212|4586.33|AUTOMOBILE|st have to integrate above the regularly regular accounts. regular, final waters breach blithely +981|Customer#000000981|pM4DXkl6Y,7S6a6jlJf8dZogp9QOdv|18|28-202-962-8429|3383.26|MACHINERY|ts doze quickly. platelets are quickly agains +982|Customer#000000982|EN9aD5Xgh2q|23|33-460-986-9418|1437.55|FURNITURE|lithely express requests along the carefully pendi +983|Customer#000000983|9jgCxRufEbwbGwW0PmG1RDIOwCUYlHs8z|7|17-283-610-6143|2902.95|BUILDING|mas cajole furiously across the fluffily special deposits. pending foxes sleep regular, silent packages. ironic pla +984|Customer#000000984|fgAELFO9RS 6q9|11|21-247-588-5181|2811.97|AUTOMOBILE|t daringly against the even foxes. furiously silent forges sleep furiously busily ruthless requests. exp +985|Customer#000000985|0uAMe1ICB,wts4STD4eLL|23|33-408-194-5161|2701.21|HOUSEHOLD|gular deposits among the thin instructions haggle since the furiously final packages. ideas use. regular i +986|Customer#000000986|Cei2QidV0GC3OQWfJTNHLYPd|1|11-537-225-3800|178.73|BUILDING|cies impress blithely furiously final package +987|Customer#000000987|SO 0UTuH26eduKI|8|18-887-394-2506|9850.64|AUTOMOBILE|eposits. even packages cajole boldly bold ideas. even, regular accounts haggle. packages among +988|Customer#000000988|3BNYKEUyMbzfb40SEr 8OTb|3|13-862-722-3298|7746.97|FURNITURE|he courts. carefully silent courts impress. carefully close ideas run slyly pinto beans. even, ironic accounts are a +989|Customer#000000989|pKuixWbH6XZFJY0uZjGi0oRaH1Xl|10|20-646-819-6827|5453.74|AUTOMOBILE| accounts. fluffily regular requests use carefully after the furiously special instructions! slyly +990|Customer#000000990|uF idg4bq8Ij7ghxJ5KuTnU8w|0|10-403-137-1064|6988.49|BUILDING|dolites for the fluffily bold +991|Customer#000000991|dK1Gzw1glT|21|31-977-971-6175|6533.53|AUTOMOBILE|n somas. slyly ironic instructions solve quickly at the final dolphins. requests cajole carefully +992|Customer#000000992|Vbi1NGfPeKw,XU|5|15-262-535-3924|5027.75|MACHINERY| across the regular, pending requests. slyly ironic accounts wake furiously about the pending, regular +993|Customer#000000993|56K JjC bMcgbXlJA4KI Icu uggsRoviMQm,F|7|17-494-757-5759|8421.87|FURNITURE| according to the slyly bold accounts. +994|Customer#000000994|sZjdeW4LT9EKopmlv3M Xbnbe3gXQ9JkoxPv |16|26-638-159-5836|7461.27|HOUSEHOLD|ake furiously across the quickly idl +995|Customer#000000995|5tCSAsm4qL5OvHdRZsiwSlVTdqPZws3f|13|23-272-700-1002|-341.79|BUILDING|wake slyly fluffily unusual requests. stealthily regular pinto beans are along the slyly final dugouts. slyly +996|Customer#000000996|yjrSjcG z0Rm5PYrVMFTrU pFRMw|22|32-902-625-1946|6450.78|AUTOMOBILE|hely against the final, brave asymptotes. final ideas haggle slyly bold pinto beans. slyly unusu +997|Customer#000000997|85KMCT2D2RIGayG99ozpk85ppHE6i9gJE|17|27-218-645-5219|367.03|FURNITURE|ven asymptotes. carefully regular packages are blithely. special requests according to the care +998|Customer#000000998|fHRMFCGphazw9KvR1,EmNOUBG|17|27-951-935-6514|6679.20|MACHINERY|ular courts nag quickly unusual, sly pinto beans. special foxes thrash blithely up the foxes. +999|Customer#000000999|r2SFEmfqrRu3M7ouE4zvI2ApOAtD|16|26-876-956-1302|403.89|BUILDING|riously special instructions ac +1000|Customer#000001000|hzM1shTwWlLuk|22|32-730-275-2976|-881.70|BUILDING| closely against the slyly special deposits. regular, ironic p +1001|Customer#000001001|KbWTzGB3ZUymu nNCIuG5eCueaqu|21|31-389-986-4741|7140.81|MACHINERY|ever. fluffily special requests are. slyly final asymptotes are carefully quickly reg +1002|Customer#000001002|98bKmyr3jZWRLEY9WBtyUWOodVd|10|20-973-622-6579|3699.76|MACHINERY|ns. deposits along the ironic, regular packages wake furiously according to the carefully even excuses. slyly qui +1003|Customer#000001003|lE07lPMzVzMhG9CUC54uPwGw3BWO|21|31-716-397-1854|7894.00|AUTOMOBILE|quests sublate blithely blithely special dependencies. excuses use busily express pinto bea +1004|Customer#000001004|mBaNGEJoY2tgXD60V2DEO ajjoM3Zd,Jp|8|18-676-152-4849|1512.46|MACHINERY|ainst the ideas nag fluffily according to +1005|Customer#000001005|cTWPLcTvotjgrrcN3j|13|23-149-373-9093|7790.94|AUTOMOBILE|. furiously ironic accounts affix careful +1006|Customer#000001006|Q46palcsa4KwAMhPS|12|22-364-780-5932|7447.99|BUILDING|equests. regular pinto beans sleep furiously express, ironic accounts. special, +1007|Customer#000001007|PfH0lw8GzD7o|9|19-790-843-5283|7347.90|MACHINERY| theodolites. ironic requests wake. thinly silent +1008|Customer#000001008|AfP6tFNz1Eu4buoUd,HrZAld340 xz2wbQ2|2|12-115-571-7897|8191.74|HOUSEHOLD|press orbits affix furiously pending packages. courts alongsi +1009|Customer#000001009|cWONXs2Vx30bkgYoCkx7LrJH,E|12|22-132-906-1117|594.50|BUILDING|ng to the stealthy, final courts cajole carefully alongside of the gifts? regular ideas above the furiously express +1010|Customer#000001010|uasIK CZZ5|5|15-221-463-3776|1652.78|AUTOMOBILE|ing ideas doze carefully accounts. slyly regular theodolites poach. carefully pending de +1011|Customer#000001011|6m8KP FxT4nnHgoc4CN70TVLW1X5Q|5|15-736-809-3168|1188.94|BUILDING|uriously express asymptotes. u +1012|Customer#000001012|5Zsp rqM6oCmgqqFe|4|14-535-551-6255|4422.45|AUTOMOBILE|s above the carefully express r +1013|Customer#000001013|k5rfeOtchP1 w|15|25-725-599-1183|-951.53|BUILDING|idle packages cajole regular asymptotes. carefully express forg +1014|Customer#000001014|ZsiaboMOOV,aGwWUpfE|11|21-553-425-9152|-392.84|AUTOMOBILE|telets. ironic platelets cajole carefully; bold, special instructions unwind blithely regular somas. carefully +1015|Customer#000001015|RDJWEmcAk4GC8OT8WCsXB|10|20-134-926-5391|6392.00|HOUSEHOLD|g courts nag daringly brave pains. blithely special deposits use blithely carefully c +1016|Customer#000001016|8tzkhPXMFHKgmz|11|21-683-368-2994|2357.54|AUTOMOBILE|ular deposits. special foxes solve quickly idly special ideas. never final asymptotes nag. furiously even deposi +1017|Customer#000001017|OoVPZGR5hUp8oo|16|26-593-941-5690|-913.70|MACHINERY|integrate furiously furiously even pinto beans. ironically pending packages cajole quickly furiously special +1018|Customer#000001018|yldxLZOgQwzrXh3t4yktykZZV8v,vK2c6pVr|18|28-450-764-4871|8341.71|FURNITURE|e quickly around the quick, regular pinto beans. regular, regul +1019|Customer#000001019|VMFs38VlBt01g30PzPyliiAoGHazC4HG74JJ|21|31-502-683-3413|2114.53|FURNITURE|quickly special ideas about the courts use of the pending instructions. furiously final accounts c +1020|Customer#000001020|DHom,LSHKfYSwLSZv39AooYQHlvbaeztefjwR|3|13-692-286-8158|6914.87|MACHINERY|es. blithely unusual asymptotes sleep ironic accounts. fluffily express sheaves haggle fl +1021|Customer#000001021|m h2wQbujQnQOrcf109reW0 o|6|16-469-554-5196|1286.76|MACHINERY|courts could hang quickly express epitaphs. foxes haggle above the carefully unusual requ +1022|Customer#000001022|lP,9H6e6mQwLsWYYr2Y|8|18-733-553-2195|9605.83|AUTOMOBILE|ending packages. dependencies along the slyly pending dependencies wake carefu +1023|Customer#000001023|w8 oxHcOTUiF8dOr,ktZ05pO7qcHZ8ZeH7|17|27-960-306-5136|7188.35|AUTOMOBILE| express requests. slyly ironic asymptotes throughout the ironic, final packages nag careful +1024|Customer#000001024|9wLrRS78uOPy7CHW|11|21-508-779-7822|-425.09|FURNITURE| carefully regular instructions. furiously final deposits across the carefully special ideas cajole furi +1025|Customer#000001025|3T2A1uo8mCqTeO LTW8atjLBLO12nh6lyl|8|18-588-456-4616|3363.46|AUTOMOBILE|to beans sleep according to the fluffily regular instructions. +1026|Customer#000001026|ktKcS9tV2OC8T42KVqMem NjkNO 4pkXmu|17|27-169-221-8173|9699.28|MACHINERY|totes against the stealthy deposits haggle fluffily after the regular, regular deposi +1027|Customer#000001027|GNaw4RXXMr|2|12-278-154-5262|4946.21|BUILDING| final requests haggle. final, even sheaves maintain carefully above the even ac +1028|Customer#000001028|NxmOhIN,w45aogQ1hZSvqoz0 8nrbdkaiZOe|10|20-582-119-3249|1915.53|AUTOMOBILE|ly unusual, even packages. fluffily special foxes across the furiously final asymptotes main +1029|Customer#000001029|D3TLK5s,gc|15|25-602-810-8723|6252.18|BUILDING|arefully furiously final pinto beans. daringly express deposits +1030|Customer#000001030|Xpt1BiB5h9o|8|18-759-877-1870|6359.27|HOUSEHOLD|ding to the slyly unusual accounts. even requests among the evenly +1031|Customer#000001031|dwCYOftUgV5,EwGJc|21|31-946-641-1853|2226.80|AUTOMOBILE| theodolites. even theodolites sleep slyly. special, express excuses cajole among th +1032|Customer#000001032|6yoIzDrw5zLBO|18|28-449-227-3528|1853.64|FURNITURE| sleep quickly even somas. permanently regular grouches cajole blithely furiously ironic ide +1033|Customer#000001033|WOozPuOF8UdYMwjF5|8|18-470-380-2978|81.06|BUILDING| to the quickly final packages. carefully slow accounts use blithely slowly permanent requests. un +1034|Customer#000001034|Fn5qqb64TSKuJWz4f8GpPkF,c3WY3yqjsV,GgHu|5|15-370-179-6631|7349.82|HOUSEHOLD|bout the ironic requests-- packages wake. requests haggle silent, +1035|Customer#000001035|7yTbQ665G3Bi,6BK0EmQPw,Gc7bZOPk4ncXpo|10|20-376-345-3729|7499.36|AUTOMOBILE|ound the fluffily enticing foxes detect slyly at the furiously final deposits. quickly final instru +1036|Customer#000001036|fxujgj8DOFO6oKrH|8|18-791-577-7691|1766.23|BUILDING|ins sleep. slyly express platelets cajol +1037|Customer#000001037|dwgDZPKR5ZuU3HO2sDOS7Ym0oeC8c6Xm|23|33-855-960-2989|4936.25|BUILDING|lly final pinto beans. pending instructions boost careful +1038|Customer#000001038|yQCza56pNgcF9sxDR HCed22GeEq|17|27-511-101-1611|-509.92|AUTOMOBILE|uriously express accounts. even pinto beans wake. slyly regular requests according t +1039|Customer#000001039|F602TgKjElSWrZ|10|20-871-886-9220|7618.54|FURNITURE|nding packages use. blithely regular sheaves doze blithely. fluffi +1040|Customer#000001040|vbJmdHe6U9Pl|11|21-756-109-1482|2860.71|BUILDING|old requests wake slyly! slyly special deposits cajole above the unusua +1041|Customer#000001041|189f n2lA4|11|21-314-290-3052|7993.98|MACHINERY|uctions are busily along the furiously ironic instructions. blithely thin waters cajole slyly. +1042|Customer#000001042|S1sh9gyFn21m4zkb4J95GD5|5|15-215-652-3459|9849.87|FURNITURE|ly bold dugouts! pending asymptotes are blithel +1043|Customer#000001043|HJMn12xn4bl vWC7iVuTRsErYEzlyCO|7|17-266-334-8613|5847.76|HOUSEHOLD|iously ironic deposits cajole slyly busily final account +1044|Customer#000001044|Eh2e8gLyStrLE7A|0|10-451-459-9620|7291.30|BUILDING|ly across the slyly ironic accounts. even requests +1045|Customer#000001045|clvGUnQPLbzX 23hemPp24WS1MEtS4z|20|30-120-992-2121|2942.19|HOUSEHOLD|r deposits cajole blithely along the quickly silent pattern +1046|Customer#000001046|umgqzlyUW3AYz2C39YMhIgf|10|20-890-161-8958|2311.00|BUILDING| accounts. carefully regular theodolites run fluffily carefully e +1047|Customer#000001047|h5iBRMsym,y6LLSQU2DzNftiET qZ|9|19-146-399-4251|8918.99|BUILDING|lar packages haggle theodolites. thinly express deposits +1048|Customer#000001048|Mk0ebiw9SaFBTwoib|19|29-757-642-3735|2583.91|BUILDING|s are slyly regular foxes. slyly final pinto beans wake quickly among the regular, spe +1049|Customer#000001049|bZ1OcFhHaIZ5gMiH|9|19-499-258-2851|8747.99|MACHINERY|uriously according to the furiously silent packages +1050|Customer#000001050|KgVnjN7Y4HCN5f97HEUp7kYNNTrE3 O|11|21-448-313-4374|-517.65|FURNITURE|ely ironic packages. blithely regular foxes sublate furiously. special requests boost furiously agains +1051|Customer#000001051|iHS,UFudVOOe|2|12-869-221-1428|9776.39|HOUSEHOLD|cuses boost furiously silent deposits. quickly silent requests integrate quickly bold asymptotes; slyly regular ide +1052|Customer#000001052|OcXtKS,1Hvf2D0 rPvhw4qXViYOudQ3|13|23-496-475-9040|2837.96|BUILDING|s accounts haggle against the furiously final asymptotes. ironically regular accounts boost. furiously fina +1053|Customer#000001053|wDJTteyausmZswQAFQot|16|26-400-312-6496|-473.85|MACHINERY|efully enticing pinto beans. final pack +1054|Customer#000001054|Xgj6QVy2I9FVoSiIbgLf9LIE8XpWI2RtmbGUx|21|31-915-292-9727|8844.27|HOUSEHOLD|y pending ideas. dogged dependenci +1055|Customer#000001055|Z3AggyEMPME2hqqTfbMC76O0z|7|17-802-131-7180|639.93|HOUSEHOLD|dolphins: furiously ironic pinto beans above the carefully regular foxes nag slyly across th +1056|Customer#000001056|8u1rnDOcvU109|5|15-325-285-5215|6287.12|HOUSEHOLD|leep except the foxes. packages eat enticingly along the requests. even +1057|Customer#000001057|xyV8 FbW4xS,JhkxC0dY527tzcMKxM|24|34-750-735-1314|-377.11|AUTOMOBILE|s. furiously ironic deposits against the carefully bold accounts wake carefully even deposits. fluffily even +1058|Customer#000001058|R0NIEcSVDQ4rNUcCevDrap|19|29-818-620-9637|6807.55|MACHINERY|uctions. slyly express pinto beans are furiously. bold theodolites according to the fur +1059|Customer#000001059|OHwYMiDjmgeIQXhLlNW,8LIwIEr|23|33-683-418-9460|1547.50|HOUSEHOLD| wake carefully. carefully quick excuses cajole ruthlessly among the ideas. bold, ironic braids are +1060|Customer#000001060|aWJkU6JJJOvgaKPOAJJc|8|18-290-794-6133|2840.59|HOUSEHOLD|ter the bold, regular ideas! deposits eat. daringly unusual theodolites sleep alongside of the regular, fina +1061|Customer#000001061|CqLhg io1CpQKhrVHHDhWg1Omrx1hLcpKB6h|4|14-909-417-8324|-258.77|BUILDING|ticing packages maintain doggedly carefully regular instructio +1062|Customer#000001062|3OYrGEJC1YUa9DP|22|32-207-600-8684|4709.92|HOUSEHOLD|ag. carefully regular asymptotes a +1063|Customer#000001063|yHVWD7y1Oe1P|21|31-277-349-9036|1663.28|MACHINERY|ress attainments. furiously regular excu +1064|Customer#000001064|VmFhpV9 aIqPysMHRIWZl|15|25-391-998-4106|1666.07|MACHINERY|gular accounts. thin platelets promise fluffily. carefully express accounts haggle quickly qu +1065|Customer#000001065|qGBa7X0dOMsKLuYBpShpJVwGyU9rh|22|32-605-226-2449|4663.41|HOUSEHOLD|nts. quickly quick dolphins run +1066|Customer#000001066|2Ge 0Nk29FlBs1GuBiY84sLvn38mEkAKnM|0|10-333-463-4472|949.68|MACHINERY|requests. slyly final instructions sleep. fluffily even packages cajole pending, final +1067|Customer#000001067|g25CH,fhra|23|33-764-123-9568|9153.84|FURNITURE|ackages are furiously carefully even dependencies. idly final +1068|Customer#000001068|ElWdGnnKpmo0sA1Au teWwomSVgG,me|18|28-485-984-7299|737.40|AUTOMOBILE|nto beans. dinos sleep fluffily carefully regular sentiments. final, special packages wake blithely. ironic +1069|Customer#000001069|PdWrPGSArhnqWQ km65e|21|31-927-711-6278|5465.29|BUILDING|. ironic excuses after the special hockey pl +1070|Customer#000001070|m0sYmeYs5wLydSS qw542Et32|15|25-894-843-9171|3160.23|FURNITURE| carefully across the express foxes. carefully special accounts ca +1071|Customer#000001071|PgCAYL2LEwE7v7Pk4dYpRe Nn7MN8wVzYbA2qtj|16|26-350-231-6183|4033.56|MACHINERY|ar accounts. quickly regular packages sleep bold ideas. slyly pending asymptotes a +1072|Customer#000001072|HpCr1tM88WoELSld708ByJ|4|14-432-882-6163|7979.48|HOUSEHOLD|ic pinto beans are blithely across the grouches. furiously pending platelets sleep pe +1073|Customer#000001073|KEyFI2gYMZrSVbMMMIf|10|20-774-197-6595|8217.23|BUILDING|fter the blithely regular pinto beans. express asymptotes sleep special pa +1074|Customer#000001074|nG,eR,gjPr|10|20-176-839-1649|122.67|BUILDING|ly final courts haggle quickly boldly express excuses. dependencies eat. slyly even requests boost blithely +1075|Customer#000001075|hTIc2AUg pqhYh2W0yMUTQtrZV1KUutysIb6,nxb|21|31-724-234-4181|2714.50|BUILDING|regular patterns. unusual platelets try to are unusual theod +1076|Customer#000001076|C1gf0FyiU H88P0cpv4UOcdgaPRpVA|10|20-405-710-1902|3509.35|AUTOMOBILE|ainst the silent, silent ideas. sly theodolites use carefully express accounts. regular foxes boost carefully agai +1077|Customer#000001077|sjk1DTHWVMX53kG8AbTtTh1EcMvWeDO8gFDdpQOK|21|31-367-294-4048|8581.78|AUTOMOBILE|lithely regular deposits. carefully pending deposits sleep. quickl +1078|Customer#000001078|ZjRzAz8QbEeIkJxrUI,b|19|29-729-692-6790|70.93|MACHINERY|onic requests wake slyly furiously final attainments. ironic, even accounts cajo +1079|Customer#000001079|cOyd7wsHIQq2LNN|19|29-699-930-2250|2135.91|AUTOMOBILE|ter the express foxes nod slyly excuses. slyly speci +1080|Customer#000001080|Yux,gs14NpneiZEy9Rz|12|22-806-885-5347|3267.19|MACHINERY|ng dolphins cajole across the carefu +1081|Customer#000001081|eGGRjZex7YANvD1jfnPMcBK2JbM|12|22-866-942-1021|8647.42|MACHINERY|pendencies haggle after the quickly special instructions. furio +1082|Customer#000001082|vMX52A1zqDbGNzjfSzgsxSVU0GU6iFmrgiUE|5|15-646-384-2302|3247.92|BUILDING|ly. blithely final packages wake silent ideas. express, special theodo +1083|Customer#000001083|tnrpYmWGxwyaFmJy2Oq0Z|7|17-159-499-3318|3847.29|FURNITURE|luffily. slyly unusual accounts cajole furiously against the ironic asymptotes. slyly reg +1084|Customer#000001084|E091r836A8TPqn5|2|12-378-899-7136|1416.75|FURNITURE|nstructions. fluffily pending pinto beans affix slyly; carefully pending requ +1085|Customer#000001085|pZgtHRGIkUVwiEJLWZXs3KUNi6wLnQzJU1|21|31-831-702-3157|5275.88|BUILDING|he carefully regular courts use special excuses. ironic deposits along the blithely even sauternes nag slyly +1086|Customer#000001086|ECMZrONto2nI2TBv,k|8|18-399-482-6815|9726.83|FURNITURE|ymptotes cajole enticingly furiously silent ideas. furiously pending packages are al +1087|Customer#000001087|ETOH68urIxK839xmKEmfkjc|21|31-334-391-6403|5878.21|MACHINERY|s haggle above the slyly express requests. quickly regular packages after the quickly silent accoun +1088|Customer#000001088|YjXQtOJoM0nhClEy0,WFdNxvJ1g6xpn kL2ommEv|22|32-324-225-2635|2098.62|BUILDING|ly special ideas. slyly unusual requests haggle +1089|Customer#000001089|OO77 pLjaOe7bam1WnH9gtcZNCUlUPI|18|28-164-765-7462|3429.95|BUILDING|o beans affix carefully regular accounts. quickly even ideas sleep. pinto beans haggle fluffy courts. slyly regu +1090|Customer#000001090|P2JDHFVxjU|15|25-711-934-6343|5212.43|AUTOMOBILE|ffily even packages wake quickly +1091|Customer#000001091|4ye7wJ3gU92RZCpwTtDi8Ws,|17|27-336-955-4882|-710.53|BUILDING|y. carefully ironic excuses sleep quickly fluffily even requests. fi +1092|Customer#000001092|,oAq2L60hjb8|15|25-766-175-4580|2004.15|HOUSEHOLD|carefully silent somas can wake carefully aft +1093|Customer#000001093|LO,9qCPIjSXriBqQsAOXLrQKedQ8UO6gb|24|34-931-911-6156|-273.96|HOUSEHOLD|p furiously carefully bold packages. regular escapades breach. blithely unusual ideas integrate across t +1094|Customer#000001094|OFz0eedTmPmXk2 3XM9v9Mcp13NVC0PK|2|12-234-721-9871|2544.49|MACHINERY|tes serve blithely quickly pending foxes. express, quick accounts +1095|Customer#000001095|JtyQvLlCI ZPYQ6ygv,5q|9|19-881-259-2391|6221.26|MACHINERY|foxes. ironic, daring requests sleep regularly across the blithely +1096|Customer#000001096|ldbo6AfnCRjFW8rZnvG6UxbX6o7ISAJRDD7|4|14-368-827-9896|3687.37|FURNITURE|lyly even asymptotes cajole furiously. regular, ironic theodolite +1097|Customer#000001097|a wMc0lQutcHs6cRomoMCGjvM0MwEk4uyrxKI3|6|16-604-758-5574|8651.87|MACHINERY|p carefully. carefully special excuses haggle carefully about th +1098|Customer#000001098|XVJb1HxQeLu9x|22|32-206-732-5183|1009.22|FURNITURE|evenly unusual deposits. slyly even ideas according +1099|Customer#000001099|2ZiU64au LN0 GUxY8|1|11-128-186-5241|8990.07|AUTOMOBILE|ckages: blithely ironic theodolites cajole furiously. f +1100|Customer#000001100|PGXj,,vjAfMNLzd|12|22-880-206-7392|9189.75|BUILDING|ideas. furiously final sheaves integrate. pinto beans haggle slyly according to the furiously ironi +1101|Customer#000001101|h,UOEyoi1ZG4|3|13-528-469-6051|-842.72|MACHINERY|o beans; quickly express accounts slee +1102|Customer#000001102|F9fxZhJJhaR0P4Rgd7SE2PA58x|24|34-103-353-4822|2369.01|HOUSEHOLD|elets. regular requests sleep quickly. express ideas haggle. bold, regular ideas haggle. quickly regular accoun +1103|Customer#000001103|kbYrf d uR|16|26-307-423-8860|4878.10|AUTOMOBILE|n accounts cajole across the even pinto beans. quickly express pat +1104|Customer#000001104|,t,d8FlnmiECPa|8|18-644-507-8095|1230.47|AUTOMOBILE|ages haggle. slyly ironic foxes are idly among the furiously final pearls. slyly unusual reques +1105|Customer#000001105|cZhhOUzv6,Vbaa2bFT|22|32-885-298-6750|9491.46|FURNITURE|y final packages. furiously ironic packages was. fluffily ironic instructions integrate +1106|Customer#000001106|WZEExIU9g2smcowcinj|21|31-214-739-2409|9977.62|HOUSEHOLD|requests nag. fluffily regular packages haggle q +1107|Customer#000001107|yQBP1SLK2uzN4dzgaQ|1|11-720-869-9052|7961.62|AUTOMOBILE| along the final deposits. carefully express ideas wake? quickly regular instructions are furious +1108|Customer#000001108|9sPt6a66R0eCRVYh9QrF8zjxNWFFk8KU|7|17-408-450-8891|4997.35|BUILDING|rding to the final instructions. carefully final accounts wake along the carefully careful pinto beans. re +1109|Customer#000001109|BJCfTYEV9eCDraeyO3v|22|32-194-697-1794|3387.22|FURNITURE|r accounts. bold, final pinto beans wake carefully even Tiresias. quickly busy frays above the blithely ironic de +1110|Customer#000001110|BRnTy8RZ,1oHOg9ly8SsJLIyiuvhv|10|20-777-225-9349|2041.65|HOUSEHOLD|usual platelets along the quickly regul +1111|Customer#000001111|gavpg6eW5lEML|6|16-824-312-3537|2892.21|MACHINERY|s are slyly quiet requests. darin +1112|Customer#000001112|wFf 0nSvdJyk2GqRsqJrcr9 UPr0C3OT5zT|20|30-401-424-6458|9314.59|MACHINERY|fily quickly unusual theodolite +1113|Customer#000001113|jLtKZ0bRJyYL1k|12|22-412-216-1933|7392.30|HOUSEHOLD|ages among the furiously pending packages detect across the blithely unusual accounts. furiously ironic requests sh +1114|Customer#000001114|f7 he8eByBFy6z7vcOajC1gaUKqmRN|14|24-630-988-3843|6446.83|BUILDING|ularly ironic platelets. pinto beans along the slyly express packages wake unusual packa +1115|Customer#000001115|Elvb2a3FinAzxw |5|15-356-145-6356|-178.52|BUILDING|ending instructions thrash blithel +1116|Customer#000001116|aWuLgbu,8HZMbkI|14|24-116-214-4051|592.60|AUTOMOBILE|tes-- final, regular excuses sleep. sly +1117|Customer#000001117|80NfzBRWj5tUUaRdnsFE7Eg|23|33-461-439-5684|2829.07|FURNITURE| ironic deposits need to haggle furiously. furiously bold deposits use among the carefully ironic +1118|Customer#000001118|QHg,DNvEVXaYoCdrywazjAJ|11|21-583-715-8627|4130.18|HOUSEHOLD|y regular requests above the blithely ironic accounts use slyly bold packages: regular pinto beans eat carefully spe +1119|Customer#000001119|ER5vABifV766q5f0FN7l2eN7MIg2lO|20|30-789-716-6850|3971.65|AUTOMOBILE| pinto beans maintain slyly even instructions. regular acc +1120|Customer#000001120|UAG90slCmJS7JOP AhlV12tYD3yUiyB1p2hxZ|2|12-938-579-7156|1543.64|AUTOMOBILE|r theodolites boost. slyly final pinto beans sleep blithely unusual accounts. fluffily even multipliers +1121|Customer#000001121|o2uc3AHYz,m 3vYg8YxBwI0XuG|20|30-197-936-4724|3942.11|MACHINERY|usly? final theodolites are carefully +1122|Customer#000001122|9lxNEW0Rei4DFaT4vX,T551AwBzrZoOXsRNOm|0|10-257-957-3327|45.21|BUILDING|egular, regular instructions are slyly regular requests. deposits despite the regular, pendi +1123|Customer#000001123|pO80QGjK7S0Kmoh46dViD K4OSEVDyiJ53CN|16|26-983-192-5480|9786.36|MACHINERY|s carefully ironic packages. accounts boost boldly fluffily even gifts. slyly final fo +1124|Customer#000001124|EQNw9dNy63,|1|11-709-582-2006|5512.73|BUILDING|ctions wake. packages haggle furiously. express +1125|Customer#000001125|DrHkeaX6wshtuZOI2nLrME|3|13-807-542-3923|8427.55|MACHINERY|counts according to the carefully silent grouches haggl +1126|Customer#000001126|8J bzLWboPqySAWPgHrl4IK4roBvb|8|18-898-994-6389|3905.97|AUTOMOBILE|se carefully asymptotes. unusual accounts use slyly deposits; slyly regular pi +1127|Customer#000001127|nq1w3VhKie4I3ZquEIZuz1 5CWn|10|20-830-875-6204|8631.35|AUTOMOBILE|endencies. express instructions wake about th +1128|Customer#000001128|72XUL0qb4,NLmfyrtzyJlR0eP|0|10-392-200-8982|8123.99|BUILDING|odolites according to the regular courts detect quickly furiously pending foxes? unusual theodolites use p +1129|Customer#000001129|OMEqYv,hhyBAObDjIkoPL03BvuSRw02AuDPVoe|8|18-313-585-9420|6020.02|HOUSEHOLD|pades affix realms. pending courts haggle slowly fluffily final requests. quickly silent deposits are. iro +1130|Customer#000001130|60zzrBpFXjvHzyv0WObH3h8LhYbOaRID58e|22|32-503-721-8203|9519.36|HOUSEHOLD|s requests nag silently carefully special warhorses. special accounts hinder slyly. fluffily enticing +1131|Customer#000001131|KVAvB1lwuN qHWDDPNckenmRGULDFduxYRSBXv|20|30-644-540-9044|6019.10|MACHINERY|er the carefully dogged courts m +1132|Customer#000001132|6dcMOh60XVGcGYyEP|22|32-953-419-6880|4962.12|AUTOMOBILE|ges. final, special requests nag carefully carefully bold deposits. ironic requests boost slyly through th +1133|Customer#000001133|FfA0o cMP02Ylzxtmbq8DCOq|14|24-858-762-2348|5335.36|MACHINERY|g to the pending, ironic pinto beans. furiously blithe packages are fina +1134|Customer#000001134|79TYt94ty a|9|19-832-924-7391|8458.26|HOUSEHOLD|riously across the bold instructions. quickly +1135|Customer#000001135|cONv9cxslXOefPzhUQbGnMeRNKL1x,m2zlVOj|11|21-517-852-3282|3061.78|FURNITURE|regular frays about the bold, regular requests use quickly even pin +1136|Customer#000001136|GHCEiSK0TKsOncuJT3,2zSvlZW4Pz|24|34-440-798-1100|-723.49|FURNITURE|ular pinto beans. slyly special deposits according to the slyly ironic requests maintain quickly +1137|Customer#000001137|LJ3J3i0BlPLrhKi6VabXxNrtpLAGH|16|26-598-565-1269|4210.15|AUTOMOBILE|usly quickly unusual attainments. stealthily unusual requests cajole ironic reques +1138|Customer#000001138|8 9P,dIGWnrrDiVs0S|22|32-236-817-2959|6035.44|BUILDING| instructions cajole thinly ironic requests. regular packages affix. ironic, final pinto beans ac +1139|Customer#000001139|UDGG69rYgUGayNk 9vFytd5q3nZdeRZQNSfL6|22|32-182-662-9475|4604.83|BUILDING|y pending pinto beans haggle blit +1140|Customer#000001140|leG5nToZpjmWNeaOsVv|20|30-331-754-7359|6319.21|AUTOMOBILE| pinto beans. blithely regular packages sleep carefully blithely ironic requests. requests eat blithely aga +1141|Customer#000001141|A6uzuXpgRPp19ek8K8zd5O|22|32-330-618-9020|0.97|MACHINERY| accounts. furiously pending deposits cajole. c +1142|Customer#000001142|b7ytiiX7E9|16|26-191-682-8920|3273.08|AUTOMOBILE|doze slyly. furiously pending deposits cajole fluffily carefully pending packages. boldly regular +1143|Customer#000001143|9tfTGdYHyZXtXbbeboPIXwCT|4|14-568-471-9747|8655.98|AUTOMOBILE|e carefully final packages integrate against the furiously express platelets. ironic ideas wake above the e +1144|Customer#000001144|DGLUWG9evYLNbYhOXVzqZ LdfIMVfBjDf|1|11-336-453-4489|4189.04|BUILDING| ideas. even, regular excuses after the ironic requests cajole blithe +1145|Customer#000001145|6R rPD6SDQPpFuYxxwh,Dv1PeusmP,C6cNcI|2|12-270-756-2968|3249.25|HOUSEHOLD|e. asymptotes sleep fluffily quiet requests. even theodolites among the fluffily regular pinto +1146|Customer#000001146|DRBYvF0iBGsDC3iPNFsPHq3FkU,jCK8LJPX4W|12|22-720-237-1751|4204.36|FURNITURE|final, pending asymptotes. regular requests was +1147|Customer#000001147|AVjlczwVwL CT jO3sgWn|15|25-754-809-7107|7734.64|HOUSEHOLD|eposits. quickly express accounts are idly. slyly final platelets wak +1148|Customer#000001148|7PslyqtS1K2Pabjht 4qgaZ1BbSNFfz6QiK4K|19|29-393-445-2761|7129.84|AUTOMOBILE|c, even deposits. accounts do use. regular accounts haggle blithely special, express courts. blithely +1149|Customer#000001149|5JOAwCy8MD70TUZJDyxgEBMe|3|13-254-242-3889|6287.79|MACHINERY|ress requests haggle carefully across the fluffily regula +1150|Customer#000001150|fUJqzdkQg1|21|31-236-665-8430|-117.31|MACHINERY|usly final dolphins. fluffily bold platelets sleep. slyly unusual attainments lo +1151|Customer#000001151|ratQBQ4rYv TfhWfHe|7|17-948-135-2667|6354.89|BUILDING|l requests. furiously bold orbits after the furiously ironic excuses sleep +1152|Customer#000001152|QRmFl9ZkoBDQ7|12|22-471-341-5516|5680.15|HOUSEHOLD|oost along the quiet, bold foxes. ironic dinos nag fluffily final pinto beans. blithely regular deposit +1153|Customer#000001153|SYG3KMj1fMh7GwvIZ,pY7mGLR1NT6EmNjE|3|13-319-420-5160|6244.03|HOUSEHOLD|s. even packages use fluffily always express packages. regular, even asymptotes about the furiou +1154|Customer#000001154|7RqtNwcSPbaUKaC|19|29-797-132-6916|1498.46|BUILDING|thely. furiously regular accounts above the ironic platelets wake slyly blithely bold pint +1155|Customer#000001155|kEDBn1IQWyHyYjgGGs6FiXfm3|8|18-864-953-3058|3510.25|MACHINERY|ages? fluffily even accounts shall have to boost furiously alongside of the furiously pendin +1156|Customer#000001156|3ShFbt9dTbLOG4lUBvc1AZp0Tam0BNjYS qwTZ|14|24-637-724-1410|1799.67|HOUSEHOLD|ns. carefully regular foxes are quickly. furiously careful accounts accord +1157|Customer#000001157|3rchTZwilGpffMz1MfpnkFfWBtOIdgmvvS1E7sJj|20|30-741-794-9826|6013.09|HOUSEHOLD|equests. deposits cajole quickly slyly spe +1158|Customer#000001158|btAl2dQdvNV9cEzTwVRloTb08sLYKDopV2cK,p|10|20-487-747-8857|3081.79|MACHINERY| theodolites use stealthy asymptotes. frets integrate even instructions. car +1159|Customer#000001159|IAnWq4YFKs7|2|12-269-807-3861|5553.75|HOUSEHOLD|ages sleep fluffily. packages after the carefully express packages nag slyl +1160|Customer#000001160|v65g1aRCGA76ZHySoOBffL31n4vJ0nm,tK,UEA|24|34-103-942-4634|4976.24|AUTOMOBILE| pending, special packages against the blithely unusual packages eat quic +1161|Customer#000001161| QD7s2P6QpCC6g9t2aVzKg7y|19|29-213-663-3342|591.31|MACHINERY|ly alongside of the quickly blithe ideas. quickly ironic accounts haggle regul +1162|Customer#000001162|b5N12h9D6yJemoVx6OQf0uL|2|12-887-115-9986|3139.71|AUTOMOBILE|refully furious packages. furiously ironic ideas against the carefull +1163|Customer#000001163|54fBdElRYOjEH8S|2|12-204-803-1483|90.22|BUILDING|inments. carefully regular instructions haggle carefully slow packages. slyly even packages kindle blithely special +1164|Customer#000001164|XWfNRnO2S5KAW0VodNwaBDixCEtv nKzt2LVFiwm|0|10-828-178-5049|7341.35|HOUSEHOLD| ideas use. unusual packages sleep +1165|Customer#000001165|h7KTXGSqsn0|9|19-766-409-6769|8177.33|MACHINERY|jole slyly beside the quickly final accounts. silent, even requests are stealthily ironic, re +1166|Customer#000001166|W4FAGNPKcJFebzldtNp8SehhH3|17|27-869-223-7506|507.26|MACHINERY| before the platelets! carefully bold ideas lose carefully +1167|Customer#000001167|gNYGOcGkJu3ooSmsCh|19|29-721-479-1548|9510.87|FURNITURE|lly regular ideas grow furiously regular accounts. regular, special requests sleep blithely. slyly bold pla +1168|Customer#000001168|gmAnpwPPg0LX4|17|27-608-883-2632|6194.65|FURNITURE|ses run according to the regular instructions. slyly regular foxes around the furiously ironic theodolites use fl +1169|Customer#000001169|04YQNIYyRRFxUnJsTP36da|4|14-975-169-9356|7503.30|MACHINERY|into beans doubt about the slyly ironic multipliers. carefully regular requests breach theodolites. special packages +1170|Customer#000001170|BNhssVcV36vshEHUAc aPFJ|8|18-670-628-8499|2070.73|HOUSEHOLD|ronic instructions. express pinto beans poach blithely. quickly ironic accounts n +1171|Customer#000001171|GatOC LsLU9MkgyaNMYH|8|18-457-394-2863|7658.97|HOUSEHOLD|c dolphins. accounts are slyl +1172|Customer#000001172|r dreL8m8cRaiIz IqZ83oMo,AVxe2PbsHQzK|14|24-249-588-1969|420.97|FURNITURE|express asymptotes haggle furiously. fluffily special deposits haggle quietly even, special tithes. ironic foxes alo +1173|Customer#000001173|6Abj72jR5Z0GYQMZKBmiQxW|18|28-409-365-6392|182.59|FURNITURE| ironic accounts above the ironic excuses haggle fluffily furiously regular packages-- slyly regular gi +1174|Customer#000001174| b9zecNS,J97qi7Qk5|4|14-131-930-7154|8798.96|AUTOMOBILE| ironic packages. furiously regular excuses sleep about the fluffily unusual pinto beans? regular foxes kind +1175|Customer#000001175|olj7nLYgBZ526MNBg9CV7w LYo6F1uD,Hm54|4|14-756-259-6379|9207.16|FURNITURE| haggle pending requests. carefully regular ideas nag. ruthlessly final packages a +1176|Customer#000001176|V0xc0tXNMmObuUJ0rGARp6YIw4fo84CD|10|20-141-903-5936|5827.59|BUILDING|ven accounts boost after the accounts. slyly silent accounts use fluffily amon +1177|Customer#000001177|hZPNQ8a9QRM ,SYdTdoW9hw|14|24-200-701-8606|9281.72|FURNITURE|ng the quickly bold theodolites cajole carefully around the deposits. furi +1178|Customer#000001178|W,03Nl2iWQ94xYyCo3R8CTMNFhu|9|19-717-739-3103|4966.58|HOUSEHOLD| even requests cajole furiously after the quickly ironic accounts. even re +1179|Customer#000001179|JLtS3n1xDqnNFS5MZc5uZHOjDctAJEl|19|29-311-833-9211|3336.25|AUTOMOBILE|ress, special accounts sleep slyly about the carefully express packages. f +1180|Customer#000001180|jI4QtviiCs0,LOgUPH4aONMnoNt|13|23-188-767-6645|3367.36|BUILDING|uests poach carefully carefully final deposits: ironic, regular deposits are slyly busy excuses. regular +1181|Customer#000001181|ZFFYipzTg0vSjOhPbcBUgPK9se|10|20-330-305-8843|9180.50|AUTOMOBILE|gle about the busily special theodolites. furiously ironic deposits haggle beside the furiously special accounts. +1182|Customer#000001182|pLrF7F1,uoyGaU|6|16-229-473-7194|8814.39|AUTOMOBILE|jole carefully. furiously final pinto beans detect. f +1183|Customer#000001183|qdIqRUfpmvtWo0NGsyi4qyjkwzlImP9,NrSC|1|11-968-244-9275|4455.76|BUILDING|arefully regular dependencies. quick +1184|Customer#000001184|M0dd3R30k0YjIr4GVeo|11|21-661-875-1923|9032.89|BUILDING| excuses nag carefully even accounts. unusual platelets detect carefully bold acco +1185|Customer#000001185|z,dN83fETWpkJkoR|14|24-860-751-6688|2913.52|BUILDING|ndencies against the carefully even accounts cajole carefully quickly regular packages. even fox +1186|Customer#000001186|cj5EeLbJJ6MPdynzposq,Apbj9 2Jm|23|33-500-965-3385|4466.30|BUILDING|ding realms cajole after the even foxes +1187|Customer#000001187|W1GdUKr3vQMVAZIU|10|20-543-260-5157|-932.96|AUTOMOBILE| blithely unusual theodolites detect doggedly. bold dolphins was blithely. pinto beans use carefully at the furiou +1188|Customer#000001188|PtwoF3jNQ9r6 GbPIelt GvbNBuDH|15|25-108-989-8154|3698.86|MACHINERY|ts. quickly unusual ideas affix aft +1189|Customer#000001189|rbnZCbJSTE3qWLl|10|20-746-804-1553|3798.28|HOUSEHOLD|enticingly express platelets wake. regular requests boost even, regular instructions. express dependencies a +1190|Customer#000001190|JwzW9OtxFRXDnVo5hXl8 2A5VxH12|15|25-538-604-9042|2743.63|MACHINERY| regular deposits according to the pending packages wake blithely among the silent inst +1191|Customer#000001191|K9J7dhIXDB2kgubtIVdRC6RP0aF,GQXin|19|29-587-244-2901|9088.54|AUTOMOBILE|ts wake. waters detect fluffily carefully regu +1192|Customer#000001192|8DbtM3KloBZ4OO1dRrF99|20|30-904-936-4914|3231.33|BUILDING|efully final packages use. slyly pend +1193|Customer#000001193|gdKqrIp,yaMaQSFerrGGzc6Kpy|8|18-524-487-2547|-17.10|AUTOMOBILE|accounts sleep carefully. regular accounts wake slyly. carefully regular requests along the quickly pend +1194|Customer#000001194|NzWKbiPK1oFd7PNz|21|31-155-275-3981|7582.29|FURNITURE|lve quickly according to the carefully regu +1195|Customer#000001195|71mmXvaWKf|4|14-355-801-7486|9621.49|FURNITURE|l, regular gifts should have to x-ray blithely fluffily ironic +1196|Customer#000001196|S3sw3q SDWVuUoEFvwv9M|20|30-615-967-7758|6378.67|BUILDING| carefully alongside of the blithely even theodolites. carefully ironic instructions wake after the spec +1197|Customer#000001197|9A1LTDf0KbR|0|10-254-891-7835|9261.05|FURNITURE|ording to the slyly ironic accounts. carefully final instructions haggle. special, unusual foxes haggle enticing +1198|Customer#000001198|r0liwpMwaIBQ9 zQjojGylXkJuKUL|18|28-278-515-1034|9593.35|AUTOMOBILE|intain fluffily ironic instructions. regular requests nag fluffily carefully unu +1199|Customer#000001199|sQJZJRAgYrZY0gPo9fJp6KAbY|16|26-367-212-1737|6503.35|AUTOMOBILE|es. quickly slow foxes boost +1200|Customer#000001200|2PFysvL4pk80l|22|32-890-210-4199|3765.05|HOUSEHOLD|nent frets. blithely bold pearls thrash across the r +1201|Customer#000001201|LfCSVKWozyWOGDW02g9UX,XgH5YU2o5ql1zBrN|10|20-825-400-1187|5165.39|BUILDING|lyly pending packages. special requests sleep-- platelets use blithely after the instructions. sometimes even id +1202|Customer#000001202|xThQDiKdG,0sU IduCCPAgHJfx1PDJwtUQvfU|0|10-788-256-6117|702.73|BUILDING|accounts. fluffily regular requests are. packages among the final deposits haggle carefully arou +1203|Customer#000001203|9pTq4gggfKoSqQetn0yJR|16|26-370-660-6154|5787.69|MACHINERY|osits nag furiously final accounts. silent pack +1204|Customer#000001204|QxpCVhq2x0PwW,zgZ AEuFkgb50ryGM|20|30-117-472-8751|9777.19|HOUSEHOLD|ily final instructions. pending foxes detect doggedly accor +1205|Customer#000001205|1ALD7GN4Iw0Vl5toeM|8|18-185-307-2678|5390.34|HOUSEHOLD|ptotes. silent deposits above the bold warhorses boost +1206|Customer#000001206|dxzjW0gykcG2kJ gN8hZV02q6U5T6uVNfP|20|30-716-117-6066|8437.76|HOUSEHOLD|ng the ironic accounts. regular requests across the quickly bold deposits wake carefully across the +1207|Customer#000001207|tDZe2FlIxGjrf9x,n6N1tu0DbWyUkSSu|3|13-572-474-7362|-556.05|AUTOMOBILE|uriously by the slyly regular packages. fluffily final deposits across the quickly express epitaphs us +1208|Customer#000001208|M uLSFG6IrQkKQxrH5vCbPjglIpB3JC|5|15-789-973-6601|2426.52|BUILDING| blithely bold dependencies detect slyly. carefully silent platelets haggle along the pinto beans +1209|Customer#000001209|PW00geNpQOiug6dftXfBkpwdAfsmRYsve,b44uR8|4|14-664-771-9006|3551.21|HOUSEHOLD|unts. regular dolphins integrate slyly. regular, pending accounts sleep b +1210|Customer#000001210|bUTLW1KIHzzQkuOEwUMwEGCQfTQM7aBmUM0|16|26-202-315-9048|8137.66|AUTOMOBILE|luffily ironic accounts haggle about the regular theod +1211|Customer#000001211|HCACb3Al89h6NqHUJ8qIjhfGFyA4S0c2|18|28-280-785-7324|4723.37|HOUSEHOLD|posits. packages affix carefully after the carefully +1212|Customer#000001212|kjiVLfadsq6sU3A6MYwySu XZnWzgkiWSa9v3K 6|22|32-462-274-7707|7736.03|HOUSEHOLD|e quickly unusual pinto beans. packages need to sleep furiously. regular asymptotes are furiously. final packages +1213|Customer#000001213|4ATLYSTcqLfgAJLxL7U|7|17-548-151-7684|8555.12|HOUSEHOLD|ong the deposits. quickly express deposit +1214|Customer#000001214|EATpN6m rGunAAkWFNSpsqy|4|14-281-851-2904|2935.31|BUILDING|carefully across the carefully ironic asympto +1215|Customer#000001215|oAvLu8VcRg9FNS9sNmoqU9|16|26-405-743-5405|7795.87|MACHINERY|special packages against the slyly final pinto beans wake slyly furiously final +1216|Customer#000001216|CSf1BbFhJhucmvftOwYLQACMEqgXj|3|13-673-633-4561|2155.06|AUTOMOBILE|eposits. slyly ironic dependencies haggle quickly. slyly close orbits above +1217|Customer#000001217|ddk4YC7lmTM,Z3LbX|12|22-191-580-2887|6019.32|FURNITURE|ar instructions. furiously pending +1218|Customer#000001218|JYNvUpFG0dDy7aJNhl2zLyIxUGqZZ35ncUe|22|32-299-871-1751|8801.73|AUTOMOBILE|packages hang against the unusual, unusual accounts +1219|Customer#000001219|kP1xK5be a8tW5JRSq0nwJWgKbO|4|14-364-661-8744|774.23|FURNITURE| the quickly even packages wake fur +1220|Customer#000001220|tbyect2HMX47TzsKy5 ho5|18|28-379-869-1009|8429.33|FURNITURE|sual multipliers. furiously unusual theodolites are. +1221|Customer#000001221|4mmeiymVdRmz|22|32-185-876-3586|816.50|FURNITURE|express, bold pinto beans. packages would detect alongside of the quickly bold +1222|Customer#000001222|hn6SzlP4Dq8F89iOXH0tjIgsz0uBCiBM|11|21-709-519-4959|3883.18|AUTOMOBILE|riously special theodolites nag slyly. slyly special ideas sublate quickly across the slyly un +1223|Customer#000001223|,I0bRfCGE5ssaX4V3|11|21-659-745-8411|-413.03|BUILDING|oxes. bold foxes detect always furiously special platelets. fluffily bold depende +1224|Customer#000001224|PWOwgZKsBoFJQ7py4HJpdJoSO2,|8|18-794-312-9970|8124.15|HOUSEHOLD| furiously regular accounts. slyly regular +1225|Customer#000001225|CgaNokxe s|11|21-839-103-4411|8634.92|MACHINERY|elets. bold packages use blithely special foxes. quick +1226|Customer#000001226|HKR1zog fXW|0|10-251-221-9440|2135.92|FURNITURE|ns. furiously pending packages hinder special accounts. sl +1227|Customer#000001227|GiT5IrOJ1zJTZErbFt1Jy6Gj|23|33-468-642-3107|3335.72|FURNITURE|fily atop the bold, unusual theo +1228|Customer#000001228|fV,ZM6pj1nivvbnfseVaWRkB0UYwKgvv|12|22-778-955-6105|5392.30|AUTOMOBILE|s according to the carefully final ideas ha +1229|Customer#000001229|csvrfGKxtX|9|19-313-452-6076|8328.12|FURNITURE| instructions sleep. carefully regular accounts use furiously. ironic, even foxes wake: busily even deposits caj +1230|Customer#000001230|Pr7yxcRne6NiloD1oR,d28rwVFRnOoTWeYq9|23|33-786-129-3407|4787.85|MACHINERY|ackages cajole furiously quickly pending packages. ironic foxes +1231|Customer#000001231|qJWtxdKmKWcR5XgMDn|9|19-316-348-3289|2326.68|AUTOMOBILE|uickly regular foxes are after t +1232|Customer#000001232|yYXdTto04oLlk04SM|18|28-518-320-7417|8482.51|MACHINERY|. even deposits lose above the even, regular +1233|Customer#000001233|KdmXav1IIIo|15|25-522-912-6255|3649.49|MACHINERY|ymptotes according to the ironic deposits use around the reg +1234|Customer#000001234|B3OhbH0MRJE,F0Lc7Jq0Ttv3|1|11-742-434-6436|-982.32|FURNITURE|y ironic instructions are quickly about the slyly silent pinto beans. quickly final dependenci +1235|Customer#000001235|q 1E JKZqhvUzj48|24|34-549-333-8551|-982.05|BUILDING|ckly. furiously quick dependencie +1236|Customer#000001236|pTEEPYlnQBzi558CN7LJ5UTdvO|11|21-699-526-9355|3600.95|MACHINERY|, pending excuses wake slyly pending accounts. asymptotes wake fluffily against the ironic, bold pack +1237|Customer#000001237| CQEeqR ,cVU7Bby|20|30-415-666-7691|8156.62|BUILDING|the bold accounts wake blithely across the deposits +1238|Customer#000001238|HGCJI27,RIIQcS20,DcJbMQuUmN3Vhzdm|6|16-302-171-7578|4299.22|BUILDING|ly special requests. unusual, special asymptotes according to the blithely express pinto beans wake en +1239|Customer#000001239|,K7wNII9jhC ,|20|30-786-518-4678|6936.72|FURNITURE| are alongside of the requests. s +1240|Customer#000001240|XbvhyAXRkuujtESRmxeD9eQpYSkiCa|4|14-650-555-5310|5439.44|FURNITURE|ans above the slyly regular ideas cajole furiously across the regular, regular decoys. furiously final asymptotes s +1241|Customer#000001241|74mW8ipfvoVPR3PS|3|13-902-876-1609|8654.56|HOUSEHOLD|ructions affix against the evenly ironic packages. slyly regular accounts run carefully. accounts accor +1242|Customer#000001242|mA8bUqB6WqNEe2nsQXlaHqMqaACj|2|12-521-364-1211|2276.15|BUILDING| regular ideas cajole! blithely express excuses b +1243|Customer#000001243|g,qSvyYkgjDcCL cxx5qy8hAwhomRq9cYJRvXZ6|14|24-445-165-9851|6271.38|MACHINERY|s, regular packages through the carefully ruthless theodolites promise quickly blithely final pinto be +1244|Customer#000001244|I3DrbiKwP3dxs1jF0iDwXh|5|15-881-433-2257|-942.80|BUILDING|old deposits alongside of the packages are +1245|Customer#000001245| xLnSgzY70qTKPF753|4|14-500-764-3702|3196.66|FURNITURE|haggle slyly at the carefully pending excuses. slyly pending theodolites use re +1246|Customer#000001246|acguUq5BISzqjHB7Bt|4|14-882-141-9354|260.71|BUILDING|haggle furiously. blithely regular patterns sleep quickly slyly even +1247|Customer#000001247|q5,Og3ezW3jSUtbwK 6qLJPqPwCwdL|0|10-386-173-3167|1696.95|MACHINERY|s against the quickly unusual ideas are blithely packages. accounts sleep quickly. regular +1248|Customer#000001248|f0X68bItSl|8|18-692-669-1536|6539.15|AUTOMOBILE|theodolites for the unusual deposits cajole fluffily final patterns. caref +1249|Customer#000001249|x9ukZnNiUM5pBPXyE3epagewVQBPZzxGYD6sMH|7|17-866-269-1165|448.49|BUILDING| the ironic packages sleep carefully express theodolites. even, final deposits across the even deposits nag after t +1250|Customer#000001250|LBPszo9EVA88sbbdYl7E,MVm7UvoBjmjr|9|19-509-608-4350|780.05|AUTOMOBILE|und the fluffily bold requests. silent, final theodolites solve furiou +1251|Customer#000001251|4AjU4c4D4AMLwQx,lAJGwBIgmT7oSZwYUv0es3J|24|34-741-256-6399|7267.76|MACHINERY|ckly regular accounts affix slyly carefully unusual +1252|Customer#000001252|u2OUDBxaayX4WhrftcM,|12|22-604-782-7617|3279.84|MACHINERY|eans might impress about the bold requests. bl +1253|Customer#000001253|2rEfA2LR6LkUXjoMxIsv58YSHPMjlqr1YXhHSX|1|11-900-587-2067|1222.21|BUILDING|efully regular deposits. bravely ironi +1254|Customer#000001254|wdGz5Cm DrSdF|18|28-832-851-4673|2676.06|HOUSEHOLD|wind fluffily blithely regular pac +1255|Customer#000001255|UC6I32JjBU62t4WgDe e2pDYbuM3VAt4MPM|14|24-359-633-2713|6487.71|FURNITURE|s deposits sleep. blithely ironic dependencies wake. blithely even theodolites sleep. blithely +1256|Customer#000001256|sNx4HcJ35paZik,IN02G7p|15|25-306-342-4782|5012.07|MACHINERY|integrate carefully. blithely e +1257|Customer#000001257|kX6yufw5dfKrgwQPVwWE7|2|12-824-451-8526|8810.83|HOUSEHOLD|hins. furiously unusual foxes about the regular foxes wake blithel +1258|Customer#000001258|zK3TKgKVuFCBdjt|3|13-727-588-7092|-301.75|AUTOMOBILE|ove the carefully ironic asymptotes. quickly final Tiresias wake regular packages. s +1259|Customer#000001259| YQc2RRQJV7kl1zxWg4OiUVU 5GlpB|20|30-930-620-7210|8353.00|HOUSEHOLD|ages sleep blithely regular, final +1260|Customer#000001260|npdrgr5Yqp0znvQt,Cw07j4BS22RNIANcb3t|2|12-742-408-2980|4991.59|MACHINERY|kly express theodolites sleep blithely across the doggedly regular packages. final, unusual instruc +1261|Customer#000001261|mWs6m9QwmTOZ|20|30-372-895-4261|5579.81|BUILDING|uffily final pinto beans. ironic deposits according to th +1262|Customer#000001262|u39WRGDI6AKU|3|13-444-583-3984|2840.36|MACHINERY| final accounts sleep slyly Tiresias. packages are furiously idle platelets. slyly silent requests are acr +1263|Customer#000001263|MXA4v0xQ9Kt |9|19-690-614-5736|6975.90|MACHINERY|ress dependencies are carefully theodolites. blithely ironic foxes among the slyly bold packages sleep blith +1264|Customer#000001264|vC1Yg5q O9 Tt5SM7OF|16|26-617-707-6647|3959.28|MACHINERY|y, regular requests above the fluffily special deposits engage around the furiously +1265|Customer#000001265|CTbTIB ZTYyKUSY42Ksz F33fxKsSG|24|34-945-256-3226|2653.53|MACHINERY|yly pending deposits about the regular accounts pri +1266|Customer#000001266|LW7shrnoCLUjJKQI8EF7SIFofvvIUmiJzpdS|3|13-832-768-3873|1877.05|MACHINERY|egular ideas. blithely regular requests above the deposits unwind on the slyly dogged pinto +1267|Customer#000001267|o3dtauyIeWwFRok2whWam0MLjmOdlG1H|24|34-329-328-2500|8616.12|BUILDING| accounts nag fluffily blithely ironic pinto beans. carefully pending deposits dazzle along +1268|Customer#000001268|SHn6HpO2VXBw3RJFPxjQFGanrsndRwRR2LWdm|24|34-973-735-5374|5152.42|BUILDING|y pending accounts! blithely unusual ideas wake alongside of the regular, f +1269|Customer#000001269|j2hwJHCMprK8HQdK7DpeUx5SG8j4dfuNR|10|20-818-485-8060|2659.68|BUILDING|promise slyly against the carefully ironic deposits. fluffily unusual foxes cajole carefully +1270|Customer#000001270|HPcuKCEtUzP3np7 oDR|13|23-473-283-1422|6170.06|MACHINERY|oost along the unusual, permanent pinto beans. even packages integrate slyly according to the pendin +1271|Customer#000001271|S7fmHdkot3JAv|14|24-698-342-2768|1209.37|HOUSEHOLD|efully after the slyly regular accounts. carefully ironic theo +1272|Customer#000001272|hzMO9cmypW|21|31-659-617-1632|6865.14|FURNITURE|symptotes. carefully regular requests after the pending ideas affix fu +1273|Customer#000001273|6RglRQdIV9mF8Tn6ABFmSQl|12|22-594-567-9307|1499.56|AUTOMOBILE|t final packages. furiously unus +1274|Customer#000001274|eHJnE7ytBm|24|34-152-721-6307|126.97|AUTOMOBILE|nts are enticingly above the furiously +1275|Customer#000001275|KUtV3oFy2Kyuzs4zT DB,S|20|30-410-174-2034|8972.46|MACHINERY|uternes. blithely express accounts detect around the fluffily even theodolites. even, spe +1276|Customer#000001276|c5UAVe71MPvmerPafNlpvTBWCewT|16|26-809-582-2064|-761.70|AUTOMOBILE| the blithely regular packages boost blithely regular excuses. final dep +1277|Customer#000001277|2ETOoQWtvxqp|14|24-502-746-4128|-52.35|BUILDING|oss the packages. packages doze car +1278|Customer#000001278|OB JBXz5fghXsYEaClW8PZpDmxMVZct|5|15-253-270-5149|9038.43|HOUSEHOLD|foxes. even, special theodolites boost. furiously silent packages haggle? furiously +1279|Customer#000001279|fkrzLacsqCnwUwgjjttKmY|14|24-742-587-6985|7915.06|BUILDING|tes are. ideas above the carefully ironic d +1280|Customer#000001280|3AmBFWaqOYt7F|16|26-725-573-7255|3419.66|HOUSEHOLD|eodolites sleep according to the theodolites. slyly pending dolphins among the pending, express platel +1281|Customer#000001281|pekyJqzeIQKGO8TeLvXgH8HR|11|21-124-963-7614|8182.42|AUTOMOBILE|the furiously quick deposits. slyly regul +1282|Customer#000001282|qeYHABkf21,5C5OC5it6q|14|24-750-627-7414|8998.82|FURNITURE| even deposits sleep quickly regular +1283|Customer#000001283|6JeLWEtDERPB,0KzWB,I6Xs8rJXAC8ryFulW5NPC|0|10-203-771-2219|2222.71|AUTOMOBILE| blithely daringly final theodolites. foxes ha +1284|Customer#000001284|sdj PCsILD6mOJfEuIIbrN52hOHTYWwUUPT|18|28-750-346-1442|-911.40|BUILDING|pending packages cajole carefully! furiously final packages wake. special requests sleep along the caref +1285|Customer#000001285|5Hy,ajDzJPtZFeJedRSeLN7XGOJtyUy2FI93|19|29-424-835-1463|3061.58|HOUSEHOLD|ly bold ideas affix blithely about the slyly even pinto beans. slyly regular multip +1286|Customer#000001286|FP3aFvhRMSKfCz3l0h|12|22-374-932-9860|6906.08|MACHINERY|quests. quickly even packages wak +1287|Customer#000001287|8CaksGsCJOK3oUm1kUsQ|15|25-493-734-3918|7461.69|MACHINERY|e quickly silent courts. furiously even packages among the ironic ideas integrate slyl +1288|Customer#000001288|wQDTTCkSGxic2d66|3|13-533-256-9320|6603.43|HOUSEHOLD|equests detect atop the ironic deposits. final requests according to the blithely sp +1289|Customer#000001289|OGb4YMkool8QMr|24|34-409-591-4324|2925.52|MACHINERY|deas haggle carefully alongside of the always even ideas. never unusual as +1290|Customer#000001290|0Q9URl0Y3rJWt9GYZF|24|34-837-161-2672|8108.42|MACHINERY|s use across the express requests-- carefully bold foxes cajole slyly slyly express pinto beans. ironic request +1291|Customer#000001291|dg3hkdHiI9zqk7l3242Q28OLLFy,1vZ,|7|17-693-294-2656|8227.37|BUILDING|, final requests-- furiously careful ideas wake busily ironic, even a +1292|Customer#000001292|QVr2XTDOMzWcLKHtNgrLK|21|31-966-407-1575|5509.11|BUILDING|haggle. special foxes sleep blithely +1293|Customer#000001293|E79dBMCNl5xXBwtnSsjuBLa16VgrLsKz|12|22-517-223-6566|2565.67|HOUSEHOLD|heodolites boost blithely ironic packages. special, even ideas above the asymptotes wake quickly accordin +1294|Customer#000001294|EZVIKislr4L0PrBP8LShL|23|33-506-204-7796|-808.13|AUTOMOBILE|deas boost bravely final ideas. slyly even pearls are furiously +1295|Customer#000001295|kded3b,5e5|24|34-259-484-2624|753.62|BUILDING|slyly final accounts detect blithely regular, bold requests-- blithely final foxes wake blithel +1296|Customer#000001296|cLAyTJcfD3T4hKW52lIU9yk|5|15-130-485-4234|3034.69|MACHINERY|e slyly ironic requests. final requests +1297|Customer#000001297|4QnYEe0KXOP3yridKldXROs7jQdMu9tE|21|31-579-682-9907|6074.01|HOUSEHOLD| pinto beans! furiously regular courts ea +1298|Customer#000001298|ujAPYPBrLW,oIxGpuWmxoTDscSXFOP Tjk|15|25-765-244-1549|3903.54|AUTOMOBILE|er furiously despite the ironic, even ideas. slyly silent ideas boost +1299|Customer#000001299|vm2THnXrMKrn5xvPL88EMT9QntU|11|21-150-179-4763|808.39|HOUSEHOLD|sheaves promise furiously alongside of the slyly pending platelets. pending dolphins at the furi +1300|Customer#000001300|VmW1dNLVaQY0ud6Csa5WHWuV8|23|33-581-399-6027|-370.44|BUILDING| x-ray furiously regular deposits. final, silent theodolites are slyly pending ideas. final dependencies +1301|Customer#000001301|oR0kHfL6GWhF VPD,mM1Jxsd9l3nZEkfDn|10|20-339-347-9046|8966.63|MACHINERY|egular asymptotes along the even, express packages sleep express realms; carefully final packages haggle quickly +1302|Customer#000001302|vyImQ4AVgv,Rn|9|19-316-212-9313|197.90|MACHINERY| platelets engage carefully! furiously express ideas shall have to use. regular +1303|Customer#000001303|MarfB1lCCs2MZ8CWdWqCfb|5|15-658-234-7985|2020.15|MACHINERY|express deposits haggle slyly after the carefully unusual packages-- silently si +1304|Customer#000001304|1sXtodRtFvBd449a2aJ|11|21-638-815-3982|4548.46|AUTOMOBILE|orses boost blithely platelets. fur +1305|Customer#000001305|xHgwqc1p0eLf5F8JkE7zvYXPHhIOP5IgLRJgR|23|33-396-634-9150|4900.66|MACHINERY|efully. furiously ironic packages cajole slyly bold requests. quickly ruthless requests alongside of the iro +1306|Customer#000001306|0YRFIqAc5imIKGi9cEYtn6L|12|22-923-551-9639|6464.77|MACHINERY|le. quickly pending accounts detect furiously. packages +1307|Customer#000001307|L OAVSFQauP87kLdHouM8|3|13-970-299-8199|4344.52|MACHINERY|ts. brave, express packages boost. even, pending instructions nag blithely regular theodolite +1308|Customer#000001308|Ndovi7D9gJ u1gjQwYOkIARup6VzhQFCHHmSMw|18|28-560-833-2066|9290.53|MACHINERY|uickly even dependencies. unus +1309|Customer#000001309|xaOhk73bjekYrVc5zZ36c,GuZUxsMHjo7WH9WVe|10|20-821-905-5952|-922.69|AUTOMOBILE|nusual excuses. ironic deposits are furiously ironic frays. blithely ironic platelets are evenly regular package +1310|Customer#000001310|bN, XpseFnbjZRh3fryWogaudZB|17|27-538-338-3378|204.84|HOUSEHOLD|unts. silently bold ideas against the blithely regular deposits use furiously ironic fo +1311|Customer#000001311|rcff2L75vK5EOUaPK DiDz6atB|13|23-647-279-5735|8713.24|FURNITURE|nd the regularly unusual foxes. regular asympto +1312|Customer#000001312|f5zgMB4MHLMSHaX0tDduHAmVd4|3|13-153-492-9898|9459.50|BUILDING|odolites wake always packages. slyly slow orbits lose. regular depo +1313|Customer#000001313|Ax4TI4jbHvaYUaaFuEUQTiMWQvrjez G|23|33-623-834-3089|889.11|MACHINERY|ely. carefully pending foxes was furiously special, special +1314|Customer#000001314|auN4t99aykk1AlmJl|1|11-290-301-2722|3218.33|HOUSEHOLD|e special theodolites haggle furiously along the even deposits. final accounts haggle. furious +1315|Customer#000001315|5J941XxxkE|10|20-941-614-6433|1447.84|AUTOMOBILE|refully bold packages. final, regular pa +1316|Customer#000001316|nmbpR1rqOdlUDvT6C HXUhm2|5|15-642-801-1329|-158.39|BUILDING| might wake. sometimes unusual requests cajole carefully about the excuses. stealthily final requests wake quick +1317|Customer#000001317|a6M1wdC44LW|14|24-518-294-8197|8925.08|AUTOMOBILE|s haggle furiously slyly final accounts. slyly bold pac +1318|Customer#000001318|yrASJAqw67PQxFYVAVsGU|14|24-524-279-4270|5812.93|BUILDING|lyly blithely final depths. regularly even accounts haggle across the carefu +1319|Customer#000001319|c5M1KcH60UZPYsa|9|19-573-345-3305|4910.48|MACHINERY|se across the dependencies. express, +1320|Customer#000001320|8gman6hzpuKUsX7mKU9katXpP1ia|15|25-116-108-3791|6407.13|MACHINERY|lent, final accounts cajole fluffily special requests. deposits around the fluffily even packages +1321|Customer#000001321|dWd3MhPQY3|10|20-571-787-3958|3589.49|FURNITURE|express foxes are quickly blithely bold +1322|Customer#000001322|35jI39rgIHCI4Pwvpy1beKgL0|13|23-207-256-7245|2621.71|FURNITURE|tes cajole. blithely express request +1323|Customer#000001323|r9R6okXwQID,|23|33-476-768-7390|6006.81|HOUSEHOLD|uffily even packages. dependencies are. excuses cajole furiously regular foxes. special dep +1324|Customer#000001324|6qS1ZDpAYr9aED9Yh ggf8ACJcPi7sp|7|17-415-957-9976|7548.88|AUTOMOBILE|t the busy courts sleep quietly above the ideas. final accounts after the regular, ironic pl +1325|Customer#000001325|Agu uZvi6Xv77 nE7W8|7|17-687-303-1074|9108.61|HOUSEHOLD|n foxes integrate furiously ironic requests. furiously even theodolites use daringly pending deposits; even pl +1326|Customer#000001326|naLuK8XKUP72msE0e|21|31-373-307-4091|-468.49|HOUSEHOLD| pending accounts impress. regular, express accounts cajole ironically express deposits. slyly regular accoun +1327|Customer#000001327|LBVMBxjllZpTQd|12|22-920-576-6295|0.97|MACHINERY| are furiously according to the multipliers. pinto beans are thinly. special deposits haggle quickly express Ti +1328|Customer#000001328|fjKlKFyxTQRJjLeT1Md|10|20-305-428-9878|3264.99|AUTOMOBILE| deposits haggle ironic, bold packages. quickly unusual packages print furiously care +1329|Customer#000001329|Q3 pefFAcrEYPQ6J AC|17|27-945-826-8003|4645.91|BUILDING|quickly silent requests affix blithely slyly bold instructions. furiously even packages dazzle whith +1330|Customer#000001330|MGY4P7QIy3|1|11-353-524-1234|3893.14|BUILDING|to beans doze along the furiously final pinto beans. req +1331|Customer#000001331|mjaArHGsPWg|8|18-140-389-1328|2005.02|BUILDING|ic excuses. requests would promise according to the furiously ironic accounts. slyly final deposi +1332|Customer#000001332|1JMz4nbClfcxmzPyWyJK|18|28-560-351-6594|3323.04|FURNITURE|ing forges. foxes haggle fluffily. express, final excuses sleep slyly blithely express dependencies. +1333|Customer#000001333|o9o6lky2KYgFZ2cSx5lyFQYufM1i1d|2|12-154-975-6824|1330.85|AUTOMOBILE|beans integrate fluffily. carefully final pinto beans wake furiously even pint +1334|Customer#000001334|gZkxQY2Aa3o D6f1O 7nsPdg6BJ3|5|15-493-800-1041|2485.71|BUILDING| unusual dependencies cajole regular, r +1335|Customer#000001335|VeQAJlVqZgl0adTxSpZ6P2ZVIC0kWokJ|10|20-744-779-7057|8341.67|BUILDING|t slyly accounts. slyly express pinto beans nag. +1336|Customer#000001336|E4MeTLnSTIOlWkLDwmG7QPf 9Dq|16|26-350-110-5043|1490.21|AUTOMOBILE|ts after the deposits are quickly deposits! blithely regular theodolites integrate above the slyly pending +1337|Customer#000001337|ACAMJe2Xdw2BCgHrGMd0BX|22|32-528-594-1931|7882.44|MACHINERY|n, express gifts. express, fluffy pinto beans sleep. regula +1338|Customer#000001338|8Nx5v3cKF MK3ejHdMUgcY,FNZZs1|20|30-763-866-5779|5139.00|BUILDING|te quickly above the regular packages. thinly re +1339|Customer#000001339|QGiiQ1iMDmLKLAHsZa L68gZFyPXX18a38IS|4|14-904-963-2452|8167.50|MACHINERY|neath the carefully unusual plat +1340|Customer#000001340|dYRQ2tz0OdH|21|31-872-435-1900|280.29|HOUSEHOLD|against the final theodolites. slyly regular dependencies after the bo +1341|Customer#000001341|n5dnBrBUHnNEnaglCr9jNvONhG tMPb|18|28-701-221-9569|762.69|MACHINERY|nt requests. ironic, even excuse +1342|Customer#000001342|FD6UNqfsYMKkf3ZFZdI4EaYMZ|16|26-340-733-2096|1520.34|MACHINERY|y around the final, special foxes. +1343|Customer#000001343|WtCLJBdycxFOsHyv|18|28-393-594-5247|8303.09|AUTOMOBILE|accounts. blithely pending foxes wake among the carefully express forges. quickly ironic realms wake bl +1344|Customer#000001344|95XSwEZD22AZln3RB|5|15-307-682-9911|2113.32|AUTOMOBILE|after the furiously ironic foxes cajole slyly unusual, pending reques +1345|Customer#000001345|31zcobEB,6Li4YDZbnNX|9|19-913-651-7783|8593.83|BUILDING|of the express, express packages. final requests detect to the regular accou +1346|Customer#000001346|cuwz2Yvj VKYEXjZzfL|10|20-502-685-6183|4524.45|FURNITURE|heodolites after the quickly bold deposits wake according to the regular platelets. ca +1347|Customer#000001347|7oXery7shMx|24|34-956-232-6103|8476.43|HOUSEHOLD|ular accounts. furiously final t +1348|Customer#000001348|CgtcDDYMnvsgI1uozRj|23|33-360-732-3579|459.22|MACHINERY|s cajole furiously among the ironic deposits. carefully bold pinto beans wake carefully against the carefully +1349|Customer#000001349|HvlnFsKOdm39Ge4VPgzE,UN|18|28-950-527-8728|4967.24|AUTOMOBILE|ges. final ideas nag furiously against the fluffily express accounts. +1350|Customer#000001350|fc,TCo2zqB9T3C5IbaGkfV3,hLqLr|3|13-486-903-2349|3339.51|AUTOMOBILE| regular, ironic ideas are carefully against the silent packages. careful, +1351|Customer#000001351|NYMFfkNlCGoTeaDrNO9nn|1|11-916-210-6616|3106.00|FURNITURE| accounts after the final deposits sleep fluffily ironic accoun +1352|Customer#000001352|XW4X8ComPo5mlyrgLn|20|30-631-606-4317|5570.69|FURNITURE|en escapades after the furiously special accounts use slyly regular grouches. fluffily final pinto bean +1353|Customer#000001353|CzscM6Q8vW6|1|11-109-274-1421|3666.51|MACHINERY| quickly ironic packages. regular, bold asymptotes about the foxes haggle carefully regular pa +1354|Customer#000001354|rvGErAt5suIqpuxwtL QPAgN7n7Tyv|13|23-969-619-1363|-897.04|MACHINERY| blithely blithely pending packages. furiously pending accounts use slyly. bl +1355|Customer#000001355|c1r6G98ixzLQkvUV2KphsFwhYvpDo18oToGB|20|30-918-883-1662|2351.10|AUTOMOBILE|anent dependencies are blithely above the quickly silent escapades. requests sleep. final foxes sleep slyl +1356|Customer#000001356|3SLzAiW4PihnFUE243 AHKkwtL1PCj|5|15-656-712-5740|927.39|HOUSEHOLD|fully pending deposits. carefully unusual accounts +1357|Customer#000001357|S1bDHNFkDEi,Gbsc3|15|25-242-146-4223|8627.90|BUILDING|osits boost pending packages. slyly pending deposits along the requ +1358|Customer#000001358|t23gsl4TdVXqTZha DioEHIq5w7y|3|13-264-253-1258|5149.23|BUILDING|sy excuses. slyly express requests detect slyly quic +1359|Customer#000001359|F5XtTR5KeZ,wAL|11|21-124-833-5784|4069.82|FURNITURE|eposits sleep quickly. enticing packages sleep ironic, ironic accounts. daring, regular t +1360|Customer#000001360|xeaT6W6D569UKCKU86iK9b6aUanlra|19|29-574-552-4018|1422.57|MACHINERY|nt packages affix quickly furiously regular foxes; quickly +1361|Customer#000001361|OAHRbO5RS8,yFt16e7glYM4oVEZpf8BefK5DA,7|13|23-104-975-7608|4128.86|HOUSEHOLD| need to promise furiously quickly bold packages. finally express pinto beans alongside of the +1362|Customer#000001362|FKywgbtf4ib|7|17-801-385-5904|3718.92|MACHINERY|gouts. quickly silent foxes affix after the ironic, special accounts. carefully bold d +1363|Customer#000001363|mYa,yAtLmW2mCglfc7cZ8LrPuP0|13|23-964-365-7781|-112.46|HOUSEHOLD|silent packages. blithely regular instructions haggle carefully slyly ironic forges? thin, br +1364|Customer#000001364|INrMv02tUJWFSRMEbBl0oUTtCjry8qUcI8T|19|29-992-959-9626|-181.69|BUILDING|e furiously according to the slyly final ideas. blithely silent excuses cajole s +1365|Customer#000001365|DOifjgJKjlSgnpPJ3cHLl2yi EseDZbg3|17|27-358-301-5393|2207.81|MACHINERY|ironic requests use blithely according to the slyly ironic patterns. carefully regular excuses about the c +1366|Customer#000001366|v3YAa1hq4Qc7FdpLg4Jh0b7xo0soyvq1w,Yrb|20|30-193-707-6924|1634.70|HOUSEHOLD|the furiously final foxes. furiously bold depos +1367|Customer#000001367|gN803k703pZ1YizV5fp6S8|22|32-462-328-6604|5420.32|HOUSEHOLD|riously theodolites. slyly bold excuses thrash slyly final pinto beans. instructions use +1368|Customer#000001368|4PxJqZUIML EhegD7RXkLY8|15|25-801-622-7438|6376.18|BUILDING|iously regular packages wake according to the slyly final deposits. carefully even packages cajole. carefully +1369|Customer#000001369|rXTwOzU0a2ak4Nj5L5b1aLij|10|20-232-617-7418|498.77|AUTOMOBILE|ong the ironic ideas haggle slyly above the courts. packages engage blithely. pend +1370|Customer#000001370|WN7onCgcC,,Lt4dC4C f7SCgnHWSjeTUp|18|28-575-379-5893|9802.04|BUILDING|y across the regular dependencies. fur +1371|Customer#000001371|H,U3MSp1OTLGIQuW2|7|17-492-673-8157|4943.58|BUILDING|es are after the carefully ironic deposits. silent requests alongside of the furiously even dependencies +1372|Customer#000001372|WiWQk7DyBtI,hfP0CIZ|23|33-563-510-6488|1796.09|HOUSEHOLD|l theodolites. regular ideas are around the furiously iron +1373|Customer#000001373|fAfmAacTlPc|13|23-959-476-7310|909.84|FURNITURE|ckages cajole slyly even requests. express +1374|Customer#000001374|vRPteZtcyV|19|29-869-316-1166|-411.43|AUTOMOBILE|ckly permanent accounts wake fluffily regular packages. quickly express foxes cajole. carefully ironic packa +1375|Customer#000001375|lpKhW7g QK7Y13sxKlRvRYI7SItbTbcBxae|14|24-620-497-1489|2011.11|BUILDING|requests! even excuses are furiously express deposits: fluffily ironic +1376|Customer#000001376|VushDntQeYmYLT22vW09rlg5j06B|12|22-972-150-2900|6761.52|HOUSEHOLD|iously unusual ideas. ironic ideas use carefully about the foxes. slyly unusual pinto be +1377|Customer#000001377|P7aUKm47hbe14nVZSrwZ|17|27-398-963-9520|8839.15|MACHINERY|s sublate carefully alongside of the slyly express theodolites. furiously special instructions haggle +1378|Customer#000001378|zDULZOX6KrHF6aL1AMsIg0Ivv4Crz|17|27-806-173-2824|2675.73|HOUSEHOLD|ges haggle slyly alongside of the furiously final excuses. carefully regular foxes boost across the regular, ex +1379|Customer#000001379|rqYSBCMywMKnfcp2DwotVqI|6|16-695-982-9623|1008.26|MACHINERY|sly ironic requests cajole fluffi +1380|Customer#000001380|a,q fKSYFADxRtRQWSppP8YKp|17|27-641-565-1036|3723.53|HOUSEHOLD|lar instructions boost quickly. blithely regular +1381|Customer#000001381|HqKfFUD6Ib9yoFM5cIgMxjXaqdJAyKSN5w Od|22|32-418-900-6494|367.82|BUILDING|foxes thrash slyly express foxes. even th +1382|Customer#000001382|uiTMgqzTPqAPoKQwbnv|10|20-962-576-3853|8898.67|AUTOMOBILE| wake furiously through the pending platelets. furiously pending deposit +1383|Customer#000001383|bSLtrtrAaAky9GZuKhlQqp8BB|15|25-267-778-1591|2092.61|AUTOMOBILE|s. fluffily unusual accounts against the special theodolites print around the special the +1384|Customer#000001384|bQI5haTy6PHM8MyRtKSlvU4ixAUg|8|18-788-299-9227|1534.38|HOUSEHOLD|tes. regularly pending theodolites cajole even sheaves. stealthy, ironic ideas are furiously above the even p +1385|Customer#000001385|4jAtwsWIITPzhTIx7jblhjp9aAzejEGnu|3|13-693-138-5884|2326.75|BUILDING|ithely daring ideas? regular requests wake slyly ag +1386|Customer#000001386|uByG5EoybI5dNNLzU5uD4Ba|11|21-450-191-9064|9643.87|BUILDING|ages above the busily final packages grow blithely alongside of the blithely even f +1387|Customer#000001387|GQhAzCMyKiDoel3|19|29-444-890-8990|8541.87|BUILDING|foxes haggle furiously according to the stealthy ideas: slyly special accounts about the requests use caref +1388|Customer#000001388|WaKdgWEru70hsL8nyLeEkneHyM59Lboo5zfWv|13|23-185-747-9502|291.44|FURNITURE|longside of the ruthlessly regular dugouts. slyly ironic pinto beans wake. dogged de +1389|Customer#000001389|ORf,IQyXsXJ1svlQ,5U|19|29-865-304-6982|1111.02|FURNITURE|posits. accounts are carefully. carefully express deposits cajole-- slyly bold dugouts wake according to +1390|Customer#000001390|fQm,RnwO4Tt PMQIB|11|21-978-977-8988|3931.31|HOUSEHOLD|ress platelets poach carefully above the slyl +1391|Customer#000001391|7MqN5yFijW6Yua7LVU6i7QMjjiyJ2KTZEaQ|23|33-558-545-3053|5510.28|FURNITURE|ges haggle slyly across the carefully pending accounts. slyly regular accounts should sleep. slyly express packages +1392|Customer#000001392|iXmNoe7IBgjc|22|32-561-640-4912|249.82|HOUSEHOLD| sleep fluffily across the final, pendi +1393|Customer#000001393|zVp5Hbhro,9rTwCYys1HUk|24|34-953-819-7858|5672.05|FURNITURE|escapades. fluffily ironic packages nag among the slyly regular dolphins. special asymptot +1394|Customer#000001394|eE8wv lYYKLXB|3|13-580-581-6470|2233.10|MACHINERY|regular accounts cajole never above the even, final instructions. furiously regular foxes wake unusual requests. ca +1395|Customer#000001395|XJoxiYIaBYgEE|23|33-291-909-3901|8733.39|MACHINERY|tions sleep carefully. furiously final requests about the regular excuses a +1396|Customer#000001396|M4dHuyrttFfeBr|3|13-523-516-9742|7149.43|BUILDING| the even theodolites integrate fluffily regular dolphins. blithely +1397|Customer#000001397|1bk KBemIEsKhD3VyXa6IRLx 4GH u|8|18-294-992-6523|5466.83|AUTOMOBILE|onic packages across the bold, regular dolphins boost furiously furious multipliers; furiously specia +1398|Customer#000001398|K1rQq6exc3WcVCcgIjA4SaeqxtK2,HG1|8|18-377-181-4654|7004.90|HOUSEHOLD|the blithely silent dinos. even, special hockey pla +1399|Customer#000001399|FOuY,endAFj|0|10-775-919-7154|7352.14|AUTOMOBILE|foxes across the silent platelets haggle fluffily special requests. unusu +1400|Customer#000001400|BuouRkR7J f|0|10-217-180-5310|2432.73|BUILDING|etect fluffily final courts. carefully special instructions +1401|Customer#000001401|C4vlB8ENikVmaMizX3nH3zgds6|9|19-339-404-7859|8908.63|BUILDING|accounts use furiously unusual pinto bean +1402|Customer#000001402|F7 m0JwiCABmbJLPQpCJ2|6|16-713-144-2780|4396.25|AUTOMOBILE|g the carefully express dolphins: special, pending packages affix after the packa +1403|Customer#000001403|,ql804gtMc3uxTfP,lt4yRBWQ|12|22-458-624-2509|9782.34|HOUSEHOLD|tes are blithely carefully bold pac +1404|Customer#000001404|pIO5i3yjeODChGMHoVvrX,Ctpdj|12|22-320-701-5582|3828.46|MACHINERY|ven platelets use quickly pending requests. busily busy asymptotes sleep slyly across the +1405|Customer#000001405|i9khsGcg17kWI4q5LKTcc8U3aFojf403|16|26-285-488-6682|3987.39|BUILDING|haggle slyly; regular, final excuses are blithe +1406|Customer#000001406|g1xS4snd0fzl4R,JmPHfEzRD|5|15-767-155-6419|2023.59|HOUSEHOLD|uests are furiously carefully express packages. slyly permanen +1407|Customer#000001407|zZsTZ3nI1rG5X|14|24-529-300-1554|7424.99|BUILDING|nding, ironic instructions promise across the quickly regular r +1408|Customer#000001408|NMIb3p1DyU,Z4XOFUS0B,|11|21-901-381-6344|5920.09|HOUSEHOLD|express requests believe. pending, brave deposits sleep furiously. carefully regular deposit +1409|Customer#000001409|jzfaCksWUNlI|11|21-667-401-3780|1959.17|MACHINERY|ously ironic ideas are. unusual packages kindle along the dugouts. unus +1410|Customer#000001410|yEUlreh6mkGmg8SIwKZooUOJ42kuZwAptaR4HAJ|22|32-358-270-1819|2716.95|HOUSEHOLD|lar, express packages cajole bravely permanently final packages. blithely even dolphins nag finally special theo +1411|Customer#000001411|4iLVKtSmtJpU|21|31-898-640-7625|772.14|AUTOMOBILE|sly final ideas. carefully bold pinto beans wake: slyly regular packages must sleep. final platelets inte +1412|Customer#000001412|gfsI6WU i7kYypv09gGIqUFrUod9uhb|10|20-715-510-2804|6368.38|BUILDING|fully regular accounts print ironic, regular platelets. deposits promise slyly. express, ironic ideas +1413|Customer#000001413|9Yh cGpbCbrXZytNfH,dAEwX|15|25-624-816-9010|1387.83|AUTOMOBILE|onic foxes. quickly final dolphins are fluffily. quickly unusual ideas wake carefully. furiously +1414|Customer#000001414|2 HBoqTD0qCyMKtcBPVHbNna|20|30-323-797-7514|3136.15|BUILDING|ackages. blithely unusual accounts a +1415|Customer#000001415|x,hzUUAZ9w7ndksLyH0,fEpMfU|21|31-295-601-1598|6252.12|BUILDING|heodolites. furiously pending requests are above th +1416|Customer#000001416|ovOZcFGL31uxmA2ifIYudX6OuwNDz,B|7|17-306-898-9363|5348.40|MACHINERY|unts wake slyly excuses. bravely even pinto beans across the furiously final de +1417|Customer#000001417|1BDU8AvljnLmkM|1|11-242-612-1339|7543.01|FURNITURE|ag slyly-- furiously final accounts are ironic instruct +1418|Customer#000001418|S5uBtE hDxHcHunowPDXKSxP3csMFnhYt|17|27-773-818-3164|9359.01|AUTOMOBILE|ggle quickly blithely thin excuses. final, even accounts integrate slyly. carefully pending account +1419|Customer#000001419|JM4NV2pq4Ps0xJNRtUtlmQ8uuDvKx|4|14-533-796-5446|5912.72|FURNITURE|. idly express pinto beans sleep above the deposits. excuses use: furiously bold accounts cajole slyly across the ca +1420|Customer#000001420|mjkRUOEzdCWpNdpp5PKOObMmhpufeNGnO1VFdbpK|9|19-433-305-7356|-932.09|AUTOMOBILE|the instructions cajole carefully. slyly final requests nag carefully ac +1421|Customer#000001421|Qx9tZ9yiMo|12|22-139-990-1907|7292.93|MACHINERY|kly even ideas cajole carefully quickly ironic +1422|Customer#000001422|mzXw44ExYC8DAdeKBakiWy0II|17|27-270-833-4320|8389.50|MACHINERY|mong the evenly express asymptotes integrate slyly brave +1423|Customer#000001423|9BcCj8CLsqylKxRj0,lm|21|31-624-875-9135|2411.69|FURNITURE|he carefully express courts. regular instructions haggle. special, express accounts believe? packages cajole slyly. +1424|Customer#000001424| 3QsPgbVLZ|22|32-542-134-6212|7207.70|FURNITURE| instructions against the furiously express accounts doze fluffily unusual d +1425|Customer#000001425|I2UBZAPPdnA9oFKKJTGxaSQZb5QzNzTR4vN6d P|1|11-697-824-4418|5814.72|FURNITURE|uests boost carefully even foxes. accounts along the slyly ironic requests cajole express, final deposits. sl +1426|Customer#000001426|d1Tyzg,0ArKPuBln8CDH, 1Xsukm2nXVl|15|25-629-292-9022|1965.38|HOUSEHOLD|s are slyly according to the express, spe +1427|Customer#000001427|dDsmiig0T4oFKaf9ttFeh1etLvSIc9aV1xF2H|11|21-941-208-2485|8136.53|AUTOMOBILE|es detect accounts. slyly bold theodolites wake ironic, special accounts. instructions cajo +1428|Customer#000001428|3SdWi3lKPXk00UYT,hL|15|25-859-663-3690|7703.84|FURNITURE|iously final platelets sleep slyly ironic instructions. furious +1429|Customer#000001429|K5sID 6zGPrYdfoADUq4kidlPgF3|3|13-119-903-3814|6444.82|AUTOMOBILE|even requests among the blithely regular pinto beans use across the ironic accounts. slyly ironic +1430|Customer#000001430|mv 9MEDwd8yPeQj7N|0|10-209-317-6929|-920.40|BUILDING|nic deposits. bold, even accounts cajole blithely +1431|Customer#000001431|l3LM2d2T1n c7yI4sOfpEbbd540qO66A4MARk|13|23-640-395-7009|5805.81|AUTOMOBILE|eposits up the carefully bold requests mo +1432|Customer#000001432|,pbQM2fi642oAuel|21|31-831-635-9758|6314.25|MACHINERY|ts sleep. regular frets sleep carefully ironically special dolphins. carefully bold pinto beans +1433|Customer#000001433|gK7D76v78U iRA2YI2kxeKLlm4LZMH13,|17|27-558-375-8169|4605.87|BUILDING|ly bold deposits. furiously silent braids alongside +1434|Customer#000001434|V15TQAhSLp7YC3KdjuMwSV3cwg0lp|18|28-749-743-6583|1851.63|MACHINERY|lieve carefully ironic hockey players. special ide +1435|Customer#000001435|s0fqxkVVqLWR IaqibwwOf|20|30-309-437-9265|-729.09|AUTOMOBILE|usly final orbits are? unusual, ironic accounts are slyly. unusual requests sleep after the ironic, +1436|Customer#000001436|kV5m0jkgFEto,|10|20-918-593-1860|9158.91|MACHINERY|theodolites. final Tiresias after the quickly final packages dazzle carefully blithely bold +1437|Customer#000001437|DjHgTwtlzCmcQo|17|27-805-486-5768|8839.32|BUILDING|y. bold pinto beans affix carefully unusual pinto beans. carefully bold Tiresias mold +1438|Customer#000001438|Gz Aey8gzHxIIxtpJaG0lAqd82T|17|27-688-787-7928|5436.81|FURNITURE|odolites cajole slyly. furiously unusual requests boost furiously along the fluffily pending in +1439|Customer#000001439|IGGK4SXvT5ioAeT2fbVYDemsTTqqhsQu6|21|31-433-694-1822|8487.60|AUTOMOBILE|ely after the carefully bold accounts. carefully ironic packages are silent packages. blithely ironic pinto beans ar +1440|Customer#000001440|k3LXBO5QJrG94TBG77adB1HjqQkleDyUf2c|7|17-619-730-9883|1236.36|BUILDING|xpress, even accounts integrate. ironic, special requests doze. carefully express instructions doze furio +1441|Customer#000001441|u0YYZb46w,pwKo5H9vz d6B9zK4BOHhG jx|23|33-681-334-4499|9465.15|BUILDING|nts haggle quietly quickly final accounts. slyly regular accounts among the sl +1442|Customer#000001442|2fTQpX7N2kp31U|16|26-677-746-7145|7917.90|MACHINERY|ess theodolites. furiously express pinto beans alongside of the +1443|Customer#000001443|qtBPSM2NvmJXNePBT Ap3M6UqIZTvaF|10|20-959-383-4792|7141.87|HOUSEHOLD|ickly about the sly foxes. furiously bold patterns sleep regularly across +1444|Customer#000001444|8WcsyfQU5svH9miWvYbSTH9|7|17-107-228-8125|-501.37|HOUSEHOLD|inal platelets. quickly ironic requests do are carefully carefu +1445|Customer#000001445|5y7gtM75FOfTSBKx9gs9c9MkqJt|21|31-151-251-1931|8367.94|HOUSEHOLD|carefully regular accounts after the b +1446|Customer#000001446|p94EVXQW,Q3bhXDyhG1Gp96b5zbaW|23|33-873-120-5388|2981.48|BUILDING|gle ruthlessly. furiously express dolp +1447|Customer#000001447|pHkyNkViDja,dZVNg4bEEbicpoHIVDZvtQi8RPl|17|27-452-251-2941|2718.02|BUILDING|ously around the accounts. packages haggle blithely ironic, idle ac +1448|Customer#000001448|a45QD J55bo35zA4qR3v|24|34-969-612-1458|7756.35|AUTOMOBILE|y ironic instructions? slyly pending platelets hang quickly slyly ironic ideas. blithely ironic instructions a +1449|Customer#000001449|lNFczqF3TjlSO9BuO3jqXY,b|22|32-827-813-3340|9051.75|BUILDING|ructions wake slyly ironic notornis? slyly express courts wake along the slowly +1450|Customer#000001450|z7Pl iXBEstivMNf|3|13-443-688-6724|857.70|MACHINERY|ains; daringly dogged deposits across the furiously regular instructions breach furiously foxes. carefully unusual a +1451|Customer#000001451|Yt69m0Aw1LWZhisHJxL4iGEEzx6y,ehspkes|2|12-590-121-9328|3274.30|FURNITURE|ously regular packages. furiously final deposits boost. slyl +1452|Customer#000001452|51mhHAvPHZACedHYXVU5HXoDIQtBK9,pxuOIlJ|7|17-581-575-4538|7086.97|FURNITURE|silent theodolites. fluffily special +1453|Customer#000001453|FTfWkW1 8jVgOIIR9sMm2HpohiuR1v2278|0|10-852-397-3642|662.67|BUILDING| to wake above the blithely regular foxes. d +1454|Customer#000001454| wwPhUG35PiIVasu88,RvDA|24|34-478-555-5955|3366.61|FURNITURE|ss the blithely ironic deposits. regular deposits after t +1455|Customer#000001455|MrDN0cvhoLZ ioRLZCR hPcY4WvILz2|3|13-839-360-1866|7591.90|MACHINERY|ironic instructions: ironic pinto beans acros +1456|Customer#000001456|zKDB5elqlAQoUQp|13|23-171-834-8997|6123.69|AUTOMOBILE|unusual accounts wake. even, ironic packages wake carefully. regular p +1457|Customer#000001457|qmpteVs7H9WjRow7FDut9a77oFKRDOXxq0JmG|23|33-660-953-7656|2873.49|BUILDING|onic accounts nag blithely among the regular, regular pinto beans. carefully regular +1458|Customer#000001458|vsGifZH3fNgJjlgF6jJbmkSqGc|3|13-392-503-9207|2716.80|AUTOMOBILE|ests sleep bravely ironic accounts. quickly regular accounts cajole +1459|Customer#000001459|2sPwjFNEFf9dN4az|11|21-424-586-6295|9270.88|AUTOMOBILE|ounts use blithely. blithely pending packages use ironic deposits. final accounts boost slyly. care +1460|Customer#000001460|AEgBZGLmuMqe7Gqh1|20|30-151-388-7118|9680.51|BUILDING|accounts. ironic packages cajole furiously; quickly pending requests lose quickly carefully bold deposits. +1461|Customer#000001461|MMmT5l0zAilFCb2ZMqsUm3TXlRH|3|13-393-444-1533|8460.48|AUTOMOBILE|ress, unusual packages affix carefully carefully final ideas. blithely special instructions nag even deposits? f +1462|Customer#000001462|b9Ed,6BCKn5v37q1|17|27-153-195-4457|7305.88|FURNITURE|ously slyly express requests. spec +1463|Customer#000001463|WD3OuRpJ0NVj2qslrTkUPmeJqVx5|7|17-980-394-5868|6039.64|MACHINERY|s. blithely even courts wake quickly: quickly silent pains doubt slyly. slyl +1464|Customer#000001464|5kOAfK9s6goOZabgSzNLgD,CILowRxqC2OLnV|14|24-133-117-1577|9306.20|AUTOMOBILE|iously furiously regular tithes. boldly final requests use carefully at the f +1465|Customer#000001465|tDRaTC7UgFbBX7VF6cVXYQA0|8|18-807-487-1074|9365.93|FURNITURE|s lose blithely ironic, regular packages. regular, final foxes haggle c +1466|Customer#000001466|Fdm3uYarZ0Tnnh9R|17|27-360-496-5041|1268.69|FURNITURE|nts along the blithely bold instructions boost carefully after the unusual depos +1467|Customer#000001467|GE,jQi5oLlkzh4jIUct7r 3C5G|24|34-941-824-8063|2857.19|FURNITURE|. final, bold deposits sleep furiously. unusual instructions are final requests. quickly final sentiments +1468|Customer#000001468|APEd1ssFxDC9fhwosxxeQUul5EhwBczX|12|22-901-280-1023|3826.52|BUILDING|s. slyly regular theodolites aft +1469|Customer#000001469|yLW8qLv25wuMsibRd,1qJe9|7|17-961-583-4658|4329.98|FURNITURE|y even dependencies wake against the regular, final excuses. packages haggle slyly a +1470|Customer#000001470|8ufZxZ5IgwGrUM2CWfxYoRHuBi Vj8rY|17|27-350-836-5521|7033.49|HOUSEHOLD| excuses are slyly after the carefully bold accounts. unusual pinto beans boost. final accounts wak +1471|Customer#000001471|lbRP,tSo,eQT6rDDNNIBx|5|15-230-827-4758|3872.86|AUTOMOBILE|thely according to the carefully ironic foxes; packages according to the quickly special deposits wake fur +1472|Customer#000001472| Eayx9GAqjJEwrGy1Er5 ffNtLL|5|15-464-411-8342|2168.61|MACHINERY| haggle against the carefully bold theodolites. quietly regular ideas haggle. pending pinto beans engage sl +1473|Customer#000001473|UPkONG9dy4VYyGNJGHG|0|10-891-555-7734|2796.93|MACHINERY|uriously. quickly pending multipliers maintain slyly silent excuses. regular requests cajole qui +1474|Customer#000001474|KB83CaaM8DRjvAmEMg1fw|16|26-609-226-4269|2961.79|HOUSEHOLD|kages above the requests sleep furiously packages-- deposits detect fluffily. pending th +1475|Customer#000001475|4tUf4SaYTFV2H7ji|0|10-932-794-2009|1820.28|BUILDING|uctions sleep blithely bold packages. pending, silent deposits after the fluffily final pinto beans ar +1476|Customer#000001476|nsPnedR1dhWK,|16|26-621-638-1459|409.72|BUILDING|across the fluffily final requests. regular forges haggle furiously r +1477|Customer#000001477|nUT6kGEr7tmgpJaPgfFtXY|6|16-407-756-8079|9103.33|MACHINERY|ites nag blithely alongside of the ironic accounts. accounts use. carefully silent deposits +1478|Customer#000001478|x7HDvJDDpR3MqZ5vg2CanfQ1hF0j4|7|17-420-484-5959|9701.54|AUTOMOBILE|ng the furiously bold foxes. even notornis above the unusual +1479|Customer#000001479|KDZMMuMVSWQPkGpoTUE0G 1vXHd3mS4c,A,kFR|16|26-203-849-3685|9793.29|BUILDING|arefully final ideas. unusual accounts sleep. final packages wake. fluffily bold dependencies hang slyly. bl +1480|Customer#000001480|Hzjh65ZXBFSzflrjQgECkrp35gDha,2|7|17-573-775-8796|876.02|HOUSEHOLD|uriously pending courts are. deposits serve quickly blithely final excuses. slyly reg +1481|Customer#000001481|Vp7Um1Vy7MNVJvP 5cqUrz8scGtcaLJB3f5bZDW|12|22-674-694-9039|3204.67|AUTOMOBILE|lithely. idly ruthless packages wake above the bold, quick pinto beans. regular ex +1482|Customer#000001482|kTcr5JgkjFeLKIRcmtnCvOFr1feN59chP7|19|29-452-962-5934|2930.53|FURNITURE|are. slyly regular deposits mold carefully above the blithely regular ideas. carefully r +1483|Customer#000001483|ZjY1C b6cOnY3|7|17-202-113-4814|4409.70|BUILDING|nts sleep around the carefully express theodolites. requests nag +1484|Customer#000001484|WcOint654aJStnQWSgAAtI|18|28-987-505-1842|4883.17|FURNITURE|s against the furiously special packag +1485|Customer#000001485|oR6sZslMa7bPLxtHFhqdJt|24|34-329-123-7678|9412.02|BUILDING|pliers. ironic requests boost slyly carefully express ideas. blithely ironic foxes af +1486|Customer#000001486|7A2MhrNtsA|24|34-559-605-2237|5859.97|BUILDING|lithely ironic dependencies haggle quickly b +1487|Customer#000001487|AJXUi2qFVKfypmmpTEbkmjmz0gPKQ2|17|27-197-562-5547|3589.16|FURNITURE|y final instructions. regular, regular packages boost alongside of the b +1488|Customer#000001488|DtF2uJI8td2wqrumD|4|14-892-461-5341|7929.51|HOUSEHOLD|sits boost quickly fluffily even pinto beans. slyly e +1489|Customer#000001489|yM8biIU5IFKHODCGTCwdkUf|9|19-906-669-4354|4389.66|MACHINERY|ckages play carefully? permanently regular pinto beans +1490|Customer#000001490|vBUkY7eCyWP|20|30-326-598-2437|8997.60|MACHINERY| bold orbits boost slyly according to the carefully ironic accounts. slyly special packages whithout the +1491|Customer#000001491|GjZIP4Fv5lqDt|4|14-931-281-5631|3739.82|HOUSEHOLD|efully silent tithes. even deposits according to the unusual, even platelets haggle furiously a +1492|Customer#000001492|2QNz4Zy0UjjI|1|11-527-949-4092|-875.17|HOUSEHOLD| blithely even accounts. furiously final instructions across the decoys cajo +1493|Customer#000001493|FbV 8Ug9GkSfMde5b|24|34-947-154-7032|7014.12|MACHINERY|carefully quiet requests lose slyly. quickly final pinto beans haggle bli +1494|Customer#000001494|4V71P ku3jrqBfQp|11|21-248-166-9549|8292.21|MACHINERY|arefully furiously special ideas. pending deposits above the blithely regular excuses wake slyly car +1495|Customer#000001495|78w5H7VJSo0Ps,jqeoCWS4Kay17ygM4RtIH|10|20-416-910-7075|6227.55|FURNITURE|osely blithe, ironic foxes. regular dependencies use blithely about +1496|Customer#000001496|ZOyMxutVHpJy|3|13-802-978-9538|-496.49|AUTOMOBILE|counts wake slyly above the instructi +1497|Customer#000001497| D8e2U3gYd57H4grcOr,02|14|24-506-574-8552|2449.57|AUTOMOBILE|gular packages boost foxes. blithely bold escapades wake slyly special pack +1498|Customer#000001498|x XToT5oFi7oIsRG2mgIL3ncvYJoWBsufsQ7N,z|19|29-676-227-6356|5810.56|AUTOMOBILE|ackages are slyly unusual req +1499|Customer#000001499|4,6jWOEqfnuXkwhB7gs0M9TcWJlaJNv4bt|3|13-273-527-9609|9128.69|AUTOMOBILE|ole blithely permanent instructions. carefully even packages +1500|Customer#000001500|4zaoUzuWUTNFiNPbmu43|5|15-200-872-4790|6910.79|MACHINERY|s boost blithely above the fluffily ironic dolphins! ironic accounts diff --git a/src/test/singlenode_regress/data/desc.data b/src/test/singlenode_regress/data/desc.data new file mode 100644 index 00000000000..4ff1457e900 --- /dev/null +++ b/src/test/singlenode_regress/data/desc.data @@ -0,0 +1,10000 @@ +9999 1227676208 +9998 1673273198 +9997 868304211 +9996 999647871 +9995 310717580 +9994 1600952573 +9993 1081719182 +9992 242349705 +9991 1831758177 +9990 463935293 +9989 2044302343 +9988 1923557716 +9987 1243580926 +9986 18212056 +9985 757774765 +9984 1995958541 +9983 677073243 +9982 1290996901 +9981 947110578 +9980 1807402518 +9979 1756582238 +9978 910567096 +9977 2071380026 +9976 924516791 +9975 780851952 +9974 1605398760 +9973 1596663587 +9972 1261944440 +9971 625318191 +9970 1416577811 +9969 1272626725 +9968 228028337 +9967 1362555617 +9966 1414835286 +9965 2065412336 +9964 68367875 +9963 1916678044 +9962 617783889 +9961 345531010 +9960 2055684109 +9959 1367838015 +9958 2026090287 +9957 1165782951 +9956 1395106032 +9955 1488622461 +9954 1614261512 +9953 1048847963 +9952 1017154373 +9951 1681898311 +9950 36543482 +9949 1883506140 +9948 832065446 +9947 129715143 +9946 465981266 +9945 1475336852 +9944 1666391160 +9943 980080569 +9942 180085775 +9941 2136801363 +9940 397289853 +9939 54022194 +9938 2005275087 +9937 310099649 +9936 1294187742 +9935 1645640890 +9934 1447628447 +9933 1870320513 +9932 2008477583 +9931 1397429521 +9930 466924371 +9929 889901157 +9928 2120215631 +9927 537467826 +9926 1699005087 +9925 346258069 +9924 471468088 +9923 2079846849 +9922 1012304481 +9921 1281131881 +9920 849832864 +9919 2054311986 +9918 1417524873 +9917 1504212242 +9916 610807631 +9915 1633384345 +9914 1295251077 +9913 1677073445 +9912 582790715 +9911 126063581 +9910 131526276 +9909 87190204 +9908 907318099 +9907 359634197 +9906 1009954849 +9905 1571350877 +9904 1784646955 +9903 50198926 +9902 1403396142 +9901 1118576425 +9900 1424697538 +9899 2076940193 +9898 1338379718 +9897 1773957562 +9896 65999738 +9895 1766641886 +9894 1481437235 +9893 1337819855 +9892 1230013984 +9891 1105476143 +9890 2011090655 +9889 1493104270 +9888 1443504355 +9887 1931624176 +9886 208961165 +9885 1081217833 +9884 1050593630 +9883 1169187495 +9882 1545547169 +9881 495600511 +9880 1366229130 +9879 1919375727 +9878 1224719003 +9877 1483450870 +9876 722470890 +9875 959755923 +9874 167954735 +9873 666070529 +9872 772985035 +9871 1473939597 +9870 1927680355 +9869 1798223624 +9868 2010940455 +9867 1719221479 +9866 292520326 +9865 875663531 +9864 536627902 +9863 375961092 +9862 1474212847 +9861 1884393362 +9860 1809455435 +9859 79466479 +9858 1284143105 +9857 362286522 +9856 881030546 +9855 1187257317 +9854 1683154312 +9853 554993119 +9852 1950442013 +9851 1773655090 +9850 1418365156 +9849 2030261908 +9848 1196904837 +9847 264963079 +9846 1315496134 +9845 56400360 +9844 186770888 +9843 841498786 +9842 885873822 +9841 1122245059 +9840 1610482790 +9839 208458876 +9838 1505703298 +9837 1135276924 +9836 1182593577 +9835 2064042882 +9834 1548934331 +9833 799718188 +9832 713989305 +9831 1394746368 +9830 600250256 +9829 1447168913 +9828 1345919581 +9827 96885788 +9826 826615858 +9825 326037427 +9824 1384298952 +9823 2056982869 +9822 1284111611 +9821 2067663753 +9820 576750253 +9819 1153402076 +9818 714765773 +9817 1140504476 +9816 78192191 +9815 473997348 +9814 1318010186 +9813 1212009477 +9812 1378499644 +9811 677414946 +9810 1764025409 +9809 475205866 +9808 1173348946 +9807 1589144064 +9806 1733826240 +9805 382875389 +9804 1350053577 +9803 154187963 +9802 199467931 +9801 1414304039 +9800 48826786 +9799 503364468 +9798 620553055 +9797 1019882154 +9796 860070484 +9795 917116636 +9794 1189409464 +9793 1464118846 +9792 1480232616 +9791 130709534 +9790 1352897980 +9789 1583729425 +9788 1075209885 +9787 240768425 +9786 1969977938 +9785 1013666362 +9784 1242981351 +9783 640595240 +9782 1595467716 +9781 903293778 +9780 1651549647 +9779 174881345 +9778 888863273 +9777 790473557 +9776 239090487 +9775 1579638277 +9774 183407458 +9773 2083233185 +9772 105361177 +9771 1843587111 +9770 793750984 +9769 1176428280 +9768 1790777632 +9767 1850920067 +9766 1977956338 +9765 1543435285 +9764 1584367668 +9763 1058699929 +9762 111220866 +9761 2043986839 +9760 1202983297 +9759 1112129554 +9758 1761235135 +9757 61543522 +9756 1145270722 +9755 1329382697 +9754 1565682294 +9753 339687573 +9752 1136529241 +9751 1420586371 +9750 14430505 +9749 861076090 +9748 2083274506 +9747 1456708644 +9746 607066099 +9745 303340949 +9744 1474277100 +9743 487303995 +9742 1289482201 +9741 1076416545 +9740 52809478 +9739 1090314565 +9738 1345955589 +9737 247342347 +9736 266552398 +9735 919256409 +9734 1432214419 +9733 1687864477 +9732 2003200280 +9731 1146574960 +9730 282751704 +9729 1141439775 +9728 2114342480 +9727 431852437 +9726 643344876 +9725 805583149 +9724 192853456 +9723 145095923 +9722 325257068 +9721 275453150 +9720 1484795513 +9719 705205508 +9718 254009991 +9717 1779933556 +9716 2129915192 +9715 119762104 +9714 1161342396 +9713 397860555 +9712 434494516 +9711 199167636 +9710 1877944603 +9709 1952950779 +9708 823762166 +9707 426699180 +9706 962611576 +9705 726171569 +9704 1063539777 +9703 285639459 +9702 1405112773 +9701 861760505 +9700 1179716127 +9699 1998382914 +9698 498094899 +9697 1308759331 +9696 238998981 +9695 498248952 +9694 480326081 +9693 2064883954 +9692 807784058 +9691 1767535207 +9690 21443159 +9689 1852345604 +9688 722773964 +9687 134247887 +9686 618591160 +9685 1732054637 +9684 1832751235 +9683 962174759 +9682 667399599 +9681 629027385 +9680 1522889118 +9679 1451245423 +9678 990339203 +9677 97590597 +9676 1510643051 +9675 676972117 +9674 1468542443 +9673 201779272 +9672 1253406979 +9671 1554213507 +9670 363665606 +9669 2018440444 +9668 1759383933 +9667 2147329594 +9666 828433250 +9665 321598675 +9664 1837948542 +9663 860274521 +9662 2043440795 +9661 1102922102 +9660 1044761243 +9659 2034678919 +9658 1233754444 +9657 1138202974 +9656 448980300 +9655 1803900049 +9654 1064655038 +9653 1203723850 +9652 1586769289 +9651 1363637824 +9650 1786171829 +9649 1425298520 +9648 2088086019 +9647 313367086 +9646 776531802 +9645 1308863779 +9644 1571048785 +9643 2061812584 +9642 1985597314 +9641 1382450183 +9640 1942313221 +9639 363819659 +9638 1190007193 +9637 1437785258 +9636 309381052 +9635 2115642377 +9634 425641528 +9633 735026440 +9632 1962996926 +9631 8761875 +9630 2016651306 +9629 2054041917 +9628 1585698619 +9627 1577338043 +9626 73547936 +9625 1392740097 +9624 217130759 +9623 1848500861 +9622 1565035669 +9621 161470769 +9620 1423035453 +9619 1472804743 +9618 648766718 +9617 779222240 +9616 889801949 +9615 862202865 +9614 1470750113 +9613 188598602 +9612 119499363 +9611 1621777654 +9610 192442990 +9609 504527963 +9608 54438607 +9607 1221848464 +9606 1012143730 +9605 1721838260 +9604 152645451 +9603 416879652 +9602 865858782 +9601 2056438657 +9600 570546904 +9599 439313263 +9598 1980493980 +9597 192958522 +9596 1360207283 +9595 372530723 +9594 1975188076 +9593 55659990 +9592 425465408 +9591 92230926 +9590 1660187698 +9589 643813213 +9588 583002794 +9587 1934047501 +9586 1455955774 +9585 701203347 +9584 742703502 +9583 1996456107 +9582 2143639260 +9581 1762455048 +9580 1567339047 +9579 1118078173 +9578 1639867880 +9577 480083994 +9576 1069203013 +9575 595264078 +9574 855979478 +9573 243690442 +9572 1993816396 +9571 426545519 +9570 75944676 +9569 377588382 +9568 1226589627 +9567 1607963257 +9566 365254093 +9565 1304547293 +9564 2094548962 +9563 1882957150 +9562 542955940 +9561 1929135843 +9560 1656711780 +9559 1873623845 +9558 1335341086 +9557 2029283095 +9556 1191343998 +9555 1606983315 +9554 705047735 +9553 1127732102 +9552 429117059 +9551 1025561086 +9550 122587167 +9549 1087255053 +9548 48875160 +9547 1044603802 +9546 1771588164 +9545 825512571 +9544 748931329 +9543 429433959 +9542 167745765 +9541 1616228014 +9540 1347439539 +9539 615465067 +9538 12334288 +9537 2069525982 +9536 1660897943 +9535 629780591 +9534 761591353 +9533 165413119 +9532 226245370 +9531 816815742 +9530 593794757 +9529 1774912333 +9528 682279847 +9527 1875841419 +9526 1324235360 +9525 63611896 +9524 1177866256 +9523 1826970296 +9522 1005144935 +9521 1489345654 +9520 976685926 +9519 1225467013 +9518 1463150537 +9517 1370846236 +9516 295672473 +9515 1342154204 +9514 657766806 +9513 1280186963 +9512 1229478068 +9511 1699764346 +9510 1603893726 +9509 1425397205 +9508 1102050772 +9507 1530037345 +9506 1307934629 +9505 1495484824 +9504 403535220 +9503 2092259258 +9502 1719102010 +9501 598816685 +9500 134535895 +9499 865436986 +9498 450676973 +9497 618667951 +9496 697975163 +9495 1644748711 +9494 1205950609 +9493 1836004249 +9492 850284370 +9491 1927161570 +9490 26195117 +9489 1753323338 +9488 929794540 +9487 120996332 +9486 713079430 +9485 1162969158 +9484 112676136 +9483 1105486107 +9482 1823776885 +9481 1951564511 +9480 597713574 +9479 73856380 +9478 117462575 +9477 1754049596 +9476 1126502125 +9475 1363159019 +9474 1923866462 +9473 1952202183 +9472 1957723363 +9471 853665024 +9470 148139712 +9469 1663351592 +9468 167461823 +9467 953411909 +9466 1560200990 +9465 1009454561 +9464 794464341 +9463 1426272687 +9462 1809809132 +9461 1244444680 +9460 997367030 +9459 2052682433 +9458 1040243907 +9457 1914309030 +9456 8320196 +9455 1755076971 +9454 1486675921 +9453 308595273 +9452 507772533 +9451 1749920504 +9450 1834101935 +9449 991147626 +9448 1094837903 +9447 901787204 +9446 1977666782 +9445 1321783590 +9444 1552919304 +9443 1070201438 +9442 1804062470 +9441 294371770 +9440 686203201 +9439 1342211451 +9438 103150602 +9437 1305490909 +9436 158947568 +9435 133928303 +9434 1347129077 +9433 1697503309 +9432 428905657 +9431 1904610347 +9430 204200772 +9429 1230541648 +9428 2044362237 +9427 1432650584 +9426 427633109 +9425 1847208570 +9424 1247304438 +9423 1884239064 +9422 621976986 +9421 1664108554 +9420 655082601 +9419 932314731 +9418 1160964492 +9417 1920537961 +9416 1496351548 +9415 907465344 +9414 1665204767 +9413 1258547533 +9412 383998237 +9411 461851019 +9410 191221168 +9409 1528195939 +9408 1183263883 +9407 2116705947 +9406 2105845480 +9405 608927906 +9404 1852506294 +9403 1590002378 +9402 1493302537 +9401 1345847657 +9400 2007731758 +9399 919033836 +9398 802908539 +9397 197153666 +9396 185346146 +9395 690877692 +9394 1225231584 +9393 1730679531 +9392 1229156463 +9391 1837145903 +9390 503144062 +9389 882028287 +9388 1583446830 +9387 253499148 +9386 255333194 +9385 237804015 +9384 523467107 +9383 1203353748 +9382 1067326365 +9381 1003285945 +9380 1426070784 +9379 221998868 +9378 1569834107 +9377 574335976 +9376 264199653 +9375 515843101 +9374 1263109017 +9373 506658637 +9372 1729754268 +9371 574268701 +9370 542939118 +9369 1810578091 +9368 733687689 +9367 112030846 +9366 1119405730 +9365 602150263 +9364 1609204877 +9363 1535569329 +9362 1227535469 +9361 347128176 +9360 253699072 +9359 249644913 +9358 626695093 +9357 1345642815 +9356 1877515689 +9355 1199463094 +9354 1317961297 +9353 1667664809 +9352 1924766611 +9351 845327497 +9350 1580935486 +9349 851734808 +9348 2105282863 +9347 1053991006 +9346 1458710607 +9345 1905024664 +9344 933572481 +9343 688840316 +9342 2111203167 +9341 2066659825 +9340 1988064659 +9339 430908271 +9338 691172361 +9337 131537426 +9336 650309617 +9335 1731320048 +9334 1522098441 +9333 1262076701 +9332 1281870257 +9331 977890556 +9330 1867916730 +9329 1055539905 +9328 519612872 +9327 1574715647 +9326 27681518 +9325 209850880 +9324 1422180130 +9323 472633800 +9322 86729323 +9321 1073031803 +9320 887528282 +9319 526944480 +9318 1540507849 +9317 200258198 +9316 120418525 +9315 769870290 +9314 1941305145 +9313 1014396304 +9312 848259305 +9311 1680294895 +9310 1375487463 +9309 1856527233 +9308 1928082302 +9307 1107335961 +9306 756922633 +9305 1535716564 +9304 449449791 +9303 544207885 +9302 1541643618 +9301 226330352 +9300 458277684 +9299 293201083 +9298 1027858387 +9297 309761992 +9296 152535517 +9295 1702531365 +9294 123121556 +9293 349148327 +9292 1732589166 +9291 1707268491 +9290 1680007602 +9289 687270083 +9288 406525955 +9287 770637558 +9286 406436701 +9285 1253505869 +9284 2069094633 +9283 261010250 +9282 1786392488 +9281 1139215720 +9280 1899696241 +9279 268151502 +9278 1099604600 +9277 392365737 +9276 657886169 +9275 212714747 +9274 2141556594 +9273 223119439 +9272 85930201 +9271 1248442535 +9270 1345955613 +9269 148515692 +9268 140665566 +9267 1472810669 +9266 186640435 +9265 1950870838 +9264 2117425847 +9263 563336713 +9262 816624372 +9261 1045319083 +9260 1300742536 +9259 909370044 +9258 280833382 +9257 1300503734 +9256 849026573 +9255 145426451 +9254 1614597028 +9253 929878913 +9252 508797656 +9251 1518240986 +9250 39611120 +9249 1507330504 +9248 1757748981 +9247 886889852 +9246 398292791 +9245 434766730 +9244 126784546 +9243 893114058 +9242 1024647474 +9241 2084898157 +9240 1107776969 +9239 2020628591 +9238 2109358904 +9237 337278376 +9236 1502868470 +9235 1770787370 +9234 1134246465 +9233 1072106764 +9232 1410077824 +9231 2054737976 +9230 764485700 +9229 238802 +9228 60343471 +9227 135406931 +9226 1833390353 +9225 2066631307 +9224 1784112442 +9223 96356042 +9222 890267793 +9221 1148950800 +9220 1907975653 +9219 1300204915 +9218 1109037712 +9217 1322982251 +9216 760105306 +9215 1652662381 +9214 1557602903 +9213 189370036 +9212 1932820737 +9211 1151502531 +9210 2123022901 +9209 770498593 +9208 517760121 +9207 338571534 +9206 1350515558 +9205 430761706 +9204 360709546 +9203 1226992137 +9202 307621063 +9201 1409839022 +9200 1994394505 +9199 629078769 +9198 314332097 +9197 141195811 +9196 498778137 +9195 1737034311 +9194 1176363514 +9193 635161642 +9192 335864037 +9191 1737546526 +9190 39913088 +9189 584993402 +9188 540099609 +9187 1603858979 +9186 1912862995 +9185 570735270 +9184 1867325292 +9183 406100372 +9182 213830783 +9181 1162322143 +9180 633742410 +9179 1784451367 +9178 1567466683 +9177 86998414 +9176 2125345636 +9175 123523421 +9174 123140643 +9173 1098354172 +9172 1380081279 +9171 1826025942 +9170 1095506925 +9169 1853198694 +9168 130300632 +9167 724781434 +9166 1112315945 +9165 2011100143 +9164 1401170273 +9163 1586300636 +9162 595248554 +9161 1898354283 +9160 1197446917 +9159 583537756 +9158 819614054 +9157 2116847987 +9156 1884017335 +9155 1506762623 +9154 356904486 +9153 705003148 +9152 1919841610 +9151 576863064 +9150 1742339108 +9149 546743995 +9148 1806589379 +9147 1443943261 +9146 2111341419 +9145 1026991464 +9144 890925790 +9143 444598348 +9142 2847247 +9141 1674366233 +9140 1695725310 +9139 370725491 +9138 740882748 +9137 266684137 +9136 1471094808 +9135 1673498957 +9134 1415851589 +9133 1650299638 +9132 388853719 +9131 11710797 +9130 1078740229 +9129 1228082578 +9128 847004069 +9127 1460335079 +9126 1759943500 +9125 1179014187 +9124 1734404660 +9123 1927525070 +9122 1110147688 +9121 1373097615 +9120 917757333 +9119 298395847 +9118 582886224 +9117 779597915 +9116 553017471 +9115 1666743071 +9114 1024144217 +9113 1364043204 +9112 896356686 +9111 1779605404 +9110 933483485 +9109 1429041173 +9108 1047114330 +9107 1214867439 +9106 998316196 +9105 1968278818 +9104 1284645238 +9103 1404140791 +9102 571559409 +9101 1308254789 +9100 1312190376 +9099 1765888797 +9098 1615622725 +9097 1815473530 +9096 1873414067 +9095 1979902078 +9094 68866499 +9093 361307045 +9092 1009767736 +9091 811751841 +9090 790211391 +9089 138159418 +9088 1892862023 +9087 1063626801 +9086 1902937346 +9085 1336457915 +9084 770386385 +9083 1392022461 +9082 430559719 +9081 1614799160 +9080 732491073 +9079 1866099694 +9078 430724977 +9077 1226319160 +9076 2077705848 +9075 1741659052 +9074 1396719409 +9073 2123874097 +9072 91950415 +9071 953154259 +9070 1840115711 +9069 1644200494 +9068 2039958378 +9067 1783204295 +9066 1746607031 +9065 1512107021 +9064 970134342 +9063 1404598306 +9062 1718579302 +9061 871608318 +9060 1066373465 +9059 1874068238 +9058 382705720 +9057 556404108 +9056 293240416 +9055 510914885 +9054 905898195 +9053 1303070872 +9052 659531387 +9051 711943673 +9050 1184074183 +9049 1653655561 +9048 1935877493 +9047 836549573 +9046 1977083398 +9045 2101315399 +9044 1649708637 +9043 443565150 +9042 283758386 +9041 595233568 +9040 1060679529 +9039 56911416 +9038 2045077111 +9037 527851357 +9036 813069953 +9035 342008725 +9034 1941011367 +9033 98526024 +9032 338224840 +9031 1991994712 +9030 488902597 +9029 509969357 +9028 1580827822 +9027 2019274483 +9026 1797989561 +9025 1137653191 +9024 1998867145 +9023 193954522 +9022 118996689 +9021 1153359474 +9020 923549828 +9019 347524610 +9018 1824055811 +9017 1982045742 +9016 1334324583 +9015 1533518248 +9014 1817557013 +9013 1054475069 +9012 1530369269 +9011 226846969 +9010 697640105 +9009 532828172 +9008 1391325111 +9007 1703068386 +9006 734323638 +9005 714543929 +9004 3783884 +9003 2096500302 +9002 1757107074 +9001 1975739131 +9000 411166890 +8999 617111762 +8998 859463444 +8997 443174630 +8996 20407338 +8995 1604035039 +8994 1018656502 +8993 845507671 +8992 1417888342 +8991 1918955727 +8990 1476787311 +8989 1088987733 +8988 1160683674 +8987 290537562 +8986 164488729 +8985 279849514 +8984 3148979 +8983 1590710043 +8982 356834964 +8981 997541097 +8980 983005506 +8979 1142055366 +8978 1945988182 +8977 676781182 +8976 1699284502 +8975 785306983 +8974 1104920502 +8973 175528401 +8972 1685333412 +8971 1139995312 +8970 1116275687 +8969 2115475908 +8968 596704424 +8967 1402912053 +8966 1572001776 +8965 1322383314 +8964 186146697 +8963 1247184422 +8962 1516204008 +8961 328900608 +8960 758272053 +8959 1186249748 +8958 924499004 +8957 880834160 +8956 287388583 +8955 721262334 +8954 2070498198 +8953 1153091530 +8952 607704537 +8951 1362263245 +8950 1199036563 +8949 306224323 +8948 1590254512 +8947 1160681198 +8946 1719344328 +8945 1523756101 +8944 1247457219 +8943 2112408838 +8942 1206736361 +8941 1717341152 +8940 543290888 +8939 1860847282 +8938 543474131 +8937 1421804757 +8936 1216765356 +8935 324817354 +8934 1953662954 +8933 2004729736 +8932 488912369 +8931 329954260 +8930 1551885252 +8929 2024921541 +8928 898861165 +8927 203236670 +8926 957819609 +8925 1281780700 +8924 113557796 +8923 708234953 +8922 2101538615 +8921 301480214 +8920 1919492381 +8919 38355364 +8918 734363643 +8917 66498411 +8916 2060707627 +8915 1754419138 +8914 317019739 +8913 1677599715 +8912 1569117949 +8911 1493372727 +8910 1173867020 +8909 1268969779 +8908 644081926 +8907 218656777 +8906 1615625451 +8905 1359519267 +8904 1983388632 +8903 1623708694 +8902 452844484 +8901 611474476 +8900 1578576742 +8899 1348648582 +8898 1067101931 +8897 1764564113 +8896 89678873 +8895 249584656 +8894 1327725733 +8893 1959561230 +8892 936226220 +8891 2063183251 +8890 1714600218 +8889 1852993969 +8888 125131385 +8887 1127428153 +8886 1896962320 +8885 383107911 +8884 185301188 +8883 971130660 +8882 503732695 +8881 300148170 +8880 849290800 +8879 955210243 +8878 1800827975 +8877 1432046307 +8876 382751793 +8875 2139400405 +8874 906674783 +8873 1371914156 +8872 45131951 +8871 1251679549 +8870 1691856193 +8869 1961496277 +8868 1258969709 +8867 817517275 +8866 436838380 +8865 277601291 +8864 1460842084 +8863 1412026130 +8862 244961012 +8861 1230715898 +8860 1938051865 +8859 587172065 +8858 2103515297 +8857 1889507122 +8856 942126965 +8855 925831659 +8854 2026858864 +8853 2032636666 +8852 121839860 +8851 1696006100 +8850 646803843 +8849 1564728141 +8848 572458450 +8847 1808911218 +8846 525371523 +8845 1158321285 +8844 2094268454 +8843 1802478882 +8842 1827541611 +8841 231119322 +8840 2140193488 +8839 874338918 +8838 1524657897 +8837 981368418 +8836 1504158838 +8835 1172295898 +8834 32640279 +8833 230126186 +8832 1621457912 +8831 1805272595 +8830 1274684249 +8829 48544743 +8828 1792528748 +8827 1177683638 +8826 2010131905 +8825 1056973947 +8824 803991799 +8823 330852764 +8822 1385832823 +8821 704595366 +8820 1123547650 +8819 985376273 +8818 1039356618 +8817 1561620813 +8816 1862126412 +8815 870376289 +8814 1478263322 +8813 1863149132 +8812 1809769041 +8811 953202693 +8810 853945072 +8809 1158825070 +8808 1517663727 +8807 352361999 +8806 948728139 +8805 1274032652 +8804 1698321633 +8803 374851332 +8802 1102925585 +8801 1572913169 +8800 12743847 +8799 97000611 +8798 185896486 +8797 735554801 +8796 373691838 +8795 1679279141 +8794 1818624772 +8793 99396433 +8792 1354788762 +8791 400456550 +8790 1812722396 +8789 1709410485 +8788 1270733509 +8787 168980328 +8786 83357491 +8785 2146460928 +8784 1208090896 +8783 525060629 +8782 1009204059 +8781 650943971 +8780 1583022613 +8779 501583073 +8778 210096931 +8777 243631075 +8776 801524014 +8775 573876807 +8774 171107067 +8773 125408464 +8772 362107485 +8771 1005924974 +8770 1387016683 +8769 1424672694 +8768 1870792420 +8767 654100993 +8766 1064413677 +8765 274295405 +8764 324490378 +8763 1418168222 +8762 434157684 +8761 1792861925 +8760 1277206689 +8759 1643742068 +8758 1626052994 +8757 1271756229 +8756 1108373080 +8755 1705780510 +8754 1137256868 +8753 557146925 +8752 1089521663 +8751 507620986 +8750 440847039 +8749 1339391538 +8748 1847542707 +8747 1783703772 +8746 72524007 +8745 676115549 +8744 211769322 +8743 1312665741 +8742 885875429 +8741 1084918439 +8740 1282616201 +8739 732915690 +8738 360259017 +8737 1596497015 +8736 329610614 +8735 1793729103 +8734 1987621369 +8733 679112101 +8732 140961533 +8731 937899264 +8730 166808931 +8729 5450460 +8728 535368987 +8727 2067756132 +8726 134499360 +8725 551226155 +8724 616258846 +8723 629635882 +8722 116299885 +8721 1897613773 +8720 807561927 +8719 804626915 +8718 1266867531 +8717 1171427157 +8716 1571934450 +8715 907341914 +8714 1937723768 +8713 1274334531 +8712 30049540 +8711 152959739 +8710 724659422 +8709 1833602834 +8708 403305075 +8707 714013562 +8706 1756359294 +8705 1797982161 +8704 1652767570 +8703 1049722104 +8702 512303169 +8701 135511073 +8700 402530277 +8699 246536447 +8698 2018434747 +8697 2131626480 +8696 1451497285 +8695 1652347126 +8694 434926270 +8693 866128721 +8692 1969557602 +8691 1459156618 +8690 630746242 +8689 1783618418 +8688 1380176112 +8687 359525617 +8686 1381187037 +8685 297599919 +8684 877292374 +8683 1784764028 +8682 549675109 +8681 343930353 +8680 1897138312 +8679 10645860 +8678 77243540 +8677 752806562 +8676 1208729640 +8675 706637189 +8674 1285678992 +8673 1517256497 +8672 647191827 +8671 265766722 +8670 264559973 +8669 418387445 +8668 942522810 +8667 366087621 +8666 1696700210 +8665 585368564 +8664 1830273172 +8663 1123253299 +8662 235382479 +8661 185939184 +8660 78980506 +8659 271220625 +8658 402431380 +8657 1082576193 +8656 1629716891 +8655 1743906657 +8654 1895408458 +8653 533362020 +8652 2035109364 +8651 539029249 +8650 266686813 +8649 1144331750 +8648 949399868 +8647 1518089999 +8646 1614611218 +8645 1838956791 +8644 59445362 +8643 1019912270 +8642 1252696523 +8641 228804382 +8640 1470727560 +8639 2045956000 +8638 869170883 +8637 357154246 +8636 683298097 +8635 573446910 +8634 349986084 +8633 1644333987 +8632 1044272793 +8631 2111645502 +8630 1930991452 +8629 1143887961 +8628 788987382 +8627 806008371 +8626 1334651382 +8625 1096354870 +8624 1856280940 +8623 1356379209 +8622 266675207 +8621 890777614 +8620 1737113029 +8619 896080462 +8618 1677204180 +8617 1257926725 +8616 1458644637 +8615 594698948 +8614 586260267 +8613 1978124627 +8612 1696668358 +8611 1354224171 +8610 1507117147 +8609 1113573314 +8608 1362657903 +8607 295723972 +8606 7168161 +8605 1186447757 +8604 1676657765 +8603 385824230 +8602 1860826183 +8601 2047868480 +8600 1322658120 +8599 1124983080 +8598 1956720226 +8597 1840116159 +8596 1097211079 +8595 2125755821 +8594 829679663 +8593 965503326 +8592 1766749828 +8591 1518078393 +8590 1361057082 +8589 479186304 +8588 1584919473 +8587 1082505232 +8586 671666457 +8585 1628003657 +8584 1045514238 +8583 1379519744 +8582 471007480 +8581 583095044 +8580 2139049915 +8579 1211393175 +8578 1106405152 +8577 176210146 +8576 766549855 +8575 1768827579 +8574 1473105222 +8573 1776272932 +8572 1210649757 +8571 735843103 +8570 91148254 +8569 1630025609 +8568 27772001 +8567 1978448053 +8566 1010436496 +8565 131707753 +8564 359005992 +8563 1459084917 +8562 1751929891 +8561 1287563524 +8560 2080642568 +8559 278551850 +8558 1955003494 +8557 2104399463 +8556 36990994 +8555 1439630361 +8554 1156996177 +8553 462419194 +8552 1387953477 +8551 1407097953 +8550 1624173539 +8549 1962839769 +8548 444843319 +8547 1485061221 +8546 850588572 +8545 1137760571 +8544 558177822 +8543 737262119 +8542 1685124678 +8541 1728107796 +8540 708071101 +8539 260183848 +8538 619589112 +8537 2043547896 +8536 1619442061 +8535 1698835227 +8534 527261509 +8533 1218926116 +8532 1525925997 +8531 1473378041 +8530 1480043678 +8529 2123726753 +8528 241560856 +8527 515373133 +8526 947403286 +8525 1722055448 +8524 51676884 +8523 1897381872 +8522 985729302 +8521 1572597355 +8520 962254633 +8519 139112318 +8518 1112251197 +8517 1454566396 +8516 926883399 +8515 113326453 +8514 1600119540 +8513 977553673 +8512 29191017 +8511 1424940830 +8510 1108518684 +8509 812006853 +8508 788225435 +8507 1068237533 +8506 1516286387 +8505 400515945 +8504 172909230 +8503 1201367116 +8502 1886366086 +8501 1549682892 +8500 1231817184 +8499 964670544 +8498 1176323467 +8497 666989056 +8496 463696249 +8495 1197505061 +8494 736326145 +8493 626563176 +8492 935127239 +8491 846616984 +8490 460346158 +8489 1655171885 +8488 1359712567 +8487 998924744 +8486 2001930504 +8485 2096813373 +8484 84135435 +8483 175178710 +8482 2016518637 +8481 1364667812 +8480 636715394 +8479 40281150 +8478 1443204114 +8477 387709490 +8476 895328303 +8475 314919270 +8474 661633507 +8473 770709986 +8472 2117033580 +8471 921695541 +8470 373359425 +8469 564828128 +8468 500974295 +8467 2126302053 +8466 2078146559 +8465 1984616721 +8464 262377822 +8463 2037192809 +8462 166217018 +8461 1427439002 +8460 1634388064 +8459 1608905061 +8458 1800725029 +8457 1410382842 +8456 914789309 +8455 1826751793 +8454 80294736 +8453 866951271 +8452 1685946964 +8451 1976237487 +8450 2068947346 +8449 249005904 +8448 1292436495 +8447 1128284843 +8446 1873559631 +8445 124618317 +8444 345369338 +8443 1887421613 +8442 397350561 +8441 1552205452 +8440 420721246 +8439 394541019 +8438 634165217 +8437 663841222 +8436 1863924231 +8435 40953749 +8434 1818399702 +8433 982422468 +8432 402804745 +8431 704795605 +8430 1774197621 +8429 224005222 +8428 694115752 +8427 2121456883 +8426 1330088106 +8425 47838038 +8424 140804829 +8423 251540897 +8422 945487572 +8421 1436941060 +8420 683800992 +8419 940662503 +8418 522929920 +8417 1167818177 +8416 782915505 +8415 2133621666 +8414 1874751404 +8413 940647534 +8412 1466700367 +8411 2809541 +8410 918040235 +8409 1904363672 +8408 678100436 +8407 593211467 +8406 992925167 +8405 881501762 +8404 1785632652 +8403 1113604097 +8402 1355708495 +8401 178799522 +8400 10679852 +8399 1800224385 +8398 1041400764 +8397 646277714 +8396 1980652054 +8395 1078547209 +8394 1249834113 +8393 851347417 +8392 1715223553 +8391 4825069 +8390 914011139 +8389 1663466462 +8388 157746998 +8387 536791902 +8386 1440550421 +8385 1989751618 +8384 666921299 +8383 1871941863 +8382 22607299 +8381 1709820342 +8380 1472192753 +8379 324828767 +8378 911438505 +8377 1944082322 +8376 955062463 +8375 2026804718 +8374 1673276915 +8373 1606833130 +8372 1102924245 +8371 1702967758 +8370 1284882406 +8369 1511885786 +8368 1967055979 +8367 2110337203 +8366 1543927249 +8365 1129304636 +8364 1510807304 +8363 1245009044 +8362 2084819926 +8361 51757090 +8360 1994561719 +8359 377219237 +8358 222916041 +8357 315479027 +8356 2017354251 +8355 1716092206 +8354 1967144319 +8353 1104584604 +8352 399749110 +8351 1845262180 +8350 798381837 +8349 1675594079 +8348 1517249952 +8347 1032117435 +8346 270805407 +8345 1495712981 +8344 923880473 +8343 2117792805 +8342 321950724 +8341 1738522107 +8340 1883395426 +8339 1322028850 +8338 2115442185 +8337 837751343 +8336 599529899 +8335 298918205 +8334 1191968358 +8333 1459050213 +8332 1397930972 +8331 1707600689 +8330 1976324697 +8329 1679082692 +8328 507348633 +8327 654307483 +8326 495818356 +8325 912769647 +8324 1316343096 +8323 121882139 +8322 306202767 +8321 871638679 +8320 328012227 +8319 1913748050 +8318 1404788672 +8317 21536971 +8316 108236962 +8315 300496250 +8314 1173762257 +8313 1332842014 +8312 234397378 +8311 1147405521 +8310 1770563570 +8309 1045644083 +8308 722498951 +8307 1816523980 +8306 1793266632 +8305 1287963334 +8304 1048470880 +8303 1631851317 +8302 1630209164 +8301 1866331928 +8300 1200252055 +8299 1322017213 +8298 1183264335 +8297 1742062634 +8296 1485448035 +8295 373936217 +8294 606566880 +8293 444704417 +8292 1941353559 +8291 539938364 +8290 1614333655 +8289 306475256 +8288 1805511088 +8287 1104292422 +8286 995258362 +8285 922878596 +8284 66098871 +8283 26356735 +8282 1709762092 +8281 1336236943 +8280 424906570 +8279 2101523238 +8278 1399861099 +8277 1582019265 +8276 768053099 +8275 161415315 +8274 1805237817 +8273 1329622600 +8272 431599262 +8271 308191951 +8270 683067593 +8269 1605673069 +8268 1984052826 +8267 809328118 +8266 1135495754 +8265 1040743618 +8264 580066306 +8263 66628515 +8262 977854410 +8261 1634878303 +8260 881910924 +8259 510041233 +8258 1458700541 +8257 882632492 +8256 1038193550 +8255 968901627 +8254 1360600152 +8253 877345576 +8252 1748933813 +8251 1755722502 +8250 2083859492 +8249 990370953 +8248 1333470138 +8247 1238445784 +8246 1924265095 +8245 1585914147 +8244 1877299701 +8243 1497045866 +8242 646555007 +8241 973409841 +8240 471622773 +8239 2021223123 +8238 470177314 +8237 943309207 +8236 229261812 +8235 1068867239 +8234 62889208 +8233 1092671650 +8232 1332201239 +8231 467813177 +8230 176177762 +8229 2146762079 +8228 1619331330 +8227 489798914 +8226 1669515988 +8225 160847974 +8224 1367451462 +8223 1752361298 +8222 940969732 +8221 758562859 +8220 422252363 +8219 845413708 +8218 1213589506 +8217 1895039639 +8216 1508629731 +8215 427219229 +8214 939359140 +8213 903889860 +8212 1025423093 +8211 772815532 +8210 503232526 +8209 1675797213 +8208 1791961311 +8207 1548793723 +8206 880419999 +8205 1284073809 +8204 1884149647 +8203 1742559679 +8202 916493888 +8201 1332922808 +8200 995965494 +8199 1833862495 +8198 477246091 +8197 1458483356 +8196 1269831100 +8195 2064638338 +8194 1367361889 +8193 608888602 +8192 1330108934 +8191 95556024 +8190 1692457001 +8189 674696372 +8188 1484267625 +8187 786370277 +8186 955680498 +8185 604739871 +8184 1549279783 +8183 166543608 +8182 400657333 +8181 1497109528 +8180 1128337869 +8179 1101922451 +8178 795377214 +8177 507887501 +8176 1812127724 +8175 1285343967 +8174 367579921 +8173 551226839 +8172 746594185 +8171 1230115041 +8170 855676717 +8169 1684965786 +8168 564031395 +8167 560091400 +8166 91121467 +8165 660942498 +8164 734529404 +8163 1271805865 +8162 1063915249 +8161 655412562 +8160 758772047 +8159 906086724 +8158 1866499522 +8157 879527754 +8156 1384574141 +8155 789136890 +8154 204082537 +8153 52170255 +8152 1185689387 +8151 1446218530 +8150 701732313 +8149 620450367 +8148 1437278375 +8147 1657516895 +8146 140307580 +8145 1260900884 +8144 538749782 +8143 1284948528 +8142 1843033770 +8141 1209112047 +8140 666083646 +8139 295585316 +8138 1593844319 +8137 2050572545 +8136 1973045644 +8135 966799250 +8134 1744510897 +8133 79116842 +8132 513033817 +8131 157828524 +8130 936396688 +8129 2026727941 +8128 1668996231 +8127 1077362632 +8126 675445216 +8125 1332403886 +8124 1750931150 +8123 905347655 +8122 1497921590 +8121 565239020 +8120 8940155 +8119 1191699066 +8118 480142787 +8117 176377490 +8116 1118767112 +8115 1002842700 +8114 1565350762 +8113 1477121383 +8112 618864882 +8111 1547448454 +8110 1762751376 +8109 762994749 +8108 470023320 +8107 627045069 +8106 306061648 +8105 1893928802 +8104 453765432 +8103 1586682372 +8102 1290203802 +8101 633789524 +8100 636315941 +8099 2006517704 +8098 1351282725 +8097 336592345 +8096 1473915129 +8095 1917581209 +8094 1981965944 +8093 1185692130 +8092 896407499 +8091 306222523 +8090 85096233 +8089 1980046313 +8088 72931954 +8087 1624783734 +8086 758510376 +8085 1789129377 +8084 383977818 +8083 17902308 +8082 1861853655 +8081 2003353781 +8080 1077425134 +8079 1135706307 +8078 456933101 +8077 723578165 +8076 173279636 +8075 866862923 +8074 603725000 +8073 1967459556 +8072 950366431 +8071 1431169746 +8070 1429990447 +8069 299723596 +8068 532602574 +8067 1581185163 +8066 502110049 +8065 288222999 +8064 1021173710 +8063 1675743420 +8062 1100595897 +8061 1063844834 +8060 233290569 +8059 607796146 +8058 1221535936 +8057 431286225 +8056 1240805916 +8055 740608068 +8054 2074759369 +8053 528107685 +8052 1087960822 +8051 726147348 +8050 1546420680 +8049 353846968 +8048 962426670 +8047 1737553825 +8046 119853165 +8045 353303728 +8044 2063980140 +8043 1320038902 +8042 537469109 +8041 650642834 +8040 898567171 +8039 1996288931 +8038 1945097195 +8037 244379575 +8036 560011453 +8035 973850276 +8034 1335110749 +8033 2104812523 +8032 1442452851 +8031 492799751 +8030 1989792546 +8029 1949487992 +8028 1514473878 +8027 480927868 +8026 504010503 +8025 712698230 +8024 1800130894 +8023 1348612021 +8022 1129170653 +8021 734113853 +8020 1911204326 +8019 1956350502 +8018 233993803 +8017 609122942 +8016 1821057333 +8015 947297910 +8014 1963318266 +8013 1413337306 +8012 421471731 +8011 688663826 +8010 853029287 +8009 654187596 +8008 1436277478 +8007 971246919 +8006 1056752474 +8005 602682578 +8004 1678881073 +8003 842310998 +8002 115019977 +8001 1640448506 +8000 1125809520 +7999 1508864678 +7998 1445477489 +7997 801775648 +7996 828280621 +7995 1302882130 +7994 1731011225 +7993 1066017041 +7992 1584891343 +7991 1320303799 +7990 500120050 +7989 1302081383 +7988 135293169 +7987 1434179541 +7986 793288324 +7985 407720027 +7984 525826179 +7983 1274654440 +7982 560308019 +7981 1914767783 +7980 1399869996 +7979 2029266016 +7978 1744918770 +7977 833594900 +7976 1439849493 +7975 214441475 +7974 487662600 +7973 38432567 +7972 1863985126 +7971 753638947 +7970 194971017 +7969 324033872 +7968 680584056 +7967 142595358 +7966 1218248071 +7965 1909747228 +7964 1865474435 +7963 410707426 +7962 565896991 +7961 282809959 +7960 1185010629 +7959 1213424157 +7958 508793059 +7957 1875056790 +7956 908353361 +7955 1666117531 +7954 1994895656 +7953 758542044 +7952 2022268092 +7951 678525651 +7950 169849013 +7949 566275096 +7948 589416522 +7947 1530477294 +7946 345932299 +7945 1401416926 +7944 497939997 +7943 1881507301 +7942 1990945197 +7941 1539951253 +7940 73054891 +7939 52375659 +7938 1253269449 +7937 918320476 +7936 424604571 +7935 807540645 +7934 1343850237 +7933 1582664476 +7932 1373180444 +7931 1499956482 +7930 1921500548 +7929 1457437487 +7928 305070795 +7927 990159176 +7926 2027644782 +7925 149811317 +7924 1791333087 +7923 1316370005 +7922 588693031 +7921 1455992996 +7920 89109128 +7919 786855366 +7918 220342796 +7917 1335483244 +7916 1032537297 +7915 611908646 +7914 1557955377 +7913 1105472392 +7912 1808452410 +7911 1938569538 +7910 286681804 +7909 1302218063 +7908 1775254736 +7907 445728804 +7906 1721953886 +7905 989423743 +7904 1581843848 +7903 1991377403 +7902 1808647576 +7901 2063226605 +7900 1194885686 +7899 931341372 +7898 1577276352 +7897 155259478 +7896 1346309737 +7895 711274777 +7894 1708601933 +7893 335340090 +7892 1227260876 +7891 1949321313 +7890 1235650200 +7889 901109532 +7888 1901801717 +7887 1755917798 +7886 1925011515 +7885 2074548553 +7884 950939884 +7883 1766869486 +7882 818790588 +7881 506234347 +7880 163314802 +7879 1988436647 +7878 1727747824 +7877 785830993 +7876 1011368604 +7875 1878060131 +7874 1328259815 +7873 1666100891 +7872 796491717 +7871 877306204 +7870 485950253 +7869 1039626208 +7868 1732515283 +7867 866001575 +7866 594141193 +7865 1010969646 +7864 1631497549 +7863 1906764268 +7862 1247173538 +7861 326151344 +7860 47519595 +7859 1627216050 +7858 1123581665 +7857 1974736812 +7856 804977913 +7855 158142028 +7854 1255757965 +7853 444705537 +7852 1603554684 +7851 977837588 +7850 925970170 +7849 1524967457 +7848 977068043 +7847 1997171341 +7846 1605054826 +7845 1492751361 +7844 1081568414 +7843 450953611 +7842 1180150638 +7841 1904349157 +7840 1292274569 +7839 1767432326 +7838 445485015 +7837 721545636 +7836 1381987674 +7835 834860572 +7834 1911279756 +7833 1305346205 +7832 1859244673 +7831 1767441136 +7830 1350053326 +7829 220266431 +7828 822238136 +7827 965439637 +7826 718978847 +7825 360272376 +7824 702070992 +7823 277920376 +7822 1666219015 +7821 78587226 +7820 769545 +7819 1076282477 +7818 2067396279 +7817 1631800330 +7816 915602927 +7815 1154101215 +7814 312600723 +7813 1324702905 +7812 1306162690 +7811 1560201960 +7810 1458864142 +7809 570728932 +7808 385444652 +7807 1758108090 +7806 957749528 +7805 76641469 +7804 1123099547 +7803 143838619 +7802 2102776526 +7801 1638978242 +7800 945203000 +7799 384613689 +7798 1648771231 +7797 461965760 +7796 263368644 +7795 441058471 +7794 841537009 +7793 623483766 +7792 277150831 +7791 589936538 +7790 158674595 +7789 516452862 +7788 160679549 +7787 913295064 +7786 1319199607 +7785 1738383670 +7784 1995422173 +7783 899882411 +7782 2013322411 +7781 735433757 +7780 1174757308 +7779 1848239699 +7778 1760463052 +7777 308803183 +7776 635008543 +7775 813910909 +7774 121348590 +7773 1631604953 +7772 1346119267 +7771 1718162837 +7770 2137690658 +7769 483237239 +7768 121245045 +7767 1207712760 +7766 1767912399 +7765 1787368526 +7764 163907639 +7763 251600471 +7762 464809171 +7761 1908181617 +7760 429256988 +7759 1392863178 +7758 1344736903 +7757 569779527 +7756 1065356539 +7755 419317196 +7754 1872544907 +7753 1259988415 +7752 1872608751 +7751 165082711 +7750 1122454353 +7749 865954125 +7748 1213231156 +7747 946552143 +7746 187454592 +7745 1150887237 +7744 1615275289 +7743 550669401 +7742 1641397943 +7741 862882028 +7740 1596917792 +7739 929977898 +7738 862808488 +7737 481360166 +7736 1043805121 +7735 1516311928 +7734 1322559355 +7733 403209670 +7732 1969827130 +7731 1219429640 +7730 563444714 +7729 2006961109 +7728 327506639 +7727 925419706 +7726 844718267 +7725 1952851772 +7724 694192093 +7723 1707462196 +7722 137534062 +7721 1006654626 +7720 1099335203 +7719 175902210 +7718 678499532 +7717 62343919 +7716 1478760501 +7715 1784268839 +7714 1656972942 +7713 752393261 +7712 1101235257 +7711 711420045 +7710 73540 +7709 1115557625 +7708 2033656425 +7707 1493980207 +7706 1306284459 +7705 640595450 +7704 1693968446 +7703 103129715 +7702 1987248604 +7701 2110349669 +7700 891923001 +7699 1785508655 +7698 1162242842 +7697 522138515 +7696 231227613 +7695 1284739719 +7694 1815317710 +7693 1835021115 +7692 608126993 +7691 2109115499 +7690 328155093 +7689 1036991284 +7688 844625357 +7687 1041714341 +7686 552854624 +7685 726367240 +7684 683033581 +7683 945552897 +7682 752319721 +7681 2133161280 +7680 825247268 +7679 653576980 +7678 1956756814 +7677 1393060974 +7676 1947495409 +7675 1203154744 +7674 800830494 +7673 1731102425 +7672 1358690361 +7671 201739949 +7670 948106827 +7669 369784486 +7668 1554281042 +7667 2024986770 +7666 854304453 +7665 543690145 +7664 676612726 +7663 1853685858 +7662 1506866022 +7661 1718619357 +7660 1264490142 +7659 1433924400 +7658 484136659 +7657 118258117 +7656 358680760 +7655 1754785375 +7654 2121531166 +7653 697355949 +7652 120305629 +7651 98742741 +7650 176404465 +7649 1579669941 +7648 853565219 +7647 753602070 +7646 592230480 +7645 216392984 +7644 1991948030 +7643 599090545 +7642 782995598 +7641 988905875 +7640 794942554 +7639 1070603704 +7638 1662963681 +7637 1010590897 +7636 1348374044 +7635 1148102242 +7634 1184307771 +7633 1105477017 +7632 589195716 +7631 72941622 +7630 1234482697 +7629 1146232025 +7628 1075243640 +7627 876834932 +7626 144210598 +7625 1808808458 +7624 1634479745 +7623 2022788425 +7622 520951484 +7621 688119336 +7620 1392661170 +7619 1570286043 +7618 987439461 +7617 637172234 +7616 909137688 +7615 2140623583 +7614 1580881034 +7613 1003042155 +7612 1951631638 +7611 1859875541 +7610 1473425841 +7609 1931835305 +7608 1869713308 +7607 514861439 +7606 1973766773 +7605 242897026 +7604 558906526 +7603 1111366149 +7602 2018477968 +7601 1590447338 +7600 1145181630 +7599 357647765 +7598 1002021427 +7597 1413918829 +7596 1389838835 +7595 268905821 +7594 1287856974 +7593 946360409 +7592 630127255 +7591 1098149089 +7590 1848163523 +7589 755488935 +7588 661148355 +7587 994299525 +7586 1203774848 +7585 2053579180 +7584 188991945 +7583 1868489141 +7582 1677099962 +7581 19796333 +7580 2137645881 +7579 958564402 +7578 2105552180 +7577 1626816282 +7576 2103438560 +7575 862400624 +7574 371902706 +7573 1115942836 +7572 2113668167 +7571 1660830203 +7570 588425911 +7569 1878746448 +7568 1115292578 +7567 733115606 +7566 126061855 +7565 443478425 +7564 1786262213 +7563 189707885 +7562 1245680534 +7561 2022121968 +7560 437000734 +7559 853863997 +7558 1699197735 +7557 755052822 +7556 805307580 +7555 1482769355 +7554 376479218 +7553 169195612 +7552 1878326908 +7551 718535559 +7550 61727801 +7549 510829599 +7548 1002609490 +7547 1243151556 +7546 1254913575 +7545 987495724 +7544 896216104 +7543 858556151 +7542 527516924 +7541 234921719 +7540 545537625 +7539 2002793953 +7538 1752684593 +7537 671814152 +7536 1094337040 +7535 2083837617 +7534 1345281539 +7533 1911623893 +7532 1900190799 +7531 391816537 +7530 322924232 +7529 1829431559 +7528 48556417 +7527 216428380 +7526 378573604 +7525 636111968 +7524 1751926095 +7523 1805427307 +7522 107467811 +7521 1367497309 +7520 1863409717 +7519 966059893 +7518 1403399671 +7517 15113765 +7516 346935451 +7515 396357424 +7514 459978800 +7513 661294385 +7512 313018526 +7511 672206619 +7510 629720773 +7509 2021207120 +7508 908456913 +7507 1816330624 +7506 1474016261 +7505 1330196795 +7504 183646818 +7503 953465002 +7502 1588699661 +7501 70759240 +7500 343260120 +7499 106495852 +7498 1450857955 +7497 1559928096 +7496 611985933 +7495 720629945 +7494 528644157 +7493 384428786 +7492 2089501237 +7491 1288891566 +7490 2111581285 +7489 1848295952 +7488 619124441 +7487 1007042247 +7486 1702618613 +7485 1833124714 +7484 83338897 +7483 1935255829 +7482 31573612 +7481 439295054 +7480 1911233354 +7479 960873797 +7478 547190859 +7477 1725743766 +7476 1632683806 +7475 520551259 +7474 1888980782 +7473 112887578 +7472 610204882 +7471 1482203809 +7470 767384932 +7469 930815671 +7468 1641993566 +7467 730228010 +7466 1031283939 +7465 227557147 +7464 778612355 +7463 1387236239 +7462 420331148 +7461 241205285 +7460 669767124 +7459 1104539038 +7458 145677338 +7457 933483375 +7456 923703350 +7455 1914846432 +7454 1801551102 +7453 1791527491 +7452 24022475 +7451 1218183462 +7450 2039587843 +7449 185489588 +7448 1475673639 +7447 26639599 +7446 1984246632 +7445 1519796228 +7444 2057830025 +7443 406776973 +7442 1492986293 +7441 1826872858 +7440 1987693890 +7439 37156922 +7438 2047015380 +7437 1414436419 +7436 2099099303 +7435 1791531347 +7434 1954709647 +7433 537407070 +7432 717469115 +7431 1463275758 +7430 95527947 +7429 1883767397 +7428 180835688 +7427 378314554 +7426 1279415921 +7425 1279659506 +7424 1890823957 +7423 583367639 +7422 1899423296 +7421 1986016535 +7420 1889993471 +7419 2012948243 +7418 348726604 +7417 2103361059 +7416 116293222 +7415 1577469659 +7414 26809934 +7413 230957167 +7412 566566730 +7411 1455829371 +7410 1927341126 +7409 573257471 +7408 85541267 +7407 255484033 +7406 1607210420 +7405 1561692233 +7404 1074062232 +7403 491433888 +7402 441879123 +7401 981185366 +7400 1282440070 +7399 1864697041 +7398 604351475 +7397 1048659829 +7396 634974244 +7395 696048282 +7394 1527719858 +7393 2052291070 +7392 840857816 +7391 2033958701 +7390 1637289931 +7389 1934116059 +7388 1896655021 +7387 918740593 +7386 2076551125 +7385 2032819703 +7384 1010902928 +7383 718464211 +7382 451099689 +7381 2140792907 +7380 1370288104 +7379 1671857093 +7378 1113530699 +7377 671332682 +7376 1328905448 +7375 1115776531 +7374 1119813110 +7373 92876866 +7372 1356477466 +7371 724665730 +7370 376833890 +7369 233780241 +7368 1229722796 +7367 2055786841 +7366 1668423619 +7365 730166822 +7364 2002674113 +7363 1641244805 +7362 415001139 +7361 1054225405 +7360 137303679 +7359 718549338 +7358 2005048582 +7357 2011318966 +7356 2055321312 +7355 1358086914 +7354 1581720014 +7353 1017593669 +7352 1495659754 +7351 926726244 +7350 1027262207 +7349 698955422 +7348 342951644 +7347 2145237816 +7346 1699003220 +7345 1236028582 +7344 1906782713 +7343 395147380 +7342 1863526624 +7341 1122697225 +7340 1642426581 +7339 468530697 +7338 712840269 +7337 499555974 +7336 53112728 +7335 27178814 +7334 315165682 +7333 948448708 +7332 1503941125 +7331 1843935449 +7330 1196660470 +7329 273468361 +7328 810711673 +7327 646961668 +7326 429598952 +7325 1037727643 +7324 2009910807 +7323 654993770 +7322 2137815110 +7321 796704332 +7320 583774599 +7319 1029508039 +7318 1147435850 +7317 1254406710 +7316 238455102 +7315 1303855840 +7314 1519985606 +7313 784085488 +7312 900204446 +7311 1394995927 +7310 409856955 +7309 1142870607 +7308 415417969 +7307 685661455 +7306 184390292 +7305 1252147667 +7304 670721337 +7303 618713881 +7302 1899271886 +7301 1230472764 +7300 1033223776 +7299 549698802 +7298 1991353056 +7297 1920467678 +7296 784534509 +7295 1922088830 +7294 1047396181 +7293 1213206475 +7292 71219170 +7291 1108307070 +7290 1796752129 +7289 1476851537 +7288 791052937 +7287 1991063658 +7286 1881904752 +7285 1601853262 +7284 403651393 +7283 124989679 +7282 374228533 +7281 1904817487 +7280 979577958 +7279 1871679148 +7278 958480315 +7277 1310753949 +7276 14940118 +7275 1713160059 +7274 1500359429 +7273 1587732220 +7272 1732973753 +7271 1349573084 +7270 1386603356 +7269 1260239745 +7268 1912647941 +7267 69264226 +7266 873071497 +7265 1718811681 +7264 1850869660 +7263 2086572758 +7262 1563937994 +7261 741851281 +7260 317254133 +7259 1953172119 +7258 1742430432 +7257 1336683323 +7256 1587412265 +7255 1756915073 +7254 1227624729 +7253 646317554 +7252 1292895369 +7251 650033032 +7250 946337172 +7249 1816307656 +7248 1856739030 +7247 1392803904 +7246 1957878168 +7245 574691545 +7244 2127669954 +7243 150786345 +7242 201128864 +7241 472734007 +7240 1584408791 +7239 1317339130 +7238 387168248 +7237 193836259 +7236 365878214 +7235 933982387 +7234 154873687 +7233 1109018378 +7232 1769318625 +7231 1758249523 +7230 1146904497 +7229 1128054458 +7228 365759854 +7227 2132999007 +7226 109058594 +7225 941094711 +7224 464019704 +7223 577591696 +7222 1847464029 +7221 1624071360 +7220 940777650 +7219 1701016916 +7218 2005913136 +7217 1282047485 +7216 1412617598 +7215 1807091822 +7214 373562681 +7213 1654935946 +7212 713861202 +7211 1031273382 +7210 85565759 +7209 1390572531 +7208 951460916 +7207 1600669509 +7206 38962572 +7205 1404343483 +7204 1312147410 +7203 544107812 +7202 2109597529 +7201 641264166 +7200 1392489669 +7199 1161389138 +7198 1018995864 +7197 1572148791 +7196 1668979302 +7195 1678950545 +7194 1241114329 +7193 987431992 +7192 1784297694 +7191 146447113 +7190 1765641872 +7189 1806213813 +7188 288399318 +7187 198821314 +7186 908484804 +7185 1905165299 +7184 1093230620 +7183 1489772946 +7182 1569370187 +7181 1470772319 +7180 79812466 +7179 632379898 +7178 1351609959 +7177 1694601080 +7176 288522099 +7175 1642338407 +7174 1442229602 +7173 670883243 +7172 1299101791 +7171 948208391 +7170 1769751950 +7169 1967824526 +7168 1639893483 +7167 1487528967 +7166 331034461 +7165 681547310 +7164 2042136499 +7163 1094667216 +7162 1369273768 +7161 2125567529 +7160 2005531442 +7159 1566820558 +7158 897729009 +7157 530717667 +7156 1253074342 +7155 1566195505 +7154 335795112 +7153 1769941949 +7152 1409960480 +7151 936990288 +7150 119162359 +7149 532695034 +7148 343857799 +7147 1856755200 +7146 252371478 +7145 1765122503 +7144 343236616 +7143 494021210 +7142 1048614941 +7141 1478760913 +7140 1455798556 +7139 282222983 +7138 1636790064 +7137 958346173 +7136 1592876116 +7135 1383850893 +7134 1459757190 +7133 2064052617 +7132 1236619422 +7131 1949936858 +7130 1227838520 +7129 1474813775 +7128 313746216 +7127 1479017151 +7126 194922554 +7125 1630616041 +7124 156235025 +7123 1546288472 +7122 1650779589 +7121 877265446 +7120 593132489 +7119 409890807 +7118 280323555 +7117 726218944 +7116 1513518584 +7115 1905833916 +7114 716507562 +7113 1011959350 +7112 1185706302 +7111 766391958 +7110 1989454497 +7109 497452383 +7108 836830515 +7107 252939171 +7106 1646072630 +7105 1676307146 +7104 147231471 +7103 1657303980 +7102 836214097 +7101 1909289294 +7100 1636190642 +7099 1896305017 +7098 1279891221 +7097 830613823 +7096 1322782126 +7095 796117730 +7094 2127320099 +7093 1426453227 +7092 953155983 +7091 1240888782 +7090 596941890 +7089 2014397193 +7088 1043855871 +7087 521973287 +7086 9711382 +7085 501559233 +7084 720127613 +7083 2097599251 +7082 1169988501 +7081 688253919 +7080 2077045091 +7079 1736515325 +7078 998863400 +7077 1308007016 +7076 105707700 +7075 2136252298 +7074 840093049 +7073 385425824 +7072 21113338 +7071 1087392728 +7070 629398073 +7069 805576819 +7068 573522891 +7067 483773490 +7066 850777371 +7065 2043812546 +7064 1990445395 +7063 886431317 +7062 829511337 +7061 1086242438 +7060 197032910 +7059 74968603 +7058 2004685811 +7057 542296638 +7056 1949329322 +7055 59595778 +7054 1479054380 +7053 31873694 +7052 20554160 +7051 1580956824 +7050 1836874167 +7049 769038075 +7048 1630807625 +7047 1010094750 +7046 467913967 +7045 1867765524 +7044 2115138959 +7043 1900183969 +7042 1903511399 +7041 1363020167 +7040 513869837 +7039 145624583 +7038 2102283095 +7037 677193992 +7036 640811743 +7035 2111829702 +7034 1214301209 +7033 904202957 +7032 689398407 +7031 754542734 +7030 1229040275 +7029 1802219920 +7028 273122929 +7027 1945090032 +7026 1210725906 +7025 1917455628 +7024 39041618 +7023 2045581204 +7022 342483175 +7021 1398999733 +7020 2097632847 +7019 826779416 +7018 301124108 +7017 1910525749 +7016 1042439439 +7015 715213645 +7014 2111737773 +7013 752118792 +7012 1386314132 +7011 1757886816 +7010 1408220720 +7009 1984159492 +7008 1652296488 +7007 2137937041 +7006 1610376431 +7005 1884092433 +7004 1422431295 +7003 459758475 +7002 1822646330 +7001 1034662134 +7000 481419805 +6999 1431433890 +6998 591494014 +6997 503150949 +6996 1906048414 +6995 1312628350 +6994 1574972453 +6993 787525533 +6992 2095432005 +6991 1663187406 +6990 1097875625 +6989 187107098 +6988 1931823625 +6987 1733394110 +6986 1946271624 +6985 290320647 +6984 1476383161 +6983 353850957 +6982 1491381720 +6981 1549638288 +6980 105590328 +6979 1417767326 +6978 373783061 +6977 1915687702 +6976 715505746 +6975 1150617955 +6974 61446103 +6973 387769160 +6972 2125822318 +6971 391212440 +6970 443168120 +6969 2125752504 +6968 1672869124 +6967 1426349312 +6966 1075662144 +6965 1118522880 +6964 1364679993 +6963 2059268694 +6962 1837133556 +6961 1908324907 +6960 1878847429 +6959 1511965162 +6958 388319122 +6957 1641502978 +6956 257010949 +6955 1592420667 +6954 946422575 +6953 2074228521 +6952 248260629 +6951 73614393 +6950 1175855226 +6949 337386273 +6948 702261580 +6947 1370648754 +6946 1854241599 +6945 327736586 +6944 1172279285 +6943 1817717311 +6942 2092084688 +6941 69814 +6940 865826963 +6939 1164302455 +6938 1050090360 +6937 554346244 +6936 61669319 +6935 1163877097 +6934 1428872972 +6933 1603838734 +6932 180421265 +6931 325168394 +6930 1520005785 +6929 237344450 +6928 1254954213 +6927 943382103 +6926 695080403 +6925 330266076 +6924 1344160038 +6923 872808181 +6922 898373294 +6921 2058358003 +6920 1518836461 +6919 1952690120 +6918 630628322 +6917 374524994 +6916 198369469 +6915 36524288 +6914 383135545 +6913 1172209470 +6912 951890347 +6911 927782233 +6910 1097463102 +6909 311480719 +6908 1102633136 +6907 2033696910 +6906 1272956920 +6905 605314233 +6904 983455832 +6903 1103704578 +6902 83832949 +6901 2090560463 +6900 1217697829 +6899 576623682 +6898 1689747695 +6897 924688136 +6896 1746705713 +6895 1969755870 +6894 1579376430 +6893 1433285682 +6892 1501455368 +6891 1093166822 +6890 1427729681 +6889 1144311467 +6888 1754320651 +6887 594104033 +6886 2138873096 +6885 1173643646 +6884 1232117589 +6883 1602836960 +6882 74746368 +6881 640409628 +6880 1972632745 +6879 1211249840 +6878 1186007447 +6877 497318902 +6876 1050241078 +6875 169252342 +6874 521481284 +6873 1040379017 +6872 2033490397 +6871 1654692915 +6870 400812768 +6869 293009692 +6868 977401617 +6867 1867475473 +6866 1492795354 +6865 313420030 +6864 468300502 +6863 486209608 +6862 5556001 +6861 357143900 +6860 1486329818 +6859 833625648 +6858 1152922019 +6857 580677005 +6856 1509470092 +6855 536036136 +6854 1098897278 +6853 591707961 +6852 1777687863 +6851 1010980176 +6850 1601885828 +6849 1475313842 +6848 161008761 +6847 1016755105 +6846 2123321266 +6845 9862061 +6844 283245593 +6843 1014272017 +6842 639566249 +6841 1740480704 +6840 677291298 +6839 680820943 +6838 947697986 +6837 663981586 +6836 1399174971 +6835 1006585746 +6834 307864029 +6833 111156601 +6832 1147363437 +6831 1319414001 +6830 1351705529 +6829 905652813 +6828 1471639203 +6827 616885883 +6826 1629263374 +6825 917762131 +6824 905831920 +6823 87917102 +6822 1137305780 +6821 302374021 +6820 849971414 +6819 585130723 +6818 1499476224 +6817 151146700 +6816 733509512 +6815 1109049248 +6814 1517779460 +6813 690248536 +6812 336980719 +6811 2106228954 +6810 792782718 +6809 13309711 +6808 1429129620 +6807 2088595887 +6806 356117557 +6805 1288018369 +6804 2006705957 +6803 1135933676 +6802 906934720 +6801 241710624 +6800 1995258445 +6799 734819646 +6798 1423873087 +6797 553877072 +6796 1858537610 +6795 1541346272 +6794 1927939999 +6793 603457899 +6792 1385429336 +6791 552175057 +6790 950381444 +6789 698824714 +6788 1999104858 +6787 390426976 +6786 780850887 +6785 43260976 +6784 772068529 +6783 1559034154 +6782 2044949466 +6781 323671008 +6780 677099334 +6779 851670479 +6778 1804675802 +6777 141111250 +6776 81889930 +6775 1367667528 +6774 381083649 +6773 1764995333 +6772 1288158879 +6771 172115073 +6770 965321185 +6769 1441381373 +6768 1023765684 +6767 2030010463 +6766 773420721 +6765 1255079711 +6764 155916936 +6763 1375764941 +6762 1800560103 +6761 686604621 +6760 700553847 +6759 559954468 +6758 2065457475 +6757 1955843882 +6756 1765842095 +6755 1369300381 +6754 145795158 +6753 448397521 +6752 881934820 +6751 1193278987 +6750 666478853 +6749 535988083 +6748 769780548 +6747 437008274 +6746 1907511249 +6745 464378245 +6744 79508649 +6743 208968576 +6742 799674148 +6741 1994261153 +6740 1295833037 +6739 1082794370 +6738 667960652 +6737 1916169621 +6736 1874093527 +6735 1545139427 +6734 1602003256 +6733 1616795962 +6732 675211094 +6731 1240605634 +6730 768630794 +6729 892193612 +6728 941596021 +6727 696157094 +6726 1810048724 +6725 1317444574 +6724 487365560 +6723 1099999819 +6722 1929402315 +6721 345946737 +6720 423498438 +6719 229470579 +6718 775960482 +6717 305402303 +6716 357499624 +6715 1698542673 +6714 1812187745 +6713 232731144 +6712 1060619186 +6711 1864363426 +6710 1326300501 +6709 1527147064 +6708 1356184491 +6707 1270304873 +6706 314166365 +6705 257297564 +6704 869928333 +6703 361397621 +6702 848165168 +6701 1930501130 +6700 299009613 +6699 72473700 +6698 1229628536 +6697 1771635095 +6696 208791533 +6695 710048905 +6694 1535525906 +6693 141418823 +6692 676501380 +6691 1699931736 +6690 1717469902 +6689 118096135 +6688 2019454603 +6687 1224901457 +6686 640698205 +6685 124768480 +6684 637923486 +6683 2095307967 +6682 1053914291 +6681 1680955770 +6680 508178935 +6679 55995628 +6678 1212980699 +6677 1098886926 +6676 400376540 +6675 2100252391 +6674 1556616044 +6673 1086910851 +6672 62388008 +6671 775691467 +6670 700872594 +6669 674858165 +6668 2011165815 +6667 519579630 +6666 236109189 +6665 67372710 +6664 33547525 +6663 1983077818 +6662 571432569 +6661 558405245 +6660 1827960781 +6659 492568445 +6658 1624881578 +6657 1894686122 +6656 586977971 +6655 692873886 +6654 1218337837 +6653 1104451364 +6652 1587129032 +6651 997918663 +6650 467975070 +6649 1556775656 +6648 1803102736 +6647 1260211956 +6646 1689754530 +6645 1460949337 +6644 2037864383 +6643 780924577 +6642 386038257 +6641 1535013491 +6640 912009300 +6639 181292963 +6638 438748976 +6637 1943793105 +6636 486032105 +6635 400515018 +6634 1643423789 +6633 1622625928 +6632 155117037 +6631 78864124 +6630 1081007315 +6629 2080758306 +6628 2053074122 +6627 932007692 +6626 676348285 +6625 1630010254 +6624 1253228501 +6623 220419174 +6622 636476294 +6621 30353376 +6620 1342299575 +6619 1355246762 +6618 2014504774 +6617 342153399 +6616 1369831221 +6615 908829953 +6614 1074911080 +6613 502850892 +6612 2016398924 +6611 204745293 +6610 1096264514 +6609 1115699843 +6608 1842744506 +6607 38233958 +6606 300369316 +6605 1010889825 +6604 245397981 +6603 1564559665 +6602 541618613 +6601 221842379 +6600 173273650 +6599 148999623 +6598 1404410021 +6597 423063867 +6596 1826262838 +6595 455929110 +6594 993533960 +6593 1222875125 +6592 1025603247 +6591 1428713179 +6590 163332249 +6589 1000146176 +6588 2132899189 +6587 1105674821 +6586 1414725967 +6585 866980329 +6584 1039914676 +6583 870165786 +6582 1554070025 +6581 900699081 +6580 509484435 +6579 1058030556 +6578 815330527 +6577 831854680 +6576 1940319625 +6575 883293299 +6574 469271212 +6573 23555602 +6572 1391286015 +6571 392618990 +6570 964916005 +6569 1897693430 +6568 470220432 +6567 948480911 +6566 1577013555 +6565 603387713 +6564 1577809511 +6563 1712304429 +6562 1059542876 +6561 25457071 +6560 1443297638 +6559 1205141076 +6558 1732903857 +6557 1265918860 +6556 65760145 +6555 544560180 +6554 1460393951 +6553 139215595 +6552 360681351 +6551 496039469 +6550 85368553 +6549 1825113403 +6548 1265194579 +6547 2079520876 +6546 362583468 +6545 1916764023 +6544 1639490932 +6543 76652222 +6542 1206123244 +6541 1641076232 +6540 2069882205 +6539 16435094 +6538 320679875 +6537 2014316367 +6536 1518155048 +6535 2012192774 +6534 1691328485 +6533 1552352439 +6532 269006791 +6531 2001885448 +6530 440036862 +6529 177378777 +6528 1139380931 +6527 1188343676 +6526 1953008557 +6525 2074028197 +6524 183878829 +6523 964354482 +6522 53847042 +6521 683051596 +6520 1378328537 +6519 153331325 +6518 1462529935 +6517 1495914204 +6516 440029944 +6515 285931245 +6514 710640778 +6513 2145898347 +6512 154253665 +6511 1189688150 +6510 1320396357 +6509 55565838 +6508 645763694 +6507 455970749 +6506 322987882 +6505 2113286256 +6504 1743185983 +6503 1836926685 +6502 1112315577 +6501 91628013 +6500 862504517 +6499 1399176834 +6498 371853868 +6497 1212836381 +6496 1004464847 +6495 988654074 +6494 2020181155 +6493 1648310881 +6492 1733509593 +6491 2047999365 +6490 1368005309 +6489 2029897981 +6488 1860785028 +6487 1176598689 +6486 785273426 +6485 441615245 +6484 131677580 +6483 1668436276 +6482 825501990 +6481 98687827 +6480 543924455 +6479 864425607 +6478 1880061603 +6477 679961086 +6476 860268414 +6475 633544845 +6474 1000970679 +6473 1651557969 +6472 974422168 +6471 1860622391 +6470 1867257793 +6469 1797151783 +6468 394711987 +6467 1530683442 +6466 1340138874 +6465 1503637613 +6464 1402628129 +6463 2119665438 +6462 280305572 +6461 1851095260 +6460 187214336 +6459 191406619 +6458 1244624555 +6457 1419169783 +6456 1044921109 +6455 1264320797 +6454 1763596902 +6453 32989753 +6452 1124511821 +6451 2108560031 +6450 366109871 +6449 2011447017 +6448 4157193 +6447 1246516758 +6446 1826474054 +6445 1356194093 +6444 1806606325 +6443 1287831936 +6442 1931783824 +6441 1324754032 +6440 1465910404 +6439 336574351 +6438 457012909 +6437 1038558021 +6436 128055312 +6435 1367957083 +6434 1223332041 +6433 1699016517 +6432 1932451102 +6431 88898953 +6430 606470705 +6429 915528201 +6428 1293969158 +6427 2127787405 +6426 1803056529 +6425 1011931355 +6424 139808976 +6423 1802520519 +6422 1814363530 +6421 1260548451 +6420 2104402838 +6419 1267076761 +6418 184972963 +6417 795446748 +6416 1587394080 +6415 538642118 +6414 1571893916 +6413 481852293 +6412 1969405180 +6411 1595209473 +6410 867741123 +6409 427352382 +6408 208519038 +6407 1236539474 +6406 1962709628 +6405 576522443 +6404 1582989629 +6403 1134433088 +6402 1092545812 +6401 1016922901 +6400 942413442 +6399 626166947 +6398 1259955320 +6397 282037803 +6396 1987978429 +6395 536009 +6394 1345051473 +6393 1026744173 +6392 1845601329 +6391 547286768 +6390 1075575488 +6389 1308956090 +6388 1827166329 +6387 1793814493 +6386 1371036479 +6385 1105541787 +6384 716720585 +6383 2124168091 +6382 1761594818 +6381 1542052798 +6380 1386690435 +6379 1778685297 +6378 612126402 +6377 1779480243 +6376 1801033492 +6375 828276540 +6374 1631460278 +6373 566066728 +6372 192019645 +6371 466378865 +6370 1904451229 +6369 660375639 +6368 785672166 +6367 1259419310 +6366 1084469977 +6365 961234256 +6364 302418328 +6363 797764705 +6362 2098652332 +6361 536645239 +6360 867604087 +6359 1429244643 +6358 2085403258 +6357 721624541 +6356 1077093907 +6355 1394352036 +6354 1491430617 +6353 1322151435 +6352 737477656 +6351 2130393169 +6350 929926396 +6349 1754693839 +6348 2125135452 +6347 1931333509 +6346 148019965 +6345 1234966764 +6344 636256895 +6343 1165081413 +6342 809099147 +6341 1679127654 +6340 1828190346 +6339 645031918 +6338 1723389310 +6337 1971921558 +6336 957000982 +6335 286705272 +6334 1010065571 +6333 1913256736 +6332 2077644265 +6331 669407689 +6330 598725629 +6329 145979546 +6328 352150736 +6327 691051222 +6326 1377677572 +6325 1902426120 +6324 656874380 +6323 1508521096 +6322 392225039 +6321 1130267464 +6320 5257716 +6319 1146076534 +6318 1606673874 +6317 890168688 +6316 1295076614 +6315 1130422199 +6314 425867616 +6313 1104612889 +6312 1484374715 +6311 164067229 +6310 2103221992 +6309 2003752436 +6308 1835514584 +6307 1436684037 +6306 961855987 +6305 1191227894 +6304 356544655 +6303 340657882 +6302 1314531107 +6301 1931664719 +6300 317256953 +6299 2055158055 +6298 915785622 +6297 597208264 +6296 34176841 +6295 2016640123 +6294 1510201080 +6293 1674090564 +6292 1503263380 +6291 1393632153 +6290 1671077238 +6289 1262572676 +6288 1998483568 +6287 476251675 +6286 464301072 +6285 190463725 +6284 1793531132 +6283 261800387 +6282 1148874545 +6281 1628105927 +6280 476036293 +6279 666537954 +6278 1041896449 +6277 644286690 +6276 1080139382 +6275 621198104 +6274 2024180434 +6273 572363583 +6272 23400929 +6271 1406856700 +6270 1015879097 +6269 1867532337 +6268 2020981213 +6267 1046629146 +6266 1234490831 +6265 507569925 +6264 513376743 +6263 116568927 +6262 3013326 +6261 240690704 +6260 1542632233 +6259 1194825563 +6258 798271604 +6257 1808019842 +6256 830204190 +6255 202500684 +6254 1189072828 +6253 165425205 +6252 1933247742 +6251 482336590 +6250 586209478 +6249 1979233251 +6248 1733882220 +6247 420698344 +6246 767589903 +6245 507775799 +6244 597797175 +6243 617323734 +6242 1703968134 +6241 303352240 +6240 1533359135 +6239 2116733599 +6238 633041505 +6237 1513411288 +6236 533252403 +6235 1117921904 +6234 504556599 +6233 272686039 +6232 721420342 +6231 955671411 +6230 1589902748 +6229 1882096038 +6228 364621372 +6227 595770919 +6226 618947014 +6225 664778985 +6224 416736590 +6223 706736238 +6222 1726699375 +6221 2101498139 +6220 895938018 +6219 165511133 +6218 1211643347 +6217 1226106421 +6216 1970384817 +6215 150266169 +6214 951291313 +6213 294444934 +6212 1231448247 +6211 1734718183 +6210 1817794383 +6209 19947847 +6208 1583481196 +6207 1662603249 +6206 1008854688 +6205 260566363 +6204 396501561 +6203 1696368836 +6202 830266939 +6201 986807952 +6200 591050038 +6199 994131828 +6198 1263149024 +6197 1847326035 +6196 179034329 +6195 2059694424 +6194 1085563257 +6193 462722098 +6192 1958281867 +6191 1561188242 +6190 889854792 +6189 1817315245 +6188 342609964 +6187 1061377178 +6186 274815108 +6185 1675939883 +6184 1066301570 +6183 1364056778 +6182 624134199 +6181 1211500400 +6180 151236987 +6179 155191133 +6178 1158576806 +6177 1322914832 +6176 1266101688 +6175 1459969500 +6174 1577783072 +6173 1557177257 +6172 1105318798 +6171 1983618759 +6170 1871142575 +6169 891207651 +6168 815097499 +6167 1350938248 +6166 761762778 +6165 1863795879 +6164 101412556 +6163 1671858663 +6162 1720350954 +6161 140966622 +6160 1218578278 +6159 1975961262 +6158 1542500137 +6157 814153729 +6156 2142559255 +6155 1058241978 +6154 1051805683 +6153 2002284818 +6152 1212819791 +6151 468943066 +6150 52923593 +6149 975805802 +6148 1036573093 +6147 1846090954 +6146 1892615408 +6145 1856408078 +6144 354650702 +6143 1741647961 +6142 1833518330 +6141 214111147 +6140 1168521260 +6139 520204327 +6138 129444873 +6137 1098785268 +6136 1249525692 +6135 1237387762 +6134 143444924 +6133 2107929582 +6132 453280385 +6131 1891873340 +6130 745950132 +6129 404424549 +6128 1980885654 +6127 484258159 +6126 1909831693 +6125 140274437 +6124 1992905835 +6123 582862617 +6122 1949361225 +6121 237013988 +6120 1579853620 +6119 354316287 +6118 1230674042 +6117 1327648663 +6116 1491440252 +6115 150967447 +6114 22889748 +6113 140539555 +6112 573126701 +6111 1313314003 +6110 84666274 +6109 69735992 +6108 1418162283 +6107 1039540758 +6106 955340343 +6105 1289079757 +6104 784107377 +6103 399055232 +6102 1361979450 +6101 48855836 +6100 2058471334 +6099 261691973 +6098 642076503 +6097 1840611217 +6096 638835972 +6095 1326969076 +6094 338396860 +6093 1755891846 +6092 1150492645 +6091 1595044938 +6090 1153823594 +6089 252204957 +6088 1010359682 +6087 1079706594 +6086 1304758914 +6085 1350900697 +6084 1725324394 +6083 857059393 +6082 55873281 +6081 503390709 +6080 2042635368 +6079 1192609163 +6078 1261879296 +6077 129082525 +6076 255433381 +6075 556285111 +6074 2074583955 +6073 735251540 +6072 488067546 +6071 1100287477 +6070 1554262981 +6069 217860116 +6068 1770339648 +6067 1462591075 +6066 1502214357 +6065 1030427774 +6064 176476431 +6063 890835570 +6062 602068252 +6061 898287687 +6060 584685255 +6059 74117000 +6058 1094929691 +6057 1806942633 +6056 1501865848 +6055 447699521 +6054 1295027416 +6053 1221933685 +6052 961907673 +6051 1010747765 +6050 1388995060 +6049 1913552842 +6048 937175782 +6047 705594185 +6046 201982218 +6045 1667665489 +6044 68217565 +6043 974296478 +6042 1328472207 +6041 270207429 +6040 1477431476 +6039 91671905 +6038 863129407 +6037 739911874 +6036 1286114644 +6035 611378787 +6034 428359522 +6033 1425672391 +6032 306150314 +6031 527951252 +6030 1950841644 +6029 925226270 +6028 719734800 +6027 647230170 +6026 511915216 +6025 279932162 +6024 1633275495 +6023 284279651 +6022 1980422273 +6021 1195838479 +6020 73571983 +6019 683400875 +6018 1711570624 +6017 1416993941 +6016 637376619 +6015 1375169387 +6014 339193281 +6013 1945493784 +6012 1644348650 +6011 1236800302 +6010 1554561670 +6009 737519602 +6008 953040909 +6007 251750619 +6006 311552352 +6005 2007925901 +6004 305228473 +6003 2047891918 +6002 1622314395 +6001 1528407692 +6000 1955700100 +5999 1303611474 +5998 413311054 +5997 439802637 +5996 1161438322 +5995 227635565 +5994 446993537 +5993 437437016 +5992 210707667 +5991 1297021397 +5990 1631751502 +5989 804061690 +5988 46024256 +5987 336401237 +5986 1077800659 +5985 839366483 +5984 1878304385 +5983 1249876627 +5982 390932113 +5981 906829048 +5980 283759393 +5979 1302811051 +5978 425967249 +5977 1092598656 +5976 2094005794 +5975 411144082 +5974 385611506 +5973 924304429 +5972 92191818 +5971 318702920 +5970 1115096638 +5969 1515897462 +5968 142173152 +5967 185675488 +5966 2140292748 +5965 724001306 +5964 16927898 +5963 1297455788 +5962 953169162 +5961 1554129625 +5960 1250997141 +5959 1295350265 +5958 1873744679 +5957 1354141420 +5956 605580499 +5955 1975407680 +5954 448434370 +5953 971475337 +5952 966117234 +5951 1235604710 +5950 480861798 +5949 1338644385 +5948 1356288904 +5947 14823167 +5946 706987150 +5945 1169701365 +5944 318952264 +5943 66908585 +5942 1956691439 +5941 723778003 +5940 176529768 +5939 929421149 +5938 1523088362 +5937 1565655494 +5936 168747590 +5935 842836960 +5934 1918315792 +5933 610281921 +5932 46458646 +5931 1805302544 +5930 1827868594 +5929 2044339369 +5928 689769766 +5927 2045820647 +5926 905707050 +5925 1781588810 +5924 1009290445 +5923 1360313307 +5922 490613539 +5921 1774956497 +5920 2026799454 +5919 466038631 +5918 631657235 +5917 186587539 +5916 1843354550 +5915 640078564 +5914 1360493574 +5913 1742657909 +5912 2037862465 +5911 1027270289 +5910 1348173289 +5909 758357922 +5908 760673559 +5907 680251402 +5906 1794823350 +5905 1705949317 +5904 796378313 +5903 113013247 +5902 929896975 +5901 149602925 +5900 1115532778 +5899 1929531595 +5898 1138632318 +5897 1055664604 +5896 1036530201 +5895 1692877391 +5894 1290975271 +5893 1381817596 +5892 1480997501 +5891 24574907 +5890 1143299262 +5889 1840211915 +5888 770167729 +5887 2139062318 +5886 973577612 +5885 100696641 +5884 749699747 +5883 333223285 +5882 394484620 +5881 1279504542 +5880 266596730 +5879 667921886 +5878 1111018220 +5877 1202207889 +5876 2031356737 +5875 1681810102 +5874 776052342 +5873 646775388 +5872 1144964117 +5871 1147849028 +5870 1158454255 +5869 59868174 +5868 893001393 +5867 1593238575 +5866 1912172981 +5865 1802196253 +5864 211879889 +5863 1266400363 +5862 238518333 +5861 1788269234 +5860 1401890826 +5859 1151720592 +5858 866634302 +5857 669471087 +5856 1389362571 +5855 640354327 +5854 1853695669 +5853 1617678853 +5852 66626554 +5851 1874046381 +5850 168486322 +5849 1211872489 +5848 784048797 +5847 1576691766 +5846 426155547 +5845 1384581349 +5844 536845985 +5843 1775686962 +5842 1635804781 +5841 1085095942 +5840 254847634 +5839 1712699327 +5838 295178841 +5837 1238288788 +5836 1381358686 +5835 645772617 +5834 1563677920 +5833 571094303 +5832 2011993185 +5831 1234281389 +5830 921634932 +5829 732419739 +5828 1909841669 +5827 226279975 +5826 963259066 +5825 1919167366 +5824 573727773 +5823 2127132936 +5822 1449192531 +5821 1002237713 +5820 1089997584 +5819 739278204 +5818 785716942 +5817 1546951096 +5816 1039845780 +5815 797952232 +5814 1896260216 +5813 1599233691 +5812 1520839328 +5811 2070589101 +5810 789917101 +5809 1164042494 +5808 331340641 +5807 1796889872 +5806 1822094516 +5805 810264383 +5804 781263080 +5803 329396530 +5802 1796943019 +5801 1279573446 +5800 1471923368 +5799 695354957 +5798 1916644321 +5797 2138157951 +5796 1800035850 +5795 983609778 +5794 469974835 +5793 1718973707 +5792 1037135352 +5791 709914327 +5790 216520771 +5789 1690530135 +5788 1846916071 +5787 2135248357 +5786 1798174528 +5785 1588095737 +5784 1424596552 +5783 1973154762 +5782 809316590 +5781 356796833 +5780 1739248460 +5779 1140510877 +5778 1489431626 +5777 1668559906 +5776 1015626791 +5775 1492697985 +5774 1160805012 +5773 1649173282 +5772 1004956810 +5771 1101588062 +5770 1510412773 +5769 1481249065 +5768 1042802755 +5767 933034543 +5766 1668183116 +5765 81062142 +5764 2093958074 +5763 1907544156 +5762 1502452936 +5761 1494088864 +5760 1010481903 +5759 228756062 +5758 2039839255 +5757 258820334 +5756 710651805 +5755 1972503414 +5754 778779147 +5753 1067799719 +5752 233906302 +5751 1816289361 +5750 1014848855 +5749 70688553 +5748 124884085 +5747 2144217289 +5746 507754894 +5745 1513937157 +5744 487741175 +5743 59216950 +5742 138760509 +5741 1671191392 +5740 58785307 +5739 577378230 +5738 1960549597 +5737 961740612 +5736 986560117 +5735 1908122608 +5734 726092854 +5733 599869209 +5732 897062252 +5731 1273696874 +5730 1601733257 +5729 751661569 +5728 1665587905 +5727 67335841 +5726 1627524834 +5725 1790335734 +5724 1738597111 +5723 1109973434 +5722 52950864 +5721 163217749 +5720 1691405275 +5719 1018115214 +5718 1710417307 +5717 758430576 +5716 1656476113 +5715 448537944 +5714 1375176647 +5713 964033431 +5712 431643 +5711 1708865927 +5710 1858125443 +5709 1244528342 +5708 1738301761 +5707 52426989 +5706 235647758 +5705 386690907 +5704 1011060355 +5703 1599879628 +5702 1145619600 +5701 145400683 +5700 1755592617 +5699 1534397416 +5698 1271620383 +5697 2022735819 +5696 476222377 +5695 517551400 +5694 1737384870 +5693 1575379362 +5692 1566051807 +5691 1182319298 +5690 600284090 +5689 932974699 +5688 1509122748 +5687 1261879362 +5686 1530737577 +5685 692442682 +5684 448106301 +5683 1813794368 +5682 1253391636 +5681 903386948 +5680 2118047814 +5679 1805698453 +5678 1008880584 +5677 1351610853 +5676 1188850282 +5675 783251777 +5674 1388554955 +5673 865659672 +5672 1991770659 +5671 1758705831 +5670 1021263948 +5669 1880340446 +5668 1058175039 +5667 754068983 +5666 285350949 +5665 1048326663 +5664 1098983241 +5663 555065572 +5662 975095272 +5661 633077108 +5660 1820680197 +5659 1485888375 +5658 1549720770 +5657 816680066 +5656 813773061 +5655 1864426857 +5654 1586534694 +5653 1692203001 +5652 1843230201 +5651 1595176830 +5650 2041990012 +5649 766436961 +5648 616848171 +5647 225628807 +5646 2110539546 +5645 323190609 +5644 938964766 +5643 1777332772 +5642 1991879372 +5641 111430213 +5640 700530792 +5639 267194965 +5638 1594989497 +5637 9848376 +5636 1802569390 +5635 1877769025 +5634 73231390 +5633 465906133 +5632 881869022 +5631 1636690545 +5630 1230839986 +5629 1004000131 +5628 672115314 +5627 1832777561 +5626 1377629019 +5625 1269053708 +5624 21196655 +5623 2138841512 +5622 1797696637 +5621 1076793240 +5620 978328659 +5619 1816361205 +5618 803381063 +5617 293657562 +5616 1434147689 +5615 333206774 +5614 478794885 +5613 827534552 +5612 1076801979 +5611 1724684407 +5610 663924364 +5609 690682416 +5608 612109223 +5607 1864704120 +5606 2084100633 +5605 1336663257 +5604 995900002 +5603 584024493 +5602 1382549795 +5601 2025352539 +5600 964575230 +5599 1545546073 +5598 1773854760 +5597 1550545254 +5596 1811580905 +5595 1386271155 +5594 1618840719 +5593 1091887063 +5592 1160512853 +5591 2128819080 +5590 273412177 +5589 684671097 +5588 382213516 +5587 470174289 +5586 1962346325 +5585 606613136 +5584 1403888442 +5583 901594125 +5582 163610188 +5581 386119563 +5580 1112575184 +5579 946703892 +5578 754065431 +5577 1422929614 +5576 868804117 +5575 1500076140 +5574 2101597110 +5573 1118031111 +5572 1766932911 +5571 1984487370 +5570 251497779 +5569 1561513624 +5568 1881448815 +5567 387583604 +5566 2079188183 +5565 719693842 +5564 225758302 +5563 1637505287 +5562 818474885 +5561 475841756 +5560 1746605564 +5559 1950721536 +5558 869808420 +5557 1923084027 +5556 1213769494 +5555 1060752199 +5554 443002948 +5553 1017768879 +5552 1936502589 +5551 1364389943 +5550 1779537780 +5549 1837129218 +5548 77899775 +5547 1401472939 +5546 1468816152 +5545 1898256654 +5544 1880626877 +5543 117109740 +5542 866533332 +5541 205419287 +5540 103038554 +5539 2011397822 +5538 1629809088 +5537 1161754973 +5536 161825302 +5535 441682896 +5534 2048702605 +5533 1897400194 +5532 2038383371 +5531 1015236997 +5530 1753516984 +5529 1971005184 +5528 736952042 +5527 1956539868 +5526 1480081079 +5525 196000615 +5524 1271733258 +5523 1226096653 +5522 1385714747 +5521 99373370 +5520 1286490168 +5519 378064841 +5518 368313066 +5517 327126769 +5516 1668329710 +5515 1351706412 +5514 1031723321 +5513 1675207590 +5512 14071185 +5511 1002619158 +5510 723093846 +5509 1088767229 +5508 1849572520 +5507 1188126192 +5506 1260536016 +5505 411908755 +5504 550783173 +5503 1033465608 +5502 143883210 +5501 67378186 +5500 278284955 +5499 1944460763 +5498 490924105 +5497 540951427 +5496 684806610 +5495 253984426 +5494 957769515 +5493 1172359888 +5492 2087090132 +5491 1007649906 +5490 1878543952 +5489 959363399 +5488 857218779 +5487 1164090302 +5486 1442887095 +5485 2140605768 +5484 1337635226 +5483 29104163 +5482 952113743 +5481 1072787604 +5480 1300530285 +5479 1682451302 +5478 1975714861 +5477 1437663765 +5476 637343018 +5475 227070408 +5474 268025545 +5473 483404987 +5472 755180653 +5471 346906095 +5470 1723937729 +5469 1884817176 +5468 1259654153 +5467 236939679 +5466 1730665559 +5465 1659930370 +5464 314377941 +5463 2097603257 +5462 1441299584 +5461 1127726733 +5460 150431127 +5459 714453649 +5458 1663959952 +5457 864096659 +5456 1973938724 +5455 1413782932 +5454 1188492024 +5453 264847622 +5452 876057526 +5451 1417146089 +5450 1244556390 +5449 2010350168 +5448 1045108284 +5447 1748644453 +5446 1169638220 +5445 153938031 +5444 1619373403 +5443 2068603098 +5442 906950906 +5441 1017847125 +5440 1234735589 +5439 1486998049 +5438 154151616 +5437 1747207431 +5436 2070045386 +5435 1780545950 +5434 218630786 +5433 1334134856 +5432 1947172129 +5431 726845934 +5430 1611250429 +5429 1433818116 +5428 887998573 +5427 250177020 +5426 1823088282 +5425 1709091101 +5424 537725406 +5423 1918829583 +5422 1167774880 +5421 1013191005 +5420 372037805 +5419 1643395585 +5418 840711948 +5417 891170252 +5416 129271050 +5415 1248518770 +5414 1394470773 +5413 601526278 +5412 833867508 +5411 1567436504 +5410 863695508 +5409 1635011806 +5408 1564436311 +5407 521089314 +5406 1528576645 +5405 735910529 +5404 1980857469 +5403 1639268499 +5402 1870368075 +5401 513354013 +5400 1986331009 +5399 1361073409 +5398 1758213482 +5397 1326391120 +5396 1859935262 +5395 2051742347 +5394 541316221 +5393 1672018048 +5392 1546791778 +5391 1671862943 +5390 172479057 +5389 1628351200 +5388 1514124534 +5387 1739676826 +5386 1644183127 +5385 1675228420 +5384 414651261 +5383 1974517917 +5382 1885314417 +5381 1346339350 +5380 3000193 +5379 342606194 +5378 106435160 +5377 828525782 +5376 687715493 +5375 2036791794 +5374 1013026102 +5373 1467503456 +5372 1800421138 +5371 509294666 +5370 902624179 +5369 659939889 +5368 1648621795 +5367 1853954783 +5366 785074898 +5365 187917213 +5364 504950568 +5363 1016936926 +5362 1499538991 +5361 2065924226 +5360 157738408 +5359 580285878 +5358 2131651721 +5357 1986379762 +5356 1325025565 +5355 1817148858 +5354 1937397651 +5353 1215795559 +5352 1971517724 +5351 1542708223 +5350 1239904190 +5349 1321958059 +5348 1802374349 +5347 217127014 +5346 1962983328 +5345 1367695685 +5344 236370655 +5343 503731435 +5342 564879277 +5341 1140481249 +5340 1008156519 +5339 1196153044 +5338 2022348638 +5337 1460704581 +5336 1349004214 +5335 1915621620 +5334 835861870 +5333 586509990 +5332 859198518 +5331 919253113 +5330 2081756152 +5329 318842294 +5328 1402743961 +5327 314502863 +5326 48982111 +5325 109230006 +5324 1993114782 +5323 394689428 +5322 2123375017 +5321 649559665 +5320 1887817521 +5319 1022777175 +5318 1506458379 +5317 434678664 +5316 2128240007 +5315 1459251892 +5314 802816408 +5313 1243373054 +5312 1643058564 +5311 1516209881 +5310 1265616259 +5309 1694935586 +5308 1994632477 +5307 106727018 +5306 624842711 +5305 762494224 +5304 1056423102 +5303 2064092405 +5302 652237486 +5301 540356223 +5300 1663992799 +5299 1767253289 +5298 269860183 +5297 1293513955 +5296 468871729 +5295 1801776331 +5294 133338637 +5293 1343555117 +5292 654355554 +5291 1100597841 +5290 1290584934 +5289 1453138857 +5288 1042020816 +5287 47206486 +5286 1779345904 +5285 884866953 +5284 1963676976 +5283 1434090175 +5282 2125240443 +5281 2095606626 +5280 1669061051 +5279 1158889240 +5278 1070092874 +5277 1232138253 +5276 1197787564 +5275 708233954 +5274 110256738 +5273 516066878 +5272 400099605 +5271 1032467845 +5270 270496040 +5269 370478844 +5268 1298381559 +5267 615567500 +5266 1160175318 +5265 1272800260 +5264 1147420776 +5263 1180224443 +5262 52970183 +5261 1348700345 +5260 58577025 +5259 1243378447 +5258 1821276600 +5257 157153863 +5256 231013158 +5255 345255729 +5254 907110158 +5253 2015553998 +5252 1912512771 +5251 966351202 +5250 1025513751 +5249 436922798 +5248 2108585324 +5247 361858920 +5246 1121881515 +5245 681720686 +5244 308134349 +5243 1225272541 +5242 245570838 +5241 29620761 +5240 1881569933 +5239 1802412187 +5238 1357787173 +5237 25581299 +5236 1615630372 +5235 2127434523 +5234 1219830077 +5233 1946204079 +5232 1121647418 +5231 957075383 +5230 1674907393 +5229 2048906809 +5228 1012365289 +5227 1476020871 +5226 1397527353 +5225 362942807 +5224 580226606 +5223 2088242603 +5222 990040247 +5221 1475589973 +5220 1005249526 +5219 663654831 +5218 1462524930 +5217 1426864638 +5216 53724571 +5215 2044092622 +5214 436149847 +5213 278513587 +5212 1491186255 +5211 590642299 +5210 819317236 +5209 1855988634 +5208 186781815 +5207 1377836298 +5206 953234869 +5205 1816909941 +5204 1005787104 +5203 262754694 +5202 271296686 +5201 1220224257 +5200 2092193742 +5199 198886522 +5198 651379456 +5197 649422482 +5196 895794265 +5195 1456768398 +5194 1520386208 +5193 1252120280 +5192 1082993077 +5191 326385415 +5190 13065043 +5189 1725868536 +5188 609930260 +5187 1565915956 +5186 990714790 +5185 1922694631 +5184 552906367 +5183 1992991196 +5182 1606679999 +5181 1782681269 +5180 403860483 +5179 1588964585 +5178 902753765 +5177 517355522 +5176 372049194 +5175 690480175 +5174 1545613255 +5173 1933046495 +5172 318044600 +5171 72410164 +5170 568844801 +5169 1442771260 +5168 1450575905 +5167 1342094706 +5166 1276519921 +5165 1791157632 +5164 373775321 +5163 1194000793 +5162 1239055237 +5161 1504608188 +5160 1863938803 +5159 594632735 +5158 735153746 +5157 834719277 +5156 1013009589 +5155 1145207242 +5154 316014632 +5153 917708746 +5152 1589130713 +5151 17715414 +5150 879927504 +5149 2033988609 +5148 1216915391 +5147 212273589 +5146 1119225915 +5145 586486346 +5144 372435575 +5143 1473203091 +5142 1364201694 +5141 1022756988 +5140 769317907 +5139 1374233743 +5138 166251338 +5137 1806901920 +5136 968319385 +5135 82519128 +5134 552102395 +5133 1016650780 +5132 1477545638 +5131 644422502 +5130 769454442 +5129 1029219526 +5128 1729106794 +5127 1737430152 +5126 518704645 +5125 95300843 +5124 1703560177 +5123 298299218 +5122 37781242 +5121 1702625752 +5120 948283670 +5119 667653914 +5118 914762693 +5117 630429045 +5116 1987321662 +5115 1793506472 +5114 1369768300 +5113 1497162235 +5112 703885184 +5111 2137451599 +5110 856505649 +5109 1109899634 +5108 405914358 +5107 83732210 +5106 1254799525 +5105 2099152252 +5104 752457138 +5103 2055163540 +5102 247196338 +5101 448326112 +5100 1062799356 +5099 1179507938 +5098 510514881 +5097 1633805951 +5096 33869975 +5095 220405427 +5094 57519601 +5093 934425 +5092 1497499195 +5091 1517610975 +5090 787863058 +5089 317854625 +5088 827815900 +5087 1268739869 +5086 1408144393 +5085 490159426 +5084 1089621288 +5083 1379800348 +5082 640656586 +5081 1741469197 +5080 1731537241 +5079 772773439 +5078 2002583757 +5077 454245753 +5076 1478758719 +5075 1347119633 +5074 1851955914 +5073 304131026 +5072 992364184 +5071 1215172047 +5070 2085294879 +5069 1576477053 +5068 1145637963 +5067 290109454 +5066 1576286350 +5065 32935550 +5064 870389879 +5063 687392273 +5062 1360555014 +5061 1179644570 +5060 689795075 +5059 1666606837 +5058 1057193880 +5057 337656474 +5056 179118580 +5055 28344044 +5054 1996986488 +5053 1495635739 +5052 1795746755 +5051 2015366794 +5050 1886369088 +5049 1277291488 +5048 1441498368 +5047 655464124 +5046 749773487 +5045 1174627693 +5044 354755449 +5043 636783867 +5042 366319795 +5041 1563370778 +5040 69534084 +5039 1795185425 +5038 190703 +5037 1112702413 +5036 1567203222 +5035 888894076 +5034 819864183 +5033 1838228957 +5032 2145080846 +5031 1841431825 +5030 122450689 +5029 352138601 +5028 1487488257 +5027 1028849836 +5026 488153633 +5025 830966489 +5024 380080937 +5023 2129103342 +5022 1756750298 +5021 518455267 +5020 573868426 +5019 1230904964 +5018 527518001 +5017 266870675 +5016 300708675 +5015 112989620 +5014 808307897 +5013 938868318 +5012 567249783 +5011 718618018 +5010 1563180075 +5009 1104315318 +5008 227982202 +5007 1258780275 +5006 292838230 +5005 1876457913 +5004 891296878 +5003 1125916006 +5002 1715778268 +5001 1792942245 +5000 353943568 +4999 1241084501 +4998 2011468615 +4997 656521767 +4996 648768898 +4995 506533939 +4994 1221699839 +4993 2009109318 +4992 1555234915 +4991 525845334 +4990 2138420914 +4989 306997751 +4988 930196289 +4987 414528381 +4986 1606046425 +4985 1509324004 +4984 1693223485 +4983 89689879 +4982 1523171891 +4981 1610418112 +4980 490635816 +4979 304399800 +4978 811477088 +4977 499007937 +4976 367483397 +4975 1314405871 +4974 160679645 +4973 1245838280 +4972 771972438 +4971 474693766 +4970 1928957278 +4969 1844905448 +4968 592315603 +4967 1504934676 +4966 1582305576 +4965 787143228 +4964 1098782672 +4963 695854505 +4962 2018172052 +4961 1248237164 +4960 1743132692 +4959 1723892533 +4958 848434974 +4957 1568355933 +4956 868788544 +4955 1516356546 +4954 2133635761 +4953 82805372 +4952 1746537711 +4951 1218772091 +4950 798941024 +4949 2139111526 +4948 2084400051 +4947 1644554865 +4946 338328292 +4945 1269128764 +4944 542433433 +4943 1833469526 +4942 1464364650 +4941 1074550638 +4940 2029861811 +4939 424022602 +4938 262599872 +4937 1952656023 +4936 406152004 +4935 886451071 +4934 916454823 +4933 1998029156 +4932 1100205460 +4931 294279519 +4930 399802190 +4929 174776759 +4928 855103989 +4927 1479562075 +4926 1582203820 +4925 785983171 +4924 1917302483 +4923 914863669 +4922 1431347996 +4921 1754909832 +4920 1281855688 +4919 1301869807 +4918 1800783234 +4917 815271286 +4916 1102121432 +4915 652342414 +4914 1952247762 +4913 1615366443 +4912 1951091363 +4911 1040342048 +4910 811950766 +4909 77205788 +4908 17870598 +4907 1523632448 +4906 1036201199 +4905 555606496 +4904 1933729259 +4903 622175304 +4902 1598226966 +4901 925428701 +4900 1586659178 +4899 1067723762 +4898 740056587 +4897 69120817 +4896 1709743240 +4895 667340150 +4894 1502118823 +4893 162392651 +4892 1780491629 +4891 129478189 +4890 2101610246 +4889 466584402 +4888 199748375 +4887 1148440820 +4886 1010507172 +4885 1634238637 +4884 848734699 +4883 911905713 +4882 803415677 +4881 1873885574 +4880 1022471450 +4879 1435801965 +4878 1188488237 +4877 1609747750 +4876 1737386837 +4875 414025895 +4874 1104863178 +4873 1008300558 +4872 1182999773 +4871 530503203 +4870 185372113 +4869 1517538361 +4868 1505464170 +4867 72716437 +4866 714485642 +4865 1547350589 +4864 1034332169 +4863 1372640633 +4862 208266052 +4861 1313907227 +4860 2077213462 +4859 953169426 +4858 1603560877 +4857 712993386 +4856 299706121 +4855 98601459 +4854 830822960 +4853 1122332772 +4852 2036917911 +4851 1515097359 +4850 685397337 +4849 1560207348 +4848 1845898776 +4847 774462341 +4846 504884572 +4845 729086279 +4844 1378509770 +4843 574359974 +4842 822928444 +4841 1812945060 +4840 1172522681 +4839 112655676 +4838 803052718 +4837 2105597229 +4836 1185867915 +4835 1489328657 +4834 1339084536 +4833 1867908590 +4832 1442910819 +4831 1402580274 +4830 1857829997 +4829 1364220076 +4828 653463305 +4827 1504959418 +4826 2029654074 +4825 1324856996 +4824 209167196 +4823 1463209248 +4822 436935435 +4821 476710562 +4820 1816682231 +4819 2058418644 +4818 1055322776 +4817 1116812496 +4816 1543436219 +4815 2078008245 +4814 2053641483 +4813 1713048357 +4812 1549320941 +4811 710272768 +4810 1009892342 +4809 1214409099 +4808 1074271409 +4807 1461207709 +4806 766512693 +4805 1465442973 +4804 46417838 +4803 2083987910 +4802 10078593 +4801 78690742 +4800 749116968 +4799 352870579 +4798 1482049650 +4797 1476089957 +4796 1295792222 +4795 566444825 +4794 887921561 +4793 1879940281 +4792 1794010665 +4791 526000439 +4790 1568871434 +4789 699869735 +4788 514982424 +4787 1124798179 +4786 1210654661 +4785 1977871510 +4784 528687304 +4783 1343368715 +4782 703156015 +4781 334911842 +4780 1783485007 +4779 1696168280 +4778 447896406 +4777 1756312084 +4776 1414789871 +4775 830008430 +4774 1455364380 +4773 2115210743 +4772 1334870942 +4771 1804691662 +4770 744124740 +4769 1420510659 +4768 1204562004 +4767 915604825 +4766 588168395 +4765 1563335589 +4764 919917808 +4763 361921122 +4762 311068847 +4761 1094140930 +4760 11018014 +4759 444073255 +4758 1636698721 +4757 684594562 +4756 596110875 +4755 2014769594 +4754 1274715494 +4753 193775462 +4752 1707367356 +4751 1154471383 +4750 2034499083 +4749 27172923 +4748 281378409 +4747 1765371624 +4746 300947704 +4745 1447062776 +4744 1642621136 +4743 1798156366 +4742 1371086003 +4741 2061843930 +4740 600129657 +4739 1976003563 +4738 832342264 +4737 1788710063 +4736 2143170664 +4735 226247273 +4734 1252266741 +4733 1973260526 +4732 350903108 +4731 2014479240 +4730 1604925856 +4729 1473907100 +4728 1995446028 +4727 1769412775 +4726 1557362716 +4725 402335413 +4724 307402238 +4723 120244111 +4722 306760026 +4721 1680194433 +4720 873092974 +4719 269127459 +4718 1873708867 +4717 981799281 +4716 122750487 +4715 650274986 +4714 75976772 +4713 1728260854 +4712 1198026708 +4711 1542566088 +4710 1229501666 +4709 958903242 +4708 1980316546 +4707 606094991 +4706 536443322 +4705 169910138 +4704 2022827813 +4703 1385271149 +4702 368334670 +4701 1024479656 +4700 19033212 +4699 1982996729 +4698 2064028032 +4697 1593110615 +4696 1462010536 +4695 1437118604 +4694 95575386 +4693 774691453 +4692 1394634785 +4691 37632567 +4690 1953969214 +4689 2038777341 +4688 146376972 +4687 1223433881 +4686 905822508 +4685 541973281 +4684 1599731925 +4683 680894332 +4682 498759187 +4681 239123466 +4680 1709733190 +4679 623406675 +4678 422459920 +4677 1810406408 +4676 730750826 +4675 1298655821 +4674 1949059116 +4673 998348157 +4672 1366237936 +4671 532821588 +4670 1107935272 +4669 573406245 +4668 520986193 +4667 626909427 +4666 1497535228 +4665 687319083 +4664 42483819 +4663 57942819 +4662 968205887 +4661 1503341092 +4660 2038739243 +4659 730535333 +4658 1132954832 +4657 1751887338 +4656 1771185603 +4655 224928176 +4654 43214094 +4653 1360608459 +4652 1118644790 +4651 2022836160 +4650 1964147194 +4649 2046810429 +4648 2040139497 +4647 1271287747 +4646 2008830940 +4645 1879886317 +4644 2079901532 +4643 1416237527 +4642 2037896533 +4641 792831691 +4640 11835395 +4639 481025844 +4638 1223354665 +4637 1981150758 +4636 584425608 +4635 1439592409 +4634 1866596843 +4633 686626374 +4632 166687224 +4631 237670554 +4630 370386260 +4629 286851904 +4628 1106833377 +4627 908026656 +4626 1708673244 +4625 410577144 +4624 1253767034 +4623 167861582 +4622 1543944912 +4621 1219318008 +4620 2130180310 +4619 692859447 +4618 37979489 +4617 160253180 +4616 1338869862 +4615 592593413 +4614 1989473432 +4613 1287069841 +4612 1404402132 +4611 1556870688 +4610 1716960674 +4609 178168285 +4608 2044083884 +4607 1931245904 +4606 114553914 +4605 2045282882 +4604 1272905184 +4603 1628926289 +4602 316240114 +4601 2027318968 +4600 1278320825 +4599 1609843252 +4598 725662308 +4597 696256233 +4596 1801743269 +4595 1540811662 +4594 1014115880 +4593 34449026 +4592 185164919 +4591 851085465 +4590 1181338519 +4589 1969927130 +4588 1501473233 +4587 1592869724 +4586 318263396 +4585 51800021 +4584 1335674929 +4583 432602743 +4582 1717592815 +4581 1226233846 +4580 1660270452 +4579 1933198418 +4578 63614371 +4577 2146284650 +4576 658340719 +4575 633111273 +4574 1729042767 +4573 1393069864 +4572 350605464 +4571 853880510 +4570 1301656660 +4569 582064592 +4568 1955583630 +4567 1332334293 +4566 1829624001 +4565 1767294243 +4564 1355646743 +4563 163030415 +4562 1000594154 +4561 362721437 +4560 1497095880 +4559 1735952443 +4558 1651663733 +4557 1449673212 +4556 257194795 +4555 2033144301 +4554 481690853 +4553 109441082 +4552 919815939 +4551 1931878045 +4550 1162619475 +4549 1661469450 +4548 1274857698 +4547 1577986745 +4546 417241882 +4545 1412754503 +4544 282505809 +4543 875162257 +4542 91413204 +4541 1916024520 +4540 1045780528 +4539 2116806014 +4538 899924239 +4537 188289387 +4536 2124171198 +4535 1666593586 +4534 766700089 +4533 992925305 +4532 813418183 +4531 1412125359 +4530 858541352 +4529 47422668 +4528 1478757648 +4527 1766003080 +4526 967982358 +4525 147753712 +4524 1113328362 +4523 697296456 +4522 1094305255 +4521 1405830136 +4520 657020347 +4519 1732116378 +4518 1244227568 +4517 2009586843 +4516 1295480936 +4515 1689563273 +4514 1321341298 +4513 513964937 +4512 1976865377 +4511 122090838 +4510 1016100281 +4509 857491141 +4508 2140118464 +4507 1380814301 +4506 1569072946 +4505 1131245893 +4504 853175403 +4503 1502058378 +4502 134383953 +4501 765995515 +4500 2080851358 +4499 1240021919 +4498 1226923957 +4497 1331003936 +4496 652674718 +4495 270685902 +4494 1200932105 +4493 1854981873 +4492 40276109 +4491 1509672525 +4490 161602568 +4489 794917151 +4488 436635442 +4487 1702147942 +4486 688245545 +4485 781515998 +4484 1860181544 +4483 1199250460 +4482 1645348304 +4481 1119374236 +4480 129456022 +4479 1782769628 +4478 1435901843 +4477 1008872571 +4476 527638898 +4475 67014568 +4474 996861939 +4473 87179888 +4472 1568690667 +4471 1041845682 +4470 1686555205 +4469 749847422 +4468 587347201 +4467 956238055 +4466 130071830 +4465 945176493 +4464 230409793 +4463 1838743228 +4462 1693379305 +4461 1392842605 +4460 1073037083 +4459 606938274 +4458 106671606 +4457 1802603091 +4456 1989450046 +4455 1636478732 +4454 1283651342 +4453 740807308 +4452 1069794438 +4451 2010062324 +4450 1830956041 +4449 1268067099 +4448 1255130730 +4447 1368887275 +4446 12010631 +4445 440459010 +4444 645807548 +4443 2102499905 +4442 548108330 +4441 818843245 +4440 454498481 +4439 730317150 +4438 619775592 +4437 1789654356 +4436 725828261 +4435 438812250 +4434 1399280836 +4433 985050836 +4432 765706145 +4431 1086441031 +4430 1286170999 +4429 1417917639 +4428 764971876 +4427 617676522 +4426 518951749 +4425 1248642737 +4424 566684294 +4423 1421072665 +4422 1057334915 +4421 1949210987 +4420 754931594 +4419 462068766 +4418 1256056467 +4417 814671720 +4416 723079726 +4415 56994374 +4414 2039834327 +4413 1974447951 +4412 1648001424 +4411 1965274828 +4410 199067653 +4409 812327773 +4408 4488889 +4407 180963342 +4406 390373520 +4405 1888261073 +4404 1820589752 +4403 312839805 +4402 1846363485 +4401 1495272154 +4400 321469155 +4399 668494477 +4398 898965890 +4397 1663812786 +4396 50992228 +4395 1245362732 +4394 191307822 +4393 764956954 +4392 666141071 +4391 595266149 +4390 693154520 +4389 2087743522 +4388 1886472687 +4387 1199062093 +4386 922321040 +4385 896115423 +4384 556476597 +4383 74559499 +4382 1775380298 +4381 835673651 +4380 1960785939 +4379 18104311 +4378 421954253 +4377 263711463 +4376 507857237 +4375 77533715 +4374 41897588 +4373 325317598 +4372 2138854298 +4371 1177869008 +4370 596306264 +4369 805140016 +4368 617502249 +4367 1801086806 +4366 1472504964 +4365 1433518921 +4364 579221661 +4363 1743525320 +4362 71802434 +4361 725881196 +4360 856277110 +4359 1641576074 +4358 1165422482 +4357 990357264 +4356 642585496 +4355 847761541 +4354 1268218772 +4353 1868286594 +4352 261257208 +4351 1757275987 +4350 413719398 +4349 1697074475 +4348 1657730721 +4347 344420538 +4346 221813875 +4345 182539639 +4344 86163065 +4343 1011512228 +4342 1876494982 +4341 1333714281 +4340 560366759 +4339 942703106 +4338 1480118700 +4337 1331466975 +4336 1221865145 +4335 1876463292 +4334 1361716487 +4333 2000824112 +4332 887248210 +4331 577710008 +4330 1707942362 +4329 2013403493 +4328 998990578 +4327 317660941 +4326 1869622140 +4325 921782550 +4324 586504332 +4323 1658426433 +4322 1454567195 +4321 711666381 +4320 99545266 +4319 69298860 +4318 1475260600 +4317 1475191082 +4316 258257473 +4315 1357785294 +4314 453528304 +4313 899932431 +4312 451145469 +4311 933791876 +4310 2001079229 +4309 1376383431 +4308 1868321609 +4307 1751139056 +4306 2117234136 +4305 1368524680 +4304 989215081 +4303 784006479 +4302 292881750 +4301 1021328365 +4300 1726203077 +4299 1390281421 +4298 143781353 +4297 77208028 +4296 1878640256 +4295 211195707 +4294 1614699002 +4293 2022321599 +4292 1558881167 +4291 1385268335 +4290 1383889428 +4289 771837831 +4288 1958525035 +4287 117475306 +4286 1021662778 +4285 1505808689 +4284 906639825 +4283 1667220076 +4282 1046336850 +4281 1222245686 +4280 1212953915 +4279 249940173 +4278 1406632943 +4277 499796928 +4276 761923974 +4275 1333227657 +4274 1075642930 +4273 2115370364 +4272 1205287049 +4271 1050083976 +4270 877547011 +4269 1648995049 +4268 1659124813 +4267 2080069294 +4266 609992674 +4265 2003802305 +4264 799798188 +4263 229430667 +4262 638432171 +4261 787043335 +4260 1574226947 +4259 1266414122 +4258 1897658701 +4257 452716346 +4256 1358319129 +4255 1501926350 +4254 459471839 +4253 1831877787 +4252 454266160 +4251 796396676 +4250 1963096391 +4249 713156987 +4248 1635499847 +4247 73405285 +4246 1571637646 +4245 794037258 +4244 127940608 +4243 25558954 +4242 1237823353 +4241 1703775648 +4240 1538442811 +4239 944961365 +4238 1039002375 +4237 1802806156 +4236 1280271106 +4235 380562006 +4234 1365370134 +4233 12754852 +4232 802687368 +4231 1519501696 +4230 1036868282 +4229 1121510601 +4228 2055578641 +4227 395732351 +4226 2140728154 +4225 1673924990 +4224 1047660189 +4223 1810558811 +4222 2016265044 +4221 1888592821 +4220 1308380477 +4219 1889691105 +4218 1289002989 +4217 841462589 +4216 2092948325 +4215 1546078692 +4214 1703697553 +4213 571648607 +4212 634599790 +4211 292861988 +4210 664773273 +4209 1883120303 +4208 1812173906 +4207 658440368 +4206 437436022 +4205 1267516254 +4204 1725358286 +4203 1993352085 +4202 1123370218 +4201 1828660414 +4200 1611406703 +4199 641135930 +4198 1128266095 +4197 381653651 +4196 1495555810 +4195 330169343 +4194 1805143594 +4193 1306551016 +4192 502178333 +4191 126573938 +4190 599589832 +4189 466917888 +4188 1944226428 +4187 1890407945 +4186 1285248684 +4185 1521299718 +4184 911478901 +4183 1410835565 +4182 2054358982 +4181 898963135 +4180 628171729 +4179 6332905 +4178 1445684281 +4177 544657652 +4176 1080565730 +4175 591567584 +4174 144146035 +4173 2044181520 +4172 381945382 +4171 482234288 +4170 700394319 +4169 1229753051 +4168 1293063768 +4167 798096751 +4166 723993705 +4165 189004794 +4164 1975474658 +4163 1678569655 +4162 706961183 +4161 35260445 +4160 329831158 +4159 856665535 +4158 1329152852 +4157 422926710 +4156 978929043 +4155 2021896767 +4154 1614424384 +4153 12515766 +4152 782663835 +4151 2048026077 +4150 1600762501 +4149 83514077 +4148 1073250823 +4147 854116697 +4146 400511617 +4145 1183867858 +4144 209622202 +4143 1809395395 +4142 1343787200 +4141 1299675979 +4140 1336654167 +4139 2049781216 +4138 505759346 +4137 1104058974 +4136 970105741 +4135 1192907698 +4134 1629527258 +4133 1940214213 +4132 1348738497 +4131 1997779296 +4130 853591240 +4129 2054388096 +4128 2025220140 +4127 1454739733 +4126 955985974 +4125 966413277 +4124 1239232931 +4123 1713881955 +4122 559236913 +4121 699149758 +4120 974775254 +4119 746645804 +4118 1830486108 +4117 2036866613 +4116 644494495 +4115 738599869 +4114 1987564305 +4113 1057429871 +4112 472741228 +4111 1441489632 +4110 793916633 +4109 232595193 +4108 1079675474 +4107 1460335296 +4106 1622015364 +4105 1177375176 +4104 1991652849 +4103 1779231610 +4102 1086622972 +4101 1441834048 +4100 2120042804 +4099 1546335155 +4098 1098402122 +4097 1058806863 +4096 215506802 +4095 1389587667 +4094 407176364 +4093 540083173 +4092 739106701 +4091 1960074756 +4090 1016147298 +4089 1085392289 +4088 102151309 +4087 1091886238 +4086 49302307 +4085 1734548272 +4084 265858641 +4083 546074673 +4082 263513238 +4081 240146035 +4080 361814158 +4079 1481064985 +4078 758063477 +4077 2049783946 +4076 1616166095 +4075 1990267401 +4074 90752204 +4073 549818800 +4072 1806672454 +4071 1687771465 +4070 343431926 +4069 1061235941 +4068 1330828353 +4067 1856298103 +4066 651630499 +4065 1822907277 +4064 650480966 +4063 594585255 +4062 1671419522 +4061 1801198060 +4060 1857923447 +4059 2071744708 +4058 1036089981 +4057 515086685 +4056 826027597 +4055 1650711282 +4054 1471035034 +4053 25712606 +4052 184260515 +4051 929931901 +4050 1629566206 +4049 459513860 +4048 2012382538 +4047 915279723 +4046 1959031742 +4045 1066347294 +4044 183594947 +4043 550464386 +4042 206386874 +4041 745436513 +4040 356943112 +4039 634617470 +4038 409605442 +4037 1655404724 +4036 1205817137 +4035 57045243 +4034 151487754 +4033 996766554 +4032 884145456 +4031 1747158462 +4030 765108078 +4029 1342836761 +4028 1245717111 +4027 1532862347 +4026 1191535299 +4025 800314990 +4024 1466450767 +4023 541103133 +4022 543630048 +4021 1872230303 +4020 1065033011 +4019 714286482 +4018 647965766 +4017 946035243 +4016 731684776 +4015 1408567355 +4014 859960420 +4013 1585642081 +4012 193521274 +4011 1719253052 +4010 335831071 +4009 849022036 +4008 1576283981 +4007 352560198 +4006 1503916969 +4005 209050583 +4004 1320383435 +4003 551812940 +4002 231658475 +4001 1688792343 +4000 501441351 +3999 1379729379 +3998 151301462 +3997 445402120 +3996 66411579 +3995 650432166 +3994 256684942 +3993 1741704112 +3992 1623553770 +3991 1976827214 +3990 1224264537 +3989 118997767 +3988 2130085354 +3987 1386882058 +3986 86074823 +3985 1293526343 +3984 1215046081 +3983 1288191016 +3982 1249811010 +3981 1491982885 +3980 142969071 +3979 2130754521 +3978 1492588715 +3977 1367233397 +3976 1179660411 +3975 952104029 +3974 2124875756 +3973 1779074740 +3972 50371588 +3971 999412744 +3970 1537490881 +3969 56039231 +3968 1313317800 +3967 1648352943 +3966 188717178 +3965 472191115 +3964 1174362044 +3963 427341376 +3962 517439575 +3961 1504556002 +3960 1994225508 +3959 1984866126 +3958 32922944 +3957 836559011 +3956 171835977 +3955 945367455 +3954 43715333 +3953 1870546844 +3952 1145221945 +3951 1266540137 +3950 2146877818 +3949 923219321 +3948 951094109 +3947 540484685 +3946 1389841289 +3945 1548069319 +3944 901732441 +3943 1125463012 +3942 241583859 +3941 2141816005 +3940 1833578592 +3939 2036621585 +3938 2014805700 +3937 841126685 +3936 473990899 +3935 1908859450 +3934 2102235187 +3933 1817289690 +3932 580599516 +3931 680057097 +3930 1471633058 +3929 1157666497 +3928 1813030149 +3927 1235039136 +3926 792843678 +3925 448772781 +3924 1947629158 +3923 924658844 +3922 1871152673 +3921 222002623 +3920 315446027 +3919 1606393133 +3918 1680861680 +3917 1550508438 +3916 1786235892 +3915 264378277 +3914 1306485460 +3913 907400083 +3912 1439368068 +3911 352445921 +3910 127010305 +3909 992451907 +3908 1562630686 +3907 105946250 +3906 886375145 +3905 804184857 +3904 1328259934 +3903 1422178090 +3902 345656631 +3901 1570416667 +3900 1014510595 +3899 236593922 +3898 364822819 +3897 1364257368 +3896 1434893626 +3895 2015668482 +3894 725103755 +3893 1725626535 +3892 609212816 +3891 264759540 +3890 688624591 +3889 912421237 +3888 1967640888 +3887 1416483402 +3886 244022977 +3885 878835809 +3884 972493857 +3883 954039539 +3882 780389778 +3881 446916161 +3880 937298883 +3879 21064055 +3878 106076761 +3877 758445829 +3876 925169963 +3875 1611680703 +3874 458528225 +3873 1905326915 +3872 407667495 +3871 109062709 +3870 1205593848 +3869 1797736875 +3868 949183944 +3867 496637985 +3866 639153613 +3865 1856750739 +3864 1406455665 +3863 460344215 +3862 1037001943 +3861 1844275227 +3860 444602300 +3859 1419624837 +3858 668398260 +3857 1088805079 +3856 443989545 +3855 1437467086 +3854 98446030 +3853 525577696 +3852 16740656 +3851 759325723 +3850 340839399 +3849 178853053 +3848 1243377739 +3847 641879706 +3846 299917604 +3845 1167326696 +3844 1204013208 +3843 349465516 +3842 699733067 +3841 757414268 +3840 1307362413 +3839 708955863 +3838 1158583262 +3837 1239916853 +3836 1237665967 +3835 178809398 +3834 819748795 +3833 1709664086 +3832 15741915 +3831 1764860754 +3830 1175876967 +3829 1503280868 +3828 975635292 +3827 1378414821 +3826 990359049 +3825 2065895496 +3824 1420726430 +3823 1486603955 +3822 184738297 +3821 1985371250 +3820 1663431632 +3819 1846443341 +3818 2026419097 +3817 76051043 +3816 1585350146 +3815 2097935736 +3814 467593628 +3813 446598940 +3812 1189586750 +3811 2138260852 +3810 1746314654 +3809 67445560 +3808 1618773543 +3807 979773864 +3806 420168057 +3805 1675485529 +3804 163067483 +3803 1202371689 +3802 533787119 +3801 659944694 +3800 789225462 +3799 1944945793 +3798 512921819 +3797 1057223443 +3796 2105172039 +3795 1651238742 +3794 1881157199 +3793 1582838828 +3792 1970655971 +3791 485778604 +3790 2106435801 +3789 1587380588 +3788 261093194 +3787 2075967009 +3786 1755941063 +3785 1138751206 +3784 908348985 +3783 476816424 +3782 847767934 +3781 1122141190 +3780 519487309 +3779 766540790 +3778 1794761151 +3777 2090771662 +3776 816706381 +3775 1365280016 +3774 1141698409 +3773 1650606436 +3772 413146226 +3771 736324974 +3770 147022875 +3769 1879485667 +3768 1987257402 +3767 1009166725 +3766 1323549892 +3765 522333211 +3764 1828066419 +3763 1395378595 +3762 1623886675 +3761 383275382 +3760 224685409 +3759 30468791 +3758 1978923173 +3757 1269825636 +3756 1167618024 +3755 1279124639 +3754 290983272 +3753 1933691443 +3752 2104812763 +3751 81227144 +3750 1474863687 +3749 576199294 +3748 2097318057 +3747 429481134 +3746 949073253 +3745 1313583592 +3744 952133790 +3743 405373435 +3742 1503583561 +3741 681144207 +3740 896551219 +3739 1285339797 +3738 555935775 +3737 1464924191 +3736 1328583954 +3735 2075654944 +3734 1045930184 +3733 1444791036 +3732 1170693186 +3731 1593417883 +3730 551835857 +3729 1102343421 +3728 1010334415 +3727 699798534 +3726 978842363 +3725 1381410228 +3724 1321795524 +3723 209756128 +3722 458827756 +3721 1528613468 +3720 131392735 +3719 1045382552 +3718 1774609689 +3717 783734464 +3716 1624830992 +3715 543699817 +3714 1957483679 +3713 270989582 +3712 1656305864 +3711 218243764 +3710 125208432 +3709 1579110676 +3708 2104239491 +3707 627764478 +3706 418994007 +3705 2031276566 +3704 904961758 +3703 1599995948 +3702 892955179 +3701 68349764 +3700 583083468 +3699 1999520970 +3698 123501058 +3697 1776407835 +3696 1525486658 +3695 769086235 +3694 922582472 +3693 1940665703 +3692 78363393 +3691 1560928852 +3690 1901487427 +3689 1495141918 +3688 1568035208 +3687 1230909872 +3686 973734433 +3685 1353841410 +3684 1034877601 +3683 1739239915 +3682 145781150 +3681 77195188 +3680 261487921 +3679 1644927602 +3678 1160116668 +3677 72962925 +3676 1870286368 +3675 966481707 +3674 1138321386 +3673 836611994 +3672 1016912480 +3671 1040917857 +3670 2092332354 +3669 954159281 +3668 474034312 +3667 1501898471 +3666 853825363 +3665 1732304603 +3664 690722841 +3663 1509137268 +3662 39178276 +3661 730705123 +3660 2140377292 +3659 670577555 +3658 521407485 +3657 214193798 +3656 196032270 +3655 1381978166 +3654 1208060260 +3653 957682413 +3652 1477751994 +3651 648337196 +3650 1064562167 +3649 188524996 +3648 1922124882 +3647 193634961 +3646 1082125186 +3645 1033674374 +3644 2097052874 +3643 97403529 +3642 891763287 +3641 62753199 +3640 566883545 +3639 590433883 +3638 100333918 +3637 889213357 +3636 811175629 +3635 1492171743 +3634 1693126326 +3633 2107501366 +3632 1516243624 +3631 1516084369 +3630 209297638 +3629 1926183494 +3628 474545284 +3627 1286912966 +3626 1153617186 +3625 1385833505 +3624 2051709820 +3623 559723064 +3622 2040603894 +3621 1289226998 +3620 873695962 +3619 870927206 +3618 1253883457 +3617 888450508 +3616 244065735 +3615 984721657 +3614 141911086 +3613 2034299675 +3612 1678003632 +3611 301329404 +3610 2109902929 +3609 1825153836 +3608 1926741902 +3607 755645823 +3606 1343570678 +3605 851157911 +3604 2123411767 +3603 177041957 +3602 1898203728 +3601 1737543778 +3600 1041539085 +3599 1069868319 +3598 772566308 +3597 1236195427 +3596 1382686794 +3595 593894122 +3594 1492713259 +3593 762482822 +3592 1833510750 +3591 1169676688 +3590 35343540 +3589 2132729102 +3588 626861471 +3587 269161800 +3586 746539421 +3585 357249708 +3584 1454201672 +3583 1988065330 +3582 2071880393 +3581 2000333444 +3580 522071150 +3579 1354257106 +3578 481583157 +3577 1075583991 +3576 779717704 +3575 1166528721 +3574 1100437830 +3573 385867989 +3572 1282986520 +3571 828335409 +3570 964977470 +3569 1952827305 +3568 1834665173 +3567 178672186 +3566 1890965816 +3565 620203971 +3564 907867020 +3563 323036571 +3562 727139282 +3561 1848265296 +3560 542815217 +3559 1913665388 +3558 1386189680 +3557 269611763 +3556 962443776 +3555 905957739 +3554 432852962 +3553 1601351876 +3552 1465994180 +3551 717623287 +3550 1518750287 +3549 1593970807 +3548 574539402 +3547 1462538084 +3546 2122629808 +3545 393849715 +3544 2031025849 +3543 272102421 +3542 1568374167 +3541 1477642862 +3540 1141153883 +3539 786305284 +3538 61861489 +3537 1214461202 +3536 1418288814 +3535 1567929245 +3534 2040548337 +3533 1207085372 +3532 1927705002 +3531 960957542 +3530 462075615 +3529 273203454 +3528 951221612 +3527 480231941 +3526 1984242448 +3525 1508575548 +3524 1587447206 +3523 1862713323 +3522 82601589 +3521 2019507021 +3520 143083884 +3519 56212203 +3518 1618824646 +3517 180689687 +3516 1578995882 +3515 1850527387 +3514 972959196 +3513 553382987 +3512 1278432186 +3511 782068883 +3510 1415781373 +3509 2074176329 +3508 1515500118 +3507 641415891 +3506 1321396512 +3505 211203442 +3504 1787707891 +3503 1079590795 +3502 745009756 +3501 1654501548 +3500 9735930 +3499 2129327322 +3498 436444653 +3497 1590129712 +3496 1040268383 +3495 121529125 +3494 1425973959 +3493 1715423833 +3492 1719629439 +3491 26389386 +3490 400682375 +3489 2109877845 +3488 624699968 +3487 1915780907 +3486 1355214139 +3485 1025612895 +3484 572095201 +3483 190890313 +3482 1285085261 +3481 1351739504 +3480 1414052413 +3479 774365482 +3478 752779817 +3477 1304296676 +3476 1001191648 +3475 241805717 +3474 1613677333 +3473 133206343 +3472 1069854865 +3471 763166082 +3470 1218056894 +3469 567089866 +3468 1089058939 +3467 314915528 +3466 164155753 +3465 1472328198 +3464 549383334 +3463 1399584573 +3462 1314741458 +3461 1757235242 +3460 1549173065 +3459 632385115 +3458 754663705 +3457 1746570721 +3456 1343685706 +3455 1164323826 +3454 1888011282 +3453 1367839344 +3452 924321548 +3451 510719779 +3450 598959687 +3449 109755737 +3448 1920657482 +3447 510974100 +3446 1838102990 +3445 867985304 +3444 1319434499 +3443 850511251 +3442 1062633097 +3441 502764999 +3440 1821590791 +3439 903141366 +3438 402934113 +3437 1764214389 +3436 1913015842 +3435 912054828 +3434 157586740 +3433 939631740 +3432 1997895155 +3431 682356342 +3430 1002571536 +3429 1950085992 +3428 1436183057 +3427 1737823527 +3426 2006043087 +3425 2123330010 +3424 240002278 +3423 1377291502 +3422 768879657 +3421 814565811 +3420 737545945 +3419 87985587 +3418 419136394 +3417 1052672177 +3416 1339023248 +3415 987591739 +3414 1952835855 +3413 816669500 +3412 1176404107 +3411 159491731 +3410 99830886 +3409 57376402 +3408 1137609171 +3407 1638362933 +3406 1606627649 +3405 973384102 +3404 1061643320 +3403 1622714045 +3402 2084543851 +3401 47809163 +3400 1393656933 +3399 1412231657 +3398 2091526553 +3397 1460336695 +3396 1497821248 +3395 628751584 +3394 1354450353 +3393 1572920115 +3392 639745557 +3391 680894069 +3390 395429416 +3389 1832357416 +3388 896445987 +3387 1579028303 +3386 1247319970 +3385 522353748 +3384 1958671280 +3383 1793344124 +3382 716838613 +3381 1119027705 +3380 1169366207 +3379 608951601 +3378 598232401 +3377 164225069 +3376 576719612 +3375 2131397251 +3374 1036323899 +3373 1013834157 +3372 229057112 +3371 672312194 +3370 103766257 +3369 2080803886 +3368 2061894057 +3367 1462774969 +3366 105886342 +3365 2072384781 +3364 2136489675 +3363 673556283 +3362 1177490699 +3361 954871789 +3360 1931931730 +3359 963884761 +3358 585037446 +3357 374092238 +3356 1767840671 +3355 1601459493 +3354 1952998783 +3353 839643575 +3352 623977917 +3351 107887012 +3350 520795303 +3349 1005141138 +3348 32231989 +3347 614318798 +3346 1275384818 +3345 1710369103 +3344 1902340139 +3343 364011705 +3342 910067900 +3341 295736873 +3340 757901785 +3339 788474936 +3338 1974917544 +3337 2136992924 +3336 1473768941 +3335 1579813706 +3334 894894082 +3333 1181617886 +3332 889108201 +3331 213605937 +3330 369834343 +3329 1557839492 +3328 1343527738 +3327 1131061600 +3326 568577103 +3325 928197096 +3324 977481576 +3323 1845111771 +3322 318848271 +3321 1766320426 +3320 75655023 +3319 2053960153 +3318 1877239968 +3317 469346534 +3316 859462306 +3315 911373113 +3314 800301203 +3313 1606603266 +3312 1753593568 +3311 121592963 +3310 468302977 +3309 768392509 +3308 1462189643 +3307 395103838 +3306 1242098842 +3305 292151055 +3304 690705505 +3303 681288144 +3302 811783543 +3301 1478752357 +3300 1017561847 +3299 1386256390 +3298 989262388 +3297 415330642 +3296 153580024 +3295 870948980 +3294 609348824 +3293 1358644798 +3292 1769456748 +3291 412371766 +3290 2036564106 +3289 1753792137 +3288 1194497847 +3287 965866855 +3286 1816528979 +3285 1400342688 +3284 1305263193 +3283 678708239 +3282 1138300289 +3281 985201059 +3280 806886968 +3279 73199139 +3278 1673777315 +3277 1170038588 +3276 1851881980 +3275 560810697 +3274 1627851159 +3273 1359436796 +3272 1811209945 +3271 1573010801 +3270 489489968 +3269 602231204 +3268 1232676366 +3267 118313408 +3266 1953465466 +3265 942418874 +3264 1248975880 +3263 196977058 +3262 1469564340 +3261 15664611 +3260 1365357567 +3259 1070697250 +3258 2084746806 +3257 1941638806 +3256 1808087310 +3255 1137820739 +3254 262042399 +3253 320062134 +3252 2019304919 +3251 1065101150 +3250 1458907392 +3249 1784332028 +3248 368800806 +3247 1112966617 +3246 1689671076 +3245 492445184 +3244 897084400 +3243 54840358 +3242 869946828 +3241 1208978741 +3240 340334434 +3239 371176560 +3238 796249386 +3237 290257492 +3236 1016821175 +3235 1756488407 +3234 1620338182 +3233 1233311269 +3232 979103139 +3231 398867089 +3230 78401453 +3229 1571202408 +3228 1410093588 +3227 946926066 +3226 1679596407 +3225 1488025176 +3224 1265999468 +3223 1344424897 +3222 1008638390 +3221 234972890 +3220 696300343 +3219 345940774 +3218 94660952 +3217 2023839270 +3216 215882217 +3215 1634830718 +3214 1769982004 +3213 1835589307 +3212 1861989572 +3211 498770267 +3210 412729354 +3209 50076942 +3208 1501839033 +3207 1187244627 +3206 817402958 +3205 1930993554 +3204 777385268 +3203 1221471092 +3202 1154909816 +3201 1555384379 +3200 1136257149 +3199 1278959034 +3198 2039089649 +3197 2069552059 +3196 1828410246 +3195 335171509 +3194 479386786 +3193 1031026578 +3192 648124554 +3191 662697615 +3190 140311938 +3189 819944721 +3188 130058557 +3187 607313882 +3186 253857266 +3185 527776558 +3184 1920324794 +3183 1271211736 +3182 1422859952 +3181 1811912630 +3180 1144414882 +3179 1372968375 +3178 1380157631 +3177 1718329127 +3176 409859359 +3175 1743415514 +3174 776083737 +3173 1369484537 +3172 85213943 +3171 2023434430 +3170 1663778377 +3169 1214188738 +3168 1598032436 +3167 1703918140 +3166 1590165273 +3165 797383668 +3164 1834530603 +3163 1964172819 +3162 890714639 +3161 1975663481 +3160 532639058 +3159 1680481704 +3158 566087454 +3157 1749765646 +3156 834472736 +3155 1130129178 +3154 1252400254 +3153 108412164 +3152 126796854 +3151 49891577 +3150 431754998 +3149 1573569403 +3148 963109016 +3147 1784225765 +3146 942245389 +3145 1187858470 +3144 1658201571 +3143 900132955 +3142 1853189807 +3141 1018508853 +3140 425401993 +3139 2107343885 +3138 1771507113 +3137 800648768 +3136 2016871184 +3135 1773476102 +3134 2054152676 +3133 2006350770 +3132 1431533760 +3131 1357716583 +3130 1409576026 +3129 930357060 +3128 846008968 +3127 1583441924 +3126 497365392 +3125 726060572 +3124 1003332324 +3123 1202508677 +3122 1824140813 +3121 700711098 +3120 1234266208 +3119 795012881 +3118 631324014 +3117 1922734194 +3116 126024194 +3115 42112434 +3114 1482152310 +3113 639692718 +3112 474730962 +3111 1893329570 +3110 1394485388 +3109 1772236873 +3108 90472701 +3107 2145514659 +3106 893979740 +3105 10520414 +3104 341942341 +3103 696436093 +3102 596774744 +3101 501176700 +3100 511707614 +3099 1973617750 +3098 432991667 +3097 119948396 +3096 580109600 +3095 1442340363 +3094 1049403406 +3093 302621225 +3092 2115726116 +3091 1029127932 +3090 69387084 +3089 1459015662 +3088 668988686 +3087 589211580 +3086 440581884 +3085 1633815124 +3084 1714865120 +3083 1736306388 +3082 1392690978 +3081 849977737 +3080 1802856869 +3079 1396454377 +3078 878257133 +3077 79952287 +3076 1803572317 +3075 197543646 +3074 1561229318 +3073 1988249289 +3072 184728479 +3071 770640642 +3070 68185033 +3069 391759218 +3068 1393508149 +3067 1138134952 +3066 1218028638 +3065 277488375 +3064 1474097895 +3063 20275474 +3062 233234141 +3061 656710454 +3060 360139246 +3059 1627659152 +3058 1018433778 +3057 1182657210 +3056 1021830108 +3055 851759143 +3054 241124146 +3053 864887383 +3052 2080933167 +3051 2143720249 +3050 2119204252 +3049 1722904582 +3048 1740365707 +3047 680713486 +3046 666206617 +3045 1962806676 +3044 12815167 +3043 790588676 +3042 1920064256 +3041 1940452909 +3040 1524616140 +3039 1077533729 +3038 1321214228 +3037 1116019774 +3036 1811520705 +3035 1197753164 +3034 44254234 +3033 817387440 +3032 1807619876 +3031 753058636 +3030 1785760324 +3029 1324965684 +3028 605829044 +3027 166674634 +3026 941533063 +3025 156942725 +3024 918309624 +3023 244887545 +3022 893166779 +3021 358028585 +3020 403354541 +3019 1438490765 +3018 1056697965 +3017 1925042679 +3016 667898319 +3015 2023101589 +3014 42742420 +3013 219845906 +3012 1413456183 +3011 842530527 +3010 619238681 +3009 408596366 +3008 1413496672 +3007 123461064 +3006 1071765540 +3005 994133264 +3004 1537616936 +3003 1438679245 +3002 1179110764 +3001 482654192 +3000 147229592 +2999 1619085690 +2998 383432620 +2997 448886319 +2996 1395848658 +2995 696645518 +2994 1411259594 +2993 560281038 +2992 1989016652 +2991 1602159661 +2990 1448814268 +2989 625795510 +2988 770592446 +2987 1181080024 +2986 1882300258 +2985 448052412 +2984 609645405 +2983 1347695541 +2982 1748090873 +2981 1004859817 +2980 1576517503 +2979 495777617 +2978 1484314473 +2977 419363407 +2976 733327776 +2975 1780569943 +2974 1962506148 +2973 1054962744 +2972 1291449653 +2971 1707508722 +2970 99221571 +2969 1845826920 +2968 223237031 +2967 1834270750 +2966 1185110373 +2965 835567620 +2964 855112514 +2963 1956583580 +2962 1258950418 +2961 1363221141 +2960 831567215 +2959 267734244 +2958 890978900 +2957 322540034 +2956 571434618 +2955 534604717 +2954 847445187 +2953 1752269236 +2952 1918661686 +2951 1252313256 +2950 1668028992 +2949 1157154095 +2948 1909933489 +2947 1851228178 +2946 604340907 +2945 1825848680 +2944 489120289 +2943 254997426 +2942 955741172 +2941 1593106381 +2940 1484271690 +2939 412434469 +2938 660716547 +2937 1535153059 +2936 979158236 +2935 1376010441 +2934 1724100850 +2933 1639375020 +2932 1125016365 +2931 991216173 +2930 472242241 +2929 509027181 +2928 1843783274 +2927 356374183 +2926 1622578495 +2925 966649030 +2924 763426678 +2923 1742615578 +2922 84240244 +2921 761507591 +2920 1489863415 +2919 1964284461 +2918 552813188 +2917 84084809 +2916 1362107889 +2915 349343480 +2914 870107507 +2913 1043497556 +2912 918209384 +2911 543306703 +2910 932389834 +2909 2096602279 +2908 1580759880 +2907 1432189754 +2906 1958535857 +2905 1487266864 +2904 250994075 +2903 732884676 +2902 1167132779 +2901 615989184 +2900 1294916547 +2899 115868058 +2898 1033932334 +2897 877134243 +2896 1740431152 +2895 2027446564 +2894 882408786 +2893 1919087 +2892 252752163 +2891 267439430 +2890 208694402 +2889 1405778606 +2888 602176572 +2887 203469708 +2886 1361460949 +2885 318610332 +2884 1578617744 +2883 326800804 +2882 111107722 +2881 969090753 +2880 1110030471 +2879 1647683728 +2878 138066421 +2877 93493016 +2876 1181195678 +2875 1225651181 +2874 320134085 +2873 1782488539 +2872 1585451777 +2871 1051264720 +2870 1729540498 +2869 417782304 +2868 522920554 +2867 1153969417 +2866 2142209105 +2865 1738512065 +2864 1774694401 +2863 614969356 +2862 1940708333 +2861 994457204 +2860 1812746506 +2859 5224694 +2858 44317657 +2857 283566240 +2856 772335611 +2855 1034660145 +2854 207502610 +2853 609526991 +2852 1364253981 +2851 610907642 +2850 831024331 +2849 1016537454 +2848 466488049 +2847 1059898888 +2846 1920842579 +2845 1546190787 +2844 1787683052 +2843 1416353012 +2842 52948040 +2841 1167669473 +2840 528344166 +2839 575571081 +2838 423056847 +2837 931892137 +2836 1526758664 +2835 1527239749 +2834 1945287380 +2833 780237197 +2832 949706498 +2831 1935483638 +2830 950139547 +2829 1529180266 +2828 1380372731 +2827 1157141159 +2826 76063630 +2825 162808620 +2824 1817889812 +2823 1744078615 +2822 1925986308 +2821 347716526 +2820 144419593 +2819 1918609091 +2818 1243178523 +2817 1067780910 +2816 1419699484 +2815 504489567 +2814 1493242747 +2813 620013579 +2812 888008846 +2811 1624860607 +2810 744612626 +2809 1743935677 +2808 1196296065 +2807 1043300746 +2806 1134088405 +2805 746521467 +2804 577533251 +2803 9803741 +2802 1977581297 +2801 1568009880 +2800 555110907 +2799 1940482036 +2798 1453116636 +2797 1217564111 +2796 1486734995 +2795 479468662 +2794 384305960 +2793 1470173286 +2792 1599659022 +2791 7377217 +2790 1252021651 +2789 1224122331 +2788 498909606 +2787 738688956 +2786 1722021811 +2785 799685905 +2784 1763964369 +2783 2015865787 +2782 2022884601 +2781 1291556816 +2780 428564542 +2779 1848795528 +2778 609847272 +2777 449774598 +2776 465767495 +2775 1124284663 +2774 916423817 +2773 1157007019 +2772 1602176482 +2771 37099261 +2770 114893244 +2769 1485030444 +2768 453747041 +2767 973647973 +2766 833258151 +2765 16561709 +2764 1027293288 +2763 376928743 +2762 218151634 +2761 375536691 +2760 1655951258 +2759 513332695 +2758 1649584168 +2757 1846707349 +2756 1122208235 +2755 1853639671 +2754 924284952 +2753 472407552 +2752 1587301245 +2751 174089073 +2750 681709544 +2749 2126273592 +2748 1383028033 +2747 1633046257 +2746 1680834428 +2745 1456244124 +2744 1669591829 +2743 879324556 +2742 1042113775 +2741 117146037 +2740 1730835868 +2739 1288728918 +2738 651772293 +2737 437185332 +2736 2093838333 +2735 456329408 +2734 1945893722 +2733 651756596 +2732 868461132 +2731 1852302587 +2730 873436171 +2729 1956727557 +2728 1538608108 +2727 1943428144 +2726 922422396 +2725 649800682 +2724 266338426 +2723 750195879 +2722 1938181656 +2721 1608511300 +2720 938544688 +2719 1196146935 +2718 445439164 +2717 2074267557 +2716 2110938075 +2715 801509872 +2714 414130349 +2713 1552445792 +2712 1295972335 +2711 1900868504 +2710 1612857392 +2709 1293650536 +2708 1342374233 +2707 195442885 +2706 638775257 +2705 1442081737 +2704 1735351923 +2703 93591135 +2702 1925804073 +2701 1059217223 +2700 313694478 +2699 1077491675 +2698 1034305161 +2697 888807426 +2696 1677089718 +2695 172226517 +2694 859102674 +2693 805310774 +2692 1959134839 +2691 742034721 +2690 1163072136 +2689 1011760779 +2688 1232692507 +2687 1791412939 +2686 1660137208 +2685 558492283 +2684 1653021185 +2683 660745492 +2682 2087072048 +2681 2321799 +2680 558494271 +2679 1417414506 +2678 654875279 +2677 2047776144 +2676 607574610 +2675 545184122 +2674 1663761312 +2673 676134700 +2672 1927380305 +2671 848312398 +2670 24912062 +2669 1572370700 +2668 1547885605 +2667 862078644 +2666 29704752 +2665 871778944 +2664 360575325 +2663 117067952 +2662 1789722285 +2661 947374060 +2660 1656825862 +2659 1519142845 +2658 1499107219 +2657 674200224 +2656 138391754 +2655 999391715 +2654 618903883 +2653 1650699386 +2652 102251221 +2651 669657541 +2650 1494930168 +2649 658201775 +2648 809839896 +2647 109691157 +2646 384014832 +2645 2078923557 +2644 765287465 +2643 815448914 +2642 651222638 +2641 355009604 +2640 1447910441 +2639 1310317066 +2638 1542665948 +2637 676106661 +2636 501503318 +2635 2060120447 +2634 1229540306 +2633 1560684913 +2632 607725738 +2631 270579440 +2630 1595750489 +2629 982625638 +2628 1380751090 +2627 499715503 +2626 55296340 +2625 635176016 +2624 897140494 +2623 2096729990 +2622 155769218 +2621 1591533093 +2620 2007301293 +2619 1385239011 +2618 274186943 +2617 878399987 +2616 1491887340 +2615 1716049566 +2614 1427700919 +2613 410277860 +2612 1515022121 +2611 1488389220 +2610 959827304 +2609 771803780 +2608 808813747 +2607 1630029149 +2606 1594050002 +2605 1088302053 +2604 1452394709 +2603 958960866 +2602 2112418071 +2601 1772583748 +2600 1037311998 +2599 1096034986 +2598 927329297 +2597 745575074 +2596 1750058657 +2595 106049998 +2594 479406798 +2593 1453091049 +2592 89428697 +2591 918013855 +2590 1317346150 +2589 1128901306 +2588 2040835319 +2587 705621025 +2586 1598182716 +2585 1081609479 +2584 201027445 +2583 2086795346 +2582 1597934204 +2581 743218341 +2580 679575473 +2579 1477281803 +2578 1325237425 +2577 1867995342 +2576 177634440 +2575 635089136 +2574 1123367630 +2573 1827294608 +2572 2069132516 +2571 1016383085 +2570 845254451 +2569 291736924 +2568 1493459977 +2567 821279299 +2566 266168275 +2565 296967608 +2564 16621301 +2563 1708876591 +2562 135744899 +2561 1108011039 +2560 1024662184 +2559 611725124 +2558 1678202238 +2557 959225839 +2556 504593580 +2555 1658871017 +2554 1631158923 +2553 1605292752 +2552 1407219873 +2551 120652401 +2550 1565464563 +2549 959063779 +2548 1299647363 +2547 690148289 +2546 744627712 +2545 497823479 +2544 713440268 +2543 106984544 +2542 982040157 +2541 1777395592 +2540 1670406756 +2539 23975152 +2538 25568648 +2537 1196492369 +2536 804657997 +2535 704775332 +2534 161222709 +2533 1056093910 +2532 684214407 +2531 1671503422 +2530 1577292449 +2529 65436344 +2528 107131544 +2527 19331220 +2526 1475550564 +2525 1046784476 +2524 251651144 +2523 1510506521 +2522 39828188 +2521 448156094 +2520 968488686 +2519 875316274 +2518 214436067 +2517 801823883 +2516 2124191668 +2515 637643167 +2514 1663266970 +2513 1083528324 +2512 584061436 +2511 958065005 +2510 1751826943 +2509 473914387 +2508 1366800802 +2507 1468276964 +2506 1035269660 +2505 1896047735 +2504 20560924 +2503 637202934 +2502 1626285109 +2501 618778063 +2500 1564371878 +2499 1557961228 +2498 737369428 +2497 1207830715 +2496 1915163724 +2495 2112527691 +2494 1006956288 +2493 1950978697 +2492 542017835 +2491 1311995562 +2490 233720027 +2489 166664803 +2488 898608254 +2487 1724276547 +2486 1286040561 +2485 1040663344 +2484 53581731 +2483 705201964 +2482 1479185029 +2481 110147048 +2480 1738747851 +2479 283549979 +2478 1586128375 +2477 1618236715 +2476 1447716040 +2475 398066725 +2474 269762625 +2473 1549266509 +2472 1220314704 +2471 68323881 +2470 2028892283 +2469 356541163 +2468 1790281152 +2467 772325385 +2466 200874427 +2465 2111668675 +2464 1570509856 +2463 1842444374 +2462 1717258670 +2461 375353032 +2460 413387308 +2459 656927128 +2458 1028107889 +2457 2005428558 +2456 1670694816 +2455 580838597 +2454 1708961963 +2453 2090918331 +2452 1113937761 +2451 1195635050 +2450 671502321 +2449 120511135 +2448 983317587 +2447 1188061650 +2446 1348474090 +2445 2045933178 +2444 1325235669 +2443 201438744 +2442 1667857874 +2441 863773541 +2440 425526377 +2439 1256566898 +2438 155666735 +2437 1826096125 +2436 1349299177 +2435 505913701 +2434 394410005 +2433 1195156824 +2432 1429057066 +2431 1060331542 +2430 1494728790 +2429 555442398 +2428 1133715960 +2427 447269292 +2426 296466595 +2425 1727260133 +2424 1614384483 +2423 513326913 +2422 1419416010 +2421 993426626 +2420 212317463 +2419 1630924319 +2418 919520693 +2417 1084868056 +2416 2010309628 +2415 1147035345 +2414 378075304 +2413 461462128 +2412 1923396015 +2411 411290976 +2410 708106805 +2409 746913900 +2408 2054751369 +2407 1797236682 +2406 1431686120 +2405 154142353 +2404 1224340283 +2403 1481562111 +2402 1847911681 +2401 873614668 +2400 2074099230 +2399 1047459498 +2398 258975803 +2397 1553939475 +2396 980368457 +2395 1930623330 +2394 307844123 +2393 620957857 +2392 301009450 +2391 1935975339 +2390 73905932 +2389 1274933054 +2388 1768098338 +2387 1919968996 +2386 706792752 +2385 1548847500 +2384 1371122978 +2383 2114267975 +2382 1900838971 +2381 1176482115 +2380 504023255 +2379 1058353771 +2378 1462711428 +2377 1900609016 +2376 572896398 +2375 2097607657 +2374 453714319 +2373 350725615 +2372 1554946529 +2371 800452183 +2370 614638865 +2369 520159755 +2368 67091041 +2367 475836121 +2366 1246095352 +2365 359410599 +2364 1629613880 +2363 519352432 +2362 547051925 +2361 1173560043 +2360 167877000 +2359 301420584 +2358 568140302 +2357 219250838 +2356 548846018 +2355 740008425 +2354 1795492177 +2353 194640862 +2352 1610244720 +2351 842485199 +2350 1861254335 +2349 750897887 +2348 485457373 +2347 1512587419 +2346 1446894696 +2345 222170783 +2344 542661128 +2343 1800745784 +2342 1883570398 +2341 1034786774 +2340 733361142 +2339 138802744 +2338 1421548051 +2337 1855164089 +2336 993705889 +2335 726742920 +2334 1959842322 +2333 456053836 +2332 351475431 +2331 245631340 +2330 605419741 +2329 2096109810 +2328 1900058214 +2327 1975615525 +2326 571242309 +2325 354205155 +2324 1277247353 +2323 953006977 +2322 480870175 +2321 859346832 +2320 357027826 +2319 348666916 +2318 1451486839 +2317 263286590 +2316 969926291 +2315 1793632560 +2314 486084032 +2313 1655358002 +2312 1067384641 +2311 1744767654 +2310 1760722371 +2309 1025680701 +2308 1292580503 +2307 694805131 +2306 2042805415 +2305 537652052 +2304 375267488 +2303 1714210982 +2302 1998117743 +2301 402849269 +2300 493056774 +2299 777287864 +2298 1524867500 +2297 1545853059 +2296 698368172 +2295 1765718980 +2294 2020818628 +2293 417900520 +2292 595979151 +2291 132203258 +2290 1555343641 +2289 93741236 +2288 1526224273 +2287 1805337926 +2286 1924686205 +2285 1462051937 +2284 726247919 +2283 888800026 +2282 2042119279 +2281 41703940 +2280 452187151 +2279 1065917240 +2278 1130358934 +2277 754928450 +2276 319537642 +2275 328594433 +2274 687017957 +2273 2119901867 +2272 1221154208 +2271 1220829878 +2270 1025465417 +2269 1094687363 +2268 78919692 +2267 1906632168 +2266 1672518078 +2265 280467651 +2264 1169739829 +2263 1888615370 +2262 1010040527 +2261 502237914 +2260 753462633 +2259 1897489363 +2258 316538679 +2257 64172336 +2256 1079090007 +2255 1035886179 +2254 1567416306 +2253 684543978 +2252 436612874 +2251 976202039 +2250 1058828654 +2249 1844742349 +2248 746379597 +2247 801764501 +2246 67910493 +2245 347119423 +2244 1254923873 +2243 1613671727 +2242 1094436450 +2241 126466845 +2240 1141910186 +2239 1266316896 +2238 1569652932 +2237 1945935689 +2236 736892339 +2235 1931386356 +2234 1417910772 +2233 667501914 +2232 1135152737 +2231 1260034812 +2230 185699235 +2229 689290296 +2228 818399355 +2227 1428136147 +2226 644239678 +2225 394546029 +2224 599273305 +2223 591214267 +2222 1773198972 +2221 739354173 +2220 229822441 +2219 257064153 +2218 1776831856 +2217 399260174 +2216 1694324276 +2215 601722414 +2214 1400166621 +2213 1128457028 +2212 471761541 +2211 1975603201 +2210 704297560 +2209 1343458145 +2208 529424557 +2207 1785750224 +2206 528024916 +2205 69390425 +2204 796233619 +2203 157875960 +2202 481802679 +2201 445862440 +2200 441635456 +2199 905046736 +2198 45050618 +2197 423853326 +2196 828862842 +2195 53025411 +2194 768830705 +2193 2007402779 +2192 361391825 +2191 1516134818 +2190 1110005965 +2189 1978045915 +2188 710223525 +2187 1175109442 +2186 1146577200 +2185 565867248 +2184 129960873 +2183 1572047068 +2182 424159467 +2181 1275787044 +2180 1446178644 +2179 1066030984 +2178 815433228 +2177 460034132 +2176 989516604 +2175 370148956 +2174 1735071394 +2173 350371179 +2172 1863724152 +2171 1724239591 +2170 400811822 +2169 17782130 +2168 76183893 +2167 2139508854 +2166 1802506269 +2165 968943711 +2164 1839117234 +2163 1400179534 +2162 897396814 +2161 530829558 +2160 805911293 +2159 2082380171 +2158 831468715 +2157 144356277 +2156 1045148569 +2155 1722013780 +2154 141707780 +2153 1001657477 +2152 125868423 +2151 1505612131 +2150 460353815 +2149 986144512 +2148 76514380 +2147 445284272 +2146 872446386 +2145 639145425 +2144 653908452 +2143 10831803 +2142 2097043004 +2141 1845942022 +2140 1648055697 +2139 408786616 +2138 362759508 +2137 1254723830 +2136 300391620 +2135 402326735 +2134 71546897 +2133 1308287676 +2132 594268241 +2131 962500290 +2130 1846844491 +2129 661555015 +2128 1037231602 +2127 1256938582 +2126 2648497 +2125 43491092 +2124 1596145357 +2123 783579297 +2122 541303661 +2121 1287207559 +2120 1429097751 +2119 15069543 +2118 113698126 +2117 1584852602 +2116 1938859468 +2115 861614583 +2114 689586069 +2113 955450078 +2112 510259753 +2111 1688256388 +2110 1483182513 +2109 393331867 +2108 108394995 +2107 2107916421 +2106 1183176933 +2105 1139587592 +2104 1955542141 +2103 1256530254 +2102 1608926833 +2101 2080196874 +2100 2072752336 +2099 589905908 +2098 658906518 +2097 993740510 +2096 1808276873 +2095 1366552847 +2094 1649671078 +2093 308937798 +2092 1501965194 +2091 526234118 +2090 1173509432 +2089 1991728796 +2088 223693722 +2087 1399567191 +2086 895266533 +2085 983409390 +2084 351354829 +2083 1148813328 +2082 1619751212 +2081 116927886 +2080 1579861393 +2079 1522749740 +2078 1357638581 +2077 1116291051 +2076 152374280 +2075 2074130327 +2074 1678144407 +2073 2022828915 +2072 1331261566 +2071 1019020924 +2070 1421290355 +2069 1079011825 +2068 929112683 +2067 1439837319 +2066 1491553080 +2065 1499339075 +2064 2012071301 +2063 1123436960 +2062 1282912013 +2061 1657720046 +2060 302540396 +2059 1921425889 +2058 1096462263 +2057 1387767980 +2056 1048212362 +2055 1893936853 +2054 1511141826 +2053 234426943 +2052 1716435583 +2051 97001472 +2050 906772953 +2049 463570342 +2048 1370375460 +2047 1430991902 +2046 1585630291 +2045 277029012 +2044 742868760 +2043 659123483 +2042 601538560 +2041 252249741 +2040 89908241 +2039 2128936684 +2038 1734942393 +2037 1577257255 +2036 1575249666 +2035 368116120 +2034 216427062 +2033 354351255 +2032 820896564 +2031 1508969772 +2030 561257783 +2029 1062256064 +2028 873213527 +2027 1350009058 +2026 2024109802 +2025 813785419 +2024 177501269 +2023 1414140353 +2022 1475137638 +2021 1252865241 +2020 874109660 +2019 1623264698 +2018 1025423698 +2017 1093346447 +2016 688123142 +2015 926506808 +2014 1822974100 +2013 490619019 +2012 569215241 +2011 620085523 +2010 664790995 +2009 660134634 +2008 553687018 +2007 1366826273 +2006 1360830193 +2005 1220898411 +2004 1694703204 +2003 854940937 +2002 1940577120 +2001 1906124148 +2000 635756245 +1999 1358732373 +1998 1185629910 +1997 59428108 +1996 1172507788 +1995 609969448 +1994 1486131429 +1993 1072119676 +1992 540030693 +1991 1999356587 +1990 227441543 +1989 1928246861 +1988 935141556 +1987 98916890 +1986 1417855995 +1985 197504122 +1984 357291567 +1983 1202888577 +1982 1973311672 +1981 2056564255 +1980 66398505 +1979 1445448370 +1978 1446788088 +1977 1480272255 +1976 1819606717 +1975 505889256 +1974 1427804939 +1973 1936062704 +1972 219184692 +1971 581844747 +1970 720494238 +1969 576328137 +1968 186224584 +1967 575660461 +1966 720780327 +1965 100388112 +1964 69938755 +1963 1634258489 +1962 844678133 +1961 759267480 +1960 1064215031 +1959 128524653 +1958 510390866 +1957 737637434 +1956 1889108971 +1955 214967418 +1954 371676098 +1953 448210959 +1952 1136490072 +1951 527863302 +1950 609776167 +1949 733609897 +1948 1773325300 +1947 940898832 +1946 52467316 +1945 2031027661 +1944 286704564 +1943 845960192 +1942 1215568466 +1941 1790340202 +1940 395620162 +1939 144833776 +1938 2003031458 +1937 85836472 +1936 505721706 +1935 1234005485 +1934 1403193627 +1933 1458154923 +1932 570043458 +1931 716153480 +1930 248876614 +1929 326577597 +1928 386899330 +1927 295423448 +1926 365961335 +1925 1440898011 +1924 1225960994 +1923 1991296444 +1922 1985918440 +1921 402880174 +1920 902021649 +1919 1816360982 +1918 681142581 +1917 1889781287 +1916 654194268 +1915 1353990772 +1914 815459195 +1913 643848009 +1912 450340029 +1911 1070734689 +1910 1934792392 +1909 309783690 +1908 1786595718 +1907 769025973 +1906 830126492 +1905 1195050430 +1904 663962027 +1903 687040147 +1902 1209278309 +1901 243465861 +1900 329254150 +1899 2100936814 +1898 2108099909 +1897 1093484966 +1896 1216946102 +1895 522148539 +1894 1602463219 +1893 823080819 +1892 1089274795 +1891 169557458 +1890 1869221241 +1889 1159724010 +1888 1162166714 +1887 1474635456 +1886 1074322091 +1885 10346259 +1884 903650743 +1883 1892208154 +1882 856539265 +1881 140556339 +1880 1431622619 +1879 1165766419 +1878 1627140846 +1877 591545288 +1876 105063946 +1875 143086345 +1874 2133255769 +1873 420496165 +1872 357785997 +1871 1255825143 +1870 282849600 +1869 1383252831 +1868 883990712 +1867 1585951370 +1866 1638505395 +1865 393865282 +1864 1580357392 +1863 1432905761 +1862 1101343226 +1861 2077034432 +1860 1154874392 +1859 394585785 +1858 85401919 +1857 1151820455 +1856 570984713 +1855 1329597585 +1854 1301290641 +1853 763094404 +1852 460585535 +1851 1838256494 +1850 660899141 +1849 840077331 +1848 1060702473 +1847 1484054501 +1846 605773167 +1845 1832051428 +1844 1932783995 +1843 877430625 +1842 137646565 +1841 1122016814 +1840 371834431 +1839 844381877 +1838 1892231084 +1837 490125429 +1836 5593978 +1835 205599634 +1834 1440005704 +1833 1650806607 +1832 278031369 +1831 706757441 +1830 1991632513 +1829 3053937 +1828 1971084719 +1827 903287981 +1826 1998013461 +1825 1955373957 +1824 869012050 +1823 1610517795 +1822 102195263 +1821 1767991852 +1820 777554021 +1819 1324328288 +1818 234304164 +1817 1376134692 +1816 1698754153 +1815 1875826189 +1814 1694404863 +1813 810767181 +1812 505596194 +1811 1440748336 +1810 1377269378 +1809 2029192650 +1808 838787899 +1807 1686631449 +1806 1197603373 +1805 502271019 +1804 2075051913 +1803 733248263 +1802 1806657742 +1801 274977432 +1800 883156369 +1799 1088344532 +1798 152524123 +1797 15710762 +1796 34275931 +1795 387495666 +1794 1853178694 +1793 1248503846 +1792 832963773 +1791 925350623 +1790 1533687688 +1789 1548902977 +1788 1773057782 +1787 505961622 +1786 1829213477 +1785 887986972 +1784 1370229995 +1783 253656527 +1782 1580981451 +1781 623887192 +1780 601960437 +1779 1838121576 +1778 831589277 +1777 336516880 +1776 1759063184 +1775 464355109 +1774 843096925 +1773 1800074481 +1772 1997575542 +1771 718313210 +1770 122453308 +1769 867445607 +1768 1054068601 +1767 1912512105 +1766 310015715 +1765 933255732 +1764 1702015541 +1763 927828071 +1762 1862299806 +1761 1431544444 +1760 1299776488 +1759 1027726065 +1758 1867173147 +1757 885070810 +1756 1283215275 +1755 1575556950 +1754 1454489168 +1753 746342803 +1752 1799179738 +1751 1890343523 +1750 1939781563 +1749 265443557 +1748 79058392 +1747 367234167 +1746 1640903603 +1745 2106472350 +1744 614263215 +1743 124783715 +1742 1677621173 +1741 1130129934 +1740 1811728257 +1739 357424851 +1738 557429892 +1737 120812868 +1736 210496564 +1735 1529671292 +1734 1218439574 +1733 270471096 +1732 1775535231 +1731 834573741 +1730 1711854945 +1729 414705678 +1728 1891994438 +1727 291616197 +1726 1578065290 +1725 536872471 +1724 1923860860 +1723 1711629293 +1722 954044888 +1721 1533736181 +1720 1811285130 +1719 1572547395 +1718 772023602 +1717 120069690 +1716 1900454600 +1715 1516119888 +1714 428851177 +1713 1631616929 +1712 460539106 +1711 1320196321 +1710 572700042 +1709 1690915388 +1708 146928287 +1707 1175242248 +1706 1049856942 +1705 2087509115 +1704 1901619709 +1703 383865833 +1702 706099799 +1701 1360829553 +1700 1090062950 +1699 1420238748 +1698 984124036 +1697 1355121967 +1696 515238984 +1695 2013919644 +1694 1730311231 +1693 390124679 +1692 2047827811 +1691 1528981141 +1690 761712579 +1689 1691215440 +1688 1819576443 +1687 1403387362 +1686 1838702160 +1685 268837671 +1684 1055580782 +1683 1256138504 +1682 1058916886 +1681 917107365 +1680 1173268034 +1679 1544941442 +1678 641058446 +1677 206902820 +1676 1421106187 +1675 665991109 +1674 1381409316 +1673 540790156 +1672 1441286530 +1671 1433344699 +1670 376705517 +1669 1882424631 +1668 904999763 +1667 1117688039 +1666 1772294384 +1665 125114305 +1664 2113575481 +1663 201330090 +1662 1775895748 +1661 356612370 +1660 1856888345 +1659 1505808865 +1658 1999996928 +1657 1550738772 +1656 347806580 +1655 582563656 +1654 1357404432 +1653 138473416 +1652 82870470 +1651 1661459092 +1650 276048919 +1649 966365214 +1648 123835255 +1647 2122550984 +1646 972977152 +1645 880316031 +1644 1372188227 +1643 2095548264 +1642 164084639 +1641 1706345547 +1640 528344936 +1639 1406501125 +1638 110130247 +1637 779885458 +1636 1151596206 +1635 1570964294 +1634 496702204 +1633 1756963111 +1632 491925392 +1631 270086883 +1630 504099090 +1629 306149573 +1628 1158002285 +1627 1417433271 +1626 193334340 +1625 209333163 +1624 499693186 +1623 1843428988 +1622 2009908145 +1621 1263988904 +1620 1537623836 +1619 300981583 +1618 2140871710 +1617 1391002872 +1616 750362757 +1615 1024912535 +1614 716231392 +1613 1813326328 +1612 1567203328 +1611 905067161 +1610 1596215299 +1609 1895943125 +1608 254904919 +1607 686649601 +1606 283183254 +1605 1542116743 +1604 1079038901 +1603 226615321 +1602 1252864020 +1601 185775819 +1600 1259568246 +1599 1234149467 +1598 112815233 +1597 948669121 +1596 917740085 +1595 497388999 +1594 346908666 +1593 1383187930 +1592 305805152 +1591 1708926562 +1590 1270600842 +1589 146620964 +1588 1698102473 +1587 1115959174 +1586 674771480 +1585 1084520077 +1584 1605192855 +1583 1958647878 +1582 217111028 +1581 1818743851 +1580 650162242 +1579 909565698 +1578 1612759871 +1577 860271824 +1576 1755094348 +1575 56567933 +1574 289252722 +1573 893263082 +1572 1114530722 +1571 18714553 +1570 72960586 +1569 310899125 +1568 316409382 +1567 1762909881 +1566 601760455 +1565 1682035802 +1564 191583847 +1563 785465752 +1562 112587088 +1561 159184188 +1560 10824088 +1559 154641667 +1558 1619333131 +1557 613582396 +1556 1658249967 +1555 863607250 +1554 867409049 +1553 1933932652 +1552 1308485636 +1551 1455028978 +1550 205983979 +1549 1937374065 +1548 1301954998 +1547 1556191938 +1546 571019102 +1545 861831266 +1544 1089520858 +1543 270538169 +1542 820302495 +1541 803631597 +1540 1849788819 +1539 457534353 +1538 1856622318 +1537 781857227 +1536 1571326034 +1535 1963778350 +1534 1569448714 +1533 32399659 +1532 774641664 +1531 2105429069 +1530 687334704 +1529 1544725340 +1528 643875348 +1527 755725881 +1526 1893656995 +1525 1871800963 +1524 1702605261 +1523 1559863718 +1522 1727948672 +1521 1518595219 +1520 153073980 +1519 797275689 +1518 1366354963 +1517 440123732 +1516 466671080 +1515 300480933 +1514 41528770 +1513 285889261 +1512 568232997 +1511 362768142 +1510 1094492927 +1509 1067931592 +1508 1033691967 +1507 2040327615 +1506 1359892161 +1505 1538926374 +1504 1189136686 +1503 1611503293 +1502 1492548603 +1501 1377399971 +1500 1461553721 +1499 2079092471 +1498 1798551993 +1497 919558032 +1496 1200604268 +1495 333793276 +1494 143852291 +1493 184010042 +1492 1406789738 +1491 930672983 +1490 152240255 +1489 1860433896 +1488 330604609 +1487 1065874030 +1486 398594961 +1485 180781819 +1484 1879731583 +1483 1826244276 +1482 1338879981 +1481 1647785053 +1480 1476559823 +1479 1201648960 +1478 1855523078 +1477 1642249240 +1476 851190929 +1475 1895872516 +1474 46377771 +1473 1959220363 +1472 149949572 +1471 1560939780 +1470 1726331626 +1469 541995688 +1468 878488203 +1467 1464758717 +1466 775705741 +1465 1016594225 +1464 1074487186 +1463 1360662955 +1462 31769787 +1461 1693839489 +1460 600068374 +1459 1233849873 +1458 1461838935 +1457 149822790 +1456 1333626095 +1455 719834333 +1454 989385485 +1453 231946530 +1452 349684452 +1451 137231021 +1450 1939745623 +1449 1981794231 +1448 350458031 +1447 2107134210 +1446 1595871469 +1445 1039454214 +1444 1745922944 +1443 632921639 +1442 232888737 +1441 1755437531 +1440 682451577 +1439 261572909 +1438 1913773595 +1437 2009377625 +1436 390271530 +1435 1562526434 +1434 984824438 +1433 1528131345 +1432 760594581 +1431 945403562 +1430 232000554 +1429 450245584 +1428 2047707426 +1427 742004601 +1426 1307920952 +1425 1101679565 +1424 370149881 +1423 852154464 +1422 439684555 +1421 515373869 +1420 1934256638 +1419 1980095061 +1418 385922762 +1417 1458487465 +1416 361211265 +1415 962949829 +1414 806565477 +1413 2137969061 +1412 2097953710 +1411 2118799476 +1410 1989147584 +1409 820557599 +1408 2018785026 +1407 351247161 +1406 1024553187 +1405 1009623833 +1404 801931853 +1403 39420876 +1402 1296130790 +1401 310348996 +1400 1045179784 +1399 1637479601 +1398 1289808280 +1397 946027861 +1396 371854720 +1395 455766488 +1394 661995010 +1393 2002259659 +1392 1065381473 +1391 607073142 +1390 129451107 +1389 475769173 +1388 1618883795 +1387 1570456580 +1386 651921988 +1385 370725852 +1384 1012479767 +1383 835249649 +1382 148821476 +1381 1277396111 +1380 100014449 +1379 1637900423 +1378 1943488060 +1377 1009161193 +1376 1696798956 +1375 985132310 +1374 1860976691 +1373 491582856 +1372 1141724740 +1371 1806134837 +1370 1168024364 +1369 99151923 +1368 1265624880 +1367 834041791 +1366 284032851 +1365 517078709 +1364 1537868663 +1363 54921868 +1362 1872808552 +1361 589612300 +1360 1135672994 +1359 706478175 +1358 1971330833 +1357 1248157943 +1356 557976813 +1355 1964155987 +1354 221904376 +1353 1882567304 +1352 735235199 +1351 658404701 +1350 1481391698 +1349 1238336904 +1348 2088585115 +1347 958355750 +1346 1295668150 +1345 1205216099 +1344 1990891218 +1343 54841853 +1342 1471042140 +1341 1042572817 +1340 540509957 +1339 333982573 +1338 1962602720 +1337 748546171 +1336 1443656776 +1335 229110983 +1334 791753805 +1333 948256363 +1332 1066732521 +1331 1166330377 +1330 765765114 +1329 2034998699 +1328 148501361 +1327 7174846 +1326 1026253567 +1325 822893157 +1324 1228920787 +1323 1710983323 +1322 401175605 +1321 1644381943 +1320 717303233 +1319 523035948 +1318 2090152402 +1317 883369016 +1316 1114948180 +1315 1240826296 +1314 1881657607 +1313 948318400 +1312 1661815544 +1311 1137059567 +1310 1227453745 +1309 1939447433 +1308 1037809444 +1307 1733491737 +1306 2104276014 +1305 495400413 +1304 1309862109 +1303 1772907076 +1302 182491248 +1301 1179217470 +1300 1017829015 +1299 758590268 +1298 1008745132 +1297 1473091852 +1296 925737707 +1295 1462753892 +1294 421717552 +1293 1732022492 +1292 993680089 +1291 2025623305 +1290 1701713188 +1289 1981417865 +1288 1555571416 +1287 849326106 +1286 1149195056 +1285 166629779 +1284 1726494400 +1283 744598040 +1282 1868348303 +1281 1869851759 +1280 99250122 +1279 1641445656 +1278 1982655067 +1277 542409031 +1276 423629627 +1275 331368938 +1274 312909165 +1273 130644639 +1272 755078060 +1271 1571384628 +1270 170472337 +1269 1692220811 +1268 1980336209 +1267 1693474888 +1266 1051374300 +1265 1341198862 +1264 469073802 +1263 543577895 +1262 30309304 +1261 1159745872 +1260 470051888 +1259 852387082 +1258 832222809 +1257 1388941637 +1256 1270315354 +1255 404597016 +1254 445765124 +1253 2004126289 +1252 645347918 +1251 226902646 +1250 2034680340 +1249 1704324739 +1248 1217816029 +1247 1651286128 +1246 229499866 +1245 292984988 +1244 1723774526 +1243 889008184 +1242 2107655950 +1241 1210340897 +1240 1738532067 +1239 624481097 +1238 640846511 +1237 639137346 +1236 1224401086 +1235 507796405 +1234 1310889558 +1233 1456811578 +1232 73526006 +1231 1325405869 +1230 327523063 +1229 1228593899 +1228 1729555376 +1227 427625793 +1226 943176512 +1225 1413672713 +1224 1906732746 +1223 218862478 +1222 2116929597 +1221 1088506826 +1220 1156570265 +1219 383394211 +1218 1474824873 +1217 924831041 +1216 2074995250 +1215 1487975329 +1214 332812686 +1213 513433629 +1212 1297959765 +1211 1483174853 +1210 569494385 +1209 1099394721 +1208 1547563659 +1207 133050106 +1206 1475731436 +1205 1915073155 +1204 434270398 +1203 2132967337 +1202 1129288515 +1201 992415755 +1200 1743334141 +1199 2047380918 +1198 285417387 +1197 315882663 +1196 668376695 +1195 724314034 +1194 1444226764 +1193 818225919 +1192 1209775860 +1191 1733535385 +1190 1761165601 +1189 231739224 +1188 455882609 +1187 2134333192 +1186 592018355 +1185 1561561621 +1184 190015564 +1183 997121481 +1182 2091422891 +1181 198565044 +1180 2083094842 +1179 436444279 +1178 1771146933 +1177 1779974151 +1176 1846263356 +1175 1490247747 +1174 785784640 +1173 1589338291 +1172 389633196 +1171 1229391245 +1170 706998368 +1169 1427451477 +1168 1379004223 +1167 1708587000 +1166 1019139547 +1165 1997634423 +1164 1662021822 +1163 1858175026 +1162 1204543966 +1161 978036636 +1160 1277652776 +1159 1774316057 +1158 1787204517 +1157 1041804635 +1156 1944317627 +1155 1742380522 +1154 1617622378 +1153 2138934168 +1152 1061510287 +1151 1654978612 +1150 574901759 +1149 303120690 +1148 737664571 +1147 280899186 +1146 994189511 +1145 256925064 +1144 1100614551 +1143 1703877042 +1142 882339923 +1141 1109665366 +1140 1997870670 +1139 1145895015 +1138 408311930 +1137 1528853447 +1136 46565178 +1135 1308448169 +1134 793090457 +1133 683985186 +1132 580522250 +1131 1577711557 +1130 1338315766 +1129 235848141 +1128 1977482077 +1127 44823995 +1126 1571665905 +1125 1952867107 +1124 680870235 +1123 2110127413 +1122 1564032409 +1121 758389596 +1120 917314041 +1119 294002573 +1118 1456414827 +1117 480739506 +1116 1327768283 +1115 1437796117 +1114 1522068789 +1113 2138432832 +1112 1853490020 +1111 1883928556 +1110 701353436 +1109 469017223 +1108 1099329837 +1107 1247347409 +1106 735762990 +1105 1510063640 +1104 727925919 +1103 1362862547 +1102 1493153067 +1101 344674109 +1100 1747713128 +1099 1293491771 +1098 811665883 +1097 24614970 +1096 1511437408 +1095 1609022140 +1094 388834697 +1093 2069964286 +1092 1192813372 +1091 1270029836 +1090 1449458417 +1089 436574535 +1088 1113717938 +1087 18618710 +1086 1106154365 +1085 1336819098 +1084 1731789745 +1083 1785623881 +1082 1437079396 +1081 1384472797 +1080 784598719 +1079 1601489675 +1078 1880737880 +1077 1736749844 +1076 519421490 +1075 1520384091 +1074 16910573 +1073 383251810 +1072 1762633067 +1071 199661296 +1070 1680491873 +1069 1723098157 +1068 1929538010 +1067 1350127391 +1066 1783263921 +1065 1588956770 +1064 416208768 +1063 1266288509 +1062 620505869 +1061 756238837 +1060 156311898 +1059 1430839707 +1058 1477903817 +1057 1924382487 +1056 434312613 +1055 1468014132 +1054 2047223350 +1053 347316948 +1052 1001025162 +1051 1983073368 +1050 1651218564 +1049 1195332522 +1048 1082068185 +1047 360353789 +1046 1719839271 +1045 136169680 +1044 1905234671 +1043 1964732924 +1042 850243584 +1041 39534910 +1040 417606934 +1039 330364482 +1038 2087317884 +1037 340581240 +1036 933918623 +1035 516975412 +1034 968450901 +1033 1807453579 +1032 1109976610 +1031 1337149809 +1030 1425818667 +1029 379413059 +1028 996527094 +1027 9889685 +1026 2024642785 +1025 86995665 +1024 466988970 +1023 64149982 +1022 843582031 +1021 1953176287 +1020 901005183 +1019 1290864775 +1018 1622976899 +1017 945898505 +1016 602602766 +1015 1902589995 +1014 1433409743 +1013 1865699761 +1012 1547125990 +1011 519879102 +1010 99700673 +1009 77025693 +1008 1543929506 +1007 1570342472 +1006 1519613987 +1005 1273948692 +1004 1554482449 +1003 1778784739 +1002 381634911 +1001 730563551 +1000 340622715 +999 1415928982 +998 502253922 +997 909531429 +996 1690384362 +995 1960492803 +994 1390897281 +993 661296331 +992 1310628447 +991 1700200904 +990 330199388 +989 2102590325 +988 688262009 +987 1867870552 +986 1659972410 +985 884386652 +984 355464004 +983 913530641 +982 1765999088 +981 1470100297 +980 1123433244 +979 676841849 +978 704895354 +977 269980814 +976 15860023 +975 1888312896 +974 892313781 +973 823918898 +972 1438162024 +971 1113189577 +970 228309629 +969 1578574933 +968 1873028268 +967 689244767 +966 1666117796 +965 1029088031 +964 649864356 +963 1838180025 +962 331096942 +961 1355521769 +960 1011938895 +959 609812484 +958 442617915 +957 1951359004 +956 1512406547 +955 746441769 +954 1265871212 +953 1032847355 +952 1937581045 +951 1089157239 +950 765204943 +949 853452430 +948 660981826 +947 964066106 +946 1525150681 +945 1339424773 +944 450150871 +943 1926607852 +942 595609268 +941 2007070739 +940 1387644957 +939 1686548510 +938 2059940785 +937 843940236 +936 39380411 +935 1975421419 +934 697991089 +933 1441826234 +932 826241129 +931 1868768106 +930 912903854 +929 1208063539 +928 1244889585 +927 1843659794 +926 685487792 +925 479559192 +924 956344372 +923 176713973 +922 267642412 +921 1084128615 +920 428175413 +919 1948622485 +918 1475785397 +917 1469040701 +916 513915234 +915 1746026477 +914 743815504 +913 590563780 +912 538962895 +911 1056544406 +910 2094613601 +909 543704720 +908 1647168099 +907 84519366 +906 145949147 +905 745037824 +904 1149180289 +903 976706631 +902 528922380 +901 1765661238 +900 623878521 +899 1216727707 +898 522575747 +897 765330393 +896 887315422 +895 508773818 +894 211916779 +893 2019699405 +892 1896022208 +891 466503575 +890 1755826866 +889 1106618360 +888 1434707250 +887 1877242568 +886 725225196 +885 2070835102 +884 1207063582 +883 1834754746 +882 643433827 +881 2142741822 +880 1556859954 +879 2010094235 +878 397755573 +877 902130275 +876 1082822725 +875 1316726164 +874 216115444 +873 1531002699 +872 352828110 +871 1459678321 +870 1243085491 +869 2006031776 +868 329412285 +867 13801928 +866 553413613 +865 1015099665 +864 760235258 +863 1892896852 +862 263872539 +861 789403848 +860 1179279973 +859 2026067946 +858 381393163 +857 1511355796 +856 670178986 +855 1037954098 +854 1427401275 +853 1211805407 +852 277894792 +851 780823240 +850 1744986249 +849 654729679 +848 927271510 +847 1228513056 +846 686014831 +845 1699303674 +844 963898054 +843 903920771 +842 287917207 +841 494279982 +840 1130266036 +839 1229283563 +838 1452618162 +837 1461796267 +836 1401050318 +835 808000409 +834 751227126 +833 2118315057 +832 713616879 +831 385288241 +830 408010685 +829 1815407824 +828 1355888960 +827 1490922713 +826 83954521 +825 1605857226 +824 760059306 +823 646578035 +822 1614302806 +821 1770648760 +820 2001035378 +819 516473193 +818 2116198496 +817 1375451484 +816 264615002 +815 1929577708 +814 1411386466 +813 469618072 +812 1921138383 +811 1206117292 +810 1189145467 +809 1815953416 +808 1975716892 +807 644617753 +806 710569141 +805 1430218909 +804 94383530 +803 365938885 +802 1710304372 +801 1045692702 +800 1176882929 +799 1064571619 +798 1731453303 +797 1897515381 +796 730863407 +795 1584860134 +794 2139038068 +793 1136894193 +792 793026305 +791 1097829613 +790 1801933912 +789 625583894 +788 251858191 +787 186620788 +786 2111548665 +785 1942480577 +784 8439325 +783 205269174 +782 1427956253 +781 105184966 +780 1377884048 +779 544527714 +778 1105384275 +777 545497983 +776 550234222 +775 344630255 +774 1867398184 +773 1196174476 +772 1336539604 +771 645732753 +770 1461723047 +769 1426851195 +768 333708212 +767 146593168 +766 1905960961 +765 1741452862 +764 791833829 +763 1041208455 +762 1482443929 +761 167442411 +760 845971422 +759 1615313123 +758 661518876 +757 456861261 +756 178181463 +755 1906279491 +754 514524324 +753 2050738006 +752 974868774 +751 883428538 +750 1147284339 +749 832386064 +748 2141777140 +747 760754020 +746 825583447 +745 1501543394 +744 1155574299 +743 1221665431 +742 1881935076 +741 2057172057 +740 312024541 +739 1315129879 +738 1668373882 +737 739738998 +736 1502242987 +735 864752505 +734 259008932 +733 624391418 +732 195237033 +731 2014614454 +730 1653407182 +729 389110160 +728 1437131660 +727 902723033 +726 2089820585 +725 274927105 +724 931410717 +723 1778579434 +722 903453667 +721 142482709 +720 889135046 +719 386530319 +718 6802617 +717 640233745 +716 1752663369 +715 1751401663 +714 1767091966 +713 1245885890 +712 909640890 +711 566805197 +710 388798174 +709 1719769191 +708 1960370540 +707 803621377 +706 480730065 +705 877851568 +704 669515472 +703 391878126 +702 1118467884 +701 1953610521 +700 577482794 +699 750684149 +698 446773223 +697 1162204555 +696 2118795963 +695 311241151 +694 1518957085 +693 788928008 +692 889444387 +691 516923348 +690 135680092 +689 248901301 +688 781350598 +687 402884602 +686 1020625427 +685 506777479 +684 841760773 +683 1200286768 +682 857087715 +681 1337355347 +680 753918305 +679 1732660445 +678 1239039125 +677 1082518971 +676 134105905 +675 88851939 +674 1906867332 +673 863388599 +672 1961878980 +671 367783734 +670 1506837297 +669 1562761887 +668 779371834 +667 135532072 +666 1790731117 +665 1329867955 +664 1569280411 +663 1002033737 +662 653247916 +661 640543086 +660 1883056398 +659 1880279138 +658 1375759521 +657 274573119 +656 1708607477 +655 1967822307 +654 1797173411 +653 1651889073 +652 446368463 +651 1271910918 +650 98316222 +649 1818882982 +648 1598554540 +647 1150187186 +646 1323135287 +645 1418200954 +644 274456606 +643 1539083598 +642 1504034949 +641 399117093 +640 1735895548 +639 1371305225 +638 1919514417 +637 1596987526 +636 713735309 +635 788697380 +634 676620039 +633 928737325 +632 1266460986 +631 920452426 +630 1412267213 +629 1608483279 +628 171671661 +627 1555420862 +626 624883355 +625 56718403 +624 1521453844 +623 525262493 +622 1553572851 +621 774969129 +620 1820840025 +619 1095612683 +618 495747695 +617 180353586 +616 875730580 +615 1931535337 +614 2061649652 +613 2022823161 +612 1950671697 +611 132729724 +610 627086324 +609 138908022 +608 657569916 +607 1130817037 +606 920367487 +605 1932481632 +604 1669720042 +603 1903651261 +602 1663953760 +601 1805461355 +600 748780765 +599 2004329998 +598 983599924 +597 114953257 +596 33967018 +595 99620862 +594 650629200 +593 746484715 +592 851906116 +591 457960168 +590 279221434 +589 1640486439 +588 219882103 +587 711696006 +586 266187582 +585 1000391067 +584 2128347287 +583 1928919928 +582 1395736837 +581 1811763675 +580 1622643456 +579 1643752935 +578 1366024183 +577 872571932 +576 1608580643 +575 1164199873 +574 268527872 +573 2011742335 +572 1154870496 +571 1807107409 +570 821861431 +569 633827507 +568 1970362980 +567 883979062 +566 1611807705 +565 1434965951 +564 1395198394 +563 192669032 +562 467263281 +561 1358903325 +560 238078064 +559 1715009076 +558 1374298857 +557 1366974684 +556 730832366 +555 484751302 +554 1752137878 +553 316583612 +552 306276471 +551 1899467550 +550 445739492 +549 750071524 +548 35172292 +547 201824309 +546 604044060 +545 1744321956 +544 9329377 +543 608904110 +542 1189880904 +541 521042989 +540 1984228077 +539 2085366017 +538 1169503450 +537 535397028 +536 1636264316 +535 1419138673 +534 967702670 +533 36295069 +532 2102074615 +531 899737853 +530 2132088116 +529 1018587028 +528 984176709 +527 889547555 +526 1762320454 +525 414248754 +524 178474830 +523 2000153976 +522 2018327767 +521 1703688595 +520 1864295258 +519 243915183 +518 146027464 +517 438333984 +516 192494932 +515 2142623597 +514 554441052 +513 1635770036 +512 772159681 +511 1251998535 +510 1499023187 +509 1448831049 +508 449101701 +507 1897848424 +506 1715178006 +505 1599969247 +504 1464547706 +503 67964817 +502 51690601 +501 1083487587 +500 2063044791 +499 1242540561 +498 1403750221 +497 569927955 +496 711072724 +495 1909650126 +494 543404635 +493 622269883 +492 135858718 +491 1774412584 +490 1557661130 +489 1425961274 +488 51420250 +487 150887515 +486 2031376580 +485 704208544 +484 1370463916 +483 1449926165 +482 136746849 +481 1470812280 +480 802896834 +479 1748658410 +478 1881136691 +477 996616102 +476 433300718 +475 1647213188 +474 1548278646 +473 381060118 +472 152403674 +471 956633688 +470 1827221014 +469 1493116836 +468 531467836 +467 1641583743 +466 26523320 +465 88802841 +464 1773791408 +463 916475698 +462 1212092401 +461 857381092 +460 1722992334 +459 1406773615 +458 1542068342 +457 1494695354 +456 927907246 +455 581450415 +454 567461695 +453 2047135284 +452 647029331 +451 535572086 +450 1737159237 +449 1953764380 +448 1315357692 +447 233923502 +446 1595821104 +445 52240600 +444 1494809514 +443 591644958 +442 701322752 +441 806770485 +440 425165851 +439 185637271 +438 1466593516 +437 442664995 +436 2015275982 +435 1257531269 +434 1024194088 +433 916410316 +432 1340967012 +431 1952802433 +430 1462796398 +429 228296980 +428 478866369 +427 960617927 +426 927233658 +425 1028255610 +424 2081904732 +423 31889609 +422 309976047 +421 840748599 +420 1367698042 +419 1503235734 +418 357943276 +417 1263117092 +416 886597636 +415 1004176146 +414 1498401495 +413 688039029 +412 166479106 +411 515685481 +410 1487660617 +409 2129984504 +408 317844936 +407 209062247 +406 1565954555 +405 1098865666 +404 2064047905 +403 1218875302 +402 1601097566 +401 1112670032 +400 1473936064 +399 502178471 +398 1448546969 +397 1598094407 +396 1026196843 +395 895344049 +394 718279562 +393 1241156133 +392 811675214 +391 954223961 +390 482805323 +389 104580950 +388 616638098 +387 1501250778 +386 1912199244 +385 198558607 +384 837697039 +383 982716014 +382 1347862060 +381 183978250 +380 197840545 +379 1278598370 +378 564029948 +377 1366462918 +376 292497990 +375 347079253 +374 1645251747 +373 951377872 +372 1892422886 +371 1098919095 +370 1811606711 +369 2023325305 +368 1623465276 +367 553202920 +366 879814844 +365 1932524358 +364 83668835 +363 1911539249 +362 758350810 +361 707094264 +360 337585862 +359 1129038193 +358 339865354 +357 418079491 +356 663553738 +355 929483230 +354 998180195 +353 653718789 +352 784875469 +351 69263690 +350 1767431950 +349 978861274 +348 986100380 +347 216950695 +346 1868694819 +345 1488603765 +344 602140015 +343 546332652 +342 1287254809 +341 2016581228 +340 1622937467 +339 1258403791 +338 1143510461 +337 1838424566 +336 469534085 +335 1115759243 +334 1174173548 +333 1524058219 +332 1573953387 +331 1776796265 +330 367228910 +329 2066990019 +328 465484454 +327 1557865771 +326 1567382944 +325 9834949 +324 144607761 +323 928916505 +322 1033770487 +321 1953497842 +320 1230646958 +319 1550481254 +318 1257650103 +317 1644980262 +316 1762294328 +315 1322362167 +314 201348956 +313 733042434 +312 1070878832 +311 28851018 +310 873070767 +309 1931996549 +308 788869706 +307 27751218 +306 664251018 +305 1092959514 +304 1689289504 +303 1544860931 +302 1156829309 +301 1654447016 +300 1311311810 +299 956846786 +298 499607074 +297 455649505 +296 1413258010 +295 638466439 +294 1123548110 +293 338593567 +292 1845753195 +291 1630772880 +290 695847739 +289 1733150343 +288 1935670574 +287 2082771584 +286 1443631306 +285 1029251894 +284 251483334 +283 172497937 +282 2007455315 +281 1286365931 +280 1387464960 +279 845319549 +278 1267745531 +277 1843393840 +276 485945362 +275 1266873735 +274 2083613853 +273 34842488 +272 233549120 +271 199982522 +270 1154839941 +269 855662305 +268 1691072424 +267 2008624283 +266 1479585042 +265 1074664443 +264 940196892 +263 1640258878 +262 1790229476 +261 112602851 +260 1842585954 +259 760559802 +258 289519037 +257 906418680 +256 1831288250 +255 1271133369 +254 1169280227 +253 1112601051 +252 932516625 +251 1162135765 +250 18620399 +249 1691554768 +248 359374187 +247 871796 +246 1907263635 +245 451102874 +244 1033324614 +243 1883631330 +242 1027486194 +241 1525370463 +240 656393746 +239 1293699306 +238 1523560911 +237 616407981 +236 1068427390 +235 1986809812 +234 1431918615 +233 827594041 +232 1945156571 +231 1029669673 +230 1970567462 +229 936167274 +228 1076755200 +227 1165869316 +226 1884622101 +225 718687198 +224 338616744 +223 7144461 +222 1093980652 +221 1388445504 +220 802761578 +219 17748603 +218 1931774781 +217 2055754961 +216 1115030830 +215 23632304 +214 1571100327 +213 1655437799 +212 1227237584 +211 1881270536 +210 1809552 +209 39985764 +208 225271916 +207 1684234746 +206 1331973014 +205 240833349 +204 41653241 +203 402248941 +202 1004510226 +201 1008989297 +200 2100398121 +199 804698146 +198 1199028821 +197 358068002 +196 827252572 +195 1877477639 +194 1772190194 +193 1097654887 +192 1351866531 +191 1076232049 +190 1604154371 +189 894490264 +188 1050201421 +187 1908142477 +186 484654634 +185 1607076678 +184 943878368 +183 1837313439 +182 1653628247 +181 1187251820 +180 1655998620 +179 465058453 +178 855496398 +177 2131922214 +176 1642581505 +175 929724073 +174 1383806771 +173 1180147592 +172 449334468 +171 199812080 +170 1957444123 +169 1742330119 +168 2124929222 +167 1469034830 +166 733361455 +165 1877081332 +164 525611108 +163 695958145 +162 1640984164 +161 457376267 +160 26030628 +159 1843495542 +158 409835630 +157 1590608390 +156 964264109 +155 794824842 +154 2100932079 +153 1904110196 +152 181314819 +151 1188569794 +150 331755422 +149 1671560053 +148 969960596 +147 2073255973 +146 748115443 +145 462433913 +144 480389604 +143 1183994691 +142 1370187116 +141 854487997 +140 222366505 +139 488409293 +138 1008968663 +137 247847890 +136 943423722 +135 37403310 +134 236097168 +133 68234841 +132 669927517 +131 1944972270 +130 47540636 +129 582905885 +128 879231433 +127 1762494436 +126 1637159959 +125 1207637561 +124 613510023 +123 912362285 +122 1572354774 +121 657238414 +120 218609198 +119 405983097 +118 923444610 +117 507526682 +116 1592866368 +115 1711604400 +114 1239730445 +113 1773385255 +112 961628185 +111 881777823 +110 1993002982 +109 2122002263 +108 1692469219 +107 971565353 +106 11750722 +105 875188881 +104 1514959440 +103 438608545 +102 20694204 +101 87021632 +100 1065740837 +99 432529848 +98 1093229574 +97 1819077520 +96 1148984413 +95 724797674 +94 1782766435 +93 2103755257 +92 693753087 +91 1166371677 +90 1881277452 +89 1858566163 +88 960600376 +87 1359323857 +86 1415279885 +85 1966964761 +84 749976215 +83 357952622 +82 1927865921 +81 987109570 +80 1336792251 +79 1021437628 +78 2110251541 +77 817280338 +76 1604089561 +75 1720625824 +74 854494676 +73 1427937808 +72 1520351356 +71 1735648004 +70 1141275706 +69 1394146965 +68 1431029083 +67 368431899 +66 36311085 +65 1192712804 +64 31044587 +63 616394758 +62 222477805 +61 982670571 +60 205771300 +59 521953594 +58 443286278 +57 1141119263 +56 609347642 +55 1057327263 +54 39098840 +53 1910350293 +52 1168644018 +51 906428292 +50 1024341676 +49 519511913 +48 1564831715 +47 389625717 +46 2110269310 +45 176151752 +44 200274468 +43 1266330320 +42 286662102 +41 126204390 +40 304618920 +39 772843806 +38 1357835880 +37 238316279 +36 337387312 +35 1567399975 +34 970234999 +33 1195857664 +32 410623457 +31 1848007858 +30 539384293 +29 1212135685 +28 2060089600 +27 1533442662 +26 1102020422 +25 846480997 +24 2036166893 +23 1280154196 +22 886008616 +21 649132105 +20 1489080225 +19 634715959 +18 556726251 +17 1388679963 +16 189351248 +15 843938989 +14 2036973298 +13 74070078 +12 961711400 +11 1661301944 +10 915852158 +9 66302641 +8 435456494 +7 1937919553 +6 1415564928 +5 1289013296 +4 1156776517 +3 1269710788 +2 656473370 +1 1345971420 +0 1935401906 diff --git a/src/test/singlenode_regress/data/emp.data b/src/test/singlenode_regress/data/emp.data new file mode 100644 index 00000000000..5fc17ffa84b --- /dev/null +++ b/src/test/singlenode_regress/data/emp.data @@ -0,0 +1,3 @@ +sharon 25 (15,12) 1000 sam +sam 30 (10,5) 2000 bill +bill 20 (11,10) 1000 sharon diff --git a/src/test/singlenode_regress/data/exttab.data b/src/test/singlenode_regress/data/exttab.data new file mode 100644 index 00000000000..185a8ba9331 --- /dev/null +++ b/src/test/singlenode_regress/data/exttab.data @@ -0,0 +1,10 @@ +1|1_number +2|2_number +3|3_number +4|4_number +5|5_number +6|6_number +7|7_number +8|8_number +9|9_number +10|10_number diff --git a/src/test/singlenode_regress/data/exttab_escape_off.data b/src/test/singlenode_regress/data/exttab_escape_off.data new file mode 100644 index 00000000000..a0123972394 --- /dev/null +++ b/src/test/singlenode_regress/data/exttab_escape_off.data @@ -0,0 +1,5 @@ +line with backslash 3\1001300102 +CORRECT RECORD IN UPPER +correct record in lower +Value OFF +Value off diff --git a/src/test/singlenode_regress/data/exttab_few_errors.data b/src/test/singlenode_regress/data/exttab_few_errors.data new file mode 100644 index 00000000000..99c99a3cf15 --- /dev/null +++ b/src/test/singlenode_regress/data/exttab_few_errors.data @@ -0,0 +1,10 @@ +1|1_number +2|2_number +error_0 +4|4_number +error_1 +6|6_number +7|7_number +8|8_number +9|9_number +10|10_number diff --git a/src/test/singlenode_regress/data/exttab_first_errors.data b/src/test/singlenode_regress/data/exttab_first_errors.data new file mode 100644 index 00000000000..3b15f3f3de9 --- /dev/null +++ b/src/test/singlenode_regress/data/exttab_first_errors.data @@ -0,0 +1,10000 @@ +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +error_0 +0|0_number +1|1_number +2|2_number +3|3_number +4|4_number +5|5_number +6|6_number +7|7_number +8|8_number +9|9_number +10|10_number +11|11_number +12|12_number +13|13_number +14|14_number +15|15_number +16|16_number +17|17_number +18|18_number +19|19_number +20|20_number +21|21_number +22|22_number +23|23_number +24|24_number +25|25_number +26|26_number +27|27_number +28|28_number +29|29_number +30|30_number +31|31_number +32|32_number +33|33_number +34|34_number +35|35_number +36|36_number +37|37_number +38|38_number +39|39_number +40|40_number +41|41_number +42|42_number +43|43_number +44|44_number +45|45_number +46|46_number +47|47_number +48|48_number +49|49_number +50|50_number +51|51_number +52|52_number +53|53_number +54|54_number +55|55_number +56|56_number +57|57_number +58|58_number +59|59_number +60|60_number +61|61_number +62|62_number +63|63_number +64|64_number +65|65_number +66|66_number +67|67_number +68|68_number +69|69_number +70|70_number +71|71_number +72|72_number +73|73_number +74|74_number +75|75_number +76|76_number +77|77_number +78|78_number +79|79_number +80|80_number +81|81_number +82|82_number +83|83_number +84|84_number +85|85_number +86|86_number +87|87_number +88|88_number +89|89_number +90|90_number +91|91_number +92|92_number +93|93_number +94|94_number +95|95_number +96|96_number +97|97_number +98|98_number +99|99_number +100|100_number +101|101_number +102|102_number +103|103_number +104|104_number +105|105_number +106|106_number +107|107_number +108|108_number +109|109_number +110|110_number +111|111_number +112|112_number +113|113_number +114|114_number +115|115_number +116|116_number +117|117_number +118|118_number +119|119_number +120|120_number +121|121_number +122|122_number +123|123_number +124|124_number +125|125_number +126|126_number +127|127_number +128|128_number +129|129_number +130|130_number +131|131_number +132|132_number +133|133_number +134|134_number +135|135_number +136|136_number +137|137_number +138|138_number +139|139_number +140|140_number +141|141_number +142|142_number +143|143_number +144|144_number +145|145_number +146|146_number +147|147_number +148|148_number +149|149_number +150|150_number +151|151_number +152|152_number +153|153_number +154|154_number +155|155_number +156|156_number +157|157_number +158|158_number +159|159_number +160|160_number +161|161_number +162|162_number +163|163_number +164|164_number +165|165_number +166|166_number +167|167_number +168|168_number +169|169_number +170|170_number +171|171_number +172|172_number +173|173_number +174|174_number +175|175_number +176|176_number +177|177_number +178|178_number +179|179_number +180|180_number +181|181_number +182|182_number +183|183_number +184|184_number +185|185_number +186|186_number +187|187_number +188|188_number +189|189_number +190|190_number +191|191_number +192|192_number +193|193_number +194|194_number +195|195_number +196|196_number +197|197_number +198|198_number +199|199_number +200|200_number +201|201_number +202|202_number +203|203_number +204|204_number +205|205_number +206|206_number +207|207_number +208|208_number +209|209_number +210|210_number +211|211_number +212|212_number +213|213_number +214|214_number +215|215_number +216|216_number +217|217_number +218|218_number +219|219_number +220|220_number +221|221_number +222|222_number +223|223_number +224|224_number +225|225_number +226|226_number +227|227_number +228|228_number +229|229_number +230|230_number +231|231_number +232|232_number +233|233_number +234|234_number +235|235_number +236|236_number +237|237_number +238|238_number +239|239_number +240|240_number +241|241_number +242|242_number +243|243_number +244|244_number +245|245_number +246|246_number +247|247_number +248|248_number +249|249_number +250|250_number +251|251_number +252|252_number +253|253_number +254|254_number +255|255_number +256|256_number +257|257_number +258|258_number +259|259_number +260|260_number +261|261_number +262|262_number +263|263_number +264|264_number +265|265_number +266|266_number +267|267_number +268|268_number +269|269_number +270|270_number +271|271_number +272|272_number +273|273_number +274|274_number +275|275_number +276|276_number +277|277_number +278|278_number +279|279_number +280|280_number +281|281_number +282|282_number +283|283_number +284|284_number +285|285_number +286|286_number +287|287_number +288|288_number +289|289_number +290|290_number +291|291_number +292|292_number +293|293_number +294|294_number +295|295_number +296|296_number +297|297_number +298|298_number +299|299_number +300|300_number +301|301_number +302|302_number +303|303_number +304|304_number +305|305_number +306|306_number +307|307_number +308|308_number +309|309_number +310|310_number +311|311_number +312|312_number +313|313_number +314|314_number +315|315_number +316|316_number +317|317_number +318|318_number +319|319_number +320|320_number +321|321_number +322|322_number +323|323_number +324|324_number +325|325_number +326|326_number +327|327_number +328|328_number +329|329_number +330|330_number +331|331_number +332|332_number +333|333_number +334|334_number +335|335_number +336|336_number +337|337_number +338|338_number +339|339_number +340|340_number +341|341_number +342|342_number +343|343_number +344|344_number +345|345_number +346|346_number +347|347_number +348|348_number +349|349_number +350|350_number +351|351_number +352|352_number +353|353_number +354|354_number +355|355_number +356|356_number +357|357_number +358|358_number +359|359_number +360|360_number +361|361_number +362|362_number +363|363_number +364|364_number +365|365_number +366|366_number +367|367_number +368|368_number +369|369_number +370|370_number +371|371_number +372|372_number +373|373_number +374|374_number +375|375_number +376|376_number +377|377_number +378|378_number +379|379_number +380|380_number +381|381_number +382|382_number +383|383_number +384|384_number +385|385_number +386|386_number +387|387_number +388|388_number +389|389_number +390|390_number +391|391_number +392|392_number +393|393_number +394|394_number +395|395_number +396|396_number +397|397_number +398|398_number +399|399_number +400|400_number +401|401_number +402|402_number +403|403_number +404|404_number +405|405_number +406|406_number +407|407_number +408|408_number +409|409_number +410|410_number +411|411_number +412|412_number +413|413_number +414|414_number +415|415_number +416|416_number +417|417_number +418|418_number +419|419_number +420|420_number +421|421_number +422|422_number +423|423_number +424|424_number +425|425_number +426|426_number +427|427_number +428|428_number +429|429_number +430|430_number +431|431_number +432|432_number +433|433_number +434|434_number +435|435_number +436|436_number +437|437_number +438|438_number +439|439_number +440|440_number +441|441_number +442|442_number +443|443_number +444|444_number +445|445_number +446|446_number +447|447_number +448|448_number +449|449_number +450|450_number +451|451_number +452|452_number +453|453_number +454|454_number +455|455_number +456|456_number +457|457_number +458|458_number +459|459_number +460|460_number +461|461_number +462|462_number +463|463_number +464|464_number +465|465_number +466|466_number +467|467_number +468|468_number +469|469_number +470|470_number +471|471_number +472|472_number +473|473_number +474|474_number +475|475_number +476|476_number +477|477_number +478|478_number +479|479_number +480|480_number +481|481_number +482|482_number +483|483_number +484|484_number +485|485_number +486|486_number +487|487_number +488|488_number +489|489_number +490|490_number +491|491_number +492|492_number +493|493_number +494|494_number +495|495_number +496|496_number +497|497_number +498|498_number +499|499_number +500|500_number +501|501_number +502|502_number +503|503_number +504|504_number +505|505_number +506|506_number +507|507_number +508|508_number +509|509_number +510|510_number +511|511_number +512|512_number +513|513_number +514|514_number +515|515_number +516|516_number +517|517_number +518|518_number +519|519_number +520|520_number +521|521_number +522|522_number +523|523_number +524|524_number +525|525_number +526|526_number +527|527_number +528|528_number +529|529_number +530|530_number +531|531_number +532|532_number +533|533_number +534|534_number +535|535_number +536|536_number +537|537_number +538|538_number +539|539_number +540|540_number +541|541_number +542|542_number +543|543_number +544|544_number +545|545_number +546|546_number +547|547_number +548|548_number +549|549_number +550|550_number +551|551_number +552|552_number +553|553_number +554|554_number +555|555_number +556|556_number +557|557_number +558|558_number +559|559_number +560|560_number +561|561_number +562|562_number +563|563_number +564|564_number +565|565_number +566|566_number +567|567_number +568|568_number +569|569_number +570|570_number +571|571_number +572|572_number +573|573_number +574|574_number +575|575_number +576|576_number +577|577_number +578|578_number +579|579_number +580|580_number +581|581_number +582|582_number +583|583_number +584|584_number +585|585_number +586|586_number +587|587_number +588|588_number +589|589_number +590|590_number +591|591_number +592|592_number +593|593_number +594|594_number +595|595_number +596|596_number +597|597_number +598|598_number +599|599_number +600|600_number +601|601_number +602|602_number +603|603_number +604|604_number +605|605_number +606|606_number +607|607_number +608|608_number +609|609_number +610|610_number +611|611_number +612|612_number +613|613_number +614|614_number +615|615_number +616|616_number +617|617_number +618|618_number +619|619_number +620|620_number +621|621_number +622|622_number +623|623_number +624|624_number +625|625_number +626|626_number +627|627_number +628|628_number +629|629_number +630|630_number +631|631_number +632|632_number +633|633_number +634|634_number +635|635_number +636|636_number +637|637_number +638|638_number +639|639_number +640|640_number +641|641_number +642|642_number +643|643_number +644|644_number +645|645_number +646|646_number +647|647_number +648|648_number +649|649_number +650|650_number +651|651_number +652|652_number +653|653_number +654|654_number +655|655_number +656|656_number +657|657_number +658|658_number +659|659_number +660|660_number +661|661_number +662|662_number +663|663_number +664|664_number +665|665_number +666|666_number +667|667_number +668|668_number +669|669_number +670|670_number +671|671_number +672|672_number +673|673_number +674|674_number +675|675_number +676|676_number +677|677_number +678|678_number +679|679_number +680|680_number +681|681_number +682|682_number +683|683_number +684|684_number +685|685_number +686|686_number +687|687_number +688|688_number +689|689_number +690|690_number +691|691_number +692|692_number +693|693_number +694|694_number +695|695_number +696|696_number +697|697_number +698|698_number +699|699_number +700|700_number +701|701_number +702|702_number +703|703_number +704|704_number +705|705_number +706|706_number +707|707_number +708|708_number +709|709_number +710|710_number +711|711_number +712|712_number +713|713_number +714|714_number +715|715_number +716|716_number +717|717_number +718|718_number +719|719_number +720|720_number +721|721_number +722|722_number +723|723_number +724|724_number +725|725_number +726|726_number +727|727_number +728|728_number +729|729_number +730|730_number +731|731_number +732|732_number +733|733_number +734|734_number +735|735_number +736|736_number +737|737_number +738|738_number +739|739_number +740|740_number +741|741_number +742|742_number +743|743_number +744|744_number +745|745_number +746|746_number +747|747_number +748|748_number +749|749_number +750|750_number +751|751_number +752|752_number +753|753_number +754|754_number +755|755_number +756|756_number +757|757_number +758|758_number +759|759_number +760|760_number +761|761_number +762|762_number +763|763_number +764|764_number +765|765_number +766|766_number +767|767_number +768|768_number +769|769_number +770|770_number +771|771_number +772|772_number +773|773_number +774|774_number +775|775_number +776|776_number +777|777_number +778|778_number +779|779_number +780|780_number +781|781_number +782|782_number +783|783_number +784|784_number +785|785_number +786|786_number +787|787_number +788|788_number +789|789_number +790|790_number +791|791_number +792|792_number +793|793_number +794|794_number +795|795_number +796|796_number +797|797_number +798|798_number +799|799_number +800|800_number +801|801_number +802|802_number +803|803_number +804|804_number +805|805_number +806|806_number +807|807_number +808|808_number +809|809_number +810|810_number +811|811_number +812|812_number +813|813_number +814|814_number +815|815_number +816|816_number +817|817_number +818|818_number +819|819_number +820|820_number +821|821_number +822|822_number +823|823_number +824|824_number +825|825_number +826|826_number +827|827_number +828|828_number +829|829_number +830|830_number +831|831_number +832|832_number +833|833_number +834|834_number +835|835_number +836|836_number +837|837_number +838|838_number +839|839_number +840|840_number +841|841_number +842|842_number +843|843_number +844|844_number +845|845_number +846|846_number +847|847_number +848|848_number +849|849_number +850|850_number +851|851_number +852|852_number +853|853_number +854|854_number +855|855_number +856|856_number +857|857_number +858|858_number +859|859_number +860|860_number +861|861_number +862|862_number +863|863_number +864|864_number +865|865_number +866|866_number +867|867_number +868|868_number +869|869_number +870|870_number +871|871_number +872|872_number +873|873_number +874|874_number +875|875_number +876|876_number +877|877_number +878|878_number +879|879_number +880|880_number +881|881_number +882|882_number +883|883_number +884|884_number +885|885_number +886|886_number +887|887_number +888|888_number +889|889_number +890|890_number +891|891_number +892|892_number +893|893_number +894|894_number +895|895_number +896|896_number +897|897_number +898|898_number +899|899_number +900|900_number +901|901_number +902|902_number +903|903_number +904|904_number +905|905_number +906|906_number +907|907_number +908|908_number +909|909_number +910|910_number +911|911_number +912|912_number +913|913_number +914|914_number +915|915_number +916|916_number +917|917_number +918|918_number +919|919_number +920|920_number +921|921_number +922|922_number +923|923_number +924|924_number +925|925_number +926|926_number +927|927_number +928|928_number +929|929_number +930|930_number +931|931_number +932|932_number +933|933_number +934|934_number +935|935_number +936|936_number +937|937_number +938|938_number +939|939_number +940|940_number +941|941_number +942|942_number +943|943_number +944|944_number +945|945_number +946|946_number +947|947_number +948|948_number +949|949_number +950|950_number +951|951_number +952|952_number +953|953_number +954|954_number +955|955_number +956|956_number +957|957_number +958|958_number +959|959_number +960|960_number +961|961_number +962|962_number +963|963_number +964|964_number +965|965_number +966|966_number +967|967_number +968|968_number +969|969_number +970|970_number +971|971_number +972|972_number +973|973_number +974|974_number +975|975_number +976|976_number +977|977_number +978|978_number +979|979_number +980|980_number +981|981_number +982|982_number +983|983_number +984|984_number +985|985_number +986|986_number +987|987_number +988|988_number +989|989_number +990|990_number +991|991_number +992|992_number +993|993_number +994|994_number +995|995_number +996|996_number +997|997_number +998|998_number +999|999_number +1000|1000_number +1001|1001_number +1002|1002_number +1003|1003_number +1004|1004_number +1005|1005_number +1006|1006_number +1007|1007_number +1008|1008_number +1009|1009_number +1010|1010_number +1011|1011_number +1012|1012_number +1013|1013_number +1014|1014_number +1015|1015_number +1016|1016_number +1017|1017_number +1018|1018_number +1019|1019_number +1020|1020_number +1021|1021_number +1022|1022_number +1023|1023_number +1024|1024_number +1025|1025_number +1026|1026_number +1027|1027_number +1028|1028_number +1029|1029_number +1030|1030_number +1031|1031_number +1032|1032_number +1033|1033_number +1034|1034_number +1035|1035_number +1036|1036_number +1037|1037_number +1038|1038_number +1039|1039_number +1040|1040_number +1041|1041_number +1042|1042_number +1043|1043_number +1044|1044_number +1045|1045_number +1046|1046_number +1047|1047_number +1048|1048_number +1049|1049_number +1050|1050_number +1051|1051_number +1052|1052_number +1053|1053_number +1054|1054_number +1055|1055_number +1056|1056_number +1057|1057_number +1058|1058_number +1059|1059_number +1060|1060_number +1061|1061_number +1062|1062_number +1063|1063_number +1064|1064_number +1065|1065_number +1066|1066_number +1067|1067_number +1068|1068_number +1069|1069_number +1070|1070_number +1071|1071_number +1072|1072_number +1073|1073_number +1074|1074_number +1075|1075_number +1076|1076_number +1077|1077_number +1078|1078_number +1079|1079_number +1080|1080_number +1081|1081_number +1082|1082_number +1083|1083_number +1084|1084_number +1085|1085_number +1086|1086_number +1087|1087_number +1088|1088_number +1089|1089_number +1090|1090_number +1091|1091_number +1092|1092_number +1093|1093_number +1094|1094_number +1095|1095_number +1096|1096_number +1097|1097_number +1098|1098_number +1099|1099_number +1100|1100_number +1101|1101_number +1102|1102_number +1103|1103_number +1104|1104_number +1105|1105_number +1106|1106_number +1107|1107_number +1108|1108_number +1109|1109_number +1110|1110_number +1111|1111_number +1112|1112_number +1113|1113_number +1114|1114_number +1115|1115_number +1116|1116_number +1117|1117_number +1118|1118_number +1119|1119_number +1120|1120_number +1121|1121_number +1122|1122_number +1123|1123_number +1124|1124_number +1125|1125_number +1126|1126_number +1127|1127_number +1128|1128_number +1129|1129_number +1130|1130_number +1131|1131_number +1132|1132_number +1133|1133_number +1134|1134_number +1135|1135_number +1136|1136_number +1137|1137_number +1138|1138_number +1139|1139_number +1140|1140_number +1141|1141_number +1142|1142_number +1143|1143_number +1144|1144_number +1145|1145_number +1146|1146_number +1147|1147_number +1148|1148_number +1149|1149_number +1150|1150_number +1151|1151_number +1152|1152_number +1153|1153_number +1154|1154_number +1155|1155_number +1156|1156_number +1157|1157_number +1158|1158_number +1159|1159_number +1160|1160_number +1161|1161_number +1162|1162_number +1163|1163_number +1164|1164_number +1165|1165_number +1166|1166_number +1167|1167_number +1168|1168_number +1169|1169_number +1170|1170_number +1171|1171_number +1172|1172_number +1173|1173_number +1174|1174_number +1175|1175_number +1176|1176_number +1177|1177_number +1178|1178_number +1179|1179_number +1180|1180_number +1181|1181_number +1182|1182_number +1183|1183_number +1184|1184_number +1185|1185_number +1186|1186_number +1187|1187_number +1188|1188_number +1189|1189_number +1190|1190_number +1191|1191_number +1192|1192_number +1193|1193_number +1194|1194_number +1195|1195_number +1196|1196_number +1197|1197_number +1198|1198_number +1199|1199_number +1200|1200_number +1201|1201_number +1202|1202_number +1203|1203_number +1204|1204_number +1205|1205_number +1206|1206_number +1207|1207_number +1208|1208_number +1209|1209_number +1210|1210_number +1211|1211_number +1212|1212_number +1213|1213_number +1214|1214_number +1215|1215_number +1216|1216_number +1217|1217_number +1218|1218_number +1219|1219_number +1220|1220_number +1221|1221_number +1222|1222_number +1223|1223_number +1224|1224_number +1225|1225_number +1226|1226_number +1227|1227_number +1228|1228_number +1229|1229_number +1230|1230_number +1231|1231_number +1232|1232_number +1233|1233_number +1234|1234_number +1235|1235_number +1236|1236_number +1237|1237_number +1238|1238_number +1239|1239_number +1240|1240_number +1241|1241_number +1242|1242_number +1243|1243_number +1244|1244_number +1245|1245_number +1246|1246_number +1247|1247_number +1248|1248_number +1249|1249_number +1250|1250_number +1251|1251_number +1252|1252_number +1253|1253_number +1254|1254_number +1255|1255_number +1256|1256_number +1257|1257_number +1258|1258_number +1259|1259_number +1260|1260_number +1261|1261_number +1262|1262_number +1263|1263_number +1264|1264_number +1265|1265_number +1266|1266_number +1267|1267_number +1268|1268_number +1269|1269_number +1270|1270_number +1271|1271_number +1272|1272_number +1273|1273_number +1274|1274_number +1275|1275_number +1276|1276_number +1277|1277_number +1278|1278_number +1279|1279_number +1280|1280_number +1281|1281_number +1282|1282_number +1283|1283_number +1284|1284_number +1285|1285_number +1286|1286_number +1287|1287_number +1288|1288_number +1289|1289_number +1290|1290_number +1291|1291_number +1292|1292_number +1293|1293_number +1294|1294_number +1295|1295_number +1296|1296_number +1297|1297_number +1298|1298_number +1299|1299_number +1300|1300_number +1301|1301_number +1302|1302_number +1303|1303_number +1304|1304_number +1305|1305_number +1306|1306_number +1307|1307_number +1308|1308_number +1309|1309_number +1310|1310_number +1311|1311_number +1312|1312_number +1313|1313_number +1314|1314_number +1315|1315_number +1316|1316_number +1317|1317_number +1318|1318_number +1319|1319_number +1320|1320_number +1321|1321_number +1322|1322_number +1323|1323_number +1324|1324_number +1325|1325_number +1326|1326_number +1327|1327_number +1328|1328_number +1329|1329_number +1330|1330_number +1331|1331_number +1332|1332_number +1333|1333_number +1334|1334_number +1335|1335_number +1336|1336_number +1337|1337_number +1338|1338_number +1339|1339_number +1340|1340_number +1341|1341_number +1342|1342_number +1343|1343_number +1344|1344_number +1345|1345_number +1346|1346_number +1347|1347_number +1348|1348_number +1349|1349_number +1350|1350_number +1351|1351_number +1352|1352_number +1353|1353_number +1354|1354_number +1355|1355_number +1356|1356_number +1357|1357_number +1358|1358_number +1359|1359_number +1360|1360_number +1361|1361_number +1362|1362_number +1363|1363_number +1364|1364_number +1365|1365_number +1366|1366_number +1367|1367_number +1368|1368_number +1369|1369_number +1370|1370_number +1371|1371_number +1372|1372_number +1373|1373_number +1374|1374_number +1375|1375_number +1376|1376_number +1377|1377_number +1378|1378_number +1379|1379_number +1380|1380_number +1381|1381_number +1382|1382_number +1383|1383_number +1384|1384_number +1385|1385_number +1386|1386_number +1387|1387_number +1388|1388_number +1389|1389_number +1390|1390_number +1391|1391_number +1392|1392_number +1393|1393_number +1394|1394_number +1395|1395_number +1396|1396_number +1397|1397_number +1398|1398_number +1399|1399_number +1400|1400_number +1401|1401_number +1402|1402_number +1403|1403_number +1404|1404_number +1405|1405_number +1406|1406_number +1407|1407_number +1408|1408_number +1409|1409_number +1410|1410_number +1411|1411_number +1412|1412_number +1413|1413_number +1414|1414_number +1415|1415_number +1416|1416_number +1417|1417_number +1418|1418_number +1419|1419_number +1420|1420_number +1421|1421_number +1422|1422_number +1423|1423_number +1424|1424_number +1425|1425_number +1426|1426_number +1427|1427_number +1428|1428_number +1429|1429_number +1430|1430_number +1431|1431_number +1432|1432_number +1433|1433_number +1434|1434_number +1435|1435_number +1436|1436_number +1437|1437_number +1438|1438_number +1439|1439_number +1440|1440_number +1441|1441_number +1442|1442_number +1443|1443_number +1444|1444_number +1445|1445_number +1446|1446_number +1447|1447_number +1448|1448_number +1449|1449_number +1450|1450_number +1451|1451_number +1452|1452_number +1453|1453_number +1454|1454_number +1455|1455_number +1456|1456_number +1457|1457_number +1458|1458_number +1459|1459_number +1460|1460_number +1461|1461_number +1462|1462_number +1463|1463_number +1464|1464_number +1465|1465_number +1466|1466_number +1467|1467_number +1468|1468_number +1469|1469_number +1470|1470_number +1471|1471_number +1472|1472_number +1473|1473_number +1474|1474_number +1475|1475_number +1476|1476_number +1477|1477_number +1478|1478_number +1479|1479_number +1480|1480_number +1481|1481_number +1482|1482_number +1483|1483_number +1484|1484_number +1485|1485_number +1486|1486_number +1487|1487_number +1488|1488_number +1489|1489_number +1490|1490_number +1491|1491_number +1492|1492_number +1493|1493_number +1494|1494_number +1495|1495_number +1496|1496_number +1497|1497_number +1498|1498_number +1499|1499_number +1500|1500_number +1501|1501_number +1502|1502_number +1503|1503_number +1504|1504_number +1505|1505_number +1506|1506_number +1507|1507_number +1508|1508_number +1509|1509_number +1510|1510_number +1511|1511_number +1512|1512_number +1513|1513_number +1514|1514_number +1515|1515_number +1516|1516_number +1517|1517_number +1518|1518_number +1519|1519_number +1520|1520_number +1521|1521_number +1522|1522_number +1523|1523_number +1524|1524_number +1525|1525_number +1526|1526_number +1527|1527_number +1528|1528_number +1529|1529_number +1530|1530_number +1531|1531_number +1532|1532_number +1533|1533_number +1534|1534_number +1535|1535_number +1536|1536_number +1537|1537_number +1538|1538_number +1539|1539_number +1540|1540_number +1541|1541_number +1542|1542_number +1543|1543_number +1544|1544_number +1545|1545_number +1546|1546_number +1547|1547_number +1548|1548_number +1549|1549_number +1550|1550_number +1551|1551_number +1552|1552_number +1553|1553_number +1554|1554_number +1555|1555_number +1556|1556_number +1557|1557_number +1558|1558_number +1559|1559_number +1560|1560_number +1561|1561_number +1562|1562_number +1563|1563_number +1564|1564_number +1565|1565_number +1566|1566_number +1567|1567_number +1568|1568_number +1569|1569_number +1570|1570_number +1571|1571_number +1572|1572_number +1573|1573_number +1574|1574_number +1575|1575_number +1576|1576_number +1577|1577_number +1578|1578_number +1579|1579_number +1580|1580_number +1581|1581_number +1582|1582_number +1583|1583_number +1584|1584_number +1585|1585_number +1586|1586_number +1587|1587_number +1588|1588_number +1589|1589_number +1590|1590_number +1591|1591_number +1592|1592_number +1593|1593_number +1594|1594_number +1595|1595_number +1596|1596_number +1597|1597_number +1598|1598_number +1599|1599_number +1600|1600_number +1601|1601_number +1602|1602_number +1603|1603_number +1604|1604_number +1605|1605_number +1606|1606_number +1607|1607_number +1608|1608_number +1609|1609_number +1610|1610_number +1611|1611_number +1612|1612_number +1613|1613_number +1614|1614_number +1615|1615_number +1616|1616_number +1617|1617_number +1618|1618_number +1619|1619_number +1620|1620_number +1621|1621_number +1622|1622_number +1623|1623_number +1624|1624_number +1625|1625_number +1626|1626_number +1627|1627_number +1628|1628_number +1629|1629_number +1630|1630_number +1631|1631_number +1632|1632_number +1633|1633_number +1634|1634_number +1635|1635_number +1636|1636_number +1637|1637_number +1638|1638_number +1639|1639_number +1640|1640_number +1641|1641_number +1642|1642_number +1643|1643_number +1644|1644_number +1645|1645_number +1646|1646_number +1647|1647_number +1648|1648_number +1649|1649_number +1650|1650_number +1651|1651_number +1652|1652_number +1653|1653_number +1654|1654_number +1655|1655_number +1656|1656_number +1657|1657_number +1658|1658_number +1659|1659_number +1660|1660_number +1661|1661_number +1662|1662_number +1663|1663_number +1664|1664_number +1665|1665_number +1666|1666_number +1667|1667_number +1668|1668_number +1669|1669_number +1670|1670_number +1671|1671_number +1672|1672_number +1673|1673_number +1674|1674_number +1675|1675_number +1676|1676_number +1677|1677_number +1678|1678_number +1679|1679_number +1680|1680_number +1681|1681_number +1682|1682_number +1683|1683_number +1684|1684_number +1685|1685_number +1686|1686_number +1687|1687_number +1688|1688_number +1689|1689_number +1690|1690_number +1691|1691_number +1692|1692_number +1693|1693_number +1694|1694_number +1695|1695_number +1696|1696_number +1697|1697_number +1698|1698_number +1699|1699_number +1700|1700_number +1701|1701_number +1702|1702_number +1703|1703_number +1704|1704_number +1705|1705_number +1706|1706_number +1707|1707_number +1708|1708_number +1709|1709_number +1710|1710_number +1711|1711_number +1712|1712_number +1713|1713_number +1714|1714_number +1715|1715_number +1716|1716_number +1717|1717_number +1718|1718_number +1719|1719_number +1720|1720_number +1721|1721_number +1722|1722_number +1723|1723_number +1724|1724_number +1725|1725_number +1726|1726_number +1727|1727_number +1728|1728_number +1729|1729_number +1730|1730_number +1731|1731_number +1732|1732_number +1733|1733_number +1734|1734_number +1735|1735_number +1736|1736_number +1737|1737_number +1738|1738_number +1739|1739_number +1740|1740_number +1741|1741_number +1742|1742_number +1743|1743_number +1744|1744_number +1745|1745_number +1746|1746_number +1747|1747_number +1748|1748_number +1749|1749_number +1750|1750_number +1751|1751_number +1752|1752_number +1753|1753_number +1754|1754_number +1755|1755_number +1756|1756_number +1757|1757_number +1758|1758_number +1759|1759_number +1760|1760_number +1761|1761_number +1762|1762_number +1763|1763_number +1764|1764_number +1765|1765_number +1766|1766_number +1767|1767_number +1768|1768_number +1769|1769_number +1770|1770_number +1771|1771_number +1772|1772_number +1773|1773_number +1774|1774_number +1775|1775_number +1776|1776_number +1777|1777_number +1778|1778_number +1779|1779_number +1780|1780_number +1781|1781_number +1782|1782_number +1783|1783_number +1784|1784_number +1785|1785_number +1786|1786_number +1787|1787_number +1788|1788_number +1789|1789_number +1790|1790_number +1791|1791_number +1792|1792_number +1793|1793_number +1794|1794_number +1795|1795_number +1796|1796_number +1797|1797_number +1798|1798_number +1799|1799_number +1800|1800_number +1801|1801_number +1802|1802_number +1803|1803_number +1804|1804_number +1805|1805_number +1806|1806_number +1807|1807_number +1808|1808_number +1809|1809_number +1810|1810_number +1811|1811_number +1812|1812_number +1813|1813_number +1814|1814_number +1815|1815_number +1816|1816_number +1817|1817_number +1818|1818_number +1819|1819_number +1820|1820_number +1821|1821_number +1822|1822_number +1823|1823_number +1824|1824_number +1825|1825_number +1826|1826_number +1827|1827_number +1828|1828_number +1829|1829_number +1830|1830_number +1831|1831_number +1832|1832_number +1833|1833_number +1834|1834_number +1835|1835_number +1836|1836_number +1837|1837_number +1838|1838_number +1839|1839_number +1840|1840_number +1841|1841_number +1842|1842_number +1843|1843_number +1844|1844_number +1845|1845_number +1846|1846_number +1847|1847_number +1848|1848_number +1849|1849_number +1850|1850_number +1851|1851_number +1852|1852_number +1853|1853_number +1854|1854_number +1855|1855_number +1856|1856_number +1857|1857_number +1858|1858_number +1859|1859_number +1860|1860_number +1861|1861_number +1862|1862_number +1863|1863_number +1864|1864_number +1865|1865_number +1866|1866_number +1867|1867_number +1868|1868_number +1869|1869_number +1870|1870_number +1871|1871_number +1872|1872_number +1873|1873_number +1874|1874_number +1875|1875_number +1876|1876_number +1877|1877_number +1878|1878_number +1879|1879_number +1880|1880_number +1881|1881_number +1882|1882_number +1883|1883_number +1884|1884_number +1885|1885_number +1886|1886_number +1887|1887_number +1888|1888_number +1889|1889_number +1890|1890_number +1891|1891_number +1892|1892_number +1893|1893_number +1894|1894_number +1895|1895_number +1896|1896_number +1897|1897_number +1898|1898_number +1899|1899_number +1900|1900_number +1901|1901_number +1902|1902_number +1903|1903_number +1904|1904_number +1905|1905_number +1906|1906_number +1907|1907_number +1908|1908_number +1909|1909_number +1910|1910_number +1911|1911_number +1912|1912_number +1913|1913_number +1914|1914_number +1915|1915_number +1916|1916_number +1917|1917_number +1918|1918_number +1919|1919_number +1920|1920_number +1921|1921_number +1922|1922_number +1923|1923_number +1924|1924_number +1925|1925_number +1926|1926_number +1927|1927_number +1928|1928_number +1929|1929_number +1930|1930_number +1931|1931_number +1932|1932_number +1933|1933_number +1934|1934_number +1935|1935_number +1936|1936_number +1937|1937_number +1938|1938_number +1939|1939_number +1940|1940_number +1941|1941_number +1942|1942_number +1943|1943_number +1944|1944_number +1945|1945_number +1946|1946_number +1947|1947_number +1948|1948_number +1949|1949_number +1950|1950_number +1951|1951_number +1952|1952_number +1953|1953_number +1954|1954_number +1955|1955_number +1956|1956_number +1957|1957_number +1958|1958_number +1959|1959_number +1960|1960_number +1961|1961_number +1962|1962_number +1963|1963_number +1964|1964_number +1965|1965_number +1966|1966_number +1967|1967_number +1968|1968_number +1969|1969_number +1970|1970_number +1971|1971_number +1972|1972_number +1973|1973_number +1974|1974_number +1975|1975_number +1976|1976_number +1977|1977_number +1978|1978_number +1979|1979_number +1980|1980_number +1981|1981_number +1982|1982_number +1983|1983_number +1984|1984_number +1985|1985_number +1986|1986_number +1987|1987_number +1988|1988_number +1989|1989_number +1990|1990_number +1991|1991_number +1992|1992_number +1993|1993_number +1994|1994_number +1995|1995_number +1996|1996_number +1997|1997_number +1998|1998_number +1999|1999_number +2000|2000_number +2001|2001_number +2002|2002_number +2003|2003_number +2004|2004_number +2005|2005_number +2006|2006_number +2007|2007_number +2008|2008_number +2009|2009_number +2010|2010_number +2011|2011_number +2012|2012_number +2013|2013_number +2014|2014_number +2015|2015_number +2016|2016_number +2017|2017_number +2018|2018_number +2019|2019_number +2020|2020_number +2021|2021_number +2022|2022_number +2023|2023_number +2024|2024_number +2025|2025_number +2026|2026_number +2027|2027_number +2028|2028_number +2029|2029_number +2030|2030_number +2031|2031_number +2032|2032_number +2033|2033_number +2034|2034_number +2035|2035_number +2036|2036_number +2037|2037_number +2038|2038_number +2039|2039_number +2040|2040_number +2041|2041_number +2042|2042_number +2043|2043_number +2044|2044_number +2045|2045_number +2046|2046_number +2047|2047_number +2048|2048_number +2049|2049_number +2050|2050_number +2051|2051_number +2052|2052_number +2053|2053_number +2054|2054_number +2055|2055_number +2056|2056_number +2057|2057_number +2058|2058_number +2059|2059_number +2060|2060_number +2061|2061_number +2062|2062_number +2063|2063_number +2064|2064_number +2065|2065_number +2066|2066_number +2067|2067_number +2068|2068_number +2069|2069_number +2070|2070_number +2071|2071_number +2072|2072_number +2073|2073_number +2074|2074_number +2075|2075_number +2076|2076_number +2077|2077_number +2078|2078_number +2079|2079_number +2080|2080_number +2081|2081_number +2082|2082_number +2083|2083_number +2084|2084_number +2085|2085_number +2086|2086_number +2087|2087_number +2088|2088_number +2089|2089_number +2090|2090_number +2091|2091_number +2092|2092_number +2093|2093_number +2094|2094_number +2095|2095_number +2096|2096_number +2097|2097_number +2098|2098_number +2099|2099_number +2100|2100_number +2101|2101_number +2102|2102_number +2103|2103_number +2104|2104_number +2105|2105_number +2106|2106_number +2107|2107_number +2108|2108_number +2109|2109_number +2110|2110_number +2111|2111_number +2112|2112_number +2113|2113_number +2114|2114_number +2115|2115_number +2116|2116_number +2117|2117_number +2118|2118_number +2119|2119_number +2120|2120_number +2121|2121_number +2122|2122_number +2123|2123_number +2124|2124_number +2125|2125_number +2126|2126_number +2127|2127_number +2128|2128_number +2129|2129_number +2130|2130_number +2131|2131_number +2132|2132_number +2133|2133_number +2134|2134_number +2135|2135_number +2136|2136_number +2137|2137_number +2138|2138_number +2139|2139_number +2140|2140_number +2141|2141_number +2142|2142_number +2143|2143_number +2144|2144_number +2145|2145_number +2146|2146_number +2147|2147_number +2148|2148_number +2149|2149_number +2150|2150_number +2151|2151_number +2152|2152_number +2153|2153_number +2154|2154_number +2155|2155_number +2156|2156_number +2157|2157_number +2158|2158_number +2159|2159_number +2160|2160_number +2161|2161_number +2162|2162_number +2163|2163_number +2164|2164_number +2165|2165_number +2166|2166_number +2167|2167_number +2168|2168_number +2169|2169_number +2170|2170_number +2171|2171_number +2172|2172_number +2173|2173_number +2174|2174_number +2175|2175_number +2176|2176_number +2177|2177_number +2178|2178_number +2179|2179_number +2180|2180_number +2181|2181_number +2182|2182_number +2183|2183_number +2184|2184_number +2185|2185_number +2186|2186_number +2187|2187_number +2188|2188_number +2189|2189_number +2190|2190_number +2191|2191_number +2192|2192_number +2193|2193_number +2194|2194_number +2195|2195_number +2196|2196_number +2197|2197_number +2198|2198_number +2199|2199_number +2200|2200_number +2201|2201_number +2202|2202_number +2203|2203_number +2204|2204_number +2205|2205_number +2206|2206_number +2207|2207_number +2208|2208_number +2209|2209_number +2210|2210_number +2211|2211_number +2212|2212_number +2213|2213_number +2214|2214_number +2215|2215_number +2216|2216_number +2217|2217_number +2218|2218_number +2219|2219_number +2220|2220_number +2221|2221_number +2222|2222_number +2223|2223_number +2224|2224_number +2225|2225_number +2226|2226_number +2227|2227_number +2228|2228_number +2229|2229_number +2230|2230_number +2231|2231_number +2232|2232_number +2233|2233_number +2234|2234_number +2235|2235_number +2236|2236_number +2237|2237_number +2238|2238_number +2239|2239_number +2240|2240_number +2241|2241_number +2242|2242_number +2243|2243_number +2244|2244_number +2245|2245_number +2246|2246_number +2247|2247_number +2248|2248_number +2249|2249_number +2250|2250_number +2251|2251_number +2252|2252_number +2253|2253_number +2254|2254_number +2255|2255_number +2256|2256_number +2257|2257_number +2258|2258_number +2259|2259_number +2260|2260_number +2261|2261_number +2262|2262_number +2263|2263_number +2264|2264_number +2265|2265_number +2266|2266_number +2267|2267_number +2268|2268_number +2269|2269_number +2270|2270_number +2271|2271_number +2272|2272_number +2273|2273_number +2274|2274_number +2275|2275_number +2276|2276_number +2277|2277_number +2278|2278_number +2279|2279_number +2280|2280_number +2281|2281_number +2282|2282_number +2283|2283_number +2284|2284_number +2285|2285_number +2286|2286_number +2287|2287_number +2288|2288_number +2289|2289_number +2290|2290_number +2291|2291_number +2292|2292_number +2293|2293_number +2294|2294_number +2295|2295_number +2296|2296_number +2297|2297_number +2298|2298_number +2299|2299_number +2300|2300_number +2301|2301_number +2302|2302_number +2303|2303_number +2304|2304_number +2305|2305_number +2306|2306_number +2307|2307_number +2308|2308_number +2309|2309_number +2310|2310_number +2311|2311_number +2312|2312_number +2313|2313_number +2314|2314_number +2315|2315_number +2316|2316_number +2317|2317_number +2318|2318_number +2319|2319_number +2320|2320_number +2321|2321_number +2322|2322_number +2323|2323_number +2324|2324_number +2325|2325_number +2326|2326_number +2327|2327_number +2328|2328_number +2329|2329_number +2330|2330_number +2331|2331_number +2332|2332_number +2333|2333_number +2334|2334_number +2335|2335_number +2336|2336_number +2337|2337_number +2338|2338_number +2339|2339_number +2340|2340_number +2341|2341_number +2342|2342_number +2343|2343_number +2344|2344_number +2345|2345_number +2346|2346_number +2347|2347_number +2348|2348_number +2349|2349_number +2350|2350_number +2351|2351_number +2352|2352_number +2353|2353_number +2354|2354_number +2355|2355_number +2356|2356_number +2357|2357_number +2358|2358_number +2359|2359_number +2360|2360_number +2361|2361_number +2362|2362_number +2363|2363_number +2364|2364_number +2365|2365_number +2366|2366_number +2367|2367_number +2368|2368_number +2369|2369_number +2370|2370_number +2371|2371_number +2372|2372_number +2373|2373_number +2374|2374_number +2375|2375_number +2376|2376_number +2377|2377_number +2378|2378_number +2379|2379_number +2380|2380_number +2381|2381_number +2382|2382_number +2383|2383_number +2384|2384_number +2385|2385_number +2386|2386_number +2387|2387_number +2388|2388_number +2389|2389_number +2390|2390_number +2391|2391_number +2392|2392_number +2393|2393_number +2394|2394_number +2395|2395_number +2396|2396_number +2397|2397_number +2398|2398_number +2399|2399_number +2400|2400_number +2401|2401_number +2402|2402_number +2403|2403_number +2404|2404_number +2405|2405_number +2406|2406_number +2407|2407_number +2408|2408_number +2409|2409_number +2410|2410_number +2411|2411_number +2412|2412_number +2413|2413_number +2414|2414_number +2415|2415_number +2416|2416_number +2417|2417_number +2418|2418_number +2419|2419_number +2420|2420_number +2421|2421_number +2422|2422_number +2423|2423_number +2424|2424_number +2425|2425_number +2426|2426_number +2427|2427_number +2428|2428_number +2429|2429_number +2430|2430_number +2431|2431_number +2432|2432_number +2433|2433_number +2434|2434_number +2435|2435_number +2436|2436_number +2437|2437_number +2438|2438_number +2439|2439_number +2440|2440_number +2441|2441_number +2442|2442_number +2443|2443_number +2444|2444_number +2445|2445_number +2446|2446_number +2447|2447_number +2448|2448_number +2449|2449_number +2450|2450_number +2451|2451_number +2452|2452_number +2453|2453_number +2454|2454_number +2455|2455_number +2456|2456_number +2457|2457_number +2458|2458_number +2459|2459_number +2460|2460_number +2461|2461_number +2462|2462_number +2463|2463_number +2464|2464_number +2465|2465_number +2466|2466_number +2467|2467_number +2468|2468_number +2469|2469_number +2470|2470_number +2471|2471_number +2472|2472_number +2473|2473_number +2474|2474_number +2475|2475_number +2476|2476_number +2477|2477_number +2478|2478_number +2479|2479_number +2480|2480_number +2481|2481_number +2482|2482_number +2483|2483_number +2484|2484_number +2485|2485_number +2486|2486_number +2487|2487_number +2488|2488_number +2489|2489_number +2490|2490_number +2491|2491_number +2492|2492_number +2493|2493_number +2494|2494_number +2495|2495_number +2496|2496_number +2497|2497_number +2498|2498_number +2499|2499_number +2500|2500_number +2501|2501_number +2502|2502_number +2503|2503_number +2504|2504_number +2505|2505_number +2506|2506_number +2507|2507_number +2508|2508_number +2509|2509_number +2510|2510_number +2511|2511_number +2512|2512_number +2513|2513_number +2514|2514_number +2515|2515_number +2516|2516_number +2517|2517_number +2518|2518_number +2519|2519_number +2520|2520_number +2521|2521_number +2522|2522_number +2523|2523_number +2524|2524_number +2525|2525_number +2526|2526_number +2527|2527_number +2528|2528_number +2529|2529_number +2530|2530_number +2531|2531_number +2532|2532_number +2533|2533_number +2534|2534_number +2535|2535_number +2536|2536_number +2537|2537_number +2538|2538_number +2539|2539_number +2540|2540_number +2541|2541_number +2542|2542_number +2543|2543_number +2544|2544_number +2545|2545_number +2546|2546_number +2547|2547_number +2548|2548_number +2549|2549_number +2550|2550_number +2551|2551_number +2552|2552_number +2553|2553_number +2554|2554_number +2555|2555_number +2556|2556_number +2557|2557_number +2558|2558_number +2559|2559_number +2560|2560_number +2561|2561_number +2562|2562_number +2563|2563_number +2564|2564_number +2565|2565_number +2566|2566_number +2567|2567_number +2568|2568_number +2569|2569_number +2570|2570_number +2571|2571_number +2572|2572_number +2573|2573_number +2574|2574_number +2575|2575_number +2576|2576_number +2577|2577_number +2578|2578_number +2579|2579_number +2580|2580_number +2581|2581_number +2582|2582_number +2583|2583_number +2584|2584_number +2585|2585_number +2586|2586_number +2587|2587_number +2588|2588_number +2589|2589_number +2590|2590_number +2591|2591_number +2592|2592_number +2593|2593_number +2594|2594_number +2595|2595_number +2596|2596_number +2597|2597_number +2598|2598_number +2599|2599_number +2600|2600_number +2601|2601_number +2602|2602_number +2603|2603_number +2604|2604_number +2605|2605_number +2606|2606_number +2607|2607_number +2608|2608_number +2609|2609_number +2610|2610_number +2611|2611_number +2612|2612_number +2613|2613_number +2614|2614_number +2615|2615_number +2616|2616_number +2617|2617_number +2618|2618_number +2619|2619_number +2620|2620_number +2621|2621_number +2622|2622_number +2623|2623_number +2624|2624_number +2625|2625_number +2626|2626_number +2627|2627_number +2628|2628_number +2629|2629_number +2630|2630_number +2631|2631_number +2632|2632_number +2633|2633_number +2634|2634_number +2635|2635_number +2636|2636_number +2637|2637_number +2638|2638_number +2639|2639_number +2640|2640_number +2641|2641_number +2642|2642_number +2643|2643_number +2644|2644_number +2645|2645_number +2646|2646_number +2647|2647_number +2648|2648_number +2649|2649_number +2650|2650_number +2651|2651_number +2652|2652_number +2653|2653_number +2654|2654_number +2655|2655_number +2656|2656_number +2657|2657_number +2658|2658_number +2659|2659_number +2660|2660_number +2661|2661_number +2662|2662_number +2663|2663_number +2664|2664_number +2665|2665_number +2666|2666_number +2667|2667_number +2668|2668_number +2669|2669_number +2670|2670_number +2671|2671_number +2672|2672_number +2673|2673_number +2674|2674_number +2675|2675_number +2676|2676_number +2677|2677_number +2678|2678_number +2679|2679_number +2680|2680_number +2681|2681_number +2682|2682_number +2683|2683_number +2684|2684_number +2685|2685_number +2686|2686_number +2687|2687_number +2688|2688_number +2689|2689_number +2690|2690_number +2691|2691_number +2692|2692_number +2693|2693_number +2694|2694_number +2695|2695_number +2696|2696_number +2697|2697_number +2698|2698_number +2699|2699_number +2700|2700_number +2701|2701_number +2702|2702_number +2703|2703_number +2704|2704_number +2705|2705_number +2706|2706_number +2707|2707_number +2708|2708_number +2709|2709_number +2710|2710_number +2711|2711_number +2712|2712_number +2713|2713_number +2714|2714_number +2715|2715_number +2716|2716_number +2717|2717_number +2718|2718_number +2719|2719_number +2720|2720_number +2721|2721_number +2722|2722_number +2723|2723_number +2724|2724_number +2725|2725_number +2726|2726_number +2727|2727_number +2728|2728_number +2729|2729_number +2730|2730_number +2731|2731_number +2732|2732_number +2733|2733_number +2734|2734_number +2735|2735_number +2736|2736_number +2737|2737_number +2738|2738_number +2739|2739_number +2740|2740_number +2741|2741_number +2742|2742_number +2743|2743_number +2744|2744_number +2745|2745_number +2746|2746_number +2747|2747_number +2748|2748_number +2749|2749_number +2750|2750_number +2751|2751_number +2752|2752_number +2753|2753_number +2754|2754_number +2755|2755_number +2756|2756_number +2757|2757_number +2758|2758_number +2759|2759_number +2760|2760_number +2761|2761_number +2762|2762_number +2763|2763_number +2764|2764_number +2765|2765_number +2766|2766_number +2767|2767_number +2768|2768_number +2769|2769_number +2770|2770_number +2771|2771_number +2772|2772_number +2773|2773_number +2774|2774_number +2775|2775_number +2776|2776_number +2777|2777_number +2778|2778_number +2779|2779_number +2780|2780_number +2781|2781_number +2782|2782_number +2783|2783_number +2784|2784_number +2785|2785_number +2786|2786_number +2787|2787_number +2788|2788_number +2789|2789_number +2790|2790_number +2791|2791_number +2792|2792_number +2793|2793_number +2794|2794_number +2795|2795_number +2796|2796_number +2797|2797_number +2798|2798_number +2799|2799_number +2800|2800_number +2801|2801_number +2802|2802_number +2803|2803_number +2804|2804_number +2805|2805_number +2806|2806_number +2807|2807_number +2808|2808_number +2809|2809_number +2810|2810_number +2811|2811_number +2812|2812_number +2813|2813_number +2814|2814_number +2815|2815_number +2816|2816_number +2817|2817_number +2818|2818_number +2819|2819_number +2820|2820_number +2821|2821_number +2822|2822_number +2823|2823_number +2824|2824_number +2825|2825_number +2826|2826_number +2827|2827_number +2828|2828_number +2829|2829_number +2830|2830_number +2831|2831_number +2832|2832_number +2833|2833_number +2834|2834_number +2835|2835_number +2836|2836_number +2837|2837_number +2838|2838_number +2839|2839_number +2840|2840_number +2841|2841_number +2842|2842_number +2843|2843_number +2844|2844_number +2845|2845_number +2846|2846_number +2847|2847_number +2848|2848_number +2849|2849_number +2850|2850_number +2851|2851_number +2852|2852_number +2853|2853_number +2854|2854_number +2855|2855_number +2856|2856_number +2857|2857_number +2858|2858_number +2859|2859_number +2860|2860_number +2861|2861_number +2862|2862_number +2863|2863_number +2864|2864_number +2865|2865_number +2866|2866_number +2867|2867_number +2868|2868_number +2869|2869_number +2870|2870_number +2871|2871_number +2872|2872_number +2873|2873_number +2874|2874_number +2875|2875_number +2876|2876_number +2877|2877_number +2878|2878_number +2879|2879_number +2880|2880_number +2881|2881_number +2882|2882_number +2883|2883_number +2884|2884_number +2885|2885_number +2886|2886_number +2887|2887_number +2888|2888_number +2889|2889_number +2890|2890_number +2891|2891_number +2892|2892_number +2893|2893_number +2894|2894_number +2895|2895_number +2896|2896_number +2897|2897_number +2898|2898_number +2899|2899_number +2900|2900_number +2901|2901_number +2902|2902_number +2903|2903_number +2904|2904_number +2905|2905_number +2906|2906_number +2907|2907_number +2908|2908_number +2909|2909_number +2910|2910_number +2911|2911_number +2912|2912_number +2913|2913_number +2914|2914_number +2915|2915_number +2916|2916_number +2917|2917_number +2918|2918_number +2919|2919_number +2920|2920_number +2921|2921_number +2922|2922_number +2923|2923_number +2924|2924_number +2925|2925_number +2926|2926_number +2927|2927_number +2928|2928_number +2929|2929_number +2930|2930_number +2931|2931_number +2932|2932_number +2933|2933_number +2934|2934_number +2935|2935_number +2936|2936_number +2937|2937_number +2938|2938_number +2939|2939_number +2940|2940_number +2941|2941_number +2942|2942_number +2943|2943_number +2944|2944_number +2945|2945_number +2946|2946_number +2947|2947_number +2948|2948_number +2949|2949_number +2950|2950_number +2951|2951_number +2952|2952_number +2953|2953_number +2954|2954_number +2955|2955_number +2956|2956_number +2957|2957_number +2958|2958_number +2959|2959_number +2960|2960_number +2961|2961_number +2962|2962_number +2963|2963_number +2964|2964_number +2965|2965_number +2966|2966_number +2967|2967_number +2968|2968_number +2969|2969_number +2970|2970_number +2971|2971_number +2972|2972_number +2973|2973_number +2974|2974_number +2975|2975_number +2976|2976_number +2977|2977_number +2978|2978_number +2979|2979_number +2980|2980_number +2981|2981_number +2982|2982_number +2983|2983_number +2984|2984_number +2985|2985_number +2986|2986_number +2987|2987_number +2988|2988_number +2989|2989_number +2990|2990_number +2991|2991_number +2992|2992_number +2993|2993_number +2994|2994_number +2995|2995_number +2996|2996_number +2997|2997_number +2998|2998_number +2999|2999_number +3000|3000_number +3001|3001_number +3002|3002_number +3003|3003_number +3004|3004_number +3005|3005_number +3006|3006_number +3007|3007_number +3008|3008_number +3009|3009_number +3010|3010_number +3011|3011_number +3012|3012_number +3013|3013_number +3014|3014_number +3015|3015_number +3016|3016_number +3017|3017_number +3018|3018_number +3019|3019_number +3020|3020_number +3021|3021_number +3022|3022_number +3023|3023_number +3024|3024_number +3025|3025_number +3026|3026_number +3027|3027_number +3028|3028_number +3029|3029_number +3030|3030_number +3031|3031_number +3032|3032_number +3033|3033_number +3034|3034_number +3035|3035_number +3036|3036_number +3037|3037_number +3038|3038_number +3039|3039_number +3040|3040_number +3041|3041_number +3042|3042_number +3043|3043_number +3044|3044_number +3045|3045_number +3046|3046_number +3047|3047_number +3048|3048_number +3049|3049_number +3050|3050_number +3051|3051_number +3052|3052_number +3053|3053_number +3054|3054_number +3055|3055_number +3056|3056_number +3057|3057_number +3058|3058_number +3059|3059_number +3060|3060_number +3061|3061_number +3062|3062_number +3063|3063_number +3064|3064_number +3065|3065_number +3066|3066_number +3067|3067_number +3068|3068_number +3069|3069_number +3070|3070_number +3071|3071_number +3072|3072_number +3073|3073_number +3074|3074_number +3075|3075_number +3076|3076_number +3077|3077_number +3078|3078_number +3079|3079_number +3080|3080_number +3081|3081_number +3082|3082_number +3083|3083_number +3084|3084_number +3085|3085_number +3086|3086_number +3087|3087_number +3088|3088_number +3089|3089_number +3090|3090_number +3091|3091_number +3092|3092_number +3093|3093_number +3094|3094_number +3095|3095_number +3096|3096_number +3097|3097_number +3098|3098_number +3099|3099_number +3100|3100_number +3101|3101_number +3102|3102_number +3103|3103_number +3104|3104_number +3105|3105_number +3106|3106_number +3107|3107_number +3108|3108_number +3109|3109_number +3110|3110_number +3111|3111_number +3112|3112_number +3113|3113_number +3114|3114_number +3115|3115_number +3116|3116_number +3117|3117_number +3118|3118_number +3119|3119_number +3120|3120_number +3121|3121_number +3122|3122_number +3123|3123_number +3124|3124_number +3125|3125_number +3126|3126_number +3127|3127_number +3128|3128_number +3129|3129_number +3130|3130_number +3131|3131_number +3132|3132_number +3133|3133_number +3134|3134_number +3135|3135_number +3136|3136_number +3137|3137_number +3138|3138_number +3139|3139_number +3140|3140_number +3141|3141_number +3142|3142_number +3143|3143_number +3144|3144_number +3145|3145_number +3146|3146_number +3147|3147_number +3148|3148_number +3149|3149_number +3150|3150_number +3151|3151_number +3152|3152_number +3153|3153_number +3154|3154_number +3155|3155_number +3156|3156_number +3157|3157_number +3158|3158_number +3159|3159_number +3160|3160_number +3161|3161_number +3162|3162_number +3163|3163_number +3164|3164_number +3165|3165_number +3166|3166_number +3167|3167_number +3168|3168_number +3169|3169_number +3170|3170_number +3171|3171_number +3172|3172_number +3173|3173_number +3174|3174_number +3175|3175_number +3176|3176_number +3177|3177_number +3178|3178_number +3179|3179_number +3180|3180_number +3181|3181_number +3182|3182_number +3183|3183_number +3184|3184_number +3185|3185_number +3186|3186_number +3187|3187_number +3188|3188_number +3189|3189_number +3190|3190_number +3191|3191_number +3192|3192_number +3193|3193_number +3194|3194_number +3195|3195_number +3196|3196_number +3197|3197_number +3198|3198_number +3199|3199_number +3200|3200_number +3201|3201_number +3202|3202_number +3203|3203_number +3204|3204_number +3205|3205_number +3206|3206_number +3207|3207_number +3208|3208_number +3209|3209_number +3210|3210_number +3211|3211_number +3212|3212_number +3213|3213_number +3214|3214_number +3215|3215_number +3216|3216_number +3217|3217_number +3218|3218_number +3219|3219_number +3220|3220_number +3221|3221_number +3222|3222_number +3223|3223_number +3224|3224_number +3225|3225_number +3226|3226_number +3227|3227_number +3228|3228_number +3229|3229_number +3230|3230_number +3231|3231_number +3232|3232_number +3233|3233_number +3234|3234_number +3235|3235_number +3236|3236_number +3237|3237_number +3238|3238_number +3239|3239_number +3240|3240_number +3241|3241_number +3242|3242_number +3243|3243_number +3244|3244_number +3245|3245_number +3246|3246_number +3247|3247_number +3248|3248_number +3249|3249_number +3250|3250_number +3251|3251_number +3252|3252_number +3253|3253_number +3254|3254_number +3255|3255_number +3256|3256_number +3257|3257_number +3258|3258_number +3259|3259_number +3260|3260_number +3261|3261_number +3262|3262_number +3263|3263_number +3264|3264_number +3265|3265_number +3266|3266_number +3267|3267_number +3268|3268_number +3269|3269_number +3270|3270_number +3271|3271_number +3272|3272_number +3273|3273_number +3274|3274_number +3275|3275_number +3276|3276_number +3277|3277_number +3278|3278_number +3279|3279_number +3280|3280_number +3281|3281_number +3282|3282_number +3283|3283_number +3284|3284_number +3285|3285_number +3286|3286_number +3287|3287_number +3288|3288_number +3289|3289_number +3290|3290_number +3291|3291_number +3292|3292_number +3293|3293_number +3294|3294_number +3295|3295_number +3296|3296_number +3297|3297_number +3298|3298_number +3299|3299_number +3300|3300_number +3301|3301_number +3302|3302_number +3303|3303_number +3304|3304_number +3305|3305_number +3306|3306_number +3307|3307_number +3308|3308_number +3309|3309_number +3310|3310_number +3311|3311_number +3312|3312_number +3313|3313_number +3314|3314_number +3315|3315_number +3316|3316_number +3317|3317_number +3318|3318_number +3319|3319_number +3320|3320_number +3321|3321_number +3322|3322_number +3323|3323_number +3324|3324_number +3325|3325_number +3326|3326_number +3327|3327_number +3328|3328_number +3329|3329_number +3330|3330_number +3331|3331_number +3332|3332_number +3333|3333_number +3334|3334_number +3335|3335_number +3336|3336_number +3337|3337_number +3338|3338_number +3339|3339_number +3340|3340_number +3341|3341_number +3342|3342_number +3343|3343_number +3344|3344_number +3345|3345_number +3346|3346_number +3347|3347_number +3348|3348_number +3349|3349_number +3350|3350_number +3351|3351_number +3352|3352_number +3353|3353_number +3354|3354_number +3355|3355_number +3356|3356_number +3357|3357_number +3358|3358_number +3359|3359_number +3360|3360_number +3361|3361_number +3362|3362_number +3363|3363_number +3364|3364_number +3365|3365_number +3366|3366_number +3367|3367_number +3368|3368_number +3369|3369_number +3370|3370_number +3371|3371_number +3372|3372_number +3373|3373_number +3374|3374_number +3375|3375_number +3376|3376_number +3377|3377_number +3378|3378_number +3379|3379_number +3380|3380_number +3381|3381_number +3382|3382_number +3383|3383_number +3384|3384_number +3385|3385_number +3386|3386_number +3387|3387_number +3388|3388_number +3389|3389_number +3390|3390_number +3391|3391_number +3392|3392_number +3393|3393_number +3394|3394_number +3395|3395_number +3396|3396_number +3397|3397_number +3398|3398_number +3399|3399_number +3400|3400_number +3401|3401_number +3402|3402_number +3403|3403_number +3404|3404_number +3405|3405_number +3406|3406_number +3407|3407_number +3408|3408_number +3409|3409_number +3410|3410_number +3411|3411_number +3412|3412_number +3413|3413_number +3414|3414_number +3415|3415_number +3416|3416_number +3417|3417_number +3418|3418_number +3419|3419_number +3420|3420_number +3421|3421_number +3422|3422_number +3423|3423_number +3424|3424_number +3425|3425_number +3426|3426_number +3427|3427_number +3428|3428_number +3429|3429_number +3430|3430_number +3431|3431_number +3432|3432_number +3433|3433_number +3434|3434_number +3435|3435_number +3436|3436_number +3437|3437_number +3438|3438_number +3439|3439_number +3440|3440_number +3441|3441_number +3442|3442_number +3443|3443_number +3444|3444_number +3445|3445_number +3446|3446_number +3447|3447_number +3448|3448_number +3449|3449_number +3450|3450_number +3451|3451_number +3452|3452_number +3453|3453_number +3454|3454_number +3455|3455_number +3456|3456_number +3457|3457_number +3458|3458_number +3459|3459_number +3460|3460_number +3461|3461_number +3462|3462_number +3463|3463_number +3464|3464_number +3465|3465_number +3466|3466_number +3467|3467_number +3468|3468_number +3469|3469_number +3470|3470_number +3471|3471_number +3472|3472_number +3473|3473_number +3474|3474_number +3475|3475_number +3476|3476_number +3477|3477_number +3478|3478_number +3479|3479_number +3480|3480_number +3481|3481_number +3482|3482_number +3483|3483_number +3484|3484_number +3485|3485_number +3486|3486_number +3487|3487_number +3488|3488_number +3489|3489_number +3490|3490_number +3491|3491_number +3492|3492_number +3493|3493_number +3494|3494_number +3495|3495_number +3496|3496_number +3497|3497_number +3498|3498_number +3499|3499_number +3500|3500_number +3501|3501_number +3502|3502_number +3503|3503_number +3504|3504_number +3505|3505_number +3506|3506_number +3507|3507_number +3508|3508_number +3509|3509_number +3510|3510_number +3511|3511_number +3512|3512_number +3513|3513_number +3514|3514_number +3515|3515_number +3516|3516_number +3517|3517_number +3518|3518_number +3519|3519_number +3520|3520_number +3521|3521_number +3522|3522_number +3523|3523_number +3524|3524_number +3525|3525_number +3526|3526_number +3527|3527_number +3528|3528_number +3529|3529_number +3530|3530_number +3531|3531_number +3532|3532_number +3533|3533_number +3534|3534_number +3535|3535_number +3536|3536_number +3537|3537_number +3538|3538_number +3539|3539_number +3540|3540_number +3541|3541_number +3542|3542_number +3543|3543_number +3544|3544_number +3545|3545_number +3546|3546_number +3547|3547_number +3548|3548_number +3549|3549_number +3550|3550_number +3551|3551_number +3552|3552_number +3553|3553_number +3554|3554_number +3555|3555_number +3556|3556_number +3557|3557_number +3558|3558_number +3559|3559_number +3560|3560_number +3561|3561_number +3562|3562_number +3563|3563_number +3564|3564_number +3565|3565_number +3566|3566_number +3567|3567_number +3568|3568_number +3569|3569_number +3570|3570_number +3571|3571_number +3572|3572_number +3573|3573_number +3574|3574_number +3575|3575_number +3576|3576_number +3577|3577_number +3578|3578_number +3579|3579_number +3580|3580_number +3581|3581_number +3582|3582_number +3583|3583_number +3584|3584_number +3585|3585_number +3586|3586_number +3587|3587_number +3588|3588_number +3589|3589_number +3590|3590_number +3591|3591_number +3592|3592_number +3593|3593_number +3594|3594_number +3595|3595_number +3596|3596_number +3597|3597_number +3598|3598_number +3599|3599_number +3600|3600_number +3601|3601_number +3602|3602_number +3603|3603_number +3604|3604_number +3605|3605_number +3606|3606_number +3607|3607_number +3608|3608_number +3609|3609_number +3610|3610_number +3611|3611_number +3612|3612_number +3613|3613_number +3614|3614_number +3615|3615_number +3616|3616_number +3617|3617_number +3618|3618_number +3619|3619_number +3620|3620_number +3621|3621_number +3622|3622_number +3623|3623_number +3624|3624_number +3625|3625_number +3626|3626_number +3627|3627_number +3628|3628_number +3629|3629_number +3630|3630_number +3631|3631_number +3632|3632_number +3633|3633_number +3634|3634_number +3635|3635_number +3636|3636_number +3637|3637_number +3638|3638_number +3639|3639_number +3640|3640_number +3641|3641_number +3642|3642_number +3643|3643_number +3644|3644_number +3645|3645_number +3646|3646_number +3647|3647_number +3648|3648_number +3649|3649_number +3650|3650_number +3651|3651_number +3652|3652_number +3653|3653_number +3654|3654_number +3655|3655_number +3656|3656_number +3657|3657_number +3658|3658_number +3659|3659_number +3660|3660_number +3661|3661_number +3662|3662_number +3663|3663_number +3664|3664_number +3665|3665_number +3666|3666_number +3667|3667_number +3668|3668_number +3669|3669_number +3670|3670_number +3671|3671_number +3672|3672_number +3673|3673_number +3674|3674_number +3675|3675_number +3676|3676_number +3677|3677_number +3678|3678_number +3679|3679_number +3680|3680_number +3681|3681_number +3682|3682_number +3683|3683_number +3684|3684_number +3685|3685_number +3686|3686_number +3687|3687_number +3688|3688_number +3689|3689_number +3690|3690_number +3691|3691_number +3692|3692_number +3693|3693_number +3694|3694_number +3695|3695_number +3696|3696_number +3697|3697_number +3698|3698_number +3699|3699_number +3700|3700_number +3701|3701_number +3702|3702_number +3703|3703_number +3704|3704_number +3705|3705_number +3706|3706_number +3707|3707_number +3708|3708_number +3709|3709_number +3710|3710_number +3711|3711_number +3712|3712_number +3713|3713_number +3714|3714_number +3715|3715_number +3716|3716_number +3717|3717_number +3718|3718_number +3719|3719_number +3720|3720_number +3721|3721_number +3722|3722_number +3723|3723_number +3724|3724_number +3725|3725_number +3726|3726_number +3727|3727_number +3728|3728_number +3729|3729_number +3730|3730_number +3731|3731_number +3732|3732_number +3733|3733_number +3734|3734_number +3735|3735_number +3736|3736_number +3737|3737_number +3738|3738_number +3739|3739_number +3740|3740_number +3741|3741_number +3742|3742_number +3743|3743_number +3744|3744_number +3745|3745_number +3746|3746_number +3747|3747_number +3748|3748_number +3749|3749_number +3750|3750_number +3751|3751_number +3752|3752_number +3753|3753_number +3754|3754_number +3755|3755_number +3756|3756_number +3757|3757_number +3758|3758_number +3759|3759_number +3760|3760_number +3761|3761_number +3762|3762_number +3763|3763_number +3764|3764_number +3765|3765_number +3766|3766_number +3767|3767_number +3768|3768_number +3769|3769_number +3770|3770_number +3771|3771_number +3772|3772_number +3773|3773_number +3774|3774_number +3775|3775_number +3776|3776_number +3777|3777_number +3778|3778_number +3779|3779_number +3780|3780_number +3781|3781_number +3782|3782_number +3783|3783_number +3784|3784_number +3785|3785_number +3786|3786_number +3787|3787_number +3788|3788_number +3789|3789_number +3790|3790_number +3791|3791_number +3792|3792_number +3793|3793_number +3794|3794_number +3795|3795_number +3796|3796_number +3797|3797_number +3798|3798_number +3799|3799_number +3800|3800_number +3801|3801_number +3802|3802_number +3803|3803_number +3804|3804_number +3805|3805_number +3806|3806_number +3807|3807_number +3808|3808_number +3809|3809_number +3810|3810_number +3811|3811_number +3812|3812_number +3813|3813_number +3814|3814_number +3815|3815_number +3816|3816_number +3817|3817_number +3818|3818_number +3819|3819_number +3820|3820_number +3821|3821_number +3822|3822_number +3823|3823_number +3824|3824_number +3825|3825_number +3826|3826_number +3827|3827_number +3828|3828_number +3829|3829_number +3830|3830_number +3831|3831_number +3832|3832_number +3833|3833_number +3834|3834_number +3835|3835_number +3836|3836_number +3837|3837_number +3838|3838_number +3839|3839_number +3840|3840_number +3841|3841_number +3842|3842_number +3843|3843_number +3844|3844_number +3845|3845_number +3846|3846_number +3847|3847_number +3848|3848_number +3849|3849_number +3850|3850_number +3851|3851_number +3852|3852_number +3853|3853_number +3854|3854_number +3855|3855_number +3856|3856_number +3857|3857_number +3858|3858_number +3859|3859_number +3860|3860_number +3861|3861_number +3862|3862_number +3863|3863_number +3864|3864_number +3865|3865_number +3866|3866_number +3867|3867_number +3868|3868_number +3869|3869_number +3870|3870_number +3871|3871_number +3872|3872_number +3873|3873_number +3874|3874_number +3875|3875_number +3876|3876_number +3877|3877_number +3878|3878_number +3879|3879_number +3880|3880_number +3881|3881_number +3882|3882_number +3883|3883_number +3884|3884_number +3885|3885_number +3886|3886_number +3887|3887_number +3888|3888_number +3889|3889_number +3890|3890_number +3891|3891_number +3892|3892_number +3893|3893_number +3894|3894_number +3895|3895_number +3896|3896_number +3897|3897_number +3898|3898_number +3899|3899_number +3900|3900_number +3901|3901_number +3902|3902_number +3903|3903_number +3904|3904_number +3905|3905_number +3906|3906_number +3907|3907_number +3908|3908_number +3909|3909_number +3910|3910_number +3911|3911_number +3912|3912_number +3913|3913_number +3914|3914_number +3915|3915_number +3916|3916_number +3917|3917_number +3918|3918_number +3919|3919_number +3920|3920_number +3921|3921_number +3922|3922_number +3923|3923_number +3924|3924_number +3925|3925_number +3926|3926_number +3927|3927_number +3928|3928_number +3929|3929_number +3930|3930_number +3931|3931_number +3932|3932_number +3933|3933_number +3934|3934_number +3935|3935_number +3936|3936_number +3937|3937_number +3938|3938_number +3939|3939_number +3940|3940_number +3941|3941_number +3942|3942_number +3943|3943_number +3944|3944_number +3945|3945_number +3946|3946_number +3947|3947_number +3948|3948_number +3949|3949_number +3950|3950_number +3951|3951_number +3952|3952_number +3953|3953_number +3954|3954_number +3955|3955_number +3956|3956_number +3957|3957_number +3958|3958_number +3959|3959_number +3960|3960_number +3961|3961_number +3962|3962_number +3963|3963_number +3964|3964_number +3965|3965_number +3966|3966_number +3967|3967_number +3968|3968_number +3969|3969_number +3970|3970_number +3971|3971_number +3972|3972_number +3973|3973_number +3974|3974_number +3975|3975_number +3976|3976_number +3977|3977_number +3978|3978_number +3979|3979_number +3980|3980_number +3981|3981_number +3982|3982_number +3983|3983_number +3984|3984_number +3985|3985_number +3986|3986_number +3987|3987_number +3988|3988_number +3989|3989_number +3990|3990_number +3991|3991_number +3992|3992_number +3993|3993_number +3994|3994_number +3995|3995_number +3996|3996_number +3997|3997_number +3998|3998_number +3999|3999_number +4000|4000_number +4001|4001_number +4002|4002_number +4003|4003_number +4004|4004_number +4005|4005_number +4006|4006_number +4007|4007_number +4008|4008_number +4009|4009_number +4010|4010_number +4011|4011_number +4012|4012_number +4013|4013_number +4014|4014_number +4015|4015_number +4016|4016_number +4017|4017_number +4018|4018_number +4019|4019_number +4020|4020_number +4021|4021_number +4022|4022_number +4023|4023_number +4024|4024_number +4025|4025_number +4026|4026_number +4027|4027_number +4028|4028_number +4029|4029_number +4030|4030_number +4031|4031_number +4032|4032_number +4033|4033_number +4034|4034_number +4035|4035_number +4036|4036_number +4037|4037_number +4038|4038_number +4039|4039_number +4040|4040_number +4041|4041_number +4042|4042_number +4043|4043_number +4044|4044_number +4045|4045_number +4046|4046_number +4047|4047_number +4048|4048_number +4049|4049_number +4050|4050_number +4051|4051_number +4052|4052_number +4053|4053_number +4054|4054_number +4055|4055_number +4056|4056_number +4057|4057_number +4058|4058_number +4059|4059_number +4060|4060_number +4061|4061_number +4062|4062_number +4063|4063_number +4064|4064_number +4065|4065_number +4066|4066_number +4067|4067_number +4068|4068_number +4069|4069_number +4070|4070_number +4071|4071_number +4072|4072_number +4073|4073_number +4074|4074_number +4075|4075_number +4076|4076_number +4077|4077_number +4078|4078_number +4079|4079_number +4080|4080_number +4081|4081_number +4082|4082_number +4083|4083_number +4084|4084_number +4085|4085_number +4086|4086_number +4087|4087_number +4088|4088_number +4089|4089_number +4090|4090_number +4091|4091_number +4092|4092_number +4093|4093_number +4094|4094_number +4095|4095_number +4096|4096_number +4097|4097_number +4098|4098_number +4099|4099_number +4100|4100_number +4101|4101_number +4102|4102_number +4103|4103_number +4104|4104_number +4105|4105_number +4106|4106_number +4107|4107_number +4108|4108_number +4109|4109_number +4110|4110_number +4111|4111_number +4112|4112_number +4113|4113_number +4114|4114_number +4115|4115_number +4116|4116_number +4117|4117_number +4118|4118_number +4119|4119_number +4120|4120_number +4121|4121_number +4122|4122_number +4123|4123_number +4124|4124_number +4125|4125_number +4126|4126_number +4127|4127_number +4128|4128_number +4129|4129_number +4130|4130_number +4131|4131_number +4132|4132_number +4133|4133_number +4134|4134_number +4135|4135_number +4136|4136_number +4137|4137_number +4138|4138_number +4139|4139_number +4140|4140_number +4141|4141_number +4142|4142_number +4143|4143_number +4144|4144_number +4145|4145_number +4146|4146_number +4147|4147_number +4148|4148_number +4149|4149_number +4150|4150_number +4151|4151_number +4152|4152_number +4153|4153_number +4154|4154_number +4155|4155_number +4156|4156_number +4157|4157_number +4158|4158_number +4159|4159_number +4160|4160_number +4161|4161_number +4162|4162_number +4163|4163_number +4164|4164_number +4165|4165_number +4166|4166_number +4167|4167_number +4168|4168_number +4169|4169_number +4170|4170_number +4171|4171_number +4172|4172_number +4173|4173_number +4174|4174_number +4175|4175_number +4176|4176_number +4177|4177_number +4178|4178_number +4179|4179_number +4180|4180_number +4181|4181_number +4182|4182_number +4183|4183_number +4184|4184_number +4185|4185_number +4186|4186_number +4187|4187_number +4188|4188_number +4189|4189_number +4190|4190_number +4191|4191_number +4192|4192_number +4193|4193_number +4194|4194_number +4195|4195_number +4196|4196_number +4197|4197_number +4198|4198_number +4199|4199_number +4200|4200_number +4201|4201_number +4202|4202_number +4203|4203_number +4204|4204_number +4205|4205_number +4206|4206_number +4207|4207_number +4208|4208_number +4209|4209_number +4210|4210_number +4211|4211_number +4212|4212_number +4213|4213_number +4214|4214_number +4215|4215_number +4216|4216_number +4217|4217_number +4218|4218_number +4219|4219_number +4220|4220_number +4221|4221_number +4222|4222_number +4223|4223_number +4224|4224_number +4225|4225_number +4226|4226_number +4227|4227_number +4228|4228_number +4229|4229_number +4230|4230_number +4231|4231_number +4232|4232_number +4233|4233_number +4234|4234_number +4235|4235_number +4236|4236_number +4237|4237_number +4238|4238_number +4239|4239_number +4240|4240_number +4241|4241_number +4242|4242_number +4243|4243_number +4244|4244_number +4245|4245_number +4246|4246_number +4247|4247_number +4248|4248_number +4249|4249_number +4250|4250_number +4251|4251_number +4252|4252_number +4253|4253_number +4254|4254_number +4255|4255_number +4256|4256_number +4257|4257_number +4258|4258_number +4259|4259_number +4260|4260_number +4261|4261_number +4262|4262_number +4263|4263_number +4264|4264_number +4265|4265_number +4266|4266_number +4267|4267_number +4268|4268_number +4269|4269_number +4270|4270_number +4271|4271_number +4272|4272_number +4273|4273_number +4274|4274_number +4275|4275_number +4276|4276_number +4277|4277_number +4278|4278_number +4279|4279_number +4280|4280_number +4281|4281_number +4282|4282_number +4283|4283_number +4284|4284_number +4285|4285_number +4286|4286_number +4287|4287_number +4288|4288_number +4289|4289_number +4290|4290_number +4291|4291_number +4292|4292_number +4293|4293_number +4294|4294_number +4295|4295_number +4296|4296_number +4297|4297_number +4298|4298_number +4299|4299_number +4300|4300_number +4301|4301_number +4302|4302_number +4303|4303_number +4304|4304_number +4305|4305_number +4306|4306_number +4307|4307_number +4308|4308_number +4309|4309_number +4310|4310_number +4311|4311_number +4312|4312_number +4313|4313_number +4314|4314_number +4315|4315_number +4316|4316_number +4317|4317_number +4318|4318_number +4319|4319_number +4320|4320_number +4321|4321_number +4322|4322_number +4323|4323_number +4324|4324_number +4325|4325_number +4326|4326_number +4327|4327_number +4328|4328_number +4329|4329_number +4330|4330_number +4331|4331_number +4332|4332_number +4333|4333_number +4334|4334_number +4335|4335_number +4336|4336_number +4337|4337_number +4338|4338_number +4339|4339_number +4340|4340_number +4341|4341_number +4342|4342_number +4343|4343_number +4344|4344_number +4345|4345_number +4346|4346_number +4347|4347_number +4348|4348_number +4349|4349_number +4350|4350_number +4351|4351_number +4352|4352_number +4353|4353_number +4354|4354_number +4355|4355_number +4356|4356_number +4357|4357_number +4358|4358_number +4359|4359_number +4360|4360_number +4361|4361_number +4362|4362_number +4363|4363_number +4364|4364_number +4365|4365_number +4366|4366_number +4367|4367_number +4368|4368_number +4369|4369_number +4370|4370_number +4371|4371_number +4372|4372_number +4373|4373_number +4374|4374_number +4375|4375_number +4376|4376_number +4377|4377_number +4378|4378_number +4379|4379_number +4380|4380_number +4381|4381_number +4382|4382_number +4383|4383_number +4384|4384_number +4385|4385_number +4386|4386_number +4387|4387_number +4388|4388_number +4389|4389_number +4390|4390_number +4391|4391_number +4392|4392_number +4393|4393_number +4394|4394_number +4395|4395_number +4396|4396_number +4397|4397_number +4398|4398_number +4399|4399_number +4400|4400_number +4401|4401_number +4402|4402_number +4403|4403_number +4404|4404_number +4405|4405_number +4406|4406_number +4407|4407_number +4408|4408_number +4409|4409_number +4410|4410_number +4411|4411_number +4412|4412_number +4413|4413_number +4414|4414_number +4415|4415_number +4416|4416_number +4417|4417_number +4418|4418_number +4419|4419_number +4420|4420_number +4421|4421_number +4422|4422_number +4423|4423_number +4424|4424_number +4425|4425_number +4426|4426_number +4427|4427_number +4428|4428_number +4429|4429_number +4430|4430_number +4431|4431_number +4432|4432_number +4433|4433_number +4434|4434_number +4435|4435_number +4436|4436_number +4437|4437_number +4438|4438_number +4439|4439_number +4440|4440_number +4441|4441_number +4442|4442_number +4443|4443_number +4444|4444_number +4445|4445_number +4446|4446_number +4447|4447_number +4448|4448_number +4449|4449_number +4450|4450_number +4451|4451_number +4452|4452_number +4453|4453_number +4454|4454_number +4455|4455_number +4456|4456_number +4457|4457_number +4458|4458_number +4459|4459_number +4460|4460_number +4461|4461_number +4462|4462_number +4463|4463_number +4464|4464_number +4465|4465_number +4466|4466_number +4467|4467_number +4468|4468_number +4469|4469_number +4470|4470_number +4471|4471_number +4472|4472_number +4473|4473_number +4474|4474_number +4475|4475_number +4476|4476_number +4477|4477_number +4478|4478_number +4479|4479_number +4480|4480_number +4481|4481_number +4482|4482_number +4483|4483_number +4484|4484_number +4485|4485_number +4486|4486_number +4487|4487_number +4488|4488_number +4489|4489_number +4490|4490_number +4491|4491_number +4492|4492_number +4493|4493_number +4494|4494_number +4495|4495_number +4496|4496_number +4497|4497_number +4498|4498_number +4499|4499_number +4500|4500_number +4501|4501_number +4502|4502_number +4503|4503_number +4504|4504_number +4505|4505_number +4506|4506_number +4507|4507_number +4508|4508_number +4509|4509_number +4510|4510_number +4511|4511_number +4512|4512_number +4513|4513_number +4514|4514_number +4515|4515_number +4516|4516_number +4517|4517_number +4518|4518_number +4519|4519_number +4520|4520_number +4521|4521_number +4522|4522_number +4523|4523_number +4524|4524_number +4525|4525_number +4526|4526_number +4527|4527_number +4528|4528_number +4529|4529_number +4530|4530_number +4531|4531_number +4532|4532_number +4533|4533_number +4534|4534_number +4535|4535_number +4536|4536_number +4537|4537_number +4538|4538_number +4539|4539_number +4540|4540_number +4541|4541_number +4542|4542_number +4543|4543_number +4544|4544_number +4545|4545_number +4546|4546_number +4547|4547_number +4548|4548_number +4549|4549_number +4550|4550_number +4551|4551_number +4552|4552_number +4553|4553_number +4554|4554_number +4555|4555_number +4556|4556_number +4557|4557_number +4558|4558_number +4559|4559_number +4560|4560_number +4561|4561_number +4562|4562_number +4563|4563_number +4564|4564_number +4565|4565_number +4566|4566_number +4567|4567_number +4568|4568_number +4569|4569_number +4570|4570_number +4571|4571_number +4572|4572_number +4573|4573_number +4574|4574_number +4575|4575_number +4576|4576_number +4577|4577_number +4578|4578_number +4579|4579_number +4580|4580_number +4581|4581_number +4582|4582_number +4583|4583_number +4584|4584_number +4585|4585_number +4586|4586_number +4587|4587_number +4588|4588_number +4589|4589_number +4590|4590_number +4591|4591_number +4592|4592_number +4593|4593_number +4594|4594_number +4595|4595_number +4596|4596_number +4597|4597_number +4598|4598_number +4599|4599_number +4600|4600_number +4601|4601_number +4602|4602_number +4603|4603_number +4604|4604_number +4605|4605_number +4606|4606_number +4607|4607_number +4608|4608_number +4609|4609_number +4610|4610_number +4611|4611_number +4612|4612_number +4613|4613_number +4614|4614_number +4615|4615_number +4616|4616_number +4617|4617_number +4618|4618_number +4619|4619_number +4620|4620_number +4621|4621_number +4622|4622_number +4623|4623_number +4624|4624_number +4625|4625_number +4626|4626_number +4627|4627_number +4628|4628_number +4629|4629_number +4630|4630_number +4631|4631_number +4632|4632_number +4633|4633_number +4634|4634_number +4635|4635_number +4636|4636_number +4637|4637_number +4638|4638_number +4639|4639_number +4640|4640_number +4641|4641_number +4642|4642_number +4643|4643_number +4644|4644_number +4645|4645_number +4646|4646_number +4647|4647_number +4648|4648_number +4649|4649_number +4650|4650_number +4651|4651_number +4652|4652_number +4653|4653_number +4654|4654_number +4655|4655_number +4656|4656_number +4657|4657_number +4658|4658_number +4659|4659_number +4660|4660_number +4661|4661_number +4662|4662_number +4663|4663_number +4664|4664_number +4665|4665_number +4666|4666_number +4667|4667_number +4668|4668_number +4669|4669_number +4670|4670_number +4671|4671_number +4672|4672_number +4673|4673_number +4674|4674_number +4675|4675_number +4676|4676_number +4677|4677_number +4678|4678_number +4679|4679_number +4680|4680_number +4681|4681_number +4682|4682_number +4683|4683_number +4684|4684_number +4685|4685_number +4686|4686_number +4687|4687_number +4688|4688_number +4689|4689_number +4690|4690_number +4691|4691_number +4692|4692_number +4693|4693_number +4694|4694_number +4695|4695_number +4696|4696_number +4697|4697_number +4698|4698_number +4699|4699_number +4700|4700_number +4701|4701_number +4702|4702_number +4703|4703_number +4704|4704_number +4705|4705_number +4706|4706_number +4707|4707_number +4708|4708_number +4709|4709_number +4710|4710_number +4711|4711_number +4712|4712_number +4713|4713_number +4714|4714_number +4715|4715_number +4716|4716_number +4717|4717_number +4718|4718_number +4719|4719_number +4720|4720_number +4721|4721_number +4722|4722_number +4723|4723_number +4724|4724_number +4725|4725_number +4726|4726_number +4727|4727_number +4728|4728_number +4729|4729_number +4730|4730_number +4731|4731_number +4732|4732_number +4733|4733_number +4734|4734_number +4735|4735_number +4736|4736_number +4737|4737_number +4738|4738_number +4739|4739_number +4740|4740_number +4741|4741_number +4742|4742_number +4743|4743_number +4744|4744_number +4745|4745_number +4746|4746_number +4747|4747_number +4748|4748_number +4749|4749_number +4750|4750_number +4751|4751_number +4752|4752_number +4753|4753_number +4754|4754_number +4755|4755_number +4756|4756_number +4757|4757_number +4758|4758_number +4759|4759_number +4760|4760_number +4761|4761_number +4762|4762_number +4763|4763_number +4764|4764_number +4765|4765_number +4766|4766_number +4767|4767_number +4768|4768_number +4769|4769_number +4770|4770_number +4771|4771_number +4772|4772_number +4773|4773_number +4774|4774_number +4775|4775_number +4776|4776_number +4777|4777_number +4778|4778_number +4779|4779_number +4780|4780_number +4781|4781_number +4782|4782_number +4783|4783_number +4784|4784_number +4785|4785_number +4786|4786_number +4787|4787_number +4788|4788_number +4789|4789_number +4790|4790_number +4791|4791_number +4792|4792_number +4793|4793_number +4794|4794_number +4795|4795_number +4796|4796_number +4797|4797_number +4798|4798_number +4799|4799_number +4800|4800_number +4801|4801_number +4802|4802_number +4803|4803_number +4804|4804_number +4805|4805_number +4806|4806_number +4807|4807_number +4808|4808_number +4809|4809_number +4810|4810_number +4811|4811_number +4812|4812_number +4813|4813_number +4814|4814_number +4815|4815_number +4816|4816_number +4817|4817_number +4818|4818_number +4819|4819_number +4820|4820_number +4821|4821_number +4822|4822_number +4823|4823_number +4824|4824_number +4825|4825_number +4826|4826_number +4827|4827_number +4828|4828_number +4829|4829_number +4830|4830_number +4831|4831_number +4832|4832_number +4833|4833_number +4834|4834_number +4835|4835_number +4836|4836_number +4837|4837_number +4838|4838_number +4839|4839_number +4840|4840_number +4841|4841_number +4842|4842_number +4843|4843_number +4844|4844_number +4845|4845_number +4846|4846_number +4847|4847_number +4848|4848_number +4849|4849_number +4850|4850_number +4851|4851_number +4852|4852_number +4853|4853_number +4854|4854_number +4855|4855_number +4856|4856_number +4857|4857_number +4858|4858_number +4859|4859_number +4860|4860_number +4861|4861_number +4862|4862_number +4863|4863_number +4864|4864_number +4865|4865_number +4866|4866_number +4867|4867_number +4868|4868_number +4869|4869_number +4870|4870_number +4871|4871_number +4872|4872_number +4873|4873_number +4874|4874_number +4875|4875_number +4876|4876_number +4877|4877_number +4878|4878_number +4879|4879_number +4880|4880_number +4881|4881_number +4882|4882_number +4883|4883_number +4884|4884_number +4885|4885_number +4886|4886_number +4887|4887_number +4888|4888_number +4889|4889_number +4890|4890_number +4891|4891_number +4892|4892_number +4893|4893_number +4894|4894_number +4895|4895_number +4896|4896_number +4897|4897_number +4898|4898_number +4899|4899_number +4900|4900_number +4901|4901_number +4902|4902_number +4903|4903_number +4904|4904_number +4905|4905_number +4906|4906_number +4907|4907_number +4908|4908_number +4909|4909_number +4910|4910_number +4911|4911_number +4912|4912_number +4913|4913_number +4914|4914_number +4915|4915_number +4916|4916_number +4917|4917_number +4918|4918_number +4919|4919_number +4920|4920_number +4921|4921_number +4922|4922_number +4923|4923_number +4924|4924_number +4925|4925_number +4926|4926_number +4927|4927_number +4928|4928_number +4929|4929_number +4930|4930_number +4931|4931_number +4932|4932_number +4933|4933_number +4934|4934_number +4935|4935_number +4936|4936_number +4937|4937_number +4938|4938_number +4939|4939_number +4940|4940_number +4941|4941_number +4942|4942_number +4943|4943_number +4944|4944_number +4945|4945_number +4946|4946_number +4947|4947_number +4948|4948_number +4949|4949_number +4950|4950_number +4951|4951_number +4952|4952_number +4953|4953_number +4954|4954_number +4955|4955_number +4956|4956_number +4957|4957_number +4958|4958_number +4959|4959_number +4960|4960_number +4961|4961_number +4962|4962_number +4963|4963_number +4964|4964_number +4965|4965_number +4966|4966_number +4967|4967_number +4968|4968_number +4969|4969_number +4970|4970_number +4971|4971_number +4972|4972_number +4973|4973_number +4974|4974_number +4975|4975_number +4976|4976_number +4977|4977_number +4978|4978_number +4979|4979_number +4980|4980_number +4981|4981_number +4982|4982_number +4983|4983_number +4984|4984_number +4985|4985_number +4986|4986_number +4987|4987_number +4988|4988_number +4989|4989_number +4990|4990_number +4991|4991_number +4992|4992_number +4993|4993_number +4994|4994_number +4995|4995_number +4996|4996_number +4997|4997_number +4998|4998_number +4999|4999_number diff --git a/src/test/singlenode_regress/data/exttab_more_errors.data b/src/test/singlenode_regress/data/exttab_more_errors.data new file mode 100644 index 00000000000..c8ba71923de --- /dev/null +++ b/src/test/singlenode_regress/data/exttab_more_errors.data @@ -0,0 +1,20 @@ +1|1_number +2|2_number +3|3_number +4|4_number +error_1 +6|6_number +error_1 +7|7_number +8|8_number +9|9_number +10|10_number +error_1 +11|11_number +12|12_number +error_1 +13|13_number +14|14_number +error_1 +error_1 +15|15_number diff --git a/src/test/singlenode_regress/data/hash.data b/src/test/singlenode_regress/data/hash.data new file mode 100644 index 00000000000..97e97095a09 --- /dev/null +++ b/src/test/singlenode_regress/data/hash.data @@ -0,0 +1,10000 @@ +0 1935401906 +1 1345971420 +2 656473370 +3 1269710788 +4 1156776517 +5 1289013296 +6 1415564928 +7 1937919553 +8 435456494 +9 66302641 +10 915852158 +11 1661301944 +12 961711400 +13 74070078 +14 2036973298 +15 843938989 +16 189351248 +17 1388679963 +18 556726251 +19 634715959 +20 1489080225 +21 649132105 +22 886008616 +23 1280154196 +24 2036166893 +25 846480997 +26 1102020422 +27 1533442662 +28 2060089600 +29 1212135685 +30 539384293 +31 1848007858 +32 410623457 +33 1195857664 +34 970234999 +35 1567399975 +36 337387312 +37 238316279 +38 1357835880 +39 772843806 +40 304618920 +41 126204390 +42 286662102 +43 1266330320 +44 200274468 +45 176151752 +46 2110269310 +47 389625717 +48 1564831715 +49 519511913 +50 1024341676 +51 906428292 +52 1168644018 +53 1910350293 +54 39098840 +55 1057327263 +56 609347642 +57 1141119263 +58 443286278 +59 521953594 +60 205771300 +61 982670571 +62 222477805 +63 616394758 +64 31044587 +65 1192712804 +66 36311085 +67 368431899 +68 1431029083 +69 1394146965 +70 1141275706 +71 1735648004 +72 1520351356 +73 1427937808 +74 854494676 +75 1720625824 +76 1604089561 +77 817280338 +78 2110251541 +79 1021437628 +80 1336792251 +81 987109570 +82 1927865921 +83 357952622 +84 749976215 +85 1966964761 +86 1415279885 +87 1359323857 +88 960600376 +89 1858566163 +90 1881277452 +91 1166371677 +92 693753087 +93 2103755257 +94 1782766435 +95 724797674 +96 1148984413 +97 1819077520 +98 1093229574 +99 432529848 +100 1065740837 +101 87021632 +102 20694204 +103 438608545 +104 1514959440 +105 875188881 +106 11750722 +107 971565353 +108 1692469219 +109 2122002263 +110 1993002982 +111 881777823 +112 961628185 +113 1773385255 +114 1239730445 +115 1711604400 +116 1592866368 +117 507526682 +118 923444610 +119 405983097 +120 218609198 +121 657238414 +122 1572354774 +123 912362285 +124 613510023 +125 1207637561 +126 1637159959 +127 1762494436 +128 879231433 +129 582905885 +130 47540636 +131 1944972270 +132 669927517 +133 68234841 +134 236097168 +135 37403310 +136 943423722 +137 247847890 +138 1008968663 +139 488409293 +140 222366505 +141 854487997 +142 1370187116 +143 1183994691 +144 480389604 +145 462433913 +146 748115443 +147 2073255973 +148 969960596 +149 1671560053 +150 331755422 +151 1188569794 +152 181314819 +153 1904110196 +154 2100932079 +155 794824842 +156 964264109 +157 1590608390 +158 409835630 +159 1843495542 +160 26030628 +161 457376267 +162 1640984164 +163 695958145 +164 525611108 +165 1877081332 +166 733361455 +167 1469034830 +168 2124929222 +169 1742330119 +170 1957444123 +171 199812080 +172 449334468 +173 1180147592 +174 1383806771 +175 929724073 +176 1642581505 +177 2131922214 +178 855496398 +179 465058453 +180 1655998620 +181 1187251820 +182 1653628247 +183 1837313439 +184 943878368 +185 1607076678 +186 484654634 +187 1908142477 +188 1050201421 +189 894490264 +190 1604154371 +191 1076232049 +192 1351866531 +193 1097654887 +194 1772190194 +195 1877477639 +196 827252572 +197 358068002 +198 1199028821 +199 804698146 +200 2100398121 +201 1008989297 +202 1004510226 +203 402248941 +204 41653241 +205 240833349 +206 1331973014 +207 1684234746 +208 225271916 +209 39985764 +210 1809552 +211 1881270536 +212 1227237584 +213 1655437799 +214 1571100327 +215 23632304 +216 1115030830 +217 2055754961 +218 1931774781 +219 17748603 +220 802761578 +221 1388445504 +222 1093980652 +223 7144461 +224 338616744 +225 718687198 +226 1884622101 +227 1165869316 +228 1076755200 +229 936167274 +230 1970567462 +231 1029669673 +232 1945156571 +233 827594041 +234 1431918615 +235 1986809812 +236 1068427390 +237 616407981 +238 1523560911 +239 1293699306 +240 656393746 +241 1525370463 +242 1027486194 +243 1883631330 +244 1033324614 +245 451102874 +246 1907263635 +247 871796 +248 359374187 +249 1691554768 +250 18620399 +251 1162135765 +252 932516625 +253 1112601051 +254 1169280227 +255 1271133369 +256 1831288250 +257 906418680 +258 289519037 +259 760559802 +260 1842585954 +261 112602851 +262 1790229476 +263 1640258878 +264 940196892 +265 1074664443 +266 1479585042 +267 2008624283 +268 1691072424 +269 855662305 +270 1154839941 +271 199982522 +272 233549120 +273 34842488 +274 2083613853 +275 1266873735 +276 485945362 +277 1843393840 +278 1267745531 +279 845319549 +280 1387464960 +281 1286365931 +282 2007455315 +283 172497937 +284 251483334 +285 1029251894 +286 1443631306 +287 2082771584 +288 1935670574 +289 1733150343 +290 695847739 +291 1630772880 +292 1845753195 +293 338593567 +294 1123548110 +295 638466439 +296 1413258010 +297 455649505 +298 499607074 +299 956846786 +300 1311311810 +301 1654447016 +302 1156829309 +303 1544860931 +304 1689289504 +305 1092959514 +306 664251018 +307 27751218 +308 788869706 +309 1931996549 +310 873070767 +311 28851018 +312 1070878832 +313 733042434 +314 201348956 +315 1322362167 +316 1762294328 +317 1644980262 +318 1257650103 +319 1550481254 +320 1230646958 +321 1953497842 +322 1033770487 +323 928916505 +324 144607761 +325 9834949 +326 1567382944 +327 1557865771 +328 465484454 +329 2066990019 +330 367228910 +331 1776796265 +332 1573953387 +333 1524058219 +334 1174173548 +335 1115759243 +336 469534085 +337 1838424566 +338 1143510461 +339 1258403791 +340 1622937467 +341 2016581228 +342 1287254809 +343 546332652 +344 602140015 +345 1488603765 +346 1868694819 +347 216950695 +348 986100380 +349 978861274 +350 1767431950 +351 69263690 +352 784875469 +353 653718789 +354 998180195 +355 929483230 +356 663553738 +357 418079491 +358 339865354 +359 1129038193 +360 337585862 +361 707094264 +362 758350810 +363 1911539249 +364 83668835 +365 1932524358 +366 879814844 +367 553202920 +368 1623465276 +369 2023325305 +370 1811606711 +371 1098919095 +372 1892422886 +373 951377872 +374 1645251747 +375 347079253 +376 292497990 +377 1366462918 +378 564029948 +379 1278598370 +380 197840545 +381 183978250 +382 1347862060 +383 982716014 +384 837697039 +385 198558607 +386 1912199244 +387 1501250778 +388 616638098 +389 104580950 +390 482805323 +391 954223961 +392 811675214 +393 1241156133 +394 718279562 +395 895344049 +396 1026196843 +397 1598094407 +398 1448546969 +399 502178471 +400 1473936064 +401 1112670032 +402 1601097566 +403 1218875302 +404 2064047905 +405 1098865666 +406 1565954555 +407 209062247 +408 317844936 +409 2129984504 +410 1487660617 +411 515685481 +412 166479106 +413 688039029 +414 1498401495 +415 1004176146 +416 886597636 +417 1263117092 +418 357943276 +419 1503235734 +420 1367698042 +421 840748599 +422 309976047 +423 31889609 +424 2081904732 +425 1028255610 +426 927233658 +427 960617927 +428 478866369 +429 228296980 +430 1462796398 +431 1952802433 +432 1340967012 +433 916410316 +434 1024194088 +435 1257531269 +436 2015275982 +437 442664995 +438 1466593516 +439 185637271 +440 425165851 +441 806770485 +442 701322752 +443 591644958 +444 1494809514 +445 52240600 +446 1595821104 +447 233923502 +448 1315357692 +449 1953764380 +450 1737159237 +451 535572086 +452 647029331 +453 2047135284 +454 567461695 +455 581450415 +456 927907246 +457 1494695354 +458 1542068342 +459 1406773615 +460 1722992334 +461 857381092 +462 1212092401 +463 916475698 +464 1773791408 +465 88802841 +466 26523320 +467 1641583743 +468 531467836 +469 1493116836 +470 1827221014 +471 956633688 +472 152403674 +473 381060118 +474 1548278646 +475 1647213188 +476 433300718 +477 996616102 +478 1881136691 +479 1748658410 +480 802896834 +481 1470812280 +482 136746849 +483 1449926165 +484 1370463916 +485 704208544 +486 2031376580 +487 150887515 +488 51420250 +489 1425961274 +490 1557661130 +491 1774412584 +492 135858718 +493 622269883 +494 543404635 +495 1909650126 +496 711072724 +497 569927955 +498 1403750221 +499 1242540561 +500 2063044791 +501 1083487587 +502 51690601 +503 67964817 +504 1464547706 +505 1599969247 +506 1715178006 +507 1897848424 +508 449101701 +509 1448831049 +510 1499023187 +511 1251998535 +512 772159681 +513 1635770036 +514 554441052 +515 2142623597 +516 192494932 +517 438333984 +518 146027464 +519 243915183 +520 1864295258 +521 1703688595 +522 2018327767 +523 2000153976 +524 178474830 +525 414248754 +526 1762320454 +527 889547555 +528 984176709 +529 1018587028 +530 2132088116 +531 899737853 +532 2102074615 +533 36295069 +534 967702670 +535 1419138673 +536 1636264316 +537 535397028 +538 1169503450 +539 2085366017 +540 1984228077 +541 521042989 +542 1189880904 +543 608904110 +544 9329377 +545 1744321956 +546 604044060 +547 201824309 +548 35172292 +549 750071524 +550 445739492 +551 1899467550 +552 306276471 +553 316583612 +554 1752137878 +555 484751302 +556 730832366 +557 1366974684 +558 1374298857 +559 1715009076 +560 238078064 +561 1358903325 +562 467263281 +563 192669032 +564 1395198394 +565 1434965951 +566 1611807705 +567 883979062 +568 1970362980 +569 633827507 +570 821861431 +571 1807107409 +572 1154870496 +573 2011742335 +574 268527872 +575 1164199873 +576 1608580643 +577 872571932 +578 1366024183 +579 1643752935 +580 1622643456 +581 1811763675 +582 1395736837 +583 1928919928 +584 2128347287 +585 1000391067 +586 266187582 +587 711696006 +588 219882103 +589 1640486439 +590 279221434 +591 457960168 +592 851906116 +593 746484715 +594 650629200 +595 99620862 +596 33967018 +597 114953257 +598 983599924 +599 2004329998 +600 748780765 +601 1805461355 +602 1663953760 +603 1903651261 +604 1669720042 +605 1932481632 +606 920367487 +607 1130817037 +608 657569916 +609 138908022 +610 627086324 +611 132729724 +612 1950671697 +613 2022823161 +614 2061649652 +615 1931535337 +616 875730580 +617 180353586 +618 495747695 +619 1095612683 +620 1820840025 +621 774969129 +622 1553572851 +623 525262493 +624 1521453844 +625 56718403 +626 624883355 +627 1555420862 +628 171671661 +629 1608483279 +630 1412267213 +631 920452426 +632 1266460986 +633 928737325 +634 676620039 +635 788697380 +636 713735309 +637 1596987526 +638 1919514417 +639 1371305225 +640 1735895548 +641 399117093 +642 1504034949 +643 1539083598 +644 274456606 +645 1418200954 +646 1323135287 +647 1150187186 +648 1598554540 +649 1818882982 +650 98316222 +651 1271910918 +652 446368463 +653 1651889073 +654 1797173411 +655 1967822307 +656 1708607477 +657 274573119 +658 1375759521 +659 1880279138 +660 1883056398 +661 640543086 +662 653247916 +663 1002033737 +664 1569280411 +665 1329867955 +666 1790731117 +667 135532072 +668 779371834 +669 1562761887 +670 1506837297 +671 367783734 +672 1961878980 +673 863388599 +674 1906867332 +675 88851939 +676 134105905 +677 1082518971 +678 1239039125 +679 1732660445 +680 753918305 +681 1337355347 +682 857087715 +683 1200286768 +684 841760773 +685 506777479 +686 1020625427 +687 402884602 +688 781350598 +689 248901301 +690 135680092 +691 516923348 +692 889444387 +693 788928008 +694 1518957085 +695 311241151 +696 2118795963 +697 1162204555 +698 446773223 +699 750684149 +700 577482794 +701 1953610521 +702 1118467884 +703 391878126 +704 669515472 +705 877851568 +706 480730065 +707 803621377 +708 1960370540 +709 1719769191 +710 388798174 +711 566805197 +712 909640890 +713 1245885890 +714 1767091966 +715 1751401663 +716 1752663369 +717 640233745 +718 6802617 +719 386530319 +720 889135046 +721 142482709 +722 903453667 +723 1778579434 +724 931410717 +725 274927105 +726 2089820585 +727 902723033 +728 1437131660 +729 389110160 +730 1653407182 +731 2014614454 +732 195237033 +733 624391418 +734 259008932 +735 864752505 +736 1502242987 +737 739738998 +738 1668373882 +739 1315129879 +740 312024541 +741 2057172057 +742 1881935076 +743 1221665431 +744 1155574299 +745 1501543394 +746 825583447 +747 760754020 +748 2141777140 +749 832386064 +750 1147284339 +751 883428538 +752 974868774 +753 2050738006 +754 514524324 +755 1906279491 +756 178181463 +757 456861261 +758 661518876 +759 1615313123 +760 845971422 +761 167442411 +762 1482443929 +763 1041208455 +764 791833829 +765 1741452862 +766 1905960961 +767 146593168 +768 333708212 +769 1426851195 +770 1461723047 +771 645732753 +772 1336539604 +773 1196174476 +774 1867398184 +775 344630255 +776 550234222 +777 545497983 +778 1105384275 +779 544527714 +780 1377884048 +781 105184966 +782 1427956253 +783 205269174 +784 8439325 +785 1942480577 +786 2111548665 +787 186620788 +788 251858191 +789 625583894 +790 1801933912 +791 1097829613 +792 793026305 +793 1136894193 +794 2139038068 +795 1584860134 +796 730863407 +797 1897515381 +798 1731453303 +799 1064571619 +800 1176882929 +801 1045692702 +802 1710304372 +803 365938885 +804 94383530 +805 1430218909 +806 710569141 +807 644617753 +808 1975716892 +809 1815953416 +810 1189145467 +811 1206117292 +812 1921138383 +813 469618072 +814 1411386466 +815 1929577708 +816 264615002 +817 1375451484 +818 2116198496 +819 516473193 +820 2001035378 +821 1770648760 +822 1614302806 +823 646578035 +824 760059306 +825 1605857226 +826 83954521 +827 1490922713 +828 1355888960 +829 1815407824 +830 408010685 +831 385288241 +832 713616879 +833 2118315057 +834 751227126 +835 808000409 +836 1401050318 +837 1461796267 +838 1452618162 +839 1229283563 +840 1130266036 +841 494279982 +842 287917207 +843 903920771 +844 963898054 +845 1699303674 +846 686014831 +847 1228513056 +848 927271510 +849 654729679 +850 1744986249 +851 780823240 +852 277894792 +853 1211805407 +854 1427401275 +855 1037954098 +856 670178986 +857 1511355796 +858 381393163 +859 2026067946 +860 1179279973 +861 789403848 +862 263872539 +863 1892896852 +864 760235258 +865 1015099665 +866 553413613 +867 13801928 +868 329412285 +869 2006031776 +870 1243085491 +871 1459678321 +872 352828110 +873 1531002699 +874 216115444 +875 1316726164 +876 1082822725 +877 902130275 +878 397755573 +879 2010094235 +880 1556859954 +881 2142741822 +882 643433827 +883 1834754746 +884 1207063582 +885 2070835102 +886 725225196 +887 1877242568 +888 1434707250 +889 1106618360 +890 1755826866 +891 466503575 +892 1896022208 +893 2019699405 +894 211916779 +895 508773818 +896 887315422 +897 765330393 +898 522575747 +899 1216727707 +900 623878521 +901 1765661238 +902 528922380 +903 976706631 +904 1149180289 +905 745037824 +906 145949147 +907 84519366 +908 1647168099 +909 543704720 +910 2094613601 +911 1056544406 +912 538962895 +913 590563780 +914 743815504 +915 1746026477 +916 513915234 +917 1469040701 +918 1475785397 +919 1948622485 +920 428175413 +921 1084128615 +922 267642412 +923 176713973 +924 956344372 +925 479559192 +926 685487792 +927 1843659794 +928 1244889585 +929 1208063539 +930 912903854 +931 1868768106 +932 826241129 +933 1441826234 +934 697991089 +935 1975421419 +936 39380411 +937 843940236 +938 2059940785 +939 1686548510 +940 1387644957 +941 2007070739 +942 595609268 +943 1926607852 +944 450150871 +945 1339424773 +946 1525150681 +947 964066106 +948 660981826 +949 853452430 +950 765204943 +951 1089157239 +952 1937581045 +953 1032847355 +954 1265871212 +955 746441769 +956 1512406547 +957 1951359004 +958 442617915 +959 609812484 +960 1011938895 +961 1355521769 +962 331096942 +963 1838180025 +964 649864356 +965 1029088031 +966 1666117796 +967 689244767 +968 1873028268 +969 1578574933 +970 228309629 +971 1113189577 +972 1438162024 +973 823918898 +974 892313781 +975 1888312896 +976 15860023 +977 269980814 +978 704895354 +979 676841849 +980 1123433244 +981 1470100297 +982 1765999088 +983 913530641 +984 355464004 +985 884386652 +986 1659972410 +987 1867870552 +988 688262009 +989 2102590325 +990 330199388 +991 1700200904 +992 1310628447 +993 661296331 +994 1390897281 +995 1960492803 +996 1690384362 +997 909531429 +998 502253922 +999 1415928982 +1000 340622715 +1001 730563551 +1002 381634911 +1003 1778784739 +1004 1554482449 +1005 1273948692 +1006 1519613987 +1007 1570342472 +1008 1543929506 +1009 77025693 +1010 99700673 +1011 519879102 +1012 1547125990 +1013 1865699761 +1014 1433409743 +1015 1902589995 +1016 602602766 +1017 945898505 +1018 1622976899 +1019 1290864775 +1020 901005183 +1021 1953176287 +1022 843582031 +1023 64149982 +1024 466988970 +1025 86995665 +1026 2024642785 +1027 9889685 +1028 996527094 +1029 379413059 +1030 1425818667 +1031 1337149809 +1032 1109976610 +1033 1807453579 +1034 968450901 +1035 516975412 +1036 933918623 +1037 340581240 +1038 2087317884 +1039 330364482 +1040 417606934 +1041 39534910 +1042 850243584 +1043 1964732924 +1044 1905234671 +1045 136169680 +1046 1719839271 +1047 360353789 +1048 1082068185 +1049 1195332522 +1050 1651218564 +1051 1983073368 +1052 1001025162 +1053 347316948 +1054 2047223350 +1055 1468014132 +1056 434312613 +1057 1924382487 +1058 1477903817 +1059 1430839707 +1060 156311898 +1061 756238837 +1062 620505869 +1063 1266288509 +1064 416208768 +1065 1588956770 +1066 1783263921 +1067 1350127391 +1068 1929538010 +1069 1723098157 +1070 1680491873 +1071 199661296 +1072 1762633067 +1073 383251810 +1074 16910573 +1075 1520384091 +1076 519421490 +1077 1736749844 +1078 1880737880 +1079 1601489675 +1080 784598719 +1081 1384472797 +1082 1437079396 +1083 1785623881 +1084 1731789745 +1085 1336819098 +1086 1106154365 +1087 18618710 +1088 1113717938 +1089 436574535 +1090 1449458417 +1091 1270029836 +1092 1192813372 +1093 2069964286 +1094 388834697 +1095 1609022140 +1096 1511437408 +1097 24614970 +1098 811665883 +1099 1293491771 +1100 1747713128 +1101 344674109 +1102 1493153067 +1103 1362862547 +1104 727925919 +1105 1510063640 +1106 735762990 +1107 1247347409 +1108 1099329837 +1109 469017223 +1110 701353436 +1111 1883928556 +1112 1853490020 +1113 2138432832 +1114 1522068789 +1115 1437796117 +1116 1327768283 +1117 480739506 +1118 1456414827 +1119 294002573 +1120 917314041 +1121 758389596 +1122 1564032409 +1123 2110127413 +1124 680870235 +1125 1952867107 +1126 1571665905 +1127 44823995 +1128 1977482077 +1129 235848141 +1130 1338315766 +1131 1577711557 +1132 580522250 +1133 683985186 +1134 793090457 +1135 1308448169 +1136 46565178 +1137 1528853447 +1138 408311930 +1139 1145895015 +1140 1997870670 +1141 1109665366 +1142 882339923 +1143 1703877042 +1144 1100614551 +1145 256925064 +1146 994189511 +1147 280899186 +1148 737664571 +1149 303120690 +1150 574901759 +1151 1654978612 +1152 1061510287 +1153 2138934168 +1154 1617622378 +1155 1742380522 +1156 1944317627 +1157 1041804635 +1158 1787204517 +1159 1774316057 +1160 1277652776 +1161 978036636 +1162 1204543966 +1163 1858175026 +1164 1662021822 +1165 1997634423 +1166 1019139547 +1167 1708587000 +1168 1379004223 +1169 1427451477 +1170 706998368 +1171 1229391245 +1172 389633196 +1173 1589338291 +1174 785784640 +1175 1490247747 +1176 1846263356 +1177 1779974151 +1178 1771146933 +1179 436444279 +1180 2083094842 +1181 198565044 +1182 2091422891 +1183 997121481 +1184 190015564 +1185 1561561621 +1186 592018355 +1187 2134333192 +1188 455882609 +1189 231739224 +1190 1761165601 +1191 1733535385 +1192 1209775860 +1193 818225919 +1194 1444226764 +1195 724314034 +1196 668376695 +1197 315882663 +1198 285417387 +1199 2047380918 +1200 1743334141 +1201 992415755 +1202 1129288515 +1203 2132967337 +1204 434270398 +1205 1915073155 +1206 1475731436 +1207 133050106 +1208 1547563659 +1209 1099394721 +1210 569494385 +1211 1483174853 +1212 1297959765 +1213 513433629 +1214 332812686 +1215 1487975329 +1216 2074995250 +1217 924831041 +1218 1474824873 +1219 383394211 +1220 1156570265 +1221 1088506826 +1222 2116929597 +1223 218862478 +1224 1906732746 +1225 1413672713 +1226 943176512 +1227 427625793 +1228 1729555376 +1229 1228593899 +1230 327523063 +1231 1325405869 +1232 73526006 +1233 1456811578 +1234 1310889558 +1235 507796405 +1236 1224401086 +1237 639137346 +1238 640846511 +1239 624481097 +1240 1738532067 +1241 1210340897 +1242 2107655950 +1243 889008184 +1244 1723774526 +1245 292984988 +1246 229499866 +1247 1651286128 +1248 1217816029 +1249 1704324739 +1250 2034680340 +1251 226902646 +1252 645347918 +1253 2004126289 +1254 445765124 +1255 404597016 +1256 1270315354 +1257 1388941637 +1258 832222809 +1259 852387082 +1260 470051888 +1261 1159745872 +1262 30309304 +1263 543577895 +1264 469073802 +1265 1341198862 +1266 1051374300 +1267 1693474888 +1268 1980336209 +1269 1692220811 +1270 170472337 +1271 1571384628 +1272 755078060 +1273 130644639 +1274 312909165 +1275 331368938 +1276 423629627 +1277 542409031 +1278 1982655067 +1279 1641445656 +1280 99250122 +1281 1869851759 +1282 1868348303 +1283 744598040 +1284 1726494400 +1285 166629779 +1286 1149195056 +1287 849326106 +1288 1555571416 +1289 1981417865 +1290 1701713188 +1291 2025623305 +1292 993680089 +1293 1732022492 +1294 421717552 +1295 1462753892 +1296 925737707 +1297 1473091852 +1298 1008745132 +1299 758590268 +1300 1017829015 +1301 1179217470 +1302 182491248 +1303 1772907076 +1304 1309862109 +1305 495400413 +1306 2104276014 +1307 1733491737 +1308 1037809444 +1309 1939447433 +1310 1227453745 +1311 1137059567 +1312 1661815544 +1313 948318400 +1314 1881657607 +1315 1240826296 +1316 1114948180 +1317 883369016 +1318 2090152402 +1319 523035948 +1320 717303233 +1321 1644381943 +1322 401175605 +1323 1710983323 +1324 1228920787 +1325 822893157 +1326 1026253567 +1327 7174846 +1328 148501361 +1329 2034998699 +1330 765765114 +1331 1166330377 +1332 1066732521 +1333 948256363 +1334 791753805 +1335 229110983 +1336 1443656776 +1337 748546171 +1338 1962602720 +1339 333982573 +1340 540509957 +1341 1042572817 +1342 1471042140 +1343 54841853 +1344 1990891218 +1345 1205216099 +1346 1295668150 +1347 958355750 +1348 2088585115 +1349 1238336904 +1350 1481391698 +1351 658404701 +1352 735235199 +1353 1882567304 +1354 221904376 +1355 1964155987 +1356 557976813 +1357 1248157943 +1358 1971330833 +1359 706478175 +1360 1135672994 +1361 589612300 +1362 1872808552 +1363 54921868 +1364 1537868663 +1365 517078709 +1366 284032851 +1367 834041791 +1368 1265624880 +1369 99151923 +1370 1168024364 +1371 1806134837 +1372 1141724740 +1373 491582856 +1374 1860976691 +1375 985132310 +1376 1696798956 +1377 1009161193 +1378 1943488060 +1379 1637900423 +1380 100014449 +1381 1277396111 +1382 148821476 +1383 835249649 +1384 1012479767 +1385 370725852 +1386 651921988 +1387 1570456580 +1388 1618883795 +1389 475769173 +1390 129451107 +1391 607073142 +1392 1065381473 +1393 2002259659 +1394 661995010 +1395 455766488 +1396 371854720 +1397 946027861 +1398 1289808280 +1399 1637479601 +1400 1045179784 +1401 310348996 +1402 1296130790 +1403 39420876 +1404 801931853 +1405 1009623833 +1406 1024553187 +1407 351247161 +1408 2018785026 +1409 820557599 +1410 1989147584 +1411 2118799476 +1412 2097953710 +1413 2137969061 +1414 806565477 +1415 962949829 +1416 361211265 +1417 1458487465 +1418 385922762 +1419 1980095061 +1420 1934256638 +1421 515373869 +1422 439684555 +1423 852154464 +1424 370149881 +1425 1101679565 +1426 1307920952 +1427 742004601 +1428 2047707426 +1429 450245584 +1430 232000554 +1431 945403562 +1432 760594581 +1433 1528131345 +1434 984824438 +1435 1562526434 +1436 390271530 +1437 2009377625 +1438 1913773595 +1439 261572909 +1440 682451577 +1441 1755437531 +1442 232888737 +1443 632921639 +1444 1745922944 +1445 1039454214 +1446 1595871469 +1447 2107134210 +1448 350458031 +1449 1981794231 +1450 1939745623 +1451 137231021 +1452 349684452 +1453 231946530 +1454 989385485 +1455 719834333 +1456 1333626095 +1457 149822790 +1458 1461838935 +1459 1233849873 +1460 600068374 +1461 1693839489 +1462 31769787 +1463 1360662955 +1464 1074487186 +1465 1016594225 +1466 775705741 +1467 1464758717 +1468 878488203 +1469 541995688 +1470 1726331626 +1471 1560939780 +1472 149949572 +1473 1959220363 +1474 46377771 +1475 1895872516 +1476 851190929 +1477 1642249240 +1478 1855523078 +1479 1201648960 +1480 1476559823 +1481 1647785053 +1482 1338879981 +1483 1826244276 +1484 1879731583 +1485 180781819 +1486 398594961 +1487 1065874030 +1488 330604609 +1489 1860433896 +1490 152240255 +1491 930672983 +1492 1406789738 +1493 184010042 +1494 143852291 +1495 333793276 +1496 1200604268 +1497 919558032 +1498 1798551993 +1499 2079092471 +1500 1461553721 +1501 1377399971 +1502 1492548603 +1503 1611503293 +1504 1189136686 +1505 1538926374 +1506 1359892161 +1507 2040327615 +1508 1033691967 +1509 1067931592 +1510 1094492927 +1511 362768142 +1512 568232997 +1513 285889261 +1514 41528770 +1515 300480933 +1516 466671080 +1517 440123732 +1518 1366354963 +1519 797275689 +1520 153073980 +1521 1518595219 +1522 1727948672 +1523 1559863718 +1524 1702605261 +1525 1871800963 +1526 1893656995 +1527 755725881 +1528 643875348 +1529 1544725340 +1530 687334704 +1531 2105429069 +1532 774641664 +1533 32399659 +1534 1569448714 +1535 1963778350 +1536 1571326034 +1537 781857227 +1538 1856622318 +1539 457534353 +1540 1849788819 +1541 803631597 +1542 820302495 +1543 270538169 +1544 1089520858 +1545 861831266 +1546 571019102 +1547 1556191938 +1548 1301954998 +1549 1937374065 +1550 205983979 +1551 1455028978 +1552 1308485636 +1553 1933932652 +1554 867409049 +1555 863607250 +1556 1658249967 +1557 613582396 +1558 1619333131 +1559 154641667 +1560 10824088 +1561 159184188 +1562 112587088 +1563 785465752 +1564 191583847 +1565 1682035802 +1566 601760455 +1567 1762909881 +1568 316409382 +1569 310899125 +1570 72960586 +1571 18714553 +1572 1114530722 +1573 893263082 +1574 289252722 +1575 56567933 +1576 1755094348 +1577 860271824 +1578 1612759871 +1579 909565698 +1580 650162242 +1581 1818743851 +1582 217111028 +1583 1958647878 +1584 1605192855 +1585 1084520077 +1586 674771480 +1587 1115959174 +1588 1698102473 +1589 146620964 +1590 1270600842 +1591 1708926562 +1592 305805152 +1593 1383187930 +1594 346908666 +1595 497388999 +1596 917740085 +1597 948669121 +1598 112815233 +1599 1234149467 +1600 1259568246 +1601 185775819 +1602 1252864020 +1603 226615321 +1604 1079038901 +1605 1542116743 +1606 283183254 +1607 686649601 +1608 254904919 +1609 1895943125 +1610 1596215299 +1611 905067161 +1612 1567203328 +1613 1813326328 +1614 716231392 +1615 1024912535 +1616 750362757 +1617 1391002872 +1618 2140871710 +1619 300981583 +1620 1537623836 +1621 1263988904 +1622 2009908145 +1623 1843428988 +1624 499693186 +1625 209333163 +1626 193334340 +1627 1417433271 +1628 1158002285 +1629 306149573 +1630 504099090 +1631 270086883 +1632 491925392 +1633 1756963111 +1634 496702204 +1635 1570964294 +1636 1151596206 +1637 779885458 +1638 110130247 +1639 1406501125 +1640 528344936 +1641 1706345547 +1642 164084639 +1643 2095548264 +1644 1372188227 +1645 880316031 +1646 972977152 +1647 2122550984 +1648 123835255 +1649 966365214 +1650 276048919 +1651 1661459092 +1652 82870470 +1653 138473416 +1654 1357404432 +1655 582563656 +1656 347806580 +1657 1550738772 +1658 1999996928 +1659 1505808865 +1660 1856888345 +1661 356612370 +1662 1775895748 +1663 201330090 +1664 2113575481 +1665 125114305 +1666 1772294384 +1667 1117688039 +1668 904999763 +1669 1882424631 +1670 376705517 +1671 1433344699 +1672 1441286530 +1673 540790156 +1674 1381409316 +1675 665991109 +1676 1421106187 +1677 206902820 +1678 641058446 +1679 1544941442 +1680 1173268034 +1681 917107365 +1682 1058916886 +1683 1256138504 +1684 1055580782 +1685 268837671 +1686 1838702160 +1687 1403387362 +1688 1819576443 +1689 1691215440 +1690 761712579 +1691 1528981141 +1692 2047827811 +1693 390124679 +1694 1730311231 +1695 2013919644 +1696 515238984 +1697 1355121967 +1698 984124036 +1699 1420238748 +1700 1090062950 +1701 1360829553 +1702 706099799 +1703 383865833 +1704 1901619709 +1705 2087509115 +1706 1049856942 +1707 1175242248 +1708 146928287 +1709 1690915388 +1710 572700042 +1711 1320196321 +1712 460539106 +1713 1631616929 +1714 428851177 +1715 1516119888 +1716 1900454600 +1717 120069690 +1718 772023602 +1719 1572547395 +1720 1811285130 +1721 1533736181 +1722 954044888 +1723 1711629293 +1724 1923860860 +1725 536872471 +1726 1578065290 +1727 291616197 +1728 1891994438 +1729 414705678 +1730 1711854945 +1731 834573741 +1732 1775535231 +1733 270471096 +1734 1218439574 +1735 1529671292 +1736 210496564 +1737 120812868 +1738 557429892 +1739 357424851 +1740 1811728257 +1741 1130129934 +1742 1677621173 +1743 124783715 +1744 614263215 +1745 2106472350 +1746 1640903603 +1747 367234167 +1748 79058392 +1749 265443557 +1750 1939781563 +1751 1890343523 +1752 1799179738 +1753 746342803 +1754 1454489168 +1755 1575556950 +1756 1283215275 +1757 885070810 +1758 1867173147 +1759 1027726065 +1760 1299776488 +1761 1431544444 +1762 1862299806 +1763 927828071 +1764 1702015541 +1765 933255732 +1766 310015715 +1767 1912512105 +1768 1054068601 +1769 867445607 +1770 122453308 +1771 718313210 +1772 1997575542 +1773 1800074481 +1774 843096925 +1775 464355109 +1776 1759063184 +1777 336516880 +1778 831589277 +1779 1838121576 +1780 601960437 +1781 623887192 +1782 1580981451 +1783 253656527 +1784 1370229995 +1785 887986972 +1786 1829213477 +1787 505961622 +1788 1773057782 +1789 1548902977 +1790 1533687688 +1791 925350623 +1792 832963773 +1793 1248503846 +1794 1853178694 +1795 387495666 +1796 34275931 +1797 15710762 +1798 152524123 +1799 1088344532 +1800 883156369 +1801 274977432 +1802 1806657742 +1803 733248263 +1804 2075051913 +1805 502271019 +1806 1197603373 +1807 1686631449 +1808 838787899 +1809 2029192650 +1810 1377269378 +1811 1440748336 +1812 505596194 +1813 810767181 +1814 1694404863 +1815 1875826189 +1816 1698754153 +1817 1376134692 +1818 234304164 +1819 1324328288 +1820 777554021 +1821 1767991852 +1822 102195263 +1823 1610517795 +1824 869012050 +1825 1955373957 +1826 1998013461 +1827 903287981 +1828 1971084719 +1829 3053937 +1830 1991632513 +1831 706757441 +1832 278031369 +1833 1650806607 +1834 1440005704 +1835 205599634 +1836 5593978 +1837 490125429 +1838 1892231084 +1839 844381877 +1840 371834431 +1841 1122016814 +1842 137646565 +1843 877430625 +1844 1932783995 +1845 1832051428 +1846 605773167 +1847 1484054501 +1848 1060702473 +1849 840077331 +1850 660899141 +1851 1838256494 +1852 460585535 +1853 763094404 +1854 1301290641 +1855 1329597585 +1856 570984713 +1857 1151820455 +1858 85401919 +1859 394585785 +1860 1154874392 +1861 2077034432 +1862 1101343226 +1863 1432905761 +1864 1580357392 +1865 393865282 +1866 1638505395 +1867 1585951370 +1868 883990712 +1869 1383252831 +1870 282849600 +1871 1255825143 +1872 357785997 +1873 420496165 +1874 2133255769 +1875 143086345 +1876 105063946 +1877 591545288 +1878 1627140846 +1879 1165766419 +1880 1431622619 +1881 140556339 +1882 856539265 +1883 1892208154 +1884 903650743 +1885 10346259 +1886 1074322091 +1887 1474635456 +1888 1162166714 +1889 1159724010 +1890 1869221241 +1891 169557458 +1892 1089274795 +1893 823080819 +1894 1602463219 +1895 522148539 +1896 1216946102 +1897 1093484966 +1898 2108099909 +1899 2100936814 +1900 329254150 +1901 243465861 +1902 1209278309 +1903 687040147 +1904 663962027 +1905 1195050430 +1906 830126492 +1907 769025973 +1908 1786595718 +1909 309783690 +1910 1934792392 +1911 1070734689 +1912 450340029 +1913 643848009 +1914 815459195 +1915 1353990772 +1916 654194268 +1917 1889781287 +1918 681142581 +1919 1816360982 +1920 902021649 +1921 402880174 +1922 1985918440 +1923 1991296444 +1924 1225960994 +1925 1440898011 +1926 365961335 +1927 295423448 +1928 386899330 +1929 326577597 +1930 248876614 +1931 716153480 +1932 570043458 +1933 1458154923 +1934 1403193627 +1935 1234005485 +1936 505721706 +1937 85836472 +1938 2003031458 +1939 144833776 +1940 395620162 +1941 1790340202 +1942 1215568466 +1943 845960192 +1944 286704564 +1945 2031027661 +1946 52467316 +1947 940898832 +1948 1773325300 +1949 733609897 +1950 609776167 +1951 527863302 +1952 1136490072 +1953 448210959 +1954 371676098 +1955 214967418 +1956 1889108971 +1957 737637434 +1958 510390866 +1959 128524653 +1960 1064215031 +1961 759267480 +1962 844678133 +1963 1634258489 +1964 69938755 +1965 100388112 +1966 720780327 +1967 575660461 +1968 186224584 +1969 576328137 +1970 720494238 +1971 581844747 +1972 219184692 +1973 1936062704 +1974 1427804939 +1975 505889256 +1976 1819606717 +1977 1480272255 +1978 1446788088 +1979 1445448370 +1980 66398505 +1981 2056564255 +1982 1973311672 +1983 1202888577 +1984 357291567 +1985 197504122 +1986 1417855995 +1987 98916890 +1988 935141556 +1989 1928246861 +1990 227441543 +1991 1999356587 +1992 540030693 +1993 1072119676 +1994 1486131429 +1995 609969448 +1996 1172507788 +1997 59428108 +1998 1185629910 +1999 1358732373 +2000 635756245 +2001 1906124148 +2002 1940577120 +2003 854940937 +2004 1694703204 +2005 1220898411 +2006 1360830193 +2007 1366826273 +2008 553687018 +2009 660134634 +2010 664790995 +2011 620085523 +2012 569215241 +2013 490619019 +2014 1822974100 +2015 926506808 +2016 688123142 +2017 1093346447 +2018 1025423698 +2019 1623264698 +2020 874109660 +2021 1252865241 +2022 1475137638 +2023 1414140353 +2024 177501269 +2025 813785419 +2026 2024109802 +2027 1350009058 +2028 873213527 +2029 1062256064 +2030 561257783 +2031 1508969772 +2032 820896564 +2033 354351255 +2034 216427062 +2035 368116120 +2036 1575249666 +2037 1577257255 +2038 1734942393 +2039 2128936684 +2040 89908241 +2041 252249741 +2042 601538560 +2043 659123483 +2044 742868760 +2045 277029012 +2046 1585630291 +2047 1430991902 +2048 1370375460 +2049 463570342 +2050 906772953 +2051 97001472 +2052 1716435583 +2053 234426943 +2054 1511141826 +2055 1893936853 +2056 1048212362 +2057 1387767980 +2058 1096462263 +2059 1921425889 +2060 302540396 +2061 1657720046 +2062 1282912013 +2063 1123436960 +2064 2012071301 +2065 1499339075 +2066 1491553080 +2067 1439837319 +2068 929112683 +2069 1079011825 +2070 1421290355 +2071 1019020924 +2072 1331261566 +2073 2022828915 +2074 1678144407 +2075 2074130327 +2076 152374280 +2077 1116291051 +2078 1357638581 +2079 1522749740 +2080 1579861393 +2081 116927886 +2082 1619751212 +2083 1148813328 +2084 351354829 +2085 983409390 +2086 895266533 +2087 1399567191 +2088 223693722 +2089 1991728796 +2090 1173509432 +2091 526234118 +2092 1501965194 +2093 308937798 +2094 1649671078 +2095 1366552847 +2096 1808276873 +2097 993740510 +2098 658906518 +2099 589905908 +2100 2072752336 +2101 2080196874 +2102 1608926833 +2103 1256530254 +2104 1955542141 +2105 1139587592 +2106 1183176933 +2107 2107916421 +2108 108394995 +2109 393331867 +2110 1483182513 +2111 1688256388 +2112 510259753 +2113 955450078 +2114 689586069 +2115 861614583 +2116 1938859468 +2117 1584852602 +2118 113698126 +2119 15069543 +2120 1429097751 +2121 1287207559 +2122 541303661 +2123 783579297 +2124 1596145357 +2125 43491092 +2126 2648497 +2127 1256938582 +2128 1037231602 +2129 661555015 +2130 1846844491 +2131 962500290 +2132 594268241 +2133 1308287676 +2134 71546897 +2135 402326735 +2136 300391620 +2137 1254723830 +2138 362759508 +2139 408786616 +2140 1648055697 +2141 1845942022 +2142 2097043004 +2143 10831803 +2144 653908452 +2145 639145425 +2146 872446386 +2147 445284272 +2148 76514380 +2149 986144512 +2150 460353815 +2151 1505612131 +2152 125868423 +2153 1001657477 +2154 141707780 +2155 1722013780 +2156 1045148569 +2157 144356277 +2158 831468715 +2159 2082380171 +2160 805911293 +2161 530829558 +2162 897396814 +2163 1400179534 +2164 1839117234 +2165 968943711 +2166 1802506269 +2167 2139508854 +2168 76183893 +2169 17782130 +2170 400811822 +2171 1724239591 +2172 1863724152 +2173 350371179 +2174 1735071394 +2175 370148956 +2176 989516604 +2177 460034132 +2178 815433228 +2179 1066030984 +2180 1446178644 +2181 1275787044 +2182 424159467 +2183 1572047068 +2184 129960873 +2185 565867248 +2186 1146577200 +2187 1175109442 +2188 710223525 +2189 1978045915 +2190 1110005965 +2191 1516134818 +2192 361391825 +2193 2007402779 +2194 768830705 +2195 53025411 +2196 828862842 +2197 423853326 +2198 45050618 +2199 905046736 +2200 441635456 +2201 445862440 +2202 481802679 +2203 157875960 +2204 796233619 +2205 69390425 +2206 528024916 +2207 1785750224 +2208 529424557 +2209 1343458145 +2210 704297560 +2211 1975603201 +2212 471761541 +2213 1128457028 +2214 1400166621 +2215 601722414 +2216 1694324276 +2217 399260174 +2218 1776831856 +2219 257064153 +2220 229822441 +2221 739354173 +2222 1773198972 +2223 591214267 +2224 599273305 +2225 394546029 +2226 644239678 +2227 1428136147 +2228 818399355 +2229 689290296 +2230 185699235 +2231 1260034812 +2232 1135152737 +2233 667501914 +2234 1417910772 +2235 1931386356 +2236 736892339 +2237 1945935689 +2238 1569652932 +2239 1266316896 +2240 1141910186 +2241 126466845 +2242 1094436450 +2243 1613671727 +2244 1254923873 +2245 347119423 +2246 67910493 +2247 801764501 +2248 746379597 +2249 1844742349 +2250 1058828654 +2251 976202039 +2252 436612874 +2253 684543978 +2254 1567416306 +2255 1035886179 +2256 1079090007 +2257 64172336 +2258 316538679 +2259 1897489363 +2260 753462633 +2261 502237914 +2262 1010040527 +2263 1888615370 +2264 1169739829 +2265 280467651 +2266 1672518078 +2267 1906632168 +2268 78919692 +2269 1094687363 +2270 1025465417 +2271 1220829878 +2272 1221154208 +2273 2119901867 +2274 687017957 +2275 328594433 +2276 319537642 +2277 754928450 +2278 1130358934 +2279 1065917240 +2280 452187151 +2281 41703940 +2282 2042119279 +2283 888800026 +2284 726247919 +2285 1462051937 +2286 1924686205 +2287 1805337926 +2288 1526224273 +2289 93741236 +2290 1555343641 +2291 132203258 +2292 595979151 +2293 417900520 +2294 2020818628 +2295 1765718980 +2296 698368172 +2297 1545853059 +2298 1524867500 +2299 777287864 +2300 493056774 +2301 402849269 +2302 1998117743 +2303 1714210982 +2304 375267488 +2305 537652052 +2306 2042805415 +2307 694805131 +2308 1292580503 +2309 1025680701 +2310 1760722371 +2311 1744767654 +2312 1067384641 +2313 1655358002 +2314 486084032 +2315 1793632560 +2316 969926291 +2317 263286590 +2318 1451486839 +2319 348666916 +2320 357027826 +2321 859346832 +2322 480870175 +2323 953006977 +2324 1277247353 +2325 354205155 +2326 571242309 +2327 1975615525 +2328 1900058214 +2329 2096109810 +2330 605419741 +2331 245631340 +2332 351475431 +2333 456053836 +2334 1959842322 +2335 726742920 +2336 993705889 +2337 1855164089 +2338 1421548051 +2339 138802744 +2340 733361142 +2341 1034786774 +2342 1883570398 +2343 1800745784 +2344 542661128 +2345 222170783 +2346 1446894696 +2347 1512587419 +2348 485457373 +2349 750897887 +2350 1861254335 +2351 842485199 +2352 1610244720 +2353 194640862 +2354 1795492177 +2355 740008425 +2356 548846018 +2357 219250838 +2358 568140302 +2359 301420584 +2360 167877000 +2361 1173560043 +2362 547051925 +2363 519352432 +2364 1629613880 +2365 359410599 +2366 1246095352 +2367 475836121 +2368 67091041 +2369 520159755 +2370 614638865 +2371 800452183 +2372 1554946529 +2373 350725615 +2374 453714319 +2375 2097607657 +2376 572896398 +2377 1900609016 +2378 1462711428 +2379 1058353771 +2380 504023255 +2381 1176482115 +2382 1900838971 +2383 2114267975 +2384 1371122978 +2385 1548847500 +2386 706792752 +2387 1919968996 +2388 1768098338 +2389 1274933054 +2390 73905932 +2391 1935975339 +2392 301009450 +2393 620957857 +2394 307844123 +2395 1930623330 +2396 980368457 +2397 1553939475 +2398 258975803 +2399 1047459498 +2400 2074099230 +2401 873614668 +2402 1847911681 +2403 1481562111 +2404 1224340283 +2405 154142353 +2406 1431686120 +2407 1797236682 +2408 2054751369 +2409 746913900 +2410 708106805 +2411 411290976 +2412 1923396015 +2413 461462128 +2414 378075304 +2415 1147035345 +2416 2010309628 +2417 1084868056 +2418 919520693 +2419 1630924319 +2420 212317463 +2421 993426626 +2422 1419416010 +2423 513326913 +2424 1614384483 +2425 1727260133 +2426 296466595 +2427 447269292 +2428 1133715960 +2429 555442398 +2430 1494728790 +2431 1060331542 +2432 1429057066 +2433 1195156824 +2434 394410005 +2435 505913701 +2436 1349299177 +2437 1826096125 +2438 155666735 +2439 1256566898 +2440 425526377 +2441 863773541 +2442 1667857874 +2443 201438744 +2444 1325235669 +2445 2045933178 +2446 1348474090 +2447 1188061650 +2448 983317587 +2449 120511135 +2450 671502321 +2451 1195635050 +2452 1113937761 +2453 2090918331 +2454 1708961963 +2455 580838597 +2456 1670694816 +2457 2005428558 +2458 1028107889 +2459 656927128 +2460 413387308 +2461 375353032 +2462 1717258670 +2463 1842444374 +2464 1570509856 +2465 2111668675 +2466 200874427 +2467 772325385 +2468 1790281152 +2469 356541163 +2470 2028892283 +2471 68323881 +2472 1220314704 +2473 1549266509 +2474 269762625 +2475 398066725 +2476 1447716040 +2477 1618236715 +2478 1586128375 +2479 283549979 +2480 1738747851 +2481 110147048 +2482 1479185029 +2483 705201964 +2484 53581731 +2485 1040663344 +2486 1286040561 +2487 1724276547 +2488 898608254 +2489 166664803 +2490 233720027 +2491 1311995562 +2492 542017835 +2493 1950978697 +2494 1006956288 +2495 2112527691 +2496 1915163724 +2497 1207830715 +2498 737369428 +2499 1557961228 +2500 1564371878 +2501 618778063 +2502 1626285109 +2503 637202934 +2504 20560924 +2505 1896047735 +2506 1035269660 +2507 1468276964 +2508 1366800802 +2509 473914387 +2510 1751826943 +2511 958065005 +2512 584061436 +2513 1083528324 +2514 1663266970 +2515 637643167 +2516 2124191668 +2517 801823883 +2518 214436067 +2519 875316274 +2520 968488686 +2521 448156094 +2522 39828188 +2523 1510506521 +2524 251651144 +2525 1046784476 +2526 1475550564 +2527 19331220 +2528 107131544 +2529 65436344 +2530 1577292449 +2531 1671503422 +2532 684214407 +2533 1056093910 +2534 161222709 +2535 704775332 +2536 804657997 +2537 1196492369 +2538 25568648 +2539 23975152 +2540 1670406756 +2541 1777395592 +2542 982040157 +2543 106984544 +2544 713440268 +2545 497823479 +2546 744627712 +2547 690148289 +2548 1299647363 +2549 959063779 +2550 1565464563 +2551 120652401 +2552 1407219873 +2553 1605292752 +2554 1631158923 +2555 1658871017 +2556 504593580 +2557 959225839 +2558 1678202238 +2559 611725124 +2560 1024662184 +2561 1108011039 +2562 135744899 +2563 1708876591 +2564 16621301 +2565 296967608 +2566 266168275 +2567 821279299 +2568 1493459977 +2569 291736924 +2570 845254451 +2571 1016383085 +2572 2069132516 +2573 1827294608 +2574 1123367630 +2575 635089136 +2576 177634440 +2577 1867995342 +2578 1325237425 +2579 1477281803 +2580 679575473 +2581 743218341 +2582 1597934204 +2583 2086795346 +2584 201027445 +2585 1081609479 +2586 1598182716 +2587 705621025 +2588 2040835319 +2589 1128901306 +2590 1317346150 +2591 918013855 +2592 89428697 +2593 1453091049 +2594 479406798 +2595 106049998 +2596 1750058657 +2597 745575074 +2598 927329297 +2599 1096034986 +2600 1037311998 +2601 1772583748 +2602 2112418071 +2603 958960866 +2604 1452394709 +2605 1088302053 +2606 1594050002 +2607 1630029149 +2608 808813747 +2609 771803780 +2610 959827304 +2611 1488389220 +2612 1515022121 +2613 410277860 +2614 1427700919 +2615 1716049566 +2616 1491887340 +2617 878399987 +2618 274186943 +2619 1385239011 +2620 2007301293 +2621 1591533093 +2622 155769218 +2623 2096729990 +2624 897140494 +2625 635176016 +2626 55296340 +2627 499715503 +2628 1380751090 +2629 982625638 +2630 1595750489 +2631 270579440 +2632 607725738 +2633 1560684913 +2634 1229540306 +2635 2060120447 +2636 501503318 +2637 676106661 +2638 1542665948 +2639 1310317066 +2640 1447910441 +2641 355009604 +2642 651222638 +2643 815448914 +2644 765287465 +2645 2078923557 +2646 384014832 +2647 109691157 +2648 809839896 +2649 658201775 +2650 1494930168 +2651 669657541 +2652 102251221 +2653 1650699386 +2654 618903883 +2655 999391715 +2656 138391754 +2657 674200224 +2658 1499107219 +2659 1519142845 +2660 1656825862 +2661 947374060 +2662 1789722285 +2663 117067952 +2664 360575325 +2665 871778944 +2666 29704752 +2667 862078644 +2668 1547885605 +2669 1572370700 +2670 24912062 +2671 848312398 +2672 1927380305 +2673 676134700 +2674 1663761312 +2675 545184122 +2676 607574610 +2677 2047776144 +2678 654875279 +2679 1417414506 +2680 558494271 +2681 2321799 +2682 2087072048 +2683 660745492 +2684 1653021185 +2685 558492283 +2686 1660137208 +2687 1791412939 +2688 1232692507 +2689 1011760779 +2690 1163072136 +2691 742034721 +2692 1959134839 +2693 805310774 +2694 859102674 +2695 172226517 +2696 1677089718 +2697 888807426 +2698 1034305161 +2699 1077491675 +2700 313694478 +2701 1059217223 +2702 1925804073 +2703 93591135 +2704 1735351923 +2705 1442081737 +2706 638775257 +2707 195442885 +2708 1342374233 +2709 1293650536 +2710 1612857392 +2711 1900868504 +2712 1295972335 +2713 1552445792 +2714 414130349 +2715 801509872 +2716 2110938075 +2717 2074267557 +2718 445439164 +2719 1196146935 +2720 938544688 +2721 1608511300 +2722 1938181656 +2723 750195879 +2724 266338426 +2725 649800682 +2726 922422396 +2727 1943428144 +2728 1538608108 +2729 1956727557 +2730 873436171 +2731 1852302587 +2732 868461132 +2733 651756596 +2734 1945893722 +2735 456329408 +2736 2093838333 +2737 437185332 +2738 651772293 +2739 1288728918 +2740 1730835868 +2741 117146037 +2742 1042113775 +2743 879324556 +2744 1669591829 +2745 1456244124 +2746 1680834428 +2747 1633046257 +2748 1383028033 +2749 2126273592 +2750 681709544 +2751 174089073 +2752 1587301245 +2753 472407552 +2754 924284952 +2755 1853639671 +2756 1122208235 +2757 1846707349 +2758 1649584168 +2759 513332695 +2760 1655951258 +2761 375536691 +2762 218151634 +2763 376928743 +2764 1027293288 +2765 16561709 +2766 833258151 +2767 973647973 +2768 453747041 +2769 1485030444 +2770 114893244 +2771 37099261 +2772 1602176482 +2773 1157007019 +2774 916423817 +2775 1124284663 +2776 465767495 +2777 449774598 +2778 609847272 +2779 1848795528 +2780 428564542 +2781 1291556816 +2782 2022884601 +2783 2015865787 +2784 1763964369 +2785 799685905 +2786 1722021811 +2787 738688956 +2788 498909606 +2789 1224122331 +2790 1252021651 +2791 7377217 +2792 1599659022 +2793 1470173286 +2794 384305960 +2795 479468662 +2796 1486734995 +2797 1217564111 +2798 1453116636 +2799 1940482036 +2800 555110907 +2801 1568009880 +2802 1977581297 +2803 9803741 +2804 577533251 +2805 746521467 +2806 1134088405 +2807 1043300746 +2808 1196296065 +2809 1743935677 +2810 744612626 +2811 1624860607 +2812 888008846 +2813 620013579 +2814 1493242747 +2815 504489567 +2816 1419699484 +2817 1067780910 +2818 1243178523 +2819 1918609091 +2820 144419593 +2821 347716526 +2822 1925986308 +2823 1744078615 +2824 1817889812 +2825 162808620 +2826 76063630 +2827 1157141159 +2828 1380372731 +2829 1529180266 +2830 950139547 +2831 1935483638 +2832 949706498 +2833 780237197 +2834 1945287380 +2835 1527239749 +2836 1526758664 +2837 931892137 +2838 423056847 +2839 575571081 +2840 528344166 +2841 1167669473 +2842 52948040 +2843 1416353012 +2844 1787683052 +2845 1546190787 +2846 1920842579 +2847 1059898888 +2848 466488049 +2849 1016537454 +2850 831024331 +2851 610907642 +2852 1364253981 +2853 609526991 +2854 207502610 +2855 1034660145 +2856 772335611 +2857 283566240 +2858 44317657 +2859 5224694 +2860 1812746506 +2861 994457204 +2862 1940708333 +2863 614969356 +2864 1774694401 +2865 1738512065 +2866 2142209105 +2867 1153969417 +2868 522920554 +2869 417782304 +2870 1729540498 +2871 1051264720 +2872 1585451777 +2873 1782488539 +2874 320134085 +2875 1225651181 +2876 1181195678 +2877 93493016 +2878 138066421 +2879 1647683728 +2880 1110030471 +2881 969090753 +2882 111107722 +2883 326800804 +2884 1578617744 +2885 318610332 +2886 1361460949 +2887 203469708 +2888 602176572 +2889 1405778606 +2890 208694402 +2891 267439430 +2892 252752163 +2893 1919087 +2894 882408786 +2895 2027446564 +2896 1740431152 +2897 877134243 +2898 1033932334 +2899 115868058 +2900 1294916547 +2901 615989184 +2902 1167132779 +2903 732884676 +2904 250994075 +2905 1487266864 +2906 1958535857 +2907 1432189754 +2908 1580759880 +2909 2096602279 +2910 932389834 +2911 543306703 +2912 918209384 +2913 1043497556 +2914 870107507 +2915 349343480 +2916 1362107889 +2917 84084809 +2918 552813188 +2919 1964284461 +2920 1489863415 +2921 761507591 +2922 84240244 +2923 1742615578 +2924 763426678 +2925 966649030 +2926 1622578495 +2927 356374183 +2928 1843783274 +2929 509027181 +2930 472242241 +2931 991216173 +2932 1125016365 +2933 1639375020 +2934 1724100850 +2935 1376010441 +2936 979158236 +2937 1535153059 +2938 660716547 +2939 412434469 +2940 1484271690 +2941 1593106381 +2942 955741172 +2943 254997426 +2944 489120289 +2945 1825848680 +2946 604340907 +2947 1851228178 +2948 1909933489 +2949 1157154095 +2950 1668028992 +2951 1252313256 +2952 1918661686 +2953 1752269236 +2954 847445187 +2955 534604717 +2956 571434618 +2957 322540034 +2958 890978900 +2959 267734244 +2960 831567215 +2961 1363221141 +2962 1258950418 +2963 1956583580 +2964 855112514 +2965 835567620 +2966 1185110373 +2967 1834270750 +2968 223237031 +2969 1845826920 +2970 99221571 +2971 1707508722 +2972 1291449653 +2973 1054962744 +2974 1962506148 +2975 1780569943 +2976 733327776 +2977 419363407 +2978 1484314473 +2979 495777617 +2980 1576517503 +2981 1004859817 +2982 1748090873 +2983 1347695541 +2984 609645405 +2985 448052412 +2986 1882300258 +2987 1181080024 +2988 770592446 +2989 625795510 +2990 1448814268 +2991 1602159661 +2992 1989016652 +2993 560281038 +2994 1411259594 +2995 696645518 +2996 1395848658 +2997 448886319 +2998 383432620 +2999 1619085690 +3000 147229592 +3001 482654192 +3002 1179110764 +3003 1438679245 +3004 1537616936 +3005 994133264 +3006 1071765540 +3007 123461064 +3008 1413496672 +3009 408596366 +3010 619238681 +3011 842530527 +3012 1413456183 +3013 219845906 +3014 42742420 +3015 2023101589 +3016 667898319 +3017 1925042679 +3018 1056697965 +3019 1438490765 +3020 403354541 +3021 358028585 +3022 893166779 +3023 244887545 +3024 918309624 +3025 156942725 +3026 941533063 +3027 166674634 +3028 605829044 +3029 1324965684 +3030 1785760324 +3031 753058636 +3032 1807619876 +3033 817387440 +3034 44254234 +3035 1197753164 +3036 1811520705 +3037 1116019774 +3038 1321214228 +3039 1077533729 +3040 1524616140 +3041 1940452909 +3042 1920064256 +3043 790588676 +3044 12815167 +3045 1962806676 +3046 666206617 +3047 680713486 +3048 1740365707 +3049 1722904582 +3050 2119204252 +3051 2143720249 +3052 2080933167 +3053 864887383 +3054 241124146 +3055 851759143 +3056 1021830108 +3057 1182657210 +3058 1018433778 +3059 1627659152 +3060 360139246 +3061 656710454 +3062 233234141 +3063 20275474 +3064 1474097895 +3065 277488375 +3066 1218028638 +3067 1138134952 +3068 1393508149 +3069 391759218 +3070 68185033 +3071 770640642 +3072 184728479 +3073 1988249289 +3074 1561229318 +3075 197543646 +3076 1803572317 +3077 79952287 +3078 878257133 +3079 1396454377 +3080 1802856869 +3081 849977737 +3082 1392690978 +3083 1736306388 +3084 1714865120 +3085 1633815124 +3086 440581884 +3087 589211580 +3088 668988686 +3089 1459015662 +3090 69387084 +3091 1029127932 +3092 2115726116 +3093 302621225 +3094 1049403406 +3095 1442340363 +3096 580109600 +3097 119948396 +3098 432991667 +3099 1973617750 +3100 511707614 +3101 501176700 +3102 596774744 +3103 696436093 +3104 341942341 +3105 10520414 +3106 893979740 +3107 2145514659 +3108 90472701 +3109 1772236873 +3110 1394485388 +3111 1893329570 +3112 474730962 +3113 639692718 +3114 1482152310 +3115 42112434 +3116 126024194 +3117 1922734194 +3118 631324014 +3119 795012881 +3120 1234266208 +3121 700711098 +3122 1824140813 +3123 1202508677 +3124 1003332324 +3125 726060572 +3126 497365392 +3127 1583441924 +3128 846008968 +3129 930357060 +3130 1409576026 +3131 1357716583 +3132 1431533760 +3133 2006350770 +3134 2054152676 +3135 1773476102 +3136 2016871184 +3137 800648768 +3138 1771507113 +3139 2107343885 +3140 425401993 +3141 1018508853 +3142 1853189807 +3143 900132955 +3144 1658201571 +3145 1187858470 +3146 942245389 +3147 1784225765 +3148 963109016 +3149 1573569403 +3150 431754998 +3151 49891577 +3152 126796854 +3153 108412164 +3154 1252400254 +3155 1130129178 +3156 834472736 +3157 1749765646 +3158 566087454 +3159 1680481704 +3160 532639058 +3161 1975663481 +3162 890714639 +3163 1964172819 +3164 1834530603 +3165 797383668 +3166 1590165273 +3167 1703918140 +3168 1598032436 +3169 1214188738 +3170 1663778377 +3171 2023434430 +3172 85213943 +3173 1369484537 +3174 776083737 +3175 1743415514 +3176 409859359 +3177 1718329127 +3178 1380157631 +3179 1372968375 +3180 1144414882 +3181 1811912630 +3182 1422859952 +3183 1271211736 +3184 1920324794 +3185 527776558 +3186 253857266 +3187 607313882 +3188 130058557 +3189 819944721 +3190 140311938 +3191 662697615 +3192 648124554 +3193 1031026578 +3194 479386786 +3195 335171509 +3196 1828410246 +3197 2069552059 +3198 2039089649 +3199 1278959034 +3200 1136257149 +3201 1555384379 +3202 1154909816 +3203 1221471092 +3204 777385268 +3205 1930993554 +3206 817402958 +3207 1187244627 +3208 1501839033 +3209 50076942 +3210 412729354 +3211 498770267 +3212 1861989572 +3213 1835589307 +3214 1769982004 +3215 1634830718 +3216 215882217 +3217 2023839270 +3218 94660952 +3219 345940774 +3220 696300343 +3221 234972890 +3222 1008638390 +3223 1344424897 +3224 1265999468 +3225 1488025176 +3226 1679596407 +3227 946926066 +3228 1410093588 +3229 1571202408 +3230 78401453 +3231 398867089 +3232 979103139 +3233 1233311269 +3234 1620338182 +3235 1756488407 +3236 1016821175 +3237 290257492 +3238 796249386 +3239 371176560 +3240 340334434 +3241 1208978741 +3242 869946828 +3243 54840358 +3244 897084400 +3245 492445184 +3246 1689671076 +3247 1112966617 +3248 368800806 +3249 1784332028 +3250 1458907392 +3251 1065101150 +3252 2019304919 +3253 320062134 +3254 262042399 +3255 1137820739 +3256 1808087310 +3257 1941638806 +3258 2084746806 +3259 1070697250 +3260 1365357567 +3261 15664611 +3262 1469564340 +3263 196977058 +3264 1248975880 +3265 942418874 +3266 1953465466 +3267 118313408 +3268 1232676366 +3269 602231204 +3270 489489968 +3271 1573010801 +3272 1811209945 +3273 1359436796 +3274 1627851159 +3275 560810697 +3276 1851881980 +3277 1170038588 +3278 1673777315 +3279 73199139 +3280 806886968 +3281 985201059 +3282 1138300289 +3283 678708239 +3284 1305263193 +3285 1400342688 +3286 1816528979 +3287 965866855 +3288 1194497847 +3289 1753792137 +3290 2036564106 +3291 412371766 +3292 1769456748 +3293 1358644798 +3294 609348824 +3295 870948980 +3296 153580024 +3297 415330642 +3298 989262388 +3299 1386256390 +3300 1017561847 +3301 1478752357 +3302 811783543 +3303 681288144 +3304 690705505 +3305 292151055 +3306 1242098842 +3307 395103838 +3308 1462189643 +3309 768392509 +3310 468302977 +3311 121592963 +3312 1753593568 +3313 1606603266 +3314 800301203 +3315 911373113 +3316 859462306 +3317 469346534 +3318 1877239968 +3319 2053960153 +3320 75655023 +3321 1766320426 +3322 318848271 +3323 1845111771 +3324 977481576 +3325 928197096 +3326 568577103 +3327 1131061600 +3328 1343527738 +3329 1557839492 +3330 369834343 +3331 213605937 +3332 889108201 +3333 1181617886 +3334 894894082 +3335 1579813706 +3336 1473768941 +3337 2136992924 +3338 1974917544 +3339 788474936 +3340 757901785 +3341 295736873 +3342 910067900 +3343 364011705 +3344 1902340139 +3345 1710369103 +3346 1275384818 +3347 614318798 +3348 32231989 +3349 1005141138 +3350 520795303 +3351 107887012 +3352 623977917 +3353 839643575 +3354 1952998783 +3355 1601459493 +3356 1767840671 +3357 374092238 +3358 585037446 +3359 963884761 +3360 1931931730 +3361 954871789 +3362 1177490699 +3363 673556283 +3364 2136489675 +3365 2072384781 +3366 105886342 +3367 1462774969 +3368 2061894057 +3369 2080803886 +3370 103766257 +3371 672312194 +3372 229057112 +3373 1013834157 +3374 1036323899 +3375 2131397251 +3376 576719612 +3377 164225069 +3378 598232401 +3379 608951601 +3380 1169366207 +3381 1119027705 +3382 716838613 +3383 1793344124 +3384 1958671280 +3385 522353748 +3386 1247319970 +3387 1579028303 +3388 896445987 +3389 1832357416 +3390 395429416 +3391 680894069 +3392 639745557 +3393 1572920115 +3394 1354450353 +3395 628751584 +3396 1497821248 +3397 1460336695 +3398 2091526553 +3399 1412231657 +3400 1393656933 +3401 47809163 +3402 2084543851 +3403 1622714045 +3404 1061643320 +3405 973384102 +3406 1606627649 +3407 1638362933 +3408 1137609171 +3409 57376402 +3410 99830886 +3411 159491731 +3412 1176404107 +3413 816669500 +3414 1952835855 +3415 987591739 +3416 1339023248 +3417 1052672177 +3418 419136394 +3419 87985587 +3420 737545945 +3421 814565811 +3422 768879657 +3423 1377291502 +3424 240002278 +3425 2123330010 +3426 2006043087 +3427 1737823527 +3428 1436183057 +3429 1950085992 +3430 1002571536 +3431 682356342 +3432 1997895155 +3433 939631740 +3434 157586740 +3435 912054828 +3436 1913015842 +3437 1764214389 +3438 402934113 +3439 903141366 +3440 1821590791 +3441 502764999 +3442 1062633097 +3443 850511251 +3444 1319434499 +3445 867985304 +3446 1838102990 +3447 510974100 +3448 1920657482 +3449 109755737 +3450 598959687 +3451 510719779 +3452 924321548 +3453 1367839344 +3454 1888011282 +3455 1164323826 +3456 1343685706 +3457 1746570721 +3458 754663705 +3459 632385115 +3460 1549173065 +3461 1757235242 +3462 1314741458 +3463 1399584573 +3464 549383334 +3465 1472328198 +3466 164155753 +3467 314915528 +3468 1089058939 +3469 567089866 +3470 1218056894 +3471 763166082 +3472 1069854865 +3473 133206343 +3474 1613677333 +3475 241805717 +3476 1001191648 +3477 1304296676 +3478 752779817 +3479 774365482 +3480 1414052413 +3481 1351739504 +3482 1285085261 +3483 190890313 +3484 572095201 +3485 1025612895 +3486 1355214139 +3487 1915780907 +3488 624699968 +3489 2109877845 +3490 400682375 +3491 26389386 +3492 1719629439 +3493 1715423833 +3494 1425973959 +3495 121529125 +3496 1040268383 +3497 1590129712 +3498 436444653 +3499 2129327322 +3500 9735930 +3501 1654501548 +3502 745009756 +3503 1079590795 +3504 1787707891 +3505 211203442 +3506 1321396512 +3507 641415891 +3508 1515500118 +3509 2074176329 +3510 1415781373 +3511 782068883 +3512 1278432186 +3513 553382987 +3514 972959196 +3515 1850527387 +3516 1578995882 +3517 180689687 +3518 1618824646 +3519 56212203 +3520 143083884 +3521 2019507021 +3522 82601589 +3523 1862713323 +3524 1587447206 +3525 1508575548 +3526 1984242448 +3527 480231941 +3528 951221612 +3529 273203454 +3530 462075615 +3531 960957542 +3532 1927705002 +3533 1207085372 +3534 2040548337 +3535 1567929245 +3536 1418288814 +3537 1214461202 +3538 61861489 +3539 786305284 +3540 1141153883 +3541 1477642862 +3542 1568374167 +3543 272102421 +3544 2031025849 +3545 393849715 +3546 2122629808 +3547 1462538084 +3548 574539402 +3549 1593970807 +3550 1518750287 +3551 717623287 +3552 1465994180 +3553 1601351876 +3554 432852962 +3555 905957739 +3556 962443776 +3557 269611763 +3558 1386189680 +3559 1913665388 +3560 542815217 +3561 1848265296 +3562 727139282 +3563 323036571 +3564 907867020 +3565 620203971 +3566 1890965816 +3567 178672186 +3568 1834665173 +3569 1952827305 +3570 964977470 +3571 828335409 +3572 1282986520 +3573 385867989 +3574 1100437830 +3575 1166528721 +3576 779717704 +3577 1075583991 +3578 481583157 +3579 1354257106 +3580 522071150 +3581 2000333444 +3582 2071880393 +3583 1988065330 +3584 1454201672 +3585 357249708 +3586 746539421 +3587 269161800 +3588 626861471 +3589 2132729102 +3590 35343540 +3591 1169676688 +3592 1833510750 +3593 762482822 +3594 1492713259 +3595 593894122 +3596 1382686794 +3597 1236195427 +3598 772566308 +3599 1069868319 +3600 1041539085 +3601 1737543778 +3602 1898203728 +3603 177041957 +3604 2123411767 +3605 851157911 +3606 1343570678 +3607 755645823 +3608 1926741902 +3609 1825153836 +3610 2109902929 +3611 301329404 +3612 1678003632 +3613 2034299675 +3614 141911086 +3615 984721657 +3616 244065735 +3617 888450508 +3618 1253883457 +3619 870927206 +3620 873695962 +3621 1289226998 +3622 2040603894 +3623 559723064 +3624 2051709820 +3625 1385833505 +3626 1153617186 +3627 1286912966 +3628 474545284 +3629 1926183494 +3630 209297638 +3631 1516084369 +3632 1516243624 +3633 2107501366 +3634 1693126326 +3635 1492171743 +3636 811175629 +3637 889213357 +3638 100333918 +3639 590433883 +3640 566883545 +3641 62753199 +3642 891763287 +3643 97403529 +3644 2097052874 +3645 1033674374 +3646 1082125186 +3647 193634961 +3648 1922124882 +3649 188524996 +3650 1064562167 +3651 648337196 +3652 1477751994 +3653 957682413 +3654 1208060260 +3655 1381978166 +3656 196032270 +3657 214193798 +3658 521407485 +3659 670577555 +3660 2140377292 +3661 730705123 +3662 39178276 +3663 1509137268 +3664 690722841 +3665 1732304603 +3666 853825363 +3667 1501898471 +3668 474034312 +3669 954159281 +3670 2092332354 +3671 1040917857 +3672 1016912480 +3673 836611994 +3674 1138321386 +3675 966481707 +3676 1870286368 +3677 72962925 +3678 1160116668 +3679 1644927602 +3680 261487921 +3681 77195188 +3682 145781150 +3683 1739239915 +3684 1034877601 +3685 1353841410 +3686 973734433 +3687 1230909872 +3688 1568035208 +3689 1495141918 +3690 1901487427 +3691 1560928852 +3692 78363393 +3693 1940665703 +3694 922582472 +3695 769086235 +3696 1525486658 +3697 1776407835 +3698 123501058 +3699 1999520970 +3700 583083468 +3701 68349764 +3702 892955179 +3703 1599995948 +3704 904961758 +3705 2031276566 +3706 418994007 +3707 627764478 +3708 2104239491 +3709 1579110676 +3710 125208432 +3711 218243764 +3712 1656305864 +3713 270989582 +3714 1957483679 +3715 543699817 +3716 1624830992 +3717 783734464 +3718 1774609689 +3719 1045382552 +3720 131392735 +3721 1528613468 +3722 458827756 +3723 209756128 +3724 1321795524 +3725 1381410228 +3726 978842363 +3727 699798534 +3728 1010334415 +3729 1102343421 +3730 551835857 +3731 1593417883 +3732 1170693186 +3733 1444791036 +3734 1045930184 +3735 2075654944 +3736 1328583954 +3737 1464924191 +3738 555935775 +3739 1285339797 +3740 896551219 +3741 681144207 +3742 1503583561 +3743 405373435 +3744 952133790 +3745 1313583592 +3746 949073253 +3747 429481134 +3748 2097318057 +3749 576199294 +3750 1474863687 +3751 81227144 +3752 2104812763 +3753 1933691443 +3754 290983272 +3755 1279124639 +3756 1167618024 +3757 1269825636 +3758 1978923173 +3759 30468791 +3760 224685409 +3761 383275382 +3762 1623886675 +3763 1395378595 +3764 1828066419 +3765 522333211 +3766 1323549892 +3767 1009166725 +3768 1987257402 +3769 1879485667 +3770 147022875 +3771 736324974 +3772 413146226 +3773 1650606436 +3774 1141698409 +3775 1365280016 +3776 816706381 +3777 2090771662 +3778 1794761151 +3779 766540790 +3780 519487309 +3781 1122141190 +3782 847767934 +3783 476816424 +3784 908348985 +3785 1138751206 +3786 1755941063 +3787 2075967009 +3788 261093194 +3789 1587380588 +3790 2106435801 +3791 485778604 +3792 1970655971 +3793 1582838828 +3794 1881157199 +3795 1651238742 +3796 2105172039 +3797 1057223443 +3798 512921819 +3799 1944945793 +3800 789225462 +3801 659944694 +3802 533787119 +3803 1202371689 +3804 163067483 +3805 1675485529 +3806 420168057 +3807 979773864 +3808 1618773543 +3809 67445560 +3810 1746314654 +3811 2138260852 +3812 1189586750 +3813 446598940 +3814 467593628 +3815 2097935736 +3816 1585350146 +3817 76051043 +3818 2026419097 +3819 1846443341 +3820 1663431632 +3821 1985371250 +3822 184738297 +3823 1486603955 +3824 1420726430 +3825 2065895496 +3826 990359049 +3827 1378414821 +3828 975635292 +3829 1503280868 +3830 1175876967 +3831 1764860754 +3832 15741915 +3833 1709664086 +3834 819748795 +3835 178809398 +3836 1237665967 +3837 1239916853 +3838 1158583262 +3839 708955863 +3840 1307362413 +3841 757414268 +3842 699733067 +3843 349465516 +3844 1204013208 +3845 1167326696 +3846 299917604 +3847 641879706 +3848 1243377739 +3849 178853053 +3850 340839399 +3851 759325723 +3852 16740656 +3853 525577696 +3854 98446030 +3855 1437467086 +3856 443989545 +3857 1088805079 +3858 668398260 +3859 1419624837 +3860 444602300 +3861 1844275227 +3862 1037001943 +3863 460344215 +3864 1406455665 +3865 1856750739 +3866 639153613 +3867 496637985 +3868 949183944 +3869 1797736875 +3870 1205593848 +3871 109062709 +3872 407667495 +3873 1905326915 +3874 458528225 +3875 1611680703 +3876 925169963 +3877 758445829 +3878 106076761 +3879 21064055 +3880 937298883 +3881 446916161 +3882 780389778 +3883 954039539 +3884 972493857 +3885 878835809 +3886 244022977 +3887 1416483402 +3888 1967640888 +3889 912421237 +3890 688624591 +3891 264759540 +3892 609212816 +3893 1725626535 +3894 725103755 +3895 2015668482 +3896 1434893626 +3897 1364257368 +3898 364822819 +3899 236593922 +3900 1014510595 +3901 1570416667 +3902 345656631 +3903 1422178090 +3904 1328259934 +3905 804184857 +3906 886375145 +3907 105946250 +3908 1562630686 +3909 992451907 +3910 127010305 +3911 352445921 +3912 1439368068 +3913 907400083 +3914 1306485460 +3915 264378277 +3916 1786235892 +3917 1550508438 +3918 1680861680 +3919 1606393133 +3920 315446027 +3921 222002623 +3922 1871152673 +3923 924658844 +3924 1947629158 +3925 448772781 +3926 792843678 +3927 1235039136 +3928 1813030149 +3929 1157666497 +3930 1471633058 +3931 680057097 +3932 580599516 +3933 1817289690 +3934 2102235187 +3935 1908859450 +3936 473990899 +3937 841126685 +3938 2014805700 +3939 2036621585 +3940 1833578592 +3941 2141816005 +3942 241583859 +3943 1125463012 +3944 901732441 +3945 1548069319 +3946 1389841289 +3947 540484685 +3948 951094109 +3949 923219321 +3950 2146877818 +3951 1266540137 +3952 1145221945 +3953 1870546844 +3954 43715333 +3955 945367455 +3956 171835977 +3957 836559011 +3958 32922944 +3959 1984866126 +3960 1994225508 +3961 1504556002 +3962 517439575 +3963 427341376 +3964 1174362044 +3965 472191115 +3966 188717178 +3967 1648352943 +3968 1313317800 +3969 56039231 +3970 1537490881 +3971 999412744 +3972 50371588 +3973 1779074740 +3974 2124875756 +3975 952104029 +3976 1179660411 +3977 1367233397 +3978 1492588715 +3979 2130754521 +3980 142969071 +3981 1491982885 +3982 1249811010 +3983 1288191016 +3984 1215046081 +3985 1293526343 +3986 86074823 +3987 1386882058 +3988 2130085354 +3989 118997767 +3990 1224264537 +3991 1976827214 +3992 1623553770 +3993 1741704112 +3994 256684942 +3995 650432166 +3996 66411579 +3997 445402120 +3998 151301462 +3999 1379729379 +4000 501441351 +4001 1688792343 +4002 231658475 +4003 551812940 +4004 1320383435 +4005 209050583 +4006 1503916969 +4007 352560198 +4008 1576283981 +4009 849022036 +4010 335831071 +4011 1719253052 +4012 193521274 +4013 1585642081 +4014 859960420 +4015 1408567355 +4016 731684776 +4017 946035243 +4018 647965766 +4019 714286482 +4020 1065033011 +4021 1872230303 +4022 543630048 +4023 541103133 +4024 1466450767 +4025 800314990 +4026 1191535299 +4027 1532862347 +4028 1245717111 +4029 1342836761 +4030 765108078 +4031 1747158462 +4032 884145456 +4033 996766554 +4034 151487754 +4035 57045243 +4036 1205817137 +4037 1655404724 +4038 409605442 +4039 634617470 +4040 356943112 +4041 745436513 +4042 206386874 +4043 550464386 +4044 183594947 +4045 1066347294 +4046 1959031742 +4047 915279723 +4048 2012382538 +4049 459513860 +4050 1629566206 +4051 929931901 +4052 184260515 +4053 25712606 +4054 1471035034 +4055 1650711282 +4056 826027597 +4057 515086685 +4058 1036089981 +4059 2071744708 +4060 1857923447 +4061 1801198060 +4062 1671419522 +4063 594585255 +4064 650480966 +4065 1822907277 +4066 651630499 +4067 1856298103 +4068 1330828353 +4069 1061235941 +4070 343431926 +4071 1687771465 +4072 1806672454 +4073 549818800 +4074 90752204 +4075 1990267401 +4076 1616166095 +4077 2049783946 +4078 758063477 +4079 1481064985 +4080 361814158 +4081 240146035 +4082 263513238 +4083 546074673 +4084 265858641 +4085 1734548272 +4086 49302307 +4087 1091886238 +4088 102151309 +4089 1085392289 +4090 1016147298 +4091 1960074756 +4092 739106701 +4093 540083173 +4094 407176364 +4095 1389587667 +4096 215506802 +4097 1058806863 +4098 1098402122 +4099 1546335155 +4100 2120042804 +4101 1441834048 +4102 1086622972 +4103 1779231610 +4104 1991652849 +4105 1177375176 +4106 1622015364 +4107 1460335296 +4108 1079675474 +4109 232595193 +4110 793916633 +4111 1441489632 +4112 472741228 +4113 1057429871 +4114 1987564305 +4115 738599869 +4116 644494495 +4117 2036866613 +4118 1830486108 +4119 746645804 +4120 974775254 +4121 699149758 +4122 559236913 +4123 1713881955 +4124 1239232931 +4125 966413277 +4126 955985974 +4127 1454739733 +4128 2025220140 +4129 2054388096 +4130 853591240 +4131 1997779296 +4132 1348738497 +4133 1940214213 +4134 1629527258 +4135 1192907698 +4136 970105741 +4137 1104058974 +4138 505759346 +4139 2049781216 +4140 1336654167 +4141 1299675979 +4142 1343787200 +4143 1809395395 +4144 209622202 +4145 1183867858 +4146 400511617 +4147 854116697 +4148 1073250823 +4149 83514077 +4150 1600762501 +4151 2048026077 +4152 782663835 +4153 12515766 +4154 1614424384 +4155 2021896767 +4156 978929043 +4157 422926710 +4158 1329152852 +4159 856665535 +4160 329831158 +4161 35260445 +4162 706961183 +4163 1678569655 +4164 1975474658 +4165 189004794 +4166 723993705 +4167 798096751 +4168 1293063768 +4169 1229753051 +4170 700394319 +4171 482234288 +4172 381945382 +4173 2044181520 +4174 144146035 +4175 591567584 +4176 1080565730 +4177 544657652 +4178 1445684281 +4179 6332905 +4180 628171729 +4181 898963135 +4182 2054358982 +4183 1410835565 +4184 911478901 +4185 1521299718 +4186 1285248684 +4187 1890407945 +4188 1944226428 +4189 466917888 +4190 599589832 +4191 126573938 +4192 502178333 +4193 1306551016 +4194 1805143594 +4195 330169343 +4196 1495555810 +4197 381653651 +4198 1128266095 +4199 641135930 +4200 1611406703 +4201 1828660414 +4202 1123370218 +4203 1993352085 +4204 1725358286 +4205 1267516254 +4206 437436022 +4207 658440368 +4208 1812173906 +4209 1883120303 +4210 664773273 +4211 292861988 +4212 634599790 +4213 571648607 +4214 1703697553 +4215 1546078692 +4216 2092948325 +4217 841462589 +4218 1289002989 +4219 1889691105 +4220 1308380477 +4221 1888592821 +4222 2016265044 +4223 1810558811 +4224 1047660189 +4225 1673924990 +4226 2140728154 +4227 395732351 +4228 2055578641 +4229 1121510601 +4230 1036868282 +4231 1519501696 +4232 802687368 +4233 12754852 +4234 1365370134 +4235 380562006 +4236 1280271106 +4237 1802806156 +4238 1039002375 +4239 944961365 +4240 1538442811 +4241 1703775648 +4242 1237823353 +4243 25558954 +4244 127940608 +4245 794037258 +4246 1571637646 +4247 73405285 +4248 1635499847 +4249 713156987 +4250 1963096391 +4251 796396676 +4252 454266160 +4253 1831877787 +4254 459471839 +4255 1501926350 +4256 1358319129 +4257 452716346 +4258 1897658701 +4259 1266414122 +4260 1574226947 +4261 787043335 +4262 638432171 +4263 229430667 +4264 799798188 +4265 2003802305 +4266 609992674 +4267 2080069294 +4268 1659124813 +4269 1648995049 +4270 877547011 +4271 1050083976 +4272 1205287049 +4273 2115370364 +4274 1075642930 +4275 1333227657 +4276 761923974 +4277 499796928 +4278 1406632943 +4279 249940173 +4280 1212953915 +4281 1222245686 +4282 1046336850 +4283 1667220076 +4284 906639825 +4285 1505808689 +4286 1021662778 +4287 117475306 +4288 1958525035 +4289 771837831 +4290 1383889428 +4291 1385268335 +4292 1558881167 +4293 2022321599 +4294 1614699002 +4295 211195707 +4296 1878640256 +4297 77208028 +4298 143781353 +4299 1390281421 +4300 1726203077 +4301 1021328365 +4302 292881750 +4303 784006479 +4304 989215081 +4305 1368524680 +4306 2117234136 +4307 1751139056 +4308 1868321609 +4309 1376383431 +4310 2001079229 +4311 933791876 +4312 451145469 +4313 899932431 +4314 453528304 +4315 1357785294 +4316 258257473 +4317 1475191082 +4318 1475260600 +4319 69298860 +4320 99545266 +4321 711666381 +4322 1454567195 +4323 1658426433 +4324 586504332 +4325 921782550 +4326 1869622140 +4327 317660941 +4328 998990578 +4329 2013403493 +4330 1707942362 +4331 577710008 +4332 887248210 +4333 2000824112 +4334 1361716487 +4335 1876463292 +4336 1221865145 +4337 1331466975 +4338 1480118700 +4339 942703106 +4340 560366759 +4341 1333714281 +4342 1876494982 +4343 1011512228 +4344 86163065 +4345 182539639 +4346 221813875 +4347 344420538 +4348 1657730721 +4349 1697074475 +4350 413719398 +4351 1757275987 +4352 261257208 +4353 1868286594 +4354 1268218772 +4355 847761541 +4356 642585496 +4357 990357264 +4358 1165422482 +4359 1641576074 +4360 856277110 +4361 725881196 +4362 71802434 +4363 1743525320 +4364 579221661 +4365 1433518921 +4366 1472504964 +4367 1801086806 +4368 617502249 +4369 805140016 +4370 596306264 +4371 1177869008 +4372 2138854298 +4373 325317598 +4374 41897588 +4375 77533715 +4376 507857237 +4377 263711463 +4378 421954253 +4379 18104311 +4380 1960785939 +4381 835673651 +4382 1775380298 +4383 74559499 +4384 556476597 +4385 896115423 +4386 922321040 +4387 1199062093 +4388 1886472687 +4389 2087743522 +4390 693154520 +4391 595266149 +4392 666141071 +4393 764956954 +4394 191307822 +4395 1245362732 +4396 50992228 +4397 1663812786 +4398 898965890 +4399 668494477 +4400 321469155 +4401 1495272154 +4402 1846363485 +4403 312839805 +4404 1820589752 +4405 1888261073 +4406 390373520 +4407 180963342 +4408 4488889 +4409 812327773 +4410 199067653 +4411 1965274828 +4412 1648001424 +4413 1974447951 +4414 2039834327 +4415 56994374 +4416 723079726 +4417 814671720 +4418 1256056467 +4419 462068766 +4420 754931594 +4421 1949210987 +4422 1057334915 +4423 1421072665 +4424 566684294 +4425 1248642737 +4426 518951749 +4427 617676522 +4428 764971876 +4429 1417917639 +4430 1286170999 +4431 1086441031 +4432 765706145 +4433 985050836 +4434 1399280836 +4435 438812250 +4436 725828261 +4437 1789654356 +4438 619775592 +4439 730317150 +4440 454498481 +4441 818843245 +4442 548108330 +4443 2102499905 +4444 645807548 +4445 440459010 +4446 12010631 +4447 1368887275 +4448 1255130730 +4449 1268067099 +4450 1830956041 +4451 2010062324 +4452 1069794438 +4453 740807308 +4454 1283651342 +4455 1636478732 +4456 1989450046 +4457 1802603091 +4458 106671606 +4459 606938274 +4460 1073037083 +4461 1392842605 +4462 1693379305 +4463 1838743228 +4464 230409793 +4465 945176493 +4466 130071830 +4467 956238055 +4468 587347201 +4469 749847422 +4470 1686555205 +4471 1041845682 +4472 1568690667 +4473 87179888 +4474 996861939 +4475 67014568 +4476 527638898 +4477 1008872571 +4478 1435901843 +4479 1782769628 +4480 129456022 +4481 1119374236 +4482 1645348304 +4483 1199250460 +4484 1860181544 +4485 781515998 +4486 688245545 +4487 1702147942 +4488 436635442 +4489 794917151 +4490 161602568 +4491 1509672525 +4492 40276109 +4493 1854981873 +4494 1200932105 +4495 270685902 +4496 652674718 +4497 1331003936 +4498 1226923957 +4499 1240021919 +4500 2080851358 +4501 765995515 +4502 134383953 +4503 1502058378 +4504 853175403 +4505 1131245893 +4506 1569072946 +4507 1380814301 +4508 2140118464 +4509 857491141 +4510 1016100281 +4511 122090838 +4512 1976865377 +4513 513964937 +4514 1321341298 +4515 1689563273 +4516 1295480936 +4517 2009586843 +4518 1244227568 +4519 1732116378 +4520 657020347 +4521 1405830136 +4522 1094305255 +4523 697296456 +4524 1113328362 +4525 147753712 +4526 967982358 +4527 1766003080 +4528 1478757648 +4529 47422668 +4530 858541352 +4531 1412125359 +4532 813418183 +4533 992925305 +4534 766700089 +4535 1666593586 +4536 2124171198 +4537 188289387 +4538 899924239 +4539 2116806014 +4540 1045780528 +4541 1916024520 +4542 91413204 +4543 875162257 +4544 282505809 +4545 1412754503 +4546 417241882 +4547 1577986745 +4548 1274857698 +4549 1661469450 +4550 1162619475 +4551 1931878045 +4552 919815939 +4553 109441082 +4554 481690853 +4555 2033144301 +4556 257194795 +4557 1449673212 +4558 1651663733 +4559 1735952443 +4560 1497095880 +4561 362721437 +4562 1000594154 +4563 163030415 +4564 1355646743 +4565 1767294243 +4566 1829624001 +4567 1332334293 +4568 1955583630 +4569 582064592 +4570 1301656660 +4571 853880510 +4572 350605464 +4573 1393069864 +4574 1729042767 +4575 633111273 +4576 658340719 +4577 2146284650 +4578 63614371 +4579 1933198418 +4580 1660270452 +4581 1226233846 +4582 1717592815 +4583 432602743 +4584 1335674929 +4585 51800021 +4586 318263396 +4587 1592869724 +4588 1501473233 +4589 1969927130 +4590 1181338519 +4591 851085465 +4592 185164919 +4593 34449026 +4594 1014115880 +4595 1540811662 +4596 1801743269 +4597 696256233 +4598 725662308 +4599 1609843252 +4600 1278320825 +4601 2027318968 +4602 316240114 +4603 1628926289 +4604 1272905184 +4605 2045282882 +4606 114553914 +4607 1931245904 +4608 2044083884 +4609 178168285 +4610 1716960674 +4611 1556870688 +4612 1404402132 +4613 1287069841 +4614 1989473432 +4615 592593413 +4616 1338869862 +4617 160253180 +4618 37979489 +4619 692859447 +4620 2130180310 +4621 1219318008 +4622 1543944912 +4623 167861582 +4624 1253767034 +4625 410577144 +4626 1708673244 +4627 908026656 +4628 1106833377 +4629 286851904 +4630 370386260 +4631 237670554 +4632 166687224 +4633 686626374 +4634 1866596843 +4635 1439592409 +4636 584425608 +4637 1981150758 +4638 1223354665 +4639 481025844 +4640 11835395 +4641 792831691 +4642 2037896533 +4643 1416237527 +4644 2079901532 +4645 1879886317 +4646 2008830940 +4647 1271287747 +4648 2040139497 +4649 2046810429 +4650 1964147194 +4651 2022836160 +4652 1118644790 +4653 1360608459 +4654 43214094 +4655 224928176 +4656 1771185603 +4657 1751887338 +4658 1132954832 +4659 730535333 +4660 2038739243 +4661 1503341092 +4662 968205887 +4663 57942819 +4664 42483819 +4665 687319083 +4666 1497535228 +4667 626909427 +4668 520986193 +4669 573406245 +4670 1107935272 +4671 532821588 +4672 1366237936 +4673 998348157 +4674 1949059116 +4675 1298655821 +4676 730750826 +4677 1810406408 +4678 422459920 +4679 623406675 +4680 1709733190 +4681 239123466 +4682 498759187 +4683 680894332 +4684 1599731925 +4685 541973281 +4686 905822508 +4687 1223433881 +4688 146376972 +4689 2038777341 +4690 1953969214 +4691 37632567 +4692 1394634785 +4693 774691453 +4694 95575386 +4695 1437118604 +4696 1462010536 +4697 1593110615 +4698 2064028032 +4699 1982996729 +4700 19033212 +4701 1024479656 +4702 368334670 +4703 1385271149 +4704 2022827813 +4705 169910138 +4706 536443322 +4707 606094991 +4708 1980316546 +4709 958903242 +4710 1229501666 +4711 1542566088 +4712 1198026708 +4713 1728260854 +4714 75976772 +4715 650274986 +4716 122750487 +4717 981799281 +4718 1873708867 +4719 269127459 +4720 873092974 +4721 1680194433 +4722 306760026 +4723 120244111 +4724 307402238 +4725 402335413 +4726 1557362716 +4727 1769412775 +4728 1995446028 +4729 1473907100 +4730 1604925856 +4731 2014479240 +4732 350903108 +4733 1973260526 +4734 1252266741 +4735 226247273 +4736 2143170664 +4737 1788710063 +4738 832342264 +4739 1976003563 +4740 600129657 +4741 2061843930 +4742 1371086003 +4743 1798156366 +4744 1642621136 +4745 1447062776 +4746 300947704 +4747 1765371624 +4748 281378409 +4749 27172923 +4750 2034499083 +4751 1154471383 +4752 1707367356 +4753 193775462 +4754 1274715494 +4755 2014769594 +4756 596110875 +4757 684594562 +4758 1636698721 +4759 444073255 +4760 11018014 +4761 1094140930 +4762 311068847 +4763 361921122 +4764 919917808 +4765 1563335589 +4766 588168395 +4767 915604825 +4768 1204562004 +4769 1420510659 +4770 744124740 +4771 1804691662 +4772 1334870942 +4773 2115210743 +4774 1455364380 +4775 830008430 +4776 1414789871 +4777 1756312084 +4778 447896406 +4779 1696168280 +4780 1783485007 +4781 334911842 +4782 703156015 +4783 1343368715 +4784 528687304 +4785 1977871510 +4786 1210654661 +4787 1124798179 +4788 514982424 +4789 699869735 +4790 1568871434 +4791 526000439 +4792 1794010665 +4793 1879940281 +4794 887921561 +4795 566444825 +4796 1295792222 +4797 1476089957 +4798 1482049650 +4799 352870579 +4800 749116968 +4801 78690742 +4802 10078593 +4803 2083987910 +4804 46417838 +4805 1465442973 +4806 766512693 +4807 1461207709 +4808 1074271409 +4809 1214409099 +4810 1009892342 +4811 710272768 +4812 1549320941 +4813 1713048357 +4814 2053641483 +4815 2078008245 +4816 1543436219 +4817 1116812496 +4818 1055322776 +4819 2058418644 +4820 1816682231 +4821 476710562 +4822 436935435 +4823 1463209248 +4824 209167196 +4825 1324856996 +4826 2029654074 +4827 1504959418 +4828 653463305 +4829 1364220076 +4830 1857829997 +4831 1402580274 +4832 1442910819 +4833 1867908590 +4834 1339084536 +4835 1489328657 +4836 1185867915 +4837 2105597229 +4838 803052718 +4839 112655676 +4840 1172522681 +4841 1812945060 +4842 822928444 +4843 574359974 +4844 1378509770 +4845 729086279 +4846 504884572 +4847 774462341 +4848 1845898776 +4849 1560207348 +4850 685397337 +4851 1515097359 +4852 2036917911 +4853 1122332772 +4854 830822960 +4855 98601459 +4856 299706121 +4857 712993386 +4858 1603560877 +4859 953169426 +4860 2077213462 +4861 1313907227 +4862 208266052 +4863 1372640633 +4864 1034332169 +4865 1547350589 +4866 714485642 +4867 72716437 +4868 1505464170 +4869 1517538361 +4870 185372113 +4871 530503203 +4872 1182999773 +4873 1008300558 +4874 1104863178 +4875 414025895 +4876 1737386837 +4877 1609747750 +4878 1188488237 +4879 1435801965 +4880 1022471450 +4881 1873885574 +4882 803415677 +4883 911905713 +4884 848734699 +4885 1634238637 +4886 1010507172 +4887 1148440820 +4888 199748375 +4889 466584402 +4890 2101610246 +4891 129478189 +4892 1780491629 +4893 162392651 +4894 1502118823 +4895 667340150 +4896 1709743240 +4897 69120817 +4898 740056587 +4899 1067723762 +4900 1586659178 +4901 925428701 +4902 1598226966 +4903 622175304 +4904 1933729259 +4905 555606496 +4906 1036201199 +4907 1523632448 +4908 17870598 +4909 77205788 +4910 811950766 +4911 1040342048 +4912 1951091363 +4913 1615366443 +4914 1952247762 +4915 652342414 +4916 1102121432 +4917 815271286 +4918 1800783234 +4919 1301869807 +4920 1281855688 +4921 1754909832 +4922 1431347996 +4923 914863669 +4924 1917302483 +4925 785983171 +4926 1582203820 +4927 1479562075 +4928 855103989 +4929 174776759 +4930 399802190 +4931 294279519 +4932 1100205460 +4933 1998029156 +4934 916454823 +4935 886451071 +4936 406152004 +4937 1952656023 +4938 262599872 +4939 424022602 +4940 2029861811 +4941 1074550638 +4942 1464364650 +4943 1833469526 +4944 542433433 +4945 1269128764 +4946 338328292 +4947 1644554865 +4948 2084400051 +4949 2139111526 +4950 798941024 +4951 1218772091 +4952 1746537711 +4953 82805372 +4954 2133635761 +4955 1516356546 +4956 868788544 +4957 1568355933 +4958 848434974 +4959 1723892533 +4960 1743132692 +4961 1248237164 +4962 2018172052 +4963 695854505 +4964 1098782672 +4965 787143228 +4966 1582305576 +4967 1504934676 +4968 592315603 +4969 1844905448 +4970 1928957278 +4971 474693766 +4972 771972438 +4973 1245838280 +4974 160679645 +4975 1314405871 +4976 367483397 +4977 499007937 +4978 811477088 +4979 304399800 +4980 490635816 +4981 1610418112 +4982 1523171891 +4983 89689879 +4984 1693223485 +4985 1509324004 +4986 1606046425 +4987 414528381 +4988 930196289 +4989 306997751 +4990 2138420914 +4991 525845334 +4992 1555234915 +4993 2009109318 +4994 1221699839 +4995 506533939 +4996 648768898 +4997 656521767 +4998 2011468615 +4999 1241084501 +5000 353943568 +5001 1792942245 +5002 1715778268 +5003 1125916006 +5004 891296878 +5005 1876457913 +5006 292838230 +5007 1258780275 +5008 227982202 +5009 1104315318 +5010 1563180075 +5011 718618018 +5012 567249783 +5013 938868318 +5014 808307897 +5015 112989620 +5016 300708675 +5017 266870675 +5018 527518001 +5019 1230904964 +5020 573868426 +5021 518455267 +5022 1756750298 +5023 2129103342 +5024 380080937 +5025 830966489 +5026 488153633 +5027 1028849836 +5028 1487488257 +5029 352138601 +5030 122450689 +5031 1841431825 +5032 2145080846 +5033 1838228957 +5034 819864183 +5035 888894076 +5036 1567203222 +5037 1112702413 +5038 190703 +5039 1795185425 +5040 69534084 +5041 1563370778 +5042 366319795 +5043 636783867 +5044 354755449 +5045 1174627693 +5046 749773487 +5047 655464124 +5048 1441498368 +5049 1277291488 +5050 1886369088 +5051 2015366794 +5052 1795746755 +5053 1495635739 +5054 1996986488 +5055 28344044 +5056 179118580 +5057 337656474 +5058 1057193880 +5059 1666606837 +5060 689795075 +5061 1179644570 +5062 1360555014 +5063 687392273 +5064 870389879 +5065 32935550 +5066 1576286350 +5067 290109454 +5068 1145637963 +5069 1576477053 +5070 2085294879 +5071 1215172047 +5072 992364184 +5073 304131026 +5074 1851955914 +5075 1347119633 +5076 1478758719 +5077 454245753 +5078 2002583757 +5079 772773439 +5080 1731537241 +5081 1741469197 +5082 640656586 +5083 1379800348 +5084 1089621288 +5085 490159426 +5086 1408144393 +5087 1268739869 +5088 827815900 +5089 317854625 +5090 787863058 +5091 1517610975 +5092 1497499195 +5093 934425 +5094 57519601 +5095 220405427 +5096 33869975 +5097 1633805951 +5098 510514881 +5099 1179507938 +5100 1062799356 +5101 448326112 +5102 247196338 +5103 2055163540 +5104 752457138 +5105 2099152252 +5106 1254799525 +5107 83732210 +5108 405914358 +5109 1109899634 +5110 856505649 +5111 2137451599 +5112 703885184 +5113 1497162235 +5114 1369768300 +5115 1793506472 +5116 1987321662 +5117 630429045 +5118 914762693 +5119 667653914 +5120 948283670 +5121 1702625752 +5122 37781242 +5123 298299218 +5124 1703560177 +5125 95300843 +5126 518704645 +5127 1737430152 +5128 1729106794 +5129 1029219526 +5130 769454442 +5131 644422502 +5132 1477545638 +5133 1016650780 +5134 552102395 +5135 82519128 +5136 968319385 +5137 1806901920 +5138 166251338 +5139 1374233743 +5140 769317907 +5141 1022756988 +5142 1364201694 +5143 1473203091 +5144 372435575 +5145 586486346 +5146 1119225915 +5147 212273589 +5148 1216915391 +5149 2033988609 +5150 879927504 +5151 17715414 +5152 1589130713 +5153 917708746 +5154 316014632 +5155 1145207242 +5156 1013009589 +5157 834719277 +5158 735153746 +5159 594632735 +5160 1863938803 +5161 1504608188 +5162 1239055237 +5163 1194000793 +5164 373775321 +5165 1791157632 +5166 1276519921 +5167 1342094706 +5168 1450575905 +5169 1442771260 +5170 568844801 +5171 72410164 +5172 318044600 +5173 1933046495 +5174 1545613255 +5175 690480175 +5176 372049194 +5177 517355522 +5178 902753765 +5179 1588964585 +5180 403860483 +5181 1782681269 +5182 1606679999 +5183 1992991196 +5184 552906367 +5185 1922694631 +5186 990714790 +5187 1565915956 +5188 609930260 +5189 1725868536 +5190 13065043 +5191 326385415 +5192 1082993077 +5193 1252120280 +5194 1520386208 +5195 1456768398 +5196 895794265 +5197 649422482 +5198 651379456 +5199 198886522 +5200 2092193742 +5201 1220224257 +5202 271296686 +5203 262754694 +5204 1005787104 +5205 1816909941 +5206 953234869 +5207 1377836298 +5208 186781815 +5209 1855988634 +5210 819317236 +5211 590642299 +5212 1491186255 +5213 278513587 +5214 436149847 +5215 2044092622 +5216 53724571 +5217 1426864638 +5218 1462524930 +5219 663654831 +5220 1005249526 +5221 1475589973 +5222 990040247 +5223 2088242603 +5224 580226606 +5225 362942807 +5226 1397527353 +5227 1476020871 +5228 1012365289 +5229 2048906809 +5230 1674907393 +5231 957075383 +5232 1121647418 +5233 1946204079 +5234 1219830077 +5235 2127434523 +5236 1615630372 +5237 25581299 +5238 1357787173 +5239 1802412187 +5240 1881569933 +5241 29620761 +5242 245570838 +5243 1225272541 +5244 308134349 +5245 681720686 +5246 1121881515 +5247 361858920 +5248 2108585324 +5249 436922798 +5250 1025513751 +5251 966351202 +5252 1912512771 +5253 2015553998 +5254 907110158 +5255 345255729 +5256 231013158 +5257 157153863 +5258 1821276600 +5259 1243378447 +5260 58577025 +5261 1348700345 +5262 52970183 +5263 1180224443 +5264 1147420776 +5265 1272800260 +5266 1160175318 +5267 615567500 +5268 1298381559 +5269 370478844 +5270 270496040 +5271 1032467845 +5272 400099605 +5273 516066878 +5274 110256738 +5275 708233954 +5276 1197787564 +5277 1232138253 +5278 1070092874 +5279 1158889240 +5280 1669061051 +5281 2095606626 +5282 2125240443 +5283 1434090175 +5284 1963676976 +5285 884866953 +5286 1779345904 +5287 47206486 +5288 1042020816 +5289 1453138857 +5290 1290584934 +5291 1100597841 +5292 654355554 +5293 1343555117 +5294 133338637 +5295 1801776331 +5296 468871729 +5297 1293513955 +5298 269860183 +5299 1767253289 +5300 1663992799 +5301 540356223 +5302 652237486 +5303 2064092405 +5304 1056423102 +5305 762494224 +5306 624842711 +5307 106727018 +5308 1994632477 +5309 1694935586 +5310 1265616259 +5311 1516209881 +5312 1643058564 +5313 1243373054 +5314 802816408 +5315 1459251892 +5316 2128240007 +5317 434678664 +5318 1506458379 +5319 1022777175 +5320 1887817521 +5321 649559665 +5322 2123375017 +5323 394689428 +5324 1993114782 +5325 109230006 +5326 48982111 +5327 314502863 +5328 1402743961 +5329 318842294 +5330 2081756152 +5331 919253113 +5332 859198518 +5333 586509990 +5334 835861870 +5335 1915621620 +5336 1349004214 +5337 1460704581 +5338 2022348638 +5339 1196153044 +5340 1008156519 +5341 1140481249 +5342 564879277 +5343 503731435 +5344 236370655 +5345 1367695685 +5346 1962983328 +5347 217127014 +5348 1802374349 +5349 1321958059 +5350 1239904190 +5351 1542708223 +5352 1971517724 +5353 1215795559 +5354 1937397651 +5355 1817148858 +5356 1325025565 +5357 1986379762 +5358 2131651721 +5359 580285878 +5360 157738408 +5361 2065924226 +5362 1499538991 +5363 1016936926 +5364 504950568 +5365 187917213 +5366 785074898 +5367 1853954783 +5368 1648621795 +5369 659939889 +5370 902624179 +5371 509294666 +5372 1800421138 +5373 1467503456 +5374 1013026102 +5375 2036791794 +5376 687715493 +5377 828525782 +5378 106435160 +5379 342606194 +5380 3000193 +5381 1346339350 +5382 1885314417 +5383 1974517917 +5384 414651261 +5385 1675228420 +5386 1644183127 +5387 1739676826 +5388 1514124534 +5389 1628351200 +5390 172479057 +5391 1671862943 +5392 1546791778 +5393 1672018048 +5394 541316221 +5395 2051742347 +5396 1859935262 +5397 1326391120 +5398 1758213482 +5399 1361073409 +5400 1986331009 +5401 513354013 +5402 1870368075 +5403 1639268499 +5404 1980857469 +5405 735910529 +5406 1528576645 +5407 521089314 +5408 1564436311 +5409 1635011806 +5410 863695508 +5411 1567436504 +5412 833867508 +5413 601526278 +5414 1394470773 +5415 1248518770 +5416 129271050 +5417 891170252 +5418 840711948 +5419 1643395585 +5420 372037805 +5421 1013191005 +5422 1167774880 +5423 1918829583 +5424 537725406 +5425 1709091101 +5426 1823088282 +5427 250177020 +5428 887998573 +5429 1433818116 +5430 1611250429 +5431 726845934 +5432 1947172129 +5433 1334134856 +5434 218630786 +5435 1780545950 +5436 2070045386 +5437 1747207431 +5438 154151616 +5439 1486998049 +5440 1234735589 +5441 1017847125 +5442 906950906 +5443 2068603098 +5444 1619373403 +5445 153938031 +5446 1169638220 +5447 1748644453 +5448 1045108284 +5449 2010350168 +5450 1244556390 +5451 1417146089 +5452 876057526 +5453 264847622 +5454 1188492024 +5455 1413782932 +5456 1973938724 +5457 864096659 +5458 1663959952 +5459 714453649 +5460 150431127 +5461 1127726733 +5462 1441299584 +5463 2097603257 +5464 314377941 +5465 1659930370 +5466 1730665559 +5467 236939679 +5468 1259654153 +5469 1884817176 +5470 1723937729 +5471 346906095 +5472 755180653 +5473 483404987 +5474 268025545 +5475 227070408 +5476 637343018 +5477 1437663765 +5478 1975714861 +5479 1682451302 +5480 1300530285 +5481 1072787604 +5482 952113743 +5483 29104163 +5484 1337635226 +5485 2140605768 +5486 1442887095 +5487 1164090302 +5488 857218779 +5489 959363399 +5490 1878543952 +5491 1007649906 +5492 2087090132 +5493 1172359888 +5494 957769515 +5495 253984426 +5496 684806610 +5497 540951427 +5498 490924105 +5499 1944460763 +5500 278284955 +5501 67378186 +5502 143883210 +5503 1033465608 +5504 550783173 +5505 411908755 +5506 1260536016 +5507 1188126192 +5508 1849572520 +5509 1088767229 +5510 723093846 +5511 1002619158 +5512 14071185 +5513 1675207590 +5514 1031723321 +5515 1351706412 +5516 1668329710 +5517 327126769 +5518 368313066 +5519 378064841 +5520 1286490168 +5521 99373370 +5522 1385714747 +5523 1226096653 +5524 1271733258 +5525 196000615 +5526 1480081079 +5527 1956539868 +5528 736952042 +5529 1971005184 +5530 1753516984 +5531 1015236997 +5532 2038383371 +5533 1897400194 +5534 2048702605 +5535 441682896 +5536 161825302 +5537 1161754973 +5538 1629809088 +5539 2011397822 +5540 103038554 +5541 205419287 +5542 866533332 +5543 117109740 +5544 1880626877 +5545 1898256654 +5546 1468816152 +5547 1401472939 +5548 77899775 +5549 1837129218 +5550 1779537780 +5551 1364389943 +5552 1936502589 +5553 1017768879 +5554 443002948 +5555 1060752199 +5556 1213769494 +5557 1923084027 +5558 869808420 +5559 1950721536 +5560 1746605564 +5561 475841756 +5562 818474885 +5563 1637505287 +5564 225758302 +5565 719693842 +5566 2079188183 +5567 387583604 +5568 1881448815 +5569 1561513624 +5570 251497779 +5571 1984487370 +5572 1766932911 +5573 1118031111 +5574 2101597110 +5575 1500076140 +5576 868804117 +5577 1422929614 +5578 754065431 +5579 946703892 +5580 1112575184 +5581 386119563 +5582 163610188 +5583 901594125 +5584 1403888442 +5585 606613136 +5586 1962346325 +5587 470174289 +5588 382213516 +5589 684671097 +5590 273412177 +5591 2128819080 +5592 1160512853 +5593 1091887063 +5594 1618840719 +5595 1386271155 +5596 1811580905 +5597 1550545254 +5598 1773854760 +5599 1545546073 +5600 964575230 +5601 2025352539 +5602 1382549795 +5603 584024493 +5604 995900002 +5605 1336663257 +5606 2084100633 +5607 1864704120 +5608 612109223 +5609 690682416 +5610 663924364 +5611 1724684407 +5612 1076801979 +5613 827534552 +5614 478794885 +5615 333206774 +5616 1434147689 +5617 293657562 +5618 803381063 +5619 1816361205 +5620 978328659 +5621 1076793240 +5622 1797696637 +5623 2138841512 +5624 21196655 +5625 1269053708 +5626 1377629019 +5627 1832777561 +5628 672115314 +5629 1004000131 +5630 1230839986 +5631 1636690545 +5632 881869022 +5633 465906133 +5634 73231390 +5635 1877769025 +5636 1802569390 +5637 9848376 +5638 1594989497 +5639 267194965 +5640 700530792 +5641 111430213 +5642 1991879372 +5643 1777332772 +5644 938964766 +5645 323190609 +5646 2110539546 +5647 225628807 +5648 616848171 +5649 766436961 +5650 2041990012 +5651 1595176830 +5652 1843230201 +5653 1692203001 +5654 1586534694 +5655 1864426857 +5656 813773061 +5657 816680066 +5658 1549720770 +5659 1485888375 +5660 1820680197 +5661 633077108 +5662 975095272 +5663 555065572 +5664 1098983241 +5665 1048326663 +5666 285350949 +5667 754068983 +5668 1058175039 +5669 1880340446 +5670 1021263948 +5671 1758705831 +5672 1991770659 +5673 865659672 +5674 1388554955 +5675 783251777 +5676 1188850282 +5677 1351610853 +5678 1008880584 +5679 1805698453 +5680 2118047814 +5681 903386948 +5682 1253391636 +5683 1813794368 +5684 448106301 +5685 692442682 +5686 1530737577 +5687 1261879362 +5688 1509122748 +5689 932974699 +5690 600284090 +5691 1182319298 +5692 1566051807 +5693 1575379362 +5694 1737384870 +5695 517551400 +5696 476222377 +5697 2022735819 +5698 1271620383 +5699 1534397416 +5700 1755592617 +5701 145400683 +5702 1145619600 +5703 1599879628 +5704 1011060355 +5705 386690907 +5706 235647758 +5707 52426989 +5708 1738301761 +5709 1244528342 +5710 1858125443 +5711 1708865927 +5712 431643 +5713 964033431 +5714 1375176647 +5715 448537944 +5716 1656476113 +5717 758430576 +5718 1710417307 +5719 1018115214 +5720 1691405275 +5721 163217749 +5722 52950864 +5723 1109973434 +5724 1738597111 +5725 1790335734 +5726 1627524834 +5727 67335841 +5728 1665587905 +5729 751661569 +5730 1601733257 +5731 1273696874 +5732 897062252 +5733 599869209 +5734 726092854 +5735 1908122608 +5736 986560117 +5737 961740612 +5738 1960549597 +5739 577378230 +5740 58785307 +5741 1671191392 +5742 138760509 +5743 59216950 +5744 487741175 +5745 1513937157 +5746 507754894 +5747 2144217289 +5748 124884085 +5749 70688553 +5750 1014848855 +5751 1816289361 +5752 233906302 +5753 1067799719 +5754 778779147 +5755 1972503414 +5756 710651805 +5757 258820334 +5758 2039839255 +5759 228756062 +5760 1010481903 +5761 1494088864 +5762 1502452936 +5763 1907544156 +5764 2093958074 +5765 81062142 +5766 1668183116 +5767 933034543 +5768 1042802755 +5769 1481249065 +5770 1510412773 +5771 1101588062 +5772 1004956810 +5773 1649173282 +5774 1160805012 +5775 1492697985 +5776 1015626791 +5777 1668559906 +5778 1489431626 +5779 1140510877 +5780 1739248460 +5781 356796833 +5782 809316590 +5783 1973154762 +5784 1424596552 +5785 1588095737 +5786 1798174528 +5787 2135248357 +5788 1846916071 +5789 1690530135 +5790 216520771 +5791 709914327 +5792 1037135352 +5793 1718973707 +5794 469974835 +5795 983609778 +5796 1800035850 +5797 2138157951 +5798 1916644321 +5799 695354957 +5800 1471923368 +5801 1279573446 +5802 1796943019 +5803 329396530 +5804 781263080 +5805 810264383 +5806 1822094516 +5807 1796889872 +5808 331340641 +5809 1164042494 +5810 789917101 +5811 2070589101 +5812 1520839328 +5813 1599233691 +5814 1896260216 +5815 797952232 +5816 1039845780 +5817 1546951096 +5818 785716942 +5819 739278204 +5820 1089997584 +5821 1002237713 +5822 1449192531 +5823 2127132936 +5824 573727773 +5825 1919167366 +5826 963259066 +5827 226279975 +5828 1909841669 +5829 732419739 +5830 921634932 +5831 1234281389 +5832 2011993185 +5833 571094303 +5834 1563677920 +5835 645772617 +5836 1381358686 +5837 1238288788 +5838 295178841 +5839 1712699327 +5840 254847634 +5841 1085095942 +5842 1635804781 +5843 1775686962 +5844 536845985 +5845 1384581349 +5846 426155547 +5847 1576691766 +5848 784048797 +5849 1211872489 +5850 168486322 +5851 1874046381 +5852 66626554 +5853 1617678853 +5854 1853695669 +5855 640354327 +5856 1389362571 +5857 669471087 +5858 866634302 +5859 1151720592 +5860 1401890826 +5861 1788269234 +5862 238518333 +5863 1266400363 +5864 211879889 +5865 1802196253 +5866 1912172981 +5867 1593238575 +5868 893001393 +5869 59868174 +5870 1158454255 +5871 1147849028 +5872 1144964117 +5873 646775388 +5874 776052342 +5875 1681810102 +5876 2031356737 +5877 1202207889 +5878 1111018220 +5879 667921886 +5880 266596730 +5881 1279504542 +5882 394484620 +5883 333223285 +5884 749699747 +5885 100696641 +5886 973577612 +5887 2139062318 +5888 770167729 +5889 1840211915 +5890 1143299262 +5891 24574907 +5892 1480997501 +5893 1381817596 +5894 1290975271 +5895 1692877391 +5896 1036530201 +5897 1055664604 +5898 1138632318 +5899 1929531595 +5900 1115532778 +5901 149602925 +5902 929896975 +5903 113013247 +5904 796378313 +5905 1705949317 +5906 1794823350 +5907 680251402 +5908 760673559 +5909 758357922 +5910 1348173289 +5911 1027270289 +5912 2037862465 +5913 1742657909 +5914 1360493574 +5915 640078564 +5916 1843354550 +5917 186587539 +5918 631657235 +5919 466038631 +5920 2026799454 +5921 1774956497 +5922 490613539 +5923 1360313307 +5924 1009290445 +5925 1781588810 +5926 905707050 +5927 2045820647 +5928 689769766 +5929 2044339369 +5930 1827868594 +5931 1805302544 +5932 46458646 +5933 610281921 +5934 1918315792 +5935 842836960 +5936 168747590 +5937 1565655494 +5938 1523088362 +5939 929421149 +5940 176529768 +5941 723778003 +5942 1956691439 +5943 66908585 +5944 318952264 +5945 1169701365 +5946 706987150 +5947 14823167 +5948 1356288904 +5949 1338644385 +5950 480861798 +5951 1235604710 +5952 966117234 +5953 971475337 +5954 448434370 +5955 1975407680 +5956 605580499 +5957 1354141420 +5958 1873744679 +5959 1295350265 +5960 1250997141 +5961 1554129625 +5962 953169162 +5963 1297455788 +5964 16927898 +5965 724001306 +5966 2140292748 +5967 185675488 +5968 142173152 +5969 1515897462 +5970 1115096638 +5971 318702920 +5972 92191818 +5973 924304429 +5974 385611506 +5975 411144082 +5976 2094005794 +5977 1092598656 +5978 425967249 +5979 1302811051 +5980 283759393 +5981 906829048 +5982 390932113 +5983 1249876627 +5984 1878304385 +5985 839366483 +5986 1077800659 +5987 336401237 +5988 46024256 +5989 804061690 +5990 1631751502 +5991 1297021397 +5992 210707667 +5993 437437016 +5994 446993537 +5995 227635565 +5996 1161438322 +5997 439802637 +5998 413311054 +5999 1303611474 +6000 1955700100 +6001 1528407692 +6002 1622314395 +6003 2047891918 +6004 305228473 +6005 2007925901 +6006 311552352 +6007 251750619 +6008 953040909 +6009 737519602 +6010 1554561670 +6011 1236800302 +6012 1644348650 +6013 1945493784 +6014 339193281 +6015 1375169387 +6016 637376619 +6017 1416993941 +6018 1711570624 +6019 683400875 +6020 73571983 +6021 1195838479 +6022 1980422273 +6023 284279651 +6024 1633275495 +6025 279932162 +6026 511915216 +6027 647230170 +6028 719734800 +6029 925226270 +6030 1950841644 +6031 527951252 +6032 306150314 +6033 1425672391 +6034 428359522 +6035 611378787 +6036 1286114644 +6037 739911874 +6038 863129407 +6039 91671905 +6040 1477431476 +6041 270207429 +6042 1328472207 +6043 974296478 +6044 68217565 +6045 1667665489 +6046 201982218 +6047 705594185 +6048 937175782 +6049 1913552842 +6050 1388995060 +6051 1010747765 +6052 961907673 +6053 1221933685 +6054 1295027416 +6055 447699521 +6056 1501865848 +6057 1806942633 +6058 1094929691 +6059 74117000 +6060 584685255 +6061 898287687 +6062 602068252 +6063 890835570 +6064 176476431 +6065 1030427774 +6066 1502214357 +6067 1462591075 +6068 1770339648 +6069 217860116 +6070 1554262981 +6071 1100287477 +6072 488067546 +6073 735251540 +6074 2074583955 +6075 556285111 +6076 255433381 +6077 129082525 +6078 1261879296 +6079 1192609163 +6080 2042635368 +6081 503390709 +6082 55873281 +6083 857059393 +6084 1725324394 +6085 1350900697 +6086 1304758914 +6087 1079706594 +6088 1010359682 +6089 252204957 +6090 1153823594 +6091 1595044938 +6092 1150492645 +6093 1755891846 +6094 338396860 +6095 1326969076 +6096 638835972 +6097 1840611217 +6098 642076503 +6099 261691973 +6100 2058471334 +6101 48855836 +6102 1361979450 +6103 399055232 +6104 784107377 +6105 1289079757 +6106 955340343 +6107 1039540758 +6108 1418162283 +6109 69735992 +6110 84666274 +6111 1313314003 +6112 573126701 +6113 140539555 +6114 22889748 +6115 150967447 +6116 1491440252 +6117 1327648663 +6118 1230674042 +6119 354316287 +6120 1579853620 +6121 237013988 +6122 1949361225 +6123 582862617 +6124 1992905835 +6125 140274437 +6126 1909831693 +6127 484258159 +6128 1980885654 +6129 404424549 +6130 745950132 +6131 1891873340 +6132 453280385 +6133 2107929582 +6134 143444924 +6135 1237387762 +6136 1249525692 +6137 1098785268 +6138 129444873 +6139 520204327 +6140 1168521260 +6141 214111147 +6142 1833518330 +6143 1741647961 +6144 354650702 +6145 1856408078 +6146 1892615408 +6147 1846090954 +6148 1036573093 +6149 975805802 +6150 52923593 +6151 468943066 +6152 1212819791 +6153 2002284818 +6154 1051805683 +6155 1058241978 +6156 2142559255 +6157 814153729 +6158 1542500137 +6159 1975961262 +6160 1218578278 +6161 140966622 +6162 1720350954 +6163 1671858663 +6164 101412556 +6165 1863795879 +6166 761762778 +6167 1350938248 +6168 815097499 +6169 891207651 +6170 1871142575 +6171 1983618759 +6172 1105318798 +6173 1557177257 +6174 1577783072 +6175 1459969500 +6176 1266101688 +6177 1322914832 +6178 1158576806 +6179 155191133 +6180 151236987 +6181 1211500400 +6182 624134199 +6183 1364056778 +6184 1066301570 +6185 1675939883 +6186 274815108 +6187 1061377178 +6188 342609964 +6189 1817315245 +6190 889854792 +6191 1561188242 +6192 1958281867 +6193 462722098 +6194 1085563257 +6195 2059694424 +6196 179034329 +6197 1847326035 +6198 1263149024 +6199 994131828 +6200 591050038 +6201 986807952 +6202 830266939 +6203 1696368836 +6204 396501561 +6205 260566363 +6206 1008854688 +6207 1662603249 +6208 1583481196 +6209 19947847 +6210 1817794383 +6211 1734718183 +6212 1231448247 +6213 294444934 +6214 951291313 +6215 150266169 +6216 1970384817 +6217 1226106421 +6218 1211643347 +6219 165511133 +6220 895938018 +6221 2101498139 +6222 1726699375 +6223 706736238 +6224 416736590 +6225 664778985 +6226 618947014 +6227 595770919 +6228 364621372 +6229 1882096038 +6230 1589902748 +6231 955671411 +6232 721420342 +6233 272686039 +6234 504556599 +6235 1117921904 +6236 533252403 +6237 1513411288 +6238 633041505 +6239 2116733599 +6240 1533359135 +6241 303352240 +6242 1703968134 +6243 617323734 +6244 597797175 +6245 507775799 +6246 767589903 +6247 420698344 +6248 1733882220 +6249 1979233251 +6250 586209478 +6251 482336590 +6252 1933247742 +6253 165425205 +6254 1189072828 +6255 202500684 +6256 830204190 +6257 1808019842 +6258 798271604 +6259 1194825563 +6260 1542632233 +6261 240690704 +6262 3013326 +6263 116568927 +6264 513376743 +6265 507569925 +6266 1234490831 +6267 1046629146 +6268 2020981213 +6269 1867532337 +6270 1015879097 +6271 1406856700 +6272 23400929 +6273 572363583 +6274 2024180434 +6275 621198104 +6276 1080139382 +6277 644286690 +6278 1041896449 +6279 666537954 +6280 476036293 +6281 1628105927 +6282 1148874545 +6283 261800387 +6284 1793531132 +6285 190463725 +6286 464301072 +6287 476251675 +6288 1998483568 +6289 1262572676 +6290 1671077238 +6291 1393632153 +6292 1503263380 +6293 1674090564 +6294 1510201080 +6295 2016640123 +6296 34176841 +6297 597208264 +6298 915785622 +6299 2055158055 +6300 317256953 +6301 1931664719 +6302 1314531107 +6303 340657882 +6304 356544655 +6305 1191227894 +6306 961855987 +6307 1436684037 +6308 1835514584 +6309 2003752436 +6310 2103221992 +6311 164067229 +6312 1484374715 +6313 1104612889 +6314 425867616 +6315 1130422199 +6316 1295076614 +6317 890168688 +6318 1606673874 +6319 1146076534 +6320 5257716 +6321 1130267464 +6322 392225039 +6323 1508521096 +6324 656874380 +6325 1902426120 +6326 1377677572 +6327 691051222 +6328 352150736 +6329 145979546 +6330 598725629 +6331 669407689 +6332 2077644265 +6333 1913256736 +6334 1010065571 +6335 286705272 +6336 957000982 +6337 1971921558 +6338 1723389310 +6339 645031918 +6340 1828190346 +6341 1679127654 +6342 809099147 +6343 1165081413 +6344 636256895 +6345 1234966764 +6346 148019965 +6347 1931333509 +6348 2125135452 +6349 1754693839 +6350 929926396 +6351 2130393169 +6352 737477656 +6353 1322151435 +6354 1491430617 +6355 1394352036 +6356 1077093907 +6357 721624541 +6358 2085403258 +6359 1429244643 +6360 867604087 +6361 536645239 +6362 2098652332 +6363 797764705 +6364 302418328 +6365 961234256 +6366 1084469977 +6367 1259419310 +6368 785672166 +6369 660375639 +6370 1904451229 +6371 466378865 +6372 192019645 +6373 566066728 +6374 1631460278 +6375 828276540 +6376 1801033492 +6377 1779480243 +6378 612126402 +6379 1778685297 +6380 1386690435 +6381 1542052798 +6382 1761594818 +6383 2124168091 +6384 716720585 +6385 1105541787 +6386 1371036479 +6387 1793814493 +6388 1827166329 +6389 1308956090 +6390 1075575488 +6391 547286768 +6392 1845601329 +6393 1026744173 +6394 1345051473 +6395 536009 +6396 1987978429 +6397 282037803 +6398 1259955320 +6399 626166947 +6400 942413442 +6401 1016922901 +6402 1092545812 +6403 1134433088 +6404 1582989629 +6405 576522443 +6406 1962709628 +6407 1236539474 +6408 208519038 +6409 427352382 +6410 867741123 +6411 1595209473 +6412 1969405180 +6413 481852293 +6414 1571893916 +6415 538642118 +6416 1587394080 +6417 795446748 +6418 184972963 +6419 1267076761 +6420 2104402838 +6421 1260548451 +6422 1814363530 +6423 1802520519 +6424 139808976 +6425 1011931355 +6426 1803056529 +6427 2127787405 +6428 1293969158 +6429 915528201 +6430 606470705 +6431 88898953 +6432 1932451102 +6433 1699016517 +6434 1223332041 +6435 1367957083 +6436 128055312 +6437 1038558021 +6438 457012909 +6439 336574351 +6440 1465910404 +6441 1324754032 +6442 1931783824 +6443 1287831936 +6444 1806606325 +6445 1356194093 +6446 1826474054 +6447 1246516758 +6448 4157193 +6449 2011447017 +6450 366109871 +6451 2108560031 +6452 1124511821 +6453 32989753 +6454 1763596902 +6455 1264320797 +6456 1044921109 +6457 1419169783 +6458 1244624555 +6459 191406619 +6460 187214336 +6461 1851095260 +6462 280305572 +6463 2119665438 +6464 1402628129 +6465 1503637613 +6466 1340138874 +6467 1530683442 +6468 394711987 +6469 1797151783 +6470 1867257793 +6471 1860622391 +6472 974422168 +6473 1651557969 +6474 1000970679 +6475 633544845 +6476 860268414 +6477 679961086 +6478 1880061603 +6479 864425607 +6480 543924455 +6481 98687827 +6482 825501990 +6483 1668436276 +6484 131677580 +6485 441615245 +6486 785273426 +6487 1176598689 +6488 1860785028 +6489 2029897981 +6490 1368005309 +6491 2047999365 +6492 1733509593 +6493 1648310881 +6494 2020181155 +6495 988654074 +6496 1004464847 +6497 1212836381 +6498 371853868 +6499 1399176834 +6500 862504517 +6501 91628013 +6502 1112315577 +6503 1836926685 +6504 1743185983 +6505 2113286256 +6506 322987882 +6507 455970749 +6508 645763694 +6509 55565838 +6510 1320396357 +6511 1189688150 +6512 154253665 +6513 2145898347 +6514 710640778 +6515 285931245 +6516 440029944 +6517 1495914204 +6518 1462529935 +6519 153331325 +6520 1378328537 +6521 683051596 +6522 53847042 +6523 964354482 +6524 183878829 +6525 2074028197 +6526 1953008557 +6527 1188343676 +6528 1139380931 +6529 177378777 +6530 440036862 +6531 2001885448 +6532 269006791 +6533 1552352439 +6534 1691328485 +6535 2012192774 +6536 1518155048 +6537 2014316367 +6538 320679875 +6539 16435094 +6540 2069882205 +6541 1641076232 +6542 1206123244 +6543 76652222 +6544 1639490932 +6545 1916764023 +6546 362583468 +6547 2079520876 +6548 1265194579 +6549 1825113403 +6550 85368553 +6551 496039469 +6552 360681351 +6553 139215595 +6554 1460393951 +6555 544560180 +6556 65760145 +6557 1265918860 +6558 1732903857 +6559 1205141076 +6560 1443297638 +6561 25457071 +6562 1059542876 +6563 1712304429 +6564 1577809511 +6565 603387713 +6566 1577013555 +6567 948480911 +6568 470220432 +6569 1897693430 +6570 964916005 +6571 392618990 +6572 1391286015 +6573 23555602 +6574 469271212 +6575 883293299 +6576 1940319625 +6577 831854680 +6578 815330527 +6579 1058030556 +6580 509484435 +6581 900699081 +6582 1554070025 +6583 870165786 +6584 1039914676 +6585 866980329 +6586 1414725967 +6587 1105674821 +6588 2132899189 +6589 1000146176 +6590 163332249 +6591 1428713179 +6592 1025603247 +6593 1222875125 +6594 993533960 +6595 455929110 +6596 1826262838 +6597 423063867 +6598 1404410021 +6599 148999623 +6600 173273650 +6601 221842379 +6602 541618613 +6603 1564559665 +6604 245397981 +6605 1010889825 +6606 300369316 +6607 38233958 +6608 1842744506 +6609 1115699843 +6610 1096264514 +6611 204745293 +6612 2016398924 +6613 502850892 +6614 1074911080 +6615 908829953 +6616 1369831221 +6617 342153399 +6618 2014504774 +6619 1355246762 +6620 1342299575 +6621 30353376 +6622 636476294 +6623 220419174 +6624 1253228501 +6625 1630010254 +6626 676348285 +6627 932007692 +6628 2053074122 +6629 2080758306 +6630 1081007315 +6631 78864124 +6632 155117037 +6633 1622625928 +6634 1643423789 +6635 400515018 +6636 486032105 +6637 1943793105 +6638 438748976 +6639 181292963 +6640 912009300 +6641 1535013491 +6642 386038257 +6643 780924577 +6644 2037864383 +6645 1460949337 +6646 1689754530 +6647 1260211956 +6648 1803102736 +6649 1556775656 +6650 467975070 +6651 997918663 +6652 1587129032 +6653 1104451364 +6654 1218337837 +6655 692873886 +6656 586977971 +6657 1894686122 +6658 1624881578 +6659 492568445 +6660 1827960781 +6661 558405245 +6662 571432569 +6663 1983077818 +6664 33547525 +6665 67372710 +6666 236109189 +6667 519579630 +6668 2011165815 +6669 674858165 +6670 700872594 +6671 775691467 +6672 62388008 +6673 1086910851 +6674 1556616044 +6675 2100252391 +6676 400376540 +6677 1098886926 +6678 1212980699 +6679 55995628 +6680 508178935 +6681 1680955770 +6682 1053914291 +6683 2095307967 +6684 637923486 +6685 124768480 +6686 640698205 +6687 1224901457 +6688 2019454603 +6689 118096135 +6690 1717469902 +6691 1699931736 +6692 676501380 +6693 141418823 +6694 1535525906 +6695 710048905 +6696 208791533 +6697 1771635095 +6698 1229628536 +6699 72473700 +6700 299009613 +6701 1930501130 +6702 848165168 +6703 361397621 +6704 869928333 +6705 257297564 +6706 314166365 +6707 1270304873 +6708 1356184491 +6709 1527147064 +6710 1326300501 +6711 1864363426 +6712 1060619186 +6713 232731144 +6714 1812187745 +6715 1698542673 +6716 357499624 +6717 305402303 +6718 775960482 +6719 229470579 +6720 423498438 +6721 345946737 +6722 1929402315 +6723 1099999819 +6724 487365560 +6725 1317444574 +6726 1810048724 +6727 696157094 +6728 941596021 +6729 892193612 +6730 768630794 +6731 1240605634 +6732 675211094 +6733 1616795962 +6734 1602003256 +6735 1545139427 +6736 1874093527 +6737 1916169621 +6738 667960652 +6739 1082794370 +6740 1295833037 +6741 1994261153 +6742 799674148 +6743 208968576 +6744 79508649 +6745 464378245 +6746 1907511249 +6747 437008274 +6748 769780548 +6749 535988083 +6750 666478853 +6751 1193278987 +6752 881934820 +6753 448397521 +6754 145795158 +6755 1369300381 +6756 1765842095 +6757 1955843882 +6758 2065457475 +6759 559954468 +6760 700553847 +6761 686604621 +6762 1800560103 +6763 1375764941 +6764 155916936 +6765 1255079711 +6766 773420721 +6767 2030010463 +6768 1023765684 +6769 1441381373 +6770 965321185 +6771 172115073 +6772 1288158879 +6773 1764995333 +6774 381083649 +6775 1367667528 +6776 81889930 +6777 141111250 +6778 1804675802 +6779 851670479 +6780 677099334 +6781 323671008 +6782 2044949466 +6783 1559034154 +6784 772068529 +6785 43260976 +6786 780850887 +6787 390426976 +6788 1999104858 +6789 698824714 +6790 950381444 +6791 552175057 +6792 1385429336 +6793 603457899 +6794 1927939999 +6795 1541346272 +6796 1858537610 +6797 553877072 +6798 1423873087 +6799 734819646 +6800 1995258445 +6801 241710624 +6802 906934720 +6803 1135933676 +6804 2006705957 +6805 1288018369 +6806 356117557 +6807 2088595887 +6808 1429129620 +6809 13309711 +6810 792782718 +6811 2106228954 +6812 336980719 +6813 690248536 +6814 1517779460 +6815 1109049248 +6816 733509512 +6817 151146700 +6818 1499476224 +6819 585130723 +6820 849971414 +6821 302374021 +6822 1137305780 +6823 87917102 +6824 905831920 +6825 917762131 +6826 1629263374 +6827 616885883 +6828 1471639203 +6829 905652813 +6830 1351705529 +6831 1319414001 +6832 1147363437 +6833 111156601 +6834 307864029 +6835 1006585746 +6836 1399174971 +6837 663981586 +6838 947697986 +6839 680820943 +6840 677291298 +6841 1740480704 +6842 639566249 +6843 1014272017 +6844 283245593 +6845 9862061 +6846 2123321266 +6847 1016755105 +6848 161008761 +6849 1475313842 +6850 1601885828 +6851 1010980176 +6852 1777687863 +6853 591707961 +6854 1098897278 +6855 536036136 +6856 1509470092 +6857 580677005 +6858 1152922019 +6859 833625648 +6860 1486329818 +6861 357143900 +6862 5556001 +6863 486209608 +6864 468300502 +6865 313420030 +6866 1492795354 +6867 1867475473 +6868 977401617 +6869 293009692 +6870 400812768 +6871 1654692915 +6872 2033490397 +6873 1040379017 +6874 521481284 +6875 169252342 +6876 1050241078 +6877 497318902 +6878 1186007447 +6879 1211249840 +6880 1972632745 +6881 640409628 +6882 74746368 +6883 1602836960 +6884 1232117589 +6885 1173643646 +6886 2138873096 +6887 594104033 +6888 1754320651 +6889 1144311467 +6890 1427729681 +6891 1093166822 +6892 1501455368 +6893 1433285682 +6894 1579376430 +6895 1969755870 +6896 1746705713 +6897 924688136 +6898 1689747695 +6899 576623682 +6900 1217697829 +6901 2090560463 +6902 83832949 +6903 1103704578 +6904 983455832 +6905 605314233 +6906 1272956920 +6907 2033696910 +6908 1102633136 +6909 311480719 +6910 1097463102 +6911 927782233 +6912 951890347 +6913 1172209470 +6914 383135545 +6915 36524288 +6916 198369469 +6917 374524994 +6918 630628322 +6919 1952690120 +6920 1518836461 +6921 2058358003 +6922 898373294 +6923 872808181 +6924 1344160038 +6925 330266076 +6926 695080403 +6927 943382103 +6928 1254954213 +6929 237344450 +6930 1520005785 +6931 325168394 +6932 180421265 +6933 1603838734 +6934 1428872972 +6935 1163877097 +6936 61669319 +6937 554346244 +6938 1050090360 +6939 1164302455 +6940 865826963 +6941 69814 +6942 2092084688 +6943 1817717311 +6944 1172279285 +6945 327736586 +6946 1854241599 +6947 1370648754 +6948 702261580 +6949 337386273 +6950 1175855226 +6951 73614393 +6952 248260629 +6953 2074228521 +6954 946422575 +6955 1592420667 +6956 257010949 +6957 1641502978 +6958 388319122 +6959 1511965162 +6960 1878847429 +6961 1908324907 +6962 1837133556 +6963 2059268694 +6964 1364679993 +6965 1118522880 +6966 1075662144 +6967 1426349312 +6968 1672869124 +6969 2125752504 +6970 443168120 +6971 391212440 +6972 2125822318 +6973 387769160 +6974 61446103 +6975 1150617955 +6976 715505746 +6977 1915687702 +6978 373783061 +6979 1417767326 +6980 105590328 +6981 1549638288 +6982 1491381720 +6983 353850957 +6984 1476383161 +6985 290320647 +6986 1946271624 +6987 1733394110 +6988 1931823625 +6989 187107098 +6990 1097875625 +6991 1663187406 +6992 2095432005 +6993 787525533 +6994 1574972453 +6995 1312628350 +6996 1906048414 +6997 503150949 +6998 591494014 +6999 1431433890 +7000 481419805 +7001 1034662134 +7002 1822646330 +7003 459758475 +7004 1422431295 +7005 1884092433 +7006 1610376431 +7007 2137937041 +7008 1652296488 +7009 1984159492 +7010 1408220720 +7011 1757886816 +7012 1386314132 +7013 752118792 +7014 2111737773 +7015 715213645 +7016 1042439439 +7017 1910525749 +7018 301124108 +7019 826779416 +7020 2097632847 +7021 1398999733 +7022 342483175 +7023 2045581204 +7024 39041618 +7025 1917455628 +7026 1210725906 +7027 1945090032 +7028 273122929 +7029 1802219920 +7030 1229040275 +7031 754542734 +7032 689398407 +7033 904202957 +7034 1214301209 +7035 2111829702 +7036 640811743 +7037 677193992 +7038 2102283095 +7039 145624583 +7040 513869837 +7041 1363020167 +7042 1903511399 +7043 1900183969 +7044 2115138959 +7045 1867765524 +7046 467913967 +7047 1010094750 +7048 1630807625 +7049 769038075 +7050 1836874167 +7051 1580956824 +7052 20554160 +7053 31873694 +7054 1479054380 +7055 59595778 +7056 1949329322 +7057 542296638 +7058 2004685811 +7059 74968603 +7060 197032910 +7061 1086242438 +7062 829511337 +7063 886431317 +7064 1990445395 +7065 2043812546 +7066 850777371 +7067 483773490 +7068 573522891 +7069 805576819 +7070 629398073 +7071 1087392728 +7072 21113338 +7073 385425824 +7074 840093049 +7075 2136252298 +7076 105707700 +7077 1308007016 +7078 998863400 +7079 1736515325 +7080 2077045091 +7081 688253919 +7082 1169988501 +7083 2097599251 +7084 720127613 +7085 501559233 +7086 9711382 +7087 521973287 +7088 1043855871 +7089 2014397193 +7090 596941890 +7091 1240888782 +7092 953155983 +7093 1426453227 +7094 2127320099 +7095 796117730 +7096 1322782126 +7097 830613823 +7098 1279891221 +7099 1896305017 +7100 1636190642 +7101 1909289294 +7102 836214097 +7103 1657303980 +7104 147231471 +7105 1676307146 +7106 1646072630 +7107 252939171 +7108 836830515 +7109 497452383 +7110 1989454497 +7111 766391958 +7112 1185706302 +7113 1011959350 +7114 716507562 +7115 1905833916 +7116 1513518584 +7117 726218944 +7118 280323555 +7119 409890807 +7120 593132489 +7121 877265446 +7122 1650779589 +7123 1546288472 +7124 156235025 +7125 1630616041 +7126 194922554 +7127 1479017151 +7128 313746216 +7129 1474813775 +7130 1227838520 +7131 1949936858 +7132 1236619422 +7133 2064052617 +7134 1459757190 +7135 1383850893 +7136 1592876116 +7137 958346173 +7138 1636790064 +7139 282222983 +7140 1455798556 +7141 1478760913 +7142 1048614941 +7143 494021210 +7144 343236616 +7145 1765122503 +7146 252371478 +7147 1856755200 +7148 343857799 +7149 532695034 +7150 119162359 +7151 936990288 +7152 1409960480 +7153 1769941949 +7154 335795112 +7155 1566195505 +7156 1253074342 +7157 530717667 +7158 897729009 +7159 1566820558 +7160 2005531442 +7161 2125567529 +7162 1369273768 +7163 1094667216 +7164 2042136499 +7165 681547310 +7166 331034461 +7167 1487528967 +7168 1639893483 +7169 1967824526 +7170 1769751950 +7171 948208391 +7172 1299101791 +7173 670883243 +7174 1442229602 +7175 1642338407 +7176 288522099 +7177 1694601080 +7178 1351609959 +7179 632379898 +7180 79812466 +7181 1470772319 +7182 1569370187 +7183 1489772946 +7184 1093230620 +7185 1905165299 +7186 908484804 +7187 198821314 +7188 288399318 +7189 1806213813 +7190 1765641872 +7191 146447113 +7192 1784297694 +7193 987431992 +7194 1241114329 +7195 1678950545 +7196 1668979302 +7197 1572148791 +7198 1018995864 +7199 1161389138 +7200 1392489669 +7201 641264166 +7202 2109597529 +7203 544107812 +7204 1312147410 +7205 1404343483 +7206 38962572 +7207 1600669509 +7208 951460916 +7209 1390572531 +7210 85565759 +7211 1031273382 +7212 713861202 +7213 1654935946 +7214 373562681 +7215 1807091822 +7216 1412617598 +7217 1282047485 +7218 2005913136 +7219 1701016916 +7220 940777650 +7221 1624071360 +7222 1847464029 +7223 577591696 +7224 464019704 +7225 941094711 +7226 109058594 +7227 2132999007 +7228 365759854 +7229 1128054458 +7230 1146904497 +7231 1758249523 +7232 1769318625 +7233 1109018378 +7234 154873687 +7235 933982387 +7236 365878214 +7237 193836259 +7238 387168248 +7239 1317339130 +7240 1584408791 +7241 472734007 +7242 201128864 +7243 150786345 +7244 2127669954 +7245 574691545 +7246 1957878168 +7247 1392803904 +7248 1856739030 +7249 1816307656 +7250 946337172 +7251 650033032 +7252 1292895369 +7253 646317554 +7254 1227624729 +7255 1756915073 +7256 1587412265 +7257 1336683323 +7258 1742430432 +7259 1953172119 +7260 317254133 +7261 741851281 +7262 1563937994 +7263 2086572758 +7264 1850869660 +7265 1718811681 +7266 873071497 +7267 69264226 +7268 1912647941 +7269 1260239745 +7270 1386603356 +7271 1349573084 +7272 1732973753 +7273 1587732220 +7274 1500359429 +7275 1713160059 +7276 14940118 +7277 1310753949 +7278 958480315 +7279 1871679148 +7280 979577958 +7281 1904817487 +7282 374228533 +7283 124989679 +7284 403651393 +7285 1601853262 +7286 1881904752 +7287 1991063658 +7288 791052937 +7289 1476851537 +7290 1796752129 +7291 1108307070 +7292 71219170 +7293 1213206475 +7294 1047396181 +7295 1922088830 +7296 784534509 +7297 1920467678 +7298 1991353056 +7299 549698802 +7300 1033223776 +7301 1230472764 +7302 1899271886 +7303 618713881 +7304 670721337 +7305 1252147667 +7306 184390292 +7307 685661455 +7308 415417969 +7309 1142870607 +7310 409856955 +7311 1394995927 +7312 900204446 +7313 784085488 +7314 1519985606 +7315 1303855840 +7316 238455102 +7317 1254406710 +7318 1147435850 +7319 1029508039 +7320 583774599 +7321 796704332 +7322 2137815110 +7323 654993770 +7324 2009910807 +7325 1037727643 +7326 429598952 +7327 646961668 +7328 810711673 +7329 273468361 +7330 1196660470 +7331 1843935449 +7332 1503941125 +7333 948448708 +7334 315165682 +7335 27178814 +7336 53112728 +7337 499555974 +7338 712840269 +7339 468530697 +7340 1642426581 +7341 1122697225 +7342 1863526624 +7343 395147380 +7344 1906782713 +7345 1236028582 +7346 1699003220 +7347 2145237816 +7348 342951644 +7349 698955422 +7350 1027262207 +7351 926726244 +7352 1495659754 +7353 1017593669 +7354 1581720014 +7355 1358086914 +7356 2055321312 +7357 2011318966 +7358 2005048582 +7359 718549338 +7360 137303679 +7361 1054225405 +7362 415001139 +7363 1641244805 +7364 2002674113 +7365 730166822 +7366 1668423619 +7367 2055786841 +7368 1229722796 +7369 233780241 +7370 376833890 +7371 724665730 +7372 1356477466 +7373 92876866 +7374 1119813110 +7375 1115776531 +7376 1328905448 +7377 671332682 +7378 1113530699 +7379 1671857093 +7380 1370288104 +7381 2140792907 +7382 451099689 +7383 718464211 +7384 1010902928 +7385 2032819703 +7386 2076551125 +7387 918740593 +7388 1896655021 +7389 1934116059 +7390 1637289931 +7391 2033958701 +7392 840857816 +7393 2052291070 +7394 1527719858 +7395 696048282 +7396 634974244 +7397 1048659829 +7398 604351475 +7399 1864697041 +7400 1282440070 +7401 981185366 +7402 441879123 +7403 491433888 +7404 1074062232 +7405 1561692233 +7406 1607210420 +7407 255484033 +7408 85541267 +7409 573257471 +7410 1927341126 +7411 1455829371 +7412 566566730 +7413 230957167 +7414 26809934 +7415 1577469659 +7416 116293222 +7417 2103361059 +7418 348726604 +7419 2012948243 +7420 1889993471 +7421 1986016535 +7422 1899423296 +7423 583367639 +7424 1890823957 +7425 1279659506 +7426 1279415921 +7427 378314554 +7428 180835688 +7429 1883767397 +7430 95527947 +7431 1463275758 +7432 717469115 +7433 537407070 +7434 1954709647 +7435 1791531347 +7436 2099099303 +7437 1414436419 +7438 2047015380 +7439 37156922 +7440 1987693890 +7441 1826872858 +7442 1492986293 +7443 406776973 +7444 2057830025 +7445 1519796228 +7446 1984246632 +7447 26639599 +7448 1475673639 +7449 185489588 +7450 2039587843 +7451 1218183462 +7452 24022475 +7453 1791527491 +7454 1801551102 +7455 1914846432 +7456 923703350 +7457 933483375 +7458 145677338 +7459 1104539038 +7460 669767124 +7461 241205285 +7462 420331148 +7463 1387236239 +7464 778612355 +7465 227557147 +7466 1031283939 +7467 730228010 +7468 1641993566 +7469 930815671 +7470 767384932 +7471 1482203809 +7472 610204882 +7473 112887578 +7474 1888980782 +7475 520551259 +7476 1632683806 +7477 1725743766 +7478 547190859 +7479 960873797 +7480 1911233354 +7481 439295054 +7482 31573612 +7483 1935255829 +7484 83338897 +7485 1833124714 +7486 1702618613 +7487 1007042247 +7488 619124441 +7489 1848295952 +7490 2111581285 +7491 1288891566 +7492 2089501237 +7493 384428786 +7494 528644157 +7495 720629945 +7496 611985933 +7497 1559928096 +7498 1450857955 +7499 106495852 +7500 343260120 +7501 70759240 +7502 1588699661 +7503 953465002 +7504 183646818 +7505 1330196795 +7506 1474016261 +7507 1816330624 +7508 908456913 +7509 2021207120 +7510 629720773 +7511 672206619 +7512 313018526 +7513 661294385 +7514 459978800 +7515 396357424 +7516 346935451 +7517 15113765 +7518 1403399671 +7519 966059893 +7520 1863409717 +7521 1367497309 +7522 107467811 +7523 1805427307 +7524 1751926095 +7525 636111968 +7526 378573604 +7527 216428380 +7528 48556417 +7529 1829431559 +7530 322924232 +7531 391816537 +7532 1900190799 +7533 1911623893 +7534 1345281539 +7535 2083837617 +7536 1094337040 +7537 671814152 +7538 1752684593 +7539 2002793953 +7540 545537625 +7541 234921719 +7542 527516924 +7543 858556151 +7544 896216104 +7545 987495724 +7546 1254913575 +7547 1243151556 +7548 1002609490 +7549 510829599 +7550 61727801 +7551 718535559 +7552 1878326908 +7553 169195612 +7554 376479218 +7555 1482769355 +7556 805307580 +7557 755052822 +7558 1699197735 +7559 853863997 +7560 437000734 +7561 2022121968 +7562 1245680534 +7563 189707885 +7564 1786262213 +7565 443478425 +7566 126061855 +7567 733115606 +7568 1115292578 +7569 1878746448 +7570 588425911 +7571 1660830203 +7572 2113668167 +7573 1115942836 +7574 371902706 +7575 862400624 +7576 2103438560 +7577 1626816282 +7578 2105552180 +7579 958564402 +7580 2137645881 +7581 19796333 +7582 1677099962 +7583 1868489141 +7584 188991945 +7585 2053579180 +7586 1203774848 +7587 994299525 +7588 661148355 +7589 755488935 +7590 1848163523 +7591 1098149089 +7592 630127255 +7593 946360409 +7594 1287856974 +7595 268905821 +7596 1389838835 +7597 1413918829 +7598 1002021427 +7599 357647765 +7600 1145181630 +7601 1590447338 +7602 2018477968 +7603 1111366149 +7604 558906526 +7605 242897026 +7606 1973766773 +7607 514861439 +7608 1869713308 +7609 1931835305 +7610 1473425841 +7611 1859875541 +7612 1951631638 +7613 1003042155 +7614 1580881034 +7615 2140623583 +7616 909137688 +7617 637172234 +7618 987439461 +7619 1570286043 +7620 1392661170 +7621 688119336 +7622 520951484 +7623 2022788425 +7624 1634479745 +7625 1808808458 +7626 144210598 +7627 876834932 +7628 1075243640 +7629 1146232025 +7630 1234482697 +7631 72941622 +7632 589195716 +7633 1105477017 +7634 1184307771 +7635 1148102242 +7636 1348374044 +7637 1010590897 +7638 1662963681 +7639 1070603704 +7640 794942554 +7641 988905875 +7642 782995598 +7643 599090545 +7644 1991948030 +7645 216392984 +7646 592230480 +7647 753602070 +7648 853565219 +7649 1579669941 +7650 176404465 +7651 98742741 +7652 120305629 +7653 697355949 +7654 2121531166 +7655 1754785375 +7656 358680760 +7657 118258117 +7658 484136659 +7659 1433924400 +7660 1264490142 +7661 1718619357 +7662 1506866022 +7663 1853685858 +7664 676612726 +7665 543690145 +7666 854304453 +7667 2024986770 +7668 1554281042 +7669 369784486 +7670 948106827 +7671 201739949 +7672 1358690361 +7673 1731102425 +7674 800830494 +7675 1203154744 +7676 1947495409 +7677 1393060974 +7678 1956756814 +7679 653576980 +7680 825247268 +7681 2133161280 +7682 752319721 +7683 945552897 +7684 683033581 +7685 726367240 +7686 552854624 +7687 1041714341 +7688 844625357 +7689 1036991284 +7690 328155093 +7691 2109115499 +7692 608126993 +7693 1835021115 +7694 1815317710 +7695 1284739719 +7696 231227613 +7697 522138515 +7698 1162242842 +7699 1785508655 +7700 891923001 +7701 2110349669 +7702 1987248604 +7703 103129715 +7704 1693968446 +7705 640595450 +7706 1306284459 +7707 1493980207 +7708 2033656425 +7709 1115557625 +7710 73540 +7711 711420045 +7712 1101235257 +7713 752393261 +7714 1656972942 +7715 1784268839 +7716 1478760501 +7717 62343919 +7718 678499532 +7719 175902210 +7720 1099335203 +7721 1006654626 +7722 137534062 +7723 1707462196 +7724 694192093 +7725 1952851772 +7726 844718267 +7727 925419706 +7728 327506639 +7729 2006961109 +7730 563444714 +7731 1219429640 +7732 1969827130 +7733 403209670 +7734 1322559355 +7735 1516311928 +7736 1043805121 +7737 481360166 +7738 862808488 +7739 929977898 +7740 1596917792 +7741 862882028 +7742 1641397943 +7743 550669401 +7744 1615275289 +7745 1150887237 +7746 187454592 +7747 946552143 +7748 1213231156 +7749 865954125 +7750 1122454353 +7751 165082711 +7752 1872608751 +7753 1259988415 +7754 1872544907 +7755 419317196 +7756 1065356539 +7757 569779527 +7758 1344736903 +7759 1392863178 +7760 429256988 +7761 1908181617 +7762 464809171 +7763 251600471 +7764 163907639 +7765 1787368526 +7766 1767912399 +7767 1207712760 +7768 121245045 +7769 483237239 +7770 2137690658 +7771 1718162837 +7772 1346119267 +7773 1631604953 +7774 121348590 +7775 813910909 +7776 635008543 +7777 308803183 +7778 1760463052 +7779 1848239699 +7780 1174757308 +7781 735433757 +7782 2013322411 +7783 899882411 +7784 1995422173 +7785 1738383670 +7786 1319199607 +7787 913295064 +7788 160679549 +7789 516452862 +7790 158674595 +7791 589936538 +7792 277150831 +7793 623483766 +7794 841537009 +7795 441058471 +7796 263368644 +7797 461965760 +7798 1648771231 +7799 384613689 +7800 945203000 +7801 1638978242 +7802 2102776526 +7803 143838619 +7804 1123099547 +7805 76641469 +7806 957749528 +7807 1758108090 +7808 385444652 +7809 570728932 +7810 1458864142 +7811 1560201960 +7812 1306162690 +7813 1324702905 +7814 312600723 +7815 1154101215 +7816 915602927 +7817 1631800330 +7818 2067396279 +7819 1076282477 +7820 769545 +7821 78587226 +7822 1666219015 +7823 277920376 +7824 702070992 +7825 360272376 +7826 718978847 +7827 965439637 +7828 822238136 +7829 220266431 +7830 1350053326 +7831 1767441136 +7832 1859244673 +7833 1305346205 +7834 1911279756 +7835 834860572 +7836 1381987674 +7837 721545636 +7838 445485015 +7839 1767432326 +7840 1292274569 +7841 1904349157 +7842 1180150638 +7843 450953611 +7844 1081568414 +7845 1492751361 +7846 1605054826 +7847 1997171341 +7848 977068043 +7849 1524967457 +7850 925970170 +7851 977837588 +7852 1603554684 +7853 444705537 +7854 1255757965 +7855 158142028 +7856 804977913 +7857 1974736812 +7858 1123581665 +7859 1627216050 +7860 47519595 +7861 326151344 +7862 1247173538 +7863 1906764268 +7864 1631497549 +7865 1010969646 +7866 594141193 +7867 866001575 +7868 1732515283 +7869 1039626208 +7870 485950253 +7871 877306204 +7872 796491717 +7873 1666100891 +7874 1328259815 +7875 1878060131 +7876 1011368604 +7877 785830993 +7878 1727747824 +7879 1988436647 +7880 163314802 +7881 506234347 +7882 818790588 +7883 1766869486 +7884 950939884 +7885 2074548553 +7886 1925011515 +7887 1755917798 +7888 1901801717 +7889 901109532 +7890 1235650200 +7891 1949321313 +7892 1227260876 +7893 335340090 +7894 1708601933 +7895 711274777 +7896 1346309737 +7897 155259478 +7898 1577276352 +7899 931341372 +7900 1194885686 +7901 2063226605 +7902 1808647576 +7903 1991377403 +7904 1581843848 +7905 989423743 +7906 1721953886 +7907 445728804 +7908 1775254736 +7909 1302218063 +7910 286681804 +7911 1938569538 +7912 1808452410 +7913 1105472392 +7914 1557955377 +7915 611908646 +7916 1032537297 +7917 1335483244 +7918 220342796 +7919 786855366 +7920 89109128 +7921 1455992996 +7922 588693031 +7923 1316370005 +7924 1791333087 +7925 149811317 +7926 2027644782 +7927 990159176 +7928 305070795 +7929 1457437487 +7930 1921500548 +7931 1499956482 +7932 1373180444 +7933 1582664476 +7934 1343850237 +7935 807540645 +7936 424604571 +7937 918320476 +7938 1253269449 +7939 52375659 +7940 73054891 +7941 1539951253 +7942 1990945197 +7943 1881507301 +7944 497939997 +7945 1401416926 +7946 345932299 +7947 1530477294 +7948 589416522 +7949 566275096 +7950 169849013 +7951 678525651 +7952 2022268092 +7953 758542044 +7954 1994895656 +7955 1666117531 +7956 908353361 +7957 1875056790 +7958 508793059 +7959 1213424157 +7960 1185010629 +7961 282809959 +7962 565896991 +7963 410707426 +7964 1865474435 +7965 1909747228 +7966 1218248071 +7967 142595358 +7968 680584056 +7969 324033872 +7970 194971017 +7971 753638947 +7972 1863985126 +7973 38432567 +7974 487662600 +7975 214441475 +7976 1439849493 +7977 833594900 +7978 1744918770 +7979 2029266016 +7980 1399869996 +7981 1914767783 +7982 560308019 +7983 1274654440 +7984 525826179 +7985 407720027 +7986 793288324 +7987 1434179541 +7988 135293169 +7989 1302081383 +7990 500120050 +7991 1320303799 +7992 1584891343 +7993 1066017041 +7994 1731011225 +7995 1302882130 +7996 828280621 +7997 801775648 +7998 1445477489 +7999 1508864678 +8000 1125809520 +8001 1640448506 +8002 115019977 +8003 842310998 +8004 1678881073 +8005 602682578 +8006 1056752474 +8007 971246919 +8008 1436277478 +8009 654187596 +8010 853029287 +8011 688663826 +8012 421471731 +8013 1413337306 +8014 1963318266 +8015 947297910 +8016 1821057333 +8017 609122942 +8018 233993803 +8019 1956350502 +8020 1911204326 +8021 734113853 +8022 1129170653 +8023 1348612021 +8024 1800130894 +8025 712698230 +8026 504010503 +8027 480927868 +8028 1514473878 +8029 1949487992 +8030 1989792546 +8031 492799751 +8032 1442452851 +8033 2104812523 +8034 1335110749 +8035 973850276 +8036 560011453 +8037 244379575 +8038 1945097195 +8039 1996288931 +8040 898567171 +8041 650642834 +8042 537469109 +8043 1320038902 +8044 2063980140 +8045 353303728 +8046 119853165 +8047 1737553825 +8048 962426670 +8049 353846968 +8050 1546420680 +8051 726147348 +8052 1087960822 +8053 528107685 +8054 2074759369 +8055 740608068 +8056 1240805916 +8057 431286225 +8058 1221535936 +8059 607796146 +8060 233290569 +8061 1063844834 +8062 1100595897 +8063 1675743420 +8064 1021173710 +8065 288222999 +8066 502110049 +8067 1581185163 +8068 532602574 +8069 299723596 +8070 1429990447 +8071 1431169746 +8072 950366431 +8073 1967459556 +8074 603725000 +8075 866862923 +8076 173279636 +8077 723578165 +8078 456933101 +8079 1135706307 +8080 1077425134 +8081 2003353781 +8082 1861853655 +8083 17902308 +8084 383977818 +8085 1789129377 +8086 758510376 +8087 1624783734 +8088 72931954 +8089 1980046313 +8090 85096233 +8091 306222523 +8092 896407499 +8093 1185692130 +8094 1981965944 +8095 1917581209 +8096 1473915129 +8097 336592345 +8098 1351282725 +8099 2006517704 +8100 636315941 +8101 633789524 +8102 1290203802 +8103 1586682372 +8104 453765432 +8105 1893928802 +8106 306061648 +8107 627045069 +8108 470023320 +8109 762994749 +8110 1762751376 +8111 1547448454 +8112 618864882 +8113 1477121383 +8114 1565350762 +8115 1002842700 +8116 1118767112 +8117 176377490 +8118 480142787 +8119 1191699066 +8120 8940155 +8121 565239020 +8122 1497921590 +8123 905347655 +8124 1750931150 +8125 1332403886 +8126 675445216 +8127 1077362632 +8128 1668996231 +8129 2026727941 +8130 936396688 +8131 157828524 +8132 513033817 +8133 79116842 +8134 1744510897 +8135 966799250 +8136 1973045644 +8137 2050572545 +8138 1593844319 +8139 295585316 +8140 666083646 +8141 1209112047 +8142 1843033770 +8143 1284948528 +8144 538749782 +8145 1260900884 +8146 140307580 +8147 1657516895 +8148 1437278375 +8149 620450367 +8150 701732313 +8151 1446218530 +8152 1185689387 +8153 52170255 +8154 204082537 +8155 789136890 +8156 1384574141 +8157 879527754 +8158 1866499522 +8159 906086724 +8160 758772047 +8161 655412562 +8162 1063915249 +8163 1271805865 +8164 734529404 +8165 660942498 +8166 91121467 +8167 560091400 +8168 564031395 +8169 1684965786 +8170 855676717 +8171 1230115041 +8172 746594185 +8173 551226839 +8174 367579921 +8175 1285343967 +8176 1812127724 +8177 507887501 +8178 795377214 +8179 1101922451 +8180 1128337869 +8181 1497109528 +8182 400657333 +8183 166543608 +8184 1549279783 +8185 604739871 +8186 955680498 +8187 786370277 +8188 1484267625 +8189 674696372 +8190 1692457001 +8191 95556024 +8192 1330108934 +8193 608888602 +8194 1367361889 +8195 2064638338 +8196 1269831100 +8197 1458483356 +8198 477246091 +8199 1833862495 +8200 995965494 +8201 1332922808 +8202 916493888 +8203 1742559679 +8204 1884149647 +8205 1284073809 +8206 880419999 +8207 1548793723 +8208 1791961311 +8209 1675797213 +8210 503232526 +8211 772815532 +8212 1025423093 +8213 903889860 +8214 939359140 +8215 427219229 +8216 1508629731 +8217 1895039639 +8218 1213589506 +8219 845413708 +8220 422252363 +8221 758562859 +8222 940969732 +8223 1752361298 +8224 1367451462 +8225 160847974 +8226 1669515988 +8227 489798914 +8228 1619331330 +8229 2146762079 +8230 176177762 +8231 467813177 +8232 1332201239 +8233 1092671650 +8234 62889208 +8235 1068867239 +8236 229261812 +8237 943309207 +8238 470177314 +8239 2021223123 +8240 471622773 +8241 973409841 +8242 646555007 +8243 1497045866 +8244 1877299701 +8245 1585914147 +8246 1924265095 +8247 1238445784 +8248 1333470138 +8249 990370953 +8250 2083859492 +8251 1755722502 +8252 1748933813 +8253 877345576 +8254 1360600152 +8255 968901627 +8256 1038193550 +8257 882632492 +8258 1458700541 +8259 510041233 +8260 881910924 +8261 1634878303 +8262 977854410 +8263 66628515 +8264 580066306 +8265 1040743618 +8266 1135495754 +8267 809328118 +8268 1984052826 +8269 1605673069 +8270 683067593 +8271 308191951 +8272 431599262 +8273 1329622600 +8274 1805237817 +8275 161415315 +8276 768053099 +8277 1582019265 +8278 1399861099 +8279 2101523238 +8280 424906570 +8281 1336236943 +8282 1709762092 +8283 26356735 +8284 66098871 +8285 922878596 +8286 995258362 +8287 1104292422 +8288 1805511088 +8289 306475256 +8290 1614333655 +8291 539938364 +8292 1941353559 +8293 444704417 +8294 606566880 +8295 373936217 +8296 1485448035 +8297 1742062634 +8298 1183264335 +8299 1322017213 +8300 1200252055 +8301 1866331928 +8302 1630209164 +8303 1631851317 +8304 1048470880 +8305 1287963334 +8306 1793266632 +8307 1816523980 +8308 722498951 +8309 1045644083 +8310 1770563570 +8311 1147405521 +8312 234397378 +8313 1332842014 +8314 1173762257 +8315 300496250 +8316 108236962 +8317 21536971 +8318 1404788672 +8319 1913748050 +8320 328012227 +8321 871638679 +8322 306202767 +8323 121882139 +8324 1316343096 +8325 912769647 +8326 495818356 +8327 654307483 +8328 507348633 +8329 1679082692 +8330 1976324697 +8331 1707600689 +8332 1397930972 +8333 1459050213 +8334 1191968358 +8335 298918205 +8336 599529899 +8337 837751343 +8338 2115442185 +8339 1322028850 +8340 1883395426 +8341 1738522107 +8342 321950724 +8343 2117792805 +8344 923880473 +8345 1495712981 +8346 270805407 +8347 1032117435 +8348 1517249952 +8349 1675594079 +8350 798381837 +8351 1845262180 +8352 399749110 +8353 1104584604 +8354 1967144319 +8355 1716092206 +8356 2017354251 +8357 315479027 +8358 222916041 +8359 377219237 +8360 1994561719 +8361 51757090 +8362 2084819926 +8363 1245009044 +8364 1510807304 +8365 1129304636 +8366 1543927249 +8367 2110337203 +8368 1967055979 +8369 1511885786 +8370 1284882406 +8371 1702967758 +8372 1102924245 +8373 1606833130 +8374 1673276915 +8375 2026804718 +8376 955062463 +8377 1944082322 +8378 911438505 +8379 324828767 +8380 1472192753 +8381 1709820342 +8382 22607299 +8383 1871941863 +8384 666921299 +8385 1989751618 +8386 1440550421 +8387 536791902 +8388 157746998 +8389 1663466462 +8390 914011139 +8391 4825069 +8392 1715223553 +8393 851347417 +8394 1249834113 +8395 1078547209 +8396 1980652054 +8397 646277714 +8398 1041400764 +8399 1800224385 +8400 10679852 +8401 178799522 +8402 1355708495 +8403 1113604097 +8404 1785632652 +8405 881501762 +8406 992925167 +8407 593211467 +8408 678100436 +8409 1904363672 +8410 918040235 +8411 2809541 +8412 1466700367 +8413 940647534 +8414 1874751404 +8415 2133621666 +8416 782915505 +8417 1167818177 +8418 522929920 +8419 940662503 +8420 683800992 +8421 1436941060 +8422 945487572 +8423 251540897 +8424 140804829 +8425 47838038 +8426 1330088106 +8427 2121456883 +8428 694115752 +8429 224005222 +8430 1774197621 +8431 704795605 +8432 402804745 +8433 982422468 +8434 1818399702 +8435 40953749 +8436 1863924231 +8437 663841222 +8438 634165217 +8439 394541019 +8440 420721246 +8441 1552205452 +8442 397350561 +8443 1887421613 +8444 345369338 +8445 124618317 +8446 1873559631 +8447 1128284843 +8448 1292436495 +8449 249005904 +8450 2068947346 +8451 1976237487 +8452 1685946964 +8453 866951271 +8454 80294736 +8455 1826751793 +8456 914789309 +8457 1410382842 +8458 1800725029 +8459 1608905061 +8460 1634388064 +8461 1427439002 +8462 166217018 +8463 2037192809 +8464 262377822 +8465 1984616721 +8466 2078146559 +8467 2126302053 +8468 500974295 +8469 564828128 +8470 373359425 +8471 921695541 +8472 2117033580 +8473 770709986 +8474 661633507 +8475 314919270 +8476 895328303 +8477 387709490 +8478 1443204114 +8479 40281150 +8480 636715394 +8481 1364667812 +8482 2016518637 +8483 175178710 +8484 84135435 +8485 2096813373 +8486 2001930504 +8487 998924744 +8488 1359712567 +8489 1655171885 +8490 460346158 +8491 846616984 +8492 935127239 +8493 626563176 +8494 736326145 +8495 1197505061 +8496 463696249 +8497 666989056 +8498 1176323467 +8499 964670544 +8500 1231817184 +8501 1549682892 +8502 1886366086 +8503 1201367116 +8504 172909230 +8505 400515945 +8506 1516286387 +8507 1068237533 +8508 788225435 +8509 812006853 +8510 1108518684 +8511 1424940830 +8512 29191017 +8513 977553673 +8514 1600119540 +8515 113326453 +8516 926883399 +8517 1454566396 +8518 1112251197 +8519 139112318 +8520 962254633 +8521 1572597355 +8522 985729302 +8523 1897381872 +8524 51676884 +8525 1722055448 +8526 947403286 +8527 515373133 +8528 241560856 +8529 2123726753 +8530 1480043678 +8531 1473378041 +8532 1525925997 +8533 1218926116 +8534 527261509 +8535 1698835227 +8536 1619442061 +8537 2043547896 +8538 619589112 +8539 260183848 +8540 708071101 +8541 1728107796 +8542 1685124678 +8543 737262119 +8544 558177822 +8545 1137760571 +8546 850588572 +8547 1485061221 +8548 444843319 +8549 1962839769 +8550 1624173539 +8551 1407097953 +8552 1387953477 +8553 462419194 +8554 1156996177 +8555 1439630361 +8556 36990994 +8557 2104399463 +8558 1955003494 +8559 278551850 +8560 2080642568 +8561 1287563524 +8562 1751929891 +8563 1459084917 +8564 359005992 +8565 131707753 +8566 1010436496 +8567 1978448053 +8568 27772001 +8569 1630025609 +8570 91148254 +8571 735843103 +8572 1210649757 +8573 1776272932 +8574 1473105222 +8575 1768827579 +8576 766549855 +8577 176210146 +8578 1106405152 +8579 1211393175 +8580 2139049915 +8581 583095044 +8582 471007480 +8583 1379519744 +8584 1045514238 +8585 1628003657 +8586 671666457 +8587 1082505232 +8588 1584919473 +8589 479186304 +8590 1361057082 +8591 1518078393 +8592 1766749828 +8593 965503326 +8594 829679663 +8595 2125755821 +8596 1097211079 +8597 1840116159 +8598 1956720226 +8599 1124983080 +8600 1322658120 +8601 2047868480 +8602 1860826183 +8603 385824230 +8604 1676657765 +8605 1186447757 +8606 7168161 +8607 295723972 +8608 1362657903 +8609 1113573314 +8610 1507117147 +8611 1354224171 +8612 1696668358 +8613 1978124627 +8614 586260267 +8615 594698948 +8616 1458644637 +8617 1257926725 +8618 1677204180 +8619 896080462 +8620 1737113029 +8621 890777614 +8622 266675207 +8623 1356379209 +8624 1856280940 +8625 1096354870 +8626 1334651382 +8627 806008371 +8628 788987382 +8629 1143887961 +8630 1930991452 +8631 2111645502 +8632 1044272793 +8633 1644333987 +8634 349986084 +8635 573446910 +8636 683298097 +8637 357154246 +8638 869170883 +8639 2045956000 +8640 1470727560 +8641 228804382 +8642 1252696523 +8643 1019912270 +8644 59445362 +8645 1838956791 +8646 1614611218 +8647 1518089999 +8648 949399868 +8649 1144331750 +8650 266686813 +8651 539029249 +8652 2035109364 +8653 533362020 +8654 1895408458 +8655 1743906657 +8656 1629716891 +8657 1082576193 +8658 402431380 +8659 271220625 +8660 78980506 +8661 185939184 +8662 235382479 +8663 1123253299 +8664 1830273172 +8665 585368564 +8666 1696700210 +8667 366087621 +8668 942522810 +8669 418387445 +8670 264559973 +8671 265766722 +8672 647191827 +8673 1517256497 +8674 1285678992 +8675 706637189 +8676 1208729640 +8677 752806562 +8678 77243540 +8679 10645860 +8680 1897138312 +8681 343930353 +8682 549675109 +8683 1784764028 +8684 877292374 +8685 297599919 +8686 1381187037 +8687 359525617 +8688 1380176112 +8689 1783618418 +8690 630746242 +8691 1459156618 +8692 1969557602 +8693 866128721 +8694 434926270 +8695 1652347126 +8696 1451497285 +8697 2131626480 +8698 2018434747 +8699 246536447 +8700 402530277 +8701 135511073 +8702 512303169 +8703 1049722104 +8704 1652767570 +8705 1797982161 +8706 1756359294 +8707 714013562 +8708 403305075 +8709 1833602834 +8710 724659422 +8711 152959739 +8712 30049540 +8713 1274334531 +8714 1937723768 +8715 907341914 +8716 1571934450 +8717 1171427157 +8718 1266867531 +8719 804626915 +8720 807561927 +8721 1897613773 +8722 116299885 +8723 629635882 +8724 616258846 +8725 551226155 +8726 134499360 +8727 2067756132 +8728 535368987 +8729 5450460 +8730 166808931 +8731 937899264 +8732 140961533 +8733 679112101 +8734 1987621369 +8735 1793729103 +8736 329610614 +8737 1596497015 +8738 360259017 +8739 732915690 +8740 1282616201 +8741 1084918439 +8742 885875429 +8743 1312665741 +8744 211769322 +8745 676115549 +8746 72524007 +8747 1783703772 +8748 1847542707 +8749 1339391538 +8750 440847039 +8751 507620986 +8752 1089521663 +8753 557146925 +8754 1137256868 +8755 1705780510 +8756 1108373080 +8757 1271756229 +8758 1626052994 +8759 1643742068 +8760 1277206689 +8761 1792861925 +8762 434157684 +8763 1418168222 +8764 324490378 +8765 274295405 +8766 1064413677 +8767 654100993 +8768 1870792420 +8769 1424672694 +8770 1387016683 +8771 1005924974 +8772 362107485 +8773 125408464 +8774 171107067 +8775 573876807 +8776 801524014 +8777 243631075 +8778 210096931 +8779 501583073 +8780 1583022613 +8781 650943971 +8782 1009204059 +8783 525060629 +8784 1208090896 +8785 2146460928 +8786 83357491 +8787 168980328 +8788 1270733509 +8789 1709410485 +8790 1812722396 +8791 400456550 +8792 1354788762 +8793 99396433 +8794 1818624772 +8795 1679279141 +8796 373691838 +8797 735554801 +8798 185896486 +8799 97000611 +8800 12743847 +8801 1572913169 +8802 1102925585 +8803 374851332 +8804 1698321633 +8805 1274032652 +8806 948728139 +8807 352361999 +8808 1517663727 +8809 1158825070 +8810 853945072 +8811 953202693 +8812 1809769041 +8813 1863149132 +8814 1478263322 +8815 870376289 +8816 1862126412 +8817 1561620813 +8818 1039356618 +8819 985376273 +8820 1123547650 +8821 704595366 +8822 1385832823 +8823 330852764 +8824 803991799 +8825 1056973947 +8826 2010131905 +8827 1177683638 +8828 1792528748 +8829 48544743 +8830 1274684249 +8831 1805272595 +8832 1621457912 +8833 230126186 +8834 32640279 +8835 1172295898 +8836 1504158838 +8837 981368418 +8838 1524657897 +8839 874338918 +8840 2140193488 +8841 231119322 +8842 1827541611 +8843 1802478882 +8844 2094268454 +8845 1158321285 +8846 525371523 +8847 1808911218 +8848 572458450 +8849 1564728141 +8850 646803843 +8851 1696006100 +8852 121839860 +8853 2032636666 +8854 2026858864 +8855 925831659 +8856 942126965 +8857 1889507122 +8858 2103515297 +8859 587172065 +8860 1938051865 +8861 1230715898 +8862 244961012 +8863 1412026130 +8864 1460842084 +8865 277601291 +8866 436838380 +8867 817517275 +8868 1258969709 +8869 1961496277 +8870 1691856193 +8871 1251679549 +8872 45131951 +8873 1371914156 +8874 906674783 +8875 2139400405 +8876 382751793 +8877 1432046307 +8878 1800827975 +8879 955210243 +8880 849290800 +8881 300148170 +8882 503732695 +8883 971130660 +8884 185301188 +8885 383107911 +8886 1896962320 +8887 1127428153 +8888 125131385 +8889 1852993969 +8890 1714600218 +8891 2063183251 +8892 936226220 +8893 1959561230 +8894 1327725733 +8895 249584656 +8896 89678873 +8897 1764564113 +8898 1067101931 +8899 1348648582 +8900 1578576742 +8901 611474476 +8902 452844484 +8903 1623708694 +8904 1983388632 +8905 1359519267 +8906 1615625451 +8907 218656777 +8908 644081926 +8909 1268969779 +8910 1173867020 +8911 1493372727 +8912 1569117949 +8913 1677599715 +8914 317019739 +8915 1754419138 +8916 2060707627 +8917 66498411 +8918 734363643 +8919 38355364 +8920 1919492381 +8921 301480214 +8922 2101538615 +8923 708234953 +8924 113557796 +8925 1281780700 +8926 957819609 +8927 203236670 +8928 898861165 +8929 2024921541 +8930 1551885252 +8931 329954260 +8932 488912369 +8933 2004729736 +8934 1953662954 +8935 324817354 +8936 1216765356 +8937 1421804757 +8938 543474131 +8939 1860847282 +8940 543290888 +8941 1717341152 +8942 1206736361 +8943 2112408838 +8944 1247457219 +8945 1523756101 +8946 1719344328 +8947 1160681198 +8948 1590254512 +8949 306224323 +8950 1199036563 +8951 1362263245 +8952 607704537 +8953 1153091530 +8954 2070498198 +8955 721262334 +8956 287388583 +8957 880834160 +8958 924499004 +8959 1186249748 +8960 758272053 +8961 328900608 +8962 1516204008 +8963 1247184422 +8964 186146697 +8965 1322383314 +8966 1572001776 +8967 1402912053 +8968 596704424 +8969 2115475908 +8970 1116275687 +8971 1139995312 +8972 1685333412 +8973 175528401 +8974 1104920502 +8975 785306983 +8976 1699284502 +8977 676781182 +8978 1945988182 +8979 1142055366 +8980 983005506 +8981 997541097 +8982 356834964 +8983 1590710043 +8984 3148979 +8985 279849514 +8986 164488729 +8987 290537562 +8988 1160683674 +8989 1088987733 +8990 1476787311 +8991 1918955727 +8992 1417888342 +8993 845507671 +8994 1018656502 +8995 1604035039 +8996 20407338 +8997 443174630 +8998 859463444 +8999 617111762 +9000 411166890 +9001 1975739131 +9002 1757107074 +9003 2096500302 +9004 3783884 +9005 714543929 +9006 734323638 +9007 1703068386 +9008 1391325111 +9009 532828172 +9010 697640105 +9011 226846969 +9012 1530369269 +9013 1054475069 +9014 1817557013 +9015 1533518248 +9016 1334324583 +9017 1982045742 +9018 1824055811 +9019 347524610 +9020 923549828 +9021 1153359474 +9022 118996689 +9023 193954522 +9024 1998867145 +9025 1137653191 +9026 1797989561 +9027 2019274483 +9028 1580827822 +9029 509969357 +9030 488902597 +9031 1991994712 +9032 338224840 +9033 98526024 +9034 1941011367 +9035 342008725 +9036 813069953 +9037 527851357 +9038 2045077111 +9039 56911416 +9040 1060679529 +9041 595233568 +9042 283758386 +9043 443565150 +9044 1649708637 +9045 2101315399 +9046 1977083398 +9047 836549573 +9048 1935877493 +9049 1653655561 +9050 1184074183 +9051 711943673 +9052 659531387 +9053 1303070872 +9054 905898195 +9055 510914885 +9056 293240416 +9057 556404108 +9058 382705720 +9059 1874068238 +9060 1066373465 +9061 871608318 +9062 1718579302 +9063 1404598306 +9064 970134342 +9065 1512107021 +9066 1746607031 +9067 1783204295 +9068 2039958378 +9069 1644200494 +9070 1840115711 +9071 953154259 +9072 91950415 +9073 2123874097 +9074 1396719409 +9075 1741659052 +9076 2077705848 +9077 1226319160 +9078 430724977 +9079 1866099694 +9080 732491073 +9081 1614799160 +9082 430559719 +9083 1392022461 +9084 770386385 +9085 1336457915 +9086 1902937346 +9087 1063626801 +9088 1892862023 +9089 138159418 +9090 790211391 +9091 811751841 +9092 1009767736 +9093 361307045 +9094 68866499 +9095 1979902078 +9096 1873414067 +9097 1815473530 +9098 1615622725 +9099 1765888797 +9100 1312190376 +9101 1308254789 +9102 571559409 +9103 1404140791 +9104 1284645238 +9105 1968278818 +9106 998316196 +9107 1214867439 +9108 1047114330 +9109 1429041173 +9110 933483485 +9111 1779605404 +9112 896356686 +9113 1364043204 +9114 1024144217 +9115 1666743071 +9116 553017471 +9117 779597915 +9118 582886224 +9119 298395847 +9120 917757333 +9121 1373097615 +9122 1110147688 +9123 1927525070 +9124 1734404660 +9125 1179014187 +9126 1759943500 +9127 1460335079 +9128 847004069 +9129 1228082578 +9130 1078740229 +9131 11710797 +9132 388853719 +9133 1650299638 +9134 1415851589 +9135 1673498957 +9136 1471094808 +9137 266684137 +9138 740882748 +9139 370725491 +9140 1695725310 +9141 1674366233 +9142 2847247 +9143 444598348 +9144 890925790 +9145 1026991464 +9146 2111341419 +9147 1443943261 +9148 1806589379 +9149 546743995 +9150 1742339108 +9151 576863064 +9152 1919841610 +9153 705003148 +9154 356904486 +9155 1506762623 +9156 1884017335 +9157 2116847987 +9158 819614054 +9159 583537756 +9160 1197446917 +9161 1898354283 +9162 595248554 +9163 1586300636 +9164 1401170273 +9165 2011100143 +9166 1112315945 +9167 724781434 +9168 130300632 +9169 1853198694 +9170 1095506925 +9171 1826025942 +9172 1380081279 +9173 1098354172 +9174 123140643 +9175 123523421 +9176 2125345636 +9177 86998414 +9178 1567466683 +9179 1784451367 +9180 633742410 +9181 1162322143 +9182 213830783 +9183 406100372 +9184 1867325292 +9185 570735270 +9186 1912862995 +9187 1603858979 +9188 540099609 +9189 584993402 +9190 39913088 +9191 1737546526 +9192 335864037 +9193 635161642 +9194 1176363514 +9195 1737034311 +9196 498778137 +9197 141195811 +9198 314332097 +9199 629078769 +9200 1994394505 +9201 1409839022 +9202 307621063 +9203 1226992137 +9204 360709546 +9205 430761706 +9206 1350515558 +9207 338571534 +9208 517760121 +9209 770498593 +9210 2123022901 +9211 1151502531 +9212 1932820737 +9213 189370036 +9214 1557602903 +9215 1652662381 +9216 760105306 +9217 1322982251 +9218 1109037712 +9219 1300204915 +9220 1907975653 +9221 1148950800 +9222 890267793 +9223 96356042 +9224 1784112442 +9225 2066631307 +9226 1833390353 +9227 135406931 +9228 60343471 +9229 238802 +9230 764485700 +9231 2054737976 +9232 1410077824 +9233 1072106764 +9234 1134246465 +9235 1770787370 +9236 1502868470 +9237 337278376 +9238 2109358904 +9239 2020628591 +9240 1107776969 +9241 2084898157 +9242 1024647474 +9243 893114058 +9244 126784546 +9245 434766730 +9246 398292791 +9247 886889852 +9248 1757748981 +9249 1507330504 +9250 39611120 +9251 1518240986 +9252 508797656 +9253 929878913 +9254 1614597028 +9255 145426451 +9256 849026573 +9257 1300503734 +9258 280833382 +9259 909370044 +9260 1300742536 +9261 1045319083 +9262 816624372 +9263 563336713 +9264 2117425847 +9265 1950870838 +9266 186640435 +9267 1472810669 +9268 140665566 +9269 148515692 +9270 1345955613 +9271 1248442535 +9272 85930201 +9273 223119439 +9274 2141556594 +9275 212714747 +9276 657886169 +9277 392365737 +9278 1099604600 +9279 268151502 +9280 1899696241 +9281 1139215720 +9282 1786392488 +9283 261010250 +9284 2069094633 +9285 1253505869 +9286 406436701 +9287 770637558 +9288 406525955 +9289 687270083 +9290 1680007602 +9291 1707268491 +9292 1732589166 +9293 349148327 +9294 123121556 +9295 1702531365 +9296 152535517 +9297 309761992 +9298 1027858387 +9299 293201083 +9300 458277684 +9301 226330352 +9302 1541643618 +9303 544207885 +9304 449449791 +9305 1535716564 +9306 756922633 +9307 1107335961 +9308 1928082302 +9309 1856527233 +9310 1375487463 +9311 1680294895 +9312 848259305 +9313 1014396304 +9314 1941305145 +9315 769870290 +9316 120418525 +9317 200258198 +9318 1540507849 +9319 526944480 +9320 887528282 +9321 1073031803 +9322 86729323 +9323 472633800 +9324 1422180130 +9325 209850880 +9326 27681518 +9327 1574715647 +9328 519612872 +9329 1055539905 +9330 1867916730 +9331 977890556 +9332 1281870257 +9333 1262076701 +9334 1522098441 +9335 1731320048 +9336 650309617 +9337 131537426 +9338 691172361 +9339 430908271 +9340 1988064659 +9341 2066659825 +9342 2111203167 +9343 688840316 +9344 933572481 +9345 1905024664 +9346 1458710607 +9347 1053991006 +9348 2105282863 +9349 851734808 +9350 1580935486 +9351 845327497 +9352 1924766611 +9353 1667664809 +9354 1317961297 +9355 1199463094 +9356 1877515689 +9357 1345642815 +9358 626695093 +9359 249644913 +9360 253699072 +9361 347128176 +9362 1227535469 +9363 1535569329 +9364 1609204877 +9365 602150263 +9366 1119405730 +9367 112030846 +9368 733687689 +9369 1810578091 +9370 542939118 +9371 574268701 +9372 1729754268 +9373 506658637 +9374 1263109017 +9375 515843101 +9376 264199653 +9377 574335976 +9378 1569834107 +9379 221998868 +9380 1426070784 +9381 1003285945 +9382 1067326365 +9383 1203353748 +9384 523467107 +9385 237804015 +9386 255333194 +9387 253499148 +9388 1583446830 +9389 882028287 +9390 503144062 +9391 1837145903 +9392 1229156463 +9393 1730679531 +9394 1225231584 +9395 690877692 +9396 185346146 +9397 197153666 +9398 802908539 +9399 919033836 +9400 2007731758 +9401 1345847657 +9402 1493302537 +9403 1590002378 +9404 1852506294 +9405 608927906 +9406 2105845480 +9407 2116705947 +9408 1183263883 +9409 1528195939 +9410 191221168 +9411 461851019 +9412 383998237 +9413 1258547533 +9414 1665204767 +9415 907465344 +9416 1496351548 +9417 1920537961 +9418 1160964492 +9419 932314731 +9420 655082601 +9421 1664108554 +9422 621976986 +9423 1884239064 +9424 1247304438 +9425 1847208570 +9426 427633109 +9427 1432650584 +9428 2044362237 +9429 1230541648 +9430 204200772 +9431 1904610347 +9432 428905657 +9433 1697503309 +9434 1347129077 +9435 133928303 +9436 158947568 +9437 1305490909 +9438 103150602 +9439 1342211451 +9440 686203201 +9441 294371770 +9442 1804062470 +9443 1070201438 +9444 1552919304 +9445 1321783590 +9446 1977666782 +9447 901787204 +9448 1094837903 +9449 991147626 +9450 1834101935 +9451 1749920504 +9452 507772533 +9453 308595273 +9454 1486675921 +9455 1755076971 +9456 8320196 +9457 1914309030 +9458 1040243907 +9459 2052682433 +9460 997367030 +9461 1244444680 +9462 1809809132 +9463 1426272687 +9464 794464341 +9465 1009454561 +9466 1560200990 +9467 953411909 +9468 167461823 +9469 1663351592 +9470 148139712 +9471 853665024 +9472 1957723363 +9473 1952202183 +9474 1923866462 +9475 1363159019 +9476 1126502125 +9477 1754049596 +9478 117462575 +9479 73856380 +9480 597713574 +9481 1951564511 +9482 1823776885 +9483 1105486107 +9484 112676136 +9485 1162969158 +9486 713079430 +9487 120996332 +9488 929794540 +9489 1753323338 +9490 26195117 +9491 1927161570 +9492 850284370 +9493 1836004249 +9494 1205950609 +9495 1644748711 +9496 697975163 +9497 618667951 +9498 450676973 +9499 865436986 +9500 134535895 +9501 598816685 +9502 1719102010 +9503 2092259258 +9504 403535220 +9505 1495484824 +9506 1307934629 +9507 1530037345 +9508 1102050772 +9509 1425397205 +9510 1603893726 +9511 1699764346 +9512 1229478068 +9513 1280186963 +9514 657766806 +9515 1342154204 +9516 295672473 +9517 1370846236 +9518 1463150537 +9519 1225467013 +9520 976685926 +9521 1489345654 +9522 1005144935 +9523 1826970296 +9524 1177866256 +9525 63611896 +9526 1324235360 +9527 1875841419 +9528 682279847 +9529 1774912333 +9530 593794757 +9531 816815742 +9532 226245370 +9533 165413119 +9534 761591353 +9535 629780591 +9536 1660897943 +9537 2069525982 +9538 12334288 +9539 615465067 +9540 1347439539 +9541 1616228014 +9542 167745765 +9543 429433959 +9544 748931329 +9545 825512571 +9546 1771588164 +9547 1044603802 +9548 48875160 +9549 1087255053 +9550 122587167 +9551 1025561086 +9552 429117059 +9553 1127732102 +9554 705047735 +9555 1606983315 +9556 1191343998 +9557 2029283095 +9558 1335341086 +9559 1873623845 +9560 1656711780 +9561 1929135843 +9562 542955940 +9563 1882957150 +9564 2094548962 +9565 1304547293 +9566 365254093 +9567 1607963257 +9568 1226589627 +9569 377588382 +9570 75944676 +9571 426545519 +9572 1993816396 +9573 243690442 +9574 855979478 +9575 595264078 +9576 1069203013 +9577 480083994 +9578 1639867880 +9579 1118078173 +9580 1567339047 +9581 1762455048 +9582 2143639260 +9583 1996456107 +9584 742703502 +9585 701203347 +9586 1455955774 +9587 1934047501 +9588 583002794 +9589 643813213 +9590 1660187698 +9591 92230926 +9592 425465408 +9593 55659990 +9594 1975188076 +9595 372530723 +9596 1360207283 +9597 192958522 +9598 1980493980 +9599 439313263 +9600 570546904 +9601 2056438657 +9602 865858782 +9603 416879652 +9604 152645451 +9605 1721838260 +9606 1012143730 +9607 1221848464 +9608 54438607 +9609 504527963 +9610 192442990 +9611 1621777654 +9612 119499363 +9613 188598602 +9614 1470750113 +9615 862202865 +9616 889801949 +9617 779222240 +9618 648766718 +9619 1472804743 +9620 1423035453 +9621 161470769 +9622 1565035669 +9623 1848500861 +9624 217130759 +9625 1392740097 +9626 73547936 +9627 1577338043 +9628 1585698619 +9629 2054041917 +9630 2016651306 +9631 8761875 +9632 1962996926 +9633 735026440 +9634 425641528 +9635 2115642377 +9636 309381052 +9637 1437785258 +9638 1190007193 +9639 363819659 +9640 1942313221 +9641 1382450183 +9642 1985597314 +9643 2061812584 +9644 1571048785 +9645 1308863779 +9646 776531802 +9647 313367086 +9648 2088086019 +9649 1425298520 +9650 1786171829 +9651 1363637824 +9652 1586769289 +9653 1203723850 +9654 1064655038 +9655 1803900049 +9656 448980300 +9657 1138202974 +9658 1233754444 +9659 2034678919 +9660 1044761243 +9661 1102922102 +9662 2043440795 +9663 860274521 +9664 1837948542 +9665 321598675 +9666 828433250 +9667 2147329594 +9668 1759383933 +9669 2018440444 +9670 363665606 +9671 1554213507 +9672 1253406979 +9673 201779272 +9674 1468542443 +9675 676972117 +9676 1510643051 +9677 97590597 +9678 990339203 +9679 1451245423 +9680 1522889118 +9681 629027385 +9682 667399599 +9683 962174759 +9684 1832751235 +9685 1732054637 +9686 618591160 +9687 134247887 +9688 722773964 +9689 1852345604 +9690 21443159 +9691 1767535207 +9692 807784058 +9693 2064883954 +9694 480326081 +9695 498248952 +9696 238998981 +9697 1308759331 +9698 498094899 +9699 1998382914 +9700 1179716127 +9701 861760505 +9702 1405112773 +9703 285639459 +9704 1063539777 +9705 726171569 +9706 962611576 +9707 426699180 +9708 823762166 +9709 1952950779 +9710 1877944603 +9711 199167636 +9712 434494516 +9713 397860555 +9714 1161342396 +9715 119762104 +9716 2129915192 +9717 1779933556 +9718 254009991 +9719 705205508 +9720 1484795513 +9721 275453150 +9722 325257068 +9723 145095923 +9724 192853456 +9725 805583149 +9726 643344876 +9727 431852437 +9728 2114342480 +9729 1141439775 +9730 282751704 +9731 1146574960 +9732 2003200280 +9733 1687864477 +9734 1432214419 +9735 919256409 +9736 266552398 +9737 247342347 +9738 1345955589 +9739 1090314565 +9740 52809478 +9741 1076416545 +9742 1289482201 +9743 487303995 +9744 1474277100 +9745 303340949 +9746 607066099 +9747 1456708644 +9748 2083274506 +9749 861076090 +9750 14430505 +9751 1420586371 +9752 1136529241 +9753 339687573 +9754 1565682294 +9755 1329382697 +9756 1145270722 +9757 61543522 +9758 1761235135 +9759 1112129554 +9760 1202983297 +9761 2043986839 +9762 111220866 +9763 1058699929 +9764 1584367668 +9765 1543435285 +9766 1977956338 +9767 1850920067 +9768 1790777632 +9769 1176428280 +9770 793750984 +9771 1843587111 +9772 105361177 +9773 2083233185 +9774 183407458 +9775 1579638277 +9776 239090487 +9777 790473557 +9778 888863273 +9779 174881345 +9780 1651549647 +9781 903293778 +9782 1595467716 +9783 640595240 +9784 1242981351 +9785 1013666362 +9786 1969977938 +9787 240768425 +9788 1075209885 +9789 1583729425 +9790 1352897980 +9791 130709534 +9792 1480232616 +9793 1464118846 +9794 1189409464 +9795 917116636 +9796 860070484 +9797 1019882154 +9798 620553055 +9799 503364468 +9800 48826786 +9801 1414304039 +9802 199467931 +9803 154187963 +9804 1350053577 +9805 382875389 +9806 1733826240 +9807 1589144064 +9808 1173348946 +9809 475205866 +9810 1764025409 +9811 677414946 +9812 1378499644 +9813 1212009477 +9814 1318010186 +9815 473997348 +9816 78192191 +9817 1140504476 +9818 714765773 +9819 1153402076 +9820 576750253 +9821 2067663753 +9822 1284111611 +9823 2056982869 +9824 1384298952 +9825 326037427 +9826 826615858 +9827 96885788 +9828 1345919581 +9829 1447168913 +9830 600250256 +9831 1394746368 +9832 713989305 +9833 799718188 +9834 1548934331 +9835 2064042882 +9836 1182593577 +9837 1135276924 +9838 1505703298 +9839 208458876 +9840 1610482790 +9841 1122245059 +9842 885873822 +9843 841498786 +9844 186770888 +9845 56400360 +9846 1315496134 +9847 264963079 +9848 1196904837 +9849 2030261908 +9850 1418365156 +9851 1773655090 +9852 1950442013 +9853 554993119 +9854 1683154312 +9855 1187257317 +9856 881030546 +9857 362286522 +9858 1284143105 +9859 79466479 +9860 1809455435 +9861 1884393362 +9862 1474212847 +9863 375961092 +9864 536627902 +9865 875663531 +9866 292520326 +9867 1719221479 +9868 2010940455 +9869 1798223624 +9870 1927680355 +9871 1473939597 +9872 772985035 +9873 666070529 +9874 167954735 +9875 959755923 +9876 722470890 +9877 1483450870 +9878 1224719003 +9879 1919375727 +9880 1366229130 +9881 495600511 +9882 1545547169 +9883 1169187495 +9884 1050593630 +9885 1081217833 +9886 208961165 +9887 1931624176 +9888 1443504355 +9889 1493104270 +9890 2011090655 +9891 1105476143 +9892 1230013984 +9893 1337819855 +9894 1481437235 +9895 1766641886 +9896 65999738 +9897 1773957562 +9898 1338379718 +9899 2076940193 +9900 1424697538 +9901 1118576425 +9902 1403396142 +9903 50198926 +9904 1784646955 +9905 1571350877 +9906 1009954849 +9907 359634197 +9908 907318099 +9909 87190204 +9910 131526276 +9911 126063581 +9912 582790715 +9913 1677073445 +9914 1295251077 +9915 1633384345 +9916 610807631 +9917 1504212242 +9918 1417524873 +9919 2054311986 +9920 849832864 +9921 1281131881 +9922 1012304481 +9923 2079846849 +9924 471468088 +9925 346258069 +9926 1699005087 +9927 537467826 +9928 2120215631 +9929 889901157 +9930 466924371 +9931 1397429521 +9932 2008477583 +9933 1870320513 +9934 1447628447 +9935 1645640890 +9936 1294187742 +9937 310099649 +9938 2005275087 +9939 54022194 +9940 397289853 +9941 2136801363 +9942 180085775 +9943 980080569 +9944 1666391160 +9945 1475336852 +9946 465981266 +9947 129715143 +9948 832065446 +9949 1883506140 +9950 36543482 +9951 1681898311 +9952 1017154373 +9953 1048847963 +9954 1614261512 +9955 1488622461 +9956 1395106032 +9957 1165782951 +9958 2026090287 +9959 1367838015 +9960 2055684109 +9961 345531010 +9962 617783889 +9963 1916678044 +9964 68367875 +9965 2065412336 +9966 1414835286 +9967 1362555617 +9968 228028337 +9969 1272626725 +9970 1416577811 +9971 625318191 +9972 1261944440 +9973 1596663587 +9974 1605398760 +9975 780851952 +9976 924516791 +9977 2071380026 +9978 910567096 +9979 1756582238 +9980 1807402518 +9981 947110578 +9982 1290996901 +9983 677073243 +9984 1995958541 +9985 757774765 +9986 18212056 +9987 1243580926 +9988 1923557716 +9989 2044302343 +9990 463935293 +9991 1831758177 +9992 242349705 +9993 1081719182 +9994 1600952573 +9995 310717580 +9996 999647871 +9997 868304211 +9998 1673273198 +9999 1227676208 diff --git a/src/test/singlenode_regress/data/incomplete_formatter_data.tbl b/src/test/singlenode_regress/data/incomplete_formatter_data.tbl new file mode 100644 index 00000000000..dd65702c643 Binary files /dev/null and b/src/test/singlenode_regress/data/incomplete_formatter_data.tbl differ diff --git a/src/test/singlenode_regress/data/jsonb.data b/src/test/singlenode_regress/data/jsonb.data new file mode 100644 index 00000000000..622501b236a --- /dev/null +++ b/src/test/singlenode_regress/data/jsonb.data @@ -0,0 +1,1012 @@ +{"line":1, "date":"CB", "node":"AA"} +{"cleaned":false, "status":59, "line":2, "disabled":false, "node":"CBB"} +{"indexed":true, "status":35, "line":3, "disabled":false, "wait":"CAA", "subtitle":"BA", "user":"CCA"} +{"line":4, "disabled":true, "space":"BB"} +{"cleaned":false, "line":5, "wait":"BB", "query":"CAC", "coauthors":"ACA", "node":"CBA"} +{"world":"CB", "query":"CBC", "indexed":false, "line":6, "pos":92, "date":"AAB", "space":"CB", "coauthors":"ACA", "node":"CBC"} +{"state":98, "org":43, "line":7, "pos":97} +{"auth":"BB", "title":"CAC", "query":"BA", "status":94, "line":8, "coauthors":"BBB"} +{"auth":"BAC", "title":"CAA", "wait":"CA", "bad":true, "query":"AA", "indexed":true, "line":9, "pos":56} +{"title":"AAC", "bad":true, "user":"AAB", "query":"AC", "line":10, "node":"AB"} +{"world":"CAC", "user":"AB", "query":"ACA", "indexed":true, "line":11, "space":"CB"} +{"line":12, "pos":72, "abstract":"BBA", "space":"AAC"} +{} +{"world":"CC", "query":"AA", "line":14, "disabled":false, "date":"CAC", "coauthors":"AB"} +{"org":68, "title":"BBB", "query":"BAC", "line":15, "public":false} +{"org":73, "user":"AA", "indexed":true, "line":16, "date":"CCC", "public":true, "coauthors":"AB"} +{"indexed":false, "line":17} +{"state":23, "auth":"BCC", "org":38, "status":28, "line":18, "disabled":false, "abstract":"CB"} +{"state":99, "auth":"CA", "indexed":true, "line":19, "date":"BA"} +{"wait":"CBA", "user":"BBA", "indexed":true, "line":20, "disabled":false, "abstract":"BA", "date":"ABA"} +{"org":10, "query":"AC", "indexed":false, "line":21, "disabled":true, "abstract":"CA", "pos":44} +{"state":65, "title":"AC", "user":"AAC", "cleaned":true, "status":93, "line":22, "abstract":"ABC", "node":"CCC"} +{"subtitle":"AC", "user":"CCC", "line":23} +{"state":67, "world":"ACB", "bad":true, "user":"CB", "line":24, "disabled":true} +{} +{"state":65, "title":"CBC", "wait":"AAC", "bad":true, "query":"ACA", "line":26, "disabled":false, "space":"CA"} +{"auth":"BAA", "state":68, "indexed":true, "line":27, "space":"BA"} +{"indexed":false, "line":28, "disabled":true, "space":"CC", "node":"BB"} +{"auth":"BAB", "org":80, "title":"BBA", "query":"BBC", "status":3, "line":29} +{"title":"AC", "status":16, "cleaned":true, "line":30} +{"state":39, "world":"AAB", "user":"BB", "line":31, "disabled":true} +{"wait":"BC", "bad":false, "query":"AA", "line":32, "coauthors":"CAC"} +{"line":33, "pos":97} +{"title":"AA", "world":"CCA", "wait":"CC", "bad":true, "status":86, "line":34, "disabled":true, "node":"ACA"} +{} +{"world":"BCC", "title":"ACB", "org":61, "status":99, "cleaned":true, "line":36, "pos":76, "space":"ACC", "coauthors":"AA", "node":"CB"} +{"title":"CAA", "cleaned":false, "line":37, "abstract":"ACA", "node":"BC"} +{"auth":"BC", "title":"BA", "world":"ACA", "indexed":true, "line":38, "abstract":"AAA", "public":true} +{"org":90, "line":39, "public":false} +{"state":16, "indexed":true, "line":40, "pos":53} +{"auth":"AAB", "wait":"CAC", "status":44, "line":41} +{"subtitle":"ACA", "bad":true, "line":42} +{"org":19, "world":"BC", "user":"ABA", "indexed":false, "line":43, "disabled":true, "pos":48, "abstract":"CAB", "space":"CCB"} +{"indexed":false, "line":44} +{"indexed":true, "line":45} +{"status":84, "line":46, "date":"CCC"} +{"state":94, "title":"BAB", "bad":true, "user":"BBB", "indexed":true, "line":47, "public":false} +{"org":90, "subtitle":"BAC", "query":"CAC", "cleaned":false, "line":48, "disabled":true, "abstract":"CC", "pos":17, "space":"BCA"} +{"world":"CBC", "line":49} +{"org":24, "line":50, "date":"CA", "public":false} +{"world":"BC", "indexed":true, "status":44, "line":51, "pos":59, "date":"BA", "public":true} +{"org":98, "line":52} +{"title":"CA", "world":"ABC", "subtitle":"CBB", "line":53, "abstract":"BBA", "date":"ACB", "node":"CA"} +{"user":"BAB", "cleaned":true, "line":54} +{"subtitle":"CAA", "line":55, "disabled":false, "pos":55, "abstract":"AB", "public":false, "coauthors":"AA"} +{"wait":"CC", "user":"CC", "cleaned":true, "line":56, "pos":73, "node":"ABC"} +{"title":"BCC", "wait":"ABC", "indexed":true, "line":57, "disabled":false} +{"org":42, "title":"BB", "line":58, "disabled":true, "public":true, "coauthors":"BCC"} +{"wait":"CAB", "title":"CCB", "query":"BAC", "status":66, "line":59, "disabled":true} +{"user":"CAC", "line":60} +{"user":"BBB", "line":61, "disabled":false, "pos":31} +{"org":18, "line":62, "coauthors":"CCC", "node":"CA"} +{"line":63, "coauthors":"AB"} +{"org":25, "wait":"CA", "line":64, "abstract":"BA", "date":"BBB"} +{"title":"CB", "wait":"CC", "bad":false, "user":"BBB", "line":65, "abstract":"ACA", "public":true} +{"line":66, "coauthors":"AC"} +{"state":20, "wait":"CCB", "bad":true, "line":67, "abstract":"CB"} +{"state":79, "wait":"BAC", "bad":false, "status":11, "line":68, "abstract":"BC", "public":true, "coauthors":"CBA"} +{"state":39, "title":"CCA", "bad":false, "query":"BBA", "line":69, "pos":42, "public":false} +{"title":"BC", "subtitle":"CA", "query":"BC", "line":70} +{} +{"bad":true, "query":"BBB", "line":72} +{"state":35, "world":"CC", "bad":false, "line":73, "space":"BB", "public":false} +{"title":"ACC", "wait":"CAB", "subtitle":"CB", "status":19, "line":74, "disabled":false, "space":"BAA", "coauthors":"CBC", "node":"AC"} +{"subtitle":"BCB", "indexed":false, "status":83, "line":75, "public":true} +{"state":32, "line":76, "disabled":false, "pos":66, "space":"CC"} +{"state":43, "cleaned":true, "line":77} +{} +{"state":97, "wait":"CBA", "indexed":false, "cleaned":false, "line":79, "abstract":"CB", "date":"ACC", "public":false} +{"user":"AAB", "line":80, "pos":85, "date":"AC"} +{"world":"AC", "wait":"CC", "subtitle":"AAB", "bad":false, "cleaned":false, "line":81, "pos":91, "node":"CCC"} +{} +{"org":87, "bad":false, "user":"AAC", "query":"CCC", "line":83, "disabled":false, "abstract":"AC", "date":"CCA", "public":false} +{"state":50, "line":84} +{"wait":"AA", "subtitle":"AA", "query":"BB", "status":97, "line":85, "disabled":true, "abstract":"CB"} +{} +{"subtitle":"CA", "query":"BC", "line":87} +{} +{"title":"CC", "line":89, "disabled":false, "pos":49, "date":"CCB", "space":"CB", "node":"BB"} +{"auth":"CC", "wait":"AA", "title":"BC", "bad":true, "line":90} +{"state":37, "org":85, "indexed":false, "line":91, "space":"CAA", "public":true, "coauthors":"BA"} +{"wait":"BBB", "title":"BBC", "org":95, "subtitle":"AC", "line":92, "pos":23, "date":"AC", "public":true, "space":"BBC"} +{"org":48, "user":"AC", "line":93, "space":"CCC"} +{} +{"state":77, "wait":"ABA", "subtitle":"AC", "user":"BA", "status":43, "line":95, "public":false} +{"title":"CA", "indexed":true, "status":26, "line":96} +{"auth":"BCA", "subtitle":"ACC", "user":"CA", "line":97, "disabled":false, "node":"ACB"} +{"query":"BB", "line":98, "coauthors":"AB"} +{} +{"auth":"AA", "title":"ACB", "org":58, "subtitle":"AC", "bad":false, "cleaned":false, "line":100, "space":"ACC", "public":true} +{"subtitle":"AAB", "bad":false, "line":101, "public":true} +{"subtitle":"AAA", "indexed":false, "cleaned":false, "line":102, "disabled":true, "pos":35} +{} +{"world":"CAC", "org":10, "query":"AAA", "cleaned":true, "status":79, "indexed":true, "line":104, "pos":65, "public":false, "node":"BAB"} +{"bad":false, "line":105, "abstract":"BA", "node":"CBB"} +{"world":"BB", "wait":"BAA", "title":"ACA", "line":106, "date":"CBC", "space":"BA"} +{"state":92, "wait":"CAC", "title":"AAA", "bad":false, "line":107, "abstract":"CBC", "date":"BCC", "public":false} +{"title":"CCC", "indexed":true, "line":108, "abstract":"ACB", "public":false, "coauthors":"ABB"} +{"auth":"BB", "query":"ACC", "status":68, "line":109} +{"user":"CC", "cleaned":false, "indexed":true, "line":110, "date":"BAA", "space":"BCB"} +{"auth":"CC", "org":4, "wait":"BAC", "bad":false, "indexed":false, "line":111, "pos":55, "node":"BBC"} +{"line":112, "disabled":true} +{"org":66, "cleaned":true, "indexed":false, "line":113, "pos":96} +{"world":"CA", "title":"ACA", "org":83, "query":"BAC", "user":"BBC", "indexed":false, "line":114} +{"subtitle":"BCC", "line":115, "space":"AA", "public":true, "node":"CBA"} +{"state":77, "status":23, "line":116} +{"bad":false, "status":4, "line":117, "node":"CC"} +{"state":99, "title":"BCC", "query":"AC", "status":98, "line":118, "date":"BA"} +{"status":55, "line":119, "public":false, "coauthors":"BBA", "node":"BCA"} +{"query":"CAA", "status":40, "indexed":false, "line":120, "disabled":false, "coauthors":"CA"} +{"title":"BBC", "org":82, "subtitle":"ACB", "line":121, "abstract":"BB", "node":"CC"} +{"state":66, "world":"AB", "subtitle":"BA", "query":"CB", "line":122, "abstract":"BBC", "pos":65, "date":"BAB"} +{"state":96, "title":"CBC", "status":44, "line":123, "abstract":"BA", "space":"ACA", "node":"AAC"} +{"auth":"CA", "state":59, "bad":false, "cleaned":false, "line":124, "pos":41, "date":"BBA", "coauthors":"ABB"} +{"wait":"ACC", "line":125} +{"org":30, "wait":"CBB", "subtitle":"CCA", "cleaned":true, "line":126, "date":"AC", "node":"ABC"} +{} +{"auth":"BBA", "org":66, "subtitle":"CCB", "bad":true, "cleaned":false, "line":128, "abstract":"BB", "public":true, "coauthors":"BA"} +{"subtitle":"AC", "bad":false, "user":"BAA", "line":129, "date":"BCB", "node":"BAC"} +{"wait":"CC", "subtitle":"CA", "line":130, "disabled":false, "pos":49, "node":"BA"} +{"indexed":false, "line":131, "pos":79, "date":"AAA", "node":"CAC"} +{"wait":"AC", "world":"CB", "title":"AAA", "user":"ABC", "indexed":false, "status":15, "line":132, "coauthors":"BA"} +{"state":96, "bad":true, "line":133, "disabled":false, "space":"BAC", "coauthors":"ABA"} +{"world":"BAC", "line":134} +{"title":"CCC", "line":135, "coauthors":"CC"} +{"cleaned":true, "line":136} +{"bad":true, "query":"CCA", "user":"CA", "cleaned":false, "line":137, "disabled":true} +{} +{"world":"CC", "subtitle":"BBB", "line":139} +{"wait":"CA", "status":2, "line":140} +{"world":"BC", "bad":false, "user":"BBC", "query":"ACB", "line":141, "pos":33, "space":"ACA"} +{"state":92, "title":"CA", "bad":true, "query":"AB", "line":142, "abstract":"BA", "date":"ABB", "space":"BC", "coauthors":"CAA"} +{"state":79, "query":"AB", "user":"CCA", "indexed":true, "cleaned":true, "line":143, "public":true} +{"org":37, "query":"CA", "cleaned":true, "line":144, "disabled":true, "date":"CC"} +{"wait":"AC", "title":"CBA", "user":"AAA", "status":24, "line":145, "date":"CBC", "public":false, "coauthors":"BAC", "node":"ACC"} +{"user":"CA", "indexed":true, "line":146, "disabled":false, "coauthors":"BA"} +{"wait":"BC", "org":35, "bad":false, "query":"CBB", "line":147, "date":"AAA", "public":false, "space":"BBB"} +{"org":56, "user":"AB", "indexed":true, "line":148} +{} +{"title":"CBB", "org":78, "subtitle":"CBA", "bad":true, "user":"AAB", "line":150, "disabled":true, "abstract":"BAC"} +{"world":"CCA", "query":"BC", "cleaned":true, "indexed":false, "line":151, "abstract":"BC", "pos":43, "coauthors":"AB", "node":"CBA"} +{"auth":"ABA", "status":13, "line":152, "date":"AA"} +{"world":"CA", "line":153, "space":"CBC"} +{"world":"BA", "user":"BBB", "status":72, "line":154} +{"auth":"ABB", "line":155, "disabled":true, "node":"BBC"} +{"world":"BBB", "bad":false, "line":156, "abstract":"CBC"} +{"line":157, "pos":60, "node":"ACC"} +{"line":158, "node":"CC"} +{"line":159, "public":true} +{} +{"query":"BA", "status":53, "cleaned":false, "line":161, "public":true} +{"line":162, "date":"CC"} +{} +{"title":"BC", "bad":false, "query":"CC", "line":164, "abstract":"CCB", "date":"BA"} +{"status":36, "line":165} +{"title":"AB", "bad":false, "status":64, "line":166, "abstract":"AB", "coauthors":"AA", "node":"AA"} +{"wait":"AA", "line":167} +{"subtitle":"CBC", "user":"AC", "cleaned":false, "line":168, "disabled":true, "coauthors":"BAB", "node":"CC"} +{"state":34, "status":73, "cleaned":true, "line":169, "abstract":"BC", "public":false, "space":"BBC", "node":"BAA"} +{"state":10, "auth":"BBB", "bad":true, "indexed":false, "status":34, "line":170, "abstract":"BC"} +{"subtitle":"AAA", "bad":false, "user":"ACA", "status":53, "line":171, "disabled":false, "date":"AAA"} +{"subtitle":"CB", "query":"CC", "indexed":true, "line":172, "node":"BBC"} +{"state":5, "world":"ABC", "bad":false, "line":173, "public":false} +{"subtitle":"AC", "line":174} +{"auth":"AC", "org":72, "query":"CA", "indexed":false, "cleaned":true, "line":175, "disabled":true, "pos":54} +{"title":"BCB", "bad":false, "line":176, "pos":35, "coauthors":"AAC", "node":"ABB"} +{"title":"BB", "cleaned":true, "status":26, "line":177} +{"state":61, "wait":"BB", "world":"CB", "query":"BAB", "line":178, "abstract":"BB", "date":"CBB", "space":"CA", "node":"AB"} +{"wait":"CA", "cleaned":false, "indexed":true, "line":179, "space":"CBC"} +{"org":68, "line":180} +{"wait":"ABB", "subtitle":"CCC", "cleaned":true, "line":181, "abstract":"BC", "coauthors":"BA"} +{"title":"ACA", "subtitle":"AAB", "line":182, "node":"BAC"} +{} +{} +{"subtitle":"BA", "query":"BBB", "indexed":true, "cleaned":true, "line":185, "node":"BCC"} +{"org":6, "title":"BCC", "user":"BA", "line":186, "pos":67, "abstract":"CBA", "coauthors":"CBB", "node":"CBC"} +{"org":50, "title":"CAB", "subtitle":"CB", "query":"CBB", "line":187, "coauthors":"CA", "node":"CC"} +{"bad":false, "line":188, "node":"CCB"} +{"org":4, "world":"AAC", "query":"CAC", "line":189, "pos":90, "node":"AC"} +{"state":86, "line":190, "pos":79} +{"org":98, "title":"AAC", "cleaned":true, "line":191, "space":"BC", "coauthors":"AA"} +{"wait":"CAA", "bad":false, "user":"BC", "status":23, "line":192, "disabled":true, "date":"CA", "coauthors":"BBB"} +{"status":26, "line":193, "disabled":true} +{"world":"CA", "subtitle":"CCC", "query":"ABB", "status":86, "line":194, "pos":97, "space":"CAC"} +{"cleaned":true, "line":195} +{"state":53, "org":84, "wait":"BC", "query":"BCC", "line":196, "disabled":true, "abstract":"AAC", "node":"CAC"} +{"state":25, "status":70, "cleaned":false, "line":197, "disabled":true, "space":"AA", "public":false} +{"org":82, "subtitle":"AAC", "line":198} +{"org":87, "bad":true, "status":69, "line":199, "public":false} +{"wait":"CC", "org":60, "subtitle":"BCA", "bad":true, "cleaned":false, "indexed":true, "line":200, "date":"BA"} +{"state":9, "world":"CAA", "org":78, "user":"ACB", "cleaned":true, "line":201, "disabled":true, "abstract":"ACC", "public":false} +{"state":50, "world":"AAA", "title":"CAA", "user":"AB", "status":37, "line":202, "disabled":false} +{"org":36, "subtitle":"CB", "query":"BAA", "status":35, "line":203, "abstract":"CC"} +{"auth":"CCC", "bad":true, "query":"CB", "status":84, "line":204, "disabled":false, "date":"BB"} +{"auth":"AC", "query":"BA", "indexed":false, "line":205, "date":"AAB", "space":"ABB"} +{"state":30, "world":"CCA", "query":"CC", "user":"BAA", "line":206} +{"title":"CAB", "wait":"BAB", "bad":true, "query":"BCB", "indexed":true, "status":48, "cleaned":true, "line":207, "node":"ACB"} +{"state":97, "subtitle":"BC", "status":99, "line":208, "abstract":"CB"} +{"title":"CA", "world":"BBA", "bad":true, "indexed":false, "cleaned":false, "status":82, "line":209, "disabled":false, "pos":44, "space":"ACA"} +{"line":210, "public":true} +{"line":211, "space":"BBC", "node":"AAA"} +{"wait":"BAA", "org":50, "line":212, "abstract":"BB", "public":true, "space":"AB"} +{"line":213, "pos":57, "date":"CC", "space":"AC"} +{"state":23, "user":"BAB", "query":"BCB", "line":214, "abstract":"BAB"} +{"world":"ACB", "org":21, "line":215, "abstract":"AC", "public":false} +{"state":14, "wait":"ACB", "org":79, "title":"BB", "subtitle":"BA", "line":216} +{"wait":"BC", "line":217, "date":"BB"} +{"wait":"AC", "user":"BB", "indexed":false, "status":83, "line":218} +{"auth":"BC", "org":9, "user":"BA", "status":31, "line":219, "disabled":false} +{"state":80, "world":"BA", "wait":"CA", "line":220, "pos":65, "node":"CAC"} +{"wait":"AC", "subtitle":"ABB", "status":79, "indexed":true, "line":221, "abstract":"AC", "pos":33, "space":"BA"} +{"state":69, "org":83, "world":"CBC", "subtitle":"CAC", "cleaned":false, "line":222, "space":"BC", "node":"CCA"} +{"line":223, "abstract":"BC"} +{} +{"world":"BB", "title":"BC", "bad":false, "query":"BBC", "cleaned":false, "line":225, "disabled":false, "public":true} +{"line":226, "date":"AC"} +{"auth":"CB", "subtitle":"AB", "indexed":false, "status":2, "line":227, "pos":53, "space":"AB", "coauthors":"BCA"} +{"title":"ABA", "org":36, "line":228, "space":"AA"} +{"world":"AB", "line":229, "pos":78, "date":"BC", "space":"CC"} +{"wait":"BBC", "org":47, "cleaned":true, "status":5, "line":230, "pos":2, "date":"CCA"} +{"line":231, "coauthors":"CB"} +{"state":1, "user":"CAA", "cleaned":false, "line":232, "date":"BA", "public":true, "coauthors":"AAA", "node":"BCC"} +{"auth":"AB", "world":"CAC", "query":"BC", "cleaned":true, "line":233, "pos":47, "space":"AB", "node":"AB"} +{"title":"CAA", "line":234, "pos":9, "public":true, "node":"AB"} +{"auth":"CCA", "title":"AA", "org":6, "subtitle":"CA", "cleaned":true, "status":12, "indexed":false, "line":235, "space":"ABB"} +{"auth":"CA", "bad":false, "query":"BC", "status":61, "cleaned":false, "line":236, "disabled":true, "public":true} +{"user":"BCB", "line":237, "pos":70, "node":"CBA"} +{"query":"CCB", "line":238, "disabled":true, "coauthors":"BAB", "node":"BC"} +{"auth":"AC", "org":73, "title":"CA", "bad":false, "status":94, "line":239, "abstract":"CC"} +{"subtitle":"BC", "indexed":false, "line":240, "disabled":true} +{"auth":"AAC", "org":73, "title":"CB", "bad":true, "query":"CA", "cleaned":true, "line":241, "disabled":false, "public":false} +{"line":242, "public":false} +{"auth":"AC", "title":"BC", "status":61, "line":243, "disabled":false} +{"auth":"ABB", "bad":false, "indexed":false, "line":244, "abstract":"BAB", "date":"ABC", "coauthors":"BC"} +{"query":"BA", "line":245, "disabled":false, "space":"BAB"} +{"world":"BCC", "bad":false, "indexed":false, "line":246, "disabled":true, "pos":80, "public":false, "coauthors":"BC"} +{"indexed":true, "line":247} +{"wait":"CCA", "subtitle":"CBB", "bad":false, "line":248, "pos":83, "public":false, "space":"BA"} +{} +{"auth":"ABA", "org":13, "title":"BA", "bad":false, "indexed":true, "line":250, "disabled":false, "abstract":"BBA", "date":"AB"} +{"state":37, "title":"AAA", "bad":false, "line":251, "disabled":false, "coauthors":"CBC"} +{"auth":"ACB", "world":"AC", "title":"CAA", "subtitle":"BCA", "bad":false, "status":32, "line":252, "pos":84} +{"query":"BA", "indexed":false, "status":0, "line":253, "abstract":"CCB", "pos":48, "date":"AC", "space":"AAC"} +{"subtitle":"BBA", "line":254, "node":"AAA"} +{"query":"AC", "user":"CAA", "status":13, "line":255, "public":true, "coauthors":"BCC"} +{"auth":"AAA", "state":31, "line":256} +{} +{} +{"wait":"AC", "query":"AAA", "cleaned":true, "indexed":false, "line":259, "pos":89, "coauthors":"BCA", "node":"BC"} +{"world":"CC", "query":"BB", "line":260} +{} +{"org":99, "bad":false, "user":"ABA", "line":262, "abstract":"BA", "coauthors":"BCC"} +{"auth":"CAC", "world":"CBC", "subtitle":"CA", "bad":false, "status":22, "line":263, "pos":4, "public":true, "node":"BB"} +{"wait":"BB", "subtitle":"BCC", "indexed":true, "line":264, "node":"CAC"} +{"subtitle":"BB", "query":"CBB", "line":265} +{"state":35, "query":"AA", "line":266, "coauthors":"AAA"} +{"status":6, "line":267, "pos":66} +{"auth":"BAA", "subtitle":"CCA", "bad":false, "query":"CCB", "line":268, "public":true, "space":"CAB", "node":"CAC"} +{"world":"AC", "org":58, "user":"AC", "line":269, "node":"AB"} +{"auth":"BCB", "org":36, "title":"AB", "line":270, "abstract":"CAB", "date":"CAB", "public":true, "coauthors":"CB", "node":"AB"} +{"cleaned":true, "line":271} +{"world":"ACC", "cleaned":true, "status":11, "line":272, "disabled":false, "abstract":"AA", "space":"BCA", "node":"BA"} +{"cleaned":true, "line":273, "pos":50, "public":true} +{"status":95, "line":274, "abstract":"BB", "coauthors":"AC"} +{"auth":"BCC", "state":80, "cleaned":true, "line":275, "abstract":"AC"} +{"wait":"BA", "line":276} +{"org":62, "subtitle":"CAA", "query":"BA", "user":"BCC", "indexed":false, "line":277, "disabled":false, "abstract":"ACA", "date":"AB"} +{"org":63, "bad":true, "line":278, "pos":26, "coauthors":"BA"} +{"auth":"CBB", "indexed":false, "line":279, "pos":40, "space":"CA", "coauthors":"CC"} +{"auth":"BA", "line":280, "abstract":"AAA", "public":true, "coauthors":"CAC"} +{"org":10, "status":16, "line":281, "date":"CCC", "space":"AC"} +{"org":76, "user":"BBC", "indexed":false, "line":282, "pos":56, "node":"CBA"} +{"auth":"CA", "subtitle":"AB", "query":"AA", "indexed":true, "line":283, "disabled":false, "coauthors":"ABC", "node":"CAA"} +{"title":"BA", "status":91, "line":284, "pos":7, "coauthors":"BB"} +{"wait":"CCA", "line":285, "public":true} +{"world":"AC", "line":286, "disabled":true} +{"line":287, "abstract":"AAA"} +{"user":"CCB", "status":50, "line":288, "public":false} +{"state":41, "world":"CCC", "query":"AA", "line":289, "disabled":true, "pos":49, "public":false} +{"wait":"CBC", "line":290, "abstract":"CCA", "space":"BBC"} +{"auth":"CCB", "world":"BAB", "user":"CCC", "status":93, "line":291, "pos":77, "node":"BAC"} +{"wait":"BCC", "org":8, "user":"AC", "cleaned":true, "line":292, "disabled":true, "pos":67, "date":"AA"} +{"org":56, "query":"BCA", "line":293, "pos":81, "coauthors":"AAA", "node":"CAB"} +{"world":"CB", "subtitle":"CBC", "bad":true, "query":"ACB", "indexed":false, "line":294, "pos":58, "date":"BC", "node":"CB"} +{"wait":"BC", "user":"CA", "line":295} +{"world":"ABA", "wait":"BA", "user":"BB", "status":65, "line":296, "pos":45, "date":"BB"} +{} +{} +{"auth":"BA", "user":"AA", "indexed":false, "line":299, "space":"ABA", "public":false, "coauthors":"BC"} +{"line":300, "space":"ABA"} +{"state":36, "org":16, "world":"BBC", "status":13, "line":301, "public":false} +{"subtitle":"CB", "user":"BC", "line":302, "date":"AA", "coauthors":"CAC"} +{"wait":"CBC", "indexed":true, "cleaned":true, "line":303, "date":"ACC", "public":true} +{"user":"CAC", "status":81, "line":304, "node":"CAB"} +{"title":"CBB", "org":89, "subtitle":"CAA", "user":"CCA", "indexed":true, "line":305} +{"state":10, "title":"CBA", "org":66, "cleaned":true, "line":306, "pos":59, "coauthors":"CAC"} +{} +{"auth":"AAA", "world":"AC", "wait":"ACA", "subtitle":"BAA", "status":64, "line":308, "node":"CCA"} +{"state":31, "world":"CCC", "title":"BCB", "cleaned":false, "status":11, "line":309, "disabled":true, "date":"AA"} +{"title":"BC", "subtitle":"CB", "indexed":false, "line":310, "disabled":true, "abstract":"BA", "space":"ACA"} +{"wait":"ABB", "cleaned":true, "indexed":false, "line":311, "space":"CAB"} +{} +{"subtitle":"CA", "line":313} +{"org":91, "title":"CAB", "line":314, "date":"CA"} +{} +{"state":65, "line":316, "node":"CC"} +{"line":317, "space":"AA"} +{} +{"wait":"AA", "indexed":true, "line":319} +{"wait":"BB", "org":42, "world":"AC", "subtitle":"ACC", "indexed":true, "line":320, "disabled":true} +{} +{"auth":"CAC", "line":322} +{} +{"line":324, "pos":38, "space":"CC", "node":"BBC"} +{"title":"CC", "line":325, "public":true, "coauthors":"BAC", "node":"ACC"} +{"world":"CC", "subtitle":"BBC", "bad":false, "user":"BA", "line":326, "date":"AAA", "space":"AA"} +{"state":81, "title":"BC", "wait":"BA", "indexed":false, "status":48, "line":327, "coauthors":"AB"} +{"line":328, "space":"ABB"} +{"line":329, "date":"CCA"} +{} +{"auth":"BB", "world":"BAB", "subtitle":"BA", "query":"ABB", "line":331, "disabled":true, "date":"AAA", "node":"BC"} +{"auth":"ABA", "title":"CC", "user":"CBA", "line":332, "disabled":true, "space":"ACC"} +{"org":98, "subtitle":"ACB", "line":333, "abstract":"BC", "public":false, "coauthors":"BC", "node":"ABA"} +{} +{"world":"BC", "subtitle":"BAC", "user":"AB", "query":"BAA", "cleaned":true, "line":335, "space":"AC", "node":"BAA"} +{"state":76, "indexed":true, "cleaned":false, "line":336, "node":"CAC"} +{"org":95, "status":84, "line":337} +{} +{"world":"BBA", "title":"BCC", "subtitle":"ACB", "query":"BA", "line":339, "space":"ABC", "node":"AC"} +{"title":"CBB", "user":"CBA", "cleaned":true, "line":340, "public":true, "space":"CB", "coauthors":"CAB"} +{"wait":"AA", "status":82, "line":341} +{"world":"CC", "line":342} +{"auth":"BAB", "title":"CAC", "query":"BCC", "indexed":true, "line":343} +{"org":77, "world":"BAC", "subtitle":"AA", "user":"ABA", "line":344} +{"state":99, "org":56, "world":"CC", "title":"CAB", "wait":"CB", "subtitle":"BCC", "line":345, "pos":65} +{"state":68, "org":97, "title":"AA", "indexed":true, "line":346, "node":"CC"} +{"state":3, "title":"CBC", "user":"BAA", "status":98, "line":347, "disabled":true, "pos":96, "date":"BBA"} +{"auth":"BAA", "world":"ABB", "line":348, "disabled":false, "abstract":"ACA", "pos":66, "space":"CCC", "coauthors":"CBB", "node":"BC"} +{} +{"status":54, "line":350} +{"wait":"CC", "query":"ABA", "user":"AB", "status":76, "cleaned":false, "line":351, "abstract":"CBA"} +{"line":352, "disabled":true, "public":false} +{"state":93, "org":92, "status":88, "line":353, "space":"AB", "coauthors":"CB"} +{"org":34, "wait":"ABC", "world":"CBA", "bad":false, "query":"BB", "indexed":false, "line":354, "date":"CB", "public":true} +{"wait":"CBA", "title":"CAC", "cleaned":true, "indexed":true, "line":355, "pos":9, "date":"CAA"} +{"user":"BC", "indexed":false, "cleaned":true, "status":73, "line":356, "disabled":true, "space":"CB"} +{"state":20, "cleaned":false, "line":357, "pos":28, "abstract":"CCB", "space":"BC"} +{"state":17, "wait":"ABC", "query":"CB", "cleaned":false, "status":4, "line":358, "disabled":false} +{} +{"state":83, "world":"CC", "org":53, "cleaned":false, "status":64, "line":360, "abstract":"CBC", "coauthors":"BC"} +{"title":"BB", "indexed":false, "line":361} +{"state":49, "wait":"BCA", "line":362} +{"world":"CCC", "title":"CA", "query":"CCC", "cleaned":true, "line":363, "space":"AA", "coauthors":"AAC"} +{"state":8, "wait":"BBB", "line":364, "pos":70, "public":false, "space":"BAA", "coauthors":"AB"} +{"state":20, "indexed":false, "status":87, "cleaned":true, "line":365, "public":true} +{} +{"state":92, "title":"CCC", "subtitle":"CAB", "status":39, "line":367} +{"state":54, "org":38, "line":368} +{} +{"auth":"ACA", "subtitle":"CBC", "status":52, "line":370, "date":"ACC", "public":true} +{"indexed":true, "line":371, "pos":98, "node":"CBA"} +{"world":"BA", "status":40, "line":372, "coauthors":"AA"} +{} +{"query":"BA", "indexed":false, "cleaned":true, "line":374, "date":"BCC"} +{"query":"CA", "indexed":true, "line":375, "public":false} +{"auth":"CCA", "wait":"BBC", "bad":false, "status":91, "line":376, "abstract":"BBC", "date":"ABA"} +{"user":"BA", "query":"CB", "status":86, "indexed":false, "line":377, "pos":83, "abstract":"BCC", "space":"CBC", "public":true} +{"title":"ACA", "org":15, "wait":"CBC", "status":85, "line":378} +{"state":57, "bad":true, "line":379, "abstract":"BC", "date":"CAC"} +{"world":"CC", "cleaned":true, "line":380} +{"title":"CB", "subtitle":"AC", "line":381, "public":false} +{} +{} +{"status":12, "line":384, "coauthors":"CC"} +{"auth":"BAC", "bad":false, "line":385, "abstract":"CBB", "public":false, "space":"BBC"} +{} +{} +{"world":"BBC", "bad":true, "status":71, "cleaned":false, "line":388, "node":"BB"} +{"cleaned":false, "line":389} +{"state":73, "line":390} +{"wait":"BB", "org":5, "subtitle":"BAA", "bad":false, "indexed":false, "line":391, "public":false, "node":"BAA"} +{"auth":"CCC", "org":51, "bad":false, "cleaned":true, "line":392, "space":"AC", "node":"CC"} +{} +{"line":394, "abstract":"ACC", "public":true} +{"org":44, "subtitle":"BAC", "query":"BAC", "line":395} +{"wait":"BC", "line":396} +{"state":68, "world":"AB", "title":"ABB", "user":"CBC", "cleaned":false, "indexed":true, "line":397, "abstract":"BA", "pos":11} +{"world":"CA", "title":"AB", "subtitle":"BC", "user":"BCB", "line":398} +{"bad":true, "query":"BCC", "line":399} +{"wait":"BB", "user":"BB", "cleaned":true, "indexed":false, "line":400, "date":"BC", "public":false} +{} +{"wait":"BA", "line":402} +{"title":"AC", "subtitle":"BCB", "query":"BA", "line":403} +{} +{"auth":"BA", "org":19, "query":"CCB", "line":405, "pos":82, "date":"CAA"} +{"state":26, "world":"CB", "subtitle":"AB", "cleaned":false, "line":406, "disabled":true, "date":"AC"} +{} +{"state":11, "bad":true, "indexed":true, "line":408, "pos":79, "abstract":"BA", "date":"CB", "space":"BBA"} +{"auth":"AC", "status":59, "line":409} +{"org":15, "line":410, "disabled":true, "date":"BAC", "space":"CCA"} +{} +{} +{"state":65, "world":"AB", "status":69, "line":413, "space":"BA"} +{} +{"title":"CCB", "line":415} +{"title":"BAB", "subtitle":"CA", "indexed":false, "line":416, "public":true} +{"wait":"CAB", "user":"CAB", "cleaned":true, "line":417, "date":"BC", "coauthors":"BBA"} +{"subtitle":"ABA", "user":"BB", "query":"AA", "indexed":true, "line":418, "pos":8, "space":"BB", "coauthors":"CBA"} +{"state":11, "indexed":true, "line":419, "node":"AA"} +{"state":86, "cleaned":false, "line":420, "pos":2, "node":"CBC"} +{"org":73, "line":421, "disabled":false} +{"query":"BAC", "user":"CB", "status":69, "line":422} +{"status":22, "line":423} +{"auth":"CB", "wait":"CCA", "world":"AAB", "line":424, "disabled":false, "space":"BA", "public":false} +{"state":81, "world":"AC", "subtitle":"CBA", "bad":true, "cleaned":false, "indexed":true, "line":425, "date":"AAB", "coauthors":"BC", "node":"BAC"} +{"wait":"CB", "query":"BCC", "status":97, "line":426} +{"org":47, "query":"CB", "cleaned":true, "line":427, "date":"CC"} +{"org":33, "query":"AC", "status":48, "indexed":false, "line":428, "disabled":true, "abstract":"BC", "space":"ACC"} +{"org":10, "query":"AB", "line":429, "pos":77, "date":"BC"} +{"line":430, "pos":7, "abstract":"CCA", "space":"AA"} +{"bad":false, "user":"CA", "query":"CAB", "line":431, "node":"AC"} +{"auth":"CA", "bad":false, "line":432} +{} +{"auth":"BAA", "org":98, "title":"CCC", "world":"BAC", "line":434, "public":true} +{"state":54, "wait":"AA", "user":"BBA", "indexed":false, "line":435, "disabled":true, "pos":12, "space":"AB"} +{"world":"AC", "title":"CA", "query":"AAA", "line":436, "space":"AB", "coauthors":"AA"} +{"auth":"CB", "wait":"CCC", "bad":false, "line":437, "pos":42, "date":"ABC", "space":"AB", "coauthors":"ABC"} +{"auth":"CBB", "title":"BB", "query":"CB", "line":438, "pos":15, "abstract":"BC", "node":"BBB"} +{"title":"CC", "line":439, "disabled":false} +{"title":"AB", "line":440, "disabled":false} +{"org":3, "bad":true, "user":"BCB", "query":"AB", "indexed":false, "cleaned":true, "line":441, "disabled":false, "space":"BA", "node":"BB"} +{"state":62, "user":"BCC", "status":12, "line":442, "pos":58, "date":"CC", "node":"CB"} +{"world":"BCB", "bad":true, "line":443, "space":"AAB"} +{"state":56, "bad":false, "cleaned":false, "line":444, "disabled":false, "date":"CA", "space":"BBB", "public":true} +{} +{"org":31, "world":"ABC", "cleaned":true, "line":446, "disabled":true, "public":true, "coauthors":"CB"} +{"state":54, "indexed":true, "line":447} +{"state":98, "title":"AC", "wait":"AAC", "world":"BC", "bad":false, "line":448, "disabled":true, "public":true, "node":"ABB"} +{"world":"AAC", "indexed":true, "line":449, "disabled":true, "pos":61} +{"org":56, "title":"CA", "line":450} +{"auth":"BBB", "line":451, "pos":58, "date":"BB", "space":"ABA"} +{"auth":"AB", "world":"CA", "cleaned":true, "line":452} +{"bad":true, "line":453, "disabled":true, "abstract":"AC", "pos":20, "date":"ABB", "node":"CAB"} +{} +{"state":91, "wait":"AC", "org":96, "world":"AA", "subtitle":"BBC", "query":"AA", "cleaned":true, "line":455, "public":false} +{"status":99, "line":456, "disabled":true} +{"org":86, "line":457, "public":true, "coauthors":"AC"} +{"status":14, "cleaned":true, "line":458, "disabled":true} +{"world":"AB", "user":"CB", "query":"AAB", "line":459, "pos":66, "public":false, "node":"BBA"} +{"state":58, "world":"BB", "wait":"CBA", "title":"BCA", "line":460, "pos":95, "abstract":"CCA", "space":"BC", "coauthors":"CB"} +{} +{"auth":"CAC", "title":"AB", "query":"BBA", "user":"CB", "line":462, "abstract":"BCC", "pos":89, "coauthors":"ABB"} +{"org":13, "bad":false, "query":"AA", "status":49, "line":463, "disabled":false} +{"bad":true, "cleaned":false, "line":464, "coauthors":"BB"} +{"org":14, "query":"BA", "line":465, "pos":25, "abstract":"BBA", "space":"AAA", "node":"CAC"} +{"org":63, "title":"CA", "subtitle":"ACC", "query":"BAC", "status":76, "line":466, "abstract":"ACA"} +{"wait":"BA", "subtitle":"BC", "line":467, "disabled":false, "abstract":"AC"} +{"org":76, "title":"CA", "query":"AB", "line":468, "public":false} +{"state":95, "world":"AC", "bad":false, "status":65, "cleaned":false, "line":469, "disabled":false} +{"wait":"AB", "subtitle":"AA", "bad":false, "user":"CC", "query":"BBC", "status":6, "line":470, "date":"CCC"} +{"state":82, "bad":true, "indexed":true, "line":471, "date":"BB", "coauthors":"AAA"} +{} +{"state":12, "auth":"ACB", "world":"CBC", "bad":false, "indexed":true, "line":473, "date":"CA", "space":"ABB", "coauthors":"CC"} +{"subtitle":"AA", "bad":false, "user":"ACC", "line":474, "pos":86, "abstract":"CAC", "space":"BBA"} +{"cleaned":true, "line":475} +{"title":"CC", "wait":"BB", "status":6, "line":476, "abstract":"ACC", "date":"CB", "space":"BA", "public":true} +{"state":96, "wait":"BA", "org":30, "subtitle":"BB", "user":"CBB", "status":19, "line":477} +{"state":78, "org":99, "title":"CC", "line":478, "node":"BAB"} +{"world":"CBC", "bad":false, "line":479, "date":"ACB", "public":true, "node":"CB"} +{"state":0, "query":"ABC", "status":65, "line":480, "disabled":true, "space":"CBA", "node":"BA"} +{"auth":"BAC", "org":24, "subtitle":"BBC", "bad":false, "user":"CAC", "line":481, "date":"BBB", "public":true, "coauthors":"CBA"} +{"org":18, "bad":true, "cleaned":false, "status":3, "indexed":true, "line":482, "date":"BB", "coauthors":"ACC"} +{"wait":"CB", "user":"AC", "line":483, "disabled":false} +{"world":"AC", "subtitle":"AA", "query":"AAB", "line":484, "disabled":true, "space":"CAA"} +{"line":485, "pos":2, "space":"CA"} +{"org":42, "indexed":false, "line":486, "date":"CB"} +{"org":3, "wait":"CAA", "subtitle":"CA", "cleaned":true, "line":487, "disabled":true} +{"org":68, "subtitle":"CCB", "query":"CAA", "cleaned":false, "status":46, "line":488, "pos":87, "public":false, "node":"BC"} +{} +{"status":60, "cleaned":false, "line":490, "space":"CC", "node":"BCB"} +{"state":42, "org":9, "subtitle":"CBA", "user":"BA", "status":96, "line":491, "pos":36} +{"state":16, "title":"BCC", "user":"ABC", "indexed":false, "status":24, "line":492, "disabled":true, "node":"CBC"} +{"auth":"CC", "wait":"BBB", "line":493, "disabled":false, "public":false, "coauthors":"AB"} +{} +{"wait":"BB", "title":"BBC", "subtitle":"BA", "status":3, "cleaned":false, "line":495, "disabled":false, "coauthors":"AB", "node":"BAC"} +{} +{"query":"CC", "indexed":false, "line":497, "coauthors":"CAC", "node":"BC"} +{"auth":"BBA", "state":68, "line":498} +{"state":21, "title":"CCB", "wait":"AAA", "subtitle":"CCC", "user":"BAA", "indexed":true, "line":499, "coauthors":"BB"} +{"auth":"AAA", "subtitle":"CC", "bad":true, "user":"CC", "indexed":true, "line":500, "disabled":true, "date":"AB", "node":"AC"} +{"auth":"BB", "title":"CCA", "user":"BA", "cleaned":true, "line":501, "pos":37, "space":"BA", "public":false} +{"auth":"BCA", "line":502, "date":"BA"} +{"world":"ABA", "bad":true, "indexed":false, "line":503, "disabled":true, "abstract":"AC", "pos":1, "public":false} +{"auth":"BBB", "subtitle":"ACB", "line":504, "space":"AC", "node":"BB"} +{"auth":"CAC", "state":19, "title":"ACA", "wait":"BA", "query":"CC", "line":505} +{"subtitle":"BC", "cleaned":false, "indexed":false, "line":506, "date":"CAB", "public":false, "node":"ABC"} +{"state":87, "wait":"CCC", "query":"CAC", "user":"CBB", "line":507, "abstract":"BBC", "date":"AA", "coauthors":"CA"} +{"auth":"AC", "subtitle":"BC", "bad":false, "query":"ABA", "user":"CBB", "indexed":true, "cleaned":false, "line":508, "coauthors":"BA"} +{"auth":"AA", "title":"ABA", "subtitle":"CCA", "query":"CC", "line":509, "pos":27, "node":"CBB"} +{"org":5, "title":"CAC", "subtitle":"BBB", "line":510, "pos":76, "abstract":"AAB", "space":"AA"} +{"bad":true, "line":511} +{"wait":"ACB", "indexed":false, "line":512} +{"auth":"CBA", "world":"BA", "bad":true, "user":"CBA", "query":"CC", "line":513, "public":false, "coauthors":"CC"} +{} +{"state":97, "wait":"BB", "line":515, "date":"CBC", "space":"CA"} +{"auth":"CBC", "line":516, "disabled":true} +{"state":91, "user":"CCA", "line":517, "coauthors":"BA", "node":"CBA"} +{"bad":false, "cleaned":true, "line":518, "space":"AAB"} +{} +{"title":"CA", "cleaned":false, "status":38, "line":520} +{"auth":"BCA", "world":"AC", "org":71, "user":"CA", "line":521, "abstract":"AAB"} +{"bad":true, "line":522, "pos":28, "abstract":"BAA"} +{"line":523, "coauthors":"CBC", "node":"AAB"} +{"status":51, "cleaned":false, "line":524} +{"query":"AAB", "line":525, "disabled":true, "date":"AA", "public":true, "coauthors":"CA"} +{"org":15, "user":"AC", "cleaned":false, "line":526, "coauthors":"CAC", "node":"BAB"} +{"world":"ABA", "line":527, "disabled":true, "public":true} +{"auth":"BBC", "state":48, "bad":false, "line":528, "abstract":"BB", "date":"BAC", "space":"BA", "public":true} +{"auth":"BA", "wait":"CAC", "subtitle":"ABC", "query":"CB", "indexed":false, "cleaned":false, "line":529, "disabled":true, "date":"CA"} +{"wait":"AC", "world":"ABA", "org":55, "bad":true, "indexed":true, "line":530, "pos":32, "space":"BCA", "public":true} +{"title":"CBC", "wait":"BAA", "line":531} +{"world":"AA", "line":532, "pos":35, "space":"AAB", "public":true} +{"line":533, "space":"AB", "coauthors":"BA"} +{"auth":"CBC", "world":"BB", "line":534, "space":"ACA", "coauthors":"CBB"} +{"wait":"ACA", "status":47, "line":535, "public":true, "node":"BAA"} +{"org":16, "subtitle":"BBB", "line":536, "abstract":"AC", "space":"CB", "coauthors":"CC", "node":"CBC"} +{"wait":"AAB", "line":537, "abstract":"AB", "space":"CAC"} +{"query":"CAC", "line":538} +{"world":"AC", "query":"AAA", "indexed":false, "status":18, "line":539, "pos":62, "space":"BC", "coauthors":"BAC"} +{"org":30, "world":"AA", "query":"BC", "user":"BAC", "status":12, "cleaned":true, "line":540, "space":"AB"} +{"org":30, "user":"CCB", "query":"BB", "cleaned":false, "line":541, "disabled":true, "public":true, "node":"CBA"} +{} +{"subtitle":"ABB", "bad":true, "line":543} +{"subtitle":"BBB", "bad":true, "line":544, "pos":43, "coauthors":"ABB"} +{} +{"subtitle":"AB", "user":"BA", "line":546, "node":"CB"} +{"title":"BBB", "user":"AA", "line":547, "abstract":"CBB", "pos":45} +{"wait":"CCB", "title":"AC", "world":"AAA", "line":548, "abstract":"BBC", "pos":23, "coauthors":"ACC"} +{"org":55, "subtitle":"BA", "line":549, "disabled":true, "date":"CB", "space":"AA"} +{"org":39, "cleaned":true, "line":550, "public":false} +{"state":41, "auth":"CC", "world":"CB", "line":551, "space":"AAB"} +{} +{"state":26, "bad":false, "query":"BAA", "status":84, "indexed":true, "line":553, "disabled":false, "coauthors":"CC", "node":"CBB"} +{"world":"ABA", "user":"CCC", "query":"ABB", "line":554, "space":"ABC", "node":"AAA"} +{"state":18, "wait":"CCB", "bad":true, "user":"BA", "line":555, "space":"CC", "coauthors":"BB", "node":"BBB"} +{"auth":"AA", "state":71, "subtitle":"AA", "query":"ACC", "indexed":true, "line":556, "space":"BAB", "public":false} +{"indexed":true, "cleaned":true, "line":557, "disabled":false, "abstract":"AB"} +{"auth":"BCC", "title":"ACB", "world":"BCA", "user":"BAB", "cleaned":false, "line":558, "space":"BB", "coauthors":"CBC"} +{} +{"auth":"ACC", "org":18, "wait":"AB", "status":1, "indexed":true, "line":560} +{"status":8, "line":561, "abstract":"BA", "public":false} +{"state":27, "title":"ABA", "bad":true, "query":"AAB", "indexed":false, "line":562, "pos":86, "public":true, "coauthors":"BA"} +{} +{"title":"BAC", "wait":"CCC", "user":"BA", "line":564, "disabled":false, "date":"BB", "public":true, "space":"CB", "coauthors":"CCB"} +{"wait":"CAA", "line":565, "pos":80, "space":"AB"} +{"auth":"CBB", "subtitle":"BCA", "user":"CB", "line":566, "abstract":"BC", "date":"AB"} +{"title":"CCB", "status":78, "line":567, "pos":68, "node":"BA"} +{"auth":"BC", "query":"AB", "line":568, "space":"AB", "node":"BB"} +{} +{"line":570, "pos":54} +{"world":"BBB", "user":"CC", "indexed":true, "line":571, "abstract":"CC", "coauthors":"BA", "node":"ABB"} +{"state":41, "line":572} +{"subtitle":"CBC", "cleaned":true, "line":573, "node":"BCB"} +{"title":"ABA", "line":574, "pos":27, "space":"CC"} +{"status":29, "indexed":false, "cleaned":false, "line":575, "pos":52, "public":false, "coauthors":"ACC"} +{"title":"BBB", "org":86, "wait":"AAA", "user":"CC", "query":"CA", "line":576, "disabled":false, "date":"AB", "node":"BC"} +{"line":577, "abstract":"CAA", "date":"BB"} +{"auth":"CCC", "subtitle":"BBB", "query":"ABA", "line":578, "pos":99, "space":"CCB", "public":true, "coauthors":"ACA", "node":"ACB"} +{"wait":"BCC", "line":579} +{"state":99, "world":"BAC", "user":"CA", "line":580} +{"state":55, "world":"AAA", "title":"AAA", "cleaned":false, "line":581, "date":"AC", "public":true, "node":"AA"} +{"query":"ACC", "cleaned":true, "line":582, "disabled":false} +{"auth":"AAB", "query":"BAC", "line":583} +{"auth":"AA", "user":"BAC", "line":584} +{} +{"org":96, "wait":"BC", "bad":false, "cleaned":false, "status":96, "line":586, "pos":95} +{"auth":"BC", "subtitle":"BCB", "bad":true, "user":"BBC", "line":587, "pos":79, "node":"BA"} +{"state":55, "line":588} +{"title":"ABC", "world":"AB", "subtitle":"CBC", "user":"BA", "query":"BAB", "line":589, "date":"AC", "node":"CB"} +{"world":"BAA", "bad":false, "user":"AAB", "cleaned":false, "indexed":false, "line":590} +{"title":"CB", "wait":"BC", "subtitle":"BAC", "cleaned":true, "line":591, "disabled":false, "abstract":"CBB", "public":false, "node":"ACC"} +{"user":"BC", "line":592, "public":false} +{} +{"wait":"CC", "org":57, "title":"BAC", "line":594, "abstract":"AA"} +{"auth":"BBC", "state":3, "world":"AAC", "query":"BA", "line":595, "coauthors":"BB"} +{} +{"subtitle":"CC", "user":"CC", "line":597} +{"wait":"BBA", "user":"AAA", "line":598, "space":"ACB", "node":"AA"} +{"auth":"BB", "user":"ABA", "line":599, "abstract":"AB", "node":"BA"} +{} +{"world":"AAA", "user":"BB", "cleaned":false, "line":601, "space":"AC", "coauthors":"ABB"} +{"title":"CAB", "bad":false, "line":602, "coauthors":"ABB"} +{} +{"world":"CCC", "org":79, "line":604} +{"org":56, "query":"AB", "cleaned":true, "indexed":true, "status":20, "line":605, "public":true, "coauthors":"ACA"} +{"auth":"BBC", "org":13, "subtitle":"CC", "bad":true, "user":"ABC", "line":606, "date":"CA", "public":false} +{"query":"BA", "line":607} +{"bad":true, "line":608, "pos":12, "coauthors":"CB"} +{"bad":false, "status":42, "line":609} +{} +{"bad":true, "line":611} +{"auth":"CCA", "subtitle":"BC", "bad":true, "query":"CAA", "cleaned":false, "line":612, "public":false, "node":"CBA"} +{"org":65, "query":"BC", "line":613} +{} +{"wait":"BAC", "title":"AAB", "user":"CAC", "line":615, "pos":69, "space":"CC", "node":"AAC"} +{"bad":false, "line":616, "abstract":"AB", "pos":65, "coauthors":"BBB"} +{} +{"org":38, "world":"BA", "line":618, "coauthors":"AA", "node":"BC"} +{"cleaned":false, "line":619, "disabled":false} +{"auth":"BC", "line":620, "pos":79, "date":"AB", "coauthors":"BAA", "node":"CB"} +{"auth":"CAA", "title":"CB", "user":"BAC", "cleaned":false, "line":621, "public":false, "space":"CBA"} +{} +{"bad":false, "status":12, "line":623} +{"auth":"BBB", "wait":"BAC", "org":36, "title":"AB", "indexed":false, "cleaned":false, "line":624, "date":"AB", "coauthors":"CB"} +{"wait":"AA", "subtitle":"AB", "query":"CCB", "line":625, "node":"CBB"} +{"wait":"BC", "subtitle":"BA", "bad":true, "user":"AA", "line":626, "pos":3, "date":"BB"} +{"org":28, "user":"BC", "query":"AC", "status":63, "line":627, "pos":45, "public":true, "node":"BC"} +{"query":"BC", "status":47, "line":628, "disabled":false, "date":"CA", "public":false} +{} +{"wait":"CB", "line":630, "pos":67, "coauthors":"AC"} +{"org":33, "world":"BBB", "query":"BB", "status":92, "line":631} +{"state":65, "title":"AC", "world":"CBC", "query":"CBC", "line":632, "date":"CAC", "space":"CC", "coauthors":"CC"} +{} +{"auth":"CC", "query":"BCA", "status":46, "line":634, "disabled":false, "pos":69} +{"wait":"CB", "line":635, "pos":34} +{"state":9, "wait":"CC", "status":23, "line":636, "disabled":true, "date":"BB", "space":"AC"} +{"user":"CCB", "indexed":false, "cleaned":true, "line":637, "pos":65, "date":"AA", "public":true} +{"auth":"BC", "wait":"AB", "title":"BB", "bad":true, "line":638, "abstract":"ACC", "date":"BC", "public":false} +{"state":44, "auth":"BC", "world":"CBC", "line":639, "disabled":false, "date":"CAA"} +{"world":"CB", "title":"ACB", "user":"BA", "query":"AA", "line":640, "disabled":true, "space":"AC"} +{"state":37, "line":641, "disabled":true, "pos":66} +{"world":"AAA", "bad":true, "user":"AAA", "query":"BA", "line":642, "disabled":true, "coauthors":"CBC"} +{"world":"BA", "title":"ABB", "org":96, "bad":false, "query":"AAA", "status":75, "cleaned":false, "line":643, "space":"BA"} +{"state":36, "org":66, "subtitle":"AA", "query":"CA", "cleaned":true, "status":79, "line":644, "date":"CB"} +{"wait":"BC", "line":645, "date":"CBA", "space":"BCB", "public":true, "node":"ABA"} +{"auth":"BB", "org":37, "query":"CAA", "indexed":true, "line":646, "abstract":"CBA", "coauthors":"CBA"} +{} +{} +{"state":58, "world":"BAB", "org":11, "user":"CC", "line":649} +{"title":"CB", "status":19, "line":650, "disabled":false, "public":false, "coauthors":"AA"} +{"user":"BBC", "indexed":true, "line":651, "disabled":true, "pos":8} +{"query":"CC", "cleaned":true, "indexed":false, "line":652, "pos":67, "date":"AA"} +{"auth":"AAC", "line":653, "disabled":true, "public":false, "coauthors":"AAA", "node":"CBB"} +{"bad":true, "query":"AC", "line":654, "disabled":false} +{"world":"CCA", "org":15, "bad":false, "user":"CCC", "line":655, "public":true, "space":"CC"} +{"line":656, "coauthors":"BBB"} +{"title":"BA", "line":657, "date":"ACB"} +{"user":"BC", "query":"CC", "cleaned":true, "line":658, "pos":51, "abstract":"BA"} +{"subtitle":"CCA", "user":"CCA", "cleaned":false, "line":659, "abstract":"BA", "pos":95, "date":"CA"} +{"auth":"CA", "state":23, "org":19, "bad":false, "user":"BCB", "indexed":false, "line":660, "date":"ABA"} +{"state":64, "org":97, "bad":false, "indexed":false, "line":661, "space":"BAB", "coauthors":"BB", "node":"BA"} +{"status":11, "line":662} +{"title":"BCC", "org":44, "subtitle":"ACB", "cleaned":false, "line":663, "pos":58} +{"auth":"ABB", "bad":true, "line":664, "pos":82, "coauthors":"CC", "node":"AB"} +{"bad":false, "cleaned":true, "status":25, "line":665, "disabled":false, "abstract":"BB", "public":true} +{"wait":"AC", "user":"CB", "line":666, "pos":71, "abstract":"ACA", "coauthors":"CBB"} +{"title":"AA", "bad":true, "user":"BB", "line":667, "date":"CA", "space":"BC", "node":"CC"} +{} +{"auth":"AAB", "line":669} +{"wait":"AAC", "query":"ABA", "status":35, "line":670, "disabled":false, "pos":56} +{"org":3, "line":671} +{"state":46, "bad":false, "cleaned":true, "line":672} +{"state":30, "org":9, "status":72, "line":673, "abstract":"ACA", "coauthors":"CB"} +{"auth":"BB", "wait":"CA", "title":"BBB", "bad":true, "user":"AAA", "status":86, "indexed":false, "line":674, "node":"BCC"} +{"indexed":true, "line":675, "pos":63} +{"bad":true, "query":"CBB", "status":5, "line":676, "abstract":"CCC", "public":false, "space":"BB"} +{"title":"BBB", "org":60, "bad":true, "cleaned":false, "line":677, "pos":82, "date":"BAA", "space":"BB", "coauthors":"CAA"} +{} +{} +{"state":73, "bad":false, "cleaned":false, "line":680, "abstract":"CA", "date":"CCA", "space":"CB"} +{"state":92, "query":"CC", "line":681, "abstract":"AB", "date":"BBB", "public":true, "coauthors":"CBA"} +{"subtitle":"CCA", "line":682} +{"world":"BAC", "subtitle":"AC", "line":683, "disabled":true, "abstract":"AA", "pos":55, "space":"AC", "node":"CA"} +{"state":75, "world":"ACA", "query":"BC", "line":684, "coauthors":"AAC"} +{"status":21, "line":685} +{"state":39, "wait":"CB", "title":"CBC", "query":"BB", "cleaned":true, "line":686, "disabled":false} +{"world":"CCA", "wait":"AB", "user":"CC", "query":"BB", "cleaned":true, "line":687} +{"auth":"CAC", "state":94, "wait":"ACC", "title":"BBC", "user":"BB", "line":688, "disabled":false, "pos":16, "coauthors":"AAC"} +{} +{"org":43, "line":690} +{} +{"state":4, "title":"CA", "subtitle":"AA", "query":"BC", "line":692, "pos":57, "date":"BCA", "public":false, "coauthors":"ABB"} +{"wait":"BBA", "line":693} +{"auth":"BCA", "bad":false, "user":"BBA", "line":694, "disabled":false, "date":"CC", "public":true, "coauthors":"CB"} +{"state":66, "wait":"BB", "user":"CC", "indexed":true, "line":695, "pos":99, "space":"BCA"} +{"org":1, "line":696, "disabled":false, "space":"BCC", "coauthors":"BC"} +{"auth":"BC", "cleaned":true, "indexed":false, "line":697, "space":"CBB"} +{"wait":"AC", "indexed":false, "line":698, "pos":44} +{"wait":"AA", "title":"BBB", "org":31, "indexed":true, "line":699, "disabled":false} +{"auth":"BB", "world":"ACC", "bad":true, "indexed":false, "line":700, "abstract":"CB", "pos":5, "space":"ACB", "node":"CC"} +{"cleaned":false, "line":701, "space":"CB"} +{"line":702, "space":"CCC"} +{"world":"CA", "subtitle":"ABA", "line":703, "pos":5, "date":"BA", "coauthors":"AB"} +{} +{"line":705, "date":"BBB"} +{"state":10, "query":"CB", "status":70, "line":706, "abstract":"ABA", "date":"BC"} +{"auth":"CB", "line":707} +{"wait":"BBA", "cleaned":true, "line":708, "pos":94, "date":"CBC"} +{"state":86, "org":5, "world":"BB", "indexed":false, "line":709, "date":"BBB", "space":"CA", "public":true} +{"world":"ACA", "query":"ABC", "status":40, "line":710, "disabled":true, "public":true, "node":"CA"} +{"bad":true, "line":711} +{"query":"AB", "line":712, "coauthors":"BBC", "node":"AA"} +{"user":"ABB", "line":713, "public":false, "space":"AAA", "node":"BBA"} +{"auth":"AC", "wait":"BAC", "bad":true, "line":714, "public":false} +{"line":715, "abstract":"CA", "public":false} +{"user":"AC", "indexed":true, "line":716, "coauthors":"CB"} +{"state":4, "title":"ABB", "org":26, "indexed":true, "line":717, "public":true, "coauthors":"CCA", "node":"AC"} +{"wait":"CA", "title":"CCA", "world":"CCC", "line":718, "abstract":"ACA"} +{"auth":"ACA", "org":29, "subtitle":"AA", "user":"CA", "status":24, "indexed":true, "line":719, "public":false, "node":"CA"} +{} +{"line":721, "disabled":true, "abstract":"BAC"} +{"world":"BC", "line":722} +{"state":27, "auth":"AA", "title":"BC", "world":"CC", "query":"BCC", "line":723, "disabled":true, "pos":9, "public":false, "node":"BCC"} +{"org":78, "wait":"ABA", "cleaned":true, "indexed":true, "line":724, "date":"ACB", "space":"AA"} +{"state":60, "line":725} +{} +{} +{"wait":"ABA", "title":"CAC", "user":"CCC", "line":728} +{"wait":"CC", "indexed":true, "status":39, "line":729, "disabled":true, "public":false} +{"auth":"CB", "subtitle":"BBA", "line":730, "coauthors":"CAC"} +{"world":"CBB", "line":731, "space":"BCB"} +{"cleaned":true, "line":732} +{"org":67, "bad":true, "line":733, "pos":9, "node":"ACC"} +{"world":"BC", "wait":"CAC", "org":58, "subtitle":"ACC", "bad":true, "query":"CAA", "line":734, "abstract":"BCA", "pos":1, "public":true} +{"state":45, "query":"AB", "indexed":false, "line":735, "pos":82, "date":"BC", "public":false, "coauthors":"BA"} +{"state":68, "title":"BC", "cleaned":true, "status":34, "line":736, "disabled":true, "node":"BBB"} +{"auth":"AC", "line":737} +{"line":738, "date":"BA", "space":"CCC", "public":false} +{"line":739, "node":"BAA"} +{"org":72, "title":"BC", "line":740, "pos":51, "coauthors":"CA"} +{"state":72, "user":"CCB", "query":"ACA", "line":741} +{"org":80, "subtitle":"BBA", "bad":true, "user":"BC", "line":742, "pos":52, "coauthors":"BCA"} +{} +{"query":"BC", "line":744, "abstract":"AB", "public":false, "node":"BAC"} +{"world":"CAC", "line":745} +{"auth":"CBB", "title":"AA", "user":"AB", "line":746, "pos":35, "public":false, "space":"AAB"} +{"state":69, "world":"AB", "org":78, "subtitle":"BA", "bad":false, "line":747, "node":"AAA"} +{"bad":true, "line":748, "public":true} +{"wait":"BC", "org":47, "query":"BBB", "line":749} +{"title":"BBB", "line":750} +{"org":33, "query":"CB", "line":751, "disabled":true} +{"subtitle":"BB", "line":752, "space":"CC"} +{"org":89, "line":753} +{"auth":"ABA", "line":754, "coauthors":"ACC"} +{"subtitle":"BA", "line":755, "pos":47} +{"state":81, "subtitle":"CB", "query":"AB", "status":25, "cleaned":false, "line":756, "pos":72, "date":"BA", "coauthors":"BCA"} +{"state":46, "status":88, "line":757, "disabled":false, "public":true} +{"world":"AB", "line":758, "disabled":true, "abstract":"BB", "coauthors":"AAA"} +{"query":"AC", "line":759, "abstract":"AAB"} +{"auth":"BC", "indexed":false, "line":760, "abstract":"BA", "node":"CAA"} +{"state":10, "auth":"BAC", "title":"BC", "query":"BCA", "cleaned":true, "line":761, "disabled":true, "space":"ACC", "coauthors":"ABA"} +{"line":762, "disabled":true, "pos":43} +{"world":"CBA", "user":"BBC", "indexed":true, "line":763} +{"wait":"ACB", "query":"BA", "status":22, "line":764, "pos":70, "abstract":"BAC", "public":false, "space":"BC"} +{} +{"line":766, "disabled":false, "abstract":"CBC", "date":"CA"} +{"title":"CC", "bad":true, "user":"BCC", "indexed":false, "line":767, "date":"BCB", "node":"AAA"} +{"title":"CB", "line":768, "abstract":"AA", "node":"ABB"} +{"org":21, "user":"ABC", "line":769, "abstract":"BB", "date":"CBB", "space":"CC"} +{"auth":"AC", "org":66, "user":"CC", "line":770, "public":false, "space":"CA", "coauthors":"AA"} +{"org":58, "line":771, "coauthors":"BCC", "node":"AC"} +{} +{"auth":"BC", "wait":"CC", "line":773, "abstract":"ACC", "pos":98, "date":"CCC", "space":"ABB", "node":"CB"} +{} +{"query":"BC", "user":"AC", "indexed":true, "line":775, "abstract":"AAA"} +{"subtitle":"BAA", "indexed":false, "line":776} +{"line":777, "pos":33, "date":"CCB", "public":true} +{"world":"BCA", "bad":true, "line":778} +{"auth":"CA", "line":779, "date":"AC", "space":"CAC"} +{"title":"BB", "bad":false, "cleaned":true, "line":780, "disabled":false, "date":"BAB", "space":"ACB"} +{"auth":"CAC", "title":"AAB", "subtitle":"CA", "bad":false, "line":781, "disabled":false, "space":"CB"} +{"state":78, "auth":"AC", "bad":true, "status":46, "line":782, "abstract":"CCA", "pos":97, "public":true} +{"user":"BBA", "line":783} +{} +{"state":63, "title":"CA", "cleaned":true, "line":785, "abstract":"BA", "space":"BCC"} +{"line":786, "node":"CAC"} +{"line":787, "pos":65} +{"line":788, "space":"ABB"} +{} +{"org":14, "line":790, "abstract":"CAB", "coauthors":"BBC"} +{"subtitle":"CBA", "cleaned":false, "line":791, "disabled":false, "pos":57, "node":"CB"} +{"auth":"CAA", "org":84, "wait":"AB", "indexed":true, "status":51, "line":792, "abstract":"CC"} +{"org":72, "bad":true, "line":793, "space":"ACA"} +{} +{"auth":"BC", "state":76, "wait":"CC", "user":"ABB", "cleaned":false, "line":795, "pos":99, "abstract":"CA"} +{"wait":"CCA", "world":"CBC", "line":796, "date":"CB", "public":false} +{"state":49, "line":797, "coauthors":"CC"} +{"wait":"BBB", "title":"ABB", "org":74, "line":798, "disabled":false, "pos":34, "space":"BB"} +{"line":799, "abstract":"CB"} +{"state":84, "user":"ABB", "cleaned":false, "status":18, "line":800, "disabled":true, "date":"CCA", "node":"BA"} +{"state":81, "auth":"CB", "world":"CA", "user":"CAA", "line":801, "date":"AC", "space":"CBC", "coauthors":"BCB"} +{"org":4, "line":802, "disabled":false, "abstract":"ABA", "public":false} +{"auth":"CBC", "state":99, "cleaned":true, "line":803, "disabled":true, "space":"BC", "node":"BBC"} +{"auth":"AC", "wait":"CA", "cleaned":false, "line":804, "pos":54, "date":"BAA", "public":true, "space":"AB"} +{} +{"auth":"BCB", "wait":"BCC", "subtitle":"AAA", "line":806} +{"line":807, "disabled":false, "space":"ACA"} +{"org":96, "query":"CBA", "line":808, "disabled":false, "pos":74, "space":"CA", "public":false} +{} +{"state":12, "title":"AA", "bad":false, "status":20, "line":810, "disabled":true, "coauthors":"CAC", "node":"AB"} +{"auth":"ABC", "line":811, "date":"CA"} +{"title":"AB", "indexed":false, "line":812, "disabled":false, "node":"AAC"} +{} +{"world":"CBA", "status":15, "line":814, "abstract":"CBA"} +{"status":49, "line":815, "pos":49} +{"subtitle":"CAB", "line":816} +{} +{} +{"world":"CAC", "title":"CB", "wait":"AA", "query":"CA", "indexed":true, "line":819, "disabled":true} +{"auth":"ABB", "wait":"AC", "query":"CC", "cleaned":true, "indexed":false, "line":820, "abstract":"AA", "public":false, "node":"AB"} +{"org":5, "wait":"BA", "indexed":true, "line":821, "node":"AB"} +{"title":"CC", "wait":"CC", "bad":false, "query":"BCC", "indexed":false, "line":822, "pos":27, "date":"CB", "node":"CBA"} +{"query":"BC", "status":28, "line":823, "public":false} +{"status":1, "line":824, "abstract":"BB"} +{} +{"auth":"AA", "title":"BC", "query":"CA", "status":33, "line":826} +{"state":9, "title":"BB", "subtitle":"ACC", "bad":true, "query":"BA", "status":41, "line":827, "abstract":"ACB", "public":false} +{"auth":"AB", "subtitle":"CAB", "line":828, "public":false, "coauthors":"AB", "node":"BAC"} +{"line":829, "disabled":false, "public":true, "node":"CBC"} +{"auth":"BAB", "line":830} +{"wait":"BBA", "bad":true, "indexed":false, "line":831, "space":"BB"} +{"org":70, "wait":"BC", "world":"AC", "indexed":true, "status":96, "line":832, "disabled":true, "space":"AB"} +{"state":8, "world":"BAB", "bad":true, "indexed":true, "status":18, "line":833, "date":"BA", "space":"BA"} +{"query":"AB", "line":834} +{"bad":true, "status":5, "line":835} +{"world":"BAC", "subtitle":"BB", "bad":false, "user":"AB", "indexed":false, "cleaned":true, "line":836} +{"line":837, "public":false} +{"line":838, "pos":7} +{"auth":"CA", "query":"ABB", "indexed":true, "line":839, "public":true} +{"wait":"CC", "bad":false, "line":840, "date":"AAB", "public":false, "coauthors":"BCB"} +{"auth":"AB", "state":97, "org":24, "line":841, "pos":41, "node":"BC"} +{"wait":"BB", "world":"CBA", "user":"BAA", "status":18, "line":842, "date":"BAB", "public":true} +{"title":"BA", "subtitle":"CA", "query":"CCB", "line":843, "space":"BB"} +{"auth":"BB", "world":"ACA", "line":844, "pos":29} +{"state":65, "org":40, "query":"CAA", "user":"AB", "indexed":false, "cleaned":false, "line":845} +{"title":"CB", "cleaned":false, "indexed":false, "line":846} +{"wait":"CAA", "indexed":false, "line":847, "disabled":false} +{} +{"title":"CB", "query":"CC", "line":849, "abstract":"CB", "pos":10, "public":true} +{"auth":"CB", "subtitle":"BA", "cleaned":true, "line":850, "disabled":true, "pos":84} +{"org":45, "wait":"BA", "query":"CCC", "line":851, "date":"BCA", "coauthors":"CAB"} +{"state":84, "title":"CB", "line":852, "pos":71, "space":"CA"} +{"line":853, "public":true, "node":"AA"} +{"subtitle":"BC", "user":"AB", "cleaned":true, "line":854, "public":true} +{"state":26, "wait":"BA", "world":"BBB", "user":"BB", "status":53, "line":855, "abstract":"ABA", "pos":72, "space":"AC"} +{"line":856, "public":false, "coauthors":"CA"} +{"wait":"ABB", "subtitle":"CBA", "line":857, "pos":44} +{"auth":"ABA", "wait":"CC", "org":0, "bad":true, "query":"BB", "line":858, "disabled":false, "public":true} +{"bad":false, "user":"AA", "line":859, "pos":90} +{"world":"BCC", "title":"BAA", "bad":false, "user":"CAA", "query":"BBC", "line":860, "date":"CAA", "space":"BCB", "public":true, "coauthors":"CB"} +{"title":"BAB", "world":"BC", "subtitle":"AA", "cleaned":false, "status":9, "line":861, "pos":95} +{"title":"AC", "line":862} +{"wait":"CB", "bad":false, "status":89, "line":863, "coauthors":"AB"} +{"subtitle":"ACC", "indexed":true, "cleaned":true, "line":864} +{"title":"AB", "subtitle":"CBB", "query":"ACA", "indexed":true, "line":865, "disabled":true} +{"title":"BC", "world":"BB", "query":"AA", "user":"ACB", "status":43, "cleaned":false, "line":866, "coauthors":"CBC", "node":"ACB"} +{} +{"org":25, "wait":"AC", "indexed":false, "line":868, "disabled":false, "abstract":"CA", "pos":48} +{"bad":true, "status":34, "line":869, "pos":32, "date":"AC", "public":true, "node":"AA"} +{"state":33, "wait":"AAC", "indexed":true, "status":20, "line":870, "abstract":"BA"} +{"wait":"CCC", "subtitle":"AC", "line":871, "disabled":false, "space":"BA", "public":true, "coauthors":"BCC"} +{"status":49, "line":872} +{"state":90, "title":"ACC", "world":"CBB", "subtitle":"BAB", "bad":false, "status":94, "line":873, "abstract":"CB"} +{"title":"BCB", "line":874} +{"cleaned":false, "line":875} +{"wait":"BAA", "subtitle":"BBC", "line":876} +{"auth":"AB", "org":35, "bad":false, "indexed":false, "line":877, "coauthors":"BBA"} +{"line":878, "public":false} +{} +{"auth":"CB", "wait":"CBC", "indexed":false, "line":880, "public":true} +{"query":"CC", "status":4, "line":881, "disabled":true, "node":"CA"} +{"title":"BB", "line":882} +{"state":53, "bad":false, "cleaned":false, "status":63, "line":883, "coauthors":"BAA"} +{"auth":"ACA", "world":"AC", "user":"CBC", "line":884, "date":"BCA", "node":"BBC"} +{"auth":"BAB", "state":11, "world":"CB", "org":77, "query":"BA", "cleaned":false, "line":885, "space":"AC"} +{"world":"CA", "user":"CA", "line":886, "node":"CB"} +{"state":32, "org":50, "wait":"AA", "line":887, "disabled":false, "space":"BBA", "public":false} +{"cleaned":true, "line":888, "pos":70, "node":"ABC"} +{"org":63, "user":"AAB", "query":"BB", "line":889, "date":"BC", "space":"CBB", "node":"ABC"} +{"wait":"BB", "user":"BB", "query":"CB", "line":890, "space":"BB", "coauthors":"BA", "node":"ABC"} +{"auth":"BC", "world":"CC", "subtitle":"CB", "line":891, "public":false, "coauthors":"BC"} +{"state":13, "org":38, "line":892, "coauthors":"BC", "node":"ABC"} +{"auth":"CC", "world":"CAC", "line":893, "date":"BBA", "node":"CBC"} +{} +{"auth":"AA", "line":895, "coauthors":"BB"} +{"auth":"AA", "state":76, "status":85, "line":896, "date":"CCC", "public":true, "coauthors":"AB"} +{"auth":"AB", "indexed":true, "cleaned":false, "line":897} +{"line":898, "coauthors":"CBB"} +{} +{"wait":"ACC", "line":900, "abstract":"BBA"} +{"auth":"AA", "wait":"BCB", "cleaned":false, "line":901, "abstract":"AAC"} +{"state":68, "title":"AC", "subtitle":"BB", "line":902} +{"state":41, "wait":"ABA", "bad":false, "user":"BBA", "status":46, "line":903, "node":"AAB"} +{} +{"cleaned":false, "line":905, "pos":33} +{"bad":false, "query":"BA", "line":906, "pos":48, "space":"CB", "public":true} +{"query":"CB", "indexed":true, "line":907, "pos":41, "abstract":"CBB", "space":"BA", "public":false, "node":"BC"} +{"title":"AB", "line":908} +{"auth":"BC", "title":"CB", "line":909, "disabled":false, "space":"CA", "public":true, "coauthors":"BC"} +{"world":"AA", "user":"ABA", "indexed":false, "line":910, "abstract":"CC"} +{"auth":"CCA", "indexed":false, "line":911, "date":"AC", "public":false} +{"world":"AAB", "bad":true, "line":912} +{"subtitle":"CBB", "line":913, "public":true} +{"wait":"CB", "line":914, "disabled":false, "pos":71, "date":"BA", "space":"CBA", "public":false, "coauthors":"BB"} +{"org":67, "wait":"CA", "bad":false, "line":915, "disabled":false, "public":true} +{} +{"line":917, "date":"CB"} +{"auth":"CBB", "world":"AAA", "status":83, "indexed":false, "line":918, "disabled":true, "date":"CBA", "coauthors":"ACC"} +{"wait":"AB", "title":"BA", "status":33, "line":919, "disabled":false} +{"wait":"ACB", "cleaned":false, "line":920, "abstract":"AA", "coauthors":"BCB"} +{"wait":"ABB", "org":40, "world":"BC", "subtitle":"CA", "user":"AAC", "status":14, "indexed":true, "line":921, "pos":66} +{"auth":"BA", "org":22, "wait":"BAB", "bad":true, "user":"ACC", "status":32, "line":922} +{"world":"BA", "query":"CAB", "status":0, "line":923} +{"org":84, "bad":true, "line":924, "coauthors":"BAB"} +{"auth":"ACC", "subtitle":"AAA", "query":"CCA", "cleaned":false, "line":925, "pos":60, "space":"BC"} +{"wait":"BC", "subtitle":"CCC", "bad":false, "cleaned":false, "indexed":false, "line":926, "public":false, "coauthors":"AC"} +{"auth":"CA", "state":91, "org":6, "world":"AA", "wait":"ABB", "query":"AAC", "line":927, "date":"CA", "node":"BAC"} +{"world":"BCA", "query":"AA", "user":"BBC", "line":928, "disabled":false} +{"world":"CBC", "user":"CBC", "line":929, "date":"CAC"} +{"world":"BCB", "bad":false, "user":"BB", "line":930} +{"auth":"CA", "world":"AA", "query":"ABA", "user":"AA", "indexed":true, "line":931, "coauthors":"BBC"} +{"auth":"BAA", "bad":true, "line":932, "disabled":false, "pos":93, "abstract":"CCA", "date":"BBA", "coauthors":"AA"} +{"line":933, "space":"CAB", "node":"AB"} +{} +{"status":60, "cleaned":true, "indexed":true, "line":935, "pos":35, "space":"CAB", "node":"BBB"} +{"wait":"AAA", "bad":true, "status":26, "line":936, "abstract":"ACB", "space":"BBA", "coauthors":"CCC"} +{"title":"BA", "bad":true, "line":937, "date":"BBA", "public":true} +{} +{"query":"BA", "user":"BA", "line":939, "disabled":true} +{"line":940, "date":"CC"} +{"wait":"CAB", "query":"BCA", "user":"BC", "line":941, "pos":8, "coauthors":"ACC"} +{"line":942, "space":"BA"} +{"auth":"CA", "org":11, "line":943, "pos":99} +{"org":83, "line":944, "disabled":false, "date":"BBA", "space":"AC", "node":"AC"} +{"world":"CCA", "line":945, "node":"BC"} +{"org":95, "title":"CA", "world":"BA", "line":946, "pos":36, "coauthors":"CA"} +{"state":93, "line":947} +{"cleaned":false, "status":5, "line":948, "abstract":"BB", "public":false, "coauthors":"ABC"} +{"world":"CA", "org":61, "bad":false, "query":"CC", "cleaned":true, "line":949, "pos":14, "space":"CC"} +{"state":91, "line":950, "abstract":"BA", "date":"AB"} +{"auth":"BBC", "line":951, "date":"BB"} +{"auth":"BAB", "line":952, "disabled":true, "node":"AAA"} +{"auth":"CAA", "subtitle":"ABA", "bad":true, "line":953} +{"auth":"CA", "wait":"BB", "org":12, "user":"BCC", "cleaned":false, "line":954, "public":false, "coauthors":"AA"} +{"org":93, "cleaned":true, "line":955, "disabled":true, "public":true, "node":"ACA"} +{"line":956, "pos":10} +{"org":74, "world":"CCC", "subtitle":"AB", "user":"AAA", "cleaned":true, "line":957, "pos":70, "public":true, "node":"CC"} +{"state":51, "line":958} +{"world":"CCA", "title":"BCB", "user":"AB", "indexed":true, "line":959, "disabled":true, "pos":21, "date":"CBC"} +{"org":86, "wait":"BC", "query":"BB", "user":"AA", "indexed":true, "line":960, "pos":58, "date":"AB"} +{"line":961, "node":"CC"} +{"auth":"BCB", "world":"ACC", "subtitle":"CA", "bad":true, "user":"BA", "indexed":false, "line":962, "public":false} +{} +{"status":37, "line":964} +{"state":70, "status":76, "indexed":false, "line":965, "disabled":true, "space":"BB"} +{} +{"state":67, "world":"CA", "title":"AA", "line":967, "abstract":"BA", "space":"BAA"} +{"auth":"CA", "world":"AA", "bad":true, "query":"BC", "status":53, "indexed":false, "line":968, "date":"AB", "node":"BAA"} +{"query":"AC", "cleaned":true, "line":969, "abstract":"BC", "space":"CAB", "coauthors":"BAA"} +{"wait":"BCA", "world":"CB", "title":"BC", "indexed":false, "line":970, "disabled":true, "pos":70, "date":"AB"} +{} +{"subtitle":"BC", "query":"AA", "line":972} +{"line":973, "public":true} +{"org":75, "world":"AAB", "subtitle":"BB", "user":"CC", "line":974, "space":"CA"} +{"auth":"BCB", "cleaned":true, "line":975} +{"title":"BAC", "user":"CB", "line":976, "public":false} +{"subtitle":"BAC", "indexed":false, "cleaned":false, "line":977, "disabled":false, "abstract":"ABC", "space":"ABA"} +{"state":63, "bad":false, "line":978, "pos":93, "node":"AAC"} +{} +{"cleaned":false, "line":980, "abstract":"CCB"} +{"state":40, "title":"ABA", "subtitle":"CAB", "query":"BC", "line":981, "date":"CA", "coauthors":"AB"} +{} +{"auth":"ABA", "subtitle":"ACC", "user":"AA", "query":"AC", "cleaned":true, "line":983, "date":"ACB", "node":"CB"} +{"state":32, "title":"ABC", "org":58, "status":95, "line":984, "disabled":true, "pos":6, "space":"CBB"} +{"title":"BCC", "subtitle":"CCC", "user":"BBC", "line":985, "public":false, "coauthors":"CCB", "node":"AA"} +{"subtitle":"ACA", "query":"BCC", "status":43, "cleaned":true, "indexed":true, "line":986, "abstract":"CAC"} +{} +{"world":"CAB", "org":21, "indexed":true, "line":988, "abstract":"ABC"} +{"title":"CBC", "status":66, "line":989} +{} +{"array":[5]} +{"array":["foo", "bar", "baz"]} +{"array":["bar", "baz", "foo"]} +{"array":["bar", "baz"]} +{"array":["baz", "foo"]} +{"line":991, "abstract":"BA", "node":"BBB"} +{"line":992, "disabled":true, "pos":29, "public":false} +{"state":53, "wait":"CB", "subtitle":"CCC", "line":993, "date":"CAC", "public":false, "coauthors":"BB"} +{"wait":"CBA", "title":"CA", "subtitle":"BB", "user":"BAA", "line":994, "disabled":true, "date":"BB", "coauthors":"CCC", "node":"CC"} +{"title":"BB", "user":"AA", "query":"CAA", "status":43, "line":995, "pos":6, "abstract":"CC", "public":true} +{"wait":"AC", "query":"BA", "line":996, "coauthors":"BB", "node":"CCC"} +{"auth":"BC", "title":"CAC", "subtitle":"BA", "line":997, "date":"BAA"} +{"wait":"AB", "user":"ABC", "line":998, "pos":41, "node":"CAC"} +{"state":4, "title":"AC", "bad":true, "status":59, "line":999, "disabled":true} +{"user":"BC", "line":1000} +{"wait":null, "line":1000} +{"age":25} +{"age":25.0} +{"foo": {"bar": "baz"}} +{"foo": {"blah": "baz"}} +{"fool": {"bar": "baz"}} +{} diff --git a/src/test/singlenode_regress/data/latin1_encoding.csv b/src/test/singlenode_regress/data/latin1_encoding.csv new file mode 100644 index 00000000000..fd4426a984c --- /dev/null +++ b/src/test/singlenode_regress/data/latin1_encoding.csv @@ -0,0 +1,3 @@ +3,d'automation +4,t� s� seo le t�st�il dea- +5,minden amire sz�ks�ge van a szeret diff --git a/src/test/singlenode_regress/data/lineitem.csv b/src/test/singlenode_regress/data/lineitem.csv new file mode 100644 index 00000000000..5b5947efc01 --- /dev/null +++ b/src/test/singlenode_regress/data/lineitem.csv @@ -0,0 +1,57190 @@ +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 +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 +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. +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +2981|1755|82|2|8|13254.00|0.06|0.03|N|O|1998-08-21|1998-09-28|1998-09-05|DELIVER IN PERSON|MAIL|ng to the f +2981|367|52|3|14|17743.04|0.03|0.07|N|O|1998-08-30|1998-10-04|1998-09-04|DELIVER IN PERSON|MAIL|kages detect furiously express requests. +2982|1120|57|1|21|21443.52|0.00|0.01|A|F|1995-04-03|1995-06-08|1995-04-18|DELIVER IN PERSON|AIR|ironic deposits. furiously ex +2982|981|50|2|13|24465.74|0.02|0.08|R|F|1995-03-31|1995-05-07|1995-04-18|TAKE BACK RETURN|RAIL|regular deposits unwind alongside +2982|695|89|3|21|33509.49|0.01|0.01|R|F|1995-04-19|1995-06-03|1995-04-28|COLLECT COD|SHIP|egular ideas use furiously? bl +2983|1622|23|1|44|67039.28|0.03|0.06|R|F|1992-02-09|1992-03-07|1992-03-09|TAKE BACK RETURN|AIR|ly regular instruct +2983|481|69|2|11|15196.28|0.09|0.06|A|F|1992-04-29|1992-02-27|1992-05-26|NONE|MAIL|aids integrate s +3008|1316|93|1|8|9738.48|0.10|0.04|N|O|1995-12-06|1996-01-12|1995-12-22|TAKE BACK RETURN|FOB|yly ironic foxes. regular requests h +3008|1998|87|2|31|58899.69|0.05|0.06|N|O|1995-12-14|1995-12-11|1995-12-31|TAKE BACK RETURN|AIR| bold packages. quic +3008|231|32|3|40|45249.20|0.01|0.03|N|O|1995-12-18|1996-01-06|1996-01-11|COLLECT COD|AIR|esias. theodolites detect blithely +3008|591|92|4|48|71596.32|0.07|0.06|N|O|1996-01-23|1996-01-07|1996-02-09|COLLECT COD|SHIP|ld theodolites. fluffily bold theodolit +3008|1042|13|5|31|29234.24|0.03|0.02|N|O|1995-12-01|1996-01-20|1995-12-28|COLLECT COD|RAIL|nts use thinly around the carefully iro +3009|449|8|1|48|64773.12|0.10|0.02|N|O|1997-03-19|1997-05-13|1997-04-11|TAKE BACK RETURN|TRUCK| dependencies sleep quickly a +3009|1846|90|2|38|66417.92|0.00|0.01|N|O|1997-05-01|1997-04-10|1997-05-17|TAKE BACK RETURN|AIR|nal packages should haggle slyly. quickl +3009|1298|10|3|26|31181.54|0.08|0.02|N|O|1997-05-15|1997-05-10|1997-06-13|TAKE BACK RETURN|SHIP|uriously specia +3010|1380|19|1|23|29471.74|0.04|0.00|N|O|1996-03-08|1996-02-29|1996-03-27|NONE|TRUCK|ounts. pendin +3010|1731|74|2|22|35920.06|0.09|0.06|N|O|1996-03-06|1996-04-06|1996-03-18|COLLECT COD|REG AIR| final deposit +3010|571|2|3|24|35317.68|0.04|0.07|N|O|1996-05-09|1996-03-14|1996-05-15|DELIVER IN PERSON|RAIL|ar, even reques +3010|237|19|4|28|31842.44|0.09|0.06|N|O|1996-03-05|1996-03-28|1996-04-03|DELIVER IN PERSON|FOB|ake carefully carefully even request +3010|1035|36|5|9|8424.27|0.02|0.02|N|O|1996-04-28|1996-03-17|1996-05-18|NONE|SHIP|inal packages. quickly even pinto +3010|920|21|6|38|69194.96|0.05|0.07|N|O|1996-04-15|1996-03-16|1996-04-21|DELIVER IN PERSON|RAIL|accounts ar +3011|1976|21|1|5|9389.85|0.02|0.04|R|F|1992-04-21|1992-02-23|1992-05-15|NONE|TRUCK|nusual sentiments. carefully bold idea +3011|1228|29|2|42|47427.24|0.05|0.00|A|F|1992-02-01|1992-03-18|1992-02-29|NONE|TRUCK|osits haggle quickly pending, +3012|1943|88|1|49|90402.06|0.00|0.00|A|F|1993-08-07|1993-07-01|1993-08-08|NONE|MAIL| quickly furious packages. silently unusua +3012|1603|4|2|37|55670.20|0.06|0.03|A|F|1993-08-16|1993-06-07|1993-08-24|TAKE BACK RETURN|REG AIR|uickly permanent packages sleep caref +3013|937|72|1|31|56975.83|0.08|0.08|N|O|1997-05-03|1997-04-05|1997-05-25|NONE|AIR|y furious depen +3013|1389|4|2|30|38711.40|0.05|0.06|N|O|1997-05-02|1997-03-09|1997-05-12|TAKE BACK RETURN|MAIL|ronic packages. slyly even +3013|1197|6|3|35|38436.65|0.00|0.03|N|O|1997-04-02|1997-05-04|1997-04-16|COLLECT COD|MAIL|ely accord +3013|1810|54|4|17|29100.77|0.01|0.07|N|O|1997-02-26|1997-05-02|1997-03-27|DELIVER IN PERSON|SHIP|fully unusual account +3013|599|60|5|20|29991.80|0.00|0.04|N|O|1997-05-06|1997-03-18|1997-05-12|COLLECT COD|RAIL|unts boost regular ideas. slyly pe +3013|716|49|6|19|30717.49|0.08|0.07|N|O|1997-05-11|1997-04-18|1997-05-15|COLLECT COD|REG AIR|fluffily pending packages nag furiously al +3014|1624|25|1|36|54922.32|0.05|0.03|A|F|1992-11-16|1993-01-20|1992-11-28|TAKE BACK RETURN|FOB|ding accounts boost fu +3014|1051|22|2|36|34273.80|0.00|0.08|R|F|1992-12-28|1992-12-29|1993-01-24|COLLECT COD|MAIL|iously ironic r +3014|1509|50|3|48|67704.00|0.06|0.02|A|F|1992-12-19|1993-01-08|1992-12-25|DELIVER IN PERSON|REG AIR|y pending theodolites wake. reg +3014|1138|11|4|14|14547.82|0.10|0.02|R|F|1992-11-19|1993-01-01|1992-12-17|DELIVER IN PERSON|SHIP|. slyly brave platelets nag. careful, +3014|743|76|5|28|46024.72|0.02|0.08|R|F|1993-01-09|1992-12-18|1993-01-10|TAKE BACK RETURN|FOB|es are. final braids nag slyly. fluff +3014|375|4|6|30|38261.10|0.04|0.01|R|F|1993-02-28|1993-01-02|1993-03-20|TAKE BACK RETURN|AIR| final foxes. +3015|27|78|1|5|4635.10|0.09|0.00|A|F|1993-01-10|1992-12-02|1993-01-19|TAKE BACK RETURN|RAIL| the furiously pendi +3015|176|3|2|17|18294.89|0.03|0.01|R|F|1992-10-16|1992-11-20|1992-10-28|COLLECT COD|AIR|s above the fluffily final t +3015|906|75|3|23|41558.70|0.03|0.05|A|F|1992-12-03|1992-11-19|1992-12-23|DELIVER IN PERSON|FOB|s are slyly carefully special pinto bea +3015|1551|52|4|7|10167.85|0.10|0.03|A|F|1992-12-07|1992-12-17|1992-12-30|DELIVER IN PERSON|REG AIR| after the evenly special packages ca +3015|1647|89|5|42|65042.88|0.04|0.02|R|F|1993-01-21|1992-11-07|1993-02-11|DELIVER IN PERSON|AIR|encies haggle furious +3015|652|53|6|18|27947.70|0.02|0.03|R|F|1992-10-10|1992-11-19|1992-10-18|TAKE BACK RETURN|MAIL|equests wake fluffil +3040|154|33|1|18|18974.70|0.08|0.04|R|F|1993-06-25|1993-07-06|1993-07-19|TAKE BACK RETURN|SHIP|ly thin accou +3040|1328|43|2|9|11063.88|0.00|0.01|A|F|1993-06-12|1993-05-16|1993-06-14|NONE|RAIL|ges. pending packages wake. requests +3040|1257|32|3|30|34747.50|0.01|0.01|A|F|1993-08-06|1993-05-18|1993-08-19|NONE|MAIL|x furiously bold packages. expres +3040|821|88|4|14|24105.48|0.05|0.04|A|F|1993-05-13|1993-05-18|1993-05-19|TAKE BACK RETURN|REG AIR| haggle carefully. express hocke +3040|516|17|5|43|60909.93|0.04|0.04|R|F|1993-05-21|1993-05-25|1993-05-26|NONE|MAIL|sts nag slyly alongside of the depos +3040|179|32|6|10|10791.70|0.08|0.04|R|F|1993-05-16|1993-06-24|1993-06-11|DELIVER IN PERSON|MAIL|ely regular foxes haggle dari +3041|1807|37|1|5|8544.00|0.07|0.04|N|O|1997-07-20|1997-07-15|1997-08-17|COLLECT COD|FOB|posits dazzle special p +3041|1459|38|2|9|12244.05|0.03|0.03|N|O|1997-06-29|1997-08-14|1997-07-19|COLLECT COD|AIR|iously across the silent pinto beans. furi +3041|675|38|3|9|14181.03|0.09|0.06|N|O|1997-08-28|1997-07-23|1997-09-16|TAKE BACK RETURN|FOB|scapades after the special +3042|1050|56|1|30|28531.50|0.08|0.06|A|F|1995-01-12|1995-02-15|1995-01-24|DELIVER IN PERSON|SHIP|the requests detect fu +3042|1015|16|2|28|25648.28|0.05|0.03|A|F|1994-11-24|1995-01-02|1994-12-06|TAKE BACK RETURN|MAIL|ng the furiously r +3042|137|64|3|34|35262.42|0.04|0.00|R|F|1994-12-11|1995-02-03|1994-12-21|TAKE BACK RETURN|TRUCK|can wake after the enticingly stealthy i +3042|474|33|4|19|26114.93|0.02|0.01|A|F|1995-03-05|1995-01-24|1995-03-17|COLLECT COD|TRUCK|e carefully. regul +3043|454|13|1|23|31152.35|0.07|0.04|R|F|1992-05-08|1992-07-22|1992-05-18|COLLECT COD|TRUCK|uickly above the pending, +3043|59|35|2|15|14385.75|0.03|0.05|A|F|1992-05-27|1992-06-03|1992-06-09|COLLECT COD|FOB|usly furiously +3043|593|94|3|42|62730.78|0.10|0.07|R|F|1992-07-15|1992-06-19|1992-07-23|NONE|MAIL|ide of the un +3043|905|6|4|5|9029.50|0.10|0.01|A|F|1992-05-22|1992-07-02|1992-06-20|TAKE BACK RETURN|TRUCK|ake blithely re +3044|1010|11|1|10|9110.10|0.07|0.08|N|O|1996-07-13|1996-05-06|1996-07-21|TAKE BACK RETURN|REG AIR| slyly ironic requests. s +3044|1671|13|2|3|4718.01|0.06|0.02|N|O|1996-07-27|1996-05-26|1996-08-15|TAKE BACK RETURN|AIR|ecoys haggle furiously pending requests. +3044|185|12|3|47|51003.46|0.09|0.00|N|O|1996-05-24|1996-06-22|1996-05-30|NONE|REG AIR|ly around the car +3045|877|78|1|41|72892.67|0.05|0.01|N|O|1995-09-30|1995-11-24|1995-10-03|TAKE BACK RETURN|MAIL|ely final foxes. carefully ironic pinto b +3045|682|45|2|48|75968.64|0.02|0.03|N|O|1995-10-01|1995-12-16|1995-10-10|TAKE BACK RETURN|MAIL|ole quickly outside th +3046|733|34|1|44|71884.12|0.03|0.03|N|O|1996-03-03|1996-02-25|1996-04-01|NONE|AIR| are quickly. blithe +3046|537|38|2|46|66126.38|0.03|0.08|N|O|1996-03-22|1996-02-28|1996-04-07|TAKE BACK RETURN|AIR|sits sleep furious +3046|16|92|3|31|28396.31|0.03|0.07|N|O|1996-03-24|1996-01-30|1996-03-26|NONE|RAIL|y pending somas alongside of the slyly iro +3047|1040|41|1|17|15997.68|0.08|0.02|N|O|1997-06-14|1997-04-20|1997-06-23|COLLECT COD|FOB|onic instruction +3047|140|93|2|23|23923.22|0.00|0.04|N|O|1997-05-20|1997-06-14|1997-05-28|TAKE BACK RETURN|REG AIR| slyly ironi +3072|566|57|1|6|8799.36|0.09|0.05|R|F|1994-02-09|1994-03-24|1994-02-28|DELIVER IN PERSON|REG AIR|gular requests abov +3072|1072|43|2|36|35030.52|0.07|0.02|R|F|1994-04-14|1994-04-22|1994-05-06|COLLECT COD|AIR| theodolites. blithely e +3072|968|69|3|7|13082.72|0.04|0.07|R|F|1994-05-09|1994-03-31|1994-05-19|COLLECT COD|TRUCK|uests. ironic, ironic depos +3072|828|62|4|39|67423.98|0.05|0.08|A|F|1994-05-27|1994-04-20|1994-06-14|COLLECT COD|MAIL|es; slyly spe +3072|874|75|5|1|1774.87|0.01|0.08|R|F|1994-02-26|1994-03-14|1994-03-19|NONE|AIR| slyly ironic attainments. car +3073|1940|29|1|16|29471.04|0.07|0.01|R|F|1994-03-02|1994-03-23|1994-03-31|DELIVER IN PERSON|AIR|n requests. ironi +3073|218|100|2|47|52555.87|0.09|0.00|R|F|1994-03-26|1994-02-12|1994-04-21|NONE|REG AIR|eposits. fluffily +3073|861|95|3|10|17618.60|0.03|0.00|R|F|1994-02-11|1994-03-24|1994-02-26|COLLECT COD|FOB| furiously caref +3073|286|14|4|14|16607.92|0.09|0.07|R|F|1994-03-24|1994-04-01|1994-04-07|NONE|RAIL|ilently quiet epitaphs. +3073|405|93|5|25|32635.00|0.00|0.07|R|F|1994-04-14|1994-03-07|1994-04-22|NONE|TRUCK|nag asymptotes. pinto beans sleep +3073|1468|69|6|39|53408.94|0.09|0.02|R|F|1994-05-01|1994-02-16|1994-05-12|DELIVER IN PERSON|AIR|lar excuses across the furiously even +3073|438|39|7|11|14722.73|0.08|0.07|A|F|1994-05-01|1994-03-06|1994-05-08|COLLECT COD|SHIP|instructions sleep according to the +3074|367|24|1|50|63368.00|0.08|0.08|A|F|1993-01-31|1992-12-15|1993-02-20|NONE|AIR|furiously pending requests haggle s +3074|1384|99|2|39|50129.82|0.03|0.00|R|F|1992-12-08|1993-01-28|1992-12-09|DELIVER IN PERSON|TRUCK|iously throu +3075|90|66|1|39|38613.51|0.02|0.03|A|F|1994-06-10|1994-06-21|1994-06-20|NONE|FOB|ing deposits nag +3075|512|43|2|2|2825.02|0.07|0.08|R|F|1994-06-14|1994-06-10|1994-06-25|TAKE BACK RETURN|AIR|. unusual, unusual accounts haggle furious +3076|845|46|1|44|76816.96|0.00|0.05|A|F|1993-09-14|1993-10-04|1993-09-17|TAKE BACK RETURN|FOB| instructions h +3076|1053|24|2|22|20989.10|0.08|0.00|A|F|1993-09-05|1993-09-10|1993-09-27|NONE|REG AIR|packages wake furiou +3076|42|68|3|31|29203.24|0.06|0.06|A|F|1993-08-10|1993-09-17|1993-08-17|TAKE BACK RETURN|SHIP|regular depos +3077|718|51|1|25|40467.75|0.06|0.01|N|O|1997-09-14|1997-10-16|1997-10-06|NONE|TRUCK|lent account +3077|902|37|2|40|72116.00|0.05|0.06|N|O|1997-10-22|1997-09-19|1997-11-19|DELIVER IN PERSON|AIR|to the enticing packag +3077|779|44|3|13|21837.01|0.03|0.07|N|O|1997-09-09|1997-10-15|1997-09-19|NONE|TRUCK|luffily close depende +3077|1147|56|4|23|24107.22|0.03|0.02|N|O|1997-11-05|1997-09-16|1997-11-20|NONE|MAIL|lly. fluffily pending dinos across +3078|1315|16|1|25|30407.75|0.01|0.03|A|F|1993-04-22|1993-05-01|1993-04-28|TAKE BACK RETURN|AIR|express dinos. carefully ironic +3078|772|5|2|21|35128.17|0.09|0.07|A|F|1993-03-20|1993-03-21|1993-04-01|COLLECT COD|AIR|e fluffily. +3079|691|85|1|20|31833.80|0.05|0.00|N|O|1997-10-18|1997-10-26|1997-11-14|NONE|RAIL|ets are according to the quickly dari +3079|1165|2|2|38|40514.08|0.08|0.07|N|O|1997-11-07|1997-11-25|1997-12-06|NONE|RAIL|e carefully regular realms +3079|167|68|3|40|42686.40|0.02|0.08|N|O|1997-09-26|1997-12-11|1997-10-09|NONE|RAIL|ide of the pending, special deposi +3079|233|34|4|2|2266.46|0.00|0.08|N|O|1998-01-05|1997-11-17|1998-01-28|NONE|FOB|ly busy requests believ +3079|1876|20|5|2|3555.74|0.10|0.00|N|O|1997-12-27|1997-10-25|1998-01-08|COLLECT COD|SHIP|y regular asymptotes doz +3079|1654|78|6|46|71559.90|0.00|0.00|N|O|1997-11-19|1997-11-04|1997-11-25|DELIVER IN PERSON|REG AIR|es. final, regula +3104|506|67|1|20|28130.00|0.01|0.08|A|F|1993-12-31|1993-11-24|1994-01-12|DELIVER IN PERSON|REG AIR|s are. furiously s +3104|476|35|2|47|64694.09|0.02|0.05|A|F|1993-12-25|1993-11-02|1994-01-12|COLLECT COD|RAIL|ily daring acc +3104|630|31|3|11|16836.93|0.02|0.03|A|F|1993-10-05|1993-11-30|1993-10-27|NONE|TRUCK| special deposits u +3104|379|80|4|26|33263.62|0.02|0.08|R|F|1994-01-02|1993-12-05|1994-01-31|TAKE BACK RETURN|TRUCK|es boost carefully. slyly +3105|1835|22|1|11|19105.13|0.01|0.06|N|O|1997-02-07|1997-02-09|1997-03-01|NONE|FOB|kly bold depths caj +3105|445|46|2|9|12108.96|0.08|0.08|N|O|1996-12-25|1997-02-04|1997-01-09|COLLECT COD|SHIP|es wake among t +3105|245|100|3|48|54971.52|0.02|0.05|N|O|1997-02-28|1997-01-31|1997-03-18|DELIVER IN PERSON|REG AIR|ending platelets wake carefully ironic inst +3105|905|8|4|23|41535.70|0.04|0.07|N|O|1997-03-08|1996-12-14|1997-03-18|COLLECT COD|REG AIR| detect slyly. blithely unusual requests ar +3105|894|61|5|8|14359.12|0.07|0.07|N|O|1996-12-28|1996-12-28|1997-01-25|NONE|FOB|s. blithely unusual ideas was after +3105|463|51|6|30|40903.80|0.08|0.05|N|O|1997-03-03|1997-02-03|1997-03-05|NONE|FOB|ess accounts boost among t +3106|857|91|1|22|38672.70|0.03|0.02|N|O|1997-02-28|1997-02-12|1997-03-03|DELIVER IN PERSON|FOB|structions atop the blithely +3106|1359|74|2|49|61757.15|0.06|0.06|N|O|1997-02-27|1997-03-11|1997-03-12|NONE|TRUCK|lets. quietly regular courts +3106|518|79|3|42|59577.42|0.09|0.07|N|O|1997-04-05|1997-03-17|1997-04-22|COLLECT COD|REG AIR|nstructions wake. furiously +3106|1957|90|4|6|11153.70|0.10|0.07|N|O|1997-02-02|1997-04-11|1997-02-27|COLLECT COD|REG AIR|symptotes. slyly bold platelets cajol +3106|646|9|5|16|24746.24|0.09|0.08|N|O|1997-02-25|1997-04-10|1997-03-16|NONE|AIR|sits wake slyl +3107|1482|22|1|16|22135.68|0.05|0.04|N|O|1997-08-30|1997-10-20|1997-09-20|TAKE BACK RETURN|REG AIR|regular pinto beans. ironic ideas haggle +3107|1417|18|2|35|46144.35|0.05|0.06|N|O|1997-08-27|1997-11-19|1997-09-14|COLLECT COD|TRUCK|ets doubt furiously final ideas. final +3107|1698|40|3|23|36792.87|0.03|0.06|N|O|1997-12-10|1997-11-11|1997-12-14|TAKE BACK RETURN|SHIP|atelets must ha +3107|861|95|4|27|47570.22|0.00|0.08|N|O|1997-11-15|1997-10-31|1997-11-28|DELIVER IN PERSON|FOB|furiously final +3108|1090|26|1|37|36670.33|0.06|0.04|A|F|1993-10-16|1993-10-01|1993-11-09|DELIVER IN PERSON|RAIL| final requests. +3108|1659|83|2|26|40576.90|0.08|0.05|A|F|1993-11-12|1993-10-05|1993-12-09|COLLECT COD|TRUCK| slyly slow foxes wake furious +3109|176|3|1|32|34437.44|0.08|0.03|A|F|1993-09-05|1993-10-06|1993-09-18|DELIVER IN PERSON|FOB|ecial orbits are furiou +3109|1448|66|2|49|66122.56|0.08|0.06|R|F|1993-10-24|1993-09-30|1993-11-21|TAKE BACK RETURN|AIR| even pearls. furiously pending +3109|1753|80|3|43|71154.25|0.04|0.07|R|F|1993-09-29|1993-09-06|1993-10-13|COLLECT COD|MAIL|ding to the foxes. +3109|782|83|4|26|43752.28|0.01|0.05|R|F|1993-11-16|1993-10-18|1993-12-06|TAKE BACK RETURN|TRUCK| sleep slyly according to t +3109|1421|39|5|50|66121.00|0.01|0.08|A|F|1993-09-17|1993-10-16|1993-10-11|NONE|FOB| regular packages boost blithely even, re +3109|150|77|6|10|10501.50|0.10|0.04|A|F|1993-10-26|1993-10-03|1993-11-09|NONE|TRUCK|sits haggle carefully. regular, unusual ac +3110|885|52|1|1|1785.88|0.02|0.07|A|F|1995-01-15|1995-01-20|1995-01-30|DELIVER IN PERSON|REG AIR|c theodolites a +3110|565|26|2|31|45432.36|0.01|0.06|R|F|1995-03-31|1995-03-07|1995-04-21|TAKE BACK RETURN|REG AIR|en deposits. ironic +3110|21|97|3|34|31314.68|0.02|0.02|A|F|1995-02-23|1995-01-27|1995-03-09|TAKE BACK RETURN|FOB|ly pending requests ha +3110|391|92|4|16|20662.24|0.04|0.04|A|F|1995-01-10|1995-02-06|1995-01-26|NONE|MAIL|across the regular acco +3110|1397|12|5|39|50637.21|0.09|0.01|A|F|1995-02-09|1995-01-21|1995-02-21|NONE|MAIL|side of the blithely unusual courts. slyly +3111|1370|47|1|22|27970.14|0.06|0.05|N|O|1995-09-21|1995-11-09|1995-10-17|COLLECT COD|REG AIR|quests. regular dolphins against the +3111|572|63|2|30|44177.10|0.06|0.05|N|O|1995-10-05|1995-11-15|1995-11-01|TAKE BACK RETURN|TRUCK|eas are furiously slyly special deposits. +3111|514|15|3|10|14145.10|0.02|0.02|N|O|1995-11-10|1995-11-02|1995-12-04|NONE|FOB|ng the slyly ironic inst +3111|1311|88|4|31|37581.61|0.00|0.08|N|O|1995-10-26|1995-09-26|1995-11-02|TAKE BACK RETURN|MAIL|kages detect express attainments +3111|535|26|5|14|20097.42|0.05|0.04|N|O|1995-10-17|1995-10-19|1995-10-19|TAKE BACK RETURN|SHIP|re. pinto +3111|856|90|6|5|8784.25|0.03|0.08|N|O|1995-08-30|1995-10-16|1995-09-04|DELIVER IN PERSON|TRUCK|. carefully even ideas +3111|1474|75|7|41|56394.27|0.09|0.05|N|O|1995-11-22|1995-11-01|1995-12-01|TAKE BACK RETURN|FOB|fily slow ideas. +3136|1414|93|1|30|39462.30|0.02|0.08|R|F|1994-08-13|1994-10-02|1994-09-02|TAKE BACK RETURN|RAIL|leep blithel +3136|1027|28|2|7|6496.14|0.05|0.07|A|F|1994-10-08|1994-09-14|1994-10-11|TAKE BACK RETURN|SHIP|ic pinto beans are slyly. f +3136|1573|54|3|43|63406.51|0.00|0.07|A|F|1994-09-05|1994-09-25|1994-09-11|NONE|RAIL|. special theodolites ha +3136|1152|61|4|26|27381.90|0.04|0.05|A|F|1994-10-13|1994-11-07|1994-11-05|TAKE BACK RETURN|AIR|eep fluffily. daringly silent attainments d +3136|668|69|5|2|3137.32|0.08|0.07|R|F|1994-11-21|1994-11-03|1994-11-26|DELIVER IN PERSON|TRUCK|? special, silent +3136|799|100|6|29|49293.91|0.08|0.07|A|F|1994-11-16|1994-10-03|1994-12-14|NONE|FOB|latelets. final +3137|24|25|1|6|5544.12|0.02|0.02|N|O|1995-09-19|1995-10-23|1995-10-16|NONE|SHIP|ly express as +3137|52|28|2|4|3808.20|0.06|0.04|N|O|1995-10-01|1995-09-11|1995-10-30|COLLECT COD|RAIL|posits wake. silent excuses boost about +3138|925|60|1|7|12781.44|0.05|0.05|R|F|1994-03-04|1994-03-14|1994-03-20|NONE|AIR|lithely quickly even packages. packages +3138|436|37|2|27|36083.61|0.09|0.01|R|F|1994-03-24|1994-03-23|1994-04-18|DELIVER IN PERSON|FOB|counts cajole fluffily carefully special i +3138|1966|67|3|32|59774.72|0.00|0.01|R|F|1994-02-24|1994-05-07|1994-02-28|TAKE BACK RETURN|MAIL|inal foxes affix slyly. fluffily regul +3138|1714|15|4|38|61396.98|0.07|0.04|R|F|1994-02-21|1994-03-21|1994-03-13|COLLECT COD|FOB|lithely fluffily un +3138|96|97|5|12|11953.08|0.09|0.02|A|F|1994-03-04|1994-04-11|1994-03-21|COLLECT COD|FOB|. bold pinto beans haggl +3138|432|91|6|25|33310.75|0.05|0.08|A|F|1994-05-19|1994-04-07|1994-06-17|TAKE BACK RETURN|AIR|dolites around the carefully busy the +3139|394|23|1|46|59541.94|0.08|0.03|R|F|1992-04-28|1992-03-04|1992-05-19|TAKE BACK RETURN|FOB|of the unusual, unusual re +3140|66|42|1|21|20287.26|0.08|0.02|R|F|1992-04-12|1992-05-31|1992-04-21|NONE|REG AIR| furiously sly excuses according to the +3140|887|21|2|10|17878.80|0.07|0.01|A|F|1992-05-30|1992-05-09|1992-06-09|COLLECT COD|RAIL|accounts. expres +3140|1327|28|3|28|34392.96|0.06|0.00|R|F|1992-06-08|1992-07-07|1992-07-08|TAKE BACK RETURN|SHIP|lar ideas. slyly ironic d +3141|1765|50|1|32|53336.32|0.06|0.00|N|O|1995-11-21|1995-12-18|1995-11-26|DELIVER IN PERSON|FOB|oxes are quickly about t +3141|94|70|2|37|36781.33|0.10|0.05|N|O|1996-01-24|1995-12-16|1996-01-27|DELIVER IN PERSON|AIR|press pinto beans. bold accounts boost b +3141|782|79|3|9|15145.02|0.09|0.02|N|O|1995-11-11|1995-12-10|1995-12-02|DELIVER IN PERSON|MAIL|uickly ironic, pendi +3141|460|19|4|47|63941.62|0.03|0.01|N|O|1995-11-29|1996-01-13|1995-12-10|TAKE BACK RETURN|TRUCK| are slyly pi +3142|1193|66|1|15|16412.85|0.03|0.08|R|F|1992-08-15|1992-08-18|1992-08-22|DELIVER IN PERSON|AIR|instructions are. ironic packages doz +3143|899|99|1|22|39597.58|0.02|0.00|A|F|1993-05-11|1993-03-26|1993-05-20|TAKE BACK RETURN|MAIL|l, special instructions nag +3143|1823|53|2|40|68992.80|0.03|0.08|A|F|1993-05-07|1993-03-29|1993-05-17|COLLECT COD|FOB|sly unusual theodolites. slyly ev +3143|1825|69|3|22|37990.04|0.05|0.03|A|F|1993-03-18|1993-05-09|1993-04-14|DELIVER IN PERSON|MAIL|beans. fluf +3143|657|58|4|46|71651.90|0.05|0.08|R|F|1993-04-19|1993-03-21|1993-05-05|COLLECT COD|REG AIR|low forges haggle. even packages use bli +3168|600|31|1|46|69027.60|0.08|0.08|R|F|1992-02-14|1992-03-02|1992-03-02|TAKE BACK RETURN|SHIP|y across the express accounts. fluff +3168|1537|38|2|1|1438.53|0.06|0.08|A|F|1992-05-27|1992-03-12|1992-06-09|TAKE BACK RETURN|SHIP|pinto beans. slyly regular courts haggle +3168|1271|9|3|13|15239.51|0.09|0.02|A|F|1992-03-05|1992-04-29|1992-03-15|NONE|SHIP|ironic somas haggle quick +3168|1645|69|4|11|17013.04|0.02|0.05|R|F|1992-04-12|1992-03-17|1992-05-12|COLLECT COD|SHIP|ously furious dependenc +3169|1911|56|1|12|21754.92|0.01|0.04|R|F|1994-01-05|1994-03-18|1994-01-21|COLLECT COD|REG AIR| regular d +3169|1999|88|2|17|32316.83|0.05|0.04|R|F|1994-03-02|1994-01-21|1994-03-03|DELIVER IN PERSON|TRUCK|usly regular packages. ironi +3169|1874|75|3|12|21310.44|0.08|0.07|A|F|1994-04-18|1994-03-12|1994-05-08|TAKE BACK RETURN|FOB|atelets. pac +3169|1050|51|4|26|24727.30|0.10|0.04|R|F|1994-04-08|1994-03-21|1994-04-29|NONE|TRUCK|ter the regular ideas. slyly iro +3169|1078|79|5|6|5874.42|0.09|0.01|A|F|1994-03-24|1994-02-22|1994-04-04|TAKE BACK RETURN|AIR|ular instructions. ca +3169|1761|62|6|46|76486.96|0.02|0.07|A|F|1994-02-01|1994-01-22|1994-02-24|DELIVER IN PERSON|RAIL|thely bold theodolites are fl +3170|399|84|1|12|15592.68|0.03|0.03|N|O|1998-02-12|1998-01-17|1998-02-24|NONE|TRUCK|ing accounts along the speci +3170|991|26|2|21|39731.79|0.01|0.00|N|O|1997-12-09|1998-01-31|1997-12-21|DELIVER IN PERSON|MAIL|o beans. carefully final requests dou +3170|884|51|3|27|48191.76|0.00|0.05|N|O|1998-02-25|1998-01-29|1998-02-27|COLLECT COD|AIR|efully bold foxes. regular, ev +3170|409|10|4|34|44519.60|0.05|0.04|N|O|1998-02-01|1998-01-11|1998-02-20|TAKE BACK RETURN|TRUCK|s about the fluffily final de +3170|898|99|5|32|57564.48|0.02|0.04|N|O|1997-11-24|1997-12-12|1997-12-15|COLLECT COD|SHIP|ggle about the furiously r +3170|1092|63|6|43|42702.87|0.08|0.05|N|O|1998-01-05|1998-01-04|1998-01-14|NONE|REG AIR|. express dolphins use sly +3170|839|40|7|26|45235.58|0.10|0.05|N|O|1998-02-12|1997-12-22|1998-02-28|COLLECT COD|TRUCK|s engage furiously. +3171|464|94|1|34|46391.64|0.04|0.00|A|F|1993-05-30|1993-05-27|1993-06-06|DELIVER IN PERSON|REG AIR|r the final, even packages. quickly +3171|1384|85|2|50|64269.00|0.01|0.04|A|F|1993-07-19|1993-05-15|1993-07-31|TAKE BACK RETURN|REG AIR|riously final foxes about the ca +3172|958|27|1|4|7435.80|0.06|0.07|A|F|1992-09-26|1992-08-15|1992-10-20|DELIVER IN PERSON|TRUCK|s are slyly thin package +3172|1479|97|2|43|59360.21|0.05|0.07|R|F|1992-08-22|1992-07-07|1992-08-26|COLLECT COD|MAIL| final packages. +3172|1320|97|3|13|15877.16|0.03|0.01|R|F|1992-07-06|1992-08-06|1992-08-05|DELIVER IN PERSON|MAIL|inal deposits haggle along the +3172|1346|23|4|28|34925.52|0.08|0.04|R|F|1992-07-09|1992-07-14|1992-07-16|NONE|MAIL|regular ideas. packages are furi +3172|638|39|5|31|47697.53|0.05|0.08|A|F|1992-09-01|1992-08-27|1992-09-23|NONE|SHIP|. slyly regular dependencies haggle quiet +3173|1942|43|1|35|64537.90|0.01|0.08|N|O|1996-09-09|1996-10-15|1996-10-04|TAKE BACK RETURN|RAIL| across the slyly even requests. +3173|1771|56|2|5|8363.85|0.09|0.07|N|O|1996-12-06|1996-09-17|1996-12-07|DELIVER IN PERSON|REG AIR|express depo +3173|459|18|3|16|21751.20|0.06|0.01|N|O|1996-08-12|1996-09-21|1996-08-22|NONE|SHIP|e special, +3173|940|41|4|2|3681.88|0.00|0.00|N|O|1996-10-15|1996-11-06|1996-10-18|COLLECT COD|MAIL|ular pearls +3173|1845|46|5|2|3493.68|0.00|0.06|N|O|1996-08-18|1996-09-21|1996-09-07|DELIVER IN PERSON|MAIL|fluffily above t +3174|1853|97|1|6|10529.10|0.04|0.08|N|O|1996-03-13|1996-02-09|1996-03-22|DELIVER IN PERSON|AIR| furiously ironic +3174|1936|25|2|4|7351.72|0.01|0.05|N|O|1995-11-17|1996-01-08|1995-11-27|DELIVER IN PERSON|RAIL|deas sleep thi +3174|914|49|3|21|38113.11|0.08|0.05|N|O|1996-02-20|1995-12-28|1996-03-17|NONE|MAIL|iously. idly bold theodolites a +3174|1915|48|4|13|23619.83|0.08|0.06|N|O|1996-01-11|1996-01-26|1996-02-01|DELIVER IN PERSON|SHIP|leep quickly? slyly special platelets +3174|711|44|5|39|62856.69|0.02|0.06|N|O|1995-12-02|1996-02-08|1995-12-12|TAKE BACK RETURN|TRUCK| wake slyly foxes. bold requests p +3174|1194|67|6|8|8761.52|0.07|0.08|N|O|1995-12-07|1996-01-08|1995-12-29|DELIVER IN PERSON|TRUCK|nic deposits among t +3175|1193|2|1|28|30637.32|0.10|0.01|R|F|1994-09-27|1994-10-05|1994-10-04|NONE|FOB|ore the even, silent foxes. b +3175|6|32|2|38|34428.00|0.01|0.07|R|F|1994-10-10|1994-08-25|1994-10-28|NONE|MAIL|the quickly even dolph +3175|1289|27|3|12|14283.36|0.09|0.07|R|F|1994-10-16|1994-09-15|1994-10-18|NONE|AIR|ter the pending deposits. slyly e +3175|850|50|4|14|24511.90|0.02|0.05|R|F|1994-10-21|1994-09-05|1994-11-15|NONE|MAIL|nt dependencies are quietly even +3175|171|50|5|47|50344.99|0.08|0.03|R|F|1994-08-08|1994-09-10|1994-08-21|COLLECT COD|REG AIR| final requests x-r +3175|1745|46|6|44|72456.56|0.01|0.00|R|F|1994-09-26|1994-08-30|1994-10-24|TAKE BACK RETURN|MAIL|are carefully furiously ironic accounts. e +3175|9|35|7|32|29088.00|0.01|0.02|R|F|1994-09-29|1994-09-20|1994-10-10|TAKE BACK RETURN|SHIP|lites sleep +3200|1160|69|1|17|18039.72|0.10|0.00|N|O|1996-06-06|1996-04-21|1996-06-14|DELIVER IN PERSON|AIR|side of the furiously pendin +3200|1655|79|2|27|42029.55|0.03|0.00|N|O|1996-05-07|1996-05-01|1996-05-09|TAKE BACK RETURN|REG AIR|as haggle furiously against the fluff +3200|1310|87|3|36|43607.16|0.01|0.01|N|O|1996-03-22|1996-03-19|1996-03-30|DELIVER IN PERSON|FOB|f the carefu +3200|300|55|4|11|13203.30|0.10|0.02|N|O|1996-03-18|1996-03-21|1996-04-14|COLLECT COD|RAIL|osits sleep fur +3200|1977|78|5|16|30063.52|0.05|0.00|N|O|1996-02-28|1996-03-13|1996-03-11|NONE|RAIL|ly against the quiet packages. blith +3200|1744|71|6|25|41143.50|0.10|0.01|N|O|1996-02-08|1996-04-11|1996-03-06|COLLECT COD|FOB| slyly regular hockey players! pinto beans +3201|458|59|1|11|14942.95|0.10|0.06|A|F|1993-09-27|1993-08-29|1993-10-18|NONE|TRUCK|ing to the furiously expr +3201|1178|51|2|27|29137.59|0.08|0.02|R|F|1993-08-31|1993-08-24|1993-09-08|TAKE BACK RETURN|FOB|deposits are slyly along +3201|1190|63|3|50|54559.50|0.00|0.08|R|F|1993-10-27|1993-09-30|1993-11-16|COLLECT COD|TRUCK| deposits. express, ir +3202|1827|14|1|30|51864.60|0.09|0.02|A|F|1993-03-18|1993-03-10|1993-03-23|COLLECT COD|SHIP|ven platelets. furiously final +3202|198|25|2|22|24160.18|0.01|0.02|R|F|1993-02-16|1993-02-16|1993-03-16|TAKE BACK RETURN|MAIL|the express packages. fu +3203|1435|36|1|23|30737.89|0.01|0.07|N|O|1998-01-04|1998-01-12|1998-01-24|COLLECT COD|SHIP|uses. fluffily ironic pinto bea +3203|1878|65|2|22|39157.14|0.03|0.03|N|O|1998-02-12|1998-01-01|1998-02-18|TAKE BACK RETURN|REG AIR|e the blithely regular accounts boost f +3204|120|99|1|10|10201.20|0.10|0.07|R|F|1993-01-27|1993-03-08|1993-01-29|COLLECT COD|SHIP|counts. bold +3204|65|91|2|39|37637.34|0.10|0.03|R|F|1993-02-11|1993-03-19|1993-02-28|TAKE BACK RETURN|MAIL|sits sleep theodolites. slyly bo +3205|677|40|1|7|11043.69|0.09|0.00|R|F|1992-07-05|1992-06-17|1992-07-07|NONE|SHIP|ly alongsi +3205|288|89|2|32|38024.96|0.08|0.03|A|F|1992-06-01|1992-07-10|1992-06-06|TAKE BACK RETURN|RAIL|lar accoun +3205|1027|63|3|38|35264.76|0.10|0.08|A|F|1992-07-31|1992-06-03|1992-08-20|DELIVER IN PERSON|AIR|usly quiet accounts. slyly pending pinto +3205|554|55|4|10|14545.50|0.01|0.07|A|F|1992-06-18|1992-07-04|1992-07-16|COLLECT COD|RAIL| deposits cajole careful +3205|691|23|5|18|28650.42|0.03|0.03|A|F|1992-07-04|1992-06-14|1992-08-03|TAKE BACK RETURN|RAIL|symptotes. slyly even deposits ar +3205|1944|33|6|19|35072.86|0.07|0.08|R|F|1992-05-28|1992-05-30|1992-06-05|COLLECT COD|AIR|yly pending packages snooz +3205|690|22|7|36|57264.84|0.06|0.03|A|F|1992-05-31|1992-06-19|1992-06-03|TAKE BACK RETURN|SHIP|s. ironic platelets above the s +3206|1752|79|1|1|1653.75|0.07|0.05|N|O|1996-11-22|1996-10-16|1996-12-07|TAKE BACK RETURN|FOB|y unusual foxes cajole ab +3206|1108|45|2|37|37336.70|0.07|0.01|N|O|1996-09-06|1996-10-31|1996-09-25|COLLECT COD|SHIP| quick theodolites hagg +3206|1856|57|3|24|42188.40|0.00|0.08|N|O|1996-08-25|1996-10-01|1996-09-04|COLLECT COD|TRUCK|encies sleep deposits-- +3207|1125|34|1|2|2052.24|0.10|0.03|N|O|1998-06-15|1998-04-20|1998-06-21|COLLECT COD|MAIL|among the ironic, even packages +3207|706|3|2|42|67481.40|0.00|0.00|N|O|1998-05-02|1998-05-10|1998-06-01|NONE|SHIP|to the quickly special accounts? ironically +3207|1515|96|3|17|24080.67|0.03|0.04|N|O|1998-03-27|1998-04-06|1998-03-28|COLLECT COD|RAIL|eep against the instructions. gifts hag +3207|189|42|4|32|34853.76|0.00|0.03|N|O|1998-06-17|1998-04-26|1998-07-07|TAKE BACK RETURN|SHIP|y across the slyly express foxes. bl +3207|828|62|5|8|13830.56|0.00|0.06|N|O|1998-06-13|1998-04-26|1998-07-11|COLLECT COD|SHIP|y. final pint +3207|1337|14|6|32|39626.56|0.03|0.05|N|O|1998-04-19|1998-05-01|1998-05-08|COLLECT COD|FOB|l deposits wake beyond the carefully +3232|133|34|1|22|22728.86|0.10|0.01|A|F|1992-11-30|1992-12-09|1992-12-04|NONE|RAIL|thely. furio +3232|1344|83|2|34|42341.56|0.07|0.04|R|F|1993-01-09|1992-11-14|1993-02-03|NONE|SHIP|old packages integrate quickly +3232|1803|33|3|3|5114.40|0.04|0.06|R|F|1992-12-14|1992-12-11|1992-12-29|DELIVER IN PERSON|FOB|ily blithely ironic acco +3233|506|7|1|23|32349.50|0.04|0.05|A|F|1994-12-07|1995-01-11|1994-12-26|NONE|AIR|pending instructions use after the carefu +3233|1535|56|2|6|8619.18|0.02|0.08|A|F|1994-12-06|1994-12-05|1994-12-07|TAKE BACK RETURN|REG AIR|requests are quickly above the slyly p +3233|999|2|3|2|3799.98|0.04|0.06|R|F|1995-01-03|1995-01-02|1995-01-21|TAKE BACK RETURN|AIR| across the bold packages +3233|86|12|4|25|24652.00|0.04|0.07|A|F|1994-11-24|1995-01-07|1994-12-11|NONE|RAIL|oss the pl +3234|790|91|1|45|76085.55|0.01|0.04|N|O|1996-05-15|1996-05-09|1996-06-02|DELIVER IN PERSON|TRUCK| express packages are carefully. f +3234|833|33|2|23|39878.09|0.03|0.00|N|O|1996-05-29|1996-05-15|1996-06-17|DELIVER IN PERSON|AIR|d-- fluffily special packag +3234|741|6|3|16|26267.84|0.06|0.05|N|O|1996-06-10|1996-05-30|1996-06-18|COLLECT COD|RAIL|ithely ironic accounts wake along t +3234|1211|86|4|50|55610.50|0.09|0.05|N|O|1996-06-11|1996-05-19|1996-06-18|NONE|MAIL|ly regular ideas according to the regula +3234|1643|26|5|14|21624.96|0.01|0.07|N|O|1996-04-06|1996-05-30|1996-04-13|NONE|REG AIR|lithely regular f +3235|1082|18|1|9|8847.72|0.07|0.00|N|O|1995-11-17|1995-12-24|1995-11-30|COLLECT COD|AIR|l courts sleep quickly slyly +3235|949|50|2|43|79547.42|0.10|0.07|N|O|1995-12-25|1996-01-23|1996-01-09|COLLECT COD|MAIL|ckly final instru +3235|1377|78|3|29|37072.73|0.06|0.06|N|O|1996-01-28|1995-12-26|1996-02-12|DELIVER IN PERSON|RAIL|e fluffy pinto bea +3235|1774|75|4|23|38542.71|0.00|0.01|N|O|1996-02-16|1996-01-05|1996-03-07|DELIVER IN PERSON|SHIP|ldly ironic pinto beans +3236|1163|36|1|10|10641.60|0.06|0.05|N|O|1996-11-15|1996-12-14|1996-11-29|TAKE BACK RETURN|AIR|arefully. fluffily reg +3236|1217|55|2|21|23482.41|0.01|0.07|N|O|1996-12-23|1996-12-12|1997-01-21|NONE|AIR| final pinto +3236|1171|8|3|7|7505.19|0.07|0.01|N|O|1996-12-27|1996-12-18|1997-01-24|DELIVER IN PERSON|SHIP|dolites. slyly unus +3237|108|35|1|11|11089.10|0.02|0.07|A|F|1992-08-03|1992-07-31|1992-08-13|TAKE BACK RETURN|AIR|es. permanently express platelets besid +3238|717|18|1|12|19412.52|0.06|0.01|R|F|1993-03-06|1993-05-08|1993-04-01|DELIVER IN PERSON|AIR|ackages affix furiously. furiously bol +3238|1724|9|2|26|42268.72|0.01|0.06|A|F|1993-02-25|1993-04-04|1993-03-20|TAKE BACK RETURN|REG AIR|g accounts sleep furiously ironic attai +3238|801|35|3|1|1701.80|0.00|0.04|R|F|1993-05-17|1993-04-18|1993-05-27|NONE|SHIP|wake alongs +3239|445|4|1|50|67272.00|0.05|0.01|N|O|1998-02-09|1998-04-02|1998-02-22|NONE|FOB|d blithely stea +3239|449|8|2|43|58025.92|0.01|0.06|N|O|1998-01-15|1998-03-12|1998-01-29|COLLECT COD|REG AIR|y. bold pinto beans use +3239|130|57|3|13|13391.69|0.01|0.05|N|O|1998-02-10|1998-02-19|1998-02-25|DELIVER IN PERSON|MAIL|r deposits solve fluf +3239|1949|50|4|26|48124.44|0.03|0.05|N|O|1998-01-21|1998-03-21|1998-02-08|DELIVER IN PERSON|SHIP|ngly pending platelets are fluff +3239|118|71|5|31|31561.41|0.10|0.08|N|O|1998-04-14|1998-03-24|1998-04-17|DELIVER IN PERSON|FOB|foxes. pendin +3264|1996|97|1|39|74021.61|0.06|0.06|N|O|1996-11-07|1996-12-12|1996-11-20|TAKE BACK RETURN|REG AIR|sleep carefully after the slyly final +3264|1303|4|2|34|40946.20|0.00|0.01|N|O|1997-01-03|1997-01-06|1997-01-29|TAKE BACK RETURN|REG AIR|rns haggle carefully. blit +3264|1243|55|3|11|12586.64|0.09|0.03|N|O|1996-12-11|1996-12-19|1996-12-15|DELIVER IN PERSON|SHIP|regular packages +3264|1087|88|4|24|23713.92|0.09|0.07|N|O|1997-01-07|1996-12-13|1997-01-11|TAKE BACK RETURN|RAIL|ctions. quick +3264|622|23|5|6|9135.72|0.04|0.03|N|O|1996-11-10|1996-12-05|1996-11-22|TAKE BACK RETURN|SHIP|press packages. ironical +3264|1404|5|6|43|56132.20|0.06|0.06|N|O|1997-01-17|1997-01-24|1997-02-01|TAKE BACK RETURN|TRUCK|leep at the blithely bold +3265|249|4|1|8|9193.92|0.06|0.02|A|F|1992-09-01|1992-09-12|1992-09-27|DELIVER IN PERSON|TRUCK|thely ironic requests sleep slyly-- i +3265|718|51|2|7|11330.97|0.09|0.00|R|F|1992-09-16|1992-09-04|1992-10-14|DELIVER IN PERSON|MAIL|he forges. fluffily regular asym +3265|1901|90|3|28|50481.20|0.09|0.08|A|F|1992-10-22|1992-08-23|1992-10-25|NONE|RAIL|n requests. quickly final dinos +3266|632|95|1|31|47511.53|0.09|0.02|N|O|1995-06-19|1995-05-04|1995-07-06|COLLECT COD|MAIL|grate among the quickly express deposits +3266|379|8|2|43|55012.91|0.06|0.07|R|F|1995-05-04|1995-05-30|1995-05-11|COLLECT COD|AIR|ular asymptotes use careful +3267|1843|73|1|33|57579.72|0.06|0.01|N|O|1997-03-30|1997-03-25|1997-04-23|TAKE BACK RETURN|AIR|es boost. +3268|957|58|1|1|1857.95|0.06|0.08|A|F|1994-09-12|1994-08-31|1994-09-16|NONE|TRUCK|. ironic, bold requests use carefull +3268|420|50|2|40|52816.80|0.08|0.01|R|F|1994-06-30|1994-08-22|1994-07-25|COLLECT COD|FOB|ly. bold, eve +3269|1608|50|1|40|60384.00|0.02|0.07|N|O|1996-06-11|1996-05-06|1996-06-15|DELIVER IN PERSON|TRUCK|es. pending d +3269|373|58|2|46|58575.02|0.00|0.02|N|O|1996-04-21|1996-04-12|1996-05-10|DELIVER IN PERSON|MAIL|final asymptotes nag +3269|431|19|3|39|51925.77|0.02|0.03|N|O|1996-03-13|1996-05-26|1996-03-19|COLLECT COD|MAIL|he express packages? +3269|821|88|4|37|63707.34|0.07|0.05|N|O|1996-06-14|1996-04-27|1996-07-07|NONE|MAIL|egular requests. carefully un +3269|925|28|5|42|76688.64|0.09|0.05|N|O|1996-03-19|1996-04-24|1996-04-18|COLLECT COD|TRUCK| the special packages. +3269|1301|16|6|16|19236.80|0.01|0.08|N|O|1996-03-03|1996-04-06|1996-03-06|NONE|RAIL|s cajole. silent deposits are f +3270|341|70|1|11|13654.74|0.07|0.06|N|O|1997-07-29|1997-08-11|1997-08-05|TAKE BACK RETURN|AIR| solve at the regular deposits. +3270|372|57|2|44|55984.28|0.10|0.05|N|O|1997-07-20|1997-08-15|1997-08-04|DELIVER IN PERSON|SHIP| accounts. carefully even +3270|643|75|3|20|30872.80|0.01|0.02|N|O|1997-08-26|1997-07-31|1997-08-30|DELIVER IN PERSON|FOB|en accounts among the c +3270|1881|11|4|29|51703.52|0.06|0.05|N|O|1997-07-01|1997-07-23|1997-07-10|TAKE BACK RETURN|MAIL|sly regular asymptotes. slyly dog +3270|338|23|5|32|39626.56|0.03|0.00|N|O|1997-09-23|1997-08-17|1997-09-27|NONE|REG AIR|promise carefully. +3270|570|1|6|29|42646.53|0.01|0.04|N|O|1997-08-22|1997-08-17|1997-09-06|COLLECT COD|RAIL|ptotes nag above the quickly bold deposits +3270|1168|5|7|9|9622.44|0.06|0.08|N|O|1997-08-14|1997-08-11|1997-09-09|DELIVER IN PERSON|SHIP|ual packages +3271|565|56|1|30|43966.80|0.01|0.04|A|F|1992-01-16|1992-03-20|1992-01-17|DELIVER IN PERSON|AIR|r the unusual Tiresia +3271|533|34|2|18|25803.54|0.09|0.06|R|F|1992-05-01|1992-03-28|1992-05-29|DELIVER IN PERSON|FOB| packages eat around the furiously regul +3271|949|50|3|14|25899.16|0.05|0.01|A|F|1992-02-24|1992-02-14|1992-03-23|NONE|AIR|ending, even packa +3271|634|97|4|29|44504.27|0.07|0.04|A|F|1992-03-10|1992-02-05|1992-03-14|COLLECT COD|MAIL|lar instructions. carefully regular +3296|835|35|1|12|20829.96|0.06|0.07|R|F|1994-12-08|1994-12-14|1994-12-24|COLLECT COD|AIR|y about the slyly bold pinto bea +3296|1485|3|2|31|42980.88|0.08|0.00|R|F|1995-01-26|1994-12-25|1995-02-16|NONE|REG AIR|ainst the furi +3296|1842|43|3|29|50571.36|0.02|0.04|A|F|1995-01-12|1994-11-26|1995-02-06|DELIVER IN PERSON|SHIP|ss ideas are reg +3296|1397|74|4|47|61024.33|0.06|0.00|A|F|1994-11-08|1994-12-20|1994-11-30|NONE|FOB|egular deposits. quic +3296|1765|50|5|16|26668.16|0.06|0.02|R|F|1995-01-11|1994-12-27|1995-01-12|DELIVER IN PERSON|SHIP|kages cajole carefully +3296|1966|99|6|40|74718.40|0.00|0.04|A|F|1994-12-28|1994-12-08|1995-01-13|COLLECT COD|REG AIR|ronic ideas across the +3296|358|43|7|6|7550.10|0.02|0.01|R|F|1995-01-03|1994-12-23|1995-01-27|TAKE BACK RETURN|AIR|carefully fur +3297|1333|72|1|10|12343.30|0.10|0.04|A|F|1992-12-14|1993-01-21|1992-12-26|NONE|SHIP|ironic idea +3298|1485|25|1|9|12478.32|0.01|0.06|N|O|1996-08-15|1996-05-24|1996-09-12|COLLECT COD|REG AIR|ly final accou +3298|1860|61|2|27|47570.22|0.06|0.06|N|O|1996-07-10|1996-05-21|1996-07-15|DELIVER IN PERSON|FOB|lar packages. regular deposit +3298|289|71|3|25|29732.00|0.10|0.08|N|O|1996-06-30|1996-05-31|1996-07-23|COLLECT COD|SHIP|ly express f +3298|1908|41|4|1|1809.90|0.10|0.03|N|O|1996-07-31|1996-05-23|1996-08-24|TAKE BACK RETURN|FOB|refully regular requ +3299|1825|55|1|40|69072.80|0.03|0.02|A|F|1994-03-21|1994-03-23|1994-04-12|COLLECT COD|AIR|lyly even request +3300|1288|26|1|3|3567.84|0.07|0.02|N|O|1995-11-01|1995-10-02|1995-11-20|NONE|REG AIR|g according to the dugouts. caref +3300|1481|82|2|23|31797.04|0.02|0.02|N|O|1995-08-17|1995-09-03|1995-09-04|COLLECT COD|TRUCK|he fluffily final a +3301|1690|32|1|45|71626.05|0.04|0.05|A|F|1994-11-19|1994-10-27|1994-11-24|TAKE BACK RETURN|FOB|nusual, final excuses after the entici +3302|354|83|1|45|56445.75|0.09|0.00|N|O|1996-01-24|1995-12-16|1996-02-13|COLLECT COD|FOB|counts use quickl +3303|1839|40|1|25|43520.75|0.06|0.01|N|O|1998-03-25|1998-01-31|1998-04-12|NONE|SHIP|lly regular pi +3303|209|10|2|15|16638.00|0.04|0.06|N|O|1998-01-29|1998-01-22|1998-02-21|COLLECT COD|SHIP| detect sly +3303|986|87|3|37|69818.26|0.05|0.02|N|O|1998-02-16|1998-03-07|1998-02-18|TAKE BACK RETURN|TRUCK| carefully ironic asympt +3303|353|38|4|26|32587.10|0.09|0.00|N|O|1998-01-18|1998-03-11|1998-02-11|DELIVER IN PERSON|REG AIR|ickly permanent requests w +3328|1126|63|1|6|6162.72|0.03|0.08|A|F|1993-03-07|1993-01-25|1993-03-29|COLLECT COD|TRUCK|ffily even instructions detect b +3328|44|20|2|23|21712.92|0.01|0.06|R|F|1993-01-12|1993-02-07|1993-01-30|TAKE BACK RETURN|MAIL|y. careful +3328|1390|91|3|44|56821.16|0.05|0.00|R|F|1992-12-03|1992-12-19|1992-12-09|TAKE BACK RETURN|FOB|dly quickly final foxes? re +3328|941|44|4|42|77361.48|0.01|0.05|R|F|1992-11-24|1992-12-20|1992-12-06|DELIVER IN PERSON|AIR|ronic requests +3328|1304|19|5|25|30132.50|0.05|0.00|R|F|1993-01-28|1993-01-04|1993-01-31|NONE|RAIL|e unusual, r +3329|1379|18|1|36|46093.32|0.09|0.08|N|O|1995-08-06|1995-08-03|1995-08-14|DELIVER IN PERSON|TRUCK|ts at the re +3329|59|35|2|9|8631.45|0.00|0.02|N|O|1995-07-24|1995-08-02|1995-08-01|COLLECT COD|MAIL|lly final depo +3329|1222|23|3|1|1123.22|0.04|0.08|N|O|1995-08-22|1995-09-28|1995-09-09|COLLECT COD|REG AIR|regular packages are carefull +3330|191|44|1|49|53468.31|0.05|0.01|R|F|1995-03-02|1995-03-03|1995-03-16|DELIVER IN PERSON|TRUCK|haggle carefully alongside of the bold r +3331|633|27|1|9|13802.67|0.08|0.07|A|F|1993-07-18|1993-07-03|1993-08-16|TAKE BACK RETURN|AIR|odolites. bold accounts +3331|205|6|2|38|41997.60|0.06|0.04|R|F|1993-07-24|1993-06-22|1993-08-23|NONE|AIR|ymptotes haggle across the ca +3331|26|2|3|26|24076.52|0.09|0.05|A|F|1993-08-05|1993-07-17|1993-08-29|DELIVER IN PERSON|MAIL|p asymptotes. carefully unusual in +3332|838|39|1|28|48687.24|0.10|0.02|R|F|1994-12-30|1995-01-16|1995-01-16|COLLECT COD|FOB|s against the carefully special multipl +3332|1360|75|2|21|26488.56|0.08|0.04|R|F|1995-02-04|1995-01-08|1995-02-06|COLLECT COD|MAIL| quick packages sle +3332|1336|13|3|27|33407.91|0.03|0.02|A|F|1994-12-10|1995-01-14|1994-12-11|TAKE BACK RETURN|FOB|ording to the slyly regula +3333|1500|18|1|27|37840.50|0.06|0.08|A|F|1992-12-06|1992-10-26|1992-12-07|COLLECT COD|SHIP|s dazzle fluffil +3333|1989|22|2|36|68075.28|0.08|0.07|R|F|1992-11-20|1992-11-06|1992-12-16|TAKE BACK RETURN|FOB|foxes sleep neve +3333|1073|9|3|38|37014.66|0.05|0.05|A|F|1992-10-30|1992-11-03|1992-11-04|NONE|MAIL|ccounts promise bl +3333|1123|24|4|49|50181.88|0.07|0.07|R|F|1992-10-02|1992-11-30|1992-10-12|DELIVER IN PERSON|MAIL|riously ironic r +3333|430|18|5|45|59869.35|0.07|0.08|A|F|1992-10-04|1992-11-08|1992-10-27|COLLECT COD|SHIP|dolites. quickly r +3334|1865|52|1|20|35337.20|0.04|0.03|N|O|1996-05-21|1996-04-08|1996-05-26|TAKE BACK RETURN|AIR|uses nag furiously. instructions are ca +3334|1891|78|2|7|12550.23|0.09|0.07|N|O|1996-04-28|1996-04-08|1996-05-25|NONE|SHIP|nts sublate slyly express pack +3335|1044|15|1|13|12285.52|0.06|0.07|N|O|1996-01-20|1995-12-20|1996-02-09|COLLECT COD|REG AIR|out the special asymptotes +3335|308|9|2|44|53165.20|0.07|0.02|N|O|1996-01-05|1995-12-25|1996-01-18|DELIVER IN PERSON|SHIP|r packages cajole ac +3335|1398|37|3|16|20790.24|0.01|0.06|N|O|1995-10-18|1995-12-08|1995-11-03|DELIVER IN PERSON|SHIP|g packages. carefully regular reque +3335|894|94|4|47|84359.83|0.10|0.03|N|O|1995-12-02|1995-11-19|1995-12-27|NONE|MAIL| quickly special ideas. +3360|1738|81|1|31|50831.63|0.08|0.04|N|O|1998-04-24|1998-04-12|1998-05-23|COLLECT COD|REG AIR|quests. carefully even deposits wake acros +3360|902|37|2|29|52284.10|0.00|0.06|N|O|1998-04-15|1998-02-25|1998-05-13|TAKE BACK RETURN|FOB|press asymptotes. furiously final +3360|814|15|3|39|66877.59|0.08|0.03|N|O|1998-04-09|1998-04-20|1998-05-05|DELIVER IN PERSON|REG AIR|s. blithely express pinto bean +3360|1168|77|4|29|31005.64|0.10|0.01|N|O|1998-05-19|1998-03-03|1998-06-09|TAKE BACK RETURN|FOB|hely gifts. spe +3360|571|2|5|4|5886.28|0.08|0.07|N|O|1998-02-27|1998-03-23|1998-03-28|COLLECT COD|SHIP|ly busy inst +3360|701|34|6|42|67271.40|0.04|0.01|N|O|1998-05-07|1998-04-18|1998-06-04|DELIVER IN PERSON|FOB|ages cajole. pending, +3361|1438|39|1|6|8036.58|0.02|0.02|R|F|1992-10-02|1992-10-25|1992-10-05|DELIVER IN PERSON|FOB| packages sleep. furiously unus +3361|1701|86|2|33|52889.10|0.01|0.02|R|F|1992-11-09|1992-10-15|1992-11-11|TAKE BACK RETURN|MAIL|uriously ironic accounts. ironic, ir +3361|1901|34|3|31|55889.90|0.06|0.04|R|F|1992-08-29|1992-10-13|1992-09-08|NONE|FOB|ts. pending, regular accounts sleep fur +3362|214|96|1|14|15598.94|0.06|0.05|N|O|1995-08-01|1995-09-06|1995-08-22|NONE|FOB|even Tires +3362|1950|51|2|41|75929.95|0.05|0.03|N|O|1995-10-31|1995-09-04|1995-11-17|COLLECT COD|REG AIR|ake alongside of the +3362|1149|86|3|40|42005.60|0.05|0.06|N|O|1995-08-19|1995-10-17|1995-09-05|TAKE BACK RETURN|FOB|packages haggle furi +3362|12|63|4|3|2736.03|0.03|0.01|N|O|1995-08-26|1995-09-02|1995-09-17|NONE|SHIP|its cajole blithely excuses. de +3362|1372|73|5|36|45841.32|0.06|0.00|N|O|1995-10-05|1995-08-28|1995-11-03|TAKE BACK RETURN|RAIL|es against the quickly permanent pint +3362|1879|80|6|46|81920.02|0.09|0.05|N|O|1995-08-02|1995-10-12|1995-08-28|COLLECT COD|REG AIR|ly bold packages. regular deposits cajol +3363|98|24|1|42|41919.78|0.00|0.08|N|O|1995-11-09|1995-11-25|1995-11-15|TAKE BACK RETURN|RAIL| blithely final ideas nag after +3363|1902|91|2|21|37881.90|0.08|0.08|N|O|1995-12-10|1995-10-28|1995-12-28|COLLECT COD|RAIL|he regular, brave deposits. f +3363|1587|28|3|2|2977.16|0.01|0.07|N|O|1996-01-22|1995-12-01|1996-02-18|TAKE BACK RETURN|SHIP|uickly bold ide +3363|1127|36|4|20|20562.40|0.07|0.06|N|O|1995-12-11|1995-11-15|1995-12-21|COLLECT COD|MAIL|carefully quiet excuses wake. sl +3363|1992|25|5|4|7575.96|0.00|0.08|N|O|1995-10-30|1995-11-17|1995-11-22|COLLECT COD|FOB| ironic dependencie +3364|893|93|1|49|87900.61|0.03|0.05|N|O|1997-09-17|1997-08-23|1997-10-06|NONE|SHIP|d accounts? caref +3364|1102|3|2|38|38117.80|0.02|0.02|N|O|1997-08-30|1997-09-12|1997-09-27|COLLECT COD|REG AIR| slyly express +3364|1560|1|3|10|14615.60|0.00|0.01|N|O|1997-08-10|1997-08-24|1997-08-15|TAKE BACK RETURN|SHIP|g the accounts. final, busy accounts wi +3364|1594|75|4|7|10469.13|0.10|0.05|N|O|1997-07-09|1997-08-01|1997-07-16|NONE|TRUCK|furiously regular ideas haggle furiously b +3364|805|72|5|3|5117.40|0.01|0.00|N|O|1997-10-19|1997-08-15|1997-10-28|TAKE BACK RETURN|TRUCK|c theodolites. blithely ir +3365|1502|83|1|37|51929.50|0.02|0.08|R|F|1994-12-22|1995-02-07|1995-01-20|TAKE BACK RETURN|SHIP|requests. quickly pending instructions a +3365|1664|88|2|37|57929.42|0.07|0.08|A|F|1994-11-24|1995-01-09|1994-11-27|NONE|REG AIR|oze blithely. furiously ironic theodolit +3365|1142|43|3|13|13560.82|0.09|0.02|R|F|1995-02-25|1995-01-31|1995-03-16|NONE|RAIL|pths wake r +3365|1751|78|4|49|80984.75|0.02|0.07|R|F|1995-01-03|1995-01-01|1995-01-18|COLLECT COD|MAIL|lyly unusual asymptotes. final +3365|153|6|5|2|2106.30|0.00|0.03|R|F|1995-02-04|1994-12-30|1995-03-06|TAKE BACK RETURN|FOB|es cajole fluffily pe +3365|1254|29|6|24|27726.00|0.01|0.00|R|F|1995-02-27|1995-01-09|1995-03-27|DELIVER IN PERSON|REG AIR|into beans? carefully regula +3366|398|99|1|4|5193.56|0.07|0.01|N|O|1997-05-20|1997-06-25|1997-06-03|DELIVER IN PERSON|AIR| carefully about +3366|1352|91|2|9|11280.15|0.00|0.08|N|O|1997-06-02|1997-07-05|1997-06-26|COLLECT COD|REG AIR|ackages sleep carefully across the bli +3367|404|92|1|27|35218.80|0.01|0.03|A|F|1993-04-13|1993-03-16|1993-04-26|NONE|RAIL|kly even instructions caj +3367|1410|28|2|34|44587.94|0.04|0.08|A|F|1993-03-30|1993-02-23|1993-04-11|COLLECT COD|MAIL| accounts wake slyly +3367|1195|68|3|38|41655.22|0.03|0.03|R|F|1993-03-13|1993-02-12|1993-03-31|NONE|RAIL|even packages sleep blithely slyly expr +3392|1705|90|1|40|64268.00|0.01|0.01|N|O|1996-02-18|1995-12-16|1996-02-26|COLLECT COD|MAIL|ress instructions affix carefully. fur +3392|1222|97|2|13|14601.86|0.09|0.02|N|O|1995-11-26|1996-01-17|1995-12-01|NONE|MAIL|across the fluffily bold deposits. +3392|1266|78|3|34|39686.84|0.10|0.08|N|O|1996-01-20|1996-01-21|1996-01-24|DELIVER IN PERSON|MAIL|e carefully even braids. +3392|1233|8|4|7|7939.61|0.08|0.05|N|O|1995-12-07|1996-01-09|1995-12-29|TAKE BACK RETURN|RAIL|as. express, final accounts dou +3393|1165|74|1|16|17058.56|0.01|0.00|N|O|1995-07-17|1995-08-19|1995-08-04|COLLECT COD|TRUCK|uses. instructions after the blithely +3393|1249|24|2|44|50610.56|0.08|0.04|N|O|1995-10-16|1995-08-05|1995-11-01|NONE|AIR|ld requests hag +3393|964|67|3|25|46624.00|0.07|0.02|N|O|1995-10-17|1995-08-12|1995-11-11|DELIVER IN PERSON|MAIL|ng excuses +3393|711|44|4|48|77362.08|0.06|0.06|N|O|1995-07-12|1995-09-15|1995-08-02|NONE|FOB| blithely final reques +3393|1779|64|5|37|62188.49|0.07|0.02|N|O|1995-10-16|1995-08-19|1995-10-19|COLLECT COD|AIR|ss the slyly ironic pinto beans. ironic, +3393|619|13|6|17|25833.37|0.04|0.01|N|O|1995-08-15|1995-09-07|1995-09-10|COLLECT COD|MAIL|kly ironic deposits could +3394|1547|48|1|33|47801.82|0.07|0.08|N|O|1996-08-07|1996-07-17|1996-09-02|TAKE BACK RETURN|SHIP|ideas alongside of th +3394|1458|98|2|43|58456.35|0.08|0.03|N|O|1996-08-23|1996-07-20|1996-08-25|COLLECT COD|RAIL|hockey players. slyly regular requests afte +3394|880|14|3|26|46302.88|0.01|0.00|N|O|1996-08-08|1996-06-12|1996-09-05|TAKE BACK RETURN|RAIL|its use furiously. even, even account +3394|802|3|4|14|23839.20|0.08|0.00|N|O|1996-06-02|1996-07-02|1996-06-19|COLLECT COD|MAIL|e furiously final theodolites. furio +3394|1265|66|5|30|34987.80|0.04|0.06|N|O|1996-05-12|1996-07-24|1996-05-19|COLLECT COD|REG AIR|t ideas according to the fluffily iro +3394|1835|22|6|14|24315.62|0.05|0.05|N|O|1996-06-18|1996-06-24|1996-07-17|NONE|REG AIR|arefully regular do +3395|1417|18|1|21|27686.61|0.03|0.06|R|F|1994-12-19|1995-01-13|1994-12-25|TAKE BACK RETURN|SHIP| careful dep +3395|354|39|2|38|47665.30|0.01|0.07|R|F|1995-01-13|1995-01-13|1995-01-25|COLLECT COD|SHIP| silent accounts are blithely +3395|422|23|3|43|56864.06|0.06|0.07|A|F|1994-12-13|1995-01-07|1994-12-14|COLLECT COD|AIR|ckages above the furiously regu +3395|1216|91|4|39|43571.19|0.05|0.07|R|F|1994-12-03|1995-01-17|1994-12-10|NONE|AIR|riously unusual theodolites. fur +3396|1280|55|1|34|40163.52|0.00|0.06|A|F|1994-05-30|1994-08-16|1994-06-11|NONE|AIR|. slyly unusual packages wak +3396|484|14|2|43|59532.64|0.03|0.08|A|F|1994-07-03|1994-08-09|1994-07-14|TAKE BACK RETURN|MAIL|cial packages cajole blithely around the +3396|1376|15|3|9|11496.33|0.01|0.06|R|F|1994-07-01|1994-08-18|1994-07-21|DELIVER IN PERSON|AIR|usly special foxes. accounts wake careful +3396|744|41|4|32|52631.68|0.06|0.02|R|F|1994-08-07|1994-08-10|1994-09-05|COLLECT COD|TRUCK|osits are slyly. final, bold foxes s +3396|1251|26|5|27|31110.75|0.02|0.01|A|F|1994-09-14|1994-07-26|1994-09-28|DELIVER IN PERSON|FOB| theodolites +3396|387|88|6|18|23172.84|0.10|0.00|A|F|1994-07-27|1994-06-26|1994-08-25|TAKE BACK RETURN|REG AIR|l requests haggle furiously along the fur +3396|1973|6|7|31|58124.07|0.05|0.06|A|F|1994-06-07|1994-06-23|1994-06-19|TAKE BACK RETURN|REG AIR|l, express pinto beans. quic +3397|1943|32|1|8|14759.52|0.07|0.01|A|F|1994-08-05|1994-08-11|1994-08-08|DELIVER IN PERSON|RAIL|y final foxes +3397|121|100|2|11|11232.32|0.00|0.07|A|F|1994-07-29|1994-09-18|1994-08-12|DELIVER IN PERSON|REG AIR|iously careful packages. s +3397|1840|84|3|1|1741.84|0.07|0.05|R|F|1994-08-03|1994-07-30|1994-08-28|NONE|RAIL| regular packag +3397|856|57|4|33|57976.05|0.05|0.01|R|F|1994-09-04|1994-08-06|1994-09-22|COLLECT COD|RAIL|gular accounts. blithely re +3397|1316|17|5|28|34084.68|0.05|0.05|R|F|1994-07-13|1994-08-26|1994-07-17|NONE|TRUCK|counts around the final reques +3398|1730|31|1|1|1631.73|0.01|0.08|N|O|1996-11-22|1996-11-16|1996-12-09|COLLECT COD|MAIL| blithely final deposits. +3399|1339|16|1|28|34729.24|0.09|0.05|N|O|1995-06-29|1995-05-19|1995-07-12|COLLECT COD|AIR|oggedly final theodolites grow. fi +3399|546|47|2|8|11572.32|0.01|0.05|A|F|1995-05-15|1995-04-19|1995-06-05|COLLECT COD|TRUCK|s use carefully carefully ir +3399|665|28|3|3|4696.98|0.03|0.00|N|F|1995-06-16|1995-04-04|1995-06-23|NONE|SHIP|hely pending dugouts +3399|137|38|4|21|21779.73|0.09|0.06|A|F|1995-03-12|1995-05-18|1995-03-28|TAKE BACK RETURN|MAIL|se final courts. exc +3424|1809|39|1|39|66721.20|0.06|0.07|N|O|1996-11-03|1996-11-08|1996-11-23|DELIVER IN PERSON|MAIL|bits boost closely slyly p +3425|1196|97|1|11|12069.09|0.03|0.08|N|O|1996-04-24|1996-05-29|1996-05-23|DELIVER IN PERSON|FOB|ckly final deposits use quickly? +3425|785|82|2|37|62373.86|0.06|0.03|N|O|1996-06-04|1996-05-09|1996-06-12|NONE|SHIP|as sleep carefully into the caref +3425|135|14|3|8|8281.04|0.06|0.08|N|O|1996-07-22|1996-06-07|1996-07-26|TAKE BACK RETURN|AIR|iously regular theodolites wake. s +3425|190|91|4|37|40337.03|0.04|0.01|N|O|1996-07-10|1996-05-10|1996-08-02|NONE|SHIP|ngside of the furiously thin dol +3425|784|17|5|48|80869.44|0.08|0.04|N|O|1996-04-14|1996-05-25|1996-04-23|TAKE BACK RETURN|AIR|uctions wake fluffily. care +3425|1480|81|6|24|33155.52|0.05|0.04|N|O|1996-04-22|1996-06-24|1996-04-25|TAKE BACK RETURN|AIR|ajole blithely sl +3426|1098|69|1|20|19981.80|0.05|0.04|N|O|1996-11-10|1996-12-24|1996-12-01|COLLECT COD|FOB|sits cajole blit +3426|134|13|2|19|19648.47|0.10|0.08|N|O|1996-11-02|1997-01-13|1996-11-15|DELIVER IN PERSON|RAIL|slyly special packages oug +3426|665|97|3|19|29747.54|0.08|0.05|N|O|1996-12-07|1996-12-15|1996-12-14|DELIVER IN PERSON|FOB|c accounts cajole carefu +3426|53|54|4|9|8577.45|0.09|0.05|N|O|1996-12-24|1997-01-14|1997-01-13|NONE|FOB|pecial theodolites haggle fluf +3426|486|16|5|31|42980.88|0.07|0.08|N|O|1996-11-11|1996-12-10|1996-12-10|DELIVER IN PERSON|SHIP| even sentiment +3427|534|35|1|41|58815.73|0.10|0.01|N|O|1997-09-11|1997-07-03|1997-10-04|COLLECT COD|RAIL|s the carefully +3427|1890|77|2|24|43005.36|0.02|0.04|N|O|1997-07-01|1997-07-28|1997-07-30|NONE|SHIP|y bold, sly deposits. pendi +3427|1390|29|3|40|51655.60|0.06|0.05|N|O|1997-06-12|1997-08-19|1997-06-23|COLLECT COD|MAIL|patterns cajole ca +3427|1181|54|4|31|33547.58|0.08|0.04|N|O|1997-08-12|1997-07-26|1997-08-25|COLLECT COD|RAIL|s are carefull +3428|1977|78|1|4|7515.88|0.00|0.03|N|O|1996-05-09|1996-06-13|1996-06-02|NONE|REG AIR|sly pending requests int +3428|1175|76|2|35|37665.95|0.02|0.03|N|O|1996-05-01|1996-06-07|1996-05-20|COLLECT COD|TRUCK|ly regular pinto beans sleep +3428|1354|55|3|47|59001.45|0.07|0.05|N|O|1996-04-16|1996-06-08|1996-05-05|NONE|REG AIR|y final pinto +3429|1368|45|1|48|60929.28|0.06|0.02|N|O|1997-04-08|1997-03-09|1997-04-25|TAKE BACK RETURN|SHIP| haggle furiously ir +3429|585|16|2|15|22283.70|0.03|0.04|N|O|1997-02-04|1997-03-09|1997-03-01|TAKE BACK RETURN|TRUCK|beans are fu +3429|686|80|3|10|15866.80|0.05|0.07|N|O|1997-01-19|1997-02-22|1997-01-25|TAKE BACK RETURN|REG AIR|ackages. quickly e +3429|884|18|4|28|49976.64|0.10|0.07|N|O|1997-01-30|1997-03-18|1997-02-17|TAKE BACK RETURN|AIR|nstructions boost. thin +3429|1641|42|5|45|69418.80|0.10|0.00|N|O|1997-04-21|1997-03-08|1997-05-05|COLLECT COD|REG AIR|ites poach a +3430|1882|69|1|2|3567.76|0.07|0.06|R|F|1995-03-07|1995-01-28|1995-03-30|TAKE BACK RETURN|MAIL|sh furiously according to the evenly e +3430|807|74|2|32|54649.60|0.08|0.00|R|F|1995-01-17|1995-01-28|1995-02-06|NONE|TRUCK|egular instruction +3430|964|65|3|41|76463.36|0.06|0.04|R|F|1995-02-18|1995-02-21|1995-03-11|TAKE BACK RETURN|AIR|cuses. silent excuses h +3430|650|13|4|50|77532.50|0.01|0.00|R|F|1994-12-15|1995-03-03|1994-12-24|COLLECT COD|REG AIR|ironic theodolites. carefully regular pac +3430|948|51|5|5|9244.70|0.05|0.05|A|F|1995-04-02|1995-02-12|1995-04-08|DELIVER IN PERSON|FOB|even accounts haggle slyly bol +3430|1708|93|6|15|24145.50|0.08|0.07|A|F|1995-02-01|1995-03-12|1995-02-04|COLLECT COD|SHIP|cajole around the accounts. qui +3430|514|75|7|23|32533.73|0.09|0.08|A|F|1995-03-06|1995-03-01|1995-03-10|COLLECT COD|MAIL|eas according to the +3431|1793|20|1|41|69486.39|0.03|0.06|A|F|1993-09-26|1993-10-13|1993-10-22|NONE|AIR| sleep carefully ironically special +3456|1104|77|1|34|34173.40|0.10|0.06|A|F|1993-08-29|1993-08-26|1993-09-07|TAKE BACK RETURN|SHIP|usy pinto beans b +3457|1813|100|1|29|49729.49|0.03|0.02|R|F|1995-05-12|1995-07-13|1995-06-05|NONE|TRUCK|refully final excuses wake +3457|1060|61|2|22|21143.32|0.06|0.01|N|O|1995-06-23|1995-06-16|1995-06-29|NONE|SHIP|packages nag furiously against +3457|1081|17|3|7|6874.56|0.07|0.08|N|O|1995-08-14|1995-07-06|1995-08-18|COLLECT COD|SHIP| pending accounts along the +3457|10|11|4|24|21840.24|0.07|0.07|N|O|1995-08-03|1995-05-30|1995-08-14|TAKE BACK RETURN|REG AIR|tructions haggle alongsid +3457|1086|57|5|42|41457.36|0.05|0.01|A|F|1995-06-12|1995-06-14|1995-06-14|COLLECT COD|MAIL|riously final instruc +3457|1438|78|6|45|60274.35|0.08|0.01|N|O|1995-08-12|1995-07-18|1995-08-23|TAKE BACK RETURN|SHIP| packages. care +3457|1667|50|7|9|14117.94|0.04|0.00|R|F|1995-05-29|1995-06-30|1995-06-12|DELIVER IN PERSON|FOB|quests. foxes sleep quickly +3458|1325|2|1|48|58863.36|0.06|0.04|R|F|1995-03-17|1995-01-25|1995-03-28|TAKE BACK RETURN|AIR|iously pending dep +3458|492|51|2|46|64054.54|0.06|0.06|R|F|1995-03-08|1995-01-21|1995-03-10|TAKE BACK RETURN|SHIP|nod across the boldly even instruct +3458|1421|22|3|36|47607.12|0.01|0.06|R|F|1995-04-20|1995-02-14|1995-05-09|TAKE BACK RETURN|REG AIR|s lose. blithely ironic requests boost +3458|153|80|4|16|16850.40|0.09|0.03|R|F|1995-03-01|1995-02-25|1995-03-06|TAKE BACK RETURN|AIR|s grow carefully. express, final grouc +3458|1564|5|5|2|2931.12|0.09|0.03|A|F|1995-02-05|1995-02-01|1995-03-07|COLLECT COD|FOB|ironic packages haggle past the furiously +3458|1419|37|6|6|7922.46|0.09|0.04|A|F|1995-03-10|1995-02-02|1995-03-23|TAKE BACK RETURN|AIR|dolites; regular theodolites cajole +3459|1781|8|1|31|52166.18|0.06|0.01|A|F|1994-09-05|1994-10-20|1994-10-03|NONE|REG AIR|y regular pain +3459|1293|68|2|30|35828.70|0.04|0.08|R|F|1994-11-22|1994-09-12|1994-12-11|NONE|REG AIR|nic theodolites; evenly i +3459|401|31|3|45|58563.00|0.04|0.05|A|F|1994-07-31|1994-09-09|1994-08-02|TAKE BACK RETURN|REG AIR|ntly speci +3459|681|82|4|10|15816.80|0.05|0.06|A|F|1994-10-06|1994-09-16|1994-11-03|TAKE BACK RETURN|REG AIR| furiously silent dolphi +3459|1886|16|5|10|17878.80|0.02|0.02|R|F|1994-08-01|1994-10-17|1994-08-11|TAKE BACK RETURN|FOB|. blithely ironic pinto beans above +3460|107|86|1|40|40284.00|0.10|0.06|N|O|1995-12-28|1995-12-14|1996-01-02|NONE|REG AIR|odolites are slyly bold deposits +3460|734|67|2|3|4904.19|0.06|0.00|N|O|1996-01-19|1995-12-28|1996-01-31|COLLECT COD|AIR|er quickly +3460|347|76|3|40|49893.60|0.08|0.07|N|O|1995-10-29|1995-11-10|1995-11-24|TAKE BACK RETURN|REG AIR|o the even deposits +3460|947|16|4|50|92397.00|0.02|0.07|N|O|1996-01-30|1995-12-10|1996-02-06|DELIVER IN PERSON|SHIP|e slyly about the sly +3460|1294|95|5|47|56178.63|0.08|0.05|N|O|1995-12-09|1995-11-12|1995-12-22|TAKE BACK RETURN|SHIP|es haggle slyly regular accounts. fi +3460|621|84|6|46|69994.52|0.03|0.07|N|O|1996-01-27|1996-01-01|1996-02-01|NONE|TRUCK|uses run among the carefully even deposits +3460|446|76|7|28|37700.32|0.00|0.01|N|O|1995-10-28|1995-11-13|1995-11-17|COLLECT COD|SHIP|inal, ironic instructions. carefully +3461|998|1|1|49|93050.51|0.06|0.06|A|F|1993-03-09|1993-04-16|1993-03-13|DELIVER IN PERSON|RAIL|ual request +3461|625|26|2|27|41191.74|0.06|0.06|A|F|1993-02-10|1993-03-02|1993-03-04|COLLECT COD|SHIP|ely unusual deposits. quickly ir +3461|390|19|3|44|56777.16|0.09|0.06|A|F|1993-05-20|1993-04-03|1993-05-27|COLLECT COD|RAIL| haggle quickly even ideas. fin +3461|943|78|4|41|75601.54|0.09|0.02|R|F|1993-02-19|1993-04-20|1993-02-21|NONE|TRUCK|heodolites. blithely ironi +3461|898|65|5|16|28782.24|0.08|0.06|A|F|1993-05-09|1993-04-29|1993-05-26|TAKE BACK RETURN|TRUCK| pending deposi +3461|1669|93|6|24|37695.84|0.10|0.00|A|F|1993-06-01|1993-03-12|1993-06-20|TAKE BACK RETURN|MAIL|thely. carefully re +3462|1509|30|1|4|5642.00|0.09|0.04|N|O|1997-06-12|1997-07-31|1997-06-16|COLLECT COD|RAIL|ackages. fu +3462|395|52|2|43|55701.77|0.08|0.03|N|O|1997-08-01|1997-07-18|1997-08-29|NONE|RAIL| carefully. final, final ideas sleep slyly +3462|1283|21|3|6|7105.68|0.05|0.04|N|O|1997-06-02|1997-08-09|1997-06-30|NONE|RAIL|iously regular fo +3462|981|84|4|2|3763.96|0.09|0.07|N|O|1997-09-10|1997-08-08|1997-09-19|NONE|AIR|nic packages. even accounts alongside +3462|374|59|5|14|17841.18|0.01|0.02|N|O|1997-05-31|1997-07-05|1997-06-24|COLLECT COD|MAIL|yly. blithely bold theodolites wa +3463|608|40|1|45|67887.00|0.02|0.02|A|F|1993-10-30|1993-11-04|1993-11-08|DELIVER IN PERSON|FOB|nts are slyly +3463|980|49|2|43|80882.14|0.04|0.02|A|F|1993-10-28|1993-09-24|1993-11-03|DELIVER IN PERSON|FOB| across the +3488|1598|79|1|1|1499.59|0.04|0.01|A|F|1995-03-06|1995-02-16|1995-03-23|DELIVER IN PERSON|FOB| final excuses. carefully even waters hagg +3488|1035|6|2|48|44929.44|0.00|0.03|A|F|1995-03-29|1995-03-26|1995-04-28|COLLECT COD|SHIP|sly? final requests +3488|1591|92|3|11|16418.49|0.03|0.08|R|F|1995-03-25|1995-02-08|1995-04-16|COLLECT COD|TRUCK|unusual re +3488|411|41|4|12|15736.92|0.05|0.07|R|F|1995-04-27|1995-02-16|1995-05-09|DELIVER IN PERSON|RAIL|e slyly; furiously final packages wak +3488|1552|33|5|18|26163.90|0.09|0.06|A|F|1995-03-18|1995-03-19|1995-03-29|DELIVER IN PERSON|FOB|s the carefully r +3489|1857|1|1|19|33418.15|0.09|0.05|A|F|1993-07-31|1993-10-26|1993-08-15|NONE|SHIP|c deposits alongside of the pending, fu +3489|281|9|2|46|54338.88|0.00|0.00|A|F|1993-08-02|1993-10-09|1993-08-10|TAKE BACK RETURN|TRUCK|xcuses? quickly stealthy dependenci +3490|914|17|1|43|78041.13|0.05|0.05|N|O|1997-08-04|1997-08-06|1997-08-14|TAKE BACK RETURN|SHIP|. even requests cajol +3490|855|55|2|50|87792.50|0.05|0.07|N|O|1997-06-27|1997-08-15|1997-06-28|NONE|RAIL| haggle carefu +3490|925|28|3|8|14607.36|0.10|0.04|N|O|1997-08-11|1997-07-25|1997-08-28|COLLECT COD|MAIL|inal deposits use furiousl +3491|1535|76|1|28|40222.84|0.04|0.03|N|O|1998-09-29|1998-09-08|1998-10-23|COLLECT COD|FOB|ccounts. sly +3491|1218|19|2|22|24622.62|0.08|0.02|N|O|1998-08-19|1998-08-22|1998-09-03|TAKE BACK RETURN|REG AIR| grow against the boldly pending pinto bea +3492|1559|60|1|3|4381.65|0.02|0.08|R|F|1994-11-26|1994-12-28|1994-12-19|COLLECT COD|REG AIR|the deposits. carefully +3492|1256|68|2|7|8100.75|0.04|0.00|R|F|1995-03-10|1995-01-03|1995-03-16|COLLECT COD|FOB|thely regular dolphi +3492|1089|90|3|34|33662.72|0.05|0.06|A|F|1994-12-07|1994-12-29|1994-12-24|COLLECT COD|AIR| unusual requests. ir +3492|1469|87|4|30|41113.80|0.02|0.06|A|F|1995-01-29|1995-01-02|1995-02-13|DELIVER IN PERSON|MAIL| detect furiously permanent, unusual accou +3492|1215|90|5|47|52461.87|0.09|0.07|R|F|1995-03-24|1994-12-28|1995-03-29|NONE|REG AIR|deposits. quickly express +3492|212|40|6|47|52273.87|0.04|0.07|R|F|1994-12-12|1995-01-18|1994-12-26|COLLECT COD|RAIL|ronic instructions u +3493|926|95|1|31|56634.52|0.06|0.07|R|F|1993-10-22|1993-10-12|1993-11-07|DELIVER IN PERSON|REG AIR|ructions. slyly regular accounts across the +3493|1320|21|2|10|12213.20|0.02|0.06|R|F|1993-08-27|1993-10-07|1993-09-23|COLLECT COD|TRUCK|hall have to integ +3494|1162|99|1|40|42526.40|0.05|0.04|R|F|1993-07-10|1993-06-01|1993-07-25|TAKE BACK RETURN|TRUCK|lites haggle furiously about the fin +3494|742|43|2|23|37783.02|0.10|0.01|A|F|1993-06-19|1993-06-04|1993-07-14|NONE|FOB|osits nag +3494|1972|5|3|40|74958.80|0.02|0.08|A|F|1993-05-30|1993-07-02|1993-06-20|TAKE BACK RETURN|MAIL|uests cajole blithely +3494|761|62|4|30|49852.80|0.04|0.03|R|F|1993-07-01|1993-06-08|1993-07-15|TAKE BACK RETURN|TRUCK|ns are quickly regular, +3495|274|2|1|20|23485.40|0.10|0.03|N|O|1996-04-24|1996-05-18|1996-05-01|TAKE BACK RETURN|RAIL|posits are carefully; forges cajole qui +3495|1722|49|2|24|38969.28|0.05|0.02|N|O|1996-03-22|1996-04-10|1996-04-07|DELIVER IN PERSON|RAIL|ic, final pains along the even request +3495|1986|87|3|16|30207.68|0.08|0.02|N|O|1996-03-30|1996-04-02|1996-04-12|TAKE BACK RETURN|AIR|y bold dependencies; blithely idle sautern +3520|280|62|1|30|35408.40|0.04|0.02|N|O|1997-11-11|1997-10-02|1997-12-06|COLLECT COD|SHIP|deas should solve blithely among the ironi +3520|1668|51|2|38|59647.08|0.00|0.04|N|O|1997-08-14|1997-10-26|1997-09-09|NONE|RAIL|yly final packages according to the quickl +3520|1053|89|3|5|4770.25|0.01|0.02|N|O|1997-11-13|1997-09-22|1997-12-09|NONE|MAIL|ly even ideas haggle +3520|638|39|4|41|63083.83|0.01|0.01|N|O|1997-08-06|1997-09-20|1997-08-20|TAKE BACK RETURN|AIR| carefully pendi +3520|1622|5|5|35|53326.70|0.02|0.02|N|O|1997-09-16|1997-09-03|1997-09-24|DELIVER IN PERSON|FOB|s nag carefully. sometimes unusual account +3521|585|46|1|48|71307.84|0.09|0.03|A|F|1993-01-03|1992-12-31|1993-01-22|NONE|AIR|ses use. furiously express ideas wake f +3521|1309|10|2|2|2420.60|0.05|0.06|R|F|1993-01-29|1992-12-20|1993-02-23|NONE|MAIL|refully duri +3521|1780|23|3|38|63907.64|0.00|0.08|A|F|1993-02-15|1992-12-10|1993-03-10|COLLECT COD|FOB|ges hang q +3521|1440|19|4|26|34877.44|0.02|0.08|R|F|1993-01-04|1993-01-20|1993-01-17|DELIVER IN PERSON|AIR|onic dependencies haggle. fur +3521|351|8|5|28|35037.80|0.10|0.01|A|F|1993-01-06|1993-01-22|1993-02-02|TAKE BACK RETURN|FOB|e slyly above the slyly final +3522|37|88|1|6|5622.18|0.08|0.03|A|F|1995-01-21|1994-12-09|1995-01-23|NONE|SHIP|tes snooze +3522|865|99|2|48|84761.28|0.00|0.03|R|F|1994-12-05|1994-10-30|1994-12-26|TAKE BACK RETURN|SHIP|ve the quickly special packages +3522|1567|48|3|46|67553.76|0.09|0.02|A|F|1994-11-12|1994-11-30|1994-11-20|NONE|AIR|d the express, silent foxes. blit +3522|1299|74|4|7|8402.03|0.10|0.02|A|F|1994-10-31|1994-11-19|1994-11-28|NONE|TRUCK|e stealthil +3522|492|80|5|27|37597.23|0.02|0.05|R|F|1994-11-29|1994-12-15|1994-12-08|COLLECT COD|REG AIR|ic tithes. car +3522|1580|1|6|18|26668.44|0.01|0.03|A|F|1994-11-16|1994-10-29|1994-11-29|COLLECT COD|RAIL|sits wake carefully pen +3523|245|46|1|15|17178.60|0.06|0.02|N|O|1998-06-26|1998-05-22|1998-07-24|COLLECT COD|REG AIR|se slyly pending, sp +3523|1322|37|2|4|4893.28|0.03|0.06|N|O|1998-05-08|1998-05-18|1998-05-25|TAKE BACK RETURN|MAIL|ts. final accounts detect furiously along +3523|492|22|3|24|33419.76|0.07|0.04|N|O|1998-08-02|1998-06-22|1998-08-27|COLLECT COD|FOB|ke according to the doggedly re +3523|1913|58|4|36|65336.76|0.06|0.08|N|O|1998-05-26|1998-06-04|1998-06-25|DELIVER IN PERSON|SHIP|accounts. fluffily regu +3523|1332|33|5|48|59199.84|0.00|0.01|N|O|1998-07-22|1998-06-25|1998-08-19|DELIVER IN PERSON|AIR| regular requests +3524|1362|63|1|5|6316.80|0.01|0.04|R|F|1992-05-23|1992-07-25|1992-06-19|DELIVER IN PERSON|RAIL|ts whithout the bold depende +3524|1430|9|2|17|22634.31|0.09|0.08|A|F|1992-09-01|1992-07-17|1992-09-05|DELIVER IN PERSON|FOB|g, final epitaphs about the pinto +3525|455|56|1|12|16265.40|0.01|0.03|N|O|1996-03-08|1996-03-18|1996-03-16|NONE|TRUCK|lar excuses wake carefull +3525|1373|50|2|27|34407.99|0.03|0.03|N|O|1995-12-30|1996-01-23|1996-01-02|DELIVER IN PERSON|SHIP|y slyly special asymptotes +3525|744|77|3|31|50986.94|0.00|0.03|N|O|1996-03-08|1996-02-27|1996-03-13|COLLECT COD|TRUCK|he careful +3525|1834|64|4|28|48603.24|0.03|0.02|N|O|1996-01-22|1996-02-08|1996-01-27|COLLECT COD|FOB| nag according +3526|977|78|1|11|20657.67|0.02|0.03|R|F|1995-05-23|1995-05-28|1995-05-24|NONE|TRUCK|ges. furiously regular d +3526|1164|73|2|23|24498.68|0.03|0.04|A|F|1995-05-01|1995-05-31|1995-05-25|DELIVER IN PERSON|FOB|special, regular packages cajole. +3526|326|11|3|20|24526.40|0.05|0.08|N|F|1995-06-16|1995-04-26|1995-06-22|DELIVER IN PERSON|REG AIR|kages. bold, special requests detect sl +3527|1014|85|1|47|43005.47|0.07|0.02|N|O|1997-07-14|1997-07-29|1997-07-21|DELIVER IN PERSON|RAIL|unts. express re +3527|251|33|2|33|37991.25|0.01|0.02|N|O|1997-09-25|1997-09-17|1997-10-12|NONE|FOB|kly alongside of +3527|1613|37|3|50|75730.50|0.09|0.07|N|O|1997-07-17|1997-08-03|1997-07-29|DELIVER IN PERSON|SHIP|e even accounts was about th +3527|1272|10|4|17|19945.59|0.02|0.05|N|O|1997-07-30|1997-09-01|1997-08-17|COLLECT COD|MAIL|ular instruction +3552|1965|66|1|18|33605.28|0.01|0.07|N|O|1997-08-11|1997-07-14|1997-08-15|DELIVER IN PERSON|TRUCK|s deposits against the blithely unusual pin +3552|894|28|2|44|78975.16|0.01|0.00|N|O|1997-08-08|1997-06-15|1997-08-29|COLLECT COD|FOB|ns after the blithely reg +3552|1605|29|3|36|54237.60|0.04|0.08|N|O|1997-06-29|1997-06-24|1997-07-21|COLLECT COD|TRUCK|ly regular theodolites. fin +3553|1421|61|1|4|5289.68|0.05|0.01|R|F|1994-06-13|1994-07-10|1994-07-03|COLLECT COD|RAIL|olites boost bli +3553|642|74|2|26|40108.64|0.05|0.08|A|F|1994-08-06|1994-07-30|1994-08-23|DELIVER IN PERSON|MAIL|fily special p +3553|213|95|3|18|20037.78|0.04|0.03|A|F|1994-07-03|1994-06-30|1994-07-07|COLLECT COD|RAIL|. quickly ironic +3553|311|40|4|40|48452.40|0.06|0.00|A|F|1994-09-14|1994-06-26|1994-09-25|NONE|RAIL| slyly pending asymptotes against the furi +3553|1561|42|5|36|52652.16|0.06|0.08|R|F|1994-08-12|1994-06-25|1994-09-06|DELIVER IN PERSON|TRUCK| realms. pending, bold theodolites +3554|1742|85|1|32|52599.68|0.01|0.05|N|O|1995-09-28|1995-09-01|1995-10-07|NONE|RAIL|. blithely ironic t +3554|1441|42|2|18|24163.92|0.03|0.00|N|O|1995-09-11|1995-08-12|1995-10-04|DELIVER IN PERSON|REG AIR| haggle. furiously fluffy requests ac +3554|1916|17|3|41|74534.31|0.02|0.01|N|O|1995-07-13|1995-08-28|1995-07-27|DELIVER IN PERSON|MAIL|ent dependencies. sly +3555|1656|39|1|11|17134.15|0.05|0.02|N|O|1996-09-25|1996-10-01|1996-10-03|NONE|FOB|oost caref +3555|785|86|2|15|25286.70|0.03|0.08|N|O|1996-07-13|1996-09-01|1996-08-02|TAKE BACK RETURN|RAIL|y across the pending a +3555|421|9|3|25|33035.50|0.09|0.07|N|O|1996-10-01|1996-08-23|1996-10-24|TAKE BACK RETURN|MAIL|sual packages. quickly +3555|45|46|4|19|17955.76|0.00|0.05|N|O|1996-09-08|1996-09-14|1996-10-01|COLLECT COD|REG AIR|leep special theodolit +3555|330|87|5|29|35679.57|0.07|0.04|N|O|1996-08-02|1996-09-04|1996-08-08|DELIVER IN PERSON|TRUCK|deas. carefully s +3555|274|2|6|33|38750.91|0.04|0.08|N|O|1996-09-20|1996-09-23|1996-10-05|TAKE BACK RETURN|AIR|fluffily regular a +3555|1253|28|7|9|10388.25|0.07|0.02|N|O|1996-10-13|1996-10-02|1996-10-22|NONE|SHIP|are. slyly final foxes acro +3556|1415|55|1|45|59238.45|0.05|0.06|A|F|1992-10-14|1992-12-21|1992-10-16|NONE|TRUCK|ckages boost quickl +3556|304|61|2|43|51784.90|0.02|0.06|R|F|1993-01-18|1992-11-09|1993-02-04|NONE|FOB|wake carefull +3556|869|70|3|28|49556.08|0.10|0.04|A|F|1993-01-06|1992-11-27|1993-01-16|NONE|MAIL|refully final instructions? ironic packa +3557|1743|70|1|41|67434.34|0.01|0.07|R|F|1993-01-30|1992-12-31|1993-02-18|COLLECT COD|FOB|ideas breach c +3557|1289|90|2|37|44040.36|0.03|0.05|R|F|1993-02-16|1993-01-05|1993-03-15|DELIVER IN PERSON|RAIL|gside of the ca +3558|864|65|1|8|14118.88|0.01|0.03|N|O|1996-05-31|1996-05-26|1996-06-25|COLLECT COD|AIR|? even requests sle +3558|96|72|2|28|27890.52|0.02|0.08|N|O|1996-06-02|1996-04-18|1996-06-24|COLLECT COD|TRUCK|l deposits +3558|1865|52|3|3|5300.58|0.03|0.06|N|O|1996-05-19|1996-04-28|1996-05-26|DELIVER IN PERSON|RAIL|l, final deposits haggle. fina +3558|906|9|4|22|39751.80|0.06|0.03|N|O|1996-04-27|1996-04-19|1996-04-30|DELIVER IN PERSON|SHIP|refully ironic theodolites are fu +3558|289|44|5|38|45192.64|0.03|0.08|N|O|1996-05-29|1996-05-02|1996-06-09|COLLECT COD|RAIL|refully permanently iron +3558|719|84|6|17|27535.07|0.07|0.07|N|O|1996-03-14|1996-05-04|1996-04-05|NONE|RAIL|ithely unusual packa +3559|896|97|1|29|52109.81|0.00|0.07|R|F|1992-12-10|1992-12-03|1992-12-20|COLLECT COD|REG AIR|l, regular accounts wake flu +3584|102|55|1|4|4008.40|0.04|0.08|N|O|1997-08-16|1997-10-31|1997-08-28|DELIVER IN PERSON|TRUCK|nal packag +3584|1595|36|2|23|34421.57|0.00|0.03|N|O|1997-09-10|1997-10-15|1997-09-30|COLLECT COD|TRUCK|l platelets until the asymptotes +3584|233|34|3|6|6799.38|0.03|0.06|N|O|1997-10-28|1997-11-09|1997-11-24|TAKE BACK RETURN|MAIL|deposits across the +3584|1456|74|4|11|14931.95|0.06|0.02|N|O|1997-11-27|1997-10-15|1997-12-08|NONE|REG AIR|lithely slyly +3584|180|33|5|39|42127.02|0.09|0.07|N|O|1997-09-20|1997-10-31|1997-10-06|COLLECT COD|AIR|eposits. carefu +3585|1218|93|1|21|23503.41|0.05|0.04|A|F|1994-12-04|1994-12-25|1995-01-01|TAKE BACK RETURN|TRUCK|ounts use. express, final platelets us +3585|186|87|2|40|43447.20|0.03|0.00|R|F|1995-01-22|1995-01-17|1995-02-07|TAKE BACK RETURN|RAIL|elets affix. even asymptotes play care +3585|1114|23|3|11|11166.21|0.01|0.04|R|F|1995-01-04|1995-02-14|1995-01-15|NONE|MAIL|even packages +3585|480|39|4|33|45555.84|0.08|0.08|A|F|1994-12-14|1995-01-19|1994-12-22|NONE|RAIL|ironic dependencies serve furi +3585|246|28|5|13|14901.12|0.06|0.07|R|F|1995-03-15|1995-01-22|1995-03-17|DELIVER IN PERSON|AIR|ccording to the foxes. slyly iro +3585|935|4|6|7|12851.51|0.10|0.02|A|F|1994-12-13|1995-01-20|1995-01-05|TAKE BACK RETURN|TRUCK|dependencies sleep un +3585|417|5|7|45|59283.45|0.03|0.00|A|F|1995-01-20|1995-02-19|1995-02-11|DELIVER IN PERSON|MAIL|are blithely c +3586|1937|26|1|2|3677.86|0.03|0.08|R|F|1994-02-10|1994-01-07|1994-03-03|DELIVER IN PERSON|RAIL|he even, unusual decoy +3586|834|35|2|29|50310.07|0.04|0.07|R|F|1994-03-06|1994-03-02|1994-03-13|DELIVER IN PERSON|RAIL| slyly unusual i +3586|575|36|3|2|2951.14|0.03|0.06|R|F|1994-03-22|1994-02-20|1994-04-08|NONE|REG AIR|unts. slyly final ideas agai +3586|838|39|4|33|57381.39|0.06|0.01|R|F|1994-01-24|1994-02-09|1994-02-07|NONE|TRUCK|refully across the fur +3586|1080|16|5|8|7848.64|0.06|0.02|A|F|1994-03-29|1994-02-26|1994-04-02|NONE|FOB|theodolites hagg +3586|986|21|6|8|15095.84|0.09|0.01|A|F|1994-03-18|1994-01-17|1994-04-06|DELIVER IN PERSON|RAIL| ironic pinto beans cajole carefully theo +3586|1227|28|7|33|37231.26|0.05|0.04|A|F|1994-02-11|1994-01-15|1994-03-03|NONE|REG AIR|iously regular pinto beans integrate +3587|1968|57|1|5|9349.80|0.09|0.07|N|O|1996-09-03|1996-07-05|1996-09-11|DELIVER IN PERSON|SHIP|ithely regular decoys above the +3587|1313|28|2|48|58286.88|0.00|0.03|N|O|1996-08-02|1996-07-02|1996-08-05|TAKE BACK RETURN|MAIL|beans. blithely final depe +3587|1504|25|3|36|50598.00|0.05|0.05|N|O|1996-07-26|1996-06-16|1996-08-23|TAKE BACK RETURN|MAIL|ully regular excuse +3587|1237|75|4|31|35285.13|0.03|0.01|N|O|1996-07-21|1996-07-01|1996-07-23|COLLECT COD|SHIP|press fluffily regul +3587|696|59|5|12|19160.28|0.06|0.03|N|O|1996-08-30|1996-07-04|1996-09-22|DELIVER IN PERSON|RAIL|g the even pinto beans. special, +3587|1061|32|6|16|15392.96|0.01|0.03|N|O|1996-05-11|1996-06-19|1996-06-04|COLLECT COD|FOB|y ruthless dolphins to +3587|733|30|7|23|37575.79|0.07|0.05|N|O|1996-08-30|1996-07-01|1996-09-10|COLLECT COD|FOB|l multipliers sleep theodolites-- slyly +3588|902|5|1|28|50481.20|0.04|0.08|R|F|1995-05-03|1995-05-03|1995-05-14|DELIVER IN PERSON|TRUCK|special pinto beans cajole slyly. slyly +3588|878|12|2|6|10673.22|0.06|0.08|A|F|1995-04-09|1995-05-30|1995-04-10|TAKE BACK RETURN|MAIL|s. fluffily fluf +3588|1588|89|3|45|67031.10|0.04|0.02|R|F|1995-05-07|1995-05-04|1995-05-28|TAKE BACK RETURN|TRUCK|ecial pains integrate blithely. reques +3588|1263|75|4|22|25613.72|0.05|0.00|A|F|1995-04-08|1995-05-06|1995-04-27|NONE|RAIL|inal accounts. pending, bo +3588|550|81|5|28|40615.40|0.03|0.03|A|F|1995-04-23|1995-05-25|1995-04-28|DELIVER IN PERSON|TRUCK| express sheaves. unusual theodo +3588|1095|31|6|37|36855.33|0.08|0.04|N|F|1995-06-17|1995-05-25|1995-06-24|TAKE BACK RETURN|RAIL|xcuses sleep quickly along th +3588|385|14|7|46|59127.48|0.08|0.07|A|F|1995-06-06|1995-05-08|1995-06-08|NONE|AIR| slyly ironic deposits sublate ab +3589|366|51|1|42|53187.12|0.08|0.08|R|F|1994-08-11|1994-07-17|1994-08-23|DELIVER IN PERSON|AIR|he blithely unusual pac +3590|1760|3|1|10|16617.60|0.08|0.00|N|O|1995-07-17|1995-06-26|1995-08-12|TAKE BACK RETURN|SHIP|t the quickly ironic +3590|944|45|2|19|35053.86|0.03|0.03|N|O|1995-08-02|1995-06-20|1995-08-08|NONE|SHIP|special pinto beans. blithely reg +3590|956|25|3|43|79848.85|0.07|0.06|N|O|1995-07-12|1995-07-25|1995-07-16|DELIVER IN PERSON|SHIP|s could have to use +3590|554|45|4|26|37818.30|0.01|0.03|N|O|1995-07-08|1995-06-17|1995-08-02|DELIVER IN PERSON|SHIP|arefully along th +3590|1903|4|5|37|66781.30|0.00|0.08|N|O|1995-09-01|1995-06-29|1995-09-10|NONE|SHIP|ccounts above the silent waters thrash f +3590|1189|90|6|31|33795.58|0.03|0.01|N|O|1995-06-24|1995-07-12|1995-06-25|DELIVER IN PERSON|REG AIR|ve furiously final instructions. slyly regu +3590|1936|25|7|44|80868.92|0.05|0.04|N|F|1995-06-07|1995-06-15|1995-06-27|NONE|MAIL|s sleep after the regular platelets. blit +3591|289|44|1|21|24974.88|0.03|0.03|A|F|1994-02-25|1994-02-02|1994-03-05|DELIVER IN PERSON|TRUCK|structions against +3591|683|46|2|24|38008.32|0.04|0.04|R|F|1993-12-26|1994-01-07|1994-01-25|COLLECT COD|FOB|ages. slyly regular dependencies cajo +3591|1633|57|3|4|6138.52|0.01|0.03|A|F|1994-04-04|1994-02-19|1994-05-02|DELIVER IN PERSON|RAIL|he final packages. deposits serve quick +3591|1526|27|4|49|69948.48|0.01|0.00|A|F|1994-03-21|1994-01-26|1994-03-28|COLLECT COD|AIR| mold slyly. bl +3616|1966|11|1|30|56038.80|0.01|0.00|A|F|1994-05-05|1994-04-24|1994-05-12|TAKE BACK RETURN|FOB|ly ironic accounts unwind b +3616|1380|81|2|28|35878.64|0.08|0.06|R|F|1994-02-20|1994-04-18|1994-03-05|DELIVER IN PERSON|REG AIR|ironic packages. furiously ev +3617|1161|62|1|46|48859.36|0.03|0.02|N|O|1996-05-19|1996-05-14|1996-06-11|NONE|RAIL|ar theodolites. regu +3617|980|81|2|16|30095.68|0.05|0.02|N|O|1996-05-08|1996-06-03|1996-05-19|COLLECT COD|RAIL| slyly on th +3617|978|81|3|32|60127.04|0.00|0.06|N|O|1996-04-20|1996-06-07|1996-05-19|DELIVER IN PERSON|MAIL|uriously against the express accounts. ex +3617|408|96|4|22|28784.80|0.10|0.05|N|O|1996-07-11|1996-05-02|1996-07-25|NONE|REG AIR|uffily even accounts. packages sleep blithe +3617|1363|40|5|11|13907.96|0.08|0.05|N|O|1996-07-16|1996-04-23|1996-07-28|COLLECT COD|MAIL|ly quickly even requests. final +3618|1397|74|1|38|49338.82|0.08|0.00|N|O|1997-12-22|1998-02-23|1998-01-03|TAKE BACK RETURN|TRUCK|nts haggle fluffily above the regular +3618|1434|35|2|48|64100.64|0.04|0.00|N|O|1998-03-12|1998-02-13|1998-03-29|DELIVER IN PERSON|TRUCK|tructions atop the ironi +3618|621|53|3|24|36518.88|0.01|0.04|N|O|1998-01-26|1998-01-15|1998-02-17|TAKE BACK RETURN|AIR|xpress acc +3618|1605|6|4|26|39171.60|0.01|0.05|N|O|1998-03-23|1998-01-24|1998-04-15|DELIVER IN PERSON|AIR|iously regular deposits cajole ruthless +3619|958|59|1|49|91088.55|0.01|0.08|N|O|1997-01-22|1996-12-21|1997-02-17|TAKE BACK RETURN|MAIL| waters. furiously even deposits +3619|1157|94|2|27|28570.05|0.08|0.04|N|O|1996-12-12|1997-01-18|1996-12-18|TAKE BACK RETURN|SHIP|pecial accounts haggle care +3619|471|59|3|46|63087.62|0.08|0.03|N|O|1997-01-31|1997-01-27|1997-02-11|NONE|SHIP|press, expres +3619|930|99|4|18|32956.74|0.04|0.02|N|O|1997-03-18|1996-12-24|1997-03-21|COLLECT COD|AIR|eodolites +3619|1193|2|5|38|41579.22|0.05|0.08|N|O|1996-12-08|1997-02-03|1997-01-07|NONE|RAIL|theodolites detect abo +3619|1520|21|6|43|61125.36|0.01|0.01|N|O|1997-01-25|1997-01-06|1997-02-07|COLLECT COD|RAIL| bold, even +3620|587|18|1|41|60990.78|0.03|0.08|N|O|1997-03-21|1997-04-20|1997-03-30|COLLECT COD|FOB|t attainments cajole qui +3620|1666|49|2|16|25082.56|0.00|0.06|N|O|1997-05-17|1997-05-08|1997-06-03|COLLECT COD|SHIP|s. even, pending in +3621|165|66|1|29|30889.64|0.02|0.06|A|F|1993-08-03|1993-07-08|1993-08-10|DELIVER IN PERSON|FOB|al requests. fl +3621|924|59|2|13|23723.96|0.09|0.04|R|F|1993-08-30|1993-06-30|1993-09-01|NONE|REG AIR|r the unusual packages. brave theodoli +3621|1636|60|3|45|69193.35|0.07|0.07|R|F|1993-08-09|1993-06-18|1993-09-05|DELIVER IN PERSON|AIR| doubt about the bold deposits. carefully +3621|433|21|4|20|26668.60|0.05|0.04|R|F|1993-05-27|1993-07-04|1993-06-22|TAKE BACK RETURN|SHIP|gular accounts use carefully with +3622|1748|49|1|47|77537.78|0.09|0.00|N|O|1996-02-24|1996-02-22|1996-03-12|TAKE BACK RETURN|TRUCK|are careful +3622|884|18|2|4|7139.52|0.04|0.04|N|O|1996-02-03|1996-02-19|1996-02-16|TAKE BACK RETURN|TRUCK|lithely brave foxes. furi +3622|1895|96|3|46|82656.94|0.07|0.07|N|O|1995-12-18|1996-01-23|1996-01-12|TAKE BACK RETURN|AIR|sits wake. blithe +3622|1766|67|4|9|15009.84|0.08|0.05|N|O|1995-12-12|1996-02-09|1995-12-13|TAKE BACK RETURN|SHIP|arefully. furiously regular ideas n +3623|799|32|1|32|54393.28|0.05|0.00|N|O|1997-04-18|1997-03-15|1997-05-09|COLLECT COD|SHIP| courts. furiously regular ideas b +3623|1163|36|2|33|35117.28|0.08|0.01|N|O|1997-03-17|1997-02-13|1997-04-02|TAKE BACK RETURN|TRUCK|odolites. blithely spe +3623|231|13|3|21|23755.83|0.02|0.02|N|O|1997-01-19|1997-03-18|1997-01-24|NONE|FOB|ress ideas are furio +3623|1648|31|4|42|65084.88|0.05|0.06|N|O|1997-01-11|1997-03-24|1997-01-21|COLLECT COD|RAIL|g to the slyly regular packa +3623|878|78|5|30|53366.10|0.10|0.04|N|O|1997-04-04|1997-03-03|1997-05-01|NONE|RAIL| ironic somas sleep fluffily +3623|1852|39|6|7|12276.95|0.01|0.02|N|O|1997-01-05|1997-03-26|1997-01-26|NONE|TRUCK|aves. slyly special packages cajole. fu +3623|1399|38|7|13|16905.07|0.03|0.08|N|O|1997-01-02|1997-02-26|1997-01-26|DELIVER IN PERSON|SHIP|deas. furiously expres +3648|1431|32|1|16|21318.88|0.02|0.06|A|F|1993-08-14|1993-08-14|1993-08-15|COLLECT COD|FOB|s nag packages. +3648|1048|54|2|30|28471.20|0.00|0.01|R|F|1993-08-31|1993-09-06|1993-09-06|DELIVER IN PERSON|FOB| above the somas boost furious +3648|459|60|3|34|46221.30|0.10|0.00|A|F|1993-08-21|1993-07-25|1993-09-15|DELIVER IN PERSON|FOB| deposits are furiously. careful, +3648|121|74|4|16|16337.92|0.06|0.03|R|F|1993-07-27|1993-08-26|1993-08-24|DELIVER IN PERSON|FOB|uriously stealthy deposits haggle furi +3648|1170|79|5|25|26779.25|0.06|0.03|R|F|1993-08-15|1993-08-25|1993-09-09|TAKE BACK RETURN|TRUCK|s requests. silent asymp +3648|1685|86|6|14|22213.52|0.08|0.06|R|F|1993-10-02|1993-08-26|1993-10-09|COLLECT COD|AIR|sly pending excuses. carefully i +3648|1942|43|7|49|90353.06|0.09|0.03|R|F|1993-06-27|1993-07-27|1993-07-24|TAKE BACK RETURN|FOB|egular instructions. slyly regular pinto +3649|48|49|1|25|23701.00|0.10|0.04|A|F|1994-10-27|1994-08-23|1994-11-05|TAKE BACK RETURN|TRUCK|special re +3649|890|57|2|23|41190.47|0.08|0.00|R|F|1994-09-26|1994-10-01|1994-09-28|NONE|REG AIR|rs promise blithe +3649|693|56|3|14|22311.66|0.02|0.04|A|F|1994-09-19|1994-08-17|1994-10-12|DELIVER IN PERSON|TRUCK|ithely bold accounts wake +3649|755|52|4|40|66230.00|0.00|0.08|R|F|1994-07-20|1994-08-30|1994-08-14|TAKE BACK RETURN|RAIL|luffy somas sleep quickly-- ironic de +3649|997|98|5|24|45551.76|0.05|0.03|A|F|1994-07-07|1994-08-20|1994-07-27|TAKE BACK RETURN|FOB|c accounts. quickly final theodo +3649|1211|12|6|3|3336.63|0.10|0.04|A|F|1994-07-17|1994-08-10|1994-08-03|NONE|FOB|lly bold requests nag; +3650|1356|95|1|30|37720.50|0.10|0.00|A|F|1992-08-26|1992-07-05|1992-09-01|DELIVER IN PERSON|SHIP|ckly special platelets. furiously sil +3650|1280|81|2|43|50795.04|0.05|0.05|A|F|1992-09-07|1992-08-12|1992-09-10|COLLECT COD|TRUCK|gside of the quick +3650|17|93|3|1|917.01|0.04|0.06|A|F|1992-06-23|1992-07-18|1992-07-08|NONE|REG AIR|re about the pinto +3650|621|53|4|31|47170.22|0.10|0.08|R|F|1992-06-15|1992-07-01|1992-07-15|DELIVER IN PERSON|RAIL| against the ironic accounts cajol +3650|1864|65|5|19|33551.34|0.05|0.04|R|F|1992-08-29|1992-08-09|1992-09-21|DELIVER IN PERSON|AIR|y even forges. fluffily furious accounts +3650|936|39|6|27|49597.11|0.07|0.08|A|F|1992-07-03|1992-07-23|1992-07-13|COLLECT COD|MAIL|ular requests snooze fluffily regular pi +3650|691|54|7|43|68442.67|0.10|0.07|A|F|1992-06-25|1992-07-09|1992-07-22|DELIVER IN PERSON|RAIL|structions use caref +3651|181|60|1|20|21623.60|0.01|0.04|N|O|1998-06-10|1998-06-06|1998-06-23|NONE|SHIP|tect quickly among the r +3651|1544|65|2|24|34692.96|0.09|0.04|N|O|1998-06-22|1998-07-17|1998-07-10|DELIVER IN PERSON|RAIL|excuses haggle according to th +3651|1125|98|3|41|42070.92|0.00|0.05|N|O|1998-05-10|1998-07-09|1998-05-13|NONE|RAIL|blithely. furiously +3651|1092|63|4|27|26813.43|0.05|0.03|N|O|1998-05-03|1998-06-30|1998-05-05|DELIVER IN PERSON|RAIL| sleep blithely furiously do +3652|1798|25|1|24|40794.96|0.05|0.03|N|O|1997-06-07|1997-04-07|1997-06-12|COLLECT COD|MAIL|the final p +3652|1365|66|2|37|46855.32|0.02|0.05|N|O|1997-05-11|1997-04-06|1997-06-05|COLLECT COD|MAIL|osits haggle carefu +3652|1627|51|3|39|59616.18|0.01|0.02|N|O|1997-03-10|1997-04-03|1997-03-21|NONE|REG AIR|y express instructions. un +3652|797|62|4|1|1697.79|0.01|0.04|N|O|1997-04-20|1997-05-03|1997-05-18|DELIVER IN PERSON|SHIP| bold dependencies sublate. r +3653|1448|66|1|38|51278.72|0.08|0.05|A|F|1994-06-26|1994-05-13|1994-07-13|NONE|REG AIR|ainst the +3653|631|94|2|29|44417.27|0.07|0.01|A|F|1994-04-11|1994-06-11|1994-04-29|COLLECT COD|RAIL|ording to the special, final +3653|1806|50|3|17|29032.60|0.09|0.03|R|F|1994-06-24|1994-06-02|1994-07-17|DELIVER IN PERSON|RAIL|gle slyly regular +3653|1853|40|4|9|15793.65|0.10|0.07|R|F|1994-04-03|1994-05-19|1994-04-10|COLLECT COD|FOB|slyly silent account +3653|1878|22|5|41|72974.67|0.08|0.01|A|F|1994-06-18|1994-05-18|1994-06-20|COLLECT COD|RAIL|onic packages affix sly +3653|425|26|6|9|11928.78|0.05|0.03|A|F|1994-07-21|1994-05-31|1994-08-17|NONE|MAIL|tes: blithely bo +3653|485|15|7|2|2770.96|0.06|0.03|R|F|1994-06-02|1994-05-31|1994-06-29|NONE|FOB|n accounts. fina +3654|1647|30|1|46|71237.44|0.08|0.05|A|F|1992-06-05|1992-08-19|1992-06-06|DELIVER IN PERSON|FOB|usly regular foxes. furio +3654|927|28|2|29|53009.68|0.07|0.06|A|F|1992-09-11|1992-07-20|1992-10-04|DELIVER IN PERSON|FOB|odolites detect. quickly r +3654|17|68|3|37|33929.37|0.07|0.05|A|F|1992-09-22|1992-07-20|1992-10-19|TAKE BACK RETURN|RAIL|unts doze bravely ab +3654|1673|74|4|11|17321.37|0.08|0.00|A|F|1992-07-20|1992-07-30|1992-07-23|TAKE BACK RETURN|SHIP|quickly along the express, ironic req +3654|936|37|5|34|62455.62|0.04|0.00|R|F|1992-07-26|1992-08-26|1992-08-12|TAKE BACK RETURN|REG AIR| the quick +3654|1066|72|6|20|19341.20|0.03|0.02|A|F|1992-07-30|1992-07-05|1992-08-05|COLLECT COD|SHIP|s sleep about the slyly +3654|1723|50|7|45|73112.40|0.01|0.07|A|F|1992-09-15|1992-07-04|1992-09-20|DELIVER IN PERSON|FOB|sly ironic notornis nag slyly +3655|1839|69|1|5|8704.15|0.03|0.04|R|F|1993-01-17|1992-12-31|1993-01-23|DELIVER IN PERSON|TRUCK|riously bold pinto be +3655|967|36|2|1|1867.96|0.10|0.06|R|F|1992-10-24|1992-12-18|1992-11-07|DELIVER IN PERSON|AIR|arefully slow pinto beans are +3655|300|28|3|35|42010.50|0.01|0.04|R|F|1992-12-20|1992-11-16|1993-01-15|TAKE BACK RETURN|MAIL|blithely even accounts! furiously regular +3655|714|15|4|35|56514.85|0.04|0.07|R|F|1992-10-17|1992-12-23|1992-10-28|COLLECT COD|MAIL|ng foxes cajole fluffily slyly final fo +3680|1765|50|1|48|80004.48|0.00|0.06|R|F|1993-01-16|1993-01-23|1993-01-19|COLLECT COD|FOB|packages. quickly fluff +3680|43|69|2|41|38664.64|0.00|0.04|A|F|1993-01-06|1993-03-02|1993-01-08|NONE|FOB|iously ironic platelets in +3680|551|82|3|33|47901.15|0.09|0.08|R|F|1993-03-16|1993-02-19|1993-04-05|NONE|FOB|ts. ironic, fina +3681|1053|89|1|35|33391.75|0.03|0.08|R|F|1992-07-31|1992-05-18|1992-08-07|COLLECT COD|FOB|lyly special pinto +3682|607|39|1|6|9045.60|0.07|0.02|N|O|1997-05-06|1997-04-04|1997-05-11|NONE|AIR|ronic deposits wake slyly. ca +3682|1156|57|2|18|19028.70|0.06|0.06|N|O|1997-04-30|1997-03-21|1997-05-10|NONE|FOB|regular dependencies +3682|467|26|3|17|23246.82|0.03|0.05|N|O|1997-02-12|1997-04-04|1997-02-22|COLLECT COD|FOB|, ironic packages wake a +3682|565|96|4|30|43966.80|0.09|0.05|N|O|1997-04-16|1997-04-16|1997-04-29|NONE|MAIL|he requests cajole quickly pending package +3683|1009|45|1|35|31850.00|0.05|0.03|A|F|1993-05-31|1993-04-17|1993-06-14|NONE|SHIP| the furiously expr +3683|487|75|2|41|56886.68|0.01|0.06|A|F|1993-03-26|1993-05-06|1993-04-09|NONE|TRUCK|ress instructions. slyly express a +3683|994|63|3|23|43584.77|0.00|0.08|R|F|1993-07-02|1993-05-16|1993-07-30|NONE|TRUCK|xpress accounts sleep slyly re +3684|1252|53|1|48|55356.00|0.04|0.06|A|F|1993-08-20|1993-09-02|1993-09-10|DELIVER IN PERSON|REG AIR|its boost alongside +3684|454|55|2|6|8126.70|0.06|0.08|R|F|1993-08-09|1993-10-05|1993-09-06|DELIVER IN PERSON|FOB|he silent requests. packages sleep fu +3684|1625|49|3|19|29005.78|0.04|0.02|A|F|1993-10-19|1993-08-25|1993-11-02|COLLECT COD|FOB|e slyly carefully pending foxes. d +3684|1349|64|4|13|16254.42|0.02|0.05|A|F|1993-07-23|1993-09-16|1993-08-06|NONE|TRUCK|ing, unusual pinto beans! thinly p +3685|462|92|1|37|50411.02|0.02|0.03|R|F|1992-03-11|1992-04-09|1992-04-05|DELIVER IN PERSON|TRUCK|ress attai +3685|575|6|2|7|10328.99|0.05|0.00|R|F|1992-05-16|1992-02-23|1992-05-17|DELIVER IN PERSON|FOB|sits. special asymptotes about the r +3685|1338|39|3|38|47094.54|0.08|0.03|A|F|1992-05-17|1992-03-16|1992-06-06|TAKE BACK RETURN|TRUCK|thely unusual pack +3685|1917|6|4|39|70937.49|0.10|0.05|R|F|1992-02-19|1992-04-06|1992-03-02|COLLECT COD|FOB|ic courts nag carefully after the +3685|558|59|5|37|53966.35|0.00|0.01|A|F|1992-03-02|1992-04-10|1992-03-04|NONE|FOB|. carefully sly requests are regular, regu +3686|1216|28|1|7|7820.47|0.02|0.04|N|O|1998-07-15|1998-08-22|1998-07-30|DELIVER IN PERSON|TRUCK| furiously unusual accou +3686|1992|37|2|38|71971.62|0.06|0.03|N|O|1998-09-04|1998-08-11|1998-09-19|DELIVER IN PERSON|AIR|y silent foxes! carefully ruthless cour +3686|448|49|3|31|41801.64|0.10|0.06|N|O|1998-09-09|1998-08-28|1998-10-09|COLLECT COD|MAIL|gle across the courts. furiously regu +3686|1161|98|4|7|7435.12|0.10|0.01|N|O|1998-07-16|1998-09-02|1998-07-22|NONE|FOB|ake carefully carefully q +3687|1441|59|1|32|42958.08|0.03|0.06|R|F|1993-05-07|1993-04-05|1993-05-25|DELIVER IN PERSON|AIR|deas cajole fo +3687|806|40|2|2|3413.60|0.00|0.08|R|F|1993-02-23|1993-03-25|1993-03-11|NONE|TRUCK| express requests. slyly regular depend +3687|1737|80|3|10|16387.30|0.01|0.02|A|F|1993-02-11|1993-03-22|1993-03-09|NONE|FOB|ing pinto beans +3687|1617|100|4|19|28853.59|0.02|0.05|A|F|1993-05-14|1993-04-24|1993-06-01|DELIVER IN PERSON|MAIL|ly final asymptotes according to t +3687|1181|90|5|31|33547.58|0.07|0.08|A|F|1993-05-28|1993-03-20|1993-06-05|DELIVER IN PERSON|FOB|foxes cajole quickly about the furiously f +3712|1401|80|1|27|35164.80|0.01|0.05|R|F|1992-02-01|1992-02-26|1992-03-02|TAKE BACK RETURN|SHIP|ctions. even accounts haggle alongside +3712|1850|80|2|13|22774.05|0.03|0.03|R|F|1992-04-30|1992-02-11|1992-05-30|DELIVER IN PERSON|FOB|s around the furiously ironic account +3712|640|3|3|44|67788.16|0.01|0.01|A|F|1992-03-26|1992-02-19|1992-04-18|TAKE BACK RETURN|FOB|ously permanently regular req +3712|1471|89|4|38|52153.86|0.01|0.06|A|F|1992-01-15|1992-03-24|1992-01-27|COLLECT COD|RAIL|s nag carefully-- even, reg +3713|1114|51|1|41|41619.51|0.07|0.08|N|O|1998-05-11|1998-07-17|1998-05-22|COLLECT COD|RAIL|eposits wake blithely fina +3713|1770|13|2|19|31763.63|0.04|0.04|N|O|1998-06-25|1998-07-24|1998-07-08|DELIVER IN PERSON|AIR|tructions serve blithely around the furi +3713|1797|98|3|19|32277.01|0.03|0.02|N|O|1998-05-19|1998-07-06|1998-06-09|DELIVER IN PERSON|REG AIR|quests cajole careful +3713|1690|91|4|45|71626.05|0.06|0.04|N|O|1998-06-15|1998-07-30|1998-07-14|DELIVER IN PERSON|MAIL|al pinto beans affix after the slyly +3713|892|59|5|46|82472.94|0.10|0.04|N|O|1998-08-22|1998-06-27|1998-08-31|NONE|MAIL|totes. carefully special theodolites s +3713|1815|59|6|29|49787.49|0.09|0.03|N|O|1998-08-04|1998-06-13|1998-08-21|NONE|RAIL|the regular dugouts wake furiously sil +3713|1299|100|7|14|16804.06|0.04|0.00|N|O|1998-07-19|1998-07-02|1998-07-28|DELIVER IN PERSON|SHIP|eposits impress according +3714|685|48|1|13|20613.84|0.07|0.03|N|O|1998-06-26|1998-06-17|1998-07-07|TAKE BACK RETURN|REG AIR| the furiously final +3714|1457|97|2|14|19018.30|0.02|0.05|N|O|1998-05-30|1998-06-30|1998-05-31|DELIVER IN PERSON|RAIL|ending ideas. thinly unusual theodo +3714|1589|90|3|16|23849.28|0.00|0.02|N|O|1998-05-25|1998-07-07|1998-06-17|TAKE BACK RETURN|AIR|ccounts cajole fu +3714|293|48|4|44|52504.76|0.04|0.02|N|O|1998-07-18|1998-07-10|1998-07-22|DELIVER IN PERSON|AIR|s. quickly ironic dugouts sublat +3715|967|70|1|13|24283.48|0.00|0.03|N|O|1996-05-11|1996-04-25|1996-06-09|TAKE BACK RETURN|SHIP|e quickly ironic +3715|1690|73|2|16|25467.04|0.01|0.06|N|O|1996-06-28|1996-04-22|1996-06-30|TAKE BACK RETURN|AIR|usly regular pearls haggle final packages +3715|117|18|3|37|37633.07|0.05|0.02|N|O|1996-05-03|1996-04-30|1996-05-17|NONE|SHIP|ut the carefully expr +3716|318|47|1|10|12183.10|0.09|0.04|N|O|1997-12-02|1997-11-09|1997-12-14|TAKE BACK RETURN|SHIP|ts. quickly sly ideas slee +3716|1931|32|2|39|71484.27|0.02|0.08|N|O|1997-11-27|1997-10-23|1997-12-24|COLLECT COD|REG AIR|even deposits. +3716|1069|70|3|42|40742.52|0.02|0.08|N|O|1997-12-03|1997-10-12|1997-12-15|NONE|TRUCK| of the pend +3716|1644|68|4|19|29367.16|0.05|0.08|N|O|1997-09-25|1997-10-18|1997-10-12|NONE|TRUCK|arefully unusual accounts. flu +3716|1817|61|5|25|42970.25|0.06|0.05|N|O|1997-11-23|1997-10-24|1997-11-24|COLLECT COD|REG AIR|fully unusual accounts. carefu +3717|1523|4|1|45|64103.40|0.07|0.04|N|O|1998-08-09|1998-08-18|1998-08-14|TAKE BACK RETURN|TRUCK|ests wake whithout the blithely final pl +3717|521|12|2|3|4264.56|0.01|0.07|N|O|1998-06-09|1998-07-31|1998-06-14|NONE|REG AIR|nside the regular packages sleep +3717|1953|54|3|45|83472.75|0.05|0.08|N|O|1998-09-19|1998-07-22|1998-09-28|DELIVER IN PERSON|MAIL|s the blithely unu +3717|684|47|4|5|7923.40|0.06|0.03|N|O|1998-09-02|1998-08-20|1998-09-26|TAKE BACK RETURN|AIR|quickly among +3717|153|54|5|7|7372.05|0.09|0.02|N|O|1998-09-08|1998-07-18|1998-09-10|DELIVER IN PERSON|RAIL| after the packa +3717|636|99|6|38|58391.94|0.01|0.07|N|O|1998-07-10|1998-07-08|1998-07-29|COLLECT COD|RAIL|ly about the car +3717|1053|54|7|28|26713.40|0.03|0.01|N|O|1998-07-25|1998-08-12|1998-08-16|COLLECT COD|RAIL|ts sleep q +3718|208|63|1|40|44328.00|0.01|0.04|N|O|1996-11-20|1996-12-17|1996-12-03|DELIVER IN PERSON|MAIL|out the express deposits +3718|1627|51|2|16|24457.92|0.02|0.06|N|O|1996-11-11|1996-12-25|1996-11-12|COLLECT COD|TRUCK|slyly even accounts. blithely special acco +3718|696|90|3|8|12773.52|0.05|0.03|N|O|1996-12-06|1996-12-06|1996-12-15|TAKE BACK RETURN|AIR| the even deposits sleep carefully b +3719|215|97|1|35|39032.35|0.06|0.08|N|O|1997-06-11|1997-04-03|1997-06-15|TAKE BACK RETURN|TRUCK|ly foxes. pending braids haggle furio +3719|1740|83|2|2|3283.48|0.02|0.08|N|O|1997-02-17|1997-04-25|1997-03-03|NONE|REG AIR|ccounts boost carefu +3719|1816|3|3|12|20613.72|0.05|0.06|N|O|1997-06-10|1997-05-04|1997-07-09|TAKE BACK RETURN|REG AIR|grate according to the +3719|893|93|4|13|23320.57|0.02|0.00|N|O|1997-05-03|1997-04-16|1997-05-27|TAKE BACK RETURN|SHIP|iously. regular dep +3719|777|10|5|19|31877.63|0.06|0.08|N|O|1997-05-22|1997-03-20|1997-06-12|COLLECT COD|TRUCK|he regular ideas integrate acros +3719|1414|93|6|43|56562.63|0.03|0.08|N|O|1997-05-08|1997-04-15|1997-06-06|COLLECT COD|RAIL|the furiously special pinto bean +3719|185|86|7|16|17362.88|0.10|0.01|N|O|1997-03-02|1997-03-18|1997-03-28|TAKE BACK RETURN|RAIL| express asymptotes. ir +3744|1948|37|1|30|55498.20|0.05|0.06|A|F|1992-05-07|1992-02-12|1992-05-17|TAKE BACK RETURN|FOB|nts among +3745|1363|40|1|18|22758.48|0.01|0.05|A|F|1993-10-17|1993-11-16|1993-11-13|DELIVER IN PERSON|SHIP| slyly bold pinto beans according to +3746|1641|42|1|37|57077.68|0.07|0.00|A|F|1994-12-29|1994-10-25|1995-01-03|COLLECT COD|FOB|e of the careful +3746|1436|15|2|28|37448.04|0.06|0.08|R|F|1994-09-20|1994-10-21|1994-09-27|DELIVER IN PERSON|FOB|s after the even, special requests +3746|1879|80|3|3|5342.61|0.10|0.01|R|F|1994-11-03|1994-12-10|1994-11-12|NONE|MAIL| the silent ideas cajole carefully +3746|275|30|4|11|12927.97|0.00|0.05|R|F|1994-10-02|1994-11-19|1994-10-10|COLLECT COD|SHIP| ironic theodolites are among th +3747|1406|24|1|42|54910.80|0.05|0.05|N|O|1996-11-10|1996-10-19|1996-11-19|TAKE BACK RETURN|REG AIR|y. blithely fina +3747|1700|1|2|33|52856.10|0.01|0.03|N|O|1996-10-14|1996-11-12|1996-11-11|NONE|REG AIR| regular p +3747|1386|87|3|30|38621.40|0.00|0.07|N|O|1996-12-16|1996-11-15|1996-12-17|NONE|RAIL|! furiously f +3747|330|15|4|21|25836.93|0.00|0.06|N|O|1996-11-18|1996-09-23|1996-11-26|TAKE BACK RETURN|AIR|ithely bold orbits mold furiously blit +3747|1259|34|5|32|37128.00|0.08|0.05|N|O|1996-09-10|1996-11-04|1996-10-10|DELIVER IN PERSON|MAIL|quests shall h +3747|1540|41|6|14|20181.56|0.08|0.07|N|O|1996-11-03|1996-10-29|1996-11-06|TAKE BACK RETURN|AIR|packages cajole carefu +3747|1180|17|7|23|24867.14|0.00|0.04|N|O|1996-11-08|1996-11-10|1996-12-03|NONE|REG AIR|kages are ironic +3748|1036|72|1|12|11244.36|0.06|0.01|N|O|1998-04-17|1998-04-15|1998-05-12|NONE|AIR|old reques +3748|1648|90|2|24|37191.36|0.08|0.04|N|O|1998-06-07|1998-05-02|1998-06-21|DELIVER IN PERSON|TRUCK|al deposits. blithely +3748|1961|94|3|19|35396.24|0.05|0.01|N|O|1998-04-23|1998-05-17|1998-05-23|COLLECT COD|RAIL|pinto beans run carefully quic +3748|1867|54|4|5|8844.30|0.00|0.07|N|O|1998-06-29|1998-05-06|1998-07-12|DELIVER IN PERSON|MAIL| regular accounts sleep quickly-- furious +3748|1467|7|5|21|28737.66|0.07|0.08|N|O|1998-03-30|1998-04-07|1998-04-05|TAKE BACK RETURN|MAIL|fix carefully furiously express ideas. furi +3749|1729|72|1|11|17937.92|0.07|0.05|N|O|1995-06-25|1995-05-23|1995-07-10|TAKE BACK RETURN|RAIL|egular requests along the +3749|1282|57|2|9|10649.52|0.08|0.05|A|F|1995-04-23|1995-04-18|1995-04-26|NONE|REG AIR|uses cajole blithely pla +3749|1989|78|3|31|58620.38|0.00|0.05|N|F|1995-06-11|1995-05-20|1995-06-27|COLLECT COD|REG AIR|s. foxes sleep slyly unusual grouc +3749|1304|81|4|7|8437.10|0.07|0.06|A|F|1995-03-31|1995-04-05|1995-04-11|NONE|TRUCK|he slyly ironic packages +3749|1824|68|5|14|24161.48|0.02|0.00|N|F|1995-06-11|1995-05-19|1995-07-11|DELIVER IN PERSON|SHIP|press instruc +3749|538|29|6|10|14385.30|0.10|0.03|N|O|1995-06-24|1995-05-24|1995-07-18|COLLECT COD|SHIP|essly. regular pi +3750|1333|72|1|37|45670.21|0.04|0.03|N|O|1995-07-08|1995-07-28|1995-07-28|DELIVER IN PERSON|REG AIR|usly busy account +3750|1518|19|2|33|46843.83|0.05|0.03|N|O|1995-06-27|1995-06-20|1995-07-03|TAKE BACK RETURN|REG AIR|theodolites haggle. slyly pendin +3750|794|27|3|20|33895.80|0.09|0.05|N|F|1995-06-17|1995-06-06|1995-06-28|TAKE BACK RETURN|REG AIR|ss, ironic requests! fur +3750|1659|83|4|33|51501.45|0.04|0.03|N|F|1995-06-15|1995-06-04|1995-06-29|COLLECT COD|RAIL|ep blithely according to the flu +3750|827|61|5|1|1727.82|0.05|0.01|N|O|1995-07-24|1995-06-25|1995-08-21|DELIVER IN PERSON|REG AIR|l dolphins against the slyly +3750|1124|61|6|47|48180.64|0.01|0.08|R|F|1995-05-11|1995-06-13|1995-06-02|TAKE BACK RETURN|FOB|slowly regular accounts. blithely ev +3751|1718|61|1|37|59929.27|0.00|0.04|R|F|1994-04-30|1994-05-30|1994-05-30|NONE|REG AIR|ly express courts +3751|1407|47|2|32|41868.80|0.03|0.05|R|F|1994-05-05|1994-07-02|1994-06-02|COLLECT COD|MAIL|rthogs could have to slee +3751|643|6|3|45|69463.80|0.08|0.06|R|F|1994-05-27|1994-06-19|1994-06-14|NONE|RAIL|according to +3751|139|18|4|39|40526.07|0.07|0.01|A|F|1994-08-16|1994-07-11|1994-09-12|COLLECT COD|TRUCK|refully according to the iro +3751|571|32|5|12|17658.84|0.02|0.03|A|F|1994-08-09|1994-06-30|1994-08-12|TAKE BACK RETURN|TRUCK|accounts wake furious +3751|756|21|6|39|64613.25|0.02|0.08|R|F|1994-08-01|1994-06-01|1994-08-26|COLLECT COD|SHIP|to beans. pending, express packages c +3776|22|98|1|39|35958.78|0.05|0.01|R|F|1993-01-03|1993-02-05|1993-01-08|COLLECT COD|FOB|yly blithely pending packages +3776|1582|63|2|14|20770.12|0.06|0.08|R|F|1992-12-30|1993-02-12|1993-01-27|DELIVER IN PERSON|RAIL|y special ideas. express packages pr +3776|1410|50|3|49|64259.09|0.01|0.08|R|F|1992-12-03|1993-02-16|1992-12-28|TAKE BACK RETURN|RAIL|equests. final, thin grouches +3776|916|19|4|49|89028.59|0.08|0.05|A|F|1993-02-11|1993-01-06|1993-02-27|COLLECT COD|MAIL|es: careful warthogs haggle fluffi +3777|995|98|1|11|20855.89|0.02|0.03|A|F|1994-04-09|1994-06-05|1994-04-14|NONE|FOB|ld ideas. even theodolites +3777|75|51|2|10|9750.70|0.03|0.01|R|F|1994-05-22|1994-05-29|1994-06-13|COLLECT COD|RAIL|le. ironic depths a +3777|1655|56|3|18|28019.70|0.10|0.06|R|F|1994-05-04|1994-05-23|1994-05-22|COLLECT COD|REG AIR|eful packages use slyly: even deposits +3777|172|73|4|35|37525.95|0.10|0.04|A|F|1994-05-25|1994-05-26|1994-06-13|COLLECT COD|AIR|s. carefully express asymptotes accordi +3777|975|10|5|14|26263.58|0.04|0.05|R|F|1994-05-06|1994-06-24|1994-05-31|NONE|TRUCK|ording to the iro +3778|567|28|1|21|30818.76|0.01|0.06|R|F|1993-05-27|1993-07-10|1993-06-03|COLLECT COD|REG AIR|ts. blithely special theodoli +3778|286|87|2|32|37960.96|0.09|0.00|A|F|1993-06-22|1993-08-18|1993-07-03|TAKE BACK RETURN|MAIL|tes affix carefully above the +3778|935|70|3|41|75273.13|0.05|0.00|R|F|1993-06-21|1993-07-27|1993-07-15|COLLECT COD|FOB|e the furiously ironi +3778|1689|13|4|28|44539.04|0.03|0.05|R|F|1993-08-18|1993-07-10|1993-09-06|TAKE BACK RETURN|REG AIR|y silent orbits print carefully against +3778|971|74|5|28|52415.16|0.01|0.06|R|F|1993-09-02|1993-08-08|1993-10-02|DELIVER IN PERSON|FOB|r deposits. theodol +3778|195|48|6|26|28474.94|0.00|0.01|A|F|1993-09-24|1993-07-06|1993-10-22|NONE|TRUCK| against the fluffily +3778|1048|49|7|49|46502.96|0.02|0.04|A|F|1993-06-13|1993-08-08|1993-07-04|DELIVER IN PERSON|MAIL|ans. furiously +3779|458|46|1|28|38036.60|0.04|0.05|N|O|1997-05-06|1997-04-01|1997-05-18|TAKE BACK RETURN|AIR|s. close requests sleep +3779|1091|27|2|5|4960.45|0.07|0.03|N|O|1997-01-07|1997-03-26|1997-02-05|DELIVER IN PERSON|AIR|heodolites. slyly regular a +3780|1262|63|1|25|29081.50|0.08|0.04|N|O|1996-06-27|1996-07-02|1996-07-22|NONE|AIR|l, unusual +3780|1895|25|2|40|71875.60|0.10|0.04|N|O|1996-06-06|1996-05-29|1996-07-01|COLLECT COD|SHIP|gular deposits-- furiously regular +3781|132|33|1|48|49542.24|0.02|0.06|N|O|1996-08-22|1996-08-13|1996-09-15|NONE|REG AIR|equests may cajole careful +3781|1875|76|2|39|69297.93|0.10|0.00|N|O|1996-08-20|1996-08-16|1996-09-01|DELIVER IN PERSON|REG AIR|unts are carefully. ir +3781|299|100|3|17|20387.93|0.01|0.03|N|O|1996-06-23|1996-09-04|1996-07-19|TAKE BACK RETURN|REG AIR|. theodolite +3781|309|66|4|15|18139.50|0.05|0.00|N|O|1996-08-23|1996-08-08|1996-09-06|TAKE BACK RETURN|AIR| carefully blithe +3781|151|30|5|23|24176.45|0.09|0.08|N|O|1996-09-05|1996-08-18|1996-09-27|DELIVER IN PERSON|SHIP|pendencies are b +3782|269|51|1|29|33908.54|0.01|0.07|N|O|1996-09-17|1996-10-03|1996-10-07|DELIVER IN PERSON|REG AIR|quickly unusual pinto beans. carefully fina +3782|1529|70|2|10|14305.20|0.03|0.05|N|O|1996-09-07|1996-11-19|1996-10-04|COLLECT COD|FOB|ven pinto b +3782|1353|54|3|30|37630.50|0.06|0.06|N|O|1996-12-19|1996-10-31|1997-01-14|TAKE BACK RETURN|MAIL|slyly even pinto beans hag +3782|1164|73|4|34|36215.44|0.02|0.06|N|O|1996-11-07|1996-10-22|1996-11-19|DELIVER IN PERSON|MAIL|gage after the even +3782|1293|5|5|40|47771.60|0.09|0.04|N|O|1996-12-16|1996-11-22|1997-01-01|COLLECT COD|AIR|s instructions. regular accou +3783|1666|49|1|36|56435.76|0.04|0.08|R|F|1993-12-17|1994-02-26|1994-01-03|DELIVER IN PERSON|SHIP|ites haggle among the carefully unusu +3783|729|62|2|36|58669.92|0.02|0.02|R|F|1994-03-02|1994-02-09|1994-03-15|COLLECT COD|TRUCK|egular accounts +3783|850|84|3|50|87542.50|0.04|0.01|R|F|1994-03-14|1994-01-09|1994-04-10|DELIVER IN PERSON|FOB|he furiously regular deposits. +3783|263|18|4|37|43040.62|0.10|0.05|R|F|1993-12-09|1994-02-17|1993-12-30|COLLECT COD|REG AIR|ing to the ideas. regular accounts de +3808|428|58|1|28|37195.76|0.02|0.01|R|F|1994-05-27|1994-06-18|1994-06-22|TAKE BACK RETURN|FOB|lly final accounts alo +3808|1264|39|2|47|54767.22|0.04|0.08|R|F|1994-06-12|1994-06-03|1994-07-02|COLLECT COD|TRUCK|fully for the quickly final deposits: flu +3808|303|4|3|45|54148.50|0.00|0.03|R|F|1994-07-03|1994-05-29|1994-07-14|TAKE BACK RETURN|REG AIR| carefully special +3808|995|96|4|34|64463.66|0.07|0.04|R|F|1994-08-13|1994-07-22|1994-08-31|DELIVER IN PERSON|FOB| pearls will have to +3808|1548|69|5|29|42036.66|0.08|0.03|A|F|1994-06-22|1994-05-26|1994-07-06|TAKE BACK RETURN|TRUCK| deposits across the pac +3808|1672|55|6|44|69241.48|0.06|0.06|A|F|1994-06-07|1994-06-04|1994-06-25|NONE|REG AIR|the blithely regular foxes. even, final +3809|1904|49|1|17|30700.30|0.10|0.04|N|O|1996-08-14|1996-07-05|1996-09-04|DELIVER IN PERSON|FOB|es detect furiously sil +3809|1330|31|2|32|39402.56|0.01|0.02|N|O|1996-07-03|1996-06-01|1996-07-25|COLLECT COD|SHIP|xcuses would boost against the fluffily eve +3809|1048|49|3|46|43655.84|0.10|0.06|N|O|1996-08-20|1996-06-01|1996-08-24|TAKE BACK RETURN|TRUCK|l asymptotes. special +3809|1773|74|4|43|72015.11|0.00|0.04|N|O|1996-05-06|1996-06-22|1996-06-05|TAKE BACK RETURN|TRUCK|yly ironic decoys; regular, iron +3810|1835|65|1|49|85104.67|0.05|0.01|R|F|1992-11-27|1992-10-30|1992-12-16|COLLECT COD|AIR|cajole. fur +3810|1688|30|2|18|28614.24|0.01|0.04|A|F|1992-11-28|1992-11-15|1992-12-27|DELIVER IN PERSON|SHIP|s. furiously careful deposi +3810|1368|7|3|41|52043.76|0.08|0.08|A|F|1992-10-26|1992-10-27|1992-11-05|COLLECT COD|SHIP|l requests boost slyly along the slyl +3810|1811|55|4|11|18840.91|0.06|0.04|A|F|1992-12-18|1992-12-11|1993-01-15|DELIVER IN PERSON|MAIL| the pending pinto beans. expr +3811|1634|76|1|24|36855.12|0.04|0.02|N|O|1998-07-13|1998-05-16|1998-08-12|TAKE BACK RETURN|TRUCK|deposits. slyly regular accounts cajo +3811|1660|2|2|2|3123.32|0.01|0.08|N|O|1998-06-16|1998-06-16|1998-06-23|NONE|MAIL|slyly fluff +3811|425|84|3|19|25182.98|0.02|0.06|N|O|1998-07-20|1998-06-14|1998-07-29|NONE|MAIL|s boost blithely furiou +3811|1705|48|4|50|80335.00|0.08|0.03|N|O|1998-07-28|1998-07-06|1998-08-16|COLLECT COD|FOB|ts are slyly fluffy ideas. furiou +3811|1812|56|5|23|39417.63|0.00|0.04|N|O|1998-08-13|1998-07-09|1998-08-29|COLLECT COD|AIR|nstructions sleep quickly. slyly final +3811|17|68|6|35|32095.35|0.04|0.07|N|O|1998-04-17|1998-06-30|1998-04-25|NONE|REG AIR|yly final dolphins? quickly ironic frets +3812|1447|65|1|33|44498.52|0.00|0.05|N|O|1996-10-10|1996-10-05|1996-10-15|TAKE BACK RETURN|MAIL|posits engage. ironic, regular p +3812|1725|10|2|33|53681.76|0.06|0.03|N|O|1996-10-05|1996-10-13|1996-10-22|TAKE BACK RETURN|MAIL|inal excuses d +3813|1756|57|1|37|61336.75|0.05|0.04|N|O|1998-10-13|1998-09-19|1998-10-28|NONE|REG AIR|ravely special packages haggle p +3813|1228|3|2|39|44039.58|0.05|0.00|N|O|1998-08-30|1998-08-12|1998-09-29|COLLECT COD|FOB|y ideas. final ideas about the sp +3814|1305|20|1|7|8444.10|0.02|0.02|R|F|1995-05-01|1995-05-09|1995-05-28|DELIVER IN PERSON|REG AIR|es sleep furiou +3814|1727|70|2|14|22802.08|0.01|0.00|R|F|1995-03-17|1995-05-10|1995-04-16|DELIVER IN PERSON|AIR|sits along the final, ironic deposit +3814|1672|14|3|36|56652.12|0.06|0.02|N|O|1995-06-19|1995-04-18|1995-06-28|COLLECT COD|SHIP|beans cajole quickly sl +3814|651|52|4|20|31033.00|0.04|0.07|R|F|1995-02-23|1995-03-26|1995-03-04|DELIVER IN PERSON|SHIP|. doggedly ironic deposits will have to wa +3814|1063|34|5|15|14460.90|0.03|0.04|N|O|1995-06-23|1995-03-25|1995-07-09|COLLECT COD|SHIP| carefully final deposits haggle slyly +3814|822|89|6|47|80972.54|0.09|0.05|A|F|1995-04-16|1995-04-03|1995-05-14|DELIVER IN PERSON|AIR|nusual requests. bli +3814|1314|53|7|12|14583.72|0.10|0.01|R|F|1995-03-18|1995-04-16|1995-03-20|TAKE BACK RETURN|REG AIR|ages cajole. packages haggle. final +3815|761|94|1|3|4985.28|0.07|0.00|N|O|1997-11-16|1997-11-15|1997-11-30|NONE|FOB|egular, express ideas. ironic, final dep +3815|1299|37|2|11|13203.19|0.02|0.04|N|O|1997-11-01|1997-11-05|1997-11-27|COLLECT COD|TRUCK|sleep blithe +3840|1865|9|1|45|79508.70|0.02|0.08|N|O|1998-10-31|1998-09-19|1998-11-30|DELIVER IN PERSON|TRUCK|o beans are. carefully final courts x +3840|456|15|2|12|16277.40|0.04|0.07|N|O|1998-10-02|1998-08-19|1998-10-20|TAKE BACK RETURN|RAIL|xpress pinto beans. accounts a +3840|730|31|3|45|73382.85|0.02|0.05|N|O|1998-10-12|1998-10-12|1998-10-28|TAKE BACK RETURN|FOB|onic, even packages are. pe +3840|1473|74|4|41|56353.27|0.07|0.02|N|O|1998-07-21|1998-10-08|1998-08-01|TAKE BACK RETURN|MAIL| nag slyly? slyly pending accounts +3840|1730|73|5|7|11422.11|0.09|0.08|N|O|1998-09-17|1998-09-20|1998-10-14|DELIVER IN PERSON|MAIL|. furiously final gifts sleep carefully pin +3840|1062|63|6|33|31780.98|0.10|0.02|N|O|1998-07-29|1998-10-06|1998-08-04|DELIVER IN PERSON|SHIP|hely silent deposits w +3841|1569|10|1|1|1470.56|0.06|0.03|A|F|1994-10-10|1994-11-12|1994-10-21|DELIVER IN PERSON|AIR| boost even re +3841|209|64|2|31|34385.20|0.09|0.03|A|F|1995-01-24|1994-11-25|1995-02-20|TAKE BACK RETURN|SHIP|n theodolites shall promise carefully. qui +3841|1519|60|3|40|56820.40|0.06|0.02|A|F|1995-02-02|1994-11-30|1995-02-14|TAKE BACK RETURN|MAIL|its. quickly regular ideas nag carefully +3841|498|99|4|9|12586.41|0.10|0.07|A|F|1994-11-21|1994-12-26|1994-11-26|NONE|FOB|s according to the courts shall nag s +3841|1758|59|5|3|4979.25|0.04|0.02|R|F|1994-10-24|1994-12-07|1994-11-09|COLLECT COD|FOB|foxes integrate +3841|1624|48|6|48|73229.76|0.03|0.00|R|F|1994-11-23|1994-11-22|1994-12-01|DELIVER IN PERSON|FOB| according to the regular, +3842|1619|43|1|28|42577.08|0.05|0.07|A|F|1992-06-17|1992-06-03|1992-06-24|DELIVER IN PERSON|TRUCK|s excuses thrash carefully. +3842|1218|93|2|21|23503.41|0.07|0.05|R|F|1992-07-15|1992-06-02|1992-07-21|NONE|RAIL|r pinto be +3842|1931|20|3|28|51322.04|0.00|0.00|A|F|1992-06-20|1992-05-22|1992-07-13|DELIVER IN PERSON|MAIL|lly alongside of the +3842|874|74|4|15|26623.05|0.07|0.01|A|F|1992-06-26|1992-06-23|1992-07-09|COLLECT COD|MAIL|ave packages are slyl +3842|674|68|5|13|20470.71|0.09|0.02|R|F|1992-04-13|1992-06-22|1992-05-11|COLLECT COD|RAIL|t blithely. busily regular accounts alon +3842|1070|76|6|24|23305.68|0.08|0.08|R|F|1992-08-05|1992-06-29|1992-08-16|TAKE BACK RETURN|MAIL|phins are quickly +3843|148|49|1|7|7336.98|0.10|0.03|N|O|1997-02-13|1997-02-21|1997-02-20|TAKE BACK RETURN|SHIP|slyly even instructions. furiously eve +3843|5|31|2|30|27150.00|0.01|0.05|N|O|1997-02-14|1997-03-25|1997-03-13|DELIVER IN PERSON|AIR| wake. slyly even packages boost +3844|1346|85|1|2|2494.68|0.03|0.07|R|F|1995-02-24|1995-02-03|1995-03-18|TAKE BACK RETURN|AIR|es haggle final acco +3844|1020|91|2|5|4605.10|0.10|0.03|R|F|1995-04-29|1995-02-24|1995-05-05|TAKE BACK RETURN|RAIL| unwind quickly about the pending, i +3845|339|40|1|44|54530.52|0.01|0.08|A|F|1992-07-20|1992-07-15|1992-07-24|DELIVER IN PERSON|REG AIR|s haggle among the fluffily regula +3845|239|21|2|16|18227.68|0.09|0.05|A|F|1992-08-08|1992-06-08|1992-08-26|DELIVER IN PERSON|SHIP|ely bold ideas use. ex +3845|590|81|3|17|25340.03|0.08|0.01|A|F|1992-06-12|1992-07-05|1992-06-26|TAKE BACK RETURN|RAIL|counts haggle. reg +3845|454|13|4|1|1354.45|0.04|0.05|R|F|1992-05-21|1992-06-07|1992-06-17|COLLECT COD|REG AIR| blithely ironic t +3845|1954|55|5|27|50110.65|0.00|0.05|R|F|1992-08-20|1992-07-17|1992-09-02|COLLECT COD|REG AIR|kages. care +3845|1048|84|6|30|28471.20|0.09|0.06|R|F|1992-08-21|1992-07-07|1992-08-25|COLLECT COD|FOB|counts do wake blithely. ironic requests +3846|602|34|1|15|22539.00|0.06|0.03|N|O|1998-02-17|1998-04-27|1998-02-21|NONE|REG AIR|uternes. carefully even +3846|1703|4|2|30|48141.00|0.08|0.07|N|O|1998-05-01|1998-03-12|1998-05-20|TAKE BACK RETURN|FOB|deposits according to the fur +3846|148|27|3|49|51358.86|0.08|0.07|N|O|1998-02-14|1998-03-22|1998-02-17|DELIVER IN PERSON|RAIL|efully even packages against the blithe +3846|1641|65|4|33|50907.12|0.05|0.00|N|O|1998-05-12|1998-03-14|1998-05-14|DELIVER IN PERSON|TRUCK|s instructions are. fu +3847|1883|84|1|7|12494.16|0.08|0.00|A|F|1993-05-06|1993-06-06|1993-05-22|COLLECT COD|MAIL| about the blithely daring Tiresias. fl +3872|1804|91|1|28|47762.40|0.10|0.04|N|O|1996-11-05|1996-11-10|1996-11-24|DELIVER IN PERSON|REG AIR|t after the carefully ironic excuses. f +3872|167|20|2|38|40552.08|0.04|0.05|N|O|1996-10-18|1996-12-03|1996-11-15|TAKE BACK RETURN|AIR|iously against the ironic, unusual a +3872|1685|9|3|18|28560.24|0.07|0.07|N|O|1996-12-25|1996-10-24|1997-01-08|TAKE BACK RETURN|SHIP|s. regular, brave accounts sleep blith +3872|107|8|4|41|41291.10|0.07|0.03|N|O|1996-11-23|1996-11-12|1996-12-03|COLLECT COD|REG AIR|ly regular epitaphs boost +3872|693|56|5|42|66934.98|0.03|0.00|N|O|1997-01-03|1996-10-12|1997-01-16|COLLECT COD|MAIL|s the furio +3872|1397|12|6|40|51935.60|0.07|0.05|N|O|1997-01-02|1996-10-29|1997-01-14|NONE|REG AIR|nts? regularly ironic ex +3873|678|72|1|19|29994.73|0.04|0.04|N|O|1998-05-15|1998-05-10|1998-05-17|NONE|FOB|y final ac +3873|1450|29|2|44|59463.80|0.05|0.05|N|O|1998-07-23|1998-05-22|1998-08-14|COLLECT COD|AIR|yly even platelets wake. +3873|1393|32|3|29|37537.31|0.01|0.04|N|O|1998-06-22|1998-05-20|1998-07-05|COLLECT COD|REG AIR|olphins af +3874|1692|75|1|21|33467.49|0.09|0.08|R|F|1993-06-19|1993-07-20|1993-07-08|DELIVER IN PERSON|SHIP| requests cajole fluff +3874|190|43|2|48|52329.12|0.06|0.07|R|F|1993-06-13|1993-07-20|1993-06-20|NONE|RAIL| ideas throughout +3875|810|10|1|24|41059.44|0.02|0.08|N|O|1997-10-15|1997-11-27|1997-11-09|COLLECT COD|AIR|ecial packages. +3875|1128|65|2|49|50426.88|0.04|0.04|N|O|1997-10-18|1997-10-13|1997-10-19|NONE|MAIL|sleep furiously about the deposits. quickl +3876|1402|42|1|12|15640.80|0.06|0.07|N|O|1996-09-16|1996-10-23|1996-10-05|TAKE BACK RETURN|REG AIR|y above the pending tithes. blithely ironi +3876|1393|32|2|37|47892.43|0.00|0.03|N|O|1996-11-30|1996-10-18|1996-12-18|DELIVER IN PERSON|AIR|t dependencies. blithely final packages u +3876|1267|68|3|41|47898.66|0.02|0.04|N|O|1996-10-15|1996-10-17|1996-10-19|NONE|AIR| quickly blit +3877|498|28|1|12|16781.88|0.06|0.01|R|F|1993-05-30|1993-08-09|1993-06-24|TAKE BACK RETURN|FOB|nal requests. even requests are. pac +3877|1447|65|2|47|63376.68|0.05|0.00|A|F|1993-08-01|1993-08-16|1993-08-04|NONE|FOB|furiously quick requests nag along the theo +3877|797|94|3|44|74702.76|0.09|0.00|A|F|1993-06-07|1993-07-15|1993-07-06|DELIVER IN PERSON|REG AIR|elets. quickly regular accounts caj +3877|1479|80|4|36|49696.92|0.06|0.01|A|F|1993-07-27|1993-07-13|1993-08-11|DELIVER IN PERSON|AIR|lithely about the dogged ideas. ac +3877|47|48|5|41|38828.64|0.03|0.07|A|F|1993-06-30|1993-07-20|1993-07-01|DELIVER IN PERSON|FOB|integrate against the expres +3877|1226|27|6|7|7890.54|0.04|0.08|R|F|1993-06-14|1993-07-09|1993-06-28|NONE|TRUCK|lar dolphins cajole silently +3878|1997|98|1|6|11393.94|0.07|0.04|N|O|1997-06-21|1997-05-22|1997-07-01|COLLECT COD|FOB|s. regular instru +3878|874|75|2|13|23073.31|0.01|0.06|N|O|1997-06-08|1997-06-03|1997-06-25|TAKE BACK RETURN|TRUCK|leep ruthlessly about the carefu +3878|401|31|3|20|26028.00|0.08|0.03|N|O|1997-06-20|1997-05-24|1997-07-20|TAKE BACK RETURN|MAIL|the furiously careful ideas cajole slyly sl +3878|1520|21|4|20|28430.40|0.01|0.07|N|O|1997-07-13|1997-05-22|1997-07-20|NONE|FOB|about the carefully ironic pa +3879|1257|32|1|45|52121.25|0.10|0.08|N|O|1996-03-18|1996-01-03|1996-04-03|COLLECT COD|RAIL|ly according to the expr +3879|441|29|2|35|46950.40|0.00|0.07|N|O|1995-12-08|1996-01-23|1995-12-28|TAKE BACK RETURN|MAIL|o beans. accounts cajole furiously. re +3904|375|60|1|22|28058.14|0.04|0.03|N|O|1998-02-02|1998-02-09|1998-02-10|TAKE BACK RETURN|REG AIR|structions cajole carefully. carefully f +3904|1838|68|2|19|33056.77|0.09|0.01|N|O|1998-02-10|1998-02-13|1998-02-20|TAKE BACK RETURN|AIR| excuses sleep slyly according to th +3905|1008|14|1|43|39087.00|0.07|0.08|A|F|1994-03-30|1994-02-18|1994-04-09|DELIVER IN PERSON|REG AIR|uses are care +3905|1160|97|2|7|7428.12|0.03|0.00|R|F|1994-03-01|1994-02-19|1994-03-11|DELIVER IN PERSON|AIR|ully furiously furious packag +3905|1700|83|3|6|9610.20|0.07|0.02|R|F|1994-04-07|1994-03-07|1994-04-21|DELIVER IN PERSON|RAIL|ow furiously. deposits wake ironic +3906|1530|71|1|42|60124.26|0.00|0.04|R|F|1992-09-03|1992-07-22|1992-09-04|COLLECT COD|RAIL|jole blithely after the furiously regular +3906|394|51|2|50|64719.50|0.01|0.07|R|F|1992-09-24|1992-08-24|1992-09-29|NONE|MAIL|ke slyly. stealt +3906|1797|82|3|15|25481.85|0.06|0.02|R|F|1992-07-30|1992-08-26|1992-08-02|TAKE BACK RETURN|FOB|dependencies at the +3906|583|84|4|36|53408.88|0.08|0.08|A|F|1992-08-07|1992-08-08|1992-08-24|NONE|SHIP|y. ironic deposits haggle sl +3907|1118|55|1|41|41783.51|0.06|0.02|A|F|1992-09-13|1992-10-23|1992-09-29|COLLECT COD|MAIL|ackages wake along the carefully regul +3907|1445|63|2|41|55204.04|0.03|0.00|A|F|1992-10-25|1992-10-17|1992-11-01|TAKE BACK RETURN|RAIL|s above the unusual ideas sleep furiousl +3907|516|7|3|45|63742.95|0.02|0.07|R|F|1992-09-21|1992-09-19|1992-10-18|COLLECT COD|REG AIR| about the regular pac +3907|1757|42|4|48|79620.00|0.05|0.07|A|F|1992-09-24|1992-10-16|1992-10-06|DELIVER IN PERSON|TRUCK|nt asymptotes lose across th +3907|620|21|5|22|33453.64|0.09|0.01|R|F|1992-09-20|1992-10-30|1992-09-29|TAKE BACK RETURN|TRUCK|ly. furiously unusual deposits use afte +3907|1251|63|6|34|39176.50|0.02|0.02|R|F|1992-09-06|1992-10-08|1992-09-12|COLLECT COD|FOB| requests according to the slyly pending +3907|1093|64|7|8|7952.72|0.10|0.01|A|F|1992-09-18|1992-10-29|1992-09-27|NONE|REG AIR|furiously final packages. +3908|919|54|1|50|90995.50|0.05|0.04|R|F|1993-06-19|1993-04-27|1993-07-05|DELIVER IN PERSON|MAIL| even accounts wake +3908|1471|72|2|8|10979.76|0.06|0.03|A|F|1993-03-12|1993-04-13|1993-03-22|DELIVER IN PERSON|SHIP|r instructions was requests. ironically +3909|1780|7|1|30|50453.40|0.03|0.07|N|O|1998-10-17|1998-10-14|1998-10-28|COLLECT COD|TRUCK|ly even deposits across the ironic notorni +3909|1909|98|2|46|83301.40|0.03|0.01|N|O|1998-10-08|1998-10-15|1998-10-24|NONE|FOB|the blithely unusual ideas +3910|1387|64|1|10|12883.80|0.00|0.08|N|O|1996-10-18|1996-10-31|1996-11-14|DELIVER IN PERSON|FOB|tions boost furiously unusual e +3910|708|73|2|31|49869.70|0.05|0.03|N|O|1996-12-22|1996-11-14|1997-01-01|TAKE BACK RETURN|SHIP|ess instructions. +3910|198|51|3|6|6589.14|0.04|0.04|N|O|1996-12-08|1996-10-30|1996-12-31|DELIVER IN PERSON|MAIL|ly sly platelets are fluffily slyly si +3910|1527|68|4|1|1428.52|0.03|0.06|N|O|1996-09-12|1996-10-21|1996-09-19|DELIVER IN PERSON|FOB|s sleep neve +3911|1129|66|1|10|10301.20|0.07|0.06|N|O|1995-06-22|1995-05-30|1995-06-28|COLLECT COD|FOB|ss theodolites are blithely along t +3911|1189|98|2|14|15262.52|0.08|0.05|R|F|1995-04-28|1995-05-03|1995-05-22|NONE|RAIL|e blithely brave depo +3911|911|80|3|12|21742.92|0.10|0.05|R|F|1995-04-04|1995-04-16|1995-04-10|COLLECT COD|FOB|uctions. blithely regula +3936|1364|65|1|25|31634.00|0.06|0.03|N|O|1996-12-03|1996-12-27|1997-01-01|DELIVER IN PERSON|RAIL|gular requests nag quic +3936|1877|21|2|24|42692.88|0.10|0.07|N|O|1996-11-22|1997-01-01|1996-12-08|NONE|AIR|ns. accounts mold fl +3936|821|88|3|42|72316.44|0.00|0.07|N|O|1997-01-03|1997-01-29|1997-01-14|COLLECT COD|AIR|elets wake amo +3936|611|5|4|12|18139.32|0.06|0.05|N|O|1996-11-25|1997-01-09|1996-12-06|DELIVER IN PERSON|SHIP|ithely across the carefully brave req +3936|836|37|5|35|60789.05|0.02|0.08|N|O|1996-12-04|1997-01-06|1996-12-22|NONE|SHIP|lly ironic requ +3936|1021|57|6|26|23972.52|0.01|0.02|N|O|1997-02-27|1997-01-16|1997-03-22|NONE|RAIL|quickly pen +3937|695|58|1|48|76593.12|0.10|0.02|N|O|1998-03-15|1998-02-22|1998-03-30|DELIVER IN PERSON|FOB|gainst the thinl +3937|474|33|2|30|41234.10|0.01|0.07|N|O|1998-01-17|1998-01-03|1998-02-08|COLLECT COD|TRUCK|al packages slee +3937|1145|54|3|27|28245.78|0.03|0.00|N|O|1998-02-06|1998-01-12|1998-02-20|NONE|MAIL|ven ideas. slyly expr +3937|1531|72|4|50|71626.50|0.01|0.02|N|O|1998-01-15|1998-01-09|1998-02-04|DELIVER IN PERSON|AIR|ong the carefully exp +3937|30|6|5|29|26970.87|0.03|0.07|N|O|1998-03-06|1998-02-22|1998-03-14|NONE|TRUCK|nt pinto beans above the pending instr +3937|1921|10|6|6|10937.52|0.00|0.00|N|O|1998-01-24|1998-02-13|1998-01-27|DELIVER IN PERSON|FOB|into beans. slyly silent orbits alongside o +3937|1639|63|7|1|1540.63|0.02|0.05|N|O|1998-03-29|1998-01-08|1998-04-27|TAKE BACK RETURN|TRUCK|refully agains +3938|1584|65|1|46|68336.68|0.10|0.07|R|F|1993-05-20|1993-05-04|1993-06-12|DELIVER IN PERSON|FOB|ly even foxes are slyly fu +3939|1596|37|1|8|11980.72|0.03|0.06|N|O|1996-01-29|1996-04-05|1996-02-26|COLLECT COD|REG AIR|e packages. express, pen +3940|1771|56|1|33|55201.41|0.10|0.07|N|O|1996-05-19|1996-04-19|1996-05-23|TAKE BACK RETURN|RAIL|ly ironic packages about the pending accou +3940|686|80|2|40|63467.20|0.08|0.02|N|O|1996-02-29|1996-03-22|1996-03-04|NONE|MAIL|ts. regular fox +3940|889|90|3|8|14319.04|0.07|0.08|N|O|1996-04-04|1996-04-12|1996-04-18|DELIVER IN PERSON|RAIL|ions cajole furiously regular pinto beans. +3940|1363|2|4|11|13907.96|0.09|0.05|N|O|1996-03-09|1996-05-13|1996-03-17|COLLECT COD|REG AIR|e of the special packages. furiously +3940|10|61|5|41|37310.41|0.00|0.07|N|O|1996-05-08|1996-05-03|1996-06-03|COLLECT COD|MAIL|thily. deposits cajole. +3941|409|10|1|47|61541.80|0.05|0.07|N|O|1996-11-24|1996-10-09|1996-12-22|DELIVER IN PERSON|RAIL| carefully pending +3941|1226|38|2|19|21417.18|0.05|0.00|N|O|1996-11-10|1996-10-26|1996-12-05|COLLECT COD|RAIL|eposits haggle furiously even +3941|97|23|3|2|1994.18|0.01|0.03|N|O|1996-12-04|1996-10-01|1996-12-25|NONE|REG AIR|es wake after the +3941|1094|100|4|29|28857.61|0.00|0.03|N|O|1996-09-14|1996-10-04|1996-09-19|NONE|MAIL|g the blithely +3942|1823|10|1|6|10348.92|0.05|0.05|A|F|1993-07-01|1993-09-14|1993-07-23|DELIVER IN PERSON|SHIP|ep ruthlessly carefully final accounts: s +3942|1938|27|2|5|9199.65|0.06|0.02|R|F|1993-09-27|1993-09-24|1993-10-07|DELIVER IN PERSON|MAIL|. fluffily pending deposits above the flu +3942|1555|96|3|25|36413.75|0.04|0.06|R|F|1993-09-13|1993-08-01|1993-09-29|COLLECT COD|RAIL|d the quick packages +3943|1977|10|1|15|28184.55|0.03|0.01|N|O|1997-01-13|1996-12-17|1997-02-02|COLLECT COD|REG AIR| grow fluffily according to the +3943|956|57|2|9|16712.55|0.00|0.06|N|O|1996-11-27|1997-01-03|1996-12-17|COLLECT COD|RAIL|refully ironic +3943|169|22|3|32|34213.12|0.00|0.02|N|O|1996-10-22|1996-12-17|1996-11-04|TAKE BACK RETURN|TRUCK| unusual ideas into the furiously even pack +3943|491|92|4|5|6957.45|0.04|0.04|N|O|1997-01-09|1996-11-10|1997-02-06|COLLECT COD|RAIL|arefully regular deposits accord +3968|537|68|1|27|38813.31|0.04|0.05|N|O|1997-04-25|1997-04-17|1997-05-11|TAKE BACK RETURN|MAIL|t silently. +3968|252|34|2|45|51851.25|0.00|0.07|N|O|1997-06-18|1997-04-24|1997-06-25|DELIVER IN PERSON|FOB|ully slyly fi +3968|1552|53|3|43|62502.65|0.07|0.06|N|O|1997-04-30|1997-05-14|1997-05-18|TAKE BACK RETURN|SHIP|ly regular accounts +3968|602|65|4|7|10518.20|0.07|0.02|N|O|1997-03-30|1997-05-01|1997-04-12|DELIVER IN PERSON|SHIP|efully bold instructions. express +3969|511|2|1|39|55048.89|0.04|0.04|N|O|1997-06-12|1997-06-13|1997-07-05|NONE|MAIL|ly bold ideas s +3969|1968|1|2|26|48618.96|0.05|0.03|N|O|1997-07-08|1997-07-30|1997-07-10|TAKE BACK RETURN|AIR|fluffily; braids detect. +3969|788|53|3|46|77683.88|0.04|0.02|N|O|1997-05-29|1997-06-15|1997-06-10|TAKE BACK RETURN|SHIP|fully final requests sleep stealthily. care +3969|1502|43|4|21|29473.50|0.07|0.04|N|O|1997-08-31|1997-07-16|1997-09-02|TAKE BACK RETURN|MAIL|unts doze quickly final reque +3969|716|17|5|40|64668.40|0.09|0.00|N|O|1997-05-19|1997-08-02|1997-06-05|COLLECT COD|TRUCK|lar requests cajole furiously blithely regu +3969|1050|86|6|4|3804.20|0.02|0.01|N|O|1997-06-04|1997-07-31|1997-06-13|COLLECT COD|REG AIR|dencies wake blithely? quickly even theodo +3970|873|74|1|2|3547.74|0.01|0.07|R|F|1992-04-24|1992-06-03|1992-05-16|TAKE BACK RETURN|RAIL|carefully pending foxes wake blithely +3970|1081|87|2|18|17677.44|0.03|0.08|A|F|1992-06-06|1992-06-18|1992-07-05|DELIVER IN PERSON|TRUCK| maintain slyly. ir +3970|1536|57|3|10|14375.30|0.10|0.04|A|F|1992-07-01|1992-05-31|1992-07-02|NONE|AIR| special packages wake after the final br +3970|216|98|4|34|37951.14|0.05|0.00|A|F|1992-06-25|1992-05-23|1992-07-12|COLLECT COD|SHIP|y final gifts are. carefully pe +3970|291|73|5|23|27399.67|0.05|0.04|A|F|1992-06-04|1992-06-14|1992-06-13|COLLECT COD|TRUCK| above the final braids. regular +3970|88|64|6|46|45451.68|0.07|0.04|R|F|1992-04-29|1992-05-14|1992-05-24|NONE|FOB|yly ironic +3970|41|67|7|46|43287.84|0.08|0.08|R|F|1992-05-02|1992-05-12|1992-05-10|COLLECT COD|MAIL|ix slyly. quickly silen +3971|954|89|1|47|87182.65|0.06|0.04|N|O|1996-07-07|1996-08-08|1996-08-01|TAKE BACK RETURN|RAIL|e slyly final dependencies x-ray +3971|1903|36|2|2|3609.80|0.04|0.03|N|O|1996-07-15|1996-08-12|1996-07-26|NONE|SHIP|haggle abou +3972|505|96|1|2|2811.00|0.05|0.03|A|F|1994-07-24|1994-06-30|1994-08-13|TAKE BACK RETURN|SHIP|y final theodolite +3973|296|51|1|21|25122.09|0.02|0.06|R|F|1992-06-18|1992-06-03|1992-07-02|COLLECT COD|REG AIR|equests. furiously +3973|1143|16|2|37|38633.18|0.07|0.00|A|F|1992-05-29|1992-05-04|1992-06-23|TAKE BACK RETURN|SHIP|inos wake fluffily. pending requests nag +3973|393|22|3|40|51735.60|0.08|0.05|R|F|1992-05-03|1992-06-09|1992-05-21|COLLECT COD|RAIL|g the carefully blithe f +3974|211|66|1|47|52226.87|0.10|0.03|N|O|1996-06-03|1996-05-08|1996-06-28|NONE|TRUCK|dencies above the re +3974|605|68|2|17|25595.20|0.05|0.07|N|O|1996-04-05|1996-05-21|1996-04-28|COLLECT COD|TRUCK|ions eat slyly after the blithely +3975|561|52|1|38|55539.28|0.01|0.05|N|O|1995-08-02|1995-06-18|1995-08-19|COLLECT COD|TRUCK|es are furiously: furi +4000|1957|58|1|41|76216.95|0.06|0.01|A|F|1992-03-02|1992-03-14|1992-03-27|COLLECT COD|FOB|ve the even, fi +4000|746|79|2|44|72456.56|0.09|0.06|A|F|1992-03-27|1992-02-18|1992-03-31|COLLECT COD|AIR|equests use blithely blithely bold d +4001|1052|23|1|26|24779.30|0.00|0.01|N|O|1997-07-26|1997-06-18|1997-08-08|DELIVER IN PERSON|RAIL|tegrate blithely +4001|410|98|2|19|24897.79|0.03|0.02|N|O|1997-08-23|1997-06-15|1997-09-18|COLLECT COD|SHIP|ackages. carefully ironi +4001|931|32|3|18|32974.74|0.07|0.00|N|O|1997-06-04|1997-06-22|1997-06-13|DELIVER IN PERSON|MAIL|lithely ironic d +4001|20|96|4|39|35880.78|0.00|0.00|N|O|1997-06-13|1997-06-17|1997-06-25|NONE|SHIP| dogged excuses. blithe +4002|1108|45|1|35|35318.50|0.01|0.08|N|O|1997-05-16|1997-06-15|1997-06-02|DELIVER IN PERSON|TRUCK|eep. quickly +4002|1979|80|2|20|37619.40|0.00|0.03|N|O|1997-06-15|1997-05-20|1997-07-11|NONE|MAIL|lly even ins +4002|399|56|3|6|7796.34|0.08|0.07|N|O|1997-05-02|1997-07-07|1997-05-16|TAKE BACK RETURN|RAIL| furiously furiously special theodoli +4002|1987|20|4|6|11333.88|0.06|0.06|N|O|1997-07-01|1997-05-15|1997-07-31|NONE|MAIL|he slyly iro +4002|982|17|5|4|7531.92|0.08|0.07|N|O|1997-05-06|1997-06-15|1997-05-24|NONE|REG AIR|ccording to the careful +4003|512|3|1|18|25425.18|0.04|0.07|R|F|1993-02-02|1993-04-15|1993-02-28|TAKE BACK RETURN|AIR|ar grouches s +4004|1201|2|1|23|25350.60|0.07|0.02|A|F|1993-08-12|1993-07-13|1993-08-16|TAKE BACK RETURN|TRUCK| bold theodolites? special packages accordi +4004|636|37|2|47|72221.61|0.07|0.04|R|F|1993-06-25|1993-08-03|1993-07-12|NONE|SHIP|thely instead of the even, unu +4004|1132|33|3|39|40292.07|0.10|0.05|R|F|1993-07-12|1993-07-27|1993-07-18|NONE|MAIL|ccounts sleep furious +4004|737|70|4|46|75335.58|0.10|0.04|R|F|1993-09-04|1993-07-13|1993-09-28|COLLECT COD|FOB|ncies. slyly pending dolphins sleep furio +4004|1548|89|5|9|13045.86|0.04|0.06|A|F|1993-08-25|1993-06-10|1993-09-24|COLLECT COD|MAIL|ly ironic requests. quickly pending ide +4004|1601|43|6|44|66114.40|0.07|0.05|R|F|1993-07-25|1993-07-23|1993-08-16|TAKE BACK RETURN|REG AIR|ut the sauternes. bold, ironi +4004|1254|66|7|20|23105.00|0.07|0.05|A|F|1993-06-19|1993-06-14|1993-07-04|COLLECT COD|REG AIR|. ironic deposits cajole blithely? +4005|37|13|1|26|24362.78|0.09|0.05|N|O|1996-12-01|1997-02-03|1996-12-15|NONE|REG AIR| to the quic +4005|167|68|2|28|29880.48|0.02|0.06|N|O|1996-12-11|1997-01-24|1996-12-17|DELIVER IN PERSON|REG AIR|ly carefully ironic deposits. slyly +4005|714|11|3|28|45211.88|0.03|0.01|N|O|1996-12-08|1997-01-14|1996-12-30|TAKE BACK RETURN|MAIL|y pending dependenc +4005|147|74|4|49|51309.86|0.09|0.00|N|O|1997-01-31|1996-12-24|1997-03-02|NONE|RAIL|tions sleep across the silent d +4005|58|59|5|14|13412.70|0.09|0.08|N|O|1996-11-27|1997-01-09|1996-12-25|NONE|TRUCK|ld requests. slyly final instructi +4006|548|39|1|11|15933.94|0.05|0.08|A|F|1995-04-29|1995-02-21|1995-05-20|TAKE BACK RETURN|RAIL|ress foxes cajole quick +4006|1581|62|2|18|26686.44|0.05|0.03|A|F|1995-01-29|1995-03-08|1995-02-02|TAKE BACK RETURN|MAIL|gouts! slyly iron +4006|232|33|3|15|16983.45|0.01|0.02|R|F|1995-02-23|1995-04-02|1995-02-25|TAKE BACK RETURN|RAIL|n deposits cajole slyl +4006|1135|36|4|25|25903.25|0.00|0.07|A|F|1995-02-23|1995-02-09|1995-02-24|DELIVER IN PERSON|SHIP| requests use depos +4007|561|22|1|32|46769.92|0.00|0.03|R|F|1993-09-30|1993-08-16|1993-10-03|DELIVER IN PERSON|RAIL|nal accounts across t +4007|1155|92|2|41|43302.15|0.04|0.06|A|F|1993-10-11|1993-08-30|1993-11-04|DELIVER IN PERSON|TRUCK|eposits. regular epitaphs boost blithely. +4007|1015|21|3|5|4580.05|0.09|0.06|A|F|1993-09-17|1993-08-29|1993-10-12|TAKE BACK RETURN|FOB|y unusual packa +4007|1380|95|4|15|19220.70|0.05|0.02|A|F|1993-09-01|1993-07-19|1993-09-03|DELIVER IN PERSON|FOB|le furiously quickly +4007|259|60|5|23|26662.75|0.02|0.07|A|F|1993-10-08|1993-09-09|1993-10-23|COLLECT COD|MAIL|ter the accounts. expr +4032|1017|18|1|8|7344.08|0.06|0.00|N|O|1998-06-04|1998-05-17|1998-07-03|TAKE BACK RETURN|RAIL|ometimes even cou +4032|17|93|2|27|24759.27|0.09|0.00|N|O|1998-05-31|1998-04-19|1998-06-24|COLLECT COD|REG AIR|le furiously according to +4032|1537|78|3|23|33086.19|0.09|0.06|N|O|1998-06-12|1998-05-11|1998-06-24|COLLECT COD|MAIL|ording to the +4032|847|81|4|10|17478.40|0.09|0.05|N|O|1998-03-31|1998-04-22|1998-04-07|NONE|REG AIR| carefully bol +4033|1096|97|1|27|26921.43|0.01|0.04|R|F|1993-08-08|1993-08-14|1993-08-09|NONE|AIR|pinto beans +4033|374|3|2|34|43328.58|0.07|0.00|R|F|1993-07-19|1993-08-05|1993-07-26|NONE|RAIL|t the blithely dogg +4034|1900|87|1|48|86491.20|0.03|0.03|A|F|1994-03-01|1994-01-16|1994-03-16|NONE|RAIL| blithely regular requests play carefull +4034|568|99|2|47|69022.32|0.07|0.05|A|F|1994-01-27|1993-12-26|1994-02-04|NONE|TRUCK|eodolites was slyly ironic ideas. de +4034|539|40|3|43|61899.79|0.10|0.03|A|F|1993-11-29|1994-01-08|1993-12-10|DELIVER IN PERSON|FOB|posits wake carefully af +4034|277|78|4|46|54154.42|0.06|0.00|A|F|1994-02-22|1994-01-09|1994-03-04|DELIVER IN PERSON|AIR|uests. furiously unusual instructions wake +4034|1952|85|5|7|12977.65|0.07|0.06|R|F|1994-03-04|1994-01-22|1994-04-01|NONE|AIR|y even theodolites. slyly regular instru +4034|493|81|6|5|6967.45|0.01|0.06|A|F|1994-02-12|1994-01-24|1994-02-13|COLLECT COD|AIR|fully around the furiously ironic re +4035|968|69|1|4|7475.84|0.08|0.03|R|F|1992-04-21|1992-04-23|1992-04-25|COLLECT COD|AIR|ilent, even pear +4035|1351|52|2|4|5009.40|0.07|0.00|A|F|1992-05-21|1992-04-24|1992-05-24|DELIVER IN PERSON|FOB|en instructions sleep blith +4035|1171|80|3|1|1072.17|0.03|0.01|R|F|1992-06-18|1992-05-19|1992-07-02|COLLECT COD|FOB| requests. quickly +4035|1813|43|4|13|22292.53|0.00|0.01|R|F|1992-06-10|1992-05-16|1992-07-10|NONE|SHIP|s. furiously even courts wake slyly +4036|56|7|1|46|43978.30|0.09|0.00|N|O|1997-06-21|1997-05-29|1997-07-18|NONE|REG AIR|usly across the even th +4036|525|56|2|21|29935.92|0.09|0.07|N|O|1997-08-08|1997-06-28|1997-08-09|COLLECT COD|MAIL|e carefully. qui +4036|1417|18|3|6|7910.46|0.07|0.01|N|O|1997-06-19|1997-06-16|1997-07-01|DELIVER IN PERSON|SHIP|equests wake about the bold id +4036|1261|73|4|20|23245.20|0.08|0.02|N|O|1997-08-11|1997-07-11|1997-09-03|NONE|TRUCK|slyly bold deposits cajole pending, blithe +4037|638|32|1|32|49236.16|0.00|0.06|A|F|1993-05-06|1993-06-08|1993-05-31|DELIVER IN PERSON|AIR|e of the pending, iron +4037|468|69|2|4|5473.84|0.09|0.07|A|F|1993-07-05|1993-06-12|1993-08-03|DELIVER IN PERSON|RAIL|s around the blithely ironic ac +4038|1957|90|1|40|74358.00|0.05|0.01|N|O|1996-01-15|1996-03-13|1996-01-25|COLLECT COD|TRUCK|t. slyly silent pinto beans amo +4038|113|66|2|37|37485.07|0.04|0.03|N|O|1996-03-17|1996-03-19|1996-04-07|DELIVER IN PERSON|REG AIR| packages +4038|319|20|3|24|29263.44|0.10|0.04|N|O|1996-04-06|1996-02-15|1996-04-18|TAKE BACK RETURN|RAIL|the furiously regu +4038|1493|94|4|29|40440.21|0.07|0.06|N|O|1996-01-07|1996-03-08|1996-01-13|NONE|FOB|ffix. quietly ironic packages a +4038|788|85|5|24|40530.72|0.07|0.06|N|O|1996-04-01|1996-04-05|1996-04-28|DELIVER IN PERSON|TRUCK|ake quickly after the final, ironic ac +4038|359|88|6|6|7556.10|0.07|0.05|N|O|1996-02-09|1996-03-05|1996-03-10|COLLECT COD|SHIP| special instructions. packa +4039|932|33|1|38|69651.34|0.03|0.06|N|O|1998-03-09|1997-12-31|1998-03-21|DELIVER IN PERSON|REG AIR|sual asymptotes. ironic deposits nag aft +4039|1211|23|2|17|18907.57|0.10|0.04|N|O|1998-01-15|1998-01-20|1998-01-28|TAKE BACK RETURN|MAIL| regular foxes haggle carefully bo +4039|633|96|3|9|13802.67|0.10|0.01|N|O|1998-03-08|1998-02-05|1998-04-05|TAKE BACK RETURN|FOB|t? pinto beans cajole across the thinly r +4039|271|99|4|43|50364.61|0.01|0.02|N|O|1998-01-02|1997-12-22|1998-01-15|NONE|FOB|beans believe bene +4039|1333|34|5|43|53076.19|0.09|0.00|N|O|1998-01-20|1998-01-11|1998-02-05|COLLECT COD|SHIP|sts along the regular in +4064|1984|29|1|3|5657.94|0.10|0.04|N|O|1997-01-04|1997-01-01|1997-01-23|NONE|SHIP|its! quickly sp +4064|395|24|2|15|19430.85|0.02|0.02|N|O|1996-11-09|1996-12-04|1996-11-18|DELIVER IN PERSON|MAIL|braids affix across the regular sheave +4064|1967|56|3|32|59806.72|0.04|0.07|N|O|1997-01-14|1997-01-01|1997-01-21|COLLECT COD|REG AIR|es boost. careful +4064|1622|46|4|24|36566.88|0.02|0.02|N|O|1997-01-01|1996-12-31|1997-01-23|DELIVER IN PERSON|SHIP|ly regular ideas. +4064|207|8|5|12|13286.40|0.08|0.08|N|O|1997-02-08|1996-12-18|1997-03-06|TAKE BACK RETURN|RAIL|ding to the requests +4064|1834|64|6|46|79848.18|0.03|0.00|N|O|1996-10-13|1997-01-05|1996-11-06|DELIVER IN PERSON|REG AIR|alongside of the f +4064|1997|42|7|9|17090.91|0.01|0.06|N|O|1996-12-17|1996-12-13|1997-01-12|NONE|AIR|furiously f +4065|1374|75|1|14|17855.18|0.04|0.02|A|F|1994-08-22|1994-07-29|1994-09-19|DELIVER IN PERSON|TRUCK|e furiously outside +4065|141|42|2|46|47892.44|0.03|0.05|A|F|1994-06-29|1994-08-01|1994-07-03|TAKE BACK RETURN|SHIP|, regular requests may mold above the +4065|965|34|3|33|61576.68|0.00|0.03|A|F|1994-09-03|1994-08-16|1994-09-13|DELIVER IN PERSON|AIR|ain blithely +4065|1065|36|4|8|7728.48|0.00|0.01|R|F|1994-10-04|1994-08-05|1994-10-25|TAKE BACK RETURN|SHIP|ages haggle carefully +4065|1227|28|5|29|32718.38|0.02|0.07|A|F|1994-06-29|1994-08-19|1994-07-17|NONE|RAIL|equests. packages sleep slyl +4065|1091|62|6|16|15873.44|0.05|0.00|R|F|1994-08-25|1994-08-06|1994-09-09|COLLECT COD|TRUCK|ncies use furiously. quickly un +4065|1432|11|7|11|14667.73|0.10|0.04|A|F|1994-07-25|1994-08-02|1994-07-30|NONE|RAIL|hang silently about +4066|1384|99|1|9|11568.42|0.01|0.05|N|O|1997-05-06|1997-03-25|1997-05-27|COLLECT COD|FOB|nal, ironic accounts. blithel +4066|926|61|2|19|34711.48|0.05|0.00|N|O|1997-05-13|1997-04-17|1997-06-08|NONE|TRUCK|quests. slyly regu +4066|758|23|3|8|13270.00|0.03|0.03|N|O|1997-04-24|1997-03-11|1997-05-20|NONE|REG AIR|accounts. special pinto beans +4066|1782|25|4|49|82505.22|0.01|0.01|N|O|1997-02-17|1997-03-24|1997-02-19|NONE|TRUCK|ial braids. furiously final deposits sl +4066|1703|4|5|43|69002.10|0.05|0.02|N|O|1997-02-16|1997-04-14|1997-02-18|DELIVER IN PERSON|MAIL|r instructions. slyly special +4066|1085|21|6|44|43387.52|0.01|0.00|N|O|1997-03-01|1997-04-27|1997-03-29|DELIVER IN PERSON|MAIL|express accounts nag bli +4067|1791|92|1|18|30470.22|0.03|0.08|A|F|1993-01-24|1992-12-23|1993-02-20|TAKE BACK RETURN|FOB|e the slyly final packages d +4067|954|57|2|14|25969.30|0.00|0.00|R|F|1993-02-03|1992-12-02|1993-02-07|TAKE BACK RETURN|TRUCK|ructions. quickly ironic accounts detect +4067|1403|21|3|17|22174.80|0.03|0.05|A|F|1993-01-26|1992-11-23|1993-01-27|NONE|REG AIR|ts haggle slyly unusual, final +4067|897|31|4|40|71915.60|0.07|0.08|R|F|1993-01-09|1992-11-21|1993-01-16|DELIVER IN PERSON|TRUCK|lar theodolites nag blithely above the +4067|849|16|5|17|29747.28|0.08|0.03|A|F|1993-01-20|1992-12-29|1993-02-03|DELIVER IN PERSON|REG AIR|r accounts. slyly special pa +4067|956|91|6|12|22283.40|0.04|0.03|A|F|1992-12-12|1992-11-28|1992-12-15|DELIVER IN PERSON|AIR|lly slyly even theodol +4067|827|61|7|17|29372.94|0.01|0.01|R|F|1992-12-12|1992-12-23|1992-12-30|NONE|AIR|ts affix. regular, regular requests s +4068|1092|93|1|43|42702.87|0.05|0.06|N|O|1996-11-28|1996-11-16|1996-12-22|NONE|AIR|ructions. regular, special packag +4068|570|1|2|31|45587.67|0.08|0.03|N|O|1996-12-11|1996-12-07|1996-12-30|NONE|SHIP|ds wake carefully amon +4069|1281|93|1|39|46108.92|0.09|0.02|R|F|1992-09-06|1992-07-22|1992-09-25|COLLECT COD|SHIP|ven theodolites nag quickly. fluffi +4069|426|27|2|32|42445.44|0.10|0.08|A|F|1992-06-18|1992-07-20|1992-07-07|TAKE BACK RETURN|TRUCK|unts. deposit +4069|1851|95|3|3|5258.55|0.06|0.01|R|F|1992-07-26|1992-07-07|1992-08-04|COLLECT COD|FOB|l packages. even, +4069|785|50|4|22|37087.16|0.10|0.05|A|F|1992-08-05|1992-08-04|1992-08-25|COLLECT COD|SHIP|ts. slyly special instruction +4069|1569|10|5|50|73528.00|0.09|0.06|A|F|1992-07-26|1992-06-30|1992-08-01|TAKE BACK RETURN|REG AIR|even foxes among the express wate +4069|1250|62|6|3|3453.75|0.02|0.01|A|F|1992-05-24|1992-06-18|1992-06-12|COLLECT COD|MAIL|y final deposits wake furiously! slyl +4069|1835|79|7|50|86841.50|0.00|0.01|R|F|1992-09-03|1992-06-14|1992-10-01|NONE|REG AIR|ages. carefully regular +4070|1827|14|1|2|3457.64|0.09|0.08|N|O|1995-08-03|1995-09-10|1995-08-17|TAKE BACK RETURN|REG AIR|ptotes affix +4070|1549|90|2|40|58021.60|0.07|0.07|N|O|1995-07-13|1995-07-23|1995-08-06|COLLECT COD|MAIL|about the sentiments. quick +4070|618|19|3|11|16704.71|0.00|0.08|N|O|1995-08-23|1995-08-15|1995-08-31|TAKE BACK RETURN|MAIL| carefully final pack +4070|285|13|4|46|54522.88|0.02|0.02|N|O|1995-06-22|1995-07-14|1995-07-11|DELIVER IN PERSON|REG AIR|nticing ideas. boldly +4071|1119|28|1|22|22442.42|0.02|0.07|N|O|1996-10-31|1996-12-14|1996-11-05|NONE|REG AIR|sits cajole carefully final instructio +4071|178|57|2|47|50673.99|0.00|0.03|N|O|1996-11-04|1996-12-09|1996-11-16|NONE|TRUCK|ts cajole furiously along the +4096|269|51|1|31|36247.06|0.10|0.02|A|F|1992-07-14|1992-09-03|1992-07-31|COLLECT COD|TRUCK|y final, even platelets. boldly +4096|561|52|2|17|24846.52|0.07|0.03|R|F|1992-09-30|1992-08-11|1992-10-11|TAKE BACK RETURN|REG AIR|platelets alongside of the +4096|87|88|3|21|20728.68|0.08|0.00|A|F|1992-08-24|1992-09-04|1992-09-11|DELIVER IN PERSON|MAIL|tes mold flu +4096|1277|15|4|20|23565.40|0.02|0.07|R|F|1992-08-24|1992-09-13|1992-08-28|DELIVER IN PERSON|TRUCK|sual requests. furiously bold packages wake +4097|735|36|1|50|81786.50|0.04|0.04|N|O|1996-08-31|1996-08-14|1996-09-27|DELIVER IN PERSON|MAIL|egular deposits. blithely pending +4097|733|66|2|46|75151.58|0.10|0.01|N|O|1996-07-29|1996-08-19|1996-08-25|COLLECT COD|AIR| even depend +4097|1738|65|3|42|68868.66|0.06|0.06|N|O|1996-08-11|1996-07-30|1996-08-15|NONE|FOB|carefully silent foxes are against the +4098|1995|96|1|46|87261.54|0.07|0.03|N|O|1997-01-26|1997-01-27|1997-02-13|TAKE BACK RETURN|SHIP|e slyly blithely silent deposits. fluff +4099|31|57|1|29|26999.87|0.09|0.07|R|F|1992-11-21|1992-11-04|1992-11-30|NONE|FOB| slowly final warthogs sleep blithely. q +4099|1370|85|2|3|3814.11|0.04|0.06|A|F|1992-09-12|1992-10-18|1992-10-01|NONE|RAIL|. special packages sleep +4099|501|92|3|36|50454.00|0.06|0.06|R|F|1992-11-06|1992-09-28|1992-12-02|NONE|FOB|beans cajole slyly quickly ironic +4099|1390|5|4|7|9039.73|0.05|0.02|A|F|1992-09-12|1992-11-13|1992-09-14|TAKE BACK RETURN|AIR|onic foxes. quickly final fox +4099|1630|13|5|48|73518.24|0.00|0.02|R|F|1992-10-18|1992-10-14|1992-11-01|NONE|REG AIR|ts haggle according to the slyly f +4099|582|83|6|39|57820.62|0.07|0.02|R|F|1992-12-13|1992-11-13|1992-12-26|DELIVER IN PERSON|REG AIR|fluffy accounts impress pending, iro +4099|1793|20|7|46|77960.34|0.06|0.07|R|F|1992-10-29|1992-11-03|1992-11-10|DELIVER IN PERSON|REG AIR|ages nag requests. +4100|737|38|1|4|6550.92|0.03|0.03|N|O|1996-06-20|1996-04-29|1996-06-21|TAKE BACK RETURN|FOB|lyly regular, bold requ +4101|1144|17|1|22|22993.08|0.05|0.02|R|F|1994-02-02|1994-02-19|1994-02-12|COLLECT COD|AIR|ly express instructions. careful +4102|98|24|1|17|16967.53|0.02|0.02|N|O|1996-06-03|1996-05-06|1996-07-02|COLLECT COD|AIR|ly silent theodolites sleep unusual exc +4102|686|18|2|5|7933.40|0.08|0.02|N|O|1996-05-11|1996-05-11|1996-05-16|COLLECT COD|AIR| the furiously even +4102|668|31|3|39|61177.74|0.08|0.01|N|O|1996-04-14|1996-05-18|1996-04-20|DELIVER IN PERSON|AIR|ffix blithely slyly special +4102|1391|30|4|39|50403.21|0.02|0.00|N|O|1996-06-15|1996-06-06|1996-06-30|DELIVER IN PERSON|SHIP|y among the furiously special +4102|2|53|5|32|28864.00|0.08|0.01|N|O|1996-05-14|1996-04-29|1996-05-29|NONE|RAIL| the even requests; regular pinto +4102|1362|39|6|7|8843.52|0.02|0.01|N|O|1996-06-19|1996-05-21|1996-07-15|NONE|REG AIR|bove the carefully pending the +4103|748|13|1|40|65949.60|0.05|0.03|R|F|1992-09-19|1992-08-14|1992-09-21|COLLECT COD|RAIL|usly across the slyly busy accounts! fin +4128|1959|4|1|5|9304.75|0.04|0.04|N|O|1995-10-18|1995-11-28|1995-10-28|TAKE BACK RETURN|FOB|ake permanently +4129|553|44|1|32|46513.60|0.03|0.04|A|F|1993-09-16|1993-08-25|1993-09-25|TAKE BACK RETURN|MAIL|ckages haggl +4129|270|25|2|39|45640.53|0.06|0.07|R|F|1993-10-21|1993-08-04|1993-10-29|COLLECT COD|MAIL|y regular foxes. slyly ironic deposits +4130|1780|7|1|44|73998.32|0.07|0.04|N|O|1996-05-14|1996-04-15|1996-05-15|COLLECT COD|TRUCK|eaves haggle qui +4130|630|93|2|2|3061.26|0.05|0.06|N|O|1996-05-19|1996-04-24|1996-06-17|TAKE BACK RETURN|RAIL|uriously regular instructions around th +4131|498|28|1|6|8390.94|0.05|0.01|N|O|1998-04-27|1998-04-18|1998-04-29|TAKE BACK RETURN|MAIL|ns cajole slyly. even, iro +4131|1776|19|2|32|53688.64|0.08|0.01|N|O|1998-03-02|1998-03-21|1998-03-07|TAKE BACK RETURN|TRUCK| furiously regular asymptotes nod sly +4131|253|35|3|25|28831.25|0.02|0.07|N|O|1998-02-24|1998-03-01|1998-02-27|TAKE BACK RETURN|FOB|uickly exp +4131|351|8|4|8|10010.80|0.04|0.01|N|O|1998-03-03|1998-03-15|1998-03-26|COLLECT COD|FOB| after the furiously ironic d +4131|1244|45|5|30|34357.20|0.01|0.01|N|O|1998-04-01|1998-04-13|1998-04-08|TAKE BACK RETURN|FOB|he fluffily express depen +4131|1020|91|6|47|43287.94|0.02|0.00|N|O|1998-03-09|1998-04-05|1998-03-13|TAKE BACK RETURN|RAIL|ges. ironic pinto be +4132|1374|13|1|28|35710.36|0.07|0.03|N|O|1995-08-16|1995-08-01|1995-08-29|TAKE BACK RETURN|SHIP|pths wake against the stealthily special pi +4132|143|22|2|23|23992.22|0.07|0.07|N|O|1995-06-27|1995-07-27|1995-07-13|TAKE BACK RETURN|FOB|d deposits. fluffily even requests haggle b +4132|867|34|3|18|31821.48|0.09|0.04|A|F|1995-06-01|1995-08-01|1995-06-02|TAKE BACK RETURN|RAIL|y final de +4133|237|38|1|35|39803.05|0.02|0.00|A|F|1992-11-25|1992-09-15|1992-12-25|NONE|AIR|g above the quickly bold packages. ev +4134|1203|15|1|34|37542.80|0.02|0.05|R|F|1995-04-29|1995-03-13|1995-05-11|DELIVER IN PERSON|FOB|e furiously regular sheaves sleep +4134|957|60|2|34|63170.30|0.01|0.03|A|F|1995-05-06|1995-03-28|1995-05-13|DELIVER IN PERSON|SHIP|ual asymptotes wake carefully alo +4134|1706|33|3|12|19292.40|0.05|0.04|A|F|1995-03-19|1995-03-27|1995-04-14|COLLECT COD|TRUCK|kly above the quickly regular +4134|1000|3|4|45|40545.00|0.08|0.02|A|F|1995-04-11|1995-03-27|1995-04-17|TAKE BACK RETURN|MAIL|ironic pin +4135|20|21|1|23|21160.46|0.06|0.01|N|O|1997-04-09|1997-05-12|1997-04-16|TAKE BACK RETURN|FOB|posits cajole furiously carefully +4135|1194|95|2|32|35046.08|0.07|0.00|N|O|1997-03-14|1997-04-23|1997-04-12|TAKE BACK RETURN|TRUCK| ideas. requests use. furiously +4135|1593|74|3|33|49321.47|0.05|0.05|N|O|1997-05-01|1997-05-23|1997-05-23|DELIVER IN PERSON|AIR|he fluffil +4135|1948|49|4|13|24049.22|0.04|0.07|N|O|1997-03-16|1997-05-19|1997-04-03|COLLECT COD|RAIL|efully special account +4160|1125|98|1|25|25653.00|0.10|0.04|N|O|1996-09-22|1996-10-17|1996-09-24|NONE|SHIP|ar accounts sleep blithe +4160|1217|55|2|12|13418.52|0.00|0.03|N|O|1996-11-22|1996-09-25|1996-12-10|DELIVER IN PERSON|REG AIR|y bold package +4160|625|26|3|48|73229.76|0.04|0.04|N|O|1996-09-19|1996-11-02|1996-09-24|COLLECT COD|FOB| unusual dolphins +4161|1216|54|1|12|13406.52|0.08|0.02|R|F|1993-08-25|1993-10-04|1993-09-22|COLLECT COD|RAIL|onic dolphins. in +4161|274|2|2|47|55190.69|0.05|0.00|A|F|1993-12-20|1993-10-29|1994-01-19|TAKE BACK RETURN|RAIL|r requests about the final, even foxes hag +4161|1371|10|3|42|53439.54|0.03|0.04|R|F|1993-11-12|1993-10-04|1993-11-27|COLLECT COD|MAIL|thely across the even attainments. express +4161|95|46|4|45|44779.05|0.02|0.06|A|F|1993-10-22|1993-10-17|1993-10-30|COLLECT COD|REG AIR|about the ironic packages cajole blithe +4161|284|85|5|46|54476.88|0.05|0.01|A|F|1993-11-09|1993-11-17|1993-11-17|TAKE BACK RETURN|TRUCK|he stealthily ironic foxes. ideas haggl +4161|1471|72|6|19|26076.93|0.07|0.00|R|F|1993-08-22|1993-11-11|1993-09-01|TAKE BACK RETURN|REG AIR|beans breach s +4162|732|97|1|45|73472.85|0.10|0.07|A|F|1992-03-21|1992-05-02|1992-03-29|DELIVER IN PERSON|AIR|elets. slyly regular i +4162|894|95|2|29|52051.81|0.00|0.05|R|F|1992-02-25|1992-04-25|1992-03-17|NONE|REG AIR|nding pinto beans haggle blithe +4163|329|30|1|13|15981.16|0.08|0.03|A|F|1993-02-17|1993-03-13|1993-03-15|DELIVER IN PERSON|REG AIR|phins wake. pending requests inte +4164|1197|70|1|9|9883.71|0.07|0.02|N|O|1998-08-25|1998-08-13|1998-09-19|DELIVER IN PERSON|SHIP|re fluffily slyly bold requests. +4165|402|3|1|12|15628.80|0.00|0.01|N|O|1997-09-20|1997-10-20|1997-10-12|TAKE BACK RETURN|REG AIR|nwind slow theodolites. carefully pending +4166|1408|26|1|8|10475.20|0.00|0.08|A|F|1993-06-05|1993-04-10|1993-07-05|COLLECT COD|MAIL|uickly. blithely pending de +4166|922|57|2|8|14583.36|0.06|0.04|A|F|1993-06-07|1993-04-17|1993-06-16|DELIVER IN PERSON|REG AIR|es along the furiously regular acc +4166|64|90|3|17|16389.02|0.02|0.06|R|F|1993-06-29|1993-05-15|1993-07-24|DELIVER IN PERSON|SHIP|ackages. re +4166|856|56|4|36|63246.60|0.06|0.05|R|F|1993-03-01|1993-05-25|1993-03-05|COLLECT COD|MAIL|unts. furiously express accounts w +4166|764|29|5|5|8323.80|0.08|0.01|A|F|1993-06-19|1993-04-24|1993-06-27|NONE|REG AIR|hely unusual packages are above the f +4166|1019|55|6|6|5520.06|0.04|0.08|R|F|1993-04-30|1993-04-17|1993-05-08|DELIVER IN PERSON|MAIL|ily ironic deposits print furiously. iron +4166|232|33|7|26|29437.98|0.09|0.01|R|F|1993-03-17|1993-05-09|1993-03-25|NONE|MAIL|lar dependencies. s +4167|607|70|1|47|70857.20|0.04|0.02|N|O|1998-08-02|1998-08-24|1998-08-28|DELIVER IN PERSON|REG AIR| carefully final asymptotes. slyly bo +4167|866|67|2|17|30036.62|0.06|0.07|N|O|1998-09-18|1998-09-06|1998-10-07|COLLECT COD|REG AIR|ly around the even instr +4167|726|59|3|1|1626.72|0.03|0.06|N|O|1998-10-11|1998-08-14|1998-10-13|COLLECT COD|TRUCK|xpress platelets. blithely +4192|109|88|1|36|36327.60|0.06|0.08|N|O|1998-04-25|1998-05-26|1998-05-03|COLLECT COD|TRUCK|eodolites sleep +4192|1207|45|2|15|16623.00|0.04|0.08|N|O|1998-06-26|1998-05-26|1998-07-16|COLLECT COD|AIR|e slyly special grouches. express pinto b +4192|1350|27|3|7|8759.45|0.06|0.03|N|O|1998-05-19|1998-07-08|1998-05-31|COLLECT COD|FOB|y; excuses use. ironic, close instru +4192|233|88|4|32|36263.36|0.09|0.04|N|O|1998-06-23|1998-06-25|1998-07-17|NONE|FOB|ounts are fluffily slyly bold req +4192|471|59|5|48|65830.56|0.08|0.01|N|O|1998-08-17|1998-07-11|1998-09-03|NONE|AIR|ests. quickly bol +4192|1496|36|6|44|61489.56|0.10|0.02|N|O|1998-08-06|1998-07-09|1998-08-20|NONE|FOB|structions mai +4192|1699|23|7|27|43218.63|0.02|0.00|N|O|1998-07-03|1998-06-26|1998-07-13|TAKE BACK RETURN|AIR| carefully even escapades. care +4193|1303|18|1|37|44559.10|0.09|0.06|A|F|1994-04-25|1994-02-24|1994-05-08|NONE|AIR|er the quickly regular dependencies wake +4193|1165|74|2|3|3198.48|0.09|0.05|R|F|1994-04-29|1994-03-20|1994-05-29|TAKE BACK RETURN|REG AIR|osits above the depo +4193|1785|86|3|10|16867.80|0.06|0.03|A|F|1994-02-10|1994-03-22|1994-03-09|COLLECT COD|RAIL|uffily spe +4193|501|32|4|29|40643.50|0.09|0.05|A|F|1994-02-11|1994-03-11|1994-03-13|TAKE BACK RETURN|RAIL|ly. final packages use blit +4193|199|52|5|50|54959.50|0.01|0.01|R|F|1994-04-28|1994-03-23|1994-05-09|NONE|FOB| beans. regular accounts cajole. de +4193|653|47|6|21|32626.65|0.02|0.04|R|F|1994-04-26|1994-03-22|1994-05-23|DELIVER IN PERSON|TRUCK|accounts cajole b +4194|1968|1|1|43|80408.28|0.08|0.06|A|F|1994-11-06|1994-12-09|1994-11-16|NONE|TRUCK|olites are after the exp +4194|466|25|2|18|24596.28|0.07|0.07|A|F|1995-02-14|1994-12-04|1995-03-11|TAKE BACK RETURN|TRUCK|ld packages. quickly eve +4195|57|83|1|14|13398.70|0.09|0.04|R|F|1993-09-06|1993-07-21|1993-09-18|DELIVER IN PERSON|REG AIR|ironic packages. carefully express +4195|660|54|2|22|34334.52|0.10|0.08|R|F|1993-07-01|1993-07-23|1993-07-28|COLLECT COD|RAIL|lly express pinto bea +4195|1937|70|3|19|34939.67|0.01|0.06|R|F|1993-09-06|1993-08-13|1993-09-15|TAKE BACK RETURN|REG AIR|telets sleep even requests. final, even i +4196|1551|92|1|30|43576.50|0.02|0.06|N|O|1998-08-09|1998-06-30|1998-09-05|COLLECT COD|SHIP|egular foxes us +4196|83|59|2|31|30475.48|0.09|0.08|N|O|1998-06-12|1998-07-28|1998-07-11|NONE|MAIL|ut the blithely ironic inst +4196|1776|77|3|46|77177.42|0.05|0.00|N|O|1998-09-05|1998-06-28|1998-09-10|TAKE BACK RETURN|MAIL|according to t +4196|1139|76|4|42|43685.46|0.04|0.06|N|O|1998-08-13|1998-07-18|1998-09-07|TAKE BACK RETURN|AIR| instructions. courts cajole slyly ev +4196|717|50|5|3|4853.13|0.01|0.03|N|O|1998-05-17|1998-07-21|1998-05-18|DELIVER IN PERSON|TRUCK| accounts. fu +4196|861|95|6|43|75759.98|0.01|0.06|N|O|1998-08-12|1998-07-12|1998-08-22|DELIVER IN PERSON|FOB|es. slyly even +4196|31|7|7|3|2793.09|0.00|0.06|N|O|1998-08-05|1998-07-28|1998-08-15|DELIVER IN PERSON|REG AIR|y regular packages haggle furiously alongs +4197|1281|56|1|50|59114.00|0.06|0.03|N|O|1996-11-15|1996-11-01|1996-11-20|NONE|FOB|. carefully bold asymptotes nag blithe +4197|697|29|2|39|62309.91|0.02|0.08|N|O|1996-10-07|1996-10-11|1996-10-18|DELIVER IN PERSON|RAIL|ronic requests. quickly bold packages in +4197|320|49|3|28|34168.96|0.06|0.02|N|O|1996-10-05|1996-10-24|1996-10-22|TAKE BACK RETURN|AIR|regular pin +4197|954|55|4|23|42663.85|0.00|0.03|N|O|1996-09-10|1996-10-10|1996-09-25|NONE|AIR|l instructions print slyly past the reg +4197|1210|48|5|37|41114.77|0.03|0.04|N|O|1996-10-20|1996-10-10|1996-11-10|COLLECT COD|TRUCK|carefully enticing decoys boo +4197|307|36|6|48|57950.40|0.08|0.00|N|O|1996-10-07|1996-10-25|1996-10-23|COLLECT COD|REG AIR| final instructions. blithe, spe +4198|1452|31|1|48|64965.60|0.09|0.05|N|O|1997-09-03|1997-07-18|1997-09-11|NONE|REG AIR|cajole carefully final, ironic ide +4198|1423|2|2|46|60923.32|0.09|0.01|N|O|1997-08-17|1997-09-08|1997-09-11|COLLECT COD|TRUCK|posits among th +4198|1446|64|3|13|17516.72|0.03|0.04|N|O|1997-07-18|1997-07-24|1997-08-10|NONE|REG AIR| furious excuses. bli +4199|697|91|1|16|25563.04|0.10|0.00|A|F|1992-06-11|1992-04-10|1992-07-10|COLLECT COD|TRUCK|ncies. furiously special accounts +4199|89|90|2|18|17803.44|0.00|0.01|A|F|1992-06-01|1992-03-30|1992-06-28|DELIVER IN PERSON|RAIL|pending, regular accounts. carefully +4224|1983|84|1|27|50894.46|0.05|0.03|N|O|1997-09-05|1997-08-19|1997-09-30|NONE|SHIP|ly special deposits sleep qui +4224|368|53|2|20|25367.20|0.07|0.05|N|O|1997-11-09|1997-08-23|1997-11-14|NONE|FOB|unts promise across the requests. blith +4224|238|20|3|4|4552.92|0.08|0.05|N|O|1997-09-07|1997-09-05|1997-09-25|TAKE BACK RETURN|FOB| even dinos. carefull +4224|1597|18|4|50|74929.50|0.10|0.06|N|O|1997-07-30|1997-09-10|1997-08-19|COLLECT COD|RAIL|side of the carefully silent dep +4224|842|76|5|48|83656.32|0.00|0.04|N|O|1997-10-03|1997-08-31|1997-10-10|NONE|RAIL| final, regular asymptotes use alway +4225|488|76|1|25|34712.00|0.08|0.04|N|O|1997-07-10|1997-08-08|1997-07-31|TAKE BACK RETURN|TRUCK|se fluffily. busily ironic requests are; +4225|951|86|2|23|42594.85|0.02|0.04|N|O|1997-09-18|1997-08-31|1997-10-11|TAKE BACK RETURN|RAIL|. quickly b +4225|980|15|3|28|52667.44|0.08|0.03|N|O|1997-07-11|1997-09-01|1997-08-03|DELIVER IN PERSON|FOB|ts are requests. even, bold depos +4226|1871|15|1|27|47867.49|0.06|0.08|A|F|1993-05-03|1993-04-12|1993-05-16|COLLECT COD|AIR|sly alongside of the slyly ironic pac +4227|1572|13|1|19|27997.83|0.01|0.08|A|F|1995-05-05|1995-05-03|1995-05-22|COLLECT COD|REG AIR|ns sleep along the blithely even theodolit +4227|327|28|2|8|9818.56|0.09|0.00|N|F|1995-06-11|1995-04-30|1995-06-28|COLLECT COD|REG AIR| packages since the bold, u +4227|747|48|3|11|18125.14|0.10|0.04|A|F|1995-03-30|1995-05-02|1995-04-26|DELIVER IN PERSON|SHIP|l requests-- bold requests cajole dogg +4227|1993|26|4|2|3789.98|0.02|0.05|R|F|1995-04-24|1995-05-09|1995-05-21|DELIVER IN PERSON|AIR|ep. specia +4227|1469|87|5|49|67152.54|0.05|0.06|R|F|1995-05-19|1995-04-12|1995-06-12|TAKE BACK RETURN|REG AIR|ts sleep blithely carefully unusual ideas. +4228|1410|28|1|20|26228.20|0.00|0.06|N|O|1997-04-24|1997-05-29|1997-05-17|NONE|RAIL|f the slyly fluffy pinto beans are +4229|954|23|1|44|81617.80|0.02|0.05|N|O|1998-05-29|1998-05-12|1998-06-16|DELIVER IN PERSON|AIR|s. carefully e +4229|46|72|2|34|32165.36|0.07|0.05|N|O|1998-05-26|1998-04-13|1998-06-08|DELIVER IN PERSON|MAIL|thely final accounts use even packa +4230|452|40|1|38|51393.10|0.10|0.03|A|F|1992-04-28|1992-04-21|1992-05-28|TAKE BACK RETURN|FOB|ly regular packages. regular ideas boost +4230|1987|20|2|43|81226.14|0.02|0.08|R|F|1992-03-14|1992-05-13|1992-03-28|NONE|FOB|ses lose blithely slyly final e +4230|1951|40|3|10|18529.50|0.06|0.02|A|F|1992-06-11|1992-04-11|1992-07-02|TAKE BACK RETURN|MAIL|ar packages are +4230|744|45|4|28|46052.72|0.01|0.03|R|F|1992-05-12|1992-05-10|1992-06-01|TAKE BACK RETURN|MAIL|nt instruct +4230|1248|86|5|50|57462.00|0.00|0.01|A|F|1992-03-29|1992-05-19|1992-04-20|TAKE BACK RETURN|SHIP|ts. final instructions in +4230|349|6|6|30|37480.20|0.05|0.07|A|F|1992-03-11|1992-04-29|1992-03-30|NONE|AIR|s. final excuses across the +4230|1511|12|7|18|25425.18|0.10|0.04|R|F|1992-06-23|1992-05-10|1992-07-04|COLLECT COD|SHIP| the final acco +4231|1416|17|1|47|61918.27|0.09|0.03|N|O|1997-11-27|1998-01-26|1997-12-17|NONE|REG AIR|hely along the silent at +4231|1652|35|2|4|6214.60|0.06|0.02|N|O|1997-11-28|1998-01-26|1997-12-12|TAKE BACK RETURN|MAIL|lithely even packages. +4231|1204|5|3|31|34261.20|0.07|0.08|N|O|1998-02-14|1997-12-27|1998-03-01|DELIVER IN PERSON|FOB|ublate. theodoli +4231|391|48|4|35|45198.65|0.10|0.00|N|O|1998-02-21|1998-01-24|1998-03-18|DELIVER IN PERSON|FOB|le quickly regular, unus +4256|1504|45|1|22|30921.00|0.05|0.05|R|F|1992-07-30|1992-05-14|1992-08-14|NONE|TRUCK|, final platelets are slyly final pint +4257|645|39|1|3|4636.92|0.10|0.03|N|O|1995-06-18|1995-05-01|1995-07-12|DELIVER IN PERSON|MAIL|thin the theodolites use after the bl +4257|350|7|2|5|6251.75|0.01|0.04|R|F|1995-04-29|1995-06-05|1995-05-13|TAKE BACK RETURN|TRUCK|n deposits. furiously e +4257|1271|72|3|33|38684.91|0.03|0.04|A|F|1995-05-23|1995-05-03|1995-05-31|COLLECT COD|AIR|uffily regular accounts ar +4258|1651|52|1|36|55895.40|0.02|0.06|N|O|1997-02-23|1997-01-25|1997-02-27|TAKE BACK RETURN|SHIP|ns use alongs +4258|1618|60|2|19|28872.59|0.03|0.02|N|O|1997-01-14|1996-12-12|1997-01-20|TAKE BACK RETURN|AIR|ly busily ironic foxes. f +4258|309|94|3|46|55627.80|0.04|0.07|N|O|1997-01-02|1996-12-26|1997-01-12|DELIVER IN PERSON|AIR| furiously pend +4258|343|44|4|22|27353.48|0.04|0.04|N|O|1996-12-12|1996-12-06|1996-12-20|TAKE BACK RETURN|AIR|e regular, even asym +4258|1629|12|5|9|13775.58|0.04|0.03|N|O|1996-12-04|1996-12-08|1996-12-20|DELIVER IN PERSON|TRUCK|counts wake permanently after the bravely +4259|426|85|1|14|18569.88|0.05|0.03|N|O|1998-01-09|1997-11-21|1998-01-29|TAKE BACK RETURN|RAIL| furiously pending excuses. ideas hagg +4260|234|16|1|21|23818.83|0.08|0.04|R|F|1992-08-06|1992-06-18|1992-08-22|NONE|AIR|al, pending accounts must +4261|1094|95|1|12|11941.08|0.05|0.01|A|F|1992-11-01|1993-01-01|1992-11-12|NONE|FOB|into beans +4261|818|18|2|4|6875.24|0.02|0.07|R|F|1992-12-11|1992-12-18|1992-12-24|DELIVER IN PERSON|FOB|ackages unwind furiously fluff +4261|1743|86|3|3|4934.22|0.07|0.02|R|F|1992-11-10|1992-12-14|1992-11-17|COLLECT COD|RAIL|ly even deposits eat blithely alo +4261|1733|18|4|36|58850.28|0.04|0.06|R|F|1992-12-02|1992-12-18|1992-12-25|NONE|REG AIR| slyly pendi +4261|237|19|5|28|31842.44|0.07|0.06|A|F|1992-10-08|1992-12-23|1992-10-11|TAKE BACK RETURN|MAIL|packages. fluffily i +4262|756|57|1|30|49702.50|0.01|0.03|N|O|1996-08-11|1996-10-11|1996-09-09|TAKE BACK RETURN|RAIL|tes after the carefully +4262|957|58|2|5|9289.75|0.02|0.05|N|O|1996-09-27|1996-09-05|1996-10-25|COLLECT COD|SHIP|blithely final asymptotes integrate +4262|1611|53|3|5|7563.05|0.08|0.00|N|O|1996-10-02|1996-10-16|1996-10-05|NONE|REG AIR|ironic accounts are unusu +4262|734|31|4|45|73562.85|0.02|0.01|N|O|1996-11-09|1996-09-09|1996-11-12|DELIVER IN PERSON|SHIP|ackages boost. pending, even instruction +4262|992|61|5|28|53003.72|0.06|0.02|N|O|1996-10-22|1996-09-06|1996-11-13|DELIVER IN PERSON|FOB|ironic, regular depend +4262|165|44|6|26|27694.16|0.03|0.02|N|O|1996-08-29|1996-09-25|1996-08-31|NONE|RAIL|s boost slyly along the bold, iro +4262|1595|76|7|41|61360.19|0.03|0.01|N|O|1996-08-28|1996-09-14|1996-09-20|COLLECT COD|RAIL|cuses unwind ac +4263|171|72|1|9|9640.53|0.08|0.07|N|O|1998-04-04|1998-04-29|1998-05-04|COLLECT COD|AIR|structions cajole quic +4263|1956|89|2|28|52022.60|0.05|0.03|N|O|1998-06-24|1998-06-08|1998-07-14|NONE|MAIL|ideas for the carefully re +4263|103|82|3|38|38117.80|0.01|0.01|N|O|1998-07-10|1998-05-08|1998-07-17|NONE|TRUCK|rding to the dep +4263|182|9|4|20|21643.60|0.02|0.07|N|O|1998-04-09|1998-04-30|1998-05-04|NONE|RAIL|uietly regular deposits. sly deposits w +4263|1980|13|5|14|26347.72|0.09|0.06|N|O|1998-05-06|1998-04-17|1998-05-11|DELIVER IN PERSON|TRUCK|d accounts. daringly regular accounts hagg +4263|1130|3|6|47|48463.11|0.08|0.06|N|O|1998-06-28|1998-05-09|1998-07-02|DELIVER IN PERSON|TRUCK|y. theodolites wake idly ironic do +4263|288|16|7|6|7129.68|0.04|0.04|N|O|1998-05-01|1998-06-02|1998-05-14|TAKE BACK RETURN|REG AIR|g the final, regular instructions: +4288|731|32|1|32|52215.36|0.10|0.07|R|F|1993-03-19|1993-01-26|1993-04-18|TAKE BACK RETURN|AIR|e blithely even instructions. speci +4288|1050|51|2|39|37090.95|0.05|0.02|R|F|1993-03-25|1993-02-06|1993-03-28|DELIVER IN PERSON|AIR|uffy theodolites run +4288|1247|59|3|7|8037.68|0.03|0.01|A|F|1993-01-15|1993-02-05|1993-01-26|NONE|TRUCK|ngside of the special platelet +4289|1957|58|1|19|35320.05|0.06|0.06|R|F|1993-12-31|1993-11-06|1994-01-23|DELIVER IN PERSON|TRUCK|e carefully regular ideas. sl +4290|1368|7|1|23|29195.28|0.06|0.04|R|F|1995-04-04|1995-02-16|1995-04-07|TAKE BACK RETURN|REG AIR|uests cajole carefully. +4290|984|53|2|3|5654.94|0.09|0.03|A|F|1995-03-25|1995-03-07|1995-04-11|NONE|RAIL|lar platelets cajole +4291|1919|52|1|3|5462.73|0.08|0.08|A|F|1994-03-17|1994-02-21|1994-03-27|COLLECT COD|SHIP|tes sleep slyly above the quickly sl +4291|1249|61|2|43|49460.32|0.01|0.06|A|F|1994-02-01|1994-02-27|1994-02-06|DELIVER IN PERSON|REG AIR|s. quietly regular +4291|80|6|3|25|24502.00|0.09|0.08|R|F|1994-02-14|1994-02-08|1994-03-15|COLLECT COD|AIR|uctions. furiously regular ins +4292|436|24|1|22|29401.46|0.08|0.03|R|F|1992-02-14|1992-02-16|1992-03-01|NONE|FOB|refully expres +4292|399|84|2|1|1299.39|0.03|0.01|A|F|1992-02-07|1992-03-16|1992-02-10|DELIVER IN PERSON|FOB| the furiously ev +4292|1193|2|3|35|38296.65|0.03|0.06|A|F|1992-03-23|1992-04-04|1992-04-02|COLLECT COD|TRUCK|dugouts use. furiously bold packag +4292|1624|7|4|40|61024.80|0.05|0.04|A|F|1992-04-27|1992-03-07|1992-05-04|COLLECT COD|REG AIR|ounts according to the furiously +4292|1303|18|5|6|7225.80|0.07|0.08|R|F|1992-03-03|1992-02-24|1992-03-25|COLLECT COD|FOB|bove the silently regula +4292|31|7|6|47|43758.41|0.05|0.00|R|F|1992-05-02|1992-03-21|1992-05-27|TAKE BACK RETURN|FOB|y packages; even ideas boost +4293|10|61|1|34|30940.34|0.03|0.08|N|O|1996-11-05|1996-10-12|1996-12-04|NONE|FOB|ions sleep blithely on +4293|769|66|2|50|83488.00|0.01|0.05|N|O|1996-11-27|1996-10-30|1996-12-22|COLLECT COD|MAIL| special deposits. furiousl +4293|1986|31|3|47|88735.06|0.08|0.02|N|O|1996-09-07|1996-10-24|1996-09-15|NONE|RAIL|ithely pending deposits af +4293|879|79|4|25|44496.75|0.04|0.04|N|O|1996-09-11|1996-11-14|1996-09-22|DELIVER IN PERSON|FOB|inal asympt +4293|1807|51|5|1|1708.80|0.06|0.05|N|O|1996-11-15|1996-10-09|1996-11-26|COLLECT COD|AIR|eposits should boost along the +4293|790|87|6|45|76085.55|0.10|0.04|N|O|1996-11-04|1996-11-06|1996-11-23|NONE|MAIL|lar ideas use carefully +4294|1050|86|1|19|18069.95|0.03|0.04|A|F|1992-10-16|1992-11-13|1992-10-26|DELIVER IN PERSON|AIR|nt dependencies. furiously regular ideas d +4294|266|94|2|16|18660.16|0.01|0.02|R|F|1992-08-17|1992-09-24|1992-09-04|TAKE BACK RETURN|REG AIR|lithely pint +4294|1971|60|3|30|56189.10|0.01|0.00|A|F|1992-09-12|1992-11-06|1992-09-25|NONE|MAIL|olites. bold foxes affix ironic theodolite +4294|1045|51|4|34|32165.36|0.02|0.01|R|F|1992-09-09|1992-11-06|1992-10-04|TAKE BACK RETURN|REG AIR|pendencies! +4294|1190|27|5|37|40374.03|0.05|0.01|R|F|1992-09-07|1992-10-13|1992-09-08|NONE|REG AIR|cial packages nag f +4294|863|97|6|42|74082.12|0.02|0.03|A|F|1992-09-30|1992-11-13|1992-10-15|DELIVER IN PERSON|FOB| carefully; furiously ex +4294|1748|75|7|47|77537.78|0.02|0.08|R|F|1992-11-09|1992-11-03|1992-12-05|TAKE BACK RETURN|SHIP|es. blithely r +4295|285|67|1|49|58078.72|0.09|0.01|N|O|1996-05-25|1996-03-17|1996-06-19|TAKE BACK RETURN|REG AIR|refully silent requests. f +4295|706|3|2|4|6426.80|0.09|0.07|N|O|1996-06-05|1996-04-26|1996-06-13|DELIVER IN PERSON|TRUCK|arefully according to the pending ac +4295|1927|28|3|3|5486.76|0.04|0.00|N|O|1996-06-04|1996-04-24|1996-06-24|DELIVER IN PERSON|AIR|telets cajole bravely +4295|795|60|4|30|50873.70|0.07|0.06|N|O|1996-03-22|1996-04-23|1996-04-20|NONE|SHIP|yly ironic frets. pending foxes after +4320|459|47|1|28|38064.60|0.02|0.06|N|O|1997-01-28|1997-02-07|1997-02-07|COLLECT COD|FOB|nts. even, ironic excuses hagg +4320|1392|31|2|6|7760.34|0.08|0.08|N|O|1997-01-11|1997-01-26|1997-01-22|DELIVER IN PERSON|SHIP|against the carefully careful asym +4320|1877|64|3|33|58702.71|0.09|0.02|N|O|1996-12-11|1997-02-27|1997-01-08|TAKE BACK RETURN|SHIP|ess asymptotes so +4321|1469|87|1|33|45225.18|0.09|0.02|A|F|1994-09-01|1994-08-17|1994-09-05|DELIVER IN PERSON|TRUCK|yly special excuses. fluffily +4321|533|64|2|45|64508.85|0.00|0.08|R|F|1994-11-13|1994-09-15|1994-11-18|DELIVER IN PERSON|SHIP| haggle ironically bold theodolites. quick +4321|1853|54|3|23|40361.55|0.01|0.05|A|F|1994-11-03|1994-10-08|1994-11-06|DELIVER IN PERSON|SHIP|ly even orbits slee +4321|903|4|4|4|7215.60|0.02|0.00|R|F|1994-09-10|1994-10-06|1994-09-11|NONE|FOB|ironic deposi +4321|1717|60|5|10|16187.10|0.04|0.03|A|F|1994-09-07|1994-08-23|1994-09-17|TAKE BACK RETURN|SHIP|wake carefully alongside of +4322|688|82|1|39|61958.52|0.04|0.02|N|O|1998-04-27|1998-06-03|1998-05-04|TAKE BACK RETURN|MAIL|its integrate fluffily +4322|1398|99|2|9|11694.51|0.05|0.08|N|O|1998-05-18|1998-04-27|1998-05-28|COLLECT COD|AIR|ual instructio +4322|76|77|3|12|11712.84|0.09|0.05|N|O|1998-03-29|1998-06-05|1998-04-16|DELIVER IN PERSON|TRUCK|e blithely against the slyly unusu +4322|459|60|4|17|23110.65|0.09|0.08|N|O|1998-05-31|1998-05-31|1998-06-10|TAKE BACK RETURN|FOB|ructions boost +4322|1014|85|5|10|9150.10|0.00|0.05|N|O|1998-05-31|1998-04-27|1998-06-25|TAKE BACK RETURN|REG AIR| regular ideas engage carefully quick +4322|595|26|6|39|58328.01|0.09|0.08|N|O|1998-03-16|1998-05-21|1998-04-11|COLLECT COD|AIR|ccounts. dogged pin +4322|132|11|7|34|35092.42|0.05|0.00|N|O|1998-05-27|1998-04-12|1998-06-16|NONE|REG AIR|ounts haggle fluffily ideas. pend +4323|4|5|1|33|29832.00|0.09|0.02|A|F|1994-05-04|1994-03-06|1994-05-23|COLLECT COD|TRUCK|the slyly bold deposits slee +4324|503|4|1|44|61754.00|0.05|0.04|N|O|1995-10-15|1995-09-07|1995-11-07|DELIVER IN PERSON|AIR|ainst the u +4324|472|60|2|12|16469.64|0.04|0.02|N|O|1995-10-05|1995-09-07|1995-10-18|NONE|REG AIR|c packages. furiously express sauternes +4324|814|14|3|14|24007.34|0.07|0.06|N|O|1995-11-12|1995-08-26|1995-11-21|COLLECT COD|AIR| packages nag express excuses. qui +4324|500|30|4|14|19607.00|0.02|0.04|N|O|1995-09-20|1995-10-08|1995-10-06|COLLECT COD|RAIL| express ideas. blithely blit +4324|835|69|5|22|38188.26|0.07|0.03|N|O|1995-09-13|1995-10-04|1995-09-23|DELIVER IN PERSON|SHIP|ke express, special ideas. +4324|425|13|6|31|41088.02|0.08|0.04|N|O|1995-10-23|1995-09-14|1995-11-09|COLLECT COD|RAIL|efully flu +4324|1531|52|7|46|65896.38|0.00|0.03|N|O|1995-11-03|1995-09-28|1995-11-22|NONE|SHIP|ular, final theodo +4325|1597|18|1|18|26974.62|0.01|0.07|N|O|1996-10-07|1996-09-28|1996-10-31|DELIVER IN PERSON|RAIL|. blithely +4326|1628|29|1|11|16825.82|0.01|0.01|N|O|1997-02-02|1996-12-10|1997-02-20|DELIVER IN PERSON|TRUCK|press reque +4326|1670|12|2|27|42435.09|0.06|0.01|N|O|1996-11-29|1997-01-20|1996-12-23|COLLECT COD|AIR|inal packages. final asymptotes about t +4327|949|18|1|18|33298.92|0.08|0.00|N|F|1995-06-16|1995-04-20|1995-07-12|COLLECT COD|RAIL|y final excuses. ironic, special requests a +4327|1060|96|2|40|38442.40|0.07|0.01|N|F|1995-05-26|1995-04-17|1995-06-18|NONE|AIR|quests. packages are after th +4327|1445|85|3|11|14810.84|0.10|0.07|R|F|1995-04-24|1995-05-27|1995-05-24|TAKE BACK RETURN|FOB| ironic dolphins +4327|201|56|4|8|8809.60|0.04|0.08|N|F|1995-05-26|1995-05-28|1995-06-19|DELIVER IN PERSON|AIR|eodolites cajole; unusual Tiresias +4327|1891|92|5|39|69922.71|0.01|0.00|N|O|1995-06-23|1995-04-18|1995-07-13|TAKE BACK RETURN|FOB|kages against the blit +4327|1511|32|6|10|14125.10|0.00|0.06|A|F|1995-04-28|1995-06-11|1995-05-07|TAKE BACK RETURN|TRUCK|arefully sile +4352|1058|94|1|18|17262.90|0.00|0.03|N|O|1998-02-27|1998-02-02|1998-03-01|DELIVER IN PERSON|RAIL|ding to th +4353|937|40|1|22|40434.46|0.05|0.05|N|O|1998-01-19|1998-01-23|1998-02-10|COLLECT COD|FOB|ent packages. accounts are slyly. +4354|143|70|1|30|31294.20|0.08|0.07|R|F|1995-01-27|1994-11-24|1995-02-25|TAKE BACK RETURN|REG AIR|around the ir +4354|1522|3|2|23|32740.96|0.01|0.08|R|F|1994-11-20|1994-12-23|1994-11-27|TAKE BACK RETURN|AIR|kly along the ironic, ent +4354|508|69|3|2|2817.00|0.10|0.04|A|F|1995-01-09|1994-12-15|1995-01-24|TAKE BACK RETURN|REG AIR|s nag quickly +4354|852|52|4|36|63102.60|0.05|0.05|A|F|1994-11-20|1994-12-06|1994-12-06|DELIVER IN PERSON|AIR| wake slyly eve +4354|644|38|5|37|57151.68|0.06|0.02|R|F|1995-01-13|1994-12-29|1995-01-31|DELIVER IN PERSON|FOB|deas use blithely! special foxes print af +4354|1074|45|6|36|35102.52|0.03|0.04|R|F|1994-12-03|1994-12-05|1995-01-02|TAKE BACK RETURN|TRUCK|efully special packages use fluffily +4354|1388|27|7|18|23208.84|0.03|0.04|A|F|1994-12-07|1994-12-11|1994-12-11|TAKE BACK RETURN|SHIP|ross the furiously +4355|1941|86|1|32|58974.08|0.10|0.02|N|O|1996-12-29|1997-02-08|1997-01-24|DELIVER IN PERSON|REG AIR|y silent deposits. b +4355|166|93|2|4|4264.64|0.05|0.02|N|O|1997-02-25|1997-01-29|1997-03-17|TAKE BACK RETURN|TRUCK|slyly blithely regular packag +4355|8|9|3|13|11804.00|0.07|0.05|N|O|1997-01-21|1996-12-22|1997-02-14|COLLECT COD|TRUCK| ought to mold. blithely pending ideas +4355|1939|84|4|14|25773.02|0.04|0.02|N|O|1997-03-08|1997-01-22|1997-03-26|NONE|RAIL|he furiously ironic accounts. quickly iro +4355|306|91|5|50|60315.00|0.10|0.00|N|O|1996-11-25|1997-01-01|1996-12-06|DELIVER IN PERSON|REG AIR| regular accounts boost along the +4355|1219|57|6|35|39207.35|0.00|0.08|N|O|1997-01-28|1997-01-28|1997-02-20|NONE|FOB|ess accounts affix ironic +4355|1009|45|7|47|42770.00|0.09|0.02|N|O|1996-12-28|1996-12-29|1997-01-09|NONE|RAIL|e. realms integrate +4356|1938|39|1|35|64397.55|0.00|0.04|R|F|1994-05-30|1994-06-14|1994-06-08|COLLECT COD|MAIL|arefully ironic +4357|834|34|1|50|86741.50|0.04|0.07|N|O|1997-11-25|1997-12-03|1997-12-17|DELIVER IN PERSON|RAIL|s. final, e +4357|1079|80|2|17|16661.19|0.10|0.07|N|O|1998-02-01|1997-12-08|1998-02-09|DELIVER IN PERSON|MAIL|e carefully furiou +4358|1251|26|1|47|54155.75|0.04|0.00|N|O|1997-10-15|1997-10-14|1997-11-04|DELIVER IN PERSON|SHIP|refully busy dep +4359|1738|23|1|41|67228.93|0.03|0.07|A|F|1993-04-06|1993-05-06|1993-04-14|COLLECT COD|RAIL|s affix sly +4359|1528|9|2|8|11436.16|0.03|0.08|R|F|1993-06-27|1993-05-16|1993-07-04|DELIVER IN PERSON|MAIL|packages affix. fluffily regular f +4359|1923|12|3|32|58397.44|0.10|0.03|R|F|1993-06-18|1993-04-04|1993-07-18|COLLECT COD|MAIL|olites nag quietly caref +4359|776|9|4|1|1676.77|0.05|0.03|R|F|1993-04-27|1993-05-09|1993-05-08|NONE|MAIL| fluffily ironic, bold pac +4359|326|83|5|22|26979.04|0.04|0.01|A|F|1993-03-28|1993-06-01|1993-04-13|NONE|REG AIR|accounts wake ironic deposits. ironic +4384|1355|56|1|5|6281.75|0.09|0.01|A|F|1992-08-22|1992-08-24|1992-09-20|DELIVER IN PERSON|MAIL|instructions sleep. blithely express pa +4384|887|87|2|38|67939.44|0.07|0.06|A|F|1992-10-18|1992-09-24|1992-11-04|NONE|FOB|ly final requests. regu +4384|890|90|3|11|19699.79|0.05|0.04|R|F|1992-08-31|1992-10-04|1992-09-28|TAKE BACK RETURN|FOB|deposits promise carefully even, regular e +4385|1110|83|1|38|38422.18|0.00|0.02|N|O|1996-11-22|1996-10-30|1996-12-21|DELIVER IN PERSON|TRUCK|inal frays. final, bold exc +4386|1294|6|1|10|11952.90|0.05|0.07|N|O|1998-06-03|1998-04-16|1998-06-28|TAKE BACK RETURN|MAIL|gainst the quickly expre +4386|1171|8|2|28|30020.76|0.03|0.06|N|O|1998-03-19|1998-05-01|1998-03-27|NONE|FOB|. quick packages play slyly +4386|1397|74|3|4|5193.56|0.07|0.05|N|O|1998-04-07|1998-03-25|1998-04-19|COLLECT COD|FOB|ns wake carefully carefully iron +4386|1205|6|4|21|23230.20|0.09|0.00|N|O|1998-05-05|1998-03-19|1998-05-13|NONE|RAIL|e pending, sp +4386|1293|5|5|39|46577.31|0.09|0.06|N|O|1998-03-05|1998-03-15|1998-03-16|NONE|RAIL|structions cajole quickly express +4386|895|96|6|18|32326.02|0.02|0.05|N|O|1998-04-12|1998-04-09|1998-05-12|TAKE BACK RETURN|SHIP| deposits use according to the pending, +4386|199|26|7|16|17587.04|0.07|0.02|N|O|1998-05-05|1998-03-17|1998-06-03|COLLECT COD|AIR|e furiously final pint +4387|1218|30|1|3|3357.63|0.02|0.01|N|O|1996-01-17|1996-01-14|1996-01-28|COLLECT COD|AIR| boost slyly ironic instructions. furiou +4387|1769|96|2|48|80196.48|0.06|0.05|N|O|1995-10-29|1995-12-11|1995-11-01|NONE|REG AIR|sleep slyly. blithely sl +4387|17|43|3|15|13755.15|0.00|0.03|N|O|1996-01-11|1996-01-14|1996-01-30|TAKE BACK RETURN|REG AIR|s hinder quietly across the pla +4387|469|70|4|9|12325.14|0.00|0.03|N|O|1996-01-04|1995-12-26|1996-01-12|DELIVER IN PERSON|REG AIR|c ideas. slyly regular packages sol +4387|814|81|5|3|5144.43|0.05|0.08|N|O|1995-11-17|1995-12-28|1995-11-25|COLLECT COD|SHIP| pinto beans +4387|51|27|6|40|38042.00|0.02|0.04|N|O|1995-11-29|1995-12-10|1995-12-20|NONE|REG AIR|deas according to the blithely regular fox +4388|650|44|1|30|46519.50|0.02|0.07|N|O|1996-06-07|1996-05-07|1996-06-22|DELIVER IN PERSON|FOB|s cajole fluffil +4388|833|100|2|28|48547.24|0.05|0.04|N|O|1996-05-08|1996-06-20|1996-05-12|TAKE BACK RETURN|RAIL|ove the ide +4388|514|5|3|13|18388.63|0.07|0.05|N|O|1996-06-28|1996-05-23|1996-07-04|DELIVER IN PERSON|REG AIR|ly even, expre +4389|1568|49|1|20|29391.20|0.08|0.00|A|F|1994-06-06|1994-06-17|1994-06-17|DELIVER IN PERSON|SHIP|ng the carefully express d +4389|1529|50|2|13|18596.76|0.00|0.00|A|F|1994-08-18|1994-06-06|1994-08-20|NONE|RAIL|nal, regula +4389|781|14|3|39|65589.42|0.04|0.07|A|F|1994-06-08|1994-06-04|1994-06-10|TAKE BACK RETURN|TRUCK| unusual, final excuses cajole carefully +4389|1596|17|4|5|7487.95|0.09|0.00|A|F|1994-09-03|1994-06-23|1994-09-16|NONE|FOB| ironic request +4389|105|32|5|22|22112.20|0.08|0.00|R|F|1994-07-05|1994-06-12|1994-07-12|NONE|TRUCK|lly silent de +4389|15|16|6|22|20130.22|0.01|0.04|R|F|1994-06-07|1994-06-29|1994-06-19|COLLECT COD|TRUCK|at the final excuses hinder carefully a +4389|1841|42|7|4|6971.36|0.09|0.08|R|F|1994-06-14|1994-06-30|1994-07-06|NONE|REG AIR| blithely even d +4390|1512|53|1|35|49472.85|0.07|0.04|R|F|1995-05-30|1995-07-02|1995-06-15|DELIVER IN PERSON|TRUCK|ongside of the slyly regular ideas +4390|1951|96|2|28|51882.60|0.03|0.00|N|O|1995-09-07|1995-06-22|1995-10-05|COLLECT COD|SHIP|ld braids haggle atop the for +4390|1008|14|3|42|38178.00|0.05|0.08|A|F|1995-06-12|1995-07-16|1995-06-17|NONE|AIR|arefully even accoun +4390|972|75|4|32|59935.04|0.07|0.08|N|O|1995-09-15|1995-08-12|1995-10-05|TAKE BACK RETURN|TRUCK|ctions across +4391|1610|52|1|1|1511.61|0.09|0.00|R|F|1992-06-18|1992-04-27|1992-06-20|COLLECT COD|TRUCK|ong the silent deposits +4391|1870|100|2|45|79734.15|0.07|0.04|R|F|1992-04-01|1992-05-01|1992-04-13|TAKE BACK RETURN|TRUCK|ep quickly after +4416|940|9|1|37|68114.78|0.08|0.03|A|F|1992-10-23|1992-08-23|1992-11-16|COLLECT COD|RAIL|fluffily ironic +4416|890|91|2|3|5372.67|0.06|0.03|R|F|1992-10-22|1992-08-06|1992-11-13|DELIVER IN PERSON|SHIP| requests sleep along the +4416|87|63|3|45|44418.60|0.09|0.03|A|F|1992-10-16|1992-09-09|1992-10-28|COLLECT COD|AIR|the final pinto beans. special frets +4417|745|78|1|28|46080.72|0.08|0.02|N|O|1998-09-04|1998-10-04|1998-09-19|TAKE BACK RETURN|REG AIR|ies across the furious +4417|1808|95|2|1|1709.80|0.06|0.08|N|O|1998-10-23|1998-08-22|1998-10-24|NONE|REG AIR|press deposits promise stealthily amo +4417|978|81|3|35|65763.95|0.06|0.04|N|O|1998-08-08|1998-09-23|1998-09-02|DELIVER IN PERSON|FOB|slyly regular, silent courts. even packag +4418|348|77|1|32|39946.88|0.02|0.06|A|F|1993-05-28|1993-06-02|1993-05-30|TAKE BACK RETURN|RAIL|ly. bold pinto b +4418|220|2|2|14|15683.08|0.03|0.04|A|F|1993-05-20|1993-06-18|1993-06-05|TAKE BACK RETURN|SHIP| blithely regular requests. blith +4418|781|78|3|3|5045.34|0.00|0.02|R|F|1993-04-08|1993-06-04|1993-05-02|NONE|SHIP|luffily across the unusual ideas. reque +4419|1074|75|1|45|43878.15|0.01|0.05|N|O|1996-07-20|1996-09-07|1996-08-18|DELIVER IN PERSON|TRUCK|s doze sometimes fluffily regular a +4419|317|46|2|42|51127.02|0.00|0.03|N|O|1996-09-18|1996-07-25|1996-09-21|COLLECT COD|RAIL|sts. furious +4419|1318|95|3|6|7315.86|0.02|0.08|N|O|1996-06-25|1996-09-04|1996-07-20|DELIVER IN PERSON|AIR|ts wake slyly final dugou +4420|74|50|1|7|6818.49|0.07|0.03|R|F|1994-08-30|1994-09-03|1994-09-25|NONE|FOB| regular instructions sleep around +4421|976|79|1|37|69447.89|0.09|0.08|N|O|1997-07-22|1997-06-27|1997-07-25|DELIVER IN PERSON|SHIP|l accounts. ironic request +4421|554|15|2|46|66909.30|0.04|0.04|N|O|1997-04-21|1997-05-13|1997-05-15|DELIVER IN PERSON|FOB|reful packages. bold, +4421|1662|4|3|46|71928.36|0.00|0.06|N|O|1997-05-25|1997-05-21|1997-06-23|COLLECT COD|TRUCK|g dependenci +4421|1907|96|4|32|57884.80|0.06|0.04|N|O|1997-07-09|1997-06-03|1997-07-25|NONE|SHIP|ar ideas eat among the furiousl +4421|1900|1|5|32|57660.80|0.06|0.04|N|O|1997-07-28|1997-06-14|1997-08-13|NONE|REG AIR|uickly final pinto beans impress. bold +4421|466|54|6|44|60124.24|0.09|0.06|N|O|1997-06-17|1997-06-20|1997-06-29|NONE|TRUCK|le carefully. bl +4421|1154|27|7|18|18992.70|0.01|0.00|N|O|1997-06-07|1997-05-13|1997-06-10|DELIVER IN PERSON|FOB|. regular, s +4422|1346|61|1|5|6236.70|0.09|0.07|N|O|1995-07-17|1995-08-13|1995-07-25|NONE|SHIP|e furiously about t +4422|475|5|2|41|56394.27|0.08|0.05|N|F|1995-06-12|1995-07-09|1995-06-20|COLLECT COD|TRUCK| theodolites shal +4422|1024|30|3|39|36075.78|0.00|0.05|N|O|1995-09-02|1995-06-24|1995-09-14|NONE|TRUCK|en hockey players engage +4422|1522|23|4|4|5694.08|0.02|0.05|N|O|1995-09-18|1995-08-12|1995-10-18|COLLECT COD|FOB|cies along the bo +4422|797|62|5|20|33955.80|0.07|0.05|N|O|1995-08-17|1995-07-16|1995-09-13|DELIVER IN PERSON|RAIL|ructions wake slyly al +4423|1493|11|1|3|4183.47|0.03|0.00|A|F|1995-03-22|1995-04-06|1995-04-19|NONE|TRUCK| final theodolites nag after the bli +4423|596|57|2|2|2993.18|0.07|0.04|A|F|1995-03-04|1995-04-04|1995-03-08|TAKE BACK RETURN|REG AIR|old sheaves sleep +4448|516|77|1|24|33996.24|0.10|0.07|N|O|1998-09-09|1998-07-06|1998-09-27|DELIVER IN PERSON|SHIP|nal packages along the ironic instructi +4448|1887|31|2|13|23255.44|0.00|0.01|N|O|1998-07-26|1998-07-03|1998-08-14|COLLECT COD|MAIL|fluffily express accounts integrate furiou +4448|410|69|3|35|45864.35|0.10|0.06|N|O|1998-09-18|1998-07-27|1998-10-08|NONE|REG AIR|aggle carefully alongside of the q +4448|1402|3|4|3|3910.20|0.01|0.01|N|O|1998-07-20|1998-07-10|1998-08-07|DELIVER IN PERSON|TRUCK|ronic theod +4448|902|3|5|41|73918.90|0.00|0.08|N|O|1998-07-30|1998-08-09|1998-08-03|NONE|AIR|pon the permanently even excuses nag +4448|1715|16|6|12|19400.52|0.06|0.03|N|O|1998-08-21|1998-06-30|1998-09-09|COLLECT COD|RAIL|sits about the ironic, bu +4449|315|72|1|42|51043.02|0.10|0.07|N|O|1998-03-22|1998-05-09|1998-04-03|NONE|FOB| packages. blithely final +4449|1407|47|2|10|13084.00|0.02|0.03|N|O|1998-05-09|1998-05-04|1998-05-15|NONE|SHIP|ccounts alongside of the platelets integr +4450|1732|33|1|44|71884.12|0.10|0.00|N|O|1997-10-12|1997-10-13|1997-10-29|DELIVER IN PERSON|RAIL| the slyly eve +4450|148|49|2|9|9433.26|0.03|0.03|N|O|1997-08-13|1997-08-16|1997-08-15|NONE|FOB|gular requests cajole carefully. regular c +4450|955|90|3|45|83517.75|0.08|0.01|N|O|1997-09-01|1997-10-06|1997-09-19|NONE|TRUCK|express ideas are furiously regular +4450|620|83|4|13|19768.06|0.00|0.00|N|O|1997-08-26|1997-09-18|1997-09-20|COLLECT COD|MAIL| brave foxes. slyly unusual +4450|551|52|5|6|8709.30|0.09|0.01|N|O|1997-09-02|1997-09-30|1997-09-09|NONE|FOB|eposits. foxes cajole unusual fox +4451|1631|32|1|40|61305.20|0.03|0.03|A|F|1994-11-18|1994-12-25|1994-11-26|DELIVER IN PERSON|RAIL|y. slyly special deposits are sly +4451|623|24|2|34|51803.08|0.10|0.02|A|F|1994-11-30|1994-12-04|1994-12-13|COLLECT COD|SHIP| regular ideas. +4451|1586|87|3|19|28264.02|0.05|0.06|R|F|1994-10-09|1994-11-26|1994-10-23|COLLECT COD|FOB|ly after the fluffi +4452|1135|72|1|21|21758.73|0.07|0.03|R|F|1994-10-06|1994-08-23|1994-10-15|COLLECT COD|TRUCK|multipliers x-ray carefully in place of +4452|2|78|2|47|42394.00|0.01|0.06|A|F|1994-10-08|1994-08-09|1994-10-09|TAKE BACK RETURN|TRUCK|ts. slyly regular cour +4453|1470|49|1|41|56230.27|0.00|0.08|N|O|1997-07-17|1997-05-15|1997-07-31|NONE|REG AIR|anent theodolites are slyly except t +4453|1328|29|2|16|19669.12|0.03|0.00|N|O|1997-07-22|1997-05-05|1997-08-03|COLLECT COD|FOB|ar excuses nag quickly even accounts. b +4453|619|13|3|48|72941.28|0.02|0.07|N|O|1997-05-29|1997-06-24|1997-06-03|NONE|SHIP|eep. fluffily express accounts at the furi +4453|1018|54|4|26|23894.26|0.06|0.07|N|O|1997-05-07|1997-06-07|1997-05-22|NONE|TRUCK|express packages are +4454|1509|50|1|20|28210.00|0.10|0.08|R|F|1994-05-06|1994-03-17|1994-05-20|COLLECT COD|SHIP|lar theodolites. even instructio +4454|1511|52|2|22|31075.22|0.06|0.02|A|F|1994-02-06|1994-04-11|1994-03-06|DELIVER IN PERSON|RAIL|ully. carefully final accounts accordi +4454|1916|17|3|45|81805.95|0.07|0.04|A|F|1994-03-29|1994-03-26|1994-04-04|TAKE BACK RETURN|RAIL|ests promise. packages print fur +4454|14|15|4|1|914.01|0.09|0.05|A|F|1994-02-05|1994-04-19|1994-02-12|COLLECT COD|RAIL|equests run. +4454|511|2|5|48|67752.48|0.00|0.07|R|F|1994-04-23|1994-04-03|1994-04-26|COLLECT COD|FOB|to beans wake across th +4454|1597|38|6|20|29971.80|0.10|0.03|A|F|1994-04-08|1994-03-06|1994-04-26|DELIVER IN PERSON|TRUCK|quickly regular requests. furiously +4455|698|92|1|20|31973.80|0.01|0.05|A|F|1994-01-31|1993-11-21|1994-03-02|DELIVER IN PERSON|MAIL| express packages. packages boost quickly +4455|1526|27|2|47|67093.44|0.09|0.01|R|F|1994-01-01|1993-12-25|1994-01-05|COLLECT COD|FOB| requests. even, even accou +4455|1228|3|3|34|38393.48|0.00|0.06|A|F|1993-10-24|1993-11-27|1993-11-04|TAKE BACK RETURN|AIR| slyly ironic requests. quickly even d +4480|1079|85|1|30|29402.10|0.08|0.03|R|F|1994-07-29|1994-06-22|1994-08-01|NONE|FOB|ven braids us +4481|240|68|1|50|57012.00|0.02|0.06|N|O|1996-07-22|1996-05-13|1996-08-14|DELIVER IN PERSON|RAIL|ar packages. regula +4481|1891|35|2|27|48408.03|0.02|0.03|N|O|1996-04-06|1996-05-17|1996-04-12|TAKE BACK RETURN|AIR|ackages haggle even, +4482|709|10|1|32|51510.40|0.06|0.03|A|F|1995-05-16|1995-07-22|1995-06-07|NONE|RAIL| quickly pendin +4482|952|21|2|32|59294.40|0.01|0.06|N|O|1995-08-16|1995-06-26|1995-09-10|DELIVER IN PERSON|AIR|eans wake according +4483|52|53|1|32|30465.60|0.07|0.07|R|F|1992-04-05|1992-05-25|1992-04-08|DELIVER IN PERSON|MAIL|ests haggle. slyl +4483|619|51|2|50|75980.50|0.01|0.06|A|F|1992-06-19|1992-05-12|1992-07-08|DELIVER IN PERSON|TRUCK|ag blithely even +4483|84|35|3|50|49204.00|0.00|0.04|R|F|1992-06-10|1992-04-18|1992-06-17|DELIVER IN PERSON|MAIL|ackages. furiously ironi +4484|948|51|1|4|7395.76|0.06|0.03|N|O|1997-04-09|1997-02-11|1997-04-12|TAKE BACK RETURN|TRUCK|packages de +4484|1369|70|2|39|49544.04|0.05|0.02|N|O|1997-04-01|1997-01-26|1997-04-21|NONE|RAIL|onic accounts wake blithel +4484|1900|1|3|38|68472.20|0.06|0.07|N|O|1997-03-07|1997-01-31|1997-04-01|COLLECT COD|REG AIR|. even requests un +4484|1212|24|4|41|45641.61|0.06|0.03|N|O|1997-01-25|1997-02-15|1997-01-29|TAKE BACK RETURN|REG AIR|ress accounts. ironic deposits unwind fur +4484|26|27|5|42|38892.84|0.03|0.07|N|O|1997-03-25|1997-02-21|1997-04-05|DELIVER IN PERSON|REG AIR|ding, pending requests wake. fluffily +4484|356|57|6|29|36434.15|0.09|0.06|N|O|1996-12-27|1997-03-10|1997-01-13|NONE|FOB| wake blithely ironic +4484|1023|94|7|50|46201.00|0.07|0.01|N|O|1997-03-17|1997-03-16|1997-03-21|COLLECT COD|FOB|the ironic, final theodo +4485|1907|40|1|1|1808.90|0.03|0.05|R|F|1994-12-04|1995-02-07|1994-12-09|NONE|AIR|play according to the ironic, ironic +4485|1401|19|2|46|59910.40|0.04|0.06|R|F|1995-03-09|1994-12-14|1995-03-23|DELIVER IN PERSON|AIR|. ironic foxes haggle. regular war +4485|1747|48|3|43|70895.82|0.01|0.05|R|F|1995-01-17|1995-02-11|1995-02-07|DELIVER IN PERSON|TRUCK|al accounts according to the slyly r +4485|1431|32|4|43|57294.49|0.08|0.06|R|F|1995-01-28|1995-01-26|1995-02-07|DELIVER IN PERSON|AIR|. blithely +4485|51|52|5|47|44699.35|0.08|0.04|R|F|1995-03-11|1995-01-11|1995-03-21|TAKE BACK RETURN|RAIL|luffily pending acc +4486|1343|82|1|46|57239.64|0.08|0.00|N|O|1998-05-02|1998-04-05|1998-05-08|COLLECT COD|MAIL|ackages. specia +4486|488|47|2|19|26381.12|0.10|0.01|N|O|1998-06-07|1998-05-28|1998-07-02|NONE|MAIL|pending foxes after +4486|952|53|3|47|87088.65|0.02|0.07|N|O|1998-04-09|1998-05-24|1998-05-07|DELIVER IN PERSON|MAIL|ts around the quiet packages ar +4486|901|70|4|28|50453.20|0.07|0.02|N|O|1998-04-21|1998-04-19|1998-04-26|TAKE BACK RETURN|AIR|to the furious, regular foxes play abov +4487|1372|11|1|37|47114.69|0.03|0.07|R|F|1993-02-28|1993-04-18|1993-03-17|TAKE BACK RETURN|MAIL|bove the fu +4487|1129|2|2|49|50475.88|0.10|0.00|R|F|1993-06-13|1993-05-08|1993-07-10|COLLECT COD|FOB|sual packages should ha +4487|1896|40|3|1|1797.89|0.02|0.07|A|F|1993-05-11|1993-05-23|1993-05-17|TAKE BACK RETURN|FOB|ithely final asym +4487|929|30|4|25|45748.00|0.07|0.03|A|F|1993-03-09|1993-04-27|1993-03-30|COLLECT COD|RAIL|g the final instructions. slyly c +4512|1613|55|1|30|45438.30|0.07|0.07|N|O|1996-01-28|1995-12-22|1996-02-22|TAKE BACK RETURN|TRUCK|ly unusual package +4512|410|69|2|24|31449.84|0.04|0.06|N|O|1995-12-16|1996-01-16|1995-12-25|NONE|SHIP|ly regular pinto beans. carefully bold depo +4512|1450|29|3|21|28380.45|0.00|0.00|N|O|1995-10-31|1995-12-30|1995-11-15|NONE|REG AIR|lly unusual pinto b +4512|1403|4|4|32|41740.80|0.10|0.01|N|O|1995-11-25|1995-12-28|1995-12-06|NONE|FOB|counts are against the quickly regular +4512|1330|7|5|43|52947.19|0.06|0.00|N|O|1995-12-20|1995-11-28|1996-01-14|NONE|AIR|are carefully. theodolites wake +4513|1691|92|1|29|46188.01|0.03|0.01|N|O|1996-05-18|1996-05-23|1996-06-08|NONE|REG AIR|cajole. regular packages boost. s +4513|700|32|2|39|62427.30|0.01|0.04|N|O|1996-06-25|1996-05-14|1996-07-24|NONE|MAIL|slyly furiously unusual deposits. blit +4513|1374|89|3|34|43362.58|0.00|0.03|N|O|1996-03-27|1996-06-12|1996-04-06|DELIVER IN PERSON|SHIP|sits. quickly even instructions +4513|1914|47|4|13|23606.83|0.08|0.08|N|O|1996-04-12|1996-05-19|1996-04-25|DELIVER IN PERSON|AIR|l, final excuses detect furi +4514|1637|61|1|27|41543.01|0.06|0.06|R|F|1994-07-01|1994-07-13|1994-07-26|COLLECT COD|AIR| even, silent foxes be +4514|452|82|2|15|20286.75|0.10|0.04|R|F|1994-08-24|1994-07-11|1994-09-14|DELIVER IN PERSON|RAIL|! unusual, special deposits afte +4514|775|8|3|10|16757.70|0.09|0.05|A|F|1994-06-19|1994-06-25|1994-07-01|COLLECT COD|SHIP|ake furiously. carefully regular requests +4514|808|42|4|9|15379.20|0.10|0.03|A|F|1994-08-04|1994-07-01|1994-09-01|DELIVER IN PERSON|REG AIR|wly. quick +4514|1487|5|5|12|16661.76|0.02|0.03|R|F|1994-08-20|1994-06-09|1994-09-15|TAKE BACK RETURN|FOB| carefully ironic foxes nag caref +4514|1888|89|6|38|68015.44|0.03|0.05|A|F|1994-07-28|1994-07-06|1994-08-25|NONE|AIR|ending excuses. sl +4514|1765|66|7|27|45002.52|0.04|0.06|A|F|1994-06-24|1994-07-14|1994-06-30|TAKE BACK RETURN|TRUCK|. slyly sile +4515|381|82|1|15|19220.70|0.06|0.01|R|F|1992-05-26|1992-05-25|1992-06-03|NONE|SHIP|posits wake +4515|1021|27|2|50|46101.00|0.06|0.03|A|F|1992-03-28|1992-05-16|1992-04-20|NONE|AIR|ding instructions again +4515|1533|54|3|27|38732.31|0.09|0.01|A|F|1992-06-06|1992-06-08|1992-06-07|DELIVER IN PERSON|REG AIR| against the even re +4515|539|40|4|32|46064.96|0.06|0.03|R|F|1992-04-07|1992-05-11|1992-04-09|COLLECT COD|MAIL|carefully express depo +4515|447|6|5|22|29643.68|0.09|0.07|A|F|1992-07-16|1992-05-07|1992-07-23|NONE|SHIP|le quickly above the even, bold ideas. +4515|1800|27|6|23|39141.40|0.04|0.00|R|F|1992-05-23|1992-06-15|1992-06-20|TAKE BACK RETURN|FOB|ns. bold r +4516|1696|38|1|34|54321.46|0.05|0.04|A|F|1994-05-16|1994-06-23|1994-06-12|NONE|SHIP|even pinto beans wake qui +4517|426|27|1|50|66321.00|0.01|0.02|N|O|1998-06-08|1998-04-18|1998-06-20|DELIVER IN PERSON|MAIL|refully pending acco +4518|1438|17|1|9|12054.87|0.09|0.04|N|O|1997-06-26|1997-07-07|1997-07-10|NONE|RAIL| pending deposits. slyly re +4518|441|42|2|19|25487.36|0.10|0.05|N|O|1997-08-09|1997-06-06|1997-08-27|COLLECT COD|RAIL|ter the slyly bo +4519|547|78|1|30|43426.20|0.09|0.07|R|F|1993-04-11|1993-06-05|1993-04-22|DELIVER IN PERSON|REG AIR|totes. slyly bold somas after the +4519|1901|46|2|37|66707.30|0.06|0.08|R|F|1993-07-22|1993-06-16|1993-08-19|COLLECT COD|AIR|ly slyly furious depth +4544|1307|46|1|40|48332.00|0.07|0.01|N|O|1997-08-15|1997-10-16|1997-08-20|DELIVER IN PERSON|RAIL| detect slyly. evenly pending instru +4544|1711|54|2|19|30641.49|0.08|0.01|N|O|1997-08-14|1997-09-08|1997-08-25|NONE|SHIP|regular ideas are furiously about +4544|707|4|3|20|32154.00|0.02|0.07|N|O|1997-10-12|1997-10-11|1997-10-13|COLLECT COD|REG AIR| waters about the +4544|506|67|4|39|54853.50|0.07|0.05|N|O|1997-08-20|1997-09-07|1997-08-27|COLLECT COD|REG AIR|ular packages. s +4544|1323|100|5|31|37953.92|0.09|0.03|N|O|1997-08-09|1997-09-29|1997-08-17|COLLECT COD|TRUCK|dolites detect quickly reg +4544|261|62|6|8|9290.08|0.10|0.03|N|O|1997-10-13|1997-10-06|1997-10-25|COLLECT COD|AIR|olites. fi +4545|1729|56|1|38|61967.36|0.06|0.06|R|F|1993-01-27|1993-03-01|1993-02-04|NONE|TRUCK|nts serve according to th +4545|625|26|2|27|41191.74|0.01|0.06|R|F|1993-02-07|1993-02-18|1993-02-18|NONE|FOB|ously bold asymptotes! blithely pen +4545|862|62|3|9|15865.74|0.10|0.06|R|F|1993-03-20|1993-02-23|1993-04-11|TAKE BACK RETURN|AIR|xpress accounts +4545|640|34|4|2|3081.28|0.10|0.00|R|F|1993-04-16|1993-04-17|1993-05-03|NONE|REG AIR|ages use. slyly even i +4545|1168|5|5|27|28867.32|0.08|0.05|A|F|1993-03-18|1993-02-22|1993-03-23|NONE|RAIL|ccounts haggle carefully. deposits +4545|1087|23|6|8|7904.64|0.03|0.02|A|F|1993-05-01|1993-03-12|1993-05-15|NONE|FOB| boost slyly. slyly +4545|84|10|7|36|35426.88|0.10|0.04|R|F|1993-01-28|1993-03-30|1993-02-04|DELIVER IN PERSON|SHIP|sublate slyly. furiously ironic accounts b +4546|1325|2|1|10|12263.20|0.09|0.02|N|O|1995-09-23|1995-10-10|1995-10-23|COLLECT COD|TRUCK|osits alongside of the +4546|1704|89|2|15|24085.50|0.04|0.07|N|O|1995-07-31|1995-10-17|1995-08-06|NONE|REG AIR|ught to cajole furiously. qu +4546|770|71|3|4|6683.08|0.06|0.08|N|O|1995-08-14|1995-10-07|1995-08-16|COLLECT COD|MAIL|kly pending dependencies along the furio +4546|1488|28|4|10|13894.80|0.08|0.02|N|O|1995-09-02|1995-09-16|1995-09-10|DELIVER IN PERSON|FOB|above the enticingly ironic dependencies +4547|1878|22|1|15|26698.05|0.10|0.04|A|F|1993-12-08|1993-11-15|1993-12-22|NONE|REG AIR|ets haggle. regular dinos affix fu +4547|1152|89|2|7|7372.05|0.10|0.02|A|F|1993-09-04|1993-09-29|1993-09-20|COLLECT COD|RAIL|slyly express a +4547|450|80|3|15|20256.75|0.00|0.00|R|F|1993-11-18|1993-10-06|1993-12-13|NONE|TRUCK|e carefully across the unus +4547|1471|89|4|15|20587.05|0.05|0.08|R|F|1993-11-29|1993-10-12|1993-12-29|COLLECT COD|REG AIR|ironic gifts integrate +4548|133|60|1|21|21695.73|0.10|0.05|N|O|1996-07-11|1996-09-04|1996-07-30|COLLECT COD|REG AIR|pecial theodoli +4548|461|20|2|17|23144.82|0.00|0.08|N|O|1996-07-23|1996-09-21|1996-07-26|DELIVER IN PERSON|REG AIR|y ironic requests above the fluffily d +4548|1228|3|3|47|53073.34|0.05|0.04|N|O|1996-07-24|1996-09-12|1996-08-08|NONE|MAIL|ts. excuses use slyly spec +4548|1764|49|4|22|36646.72|0.07|0.01|N|O|1996-07-06|1996-08-23|1996-07-15|DELIVER IN PERSON|RAIL|s. furiously ironic theodolites c +4548|446|34|5|36|48471.84|0.04|0.06|N|O|1996-08-19|1996-09-12|1996-09-08|COLLECT COD|FOB|tions integrat +4549|1581|2|1|44|65233.52|0.08|0.00|N|O|1998-03-13|1998-04-15|1998-03-27|TAKE BACK RETURN|TRUCK|ding to the regular, silent requests +4549|881|15|2|1|1781.88|0.05|0.08|N|O|1998-05-04|1998-04-11|1998-05-14|TAKE BACK RETURN|AIR| requests wake. furiously even +4550|1491|31|1|9|12532.41|0.05|0.06|R|F|1995-04-19|1995-02-07|1995-04-24|COLLECT COD|SHIP|l dependencies boost slyly after th +4550|656|88|2|19|29576.35|0.06|0.04|A|F|1995-01-01|1995-02-13|1995-01-20|NONE|AIR|quests. express +4551|105|84|1|6|6030.60|0.08|0.08|N|O|1996-05-18|1996-04-23|1996-06-13|DELIVER IN PERSON|TRUCK|fily silent fo +4551|1781|66|2|26|43752.28|0.02|0.04|N|O|1996-04-14|1996-04-26|1996-04-17|TAKE BACK RETURN|RAIL|le. carefully dogged accounts use furiousl +4551|218|73|3|22|24600.62|0.08|0.01|N|O|1996-05-12|1996-03-17|1996-05-29|TAKE BACK RETURN|REG AIR|ly ironic reques +4551|1977|22|4|27|50732.19|0.00|0.01|N|O|1996-04-28|1996-03-22|1996-05-22|TAKE BACK RETURN|RAIL|y along the slyly even +4576|896|97|1|5|8984.45|0.09|0.03|N|O|1996-08-23|1996-11-08|1996-09-20|TAKE BACK RETURN|AIR|ly express, special asymptote +4576|580|81|2|43|63664.94|0.08|0.06|N|O|1996-10-24|1996-09-23|1996-11-10|NONE|SHIP|ly final deposits. never +4576|414|2|3|14|18401.74|0.09|0.01|N|O|1996-09-12|1996-09-30|1996-09-24|COLLECT COD|MAIL|detect slyly. +4577|1841|85|1|43|74942.12|0.01|0.03|N|O|1998-06-16|1998-07-09|1998-06-17|TAKE BACK RETURN|AIR|packages. +4577|1770|55|2|43|71886.11|0.05|0.03|N|O|1998-08-24|1998-06-02|1998-09-14|TAKE BACK RETURN|RAIL|ly accounts. carefully +4577|685|48|3|12|19028.16|0.07|0.05|N|O|1998-07-29|1998-06-17|1998-08-04|DELIVER IN PERSON|TRUCK|equests alongsi +4578|732|29|1|10|16327.30|0.09|0.06|R|F|1993-01-01|1992-11-19|1993-01-28|TAKE BACK RETURN|REG AIR|uests. blithely unus +4578|1684|85|2|42|66598.56|0.06|0.00|R|F|1993-01-05|1992-11-06|1993-01-13|DELIVER IN PERSON|FOB|s are caref +4578|1785|70|3|15|25301.70|0.01|0.01|R|F|1992-10-23|1992-11-22|1992-11-09|DELIVER IN PERSON|REG AIR|gular theodo +4578|1387|64|4|7|9018.66|0.09|0.08|A|F|1992-12-07|1992-11-27|1993-01-05|TAKE BACK RETURN|SHIP|odolites. carefully unusual ideas accor +4578|1624|66|5|20|30512.40|0.04|0.02|A|F|1993-01-11|1992-11-09|1993-01-23|TAKE BACK RETURN|RAIL|iously pending theodolites-- +4579|1741|26|1|14|22998.36|0.02|0.02|N|O|1996-02-01|1996-01-08|1996-02-08|TAKE BACK RETURN|MAIL|nding theodolites. fluffil +4579|419|20|2|28|36943.48|0.02|0.05|N|O|1996-01-22|1996-02-13|1996-02-03|DELIVER IN PERSON|RAIL|slyly across the +4579|1775|76|3|34|57010.18|0.05|0.02|N|O|1996-02-26|1996-02-22|1996-03-16|COLLECT COD|MAIL|hely. carefully blithe dependen +4579|1196|97|4|8|8777.52|0.05|0.06|N|O|1995-12-16|1996-01-15|1995-12-18|TAKE BACK RETURN|AIR|posits. carefully perman +4580|911|80|1|22|39862.02|0.01|0.05|A|F|1994-01-16|1994-01-26|1994-02-05|COLLECT COD|AIR|nticingly final packag +4580|319|76|2|10|12193.10|0.05|0.04|R|F|1993-12-20|1993-12-30|1994-01-17|COLLECT COD|RAIL|gular, pending deposits. fina +4580|10|86|3|41|37310.41|0.00|0.07|R|F|1993-12-13|1994-01-31|1994-01-06|NONE|SHIP|requests. quickly silent asymptotes sle +4580|1778|21|4|5|8398.85|0.07|0.00|A|F|1994-01-28|1993-12-17|1994-02-22|NONE|TRUCK|o beans. f +4580|1889|33|5|39|69844.32|0.03|0.02|R|F|1993-12-28|1993-12-26|1994-01-23|NONE|RAIL|. fluffily final dolphins use furiously al +4581|1650|92|1|37|57411.05|0.01|0.04|A|F|1992-10-17|1992-11-05|1992-11-04|DELIVER IN PERSON|MAIL|e the blithely bold pearls ha +4581|497|56|2|7|9782.43|0.01|0.02|A|F|1992-10-09|1992-10-20|1992-10-21|TAKE BACK RETURN|MAIL|express accounts d +4581|206|61|3|46|50885.20|0.04|0.04|A|F|1992-09-09|1992-11-27|1992-09-26|NONE|REG AIR|nag toward the carefully final accounts. +4582|1915|4|1|17|30887.47|0.09|0.08|N|O|1996-08-17|1996-08-26|1996-08-20|COLLECT COD|REG AIR|ng packages. depo +4583|1405|6|1|17|22208.80|0.01|0.05|A|F|1994-11-08|1994-11-03|1994-11-29|COLLECT COD|MAIL|romise. reques +4583|1866|67|2|43|76017.98|0.04|0.04|A|F|1994-10-30|1994-12-17|1994-11-16|COLLECT COD|RAIL|fully after the speci +4583|1956|89|3|28|52022.60|0.00|0.07|A|F|1994-10-29|1994-11-21|1994-11-28|NONE|SHIP|to beans haggle sly +4583|1722|23|4|27|43840.44|0.08|0.03|R|F|1995-01-11|1994-12-24|1995-02-10|DELIVER IN PERSON|TRUCK| detect silent requests. furiously speci +4583|1838|25|5|36|62633.88|0.09|0.06|A|F|1995-01-06|1994-11-25|1995-01-29|DELIVER IN PERSON|RAIL|ar requests haggle after the furiously +4583|1218|56|6|14|15668.94|0.09|0.01|R|F|1994-11-17|1994-11-08|1994-11-21|DELIVER IN PERSON|AIR|detect. doggedly regular pi +4583|869|36|7|32|56635.52|0.04|0.00|A|F|1995-01-13|1994-10-29|1995-02-08|TAKE BACK RETURN|RAIL|across the pinto beans-- quickly +4608|1723|50|1|30|48741.60|0.08|0.05|R|F|1994-10-08|1994-07-18|1994-10-25|DELIVER IN PERSON|SHIP|s cajole. slyly +4608|463|64|2|50|68173.00|0.06|0.01|A|F|1994-07-25|1994-09-01|1994-08-10|NONE|FOB| theodolites +4608|782|15|3|50|84139.00|0.03|0.01|A|F|1994-08-04|1994-09-10|1994-08-13|COLLECT COD|TRUCK| wake closely. even decoys haggle above +4608|306|7|4|36|43426.80|0.05|0.06|R|F|1994-10-04|1994-08-02|1994-10-21|COLLECT COD|FOB|ages wake quickly slyly iron +4609|465|53|1|28|38232.88|0.10|0.05|N|O|1997-02-02|1997-02-17|1997-03-02|DELIVER IN PERSON|REG AIR|ously. quickly final requests cajole fl +4609|1844|88|2|3|5237.52|0.09|0.03|N|O|1996-12-28|1997-02-06|1997-01-20|NONE|FOB|nstructions. furious instructions +4609|224|25|3|46|51714.12|0.05|0.05|N|O|1997-02-11|1997-01-16|1997-03-07|NONE|FOB|r foxes. fluffily ironic ideas ha +4610|862|29|1|21|37020.06|0.07|0.07|R|F|1993-08-10|1993-08-05|1993-08-27|NONE|REG AIR|ly special theodolites. even, +4610|1749|92|2|14|23110.36|0.00|0.07|R|F|1993-07-28|1993-07-25|1993-07-31|TAKE BACK RETURN|SHIP| ironic frays. dependencies detect blithel +4610|1584|5|3|44|65365.52|0.05|0.03|A|F|1993-08-05|1993-07-20|1993-08-19|COLLECT COD|TRUCK| final theodolites +4610|746|43|4|26|42815.24|0.06|0.03|R|F|1993-07-01|1993-07-19|1993-07-19|NONE|MAIL| to the fluffily ironic requests h +4610|1462|63|5|29|39540.34|0.08|0.04|R|F|1993-08-09|1993-07-27|1993-08-16|DELIVER IN PERSON|AIR| foxes. special, express package +4611|513|74|1|47|66434.97|0.09|0.06|A|F|1993-03-05|1993-03-01|1993-03-17|COLLECT COD|TRUCK|iously. furiously regular +4611|349|50|2|31|38729.54|0.04|0.02|A|F|1993-01-28|1993-02-14|1993-01-29|TAKE BACK RETURN|AIR| final pinto beans. permanent, sp +4611|817|18|3|50|85890.50|0.08|0.01|R|F|1993-01-22|1993-03-30|1993-02-16|TAKE BACK RETURN|AIR|l platelets. +4611|705|2|4|48|77073.60|0.02|0.08|R|F|1993-02-28|1993-02-12|1993-03-01|COLLECT COD|AIR|ular accounts +4612|60|86|1|20|19201.20|0.02|0.03|R|F|1993-09-24|1993-12-18|1993-10-22|NONE|AIR|beans sleep blithely iro +4612|498|28|2|17|23774.33|0.10|0.06|A|F|1994-01-09|1993-11-08|1994-02-06|TAKE BACK RETURN|REG AIR|equests haggle carefully silent excus +4612|1364|41|3|40|50614.40|0.08|0.01|R|F|1993-10-08|1993-11-23|1993-10-24|DELIVER IN PERSON|RAIL|special platelets. +4612|1847|91|4|10|17488.40|0.10|0.06|A|F|1993-11-11|1993-11-19|1993-11-13|TAKE BACK RETURN|SHIP|unusual theodol +4613|374|75|1|17|21664.29|0.09|0.07|N|O|1998-06-07|1998-05-11|1998-06-29|DELIVER IN PERSON|SHIP|liers cajole a +4613|1079|15|2|25|24501.75|0.05|0.04|N|O|1998-05-22|1998-04-11|1998-05-27|TAKE BACK RETURN|SHIP|y pending platelets x-ray ironically! pend +4613|1737|22|3|15|24580.95|0.10|0.02|N|O|1998-05-31|1998-04-16|1998-06-25|DELIVER IN PERSON|MAIL|against the quickly r +4613|72|98|4|36|34994.52|0.04|0.01|N|O|1998-04-22|1998-05-05|1998-05-04|DELIVER IN PERSON|AIR|gainst the furiously ironic +4613|1102|75|5|35|35108.50|0.04|0.06|N|O|1998-06-04|1998-04-17|1998-06-20|COLLECT COD|MAIL|e blithely against the even, bold pi +4613|1959|4|6|47|87464.65|0.04|0.04|N|O|1998-07-03|1998-05-26|1998-07-09|NONE|FOB|uriously special requests wak +4613|1188|25|7|39|42478.02|0.09|0.05|N|O|1998-06-12|1998-06-01|1998-07-06|DELIVER IN PERSON|REG AIR|ously express +4614|61|12|1|19|18260.14|0.09|0.08|N|O|1996-05-17|1996-06-21|1996-06-08|TAKE BACK RETURN|AIR|ix. carefully regular +4614|647|48|2|3|4642.92|0.08|0.01|N|O|1996-07-22|1996-07-21|1996-08-07|NONE|MAIL|ions engage final, ironic +4614|72|98|3|36|34994.52|0.10|0.04|N|O|1996-07-05|1996-06-26|1996-07-07|NONE|REG AIR|onic foxes affix furi +4614|1251|63|4|6|6913.50|0.09|0.01|N|O|1996-06-11|1996-05-30|1996-07-03|COLLECT COD|REG AIR|ake quickly quickly regular epitap +4614|721|54|5|24|38921.28|0.07|0.06|N|O|1996-07-01|1996-06-24|1996-07-08|COLLECT COD|REG AIR|regular, even +4614|332|33|6|32|39434.56|0.10|0.05|N|O|1996-08-21|1996-05-28|1996-09-16|NONE|REG AIR|ickly furio +4614|1271|83|7|41|48063.07|0.01|0.07|N|O|1996-07-31|1996-07-12|1996-08-16|COLLECT COD|REG AIR|ackages haggle carefully about the even, b +4615|913|48|1|10|18139.10|0.02|0.08|A|F|1993-11-20|1993-10-05|1993-12-08|DELIVER IN PERSON|AIR|sits. slyly express deposits are +4640|875|75|1|5|8879.35|0.03|0.08|N|O|1996-02-05|1996-02-14|1996-02-15|TAKE BACK RETURN|RAIL| warthogs against the regular +4640|873|73|2|9|15964.83|0.03|0.05|N|O|1996-02-12|1996-02-14|1996-02-29|DELIVER IN PERSON|AIR| accounts. unu +4640|263|45|3|18|20938.68|0.02|0.07|N|O|1996-02-28|1996-03-06|1996-03-28|DELIVER IN PERSON|RAIL|boost furiously accord +4640|224|79|4|36|40471.92|0.06|0.08|N|O|1996-01-03|1996-03-09|1996-01-11|DELIVER IN PERSON|RAIL|iously furious accounts boost. carefully +4640|1560|41|5|15|21923.40|0.03|0.02|N|O|1996-03-19|1996-02-09|1996-04-11|TAKE BACK RETURN|FOB|y regular instructions doze furiously. reg +4641|1898|28|1|45|80995.05|0.07|0.03|R|F|1993-05-11|1993-04-19|1993-05-21|DELIVER IN PERSON|MAIL| about the close +4641|943|78|2|39|71913.66|0.06|0.00|R|F|1993-02-10|1993-03-06|1993-02-15|TAKE BACK RETURN|REG AIR| the bold reque +4641|353|54|3|15|18800.25|0.01|0.08|R|F|1993-01-25|1993-04-09|1993-02-05|TAKE BACK RETURN|AIR|s. carefully even exc +4642|1932|21|1|11|20173.23|0.04|0.07|A|F|1995-05-23|1995-04-26|1995-06-04|COLLECT COD|TRUCK|lithely express asympt +4642|1796|39|2|34|57724.86|0.04|0.07|R|F|1995-04-01|1995-05-11|1995-04-23|COLLECT COD|SHIP|theodolites detect among the ironically sp +4642|202|3|3|10|11022.00|0.04|0.02|R|F|1995-04-16|1995-04-28|1995-04-24|COLLECT COD|RAIL|urts. even deposits nag beneath +4642|937|6|4|18|33082.74|0.00|0.04|N|F|1995-06-16|1995-04-16|1995-06-21|NONE|TRUCK|ily pending accounts hag +4642|1790|91|5|41|69363.39|0.10|0.00|R|F|1995-04-08|1995-04-13|1995-05-01|DELIVER IN PERSON|MAIL|s are blithely. requests wake above the fur +4643|1850|80|1|50|87592.50|0.08|0.05|N|O|1995-09-11|1995-08-13|1995-09-30|DELIVER IN PERSON|SHIP|. ironic deposits cajo +4644|1769|12|1|4|6683.04|0.06|0.03|N|O|1998-05-06|1998-03-19|1998-05-28|NONE|MAIL|gular requests? pendi +4644|966|67|2|16|29871.36|0.03|0.04|N|O|1998-03-13|1998-02-21|1998-04-03|COLLECT COD|SHIP|lar excuses across the +4644|1144|81|3|10|10451.40|0.02|0.02|N|O|1998-02-21|1998-02-28|1998-03-19|COLLECT COD|REG AIR|osits according to the +4644|1540|81|4|45|64869.30|0.10|0.07|N|O|1998-02-02|1998-04-08|1998-02-15|COLLECT COD|SHIP| carefully a +4644|867|67|5|10|17678.60|0.08|0.08|N|O|1998-03-12|1998-03-11|1998-03-19|TAKE BACK RETURN|REG AIR| the slow, final fo +4645|494|24|1|45|62752.05|0.09|0.05|A|F|1994-12-27|1994-11-02|1994-12-31|DELIVER IN PERSON|AIR|ular ideas. slyly +4645|651|52|2|32|49652.80|0.10|0.08|A|F|1994-11-17|1994-10-30|1994-11-18|COLLECT COD|REG AIR| final accounts alongside +4645|536|37|3|25|35913.25|0.03|0.00|R|F|1994-10-25|1994-12-11|1994-11-14|NONE|REG AIR|braids. ironic dependencies main +4645|367|24|4|42|53229.12|0.10|0.02|R|F|1994-12-02|1994-12-18|1994-12-16|COLLECT COD|TRUCK|regular pinto beans amon +4645|1601|43|5|35|52591.00|0.03|0.07|A|F|1994-12-08|1994-11-25|1994-12-09|TAKE BACK RETURN|FOB|sias believe bl +4645|415|45|6|27|35516.07|0.09|0.08|R|F|1994-11-26|1994-10-25|1994-12-04|NONE|SHIP|ously express pinto beans. ironic depos +4645|302|3|7|42|50496.60|0.10|0.06|A|F|1994-12-31|1994-10-22|1995-01-28|DELIVER IN PERSON|AIR|e slyly regular pinto beans. thin +4646|1902|47|1|24|43293.60|0.02|0.05|N|O|1996-09-18|1996-08-09|1996-09-21|TAKE BACK RETURN|RAIL|ic platelets lose carefully. blithely unu +4646|1776|3|2|26|43622.02|0.07|0.00|N|O|1996-10-02|1996-08-25|1996-10-27|DELIVER IN PERSON|MAIL|ix according to the slyly spe +4646|332|17|3|18|22181.94|0.01|0.00|N|O|1996-06-30|1996-08-10|1996-07-12|TAKE BACK RETURN|TRUCK|beans sleep car +4646|392|93|4|38|49110.82|0.08|0.01|N|O|1996-09-01|1996-08-23|1996-09-27|COLLECT COD|SHIP|al platelets cajole. slyly final dol +4646|259|87|5|22|25503.50|0.01|0.08|N|O|1996-07-14|1996-08-06|1996-07-29|DELIVER IN PERSON|MAIL|cies are blithely after the slyly reg +4647|929|98|1|16|29278.72|0.09|0.07|R|F|1994-09-07|1994-07-15|1994-10-06|COLLECT COD|RAIL|o beans about the fluffily special the +4647|1289|1|2|34|40469.52|0.01|0.02|R|F|1994-05-20|1994-06-20|1994-05-29|COLLECT COD|TRUCK|ly sly accounts +4647|1467|68|3|27|36948.42|0.03|0.08|R|F|1994-05-20|1994-06-26|1994-05-30|NONE|FOB|ully even ti +4647|1383|84|4|2|2568.76|0.04|0.07|R|F|1994-07-03|1994-07-22|1994-07-22|TAKE BACK RETURN|RAIL|dolites wake furiously special pinto be +4647|1869|70|5|2|3541.72|0.07|0.06|A|F|1994-05-27|1994-08-05|1994-06-10|TAKE BACK RETURN|FOB| pinto beans believe furiously slyly silent +4647|285|13|6|28|33187.84|0.02|0.03|A|F|1994-08-25|1994-08-06|1994-09-18|DELIVER IN PERSON|FOB| are above the fluffily fin +4672|582|13|1|22|32616.76|0.01|0.07|N|O|1995-12-03|1995-12-08|1995-12-17|COLLECT COD|AIR|l instructions. blithely ironic packages +4672|610|42|2|41|61935.01|0.00|0.00|N|O|1995-12-01|1995-12-15|1995-12-12|COLLECT COD|RAIL| slyly quie +4672|1621|4|3|24|36542.88|0.04|0.03|N|O|1995-11-11|1995-12-28|1995-12-04|NONE|REG AIR|y fluffily stealt +4672|562|23|4|13|19013.28|0.10|0.03|N|O|1996-02-02|1995-12-13|1996-03-02|DELIVER IN PERSON|RAIL|ar requests? pending accounts against +4672|541|2|5|45|64869.30|0.08|0.07|N|O|1996-02-07|1996-01-16|1996-02-14|DELIVER IN PERSON|MAIL| platelets use amon +4672|1410|50|6|20|26228.20|0.02|0.07|N|O|1995-12-08|1996-01-25|1995-12-19|COLLECT COD|REG AIR|s boost at the ca +4672|719|16|7|38|61548.98|0.01|0.01|N|O|1995-11-28|1995-12-08|1995-12-13|COLLECT COD|SHIP|ests. idle, regular ex +4673|167|68|1|8|8537.28|0.08|0.01|N|O|1996-10-12|1996-10-05|1996-11-04|TAKE BACK RETURN|FOB|lithely final re +4673|1009|10|2|44|40040.00|0.06|0.01|N|O|1996-12-11|1996-10-31|1997-01-08|DELIVER IN PERSON|RAIL| gifts cajole dari +4673|1223|98|3|9|10117.98|0.04|0.07|N|O|1996-10-15|1996-09-30|1996-10-30|DELIVER IN PERSON|MAIL|ages nag across +4674|1491|31|1|50|69624.50|0.07|0.08|A|F|1994-05-13|1994-06-15|1994-06-05|COLLECT COD|RAIL|haggle about the blithel +4674|1888|32|2|35|62645.80|0.02|0.05|A|F|1994-08-02|1994-06-04|1994-08-21|COLLECT COD|FOB|le quickly after the express sent +4674|1105|42|3|3|3018.30|0.01|0.05|A|F|1994-07-19|1994-05-28|1994-07-23|TAKE BACK RETURN|RAIL| regular requests na +4674|122|49|4|21|21464.52|0.02|0.08|R|F|1994-05-08|1994-07-02|1994-06-04|COLLECT COD|RAIL|ent accounts sublate deposits. instruc +4675|1704|5|1|6|9634.20|0.00|0.05|R|F|1994-01-22|1994-01-06|1994-02-12|TAKE BACK RETURN|TRUCK| unusual ideas thrash bl +4675|1437|16|2|12|16061.16|0.00|0.04|A|F|1993-12-22|1994-01-12|1993-12-23|TAKE BACK RETURN|AIR|posits affix carefully +4675|1810|11|3|5|8559.05|0.05|0.05|A|F|1994-01-16|1994-01-05|1994-01-18|DELIVER IN PERSON|RAIL|lent pinto beans +4675|337|22|4|26|32170.58|0.03|0.01|A|F|1993-12-16|1993-12-29|1993-12-23|DELIVER IN PERSON|SHIP|nts. express requests are quickly +4675|805|6|5|18|30704.40|0.01|0.08|R|F|1994-02-23|1994-01-18|1994-03-05|TAKE BACK RETURN|FOB|cajole unusual dep +4675|1181|82|6|1|1082.18|0.10|0.06|R|F|1994-03-18|1994-02-14|1994-04-17|NONE|SHIP|unts. caref +4676|1647|30|1|47|72786.08|0.03|0.06|N|O|1995-12-20|1995-10-04|1996-01-09|NONE|AIR|lithely about the carefully special requ +4676|51|2|2|33|31384.65|0.08|0.05|N|O|1995-12-29|1995-10-01|1996-01-18|TAKE BACK RETURN|FOB|yly express +4676|1452|92|3|4|5413.80|0.10|0.06|N|O|1995-12-12|1995-10-22|1995-12-13|TAKE BACK RETURN|TRUCK|detect above the ironic platelets. fluffily +4676|1109|10|4|50|50505.00|0.07|0.01|N|O|1995-09-20|1995-11-20|1995-10-18|TAKE BACK RETURN|AIR|r deposits boost boldly quickly quick asymp +4676|1211|49|5|29|32254.09|0.01|0.02|N|O|1995-12-29|1995-11-12|1996-01-06|TAKE BACK RETURN|RAIL|ly regular theodolites sleep. +4676|456|57|6|8|10851.60|0.08|0.08|N|O|1995-12-05|1995-10-18|1996-01-02|COLLECT COD|AIR|cuses boost above +4676|633|96|7|13|19937.19|0.05|0.07|N|O|1995-11-18|1995-11-07|1995-12-10|TAKE BACK RETURN|TRUCK| at the slyly bold attainments. silently e +4677|1279|17|1|25|29506.75|0.04|0.04|N|O|1998-04-11|1998-05-11|1998-04-18|TAKE BACK RETURN|REG AIR|unts doubt furiousl +4678|574|5|1|35|51609.95|0.04|0.08|N|O|1998-11-27|1998-10-02|1998-12-17|TAKE BACK RETURN|AIR|he accounts. fluffily bold sheaves b +4678|1167|4|2|18|19226.88|0.03|0.06|N|O|1998-10-30|1998-09-22|1998-11-25|TAKE BACK RETURN|SHIP|usly ironic +4678|954|23|3|13|24114.35|0.10|0.07|N|O|1998-11-03|1998-10-17|1998-11-06|TAKE BACK RETURN|SHIP|its. carefully final fr +4678|218|73|4|23|25718.83|0.06|0.05|N|O|1998-09-03|1998-09-20|1998-09-04|DELIVER IN PERSON|SHIP|ily sly deposi +4678|1778|79|5|40|67190.80|0.03|0.07|N|O|1998-11-11|1998-10-27|1998-11-24|TAKE BACK RETURN|AIR|. final, unusual requests sleep thinl +4679|1892|79|1|7|12557.23|0.10|0.05|R|F|1993-05-11|1993-04-11|1993-05-16|NONE|TRUCK|kages. bold, regular packa +4704|780|77|1|14|23530.92|0.04|0.04|N|O|1996-10-27|1996-11-02|1996-11-07|DELIVER IN PERSON|TRUCK| above the slyly final requests. quickly +4704|277|5|2|7|8240.89|0.03|0.04|N|O|1996-12-04|1996-10-30|1996-12-23|DELIVER IN PERSON|SHIP|ers wake car +4704|631|32|3|44|67391.72|0.02|0.05|N|O|1996-09-02|1996-10-07|1996-09-17|DELIVER IN PERSON|REG AIR|out the care +4705|1108|81|1|22|22200.20|0.04|0.04|R|F|1992-07-05|1992-05-11|1992-07-29|DELIVER IN PERSON|SHIP| fluffily pending accounts ca +4705|306|35|2|14|16888.20|0.00|0.08|R|F|1992-07-14|1992-05-23|1992-07-25|DELIVER IN PERSON|TRUCK|ain carefully amon +4705|555|16|3|16|23288.80|0.07|0.08|R|F|1992-07-02|1992-06-06|1992-07-06|DELIVER IN PERSON|RAIL|special ideas nag sl +4705|1292|4|4|31|36991.99|0.03|0.03|R|F|1992-04-03|1992-05-30|1992-04-05|COLLECT COD|TRUCK|furiously final accou +4705|1625|8|5|28|42745.36|0.10|0.01|A|F|1992-06-03|1992-06-07|1992-06-22|DELIVER IN PERSON|MAIL|tes wake according to the unusual plate +4705|1838|82|6|23|40016.09|0.06|0.03|R|F|1992-06-22|1992-06-11|1992-07-18|DELIVER IN PERSON|MAIL| above the furiously ev +4705|886|53|7|40|71475.20|0.08|0.06|A|F|1992-04-19|1992-04-28|1992-05-07|COLLECT COD|TRUCK|blithely. sly +4706|1819|63|1|37|63669.97|0.02|0.06|A|F|1993-02-20|1993-03-05|1993-03-03|DELIVER IN PERSON|TRUCK|kly final deposits c +4706|1212|13|2|23|25603.83|0.03|0.01|A|F|1993-04-01|1993-03-13|1993-05-01|COLLECT COD|FOB|deas across t +4706|672|35|3|6|9436.02|0.01|0.04|R|F|1993-01-20|1993-03-18|1993-01-26|NONE|MAIL|efully eve +4706|1155|92|4|5|5280.75|0.06|0.06|R|F|1993-02-14|1993-01-31|1993-02-26|NONE|REG AIR|ptotes haggle ca +4706|492|22|5|27|37597.23|0.06|0.08|A|F|1993-04-04|1993-03-11|1993-04-09|COLLECT COD|REG AIR|into beans. finally special instruct +4707|336|93|1|7|8654.31|0.02|0.05|R|F|1995-05-14|1995-04-06|1995-06-06|COLLECT COD|SHIP|ecial sheaves boost blithely accor +4707|1356|33|2|49|61610.15|0.00|0.07|N|F|1995-06-17|1995-05-16|1995-06-25|COLLECT COD|FOB| alongside of the slyly ironic instructio +4708|1910|99|1|18|32614.38|0.02|0.04|A|F|1994-11-11|1994-11-15|1994-11-26|NONE|REG AIR|special, eve +4708|741|38|2|5|8208.70|0.05|0.05|A|F|1994-10-15|1994-12-02|1994-11-12|COLLECT COD|MAIL|ely. carefully sp +4708|769|2|3|32|53432.32|0.04|0.07|A|F|1994-11-12|1994-11-14|1994-11-23|TAKE BACK RETURN|MAIL|the accounts. e +4709|244|45|1|25|28606.00|0.03|0.05|N|O|1996-02-21|1996-02-11|1996-03-17|DELIVER IN PERSON|AIR|deposits grow. fluffily unusual accounts +4709|1761|88|2|25|41569.00|0.05|0.03|N|O|1996-01-22|1996-03-03|1996-02-21|DELIVER IN PERSON|REG AIR|inst the ironic, regul +4710|1827|57|1|40|69152.80|0.10|0.08|A|F|1995-03-09|1995-02-25|1995-03-29|TAKE BACK RETURN|AIR|cross the blithely bold packages. silen +4710|1273|11|2|47|55190.69|0.04|0.01|R|F|1995-02-22|1995-01-12|1995-02-28|NONE|RAIL|blithely express packages. even, ironic re +4711|1324|25|1|7|8577.24|0.03|0.01|N|O|1998-05-12|1998-06-24|1998-05-24|COLLECT COD|MAIL|ly. bold accounts use fluff +4711|1441|42|2|15|20136.60|0.08|0.07|N|O|1998-06-09|1998-07-30|1998-06-18|COLLECT COD|SHIP| beans wake. deposits could bo +4711|1491|92|3|22|30634.78|0.02|0.03|N|O|1998-06-21|1998-06-18|1998-07-19|TAKE BACK RETURN|REG AIR|along the quickly careful packages. bli +4711|641|35|4|8|12333.12|0.07|0.00|N|O|1998-06-17|1998-06-13|1998-06-27|TAKE BACK RETURN|SHIP|g to the carefully ironic deposits. specia +4711|489|48|5|15|20842.20|0.05|0.01|N|O|1998-09-03|1998-07-15|1998-09-13|TAKE BACK RETURN|SHIP|ld requests: furiously final inst +4711|1157|58|6|45|47616.75|0.05|0.06|N|O|1998-05-19|1998-07-14|1998-05-21|COLLECT COD|SHIP| ironic theodolites +4711|452|40|7|18|24344.10|0.05|0.04|N|O|1998-07-03|1998-07-31|1998-07-23|DELIVER IN PERSON|RAIL| blithely. bold asymptote +4736|1956|89|1|26|48306.70|0.03|0.03|N|O|1996-02-02|1996-01-18|1996-02-09|DELIVER IN PERSON|AIR|efully speci +4736|34|10|2|43|40163.29|0.06|0.07|N|O|1996-02-05|1995-12-21|1996-02-06|COLLECT COD|MAIL|quests. carefully +4737|1902|35|1|37|66744.30|0.03|0.04|R|F|1993-05-17|1993-04-10|1993-05-30|DELIVER IN PERSON|TRUCK|s. fluffily regular +4737|684|16|2|22|34862.96|0.04|0.04|A|F|1993-03-29|1993-05-22|1993-04-16|TAKE BACK RETURN|RAIL| hang fluffily around t +4738|1868|98|1|9|15928.74|0.04|0.04|A|F|1992-06-01|1992-06-26|1992-06-02|COLLECT COD|TRUCK|posits serve slyly. unusual pint +4738|1725|68|2|16|26027.52|0.07|0.08|A|F|1992-06-17|1992-06-20|1992-06-21|NONE|MAIL|nic deposits are slyly! carefu +4738|992|27|3|50|94649.50|0.04|0.02|A|F|1992-06-18|1992-07-04|1992-07-07|TAKE BACK RETURN|TRUCK|the blithely ironic braids sleep slyly +4738|283|11|4|22|26032.16|0.02|0.08|A|F|1992-05-25|1992-05-19|1992-06-12|COLLECT COD|SHIP|ld, even packages. furio +4738|1863|64|5|13|22943.18|0.04|0.05|R|F|1992-05-30|1992-06-11|1992-06-26|COLLECT COD|AIR| wake. unusual platelets for the +4738|1586|7|6|10|14875.80|0.10|0.01|R|F|1992-07-10|1992-06-16|1992-07-25|TAKE BACK RETURN|SHIP|hins above the +4738|828|28|7|28|48406.96|0.05|0.07|A|F|1992-06-09|1992-07-05|1992-06-25|NONE|AIR|e furiously ironic excuses. care +4739|1680|81|1|8|12653.44|0.07|0.07|R|F|1993-06-22|1993-05-10|1993-07-11|TAKE BACK RETURN|SHIP|cording to the +4739|1841|85|2|31|54028.04|0.09|0.06|R|F|1993-06-20|1993-05-18|1993-06-26|COLLECT COD|SHIP|blithely special pin +4739|992|95|3|30|56789.70|0.09|0.00|A|F|1993-05-29|1993-04-12|1993-06-18|NONE|TRUCK|ly even packages use across th +4740|23|24|1|22|20306.44|0.06|0.01|N|O|1996-10-04|1996-08-17|1996-10-05|TAKE BACK RETURN|RAIL|final dependencies nag +4740|1523|44|2|24|34188.48|0.08|0.02|N|O|1996-09-10|1996-09-27|1996-10-07|TAKE BACK RETURN|TRUCK|hely regular deposits +4741|728|93|1|24|39089.28|0.00|0.01|A|F|1992-09-16|1992-09-19|1992-09-20|DELIVER IN PERSON|RAIL|deas boost furiously slyly regular id +4741|1122|23|2|16|16369.92|0.01|0.07|R|F|1992-08-25|1992-08-10|1992-08-29|TAKE BACK RETURN|FOB|final foxes haggle r +4741|1557|78|3|24|35005.20|0.05|0.08|A|F|1992-11-04|1992-08-14|1992-11-06|TAKE BACK RETURN|MAIL|even requests. +4741|510|1|4|39|55009.89|0.09|0.06|R|F|1992-10-28|1992-10-03|1992-11-11|COLLECT COD|SHIP|t, regular requests +4741|1786|87|5|40|67511.20|0.09|0.03|R|F|1992-09-20|1992-09-23|1992-10-09|TAKE BACK RETURN|REG AIR| fluffily slow deposits. fluffily regu +4741|1567|8|6|34|49931.04|0.02|0.07|R|F|1992-08-25|1992-08-18|1992-09-20|DELIVER IN PERSON|RAIL|sly special packages after the furiously +4742|1556|97|1|32|46641.60|0.10|0.08|R|F|1995-04-04|1995-06-12|1995-04-19|COLLECT COD|RAIL|eposits boost blithely. carefully regular a +4742|1549|70|2|29|42065.66|0.02|0.03|N|F|1995-06-15|1995-05-05|1995-06-24|COLLECT COD|REG AIR|integrate closely among t +4742|711|8|3|15|24175.65|0.06|0.04|N|O|1995-07-20|1995-05-26|1995-08-11|NONE|SHIP|terns are sl +4742|1880|10|4|31|55238.28|0.05|0.08|N|F|1995-06-13|1995-05-08|1995-06-24|COLLECT COD|REG AIR|ke slyly among the furiousl +4742|994|95|5|45|85274.55|0.05|0.00|R|F|1995-05-12|1995-05-14|1995-06-07|TAKE BACK RETURN|RAIL|ke carefully. do +4743|595|56|1|19|28416.21|0.04|0.07|A|F|1993-06-23|1993-05-03|1993-07-20|COLLECT COD|AIR|hely even accounts +4743|1584|65|2|3|4456.74|0.01|0.03|R|F|1993-04-14|1993-06-08|1993-05-09|NONE|TRUCK|al requests. express idea +4743|730|95|3|21|34245.33|0.08|0.03|A|F|1993-07-02|1993-06-15|1993-07-26|DELIVER IN PERSON|RAIL|ake blithely against the packages. reg +4743|336|37|4|27|33380.91|0.08|0.05|R|F|1993-07-26|1993-05-27|1993-08-24|DELIVER IN PERSON|AIR|aids use. express deposits +4768|359|16|1|5|6296.75|0.00|0.03|R|F|1993-12-27|1994-02-09|1994-01-11|NONE|MAIL|egular accounts. bravely final fra +4769|343|28|1|16|19893.44|0.08|0.05|N|O|1995-07-16|1995-07-05|1995-07-22|TAKE BACK RETURN|FOB| deposits. slyly even asymptote +4769|630|24|2|34|52041.42|0.06|0.07|N|O|1995-07-26|1995-05-18|1995-08-03|COLLECT COD|REG AIR|ven instructions. ca +4769|465|24|3|36|49156.56|0.10|0.03|N|O|1995-07-22|1995-06-16|1995-08-11|NONE|RAIL|. slyly even deposit +4769|685|86|4|45|71355.60|0.08|0.06|R|F|1995-06-01|1995-07-13|1995-06-04|TAKE BACK RETURN|RAIL|accounts are. even accounts sleep +4769|1117|54|5|15|15271.65|0.07|0.08|N|F|1995-06-12|1995-07-07|1995-07-04|NONE|SHIP|egular platelets can cajole across the +4770|320|5|1|41|50033.12|0.00|0.08|N|O|1995-09-04|1995-08-08|1995-09-10|COLLECT COD|FOB|ithely even packages sleep caref +4770|1561|2|2|30|43876.80|0.09|0.07|N|O|1995-08-25|1995-08-27|1995-09-07|COLLECT COD|SHIP|ffily carefully ironic ideas. ironic d +4771|487|88|1|9|12487.32|0.01|0.00|R|F|1993-02-28|1993-02-19|1993-03-25|NONE|FOB|riously after the packages. fina +4771|154|55|2|21|22137.15|0.09|0.01|R|F|1993-01-19|1993-02-10|1993-02-01|NONE|FOB|fluffily pendi +4771|116|17|3|5|5080.55|0.06|0.08|R|F|1993-01-07|1993-01-19|1993-01-26|NONE|RAIL|ar, quiet accounts nag furiously express id +4771|85|36|4|21|20686.68|0.05|0.04|A|F|1992-12-20|1993-01-22|1992-12-26|TAKE BACK RETURN|SHIP| carefully re +4772|869|70|1|1|1769.86|0.10|0.00|R|F|1994-11-13|1994-10-25|1994-11-15|DELIVER IN PERSON|AIR|ans. slyly even acc +4772|1456|35|2|16|21719.20|0.07|0.06|R|F|1994-10-27|1994-12-07|1994-10-29|TAKE BACK RETURN|MAIL|egular accounts wake s +4772|948|49|3|31|57317.14|0.02|0.04|A|F|1994-10-02|1994-10-21|1994-10-13|TAKE BACK RETURN|FOB|ests are thinly. furiously unusua +4772|708|73|4|15|24130.50|0.02|0.07|R|F|1994-09-19|1994-10-22|1994-09-26|COLLECT COD|TRUCK| requests. express, regular th +4773|1432|33|1|23|30668.89|0.00|0.08|N|O|1996-01-01|1996-03-19|1996-01-04|NONE|FOB|ly express grouches wak +4773|1965|10|2|36|67210.56|0.09|0.04|N|O|1996-04-08|1996-03-03|1996-05-01|COLLECT COD|REG AIR| dependencies. quickly +4773|1661|62|3|49|76570.34|0.05|0.02|N|O|1996-01-26|1996-02-29|1996-01-27|TAKE BACK RETURN|FOB|y final reque +4773|194|73|4|49|53615.31|0.09|0.04|N|O|1996-01-12|1996-02-17|1996-02-05|TAKE BACK RETURN|TRUCK|ly pending theodolites cajole caref +4773|1495|74|5|20|27929.80|0.02|0.07|N|O|1995-12-28|1996-02-17|1996-01-15|COLLECT COD|TRUCK| blithely final deposits nag after t +4773|1893|37|6|11|19743.79|0.10|0.06|N|O|1996-01-02|1996-01-29|1996-01-24|DELIVER IN PERSON|REG AIR|en accounts. slyly b +4773|1574|55|7|6|8853.42|0.07|0.01|N|O|1996-03-09|1996-03-18|1996-03-27|NONE|AIR|latelets haggle s +4774|832|66|1|45|77977.35|0.10|0.00|R|F|1993-07-07|1993-06-08|1993-07-31|COLLECT COD|TRUCK| haggle busily afte +4774|389|18|2|4|5157.52|0.02|0.03|A|F|1993-08-03|1993-05-30|1993-08-19|COLLECT COD|FOB|xes according to the foxes wake above the f +4774|1725|26|3|47|76455.84|0.10|0.08|R|F|1993-06-13|1993-07-04|1993-07-09|TAKE BACK RETURN|FOB|regular dolphins above the furi +4774|1292|4|4|30|35798.70|0.05|0.08|A|F|1993-08-18|1993-06-08|1993-08-21|DELIVER IN PERSON|REG AIR|tions against the blithely final theodolit +4775|740|73|1|1|1640.74|0.10|0.02|N|O|1995-09-06|1995-09-28|1995-09-29|DELIVER IN PERSON|MAIL|furiously ironic theodolite +4775|1528|69|2|37|52892.24|0.02|0.01|N|O|1995-09-06|1995-09-28|1995-09-28|COLLECT COD|TRUCK|ts. pinto beans use according to th +4775|1523|44|3|34|48433.68|0.09|0.06|N|O|1995-09-14|1995-10-15|1995-09-21|DELIVER IN PERSON|MAIL|onic epitaphs. f +4775|1185|94|4|39|42361.02|0.07|0.04|N|O|1995-08-30|1995-10-12|1995-09-20|NONE|AIR|eep never with the slyly regular acc +4800|965|34|1|11|20525.56|0.03|0.03|R|F|1992-01-27|1992-03-16|1992-02-19|TAKE BACK RETURN|RAIL|ic dependenc +4800|255|10|2|1|1155.25|0.06|0.06|A|F|1992-02-23|1992-03-16|1992-03-20|TAKE BACK RETURN|MAIL|nal accounts are blithely deposits. bol +4800|106|59|3|21|21128.10|0.09|0.05|A|F|1992-02-14|1992-03-15|1992-02-26|NONE|SHIP|ithely according to +4800|1753|54|4|38|62880.50|0.10|0.08|R|F|1992-02-01|1992-02-28|1992-02-21|NONE|TRUCK|s sleep fluffily. furiou +4800|523|24|5|24|34164.48|0.08|0.04|R|F|1992-01-14|1992-02-23|1992-01-25|NONE|TRUCK|ully carefully r +4801|1840|70|1|37|64448.08|0.10|0.02|N|O|1996-03-09|1996-02-29|1996-03-25|TAKE BACK RETURN|FOB|uests hinder blithely against the instr +4801|253|81|2|34|39210.50|0.03|0.02|N|O|1996-02-05|1996-04-16|1996-02-23|NONE|SHIP|y final requests +4801|1093|94|3|4|3976.36|0.04|0.04|N|O|1996-03-23|1996-04-04|1996-03-25|COLLECT COD|RAIL|pitaphs. regular, reg +4801|912|13|4|39|70703.49|0.07|0.01|N|O|1996-03-19|1996-03-21|1996-04-17|TAKE BACK RETURN|REG AIR|warhorses wake never for the care +4802|395|96|1|6|7772.34|0.00|0.06|N|O|1997-04-16|1997-03-25|1997-04-21|TAKE BACK RETURN|SHIP|unusual accounts wake blithely. b +4803|1311|88|1|2|2424.62|0.08|0.03|N|O|1996-04-16|1996-03-20|1996-05-15|NONE|REG AIR|gular reque +4803|1752|79|2|47|77726.25|0.10|0.00|N|O|1996-03-14|1996-03-30|1996-03-15|DELIVER IN PERSON|FOB|ly final excuses. slyly express requ +4803|1958|3|3|42|78117.90|0.04|0.08|N|O|1996-04-27|1996-05-05|1996-05-17|NONE|TRUCK| accounts affix quickly ar +4803|214|69|4|24|26741.04|0.10|0.04|N|O|1996-02-24|1996-04-02|1996-02-28|NONE|MAIL|t blithely slyly special decoys. +4803|1882|12|5|21|37461.48|0.03|0.06|N|O|1996-05-25|1996-03-15|1996-06-09|COLLECT COD|FOB| silent packages use. b +4803|1936|37|6|19|34920.67|0.07|0.00|N|O|1996-04-20|1996-03-25|1996-04-27|TAKE BACK RETURN|RAIL|sts. enticing, even +4804|1271|83|1|44|51579.88|0.06|0.08|A|F|1992-05-02|1992-03-24|1992-05-28|TAKE BACK RETURN|AIR|aggle quickly among the slyly fi +4804|350|7|2|41|51264.35|0.10|0.02|R|F|1992-04-06|1992-04-12|1992-05-03|COLLECT COD|MAIL|. deposits haggle express tithes? +4804|649|12|3|33|51138.12|0.09|0.05|A|F|1992-03-02|1992-04-14|1992-03-13|DELIVER IN PERSON|AIR|, thin excuses. +4805|1493|94|1|7|9761.43|0.09|0.03|A|F|1992-05-01|1992-07-09|1992-05-09|NONE|FOB| requests. regular deposit +4805|1890|34|2|45|80635.05|0.02|0.03|R|F|1992-06-16|1992-06-08|1992-07-03|NONE|TRUCK|the furiously sly t +4805|1539|60|3|44|63383.32|0.01|0.02|R|F|1992-05-14|1992-06-23|1992-05-25|DELIVER IN PERSON|SHIP|eposits sleep furiously qui +4805|643|6|4|13|20067.32|0.04|0.04|R|F|1992-07-16|1992-06-07|1992-08-10|COLLECT COD|AIR|its serve about the accounts. slyly regu +4805|86|87|5|42|41415.36|0.03|0.03|R|F|1992-08-17|1992-07-03|1992-09-14|NONE|REG AIR|the regular, fina +4805|1360|37|6|18|22704.48|0.06|0.04|A|F|1992-06-07|1992-07-10|1992-06-12|COLLECT COD|TRUCK|o use pending, unusu +4806|151|52|1|26|27329.90|0.10|0.05|R|F|1993-05-28|1993-06-07|1993-05-29|DELIVER IN PERSON|SHIP| bold pearls sublate blithely. quickly pe +4806|712|9|2|6|9676.26|0.01|0.06|A|F|1993-05-17|1993-07-19|1993-05-29|TAKE BACK RETURN|SHIP|even theodolites. packages sl +4806|289|17|3|8|9514.24|0.09|0.00|A|F|1993-05-08|1993-07-16|1993-05-28|NONE|TRUCK|requests boost blithely. qui +4807|1220|95|1|9|10090.98|0.04|0.08|N|O|1997-04-23|1997-03-01|1997-05-15|TAKE BACK RETURN|TRUCK|may are blithely. carefully even pinto b +4807|98|99|2|41|40921.69|0.07|0.08|N|O|1997-05-02|1997-03-31|1997-05-15|TAKE BACK RETURN|AIR| fluffily re +4807|1444|45|3|34|45744.96|0.06|0.02|N|O|1997-01-31|1997-03-13|1997-02-01|NONE|SHIP|ecial ideas. deposits according to the fin +4807|1894|81|4|32|57468.48|0.05|0.00|N|O|1997-04-04|1997-03-21|1997-04-16|NONE|RAIL|efully even dolphins slee +4807|1588|9|5|2|2979.16|0.02|0.05|N|O|1997-05-09|1997-04-03|1997-06-05|TAKE BACK RETURN|RAIL|deas wake bli +4807|1591|92|6|22|32836.98|0.09|0.06|N|O|1997-03-13|1997-02-23|1997-04-01|NONE|FOB|es use final excuses. furiously final +4832|148|49|1|23|24107.22|0.03|0.01|N|O|1997-12-05|1998-01-05|1997-12-10|NONE|RAIL|y express depo +4832|1514|35|2|10|14155.10|0.00|0.06|N|O|1998-01-08|1998-02-01|1998-01-11|DELIVER IN PERSON|MAIL|ly. blithely bold pinto beans should have +4832|1483|23|3|4|5537.92|0.04|0.01|N|O|1998-01-16|1998-02-12|1998-02-08|TAKE BACK RETURN|AIR|ages. slyly express deposits cajole car +4832|639|40|4|6|9237.78|0.02|0.01|N|O|1997-12-08|1998-02-03|1997-12-10|COLLECT COD|TRUCK|ages cajole after the bold requests. furi +4832|1374|89|5|43|54840.91|0.10|0.08|N|O|1997-12-31|1998-02-20|1998-01-26|COLLECT COD|RAIL|oze according to the accou +4833|1062|98|1|31|29854.86|0.08|0.04|N|O|1996-06-24|1996-07-15|1996-07-02|NONE|SHIP|ven instructions cajole against the caref +4833|1161|70|2|11|11683.76|0.03|0.01|N|O|1996-08-24|1996-07-26|1996-09-19|NONE|REG AIR|s nag above the busily sile +4833|171|72|3|26|27850.42|0.08|0.04|N|O|1996-05-13|1996-07-12|1996-05-31|NONE|SHIP|s packages. even gif +4833|354|11|4|19|23832.65|0.07|0.07|N|O|1996-08-21|1996-07-09|1996-09-10|TAKE BACK RETURN|AIR|y quick theodolit +4833|343|28|5|4|4973.36|0.10|0.02|N|O|1996-08-16|1996-06-29|1996-08-22|NONE|AIR|y pending packages sleep blithely regular r +4834|1827|57|1|27|46678.14|0.06|0.02|N|O|1997-01-09|1996-10-27|1997-01-27|DELIVER IN PERSON|RAIL|es nag blithe +4834|710|43|2|26|41878.46|0.01|0.00|N|O|1996-10-04|1996-10-21|1996-10-10|DELIVER IN PERSON|TRUCK|ages dazzle carefully. slyly daring foxes +4834|230|85|3|34|38427.82|0.03|0.01|N|O|1996-12-09|1996-11-26|1996-12-10|NONE|MAIL|ounts haggle bo +4834|1427|67|4|38|50479.96|0.03|0.06|N|O|1997-01-10|1996-12-06|1997-01-22|COLLECT COD|FOB|alongside of the carefully even plate +4835|1783|84|1|18|30326.04|0.00|0.03|R|F|1995-02-17|1994-12-14|1995-03-17|DELIVER IN PERSON|MAIL|eat furiously against the slyly +4835|906|41|2|3|5420.70|0.09|0.06|R|F|1995-01-24|1995-01-12|1995-02-16|COLLECT COD|AIR|etimes final pac +4835|855|56|3|27|47407.95|0.05|0.00|A|F|1994-12-10|1994-12-13|1995-01-02|DELIVER IN PERSON|REG AIR| accounts after the car +4835|1012|83|4|23|20999.23|0.08|0.07|A|F|1995-02-05|1995-01-04|1995-02-28|NONE|SHIP|e carefully regular foxes. deposits are sly +4836|1616|58|1|22|33387.42|0.01|0.03|N|O|1997-03-03|1997-02-23|1997-03-04|NONE|SHIP|al pinto beans. care +4836|474|4|2|16|21991.52|0.07|0.08|N|O|1997-01-14|1997-03-05|1997-01-30|COLLECT COD|MAIL|gular packages against the express reque +4836|757|54|3|14|23208.50|0.03|0.08|N|O|1997-02-21|1997-02-06|1997-03-08|COLLECT COD|MAIL|lites. unusual, bold dolphins ar +4836|1054|25|4|15|14325.75|0.10|0.00|N|O|1997-03-08|1997-03-14|1997-03-30|TAKE BACK RETURN|TRUCK|eep slyly. even requests cajole +4836|502|63|5|12|16830.00|0.01|0.04|N|O|1997-02-02|1997-02-10|1997-02-03|COLLECT COD|TRUCK|sly ironic accoun +4837|418|6|1|16|21094.56|0.09|0.04|N|O|1998-08-12|1998-06-06|1998-08-26|COLLECT COD|FOB|ing requests are blithely regular instructi +4837|1928|73|2|16|29278.72|0.01|0.02|N|O|1998-08-19|1998-06-18|1998-08-26|NONE|RAIL|counts cajole slyly furiou +4837|678|41|3|42|66304.14|0.10|0.00|N|O|1998-06-19|1998-07-06|1998-06-23|COLLECT COD|MAIL|o the furiously final theodolites boost +4838|1218|19|1|35|39172.35|0.01|0.00|R|F|1992-10-30|1992-10-23|1992-11-21|TAKE BACK RETURN|RAIL|ly blithely unusual foxes. even package +4838|1471|11|2|2|2744.94|0.03|0.08|R|F|1992-08-11|1992-09-16|1992-08-26|COLLECT COD|MAIL|hely final notornis are furiously blithe +4838|512|13|3|26|36725.26|0.06|0.04|R|F|1992-09-03|1992-10-25|1992-09-11|TAKE BACK RETURN|FOB|ular requests boost about the packages. r +4839|598|89|1|5|7492.95|0.10|0.07|A|F|1994-09-07|1994-07-15|1994-10-05|DELIVER IN PERSON|FOB|ses integrate. regular deposits are about +4839|97|98|2|25|24927.25|0.02|0.02|R|F|1994-05-20|1994-07-08|1994-05-30|NONE|REG AIR|regular packages ab +4839|597|98|3|18|26956.62|0.06|0.01|R|F|1994-05-18|1994-06-13|1994-06-09|TAKE BACK RETURN|FOB|blithely ironic theodolites use along +4839|992|93|4|19|35966.81|0.07|0.08|R|F|1994-05-20|1994-07-14|1994-05-30|NONE|REG AIR| deposits sublate furiously ir +4839|710|75|5|9|14496.39|0.05|0.01|R|F|1994-06-17|1994-06-18|1994-07-10|NONE|SHIP|ounts haggle carefully above +4864|1498|16|1|28|39185.72|0.06|0.08|A|F|1993-02-06|1992-12-15|1993-02-10|COLLECT COD|REG AIR|thely around the bli +4864|375|4|2|38|48464.06|0.10|0.02|R|F|1992-12-20|1993-01-07|1993-01-06|TAKE BACK RETURN|SHIP|ording to the ironic, ir +4864|1325|2|3|45|55184.40|0.02|0.01|A|F|1992-11-17|1993-01-02|1992-11-26|COLLECT COD|SHIP|round the furiously careful pa +4864|309|66|4|46|55627.80|0.07|0.03|A|F|1993-02-24|1993-01-02|1993-03-17|TAKE BACK RETURN|RAIL|sts use carefully across the carefull +4865|1615|39|1|16|24265.76|0.07|0.05|N|O|1997-10-02|1997-08-20|1997-10-04|COLLECT COD|TRUCK|osits haggle. fur +4865|1363|64|2|4|5057.44|0.07|0.01|N|O|1997-07-24|1997-07-25|1997-08-07|TAKE BACK RETURN|FOB|sts. blithely special instruction +4865|677|71|3|44|69417.48|0.10|0.08|N|O|1997-07-25|1997-08-20|1997-08-22|COLLECT COD|FOB|even deposits sleep against the quickly r +4865|500|59|4|21|29410.50|0.04|0.02|N|O|1997-07-17|1997-08-10|1997-07-21|NONE|RAIL|eposits detect sly +4865|538|99|5|33|47471.49|0.00|0.05|N|O|1997-07-17|1997-08-16|1997-07-30|TAKE BACK RETURN|FOB|y pending notornis ab +4865|648|11|6|47|72786.08|0.00|0.05|N|O|1997-08-26|1997-08-07|1997-08-31|NONE|RAIL|y unusual packages. packages +4866|106|59|1|9|9054.90|0.01|0.05|N|O|1997-08-30|1997-09-18|1997-09-24|TAKE BACK RETURN|MAIL|ven dependencies x-ray. quic +4866|1013|14|2|1|914.01|0.06|0.00|N|O|1997-10-15|1997-10-01|1997-11-14|TAKE BACK RETURN|AIR|latelets nag. q +4866|1305|44|3|17|20507.10|0.07|0.00|N|O|1997-11-26|1997-10-11|1997-12-12|COLLECT COD|TRUCK|ess packages doubt. even somas wake f +4867|817|18|1|7|12024.67|0.09|0.03|A|F|1992-07-17|1992-08-17|1992-07-22|COLLECT COD|FOB|e carefully even packages. slyly ironic i +4867|1597|38|2|3|4495.77|0.04|0.08|R|F|1992-07-04|1992-07-15|1992-07-21|NONE|AIR|yly silent deposits +4868|726|59|1|47|76455.84|0.03|0.03|N|O|1997-04-29|1997-04-27|1997-05-11|DELIVER IN PERSON|SHIP|gle unusual, fluffy packages. foxes cajol +4868|1791|92|2|8|13542.32|0.10|0.08|N|O|1997-03-26|1997-05-09|1997-04-16|NONE|RAIL|ly special th +4868|1908|9|3|49|88685.10|0.09|0.03|N|O|1997-04-23|1997-05-07|1997-04-26|NONE|SHIP|ys engage. th +4868|791|92|4|34|57520.86|0.04|0.02|N|O|1997-05-19|1997-04-27|1997-06-15|NONE|RAIL|en instructions about th +4868|1216|17|5|22|24578.62|0.07|0.06|N|O|1997-04-26|1997-05-16|1997-05-01|DELIVER IN PERSON|FOB|osits. final foxes boost regular, +4869|409|39|1|31|40591.40|0.10|0.01|A|F|1995-01-17|1994-11-30|1995-02-02|NONE|SHIP|ins. always unusual ideas across the ir +4869|574|35|2|24|35389.68|0.09|0.06|A|F|1994-11-17|1994-11-07|1994-11-27|COLLECT COD|MAIL|olites cajole after the ideas. special t +4869|1561|62|3|25|36564.00|0.00|0.05|R|F|1994-11-25|1994-11-14|1994-12-19|DELIVER IN PERSON|AIR|e according t +4869|1026|97|4|24|22248.48|0.10|0.07|R|F|1994-11-23|1994-11-18|1994-12-11|DELIVER IN PERSON|MAIL|se deposits above the sly, q +4869|1729|14|5|42|68490.24|0.07|0.04|R|F|1994-10-16|1994-12-10|1994-11-07|TAKE BACK RETURN|REG AIR| slyly even instructions. +4869|1211|23|6|30|33366.30|0.00|0.05|A|F|1995-01-09|1994-11-20|1995-02-02|COLLECT COD|RAIL|gedly even requests. s +4870|479|9|1|49|67594.03|0.05|0.05|R|F|1994-11-14|1994-10-24|1994-12-12|TAKE BACK RETURN|SHIP| regular packages +4870|1262|74|2|6|6979.56|0.06|0.08|A|F|1994-09-09|1994-10-16|1994-09-21|DELIVER IN PERSON|TRUCK|ress requests. bold, silent pinto bea +4870|302|59|3|5|6011.50|0.05|0.00|R|F|1994-10-11|1994-10-07|1994-10-24|NONE|AIR|s haggle furiously. slyly ironic dinos +4870|60|86|4|4|3840.24|0.03|0.08|A|F|1994-10-23|1994-09-16|1994-11-04|COLLECT COD|RAIL|its wake quickly. slyly quick +4870|706|39|5|36|57841.20|0.09|0.06|A|F|1994-09-06|1994-09-17|1994-10-01|COLLECT COD|REG AIR| instructions. carefully pending pac +4871|1767|94|1|14|23362.64|0.07|0.03|N|O|1995-09-30|1995-07-29|1995-10-18|TAKE BACK RETURN|REG AIR|inst the never ironic +4871|1606|30|2|17|25629.20|0.07|0.03|N|O|1995-09-09|1995-09-01|1995-10-02|DELIVER IN PERSON|AIR|es. carefully ev +4871|621|22|3|3|4564.86|0.03|0.06|N|O|1995-10-03|1995-08-10|1995-10-06|DELIVER IN PERSON|TRUCK|y special packages wak +4871|1485|3|4|35|48526.80|0.08|0.07|N|O|1995-08-11|1995-07-18|1995-08-29|DELIVER IN PERSON|TRUCK|ackages sle +4871|1515|16|5|10|14165.10|0.09|0.02|N|O|1995-09-12|1995-09-02|1995-10-05|TAKE BACK RETURN|AIR|s integrate after the a +4871|1355|70|6|36|45228.60|0.02|0.08|N|O|1995-09-18|1995-08-29|1995-10-05|TAKE BACK RETURN|AIR|ely according +4871|1391|6|7|10|12923.90|0.10|0.02|N|O|1995-07-13|1995-08-19|1995-07-29|NONE|REG AIR|p ironic theodolites. slyly even platel +4896|408|9|1|19|24859.60|0.09|0.05|A|F|1992-12-13|1992-11-13|1993-01-09|NONE|AIR|nusual requ +4896|1396|73|2|44|57085.16|0.04|0.03|A|F|1992-11-24|1992-11-15|1992-12-18|COLLECT COD|MAIL|e after the slowly f +4896|572|63|3|6|8835.42|0.04|0.04|A|F|1992-10-30|1992-11-12|1992-11-28|DELIVER IN PERSON|TRUCK|usly regular deposits +4896|228|29|4|5|5641.10|0.08|0.02|R|F|1992-12-02|1992-11-11|1992-12-19|COLLECT COD|SHIP|eposits hang carefully. sly +4896|851|51|5|21|36788.85|0.07|0.08|R|F|1992-11-18|1992-11-18|1992-11-29|DELIVER IN PERSON|TRUCK|ly express deposits. carefully pending depo +4897|545|46|1|26|37584.04|0.01|0.01|R|F|1992-12-22|1992-10-25|1992-12-27|DELIVER IN PERSON|TRUCK|. carefully ironic dep +4897|1422|1|2|34|44996.28|0.02|0.00|R|F|1992-12-31|1992-11-11|1993-01-30|COLLECT COD|AIR|ts. special dependencies use fluffily +4897|548|39|3|42|60838.68|0.09|0.03|A|F|1992-09-23|1992-10-28|1992-10-02|DELIVER IN PERSON|FOB|sts. blithely regular deposits will have +4897|1034|35|4|19|17765.57|0.03|0.00|A|F|1992-11-08|1992-12-14|1992-12-03|DELIVER IN PERSON|FOB|! ironic, pending dependencies doze furiou +4898|716|81|1|44|71135.24|0.07|0.02|A|F|1994-09-13|1994-08-18|1994-09-16|NONE|FOB|y regular grouches about +4899|331|16|1|14|17238.62|0.06|0.00|R|F|1993-11-10|1994-01-10|1993-11-20|NONE|REG AIR| foxes eat +4900|1154|27|1|40|42206.00|0.10|0.03|A|F|1992-09-02|1992-09-25|1992-09-21|COLLECT COD|TRUCK|heodolites. request +4900|764|65|2|33|54937.08|0.06|0.06|R|F|1992-08-18|1992-09-20|1992-08-19|COLLECT COD|MAIL|nto beans nag slyly reg +4900|1021|92|3|48|44256.96|0.02|0.00|R|F|1992-09-18|1992-08-14|1992-09-28|TAKE BACK RETURN|MAIL|uickly ironic ideas kindle s +4900|311|12|4|20|24226.20|0.05|0.00|R|F|1992-09-22|1992-09-23|1992-09-27|TAKE BACK RETURN|MAIL|yers. accounts affix somet +4900|1049|85|5|40|38001.60|0.03|0.02|R|F|1992-07-14|1992-09-05|1992-07-20|NONE|REG AIR|luffily final dol +4900|1025|61|6|46|42596.92|0.06|0.08|R|F|1992-07-11|1992-09-19|1992-07-16|TAKE BACK RETURN|SHIP|ly final acco +4901|1410|28|1|37|48522.17|0.00|0.04|N|O|1998-01-26|1998-02-20|1998-01-31|DELIVER IN PERSON|TRUCK| furiously ev +4901|1644|86|2|12|18547.68|0.00|0.04|N|O|1998-01-12|1998-02-06|1998-02-03|COLLECT COD|REG AIR|y unusual deposits prom +4901|1198|35|3|16|17587.04|0.05|0.08|N|O|1998-04-19|1998-03-18|1998-04-21|NONE|AIR|deposits. blithely fin +4901|357|58|4|41|51551.35|0.03|0.00|N|O|1998-03-18|1998-02-18|1998-04-14|TAKE BACK RETURN|AIR|efully bold packages affix carefully eve +4901|1157|58|5|40|42326.00|0.06|0.02|N|O|1998-01-08|1998-01-30|1998-01-15|DELIVER IN PERSON|MAIL|ect across the furiou +4902|1952|85|1|22|40786.90|0.00|0.04|N|O|1998-10-17|1998-08-10|1998-10-21|COLLECT COD|RAIL|r the furiously final fox +4902|824|91|2|1|1724.82|0.09|0.04|N|O|1998-10-12|1998-08-20|1998-11-08|NONE|RAIL|daring foxes? even, bold requests wake f +4903|1208|9|1|1|1109.20|0.06|0.03|R|F|1992-04-23|1992-06-13|1992-05-03|NONE|SHIP|nusual requests +4903|1644|45|2|6|9273.84|0.09|0.07|R|F|1992-04-01|1992-05-16|1992-04-11|DELIVER IN PERSON|SHIP|azzle quickly along the blithely final pla +4903|1198|7|3|27|29678.13|0.07|0.06|A|F|1992-06-29|1992-06-09|1992-07-08|COLLECT COD|RAIL|pinto beans are; +4928|994|95|1|4|7579.96|0.04|0.02|R|F|1993-10-25|1993-12-24|1993-11-16|TAKE BACK RETURN|REG AIR|bout the slyly final accounts. carefull +4928|929|30|2|20|36598.40|0.03|0.08|A|F|1994-01-19|1993-11-29|1994-02-13|DELIVER IN PERSON|SHIP|quiet theodolites ca +4928|1483|1|3|34|47072.32|0.06|0.05|A|F|1993-10-12|1993-12-31|1993-10-14|DELIVER IN PERSON|AIR|, regular depos +4929|136|89|1|20|20722.60|0.00|0.04|N|O|1996-03-12|1996-05-23|1996-03-20|COLLECT COD|REG AIR| final pinto beans detect. final, +4929|781|78|2|40|67271.20|0.08|0.03|N|O|1996-05-30|1996-04-13|1996-06-22|TAKE BACK RETURN|AIR|unts against +4929|765|98|3|32|53304.32|0.08|0.02|N|O|1996-04-28|1996-05-23|1996-04-30|COLLECT COD|TRUCK|usly at the blithely pending pl +4929|1090|61|4|26|25768.34|0.00|0.05|N|O|1996-06-10|1996-05-29|1996-06-26|DELIVER IN PERSON|RAIL| slyly. fl +4929|665|66|5|24|37575.84|0.09|0.05|N|O|1996-04-15|1996-04-30|1996-05-09|NONE|MAIL| accounts boost +4930|1866|67|1|35|61875.10|0.03|0.01|A|F|1994-07-09|1994-07-30|1994-07-15|NONE|RAIL|lose slyly regular dependencies. fur +4930|1148|57|2|20|20982.80|0.02|0.04|A|F|1994-08-21|1994-06-17|1994-08-24|COLLECT COD|FOB|he carefully +4930|1678|20|3|28|44230.76|0.00|0.08|R|F|1994-08-27|1994-06-27|1994-09-18|COLLECT COD|TRUCK|e ironic, unusual courts. regula +4930|1656|57|4|42|65421.30|0.00|0.00|A|F|1994-06-18|1994-06-22|1994-07-10|COLLECT COD|AIR|ions haggle. furiously regular ideas use +4930|1896|26|5|38|68319.82|0.02|0.03|A|F|1994-06-06|1994-06-18|1994-07-03|TAKE BACK RETURN|AIR|bold requests sleep never +4931|1931|20|1|1|1832.93|0.08|0.06|A|F|1995-01-24|1994-12-19|1995-02-07|DELIVER IN PERSON|SHIP| furiously +4931|1506|27|2|8|11260.00|0.06|0.02|R|F|1994-12-15|1995-01-14|1995-01-06|NONE|SHIP|ts boost. packages wake sly +4931|1431|32|3|20|26648.60|0.09|0.00|A|F|1995-01-25|1994-12-21|1995-02-06|DELIVER IN PERSON|MAIL|the furious +4931|1993|26|4|50|94749.50|0.04|0.01|A|F|1994-12-15|1994-12-18|1994-12-23|COLLECT COD|REG AIR|s haggle al +4931|1492|32|5|25|34837.25|0.05|0.05|R|F|1994-12-19|1995-01-05|1994-12-21|COLLECT COD|FOB|aggle bravely according to the quic +4931|1025|61|6|8|7408.16|0.02|0.03|A|F|1995-02-16|1994-12-30|1995-03-15|DELIVER IN PERSON|SHIP|dependencies are slyly +4932|503|94|1|13|18245.50|0.04|0.03|A|F|1993-09-13|1993-10-16|1993-09-20|DELIVER IN PERSON|SHIP|slyly according to the furiously fin +4932|1025|31|2|15|13890.30|0.01|0.02|R|F|1993-11-15|1993-10-25|1993-11-29|NONE|REG AIR|yly. unusu +4932|869|3|3|5|8849.30|0.06|0.06|A|F|1993-10-01|1993-09-13|1993-10-04|NONE|MAIL| haggle furiously. slyly ironic packages sl +4932|973|42|4|11|20613.67|0.09|0.06|A|F|1993-09-21|1993-09-30|1993-09-23|COLLECT COD|SHIP|as. special depende +4933|314|99|1|48|58286.88|0.08|0.00|N|O|1995-10-10|1995-10-03|1995-11-04|COLLECT COD|SHIP|ideas. sly +4933|820|87|2|2|3441.64|0.09|0.00|N|O|1995-10-01|1995-09-29|1995-10-19|DELIVER IN PERSON|MAIL|ctions nag final instructions. accou +4934|961|30|1|48|89374.08|0.00|0.01|N|O|1997-05-20|1997-04-22|1997-06-02|TAKE BACK RETURN|SHIP| ideas cajol +4934|1094|95|2|41|40798.69|0.06|0.06|N|O|1997-06-04|1997-04-11|1997-06-25|TAKE BACK RETURN|FOB|wake final, ironic f +4934|1398|99|3|8|10395.12|0.03|0.06|N|O|1997-05-20|1997-04-30|1997-05-27|TAKE BACK RETURN|MAIL|arefully express pains cajo +4934|1473|13|4|9|12370.23|0.06|0.08|N|O|1997-06-10|1997-04-09|1997-06-12|TAKE BACK RETURN|REG AIR| haggle alongside of the +4934|1371|72|5|29|36898.73|0.09|0.03|N|O|1997-04-10|1997-05-05|1997-05-04|DELIVER IN PERSON|AIR|aggle furiously among the busily final re +4934|517|18|6|42|59535.42|0.00|0.07|N|O|1997-03-19|1997-05-05|1997-03-25|NONE|MAIL|ven, ironic ideas +4934|107|34|7|2|2014.20|0.10|0.06|N|O|1997-06-05|1997-03-26|1997-06-09|COLLECT COD|MAIL|ongside of the brave, regula +4935|1608|9|1|13|19624.80|0.09|0.01|A|F|1993-06-20|1993-08-13|1993-06-27|COLLECT COD|REG AIR|ly requests. final deposits might +4935|392|77|2|37|47818.43|0.01|0.05|R|F|1993-08-30|1993-07-23|1993-09-07|TAKE BACK RETURN|RAIL|y even dependencies nag a +4935|109|62|3|24|24218.40|0.06|0.04|A|F|1993-05-29|1993-08-17|1993-06-22|NONE|RAIL|ly quickly s +4935|450|51|4|49|66172.05|0.06|0.01|A|F|1993-09-16|1993-08-21|1993-10-12|COLLECT COD|TRUCK|ffily after the furiou +4935|96|97|5|14|13945.26|0.08|0.08|A|F|1993-05-30|1993-07-25|1993-05-31|COLLECT COD|FOB|slowly. blith +4935|1880|67|6|36|64147.68|0.10|0.00|R|F|1993-07-11|1993-07-04|1993-08-01|DELIVER IN PERSON|RAIL|requests across the quick +4960|171|24|1|36|38562.12|0.01|0.05|R|F|1995-03-06|1995-05-04|1995-04-05|TAKE BACK RETURN|RAIL|c, unusual accou +4960|444|3|2|6|8066.64|0.03|0.08|R|F|1995-03-21|1995-05-13|1995-04-14|TAKE BACK RETURN|SHIP|ual package +4960|1481|99|3|9|12442.32|0.01|0.03|A|F|1995-03-20|1995-05-05|1995-04-17|COLLECT COD|RAIL|e blithely carefully fina +4960|1191|64|4|14|15290.66|0.00|0.06|A|F|1995-04-03|1995-04-17|1995-04-07|NONE|RAIL|accounts. warhorses are. grouches +4960|972|41|5|8|14983.76|0.07|0.04|R|F|1995-03-14|1995-04-18|1995-04-09|NONE|FOB|as. busily regular packages nag. +4960|1452|53|6|37|50077.65|0.10|0.04|R|F|1995-05-23|1995-04-12|1995-06-01|DELIVER IN PERSON|MAIL|ending theodolites w +4960|1697|98|7|42|67144.98|0.08|0.07|A|F|1995-04-19|1995-04-11|1995-05-08|NONE|SHIP|s requests cajole. +4961|438|97|1|38|50860.34|0.10|0.07|N|O|1998-07-09|1998-06-03|1998-07-11|TAKE BACK RETURN|FOB|e on the blithely bold accounts. unu +4961|600|61|2|1|1500.60|0.08|0.08|N|O|1998-07-08|1998-05-25|1998-07-12|DELIVER IN PERSON|MAIL|s affix carefully silent dependen +4961|1612|13|3|41|62058.01|0.02|0.02|N|O|1998-07-15|1998-06-15|1998-08-05|TAKE BACK RETURN|REG AIR|ily against the n +4961|994|63|4|10|18949.90|0.02|0.04|N|O|1998-04-15|1998-07-03|1998-04-18|DELIVER IN PERSON|MAIL|quests. regular, ironic ideas at the ironi +4962|184|37|1|46|49872.28|0.01|0.07|R|F|1993-08-23|1993-09-04|1993-08-27|COLLECT COD|REG AIR| pinto beans grow about the sl +4963|1679|62|1|38|60065.46|0.08|0.02|N|O|1996-12-25|1996-12-12|1997-01-02|COLLECT COD|AIR|tegrate daringly accou +4963|754|51|2|16|26476.00|0.00|0.03|N|O|1996-11-20|1997-01-13|1996-12-06|COLLECT COD|MAIL| carefully slyly u +4964|1325|64|1|29|35563.28|0.04|0.01|N|O|1997-10-18|1997-08-30|1997-11-01|NONE|AIR|k accounts nag carefully-- ironic, fin +4964|1471|11|2|46|63133.62|0.06|0.06|N|O|1997-10-05|1997-09-12|1997-10-11|NONE|TRUCK|althy deposits +4964|1426|27|3|18|23893.56|0.00|0.06|N|O|1997-10-13|1997-09-01|1997-11-10|DELIVER IN PERSON|AIR| platelets. furio +4964|1798|41|4|12|20397.48|0.08|0.01|N|O|1997-09-03|1997-10-25|1997-09-15|NONE|TRUCK|ully silent instructions ca +4964|407|95|5|42|54910.80|0.06|0.04|N|O|1997-09-04|1997-08-28|1997-10-02|TAKE BACK RETURN|AIR| hinder. idly even +4964|1928|61|6|22|40258.24|0.04|0.08|N|O|1997-09-11|1997-10-06|1997-09-29|NONE|AIR|equests doubt quickly. caref +4964|1728|29|7|28|45632.16|0.00|0.05|N|O|1997-08-30|1997-09-15|1997-09-18|COLLECT COD|RAIL|among the carefully regula +4965|1301|78|1|28|33664.40|0.05|0.03|A|F|1994-01-02|1993-11-20|1994-01-04|TAKE BACK RETURN|REG AIR| deposits. requests sublate quickly +4965|121|74|2|25|25528.00|0.10|0.02|R|F|1994-02-05|1993-12-15|1994-02-24|TAKE BACK RETURN|MAIL|wake at the carefully speci +4965|1006|12|3|27|24489.00|0.05|0.06|R|F|1993-11-06|1993-12-24|1993-11-30|TAKE BACK RETURN|SHIP|efully final foxes +4965|1375|52|4|33|42120.21|0.04|0.04|A|F|1993-12-31|1993-11-29|1994-01-27|DELIVER IN PERSON|REG AIR|iously slyly +4966|758|91|1|10|16587.50|0.06|0.03|N|O|1996-09-23|1996-11-02|1996-10-07|TAKE BACK RETURN|SHIP| requests. carefully pending requests +4966|1939|84|2|6|11045.58|0.02|0.01|N|O|1996-12-09|1996-11-29|1996-12-30|NONE|AIR|d deposits are sly excuses. slyly iro +4966|1650|51|3|7|10861.55|0.00|0.01|N|O|1996-12-08|1996-10-09|1997-01-06|COLLECT COD|MAIL|ckly ironic tithe +4966|159|38|4|26|27537.90|0.08|0.03|N|O|1996-11-14|1996-11-29|1996-12-05|COLLECT COD|REG AIR|nt pearls haggle carefully slyly even +4966|1437|77|5|12|16061.16|0.02|0.07|N|O|1996-12-07|1996-11-23|1996-12-20|DELIVER IN PERSON|RAIL|eodolites. ironic requests across the exp +4967|708|41|1|50|80435.00|0.07|0.01|N|O|1997-05-27|1997-05-13|1997-06-12|NONE|REG AIR|kages. final, unusual accounts c +4967|524|15|2|43|61254.36|0.00|0.07|N|O|1997-05-28|1997-04-10|1997-06-09|NONE|TRUCK|ons. slyly ironic requests +4967|500|1|3|15|21007.50|0.08|0.02|N|O|1997-04-16|1997-04-12|1997-05-08|TAKE BACK RETURN|MAIL|y. blithel +4967|1225|100|4|1|1126.22|0.10|0.07|N|O|1997-06-04|1997-03-29|1997-06-23|NONE|FOB|osits. unusual frets thrash furiously +4992|1836|37|1|42|72988.86|0.07|0.01|R|F|1992-07-19|1992-06-16|1992-08-17|TAKE BACK RETURN|RAIL|foxes about the quickly final platele +4992|1465|5|2|47|64223.62|0.10|0.08|A|F|1992-09-04|1992-08-05|1992-09-21|COLLECT COD|MAIL|atterns use fluffily. +4992|1432|11|3|17|22668.31|0.03|0.03|A|F|1992-07-05|1992-07-19|1992-07-30|TAKE BACK RETURN|FOB|s along the perma +4992|700|63|4|25|40017.50|0.04|0.06|R|F|1992-08-06|1992-07-11|1992-08-20|NONE|SHIP|ly about the never ironic requests. pe +4992|1385|100|5|23|29586.74|0.01|0.08|R|F|1992-06-28|1992-07-15|1992-07-12|DELIVER IN PERSON|MAIL|uickly regul +4992|1627|51|6|44|67259.28|0.05|0.02|A|F|1992-06-01|1992-07-22|1992-06-03|NONE|RAIL|rmanent, sly packages print slyly. regula +4993|373|58|1|34|43294.58|0.05|0.00|R|F|1994-09-21|1994-10-31|1994-09-24|TAKE BACK RETURN|REG AIR|ular, pending packages at the even packa +4993|1286|24|2|39|46303.92|0.03|0.08|R|F|1994-09-10|1994-09-04|1994-09-26|COLLECT COD|SHIP|pending, regular requests solve caref +4993|1657|81|3|42|65463.30|0.06|0.00|A|F|1994-08-27|1994-09-24|1994-09-05|NONE|MAIL| final packages at the q +4993|1574|15|4|31|45742.67|0.10|0.06|A|F|1994-10-02|1994-10-29|1994-10-15|NONE|AIR|nwind thinly platelets. a +4994|1559|80|1|36|52579.80|0.00|0.06|N|O|1996-09-29|1996-07-30|1996-10-03|TAKE BACK RETURN|TRUCK|ess ideas. blithely silent brai +4994|793|58|2|47|79608.13|0.04|0.05|N|O|1996-09-20|1996-08-04|1996-10-15|COLLECT COD|TRUCK|sts. blithely close ideas sleep quic +4994|1821|65|3|29|49961.78|0.08|0.01|N|O|1996-08-26|1996-09-27|1996-09-25|DELIVER IN PERSON|RAIL|ptotes boost carefully +4994|382|83|4|40|51295.20|0.01|0.06|N|O|1996-08-25|1996-08-16|1996-09-07|TAKE BACK RETURN|REG AIR|eposits. regula +4994|414|44|5|24|31545.84|0.01|0.07|N|O|1996-08-19|1996-09-24|1996-08-25|TAKE BACK RETURN|FOB|s. slyly ironic deposits cajole f +4994|726|27|6|6|9760.32|0.01|0.02|N|O|1996-09-05|1996-08-04|1996-09-30|TAKE BACK RETURN|FOB|grate carefully around th +4994|1298|99|7|31|37177.99|0.07|0.04|N|O|1996-10-14|1996-09-23|1996-11-08|TAKE BACK RETURN|RAIL|lar decoys cajole fluffil +4995|650|82|1|16|24810.40|0.02|0.05|N|O|1996-02-27|1996-04-03|1996-02-29|DELIVER IN PERSON|MAIL|egular, bold packages. accou +4995|805|5|2|43|73349.40|0.00|0.06|N|O|1996-02-24|1996-02-20|1996-03-07|NONE|AIR|ts. blithely silent ideas after t +4995|1555|56|3|22|32044.10|0.03|0.06|N|O|1996-03-17|1996-03-12|1996-04-01|DELIVER IN PERSON|MAIL|s wake furious, express dependencies. +4995|400|57|4|9|11703.60|0.07|0.07|N|O|1996-03-07|1996-03-17|1996-03-11|DELIVER IN PERSON|FOB| ironic packages cajole across t +4995|1477|95|5|48|66166.56|0.08|0.07|N|O|1996-03-22|1996-04-01|1996-04-07|NONE|SHIP|t blithely. requests affix blithely. +4995|1099|70|6|48|48004.32|0.09|0.07|N|O|1996-04-14|1996-04-04|1996-05-07|DELIVER IN PERSON|RAIL|nstructions. carefully final depos +4996|559|20|1|35|51084.25|0.07|0.01|A|F|1992-10-30|1992-10-27|1992-11-05|TAKE BACK RETURN|SHIP|s. unusual, regular dolphins integrate care +4996|1559|60|2|39|56961.45|0.02|0.07|A|F|1992-09-19|1992-10-19|1992-10-06|COLLECT COD|FOB|equests are carefully final +4996|1278|53|3|12|14151.24|0.04|0.06|R|F|1993-01-09|1992-11-22|1993-02-04|DELIVER IN PERSON|SHIP|usly bold requests sleep dogge +4996|1436|54|4|13|17386.59|0.00|0.00|A|F|1992-09-17|1992-12-02|1992-10-07|DELIVER IN PERSON|TRUCK|o beans use about the furious +4997|781|78|1|44|73998.32|0.02|0.05|N|O|1998-06-09|1998-06-12|1998-07-07|NONE|RAIL|r escapades ca +4997|162|41|2|5|5310.80|0.02|0.04|N|O|1998-05-16|1998-06-05|1998-06-07|COLLECT COD|REG AIR|cuses are furiously unusual asymptotes +4997|572|73|3|24|35341.68|0.04|0.06|N|O|1998-04-20|1998-04-23|1998-05-16|NONE|AIR|xpress, bo +4997|391|20|4|5|6456.95|0.10|0.03|N|O|1998-06-12|1998-04-24|1998-06-13|DELIVER IN PERSON|TRUCK|aggle slyly alongside of the slyly i +4997|219|47|5|46|51483.66|0.00|0.04|N|O|1998-04-28|1998-06-04|1998-05-08|TAKE BACK RETURN|SHIP|ecial courts are carefully +4997|290|72|6|2|2380.58|0.07|0.01|N|O|1998-07-09|1998-06-10|1998-07-21|TAKE BACK RETURN|REG AIR|counts. slyl +4998|1535|76|1|12|17238.36|0.04|0.03|A|F|1992-02-20|1992-03-06|1992-03-01|TAKE BACK RETURN|RAIL| sleep slyly furiously final accounts. ins +4998|1827|14|2|15|25932.30|0.06|0.00|R|F|1992-04-24|1992-03-21|1992-05-02|NONE|REG AIR|heodolites sleep quickly. +4998|590|91|3|27|40245.93|0.06|0.02|R|F|1992-03-17|1992-02-26|1992-04-05|DELIVER IN PERSON|MAIL|the blithely ironic +4998|624|87|4|47|71657.14|0.10|0.04|A|F|1992-02-07|1992-03-07|1992-02-19|DELIVER IN PERSON|TRUCK|mong the careful +4998|1446|64|5|24|32338.56|0.01|0.04|R|F|1992-01-25|1992-03-16|1992-01-27|COLLECT COD|REG AIR| unwind about +4998|985|20|6|8|15087.84|0.03|0.07|A|F|1992-05-01|1992-03-03|1992-05-24|TAKE BACK RETURN|AIR|ions nag quickly according to the theodolit +4999|1527|8|1|30|42855.60|0.00|0.02|A|F|1993-08-20|1993-08-15|1993-08-30|NONE|AIR|ades cajole carefully unusual ide +4999|93|94|2|44|43695.96|0.03|0.01|A|F|1993-08-01|1993-08-04|1993-08-17|COLLECT COD|REG AIR|ependencies. slowly regu +4999|860|61|3|30|52825.80|0.09|0.01|R|F|1993-07-21|1993-08-11|1993-08-20|DELIVER IN PERSON|RAIL|s cajole among the blithel +5024|1655|38|1|17|26463.05|0.10|0.02|N|O|1996-11-24|1997-01-10|1996-12-04|NONE|AIR| to the expre +5024|576|7|2|41|60539.37|0.06|0.01|N|O|1996-11-09|1996-12-03|1996-12-01|COLLECT COD|REG AIR|osits hinder carefully +5024|1111|48|3|18|18217.98|0.04|0.03|N|O|1996-12-02|1997-01-16|1996-12-05|NONE|MAIL|zle carefully sauternes. quickly +5024|1226|64|4|42|47343.24|0.03|0.06|N|O|1996-12-02|1996-12-08|1996-12-04|DELIVER IN PERSON|RAIL|tegrate. busily spec +5025|295|50|1|11|13148.19|0.00|0.04|N|O|1997-02-21|1997-04-16|1997-03-14|COLLECT COD|SHIP|the carefully final esc +5025|775|40|2|10|16757.70|0.07|0.04|N|O|1997-06-04|1997-04-29|1997-06-28|COLLECT COD|RAIL|lly silent deposits boost busily again +5026|954|89|1|13|24114.35|0.02|0.04|N|O|1997-12-23|1997-11-02|1998-01-03|TAKE BACK RETURN|SHIP|endencies sleep carefully alongs +5027|973|76|1|6|11243.82|0.04|0.05|N|O|1997-09-28|1997-11-24|1997-10-25|NONE|FOB|ar, ironic deposi +5027|618|19|2|39|59225.79|0.06|0.01|N|O|1997-09-09|1997-11-13|1997-09-21|TAKE BACK RETURN|FOB|ess requests! quickly regular pac +5027|1252|27|3|32|36904.00|0.00|0.01|N|O|1997-11-13|1997-10-29|1997-11-18|TAKE BACK RETURN|RAIL|cording to +5027|256|57|4|37|42781.25|0.02|0.00|N|O|1997-10-05|1997-10-30|1997-10-26|NONE|REG AIR|ost slyly fluffily +5027|1428|29|5|3|3988.26|0.03|0.06|N|O|1997-09-30|1997-11-26|1997-10-05|DELIVER IN PERSON|AIR|t the even mu +5027|865|99|6|25|44146.50|0.06|0.00|N|O|1997-09-16|1997-11-25|1997-10-08|TAKE BACK RETURN|RAIL|ic ideas. requests sleep fluffily am +5027|805|39|7|50|85290.00|0.07|0.02|N|O|1997-09-18|1997-11-07|1997-10-05|DELIVER IN PERSON|MAIL| beans dazzle according to the fluffi +5028|139|92|1|15|15586.95|0.07|0.07|R|F|1992-07-17|1992-07-16|1992-08-05|COLLECT COD|REG AIR|es are quickly final pains. furiously pend +5028|1987|88|2|15|28334.70|0.03|0.07|R|F|1992-08-02|1992-07-09|1992-08-30|NONE|REG AIR|gular, bold pinto bea +5029|1536|37|1|17|24438.01|0.02|0.01|A|F|1993-03-12|1992-12-18|1993-04-02|DELIVER IN PERSON|FOB|! packages boost blithely. furious +5029|965|100|2|2|3731.92|0.00|0.04|A|F|1992-11-25|1993-01-04|1992-12-20|DELIVER IN PERSON|MAIL|packages. furiously ironi +5030|1014|15|1|22|20130.22|0.04|0.06|N|O|1998-09-01|1998-08-15|1998-09-30|TAKE BACK RETURN|TRUCK|. quickly regular foxes believe +5030|798|63|2|50|84939.50|0.05|0.06|N|O|1998-08-22|1998-07-25|1998-09-18|TAKE BACK RETURN|FOB|ss excuses serve bli +5031|500|1|1|15|21007.50|0.02|0.05|R|F|1995-04-01|1995-02-24|1995-04-12|DELIVER IN PERSON|AIR|yly pending theodolites. +5031|1609|33|2|40|60424.00|0.10|0.04|A|F|1994-12-04|1995-01-27|1995-01-01|NONE|TRUCK|ns hang blithely across th +5031|1531|52|3|4|5730.12|0.01|0.07|R|F|1994-12-26|1995-02-24|1995-01-11|NONE|RAIL|after the even frays: ironic, unusual th +5031|1805|49|4|31|52910.80|0.10|0.08|R|F|1995-01-15|1995-01-08|1995-02-09|COLLECT COD|MAIL|ts across the even requests doze furiously +5056|474|62|1|7|9621.29|0.09|0.01|N|O|1997-04-28|1997-04-07|1997-05-15|DELIVER IN PERSON|TRUCK|rouches after the pending instruc +5056|1964|97|2|19|35453.24|0.04|0.00|N|O|1997-03-24|1997-05-05|1997-04-23|DELIVER IN PERSON|AIR|c theodolites. ironic a +5056|891|58|3|23|41213.47|0.02|0.05|N|O|1997-05-12|1997-04-28|1997-05-25|NONE|SHIP|ickly regular requests cajole. depos +5056|870|37|4|14|24792.18|0.08|0.00|N|O|1997-06-09|1997-04-13|1997-07-06|COLLECT COD|SHIP|sts haggle carefully along the slyl +5057|370|55|1|38|48274.06|0.02|0.03|N|O|1997-10-24|1997-09-07|1997-10-30|TAKE BACK RETURN|MAIL|packages. stealthily bold wa +5057|71|97|2|45|43698.15|0.08|0.07|N|O|1997-09-20|1997-10-02|1997-10-20|NONE|FOB| asymptotes wake slyl +5058|1925|70|1|16|29230.72|0.09|0.07|N|O|1998-07-12|1998-06-09|1998-07-15|DELIVER IN PERSON|SHIP| the special foxes +5059|696|90|1|5|7983.45|0.03|0.08|R|F|1993-12-23|1994-01-12|1993-12-24|TAKE BACK RETURN|FOB|ts affix slyly accordi +5059|1229|4|2|19|21474.18|0.06|0.04|R|F|1994-03-02|1993-12-26|1994-03-14|TAKE BACK RETURN|MAIL| special ideas poach blithely qu +5059|764|97|3|45|74914.20|0.02|0.00|A|F|1994-01-28|1994-01-08|1994-02-18|DELIVER IN PERSON|MAIL|enly. requests doze. express, close pa +5060|250|32|1|27|31056.75|0.10|0.07|R|F|1992-07-23|1992-09-05|1992-08-07|COLLECT COD|SHIP|s. ironic +5060|311|40|2|28|33916.68|0.04|0.04|R|F|1992-09-25|1992-08-11|1992-10-09|NONE|REG AIR|c requests +5060|1603|4|3|15|22569.00|0.06|0.01|A|F|1992-08-28|1992-08-20|1992-09-01|DELIVER IN PERSON|AIR|ular deposits sl +5061|1649|32|1|18|27911.52|0.03|0.00|A|F|1993-10-20|1993-10-05|1993-10-28|TAKE BACK RETURN|SHIP|atelets among the ca +5061|1975|64|2|8|15015.76|0.01|0.02|R|F|1993-09-07|1993-10-31|1993-10-04|DELIVER IN PERSON|REG AIR|regular foxes. ir +5061|233|34|3|26|29463.98|0.02|0.05|A|F|1993-11-07|1993-09-13|1993-11-13|NONE|REG AIR| cajole slyly. carefully spe +5062|1008|44|1|9|8181.00|0.08|0.00|R|F|1993-01-02|1992-12-01|1993-01-20|TAKE BACK RETURN|MAIL| silent theodolites wake. c +5062|747|48|2|4|6590.96|0.02|0.02|R|F|1993-02-06|1992-12-14|1993-03-03|DELIVER IN PERSON|AIR|ke furiously express theodolites. +5062|1586|87|3|50|74379.00|0.09|0.07|A|F|1992-12-25|1992-12-13|1992-12-29|TAKE BACK RETURN|MAIL| the regular, unusual pains. specia +5062|1602|44|4|18|27064.80|0.03|0.07|R|F|1992-11-04|1992-12-25|1992-11-05|NONE|SHIP|furiously pending requests are ruthles +5062|1937|70|5|25|45973.25|0.08|0.02|R|F|1992-12-15|1992-11-17|1993-01-01|NONE|TRUCK|uthless excuses ag +5063|1286|87|1|31|36805.68|0.08|0.01|N|O|1997-06-02|1997-06-20|1997-06-27|NONE|RAIL|kages. ironic, ironic courts wake. carefu +5063|1737|64|2|43|70465.39|0.04|0.08|N|O|1997-09-14|1997-07-05|1997-10-05|TAKE BACK RETURN|TRUCK|latelets might nod blithely regular requ +5063|1663|46|3|2|3129.32|0.02|0.03|N|O|1997-06-17|1997-07-27|1997-06-24|COLLECT COD|SHIP|kly regular i +5063|1346|23|4|18|22452.12|0.08|0.05|N|O|1997-06-02|1997-06-18|1997-06-06|TAKE BACK RETURN|RAIL|refully quiet reques +5063|1607|90|5|1|1508.60|0.06|0.07|N|O|1997-09-03|1997-06-26|1997-10-03|NONE|FOB|ously special +5088|779|76|1|23|38634.71|0.06|0.06|R|F|1993-03-03|1993-03-07|1993-03-08|NONE|FOB|cording to the fluffily expr +5088|501|92|2|41|57461.50|0.09|0.00|R|F|1993-01-22|1993-03-07|1993-02-09|TAKE BACK RETURN|TRUCK|ing requests. +5088|853|53|3|36|63138.60|0.10|0.05|A|F|1993-04-16|1993-04-03|1993-05-14|NONE|TRUCK|the furiously final deposits. furiously re +5088|1085|91|4|10|9860.80|0.04|0.05|R|F|1993-04-07|1993-02-06|1993-04-26|NONE|FOB|beans. special requests af +5089|1571|12|1|4|5890.28|0.05|0.06|R|F|1992-09-18|1992-09-28|1992-10-13|DELIVER IN PERSON|TRUCK|nts sleep blithely +5089|1616|17|2|20|30352.20|0.00|0.07|R|F|1992-10-10|1992-10-07|1992-11-06|COLLECT COD|RAIL| ironic accounts +5089|1236|48|3|46|52312.58|0.03|0.04|A|F|1992-11-09|1992-10-13|1992-11-10|TAKE BACK RETURN|RAIL|above the express accounts. exc +5089|335|64|4|38|46942.54|0.05|0.03|R|F|1992-11-23|1992-09-11|1992-12-22|TAKE BACK RETURN|SHIP|regular instructions are +5090|214|15|1|22|24512.62|0.07|0.00|N|O|1997-05-10|1997-05-25|1997-05-24|TAKE BACK RETURN|TRUCK|ets integrate ironic, regul +5090|1286|87|2|46|54614.88|0.05|0.00|N|O|1997-04-05|1997-04-14|1997-05-01|COLLECT COD|REG AIR|lose theodolites sleep blit +5090|19|95|3|22|20218.22|0.09|0.05|N|O|1997-07-03|1997-04-12|1997-07-26|NONE|REG AIR|ular requests su +5090|1137|74|4|2|2076.26|0.03|0.06|N|O|1997-04-07|1997-04-23|1997-05-01|TAKE BACK RETURN|AIR|tes. slowly iro +5090|477|78|5|21|28926.87|0.10|0.02|N|O|1997-03-29|1997-04-24|1997-04-25|TAKE BACK RETURN|FOB|ly express accounts. slyly even r +5090|797|62|6|30|50933.70|0.02|0.03|N|O|1997-05-04|1997-04-14|1997-05-30|COLLECT COD|MAIL|osits nag slyly. fluffily ex +5091|774|71|1|50|83738.50|0.05|0.03|N|O|1998-07-21|1998-06-22|1998-07-26|COLLECT COD|REG AIR|al dependencies. r +5092|1631|14|1|30|45978.90|0.06|0.00|N|O|1995-12-27|1995-12-08|1996-01-09|DELIVER IN PERSON|MAIL|ss, ironic deposits. furiously stea +5092|448|36|2|34|45846.96|0.04|0.02|N|O|1995-12-09|1995-12-26|1995-12-21|TAKE BACK RETURN|AIR|ckages nag +5092|1393|8|3|13|16827.07|0.06|0.01|N|O|1995-11-21|1996-01-05|1995-12-19|TAKE BACK RETURN|SHIP|es detect sly +5092|1793|94|4|14|23727.06|0.04|0.00|N|O|1996-02-20|1995-11-30|1996-03-20|DELIVER IN PERSON|REG AIR| deposits cajole furiously against the sly +5092|1857|1|5|42|73871.70|0.01|0.02|N|O|1995-11-06|1996-01-01|1995-12-06|DELIVER IN PERSON|AIR|s use along t +5092|1776|3|6|11|18455.47|0.03|0.03|N|O|1995-12-02|1995-12-27|1995-12-11|COLLECT COD|MAIL|ly against the slyly silen +5092|1584|85|7|50|74279.00|0.10|0.03|N|O|1995-11-30|1996-01-14|1995-12-19|NONE|REG AIR|r platelets maintain car +5093|1677|78|1|40|63146.80|0.05|0.01|R|F|1993-09-16|1993-11-04|1993-10-05|TAKE BACK RETURN|REG AIR|ing pinto beans. quickly bold dependenci +5093|735|32|2|15|24535.95|0.01|0.04|A|F|1993-12-02|1993-11-18|1994-01-01|DELIVER IN PERSON|FOB|ly among the unusual foxe +5093|1508|49|3|31|43694.50|0.00|0.02|R|F|1993-09-22|1993-11-14|1993-09-26|TAKE BACK RETURN|REG AIR| against the +5093|1557|38|4|37|53966.35|0.04|0.00|A|F|1993-10-26|1993-12-02|1993-10-27|NONE|TRUCK|courts. qui +5093|1149|22|5|30|31504.20|0.06|0.05|A|F|1993-11-22|1993-11-27|1993-12-14|DELIVER IN PERSON|TRUCK|ithely ironic sheaves use fluff +5093|1202|40|6|31|34199.20|0.01|0.08|A|F|1993-12-17|1993-11-14|1994-01-02|NONE|SHIP|he final foxes. fluffily ironic +5094|1426|66|1|19|25220.98|0.03|0.03|R|F|1993-03-31|1993-06-12|1993-04-04|NONE|AIR|ronic foxes. furi +5094|1077|83|2|23|22495.61|0.05|0.07|R|F|1993-06-13|1993-05-19|1993-07-06|NONE|MAIL|st furiously above the fluffily care +5094|915|18|3|11|19975.01|0.04|0.08|A|F|1993-06-25|1993-06-24|1993-07-18|TAKE BACK RETURN|MAIL|s cajole quickly against the furiously ex +5094|786|87|4|21|35422.38|0.09|0.08|R|F|1993-07-26|1993-05-03|1993-08-16|NONE|MAIL| blithely furiously final re +5095|643|37|1|46|71007.44|0.07|0.01|A|F|1992-06-26|1992-06-25|1992-07-05|COLLECT COD|RAIL|egular instruction +5095|1055|61|2|2|1912.10|0.07|0.08|A|F|1992-07-09|1992-05-25|1992-07-21|DELIVER IN PERSON|REG AIR|detect car +5095|1228|66|3|28|31618.16|0.01|0.04|A|F|1992-06-20|1992-06-27|1992-06-22|DELIVER IN PERSON|AIR| into the final courts. ca +5095|1780|65|4|42|70634.76|0.08|0.08|R|F|1992-05-23|1992-06-01|1992-06-18|COLLECT COD|TRUCK|ccounts. packages could have t +5095|1655|56|5|9|14009.85|0.10|0.07|R|F|1992-08-14|1992-06-23|1992-08-16|TAKE BACK RETURN|REG AIR|bold theodolites wake about the expr +5095|968|69|6|15|28034.40|0.01|0.06|A|F|1992-07-11|1992-07-12|1992-08-09|COLLECT COD|AIR| to the packages wake sly +5095|1689|90|7|40|63627.20|0.05|0.02|A|F|1992-07-11|1992-06-07|1992-07-26|DELIVER IN PERSON|MAIL|carefully unusual plat +5120|1324|1|1|28|34308.96|0.06|0.03|N|O|1996-07-20|1996-08-31|1996-08-06|NONE|RAIL| across the silent requests. caref +5121|1836|66|1|23|39970.09|0.06|0.01|A|F|1992-05-18|1992-06-20|1992-06-02|TAKE BACK RETURN|REG AIR|even courts are blithely ironically +5121|1108|17|2|45|45409.50|0.08|0.04|A|F|1992-08-13|1992-07-27|1992-09-12|NONE|TRUCK|pecial accounts cajole ca +5121|966|35|3|27|50407.92|0.08|0.07|R|F|1992-06-17|1992-06-11|1992-06-19|NONE|MAIL|ly silent theodolit +5121|671|3|4|10|15716.70|0.04|0.05|R|F|1992-06-08|1992-07-10|1992-07-02|TAKE BACK RETURN|FOB|e quickly according +5121|883|84|5|46|82058.48|0.03|0.02|R|F|1992-05-27|1992-07-19|1992-05-28|TAKE BACK RETURN|FOB|use express foxes. slyly +5121|1|77|6|2|1802.00|0.04|0.07|R|F|1992-08-10|1992-06-28|1992-08-11|NONE|FOB| final, regular account +5122|1823|53|1|28|48294.96|0.03|0.00|N|O|1996-04-20|1996-03-29|1996-04-29|DELIVER IN PERSON|FOB|g the busily ironic accounts boos +5122|820|20|2|43|73995.26|0.09|0.03|N|O|1996-05-31|1996-04-12|1996-06-13|NONE|MAIL|ut the carefully special foxes. idle, +5122|441|42|3|12|16097.28|0.07|0.03|N|O|1996-04-02|1996-04-27|1996-04-10|DELIVER IN PERSON|AIR|lar instructions +5123|258|59|1|13|15057.25|0.08|0.07|N|O|1998-05-17|1998-03-23|1998-06-02|COLLECT COD|MAIL|regular pearls +5124|542|33|1|43|62029.22|0.00|0.02|N|O|1997-07-10|1997-05-13|1997-07-31|COLLECT COD|AIR|onic package +5124|52|28|2|41|39034.05|0.02|0.06|N|O|1997-07-05|1997-06-29|1997-07-23|DELIVER IN PERSON|RAIL|wake across the +5124|1248|49|3|44|50566.56|0.03|0.03|N|O|1997-07-13|1997-06-26|1997-08-01|DELIVER IN PERSON|RAIL|equests. carefully unusual d +5124|695|27|4|36|57444.84|0.10|0.07|N|O|1997-04-20|1997-07-03|1997-05-04|TAKE BACK RETURN|AIR|r deposits ab +5125|55|81|1|38|36291.90|0.09|0.05|N|O|1998-03-20|1998-04-14|1998-03-22|COLLECT COD|MAIL|ily even deposits w +5125|1591|92|2|5|7462.95|0.08|0.06|N|O|1998-04-07|1998-04-14|1998-04-29|COLLECT COD|RAIL| thinly even pack +5126|236|91|1|33|37495.59|0.02|0.02|R|F|1993-02-04|1992-12-23|1993-02-14|NONE|RAIL|ipliers promise furiously whithout the +5126|1009|80|2|43|39130.00|0.09|0.04|R|F|1993-01-07|1992-12-19|1993-01-16|COLLECT COD|MAIL|e silently. ironic, unusual accounts +5126|776|9|3|23|38565.71|0.08|0.01|R|F|1993-01-02|1993-01-02|1993-01-05|COLLECT COD|TRUCK|egular, blithe packages. +5127|187|14|1|33|35876.94|0.08|0.04|N|O|1997-03-25|1997-03-02|1997-04-04|NONE|SHIP| bold deposits use carefully a +5127|312|41|2|20|24246.20|0.01|0.03|N|O|1997-05-11|1997-02-26|1997-05-12|TAKE BACK RETURN|SHIP|dolites about the final platelets w +5152|1050|56|1|9|8559.45|0.04|0.03|N|O|1997-04-11|1997-02-11|1997-04-18|COLLECT COD|AIR| cajole furiously alongside of the bo +5152|1334|73|2|50|61766.50|0.04|0.04|N|O|1997-03-10|1997-02-04|1997-03-15|COLLECT COD|FOB| the final deposits. slyly ironic warth +5153|345|74|1|42|52304.28|0.03|0.01|N|O|1995-10-03|1995-11-09|1995-10-11|COLLECT COD|RAIL|re thinly. ironic +5153|529|20|2|14|20013.28|0.05|0.05|N|O|1995-11-29|1995-10-21|1995-12-08|TAKE BACK RETURN|TRUCK| slyly daring pinto beans lose blithely fi +5153|679|11|3|30|47390.10|0.09|0.01|N|O|1995-11-10|1995-11-14|1995-11-16|DELIVER IN PERSON|AIR|beans sleep bl +5153|1722|7|4|32|51959.04|0.10|0.08|N|O|1995-12-05|1995-09-25|1996-01-03|DELIVER IN PERSON|MAIL|egular deposits. ironi +5153|1117|26|5|36|36651.96|0.01|0.03|N|O|1995-12-15|1995-11-08|1995-12-30|COLLECT COD|TRUCK| ironic instru +5153|1351|66|6|42|52598.70|0.00|0.03|N|O|1995-10-19|1995-11-23|1995-11-06|TAKE BACK RETURN|RAIL|ickly even deposi +5154|1898|42|1|11|19798.79|0.02|0.05|N|O|1997-08-06|1997-06-30|1997-09-04|NONE|RAIL|luffily bold foxes. final +5154|1440|41|2|15|20121.60|0.07|0.08|N|O|1997-06-23|1997-07-11|1997-07-11|NONE|AIR|even packages. packages use +5155|480|81|1|1|1380.48|0.00|0.00|A|F|1994-07-03|1994-08-11|1994-07-29|COLLECT COD|FOB|oze slyly after the silent, regular idea +5155|1876|63|2|5|8889.35|0.08|0.02|A|F|1994-06-30|1994-08-13|1994-07-15|TAKE BACK RETURN|AIR|ole blithely slyly ironic +5155|1055|61|3|28|26769.40|0.05|0.02|R|F|1994-07-01|1994-07-19|1994-07-18|COLLECT COD|REG AIR|s cajole. accounts wake. thinly quiet pla +5155|789|86|4|39|65901.42|0.09|0.06|A|F|1994-08-25|1994-09-01|1994-09-18|COLLECT COD|TRUCK|l dolphins nag caref +5156|1166|39|1|21|22410.36|0.06|0.03|N|O|1997-01-01|1997-01-30|1997-01-11|TAKE BACK RETURN|TRUCK|ts detect against the furiously reg +5156|1471|50|2|36|49408.92|0.04|0.07|N|O|1997-02-12|1996-12-10|1997-03-13|TAKE BACK RETURN|REG AIR| slyly even orbi +5157|542|33|1|35|50488.90|0.06|0.08|N|O|1997-07-28|1997-09-30|1997-08-15|TAKE BACK RETURN|REG AIR|to the furiously sil +5157|1379|80|2|18|23046.66|0.10|0.04|N|O|1997-09-06|1997-10-03|1997-09-19|COLLECT COD|MAIL|y bold deposits nag blithely. final reque +5157|1664|65|3|15|23484.90|0.09|0.00|N|O|1997-07-27|1997-08-30|1997-08-08|DELIVER IN PERSON|RAIL|cajole. spec +5157|582|13|4|25|37064.50|0.00|0.03|N|O|1997-08-24|1997-09-23|1997-08-28|COLLECT COD|REG AIR| packages detect. even requests against th +5157|1490|8|5|40|55659.60|0.09|0.06|N|O|1997-08-11|1997-08-28|1997-09-01|TAKE BACK RETURN|FOB|ial packages according to +5157|1492|10|6|26|36230.74|0.10|0.01|N|O|1997-07-28|1997-08-22|1997-08-22|NONE|FOB|nto beans cajole car +5157|488|76|7|12|16661.76|0.10|0.08|N|O|1997-10-19|1997-08-07|1997-10-26|NONE|FOB|es. busily +5158|443|31|1|43|57767.92|0.10|0.04|N|O|1997-04-10|1997-03-06|1997-04-15|DELIVER IN PERSON|AIR|nusual platelets. slyly even foxes cajole +5158|843|44|2|18|31389.12|0.04|0.04|N|O|1997-04-30|1997-03-28|1997-05-12|COLLECT COD|REG AIR|hely regular pa +5158|1419|59|3|41|54136.81|0.05|0.05|N|O|1997-02-25|1997-03-19|1997-03-03|COLLECT COD|AIR|deposits. quickly special +5158|1301|16|4|49|58912.70|0.05|0.01|N|O|1997-04-10|1997-03-21|1997-04-30|NONE|REG AIR|r requests sleep q +5158|1185|94|5|20|21723.60|0.01|0.04|N|O|1997-02-03|1997-02-20|1997-02-08|TAKE BACK RETURN|AIR|latelets use accordin +5158|880|14|6|39|69454.32|0.08|0.04|N|O|1997-05-15|1997-04-04|1997-06-02|DELIVER IN PERSON|FOB|lithely fina +5158|901|4|7|38|68472.20|0.10|0.05|N|O|1997-05-09|1997-03-03|1997-06-04|NONE|SHIP|uffily regular ac +5159|1234|46|1|39|44273.97|0.06|0.07|N|O|1996-12-17|1996-12-08|1997-01-10|COLLECT COD|MAIL|re furiously after the pending dolphin +5159|167|94|2|46|49089.36|0.01|0.01|N|O|1996-12-15|1996-12-07|1996-12-30|DELIVER IN PERSON|SHIP|s kindle slyly carefully regular +5159|1513|34|3|22|31119.22|0.01|0.02|N|O|1996-11-06|1996-11-04|1996-11-15|TAKE BACK RETURN|SHIP|he furiously sile +5159|520|21|4|5|7102.60|0.10|0.00|N|O|1996-11-25|1996-12-19|1996-12-25|TAKE BACK RETURN|FOB|nal deposits. pending, ironic ideas grow +5159|1979|24|5|36|67714.92|0.06|0.01|N|O|1997-01-24|1996-11-07|1997-02-08|NONE|REG AIR|packages wake. +5184|1526|7|1|33|47108.16|0.07|0.04|N|O|1998-08-17|1998-10-16|1998-08-24|TAKE BACK RETURN|AIR|posits. carefully express asympto +5184|158|37|2|47|49733.05|0.05|0.01|N|O|1998-11-02|1998-08-19|1998-11-07|COLLECT COD|TRUCK|se. carefully express pinto beans x +5184|875|9|3|39|69258.93|0.03|0.06|N|O|1998-10-27|1998-10-17|1998-11-19|DELIVER IN PERSON|FOB|es above the care +5184|1760|61|4|26|43205.76|0.05|0.08|N|O|1998-11-11|1998-08-26|1998-12-01|TAKE BACK RETURN|TRUCK| packages are +5184|1231|69|5|19|21512.37|0.06|0.03|N|O|1998-11-15|1998-10-12|1998-11-21|COLLECT COD|REG AIR|refully express platelets sleep carefull +5184|796|61|6|49|83142.71|0.02|0.00|N|O|1998-09-18|1998-08-28|1998-10-14|COLLECT COD|FOB|thlessly closely even reque +5185|1965|98|1|37|69077.52|0.00|0.04|N|O|1997-08-08|1997-09-08|1997-08-14|COLLECT COD|SHIP|gainst the courts dazzle care +5185|246|28|2|32|36679.68|0.06|0.00|N|O|1997-08-17|1997-09-30|1997-08-24|TAKE BACK RETURN|REG AIR|ackages. slyly even requests +5185|1959|48|3|41|76298.95|0.00|0.05|N|O|1997-10-15|1997-10-11|1997-11-02|COLLECT COD|REG AIR|ly blithe deposits. furi +5185|958|59|4|30|55768.50|0.09|0.04|N|O|1997-10-17|1997-09-16|1997-10-23|TAKE BACK RETURN|SHIP|ress packages are furiously +5185|1278|79|5|8|9434.16|0.04|0.00|N|O|1997-08-30|1997-09-02|1997-09-22|COLLECT COD|REG AIR|sts around the slyly perma +5185|1459|38|6|50|68022.50|0.03|0.04|N|O|1997-10-15|1997-10-19|1997-11-06|TAKE BACK RETURN|FOB|final platelets. ideas sleep careful +5186|545|6|1|38|54930.52|0.06|0.02|N|O|1996-11-23|1996-09-21|1996-12-11|DELIVER IN PERSON|MAIL|y ruthless foxes. fluffily +5186|910|11|2|31|56138.21|0.09|0.03|N|O|1996-10-19|1996-09-26|1996-10-25|TAKE BACK RETURN|REG AIR| accounts use furiously slyly spe +5186|883|50|3|26|46380.88|0.03|0.02|N|O|1996-08-08|1996-10-05|1996-08-21|DELIVER IN PERSON|FOB|capades. accounts sublate. pinto +5186|893|94|4|8|14351.12|0.10|0.05|N|O|1996-09-23|1996-09-29|1996-09-30|COLLECT COD|RAIL|y regular notornis k +5186|175|2|5|28|30104.76|0.09|0.03|N|O|1996-10-05|1996-10-27|1996-10-19|TAKE BACK RETURN|RAIL|al decoys. blit +5186|820|54|6|35|60228.70|0.00|0.05|N|O|1996-10-20|1996-10-12|1996-11-12|TAKE BACK RETURN|RAIL|sly silent pack +5186|1979|24|7|44|82762.68|0.00|0.08|N|O|1996-09-23|1996-10-14|1996-10-01|NONE|TRUCK|old, final accounts cajole sl +5187|110|89|1|49|49495.39|0.04|0.06|N|O|1997-10-20|1997-10-12|1997-10-26|DELIVER IN PERSON|AIR|l, regular platelets instead of the foxes w +5187|829|30|2|1|1729.82|0.10|0.08|N|O|1997-08-08|1997-08-24|1997-08-22|DELIVER IN PERSON|REG AIR|aggle never bold +5188|1176|13|1|18|19389.06|0.04|0.03|N|O|1995-06-19|1995-05-19|1995-06-25|DELIVER IN PERSON|AIR|p according to the sometimes regu +5188|1938|71|2|36|66237.48|0.04|0.02|A|F|1995-03-09|1995-05-16|1995-03-19|NONE|TRUCK|packages? blithely s +5188|1480|59|3|9|12433.32|0.06|0.08|A|F|1995-05-09|1995-05-22|1995-05-19|TAKE BACK RETURN|REG AIR|r attainments are across the +5189|1374|51|1|44|56116.28|0.02|0.06|A|F|1994-01-13|1994-02-07|1994-01-21|DELIVER IN PERSON|MAIL|y finally pendin +5189|159|12|2|38|40247.70|0.06|0.00|A|F|1994-03-26|1994-01-28|1994-04-20|DELIVER IN PERSON|REG AIR|ideas. idle, final deposits de +5189|1099|70|3|4|4000.36|0.09|0.02|A|F|1993-12-21|1994-02-23|1994-01-09|DELIVER IN PERSON|REG AIR|. blithely exp +5189|932|1|4|49|89813.57|0.05|0.01|R|F|1994-01-22|1994-01-19|1994-02-04|TAKE BACK RETURN|SHIP| requests +5189|1221|96|5|14|15711.08|0.02|0.03|A|F|1994-01-23|1994-01-05|1994-02-12|DELIVER IN PERSON|REG AIR|unusual packag +5189|162|63|6|41|43548.56|0.02|0.06|R|F|1993-12-12|1994-02-05|1994-01-09|DELIVER IN PERSON|RAIL|ial theodolites cajole slyly. slyly unus +5190|556|17|1|43|62631.65|0.09|0.06|A|F|1992-08-19|1992-06-10|1992-09-01|DELIVER IN PERSON|FOB|encies use fluffily unusual requests? hoc +5190|1314|91|2|6|7291.86|0.10|0.08|A|F|1992-08-08|1992-07-14|1992-08-22|COLLECT COD|RAIL|furiously regular pinto beans. furiously i +5190|885|52|3|45|80364.60|0.04|0.03|A|F|1992-07-23|1992-06-16|1992-08-04|NONE|FOB|y carefully final ideas. f +5191|1148|49|1|41|43014.74|0.00|0.08|A|F|1995-02-05|1995-02-27|1995-02-15|DELIVER IN PERSON|AIR|uests! ironic theodolites cajole care +5191|1678|20|2|40|63186.80|0.02|0.01|A|F|1995-03-31|1995-02-21|1995-04-02|NONE|AIR|nes haggle sometimes. requests eng +5191|423|24|3|27|35732.34|0.07|0.05|A|F|1994-12-26|1995-01-24|1995-01-14|DELIVER IN PERSON|RAIL|tructions nag bravely within the re +5191|1829|59|4|7|12115.74|0.01|0.04|A|F|1995-03-24|1995-01-30|1995-03-30|NONE|RAIL|eposits. express +5216|681|82|1|17|26888.56|0.04|0.06|N|O|1997-08-20|1997-11-07|1997-09-14|COLLECT COD|FOB|s according to the accounts bo +5217|796|97|1|50|84839.50|0.05|0.02|N|O|1995-12-26|1995-11-21|1996-01-24|DELIVER IN PERSON|MAIL|s. express, express accounts c +5217|154|55|2|23|24245.45|0.06|0.07|N|O|1996-01-18|1995-12-24|1996-02-10|COLLECT COD|RAIL|ven ideas. requests amo +5217|1013|84|3|23|21022.23|0.03|0.02|N|O|1995-11-15|1995-12-17|1995-11-27|DELIVER IN PERSON|FOB|pending packages cajole ne +5217|804|38|4|47|80125.60|0.04|0.00|N|O|1995-11-24|1995-12-25|1995-11-25|COLLECT COD|AIR|ronic packages i +5218|828|28|1|43|74339.26|0.05|0.04|A|F|1992-08-04|1992-09-12|1992-08-17|DELIVER IN PERSON|SHIP|k theodolites. express, even id +5218|1248|23|2|33|37924.92|0.06|0.01|R|F|1992-09-16|1992-09-30|1992-09-27|NONE|TRUCK|ronic instructi +5219|1349|50|1|2|2500.68|0.08|0.00|N|O|1997-06-26|1997-04-29|1997-07-08|TAKE BACK RETURN|FOB| blithely according to the stea +5219|1187|96|2|20|21763.60|0.05|0.00|N|O|1997-04-20|1997-05-26|1997-05-13|COLLECT COD|FOB|e along the ironic, +5220|828|95|1|27|46678.14|0.10|0.04|R|F|1992-09-21|1992-08-29|1992-10-16|DELIVER IN PERSON|RAIL|s cajole blithely furiously iron +5221|1035|6|1|24|22464.72|0.07|0.03|N|O|1995-10-04|1995-08-11|1995-10-30|COLLECT COD|REG AIR|s pinto beans sleep. sly +5221|88|89|2|34|33594.72|0.01|0.05|N|O|1995-09-11|1995-07-17|1995-10-10|COLLECT COD|SHIP|eans. furio +5221|1792|35|3|16|27100.64|0.04|0.01|N|O|1995-08-29|1995-09-06|1995-09-12|TAKE BACK RETURN|TRUCK|ending request +5222|1505|26|1|1|1406.50|0.00|0.00|A|F|1994-08-19|1994-07-16|1994-09-08|TAKE BACK RETURN|FOB|idle requests. carefully pending pinto bean +5223|446|34|1|24|32314.56|0.00|0.00|A|F|1994-10-03|1994-09-20|1994-10-11|TAKE BACK RETURN|TRUCK|refully bold courts besides the regular, +5223|1234|72|2|25|28380.75|0.09|0.02|R|F|1994-07-12|1994-08-13|1994-08-01|NONE|FOB|y express ideas impress +5223|58|34|3|19|18202.95|0.04|0.01|R|F|1994-10-28|1994-08-26|1994-10-31|COLLECT COD|REG AIR|ntly. furiously even excuses a +5223|1299|74|4|40|48011.60|0.01|0.04|R|F|1994-10-01|1994-09-18|1994-10-28|COLLECT COD|SHIP|kly pending +5248|803|3|1|39|66448.20|0.05|0.03|N|O|1995-08-10|1995-07-04|1995-09-09|TAKE BACK RETURN|MAIL|yly even accounts. spe +5248|1372|49|2|45|57301.65|0.00|0.06|A|F|1995-05-09|1995-07-12|1995-05-27|DELIVER IN PERSON|FOB|. bold, pending foxes h +5249|498|86|1|31|43353.19|0.07|0.03|A|F|1994-11-21|1994-11-19|1994-12-08|NONE|REG AIR|f the excuses. furiously fin +5249|301|30|2|44|52857.20|0.05|0.00|A|F|1994-12-28|1994-11-29|1994-12-29|TAKE BACK RETURN|MAIL|ole furiousl +5249|318|47|3|13|15838.03|0.09|0.00|R|F|1994-09-27|1994-10-20|1994-10-05|DELIVER IN PERSON|SHIP|ites. finally exp +5249|1454|94|4|29|39308.05|0.00|0.05|A|F|1994-09-16|1994-11-03|1994-10-06|NONE|TRUCK| players. f +5249|1578|19|5|12|17754.84|0.01|0.08|R|F|1994-12-28|1994-11-07|1995-01-15|COLLECT COD|MAIL|press depths could have to sleep carefu +5250|436|24|1|2|2672.86|0.08|0.04|N|O|1995-08-09|1995-10-10|1995-08-13|COLLECT COD|AIR|its. final pinto +5250|1916|49|2|27|49083.57|0.10|0.05|N|O|1995-10-24|1995-09-03|1995-11-18|COLLECT COD|TRUCK|l forges are. furiously unusual pin +5251|1390|67|1|36|46490.04|0.10|0.01|N|O|1995-07-16|1995-07-05|1995-07-28|DELIVER IN PERSON|FOB|slowly! bli +5252|1410|28|1|13|17048.33|0.02|0.01|N|O|1996-03-02|1996-05-10|1996-03-11|NONE|FOB|boost fluffily across +5252|1390|29|2|39|50364.21|0.06|0.05|N|O|1996-05-17|1996-04-23|1996-05-23|COLLECT COD|AIR|gular requests. +5252|1941|74|3|9|16586.46|0.09|0.03|N|O|1996-05-30|1996-05-03|1996-06-26|TAKE BACK RETURN|RAIL|x. slyly special depos +5252|866|33|4|48|84809.28|0.01|0.06|N|O|1996-04-17|1996-03-19|1996-05-03|COLLECT COD|AIR|bold requests. furious +5252|678|41|5|24|37888.08|0.04|0.05|N|O|1996-05-11|1996-04-17|1996-05-12|COLLECT COD|REG AIR|posits after the fluffi +5252|23|99|6|41|37843.82|0.02|0.03|N|O|1996-03-16|1996-04-18|1996-03-17|NONE|TRUCK|ording to the blithely express somas sho +5253|307|64|1|35|42255.50|0.02|0.00|N|O|1995-07-23|1995-06-12|1995-08-03|DELIVER IN PERSON|AIR|ven deposits. careful +5253|1495|35|2|38|53066.62|0.02|0.06|N|O|1995-08-03|1995-06-14|1995-08-27|DELIVER IN PERSON|REG AIR|onic dependencies are furiou +5253|140|41|3|9|9361.26|0.03|0.08|N|F|1995-06-08|1995-05-12|1995-06-23|DELIVER IN PERSON|REG AIR|lyly express deposits use furiou +5253|1651|75|4|25|38816.25|0.04|0.03|A|F|1995-05-21|1995-06-13|1995-06-09|COLLECT COD|TRUCK|urts. even theodoli +5254|1102|3|1|35|35108.50|0.01|0.07|A|F|1992-07-28|1992-09-05|1992-08-07|COLLECT COD|REG AIR|ntegrate carefully among the pending +5254|1343|20|2|10|12443.40|0.05|0.04|A|F|1992-11-19|1992-10-20|1992-12-15|COLLECT COD|SHIP| accounts. silent deposit +5254|1918|7|3|32|58237.12|0.00|0.08|A|F|1992-08-10|1992-09-21|1992-08-16|NONE|RAIL|ts impress closely furi +5254|1623|65|4|45|68607.90|0.05|0.06|A|F|1992-11-11|1992-09-01|1992-12-07|COLLECT COD|REG AIR| wake. blithely silent excuse +5254|287|42|5|23|27307.44|0.02|0.06|A|F|1992-08-16|1992-09-05|1992-09-15|COLLECT COD|RAIL|lyly regular accounts. furiously pendin +5254|1577|58|6|34|50271.38|0.09|0.02|R|F|1992-08-29|1992-10-16|1992-09-20|TAKE BACK RETURN|RAIL| furiously above the furiously +5254|196|49|7|9|9865.71|0.09|0.03|R|F|1992-07-29|1992-10-15|1992-08-20|TAKE BACK RETURN|REG AIR| wake blithely fluff +5255|1308|23|1|2|2418.60|0.04|0.08|N|O|1996-09-27|1996-10-04|1996-10-04|DELIVER IN PERSON|RAIL|ajole blithely fluf +5255|1712|39|2|30|48411.30|0.04|0.08|N|O|1996-09-20|1996-08-18|1996-10-09|TAKE BACK RETURN|AIR| to the silent requests cajole b +5255|1299|11|3|41|49211.89|0.09|0.03|N|O|1996-08-21|1996-09-24|1996-09-05|COLLECT COD|FOB|tect blithely against t +5280|961|96|1|16|29791.36|0.02|0.03|N|O|1998-03-29|1998-01-28|1998-04-03|TAKE BACK RETURN|SHIP| foxes are furiously. theodoli +5280|1756|41|2|46|76256.50|0.01|0.06|N|O|1998-01-04|1998-01-21|1998-02-03|TAKE BACK RETURN|FOB|efully carefully pen +5281|1136|9|1|37|38373.81|0.05|0.02|N|O|1995-11-10|1996-01-31|1995-11-22|DELIVER IN PERSON|MAIL|ronic dependencies. fluffily final p +5281|1046|52|2|38|35987.52|0.00|0.05|N|O|1996-02-17|1995-12-19|1996-02-29|NONE|RAIL|n asymptotes could wake about th +5281|1262|100|3|23|26754.98|0.08|0.00|N|O|1995-12-30|1996-01-26|1996-01-23|COLLECT COD|REG AIR|. final theodolites cajole. ironic p +5281|865|32|4|48|84761.28|0.03|0.05|N|O|1996-01-31|1995-12-23|1996-02-08|TAKE BACK RETURN|REG AIR|ss the furiously +5281|429|59|5|33|43870.86|0.01|0.07|N|O|1996-03-01|1995-12-28|1996-03-05|COLLECT COD|RAIL|ly brave foxes. bold deposits above the +5282|1174|11|1|36|38706.12|0.05|0.02|N|O|1998-05-20|1998-04-10|1998-06-14|DELIVER IN PERSON|TRUCK|re slyly accor +5282|518|49|2|32|45392.32|0.02|0.05|N|O|1998-03-01|1998-03-31|1998-03-03|NONE|FOB|onic deposits; furiou +5282|573|64|3|28|41259.96|0.03|0.06|N|O|1998-05-06|1998-04-24|1998-05-30|COLLECT COD|SHIP|fily final instruc +5283|42|18|1|20|18840.80|0.05|0.02|A|F|1994-09-16|1994-08-03|1994-10-15|TAKE BACK RETURN|TRUCK|al deposits? blithely even pinto beans +5283|1860|4|2|1|1761.86|0.10|0.08|R|F|1994-06-20|1994-08-03|1994-07-01|COLLECT COD|FOB|deposits within the furio +5284|1725|52|1|16|26027.52|0.04|0.02|N|O|1995-08-17|1995-08-23|1995-08-26|DELIVER IN PERSON|TRUCK|unts detect furiously even d +5284|431|90|2|24|31954.32|0.03|0.08|N|O|1995-10-21|1995-08-23|1995-10-27|COLLECT COD|AIR| haggle according +5285|1930|75|1|31|56789.83|0.08|0.00|A|F|1994-04-17|1994-04-05|1994-05-09|NONE|RAIL|ubt. quickly blithe +5285|301|58|2|37|44448.10|0.09|0.02|R|F|1994-02-26|1994-02-18|1994-03-27|NONE|SHIP|uffily regu +5285|339|24|3|24|29743.92|0.02|0.04|A|F|1994-04-19|1994-04-03|1994-04-25|DELIVER IN PERSON|FOB|ess packages. quick, even deposits snooze b +5285|422|10|4|12|15869.04|0.05|0.06|A|F|1994-04-22|1994-04-07|1994-05-19|NONE|AIR| deposits-- quickly bold requests hag +5285|707|8|5|1|1607.70|0.03|0.05|R|F|1994-03-14|1994-02-20|1994-04-10|COLLECT COD|TRUCK|e fluffily about the slyly special pa +5285|1457|58|6|1|1358.45|0.06|0.01|R|F|1994-02-08|1994-04-02|1994-02-17|COLLECT COD|SHIP|ing deposits integra +5286|1986|31|1|1|1887.98|0.01|0.07|N|O|1997-11-25|1997-11-07|1997-12-17|COLLECT COD|REG AIR|ly! furiously final pack +5286|963|66|2|7|13047.72|0.06|0.05|N|O|1997-10-23|1997-12-10|1997-11-20|TAKE BACK RETURN|RAIL|y express instructions sleep carefull +5286|155|82|3|3|3165.45|0.06|0.08|N|O|1997-12-04|1997-11-06|1997-12-09|COLLECT COD|MAIL|re fluffily +5286|391|20|4|6|7748.34|0.04|0.03|N|O|1997-10-15|1997-12-05|1997-11-12|COLLECT COD|RAIL|y special a +5286|1854|55|5|38|66722.30|0.07|0.05|N|O|1997-11-29|1997-11-26|1997-12-15|TAKE BACK RETURN|SHIP|fluffily. special, ironic deposit +5286|1380|81|6|24|30753.12|0.08|0.00|N|O|1997-09-27|1997-12-21|1997-09-30|COLLECT COD|TRUCK|s. express foxes of the +5287|383|40|1|32|41068.16|0.01|0.01|A|F|1994-01-29|1994-01-27|1994-02-08|NONE|RAIL|heodolites haggle caref +5312|609|3|1|27|40759.20|0.04|0.08|A|F|1995-04-20|1995-04-09|1995-04-25|COLLECT COD|SHIP|tructions cajol +5312|11|37|2|43|39173.43|0.05|0.08|A|F|1995-03-24|1995-05-07|1995-03-28|NONE|TRUCK|ly unusual +5313|161|88|1|34|36079.44|0.10|0.02|N|O|1997-08-07|1997-08-12|1997-08-24|DELIVER IN PERSON|FOB|ccording to the blithely final account +5313|122|75|2|17|17376.04|0.00|0.02|N|O|1997-09-02|1997-08-20|1997-09-07|NONE|SHIP|uests wake +5313|1118|91|3|47|47898.17|0.06|0.08|N|O|1997-08-12|1997-08-18|1997-08-13|TAKE BACK RETURN|RAIL|pinto beans across the +5313|1966|99|4|16|29887.36|0.08|0.00|N|O|1997-10-04|1997-08-02|1997-10-25|COLLECT COD|REG AIR|ckages wake carefully aga +5313|720|85|5|30|48621.60|0.06|0.08|N|O|1997-06-27|1997-07-18|1997-06-30|NONE|SHIP|nding packages use +5313|1200|73|6|21|23125.20|0.05|0.05|N|O|1997-09-26|1997-09-02|1997-10-18|COLLECT COD|FOB|he blithely regular packages. quickly +5314|1173|74|1|10|10741.70|0.07|0.05|N|O|1995-09-26|1995-07-24|1995-10-19|DELIVER IN PERSON|RAIL|latelets haggle final +5314|1248|49|2|16|18387.84|0.00|0.04|N|O|1995-09-25|1995-07-08|1995-10-17|COLLECT COD|SHIP|hely unusual packages acc +5315|346|31|1|12|14956.08|0.08|0.06|R|F|1992-12-18|1993-01-16|1993-01-10|NONE|AIR|ccounts. furiously ironi +5315|1787|88|2|39|65862.42|0.00|0.06|R|F|1992-11-09|1992-12-29|1992-12-07|NONE|SHIP|ly alongside of the ca +5316|1078|14|1|29|28393.03|0.10|0.05|R|F|1994-03-28|1994-04-29|1994-04-09|DELIVER IN PERSON|REG AIR|ckly unusual foxes bo +5316|1352|53|2|31|38853.85|0.00|0.08|A|F|1994-04-01|1994-04-21|1994-04-12|DELIVER IN PERSON|MAIL|s. deposits cajole around t +5317|811|11|1|29|49642.49|0.02|0.06|A|F|1994-11-28|1994-11-27|1994-12-16|COLLECT COD|FOB|oss the carefull +5317|1703|4|2|18|28884.60|0.06|0.06|A|F|1995-01-02|1994-10-29|1995-01-16|NONE|RAIL|g to the blithely p +5317|1192|29|3|37|40448.03|0.09|0.00|R|F|1994-09-15|1994-10-24|1994-09-23|NONE|TRUCK|totes nag theodolites. pend +5317|665|97|4|50|78283.00|0.09|0.01|A|F|1994-10-17|1994-10-25|1994-11-03|NONE|REG AIR|cajole furiously. accounts use quick +5317|948|17|5|19|35129.86|0.07|0.07|R|F|1994-12-15|1994-10-18|1994-12-27|NONE|MAIL|onic requests boost bli +5317|1148|85|6|48|50358.72|0.01|0.03|A|F|1994-09-19|1994-11-25|1994-10-03|COLLECT COD|MAIL|ts about the packages cajole furio +5317|1685|9|7|30|47600.40|0.07|0.07|A|F|1994-10-13|1994-10-31|1994-10-28|NONE|AIR|cross the attainments. slyly +5318|601|95|1|13|19520.80|0.10|0.04|R|F|1993-07-15|1993-06-25|1993-08-13|COLLECT COD|REG AIR|ly silent ideas. ideas haggle among the +5318|1796|97|2|26|44142.54|0.00|0.04|R|F|1993-07-07|1993-05-23|1993-07-28|COLLECT COD|SHIP|al, express foxes. bold requests sleep alwa +5318|62|88|3|37|35596.22|0.07|0.05|A|F|1993-07-09|1993-06-22|1993-07-21|COLLECT COD|SHIP|ickly final deposi +5318|1413|92|4|31|40746.71|0.01|0.04|R|F|1993-07-28|1993-05-06|1993-08-06|DELIVER IN PERSON|REG AIR|requests must sleep slyly quickly +5319|1498|16|1|31|43384.19|0.04|0.07|N|O|1996-03-26|1996-03-07|1996-04-24|COLLECT COD|TRUCK|d carefully about the courts. fluffily spe +5319|433|21|2|39|52003.77|0.09|0.05|N|O|1996-05-17|1996-03-14|1996-06-11|NONE|TRUCK|unts. furiously silent +5344|182|9|1|6|6493.08|0.07|0.01|N|O|1998-08-04|1998-09-03|1998-08-11|TAKE BACK RETURN|REG AIR|ithely about the pending plate +5344|782|15|2|37|62262.86|0.03|0.07|N|O|1998-10-09|1998-07-26|1998-11-08|NONE|TRUCK|thely express packages +5344|663|64|3|26|40655.16|0.02|0.06|N|O|1998-08-27|1998-08-22|1998-09-24|NONE|AIR|furiously pending, silent multipliers. +5344|382|39|4|21|26929.98|0.03|0.01|N|O|1998-08-31|1998-09-06|1998-09-02|NONE|MAIL|xes. furiously even pinto beans sleep f +5345|826|60|1|3|5180.46|0.05|0.01|N|O|1997-12-10|1997-10-03|1998-01-05|COLLECT COD|SHIP|ites wake carefully unusual +5345|1457|75|2|2|2716.90|0.10|0.02|N|O|1997-11-18|1997-10-12|1997-12-08|NONE|MAIL|ut the slyly specia +5345|1911|100|3|46|83393.86|0.06|0.04|N|O|1997-10-06|1997-09-27|1997-10-18|COLLECT COD|REG AIR|slyly special deposits. fin +5345|1137|46|4|37|38410.81|0.01|0.01|N|O|1997-11-01|1997-10-09|1997-11-26|DELIVER IN PERSON|AIR| along the ironically fina +5345|336|65|5|22|27199.26|0.02|0.02|N|O|1997-08-27|1997-11-22|1997-09-10|TAKE BACK RETURN|MAIL|leep slyly regular fox +5346|1482|100|1|21|29053.08|0.07|0.08|R|F|1994-03-11|1994-03-07|1994-04-04|DELIVER IN PERSON|RAIL|integrate blithely a +5346|1917|6|2|13|23645.83|0.04|0.04|A|F|1994-02-03|1994-02-05|1994-02-09|COLLECT COD|TRUCK|y. fluffily bold accounts grow. furio +5346|1089|25|3|7|6930.56|0.08|0.05|A|F|1994-01-30|1994-03-26|1994-01-31|DELIVER IN PERSON|SHIP|equests use carefully care +5346|1613|14|4|35|53011.35|0.06|0.02|A|F|1994-02-09|1994-03-01|1994-02-14|TAKE BACK RETURN|FOB|nic excuses cajole entic +5346|1206|7|5|25|27680.00|0.05|0.06|R|F|1993-12-28|1994-03-19|1994-01-09|TAKE BACK RETURN|REG AIR|he ironic ideas are boldly slyly ironi +5346|330|15|6|6|7381.98|0.08|0.04|R|F|1994-03-01|1994-02-04|1994-03-09|NONE|REG AIR|escapades sleep furiously beside the +5346|793|58|7|41|69445.39|0.05|0.04|R|F|1994-01-10|1994-02-15|1994-01-26|TAKE BACK RETURN|REG AIR|fully close instructi +5347|823|90|1|48|82743.36|0.04|0.08|A|F|1995-02-25|1995-04-26|1995-03-26|NONE|SHIP|equests are slyly. blithely regu +5347|1235|10|2|47|53402.81|0.02|0.01|N|F|1995-06-05|1995-03-29|1995-06-28|COLLECT COD|AIR|across the slyly bol +5347|229|84|3|34|38393.48|0.06|0.00|A|F|1995-05-18|1995-04-04|1995-06-02|DELIVER IN PERSON|SHIP| pending deposits. fluffily regular senti +5347|395|96|4|4|5181.56|0.06|0.03|A|F|1995-03-24|1995-04-03|1995-04-01|NONE|SHIP|ldly pending asymptotes ki +5347|1308|85|5|21|25395.30|0.08|0.04|R|F|1995-04-01|1995-04-16|1995-04-23|NONE|SHIP|sly slyly final requests. careful +5347|555|16|6|6|8733.30|0.06|0.02|A|F|1995-04-11|1995-04-14|1995-05-02|NONE|TRUCK|lly unusual ideas. sl +5347|496|26|7|18|25136.82|0.01|0.01|N|F|1995-05-24|1995-05-07|1995-06-19|NONE|FOB|he ideas among the requests +5348|685|79|1|21|33299.28|0.10|0.04|N|O|1997-12-11|1997-12-24|1997-12-28|NONE|REG AIR| regular theodolites haggle car +5348|1559|40|2|31|45277.05|0.07|0.02|N|O|1998-01-04|1997-12-09|1998-01-17|COLLECT COD|RAIL|are finally +5348|167|68|3|16|17074.56|0.06|0.08|N|O|1998-02-28|1997-12-25|1998-03-12|DELIVER IN PERSON|AIR|uriously thin pinto beans +5348|192|19|4|7|7645.33|0.04|0.00|N|O|1998-01-29|1997-12-20|1998-02-10|DELIVER IN PERSON|RAIL|even foxes. epitap +5348|19|45|5|37|34003.37|0.06|0.07|N|O|1997-12-01|1998-02-02|1997-12-07|NONE|FOB|y according to the carefully pending acco +5348|1429|69|6|14|18625.88|0.06|0.05|N|O|1997-12-16|1998-01-12|1997-12-24|COLLECT COD|FOB|en pinto beans. somas cajo +5349|1551|52|1|19|27598.45|0.06|0.01|N|O|1996-09-11|1996-11-18|1996-09-22|TAKE BACK RETURN|FOB|endencies use whithout the special +5349|1672|96|2|14|22031.38|0.06|0.00|N|O|1996-11-07|1996-11-17|1996-11-20|TAKE BACK RETURN|TRUCK|fully regular +5349|35|36|3|6|5610.18|0.10|0.01|N|O|1996-12-30|1996-10-08|1997-01-01|DELIVER IN PERSON|MAIL|inal deposits affix carefully +5350|1211|12|1|19|21131.99|0.02|0.06|R|F|1993-10-20|1993-11-15|1993-11-17|DELIVER IN PERSON|RAIL|romise slyly alongsi +5350|1909|98|2|44|79679.60|0.04|0.06|R|F|1993-10-30|1993-11-23|1993-11-25|DELIVER IN PERSON|AIR|p above the ironic, pending dep +5350|531|92|3|12|17178.36|0.10|0.04|A|F|1994-01-30|1993-11-21|1994-02-15|COLLECT COD|REG AIR| cajole. even instructions haggle. blithe +5350|1550|31|4|7|10160.85|0.08|0.00|R|F|1993-10-19|1993-12-28|1993-11-04|NONE|SHIP|alongside of th +5350|1288|89|5|27|32110.56|0.07|0.04|A|F|1993-11-25|1993-12-27|1993-12-08|COLLECT COD|TRUCK|es. blithe theodolites haggl +5351|61|12|1|36|34598.16|0.06|0.05|N|O|1998-07-27|1998-07-06|1998-08-25|NONE|MAIL|ss the ironic, regular asymptotes cajole +5351|321|50|2|47|57402.04|0.04|0.01|N|O|1998-05-30|1998-08-08|1998-06-23|DELIVER IN PERSON|REG AIR|s. grouches cajole. sile +5351|1054|60|3|2|1910.10|0.00|0.02|N|O|1998-05-12|1998-07-15|1998-05-24|NONE|TRUCK|g accounts wake furiously slyly even dolph +5376|608|2|1|42|63361.20|0.10|0.04|A|F|1994-09-20|1994-08-30|1994-09-29|TAKE BACK RETURN|REG AIR|y even asymptotes. courts are unusual pa +5376|910|79|2|44|79680.04|0.05|0.02|R|F|1994-08-30|1994-08-05|1994-09-07|COLLECT COD|AIR|ithe packages detect final theodolites. f +5376|649|50|3|18|27893.52|0.02|0.08|A|F|1994-10-29|1994-09-13|1994-11-01|COLLECT COD|MAIL| accounts boo +5377|782|47|1|40|67311.20|0.00|0.04|N|O|1997-05-21|1997-06-15|1997-05-26|DELIVER IN PERSON|AIR|lithely ironic theodolites are care +5377|294|76|2|17|20302.93|0.09|0.00|N|O|1997-07-05|1997-05-25|1997-07-22|COLLECT COD|RAIL|dencies. carefully regular re +5377|1025|96|3|23|21298.46|0.07|0.08|N|O|1997-06-26|1997-07-13|1997-07-08|COLLECT COD|RAIL| silent wa +5377|1032|68|4|12|11196.36|0.05|0.07|N|O|1997-05-08|1997-06-15|1997-05-15|DELIVER IN PERSON|MAIL| ironic, final +5377|1723|66|5|27|43867.44|0.08|0.02|N|O|1997-07-11|1997-06-12|1997-08-08|TAKE BACK RETURN|MAIL|press theodolites. e +5378|1548|89|1|39|56532.06|0.07|0.04|R|F|1992-11-25|1992-12-22|1992-12-02|COLLECT COD|AIR|ts are quickly around the +5378|611|74|2|46|69534.06|0.01|0.04|A|F|1993-02-17|1993-01-20|1993-02-26|COLLECT COD|REG AIR|into beans sleep. fu +5378|98|74|3|18|17965.62|0.02|0.03|R|F|1992-11-25|1992-12-21|1992-12-10|COLLECT COD|FOB|onic accounts was bold, +5379|1988|33|1|40|75599.20|0.01|0.08|N|O|1995-10-01|1995-10-19|1995-10-30|COLLECT COD|MAIL|carefully final accounts haggle blithely. +5380|1813|14|1|14|24007.34|0.10|0.01|N|O|1997-12-18|1997-12-03|1998-01-06|NONE|RAIL|final platelets. +5380|1464|82|2|10|13654.60|0.09|0.05|N|O|1997-11-24|1998-01-10|1997-12-21|COLLECT COD|AIR|refully pending deposits. special, even t +5380|1838|82|3|40|69593.20|0.02|0.08|N|O|1997-12-30|1997-11-27|1998-01-09|DELIVER IN PERSON|SHIP|ar asymptotes. blithely r +5380|658|21|4|6|9351.90|0.09|0.05|N|O|1997-11-15|1998-01-08|1997-12-11|COLLECT COD|MAIL|es. fluffily brave accounts across t +5380|1068|69|5|48|46514.88|0.04|0.03|N|O|1997-12-01|1997-12-28|1997-12-05|DELIVER IN PERSON|FOB|encies haggle car +5381|1874|18|1|37|65707.19|0.04|0.01|A|F|1993-04-08|1993-04-07|1993-04-12|DELIVER IN PERSON|SHIP|ly final deposits print carefully. unusua +5381|1101|74|2|48|48100.80|0.04|0.03|R|F|1993-04-22|1993-04-17|1993-05-14|TAKE BACK RETURN|FOB|luffily spec +5381|1911|12|3|13|23567.83|0.08|0.03|R|F|1993-05-09|1993-04-26|1993-05-25|NONE|FOB|s after the f +5381|1673|97|4|17|26769.39|0.05|0.05|R|F|1993-05-25|1993-04-14|1993-06-17|NONE|MAIL|ckly final requests haggle qui +5381|624|18|5|49|74706.38|0.06|0.02|R|F|1993-05-08|1993-04-07|1993-06-03|NONE|FOB| accounts. regular, regula +5381|1311|88|6|33|40006.23|0.10|0.00|A|F|1993-04-09|1993-04-03|1993-04-22|DELIVER IN PERSON|SHIP|ly special deposits +5381|434|22|7|31|41367.33|0.04|0.05|A|F|1993-04-10|1993-03-22|1993-04-13|TAKE BACK RETURN|MAIL|the carefully expre +5382|1530|11|1|34|48672.02|0.03|0.03|R|F|1992-02-22|1992-02-18|1992-03-02|DELIVER IN PERSON|FOB|gular accounts. even accounts integrate +5382|549|80|2|13|18844.02|0.09|0.06|A|F|1992-01-16|1992-03-12|1992-02-06|NONE|MAIL|eodolites. final foxes +5382|1481|82|3|3|4147.44|0.10|0.06|A|F|1992-03-22|1992-03-06|1992-04-19|TAKE BACK RETURN|AIR|efully unusua +5382|618|81|4|20|30372.20|0.08|0.02|A|F|1992-03-26|1992-02-17|1992-04-15|DELIVER IN PERSON|FOB|carefully regular accounts. slyly ev +5382|1763|64|5|14|23306.64|0.02|0.02|A|F|1992-04-05|1992-04-05|1992-05-04|TAKE BACK RETURN|FOB| brave platelets. ev +5382|1798|83|6|6|10198.74|0.02|0.01|A|F|1992-03-07|1992-04-02|1992-03-18|TAKE BACK RETURN|FOB|y final foxes by the sl +5382|1044|50|7|48|45361.92|0.05|0.05|A|F|1992-02-14|1992-03-19|1992-02-25|DELIVER IN PERSON|REG AIR|nts integrate quickly ca +5383|952|53|1|12|22235.40|0.04|0.00|N|O|1995-07-02|1995-08-16|1995-08-01|TAKE BACK RETURN|AIR|y regular instructi +5408|1020|91|1|2|1842.04|0.07|0.04|R|F|1992-08-21|1992-10-03|1992-08-28|DELIVER IN PERSON|MAIL|cross the dolphins h +5408|1178|15|2|35|37770.95|0.04|0.05|R|F|1992-10-02|1992-10-17|1992-10-13|TAKE BACK RETURN|AIR|thely ironic requests alongside of the sl +5408|752|85|3|34|56193.50|0.10|0.02|A|F|1992-10-22|1992-08-25|1992-11-16|DELIVER IN PERSON|TRUCK|requests detect blithely a +5408|532|63|4|48|68761.44|0.04|0.05|R|F|1992-09-30|1992-08-27|1992-10-27|NONE|TRUCK|. furiously regular +5408|1826|13|5|8|13822.56|0.03|0.07|A|F|1992-10-24|1992-09-06|1992-11-03|NONE|AIR|thely regular hocke +5409|1934|67|1|27|49570.11|0.01|0.02|A|F|1992-02-14|1992-03-18|1992-02-23|DELIVER IN PERSON|AIR|eodolites +5409|1036|37|2|38|35607.14|0.01|0.02|A|F|1992-03-17|1992-03-29|1992-04-13|NONE|REG AIR|onic, regular accounts! blithely even +5409|1404|22|3|17|22191.80|0.07|0.00|A|F|1992-01-13|1992-04-05|1992-01-20|DELIVER IN PERSON|AIR|cross the sil +5409|5|81|4|9|8145.00|0.07|0.03|A|F|1992-02-15|1992-04-02|1992-02-28|DELIVER IN PERSON|AIR| unusual, unusual reques +5409|1582|83|5|37|54892.46|0.06|0.04|R|F|1992-05-07|1992-02-10|1992-05-20|DELIVER IN PERSON|FOB|ously regular packages. packages +5409|640|72|6|14|21568.96|0.03|0.08|R|F|1992-02-14|1992-03-26|1992-02-29|DELIVER IN PERSON|AIR|osits cajole furiously +5410|1168|69|1|48|51319.68|0.04|0.08|N|O|1998-09-27|1998-09-11|1998-10-01|TAKE BACK RETURN|AIR| about the slyly even courts. quickly regul +5410|1045|81|2|41|38787.64|0.01|0.07|N|O|1998-08-25|1998-10-20|1998-09-01|DELIVER IN PERSON|REG AIR|sly. slyly ironic theodolites +5410|281|9|3|40|47251.20|0.07|0.08|N|O|1998-11-17|1998-10-02|1998-11-27|COLLECT COD|TRUCK|iously special accounts are along th +5410|496|26|4|8|11171.92|0.05|0.04|N|O|1998-09-12|1998-10-22|1998-09-22|DELIVER IN PERSON|TRUCK|ly. fluffily ironic platelets alon +5411|955|24|1|17|31551.15|0.05|0.01|N|O|1997-07-22|1997-07-14|1997-07-30|TAKE BACK RETURN|REG AIR| slyly slyly even deposits. carefully b +5411|1121|58|2|10|10221.20|0.08|0.01|N|O|1997-07-19|1997-08-04|1997-07-26|TAKE BACK RETURN|MAIL|nding, special foxes unw +5411|551|52|3|5|7257.75|0.10|0.01|N|O|1997-09-12|1997-08-03|1997-09-23|DELIVER IN PERSON|FOB| bold, ironic theodo +5411|1286|61|4|15|17809.20|0.08|0.05|N|O|1997-07-01|1997-07-15|1997-07-07|COLLECT COD|RAIL|attainments sleep slyly ironic +5411|31|32|5|19|17689.57|0.05|0.08|N|O|1997-05-25|1997-07-30|1997-06-19|COLLECT COD|RAIL|ial accounts according to the f +5412|531|92|1|2|2863.06|0.03|0.07|N|O|1998-04-14|1998-04-02|1998-04-19|TAKE BACK RETURN|REG AIR| sleep above the furiou +5412|652|46|2|48|74527.20|0.01|0.08|N|O|1998-02-22|1998-03-28|1998-03-18|TAKE BACK RETURN|TRUCK|s. slyly final packages cajole blithe +5412|737|34|3|31|50769.63|0.05|0.08|N|O|1998-03-23|1998-04-17|1998-04-10|NONE|SHIP|t the accounts detect slyly about the c +5412|964|33|4|26|48488.96|0.02|0.08|N|O|1998-01-22|1998-04-19|1998-02-17|NONE|AIR| the blithel +5413|1255|56|1|48|55500.00|0.02|0.08|N|O|1998-01-25|1997-11-20|1998-02-22|COLLECT COD|SHIP| theodolites. furiously ironic instr +5413|1419|59|2|37|48855.17|0.02|0.07|N|O|1997-12-08|1998-01-01|1997-12-13|COLLECT COD|TRUCK|usly bold instructions affix idly unusual, +5413|1109|82|3|36|36363.60|0.02|0.07|N|O|1997-12-12|1997-11-28|1997-12-25|NONE|TRUCK|ular, regular ideas mold! final requests +5413|1093|29|4|22|21869.98|0.02|0.08|N|O|1997-11-10|1997-11-24|1997-11-22|DELIVER IN PERSON|FOB|posits. quick +5413|1887|17|5|5|8944.40|0.10|0.01|N|O|1997-11-28|1997-11-24|1997-12-05|NONE|RAIL|tes are al +5413|1891|92|6|32|57372.48|0.02|0.03|N|O|1997-10-28|1998-01-03|1997-11-10|NONE|TRUCK|refully special package +5413|301|30|7|32|38441.60|0.06|0.07|N|O|1997-10-23|1997-12-09|1997-11-17|NONE|TRUCK|he quickly ironic ideas. slyly ironic ide +5414|671|72|1|40|62866.80|0.07|0.06|R|F|1993-04-07|1993-05-18|1993-04-23|COLLECT COD|AIR|ts are evenly across +5414|1222|60|2|48|53914.56|0.06|0.07|R|F|1993-06-08|1993-05-14|1993-07-06|DELIVER IN PERSON|FOB| silent dolphins; fluffily regular tithe +5414|348|33|3|23|28711.82|0.10|0.00|A|F|1993-07-22|1993-05-26|1993-08-08|COLLECT COD|MAIL|e bold, express dolphins. spec +5414|1321|22|4|15|18334.80|0.06|0.08|R|F|1993-05-18|1993-06-09|1993-05-27|DELIVER IN PERSON|REG AIR|e slyly about the carefully regula +5414|84|10|5|19|18697.52|0.01|0.05|R|F|1993-04-06|1993-05-12|1993-05-02|DELIVER IN PERSON|RAIL|ffily silent theodolites na +5414|972|41|6|28|52443.16|0.10|0.05|A|F|1993-03-27|1993-06-04|1993-04-07|TAKE BACK RETURN|SHIP|ts sleep sl +5415|1018|54|1|44|40436.44|0.00|0.06|A|F|1992-08-19|1992-10-26|1992-09-17|TAKE BACK RETURN|TRUCK| requests. unusual theodolites sleep agains +5415|303|88|2|16|19252.80|0.08|0.00|A|F|1992-09-29|1992-09-12|1992-10-10|NONE|AIR|pinto beans haggle furiously +5415|1011|82|3|6|5472.06|0.10|0.03|A|F|1992-10-28|1992-09-09|1992-11-20|COLLECT COD|RAIL|ges around the fur +5415|151|52|4|43|45199.45|0.01|0.02|R|F|1992-11-17|1992-09-14|1992-12-14|DELIVER IN PERSON|SHIP|yly blithely stealthy deposits. carefu +5415|1601|25|5|11|16528.60|0.00|0.01|R|F|1992-11-22|1992-10-19|1992-12-10|DELIVER IN PERSON|SHIP|gle among t +5415|1438|78|6|46|61613.78|0.03|0.03|R|F|1992-08-25|1992-09-10|1992-09-22|DELIVER IN PERSON|REG AIR|ve the fluffily +5415|1530|31|7|11|15746.83|0.08|0.06|A|F|1992-08-21|1992-09-04|1992-08-23|NONE|TRUCK|unts maintain carefully unusual +5440|1141|14|1|3|3126.42|0.02|0.08|N|O|1997-02-18|1997-02-28|1997-03-15|NONE|SHIP|y. accounts haggle along the blit +5441|1635|18|1|3|4609.89|0.00|0.02|R|F|1994-08-12|1994-10-14|1994-09-01|TAKE BACK RETURN|REG AIR|are. unusual, +5441|1308|9|2|49|59255.70|0.02|0.03|A|F|1994-09-23|1994-09-22|1994-10-22|NONE|FOB|ording to the furio +5441|1431|49|3|33|43970.19|0.09|0.02|R|F|1994-10-09|1994-10-06|1994-10-30|DELIVER IN PERSON|TRUCK|ges. final instruction +5441|662|25|4|47|73445.02|0.07|0.08|R|F|1994-11-19|1994-10-16|1994-12-16|TAKE BACK RETURN|FOB|ounts wake slyly about the express instr +5442|420|79|1|16|21126.72|0.00|0.00|N|O|1998-04-12|1998-03-03|1998-05-04|TAKE BACK RETURN|RAIL|r packages. accounts haggle dependencies. f +5442|872|72|2|45|79779.15|0.08|0.01|N|O|1998-03-30|1998-02-24|1998-04-18|TAKE BACK RETURN|AIR|old slyly after +5442|604|67|3|12|18055.20|0.01|0.08|N|O|1998-04-15|1998-03-18|1998-05-05|DELIVER IN PERSON|TRUCK|fully final +5442|1573|74|4|21|30965.97|0.07|0.06|N|O|1998-03-13|1998-02-19|1998-04-06|COLLECT COD|MAIL|ffily furiously ironic theodolites. furio +5442|160|61|5|25|26504.00|0.04|0.00|N|O|1998-03-29|1998-02-13|1998-04-13|TAKE BACK RETURN|REG AIR|ake furiously. slyly express th +5442|1436|54|6|26|34773.18|0.08|0.07|N|O|1998-03-21|1998-03-21|1998-03-25|TAKE BACK RETURN|AIR|have to sleep furiously bold ideas. blith +5443|1773|74|1|14|23446.78|0.02|0.00|N|O|1996-10-27|1996-11-11|1996-11-21|DELIVER IN PERSON|RAIL|s after the regular, regular deposits hag +5443|714|15|2|39|62973.69|0.03|0.07|N|O|1996-11-01|1996-11-30|1996-11-19|NONE|RAIL|gage carefully across the furiously +5443|1598|79|3|25|37489.75|0.05|0.00|N|O|1996-12-07|1997-01-08|1997-01-05|NONE|FOB|use carefully above the pinto bea +5443|1902|91|4|6|10823.40|0.05|0.02|N|O|1996-11-17|1996-12-03|1996-11-30|TAKE BACK RETURN|AIR|p fluffily foxe +5443|828|62|5|40|69152.80|0.03|0.03|N|O|1997-01-28|1996-12-10|1997-02-13|NONE|FOB|n courts. special re +5444|1856|86|1|21|36914.85|0.01|0.07|A|F|1995-04-11|1995-04-25|1995-04-21|DELIVER IN PERSON|RAIL|ar packages haggle above th +5444|422|81|2|40|52896.80|0.05|0.08|N|O|1995-07-09|1995-04-25|1995-07-19|COLLECT COD|TRUCK|ously bold ideas. instructions wake slyl +5444|1499|17|3|40|56019.60|0.08|0.01|A|F|1995-04-06|1995-05-08|1995-05-06|DELIVER IN PERSON|AIR| even packages. +5444|590|51|4|33|49189.47|0.05|0.04|N|O|1995-06-24|1995-04-24|1995-07-13|DELIVER IN PERSON|SHIP|ut the courts cajole blithely excuses +5444|1707|34|5|21|33782.70|0.04|0.00|R|F|1995-05-05|1995-05-25|1995-05-29|TAKE BACK RETURN|REG AIR|aves serve sly +5444|191|44|6|21|22914.99|0.07|0.01|A|F|1995-03-30|1995-05-01|1995-03-31|COLLECT COD|AIR|furiously even theodolites. +5445|892|59|1|33|59165.37|0.08|0.07|A|F|1993-10-21|1993-10-14|1993-10-28|DELIVER IN PERSON|REG AIR|ests. final instructions +5445|1302|3|2|12|14439.60|0.09|0.08|R|F|1993-11-02|1993-09-05|1993-11-26|COLLECT COD|FOB| slyly pending pinto beans was slyly al +5445|1029|100|3|46|42780.92|0.04|0.07|A|F|1993-10-06|1993-09-15|1993-10-28|DELIVER IN PERSON|RAIL|old depend +5445|1487|88|4|10|13884.80|0.08|0.06|A|F|1993-09-16|1993-10-05|1993-10-01|NONE|TRUCK|ncies abou +5445|125|78|5|14|14351.68|0.00|0.02|R|F|1993-11-19|1993-10-18|1993-12-07|NONE|RAIL| requests. bravely i +5446|1894|81|1|27|48489.03|0.05|0.07|R|F|1994-07-21|1994-08-25|1994-08-17|TAKE BACK RETURN|RAIL|ously across the quic +5447|986|21|1|31|58496.38|0.09|0.03|N|O|1996-07-14|1996-05-07|1996-07-17|COLLECT COD|SHIP| foxes sleep. blithely unusual accounts det +5472|590|91|1|27|40245.93|0.09|0.06|A|F|1993-08-04|1993-07-07|1993-09-03|COLLECT COD|TRUCK|fily pending attainments. unus +5472|677|71|2|28|44174.76|0.00|0.03|A|F|1993-07-28|1993-05-28|1993-08-11|TAKE BACK RETURN|FOB|ffily pendin +5472|1773|58|3|45|75364.65|0.06|0.02|R|F|1993-06-05|1993-05-14|1993-06-10|NONE|TRUCK| idle packages. furi +5472|1837|24|4|37|64336.71|0.07|0.05|R|F|1993-06-15|1993-07-03|1993-07-09|DELIVER IN PERSON|RAIL|egrate carefully dependencies. +5472|741|42|5|40|65669.60|0.02|0.05|A|F|1993-04-13|1993-07-04|1993-05-04|NONE|REG AIR|e requests detect furiously. ruthlessly un +5472|1670|94|6|39|61295.13|0.02|0.03|R|F|1993-04-18|1993-07-10|1993-05-12|TAKE BACK RETURN|MAIL|uriously carefully +5472|144|23|7|1|1044.14|0.03|0.02|A|F|1993-04-14|1993-06-28|1993-04-16|NONE|RAIL|s use furiou +5473|479|9|1|9|12415.23|0.03|0.07|R|F|1992-06-03|1992-05-30|1992-06-09|TAKE BACK RETURN|AIR| excuses sleep blithely! regular dep +5473|692|93|2|27|43002.63|0.01|0.03|A|F|1992-04-06|1992-04-26|1992-04-29|TAKE BACK RETURN|MAIL|the deposits. warthogs wake fur +5473|145|24|3|33|34489.62|0.09|0.00|R|F|1992-05-18|1992-06-10|1992-06-13|TAKE BACK RETURN|MAIL|efully above the even, +5474|1838|39|1|38|66113.54|0.01|0.08|A|F|1992-07-15|1992-07-16|1992-07-20|NONE|REG AIR| slyly beneath +5474|937|40|2|10|18379.30|0.06|0.00|R|F|1992-08-08|1992-08-10|1992-08-24|TAKE BACK RETURN|TRUCK|pinto bean +5474|479|38|3|31|42763.57|0.00|0.08|R|F|1992-08-02|1992-07-12|1992-08-04|NONE|TRUCK|the furiously express ideas. speci +5474|896|63|4|46|82656.94|0.03|0.04|A|F|1992-06-07|1992-07-11|1992-06-22|NONE|TRUCK|nstructions. furio +5475|1825|55|1|10|17268.20|0.09|0.08|N|O|1996-07-19|1996-08-22|1996-07-23|COLLECT COD|AIR|ding to the deposits wake fina +5476|477|36|1|13|17907.11|0.01|0.04|N|O|1997-12-27|1997-12-08|1997-12-29|COLLECT COD|TRUCK|iously special ac +5476|197|24|2|17|18652.23|0.10|0.01|N|O|1998-02-02|1998-01-28|1998-02-14|COLLECT COD|FOB|ng dependencies until the f +5477|793|90|1|20|33875.80|0.03|0.01|N|O|1998-03-21|1998-02-09|1998-04-07|TAKE BACK RETURN|SHIP|platelets about the ironic +5477|762|95|2|21|34917.96|0.03|0.00|N|O|1998-01-28|1998-02-15|1998-02-24|TAKE BACK RETURN|SHIP|blate slyly. silent +5477|1338|39|3|31|38419.23|0.04|0.01|N|O|1998-01-11|1998-01-30|1998-02-04|DELIVER IN PERSON|MAIL| special Tiresias cajole furiously. pending +5477|1922|11|4|16|29182.72|0.00|0.01|N|O|1998-03-07|1998-03-12|1998-04-06|COLLECT COD|RAIL|regular, s +5477|958|27|5|23|42755.85|0.00|0.06|N|O|1998-01-04|1998-02-23|1998-01-24|NONE|REG AIR|telets wake blithely ab +5477|1204|42|6|19|20998.80|0.10|0.03|N|O|1998-02-03|1998-01-30|1998-03-04|TAKE BACK RETURN|MAIL|ost carefully packages. +5478|73|74|1|39|37949.73|0.09|0.06|N|O|1996-08-19|1996-06-25|1996-09-08|DELIVER IN PERSON|SHIP|s. furiously +5478|11|37|2|47|42817.47|0.10|0.01|N|O|1996-08-15|1996-07-12|1996-08-31|NONE|RAIL| instructions; slyly even accounts hagg +5478|1189|26|3|25|27254.50|0.09|0.07|N|O|1996-06-08|1996-07-12|1996-07-07|NONE|TRUCK|unusual, pending requests haggle accoun +5479|1378|17|1|50|63968.50|0.02|0.02|A|F|1993-12-24|1994-02-14|1994-01-18|DELIVER IN PERSON|MAIL|ironic gifts. even dependencies sno +5479|1040|41|2|19|17879.76|0.05|0.03|A|F|1994-01-22|1994-03-07|1994-02-11|DELIVER IN PERSON|SHIP|arefully bo +5504|672|35|1|4|6290.68|0.10|0.07|A|F|1993-04-30|1993-03-01|1993-05-22|DELIVER IN PERSON|AIR|into beans boost. +5504|1761|62|2|7|11639.32|0.03|0.05|R|F|1993-04-25|1993-03-15|1993-05-06|NONE|TRUCK|packages detect furiously express reques +5504|1596|17|3|29|43430.11|0.05|0.03|A|F|1993-01-28|1993-02-13|1993-02-27|NONE|SHIP|ajole carefully. care +5505|246|28|1|43|49288.32|0.07|0.01|N|O|1997-12-30|1997-11-28|1998-01-09|TAKE BACK RETURN|TRUCK|y alongside of the special requests. +5505|1815|45|2|33|56654.73|0.05|0.08|N|O|1998-01-11|1997-11-11|1998-01-30|TAKE BACK RETURN|AIR|ithely unusual excuses integrat +5505|1547|28|3|10|14485.40|0.06|0.01|N|O|1997-10-28|1997-11-27|1997-10-29|DELIVER IN PERSON|AIR| furiously special asym +5505|395|52|4|18|23317.02|0.04|0.04|N|O|1997-10-25|1997-12-12|1997-10-30|TAKE BACK RETURN|RAIL| to the quickly express pac +5505|1620|3|5|46|69994.52|0.05|0.00|N|O|1998-01-06|1997-11-04|1998-02-04|TAKE BACK RETURN|SHIP|usly ironic dependencies haggle across +5506|1394|95|1|2|2590.78|0.00|0.03|R|F|1994-02-04|1994-01-13|1994-02-17|COLLECT COD|MAIL|onic theodolites are fluffil +5506|1591|92|2|6|8955.54|0.07|0.06|R|F|1994-02-21|1994-01-30|1994-02-27|DELIVER IN PERSON|MAIL|hely according to the furiously unusua +5507|96|47|1|23|22910.07|0.05|0.04|N|O|1998-09-04|1998-07-04|1998-09-18|TAKE BACK RETURN|AIR|ously slow packages poach whithout the +5507|1377|78|2|48|61361.76|0.03|0.01|N|O|1998-08-03|1998-08-10|1998-08-24|DELIVER IN PERSON|AIR|yly idle deposits. final, final fox +5507|447|77|3|4|5389.76|0.04|0.06|N|O|1998-06-06|1998-07-02|1998-06-27|TAKE BACK RETURN|RAIL|into beans are +5507|669|1|4|22|34532.52|0.07|0.01|N|O|1998-07-08|1998-08-10|1998-07-22|DELIVER IN PERSON|TRUCK|gular ideas. carefully unu +5507|1315|16|5|48|58382.88|0.06|0.01|N|O|1998-07-21|1998-07-15|1998-07-31|DELIVER IN PERSON|SHIP|uriously regular acc +5508|1170|79|1|4|4284.68|0.10|0.04|N|O|1996-09-01|1996-08-02|1996-09-17|COLLECT COD|AIR|fluffily about the even +5509|1967|56|1|3|5606.88|0.03|0.02|A|F|1994-06-14|1994-05-11|1994-06-17|NONE|SHIP| quickly fin +5509|986|89|2|17|32078.66|0.03|0.07|R|F|1994-07-01|1994-06-30|1994-07-31|COLLECT COD|AIR|ccounts wake ar +5509|927|30|3|30|54837.60|0.04|0.04|A|F|1994-07-23|1994-06-01|1994-08-08|NONE|AIR|counts haggle pinto beans. furiously +5509|999|68|4|45|85499.55|0.00|0.07|A|F|1994-07-24|1994-05-28|1994-08-20|COLLECT COD|AIR|counts sleep. f +5509|1558|79|5|35|51084.25|0.04|0.03|A|F|1994-04-17|1994-06-29|1994-04-24|COLLECT COD|RAIL|c accounts. ca +5510|159|38|1|8|8473.20|0.01|0.01|A|F|1993-03-16|1993-03-29|1993-03-24|DELIVER IN PERSON|FOB|n packages boost sly +5510|193|72|2|46|50286.74|0.02|0.07|A|F|1993-03-12|1993-02-09|1993-03-19|NONE|TRUCK|silent packages cajole doggedly regular +5510|1611|12|3|47|71092.67|0.03|0.01|A|F|1993-01-20|1993-03-25|1993-02-15|DELIVER IN PERSON|SHIP|riously even requests. slyly bold accou +5510|234|16|4|29|32892.67|0.09|0.08|A|F|1993-02-28|1993-03-28|1993-03-12|COLLECT COD|AIR|lithely fluffily ironic req +5511|1645|87|1|16|24746.24|0.10|0.05|A|F|1995-02-02|1995-01-06|1995-02-19|TAKE BACK RETURN|RAIL|thely bold theodolites +5511|1642|66|2|31|47852.84|0.09|0.01|A|F|1995-02-23|1995-01-21|1995-03-02|COLLECT COD|REG AIR|gular excuses. fluffily even pinto beans c +5511|1278|16|3|49|57784.23|0.05|0.05|R|F|1994-12-21|1995-01-27|1994-12-26|NONE|REG AIR|bout the requests. theodolites +5511|1215|53|4|4|4464.84|0.08|0.02|R|F|1994-12-28|1995-01-16|1995-01-24|TAKE BACK RETURN|RAIL|lphins. carefully blithe de +5511|90|16|5|23|22772.07|0.10|0.07|A|F|1995-03-11|1995-01-21|1995-03-27|TAKE BACK RETURN|TRUCK|ing dugouts +5511|1875|62|6|5|8884.35|0.08|0.05|R|F|1994-12-29|1995-01-16|1995-01-24|DELIVER IN PERSON|MAIL|al theodolites. blithely final de +5511|1427|45|7|23|30553.66|0.02|0.07|R|F|1995-02-03|1995-01-05|1995-02-18|COLLECT COD|REG AIR|ully deposits. warthogs hagg +5536|898|98|1|14|25184.46|0.08|0.06|N|O|1998-05-18|1998-05-08|1998-06-05|COLLECT COD|MAIL|instructions sleep +5536|611|43|2|20|30232.20|0.08|0.04|N|O|1998-05-08|1998-05-10|1998-05-31|DELIVER IN PERSON|REG AIR|equests mo +5536|1969|14|3|35|65483.60|0.07|0.02|N|O|1998-05-19|1998-06-08|1998-06-05|NONE|MAIL|c, final theo +5536|89|90|4|30|29672.40|0.05|0.07|N|O|1998-04-15|1998-05-23|1998-05-03|NONE|FOB|arefully regular theodolites according +5536|1409|10|5|11|14414.40|0.02|0.08|N|O|1998-03-18|1998-05-12|1998-03-28|TAKE BACK RETURN|FOB| snooze furio +5537|441|100|1|10|13414.40|0.05|0.08|N|O|1997-01-13|1996-12-25|1997-01-28|TAKE BACK RETURN|AIR| sleep carefully slyly bold depos +5537|1495|13|2|15|20947.35|0.07|0.04|N|O|1997-01-13|1996-12-25|1997-01-27|COLLECT COD|AIR|eposits. permanently pending packag +5537|1509|90|3|39|55009.50|0.03|0.00|N|O|1996-12-17|1996-11-08|1997-01-15|COLLECT COD|REG AIR| slyly bold packages are. qu +5537|961|64|4|38|70754.48|0.01|0.00|N|O|1996-11-06|1996-11-23|1996-11-12|TAKE BACK RETURN|MAIL|s above the carefully ironic deposits +5538|1534|15|1|42|60292.26|0.05|0.00|A|F|1994-04-08|1994-03-17|1994-05-05|DELIVER IN PERSON|REG AIR|vely ironic accounts. furiously unusual acc +5538|1201|2|2|4|4408.80|0.02|0.03|R|F|1994-03-21|1994-02-17|1994-04-11|TAKE BACK RETURN|REG AIR|ithely along the c +5538|186|13|3|38|41274.84|0.03|0.06|R|F|1994-03-17|1994-02-11|1994-04-10|TAKE BACK RETURN|FOB|ular pinto beans. silent ideas above +5538|777|74|4|9|15099.93|0.00|0.01|R|F|1993-12-26|1994-01-31|1994-01-03|TAKE BACK RETURN|REG AIR|encies across the blithely fina +5539|645|39|1|42|64916.88|0.10|0.08|A|F|1994-09-29|1994-09-17|1994-10-20|DELIVER IN PERSON|RAIL|ons across the carefully si +5540|1809|10|1|42|71853.60|0.02|0.08|N|O|1996-11-12|1996-12-18|1996-12-05|TAKE BACK RETURN|RAIL|ss dolphins haggle +5540|1011|12|2|2|1824.02|0.06|0.02|N|O|1996-12-12|1997-01-09|1996-12-25|DELIVER IN PERSON|MAIL|nic asymptotes could hav +5540|634|66|3|19|29157.97|0.01|0.03|N|O|1997-02-06|1996-11-18|1997-02-20|DELIVER IN PERSON|SHIP| slyly slyl +5540|715|12|4|24|38777.04|0.10|0.05|N|O|1997-01-09|1996-12-02|1997-01-23|COLLECT COD|FOB|deposits! ironic depths may engage-- b +5541|954|89|1|39|72343.05|0.08|0.05|N|O|1997-11-17|1997-12-27|1997-12-11|TAKE BACK RETURN|RAIL|ding theodolites haggle against the slyly +5542|1883|84|1|6|10709.28|0.03|0.01|N|O|1996-06-14|1996-05-28|1996-07-11|DELIVER IN PERSON|TRUCK| foxes doubt. theodolites ca +5543|1427|67|1|14|18597.88|0.02|0.03|R|F|1993-10-09|1993-12-09|1993-10-21|NONE|SHIP|ecial reque +5543|1616|40|2|22|33387.42|0.04|0.00|A|F|1993-11-06|1993-11-02|1993-12-02|DELIVER IN PERSON|SHIP|instructions. deposits use quickly. ir +5543|670|2|3|3|4712.01|0.08|0.05|R|F|1993-11-18|1993-11-05|1993-12-17|NONE|FOB|ress, even +5543|1468|47|4|8|10955.68|0.05|0.01|R|F|1993-10-28|1993-11-18|1993-11-07|NONE|SHIP|totes? iron +5543|800|1|5|32|54425.60|0.03|0.03|R|F|1993-10-04|1993-11-14|1993-11-03|DELIVER IN PERSON|AIR|ully around the +5543|1834|64|6|1|1735.83|0.03|0.07|A|F|1993-10-29|1993-11-11|1993-11-23|TAKE BACK RETURN|FOB|uriously. slyly +5543|1282|57|7|39|46147.92|0.06|0.00|R|F|1993-10-07|1993-11-15|1993-10-28|TAKE BACK RETURN|MAIL|l excuses are furiously. slyly unusual requ +5568|1654|96|1|50|77782.50|0.05|0.05|N|O|1995-07-14|1995-09-04|1995-08-03|COLLECT COD|TRUCK|furious ide +5568|431|32|2|18|23965.74|0.01|0.08|N|O|1995-08-19|1995-08-18|1995-08-24|DELIVER IN PERSON|SHIP|structions haggle. carefully regular +5568|888|89|3|35|62610.80|0.08|0.07|N|O|1995-09-17|1995-09-04|1995-10-14|NONE|SHIP|lyly. blit +5569|289|17|1|25|29732.00|0.10|0.03|R|F|1993-06-29|1993-07-18|1993-07-05|TAKE BACK RETURN|TRUCK| deposits cajole above +5569|573|64|2|26|38312.82|0.09|0.06|A|F|1993-08-21|1993-07-22|1993-09-09|DELIVER IN PERSON|MAIL|pitaphs. ironic req +5569|548|79|3|48|69529.92|0.02|0.03|R|F|1993-06-16|1993-06-15|1993-07-09|COLLECT COD|SHIP|the fluffily +5569|1466|45|4|19|25981.74|0.10|0.08|R|F|1993-07-30|1993-06-21|1993-08-13|TAKE BACK RETURN|FOB| detect ca +5569|586|77|5|15|22298.70|0.02|0.06|A|F|1993-06-29|1993-07-06|1993-07-05|DELIVER IN PERSON|MAIL|lithely bold requests boost fur +5570|1606|30|1|37|55781.20|0.08|0.02|N|O|1996-08-29|1996-10-23|1996-09-11|NONE|RAIL|y ironic pin +5570|387|44|2|15|19310.70|0.09|0.02|N|O|1996-10-04|1996-10-05|1996-10-28|TAKE BACK RETURN|REG AIR|beans nag slyly special, regular pack +5570|594|95|3|29|43343.11|0.02|0.05|N|O|1996-10-12|1996-10-20|1996-11-08|TAKE BACK RETURN|SHIP|he silent, enticing requests. +5571|1535|76|1|32|45968.96|0.05|0.01|R|F|1992-12-25|1993-03-01|1993-01-23|NONE|FOB| the blithely even packages nag q +5571|933|36|2|31|56851.83|0.09|0.07|R|F|1993-01-05|1993-01-18|1993-02-04|DELIVER IN PERSON|SHIP|uffily even accounts. quickly re +5571|915|18|3|18|32686.38|0.10|0.05|R|F|1993-03-11|1993-02-28|1993-04-03|COLLECT COD|REG AIR|uests haggle furiously pending d +5572|216|71|1|24|26789.04|0.08|0.08|R|F|1994-10-30|1994-10-02|1994-11-27|TAKE BACK RETURN|MAIL|ests cajole. evenly ironic exc +5572|1717|44|2|27|43705.17|0.03|0.04|A|F|1994-08-29|1994-09-10|1994-08-30|TAKE BACK RETURN|SHIP| accounts. carefully final accoun +5572|863|64|3|19|33513.34|0.10|0.00|A|F|1994-08-12|1994-10-07|1994-09-01|DELIVER IN PERSON|RAIL|es. final, final requests wake blithely ag +5572|1344|59|4|46|57285.64|0.02|0.01|R|F|1994-09-08|1994-10-14|1994-10-01|NONE|REG AIR|ully regular platelet +5572|231|86|5|34|38461.82|0.10|0.08|R|F|1994-10-22|1994-08-16|1994-11-08|NONE|TRUCK|asymptotes integrate. s +5572|1001|2|6|14|12628.00|0.04|0.05|A|F|1994-11-02|1994-09-20|1994-11-03|COLLECT COD|RAIL|he fluffily express packages. fluffily fina +5572|253|81|7|24|27678.00|0.01|0.05|R|F|1994-09-26|1994-09-04|1994-10-22|DELIVER IN PERSON|FOB| beans. foxes sleep fluffily across th +5573|202|30|1|32|35270.40|0.05|0.07|N|O|1996-09-30|1996-10-25|1996-10-15|DELIVER IN PERSON|RAIL|egular depths haggl +5573|495|54|2|2|2790.98|0.01|0.07|N|O|1996-08-26|1996-09-29|1996-09-04|COLLECT COD|TRUCK| even foxes. specia +5573|108|61|3|46|46372.60|0.06|0.01|N|O|1996-11-04|1996-10-02|1996-11-15|DELIVER IN PERSON|MAIL|s haggle qu +5573|1687|11|4|43|68313.24|0.10|0.03|N|O|1996-10-22|1996-11-03|1996-11-02|TAKE BACK RETURN|FOB| furiously pending packages against +5573|1377|78|5|43|54969.91|0.05|0.04|N|O|1996-09-09|1996-09-24|1996-09-28|COLLECT COD|AIR| bold package +5574|1846|90|1|46|80400.64|0.02|0.07|A|F|1992-06-20|1992-04-19|1992-07-11|NONE|FOB|arefully express requests wake furiousl +5574|324|81|2|21|25710.72|0.05|0.08|A|F|1992-03-22|1992-04-26|1992-04-16|TAKE BACK RETURN|TRUCK|fully final dugouts. express foxes nag +5574|1186|59|3|27|29353.86|0.10|0.06|R|F|1992-05-08|1992-05-19|1992-06-05|TAKE BACK RETURN|REG AIR|ecial realms. furiously entici +5574|934|69|4|14|25689.02|0.09|0.01|R|F|1992-05-20|1992-04-09|1992-05-23|COLLECT COD|REG AIR| use slyly carefully special requests? slyl +5574|841|8|5|19|33094.96|0.05|0.03|A|F|1992-05-28|1992-04-24|1992-06-11|TAKE BACK RETURN|REG AIR|old deposits int +5575|571|62|1|7|10300.99|0.01|0.07|N|O|1995-10-01|1995-09-30|1995-10-06|NONE|FOB|s. slyly pending theodolites prin +5575|302|87|2|23|27652.90|0.04|0.02|N|O|1995-10-26|1995-10-09|1995-11-13|TAKE BACK RETURN|AIR|enticingly final requests. ironically +5575|625|19|3|16|24409.92|0.00|0.07|N|O|1995-08-17|1995-10-14|1995-08-30|NONE|RAIL|jole boldly beyond the final as +5575|1098|99|4|7|6993.63|0.01|0.04|N|O|1995-10-15|1995-09-14|1995-10-18|DELIVER IN PERSON|RAIL|special requests. final, final +5600|1863|7|1|34|60005.24|0.02|0.00|N|O|1997-03-22|1997-04-05|1997-04-09|TAKE BACK RETURN|MAIL|ly above the stealthy ideas. permane +5600|74|50|2|19|18507.33|0.00|0.01|N|O|1997-04-10|1997-03-24|1997-04-16|TAKE BACK RETURN|TRUCK|dencies. carefully p +5601|380|65|1|29|37131.02|0.09|0.04|A|F|1992-04-06|1992-02-24|1992-04-29|DELIVER IN PERSON|TRUCK| ironic ideas. final +5601|1632|15|2|45|69013.35|0.10|0.07|A|F|1992-03-25|1992-04-03|1992-04-04|TAKE BACK RETURN|MAIL|ts-- blithely final accounts cajole. carefu +5601|723|24|3|38|61701.36|0.07|0.00|A|F|1992-01-08|1992-03-01|1992-01-09|TAKE BACK RETURN|REG AIR|ter the evenly final deposit +5601|1479|19|4|12|16565.64|0.03|0.01|A|F|1992-02-27|1992-03-16|1992-03-27|COLLECT COD|TRUCK|ep carefully a +5602|1754|81|1|9|14901.75|0.08|0.03|N|O|1997-10-14|1997-09-14|1997-11-11|COLLECT COD|FOB|lar foxes; quickly ironic ac +5602|611|5|2|31|46859.91|0.04|0.08|N|O|1997-09-04|1997-10-24|1997-09-07|NONE|TRUCK|rate fluffily regular platelets. blithel +5602|677|40|3|30|47330.10|0.04|0.00|N|O|1997-09-20|1997-10-25|1997-10-12|DELIVER IN PERSON|FOB|e slyly even packages. careful +5603|979|82|1|50|93998.50|0.03|0.02|A|F|1992-10-06|1992-08-20|1992-10-08|COLLECT COD|SHIP|final theodolites accor +5603|1158|67|2|49|51898.35|0.06|0.05|A|F|1992-06-24|1992-07-28|1992-07-01|DELIVER IN PERSON|FOB|fully silent requests. carefully fin +5603|319|4|3|49|59746.19|0.00|0.02|R|F|1992-10-07|1992-07-21|1992-10-10|DELIVER IN PERSON|TRUCK|nic, pending dependencies print +5604|1351|52|1|44|55103.40|0.05|0.01|N|O|1998-08-06|1998-07-08|1998-09-04|NONE|RAIL|efully ironi +5604|1351|90|2|49|61365.15|0.10|0.00|N|O|1998-05-02|1998-07-07|1998-05-20|NONE|FOB|ove the regula +5604|771|4|3|10|16717.70|0.07|0.05|N|O|1998-08-03|1998-06-23|1998-08-04|COLLECT COD|SHIP|ly final realms wake blit +5605|868|35|1|50|88443.00|0.08|0.05|N|O|1996-08-26|1996-10-15|1996-09-04|TAKE BACK RETURN|RAIL|instructions sleep carefully ironic req +5605|1508|9|2|7|9866.50|0.06|0.01|N|O|1996-12-13|1996-10-13|1996-12-15|TAKE BACK RETURN|FOB|lowly special courts nag among the furi +5605|1722|7|3|3|4871.16|0.01|0.02|N|O|1996-09-01|1996-10-02|1996-09-20|TAKE BACK RETURN|AIR|posits. accounts boost. t +5605|549|80|4|45|65229.30|0.00|0.01|N|O|1996-09-05|1996-10-04|1996-09-13|COLLECT COD|FOB|ly unusual instructions. carefully ironic p +5605|700|63|5|39|62427.30|0.00|0.08|N|O|1996-12-13|1996-11-03|1996-12-24|DELIVER IN PERSON|REG AIR|cial deposits. theodolites w +5605|1660|61|6|29|45288.14|0.08|0.08|N|O|1996-09-19|1996-10-22|1996-10-06|DELIVER IN PERSON|SHIP| quickly. quickly pending sen +5606|1740|41|1|47|77161.78|0.10|0.04|N|O|1996-12-23|1997-01-31|1997-01-20|DELIVER IN PERSON|REG AIR|carefully final foxes. pending, final +5606|917|18|2|34|61808.94|0.09|0.06|N|O|1997-02-23|1997-02-08|1997-03-09|TAKE BACK RETURN|REG AIR|uses. slyly final +5606|1268|69|3|46|53785.96|0.04|0.00|N|O|1997-03-11|1997-01-13|1997-03-23|DELIVER IN PERSON|REG AIR|ter the ironic accounts. even, ironic depos +5606|817|18|4|30|51534.30|0.08|0.04|N|O|1997-02-06|1997-01-26|1997-02-16|DELIVER IN PERSON|REG AIR| nag always. blithely express packages +5606|64|15|5|25|24101.50|0.06|0.00|N|O|1996-12-25|1997-01-12|1997-01-11|TAKE BACK RETURN|AIR|breach about the furiously bold +5606|1540|41|6|3|4324.62|0.04|0.06|N|O|1997-01-11|1997-01-04|1997-02-08|COLLECT COD|AIR| sauternes. asympto +5606|739|40|7|46|75427.58|0.07|0.01|N|O|1997-02-01|1997-01-31|1997-02-15|DELIVER IN PERSON|TRUCK|ow requests wake around the regular accoun +5607|1316|55|1|23|27998.13|0.02|0.06|R|F|1992-04-17|1992-02-12|1992-04-30|DELIVER IN PERSON|MAIL|the special, final patterns +5632|91|17|1|48|47572.32|0.06|0.06|N|O|1996-05-08|1996-03-24|1996-06-04|TAKE BACK RETURN|FOB|unts. decoys u +5632|1056|57|2|21|20098.05|0.02|0.08|N|O|1996-03-22|1996-03-10|1996-04-10|NONE|AIR|refully regular pinto beans. ironic reques +5632|663|57|3|24|37527.84|0.04|0.06|N|O|1996-03-23|1996-04-02|1996-03-30|TAKE BACK RETURN|MAIL|beans detect. quickly final i +5633|1593|14|1|28|41848.52|0.02|0.00|N|O|1998-08-14|1998-07-24|1998-08-26|TAKE BACK RETURN|SHIP|as boost quickly. unusual pinto +5633|1018|19|2|10|9190.10|0.09|0.04|N|O|1998-07-15|1998-08-03|1998-08-03|COLLECT COD|AIR|its cajole fluffily fluffily special pinto +5633|459|60|3|27|36705.15|0.03|0.02|N|O|1998-09-28|1998-07-28|1998-10-12|DELIVER IN PERSON|AIR|ructions. even ideas haggle carefully r +5633|1637|38|4|50|76931.50|0.02|0.05|N|O|1998-07-23|1998-07-09|1998-08-21|DELIVER IN PERSON|TRUCK|ts. slyly regular +5633|994|29|5|48|90959.52|0.01|0.05|N|O|1998-06-24|1998-07-22|1998-07-18|DELIVER IN PERSON|TRUCK|even courts haggle slyly at the requ +5633|1066|37|6|1|967.06|0.02|0.03|N|O|1998-09-29|1998-08-28|1998-10-19|NONE|RAIL|thely notornis: +5633|107|34|7|39|39276.90|0.02|0.08|N|O|1998-07-12|1998-07-03|1998-07-13|COLLECT COD|TRUCK|ding ideas cajole furiously after +5634|1843|73|1|26|45365.84|0.10|0.08|N|O|1996-10-29|1996-09-15|1996-11-24|COLLECT COD|REG AIR|ptotes mold qu +5634|1749|76|2|22|36316.28|0.02|0.05|N|O|1996-09-01|1996-08-31|1996-09-05|DELIVER IN PERSON|MAIL|silently unusual foxes above the blithely +5634|1086|92|3|16|15793.28|0.08|0.02|N|O|1996-11-15|1996-09-14|1996-12-04|NONE|AIR|ess ideas are carefully pending, even re +5634|1811|98|4|29|49671.49|0.00|0.01|N|O|1996-08-10|1996-10-29|1996-08-11|TAKE BACK RETURN|MAIL|ely final ideas. deposits sleep. reg +5634|4|5|5|1|904.00|0.04|0.02|N|O|1996-10-02|1996-10-21|1996-10-27|COLLECT COD|MAIL|ctions haggle carefully. carefully clo +5635|821|88|1|43|74038.26|0.03|0.00|R|F|1992-10-12|1992-09-29|1992-11-01|TAKE BACK RETURN|TRUCK|cross the d +5635|714|15|2|5|8073.55|0.05|0.08|R|F|1992-10-02|1992-11-05|1992-10-26|TAKE BACK RETURN|REG AIR|yly along the ironic, fi +5635|713|78|3|12|19364.52|0.09|0.02|A|F|1992-10-18|1992-09-24|1992-11-17|NONE|REG AIR|ke slyly against the carefully final req +5635|78|54|4|40|39122.80|0.03|0.01|A|F|1992-09-25|1992-11-05|1992-10-11|NONE|FOB|pending foxes. regular packages +5635|1686|87|5|38|60331.84|0.05|0.06|A|F|1992-10-09|1992-09-25|1992-10-18|NONE|MAIL|ckly pendin +5635|1616|99|6|23|34905.03|0.05|0.04|A|F|1992-08-24|1992-11-10|1992-09-21|NONE|AIR|ily pending packages. bold, +5635|1362|1|7|32|40427.52|0.03|0.08|R|F|1992-11-24|1992-09-20|1992-12-17|TAKE BACK RETURN|TRUCK|slyly even +5636|699|31|1|18|28794.42|0.05|0.03|R|F|1995-05-14|1995-05-17|1995-06-12|DELIVER IN PERSON|REG AIR|slyly express requests. furiously pen +5636|692|86|2|26|41409.94|0.03|0.06|A|F|1995-03-05|1995-05-16|1995-03-23|TAKE BACK RETURN|AIR| furiously final pinto beans o +5636|894|95|3|21|37692.69|0.03|0.03|A|F|1995-03-13|1995-05-11|1995-03-24|COLLECT COD|AIR| are furiously unusual +5636|1083|89|4|15|14761.20|0.03|0.04|R|F|1995-04-21|1995-04-30|1995-05-05|DELIVER IN PERSON|REG AIR|efully special +5636|468|98|5|13|17789.98|0.10|0.03|A|F|1995-05-11|1995-04-27|1995-05-26|COLLECT COD|AIR|en, fluffy accounts amon +5636|113|14|6|33|33432.63|0.06|0.04|A|F|1995-03-09|1995-04-05|1995-03-23|DELIVER IN PERSON|MAIL|ding to the +5636|1333|72|7|24|29623.92|0.10|0.05|R|F|1995-04-12|1995-03-27|1995-04-16|DELIVER IN PERSON|RAIL|counts sleep furiously b +5637|467|97|1|14|19144.44|0.03|0.05|N|O|1996-07-20|1996-07-26|1996-08-14|COLLECT COD|MAIL|y bold deposits wak +5637|1719|20|2|35|56724.85|0.09|0.08|N|O|1996-08-01|1996-08-04|1996-08-20|NONE|AIR|s sleep blithely alongside of the ironic +5637|954|57|3|22|40808.90|0.01|0.07|N|O|1996-08-28|1996-07-30|1996-09-17|COLLECT COD|REG AIR|nding requests are ca +5637|652|46|4|16|24842.40|0.03|0.03|N|O|1996-09-08|1996-08-31|1996-09-29|TAKE BACK RETURN|TRUCK|d packages. express requests +5637|1957|58|5|10|18589.50|0.01|0.00|N|O|1996-08-25|1996-08-11|1996-09-23|TAKE BACK RETURN|MAIL|ickly ironic gifts. blithely even cour +5637|1283|21|6|27|31975.56|0.01|0.05|N|O|1996-06-27|1996-08-09|1996-07-27|DELIVER IN PERSON|REG AIR|oss the carefully express warhorses +5638|1379|80|1|45|57616.65|0.09|0.07|A|F|1994-05-17|1994-03-09|1994-06-15|NONE|TRUCK|ar foxes. fluffily pending accounts +5638|1677|1|2|12|18944.04|0.02|0.05|A|F|1994-02-05|1994-04-01|1994-02-25|COLLECT COD|TRUCK|n, even requests. furiously ironic not +5638|1620|3|3|21|31954.02|0.08|0.00|A|F|1994-03-13|1994-03-27|1994-03-17|DELIVER IN PERSON|TRUCK|press courts use f +5639|467|26|1|11|15042.06|0.09|0.02|R|F|1994-09-18|1994-07-10|1994-10-12|TAKE BACK RETURN|SHIP|g the unusual pinto beans caj +5664|1211|86|1|25|27805.25|0.00|0.06|N|O|1998-10-29|1998-09-23|1998-11-25|COLLECT COD|FOB|eposits: furiously ironic grouch +5664|1725|10|2|9|14640.48|0.07|0.05|N|O|1998-07-31|1998-08-26|1998-08-12|COLLECT COD|RAIL| ironic deposits haggle furiously. re +5664|525|26|3|31|44191.12|0.01|0.03|N|O|1998-11-10|1998-09-12|1998-12-07|TAKE BACK RETURN|FOB|ainst the never silent request +5664|1376|53|4|33|42153.21|0.08|0.03|N|O|1998-08-29|1998-09-17|1998-09-25|DELIVER IN PERSON|RAIL|d the final +5664|1118|27|5|44|44840.84|0.01|0.06|N|O|1998-09-24|1998-09-26|1998-10-23|NONE|TRUCK|ang thinly bold pa +5664|678|41|6|34|53674.78|0.09|0.01|N|O|1998-09-10|1998-10-05|1998-09-15|COLLECT COD|RAIL|st. fluffily pending foxes na +5664|1815|45|7|9|15451.29|0.01|0.05|N|O|1998-11-04|1998-10-15|1998-11-20|TAKE BACK RETURN|REG AIR|yly. express ideas agai +5665|1010|11|1|32|29152.32|0.00|0.02|A|F|1993-08-11|1993-08-01|1993-09-07|NONE|AIR|f the slyly even requests! regular request +5665|50|76|2|14|13300.70|0.02|0.00|R|F|1993-06-29|1993-09-16|1993-07-16|DELIVER IN PERSON|AIR|- special pinto beans sleep quickly blithel +5665|1572|73|3|41|60416.37|0.09|0.02|A|F|1993-08-23|1993-09-22|1993-09-11|COLLECT COD|REG AIR| idle ideas across +5665|452|11|4|47|63565.15|0.01|0.01|A|F|1993-10-06|1993-09-19|1993-11-01|NONE|RAIL|s mold fluffily. final deposits along the +5666|1213|25|1|7|7799.47|0.09|0.08|R|F|1994-05-10|1994-04-06|1994-05-21|NONE|FOB| ideas. regular packag +5666|358|15|2|14|17616.90|0.08|0.01|A|F|1994-02-27|1994-04-11|1994-03-06|DELIVER IN PERSON|TRUCK|lar deposits nag against the slyly final d +5666|1922|11|3|39|71132.88|0.00|0.01|A|F|1994-05-13|1994-04-02|1994-06-12|DELIVER IN PERSON|TRUCK|the even, final foxes. quickly iron +5666|1307|84|4|24|28999.20|0.07|0.01|R|F|1994-02-14|1994-03-09|1994-03-06|DELIVER IN PERSON|FOB|on the carefully pending asympto +5666|1085|86|5|36|35498.88|0.07|0.07|R|F|1994-03-15|1994-03-16|1994-03-18|COLLECT COD|TRUCK|accounts. furiousl +5667|1445|63|1|37|49818.28|0.09|0.06|N|O|1995-09-24|1995-09-17|1995-10-03|NONE|REG AIR|s cajole blit +5668|37|88|1|15|14055.45|0.03|0.04|A|F|1995-04-06|1995-05-12|1995-04-17|COLLECT COD|FOB| the express, pending requests. bo +5669|1909|10|1|7|12676.30|0.06|0.06|N|O|1996-06-19|1996-07-07|1996-07-11|COLLECT COD|SHIP|yly regular requests lose blithely. careful +5669|1559|80|2|2|2921.10|0.06|0.07|N|O|1996-08-04|1996-06-15|1996-08-20|NONE|SHIP| blithely excuses. slyly +5669|1577|78|3|40|59142.80|0.00|0.02|N|O|1996-08-30|1996-06-15|1996-09-07|TAKE BACK RETURN|FOB|ar accounts alongside of the final, p +5669|893|94|4|31|55610.59|0.04|0.05|N|O|1996-08-05|1996-06-10|1996-08-29|COLLECT COD|AIR|to beans against the regular depo +5669|1397|12|5|30|38951.70|0.07|0.01|N|O|1996-07-14|1996-07-28|1996-08-10|TAKE BACK RETURN|TRUCK|l accounts. care +5670|896|97|1|27|48516.03|0.10|0.06|R|F|1993-05-09|1993-05-30|1993-06-06|TAKE BACK RETURN|REG AIR| ideas promise bli +5670|1853|97|2|43|75458.55|0.06|0.00|A|F|1993-07-09|1993-06-03|1993-07-14|DELIVER IN PERSON|FOB|ests in place of the carefully sly depos +5670|65|66|3|24|23161.44|0.09|0.04|A|F|1993-07-17|1993-07-01|1993-08-03|NONE|AIR|press, express requests haggle +5670|1414|54|4|11|14469.51|0.06|0.06|R|F|1993-07-11|1993-06-26|1993-07-24|DELIVER IN PERSON|MAIL|etect furiously among the even pin +5671|1195|68|1|25|27404.75|0.00|0.08|N|O|1998-04-17|1998-03-28|1998-05-06|DELIVER IN PERSON|AIR|cording to the quickly final requests-- +5671|1289|64|2|46|54752.88|0.05|0.08|N|O|1998-03-28|1998-04-22|1998-04-19|TAKE BACK RETURN|MAIL|lar pinto beans detect care +5671|1714|41|3|13|21004.23|0.10|0.06|N|O|1998-03-02|1998-04-03|1998-03-08|TAKE BACK RETURN|TRUCK|bold theodolites about +5671|1103|12|4|42|42172.20|0.00|0.07|N|O|1998-02-17|1998-04-24|1998-03-17|TAKE BACK RETURN|SHIP|carefully slyly special deposit +5671|1281|19|5|13|15369.64|0.09|0.00|N|O|1998-04-24|1998-03-26|1998-04-27|NONE|REG AIR|ers according to the ironic, unusual excu +5671|1134|7|6|30|31053.90|0.09|0.07|N|O|1998-06-06|1998-04-15|1998-07-01|DELIVER IN PERSON|TRUCK|fily ironi +5696|1364|79|1|28|35430.08|0.03|0.06|N|O|1995-07-03|1995-06-14|1995-07-27|COLLECT COD|REG AIR| the fluffily brave pearls +5696|590|81|2|46|68567.14|0.01|0.00|N|O|1995-08-10|1995-07-08|1995-08-25|COLLECT COD|AIR|ter the instruct +5696|1663|87|3|42|65715.72|0.04|0.01|N|F|1995-06-06|1995-06-11|1995-06-19|TAKE BACK RETURN|SHIP|te furious +5696|977|12|4|20|37559.40|0.08|0.00|N|O|1995-06-25|1995-07-18|1995-07-16|NONE|TRUCK|silent, pending ideas sleep fluffil +5696|1236|74|5|19|21607.37|0.07|0.05|N|O|1995-08-31|1995-06-13|1995-09-10|COLLECT COD|SHIP|unusual requests sleep furiously ru +5696|1320|35|6|37|45188.84|0.04|0.05|N|O|1995-07-21|1995-06-23|1995-08-19|NONE|RAIL| carefully expres +5696|1016|22|7|6|5502.06|0.07|0.05|N|O|1995-08-03|1995-07-15|1995-09-01|DELIVER IN PERSON|REG AIR|n patterns lose slyly fina +5697|542|33|1|24|34620.96|0.10|0.07|R|F|1992-10-27|1992-11-28|1992-11-20|NONE|RAIL|uffily iro +5697|153|80|2|43|45285.45|0.06|0.02|R|F|1992-12-08|1992-12-03|1992-12-17|TAKE BACK RETURN|FOB|blithely reg +5697|555|46|3|42|61133.10|0.03|0.01|A|F|1992-12-19|1992-12-08|1993-01-03|COLLECT COD|TRUCK|inal theodolites cajole after the bli +5698|105|58|1|30|30153.00|0.01|0.05|A|F|1994-05-26|1994-08-16|1994-06-19|COLLECT COD|AIR|its. quickly regular foxes aro +5698|1621|22|2|25|38065.50|0.08|0.07|R|F|1994-08-06|1994-06-21|1994-08-25|NONE|SHIP| asymptotes sleep slyly above the +5698|1550|91|3|45|65319.75|0.03|0.01|A|F|1994-06-23|1994-08-13|1994-07-02|NONE|FOB|ng excuses. slyly express asymptotes +5698|572|3|4|15|22088.55|0.07|0.08|R|F|1994-06-29|1994-07-03|1994-07-02|COLLECT COD|REG AIR|ly ironic frets haggle carefully +5698|1395|96|5|37|47966.43|0.06|0.06|A|F|1994-06-30|1994-06-23|1994-07-22|TAKE BACK RETURN|SHIP|ts. even, ironic +5698|1877|21|6|1|1778.87|0.06|0.04|R|F|1994-05-31|1994-07-10|1994-06-03|DELIVER IN PERSON|MAIL|nts. slyly quiet pinto beans nag carefu +5699|19|70|1|24|22056.24|0.01|0.07|A|F|1992-10-21|1992-09-04|1992-11-04|COLLECT COD|AIR|kages. fin +5699|545|6|2|26|37584.04|0.06|0.06|R|F|1992-08-11|1992-09-21|1992-08-14|COLLECT COD|MAIL|y final deposits wake fluffily u +5699|175|2|3|48|51608.16|0.10|0.05|R|F|1992-11-23|1992-10-20|1992-11-29|DELIVER IN PERSON|TRUCK|s. carefully regul +5699|544|75|4|46|66448.84|0.08|0.02|A|F|1992-11-28|1992-09-23|1992-12-27|TAKE BACK RETURN|FOB|o the slyly +5699|273|28|5|21|24638.67|0.02|0.02|A|F|1992-10-13|1992-09-30|1992-10-19|NONE|MAIL|lyly final pla +5699|1901|34|6|30|54087.00|0.08|0.05|R|F|1992-11-13|1992-10-01|1992-12-11|DELIVER IN PERSON|AIR| the carefully final +5699|1283|58|7|45|53292.60|0.09|0.06|A|F|1992-09-23|1992-10-22|1992-10-04|DELIVER IN PERSON|SHIP|rmanent packages sleep across the f +5700|1679|62|1|24|37936.08|0.09|0.00|N|O|1997-12-26|1998-01-28|1998-01-18|DELIVER IN PERSON|REG AIR|ix carefully +5700|1225|63|2|30|33786.60|0.00|0.06|N|O|1998-04-19|1998-03-13|1998-04-27|COLLECT COD|MAIL|ly blithely final instructions. fl +5700|1254|29|3|23|26570.75|0.03|0.05|N|O|1998-01-30|1998-01-31|1998-01-31|NONE|REG AIR| wake quickly carefully fluffy hockey +5701|535|66|1|17|24404.01|0.02|0.05|N|O|1997-03-27|1997-04-08|1997-04-21|DELIVER IN PERSON|RAIL|tes. quickly final a +5702|770|3|1|44|73513.88|0.06|0.02|R|F|1994-01-04|1993-11-25|1994-01-22|NONE|RAIL|lites. carefully final requests doze b +5702|856|57|2|37|65003.45|0.10|0.05|R|F|1993-12-14|1993-10-21|1994-01-08|NONE|FOB|ix slyly. regular instructions slee +5702|1307|22|3|44|53165.20|0.00|0.02|R|F|1993-11-28|1993-12-02|1993-12-22|NONE|TRUCK|ake according to th +5702|623|17|4|31|47232.22|0.00|0.04|A|F|1994-01-04|1993-10-22|1994-01-26|DELIVER IN PERSON|TRUCK|pinto beans. blithely +5703|877|11|1|2|3555.74|0.09|0.01|R|F|1993-05-29|1993-07-26|1993-06-05|TAKE BACK RETURN|REG AIR|nts against the blithely sile +5728|436|66|1|47|62812.21|0.10|0.05|A|F|1994-12-13|1995-01-25|1994-12-25|TAKE BACK RETURN|MAIL|nd the bravely final deposits. final ideas +5728|1588|9|2|40|59583.20|0.05|0.08|A|F|1995-03-28|1995-01-17|1995-04-14|TAKE BACK RETURN|SHIP|final deposits. theodolite +5729|1424|25|1|5|6627.10|0.07|0.00|R|F|1994-11-27|1994-11-11|1994-12-23|TAKE BACK RETURN|MAIL|s. even sheaves nag courts. +5729|1062|98|2|39|37559.34|0.10|0.00|A|F|1995-01-22|1994-11-21|1995-02-13|TAKE BACK RETURN|MAIL|. special pl +5729|112|13|3|50|50605.50|0.00|0.05|R|F|1994-12-09|1994-12-31|1994-12-24|TAKE BACK RETURN|AIR|ly special sentiments. car +5730|1501|2|1|2|2805.00|0.08|0.00|N|O|1998-02-24|1998-03-15|1998-03-11|COLLECT COD|SHIP|ely ironic foxes. carefu +5730|1997|98|2|9|17090.91|0.10|0.01|N|O|1998-03-05|1998-02-02|1998-03-28|DELIVER IN PERSON|MAIL|s lose blithely. specia +5731|1918|51|1|13|23658.83|0.02|0.04|N|O|1997-07-30|1997-06-23|1997-08-13|COLLECT COD|RAIL|ngside of the quickly regular depos +5731|1042|43|2|11|10373.44|0.00|0.08|N|O|1997-06-06|1997-07-08|1997-06-25|NONE|MAIL| furiously final accounts wake. d +5731|1109|10|3|6|6060.60|0.01|0.04|N|O|1997-07-02|1997-07-01|1997-07-08|COLLECT COD|SHIP|sits integrate slyly close platelets. quick +5731|135|88|4|6|6210.78|0.03|0.06|N|O|1997-09-07|1997-06-20|1997-09-20|TAKE BACK RETURN|RAIL|rs. quickly regular theo +5731|1950|51|5|19|35187.05|0.08|0.02|N|O|1997-06-29|1997-06-27|1997-07-15|NONE|REG AIR|ly unusual ideas above the +5732|1383|98|1|26|33393.88|0.02|0.07|N|O|1997-08-18|1997-10-25|1997-09-12|TAKE BACK RETURN|TRUCK|totes cajole according to the theodolites. +5733|329|30|1|39|47943.48|0.01|0.07|A|F|1993-03-22|1993-05-24|1993-04-04|DELIVER IN PERSON|FOB|side of the +5734|1830|74|1|29|50223.07|0.05|0.01|N|O|1997-12-01|1997-12-08|1997-12-23|NONE|RAIL|structions cajole final, express +5734|1493|72|2|6|8366.94|0.07|0.00|N|O|1997-10-27|1997-12-19|1997-11-02|COLLECT COD|RAIL|s. regular platelets cajole furiously. regu +5734|668|69|3|10|15686.60|0.01|0.03|N|O|1997-12-28|1997-12-24|1998-01-24|DELIVER IN PERSON|TRUCK|equests; accounts above +5735|598|99|1|41|61442.19|0.01|0.01|R|F|1994-12-23|1995-02-10|1995-01-22|COLLECT COD|MAIL|lthily ruthless i +5760|7|83|1|6|5442.00|0.09|0.03|R|F|1994-07-30|1994-07-31|1994-08-16|COLLECT COD|REG AIR|ng the acco +5760|58|9|2|24|22993.20|0.04|0.05|A|F|1994-07-15|1994-07-04|1994-08-08|NONE|MAIL|s. bravely ironic accounts among +5760|1474|14|3|8|11003.76|0.07|0.04|A|F|1994-09-06|1994-08-03|1994-10-06|NONE|AIR|l accounts among the carefully even de +5760|1223|24|4|19|21360.18|0.10|0.01|R|F|1994-08-02|1994-08-02|1994-08-15|COLLECT COD|SHIP|sits nag. even, regular ideas cajole b +5760|1657|81|5|6|9351.90|0.03|0.07|R|F|1994-06-09|1994-07-06|1994-06-16|DELIVER IN PERSON|MAIL| shall have to cajole along the +5761|463|51|1|41|55901.86|0.08|0.00|N|O|1998-07-31|1998-08-09|1998-08-08|TAKE BACK RETURN|TRUCK|pecial deposits. qu +5761|1073|74|2|36|35066.52|0.00|0.07|N|O|1998-09-07|1998-09-21|1998-09-11|TAKE BACK RETURN|TRUCK| pinto beans thrash alongside of the pendi +5761|1974|7|3|49|91922.53|0.04|0.08|N|O|1998-07-14|1998-08-20|1998-07-25|NONE|SHIP|ly bold accounts wake above the +5762|1750|51|1|6|9910.50|0.05|0.02|N|O|1997-04-07|1997-03-25|1997-05-02|NONE|AIR|ironic dependencies doze carefu +5762|1018|24|2|27|24813.27|0.02|0.08|N|O|1997-02-21|1997-05-08|1997-03-23|NONE|REG AIR|across the bold ideas. carefully sp +5762|884|85|3|40|71395.20|0.00|0.08|N|O|1997-04-30|1997-05-09|1997-05-08|COLLECT COD|SHIP|al instructions. furiousl +5762|1324|25|4|47|57590.04|0.05|0.06|N|O|1997-03-02|1997-03-23|1997-03-19|NONE|RAIL|equests sleep after the furiously ironic pa +5762|246|47|5|28|32094.72|0.02|0.06|N|O|1997-02-22|1997-03-25|1997-02-24|TAKE BACK RETURN|SHIP|ic foxes among the blithely qui +5762|117|44|6|12|12205.32|0.00|0.06|N|O|1997-04-18|1997-04-27|1997-05-11|DELIVER IN PERSON|REG AIR|ages are abo +5763|1308|85|1|32|38697.60|0.02|0.06|N|O|1998-07-16|1998-09-13|1998-08-02|DELIVER IN PERSON|FOB|ding instruct +5763|1357|96|2|23|28942.05|0.09|0.04|N|O|1998-07-25|1998-09-21|1998-08-15|DELIVER IN PERSON|SHIP|re after the blithel +5763|124|3|3|25|25603.00|0.01|0.02|N|O|1998-10-04|1998-08-16|1998-10-09|DELIVER IN PERSON|REG AIR|inal theodolites. even re +5763|1210|48|4|47|52226.87|0.09|0.00|N|O|1998-08-22|1998-09-22|1998-09-04|NONE|REG AIR|gle slyly. slyly final re +5763|1230|31|5|8|9049.84|0.06|0.05|N|O|1998-09-23|1998-09-15|1998-09-27|DELIVER IN PERSON|TRUCK|foxes wake slyly. car +5763|1892|93|6|9|16145.01|0.08|0.02|N|O|1998-09-24|1998-09-01|1998-10-02|NONE|AIR| deposits. instru +5764|1007|8|1|28|25424.00|0.04|0.04|A|F|1993-12-07|1993-12-20|1993-12-26|TAKE BACK RETURN|RAIL|sleep furi +5764|1992|81|2|20|37879.80|0.10|0.05|A|F|1993-10-17|1993-12-24|1993-10-18|TAKE BACK RETURN|FOB|ng to the fluffily qu +5764|1872|2|3|4|7095.48|0.03|0.05|A|F|1993-10-25|1993-12-23|1993-11-06|DELIVER IN PERSON|AIR|ily regular courts haggle +5765|1620|44|1|31|47170.22|0.00|0.06|A|F|1995-01-11|1995-02-13|1995-01-23|TAKE BACK RETURN|AIR|r foxes. ev +5765|1239|77|2|29|33066.67|0.07|0.08|A|F|1994-12-29|1995-02-01|1995-01-26|NONE|RAIL|nic requests. deposits wake quickly among +5765|1384|61|3|31|39846.78|0.05|0.01|R|F|1995-03-01|1995-01-23|1995-03-31|TAKE BACK RETURN|REG AIR|the furiou +5765|1518|39|4|46|65297.46|0.07|0.07|R|F|1995-03-13|1995-02-12|1995-03-20|DELIVER IN PERSON|MAIL|ccounts sleep about th +5765|1735|20|5|48|78563.04|0.09|0.02|A|F|1995-03-30|1995-01-14|1995-04-09|DELIVER IN PERSON|SHIP|theodolites integrate furiously +5765|821|88|6|41|70594.62|0.04|0.00|A|F|1994-12-31|1995-02-11|1995-01-17|TAKE BACK RETURN|SHIP| furiously. slyly sile +5765|413|72|7|21|27581.61|0.05|0.04|R|F|1995-04-05|1995-02-12|1995-05-05|COLLECT COD|TRUCK|ole furiously. quick, special dependencies +5766|1871|15|1|1|1772.87|0.10|0.01|R|F|1994-01-16|1993-11-16|1994-01-23|NONE|MAIL|blithely regular the +5766|1486|4|2|39|54111.72|0.02|0.07|A|F|1993-10-24|1993-12-07|1993-11-08|DELIVER IN PERSON|SHIP| furiously unusual courts. slyly final pear +5766|1178|87|3|4|4316.68|0.08|0.08|R|F|1993-11-10|1993-10-30|1993-12-01|COLLECT COD|TRUCK|ly even requests. furiou +5767|1669|70|1|11|17277.26|0.08|0.01|A|F|1992-06-02|1992-05-30|1992-06-08|NONE|TRUCK|instructions. carefully final accou +5767|686|18|2|15|23800.20|0.07|0.05|R|F|1992-06-05|1992-07-28|1992-06-08|DELIVER IN PERSON|MAIL|warthogs. carefully unusual g +5767|1905|50|3|42|75889.80|0.06|0.01|R|F|1992-07-31|1992-06-09|1992-08-09|COLLECT COD|TRUCK| blithe deposi +5767|1525|26|4|34|48501.68|0.06|0.01|R|F|1992-06-02|1992-06-23|1992-06-17|NONE|FOB|sits among the +5767|453|54|5|36|48724.20|0.03|0.00|A|F|1992-07-17|1992-06-10|1992-07-19|COLLECT COD|AIR|ake carefully. packages +5792|1771|14|1|34|56874.18|0.08|0.07|R|F|1993-05-23|1993-06-25|1993-06-12|NONE|RAIL|requests are against t +5792|1565|6|2|47|68928.32|0.10|0.00|A|F|1993-06-08|1993-05-10|1993-06-26|COLLECT COD|AIR|regular, ironic excuses n +5792|1829|30|3|32|55386.24|0.05|0.08|R|F|1993-06-26|1993-05-23|1993-07-07|COLLECT COD|RAIL|s are slyly against the ev +5792|139|66|4|14|14547.82|0.09|0.02|A|F|1993-07-28|1993-06-17|1993-08-27|DELIVER IN PERSON|RAIL|olites print carefully +5792|1014|20|5|31|28365.31|0.02|0.01|A|F|1993-06-17|1993-05-05|1993-07-01|COLLECT COD|TRUCK|s? furiously even instructions +5793|521|12|1|20|28430.40|0.05|0.03|N|O|1997-10-05|1997-09-04|1997-10-30|COLLECT COD|AIR|e carefully ex +5793|1700|24|2|41|65669.70|0.06|0.06|N|O|1997-08-04|1997-10-10|1997-08-12|DELIVER IN PERSON|TRUCK|snooze quick +5793|428|29|3|8|10627.36|0.07|0.03|N|O|1997-08-16|1997-09-08|1997-08-28|COLLECT COD|AIR|al foxes l +5793|1477|95|4|48|66166.56|0.02|0.02|N|O|1997-09-27|1997-08-23|1997-10-27|DELIVER IN PERSON|REG AIR|quickly enticing excuses use slyly abov +5794|1572|73|1|42|61889.94|0.06|0.05|R|F|1993-06-29|1993-05-30|1993-07-28|COLLECT COD|REG AIR|he careful +5794|1148|21|2|14|14687.96|0.09|0.02|R|F|1993-04-19|1993-07-02|1993-05-18|COLLECT COD|SHIP|uriously carefully ironic reque +5794|69|70|3|15|14535.90|0.09|0.06|R|F|1993-06-25|1993-06-27|1993-07-09|NONE|MAIL|blithely regular ideas. final foxes haggle +5794|1363|2|4|47|59424.92|0.00|0.08|A|F|1993-07-16|1993-06-21|1993-08-05|TAKE BACK RETURN|REG AIR|quests. blithely final excu +5795|1930|19|1|34|62285.62|0.09|0.05|A|F|1992-08-21|1992-07-30|1992-08-27|COLLECT COD|REG AIR|al instructions must affix along the ironic +5796|580|41|1|27|39975.66|0.10|0.00|N|O|1996-04-06|1996-02-29|1996-04-20|DELIVER IN PERSON|RAIL|s wake quickly aro +5797|610|4|1|17|25680.37|0.09|0.03|N|O|1997-12-13|1998-01-12|1997-12-23|NONE|REG AIR|the ironic, even theodoli +5798|1261|62|1|2|2324.52|0.09|0.00|N|O|1998-05-25|1998-06-22|1998-06-09|COLLECT COD|FOB|e furiously across +5798|1239|77|2|14|15963.22|0.06|0.05|N|O|1998-04-01|1998-06-14|1998-04-27|NONE|RAIL|he special, bold packages. carefully iron +5798|1337|14|3|22|27243.26|0.02|0.01|N|O|1998-06-24|1998-06-06|1998-07-20|COLLECT COD|TRUCK|sits poach carefully +5798|1457|97|4|40|54338.00|0.08|0.06|N|O|1998-07-09|1998-06-24|1998-07-16|NONE|TRUCK| integrate carefu +5798|1487|5|5|7|9719.36|0.06|0.07|N|O|1998-06-06|1998-05-10|1998-06-07|NONE|SHIP|ts against the blithely final p +5798|375|60|6|9|11478.33|0.06|0.02|N|O|1998-05-05|1998-05-25|1998-05-09|DELIVER IN PERSON|REG AIR|e blithely +5798|1149|86|7|32|33604.48|0.08|0.01|N|O|1998-04-27|1998-05-03|1998-05-08|TAKE BACK RETURN|REG AIR|ubt blithely above the +5799|946|47|1|41|75724.54|0.04|0.02|N|O|1995-11-13|1995-10-31|1995-11-16|COLLECT COD|TRUCK|al accounts sleep ruthlessl +5799|999|68|2|30|56999.70|0.03|0.08|N|O|1995-09-12|1995-09-13|1995-09-19|NONE|RAIL| furiously s +5824|762|95|1|40|66510.40|0.06|0.06|N|O|1997-01-14|1997-01-17|1997-02-02|NONE|REG AIR|he final packag +5824|1811|98|2|42|71938.02|0.09|0.00|N|O|1997-02-01|1997-02-20|1997-02-07|COLLECT COD|SHIP|ts sleep. carefully regular accounts h +5824|722|19|3|16|25963.52|0.03|0.02|N|O|1997-02-13|1997-01-07|1997-02-17|TAKE BACK RETURN|TRUCK|sly express Ti +5824|911|80|4|32|57981.12|0.03|0.02|N|O|1997-02-16|1997-01-24|1997-02-20|DELIVER IN PERSON|RAIL|ven requests. +5824|1070|71|5|44|42727.08|0.08|0.03|N|O|1997-01-24|1997-01-31|1997-02-11|COLLECT COD|TRUCK|fily fluffily bold +5825|1583|24|1|23|34145.34|0.10|0.05|R|F|1995-05-10|1995-04-28|1995-05-13|DELIVER IN PERSON|TRUCK| special pinto beans. dependencies haggl +5826|1440|80|1|4|5365.76|0.03|0.06|N|O|1998-07-31|1998-09-10|1998-08-27|NONE|AIR| packages across the fluffily spec +5826|638|39|2|18|27695.34|0.04|0.01|N|O|1998-07-17|1998-09-03|1998-07-22|NONE|SHIP|atelets use above t +5827|1867|68|1|30|53065.80|0.03|0.05|N|O|1998-11-11|1998-09-27|1998-11-30|DELIVER IN PERSON|RAIL|ounts may c +5827|1022|58|2|23|21229.46|0.09|0.05|N|O|1998-11-16|1998-09-14|1998-11-17|COLLECT COD|RAIL|ans. furiously special instruct +5827|1638|21|3|3|4618.89|0.03|0.06|N|O|1998-10-17|1998-09-29|1998-10-28|DELIVER IN PERSON|MAIL|uses eat along the furiously +5827|1991|92|4|26|49217.74|0.06|0.00|N|O|1998-07-29|1998-09-24|1998-07-30|DELIVER IN PERSON|SHIP|arefully special packages wake thin +5827|1117|90|5|38|38688.18|0.03|0.06|N|O|1998-10-18|1998-08-27|1998-10-23|TAKE BACK RETURN|TRUCK|ly ruthless accounts +5827|165|18|6|14|14912.24|0.05|0.01|N|O|1998-08-31|1998-09-06|1998-09-13|TAKE BACK RETURN|RAIL|rges. fluffily pending +5828|14|90|1|28|25592.28|0.10|0.03|A|F|1994-05-15|1994-05-20|1994-06-08|DELIVER IN PERSON|MAIL| special ideas haggle slyly ac +5828|1574|55|2|37|54596.09|0.01|0.00|R|F|1994-06-07|1994-05-30|1994-06-17|NONE|RAIL|e carefully spec +5829|397|54|1|4|5189.56|0.01|0.02|N|O|1997-03-01|1997-02-17|1997-03-22|NONE|TRUCK|ithely; accounts cajole ideas. regular foxe +5829|1066|2|2|40|38682.40|0.04|0.01|N|O|1997-04-21|1997-02-12|1997-05-04|COLLECT COD|TRUCK| the carefully ironic accounts. a +5829|1283|58|3|6|7105.68|0.05|0.06|N|O|1997-01-22|1997-03-12|1997-02-02|TAKE BACK RETURN|AIR|sts. slyly special fo +5829|892|59|4|42|75301.38|0.02|0.07|N|O|1997-03-26|1997-04-01|1997-03-30|COLLECT COD|REG AIR|pearls. slyly bold deposits solve final +5829|1908|41|5|49|88685.10|0.05|0.01|N|O|1997-01-31|1997-03-13|1997-02-18|NONE|MAIL| ironic excuses use fluf +5829|171|24|6|17|18209.89|0.09|0.02|N|O|1997-04-10|1997-03-29|1997-04-22|COLLECT COD|AIR|after the furiously ironic ideas no +5829|780|81|7|27|45381.06|0.08|0.04|N|O|1997-02-25|1997-03-31|1997-03-03|DELIVER IN PERSON|AIR|ns about the excuses are c +5830|1593|14|1|29|43343.11|0.10|0.02|R|F|1993-06-19|1993-05-10|1993-07-13|DELIVER IN PERSON|REG AIR|y bold excuses +5831|1904|5|1|2|3611.80|0.10|0.01|N|O|1997-02-09|1997-01-20|1997-03-07|TAKE BACK RETURN|TRUCK|quickly silent req +5831|735|100|2|33|53979.09|0.04|0.03|N|O|1996-11-20|1997-01-18|1996-12-18|TAKE BACK RETURN|MAIL| instructions wake. slyly sil +5831|817|51|3|6|10306.86|0.05|0.07|N|O|1997-01-29|1997-01-14|1997-02-09|NONE|MAIL|ly ironic accounts nag pendin +5831|130|83|4|46|47385.98|0.06|0.02|N|O|1997-02-24|1997-01-18|1997-03-02|COLLECT COD|MAIL|ly final pa +5831|429|30|5|37|49188.54|0.05|0.01|N|O|1997-01-17|1997-02-08|1997-02-01|NONE|FOB|uriously even requests +5856|37|13|1|1|937.03|0.03|0.02|A|F|1994-12-29|1995-01-07|1995-01-10|TAKE BACK RETURN|MAIL|tly. special deposits wake blithely even +5856|344|1|2|35|43551.90|0.09|0.02|R|F|1994-11-24|1994-12-23|1994-11-30|COLLECT COD|AIR|excuses. finally ir +5856|1528|29|3|39|55751.28|0.05|0.03|A|F|1995-01-18|1995-01-11|1995-01-19|DELIVER IN PERSON|TRUCK|uickly quickly fluffy in +5857|573|74|1|25|36839.25|0.03|0.02|N|O|1997-12-02|1997-12-17|1997-12-08|DELIVER IN PERSON|REG AIR|ding platelets. pending excu +5857|1948|81|2|50|92497.00|0.06|0.07|N|O|1997-12-04|1997-12-16|1997-12-20|NONE|TRUCK|y regular d +5857|679|73|3|1|1579.67|0.03|0.01|N|O|1998-02-01|1997-12-09|1998-02-20|TAKE BACK RETURN|SHIP|instructions detect final reques +5857|1180|17|4|12|12974.16|0.03|0.08|N|O|1998-01-24|1997-12-27|1998-02-10|TAKE BACK RETURN|AIR|counts. express, final +5857|1913|58|5|14|25408.74|0.07|0.07|N|O|1997-12-10|1998-01-06|1998-01-04|TAKE BACK RETURN|TRUCK|ffily pendin +5857|929|64|6|49|89666.08|0.00|0.04|N|O|1998-01-23|1997-12-12|1998-01-28|DELIVER IN PERSON|REG AIR|egular pinto beans +5858|1209|21|1|20|22204.00|0.02|0.06|A|F|1992-07-23|1992-08-26|1992-07-24|COLLECT COD|SHIP|uffily unusual pinto beans sleep +5858|151|52|2|36|37841.40|0.00|0.05|A|F|1992-09-25|1992-08-16|1992-10-11|NONE|SHIP|osits wake quickly quickly sile +5858|1480|20|3|7|9670.36|0.08|0.02|A|F|1992-10-07|1992-08-16|1992-10-15|TAKE BACK RETURN|REG AIR|. doggedly regular packages use pendin +5858|1635|59|4|46|70684.98|0.07|0.06|R|F|1992-09-07|1992-10-06|1992-10-06|DELIVER IN PERSON|MAIL|posits withi +5858|1602|85|5|18|27064.80|0.00|0.07|A|F|1992-11-05|1992-10-08|1992-12-03|NONE|TRUCK|al excuses. bold +5858|1540|21|6|7|10090.78|0.04|0.00|A|F|1992-09-14|1992-10-01|1992-10-01|TAKE BACK RETURN|RAIL|dly pending ac +5858|108|35|7|50|50405.00|0.06|0.00|R|F|1992-07-20|1992-10-07|1992-07-25|NONE|TRUCK|r the ironic ex +5859|1750|35|1|50|82587.50|0.07|0.01|N|O|1997-07-08|1997-06-20|1997-07-27|COLLECT COD|MAIL|ly regular deposits use. ironic +5859|88|64|2|17|16797.36|0.03|0.03|N|O|1997-05-15|1997-06-30|1997-05-26|DELIVER IN PERSON|AIR|ly ironic requests. quickly unusual pin +5859|458|88|3|33|44828.85|0.10|0.04|N|O|1997-07-08|1997-06-22|1997-07-18|TAKE BACK RETURN|TRUCK|eposits unwind furiously final pinto bea +5859|923|24|4|40|72956.80|0.09|0.02|N|O|1997-08-05|1997-06-17|1997-08-20|NONE|REG AIR|l dependenci +5859|1527|8|5|35|49998.20|0.00|0.08|N|O|1997-05-28|1997-07-14|1997-06-15|COLLECT COD|TRUCK|egular acco +5859|435|36|6|9|12018.87|0.01|0.02|N|O|1997-06-15|1997-06-06|1997-06-20|NONE|RAIL|ges boost quickly. blithely r +5859|1902|35|7|27|48705.30|0.05|0.08|N|O|1997-07-30|1997-07-08|1997-08-08|NONE|MAIL| across th +5860|502|93|1|10|14025.00|0.04|0.04|A|F|1992-03-11|1992-03-30|1992-03-31|NONE|MAIL|ual patterns try to eat carefully above +5861|1909|42|1|32|57948.80|0.00|0.03|N|O|1997-05-27|1997-05-29|1997-05-28|TAKE BACK RETURN|MAIL|nt asymptotes. carefully express request +5861|857|24|2|6|10547.10|0.10|0.03|N|O|1997-07-28|1997-05-18|1997-08-24|TAKE BACK RETURN|TRUCK|olites. slyly +5862|1121|58|1|4|4088.48|0.09|0.06|N|O|1997-06-04|1997-04-26|1997-06-19|NONE|TRUCK|yly silent deposit +5862|14|65|2|29|26506.29|0.03|0.05|N|O|1997-04-02|1997-04-16|1997-04-04|NONE|FOB|e fluffily. furiously +5863|1606|48|1|45|67842.00|0.07|0.06|A|F|1993-12-19|1994-01-25|1994-01-05|NONE|REG AIR| deposits are ab +5863|1594|35|2|21|31407.39|0.09|0.03|R|F|1994-01-13|1994-01-09|1994-01-28|DELIVER IN PERSON|FOB|atelets nag blithely furi +5888|613|7|1|46|69626.06|0.02|0.00|N|O|1996-11-18|1996-11-05|1996-12-08|TAKE BACK RETURN|FOB|yly final accounts hag +5888|1116|17|2|24|24410.64|0.03|0.01|N|O|1996-11-07|1996-11-30|1996-11-20|COLLECT COD|SHIP|ing to the spe +5889|762|95|1|17|28266.92|0.09|0.02|N|O|1995-07-01|1995-08-12|1995-07-25|NONE|AIR|blithely pending packages. flu +5890|1123|24|1|38|38916.56|0.01|0.08|A|F|1993-02-14|1992-12-09|1993-02-27|COLLECT COD|FOB| accounts. carefully final asymptotes +5891|850|51|1|22|38518.70|0.00|0.06|R|F|1993-01-01|1993-02-18|1993-01-14|DELIVER IN PERSON|TRUCK|iresias cajole deposits. special, ir +5891|1856|100|2|9|15820.65|0.03|0.07|R|F|1993-01-20|1993-02-27|1993-02-10|COLLECT COD|REG AIR|cajole carefully +5891|297|52|3|10|11972.90|0.08|0.01|A|F|1993-04-14|1993-02-07|1993-04-15|DELIVER IN PERSON|RAIL|nding requests. b +5892|1478|79|1|7|9656.29|0.02|0.03|N|O|1995-06-26|1995-07-18|1995-07-25|COLLECT COD|AIR|e furiously. quickly even deposits da +5892|1500|18|2|37|51855.50|0.09|0.06|N|O|1995-08-12|1995-06-11|1995-09-05|NONE|REG AIR|maintain. bold, expre +5892|21|22|3|28|25788.56|0.03|0.06|N|O|1995-08-16|1995-07-06|1995-08-22|DELIVER IN PERSON|MAIL|ithely unusual accounts will have to integ +5892|748|49|4|23|37921.02|0.08|0.04|R|F|1995-05-18|1995-07-06|1995-05-29|COLLECT COD|MAIL| foxes nag slyly about the qui +5893|1338|53|1|43|53291.19|0.05|0.02|R|F|1992-11-02|1992-09-27|1992-11-21|TAKE BACK RETURN|RAIL|s. regular courts above the carefully silen +5893|19|95|2|2|1838.02|0.10|0.04|R|F|1992-07-18|1992-09-10|1992-08-12|NONE|RAIL|ckages wake sly +5894|74|50|1|23|22403.61|0.04|0.08|A|F|1994-09-05|1994-10-27|1994-09-13|NONE|TRUCK| furiously even deposits haggle alw +5894|785|50|2|48|80917.44|0.04|0.08|A|F|1994-09-04|1994-11-03|1994-09-17|NONE|TRUCK| asymptotes among the blithely silent +5895|148|75|1|38|39829.32|0.05|0.08|N|O|1997-04-05|1997-03-06|1997-05-03|DELIVER IN PERSON|RAIL|ts are furiously. regular, final excuses +5895|1216|17|2|47|52508.87|0.04|0.06|N|O|1997-04-27|1997-03-17|1997-05-07|DELIVER IN PERSON|AIR|r packages wake carefull +5895|838|38|3|49|85202.67|0.03|0.07|N|O|1997-03-15|1997-02-17|1997-04-04|NONE|TRUCK|permanent foxes. packages +5895|1458|59|4|31|42142.95|0.03|0.01|N|O|1997-03-03|1997-03-30|1997-03-08|TAKE BACK RETURN|TRUCK| final deposits nod slyly careful +5895|1992|93|5|20|37879.80|0.07|0.00|N|O|1997-04-30|1997-02-07|1997-05-08|DELIVER IN PERSON|AIR|gular deposits wake blithely carefully fin +5895|778|43|6|15|25181.55|0.08|0.08|N|O|1997-04-19|1997-03-09|1997-05-13|TAKE BACK RETURN|RAIL|silent package +5920|1861|62|1|50|88143.00|0.06|0.00|A|F|1995-03-13|1995-01-03|1995-03-31|TAKE BACK RETURN|RAIL|across the carefully pending platelets +5920|578|79|2|24|35485.68|0.01|0.05|A|F|1994-12-28|1995-01-21|1994-12-31|DELIVER IN PERSON|FOB|fully regular dolphins. furiousl +5920|1170|7|3|2|2142.34|0.08|0.07|A|F|1995-02-18|1995-01-13|1995-03-04|NONE|SHIP| evenly spe +5920|114|93|4|28|28395.08|0.06|0.02|R|F|1994-12-17|1995-02-13|1994-12-31|NONE|SHIP|le slyly slyly even deposits. f +5920|992|95|5|42|79505.58|0.09|0.08|A|F|1994-12-18|1995-01-07|1995-01-14|COLLECT COD|AIR|lar, ironic dependencies sno +5921|981|84|1|44|82807.12|0.07|0.01|R|F|1994-07-14|1994-06-30|1994-07-15|NONE|TRUCK|ain about the special +5921|1457|36|2|25|33961.25|0.06|0.01|A|F|1994-05-19|1994-06-15|1994-06-17|COLLECT COD|TRUCK|nd the slyly regular deposits. quick +5921|672|35|3|17|26735.39|0.06|0.01|R|F|1994-05-20|1994-05-26|1994-05-23|NONE|FOB|final asymptotes. even packages boost +5921|274|29|4|26|30531.02|0.03|0.04|A|F|1994-05-03|1994-07-06|1994-05-06|NONE|AIR|hy dependenc +5921|1423|63|5|41|54301.22|0.04|0.02|R|F|1994-04-13|1994-05-31|1994-04-26|DELIVER IN PERSON|AIR|nusual, regular theodol +5921|1145|46|6|5|5230.70|0.02|0.00|R|F|1994-06-01|1994-05-07|1994-06-10|COLLECT COD|TRUCK|eas cajole across the final, fi +5922|1957|90|1|9|16730.55|0.07|0.00|N|O|1996-12-04|1997-01-20|1996-12-08|DELIVER IN PERSON|RAIL|haggle slyly even packages. packages +5922|1566|47|2|37|54299.72|0.01|0.04|N|O|1996-12-19|1996-12-16|1997-01-15|COLLECT COD|RAIL|s wake slyly. requests cajole furiously asy +5922|896|63|3|35|62891.15|0.08|0.00|N|O|1996-12-12|1997-01-21|1997-01-01|DELIVER IN PERSON|SHIP|accounts. regu +5922|651|52|4|13|20171.45|0.08|0.07|N|O|1997-03-08|1996-12-26|1997-04-03|DELIVER IN PERSON|FOB|sly special accounts wake ironically. +5922|565|96|5|39|57156.84|0.04|0.07|N|O|1997-03-04|1997-01-17|1997-03-25|TAKE BACK RETURN|SHIP|e of the instructions. quick +5922|1789|32|6|10|16907.80|0.04|0.01|N|O|1997-02-23|1996-12-26|1997-03-04|NONE|REG AIR|sly regular deposits haggle quickly ins +5923|1770|71|1|27|45137.79|0.08|0.03|N|O|1997-08-16|1997-06-27|1997-08-29|DELIVER IN PERSON|RAIL|arefully i +5923|1186|23|2|42|45661.56|0.01|0.08|N|O|1997-09-16|1997-07-23|1997-09-27|COLLECT COD|REG AIR|y regular theodolites w +5923|1076|82|3|2|1954.14|0.06|0.05|N|O|1997-06-19|1997-07-31|1997-06-28|TAKE BACK RETURN|TRUCK|express patterns. even deposits +5923|1732|75|4|46|75151.58|0.05|0.04|N|O|1997-07-29|1997-07-23|1997-08-23|COLLECT COD|SHIP|nto beans cajole blithe +5923|586|47|5|35|52030.30|0.04|0.05|N|O|1997-07-21|1997-07-11|1997-08-01|DELIVER IN PERSON|AIR|sts affix unusual, final requests. request +5924|1752|37|1|38|62842.50|0.06|0.05|N|O|1995-12-17|1995-12-11|1996-01-06|TAKE BACK RETURN|AIR|ions cajole carefully along the +5924|524|55|2|49|69801.48|0.04|0.00|N|O|1995-10-25|1995-12-11|1995-11-08|NONE|MAIL|inly final excuses. blithely regular requ +5924|168|69|3|24|25635.84|0.09|0.08|N|O|1996-01-12|1995-12-13|1996-01-25|COLLECT COD|REG AIR| use carefully. special, e +5925|866|100|1|42|74208.12|0.05|0.02|N|O|1996-03-05|1996-01-13|1996-03-10|COLLECT COD|SHIP|to the furiously +5925|1250|25|2|31|35688.75|0.03|0.03|N|O|1996-01-02|1995-12-14|1996-01-07|TAKE BACK RETURN|FOB|e slyly. furiously regular deposi +5925|883|50|3|50|89194.00|0.03|0.04|N|O|1996-02-14|1996-01-10|1996-02-15|NONE|TRUCK|es. stealthily express pains print bli +5925|534|95|4|30|43035.90|0.02|0.07|N|O|1996-02-21|1996-02-11|1996-03-10|NONE|TRUCK| the packa +5925|1598|99|5|41|61483.19|0.00|0.06|N|O|1996-02-03|1995-12-24|1996-02-20|NONE|SHIP| across the pending deposits nag caref +5925|499|87|6|48|67175.52|0.02|0.00|N|O|1996-02-03|1996-01-19|1996-03-04|DELIVER IN PERSON|REG AIR| haggle after the fo +5926|893|60|1|8|14351.12|0.02|0.00|R|F|1994-07-17|1994-07-20|1994-08-11|COLLECT COD|MAIL|gle furiously express foxes. bo +5926|498|86|2|27|37759.23|0.09|0.05|A|F|1994-07-05|1994-08-11|1994-08-02|DELIVER IN PERSON|MAIL|ironic requests +5926|1268|69|3|46|53785.96|0.01|0.03|R|F|1994-09-05|1994-08-12|1994-09-11|COLLECT COD|RAIL|ts integrate. courts haggl +5926|1897|27|4|23|41374.47|0.01|0.02|A|F|1994-07-23|1994-08-10|1994-07-27|DELIVER IN PERSON|FOB|ickly special packages among +5927|896|30|1|44|79063.16|0.04|0.05|N|O|1997-11-29|1997-11-21|1997-12-13|DELIVER IN PERSON|TRUCK|rding to the special, final decoy +5927|1146|19|2|8|8377.12|0.04|0.05|N|O|1997-09-24|1997-11-15|1997-10-22|TAKE BACK RETURN|SHIP|ilent dependencies nod c +5927|1661|3|3|32|50005.12|0.10|0.07|N|O|1997-12-26|1997-10-27|1997-12-31|COLLECT COD|AIR|telets. carefully bold accounts was +5952|1999|44|1|49|93148.51|0.10|0.02|N|O|1997-06-30|1997-07-10|1997-07-02|COLLECT COD|AIR|e furiously regular +5952|1902|35|2|11|19842.90|0.10|0.05|N|O|1997-05-13|1997-06-04|1997-05-27|DELIVER IN PERSON|FOB|y nag blithely aga +5952|704|5|3|43|69002.10|0.01|0.01|N|O|1997-06-29|1997-06-06|1997-07-15|COLLECT COD|MAIL|posits sleep furiously quickly final p +5952|1579|60|4|23|34053.11|0.00|0.07|N|O|1997-05-13|1997-06-27|1997-05-20|NONE|TRUCK|e blithely packages. eve +5953|1282|83|1|36|42598.08|0.03|0.00|R|F|1992-05-28|1992-06-24|1992-05-29|DELIVER IN PERSON|FOB| cajole furio +5953|121|48|2|34|34718.08|0.03|0.04|A|F|1992-05-04|1992-06-12|1992-06-02|NONE|RAIL|hockey players use furiously against th +5953|1611|94|3|5|7563.05|0.07|0.06|A|F|1992-04-10|1992-04-27|1992-04-14|NONE|SHIP|s. blithely +5953|1684|26|4|23|36470.64|0.09|0.02|R|F|1992-06-05|1992-06-03|1992-06-29|TAKE BACK RETURN|FOB|he silent ideas. silent foxes po +5954|1468|86|1|8|10955.68|0.03|0.00|A|F|1993-03-27|1993-01-22|1993-04-04|TAKE BACK RETURN|AIR|unusual th +5954|803|37|2|40|68152.00|0.02|0.01|A|F|1992-12-30|1993-01-16|1993-01-09|COLLECT COD|RAIL|iously ironic deposits after +5954|934|37|3|20|36698.60|0.09|0.07|A|F|1992-12-25|1993-02-05|1992-12-31|COLLECT COD|REG AIR| accounts wake carefu +5954|1447|65|4|20|26968.80|0.00|0.01|R|F|1993-02-27|1993-01-04|1993-03-08|NONE|TRUCK|ke furiously blithely special packa +5954|998|1|5|35|66464.65|0.04|0.06|A|F|1993-03-17|1993-02-06|1993-04-10|NONE|SHIP|tions maintain slyly. furious +5954|1921|66|6|39|71093.88|0.04|0.08|A|F|1993-02-27|1993-02-25|1993-03-29|DELIVER IN PERSON|REG AIR| always regular dolphins. furiously p +5955|1394|71|1|14|18135.46|0.08|0.08|N|O|1995-06-22|1995-05-23|1995-06-24|DELIVER IN PERSON|TRUCK| unusual, bold theodolit +5955|616|10|2|15|22749.15|0.08|0.07|R|F|1995-04-22|1995-05-28|1995-04-27|NONE|FOB|y final accounts above the regu +5955|1112|85|3|40|40524.40|0.03|0.00|R|F|1995-04-01|1995-06-11|1995-04-27|NONE|FOB|oss the fluffily regular +5956|1541|82|1|10|14425.40|0.04|0.05|N|O|1998-07-27|1998-07-04|1998-08-21|NONE|MAIL|ic packages am +5956|542|33|2|23|33178.42|0.08|0.03|N|O|1998-06-06|1998-07-10|1998-06-15|DELIVER IN PERSON|RAIL|ly slyly special +5956|1749|92|3|47|77584.78|0.04|0.06|N|O|1998-09-06|1998-06-29|1998-09-18|TAKE BACK RETURN|MAIL|lyly express theodol +5956|200|79|4|40|44008.00|0.09|0.05|N|O|1998-06-11|1998-07-19|1998-06-21|NONE|MAIL|final theodolites sleep carefully ironic c +5957|147|74|1|37|38744.18|0.07|0.00|A|F|1994-04-18|1994-02-19|1994-05-11|NONE|AIR| ideas use ruthlessly. +5957|588|49|2|46|68474.68|0.04|0.08|A|F|1994-01-23|1994-01-30|1994-02-07|NONE|SHIP|platelets. furiously unusual requests +5957|14|65|3|17|15538.17|0.01|0.01|A|F|1994-01-24|1994-02-16|1994-02-08|TAKE BACK RETURN|SHIP|. final, pending packages +5957|1315|92|4|29|35272.99|0.01|0.03|R|F|1994-02-24|1994-03-04|1994-03-08|COLLECT COD|REG AIR|sits. final, even asymptotes cajole quickly +5957|873|73|5|40|70954.80|0.04|0.04|R|F|1994-01-07|1994-02-05|1994-01-26|DELIVER IN PERSON|SHIP|ironic asymptotes sleep blithely again +5957|51|2|6|41|38993.05|0.10|0.07|R|F|1994-03-25|1994-02-20|1994-03-31|DELIVER IN PERSON|MAIL|es across the regular requests maint +5957|1585|6|7|32|47570.56|0.10|0.07|A|F|1994-03-05|1994-02-20|1994-03-09|NONE|TRUCK| boost carefully across the +5958|1489|7|1|33|45885.84|0.02|0.04|N|O|1995-09-24|1995-12-12|1995-10-05|COLLECT COD|MAIL|lar, regular accounts wake furi +5958|430|89|2|23|30599.89|0.03|0.04|N|O|1995-09-26|1995-10-19|1995-09-27|COLLECT COD|SHIP|regular requests. bold, bold deposits unwin +5958|1527|8|3|42|59997.84|0.10|0.00|N|O|1995-12-12|1995-10-19|1996-01-09|NONE|AIR|n accounts. final, ironic packages +5958|385|86|4|18|23136.84|0.04|0.05|N|O|1995-12-02|1995-10-17|1995-12-22|COLLECT COD|FOB|regular requests haggle +5958|1318|57|5|32|39017.92|0.06|0.00|N|O|1995-09-20|1995-12-10|1995-10-14|COLLECT COD|REG AIR|e carefully special theodolites. carefully +5959|1342|81|1|49|60923.66|0.07|0.03|R|F|1992-07-16|1992-08-09|1992-08-14|DELIVER IN PERSON|SHIP|usual packages haggle slyly pi +5959|1463|64|2|17|23195.82|0.09|0.07|R|F|1992-06-10|1992-07-06|1992-06-23|COLLECT COD|MAIL|ackages. blithely ex +5959|44|45|3|4|3776.16|0.04|0.03|R|F|1992-06-14|1992-07-05|1992-07-01|NONE|MAIL|gular requests ar +5959|1960|61|4|13|24205.48|0.03|0.00|A|F|1992-07-29|1992-07-13|1992-08-20|COLLECT COD|SHIP|ar forges. deposits det +5959|400|85|5|37|48114.80|0.04|0.01|R|F|1992-06-05|1992-07-18|1992-06-29|NONE|TRUCK|endencies. brai +5959|1182|19|6|35|37911.30|0.03|0.00|A|F|1992-05-27|1992-06-19|1992-06-23|NONE|TRUCK|ely silent deposits. +5959|422|52|7|47|62153.74|0.02|0.01|R|F|1992-08-28|1992-07-24|1992-09-09|TAKE BACK RETURN|RAIL|deposits. slyly special cou +5984|695|89|1|13|20743.97|0.06|0.07|R|F|1994-10-16|1994-09-06|1994-11-11|NONE|MAIL|lar platelets. f +5984|1013|14|2|25|22850.25|0.05|0.08|R|F|1994-10-06|1994-07-21|1994-10-28|COLLECT COD|RAIL|gular accounts. even packages nag slyly +5984|4|30|3|8|7232.00|0.10|0.00|R|F|1994-09-17|1994-08-28|1994-09-25|COLLECT COD|RAIL|its. express, +5984|1898|99|4|35|62996.15|0.00|0.01|A|F|1994-08-25|1994-08-05|1994-08-31|DELIVER IN PERSON|SHIP|le fluffily regula +5985|858|92|1|4|7035.40|0.02|0.02|A|F|1995-05-04|1995-04-01|1995-05-17|DELIVER IN PERSON|MAIL|ole along the quickly slow d +5986|788|85|1|26|43908.28|0.00|0.00|R|F|1992-08-10|1992-05-23|1992-08-24|TAKE BACK RETURN|SHIP|e fluffily ironic ideas. silent +5986|1953|98|2|25|46373.75|0.03|0.06|A|F|1992-06-16|1992-07-17|1992-06-29|TAKE BACK RETURN|MAIL| instructions. slyly regular de +5986|297|25|3|1|1197.29|0.07|0.06|A|F|1992-05-21|1992-06-21|1992-05-24|DELIVER IN PERSON|REG AIR|fix quickly quickly final deposits. fluffil +5986|896|96|4|31|55703.59|0.00|0.03|A|F|1992-08-21|1992-06-29|1992-09-14|NONE|AIR|structions! furiously pending instructi +5986|1352|53|5|6|7520.10|0.05|0.02|A|F|1992-07-16|1992-06-10|1992-07-29|DELIVER IN PERSON|RAIL|al foxes within the slyly speci +5987|221|76|1|1|1121.22|0.01|0.04|N|O|1996-09-13|1996-10-29|1996-09-21|DELIVER IN PERSON|REG AIR|refully final excuses haggle furiously ag +5987|1753|38|2|20|33095.00|0.10|0.06|N|O|1996-11-28|1996-09-17|1996-12-05|TAKE BACK RETURN|RAIL|ing excuses nag quickly always bold +5987|912|13|3|43|77955.13|0.08|0.04|N|O|1996-10-30|1996-10-13|1996-11-12|NONE|AIR|theodolites wake above the furiously b +5987|961|64|4|37|68892.52|0.08|0.08|N|O|1996-10-15|1996-10-27|1996-11-09|NONE|MAIL|le furiously carefully special +5988|1720|5|1|41|66490.52|0.08|0.03|R|F|1994-01-20|1994-02-06|1994-02-10|COLLECT COD|AIR|the pending, express reque +5989|787|84|1|46|77637.88|0.09|0.05|N|O|1996-01-28|1995-11-26|1996-02-27|NONE|SHIP|ncies cajole. furiously +5989|1121|58|2|41|41906.92|0.04|0.08|N|O|1996-01-29|1995-12-26|1996-02-20|DELIVER IN PERSON|SHIP|quickly ironic packages. special orbits +5989|1507|8|3|49|69016.50|0.05|0.05|N|O|1995-11-20|1995-11-22|1995-11-30|NONE|AIR|ven requests use slyly care +5989|1822|52|4|31|53438.42|0.03|0.06|N|O|1996-01-23|1996-01-04|1996-02-20|TAKE BACK RETURN|TRUCK|anent instructions. furiousl +5989|762|95|5|26|43231.76|0.09|0.03|N|O|1995-11-22|1995-12-07|1995-12-14|COLLECT COD|RAIL|ial dolphins sleep fluffily final accoun +5989|453|54|6|32|43310.40|0.10|0.00|N|O|1995-11-21|1995-12-09|1995-12-21|TAKE BACK RETURN|MAIL|lar requests. d +5989|60|11|7|32|30721.92|0.02|0.00|N|O|1996-01-23|1995-11-22|1996-01-31|NONE|AIR|ly pending instruction +5990|1290|65|1|31|36929.99|0.00|0.06|A|F|1993-06-02|1993-06-02|1993-06-30|NONE|SHIP| deposits cajole carefully above the care +5990|1990|35|2|28|52975.72|0.00|0.01|A|F|1993-04-22|1993-05-16|1993-05-16|COLLECT COD|AIR|s! always pending requests according to the +5990|802|3|3|44|74923.20|0.01|0.06|R|F|1993-06-22|1993-05-21|1993-06-28|NONE|FOB|packages. carefully ironic ideas +5991|1650|33|1|4|6206.60|0.06|0.01|R|F|1994-08-13|1994-06-30|1994-08-20|COLLECT COD|TRUCK|le blithely deposits. bold platelets +5991|112|39|2|30|30363.30|0.10|0.04|A|F|1994-05-21|1994-08-01|1994-06-02|TAKE BACK RETURN|MAIL|ze about the unusual pinto beans. slyly r +5991|458|17|3|10|13584.50|0.03|0.03|A|F|1994-05-29|1994-06-30|1994-06-13|TAKE BACK RETURN|AIR|rs. final pinto beans was ev +6016|1447|26|1|14|18878.16|0.01|0.08|A|F|1992-04-13|1992-04-11|1992-04-18|NONE|MAIL|sleep carefully af +6016|207|62|2|50|55360.00|0.08|0.03|R|F|1992-04-29|1992-04-12|1992-05-27|NONE|FOB| wake blithel +6016|487|88|3|20|27749.60|0.10|0.01|A|F|1992-04-18|1992-03-23|1992-05-11|TAKE BACK RETURN|SHIP|dolites cajole quickly. foxes u +6017|1986|87|1|13|24543.74|0.10|0.08|R|F|1995-03-19|1995-03-05|1995-04-04|COLLECT COD|MAIL|around the furiously +6017|1367|68|2|44|55807.84|0.05|0.01|A|F|1995-03-20|1995-04-09|1995-04-18|TAKE BACK RETURN|REG AIR|he quickly ironic r +6017|237|38|3|19|21607.37|0.06|0.06|R|F|1995-03-18|1995-03-28|1995-04-05|DELIVER IN PERSON|REG AIR|symptotes accordin +6017|253|8|4|29|33444.25|0.07|0.03|R|F|1995-02-16|1995-03-16|1995-03-13|DELIVER IN PERSON|RAIL|ickly unusual requests. reque +6017|1569|70|5|9|13235.04|0.02|0.01|R|F|1995-02-08|1995-03-12|1995-03-06|TAKE BACK RETURN|REG AIR|efully silent requ +6018|1154|55|1|2|2110.30|0.07|0.06|R|F|1992-09-09|1992-10-29|1992-09-16|TAKE BACK RETURN|MAIL|quests integrate careful +6018|1284|85|2|17|20149.76|0.09|0.07|R|F|1992-09-17|1992-11-17|1992-10-08|COLLECT COD|RAIL|cial accounts. r +6019|402|61|1|28|36467.20|0.05|0.03|A|F|1993-08-14|1993-10-28|1993-08-18|TAKE BACK RETURN|SHIP|asymptotes +6020|1196|69|1|50|54859.50|0.03|0.00|A|F|1994-11-18|1994-12-11|1994-11-24|TAKE BACK RETURN|REG AIR|r deposits nag carefully +6020|512|3|2|47|66387.97|0.03|0.07|R|F|1994-10-31|1994-10-29|1994-11-21|NONE|TRUCK|s cajole. carefully special dep +6020|278|79|3|1|1178.27|0.06|0.05|A|F|1995-01-12|1994-11-03|1995-01-27|TAKE BACK RETURN|FOB|hins cajole carefully. bold waters ha +6020|698|61|4|38|60750.22|0.05|0.00|R|F|1994-11-07|1994-10-30|1994-11-15|DELIVER IN PERSON|RAIL|ccounts. account +6020|1702|45|5|33|52922.10|0.09|0.01|R|F|1994-12-11|1994-11-06|1995-01-09|DELIVER IN PERSON|FOB|ly across the asymptotes. ironic requests e +6020|1741|68|6|32|52567.68|0.00|0.01|A|F|1994-10-30|1994-11-30|1994-11-27|NONE|TRUCK|s about the carefully even instruc +6020|269|70|7|37|43262.62|0.09|0.06|R|F|1994-10-15|1994-11-17|1994-11-10|NONE|RAIL|kages sleep stealthil +6021|630|24|1|16|24490.08|0.06|0.07|N|O|1998-01-28|1997-12-14|1998-02-11|COLLECT COD|AIR|mptotes against the packages cajole car +6021|1407|47|2|37|48410.80|0.03|0.02|N|O|1997-12-12|1998-01-05|1997-12-13|TAKE BACK RETURN|SHIP|unts. slyly regular foxes impress care +6021|1850|94|3|31|54307.35|0.01|0.05|N|O|1997-12-30|1998-01-30|1997-12-31|TAKE BACK RETURN|SHIP|n foxes. silently even requests use sl +6021|1923|12|4|7|12774.44|0.10|0.06|N|O|1998-01-30|1998-01-14|1998-02-23|COLLECT COD|REG AIR|bold packages. +6021|1608|9|5|12|18115.20|0.06|0.04|N|O|1997-11-25|1998-01-24|1997-12-02|DELIVER IN PERSON|MAIL|ing ideas sleep blithely final +6021|678|79|6|38|59989.46|0.03|0.00|N|O|1997-12-11|1997-12-21|1998-01-10|NONE|MAIL|quickly special requests sl +6022|612|75|1|23|34790.03|0.06|0.04|A|F|1995-05-05|1995-03-25|1995-05-14|COLLECT COD|SHIP| ideas use furiously express gifts. fluffil +6022|1435|36|2|37|49447.91|0.07|0.01|N|F|1995-06-10|1995-03-15|1995-07-07|NONE|FOB|ts. bold deposits are eve +6022|1170|43|3|9|9640.53|0.05|0.08|A|F|1995-02-20|1995-05-14|1995-03-02|DELIVER IN PERSON|AIR|s. packages detect furiously abou +6022|328|57|4|24|29479.68|0.01|0.03|N|F|1995-06-10|1995-05-02|1995-06-22|COLLECT COD|TRUCK| furiously express deposit +6022|560|51|5|46|67185.76|0.03|0.06|A|F|1995-02-20|1995-05-02|1995-03-22|COLLECT COD|TRUCK|e blithely +6022|1559|40|6|42|61343.10|0.05|0.04|N|F|1995-06-14|1995-03-21|1995-06-27|COLLECT COD|REG AIR|ole blithely pending requests. fin +6022|1750|51|7|32|52856.00|0.03|0.06|A|F|1995-03-02|1995-05-14|1995-03-27|COLLECT COD|MAIL|y. frays are after the blit +6023|718|51|1|12|19424.52|0.03|0.08|N|O|1998-04-16|1998-05-18|1998-05-13|TAKE BACK RETURN|RAIL|elets wake slyly after t +6023|1566|7|2|20|29351.20|0.07|0.02|N|O|1998-06-14|1998-05-18|1998-07-08|DELIVER IN PERSON|MAIL|mptotes wake regular, even +6023|1995|84|3|9|17072.91|0.10|0.01|N|O|1998-06-24|1998-06-23|1998-07-10|NONE|FOB|, final requests. careful +6023|21|72|4|48|44208.96|0.02|0.07|N|O|1998-06-25|1998-05-25|1998-07-04|TAKE BACK RETURN|SHIP|yers; theodolites alongside of the slyl +6023|1280|18|5|27|31894.56|0.02|0.01|N|O|1998-04-28|1998-07-09|1998-05-16|TAKE BACK RETURN|MAIL|ily regular, s +6023|1985|74|6|45|84914.10|0.07|0.01|N|O|1998-06-14|1998-06-14|1998-07-08|DELIVER IN PERSON|RAIL|st carefull +6023|277|59|7|2|2354.54|0.10|0.06|N|O|1998-05-10|1998-07-02|1998-06-09|NONE|TRUCK|s-- bold forges wake furiously. quic +6048|1188|61|1|6|6535.08|0.05|0.06|N|O|1996-05-03|1996-07-02|1996-05-20|DELIVER IN PERSON|REG AIR|. carefully +6048|1410|11|2|4|5245.64|0.05|0.05|N|O|1996-06-21|1996-05-18|1996-07-19|TAKE BACK RETURN|AIR|ole slyly furio +6048|170|23|3|12|12842.04|0.01|0.06|N|O|1996-05-28|1996-05-31|1996-06-02|DELIVER IN PERSON|FOB|al instructions us +6048|1130|3|4|22|22684.86|0.00|0.08|N|O|1996-07-24|1996-06-20|1996-07-28|NONE|TRUCK|ously express foxes about the carefully +6048|740|5|5|19|31174.06|0.05|0.04|N|O|1996-07-17|1996-07-08|1996-07-31|NONE|SHIP|furiously r +6048|1130|67|6|39|40214.07|0.06|0.08|N|O|1996-06-26|1996-05-16|1996-06-27|NONE|TRUCK|ven hockey players. furiously +6048|1996|41|7|14|26571.86|0.09|0.01|N|O|1996-08-04|1996-06-27|1996-08-15|COLLECT COD|RAIL|ronic reques +6049|1021|27|1|44|40568.88|0.00|0.07|N|O|1998-06-26|1998-04-18|1998-06-29|DELIVER IN PERSON|SHIP|o the care +6049|583|74|2|1|1483.58|0.00|0.05|N|O|1998-06-17|1998-05-05|1998-07-12|COLLECT COD|SHIP|ly even dependencies +6049|1664|6|3|10|15656.60|0.08|0.04|N|O|1998-04-06|1998-05-15|1998-05-03|DELIVER IN PERSON|SHIP|l, regular +6049|382|39|4|41|52577.58|0.05|0.00|N|O|1998-04-13|1998-05-19|1998-05-13|COLLECT COD|SHIP| regular requests detect d +6049|53|79|5|18|17154.90|0.09|0.05|N|O|1998-03-18|1998-04-21|1998-04-13|TAKE BACK RETURN|FOB|regular requests are pending +6049|739|4|6|19|31154.87|0.04|0.00|N|O|1998-04-21|1998-04-20|1998-05-17|TAKE BACK RETURN|RAIL|slyly express accou +6049|1052|58|7|46|43840.30|0.03|0.08|N|O|1998-04-08|1998-04-28|1998-04-16|COLLECT COD|RAIL|endencies sleep bold platelets. careful +6050|1988|89|1|31|58589.38|0.04|0.02|A|F|1993-06-06|1993-04-30|1993-06-10|DELIVER IN PERSON|RAIL|aggle blithely. blithely iro +6050|265|66|2|28|32627.28|0.08|0.05|R|F|1993-07-12|1993-05-14|1993-07-21|TAKE BACK RETURN|FOB|ns sleep c +6050|1609|33|3|27|40786.20|0.09|0.06|A|F|1993-05-26|1993-05-19|1993-06-14|DELIVER IN PERSON|TRUCK|detect carefully across the fluff +6050|1542|83|4|28|40419.12|0.03|0.03|A|F|1993-04-16|1993-05-16|1993-04-28|COLLECT COD|RAIL|y pending deposits run carefully. bold cou +6051|1894|95|1|44|79019.16|0.07|0.07|N|O|1998-08-19|1998-07-04|1998-09-13|COLLECT COD|FOB|odolites-- fin +6051|1347|24|2|8|9986.72|0.05|0.07|N|O|1998-06-09|1998-08-01|1998-06-22|NONE|SHIP| requests doze. special, +6051|1422|23|3|30|39702.60|0.09|0.06|N|O|1998-07-05|1998-06-29|1998-07-17|TAKE BACK RETURN|REG AIR|efully busy asymptote +6051|836|37|4|17|29526.11|0.09|0.05|N|O|1998-08-17|1998-07-28|1998-08-29|NONE|SHIP| furiously special requests lose +6051|1539|60|5|50|72026.50|0.05|0.05|N|O|1998-06-15|1998-07-29|1998-06-30|DELIVER IN PERSON|TRUCK|osits are furiousl +6051|1307|8|6|27|32624.10|0.08|0.01|N|O|1998-05-23|1998-07-06|1998-06-20|NONE|FOB| blithely regular courts +6052|781|82|1|12|20181.36|0.10|0.05|A|F|1993-04-30|1993-05-19|1993-05-08|COLLECT COD|REG AIR|he even packag +6052|1400|15|2|45|58563.00|0.09|0.06|R|F|1993-08-13|1993-07-05|1993-08-17|TAKE BACK RETURN|SHIP|. regular, final platelets boost fluffi +6053|882|49|1|23|41006.24|0.08|0.05|R|F|1994-01-26|1994-01-24|1994-02-11|NONE|SHIP| permanently unus +6053|713|78|2|22|35501.62|0.09|0.07|A|F|1994-01-22|1994-02-04|1994-02-09|NONE|FOB| foxes affix carefully unusual dep +6054|1797|82|1|42|71349.18|0.07|0.08|N|O|1995-11-30|1995-10-11|1995-12-05|TAKE BACK RETURN|TRUCK|lithely final accounts +6054|1749|50|2|30|49522.20|0.05|0.08|N|O|1995-09-19|1995-10-29|1995-10-03|TAKE BACK RETURN|MAIL|r deposits slee +6055|883|50|1|5|8919.40|0.04|0.05|N|O|1997-01-04|1997-01-20|1997-01-21|TAKE BACK RETURN|REG AIR|gly ironic foxes. quickly +6055|494|95|2|40|55779.60|0.07|0.07|N|O|1996-11-19|1997-01-07|1996-12-08|COLLECT COD|TRUCK|nst the quickly unusual platelets sleep s +6055|1053|54|3|9|8586.45|0.10|0.02|N|O|1997-02-25|1996-12-29|1997-03-13|DELIVER IN PERSON|AIR|ely furiously ironi +6055|1256|94|4|14|16201.50|0.05|0.06|N|O|1996-12-29|1997-01-17|1997-01-04|DELIVER IN PERSON|SHIP|the packages? quickly unu +6055|962|65|5|6|11177.76|0.05|0.00|N|O|1997-02-14|1996-12-20|1997-03-04|NONE|RAIL|atelets affix slyly furiously eve +6055|1755|56|6|48|79524.00|0.04|0.07|N|O|1996-12-01|1996-12-12|1996-12-15|DELIVER IN PERSON|RAIL|ly regular packa +6055|525|56|7|6|8553.12|0.05|0.07|N|O|1997-02-20|1996-12-15|1997-03-07|COLLECT COD|FOB| against the final, ironic deposits. b +6080|719|20|1|41|66408.11|0.03|0.07|N|O|1996-10-02|1996-08-20|1996-10-14|NONE|RAIL|g the furiously regular account +6081|921|22|1|48|87452.16|0.05|0.04|N|O|1997-12-29|1998-01-04|1998-01-05|TAKE BACK RETURN|TRUCK|y unusual packages +6081|549|80|2|8|11596.32|0.07|0.08|N|O|1998-02-22|1998-01-06|1998-03-11|TAKE BACK RETURN|SHIP|ully. deposits sleep. furiousl +6081|348|5|3|4|4993.36|0.08|0.01|N|O|1997-12-05|1998-01-27|1997-12-23|COLLECT COD|TRUCK|fully carefully unusual accounts- +6081|1756|41|4|26|43101.50|0.04|0.08|N|O|1997-12-07|1998-01-10|1997-12-13|TAKE BACK RETURN|REG AIR|s. ideas above the carefully fi +6081|840|41|5|8|13926.72|0.07|0.06|N|O|1997-11-11|1997-12-07|1997-12-03|COLLECT COD|FOB|final asymptotes. slyly express +6081|176|77|6|36|38742.12|0.04|0.00|N|O|1998-01-14|1998-01-05|1998-02-02|TAKE BACK RETURN|RAIL|ess, special ac +6082|1143|52|1|48|50118.72|0.03|0.08|N|O|1996-06-06|1996-05-06|1996-06-08|NONE|FOB|ter the slyly final theodolites. foxes us +6082|975|78|2|2|3751.94|0.04|0.08|N|O|1996-05-31|1996-04-12|1996-06-13|DELIVER IN PERSON|AIR| the packages. express deposits affix +6082|346|31|3|45|56085.30|0.09|0.06|N|O|1996-04-08|1996-04-29|1996-04-27|TAKE BACK RETURN|REG AIR|ronic asymptotes. fi +6083|799|32|1|19|32296.01|0.07|0.06|N|O|1996-09-27|1996-09-28|1996-10-12|DELIVER IN PERSON|SHIP|l deposits haggle. regular +6083|1456|57|2|46|62442.70|0.03|0.07|N|O|1996-10-23|1996-09-04|1996-11-04|TAKE BACK RETURN|SHIP|gular ideas. slyly regular +6084|909|78|1|27|48867.30|0.04|0.08|N|O|1997-03-01|1997-02-14|1997-03-17|COLLECT COD|AIR|e platelets nag regular, quick +6084|69|45|2|4|3876.24|0.07|0.03|N|O|1997-03-30|1997-03-14|1997-04-20|NONE|MAIL| to cajole a +6084|275|30|3|3|3525.81|0.10|0.05|N|O|1997-04-01|1997-02-20|1997-04-29|COLLECT COD|TRUCK|y ironic depo +6084|1084|20|4|15|14776.20|0.09|0.00|N|O|1996-12-21|1997-01-16|1996-12-28|NONE|REG AIR| theodolites: +6084|332|61|5|26|32040.58|0.10|0.03|N|O|1997-04-17|1997-03-17|1997-04-23|TAKE BACK RETURN|FOB| dolphins sleep. s +6084|186|13|6|12|13034.16|0.02|0.07|N|O|1996-12-19|1997-02-22|1997-01-17|DELIVER IN PERSON|REG AIR| sleep furiously slyly special pint +6085|1957|58|1|17|31602.15|0.10|0.07|N|O|1998-05-10|1998-04-01|1998-06-01|TAKE BACK RETURN|FOB|ly ironic courts after the fluffily expres +6085|308|65|2|2|2416.60|0.05|0.04|N|O|1998-03-30|1998-03-15|1998-04-26|DELIVER IN PERSON|RAIL|al accounts. requests integrate always alon +6085|199|52|3|8|8793.52|0.01|0.02|N|O|1998-05-03|1998-05-05|1998-05-14|COLLECT COD|TRUCK|riously after the bl +6086|1772|57|1|42|70298.34|0.03|0.06|N|O|1996-01-17|1995-11-16|1996-02-07|NONE|MAIL|of the instr +6086|89|15|2|10|9890.80|0.03|0.00|N|O|1996-01-13|1995-12-19|1996-01-25|DELIVER IN PERSON|TRUCK|lyly ironic requ +6086|553|44|3|25|36338.75|0.01|0.02|N|O|1995-10-18|1995-11-04|1995-11-06|NONE|TRUCK|l packages inside the final packages are +6086|812|79|4|37|63373.97|0.05|0.02|N|O|1995-10-15|1995-11-17|1995-11-04|TAKE BACK RETURN|MAIL|ckages are carefully bold deposits. blithe +6086|1481|21|5|2|2764.96|0.05|0.05|N|O|1995-12-24|1995-11-20|1996-01-03|NONE|AIR|fully busy orbi +6086|232|87|6|50|56611.50|0.10|0.05|N|O|1995-11-26|1995-10-28|1995-12-13|NONE|MAIL|doze blithely. deposits are +6087|1658|59|1|15|23394.75|0.02|0.02|N|O|1998-03-11|1998-02-12|1998-03-18|TAKE BACK RETURN|REG AIR|the final ideas. fluffily pen +6087|503|64|2|43|60350.50|0.04|0.06|N|O|1998-04-17|1998-03-14|1998-04-28|TAKE BACK RETURN|SHIP|press accounts against the furi +6087|604|98|3|44|66202.40|0.07|0.07|N|O|1998-03-25|1998-03-14|1998-04-05|NONE|MAIL|nts according to the quickly bold pack +6087|1198|7|4|10|10991.90|0.05|0.00|N|O|1998-01-21|1998-03-26|1998-01-29|TAKE BACK RETURN|AIR|ptotes. special excuses haggle furiously +6087|702|3|5|22|35259.40|0.09|0.07|N|O|1998-02-01|1998-02-23|1998-02-27|NONE|RAIL|. slyly bo +6087|1749|76|6|9|14856.66|0.09|0.06|N|O|1998-03-19|1998-02-13|1998-03-23|COLLECT COD|MAIL|otes cajole carefully fin +6087|1892|36|7|48|86106.72|0.05|0.01|N|O|1998-04-05|1998-03-21|1998-04-25|COLLECT COD|REG AIR| pending dependencies sle +6112|267|68|1|12|14007.12|0.03|0.02|R|F|1994-09-29|1994-11-18|1994-10-19|DELIVER IN PERSON|TRUCK|usual asymptotes sleep blithely slyly even +6112|342|71|2|1|1242.34|0.05|0.07|A|F|1994-09-13|1994-11-01|1994-09-26|TAKE BACK RETURN|AIR|he furiously +6112|126|5|3|7|7182.84|0.08|0.08|A|F|1994-10-06|1994-10-20|1994-10-07|DELIVER IN PERSON|MAIL|iously ironic deposits impress ca +6112|154|33|4|24|25299.60|0.06|0.04|R|F|1994-12-17|1994-11-12|1994-12-18|COLLECT COD|REG AIR|ending, pending +6112|1962|51|5|32|59646.72|0.00|0.00|R|F|1994-10-30|1994-10-31|1994-11-12|COLLECT COD|AIR|ies cajole furiously ab +6112|651|45|6|28|43446.20|0.06|0.08|R|F|1994-10-04|1994-10-14|1994-10-09|NONE|RAIL|nal, ironic deposits wake quickl +6112|1468|69|7|5|6847.30|0.03|0.06|R|F|1994-09-11|1994-11-12|1994-09-25|DELIVER IN PERSON|FOB|p idly abou +6113|1722|7|1|48|77938.56|0.09|0.03|N|O|1998-11-11|1998-09-23|1998-11-22|NONE|AIR|egular asymptotes han +6113|986|87|2|16|30191.68|0.03|0.02|N|O|1998-10-02|1998-10-11|1998-10-11|COLLECT COD|FOB|s; packages are carefully ironic +6113|1589|10|3|11|16396.38|0.01|0.08|N|O|1998-10-09|1998-09-16|1998-11-06|TAKE BACK RETURN|RAIL|dolphins. final, +6113|640|34|4|31|47759.84|0.03|0.08|N|O|1998-10-19|1998-08-22|1998-11-14|TAKE BACK RETURN|MAIL|counts. furiously regular dolph +6113|411|70|5|13|17048.33|0.00|0.07|N|O|1998-10-09|1998-09-22|1998-10-15|COLLECT COD|REG AIR|elets nag idly +6113|280|35|6|33|38949.24|0.09|0.02|N|O|1998-11-13|1998-09-05|1998-12-07|COLLECT COD|FOB|ending pinto beans are carefu +6113|656|50|7|11|17123.15|0.09|0.04|N|O|1998-09-11|1998-09-20|1998-09-29|DELIVER IN PERSON|SHIP|nding dependencies. slyly even th +6114|1791|92|1|7|11849.53|0.09|0.02|N|O|1998-05-17|1998-07-03|1998-05-24|TAKE BACK RETURN|REG AIR|thely unusual +6114|549|80|2|14|20293.56|0.07|0.07|N|O|1998-04-17|1998-05-25|1998-05-07|TAKE BACK RETURN|SHIP|along the pending packages affix blithe +6114|931|100|3|27|49462.11|0.03|0.04|N|O|1998-04-23|1998-07-05|1998-05-21|DELIVER IN PERSON|SHIP|ing foxes. special instructions use c +6114|833|34|4|7|12136.81|0.03|0.01|N|O|1998-04-13|1998-07-01|1998-05-08|TAKE BACK RETURN|TRUCK|its hang slyly. blithely regul +6114|1821|8|5|19|32733.58|0.05|0.08|N|O|1998-05-31|1998-07-07|1998-06-03|DELIVER IN PERSON|TRUCK|g deposits. sp +6114|265|93|6|9|10487.34|0.09|0.03|N|O|1998-05-12|1998-05-20|1998-05-25|COLLECT COD|MAIL|re unusual dependencies. fluffily ironic de +6115|366|67|1|32|40523.52|0.06|0.01|R|F|1993-10-30|1993-11-18|1993-11-05|DELIVER IN PERSON|FOB|ake. carefully final foxes alongside of +6115|1320|35|2|43|52516.76|0.02|0.01|R|F|1994-01-09|1993-11-26|1994-02-06|NONE|SHIP|xes. quickly final accou +6115|1498|77|3|24|33587.76|0.06|0.06|A|F|1993-12-25|1993-10-23|1993-12-26|DELIVER IN PERSON|SHIP|en decoys wake carefully +6115|452|11|4|12|16229.40|0.00|0.00|R|F|1993-12-08|1993-11-02|1993-12-15|COLLECT COD|AIR|ep. fluffily pending pint +6115|750|83|5|44|72633.00|0.00|0.04|R|F|1993-11-22|1993-11-23|1993-12-09|TAKE BACK RETURN|MAIL|into beans sleep quickly quickly iro +6115|610|73|6|20|30212.20|0.02|0.07|R|F|1993-11-27|1993-10-29|1993-12-07|NONE|FOB|ent deposits ar +6116|428|29|1|6|7970.52|0.07|0.07|R|F|1994-06-12|1994-06-08|1994-06-29|NONE|SHIP|he furiously final ideas. furiou +6116|1820|21|2|2|3443.64|0.10|0.08|R|F|1994-04-07|1994-06-16|1994-05-05|TAKE BACK RETURN|REG AIR|ven, ironic pinto beans. ironic foxes +6116|1321|60|3|42|51337.44|0.01|0.00|R|F|1994-07-13|1994-06-07|1994-07-25|DELIVER IN PERSON|SHIP|nusual pac +6116|1995|96|4|33|62600.67|0.06|0.00|R|F|1994-03-25|1994-06-04|1994-04-03|TAKE BACK RETURN|RAIL|quests sleep. slyly pending +6116|1143|80|5|43|44898.02|0.08|0.03|A|F|1994-04-27|1994-05-09|1994-05-04|COLLECT COD|RAIL|. final, quick deposits ca +6116|379|64|6|14|17911.18|0.02|0.01|A|F|1994-05-18|1994-06-16|1994-05-24|TAKE BACK RETURN|REG AIR|uriously busy deposits sleep in +6116|143|22|7|30|31294.20|0.09|0.08|R|F|1994-06-30|1994-05-01|1994-07-07|COLLECT COD|TRUCK|pinto beans are evenly; fur +6117|781|46|1|34|57180.52|0.03|0.05|R|F|1993-01-28|1993-03-06|1993-02-02|NONE|TRUCK| after the slyly quick requests. depen +6117|158|59|2|42|44442.30|0.06|0.00|R|F|1993-02-07|1993-02-25|1993-02-25|NONE|TRUCK| theodolites. blithely brave packages wake +6117|464|65|3|22|30018.12|0.05|0.02|A|F|1992-12-27|1993-03-10|1993-01-20|NONE|TRUCK|bravely eve +6117|1145|18|4|25|26153.50|0.04|0.02|R|F|1993-03-15|1993-02-09|1993-03-16|TAKE BACK RETURN|FOB|ld instructio +6117|680|81|5|16|25290.88|0.04|0.06|R|F|1993-04-17|1993-03-19|1993-05-10|NONE|REG AIR|c escapades. fur +6117|183|62|6|3|3249.54|0.08|0.03|R|F|1993-03-07|1993-01-28|1993-04-04|COLLECT COD|RAIL|c requests. account +6118|223|51|1|23|25834.06|0.07|0.07|N|O|1997-06-01|1997-06-19|1997-06-13|DELIVER IN PERSON|AIR|ies. packages among t +6118|1824|68|2|43|74210.26|0.03|0.01|N|O|1997-05-30|1997-05-14|1997-06-26|NONE|REG AIR|f the fluffily +6118|1408|48|3|4|5237.60|0.10|0.04|N|O|1997-05-13|1997-05-19|1997-06-04|TAKE BACK RETURN|TRUCK|ss instructions are always ac +6118|406|65|4|44|57481.60|0.04|0.06|N|O|1997-05-18|1997-06-01|1997-05-27|COLLECT COD|AIR|nts according to the ironic requests +6118|1391|6|5|7|9046.73|0.01|0.00|N|O|1997-04-02|1997-06-01|1997-04-04|TAKE BACK RETURN|MAIL|ng the theodol +6119|772|69|1|22|36800.94|0.04|0.03|R|F|1992-08-06|1992-09-05|1992-08-08|NONE|AIR| unusual packages. regular accounts c +6119|1823|53|2|26|44845.32|0.10|0.06|A|F|1992-08-30|1992-09-24|1992-09-10|COLLECT COD|MAIL|ithely. slyly ironic foxes +6144|105|6|1|46|46234.60|0.08|0.02|A|F|1994-08-26|1994-09-06|1994-09-17|NONE|FOB| theodolites across the final +6144|1781|82|2|20|33655.60|0.05|0.04|A|F|1994-09-06|1994-09-18|1994-09-27|NONE|REG AIR| cajole fluffily quickly unusua +6144|722|23|3|7|11359.04|0.00|0.07|A|F|1994-10-07|1994-07-26|1994-10-15|COLLECT COD|AIR|fully final pi +6144|399|100|4|22|28586.58|0.07|0.00|R|F|1994-07-08|1994-09-14|1994-07-17|NONE|MAIL|unts boost according to the quickly sile +6145|1977|78|1|14|26305.58|0.04|0.00|N|O|1998-06-27|1998-06-10|1998-07-27|NONE|AIR|y express, regular packages. sl +6145|1717|2|2|1|1618.71|0.05|0.04|N|O|1998-07-10|1998-07-09|1998-08-05|COLLECT COD|RAIL|l dolphins. ironic, express +6146|1543|44|1|35|50558.90|0.01|0.00|N|O|1996-03-17|1996-01-28|1996-04-12|DELIVER IN PERSON|MAIL|as use according to the slyly final +6146|949|84|2|9|16649.46|0.00|0.08|N|O|1996-03-07|1996-02-14|1996-03-12|DELIVER IN PERSON|SHIP|fily alongside of the even pac +6146|1666|67|3|16|25082.56|0.09|0.06|N|O|1996-02-29|1996-01-29|1996-03-01|COLLECT COD|MAIL|al foxes across the deposits sleep slyly +6147|1905|94|1|35|63241.50|0.06|0.05|N|O|1995-10-13|1995-11-28|1995-10-21|COLLECT COD|SHIP|lithe package +6147|1793|20|2|24|40674.96|0.09|0.00|N|O|1995-11-01|1995-11-26|1995-11-24|DELIVER IN PERSON|RAIL|into beans sleep. slyly special asymptot +6147|1749|92|3|49|80886.26|0.04|0.07|N|O|1995-11-11|1995-12-14|1995-12-11|TAKE BACK RETURN|RAIL|ide of the special, final packages. +6148|689|90|1|24|38152.32|0.10|0.04|N|O|1996-02-05|1996-03-19|1996-02-12|NONE|SHIP|ymptotes wake slyly. quickly +6148|1376|77|2|49|62591.13|0.10|0.00|N|O|1996-01-13|1996-03-17|1996-01-29|DELIVER IN PERSON|TRUCK| furiously. th +6149|1875|5|1|1|1776.87|0.01|0.06|N|O|1997-02-22|1997-02-13|1997-03-10|NONE|SHIP|ual ideas. deposits wake regular, even +6150|276|58|1|14|16467.78|0.03|0.08|R|F|1993-01-01|1992-11-27|1993-01-15|TAKE BACK RETURN|MAIL|ve request +6150|1659|83|2|44|68668.60|0.03|0.05|A|F|1993-01-23|1992-12-12|1993-02-10|COLLECT COD|REG AIR| of the slyly final accounts +6150|1300|38|3|18|21623.40|0.01|0.05|A|F|1992-10-04|1992-12-06|1992-10-27|DELIVER IN PERSON|RAIL|requests cajole slyly after the ironic in +6150|48|74|4|50|47402.00|0.09|0.02|R|F|1992-10-19|1992-11-08|1992-10-31|NONE|MAIL|unts. silent, ev +6150|135|62|5|7|7245.91|0.09|0.02|R|F|1992-11-09|1992-12-31|1992-11-27|TAKE BACK RETURN|AIR|ve the quickly +6150|837|37|6|14|24329.62|0.02|0.04|A|F|1992-11-26|1992-12-12|1992-11-29|COLLECT COD|RAIL|ironic instructions are b +6150|502|33|7|46|64515.00|0.01|0.03|A|F|1992-10-07|1992-11-24|1992-11-04|DELIVER IN PERSON|FOB| notornis haggle bold pac +6151|274|75|1|50|58713.50|0.09|0.03|A|F|1993-07-22|1993-09-27|1993-07-23|DELIVER IN PERSON|FOB|regular excuses alon +6151|1146|47|2|6|6282.84|0.10|0.00|A|F|1993-10-22|1993-08-30|1993-11-11|DELIVER IN PERSON|AIR|ptotes cajole foxes; furiously un +6176|1000|69|1|40|36040.00|0.01|0.04|N|O|1996-12-06|1997-01-13|1996-12-12|COLLECT COD|REG AIR|hely. quickly regular +6176|934|3|2|9|16514.37|0.07|0.07|N|O|1996-12-02|1996-12-12|1996-12-09|COLLECT COD|RAIL| even requests. pending e +6176|471|59|3|19|26057.93|0.03|0.01|N|O|1997-03-09|1996-12-13|1997-03-13|NONE|AIR|onic dependencies nag again +6177|739|4|1|49|80346.77|0.07|0.03|N|O|1997-09-28|1997-08-01|1997-10-06|COLLECT COD|RAIL|press deposits. blithely +6177|1183|56|2|8|8673.44|0.08|0.07|N|O|1997-07-10|1997-09-07|1997-07-26|DELIVER IN PERSON|AIR| slyly unusua +6177|222|77|3|49|54988.78|0.06|0.01|N|O|1997-08-22|1997-09-15|1997-09-10|DELIVER IN PERSON|AIR| carefully final reques +6178|1344|45|1|47|58530.98|0.00|0.00|N|O|1995-09-25|1995-09-29|1995-10-24|NONE|TRUCK|ly regular accounts wake blithely qu +6179|1296|71|1|49|58667.21|0.10|0.07|A|F|1994-08-13|1994-08-05|1994-08-28|DELIVER IN PERSON|RAIL| pinto beans. frays among the requests a +6179|559|20|2|42|61301.10|0.04|0.07|R|F|1994-07-02|1994-07-27|1994-07-27|DELIVER IN PERSON|REG AIR|hely ironic accounts are furiously regul +6179|1646|88|3|31|47976.84|0.08|0.05|R|F|1994-08-21|1994-08-09|1994-09-04|TAKE BACK RETURN|FOB|es are slyly ironic package +6179|1|2|4|5|4505.00|0.05|0.00|A|F|1994-06-05|1994-07-27|1994-06-26|COLLECT COD|MAIL|silent deposits. furiously +6179|1249|24|5|16|18403.84|0.04|0.06|A|F|1994-06-12|1994-08-21|1994-06-28|COLLECT COD|FOB|ep. furiously regular accoun +6179|1599|40|6|28|42016.52|0.04|0.01|A|F|1994-07-23|1994-08-09|1994-08-09|COLLECT COD|MAIL|efully. ideas was. quickl +6180|588|49|1|39|58054.62|0.08|0.07|A|F|1995-05-16|1995-07-01|1995-05-28|DELIVER IN PERSON|RAIL|pending deposits wake +6180|746|79|2|39|64222.86|0.03|0.03|R|F|1995-05-18|1995-05-26|1995-06-11|NONE|TRUCK|lyly about the quickly regular accounts +6181|480|81|1|30|41414.40|0.00|0.07|N|O|1996-06-06|1996-08-05|1996-06-09|TAKE BACK RETURN|FOB|theodolites across the pending i +6182|1533|14|1|10|14345.30|0.07|0.02|R|F|1992-10-08|1992-10-07|1992-10-09|COLLECT COD|AIR|usual foxes could haggl +6182|604|5|2|22|33101.20|0.03|0.01|R|F|1992-11-08|1992-10-09|1992-11-21|DELIVER IN PERSON|FOB|escapades. carefully b +6182|347|32|3|35|43656.90|0.08|0.02|A|F|1992-10-26|1992-09-28|1992-11-13|TAKE BACK RETURN|MAIL|nal accounts. pending, enti +6182|1263|75|4|36|41913.36|0.04|0.02|R|F|1992-10-27|1992-10-19|1992-11-23|COLLECT COD|TRUCK|cajole according to the furiously fi +6182|727|92|5|47|76502.84|0.01|0.02|R|F|1992-09-17|1992-08-23|1992-10-08|COLLECT COD|RAIL| beans sleep along the ironic, +6182|1383|98|6|47|60365.86|0.00|0.07|A|F|1992-11-08|1992-10-06|1992-11-11|COLLECT COD|AIR|n pinto be +6182|50|51|7|3|2850.15|0.07|0.04|A|F|1992-11-11|1992-10-14|1992-12-07|NONE|REG AIR| requests. fina +6183|1569|10|1|26|38234.56|0.10|0.01|A|F|1992-08-30|1992-07-24|1992-09-03|DELIVER IN PERSON|TRUCK|ngly regular packages boost deposits. pac +6183|1190|63|2|13|14185.47|0.09|0.08|A|F|1992-06-28|1992-07-17|1992-07-01|TAKE BACK RETURN|MAIL|eposits haggle quickly. fluffily thin +6183|811|45|3|50|85590.50|0.04|0.01|R|F|1992-06-21|1992-09-07|1992-07-03|COLLECT COD|FOB|furiously along the stealthily +6183|1070|71|4|14|13594.98|0.06|0.06|A|F|1992-10-10|1992-09-14|1992-10-30|COLLECT COD|REG AIR|r. pinto beans haggle carefully express pl +6183|166|67|5|46|49043.36|0.07|0.01|A|F|1992-08-17|1992-07-21|1992-08-31|TAKE BACK RETURN|TRUCK|its doubt quickly. blit +6183|1619|43|6|19|28891.59|0.02|0.00|A|F|1992-08-12|1992-08-01|1992-08-31|COLLECT COD|SHIP|ites. attainments nag. instructions accord +6208|1931|32|1|29|53154.97|0.09|0.03|N|O|1996-12-25|1996-11-13|1997-01-01|NONE|RAIL|kly ironic +6208|763|28|2|28|46585.28|0.02|0.05|N|O|1997-01-12|1996-12-14|1997-02-04|TAKE BACK RETURN|REG AIR|y regular theodolites haggle slyly acco +6209|1601|25|1|13|19533.80|0.00|0.06|N|O|1996-08-30|1996-10-22|1996-09-08|TAKE BACK RETURN|TRUCK|s boost carefully above the slyly express +6209|813|13|2|32|54841.92|0.06|0.04|N|O|1996-11-13|1996-09-07|1996-11-19|TAKE BACK RETURN|AIR|usual ideas sleep slyly blithely final +6209|336|65|3|41|50689.53|0.00|0.04|N|O|1996-10-08|1996-09-20|1996-10-14|DELIVER IN PERSON|REG AIR|carefully about the regular p +6209|589|80|4|8|11916.64|0.04|0.08|N|O|1996-09-03|1996-10-17|1996-10-03|TAKE BACK RETURN|MAIL|nts. furiously regu +6210|56|7|1|37|35373.85|0.03|0.08|N|O|1997-01-02|1997-01-23|1997-01-28|DELIVER IN PERSON|SHIP|lly alongside of the slyly final req +6210|835|36|2|35|60754.05|0.09|0.03|N|O|1997-02-20|1997-01-12|1997-03-04|NONE|REG AIR|rouches. ironic, regular a +6210|1699|100|3|12|19208.28|0.05|0.07|N|O|1997-01-17|1997-01-23|1997-01-30|COLLECT COD|RAIL|refully along the ironic, final warhorse +6210|453|83|4|1|1353.45|0.07|0.03|N|O|1996-11-26|1997-01-28|1996-12-04|DELIVER IN PERSON|AIR|quests slee +6210|1248|60|5|19|21835.56|0.00|0.08|N|O|1997-02-27|1996-12-15|1997-03-27|NONE|AIR|tes use blithel +6210|1516|17|6|23|32602.73|0.06|0.05|N|O|1996-11-12|1996-12-27|1996-11-13|TAKE BACK RETURN|AIR|kly ironic deposits use care +6210|1412|13|7|41|53849.81|0.09|0.03|N|O|1997-01-21|1997-01-18|1997-02-14|DELIVER IN PERSON|MAIL|telets cajole quickly! bravely ironic ins +6211|643|6|1|1|1543.64|0.05|0.02|A|F|1995-03-02|1995-02-20|1995-03-07|COLLECT COD|REG AIR|ly regular deposits wake +6211|380|9|2|39|49934.82|0.05|0.07|A|F|1995-03-20|1995-01-17|1995-04-12|NONE|TRUCK|ly above the slyly slow pa +6211|1612|13|3|34|51462.74|0.00|0.05|A|F|1994-12-05|1995-02-11|1994-12-18|NONE|REG AIR|according to the unusual, even accounts. un +6211|1472|73|4|33|45324.51|0.09|0.01|R|F|1995-02-23|1995-01-22|1995-03-13|DELIVER IN PERSON|TRUCK|olites sleep quickly. requests acc +6212|374|3|1|31|39505.47|0.07|0.03|N|O|1996-07-02|1996-06-11|1996-07-12|DELIVER IN PERSON|TRUCK|ole blithely +6213|1118|19|1|11|11210.21|0.04|0.06|N|O|1995-09-24|1995-08-26|1995-10-16|COLLECT COD|REG AIR| to the furiously fi +6213|1407|8|2|36|47102.40|0.04|0.06|N|O|1995-07-27|1995-10-04|1995-08-23|TAKE BACK RETURN|FOB|ly express ideas i +6214|1448|88|1|3|4048.32|0.09|0.07|N|O|1996-10-02|1996-09-22|1996-10-17|COLLECT COD|MAIL| among the blithely regu +6215|617|11|1|49|74362.89|0.10|0.01|N|O|1996-12-16|1997-01-12|1997-01-12|NONE|MAIL|usly ironic foxes wak +6215|1419|37|2|50|66020.50|0.08|0.04|N|O|1996-12-06|1997-01-20|1997-01-02|TAKE BACK RETURN|MAIL|fully even theo +6215|715|16|3|46|74322.66|0.02|0.06|N|O|1997-03-07|1997-02-13|1997-03-23|COLLECT COD|RAIL|ideas about the depos +6215|1173|46|4|41|44040.97|0.00|0.02|N|O|1997-01-03|1997-01-12|1997-01-27|NONE|AIR| ironic deposits among the carefully expre +6215|1121|58|5|13|13287.56|0.08|0.07|N|O|1996-12-25|1997-01-04|1996-12-27|DELIVER IN PERSON|TRUCK|thely stealthy inst +6215|732|97|6|46|75105.58|0.10|0.02|N|O|1996-12-18|1996-12-30|1996-12-30|TAKE BACK RETURN|REG AIR|riously ironic pinto beans impress ca +6240|1972|61|1|15|28109.55|0.01|0.04|N|O|1998-07-03|1998-07-24|1998-07-25|DELIVER IN PERSON|FOB|gle around the dogged excuses +6240|965|100|2|36|67174.56|0.01|0.08|N|O|1998-09-06|1998-08-20|1998-09-17|NONE|AIR|nal ideas: ideas cajole. excuses along +6240|104|83|3|34|34139.40|0.08|0.00|N|O|1998-06-20|1998-08-08|1998-06-29|DELIVER IN PERSON|MAIL|nding deposits boost furiousl +6240|1661|85|4|26|40629.16|0.08|0.03|N|O|1998-08-29|1998-08-28|1998-09-11|COLLECT COD|RAIL| haggle quickly quickly silent fre +6240|805|39|5|15|25587.00|0.07|0.02|N|O|1998-06-06|1998-09-01|1998-06-09|NONE|FOB| packages among the slyly bold accounts u +6241|431|90|1|23|30622.89|0.10|0.00|R|F|1995-03-31|1995-03-07|1995-04-16|COLLECT COD|AIR|ly above the deposits. packages against +6241|638|70|2|18|27695.34|0.04|0.00|A|F|1995-03-15|1995-03-03|1995-04-07|NONE|MAIL|packages detect carefu +6241|1553|54|3|8|11636.40|0.07|0.08|R|F|1995-03-27|1995-03-28|1995-04-23|DELIVER IN PERSON|REG AIR|en frays detect furi +6241|750|15|4|13|21459.75|0.05|0.04|A|F|1995-01-13|1995-03-27|1995-01-15|TAKE BACK RETURN|RAIL|ms use fluffi +6242|1436|76|1|46|61521.78|0.09|0.06|N|O|1998-02-22|1998-02-15|1998-03-14|TAKE BACK RETURN|SHIP|slyly regular packages cajole slyly alon +6242|430|89|2|29|38582.47|0.04|0.06|N|O|1998-02-20|1998-01-30|1998-03-14|TAKE BACK RETURN|RAIL|y silent deposits poach thinly according t +6242|187|88|3|9|9784.62|0.08|0.03|N|O|1998-03-26|1998-02-19|1998-03-28|COLLECT COD|FOB|uriously express requests. stea +6242|1470|88|4|33|45258.51|0.07|0.07|N|O|1998-03-03|1998-03-01|1998-03-19|TAKE BACK RETURN|RAIL|affix above the furious +6242|1056|27|5|9|8613.45|0.06|0.04|N|O|1998-01-21|1998-02-11|1998-02-20|TAKE BACK RETURN|SHIP|usly quiet pinto beans are silent, sp +6242|223|51|6|33|37066.26|0.01|0.04|N|O|1998-03-15|1998-01-03|1998-04-05|NONE|SHIP|asymptotes nod furiously abo +6243|1198|99|1|15|16487.85|0.00|0.04|A|F|1994-12-08|1994-11-10|1994-12-29|TAKE BACK RETURN|AIR|egular accounts. blithely stealthy re +6243|95|46|2|47|46769.23|0.09|0.07|R|F|1994-12-13|1994-12-16|1995-01-07|DELIVER IN PERSON|FOB|final, ironic packag +6243|163|90|3|15|15947.40|0.08|0.05|A|F|1994-11-07|1994-12-20|1994-11-21|COLLECT COD|RAIL|c asymptotes cajole furio +6243|1776|19|4|2|3355.54|0.08|0.05|R|F|1995-01-26|1994-11-30|1995-02-03|COLLECT COD|MAIL|out the final, expres +6244|328|29|1|29|35621.28|0.04|0.06|R|F|1993-12-12|1993-10-14|1994-01-07|DELIVER IN PERSON|RAIL|en theodolites wake carefully. slyl +6244|1819|49|2|14|24091.34|0.08|0.08|A|F|1993-12-14|1993-10-30|1994-01-06|COLLECT COD|AIR| furiously regula +6245|1141|42|1|47|48980.58|0.09|0.01|N|O|1997-12-20|1998-01-25|1998-01-09|NONE|SHIP|deposits unwind slyly. ironic instructi +6245|1963|8|2|29|54083.84|0.00|0.00|N|O|1998-02-04|1998-01-10|1998-02-16|TAKE BACK RETURN|AIR|e bold requests sleep +6246|1297|35|1|18|21569.22|0.00|0.06|R|F|1994-10-29|1995-01-02|1994-11-15|DELIVER IN PERSON|RAIL|ourts are. pending accounts cajole furio +6246|1598|99|2|29|43488.11|0.02|0.00|R|F|1994-11-23|1994-12-09|1994-12-12|DELIVER IN PERSON|TRUCK|lar deposits haggle about the slyly pendi +6246|865|32|3|49|86527.14|0.00|0.05|A|F|1995-02-18|1994-12-20|1995-03-05|TAKE BACK RETURN|AIR|egular inst +6246|384|85|4|39|50090.82|0.02|0.04|R|F|1994-12-14|1994-12-24|1994-12-24|COLLECT COD|REG AIR| theodolites affix furiously according to t +6246|177|30|5|12|12926.04|0.02|0.04|A|F|1995-02-06|1994-12-09|1995-02-08|TAKE BACK RETURN|TRUCK|rding to the slyly ir +6246|456|86|6|17|23059.65|0.01|0.08|A|F|1995-01-06|1994-12-31|1995-02-02|DELIVER IN PERSON|AIR|ully regular depo +6247|1503|84|1|28|39326.00|0.10|0.06|N|O|1997-01-19|1996-12-22|1997-01-21|NONE|RAIL|s haggle. caref +6247|1245|83|2|12|13754.88|0.06|0.08|N|O|1996-12-07|1997-02-17|1996-12-15|COLLECT COD|MAIL|nding excuses. furiously regular f +6272|10|11|1|25|22750.25|0.04|0.00|A|F|1993-04-27|1993-04-18|1993-05-03|COLLECT COD|RAIL|ly silent packages are blithely among +6272|1913|14|2|18|32668.38|0.01|0.00|A|F|1993-04-06|1993-05-23|1993-04-16|NONE|MAIL|iously. braids sleep s +6272|1873|60|3|32|56795.84|0.04|0.03|R|F|1993-04-21|1993-05-14|1993-05-12|TAKE BACK RETURN|RAIL|the carefully unusual +6272|1671|72|4|36|56616.12|0.10|0.06|A|F|1993-03-27|1993-05-24|1993-04-12|DELIVER IN PERSON|REG AIR| the quickly ironic requests wake fluf +6272|573|4|5|13|19156.41|0.09|0.08|R|F|1993-06-18|1993-04-27|1993-07-03|COLLECT COD|REG AIR|e furiously. blithely regular reques +6272|176|29|6|24|25828.08|0.05|0.02|R|F|1993-03-09|1993-04-06|1993-03-11|NONE|FOB| requests wake bl +6272|1367|68|7|16|20293.76|0.03|0.05|A|F|1993-04-30|1993-04-13|1993-05-17|COLLECT COD|RAIL|s pinto beans. realms +6273|1|27|1|33|29733.00|0.04|0.08|R|F|1995-04-23|1995-05-02|1995-05-13|DELIVER IN PERSON|TRUCK|ges. unusual, pending packages accordi +6274|731|32|1|13|21212.49|0.04|0.02|N|O|1995-10-23|1995-09-26|1995-11-17|NONE|RAIL|structions was-- carefully special +6274|1528|69|2|13|18583.76|0.05|0.06|N|O|1995-10-02|1995-10-07|1995-10-29|NONE|REG AIR|slyly after the blithely idle pi +6274|1207|8|3|37|41003.40|0.01|0.01|N|O|1995-07-28|1995-08-21|1995-08-04|COLLECT COD|REG AIR|inal requests. iron +6274|1610|52|4|39|58952.79|0.07|0.03|N|O|1995-08-07|1995-09-09|1995-08-28|DELIVER IN PERSON|MAIL|slyly regular instructions a +6274|1795|22|5|23|39026.17|0.06|0.07|N|O|1995-10-17|1995-09-15|1995-11-12|COLLECT COD|MAIL|ts. regular courts are abo +6274|1091|62|6|22|21825.98|0.03|0.01|N|O|1995-09-23|1995-09-13|1995-10-01|DELIVER IN PERSON|AIR|eodolites are carefully fluffily pendi +6274|1621|63|7|13|19794.06|0.01|0.08|N|O|1995-08-05|1995-08-15|1995-08-24|DELIVER IN PERSON|FOB| furiously even instru +6275|595|96|1|47|70292.73|0.07|0.02|N|O|1997-04-21|1997-03-07|1997-05-07|TAKE BACK RETURN|TRUCK|ites against the quickly special +6275|473|32|2|39|53565.33|0.03|0.02|N|O|1997-02-11|1997-02-26|1997-03-08|COLLECT COD|FOB|elets sleep blithely final pa +6275|1930|63|3|27|49462.11|0.00|0.05|N|O|1997-03-19|1997-02-01|1997-04-17|TAKE BACK RETURN|FOB|requests sleep above the furiousl +6275|1215|53|4|38|42415.98|0.05|0.08|N|O|1997-01-18|1997-03-12|1997-02-05|TAKE BACK RETURN|REG AIR| wake slyly slowly +6276|411|12|1|5|6557.05|0.08|0.07|N|O|1995-08-07|1995-07-17|1995-09-03|COLLECT COD|REG AIR|cies are thinly along the regular +6276|1459|99|2|30|40813.50|0.02|0.03|N|F|1995-06-10|1995-08-04|1995-06-26|COLLECT COD|SHIP|around the slyly fina +6276|944|79|3|26|47968.44|0.01|0.07|N|O|1995-08-29|1995-06-07|1995-08-31|TAKE BACK RETURN|REG AIR|lets. bold, fina +6276|629|92|4|48|73421.76|0.10|0.03|A|F|1995-05-17|1995-07-17|1995-06-04|DELIVER IN PERSON|FOB|heodolites +6276|962|97|5|11|20492.56|0.00|0.07|N|O|1995-09-01|1995-07-04|1995-09-19|DELIVER IN PERSON|TRUCK|ly sly deposits doze slyly across the +6277|447|48|1|31|41770.64|0.08|0.02|N|O|1997-03-18|1997-03-23|1997-04-01|DELIVER IN PERSON|REG AIR| detect furiousl +6277|965|68|2|48|89566.08|0.04|0.03|N|O|1997-03-06|1997-04-10|1997-04-01|NONE|REG AIR|- pending, +6278|35|11|1|3|2805.09|0.09|0.06|R|F|1992-03-03|1992-03-27|1992-03-10|COLLECT COD|REG AIR|, express ideas. final dep +6278|151|78|2|1|1051.15|0.03|0.07|A|F|1992-02-01|1992-03-01|1992-02-25|TAKE BACK RETURN|TRUCK| doggedly silent deposits; +6278|1293|31|3|8|9554.32|0.04|0.07|A|F|1992-03-19|1992-03-04|1992-03-31|COLLECT COD|TRUCK|ding, bold packages. ironic re +6278|1635|18|4|38|58391.94|0.02|0.06|A|F|1992-02-22|1992-03-14|1992-03-12|NONE|RAIL|ests are quickly. Tiresias wake. req +6278|640|3|5|8|12325.12|0.09|0.03|R|F|1992-02-10|1992-02-23|1992-03-01|NONE|SHIP|ct furiously among the furiously fina +6278|1936|37|6|35|64327.55|0.04|0.05|R|F|1992-02-13|1992-02-07|1992-02-29|COLLECT COD|MAIL|ggle. stealthily regular accounts against t +6278|1296|71|7|8|9578.32|0.05|0.07|R|F|1992-02-12|1992-03-23|1992-02-19|COLLECT COD|FOB| the special frays. pinto beans are +6279|642|36|1|49|75589.36|0.03|0.02|R|F|1993-02-09|1993-03-17|1993-02-23|TAKE BACK RETURN|AIR|d packages. unusual, regular hockey +6304|1535|16|1|32|45968.96|0.06|0.05|N|O|1995-09-30|1995-09-11|1995-10-04|NONE|REG AIR|quickly upon the regular packages. pac +6304|1355|94|2|24|30152.40|0.07|0.06|N|O|1995-09-08|1995-10-21|1995-10-01|COLLECT COD|MAIL|e carefully s +6304|1385|62|3|27|34732.26|0.01|0.05|N|O|1995-11-19|1995-10-22|1995-12-06|NONE|RAIL|kages sleep furiously. unusual, +6304|72|23|4|14|13608.98|0.06|0.01|N|O|1995-10-29|1995-09-21|1995-11-25|TAKE BACK RETURN|RAIL| among the blithely c +6305|501|62|1|48|67272.00|0.10|0.08|N|O|1997-03-10|1997-03-19|1997-04-04|TAKE BACK RETURN|FOB|ly. bold foxes around the qu +6305|859|60|2|19|33437.15|0.10|0.04|N|O|1997-03-29|1997-02-19|1997-04-15|DELIVER IN PERSON|REG AIR|ironic ideas cajole +6305|1631|14|3|28|42913.64|0.02|0.08|N|O|1997-03-07|1997-04-09|1997-03-08|TAKE BACK RETURN|FOB|ironic deposits nod furiously bold theodo +6305|52|78|4|40|38082.00|0.08|0.00|N|O|1997-03-18|1997-03-11|1997-03-29|COLLECT COD|MAIL|y pending sentiments above the bold +6305|231|59|5|5|5656.15|0.03|0.06|N|O|1997-02-12|1997-02-22|1997-03-12|NONE|FOB|ilently final d +6305|184|63|6|35|37946.30|0.08|0.01|N|O|1997-02-19|1997-02-27|1997-03-10|TAKE BACK RETURN|SHIP|egrate. express theodolites use +6306|1722|49|1|16|25979.52|0.08|0.01|N|O|1998-07-25|1998-06-16|1998-07-28|COLLECT COD|AIR|t the carefully unusual multipliers. q +6307|1289|1|1|38|45230.64|0.00|0.06|N|O|1997-11-22|1997-12-30|1997-12-02|DELIVER IN PERSON|REG AIR|y final accounts. blith +6308|1954|99|1|23|42686.85|0.10|0.06|N|O|1997-10-13|1997-08-30|1997-11-10|NONE|TRUCK|ounts. quickly unusual +6309|122|1|1|18|18398.16|0.04|0.07|R|F|1993-06-27|1993-07-18|1993-07-27|NONE|MAIL|requests against the unus +6309|353|10|2|39|48880.65|0.08|0.04|R|F|1993-10-03|1993-07-17|1993-10-13|COLLECT COD|MAIL|ironic theodolites haggle a +6309|1757|84|3|15|24881.25|0.00|0.03|R|F|1993-07-09|1993-08-15|1993-07-27|NONE|SHIP|efully ironic packages wa +6309|1217|55|4|18|20127.78|0.10|0.05|A|F|1993-07-30|1993-08-16|1993-08-15|NONE|SHIP|arefully a +6309|1156|93|5|24|25371.60|0.00|0.06|R|F|1993-08-06|1993-07-16|1993-08-15|COLLECT COD|MAIL|nic asymptotes. b +6309|171|50|6|26|27850.42|0.02|0.04|A|F|1993-07-11|1993-08-08|1993-08-01|NONE|TRUCK|eodolites sleep quick +6309|123|76|7|48|49109.76|0.01|0.08|R|F|1993-08-23|1993-08-03|1993-09-20|COLLECT COD|AIR|en, pending requests; final instru +6310|961|64|1|6|11171.76|0.00|0.00|A|F|1994-07-02|1994-07-13|1994-07-08|DELIVER IN PERSON|SHIP|ith the furiously final sauternes pro +6310|1378|93|2|47|60130.39|0.10|0.08|A|F|1994-05-10|1994-06-25|1994-05-29|COLLECT COD|REG AIR|of the carefully silent foxes. blithely i +6310|1994|95|3|20|37919.80|0.10|0.08|R|F|1994-08-25|1994-07-20|1994-08-27|TAKE BACK RETURN|SHIP|ously regular ideas across the +6310|1842|86|4|18|31389.12|0.08|0.05|A|F|1994-05-24|1994-06-24|1994-06-16|DELIVER IN PERSON|SHIP|press foxes. bl +6310|1943|44|5|9|16604.46|0.04|0.06|R|F|1994-08-16|1994-07-08|1994-09-14|NONE|REG AIR| are fluffily furious +6310|1322|61|6|37|45262.84|0.00|0.07|R|F|1994-06-03|1994-07-07|1994-06-28|DELIVER IN PERSON|RAIL|s along the +6310|1527|68|7|49|69997.48|0.04|0.03|A|F|1994-06-10|1994-06-20|1994-06-17|COLLECT COD|REG AIR|furiously +6311|942|43|1|24|44230.56|0.05|0.02|A|F|1993-03-20|1993-04-28|1993-04-04|NONE|FOB|ic instructions caj +6336|1950|51|1|35|64818.25|0.07|0.01|N|O|1995-09-28|1995-10-17|1995-10-16|TAKE BACK RETURN|RAIL|ts wake furiously +6336|721|54|2|9|14595.48|0.03|0.00|N|O|1995-12-05|1995-10-06|1995-12-08|COLLECT COD|REG AIR|l accounts +6337|1398|13|1|25|32484.75|0.02|0.03|N|O|1995-10-29|1995-11-23|1995-11-03|COLLECT COD|AIR|nic accounts sleep express, +6337|1446|25|2|18|24253.92|0.09|0.08|N|O|1995-10-18|1995-11-30|1995-11-02|NONE|TRUCK| wake fluff +6337|1943|44|3|20|36898.80|0.02|0.01|N|O|1995-10-30|1995-10-17|1995-11-05|DELIVER IN PERSON|MAIL|l accounts are blithely. final, ironic +6337|529|20|4|32|45744.64|0.01|0.07|N|O|1995-12-23|1995-10-27|1996-01-06|DELIVER IN PERSON|FOB|l packages cajole. ca +6337|467|26|5|34|46493.64|0.02|0.08|N|O|1995-09-03|1995-10-30|1995-09-04|COLLECT COD|SHIP|xpress requests. regular reque +6337|1704|31|6|7|11239.90|0.09|0.00|N|O|1995-09-07|1995-10-18|1995-10-01|COLLECT COD|TRUCK|arefully regular deposits sleep dependencie +6338|1304|43|1|3|3615.90|0.00|0.04|R|F|1992-03-31|1992-04-01|1992-04-28|DELIVER IN PERSON|RAIL|instructions. bold ide +6338|1383|60|2|24|30825.12|0.04|0.06|R|F|1992-04-28|1992-03-30|1992-05-14|DELIVER IN PERSON|REG AIR|s. asympto +6338|1851|81|3|41|71866.85|0.10|0.07|R|F|1992-04-06|1992-05-03|1992-04-27|TAKE BACK RETURN|REG AIR|le slyly across +6338|1004|40|4|27|24435.00|0.09|0.01|A|F|1992-04-12|1992-03-28|1992-04-15|NONE|SHIP| the slyly slow instruction +6339|557|18|1|16|23320.80|0.01|0.03|A|F|1993-02-16|1993-02-17|1993-02-27|COLLECT COD|FOB| unusual theodolites breach slowly. p +6339|14|15|2|10|9140.10|0.03|0.02|A|F|1992-12-27|1993-01-16|1993-01-03|NONE|AIR|efully slyly final requests +6339|1916|49|3|37|67262.67|0.09|0.02|A|F|1993-01-16|1993-03-08|1993-01-28|TAKE BACK RETURN|FOB|ly pending asymptotes. deposits upon th +6339|1473|74|4|6|8246.82|0.03|0.04|A|F|1993-03-16|1993-01-23|1993-03-30|DELIVER IN PERSON|AIR|. finally pending requests hinder furiously +6339|286|68|5|19|22539.32|0.06|0.04|A|F|1993-01-31|1993-03-07|1993-02-15|COLLECT COD|TRUCK|thely after the stealthily special depen +6339|1389|90|6|11|14194.18|0.07|0.00|A|F|1993-04-07|1993-01-26|1993-04-18|DELIVER IN PERSON|TRUCK|refully ironic instructions doze a +6340|1147|20|1|31|32492.34|0.00|0.02|N|O|1997-01-16|1996-11-10|1997-01-24|COLLECT COD|SHIP| regular accounts +6340|1406|7|2|46|60140.40|0.07|0.00|N|O|1997-01-20|1996-11-26|1997-01-26|COLLECT COD|AIR|its. furiously final +6340|1941|86|3|13|23958.22|0.01|0.08|N|O|1997-01-31|1996-12-08|1997-02-25|NONE|FOB|posits. fluffily ironi +6340|718|19|4|29|46942.59|0.01|0.00|N|O|1996-12-07|1996-11-21|1996-12-24|COLLECT COD|REG AIR|ar, regular deposits hagg +6340|243|25|5|47|53732.28|0.01|0.06|N|O|1997-01-24|1996-11-28|1997-02-04|TAKE BACK RETURN|RAIL|ending theodolites. pa +6341|1700|1|1|11|17618.70|0.09|0.03|N|O|1996-08-11|1996-07-17|1996-09-02|DELIVER IN PERSON|REG AIR|fully after the hockey pla +6341|529|60|2|16|22872.32|0.08|0.03|N|O|1996-08-27|1996-07-19|1996-09-21|TAKE BACK RETURN|RAIL|ependencies +6341|625|57|3|26|39666.12|0.10|0.04|N|O|1996-06-16|1996-07-13|1996-07-01|TAKE BACK RETURN|RAIL|ly final instructions detect +6341|1224|62|4|35|39382.70|0.00|0.05|N|O|1996-09-16|1996-07-27|1996-09-21|DELIVER IN PERSON|SHIP|ctions breach blit +6341|1493|72|5|46|64146.54|0.08|0.05|N|O|1996-07-19|1996-08-29|1996-08-09|TAKE BACK RETURN|MAIL|gular courts. special +6342|479|38|1|44|60696.68|0.09|0.04|N|O|1997-12-07|1997-12-31|1997-12-12|NONE|SHIP|uriously quickly +6342|25|1|2|10|9250.20|0.00|0.04|N|O|1998-02-26|1997-12-29|1998-03-01|TAKE BACK RETURN|MAIL|ly final foxes. bra +6342|539|40|3|38|54702.14|0.05|0.08|N|O|1997-12-19|1998-02-05|1997-12-25|NONE|REG AIR|unusual request +6342|1784|11|4|28|47201.84|0.06|0.02|N|O|1997-12-09|1998-01-06|1997-12-13|NONE|AIR|ffy accounts was a +6342|1072|43|5|18|17515.26|0.02|0.06|N|O|1998-02-19|1998-02-16|1998-03-01|NONE|SHIP|nts nag quietly unusual requests. s +6342|1358|73|6|1|1259.35|0.10|0.01|N|O|1998-01-28|1997-12-31|1998-02-13|DELIVER IN PERSON|TRUCK|yly furiously final ex +6343|632|33|1|3|4597.89|0.02|0.04|N|O|1998-07-04|1998-05-15|1998-07-08|DELIVER IN PERSON|RAIL|according to the even, p +6343|923|26|2|49|89372.08|0.07|0.06|N|O|1998-06-19|1998-05-23|1998-06-26|COLLECT COD|FOB| toward the bl +6343|1360|99|3|31|39102.16|0.05|0.07|N|O|1998-07-08|1998-06-07|1998-07-28|DELIVER IN PERSON|AIR|s. furiously careful packages hag +6343|1336|37|4|25|30933.25|0.00|0.00|N|O|1998-05-04|1998-06-15|1998-05-20|NONE|AIR|e carefully +6343|676|77|5|48|75680.16|0.10|0.04|N|O|1998-04-30|1998-06-16|1998-05-18|NONE|AIR|ites boost. final depe +6343|307|64|6|48|57950.40|0.10|0.05|N|O|1998-05-17|1998-04-20|1998-05-21|DELIVER IN PERSON|TRUCK|eas. even accounts use outside the pen +6368|825|59|1|38|65581.16|0.05|0.03|A|F|1994-03-22|1994-05-09|1994-03-25|TAKE BACK RETURN|TRUCK|nto beans integrate requests! carefully s +6368|1708|93|2|36|57949.20|0.04|0.01|R|F|1994-03-09|1994-05-03|1994-04-06|TAKE BACK RETURN|SHIP|he special, ironic +6368|1374|51|3|44|56116.28|0.02|0.00|A|F|1994-05-11|1994-05-17|1994-05-24|DELIVER IN PERSON|RAIL|uickly final pa +6369|1452|31|1|32|43310.40|0.05|0.06|A|F|1995-03-13|1995-03-02|1995-03-20|NONE|SHIP|- furiously special theodolites are acc +6369|1407|8|2|47|61494.80|0.01|0.00|R|F|1995-03-29|1995-01-23|1995-04-24|COLLECT COD|SHIP|ully above the carefully spe +6369|224|6|3|34|38223.48|0.07|0.03|R|F|1995-02-10|1995-03-18|1995-03-12|COLLECT COD|TRUCK|usly regul +6369|1647|48|4|39|60396.96|0.09|0.01|R|F|1995-01-25|1995-02-04|1995-02-19|NONE|AIR|equests along the carefully even deposits +6370|1444|45|1|6|8072.64|0.01|0.05|A|F|1993-03-16|1993-01-31|1993-04-01|DELIVER IN PERSON|REG AIR|pinto beans cajole furiously accord +6370|325|54|2|38|46562.16|0.01|0.06|R|F|1993-02-19|1993-02-14|1993-03-18|TAKE BACK RETURN|AIR|xpress ideas are. s +6371|394|95|1|9|11649.51|0.07|0.06|R|F|1993-07-30|1993-06-25|1993-08-27|DELIVER IN PERSON|TRUCK|ular request +6371|947|50|2|31|57286.14|0.06|0.08|R|F|1993-07-14|1993-06-20|1993-08-10|COLLECT COD|RAIL|ns boost blithel +6371|1475|54|3|20|27529.40|0.05|0.08|A|F|1993-05-13|1993-06-06|1993-06-07|COLLECT COD|MAIL|ve the quickly express deposits. blithely +6371|1515|16|4|26|36829.26|0.09|0.03|R|F|1993-07-15|1993-05-18|1993-07-21|TAKE BACK RETURN|FOB|ithely above the carefully bold foxes. +6371|1103|4|5|50|50205.00|0.07|0.00|A|F|1993-06-13|1993-06-09|1993-06-20|DELIVER IN PERSON|AIR|e evenly pen +6372|1647|48|1|24|37167.36|0.07|0.06|R|F|1994-06-18|1994-04-18|1994-06-22|TAKE BACK RETURN|REG AIR|s. final ideas wake quickly above t +6372|945|80|2|39|71991.66|0.04|0.05|R|F|1994-05-09|1994-05-01|1994-05-25|DELIVER IN PERSON|TRUCK|ss careful +6372|1299|74|3|39|46811.31|0.00|0.07|A|F|1994-04-14|1994-04-07|1994-05-02|DELIVER IN PERSON|AIR|tegrate slyly thinly sp +6373|387|16|1|9|11586.42|0.09|0.05|R|F|1992-03-18|1992-04-19|1992-04-15|TAKE BACK RETURN|MAIL|ep slyly car +6373|1592|73|2|9|13442.31|0.10|0.01|A|F|1992-04-08|1992-03-20|1992-04-17|NONE|REG AIR|lithely according to the fluffily e +6373|237|92|3|48|54587.04|0.10|0.06|R|F|1992-02-05|1992-04-11|1992-02-28|TAKE BACK RETURN|TRUCK|sleep carefully blithely +6373|1147|84|4|4|4192.56|0.10|0.03|R|F|1992-05-06|1992-04-18|1992-05-17|DELIVER IN PERSON|REG AIR|l packages. even c +6373|56|57|5|5|4780.25|0.05|0.04|A|F|1992-01-26|1992-04-12|1992-02-23|TAKE BACK RETURN|AIR|ven ideas among the furiously e +6373|1990|91|6|50|94599.50|0.06|0.06|A|F|1992-04-25|1992-03-11|1992-04-30|DELIVER IN PERSON|REG AIR|ajole furiously +6374|253|8|1|6|6919.50|0.03|0.03|N|O|1995-08-28|1995-09-17|1995-09-17|DELIVER IN PERSON|REG AIR|slyly special sentiments sleep fluffily. s +6374|1232|33|2|37|41929.51|0.05|0.02|N|O|1995-11-07|1995-09-14|1995-11-29|COLLECT COD|RAIL|quickly according to the blithely +6374|805|5|3|1|1705.80|0.03|0.04|N|O|1995-09-01|1995-10-21|1995-09-19|DELIVER IN PERSON|MAIL|gular deposits breach alongside of the +6374|1187|60|4|28|30469.04|0.01|0.07|N|O|1995-09-25|1995-10-16|1995-10-01|TAKE BACK RETURN|FOB|press foxes are. regula +6374|1357|96|5|22|27683.70|0.06|0.03|N|O|1995-11-20|1995-10-24|1995-11-28|DELIVER IN PERSON|REG AIR|fully carefully +6374|975|10|6|24|45023.28|0.01|0.05|N|O|1995-08-20|1995-09-07|1995-09-06|COLLECT COD|AIR|deposits above the final, final courts sl +6375|646|47|1|40|61865.60|0.08|0.05|N|O|1998-01-10|1998-01-28|1998-01-18|DELIVER IN PERSON|SHIP| deposits mold sl +6375|12|63|2|50|45600.50|0.02|0.02|N|O|1998-02-10|1998-01-11|1998-03-08|NONE|FOB|nticing reque +6375|1009|15|3|43|39130.00|0.08|0.03|N|O|1998-02-25|1998-02-04|1998-03-04|NONE|MAIL|inal, final i +6375|1822|52|4|45|77571.90|0.07|0.03|N|O|1997-11-23|1997-12-24|1997-11-28|DELIVER IN PERSON|FOB| furiously express ideas sleep +6375|396|97|5|4|5185.56|0.03|0.01|N|O|1998-03-05|1998-01-10|1998-03-25|NONE|AIR|. careful asymptot +6375|424|54|6|37|49003.54|0.03|0.05|N|O|1998-01-06|1998-01-11|1998-01-10|DELIVER IN PERSON|TRUCK|packages af +6400|919|54|1|22|40038.02|0.10|0.07|A|F|1994-02-25|1994-04-07|1994-03-06|COLLECT COD|TRUCK|ts sleep carefully quickly reg +6400|1423|24|2|49|64896.58|0.01|0.06|R|F|1994-03-07|1994-03-05|1994-03-20|TAKE BACK RETURN|MAIL|jole slyly above the slyly sp +6401|1195|68|1|36|39462.84|0.06|0.07|N|O|1997-05-07|1997-06-20|1997-05-13|DELIVER IN PERSON|RAIL|do cajole ruthlessly bold, final accounts. +6401|339|24|2|39|48333.87|0.08|0.01|N|O|1997-05-23|1997-06-16|1997-05-25|COLLECT COD|MAIL|es haggle careful +6401|114|93|3|6|6084.66|0.07|0.06|N|O|1997-06-08|1997-05-24|1997-06-18|DELIVER IN PERSON|TRUCK| final, express pi +6401|1494|95|4|18|25118.82|0.01|0.07|N|O|1997-05-19|1997-06-07|1997-05-29|COLLECT COD|REG AIR|ess deposits sublate ironic ac +6401|171|24|5|25|26779.25|0.04|0.05|N|O|1997-08-01|1997-06-25|1997-08-30|COLLECT COD|RAIL|sleep slyly. carefully +6402|1808|9|1|40|68392.00|0.07|0.01|N|O|1995-06-23|1995-06-06|1995-06-28|TAKE BACK RETURN|SHIP|efully iro +6402|1884|85|2|42|75006.96|0.09|0.07|A|F|1995-04-28|1995-07-23|1995-05-21|NONE|SHIP|ests. carefully bold accou +6402|1934|35|3|27|49570.11|0.07|0.06|N|O|1995-07-22|1995-06-10|1995-07-23|DELIVER IN PERSON|TRUCK|carefully. furiously regular dolphins s +6402|716|49|4|18|29100.78|0.04|0.06|N|F|1995-06-16|1995-06-29|1995-06-19|COLLECT COD|MAIL|en, unusual pinto beans ha +6403|1273|48|1|13|15265.51|0.07|0.00|N|F|1995-05-31|1995-03-20|1995-06-30|TAKE BACK RETURN|TRUCK|final packages sleep. ruthless deposits hag +6403|128|7|2|13|13365.56|0.01|0.04|R|F|1995-04-01|1995-03-19|1995-04-15|DELIVER IN PERSON|RAIL|nding platelets. daring, expre +6403|1549|30|3|49|71076.46|0.09|0.03|R|F|1995-02-26|1995-03-21|1995-03-28|COLLECT COD|REG AIR|ise final, even accounts. slyly unusual s +6404|1431|32|1|45|59959.35|0.02|0.04|N|O|1996-07-13|1996-08-15|1996-08-03|COLLECT COD|MAIL|l sheaves. fluffily ruthless requests nag +6405|356|41|1|1|1256.35|0.09|0.07|N|O|1997-08-13|1997-07-30|1997-09-09|NONE|FOB|lay carefully ironic packa +6405|87|38|2|39|38496.12|0.09|0.04|N|O|1997-06-26|1997-07-27|1997-07-05|NONE|RAIL|nts sleep. ironic accounts cajole aga +6406|1747|90|1|19|31326.06|0.00|0.04|R|F|1994-11-14|1994-10-15|1994-11-30|DELIVER IN PERSON|SHIP|s use slyly against the quic +6406|175|54|2|3|3225.51|0.02|0.06|R|F|1994-09-09|1994-11-01|1994-10-09|COLLECT COD|AIR|fluffily ironi +6406|461|49|3|11|14976.06|0.04|0.05|R|F|1994-08-26|1994-10-07|1994-09-04|DELIVER IN PERSON|FOB|y. blithely regular ideas wake b +6406|1567|8|4|24|35245.44|0.06|0.01|R|F|1994-11-18|1994-09-28|1994-12-13|COLLECT COD|AIR|ges. slyly careful asymptotes amon +6406|1477|95|5|15|20677.05|0.04|0.01|R|F|1994-10-09|1994-11-09|1994-11-02|TAKE BACK RETURN|RAIL|ions. specia +6407|677|78|1|38|59951.46|0.03|0.03|N|O|1995-10-31|1995-09-11|1995-11-14|COLLECT COD|AIR|e of the fluff +6407|25|26|2|48|44400.96|0.01|0.06|N|O|1995-08-05|1995-10-05|1995-08-30|TAKE BACK RETURN|FOB| multipliers above the final, regu +6432|261|43|1|37|42966.62|0.04|0.00|N|O|1996-01-25|1995-12-28|1996-02-03|TAKE BACK RETURN|FOB|he, regular instructions. furiously +6432|717|18|2|26|42060.46|0.02|0.06|N|O|1996-02-02|1996-01-12|1996-03-01|COLLECT COD|REG AIR|regular fo +6432|619|13|3|25|37990.25|0.02|0.02|N|O|1996-02-28|1995-12-11|1996-03-02|COLLECT COD|SHIP|ng accounts cajole care +6432|1257|32|4|26|30114.50|0.01|0.01|N|O|1996-01-17|1995-12-27|1996-01-26|NONE|RAIL|hely ironic dugouts sleep always against t +6432|1122|31|5|21|21485.52|0.04|0.06|N|O|1995-12-27|1995-12-13|1996-01-06|NONE|RAIL|haggle carefully +6432|476|77|6|2|2752.94|0.02|0.06|N|O|1995-11-25|1996-01-01|1995-12-25|DELIVER IN PERSON|TRUCK|idly careful platelets boost care +6432|1972|17|7|2|3747.94|0.07|0.01|N|O|1996-02-06|1996-01-09|1996-02-22|TAKE BACK RETURN|REG AIR|onically regular ins +6433|733|30|1|50|81686.50|0.01|0.04|N|O|1995-12-02|1996-01-22|1995-12-27|NONE|MAIL|posits boost carefully busy notornis. regul +6433|1387|88|2|42|54111.96|0.07|0.06|N|O|1996-03-14|1996-02-01|1996-04-05|DELIVER IN PERSON|RAIL|kly final deposits haggle +6433|101|28|3|45|45049.50|0.08|0.03|N|O|1996-01-04|1996-02-05|1996-01-08|COLLECT COD|REG AIR|kages sleep regular deposits. b +6433|1103|76|4|15|15061.50|0.09|0.04|N|O|1996-01-27|1995-12-27|1996-02-15|DELIVER IN PERSON|MAIL|lithe ideas. furiously final r +6433|481|82|5|29|40062.92|0.03|0.03|N|O|1995-12-11|1996-02-07|1996-01-07|NONE|AIR|equests. ironic accounts sl +6433|1997|42|6|16|30383.84|0.00|0.03|N|O|1996-03-01|1996-01-31|1996-03-05|TAKE BACK RETURN|RAIL|refully. ironic sauternes should have to +6433|1269|7|7|19|22234.94|0.08|0.05|N|O|1995-11-29|1996-01-26|1995-12-26|COLLECT COD|RAIL|, bold packages +6434|1519|40|1|43|61081.93|0.05|0.00|R|F|1994-07-19|1994-09-01|1994-08-05|TAKE BACK RETURN|MAIL|ke furiously blithely final accoun +6434|1929|30|2|46|84222.32|0.01|0.04|A|F|1994-06-17|1994-07-11|1994-06-27|DELIVER IN PERSON|AIR|stealthy requests are slyly according +6434|1402|3|3|29|37798.60|0.09|0.05|R|F|1994-08-12|1994-07-24|1994-09-08|TAKE BACK RETURN|MAIL|ide of the carefully unusual +6435|527|28|1|29|41398.08|0.04|0.07|N|O|1996-06-12|1996-08-14|1996-06-29|COLLECT COD|REG AIR|gular requests nod above the slyly specia +6435|857|91|2|46|80861.10|0.04|0.07|N|O|1996-09-21|1996-07-26|1996-10-21|COLLECT COD|RAIL|sits. ironic +6435|1874|18|3|18|31965.66|0.01|0.06|N|O|1996-07-16|1996-08-22|1996-07-24|TAKE BACK RETURN|MAIL|deposits. carefully even accounts ac +6435|1660|2|4|19|29671.54|0.01|0.07|N|O|1996-07-19|1996-07-23|1996-07-26|TAKE BACK RETURN|TRUCK|pendencies. regular, f +6435|1114|15|5|35|35528.85|0.10|0.03|N|O|1996-09-10|1996-08-18|1996-09-11|COLLECT COD|MAIL| are furiously carefully exp +6435|732|33|6|19|31021.87|0.06|0.06|N|O|1996-09-16|1996-08-23|1996-09-20|TAKE BACK RETURN|MAIL|ously express deposits. pac +6435|736|37|7|10|16367.30|0.09|0.03|N|O|1996-07-09|1996-08-11|1996-07-23|COLLECT COD|MAIL|instructions. express depo +6436|965|34|1|7|13061.72|0.09|0.06|A|F|1992-05-07|1992-05-05|1992-06-06|TAKE BACK RETURN|MAIL|al courts eat furiously quickly +6436|182|9|2|4|4328.72|0.00|0.02|R|F|1992-04-21|1992-05-28|1992-05-01|TAKE BACK RETURN|SHIP|. forges wake +6437|1609|10|1|10|15106.00|0.05|0.08|R|F|1994-04-18|1994-03-26|1994-04-21|NONE|MAIL|final deposits. even theodolites boos +6437|671|65|2|18|28290.06|0.07|0.05|A|F|1994-02-07|1994-03-22|1994-03-01|TAKE BACK RETURN|AIR|deas wake express, sile +6437|1856|57|3|49|86134.65|0.01|0.04|R|F|1994-02-07|1994-04-22|1994-03-06|NONE|RAIL|o the even +6437|1996|29|4|36|68327.64|0.09|0.08|R|F|1994-02-09|1994-03-06|1994-03-11|COLLECT COD|SHIP|gular, enticing packages will have +6438|350|7|1|8|10002.80|0.00|0.08|A|F|1993-07-28|1993-07-18|1993-08-21|COLLECT COD|MAIL|tegrate fluffily. +6438|1293|94|2|6|7165.74|0.01|0.07|A|F|1993-05-27|1993-07-02|1993-06-15|TAKE BACK RETURN|FOB|kages. slyly special theodolites +6438|1816|46|3|3|5153.43|0.10|0.07|R|F|1993-07-27|1993-08-12|1993-08-06|DELIVER IN PERSON|RAIL|lyly carefully unusua +6438|875|75|4|23|40845.01|0.08|0.02|R|F|1993-08-25|1993-06-25|1993-08-27|COLLECT COD|RAIL|ly express excuses after the senti +6438|1733|76|5|37|60485.01|0.07|0.03|A|F|1993-07-27|1993-07-27|1993-08-24|DELIVER IN PERSON|SHIP|d platelets wake slyly. +6439|1559|100|1|2|2921.10|0.05|0.00|N|O|1995-07-23|1995-09-15|1995-07-28|TAKE BACK RETURN|RAIL|. furiously express pinto +6439|1267|42|2|16|18692.16|0.10|0.08|N|O|1995-08-29|1995-09-25|1995-08-31|DELIVER IN PERSON|TRUCK|against the slyly pending accounts. ne +6439|1248|49|3|48|55163.52|0.02|0.05|N|O|1995-09-25|1995-09-24|1995-10-10|TAKE BACK RETURN|SHIP|ly regular foxes nag along the carefully +6439|1992|37|4|42|79547.58|0.08|0.02|N|O|1995-10-10|1995-09-01|1995-10-19|COLLECT COD|SHIP| the blithely +6439|630|31|5|48|73470.24|0.01|0.06|N|O|1995-08-04|1995-08-12|1995-08-20|DELIVER IN PERSON|FOB|nal pinto beans: fluffily bold real +6464|1016|87|1|39|35763.39|0.08|0.06|A|F|1994-07-24|1994-07-21|1994-08-05|DELIVER IN PERSON|FOB|s boost: regular deposits mold furiously a +6464|122|49|2|32|32707.84|0.06|0.04|A|F|1994-07-24|1994-07-10|1994-08-17|TAKE BACK RETURN|TRUCK|unts. quickly even foxes dazzl +6464|1956|89|3|40|74318.00|0.07|0.04|R|F|1994-08-27|1994-08-24|1994-09-17|NONE|SHIP| instructions. special instruction +6464|1669|11|4|3|4711.98|0.08|0.08|R|F|1994-06-17|1994-07-18|1994-06-27|TAKE BACK RETURN|FOB|g the ironi +6464|725|22|5|8|13005.76|0.09|0.04|R|F|1994-09-05|1994-07-29|1994-09-28|COLLECT COD|SHIP|blithely ironic, regular deposits +6464|1933|34|6|8|14679.44|0.07|0.04|R|F|1994-06-26|1994-08-18|1994-07-09|DELIVER IN PERSON|RAIL| special foxes wake carefully ironic, +6465|1918|51|1|29|52777.39|0.07|0.07|N|O|1995-10-18|1995-10-05|1995-11-12|TAKE BACK RETURN|FOB| furiously ironic platelets. +6465|1954|99|2|4|7423.80|0.01|0.01|N|O|1995-11-06|1995-09-17|1995-11-30|COLLECT COD|TRUCK|pinto beans mold about the flu +6465|684|85|3|35|55463.80|0.01|0.05|N|O|1995-11-22|1995-10-01|1995-12-02|DELIVER IN PERSON|REG AIR|uests sleep carefully among the quickly bo +6465|784|81|4|3|5054.34|0.10|0.08|N|O|1995-10-10|1995-10-18|1995-10-30|TAKE BACK RETURN|AIR|. carefully regular accoun +6465|458|88|5|4|5433.80|0.00|0.05|N|O|1995-11-12|1995-11-05|1995-11-22|NONE|RAIL|riously final deposits. quickly +6465|1845|46|6|43|75114.12|0.05|0.02|N|O|1995-11-10|1995-10-23|1995-11-25|TAKE BACK RETURN|REG AIR|dependencies sleep fluffily alongside +6465|476|6|7|10|13764.70|0.01|0.02|N|O|1995-08-17|1995-10-24|1995-09-03|NONE|SHIP|are ironically special, regular accounts. e +6466|829|30|1|25|43245.50|0.02|0.01|N|O|1997-06-22|1997-06-18|1997-07-04|TAKE BACK RETURN|SHIP|ravely regular a +6467|222|23|1|50|56111.00|0.05|0.06|N|O|1998-06-02|1998-05-05|1998-06-06|NONE|REG AIR|haggle. ideas +6468|1741|84|1|18|29569.32|0.00|0.04|N|O|1996-11-04|1996-11-01|1996-11-14|DELIVER IN PERSON|REG AIR|dependencies use r +6469|1600|21|1|28|42044.80|0.04|0.04|N|O|1996-04-05|1996-06-07|1996-04-08|TAKE BACK RETURN|FOB|furiously regular dolphins wake fin +6469|807|7|2|49|83682.20|0.09|0.03|N|O|1996-05-05|1996-05-02|1996-05-14|COLLECT COD|REG AIR|ong the decoys boost sl +6469|1990|23|3|18|34055.82|0.02|0.05|N|O|1996-04-09|1996-05-25|1996-04-26|DELIVER IN PERSON|AIR|osits. thin +6469|360|45|4|19|23946.84|0.03|0.07|N|O|1996-03-20|1996-05-07|1996-03-26|COLLECT COD|MAIL|cording to the even deposits detect +6469|182|9|5|8|8657.44|0.04|0.02|N|O|1996-06-07|1996-05-11|1996-06-12|TAKE BACK RETURN|MAIL|ar accounts are +6469|650|82|6|12|18607.80|0.00|0.03|N|O|1996-04-18|1996-05-08|1996-05-06|DELIVER IN PERSON|RAIL|against the packages +6469|578|69|7|48|70971.36|0.09|0.05|N|O|1996-04-30|1996-04-24|1996-05-28|COLLECT COD|RAIL| have to sleep slyly special pin +6470|525|56|1|30|42765.60|0.02|0.06|N|O|1995-10-23|1995-12-01|1995-11-20|COLLECT COD|AIR|he quickly bold deposits. regular requ +6470|1562|63|2|44|64396.64|0.07|0.04|N|O|1995-12-15|1995-11-10|1995-12-27|TAKE BACK RETURN|FOB|ly along the regular dependencies. final, +6470|1518|19|3|44|62458.44|0.07|0.06|N|O|1995-12-17|1995-10-16|1996-01-14|COLLECT COD|FOB| blithe instruct +6470|1155|56|4|12|12673.80|0.08|0.03|N|O|1995-12-09|1995-10-29|1995-12-12|NONE|TRUCK| the enticing, ironic deposits. slyly exp +6470|1459|38|5|42|57138.90|0.07|0.03|N|O|1995-10-23|1995-12-03|1995-11-11|DELIVER IN PERSON|SHIP|uests was quickly ac +6470|375|4|6|37|47188.69|0.03|0.07|N|O|1995-09-14|1995-10-22|1995-09-24|COLLECT COD|SHIP|quickly alon +6470|1847|77|7|9|15739.56|0.01|0.05|N|O|1996-01-09|1995-11-28|1996-01-20|DELIVER IN PERSON|AIR| across the slyly silent +6471|380|9|1|49|62738.62|0.09|0.03|N|O|1998-05-18|1998-03-31|1998-06-12|NONE|AIR|uffily bold de +6471|505|66|2|36|50598.00|0.02|0.02|N|O|1998-05-03|1998-04-08|1998-05-20|DELIVER IN PERSON|TRUCK|inal frets. quickly special theodolites wak +6471|1589|10|3|8|11924.64|0.06|0.04|N|O|1998-05-18|1998-05-05|1998-05-23|NONE|RAIL| slyly regular idea +6471|1906|39|4|6|10847.40|0.09|0.03|N|O|1998-04-12|1998-05-20|1998-04-30|NONE|TRUCK|pecial excuses. final accounts above +6471|1701|44|5|49|78532.30|0.04|0.05|N|O|1998-04-09|1998-05-05|1998-04-28|DELIVER IN PERSON|REG AIR|arefully ironic theodolites. s +6471|1895|82|6|16|28750.24|0.03|0.07|N|O|1998-04-29|1998-04-09|1998-05-02|TAKE BACK RETURN|SHIP|ep slyly ironic, +6471|1684|67|7|26|41227.68|0.03|0.08|N|O|1998-06-22|1998-05-08|1998-07-14|DELIVER IN PERSON|MAIL|ly fluffil +6496|1360|61|1|36|45408.96|0.06|0.04|N|O|1995-10-27|1995-08-06|1995-11-20|TAKE BACK RETURN|RAIL| sleep carefully about the som +6496|286|68|2|41|48637.48|0.06|0.00|N|O|1995-08-03|1995-09-24|1995-08-15|TAKE BACK RETURN|REG AIR|ons are along the ev +6496|1874|4|3|24|42620.88|0.01|0.01|N|O|1995-10-10|1995-09-18|1995-10-22|COLLECT COD|AIR|lly even instruc +6496|1891|35|4|15|26893.35|0.03|0.08|N|O|1995-10-26|1995-09-02|1995-11-15|DELIVER IN PERSON|TRUCK|carefully regular requests haggl +6496|841|41|5|23|40062.32|0.04|0.01|N|O|1995-10-04|1995-08-27|1995-10-12|COLLECT COD|RAIL| are slyly according to the i +6496|1301|78|6|12|14427.60|0.05|0.03|N|O|1995-10-16|1995-07-31|1995-11-07|DELIVER IN PERSON|AIR|ic packages-- furiously +6497|1899|29|1|27|48624.03|0.07|0.04|N|O|1997-12-10|1997-11-11|1997-12-27|NONE|AIR|ys slyly special dolphins. asymptotes +6498|1335|12|1|43|53162.19|0.00|0.03|A|F|1994-04-26|1994-04-20|1994-05-21|DELIVER IN PERSON|REG AIR|fluffily final depend +6498|1434|52|2|20|26708.60|0.04|0.07|R|F|1994-06-16|1994-06-01|1994-07-08|NONE|TRUCK|gular requests +6499|1470|10|1|23|31543.81|0.07|0.04|N|O|1995-08-14|1995-07-17|1995-08-16|TAKE BACK RETURN|TRUCK|packages. final, re +6499|1461|62|2|39|53135.94|0.01|0.04|N|O|1995-06-19|1995-06-14|1995-07-19|DELIVER IN PERSON|REG AIR|. accounts cajole deposits. furiously r +6499|1227|39|3|8|9025.76|0.05|0.07|N|O|1995-07-13|1995-07-11|1995-08-02|DELIVER IN PERSON|SHIP|s believe slyly +6500|639|33|1|31|47728.53|0.04|0.06|A|F|1993-01-16|1992-12-01|1993-01-27|TAKE BACK RETURN|MAIL|among the quickly unusual accoun +6500|902|37|2|8|14423.20|0.10|0.01|R|F|1992-12-03|1992-12-05|1992-12-13|COLLECT COD|FOB| theodolites d +6500|324|53|3|47|57543.04|0.04|0.00|R|F|1993-01-17|1992-12-22|1993-02-14|NONE|MAIL|tions cajole carefully. fluffily unusual +6501|1244|82|1|15|17178.60|0.09|0.04|R|F|1992-04-16|1992-02-27|1992-04-28|NONE|SHIP|s x-ray furiously instead of the +6501|1826|13|2|43|74296.26|0.05|0.08|R|F|1992-02-20|1992-03-29|1992-03-09|DELIVER IN PERSON|AIR|ns are furiously about the fluffily fina +6501|1009|15|3|24|21840.00|0.03|0.06|A|F|1992-04-01|1992-03-28|1992-04-30|NONE|TRUCK|ely regular p +6501|1972|61|4|30|56219.10|0.06|0.03|R|F|1992-01-25|1992-04-04|1992-02-13|NONE|MAIL|ages are caref +6502|460|61|1|1|1360.46|0.01|0.05|N|O|1995-10-13|1995-10-07|1995-10-17|TAKE BACK RETURN|MAIL|ake final, e +6502|1498|77|2|19|26590.31|0.03|0.04|N|O|1995-11-23|1995-11-02|1995-12-08|COLLECT COD|TRUCK|uests accor +6502|274|56|3|4|4697.08|0.09|0.08|N|O|1995-12-14|1995-10-07|1995-12-18|COLLECT COD|SHIP|boldly bold accoun +6502|595|96|4|16|23929.44|0.09|0.03|N|O|1995-10-16|1995-11-14|1995-11-08|COLLECT COD|FOB|its unwind carefully alongside of the brav +6502|1664|47|5|6|9393.96|0.09|0.01|N|O|1995-08-24|1995-10-12|1995-09-20|NONE|SHIP|haggle slyly acr +6502|1677|1|6|41|64725.47|0.01|0.07|N|O|1995-10-17|1995-10-21|1995-10-31|NONE|AIR|s. quickly final accounts integrate +6503|640|34|1|20|30812.80|0.05|0.05|N|O|1997-09-09|1997-10-02|1997-09-20|TAKE BACK RETURN|REG AIR|avely. slyly special package +6503|1916|61|2|24|43629.84|0.00|0.04|N|O|1997-10-16|1997-09-23|1997-10-17|COLLECT COD|RAIL|g the stealthy, regular +6503|1276|14|3|47|55331.69|0.09|0.01|N|O|1997-10-29|1997-08-24|1997-11-27|NONE|AIR|e slyly. regular ideas +6528|487|17|1|30|41624.40|0.09|0.01|A|F|1993-05-29|1993-03-12|1993-06-09|TAKE BACK RETURN|AIR|e. furiously special theodolites boost sl +6528|52|53|2|44|41890.20|0.08|0.05|R|F|1993-04-26|1993-04-06|1993-05-11|DELIVER IN PERSON|SHIP|ly ironic dependencie +6528|150|77|3|48|50407.20|0.07|0.05|R|F|1993-02-26|1993-03-15|1993-03-12|DELIVER IN PERSON|FOB|quests sleep carefully along the b +6528|390|47|4|36|46454.04|0.01|0.01|A|F|1993-03-07|1993-03-21|1993-03-10|COLLECT COD|REG AIR|ep. fluffily regular pinto bean +6529|821|88|1|50|86091.00|0.08|0.03|A|F|1992-12-11|1993-01-29|1992-12-17|DELIVER IN PERSON|MAIL|grouches wake quickly bo +6529|199|100|2|20|21983.80|0.05|0.04|R|F|1992-12-18|1993-01-18|1992-12-24|DELIVER IN PERSON|REG AIR|p slyly during the slyl +6529|1023|59|3|9|8316.18|0.01|0.06|R|F|1992-12-20|1993-01-01|1993-01-15|TAKE BACK RETURN|REG AIR|aring packages cajole. foxes cajole sly +6529|1707|34|4|9|14478.30|0.09|0.05|A|F|1993-02-11|1993-02-11|1993-02-17|COLLECT COD|MAIL|ntiments cajole +6529|1410|28|5|15|19671.15|0.06|0.00|A|F|1993-02-01|1993-01-24|1993-02-22|TAKE BACK RETURN|SHIP| sleep blithely pending asymptot +6529|223|51|6|4|4492.88|0.02|0.02|A|F|1993-01-27|1993-01-18|1993-01-29|TAKE BACK RETURN|SHIP| even ideas. quickly even dolp +6529|820|54|7|20|34416.40|0.09|0.00|A|F|1992-12-07|1993-02-17|1992-12-21|NONE|FOB| ironic platelets ab +6530|1804|91|1|5|8529.00|0.10|0.00|N|O|1997-11-19|1997-10-15|1997-12-07|COLLECT COD|FOB|ly even packages haggle quickly +6531|282|37|1|27|31921.56|0.00|0.04|R|F|1993-10-06|1993-10-05|1993-10-30|TAKE BACK RETURN|AIR|ate blithely +6531|787|84|2|18|30380.04|0.07|0.08|R|F|1993-07-20|1993-08-20|1993-08-19|COLLECT COD|RAIL|ular deposits +6531|659|22|3|18|28073.70|0.10|0.03|R|F|1993-07-28|1993-09-12|1993-07-29|COLLECT COD|REG AIR|ely quiet accounts wak +6531|565|66|4|1|1465.56|0.06|0.05|R|F|1993-09-29|1993-09-30|1993-10-12|NONE|RAIL| asymptotes wake furiously across +6531|1946|79|5|24|44350.56|0.01|0.00|A|F|1993-08-29|1993-09-13|1993-09-07|TAKE BACK RETURN|REG AIR|even requests according to th +6531|1885|86|6|38|67901.44|0.03|0.00|A|F|1993-08-13|1993-09-28|1993-08-14|DELIVER IN PERSON|RAIL| ironic asymptotes sleep abo +6532|1764|49|1|19|31649.44|0.03|0.03|N|O|1996-04-21|1996-04-30|1996-05-08|DELIVER IN PERSON|SHIP|o the fluffily final excuses +6532|628|22|2|26|39744.12|0.06|0.00|N|O|1996-06-15|1996-04-02|1996-06-27|TAKE BACK RETURN|SHIP|eep bravely carefully unusual requests. ca +6532|1583|84|3|31|46021.98|0.07|0.03|N|O|1996-06-16|1996-04-19|1996-07-01|COLLECT COD|SHIP|the slyly silen +6532|811|45|4|9|15406.29|0.01|0.06|N|O|1996-05-26|1996-04-07|1996-06-20|TAKE BACK RETURN|AIR|lly according t +6533|1940|85|1|20|36838.80|0.09|0.07|N|O|1998-04-19|1998-04-19|1998-05-05|DELIVER IN PERSON|AIR|fluffily even requests haggle furiou +6533|1446|25|2|46|61982.24|0.07|0.05|N|O|1998-04-02|1998-05-30|1998-04-03|TAKE BACK RETURN|SHIP|ly furiously final foxes. f +6533|1714|41|3|16|25851.36|0.01|0.08|N|O|1998-05-10|1998-04-27|1998-05-19|NONE|REG AIR|. furiousl +6533|849|83|4|42|73493.28|0.05|0.06|N|O|1998-05-08|1998-04-24|1998-05-16|COLLECT COD|FOB|regular account +6533|82|8|5|7|6874.56|0.04|0.05|N|O|1998-03-13|1998-05-10|1998-03-22|TAKE BACK RETURN|FOB| platelets acros +6534|1317|94|1|6|7309.86|0.00|0.05|N|O|1997-05-24|1997-06-28|1997-06-02|COLLECT COD|REG AIR|sly regula +6534|475|76|2|19|26133.93|0.09|0.00|N|O|1997-07-05|1997-07-01|1997-08-01|TAKE BACK RETURN|FOB|es hinder blithely +6535|1171|8|1|46|49319.82|0.05|0.01|R|F|1992-09-09|1992-07-30|1992-09-15|COLLECT COD|FOB|e slyly. fluffily e +6535|1401|41|2|46|59910.40|0.07|0.01|R|F|1992-08-19|1992-09-05|1992-08-22|DELIVER IN PERSON|TRUCK|gle according to the packa +6535|755|88|3|19|31459.25|0.02|0.02|A|F|1992-08-16|1992-08-20|1992-09-05|NONE|TRUCK|ly. blithely regular dinos sleep sil +6535|1666|49|4|43|67409.38|0.00|0.07|R|F|1992-07-17|1992-07-18|1992-08-14|COLLECT COD|AIR|equests. furiously r +6560|1133|42|1|32|33092.16|0.10|0.00|A|F|1995-03-25|1995-02-27|1995-04-08|NONE|SHIP|n accounts. furiously busy deposits +6560|928|31|2|27|49380.84|0.05|0.08|R|F|1995-02-27|1995-03-25|1995-03-23|COLLECT COD|MAIL|platelets cajole according to th +6560|1279|54|3|23|27146.21|0.08|0.01|R|F|1995-04-04|1995-02-14|1995-04-28|COLLECT COD|SHIP|ep fluffily final, express p +6560|1260|61|4|34|39482.84|0.07|0.05|R|F|1995-03-25|1995-03-08|1995-04-20|DELIVER IN PERSON|AIR|carefully ironic epitaphs na +6560|613|76|5|45|68112.45|0.10|0.06|R|F|1995-01-28|1995-03-27|1995-02-11|COLLECT COD|SHIP| are accor +6560|219|47|6|43|48126.03|0.00|0.01|R|F|1995-03-06|1995-03-22|1995-03-14|COLLECT COD|TRUCK|usual deposits a +6560|600|91|7|39|58523.40|0.02|0.05|A|F|1995-02-16|1995-03-10|1995-03-14|DELIVER IN PERSON|MAIL|e. special ins +6561|1285|23|1|49|58127.72|0.10|0.08|R|F|1994-06-09|1994-07-17|1994-07-07|NONE|REG AIR|ut the blithely pend +6561|1231|69|2|45|50950.35|0.04|0.08|A|F|1994-08-23|1994-08-15|1994-09-21|TAKE BACK RETURN|TRUCK|ckly quick packages. fina +6561|1824|25|3|34|58677.88|0.00|0.01|A|F|1994-08-07|1994-07-15|1994-08-28|TAKE BACK RETURN|SHIP|jole furiously regular theodolites. silen +6561|377|62|4|28|35766.36|0.10|0.00|R|F|1994-06-06|1994-08-12|1994-07-02|TAKE BACK RETURN|RAIL|ghout the fluffily slow escapades +6562|566|57|1|19|27864.64|0.06|0.06|R|F|1995-02-08|1995-03-06|1995-03-09|COLLECT COD|REG AIR| across the blithely bold requests +6562|774|75|2|33|55267.41|0.00|0.03|A|F|1995-01-17|1995-02-03|1995-01-25|DELIVER IN PERSON|FOB|ic requests. fluffily ironic deposits hag +6562|281|82|3|20|23625.60|0.04|0.04|R|F|1995-01-03|1995-03-03|1995-01-28|DELIVER IN PERSON|AIR|p furiously +6562|138|17|4|9|9343.17|0.09|0.03|A|F|1995-03-24|1995-02-28|1995-04-10|TAKE BACK RETURN|AIR| instructions. furiously idle fox +6562|842|43|5|22|38342.48|0.04|0.02|A|F|1995-03-08|1995-02-26|1995-03-19|COLLECT COD|REG AIR|the enticingly bol +6562|1710|95|6|45|72526.95|0.10|0.03|R|F|1995-03-24|1995-03-05|1995-04-12|TAKE BACK RETURN|REG AIR|ial requests wake across the carefull +6563|1228|66|1|49|55331.78|0.03|0.06|R|F|1993-01-28|1992-12-18|1993-01-30|TAKE BACK RETURN|REG AIR| packages +6563|1204|5|2|15|16578.00|0.09|0.06|R|F|1992-12-19|1992-12-09|1992-12-30|COLLECT COD|REG AIR|unts are. permanent packages bo +6563|1713|14|3|14|22605.94|0.10|0.06|R|F|1992-12-05|1993-01-11|1992-12-12|NONE|TRUCK|s. furiously ironic ideas shall hav +6564|1657|81|1|34|52994.10|0.06|0.06|A|F|1995-04-11|1995-02-27|1995-04-24|NONE|MAIL|nt, final packages. even, sp +6564|1975|64|2|9|16892.73|0.01|0.01|A|F|1995-02-01|1995-04-02|1995-02-02|TAKE BACK RETURN|SHIP| quickly quiet accounts cajole. unusual id +6564|472|60|3|35|48036.45|0.09|0.02|A|F|1995-03-07|1995-03-21|1995-03-23|TAKE BACK RETURN|REG AIR| even deposits believe +6564|357|14|4|14|17602.90|0.10|0.00|R|F|1995-05-14|1995-03-13|1995-05-28|TAKE BACK RETURN|AIR|. quickly unusual accounts boost across the +6564|1479|97|5|16|22087.52|0.07|0.01|A|F|1995-04-20|1995-03-23|1995-05-11|TAKE BACK RETURN|MAIL|ly across th +6565|1405|23|1|35|45724.00|0.07|0.04|N|O|1997-04-03|1997-04-11|1997-04-10|COLLECT COD|MAIL|rhorses boost carefully according to +6565|997|32|2|21|39857.79|0.09|0.07|N|O|1997-06-26|1997-04-13|1997-07-11|NONE|AIR| haggle quickly silent hockey players; car +6565|998|1|3|27|51272.73|0.07|0.04|N|O|1997-04-05|1997-03-28|1997-04-27|TAKE BACK RETURN|AIR|ct quickly fina +6565|20|71|4|16|14720.32|0.07|0.04|N|O|1997-03-07|1997-05-04|1997-03-25|COLLECT COD|AIR|ful platelets are among th +6565|757|54|5|14|23208.50|0.01|0.00|N|O|1997-05-22|1997-04-11|1997-06-14|DELIVER IN PERSON|SHIP| are fluffily. pending platel +6565|989|92|6|48|90719.04|0.01|0.03|N|O|1997-04-19|1997-05-23|1997-05-17|DELIVER IN PERSON|TRUCK|raids haggle. final packages doze carefu +6566|1676|59|1|23|36286.41|0.08|0.06|N|O|1995-09-02|1995-08-15|1995-09-13|DELIVER IN PERSON|TRUCK|l packages wake ir +6566|1121|30|2|40|40884.80|0.08|0.07|N|O|1995-08-14|1995-06-27|1995-09-09|DELIVER IN PERSON|AIR|. blithely bold the +6566|1523|44|3|6|8547.12|0.06|0.07|N|O|1995-08-22|1995-07-22|1995-09-15|TAKE BACK RETURN|REG AIR|ve slyly. caref +6566|1525|46|4|9|12838.68|0.09|0.05|N|O|1995-08-08|1995-08-19|1995-09-03|COLLECT COD|FOB|ndencies. blithely expre +6566|102|55|5|10|10021.00|0.06|0.00|N|O|1995-07-20|1995-07-17|1995-08-06|COLLECT COD|SHIP|out the bold foxes. quickly special package +6566|1083|89|6|48|47235.84|0.06|0.07|N|O|1995-08-27|1995-07-15|1995-09-15|DELIVER IN PERSON|MAIL|ckages hang blithely. da +6566|534|95|7|17|24387.01|0.10|0.01|N|F|1995-06-09|1995-08-13|1995-07-06|COLLECT COD|REG AIR|pending deposits boos +6567|891|92|1|2|3583.78|0.09|0.03|N|O|1997-09-24|1997-10-06|1997-09-25|NONE|TRUCK|ular dolphins. re +6567|1495|13|2|2|2792.98|0.03|0.06|N|O|1997-10-03|1997-08-31|1997-10-23|DELIVER IN PERSON|MAIL|uriously pending theodolites ca +6567|444|45|3|1|1344.44|0.09|0.07|N|O|1997-07-30|1997-08-22|1997-08-15|NONE|SHIP|nag carefully. final braids after the reg +6567|1530|51|4|13|18609.89|0.01|0.02|N|O|1997-11-03|1997-09-11|1997-12-03|DELIVER IN PERSON|SHIP|kages sleep slyly a +6567|427|86|5|20|26548.40|0.05|0.07|N|O|1997-10-09|1997-09-04|1997-10-15|DELIVER IN PERSON|RAIL| deposits affix +6592|1084|85|1|48|47283.84|0.03|0.06|A|F|1995-03-21|1995-02-07|1995-04-03|TAKE BACK RETURN|TRUCK| packages slee +6592|604|67|2|37|55670.20|0.09|0.05|A|F|1994-12-25|1995-01-21|1995-01-19|COLLECT COD|RAIL|quests integrate. bold accou +6592|1999|44|3|17|32316.83|0.03|0.08|A|F|1995-02-26|1995-02-28|1995-03-08|TAKE BACK RETURN|REG AIR| pinto beans about +6592|434|22|4|3|4003.29|0.01|0.03|A|F|1995-01-18|1995-02-23|1995-02-09|TAKE BACK RETURN|MAIL| furiously along th +6592|1245|46|5|41|46995.84|0.04|0.04|A|F|1995-01-27|1995-02-13|1995-02-06|COLLECT COD|AIR|tes. final platelets alongside of the e +6592|583|44|6|34|50441.72|0.02|0.08|A|F|1995-01-25|1995-02-09|1995-01-31|DELIVER IN PERSON|SHIP|ickly. bold theodolites run +6593|201|29|1|13|14315.60|0.10|0.00|N|O|1997-07-01|1997-07-05|1997-07-20|DELIVER IN PERSON|REG AIR|e carefully. +6593|1589|90|2|2|2981.16|0.10|0.08|N|O|1997-06-14|1997-06-25|1997-06-30|NONE|FOB|long the carefully final packages. quickly +6593|1259|97|3|25|29006.25|0.09|0.04|N|O|1997-06-19|1997-08-01|1997-06-26|NONE|RAIL|egular Tires +6593|1272|73|4|24|28158.48|0.03|0.02|N|O|1997-06-15|1997-06-24|1997-07-09|TAKE BACK RETURN|REG AIR|ar requests. blithely special +6593|1073|9|5|40|38962.80|0.08|0.03|N|O|1997-08-28|1997-06-29|1997-09-12|COLLECT COD|MAIL|the quickly careful pin +6593|848|49|6|10|17488.40|0.10|0.00|N|O|1997-08-26|1997-08-11|1997-09-05|NONE|REG AIR|packages affix. blith +6594|1499|39|1|9|12604.41|0.00|0.06|N|O|1996-10-12|1996-10-17|1996-10-25|COLLECT COD|REG AIR|. furiously daring p +6594|1842|29|2|6|10463.04|0.10|0.06|N|O|1996-10-13|1996-10-13|1996-10-29|DELIVER IN PERSON|RAIL|ly even pinto beans at the fluffily bo +6594|1218|30|3|37|41410.77|0.05|0.05|N|O|1996-12-02|1996-10-30|1996-12-05|DELIVER IN PERSON|RAIL|cies haggle fluf +6594|770|67|4|26|43440.02|0.00|0.03|N|O|1996-12-04|1996-11-10|1996-12-05|COLLECT COD|TRUCK|ress, unusua +6594|1320|21|5|26|31754.32|0.02|0.05|N|O|1996-08-27|1996-11-17|1996-09-02|DELIVER IN PERSON|FOB|deas. blithely ironic foxes according +6594|965|66|6|16|29855.36|0.10|0.08|N|O|1996-09-12|1996-09-22|1996-10-02|TAKE BACK RETURN|MAIL|s are carefully at the sheaves. final pack +6594|320|5|7|28|34168.96|0.01|0.02|N|O|1996-11-26|1996-11-02|1996-12-24|NONE|TRUCK|eposits thra +6595|1327|66|1|21|25794.72|0.05|0.01|A|F|1993-01-23|1992-11-05|1993-01-31|COLLECT COD|MAIL|riously regula +6596|709|6|1|8|12877.60|0.05|0.08|N|O|1995-07-25|1995-09-12|1995-08-13|COLLECT COD|RAIL|sly requests. furiously express requ +6596|108|87|2|3|3024.30|0.05|0.05|N|O|1995-08-26|1995-10-12|1995-09-10|DELIVER IN PERSON|MAIL|ids haggle blithely furiously +6596|1619|61|3|48|72989.28|0.02|0.08|N|O|1995-10-24|1995-10-01|1995-10-25|TAKE BACK RETURN|MAIL|s mold slyly near the accounts. +6596|69|45|4|9|8721.54|0.07|0.07|N|O|1995-09-27|1995-09-21|1995-10-09|COLLECT COD|FOB|carefully. regular requests cajole blithel +6596|1283|58|5|17|20132.76|0.00|0.01|N|O|1995-09-11|1995-09-26|1995-09-23|COLLECT COD|SHIP|sly silent packa +6596|1123|96|6|41|41988.92|0.02|0.07|N|O|1995-10-11|1995-10-01|1995-11-09|COLLECT COD|FOB|es detect carefully blithely even pack +6596|140|41|7|3|3120.42|0.06|0.01|N|O|1995-08-26|1995-09-01|1995-09-15|TAKE BACK RETURN|AIR|e. blithely s +6597|281|63|1|34|40163.52|0.09|0.03|N|O|1998-08-20|1998-09-24|1998-09-10|TAKE BACK RETURN|AIR|e slyly busi +6597|1579|60|2|43|63664.51|0.08|0.08|N|O|1998-09-10|1998-09-18|1998-10-04|NONE|TRUCK|ng dolphins sleep after the fluf +6598|1434|74|1|31|41398.33|0.07|0.03|R|F|1992-09-06|1992-06-21|1992-09-08|COLLECT COD|SHIP|e about the +6598|1579|20|2|17|25169.69|0.01|0.08|A|F|1992-05-20|1992-06-16|1992-06-13|NONE|RAIL|yly final courts. accoun +6599|1604|5|1|41|61729.60|0.00|0.07|N|O|1998-04-26|1998-06-16|1998-05-04|DELIVER IN PERSON|SHIP| the dolph +6599|1454|33|2|11|14909.95|0.02|0.02|N|O|1998-08-06|1998-07-13|1998-08-08|TAKE BACK RETURN|REG AIR|ending deposi +6599|1807|51|3|35|59808.00|0.03|0.01|N|O|1998-05-05|1998-05-26|1998-05-11|NONE|REG AIR|oxes boost. final packages cajole furiousl +6599|1989|78|4|37|69966.26|0.02|0.06|N|O|1998-05-01|1998-06-07|1998-05-03|COLLECT COD|TRUCK|e of the silent accounts impress alo +6599|1977|10|5|1|1878.97|0.03|0.05|N|O|1998-07-24|1998-06-24|1998-08-21|DELIVER IN PERSON|FOB| ironic requests believe furiously among +6624|1275|50|1|36|42345.72|0.01|0.05|N|O|1997-11-06|1997-10-16|1997-12-01|TAKE BACK RETURN|RAIL|ernes use silent, f +6625|1934|23|1|9|16523.37|0.08|0.05|R|F|1993-09-21|1993-10-03|1993-09-22|TAKE BACK RETURN|MAIL|g the bold packages +6626|671|65|1|4|6286.68|0.10|0.07|R|F|1994-06-11|1994-06-24|1994-06-29|COLLECT COD|RAIL| quickly final platelets. unusual, ironic T +6626|630|24|2|30|45918.90|0.08|0.05|A|F|1994-06-22|1994-06-14|1994-06-29|TAKE BACK RETURN|TRUCK|egular package +6626|1749|92|3|26|42919.24|0.06|0.08|A|F|1994-07-22|1994-07-13|1994-08-07|COLLECT COD|FOB|ccording to th +6626|1133|42|4|11|11375.43|0.05|0.00|R|F|1994-07-08|1994-06-27|1994-08-02|DELIVER IN PERSON|REG AIR|ounts nag furio +6627|1130|31|1|22|22684.86|0.09|0.07|N|O|1995-06-18|1995-04-27|1995-06-21|TAKE BACK RETURN|FOB|y final platelets. blithely regular reques +6627|1895|82|2|37|66484.93|0.09|0.06|R|F|1995-05-17|1995-05-23|1995-06-15|COLLECT COD|REG AIR|ic instruct +6628|677|40|1|49|77305.83|0.07|0.02|A|F|1994-06-19|1994-06-19|1994-07-14|NONE|FOB|cajole carefully deposits +6628|949|52|2|11|20349.34|0.09|0.06|A|F|1994-04-30|1994-07-01|1994-05-20|NONE|RAIL|egular deposits. furiously final deposits +6628|1691|74|3|7|11148.83|0.01|0.00|R|F|1994-08-18|1994-06-20|1994-09-12|COLLECT COD|AIR|express frays are slowly +6628|1359|74|4|27|34029.45|0.06|0.06|A|F|1994-07-14|1994-06-05|1994-07-15|DELIVER IN PERSON|AIR| packages cajole fluffily according to +6629|948|51|1|31|57317.14|0.03|0.07|R|F|1994-05-09|1994-03-23|1994-05-18|DELIVER IN PERSON|TRUCK| wake slyly alongside of t +6629|1373|88|2|1|1274.37|0.06|0.07|A|F|1994-03-29|1994-03-15|1994-04-22|TAKE BACK RETURN|REG AIR| alongside of the fina +6629|1825|12|3|8|13814.56|0.00|0.05|R|F|1994-05-09|1994-04-14|1994-06-01|TAKE BACK RETURN|RAIL| affix fluffily! slyly special excuses +6629|1862|6|4|14|24694.04|0.05|0.04|R|F|1994-04-26|1994-04-07|1994-05-20|NONE|AIR|ctions are furious +6629|1788|73|5|21|35485.38|0.02|0.00|R|F|1994-05-12|1994-03-24|1994-05-19|NONE|RAIL|is are above +6629|1771|14|6|38|63565.26|0.06|0.08|R|F|1994-03-03|1994-04-02|1994-03-18|NONE|SHIP|ideas are alongside of the quickly bold +6630|346|3|1|49|61070.66|0.00|0.03|N|O|1997-03-08|1997-02-02|1997-03-09|NONE|AIR|se blithely quickl +6630|923|24|2|50|91196.00|0.06|0.04|N|O|1997-03-03|1997-01-19|1997-03-12|DELIVER IN PERSON|REG AIR|egular dependencies. quickly express courts +6630|1512|13|3|23|32510.73|0.08|0.01|N|O|1997-02-15|1997-01-26|1997-02-24|TAKE BACK RETURN|REG AIR|ckly regular foxes prom +6630|729|30|4|18|29334.96|0.03|0.02|N|O|1997-01-23|1997-02-13|1997-02-12|TAKE BACK RETURN|RAIL| asymptotes around the quickly specia +6630|1579|60|5|29|42936.53|0.03|0.01|N|O|1996-12-16|1997-02-17|1997-01-11|DELIVER IN PERSON|TRUCK|y special dependencie +6630|29|55|6|42|39018.84|0.07|0.05|N|O|1997-02-06|1997-02-14|1997-02-13|TAKE BACK RETURN|SHIP|deposits. bold +6630|1397|36|7|26|33758.14|0.08|0.07|N|O|1997-03-18|1997-01-04|1997-03-24|DELIVER IN PERSON|SHIP|ly regular packages. furiously +6631|772|73|1|47|78620.19|0.01|0.02|N|O|1995-11-19|1995-10-23|1995-12-02|TAKE BACK RETURN|RAIL| final requests. q +6631|533|24|2|5|7167.65|0.09|0.08|N|O|1995-12-14|1995-11-12|1995-12-27|NONE|AIR|es about the accounts sle +6631|644|45|3|18|27803.52|0.06|0.07|N|O|1995-11-10|1995-11-06|1995-11-29|NONE|AIR|accounts sleep. quickly pending requests +6631|87|38|4|28|27638.24|0.03|0.08|N|O|1995-09-18|1995-11-10|1995-10-01|COLLECT COD|AIR|ss the ruthlessly unusual notornis c +6631|1607|49|5|49|73921.40|0.07|0.04|N|O|1995-11-03|1995-11-30|1995-11-16|NONE|TRUCK|ess, ironic packages nag furiously a +6656|1999|100|1|29|55128.71|0.02|0.00|R|F|1994-08-17|1994-07-10|1994-08-23|TAKE BACK RETURN|MAIL|fully before the express accounts. even p +6656|1095|66|2|2|1992.18|0.09|0.06|R|F|1994-08-07|1994-08-09|1994-08-31|DELIVER IN PERSON|SHIP|iously final de +6656|901|36|3|3|5405.70|0.08|0.06|R|F|1994-05-20|1994-07-19|1994-06-07|TAKE BACK RETURN|REG AIR|heodolites. carefully special foxes hag +6656|1834|78|4|26|45131.58|0.10|0.04|A|F|1994-06-18|1994-08-06|1994-07-10|TAKE BACK RETURN|TRUCK| asymptotes. slyly +6656|89|90|5|38|37585.04|0.01|0.00|A|F|1994-06-28|1994-06-22|1994-07-08|TAKE BACK RETURN|RAIL|o the regular accounts. slyly regular acco +6656|1571|12|6|32|47122.24|0.05|0.08|A|F|1994-05-23|1994-07-24|1994-06-16|TAKE BACK RETURN|AIR|ietly even requests. quickly final t +6656|1514|55|7|29|41049.79|0.02|0.00|A|F|1994-07-13|1994-08-01|1994-08-09|COLLECT COD|TRUCK| the regular deposits. carefully regular +6657|1115|52|1|8|8128.88|0.00|0.02|R|F|1992-03-14|1992-02-22|1992-04-10|DELIVER IN PERSON|SHIP| against the requests. carefully sil +6657|201|83|2|29|31934.80|0.04|0.08|R|F|1992-03-07|1992-02-16|1992-03-13|COLLECT COD|TRUCK|y ironic requests. carefully ironic pint +6658|1369|46|1|34|43192.24|0.02|0.01|N|O|1996-10-13|1996-08-05|1996-11-03|COLLECT COD|SHIP| even, regular foxes affix quickly a +6659|1830|17|1|26|45027.58|0.04|0.03|N|O|1998-01-18|1998-03-12|1998-01-23|DELIVER IN PERSON|SHIP|requests are +6659|587|48|2|20|29751.60|0.07|0.07|N|O|1998-03-17|1998-03-27|1998-04-03|TAKE BACK RETURN|TRUCK|l accounts; carefully final packages use +6659|161|14|3|4|4244.64|0.01|0.00|N|O|1998-04-30|1998-04-12|1998-05-27|COLLECT COD|REG AIR| regular pat +6660|1644|68|1|25|38641.00|0.03|0.00|N|O|1998-07-16|1998-07-11|1998-07-26|DELIVER IN PERSON|SHIP|. slyly bold deposits sleep across th +6660|284|12|2|43|50924.04|0.07|0.02|N|O|1998-05-26|1998-07-27|1998-06-20|DELIVER IN PERSON|MAIL|equests. furiously final requests +6660|303|4|3|1|1203.30|0.09|0.06|N|O|1998-07-07|1998-07-29|1998-07-19|TAKE BACK RETURN|MAIL| instructions haggle +6660|1024|25|4|8|7400.16|0.10|0.04|N|O|1998-08-29|1998-07-03|1998-09-03|NONE|MAIL|s affix slyly blithely regul +6660|76|27|5|33|32210.31|0.01|0.01|N|O|1998-06-28|1998-08-02|1998-07-17|DELIVER IN PERSON|FOB|ccounts are +6661|1273|74|1|42|49319.34|0.06|0.01|R|F|1993-07-06|1993-06-17|1993-07-31|TAKE BACK RETURN|RAIL|ly unusual theodolites. fluffily r +6661|1025|61|2|15|13890.30|0.02|0.01|A|F|1993-07-06|1993-05-20|1993-07-30|DELIVER IN PERSON|AIR|e slyly slyly ironic deposits. carefully +6662|582|83|1|27|40029.66|0.08|0.04|N|O|1996-02-05|1996-02-13|1996-03-06|NONE|SHIP| foxes wake. sly accou +6662|914|49|2|19|34483.29|0.10|0.07|N|O|1996-02-21|1995-12-25|1996-03-15|COLLECT COD|RAIL|es. blithely regula +6662|758|91|3|8|13270.00|0.04|0.08|N|O|1995-12-14|1996-02-04|1995-12-28|NONE|REG AIR|uick ideas. ex +6662|452|40|4|39|52745.55|0.03|0.01|N|O|1996-02-26|1996-01-21|1996-03-01|NONE|RAIL|sly regular packages wake fluffily blit +6663|885|19|1|35|62505.80|0.07|0.00|A|F|1995-05-25|1995-04-17|1995-06-13|NONE|RAIL|uriously. car +6663|1839|26|2|11|19149.13|0.07|0.04|N|F|1995-05-23|1995-04-12|1995-06-19|COLLECT COD|AIR| blithely sile +6663|833|67|3|17|29475.11|0.01|0.04|A|F|1995-02-07|1995-03-13|1995-03-02|DELIVER IN PERSON|SHIP|oss the silent +6663|1277|15|4|20|23565.40|0.09|0.07|R|F|1995-02-22|1995-04-28|1995-03-06|TAKE BACK RETURN|SHIP|ess orbits +6688|1378|93|1|20|25587.40|0.00|0.06|N|O|1997-05-08|1997-04-15|1997-05-15|DELIVER IN PERSON|REG AIR|ltipliers use furiously about the caref +6688|48|24|2|38|36025.52|0.10|0.06|N|O|1997-06-19|1997-04-24|1997-07-03|TAKE BACK RETURN|AIR|ing dependencies wake slyly +6688|1611|12|3|16|24201.76|0.00|0.06|N|O|1997-03-09|1997-03-26|1997-03-19|COLLECT COD|TRUCK|into beans. quickly express +6688|1041|42|4|42|39565.68|0.09|0.01|N|O|1997-05-25|1997-05-01|1997-06-17|TAKE BACK RETURN|TRUCK|uickly across t +6689|219|74|1|4|4476.84|0.05|0.07|N|O|1997-08-08|1997-08-03|1997-09-01|COLLECT COD|FOB|counts boost +6689|1666|49|2|26|40759.16|0.04|0.00|N|O|1997-09-22|1997-08-18|1997-10-12|TAKE BACK RETURN|SHIP|g excuses. bold packages sublat +6689|510|41|3|13|18336.63|0.00|0.04|N|O|1997-08-16|1997-07-03|1997-09-07|NONE|AIR|ideas haggle +6690|785|82|1|34|57316.52|0.00|0.00|N|O|1996-09-15|1996-09-18|1996-10-09|NONE|SHIP|ngside of the quickly regular foxe +6690|778|75|2|3|5036.31|0.08|0.07|N|O|1996-06-30|1996-09-05|1996-07-03|COLLECT COD|REG AIR|ithe foxes use slyly accord +6690|133|86|3|23|23761.99|0.01|0.04|N|O|1996-06-29|1996-09-01|1996-07-12|COLLECT COD|RAIL|erve alongside of the quickl +6690|1100|1|4|9|9009.90|0.05|0.05|N|O|1996-09-24|1996-08-06|1996-09-30|NONE|FOB|. even dependencies at the slyly ev +6690|1374|13|5|30|38261.10|0.06|0.00|N|O|1996-08-10|1996-08-25|1996-08-19|COLLECT COD|AIR|ckages run. fur +6690|529|90|6|43|61469.36|0.03|0.06|N|O|1996-10-06|1996-07-30|1996-11-01|COLLECT COD|AIR|requests. blithely even packages do +6691|254|82|1|18|20776.50|0.07|0.02|R|F|1994-09-08|1994-07-30|1994-10-07|TAKE BACK RETURN|MAIL| deposits. ironic foxes +6691|1060|66|2|33|31714.98|0.10|0.00|A|F|1994-08-12|1994-08-21|1994-09-04|TAKE BACK RETURN|REG AIR|deposits. deposits are carefully. ca +6691|222|4|3|3|3366.66|0.03|0.00|A|F|1994-06-26|1994-08-12|1994-07-03|DELIVER IN PERSON|TRUCK| bold courts haggle furiously abo +6691|1453|54|4|27|36570.15|0.06|0.02|R|F|1994-06-17|1994-08-12|1994-07-13|DELIVER IN PERSON|TRUCK|, pending theodolites sleep fluffily b +6691|409|39|5|19|24878.60|0.04|0.03|R|F|1994-07-12|1994-08-30|1994-07-28|COLLECT COD|TRUCK| regular packa +6691|931|66|6|42|76941.06|0.04|0.05|R|F|1994-09-21|1994-08-06|1994-10-12|TAKE BACK RETURN|MAIL|eas are. sometimes re +6691|574|5|7|41|60457.37|0.00|0.05|A|F|1994-07-13|1994-07-24|1994-08-12|NONE|SHIP|ckly past the regu +6692|269|97|1|40|46770.40|0.04|0.08|N|O|1996-09-26|1996-12-02|1996-10-07|DELIVER IN PERSON|RAIL|hely final patter +6692|422|52|2|39|51574.38|0.07|0.00|N|O|1996-12-31|1996-11-20|1997-01-08|NONE|AIR|ven asymptotes boo +6692|1402|20|3|36|46922.40|0.06|0.05|N|O|1996-11-08|1996-11-28|1996-11-20|TAKE BACK RETURN|SHIP|leep slyly final requests. furiously specia +6692|48|49|4|25|23701.00|0.00|0.04|N|O|1996-10-08|1996-11-12|1996-10-16|TAKE BACK RETURN|REG AIR|pinto beans u +6692|1224|99|5|29|32631.38|0.08|0.01|N|O|1996-10-10|1996-11-12|1996-10-24|DELIVER IN PERSON|MAIL|ar accounts +6692|764|61|6|27|44948.52|0.05|0.07|N|O|1996-10-29|1996-11-25|1996-11-10|NONE|RAIL|packages. bold, stealthy instructions +6692|1397|12|7|31|40250.09|0.10|0.06|N|O|1996-10-06|1996-10-31|1996-10-17|COLLECT COD|FOB|out the fluffily final dep +6693|674|37|1|43|67710.81|0.09|0.04|R|F|1992-06-10|1992-07-20|1992-06-24|COLLECT COD|SHIP|tes. doggedly bold f +6693|137|90|2|17|17631.21|0.02|0.05|A|F|1992-07-27|1992-08-04|1992-08-16|NONE|RAIL|egrate sly +6693|1822|52|3|45|77571.90|0.04|0.04|R|F|1992-08-27|1992-07-16|1992-09-10|COLLECT COD|SHIP|rve deposits. fl +6693|929|98|4|13|23788.96|0.03|0.08|R|F|1992-08-03|1992-08-05|1992-08-24|NONE|SHIP|lar deposits +6693|1672|55|5|42|66094.14|0.01|0.01|A|F|1992-06-02|1992-08-01|1992-06-10|NONE|RAIL| above the b +6693|181|82|6|7|7568.26|0.08|0.04|R|F|1992-07-05|1992-07-16|1992-07-26|COLLECT COD|MAIL|ges. regular, ironic +6694|1248|49|1|28|32178.72|0.08|0.05|A|F|1992-12-07|1992-11-14|1992-12-20|DELIVER IN PERSON|RAIL|ckly ironic requests-- stealthily reg +6694|181|60|2|7|7568.26|0.06|0.03|A|F|1992-11-15|1992-11-20|1992-11-19|COLLECT COD|RAIL|s the regular requests. fluffily +6694|326|55|3|50|61316.00|0.10|0.01|R|F|1992-11-14|1992-11-21|1992-11-16|COLLECT COD|SHIP|hely ironic dolphins? blithely express depo +6695|409|68|1|50|65470.00|0.10|0.07|R|F|1992-08-16|1992-08-16|1992-08-17|NONE|AIR|ly pending excuses? even, expres +6695|1754|39|2|10|16557.50|0.02|0.01|A|F|1992-09-05|1992-09-15|1992-09-12|DELIVER IN PERSON|FOB| requests. regular +6695|1307|22|3|1|1208.30|0.06|0.03|A|F|1992-07-19|1992-09-20|1992-08-18|COLLECT COD|SHIP|, pending packages. blithely ironi +6695|1154|63|4|37|39040.55|0.10|0.00|R|F|1992-07-13|1992-08-31|1992-07-22|NONE|RAIL|ffix across the express theodolites. re +6695|1194|67|5|50|54759.50|0.02|0.00|R|F|1992-07-13|1992-09-17|1992-08-11|NONE|REG AIR|pecial requests are. pending, ir +6695|807|41|6|48|81974.40|0.08|0.04|A|F|1992-08-08|1992-08-19|1992-09-03|COLLECT COD|AIR|lently ironic pinto beans. +6695|378|79|7|43|54969.91|0.00|0.05|R|F|1992-08-24|1992-07-29|1992-08-26|DELIVER IN PERSON|SHIP|ully slyly ir +6720|593|54|1|25|37339.75|0.09|0.07|A|F|1993-09-20|1993-10-26|1993-10-18|TAKE BACK RETURN|SHIP|pinto beans. blithel +6720|698|61|2|10|15986.90|0.03|0.02|A|F|1993-09-12|1993-11-04|1993-10-10|TAKE BACK RETURN|TRUCK|ly bold platelets nod final, iro +6720|1045|81|3|14|13244.56|0.03|0.03|R|F|1993-10-08|1993-11-07|1993-10-11|NONE|RAIL| according to the quickly pendin +6720|1879|80|4|46|81920.02|0.05|0.02|R|F|1993-10-11|1993-11-21|1993-10-20|NONE|AIR|es are carefully. closely bold re +6720|404|34|5|14|18261.60|0.07|0.07|A|F|1993-11-15|1993-11-28|1993-11-26|DELIVER IN PERSON|SHIP|ts around the slyly sp +6720|1463|3|6|37|50485.02|0.01|0.02|A|F|1993-12-08|1993-11-13|1993-12-14|DELIVER IN PERSON|TRUCK|p slyly acro +6720|777|42|7|9|15099.93|0.03|0.03|R|F|1993-10-16|1993-11-24|1993-10-26|NONE|REG AIR| deposits wake furiously +6721|109|10|1|20|20182.00|0.07|0.03|N|O|1996-12-20|1997-02-26|1997-01-08|DELIVER IN PERSON|MAIL| carefully express accounts. regul +6721|221|76|2|31|34757.82|0.07|0.08|N|O|1997-03-15|1997-01-14|1997-04-12|COLLECT COD|AIR| are bold asymptotes. eve +6721|1354|55|3|35|43937.25|0.02|0.00|N|O|1996-12-09|1997-02-03|1996-12-23|TAKE BACK RETURN|AIR|y ironic ideas cajole f +6721|200|53|4|38|41807.60|0.02|0.08|N|O|1997-03-27|1997-02-12|1997-04-26|NONE|SHIP| regular deposits integrate slyl +6722|1544|25|1|39|56376.06|0.07|0.08|N|O|1996-09-01|1996-08-11|1996-09-22|NONE|MAIL|kly slow packages. +6722|1243|81|2|27|30894.48|0.07|0.02|N|O|1996-09-10|1996-09-09|1996-09-27|NONE|RAIL|ideas wake quickly express ins +6722|380|65|3|49|62738.62|0.08|0.05|N|O|1996-09-23|1996-08-03|1996-10-19|NONE|AIR|ckages wake alongside of the packages. fin +6722|297|52|4|22|26340.38|0.08|0.08|N|O|1996-07-18|1996-08-23|1996-08-03|DELIVER IN PERSON|TRUCK|un quickly. blithely express d +6722|921|90|5|4|7287.68|0.03|0.06|N|O|1996-07-26|1996-09-20|1996-08-10|COLLECT COD|TRUCK|nding theodolites are slyly special id +6722|732|29|6|42|68574.66|0.07|0.03|N|O|1996-07-19|1996-08-17|1996-07-26|TAKE BACK RETURN|MAIL|he furiously even packages. fluffily pend +6722|1625|67|7|43|65644.66|0.08|0.01|N|O|1996-08-07|1996-09-17|1996-08-17|DELIVER IN PERSON|SHIP|l deposits sleep fluffily slyly +6723|995|64|1|47|89111.53|0.04|0.00|N|O|1998-07-19|1998-07-27|1998-07-25|COLLECT COD|FOB|es wake furiously regular, ironic requests +6723|1103|76|2|39|39159.90|0.03|0.06|N|O|1998-08-22|1998-07-11|1998-09-07|TAKE BACK RETURN|SHIP| carefully pending pe +6723|1435|36|3|46|61475.78|0.08|0.03|N|O|1998-09-16|1998-07-23|1998-10-14|DELIVER IN PERSON|RAIL|n ideas. ca +6723|599|30|4|1|1499.59|0.09|0.01|N|O|1998-09-25|1998-07-26|1998-10-02|NONE|RAIL|r the furiously unusual ideas cajole +6723|1629|12|5|49|75000.38|0.06|0.07|N|O|1998-09-30|1998-07-06|1998-10-10|COLLECT COD|SHIP|s. regular, busy accounts nag fluffily. fin +6724|1028|34|1|46|42734.92|0.08|0.04|N|O|1995-10-31|1995-12-24|1995-11-30|NONE|MAIL|gly above the asymptotes. blithely pe +6724|174|75|2|46|49411.82|0.07|0.03|N|O|1995-11-08|1996-01-05|1995-11-18|DELIVER IN PERSON|TRUCK| instructions. slyly regular plat +6724|570|31|3|17|24999.69|0.07|0.03|N|O|1995-11-10|1995-12-23|1995-11-11|DELIVER IN PERSON|AIR|ully regular acco +6725|727|28|1|42|68364.24|0.03|0.01|N|O|1996-01-02|1995-11-16|1996-01-14|TAKE BACK RETURN|MAIL| furiously pending accounts. +6725|807|7|2|20|34156.00|0.10|0.03|N|O|1996-01-31|1996-01-07|1996-02-04|NONE|SHIP|g after the eve +6725|606|69|3|9|13559.40|0.05|0.07|N|O|1996-01-17|1996-01-04|1996-01-25|DELIVER IN PERSON|REG AIR|ly even theodolites. final, bold +6725|1506|27|4|4|5630.00|0.02|0.07|N|O|1996-01-22|1995-12-16|1996-02-03|TAKE BACK RETURN|RAIL|egular deposits. slyl +6726|1588|69|1|23|34260.34|0.08|0.01|A|F|1993-12-08|1994-01-23|1993-12-31|TAKE BACK RETURN|MAIL|capades. idly ironic packages haggle about +6726|1818|19|2|21|36116.01|0.05|0.05|R|F|1993-12-31|1993-12-31|1994-01-22|TAKE BACK RETURN|RAIL|fluffily f +6726|424|83|3|39|51652.38|0.03|0.05|R|F|1993-12-17|1994-02-01|1994-01-14|DELIVER IN PERSON|REG AIR|s. furiously iro +6726|665|28|4|25|39141.50|0.07|0.04|R|F|1994-03-11|1994-01-11|1994-03-27|NONE|MAIL| quickly against the blithely speci +6726|243|44|5|20|22864.80|0.05|0.02|A|F|1994-02-26|1994-01-29|1994-03-16|COLLECT COD|SHIP|y final ideas among t +6726|531|92|6|49|70144.97|0.03|0.01|R|F|1994-02-01|1994-02-06|1994-02-19|TAKE BACK RETURN|FOB| pending packages boost. even pains acco +6727|108|9|1|28|28226.80|0.09|0.03|R|F|1994-11-03|1994-11-15|1994-12-01|DELIVER IN PERSON|AIR|hely ironic excuses wake fluffi +6727|652|53|2|39|60553.35|0.00|0.02|R|F|1994-11-02|1994-11-15|1994-11-23|COLLECT COD|TRUCK|ckages. furiou +6727|512|3|3|16|22600.16|0.01|0.08|R|F|1994-10-15|1994-11-25|1994-10-23|TAKE BACK RETURN|REG AIR|nts among t +6727|1664|6|4|18|28181.88|0.01|0.00|R|F|1994-10-07|1994-11-16|1994-10-12|COLLECT COD|REG AIR|ully ironic instructions; express package +6727|211|12|5|19|21112.99|0.07|0.05|A|F|1994-12-07|1994-10-14|1994-12-18|NONE|AIR|sly. pains f +6727|177|4|6|19|20466.23|0.05|0.02|A|F|1994-11-16|1994-11-07|1994-12-01|DELIVER IN PERSON|MAIL|e unusual deposits. furiously expr +6727|867|67|7|46|81321.56|0.04|0.00|R|F|1994-09-05|1994-11-02|1994-09-30|TAKE BACK RETURN|AIR|ily regular +6752|1975|8|1|28|52555.16|0.00|0.00|N|O|1996-12-25|1996-12-01|1996-12-27|COLLECT COD|AIR| excuses sleep furiously ac +6753|1504|5|1|37|52003.50|0.00|0.05|A|F|1993-12-22|1993-12-23|1993-12-27|TAKE BACK RETURN|REG AIR|dolphins sleep. carefully e +6753|1131|68|2|17|17546.21|0.00|0.03|R|F|1993-12-19|1993-11-05|1993-12-23|DELIVER IN PERSON|FOB|es across the theodolit +6753|381|38|3|19|24346.22|0.00|0.00|A|F|1993-10-22|1993-11-09|1993-10-23|COLLECT COD|SHIP|t packages sleep closely accor +6753|1210|48|4|29|32225.09|0.08|0.02|A|F|1994-01-05|1993-11-07|1994-01-06|DELIVER IN PERSON|MAIL| packages across +6753|1080|81|5|8|7848.64|0.03|0.01|R|F|1993-12-22|1993-12-03|1993-12-23|TAKE BACK RETURN|REG AIR|the quickly special packa +6754|1240|41|1|47|53638.28|0.02|0.02|N|O|1995-12-05|1995-10-08|1996-01-02|TAKE BACK RETURN|TRUCK|egular deposits haggle along the ev +6754|225|53|2|47|52885.34|0.00|0.08|N|O|1995-09-27|1995-10-09|1995-10-13|TAKE BACK RETURN|TRUCK|about the f +6755|1546|27|1|19|27503.26|0.03|0.03|N|O|1995-06-25|1995-07-27|1995-06-26|COLLECT COD|AIR| carefully regular ideas are carefully reg +6756|518|9|1|44|62414.44|0.08|0.07|A|F|1993-12-01|1993-11-23|1993-12-19|NONE|SHIP|press waters use quickl +6756|1422|40|2|41|54260.22|0.03|0.05|A|F|1993-11-26|1993-09-30|1993-12-01|DELIVER IN PERSON|MAIL|ts. final pinto beans around the sly +6756|1661|44|3|37|57818.42|0.08|0.07|A|F|1993-10-24|1993-11-20|1993-11-20|TAKE BACK RETURN|REG AIR|latelets. fluffily express depe +6756|1435|36|4|10|13364.30|0.03|0.04|R|F|1993-10-19|1993-10-27|1993-11-03|DELIVER IN PERSON|RAIL|sleep slyly regular reques +6756|529|20|5|39|55751.28|0.10|0.05|R|F|1993-09-08|1993-11-21|1993-09-15|TAKE BACK RETURN|RAIL|of the fluffily even somas poach +6757|699|100|1|13|20795.97|0.07|0.00|A|F|1992-02-27|1992-04-05|1992-03-21|NONE|REG AIR|ld, regular deposits are regularl +6757|1441|59|2|49|65779.56|0.00|0.04|A|F|1992-04-10|1992-03-22|1992-04-15|DELIVER IN PERSON|AIR|ckages. special, pending +6757|150|51|3|47|49357.05|0.01|0.03|A|F|1992-03-31|1992-04-19|1992-04-30|DELIVER IN PERSON|AIR| among the p +6757|1083|19|4|34|33458.72|0.05|0.07|R|F|1992-05-04|1992-04-15|1992-05-30|NONE|SHIP|final requests are flu +6757|1763|90|5|37|61596.12|0.01|0.04|A|F|1992-03-29|1992-03-06|1992-04-25|DELIVER IN PERSON|FOB|ounts! furiously pending ac +6757|438|39|6|15|20076.45|0.10|0.05|R|F|1992-03-23|1992-05-02|1992-03-26|TAKE BACK RETURN|REG AIR|xcuses-- unusual acco +6757|1279|17|7|18|21244.86|0.00|0.00|A|F|1992-02-13|1992-04-04|1992-03-12|NONE|RAIL|ously regular accounts +6758|1000|35|1|8|7208.00|0.00|0.03|A|F|1994-08-31|1994-07-27|1994-09-27|DELIVER IN PERSON|RAIL|posits. bli +6759|726|27|1|45|73202.40|0.03|0.07|N|O|1996-07-01|1996-09-22|1996-07-15|DELIVER IN PERSON|AIR|al pinto beans cajole slyly carefully pen +6759|88|39|2|43|42487.44|0.05|0.06|N|O|1996-10-25|1996-08-25|1996-11-16|DELIVER IN PERSON|AIR|g accounts dazzle after the carefully idle +6759|1310|25|3|3|3633.93|0.07|0.04|N|O|1996-10-28|1996-08-08|1996-11-16|COLLECT COD|TRUCK|fluffily pending foxes. slyly final req +6784|132|33|1|7|7224.91|0.01|0.07|N|O|1997-07-12|1997-08-11|1997-08-11|DELIVER IN PERSON|SHIP|ts. pending, unusual requests sleep about +6785|1369|84|1|9|11433.24|0.05|0.07|A|F|1992-05-18|1992-07-19|1992-05-22|DELIVER IN PERSON|AIR|y bold account +6785|1497|37|2|25|34962.25|0.00|0.02|A|F|1992-08-27|1992-08-01|1992-09-05|DELIVER IN PERSON|MAIL| packages cajole +6785|1025|96|3|44|40744.88|0.05|0.01|R|F|1992-05-27|1992-08-01|1992-06-21|COLLECT COD|RAIL|quickly slyly express package +6786|1256|31|1|39|45132.75|0.10|0.01|N|O|1997-10-18|1997-10-26|1997-11-17|TAKE BACK RETURN|SHIP|ronic requests use caref +6786|1011|47|2|28|25536.28|0.05|0.07|N|O|1997-09-30|1997-10-12|1997-10-23|DELIVER IN PERSON|REG AIR|ously after the slyly regular sautern +6786|767|68|3|21|35022.96|0.10|0.08|N|O|1997-10-26|1997-11-06|1997-10-31|COLLECT COD|REG AIR|xes snooze at the silent depths +6786|357|14|4|22|27661.70|0.10|0.07|N|O|1997-10-26|1997-10-21|1997-10-30|COLLECT COD|FOB|ly unusual accou +6786|677|78|5|20|31553.40|0.06|0.01|N|O|1997-11-23|1997-11-01|1997-12-16|NONE|RAIL|sual packages los +6786|1645|28|6|35|54132.40|0.03|0.02|N|O|1997-08-20|1997-10-02|1997-09-19|TAKE BACK RETURN|FOB|ins. furiously express pinto bea +6786|1569|70|7|21|30881.76|0.03|0.06|N|O|1997-08-22|1997-10-13|1997-08-23|DELIVER IN PERSON|RAIL|r theodolites; even deposits ca +6787|1752|37|1|40|66150.00|0.00|0.06|N|O|1995-08-02|1995-07-21|1995-08-18|DELIVER IN PERSON|SHIP| alongside of the foxes. ideas slee +6788|948|49|1|23|42525.62|0.05|0.04|N|O|1995-08-26|1995-10-08|1995-08-28|NONE|SHIP|pecial package +6788|518|79|2|4|5674.04|0.06|0.01|N|O|1995-08-06|1995-09-17|1995-08-29|COLLECT COD|TRUCK|nding deposits; quickly regular fo +6788|1588|89|3|8|11916.64|0.01|0.08|N|O|1995-11-18|1995-09-12|1995-11-23|COLLECT COD|MAIL|aggle blithely pending gifts. blithely +6788|475|34|4|28|38513.16|0.00|0.01|N|O|1995-11-12|1995-09-21|1995-12-04|NONE|MAIL|e to sleep furiously fluffily even +6788|1021|57|5|39|35958.78|0.04|0.03|N|O|1995-11-19|1995-10-16|1995-12-01|TAKE BACK RETURN|FOB|ep excuses; final, unusual th +6789|341|98|1|2|2482.68|0.08|0.06|N|O|1998-06-11|1998-06-27|1998-07-01|COLLECT COD|AIR|inal, quiet accounts. +6789|1975|76|2|19|35662.43|0.03|0.03|N|O|1998-07-11|1998-05-28|1998-08-09|TAKE BACK RETURN|REG AIR|ses are quickly +6789|1503|4|3|5|7022.50|0.10|0.07|N|O|1998-05-02|1998-06-08|1998-05-03|COLLECT COD|RAIL|ully accord +6789|1345|22|4|26|32404.84|0.05|0.05|N|O|1998-05-20|1998-07-03|1998-05-27|NONE|RAIL|bold accounts. quickly spec +6789|1446|64|5|50|67372.00|0.10|0.04|N|O|1998-07-20|1998-06-23|1998-08-18|DELIVER IN PERSON|REG AIR| sleep. silent packages are-- +6789|1133|6|6|8|8273.04|0.01|0.05|N|O|1998-06-05|1998-07-04|1998-06-23|TAKE BACK RETURN|TRUCK|ternes use above the even a +6789|1211|12|7|11|12234.31|0.06|0.04|N|O|1998-08-08|1998-06-20|1998-09-05|COLLECT COD|REG AIR| pending accounts. ironic foxe +6790|1182|83|1|28|30329.04|0.01|0.00|R|F|1995-06-01|1995-07-06|1995-06-12|NONE|FOB|r the quickly regular in +6791|431|90|1|3|3994.29|0.07|0.06|A|F|1995-04-03|1995-04-22|1995-04-18|COLLECT COD|TRUCK|ven requests are slyly. blithe +6791|1059|95|2|19|18240.95|0.08|0.00|A|F|1995-03-02|1995-03-30|1995-03-26|NONE|FOB|r, regular packages. even depos +6791|1452|53|3|37|50077.65|0.02|0.02|A|F|1995-03-18|1995-03-04|1995-03-22|TAKE BACK RETURN|TRUCK|p slyly qui +6791|1700|24|4|31|49652.70|0.04|0.08|R|F|1995-02-16|1995-04-01|1995-03-08|DELIVER IN PERSON|REG AIR|ial accounts +6816|218|19|1|20|22364.20|0.01|0.02|N|O|1998-05-21|1998-03-19|1998-06-13|DELIVER IN PERSON|AIR|y regular pinto beans +6816|442|72|2|16|21479.04|0.08|0.01|N|O|1998-03-20|1998-04-30|1998-03-27|NONE|REG AIR|osits promise. idly ironic de +6817|1735|62|1|50|81836.50|0.08|0.01|N|O|1997-03-05|1997-01-25|1997-03-22|TAKE BACK RETURN|MAIL|g the regular theodol +6817|1917|18|2|42|76394.22|0.09|0.04|N|O|1997-01-06|1997-02-27|1997-02-05|TAKE BACK RETURN|REG AIR|g, regular dependencies. s +6817|1620|3|3|48|73037.76|0.06|0.05|N|O|1996-12-24|1997-01-31|1997-01-14|DELIVER IN PERSON|FOB|en foxes. slyly sil +6817|1127|36|4|36|37012.32|0.03|0.05|N|O|1996-12-18|1997-02-07|1997-01-04|DELIVER IN PERSON|RAIL|es haggle furiously along the bol +6817|222|23|5|33|37033.26|0.06|0.00|N|O|1997-03-25|1997-01-16|1997-04-23|COLLECT COD|RAIL|into beans across the +6818|1439|57|1|39|52276.77|0.06|0.01|N|O|1996-04-25|1996-04-09|1996-05-02|NONE|RAIL|ic asymptotes h +6818|89|90|2|32|31650.56|0.08|0.04|N|O|1996-03-03|1996-04-12|1996-03-25|DELIVER IN PERSON|FOB|excuses. requests kindle sl +6818|1615|57|3|33|50048.13|0.07|0.06|N|O|1996-04-14|1996-04-15|1996-04-27|DELIVER IN PERSON|SHIP|use carefully pending i +6818|763|28|4|4|6655.04|0.00|0.05|N|O|1996-05-15|1996-05-13|1996-05-26|DELIVER IN PERSON|MAIL|yly carefully even foxes. +6818|1884|71|5|10|17858.80|0.05|0.03|N|O|1996-05-29|1996-04-13|1996-06-12|TAKE BACK RETURN|TRUCK| express packages +6818|419|49|6|7|9235.87|0.00|0.05|N|O|1996-03-10|1996-05-07|1996-04-03|TAKE BACK RETURN|REG AIR|wake furiously regular +6819|433|63|1|18|24001.74|0.03|0.07|N|O|1998-05-19|1998-04-08|1998-06-10|DELIVER IN PERSON|REG AIR|accounts. ironic deposits hagg +6819|1204|5|2|4|4420.80|0.03|0.04|N|O|1998-03-17|1998-05-26|1998-03-18|NONE|TRUCK|gular requests. even foxes sleep +6819|701|66|3|49|78483.30|0.05|0.05|N|O|1998-03-24|1998-05-06|1998-03-30|DELIVER IN PERSON|REG AIR|p after the r +6819|179|6|4|20|21583.40|0.07|0.08|N|O|1998-04-30|1998-05-24|1998-05-12|COLLECT COD|AIR|nal, express dolphins kindle carefully +6819|1387|2|5|46|59265.48|0.06|0.00|N|O|1998-06-29|1998-05-08|1998-07-23|NONE|SHIP|heodolites are furious +6819|664|65|6|29|45375.14|0.07|0.07|N|O|1998-03-08|1998-04-15|1998-03-10|NONE|REG AIR|st the silent instructions. pinto +6819|927|30|7|3|5483.76|0.03|0.02|N|O|1998-05-26|1998-05-17|1998-05-28|TAKE BACK RETURN|RAIL| sleep. final, regular excu +6820|867|34|1|32|56571.52|0.05|0.03|N|O|1995-09-05|1995-08-05|1995-09-07|TAKE BACK RETURN|MAIL| accounts are blithely +6820|1574|75|2|43|63449.51|0.08|0.00|N|O|1995-10-10|1995-08-07|1995-10-12|COLLECT COD|AIR|hely. regular, bold pinto beans x-ray +6821|1608|32|1|40|60384.00|0.02|0.02|N|O|1997-12-19|1997-11-14|1997-12-31|COLLECT COD|MAIL| dependencies. quickly +6821|1014|50|2|31|28365.31|0.07|0.03|N|O|1998-01-30|1997-11-18|1998-02-08|TAKE BACK RETURN|RAIL|efully carefully pending theod +6822|111|12|1|11|11122.21|0.02|0.07|N|O|1997-07-29|1997-08-30|1997-08-09|NONE|SHIP|leep furiously blithely unusual p +6822|1417|96|2|48|63283.68|0.08|0.05|N|O|1997-07-05|1997-08-08|1997-07-23|TAKE BACK RETURN|MAIL|he regular instructions. requests affix aga +6822|1367|44|3|10|12683.60|0.10|0.06|N|O|1997-09-05|1997-08-09|1997-10-01|COLLECT COD|REG AIR|ar requests play with the carefully bu +6822|1215|16|4|23|25672.83|0.07|0.04|N|O|1997-07-09|1997-08-18|1997-07-31|TAKE BACK RETURN|SHIP|unts. accounts boost +6822|1716|43|5|15|24265.65|0.06|0.08|N|O|1997-06-30|1997-08-01|1997-07-27|TAKE BACK RETURN|SHIP|s. slyly special foxe +6822|1858|59|6|22|38716.70|0.03|0.05|N|O|1997-07-24|1997-08-21|1997-08-06|TAKE BACK RETURN|MAIL|ic instructions a +6822|396|97|7|4|5185.56|0.04|0.04|N|O|1997-09-20|1997-09-09|1997-10-18|DELIVER IN PERSON|AIR| slyly. theodolites wake +6823|1338|15|1|8|9914.64|0.07|0.03|A|F|1994-08-06|1994-09-27|1994-08-07|COLLECT COD|REG AIR|r theodolites use slyly. b +6823|1803|90|2|36|61372.80|0.06|0.04|R|F|1994-09-25|1994-09-28|1994-10-21|DELIVER IN PERSON|SHIP|ch regular dolphins. special, flu +6823|636|30|3|19|29195.97|0.10|0.02|A|F|1994-10-13|1994-09-12|1994-10-15|NONE|TRUCK|l epitaphs. regular ide +6823|48|74|4|20|18960.80|0.06|0.04|R|F|1994-09-18|1994-08-27|1994-09-21|DELIVER IN PERSON|REG AIR|equests wake carefully excuses. furious +6823|148|75|5|48|50310.72|0.03|0.01|A|F|1994-08-17|1994-09-14|1994-09-05|NONE|MAIL|he ironic, pending packages sleep carefu +6823|273|28|6|39|45757.53|0.04|0.07|R|F|1994-09-13|1994-09-13|1994-09-16|DELIVER IN PERSON|REG AIR|ts sleep slyly about th +6848|487|75|1|42|58274.16|0.04|0.02|A|F|1993-12-13|1993-11-07|1994-01-12|TAKE BACK RETURN|AIR|after the furious +6848|1178|87|2|42|45325.14|0.07|0.04|A|F|1993-11-06|1993-12-13|1993-12-02|TAKE BACK RETURN|SHIP| theodolites maintain furious +6848|1078|84|3|36|35246.52|0.03|0.03|R|F|1993-11-17|1993-11-11|1993-12-11|TAKE BACK RETURN|AIR|ermanently si +6848|358|15|4|38|47817.30|0.01|0.01|A|F|1993-09-26|1993-11-28|1993-10-06|TAKE BACK RETURN|FOB|ackages caj +6849|134|87|1|24|24819.12|0.06|0.08|N|O|1998-04-11|1998-03-18|1998-05-03|DELIVER IN PERSON|REG AIR|ss theodolites. slyly even pinto beans acro +6849|1206|18|2|31|34323.20|0.07|0.05|N|O|1998-03-08|1998-03-16|1998-03-25|NONE|TRUCK|ouches haggle. pending braids are. +6849|462|50|3|12|16349.52|0.00|0.03|N|O|1998-04-16|1998-02-27|1998-04-17|NONE|REG AIR| carefully regula +6849|1699|100|4|43|68829.67|0.05|0.02|N|O|1998-03-02|1998-03-23|1998-03-09|DELIVER IN PERSON|SHIP| nag slyly furi +6850|1150|23|1|3|3153.45|0.06|0.03|A|F|1993-04-26|1993-04-06|1993-04-27|COLLECT COD|FOB| about the ironic requests. acc +6850|438|97|2|41|54875.63|0.05|0.05|R|F|1993-05-13|1993-04-25|1993-05-16|NONE|MAIL|n among the theodolites. furiously +6850|1766|93|3|21|35022.96|0.10|0.00|A|F|1993-02-22|1993-05-05|1993-02-23|DELIVER IN PERSON|AIR|fluffily across the qu +6850|1703|30|4|37|59373.90|0.09|0.08|R|F|1993-03-13|1993-04-23|1993-03-14|DELIVER IN PERSON|RAIL| regular courts. ruthle +6851|1210|48|1|6|6667.26|0.06|0.03|N|O|1997-07-22|1997-09-16|1997-07-28|COLLECT COD|FOB|. packages alongside of the carefully pen +6851|532|93|2|48|68761.44|0.04|0.07|N|O|1997-10-24|1997-08-10|1997-11-04|NONE|FOB|yly regular +6851|1133|34|3|11|11375.43|0.00|0.01|N|O|1997-09-26|1997-09-13|1997-10-25|TAKE BACK RETURN|FOB|haggle silently ironic, bold i +6852|539|100|1|21|30230.13|0.10|0.08|N|O|1997-08-10|1997-08-25|1997-08-22|TAKE BACK RETURN|SHIP|n pinto beans. pending, regular d +6853|1543|84|1|11|15889.94|0.10|0.07|N|O|1997-02-20|1997-04-26|1997-03-12|NONE|TRUCK| blithely fi +6853|12|13|2|33|30096.33|0.03|0.07|N|O|1997-04-07|1997-04-04|1997-04-26|DELIVER IN PERSON|FOB|requests slee +6854|1273|74|1|14|16439.78|0.01|0.03|R|F|1994-02-14|1994-03-05|1994-03-15|TAKE BACK RETURN|TRUCK|g the regular requests. pe +6854|1055|61|2|16|15296.80|0.03|0.06|A|F|1994-02-26|1994-02-13|1994-02-27|TAKE BACK RETURN|SHIP|nent foxes. +6854|1572|93|3|31|45680.67|0.03|0.06|A|F|1994-01-23|1994-03-02|1994-02-09|NONE|SHIP|ckages. eve +6854|920|89|4|48|87404.16|0.02|0.02|A|F|1994-01-30|1994-02-22|1994-02-22|NONE|REG AIR|y against t +6854|249|50|5|28|32178.72|0.01|0.07|A|F|1994-03-24|1994-02-23|1994-04-11|NONE|RAIL|egular foxes haggle. fluffily ironic ac +6854|1582|23|6|16|23737.28|0.03|0.06|R|F|1994-04-19|1994-03-17|1994-05-15|NONE|SHIP|ly pending packages haggle bl +6854|1033|34|7|49|45767.47|0.07|0.04|R|F|1994-02-09|1994-02-14|1994-02-25|NONE|REG AIR|r the slyly regular plat +6855|1349|50|1|19|23756.46|0.10|0.04|N|O|1995-12-16|1995-10-01|1996-01-05|TAKE BACK RETURN|TRUCK|t the ironic depos +6855|1827|57|2|37|63966.34|0.08|0.07|N|O|1995-09-02|1995-09-29|1995-09-10|NONE|REG AIR|ven Tiresias +6880|104|83|1|36|36147.60|0.10|0.08|R|F|1994-09-04|1994-07-21|1994-09-18|DELIVER IN PERSON|REG AIR|blithely sp +6880|1486|26|2|37|51336.76|0.02|0.04|R|F|1994-06-21|1994-08-15|1994-06-24|COLLECT COD|AIR| the even packages +6880|1516|97|3|45|63787.95|0.00|0.03|A|F|1994-06-06|1994-08-17|1994-06-10|DELIVER IN PERSON|SHIP|xpress pac +6881|882|82|1|7|12480.16|0.08|0.08|R|F|1994-05-24|1994-05-12|1994-06-16|COLLECT COD|MAIL|equests. ironic multiplier +6881|473|61|2|23|31589.81|0.10|0.00|A|F|1994-05-13|1994-05-15|1994-05-27|NONE|REG AIR|ccounts sleep +6882|602|3|1|42|63109.20|0.01|0.00|N|O|1997-05-28|1997-05-10|1997-05-31|NONE|REG AIR|across the blithely express requests. +6882|1213|25|2|48|53482.08|0.04|0.06|N|O|1997-07-16|1997-07-05|1997-07-17|DELIVER IN PERSON|MAIL|ould integrate pending, express theodo +6882|484|72|3|41|56763.68|0.08|0.07|N|O|1997-05-13|1997-05-24|1997-06-10|TAKE BACK RETURN|AIR|nal asymptotes alongside of the deposit +6882|584|15|4|43|63836.94|0.02|0.04|N|O|1997-07-05|1997-06-22|1997-07-15|NONE|REG AIR|its. carefully e +6882|425|55|5|47|62294.74|0.07|0.04|N|O|1997-06-24|1997-05-31|1997-06-30|NONE|AIR|ns. regular, daring pinto beans sleep caref +6882|1890|34|6|39|69883.71|0.05|0.00|N|O|1997-04-29|1997-05-19|1997-05-05|TAKE BACK RETURN|RAIL|nstructions eat ruthlessly. +6882|433|63|7|43|57337.49|0.02|0.03|N|O|1997-08-03|1997-07-06|1997-08-13|COLLECT COD|AIR|lets affix +6883|497|98|1|31|43322.19|0.09|0.07|N|O|1997-10-16|1997-08-18|1997-11-11|TAKE BACK RETURN|MAIL| boost busily. ironic i +6883|550|41|2|30|43516.50|0.10|0.02|N|O|1997-08-17|1997-10-01|1997-09-11|COLLECT COD|REG AIR|alongside of th +6883|1924|25|3|30|54777.60|0.07|0.04|N|O|1997-09-05|1997-08-22|1997-10-01|DELIVER IN PERSON|MAIL|r the even package +6883|1463|81|4|47|64129.62|0.06|0.08|N|O|1997-10-17|1997-09-09|1997-11-03|COLLECT COD|TRUCK|ing requests use alongs +6883|361|90|5|49|61806.64|0.10|0.03|N|O|1997-10-03|1997-08-22|1997-10-30|NONE|REG AIR|ermanently? even, final dolphins sleep car +6884|1489|68|1|22|30590.56|0.05|0.04|R|F|1994-03-25|1994-03-11|1994-04-21|COLLECT COD|FOB| furiously! slyly final pac +6884|1136|37|2|23|23853.99|0.01|0.06|R|F|1994-04-14|1994-03-27|1994-05-07|NONE|FOB| pending requests haggle. quickly +6884|777|78|3|44|73821.88|0.03|0.07|R|F|1994-01-18|1994-04-02|1994-02-08|NONE|AIR|gly special dependencies u +6884|932|67|4|46|84314.78|0.02|0.04|R|F|1994-01-27|1994-04-08|1994-02-22|DELIVER IN PERSON|FOB|ithely among the daringly ir +6884|1146|47|5|2|2094.28|0.09|0.00|R|F|1994-03-27|1994-02-24|1994-04-03|TAKE BACK RETURN|SHIP|he slyly even deposits s +6884|493|23|6|14|19508.86|0.03|0.00|A|F|1994-04-05|1994-03-24|1994-04-08|COLLECT COD|REG AIR|pending packages are qui +6885|1834|35|1|26|45131.58|0.05|0.02|R|F|1992-08-03|1992-08-23|1992-08-09|NONE|FOB|latelets integrate foxes. +6885|964|99|2|25|46624.00|0.00|0.00|R|F|1992-06-22|1992-09-17|1992-07-18|DELIVER IN PERSON|RAIL|ully regular, bold pinto beans. +6885|1125|26|3|18|18470.16|0.06|0.03|R|F|1992-08-31|1992-07-28|1992-09-12|TAKE BACK RETURN|FOB|kages. slyly express pinto bea +6885|14|90|4|26|23764.26|0.08|0.06|R|F|1992-09-19|1992-08-07|1992-09-21|COLLECT COD|MAIL|posits. packages are +6885|802|3|5|16|27244.80|0.05|0.01|A|F|1992-06-27|1992-09-06|1992-07-27|TAKE BACK RETURN|TRUCK|lthily unu +6885|479|67|6|1|1379.47|0.06|0.06|R|F|1992-07-04|1992-08-28|1992-07-24|NONE|RAIL|accounts sleep about the +6886|1320|59|1|3|3663.96|0.06|0.03|A|F|1992-03-26|1992-03-27|1992-03-29|DELIVER IN PERSON|SHIP|ole daringly according to t +6886|135|88|2|27|27948.51|0.07|0.00|R|F|1992-03-12|1992-04-14|1992-04-06|DELIVER IN PERSON|SHIP|s, silent instructions w +6886|1086|57|3|9|8883.72|0.06|0.03|R|F|1992-04-12|1992-03-17|1992-04-17|DELIVER IN PERSON|AIR|thely above th +6886|76|77|4|48|46851.36|0.06|0.02|R|F|1992-03-04|1992-04-03|1992-03-27|NONE|REG AIR|uriously against the regular packages +6886|1144|81|5|22|22993.08|0.10|0.06|A|F|1992-03-02|1992-03-15|1992-03-22|NONE|REG AIR|s. blithely bold foxes dazzl +6886|44|45|6|49|46257.96|0.06|0.02|R|F|1992-02-20|1992-03-02|1992-03-09|DELIVER IN PERSON|AIR|nag regular, regular +6887|184|85|1|12|13010.16|0.05|0.05|N|O|1995-12-13|1995-10-22|1995-12-15|DELIVER IN PERSON|SHIP|ial packages; r +6887|1006|7|2|23|20861.00|0.02|0.01|N|O|1995-10-17|1995-10-01|1995-11-10|TAKE BACK RETURN|RAIL|furiously. f +6887|178|57|3|26|28032.42|0.04|0.04|N|O|1995-10-30|1995-10-19|1995-11-09|TAKE BACK RETURN|TRUCK|gle among the platelets. ironic, regular so +6887|389|18|4|10|12893.80|0.09|0.04|N|O|1995-12-05|1995-11-05|1995-12-10|TAKE BACK RETURN|AIR|uriously regular pinto beans sleep across +6887|934|35|5|44|80736.92|0.02|0.05|N|O|1995-10-22|1995-10-23|1995-10-27|DELIVER IN PERSON|TRUCK|sly pending packages. i +6887|695|96|6|17|27126.73|0.00|0.08|N|O|1995-11-15|1995-11-12|1995-12-10|COLLECT COD|RAIL|cial request +6887|1000|1|7|10|9010.00|0.04|0.06|N|O|1995-11-02|1995-11-08|1995-11-10|COLLECT COD|SHIP|accounts boost furiously about the b +6912|107|60|1|19|19134.90|0.00|0.06|N|O|1996-03-31|1996-01-12|1996-04-21|TAKE BACK RETURN|AIR|lly final packages cajole qui +6913|1091|92|1|36|35715.24|0.00|0.08|A|F|1993-03-16|1993-01-31|1993-03-25|TAKE BACK RETURN|REG AIR|ges. blithely express requests ar +6913|932|1|2|38|69651.34|0.07|0.06|R|F|1993-01-29|1993-01-01|1993-02-14|DELIVER IN PERSON|RAIL|yly among the accounts. blithely +6914|998|67|1|42|79757.58|0.05|0.04|A|F|1994-04-06|1994-02-28|1994-04-13|TAKE BACK RETURN|TRUCK|jole slyly except the quickly regu +6915|562|23|1|24|35101.44|0.10|0.08|N|O|1996-05-22|1996-05-05|1996-06-08|TAKE BACK RETURN|AIR|olites cajole along +6915|536|37|2|9|12928.77|0.08|0.05|N|O|1996-05-14|1996-04-06|1996-06-07|COLLECT COD|SHIP|sily above the +6915|15|66|3|21|19215.21|0.09|0.00|N|O|1996-04-27|1996-04-25|1996-05-19|NONE|REG AIR|evenly slowly special ac +6916|68|19|1|6|5808.36|0.06|0.03|R|F|1993-08-28|1993-08-01|1993-09-11|TAKE BACK RETURN|FOB|quickly ironic platelets nag +6916|731|28|2|35|57110.55|0.10|0.00|R|F|1993-08-01|1993-07-14|1993-08-04|COLLECT COD|FOB|bove the silently ironic pinto be +6916|299|54|3|49|58765.21|0.04|0.02|R|F|1993-09-05|1993-08-20|1993-09-21|DELIVER IN PERSON|SHIP|s. quickly bold theodolites +6917|203|31|1|19|20960.80|0.02|0.03|N|O|1998-10-15|1998-10-10|1998-11-12|COLLECT COD|RAIL|uriously final foxes are slyly iron +6917|448|49|2|4|5393.76|0.03|0.04|N|O|1998-09-20|1998-09-28|1998-10-03|NONE|RAIL|ep furiously slyly regular packages. ins +6917|199|78|3|8|8793.52|0.08|0.00|N|O|1998-11-04|1998-10-13|1998-11-26|NONE|TRUCK|e carefully express b +6917|895|96|4|13|23346.57|0.00|0.08|N|O|1998-09-09|1998-09-05|1998-09-15|TAKE BACK RETURN|MAIL|s kindle furiously against the slyly bol +6917|824|25|5|18|31046.76|0.01|0.08|N|O|1998-09-01|1998-09-12|1998-09-18|COLLECT COD|RAIL|nic accounts. +6917|352|37|6|2|2504.70|0.08|0.01|N|O|1998-09-22|1998-10-04|1998-10-21|DELIVER IN PERSON|REG AIR|r foxes engage. b +6918|1651|93|1|2|3105.30|0.08|0.06|N|O|1995-07-08|1995-08-10|1995-07-11|COLLECT COD|RAIL|t fluffily +6918|1392|69|2|48|62082.72|0.03|0.06|N|O|1995-09-19|1995-09-23|1995-10-12|TAKE BACK RETURN|SHIP|ly blithely final dep +6918|1770|71|3|14|23404.78|0.09|0.08|N|O|1995-07-21|1995-08-20|1995-07-28|DELIVER IN PERSON|RAIL|ns. theodolites hang furiously about th +6918|1222|23|4|35|39312.70|0.10|0.06|N|O|1995-10-03|1995-09-23|1995-10-22|DELIVER IN PERSON|FOB|y express dolphins. instructi +6918|1177|50|5|28|30188.76|0.02|0.07|N|O|1995-07-09|1995-09-26|1995-07-26|TAKE BACK RETURN|AIR|ggle quickly blithely express platelets. f +6918|1978|23|6|21|39479.37|0.02|0.01|N|O|1995-08-29|1995-09-27|1995-08-31|COLLECT COD|FOB|riously unusual +6918|1146|47|7|15|15707.10|0.09|0.05|N|O|1995-10-11|1995-09-06|1995-10-20|COLLECT COD|RAIL|bold deposits above the fluffily +6919|524|85|1|6|8547.12|0.07|0.03|N|O|1998-08-03|1998-07-10|1998-08-21|TAKE BACK RETURN|MAIL|ncies. fluffily special packages are sl +6919|1468|69|2|37|50670.02|0.01|0.03|N|O|1998-06-07|1998-07-27|1998-06-16|COLLECT COD|REG AIR|he instructions. f +6919|1901|90|3|10|18029.00|0.01|0.01|N|O|1998-08-29|1998-07-14|1998-09-08|NONE|REG AIR|otes. blithely regular requests ha +6919|1490|91|4|22|30612.78|0.09|0.04|N|O|1998-07-05|1998-06-04|1998-07-26|DELIVER IN PERSON|AIR|es cajole across the quickly +6919|46|97|5|23|21758.92|0.08|0.00|N|O|1998-06-07|1998-06-07|1998-06-08|NONE|MAIL|nts. pinto beans among the requests d +6919|1544|45|6|38|54930.52|0.10|0.00|N|O|1998-08-30|1998-07-16|1998-09-29|NONE|MAIL|pecial pac +6944|1588|29|1|6|8937.48|0.02|0.04|R|F|1992-04-22|1992-05-16|1992-05-16|DELIVER IN PERSON|RAIL| carefully even packages. quickly +6945|1281|56|1|7|8275.96|0.06|0.06|N|F|1995-06-08|1995-06-24|1995-06-22|TAKE BACK RETURN|REG AIR|ng, even pinto beans. furiously silent as +6946|1642|84|1|50|77182.00|0.04|0.01|N|O|1997-10-15|1997-07-23|1997-10-30|DELIVER IN PERSON|TRUCK| final requests boost blithely s +6947|297|79|1|22|26340.38|0.02|0.08|N|O|1995-08-26|1995-09-02|1995-09-23|TAKE BACK RETURN|SHIP|he deposits. furiously spe +6947|305|6|2|24|28927.20|0.09|0.04|N|O|1995-09-27|1995-09-01|1995-10-17|NONE|SHIP|regular sentiments according to the +6947|43|69|3|25|23576.00|0.07|0.06|N|O|1995-07-28|1995-10-03|1995-08-23|NONE|FOB|ssly regular excuses haggle ac +6948|1963|96|1|29|54083.84|0.00|0.00|R|F|1994-02-21|1994-01-16|1994-03-05|NONE|SHIP|ly silent idea +6948|1358|97|2|39|49114.65|0.07|0.05|A|F|1994-01-14|1994-02-07|1994-01-20|COLLECT COD|SHIP|its boost final pac +6948|307|92|3|30|36219.00|0.00|0.08|R|F|1994-01-21|1994-02-04|1994-01-25|NONE|RAIL|ages? regular, special pinto beans c +6948|1705|6|4|24|38560.80|0.07|0.02|R|F|1994-01-20|1994-01-21|1994-01-29|DELIVER IN PERSON|AIR|accounts. ironic the +6948|1084|55|5|46|45313.68|0.10|0.01|R|F|1994-03-10|1994-03-09|1994-03-28|NONE|FOB|he theodolites wake never according t +6948|1687|70|6|35|55603.80|0.09|0.03|A|F|1994-01-23|1994-02-17|1994-02-01|DELIVER IN PERSON|MAIL|uctions. fluffily pending pinto be +6949|398|27|1|50|64919.50|0.01|0.08|R|F|1992-06-12|1992-06-19|1992-07-02|COLLECT COD|AIR|odolites. fluffily regular asymptotes +6949|1044|15|2|22|20790.88|0.02|0.02|A|F|1992-07-14|1992-07-07|1992-08-12|TAKE BACK RETURN|RAIL|unts integrate around the blithe +6949|1576|97|3|2|2955.14|0.01|0.06|R|F|1992-07-19|1992-07-11|1992-07-20|COLLECT COD|FOB|cies sleep quickly among t +6949|1169|6|4|26|27824.16|0.01|0.06|R|F|1992-07-02|1992-06-07|1992-07-29|NONE|SHIP| even theodolites. requests so +6950|227|9|1|16|18035.52|0.07|0.01|R|F|1992-06-04|1992-05-23|1992-06-07|TAKE BACK RETURN|AIR|: carefully sly decoys haggle slyly +6950|311|40|2|5|6056.55|0.02|0.01|R|F|1992-04-18|1992-06-15|1992-05-15|COLLECT COD|REG AIR|s. dolphins det +6951|1297|98|1|7|8388.03|0.09|0.04|N|O|1996-10-11|1996-10-11|1996-10-23|TAKE BACK RETURN|REG AIR|equests use carefully q +6976|778|75|1|46|77223.42|0.02|0.05|R|F|1993-11-17|1993-12-21|1993-11-21|NONE|REG AIR|fully ironic packages. ruthle +6976|1653|36|2|33|51303.45|0.06|0.08|R|F|1993-11-15|1994-01-09|1993-11-24|NONE|AIR|structions kindle slyly quick depo +6976|401|31|3|27|35137.80|0.02|0.02|A|F|1993-11-06|1993-11-19|1993-11-09|NONE|FOB|. packages +6977|1825|26|1|25|43170.50|0.05|0.06|A|F|1995-03-30|1995-01-22|1995-04-25|TAKE BACK RETURN|MAIL|t blithely +6977|1703|4|2|9|14442.30|0.09|0.03|R|F|1995-03-05|1995-01-22|1995-03-06|COLLECT COD|RAIL|s may haggle +6977|56|32|3|35|33461.75|0.08|0.08|R|F|1995-01-31|1995-02-19|1995-02-22|DELIVER IN PERSON|RAIL|s wake about the ironic, ironic deposits. +6977|497|27|4|37|51707.13|0.07|0.07|R|F|1995-03-24|1995-02-21|1995-04-20|COLLECT COD|TRUCK| furiously agai +6977|664|65|5|25|39116.50|0.02|0.05|R|F|1995-01-05|1995-03-05|1995-01-07|TAKE BACK RETURN|SHIP|ts cajole furiously acro +6978|1182|55|1|28|30329.04|0.02|0.00|A|F|1994-01-31|1994-02-12|1994-02-23|NONE|SHIP|nag fluffily a +6978|60|86|2|2|1920.12|0.01|0.06|A|F|1994-01-02|1994-02-18|1994-01-03|DELIVER IN PERSON|TRUCK|fily bold sheaves haggle carefully specia +6978|432|20|3|1|1332.43|0.05|0.03|A|F|1993-12-17|1994-02-26|1994-01-10|DELIVER IN PERSON|MAIL|ajole slyly above the furiously pending +6978|1496|36|4|49|68477.01|0.00|0.03|R|F|1994-02-03|1994-01-14|1994-02-11|TAKE BACK RETURN|RAIL|at! furiously even r +6978|1115|16|5|49|49789.39|0.03|0.03|R|F|1994-03-04|1994-01-19|1994-03-26|NONE|AIR|symptotes integrate s +6979|1105|78|1|7|7042.70|0.06|0.04|A|F|1994-04-02|1994-05-16|1994-05-01|TAKE BACK RETURN|REG AIR|eodolites sleep pending +6979|873|7|2|8|14190.96|0.01|0.04|R|F|1994-03-26|1994-03-31|1994-03-28|DELIVER IN PERSON|RAIL| the quickly regular pinto beans? slyly +6979|1321|98|3|33|40336.56|0.08|0.07|R|F|1994-03-16|1994-04-24|1994-04-05|DELIVER IN PERSON|TRUCK|final platelets; even +6979|120|73|4|39|39784.68|0.01|0.07|R|F|1994-05-03|1994-05-01|1994-05-24|NONE|RAIL|he furiously +6980|748|45|1|33|54408.42|0.03|0.06|A|F|1993-06-16|1993-04-15|1993-07-12|COLLECT COD|AIR|. silent, re +6980|920|23|2|11|20030.12|0.08|0.01|A|F|1993-05-26|1993-05-02|1993-06-22|TAKE BACK RETURN|RAIL|ithely ironic deposits cajole car +6980|82|83|3|40|39283.20|0.03|0.05|R|F|1993-03-25|1993-04-07|1993-04-01|COLLECT COD|SHIP|lar theodolites +6980|43|94|4|22|20746.88|0.09|0.08|A|F|1993-06-09|1993-03-24|1993-07-04|TAKE BACK RETURN|SHIP|sits haggle after the carefu +6980|1967|68|5|6|11213.76|0.08|0.05|A|F|1993-05-03|1993-04-12|1993-05-25|NONE|MAIL|efully regular requests. blithely busy +6980|1063|69|6|3|2892.18|0.04|0.02|A|F|1993-02-25|1993-04-21|1993-03-17|DELIVER IN PERSON|SHIP| even accounts. final deposit +6980|1953|98|7|12|22259.40|0.04|0.04|A|F|1993-03-27|1993-04-27|1993-04-06|TAKE BACK RETURN|TRUCK|orses. final, silent tithes +6981|258|86|1|27|31272.75|0.05|0.07|N|O|1998-09-19|1998-07-26|1998-10-19|NONE|RAIL|uickly final deposits. closely ironic pa +6981|1236|37|2|22|25019.06|0.01|0.00|N|O|1998-07-30|1998-07-18|1998-08-17|NONE|REG AIR| escapades cajole blithely. carefully unusu +6981|1483|23|3|49|67839.52|0.05|0.06|N|O|1998-09-07|1998-09-11|1998-10-06|DELIVER IN PERSON|MAIL|lites eat blithely. +6981|140|41|4|2|2080.28|0.06|0.08|N|O|1998-08-30|1998-07-19|1998-09-21|COLLECT COD|REG AIR|ick pinto beans cajole quickly s +6982|238|93|1|40|45529.20|0.07|0.07|N|O|1995-12-26|1996-01-01|1995-12-29|NONE|AIR|ending ideas are a +6982|1173|46|2|43|46189.31|0.06|0.02|N|O|1996-01-24|1996-01-21|1996-01-26|TAKE BACK RETURN|AIR|ffily. sly +6982|1037|38|3|45|42211.35|0.07|0.03|N|O|1996-01-30|1995-12-18|1996-02-25|DELIVER IN PERSON|FOB|cial dependencies wake f +6983|442|1|1|47|63094.68|0.07|0.03|N|O|1998-04-22|1998-04-12|1998-05-04|NONE|SHIP|le blithely. dependencies cajole blithe +7008|596|57|1|37|55373.83|0.07|0.06|R|F|1992-11-16|1992-11-26|1992-12-14|TAKE BACK RETURN|MAIL|fully ironic excuses hag +7009|1234|46|1|30|34056.90|0.04|0.04|N|O|1995-12-05|1996-01-19|1995-12-28|DELIVER IN PERSON|TRUCK|s. regular dependencies +7009|590|91|2|35|52170.65|0.02|0.07|N|O|1996-01-21|1996-02-15|1996-02-12|TAKE BACK RETURN|RAIL|azzle final platele +7009|1584|65|3|20|29711.60|0.03|0.00|N|O|1996-01-30|1996-01-12|1996-02-28|DELIVER IN PERSON|REG AIR|osits are blithely behind the doggedly +7010|1204|5|1|2|2210.40|0.06|0.01|N|O|1998-08-23|1998-06-18|1998-08-27|NONE|FOB|fully bold dolphins +7010|705|38|2|25|40142.50|0.04|0.04|N|O|1998-07-18|1998-07-21|1998-08-14|TAKE BACK RETURN|TRUCK|ns boost carefully ruthlessly expres +7011|698|92|1|32|51158.08|0.10|0.08|N|O|1998-01-04|1998-03-14|1998-01-30|TAKE BACK RETURN|FOB|inal requests. packages haggle quickly bli +7012|1631|55|1|2|3065.26|0.04|0.05|N|O|1998-06-29|1998-07-15|1998-07-09|TAKE BACK RETURN|REG AIR| haggle along the regular +7013|1297|35|1|37|44336.73|0.02|0.04|N|O|1997-05-29|1997-05-14|1997-06-06|DELIVER IN PERSON|AIR|g dinos haggle. regular requests cajo +7013|1415|33|2|22|28961.02|0.09|0.04|N|O|1997-05-05|1997-06-25|1997-05-09|NONE|AIR|eep requests. +7013|1249|24|3|36|41408.64|0.03|0.06|N|O|1997-07-19|1997-06-15|1997-07-25|DELIVER IN PERSON|RAIL|onic platelets wake fluffily above +7014|1505|86|1|32|45008.00|0.02|0.06|N|O|1996-08-23|1996-07-25|1996-08-27|COLLECT COD|TRUCK| ironic foxes kindl +7014|30|81|2|46|42781.38|0.00|0.02|N|O|1996-06-30|1996-07-24|1996-07-07|NONE|SHIP| the carefully bold dolphins. r +7014|1034|5|3|33|30855.99|0.05|0.00|N|O|1996-10-13|1996-08-23|1996-11-07|COLLECT COD|FOB|deas nag special, bold depths. slyl +7014|1159|68|4|21|22263.15|0.06|0.05|N|O|1996-07-18|1996-07-26|1996-08-11|DELIVER IN PERSON|AIR|c requests haggle slyly platelets-- sp +7015|1645|46|1|46|71145.44|0.00|0.04|A|F|1994-01-11|1993-12-09|1994-02-09|TAKE BACK RETURN|TRUCK|r the quickly regular packages wake blithe +7015|1873|60|2|31|55020.97|0.02|0.08|A|F|1994-02-08|1993-12-14|1994-03-07|NONE|SHIP|st the unusual, special platel +7015|423|53|3|26|34408.92|0.10|0.01|R|F|1993-11-08|1993-12-20|1993-11-15|COLLECT COD|SHIP|ounts will m +7015|856|23|4|30|52705.50|0.04|0.08|A|F|1993-10-30|1993-12-15|1993-11-04|NONE|FOB|mptotes da +7015|574|35|5|43|63406.51|0.07|0.05|R|F|1993-12-22|1993-12-09|1994-01-06|NONE|AIR|ithely bold de +7015|1151|52|6|4|4208.60|0.05|0.04|A|F|1993-12-23|1993-12-16|1993-12-28|TAKE BACK RETURN|SHIP|kages haggle abo +7040|344|73|1|19|23642.46|0.01|0.03|N|O|1996-09-13|1996-07-16|1996-10-05|COLLECT COD|SHIP|ar deposits. perman +7040|396|53|2|50|64819.50|0.01|0.08|N|O|1996-08-25|1996-07-24|1996-08-27|DELIVER IN PERSON|AIR|al deposits det +7041|798|63|1|48|81541.92|0.07|0.03|N|O|1997-12-09|1997-11-12|1997-12-18|COLLECT COD|FOB|ully regular asy +7041|631|25|2|17|26037.71|0.07|0.01|N|O|1997-12-16|1997-12-03|1998-01-01|TAKE BACK RETURN|RAIL|to beans mold furiously ironic +7042|1528|69|1|21|30019.92|0.03|0.00|A|F|1992-02-12|1992-03-09|1992-03-01|TAKE BACK RETURN|REG AIR|dolites. quickly special deposits se +7042|1701|44|2|14|22437.80|0.05|0.05|A|F|1992-03-28|1992-02-22|1992-04-07|COLLECT COD|REG AIR| engage carefully according to the careful +7042|1575|56|3|35|51679.95|0.07|0.05|R|F|1992-01-24|1992-02-13|1992-02-05|DELIVER IN PERSON|MAIL|y. requests wake blithely pinto be +7042|825|92|4|49|84565.18|0.06|0.06|R|F|1992-02-01|1992-03-26|1992-02-14|COLLECT COD|SHIP|eans are. quickly regular account +7042|1222|34|5|21|23587.62|0.05|0.00|A|F|1992-04-18|1992-02-20|1992-05-13|COLLECT COD|MAIL| according to the theodolites. blithel +7043|420|21|1|14|18485.88|0.00|0.04|R|F|1994-02-16|1994-04-23|1994-02-26|TAKE BACK RETURN|REG AIR|thely around the carefully +7044|1943|32|1|16|29519.04|0.08|0.05|R|F|1994-08-14|1994-10-27|1994-08-23|TAKE BACK RETURN|SHIP|equests cajole blithely. careful +7044|793|90|2|2|3387.58|0.06|0.06|A|F|1994-08-14|1994-10-17|1994-09-12|NONE|MAIL|fully silent +7044|1991|80|3|32|60575.68|0.04|0.04|R|F|1994-09-06|1994-11-11|1994-09-28|DELIVER IN PERSON|AIR|uriously pending deposits boost +7045|764|61|1|36|59931.36|0.00|0.08|N|O|1997-10-11|1997-10-09|1997-10-20|COLLECT COD|FOB|y regular foxes cajol +7045|402|32|2|46|59910.40|0.08|0.03|N|O|1997-11-05|1997-09-28|1997-11-28|DELIVER IN PERSON|SHIP|against the fina +7045|294|22|3|43|51354.47|0.08|0.05|N|O|1997-09-09|1997-09-18|1997-09-30|DELIVER IN PERSON|RAIL|mptotes are furiously +7045|531|62|4|50|71576.50|0.03|0.02|N|O|1997-11-18|1997-10-11|1997-11-27|NONE|MAIL|l deposits. +7046|703|36|1|50|80185.00|0.07|0.00|N|O|1996-04-05|1996-02-24|1996-04-29|COLLECT COD|AIR|ilent deposits. furiously final acc +7046|1779|80|2|48|80676.96|0.06|0.03|N|O|1996-03-08|1996-03-09|1996-03-27|TAKE BACK RETURN|TRUCK|iously even requests about the careful +7046|497|27|3|27|37732.23|0.05|0.05|N|O|1996-03-03|1996-04-09|1996-04-01|DELIVER IN PERSON|REG AIR| beans. furiously regular +7046|653|47|4|43|66806.95|0.02|0.08|N|O|1996-04-03|1996-04-11|1996-04-27|NONE|SHIP|y idle accounts +7047|1134|35|1|36|37264.68|0.02|0.03|N|O|1997-01-24|1996-12-29|1997-02-16|DELIVER IN PERSON|RAIL|fily final pinto beans. furiously +7047|1822|23|2|44|75848.08|0.08|0.06|N|O|1997-02-03|1997-01-29|1997-03-01|COLLECT COD|FOB| furious platelets nag +7047|1373|74|3|14|17841.18|0.03|0.06|N|O|1997-01-28|1997-01-12|1997-02-20|NONE|RAIL|sts use carefully along the carefully +7047|1345|60|4|27|33651.18|0.02|0.05|N|O|1997-02-16|1997-02-06|1997-03-18|TAKE BACK RETURN|TRUCK|efully across +7047|656|57|5|45|70049.25|0.04|0.08|N|O|1997-02-18|1997-02-25|1997-03-18|DELIVER IN PERSON|TRUCK| carefully slyly +7047|1189|98|6|14|15262.52|0.02|0.08|N|O|1997-02-02|1997-01-03|1997-03-01|DELIVER IN PERSON|RAIL|ructions affix. bold excuses are at the +7072|507|68|1|38|53485.00|0.03|0.07|R|F|1992-02-24|1992-04-07|1992-03-25|TAKE BACK RETURN|SHIP|, unusual theodolites above the regula +7072|1796|23|2|11|18675.69|0.04|0.03|A|F|1992-05-10|1992-04-18|1992-05-15|DELIVER IN PERSON|TRUCK|ans wake ironically +7073|260|61|1|8|9282.08|0.01|0.03|N|O|1997-10-11|1997-12-07|1997-10-22|COLLECT COD|TRUCK|ts solve excuses: f +7073|1762|5|2|14|23292.64|0.01|0.07|N|O|1998-01-09|1997-11-04|1998-01-28|DELIVER IN PERSON|RAIL|to the ideas. ironic platel +7073|581|42|3|46|68152.68|0.09|0.03|N|O|1997-12-30|1997-11-12|1998-01-27|NONE|TRUCK|edly express packages. sp +7073|208|36|4|25|27705.00|0.02|0.04|N|O|1997-12-05|1997-12-02|1997-12-25|DELIVER IN PERSON|SHIP|maintain carefully slyly +7074|727|60|1|45|73247.40|0.05|0.06|R|F|1993-08-16|1993-08-07|1993-08-30|DELIVER IN PERSON|MAIL| unusual packages doze even ac +7075|1752|37|1|40|66150.00|0.04|0.06|N|O|1995-12-16|1995-11-16|1996-01-06|COLLECT COD|SHIP|y regular packages wake about the requests. +7075|399|84|2|26|33784.14|0.02|0.08|N|O|1996-01-12|1995-12-28|1996-01-22|NONE|AIR|lites. regul +7075|1807|51|3|40|68352.00|0.07|0.05|N|O|1995-11-14|1995-11-29|1995-11-18|COLLECT COD|RAIL|al instructions. +7075|387|16|4|41|52782.58|0.07|0.04|N|O|1995-11-19|1995-12-19|1995-12-06|DELIVER IN PERSON|SHIP|onic foxes nag above the +7075|1691|15|5|16|25483.04|0.01|0.07|N|O|1995-11-21|1995-12-12|1995-12-05|DELIVER IN PERSON|AIR|ironically final requests a +7075|431|61|6|39|51925.77|0.10|0.08|N|O|1995-12-26|1995-12-25|1996-01-17|DELIVER IN PERSON|RAIL|odolites ab +7076|1842|86|1|19|33132.96|0.06|0.03|N|O|1996-02-20|1996-02-26|1996-03-21|TAKE BACK RETURN|REG AIR|e furiously fi +7076|1920|53|2|38|69232.96|0.04|0.01|N|O|1995-12-20|1996-03-05|1995-12-31|DELIVER IN PERSON|FOB|nts. slyly unusu +7077|382|11|1|38|48730.44|0.09|0.06|N|O|1996-03-06|1996-02-23|1996-03-10|DELIVER IN PERSON|MAIL|ly against the furiously quick +7077|98|74|2|14|13973.26|0.09|0.00|N|O|1996-02-12|1996-03-16|1996-03-04|COLLECT COD|MAIL|e slyly final braids: stealthily regul +7077|771|72|3|49|81916.73|0.06|0.01|N|O|1996-03-04|1996-03-05|1996-03-29|COLLECT COD|TRUCK|s impress. ironic, silent pinto beans h +7077|1616|58|4|28|42493.08|0.03|0.07|N|O|1996-02-18|1996-03-02|1996-02-19|TAKE BACK RETURN|FOB|s sleep abo +7077|1373|50|5|32|40779.84|0.08|0.03|N|O|1996-04-10|1996-02-02|1996-04-20|COLLECT COD|REG AIR|onic ideas. carefully ironi +7077|1638|39|6|23|35411.49|0.10|0.08|N|O|1996-02-08|1996-01-30|1996-02-16|DELIVER IN PERSON|RAIL|olites! bl +7077|971|6|7|3|5615.91|0.02|0.03|N|O|1996-03-05|1996-02-26|1996-03-16|TAKE BACK RETURN|TRUCK|ly after the f +7078|1594|35|1|16|23929.44|0.08|0.02|A|F|1993-06-04|1993-07-11|1993-06-11|COLLECT COD|TRUCK|uctions sleep. fluffily unusual platelets +7078|620|83|2|33|50180.46|0.01|0.04|A|F|1993-05-11|1993-05-14|1993-06-02|COLLECT COD|REG AIR|ress forges according to th +7078|1468|69|3|34|46561.64|0.06|0.02|R|F|1993-04-25|1993-06-23|1993-05-25|TAKE BACK RETURN|RAIL|e fluffily across the silent pi +7078|455|43|4|14|18976.30|0.05|0.07|A|F|1993-07-06|1993-05-23|1993-07-13|TAKE BACK RETURN|RAIL|t the blithely even waters: quickl +7078|1832|62|5|1|1733.83|0.01|0.00|A|F|1993-05-02|1993-06-22|1993-05-12|NONE|FOB| even pearls +7079|949|18|1|27|49948.38|0.02|0.05|A|F|1993-03-31|1993-03-20|1993-04-14|DELIVER IN PERSON|RAIL| across th +7079|807|7|2|50|85390.00|0.09|0.08|R|F|1993-05-26|1993-05-02|1993-05-27|COLLECT COD|RAIL|jole against the blithely +7079|1047|18|3|40|37921.60|0.07|0.07|R|F|1993-05-30|1993-03-29|1993-06-01|TAKE BACK RETURN|TRUCK|quests. quickly final ideas about the +7079|909|12|4|22|39817.80|0.06|0.06|A|F|1993-03-25|1993-04-21|1993-04-14|TAKE BACK RETURN|AIR| ironic requests. ironic p +7079|856|23|5|45|79058.25|0.01|0.05|A|F|1993-05-08|1993-04-12|1993-05-24|NONE|FOB|furiously even packages. expres +7079|748|81|6|50|82437.00|0.10|0.01|A|F|1993-04-20|1993-03-20|1993-05-04|DELIVER IN PERSON|FOB|grate carefully among the ideas. +7104|263|45|1|26|30244.76|0.04|0.03|N|O|1997-04-22|1997-02-14|1997-04-28|TAKE BACK RETURN|MAIL|ly ironic b +7105|54|80|1|15|14310.75|0.03|0.00|R|F|1993-08-14|1993-08-09|1993-08-26|COLLECT COD|SHIP| after the +7105|1464|82|2|33|45060.18|0.07|0.01|A|F|1993-10-16|1993-09-10|1993-10-29|DELIVER IN PERSON|TRUCK| slyly expres +7105|482|12|3|10|13824.80|0.08|0.05|A|F|1993-08-26|1993-09-02|1993-08-29|TAKE BACK RETURN|FOB|hes. package +7105|1195|96|4|6|6577.14|0.05|0.02|A|F|1993-07-04|1993-08-13|1993-07-24|DELIVER IN PERSON|TRUCK|nic foxes according to the quickly bold +7105|1499|100|5|26|36412.74|0.08|0.01|A|F|1993-07-21|1993-07-29|1993-08-05|DELIVER IN PERSON|TRUCK|ckly across the unusual, unusu +7105|1088|24|6|24|23737.92|0.08|0.07|R|F|1993-08-07|1993-09-16|1993-08-13|NONE|MAIL|e against the pinto beans. express asy +7106|527|28|1|36|51390.72|0.03|0.00|A|F|1992-08-10|1992-06-22|1992-08-13|TAKE BACK RETURN|SHIP|y carefully ironic account +7106|1553|34|2|41|59636.55|0.01|0.05|R|F|1992-05-30|1992-07-10|1992-06-18|DELIVER IN PERSON|SHIP|ual requests use against the slyly re +7106|696|97|3|15|23950.35|0.00|0.02|A|F|1992-08-06|1992-07-11|1992-08-08|DELIVER IN PERSON|SHIP|blithely. blithely silent theodol +7106|1026|97|4|26|24102.52|0.01|0.07|A|F|1992-06-10|1992-08-03|1992-07-07|COLLECT COD|AIR|ts cajole carefully +7106|325|10|5|44|53914.08|0.07|0.01|A|F|1992-05-23|1992-08-06|1992-06-10|TAKE BACK RETURN|MAIL|deposits sleep. dependencies +7106|1062|68|6|7|6741.42|0.01|0.05|R|F|1992-05-14|1992-07-07|1992-05-22|COLLECT COD|AIR|. blithely special escapades th +7106|1607|49|7|43|64869.80|0.01|0.04|A|F|1992-08-16|1992-06-28|1992-09-09|TAKE BACK RETURN|MAIL|fter the carefully ironic waters. theod +7107|424|83|1|25|33110.50|0.04|0.03|A|F|1992-01-13|1992-02-20|1992-01-25|COLLECT COD|RAIL| the regular, final pint +7107|711|12|2|31|49963.01|0.04|0.08|R|F|1992-04-15|1992-03-21|1992-04-18|TAKE BACK RETURN|MAIL|nto beans. final, regular packages boost al +7107|370|27|3|21|26677.77|0.04|0.03|A|F|1992-01-31|1992-02-25|1992-02-23|DELIVER IN PERSON|RAIL|t platelets after the quick cour +7107|1934|67|4|38|69765.34|0.03|0.00|R|F|1992-03-30|1992-02-29|1992-04-06|DELIVER IN PERSON|REG AIR| regular th +7107|628|22|5|17|25986.54|0.04|0.01|A|F|1992-03-23|1992-02-11|1992-04-09|DELIVER IN PERSON|SHIP|se accounts. slyly regular excuses int +7107|1451|69|6|1|1352.45|0.08|0.00|A|F|1992-02-10|1992-04-01|1992-03-05|COLLECT COD|REG AIR|ias affix furiously. even r +7107|1942|43|7|44|81133.36|0.02|0.02|R|F|1992-02-16|1992-02-14|1992-03-11|DELIVER IN PERSON|TRUCK|onic braids against th +7108|664|58|1|39|61021.74|0.09|0.06|N|O|1996-04-02|1996-05-16|1996-04-11|DELIVER IN PERSON|FOB|egular packages haggle a +7108|600|1|2|29|43517.40|0.01|0.00|N|O|1996-05-17|1996-04-23|1996-06-02|NONE|FOB|wake carefully about the blithely expres +7109|1743|70|1|24|39473.76|0.00|0.05|N|O|1996-10-01|1996-09-20|1996-10-20|COLLECT COD|MAIL|inal dugouts nag +7109|1889|90|2|13|23281.44|0.02|0.06|N|O|1996-10-07|1996-09-02|1996-10-25|DELIVER IN PERSON|RAIL|usual packages. even d +7109|600|91|3|29|43517.40|0.03|0.00|N|O|1996-07-28|1996-07-29|1996-08-10|DELIVER IN PERSON|SHIP|unts. quickly special deposits are +7109|334|35|4|11|13577.63|0.02|0.03|N|O|1996-09-13|1996-09-20|1996-10-05|TAKE BACK RETURN|AIR|sts cajole regular, regular requ +7110|1024|95|1|8|7400.16|0.00|0.05|N|O|1995-08-31|1995-10-01|1995-09-26|COLLECT COD|MAIL|y ironic dep +7110|566|27|2|37|54262.72|0.04|0.00|N|O|1995-11-08|1995-09-24|1995-11-20|COLLECT COD|MAIL| haggle car +7111|1142|15|1|22|22949.08|0.04|0.06|N|O|1996-12-24|1997-01-29|1996-12-28|COLLECT COD|SHIP|y bold accounts are bl +7111|966|35|2|36|67210.56|0.07|0.05|N|O|1997-01-13|1996-12-07|1997-02-10|TAKE BACK RETURN|AIR|fluffily. furious +7136|1015|86|1|14|12824.14|0.10|0.06|A|F|1994-06-12|1994-04-28|1994-06-28|TAKE BACK RETURN|MAIL|press multi +7136|783|48|2|48|80821.44|0.02|0.01|A|F|1994-05-14|1994-06-19|1994-05-24|DELIVER IN PERSON|FOB|gage across the theodoli +7136|1169|70|3|40|42806.40|0.02|0.02|R|F|1994-03-27|1994-06-09|1994-04-12|TAKE BACK RETURN|AIR|uctions. carefully bo +7136|1387|2|4|34|43804.92|0.01|0.02|A|F|1994-07-13|1994-06-15|1994-08-02|DELIVER IN PERSON|REG AIR|avely even requests wak +7136|564|55|5|37|54188.72|0.07|0.08|A|F|1994-06-17|1994-06-15|1994-06-23|COLLECT COD|SHIP| use even, +7136|1056|57|6|42|40196.10|0.09|0.04|A|F|1994-06-29|1994-06-21|1994-07-27|NONE|TRUCK|und the regular deposits. carefully regula +7136|1540|81|7|29|41804.66|0.05|0.07|A|F|1994-06-29|1994-05-29|1994-07-20|NONE|AIR|ntain quickly excuses. quickly +7137|1232|33|1|21|23797.83|0.05|0.05|N|O|1995-09-22|1995-09-01|1995-10-17|TAKE BACK RETURN|RAIL|lly express platelets. carefully silent +7137|1451|91|2|20|27049.00|0.00|0.00|N|O|1995-10-11|1995-09-11|1995-11-10|TAKE BACK RETURN|TRUCK|sits sleep at th +7138|958|93|1|36|66922.20|0.08|0.07|N|O|1998-06-21|1998-06-22|1998-07-02|NONE|TRUCK|furiously even instructions. fl +7138|818|52|2|42|72190.02|0.04|0.02|N|O|1998-06-06|1998-08-03|1998-06-18|NONE|MAIL|elieve. blithely special foxes h +7138|1087|23|3|24|23713.92|0.02|0.08|N|O|1998-06-19|1998-06-25|1998-06-21|DELIVER IN PERSON|TRUCK|lets. silent dolphins are careful +7138|724|57|4|2|3249.44|0.08|0.01|N|O|1998-07-11|1998-06-28|1998-08-07|TAKE BACK RETURN|MAIL|oldly around the slyly regular +7138|1015|21|5|31|28396.31|0.08|0.05|N|O|1998-05-29|1998-06-21|1998-06-07|NONE|TRUCK| according +7139|833|34|1|20|34676.60|0.08|0.05|N|O|1996-08-11|1996-09-13|1996-09-09|NONE|MAIL|e express acco +7140|1944|89|1|8|14767.52|0.09|0.04|A|F|1994-03-02|1994-04-13|1994-03-18|NONE|REG AIR|ly express requests. quickly unusual +7140|1380|19|2|37|47411.06|0.07|0.04|R|F|1994-03-24|1994-04-12|1994-04-17|COLLECT COD|TRUCK|ts use blithely after the pending +7140|1436|15|3|9|12036.87|0.02|0.02|A|F|1994-05-13|1994-03-27|1994-05-26|COLLECT COD|AIR|ic requests use-- blithely e +7141|1890|91|1|32|57340.48|0.10|0.03|N|O|1996-10-17|1996-08-26|1996-10-30|TAKE BACK RETURN|FOB|uriously silent instructions. +7141|1992|93|2|31|58713.69|0.06|0.08|N|O|1996-11-16|1996-10-15|1996-12-02|DELIVER IN PERSON|RAIL|he express requests. final accounts bre +7141|336|21|3|32|39562.56|0.03|0.05|N|O|1996-09-04|1996-10-01|1996-09-05|TAKE BACK RETURN|RAIL| final, special requ +7141|1515|96|4|8|11332.08|0.04|0.04|N|O|1996-11-11|1996-10-07|1996-12-11|DELIVER IN PERSON|MAIL|express foxes nag. ca +7141|1684|8|5|45|71355.60|0.08|0.06|N|O|1996-10-29|1996-09-14|1996-11-19|TAKE BACK RETURN|REG AIR|ccounts promise accor +7141|986|55|6|21|39626.58|0.08|0.03|N|O|1996-07-21|1996-10-04|1996-08-05|COLLECT COD|FOB| accounts except the +7142|578|79|1|43|63578.51|0.05|0.06|N|O|1995-09-17|1995-09-02|1995-10-17|NONE|SHIP| theodolites. acc +7142|1595|36|2|24|35918.16|0.07|0.08|N|O|1995-11-07|1995-09-14|1995-11-15|COLLECT COD|MAIL|final pinto beans sleep across the sp +7142|410|98|3|9|11793.69|0.00|0.08|N|O|1995-08-01|1995-10-03|1995-08-05|COLLECT COD|AIR| packages. bold +7142|1165|74|4|48|51175.68|0.05|0.08|N|O|1995-09-13|1995-10-09|1995-10-09|DELIVER IN PERSON|AIR|ndencies. +7143|1999|88|1|1|1900.99|0.04|0.07|N|O|1998-02-17|1997-12-18|1998-03-07|DELIVER IN PERSON|REG AIR|es along t +7168|1069|70|1|13|12610.78|0.00|0.02|N|O|1998-01-23|1998-01-24|1998-02-10|COLLECT COD|SHIP|. packages haggle slyly a +7168|603|35|2|48|72172.80|0.05|0.08|N|O|1998-04-15|1998-01-24|1998-05-14|TAKE BACK RETURN|MAIL|iments run bol +7168|768|33|3|21|35043.96|0.08|0.07|N|O|1998-02-21|1998-02-14|1998-03-09|NONE|AIR| nag. excuses are according to the slyly +7168|1914|3|4|42|76268.22|0.00|0.04|N|O|1998-02-15|1998-03-11|1998-03-06|COLLECT COD|SHIP|luffily among +7168|94|45|5|39|38769.51|0.05|0.01|N|O|1998-03-04|1998-03-11|1998-03-30|DELIVER IN PERSON|REG AIR|e slyly accou +7168|859|93|6|10|17598.50|0.04|0.06|N|O|1998-02-20|1998-02-09|1998-03-15|DELIVER IN PERSON|TRUCK|kly even deposits-- quickly regular dep +7168|1432|33|7|47|62671.21|0.02|0.02|N|O|1998-02-11|1998-01-23|1998-03-04|TAKE BACK RETURN|AIR|refully stealthily regular pinto beans. sl +7169|1255|56|1|37|42781.25|0.02|0.02|A|F|1993-06-09|1993-06-23|1993-07-09|TAKE BACK RETURN|REG AIR|o beans. silent ideas haggle? careful +7169|1367|6|2|36|45660.96|0.07|0.05|R|F|1993-06-20|1993-05-03|1993-07-09|COLLECT COD|AIR|jole along +7169|1388|3|3|11|14183.18|0.03|0.08|A|F|1993-07-23|1993-06-24|1993-08-13|DELIVER IN PERSON|REG AIR|above the carefully reg +7169|1706|7|4|31|49838.70|0.04|0.05|A|F|1993-05-30|1993-05-23|1993-06-08|DELIVER IN PERSON|RAIL|e fluffily. ironic, u +7169|597|28|5|36|53913.24|0.07|0.01|R|F|1993-06-12|1993-05-21|1993-06-27|COLLECT COD|REG AIR|xes; dependencies haggle slyl +7170|1840|41|1|33|57480.72|0.03|0.07|N|O|1998-02-15|1997-12-15|1998-02-28|DELIVER IN PERSON|AIR|es wake! final +7170|959|94|2|22|40918.90|0.10|0.06|N|O|1998-02-08|1997-12-25|1998-02-11|NONE|MAIL|t the regular packages. quickly +7170|1567|88|3|3|4405.68|0.06|0.01|N|O|1997-11-01|1998-01-04|1997-11-09|NONE|AIR|n orbits! ironic packages along the even p +7170|1158|95|4|40|42366.00|0.03|0.04|N|O|1997-11-11|1998-01-23|1997-12-09|DELIVER IN PERSON|SHIP|ess instructions. blithely unusual the +7171|782|15|1|14|23558.92|0.03|0.02|A|F|1995-04-13|1995-05-15|1995-04-27|COLLECT COD|RAIL|oxes. quickly silent inst +7171|1181|90|2|4|4328.72|0.01|0.08|A|F|1995-05-19|1995-03-29|1995-06-11|COLLECT COD|FOB|ly quickly unu +7171|1765|50|3|40|66670.40|0.05|0.07|A|F|1995-05-11|1995-04-10|1995-05-17|COLLECT COD|REG AIR| after the silent pin +7171|925|94|4|46|83992.32|0.01|0.03|R|F|1995-05-17|1995-04-13|1995-05-29|TAKE BACK RETURN|SHIP|leep quickly. +7171|295|77|5|12|14343.48|0.03|0.03|A|F|1995-03-31|1995-03-28|1995-04-29|TAKE BACK RETURN|TRUCK|blithely ironic excuses cajole fu +7171|266|67|6|13|15161.38|0.02|0.06|R|F|1995-04-07|1995-03-27|1995-04-15|DELIVER IN PERSON|MAIL|refully exp +7171|1910|11|7|40|72476.40|0.01|0.01|A|F|1995-03-01|1995-04-24|1995-03-13|DELIVER IN PERSON|MAIL|iers promi +7172|799|64|1|8|13598.32|0.09|0.03|N|O|1997-12-18|1997-12-04|1998-01-10|TAKE BACK RETURN|SHIP|leep against the quickly regular req +7172|1308|9|2|44|53209.20|0.00|0.05|N|O|1997-11-12|1997-12-02|1997-11-24|NONE|AIR| fluffily express +7172|1084|55|3|12|11820.96|0.05|0.07|N|O|1997-11-13|1998-01-14|1997-11-28|TAKE BACK RETURN|RAIL|l theodolites. bold instructions detect fl +7172|1186|23|4|31|33702.58|0.05|0.08|N|O|1997-12-17|1998-01-04|1997-12-27|DELIVER IN PERSON|SHIP|ts unwind carefully after +7173|378|63|1|2|2556.74|0.10|0.05|R|F|1992-11-08|1992-09-26|1992-11-15|COLLECT COD|MAIL|carefully regular theodo +7173|828|95|2|19|32847.58|0.06|0.06|A|F|1992-09-22|1992-09-10|1992-09-27|COLLECT COD|FOB|s. stealthy deposits u +7174|87|38|1|31|30599.48|0.00|0.01|A|F|1992-05-20|1992-05-12|1992-06-05|COLLECT COD|RAIL|carefully even r +7174|629|61|2|2|3059.24|0.00|0.07|R|F|1992-03-27|1992-05-06|1992-04-01|NONE|MAIL|l requests cajole busily enticingly +7174|954|57|3|7|12984.65|0.10|0.04|R|F|1992-04-09|1992-04-14|1992-04-14|DELIVER IN PERSON|RAIL|lyly final theodolites. quickly careful i +7174|656|57|4|24|37359.60|0.08|0.02|A|F|1992-03-24|1992-04-11|1992-04-11|TAKE BACK RETURN|AIR|oss the furiously express grouches haggle +7175|1144|53|1|15|15677.10|0.09|0.03|R|F|1993-06-08|1993-04-06|1993-06-30|NONE|TRUCK| express ideas about +7200|1183|84|1|16|17346.88|0.10|0.01|R|F|1994-01-01|1993-10-16|1994-01-14|TAKE BACK RETURN|AIR|lar sheaves-- fluffily final asymptote +7200|134|13|2|25|25853.25|0.05|0.06|A|F|1993-10-20|1993-11-13|1993-11-01|NONE|TRUCK|g dolphins us +7200|1369|84|3|16|20325.76|0.06|0.06|A|F|1993-10-13|1993-11-03|1993-11-07|TAKE BACK RETURN|AIR|y slyly even theodolites! quickly even pi +7200|245|46|4|17|19469.08|0.07|0.02|A|F|1993-12-15|1993-11-21|1993-12-18|NONE|FOB|theodolites wake car +7200|786|83|5|29|48916.62|0.08|0.03|R|F|1993-12-01|1993-12-05|1993-12-10|COLLECT COD|REG AIR|gside of the furiou +7200|496|97|6|49|68428.01|0.09|0.00|R|F|1993-11-19|1993-10-29|1993-12-13|DELIVER IN PERSON|RAIL|inal foxes sleep inside the fluffily regula +7200|1375|52|7|29|37014.73|0.02|0.05|A|F|1993-09-22|1993-10-12|1993-10-02|DELIVER IN PERSON|TRUCK|ual packages cajole ca +7201|1855|42|1|25|43921.25|0.10|0.01|N|O|1996-08-04|1996-05-24|1996-08-19|DELIVER IN PERSON|SHIP|ld requests against +7202|267|95|1|22|25679.72|0.01|0.06|N|O|1996-07-27|1996-08-25|1996-07-31|COLLECT COD|REG AIR| carefully even +7202|1558|59|2|41|59841.55|0.08|0.01|N|O|1996-07-10|1996-08-31|1996-08-04|DELIVER IN PERSON|REG AIR|n warhorses. never regular accounts affix +7202|1190|63|3|15|16367.85|0.06|0.06|N|O|1996-07-21|1996-07-19|1996-07-26|TAKE BACK RETURN|FOB|y of the express, iro +7202|1078|84|4|50|48953.50|0.10|0.04|N|O|1996-08-03|1996-08-07|1996-08-30|DELIVER IN PERSON|TRUCK|gular packages. blithely ruthless platelets +7202|1240|41|5|21|23966.04|0.08|0.06|N|O|1996-09-30|1996-07-17|1996-10-08|COLLECT COD|TRUCK|y. carefully regular asymptote +7203|1031|37|1|26|24232.78|0.05|0.02|R|F|1994-03-11|1994-02-19|1994-03-17|DELIVER IN PERSON|SHIP| bold deposits. q +7203|963|98|2|50|93198.00|0.07|0.02|R|F|1994-01-19|1994-03-29|1994-02-04|TAKE BACK RETURN|MAIL|slyly express, express ideas! slyly fu +7204|1779|80|1|42|70592.34|0.00|0.08|N|O|1996-02-18|1996-03-27|1996-03-19|DELIVER IN PERSON|AIR|e the quickly express ideas s +7204|588|79|2|34|50611.72|0.08|0.03|N|O|1996-04-13|1996-02-10|1996-05-04|TAKE BACK RETURN|MAIL|elets detect slyly regular requ +7204|1594|75|3|10|14955.90|0.09|0.04|N|O|1996-03-30|1996-02-12|1996-04-29|NONE|RAIL|s cajole alo +7205|80|81|1|42|41163.36|0.08|0.05|R|F|1994-10-07|1994-10-10|1994-10-09|DELIVER IN PERSON|TRUCK|ently ironic foxes +7205|863|63|2|12|21166.32|0.01|0.05|R|F|1994-09-12|1994-09-20|1994-09-22|COLLECT COD|RAIL|gular deposits. requests s +7205|1865|95|3|22|38870.92|0.02|0.06|R|F|1994-08-17|1994-10-12|1994-09-06|COLLECT COD|AIR|ckly: final foxes are about t +7205|1567|8|4|23|33776.88|0.07|0.00|A|F|1994-11-03|1994-09-13|1994-11-28|NONE|SHIP|sits. requests are slyly according +7205|522|23|5|27|38408.04|0.04|0.01|R|F|1994-10-06|1994-10-04|1994-10-14|TAKE BACK RETURN|TRUCK|ts boost blithely even ideas. b +7205|1341|56|6|44|54662.96|0.07|0.01|A|F|1994-11-01|1994-09-10|1994-11-03|DELIVER IN PERSON|TRUCK|xcuses haggle carefully accounts. r +7206|699|100|1|3|4799.07|0.00|0.07|R|F|1994-05-30|1994-05-21|1994-06-17|COLLECT COD|MAIL|detect carefully blithely unu +7207|1144|53|1|47|49121.58|0.00|0.07|N|O|1998-06-16|1998-04-05|1998-07-04|COLLECT COD|AIR|ful theodolites across the sly +7207|230|12|2|13|14692.99|0.06|0.07|N|O|1998-05-06|1998-04-16|1998-05-14|COLLECT COD|FOB|refully bold fo +7207|142|43|3|4|4168.56|0.09|0.00|N|O|1998-04-18|1998-04-15|1998-05-08|NONE|FOB|es affix even +7207|12|13|4|28|25536.28|0.00|0.04|N|O|1998-05-01|1998-04-19|1998-05-28|TAKE BACK RETURN|REG AIR|e doggedly. furiously special packages aga +7232|1677|1|1|47|74197.49|0.01|0.00|N|O|1998-06-23|1998-04-29|1998-06-27|TAKE BACK RETURN|AIR|ts. furiously regular packages sle +7232|812|12|2|7|11989.67|0.06|0.02|N|O|1998-04-18|1998-06-24|1998-05-14|COLLECT COD|REG AIR|ccording to the furiously express deposi +7232|417|76|3|7|9221.87|0.01|0.02|N|O|1998-04-24|1998-06-03|1998-04-29|COLLECT COD|MAIL|aggle pending instructions. slyly final as +7233|697|98|1|25|39942.25|0.07|0.05|N|O|1996-11-27|1997-01-13|1996-12-01|COLLECT COD|REG AIR|rding to the even ideas. pending foxes +7233|1049|50|2|37|35151.48|0.05|0.00|N|O|1997-01-05|1996-12-23|1997-01-10|COLLECT COD|MAIL| deposits +7234|561|62|1|4|5846.24|0.00|0.05|N|O|1998-10-06|1998-08-25|1998-10-18|COLLECT COD|MAIL|dinos sublat +7235|260|42|1|5|5801.30|0.02|0.06|N|O|1996-11-01|1996-11-15|1996-11-23|NONE|REG AIR|the ironic, special deposi +7235|709|6|2|42|67607.40|0.09|0.08|N|O|1997-01-19|1996-11-12|1997-01-29|NONE|SHIP|eodolites sleep fluffily +7235|346|31|3|13|16202.42|0.03|0.02|N|O|1996-12-31|1996-12-19|1997-01-07|TAKE BACK RETURN|MAIL|tes. carefully ironi +7236|1095|1|1|21|20917.89|0.09|0.05|A|F|1993-02-20|1993-03-30|1993-03-08|COLLECT COD|MAIL|ealthy, express th +7236|1341|56|2|27|33543.18|0.03|0.06|A|F|1993-02-03|1993-02-14|1993-03-05|TAKE BACK RETURN|REG AIR|slyly final deposits dazzle furiously re +7236|1741|26|3|29|47639.46|0.05|0.08|R|F|1993-04-27|1993-04-01|1993-05-18|TAKE BACK RETURN|RAIL|carefully final deposits. fur +7236|1744|87|4|36|59246.64|0.00|0.07|R|F|1993-02-14|1993-02-16|1993-03-12|COLLECT COD|TRUCK| wake furiously around th +7237|1673|15|1|10|15746.70|0.07|0.03|N|O|1998-02-17|1998-03-12|1998-03-02|COLLECT COD|RAIL|ect furiously a +7237|1057|63|2|23|22035.15|0.05|0.06|N|O|1998-05-13|1998-02-22|1998-05-14|DELIVER IN PERSON|AIR|ic, ironic ideas. s +7237|1237|75|3|20|22764.60|0.03|0.07|N|O|1998-05-02|1998-02-24|1998-05-25|COLLECT COD|MAIL|nts. ironic ideas wake quickly a +7238|1680|22|1|44|69593.92|0.00|0.07|N|O|1998-05-11|1998-06-01|1998-05-31|DELIVER IN PERSON|RAIL|egrate according to th +7238|64|40|2|49|47238.94|0.10|0.02|N|O|1998-04-28|1998-05-14|1998-05-02|DELIVER IN PERSON|REG AIR|. furiously bold accounts wake carefully +7238|1528|29|3|47|67187.44|0.08|0.00|N|O|1998-03-29|1998-04-24|1998-04-14|TAKE BACK RETURN|REG AIR|ecial, express deposits. regular depend +7239|1644|68|1|36|55643.04|0.06|0.02|N|O|1995-09-12|1995-09-13|1995-09-19|DELIVER IN PERSON|RAIL|hely ruthless e +7239|160|87|2|24|25443.84|0.01|0.08|N|O|1995-08-08|1995-08-30|1995-08-12|COLLECT COD|RAIL| furiously quick foxes subla +7264|811|45|1|18|30812.58|0.08|0.08|N|O|1998-04-08|1998-05-05|1998-05-01|NONE|SHIP|es. regular packages dazzle pendin +7264|1248|49|2|22|25283.28|0.10|0.03|N|O|1998-04-22|1998-04-30|1998-04-30|TAKE BACK RETURN|AIR|nts. closely regular +7264|1725|52|3|32|52055.04|0.00|0.05|N|O|1998-05-21|1998-04-25|1998-06-18|NONE|MAIL|the regular, regular theodolites. c +7264|285|86|4|45|53337.60|0.05|0.00|N|O|1998-04-15|1998-04-25|1998-04-24|COLLECT COD|REG AIR|kly. packages after the even pa +7265|364|93|1|26|32873.36|0.03|0.02|N|O|1995-11-20|1996-02-08|1995-12-10|DELIVER IN PERSON|REG AIR|nding deposits kindle +7265|245|100|2|15|17178.60|0.06|0.03|N|O|1995-11-27|1996-02-11|1995-12-13|TAKE BACK RETURN|MAIL|unts sleep among the carefully final pl +7266|1565|66|1|27|39597.12|0.06|0.02|N|O|1996-08-23|1996-08-29|1996-08-25|TAKE BACK RETURN|AIR| the slyly ironic dolphins. carefully +7266|305|34|2|8|9642.40|0.00|0.06|N|O|1996-10-06|1996-09-24|1996-10-15|COLLECT COD|FOB|ependencies. regular dependencies haggle +7266|1833|34|3|4|6939.32|0.03|0.06|N|O|1996-11-13|1996-10-18|1996-11-21|NONE|FOB| carefully final deposits i +7266|1765|50|4|26|43335.76|0.03|0.03|N|O|1996-07-22|1996-08-23|1996-08-15|DELIVER IN PERSON|TRUCK|o beans integrate carefully special +7267|1341|56|1|40|49693.60|0.08|0.03|A|F|1992-11-11|1992-10-09|1992-11-13|TAKE BACK RETURN|FOB|s cajole slyly along the furiously fi +7267|665|66|2|36|56363.76|0.07|0.04|R|F|1992-10-25|1992-10-04|1992-11-13|COLLECT COD|TRUCK| on the unusual, final depen +7267|1570|71|3|37|54448.09|0.03|0.08|R|F|1992-10-17|1992-11-24|1992-11-03|NONE|REG AIR|accounts. pending +7267|50|1|4|49|46552.45|0.05|0.07|A|F|1992-11-01|1992-11-05|1992-11-14|COLLECT COD|AIR| deposits haggle before the carefully +7267|633|96|5|47|72080.61|0.00|0.08|A|F|1992-09-23|1992-10-17|1992-10-04|COLLECT COD|RAIL|es. slyly regular +7268|1168|77|1|48|51319.68|0.06|0.07|N|O|1997-02-01|1996-12-31|1997-02-23|NONE|MAIL|uests. blithely ironic instructions ha +7268|1493|33|2|5|6972.45|0.10|0.02|N|O|1997-01-18|1996-12-20|1997-02-05|NONE|AIR|y about the +7269|196|49|1|48|52617.12|0.07|0.07|A|F|1994-09-18|1994-10-19|1994-10-10|TAKE BACK RETURN|MAIL|ainst the foxes. ironic reques +7270|1020|26|1|48|44208.96|0.04|0.05|N|O|1998-04-11|1998-03-09|1998-04-24|TAKE BACK RETURN|FOB|. furiously +7270|1424|64|2|29|38437.18|0.05|0.05|N|O|1998-02-20|1998-04-23|1998-02-22|COLLECT COD|REG AIR| instructions. even, r +7270|1308|47|3|6|7255.80|0.10|0.06|N|O|1998-02-26|1998-03-12|1998-03-07|COLLECT COD|AIR|, pending accounts cajole furiou +7270|725|58|4|24|39017.28|0.02|0.01|N|O|1998-03-24|1998-03-18|1998-04-03|NONE|RAIL|press foxes +7270|1662|86|5|40|62546.40|0.08|0.00|N|O|1998-02-06|1998-04-22|1998-03-08|TAKE BACK RETURN|TRUCK|nic accounts. quickly +7270|530|61|6|45|64373.85|0.09|0.08|N|O|1998-05-16|1998-04-24|1998-06-14|NONE|TRUCK|sits sleep alongside of +7271|1456|96|1|1|1357.45|0.06|0.08|N|O|1998-08-14|1998-10-14|1998-08-23|NONE|AIR|its sublate furio +7271|1137|10|2|43|44639.59|0.06|0.06|N|O|1998-09-29|1998-10-14|1998-10-12|DELIVER IN PERSON|REG AIR|lar deposits. slyly bold packages mainta +7271|1397|98|3|4|5193.56|0.05|0.01|N|O|1998-09-04|1998-09-01|1998-09-25|DELIVER IN PERSON|FOB|ess, regular courts detect b +7271|1257|32|4|8|9266.00|0.10|0.06|N|O|1998-10-06|1998-10-16|1998-11-04|DELIVER IN PERSON|AIR| requests haggle. quiet deposits run blith +7271|377|34|5|17|21715.29|0.09|0.03|N|O|1998-09-30|1998-10-26|1998-10-05|TAKE BACK RETURN|SHIP| blithely fluffily final deposits. regu +7271|22|98|6|42|38724.84|0.05|0.04|N|O|1998-11-07|1998-10-01|1998-11-08|TAKE BACK RETURN|SHIP|egular multipliers. final platele +7296|1156|29|1|12|12685.80|0.04|0.03|N|O|1996-12-14|1997-01-08|1996-12-30|DELIVER IN PERSON|FOB| boldly blithely ironic pinto beans. un +7297|925|60|1|35|63907.20|0.03|0.05|A|F|1994-11-30|1994-11-20|1994-12-27|NONE|RAIL|ual deposits nag quick +7297|769|70|2|25|41744.00|0.06|0.05|R|F|1994-10-09|1994-10-29|1994-10-23|DELIVER IN PERSON|FOB|ously evenly final requests. eve +7297|1314|29|3|36|43751.16|0.09|0.05|R|F|1994-11-08|1994-11-16|1994-11-17|DELIVER IN PERSON|TRUCK|ajole fluffily regular platelets. +7297|978|79|4|7|13152.79|0.06|0.00|R|F|1994-11-28|1994-11-20|1994-12-01|NONE|SHIP|ctions. unusual, +7297|851|18|5|14|24525.90|0.02|0.04|R|F|1994-11-27|1994-12-12|1994-12-12|TAKE BACK RETURN|FOB|y. final requests detect. expre +7297|241|23|6|27|30813.48|0.06|0.03|A|F|1994-09-18|1994-12-11|1994-10-14|COLLECT COD|REG AIR|eans detect against the ev +7297|707|8|7|20|32154.00|0.10|0.06|A|F|1994-12-02|1994-12-12|1994-12-05|COLLECT COD|REG AIR| requests are among the sly +7298|1350|89|1|43|53808.05|0.02|0.04|N|O|1997-10-18|1997-09-01|1997-11-10|DELIVER IN PERSON|FOB|even accounts are alongside of the even, +7298|1972|5|2|21|39353.37|0.10|0.03|N|O|1997-07-12|1997-08-31|1997-07-31|NONE|SHIP|. bold, final dependencies af +7298|231|59|3|1|1131.23|0.06|0.01|N|O|1997-10-05|1997-08-27|1997-10-15|TAKE BACK RETURN|FOB|refully. fluffily even braids haggle bli +7298|1580|81|4|22|32594.76|0.08|0.04|N|O|1997-07-24|1997-09-28|1997-08-16|NONE|REG AIR| carefully furiously express +7299|339|40|1|37|45855.21|0.04|0.01|R|F|1992-06-03|1992-04-27|1992-06-08|NONE|REG AIR| Tiresias +7299|672|4|2|12|18872.04|0.06|0.01|A|F|1992-05-18|1992-04-19|1992-06-03|DELIVER IN PERSON|TRUCK|y regular requests sublate after +7299|582|73|3|23|34099.34|0.09|0.04|A|F|1992-03-11|1992-04-13|1992-04-04|TAKE BACK RETURN|MAIL|y ironic platelets cajole r +7300|708|73|1|16|25739.20|0.09|0.06|R|F|1994-05-08|1994-04-27|1994-06-04|COLLECT COD|MAIL|lly final accounts. som +7300|421|22|2|32|42285.44|0.03|0.00|R|F|1994-06-27|1994-05-21|1994-07-18|TAKE BACK RETURN|MAIL|r theodolites above the quietl +7300|953|54|3|25|46348.75|0.08|0.08|A|F|1994-04-22|1994-06-09|1994-05-04|COLLECT COD|TRUCK|ent foxes boost +7300|1243|18|4|4|4576.96|0.08|0.06|A|F|1994-05-07|1994-04-24|1994-05-27|NONE|REG AIR|luffily careful gifts caj +7300|497|27|5|21|29347.29|0.00|0.06|A|F|1994-07-19|1994-05-06|1994-08-01|DELIVER IN PERSON|MAIL| the express platelets cajole blith +7300|346|47|6|39|48607.26|0.00|0.05|R|F|1994-04-05|1994-04-19|1994-04-29|COLLECT COD|FOB|al somas integ +7300|261|62|7|50|58063.00|0.08|0.00|A|F|1994-06-04|1994-05-12|1994-06-09|DELIVER IN PERSON|AIR|excuses. slyly ironic instructio +7301|1142|79|1|32|33380.48|0.00|0.07|R|F|1994-02-25|1994-02-18|1994-03-20|DELIVER IN PERSON|AIR|ickly after the asymptotes. +7302|1709|36|1|36|57985.20|0.01|0.04|N|O|1995-06-18|1995-05-14|1995-07-16|TAKE BACK RETURN|REG AIR|uests. furiously final packages +7302|208|36|2|18|19947.60|0.00|0.05|A|F|1995-04-07|1995-05-29|1995-04-26|TAKE BACK RETURN|FOB|al asymptotes. carefu +7303|331|88|1|34|41865.22|0.06|0.05|R|F|1993-07-27|1993-08-06|1993-08-01|TAKE BACK RETURN|REG AIR|s sleep carefully at th +7303|1848|49|2|23|40246.32|0.01|0.04|A|F|1993-07-01|1993-08-23|1993-07-11|DELIVER IN PERSON|AIR|ourts above the bold multipliers sleep afte +7328|1962|7|1|39|72694.44|0.10|0.04|N|O|1998-06-24|1998-07-18|1998-07-17|TAKE BACK RETURN|SHIP| ironically enticing dolphins. +7328|804|5|2|18|30686.40|0.06|0.06|N|O|1998-05-22|1998-06-04|1998-05-26|NONE|REG AIR|ckly. special accounts acc +7328|1095|1|3|40|39843.60|0.01|0.02|N|O|1998-08-09|1998-05-30|1998-08-18|DELIVER IN PERSON|SHIP|o beans engage carefu +7328|387|44|4|15|19310.70|0.05|0.05|N|O|1998-07-31|1998-05-25|1998-08-13|TAKE BACK RETURN|SHIP| deposits wake furiously ac +7328|283|84|5|28|33131.84|0.04|0.06|N|O|1998-06-21|1998-06-01|1998-06-28|DELIVER IN PERSON|SHIP|ular gifts cajole. +7328|1759|44|6|17|28232.75|0.03|0.06|N|O|1998-04-30|1998-07-02|1998-05-04|TAKE BACK RETURN|FOB|c escapades cajole fluffily always ironic +7328|298|26|7|8|9586.32|0.01|0.06|N|O|1998-08-18|1998-06-27|1998-09-11|NONE|AIR|e regular, ironic packages. regul +7329|1374|75|1|40|51014.80|0.01|0.07|N|O|1996-12-15|1996-11-21|1997-01-08|DELIVER IN PERSON|FOB|s sleep furiously slyly regular plat +7329|517|8|2|7|9922.57|0.04|0.01|N|O|1996-10-16|1997-01-01|1996-11-01|TAKE BACK RETURN|AIR|deposits was +7329|1622|64|3|35|53326.70|0.09|0.05|N|O|1996-10-08|1996-11-12|1996-10-15|TAKE BACK RETURN|MAIL| blithely blithely +7329|1986|31|4|13|24543.74|0.08|0.04|N|O|1996-10-12|1996-12-25|1996-11-10|TAKE BACK RETURN|MAIL|f the slyly regular accounts? f +7329|1426|5|5|28|37167.76|0.06|0.07|N|O|1997-01-20|1996-12-30|1997-01-26|NONE|TRUCK|haggle. even deposits engage furio +7330|396|53|1|45|58337.55|0.08|0.08|N|O|1998-09-04|1998-09-28|1998-09-09|COLLECT COD|AIR|ously final tithes. fluffily r +7330|140|93|2|34|35364.76|0.10|0.05|N|O|1998-10-04|1998-10-06|1998-10-09|NONE|RAIL|otes cajole slyly theodolites-- furiousl +7330|683|84|3|47|74432.96|0.04|0.02|N|O|1998-10-08|1998-09-28|1998-10-12|COLLECT COD|REG AIR|gular deposits cajole slyly ex +7330|608|40|4|5|7543.00|0.05|0.08|N|O|1998-07-18|1998-09-03|1998-08-09|NONE|FOB|he fluffily special ideas. pending foxes c +7330|599|60|5|42|62982.78|0.02|0.08|N|O|1998-07-15|1998-09-07|1998-07-20|DELIVER IN PERSON|SHIP|refully express foxes wake regularly. blit +7331|423|11|1|22|29115.24|0.00|0.05|N|O|1996-08-26|1996-08-28|1996-09-13|DELIVER IN PERSON|AIR|y pending deposits. final deposits after +7331|1829|30|2|13|22500.66|0.02|0.07|N|O|1996-09-27|1996-08-27|1996-10-10|DELIVER IN PERSON|MAIL|unusual, even asymptotes. +7331|299|81|3|10|11992.90|0.08|0.08|N|O|1996-10-04|1996-10-20|1996-10-23|TAKE BACK RETURN|SHIP|old instructions was express, regular pi +7331|1960|49|4|17|31653.32|0.09|0.08|N|O|1996-09-16|1996-09-13|1996-09-27|COLLECT COD|SHIP|elets boost among the ironic accounts. +7331|177|78|5|31|33392.27|0.01|0.00|N|O|1996-10-04|1996-09-20|1996-10-07|COLLECT COD|AIR|. furiously pending asymptotes +7331|1705|48|6|43|69088.10|0.00|0.08|N|O|1996-07-28|1996-09-18|1996-08-21|COLLECT COD|SHIP|ly express instr +7332|399|56|1|16|20790.24|0.10|0.01|N|O|1996-11-28|1996-09-18|1996-12-02|COLLECT COD|MAIL|express foxe +7332|1178|87|2|50|53958.50|0.00|0.01|N|O|1996-09-17|1996-11-06|1996-10-07|NONE|TRUCK|outside the fin +7332|799|64|3|1|1699.79|0.08|0.04|N|O|1996-11-07|1996-10-20|1996-11-28|NONE|MAIL|ly regular requests lo +7332|1780|81|4|17|28590.26|0.07|0.07|N|O|1996-10-04|1996-10-23|1996-10-24|NONE|REG AIR|pendencies wake blithely. +7332|58|9|5|7|6706.35|0.04|0.04|N|O|1996-09-12|1996-09-20|1996-09-19|COLLECT COD|TRUCK|ding to the blithely pe +7333|1697|98|1|45|71941.05|0.06|0.05|N|O|1996-11-06|1996-12-13|1996-12-06|DELIVER IN PERSON|FOB|ies. furiously +7333|411|99|2|3|3934.23|0.00|0.00|N|O|1996-10-15|1996-11-25|1996-10-26|NONE|RAIL| dependencies poach; slyly pending acc +7334|91|67|1|23|22795.07|0.02|0.04|N|O|1997-11-24|1997-10-27|1997-12-12|NONE|RAIL|carefully even requests. regu +7334|914|15|2|32|58077.12|0.07|0.02|N|O|1997-09-08|1997-10-21|1997-10-07|TAKE BACK RETURN|AIR|fully regu +7334|86|62|3|16|15777.28|0.08|0.04|N|O|1997-08-16|1997-10-03|1997-09-15|NONE|FOB|usual deposits bo +7334|1835|79|4|5|8684.15|0.08|0.00|N|O|1997-09-19|1997-09-30|1997-10-15|COLLECT COD|AIR| slyly unusual foxes are furi +7335|1952|85|1|45|83427.75|0.02|0.08|R|F|1993-09-26|1993-07-11|1993-10-26|COLLECT COD|TRUCK|ajole always blithely final deposit +7335|533|24|2|6|8601.18|0.08|0.02|A|F|1993-06-11|1993-08-25|1993-06-22|NONE|RAIL| ironic packages haggle blithely fina +7335|1826|56|3|42|72568.44|0.05|0.03|A|F|1993-07-24|1993-08-11|1993-08-14|DELIVER IN PERSON|SHIP|, regular ideas after the carefully eve +7335|1538|39|4|19|27351.07|0.06|0.07|A|F|1993-08-27|1993-08-26|1993-09-18|DELIVER IN PERSON|TRUCK|ckly bold pinto beans haggle. express fo +7335|310|67|5|31|37519.61|0.09|0.06|A|F|1993-07-12|1993-07-26|1993-08-11|DELIVER IN PERSON|TRUCK| beans about t +7360|1802|3|1|33|56225.40|0.06|0.03|N|O|1998-02-19|1998-01-12|1998-02-28|COLLECT COD|TRUCK|uickly. quickly regular hockey +7361|1085|56|1|42|41415.36|0.09|0.05|A|F|1994-10-13|1994-11-30|1994-11-05|NONE|SHIP|as. unusual requests detect. slyly s +7361|1891|78|2|32|57372.48|0.02|0.02|A|F|1995-01-14|1994-12-10|1995-02-04|NONE|FOB| blithely across the e +7361|1696|79|3|25|39942.25|0.10|0.06|R|F|1994-12-12|1994-11-16|1994-12-14|COLLECT COD|FOB|carefully final accounts ca +7361|914|15|4|38|68966.58|0.00|0.03|A|F|1995-01-31|1994-12-18|1995-02-20|COLLECT COD|FOB|telets. slyly bold +7361|269|97|5|15|17538.90|0.10|0.01|A|F|1994-10-16|1994-12-17|1994-10-25|TAKE BACK RETURN|SHIP|y. carefully bold instruc +7361|478|37|6|34|46867.98|0.04|0.03|A|F|1994-12-18|1994-12-16|1994-12-30|DELIVER IN PERSON|REG AIR|lar asymptotes. blithely ste +7362|1618|60|1|1|1519.61|0.02|0.01|R|F|1994-12-20|1995-02-09|1994-12-28|TAKE BACK RETURN|REG AIR|ns cajole slyly +7362|1828|29|2|36|62273.52|0.03|0.02|A|F|1994-11-24|1994-12-31|1994-12-05|TAKE BACK RETURN|MAIL|lets hinder quickly. silent, fi +7363|216|17|1|31|34602.51|0.05|0.03|A|F|1993-12-21|1993-12-15|1994-01-06|TAKE BACK RETURN|RAIL|press pearls sleep quickly among th +7363|1294|32|2|18|21515.22|0.09|0.01|R|F|1994-01-03|1994-01-04|1994-01-29|DELIVER IN PERSON|AIR|e accounts. slyly quick instr +7364|1191|92|1|50|54609.50|0.08|0.07|R|F|1994-07-12|1994-07-19|1994-07-27|COLLECT COD|MAIL|ual, final requests use blithely. +7364|752|17|2|18|29749.50|0.08|0.00|A|F|1994-07-27|1994-07-29|1994-08-23|COLLECT COD|RAIL|ver stealthy w +7364|1661|44|3|20|31253.20|0.10|0.01|A|F|1994-08-07|1994-08-04|1994-08-19|TAKE BACK RETURN|MAIL|hely above the silen +7365|476|77|1|35|48176.45|0.04|0.03|N|O|1998-05-29|1998-05-25|1998-06-11|DELIVER IN PERSON|SHIP|eans about the requests sn +7365|108|87|2|17|17137.70|0.05|0.00|N|O|1998-06-28|1998-05-17|1998-07-16|COLLECT COD|SHIP|fully above the furiously silent +7365|184|63|3|44|47703.92|0.02|0.02|N|O|1998-07-03|1998-05-07|1998-07-07|NONE|AIR|ts use slyly. blithely regular requests +7365|1022|28|4|30|27690.60|0.04|0.03|N|O|1998-05-23|1998-04-06|1998-05-25|NONE|REG AIR|y bold foxes. carefully ir +7365|1174|83|5|41|44081.97|0.07|0.00|N|O|1998-04-24|1998-05-03|1998-05-11|DELIVER IN PERSON|AIR|slyly special accounts +7366|1856|57|1|19|33399.15|0.02|0.07|R|F|1994-06-17|1994-04-17|1994-07-07|COLLECT COD|REG AIR|uriously pending packa +7366|782|83|2|27|45435.06|0.10|0.02|A|F|1994-07-10|1994-05-14|1994-08-05|NONE|TRUCK|s. even dugouts after the carefully ironic +7367|1062|63|1|29|27928.74|0.03|0.02|N|O|1995-07-17|1995-08-22|1995-07-18|TAKE BACK RETURN|AIR|ly across the s +7367|1924|25|2|24|43822.08|0.01|0.03|N|O|1995-06-28|1995-07-06|1995-07-12|NONE|AIR|ructions. slyly ironic p +7367|1492|71|3|14|19508.86|0.03|0.06|N|O|1995-07-24|1995-08-08|1995-08-07|NONE|MAIL|e accounts. fluffily unu +7367|1973|6|4|15|28124.55|0.08|0.05|N|O|1995-08-06|1995-07-16|1995-08-20|NONE|TRUCK|dolites cajole furiously around the ironic, +7392|828|29|1|21|36305.22|0.10|0.02|N|O|1996-07-05|1996-06-24|1996-07-29|COLLECT COD|TRUCK| nag blithely after the slyly +7392|1834|21|2|20|34716.60|0.00|0.05|N|O|1996-06-14|1996-07-12|1996-07-02|TAKE BACK RETURN|REG AIR|s. asymptotes detect furiously fluffil +7392|58|59|3|18|17244.90|0.02|0.05|N|O|1996-05-08|1996-07-02|1996-05-26|DELIVER IN PERSON|FOB|arefully across the stealthy, re +7392|789|22|4|49|82799.22|0.06|0.08|N|O|1996-05-25|1996-06-08|1996-06-13|DELIVER IN PERSON|MAIL|xpress instructions +7392|390|75|5|11|14194.29|0.02|0.00|N|O|1996-05-02|1996-06-18|1996-05-28|TAKE BACK RETURN|AIR|ndencies. final, final accounts +7393|641|4|1|11|16958.04|0.08|0.01|N|O|1996-01-13|1996-02-21|1996-02-09|DELIVER IN PERSON|TRUCK|idle packages up th +7393|984|85|2|35|65974.30|0.06|0.06|N|O|1996-04-12|1996-01-29|1996-05-04|TAKE BACK RETURN|SHIP| final deposits are carefu +7393|1908|97|3|48|86875.20|0.05|0.01|N|O|1996-02-25|1996-02-25|1996-03-06|TAKE BACK RETURN|MAIL|ual, final sheaves are slyly a +7393|969|38|4|22|41139.12|0.00|0.07|N|O|1996-03-28|1996-02-04|1996-04-14|DELIVER IN PERSON|FOB|. quickly speci +7393|715|48|5|4|6462.84|0.03|0.03|N|O|1996-02-29|1996-03-06|1996-03-06|DELIVER IN PERSON|MAIL|fully. close deposits +7394|706|7|1|25|40167.50|0.09|0.03|N|O|1998-07-16|1998-09-13|1998-08-06|NONE|SHIP|oss the furiously special packages. deposit +7394|8|59|2|17|15436.00|0.02|0.01|N|O|1998-09-18|1998-08-11|1998-10-18|TAKE BACK RETURN|SHIP|en instructions. enticing, special accounts +7394|493|81|3|1|1393.49|0.07|0.04|N|O|1998-10-31|1998-08-13|1998-11-29|TAKE BACK RETURN|AIR|refully iro +7394|183|10|4|32|34661.76|0.00|0.03|N|O|1998-08-07|1998-09-23|1998-09-05|DELIVER IN PERSON|MAIL|counts cajole furiously +7395|803|4|1|4|6815.20|0.09|0.08|N|O|1998-02-23|1998-04-15|1998-03-25|DELIVER IN PERSON|SHIP|into beans. slyly idle deposits across +7395|337|94|2|27|33407.91|0.02|0.06|N|O|1998-03-09|1998-02-27|1998-03-26|COLLECT COD|RAIL| theodolites use qu +7395|214|42|3|44|49025.24|0.02|0.02|N|O|1998-05-14|1998-04-18|1998-06-11|TAKE BACK RETURN|RAIL|. pending ideas haggle f +7395|1013|84|4|28|25592.28|0.10|0.04|N|O|1998-03-23|1998-03-20|1998-04-18|TAKE BACK RETURN|FOB| ironic deposits boost +7395|1521|42|5|21|29872.92|0.00|0.03|N|O|1998-03-23|1998-04-08|1998-04-07|DELIVER IN PERSON|TRUCK|ld requests +7395|1284|59|6|43|50967.04|0.00|0.03|N|O|1998-04-08|1998-03-04|1998-04-22|NONE|RAIL|ular accounts. fluffily ironic theodolit +7396|1849|79|1|41|71784.44|0.01|0.05|N|O|1998-04-28|1998-04-01|1998-05-06|TAKE BACK RETURN|MAIL|r deposits? unusual instructions are fur +7396|409|68|2|9|11784.60|0.03|0.04|N|O|1998-04-16|1998-02-13|1998-05-01|TAKE BACK RETURN|FOB|fluffily. b +7397|1575|16|1|9|13289.13|0.08|0.04|R|F|1994-09-06|1994-06-28|1994-09-07|TAKE BACK RETURN|FOB|ular, pending theodolites. furiously +7398|1148|21|1|3|3147.42|0.05|0.03|R|F|1994-09-08|1994-07-19|1994-09-13|TAKE BACK RETURN|FOB|te. blithely pending dep +7398|536|37|2|18|25857.54|0.08|0.01|A|F|1994-06-16|1994-07-25|1994-06-28|DELIVER IN PERSON|MAIL|fily special instructions. gifts +7398|1722|65|3|10|16237.20|0.10|0.00|A|F|1994-07-09|1994-07-17|1994-08-06|COLLECT COD|REG AIR|to beans wak +7398|1974|63|4|12|22511.64|0.02|0.02|R|F|1994-07-31|1994-07-11|1994-08-16|DELIVER IN PERSON|SHIP|posits. carefully ruthless dependencies ab +7398|1414|32|5|15|19731.15|0.02|0.07|R|F|1994-06-19|1994-07-29|1994-06-22|NONE|SHIP|s requests. blithely ironic deposits wa +7398|547|38|6|20|28950.80|0.06|0.07|R|F|1994-09-05|1994-07-07|1994-10-03|COLLECT COD|MAIL|carefully. blithely regular +7398|1054|90|7|40|38202.00|0.07|0.03|R|F|1994-07-04|1994-07-11|1994-07-09|COLLECT COD|AIR|special request +7399|1571|72|1|21|30923.97|0.06|0.02|N|O|1997-09-07|1997-10-31|1997-09-15|DELIVER IN PERSON|REG AIR|e after the furiousl +7399|1516|97|2|7|9922.57|0.04|0.03|N|O|1997-09-14|1997-09-11|1997-10-13|NONE|REG AIR|ickly express pinto beans. theod +7399|1410|28|3|37|48522.17|0.09|0.08|N|O|1997-09-12|1997-09-13|1997-09-17|TAKE BACK RETURN|SHIP|s. careful +7399|1090|26|4|8|7928.72|0.08|0.03|N|O|1997-10-17|1997-10-25|1997-11-06|TAKE BACK RETURN|AIR|ccounts boost alongside of the ironic +7399|959|60|5|43|79977.85|0.00|0.03|N|O|1997-10-06|1997-09-25|1997-10-09|NONE|AIR| pending platelets haggle above +7399|1288|26|6|38|45192.64|0.00|0.06|N|O|1997-09-13|1997-09-30|1997-09-14|COLLECT COD|REG AIR| special, special packages cajole c +7424|1581|62|1|6|8895.48|0.00|0.06|N|O|1998-07-12|1998-07-15|1998-07-26|NONE|FOB|e theodolites. +7425|817|84|1|34|58405.54|0.03|0.04|N|O|1997-10-25|1997-11-05|1997-11-04|NONE|REG AIR|nto beans grow carefu +7425|899|66|2|21|37797.69|0.10|0.00|N|O|1997-09-29|1997-11-16|1997-10-02|NONE|REG AIR|y bold theodolites. final packages sleep +7425|549|40|3|8|11596.32|0.04|0.07|N|O|1997-09-26|1997-11-26|1997-10-10|TAKE BACK RETURN|AIR|ndencies sleep about the final platelets. f +7426|77|53|1|15|14656.05|0.00|0.04|A|F|1995-05-11|1995-02-19|1995-05-16|DELIVER IN PERSON|FOB|egular requests. unus +7427|1882|12|1|21|37461.48|0.08|0.03|A|F|1993-02-05|1993-01-28|1993-03-03|NONE|FOB|cial pinto beans cajole blithely. fur +7427|366|67|2|31|39257.16|0.09|0.00|R|F|1993-01-14|1993-03-08|1993-01-19|DELIVER IN PERSON|TRUCK|to beans wi +7427|208|63|3|32|35462.40|0.08|0.01|R|F|1992-12-25|1993-02-17|1993-01-14|NONE|FOB|ly dogged theodolites cajole furiously. ex +7427|454|55|4|19|25734.55|0.08|0.02|A|F|1992-12-20|1993-01-19|1993-01-15|COLLECT COD|AIR|fix carefully. blithe +7427|1201|39|5|28|30861.60|0.01|0.02|R|F|1993-02-27|1993-02-27|1993-03-06|NONE|FOB|lithely bold accounts. f +7427|1303|42|6|45|54193.50|0.07|0.03|R|F|1993-02-08|1993-01-26|1993-02-22|COLLECT COD|AIR|e carefully. foxes sleep furious +7427|9|35|7|29|26361.00|0.09|0.02|R|F|1993-02-23|1993-02-27|1993-03-04|DELIVER IN PERSON|FOB| blithe instructions wake furiously a +7428|1223|35|1|46|51714.12|0.02|0.01|N|O|1997-08-15|1997-10-07|1997-09-01|DELIVER IN PERSON|FOB|e quickly. carefully +7428|1413|31|2|38|49947.58|0.02|0.01|N|O|1997-11-02|1997-09-22|1997-11-03|DELIVER IN PERSON|SHIP|re among the carefully r +7429|1067|38|1|21|20329.26|0.00|0.04|A|F|1993-08-05|1993-08-21|1993-08-20|NONE|REG AIR| regular asymptotes. +7429|632|33|2|29|44446.27|0.03|0.03|A|F|1993-09-13|1993-08-15|1993-09-23|COLLECT COD|RAIL|ar deposits. quickly silent pack +7429|1014|85|3|13|11895.13|0.03|0.02|A|F|1993-08-23|1993-07-31|1993-09-22|NONE|FOB|gged ideas affix slyl +7429|1820|21|4|42|72316.44|0.03|0.03|R|F|1993-09-09|1993-08-24|1993-09-21|NONE|MAIL|y daring instructio +7430|700|1|1|17|27211.90|0.02|0.06|A|F|1993-06-29|1993-07-22|1993-07-28|NONE|SHIP| furiously pending requests. special, +7430|1932|21|2|39|71523.27|0.05|0.03|A|F|1993-07-04|1993-08-18|1993-07-13|DELIVER IN PERSON|MAIL|the theodolites. quickly re +7431|37|63|1|26|24362.78|0.05|0.08|R|F|1994-06-09|1994-07-18|1994-07-02|TAKE BACK RETURN|SHIP|the furiously even +7431|1423|2|2|10|13244.20|0.07|0.03|A|F|1994-07-08|1994-07-09|1994-07-30|NONE|RAIL|boost carefully. a +7431|842|43|3|46|80170.64|0.04|0.04|R|F|1994-07-07|1994-07-20|1994-07-19|TAKE BACK RETURN|SHIP|ins. express courts wake fu +7456|1467|46|1|48|65686.08|0.10|0.00|N|O|1997-04-05|1997-05-04|1997-04-07|NONE|AIR|s. regular ideas detect carefull +7456|1953|54|2|25|46373.75|0.05|0.01|N|O|1997-05-20|1997-05-13|1997-06-12|COLLECT COD|MAIL|deposits. quick +7456|1912|1|3|39|70742.49|0.04|0.08|N|O|1997-03-30|1997-06-02|1997-04-03|NONE|MAIL|. even, regular platel +7457|1045|81|1|19|17974.76|0.05|0.02|R|F|1994-01-07|1993-12-11|1994-02-01|NONE|RAIL| ideas poach carefully +7457|314|71|2|30|36429.30|0.02|0.04|R|F|1993-10-05|1993-12-12|1993-11-01|DELIVER IN PERSON|RAIL|. bold, final deposit +7457|1322|23|3|11|13456.52|0.02|0.08|R|F|1993-10-21|1993-12-26|1993-10-30|DELIVER IN PERSON|TRUCK|out the slyly ironic accounts. +7457|1072|73|4|46|44761.22|0.02|0.02|A|F|1993-10-05|1993-11-28|1993-10-15|COLLECT COD|TRUCK|es. carefully final +7457|188|15|5|16|17410.88|0.04|0.03|R|F|1993-10-31|1993-12-13|1993-11-08|DELIVER IN PERSON|RAIL|fluffily regular pinto bean +7457|492|80|6|46|64054.54|0.09|0.01|R|F|1993-10-03|1993-11-26|1993-11-01|COLLECT COD|MAIL|y. furiously special accounts unwin +7458|1555|56|1|41|59718.55|0.07|0.02|R|F|1992-07-22|1992-06-24|1992-08-15|NONE|SHIP|accounts. final, ironic plate +7458|2|53|2|13|11726.00|0.10|0.00|A|F|1992-06-12|1992-05-18|1992-07-02|DELIVER IN PERSON|SHIP|sual instructions. caref +7458|559|20|3|1|1459.55|0.02|0.03|A|F|1992-06-22|1992-05-16|1992-06-29|COLLECT COD|REG AIR|regular platelets. quick, f +7458|565|66|4|13|19052.28|0.02|0.04|A|F|1992-04-30|1992-05-05|1992-05-12|DELIVER IN PERSON|RAIL|dle packages! final deposits alongside o +7458|455|14|5|17|23042.65|0.03|0.05|R|F|1992-06-07|1992-07-02|1992-06-13|COLLECT COD|FOB|inal theodolites. ironic acc +7458|234|16|6|6|6805.38|0.10|0.04|R|F|1992-05-16|1992-06-19|1992-06-01|NONE|TRUCK|luffily ironic, express fox +7459|477|65|1|24|33059.28|0.05|0.01|N|O|1997-06-12|1997-07-16|1997-06-14|NONE|MAIL|ges. regular, unusual accoun +7459|238|20|2|4|4552.92|0.07|0.02|N|O|1997-08-01|1997-08-04|1997-08-15|DELIVER IN PERSON|REG AIR|uriously ironic reque +7459|1239|14|3|25|28505.75|0.04|0.04|N|O|1997-06-16|1997-07-26|1997-07-10|COLLECT COD|REG AIR|cajole slowly. slyly final a +7460|374|31|1|25|31859.25|0.07|0.06|N|O|1996-08-06|1996-06-25|1996-08-30|NONE|SHIP|al packages h +7461|1452|31|1|7|9474.15|0.05|0.08|A|F|1994-01-16|1994-04-04|1994-01-21|TAKE BACK RETURN|MAIL|c asymptotes. ins +7461|1033|39|2|26|24284.78|0.07|0.00|R|F|1994-02-02|1994-03-03|1994-02-14|COLLECT COD|RAIL|ckages haggle boldly fl +7461|943|44|3|15|27659.10|0.07|0.03|A|F|1994-01-28|1994-03-04|1994-02-09|COLLECT COD|REG AIR| beans sleep carefully into t +7461|1817|4|4|38|65314.78|0.05|0.00|A|F|1994-03-24|1994-03-08|1994-04-22|DELIVER IN PERSON|TRUCK|equests. unusual, regular dep +7461|1923|56|5|10|18249.20|0.02|0.05|A|F|1994-01-24|1994-03-06|1994-01-31|TAKE BACK RETURN|SHIP|uests. carefully pending pinto be +7461|1650|51|6|2|3103.30|0.10|0.07|A|F|1994-02-10|1994-04-07|1994-03-09|NONE|REG AIR|e express requests. f +7461|1223|98|7|20|22484.40|0.08|0.02|A|F|1994-04-29|1994-04-05|1994-05-20|COLLECT COD|AIR|slyly ironic pinto beans +7462|1096|32|1|46|45866.14|0.00|0.08|A|F|1995-05-02|1995-04-30|1995-05-09|COLLECT COD|MAIL| of the carefully ironic +7462|1503|4|2|35|49157.50|0.04|0.08|R|F|1995-03-22|1995-05-17|1995-04-20|TAKE BACK RETURN|RAIL| carefully pending notornis. qui +7462|621|84|3|2|3043.24|0.07|0.01|A|F|1995-03-23|1995-03-28|1995-04-08|DELIVER IN PERSON|TRUCK|inal packages caj +7462|140|67|4|46|47846.44|0.08|0.01|A|F|1995-05-03|1995-05-13|1995-06-02|COLLECT COD|MAIL|along the regularly ironic deposits. q +7462|1633|16|5|5|7673.15|0.04|0.08|N|F|1995-06-17|1995-05-12|1995-06-22|TAKE BACK RETURN|SHIP|usly regular theodolites nag carefully +7463|1036|37|1|34|31859.02|0.10|0.00|N|O|1997-12-09|1997-09-19|1997-12-23|NONE|FOB|ickly carefully specia +7463|1861|5|2|49|86380.14|0.05|0.03|N|O|1997-09-02|1997-10-18|1997-09-11|DELIVER IN PERSON|REG AIR|regular accounts. finally express courts s +7463|762|59|3|6|9976.56|0.08|0.06|N|O|1997-10-06|1997-09-24|1997-10-07|NONE|FOB|side of the slyly furious platelets affi +7463|1871|72|4|15|26593.05|0.02|0.07|N|O|1997-10-07|1997-11-08|1997-10-23|NONE|AIR|, even requests: slyly express theod +7463|1981|70|5|15|28244.70|0.03|0.06|N|O|1997-09-27|1997-09-14|1997-10-17|DELIVER IN PERSON|AIR|ickly ironic packages! theodolites u +7463|1022|93|6|11|10153.22|0.10|0.08|N|O|1997-09-14|1997-10-02|1997-09-16|DELIVER IN PERSON|RAIL|regular platelets cajole +7488|1599|80|1|48|72028.32|0.04|0.04|A|F|1992-08-20|1992-07-10|1992-08-29|COLLECT COD|AIR|und the courts: ironic instructions cajo +7488|214|69|2|12|13370.52|0.08|0.04|R|F|1992-06-28|1992-06-14|1992-07-01|TAKE BACK RETURN|TRUCK|iously slow packages. bold pack +7488|1737|64|3|22|36052.06|0.01|0.04|A|F|1992-06-19|1992-07-12|1992-06-27|DELIVER IN PERSON|SHIP|ngside of th +7488|462|21|4|39|53135.94|0.01|0.08|R|F|1992-05-23|1992-06-04|1992-06-05|DELIVER IN PERSON|AIR|s are slyly across the final acc +7489|1199|36|1|38|41807.22|0.02|0.01|A|F|1993-12-31|1993-12-11|1994-01-17|NONE|MAIL|heodolites aff +7489|734|31|2|36|58850.28|0.09|0.05|R|F|1993-11-03|1993-12-06|1993-11-25|NONE|AIR|uickly final deposits +7490|433|21|1|21|28002.03|0.00|0.06|A|F|1995-01-06|1994-11-26|1995-01-22|DELIVER IN PERSON|RAIL|ic ideas kindle slyly. sometimes special t +7490|1279|54|2|25|29506.75|0.01|0.00|A|F|1994-10-29|1995-01-19|1994-11-05|NONE|SHIP| haggle quickl +7490|1559|40|3|39|56961.45|0.09|0.04|R|F|1995-01-04|1995-01-01|1995-01-29|TAKE BACK RETURN|MAIL|tes haggle blithely final accounts. requ +7490|421|9|4|18|23785.56|0.07|0.05|A|F|1994-11-18|1994-12-11|1994-12-01|NONE|FOB|kages hagg +7491|1496|97|1|8|11179.92|0.00|0.02|N|O|1998-04-30|1998-06-28|1998-05-02|TAKE BACK RETURN|AIR|ptotes. regular pat +7491|1482|22|2|46|63640.08|0.09|0.08|N|O|1998-08-02|1998-05-26|1998-08-19|NONE|AIR|s. quickly regular realms about +7491|902|37|3|28|50481.20|0.07|0.08|N|O|1998-08-20|1998-07-17|1998-09-12|TAKE BACK RETURN|MAIL|nic sentiments +7492|355|12|1|17|21340.95|0.05|0.02|N|O|1996-08-09|1996-08-26|1996-08-29|DELIVER IN PERSON|AIR|blithely bus +7492|283|65|2|38|44964.64|0.03|0.00|N|O|1996-10-09|1996-08-05|1996-10-20|COLLECT COD|SHIP|ts at the furiously unusual foxes +7493|641|42|1|11|16958.04|0.02|0.02|A|F|1995-03-10|1995-02-16|1995-03-19|DELIVER IN PERSON|SHIP|xcuses beneath the blithely e +7493|1303|80|2|44|52989.20|0.00|0.07|A|F|1995-03-15|1995-03-15|1995-03-28|DELIVER IN PERSON|FOB|ss platelets +7494|526|57|1|44|62766.88|0.07|0.07|N|O|1996-06-08|1996-06-19|1996-06-12|DELIVER IN PERSON|TRUCK|ickly across the bold, unusu +7494|607|70|2|4|6030.40|0.10|0.06|N|O|1996-04-11|1996-05-31|1996-04-29|NONE|RAIL|ick, final requests +7495|169|70|1|7|7484.12|0.03|0.00|R|F|1994-11-12|1995-01-08|1994-12-06|DELIVER IN PERSON|TRUCK|ons might +7495|1754|81|2|13|21524.75|0.10|0.02|R|F|1995-01-17|1995-02-01|1995-02-14|TAKE BACK RETURN|TRUCK|e slyly bold courts. +7520|1083|84|1|45|44283.60|0.08|0.04|N|O|1997-03-26|1997-03-23|1997-04-24|DELIVER IN PERSON|MAIL|egrate blith +7520|1385|24|2|13|16722.94|0.06|0.06|N|O|1997-05-16|1997-03-31|1997-05-26|TAKE BACK RETURN|FOB|yly regula +7520|935|36|3|2|3671.86|0.03|0.02|N|O|1997-04-12|1997-02-27|1997-04-19|NONE|FOB|the finally final ideas. pe +7520|863|64|4|22|38804.92|0.01|0.00|N|O|1997-03-08|1997-03-26|1997-04-02|TAKE BACK RETURN|RAIL|ously special deposit +7520|628|60|5|42|64202.04|0.02|0.03|N|O|1997-02-01|1997-03-16|1997-03-03|NONE|MAIL|pinto beans-- special accounts haggle f +7521|1235|10|1|26|29541.98|0.04|0.04|A|F|1995-05-29|1995-03-31|1995-06-07|COLLECT COD|AIR|le above the final, ironic asymptotes. sl +7521|1713|14|2|29|46826.59|0.03|0.03|R|F|1995-04-03|1995-04-30|1995-04-29|TAKE BACK RETURN|REG AIR|s packages across the f +7521|26|77|3|27|25002.54|0.09|0.06|N|O|1995-06-18|1995-04-29|1995-06-21|NONE|REG AIR|courts again +7522|262|17|1|15|17433.90|0.10|0.04|N|O|1997-02-18|1997-02-04|1997-03-14|NONE|SHIP|s. carefully regular pinto +7522|1333|34|2|12|14811.96|0.04|0.08|N|O|1996-12-26|1997-02-10|1997-01-15|NONE|SHIP|ly even frets play ac +7522|1866|67|3|3|5303.58|0.06|0.02|N|O|1997-02-20|1997-02-18|1997-03-04|NONE|MAIL| accounts. ironic, express pinto beans bo +7522|1804|48|4|32|54585.60|0.00|0.03|N|O|1997-01-26|1997-01-18|1997-02-13|NONE|FOB|ng package +7522|44|95|5|48|45313.92|0.09|0.03|N|O|1996-12-21|1997-01-25|1996-12-23|DELIVER IN PERSON|SHIP|quickly even theodolites cajole blith +7522|1943|76|6|10|18449.40|0.09|0.07|N|O|1997-02-05|1997-02-13|1997-02-27|TAKE BACK RETURN|SHIP|usual requests. quick +7522|1841|42|7|43|74942.12|0.04|0.07|N|O|1996-12-17|1997-02-04|1997-01-02|DELIVER IN PERSON|MAIL|sly dogged deposits according t +7523|216|44|1|11|12278.31|0.08|0.04|N|O|1997-06-21|1997-05-11|1997-07-14|DELIVER IN PERSON|SHIP|s are blithely. ca +7523|1490|69|2|43|59834.07|0.03|0.07|N|O|1997-06-04|1997-06-11|1997-06-25|COLLECT COD|FOB|y across the furiously i +7523|714|79|3|36|58129.56|0.07|0.00|N|O|1997-07-30|1997-07-06|1997-08-11|NONE|FOB|s platelets +7523|896|97|4|44|79063.16|0.05|0.03|N|O|1997-06-02|1997-06-05|1997-06-25|NONE|SHIP|mptotes. blithely final re +7523|72|98|5|40|38882.80|0.03|0.06|N|O|1997-04-25|1997-06-01|1997-05-24|COLLECT COD|RAIL|nusual, special deposits! f +7523|508|9|6|40|56340.00|0.07|0.06|N|O|1997-06-01|1997-05-26|1997-06-16|DELIVER IN PERSON|MAIL|ffily unusual instructions do wake car +7523|1176|77|7|43|46318.31|0.09|0.04|N|O|1997-07-08|1997-06-04|1997-07-15|DELIVER IN PERSON|REG AIR| slyly fluffy deposits. blithely u +7524|875|9|1|2|3551.74|0.09|0.08|A|F|1992-08-09|1992-10-16|1992-08-13|TAKE BACK RETURN|FOB|blithely f +7524|1257|69|2|12|13899.00|0.04|0.07|R|F|1992-10-03|1992-10-11|1992-10-10|NONE|SHIP|s affix slyly above the +7524|1288|63|3|3|3567.84|0.08|0.01|A|F|1992-08-03|1992-09-17|1992-08-31|COLLECT COD|TRUCK|s according to +7524|383|40|4|28|35934.64|0.02|0.00|A|F|1992-11-15|1992-08-27|1992-11-18|NONE|SHIP|ges sleep carefully regular depths. ir +7524|1111|20|5|29|29351.19|0.05|0.04|A|F|1992-08-20|1992-10-12|1992-09-14|COLLECT COD|RAIL|pending ideas. quickly iron +7524|255|83|6|48|55452.00|0.00|0.06|R|F|1992-11-03|1992-10-06|1992-11-16|COLLECT COD|RAIL|s. slyly ironic foxes wake furiously. ca +7525|649|12|1|46|71283.44|0.10|0.02|N|O|1997-05-27|1997-05-19|1997-06-06|DELIVER IN PERSON|MAIL|n the ideas. blithely regular accounts +7525|267|49|2|7|8170.82|0.08|0.02|N|O|1997-04-25|1997-05-04|1997-05-03|COLLECT COD|AIR|ffix blithely regul +7526|1235|36|1|36|40904.28|0.04|0.01|N|O|1997-03-23|1997-03-12|1997-04-06|NONE|REG AIR|y pending theodolites wake about the p +7526|96|47|2|18|17929.62|0.00|0.02|N|O|1997-02-24|1997-02-25|1997-03-24|NONE|REG AIR|leep slyly within the enticing requests. s +7527|337|94|1|11|13610.63|0.01|0.08|A|F|1995-02-12|1995-02-24|1995-02-21|NONE|REG AIR|uriously e +7527|192|71|2|4|4368.76|0.04|0.00|A|F|1995-02-26|1995-02-17|1995-03-18|TAKE BACK RETURN|MAIL|he final accou +7527|147|48|3|13|13612.82|0.04|0.07|R|F|1995-03-31|1995-03-04|1995-04-29|TAKE BACK RETURN|MAIL|ccording to the final deposits. expr +7527|1971|60|4|28|52443.16|0.00|0.06|R|F|1995-01-05|1995-02-10|1995-01-14|TAKE BACK RETURN|AIR|lar asympto +7552|1211|49|1|49|54498.29|0.01|0.04|R|F|1993-01-05|1992-10-30|1993-01-06|COLLECT COD|FOB|ymptotes use. carefully express foxes +7552|1136|37|2|6|6222.78|0.04|0.01|A|F|1992-12-27|1992-11-17|1993-01-10|TAKE BACK RETURN|TRUCK|ong the unusual accounts are p +7553|635|29|1|30|46068.90|0.02|0.07|R|F|1993-08-31|1993-07-07|1993-09-25|NONE|FOB| ideas: ironic, even depende +7553|1594|75|2|11|16451.49|0.03|0.05|A|F|1993-05-14|1993-07-02|1993-06-01|NONE|MAIL|the fluffily reg +7553|981|84|3|49|92217.02|0.10|0.04|A|F|1993-08-08|1993-07-28|1993-08-29|TAKE BACK RETURN|REG AIR|lithely final, even deposits. +7553|748|45|4|40|65949.60|0.04|0.04|R|F|1993-06-29|1993-07-16|1993-07-13|DELIVER IN PERSON|SHIP|theodolites nag: quickly special in +7553|775|40|5|43|72058.11|0.07|0.05|R|F|1993-06-25|1993-06-13|1993-07-23|COLLECT COD|TRUCK|ns. deposits wake slyly above +7554|1123|96|1|2|2048.24|0.08|0.04|N|O|1996-07-28|1996-09-10|1996-08-22|TAKE BACK RETURN|REG AIR|s. furiously regular i +7554|1447|48|2|13|17529.72|0.08|0.08|N|O|1996-09-18|1996-08-02|1996-10-16|COLLECT COD|TRUCK|pecial theodolites sleep furiously. slyl +7554|65|91|3|8|7720.48|0.01|0.01|N|O|1996-10-09|1996-08-25|1996-10-12|COLLECT COD|TRUCK| regular ideas about the +7554|1206|7|4|1|1107.20|0.05|0.01|N|O|1996-10-15|1996-08-12|1996-11-12|NONE|REG AIR|ic courts use around the quick +7555|1060|31|1|47|45169.82|0.01|0.01|N|O|1996-01-19|1996-04-10|1996-01-20|DELIVER IN PERSON|FOB|requests are carefully accordin +7555|411|99|2|35|45899.35|0.00|0.04|N|O|1996-04-06|1996-03-06|1996-04-16|TAKE BACK RETURN|MAIL|lly blithely regular ideas; t +7555|819|20|3|40|68792.40|0.08|0.06|N|O|1996-02-20|1996-02-18|1996-03-01|TAKE BACK RETURN|MAIL| quickly quickl +7556|16|67|1|18|16488.18|0.03|0.03|R|F|1994-01-01|1994-01-31|1994-01-09|DELIVER IN PERSON|REG AIR|cial requests affix. b +7556|33|59|2|36|33589.08|0.02|0.07|A|F|1994-03-10|1994-01-07|1994-03-28|TAKE BACK RETURN|FOB|unts cajole blithely blithely unusual ide +7557|1943|88|1|14|25829.16|0.09|0.01|N|O|1997-09-16|1997-08-31|1997-10-06|TAKE BACK RETURN|REG AIR|sts cajole ruthlessly alongside of th +7558|1422|1|1|28|37055.76|0.05|0.01|A|F|1994-03-11|1994-02-10|1994-03-25|DELIVER IN PERSON|RAIL|pinto beans cajole quickly final +7558|1000|1|2|50|45050.00|0.09|0.08|A|F|1994-02-06|1994-02-06|1994-02-21|DELIVER IN PERSON|SHIP|ously. blithely dogged acc +7559|983|86|1|6|11303.88|0.05|0.00|R|F|1993-10-20|1993-11-26|1993-11-12|DELIVER IN PERSON|SHIP|uickly furiously ironic grouches +7559|560|91|2|40|58422.40|0.04|0.07|R|F|1993-12-09|1993-12-08|1993-12-21|TAKE BACK RETURN|TRUCK|ts are. furiously +7559|1443|44|3|36|48399.84|0.08|0.00|R|F|1994-01-02|1993-11-16|1994-01-24|DELIVER IN PERSON|RAIL|lithely ironic frays. furiously r +7559|1492|71|4|46|64100.54|0.06|0.00|A|F|1994-01-01|1993-11-19|1994-01-26|NONE|FOB|hely even req +7559|1607|90|5|41|61852.60|0.08|0.08|R|F|1994-01-13|1993-12-28|1994-02-06|COLLECT COD|MAIL| the even, even deposits are quic +7559|1180|53|6|39|42166.02|0.02|0.03|R|F|1994-02-07|1993-12-13|1994-03-03|DELIVER IN PERSON|TRUCK| impress slyly final foxes. spec +7584|933|34|1|31|56851.83|0.10|0.06|N|O|1997-06-14|1997-05-14|1997-06-27|TAKE BACK RETURN|MAIL|ers. bold excuses are furious +7584|1676|18|2|1|1577.67|0.06|0.00|N|O|1997-06-19|1997-05-14|1997-07-01|DELIVER IN PERSON|TRUCK|y ironic packages around +7584|1518|99|3|13|18453.63|0.08|0.01|N|O|1997-04-23|1997-07-05|1997-05-05|DELIVER IN PERSON|AIR| braids cajole fluffily across the slowl +7584|479|38|4|40|55178.80|0.02|0.06|N|O|1997-06-07|1997-05-24|1997-07-01|NONE|REG AIR| even platelets. regular +7584|1466|84|5|6|8204.76|0.04|0.06|N|O|1997-05-03|1997-05-27|1997-05-20|DELIVER IN PERSON|MAIL|sly ruthless excuses play. packages h +7585|189|68|1|50|54459.00|0.00|0.07|N|F|1995-06-12|1995-06-26|1995-07-04|COLLECT COD|REG AIR|symptotes: packages impress care +7585|1401|19|2|13|16931.20|0.09|0.08|N|F|1995-06-11|1995-08-16|1995-06-30|TAKE BACK RETURN|FOB| excuses. pen +7585|1139|76|3|48|49926.24|0.04|0.03|N|O|1995-08-18|1995-07-11|1995-09-17|COLLECT COD|TRUCK| asymptotes +7585|1671|13|4|21|33026.07|0.06|0.03|N|O|1995-06-28|1995-07-27|1995-07-26|DELIVER IN PERSON|REG AIR|c foxes. special, special somas wa +7586|521|52|1|39|55439.28|0.09|0.06|N|O|1995-10-19|1995-08-14|1995-11-12|COLLECT COD|SHIP|lithely special instructions wake acro +7586|163|42|2|50|53158.00|0.10|0.00|N|O|1995-10-08|1995-09-19|1995-10-21|TAKE BACK RETURN|SHIP|inally final theodolite +7587|338|95|1|24|29719.92|0.04|0.02|A|F|1992-06-06|1992-03-20|1992-06-24|TAKE BACK RETURN|MAIL|s nag across the instructions. expr +7588|1116|25|1|3|3051.33|0.09|0.08|A|F|1993-03-08|1993-01-28|1993-03-15|NONE|AIR| stealthy instructions are furiously caref +7588|433|34|2|49|65338.07|0.02|0.00|R|F|1993-04-18|1993-03-16|1993-04-23|DELIVER IN PERSON|AIR|ake bold, fina +7588|518|79|3|37|52484.87|0.02|0.01|A|F|1993-03-19|1993-03-21|1993-04-08|COLLECT COD|MAIL|arefully across the carefu +7589|828|62|1|49|84712.18|0.10|0.05|N|O|1997-05-17|1997-07-03|1997-06-04|DELIVER IN PERSON|REG AIR|e slyly blithely +7589|1980|25|2|49|92217.02|0.00|0.07|N|O|1997-06-18|1997-06-07|1997-06-24|TAKE BACK RETURN|REG AIR|olites cajole slyly quickly silen +7589|708|9|3|5|8043.50|0.10|0.08|N|O|1997-05-18|1997-06-24|1997-06-10|COLLECT COD|SHIP|ts. theodolites doubt sl +7589|1232|33|4|24|27197.52|0.00|0.02|N|O|1997-05-03|1997-07-09|1997-05-31|DELIVER IN PERSON|REG AIR|uffily regular asymptotes. deposits g +7589|1237|12|5|40|45529.20|0.01|0.04|N|O|1997-06-25|1997-05-31|1997-07-23|TAKE BACK RETURN|REG AIR|ronic deposits. blithely final accounts +7590|1411|51|1|28|36747.48|0.08|0.07|N|O|1998-08-02|1998-06-21|1998-08-13|NONE|TRUCK|nag slyly furiously +7590|689|21|2|22|34972.96|0.09|0.08|N|O|1998-07-08|1998-06-05|1998-07-15|COLLECT COD|AIR|y regular theodolites about the deposi +7590|1695|19|3|13|20756.97|0.04|0.04|N|O|1998-05-09|1998-07-15|1998-05-18|NONE|AIR|en instruct +7590|290|45|4|49|58324.21|0.04|0.02|N|O|1998-05-01|1998-07-12|1998-05-05|NONE|SHIP|r excuses. slyly final +7591|1965|54|1|11|20536.56|0.01|0.00|R|F|1993-06-13|1993-07-24|1993-06-20|DELIVER IN PERSON|AIR|otes cajole of the carefully regular pint +7591|917|20|2|17|30904.47|0.07|0.01|R|F|1993-06-01|1993-06-24|1993-06-14|DELIVER IN PERSON|RAIL|c ideas. carefully ironic deposit +7591|1540|41|3|49|70635.46|0.10|0.00|A|F|1993-06-04|1993-08-05|1993-06-12|COLLECT COD|AIR|iet, express accounts. careful +7591|1442|21|4|22|29555.68|0.05|0.03|R|F|1993-07-11|1993-06-20|1993-08-07|NONE|MAIL|es are blithely even requests. bold packa +7591|1488|89|5|41|56968.68|0.03|0.02|A|F|1993-07-02|1993-07-21|1993-07-13|TAKE BACK RETURN|SHIP| carefully final account +7591|317|74|6|35|42605.85|0.05|0.08|R|F|1993-05-21|1993-07-10|1993-05-28|TAKE BACK RETURN|MAIL|pecial theodolites are quickly. unusual +7591|1034|40|7|7|6545.21|0.02|0.07|A|F|1993-05-29|1993-06-14|1993-06-15|COLLECT COD|MAIL|uests. blithely final pinto beans wi +7616|975|10|1|8|15007.76|0.01|0.05|R|F|1993-12-02|1993-12-22|1993-12-05|COLLECT COD|MAIL|r, enticing tithes nag carefull +7616|95|96|2|29|28857.61|0.04|0.02|A|F|1993-10-10|1993-12-06|1993-10-13|DELIVER IN PERSON|MAIL|es wake slyly furiousl +7616|1035|36|3|29|27144.87|0.05|0.07|R|F|1994-01-22|1993-12-10|1994-02-03|NONE|RAIL|y. furiously ironic accounts wake. fu +7617|520|11|1|47|66764.44|0.10|0.06|N|O|1998-09-19|1998-09-09|1998-09-27|NONE|AIR|xpress platelets. quickly +7617|749|14|2|24|39593.76|0.10|0.04|N|O|1998-07-31|1998-08-07|1998-08-18|NONE|AIR|y. requests +7617|403|4|3|28|36495.20|0.10|0.01|N|O|1998-06-23|1998-08-18|1998-07-22|DELIVER IN PERSON|MAIL| final ideas. regular deposits dazzle sl +7617|1716|1|4|40|64708.40|0.05|0.01|N|O|1998-08-08|1998-08-10|1998-08-17|DELIVER IN PERSON|RAIL|ular deposits alongside of the b +7617|1660|43|5|44|68713.04|0.08|0.02|N|O|1998-10-02|1998-08-16|1998-10-31|NONE|FOB|ual courts haggle carefully except th +7617|1323|100|6|44|53870.08|0.02|0.06|N|O|1998-10-01|1998-09-09|1998-10-29|COLLECT COD|AIR|lithely through the +7618|500|59|1|45|63022.50|0.08|0.00|R|F|1992-01-19|1992-02-06|1992-02-12|TAKE BACK RETURN|AIR|ckly pendi +7618|285|86|2|45|53337.60|0.02|0.03|R|F|1992-05-01|1992-03-03|1992-05-12|TAKE BACK RETURN|AIR|ickly regular idea +7618|1550|51|3|28|40643.40|0.03|0.08|R|F|1992-04-25|1992-02-18|1992-05-01|DELIVER IN PERSON|MAIL|e carefully ironic frets. furio +7618|138|17|4|47|48792.11|0.04|0.03|R|F|1992-02-05|1992-03-24|1992-02-11|NONE|TRUCK|d platelets boost silently +7618|1906|95|5|22|39773.80|0.05|0.01|R|F|1992-04-12|1992-03-02|1992-04-25|TAKE BACK RETURN|SHIP|aggle. bold +7618|1981|14|6|15|28244.70|0.05|0.05|A|F|1992-01-23|1992-02-09|1992-02-09|NONE|TRUCK|as along the fluffily even theodolites be +7618|1334|49|7|24|29647.92|0.08|0.03|R|F|1992-01-31|1992-03-09|1992-02-01|TAKE BACK RETURN|FOB| use around the +7619|454|42|1|10|13544.50|0.10|0.01|A|F|1993-12-11|1993-12-25|1993-12-19|NONE|MAIL|n deposits h +7619|184|85|2|26|28188.68|0.06|0.04|R|F|1994-02-02|1993-12-29|1994-02-27|TAKE BACK RETURN|TRUCK| sleep regula +7619|50|76|3|39|37051.95|0.08|0.04|A|F|1993-11-04|1994-01-06|1993-12-04|TAKE BACK RETURN|TRUCK|unts-- ironic, unusual instr +7620|1247|48|1|3|3444.72|0.03|0.05|A|F|1994-09-06|1994-08-14|1994-10-03|COLLECT COD|REG AIR| nag blithely +7621|929|32|1|6|10979.52|0.07|0.02|N|O|1997-06-08|1997-06-14|1997-06-21|COLLECT COD|MAIL| final acco +7621|1088|24|2|4|3956.32|0.07|0.06|N|O|1997-06-17|1997-05-08|1997-06-30|COLLECT COD|AIR|y ironic a +7621|283|84|3|45|53247.60|0.01|0.04|N|O|1997-06-15|1997-05-26|1997-06-26|TAKE BACK RETURN|REG AIR|ily; carefully even acco +7621|1364|41|4|14|17715.04|0.08|0.03|N|O|1997-06-07|1997-06-30|1997-07-06|COLLECT COD|RAIL|es alongside of the furiously +7622|835|2|1|31|53810.73|0.06|0.06|N|O|1998-03-14|1998-04-20|1998-04-03|COLLECT COD|REG AIR|ously bold instructions i +7622|1834|64|2|24|41659.92|0.05|0.00|N|O|1998-02-17|1998-04-14|1998-03-08|TAKE BACK RETURN|TRUCK|g deposits. regular requests boost +7623|807|41|1|34|58065.20|0.09|0.04|R|F|1995-01-04|1995-01-15|1995-01-31|NONE|FOB|foxes cajole carefully quiet deposi +7623|637|38|2|24|36903.12|0.02|0.02|R|F|1994-12-21|1994-12-11|1995-01-11|NONE|REG AIR|t furiously alongside of the even w +7623|1321|98|3|18|22001.76|0.00|0.00|A|F|1994-11-24|1994-12-14|1994-12-06|DELIVER IN PERSON|TRUCK| the final, regular fox +7623|293|21|4|45|53698.05|0.10|0.08|R|F|1994-11-03|1994-12-10|1994-11-17|NONE|SHIP|odolites among the packages boo +7648|909|10|1|9|16289.10|0.10|0.07|N|O|1997-07-18|1997-07-04|1997-08-11|TAKE BACK RETURN|REG AIR|heodolites boost carefully regular dinos. +7649|483|71|1|34|47038.32|0.02|0.07|N|O|1995-07-18|1995-09-24|1995-08-11|NONE|AIR|eans wake idly above the special pinto bea +7649|735|68|2|32|52343.36|0.06|0.04|N|O|1995-10-16|1995-09-05|1995-10-31|COLLECT COD|TRUCK|ic asymptotes poach blithely blithel +7649|943|78|3|7|12907.58|0.05|0.06|N|O|1995-07-27|1995-08-19|1995-08-02|COLLECT COD|FOB|deposits boost furiously. slyly e +7649|367|52|4|35|44357.60|0.05|0.04|N|O|1995-08-14|1995-08-25|1995-09-11|NONE|FOB|osits sleep slyly idl +7650|941|76|1|14|25787.16|0.03|0.08|R|F|1995-04-14|1995-05-11|1995-05-06|NONE|SHIP|uickly silent package +7650|1589|10|2|27|40245.66|0.06|0.02|N|F|1995-06-16|1995-05-28|1995-07-06|DELIVER IN PERSON|MAIL|. requests haggle furiously. furiously ev +7651|1462|63|1|47|64082.62|0.10|0.06|R|F|1995-05-02|1995-03-06|1995-05-14|TAKE BACK RETURN|MAIL|ular, pending accounts boos +7652|1983|16|1|25|47124.50|0.00|0.06|R|F|1994-02-19|1994-03-04|1994-03-06|TAKE BACK RETURN|RAIL|lar waters are slyly against the furi +7653|1002|8|1|10|9030.00|0.03|0.03|A|F|1992-04-29|1992-05-11|1992-05-18|TAKE BACK RETURN|AIR|oss the carefully quiet requests wake accor +7653|872|73|2|38|67369.06|0.06|0.05|R|F|1992-03-21|1992-05-08|1992-04-02|TAKE BACK RETURN|SHIP|ckages dazzle along +7653|299|27|3|16|19188.64|0.05|0.04|R|F|1992-05-23|1992-04-04|1992-06-08|COLLECT COD|AIR|yly final foxes nag boldly fina +7653|639|33|4|41|63124.83|0.01|0.04|R|F|1992-03-30|1992-05-26|1992-04-05|NONE|SHIP|al, even i +7654|1845|46|1|6|10481.04|0.10|0.02|A|F|1993-05-19|1993-04-26|1993-06-12|TAKE BACK RETURN|RAIL|sly pending packag +7654|173|74|2|31|33268.27|0.02|0.01|A|F|1993-03-22|1993-04-29|1993-04-04|DELIVER IN PERSON|FOB| packages use closely. +7654|843|77|3|10|17438.40|0.07|0.01|A|F|1993-04-21|1993-03-24|1993-05-04|DELIVER IN PERSON|SHIP| the carefully busy platele +7654|1911|12|4|5|9064.55|0.09|0.03|A|F|1993-05-01|1993-04-04|1993-05-25|TAKE BACK RETURN|MAIL|nal theodolites. unusual packages wake +7654|346|75|5|24|29912.16|0.09|0.04|R|F|1993-02-15|1993-04-11|1993-03-04|COLLECT COD|FOB|ngside of the fluffily ironic a +7654|890|57|6|47|84171.83|0.07|0.03|R|F|1993-05-10|1993-03-26|1993-06-04|DELIVER IN PERSON|REG AIR|usly silent ideas against the bl +7655|797|30|1|4|6791.16|0.04|0.01|R|F|1993-05-28|1993-04-08|1993-06-26|DELIVER IN PERSON|REG AIR|yly ironic fo +7655|1316|17|2|41|49909.71|0.00|0.00|A|F|1993-02-15|1993-04-14|1993-03-04|COLLECT COD|RAIL|ial pinto beans. regula +7680|1050|56|1|13|12363.65|0.05|0.04|A|F|1995-04-15|1995-06-07|1995-05-08|NONE|RAIL| around the furi +7680|402|90|2|46|59910.40|0.01|0.03|N|O|1995-07-15|1995-05-26|1995-07-18|DELIVER IN PERSON|TRUCK|ironic theodolites. furiously +7680|462|21|3|35|47686.10|0.07|0.08|N|O|1995-07-05|1995-07-04|1995-07-29|TAKE BACK RETURN|FOB|sits doze slyly after +7680|83|59|4|26|25560.08|0.05|0.05|N|O|1995-08-01|1995-05-29|1995-08-17|TAKE BACK RETURN|RAIL| accounts boost +7680|942|43|5|36|66345.84|0.03|0.06|N|O|1995-07-25|1995-07-06|1995-08-11|NONE|SHIP|usly ironic dependenci +7680|232|14|6|48|54347.04|0.09|0.08|N|O|1995-07-06|1995-05-24|1995-08-03|DELIVER IN PERSON|RAIL|y pending packages among the pending +7680|504|65|7|32|44944.00|0.00|0.05|R|F|1995-06-08|1995-05-22|1995-06-10|TAKE BACK RETURN|MAIL|fily. fluffily ironic deposits caj +7681|1242|17|1|4|4572.96|0.04|0.05|A|F|1994-01-07|1994-02-12|1994-02-04|COLLECT COD|MAIL|thely along the fur +7681|1930|31|2|30|54957.90|0.04|0.01|R|F|1994-03-11|1994-03-09|1994-03-24|TAKE BACK RETURN|REG AIR|ronic, ironic accounts cajole. sly +7682|602|34|1|16|24041.60|0.03|0.08|N|O|1998-02-09|1997-11-21|1998-03-02|TAKE BACK RETURN|TRUCK|y alongside of the care +7682|1067|73|2|12|11616.72|0.10|0.06|N|O|1997-12-06|1997-12-01|1998-01-03|DELIVER IN PERSON|AIR|ons sublate. bold deposits according to the +7682|1254|29|3|15|17328.75|0.00|0.04|N|O|1997-12-31|1997-12-16|1998-01-16|NONE|REG AIR|g the slyl +7683|950|85|1|14|25913.30|0.03|0.04|N|O|1998-04-25|1998-05-08|1998-05-03|COLLECT COD|RAIL|the busy, regular foxes sleep furiously ev +7683|496|55|2|49|68428.01|0.00|0.05|N|O|1998-06-05|1998-04-12|1998-06-11|COLLECT COD|SHIP|equests? furious +7683|1798|41|3|29|49293.91|0.04|0.05|N|O|1998-05-24|1998-05-10|1998-06-08|NONE|AIR|s, even instructions boost ca +7683|445|33|4|34|45744.96|0.10|0.05|N|O|1998-05-20|1998-03-28|1998-06-13|DELIVER IN PERSON|AIR|yly. quickly idle accounts are blithely +7684|1129|2|1|46|47385.52|0.03|0.02|R|F|1992-02-09|1992-03-23|1992-02-25|NONE|REG AIR|notornis print across the ironic patter +7684|1617|18|2|39|59225.79|0.03|0.07|R|F|1992-05-15|1992-03-07|1992-06-14|NONE|RAIL|ully regular packages cajole along +7684|1502|83|3|47|65964.50|0.10|0.02|A|F|1992-03-31|1992-03-14|1992-04-29|NONE|AIR|? furiously pending dep +7684|1123|32|4|36|36868.32|0.03|0.01|A|F|1992-03-28|1992-03-31|1992-04-01|NONE|AIR|arefully express +7685|517|18|1|32|45360.32|0.10|0.02|N|O|1998-06-03|1998-04-27|1998-06-05|DELIVER IN PERSON|AIR|hely special decoys against t +7685|1061|32|2|33|31747.98|0.03|0.06|N|O|1998-05-24|1998-04-17|1998-06-01|NONE|RAIL|lyly about the unusua +7685|1617|59|3|3|4555.83|0.08|0.07|N|O|1998-04-18|1998-04-09|1998-05-10|COLLECT COD|FOB|lets above the carefully regu +7685|574|75|4|22|32440.54|0.07|0.08|N|O|1998-05-11|1998-04-05|1998-06-01|NONE|AIR|furiously c +7685|865|32|5|35|61805.10|0.06|0.00|N|O|1998-06-09|1998-05-14|1998-06-10|NONE|SHIP|across the ironic tithes. blithely u +7685|1019|20|6|10|9200.10|0.04|0.06|N|O|1998-04-18|1998-04-09|1998-05-10|TAKE BACK RETURN|RAIL|eposits. slyly blithe foxes lose. quickly +7685|481|69|7|20|27629.60|0.07|0.08|N|O|1998-06-18|1998-04-27|1998-06-26|TAKE BACK RETURN|FOB|s haggle regu +7686|1651|52|1|3|4657.95|0.01|0.04|R|F|1994-07-01|1994-08-08|1994-07-18|DELIVER IN PERSON|SHIP|ly. regular deposits after the sl +7686|611|12|2|49|74068.89|0.03|0.08|R|F|1994-06-15|1994-07-30|1994-07-10|DELIVER IN PERSON|REG AIR|asymptotes wake +7686|1627|10|3|38|58087.56|0.08|0.05|R|F|1994-07-01|1994-08-02|1994-07-08|NONE|REG AIR|ong the even in +7687|397|26|1|27|35029.53|0.10|0.07|R|F|1993-03-30|1993-05-29|1993-04-15|NONE|RAIL|c packages among the final pack +7687|339|40|2|29|35940.57|0.02|0.07|A|F|1993-04-10|1993-04-17|1993-04-24|DELIVER IN PERSON|REG AIR|ind slyly carefully +7687|367|68|3|26|32951.36|0.09|0.07|R|F|1993-03-25|1993-04-18|1993-04-05|DELIVER IN PERSON|SHIP|ages are along the blithely +7687|539|40|4|49|70536.97|0.10|0.03|R|F|1993-05-25|1993-05-13|1993-06-09|TAKE BACK RETURN|REG AIR| waters cajole acr +7687|499|58|5|33|46183.17|0.01|0.08|R|F|1993-05-13|1993-04-17|1993-06-03|TAKE BACK RETURN|RAIL|furiously regular de +7687|323|8|6|33|40369.56|0.04|0.04|A|F|1993-03-28|1993-05-04|1993-04-13|TAKE BACK RETURN|AIR|nal pinto beans accordin +7687|361|90|7|49|61806.64|0.04|0.00|A|F|1993-05-25|1993-05-17|1993-05-31|DELIVER IN PERSON|FOB|es nag accord +7712|347|32|1|42|52388.28|0.06|0.03|N|O|1996-10-26|1996-11-29|1996-11-12|COLLECT COD|RAIL|urts grow furiou +7713|506|37|1|26|36569.00|0.09|0.08|N|O|1996-04-05|1996-04-14|1996-04-18|DELIVER IN PERSON|REG AIR|ing packages boost slyly bold depo +7714|1979|68|1|21|39500.37|0.08|0.04|N|O|1996-08-04|1996-09-02|1996-08-05|DELIVER IN PERSON|SHIP|ecial pinto bean +7714|1859|46|2|30|52825.50|0.04|0.03|N|O|1996-09-01|1996-08-19|1996-09-16|NONE|TRUCK| ideas cajole blithely. regul +7714|1648|72|3|18|27893.52|0.09|0.00|N|O|1996-07-28|1996-08-30|1996-08-07|COLLECT COD|AIR| instructions. final platelets x- +7714|554|85|4|9|13090.95|0.10|0.03|N|O|1996-10-11|1996-09-15|1996-10-22|COLLECT COD|MAIL|iously express packages. +7714|1731|74|5|20|32654.60|0.04|0.04|N|O|1996-09-12|1996-08-10|1996-10-05|COLLECT COD|FOB| blithely unus +7715|1968|1|1|22|41139.12|0.03|0.02|R|F|1993-10-14|1993-09-18|1993-10-15|COLLECT COD|FOB|telets. blithely regular requests are +7715|1896|83|2|38|68319.82|0.07|0.03|R|F|1993-10-01|1993-10-24|1993-10-06|COLLECT COD|MAIL|unts. carefully furious requests use +7715|1754|39|3|28|46361.00|0.09|0.04|A|F|1993-11-09|1993-10-05|1993-11-16|NONE|SHIP|xes above the final, sp +7716|1255|30|1|47|54343.75|0.04|0.03|N|O|1996-01-03|1996-02-15|1996-01-30|NONE|REG AIR|grate carefully abou +7716|1511|92|2|47|66387.97|0.09|0.03|N|O|1996-02-27|1996-01-29|1996-03-03|NONE|RAIL|s are furiously. fina +7716|377|62|3|3|3832.11|0.09|0.06|N|O|1996-01-31|1996-03-21|1996-02-29|COLLECT COD|MAIL|carefully unusual packages haggle carefu +7716|537|38|4|31|44563.43|0.05|0.07|N|O|1996-01-06|1996-01-25|1996-01-25|NONE|REG AIR|se blithely. brave instruct +7717|1642|25|1|15|23154.60|0.00|0.04|N|O|1996-12-04|1996-10-05|1996-12-07|COLLECT COD|FOB|riously regula +7717|78|54|2|35|34232.45|0.03|0.04|N|O|1996-12-02|1996-10-06|1996-12-03|DELIVER IN PERSON|MAIL|otes haggle carefully on t +7717|929|32|3|45|82346.40|0.02|0.06|N|O|1996-12-01|1996-11-10|1996-12-09|NONE|FOB|ate quickly alongsid +7717|1151|88|4|25|26303.75|0.02|0.08|N|O|1996-11-16|1996-10-25|1996-12-13|DELIVER IN PERSON|AIR| sleep against the regular pinto beans. f +7717|1952|41|5|2|3707.90|0.00|0.02|N|O|1996-12-23|1996-11-03|1997-01-15|DELIVER IN PERSON|REG AIR|ests. regular excuses a +7718|291|19|1|8|9530.32|0.04|0.07|N|O|1998-03-15|1998-04-07|1998-03-19|DELIVER IN PERSON|AIR| cajole against the blith +7718|643|37|2|3|4630.92|0.09|0.00|N|O|1998-04-06|1998-04-19|1998-04-25|DELIVER IN PERSON|SHIP|ckly unusual accounts ha +7718|1826|70|3|45|77751.90|0.00|0.06|N|O|1998-03-11|1998-04-16|1998-03-14|TAKE BACK RETURN|REG AIR|arefully. furious +7718|768|1|4|34|56737.84|0.09|0.04|N|O|1998-03-31|1998-04-05|1998-04-19|NONE|REG AIR|cies among the spec +7718|874|41|5|13|23073.31|0.04|0.01|N|O|1998-03-28|1998-03-23|1998-04-05|DELIVER IN PERSON|SHIP|ly after the packages. blithely silent ide +7719|713|46|1|4|6454.84|0.03|0.03|A|F|1994-03-31|1994-06-05|1994-04-03|TAKE BACK RETURN|REG AIR|s. even dolphins was among the fluffi +7744|706|39|1|18|28920.60|0.00|0.01|A|F|1995-03-07|1994-12-30|1995-03-30|TAKE BACK RETURN|AIR|g the fluffily e +7744|1548|49|2|20|28990.80|0.09|0.04|A|F|1994-12-05|1995-02-10|1994-12-24|NONE|MAIL|to beans breach about the instructions. f +7744|176|55|3|14|15066.38|0.06|0.00|R|F|1995-03-10|1995-01-11|1995-03-13|COLLECT COD|FOB|e requests. ca +7744|680|12|4|17|26871.56|0.02|0.00|A|F|1995-02-09|1995-02-03|1995-02-17|DELIVER IN PERSON|SHIP|ackages. express, pen +7744|74|25|5|14|13636.98|0.03|0.03|A|F|1995-02-17|1995-01-17|1995-02-18|NONE|FOB|ermanent requests boost qui +7744|1820|21|6|27|46489.14|0.09|0.02|R|F|1995-02-23|1995-01-15|1995-03-25|NONE|SHIP|s. final, idle requests boost slyly +7744|317|18|7|42|51127.02|0.00|0.06|R|F|1994-12-28|1995-01-09|1995-01-03|COLLECT COD|SHIP|ly even somas are furio +7745|1332|33|1|16|19733.28|0.07|0.07|A|F|1994-04-10|1994-05-23|1994-05-01|NONE|REG AIR|ages haggle slyly after the +7745|1953|42|2|46|85327.70|0.07|0.04|R|F|1994-05-10|1994-05-17|1994-06-09|TAKE BACK RETURN|MAIL|xes. ruthlessly pe +7745|454|84|3|15|20316.75|0.02|0.08|R|F|1994-04-03|1994-05-02|1994-04-21|NONE|SHIP|telets cajole. ironic, +7745|26|2|4|41|37966.82|0.00|0.06|R|F|1994-06-21|1994-05-15|1994-07-17|COLLECT COD|REG AIR|ly ironic ideas cajole notornis. bli +7745|1735|36|5|36|58922.28|0.05|0.01|A|F|1994-06-01|1994-05-07|1994-06-03|NONE|AIR|totes use sly +7746|1562|83|1|11|16099.16|0.06|0.02|A|F|1994-02-21|1994-02-04|1994-03-20|DELIVER IN PERSON|AIR|c packages. regular +7746|1720|5|2|44|71355.68|0.03|0.06|R|F|1993-12-10|1994-02-25|1993-12-12|COLLECT COD|MAIL|ual packages. platelets +7746|817|17|3|24|41227.44|0.09|0.04|A|F|1994-03-14|1994-01-30|1994-03-22|DELIVER IN PERSON|SHIP|s. final excuses wake regular foxes. +7746|1844|45|4|36|62850.24|0.10|0.06|R|F|1994-02-13|1994-01-17|1994-03-13|COLLECT COD|REG AIR| the carefully even e +7747|79|55|1|41|40141.87|0.02|0.06|R|F|1992-06-12|1992-07-14|1992-06-23|COLLECT COD|FOB|e fluffily fluffily regular d +7748|1176|77|1|40|43086.80|0.02|0.02|N|O|1998-05-13|1998-04-08|1998-06-05|COLLECT COD|REG AIR|uses. fluffily +7749|1734|35|1|50|81786.50|0.06|0.01|R|F|1993-11-11|1993-12-10|1993-11-21|TAKE BACK RETURN|SHIP| along the slyly even accounts. iron +7749|595|86|2|31|46363.29|0.06|0.04|R|F|1993-09-30|1993-12-19|1993-10-04|NONE|TRUCK|dencies wake after the blithely regular re +7749|384|41|3|33|42384.54|0.02|0.07|A|F|1993-10-04|1993-11-04|1993-10-31|NONE|MAIL|ts sleep accounts. furiously re +7749|256|11|4|16|18500.00|0.04|0.02|R|F|1993-10-04|1993-10-26|1993-10-18|DELIVER IN PERSON|FOB|sh. ironic ideas are fluffily express d +7749|1818|19|5|10|17198.10|0.09|0.05|A|F|1993-12-14|1993-10-23|1993-12-25|NONE|SHIP|the deposits maintain a +7750|1345|60|1|2|2492.68|0.05|0.06|R|F|1993-02-03|1993-03-20|1993-02-16|COLLECT COD|SHIP| theodolites engage blithely fo +7750|1640|82|2|33|50874.12|0.03|0.08|R|F|1992-12-31|1993-01-26|1993-01-27|TAKE BACK RETURN|TRUCK|the pending pa +7750|1093|94|3|11|10934.99|0.01|0.07|R|F|1993-04-18|1993-03-14|1993-05-08|TAKE BACK RETURN|AIR| bold dependencies grow alo +7750|302|87|4|44|52901.20|0.07|0.00|R|F|1993-03-18|1993-03-15|1993-03-25|NONE|TRUCK|ckly regular acco +7751|1834|78|1|31|53810.73|0.02|0.01|R|F|1992-12-28|1993-02-07|1993-01-14|NONE|AIR|ickly regular depos +7751|891|25|2|10|17918.90|0.10|0.01|A|F|1993-02-16|1993-02-05|1993-02-21|NONE|TRUCK|lly express accounts! carefully s +7751|920|55|3|29|52806.68|0.04|0.02|A|F|1993-03-26|1993-01-31|1993-04-08|TAKE BACK RETURN|RAIL|ges haggle fluffily even theodolites. fina +7776|118|45|1|30|30543.30|0.09|0.03|R|F|1994-03-28|1994-05-23|1994-04-23|TAKE BACK RETURN|SHIP|y regular deposits. quickly regul +7776|961|96|2|2|3723.92|0.04|0.05|R|F|1994-06-14|1994-05-31|1994-06-28|NONE|FOB|haggle carefully +7776|1585|86|3|16|23785.28|0.05|0.05|A|F|1994-04-28|1994-06-13|1994-05-11|DELIVER IN PERSON|REG AIR|r, regular requests. depo +7776|1879|23|4|19|33836.53|0.09|0.01|R|F|1994-04-13|1994-06-05|1994-04-19|NONE|FOB|ep slyly. furio +7776|1221|22|5|2|2244.44|0.04|0.00|R|F|1994-04-15|1994-05-07|1994-05-13|TAKE BACK RETURN|FOB|the bold platelets. slyly ironic pack +7776|851|52|6|42|73577.70|0.04|0.07|A|F|1994-03-23|1994-05-18|1994-04-11|NONE|SHIP|y around the final foxes. carefully bol +7777|175|2|1|27|29029.59|0.05|0.06|N|O|1998-05-17|1998-04-06|1998-05-25|COLLECT COD|TRUCK|ounts among the even, expre +7777|334|19|2|48|59247.84|0.08|0.08|N|O|1998-05-16|1998-04-29|1998-06-03|TAKE BACK RETURN|SHIP|ng theodolites haggle furiousl +7778|1957|90|1|6|11153.70|0.03|0.04|R|F|1995-03-01|1995-02-09|1995-03-11|DELIVER IN PERSON|REG AIR|s should have to are furiously. eve +7778|1847|34|2|18|31479.12|0.06|0.03|A|F|1995-01-17|1995-02-12|1995-02-08|DELIVER IN PERSON|REG AIR|accounts; carefully special pa +7778|1219|57|3|16|17923.36|0.04|0.05|R|F|1994-12-12|1995-01-17|1994-12-26|NONE|AIR|y even packages. carefully slow depos +7778|795|96|4|23|39003.17|0.01|0.06|R|F|1995-03-02|1994-12-26|1995-03-23|NONE|AIR|ly express deposits wake. qu +7778|1033|4|5|41|38295.23|0.10|0.08|A|F|1994-12-19|1994-12-25|1995-01-05|DELIVER IN PERSON|FOB|des cajole care +7779|501|32|1|31|43446.50|0.03|0.01|N|O|1995-07-19|1995-06-28|1995-08-14|TAKE BACK RETURN|REG AIR|courts: unu +7779|495|83|2|44|61401.56|0.04|0.08|N|O|1995-08-10|1995-06-23|1995-08-19|DELIVER IN PERSON|MAIL|lly even packages detect furi +7779|160|39|3|13|13782.08|0.10|0.01|N|O|1995-08-07|1995-06-30|1995-08-26|TAKE BACK RETURN|MAIL|ts. quickly regu +7779|115|68|4|25|25377.75|0.03|0.04|N|O|1995-08-01|1995-07-14|1995-08-14|DELIVER IN PERSON|TRUCK|after the silent +7779|217|72|5|15|16758.15|0.09|0.03|N|O|1995-08-19|1995-06-30|1995-09-01|DELIVER IN PERSON|RAIL|y. blithely pending package +7780|544|35|1|28|40447.12|0.00|0.00|N|O|1998-02-26|1998-03-29|1998-03-20|TAKE BACK RETURN|SHIP|al deposits. blithely unusual +7781|1910|99|1|13|23554.83|0.02|0.08|N|O|1998-06-05|1998-08-20|1998-06-17|COLLECT COD|MAIL|ecial accounts affix +7782|106|33|1|41|41250.10|0.01|0.07|A|F|1994-07-25|1994-08-20|1994-07-31|COLLECT COD|TRUCK|n blithely special instr +7782|407|8|2|26|33992.40|0.06|0.05|R|F|1994-08-27|1994-08-13|1994-09-19|TAKE BACK RETURN|TRUCK|epitaphs. slyly final p +7782|1355|56|3|23|28896.05|0.09|0.08|R|F|1994-10-21|1994-09-05|1994-10-27|TAKE BACK RETURN|FOB|ngside of the quickly even platelets. s +7782|1333|34|4|35|43201.55|0.05|0.01|R|F|1994-07-17|1994-08-22|1994-08-01|NONE|FOB| requests +7783|769|34|1|47|78478.72|0.01|0.00|A|F|1992-01-30|1992-03-31|1992-02-23|DELIVER IN PERSON|REG AIR|egular, pending frays lose care +7783|157|84|2|48|50743.20|0.08|0.00|A|F|1992-03-02|1992-03-03|1992-03-29|COLLECT COD|MAIL|nt, bold re +7783|704|69|3|38|60978.60|0.04|0.04|R|F|1992-04-10|1992-03-01|1992-05-08|TAKE BACK RETURN|FOB|posits doubt. furiously special +7808|1920|21|1|38|69232.96|0.06|0.00|N|O|1996-02-01|1996-03-14|1996-02-24|NONE|TRUCK|le blithely ironic accounts. carefully iro +7809|967|70|1|6|11207.76|0.04|0.02|N|O|1996-10-13|1996-12-20|1996-10-20|COLLECT COD|MAIL|ckages sleep. even theodolites are blith +7809|1202|40|2|24|26476.80|0.00|0.06|N|O|1997-01-07|1996-12-14|1997-01-15|COLLECT COD|FOB|ajole carefully. careful +7809|463|51|3|16|21815.36|0.08|0.01|N|O|1996-11-11|1996-12-15|1996-11-25|DELIVER IN PERSON|SHIP|s sleep across the +7810|339|40|1|23|28504.59|0.03|0.03|N|O|1997-06-29|1997-04-25|1997-07-29|DELIVER IN PERSON|FOB|d courts wake carefully along the spec +7810|561|92|2|12|17538.72|0.07|0.00|N|O|1997-03-21|1997-06-01|1997-04-05|DELIVER IN PERSON|FOB|ual, ironic decoys hag +7810|479|38|3|37|51040.39|0.09|0.08|N|O|1997-05-02|1997-04-27|1997-05-28|TAKE BACK RETURN|RAIL|y even asymp +7810|683|77|4|12|19004.16|0.04|0.05|N|O|1997-04-29|1997-04-09|1997-04-30|NONE|TRUCK|tions are near the qu +7810|779|44|5|42|70550.34|0.00|0.00|N|O|1997-06-27|1997-04-26|1997-06-30|NONE|FOB|fully final instructions boost. +7811|156|35|1|29|30628.35|0.01|0.05|N|O|1996-05-26|1996-05-04|1996-06-16|TAKE BACK RETURN|SHIP|cajole slyly slyly idle accounts. furio +7811|778|11|2|6|10072.62|0.01|0.00|N|O|1996-05-31|1996-06-12|1996-06-19|DELIVER IN PERSON|RAIL|y regular foxes. +7811|1212|13|3|7|7792.47|0.00|0.03|N|O|1996-04-25|1996-06-03|1996-05-23|DELIVER IN PERSON|REG AIR|ets. carefully special gifts haggle c +7811|1771|56|4|28|46837.56|0.10|0.02|N|O|1996-07-17|1996-04-20|1996-07-24|NONE|FOB|dencies unwind according to the fur +7811|1146|19|5|12|12565.68|0.08|0.08|N|O|1996-05-30|1996-05-13|1996-06-13|DELIVER IN PERSON|MAIL|s! quickly even accou +7811|1070|41|6|18|17479.26|0.09|0.07|N|O|1996-04-12|1996-05-11|1996-04-28|COLLECT COD|RAIL|ld, unusual re +7812|777|42|1|11|18455.47|0.02|0.00|N|O|1995-07-11|1995-07-01|1995-08-01|COLLECT COD|TRUCK|pending accounts about +7812|559|50|2|29|42326.95|0.10|0.00|N|O|1995-07-11|1995-06-03|1995-07-17|TAKE BACK RETURN|FOB| grow along the spe +7812|1869|56|3|47|83230.42|0.01|0.00|N|O|1995-06-18|1995-07-20|1995-06-24|DELIVER IN PERSON|REG AIR|ross the even foxes. fluffily even d +7812|1645|69|4|27|41759.28|0.04|0.01|N|O|1995-06-19|1995-07-05|1995-07-13|DELIVER IN PERSON|SHIP|ages against the packages engage slyly +7812|692|86|5|46|73263.74|0.05|0.04|A|F|1995-05-02|1995-06-13|1995-05-17|TAKE BACK RETURN|MAIL|e furiously after the regular pla +7812|1922|67|6|28|51069.76|0.06|0.08|A|F|1995-05-20|1995-07-03|1995-06-14|DELIVER IN PERSON|FOB| courts haggle furiously against the carefu +7813|302|59|1|25|30057.50|0.09|0.07|A|F|1994-04-22|1994-05-04|1994-05-22|NONE|MAIL|eodolites can affix carefully e +7813|857|91|2|21|36914.85|0.07|0.07|R|F|1994-03-21|1994-03-14|1994-03-26|TAKE BACK RETURN|MAIL|y even foxes. furiously ironic account +7814|1072|8|1|23|22380.61|0.00|0.04|N|O|1995-08-03|1995-09-23|1995-08-12|NONE|RAIL|ously unusual requests. s +7815|69|70|1|23|22288.38|0.03|0.04|R|F|1994-04-04|1994-02-22|1994-04-15|NONE|TRUCK|deposits can haggle slyly furiously unusua +7840|1869|13|1|14|24792.04|0.07|0.05|A|F|1995-04-21|1995-03-09|1995-05-15|TAKE BACK RETURN|MAIL|osits. fluffily final dugouts slee +7840|216|17|2|13|14510.73|0.10|0.00|R|F|1995-03-22|1995-03-20|1995-04-15|DELIVER IN PERSON|TRUCK|. ironic, ironic foxes +7840|1717|44|3|47|76079.37|0.04|0.00|R|F|1995-05-03|1995-03-25|1995-05-06|NONE|RAIL|ts integrate fluffily final platelets-- +7840|635|29|4|34|52211.42|0.04|0.03|A|F|1995-04-30|1995-02-16|1995-05-08|NONE|TRUCK|dolphins haggle +7841|95|71|1|48|47764.32|0.06|0.06|A|F|1992-07-10|1992-07-25|1992-08-07|COLLECT COD|RAIL|even packages +7841|1392|93|2|4|5173.56|0.05|0.03|R|F|1992-08-27|1992-07-24|1992-09-19|DELIVER IN PERSON|MAIL|ic foxes nag fluffily +7841|1178|15|3|9|9712.53|0.08|0.03|A|F|1992-08-22|1992-07-09|1992-09-03|DELIVER IN PERSON|FOB|nt deposits cajole furiou +7841|169|96|4|47|50250.52|0.06|0.04|A|F|1992-06-29|1992-07-12|1992-07-28|TAKE BACK RETURN|RAIL|ing accounts. ironically +7841|1797|40|5|36|61156.44|0.09|0.07|R|F|1992-06-07|1992-07-06|1992-06-24|NONE|TRUCK|s haggle. furiously unusual fr +7841|1271|72|6|37|43373.99|0.04|0.00|R|F|1992-06-04|1992-08-02|1992-06-11|NONE|FOB|eans. even deposits sleep +7842|342|43|1|7|8696.38|0.02|0.02|R|F|1994-12-05|1994-11-26|1994-12-09|NONE|RAIL|lar instructions breac +7842|1285|97|2|42|49823.76|0.02|0.08|R|F|1995-01-06|1994-12-11|1995-02-03|COLLECT COD|TRUCK| pending deposits sleep carefully +7842|6|7|3|5|4530.00|0.09|0.00|A|F|1994-12-19|1994-11-04|1995-01-01|NONE|MAIL|y excuses. special, sile +7842|487|46|4|21|29137.08|0.01|0.04|A|F|1994-12-19|1994-12-12|1994-12-21|NONE|MAIL|ross the packages sleep flu +7843|1258|70|1|8|9274.00|0.02|0.05|N|O|1995-09-18|1995-07-23|1995-09-20|TAKE BACK RETURN|SHIP|ave accounts are quic +7843|519|10|2|46|65297.46|0.02|0.06|N|O|1995-06-18|1995-07-21|1995-06-28|DELIVER IN PERSON|SHIP|y regular platele +7843|1493|72|3|15|20917.35|0.01|0.07|N|O|1995-07-13|1995-08-12|1995-08-11|COLLECT COD|SHIP|s nod. blithely reg +7843|1866|10|4|7|12375.02|0.01|0.05|N|O|1995-08-03|1995-07-09|1995-08-13|NONE|RAIL|final, regul +7843|501|62|5|27|37840.50|0.04|0.06|N|O|1995-09-20|1995-08-11|1995-10-17|DELIVER IN PERSON|RAIL|dolites al +7843|793|58|6|35|59282.65|0.10|0.00|N|O|1995-06-24|1995-07-24|1995-06-26|COLLECT COD|MAIL|cial accounts. blithely expr +7844|1918|7|1|38|69156.58|0.05|0.03|N|O|1996-10-01|1996-10-19|1996-10-20|NONE|RAIL|es detect idl +7844|1423|2|2|6|7946.52|0.07|0.06|N|O|1996-09-21|1996-12-03|1996-10-08|NONE|FOB|into the sl +7844|1779|22|3|26|43700.02|0.04|0.07|N|O|1996-10-29|1996-11-01|1996-11-07|NONE|AIR|s. quickly +7845|1808|9|1|49|83780.20|0.03|0.04|R|F|1994-12-26|1995-01-28|1995-01-25|COLLECT COD|RAIL| ironic reque +7845|1428|46|2|1|1329.42|0.05|0.06|R|F|1995-04-08|1995-02-15|1995-04-19|TAKE BACK RETURN|REG AIR| the enticingly special +7845|936|37|3|39|71640.27|0.00|0.05|R|F|1995-04-09|1995-03-01|1995-04-28|COLLECT COD|MAIL|d gifts wak +7845|1925|70|4|14|25576.88|0.04|0.07|R|F|1995-02-14|1995-01-18|1995-03-14|COLLECT COD|AIR|counts nag fluffily abov +7845|1310|49|5|9|10901.79|0.10|0.05|R|F|1994-12-23|1995-02-16|1995-01-21|COLLECT COD|TRUCK|into beans +7846|832|66|1|13|22526.79|0.05|0.08|N|O|1995-10-15|1995-09-18|1995-10-28|TAKE BACK RETURN|TRUCK|cajole furiously blithely stealthy orbi +7846|1674|75|2|2|3151.34|0.01|0.05|N|O|1995-07-31|1995-09-01|1995-08-04|COLLECT COD|REG AIR|leep blithely after the iro +7846|896|30|3|20|35937.80|0.01|0.01|N|O|1995-10-15|1995-09-16|1995-10-17|COLLECT COD|MAIL|uthless instructions use enticingly r +7846|1631|73|4|39|59772.57|0.05|0.06|N|O|1995-07-07|1995-09-20|1995-07-12|NONE|RAIL|efully across the carefully regula +7846|1140|77|5|7|7287.98|0.08|0.05|N|O|1995-07-21|1995-08-19|1995-08-17|TAKE BACK RETURN|AIR|ealms. regular, pending pinto beans +7847|1692|93|1|44|70122.36|0.10|0.00|N|O|1995-07-11|1995-09-22|1995-08-02|COLLECT COD|SHIP|lently ironic theodolites dazzle +7847|732|33|2|9|14694.57|0.09|0.06|N|O|1995-10-23|1995-10-01|1995-11-01|TAKE BACK RETURN|RAIL| final deposits haggle carefully-- careful +7847|999|2|3|32|60799.68|0.10|0.07|N|O|1995-10-26|1995-10-01|1995-11-18|DELIVER IN PERSON|SHIP|ieve furious +7872|1906|95|1|6|10847.40|0.08|0.03|R|F|1992-12-05|1993-01-01|1992-12-19|DELIVER IN PERSON|FOB|y courts. quickly even deposits use quic +7872|1515|96|2|22|31163.22|0.07|0.01|A|F|1993-01-10|1992-12-16|1993-01-31|DELIVER IN PERSON|RAIL|ly alongside of the furiously express theo +7872|1831|75|3|19|32923.77|0.02|0.04|A|F|1993-02-09|1993-01-16|1993-03-05|TAKE BACK RETURN|SHIP|uriously? instructions ca +7872|958|93|4|27|50191.65|0.08|0.03|A|F|1993-02-09|1993-01-06|1993-02-20|COLLECT COD|FOB|e slyly sl +7872|469|99|5|27|36975.42|0.01|0.04|R|F|1993-01-11|1992-12-20|1993-01-28|NONE|AIR| slyly ironic account +7873|170|71|1|1|1070.17|0.09|0.02|A|F|1992-08-24|1992-09-18|1992-09-13|DELIVER IN PERSON|AIR| cajole slyly across the final packag +7873|632|33|2|29|44446.27|0.09|0.03|A|F|1992-07-08|1992-09-11|1992-07-24|TAKE BACK RETURN|TRUCK|egular dependencies cajo +7873|1257|58|3|47|54437.75|0.04|0.06|R|F|1992-07-14|1992-09-01|1992-07-27|NONE|RAIL|y bold deposits. blithely special +7873|458|17|4|9|12226.05|0.08|0.06|R|F|1992-09-15|1992-08-26|1992-10-01|COLLECT COD|RAIL|r instructions +7873|848|49|5|40|69953.60|0.05|0.01|R|F|1992-08-24|1992-09-21|1992-09-01|NONE|MAIL| deposits integrate slyl +7873|1823|53|6|42|72442.44|0.01|0.08|A|F|1992-08-22|1992-08-26|1992-09-20|NONE|REG AIR|ular pinto beans +7874|1834|21|1|10|17358.30|0.08|0.04|N|O|1998-10-11|1998-08-16|1998-11-07|COLLECT COD|AIR|y players are carefully fur +7874|1243|81|2|29|33182.96|0.01|0.07|N|O|1998-06-29|1998-08-27|1998-07-09|NONE|AIR|sly even requests. special, ironic d +7874|1547|68|3|15|21728.10|0.04|0.07|N|O|1998-07-11|1998-09-14|1998-07-24|COLLECT COD|REG AIR|furiously even requ +7874|45|46|4|35|33076.40|0.03|0.08|N|O|1998-10-17|1998-08-31|1998-11-13|COLLECT COD|RAIL|ts. quickly pending ideas use qu +7874|284|39|5|2|2368.56|0.07|0.03|N|O|1998-10-12|1998-08-12|1998-10-19|NONE|SHIP| quickly f +7874|866|66|6|2|3533.72|0.10|0.02|N|O|1998-08-04|1998-08-11|1998-08-15|COLLECT COD|FOB| haggle deposits. blithely bold ideas t +7874|718|19|7|2|3237.42|0.08|0.07|N|O|1998-08-06|1998-08-11|1998-08-15|NONE|MAIL|s wake furiously. caref +7875|1198|35|1|31|34074.89|0.10|0.07|R|F|1993-04-13|1993-04-11|1993-04-19|COLLECT COD|REG AIR|bold requests haggle furiously. fluffily si +7875|337|22|2|16|19797.28|0.00|0.03|A|F|1993-02-17|1993-04-20|1993-03-09|NONE|REG AIR|ole carefully. +7875|332|89|3|32|39434.56|0.05|0.00|A|F|1993-03-19|1993-04-24|1993-04-04|NONE|RAIL|posits print never +7875|1288|89|4|34|40435.52|0.03|0.00|R|F|1993-03-19|1993-05-07|1993-04-03|COLLECT COD|RAIL|, regular instructions. carefully ir +7876|1564|85|1|37|54225.72|0.10|0.02|N|O|1996-10-17|1996-10-18|1996-11-06|TAKE BACK RETURN|TRUCK|ial pinto b +7876|1371|86|2|42|53439.54|0.06|0.05|N|O|1996-10-05|1996-11-02|1996-10-16|TAKE BACK RETURN|REG AIR|c platelets. ironic excuse +7877|223|5|1|10|11232.20|0.06|0.00|N|O|1996-04-27|1996-05-02|1996-05-12|TAKE BACK RETURN|RAIL|hely regular pains. quick +7877|85|36|2|46|45313.68|0.07|0.07|N|O|1996-07-03|1996-05-28|1996-07-28|NONE|MAIL|deposits? even i +7877|957|60|3|38|70602.10|0.06|0.06|N|O|1996-04-15|1996-05-31|1996-04-28|DELIVER IN PERSON|REG AIR|aphs poach carefully +7877|1202|40|4|21|23167.20|0.04|0.06|N|O|1996-04-28|1996-04-12|1996-05-09|DELIVER IN PERSON|AIR| even deposits integra +7877|1926|71|5|50|91396.00|0.03|0.04|N|O|1996-05-06|1996-05-22|1996-05-26|NONE|FOB|doubt against +7877|122|75|6|15|15331.80|0.01|0.03|N|O|1996-04-08|1996-05-24|1996-04-11|NONE|REG AIR|uriously about the furiously even +7877|346|47|7|27|33651.18|0.03|0.00|N|O|1996-06-28|1996-05-30|1996-07-14|TAKE BACK RETURN|REG AIR|nts. packages hagg +7878|461|62|1|32|43566.72|0.09|0.04|N|F|1995-06-11|1995-07-11|1995-06-18|DELIVER IN PERSON|MAIL|ven requests +7878|50|1|2|8|7600.40|0.03|0.02|R|F|1995-05-22|1995-06-02|1995-06-04|COLLECT COD|FOB|ly thin instructions wake carefully accordi +7878|1387|64|3|46|59265.48|0.07|0.03|N|O|1995-08-13|1995-07-13|1995-09-10|TAKE BACK RETURN|SHIP|ests. furiously special foxes hang outsid +7878|1852|53|4|45|78923.25|0.07|0.05|R|F|1995-05-05|1995-07-24|1995-05-29|DELIVER IN PERSON|RAIL|y ironic dugouts! final r +7878|1092|63|5|42|41709.78|0.00|0.03|N|O|1995-06-23|1995-07-14|1995-07-16|DELIVER IN PERSON|TRUCK|lar, pending packages thrash +7879|1482|83|1|34|47038.32|0.04|0.05|R|F|1994-10-27|1994-09-27|1994-10-30|NONE|SHIP| packages. furiously re +7879|75|1|2|33|32177.31|0.07|0.02|R|F|1994-08-07|1994-09-03|1994-08-16|COLLECT COD|MAIL|e slyly regular excuses haggle steal +7879|520|21|3|37|52559.24|0.08|0.00|R|F|1994-10-10|1994-09-02|1994-10-14|COLLECT COD|MAIL|st. ideas wake. final, final platelets ca +7879|32|33|4|30|27960.90|0.01|0.05|R|F|1994-10-18|1994-10-23|1994-10-22|DELIVER IN PERSON|TRUCK|arefully special requests. deposits na +7904|871|38|1|41|72646.67|0.09|0.06|R|F|1993-08-15|1993-07-02|1993-08-20|DELIVER IN PERSON|AIR|structions haggle slyly qu +7904|1263|1|2|26|30270.76|0.01|0.08|R|F|1993-09-01|1993-07-18|1993-09-21|TAKE BACK RETURN|REG AIR|the furiously reg +7905|1693|17|1|45|71761.05|0.10|0.04|R|F|1994-09-20|1994-09-01|1994-09-30|DELIVER IN PERSON|REG AIR|y atop the b +7905|1932|77|2|29|53183.97|0.06|0.05|R|F|1994-08-18|1994-08-24|1994-08-23|COLLECT COD|SHIP|. fluffily express packages use fl +7905|1041|42|3|1|942.04|0.03|0.07|R|F|1994-09-17|1994-07-26|1994-10-07|DELIVER IN PERSON|REG AIR|nag carefully regular +7905|1069|70|4|43|41712.58|0.00|0.07|A|F|1994-08-26|1994-08-25|1994-09-02|TAKE BACK RETURN|FOB|arefully express ins +7905|535|96|5|19|27275.07|0.08|0.05|A|F|1994-06-22|1994-08-01|1994-07-07|NONE|MAIL|. instructions cajole furiously about t +7906|614|15|1|26|39379.86|0.09|0.00|R|F|1994-10-25|1994-12-12|1994-11-15|TAKE BACK RETURN|MAIL|ly express ac +7906|138|17|2|29|30105.77|0.08|0.01|A|F|1995-01-30|1994-11-28|1995-02-09|NONE|AIR|, special accounts nag alongside +7906|132|11|3|12|12385.56|0.05|0.00|A|F|1994-12-26|1994-12-17|1994-12-28|TAKE BACK RETURN|RAIL|e furiously a +7906|1844|88|4|42|73325.28|0.01|0.04|R|F|1995-02-04|1994-12-05|1995-02-21|DELIVER IN PERSON|TRUCK|y silent accou +7907|5|31|1|50|45250.00|0.09|0.05|N|O|1996-10-22|1997-01-03|1996-11-09|NONE|MAIL|dolites! unusual deposits cajole +7907|1630|31|2|38|58201.94|0.03|0.05|N|O|1996-11-17|1997-01-06|1996-11-20|TAKE BACK RETURN|REG AIR|tions sleep f +7907|25|76|3|42|38850.84|0.01|0.04|N|O|1996-12-02|1996-11-22|1996-12-08|DELIVER IN PERSON|SHIP|nst the sometimes pending pa +7907|134|87|4|13|13443.69|0.07|0.04|N|O|1997-01-28|1996-11-30|1997-01-29|TAKE BACK RETURN|RAIL| even platelets. sly +7908|383|12|1|28|35934.64|0.03|0.05|N|O|1997-01-22|1996-12-19|1997-02-14|TAKE BACK RETURN|MAIL|. fluffily pending instruc +7908|1932|21|2|37|67855.41|0.02|0.01|N|O|1996-11-05|1997-01-09|1996-11-20|TAKE BACK RETURN|FOB|silently even ideas cajole +7908|458|88|3|29|39395.05|0.03|0.03|N|O|1996-11-06|1997-01-06|1996-11-10|DELIVER IN PERSON|RAIL|lyly above the final, ironi +7908|1468|69|4|30|41083.80|0.04|0.06|N|O|1997-02-12|1996-11-28|1997-02-13|TAKE BACK RETURN|REG AIR|r theodolites. quickly final requ +7908|1106|79|5|30|30213.00|0.00|0.08|N|O|1996-11-03|1996-11-14|1996-11-15|DELIVER IN PERSON|RAIL|xpress foxes. +7908|188|67|6|23|25028.14|0.05|0.05|N|O|1997-02-10|1996-12-19|1997-02-20|NONE|RAIL| asymptotes +7908|842|9|7|32|55770.88|0.00|0.06|N|O|1996-11-26|1996-11-24|1996-12-25|NONE|MAIL| accounts. +7909|1874|18|1|1|1775.87|0.03|0.04|A|F|1994-03-06|1994-03-27|1994-03-12|TAKE BACK RETURN|RAIL|nt pinto beans about the +7909|30|6|2|38|35341.14|0.03|0.08|A|F|1994-01-21|1994-03-23|1994-01-25|DELIVER IN PERSON|FOB|packages use p +7909|670|33|3|10|15706.70|0.01|0.05|A|F|1994-02-11|1994-02-10|1994-03-01|TAKE BACK RETURN|FOB|p after the regularly even requests. caref +7910|1899|100|1|34|61230.26|0.03|0.00|A|F|1993-08-19|1993-05-24|1993-09-02|COLLECT COD|TRUCK|ackages sleep. sly +7910|499|100|2|10|13994.90|0.03|0.07|R|F|1993-06-15|1993-06-14|1993-06-26|COLLECT COD|REG AIR|ly. requests cajole +7910|1343|20|3|41|51017.94|0.05|0.06|A|F|1993-04-30|1993-07-04|1993-05-30|NONE|RAIL|s boost furious +7910|1110|47|4|21|21233.31|0.05|0.01|A|F|1993-07-01|1993-07-04|1993-07-19|NONE|AIR|final instructions outsid +7910|1284|96|5|43|50967.04|0.06|0.00|R|F|1993-05-08|1993-06-28|1993-05-13|TAKE BACK RETURN|TRUCK|regular dino +7910|743|76|6|25|41093.50|0.03|0.02|A|F|1993-07-30|1993-06-21|1993-08-09|COLLECT COD|AIR|ckages integrate thinly. regular pac +7910|1834|64|7|20|34716.60|0.04|0.05|R|F|1993-07-19|1993-06-19|1993-08-05|TAKE BACK RETURN|MAIL|es nag. furiously sp +7911|1163|72|1|5|5320.80|0.05|0.07|N|O|1997-12-09|1997-10-14|1997-12-21|COLLECT COD|REG AIR| ideas wake +7911|444|74|2|3|4033.32|0.00|0.00|N|O|1997-10-23|1997-11-29|1997-11-01|COLLECT COD|TRUCK|onic, express packages. express acco +7911|1327|66|3|25|30708.00|0.04|0.02|N|O|1997-12-20|1997-11-23|1997-12-22|TAKE BACK RETURN|FOB|s serve fluffily according to the expres +7911|290|18|4|39|46421.31|0.10|0.07|N|O|1997-10-31|1997-11-13|1997-11-04|COLLECT COD|AIR|requests could have to are +7911|323|80|5|8|9786.56|0.02|0.07|N|O|1997-10-01|1997-11-11|1997-10-12|COLLECT COD|AIR|ly about th +7936|251|79|1|19|21873.75|0.00|0.03|A|F|1993-06-21|1993-06-16|1993-07-08|NONE|FOB|ven packages +7936|200|27|2|30|33006.00|0.09|0.02|A|F|1993-05-20|1993-06-21|1993-06-18|DELIVER IN PERSON|MAIL|eep blithely. ironic accounts +7936|182|35|3|12|12986.16|0.10|0.05|A|F|1993-05-11|1993-06-20|1993-05-28|TAKE BACK RETURN|SHIP|g blithely r +7936|10|61|4|26|23660.26|0.07|0.02|A|F|1993-05-22|1993-05-27|1993-06-21|TAKE BACK RETURN|MAIL|ts cajole slyly accordi +7937|1102|39|1|14|14043.40|0.10|0.03|R|F|1993-05-15|1993-06-25|1993-06-08|TAKE BACK RETURN|AIR|al instructions sleep along th +7937|1879|66|2|30|53426.10|0.06|0.00|R|F|1993-07-20|1993-05-02|1993-08-17|DELIVER IN PERSON|FOB|ages cajole fluffil +7938|953|54|1|34|63034.30|0.04|0.08|A|F|1993-07-10|1993-04-13|1993-08-01|NONE|TRUCK|y bold asymptotes! t +7938|562|53|2|47|68740.32|0.09|0.04|A|F|1993-06-09|1993-06-04|1993-07-03|TAKE BACK RETURN|AIR| furiously alon +7938|1397|98|3|24|31161.36|0.07|0.07|A|F|1993-05-01|1993-05-03|1993-05-18|COLLECT COD|TRUCK| are regul +7939|1764|7|1|17|28317.92|0.08|0.03|N|O|1997-02-26|1996-12-20|1997-03-21|COLLECT COD|FOB|jole carefully +7939|1009|80|2|45|40950.00|0.09|0.08|N|O|1997-01-07|1997-01-22|1997-01-26|DELIVER IN PERSON|MAIL|unts against the regular accounts +7939|818|85|3|21|36095.01|0.06|0.06|N|O|1996-11-11|1997-01-13|1996-12-08|TAKE BACK RETURN|AIR| was. bold asymptotes unwind bl +7939|503|34|4|18|25263.00|0.10|0.01|N|O|1996-12-01|1996-12-04|1996-12-22|DELIVER IN PERSON|RAIL|lly even pinto beans. fluffily expres +7940|540|31|1|12|17286.48|0.03|0.01|N|O|1996-03-28|1996-05-05|1996-04-01|TAKE BACK RETURN|FOB| unusual, regular dependencies. careful +7941|477|36|1|11|15152.17|0.04|0.07|A|F|1992-04-16|1992-06-11|1992-05-04|TAKE BACK RETURN|FOB|the express, special requests sleep +7941|15|16|2|48|43920.48|0.03|0.01|R|F|1992-06-15|1992-04-24|1992-07-02|TAKE BACK RETURN|FOB|nal packages promise fin +7941|1055|91|3|20|19121.00|0.08|0.08|A|F|1992-04-07|1992-06-05|1992-04-08|TAKE BACK RETURN|SHIP|p! idly pending deposits us +7942|1620|44|1|16|24345.92|0.08|0.05|A|F|1994-08-07|1994-07-09|1994-08-23|COLLECT COD|RAIL|counts. final accounts haggle about the +7942|1052|23|2|45|42887.25|0.06|0.07|R|F|1994-05-12|1994-07-07|1994-05-18|COLLECT COD|TRUCK|ss, special theodolites sublate furiously +7942|508|69|3|3|4225.50|0.07|0.01|A|F|1994-05-03|1994-05-22|1994-05-28|DELIVER IN PERSON|MAIL|. furiously regu +7942|368|97|4|9|11415.24|0.00|0.04|R|F|1994-08-05|1994-07-13|1994-08-30|NONE|MAIL|y bold deposits +7942|654|55|5|12|18655.80|0.08|0.02|R|F|1994-08-10|1994-07-19|1994-08-27|TAKE BACK RETURN|AIR| among the carefully exp +7943|1938|71|1|26|47838.18|0.00|0.01|N|O|1996-09-26|1996-11-20|1996-10-25|COLLECT COD|MAIL|detect above the quick +7968|1713|14|1|44|71047.24|0.02|0.02|R|F|1993-12-14|1993-10-20|1993-12-16|COLLECT COD|FOB|e furiously regular, pending acc +7968|1438|78|2|28|37504.04|0.08|0.06|A|F|1994-01-10|1993-10-25|1994-02-09|NONE|FOB|ages doze fluffily ironic asymptotes. al +7968|760|93|3|23|38197.48|0.03|0.02|R|F|1993-10-20|1993-10-25|1993-11-12|NONE|RAIL|lar instructions use slyly at the furious +7968|7|33|4|22|19954.00|0.04|0.07|A|F|1993-12-25|1993-11-01|1994-01-24|TAKE BACK RETURN|TRUCK|efully brave deposits. accounts do wake a +7968|1671|13|5|34|53470.78|0.08|0.02|A|F|1993-10-16|1993-10-29|1993-10-19|NONE|MAIL|egular excuses. slyly final foxe +7969|483|71|1|28|38737.44|0.10|0.05|N|O|1998-11-02|1998-09-07|1998-11-17|TAKE BACK RETURN|FOB|counts wake slyly. pending theodolites boo +7969|1075|11|2|49|47827.43|0.03|0.05|N|O|1998-09-17|1998-09-23|1998-10-01|DELIVER IN PERSON|FOB|ever regular theodolites. furiousl +7969|980|81|3|5|9404.90|0.05|0.05|N|O|1998-08-04|1998-10-06|1998-08-14|DELIVER IN PERSON|REG AIR|oxes. blithely unusual dependencies u +7969|286|87|4|34|40333.52|0.04|0.04|N|O|1998-10-15|1998-09-13|1998-10-28|DELIVER IN PERSON|AIR|uickly. blithely +7969|448|7|5|6|8090.64|0.05|0.00|N|O|1998-09-05|1998-09-27|1998-09-13|COLLECT COD|RAIL|ending platelets. carefully bold ide +7969|1354|55|6|6|7532.10|0.07|0.08|N|O|1998-08-21|1998-09-20|1998-09-03|COLLECT COD|SHIP|o beans wake. unusual instructions +7970|743|76|1|26|42737.24|0.04|0.01|N|O|1996-11-26|1996-12-22|1996-12-20|DELIVER IN PERSON|SHIP|ffily quic +7970|254|36|2|36|41553.00|0.00|0.03|N|O|1997-01-06|1996-11-16|1997-02-02|DELIVER IN PERSON|MAIL|use furiously +7971|812|13|1|44|75363.64|0.09|0.04|R|F|1994-07-19|1994-07-07|1994-08-12|TAKE BACK RETURN|TRUCK|tions use slyly ab +7971|1739|66|2|27|44299.71|0.05|0.01|R|F|1994-08-05|1994-08-06|1994-09-03|COLLECT COD|MAIL|posits against the slyly express pin +7971|1527|48|3|19|27141.88|0.07|0.08|A|F|1994-09-28|1994-08-10|1994-10-25|COLLECT COD|FOB|ss instructions impress final dependenci +7972|687|88|1|8|12701.44|0.01|0.05|N|O|1998-07-13|1998-07-10|1998-08-05|COLLECT COD|FOB| nag boldly. silent accou +7972|1211|23|2|11|12234.31|0.03|0.00|N|O|1998-09-11|1998-07-22|1998-10-04|COLLECT COD|AIR|es. fluffy requests sl +7972|1214|89|3|2|2230.42|0.07|0.00|N|O|1998-08-12|1998-08-11|1998-08-22|DELIVER IN PERSON|RAIL|olphins. quickly special deposits are. pint +7972|423|82|4|44|58230.48|0.02|0.00|N|O|1998-05-28|1998-07-27|1998-05-29|COLLECT COD|SHIP|y about th +7972|1904|5|5|47|84877.30|0.08|0.03|N|O|1998-08-16|1998-08-10|1998-09-04|DELIVER IN PERSON|REG AIR|sly. pinto beans cajole furi +7972|1851|52|6|25|43821.25|0.10|0.05|N|O|1998-07-23|1998-07-16|1998-08-03|TAKE BACK RETURN|RAIL|ss the furiously regular deposit +7972|305|62|7|24|28927.20|0.06|0.04|N|O|1998-07-15|1998-07-01|1998-08-04|NONE|MAIL|carefully ironi +7973|1970|15|1|43|80494.71|0.05|0.06|A|F|1992-02-29|1992-04-20|1992-03-04|DELIVER IN PERSON|FOB| carefully regular accounts about the bl +7974|1979|80|1|31|58310.07|0.03|0.00|A|F|1992-07-01|1992-08-11|1992-07-30|COLLECT COD|FOB|unts. blithely even theod +7975|731|28|1|28|45688.44|0.08|0.03|N|O|1997-05-14|1997-04-29|1997-05-30|COLLECT COD|TRUCK|ar, regular dep +8000|1337|76|1|28|34673.24|0.05|0.03|A|F|1994-01-11|1993-11-28|1994-01-18|DELIVER IN PERSON|AIR|gside of the s +8000|1668|51|2|23|36102.18|0.09|0.02|R|F|1993-10-15|1993-11-05|1993-11-08|NONE|FOB| deposits; unusual somas +8000|1967|56|3|42|78496.32|0.09|0.04|A|F|1993-12-08|1993-11-27|1994-01-02|COLLECT COD|SHIP|l requests acros +8000|1497|37|4|29|40556.21|0.00|0.08|A|F|1993-11-22|1993-11-17|1993-12-05|TAKE BACK RETURN|RAIL|inal, final deposi +8000|623|17|5|23|35043.26|0.10|0.04|A|F|1993-10-05|1993-10-21|1993-10-30|TAKE BACK RETURN|RAIL| carefully furious theodoli +8000|1463|42|6|11|15009.06|0.10|0.00|R|F|1993-11-16|1993-12-08|1993-11-29|COLLECT COD|REG AIR|yly. regular foxes integra +8001|1985|86|1|26|49061.48|0.04|0.07|A|F|1994-03-08|1994-02-01|1994-03-13|DELIVER IN PERSON|RAIL|l deposits are carefully. furiously reg +8001|1123|60|2|5|5120.60|0.10|0.06|R|F|1993-11-26|1994-02-09|1993-12-20|TAKE BACK RETURN|AIR| boost furiously. furiously ironi +8001|1146|55|3|46|48168.44|0.00|0.01|R|F|1994-01-07|1993-12-31|1994-01-24|NONE|AIR| the slyly silent pinto beans sle +8001|605|68|4|20|30112.00|0.02|0.05|R|F|1994-03-17|1994-02-07|1994-03-29|DELIVER IN PERSON|SHIP| ironic dinos; quickly +8001|852|19|5|40|70114.00|0.08|0.02|R|F|1994-01-06|1993-12-31|1994-01-11|NONE|RAIL|ges was. fluffily regular packages +8001|566|57|6|22|32264.32|0.06|0.06|R|F|1993-12-24|1994-01-25|1994-01-17|NONE|RAIL|ely regular accounts use above the +8001|1015|51|7|16|14656.16|0.05|0.02|A|F|1993-12-26|1994-02-02|1994-01-25|NONE|RAIL|ounts sleep slyly ironic d +8002|992|93|1|48|90863.52|0.08|0.05|R|F|1993-03-26|1993-05-23|1993-04-17|NONE|TRUCK|ests wake fluffy waters? bol +8002|188|41|2|32|34821.76|0.04|0.08|R|F|1993-06-12|1993-05-23|1993-06-17|COLLECT COD|FOB| regular packages haggle ironic +8002|1355|56|3|47|59048.45|0.06|0.03|A|F|1993-07-11|1993-06-08|1993-07-16|DELIVER IN PERSON|SHIP|ironic accounts nag even deposits. u +8003|490|78|1|20|27809.80|0.07|0.00|N|O|1996-01-22|1995-11-25|1996-02-17|NONE|REG AIR|osits haggle f +8003|1962|63|2|40|74558.40|0.03|0.00|N|O|1996-01-05|1996-01-08|1996-01-14|TAKE BACK RETURN|FOB|e furiously even, even accounts. furious +8003|1988|77|3|25|47249.50|0.02|0.05|N|O|1995-12-19|1995-12-29|1995-12-29|TAKE BACK RETURN|AIR| furiously. som +8003|1270|82|4|14|16397.78|0.05|0.04|N|O|1996-01-30|1995-12-03|1996-02-24|NONE|MAIL|ve the furiously +8003|1996|85|5|44|83511.56|0.10|0.08|N|O|1995-12-09|1995-11-23|1996-01-06|TAKE BACK RETURN|FOB|ts. furiously even packages acco +8003|989|90|6|9|17009.82|0.07|0.07|N|O|1995-11-22|1995-12-28|1995-12-09|DELIVER IN PERSON|FOB|packages haggle quickl +8003|466|96|7|24|32795.04|0.10|0.04|N|O|1995-11-14|1996-01-16|1995-11-17|COLLECT COD|RAIL| bold reques +8004|548|9|1|46|66632.84|0.02|0.05|N|F|1995-06-08|1995-07-26|1995-07-06|TAKE BACK RETURN|FOB| ironic instructio +8004|109|10|2|40|40364.00|0.03|0.06|N|O|1995-09-09|1995-06-12|1995-09-16|DELIVER IN PERSON|AIR| requests will cajole furious +8004|1870|71|3|43|76190.41|0.01|0.04|N|O|1995-07-06|1995-07-31|1995-07-22|NONE|TRUCK| ironic deposits sol +8004|1684|26|4|25|39642.00|0.05|0.02|N|O|1995-08-26|1995-07-02|1995-09-19|COLLECT COD|AIR| beans? ca +8004|780|81|5|23|38657.94|0.03|0.06|N|O|1995-07-21|1995-06-24|1995-08-01|DELIVER IN PERSON|REG AIR| requests affix blithely bold, special pack +8004|991|92|6|11|20811.89|0.06|0.07|N|O|1995-09-08|1995-07-10|1995-09-22|NONE|MAIL|e bold requests maintain slyly among th +8005|716|49|1|19|30717.49|0.01|0.02|R|F|1992-05-28|1992-06-18|1992-06-06|NONE|REG AIR|fully even fo +8005|1840|27|2|19|33094.96|0.09|0.05|A|F|1992-07-10|1992-05-29|1992-08-06|TAKE BACK RETURN|RAIL|ccounts. blithely unusual pinto beans na +8005|493|52|3|47|65494.03|0.01|0.00|R|F|1992-07-10|1992-06-15|1992-07-15|TAKE BACK RETURN|FOB|arefully regular packages after t +8005|692|55|4|49|78041.81|0.04|0.03|R|F|1992-04-19|1992-06-19|1992-05-16|TAKE BACK RETURN|FOB|ackages. carefully ironic packages +8005|1383|60|5|31|39815.78|0.03|0.06|A|F|1992-04-24|1992-05-24|1992-05-23|DELIVER IN PERSON|RAIL|lly bold requests wake slyly around the e +8005|1345|46|6|2|2492.68|0.07|0.06|R|F|1992-07-08|1992-05-11|1992-07-29|TAKE BACK RETURN|AIR|posits cajole. special, express ac +8005|1260|72|7|30|34837.80|0.05|0.00|R|F|1992-04-08|1992-05-12|1992-05-01|DELIVER IN PERSON|REG AIR|aggle. quickly pending +8006|1450|90|1|7|9460.15|0.09|0.08|N|O|1995-09-29|1995-09-02|1995-10-23|COLLECT COD|AIR|counts breach +8006|1028|29|2|47|43663.94|0.02|0.05|N|O|1995-08-30|1995-08-24|1995-09-21|TAKE BACK RETURN|SHIP|theodolites. quickl +8006|455|43|3|36|48796.20|0.04|0.07|N|O|1995-08-22|1995-07-30|1995-09-12|COLLECT COD|FOB| unusual pinto beans. carefully +8006|909|44|4|43|77825.70|0.03|0.04|N|O|1995-07-30|1995-09-01|1995-08-17|DELIVER IN PERSON|SHIP|onic deposits are care +8006|1901|46|5|42|75721.80|0.06|0.00|N|O|1995-07-31|1995-07-09|1995-08-07|TAKE BACK RETURN|AIR|es. deposits run slyly slyly +8006|254|36|6|16|18468.00|0.03|0.00|N|F|1995-06-15|1995-07-18|1995-06-19|COLLECT COD|REG AIR|. slyly final dependencies hang even instr +8007|1304|5|1|50|60265.00|0.07|0.01|R|F|1992-04-24|1992-03-17|1992-05-22|NONE|FOB| pearls across the even d +8007|1438|56|2|41|54916.63|0.03|0.08|A|F|1992-02-16|1992-04-18|1992-03-02|COLLECT COD|TRUCK|uctions cajole slyly after t +8007|561|22|3|46|67231.76|0.01|0.06|R|F|1992-06-10|1992-05-11|1992-06-29|TAKE BACK RETURN|TRUCK|e ironic, regular +8007|909|44|4|31|56106.90|0.02|0.05|R|F|1992-04-23|1992-05-04|1992-05-15|DELIVER IN PERSON|FOB|ully after +8032|1280|92|1|34|40163.52|0.01|0.05|R|F|1995-01-17|1995-02-15|1995-01-28|COLLECT COD|SHIP|ideas poach quickly unusual accoun +8033|189|90|1|6|6535.08|0.09|0.08|A|F|1992-06-19|1992-06-14|1992-07-01|NONE|MAIL|le slyly f +8033|1242|43|2|1|1143.24|0.00|0.06|R|F|1992-06-19|1992-06-07|1992-06-29|NONE|REG AIR|ers engage evenly about the f +8033|1734|61|3|30|49071.90|0.05|0.01|A|F|1992-05-04|1992-06-02|1992-05-24|DELIVER IN PERSON|RAIL|d deposits at t +8033|898|98|4|20|35977.80|0.01|0.08|A|F|1992-05-24|1992-07-03|1992-05-29|NONE|REG AIR|sits nag blithely +8034|627|28|1|24|36662.88|0.00|0.08|A|F|1992-04-11|1992-03-08|1992-04-16|DELIVER IN PERSON|AIR|ged packages +8034|541|32|2|13|18740.02|0.02|0.02|A|F|1992-02-26|1992-03-08|1992-03-21|NONE|RAIL|ounts wake +8034|1131|32|3|16|16514.08|0.00|0.03|R|F|1992-01-22|1992-02-21|1992-01-24|TAKE BACK RETURN|FOB|, bold decoys nod. carefu +8034|192|71|4|35|38226.65|0.05|0.06|R|F|1992-03-07|1992-02-26|1992-03-29|DELIVER IN PERSON|REG AIR|sits. furiously f +8034|46|47|5|13|12298.52|0.02|0.00|R|F|1992-02-29|1992-03-29|1992-03-12|COLLECT COD|RAIL|kages. accounts haggle carefully about +8034|189|42|6|28|30497.04|0.04|0.04|R|F|1992-01-28|1992-02-22|1992-01-30|TAKE BACK RETURN|RAIL|ong the furiously express pearls. ca +8035|1529|50|1|42|60081.84|0.00|0.05|R|F|1992-06-04|1992-04-20|1992-06-21|DELIVER IN PERSON|TRUCK|sly final deposits. s +8035|500|59|2|31|43415.50|0.00|0.02|A|F|1992-04-20|1992-05-14|1992-05-15|DELIVER IN PERSON|AIR|usly regular instructions. pinto +8035|1909|42|3|4|7243.60|0.07|0.02|R|F|1992-04-11|1992-05-31|1992-05-02|NONE|SHIP| ironic grouches w +8035|1340|41|4|9|11172.06|0.05|0.02|A|F|1992-03-31|1992-04-23|1992-04-19|COLLECT COD|FOB|ackages on the stealthi +8035|1324|39|5|21|25731.72|0.07|0.03|A|F|1992-06-10|1992-04-21|1992-06-13|NONE|AIR|as. instructions cajole blithely final r +8035|403|33|6|16|20854.40|0.03|0.06|R|F|1992-05-14|1992-04-23|1992-05-17|TAKE BACK RETURN|AIR| careful pinto beans. close accoun +8035|1697|39|7|18|28776.42|0.03|0.06|A|F|1992-04-04|1992-05-24|1992-04-26|TAKE BACK RETURN|AIR| stealthily slyly unusual requests. +8036|1288|26|1|20|23785.60|0.00|0.01|N|O|1997-04-26|1997-06-22|1997-05-14|TAKE BACK RETURN|SHIP|xpress platelets sublate quickly +8036|409|10|2|14|18331.60|0.05|0.05|N|O|1997-05-26|1997-06-01|1997-06-23|COLLECT COD|AIR|kly along the ironic platelet +8036|809|76|3|29|49584.20|0.08|0.08|N|O|1997-06-22|1997-06-25|1997-07-05|TAKE BACK RETURN|REG AIR|iously special accounts; final, ironic ins +8036|902|5|4|16|28846.40|0.02|0.00|N|O|1997-06-18|1997-05-21|1997-07-14|TAKE BACK RETURN|REG AIR|ake slyly quickly even instructions. i +8036|1669|11|5|30|47119.80|0.08|0.06|N|O|1997-04-17|1997-06-14|1997-04-27|TAKE BACK RETURN|RAIL|tructions. blithely pend +8036|638|70|6|6|9231.78|0.09|0.05|N|O|1997-08-11|1997-06-20|1997-09-07|NONE|AIR| slyly final re +8036|1316|31|7|39|47475.09|0.09|0.04|N|O|1997-05-24|1997-05-20|1997-05-29|TAKE BACK RETURN|MAIL|ilently alongside of the quickly ironic pa +8037|153|54|1|4|4212.60|0.10|0.04|N|O|1996-07-07|1996-05-07|1996-07-31|NONE|RAIL|nic platel +8037|11|62|2|48|43728.48|0.02|0.08|N|O|1996-05-24|1996-04-20|1996-06-19|DELIVER IN PERSON|SHIP| the ironic, bold accounts. slyly bold re +8037|1466|45|3|38|51963.48|0.08|0.00|N|O|1996-05-21|1996-04-30|1996-06-05|DELIVER IN PERSON|FOB|thely across the furiously +8037|1353|92|4|42|52682.70|0.03|0.00|N|O|1996-05-26|1996-05-21|1996-06-04|DELIVER IN PERSON|FOB|ongside of the ideas. blithel +8038|603|4|1|48|72172.80|0.05|0.01|A|F|1992-12-02|1992-12-04|1992-12-16|NONE|MAIL|ckages wake. regularly final f +8038|1379|56|2|29|37130.73|0.04|0.02|A|F|1992-12-23|1993-01-10|1993-01-07|TAKE BACK RETURN|REG AIR|fully quickly express r +8038|683|46|3|8|12669.44|0.06|0.03|A|F|1993-01-23|1992-12-24|1993-02-20|NONE|TRUCK|y even accounts i +8039|1989|90|1|11|20800.78|0.06|0.06|A|F|1992-10-24|1992-11-12|1992-10-26|TAKE BACK RETURN|TRUCK|olites wake ironic, special accoun +8039|542|33|2|45|64914.30|0.06|0.06|A|F|1992-12-16|1992-10-14|1993-01-06|COLLECT COD|REG AIR|ong the final, even n +8064|1926|59|1|30|54837.60|0.09|0.07|N|O|1995-08-03|1995-06-13|1995-08-19|TAKE BACK RETURN|FOB|eodolites integrate furiously about +8064|1749|92|2|47|77584.78|0.06|0.01|N|F|1995-05-23|1995-07-23|1995-06-22|COLLECT COD|AIR|d grow at the final acco +8064|1569|70|3|25|36764.00|0.01|0.01|N|O|1995-08-16|1995-06-27|1995-09-09|DELIVER IN PERSON|RAIL|fily above the slyly e +8064|171|98|4|6|6427.02|0.05|0.07|N|O|1995-06-21|1995-08-03|1995-06-23|TAKE BACK RETURN|TRUCK|ng requests wake slyly +8065|103|82|1|36|36111.60|0.03|0.00|R|F|1992-12-20|1992-12-01|1992-12-21|NONE|TRUCK|uses wake blithely. carefully e +8065|916|19|2|48|87211.68|0.01|0.02|A|F|1993-01-21|1992-12-18|1993-02-05|COLLECT COD|REG AIR| dogged asymptotes. +8065|1818|48|3|30|51594.30|0.03|0.02|A|F|1993-01-14|1993-01-12|1993-02-07|DELIVER IN PERSON|RAIL|egular ideas sublate a +8065|1902|91|4|6|10823.40|0.04|0.02|R|F|1993-01-25|1993-01-14|1993-02-13|DELIVER IN PERSON|SHIP|e express, regular foxes haggle theodoli +8065|926|29|5|12|21923.04|0.08|0.01|R|F|1992-12-28|1992-12-13|1993-01-13|TAKE BACK RETURN|TRUCK|regular requests along the final, +8065|288|43|6|4|4753.12|0.10|0.08|A|F|1993-01-05|1992-12-23|1993-01-23|COLLECT COD|TRUCK|fluffily. slyly +8066|1476|55|1|17|23416.99|0.10|0.03|N|O|1997-04-24|1997-03-11|1997-05-15|TAKE BACK RETURN|REG AIR|ructions are blithely agains +8066|1682|83|2|29|45926.72|0.09|0.08|N|O|1997-05-02|1997-03-11|1997-06-01|NONE|FOB|ly unusual instructions. ironic inst +8066|1682|65|3|5|7918.40|0.06|0.00|N|O|1997-02-12|1997-03-15|1997-02-22|TAKE BACK RETURN|SHIP|. final, express packages nag regular +8066|1685|9|4|30|47600.40|0.06|0.03|N|O|1997-02-13|1997-04-03|1997-02-25|DELIVER IN PERSON|MAIL|above the instructions. quickly regul +8066|1612|54|5|45|68112.45|0.04|0.08|N|O|1997-05-09|1997-04-30|1997-05-21|DELIVER IN PERSON|TRUCK|posits lose about the acco +8067|94|70|1|46|45728.14|0.01|0.05|R|F|1992-05-03|1992-04-20|1992-05-08|COLLECT COD|FOB|ust use slyly regular ideas. final exc +8067|1010|81|2|2|1822.02|0.04|0.06|A|F|1992-02-27|1992-04-05|1992-03-01|COLLECT COD|REG AIR|xes detect finally pending idea +8067|495|96|3|37|51633.13|0.08|0.03|A|F|1992-03-09|1992-04-10|1992-03-22|TAKE BACK RETURN|REG AIR|al requests cajole blithely about the +8068|6|7|1|31|28086.00|0.01|0.04|N|O|1996-09-01|1996-10-28|1996-09-22|DELIVER IN PERSON|AIR|efully along the pendin +8068|1454|33|2|26|35241.70|0.03|0.07|N|O|1996-10-12|1996-09-22|1996-10-24|COLLECT COD|MAIL|es. furiously regular requests nag after th +8068|646|78|3|25|38666.00|0.04|0.03|N|O|1996-08-16|1996-09-19|1996-09-13|TAKE BACK RETURN|RAIL|bout the furio +8068|136|37|4|31|32120.03|0.03|0.07|N|O|1996-10-12|1996-09-25|1996-11-06|COLLECT COD|TRUCK|tions atop the fur +8068|1924|25|5|37|67559.04|0.08|0.03|N|O|1996-10-16|1996-10-10|1996-10-30|COLLECT COD|MAIL|ly bold deposit +8068|1675|76|6|36|56760.12|0.07|0.02|N|O|1996-10-21|1996-11-04|1996-10-22|NONE|TRUCK| quickly after the pending dependencies. fu +8068|651|83|7|18|27929.70|0.03|0.02|N|O|1996-09-07|1996-11-03|1996-09-11|DELIVER IN PERSON|SHIP|cuses promise careful +8069|739|4|1|38|62309.74|0.07|0.00|A|F|1994-11-20|1994-10-07|1994-12-15|COLLECT COD|FOB|fully across the slyl +8069|723|88|2|28|45464.16|0.09|0.00|A|F|1994-09-08|1994-10-17|1994-09-30|DELIVER IN PERSON|MAIL| among the final, +8069|88|14|3|37|36558.96|0.01|0.00|A|F|1994-09-04|1994-10-05|1994-09-21|DELIVER IN PERSON|REG AIR|al package +8070|1846|76|1|16|27965.44|0.04|0.00|A|F|1992-04-10|1992-03-23|1992-04-16|COLLECT COD|REG AIR|usual accounts are quickly accordi +8070|1072|73|2|39|37949.73|0.00|0.00|A|F|1992-05-09|1992-04-09|1992-05-14|DELIVER IN PERSON|FOB|ffily express foxes eat int +8070|1026|27|3|13|12051.26|0.07|0.08|A|F|1992-04-21|1992-03-02|1992-05-10|NONE|REG AIR|r the carefully even depo +8070|1862|92|4|50|88193.00|0.04|0.03|R|F|1992-05-20|1992-04-22|1992-06-13|COLLECT COD|REG AIR|ages engage +8070|1353|68|5|42|52682.70|0.01|0.03|A|F|1992-03-31|1992-02-29|1992-04-09|NONE|TRUCK|ely. blithely express accounts ar +8070|679|42|6|38|60027.46|0.07|0.00|A|F|1992-03-30|1992-03-25|1992-04-18|COLLECT COD|FOB|usual deposi +8070|1532|73|7|49|70242.97|0.05|0.01|R|F|1992-03-05|1992-04-10|1992-04-02|DELIVER IN PERSON|MAIL|y pending de +8071|305|34|1|50|60265.00|0.03|0.08|N|O|1996-07-14|1996-06-05|1996-08-07|COLLECT COD|FOB|ffix furiously a +8071|608|2|2|6|9051.60|0.06|0.02|N|O|1996-05-15|1996-06-10|1996-06-06|NONE|REG AIR|counts. furiously ironic pl +8071|1819|20|3|29|49903.49|0.03|0.02|N|O|1996-07-20|1996-06-06|1996-07-22|TAKE BACK RETURN|SHIP|ges nod furiously about +8071|1407|86|4|1|1308.40|0.02|0.07|N|O|1996-04-18|1996-05-09|1996-04-20|DELIVER IN PERSON|RAIL|e slyly according to the regular +8096|1684|8|1|37|58670.16|0.01|0.05|N|O|1997-01-22|1997-02-04|1997-02-19|COLLECT COD|REG AIR|long the final packag +8096|1032|38|2|38|35455.14|0.01|0.01|N|O|1997-02-12|1996-12-11|1997-03-02|NONE|FOB|refully silent instructions. f +8097|1462|41|1|1|1363.46|0.09|0.01|A|F|1994-03-24|1994-01-15|1994-04-12|TAKE BACK RETURN|REG AIR|es wake pa +8097|890|57|2|17|30445.13|0.07|0.03|R|F|1994-03-23|1994-02-21|1994-04-18|TAKE BACK RETURN|AIR|. slyly pending instruct +8097|1490|69|3|42|58442.58|0.09|0.06|A|F|1993-12-27|1994-02-24|1994-01-09|DELIVER IN PERSON|AIR|s-- final, regular +8097|1987|20|4|31|58558.38|0.01|0.06|A|F|1994-03-26|1994-01-18|1994-04-07|NONE|RAIL|pending deposits wake s +8097|63|39|5|2|1926.12|0.09|0.01|R|F|1994-02-14|1994-01-23|1994-03-09|NONE|REG AIR|ptotes. slyly special plat +8098|1211|12|1|21|23356.41|0.03|0.03|N|O|1997-12-13|1998-01-09|1998-01-11|NONE|AIR|o beans above the furiously pen +8098|1951|84|2|41|75970.95|0.02|0.08|N|O|1998-01-14|1998-01-06|1998-01-16|NONE|REG AIR|cording to the packages. qui +8099|144|23|1|17|17750.38|0.04|0.06|N|O|1996-02-05|1996-03-30|1996-03-02|COLLECT COD|TRUCK|y-- slyly regular deposits boost careful +8100|1670|12|1|49|77011.83|0.01|0.07|N|O|1997-04-05|1997-02-23|1997-04-19|COLLECT COD|MAIL|ges boost. slowly pendin +8100|1263|38|2|12|13971.12|0.06|0.07|N|O|1997-04-29|1997-04-01|1997-04-30|DELIVER IN PERSON|REG AIR|leep ironic depe +8100|221|3|3|10|11212.20|0.07|0.08|N|O|1997-05-06|1997-03-06|1997-05-26|TAKE BACK RETURN|SHIP| the carefull +8100|730|63|4|40|65229.20|0.06|0.00|N|O|1997-04-25|1997-04-04|1997-05-04|COLLECT COD|SHIP| silent deposits cajo +8100|1373|88|5|25|31859.25|0.08|0.05|N|O|1997-02-12|1997-02-21|1997-02-14|NONE|AIR|onic excuses +8100|27|28|6|19|17613.38|0.03|0.00|N|O|1997-05-03|1997-03-05|1997-05-16|DELIVER IN PERSON|REG AIR| across the ironic deposits +8100|814|14|7|42|72022.02|0.00|0.00|N|O|1997-03-20|1997-02-23|1997-04-02|COLLECT COD|REG AIR| requests sleep according to the regu +8101|554|85|1|12|17454.60|0.03|0.08|A|F|1993-04-11|1993-05-01|1993-04-28|COLLECT COD|AIR|al deposits. +8101|1042|13|2|18|16974.72|0.00|0.01|R|F|1993-03-17|1993-04-24|1993-04-08|DELIVER IN PERSON|SHIP|olphins. slowl +8101|381|10|3|14|17939.32|0.01|0.02|A|F|1993-04-19|1993-05-07|1993-05-15|COLLECT COD|AIR|ular deposits haggle regular, special the +8101|43|94|4|19|17917.76|0.04|0.06|R|F|1993-04-24|1993-04-21|1993-04-26|COLLECT COD|SHIP|eodolites. express instructions wake a +8101|1436|37|5|13|17386.59|0.02|0.04|A|F|1993-06-21|1993-04-16|1993-07-18|NONE|FOB|the regular dep +8101|564|25|6|19|27826.64|0.05|0.04|R|F|1993-03-31|1993-05-15|1993-04-12|TAKE BACK RETURN|TRUCK|along the ironically bold t +8101|1575|96|7|35|51679.95|0.04|0.04|R|F|1993-07-02|1993-05-16|1993-07-23|TAKE BACK RETURN|FOB| blithely fin +8102|1060|61|1|43|41325.58|0.05|0.04|N|O|1997-09-30|1997-08-23|1997-10-04|DELIVER IN PERSON|AIR| bold dinos wake against the regul +8102|702|35|2|35|56094.50|0.04|0.07|N|O|1997-07-23|1997-07-27|1997-08-04|COLLECT COD|AIR|escapades detect fu +8102|979|48|3|31|58279.07|0.09|0.04|N|O|1997-07-10|1997-08-12|1997-07-23|NONE|TRUCK|le deposits. slyly regul +8102|1953|86|4|45|83472.75|0.09|0.08|N|O|1997-09-04|1997-08-19|1997-09-11|TAKE BACK RETURN|TRUCK|efully. dependencies n +8102|1959|4|5|11|20470.45|0.04|0.06|N|O|1997-08-29|1997-08-10|1997-09-13|TAKE BACK RETURN|MAIL|tead of the final instructions. quic +8103|1927|72|1|16|29262.72|0.08|0.07|A|F|1994-12-31|1995-01-08|1995-01-19|TAKE BACK RETURN|AIR|ironic accou +8103|761|58|2|29|48191.04|0.00|0.07|R|F|1994-12-17|1995-02-01|1994-12-30|NONE|FOB|e carefully special +8103|1902|3|3|48|86587.20|0.02|0.08|R|F|1995-02-14|1994-12-22|1995-02-22|DELIVER IN PERSON|REG AIR|blithely final reque +8128|104|57|1|3|3012.30|0.01|0.08|N|O|1996-11-01|1996-11-04|1996-11-05|DELIVER IN PERSON|SHIP| pinto bean +8128|1190|91|2|11|12003.09|0.07|0.04|N|O|1996-12-13|1996-11-06|1996-12-25|NONE|MAIL|ar, express requests might dazzle s +8128|867|68|3|46|81321.56|0.05|0.03|N|O|1997-01-18|1996-12-18|1997-02-15|TAKE BACK RETURN|TRUCK|ual, bold requests about t +8129|635|36|1|39|59889.57|0.10|0.05|N|O|1998-03-17|1998-03-04|1998-04-04|DELIVER IN PERSON|SHIP|ccounts. regular, silent dependencies slee +8129|1062|98|2|37|35633.22|0.01|0.06|N|O|1998-04-30|1998-02-11|1998-05-26|COLLECT COD|RAIL|ess accounts nag special r +8129|808|8|3|8|13670.40|0.09|0.01|N|O|1998-04-08|1998-03-12|1998-05-02|COLLECT COD|AIR|even dependencies cajole furious +8129|1344|59|4|38|47322.92|0.05|0.04|N|O|1998-02-06|1998-03-04|1998-03-04|DELIVER IN PERSON|REG AIR|old accounts n +8130|1992|93|1|13|24621.87|0.05|0.07|R|F|1992-08-21|1992-08-09|1992-08-28|TAKE BACK RETURN|REG AIR| ironic requests affix flu +8130|515|76|2|28|39634.28|0.09|0.01|R|F|1992-07-17|1992-06-14|1992-08-01|TAKE BACK RETURN|SHIP| deposits. som +8131|1932|33|1|5|9169.65|0.01|0.07|R|F|1993-08-04|1993-07-10|1993-08-31|DELIVER IN PERSON|FOB|cording to the furiously +8131|1406|85|2|10|13074.00|0.08|0.02|A|F|1993-08-02|1993-07-29|1993-08-18|NONE|MAIL|deposits nag fluffily express accou +8132|1192|93|1|31|33888.89|0.09|0.08|A|F|1994-07-22|1994-06-30|1994-08-18|NONE|TRUCK|lites. requests are. blithely regular +8132|804|71|2|18|30686.40|0.10|0.02|R|F|1994-06-20|1994-08-04|1994-06-30|NONE|SHIP|e enticingly. +8132|1674|57|3|36|56724.12|0.07|0.03|R|F|1994-08-21|1994-07-17|1994-09-20|NONE|SHIP|e furiously along the ironic pinto +8132|1885|15|4|48|85770.24|0.00|0.01|A|F|1994-05-23|1994-07-29|1994-06-06|NONE|TRUCK|e asymptotes. ev +8132|733|66|5|3|4901.19|0.00|0.08|A|F|1994-09-03|1994-07-30|1994-09-15|COLLECT COD|FOB|equests among the final, ironi +8132|1605|47|6|47|70810.20|0.03|0.00|R|F|1994-08-23|1994-08-06|1994-09-02|NONE|AIR|s. furiously special packages run. +8133|1636|60|1|30|46128.90|0.05|0.04|R|F|1995-06-06|1995-04-23|1995-06-08|DELIVER IN PERSON|AIR|equests. closely e +8133|440|99|2|5|6702.20|0.07|0.08|A|F|1995-05-22|1995-04-05|1995-05-28|TAKE BACK RETURN|TRUCK|eas above the slyly ironic +8133|213|95|3|33|36735.93|0.06|0.07|R|F|1995-04-23|1995-03-31|1995-05-01|DELIVER IN PERSON|RAIL|ess asymptotes. slyly daring theodolites n +8133|1141|50|4|11|11463.54|0.03|0.04|N|F|1995-06-17|1995-05-16|1995-07-12|DELIVER IN PERSON|FOB|lar foxes. slyl +8133|852|19|5|38|66608.30|0.10|0.04|R|F|1995-04-08|1995-05-12|1995-04-12|DELIVER IN PERSON|REG AIR|quests affix slyly slyly ironic +8133|858|25|6|31|54524.35|0.07|0.05|R|F|1995-04-07|1995-05-09|1995-05-07|COLLECT COD|REG AIR|unts sleep ca +8134|982|51|1|6|11297.88|0.05|0.05|N|O|1998-03-14|1998-01-20|1998-03-27|NONE|TRUCK|o beans despite the furiously pendi +8134|899|99|2|23|41397.47|0.05|0.04|N|O|1998-01-25|1998-01-18|1998-02-19|TAKE BACK RETURN|FOB|ve the bold, s +8134|947|48|3|27|49894.38|0.06|0.04|N|O|1998-01-14|1997-12-25|1998-01-25|TAKE BACK RETURN|AIR|hins wake above the express +8134|1003|4|4|4|3616.00|0.01|0.02|N|O|1997-11-30|1997-12-16|1997-12-12|NONE|SHIP|osits use slyly above the care +8134|1257|69|5|23|26639.75|0.05|0.06|N|O|1998-01-19|1998-01-22|1998-01-28|COLLECT COD|AIR|es sleep. fluf +8134|506|7|6|23|32349.50|0.02|0.06|N|O|1998-01-21|1998-01-27|1998-02-04|DELIVER IN PERSON|MAIL|fts sleep. quickly regular asymptotes us +8134|1635|36|7|6|9219.78|0.05|0.07|N|O|1997-12-01|1998-02-10|1997-12-24|NONE|MAIL|deas around the slyl +8135|1142|15|1|50|52157.00|0.02|0.03|N|O|1995-07-08|1995-08-11|1995-07-22|NONE|MAIL|sly express accounts. +8135|173|74|2|30|32195.10|0.07|0.05|N|O|1995-07-04|1995-08-22|1995-07-17|DELIVER IN PERSON|RAIL|ccounts. furiously silent warthogs +8135|1542|43|3|7|10104.78|0.02|0.07|N|O|1995-08-30|1995-08-05|1995-09-22|DELIVER IN PERSON|REG AIR|usly special th +8135|635|29|4|11|16891.93|0.04|0.05|N|O|1995-07-23|1995-09-14|1995-07-27|TAKE BACK RETURN|AIR|special, bold accounts haggle f +8135|1353|68|5|7|8780.45|0.10|0.08|N|O|1995-09-15|1995-08-24|1995-09-18|COLLECT COD|REG AIR|y express excuses. unusual accounts +8160|1378|55|1|50|63968.50|0.09|0.00|N|O|1996-07-20|1996-06-11|1996-08-06|NONE|MAIL|avely unusual ideas about the silent accoun +8160|1006|42|2|49|44443.00|0.09|0.00|N|O|1996-05-14|1996-06-15|1996-05-21|NONE|RAIL|g packages boost quickly across the bold p +8160|1383|98|3|36|46237.68|0.09|0.06|N|O|1996-08-09|1996-07-04|1996-08-26|DELIVER IN PERSON|MAIL| engage across the fur +8161|1285|97|1|4|4745.12|0.00|0.04|A|F|1994-06-24|1994-07-15|1994-07-12|NONE|FOB|wake silent +8161|479|67|2|8|11035.76|0.02|0.05|R|F|1994-09-18|1994-08-02|1994-10-04|DELIVER IN PERSON|REG AIR|arefully after the +8162|662|56|1|47|73445.02|0.03|0.02|R|F|1994-12-27|1994-11-12|1995-01-24|COLLECT COD|MAIL|ending foxes sleep furiously. furiously pe +8162|1785|86|2|44|74218.32|0.07|0.00|A|F|1994-12-10|1994-12-01|1994-12-14|COLLECT COD|FOB|quickly even asymptotes nag quickly eve +8162|1780|23|3|8|13454.24|0.10|0.06|A|F|1994-12-13|1994-12-31|1994-12-28|COLLECT COD|SHIP|unts detect abov +8162|200|79|4|15|16503.00|0.06|0.07|A|F|1995-01-17|1994-11-08|1995-02-04|NONE|AIR|ackages haggl +8162|515|16|5|7|9908.57|0.05|0.04|A|F|1994-11-26|1994-11-16|1994-12-13|DELIVER IN PERSON|MAIL|alongside of the slyly pending +8162|1593|94|6|24|35870.16|0.00|0.01|R|F|1994-12-03|1994-12-14|1994-12-30|COLLECT COD|TRUCK|ide the slyly f +8162|761|26|7|37|61485.12|0.08|0.03|A|F|1995-01-14|1994-11-24|1995-02-10|TAKE BACK RETURN|MAIL| courts cajole blithely furiously +8163|704|5|1|19|30489.30|0.05|0.04|N|O|1997-04-17|1997-04-28|1997-04-29|NONE|AIR|inal accounts boost care +8163|226|54|2|42|47301.24|0.07|0.01|N|O|1997-04-23|1997-03-23|1997-05-21|DELIVER IN PERSON|TRUCK|thely regul +8163|683|77|3|15|23755.20|0.07|0.08|N|O|1997-05-19|1997-03-27|1997-06-09|NONE|SHIP| instructio +8163|973|42|4|36|67462.92|0.05|0.02|N|O|1997-06-01|1997-04-08|1997-06-03|DELIVER IN PERSON|RAIL|ular pinto beans-- enticing, e +8163|57|8|5|7|6699.35|0.02|0.07|N|O|1997-03-23|1997-04-01|1997-04-06|TAKE BACK RETURN|SHIP|ecial ideas cajole blithe +8164|1371|10|1|42|53439.54|0.04|0.08|R|F|1994-11-19|1994-10-18|1994-12-10|COLLECT COD|RAIL|t the furiously iro +8164|537|28|2|35|50313.55|0.03|0.03|A|F|1995-01-01|1994-11-25|1995-01-02|COLLECT COD|AIR|ly bold platelets integrate above the f +8164|1300|12|3|17|20422.10|0.02|0.07|A|F|1994-11-13|1994-11-15|1994-12-05|COLLECT COD|MAIL|ssly bold pinto +8164|1723|8|4|34|55240.48|0.00|0.05|R|F|1994-12-12|1994-10-23|1995-01-05|DELIVER IN PERSON|SHIP|ess, regular ideas haggle carefully a +8164|379|64|5|32|40939.84|0.06|0.07|R|F|1994-11-19|1994-12-14|1994-12-16|COLLECT COD|FOB|ach unusual theodo +8165|1250|51|1|25|28781.25|0.09|0.00|A|F|1994-12-04|1995-01-01|1994-12-31|DELIVER IN PERSON|REG AIR|ts about th +8165|1667|9|2|43|67452.38|0.01|0.03|A|F|1994-11-02|1994-12-04|1994-12-01|TAKE BACK RETURN|MAIL|sleep about t +8165|1108|9|3|31|31282.10|0.00|0.07|A|F|1994-12-20|1994-11-28|1994-12-25|COLLECT COD|REG AIR| deposits. sl +8165|1748|75|4|17|28045.58|0.10|0.04|A|F|1994-12-09|1994-12-04|1994-12-11|DELIVER IN PERSON|MAIL|ar deposits. finally regu +8165|269|51|5|45|52616.70|0.01|0.06|R|F|1994-10-22|1995-01-11|1994-11-07|DELIVER IN PERSON|FOB|ccounts x-ray quickly about the +8165|984|53|6|11|20734.78|0.01|0.02|R|F|1994-11-28|1994-11-30|1994-12-18|COLLECT COD|FOB|special packages wak +8166|570|71|1|13|19117.41|0.09|0.03|N|O|1997-02-23|1997-04-19|1997-03-05|NONE|FOB|hockey players. slyly regular +8166|1462|2|2|46|62719.16|0.04|0.06|N|O|1997-05-18|1997-04-14|1997-06-12|TAKE BACK RETURN|RAIL|arefully regular platele +8166|1733|18|3|40|65389.20|0.00|0.03|N|O|1997-02-22|1997-05-06|1997-02-28|COLLECT COD|SHIP|oxes according to the quickly expres +8166|1580|61|4|45|66671.10|0.08|0.08|N|O|1997-04-27|1997-04-26|1997-05-27|TAKE BACK RETURN|TRUCK|ronic inst +8166|1965|98|5|19|35472.24|0.01|0.07|N|O|1997-05-18|1997-04-21|1997-06-09|TAKE BACK RETURN|SHIP|s on the sly +8166|1386|25|6|6|7724.28|0.03|0.06|N|O|1997-03-20|1997-04-14|1997-04-14|NONE|MAIL|e. unusual, bold req +8166|780|45|7|47|78996.66|0.05|0.05|N|O|1997-04-08|1997-03-14|1997-04-26|TAKE BACK RETURN|TRUCK|nod slyly car +8167|891|91|1|28|50172.92|0.10|0.05|A|F|1992-09-04|1992-10-11|1992-09-13|COLLECT COD|TRUCK|ilent requests haggl +8167|1026|32|2|45|41715.90|0.10|0.07|A|F|1992-11-19|1992-10-13|1992-11-26|TAKE BACK RETURN|MAIL|boost alon +8167|240|41|3|4|4560.96|0.03|0.05|A|F|1992-11-06|1992-10-30|1992-12-05|DELIVER IN PERSON|AIR|en deposits alongside of the slyly even s +8167|201|83|4|10|11012.00|0.02|0.02|A|F|1992-08-28|1992-09-04|1992-09-10|COLLECT COD|FOB| across the blithely +8192|748|81|1|45|74193.30|0.09|0.00|R|F|1995-03-02|1995-03-02|1995-03-06|COLLECT COD|AIR|uick deposits wake carefully +8193|535|36|1|35|50243.55|0.05|0.07|N|O|1997-09-25|1997-10-14|1997-10-18|TAKE BACK RETURN|TRUCK|unts wake about the busily even instru +8193|1104|13|2|37|37188.70|0.08|0.01|N|O|1997-09-17|1997-10-01|1997-10-15|NONE|FOB|oxes haggle blithely +8193|835|2|3|35|60754.05|0.10|0.00|N|O|1997-09-30|1997-09-27|1997-10-30|DELIVER IN PERSON|TRUCK|nts haggle +8193|3|29|4|37|33411.00|0.05|0.07|N|O|1997-10-28|1997-09-11|1997-11-10|NONE|MAIL|oxes. slyly re +8193|1086|57|5|18|17767.44|0.10|0.07|N|O|1997-08-27|1997-09-21|1997-08-31|COLLECT COD|RAIL|riously ironi +8193|1597|38|6|20|29971.80|0.04|0.02|N|O|1997-09-14|1997-10-06|1997-09-25|DELIVER IN PERSON|FOB|egular instru +8194|1831|32|1|34|58916.22|0.06|0.01|N|O|1996-02-11|1996-02-08|1996-02-12|NONE|FOB|counts. carefully bold p +8195|1469|70|1|25|34261.50|0.09|0.08|R|F|1995-03-13|1995-04-07|1995-03-17|TAKE BACK RETURN|TRUCK|he even, u +8195|1334|35|2|14|17294.62|0.02|0.02|R|F|1995-03-30|1995-03-25|1995-03-31|NONE|RAIL|ic excuses? express de +8195|1856|43|3|39|68556.15|0.02|0.02|R|F|1995-02-14|1995-03-14|1995-03-05|NONE|SHIP|requests cajole fluffily toward the +8195|1467|7|4|40|54738.40|0.00|0.02|R|F|1995-03-23|1995-02-13|1995-04-10|DELIVER IN PERSON|FOB|ccounts. accounts doubt +8195|310|11|5|24|29047.44|0.05|0.01|A|F|1995-05-02|1995-03-21|1995-05-08|COLLECT COD|MAIL|hogs. finally regular theodo +8196|195|74|1|1|1095.19|0.00|0.00|N|O|1997-11-11|1997-11-02|1997-11-16|TAKE BACK RETURN|MAIL|pinto beans. quickly express +8196|1932|33|2|37|67855.41|0.04|0.00|N|O|1997-10-31|1997-10-06|1997-11-20|TAKE BACK RETURN|RAIL|ckages are fluffily furiously i +8196|884|85|3|26|46406.88|0.06|0.06|N|O|1997-12-09|1997-11-02|1997-12-22|TAKE BACK RETURN|RAIL|fully ironic frays mold slyly after th +8196|1660|43|4|30|46849.80|0.08|0.07|N|O|1997-11-06|1997-11-20|1997-12-01|NONE|REG AIR|permanent ideas ab +8196|716|49|5|26|42034.46|0.00|0.07|N|O|1997-11-13|1997-10-16|1997-12-03|NONE|AIR| regular, final fox +8196|1738|65|6|17|27875.41|0.03|0.07|N|O|1997-10-24|1997-10-13|1997-11-02|COLLECT COD|SHIP| cajole pending ideas. quietly unusual th +8196|270|25|7|22|25745.94|0.01|0.08|N|O|1997-11-20|1997-11-16|1997-11-27|COLLECT COD|FOB|efully spe +8197|1043|79|1|23|21712.92|0.08|0.00|N|O|1998-02-19|1998-03-19|1998-03-08|NONE|MAIL|yly slyly unusual packag +8197|1198|7|2|27|29678.13|0.02|0.05|N|O|1998-02-01|1998-04-01|1998-02-07|COLLECT COD|RAIL|ully silent foxes; regular packag +8197|1682|83|3|25|39592.00|0.10|0.03|N|O|1998-02-02|1998-02-09|1998-02-22|NONE|RAIL| special instru +8197|1776|61|4|40|67110.80|0.00|0.06|N|O|1998-02-28|1998-03-31|1998-03-09|DELIVER IN PERSON|TRUCK|gular ideas. slyly pending Tiresias are bl +8198|948|83|1|40|73957.60|0.00|0.00|N|O|1997-06-14|1997-06-05|1997-07-13|TAKE BACK RETURN|REG AIR|s according to the ironic notornis wa +8198|1059|95|2|9|8640.45|0.02|0.05|N|O|1997-08-05|1997-07-04|1997-08-28|NONE|FOB|ld requests are furiously carefu +8199|257|39|1|27|31245.75|0.03|0.04|N|O|1997-04-09|1997-05-15|1997-05-03|DELIVER IN PERSON|MAIL|lose courts. unusual accounts +8224|1255|30|1|2|2312.50|0.02|0.03|A|F|1992-02-15|1992-03-13|1992-03-14|NONE|FOB|olites. slyly final instructions are fluff +8224|904|73|2|47|84830.30|0.10|0.02|R|F|1992-05-18|1992-05-07|1992-06-16|COLLECT COD|AIR|brave deposits nag carefully among +8224|1656|98|3|28|43614.20|0.06|0.03|A|F|1992-03-14|1992-04-08|1992-03-15|DELIVER IN PERSON|RAIL|the ironic, quick packages. carefull +8225|617|18|1|32|48563.52|0.03|0.08|R|F|1993-09-09|1993-10-06|1993-09-15|TAKE BACK RETURN|MAIL|sits. furiously unusual inst +8225|159|60|2|12|12709.80|0.03|0.02|A|F|1993-11-23|1993-11-01|1993-11-27|COLLECT COD|REG AIR| bold requests. quickl +8225|913|16|3|45|81625.95|0.02|0.03|A|F|1993-10-20|1993-10-13|1993-11-01|COLLECT COD|REG AIR|ages. carefully unusual plate +8225|1696|20|4|49|78286.81|0.08|0.04|R|F|1993-11-23|1993-10-19|1993-12-17|DELIVER IN PERSON|TRUCK|solve slyly reg +8226|731|28|1|34|55478.82|0.10|0.07|N|O|1996-04-12|1996-02-14|1996-04-20|COLLECT COD|FOB|tes will ca +8226|483|71|2|49|67790.52|0.10|0.07|N|O|1996-04-18|1996-02-24|1996-05-17|NONE|FOB|nd the bold accounts haggle carefully spe +8226|1936|81|3|21|38596.53|0.01|0.06|N|O|1996-02-29|1996-03-23|1996-03-18|DELIVER IN PERSON|REG AIR|ns. slyly final pi +8227|1458|76|1|32|43502.40|0.04|0.04|R|F|1993-04-05|1993-03-17|1993-05-03|COLLECT COD|FOB|final ideas +8227|1815|45|2|37|63521.97|0.02|0.08|R|F|1993-02-15|1993-04-06|1993-03-14|DELIVER IN PERSON|TRUCK|ithely even accounts integ +8227|601|2|3|34|51054.40|0.10|0.04|A|F|1993-04-03|1993-04-03|1993-04-20|DELIVER IN PERSON|FOB|s. fluffily express asymptotes caj +8227|1238|13|4|24|27341.52|0.05|0.07|A|F|1993-03-06|1993-04-10|1993-03-18|TAKE BACK RETURN|MAIL|usual requests. +8227|600|31|5|35|52521.00|0.05|0.05|R|F|1993-02-16|1993-02-28|1993-02-23|NONE|MAIL|le against the even pinto beans. reg +8227|471|30|6|25|34286.75|0.10|0.06|R|F|1993-04-23|1993-04-06|1993-05-15|TAKE BACK RETURN|TRUCK|ously quickly reg +8228|157|10|1|12|12685.80|0.00|0.08|A|F|1993-08-24|1993-09-10|1993-09-23|COLLECT COD|MAIL|s. quickly even requests +8228|1334|73|2|35|43236.55|0.09|0.00|A|F|1993-09-08|1993-10-06|1993-09-14|COLLECT COD|REG AIR|gle slyly slyly iro +8229|702|99|1|38|60902.60|0.09|0.04|A|F|1994-12-22|1995-02-14|1995-01-10|COLLECT COD|AIR|uests. blit +8229|1349|64|2|5|6251.70|0.09|0.06|R|F|1995-03-17|1995-01-21|1995-04-16|NONE|FOB|riously bold instructions use quietly blit +8229|1801|88|3|22|37461.60|0.06|0.07|R|F|1995-02-21|1995-01-21|1995-02-27|NONE|TRUCK|unts boost quickly. blithe +8229|1737|22|4|37|60633.01|0.10|0.05|R|F|1995-03-18|1995-02-18|1995-04-05|NONE|TRUCK|y fluffily regula +8229|1237|75|5|5|5691.15|0.06|0.02|R|F|1994-12-24|1995-02-15|1995-01-07|DELIVER IN PERSON|TRUCK|blithely above the quiet, +8229|1186|87|6|14|15220.52|0.02|0.05|A|F|1995-02-13|1995-01-12|1995-02-20|DELIVER IN PERSON|TRUCK|quests. regular, even id +8229|255|83|7|31|35812.75|0.03|0.05|A|F|1994-12-24|1995-02-14|1994-12-30|COLLECT COD|TRUCK|, even exc +8230|673|36|1|36|56652.12|0.02|0.01|N|O|1996-10-25|1996-09-08|1996-10-29|DELIVER IN PERSON|SHIP|furiously iro +8230|1136|37|2|9|9334.17|0.07|0.06|N|O|1996-08-27|1996-09-27|1996-08-28|DELIVER IN PERSON|FOB| ideas after t +8230|532|33|3|9|12892.77|0.02|0.06|N|O|1996-10-05|1996-10-02|1996-10-28|TAKE BACK RETURN|TRUCK|ully unusual deposits alo +8230|193|94|4|24|26236.56|0.02|0.01|N|O|1996-11-03|1996-09-20|1996-11-16|DELIVER IN PERSON|RAIL|oze carefully across the blithely expre +8230|1475|93|5|49|67447.03|0.08|0.00|N|O|1996-10-01|1996-10-31|1996-10-20|NONE|MAIL|olites wake. express instructions are +8230|1198|71|6|1|1099.19|0.03|0.02|N|O|1996-11-03|1996-09-19|1996-11-20|NONE|AIR|iously regular asymptotes nod ironic acc +8231|1720|5|1|5|8108.60|0.01|0.08|R|F|1992-11-16|1992-12-12|1992-12-05|DELIVER IN PERSON|TRUCK|y slyly unusua +8231|846|46|2|5|8734.20|0.05|0.01|A|F|1992-12-24|1992-11-30|1993-01-02|DELIVER IN PERSON|MAIL|rding to the even packages. slyly ironic +8231|863|30|3|6|10583.16|0.08|0.07|R|F|1992-12-20|1993-01-11|1993-01-15|NONE|AIR|lyly express deposits affix o +8231|1192|1|4|47|51379.93|0.00|0.05|A|F|1992-12-21|1992-12-17|1992-12-31|COLLECT COD|AIR| furiously silent +8231|1745|30|5|38|62576.12|0.05|0.02|R|F|1992-11-22|1993-01-11|1992-12-02|NONE|AIR|carefully within the even +8256|1039|75|1|34|31961.02|0.09|0.00|R|F|1992-10-29|1992-09-10|1992-11-15|DELIVER IN PERSON|MAIL|ets detect bli +8256|460|90|2|48|65302.08|0.06|0.07|R|F|1992-10-16|1992-09-29|1992-11-02|COLLECT COD|FOB|refully even platelets. quickly express ins +8256|1672|96|3|37|58225.79|0.06|0.06|A|F|1992-08-23|1992-10-28|1992-09-18|DELIVER IN PERSON|AIR|. bravely express court +8256|876|43|4|32|56859.84|0.00|0.01|A|F|1992-11-20|1992-11-02|1992-12-04|COLLECT COD|FOB|fluffily carefully spe +8257|89|40|1|14|13847.12|0.00|0.08|R|F|1994-07-07|1994-06-17|1994-08-01|COLLECT COD|TRUCK|ckages boost! blithely expre +8257|1978|67|2|7|13159.79|0.07|0.02|A|F|1994-05-16|1994-05-27|1994-05-28|DELIVER IN PERSON|TRUCK|e carefully ironic packages. enticing pint +8257|997|100|3|8|15183.92|0.01|0.03|A|F|1994-06-15|1994-05-19|1994-07-13|COLLECT COD|MAIL|onic accou +8257|1652|94|4|50|77682.50|0.10|0.02|R|F|1994-04-22|1994-05-26|1994-05-20|DELIVER IN PERSON|SHIP|ic packages along the fluffily ironi +8257|1967|12|5|42|78496.32|0.05|0.06|A|F|1994-06-22|1994-05-26|1994-07-10|DELIVER IN PERSON|SHIP|ly unusual i +8257|748|45|6|18|29677.32|0.08|0.04|R|F|1994-03-27|1994-05-25|1994-03-31|TAKE BACK RETURN|MAIL|arefully furiously bold requests. b +8258|1754|81|1|37|61262.75|0.08|0.03|A|F|1994-06-26|1994-05-31|1994-06-29|TAKE BACK RETURN|SHIP| carefully. slyly e +8258|1436|37|2|32|42797.76|0.05|0.04|R|F|1994-04-04|1994-04-05|1994-04-25|TAKE BACK RETURN|REG AIR|special pint +8258|415|16|3|46|60508.86|0.05|0.08|R|F|1994-03-21|1994-05-18|1994-03-27|DELIVER IN PERSON|AIR|long the excuse +8259|1742|43|1|23|37806.02|0.07|0.00|R|F|1994-08-17|1994-06-08|1994-09-06|NONE|MAIL| regular, +8259|858|92|2|10|17588.50|0.06|0.05|A|F|1994-06-23|1994-06-11|1994-06-26|TAKE BACK RETURN|SHIP|s nag beside the slyly unusual theodolite +8260|1066|72|1|1|967.06|0.05|0.01|A|F|1993-08-17|1993-07-26|1993-09-11|TAKE BACK RETURN|SHIP|riously instructions. fluffily b +8260|281|36|2|25|29532.00|0.08|0.07|R|F|1993-07-29|1993-07-01|1993-08-14|NONE|MAIL| blithely final accounts. b +8261|872|39|1|11|19501.57|0.08|0.00|R|F|1994-06-11|1994-06-04|1994-06-22|NONE|MAIL| regular instructions along +8261|1628|70|2|33|50477.46|0.04|0.02|R|F|1994-07-26|1994-05-20|1994-08-18|COLLECT COD|AIR| sheaves. carefully regula +8261|1651|93|3|22|34158.30|0.04|0.00|A|F|1994-06-12|1994-07-11|1994-07-06|TAKE BACK RETURN|MAIL| furiously behind the b +8261|1468|69|4|12|16433.52|0.01|0.00|A|F|1994-05-22|1994-06-23|1994-06-21|DELIVER IN PERSON|SHIP|ent requests. depo +8261|1614|38|5|6|9093.66|0.02|0.04|R|F|1994-06-02|1994-07-07|1994-06-08|COLLECT COD|FOB|pecial theodolites sl +8262|696|97|1|43|68657.67|0.05|0.05|N|O|1998-05-29|1998-06-28|1998-06-08|TAKE BACK RETURN|FOB|ily above the furious +8262|468|27|2|20|27369.20|0.06|0.02|N|O|1998-08-28|1998-07-17|1998-09-16|NONE|FOB|the requests. carefully even packages +8262|964|99|3|35|65273.60|0.10|0.01|N|O|1998-07-25|1998-06-19|1998-08-11|COLLECT COD|RAIL| even packages boost +8262|1228|29|4|23|25972.06|0.05|0.04|N|O|1998-06-22|1998-07-25|1998-07-11|COLLECT COD|SHIP|lly blithe +8263|1078|14|1|29|28393.03|0.10|0.00|A|F|1995-03-22|1995-03-10|1995-04-14|DELIVER IN PERSON|FOB| ideas wake sly +8263|1613|96|2|26|39379.86|0.07|0.01|A|F|1995-05-21|1995-03-14|1995-06-14|TAKE BACK RETURN|RAIL|es maintain. requests +8263|520|21|3|5|7102.60|0.01|0.01|R|F|1995-03-08|1995-03-16|1995-04-01|DELIVER IN PERSON|TRUCK|special packages solv +8263|279|7|4|42|49529.34|0.04|0.07|R|F|1995-04-08|1995-03-08|1995-04-10|DELIVER IN PERSON|MAIL|ular instructions haggle sl +8288|510|71|1|8|11284.08|0.09|0.02|N|O|1995-07-12|1995-06-19|1995-08-01|COLLECT COD|REG AIR|ickly final orbits cajole blithely carefull +8288|184|63|2|35|37946.30|0.04|0.05|N|O|1995-06-29|1995-06-13|1995-07-08|NONE|RAIL|blithe deposits above the f +8288|727|24|3|39|63481.08|0.02|0.02|N|O|1995-08-09|1995-07-24|1995-08-24|TAKE BACK RETURN|MAIL|ely furiously pending deposits. unusu +8288|1077|83|4|23|22495.61|0.01|0.03|N|O|1995-08-26|1995-08-02|1995-08-30|COLLECT COD|MAIL|ngside of the even platelets. final request +8288|1062|98|5|3|2889.18|0.07|0.05|N|O|1995-06-25|1995-07-30|1995-07-05|NONE|FOB|hlessly express acc +8288|323|8|6|33|40369.56|0.04|0.08|N|O|1995-07-21|1995-08-02|1995-08-13|DELIVER IN PERSON|REG AIR|nal requests haggle carefully ev +8289|1046|82|1|41|38828.64|0.00|0.00|R|F|1992-12-19|1993-01-18|1992-12-23|COLLECT COD|TRUCK| unusual theodol +8289|1549|70|2|42|60922.68|0.07|0.01|A|F|1992-12-11|1993-01-04|1993-01-05|NONE|TRUCK|en deposits +8289|758|59|3|42|69667.50|0.08|0.08|A|F|1992-11-01|1993-01-05|1992-11-25|TAKE BACK RETURN|MAIL|. furiously express accou +8289|910|13|4|1|1810.91|0.03|0.03|A|F|1992-11-17|1993-01-19|1992-11-24|NONE|REG AIR|ts haggle above the carefully s +8290|1776|3|1|41|68788.57|0.09|0.05|A|F|1995-01-23|1995-01-10|1995-02-21|TAKE BACK RETURN|SHIP|counts mold blithely above the regular pai +8290|802|2|2|3|5108.40|0.09|0.08|A|F|1995-04-01|1995-02-26|1995-04-29|TAKE BACK RETURN|MAIL|uffily along +8290|976|45|3|34|63816.98|0.10|0.01|A|F|1995-03-15|1995-02-28|1995-03-19|NONE|REG AIR|r requests +8291|1749|34|1|34|56125.16|0.08|0.02|R|F|1992-08-07|1992-07-03|1992-09-04|DELIVER IN PERSON|MAIL|affix against the quickly final pinto +8291|1600|81|2|3|4504.80|0.05|0.03|R|F|1992-09-13|1992-07-12|1992-10-11|TAKE BACK RETURN|FOB| unusual f +8292|1940|41|1|27|49732.38|0.09|0.05|A|F|1993-03-26|1993-03-31|1993-04-24|TAKE BACK RETURN|MAIL|ularly among the +8292|336|37|2|45|55634.85|0.04|0.06|R|F|1993-04-15|1993-04-18|1993-05-10|NONE|MAIL| regular waters. even +8292|346|31|3|7|8724.38|0.05|0.04|R|F|1993-06-02|1993-05-03|1993-06-06|TAKE BACK RETURN|SHIP|fter the blithely regular packages su +8292|1134|43|4|23|23807.99|0.03|0.07|R|F|1993-05-31|1993-03-05|1993-06-20|NONE|FOB|e the final, bold req +8292|211|66|5|6|6667.26|0.05|0.05|A|F|1993-02-06|1993-04-17|1993-03-08|TAKE BACK RETURN|FOB|avely even accounts according to +8293|147|74|1|50|52357.00|0.07|0.06|A|F|1992-10-01|1992-09-16|1992-10-25|NONE|TRUCK|ke even ideas. carefully ironic p +8293|1060|61|2|42|40364.52|0.03|0.06|R|F|1992-08-21|1992-09-24|1992-08-23|DELIVER IN PERSON|SHIP| the slyly eve +8293|1835|65|3|5|8684.15|0.10|0.06|A|F|1992-11-30|1992-09-20|1992-12-21|DELIVER IN PERSON|SHIP|egrate alongside of the furi +8293|174|75|4|34|36521.78|0.00|0.08|A|F|1992-08-20|1992-11-01|1992-09-15|TAKE BACK RETURN|AIR|ic foxes about t +8294|855|22|1|33|57943.05|0.08|0.04|R|F|1992-10-11|1992-08-01|1992-11-05|COLLECT COD|SHIP|e regularly quickly final escapades. s +8294|372|73|2|9|11451.33|0.01|0.02|R|F|1992-08-16|1992-08-05|1992-08-19|DELIVER IN PERSON|SHIP|uffily iron +8294|1103|4|3|7|7028.70|0.04|0.05|R|F|1992-09-02|1992-08-27|1992-09-25|COLLECT COD|FOB| regular excuses sleep. asym +8295|1523|64|1|22|31339.44|0.05|0.04|R|F|1994-07-02|1994-05-02|1994-08-01|DELIVER IN PERSON|FOB| requests. slyly silent accounts w +8295|1301|40|2|48|57710.40|0.08|0.02|A|F|1994-04-25|1994-06-27|1994-05-17|DELIVER IN PERSON|FOB|he requests. car +8295|220|21|3|42|47049.24|0.05|0.08|R|F|1994-07-15|1994-06-15|1994-08-05|DELIVER IN PERSON|FOB|nic deposits. regular accounts boost. slyl +8295|185|12|4|34|36896.12|0.02|0.07|A|F|1994-07-09|1994-05-29|1994-07-31|NONE|AIR| the unusual, +8295|1174|83|5|44|47307.48|0.03|0.02|R|F|1994-06-06|1994-05-19|1994-07-06|NONE|RAIL|lets cajole instead of the carefully regula +8295|1229|67|6|44|49729.68|0.03|0.03|R|F|1994-04-09|1994-05-09|1994-04-11|TAKE BACK RETURN|TRUCK|p furiously express instructi +8320|1493|33|1|14|19522.86|0.03|0.07|R|F|1994-10-20|1994-11-04|1994-10-24|COLLECT COD|SHIP|cial asymptotes +8320|470|29|2|31|42484.57|0.01|0.00|A|F|1994-10-18|1994-12-06|1994-10-21|DELIVER IN PERSON|REG AIR|old epitaphs use blithely. +8320|692|86|3|30|47780.70|0.02|0.00|R|F|1994-11-27|1994-12-14|1994-12-23|COLLECT COD|MAIL|e furiously acros +8320|502|3|4|26|36465.00|0.06|0.03|A|F|1994-12-17|1994-12-12|1994-12-29|DELIVER IN PERSON|RAIL| accounts. bravely spec +8320|1433|73|5|25|33360.75|0.01|0.08|R|F|1994-12-27|1994-12-14|1995-01-12|DELIVER IN PERSON|RAIL|nts; ideas sleep across the slyly unu +8321|1435|36|1|32|42765.76|0.03|0.08|A|F|1994-01-10|1994-01-27|1994-01-30|DELIVER IN PERSON|RAIL|above the final requests. sile +8321|1920|65|2|10|18219.20|0.04|0.04|A|F|1993-11-25|1994-01-06|1993-12-20|TAKE BACK RETURN|RAIL|o the slyly caref +8321|1163|64|3|49|52143.84|0.09|0.02|A|F|1994-03-10|1994-01-12|1994-04-08|DELIVER IN PERSON|MAIL|the ironic multipli +8321|36|37|4|1|936.03|0.10|0.04|A|F|1994-03-03|1994-02-08|1994-03-31|DELIVER IN PERSON|FOB|quickly bold theodolites detect fluffi +8321|1057|28|5|31|29699.55|0.07|0.04|A|F|1993-11-18|1994-01-25|1993-11-22|NONE|FOB|y pending foxes. de +8321|675|38|6|15|23635.05|0.04|0.05|A|F|1994-02-23|1993-12-18|1994-03-07|COLLECT COD|TRUCK| accounts. bold, final asymptot +8321|629|92|7|35|53536.70|0.03|0.04|R|F|1993-11-22|1994-01-04|1993-12-03|DELIVER IN PERSON|RAIL|ent, ruthless r +8322|1764|49|1|30|49972.80|0.05|0.04|N|O|1996-06-15|1996-05-03|1996-07-08|NONE|AIR|y special foxes. regular, regular ide +8322|950|53|2|42|77739.90|0.06|0.01|N|O|1996-04-30|1996-04-30|1996-05-15|NONE|RAIL|ly pending ins +8322|47|98|3|18|17046.72|0.10|0.03|N|O|1996-07-12|1996-06-12|1996-07-19|DELIVER IN PERSON|AIR|counts-- ironic instructions wak +8322|1127|64|4|3|3084.36|0.03|0.08|N|O|1996-04-08|1996-06-19|1996-04-16|TAKE BACK RETURN|TRUCK|ckey players nag furiously depo +8323|1143|80|1|37|38633.18|0.04|0.03|N|O|1995-12-09|1995-11-21|1996-01-03|COLLECT COD|AIR|sts along t +8323|1737|38|2|46|75381.58|0.01|0.05|N|O|1995-10-22|1995-10-25|1995-10-29|NONE|REG AIR|cajole carefully according to the q +8323|1781|24|3|44|74042.32|0.07|0.02|N|O|1995-12-12|1995-10-24|1995-12-29|COLLECT COD|SHIP|ct slyly blithely final theodolites. care +8324|927|30|1|31|56665.52|0.03|0.03|A|F|1994-11-04|1994-10-25|1994-11-06|NONE|REG AIR|kly pending dolph +8324|1918|7|2|1|1819.91|0.02|0.01|R|F|1994-12-18|1994-11-17|1994-12-25|NONE|FOB| ideas. furiously bold accounts cajole +8324|126|79|3|47|48227.64|0.09|0.08|A|F|1994-12-17|1994-10-30|1994-12-25|COLLECT COD|SHIP|carefully ironic idea +8324|1536|37|4|14|20125.42|0.02|0.01|R|F|1994-10-26|1994-10-04|1994-10-30|NONE|RAIL|es; carefully even pinto beans cajole. +8325|408|96|1|30|39252.00|0.00|0.02|A|F|1994-04-08|1994-03-04|1994-04-15|TAKE BACK RETURN|TRUCK|ss packages haggle. request +8325|1327|42|2|5|6141.60|0.10|0.05|R|F|1994-01-17|1994-04-05|1994-01-25|COLLECT COD|REG AIR|ely express requests hi +8326|208|9|1|43|47652.60|0.02|0.00|N|O|1996-04-07|1996-04-21|1996-04-10|NONE|TRUCK|t the carefully daring platel +8326|950|19|2|16|29615.20|0.04|0.05|N|O|1996-06-22|1996-04-22|1996-06-27|COLLECT COD|MAIL|sts after the slyly special request +8327|1665|48|1|47|73633.02|0.04|0.03|N|O|1997-11-14|1998-01-08|1997-11-19|TAKE BACK RETURN|REG AIR|e. fluffily bold foxes cajole +8327|1260|98|2|8|9290.08|0.07|0.03|N|O|1998-01-14|1998-01-13|1998-02-03|DELIVER IN PERSON|REG AIR|ously final courts +8352|22|23|1|2|1844.04|0.05|0.05|R|F|1993-09-01|1993-09-27|1993-09-20|COLLECT COD|TRUCK|use fluffily after the ac +8352|484|43|2|40|55379.20|0.09|0.03|R|F|1993-08-15|1993-08-30|1993-09-08|TAKE BACK RETURN|MAIL|structions eat blithely- +8352|1968|57|3|4|7479.84|0.09|0.00|R|F|1993-08-08|1993-09-09|1993-08-26|DELIVER IN PERSON|MAIL|eep. final requests sl +8352|370|27|4|2|2540.74|0.08|0.08|R|F|1993-08-04|1993-08-27|1993-08-21|COLLECT COD|SHIP|ular requests integrate. furiou +8353|879|80|1|21|37377.27|0.00|0.03|R|F|1994-09-03|1994-07-13|1994-10-01|COLLECT COD|FOB|alms sleep furio +8353|1753|96|2|25|41368.75|0.00|0.00|A|F|1994-08-16|1994-08-13|1994-09-03|COLLECT COD|REG AIR|ingly across the +8353|435|65|3|41|54752.63|0.09|0.04|A|F|1994-07-16|1994-06-22|1994-07-23|TAKE BACK RETURN|MAIL|posits affix along the quic +8353|79|55|4|41|40141.87|0.08|0.03|R|F|1994-08-23|1994-08-07|1994-08-27|DELIVER IN PERSON|AIR|xes shall have to detect instructions. +8354|91|17|1|1|991.09|0.09|0.08|N|O|1996-10-13|1996-12-08|1996-11-02|NONE|RAIL|xpress ideas w +8355|1275|76|1|21|24701.67|0.02|0.03|N|O|1998-01-26|1998-01-12|1998-02-14|COLLECT COD|FOB| packages. rut +8355|136|15|2|14|14505.82|0.02|0.07|N|O|1998-01-17|1998-01-19|1998-02-02|NONE|REG AIR|pending, ironic deposits. slyly unusu +8355|947|50|3|13|24023.22|0.09|0.07|N|O|1997-12-13|1998-02-13|1998-01-10|NONE|AIR|gular foxes maintain requests. fluffily p +8355|992|61|4|11|20822.89|0.04|0.06|N|O|1998-01-18|1997-12-21|1998-02-10|NONE|TRUCK|ole along the q +8355|55|6|5|42|40112.10|0.09|0.06|N|O|1997-12-28|1998-01-25|1998-01-27|NONE|TRUCK|quests integrate rut +8355|1188|61|6|47|51191.46|0.07|0.00|N|O|1998-02-26|1998-01-25|1998-02-28|DELIVER IN PERSON|FOB| ironic accounts. evenly un +8355|998|67|7|31|58868.69|0.02|0.02|N|O|1997-12-29|1998-02-16|1998-01-18|TAKE BACK RETURN|SHIP| the deposits affix blithely re +8356|516|77|1|31|43911.81|0.07|0.05|N|O|1995-07-05|1995-06-19|1995-08-02|COLLECT COD|RAIL|s. final, final excuses nod. express +8357|564|55|1|42|61511.52|0.07|0.01|N|O|1997-12-03|1997-11-09|1997-12-11|COLLECT COD|AIR|kages. even deposits are. +8357|1854|41|2|38|66722.30|0.04|0.05|N|O|1997-11-02|1997-10-14|1997-11-22|DELIVER IN PERSON|FOB|about the ironic ideas. +8358|297|79|1|24|28734.96|0.07|0.04|N|O|1997-02-09|1997-02-11|1997-03-06|TAKE BACK RETURN|TRUCK| furiously pending s +8358|1285|23|2|44|52196.32|0.01|0.05|N|O|1997-04-01|1997-03-19|1997-04-04|TAKE BACK RETURN|TRUCK|ake slyly +8358|1338|77|3|6|7435.98|0.06|0.07|N|O|1997-03-03|1997-03-26|1997-03-26|TAKE BACK RETURN|SHIP|lithely pending ideas sleep. r +8358|687|50|4|39|61919.52|0.04|0.06|N|O|1997-04-01|1997-03-08|1997-04-09|NONE|AIR|en decoys. express packages detect a +8358|260|42|5|9|10442.34|0.06|0.03|N|O|1997-02-04|1997-03-10|1997-02-05|NONE|SHIP|s. fluffy, even foxes nag darin +8359|699|100|1|31|49590.39|0.03|0.03|A|F|1992-08-15|1992-08-04|1992-09-09|DELIVER IN PERSON|MAIL|al instructions poach slyl +8359|1309|10|2|26|31467.80|0.08|0.00|R|F|1992-06-27|1992-07-30|1992-07-10|TAKE BACK RETURN|TRUCK|y ironic court +8359|1365|66|3|21|26593.56|0.02|0.06|R|F|1992-05-21|1992-07-25|1992-06-19|NONE|REG AIR|e. slyly unusual theodolites haggle. +8359|857|91|4|19|33399.15|0.02|0.06|R|F|1992-08-13|1992-07-06|1992-08-25|DELIVER IN PERSON|REG AIR|ironic requests sleep according t +8384|1224|25|1|19|21379.18|0.07|0.02|R|F|1993-06-11|1993-06-06|1993-07-05|TAKE BACK RETURN|AIR|tes. slyly final +8384|1789|16|2|29|49032.62|0.02|0.03|A|F|1993-06-22|1993-07-20|1993-07-02|NONE|SHIP| deposits. slyly +8384|337|38|3|19|23509.27|0.06|0.01|R|F|1993-05-25|1993-06-23|1993-06-13|DELIVER IN PERSON|SHIP|uriously regular packages are furiously. st +8384|1873|60|4|34|60345.58|0.10|0.02|A|F|1993-07-17|1993-08-04|1993-07-27|NONE|SHIP|rnes. careful +8384|1221|22|5|24|26933.28|0.01|0.00|A|F|1993-07-19|1993-07-22|1993-08-06|DELIVER IN PERSON|TRUCK|efully final packages. b +8385|1209|84|1|37|41077.40|0.01|0.08|N|O|1997-09-29|1997-07-28|1997-10-24|TAKE BACK RETURN|TRUCK|lithely regular instructi +8385|1931|76|2|9|16496.37|0.00|0.06|N|O|1997-10-09|1997-09-21|1997-10-28|TAKE BACK RETURN|SHIP|s integrate carefully among the +8385|1196|97|3|35|38401.65|0.07|0.01|N|O|1997-08-19|1997-08-19|1997-09-14|TAKE BACK RETURN|SHIP|ironically regular packages. slyly unusual +8385|1295|33|4|2|2392.58|0.07|0.03|N|O|1997-09-04|1997-08-05|1997-09-18|DELIVER IN PERSON|RAIL|y ironic foxes. +8385|399|28|5|10|12993.90|0.03|0.04|N|O|1997-09-01|1997-09-17|1997-09-14|COLLECT COD|MAIL|osits. packages alongsi +8385|1657|58|6|28|43642.20|0.01|0.05|N|O|1997-07-18|1997-07-28|1997-07-25|COLLECT COD|RAIL| regular deposits. ca +8385|772|69|7|12|20073.24|0.03|0.07|N|O|1997-09-16|1997-08-24|1997-10-10|NONE|SHIP|. slyly unusual requests wake +8386|1904|49|1|47|84877.30|0.07|0.08|N|O|1998-04-05|1998-04-11|1998-04-26|DELIVER IN PERSON|FOB|usual packages. carefully re +8386|762|59|2|31|51545.56|0.03|0.06|N|O|1998-03-20|1998-05-04|1998-04-08|DELIVER IN PERSON|MAIL|tes haggle slyly accounts. carefully bold +8386|407|8|3|30|39222.00|0.09|0.01|N|O|1998-04-02|1998-04-20|1998-04-14|DELIVER IN PERSON|TRUCK|gular packages? express, pending packag +8387|608|71|1|22|33189.20|0.09|0.08|A|F|1993-05-08|1993-04-22|1993-05-16|NONE|AIR|ng to the bold dependencies. slyly qui +8387|312|13|2|35|42430.85|0.05|0.06|A|F|1993-05-25|1993-05-17|1993-06-11|DELIVER IN PERSON|FOB|sts hinder carefully against +8387|636|30|3|25|38415.75|0.10|0.08|R|F|1993-04-15|1993-05-10|1993-05-03|DELIVER IN PERSON|MAIL|to are about the ironic, express requ +8387|1588|89|4|27|40218.66|0.03|0.07|R|F|1993-04-08|1993-05-31|1993-04-23|COLLECT COD|FOB|ully asymptotes. carefully regular p +8387|1843|87|5|42|73283.28|0.10|0.01|R|F|1993-05-04|1993-06-13|1993-06-02|DELIVER IN PERSON|SHIP|aggle stea +8388|385|70|1|30|38561.40|0.06|0.07|R|F|1992-06-07|1992-04-24|1992-06-18|DELIVER IN PERSON|AIR|uses sleep slyly around the specia +8388|314|43|2|50|60715.50|0.03|0.04|R|F|1992-02-26|1992-05-21|1992-02-27|NONE|TRUCK|, bold frets! even, special +8388|63|89|3|24|23113.44|0.02|0.02|A|F|1992-06-05|1992-04-09|1992-06-13|TAKE BACK RETURN|AIR|requests about the quickly regular +8388|756|57|4|32|53016.00|0.10|0.04|A|F|1992-05-12|1992-04-10|1992-05-21|COLLECT COD|AIR|kages. quickly fina +8388|631|63|5|4|6126.52|0.06|0.06|R|F|1992-03-18|1992-04-17|1992-03-31|TAKE BACK RETURN|SHIP|ependencies sleep fluffily pe +8388|1471|11|6|47|64506.09|0.07|0.05|A|F|1992-04-13|1992-05-15|1992-04-29|NONE|FOB|. special requests boost along the +8389|101|2|1|2|2002.20|0.06|0.02|R|F|1994-08-03|1994-06-18|1994-08-29|NONE|TRUCK|ial requests. slyly special theodolites bo +8389|1929|18|2|42|76898.64|0.08|0.01|A|F|1994-08-15|1994-05-24|1994-08-25|DELIVER IN PERSON|REG AIR|ly regular Tiresias sleep slyly slyly +8389|885|19|3|19|33931.72|0.00|0.04|R|F|1994-07-17|1994-07-21|1994-07-26|DELIVER IN PERSON|TRUCK|y bold pinto beans will cajole furio +8389|1743|28|4|17|27960.58|0.08|0.04|A|F|1994-05-05|1994-06-07|1994-05-27|COLLECT COD|SHIP|tructions. regular notornis beneat +8389|313|42|5|19|23052.89|0.06|0.06|R|F|1994-06-08|1994-06-06|1994-07-03|COLLECT COD|SHIP|ly idle dependencies until the regular +8390|390|47|1|24|30969.36|0.01|0.05|R|F|1992-08-15|1992-07-10|1992-08-31|COLLECT COD|FOB|s warhorses? even, unusual ideas wa +8390|1866|53|2|40|70714.40|0.01|0.05|R|F|1992-07-20|1992-07-18|1992-08-07|TAKE BACK RETURN|MAIL|s use slyly accor +8391|1789|90|1|45|76085.10|0.01|0.06|N|O|1995-10-15|1995-10-17|1995-10-25|COLLECT COD|RAIL|ntegrate. instructions impress f +8391|1449|28|2|42|56718.48|0.00|0.06|N|O|1995-09-22|1995-10-31|1995-09-24|COLLECT COD|SHIP|usly dogged packages across th +8391|71|47|3|3|2913.21|0.06|0.01|N|O|1995-12-22|1995-11-10|1996-01-02|TAKE BACK RETURN|AIR|against the bold f +8391|506|37|4|43|60479.50|0.01|0.08|N|O|1995-10-09|1995-10-01|1995-10-28|COLLECT COD|AIR| cajole fluffily among the express +8391|89|65|5|16|15825.28|0.08|0.01|N|O|1995-12-13|1995-10-10|1995-12-31|DELIVER IN PERSON|TRUCK|yly ironic pinto beans cajole blithely. q +8391|1351|52|6|10|12523.50|0.08|0.00|N|O|1995-09-02|1995-11-19|1995-09-15|TAKE BACK RETURN|SHIP|ly pending pack +8416|273|1|1|13|15252.51|0.06|0.01|R|F|1993-09-22|1993-10-23|1993-10-08|NONE|REG AIR|ccording to the fluffily pe +8416|693|94|2|38|60560.22|0.06|0.03|R|F|1993-09-28|1993-09-07|1993-10-11|TAKE BACK RETURN|TRUCK|detect. iro +8416|1794|95|3|48|81397.92|0.02|0.08|R|F|1993-09-27|1993-10-24|1993-10-19|COLLECT COD|AIR|its solve fluffily t +8416|886|86|4|48|85770.24|0.01|0.01|R|F|1993-09-17|1993-10-30|1993-09-18|TAKE BACK RETURN|SHIP|kages detect closely bravely even reque +8416|1404|83|5|48|62659.20|0.07|0.04|R|F|1993-09-09|1993-09-06|1993-09-15|DELIVER IN PERSON|FOB|foxes haggle blithely ironic packag +8417|758|23|1|23|38151.25|0.05|0.03|N|O|1997-10-19|1997-11-04|1997-10-28|DELIVER IN PERSON|FOB|arefully bold re +8417|404|34|2|33|43045.20|0.01|0.01|N|O|1997-09-18|1997-09-26|1997-10-06|TAKE BACK RETURN|RAIL|stealthily pending idea +8417|82|33|3|5|4910.40|0.01|0.06|N|O|1997-10-25|1997-09-26|1997-10-31|NONE|FOB|ts. carefully regular deposits +8418|819|53|1|8|13758.48|0.10|0.05|N|O|1996-11-07|1996-11-16|1996-11-11|DELIVER IN PERSON|REG AIR| multipliers sleep furiously after the +8419|1204|42|1|48|53049.60|0.04|0.06|N|O|1995-10-25|1995-12-24|1995-11-23|NONE|REG AIR|ole. unusual, unusual requ +8419|1304|19|2|20|24106.00|0.07|0.01|N|O|1996-01-28|1995-12-02|1996-02-23|DELIVER IN PERSON|MAIL|osits are. final accounts +8419|221|22|3|39|43727.58|0.02|0.06|N|O|1995-12-22|1995-12-28|1996-01-07|NONE|REG AIR|quests-- carefully regul +8419|1396|35|4|2|2594.78|0.07|0.00|N|O|1995-10-11|1995-12-12|1995-11-01|TAKE BACK RETURN|MAIL|sts. pending ideas boost. silen +8419|469|99|5|38|52039.48|0.05|0.06|N|O|1995-12-24|1995-11-02|1996-01-01|DELIVER IN PERSON|MAIL|eep among the special +8419|414|73|6|44|57834.04|0.01|0.06|N|O|1995-12-15|1995-12-07|1995-12-19|NONE|FOB| the regular theodolites are according t +8419|783|16|7|33|55564.74|0.07|0.04|N|O|1995-12-02|1995-11-10|1995-12-22|DELIVER IN PERSON|FOB|gular deposits play. +8420|1162|99|1|1|1063.16|0.01|0.05|N|O|1997-09-29|1997-08-25|1997-10-07|TAKE BACK RETURN|REG AIR|deas above the +8421|444|74|1|13|17477.72|0.09|0.05|N|O|1997-06-30|1997-06-16|1997-07-29|DELIVER IN PERSON|MAIL|he careful +8421|1020|21|2|40|36840.80|0.05|0.05|N|O|1997-04-06|1997-04-28|1997-04-24|TAKE BACK RETURN|FOB|xcuses use carefully according to the b +8421|284|66|3|26|30791.28|0.04|0.07|N|O|1997-06-27|1997-04-22|1997-07-18|NONE|AIR|pendencies haggle acro +8421|338|23|4|41|50771.53|0.08|0.05|N|O|1997-07-06|1997-06-01|1997-07-14|TAKE BACK RETURN|MAIL|gside of the slyly even packages. fox +8421|621|53|5|16|24345.92|0.09|0.06|N|O|1997-06-09|1997-06-09|1997-06-27|DELIVER IN PERSON|TRUCK|quests boost among the blithely expres +8421|782|83|6|33|55531.74|0.09|0.02|N|O|1997-06-14|1997-05-14|1997-06-19|COLLECT COD|RAIL|ependencies +8421|1761|4|7|42|69835.92|0.01|0.01|N|O|1997-04-02|1997-06-12|1997-04-26|NONE|AIR|t the special asymptotes. furiously +8422|322|51|1|35|42781.20|0.10|0.00|A|F|1994-08-11|1994-05-18|1994-08-23|COLLECT COD|REG AIR|ic ideas sleep ironic, fina +8422|504|35|2|21|29494.50|0.02|0.04|R|F|1994-08-07|1994-05-15|1994-08-14|DELIVER IN PERSON|RAIL|bove the silent accounts haggle blith +8422|1815|2|3|32|54937.92|0.05|0.03|R|F|1994-08-11|1994-06-08|1994-09-08|NONE|FOB|pending asymptotes use deposits. caref +8422|578|69|4|38|56185.66|0.04|0.06|A|F|1994-06-18|1994-05-17|1994-06-26|NONE|TRUCK| dolphins haggle according +8422|1478|18|5|50|68973.50|0.08|0.01|R|F|1994-07-09|1994-05-31|1994-07-13|NONE|MAIL|ons believe alongside of the final, b +8422|427|86|6|37|49114.54|0.08|0.03|R|F|1994-07-11|1994-06-12|1994-07-13|COLLECT COD|REG AIR|mptotes. fluffily i +8423|1792|35|1|36|60976.44|0.07|0.07|N|O|1997-02-23|1997-02-05|1997-02-26|TAKE BACK RETURN|REG AIR|bout the bol +8423|1098|4|2|24|23978.16|0.01|0.02|N|O|1997-01-26|1997-01-15|1997-02-23|NONE|FOB|to beans. quickly special saut +8423|1102|39|3|25|25077.50|0.09|0.04|N|O|1997-02-17|1997-03-08|1997-03-19|NONE|SHIP|frets. deposits cajole slyly slyly +8423|466|54|4|23|31428.58|0.03|0.02|N|O|1997-01-22|1997-02-10|1997-02-13|DELIVER IN PERSON|MAIL|le pinto beans. requests are +8448|234|16|1|13|14744.99|0.04|0.05|N|O|1996-01-09|1995-11-30|1996-01-14|TAKE BACK RETURN|MAIL|ets. slyly +8448|1205|80|2|24|26548.80|0.09|0.01|N|O|1995-11-20|1995-11-14|1995-12-02|NONE|REG AIR|ar accounts. fluffily regular accounts +8448|140|93|3|14|14561.96|0.06|0.03|N|O|1995-12-29|1995-12-13|1996-01-24|TAKE BACK RETURN|MAIL| dependencies. +8449|1892|93|1|17|30496.13|0.02|0.00|N|O|1997-01-06|1996-12-18|1997-01-28|COLLECT COD|REG AIR|ounts. quickly ironic accounts use blit +8449|305|90|2|5|6026.50|0.00|0.06|N|O|1997-01-02|1996-11-26|1997-01-19|DELIVER IN PERSON|FOB| sleep. evenly ironic +8449|538|69|3|15|21577.95|0.07|0.05|N|O|1996-10-12|1997-01-06|1996-10-25|COLLECT COD|AIR|against the final, pe +8449|1148|49|4|10|10491.40|0.09|0.02|N|O|1996-11-22|1996-11-19|1996-12-10|COLLECT COD|MAIL|uests along the accounts a +8449|1326|41|5|50|61366.00|0.04|0.04|N|O|1997-02-07|1996-12-02|1997-02-22|NONE|FOB|lyly express accounts hagg +8450|197|50|1|42|46081.98|0.09|0.02|R|F|1992-06-16|1992-06-06|1992-07-11|TAKE BACK RETURN|RAIL|kages wake up the qui +8450|1589|90|2|8|11924.64|0.06|0.03|A|F|1992-08-04|1992-07-02|1992-08-30|TAKE BACK RETURN|AIR| asymptotes. carefully regular +8451|590|51|1|30|44717.70|0.07|0.02|N|O|1996-03-04|1996-02-28|1996-03-16|DELIVER IN PERSON|AIR|edly final deposits after the spec +8451|214|42|2|19|21169.99|0.04|0.06|N|O|1996-02-18|1996-02-17|1996-02-25|TAKE BACK RETURN|AIR|inal asymptotes. bl +8452|935|38|1|44|80780.92|0.10|0.04|R|F|1992-11-11|1992-09-04|1992-12-11|NONE|RAIL|row slyly regular, re +8452|144|71|2|29|30280.06|0.01|0.07|A|F|1992-11-15|1992-09-20|1992-11-20|TAKE BACK RETURN|FOB|the regular, ruthless requests sleep slyly +8452|1405|45|3|2|2612.80|0.00|0.08|R|F|1992-10-23|1992-09-23|1992-11-07|NONE|SHIP|ronic packages cajole furio +8452|1029|35|4|46|42780.92|0.04|0.01|R|F|1992-10-15|1992-09-29|1992-10-24|COLLECT COD|MAIL|the fluffily special excuses +8452|208|63|5|13|14406.60|0.09|0.01|A|F|1992-10-12|1992-09-08|1992-11-08|COLLECT COD|AIR|sts dazzle carefully. fluffily ironi +8452|1161|62|6|2|2124.32|0.06|0.00|A|F|1992-08-05|1992-10-10|1992-08-08|DELIVER IN PERSON|MAIL|, final instructions wake quickly s +8452|331|60|7|48|59103.84|0.06|0.08|R|F|1992-08-04|1992-09-15|1992-09-02|DELIVER IN PERSON|SHIP|he pending requests. pend +8453|1363|2|1|22|27815.92|0.05|0.04|N|O|1997-12-07|1997-10-20|1997-12-23|COLLECT COD|TRUCK|nder carefully blithely regular requests. +8453|1766|51|2|9|15009.84|0.02|0.08|N|O|1997-12-18|1997-11-27|1998-01-04|TAKE BACK RETURN|REG AIR|bold deposits. +8453|459|47|3|19|25829.55|0.09|0.03|N|O|1997-10-16|1997-10-23|1997-11-09|TAKE BACK RETURN|TRUCK|e express, even requests run +8453|402|90|4|28|36467.20|0.00|0.00|N|O|1997-10-18|1997-11-21|1997-11-13|TAKE BACK RETURN|REG AIR|l asymptotes can haggle carefully. sl +8454|1573|94|1|28|41287.96|0.03|0.02|A|F|1992-11-20|1992-09-30|1992-11-26|DELIVER IN PERSON|TRUCK|boost blithely slyly pendi +8454|1138|47|2|1|1039.13|0.00|0.06|A|F|1992-08-23|1992-10-30|1992-09-02|DELIVER IN PERSON|MAIL|nic ideas. even, unusual +8454|1811|12|3|49|83927.69|0.06|0.02|R|F|1992-11-07|1992-10-09|1992-12-03|DELIVER IN PERSON|MAIL|ly across +8454|136|37|4|43|44553.59|0.04|0.07|A|F|1992-09-23|1992-10-09|1992-10-11|NONE|TRUCK|ins. even accounts run across the quickly +8454|614|77|5|23|34836.03|0.03|0.03|A|F|1992-09-10|1992-11-06|1992-09-19|NONE|AIR|eposits sle +8455|493|52|1|20|27869.80|0.08|0.05|A|F|1994-08-24|1994-10-06|1994-09-14|NONE|SHIP|ld packages. quickly expres +8455|1764|49|2|31|51638.56|0.02|0.00|R|F|1994-09-22|1994-11-09|1994-10-19|NONE|MAIL|ggedly alongside of the blithely e +8480|1294|32|1|4|4781.16|0.03|0.06|R|F|1995-05-25|1995-03-17|1995-06-07|TAKE BACK RETURN|REG AIR|refully regular ideas? slyly +8480|783|16|2|47|79137.66|0.08|0.00|R|F|1995-02-04|1995-04-14|1995-02-20|DELIVER IN PERSON|AIR| dependencies wake slyly slyly bo +8480|1563|84|3|27|39543.12|0.05|0.02|A|F|1995-03-24|1995-03-24|1995-04-13|NONE|SHIP| accounts +8480|1022|28|4|29|26767.58|0.07|0.01|A|F|1995-01-31|1995-04-12|1995-02-14|DELIVER IN PERSON|AIR|, regular ideas. pending ideas x-ray f +8480|337|94|5|35|43306.55|0.02|0.01|A|F|1995-02-19|1995-04-10|1995-03-09|NONE|MAIL|final, ironic packages! final, regul +8480|560|91|6|1|1460.56|0.06|0.02|A|F|1995-03-15|1995-03-31|1995-03-28|TAKE BACK RETURN|FOB|r excuses haggle. blithely even +8480|1684|26|7|48|76112.64|0.07|0.08|A|F|1995-04-25|1995-04-28|1995-05-25|COLLECT COD|REG AIR|hely carefully express pack +8481|1645|69|1|19|29386.16|0.03|0.08|N|O|1998-05-05|1998-05-21|1998-05-08|COLLECT COD|TRUCK|onic requests along the spec +8482|884|84|1|38|67825.44|0.01|0.01|N|O|1997-07-08|1997-05-07|1997-07-11|TAKE BACK RETURN|AIR| doze about th +8482|1615|39|2|44|66730.84|0.04|0.06|N|O|1997-07-01|1997-05-03|1997-07-03|NONE|FOB|t fluffily across the +8483|1615|16|1|15|22749.15|0.02|0.08|N|O|1996-02-17|1996-01-14|1996-02-24|TAKE BACK RETURN|TRUCK| ideas wake furiously slyly +8483|898|98|2|39|70156.71|0.09|0.02|N|O|1995-11-06|1995-12-03|1995-11-25|TAKE BACK RETURN|FOB|ironic, final +8484|939|74|1|42|77277.06|0.07|0.01|N|O|1995-12-07|1995-11-18|1995-12-31|COLLECT COD|REG AIR|gage blithely: bold accounts cajo +8484|1328|67|2|20|24586.40|0.05|0.08|N|O|1995-09-26|1995-11-18|1995-10-05|DELIVER IN PERSON|REG AIR|egular excuses despit +8484|1550|51|3|10|14515.50|0.09|0.00|N|O|1995-10-21|1995-11-30|1995-10-24|COLLECT COD|AIR|s sleep qui +8484|1491|31|4|13|18102.37|0.10|0.05|N|O|1995-12-23|1995-11-12|1996-01-10|TAKE BACK RETURN|RAIL| slyly close accounts; ruthless packages +8485|296|51|1|5|5981.45|0.05|0.08|N|O|1997-10-04|1997-11-20|1997-10-06|DELIVER IN PERSON|REG AIR| deposits at the express +8485|335|64|2|39|48177.87|0.03|0.04|N|O|1997-11-10|1997-10-14|1997-11-23|NONE|REG AIR| express, f +8486|1229|4|1|15|16953.30|0.09|0.05|N|O|1997-03-26|1997-03-02|1997-04-03|COLLECT COD|RAIL|ts. ironic theodolites sleep blithely. +8486|481|40|2|11|15196.28|0.05|0.01|N|O|1997-04-04|1997-03-09|1997-04-14|COLLECT COD|MAIL| slyly around +8486|864|98|3|10|17648.60|0.02|0.03|N|O|1997-04-21|1997-03-16|1997-04-28|TAKE BACK RETURN|FOB|blithely above th +8486|1016|52|4|15|13755.15|0.04|0.07|N|O|1997-01-23|1997-02-26|1997-02-17|DELIVER IN PERSON|AIR|ven ideas are. carefu +8486|1108|81|5|19|19172.90|0.06|0.02|N|O|1997-02-04|1997-02-24|1997-02-15|NONE|FOB| pearls. care +8487|1112|21|1|33|33432.63|0.02|0.02|N|O|1997-02-27|1997-02-12|1997-03-11|DELIVER IN PERSON|SHIP|eas was. slyly bold f +8487|1919|20|2|43|78299.13|0.04|0.03|N|O|1997-03-27|1997-03-05|1997-04-03|COLLECT COD|RAIL| quickly special packa +8487|1671|95|3|15|23590.05|0.10|0.05|N|O|1997-05-02|1997-04-05|1997-05-17|DELIVER IN PERSON|FOB|leep close pack +8487|176|29|4|10|10761.70|0.10|0.02|N|O|1997-02-14|1997-03-03|1997-02-21|COLLECT COD|TRUCK| carefully pending asymptotes. bold i +8487|1698|22|5|20|31993.80|0.08|0.00|N|O|1997-01-08|1997-03-22|1997-01-18|NONE|MAIL|ily unusual reques +8487|1793|20|6|25|42369.75|0.05|0.03|N|O|1997-02-15|1997-03-15|1997-03-01|NONE|MAIL|. accounts could have t +8512|928|31|1|8|14631.36|0.03|0.02|R|F|1994-09-09|1994-09-20|1994-10-04|COLLECT COD|REG AIR|. express, final req +8512|1646|70|2|32|49524.48|0.06|0.00|A|F|1994-10-08|1994-08-18|1994-11-06|TAKE BACK RETURN|MAIL|accounts-- regular courts sleep +8513|641|73|1|31|47790.84|0.07|0.06|N|O|1995-09-08|1995-09-07|1995-09-09|COLLECT COD|REG AIR|usly special requests promise. slyly r +8513|553|44|2|38|55234.90|0.06|0.04|N|O|1995-10-04|1995-09-01|1995-10-07|DELIVER IN PERSON|FOB|hely ironic theodolites acc +8513|62|63|3|12|11544.72|0.06|0.03|N|O|1995-11-06|1995-09-08|1995-11-14|NONE|AIR|es should have to haggle blithe +8513|1777|20|4|7|11751.39|0.04|0.02|N|O|1995-08-02|1995-09-03|1995-08-03|NONE|AIR| furiously silent packages. pending dugou +8514|1142|15|1|6|6258.84|0.08|0.05|N|O|1996-05-19|1996-03-18|1996-05-25|NONE|RAIL|s sleep slyly +8514|903|38|2|26|46901.40|0.08|0.07|N|O|1996-04-27|1996-05-09|1996-05-03|NONE|AIR|uriously final de +8514|1292|4|3|43|51311.47|0.07|0.06|N|O|1996-04-14|1996-03-29|1996-04-24|NONE|SHIP|fully ironic packages must have +8514|659|53|4|48|74863.20|0.04|0.07|N|O|1996-02-26|1996-03-31|1996-03-26|NONE|MAIL|uts cajole carefully final deposits. blit +8514|1346|61|5|15|18710.10|0.07|0.08|N|O|1996-04-01|1996-04-19|1996-04-25|TAKE BACK RETURN|REG AIR| across the courts. fluffily express acc +8514|663|95|6|6|9381.96|0.08|0.02|N|O|1996-03-27|1996-03-27|1996-03-29|TAKE BACK RETURN|MAIL|ng foxes. regular idea +8514|1186|23|7|45|48923.10|0.09|0.04|N|O|1996-05-18|1996-05-10|1996-05-27|TAKE BACK RETURN|SHIP|y express acco +8515|1599|80|1|49|73528.91|0.06|0.00|R|F|1994-03-12|1994-02-02|1994-03-31|DELIVER IN PERSON|FOB|es doubt quickly! carefu +8515|1442|82|2|9|12090.96|0.03|0.03|A|F|1993-12-31|1994-01-29|1994-01-19|TAKE BACK RETURN|RAIL|leep. blithely express depo +8515|383|40|3|18|23100.84|0.00|0.01|A|F|1994-03-12|1994-03-12|1994-04-02|DELIVER IN PERSON|MAIL|es affix. fluffily express de +8515|538|39|4|42|60418.26|0.07|0.06|R|F|1993-12-28|1994-02-20|1994-01-07|COLLECT COD|RAIL|y regular req +8515|218|100|5|33|36900.93|0.06|0.03|A|F|1994-03-23|1994-02-09|1994-03-24|COLLECT COD|TRUCK|he quickly final instructions. si +8515|113|14|6|11|11144.21|0.10|0.01|A|F|1994-02-08|1994-02-25|1994-03-05|COLLECT COD|AIR|st the quickly special hockey players; slyl +8516|1346|85|1|40|49893.60|0.09|0.02|N|O|1996-07-01|1996-05-11|1996-07-04|TAKE BACK RETURN|SHIP|efully even packages. thinly even b +8516|828|29|2|46|79525.72|0.04|0.06|N|O|1996-04-28|1996-05-16|1996-05-22|COLLECT COD|SHIP| along the pinto beans. careful +8516|1720|47|3|40|64868.80|0.06|0.02|N|O|1996-04-11|1996-06-07|1996-04-15|NONE|SHIP|odolites haggle +8516|1340|41|4|19|23585.46|0.01|0.07|N|O|1996-06-26|1996-06-20|1996-07-17|COLLECT COD|RAIL|e carefully furious theodolit +8516|1275|87|5|28|32935.56|0.10|0.03|N|O|1996-07-31|1996-05-08|1996-08-17|DELIVER IN PERSON|TRUCK|eposits. slow instructions nag final acco +8516|738|3|6|50|81936.50|0.09|0.08|N|O|1996-06-12|1996-05-30|1996-07-04|COLLECT COD|RAIL|ckages boost across the furiously final re +8516|1271|72|7|48|56268.96|0.10|0.03|N|O|1996-07-15|1996-05-31|1996-08-14|COLLECT COD|TRUCK|ses haggle around the blithely si +8517|1420|21|1|44|58142.48|0.06|0.08|N|O|1997-05-26|1997-04-11|1997-06-09|NONE|RAIL|sly bold accounts. careful +8517|371|100|2|42|53397.54|0.03|0.02|N|O|1997-07-02|1997-05-25|1997-07-25|TAKE BACK RETURN|REG AIR|ckly final requests cajole blithe +8517|1054|25|3|17|16235.85|0.03|0.01|N|O|1997-06-29|1997-05-09|1997-07-20|NONE|AIR|e after the furiously brave ac +8517|1840|84|4|36|62706.24|0.02|0.07|N|O|1997-05-14|1997-05-07|1997-05-20|TAKE BACK RETURN|TRUCK| fluffily. pending theodolite +8517|603|97|5|33|49618.80|0.06|0.06|N|O|1997-05-09|1997-04-26|1997-05-19|DELIVER IN PERSON|AIR|ideas sleep slyly above +8518|560|51|1|5|7302.80|0.04|0.03|N|O|1998-06-05|1998-06-06|1998-07-02|NONE|RAIL|lyly ironic accounts. blithely regular p +8518|482|12|2|16|22119.68|0.06|0.08|N|O|1998-05-06|1998-06-07|1998-05-08|COLLECT COD|REG AIR|pecial frays haggle fl +8518|1938|83|3|24|44158.32|0.10|0.00|N|O|1998-06-25|1998-07-11|1998-07-21|NONE|TRUCK|es boost blithely. carefully even +8519|11|62|1|38|34618.38|0.07|0.05|N|O|1996-11-21|1996-10-03|1996-11-22|COLLECT COD|AIR|unts affix +8519|70|71|2|48|46563.36|0.07|0.02|N|O|1996-12-24|1996-10-10|1997-01-16|DELIVER IN PERSON|SHIP|nst the deposits: fluffily sl +8519|980|81|3|7|13166.86|0.02|0.00|N|O|1996-09-19|1996-11-12|1996-09-24|TAKE BACK RETURN|FOB|ccounts about the s +8519|572|33|4|44|64793.08|0.05|0.04|N|O|1996-11-23|1996-10-18|1996-11-29|TAKE BACK RETURN|FOB|y. furiously bold re +8519|398|55|5|16|20774.24|0.08|0.06|N|O|1996-10-04|1996-10-19|1996-10-29|COLLECT COD|AIR| foxes cajole; furious +8519|1332|9|6|47|57966.51|0.07|0.07|N|O|1996-09-24|1996-09-29|1996-10-11|TAKE BACK RETURN|MAIL|e slyly sp +8544|1138|39|1|13|13508.69|0.06|0.04|A|F|1993-03-19|1993-04-18|1993-04-16|NONE|MAIL|thely regular packages us +8544|1162|35|2|4|4252.64|0.08|0.07|A|F|1993-04-17|1993-03-20|1993-05-09|DELIVER IN PERSON|SHIP|usual, unusual accounts play c +8544|556|47|3|6|8739.30|0.07|0.07|A|F|1993-03-23|1993-04-03|1993-04-02|COLLECT COD|SHIP| blithely sil +8544|397|98|4|9|11676.51|0.00|0.01|A|F|1993-04-11|1993-05-03|1993-04-16|NONE|TRUCK|theodolites sleep blithely +8545|352|81|1|46|57608.10|0.01|0.03|R|F|1994-09-24|1994-08-12|1994-10-13|TAKE BACK RETURN|AIR|xpress accoun +8545|1032|33|2|34|31723.02|0.10|0.03|R|F|1994-09-20|1994-08-01|1994-10-08|COLLECT COD|TRUCK|s. furiously bold de +8545|1781|24|3|45|75725.10|0.04|0.03|R|F|1994-09-06|1994-08-05|1994-09-19|COLLECT COD|TRUCK|ideas haggle according to the unusual pack +8545|865|66|4|41|72400.26|0.06|0.06|A|F|1994-09-02|1994-08-13|1994-09-14|TAKE BACK RETURN|RAIL|uctions. quickly express ide +8545|932|1|5|3|5498.79|0.00|0.05|R|F|1994-06-20|1994-08-26|1994-06-22|DELIVER IN PERSON|TRUCK|ly pending instructions a +8545|1394|33|6|34|44043.26|0.08|0.06|R|F|1994-07-23|1994-07-30|1994-07-26|COLLECT COD|REG AIR|s integrate according to the blit +8546|1272|47|1|40|46930.80|0.05|0.01|R|F|1992-05-31|1992-05-03|1992-06-19|NONE|MAIL|usly about the brave accounts. slyly ironic +8546|559|50|2|2|2919.10|0.07|0.04|R|F|1992-07-06|1992-06-05|1992-07-31|TAKE BACK RETURN|RAIL|tructions. final, final plate +8546|799|96|3|11|18697.69|0.06|0.08|R|F|1992-06-06|1992-05-28|1992-06-23|DELIVER IN PERSON|AIR|, ironic requests sleep fluffily +8546|1802|32|4|42|71559.60|0.08|0.03|R|F|1992-04-17|1992-06-22|1992-05-09|COLLECT COD|RAIL|. slyly special deposits +8547|1059|65|1|40|38402.00|0.02|0.02|N|O|1997-04-09|1997-02-08|1997-04-20|COLLECT COD|MAIL|uctions along the carefully pending depos +8547|720|53|2|42|68070.24|0.04|0.05|N|O|1997-04-18|1997-03-13|1997-04-21|DELIVER IN PERSON|RAIL|nic instructions nag quickly final asymp +8547|1364|3|3|22|27837.92|0.04|0.00|N|O|1997-01-19|1997-03-05|1997-02-11|COLLECT COD|FOB|pearls. regular, final deposits +8547|1980|81|4|37|69633.26|0.07|0.04|N|O|1997-03-07|1997-03-16|1997-03-17|NONE|FOB|en depths; furiously f +8547|261|16|5|23|26708.98|0.07|0.05|N|O|1997-01-03|1997-03-03|1997-01-31|TAKE BACK RETURN|REG AIR|al, special foxes cajole carefully after +8548|738|35|1|24|39329.52|0.08|0.07|N|O|1997-10-15|1997-10-03|1997-11-05|COLLECT COD|SHIP|around the +8548|1725|68|2|42|68322.24|0.08|0.01|N|O|1997-11-15|1997-10-29|1997-12-12|TAKE BACK RETURN|MAIL|kages wake across the +8548|1933|22|3|12|22019.16|0.08|0.01|N|O|1997-09-06|1997-09-16|1997-09-13|COLLECT COD|MAIL|hlessly regular +8549|820|54|1|32|55066.24|0.07|0.08|N|O|1997-12-26|1997-11-09|1998-01-12|COLLECT COD|FOB|gular requests sleep blith +8549|1289|90|2|50|59514.00|0.00|0.02|N|O|1997-11-18|1997-11-01|1997-12-07|TAKE BACK RETURN|RAIL|ans. carefully even warhorses around +8549|683|77|3|44|69681.92|0.10|0.07|N|O|1998-01-14|1997-11-06|1998-02-05|TAKE BACK RETURN|SHIP| boost finally regu +8549|926|29|4|50|91346.00|0.07|0.05|N|O|1998-01-17|1997-11-30|1998-02-02|TAKE BACK RETURN|AIR| wake carefully. regular accounts was. regu +8550|909|12|1|48|86875.20|0.04|0.07|A|F|1993-04-13|1993-04-25|1993-05-08|COLLECT COD|MAIL|counts cajole +8550|568|59|2|3|4405.68|0.10|0.08|A|F|1993-03-07|1993-03-15|1993-03-13|COLLECT COD|AIR| are quickly. fi +8550|9|85|3|13|11817.00|0.06|0.00|R|F|1993-04-28|1993-03-23|1993-05-12|TAKE BACK RETURN|TRUCK|ly regular ideas above the blit +8550|1854|41|4|18|31605.30|0.03|0.06|R|F|1993-03-29|1993-04-06|1993-04-16|DELIVER IN PERSON|FOB|its are regular dependencies. even, bo +8550|1507|88|5|34|47889.00|0.08|0.07|A|F|1993-04-20|1993-04-14|1993-04-25|DELIVER IN PERSON|AIR|e slyly bold platelets. slyly i +8550|592|23|6|9|13433.31|0.10|0.06|R|F|1993-05-07|1993-03-15|1993-05-14|NONE|SHIP|sual request +8551|1904|37|1|19|34312.10|0.09|0.08|R|F|1994-10-01|1994-09-05|1994-10-15|NONE|RAIL|ions. even pinto beans impress quickly a +8551|860|60|2|38|66912.68|0.10|0.01|R|F|1994-11-18|1994-08-31|1994-12-08|COLLECT COD|TRUCK|nstructions haggle slyly fluffily bli +8551|1982|27|3|1|1883.98|0.08|0.08|A|F|1994-10-31|1994-10-19|1994-11-22|NONE|MAIL|xpress accounts. blithely ironic deposi +8551|1262|100|4|18|20938.68|0.03|0.03|R|F|1994-11-16|1994-10-16|1994-12-05|TAKE BACK RETURN|SHIP|ans against th +8551|1311|88|5|48|58190.88|0.10|0.05|R|F|1994-09-20|1994-10-19|1994-09-25|DELIVER IN PERSON|SHIP|y ruthless re +8576|1123|60|1|35|35844.20|0.05|0.00|A|F|1994-05-02|1994-03-20|1994-05-17|DELIVER IN PERSON|AIR|regular requests haggle slowly alongside +8576|1676|59|2|15|23665.05|0.01|0.04|R|F|1994-04-17|1994-03-20|1994-05-17|NONE|SHIP|yly express accou +8576|1016|52|3|6|5502.06|0.00|0.01|R|F|1994-02-18|1994-03-23|1994-03-01|DELIVER IN PERSON|MAIL|quests. final packages sleep +8576|656|88|4|24|37359.60|0.03|0.00|R|F|1994-02-05|1994-03-16|1994-02-06|TAKE BACK RETURN|TRUCK|r packages. unusual packages a +8577|1402|42|1|49|63866.60|0.04|0.02|N|O|1997-02-23|1997-01-08|1997-03-20|COLLECT COD|SHIP|accounts. special foxes kind +8577|824|58|2|12|20697.84|0.03|0.05|N|O|1997-01-14|1997-02-03|1997-02-01|COLLECT COD|MAIL| sleep furiously. +8577|1757|84|3|3|4976.25|0.08|0.04|N|O|1997-01-04|1997-01-31|1997-01-23|DELIVER IN PERSON|TRUCK| final packages. furiously final p +8577|887|87|4|50|89394.00|0.03|0.00|N|O|1997-02-15|1996-12-10|1997-03-10|DELIVER IN PERSON|TRUCK|le. fluffily regu +8577|1739|82|5|48|78755.04|0.03|0.07|N|O|1996-11-16|1997-01-02|1996-12-07|TAKE BACK RETURN|TRUCK|s by the quickly silent requests use care +8577|1586|7|6|36|53552.88|0.09|0.05|N|O|1996-12-04|1997-01-10|1996-12-23|DELIVER IN PERSON|TRUCK|er the even, regular deposits. furiously e +8577|1096|2|7|22|21935.98|0.04|0.02|N|O|1997-01-12|1997-01-18|1997-01-13|COLLECT COD|REG AIR|kly ironic asymptotes; pending +8578|1768|95|1|26|43413.76|0.08|0.01|N|O|1995-09-06|1995-10-04|1995-09-14|DELIVER IN PERSON|SHIP|es wake quickly final pack +8578|1121|30|2|30|30663.60|0.06|0.08|N|O|1995-11-17|1995-11-18|1995-12-09|NONE|FOB|l ideas. unusual +8578|48|49|3|25|23701.00|0.03|0.04|N|O|1995-09-28|1995-10-12|1995-10-06|TAKE BACK RETURN|RAIL|to beans cajole. f +8578|700|94|4|34|54423.80|0.02|0.03|N|O|1995-11-30|1995-11-08|1995-12-12|TAKE BACK RETURN|MAIL|y silent asymptotes are +8578|683|15|5|19|30089.92|0.04|0.05|N|O|1995-12-09|1995-10-30|1995-12-17|NONE|REG AIR|slyly special +8579|1798|41|1|46|78190.34|0.03|0.02|N|O|1997-12-14|1997-10-31|1997-12-21|DELIVER IN PERSON|AIR|bold pinto beans. hockey players sle +8579|1325|2|2|39|47826.48|0.06|0.08|N|O|1997-12-23|1997-10-16|1997-12-25|DELIVER IN PERSON|RAIL|carefully. slyly expr +8579|1266|4|3|7|8170.82|0.01|0.07|N|O|1997-10-10|1997-11-28|1997-10-19|NONE|AIR|accounts sleep abou +8579|1031|67|4|44|41009.32|0.07|0.05|N|O|1997-11-07|1997-11-24|1997-11-16|NONE|AIR|ges cajole carefully careful foxes. slyly +8580|1494|12|1|29|40469.21|0.01|0.00|A|F|1995-05-20|1995-06-10|1995-05-30|NONE|FOB|ct blithely blith +8580|1979|80|2|45|84643.65|0.09|0.05|A|F|1995-05-26|1995-05-27|1995-05-27|TAKE BACK RETURN|AIR|tions. carefully regular requests sleep f +8580|1003|39|3|31|28024.00|0.05|0.03|N|F|1995-06-01|1995-05-31|1995-06-28|TAKE BACK RETURN|FOB|nt packages. s +8581|593|94|1|27|40326.93|0.03|0.08|R|F|1993-08-22|1993-09-19|1993-09-21|TAKE BACK RETURN|MAIL|accounts cajole furiously be +8581|416|17|2|8|10531.28|0.07|0.05|R|F|1993-08-19|1993-09-23|1993-09-01|DELIVER IN PERSON|AIR|sly according to the furiously special +8581|389|74|3|23|29655.74|0.05|0.06|A|F|1993-07-16|1993-08-20|1993-08-06|DELIVER IN PERSON|RAIL|oost according to the pending grouche +8581|1030|66|4|50|46551.50|0.10|0.00|A|F|1993-09-09|1993-08-27|1993-10-09|DELIVER IN PERSON|FOB|refully along +8581|1307|84|5|33|39873.90|0.07|0.00|A|F|1993-07-24|1993-08-22|1993-08-22|NONE|SHIP|ose furiously regula +8582|1337|52|1|8|9906.64|0.03|0.07|A|F|1994-03-12|1994-01-20|1994-03-26|NONE|AIR|egular deposits. packa +8582|1896|40|2|33|59330.37|0.07|0.04|R|F|1994-02-28|1994-01-30|1994-03-24|TAKE BACK RETURN|FOB|cajole quickly blithely even acc +8582|91|67|3|18|17839.62|0.08|0.04|A|F|1994-01-14|1994-02-11|1994-02-03|COLLECT COD|REG AIR|s sleep fluffily special, regular foxe +8582|1889|33|4|42|75216.96|0.08|0.06|A|F|1994-01-05|1994-02-15|1994-01-21|COLLECT COD|RAIL|eas. pending frets n +8582|902|37|5|48|86539.20|0.05|0.06|R|F|1993-12-29|1994-02-11|1994-01-13|NONE|RAIL| furiously even foxes haggle furiou +8583|57|8|1|10|9570.50|0.00|0.04|A|F|1993-08-29|1993-08-13|1993-09-13|DELIVER IN PERSON|SHIP|have to sleep quickly finally +8583|696|28|2|33|52690.77|0.02|0.02|R|F|1993-07-19|1993-07-25|1993-07-26|NONE|TRUCK|y ironic ideas. regular packages after +8583|1626|27|3|28|42773.36|0.08|0.07|R|F|1993-07-31|1993-08-27|1993-08-01|NONE|RAIL|iers. final orbits +8608|18|44|1|32|29376.32|0.08|0.00|N|O|1996-05-28|1996-06-04|1996-06-21|DELIVER IN PERSON|REG AIR| regular asymptotes +8608|1250|88|2|44|50655.00|0.10|0.07|N|O|1996-07-13|1996-05-23|1996-08-05|TAKE BACK RETURN|TRUCK|packages. express theodolites detect +8608|298|80|3|2|2396.58|0.04|0.02|N|O|1996-04-14|1996-06-02|1996-04-17|NONE|RAIL|nal deposits are blithely +8608|404|5|4|45|58698.00|0.01|0.06|N|O|1996-07-03|1996-05-11|1996-07-17|DELIVER IN PERSON|SHIP|ss, express requests unwind-- blithel +8609|922|91|1|30|54687.60|0.04|0.00|R|F|1992-05-09|1992-05-25|1992-05-27|TAKE BACK RETURN|FOB|le quickly against the furiousl +8609|1021|22|2|10|9220.20|0.05|0.08|R|F|1992-08-14|1992-07-03|1992-08-19|DELIVER IN PERSON|RAIL|ts cajole furiously. regular, f +8609|1528|9|3|5|7147.60|0.07|0.07|A|F|1992-06-30|1992-07-14|1992-07-15|NONE|MAIL|unts. even, iro +8609|1844|45|4|24|41900.16|0.10|0.01|A|F|1992-07-17|1992-05-21|1992-07-22|DELIVER IN PERSON|TRUCK|oss the furiously regu +8609|171|50|5|33|35348.61|0.01|0.08|A|F|1992-04-27|1992-06-02|1992-05-01|DELIVER IN PERSON|RAIL|ously. express deposits haggle. final de +8610|1816|3|1|18|30920.58|0.09|0.05|R|F|1994-06-21|1994-06-27|1994-06-23|TAKE BACK RETURN|SHIP|ing to the furiously fin +8610|1285|97|2|47|55755.16|0.03|0.06|A|F|1994-07-11|1994-06-17|1994-07-24|COLLECT COD|SHIP| furiously across the careful +8610|1844|31|3|5|8729.20|0.06|0.03|R|F|1994-08-05|1994-07-10|1994-08-31|COLLECT COD|TRUCK| the unusual, +8610|1128|1|4|14|14407.68|0.02|0.03|R|F|1994-05-16|1994-07-21|1994-06-08|COLLECT COD|AIR|s according to the furiously unusu +8610|184|37|5|48|52040.64|0.10|0.03|A|F|1994-07-06|1994-07-04|1994-07-30|NONE|RAIL|he blithely pending +8610|1982|15|6|42|79127.16|0.00|0.06|R|F|1994-06-24|1994-07-02|1994-07-05|TAKE BACK RETURN|MAIL| ironic package +8610|141|68|7|7|7287.98|0.06|0.01|A|F|1994-07-06|1994-08-06|1994-07-27|NONE|REG AIR| permanently along the final +8611|590|51|1|29|43227.11|0.09|0.08|N|O|1996-08-12|1996-07-15|1996-09-05|DELIVER IN PERSON|SHIP|r the sly, +8611|1407|8|2|21|27476.40|0.01|0.07|N|O|1996-09-01|1996-06-13|1996-09-27|TAKE BACK RETURN|SHIP|iously even theodolites. expre +8612|1342|81|1|3|3730.02|0.07|0.04|N|O|1996-09-28|1996-10-18|1996-10-19|TAKE BACK RETURN|SHIP|ias. carefu +8612|1671|54|2|18|28308.06|0.03|0.08|N|O|1996-10-03|1996-09-20|1996-10-13|DELIVER IN PERSON|MAIL|lyly around the care +8612|395|96|3|44|56997.16|0.06|0.06|N|O|1996-11-20|1996-09-27|1996-12-02|COLLECT COD|AIR|s. blithely final pinto beans nag quickly +8613|559|90|1|40|58382.00|0.09|0.01|R|F|1993-10-22|1993-12-06|1993-11-12|NONE|AIR|usly quiet ideas poach fluffily. express p +8613|129|56|2|43|44252.16|0.04|0.07|R|F|1993-10-29|1993-10-29|1993-11-06|COLLECT COD|REG AIR|! slyly pending packages haggl +8614|1545|26|1|50|72327.00|0.09|0.03|A|F|1994-09-09|1994-08-20|1994-09-12|NONE|AIR|es play. pending accounts wake +8614|797|30|2|31|52631.49|0.00|0.04|R|F|1994-08-28|1994-08-18|1994-09-14|NONE|REG AIR|e deposits. regular packages nag quickl +8614|1091|62|3|11|10912.99|0.07|0.04|R|F|1994-09-27|1994-08-12|1994-10-26|COLLECT COD|FOB|ully ironic pinto beans bo +8615|1674|98|1|17|26786.39|0.01|0.08|N|O|1996-08-14|1996-09-08|1996-09-13|COLLECT COD|AIR|sly above the furiously u +8615|1110|83|2|36|36399.96|0.06|0.07|N|O|1996-07-03|1996-09-01|1996-07-31|NONE|AIR| accounts cajo +8615|609|72|3|10|15096.00|0.03|0.03|N|O|1996-07-28|1996-09-01|1996-08-04|NONE|FOB|sly bold packages hagg +8640|1726|69|1|4|6510.88|0.03|0.01|R|F|1993-12-28|1993-11-27|1994-01-19|DELIVER IN PERSON|REG AIR|could have to us +8640|858|59|2|13|22865.05|0.02|0.06|R|F|1993-09-25|1993-12-11|1993-10-02|DELIVER IN PERSON|FOB| accounts. acc +8641|1932|21|1|27|49516.11|0.05|0.03|R|F|1995-04-28|1995-05-05|1995-05-03|NONE|AIR| deposits. regular deposits use furiousl +8641|1911|56|2|41|74329.31|0.07|0.07|A|F|1995-04-01|1995-06-22|1995-04-17|DELIVER IN PERSON|SHIP|ely blithely even excuses. enticingly +8642|1397|36|1|7|9088.73|0.07|0.06|R|F|1993-02-04|1993-03-17|1993-02-07|COLLECT COD|RAIL|kages haggle quickly above the blithely ex +8642|1050|21|2|15|14265.75|0.02|0.05|R|F|1993-03-06|1993-03-14|1993-04-03|COLLECT COD|FOB|ts. slyly +8642|115|16|3|31|31468.41|0.05|0.03|R|F|1993-03-25|1993-02-28|1993-04-22|COLLECT COD|RAIL|ag furiously. pending dep +8643|1067|3|1|17|16457.02|0.10|0.08|N|O|1998-09-23|1998-09-02|1998-10-12|COLLECT COD|AIR|excuses haggle busily. furiously ironic +8643|899|66|2|3|5399.67|0.09|0.03|N|O|1998-10-08|1998-09-24|1998-10-15|TAKE BACK RETURN|TRUCK|use blithely. fluffily e +8644|1097|98|1|34|33935.06|0.08|0.07|A|F|1994-09-06|1994-09-01|1994-09-09|DELIVER IN PERSON|SHIP|riously final +8644|700|94|2|45|72031.50|0.00|0.03|R|F|1994-11-02|1994-09-04|1994-11-04|TAKE BACK RETURN|FOB| always pending ideas. slyly pe +8645|1604|28|1|23|34628.80|0.09|0.07|N|O|1997-02-25|1997-01-23|1997-03-14|NONE|AIR| carefully regular requests abou +8645|384|41|2|39|50090.82|0.07|0.02|N|O|1997-02-05|1996-11-28|1997-02-13|COLLECT COD|AIR|le blithely after the blithely ironic acco +8645|883|50|3|21|37461.48|0.00|0.03|N|O|1997-01-02|1996-12-08|1997-01-11|DELIVER IN PERSON|SHIP| packages. fu +8645|1|77|4|34|30634.00|0.03|0.03|N|O|1996-12-29|1997-01-25|1997-01-16|TAKE BACK RETURN|FOB|ackages are carefully above the +8645|762|27|5|39|64847.64|0.06|0.01|N|O|1996-11-03|1996-11-26|1996-11-13|TAKE BACK RETURN|SHIP|luffily ironic excus +8645|133|12|6|34|35126.42|0.00|0.00|N|O|1997-01-10|1996-12-12|1997-01-23|NONE|TRUCK|lar deposits. platelets +8645|1226|27|7|42|47343.24|0.03|0.03|N|O|1997-01-09|1997-01-25|1997-01-26|TAKE BACK RETURN|TRUCK|ake blithely. blithely p +8646|327|28|1|35|42956.20|0.03|0.08|R|F|1994-06-28|1994-07-03|1994-06-29|DELIVER IN PERSON|MAIL|kly bold requests haggl +8646|1316|17|2|22|26780.82|0.05|0.00|A|F|1994-05-28|1994-05-18|1994-06-24|COLLECT COD|TRUCK|press deposits eat fluffily pending, speci +8646|1437|55|3|2|2676.86|0.04|0.06|R|F|1994-05-03|1994-06-10|1994-05-18|NONE|REG AIR| deposits. furiously pending dep +8646|1013|14|4|23|21022.23|0.10|0.08|R|F|1994-07-28|1994-07-02|1994-08-13|DELIVER IN PERSON|REG AIR|ss packages! regular +8646|1197|34|5|9|9883.71|0.03|0.07|R|F|1994-05-28|1994-05-18|1994-06-01|DELIVER IN PERSON|FOB| express deposits sleep caref +8646|478|37|6|4|5513.88|0.09|0.03|R|F|1994-05-24|1994-06-08|1994-06-02|TAKE BACK RETURN|FOB|iously ironic dependencies sleep abou +8647|1178|79|1|50|53958.50|0.03|0.05|A|F|1994-02-14|1994-02-11|1994-03-04|NONE|SHIP|ow foxes after the slyly regular f +8647|862|29|2|3|5288.58|0.02|0.01|R|F|1993-11-30|1994-01-19|1993-12-03|COLLECT COD|RAIL|ake quickly among t +8672|212|94|1|45|50049.45|0.06|0.04|R|F|1993-08-30|1993-08-09|1993-09-15|DELIVER IN PERSON|SHIP|dolites cajole caref +8672|423|82|2|10|13234.20|0.09|0.04|A|F|1993-08-31|1993-08-11|1993-09-15|DELIVER IN PERSON|FOB|ironic deposits boost. express de +8673|1988|33|1|3|5669.94|0.08|0.04|N|O|1996-02-18|1996-03-21|1996-03-01|DELIVER IN PERSON|TRUCK|ng ideas wake ca +8673|1090|91|2|1|991.09|0.04|0.05|N|O|1996-05-10|1996-05-11|1996-05-26|NONE|MAIL|ts. quickly final requests cajole slyl +8673|1799|26|3|41|69732.39|0.08|0.08|N|O|1996-04-09|1996-05-13|1996-04-11|TAKE BACK RETURN|FOB|en deposits. silent idea +8673|126|27|4|44|45149.28|0.06|0.04|N|O|1996-02-18|1996-04-02|1996-02-28|COLLECT COD|SHIP|use blithel +8673|272|54|5|49|57441.23|0.02|0.08|N|O|1996-06-07|1996-04-03|1996-06-15|TAKE BACK RETURN|RAIL|elets are carefu +8674|1852|39|1|22|38584.70|0.03|0.06|N|O|1997-06-13|1997-04-10|1997-06-27|TAKE BACK RETURN|FOB|the furiously final theodolites. depos +8674|1276|51|2|25|29431.75|0.08|0.01|N|O|1997-03-24|1997-05-11|1997-04-06|NONE|TRUCK|s are regularly +8674|1093|99|3|17|16899.53|0.07|0.08|N|O|1997-06-02|1997-05-12|1997-07-01|TAKE BACK RETURN|REG AIR|ckages. regula +8675|246|1|1|11|12608.64|0.04|0.03|N|O|1997-10-09|1997-12-20|1997-10-27|DELIVER IN PERSON|REG AIR|ular pinto beans wake +8675|1026|97|2|48|44496.96|0.03|0.01|N|O|1997-10-22|1997-12-29|1997-11-15|DELIVER IN PERSON|REG AIR|refully ironic requests haggle b +8675|997|98|3|20|37959.80|0.06|0.03|N|O|1997-11-13|1997-11-21|1997-12-02|NONE|MAIL|en packages. bold packages sleep ac +8676|719|20|1|19|30774.49|0.01|0.06|N|O|1996-05-15|1996-06-09|1996-06-02|TAKE BACK RETURN|RAIL|cuses integrate ac +8677|1332|33|1|11|13566.63|0.10|0.03|R|F|1992-10-12|1992-12-05|1992-10-22|TAKE BACK RETURN|AIR|usly special +8677|1507|28|2|21|29578.50|0.07|0.07|A|F|1992-12-31|1992-11-19|1993-01-08|NONE|REG AIR|leep about the blithe +8678|492|22|1|6|8354.94|0.02|0.02|R|F|1993-01-21|1992-11-09|1993-02-11|TAKE BACK RETURN|RAIL|ld platelets haggle blithely bli +8678|1993|26|2|30|56849.70|0.08|0.04|A|F|1992-11-10|1992-11-06|1992-11-22|NONE|MAIL|silent ideas. slyly regular dependenc +8678|1435|14|3|20|26728.60|0.01|0.04|A|F|1992-10-27|1992-11-29|1992-11-22|NONE|MAIL|st furiously regular pinto beans! pendi +8678|1049|85|4|42|39901.68|0.08|0.00|A|F|1993-01-16|1992-11-11|1993-02-15|NONE|MAIL| the final pinto beans. caref +8678|1207|45|5|14|15514.80|0.07|0.07|R|F|1993-01-24|1992-11-15|1993-01-28|NONE|RAIL| regular deposits +8679|1970|71|1|13|24335.61|0.05|0.03|A|F|1992-07-12|1992-07-28|1992-07-25|COLLECT COD|FOB|es eat blithely above the carefull +8679|565|66|2|29|42501.24|0.05|0.03|A|F|1992-08-26|1992-06-27|1992-09-04|COLLECT COD|RAIL|special pinto beans hang fluffily. careful +8679|1452|31|3|44|59551.80|0.08|0.05|R|F|1992-05-17|1992-07-01|1992-06-11|NONE|TRUCK|ideas wake carefully fo +8704|1593|34|1|43|64267.37|0.06|0.07|N|O|1995-07-06|1995-08-26|1995-07-13|COLLECT COD|FOB|egrate carefully. b +8704|565|26|2|18|26380.08|0.09|0.04|N|O|1995-07-18|1995-08-22|1995-08-04|DELIVER IN PERSON|RAIL|instructions are final, bold accounts: +8704|675|76|3|1|1575.67|0.10|0.01|N|O|1995-08-02|1995-08-06|1995-08-20|TAKE BACK RETURN|TRUCK|ly regular packages d +8704|351|8|4|41|51305.35|0.06|0.05|N|O|1995-07-06|1995-09-01|1995-07-25|DELIVER IN PERSON|TRUCK|sits sleep fluffily besides the +8704|1621|63|5|36|54814.32|0.10|0.06|N|O|1995-08-07|1995-08-15|1995-08-08|NONE|FOB|blithely s +8704|355|40|6|47|59001.45|0.07|0.08|N|O|1995-09-05|1995-09-05|1995-10-01|COLLECT COD|REG AIR|int blithely. sly +8704|1233|8|7|22|24953.06|0.05|0.05|N|O|1995-10-06|1995-09-29|1995-10-28|TAKE BACK RETURN|REG AIR|riously even p +8705|1402|81|1|20|26068.00|0.09|0.01|N|O|1996-04-01|1996-05-11|1996-05-01|COLLECT COD|FOB| deposits? blithely +8705|43|19|2|17|16031.68|0.06|0.00|N|O|1996-05-21|1996-04-21|1996-06-04|NONE|REG AIR|l accounts. pinto beans solve ironica +8705|82|58|3|45|44193.60|0.09|0.04|N|O|1996-04-16|1996-05-21|1996-05-02|NONE|RAIL|he busily even tithes. slyly regular sh +8705|1972|5|4|12|22487.64|0.09|0.05|N|O|1996-06-21|1996-06-08|1996-07-05|TAKE BACK RETURN|SHIP|ts kindle furiously around the close +8706|1438|56|1|34|45540.62|0.04|0.07|N|O|1996-08-14|1996-08-09|1996-09-11|TAKE BACK RETURN|TRUCK|t. fluffily regular +8706|1090|61|2|22|21803.98|0.01|0.05|N|O|1996-08-02|1996-10-03|1996-08-24|TAKE BACK RETURN|FOB|al instructions use ironic, e +8706|1257|69|3|36|41697.00|0.09|0.02|N|O|1996-10-08|1996-08-17|1996-10-21|COLLECT COD|RAIL|s. blithely even accounts +8706|465|66|4|28|38232.88|0.04|0.01|N|O|1996-10-22|1996-09-23|1996-10-23|NONE|MAIL| the carefully even asymptotes x-r +8706|966|1|5|22|41073.12|0.10|0.01|N|O|1996-08-15|1996-09-07|1996-08-20|DELIVER IN PERSON|AIR|oxes above the express de +8706|1783|68|6|48|80869.44|0.02|0.05|N|O|1996-10-04|1996-08-09|1996-11-02|NONE|TRUCK| against the s +8706|69|70|7|44|42638.64|0.10|0.00|N|O|1996-10-16|1996-09-21|1996-11-04|NONE|AIR|lar, blithe packages haggle flu +8707|750|83|1|34|56125.50|0.01|0.02|N|O|1998-02-25|1998-02-05|1998-03-25|DELIVER IN PERSON|FOB|nal deposits. slyly regular ideas s +8707|509|100|2|14|19733.00|0.02|0.03|N|O|1998-03-22|1998-01-18|1998-04-16|COLLECT COD|FOB|deas kindle +8707|1368|7|3|11|13962.96|0.10|0.08|N|O|1998-03-03|1998-02-28|1998-03-07|COLLECT COD|MAIL|ckey players. blithely +8707|1259|60|4|2|2320.50|0.03|0.00|N|O|1998-01-31|1998-03-04|1998-02-09|DELIVER IN PERSON|SHIP|, final theodolites. furiou +8707|1919|20|5|2|3641.82|0.03|0.01|N|O|1998-01-02|1998-01-18|1998-01-06|DELIVER IN PERSON|REG AIR|ly. accounts was. fluffily unusual pl +8707|1257|95|6|42|48646.50|0.02|0.06|N|O|1998-01-16|1998-01-28|1998-01-30|COLLECT COD|MAIL|inal accounts? express requests affix +8707|249|4|7|24|27581.76|0.02|0.08|N|O|1998-01-20|1998-02-03|1998-02-12|NONE|MAIL|express, ironic +8708|1110|11|1|18|18199.98|0.02|0.06|N|O|1998-02-21|1998-02-17|1998-02-23|TAKE BACK RETURN|REG AIR| to the ironic, final ins +8708|1697|39|2|30|47960.70|0.10|0.00|N|O|1998-03-20|1998-02-20|1998-03-30|NONE|FOB|e carefully furiously regular re +8708|5|56|3|5|4525.00|0.09|0.07|N|O|1998-03-14|1997-12-27|1998-04-05|TAKE BACK RETURN|TRUCK|s integrate after the +8708|1359|36|4|17|21425.95|0.08|0.02|N|O|1998-01-12|1998-02-18|1998-01-14|TAKE BACK RETURN|FOB|ickly silent requests. +8708|421|9|5|17|22464.14|0.04|0.05|N|O|1998-03-12|1998-02-08|1998-04-04|NONE|AIR|ndencies along the +8708|841|8|6|31|53997.04|0.03|0.05|N|O|1998-02-16|1998-02-04|1998-02-21|NONE|SHIP|ly ironic a +8709|1011|82|1|35|31920.35|0.05|0.04|R|F|1994-05-23|1994-04-30|1994-06-16|NONE|MAIL|hely final packages ar +8709|476|77|2|4|5505.88|0.07|0.06|A|F|1994-04-30|1994-04-16|1994-05-12|TAKE BACK RETURN|TRUCK|uffy pearls. pending fox +8709|1836|80|3|40|69513.20|0.05|0.08|A|F|1994-04-28|1994-04-19|1994-05-20|DELIVER IN PERSON|MAIL|yly pinto be +8709|603|4|4|37|55633.20|0.09|0.07|R|F|1994-06-15|1994-05-01|1994-07-08|DELIVER IN PERSON|SHIP|quests. express, express epitaphs c +8709|1274|12|5|48|56412.96|0.02|0.05|R|F|1994-06-20|1994-04-27|1994-07-10|COLLECT COD|FOB|t silent theodolites. deposits sleep +8709|1300|12|6|11|13214.30|0.03|0.04|A|F|1994-06-19|1994-04-27|1994-06-25|TAKE BACK RETURN|REG AIR| special realms. +8709|280|81|7|39|46030.92|0.10|0.05|A|F|1994-05-16|1994-05-05|1994-05-23|DELIVER IN PERSON|SHIP|according to the even grouches. fluffi +8710|1451|91|1|3|4057.35|0.10|0.02|R|F|1994-04-22|1994-02-14|1994-04-25|DELIVER IN PERSON|SHIP|inal accounts. fi +8710|1659|83|2|46|71789.90|0.09|0.03|A|F|1994-02-03|1994-04-04|1994-02-25|NONE|FOB|osits against the unusual packages engag +8710|1874|61|3|10|17758.70|0.07|0.00|R|F|1994-04-30|1994-03-30|1994-05-26|TAKE BACK RETURN|FOB|he quickly +8710|386|71|4|35|45023.30|0.04|0.04|R|F|1994-03-28|1994-03-13|1994-04-22|COLLECT COD|TRUCK|kages eat busily express accounts +8711|90|41|1|21|20791.89|0.10|0.08|N|O|1997-05-16|1997-05-15|1997-05-29|DELIVER IN PERSON|TRUCK|eposits. unusual, pend +8711|280|62|2|49|57833.72|0.00|0.03|N|O|1997-06-02|1997-05-01|1997-06-22|TAKE BACK RETURN|SHIP| deposits maintain s +8711|331|16|3|37|45559.21|0.06|0.06|N|O|1997-04-23|1997-04-20|1997-05-08|COLLECT COD|FOB|ly even foxes haggle blithely. +8711|1553|94|4|33|48000.15|0.06|0.00|N|O|1997-05-21|1997-06-13|1997-06-02|NONE|SHIP|he slyly fi +8711|1282|94|5|30|35498.40|0.01|0.05|N|O|1997-06-03|1997-05-24|1997-06-04|TAKE BACK RETURN|RAIL|according to the +8711|1025|31|6|17|15742.34|0.07|0.03|N|O|1997-06-07|1997-04-24|1997-06-29|DELIVER IN PERSON|REG AIR|ideas wake blithely +8736|1322|23|1|3|3669.96|0.10|0.06|R|F|1993-10-14|1993-11-06|1993-10-24|TAKE BACK RETURN|RAIL|lly around the ironic attainments. careful +8736|691|23|2|44|70034.36|0.00|0.04|R|F|1993-10-11|1993-11-28|1993-10-25|NONE|FOB|yly blithely express courts. slyly speci +8736|1524|5|3|30|42765.60|0.04|0.01|A|F|1993-12-09|1993-11-15|1993-12-28|COLLECT COD|FOB|furiously unusual instruc +8736|1904|37|4|7|12641.30|0.09|0.05|R|F|1993-09-20|1993-11-03|1993-10-13|TAKE BACK RETURN|MAIL|sts. slyly ironic p +8736|1263|38|5|35|40749.10|0.04|0.04|R|F|1993-12-27|1993-11-29|1994-01-04|NONE|AIR|ter the regular depend +8736|191|70|6|33|36009.27|0.00|0.00|A|F|1994-01-06|1993-10-26|1994-01-25|DELIVER IN PERSON|MAIL|l foxes slee +8736|1168|77|7|23|24590.68|0.08|0.04|R|F|1993-09-26|1993-10-28|1993-10-01|NONE|AIR|l packages. c +8737|83|59|1|45|44238.60|0.03|0.04|N|O|1998-04-07|1998-04-01|1998-04-21|TAKE BACK RETURN|TRUCK|ructions sleep. ironic packages thrash eve +8737|968|69|2|2|3737.92|0.08|0.05|N|O|1998-01-25|1998-02-07|1998-02-19|DELIVER IN PERSON|RAIL|eans sleep quickly for the accounts +8737|471|1|3|1|1371.47|0.09|0.00|N|O|1998-04-24|1998-04-04|1998-04-26|NONE|FOB|cross the even requests. +8737|98|49|4|37|36929.33|0.01|0.01|N|O|1998-04-06|1998-03-28|1998-04-22|COLLECT COD|MAIL|s around the sauternes sleep blit +8737|1671|72|5|13|20444.71|0.07|0.02|N|O|1998-01-19|1998-02-11|1998-02-15|TAKE BACK RETURN|FOB|n blithely unusual +8737|1647|89|6|6|9291.84|0.03|0.04|N|O|1998-02-23|1998-02-24|1998-03-12|TAKE BACK RETURN|TRUCK| beans are. braids use b +8737|276|58|7|13|15291.51|0.09|0.04|N|O|1998-01-08|1998-02-21|1998-02-04|COLLECT COD|SHIP|cial packages-- furiously reg +8738|1452|92|1|3|4060.35|0.07|0.01|N|O|1998-04-26|1998-03-12|1998-05-10|COLLECT COD|MAIL| packages. carefully +8738|1856|86|2|18|31641.30|0.09|0.07|N|O|1998-05-02|1998-03-01|1998-05-17|TAKE BACK RETURN|TRUCK| bold instructions sleep according to th +8738|1219|20|3|14|15682.94|0.00|0.07|N|O|1998-04-06|1998-04-13|1998-05-02|NONE|TRUCK|y ironic requ +8739|1746|73|1|20|32954.80|0.06|0.04|N|O|1998-08-18|1998-08-10|1998-09-10|TAKE BACK RETURN|AIR|le. regular, ironic frays integr +8739|1544|85|2|14|20237.56|0.05|0.01|N|O|1998-09-14|1998-09-17|1998-09-24|NONE|RAIL|le quickly from the fur +8739|1000|35|3|5|4505.00|0.02|0.04|N|O|1998-10-10|1998-08-29|1998-11-02|TAKE BACK RETURN|TRUCK|its cajole quickly after t +8739|582|43|4|27|40029.66|0.09|0.06|N|O|1998-10-19|1998-09-28|1998-11-02|COLLECT COD|REG AIR|se blithely! quic +8740|379|36|1|31|39660.47|0.08|0.06|N|O|1998-09-01|1998-09-05|1998-09-22|NONE|SHIP|fully dogged requests sublate bo +8740|752|49|2|44|72721.00|0.05|0.04|N|O|1998-09-24|1998-08-07|1998-10-23|COLLECT COD|MAIL|ss deposits ca +8740|1856|43|3|35|61524.75|0.05|0.02|N|O|1998-09-22|1998-09-06|1998-10-06|DELIVER IN PERSON|TRUCK|tructions. +8741|357|42|1|35|44007.25|0.03|0.06|N|O|1997-11-06|1997-10-20|1997-11-26|COLLECT COD|MAIL|al, unusual ideas +8741|303|60|2|42|50538.60|0.06|0.06|N|O|1997-10-26|1997-10-23|1997-11-17|DELIVER IN PERSON|SHIP|s haggle furious +8741|972|75|3|7|13110.79|0.03|0.07|N|O|1997-09-10|1997-11-17|1997-10-04|NONE|SHIP|s cajole. fluffily bol +8741|250|78|4|1|1150.25|0.05|0.02|N|O|1997-12-05|1997-11-12|1997-12-11|TAKE BACK RETURN|FOB|ses. even, iron +8741|821|88|5|32|55098.24|0.07|0.08|N|O|1997-11-07|1997-10-10|1997-11-20|TAKE BACK RETURN|FOB| quickly ironic reque +8742|1980|69|1|15|28229.70|0.05|0.03|N|O|1997-10-27|1997-10-24|1997-11-10|NONE|REG AIR|final requests boost carefully. +8742|1485|3|2|26|36048.48|0.08|0.00|N|O|1997-09-30|1997-11-06|1997-10-07|TAKE BACK RETURN|REG AIR|pendencies sleep theodolites. excuse +8742|1226|38|3|41|46216.02|0.00|0.06|N|O|1997-11-25|1997-11-12|1997-12-04|DELIVER IN PERSON|RAIL| according to the quickly unusual req +8742|514|15|4|20|28290.20|0.10|0.01|N|O|1997-09-15|1997-10-28|1997-09-17|DELIVER IN PERSON|TRUCK|e carefully bold accounts. slyly specia +8742|1427|6|5|10|13284.20|0.05|0.08|N|O|1997-10-05|1997-11-03|1997-10-31|TAKE BACK RETURN|REG AIR| the final +8742|756|57|6|13|21537.75|0.01|0.06|N|O|1997-09-13|1997-10-08|1997-09-24|DELIVER IN PERSON|MAIL|lly express package +8743|1371|10|1|39|49622.43|0.10|0.07|N|O|1995-10-20|1995-10-18|1995-10-24|NONE|TRUCK| pending ideas dazzle quickly ac +8743|1969|14|2|33|61741.68|0.10|0.07|N|O|1995-08-29|1995-09-27|1995-09-26|TAKE BACK RETURN|SHIP|ly unusual dolphins +8743|475|34|3|19|26133.93|0.07|0.06|N|O|1995-11-24|1995-09-23|1995-12-20|DELIVER IN PERSON|RAIL|ages cajole. quickly slow deposits integ +8743|1468|47|4|46|62995.16|0.06|0.07|N|O|1995-08-10|1995-10-01|1995-08-29|NONE|TRUCK|gle quickly. doggedly unusual pinto beans c +8768|1150|51|1|6|6306.90|0.03|0.08|N|O|1995-08-22|1995-10-27|1995-09-05|COLLECT COD|SHIP|thily final accounts. furious +8768|1811|41|2|42|71938.02|0.05|0.02|N|O|1995-10-22|1995-09-27|1995-10-23|TAKE BACK RETURN|RAIL|ven somas grow quickly bold foxes. +8768|958|61|3|23|42755.85|0.02|0.04|N|O|1995-09-27|1995-11-11|1995-10-01|COLLECT COD|AIR|iously pending instructions above +8768|605|68|4|4|6022.40|0.05|0.04|N|O|1995-11-26|1995-09-29|1995-12-21|DELIVER IN PERSON|MAIL|l accounts must a +8769|1995|96|1|12|22763.88|0.09|0.02|N|O|1997-06-15|1997-07-29|1997-07-05|TAKE BACK RETURN|AIR|p express warhorses. +8769|1891|35|2|12|21514.68|0.00|0.05|N|O|1997-07-27|1997-07-17|1997-07-28|TAKE BACK RETURN|RAIL|l accounts. carefully express pinto beans +8769|1905|38|3|32|57820.80|0.07|0.04|N|O|1997-06-05|1997-06-27|1997-06-30|TAKE BACK RETURN|REG AIR|e the even attainments. n +8769|802|69|4|8|13622.40|0.04|0.05|N|O|1997-07-10|1997-06-28|1997-07-20|NONE|RAIL|ng packages haggle regular sheaves +8770|621|22|1|18|27389.16|0.02|0.03|N|O|1996-09-24|1996-09-18|1996-09-27|COLLECT COD|SHIP|s hinder according to the quickly even depo +8770|400|57|2|36|46814.40|0.10|0.05|N|O|1996-09-29|1996-08-17|1996-10-25|COLLECT COD|AIR|ts nag flu +8770|770|71|3|37|61818.49|0.06|0.01|N|O|1996-10-25|1996-08-29|1996-11-23|DELIVER IN PERSON|MAIL|yly across the carefully express depo +8771|567|68|1|13|19078.28|0.02|0.00|R|F|1992-06-24|1992-06-17|1992-07-09|NONE|MAIL|y bold packages. sly +8771|1782|67|2|48|80821.44|0.10|0.07|R|F|1992-07-05|1992-06-11|1992-07-19|TAKE BACK RETURN|MAIL|lways carefully regular pinto beans. e +8771|1524|5|3|10|14255.20|0.00|0.00|A|F|1992-04-16|1992-05-03|1992-04-29|DELIVER IN PERSON|REG AIR|ngside of the fu +8772|1286|61|1|1|1187.28|0.01|0.07|A|F|1992-04-22|1992-04-24|1992-05-12|NONE|TRUCK|blithely regular realms. regul +8772|1186|87|2|11|11958.98|0.09|0.00|A|F|1992-03-09|1992-04-18|1992-03-25|TAKE BACK RETURN|TRUCK|bout the furiously even grouches boost +8773|469|28|1|22|30128.12|0.05|0.07|N|O|1995-12-15|1995-12-13|1996-01-09|DELIVER IN PERSON|SHIP|ests above the final theodolites +8773|1701|86|2|7|11218.90|0.10|0.07|N|O|1995-11-16|1996-01-08|1995-12-11|COLLECT COD|RAIL| above the +8773|1361|38|3|11|13885.96|0.10|0.05|N|O|1995-11-05|1995-11-22|1995-11-11|TAKE BACK RETURN|RAIL|ccounts. accounts caj +8774|175|2|1|22|23653.74|0.00|0.07|N|O|1996-07-12|1996-05-15|1996-07-15|TAKE BACK RETURN|MAIL|nt dependencies cajole! slyly even p +8774|1934|79|2|12|22031.16|0.06|0.07|N|O|1996-06-28|1996-05-24|1996-07-18|DELIVER IN PERSON|AIR|tes wake slyly accor +8774|646|47|3|31|47945.84|0.02|0.00|N|O|1996-05-27|1996-07-02|1996-06-22|COLLECT COD|RAIL|ructions affix doggedly even requests. slyl +8774|39|65|4|21|19719.63|0.04|0.02|N|O|1996-04-20|1996-05-19|1996-04-21|NONE|SHIP|asymptotes. carefully regular foxes sleep +8774|593|24|5|26|38833.34|0.10|0.03|N|O|1996-08-02|1996-06-24|1996-08-16|NONE|TRUCK|ual packages. asymptotes +8774|658|90|6|24|37407.60|0.02|0.06|N|O|1996-08-11|1996-06-05|1996-08-18|TAKE BACK RETURN|TRUCK|s haggle blithely slyly +8774|472|31|7|50|68623.50|0.06|0.07|N|O|1996-07-03|1996-06-07|1996-07-25|DELIVER IN PERSON|AIR|yly. requests sleep sometimes car +8775|1360|61|1|50|63068.00|0.05|0.04|A|F|1995-05-17|1995-05-02|1995-06-06|DELIVER IN PERSON|REG AIR|ecial ideas sleep carefully amo +8800|45|71|1|13|12285.52|0.02|0.03|R|F|1993-02-24|1993-01-16|1993-03-08|COLLECT COD|MAIL|he regular, ironic requests. carefully +8801|1184|93|1|44|47747.92|0.08|0.04|R|F|1992-09-28|1992-09-29|1992-10-23|NONE|FOB|ly even accounts ar +8801|1631|73|2|44|67435.72|0.02|0.08|A|F|1992-11-27|1992-10-18|1992-12-06|COLLECT COD|RAIL|oost carefully ir +8801|158|59|3|1|1058.15|0.00|0.04|R|F|1992-11-24|1992-10-22|1992-12-19|COLLECT COD|RAIL|e furiously regular requests. regular +8801|51|2|4|50|47552.50|0.07|0.03|A|F|1992-11-15|1992-09-18|1992-11-29|TAKE BACK RETURN|TRUCK|to the furio +8801|863|97|5|6|10583.16|0.04|0.02|A|F|1992-12-07|1992-10-03|1992-12-24|DELIVER IN PERSON|MAIL|fter the foxes. even fo +8801|250|5|6|23|26455.75|0.04|0.01|A|F|1992-09-17|1992-09-26|1992-09-24|NONE|REG AIR|asymptotes nag alongsi +8801|1141|78|7|20|20842.80|0.00|0.05|A|F|1992-11-25|1992-09-28|1992-12-14|TAKE BACK RETURN|SHIP| unusual requ +8802|713|10|1|13|20978.23|0.02|0.04|A|F|1995-04-10|1995-03-03|1995-04-26|DELIVER IN PERSON|MAIL|t cajole. quickly ironic package +8802|483|42|2|14|19368.72|0.02|0.02|R|F|1995-03-26|1995-03-18|1995-04-22|NONE|TRUCK|efully special accounts. +8802|1308|9|3|22|26604.60|0.03|0.08|A|F|1995-03-27|1995-04-04|1995-04-06|TAKE BACK RETURN|RAIL|lar instructions. foxes affix s +8802|1138|47|4|24|24939.12|0.04|0.01|A|F|1995-05-14|1995-04-14|1995-05-26|DELIVER IN PERSON|MAIL|foxes boost slyly +8802|93|19|5|17|16882.53|0.05|0.01|R|F|1995-03-02|1995-04-26|1995-03-16|COLLECT COD|FOB|daringly e +8803|520|81|1|18|25569.36|0.03|0.08|R|F|1993-04-08|1993-01-26|1993-05-05|TAKE BACK RETURN|SHIP|sits sleep according to the blithely +8803|235|17|2|22|24975.06|0.09|0.00|R|F|1993-02-15|1993-02-28|1993-02-28|TAKE BACK RETURN|REG AIR|s. ironic requests along +8803|602|34|3|11|16528.60|0.08|0.08|R|F|1993-04-06|1993-01-31|1993-04-20|NONE|FOB|. theodolites wake closely. carefully iron +8803|1226|1|4|17|19162.74|0.03|0.01|A|F|1993-04-01|1993-03-13|1993-04-22|NONE|MAIL|round the pending requ +8803|79|55|5|43|42100.01|0.01|0.06|R|F|1993-03-24|1993-03-18|1993-04-11|TAKE BACK RETURN|AIR|e slyly ir +8803|205|60|6|22|24314.40|0.08|0.06|A|F|1992-12-25|1993-01-22|1993-01-24|TAKE BACK RETURN|TRUCK|equests. furiously daring +8803|536|67|7|22|31603.66|0.09|0.00|R|F|1992-12-29|1993-01-26|1993-01-26|NONE|FOB|efully. ironic asymptotes around the deposi +8804|281|36|1|28|33075.84|0.10|0.07|N|O|1998-02-08|1998-02-16|1998-02-23|DELIVER IN PERSON|MAIL|ar, close ins +8804|175|54|2|17|18277.89|0.09|0.05|N|O|1998-02-22|1997-12-29|1998-03-23|NONE|MAIL|lly bold accounts sleep c +8804|68|94|3|29|28073.74|0.07|0.06|N|O|1997-11-26|1997-12-26|1997-12-20|COLLECT COD|FOB|structions haggle. carefully pending reques +8804|1768|11|4|43|71799.68|0.01|0.08|N|O|1998-01-24|1998-01-04|1998-02-15|DELIVER IN PERSON|MAIL|eposits. even theodolites boost. fluffily +8804|1135|8|5|44|45589.72|0.05|0.05|N|O|1998-02-01|1998-01-21|1998-02-08|TAKE BACK RETURN|RAIL|egular deposits. blithely ironic de +8804|1479|58|6|9|12424.23|0.03|0.05|N|O|1998-01-18|1998-01-25|1998-02-02|DELIVER IN PERSON|REG AIR|regular, final deposits. ironic ep +8804|633|65|7|12|18403.56|0.10|0.04|N|O|1998-01-09|1998-02-13|1998-01-30|COLLECT COD|MAIL|its. epitaphs agains +8805|610|11|1|42|63445.62|0.00|0.02|N|O|1996-10-20|1996-09-18|1996-10-28|COLLECT COD|RAIL|r accounts nag after the slyly ironic pack +8805|501|2|2|30|42045.00|0.01|0.06|N|O|1996-10-16|1996-09-14|1996-10-30|COLLECT COD|TRUCK|g the slyly quiet foxes. busy t +8805|836|36|3|38|65999.54|0.07|0.03|N|O|1996-08-04|1996-09-21|1996-08-27|COLLECT COD|SHIP|tions. furiously special realms c +8805|900|67|4|46|82841.40|0.04|0.01|N|O|1996-08-25|1996-09-16|1996-09-01|DELIVER IN PERSON|RAIL|usly about the blit +8805|914|17|5|38|68966.58|0.02|0.00|N|O|1996-10-21|1996-09-19|1996-11-10|COLLECT COD|TRUCK|re quickly furiously bold multipliers +8805|652|53|6|23|35710.95|0.09|0.04|N|O|1996-11-15|1996-08-30|1996-11-28|DELIVER IN PERSON|RAIL|are accounts. even deposits cajole s +8805|1088|24|7|7|6923.56|0.01|0.08|N|O|1996-10-18|1996-10-08|1996-10-21|NONE|RAIL| stealthy, final foxes a +8806|275|76|1|8|9402.16|0.09|0.04|N|O|1996-04-26|1996-06-15|1996-05-20|TAKE BACK RETURN|TRUCK|ts are slyly regular th +8806|1658|100|2|48|74863.20|0.03|0.05|N|O|1996-07-30|1996-06-13|1996-08-17|DELIVER IN PERSON|AIR|ar requests sublate fluffily across the b +8806|1199|8|3|25|27504.75|0.06|0.06|N|O|1996-04-05|1996-06-28|1996-04-24|NONE|TRUCK|y bold asymptotes. slyly bold account +8806|941|76|4|28|51574.32|0.04|0.04|N|O|1996-07-03|1996-06-18|1996-07-16|DELIVER IN PERSON|TRUCK|le quickly carefully final pa +8807|1047|18|1|18|17064.72|0.01|0.03|R|F|1993-03-01|1993-05-12|1993-03-14|NONE|REG AIR|s engage blithely. ideas wake hockey +8807|1949|94|2|50|92547.00|0.00|0.07|A|F|1993-05-14|1993-05-21|1993-06-03|TAKE BACK RETURN|SHIP|oldly even +8807|1328|29|3|4|4917.28|0.04|0.00|A|F|1993-06-13|1993-05-01|1993-07-08|NONE|AIR|kages use slyly stealthy +8832|1791|76|1|33|55862.07|0.07|0.04|A|F|1992-03-20|1992-03-11|1992-04-13|TAKE BACK RETURN|SHIP| carefully ironic asymptotes use after the +8832|530|21|2|50|71526.50|0.09|0.08|R|F|1992-03-16|1992-04-05|1992-03-27|COLLECT COD|RAIL|sual packages. sometimes ironic req +8833|2000|33|1|43|38786.00|0.06|0.08|R|F|1992-05-27|1992-07-06|1992-06-10|TAKE BACK RETURN|TRUCK|ffix slyly carefully regular +8833|704|5|2|49|78630.30|0.06|0.07|R|F|1992-06-22|1992-07-27|1992-06-27|DELIVER IN PERSON|MAIL|yly even accounts s +8834|1322|61|1|41|50156.12|0.05|0.01|R|F|1993-11-20|1994-02-07|1993-12-10|COLLECT COD|AIR|the slyly final requests. carefully ironi +8834|399|56|2|48|62370.72|0.01|0.08|R|F|1994-01-18|1993-12-15|1994-01-26|NONE|REG AIR|eodolites are. fluffily silent packages ar +8834|645|46|3|26|40186.64|0.08|0.01|R|F|1994-02-01|1994-01-31|1994-02-24|COLLECT COD|AIR|s deposits use alongside of the furi +8835|1358|35|1|25|31483.75|0.00|0.08|A|F|1994-11-21|1995-01-05|1994-11-24|NONE|SHIP|se quickly bold orbits. pac +8835|989|58|2|3|5669.94|0.06|0.04|R|F|1994-12-22|1994-12-27|1995-01-04|DELIVER IN PERSON|SHIP|y regular ideas wake slyly across the theo +8835|725|22|3|9|14631.48|0.03|0.06|A|F|1994-11-10|1994-12-25|1994-11-11|NONE|SHIP| ironic reques +8835|341|42|4|49|60825.66|0.03|0.08|R|F|1994-11-15|1994-11-24|1994-12-04|NONE|SHIP|ts: fluffily express foxes cajole +8835|1572|73|5|15|22103.55|0.04|0.02|A|F|1994-10-23|1994-12-21|1994-11-11|COLLECT COD|SHIP|fily carefully +8836|129|82|1|39|40135.68|0.03|0.04|N|O|1996-11-26|1996-12-10|1996-12-05|NONE|TRUCK|kly ironic packages. idl +8836|1890|91|2|47|84218.83|0.03|0.07|N|O|1996-12-09|1997-01-15|1996-12-13|NONE|TRUCK|l, regular deposits behind the carefu +8836|415|45|3|44|57878.04|0.08|0.04|N|O|1996-12-28|1996-12-21|1997-01-25|COLLECT COD|SHIP| quietly regular packages haggle blithe +8836|793|90|4|34|57588.86|0.04|0.05|N|O|1996-11-14|1996-12-07|1996-11-27|DELIVER IN PERSON|RAIL|ironic accounts. slyly fina +8836|1274|12|5|24|28206.48|0.10|0.07|N|O|1996-10-22|1997-01-18|1996-11-06|TAKE BACK RETURN|RAIL|ly regular asymptotes. quickly bl +8836|1574|75|6|7|10328.99|0.08|0.05|N|O|1997-02-01|1997-01-15|1997-02-23|DELIVER IN PERSON|MAIL|ow packages against th +8837|1924|25|1|34|62081.28|0.07|0.04|N|O|1997-05-19|1997-05-09|1997-05-27|COLLECT COD|AIR|kly ideas. platelets cajole +8837|1786|29|2|3|5063.34|0.10|0.06|N|O|1997-03-29|1997-04-24|1997-04-01|NONE|SHIP|cajole ironic packages. express accounts +8837|1534|75|3|20|28710.60|0.08|0.08|N|O|1997-06-06|1997-03-27|1997-06-11|COLLECT COD|REG AIR| escapades nag furiously ironic, careful +8838|1042|48|1|3|2829.12|0.03|0.00|N|O|1997-10-04|1997-10-19|1997-10-09|NONE|SHIP|the fluffily iron +8838|420|50|2|15|19806.30|0.09|0.04|N|O|1997-11-21|1997-12-18|1997-11-30|COLLECT COD|TRUCK|the slyly unusual instructions. pe +8838|1349|64|3|20|25006.80|0.03|0.00|N|O|1997-11-03|1997-12-18|1997-11-16|DELIVER IN PERSON|TRUCK|ons. regular pi +8838|1936|25|4|4|7351.72|0.04|0.00|N|O|1997-11-05|1997-11-29|1997-11-14|DELIVER IN PERSON|AIR|nstructions are among the furiously iron +8838|1807|51|5|15|25632.00|0.09|0.08|N|O|1997-10-09|1997-12-04|1997-10-13|TAKE BACK RETURN|TRUCK| deposits +8839|199|26|1|36|39570.84|0.00|0.04|N|F|1995-06-09|1995-06-12|1995-06-22|DELIVER IN PERSON|RAIL|f the ironic, stealthy requests. fur +8864|917|86|1|5|9089.55|0.01|0.04|N|O|1997-02-18|1997-04-26|1997-02-19|DELIVER IN PERSON|AIR| final pinto beans are blithely +8864|1579|60|2|36|53300.52|0.02|0.06|N|O|1997-04-09|1997-04-10|1997-05-05|NONE|RAIL|e busily regular asymptotes. quickly pendin +8865|684|16|1|7|11092.76|0.09|0.08|A|F|1993-06-30|1993-07-02|1993-07-02|COLLECT COD|MAIL| impress around +8866|1673|56|1|32|50389.44|0.04|0.00|N|O|1998-06-22|1998-04-09|1998-07-17|COLLECT COD|AIR|ly. furiously +8866|718|15|2|36|58273.56|0.01|0.04|N|O|1998-05-18|1998-05-01|1998-06-04|DELIVER IN PERSON|TRUCK|excuses haggle. ca +8866|554|15|3|45|65454.75|0.03|0.08|N|O|1998-06-21|1998-05-10|1998-07-06|COLLECT COD|TRUCK|hely even accounts haggle ca +8866|1823|10|4|1|1724.82|0.07|0.04|N|O|1998-04-12|1998-04-12|1998-04-25|COLLECT COD|MAIL|y regular packages. idle depos +8866|1383|22|5|26|33393.88|0.06|0.01|N|O|1998-02-28|1998-04-06|1998-03-03|NONE|SHIP|ly quickly final package +8867|336|93|1|50|61816.50|0.01|0.07|N|O|1997-04-04|1997-03-17|1997-04-10|NONE|TRUCK|furiously against the furiously furiou +8867|954|57|2|40|74198.00|0.07|0.04|N|O|1997-03-10|1997-03-05|1997-03-23|COLLECT COD|RAIL| blithely +8867|38|14|3|17|15946.51|0.05|0.04|N|O|1997-03-18|1997-03-09|1997-03-20|COLLECT COD|SHIP| final excu +8867|1984|73|4|11|20745.78|0.04|0.00|N|O|1997-01-03|1997-02-07|1997-01-11|NONE|REG AIR|bold packages haggle b +8867|1430|48|5|37|49262.91|0.04|0.04|N|O|1997-02-25|1997-02-13|1997-03-18|DELIVER IN PERSON|REG AIR|usual, special de +8867|470|29|6|25|34261.75|0.02|0.02|N|O|1997-02-26|1997-02-12|1997-03-17|NONE|AIR|rnis. carefully regular depo +8867|1129|30|7|18|18542.16|0.05|0.01|N|O|1997-02-16|1997-03-14|1997-02-21|NONE|RAIL|ent, even asymptotes alongside of the quic +8868|1160|61|1|50|53058.00|0.10|0.05|A|F|1994-05-29|1994-04-01|1994-06-28|TAKE BACK RETURN|SHIP|layers nag blithely final +8868|751|16|2|34|56159.50|0.03|0.01|A|F|1994-05-29|1994-03-07|1994-06-23|NONE|RAIL|quickly agai +8868|391|48|3|39|50364.21|0.08|0.00|A|F|1994-02-25|1994-04-29|1994-03-14|NONE|RAIL|uctions. fluf +8868|865|32|4|10|17658.60|0.04|0.02|R|F|1994-05-10|1994-04-28|1994-05-27|NONE|SHIP|pending requests alongside +8869|1199|100|1|39|42907.41|0.03|0.03|R|F|1993-09-19|1993-08-15|1993-09-26|COLLECT COD|FOB|ly idle foxes. pending +8869|515|6|2|36|50958.36|0.01|0.05|A|F|1993-06-20|1993-07-19|1993-07-04|DELIVER IN PERSON|RAIL|ously. regular, reg +8869|949|52|3|44|81397.36|0.05|0.03|R|F|1993-08-06|1993-06-24|1993-08-30|COLLECT COD|TRUCK|uriously even platelets; slyly final +8869|266|21|4|18|20992.68|0.00|0.06|R|F|1993-09-12|1993-07-07|1993-09-27|DELIVER IN PERSON|AIR|ly final instructions use furiously regu +8870|816|83|1|23|39486.63|0.02|0.02|R|F|1993-04-14|1993-04-07|1993-04-25|TAKE BACK RETURN|SHIP|stealthily regular ideas u +8870|1116|89|2|50|50855.50|0.06|0.04|R|F|1993-04-04|1993-05-29|1993-04-28|COLLECT COD|MAIL|ly ironic requests haggle sly +8871|112|65|1|37|37448.07|0.01|0.00|A|F|1993-12-23|1993-12-12|1993-12-25|TAKE BACK RETURN|RAIL|requests. foxes do +8896|1849|93|1|28|49023.52|0.04|0.08|N|O|1997-04-01|1997-04-06|1997-04-03|DELIVER IN PERSON|SHIP| beans. thinly final +8897|586|47|1|37|55003.46|0.10|0.00|N|O|1997-09-30|1997-11-06|1997-10-14|COLLECT COD|AIR|nos. ironic i +8897|577|8|2|16|23641.12|0.01|0.05|N|O|1997-10-03|1997-10-22|1997-10-22|TAKE BACK RETURN|MAIL|out the dependencies. caref +8897|182|61|3|20|21643.60|0.05|0.01|N|O|1997-10-04|1997-11-07|1997-11-01|NONE|RAIL| express requests haggle blithely spec +8897|1817|61|4|48|82502.88|0.09|0.03|N|O|1997-11-04|1997-11-05|1997-11-05|DELIVER IN PERSON|TRUCK|r ideas nag slyly. carefully bold theodol +8897|212|40|5|50|55610.50|0.02|0.02|N|O|1997-09-26|1997-11-22|1997-10-03|NONE|SHIP|s are furiously. final +8897|1667|50|6|43|67452.38|0.00|0.02|N|O|1997-10-24|1997-11-08|1997-11-13|DELIVER IN PERSON|AIR|sual asymptotes +8898|1351|66|1|46|57608.10|0.10|0.02|N|O|1996-09-05|1996-10-24|1996-09-26|COLLECT COD|TRUCK|thely express platelets. carefully re +8898|439|40|2|29|38843.47|0.10|0.02|N|O|1996-12-17|1996-11-01|1997-01-11|NONE|FOB| bold reques +8899|1794|95|1|18|30524.22|0.05|0.01|A|F|1993-11-30|1993-10-26|1993-12-09|COLLECT COD|SHIP|furiously bo +8899|337|94|2|36|44543.88|0.09|0.08|A|F|1993-08-18|1993-11-07|1993-09-04|DELIVER IN PERSON|TRUCK|encies. furiously express instru +8899|256|57|3|34|39312.50|0.04|0.04|A|F|1993-10-31|1993-10-31|1993-11-28|COLLECT COD|REG AIR|y regular foxes. reg +8900|1812|42|1|11|18851.91|0.10|0.04|N|O|1996-06-24|1996-06-18|1996-07-11|NONE|FOB|ven packages. regular deposits sle +8900|209|91|2|40|44368.00|0.03|0.00|N|O|1996-06-18|1996-06-23|1996-06-23|NONE|TRUCK|evenly iro +8900|958|93|3|24|44614.80|0.06|0.03|N|O|1996-07-01|1996-05-27|1996-07-07|NONE|TRUCK|refully regular accounts. +8900|545|36|4|28|40475.12|0.02|0.03|N|O|1996-05-05|1996-05-05|1996-05-06|DELIVER IN PERSON|REG AIR| ironic, unusual accounts w +8900|1163|100|5|47|50015.52|0.05|0.00|N|O|1996-07-11|1996-06-13|1996-07-23|DELIVER IN PERSON|TRUCK|re furiously ironic depende +8900|549|10|6|29|42036.66|0.08|0.08|N|O|1996-04-04|1996-05-16|1996-04-11|COLLECT COD|REG AIR| even requests need to use blithely pendin +8900|1084|55|7|20|19701.60|0.01|0.04|N|O|1996-05-11|1996-05-22|1996-05-25|TAKE BACK RETURN|SHIP|usly across the blithely p +8901|860|60|1|3|5282.58|0.00|0.08|N|O|1995-11-21|1995-09-26|1995-12-15|TAKE BACK RETURN|SHIP|usly final dependencies should h +8901|1938|27|2|25|45998.25|0.01|0.07|N|O|1995-08-29|1995-09-29|1995-09-08|COLLECT COD|SHIP|lose depen +8902|1301|2|1|13|15629.90|0.10|0.04|N|O|1995-10-03|1995-09-03|1995-10-31|NONE|RAIL|counts boost blithely +8903|165|66|1|26|27694.16|0.09|0.05|R|F|1994-10-04|1994-10-31|1994-10-25|TAKE BACK RETURN|FOB|ironic courts +8903|1104|5|2|10|10051.00|0.09|0.07|A|F|1994-08-29|1994-09-19|1994-09-18|TAKE BACK RETURN|RAIL|lly unusual ideas. ironic requests wak +8903|1005|6|3|2|1812.00|0.05|0.02|R|F|1994-11-25|1994-09-10|1994-11-29|NONE|TRUCK|over the furiou +8903|1764|65|4|50|83288.00|0.10|0.04|R|F|1994-08-15|1994-10-31|1994-09-11|COLLECT COD|REG AIR|es. slyly regular foxes above +8928|875|9|1|11|19534.57|0.02|0.02|R|F|1995-01-24|1994-12-07|1995-01-28|TAKE BACK RETURN|RAIL|heodolites. +8929|1928|17|1|9|16469.28|0.06|0.00|N|O|1998-01-15|1997-11-27|1998-01-17|COLLECT COD|FOB|furiously bold hockey players maintain. re +8929|1294|6|2|38|45421.02|0.05|0.04|N|O|1997-12-27|1997-12-06|1998-01-23|TAKE BACK RETURN|SHIP| quietly. silently ironic ideas along th +8929|1939|72|3|44|81000.92|0.08|0.02|N|O|1997-11-30|1997-12-03|1997-12-16|COLLECT COD|AIR|ar, final dependencies thrash accordin +8930|1278|53|1|29|34198.83|0.09|0.05|R|F|1994-05-21|1994-07-25|1994-06-13|TAKE BACK RETURN|SHIP|ly final theodolites sleep even, unusua +8930|1524|65|2|3|4276.56|0.07|0.05|A|F|1994-08-24|1994-07-19|1994-09-07|TAKE BACK RETURN|RAIL|ronic pinto be +8930|755|88|3|12|19869.00|0.02|0.06|A|F|1994-07-20|1994-08-17|1994-08-12|NONE|SHIP|ic excuses bo +8931|323|24|1|18|22019.76|0.02|0.03|N|O|1996-06-11|1996-07-27|1996-07-02|TAKE BACK RETURN|RAIL|fy, close multipliers. carefully +8931|1829|30|2|45|77886.90|0.03|0.01|N|O|1996-07-21|1996-07-25|1996-07-25|DELIVER IN PERSON|MAIL|the slyly ironic pa +8932|1022|58|1|2|1846.04|0.10|0.08|R|F|1993-06-13|1993-07-08|1993-06-29|DELIVER IN PERSON|FOB|ly regular +8933|774|71|1|4|6699.08|0.04|0.02|R|F|1993-10-10|1993-11-08|1993-10-31|DELIVER IN PERSON|MAIL|es are ironic accounts; final foxes wak +8933|361|62|2|9|11352.24|0.06|0.00|R|F|1994-01-05|1993-12-31|1994-01-06|COLLECT COD|FOB|mise slyly afte +8933|1636|78|3|11|16913.93|0.01|0.02|A|F|1993-10-27|1994-01-02|1993-11-25|COLLECT COD|SHIP|ages are against +8933|437|96|4|3|4012.29|0.09|0.04|A|F|1994-01-25|1994-01-05|1994-02-06|TAKE BACK RETURN|RAIL|unusual theodolites use quick +8934|661|24|1|11|17178.26|0.00|0.06|N|O|1997-01-01|1996-11-21|1997-01-25|COLLECT COD|AIR|s boost. instructions nag depe +8934|1988|21|2|46|86939.08|0.02|0.00|N|O|1996-10-19|1996-11-29|1996-11-01|TAKE BACK RETURN|REG AIR| against the +8934|1680|81|3|27|42705.36|0.08|0.01|N|O|1996-11-30|1996-10-27|1996-12-29|TAKE BACK RETURN|REG AIR|ly regular deposits alongside +8934|1330|69|4|8|9850.64|0.07|0.08|N|O|1996-12-18|1996-10-22|1996-12-27|COLLECT COD|AIR|ggle blithely +8934|817|17|5|40|68712.40|0.10|0.00|N|O|1997-01-14|1996-11-16|1997-01-23|DELIVER IN PERSON|RAIL|s use carefu +8934|1839|26|6|13|22630.79|0.02|0.08|N|O|1996-09-25|1996-10-30|1996-10-03|DELIVER IN PERSON|RAIL| regular instructio +8935|1941|30|1|49|90304.06|0.05|0.01|N|O|1998-06-15|1998-05-15|1998-06-22|COLLECT COD|AIR|express accounts cajol +8935|1106|7|2|4|4028.40|0.03|0.04|N|O|1998-05-22|1998-05-17|1998-06-17|DELIVER IN PERSON|SHIP|ilent, final platelets cajole slyl +8960|491|79|1|1|1391.49|0.07|0.02|A|F|1993-09-01|1993-08-16|1993-09-26|TAKE BACK RETURN|SHIP|among the unusual pinto beans unwind +8960|742|75|2|26|42711.24|0.02|0.04|A|F|1993-09-05|1993-08-06|1993-09-27|TAKE BACK RETURN|RAIL|dependencies. deposits are quickly ab +8960|1126|63|3|9|9244.08|0.09|0.08|A|F|1993-09-02|1993-08-04|1993-09-06|DELIVER IN PERSON|TRUCK|ns wake blithely carefully unu +8960|1095|96|4|35|34863.15|0.06|0.03|R|F|1993-09-03|1993-07-18|1993-09-19|COLLECT COD|MAIL|press excuses sleep slyly-- slyly sp +8960|969|72|5|14|26179.44|0.07|0.02|A|F|1993-07-08|1993-08-22|1993-07-26|DELIVER IN PERSON|FOB|s, regular requests are about +8960|67|18|6|48|46418.88|0.10|0.08|A|F|1993-07-13|1993-08-12|1993-08-03|DELIVER IN PERSON|FOB|nusual pinto +8961|1838|82|1|42|73072.86|0.02|0.04|N|O|1995-09-25|1995-08-10|1995-10-21|TAKE BACK RETURN|RAIL|he quickly regular accounts. furi +8961|111|38|2|41|41455.51|0.02|0.06|N|O|1995-07-02|1995-07-30|1995-07-27|NONE|REG AIR|to beans. final, even plate +8961|60|86|3|39|37442.34|0.04|0.01|N|O|1995-08-15|1995-07-31|1995-08-31|NONE|TRUCK|ing requests. furiously even sheaves haggl +8961|1225|100|4|5|5631.10|0.01|0.05|N|O|1995-08-16|1995-07-31|1995-08-31|COLLECT COD|RAIL| blithely express deposits cajole blit +8961|350|79|5|3|3751.05|0.04|0.05|N|O|1995-09-29|1995-08-23|1995-10-02|NONE|SHIP|onic multipliers. +8962|1957|2|1|38|70640.10|0.07|0.02|N|O|1997-06-21|1997-08-02|1997-06-30|NONE|REG AIR|f the even, slow dependencies. +8962|1110|47|2|1|1011.11|0.06|0.04|N|O|1997-09-07|1997-07-24|1997-09-12|COLLECT COD|TRUCK|ven ideas use furiously above the busy, iro +8963|480|10|1|36|49697.28|0.00|0.00|N|O|1997-03-22|1997-04-22|1997-04-02|NONE|FOB|yers are blithely. accounts integrate e +8963|1739|40|2|2|3281.46|0.02|0.02|N|O|1997-03-27|1997-06-02|1997-04-14|NONE|RAIL|te slyly bold deposits. slyly iro +8963|475|5|3|25|34386.75|0.08|0.01|N|O|1997-04-13|1997-04-26|1997-05-11|NONE|RAIL|c pinto beans after the bl +8963|1177|78|4|5|5390.85|0.00|0.00|N|O|1997-05-07|1997-06-12|1997-05-17|DELIVER IN PERSON|TRUCK|lar, ironic requests ac +8963|1920|53|5|20|36438.40|0.05|0.03|N|O|1997-06-23|1997-05-31|1997-07-06|COLLECT COD|TRUCK|efully. blithely silent instructions wak +8964|1235|73|1|26|29541.98|0.04|0.03|N|O|1998-04-05|1998-03-21|1998-04-18|DELIVER IN PERSON|TRUCK|odolites? permane +8964|1315|54|2|42|51085.02|0.00|0.06|N|O|1998-05-27|1998-03-31|1998-06-16|COLLECT COD|MAIL|er the furiously careful accounts. slyly +8964|537|68|3|1|1437.53|0.07|0.05|N|O|1998-04-04|1998-05-01|1998-04-12|TAKE BACK RETURN|AIR|foxes sleep beside the quickl +8964|1594|95|4|42|62814.78|0.03|0.06|N|O|1998-03-25|1998-04-13|1998-04-14|COLLECT COD|RAIL|hely final accounts. blithely eve +8965|1958|91|1|28|52078.60|0.01|0.05|R|F|1993-10-31|1993-12-08|1993-11-06|COLLECT COD|FOB| fluffily ironic platelets engage slyl +8965|1004|75|2|48|43440.00|0.08|0.07|A|F|1994-01-29|1993-12-24|1994-02-11|NONE|AIR|ress sauternes haggle ca +8966|1035|71|1|12|11232.36|0.05|0.00|N|O|1996-08-26|1996-07-24|1996-09-25|COLLECT COD|AIR|daring requests believe among the qui +8966|216|98|2|32|35718.72|0.05|0.05|N|O|1996-07-12|1996-07-19|1996-07-17|TAKE BACK RETURN|FOB|ways even sa +8966|892|59|3|35|62751.15|0.05|0.04|N|O|1996-09-06|1996-07-23|1996-09-10|NONE|RAIL|deas boost. fluffily expr +8966|1503|4|4|46|64607.00|0.00|0.08|N|O|1996-06-13|1996-07-31|1996-07-01|NONE|REG AIR|osits cajole furiously against the di +8966|393|50|5|9|11640.51|0.05|0.00|N|O|1996-07-24|1996-06-15|1996-08-16|TAKE BACK RETURN|SHIP|uests are care +8967|1404|22|1|50|65270.00|0.01|0.02|N|O|1995-10-31|1995-08-17|1995-11-13|NONE|RAIL| sleep carefully express, +8992|793|90|1|15|25406.85|0.08|0.00|A|F|1993-11-26|1994-01-22|1993-12-22|TAKE BACK RETURN|TRUCK|ans haggle-- +8992|480|68|2|34|46936.32|0.08|0.04|R|F|1993-12-16|1993-12-17|1993-12-26|TAKE BACK RETURN|RAIL|ly even request +8992|659|60|3|5|7798.25|0.04|0.06|A|F|1994-02-20|1994-01-30|1994-03-16|DELIVER IN PERSON|AIR|s wake some +8992|1591|92|4|49|73136.91|0.00|0.08|A|F|1993-12-21|1994-01-19|1994-01-13|TAKE BACK RETURN|FOB|slyly final packages should have to +8992|1124|25|5|8|8200.96|0.10|0.05|A|F|1994-01-19|1994-02-10|1994-01-29|DELIVER IN PERSON|SHIP|ions. special, +8992|540|71|6|13|18727.02|0.07|0.00|A|F|1994-02-01|1994-01-20|1994-02-27|DELIVER IN PERSON|SHIP|ully even ideas haggle; careful +8993|472|31|1|32|43919.04|0.02|0.05|N|F|1995-06-11|1995-08-12|1995-07-09|NONE|MAIL|, ironic reques +8993|428|29|2|17|22583.14|0.00|0.05|N|O|1995-07-29|1995-08-19|1995-08-13|COLLECT COD|RAIL|vely express ideas am +8994|1093|99|1|18|17893.62|0.07|0.06|A|F|1994-05-02|1994-07-06|1994-05-12|DELIVER IN PERSON|FOB|ironic excu +8994|1435|36|2|27|36083.61|0.04|0.06|A|F|1994-06-04|1994-06-18|1994-06-17|COLLECT COD|SHIP|lar pinto beans poach. quickly final p +8994|503|4|3|46|64561.00|0.07|0.02|A|F|1994-08-05|1994-06-21|1994-08-31|DELIVER IN PERSON|REG AIR|equests cajole thinly. blithely regular fox +8994|1891|78|4|45|80680.05|0.05|0.03|R|F|1994-07-16|1994-05-22|1994-08-06|COLLECT COD|AIR|ly. fluffily final requ +8994|1915|4|5|11|19986.01|0.05|0.04|R|F|1994-05-04|1994-07-03|1994-05-14|COLLECT COD|TRUCK|deposits nag across the quickly expr +8995|1062|63|1|13|12519.78|0.08|0.06|N|O|1995-08-21|1995-07-23|1995-09-19|DELIVER IN PERSON|RAIL|ven packages print idly alongside +8995|567|98|2|49|71910.44|0.08|0.02|N|O|1995-09-10|1995-07-16|1995-09-20|TAKE BACK RETURN|REG AIR|o beans haggle quic +8995|1477|56|3|1|1378.47|0.04|0.03|N|O|1995-07-16|1995-07-11|1995-07-28|TAKE BACK RETURN|FOB|ly final deposits. slyly enticing pains +8995|679|73|4|3|4739.01|0.10|0.05|N|O|1995-07-27|1995-06-29|1995-08-05|TAKE BACK RETURN|TRUCK|to the forges. +8995|107|86|5|39|39276.90|0.01|0.06|N|O|1995-06-30|1995-07-28|1995-07-16|COLLECT COD|MAIL| quiet pearls haggl +8995|491|21|6|49|68183.01|0.01|0.07|N|O|1995-06-27|1995-08-15|1995-06-28|DELIVER IN PERSON|AIR| the regularly bold dependencies +8996|182|61|1|9|9739.62|0.02|0.08|A|F|1995-06-10|1995-08-27|1995-06-11|DELIVER IN PERSON|SHIP|unts nag. accounts in +8996|340|69|2|19|23566.46|0.05|0.06|N|O|1995-09-21|1995-07-10|1995-10-01|COLLECT COD|TRUCK|haggle furiously about the even, eve +8996|1786|87|3|35|59072.30|0.00|0.03|N|O|1995-07-22|1995-08-05|1995-07-30|DELIVER IN PERSON|REG AIR|s! special instru +8996|644|38|4|40|61785.60|0.02|0.00|N|O|1995-06-20|1995-07-09|1995-07-16|NONE|SHIP|odolites wake +8997|1245|83|1|18|20632.32|0.01|0.08|A|F|1994-09-24|1994-09-22|1994-10-19|TAKE BACK RETURN|SHIP|ully ironic theodolites wake slyly final id +8997|194|95|2|25|27354.75|0.05|0.03|R|F|1994-08-05|1994-09-29|1994-08-15|TAKE BACK RETURN|AIR| blithely asymptotes. +8997|578|79|3|11|16264.27|0.04|0.00|R|F|1994-09-12|1994-09-10|1994-09-19|NONE|RAIL|nic sheaves are +8997|1497|76|4|1|1398.49|0.07|0.01|A|F|1994-10-13|1994-09-05|1994-10-21|NONE|REG AIR|theodolite +8997|1959|60|5|33|61411.35|0.05|0.04|A|F|1994-09-02|1994-09-25|1994-09-19|NONE|MAIL|requests wake furiously. foxes d +8997|1011|12|6|23|20976.23|0.00|0.01|R|F|1994-08-20|1994-09-23|1994-09-18|DELIVER IN PERSON|TRUCK|quickly regular +8998|1198|35|1|47|51661.93|0.01|0.07|A|F|1993-01-22|1993-02-21|1993-02-09|DELIVER IN PERSON|RAIL|about the sometimes ironic excuse +8998|1669|52|2|37|58114.42|0.02|0.05|A|F|1993-02-21|1993-03-24|1993-03-23|COLLECT COD|AIR|ay fluffily final pinto beans! bli +8998|32|58|3|12|11184.36|0.04|0.02|R|F|1993-03-04|1993-02-08|1993-03-27|NONE|AIR| engage furiously blithely ironic +8998|582|43|4|15|22238.70|0.03|0.01|A|F|1993-01-19|1993-02-27|1993-01-23|DELIVER IN PERSON|RAIL|gular Tiresias kindle +8999|1076|77|1|21|20518.47|0.10|0.06|A|F|1994-08-23|1994-08-12|1994-08-27|TAKE BACK RETURN|FOB|among the slyly +8999|90|66|2|48|47524.32|0.02|0.06|A|F|1994-10-04|1994-08-16|1994-10-24|TAKE BACK RETURN|FOB|nts sleep quickl +8999|386|15|3|26|33445.88|0.09|0.03|R|F|1994-09-03|1994-08-03|1994-10-03|DELIVER IN PERSON|FOB|r instructions. deposits use furiously aga +8999|1501|82|4|9|12622.50|0.00|0.06|A|F|1994-08-24|1994-08-18|1994-08-31|TAKE BACK RETURN|AIR|ost blithely final, regu +9024|1870|71|1|21|37209.27|0.05|0.06|A|F|1992-09-11|1992-08-30|1992-09-17|DELIVER IN PERSON|MAIL|the blithel +9024|1895|39|2|12|21562.68|0.04|0.08|A|F|1992-09-21|1992-07-19|1992-10-08|DELIVER IN PERSON|AIR|ven deposits +9024|959|60|3|19|35339.05|0.10|0.08|A|F|1992-07-12|1992-08-14|1992-07-20|NONE|SHIP|deposits use ironic requests. final re +9024|1195|4|4|46|50424.74|0.10|0.05|A|F|1992-06-27|1992-08-22|1992-07-15|TAKE BACK RETURN|RAIL|fluffy requests sleep +9024|587|88|5|31|46114.98|0.05|0.03|A|F|1992-09-28|1992-08-20|1992-10-19|NONE|TRUCK|xpress forges? final platelets +9024|1747|90|6|37|61003.38|0.03|0.08|A|F|1992-08-25|1992-08-03|1992-09-17|COLLECT COD|TRUCK|posits cajole blithely alon +9024|844|45|7|27|47110.68|0.06|0.07|A|F|1992-09-27|1992-07-16|1992-10-14|COLLECT COD|SHIP|g asymptotes. +9025|1595|96|1|18|26938.62|0.04|0.01|A|F|1994-06-14|1994-06-28|1994-06-19|TAKE BACK RETURN|TRUCK|ffily final excuses wake sl +9025|7|8|2|15|13605.00|0.00|0.08|R|F|1994-08-26|1994-07-06|1994-09-21|TAKE BACK RETURN|RAIL|deposits. slyly unusual d +9025|1273|74|3|49|57539.23|0.08|0.07|A|F|1994-09-15|1994-06-20|1994-10-04|TAKE BACK RETURN|FOB|print across the fluffily silent account +9026|1776|61|1|21|35233.17|0.04|0.03|N|O|1996-10-02|1996-09-06|1996-10-25|NONE|MAIL|ly unusual as +9026|352|81|2|1|1252.35|0.05|0.08|N|O|1996-10-22|1996-10-13|1996-11-07|NONE|AIR| pinto beans. ironi +9026|1024|60|3|28|25900.56|0.03|0.08|N|O|1996-09-14|1996-09-21|1996-10-12|NONE|RAIL|te fluffily regul +9027|71|47|1|39|37871.73|0.00|0.03|N|O|1995-09-26|1995-12-02|1995-10-01|DELIVER IN PERSON|MAIL|sts. furiously r +9027|1757|84|2|44|72985.00|0.02|0.03|N|O|1995-10-01|1995-11-29|1995-10-23|TAKE BACK RETURN|FOB|ve furiously. furiously +9027|905|74|3|24|43341.60|0.05|0.04|N|O|1995-11-26|1995-11-09|1995-12-15|NONE|RAIL|. slyly unus +9028|533|24|1|45|64508.85|0.06|0.04|R|F|1994-04-01|1994-01-28|1994-04-09|COLLECT COD|SHIP|furiously furiously +9029|763|96|1|40|66550.40|0.03|0.05|R|F|1992-12-15|1993-01-13|1993-01-02|NONE|FOB|sly ironic pinto beans sl +9029|1077|78|2|11|10758.77|0.06|0.08|A|F|1993-03-01|1992-12-28|1993-03-15|TAKE BACK RETURN|REG AIR|heodolites. fluffily e +9030|1597|98|1|28|41960.52|0.09|0.08|N|O|1998-09-02|1998-08-16|1998-09-10|DELIVER IN PERSON|TRUCK|ace of the sl +9030|361|62|2|2|2522.72|0.09|0.03|N|O|1998-08-19|1998-09-14|1998-09-18|DELIVER IN PERSON|TRUCK|es wake among the slyly regular ideas +9030|1129|30|3|43|44295.16|0.00|0.05|N|O|1998-08-27|1998-09-02|1998-08-31|COLLECT COD|MAIL|posits. qu +9030|481|40|4|5|6907.40|0.10|0.08|N|O|1998-07-20|1998-09-17|1998-07-28|COLLECT COD|RAIL|ove the pinto bean +9030|1502|3|5|47|65964.50|0.00|0.04|N|O|1998-09-29|1998-09-24|1998-10-13|COLLECT COD|AIR|fily unusual foxes! flu +9030|629|23|6|38|58125.56|0.04|0.07|N|O|1998-09-03|1998-10-04|1998-10-02|TAKE BACK RETURN|MAIL|ct furiousl +9031|1812|13|1|5|8569.05|0.02|0.07|R|F|1994-01-24|1994-02-11|1994-02-10|TAKE BACK RETURN|SHIP|furiously. furio +9031|1466|67|2|48|65638.08|0.06|0.07|R|F|1994-04-05|1994-03-14|1994-04-18|DELIVER IN PERSON|REG AIR|accounts before the even pinto be +9031|1052|88|3|19|18107.95|0.10|0.03|R|F|1994-03-18|1994-02-17|1994-04-10|TAKE BACK RETURN|RAIL|ong the doggedly special deposits. +9031|1044|50|4|21|19845.84|0.09|0.08|R|F|1994-03-07|1994-02-24|1994-03-22|COLLECT COD|FOB|ackages cajole slyly +9031|1879|23|5|33|58768.71|0.01|0.03|A|F|1994-04-15|1994-03-12|1994-05-06|COLLECT COD|MAIL|ic deposits ca +9031|560|51|6|49|71567.44|0.10|0.00|A|F|1994-02-21|1994-03-20|1994-03-08|COLLECT COD|RAIL|lar packages. b +9031|1600|41|7|24|36038.40|0.03|0.00|A|F|1993-12-31|1994-03-11|1994-01-29|DELIVER IN PERSON|SHIP|y final accounts detect. q +9056|1595|36|1|34|50884.06|0.07|0.07|N|O|1996-09-20|1996-10-18|1996-09-30|DELIVER IN PERSON|REG AIR|nal accounts nag furiously +9056|1528|69|2|43|61469.36|0.01|0.05|N|O|1996-10-24|1996-10-06|1996-11-19|TAKE BACK RETURN|AIR|anent theodolites! furiously sil +9056|973|42|3|19|35605.43|0.06|0.05|N|O|1996-09-09|1996-10-19|1996-09-20|NONE|MAIL| doubt abo +9056|1093|94|4|5|4970.45|0.02|0.06|N|O|1996-10-23|1996-09-19|1996-11-08|NONE|REG AIR|uickly express packages haggle bl +9056|1228|3|5|13|14679.86|0.03|0.07|N|O|1996-08-28|1996-09-24|1996-09-12|DELIVER IN PERSON|FOB|nic packages boost furiously unusua +9057|247|48|1|35|40153.40|0.07|0.05|R|F|1994-11-06|1995-01-15|1994-11-18|NONE|SHIP|attainments. slyly final requests cajo +9057|1686|69|2|41|65094.88|0.09|0.03|A|F|1995-01-26|1995-01-24|1995-02-09|DELIVER IN PERSON|REG AIR|fter the slyly dogged excuses. ironic, b +9057|901|4|3|45|81085.50|0.02|0.01|A|F|1994-12-08|1995-01-10|1994-12-27|NONE|TRUCK|y even decoys sleep. slyly +9057|856|56|4|17|29866.45|0.06|0.00|A|F|1995-03-03|1994-12-29|1995-03-29|NONE|SHIP|ndencies use carefully along +9057|147|26|5|17|17801.38|0.05|0.06|R|F|1995-01-22|1995-01-16|1995-02-12|COLLECT COD|FOB|carefully regular frets. furiously even a +9057|1325|26|6|9|11036.88|0.07|0.06|R|F|1994-12-30|1994-12-27|1995-01-07|DELIVER IN PERSON|REG AIR| after the slyly bold accounts a +9057|760|93|7|48|79716.48|0.01|0.05|R|F|1995-02-04|1994-12-31|1995-02-19|DELIVER IN PERSON|FOB| maintain slyly. ca +9058|1589|70|1|41|61113.78|0.07|0.08|A|F|1993-09-11|1993-09-25|1993-09-17|COLLECT COD|SHIP|uffily even instruction +9058|1230|5|2|2|2262.46|0.08|0.00|A|F|1993-09-02|1993-09-26|1993-10-01|TAKE BACK RETURN|AIR|ely. courts are? furiou +9059|1528|69|1|50|71476.00|0.06|0.03|N|O|1996-08-11|1996-09-17|1996-09-02|NONE|FOB|e furiously close ideas. s +9059|313|70|2|20|24266.20|0.02|0.01|N|O|1996-11-22|1996-10-06|1996-11-23|TAKE BACK RETURN|MAIL|usly pending packages. platelets a +9059|898|32|3|29|52167.81|0.10|0.03|N|O|1996-09-06|1996-10-14|1996-09-10|NONE|TRUCK| the even requests. slyly +9059|1540|61|4|24|34596.96|0.05|0.08|N|O|1996-09-23|1996-10-18|1996-10-03|TAKE BACK RETURN|AIR|thy packages. blithely final packages haggl +9059|1783|10|5|6|10108.68|0.00|0.04|N|O|1996-11-25|1996-10-15|1996-12-06|TAKE BACK RETURN|SHIP|ironic requests haggle. furiously pending +9060|1665|7|1|11|17233.26|0.10|0.02|N|O|1996-06-21|1996-07-23|1996-07-02|COLLECT COD|REG AIR|luffily regular packages wake furiously +9060|1311|12|2|12|14547.72|0.06|0.02|N|O|1996-09-02|1996-07-11|1996-09-07|NONE|MAIL| special courts. furiously even packages sl +9060|1610|34|3|10|15116.10|0.04|0.07|N|O|1996-08-21|1996-08-01|1996-09-01|NONE|FOB|es cajole slyly unusual requests. slyly bol +9061|1812|99|1|23|39417.63|0.00|0.08|N|O|1996-03-31|1996-02-27|1996-04-25|NONE|TRUCK|y express requests. furiously si +9061|1104|13|2|24|24122.40|0.04|0.02|N|O|1996-04-08|1996-03-15|1996-05-02|NONE|RAIL|ic theodolites. regular, ir +9062|1597|18|1|34|50952.06|0.09|0.03|R|F|1995-03-28|1995-05-07|1995-04-25|DELIVER IN PERSON|SHIP| regular theod +9062|1254|55|2|13|15018.25|0.06|0.07|N|F|1995-06-08|1995-05-26|1995-06-22|NONE|SHIP|ckages are quickly quickly specia +9062|1486|4|3|9|12487.32|0.04|0.07|N|O|1995-07-06|1995-05-24|1995-07-21|COLLECT COD|FOB|counts haggle someti +9062|550|51|4|46|66725.30|0.04|0.04|A|F|1995-03-22|1995-04-22|1995-04-03|TAKE BACK RETURN|MAIL|heodolites d +9062|1443|61|5|50|67222.00|0.08|0.01|R|F|1995-03-28|1995-05-18|1995-04-23|TAKE BACK RETURN|AIR|ly unusual deposits cajole +9062|641|73|6|5|7708.20|0.00|0.03|R|F|1995-04-02|1995-06-02|1995-04-20|NONE|RAIL|ave to wake bli +9063|1750|77|1|31|51204.25|0.06|0.06|N|O|1997-06-05|1997-04-29|1997-06-27|COLLECT COD|FOB|furiously requests. fina +9088|1749|92|1|49|80886.26|0.09|0.00|A|F|1994-09-14|1994-08-30|1994-10-03|TAKE BACK RETURN|RAIL|ess deposits sleep always. carefu +9088|131|84|2|42|43307.46|0.02|0.02|A|F|1994-10-14|1994-09-06|1994-11-01|COLLECT COD|SHIP|ts integrate carefully according +9088|686|49|3|31|49187.08|0.09|0.08|A|F|1994-10-18|1994-09-10|1994-10-25|TAKE BACK RETURN|FOB|o the theodolites. pending foxes +9088|77|3|4|13|12701.91|0.02|0.08|R|F|1994-09-20|1994-08-17|1994-10-06|NONE|REG AIR|yers. furiously ironic instru +9088|342|27|5|39|48451.26|0.08|0.02|R|F|1994-08-10|1994-08-31|1994-08-17|COLLECT COD|TRUCK|after the final packag +9089|1048|19|1|28|26573.12|0.06|0.02|R|F|1993-06-23|1993-08-05|1993-07-17|COLLECT COD|SHIP|s integrate +9089|761|94|2|8|13294.08|0.05|0.08|A|F|1993-06-14|1993-07-31|1993-07-05|DELIVER IN PERSON|TRUCK| blithely even theodoli +9090|1141|14|1|10|10421.40|0.10|0.05|N|O|1997-03-15|1997-02-14|1997-03-25|NONE|REG AIR|grate final, regul +9091|911|46|1|4|7247.64|0.04|0.06|R|F|1993-12-06|1994-01-08|1993-12-24|TAKE BACK RETURN|FOB|are across the p +9091|1959|92|2|48|89325.60|0.09|0.01|R|F|1993-12-22|1994-01-29|1994-01-14|COLLECT COD|REG AIR|nts. furiously regular accounts +9091|1554|55|3|36|52399.80|0.01|0.03|A|F|1993-12-12|1993-12-24|1994-01-08|DELIVER IN PERSON|TRUCK|ajole slyly +9091|1944|45|4|18|33226.92|0.10|0.02|R|F|1994-02-14|1994-01-26|1994-02-19|COLLECT COD|SHIP|t the quickly even +9091|1794|21|5|25|42394.75|0.01|0.00|A|F|1994-03-01|1993-12-25|1994-03-23|DELIVER IN PERSON|TRUCK|ess ideas boost +9091|1154|27|6|26|27433.90|0.06|0.04|R|F|1993-12-05|1994-02-02|1993-12-10|NONE|TRUCK|c requests above +9092|996|99|1|19|36042.81|0.03|0.07|A|F|1994-08-10|1994-09-15|1994-08-15|COLLECT COD|RAIL| regular packages. +9092|1672|55|2|19|29899.73|0.04|0.01|R|F|1994-11-10|1994-10-14|1994-11-24|NONE|RAIL|fily above the final acco +9092|130|57|3|33|33994.29|0.03|0.05|R|F|1994-10-22|1994-10-08|1994-11-10|DELIVER IN PERSON|MAIL|ly final pinto beans sleep fluffily +9092|709|74|4|14|22535.80|0.03|0.01|A|F|1994-09-29|1994-10-03|1994-10-29|TAKE BACK RETURN|FOB| even packages wake a +9092|1616|40|5|11|16693.71|0.05|0.04|R|F|1994-10-10|1994-09-14|1994-10-30|TAKE BACK RETURN|AIR|g to the quickly ironic asympt +9092|922|91|6|15|27343.80|0.00|0.08|A|F|1994-09-19|1994-09-17|1994-09-30|TAKE BACK RETURN|RAIL|lar accounts wake above the carefully exp +9092|1058|29|7|37|35484.85|0.05|0.00|A|F|1994-08-01|1994-09-25|1994-08-05|COLLECT COD|AIR|quests engage blithely across the bold t +9093|1122|31|1|19|19439.28|0.02|0.02|N|O|1996-03-25|1996-02-11|1996-04-20|TAKE BACK RETURN|SHIP|riously bold theodolites? dep +9094|578|69|1|32|47314.24|0.04|0.03|N|O|1998-07-09|1998-08-19|1998-07-30|TAKE BACK RETURN|MAIL|y even theodolites sleep +9095|273|1|1|43|50450.61|0.01|0.00|N|O|1995-09-05|1995-08-30|1995-09-16|COLLECT COD|MAIL| sleep furiously express de +9120|1568|49|1|5|7347.80|0.00|0.07|A|F|1992-08-03|1992-07-26|1992-08-21|COLLECT COD|MAIL|onic dinos. final packages cajo +9120|1919|20|2|4|7283.64|0.06|0.04|A|F|1992-09-09|1992-08-04|1992-10-02|TAKE BACK RETURN|TRUCK|ld foxes eat above the regular, eve +9120|668|31|3|24|37647.84|0.03|0.04|R|F|1992-08-05|1992-08-18|1992-08-08|COLLECT COD|AIR|according to the quickly bold orbits +9120|1048|54|4|21|19929.84|0.07|0.02|A|F|1992-07-03|1992-08-14|1992-07-16|COLLECT COD|TRUCK|riously thin packa +9120|1021|92|5|15|13830.30|0.02|0.07|A|F|1992-10-04|1992-09-12|1992-10-27|NONE|SHIP| sauternes integrate. unusual, ironic ac +9120|597|58|6|22|32946.98|0.02|0.04|A|F|1992-07-19|1992-08-29|1992-07-27|DELIVER IN PERSON|RAIL|iously regular foxes must have to de +9120|622|85|7|6|9135.72|0.04|0.00|A|F|1992-08-05|1992-09-04|1992-08-14|COLLECT COD|FOB|aringly even instructions +9121|152|5|1|49|51555.35|0.03|0.07|N|O|1996-07-24|1996-08-04|1996-08-01|NONE|AIR|ly above the qu +9121|1406|85|2|30|39222.00|0.02|0.07|N|O|1996-10-31|1996-08-15|1996-11-20|DELIVER IN PERSON|RAIL|ld foxes. blithely ironic wa +9122|1920|53|1|40|72876.80|0.06|0.00|N|O|1997-01-30|1997-02-10|1997-02-09|DELIVER IN PERSON|SHIP|ven requests are furio +9122|491|92|2|42|58442.58|0.03|0.07|N|O|1997-04-01|1997-01-19|1997-04-28|DELIVER IN PERSON|SHIP|its. carefu +9122|950|85|3|16|29615.20|0.06|0.04|N|O|1997-03-06|1997-01-24|1997-03-25|TAKE BACK RETURN|SHIP|uctions integrate busily along +9122|219|20|4|29|32457.09|0.04|0.07|N|O|1997-02-23|1997-02-26|1997-03-07|NONE|SHIP|instructions. regular accou +9122|1776|61|5|28|46977.56|0.09|0.01|N|O|1997-03-22|1997-02-09|1997-04-20|NONE|TRUCK|y silent accounts against the dependenc +9123|1570|91|1|5|7357.85|0.05|0.01|R|F|1993-07-07|1993-08-16|1993-07-29|NONE|AIR|lar, bold accounts use. +9123|1623|65|2|32|48787.84|0.02|0.00|A|F|1993-08-04|1993-09-01|1993-08-27|NONE|FOB|ess deposits cajole a +9123|58|9|3|7|6706.35|0.00|0.06|R|F|1993-07-20|1993-09-05|1993-08-01|DELIVER IN PERSON|AIR|ronic, bold deposits. +9123|527|88|4|2|2855.04|0.10|0.01|A|F|1993-08-10|1993-09-17|1993-08-31|COLLECT COD|AIR|sits. slyly express theodolites sno +9124|1691|33|1|16|25483.04|0.04|0.07|N|O|1995-12-24|1996-01-10|1996-01-07|COLLECT COD|AIR|side of the fluffily even asym +9124|244|99|2|3|3432.72|0.04|0.02|N|O|1995-10-28|1995-12-13|1995-10-31|COLLECT COD|MAIL|to haggle blithely. blithely careful pint +9124|1865|66|3|46|81275.56|0.03|0.08|N|O|1995-12-28|1995-12-08|1996-01-15|TAKE BACK RETURN|MAIL|ully bold packages. +9124|26|52|4|2|1852.04|0.07|0.02|N|O|1995-12-10|1995-12-31|1995-12-12|TAKE BACK RETURN|FOB| blithe packag +9124|1346|23|5|19|23699.46|0.09|0.03|N|O|1995-11-13|1995-11-28|1995-12-05|TAKE BACK RETURN|SHIP|totes. blithely even accoun +9124|1840|27|6|21|36578.64|0.07|0.03|N|O|1995-12-27|1995-12-16|1996-01-03|DELIVER IN PERSON|TRUCK|s thrash. fluffily busy acco +9125|1888|32|1|5|8949.40|0.07|0.05|N|O|1998-07-11|1998-07-31|1998-07-21|TAKE BACK RETURN|MAIL|unts. bold, regular accounts wake. package +9125|470|29|2|8|10963.76|0.06|0.06|N|O|1998-08-01|1998-07-28|1998-08-25|TAKE BACK RETURN|TRUCK|lithely regular packa +9125|1232|70|3|14|15865.22|0.08|0.07|N|O|1998-06-05|1998-08-05|1998-06-11|TAKE BACK RETURN|AIR|s. furiously regular platelets after the fi +9125|1709|94|4|42|67649.40|0.05|0.04|N|O|1998-09-07|1998-08-20|1998-09-11|TAKE BACK RETURN|SHIP|lent theod +9125|901|36|5|11|19820.90|0.03|0.02|N|O|1998-06-06|1998-08-27|1998-06-08|COLLECT COD|REG AIR|efully express ex +9125|881|81|6|25|44547.00|0.09|0.03|N|O|1998-09-11|1998-07-30|1998-09-29|TAKE BACK RETURN|MAIL|nto beans. blithely spe +9125|371|100|7|26|33055.62|0.05|0.02|N|O|1998-07-16|1998-08-10|1998-07-18|DELIVER IN PERSON|SHIP| packages doubt carefully. regular +9126|585|46|1|28|41596.24|0.05|0.03|R|F|1995-01-05|1995-02-03|1995-01-26|TAKE BACK RETURN|SHIP|accounts sleep carefully. carefully final r +9126|736|69|2|40|65469.20|0.02|0.02|A|F|1995-01-03|1995-02-14|1995-01-17|TAKE BACK RETURN|REG AIR|are blithel +9127|1997|98|1|23|43676.77|0.05|0.00|N|O|1995-12-05|1995-11-17|1995-12-19|TAKE BACK RETURN|SHIP| cajole final t +9127|1310|87|2|33|39973.23|0.08|0.02|N|O|1995-11-09|1995-12-08|1995-11-10|COLLECT COD|SHIP|ly alongside of the +9152|1446|86|1|20|26948.80|0.03|0.00|A|F|1993-08-29|1993-10-18|1993-09-03|DELIVER IN PERSON|RAIL|uickly. blithely even de +9152|1010|46|2|8|7288.08|0.00|0.06|R|F|1993-11-14|1993-11-02|1993-12-13|TAKE BACK RETURN|MAIL|nto beans according to the care +9152|378|63|3|32|40907.84|0.02|0.04|R|F|1993-09-03|1993-11-04|1993-09-18|TAKE BACK RETURN|REG AIR|old packages engage blithely. fur +9152|346|3|4|46|57331.64|0.07|0.01|A|F|1993-09-06|1993-10-02|1993-09-28|NONE|REG AIR| alongside of the express accounts a +9153|991|60|1|41|77571.59|0.02|0.04|N|O|1997-09-08|1997-10-05|1997-09-24|DELIVER IN PERSON|RAIL|furiously ironic asymptotes. idly +9153|1485|3|2|29|40207.92|0.00|0.08|N|O|1997-07-27|1997-08-22|1997-08-03|DELIVER IN PERSON|TRUCK| requests: bold dep +9153|822|89|3|5|8614.10|0.07|0.00|N|O|1997-08-10|1997-09-17|1997-09-02|TAKE BACK RETURN|MAIL|t ideas after th +9153|1554|95|4|40|58222.00|0.08|0.00|N|O|1997-10-13|1997-08-21|1997-10-15|NONE|MAIL| blithely re +9153|1275|76|5|18|21172.86|0.08|0.01|N|O|1997-09-13|1997-10-11|1997-09-14|COLLECT COD|FOB|y above the carefully regu +9153|1402|3|6|5|6517.00|0.03|0.03|N|O|1997-08-14|1997-10-14|1997-09-02|COLLECT COD|SHIP|beans haggl +9154|866|100|1|45|79508.70|0.06|0.06|N|O|1997-09-24|1997-08-11|1997-10-14|NONE|FOB|nal, careful instructions wake carefully. b +9154|143|22|2|7|7301.98|0.09|0.05|N|O|1997-09-28|1997-09-21|1997-10-27|TAKE BACK RETURN|SHIP|nts cajole near +9154|534|65|3|46|65988.38|0.04|0.01|N|O|1997-07-18|1997-08-22|1997-07-31|NONE|MAIL|inal depths. blithely quick deposits n +9154|1967|100|4|31|57937.76|0.00|0.00|N|O|1997-08-28|1997-07-29|1997-09-07|NONE|AIR|final warthogs. slyly pending request +9154|1770|13|5|12|20061.24|0.00|0.00|N|O|1997-08-20|1997-07-26|1997-09-17|NONE|RAIL|es. requests print furiously instead of th +9154|1403|43|6|40|52176.00|0.03|0.02|N|O|1997-06-24|1997-09-03|1997-07-24|COLLECT COD|TRUCK|t haggle bli +9154|1735|36|7|47|76926.31|0.04|0.05|N|O|1997-07-07|1997-09-07|1997-07-25|DELIVER IN PERSON|SHIP|wake boldly above the furiousl +9155|1294|32|1|10|11952.90|0.04|0.03|R|F|1992-11-01|1992-10-23|1992-11-23|DELIVER IN PERSON|AIR| carefully. final packages +9155|1311|12|2|44|53341.64|0.02|0.02|A|F|1992-11-09|1992-11-20|1992-11-20|COLLECT COD|TRUCK|, fluffy platelets wake above the +9155|357|86|3|14|17602.90|0.01|0.04|A|F|1992-10-02|1992-10-21|1992-10-23|TAKE BACK RETURN|REG AIR|sits above the furiously even pack +9156|929|98|1|5|9149.60|0.06|0.01|A|F|1994-05-31|1994-03-20|1994-06-03|NONE|REG AIR|endencies. sl +9156|1762|47|2|22|36602.72|0.03|0.00|R|F|1994-02-08|1994-04-01|1994-02-24|DELIVER IN PERSON|AIR|equests dete +9156|137|64|3|15|15556.95|0.05|0.00|A|F|1994-03-29|1994-05-01|1994-04-06|NONE|SHIP|nts. foxes cajole. ironic packages c +9156|1191|28|4|35|38226.65|0.07|0.05|A|F|1994-05-31|1994-03-24|1994-06-20|TAKE BACK RETURN|FOB|e quickly. express, ev +9156|517|18|5|28|39690.28|0.03|0.01|A|F|1994-05-08|1994-04-04|1994-05-25|TAKE BACK RETURN|FOB|he carefully final deposits use slyly ca +9157|147|48|1|3|3141.42|0.10|0.00|A|F|1992-08-27|1992-07-26|1992-09-11|TAKE BACK RETURN|MAIL|lyly bold ideas cajole even packages. bol +9157|1909|54|2|28|50705.20|0.09|0.08|A|F|1992-06-27|1992-08-24|1992-07-12|NONE|RAIL|ests haggle above the carefully s +9158|1843|44|1|32|55834.88|0.06|0.05|N|F|1995-06-13|1995-06-19|1995-07-02|DELIVER IN PERSON|MAIL|g deposits. b +9158|445|4|2|1|1345.44|0.07|0.00|A|F|1995-05-10|1995-06-27|1995-05-24|DELIVER IN PERSON|AIR| fluffily bold deposits. blithely re +9158|422|52|3|33|43639.86|0.10|0.03|N|F|1995-06-02|1995-07-02|1995-06-20|TAKE BACK RETURN|SHIP|ular foxes nag even excuses. slyly regular +9159|13|39|1|34|31042.34|0.03|0.05|N|O|1995-08-22|1995-10-18|1995-09-04|DELIVER IN PERSON|MAIL| wake blithely +9159|1177|50|2|8|8625.36|0.06|0.08|N|O|1995-08-16|1995-09-20|1995-09-09|DELIVER IN PERSON|AIR|accounts wake. regular accou +9159|1209|47|3|49|54399.80|0.07|0.05|N|O|1995-09-06|1995-09-06|1995-09-28|TAKE BACK RETURN|MAIL| after the dependencies. special fray +9159|1426|27|4|5|6637.10|0.09|0.01|N|O|1995-08-04|1995-09-19|1995-08-17|COLLECT COD|REG AIR|iously ironic theodolites; regular, re +9184|1182|55|1|46|49826.28|0.01|0.04|N|O|1997-09-07|1997-09-30|1997-10-03|NONE|SHIP|ntegrate furiously final asy +9184|103|56|2|1|1003.10|0.05|0.02|N|O|1997-11-15|1997-09-08|1997-12-12|COLLECT COD|SHIP|nag carefully. sl +9184|574|75|3|3|4423.71|0.10|0.02|N|O|1997-08-26|1997-10-07|1997-09-08|TAKE BACK RETURN|REG AIR|ic accounts. excuses a +9185|1380|81|1|32|41004.16|0.08|0.08|R|F|1994-07-12|1994-07-24|1994-07-20|DELIVER IN PERSON|AIR|accounts snooze +9185|1840|41|2|14|24385.76|0.06|0.02|R|F|1994-08-19|1994-07-30|1994-09-15|TAKE BACK RETURN|REG AIR|ackages sleep blithely regular deposits +9186|549|10|1|48|69577.92|0.05|0.06|A|F|1992-05-10|1992-05-03|1992-05-19|TAKE BACK RETURN|SHIP|s haggle furiously b +9186|424|54|2|45|59598.90|0.07|0.06|R|F|1992-04-30|1992-05-10|1992-05-13|TAKE BACK RETURN|REG AIR|y regular requests. even dependencies +9186|136|15|3|5|5180.65|0.07|0.03|R|F|1992-07-01|1992-06-27|1992-07-03|TAKE BACK RETURN|REG AIR|yly final deposits use caref +9186|653|54|4|22|34180.30|0.03|0.03|R|F|1992-05-30|1992-06-01|1992-06-18|COLLECT COD|TRUCK|ts. dependencies along the even epitaphs +9187|256|84|1|45|52031.25|0.00|0.06|R|F|1994-11-21|1994-11-06|1994-12-17|TAKE BACK RETURN|FOB|ar excuses boost fur +9187|1618|42|2|49|74460.89|0.05|0.02|R|F|1994-09-21|1994-11-04|1994-10-12|COLLECT COD|AIR|fully final +9187|964|65|3|24|44759.04|0.03|0.01|A|F|1994-10-30|1994-11-11|1994-11-24|TAKE BACK RETURN|MAIL|kly alongside of +9187|236|18|4|36|40904.28|0.00|0.01|R|F|1994-11-12|1994-09-27|1994-11-21|TAKE BACK RETURN|TRUCK|bold ideas cajole fur +9188|253|8|1|38|43823.50|0.05|0.08|N|O|1998-01-28|1998-04-16|1998-02-12|TAKE BACK RETURN|TRUCK|ely final instructions about the +9188|1009|45|2|13|11830.00|0.06|0.00|N|O|1998-05-24|1998-03-02|1998-06-12|NONE|AIR|r deposits haggle carefu +9188|574|35|3|23|33915.11|0.07|0.06|N|O|1998-04-01|1998-03-18|1998-04-21|COLLECT COD|SHIP|y express packages poach f +9188|714|79|4|38|61358.98|0.09|0.03|N|O|1998-03-27|1998-04-16|1998-03-31|NONE|REG AIR|tructions boost car +9188|1655|79|5|50|77832.50|0.09|0.05|N|O|1998-02-23|1998-04-13|1998-03-23|NONE|MAIL|mptotes boost carefully q +9188|854|21|6|2|3509.70|0.07|0.06|N|O|1998-03-10|1998-04-01|1998-04-04|TAKE BACK RETURN|MAIL|ual deposits affix around t +9189|1531|52|1|44|63031.32|0.09|0.00|N|O|1996-12-30|1997-01-12|1997-01-26|TAKE BACK RETURN|SHIP|ecial theodolit +9189|1904|5|2|27|48759.30|0.00|0.07|N|O|1997-03-16|1997-01-25|1997-03-27|DELIVER IN PERSON|SHIP|kages along the furiously pending e +9190|797|94|1|30|50933.70|0.02|0.07|N|O|1998-05-01|1998-05-14|1998-05-12|NONE|RAIL|fily expres +9190|1045|16|2|27|25543.08|0.08|0.02|N|O|1998-04-12|1998-05-25|1998-04-28|DELIVER IN PERSON|MAIL|e across the car +9190|1643|85|3|33|50973.12|0.09|0.04|N|O|1998-05-08|1998-05-20|1998-06-01|COLLECT COD|MAIL|egular foxes impress quickly slyly ir +9190|1224|62|4|44|49509.68|0.01|0.05|N|O|1998-04-29|1998-05-19|1998-05-29|TAKE BACK RETURN|FOB| along the final, ironic ac +9190|406|65|5|40|52256.00|0.01|0.06|N|O|1998-03-11|1998-04-06|1998-04-10|COLLECT COD|RAIL|riously ironic package +9190|1889|76|6|24|42981.12|0.05|0.00|N|O|1998-04-11|1998-04-16|1998-04-19|TAKE BACK RETURN|FOB|t blithely upon the carefu +9191|412|71|1|17|22310.97|0.06|0.01|N|O|1996-06-17|1996-06-15|1996-07-02|DELIVER IN PERSON|MAIL|ng accounts do wake quickly +9216|1329|30|1|43|52903.76|0.00|0.04|N|O|1995-07-27|1995-05-17|1995-08-13|TAKE BACK RETURN|MAIL|oss the quickly bold foxes wa +9216|1686|28|2|22|34928.96|0.06|0.03|N|O|1995-07-13|1995-05-23|1995-08-11|COLLECT COD|REG AIR|y bold accounts use slyly. bold courts abov +9216|1894|24|3|31|55672.59|0.00|0.05|N|O|1995-07-12|1995-06-13|1995-07-19|COLLECT COD|SHIP|re slyly slyly unusual accounts. +9217|1141|78|1|26|27095.64|0.09|0.08|N|O|1997-07-30|1997-08-16|1997-08-20|DELIVER IN PERSON|RAIL|s. ironic accounts cajole +9217|58|59|2|5|4790.25|0.06|0.02|N|O|1997-08-22|1997-08-24|1997-08-30|NONE|RAIL|sly upon the fluffily regul +9217|1534|35|3|34|48808.02|0.04|0.05|N|O|1997-07-06|1997-08-14|1997-07-19|TAKE BACK RETURN|AIR|ackages. b +9217|93|19|4|37|36744.33|0.01|0.01|N|O|1997-06-21|1997-07-14|1997-07-21|DELIVER IN PERSON|TRUCK|ts. furiously even deposits hag +9218|513|4|1|14|19789.14|0.10|0.00|N|O|1997-12-22|1998-02-10|1997-12-26|COLLECT COD|MAIL|deas cajole care +9218|374|31|2|11|14018.07|0.03|0.00|N|O|1998-03-31|1998-02-20|1998-04-02|DELIVER IN PERSON|RAIL|y ironic asymptotes. slyly regular pack +9219|1277|78|1|29|34169.83|0.00|0.06|R|F|1995-01-21|1994-11-10|1995-02-02|COLLECT COD|MAIL|ular excuses above +9219|376|33|2|26|33185.62|0.00|0.01|R|F|1995-01-25|1994-11-23|1995-02-10|DELIVER IN PERSON|AIR|y even acc +9219|1962|63|3|37|68966.52|0.02|0.02|R|F|1994-10-08|1994-12-10|1994-10-12|DELIVER IN PERSON|MAIL|yly final orbits. regular theodo +9219|1244|19|4|19|21759.56|0.01|0.07|A|F|1994-11-13|1994-12-07|1994-12-13|NONE|RAIL|ies. furiously regular de +9219|736|1|5|28|45828.44|0.10|0.06|R|F|1994-12-26|1994-12-18|1995-01-09|COLLECT COD|AIR|arefully final pinto beans cajole furio +9220|1125|62|1|1|1026.12|0.07|0.04|N|O|1998-07-06|1998-07-06|1998-08-03|DELIVER IN PERSON|AIR|s haggle among the furio +9221|1885|29|1|43|76835.84|0.00|0.02|R|F|1995-03-30|1995-03-26|1995-04-15|NONE|REG AIR|carefully. furiously pending courts +9221|1580|1|2|41|60744.78|0.09|0.06|R|F|1995-02-19|1995-02-27|1995-02-25|TAKE BACK RETURN|RAIL|cross the furiously regular sentiments. unu +9221|1496|36|3|49|68477.01|0.08|0.04|R|F|1995-03-20|1995-02-11|1995-04-03|NONE|MAIL|riously alongside of +9221|729|62|4|43|70077.96|0.04|0.06|A|F|1995-04-16|1995-03-22|1995-04-29|TAKE BACK RETURN|MAIL| ironic braids wake furiously unusua +9222|237|38|1|38|43214.74|0.03|0.08|A|F|1994-04-24|1994-03-30|1994-05-03|TAKE BACK RETURN|AIR|nusual requests wake behind th +9222|948|17|2|49|90598.06|0.03|0.01|A|F|1994-03-07|1994-05-02|1994-03-25|NONE|TRUCK| ironic theodolites. +9222|705|6|3|50|80285.00|0.08|0.01|A|F|1994-02-22|1994-03-24|1994-03-23|NONE|FOB|the carefully reg +9222|1946|79|4|1|1847.94|0.05|0.02|A|F|1994-02-23|1994-03-17|1994-03-12|NONE|SHIP|ily regular ideas. fluffily ironic depo +9222|971|6|5|26|48671.22|0.06|0.05|A|F|1994-04-30|1994-03-31|1994-05-11|TAKE BACK RETURN|REG AIR|ar, final de +9223|721|18|1|5|8108.60|0.08|0.08|N|O|1997-10-24|1997-09-22|1997-11-06|NONE|TRUCK|al packages across +9223|1016|87|2|37|33929.37|0.08|0.08|N|O|1997-11-10|1997-10-31|1997-11-28|DELIVER IN PERSON|TRUCK|stealthy ideas. blithely unusual +9223|1176|85|3|43|46318.31|0.02|0.01|N|O|1997-11-02|1997-10-02|1997-11-26|TAKE BACK RETURN|SHIP|, unusual ideas haggle theodolites. sl +9223|1954|87|4|36|66814.20|0.03|0.04|N|O|1997-09-27|1997-10-19|1997-10-16|DELIVER IN PERSON|AIR| haggle about the +9223|210|92|5|3|3330.63|0.03|0.02|N|O|1997-09-28|1997-09-22|1997-10-13|NONE|MAIL|ly dependencies +9223|1071|72|6|16|15553.12|0.02|0.00|N|O|1997-09-27|1997-10-12|1997-10-04|TAKE BACK RETURN|TRUCK|as are quic +9223|736|37|7|26|42554.98|0.03|0.02|N|O|1997-10-08|1997-09-12|1997-10-24|NONE|RAIL|ly ironic packages wake after the s +9248|1655|97|1|22|34246.30|0.07|0.00|R|F|1995-04-24|1995-02-08|1995-05-19|DELIVER IN PERSON|REG AIR|ly even theodolites? furiously pend +9248|366|23|2|8|10130.88|0.02|0.08|R|F|1995-01-08|1995-03-21|1995-01-14|NONE|AIR|telets use along the slyly re +9248|1723|24|3|26|42242.72|0.08|0.08|A|F|1995-04-14|1995-01-29|1995-05-10|COLLECT COD|MAIL|iously. silent, express instructions dete +9248|1248|86|4|24|27581.76|0.07|0.03|A|F|1995-01-27|1995-03-11|1995-02-12|COLLECT COD|RAIL|. furiously f +9249|178|5|1|36|38814.12|0.02|0.04|A|F|1993-06-03|1993-06-28|1993-06-29|DELIVER IN PERSON|FOB|efully final accounts cajole p +9249|259|41|2|36|41733.00|0.09|0.08|R|F|1993-06-30|1993-07-29|1993-07-07|COLLECT COD|FOB|onic dolphins. dependencies us +9249|1515|96|3|15|21247.65|0.02|0.01|R|F|1993-05-29|1993-07-16|1993-06-26|COLLECT COD|SHIP|ly ironic foxes are slyly. ca +9249|310|39|4|28|33888.68|0.00|0.01|A|F|1993-05-23|1993-06-22|1993-05-26|NONE|MAIL|ts wake requests. +9249|1889|33|5|15|26863.20|0.07|0.04|R|F|1993-06-01|1993-06-29|1993-06-25|NONE|FOB|le unusual deposits. blithely regular pla +9250|852|19|1|11|19281.35|0.02|0.08|R|F|1992-08-17|1992-09-14|1992-08-28|TAKE BACK RETURN|TRUCK|ically. slyly expr +9250|1849|93|2|20|35016.80|0.09|0.05|A|F|1992-12-08|1992-09-18|1992-12-26|COLLECT COD|REG AIR|es cajole across +9250|1101|74|3|15|15031.50|0.02|0.08|R|F|1992-09-17|1992-09-30|1992-10-05|NONE|TRUCK|ut the deposits. final, regular packages +9250|1500|18|4|12|16818.00|0.07|0.01|A|F|1992-11-30|1992-10-31|1992-12-08|TAKE BACK RETURN|SHIP|bout the f +9251|103|30|1|29|29089.90|0.03|0.06|R|F|1993-12-19|1993-10-12|1994-01-04|TAKE BACK RETURN|RAIL|sts. final warhorses about the blithely s +9252|914|17|1|24|43557.84|0.08|0.03|N|O|1998-02-18|1998-02-07|1998-03-06|TAKE BACK RETURN|SHIP|side of the care +9252|1475|15|2|9|12388.23|0.08|0.02|N|O|1998-03-17|1998-02-05|1998-04-16|DELIVER IN PERSON|FOB|usly. accounts are sl +9252|1691|74|3|23|36631.87|0.01|0.02|N|O|1998-03-25|1998-02-14|1998-04-17|DELIVER IN PERSON|FOB|furiously +9253|1725|26|1|34|55308.48|0.10|0.07|A|F|1992-03-03|1992-04-25|1992-03-09|COLLECT COD|RAIL|hely across the carefull +9253|1116|17|2|44|44752.84|0.03|0.06|R|F|1992-04-22|1992-04-09|1992-05-09|COLLECT COD|AIR| regular packages sleep slyly; express de +9253|1547|88|3|26|37662.04|0.09|0.06|A|F|1992-02-11|1992-03-28|1992-03-09|COLLECT COD|TRUCK|regular notornis. iro +9253|1290|2|4|30|35738.70|0.03|0.01|R|F|1992-05-10|1992-03-09|1992-06-07|TAKE BACK RETURN|AIR|rate thinly quickly ironic +9253|184|11|5|23|24936.14|0.00|0.02|A|F|1992-02-08|1992-03-27|1992-02-19|TAKE BACK RETURN|RAIL|deposits print +9253|1601|2|6|42|63109.20|0.08|0.03|A|F|1992-02-21|1992-04-14|1992-03-21|TAKE BACK RETURN|REG AIR| patterns play sometimes +9254|1174|75|1|6|6451.02|0.05|0.03|R|F|1993-06-29|1993-07-11|1993-07-13|TAKE BACK RETURN|TRUCK|e carefully acc +9254|476|35|2|16|22023.52|0.05|0.01|A|F|1993-08-20|1993-07-11|1993-09-10|COLLECT COD|MAIL| the silently final instructi +9254|592|83|3|16|23881.44|0.03|0.03|R|F|1993-06-14|1993-07-02|1993-06-25|TAKE BACK RETURN|RAIL|ly above the instructions. +9254|779|12|4|3|5039.31|0.07|0.08|R|F|1993-06-07|1993-07-03|1993-06-16|NONE|REG AIR|y fluffily spec +9255|912|81|1|8|14503.28|0.06|0.03|N|O|1996-02-29|1996-01-26|1996-03-19|DELIVER IN PERSON|FOB|tes. pending, ir +9255|1373|50|2|49|62444.13|0.08|0.06|N|O|1996-03-26|1996-02-06|1996-04-10|DELIVER IN PERSON|MAIL|sts. packages integrate slyly. furiou +9255|1916|61|3|36|65444.76|0.10|0.08|N|O|1995-12-15|1996-03-03|1995-12-27|COLLECT COD|SHIP|onic requests. slyly regul +9255|52|53|4|16|15232.80|0.08|0.04|N|O|1996-02-16|1996-02-28|1996-02-17|TAKE BACK RETURN|TRUCK| ironic accounts wake caref +9280|422|52|1|30|39672.60|0.03|0.05|N|O|1998-08-21|1998-07-31|1998-08-27|COLLECT COD|TRUCK|arefully carefully spe +9280|608|9|2|21|31680.60|0.09|0.08|N|O|1998-09-19|1998-08-24|1998-09-22|NONE|MAIL|o beans. fluffily ironic packa +9280|1374|75|3|7|8927.59|0.05|0.02|N|O|1998-08-17|1998-07-20|1998-09-12|DELIVER IN PERSON|FOB|nic ideas. unusual, regular pinto beans +9280|967|2|4|49|91530.04|0.10|0.01|N|O|1998-09-02|1998-09-10|1998-09-10|NONE|TRUCK|he dinos. regular ac +9280|1824|25|5|36|62129.52|0.10|0.07|N|O|1998-09-07|1998-07-18|1998-09-14|COLLECT COD|REG AIR|ress ideas are theodolit +9280|576|67|6|14|20671.98|0.07|0.04|N|O|1998-09-21|1998-08-16|1998-10-15|DELIVER IN PERSON|AIR|l packages. carefully silent hockey player +9280|113|92|7|31|31406.41|0.03|0.05|N|O|1998-07-11|1998-08-02|1998-07-17|TAKE BACK RETURN|MAIL|ending, busy courts p +9281|1891|92|1|4|7171.56|0.05|0.05|R|F|1992-04-24|1992-05-20|1992-05-16|TAKE BACK RETURN|RAIL|somas. quickly expr +9281|110|63|2|22|22222.42|0.01|0.07|A|F|1992-03-27|1992-04-22|1992-04-23|TAKE BACK RETURN|REG AIR|fix alongside +9281|1092|98|3|26|25820.34|0.00|0.06|A|F|1992-04-08|1992-04-17|1992-04-15|COLLECT COD|MAIL| use above the sl +9281|137|90|4|48|49782.24|0.03|0.05|A|F|1992-06-18|1992-03-30|1992-06-21|TAKE BACK RETURN|FOB|ully unusual accounts detect +9281|1201|76|5|26|28657.20|0.04|0.01|A|F|1992-05-09|1992-05-21|1992-06-01|NONE|TRUCK| slyly along the blithely express accou +9281|68|69|6|27|26137.62|0.04|0.00|R|F|1992-03-11|1992-04-13|1992-03-20|COLLECT COD|TRUCK|deposits nag abov +9281|1352|91|7|10|12533.50|0.09|0.02|R|F|1992-02-28|1992-05-05|1992-03-21|NONE|FOB|c pinto beans. bold instruc +9282|969|38|1|19|35529.24|0.05|0.03|N|O|1996-02-12|1996-01-19|1996-02-23|COLLECT COD|REG AIR|telets. slyly e +9283|1572|53|1|5|7367.85|0.02|0.08|R|F|1994-07-15|1994-07-10|1994-07-29|DELIVER IN PERSON|RAIL|s theodolites cajole. regular ideas wak +9284|1319|34|1|49|59795.19|0.06|0.00|R|F|1994-08-20|1994-09-08|1994-09-07|TAKE BACK RETURN|AIR|ecial packages ag +9285|378|79|1|13|16618.81|0.04|0.02|A|F|1994-02-14|1994-03-19|1994-03-07|COLLECT COD|MAIL|carefully final pinto beans ca +9285|544|45|2|50|72227.00|0.06|0.07|A|F|1994-01-29|1994-02-15|1994-02-17|TAKE BACK RETURN|RAIL| quickly after the final theodolit +9285|517|48|3|21|29767.71|0.01|0.01|R|F|1994-03-01|1994-04-03|1994-03-10|TAKE BACK RETURN|TRUCK|heodolites. blithely regular requ +9286|1280|18|1|10|11812.80|0.01|0.07|R|F|1995-05-27|1995-06-22|1995-06-06|TAKE BACK RETURN|FOB|y against the brave ideas. carefully bold i +9286|383|68|2|8|10267.04|0.07|0.05|N|O|1995-07-11|1995-05-11|1995-07-15|COLLECT COD|FOB|e blithely ironic foxes +9286|1170|43|3|11|11782.87|0.07|0.05|N|O|1995-06-27|1995-06-27|1995-07-17|NONE|AIR|ets. fluffily final accounts +9286|547|48|4|21|30398.34|0.07|0.03|N|F|1995-05-25|1995-05-27|1995-06-20|TAKE BACK RETURN|MAIL|ckages doubt above the +9286|1837|38|5|11|19127.13|0.06|0.08|N|O|1995-07-22|1995-05-24|1995-08-07|COLLECT COD|RAIL|slyly slyly special foxes. fluffily bold a +9286|345|46|6|12|14944.08|0.07|0.05|N|O|1995-06-21|1995-06-22|1995-07-02|TAKE BACK RETURN|REG AIR| deposits. sl +9286|1778|5|7|34|57112.18|0.04|0.07|R|F|1995-04-09|1995-06-01|1995-04-26|DELIVER IN PERSON|TRUCK|express requests wake slyly ruth +9287|9|10|1|16|14544.00|0.07|0.00|N|O|1998-03-25|1998-02-10|1998-04-16|DELIVER IN PERSON|FOB|ironic accounts sl +9312|441|100|1|9|12072.96|0.01|0.04|A|F|1992-07-21|1992-07-28|1992-08-04|NONE|SHIP|t instructions. blithely final do +9312|241|69|2|19|21683.56|0.05|0.01|A|F|1992-07-02|1992-07-09|1992-07-10|DELIVER IN PERSON|TRUCK|es. regular, +9312|994|63|3|49|92854.51|0.02|0.08|R|F|1992-07-06|1992-08-16|1992-07-17|TAKE BACK RETURN|AIR|efully even deco +9312|584|45|4|35|51960.30|0.07|0.03|R|F|1992-05-21|1992-07-24|1992-05-30|NONE|AIR|deposits. never spec +9312|774|71|5|28|46893.56|0.08|0.05|A|F|1992-06-08|1992-07-20|1992-06-16|TAKE BACK RETURN|SHIP|fily final realms are. fluf +9313|120|99|1|37|37744.44|0.09|0.03|N|O|1996-07-26|1996-06-10|1996-08-18|DELIVER IN PERSON|SHIP|ously regular +9313|913|82|2|49|88881.59|0.01|0.08|N|O|1996-06-14|1996-06-26|1996-06-20|TAKE BACK RETURN|REG AIR| ideas doze furiously. bravely ironic pa +9313|646|47|3|16|24746.24|0.10|0.04|N|O|1996-04-29|1996-06-12|1996-05-25|DELIVER IN PERSON|AIR|are bold deposits. special th +9313|115|68|4|22|22332.42|0.05|0.06|N|O|1996-04-25|1996-06-11|1996-04-26|NONE|REG AIR| even instructions +9313|1035|6|5|29|27144.87|0.01|0.07|N|O|1996-06-24|1996-06-16|1996-07-13|COLLECT COD|FOB|cross the furiously regula +9313|1052|58|6|18|17154.90|0.01|0.06|N|O|1996-06-28|1996-06-08|1996-07-14|NONE|RAIL|ep ironic platelets. dogge +9314|1333|48|1|12|14811.96|0.07|0.03|R|F|1995-03-26|1995-04-15|1995-04-10|TAKE BACK RETURN|SHIP|riously final accounts wake furiously ca +9315|461|49|1|11|14976.06|0.01|0.08|N|O|1998-04-21|1998-05-11|1998-05-19|NONE|REG AIR|ly according to the special, regular +9316|1850|51|1|27|47299.95|0.06|0.06|N|O|1995-10-17|1995-12-03|1995-10-27|NONE|SHIP|y express pinto beans ar +9316|268|96|2|32|37384.32|0.05|0.06|N|O|1995-09-26|1995-12-04|1995-09-29|NONE|MAIL|heodolites wake exp +9316|1442|21|3|25|33586.00|0.03|0.01|N|O|1995-12-12|1995-11-18|1995-12-24|DELIVER IN PERSON|TRUCK|to the blithely special deposits. blithely +9316|494|82|4|46|64146.54|0.05|0.05|N|O|1995-11-23|1995-12-12|1995-12-22|TAKE BACK RETURN|RAIL|cording to the furious +9316|292|47|5|36|42922.44|0.06|0.08|N|O|1995-12-09|1995-12-04|1996-01-08|DELIVER IN PERSON|RAIL|ss, special d +9317|30|56|1|8|7440.24|0.10|0.01|A|F|1994-05-08|1994-05-05|1994-05-12|TAKE BACK RETURN|REG AIR|y final deposits nag daringly ab +9317|911|14|2|39|70664.49|0.06|0.00|R|F|1994-04-04|1994-05-11|1994-04-11|NONE|MAIL|cial requests haggle blithely. i +9317|938|39|3|28|51490.04|0.00|0.07|R|F|1994-03-17|1994-06-08|1994-04-02|COLLECT COD|AIR|lar accounts are furi +9317|1996|85|4|15|28469.85|0.00|0.00|A|F|1994-05-24|1994-05-30|1994-05-25|COLLECT COD|FOB|e thin waters. furiously regular dep +9318|1364|3|1|10|12653.60|0.02|0.07|R|F|1992-11-18|1992-09-15|1992-11-20|DELIVER IN PERSON|RAIL|according to the +9318|831|98|2|44|76200.52|0.06|0.05|A|F|1992-08-18|1992-10-23|1992-08-22|NONE|FOB|s. stealthy theodolit +9318|1541|42|3|15|21638.10|0.04|0.00|R|F|1992-07-29|1992-10-26|1992-08-10|NONE|TRUCK|ckly carefully special packages. carefull +9319|1528|69|1|6|8577.12|0.05|0.02|A|F|1992-10-23|1992-12-05|1992-11-10|NONE|FOB| ironic asymptotes wake slyly carefully eve +9319|1440|41|2|31|41584.64|0.01|0.02|A|F|1993-01-03|1992-11-13|1993-02-01|TAKE BACK RETURN|SHIP|the quickl +9319|736|1|3|20|32734.60|0.09|0.05|R|F|1992-10-05|1992-12-03|1992-10-23|DELIVER IN PERSON|REG AIR|nt excuses. expr +9319|464|52|4|17|23195.82|0.06|0.03|A|F|1992-12-24|1992-10-14|1993-01-12|DELIVER IN PERSON|REG AIR|lar platelets haggle furiously? express +9344|1994|83|1|29|54983.71|0.00|0.04|N|O|1996-03-13|1996-02-27|1996-03-22|NONE|REG AIR|ng realms nag. fi +9344|1699|23|2|2|3201.38|0.10|0.03|N|O|1996-02-08|1996-03-03|1996-02-15|TAKE BACK RETURN|MAIL|deposits. ironic packages abo +9344|1213|88|3|40|44568.40|0.04|0.05|N|O|1996-02-25|1996-02-21|1996-03-16|NONE|RAIL|counts sleep slyly. care +9344|1836|37|4|39|67775.37|0.06|0.07|N|O|1995-12-20|1996-02-23|1995-12-21|DELIVER IN PERSON|REG AIR|nusual, pending dolphins wa +9344|979|48|5|44|82718.68|0.04|0.04|N|O|1995-12-18|1996-02-23|1995-12-25|TAKE BACK RETURN|FOB|ermanent requests sleep along the furiou +9344|561|52|6|39|57000.84|0.03|0.03|N|O|1996-03-02|1996-03-06|1996-03-27|TAKE BACK RETURN|MAIL|rts. slyly regular theo +9344|452|40|7|27|36516.15|0.09|0.07|N|O|1996-01-16|1996-01-20|1996-02-11|NONE|RAIL|unusual asymp +9345|1971|60|1|20|37459.40|0.06|0.01|N|O|1996-03-07|1996-03-13|1996-03-20|COLLECT COD|RAIL|ound the express deposits ha +9345|1966|67|2|16|29887.36|0.03|0.06|N|O|1996-03-31|1996-03-30|1996-04-26|NONE|SHIP|ickly blithely even th +9345|985|88|3|17|32061.66|0.02|0.05|N|O|1996-03-06|1996-04-01|1996-03-07|TAKE BACK RETURN|AIR|ely final ideas across the quickly +9345|106|7|4|43|43262.30|0.08|0.06|N|O|1996-04-22|1996-03-21|1996-05-08|NONE|SHIP| carefully id +9345|1497|98|5|16|22375.84|0.01|0.00|N|O|1996-03-31|1996-04-03|1996-04-13|NONE|AIR|es. special, expr +9346|1800|27|1|44|74879.20|0.10|0.04|N|O|1996-12-22|1996-11-08|1997-01-06|NONE|MAIL|lar requests. +9346|1839|69|2|7|12185.81|0.08|0.04|N|O|1996-12-15|1996-11-20|1996-12-20|COLLECT COD|RAIL| theodolites affix slyly about the expr +9346|1425|43|3|24|31834.08|0.03|0.04|N|O|1997-01-01|1997-01-06|1997-01-05|DELIVER IN PERSON|RAIL| deposits must have to cajol +9346|1292|30|4|14|16706.06|0.00|0.07|N|O|1997-01-06|1996-12-06|1997-01-25|COLLECT COD|REG AIR|ld, silent dolphins cajole bli +9346|1475|93|5|33|45423.51|0.08|0.01|N|O|1996-10-12|1996-11-16|1996-11-06|DELIVER IN PERSON|REG AIR| unusual foxes wake furiously regular de +9347|263|91|1|40|46530.40|0.09|0.06|R|F|1992-11-10|1992-11-03|1992-12-09|DELIVER IN PERSON|MAIL|bold instr +9347|1634|35|2|43|66032.09|0.02|0.08|A|F|1992-11-07|1992-10-28|1992-11-15|TAKE BACK RETURN|RAIL| carefully at the furiou +9347|4|30|3|4|3616.00|0.08|0.05|R|F|1992-10-31|1992-09-19|1992-11-17|TAKE BACK RETURN|REG AIR|ly final d +9347|1045|46|4|46|43517.84|0.05|0.08|R|F|1992-08-31|1992-11-03|1992-09-21|NONE|MAIL|fully special ideas caj +9348|668|62|1|8|12549.28|0.09|0.05|N|O|1996-08-09|1996-08-23|1996-09-06|DELIVER IN PERSON|AIR|the special pack +9348|1686|87|2|1|1587.68|0.08|0.03|N|O|1996-06-16|1996-08-28|1996-06-24|COLLECT COD|MAIL|y regular pa +9348|1138|75|3|22|22860.86|0.04|0.03|N|O|1996-07-24|1996-08-11|1996-08-11|NONE|TRUCK|unusual pinto beans haggle slyly slyly +9348|1678|20|4|34|53708.78|0.07|0.04|N|O|1996-09-27|1996-08-24|1996-10-07|COLLECT COD|MAIL|regular packages nag slyly silent +9348|789|86|5|6|10138.68|0.04|0.08|N|O|1996-07-22|1996-07-14|1996-08-12|TAKE BACK RETURN|RAIL|ronic epitaphs about the p +9348|124|25|6|22|22530.64|0.03|0.00|N|O|1996-09-01|1996-09-01|1996-09-06|TAKE BACK RETURN|TRUCK|nd the fin +9349|1868|12|1|13|23008.18|0.09|0.07|N|O|1997-09-02|1997-10-08|1997-09-11|NONE|RAIL|into beans are +9349|379|8|2|12|15352.44|0.01|0.06|N|O|1997-12-23|1997-11-09|1998-01-09|DELIVER IN PERSON|SHIP|sits sleep careful +9349|1415|33|3|3|3949.23|0.06|0.04|N|O|1997-10-28|1997-10-27|1997-11-22|TAKE BACK RETURN|RAIL|uses. regular instructions wake. +9349|948|51|4|35|64712.90|0.06|0.04|N|O|1997-09-25|1997-10-28|1997-10-08|NONE|TRUCK|: carefully pending ideas are +9349|172|25|5|46|49319.82|0.07|0.02|N|O|1997-10-28|1997-09-29|1997-11-03|DELIVER IN PERSON|RAIL|ites affix quickly deposits. fu +9349|1208|83|6|29|32166.80|0.03|0.05|N|O|1997-09-28|1997-10-01|1997-10-25|COLLECT COD|AIR|he slyly regular pinto beans. express cou +9349|729|26|7|20|32594.40|0.04|0.02|N|O|1997-10-18|1997-10-16|1997-10-22|DELIVER IN PERSON|AIR|impress blithely slyly unusual d +9350|98|49|1|31|30940.79|0.03|0.07|R|F|1993-02-24|1993-01-19|1993-02-25|COLLECT COD|FOB|ns integrate slow +9350|1694|95|2|8|12765.52|0.00|0.04|A|F|1992-11-15|1993-01-16|1992-11-27|DELIVER IN PERSON|TRUCK|the even requests. blithely bold depths ha +9350|1648|72|3|39|60435.96|0.06|0.01|A|F|1993-01-03|1993-01-21|1993-01-07|COLLECT COD|SHIP|ully regular foxes. fina +9350|888|88|4|9|16099.92|0.04|0.00|A|F|1992-11-17|1992-12-30|1992-12-05|COLLECT COD|FOB|y regular packages sublate. final, ir +9350|1824|54|5|50|86291.00|0.03|0.02|R|F|1993-01-10|1993-01-19|1993-01-14|TAKE BACK RETURN|MAIL|ely pending deposits. blithely even p +9350|816|17|6|30|51504.30|0.04|0.05|A|F|1992-11-09|1992-12-19|1992-12-04|COLLECT COD|TRUCK|requests mold slyly pe +9351|1534|75|1|12|17226.36|0.08|0.01|N|O|1996-08-08|1996-07-22|1996-08-25|TAKE BACK RETURN|REG AIR|accounts wake since the bol +9351|722|23|2|39|63286.08|0.01|0.04|N|O|1996-07-02|1996-06-28|1996-07-21|DELIVER IN PERSON|TRUCK|ole blithely pinto beans. carefully i +9376|1033|39|1|33|30822.99|0.04|0.01|N|O|1997-11-07|1997-09-11|1997-11-24|NONE|FOB|ffily even instructions +9376|278|79|2|13|15317.51|0.08|0.01|N|O|1997-10-28|1997-09-12|1997-10-29|DELIVER IN PERSON|AIR|ges sleep slyly caref +9376|1232|7|3|18|20398.14|0.00|0.01|N|O|1997-10-15|1997-09-15|1997-11-07|COLLECT COD|AIR|requests hang +9376|1042|13|4|38|35835.52|0.04|0.06|N|O|1997-08-11|1997-08-27|1997-08-24|TAKE BACK RETURN|SHIP|lyly according to +9376|465|53|5|13|17750.98|0.02|0.06|N|O|1997-11-17|1997-09-21|1997-12-02|COLLECT COD|TRUCK| regular instr +9376|1355|70|6|20|25127.00|0.04|0.06|N|O|1997-08-22|1997-08-24|1997-08-25|DELIVER IN PERSON|FOB|ide of the blithely regular fo +9377|293|21|1|8|9546.32|0.10|0.05|A|F|1993-07-17|1993-06-23|1993-08-08|COLLECT COD|MAIL|ole fluffily across the pending instru +9378|583|74|1|14|20770.12|0.05|0.01|N|O|1997-11-24|1997-12-22|1997-12-03|COLLECT COD|AIR|al deposits. special, ironic ideas boos +9378|436|24|2|17|22719.31|0.09|0.05|N|O|1997-12-26|1997-11-16|1998-01-01|TAKE BACK RETURN|TRUCK|carefully bold foxes cajole slyly slyly fin +9378|1926|15|3|43|78600.56|0.10|0.05|N|O|1997-12-27|1997-12-01|1998-01-05|TAKE BACK RETURN|REG AIR|gle fluffily-- ir +9379|1218|19|1|31|34695.51|0.01|0.06|A|F|1992-04-03|1992-02-19|1992-04-25|COLLECT COD|REG AIR| instructions boost quietly around t +9379|386|71|2|22|28300.36|0.09|0.08|A|F|1992-02-12|1992-03-27|1992-02-22|DELIVER IN PERSON|SHIP|re fluffily final sheaves. carefully +9379|1854|84|3|38|66722.30|0.02|0.05|R|F|1992-03-22|1992-03-27|1992-03-27|DELIVER IN PERSON|REG AIR|fully regula +9379|556|57|4|13|18935.15|0.00|0.01|A|F|1992-01-09|1992-03-20|1992-01-12|COLLECT COD|TRUCK|. blithely unusual deposits boost reque +9380|41|17|1|35|32936.40|0.00|0.08|A|F|1994-12-18|1994-10-01|1994-12-28|NONE|REG AIR|eposits after the furiously even foxes +9380|919|88|2|38|69156.58|0.08|0.05|R|F|1994-11-12|1994-10-05|1994-11-24|COLLECT COD|SHIP|lithely final packages alongside +9380|1938|27|3|36|66237.48|0.03|0.02|A|F|1994-11-07|1994-11-15|1994-11-08|TAKE BACK RETURN|AIR|osits are blithely. slyly +9381|1334|35|1|17|21000.61|0.10|0.06|N|O|1996-01-02|1996-01-31|1996-01-29|TAKE BACK RETURN|RAIL|c requests. final, regular deposits +9381|777|10|2|43|72144.11|0.02|0.05|N|O|1996-01-01|1996-02-11|1996-01-28|TAKE BACK RETURN|REG AIR| slyly regular instructions use. +9382|328|85|1|23|28251.36|0.09|0.06|N|O|1996-03-27|1996-04-16|1996-04-04|TAKE BACK RETURN|AIR|yly furiously bold deposits? furio +9382|1626|9|2|45|68742.90|0.07|0.04|N|O|1996-05-31|1996-05-03|1996-06-10|DELIVER IN PERSON|TRUCK|rve across the pending +9382|257|12|3|4|4629.00|0.07|0.00|N|O|1996-03-08|1996-04-27|1996-04-02|TAKE BACK RETURN|REG AIR|instructions. excuses haggle. fu +9382|1761|46|4|30|49882.80|0.02|0.08|N|O|1996-03-27|1996-04-28|1996-04-21|DELIVER IN PERSON|SHIP|boost carefully. theodolites along the ir +9383|1627|28|1|12|18343.44|0.03|0.02|R|F|1994-03-22|1994-05-16|1994-04-17|NONE|TRUCK| accounts impress fin +9383|1754|81|2|27|44705.25|0.01|0.04|R|F|1994-07-09|1994-05-16|1994-07-25|TAKE BACK RETURN|AIR|al courts. express frays sh +9383|835|2|3|1|1735.83|0.04|0.03|A|F|1994-06-10|1994-04-16|1994-06-28|DELIVER IN PERSON|TRUCK|al asympto +9383|864|98|4|31|54710.66|0.09|0.01|A|F|1994-06-05|1994-04-21|1994-06-10|TAKE BACK RETURN|TRUCK|out the fluffily bol +9383|747|44|5|43|70852.82|0.10|0.01|A|F|1994-04-28|1994-06-10|1994-05-10|COLLECT COD|AIR|ly express foxes +9408|1536|17|1|9|12937.77|0.09|0.01|A|F|1992-11-19|1992-11-29|1992-11-25|NONE|MAIL|he fluffily regular packages are +9409|656|57|1|14|21793.10|0.09|0.08|R|F|1992-08-27|1992-07-24|1992-09-09|TAKE BACK RETURN|AIR|furiously notornis. regular ideas s +9409|1847|77|2|6|10493.04|0.03|0.05|A|F|1992-06-21|1992-06-30|1992-07-19|TAKE BACK RETURN|FOB|heodolites. sp +9409|128|81|3|22|22618.64|0.08|0.05|R|F|1992-06-15|1992-06-05|1992-06-30|NONE|FOB|thely express deposits +9409|1404|5|4|47|61353.80|0.04|0.03|A|F|1992-06-27|1992-06-19|1992-07-18|DELIVER IN PERSON|FOB| packages cajole slyly +9409|1354|55|5|31|38915.85|0.00|0.05|R|F|1992-05-09|1992-07-25|1992-05-31|COLLECT COD|SHIP|lithely bold inst +9410|565|96|1|48|70346.88|0.03|0.06|N|O|1997-11-02|1997-09-19|1997-11-03|NONE|AIR|otes sleep. f +9410|55|81|2|6|5730.30|0.02|0.07|N|O|1997-07-21|1997-10-13|1997-08-06|DELIVER IN PERSON|SHIP|ly ironic dependencies serve s +9410|1379|80|3|8|10242.96|0.07|0.04|N|O|1997-10-10|1997-10-04|1997-11-01|COLLECT COD|TRUCK|eposits. deposi +9411|151|30|1|25|26278.75|0.09|0.02|R|F|1995-04-04|1995-03-10|1995-04-17|TAKE BACK RETURN|AIR|c ideas boost quickly ironic acc +9411|446|5|2|23|30968.12|0.05|0.06|A|F|1995-03-15|1995-03-26|1995-03-16|DELIVER IN PERSON|MAIL|ctions haggle blithely a +9412|1350|89|1|11|13764.85|0.09|0.03|N|O|1998-10-31|1998-09-04|1998-11-22|COLLECT COD|SHIP|ackages. pending, unusual deposits integra +9412|755|52|2|47|77820.25|0.08|0.06|N|O|1998-09-24|1998-09-30|1998-10-09|COLLECT COD|TRUCK|hely ironic packages. always final theodol +9412|1401|41|3|50|65120.00|0.00|0.08|N|O|1998-10-08|1998-09-13|1998-10-25|TAKE BACK RETURN|AIR|y bold ideas. bold, bold +9412|1601|25|4|40|60104.00|0.10|0.07|N|O|1998-10-20|1998-09-04|1998-11-01|COLLECT COD|SHIP|s nag quickly. quickly express depende +9412|1342|43|5|24|29840.16|0.09|0.06|N|O|1998-08-11|1998-08-28|1998-08-22|TAKE BACK RETURN|RAIL|ithely final pinto beans. brave, final hoc +9413|967|70|1|33|61642.68|0.04|0.08|N|O|1995-09-19|1995-09-10|1995-10-02|COLLECT COD|AIR|ld packages. requests cajole s +9413|1145|46|2|41|42891.74|0.01|0.03|N|O|1995-07-25|1995-09-06|1995-07-29|TAKE BACK RETURN|TRUCK|bold foxes nag carefully. ironic pin +9413|1191|100|3|24|26212.56|0.08|0.06|N|O|1995-08-19|1995-09-06|1995-09-13|COLLECT COD|RAIL| quickly bold requests. blithely ironic fox +9413|3|79|4|18|16254.00|0.03|0.08|N|O|1995-10-22|1995-08-23|1995-11-10|NONE|TRUCK|ven deposits haggle blithely alo +9414|1665|48|1|3|4699.98|0.09|0.07|A|F|1993-11-23|1993-11-11|1993-11-25|COLLECT COD|SHIP|ng to the closely regu +9414|550|51|2|26|37714.30|0.07|0.03|R|F|1993-12-09|1993-10-15|1993-12-17|TAKE BACK RETURN|FOB|eep furiously from the pending depo +9414|1516|57|3|39|55282.89|0.01|0.05|R|F|1993-11-20|1993-12-04|1993-12-05|COLLECT COD|MAIL|uriously ironi +9415|1886|87|1|36|64363.68|0.04|0.01|A|F|1992-08-26|1992-10-27|1992-08-29|NONE|AIR|al deposit +9415|1932|21|2|32|58685.76|0.06|0.07|R|F|1992-08-25|1992-10-04|1992-09-15|DELIVER IN PERSON|RAIL|long the special, silent re +9415|690|53|3|8|12725.52|0.10|0.05|R|F|1992-10-22|1992-11-01|1992-11-14|COLLECT COD|FOB|le according to t +9415|1003|74|4|25|22600.00|0.10|0.04|R|F|1992-12-11|1992-10-15|1992-12-25|TAKE BACK RETURN|RAIL|rding to the furiously u +9415|1357|34|5|13|16358.55|0.07|0.03|R|F|1992-11-28|1992-11-12|1992-12-22|NONE|AIR|ly about the ironic packages. ironic p +9415|684|78|6|38|60217.84|0.00|0.06|R|F|1992-10-13|1992-10-29|1992-10-17|COLLECT COD|REG AIR| theodolites alongside of +9415|555|86|7|5|7277.75|0.00|0.01|A|F|1992-09-20|1992-11-01|1992-10-20|COLLECT COD|RAIL|leep alongside of +9440|195|22|1|4|4380.76|0.04|0.03|A|F|1994-07-29|1994-07-25|1994-07-30|TAKE BACK RETURN|TRUCK|iously idle +9441|1779|6|1|2|3361.54|0.08|0.04|N|O|1997-08-25|1997-09-16|1997-09-03|TAKE BACK RETURN|TRUCK|, daring instruction +9442|644|7|1|49|75687.36|0.07|0.02|A|F|1993-04-29|1993-05-14|1993-05-03|TAKE BACK RETURN|MAIL|ts snooze carefully ironi +9442|120|73|2|21|21422.52|0.08|0.02|A|F|1993-06-17|1993-06-06|1993-07-13|DELIVER IN PERSON|REG AIR| boost furiously at th +9442|1530|11|3|8|11452.24|0.03|0.01|A|F|1993-03-31|1993-04-11|1993-04-16|DELIVER IN PERSON|RAIL|ckages haggle against the quickly regul +9443|1648|31|1|20|30992.80|0.10|0.00|N|O|1997-08-15|1997-06-25|1997-08-19|NONE|FOB|nts are blithely unu +9443|1554|35|2|11|16011.05|0.06|0.08|N|O|1997-05-18|1997-06-27|1997-06-15|DELIVER IN PERSON|AIR|ites? quickly unusua +9443|1316|55|3|28|34084.68|0.02|0.08|N|O|1997-08-08|1997-06-16|1997-08-31|COLLECT COD|SHIP|ronic foxes. carefully f +9443|552|43|4|50|72627.50|0.04|0.01|N|O|1997-08-14|1997-06-07|1997-09-09|TAKE BACK RETURN|AIR|ct. fluffily pending foxes alongside of +9443|1772|99|5|10|16737.70|0.09|0.07|N|O|1997-07-30|1997-07-14|1997-08-12|COLLECT COD|AIR| bold deposits cajole +9444|857|58|1|10|17578.50|0.09|0.06|N|O|1996-10-08|1996-10-14|1996-10-09|TAKE BACK RETURN|SHIP|ly furiously ironic excuses. slyly even p +9444|1025|31|2|12|11112.24|0.01|0.06|N|O|1996-07-23|1996-08-23|1996-08-14|TAKE BACK RETURN|MAIL|ickly ironic ideas s +9444|1433|34|3|6|8006.58|0.10|0.06|N|O|1996-11-12|1996-10-13|1996-11-25|NONE|MAIL|s sleep slyl +9445|342|99|1|22|27331.48|0.06|0.05|N|O|1998-03-06|1997-12-30|1998-03-12|DELIVER IN PERSON|TRUCK|ackages. regularly ironic deposits cajol +9445|1299|37|2|40|48011.60|0.04|0.08|N|O|1998-01-30|1998-02-02|1998-02-12|NONE|SHIP|inder fluffily. quickly final deposits +9446|1247|59|1|23|26409.52|0.03|0.00|N|O|1998-04-14|1998-02-06|1998-04-27|COLLECT COD|FOB|deas cajole special accounts. blithely eve +9446|3|4|2|36|32508.00|0.05|0.02|N|O|1998-02-03|1998-02-20|1998-02-28|TAKE BACK RETURN|FOB|. silent deposits sleep. express, +9446|1116|53|3|49|49838.39|0.09|0.07|N|O|1998-03-05|1998-02-19|1998-03-21|DELIVER IN PERSON|FOB|tions use. carefully even platelets a +9446|1035|71|4|16|14976.48|0.03|0.01|N|O|1998-04-28|1998-02-25|1998-05-02|NONE|RAIL|nic instructions slee +9446|1359|60|5|44|55455.40|0.01|0.07|N|O|1998-04-06|1998-03-21|1998-05-04|TAKE BACK RETURN|REG AIR|ake busily regular requests. +9446|1957|2|6|21|39037.95|0.09|0.05|N|O|1998-02-07|1998-02-11|1998-02-08|DELIVER IN PERSON|REG AIR|le fluffily blithely ironic id +9447|203|4|1|32|35302.40|0.09|0.08|N|O|1995-07-10|1995-09-01|1995-08-08|DELIVER IN PERSON|FOB|latelets na +9447|1198|35|2|43|47265.17|0.08|0.03|N|O|1995-10-14|1995-07-23|1995-11-04|DELIVER IN PERSON|FOB| express pinto bean +9472|532|93|1|12|17190.36|0.09|0.06|N|O|1995-08-20|1995-08-25|1995-08-23|COLLECT COD|MAIL|ly ironic accounts boost. +9472|1339|40|2|24|29767.92|0.10|0.03|N|O|1995-07-10|1995-09-05|1995-07-23|TAKE BACK RETURN|REG AIR|s haggle across the slyly even instru +9473|1289|64|1|36|42850.08|0.01|0.03|R|F|1993-02-02|1992-12-20|1993-02-22|DELIVER IN PERSON|FOB|eposits detect slyl +9473|1538|19|2|4|5758.12|0.10|0.04|A|F|1992-10-16|1992-12-02|1992-10-29|COLLECT COD|AIR|hely unusual requ +9473|1721|22|3|23|37322.56|0.07|0.00|R|F|1992-11-15|1992-11-11|1992-12-04|DELIVER IN PERSON|FOB|iously. quickly quiet +9473|1591|72|4|33|49255.47|0.05|0.06|A|F|1992-11-29|1992-12-14|1992-12-21|COLLECT COD|SHIP|r the always ironi +9473|630|31|5|14|21428.82|0.04|0.00|A|F|1993-02-06|1992-12-09|1993-02-25|COLLECT COD|FOB|uses. final excuses haggle. fur +9473|1298|36|6|50|59964.50|0.04|0.02|A|F|1992-11-03|1993-01-02|1992-11-27|DELIVER IN PERSON|MAIL|riously along the accou +9474|243|25|1|9|10289.16|0.09|0.00|N|F|1995-06-10|1995-06-21|1995-06-29|TAKE BACK RETURN|REG AIR| was after the fur +9474|1728|29|2|44|71707.68|0.10|0.05|N|O|1995-08-28|1995-06-11|1995-09-10|NONE|TRUCK| the quickly pending platelets cajol +9474|1646|47|3|44|68096.16|0.00|0.06|N|O|1995-08-23|1995-06-13|1995-08-28|NONE|AIR|. slyly express deposits a +9474|1546|27|4|48|69481.92|0.07|0.00|N|O|1995-07-28|1995-07-17|1995-08-11|COLLECT COD|RAIL|en instructi +9474|1712|13|5|21|33887.91|0.08|0.05|N|O|1995-08-02|1995-08-02|1995-08-10|COLLECT COD|RAIL|ckly final deposits. slyly final pac +9475|1115|16|1|3|3048.33|0.00|0.07|N|O|1997-01-12|1997-01-08|1997-01-16|TAKE BACK RETURN|TRUCK|nts are carefully. quickly close +9475|1682|65|2|50|79184.00|0.07|0.03|N|O|1997-01-02|1996-12-27|1997-01-14|DELIVER IN PERSON|REG AIR| final requests +9475|691|54|3|24|38200.56|0.00|0.03|N|O|1997-02-25|1997-02-17|1997-03-02|DELIVER IN PERSON|RAIL|e slyly furiously +9475|1942|31|4|47|86665.18|0.06|0.08|N|O|1997-03-14|1997-02-17|1997-04-04|COLLECT COD|MAIL|al accounts. b +9476|1893|23|1|24|43077.36|0.08|0.07|A|F|1994-06-16|1994-08-22|1994-06-22|COLLECT COD|SHIP|ructions mus +9476|557|48|2|1|1457.55|0.09|0.06|R|F|1994-08-31|1994-08-02|1994-09-05|NONE|TRUCK|counts. even dolph +9476|400|57|3|6|7802.40|0.09|0.07|A|F|1994-07-02|1994-08-08|1994-07-24|COLLECT COD|TRUCK|ly above the regular +9476|1759|86|4|25|41518.75|0.03|0.00|R|F|1994-07-15|1994-08-09|1994-08-08|TAKE BACK RETURN|MAIL|ring requests. sile +9476|1378|93|5|2|2558.74|0.02|0.06|R|F|1994-07-04|1994-07-25|1994-07-07|NONE|MAIL|: ironic accounts sleep across the f +9476|670|71|6|26|40837.42|0.00|0.00|R|F|1994-08-09|1994-08-22|1994-08-14|TAKE BACK RETURN|TRUCK|y. bold pinto +9476|253|81|7|36|41517.00|0.00|0.02|R|F|1994-06-27|1994-07-25|1994-07-26|TAKE BACK RETURN|REG AIR|ts sleep bravely even foxes! fluffil +9477|1051|22|1|3|2856.15|0.06|0.00|N|O|1998-04-07|1998-05-13|1998-04-30|NONE|SHIP|nstructions nag slyly after the flu +9477|1993|82|2|17|32214.83|0.07|0.06|N|O|1998-05-13|1998-05-27|1998-06-08|TAKE BACK RETURN|AIR|eep at the care +9477|1609|51|3|45|67977.00|0.07|0.02|N|O|1998-04-18|1998-05-29|1998-04-30|TAKE BACK RETURN|RAIL|ar pinto bea +9477|722|19|4|44|71399.68|0.08|0.00|N|O|1998-04-28|1998-05-15|1998-05-04|TAKE BACK RETURN|MAIL|ic foxes. slyly special dependencies tr +9477|630|93|5|28|42857.64|0.09|0.03|N|O|1998-04-01|1998-04-19|1998-04-16|COLLECT COD|REG AIR| theodolite +9477|1428|46|6|20|26588.40|0.08|0.02|N|O|1998-04-09|1998-05-10|1998-04-20|TAKE BACK RETURN|FOB|? quickly even instructions are +9477|1189|90|7|34|37066.12|0.00|0.07|N|O|1998-04-10|1998-06-06|1998-05-03|NONE|SHIP|ully final ideas acco +9478|1636|37|1|19|29214.97|0.09|0.05|A|F|1994-07-05|1994-06-21|1994-07-06|DELIVER IN PERSON|REG AIR|ously. carefully final reque +9478|1584|85|2|44|65365.52|0.05|0.00|R|F|1994-05-01|1994-05-21|1994-05-09|COLLECT COD|TRUCK|iously bold packages ar +9478|1558|79|3|15|21893.25|0.05|0.02|R|F|1994-07-12|1994-05-13|1994-07-16|COLLECT COD|TRUCK|y even requests haggle quickly i +9478|986|89|4|35|66044.30|0.10|0.04|R|F|1994-05-10|1994-05-24|1994-06-08|NONE|SHIP|le carefully +9479|865|32|1|42|74166.12|0.02|0.05|A|F|1994-10-23|1994-12-16|1994-11-05|DELIVER IN PERSON|RAIL|sits. slyly even excuses nag quic +9504|1368|7|1|28|35542.08|0.08|0.03|A|F|1992-12-07|1993-01-08|1992-12-25|DELIVER IN PERSON|MAIL|e the furiously pending +9504|112|65|2|44|44532.84|0.05|0.03|R|F|1993-03-08|1993-02-11|1993-03-28|NONE|MAIL|e of the final, unusual accounts. f +9504|698|30|3|48|76737.12|0.08|0.05|A|F|1992-12-14|1993-02-21|1992-12-23|TAKE BACK RETURN|MAIL|s; closely ironic asymptotes accor +9504|946|49|4|11|20316.34|0.09|0.07|R|F|1993-01-24|1993-02-07|1993-02-09|COLLECT COD|MAIL|print blithely fl +9505|1422|23|1|21|27791.82|0.06|0.02|A|F|1992-10-07|1992-08-23|1992-11-05|TAKE BACK RETURN|MAIL|ld instructions. blithely bold ideas use sl +9505|313|42|2|14|16986.34|0.07|0.04|R|F|1992-06-16|1992-08-23|1992-07-14|DELIVER IN PERSON|RAIL|gedly pending pinto beans. ironi +9505|406|65|3|32|41804.80|0.08|0.02|A|F|1992-06-13|1992-08-05|1992-06-19|TAKE BACK RETURN|MAIL|ckages. always final accounts play +9505|1762|5|4|49|81524.24|0.00|0.06|R|F|1992-08-20|1992-07-13|1992-08-25|DELIVER IN PERSON|MAIL|quests. carefully ironic pla +9505|1860|90|5|25|44046.50|0.05|0.04|R|F|1992-09-14|1992-07-12|1992-10-02|COLLECT COD|TRUCK|arefully final accounts are across the +9505|386|71|6|5|6431.90|0.04|0.08|R|F|1992-09-16|1992-07-25|1992-09-28|DELIVER IN PERSON|TRUCK|odolites. carefully express +9505|488|47|7|46|63870.08|0.05|0.07|A|F|1992-07-09|1992-08-28|1992-08-03|DELIVER IN PERSON|MAIL|ep slyly bli +9506|398|27|1|38|49338.82|0.07|0.04|A|F|1994-06-02|1994-04-10|1994-06-27|DELIVER IN PERSON|TRUCK|hlessly around +9507|136|37|1|33|34192.29|0.03|0.03|A|F|1995-01-28|1995-02-02|1995-02-19|DELIVER IN PERSON|FOB|hely carefully express fox +9508|1494|12|1|4|5581.96|0.04|0.02|N|O|1996-08-18|1996-06-19|1996-09-08|NONE|TRUCK|aggle furiously among +9508|1850|94|2|46|80585.10|0.06|0.01|N|O|1996-06-20|1996-06-10|1996-06-28|DELIVER IN PERSON|TRUCK| cajole carefull +9508|595|96|3|41|61319.19|0.04|0.02|N|O|1996-07-01|1996-07-16|1996-07-20|DELIVER IN PERSON|REG AIR|egular ideas solve permanently +9508|659|53|4|24|37431.60|0.01|0.01|N|O|1996-08-10|1996-05-29|1996-08-23|COLLECT COD|REG AIR|bold foxes haggle slyly. ironic, +9508|1093|99|5|42|41751.78|0.02|0.00|N|O|1996-06-10|1996-07-20|1996-07-09|COLLECT COD|RAIL|ages. furi +9508|1051|57|6|17|16184.85|0.09|0.01|N|O|1996-06-25|1996-06-03|1996-07-22|COLLECT COD|TRUCK| deposits nag. carefully silent theodolites +9509|173|74|1|45|48292.65|0.01|0.01|A|F|1993-01-31|1992-12-15|1993-02-08|NONE|TRUCK|nding pinto beans cajole blithely carefull +9509|366|23|2|41|51920.76|0.08|0.07|A|F|1992-12-16|1992-11-15|1992-12-23|DELIVER IN PERSON|MAIL|press packages +9509|1970|71|3|22|41183.34|0.07|0.06|R|F|1993-01-02|1992-11-20|1993-01-24|DELIVER IN PERSON|REG AIR|lar deposits to the sl +9509|1601|84|4|49|73627.40|0.10|0.05|R|F|1993-01-30|1992-12-27|1993-02-05|NONE|REG AIR|d patterns. quickly pending packag +9509|709|74|5|9|14487.30|0.03|0.05|R|F|1992-10-24|1992-11-22|1992-11-06|COLLECT COD|REG AIR| final courts sle +9510|1360|99|1|3|3784.08|0.10|0.08|N|O|1997-02-08|1996-12-23|1997-02-21|DELIVER IN PERSON|FOB|e. quickly regular deposits in +9510|504|65|2|24|33708.00|0.10|0.01|N|O|1997-02-04|1997-02-12|1997-02-05|COLLECT COD|TRUCK|fully about the accounts. even excuses gr +9510|282|64|3|49|57931.72|0.02|0.05|N|O|1996-12-29|1997-01-06|1997-01-19|COLLECT COD|AIR|s against the pending pinto beans so +9511|425|55|1|45|59643.90|0.05|0.01|N|O|1996-10-29|1996-10-17|1996-11-20|DELIVER IN PERSON|REG AIR|ealthily regula +9511|1086|22|2|39|38496.12|0.02|0.03|N|O|1996-11-24|1996-10-04|1996-12-15|DELIVER IN PERSON|TRUCK|ending theodolite +9536|1627|69|1|23|35158.26|0.00|0.03|N|O|1997-09-14|1997-11-09|1997-09-20|TAKE BACK RETURN|TRUCK|ts. requests sleep carefully about the care +9536|1678|2|2|29|45810.43|0.01|0.00|N|O|1997-11-20|1997-10-13|1997-11-22|NONE|REG AIR|final requests. slyly ironic foxes +9536|1699|100|3|16|25611.04|0.06|0.00|N|O|1997-09-18|1997-10-03|1997-10-18|NONE|RAIL|efully pending deposits according +9537|833|67|1|39|67619.37|0.07|0.04|A|F|1995-02-25|1995-04-25|1995-03-10|TAKE BACK RETURN|REG AIR|hely regular pinto beans on th +9537|1824|68|2|45|77661.90|0.08|0.00|R|F|1995-03-18|1995-04-16|1995-03-28|NONE|REG AIR|pitaphs cajole fu +9537|1806|36|3|45|76851.00|0.05|0.02|A|F|1995-03-09|1995-05-11|1995-03-25|DELIVER IN PERSON|REG AIR|uthless packages haggle enticingly. re +9537|1657|81|4|24|37407.60|0.04|0.06|R|F|1995-05-17|1995-05-12|1995-05-29|DELIVER IN PERSON|RAIL|its. slyly furious +9538|1787|30|1|19|32086.82|0.02|0.03|A|F|1994-03-21|1994-05-15|1994-03-31|DELIVER IN PERSON|SHIP|h. quickly special requests wake. slyly reg +9539|1110|11|1|29|29322.19|0.09|0.00|N|O|1996-01-20|1995-12-19|1996-02-04|COLLECT COD|FOB| packages haggle furious +9540|303|88|1|36|43318.80|0.02|0.01|R|F|1994-09-07|1994-07-23|1994-09-15|TAKE BACK RETURN|MAIL| accounts bo +9540|1256|94|2|47|54390.75|0.03|0.01|A|F|1994-06-28|1994-09-03|1994-06-29|DELIVER IN PERSON|AIR|out the regular sauternes. carefully +9541|1074|10|1|43|41928.01|0.10|0.05|R|F|1992-07-14|1992-04-30|1992-08-08|COLLECT COD|FOB|nding depos +9541|1755|56|2|40|66270.00|0.01|0.01|A|F|1992-06-25|1992-05-24|1992-06-27|DELIVER IN PERSON|SHIP| are fluffily final sauternes. express +9542|806|6|1|43|73392.40|0.04|0.06|N|O|1996-02-23|1996-02-12|1996-03-15|NONE|SHIP|eposits sleep slyly. thinly +9542|380|9|2|37|47374.06|0.01|0.00|N|O|1996-04-15|1996-02-05|1996-05-09|COLLECT COD|RAIL|sits sleep finally ideas; final, final +9543|254|82|1|3|3462.75|0.10|0.06|A|F|1992-08-03|1992-08-03|1992-08-21|NONE|AIR|counts cajole careful +9543|1882|26|2|35|62435.80|0.08|0.00|A|F|1992-06-22|1992-07-31|1992-07-06|NONE|FOB|ously pending instructions after the +9543|1436|76|3|37|49484.91|0.01|0.01|R|F|1992-05-25|1992-06-25|1992-06-10|TAKE BACK RETURN|SHIP|st after the slyly final request +9543|1750|77|4|23|37990.25|0.10|0.03|A|F|1992-09-01|1992-06-27|1992-09-17|NONE|SHIP|nto beans. regular, ironic +9568|512|43|1|37|52262.87|0.08|0.07|A|F|1993-05-15|1993-05-23|1993-05-25|NONE|FOB|after the carefully +9568|657|89|2|19|29595.35|0.06|0.05|R|F|1993-04-25|1993-04-19|1993-05-03|TAKE BACK RETURN|FOB|e carefully +9569|404|63|1|44|57393.60|0.08|0.04|N|O|1997-11-30|1998-01-03|1997-12-19|TAKE BACK RETURN|AIR| silent packages doubt blithel +9569|1805|49|2|25|42670.00|0.04|0.05|N|O|1998-01-19|1997-12-22|1998-02-08|NONE|TRUCK|heaves! carefully expr +9569|158|85|3|30|31744.50|0.07|0.00|N|O|1998-02-23|1997-12-08|1998-03-02|COLLECT COD|TRUCK|ckages are +9569|1678|20|4|40|63186.80|0.00|0.02|N|O|1997-11-15|1997-12-15|1997-11-26|NONE|RAIL|ial accounts cajole. furiously even depen +9569|976|79|5|10|18769.70|0.07|0.06|N|O|1998-01-09|1997-12-12|1998-01-13|COLLECT COD|REG AIR|ly unusual pinto beans. bold ideas a +9570|786|87|1|6|10120.68|0.02|0.06|N|O|1996-06-19|1996-07-15|1996-06-27|NONE|AIR|ounts detect +9570|1359|36|2|7|8822.45|0.02|0.05|N|O|1996-06-08|1996-07-16|1996-06-17|DELIVER IN PERSON|TRUCK|the unusual packages. pending +9570|652|53|3|20|31053.00|0.09|0.07|N|O|1996-09-06|1996-08-06|1996-09-17|COLLECT COD|RAIL|ges about the pe +9570|1982|27|4|6|11303.88|0.01|0.04|N|O|1996-07-12|1996-07-10|1996-07-19|DELIVER IN PERSON|REG AIR|c pinto beans caj +9570|24|100|5|19|17556.38|0.06|0.07|N|O|1996-06-18|1996-08-07|1996-06-22|DELIVER IN PERSON|AIR|excuses dazzle carefully accor +9571|1350|27|1|4|5005.40|0.07|0.04|N|O|1996-08-10|1996-06-01|1996-08-25|TAKE BACK RETURN|FOB|posits sleep. quickly +9571|1346|85|2|45|56130.30|0.06|0.01|N|O|1996-06-21|1996-07-14|1996-07-20|TAKE BACK RETURN|SHIP|nal requests b +9572|418|19|1|33|43507.53|0.08|0.02|N|O|1998-06-13|1998-06-02|1998-06-30|COLLECT COD|TRUCK|lent packages sl +9572|1732|59|2|17|27773.41|0.10|0.00|N|O|1998-05-13|1998-05-30|1998-05-27|TAKE BACK RETURN|REG AIR|nic pinto beans haggl +9572|106|59|3|21|21128.10|0.07|0.01|N|O|1998-04-29|1998-04-27|1998-05-23|COLLECT COD|AIR| deposits cajole qui +9573|1243|44|1|5|5721.20|0.01|0.00|R|F|1992-09-23|1992-08-02|1992-10-20|NONE|AIR|l, final packages detect blithely +9573|1412|91|2|45|59103.45|0.04|0.00|R|F|1992-09-05|1992-07-19|1992-09-14|NONE|TRUCK|regular requests caj +9573|679|42|3|50|78983.50|0.08|0.07|A|F|1992-07-12|1992-07-16|1992-07-16|NONE|AIR|g the fluffily quiet asymptotes. unus +9574|1305|6|1|48|57902.40|0.04|0.03|N|O|1995-09-13|1995-09-02|1995-10-12|COLLECT COD|RAIL| final dependen +9574|1665|66|2|24|37599.84|0.04|0.06|N|O|1995-08-01|1995-09-20|1995-08-18|COLLECT COD|FOB|refully express decoys boost furious +9574|479|67|3|38|52419.86|0.04|0.00|N|O|1995-11-16|1995-10-22|1995-11-23|NONE|MAIL| packages affix. +9575|1172|81|1|2|2146.34|0.10|0.06|R|F|1992-07-01|1992-06-05|1992-07-19|TAKE BACK RETURN|REG AIR|nding packages wake quickly. furio +9575|1431|10|2|19|25316.17|0.07|0.08|A|F|1992-04-15|1992-06-09|1992-05-09|DELIVER IN PERSON|RAIL|y express w +9600|1509|10|1|40|56420.00|0.03|0.00|A|F|1994-02-01|1994-01-13|1994-02-24|DELIVER IN PERSON|REG AIR|he express requests. bold pack +9600|16|42|2|3|2748.03|0.01|0.03|R|F|1993-12-19|1993-12-28|1994-01-15|DELIVER IN PERSON|MAIL| realms. even, regular frets sl +9600|864|64|3|24|42356.64|0.08|0.08|R|F|1993-12-11|1993-12-15|1993-12-20|TAKE BACK RETURN|TRUCK|ly blithely final ins +9601|301|2|1|25|30032.50|0.00|0.06|N|O|1996-04-07|1996-04-24|1996-05-04|NONE|SHIP|uffily regular packages engage slyly st +9601|724|25|2|28|45492.16|0.10|0.05|N|O|1996-03-31|1996-04-21|1996-04-30|DELIVER IN PERSON|MAIL|g foxes wake among +9601|1228|29|3|17|19196.74|0.04|0.05|N|O|1996-06-29|1996-05-18|1996-07-12|TAKE BACK RETURN|FOB|nto beans +9601|1374|51|4|14|17855.18|0.02|0.08|N|O|1996-06-10|1996-06-10|1996-06-24|TAKE BACK RETURN|SHIP|ously special a +9601|1604|5|5|21|31617.60|0.10|0.07|N|O|1996-05-04|1996-05-05|1996-06-03|TAKE BACK RETURN|MAIL|-- furiously final accou +9602|35|61|1|24|22440.72|0.04|0.05|A|F|1993-01-21|1992-12-28|1993-02-19|NONE|AIR|ithes are after the sly +9602|1795|38|2|44|74658.76|0.05|0.03|R|F|1993-01-09|1993-01-01|1993-01-25|DELIVER IN PERSON|RAIL|xpress excuses wak +9602|977|46|3|20|37559.40|0.09|0.02|A|F|1993-02-16|1993-01-29|1993-02-26|COLLECT COD|AIR|efully accounts. slyly +9602|187|14|4|28|30441.04|0.04|0.00|R|F|1992-11-15|1993-01-12|1992-11-21|COLLECT COD|SHIP|fluffily special accounts. c +9602|1969|58|5|19|35548.24|0.06|0.02|A|F|1993-01-17|1993-02-07|1993-01-31|COLLECT COD|RAIL|the quickly final accounts. reg +9603|1882|69|1|46|82058.48|0.08|0.02|N|O|1998-04-08|1998-02-13|1998-04-19|DELIVER IN PERSON|FOB|ifts nod. slyly regular accounts nag +9603|1899|86|2|36|64832.04|0.05|0.03|N|O|1998-03-10|1998-03-15|1998-03-22|NONE|RAIL|sts. slyly silent hockey players s +9603|1728|55|3|11|17926.92|0.02|0.04|N|O|1998-04-22|1998-02-12|1998-05-11|NONE|TRUCK|ending depth +9603|909|12|4|26|47057.40|0.05|0.06|N|O|1998-04-25|1998-03-12|1998-04-27|TAKE BACK RETURN|MAIL|ake furiously around th +9603|1393|8|5|45|58247.55|0.01|0.02|N|O|1998-01-14|1998-04-02|1998-01-20|DELIVER IN PERSON|TRUCK|raids sleep carefully. deposits +9603|735|36|6|33|53979.09|0.10|0.05|N|O|1998-04-25|1998-03-20|1998-05-15|NONE|MAIL|nly bold theodolites. unusual +9604|1994|27|1|26|49295.74|0.04|0.03|N|O|1996-07-15|1996-08-13|1996-08-11|DELIVER IN PERSON|FOB|ly unusual requests. carefully express d +9605|1871|1|1|22|39003.14|0.04|0.02|R|F|1993-03-24|1993-02-08|1993-04-01|TAKE BACK RETURN|MAIL| haggle fluffily. blithely final +9605|1778|21|2|48|80628.96|0.08|0.01|R|F|1993-02-10|1993-03-23|1993-02-25|DELIVER IN PERSON|FOB|. theodoli +9606|1444|62|1|45|60544.80|0.00|0.04|A|F|1994-08-24|1994-09-17|1994-09-07|TAKE BACK RETURN|SHIP|heodolites. slyly bold theodolite +9606|1787|30|2|18|30398.04|0.05|0.04|R|F|1994-08-11|1994-10-11|1994-08-13|DELIVER IN PERSON|RAIL| use slyly across the pending, +9606|1136|73|3|7|7259.91|0.00|0.01|A|F|1994-08-07|1994-10-25|1994-08-24|TAKE BACK RETURN|AIR|ly pending packages +9606|1391|68|4|23|29724.97|0.08|0.00|R|F|1994-10-25|1994-09-10|1994-11-21|TAKE BACK RETURN|AIR|ies boost slyly furiously express ide +9606|1625|49|5|14|21372.68|0.04|0.08|R|F|1994-11-05|1994-09-23|1994-11-23|DELIVER IN PERSON|TRUCK|ss the carefully pendin +9607|1523|24|1|33|47009.16|0.08|0.04|N|O|1996-01-07|1996-03-11|1996-01-24|DELIVER IN PERSON|SHIP|packages wake quickly. +9632|1467|68|1|31|42422.26|0.08|0.01|R|F|1992-04-30|1992-04-07|1992-05-22|NONE|AIR|essly. carefully ironi +9632|276|77|2|9|10586.43|0.07|0.04|R|F|1992-02-28|1992-04-12|1992-03-02|TAKE BACK RETURN|TRUCK|he furiously +9632|952|87|3|46|85235.70|0.05|0.07|A|F|1992-02-26|1992-03-17|1992-03-03|DELIVER IN PERSON|SHIP|orges cajole furiously slyly un +9632|306|91|4|8|9650.40|0.01|0.02|A|F|1992-05-05|1992-04-12|1992-06-03|NONE|RAIL| the carefully ex +9633|600|1|1|36|54021.60|0.07|0.06|N|O|1995-12-12|1995-11-15|1996-01-05|COLLECT COD|SHIP|nto beans. slyly speci +9633|548|79|2|43|62287.22|0.09|0.04|N|O|1995-12-26|1995-11-09|1996-01-10|DELIVER IN PERSON|MAIL|s after the slyly final requests are fluffi +9633|1354|69|3|42|52724.70|0.05|0.00|N|O|1995-09-15|1995-11-09|1995-10-15|NONE|FOB| unusual ideas are above the quickl +9633|590|21|4|12|17887.08|0.09|0.04|N|O|1995-11-12|1995-11-13|1995-11-18|COLLECT COD|AIR|t foxes. ironic ideas haggle c +9633|1211|23|5|11|12234.31|0.09|0.06|N|O|1995-12-04|1995-11-20|1995-12-14|COLLECT COD|FOB|believe carefully furiously ev +9634|894|94|1|43|77180.27|0.06|0.04|N|O|1998-02-23|1998-03-01|1998-03-05|COLLECT COD|SHIP|platelets. expre +9634|119|46|2|25|25477.75|0.00|0.07|N|O|1998-04-21|1998-03-30|1998-04-27|NONE|TRUCK|fully regularly regular courts. depos +9634|1038|9|3|19|17841.57|0.07|0.02|N|O|1998-04-17|1998-02-17|1998-05-05|DELIVER IN PERSON|MAIL|se slyly after the sly +9634|712|45|4|47|75797.37|0.09|0.05|N|O|1998-05-03|1998-02-12|1998-05-24|NONE|TRUCK|foxes thrash quickly bold +9634|1836|23|5|27|46921.41|0.10|0.06|N|O|1998-03-26|1998-03-06|1998-04-14|DELIVER IN PERSON|MAIL|usual accounts. even requests nag bli +9634|1694|77|6|48|76593.12|0.01|0.03|N|O|1998-04-03|1998-03-20|1998-04-12|TAKE BACK RETURN|FOB| furiously among the furiously express inst +9635|589|50|1|11|16385.38|0.07|0.08|A|F|1994-05-02|1994-06-08|1994-05-18|DELIVER IN PERSON|SHIP|gular packages nag +9635|504|5|2|30|42135.00|0.05|0.07|R|F|1994-07-14|1994-06-25|1994-07-19|NONE|REG AIR|dolites sleep. busy, unusual requests +9635|1568|49|3|19|27921.64|0.09|0.03|A|F|1994-08-08|1994-06-09|1994-08-26|NONE|FOB|final packages cajole f +9635|1125|34|4|12|12313.44|0.05|0.06|R|F|1994-07-09|1994-06-05|1994-07-31|TAKE BACK RETURN|MAIL|eposits haggl +9635|559|60|5|26|37948.30|0.03|0.02|A|F|1994-07-24|1994-05-29|1994-08-21|NONE|FOB|s detect furiously even accounts. quickly +9635|339|96|6|28|34701.24|0.06|0.01|R|F|1994-08-11|1994-06-14|1994-08-24|DELIVER IN PERSON|SHIP| quickly about the theodolites. un +9636|145|98|1|47|49121.58|0.02|0.02|N|O|1997-02-05|1997-03-31|1997-02-26|TAKE BACK RETURN|AIR| even deposits wake slyly a +9636|738|3|2|36|58994.28|0.08|0.02|N|O|1997-02-10|1997-04-14|1997-03-05|NONE|SHIP|ickly darin +9636|82|8|3|5|4910.40|0.00|0.04|N|O|1997-05-25|1997-03-07|1997-06-16|TAKE BACK RETURN|SHIP|uctions are carefu +9637|636|68|1|45|69148.35|0.10|0.02|R|F|1994-03-24|1994-02-28|1994-03-30|COLLECT COD|SHIP|even foxes doubt slyly. quickly stealthy +9637|1474|92|2|6|8252.82|0.05|0.02|A|F|1994-03-18|1994-04-04|1994-03-28|DELIVER IN PERSON|MAIL|s. instructions nag quickly. carefully +9637|1366|5|3|33|41822.88|0.05|0.01|R|F|1994-02-27|1994-04-02|1994-03-26|NONE|FOB|y ironic deposits was blithely accord +9637|1109|82|4|1|1010.10|0.02|0.02|A|F|1994-03-21|1994-03-19|1994-04-15|TAKE BACK RETURN|FOB|ccounts solve furiously blithely +9638|1679|21|1|48|75872.16|0.06|0.07|N|O|1996-09-26|1996-09-06|1996-10-15|NONE|FOB| around the pe +9638|1346|85|2|4|4989.36|0.06|0.02|N|O|1996-07-03|1996-08-07|1996-07-28|COLLECT COD|FOB|fily special, regular deposits? sly +9638|1975|64|3|6|11261.82|0.03|0.04|N|O|1996-07-24|1996-08-24|1996-08-02|TAKE BACK RETURN|FOB|ding accounts! furiously ironic deposits +9638|948|49|4|10|18489.40|0.00|0.06|N|O|1996-09-04|1996-09-04|1996-09-21|COLLECT COD|SHIP|e special, regular pinto beans int +9639|322|79|1|34|41558.88|0.06|0.05|R|F|1993-10-23|1993-11-24|1993-11-01|TAKE BACK RETURN|RAIL|fter the furiously final +9639|230|12|2|42|47469.66|0.09|0.08|A|F|1993-09-24|1993-11-16|1993-09-27|NONE|MAIL|. carefully fi +9639|1809|53|3|33|56456.40|0.01|0.03|A|F|1993-10-28|1993-11-22|1993-11-01|COLLECT COD|TRUCK|boost boldly across the furious +9639|1796|23|4|2|3395.58|0.10|0.04|A|F|1993-11-22|1993-11-01|1993-12-21|NONE|TRUCK|each along the bold foxes. +9639|945|14|5|44|81221.36|0.02|0.07|A|F|1993-12-28|1993-10-18|1994-01-16|DELIVER IN PERSON|MAIL|uickly ironi +9639|882|82|6|3|5348.64|0.10|0.07|A|F|1993-11-13|1993-10-14|1993-12-13|TAKE BACK RETURN|RAIL|the regular, unusual requests. +9639|1106|43|7|6|6042.60|0.01|0.03|A|F|1993-12-21|1993-11-26|1993-12-30|TAKE BACK RETURN|AIR|ar accounts integrate slyly alongside +9664|358|87|1|50|62917.50|0.09|0.07|A|F|1993-04-18|1993-05-28|1993-04-22|DELIVER IN PERSON|MAIL|packages nag furiously +9664|353|10|2|1|1253.35|0.00|0.04|A|F|1993-06-01|1993-06-06|1993-06-19|TAKE BACK RETURN|AIR|es poach blithely. caref +9664|310|67|3|37|44781.47|0.08|0.03|R|F|1993-05-30|1993-05-27|1993-06-04|COLLECT COD|TRUCK|es sleep about the furiousl +9665|884|84|1|11|19633.68|0.06|0.00|R|F|1994-05-11|1994-06-28|1994-06-04|TAKE BACK RETURN|MAIL|y across the quickly even frays? fluffi +9665|1824|68|2|5|8629.10|0.02|0.04|A|F|1994-06-27|1994-06-12|1994-07-21|NONE|RAIL|ly ironic tithes +9665|1168|77|3|50|53458.00|0.02|0.04|R|F|1994-07-31|1994-07-12|1994-08-11|TAKE BACK RETURN|REG AIR| ironic deposits. final warhorses h +9666|960|61|1|32|59550.72|0.00|0.02|N|O|1996-06-27|1996-07-09|1996-07-01|DELIVER IN PERSON|RAIL|into beans. quickly unusual asymptotes h +9666|431|61|2|49|65240.07|0.07|0.08|N|O|1996-06-03|1996-07-08|1996-06-07|DELIVER IN PERSON|SHIP|fully regular requests +9666|971|6|3|2|3743.94|0.04|0.01|N|O|1996-05-19|1996-06-25|1996-05-20|DELIVER IN PERSON|SHIP|could have to sublate i +9666|1950|39|4|46|85189.70|0.03|0.02|N|O|1996-06-12|1996-08-05|1996-06-13|COLLECT COD|AIR|regular accounts haggle f +9666|1484|63|5|8|11083.84|0.09|0.07|N|O|1996-07-06|1996-07-24|1996-07-30|TAKE BACK RETURN|SHIP|slyly. account +9666|1420|99|6|12|15857.04|0.03|0.02|N|O|1996-06-05|1996-07-02|1996-07-04|DELIVER IN PERSON|MAIL|uickly special accounts use abo +9667|217|45|1|16|17875.36|0.03|0.08|N|O|1996-04-11|1996-05-11|1996-05-11|DELIVER IN PERSON|RAIL|he regular request +9667|344|45|2|43|53506.62|0.04|0.04|N|O|1996-04-29|1996-04-04|1996-05-15|COLLECT COD|SHIP| silent instructions. quickly regular th +9667|612|6|3|38|57479.18|0.03|0.04|N|O|1996-06-19|1996-05-17|1996-07-07|NONE|FOB| regular accounts +9667|432|20|4|8|10659.44|0.07|0.02|N|O|1996-04-01|1996-05-14|1996-04-16|DELIVER IN PERSON|RAIL| after the final requests sle +9667|1924|69|5|25|45648.00|0.09|0.04|N|O|1996-03-28|1996-04-16|1996-04-06|DELIVER IN PERSON|TRUCK|heodolites detect +9667|618|12|6|7|10630.27|0.06|0.06|N|O|1996-03-01|1996-03-27|1996-03-16|DELIVER IN PERSON|REG AIR|gular realms cajole sl +9667|118|45|7|16|16289.76|0.09|0.00|N|O|1996-04-26|1996-04-30|1996-05-20|COLLECT COD|REG AIR|ccounts wake f +9668|1990|35|1|41|77571.59|0.04|0.04|R|F|1994-10-06|1994-10-07|1994-11-02|NONE|AIR|es boost furiously. courts sleep blit +9669|800|33|1|49|83339.20|0.08|0.04|R|F|1994-06-19|1994-07-14|1994-06-25|TAKE BACK RETURN|TRUCK|mpress blithely pending +9670|327|56|1|44|54002.08|0.10|0.07|N|O|1998-02-14|1997-12-15|1998-03-09|DELIVER IN PERSON|AIR|boost against the +9670|19|95|2|34|31246.34|0.01|0.04|N|O|1998-01-20|1997-12-25|1998-02-14|TAKE BACK RETURN|TRUCK|thely sentiments. +9670|580|11|3|27|39975.66|0.06|0.04|N|O|1997-11-27|1998-01-25|1997-12-27|COLLECT COD|FOB|g packages. quickly pending ideas c +9670|1842|72|4|46|80216.64|0.06|0.03|N|O|1998-01-07|1998-02-05|1998-01-23|COLLECT COD|SHIP|bold, pending requests ki +9671|1737|22|1|50|81936.50|0.07|0.07|N|O|1995-10-28|1995-11-15|1995-11-24|COLLECT COD|TRUCK|equests sleep blithely +9671|1938|27|2|18|33118.74|0.10|0.07|N|O|1995-12-10|1995-12-01|1995-12-12|NONE|TRUCK|uffy asymptotes a +9671|1555|76|3|32|46609.60|0.06|0.00|N|O|1995-10-07|1995-11-02|1995-10-14|NONE|TRUCK|o beans. carefully pending requ +9696|1692|16|1|43|68528.67|0.07|0.07|A|F|1995-05-24|1995-03-31|1995-05-31|TAKE BACK RETURN|TRUCK|efully accounts. blith +9696|1768|69|2|28|46753.28|0.03|0.03|A|F|1995-03-28|1995-05-06|1995-04-04|COLLECT COD|REG AIR|ing accounts are. ironic packages nag af +9696|260|61|3|49|56852.74|0.01|0.04|A|F|1995-04-08|1995-04-21|1995-04-20|NONE|AIR|s poach furiously pending, ironic instru +9696|150|29|4|37|38855.55|0.07|0.05|N|F|1995-06-08|1995-04-01|1995-06-20|DELIVER IN PERSON|TRUCK|usual pains! ironic, even acco +9697|1298|36|1|8|9594.32|0.10|0.05|A|F|1995-02-26|1995-04-16|1995-03-25|COLLECT COD|RAIL|ns. even requests nod alon +9697|969|70|2|21|39269.16|0.08|0.03|R|F|1995-04-06|1995-03-10|1995-04-23|NONE|FOB|egular theodolites boost carefully +9697|1376|91|3|6|7664.22|0.09|0.08|R|F|1995-02-05|1995-03-30|1995-02-07|NONE|RAIL|ily regular accounts doze furiously. i +9697|1480|59|4|19|26248.12|0.04|0.04|A|F|1995-02-08|1995-04-05|1995-03-02|NONE|RAIL|le carefully foxes. enti +9697|1137|10|5|34|35296.42|0.05|0.02|A|F|1995-04-16|1995-04-16|1995-05-10|NONE|AIR|requests de +9697|1752|53|6|39|64496.25|0.07|0.01|A|F|1995-03-25|1995-03-31|1995-04-23|DELIVER IN PERSON|RAIL|ix fluffily accounts. qui +9698|704|37|1|5|8023.50|0.08|0.04|N|O|1995-09-15|1995-10-18|1995-10-11|COLLECT COD|AIR|e furiously +9699|230|31|1|10|11302.30|0.10|0.06|A|F|1995-03-29|1995-04-18|1995-04-21|DELIVER IN PERSON|TRUCK|o beans use slyly a +9700|269|51|1|47|54955.22|0.10|0.02|N|O|1995-11-12|1995-10-16|1995-12-03|NONE|REG AIR|are furiously pend +9700|254|82|2|42|48478.50|0.06|0.06|N|O|1995-11-15|1995-10-19|1995-12-10|TAKE BACK RETURN|AIR|ess foxes. slyly unusual deposits wake ca +9700|883|83|3|42|74922.96|0.04|0.04|N|O|1995-11-26|1995-09-20|1995-11-27|NONE|FOB|ts nag. furiousl +9700|1176|77|4|44|47395.48|0.03|0.00|N|O|1995-08-30|1995-09-20|1995-09-28|NONE|FOB|s haggle. special accounts about +9700|1104|5|5|31|31158.10|0.08|0.03|N|O|1995-08-31|1995-10-25|1995-09-12|TAKE BACK RETURN|AIR|lly unusual requests. furiousl +9700|1957|90|6|9|16730.55|0.01|0.06|N|O|1995-10-25|1995-09-30|1995-11-06|DELIVER IN PERSON|REG AIR|ly regular theodolit +9701|1595|16|1|33|49387.47|0.03|0.07|A|F|1993-04-29|1993-05-09|1993-05-07|NONE|RAIL|g, even deposit +9701|1910|99|2|32|57981.12|0.02|0.01|R|F|1993-03-20|1993-05-01|1993-03-26|TAKE BACK RETURN|MAIL| ironic accounts wake c +9701|1073|74|3|17|16559.19|0.06|0.03|R|F|1993-05-28|1993-05-17|1993-06-24|NONE|SHIP|ironic pinto beans nag furiously expres +9701|1251|52|4|36|41481.00|0.10|0.00|R|F|1993-04-20|1993-04-03|1993-05-12|DELIVER IN PERSON|MAIL|l asymptotes use +9701|166|45|5|38|40514.08|0.04|0.08|A|F|1993-05-07|1993-04-23|1993-05-12|DELIVER IN PERSON|SHIP|daring pinto beans cajole quickly accord +9701|712|77|6|43|69346.53|0.03|0.05|A|F|1993-06-26|1993-05-04|1993-07-01|TAKE BACK RETURN|TRUCK|pinto beans. ex +9701|1554|55|7|2|2911.10|0.06|0.00|R|F|1993-06-19|1993-04-02|1993-07-11|TAKE BACK RETURN|RAIL|ld courts. bold, bold +9702|825|92|1|18|31064.76|0.09|0.05|N|O|1996-11-07|1996-10-15|1996-11-15|TAKE BACK RETURN|AIR|ed theodolites. ironic accounts hang bl +9702|122|1|2|14|14309.68|0.05|0.06|N|O|1996-10-10|1996-10-06|1996-10-14|DELIVER IN PERSON|AIR|. final packages ato +9702|373|30|3|5|6366.85|0.08|0.00|N|O|1996-09-02|1996-10-16|1996-09-24|COLLECT COD|RAIL|lithely special accounts shall kind +9702|310|39|4|37|44781.47|0.06|0.06|N|O|1996-10-08|1996-09-27|1996-10-25|DELIVER IN PERSON|FOB|ly unusual deposits haggle carefull +9702|971|6|5|28|52415.16|0.07|0.07|N|O|1996-11-25|1996-11-14|1996-12-03|TAKE BACK RETURN|TRUCK|heodolites sleep furiously special exc +9702|1523|4|6|17|24216.84|0.04|0.06|N|O|1996-09-16|1996-11-04|1996-10-02|DELIVER IN PERSON|SHIP| special platelets. carefully bold account +9702|1363|64|7|9|11379.24|0.09|0.06|N|O|1996-10-29|1996-11-02|1996-11-12|DELIVER IN PERSON|TRUCK| blithely even requests about th +9703|357|42|1|24|30176.40|0.05|0.01|R|F|1994-10-22|1994-12-24|1994-11-01|COLLECT COD|REG AIR|e slyly. regular forge +9728|454|55|1|32|43342.40|0.10|0.01|A|F|1993-07-04|1993-09-25|1993-07-08|COLLECT COD|SHIP|y final instructions cajole furiously regu +9729|444|3|1|39|52433.16|0.04|0.03|N|O|1996-07-30|1996-08-22|1996-08-17|COLLECT COD|MAIL|lar accounts a +9729|1792|19|2|44|74526.76|0.08|0.08|N|O|1996-08-04|1996-08-23|1996-08-26|COLLECT COD|MAIL|regular deposits detec +9729|30|81|3|25|23250.75|0.05|0.05|N|O|1996-10-21|1996-09-12|1996-11-14|DELIVER IN PERSON|RAIL| blithely even deposits nod ironi +9729|1037|8|4|15|14070.45|0.09|0.05|N|O|1996-08-22|1996-08-25|1996-09-15|DELIVER IN PERSON|RAIL|n packages cajole slyly slyly final requ +9730|554|85|1|24|34909.20|0.05|0.05|N|O|1997-04-22|1997-05-31|1997-05-22|NONE|FOB|ess asymptotes boo +9730|615|47|2|37|56077.57|0.06|0.06|N|O|1997-05-01|1997-05-12|1997-05-22|COLLECT COD|MAIL|e furiously even, express foxe +9730|1137|10|3|29|30105.77|0.03|0.05|N|O|1997-03-24|1997-05-24|1997-03-26|COLLECT COD|AIR|f the furiously regula +9730|1269|81|4|50|58513.00|0.10|0.02|N|O|1997-04-06|1997-06-02|1997-04-17|NONE|TRUCK|express dependencies are fluffily +9730|1898|99|5|33|59396.37|0.01|0.08|N|O|1997-06-15|1997-05-04|1997-07-09|COLLECT COD|MAIL|packages are carefully dolphins. reques +9730|1055|26|6|41|39198.05|0.02|0.03|N|O|1997-06-16|1997-05-23|1997-07-04|NONE|FOB|sual theodolites dazzle slyl +9731|1238|50|1|8|9113.84|0.08|0.06|A|F|1993-11-26|1994-01-09|1993-12-05|COLLECT COD|RAIL|always regular deposits. ironic +9731|1940|85|2|7|12893.58|0.06|0.05|A|F|1994-01-03|1993-12-09|1994-01-12|COLLECT COD|REG AIR| theodolites dazzle ironic accounts. furio +9732|1452|92|1|4|5413.80|0.09|0.06|N|O|1995-06-25|1995-05-26|1995-07-12|DELIVER IN PERSON|AIR|s. regular pac +9732|1011|17|2|47|42864.47|0.10|0.08|A|F|1995-04-02|1995-04-20|1995-04-06|DELIVER IN PERSON|REG AIR|ole carefully furiou +9732|1335|74|3|20|24726.60|0.08|0.00|A|F|1995-04-11|1995-05-09|1995-04-12|DELIVER IN PERSON|REG AIR|lly. regularly even excuses cajole furi +9733|1977|66|1|23|43216.31|0.01|0.06|A|F|1994-04-28|1994-05-02|1994-05-19|TAKE BACK RETURN|FOB|theodolites about the +9733|1097|98|2|10|9980.90|0.10|0.01|A|F|1994-06-04|1994-05-31|1994-06-18|COLLECT COD|SHIP|ajole according to the c +9733|1272|10|3|17|19945.59|0.10|0.00|R|F|1994-06-24|1994-06-03|1994-07-02|TAKE BACK RETURN|AIR|refully above the flu +9734|988|57|1|48|90671.04|0.07|0.05|N|O|1997-02-24|1997-05-04|1997-02-27|TAKE BACK RETURN|SHIP|ptotes doubt about the +9734|1874|61|2|21|37293.27|0.06|0.02|N|O|1997-05-22|1997-04-29|1997-06-02|DELIVER IN PERSON|FOB|usly speci +9735|1081|87|1|1|982.08|0.10|0.08|N|O|1997-10-24|1997-08-05|1997-11-19|NONE|AIR|. close, final reque +9735|1604|28|2|13|19572.80|0.03|0.07|N|O|1997-08-15|1997-09-10|1997-09-14|COLLECT COD|FOB|ess pinto beans. regula +9735|906|75|3|10|18069.00|0.09|0.06|N|O|1997-07-09|1997-08-12|1997-07-30|COLLECT COD|MAIL|c instructio +9735|634|66|4|22|33761.86|0.06|0.03|N|O|1997-07-23|1997-08-29|1997-08-17|COLLECT COD|AIR|re thinly bold +9735|898|65|5|26|46771.14|0.08|0.02|N|O|1997-08-23|1997-08-27|1997-09-05|NONE|AIR|egular grouches cajole fluffil +9760|746|43|1|17|27994.58|0.02|0.05|N|O|1998-04-28|1998-06-20|1998-04-30|TAKE BACK RETURN|FOB| permanent attainments kindle carefully +9760|652|84|2|30|46579.50|0.03|0.07|N|O|1998-05-31|1998-05-24|1998-06-21|NONE|SHIP|y fluffily careful packages. fluffily bol +9760|1667|50|3|14|21961.24|0.03|0.05|N|O|1998-05-25|1998-06-04|1998-06-22|TAKE BACK RETURN|REG AIR| instructions haggle. furio +9760|1552|33|4|40|58142.00|0.02|0.04|N|O|1998-07-05|1998-06-29|1998-08-01|COLLECT COD|FOB|bove the blithely pending requests +9761|800|33|1|27|45921.60|0.07|0.04|A|F|1992-02-12|1992-03-22|1992-02-16|NONE|FOB|uctions integrate unusual, +9761|1091|27|2|26|25794.34|0.05|0.08|A|F|1992-04-08|1992-03-09|1992-04-23|COLLECT COD|MAIL|furiously regular packages. furiously +9762|1175|76|1|17|18294.89|0.02|0.06|R|F|1994-04-24|1994-03-13|1994-05-17|TAKE BACK RETURN|AIR|instructions nag a +9762|1179|80|2|30|32405.10|0.10|0.03|R|F|1994-02-02|1994-04-01|1994-02-25|DELIVER IN PERSON|TRUCK|ly special packages. blithely regular depos +9762|1186|95|3|30|32615.40|0.06|0.08|A|F|1994-04-21|1994-03-16|1994-04-22|COLLECT COD|REG AIR|ions are above the blithel +9762|1576|17|4|33|48759.81|0.00|0.02|R|F|1994-04-18|1994-03-20|1994-05-15|DELIVER IN PERSON|RAIL|ackages. quickly ev +9762|1307|84|5|12|14499.60|0.04|0.00|A|F|1994-04-21|1994-02-16|1994-05-17|COLLECT COD|RAIL|xpress requests; c +9762|1933|66|6|50|91746.50|0.06|0.08|A|F|1994-03-26|1994-03-14|1994-04-08|NONE|FOB|ly after the slyly regular foxes: ironic s +9763|1074|75|1|50|48753.50|0.10|0.04|N|O|1995-11-21|1995-10-27|1995-11-28|COLLECT COD|REG AIR| the slyly iron +9763|897|98|2|2|3595.78|0.07|0.00|N|O|1995-10-09|1995-09-22|1995-11-05|DELIVER IN PERSON|RAIL|sts sleep fluffily accounts. slyly unusual +9763|1130|3|3|1|1031.13|0.02|0.02|N|O|1995-11-11|1995-10-18|1995-12-01|NONE|RAIL| final, ironic deposits. hockey play +9763|224|25|4|14|15739.08|0.02|0.07|N|O|1995-09-27|1995-09-28|1995-10-22|COLLECT COD|SHIP|lar pinto beans are blit +9763|761|58|5|12|19941.12|0.09|0.02|N|O|1995-09-17|1995-10-06|1995-10-14|NONE|MAIL|gle blithely alongside +9763|1448|66|6|14|18892.16|0.01|0.04|N|O|1995-09-14|1995-10-22|1995-09-20|COLLECT COD|MAIL|furiously special instructions caj +9763|1936|81|7|15|27568.95|0.06|0.07|N|O|1995-10-23|1995-10-12|1995-10-28|COLLECT COD|REG AIR| furiously bold accounts. furiously speci +9764|1355|56|1|23|28896.05|0.09|0.03|A|F|1993-02-25|1993-03-04|1993-03-15|DELIVER IN PERSON|AIR|regular, ironic requests wake across +9764|190|17|2|5|5450.95|0.00|0.06|R|F|1993-01-01|1993-03-27|1993-01-23|TAKE BACK RETURN|RAIL|cial packages. special requ +9764|1085|56|3|26|25638.08|0.08|0.01|A|F|1993-02-17|1993-02-04|1993-02-28|NONE|RAIL|h-- quickly express foxes bo +9765|1365|66|1|34|43056.24|0.01|0.06|A|F|1992-11-04|1992-12-16|1992-11-19|COLLECT COD|FOB|sits. slyly careful theodolites integrat +9766|1398|37|1|46|59771.94|0.08|0.01|A|F|1992-11-18|1992-10-02|1992-12-04|TAKE BACK RETURN|FOB|beans. pinto beans use. final requests +9766|1387|88|2|3|3865.14|0.04|0.04|R|F|1992-08-28|1992-10-22|1992-09-17|TAKE BACK RETURN|FOB|ending deposits cajole among the quickly +9766|1803|90|3|25|42620.00|0.03|0.06|A|F|1992-11-21|1992-10-14|1992-12-11|COLLECT COD|TRUCK| the excuses. fluffily eve +9766|264|65|4|50|58213.00|0.00|0.07|R|F|1992-12-11|1992-10-12|1992-12-17|COLLECT COD|RAIL|s; even, final requests wake sl +9767|848|15|1|28|48967.52|0.08|0.04|A|F|1994-08-29|1994-08-17|1994-09-07|NONE|AIR| deposits alongside of the +9792|1698|99|1|16|25595.04|0.07|0.03|N|O|1995-10-24|1995-10-03|1995-10-29|TAKE BACK RETURN|AIR| was. slyly even accoun +9792|986|89|2|25|47174.50|0.03|0.06|N|O|1995-09-25|1995-10-12|1995-10-25|COLLECT COD|TRUCK| regular packages ought to detect. furi +9792|1580|61|3|41|60744.78|0.01|0.00|N|O|1995-08-05|1995-10-20|1995-08-25|COLLECT COD|FOB|ly bold acc +9792|1159|32|4|4|4240.60|0.06|0.02|N|O|1995-08-27|1995-08-26|1995-09-02|NONE|AIR|ar dolphins. carefully +9792|303|60|5|29|34895.70|0.06|0.05|N|O|1995-11-05|1995-08-25|1995-11-24|DELIVER IN PERSON|MAIL|uctions haggle furiously f +9793|284|66|1|7|8289.96|0.04|0.06|A|F|1992-06-22|1992-06-10|1992-07-07|TAKE BACK RETURN|MAIL|nst the closely s +9793|1417|57|2|2|2636.82|0.01|0.06|R|F|1992-05-01|1992-05-05|1992-05-03|DELIVER IN PERSON|AIR|ding theodolites abov +9793|848|82|3|4|6995.36|0.09|0.04|R|F|1992-06-22|1992-06-14|1992-07-02|NONE|TRUCK|grate quickly. fluffily regular pack +9793|140|19|4|33|34324.62|0.01|0.05|A|F|1992-04-14|1992-05-06|1992-04-22|COLLECT COD|MAIL|the regular pinto beans. ex +9793|1068|4|5|29|28102.74|0.06|0.03|R|F|1992-07-20|1992-06-25|1992-07-21|COLLECT COD|FOB|l packages. even pinto bean +9794|1049|55|1|32|30401.28|0.09|0.01|R|F|1992-04-28|1992-05-15|1992-05-03|NONE|FOB| slyly along the dependenc +9794|1112|85|2|3|3039.33|0.09|0.08|A|F|1992-07-12|1992-05-17|1992-07-28|NONE|REG AIR|ost according to the busily regular realm +9794|1856|100|3|17|29883.45|0.06|0.06|A|F|1992-05-14|1992-04-24|1992-06-11|NONE|MAIL|egular asymptotes. carefully +9794|2000|1|4|44|39688.00|0.08|0.07|R|F|1992-05-14|1992-05-14|1992-05-31|DELIVER IN PERSON|AIR|the furiou +9794|37|38|5|32|29984.96|0.06|0.08|R|F|1992-04-30|1992-05-13|1992-05-22|NONE|FOB|ending accounts. carefully regula +9794|970|71|6|40|74838.80|0.01|0.05|R|F|1992-05-03|1992-05-27|1992-05-24|TAKE BACK RETURN|AIR|e the fluffily regular pa +9794|104|57|7|8|8032.80|0.00|0.05|A|F|1992-07-01|1992-05-15|1992-07-25|DELIVER IN PERSON|AIR|ular asympto +9795|1153|62|1|13|13703.95|0.08|0.01|N|O|1998-05-26|1998-03-16|1998-06-07|NONE|SHIP|es are slyly. unusual co +9795|412|13|2|26|34122.66|0.06|0.02|N|O|1998-04-22|1998-05-01|1998-05-06|TAKE BACK RETURN|FOB|ironic, silent theodolites wake accordi +9795|1047|18|3|23|21804.92|0.06|0.06|N|O|1998-05-13|1998-04-05|1998-06-09|NONE|RAIL| engage iro +9795|753|54|4|47|77726.25|0.01|0.04|N|O|1998-03-10|1998-05-04|1998-03-21|TAKE BACK RETURN|AIR|ntegrate fluffily blithely +9795|1175|12|5|27|29056.59|0.09|0.02|N|O|1998-02-09|1998-04-22|1998-02-26|DELIVER IN PERSON|RAIL|ing to the ironi +9795|1287|88|6|34|40401.52|0.05|0.07|N|O|1998-02-25|1998-03-07|1998-03-07|TAKE BACK RETURN|SHIP|egrate slyly blithel +9796|1822|52|1|36|62057.52|0.00|0.06|A|F|1993-10-15|1993-10-15|1993-11-01|COLLECT COD|RAIL|ng pinto beans integrate. requests +9796|785|50|2|25|42144.50|0.03|0.05|A|F|1993-10-10|1993-11-13|1993-10-31|TAKE BACK RETURN|AIR|gle slyly ironic pearls. requ +9796|1415|55|3|18|23695.38|0.03|0.06|A|F|1993-09-28|1993-10-30|1993-10-02|TAKE BACK RETURN|SHIP|accounts. final ideas sle +9796|450|38|4|31|41863.95|0.03|0.06|R|F|1993-09-19|1993-12-01|1993-09-29|NONE|RAIL|haggle carefully furiously even asym +9796|1583|4|5|39|57898.62|0.07|0.06|A|F|1993-09-28|1993-10-11|1993-10-23|COLLECT COD|REG AIR|ake. slyly final cou +9796|750|47|6|8|13206.00|0.03|0.07|R|F|1993-11-27|1993-11-01|1993-12-19|DELIVER IN PERSON|FOB|ironic pinto beans. even +9797|414|15|1|4|5257.64|0.10|0.05|R|F|1993-12-20|1993-11-21|1993-12-26|NONE|REG AIR| beans above the carefully bold hoc +9797|1935|80|2|28|51434.04|0.10|0.01|R|F|1993-10-03|1993-11-03|1993-10-04|NONE|FOB|en instructions. quickly regular theodoli +9797|1753|54|3|22|36404.50|0.00|0.04|A|F|1993-10-01|1993-11-07|1993-10-14|NONE|SHIP| final deposits at the even +9797|1425|4|4|33|43771.86|0.02|0.01|A|F|1993-12-16|1993-11-03|1994-01-06|NONE|FOB|ackages boost fluffily. spec +9797|870|37|5|31|54896.97|0.09|0.02|R|F|1993-10-24|1993-12-12|1993-11-21|DELIVER IN PERSON|AIR| permanently final theodolites +9797|1703|30|6|2|3209.40|0.00|0.06|A|F|1993-12-25|1993-11-04|1993-12-30|DELIVER IN PERSON|REG AIR|counts after the +9797|27|28|7|24|22248.48|0.04|0.03|R|F|1993-12-08|1993-12-01|1994-01-02|COLLECT COD|MAIL|usly thin packages among the theod +9798|61|87|1|2|1922.12|0.05|0.03|N|O|1996-06-11|1996-05-07|1996-07-08|NONE|MAIL|ending asymptot +9798|1186|95|2|20|21743.60|0.03|0.03|N|O|1996-05-20|1996-05-27|1996-05-29|DELIVER IN PERSON|FOB|fully regular braids. +9799|357|14|1|4|5029.40|0.06|0.03|N|O|1996-04-25|1996-06-29|1996-05-24|COLLECT COD|SHIP|eposits nag after the reg +9799|1630|31|2|12|18379.56|0.02|0.05|N|O|1996-05-28|1996-05-26|1996-06-05|DELIVER IN PERSON|RAIL|fluffily final accounts. final ideas sleep. +9799|890|90|3|16|28654.24|0.04|0.05|N|O|1996-04-12|1996-06-15|1996-05-06|TAKE BACK RETURN|TRUCK|ffily regular d +9799|1982|15|4|9|16955.82|0.06|0.07|N|O|1996-08-06|1996-06-19|1996-08-19|DELIVER IN PERSON|MAIL|s. final, ironic instructions affix +9799|1254|92|5|49|56607.25|0.08|0.04|N|O|1996-07-18|1996-06-11|1996-08-15|COLLECT COD|REG AIR|ly special deposits. regular foxe +9799|1298|10|6|23|27583.67|0.02|0.05|N|O|1996-07-10|1996-05-25|1996-08-08|TAKE BACK RETURN|REG AIR|deposits nag alongside of the even instru +9824|414|2|1|8|10515.28|0.05|0.07|N|F|1995-05-24|1995-04-21|1995-06-21|TAKE BACK RETURN|FOB| are. packages haggl +9824|732|65|2|1|1632.73|0.02|0.07|A|F|1995-01-26|1995-04-16|1995-02-11|COLLECT COD|TRUCK|dencies. final, +9824|1913|14|3|38|68966.58|0.03|0.05|A|F|1995-03-11|1995-03-27|1995-03-15|COLLECT COD|REG AIR|gular, ironic package +9824|1947|92|4|11|20338.34|0.07|0.01|R|F|1995-05-08|1995-04-17|1995-05-14|NONE|REG AIR| furious t +9824|304|5|5|11|13247.30|0.09|0.00|A|F|1995-04-15|1995-04-14|1995-05-04|TAKE BACK RETURN|FOB|s use doggedly. pending, regular pac +9824|711|12|6|49|78973.79|0.04|0.01|R|F|1995-03-10|1995-04-07|1995-03-11|NONE|MAIL|ly ironic packages. +9824|980|15|7|25|47024.50|0.00|0.07|A|F|1995-02-17|1995-03-12|1995-02-22|COLLECT COD|RAIL|inst the blithely final excuses. final +9825|1051|87|1|22|20945.10|0.04|0.06|N|O|1996-04-21|1996-07-01|1996-05-19|NONE|MAIL|hely final sentimen +9825|1801|2|2|16|27244.80|0.07|0.07|N|O|1996-06-15|1996-07-08|1996-07-11|DELIVER IN PERSON|TRUCK|en asymptotes according to the r +9825|759|24|3|4|6639.00|0.09|0.00|N|O|1996-06-29|1996-06-28|1996-07-15|NONE|TRUCK|l platelets boost car +9825|637|31|4|25|38440.75|0.02|0.04|N|O|1996-05-03|1996-07-06|1996-05-18|DELIVER IN PERSON|RAIL|d, ironic instructions. carefully spec +9826|1721|64|1|34|55172.48|0.10|0.05|R|F|1992-07-18|1992-06-12|1992-07-30|DELIVER IN PERSON|AIR|old, ironic courts alongside of +9826|456|86|2|1|1356.45|0.02|0.04|A|F|1992-04-22|1992-05-06|1992-05-15|COLLECT COD|MAIL|uickly. blithely pending depths lose slyly +9826|1086|57|3|50|49354.00|0.03|0.08|R|F|1992-05-07|1992-06-13|1992-05-21|COLLECT COD|FOB|ound the blithely spec +9827|279|7|1|16|18868.32|0.09|0.08|N|O|1998-08-15|1998-09-13|1998-09-08|NONE|SHIP| blithely silent pa +9827|1000|1|2|20|18020.00|0.08|0.08|N|O|1998-10-23|1998-09-07|1998-11-15|DELIVER IN PERSON|TRUCK|, bold accounts af +9828|716|13|1|39|63051.69|0.00|0.05|R|F|1992-04-29|1992-06-16|1992-05-23|COLLECT COD|RAIL|he furiousl +9828|64|15|2|17|16389.02|0.00|0.03|A|F|1992-05-31|1992-06-28|1992-06-23|DELIVER IN PERSON|FOB|final accounts according to +9828|508|39|3|21|29578.50|0.00|0.06|R|F|1992-06-05|1992-06-29|1992-07-02|COLLECT COD|AIR|nts. special +9828|1837|24|4|32|55642.56|0.06|0.00|A|F|1992-08-16|1992-06-17|1992-08-17|DELIVER IN PERSON|SHIP|uickly even foxes across the special accou +9828|123|2|5|25|25578.00|0.01|0.01|R|F|1992-08-19|1992-06-12|1992-08-21|NONE|TRUCK| blithely fluffil +9828|1398|99|6|41|53274.99|0.02|0.06|A|F|1992-07-25|1992-07-10|1992-08-03|TAKE BACK RETURN|RAIL|e furiously across the even requests. ir +9828|1773|16|7|13|21772.01|0.00|0.01|R|F|1992-06-27|1992-07-15|1992-07-18|COLLECT COD|RAIL|ding, ironic packages promise blithel +9829|210|92|1|2|2220.42|0.08|0.08|N|O|1996-03-31|1996-01-25|1996-04-06|DELIVER IN PERSON|MAIL|ss the quickly bold de +9829|599|60|2|3|4498.77|0.03|0.01|N|O|1996-02-25|1996-03-01|1996-03-20|NONE|AIR|. unusual accounts affix carefully about +9830|1575|56|1|26|38390.82|0.00|0.06|N|O|1997-12-01|1997-10-09|1997-12-22|DELIVER IN PERSON|TRUCK|ular dependencies. request +9830|231|59|2|34|38461.82|0.04|0.03|N|O|1997-10-06|1997-11-28|1997-11-03|NONE|SHIP| boldly pen +9830|347|32|3|17|21204.78|0.02|0.01|N|O|1997-12-04|1997-10-16|1997-12-20|NONE|MAIL|y pending ideas. furiously e +9830|835|2|4|19|32980.77|0.03|0.04|N|O|1997-11-16|1997-10-10|1997-11-21|COLLECT COD|AIR|y across the regular requests. quickly r +9830|1806|7|5|42|71727.60|0.10|0.08|N|O|1997-12-25|1997-11-07|1998-01-15|DELIVER IN PERSON|AIR|platelets: silent instructions c +9831|162|89|1|23|24429.68|0.06|0.04|N|O|1996-10-05|1996-08-13|1996-10-20|DELIVER IN PERSON|RAIL|pending theodolites. iro +9831|696|28|2|37|59077.53|0.02|0.08|N|O|1996-07-28|1996-08-05|1996-08-24|DELIVER IN PERSON|MAIL|l accounts. care +9856|1138|47|1|31|32213.03|0.09|0.03|R|F|1993-06-07|1993-08-10|1993-06-30|COLLECT COD|AIR|posits. quick, final pinto b +9856|1360|75|2|49|61806.64|0.08|0.06|R|F|1993-08-25|1993-07-24|1993-09-12|COLLECT COD|SHIP|ests engage furio +9856|1917|62|3|48|87307.68|0.03|0.00|A|F|1993-06-24|1993-08-11|1993-07-18|DELIVER IN PERSON|MAIL|arefully quickly unusu +9856|1690|32|4|37|58892.53|0.00|0.04|A|F|1993-06-14|1993-08-23|1993-06-27|NONE|TRUCK|refully furiously regular de +9857|1088|89|1|6|5934.48|0.06|0.02|A|F|1993-05-15|1993-06-26|1993-05-19|TAKE BACK RETURN|FOB|ickly regular deposit +9857|2000|33|2|42|37884.00|0.05|0.07|A|F|1993-07-22|1993-08-03|1993-07-27|TAKE BACK RETURN|MAIL|scapades are blithely abou +9857|1062|63|3|6|5778.36|0.03|0.03|A|F|1993-06-01|1993-07-27|1993-06-18|TAKE BACK RETURN|MAIL|lites. ironic foxes wa +9857|877|44|4|40|71114.80|0.00|0.07|R|F|1993-07-18|1993-06-14|1993-08-11|TAKE BACK RETURN|RAIL|ording to the regular theodolites are ac +9857|167|68|5|10|10671.60|0.00|0.03|R|F|1993-08-08|1993-07-25|1993-08-20|COLLECT COD|REG AIR|cuses would af +9857|163|16|6|5|5315.80|0.09|0.00|A|F|1993-08-04|1993-06-27|1993-09-02|DELIVER IN PERSON|AIR|ongside of the fin +9857|1437|38|7|13|17399.59|0.08|0.03|A|F|1993-08-31|1993-06-17|1993-09-02|DELIVER IN PERSON|SHIP|ions. furiously ironic +9858|353|38|1|18|22560.30|0.10|0.01|N|O|1997-12-15|1998-02-04|1998-01-09|NONE|RAIL| deposits was quickly. accounts i +9858|318|3|2|37|45077.47|0.04|0.03|N|O|1998-01-13|1998-02-19|1998-02-06|DELIVER IN PERSON|TRUCK|y carefully furiousl +9858|346|31|3|30|37390.20|0.02|0.06|N|O|1998-01-04|1998-01-10|1998-01-11|NONE|RAIL|ffily unusual requests ab +9859|1092|93|1|20|19861.80|0.04|0.06|N|O|1996-09-03|1996-09-06|1996-10-02|DELIVER IN PERSON|AIR|es according to the quickly r +9859|490|49|2|50|69524.50|0.02|0.05|N|O|1996-11-09|1996-10-13|1996-11-18|TAKE BACK RETURN|AIR|its are slyly final accounts. pe +9859|205|87|3|30|33156.00|0.03|0.08|N|O|1996-10-26|1996-09-25|1996-11-25|TAKE BACK RETURN|TRUCK| fluffily regular deposits; slyly regular f +9859|1479|97|4|37|51077.39|0.09|0.00|N|O|1996-08-20|1996-09-25|1996-09-15|DELIVER IN PERSON|TRUCK|he pending pinto beans +9859|540|71|5|49|70586.46|0.00|0.06|N|O|1996-08-27|1996-09-16|1996-09-17|COLLECT COD|REG AIR|ve theodolites will nag carefully aga +9860|756|21|1|4|6627.00|0.06|0.07|A|F|1993-12-03|1993-12-27|1993-12-13|COLLECT COD|MAIL|posits thrash. en +9860|1861|48|2|30|52885.80|0.03|0.00|A|F|1993-11-02|1993-11-10|1993-11-30|COLLECT COD|SHIP| the slyly bold foxes +9860|419|49|3|37|48818.17|0.03|0.05|A|F|1994-02-07|1994-01-03|1994-03-04|DELIVER IN PERSON|FOB|foxes cajole furiously slyly express +9860|994|63|4|4|7579.96|0.04|0.03|A|F|1993-10-18|1993-12-23|1993-11-03|TAKE BACK RETURN|RAIL|carefully special accoun +9860|1307|46|5|15|18124.50|0.03|0.08|R|F|1994-01-12|1993-12-08|1994-01-30|TAKE BACK RETURN|REG AIR|. regular pearls u +9860|26|2|6|19|17594.38|0.04|0.04|R|F|1993-10-28|1993-12-10|1993-11-15|TAKE BACK RETURN|REG AIR|ges. even packages cajole pending, ironi +9861|1349|88|1|1|1250.34|0.08|0.03|R|F|1992-11-16|1992-11-30|1992-12-04|COLLECT COD|AIR|ular pinto beans wake fluffily aft +9861|109|62|2|7|7063.70|0.09|0.02|A|F|1992-11-28|1992-12-12|1992-12-23|DELIVER IN PERSON|RAIL|es sleep carefully speci +9861|1356|57|3|21|26404.35|0.03|0.08|R|F|1993-01-28|1993-01-10|1993-01-31|DELIVER IN PERSON|REG AIR|ly express pinto b +9861|1122|31|4|6|6138.72|0.10|0.05|A|F|1992-12-26|1992-12-04|1993-01-21|COLLECT COD|SHIP|e furiously express req +9861|1914|15|5|13|23606.83|0.02|0.08|R|F|1992-12-31|1993-01-15|1993-01-30|COLLECT COD|MAIL| carefully +9862|863|97|1|26|45860.36|0.05|0.06|N|O|1998-01-15|1997-11-19|1998-01-25|NONE|FOB|p blithely +9862|396|97|2|11|14260.29|0.06|0.06|N|O|1997-12-18|1998-01-03|1998-01-12|TAKE BACK RETURN|AIR|s haggle quietl +9862|1959|92|3|37|68855.15|0.05|0.07|N|O|1997-11-20|1997-12-27|1997-12-15|DELIVER IN PERSON|SHIP| according t +9862|1827|57|4|4|6915.28|0.10|0.01|N|O|1997-12-12|1997-12-06|1998-01-04|TAKE BACK RETURN|SHIP|each slyly after the furiously unusual req +9862|1357|58|5|45|56625.75|0.07|0.07|N|O|1997-12-15|1997-11-21|1997-12-30|NONE|RAIL|nal theodolites sleep quickly th +9863|856|90|1|48|84328.80|0.06|0.08|N|O|1995-12-11|1995-10-11|1996-01-04|NONE|SHIP|arefully at the blithely unusual excuses. +9863|130|31|2|47|48416.11|0.06|0.04|N|O|1995-11-17|1995-10-14|1995-12-14|TAKE BACK RETURN|AIR|ts. asymptotes +9863|1875|62|3|27|47975.49|0.07|0.05|N|O|1995-11-13|1995-11-22|1995-11-29|NONE|RAIL|boost bold requests. pending, pe +9863|1745|46|4|36|59282.64|0.04|0.04|N|O|1995-11-17|1995-10-12|1995-11-27|COLLECT COD|AIR|ts haggle. regular accounts haggle q +9863|1709|36|5|18|28992.60|0.01|0.06|N|O|1995-12-12|1995-11-22|1995-12-14|TAKE BACK RETURN|AIR|press packa +9863|1037|43|6|43|40335.29|0.03|0.06|N|O|1995-10-21|1995-10-06|1995-10-22|COLLECT COD|FOB|ly unusual foxes a +9863|1867|97|7|29|51296.94|0.07|0.08|N|O|1995-11-06|1995-11-19|1995-11-12|COLLECT COD|TRUCK|uests cajole slyly aro +9888|582|13|1|34|50407.72|0.04|0.06|A|F|1994-11-25|1994-12-09|1994-12-13|TAKE BACK RETURN|FOB| slyly daring accounts. regular dependen +9888|669|63|2|12|18835.92|0.10|0.03|A|F|1994-11-11|1994-11-25|1994-11-12|TAKE BACK RETURN|REG AIR|ach blithely along the evenly f +9888|1042|43|3|6|5658.24|0.07|0.04|A|F|1994-11-25|1994-12-06|1994-12-12|NONE|TRUCK|se requests sleep slyly above t +9889|1809|96|1|11|18818.80|0.02|0.00|A|F|1994-12-26|1994-11-30|1995-01-06|DELIVER IN PERSON|MAIL|deposits detect care +9889|1039|40|2|20|18800.60|0.10|0.00|A|F|1994-11-10|1994-12-01|1994-11-14|NONE|RAIL|are quickly furiou +9890|1187|60|1|26|28292.68|0.00|0.01|R|F|1995-03-15|1995-03-27|1995-03-23|COLLECT COD|MAIL|lly ironic deposits. +9890|1660|43|2|41|64028.06|0.09|0.01|N|O|1995-06-22|1995-04-14|1995-06-25|DELIVER IN PERSON|AIR|ully final packages. quickl +9891|1959|48|1|5|9304.75|0.02|0.05|N|O|1995-09-16|1995-07-23|1995-09-18|TAKE BACK RETURN|RAIL| dolphins. boldly final ac +9891|1731|74|2|32|52247.36|0.03|0.02|N|F|1995-06-13|1995-07-09|1995-06-23|COLLECT COD|AIR|s sleep. carefully special theodolites was +9892|1970|59|1|5|9359.85|0.09|0.08|R|F|1992-09-11|1992-10-06|1992-09-16|NONE|MAIL| bold instruction +9892|1090|91|2|4|3964.36|0.05|0.02|A|F|1992-09-22|1992-08-24|1992-10-04|DELIVER IN PERSON|RAIL|y unusual asymptotes: bli +9892|1101|2|3|3|3006.30|0.02|0.04|R|F|1992-09-21|1992-10-06|1992-10-17|NONE|TRUCK|even warthogs. accounts affix +9893|1446|86|1|31|41770.64|0.03|0.05|R|F|1994-11-22|1994-10-21|1994-11-29|NONE|REG AIR|deas sleep carefully carefully st +9893|875|42|2|13|23086.31|0.02|0.07|R|F|1994-08-31|1994-09-17|1994-09-12|DELIVER IN PERSON|TRUCK|quests. sometimes unusual i +9893|1646|70|3|25|38691.00|0.04|0.04|A|F|1994-09-08|1994-11-02|1994-10-01|DELIVER IN PERSON|MAIL|. blithely pendi +9894|1325|40|1|23|28205.36|0.01|0.00|A|F|1994-05-06|1994-04-26|1994-06-03|DELIVER IN PERSON|SHIP|ages sleep according to th +9894|802|3|2|6|10216.80|0.00|0.07|R|F|1994-05-15|1994-06-09|1994-06-05|NONE|AIR|ckages engage +9894|1972|61|3|33|61841.01|0.06|0.06|R|F|1994-05-18|1994-04-26|1994-06-07|DELIVER IN PERSON|MAIL| carefully even accounts mol +9895|730|63|1|50|81536.50|0.00|0.01|R|F|1993-05-07|1993-07-17|1993-05-14|DELIVER IN PERSON|RAIL|he enticingly final co +9895|1375|14|2|24|30632.88|0.05|0.05|A|F|1993-04-23|1993-06-30|1993-04-29|COLLECT COD|REG AIR|ding ideas detec +9895|278|79|3|46|54200.42|0.02|0.04|A|F|1993-05-23|1993-07-18|1993-06-04|DELIVER IN PERSON|TRUCK| carefully silent packages. +9895|1621|45|4|48|73085.76|0.02|0.08|A|F|1993-05-24|1993-07-06|1993-06-18|DELIVER IN PERSON|REG AIR|ecial dugouts. silent excuses detect furiou +9920|1339|16|1|1|1240.33|0.06|0.02|N|O|1996-08-05|1996-07-12|1996-08-31|TAKE BACK RETURN|FOB|ently special warhorses. b +9920|1910|55|2|28|50733.48|0.08|0.03|N|O|1996-09-25|1996-08-30|1996-10-01|DELIVER IN PERSON|FOB|es detect. fluffily +9920|1036|72|3|29|27173.87|0.08|0.03|N|O|1996-08-31|1996-07-13|1996-09-19|TAKE BACK RETURN|TRUCK|uctions haggle among the express deposits. +9921|561|92|1|9|13154.04|0.07|0.05|N|O|1995-07-10|1995-08-07|1995-07-14|COLLECT COD|FOB|ackages. furiously bold req +9921|1804|34|2|48|81878.40|0.00|0.04|N|F|1995-05-31|1995-07-02|1995-06-20|TAKE BACK RETURN|TRUCK|thely. slyly unusual asymptot +9921|246|74|3|7|8023.68|0.03|0.04|N|O|1995-08-24|1995-06-29|1995-08-30|NONE|RAIL|usly regular in +9921|496|97|4|28|39101.72|0.05|0.01|N|O|1995-06-19|1995-06-22|1995-06-25|COLLECT COD|MAIL|lar, regular pinto bean +9922|886|86|1|20|35737.60|0.01|0.02|R|F|1995-05-09|1995-07-03|1995-05-17|NONE|FOB|bove the ironic depths haggle blithely spec +9922|803|3|2|1|1703.80|0.09|0.00|N|F|1995-06-16|1995-06-17|1995-06-27|DELIVER IN PERSON|SHIP| final accou +9922|529|20|3|21|30019.92|0.03|0.04|R|F|1995-04-21|1995-06-09|1995-04-29|DELIVER IN PERSON|MAIL|indle slyly ideas. requests nag quietly ab +9922|1473|91|4|31|42608.57|0.09|0.04|R|F|1995-05-27|1995-06-04|1995-06-10|DELIVER IN PERSON|MAIL|s integrate. packages hinder silent, re +9922|1800|43|5|16|27228.80|0.06|0.05|A|F|1995-05-24|1995-06-09|1995-06-05|DELIVER IN PERSON|MAIL|iously special depos +9922|686|49|6|32|50773.76|0.09|0.04|N|F|1995-06-13|1995-05-17|1995-06-21|NONE|TRUCK|usly regular pac +9922|1763|64|7|2|3329.52|0.09|0.02|N|O|1995-08-01|1995-06-15|1995-08-10|NONE|REG AIR|ironic pint +9923|1439|57|1|11|14744.73|0.09|0.05|R|F|1995-01-26|1994-11-15|1995-02-22|TAKE BACK RETURN|SHIP|y final deposits sleep. furi +9923|1022|93|2|45|41535.90|0.02|0.00|R|F|1994-12-05|1994-11-11|1994-12-12|COLLECT COD|RAIL|urts. bold courts above the furiou +9923|928|31|3|33|60354.36|0.04|0.03|A|F|1994-12-30|1994-11-29|1995-01-21|TAKE BACK RETURN|MAIL|fully fluffily even d +9923|167|20|4|6|6402.96|0.07|0.02|R|F|1994-10-23|1994-12-09|1994-11-02|DELIVER IN PERSON|FOB|unts wake sl +9923|1427|67|5|26|34538.92|0.05|0.01|R|F|1995-01-21|1994-11-29|1995-01-22|COLLECT COD|RAIL|usly. ironic platel +9923|827|27|6|41|70840.62|0.02|0.01|A|F|1995-01-02|1995-01-01|1995-02-01|COLLECT COD|REG AIR|ronic accounts cajole. unusual account +9924|803|3|1|2|3407.60|0.04|0.01|N|O|1997-09-05|1997-06-15|1997-09-18|COLLECT COD|TRUCK|ilent theodolites. bli +9924|675|69|2|31|48845.77|0.09|0.06|N|O|1997-08-25|1997-06-24|1997-09-06|NONE|MAIL|, ironic packages. deposits se +9924|1933|66|3|27|49543.11|0.01|0.05|N|O|1997-05-13|1997-07-21|1997-05-20|TAKE BACK RETURN|RAIL|regular pinto beans. slyly f +9924|562|93|4|27|39489.12|0.00|0.00|N|O|1997-06-17|1997-06-19|1997-07-16|COLLECT COD|AIR|e after the even, express dependencies. re +9924|1751|78|5|34|56193.50|0.09|0.00|N|O|1997-08-23|1997-08-06|1997-08-29|COLLECT COD|MAIL|eas boost careful +9925|1590|31|1|40|59663.60|0.08|0.01|R|F|1992-03-18|1992-04-09|1992-03-27|COLLECT COD|AIR|s use quickly. regular pinto beans use +9925|504|35|2|46|64607.00|0.09|0.04|R|F|1992-02-02|1992-03-26|1992-02-06|DELIVER IN PERSON|FOB|ns. pending, special deposits +9925|417|5|3|48|63235.68|0.07|0.00|A|F|1992-05-25|1992-04-11|1992-06-10|DELIVER IN PERSON|RAIL|kages nag above +9925|817|84|4|38|65276.78|0.07|0.08|A|F|1992-05-16|1992-04-30|1992-06-03|TAKE BACK RETURN|SHIP|t the courts boost carefully +9925|315|100|5|6|7291.86|0.10|0.03|A|F|1992-05-18|1992-04-14|1992-06-07|DELIVER IN PERSON|RAIL|s boost. carefully final requests wake qui +9925|299|100|6|40|47971.60|0.03|0.04|A|F|1992-02-29|1992-04-22|1992-03-10|NONE|TRUCK|le regularly final asymptotes +9926|283|38|1|42|49697.76|0.04|0.02|A|F|1995-01-21|1994-11-21|1995-02-06|COLLECT COD|AIR|lowly? carefully final accounts wake. +9926|1737|22|2|4|6554.92|0.08|0.07|A|F|1994-11-26|1994-11-23|1994-12-09|TAKE BACK RETURN|TRUCK|he pending tithes wake acco +9926|408|96|3|33|43177.20|0.10|0.05|A|F|1994-11-28|1995-01-10|1994-12-25|COLLECT COD|AIR|r the blithely ironic platelets. +9926|345|74|4|34|42341.56|0.09|0.00|R|F|1995-01-02|1994-12-09|1995-01-22|NONE|TRUCK|s. fluffily +9926|188|67|5|32|34821.76|0.10|0.05|A|F|1995-01-30|1994-11-19|1995-02-22|DELIVER IN PERSON|TRUCK|lar, even t +9926|643|37|6|39|60201.96|0.07|0.03|R|F|1995-01-24|1994-12-12|1995-02-05|NONE|AIR|ackages about +9927|9|35|1|43|39087.00|0.01|0.05|N|O|1995-12-16|1995-09-16|1995-12-28|COLLECT COD|TRUCK|regular in +9927|1032|33|2|9|8397.27|0.07|0.04|N|O|1995-10-12|1995-09-25|1995-10-28|COLLECT COD|MAIL|efully fin +9927|702|99|3|46|73724.20|0.09|0.06|N|O|1995-10-25|1995-10-24|1995-11-09|COLLECT COD|AIR|arefully according to the express request +9927|996|31|4|32|60703.68|0.07|0.00|N|O|1995-11-03|1995-09-18|1995-11-15|DELIVER IN PERSON|SHIP|all have to are above the furiously even r +9927|1517|18|5|37|52484.87|0.01|0.03|N|O|1995-11-15|1995-09-23|1995-12-15|TAKE BACK RETURN|RAIL|he quickly regular packages. ca +9927|1194|67|6|8|8761.52|0.07|0.08|N|O|1995-10-21|1995-10-31|1995-11-11|DELIVER IN PERSON|MAIL|ously above the quickly regular depo +9952|998|33|1|23|43676.77|0.05|0.04|R|F|1992-08-24|1992-07-22|1992-08-27|NONE|REG AIR|cies about the furiously express +9952|419|7|2|20|26388.20|0.03|0.00|A|F|1992-05-21|1992-06-07|1992-06-01|NONE|AIR|requests. regularly +9952|429|88|3|15|19941.30|0.10|0.04|R|F|1992-05-07|1992-06-24|1992-05-19|COLLECT COD|SHIP|e ironic, special accounts. car +9953|1800|85|1|2|3403.60|0.09|0.06|A|F|1995-04-05|1995-04-28|1995-05-03|DELIVER IN PERSON|MAIL|usly regular accou +9953|1593|74|2|10|14945.90|0.06|0.05|R|F|1995-03-09|1995-05-23|1995-04-06|COLLECT COD|MAIL|ckly regular +9954|922|23|1|30|54687.60|0.00|0.07|R|F|1994-07-26|1994-09-01|1994-08-24|DELIVER IN PERSON|RAIL|requests are blithely after the ironic d +9954|1542|63|2|3|4330.62|0.01|0.06|A|F|1994-09-10|1994-09-02|1994-10-04|DELIVER IN PERSON|REG AIR|s haggle evenly. dogged +9954|319|48|3|28|34140.68|0.04|0.02|A|F|1994-09-08|1994-07-24|1994-09-28|TAKE BACK RETURN|TRUCK|nding, bol +9954|1435|36|4|37|49447.91|0.05|0.02|R|F|1994-08-08|1994-07-21|1994-09-01|DELIVER IN PERSON|FOB| express requests sleep +9954|1830|74|5|20|34636.60|0.05|0.06|R|F|1994-07-14|1994-09-08|1994-07-20|NONE|REG AIR|ntly pending dolphins. quickly ironic pa +9954|1813|43|6|18|30866.58|0.09|0.02|A|F|1994-06-21|1994-08-26|1994-06-29|TAKE BACK RETURN|TRUCK|refully fin +9955|62|13|1|36|34634.16|0.09|0.00|N|O|1995-12-17|1995-10-24|1995-12-23|NONE|AIR|es. carefully p +9955|286|41|2|15|17794.20|0.00|0.03|N|O|1995-11-12|1995-11-19|1995-11-26|NONE|RAIL|deas. regular, express +9955|1939|72|3|42|77319.06|0.01|0.08|N|O|1995-10-11|1995-10-16|1995-10-14|TAKE BACK RETURN|AIR|ecial, special deposit +9955|526|57|4|9|12838.68|0.01|0.07|N|O|1995-10-24|1995-12-02|1995-11-14|COLLECT COD|SHIP|de of the pending +9955|388|73|5|23|29632.74|0.05|0.00|N|O|1995-12-23|1995-11-06|1996-01-13|NONE|REG AIR|ages. express inst +9955|1132|33|6|14|14463.82|0.05|0.04|N|O|1995-10-30|1995-10-25|1995-11-25|NONE|TRUCK|ending packages sleep fluffily +9956|69|95|1|40|38762.40|0.02|0.02|R|F|1993-05-13|1993-05-30|1993-06-01|COLLECT COD|MAIL|n ideas detect blithely package +9957|1497|15|1|23|32165.27|0.03|0.03|A|F|1994-03-30|1994-02-05|1994-04-13|DELIVER IN PERSON|SHIP| according to the special accounts doubt at +9957|706|3|2|21|33740.70|0.09|0.06|R|F|1994-03-08|1994-01-21|1994-04-04|TAKE BACK RETURN|AIR|ages. blithely +9958|1788|15|1|37|62521.86|0.09|0.04|A|F|1994-01-25|1994-01-27|1994-02-03|DELIVER IN PERSON|AIR|ter the carefully final plate +9958|1282|57|2|38|44964.64|0.03|0.05|R|F|1994-03-24|1993-12-27|1994-04-12|DELIVER IN PERSON|FOB|instructions. regular pinto beans boost +9958|1911|56|3|23|41696.93|0.08|0.00|A|F|1993-12-21|1994-01-21|1993-12-23|DELIVER IN PERSON|REG AIR|cuses detect. flu +9958|395|96|4|38|49224.82|0.05|0.06|R|F|1994-01-11|1994-01-22|1994-01-30|NONE|AIR|refully reg +9959|490|20|1|6|8342.94|0.00|0.03|N|O|1995-11-13|1995-12-13|1995-11-16|COLLECT COD|RAIL| unusual pin +9959|1147|20|2|10|10481.40|0.07|0.07|N|O|1995-11-07|1995-11-17|1995-11-28|TAKE BACK RETURN|SHIP|bove the pendi +9984|1201|2|1|18|19839.60|0.01|0.04|N|O|1998-09-26|1998-08-27|1998-10-13|NONE|REG AIR|nusual excuses; fluffily ironic pack +9984|1518|19|2|49|69555.99|0.01|0.03|N|O|1998-08-02|1998-09-13|1998-08-08|TAKE BACK RETURN|FOB|er the special sheaves. unusual +9984|1393|94|3|33|42714.87|0.03|0.00|N|O|1998-09-03|1998-09-15|1998-09-16|COLLECT COD|REG AIR| theodolites. carefully re +9984|800|97|4|27|45921.60|0.04|0.05|N|O|1998-07-14|1998-08-21|1998-07-15|TAKE BACK RETURN|AIR|lly. furiously express +9984|482|83|5|41|56681.68|0.07|0.02|N|O|1998-10-18|1998-08-20|1998-10-31|TAKE BACK RETURN|TRUCK|ructions. doggedly special requests de +9985|1604|87|1|38|57212.80|0.06|0.08|A|F|1993-08-21|1993-10-23|1993-09-06|NONE|MAIL|fully ironic hockey players use q +9985|977|78|2|1|1877.97|0.03|0.00|A|F|1993-10-08|1993-11-06|1993-10-24|COLLECT COD|RAIL|bove the ac +9985|524|55|3|17|24216.84|0.08|0.01|R|F|1993-10-17|1993-10-03|1993-11-10|NONE|TRUCK|rding to the regular +9986|217|18|1|40|44688.40|0.04|0.07|N|O|1998-01-20|1997-11-03|1998-01-31|DELIVER IN PERSON|RAIL| the regular asymptotes. fl +9986|677|40|2|47|74150.49|0.02|0.02|N|O|1997-10-02|1997-12-19|1997-10-13|TAKE BACK RETURN|REG AIR|ular platelets. quickly final asymptotes a +9986|467|26|3|22|30084.12|0.00|0.01|N|O|1997-12-10|1997-12-17|1997-12-16|TAKE BACK RETURN|REG AIR|ing to the slyly ironic r +9987|1830|31|1|11|19050.13|0.06|0.07|N|O|1995-12-28|1996-02-16|1996-01-10|TAKE BACK RETURN|SHIP|accounts are furio +9987|654|55|2|41|63740.65|0.10|0.08|N|O|1996-02-23|1996-01-22|1996-03-22|DELIVER IN PERSON|TRUCK|unts toward the blithely unusual ide +9987|70|21|3|20|19401.40|0.09|0.06|N|O|1996-01-15|1996-02-10|1996-01-22|NONE|AIR|slyly final requ +9987|1611|12|4|41|62017.01|0.06|0.07|N|O|1996-03-03|1996-01-30|1996-03-25|TAKE BACK RETURN|MAIL|ctions haggle furiously furiousl +9987|141|68|5|38|39563.32|0.02|0.01|N|O|1996-01-10|1996-02-13|1996-02-06|COLLECT COD|SHIP|s. express, dogged instr +9987|1337|38|6|33|40864.89|0.06|0.05|N|O|1996-01-22|1996-02-02|1996-01-25|DELIVER IN PERSON|RAIL|ent, silent pinto beans about th +9988|1757|100|1|37|61373.75|0.07|0.05|N|O|1998-02-01|1998-02-05|1998-02-22|TAKE BACK RETURN|TRUCK|es wake fluffily bold multipliers. slyly +9988|1732|75|2|50|81686.50|0.04|0.01|N|O|1997-12-19|1998-02-02|1997-12-31|COLLECT COD|MAIL| unusual accounts. carefully +9989|248|3|1|8|9185.92|0.06|0.08|A|F|1993-08-17|1993-09-16|1993-09-14|COLLECT COD|TRUCK|ly ironic packages. f +9989|260|61|2|4|4641.04|0.00|0.02|R|F|1993-09-02|1993-08-16|1993-09-21|TAKE BACK RETURN|MAIL|inal instructions impress according +9989|1194|67|3|28|30665.32|0.08|0.02|A|F|1993-08-21|1993-07-22|1993-09-13|NONE|SHIP|packages. i +9989|1524|25|4|50|71276.00|0.05|0.04|A|F|1993-09-11|1993-09-12|1993-09-13|NONE|TRUCK|lithely fi +9990|786|87|1|48|80965.44|0.06|0.06|R|F|1992-03-29|1992-06-08|1992-04-14|COLLECT COD|AIR|ly ironic theodolites-- bold deposit +9991|49|75|1|37|35114.48|0.01|0.00|N|O|1996-07-07|1996-07-22|1996-07-16|COLLECT COD|AIR|ng asymptotes across the blithely r +9991|1273|85|2|47|55190.69|0.02|0.00|N|O|1996-06-21|1996-08-16|1996-07-11|COLLECT COD|AIR|ular accounts? furiousl +10016|321|6|1|23|28090.36|0.02|0.06|R|F|1993-05-10|1993-04-02|1993-06-03|TAKE BACK RETURN|FOB|ons. requests haggle furiously aft +10017|326|55|1|50|61316.00|0.01|0.01|N|O|1998-06-07|1998-05-25|1998-06-10|NONE|SHIP|have to wake. packages inte +10017|1319|96|2|31|37829.61|0.04|0.07|N|O|1998-07-27|1998-05-12|1998-08-23|TAKE BACK RETURN|SHIP|about the ironically ironic +10018|1363|40|1|1|1264.36|0.08|0.03|A|F|1993-07-16|1993-08-04|1993-08-02|COLLECT COD|SHIP|ter the fluffily pending asymp +10018|1552|93|2|35|50874.25|0.10|0.02|R|F|1993-07-13|1993-08-30|1993-07-28|DELIVER IN PERSON|MAIL|ls. carefully pending pinto beans dazzle +10018|323|52|3|31|37922.92|0.06|0.05|A|F|1993-07-12|1993-08-02|1993-08-07|COLLECT COD|FOB|after the furiously regular theodolites: +10019|551|82|1|50|72577.50|0.02|0.04|R|F|1994-10-08|1994-10-09|1994-10-20|COLLECT COD|RAIL|ts are even, special grouches. slyly regula +10019|244|72|2|32|36615.68|0.01|0.07|R|F|1994-08-10|1994-08-20|1994-08-30|COLLECT COD|FOB|uickly. blithely final dependencies +10019|1090|91|3|42|41625.78|0.05|0.03|A|F|1994-08-31|1994-09-07|1994-09-28|TAKE BACK RETURN|REG AIR| serve carefully carefully even ideas. +10019|1550|31|4|11|15967.05|0.03|0.04|R|F|1994-10-06|1994-09-22|1994-10-18|TAKE BACK RETURN|REG AIR|n furiously regular deposits. sly +10020|1217|92|1|23|25718.83|0.02|0.00|N|O|1998-05-24|1998-06-21|1998-06-01|NONE|REG AIR|ackages use accounts. unusual, final packa +10020|915|84|2|40|72636.40|0.03|0.05|N|O|1998-07-31|1998-06-27|1998-08-13|NONE|REG AIR|ously express requests integrate fu +10021|178|31|1|18|19407.06|0.02|0.00|R|F|1992-09-09|1992-10-16|1992-09-28|COLLECT COD|SHIP|ounts use. silent foxe +10021|1211|23|2|28|31141.88|0.04|0.06|A|F|1992-10-02|1992-10-16|1992-10-21|COLLECT COD|RAIL|s. regular, ironic deposits sleep +10022|266|94|1|40|46650.40|0.05|0.08|R|F|1994-04-17|1994-05-04|1994-04-27|COLLECT COD|REG AIR|leep furiously. furiously +10022|402|90|2|18|23443.20|0.03|0.02|A|F|1994-07-04|1994-04-26|1994-07-30|DELIVER IN PERSON|FOB|. carefully final asymptotes above th +10023|241|69|1|40|45649.60|0.03|0.03|N|O|1996-12-17|1997-02-18|1996-12-30|DELIVER IN PERSON|MAIL|special excuses cajole fluffily blit +10023|1997|98|2|7|13292.93|0.02|0.02|N|O|1997-01-04|1997-01-17|1997-01-12|NONE|SHIP|ages solve blithely regular, fina +10023|1085|86|3|31|30568.48|0.05|0.04|N|O|1997-03-31|1997-01-01|1997-04-16|NONE|REG AIR|efully. fluffily bold dolphins haggle +10023|1322|99|4|15|18349.80|0.03|0.06|N|O|1997-02-27|1997-01-18|1997-03-06|COLLECT COD|MAIL| integrate furiously even package +10048|1737|64|1|19|31135.87|0.01|0.04|A|F|1994-08-31|1994-06-29|1994-09-22|TAKE BACK RETURN|AIR|sits. unusual pinto b +10048|3|79|2|34|30702.00|0.03|0.05|A|F|1994-06-07|1994-08-10|1994-06-11|DELIVER IN PERSON|RAIL|usual requests shoul +10049|686|87|1|39|61880.52|0.00|0.06|N|O|1997-10-09|1997-09-25|1997-10-12|NONE|RAIL|final courts. furiousl +10049|1656|39|2|34|52960.10|0.04|0.07|N|O|1997-08-27|1997-10-05|1997-09-07|DELIVER IN PERSON|AIR|eodolites. final, even deposits +10049|1594|15|3|4|5982.36|0.00|0.00|N|O|1997-11-13|1997-09-26|1997-12-11|NONE|FOB|e. bold packages nod qu +10049|1641|83|4|30|46279.20|0.09|0.04|N|O|1997-08-26|1997-09-18|1997-09-07|DELIVER IN PERSON|MAIL|ses sleep along the furiously unusual shea +10050|1999|32|1|33|62732.67|0.08|0.05|N|O|1996-11-12|1996-11-09|1996-11-25|NONE|TRUCK|ests haggl +10050|1758|43|2|35|58091.25|0.06|0.00|N|O|1997-01-02|1996-11-14|1997-01-19|COLLECT COD|FOB| bold, regular foxe +10050|1046|82|3|5|4735.20|0.08|0.08|N|O|1996-09-15|1996-10-24|1996-09-28|COLLECT COD|RAIL|he ideas detect slyly dur +10050|228|10|4|29|32718.38|0.06|0.04|N|O|1996-11-15|1996-11-14|1996-11-27|COLLECT COD|MAIL|st furiously final requ +10051|829|29|1|31|53624.42|0.08|0.04|N|O|1996-06-20|1996-07-17|1996-07-18|DELIVER IN PERSON|SHIP|nal packages sleep along the r +10051|978|47|2|28|52611.16|0.06|0.08|N|O|1996-06-04|1996-06-24|1996-06-08|TAKE BACK RETURN|TRUCK| final ideas sle +10051|870|71|3|14|24792.18|0.08|0.00|N|O|1996-08-23|1996-08-18|1996-09-10|TAKE BACK RETURN|REG AIR|ully even requests are fi +10051|55|56|4|46|43932.30|0.08|0.02|N|O|1996-07-11|1996-08-21|1996-07-29|COLLECT COD|TRUCK|eaves are after the blithely ev +10052|387|88|1|30|38621.40|0.07|0.06|A|F|1994-12-18|1994-12-02|1994-12-29|NONE|SHIP|ove the blithely final a +10052|544|35|2|39|56337.06|0.09|0.07|A|F|1994-12-22|1994-10-10|1995-01-06|TAKE BACK RETURN|AIR| express packages. even packages are care +10052|177|78|3|29|31237.93|0.01|0.04|A|F|1994-12-09|1994-11-26|1995-01-04|NONE|TRUCK| the unusual accounts. furiousl +10052|135|36|4|25|25878.25|0.06|0.05|R|F|1995-01-02|1994-11-11|1995-01-07|DELIVER IN PERSON|MAIL|lar deposits! f +10052|1100|36|5|29|29031.90|0.05|0.04|A|F|1994-09-10|1994-12-06|1994-09-16|NONE|MAIL|refully bold ins +10052|714|47|6|10|16147.10|0.01|0.01|R|F|1994-10-19|1994-11-06|1994-11-02|DELIVER IN PERSON|MAIL|ross the regular platel +10053|77|53|1|15|14656.05|0.08|0.00|R|F|1992-01-12|1992-03-08|1992-02-08|TAKE BACK RETURN|TRUCK|ously unusual requests wake against t +10053|1345|46|2|24|29912.16|0.01|0.01|R|F|1992-04-16|1992-02-18|1992-05-13|NONE|TRUCK|ar, ironic +10053|1440|41|3|21|28170.24|0.02|0.07|R|F|1992-03-20|1992-02-10|1992-03-25|COLLECT COD|TRUCK|ts boost furiously ironic fo +10053|1402|20|4|24|31281.60|0.07|0.06|R|F|1992-01-14|1992-03-05|1992-01-18|TAKE BACK RETURN|TRUCK|es. even warthogs are sly +10053|1288|63|5|43|51139.04|0.09|0.05|A|F|1992-04-08|1992-02-22|1992-04-11|TAKE BACK RETURN|REG AIR|the express asympto +10054|966|35|1|34|63476.64|0.00|0.01|N|O|1995-08-11|1995-07-21|1995-09-10|TAKE BACK RETURN|MAIL|press accounts detect slyly. quickly speci +10054|582|13|2|31|45959.98|0.02|0.06|N|O|1995-07-17|1995-07-08|1995-07-25|DELIVER IN PERSON|AIR|nto beans are. even foxes use idle +10055|1603|4|1|43|64697.80|0.00|0.04|N|O|1996-04-23|1996-05-26|1996-04-29|COLLECT COD|REG AIR|slyly final package +10055|1685|9|2|2|3173.36|0.04|0.01|N|O|1996-05-14|1996-04-02|1996-05-18|DELIVER IN PERSON|REG AIR|ove the slyly even accounts. ir +10055|1474|75|3|11|15130.17|0.00|0.00|N|O|1996-03-10|1996-05-07|1996-03-31|DELIVER IN PERSON|RAIL|old pinto bea +10055|960|95|4|13|24192.48|0.04|0.01|N|O|1996-04-18|1996-05-17|1996-05-13|DELIVER IN PERSON|RAIL|s sleep among th +10080|207|8|1|44|48716.80|0.03|0.05|R|F|1993-05-21|1993-04-23|1993-05-26|COLLECT COD|FOB|fluffily unusual sentiments run. +10080|149|2|2|24|25179.36|0.05|0.01|R|F|1993-04-20|1993-03-26|1993-04-30|TAKE BACK RETURN|SHIP| slyly quick dolphins. +10080|571|72|3|49|72106.93|0.04|0.03|R|F|1993-06-06|1993-05-12|1993-06-09|NONE|SHIP|beans against the +10080|409|97|4|32|41900.80|0.04|0.04|R|F|1993-04-11|1993-05-01|1993-05-04|TAKE BACK RETURN|TRUCK|final ideas integra +10080|1282|20|5|10|11832.80|0.05|0.01|A|F|1993-03-18|1993-04-13|1993-04-06|NONE|REG AIR|riously about +10080|494|82|6|14|19522.86|0.07|0.06|R|F|1993-05-17|1993-03-17|1993-05-27|DELIVER IN PERSON|FOB|ely unusual requests boost +10080|258|13|7|2|2316.50|0.07|0.07|A|F|1993-05-11|1993-03-19|1993-05-12|TAKE BACK RETURN|REG AIR|ress theodolites sleep bravely. final, eve +10081|1419|98|1|28|36971.48|0.02|0.07|A|F|1993-10-18|1993-09-28|1993-11-15|NONE|TRUCK|nic requests are slyly. packages ca +10081|1486|26|2|41|56886.68|0.04|0.02|A|F|1993-10-22|1993-10-08|1993-10-28|DELIVER IN PERSON|FOB|e packages. bol +10081|1804|91|3|37|63114.60|0.07|0.06|A|F|1993-10-31|1993-09-30|1993-11-28|COLLECT COD|TRUCK|iously thin accounts? regular, unu +10081|1667|50|4|38|59609.08|0.02|0.06|R|F|1993-11-23|1993-10-03|1993-11-25|TAKE BACK RETURN|REG AIR|e final courts. quickly express accou +10081|1349|64|5|1|1250.34|0.04|0.08|R|F|1993-09-19|1993-10-17|1993-10-19|COLLECT COD|SHIP|unusual deposi +10081|383|84|6|39|50051.82|0.06|0.02|A|F|1993-12-06|1993-09-28|1993-12-20|NONE|REG AIR|nic ideas haggle quickly ar +10082|201|83|1|48|52857.60|0.05|0.00|R|F|1994-12-13|1994-11-10|1994-12-25|TAKE BACK RETURN|FOB|telets. ironic requests hagg +10082|774|71|2|10|16747.70|0.06|0.08|R|F|1994-12-17|1994-10-19|1994-12-20|NONE|AIR| alongside of the deposits +10082|847|47|3|25|43696.00|0.10|0.04|R|F|1994-09-04|1994-11-18|1994-09-07|TAKE BACK RETURN|TRUCK|sits. blithely regul +10082|970|5|4|23|43032.31|0.10|0.03|A|F|1994-09-15|1994-10-10|1994-09-27|TAKE BACK RETURN|AIR|esias nag ca +10082|718|83|5|20|32374.20|0.07|0.04|R|F|1994-10-11|1994-11-12|1994-10-29|DELIVER IN PERSON|SHIP|slyly final accoun +10082|182|83|6|35|37876.30|0.05|0.02|A|F|1994-10-12|1994-09-30|1994-11-06|TAKE BACK RETURN|SHIP|equests are quickly ironic requests. b +10083|1507|28|1|40|56340.00|0.04|0.02|N|O|1995-10-12|1995-12-05|1995-10-22|NONE|SHIP|unusual instructions a +10084|954|57|1|3|5564.85|0.09|0.05|N|O|1997-09-07|1997-09-18|1997-09-22|NONE|AIR|gainst the slyly +10085|1958|59|1|35|65098.25|0.08|0.06|N|O|1996-07-12|1996-06-15|1996-07-19|NONE|MAIL| about the blithely daring deposi +10085|275|76|2|34|39959.18|0.05|0.04|N|O|1996-04-06|1996-06-22|1996-04-20|TAKE BACK RETURN|MAIL|rate quickly stealthily clos +10085|1233|34|3|14|15879.22|0.01|0.00|N|O|1996-05-19|1996-06-04|1996-05-20|DELIVER IN PERSON|TRUCK|ans. doggedly pending excuses +10085|722|55|4|33|53549.76|0.07|0.06|N|O|1996-06-04|1996-05-08|1996-06-26|NONE|MAIL| foxes alongside of the careful +10085|747|48|5|33|54375.42|0.06|0.04|N|O|1996-06-13|1996-05-03|1996-06-16|COLLECT COD|REG AIR|arefully after the requests. iron +10086|1579|60|1|35|51819.95|0.08|0.07|N|O|1995-06-29|1995-08-01|1995-07-21|TAKE BACK RETURN|MAIL| deposits haggle blithely. even packages a +10087|1410|28|1|48|62947.68|0.09|0.06|N|O|1997-05-08|1997-06-05|1997-05-13|NONE|MAIL|c patterns alongs +10087|335|64|2|14|17294.62|0.00|0.00|N|O|1997-05-11|1997-06-07|1997-05-13|DELIVER IN PERSON|RAIL|usly above +10112|1712|39|1|21|33887.91|0.00|0.04|A|F|1994-03-03|1994-03-04|1994-03-30|DELIVER IN PERSON|TRUCK|ully special theodolites about the stealthi +10113|1873|17|1|35|62120.45|0.03|0.02|R|F|1994-07-20|1994-07-18|1994-07-25|COLLECT COD|REG AIR|grate carefull +10113|1493|11|2|20|27889.80|0.08|0.02|A|F|1994-08-12|1994-09-04|1994-08-22|NONE|SHIP|uickly express packages wake fluffily. s +10113|725|58|3|28|45520.16|0.05|0.05|R|F|1994-10-04|1994-07-13|1994-10-24|COLLECT COD|FOB|ccounts sleep. blithely dog +10113|1534|15|4|40|57421.20|0.01|0.07|R|F|1994-07-02|1994-07-23|1994-07-04|COLLECT COD|REG AIR|haggle quickly platelets. furiously +10114|1443|22|1|34|45710.96|0.05|0.08|R|F|1993-04-11|1993-03-13|1993-04-30|TAKE BACK RETURN|MAIL|ly final packages. specia +10115|1767|68|1|16|26700.16|0.00|0.00|N|O|1998-10-01|1998-08-10|1998-10-26|NONE|FOB|n foxes haggle carefully according +10115|279|80|2|40|47170.80|0.07|0.06|N|O|1998-09-05|1998-08-31|1998-09-19|COLLECT COD|RAIL|oss the expres +10115|237|38|3|28|31842.44|0.06|0.01|N|O|1998-09-15|1998-09-11|1998-09-22|TAKE BACK RETURN|MAIL|blithely after t +10115|1857|58|4|23|40453.55|0.04|0.07|N|O|1998-10-25|1998-08-06|1998-11-05|TAKE BACK RETURN|RAIL|ourts among the blithely spe +10116|880|81|1|36|64111.68|0.00|0.03|N|O|1997-04-26|1997-04-26|1997-05-17|DELIVER IN PERSON|FOB|nts. blithely bo +10116|1778|79|2|9|15117.93|0.06|0.07|N|O|1997-07-20|1997-06-12|1997-08-17|TAKE BACK RETURN|FOB|s. fluffily unusual instructions run abov +10116|104|31|3|48|48196.80|0.09|0.05|N|O|1997-04-21|1997-06-21|1997-05-20|COLLECT COD|FOB|e blithely special theodolites. s +10116|160|87|4|31|32864.96|0.02|0.07|N|O|1997-06-09|1997-04-29|1997-06-17|TAKE BACK RETURN|TRUCK|pending instructions use slyly. unusual +10116|1506|7|5|43|60522.50|0.04|0.05|N|O|1997-04-17|1997-05-08|1997-05-11|DELIVER IN PERSON|REG AIR|equests. slyly +10117|1682|6|1|47|74432.96|0.08|0.00|R|F|1993-12-22|1993-12-18|1994-01-08|DELIVER IN PERSON|FOB|use according to t +10117|117|96|2|12|12205.32|0.03|0.08|R|F|1994-02-15|1993-12-28|1994-03-03|DELIVER IN PERSON|FOB|ular excuses. +10117|428|16|3|38|50479.96|0.03|0.00|A|F|1994-02-26|1994-02-13|1994-02-27|NONE|TRUCK|-- requests about +10118|1889|33|1|14|25072.32|0.03|0.01|R|F|1994-06-12|1994-05-12|1994-06-18|COLLECT COD|MAIL|ely quick pinto beans. slyly express the +10119|1982|27|1|27|50867.46|0.04|0.06|N|O|1996-07-12|1996-09-21|1996-08-05|NONE|TRUCK|en excuses grow evenly furiously +10144|1417|18|1|17|22412.97|0.06|0.08|A|F|1995-04-05|1995-03-21|1995-04-26|TAKE BACK RETURN|AIR|s. furiously even deposits acros +10144|1289|90|2|19|22615.32|0.07|0.05|A|F|1995-03-30|1995-02-21|1995-04-12|DELIVER IN PERSON|FOB|s serve blithely permanent package +10144|1365|80|3|41|51920.76|0.07|0.06|A|F|1995-02-19|1995-03-27|1995-03-01|DELIVER IN PERSON|MAIL|osits nag carefully express +10144|1972|5|4|40|74958.80|0.07|0.00|R|F|1995-02-07|1995-03-15|1995-03-02|NONE|RAIL|uses. even requests play +10144|1763|90|5|42|69919.92|0.06|0.06|R|F|1995-02-19|1995-03-30|1995-03-02|NONE|REG AIR|eas sleep furiously. pending +10145|1757|84|1|30|49762.50|0.01|0.02|N|O|1995-07-31|1995-07-15|1995-08-02|NONE|FOB|ironic warthogs bo +10145|907|42|2|16|28926.40|0.01|0.03|N|O|1995-07-11|1995-08-10|1995-07-28|NONE|AIR|refully special +10145|1987|88|3|19|35890.62|0.00|0.06|N|O|1995-08-11|1995-07-24|1995-08-17|TAKE BACK RETURN|TRUCK|y behind the furiously regular reque +10145|1439|79|4|47|63000.21|0.00|0.07|R|F|1995-05-27|1995-07-02|1995-06-14|TAKE BACK RETURN|FOB|regular pinto bea +10145|214|96|5|37|41225.77|0.10|0.03|N|O|1995-06-19|1995-06-29|1995-07-12|DELIVER IN PERSON|REG AIR|iously bold req +10145|1759|44|6|46|76394.50|0.02|0.05|N|F|1995-05-31|1995-07-21|1995-06-30|COLLECT COD|TRUCK|ial platelets above the furiously i +10146|281|36|1|32|37800.96|0.01|0.04|A|F|1994-05-29|1994-06-18|1994-06-09|COLLECT COD|FOB| ironic ideas. depo +10146|644|45|2|33|50973.12|0.07|0.05|A|F|1994-06-19|1994-07-21|1994-07-01|NONE|REG AIR|mptotes sleep furiously. slyl +10146|1346|85|3|13|16215.42|0.03|0.06|R|F|1994-05-10|1994-06-15|1994-06-04|COLLECT COD|REG AIR|ts. packages wake slyly against +10146|624|56|4|11|16770.82|0.05|0.07|R|F|1994-05-25|1994-07-31|1994-06-08|COLLECT COD|AIR|ously regular packages affix along the unus +10146|1161|70|5|31|32926.96|0.04|0.07|R|F|1994-07-27|1994-07-29|1994-08-03|DELIVER IN PERSON|MAIL|nic accounts. ideas sleep slyly +10146|1821|8|6|30|51684.60|0.03|0.08|A|F|1994-06-26|1994-07-18|1994-07-25|COLLECT COD|FOB|old ideas. slyly regular +10146|1439|40|7|20|26808.60|0.00|0.01|R|F|1994-05-16|1994-07-20|1994-06-05|NONE|FOB| blithely ironic notornis. furiously bo +10147|152|5|1|40|42086.00|0.08|0.07|A|F|1993-12-23|1993-11-14|1994-01-05|NONE|MAIL|fluffily bold pinto beans. ironic, +10147|1384|99|2|1|1285.38|0.06|0.08|A|F|1993-12-30|1993-11-14|1994-01-23|NONE|AIR| furiously even orbits. furious +10147|1907|96|3|10|18089.00|0.00|0.07|A|F|1993-11-13|1994-01-01|1993-12-13|DELIVER IN PERSON|SHIP|lar deposits. furiously +10147|1946|47|4|44|81309.36|0.10|0.07|A|F|1993-12-25|1993-12-18|1994-01-03|TAKE BACK RETURN|AIR|furiously regular packages. +10147|1382|59|5|47|60318.86|0.02|0.07|A|F|1993-10-15|1993-12-18|1993-10-22|TAKE BACK RETURN|AIR|lar packages. ironic depo +10148|1015|21|1|10|9160.10|0.00|0.01|R|F|1994-04-25|1994-05-15|1994-05-10|NONE|MAIL|g, regular hockey players cajole si +10148|1628|11|2|16|24473.92|0.02|0.02|R|F|1994-05-19|1994-06-02|1994-06-15|COLLECT COD|REG AIR| accounts. carefully final foxes among the +10148|1957|2|3|28|52050.60|0.07|0.08|A|F|1994-05-21|1994-06-24|1994-05-28|DELIVER IN PERSON|FOB|al accounts sleep finally carefu +10148|1806|7|4|33|56357.40|0.05|0.02|R|F|1994-05-20|1994-04-29|1994-06-01|TAKE BACK RETURN|FOB|equests slee +10149|687|50|1|32|50805.76|0.08|0.02|A|F|1994-10-03|1994-11-07|1994-11-02|COLLECT COD|RAIL|lithely? slyly final theo +10149|1631|14|2|46|70500.98|0.10|0.02|R|F|1994-11-04|1994-11-05|1994-12-03|TAKE BACK RETURN|TRUCK|l, regular instructions boost +10149|501|2|3|13|18219.50|0.10|0.06|R|F|1994-12-27|1994-11-19|1995-01-05|TAKE BACK RETURN|SHIP|tly stealthy requests are fluffily alongsid +10149|1641|24|4|8|12341.12|0.02|0.03|A|F|1994-12-19|1994-11-25|1995-01-06|DELIVER IN PERSON|MAIL| the regul +10149|139|40|5|23|23899.99|0.00|0.06|A|F|1995-01-15|1994-11-13|1995-01-21|COLLECT COD|RAIL|sly packages. slyly unusual package +10149|702|35|6|1|1602.70|0.07|0.04|A|F|1994-11-08|1994-10-28|1994-11-19|NONE|RAIL|nusual, express packages wak +10150|837|4|1|49|85153.67|0.02|0.03|A|F|1992-07-18|1992-07-21|1992-08-09|TAKE BACK RETURN|REG AIR|ess dolphins. blithely regular f +10150|1175|48|2|27|29056.59|0.00|0.00|R|F|1992-06-16|1992-06-03|1992-06-25|NONE|FOB|ackages. silent foxe +10150|549|80|3|41|59431.14|0.08|0.04|R|F|1992-05-12|1992-06-19|1992-06-05|NONE|MAIL|counts. excuses agains +10150|378|63|4|13|16618.81|0.10|0.01|A|F|1992-06-14|1992-06-01|1992-07-03|NONE|SHIP|ickly special accounts integrate quickly f +10150|541|32|5|28|40363.12|0.04|0.00|A|F|1992-06-10|1992-06-28|1992-06-17|DELIVER IN PERSON|TRUCK|efully even i +10150|539|100|6|44|63339.32|0.03|0.07|A|F|1992-08-29|1992-06-30|1992-09-19|NONE|REG AIR|e ironic ide +10151|1640|23|1|7|10791.48|0.10|0.06|R|F|1992-04-13|1992-03-07|1992-04-15|NONE|MAIL|nusual packages. furiously final instru +10176|321|22|1|46|56180.72|0.08|0.03|N|O|1996-09-01|1996-11-18|1996-09-20|TAKE BACK RETURN|TRUCK| never final, pending ac +10176|1857|44|2|29|51006.65|0.06|0.03|N|O|1996-11-14|1996-10-24|1996-12-13|TAKE BACK RETURN|TRUCK| slyly among the +10177|1353|30|1|43|53937.05|0.05|0.03|N|O|1996-09-20|1996-08-05|1996-10-13|COLLECT COD|FOB|realms. spe +10177|1187|96|2|32|34821.76|0.07|0.03|N|O|1996-07-14|1996-08-19|1996-08-02|DELIVER IN PERSON|TRUCK|inal packages sleep furiously entici +10177|965|34|3|41|76504.36|0.02|0.02|N|O|1996-07-12|1996-09-02|1996-07-23|NONE|SHIP|about the blithely regular packages. excus +10177|203|85|4|41|45231.20|0.03|0.04|N|O|1996-10-22|1996-08-21|1996-11-17|COLLECT COD|TRUCK|e ideas. slyly regular packages a +10177|175|54|5|1|1075.17|0.10|0.01|N|O|1996-08-19|1996-08-11|1996-08-22|TAKE BACK RETURN|TRUCK|er the carefully even +10178|1488|67|1|33|45852.84|0.00|0.01|A|F|1994-01-29|1994-02-27|1994-02-06|COLLECT COD|RAIL|oss the carefully s +10179|680|43|1|34|53743.12|0.09|0.03|N|O|1996-08-23|1996-06-27|1996-08-29|COLLECT COD|SHIP|ithely regu +10179|1660|2|2|31|48411.46|0.10|0.06|N|O|1996-07-26|1996-07-09|1996-08-10|COLLECT COD|AIR|courts. furiously ironi +10179|1414|54|3|44|57878.04|0.08|0.07|N|O|1996-06-02|1996-06-15|1996-06-16|DELIVER IN PERSON|REG AIR|the final instructions wake about the +10180|1252|90|1|9|10379.25|0.00|0.05|N|O|1997-04-23|1997-05-20|1997-04-28|COLLECT COD|SHIP|ly alongside of the +10180|493|94|2|29|40411.21|0.10|0.05|N|O|1997-04-28|1997-04-24|1997-05-02|NONE|FOB|cuses within the ironic, final pinto be +10180|1745|46|3|17|27994.58|0.04|0.01|N|O|1997-04-20|1997-05-23|1997-05-02|NONE|SHIP|counts are carefully bli +10181|673|67|1|12|18884.04|0.00|0.02|N|O|1996-03-25|1996-04-30|1996-03-29|DELIVER IN PERSON|FOB|nts sleep ca +10181|290|18|2|23|27376.67|0.07|0.06|N|O|1996-02-22|1996-04-09|1996-03-21|NONE|SHIP|ular, final excuses. furiou +10182|1418|58|1|44|58054.04|0.05|0.04|R|F|1994-06-24|1994-07-04|1994-07-20|DELIVER IN PERSON|SHIP|hins. furiou +10182|448|78|2|24|32362.56|0.04|0.08|A|F|1994-09-23|1994-08-16|1994-10-22|DELIVER IN PERSON|TRUCK|r dependencies wake. quickly special +10182|863|64|3|3|5291.58|0.03|0.07|A|F|1994-08-08|1994-07-25|1994-08-19|NONE|MAIL|ake furiously packages. pen +10182|1838|68|4|46|80032.18|0.05|0.08|A|F|1994-06-15|1994-07-28|1994-07-10|TAKE BACK RETURN|RAIL|ely across the deposits. slyly s +10182|1410|28|5|16|20982.56|0.05|0.05|R|F|1994-09-10|1994-08-21|1994-10-10|DELIVER IN PERSON|RAIL|e slyly regular +10183|538|29|1|33|47471.49|0.02|0.03|A|F|1995-03-02|1995-01-26|1995-03-17|NONE|SHIP|ckages hinder carefully. furiously +10183|1140|13|2|2|2082.28|0.03|0.00|R|F|1995-02-24|1995-01-03|1995-03-19|DELIVER IN PERSON|FOB|lent packages against the furiously final t +10183|675|38|3|1|1575.67|0.00|0.06|A|F|1994-12-23|1995-01-29|1995-01-09|DELIVER IN PERSON|FOB|. carefully final requests could wake among +10183|1140|49|4|19|19781.66|0.05|0.03|R|F|1995-02-09|1995-01-19|1995-02-25|TAKE BACK RETURN|MAIL|y unusual sheaves +10183|1809|96|5|15|25662.00|0.02|0.07|A|F|1995-03-25|1995-01-23|1995-04-02|DELIVER IN PERSON|MAIL|sual packages. quiet, special excuses at +10183|107|34|6|13|13092.30|0.08|0.05|A|F|1994-11-26|1995-02-11|1994-12-08|TAKE BACK RETURN|FOB|ests alongside of the furiously ironic +10208|1767|52|1|31|51731.56|0.08|0.05|N|O|1996-11-16|1996-11-18|1996-12-05|NONE|RAIL|al requests; ironic, ironi +10208|392|93|2|44|56865.16|0.00|0.03|N|O|1996-09-29|1996-09-28|1996-10-08|NONE|REG AIR| above the final packages. fluffily regular +10208|416|46|3|38|50023.58|0.01|0.04|N|O|1996-10-20|1996-10-06|1996-10-25|TAKE BACK RETURN|FOB|ent instructions haggle around the slyly sp +10208|1406|7|4|22|28762.80|0.06|0.02|N|O|1996-09-24|1996-09-26|1996-10-24|TAKE BACK RETURN|FOB|nusual accounts. r +10208|1019|90|5|2|1840.02|0.08|0.03|N|O|1996-10-24|1996-11-13|1996-11-06|DELIVER IN PERSON|MAIL|rding to the brave, bold asympto +10208|1931|76|6|26|47656.18|0.07|0.08|N|O|1996-11-19|1996-10-03|1996-11-28|TAKE BACK RETURN|TRUCK|the idle, unusual instructions. fluffily fi +10208|1435|53|7|41|54793.63|0.10|0.00|N|O|1996-10-30|1996-10-27|1996-11-20|TAKE BACK RETURN|TRUCK|ly bold packag +10209|1606|48|1|44|66334.40|0.04|0.07|A|F|1994-02-20|1994-01-17|1994-03-04|COLLECT COD|REG AIR|iously along the bold foxes: furiously fina +10209|1470|49|2|18|24686.46|0.05|0.06|A|F|1994-02-07|1993-12-31|1994-02-08|TAKE BACK RETURN|FOB|of the blit +10209|1392|31|3|46|59495.94|0.02|0.07|R|F|1994-03-07|1994-01-11|1994-03-31|DELIVER IN PERSON|MAIL| alongside of the blithely regular pa +10209|1717|44|4|27|43705.17|0.10|0.08|R|F|1993-12-14|1994-02-21|1994-01-02|COLLECT COD|MAIL|egular pinto bean +10209|597|88|5|47|70386.73|0.00|0.05|A|F|1994-01-22|1994-01-05|1994-02-07|DELIVER IN PERSON|REG AIR| even ideas +10209|1981|70|6|31|58372.38|0.03|0.01|A|F|1993-12-03|1994-02-28|1993-12-12|COLLECT COD|TRUCK|e. quickly even th +10209|431|32|7|50|66571.50|0.00|0.07|A|F|1994-01-20|1994-02-17|1994-02-16|NONE|TRUCK|tes are according to the regular asymptote +10210|1029|65|1|8|7440.16|0.02|0.02|N|O|1995-10-11|1995-09-22|1995-11-08|NONE|AIR|uick orbits. slyl +10210|1754|55|2|11|18213.25|0.10|0.04|N|O|1995-08-08|1995-08-31|1995-08-10|DELIVER IN PERSON|FOB|y express dependencies wake furiously +10210|471|1|3|36|49372.92|0.02|0.03|N|O|1995-10-20|1995-09-19|1995-11-10|TAKE BACK RETURN|RAIL|across the w +10210|1070|41|4|11|10681.77|0.03|0.05|N|O|1995-09-06|1995-09-14|1995-09-11|COLLECT COD|REG AIR|es wake blit +10210|1292|67|5|42|50118.18|0.06|0.01|N|O|1995-10-13|1995-08-26|1995-10-18|NONE|AIR|tegrate bl +10210|1247|48|6|4|4592.96|0.04|0.03|N|O|1995-07-11|1995-08-21|1995-07-12|NONE|MAIL|nding patterns sleep excuses. regular +10210|334|63|7|10|12343.30|0.09|0.00|N|O|1995-07-02|1995-07-27|1995-08-01|COLLECT COD|TRUCK| even accounts ar +10211|470|100|1|44|60300.68|0.09|0.06|N|O|1997-10-07|1997-09-11|1997-10-22|DELIVER IN PERSON|TRUCK|ng the carefully unusual deposits +10211|1447|87|2|21|28317.24|0.04|0.07|N|O|1997-10-24|1997-09-24|1997-11-07|NONE|MAIL| are throughout the carefully +10211|399|84|3|15|19490.85|0.03|0.03|N|O|1997-11-26|1997-08-30|1997-12-20|NONE|RAIL|furiously fi +10211|786|51|4|28|47229.84|0.08|0.07|N|O|1997-10-12|1997-10-19|1997-11-09|TAKE BACK RETURN|SHIP|cuses. carefully brave req +10211|90|66|5|42|41583.78|0.08|0.02|N|O|1997-10-30|1997-10-02|1997-11-08|DELIVER IN PERSON|AIR|ithely express theodolites. bli +10212|1282|20|1|23|27215.44|0.09|0.03|A|F|1993-08-09|1993-08-10|1993-08-19|TAKE BACK RETURN|MAIL| haggle blithely. final, bold +10212|1080|51|2|40|39243.20|0.01|0.00|A|F|1993-08-17|1993-08-18|1993-08-18|COLLECT COD|AIR|slowly final pack +10212|536|97|3|46|66080.38|0.06|0.00|A|F|1993-07-06|1993-07-06|1993-07-12|NONE|MAIL|counts sleep. final asymptotes are sl +10213|1516|57|1|4|5670.04|0.00|0.02|A|F|1995-03-15|1995-03-24|1995-04-12|DELIVER IN PERSON|MAIL|tes. unusual requests cajole care +10213|1821|51|2|9|15505.38|0.10|0.08|N|F|1995-06-14|1995-04-24|1995-07-01|NONE|REG AIR|uctions boost slyly about the flu +10213|1829|59|3|13|22500.66|0.03|0.01|N|F|1995-05-28|1995-03-22|1995-06-22|TAKE BACK RETURN|MAIL|into beans. blithe deposits wake carefully +10214|367|96|1|22|27881.92|0.02|0.02|N|O|1996-03-08|1996-04-09|1996-04-03|DELIVER IN PERSON|REG AIR|ove the frets cajo +10214|947|16|2|5|9239.70|0.01|0.03|N|O|1996-03-20|1996-04-15|1996-04-09|TAKE BACK RETURN|RAIL| regular, express sheaves cajole fluf +10214|772|37|3|40|66910.80|0.01|0.06|N|O|1996-04-16|1996-04-17|1996-04-22|NONE|REG AIR|xpress accounts cajo +10214|921|22|4|20|36438.40|0.04|0.08|N|O|1996-03-15|1996-03-04|1996-04-10|TAKE BACK RETURN|RAIL|ructions. carefully close +10215|1604|5|1|1|1505.60|0.00|0.05|N|O|1996-11-18|1996-11-07|1996-11-29|COLLECT COD|SHIP|c accounts boost carefu +10215|1683|7|2|30|47540.40|0.05|0.02|N|O|1996-10-13|1996-11-15|1996-10-27|TAKE BACK RETURN|FOB|are. stealthily r +10215|517|18|3|17|24097.67|0.10|0.00|N|O|1996-08-31|1996-10-10|1996-09-26|DELIVER IN PERSON|MAIL|ly special foxes among the +10215|1410|50|4|9|11802.69|0.02|0.02|N|O|1996-11-27|1996-09-19|1996-12-05|COLLECT COD|AIR|furiously among the slyl +10215|1635|18|5|47|72221.61|0.04|0.08|N|O|1996-11-21|1996-10-07|1996-12-11|NONE|SHIP|sly unusual requests boost +10240|353|10|1|33|41360.55|0.02|0.02|A|F|1994-08-01|1994-06-19|1994-08-06|COLLECT COD|FOB|express asymptote +10241|416|4|1|27|35543.07|0.06|0.02|N|O|1997-12-01|1997-12-06|1997-12-22|DELIVER IN PERSON|TRUCK|ckly unusual foxes ha +10241|90|66|2|20|19801.80|0.02|0.05|N|O|1997-10-21|1997-10-30|1997-11-11|TAKE BACK RETURN|TRUCK| the ironic +10242|324|81|1|44|53870.08|0.00|0.03|R|F|1994-02-01|1994-02-02|1994-02-02|COLLECT COD|RAIL| dependencies boost furiously among +10242|1444|45|2|8|10763.52|0.10|0.00|R|F|1994-03-02|1994-03-11|1994-03-14|TAKE BACK RETURN|RAIL|ronic instructions. instructions on the fin +10242|1694|95|3|3|4787.07|0.05|0.05|A|F|1994-04-03|1994-03-10|1994-04-27|TAKE BACK RETURN|SHIP|e stealthily i +10242|1640|23|4|30|46249.20|0.01|0.01|R|F|1993-12-16|1994-02-18|1994-01-08|TAKE BACK RETURN|FOB|ve slyly. blithely even +10242|1740|83|5|9|14775.66|0.03|0.07|A|F|1994-03-23|1994-03-04|1994-04-05|TAKE BACK RETURN|AIR|tructions h +10242|1302|17|6|23|27675.90|0.07|0.05|A|F|1994-01-26|1994-02-02|1994-02-19|DELIVER IN PERSON|REG AIR|lites nag blithely. iron +10242|1158|67|7|32|33892.80|0.02|0.06|A|F|1994-03-29|1994-01-25|1994-04-03|COLLECT COD|SHIP|ithely. blithel +10243|1851|38|1|40|70114.00|0.01|0.04|N|O|1996-04-21|1996-02-01|1996-04-25|DELIVER IN PERSON|RAIL| accounts integrate carefully ca +10244|54|5|1|19|18126.95|0.10|0.02|N|O|1996-04-22|1996-06-11|1996-05-11|COLLECT COD|AIR|e carefully special dependencies. depos +10244|24|100|2|48|44352.96|0.07|0.05|N|O|1996-07-22|1996-05-09|1996-07-24|TAKE BACK RETURN|SHIP| regular deposits +10244|1126|99|3|21|21569.52|0.05|0.01|N|O|1996-07-29|1996-06-03|1996-08-16|DELIVER IN PERSON|FOB|across the slyly special acc +10244|1790|17|4|28|47370.12|0.01|0.04|N|O|1996-08-02|1996-05-26|1996-08-09|TAKE BACK RETURN|REG AIR|s alongside of the ir +10245|1287|88|1|49|58225.72|0.08|0.02|R|F|1995-03-18|1995-03-21|1995-04-17|TAKE BACK RETURN|SHIP|ag furiously. fur +10245|1444|23|2|5|6727.20|0.06|0.01|A|F|1995-05-06|1995-05-07|1995-05-14|TAKE BACK RETURN|FOB|ins. final packages sublate never +10245|1902|3|3|2|3607.80|0.02|0.05|R|F|1995-04-17|1995-04-09|1995-05-10|DELIVER IN PERSON|REG AIR|riously dar +10245|1712|55|4|50|80685.50|0.06|0.03|R|F|1995-04-08|1995-04-25|1995-04-21|TAKE BACK RETURN|AIR|ding to the blithely regula +10245|226|8|5|39|43922.58|0.04|0.01|R|F|1995-03-08|1995-04-12|1995-03-19|NONE|SHIP|s final accounts sleep blithely regular ins +10245|850|51|6|48|84040.80|0.06|0.00|A|F|1995-03-22|1995-04-06|1995-04-10|DELIVER IN PERSON|TRUCK|t the stea +10245|107|86|7|4|4028.40|0.01|0.01|R|F|1995-03-23|1995-03-19|1995-04-02|NONE|SHIP|posits. idly unu +10246|996|99|1|50|94849.50|0.07|0.02|N|O|1997-10-04|1997-09-07|1997-10-15|COLLECT COD|SHIP|eodolites. blithel +10246|1532|33|2|13|18635.89|0.10|0.06|N|O|1997-08-24|1997-07-21|1997-09-03|NONE|AIR| haggle blithely pending pinto b +10246|244|26|3|11|12586.64|0.09|0.04|N|O|1997-09-11|1997-09-01|1997-10-03|NONE|REG AIR|y stealthy tithes. special, regular in +10246|1736|79|4|42|68784.66|0.06|0.06|N|O|1997-08-08|1997-08-10|1997-08-21|COLLECT COD|REG AIR|iously special dependencies kindle? fur +10247|616|79|1|13|19715.93|0.01|0.01|A|F|1993-01-25|1993-03-28|1993-02-23|COLLECT COD|REG AIR|instructions. pinto beans hagg +10247|199|100|2|42|46165.98|0.09|0.08|A|F|1993-02-12|1993-03-13|1993-03-02|COLLECT COD|SHIP|t deposits grow slyly along the fi +10247|792|25|3|45|76175.55|0.08|0.04|R|F|1993-02-06|1993-03-12|1993-02-12|DELIVER IN PERSON|MAIL|ges maintain furiously even pinto bea +10247|1403|4|4|2|2608.80|0.06|0.07|A|F|1993-03-07|1993-04-03|1993-03-27|DELIVER IN PERSON|SHIP|press pinto beans print furiously +10247|1060|96|5|42|40364.52|0.04|0.04|A|F|1993-03-31|1993-04-11|1993-04-21|TAKE BACK RETURN|TRUCK|y pending pinto beans: +10247|1589|10|6|5|7452.90|0.06|0.01|A|F|1993-02-22|1993-02-25|1993-02-27|DELIVER IN PERSON|FOB|ilent foxe +10272|156|57|1|34|35909.10|0.03|0.04|R|F|1994-03-12|1994-04-07|1994-03-27|NONE|TRUCK|lent requests. packages boost agai +10272|937|38|2|46|84544.78|0.03|0.06|R|F|1994-02-02|1994-04-16|1994-02-22|DELIVER IN PERSON|TRUCK|ly bold excus +10272|1955|56|3|14|25997.30|0.06|0.04|A|F|1994-03-01|1994-02-20|1994-03-27|COLLECT COD|SHIP|s boost slyly even theodolites. carefully f +10272|1582|23|4|16|23737.28|0.00|0.07|R|F|1994-02-08|1994-04-10|1994-03-09|NONE|REG AIR|ic asymptotes cajole among the +10272|1578|59|5|35|51784.95|0.05|0.07|R|F|1994-02-13|1994-02-22|1994-02-14|NONE|RAIL|luffily final inst +10272|376|33|6|18|22974.66|0.04|0.07|A|F|1994-04-27|1994-03-08|1994-05-01|TAKE BACK RETURN|FOB|l foxes nag +10272|1792|19|7|32|54201.28|0.02|0.01|A|F|1994-05-11|1994-04-12|1994-05-23|DELIVER IN PERSON|RAIL| across th +10273|1970|15|1|21|39311.37|0.06|0.06|N|O|1998-06-29|1998-07-15|1998-07-07|COLLECT COD|REG AIR|y unusual platelets are quickly final pint +10273|228|29|2|50|56411.00|0.05|0.03|N|O|1998-07-08|1998-07-03|1998-07-27|COLLECT COD|SHIP|. carefully stealthy ideas a +10273|303|88|3|47|56555.10|0.03|0.00|N|O|1998-07-09|1998-07-11|1998-07-21|COLLECT COD|FOB|pecial packages among th +10273|1650|74|4|23|35687.95|0.02|0.01|N|O|1998-05-30|1998-06-09|1998-06-06|TAKE BACK RETURN|FOB|along the regular, unusual requests. fl +10273|1318|95|5|33|40237.23|0.02|0.06|N|O|1998-07-09|1998-06-10|1998-07-29|DELIVER IN PERSON|FOB|ole bold, bold th +10273|152|5|6|49|51555.35|0.10|0.00|N|O|1998-06-18|1998-06-11|1998-07-17|DELIVER IN PERSON|TRUCK|es. furiously final dolphins wake furiousl +10274|254|82|1|26|30010.50|0.04|0.03|R|F|1993-12-17|1994-01-09|1994-01-01|TAKE BACK RETURN|MAIL|dencies haggle. furiously even packa +10274|342|99|2|17|21119.78|0.03|0.03|R|F|1994-03-27|1994-02-03|1994-04-15|TAKE BACK RETURN|SHIP| furiously p +10275|1707|8|1|12|19304.40|0.00|0.01|N|O|1997-08-31|1997-08-14|1997-09-17|DELIVER IN PERSON|AIR|ts use alongside of the g +10275|1674|57|2|36|56724.12|0.02|0.06|N|O|1997-07-12|1997-08-08|1997-07-24|TAKE BACK RETURN|TRUCK|he slyly regular depo +10276|1240|52|1|39|44508.36|0.09|0.03|N|O|1996-06-24|1996-04-15|1996-07-14|DELIVER IN PERSON|SHIP|s cajole. regula +10276|618|50|2|45|68337.45|0.03|0.08|N|O|1996-06-21|1996-04-16|1996-07-17|COLLECT COD|SHIP| even requests haggle. even, +10276|1417|96|3|29|38233.89|0.06|0.03|N|O|1996-05-25|1996-05-07|1996-05-27|NONE|TRUCK|ses breach. final ideas are carefully +10276|487|46|4|43|59661.64|0.09|0.06|N|O|1996-05-31|1996-04-22|1996-06-18|COLLECT COD|RAIL|y express depths mold slyly regular +10276|558|19|5|40|58342.00|0.09|0.07|N|O|1996-04-13|1996-04-01|1996-05-10|DELIVER IN PERSON|SHIP| bold platelets. stealthy r +10277|1275|50|1|12|14115.24|0.07|0.07|A|F|1994-07-27|1994-05-22|1994-08-11|NONE|RAIL| according to the furiously silent th +10277|683|84|2|8|12669.44|0.04|0.07|R|F|1994-04-25|1994-06-14|1994-05-11|COLLECT COD|SHIP|ing asymptotes unwind s +10277|811|12|3|45|77031.45|0.10|0.05|A|F|1994-06-25|1994-06-26|1994-07-01|NONE|AIR|ual deposits. deposits nag to the blith +10277|793|90|4|21|35569.59|0.00|0.06|R|F|1994-08-07|1994-06-20|1994-08-18|NONE|FOB|cajole. blithely careful ideas dete +10277|688|51|5|1|1588.68|0.05|0.08|R|F|1994-07-21|1994-06-04|1994-08-05|COLLECT COD|RAIL| ironic instructions. q +10278|1796|97|1|34|57724.86|0.07|0.01|N|O|1995-11-02|1995-12-10|1995-11-06|DELIVER IN PERSON|AIR|kly even packages above the furiou +10278|289|90|2|28|33299.84|0.04|0.06|N|O|1995-12-01|1995-12-06|1995-12-15|COLLECT COD|AIR|e the special instruction +10278|1314|91|3|21|25521.51|0.05|0.02|N|O|1995-10-19|1995-10-14|1995-11-12|TAKE BACK RETURN|TRUCK|requests. regular +10278|602|34|4|36|54093.60|0.10|0.01|N|O|1995-09-24|1995-11-21|1995-10-06|NONE|FOB|nts against t +10279|1445|46|1|29|39046.76|0.07|0.00|N|O|1996-10-22|1996-12-13|1996-11-17|COLLECT COD|FOB|r the blith +10279|182|9|2|29|31383.22|0.01|0.00|N|O|1996-11-18|1996-10-22|1996-11-22|TAKE BACK RETURN|MAIL|ronic accounts. carefully regular +10279|916|51|3|47|85394.77|0.00|0.01|N|O|1996-11-16|1996-11-19|1996-12-10|COLLECT COD|FOB|dolites cajole carefu +10279|352|37|4|15|18785.25|0.01|0.05|N|O|1997-01-02|1996-11-05|1997-01-11|COLLECT COD|MAIL|ully carefully special reques +10279|417|18|5|42|55331.22|0.06|0.05|N|O|1997-01-18|1996-11-14|1997-02-07|DELIVER IN PERSON|FOB|ithely close +10304|21|72|1|20|18420.40|0.07|0.05|N|O|1996-02-13|1996-01-28|1996-03-07|COLLECT COD|SHIP|ges across th +10304|768|33|2|35|58406.60|0.05|0.02|N|O|1996-01-18|1996-01-19|1996-02-02|COLLECT COD|SHIP|ep furiously above the pending de +10304|1506|47|3|40|56300.00|0.09|0.04|N|O|1995-11-17|1995-12-23|1995-12-06|NONE|SHIP|ding to the pending pack +10304|427|57|4|3|3982.26|0.04|0.08|N|O|1996-01-14|1996-01-23|1996-02-10|NONE|REG AIR|express sauternes +10304|199|26|5|36|39570.84|0.05|0.08|N|O|1995-11-30|1996-01-14|1995-12-16|NONE|AIR|fter the quickly +10304|870|71|6|43|76147.41|0.01|0.03|N|O|1996-01-29|1995-12-27|1996-02-26|COLLECT COD|REG AIR| quickly blithely regul +10304|1310|11|7|43|52086.33|0.06|0.07|N|O|1996-02-20|1996-02-06|1996-03-13|DELIVER IN PERSON|SHIP| to the caref +10305|710|11|1|36|57985.56|0.01|0.08|R|F|1994-08-13|1994-09-09|1994-08-29|TAKE BACK RETURN|TRUCK|s detect blithely final packages +10305|1068|39|2|1|969.06|0.08|0.06|A|F|1994-10-14|1994-09-18|1994-10-30|TAKE BACK RETURN|RAIL|g to the slyly unusual deposits. furio +10305|560|91|3|40|58422.40|0.09|0.07|A|F|1994-09-18|1994-09-26|1994-09-23|DELIVER IN PERSON|AIR|never special +10305|1982|83|4|17|32027.66|0.02|0.02|A|F|1994-08-11|1994-09-17|1994-09-07|NONE|FOB|en deposits boost. pinto beans pr +10305|1995|96|5|1|1896.99|0.08|0.05|A|F|1994-08-05|1994-09-23|1994-09-02|DELIVER IN PERSON|RAIL|to the slyly final de +10306|1210|11|1|8|8889.68|0.04|0.02|A|F|1993-07-26|1993-09-21|1993-08-12|TAKE BACK RETURN|TRUCK|es use slyly slyly ironic accounts. qui +10306|1785|70|2|18|30362.04|0.03|0.05|R|F|1993-10-22|1993-08-27|1993-10-29|TAKE BACK RETURN|AIR|uests cajole fluffily-- re +10306|558|49|3|36|52507.80|0.05|0.04|A|F|1993-10-21|1993-08-24|1993-10-27|COLLECT COD|FOB|final theodolites wake blithel +10307|489|48|1|40|55579.20|0.02|0.00|N|O|1998-05-26|1998-04-28|1998-06-10|DELIVER IN PERSON|TRUCK|ully express +10307|579|80|2|50|73978.50|0.03|0.05|N|O|1998-02-18|1998-03-21|1998-02-27|DELIVER IN PERSON|MAIL|e furiously p +10307|681|44|3|30|47450.40|0.00|0.05|N|O|1998-04-22|1998-04-01|1998-04-24|DELIVER IN PERSON|REG AIR| regular deposits are a +10307|1864|8|4|29|51209.94|0.08|0.06|N|O|1998-03-10|1998-04-28|1998-04-02|COLLECT COD|SHIP|oze. furiously express the +10307|1143|16|5|1|1044.14|0.02|0.08|N|O|1998-04-26|1998-03-23|1998-05-10|NONE|TRUCK| beans haggl +10308|88|64|1|49|48415.92|0.06|0.07|A|F|1995-05-09|1995-06-27|1995-05-30|TAKE BACK RETURN|REG AIR|arly regular requests. even, pendi +10308|1622|23|2|27|41137.74|0.06|0.02|N|O|1995-06-27|1995-06-30|1995-07-05|DELIVER IN PERSON|RAIL|ronic instructions above the blithe +10308|1248|23|3|4|4596.96|0.04|0.08|R|F|1995-05-08|1995-06-04|1995-05-29|COLLECT COD|SHIP|iously regular pinto beans detect quickly +10308|734|35|4|41|67023.93|0.04|0.05|N|O|1995-07-25|1995-07-15|1995-08-03|DELIVER IN PERSON|FOB|ing to the final, even packages. e +10308|1782|9|5|42|70718.76|0.08|0.05|N|O|1995-08-04|1995-06-30|1995-08-13|NONE|AIR|ests haggle carefully pen +10308|1402|81|6|39|50832.60|0.04|0.02|R|F|1995-05-07|1995-07-20|1995-05-16|NONE|MAIL|ents. forges nag slyly. furiousl +10309|694|88|1|20|31893.80|0.10|0.00|R|F|1995-01-18|1995-02-08|1995-01-27|COLLECT COD|MAIL|ges cajole alongside of the furiously +10309|1073|44|2|30|29222.10|0.01|0.01|A|F|1995-02-22|1995-01-19|1995-03-19|COLLECT COD|AIR|regular foxes. p +10309|845|45|3|19|33170.96|0.01|0.03|A|F|1995-01-23|1994-12-22|1995-02-03|NONE|FOB|the slyly final excuse +10309|467|68|4|12|16409.52|0.06|0.04|R|F|1995-01-11|1995-01-20|1995-01-19|NONE|SHIP|uffily special requests. +10309|439|27|5|47|62953.21|0.04|0.05|R|F|1994-12-30|1995-01-19|1995-01-15|NONE|TRUCK|nal pinto beans nag among the quick +10309|126|79|6|44|45149.28|0.04|0.03|A|F|1994-12-06|1994-12-26|1994-12-14|DELIVER IN PERSON|REG AIR|lly regular ideas against the blithely p +10310|202|3|1|36|39679.20|0.08|0.07|A|F|1994-03-09|1994-04-08|1994-03-21|DELIVER IN PERSON|AIR|telets. sly +10310|850|17|2|33|57778.05|0.09|0.07|R|F|1994-03-24|1994-03-14|1994-03-29|COLLECT COD|TRUCK|fully special deposits run +10310|1429|47|3|7|9312.94|0.08|0.02|R|F|1994-04-03|1994-03-31|1994-04-06|DELIVER IN PERSON|MAIL|lyly final ideas. +10310|1878|65|4|50|88993.50|0.01|0.08|R|F|1994-02-19|1994-05-07|1994-03-21|TAKE BACK RETURN|REG AIR|e furiously regular deposits. regular, +10310|1443|22|5|12|16133.28|0.10|0.01|R|F|1994-06-04|1994-03-29|1994-07-04|NONE|AIR|thely. even packag +10311|965|100|1|3|5597.88|0.09|0.02|R|F|1992-11-12|1992-09-18|1992-11-27|TAKE BACK RETURN|TRUCK|even requests haggle +10336|532|63|1|16|22920.48|0.10|0.05|N|O|1997-07-09|1997-08-11|1997-07-18|NONE|RAIL|sleep blithely. deposits detect +10336|607|8|2|24|36182.40|0.08|0.08|N|O|1997-06-16|1997-09-04|1997-07-08|DELIVER IN PERSON|REG AIR|ly furiously unusual deposi +10337|1035|36|1|7|6552.21|0.06|0.08|N|O|1996-04-22|1996-05-13|1996-05-18|DELIVER IN PERSON|FOB|carefully specia +10337|1566|47|2|9|13208.04|0.04|0.02|N|O|1996-07-02|1996-06-03|1996-07-20|NONE|REG AIR|ully bold packages! carefully slow +10337|672|4|3|4|6290.68|0.01|0.07|N|O|1996-05-24|1996-06-05|1996-05-30|NONE|MAIL|ly unusual depe +10337|924|59|4|20|36498.40|0.03|0.04|N|O|1996-05-09|1996-06-06|1996-05-28|DELIVER IN PERSON|AIR|s are across the fluffily regular deposi +10338|400|1|1|2|2600.80|0.05|0.06|N|O|1995-08-01|1995-09-02|1995-08-07|DELIVER IN PERSON|AIR| deposits integrate slyly slyly unusual i +10338|1152|61|2|6|6318.90|0.08|0.08|N|O|1995-08-12|1995-09-08|1995-08-13|TAKE BACK RETURN|REG AIR|dle pinto beans. slyly even pinto beans +10338|106|85|3|38|38231.80|0.01|0.07|N|O|1995-09-09|1995-09-01|1995-09-12|COLLECT COD|AIR|. enticing ideas lose about t +10338|113|14|4|4|4052.44|0.07|0.06|N|O|1995-09-01|1995-08-20|1995-09-27|NONE|MAIL|its. dependencies hinder. +10338|1248|60|5|2|2298.48|0.09|0.07|N|O|1995-09-09|1995-08-27|1995-09-21|NONE|MAIL| blithely regu +10338|1580|61|6|30|44447.40|0.06|0.07|N|O|1995-11-01|1995-08-14|1995-11-13|NONE|RAIL| requests +10339|864|98|1|20|35297.20|0.06|0.00|N|O|1996-02-05|1995-12-19|1996-03-01|TAKE BACK RETURN|TRUCK|ages are blithely around the asym +10339|103|56|2|48|48148.80|0.07|0.05|N|O|1996-01-24|1995-12-02|1996-02-04|NONE|FOB|ular theodolites haggle. furiousl +10339|969|4|3|19|35529.24|0.00|0.01|N|O|1995-12-25|1996-01-10|1996-01-24|DELIVER IN PERSON|MAIL|odolites. slyly ir +10340|50|76|1|47|44652.35|0.06|0.05|N|O|1995-09-08|1995-08-11|1995-09-24|COLLECT COD|TRUCK|riously even platelets hagg +10340|1640|82|2|37|57040.68|0.00|0.05|N|O|1995-07-15|1995-08-07|1995-08-10|DELIVER IN PERSON|SHIP|aggle carefully regular ideas. slyly +10340|1141|78|3|12|12505.68|0.09|0.04|N|O|1995-08-05|1995-09-16|1995-08-20|DELIVER IN PERSON|SHIP|accounts boost against the caref +10340|24|25|4|19|17556.38|0.01|0.01|N|O|1995-08-08|1995-08-11|1995-08-18|NONE|AIR|blithely ironic +10340|1564|45|5|27|39570.12|0.01|0.01|N|O|1995-07-04|1995-07-30|1995-07-14|DELIVER IN PERSON|MAIL|cajole against the +10340|639|2|6|43|66204.09|0.01|0.08|N|O|1995-09-16|1995-08-30|1995-09-23|NONE|RAIL|! carefully special pint +10341|380|37|1|8|10243.04|0.09|0.07|R|F|1993-03-22|1993-01-30|1993-04-20|TAKE BACK RETURN|AIR|l dependencie +10341|966|67|2|41|76545.36|0.09|0.00|R|F|1993-03-02|1993-02-17|1993-03-11|COLLECT COD|FOB|posits. carefully regular deposits cajole f +10341|26|52|3|47|43522.94|0.06|0.04|A|F|1993-01-31|1993-01-31|1993-02-16|NONE|FOB|ix boldly instructions. daringl +10341|1833|77|4|43|74597.69|0.00|0.04|R|F|1993-01-13|1993-02-17|1993-02-09|COLLECT COD|SHIP|press packages believe above the +10341|781|82|5|21|35317.38|0.00|0.05|R|F|1993-01-19|1993-01-21|1993-01-27|COLLECT COD|FOB|fully quickly unusual accounts. furiously +10341|412|71|6|11|14436.51|0.08|0.06|A|F|1993-02-02|1993-03-16|1993-02-16|DELIVER IN PERSON|RAIL| dependencies are stealthily ab +10342|1563|4|1|19|27826.64|0.02|0.04|N|O|1996-01-05|1996-01-10|1996-01-14|NONE|TRUCK|ag slyly. packages across th +10342|1978|11|2|50|93998.50|0.06|0.05|N|O|1995-12-12|1996-02-10|1995-12-27|TAKE BACK RETURN|TRUCK| pending ideas alo +10342|1722|49|3|8|12989.76|0.10|0.00|N|O|1996-01-14|1995-12-25|1996-01-27|COLLECT COD|AIR|gular foxes past the +10342|1832|19|4|41|71087.03|0.04|0.06|N|O|1996-02-03|1996-02-09|1996-02-10|TAKE BACK RETURN|TRUCK|en deposit +10342|1591|92|5|42|62688.78|0.00|0.02|N|O|1996-01-15|1996-01-04|1996-02-05|TAKE BACK RETURN|AIR|close packages slee +10342|627|59|6|3|4582.86|0.08|0.00|N|O|1996-02-20|1996-01-16|1996-03-19|COLLECT COD|MAIL|n instructions are furiously caref +10343|793|26|1|27|45732.33|0.08|0.05|A|F|1992-03-31|1992-05-20|1992-04-06|NONE|AIR|es. carefully stealthy requests +10368|1600|81|1|43|64568.80|0.04|0.04|N|O|1996-07-24|1996-08-11|1996-08-02|COLLECT COD|SHIP| special grouches wake furiously along th +10369|1257|95|1|43|49804.75|0.01|0.04|N|O|1996-03-06|1996-01-15|1996-03-26|DELIVER IN PERSON|TRUCK|sts nag carefully. carefully even pear +10369|1776|61|2|45|75499.65|0.08|0.00|N|O|1995-11-17|1995-12-16|1995-11-24|DELIVER IN PERSON|REG AIR|about the special, unusual multipli +10370|1377|54|1|35|44742.95|0.07|0.01|A|F|1994-07-26|1994-06-16|1994-08-06|DELIVER IN PERSON|REG AIR|eans haggle slyly slyly regular i +10370|841|8|2|41|71415.44|0.05|0.04|A|F|1994-08-17|1994-06-02|1994-09-14|NONE|REG AIR|ual accounts. quickly special pinto beans b +10371|449|50|1|24|32386.56|0.09|0.00|A|F|1994-11-21|1994-12-06|1994-12-08|NONE|REG AIR| quickly bold pinto beans. regular platelet +10371|1398|37|2|43|55873.77|0.08|0.05|A|F|1994-09-21|1994-10-17|1994-10-01|DELIVER IN PERSON|AIR|eposits pr +10371|1853|97|3|50|87742.50|0.00|0.02|A|F|1994-12-05|1994-12-04|1994-12-11|DELIVER IN PERSON|MAIL|gular deposits. +10371|38|39|4|35|32831.05|0.09|0.06|A|F|1994-10-19|1994-11-15|1994-10-30|DELIVER IN PERSON|SHIP|ly bold ideas haggle. blithe +10372|586|17|1|50|74329.00|0.03|0.04|N|O|1995-07-11|1995-09-24|1995-07-21|DELIVER IN PERSON|REG AIR|gular foxes. express +10372|1009|15|2|30|27300.00|0.03|0.02|N|O|1995-10-23|1995-08-04|1995-10-24|NONE|SHIP|sits. blithely regular asymptotes boost bl +10373|1253|28|1|45|51941.25|0.01|0.06|A|F|1993-08-10|1993-08-10|1993-09-01|NONE|FOB|ironic packages sleep +10373|640|41|2|45|69328.80|0.04|0.06|R|F|1993-09-04|1993-09-19|1993-09-12|TAKE BACK RETURN|AIR| slyly near the pending packages-- ironic +10373|361|62|3|12|15136.32|0.09|0.05|A|F|1993-10-16|1993-07-31|1993-11-03|NONE|RAIL|d hockey p +10373|286|87|4|3|3558.84|0.00|0.08|A|F|1993-10-18|1993-08-19|1993-11-02|TAKE BACK RETURN|MAIL|final requests. regular, regular theo +10373|1627|10|5|48|73373.76|0.01|0.05|A|F|1993-10-16|1993-09-22|1993-10-22|NONE|SHIP|s requests. furiously final reque +10373|1455|73|6|25|33911.25|0.02|0.06|R|F|1993-08-14|1993-09-02|1993-08-20|NONE|SHIP|uriously about t +10374|1536|17|1|19|27313.07|0.00|0.04|A|F|1993-11-09|1993-09-24|1993-11-16|DELIVER IN PERSON|RAIL|. even requ +10375|779|12|1|7|11758.39|0.00|0.03|N|O|1997-04-10|1997-03-10|1997-04-18|TAKE BACK RETURN|TRUCK|nding pinto beans wake. deposits above +10375|59|35|2|23|22058.15|0.06|0.05|N|O|1997-02-08|1997-03-20|1997-02-20|TAKE BACK RETURN|TRUCK|ly regular deposits sleep care +10375|1196|5|3|21|23040.99|0.05|0.01|N|O|1997-03-16|1997-03-10|1997-04-09|TAKE BACK RETURN|AIR| requests. dep +10400|1460|100|1|50|68073.00|0.07|0.04|N|O|1996-11-07|1996-11-27|1996-11-19|NONE|REG AIR|al platelets play carefully even +10400|335|92|2|27|33353.91|0.00|0.03|N|O|1996-12-23|1997-01-17|1997-01-13|NONE|REG AIR|ial packages boost furiou +10400|320|5|3|3|3660.96|0.03|0.04|N|O|1997-01-08|1997-01-16|1997-02-02|NONE|MAIL|oxes. slyly bold accounts use. carefull +10400|1059|30|4|48|46082.40|0.03|0.08|N|O|1997-02-01|1996-12-12|1997-02-15|DELIVER IN PERSON|RAIL|ow fluffily quickly ironic i +10400|1595|16|5|20|29931.80|0.07|0.04|N|O|1996-11-08|1996-12-19|1996-11-18|DELIVER IN PERSON|TRUCK|ironic deposits along the blithely fina +10400|1416|17|6|27|35570.07|0.08|0.03|N|O|1996-11-26|1997-01-22|1996-12-09|TAKE BACK RETURN|AIR|ounts. blithely bold packages detect bli +10401|1421|22|1|1|1322.42|0.08|0.04|N|O|1998-08-30|1998-09-14|1998-09-23|NONE|SHIP|ar deposits. bold, express excuses are alo +10401|1535|76|2|10|14365.30|0.07|0.04|N|O|1998-09-04|1998-10-08|1998-09-28|TAKE BACK RETURN|REG AIR|ve the final, +10402|537|28|1|38|54626.14|0.07|0.07|N|O|1998-04-04|1998-02-09|1998-04-19|COLLECT COD|TRUCK|l, regular requests integrate. dog +10402|646|78|2|10|15466.40|0.01|0.02|N|O|1997-12-21|1998-01-20|1997-12-27|COLLECT COD|MAIL|efully final packages. slyly e +10403|1790|17|1|29|49061.91|0.10|0.02|N|O|1996-08-10|1996-07-30|1996-09-03|NONE|FOB|ake fluffily. requ +10403|1733|34|2|47|76832.31|0.02|0.08|N|O|1996-06-06|1996-06-29|1996-06-08|COLLECT COD|AIR|ideas thrash aga +10403|573|74|3|26|38312.82|0.10|0.07|N|O|1996-09-11|1996-07-22|1996-09-15|TAKE BACK RETURN|FOB|fully among the carefully even depe +10403|1153|90|4|24|25299.60|0.07|0.02|N|O|1996-09-03|1996-08-19|1996-09-22|TAKE BACK RETURN|TRUCK|y unusual f +10403|88|64|5|29|28654.32|0.07|0.05|N|O|1996-06-27|1996-06-23|1996-07-12|COLLECT COD|RAIL|g slyly pending deposits. fu +10403|4|55|6|21|18984.00|0.07|0.02|N|O|1996-07-12|1996-07-18|1996-07-16|COLLECT COD|FOB|usly across t +10403|556|17|7|29|42239.95|0.09|0.04|N|O|1996-06-28|1996-07-31|1996-07-20|COLLECT COD|REG AIR|onic deposits cajole carefu +10404|1785|28|1|35|59037.30|0.08|0.01|N|O|1998-06-12|1998-05-14|1998-06-15|NONE|MAIL|efully express deposits sl +10404|825|26|2|9|15532.38|0.03|0.08|N|O|1998-04-13|1998-05-05|1998-04-21|NONE|TRUCK|ial deposits. asymptotes detect. quick +10404|1509|10|3|49|69114.50|0.02|0.02|N|O|1998-04-20|1998-05-13|1998-04-22|DELIVER IN PERSON|SHIP|thely unusual acc +10404|463|93|4|6|8180.76|0.07|0.04|N|O|1998-06-27|1998-06-13|1998-07-02|COLLECT COD|AIR|he carefully regular theodolit +10405|1350|27|1|25|31283.75|0.08|0.07|N|O|1998-01-31|1998-03-02|1998-02-25|DELIVER IN PERSON|MAIL|deposits. platel +10405|107|8|2|14|14099.40|0.01|0.02|N|O|1998-05-01|1998-03-17|1998-05-10|NONE|REG AIR|thely ironic d +10405|684|78|3|37|58633.16|0.06|0.00|N|O|1998-02-28|1998-02-25|1998-03-27|TAKE BACK RETURN|REG AIR|ges according to the regular depos +10405|93|44|4|22|21847.98|0.08|0.05|N|O|1998-04-01|1998-03-13|1998-04-28|TAKE BACK RETURN|TRUCK|thely even +10405|1390|5|5|27|34867.53|0.07|0.08|N|O|1998-04-19|1998-03-08|1998-05-07|NONE|MAIL|taphs haggle quick +10406|1310|25|1|23|27860.13|0.01|0.06|N|O|1996-06-12|1996-05-23|1996-07-11|NONE|RAIL|uests cajole fluffily +10406|1130|31|2|41|42276.33|0.09|0.05|N|O|1996-04-25|1996-05-20|1996-04-26|NONE|AIR|ual account +10406|834|35|3|41|71128.03|0.10|0.00|N|O|1996-04-27|1996-04-27|1996-05-20|COLLECT COD|MAIL| beans. ev +10406|145|46|4|10|10451.40|0.06|0.00|N|O|1996-05-04|1996-04-16|1996-05-15|DELIVER IN PERSON|SHIP| packages nag enticingly +10407|331|60|1|9|11081.97|0.10|0.04|N|O|1996-05-30|1996-04-25|1996-06-05|DELIVER IN PERSON|TRUCK| ideas kindle slyly abo +10407|390|75|2|10|12903.90|0.01|0.03|N|O|1996-07-18|1996-05-25|1996-07-27|COLLECT COD|AIR|ess deposits +10407|1185|94|3|20|21723.60|0.00|0.00|N|O|1996-05-13|1996-05-05|1996-06-05|DELIVER IN PERSON|TRUCK|ously ironic foxes. carefully +10407|433|63|4|12|16001.16|0.06|0.00|N|O|1996-04-06|1996-05-09|1996-05-04|NONE|REG AIR|g the final, even accounts. regular acc +10407|1085|56|5|10|9860.80|0.06|0.08|N|O|1996-06-08|1996-05-21|1996-06-10|NONE|RAIL|arefully even +10407|208|36|6|2|2216.40|0.04|0.02|N|O|1996-04-19|1996-05-18|1996-05-19|TAKE BACK RETURN|REG AIR|nding requests. carefully ironic +10432|1705|90|1|40|64268.00|0.06|0.05|R|F|1992-03-04|1992-02-10|1992-03-18|COLLECT COD|REG AIR|ly even requ +10432|54|80|2|46|43886.30|0.00|0.02|A|F|1992-04-29|1992-03-19|1992-05-03|COLLECT COD|SHIP|efully express requests wake blithe +10432|1292|93|3|26|31025.54|0.05|0.07|A|F|1992-04-23|1992-03-08|1992-04-26|NONE|REG AIR|after the ironic, unusual ideas cajo +10432|647|41|4|18|27857.52|0.06|0.07|A|F|1992-01-27|1992-03-19|1992-02-06|NONE|FOB| ironic ideas. +10433|1268|43|1|16|18708.16|0.05|0.08|A|F|1993-05-09|1993-04-10|1993-05-29|COLLECT COD|REG AIR|he unusual theodolites. furiously iro +10434|1523|24|1|6|8547.12|0.02|0.07|R|F|1995-02-11|1995-03-17|1995-03-12|DELIVER IN PERSON|SHIP|uests. packages integrate +10434|465|66|2|42|57349.32|0.09|0.04|R|F|1995-03-27|1995-02-24|1995-04-25|DELIVER IN PERSON|TRUCK|es the unusual platelets are furiou +10435|493|94|1|39|54346.11|0.08|0.03|R|F|1993-08-23|1993-11-04|1993-08-27|DELIVER IN PERSON|AIR|usly pending requests +10435|1702|3|2|9|14433.30|0.10|0.06|R|F|1993-12-05|1993-09-19|1993-12-10|TAKE BACK RETURN|SHIP|ily regular pack +10435|1795|80|3|4|6787.16|0.05|0.05|R|F|1993-08-25|1993-09-14|1993-08-26|TAKE BACK RETURN|TRUCK|osits affix furiously +10435|957|26|4|25|46448.75|0.04|0.01|A|F|1993-10-29|1993-10-23|1993-10-31|NONE|MAIL|, unusual deposits. ruthless +10435|1935|68|5|19|34901.67|0.00|0.05|A|F|1993-08-27|1993-10-30|1993-09-25|DELIVER IN PERSON|MAIL|regular theodolites mold along the asymp +10435|661|62|6|20|31233.20|0.03|0.06|A|F|1993-09-23|1993-10-07|1993-10-15|TAKE BACK RETURN|AIR|s. carefully regular +10436|1197|34|1|31|34043.89|0.09|0.05|A|F|1995-04-26|1995-03-11|1995-05-07|TAKE BACK RETURN|MAIL|thely ironic packages. silent account +10437|883|83|1|13|23190.44|0.09|0.01|A|F|1994-08-24|1994-09-20|1994-09-17|NONE|TRUCK|. busy requests sleep carefully en +10437|1165|66|2|27|28786.32|0.02|0.03|A|F|1994-11-04|1994-11-07|1994-11-25|DELIVER IN PERSON|TRUCK|telets thrash carefull +10437|358|87|3|11|13841.85|0.03|0.05|A|F|1994-10-08|1994-11-16|1994-10-27|DELIVER IN PERSON|REG AIR|e ideas believe slyly after the fluffil +10438|1978|11|1|46|86478.62|0.09|0.03|A|F|1993-02-05|1993-03-01|1993-02-06|DELIVER IN PERSON|RAIL|n dependencies grow along the furiously e +10438|1710|11|2|34|54798.14|0.03|0.04|A|F|1992-12-12|1993-02-17|1992-12-26|TAKE BACK RETURN|MAIL|nal, even deposits wake +10438|1359|74|3|15|18905.25|0.02|0.00|A|F|1993-02-12|1993-03-02|1993-02-27|TAKE BACK RETURN|AIR|ular requests boos +10438|390|91|4|27|34840.53|0.06|0.07|R|F|1993-01-27|1993-01-15|1993-02-15|DELIVER IN PERSON|AIR|packages affix blithely along +10439|161|40|1|32|33957.12|0.08|0.04|R|F|1992-05-20|1992-06-23|1992-06-13|DELIVER IN PERSON|FOB|cajole furiously after the slyly un +10439|122|1|2|27|27597.24|0.05|0.03|R|F|1992-06-29|1992-05-06|1992-07-10|NONE|MAIL|rding to the +10439|899|99|3|49|88194.61|0.00|0.00|A|F|1992-04-13|1992-06-03|1992-04-16|COLLECT COD|FOB|nal accounts +10439|537|38|4|15|21562.95|0.09|0.03|A|F|1992-04-06|1992-06-13|1992-05-04|COLLECT COD|FOB|ly across the reg +10439|1596|97|5|30|44927.70|0.05|0.04|R|F|1992-06-05|1992-06-01|1992-06-13|NONE|REG AIR|ly final acco +10439|1598|19|6|33|49486.47|0.00|0.03|R|F|1992-06-06|1992-05-08|1992-06-20|DELIVER IN PERSON|FOB|n dependenci +10439|1998|87|7|20|37999.80|0.04|0.01|R|F|1992-06-02|1992-04-29|1992-06-27|NONE|AIR|e express, ironic accou +10464|1015|86|1|47|43052.47|0.06|0.03|R|F|1994-08-21|1994-10-19|1994-09-01|TAKE BACK RETURN|AIR|luffily unusual requests along the caref +10465|1512|13|1|16|22616.16|0.00|0.05|N|O|1997-04-20|1997-05-20|1997-05-15|COLLECT COD|REG AIR|ourts. pending +10465|1773|58|2|21|35170.17|0.06|0.02|N|O|1997-05-06|1997-05-23|1997-05-23|TAKE BACK RETURN|FOB|regular foxes mold sl +10465|340|97|3|1|1240.34|0.00|0.03|N|O|1997-04-23|1997-05-13|1997-05-08|TAKE BACK RETURN|RAIL|eep furiously after the fur +10465|1946|35|4|47|86853.18|0.07|0.03|N|O|1997-08-02|1997-06-16|1997-08-14|NONE|SHIP|ly unusual accounts. iro +10465|779|76|5|49|82308.73|0.10|0.03|N|O|1997-07-07|1997-05-21|1997-07-09|COLLECT COD|MAIL|e blithely about the furiously unusual +10465|63|64|6|49|47189.94|0.06|0.08|N|O|1997-07-22|1997-05-29|1997-08-03|TAKE BACK RETURN|MAIL|c pinto beans. slyly unusual +10465|1475|54|7|17|23399.99|0.04|0.04|N|O|1997-05-30|1997-07-09|1997-06-13|COLLECT COD|TRUCK|out the flu +10466|1372|73|1|44|56028.28|0.08|0.02|R|F|1993-03-13|1993-02-25|1993-04-07|COLLECT COD|SHIP|es. brave accounts wake furiou +10466|1959|4|2|15|27914.25|0.00|0.08|A|F|1993-01-18|1993-02-17|1993-02-02|NONE|REG AIR|rate furiously steal +10466|655|49|3|42|65337.30|0.06|0.06|A|F|1993-02-25|1993-03-01|1993-03-21|TAKE BACK RETURN|AIR|even foxes nag slyly according to the +10467|1128|29|1|36|37048.32|0.00|0.05|N|O|1997-06-30|1997-05-17|1997-07-07|COLLECT COD|MAIL|ly regular ideas. carefull +10467|1900|44|2|16|28830.40|0.03|0.01|N|O|1997-07-04|1997-05-07|1997-07-31|TAKE BACK RETURN|RAIL| carefully. blithely even excuses haggle. +10467|1338|53|3|26|32222.58|0.08|0.05|N|O|1997-05-13|1997-05-15|1997-05-19|NONE|AIR|s use. ideas above +10467|1997|86|4|28|53171.72|0.01|0.02|N|O|1997-03-28|1997-05-08|1997-04-22|COLLECT COD|RAIL|al accounts +10467|764|61|5|3|4994.28|0.07|0.03|N|O|1997-06-04|1997-04-22|1997-06-08|NONE|REG AIR|t foxes. package +10467|1810|97|6|20|34236.20|0.10|0.02|N|O|1997-05-07|1997-05-09|1997-05-18|DELIVER IN PERSON|RAIL|usly slyly re +10467|224|6|7|11|12366.42|0.07|0.05|N|O|1997-04-26|1997-05-20|1997-05-16|NONE|RAIL|jole blithely ironic instructions. blith +10468|348|77|1|6|7490.04|0.02|0.00|A|F|1995-02-28|1995-03-05|1995-03-02|DELIVER IN PERSON|FOB|, ironic pack +10468|196|97|2|39|42751.41|0.00|0.02|R|F|1994-12-26|1995-03-06|1994-12-31|COLLECT COD|REG AIR|against the fluffily pending foxe +10469|737|2|1|26|42580.98|0.08|0.00|N|O|1996-12-20|1996-10-21|1996-12-27|DELIVER IN PERSON|FOB|ronic ideas arou +10469|13|64|2|1|913.01|0.02|0.06|N|O|1996-09-18|1996-10-05|1996-09-27|TAKE BACK RETURN|SHIP|ronic, final accounts use car +10469|1795|96|3|28|47510.12|0.01|0.06|N|O|1996-10-10|1996-11-03|1996-10-21|TAKE BACK RETURN|RAIL|accounts. furiously +10470|1696|20|1|48|76689.12|0.07|0.04|R|F|1992-08-01|1992-07-05|1992-08-02|DELIVER IN PERSON|SHIP|ven accounts. regular, reg +10470|720|53|2|46|74553.12|0.08|0.03|R|F|1992-08-16|1992-06-11|1992-08-23|DELIVER IN PERSON|MAIL| deposits. pending, final inst +10470|455|56|3|50|67772.50|0.05|0.08|R|F|1992-07-18|1992-06-06|1992-07-28|NONE|RAIL|heodolites. blithely regular accounts a +10470|985|86|4|41|77325.18|0.00|0.01|R|F|1992-06-19|1992-06-16|1992-07-12|TAKE BACK RETURN|SHIP| integrate carefully slyly +10470|1431|71|5|21|27981.03|0.05|0.07|R|F|1992-06-11|1992-07-12|1992-06-23|DELIVER IN PERSON|REG AIR|regular theodolites sleep? furiously re +10470|1117|18|6|1|1018.11|0.06|0.05|R|F|1992-07-18|1992-06-28|1992-08-01|TAKE BACK RETURN|MAIL|e above the stealthy, final instru +10471|244|45|1|46|52635.04|0.08|0.01|R|F|1993-01-21|1992-12-24|1993-02-17|TAKE BACK RETURN|MAIL|ages. slyly bold platelet +10471|912|47|2|35|63451.85|0.02|0.05|A|F|1992-10-11|1992-12-09|1992-11-08|DELIVER IN PERSON|TRUCK|deas sleep furio +10471|1643|44|3|8|12357.12|0.06|0.01|A|F|1992-12-10|1992-12-23|1992-12-26|DELIVER IN PERSON|REG AIR| packages impress slyly about the carefully +10471|825|92|4|35|60403.70|0.09|0.00|R|F|1992-10-17|1993-01-03|1992-11-07|COLLECT COD|SHIP|lent deposits. carefully final pa +10471|1244|56|5|39|44664.36|0.04|0.05|R|F|1992-12-05|1992-11-11|1992-12-25|COLLECT COD|FOB|packages. quickly s +10471|816|50|6|48|82406.88|0.03|0.05|A|F|1992-11-28|1992-12-13|1992-12-16|DELIVER IN PERSON|SHIP|hely special deposits. package +10496|103|56|1|8|8024.80|0.08|0.01|N|O|1997-03-26|1997-04-11|1997-04-22|NONE|REG AIR|the express, final requests. furiously ex +10496|1687|29|2|37|58781.16|0.00|0.01|N|O|1997-05-06|1997-05-01|1997-05-30|TAKE BACK RETURN|RAIL|fter the final courts. final, pend +10497|395|80|1|10|12953.90|0.08|0.06|N|O|1996-09-11|1996-09-14|1996-09-13|NONE|AIR|y regular packages along the fluf +10497|538|69|2|29|41717.37|0.05|0.03|N|O|1996-08-01|1996-09-19|1996-08-25|TAKE BACK RETURN|FOB|even deposits boost slyly about the bold, +10497|1471|11|3|36|49408.92|0.07|0.08|N|O|1996-09-13|1996-08-12|1996-09-27|COLLECT COD|MAIL|ges. furiousl +10498|1140|41|1|3|3123.42|0.00|0.07|A|F|1993-11-01|1993-12-23|1993-11-10|DELIVER IN PERSON|REG AIR|ronic accounts wake quickly +10498|697|91|2|34|54321.46|0.03|0.00|A|F|1994-02-16|1993-12-09|1994-02-19|COLLECT COD|REG AIR|ously bold +10498|720|85|3|31|50242.32|0.08|0.05|A|F|1994-01-21|1993-11-30|1994-02-07|NONE|REG AIR|tegrate never fin +10498|1961|6|4|25|46574.00|0.09|0.00|A|F|1994-01-07|1993-11-27|1994-01-08|DELIVER IN PERSON|FOB|leep blithely after the regul +10499|176|3|1|12|12914.04|0.00|0.08|R|F|1994-03-08|1994-02-02|1994-04-04|TAKE BACK RETURN|SHIP|t pinto beans. quic +10499|854|88|2|32|56155.20|0.05|0.07|R|F|1993-12-20|1994-01-22|1994-01-17|NONE|RAIL|r packages alongside of the regular +10499|1474|75|3|30|41264.10|0.09|0.04|R|F|1994-01-27|1994-02-14|1994-02-11|NONE|RAIL|le fluffily among the blithely +10499|482|83|4|39|53916.72|0.09|0.06|R|F|1994-02-28|1994-02-11|1994-03-26|NONE|REG AIR|eans. quickly ironic +10499|696|97|5|2|3193.38|0.03|0.00|R|F|1994-03-14|1994-01-04|1994-04-09|DELIVER IN PERSON|FOB|ke blithely regular ideas. accoun +10499|75|1|6|21|20476.47|0.01|0.04|R|F|1994-02-19|1993-12-28|1994-03-07|COLLECT COD|SHIP|brave requests. blithely unusual +10500|726|23|1|16|26027.52|0.00|0.03|R|F|1994-04-14|1994-03-10|1994-04-19|COLLECT COD|REG AIR|y. frets according to the +10501|1701|28|1|12|19232.40|0.02|0.04|N|O|1998-09-28|1998-09-24|1998-10-08|NONE|RAIL|ckages. slyly even theodolites are bold i +10501|831|98|2|40|69273.20|0.04|0.03|N|O|1998-07-24|1998-08-06|1998-08-01|NONE|FOB|ular requests cajole. ironic ideas +10501|1791|18|3|43|72789.97|0.01|0.03|N|O|1998-07-27|1998-09-26|1998-08-23|NONE|REG AIR|lyly bold theodolites sleep carefully f +10501|1335|50|4|22|27199.26|0.00|0.04|N|O|1998-09-25|1998-08-20|1998-10-10|COLLECT COD|FOB|gged package +10501|463|93|5|11|14998.06|0.06|0.02|N|O|1998-10-28|1998-09-06|1998-11-21|TAKE BACK RETURN|AIR|lly even dependencies. busy deposits hagg +10501|1243|44|6|21|24029.04|0.09|0.03|N|O|1998-09-18|1998-08-22|1998-10-01|COLLECT COD|REG AIR|refully ironic platelets hag +10502|1776|3|1|50|83888.50|0.01|0.00|A|F|1993-05-20|1993-06-25|1993-05-22|COLLECT COD|FOB|ents could have to +10502|1667|9|2|48|75295.68|0.09|0.01|A|F|1993-06-11|1993-08-01|1993-06-12|TAKE BACK RETURN|MAIL|egular requests. bold +10502|1470|71|3|8|10971.76|0.10|0.04|R|F|1993-08-30|1993-06-23|1993-09-19|TAKE BACK RETURN|REG AIR|dolphins. b +10502|36|62|4|17|15912.51|0.09|0.04|R|F|1993-09-02|1993-06-16|1993-09-26|DELIVER IN PERSON|MAIL|ecial orbits boost +10503|92|93|1|28|27778.52|0.07|0.06|N|O|1996-09-15|1996-08-07|1996-09-26|TAKE BACK RETURN|AIR|packages wake never packages. quickly ir +10503|1500|79|2|12|16818.00|0.04|0.01|N|O|1996-09-07|1996-07-15|1996-09-18|DELIVER IN PERSON|RAIL|fully slow pinto beans. slyly slow theodol +10503|843|43|3|45|78472.80|0.03|0.04|N|O|1996-08-08|1996-07-15|1996-08-29|NONE|TRUCK|y final packa +10503|45|21|4|28|26461.12|0.01|0.07|N|O|1996-06-23|1996-07-25|1996-07-17|DELIVER IN PERSON|RAIL|haggle final dependencies? fluffily regular +10528|845|79|1|45|78562.80|0.09|0.02|A|F|1995-01-07|1994-10-20|1995-01-22|NONE|FOB|y. quickly sly accounts wake after the bo +10528|185|86|2|4|4340.72|0.02|0.08|A|F|1994-10-20|1994-12-07|1994-11-12|NONE|MAIL|ly final accou +10528|1700|1|3|18|28830.60|0.06|0.03|R|F|1994-10-02|1994-10-28|1994-10-06|TAKE BACK RETURN|SHIP|ily. pending, unusual requests +10528|1788|15|4|13|21967.14|0.08|0.07|R|F|1994-10-11|1994-11-18|1994-10-28|NONE|AIR|onic accounts. blithely even accounts are f +10529|1011|17|1|37|33744.37|0.01|0.08|N|O|1997-10-28|1998-01-16|1997-11-12|COLLECT COD|SHIP|e furiously express accounts. slowl +10529|270|52|2|41|47981.07|0.01|0.04|N|O|1998-01-10|1997-12-29|1998-01-21|TAKE BACK RETURN|MAIL|onic forges +10529|1866|67|3|31|54803.66|0.05|0.08|N|O|1998-01-15|1997-12-13|1998-02-05|DELIVER IN PERSON|AIR|uriously even depo +10530|1990|23|1|20|37839.80|0.06|0.00|A|F|1994-03-03|1994-03-20|1994-03-06|NONE|TRUCK|lly regular deposits wake al +10530|802|36|2|28|47678.40|0.05|0.04|R|F|1994-04-30|1994-03-16|1994-05-14|COLLECT COD|RAIL|press requests. un +10530|1662|63|3|25|39091.50|0.07|0.04|R|F|1994-04-10|1994-03-24|1994-04-29|DELIVER IN PERSON|REG AIR|blithely a +10531|705|38|1|24|38536.80|0.08|0.00|R|F|1992-03-21|1992-05-29|1992-04-10|COLLECT COD|RAIL| lose fluffily slyly express asymptotes +10531|25|26|2|14|12950.28|0.09|0.07|A|F|1992-03-27|1992-04-19|1992-04-10|DELIVER IN PERSON|RAIL|al instructions +10531|1097|98|3|40|39923.60|0.08|0.07|R|F|1992-04-20|1992-04-29|1992-04-26|COLLECT COD|REG AIR| quickly ironic requests. regular pac +10531|1639|22|4|25|38515.75|0.09|0.05|A|F|1992-07-16|1992-05-18|1992-08-10|COLLECT COD|REG AIR|nently. sheaves +10531|789|54|5|2|3379.56|0.00|0.02|A|F|1992-04-14|1992-04-26|1992-04-23|NONE|RAIL|eodolites above the carefully +10531|1660|84|6|2|3123.32|0.00|0.00|A|F|1992-05-25|1992-05-16|1992-06-06|DELIVER IN PERSON|SHIP|. carefully sly ideas use furiously pe +10531|923|26|7|24|43774.08|0.00|0.04|R|F|1992-04-02|1992-05-30|1992-04-09|NONE|TRUCK|regular asymptotes. blithely +10532|1771|14|1|25|41819.25|0.00|0.01|N|O|1997-12-30|1998-01-26|1998-01-13|DELIVER IN PERSON|SHIP|g deposits are furiously: carefully +10532|1821|8|2|15|25842.30|0.00|0.07|N|O|1998-03-26|1997-12-30|1998-04-25|NONE|SHIP| special deposits +10532|1083|54|3|26|25586.08|0.02|0.02|N|O|1998-01-05|1998-02-02|1998-01-23|DELIVER IN PERSON|AIR|xpress deposits. forges are regularly a +10532|1702|45|4|44|70562.80|0.03|0.07|N|O|1998-03-14|1998-01-08|1998-03-29|NONE|REG AIR|blithely idle account +10532|1689|31|5|23|36585.64|0.10|0.05|N|O|1998-01-25|1998-01-13|1998-01-30|DELIVER IN PERSON|REG AIR|cajole. always final de +10532|1857|1|6|50|87942.50|0.05|0.00|N|O|1998-01-08|1998-01-04|1998-01-26|COLLECT COD|SHIP|endencies cajole. slow asymptot +10532|124|25|7|30|30723.60|0.05|0.07|N|O|1997-12-24|1998-02-19|1998-01-14|COLLECT COD|REG AIR|e slyly bold packages. furiously u +10533|1399|38|1|16|20806.24|0.04|0.06|N|O|1998-08-02|1998-07-16|1998-08-21|TAKE BACK RETURN|MAIL|quests haggle quickly. carefully express +10533|521|22|2|16|22744.32|0.00|0.06|N|O|1998-07-07|1998-06-29|1998-07-09|NONE|FOB| across the carefully silent a +10533|354|83|3|46|57700.10|0.02|0.07|N|O|1998-08-10|1998-06-15|1998-08-31|COLLECT COD|FOB|thely regular +10533|1019|20|4|42|38640.42|0.05|0.04|N|O|1998-07-13|1998-07-14|1998-07-31|COLLECT COD|FOB|encies maintain careful +10533|813|13|5|27|46272.87|0.09|0.00|N|O|1998-07-18|1998-06-29|1998-08-11|DELIVER IN PERSON|MAIL|tly regular +10534|1554|35|1|3|4366.65|0.05|0.07|R|F|1993-07-13|1993-07-16|1993-08-06|COLLECT COD|MAIL|counts are regular +10535|743|44|1|2|3287.48|0.00|0.04|N|O|1995-06-29|1995-08-08|1995-07-21|NONE|REG AIR|unusual in +10535|685|86|2|30|47570.40|0.01|0.07|N|O|1995-07-29|1995-07-15|1995-08-03|DELIVER IN PERSON|REG AIR|usly final excuses nod. blithely +10535|728|25|3|33|53747.76|0.09|0.01|N|O|1995-07-29|1995-07-30|1995-08-18|TAKE BACK RETURN|REG AIR|carefully even excuses against t +10535|1038|39|4|22|20658.66|0.02|0.03|N|O|1995-09-22|1995-07-01|1995-09-27|NONE|FOB|e carefully final ideas kindle +10535|1912|45|5|40|72556.40|0.00|0.03|N|O|1995-09-04|1995-08-14|1995-09-11|TAKE BACK RETURN|RAIL|y ironic asymptotes should sleep after +10535|1853|54|6|20|35097.00|0.01|0.04|N|O|1995-09-02|1995-08-15|1995-09-15|DELIVER IN PERSON|MAIL|d packages haggle f +10535|447|6|7|11|14821.84|0.01|0.01|N|O|1995-07-09|1995-07-27|1995-07-20|COLLECT COD|RAIL|even asymptotes bo +10560|1016|22|1|8|7336.08|0.08|0.00|N|O|1997-10-08|1997-10-19|1997-10-31|DELIVER IN PERSON|MAIL| slyly final ideas sleep +10560|1386|63|2|49|63081.62|0.07|0.06|N|O|1997-11-27|1997-09-07|1997-12-25|DELIVER IN PERSON|AIR|ously bold sauternes boost among the fin +10560|1978|79|3|8|15039.76|0.04|0.07|N|O|1997-08-08|1997-10-24|1997-09-04|NONE|MAIL|ss the blithely unusual foxes snooze +10560|1567|8|4|18|26434.08|0.10|0.06|N|O|1997-08-07|1997-10-17|1997-08-15|TAKE BACK RETURN|RAIL|nding asymptotes boost fluffily alo +10560|703|100|5|6|9622.20|0.01|0.07|N|O|1997-10-08|1997-10-02|1997-10-09|TAKE BACK RETURN|REG AIR|. carefully even +10560|736|1|6|38|62195.74|0.03|0.01|N|O|1997-10-05|1997-08-29|1997-11-02|DELIVER IN PERSON|SHIP|hinly final instruct +10560|1083|54|7|5|4920.40|0.10|0.04|N|O|1997-10-03|1997-09-07|1997-10-12|NONE|MAIL|s requests are carefully final re +10561|551|52|1|30|43546.50|0.02|0.08|N|O|1997-06-18|1997-07-08|1997-06-22|COLLECT COD|SHIP|es. blithely pe +10561|949|84|2|25|46248.50|0.09|0.00|N|O|1997-07-24|1997-06-18|1997-07-29|TAKE BACK RETURN|FOB|riously. express, final theodolites +10561|1021|27|3|44|40568.88|0.08|0.05|N|O|1997-05-16|1997-06-26|1997-06-12|COLLECT COD|RAIL| above the ironic asymptotes. +10561|440|28|4|30|40213.20|0.01|0.04|N|O|1997-07-28|1997-07-26|1997-08-18|NONE|AIR|y against the deposits. carefully fin +10561|1737|64|5|31|50800.63|0.08|0.08|N|O|1997-06-06|1997-06-13|1997-06-30|NONE|TRUCK|se slyly. s +10562|1436|37|1|37|49484.91|0.06|0.07|R|F|1994-12-21|1995-01-08|1995-01-12|COLLECT COD|FOB|ickly final packages cajole +10562|1643|26|2|37|57151.68|0.05|0.04|R|F|1994-12-12|1995-01-07|1994-12-24|NONE|RAIL|regular pinto beans +10562|592|93|3|25|37314.75|0.09|0.02|R|F|1995-03-05|1995-01-18|1995-03-07|COLLECT COD|REG AIR| ironic instruction +10562|952|21|4|13|24088.35|0.06|0.04|R|F|1995-02-05|1995-01-23|1995-02-26|TAKE BACK RETURN|SHIP|es boost across th +10562|762|95|5|46|76486.96|0.03|0.02|R|F|1995-03-06|1994-12-22|1995-03-17|TAKE BACK RETURN|TRUCK|es haggle ruthlessly. ca +10562|118|71|6|8|8144.88|0.10|0.00|A|F|1995-01-17|1995-01-10|1995-02-09|DELIVER IN PERSON|TRUCK|bold deposits. +10562|569|30|7|34|49965.04|0.02|0.02|A|F|1995-02-19|1995-01-30|1995-02-20|NONE|SHIP|carefully careful packages wake fluffily a +10563|1475|93|1|12|16517.64|0.06|0.01|R|F|1994-01-04|1993-11-14|1994-02-01|DELIVER IN PERSON|SHIP|ithely unusual packages cajole blithe +10563|1369|70|2|35|44462.60|0.10|0.06|R|F|1993-11-15|1993-12-21|1993-12-09|COLLECT COD|RAIL|equests inte +10563|2000|33|3|46|41492.00|0.05|0.00|A|F|1993-11-11|1993-11-05|1993-11-18|COLLECT COD|MAIL|quests. bli +10563|1108|9|4|46|46418.60|0.07|0.07|R|F|1994-01-10|1993-11-02|1994-01-17|DELIVER IN PERSON|RAIL|quickly ironic asymptotes wake according +10564|1613|55|1|13|19689.93|0.06|0.06|N|O|1996-03-31|1996-04-20|1996-04-19|TAKE BACK RETURN|AIR| regular deposits +10564|402|32|2|23|29955.20|0.04|0.03|N|O|1996-05-03|1996-05-15|1996-05-09|DELIVER IN PERSON|TRUCK|egular accounts use +10564|87|38|3|25|24677.00|0.00|0.06|N|O|1996-06-19|1996-05-26|1996-07-02|NONE|MAIL|raids-- carefully f +10564|1144|17|4|2|2090.28|0.02|0.05|N|O|1996-03-19|1996-04-27|1996-03-31|COLLECT COD|AIR|ents wake furi +10565|867|68|1|11|19446.46|0.03|0.03|N|O|1997-08-26|1997-10-21|1997-09-21|NONE|MAIL|uests lose about the quickly bold +10565|1519|40|2|15|21307.65|0.07|0.04|N|O|1997-10-07|1997-11-04|1997-10-14|COLLECT COD|AIR|y pending accounts. packag +10565|395|52|3|31|40157.09|0.01|0.05|N|O|1997-10-30|1997-10-17|1997-11-13|DELIVER IN PERSON|AIR|to the caref +10565|1152|53|4|27|28435.05|0.01|0.06|N|O|1997-11-21|1997-11-07|1997-12-18|COLLECT COD|MAIL|s run idly carefully +10565|40|41|5|27|25381.08|0.01|0.06|N|O|1997-09-23|1997-10-05|1997-10-08|DELIVER IN PERSON|REG AIR|ites are car +10566|663|95|1|44|68801.04|0.01|0.04|N|O|1995-10-25|1995-11-18|1995-11-14|TAKE BACK RETURN|MAIL|en instructions doubt past t +10566|911|46|2|1|1811.91|0.01|0.03|N|O|1995-10-03|1995-11-04|1995-10-31|NONE|RAIL|sual theodolites. slyly regula +10566|1665|89|3|18|28199.88|0.10|0.00|N|O|1995-10-13|1995-09-30|1995-11-11|COLLECT COD|RAIL|ic dependencies. furiousl +10566|82|8|4|36|35354.88|0.01|0.02|N|O|1995-10-18|1995-10-13|1995-11-11|NONE|SHIP| slyly pending depths impress slyly ab +10566|285|40|5|9|10667.52|0.00|0.04|N|O|1995-09-22|1995-10-21|1995-10-16|NONE|RAIL|deposits wake +10566|1911|56|6|41|74329.31|0.06|0.08|N|O|1995-11-10|1995-09-29|1995-11-23|COLLECT COD|RAIL| carefully even deposits s +10567|1471|50|1|37|50781.39|0.05|0.01|A|F|1992-05-05|1992-06-07|1992-05-06|NONE|REG AIR|e furiously regular warthogs: special +10567|1661|62|2|9|14063.94|0.02|0.07|A|F|1992-05-01|1992-06-07|1992-05-29|COLLECT COD|TRUCK|out the qui +10567|984|19|3|22|41469.56|0.05|0.05|A|F|1992-04-10|1992-05-16|1992-04-26|TAKE BACK RETURN|MAIL|e fluffily e +10592|1835|22|1|41|71210.03|0.10|0.07|N|O|1996-01-08|1995-12-14|1996-02-06|TAKE BACK RETURN|AIR|ronic, final accounts. fl +10592|378|7|2|12|15340.44|0.03|0.08|N|O|1995-12-02|1996-02-02|1995-12-19|NONE|TRUCK|e fluffily bold accounts. blithely eve +10593|1379|94|1|10|12803.70|0.03|0.02|R|F|1992-05-24|1992-03-23|1992-06-12|DELIVER IN PERSON|SHIP|are bravely quickly bold depos +10593|1927|28|2|7|12802.44|0.08|0.05|R|F|1992-05-10|1992-04-24|1992-05-22|COLLECT COD|AIR|p the slyl +10593|1403|43|3|36|46958.40|0.08|0.08|A|F|1992-03-03|1992-03-22|1992-03-15|COLLECT COD|SHIP|endencies can +10593|1288|63|4|36|42814.08|0.01|0.01|R|F|1992-05-13|1992-03-20|1992-06-01|DELIVER IN PERSON|AIR|refully. carefully final accounts run car +10593|1840|27|5|23|40062.32|0.05|0.08|A|F|1992-04-09|1992-04-18|1992-04-17|DELIVER IN PERSON|SHIP|sts are bold, i +10593|1210|85|6|5|5556.05|0.09|0.00|A|F|1992-05-14|1992-04-20|1992-05-20|TAKE BACK RETURN|MAIL|er the furiously ironic a +10594|444|32|1|5|6722.20|0.03|0.02|N|O|1996-05-03|1996-05-18|1996-05-10|NONE|TRUCK|al foxes. final ideas among the slyly s +10595|265|47|1|19|22139.94|0.01|0.06|N|O|1998-03-17|1998-01-30|1998-03-19|TAKE BACK RETURN|SHIP|wake carefully at t +10596|1631|73|1|42|64370.46|0.10|0.03|N|O|1997-05-31|1997-06-04|1997-06-06|TAKE BACK RETURN|TRUCK| the packages. ev +10596|1309|24|2|19|22995.70|0.09|0.00|N|O|1997-06-22|1997-05-04|1997-06-25|DELIVER IN PERSON|MAIL|ins boost above the fina +10596|1793|36|3|15|25421.85|0.03|0.04|N|O|1997-05-02|1997-06-25|1997-05-20|TAKE BACK RETURN|SHIP|gle accord +10597|1162|63|1|23|24452.68|0.07|0.08|N|O|1996-12-24|1996-10-28|1997-01-19|NONE|FOB|ly regular ideas ought to dazzle +10597|1414|15|2|27|35516.07|0.01|0.07|N|O|1996-12-01|1996-10-22|1996-12-19|COLLECT COD|TRUCK|y carefully u +10597|1084|85|3|6|5910.48|0.06|0.03|N|O|1996-09-24|1996-10-30|1996-10-03|DELIVER IN PERSON|AIR|iously final depths boost bold requests. d +10598|286|41|1|16|18980.48|0.03|0.05|R|F|1992-06-02|1992-04-07|1992-07-02|NONE|AIR|ructions. fluffily bold requests abo +10599|107|86|1|42|42298.20|0.02|0.07|N|O|1997-08-11|1997-08-26|1997-08-31|TAKE BACK RETURN|TRUCK|l packages near the pending, even re +10599|692|93|2|16|25483.04|0.00|0.04|N|O|1997-08-27|1997-09-19|1997-08-31|DELIVER IN PERSON|RAIL|blithely ironic theodolites use against the +10599|306|63|3|24|28951.20|0.00|0.06|N|O|1997-10-24|1997-09-22|1997-10-25|NONE|RAIL|s. quickly special dep +10599|189|42|4|40|43567.20|0.09|0.04|N|O|1997-07-30|1997-09-21|1997-08-13|COLLECT COD|SHIP| slyly regular packages. regular fra +10624|1052|23|1|23|21920.15|0.06|0.04|R|F|1995-02-09|1995-02-23|1995-03-09|COLLECT COD|AIR|thely regular requests nag furi +10624|113|92|2|46|46603.06|0.03|0.05|A|F|1995-03-13|1995-02-07|1995-03-20|COLLECT COD|AIR|inal packages after +10624|1548|89|3|22|31889.88|0.02|0.05|A|F|1995-01-19|1995-03-08|1995-01-23|COLLECT COD|REG AIR|yly regular foxes boost d +10624|1471|72|4|24|32939.28|0.10|0.07|A|F|1995-04-16|1995-02-19|1995-05-01|NONE|RAIL|e the ideas. carefully ironic p +10624|754|51|5|30|49642.50|0.09|0.05|A|F|1995-02-18|1995-03-07|1995-03-18|COLLECT COD|REG AIR|slyly alongside of the slyly +10624|1859|60|6|7|12325.95|0.10|0.02|A|F|1994-12-24|1995-03-04|1995-01-07|TAKE BACK RETURN|TRUCK|beans. pending, regular +10625|889|90|1|20|35797.60|0.09|0.01|N|O|1996-02-14|1996-03-20|1996-03-06|TAKE BACK RETURN|AIR|o beans above the even, even ideas c +10625|1809|10|2|13|22240.40|0.03|0.00|N|O|1996-02-07|1996-03-24|1996-03-08|DELIVER IN PERSON|REG AIR| fluffily bold packages. fluf +10625|1962|7|3|46|85742.16|0.03|0.01|N|O|1996-03-01|1996-03-27|1996-03-14|COLLECT COD|MAIL|s integrate furiousl +10625|117|18|4|7|7119.77|0.07|0.02|N|O|1996-02-15|1996-04-20|1996-03-12|COLLECT COD|MAIL|ly bold ideas wake fi +10625|819|53|5|12|20637.72|0.03|0.08|N|O|1996-02-02|1996-03-06|1996-02-19|COLLECT COD|MAIL|luffy packages. furiously bold +10625|117|44|6|12|12205.32|0.10|0.04|N|O|1996-02-15|1996-03-22|1996-02-28|TAKE BACK RETURN|SHIP|p along the +10625|618|12|7|35|53151.35|0.04|0.08|N|O|1996-03-20|1996-03-22|1996-04-11|NONE|AIR| above the furiously final deposits. de +10626|1019|20|1|21|19320.21|0.04|0.03|N|O|1995-12-26|1996-01-28|1996-01-11|DELIVER IN PERSON|TRUCK|o the furious +10627|1743|70|1|24|39473.76|0.01|0.03|R|F|1993-02-26|1993-04-30|1993-03-20|DELIVER IN PERSON|TRUCK|quickly bold forges. e +10627|1471|89|2|27|37056.69|0.08|0.02|A|F|1993-03-16|1993-05-19|1993-03-29|DELIVER IN PERSON|MAIL|at the cou +10627|564|25|3|41|60046.96|0.06|0.02|R|F|1993-03-11|1993-05-18|1993-04-07|COLLECT COD|RAIL|sits unwind +10627|499|58|4|28|39185.72|0.01|0.08|A|F|1993-04-06|1993-04-10|1993-04-20|TAKE BACK RETURN|SHIP|e even pinto b +10627|1207|19|5|35|38787.00|0.09|0.02|R|F|1993-04-08|1993-03-30|1993-05-06|DELIVER IN PERSON|RAIL|ily final theodolites sle +10628|487|75|1|4|5549.92|0.01|0.04|N|O|1998-08-16|1998-08-08|1998-09-08|COLLECT COD|REG AIR|regularly b +10629|1108|81|1|24|24218.40|0.04|0.08|R|F|1994-11-03|1994-10-23|1994-11-16|TAKE BACK RETURN|SHIP|dogged requests. ir +10629|1934|35|2|16|29374.88|0.00|0.02|A|F|1994-12-03|1994-11-23|1994-12-24|COLLECT COD|MAIL|ounts haggle bl +10630|1447|26|1|29|39104.76|0.10|0.01|R|F|1993-04-23|1993-04-10|1993-05-11|NONE|AIR|deposits boo +10630|1469|70|2|15|20556.90|0.10|0.00|R|F|1993-04-03|1993-04-23|1993-04-20|NONE|RAIL|y. slyly furious foxes ought to are bli +10630|847|81|3|37|64670.08|0.06|0.08|A|F|1993-03-04|1993-04-09|1993-03-26|NONE|TRUCK|l, special instruc +10630|1305|82|4|20|24126.00|0.08|0.05|R|F|1993-05-16|1993-04-01|1993-06-02|DELIVER IN PERSON|FOB|ld platelets wake blithely after the +10631|753|54|1|45|74418.75|0.08|0.03|A|F|1993-07-24|1993-07-15|1993-08-08|NONE|MAIL| regular ideas s +10631|1035|6|2|10|9360.30|0.05|0.02|A|F|1993-07-07|1993-07-29|1993-07-09|COLLECT COD|REG AIR|pliers boos +10631|1541|42|3|36|51931.44|0.08|0.00|R|F|1993-08-16|1993-07-19|1993-09-14|NONE|AIR|ve the Tiresias integrate against the +10631|1564|5|4|23|33707.88|0.09|0.01|R|F|1993-08-11|1993-07-25|1993-09-10|COLLECT COD|REG AIR|kly? fluffily final foxes wake b +10631|289|90|5|24|28542.72|0.08|0.01|A|F|1993-06-20|1993-08-09|1993-07-17|TAKE BACK RETURN|SHIP|ns use sly +10631|894|61|6|41|73590.49|0.02|0.02|A|F|1993-08-02|1993-07-07|1993-08-13|TAKE BACK RETURN|MAIL|ding, special theod +10656|1982|15|1|47|88547.06|0.05|0.00|N|O|1995-11-06|1996-01-23|1995-11-16|NONE|TRUCK|o beans. furiously regular foxes +10656|1181|90|2|11|11903.98|0.08|0.03|N|O|1995-12-02|1995-12-30|1995-12-10|TAKE BACK RETURN|SHIP|arefully regular deposits. even co +10656|320|77|3|1|1220.32|0.00|0.05|N|O|1995-12-27|1995-12-03|1996-01-07|DELIVER IN PERSON|RAIL|ck, unusual accounts. iron +10657|1064|70|1|20|19301.20|0.03|0.04|A|F|1993-11-16|1993-12-09|1993-11-30|TAKE BACK RETURN|TRUCK|s. carefully silent courts arou +10657|1925|58|2|29|52980.68|0.01|0.06|A|F|1993-11-12|1993-11-14|1993-12-06|NONE|AIR|gular accounts. ironic package +10657|373|58|3|13|16553.81|0.06|0.03|R|F|1993-12-01|1993-12-05|1993-12-07|TAKE BACK RETURN|TRUCK|lithely quickly brave request +10658|864|31|1|19|33532.34|0.09|0.00|R|F|1994-10-15|1994-10-05|1994-10-24|NONE|SHIP|osits cajole slyly around the bold dec +10658|1368|83|2|2|2538.72|0.00|0.04|R|F|1994-12-01|1994-11-04|1994-12-30|NONE|FOB|totes sleep quickly over the carefu +10658|1332|33|3|6|7399.98|0.01|0.08|R|F|1994-09-28|1994-10-19|1994-10-12|COLLECT COD|SHIP| sleep according to the fluffily ironic a +10658|551|42|4|2|2903.10|0.06|0.00|A|F|1994-12-02|1994-10-17|1994-12-14|COLLECT COD|TRUCK|de of the deposits. blithely busy asymptote +10658|1868|55|5|3|5309.58|0.05|0.01|A|F|1994-11-17|1994-11-02|1994-11-22|TAKE BACK RETURN|TRUCK| requests use pending, final fr +10658|33|34|6|37|34522.11|0.06|0.08|A|F|1994-09-21|1994-09-30|1994-09-27|NONE|FOB| deposits. quickly reg +10658|770|35|7|21|35086.17|0.07|0.04|R|F|1994-12-06|1994-11-08|1994-12-15|COLLECT COD|AIR|theodolites us +10659|1999|32|1|6|11405.94|0.08|0.06|R|F|1994-08-28|1994-07-12|1994-09-24|DELIVER IN PERSON|SHIP|slyly even re +10659|870|37|2|41|72605.67|0.10|0.00|R|F|1994-07-01|1994-06-16|1994-07-15|TAKE BACK RETURN|TRUCK| slyly final asymptotes +10659|778|43|3|26|43648.02|0.03|0.05|R|F|1994-05-19|1994-06-17|1994-06-01|TAKE BACK RETURN|MAIL| slyly. final, special accounts det +10659|498|86|4|15|20977.35|0.09|0.01|R|F|1994-08-14|1994-07-17|1994-08-23|DELIVER IN PERSON|SHIP|kages solve c +10659|1848|35|5|41|71743.44|0.00|0.07|A|F|1994-08-21|1994-07-16|1994-09-19|NONE|AIR|rays across t +10659|1459|99|6|49|66662.05|0.04|0.00|R|F|1994-08-10|1994-08-02|1994-09-08|COLLECT COD|MAIL|es believe alongside of the furi +10659|641|42|7|6|9249.84|0.00|0.06|R|F|1994-08-07|1994-07-09|1994-08-11|DELIVER IN PERSON|SHIP|s cajole. fluffily bold theodolites along +10660|1799|100|1|49|83338.71|0.09|0.04|N|O|1998-08-22|1998-06-27|1998-09-07|TAKE BACK RETURN|SHIP|g furiously. carefully pending depo +10660|1784|11|2|10|16857.80|0.05|0.03|N|O|1998-07-02|1998-07-14|1998-07-18|COLLECT COD|REG AIR|efully ruthles +10660|1000|3|3|48|43248.00|0.10|0.02|N|O|1998-07-24|1998-06-28|1998-08-13|TAKE BACK RETURN|AIR|ilent requests. fu +10661|1563|64|1|33|48330.48|0.09|0.01|R|F|1994-05-03|1994-03-08|1994-05-06|TAKE BACK RETURN|FOB|ly above the ne +10661|1090|26|2|16|15857.44|0.00|0.08|R|F|1994-02-16|1994-03-17|1994-02-20|DELIVER IN PERSON|RAIL| regular packages. even, quiet +10661|1267|5|3|27|31543.02|0.09|0.00|A|F|1994-01-27|1994-03-23|1994-02-08|COLLECT COD|REG AIR|ns. ironically fin +10662|465|95|1|4|5461.84|0.10|0.01|N|O|1995-07-15|1995-07-14|1995-07-24|TAKE BACK RETURN|AIR| accounts boost above the depos +10662|1529|70|2|41|58651.32|0.03|0.04|N|O|1995-07-15|1995-06-26|1995-08-13|NONE|RAIL| regular pinto beans nag express the +10662|1106|43|3|39|39276.90|0.01|0.02|A|F|1995-05-26|1995-07-07|1995-06-09|NONE|TRUCK|ackages. final packages do +10662|1489|90|4|39|54228.72|0.07|0.06|R|F|1995-05-26|1995-06-26|1995-05-28|DELIVER IN PERSON|AIR|ss the blithely s +10663|78|54|1|27|26407.89|0.09|0.03|R|F|1994-06-09|1994-08-16|1994-07-08|DELIVER IN PERSON|AIR|se besides the regular pinto beans. slyly +10663|1786|13|2|35|59072.30|0.07|0.01|R|F|1994-07-20|1994-07-21|1994-08-01|TAKE BACK RETURN|MAIL|ounts cajole stealthily agains +10663|903|4|3|25|45097.50|0.10|0.00|A|F|1994-05-29|1994-07-05|1994-06-27|NONE|AIR|ajole furiously express asymptotes. care +10663|1761|46|4|19|31592.44|0.00|0.04|A|F|1994-07-13|1994-07-29|1994-08-06|DELIVER IN PERSON|MAIL|c requests around the carefully +10688|451|81|1|16|21623.20|0.05|0.01|A|F|1992-06-19|1992-07-31|1992-07-06|TAKE BACK RETURN|AIR|ing instructions nag according t +10688|1326|27|2|19|23319.08|0.09|0.07|R|F|1992-06-16|1992-06-27|1992-07-05|TAKE BACK RETURN|MAIL|to beans solve blithely quickly permane +10689|1371|48|1|26|33081.62|0.08|0.08|N|O|1996-09-09|1996-08-25|1996-09-21|COLLECT COD|FOB|y. regular, busy requests us +10689|395|52|2|11|14249.29|0.09|0.07|N|O|1996-07-25|1996-10-17|1996-08-20|TAKE BACK RETURN|RAIL| furiously. pending depen +10689|1287|88|3|47|55849.16|0.06|0.00|N|O|1996-08-15|1996-09-21|1996-09-02|TAKE BACK RETURN|REG AIR|uctions are. blithely speci +10690|1506|47|1|14|19705.00|0.05|0.07|N|O|1997-12-19|1998-01-22|1997-12-31|NONE|REG AIR| fluffily regular deposits are +10690|344|1|2|27|33597.18|0.08|0.06|N|O|1998-01-06|1998-01-26|1998-01-23|DELIVER IN PERSON|MAIL|lent foxes wake busily. blith +10690|986|21|3|1|1886.98|0.00|0.05|N|O|1998-03-22|1998-02-21|1998-04-04|TAKE BACK RETURN|REG AIR|al accounts! fl +10691|1548|29|1|10|14495.40|0.04|0.00|R|F|1995-04-11|1995-05-16|1995-05-10|DELIVER IN PERSON|MAIL|pecial deposits cajole +10691|1487|88|2|18|24992.64|0.05|0.08|A|F|1995-05-14|1995-05-05|1995-06-06|TAKE BACK RETURN|MAIL|nal deposits sleep ir +10691|308|65|3|43|51956.90|0.10|0.02|R|F|1995-06-02|1995-05-16|1995-06-17|DELIVER IN PERSON|SHIP|c deposits. furiously expre +10692|1878|8|1|1|1779.87|0.09|0.03|A|F|1994-08-27|1994-09-13|1994-09-13|NONE|REG AIR|kages. quickly ironic packages n +10692|1319|58|2|3|3660.93|0.07|0.06|R|F|1994-10-04|1994-09-19|1994-10-09|DELIVER IN PERSON|AIR|he fluffy, unusual accounts. blithel +10692|1235|47|3|49|55675.27|0.03|0.06|A|F|1994-08-14|1994-09-08|1994-08-19|TAKE BACK RETURN|REG AIR|thely brave deposits sleep b +10692|1309|10|4|7|8472.10|0.07|0.01|A|F|1994-08-27|1994-10-13|1994-09-22|COLLECT COD|REG AIR|sits. carefully unusual requests coul +10692|724|57|5|28|45492.16|0.02|0.00|A|F|1994-08-06|1994-09-25|1994-08-30|DELIVER IN PERSON|TRUCK|ng ideas use +10692|181|8|6|40|43247.20|0.05|0.05|A|F|1994-07-29|1994-08-30|1994-08-11|DELIVER IN PERSON|SHIP|yly careful pinto beans +10693|1453|32|1|35|47405.75|0.10|0.02|N|F|1995-06-15|1995-07-14|1995-07-10|COLLECT COD|FOB|ng the special accounts nag f +10694|1806|36|1|19|32448.20|0.05|0.03|N|O|1998-01-22|1998-02-10|1998-01-28|TAKE BACK RETURN|TRUCK|e regular, express instruction +10694|1006|7|2|11|9977.00|0.08|0.03|N|O|1998-03-07|1998-02-26|1998-03-23|TAKE BACK RETURN|AIR|ully ironic notornis are ironic, special f +10694|903|38|3|32|57724.80|0.08|0.04|N|O|1997-12-24|1998-01-17|1998-01-19|COLLECT COD|AIR| blithely i +10694|899|33|4|15|26998.35|0.07|0.03|N|O|1997-12-25|1998-02-24|1998-01-06|TAKE BACK RETURN|REG AIR| detect bl +10694|1161|70|5|38|40362.08|0.00|0.05|N|O|1998-01-03|1998-01-19|1998-01-30|COLLECT COD|REG AIR|ely regular accounts. care +10694|1040|11|6|8|7528.32|0.03|0.08|N|O|1998-03-08|1998-01-17|1998-03-25|NONE|FOB|cording to the blithel +10694|1020|56|7|12|11052.24|0.07|0.03|N|O|1998-01-05|1998-02-06|1998-01-12|DELIVER IN PERSON|FOB|furiously even deposits sleep among t +10695|785|18|1|5|8428.90|0.09|0.02|N|O|1995-07-05|1995-07-07|1995-07-28|COLLECT COD|AIR|lar pinto beans. final +10695|1770|55|2|39|65199.03|0.06|0.01|N|F|1995-06-02|1995-06-20|1995-06-23|TAKE BACK RETURN|MAIL|ect. slyly ironic foxes according to the f +10695|1999|44|3|9|17108.91|0.05|0.01|R|F|1995-05-28|1995-07-14|1995-06-16|NONE|REG AIR|sly. ironic sauternes across the +10695|1570|11|4|5|7357.85|0.02|0.03|N|O|1995-07-31|1995-07-29|1995-08-02|TAKE BACK RETURN|MAIL|lent asymptotes cajole carefully accordin +10720|142|95|1|9|9379.26|0.03|0.06|N|O|1998-04-19|1998-06-07|1998-04-21|TAKE BACK RETURN|MAIL|haggle furiously around t +10720|1189|90|2|32|34885.76|0.05|0.03|N|O|1998-07-29|1998-06-24|1998-08-05|TAKE BACK RETURN|SHIP|ependencies. carefully final theodo +10720|358|87|3|7|8808.45|0.01|0.03|N|O|1998-04-25|1998-06-10|1998-04-29|DELIVER IN PERSON|SHIP|iously bold dolphins. regular, regular +10720|113|92|4|20|20262.20|0.09|0.07|N|O|1998-06-28|1998-05-25|1998-07-23|DELIVER IN PERSON|RAIL|omise furiously express instr +10720|1228|66|5|15|16938.30|0.06|0.06|N|O|1998-05-05|1998-06-11|1998-05-22|NONE|AIR|quests sleep. ironic theodo +10721|1348|25|1|25|31233.50|0.02|0.08|N|O|1996-04-18|1996-05-09|1996-04-28|DELIVER IN PERSON|AIR|nto beans. careful +10721|1413|53|2|11|14458.51|0.05|0.00|N|O|1996-05-22|1996-04-18|1996-06-01|NONE|RAIL|riously regular theodolites. slyl +10721|687|81|3|39|61919.52|0.05|0.03|N|O|1996-06-22|1996-04-26|1996-07-09|DELIVER IN PERSON|RAIL|lets. slyly regular +10722|718|15|1|27|43705.17|0.00|0.08|R|F|1995-04-26|1995-02-23|1995-05-13|NONE|REG AIR|s are. carefully special excuses +10722|489|48|2|30|41684.40|0.08|0.05|A|F|1995-02-26|1995-03-29|1995-03-24|COLLECT COD|TRUCK|atelets: ironic, pe +10722|1273|74|3|48|56364.96|0.04|0.00|R|F|1995-03-04|1995-03-23|1995-03-17|NONE|TRUCK| quickly. platelets promise furiously at +10722|1018|89|4|7|6433.07|0.06|0.03|R|F|1995-05-10|1995-04-13|1995-05-16|COLLECT COD|FOB|urts wake. blith +10722|660|61|5|43|67108.38|0.04|0.01|R|F|1995-02-25|1995-03-01|1995-03-04|DELIVER IN PERSON|AIR|he dependencies. furiously eve +10722|1131|68|6|6|6192.78|0.09|0.03|R|F|1995-02-12|1995-04-02|1995-02-21|NONE|FOB|eas. carefully special deposits after the +10723|904|73|1|23|41512.70|0.06|0.05|N|O|1998-07-25|1998-06-30|1998-08-11|TAKE BACK RETURN|REG AIR|counts sleep blithely silent re +10723|114|67|2|27|27380.97|0.03|0.06|N|O|1998-07-07|1998-08-08|1998-07-13|TAKE BACK RETURN|TRUCK|jole carefully. deposits wake slyly. unusua +10724|606|7|1|38|57250.80|0.02|0.08|A|F|1994-10-30|1994-11-06|1994-11-12|NONE|FOB|l, bold packages are sl +10724|254|9|2|14|16159.50|0.00|0.08|A|F|1994-09-21|1994-11-24|1994-10-05|COLLECT COD|SHIP|he depths detect s +10724|1960|49|3|47|87512.12|0.10|0.08|A|F|1995-01-04|1994-11-02|1995-01-14|COLLECT COD|MAIL|. furiously final asymptotes afte +10724|751|52|4|32|52856.00|0.01|0.01|R|F|1994-11-28|1994-10-17|1994-12-28|DELIVER IN PERSON|MAIL|al dolphins cajole busily. regular asympto +10725|1012|18|1|28|25564.28|0.01|0.07|N|O|1998-05-14|1998-06-10|1998-06-05|NONE|MAIL|nstructions. always regular requ +10725|1717|60|2|28|45323.88|0.09|0.00|N|O|1998-05-19|1998-06-29|1998-06-09|COLLECT COD|SHIP| furiously final notornis wake carefully +10725|873|74|3|5|8869.35|0.01|0.01|N|O|1998-07-07|1998-05-22|1998-07-09|NONE|FOB|accounts affix +10726|1679|80|1|17|26871.39|0.01|0.04|A|F|1993-06-25|1993-07-02|1993-07-14|DELIVER IN PERSON|REG AIR|unts integrate fluffily alongs +10726|1434|35|2|10|13354.30|0.01|0.01|A|F|1993-05-14|1993-06-11|1993-05-16|COLLECT COD|SHIP|. ironic, ironic a +10726|1722|65|3|26|42216.72|0.08|0.06|A|F|1993-05-17|1993-06-10|1993-06-05|DELIVER IN PERSON|RAIL|ely final i +10726|176|55|4|48|51656.16|0.09|0.02|R|F|1993-06-24|1993-06-12|1993-07-21|DELIVER IN PERSON|AIR| across the quickly +10726|1900|30|5|13|23424.70|0.02|0.05|A|F|1993-06-20|1993-07-15|1993-07-07|NONE|REG AIR|ze slyly against the fu +10726|1179|16|6|48|51848.16|0.05|0.08|A|F|1993-06-13|1993-06-12|1993-07-10|DELIVER IN PERSON|SHIP|ironic accounts. si +10726|1717|2|7|5|8093.55|0.05|0.03|R|F|1993-05-31|1993-07-07|1993-06-10|COLLECT COD|FOB|jole above the regular packages. ent +10727|985|54|1|34|64123.32|0.08|0.07|A|F|1992-10-10|1992-10-23|1992-11-07|TAKE BACK RETURN|MAIL|ake requests. +10727|1824|54|2|38|65581.16|0.07|0.02|R|F|1992-11-22|1992-10-03|1992-11-29|DELIVER IN PERSON|RAIL|nts haggle slyly theodolites. quickly fina +10727|272|73|3|17|19928.59|0.02|0.07|R|F|1992-08-13|1992-10-28|1992-08-14|COLLECT COD|REG AIR|y furiously at the blithely pending as +10727|1132|41|4|22|22728.86|0.10|0.07|R|F|1992-08-29|1992-09-21|1992-09-01|TAKE BACK RETURN|REG AIR|unusual platelets. fluffi +10727|849|50|5|48|83992.32|0.09|0.00|A|F|1992-08-06|1992-09-26|1992-09-03|TAKE BACK RETURN|RAIL|ct carefully. silent +10727|1898|42|6|20|35997.80|0.07|0.00|R|F|1992-10-13|1992-09-04|1992-11-07|COLLECT COD|MAIL| quickly. carefully final accounts wake fur +10727|395|80|7|27|34975.53|0.07|0.03|A|F|1992-11-08|1992-09-08|1992-11-16|DELIVER IN PERSON|MAIL|usual packages. furiously +10752|331|32|1|39|48021.87|0.03|0.02|N|O|1995-09-27|1995-12-09|1995-10-15|COLLECT COD|MAIL|y alongside of the even fo +10752|1400|77|2|49|63768.60|0.08|0.02|N|O|1995-10-20|1995-11-02|1995-11-18|COLLECT COD|SHIP|sly special deposits af +10752|1328|43|3|27|33191.64|0.09|0.01|N|O|1995-09-25|1995-11-28|1995-09-26|NONE|AIR|ular requests. +10752|1859|46|4|50|88042.50|0.06|0.04|N|O|1995-11-08|1995-11-30|1995-12-01|DELIVER IN PERSON|SHIP|aids at the quickly final foxes maintai +10753|126|79|1|22|22574.64|0.08|0.00|A|F|1994-08-14|1994-07-29|1994-08-19|COLLECT COD|TRUCK|ccounts. instructi +10754|1166|39|1|46|49089.36|0.10|0.03|R|F|1993-06-16|1993-04-25|1993-06-29|DELIVER IN PERSON|AIR|kly across the +10754|903|72|2|34|61332.60|0.03|0.05|R|F|1993-07-11|1993-06-09|1993-08-09|DELIVER IN PERSON|REG AIR|e carefully against +10754|401|89|3|14|18219.60|0.03|0.03|A|F|1993-04-18|1993-05-13|1993-05-01|COLLECT COD|MAIL|y ironic ideas. bold packages n +10754|369|26|4|34|43158.24|0.03|0.06|R|F|1993-03-31|1993-05-01|1993-04-22|NONE|FOB|gular accounts. regular courts above the c +10754|1078|84|5|27|26434.89|0.08|0.01|A|F|1993-06-09|1993-05-18|1993-06-11|DELIVER IN PERSON|FOB| the blithely regular requests +10754|1890|77|6|21|37629.69|0.10|0.03|A|F|1993-06-30|1993-04-22|1993-07-30|COLLECT COD|TRUCK|furiously ironic +10755|1221|96|1|48|53866.56|0.04|0.04|R|F|1993-08-22|1993-09-22|1993-09-13|DELIVER IN PERSON|RAIL|ress dependencies engage slyly ab +10755|826|26|2|6|10360.92|0.08|0.08|A|F|1993-08-18|1993-09-05|1993-09-09|COLLECT COD|SHIP|ng foxes cajole carefu +10755|775|72|3|9|15081.93|0.06|0.05|A|F|1993-10-06|1993-09-25|1993-10-18|NONE|SHIP|sits. silent packages wake furiously +10755|742|39|4|34|55853.16|0.07|0.04|A|F|1993-07-17|1993-09-12|1993-08-09|NONE|SHIP|iously spe +10756|1158|95|1|39|41306.85|0.06|0.05|A|F|1992-06-23|1992-07-14|1992-06-27|TAKE BACK RETURN|SHIP|slowly regular or +10757|968|71|1|39|72889.44|0.04|0.07|N|O|1998-09-04|1998-07-18|1998-09-16|NONE|REG AIR|sits cajole sile +10757|1060|31|2|19|18260.14|0.07|0.05|N|O|1998-07-21|1998-08-26|1998-08-18|TAKE BACK RETURN|RAIL|packages use instructions. pi +10758|528|29|1|34|48569.68|0.05|0.08|N|O|1997-01-26|1997-01-28|1997-02-24|COLLECT COD|FOB|counts again +10758|1936|69|2|17|31244.81|0.01|0.00|N|O|1997-02-19|1996-12-17|1997-03-02|DELIVER IN PERSON|RAIL|ly asymptotes. furiously regular pearls +10758|143|44|3|2|2086.28|0.06|0.07|N|O|1997-01-29|1997-01-18|1997-01-30|DELIVER IN PERSON|FOB|s. pinto beans u +10758|1709|52|4|33|53153.10|0.03|0.04|N|O|1997-01-24|1996-12-28|1997-01-29|NONE|AIR|y against the furiously ironic ac +10759|1510|51|1|10|14115.10|0.05|0.07|N|O|1996-10-18|1996-11-16|1996-11-02|DELIVER IN PERSON|TRUCK|ts thrash blithely among th +10759|630|93|2|26|39796.38|0.01|0.02|N|O|1996-10-06|1996-12-16|1996-10-25|TAKE BACK RETURN|RAIL|requests. s +10784|1581|82|1|31|45959.98|0.03|0.01|A|F|1993-10-30|1993-09-13|1993-11-28|DELIVER IN PERSON|AIR| deposits nag slyl +10784|1744|87|2|9|14811.66|0.00|0.06|R|F|1993-09-08|1993-09-11|1993-09-30|COLLECT COD|RAIL|nto beans cajole blithely ironic, si +10784|1383|98|3|20|25687.60|0.03|0.04|A|F|1993-10-28|1993-09-27|1993-11-05|NONE|SHIP|azzle across the blithely spe +10784|1633|34|4|42|64454.46|0.09|0.00|A|F|1993-10-15|1993-08-13|1993-11-14|COLLECT COD|FOB|lyly even requests boost quick +10784|98|49|5|8|7984.72|0.08|0.03|A|F|1993-09-04|1993-09-29|1993-09-30|COLLECT COD|FOB|sly special deposits wake fu +10784|903|4|6|18|32470.20|0.05|0.03|A|F|1993-07-20|1993-09-21|1993-07-21|NONE|REG AIR|y. fluffily sp +10785|1552|53|1|1|1453.55|0.03|0.07|R|F|1992-09-08|1992-08-14|1992-09-16|TAKE BACK RETURN|MAIL| instructions. regular, sile +10786|480|39|1|36|49697.28|0.08|0.03|N|O|1995-10-30|1995-09-26|1995-11-14|COLLECT COD|MAIL|y even, final requests. regular, ironi +10786|790|23|2|14|23671.06|0.08|0.05|N|O|1995-10-07|1995-09-16|1995-10-19|TAKE BACK RETURN|SHIP|xcuses boost +10786|158|85|3|1|1058.15|0.08|0.03|N|O|1995-10-08|1995-11-02|1995-10-10|NONE|SHIP|t. foxes along the furiously spec +10787|668|69|1|29|45491.14|0.00|0.04|N|O|1997-05-01|1997-04-01|1997-05-08|NONE|TRUCK|e carefully according +10787|1342|81|2|42|52220.28|0.06|0.02|N|O|1997-02-15|1997-05-05|1997-03-14|COLLECT COD|AIR|ts are quickly. eve +10787|534|25|3|47|67422.91|0.01|0.07|N|O|1997-04-22|1997-03-19|1997-05-01|TAKE BACK RETURN|REG AIR|ffily bold waters wake express deposits; sp +10787|1764|7|4|36|59967.36|0.10|0.07|N|O|1997-04-01|1997-04-11|1997-04-23|COLLECT COD|RAIL|st are. blithely even gifts along t +10787|1157|94|5|47|49733.05|0.04|0.00|N|O|1997-06-06|1997-04-25|1997-06-17|COLLECT COD|FOB|eas. instructions wake blith +10787|1671|13|6|30|47180.10|0.07|0.05|N|O|1997-05-16|1997-04-03|1997-06-07|DELIVER IN PERSON|MAIL|usual requests wake slyl +10787|1977|66|7|28|52611.16|0.02|0.02|N|O|1997-04-30|1997-04-15|1997-05-06|NONE|AIR|ular pinto beans. carefu +10788|509|100|1|22|31009.00|0.00|0.06|N|O|1997-04-18|1997-03-18|1997-05-01|NONE|AIR|y final instructio +10788|153|32|2|27|28435.05|0.01|0.04|N|O|1997-03-06|1997-03-17|1997-03-28|NONE|REG AIR|pinto beans. ironic theo +10788|535|26|3|26|37323.78|0.03|0.01|N|O|1997-03-06|1997-04-13|1997-03-28|NONE|AIR|dolphins. carefully enticing requests +10788|1965|66|4|28|52274.88|0.08|0.02|N|O|1997-05-13|1997-04-10|1997-06-05|TAKE BACK RETURN|SHIP|ake carefully silently bold pa +10789|1556|77|1|7|10202.85|0.08|0.00|R|F|1993-09-23|1993-10-24|1993-10-11|NONE|SHIP|y unusual theodolit +10789|176|55|2|36|38742.12|0.08|0.00|R|F|1993-08-25|1993-10-23|1993-09-11|TAKE BACK RETURN|MAIL|alongside of the furiously +10789|209|91|3|25|27730.00|0.09|0.06|A|F|1993-09-06|1993-10-31|1993-09-12|COLLECT COD|SHIP|tructions nag quickly. slyly silent forge +10789|98|99|4|9|8982.81|0.00|0.08|R|F|1993-12-11|1993-10-11|1993-12-16|NONE|TRUCK|endencies-- blithely f +10789|760|61|5|7|11625.32|0.00|0.07|A|F|1993-08-26|1993-11-11|1993-09-02|COLLECT COD|TRUCK|ncies above the final courts hag +10790|1566|67|1|27|39624.12|0.09|0.00|A|F|1994-12-17|1995-01-23|1995-01-15|TAKE BACK RETURN|TRUCK|as. requests +10790|1827|28|2|24|41491.68|0.03|0.03|R|F|1995-01-30|1995-01-29|1995-02-15|TAKE BACK RETURN|FOB|thely. bus +10791|285|86|1|35|41484.80|0.03|0.08|N|O|1995-09-21|1995-10-26|1995-10-04|DELIVER IN PERSON|SHIP|slyly unusual foxes wake entic +10791|1742|69|2|24|39449.76|0.07|0.03|N|O|1995-10-08|1995-10-09|1995-10-24|COLLECT COD|AIR|furiously pending dependencies. pinto beans +10791|1162|71|3|40|42526.40|0.06|0.03|N|O|1995-08-22|1995-11-02|1995-09-21|NONE|FOB|sly ironic packages. thin deposits ab +10791|930|31|4|23|42111.39|0.09|0.06|N|O|1995-10-29|1995-11-10|1995-11-02|NONE|TRUCK|efully above the ironic, re +10791|1570|71|5|8|11772.56|0.10|0.02|N|O|1995-10-06|1995-11-12|1995-10-21|TAKE BACK RETURN|FOB|es about the quickly even +10816|1219|57|1|22|24644.62|0.01|0.06|N|O|1996-02-17|1996-02-27|1996-03-10|NONE|MAIL|osits are slyly even packag +10816|1603|27|2|14|21064.40|0.08|0.02|N|O|1996-04-25|1996-02-22|1996-05-17|NONE|FOB|ach furiously above the regular sentiments. +10817|224|6|1|4|4496.88|0.06|0.05|N|O|1997-02-26|1997-02-13|1997-03-06|TAKE BACK RETURN|FOB|lithely pending p +10817|1377|92|2|39|49856.43|0.00|0.07|N|O|1997-02-23|1997-01-17|1997-02-28|TAKE BACK RETURN|FOB|re fluffily according to the +10817|20|96|3|43|39560.86|0.05|0.05|N|O|1997-04-06|1997-03-04|1997-04-25|DELIVER IN PERSON|REG AIR|ar accounts. express frets affix +10817|579|70|4|33|48825.81|0.03|0.04|N|O|1997-03-04|1997-02-19|1997-03-24|COLLECT COD|FOB|gular requests wake +10817|1693|76|5|44|70166.36|0.07|0.03|N|O|1996-12-27|1997-01-08|1997-01-21|TAKE BACK RETURN|REG AIR|de of the fluffily final reque +10818|647|41|1|9|13928.76|0.03|0.08|N|O|1998-06-06|1998-07-22|1998-06-26|DELIVER IN PERSON|SHIP|es-- bravely regular platelets haggle care +10818|1040|46|2|45|42346.80|0.08|0.08|N|O|1998-07-26|1998-07-28|1998-08-09|TAKE BACK RETURN|MAIL|heodolites sleep quic +10818|149|28|3|15|15737.10|0.02|0.08|N|O|1998-06-07|1998-06-26|1998-06-19|NONE|MAIL| furiously express a +10818|598|99|4|33|49453.47|0.06|0.03|N|O|1998-08-11|1998-07-30|1998-08-25|TAKE BACK RETURN|AIR|s across the regular pinto beans +10818|1048|84|5|38|36063.52|0.06|0.05|N|O|1998-07-03|1998-06-20|1998-07-26|TAKE BACK RETURN|FOB|ven requests. bold, dogged senti +10818|736|33|6|50|81836.50|0.07|0.04|N|O|1998-06-05|1998-07-11|1998-07-03|NONE|RAIL|deas are slyly. even deposits +10818|1383|98|7|8|10275.04|0.10|0.02|N|O|1998-08-23|1998-07-29|1998-09-13|COLLECT COD|MAIL|st furiously final instructions! +10819|965|100|1|12|22391.52|0.03|0.08|R|F|1993-11-02|1993-11-09|1993-11-04|TAKE BACK RETURN|RAIL|tithes. ironic, special ideas about the +10819|1997|86|2|32|60767.68|0.07|0.00|A|F|1993-08-31|1993-10-30|1993-09-26|DELIVER IN PERSON|FOB|ecial theodolites. i +10820|713|78|1|28|45183.88|0.10|0.03|N|O|1996-04-14|1996-01-27|1996-05-01|TAKE BACK RETURN|TRUCK| carefully ironic instructions +10820|147|48|2|37|38744.18|0.09|0.03|N|O|1995-12-29|1996-02-08|1996-01-11|COLLECT COD|REG AIR|s. blithe dep +10820|1491|70|3|24|33419.76|0.02|0.07|N|O|1996-03-17|1996-03-09|1996-04-09|NONE|TRUCK|rets. requests affix f +10820|1703|88|4|26|41722.20|0.01|0.02|N|O|1996-03-15|1996-02-17|1996-03-26|DELIVER IN PERSON|FOB|l requests wake-- +10820|848|49|5|21|36725.64|0.01|0.04|N|O|1996-01-28|1996-02-28|1996-02-08|DELIVER IN PERSON|REG AIR|ly final theodol +10820|669|63|6|16|25114.56|0.05|0.01|N|O|1996-04-04|1996-03-16|1996-04-25|NONE|RAIL|st the fluffily even accoun +10820|1546|47|7|2|2895.08|0.06|0.08|N|O|1996-03-20|1996-03-17|1996-04-15|COLLECT COD|RAIL|t to use furious +10821|1633|16|1|46|70592.98|0.09|0.07|N|O|1996-07-18|1996-06-19|1996-07-23|COLLECT COD|MAIL|hely according to the sl +10821|1247|85|2|47|53967.28|0.01|0.07|N|O|1996-07-31|1996-07-28|1996-08-28|DELIVER IN PERSON|MAIL| bold ideas. fluffily +10821|736|69|3|33|54012.09|0.05|0.05|N|O|1996-08-02|1996-07-11|1996-08-26|TAKE BACK RETURN|REG AIR|posits. final instructions about th +10822|985|86|1|10|18859.80|0.03|0.05|A|F|1994-02-23|1994-02-08|1994-03-09|TAKE BACK RETURN|RAIL|ully regular requests. theodolites amon +10823|678|79|1|32|50517.44|0.06|0.04|A|F|1992-07-03|1992-08-24|1992-07-17|TAKE BACK RETURN|AIR|s grow about the ideas. s +10823|629|30|2|40|61184.80|0.01|0.00|R|F|1992-09-01|1992-09-07|1992-09-21|NONE|SHIP|gular, regular +10848|692|55|1|41|65300.29|0.01|0.04|N|O|1997-01-31|1996-12-28|1997-02-12|TAKE BACK RETURN|TRUCK|usual excuses. +10849|216|71|1|33|36834.93|0.01|0.06|N|O|1997-05-08|1997-03-03|1997-05-20|COLLECT COD|TRUCK|refully expr +10849|1590|31|2|38|56680.42|0.10|0.03|N|O|1997-05-26|1997-03-26|1997-06-03|COLLECT COD|MAIL|foxes. express fo +10849|879|46|3|2|3559.74|0.03|0.00|N|O|1997-04-16|1997-04-08|1997-05-16|COLLECT COD|RAIL|osits affix idly pending instructions +10849|1585|66|4|50|74329.00|0.06|0.06|N|O|1997-02-01|1997-03-20|1997-02-24|NONE|AIR| unusual, thin sentiments. fu +10849|835|35|5|50|86791.50|0.04|0.00|N|O|1997-05-13|1997-04-15|1997-05-17|TAKE BACK RETURN|MAIL| final pinto beans u +10849|597|88|6|39|58406.01|0.02|0.00|N|O|1997-04-09|1997-04-30|1997-04-16|DELIVER IN PERSON|REG AIR|requests are about t +10850|1298|10|1|9|10793.61|0.06|0.02|N|O|1996-11-25|1996-12-19|1996-12-04|COLLECT COD|FOB|ular deposits. packages am +10850|603|97|2|1|1503.60|0.07|0.05|N|O|1996-12-11|1996-11-20|1997-01-09|DELIVER IN PERSON|REG AIR|ironic packages sleep +10850|479|80|3|15|20692.05|0.06|0.04|N|O|1996-11-23|1996-10-25|1996-12-02|TAKE BACK RETURN|SHIP|equests boost platelets. i +10850|1222|23|4|41|46052.02|0.03|0.00|N|O|1996-11-29|1996-10-29|1996-12-12|NONE|MAIL| slyly silent excuses affix slyly accordin +10850|1894|95|5|1|1795.89|0.04|0.02|N|O|1996-09-27|1996-11-24|1996-10-02|DELIVER IN PERSON|FOB|unts. quickly regular warthogs thras +10851|75|1|1|4|3900.28|0.06|0.04|R|F|1994-06-27|1994-06-12|1994-07-19|NONE|FOB|gular tithes. unusual deposits h +10851|697|60|2|33|52723.77|0.07|0.05|R|F|1994-06-16|1994-07-01|1994-07-08|DELIVER IN PERSON|AIR|tions should have to sleep fluffil +10851|1452|92|3|18|24362.10|0.00|0.04|R|F|1994-05-01|1994-06-15|1994-05-09|TAKE BACK RETURN|TRUCK|uffily unusual platelets slee +10851|1711|54|4|29|46768.59|0.01|0.02|A|F|1994-05-18|1994-06-26|1994-05-21|NONE|MAIL|le. ironic dependencie +10851|924|59|5|27|49272.84|0.05|0.04|R|F|1994-04-12|1994-06-14|1994-04-18|DELIVER IN PERSON|MAIL|furiously instructions. deposits a +10851|271|72|6|18|21082.86|0.04|0.05|R|F|1994-07-06|1994-07-01|1994-07-31|NONE|AIR|pendencies. slyly regular +10851|671|65|7|35|55008.45|0.00|0.07|R|F|1994-06-27|1994-06-04|1994-07-22|COLLECT COD|REG AIR|sly unusual dep +10852|1597|38|1|31|46456.29|0.03|0.07|A|F|1994-01-15|1994-01-14|1994-02-09|TAKE BACK RETURN|MAIL| accounts haggle quickly. carefully br +10852|1553|74|2|11|16000.05|0.10|0.00|R|F|1994-01-24|1993-12-01|1994-02-07|DELIVER IN PERSON|MAIL|packages wake +10852|746|43|3|39|64222.86|0.02|0.06|A|F|1993-12-03|1994-01-12|1993-12-07|DELIVER IN PERSON|MAIL|ly final request +10852|855|55|4|35|61454.75|0.07|0.00|A|F|1993-12-17|1993-11-26|1994-01-03|TAKE BACK RETURN|MAIL| according to the requests. careful +10852|1966|11|5|43|80322.28|0.01|0.02|A|F|1993-12-10|1993-12-27|1993-12-26|TAKE BACK RETURN|RAIL|r courts? p +10852|133|12|6|23|23761.99|0.03|0.01|A|F|1993-12-11|1993-12-29|1994-01-02|COLLECT COD|TRUCK|nts are. ev +10853|1490|30|1|14|19480.86|0.02|0.04|R|F|1994-01-27|1994-03-28|1994-02-07|NONE|SHIP|regular packages. slyly bold asympt +10853|1619|61|2|21|31932.81|0.03|0.02|A|F|1994-01-31|1994-04-01|1994-02-21|DELIVER IN PERSON|SHIP|ithely fluffi +10853|643|44|3|12|18523.68|0.10|0.04|A|F|1994-02-10|1994-03-19|1994-03-11|NONE|RAIL|eful platelets. even, final deposits cajo +10854|785|82|1|3|5057.34|0.08|0.05|N|O|1998-08-11|1998-07-30|1998-08-17|DELIVER IN PERSON|AIR|ing to the ironic, final foxes. special ac +10855|5|31|1|38|34390.00|0.10|0.06|N|O|1997-07-23|1997-09-17|1997-08-22|COLLECT COD|RAIL|ross the slyly regular packages. even +10855|1513|14|2|36|50922.36|0.08|0.00|N|O|1997-10-07|1997-08-17|1997-10-27|DELIVER IN PERSON|RAIL|old packages. idle depende +10855|20|96|3|46|42320.92|0.02|0.03|N|O|1997-10-15|1997-09-27|1997-10-18|COLLECT COD|RAIL|y silent packages cajole at the sly +10855|1758|43|4|11|18257.25|0.00|0.00|N|O|1997-09-24|1997-09-10|1997-10-01|COLLECT COD|REG AIR|ias. furiously bold instru +10855|32|58|5|27|25164.81|0.09|0.05|N|O|1997-09-17|1997-09-22|1997-09-23|TAKE BACK RETURN|REG AIR|ctions. quick +10855|1521|22|6|8|11380.16|0.07|0.05|N|O|1997-08-09|1997-09-17|1997-08-26|TAKE BACK RETURN|TRUCK| hinder blithely. furiously special a +10855|1408|48|7|41|53685.40|0.09|0.05|N|O|1997-09-21|1997-09-19|1997-10-04|COLLECT COD|AIR|lly regular request +10880|842|76|1|25|43571.00|0.09|0.01|R|F|1992-06-22|1992-07-31|1992-07-02|COLLECT COD|REG AIR|arefully alongside of the caref +10881|1267|42|1|15|17523.90|0.00|0.08|R|F|1994-06-01|1994-03-29|1994-06-14|TAKE BACK RETURN|SHIP|en platelets haggle after th +10881|1351|66|2|15|18785.25|0.09|0.00|A|F|1994-04-08|1994-04-27|1994-04-22|DELIVER IN PERSON|AIR|dugouts boost against the +10881|884|85|3|11|19633.68|0.06|0.07|A|F|1994-03-01|1994-04-11|1994-03-02|DELIVER IN PERSON|FOB|ending pinto +10881|798|31|4|19|32277.01|0.01|0.01|A|F|1994-02-24|1994-04-26|1994-03-08|TAKE BACK RETURN|REG AIR|es haggle slyly. carefully final exc +10881|976|77|5|32|60063.04|0.01|0.08|A|F|1994-05-19|1994-04-01|1994-05-29|COLLECT COD|FOB|beans print sl +10881|696|59|6|46|73447.74|0.02|0.01|R|F|1994-03-20|1994-04-02|1994-03-26|NONE|SHIP|sits wake quick +10881|518|9|7|7|9929.57|0.00|0.05|A|F|1994-06-09|1994-03-29|1994-06-25|COLLECT COD|AIR|ctions haggle slyly ironic platelets. bli +10882|964|65|1|37|69003.52|0.05|0.02|N|O|1998-07-18|1998-07-23|1998-08-11|COLLECT COD|AIR| unusual requests affi +10882|523|84|2|1|1423.52|0.08|0.00|N|O|1998-07-06|1998-07-14|1998-07-10|TAKE BACK RETURN|REG AIR|ole carefully permanently eve +10882|194|21|3|1|1094.19|0.06|0.02|N|O|1998-06-21|1998-08-10|1998-07-07|TAKE BACK RETURN|FOB|te alongside of the even accounts. excuses +10882|323|24|4|3|3669.96|0.02|0.05|N|O|1998-08-09|1998-08-05|1998-08-28|NONE|FOB|inal, unusual depos +10882|1960|49|5|16|29791.36|0.00|0.04|N|O|1998-08-25|1998-08-18|1998-09-22|TAKE BACK RETURN|REG AIR|, special somas s +10883|507|8|1|47|66152.50|0.06|0.04|N|O|1998-05-17|1998-04-04|1998-06-01|DELIVER IN PERSON|SHIP|ven requests. flu +10883|1228|40|2|19|21455.18|0.06|0.05|N|O|1998-04-22|1998-04-07|1998-05-01|DELIVER IN PERSON|TRUCK| accounts sleep carefully-- furiously un +10883|1672|96|3|9|14163.03|0.10|0.05|N|O|1998-03-04|1998-03-08|1998-04-02|DELIVER IN PERSON|MAIL|ickly. pending, final th +10883|579|80|4|14|20713.98|0.07|0.01|N|O|1998-03-02|1998-04-18|1998-03-08|DELIVER IN PERSON|RAIL|nic packages maintain. r +10884|1392|69|1|17|21987.63|0.01|0.07|A|F|1995-02-02|1995-02-02|1995-02-27|COLLECT COD|FOB|counts cajole q +10884|1037|8|2|32|30016.96|0.06|0.07|A|F|1994-12-30|1995-01-03|1995-01-09|DELIVER IN PERSON|REG AIR|ost quickly +10884|223|5|3|21|23587.62|0.03|0.06|R|F|1995-01-13|1995-01-16|1995-02-03|DELIVER IN PERSON|MAIL|deposits against +10884|816|16|4|1|1716.81|0.05|0.00|R|F|1995-01-08|1995-01-29|1995-01-24|COLLECT COD|FOB|y final requests. fi +10884|1509|30|5|8|11284.00|0.01|0.00|R|F|1995-01-19|1995-01-12|1995-02-13|DELIVER IN PERSON|FOB|erns along the blithely express instru +10884|1111|20|6|50|50605.50|0.00|0.03|R|F|1995-01-15|1994-12-27|1995-01-18|NONE|MAIL|uses integrate slyly fur +10884|1280|18|7|46|54338.88|0.09|0.03|A|F|1994-12-14|1995-01-16|1994-12-23|COLLECT COD|FOB|ssly furiously ironic dep +10885|1963|8|1|22|41029.12|0.01|0.05|N|O|1998-05-29|1998-07-13|1998-06-04|NONE|AIR|tegrate fluffily ironic accounts. quickl +10885|678|41|2|36|56832.12|0.01|0.01|N|O|1998-05-09|1998-06-21|1998-06-02|NONE|MAIL|thely even asymptotes nag furio +10885|1419|37|3|9|11883.69|0.04|0.00|N|O|1998-05-27|1998-05-22|1998-06-04|DELIVER IN PERSON|REG AIR|nding accounts; slyl +10885|1340|55|4|45|55860.30|0.09|0.05|N|O|1998-04-22|1998-05-25|1998-05-07|NONE|MAIL|cial, even theodolit +10885|1917|6|5|47|85488.77|0.00|0.04|N|O|1998-05-01|1998-07-16|1998-05-28|TAKE BACK RETURN|REG AIR| the pending packages haggle asymptot +10886|779|80|1|50|83988.50|0.03|0.02|A|F|1994-12-16|1994-11-18|1995-01-10|COLLECT COD|FOB|elets serve slyly about the accounts +10886|1139|48|2|42|43685.46|0.05|0.00|R|F|1994-11-18|1994-11-02|1994-12-03|COLLECT COD|AIR|dependencies haggle quickly along t +10886|460|48|3|36|48976.56|0.02|0.06|R|F|1994-10-21|1994-10-16|1994-10-24|DELIVER IN PERSON|AIR|nts sleep blithely. id +10886|1477|95|4|12|16541.64|0.07|0.08|A|F|1994-10-27|1994-10-29|1994-10-30|NONE|TRUCK|ackages. fi +10886|795|28|5|21|35611.59|0.03|0.03|R|F|1994-10-27|1994-11-13|1994-11-14|DELIVER IN PERSON|FOB| across th +10886|368|53|6|21|26635.56|0.06|0.08|R|F|1994-09-03|1994-09-26|1994-09-11|COLLECT COD|SHIP|ternes along the ironic r +10886|1704|89|7|13|20874.10|0.06|0.05|R|F|1994-10-11|1994-11-04|1994-11-08|COLLECT COD|TRUCK|l sauternes. ideas wake +10887|1569|90|1|36|52940.16|0.05|0.00|N|O|1995-08-17|1995-07-09|1995-09-07|DELIVER IN PERSON|SHIP|blithely ironic packages cajole caref +10912|1277|89|1|26|30635.02|0.02|0.08|N|O|1996-12-30|1997-03-06|1997-01-24|NONE|MAIL|nts. regular packages promise care +10912|1731|74|2|12|19592.76|0.07|0.00|N|O|1997-03-15|1997-02-06|1997-03-20|DELIVER IN PERSON|RAIL|lyly about the furiously ev +10912|383|84|3|37|47485.06|0.02|0.08|N|O|1997-03-05|1997-03-23|1997-03-30|COLLECT COD|AIR|e after the express accounts. +10912|899|99|4|48|86394.72|0.03|0.02|N|O|1997-04-06|1997-02-03|1997-05-01|TAKE BACK RETURN|REG AIR|r accounts detect slyly +10912|1917|62|5|31|56386.21|0.10|0.00|N|O|1997-03-30|1997-02-25|1997-04-05|NONE|FOB|ar, regular requests w +10912|1673|74|6|4|6298.68|0.07|0.06|N|O|1997-03-03|1997-02-15|1997-03-18|COLLECT COD|SHIP|. regular deposits engage over +10913|670|64|1|27|42408.09|0.10|0.02|A|F|1993-03-23|1993-04-26|1993-04-10|TAKE BACK RETURN|AIR|blithely special, ironic +10913|969|4|2|18|33659.28|0.08|0.03|R|F|1993-02-26|1993-04-30|1993-03-24|TAKE BACK RETURN|TRUCK|fully carefully pending acco +10913|952|21|3|30|55588.50|0.09|0.08|R|F|1993-02-19|1993-04-25|1993-02-27|DELIVER IN PERSON|RAIL|requests nag carefully. ruthle +10914|1536|77|1|19|27313.07|0.09|0.03|R|F|1995-02-26|1995-04-01|1995-03-07|COLLECT COD|REG AIR|l packages. pinto beans eat. f +10914|589|20|2|28|41708.24|0.07|0.04|R|F|1995-03-24|1995-03-06|1995-04-08|TAKE BACK RETURN|AIR|cajole quickly. bli +10914|1775|2|3|13|21798.01|0.05|0.02|R|F|1995-04-24|1995-03-28|1995-05-20|NONE|TRUCK|ever. ironic, bold ideas boost +10914|1895|82|4|32|57500.48|0.03|0.07|R|F|1995-02-28|1995-02-27|1995-03-07|DELIVER IN PERSON|TRUCK| blithely exp +10914|1442|21|5|24|32242.56|0.05|0.06|A|F|1995-04-28|1995-03-27|1995-05-11|DELIVER IN PERSON|TRUCK|riously express pack +10914|563|24|6|24|35125.44|0.04|0.01|A|F|1995-04-21|1995-04-03|1995-04-26|NONE|REG AIR|ans sleep slyly along +10915|916|19|1|2|3633.82|0.00|0.05|R|F|1993-12-30|1994-01-28|1994-01-02|COLLECT COD|AIR| ruthless p +10915|720|53|2|6|9724.32|0.09|0.05|R|F|1993-11-30|1994-01-14|1993-12-05|TAKE BACK RETURN|SHIP| print carefully unusual +10915|773|6|3|30|50213.10|0.04|0.02|A|F|1994-01-07|1994-01-19|1994-01-23|NONE|AIR|refully express pinto beans-- ironi +10915|649|50|4|22|34092.08|0.07|0.01|A|F|1994-02-20|1993-12-28|1994-02-25|DELIVER IN PERSON|SHIP|ites use ab +10915|972|75|5|44|82410.68|0.00|0.02|A|F|1994-02-22|1993-12-21|1994-03-10|COLLECT COD|MAIL|the carefully regular mu +10916|1824|54|1|39|67306.98|0.00|0.08|N|O|1995-07-02|1995-05-17|1995-07-13|COLLECT COD|MAIL|quickly bold packages +10916|1946|35|2|33|60982.02|0.09|0.02|R|F|1995-04-17|1995-05-04|1995-04-25|DELIVER IN PERSON|AIR|t the even frets. final instructions caj +10916|1071|77|3|32|31106.24|0.08|0.07|N|F|1995-06-13|1995-05-28|1995-07-02|NONE|TRUCK|ometimes blithe +10916|384|69|4|30|38531.40|0.01|0.02|R|F|1995-05-15|1995-04-26|1995-06-06|COLLECT COD|RAIL| blithely regular requests! closely blith +10916|147|100|5|34|35602.76|0.05|0.05|N|F|1995-06-10|1995-05-27|1995-07-07|NONE|SHIP|platelets along the special +10916|533|34|6|2|2867.06|0.01|0.00|A|F|1995-05-21|1995-04-14|1995-05-25|DELIVER IN PERSON|SHIP|wake according +10916|1757|58|7|10|16587.50|0.09|0.05|N|O|1995-06-21|1995-05-28|1995-07-06|NONE|MAIL|cally final ac +10917|193|94|1|15|16397.85|0.01|0.01|R|F|1992-03-23|1992-03-31|1992-04-12|DELIVER IN PERSON|AIR|pite the slyly final p +10917|562|53|2|1|1462.56|0.05|0.02|A|F|1992-06-09|1992-04-30|1992-06-10|COLLECT COD|MAIL|usly regular dolphins. packages +10917|1499|100|3|18|25208.82|0.09|0.08|A|F|1992-03-12|1992-04-18|1992-04-08|DELIVER IN PERSON|AIR| doubt furiously carefully regula +10917|1258|70|4|45|52166.25|0.07|0.02|A|F|1992-04-10|1992-04-07|1992-04-14|TAKE BACK RETURN|REG AIR|deposits solve furiously. blithely final +10917|1960|93|5|19|35377.24|0.05|0.04|A|F|1992-04-17|1992-04-14|1992-04-29|DELIVER IN PERSON|SHIP|iously final deposits are after the qu +10918|311|40|1|8|9690.48|0.09|0.06|N|O|1996-02-13|1995-11-29|1996-03-03|NONE|AIR|the furious +10918|656|88|2|46|71605.90|0.05|0.04|N|O|1995-11-30|1995-12-27|1995-12-19|COLLECT COD|SHIP|s. regular accounts throughout the p +10919|1365|4|1|45|56986.20|0.05|0.04|A|F|1993-07-04|1993-05-29|1993-07-15|COLLECT COD|SHIP|telets across the +10944|836|3|1|11|19105.13|0.05|0.05|N|O|1996-01-14|1995-12-28|1996-02-05|NONE|SHIP|ourts. deposits nag blithely at the accou +10944|759|24|2|41|68049.75|0.07|0.07|N|O|1995-12-03|1996-02-03|1995-12-14|DELIVER IN PERSON|FOB|egularly bold deposits +10944|7|33|3|34|30838.00|0.01|0.06|N|O|1995-12-02|1995-12-20|1995-12-03|COLLECT COD|RAIL|ording to the blithely silent accounts. sly +10944|365|22|4|9|11388.24|0.05|0.00|N|O|1996-02-21|1996-01-29|1996-02-27|COLLECT COD|RAIL|ly regular packages! carefu +10945|1798|99|1|28|47594.12|0.06|0.07|A|F|1992-02-13|1992-03-30|1992-02-25|TAKE BACK RETURN|REG AIR|egular packages haggle. slyly i +10945|262|63|2|35|40679.10|0.06|0.06|A|F|1992-02-19|1992-03-13|1992-03-14|COLLECT COD|AIR| carefully even theodolites. +10945|1553|54|3|17|24727.35|0.09|0.01|A|F|1992-01-28|1992-02-13|1992-02-22|NONE|FOB|telets use slyly according to the furi +10945|148|75|4|49|51358.86|0.08|0.01|R|F|1992-02-18|1992-03-06|1992-03-07|DELIVER IN PERSON|RAIL|fully furiously even theodolites. quickly +10945|1979|24|5|5|9404.85|0.04|0.06|R|F|1992-03-19|1992-02-24|1992-04-12|NONE|TRUCK|iously unusual ideas haggle slyly. ironi +10946|1155|28|1|43|45414.45|0.08|0.05|N|O|1997-05-11|1997-06-09|1997-05-19|NONE|SHIP|ole furiously. bold packages slee +10946|739|40|2|30|49191.90|0.04|0.02|N|O|1997-06-26|1997-05-10|1997-07-18|COLLECT COD|RAIL|es. carefully pending instru +10946|1669|93|3|20|31413.20|0.10|0.06|N|O|1997-03-30|1997-05-23|1997-04-01|NONE|RAIL|uthless ideas wak +10946|1783|10|4|39|65706.42|0.01|0.07|N|O|1997-05-29|1997-05-25|1997-06-03|DELIVER IN PERSON|AIR|ns. slyly special pint +10946|1725|10|5|48|78082.56|0.06|0.03|N|O|1997-05-10|1997-05-20|1997-06-04|TAKE BACK RETURN|TRUCK|riously fi +10946|1803|90|6|39|66487.20|0.04|0.02|N|O|1997-05-30|1997-06-01|1997-06-09|COLLECT COD|FOB|nusual inst +10947|1679|21|1|21|33194.07|0.07|0.04|N|O|1996-01-14|1996-03-28|1996-01-25|TAKE BACK RETURN|MAIL|dogged requests. slyly even plate +10947|1368|45|2|1|1269.36|0.05|0.03|N|O|1996-02-20|1996-03-24|1996-02-23|DELIVER IN PERSON|TRUCK|the carefully final requests +10947|1108|81|3|42|42382.20|0.05|0.02|N|O|1996-05-06|1996-02-07|1996-05-16|TAKE BACK RETURN|SHIP|pinto beans sleep fluffily against the p +10947|583|74|4|43|63793.94|0.09|0.05|N|O|1996-04-07|1996-04-02|1996-04-23|TAKE BACK RETURN|REG AIR|y. carefully final accounts sleep fluff +10948|38|39|1|44|41273.32|0.09|0.01|A|F|1992-10-24|1992-10-16|1992-11-01|TAKE BACK RETURN|SHIP|leep blithely deposits. foxes n +10948|1571|72|2|49|72155.93|0.05|0.06|A|F|1992-11-25|1992-09-16|1992-12-14|DELIVER IN PERSON|FOB|y along the quickly bold a +10948|1708|35|3|43|69217.10|0.01|0.08|R|F|1992-10-27|1992-11-09|1992-11-19|DELIVER IN PERSON|TRUCK| special requests +10948|1487|66|4|27|37488.96|0.01|0.06|A|F|1992-10-09|1992-10-31|1992-10-24|NONE|AIR|ver the slyly regular dependencies nag b +10949|248|3|1|24|27557.76|0.10|0.07|A|F|1994-05-13|1994-06-06|1994-06-12|TAKE BACK RETURN|SHIP|yly unusual theodolites? deposits sleep fl +10949|93|94|2|19|18868.71|0.01|0.07|R|F|1994-07-13|1994-06-10|1994-07-16|NONE|AIR|deposits. blithely special requests sle +10949|751|84|3|39|64418.25|0.02|0.05|R|F|1994-05-26|1994-06-01|1994-06-23|DELIVER IN PERSON|MAIL|owly about the regular, regu +10950|1404|44|1|29|37856.60|0.00|0.00|N|O|1997-08-01|1997-08-25|1997-08-14|NONE|REG AIR|ts haggle ruthlessly depos +10951|1026|97|1|26|24102.52|0.02|0.08|R|F|1993-02-10|1993-01-31|1993-02-12|TAKE BACK RETURN|SHIP|ctions promise blithely ironic packages. +10951|646|47|2|22|34026.08|0.10|0.05|R|F|1992-12-09|1993-01-14|1992-12-24|DELIVER IN PERSON|MAIL|ages. silent accounts cajole ruthlessly. +10951|1354|31|3|26|32639.10|0.08|0.01|R|F|1992-12-27|1993-01-19|1993-01-13|DELIVER IN PERSON|MAIL|ns. requests wake fluffily. +10951|741|6|4|31|50893.94|0.03|0.05|R|F|1992-12-04|1993-01-27|1992-12-29|COLLECT COD|FOB|final pinto +10951|1831|32|5|21|36389.43|0.10|0.08|R|F|1992-12-10|1992-12-18|1993-01-02|NONE|MAIL|silent packages? blit +10976|241|23|1|11|12553.64|0.02|0.04|A|F|1992-12-21|1992-11-13|1993-01-13|TAKE BACK RETURN|SHIP|lyly pending pinto beans +10976|383|40|2|26|33367.88|0.04|0.03|A|F|1993-01-05|1992-11-14|1993-01-20|TAKE BACK RETURN|FOB|ssly against the cour +10976|183|36|3|19|20580.42|0.05|0.03|R|F|1992-11-28|1992-12-25|1992-12-16|TAKE BACK RETURN|REG AIR|even, regular dependencies haggle +10976|776|73|4|13|21798.01|0.08|0.06|R|F|1992-10-26|1992-11-15|1992-11-09|DELIVER IN PERSON|REG AIR|y ironic ideas unwind in +10976|1908|97|5|28|50677.20|0.03|0.08|A|F|1992-12-08|1992-12-07|1992-12-16|TAKE BACK RETURN|TRUCK|its use sly +10976|1281|82|6|27|31921.56|0.10|0.06|R|F|1992-10-21|1992-12-25|1992-10-27|COLLECT COD|SHIP|al ideas above the quickly +10976|347|32|7|13|16215.42|0.10|0.08|A|F|1992-11-13|1992-12-05|1992-11-21|NONE|RAIL|ake slyly. attainme +10977|238|20|1|41|46667.43|0.01|0.08|N|O|1998-06-19|1998-07-24|1998-07-14|DELIVER IN PERSON|SHIP|even packages. stealt +10977|969|4|2|6|11219.76|0.10|0.01|N|O|1998-09-01|1998-08-14|1998-09-19|TAKE BACK RETURN|RAIL|nal asymptotes +10977|1492|71|3|3|4180.47|0.03|0.04|N|O|1998-06-27|1998-08-08|1998-06-30|DELIVER IN PERSON|MAIL|y slow accounts according to the som +10977|172|99|4|31|33237.27|0.00|0.05|N|O|1998-09-21|1998-08-17|1998-10-11|NONE|TRUCK|osits play! fluffily unusual instructions i +10978|1597|38|1|40|59943.60|0.00|0.04|A|F|1994-05-31|1994-05-06|1994-06-13|DELIVER IN PERSON|TRUCK|ole slyly even, pendi +10978|457|16|2|13|17646.85|0.07|0.03|R|F|1994-06-11|1994-06-13|1994-07-07|DELIVER IN PERSON|MAIL|y express hockey players except the care +10978|11|62|3|32|29152.32|0.10|0.05|R|F|1994-05-03|1994-05-13|1994-05-15|COLLECT COD|REG AIR|e slyly about the daringly pending p +10979|1389|90|1|28|36130.64|0.09|0.02|N|O|1995-11-09|1995-11-06|1995-12-05|DELIVER IN PERSON|TRUCK|ng the slyly bold theodolites. fi +10979|1665|7|2|5|7833.30|0.04|0.03|N|O|1996-01-30|1995-11-18|1996-01-31|NONE|FOB| will have to are pack +10979|1164|73|3|25|26629.00|0.10|0.06|N|O|1995-12-18|1995-12-31|1995-12-29|NONE|TRUCK|blithely even foxes wake +10979|269|24|4|11|12861.86|0.00|0.07|N|O|1995-10-29|1995-12-04|1995-11-17|TAKE BACK RETURN|TRUCK|nal decoys. carefully even p +10979|1720|47|5|23|37299.56|0.02|0.03|N|O|1995-10-28|1995-11-07|1995-11-09|NONE|RAIL|quests wake slyly about the blithely silent +10979|1613|14|6|27|40894.47|0.06|0.05|N|O|1995-11-05|1995-11-13|1995-11-20|COLLECT COD|AIR|e slyly sp +10979|1709|94|7|5|8053.50|0.09|0.05|N|O|1995-10-25|1995-12-15|1995-11-10|TAKE BACK RETURN|SHIP|pitaphs cajole +10980|10|11|1|28|25480.28|0.09|0.07|N|O|1996-11-13|1996-10-12|1996-12-02|TAKE BACK RETURN|SHIP|es. carefully even platelets na +10980|1285|97|2|43|51010.04|0.04|0.01|N|O|1996-10-08|1996-09-09|1996-11-02|TAKE BACK RETURN|MAIL|ackages wake according to the asymp +10980|1797|40|3|1|1698.79|0.03|0.02|N|O|1996-08-10|1996-09-24|1996-09-06|TAKE BACK RETURN|AIR|e carefully +10981|677|9|1|26|41019.42|0.04|0.07|A|F|1993-08-16|1993-07-10|1993-09-13|NONE|FOB|ingly regular theodolites hinder blithely +10981|329|30|2|20|24586.40|0.01|0.06|R|F|1993-08-04|1993-07-04|1993-08-25|COLLECT COD|TRUCK| slyly regular +10981|513|44|3|25|35337.75|0.10|0.00|R|F|1993-07-04|1993-08-11|1993-07-06|TAKE BACK RETURN|MAIL|ecial asymptotes. final fox +10981|604|36|4|16|24073.60|0.07|0.01|R|F|1993-06-03|1993-07-25|1993-06-20|DELIVER IN PERSON|SHIP|y regular foxes are quickly care +10981|1589|30|5|19|28321.02|0.08|0.02|R|F|1993-08-25|1993-07-01|1993-08-28|TAKE BACK RETURN|SHIP|nag slyly-- c +10981|1800|1|6|30|51054.00|0.01|0.08|R|F|1993-06-09|1993-07-15|1993-06-12|DELIVER IN PERSON|AIR|heodolites above the +10981|194|73|7|30|32825.70|0.02|0.00|A|F|1993-07-10|1993-08-12|1993-07-26|DELIVER IN PERSON|TRUCK|egular packages wake above the +10982|1076|82|1|6|5862.42|0.07|0.01|A|F|1993-02-25|1993-01-22|1993-03-01|NONE|REG AIR| fluffily speci +10982|1677|60|2|18|28416.06|0.07|0.06|A|F|1993-01-31|1993-01-14|1993-02-09|TAKE BACK RETURN|AIR|instructions are foxes. de +10982|1308|47|3|39|47162.70|0.05|0.06|A|F|1993-01-31|1993-01-26|1993-02-08|DELIVER IN PERSON|SHIP|pinto beans after the blithely +10982|1862|49|4|35|61735.10|0.09|0.05|R|F|1993-01-06|1993-01-13|1993-01-22|DELIVER IN PERSON|SHIP|lithely pen +10982|1113|14|5|4|4056.44|0.06|0.01|A|F|1993-02-16|1993-02-09|1993-03-03|NONE|REG AIR|refully special ideas: quick +10982|519|20|6|25|35487.75|0.08|0.07|R|F|1993-01-09|1993-01-13|1993-01-26|COLLECT COD|AIR|refully accordin +10982|1206|81|7|18|19929.60|0.01|0.04|R|F|1992-12-21|1993-03-11|1993-01-17|TAKE BACK RETURN|SHIP| pending, final requests nag regular +10983|844|78|1|36|62814.24|0.07|0.04|N|O|1997-03-15|1997-03-12|1997-04-01|COLLECT COD|AIR| to the regular ideas. slyly even re +10983|1162|63|2|43|45715.88|0.06|0.07|N|O|1997-04-15|1997-03-18|1997-05-11|DELIVER IN PERSON|MAIL|y regular accounts. gifts sleep ab +11008|1811|55|1|30|51384.30|0.10|0.06|A|F|1994-03-05|1994-04-04|1994-03-22|TAKE BACK RETURN|RAIL| blithely slow pinto beans. fluff +11008|843|44|2|39|68009.76|0.00|0.03|R|F|1994-06-10|1994-04-18|1994-06-11|TAKE BACK RETURN|SHIP|atelets. fluffily +11008|799|32|3|16|27196.64|0.08|0.01|A|F|1994-05-07|1994-04-02|1994-05-31|NONE|MAIL|ely final foxes. bold, final depe +11008|589|50|4|15|22343.70|0.05|0.03|R|F|1994-05-04|1994-03-31|1994-06-02|DELIVER IN PERSON|TRUCK|lyly along the blithely bold wa +11008|1446|25|5|42|56592.48|0.01|0.00|R|F|1994-03-23|1994-05-24|1994-04-18|DELIVER IN PERSON|RAIL|rash furiously blithely silent +11009|1482|100|1|41|56722.68|0.07|0.05|N|O|1997-03-09|1997-05-17|1997-04-03|TAKE BACK RETURN|MAIL| accounts. furiously regular cou +11009|1667|68|2|6|9411.96|0.00|0.08|N|O|1997-04-06|1997-04-21|1997-04-24|TAKE BACK RETURN|TRUCK|lly bold a +11010|812|12|1|23|39394.63|0.08|0.07|N|O|1997-04-03|1997-06-20|1997-04-18|COLLECT COD|AIR|uests. ironic, pend +11010|1477|17|2|23|31704.81|0.01|0.03|N|O|1997-06-07|1997-05-04|1997-06-26|DELIVER IN PERSON|FOB|ter the furiou +11010|565|56|3|8|11724.48|0.03|0.08|N|O|1997-04-13|1997-04-27|1997-05-10|DELIVER IN PERSON|FOB|er the express, express sheaves w +11010|970|39|4|22|41161.34|0.09|0.00|N|O|1997-04-17|1997-05-20|1997-04-21|DELIVER IN PERSON|SHIP|s about the enticingly final ideas wa +11010|210|65|5|39|43298.19|0.07|0.06|N|O|1997-04-28|1997-05-30|1997-05-03|TAKE BACK RETURN|MAIL|regular requests. slyly special inst +11011|1725|68|1|16|26027.52|0.05|0.08|R|F|1992-05-27|1992-08-01|1992-05-29|NONE|FOB|xpress, quiet deposit +11011|1405|23|2|50|65320.00|0.07|0.02|R|F|1992-08-18|1992-08-11|1992-09-02|COLLECT COD|MAIL|nd the furiously ironic +11011|8|59|3|36|32688.00|0.06|0.05|R|F|1992-08-02|1992-06-28|1992-08-15|TAKE BACK RETURN|TRUCK|unusual, pending foxes cajole unusual, un +11011|1420|60|4|29|38321.18|0.00|0.02|R|F|1992-05-27|1992-07-06|1992-06-26|COLLECT COD|RAIL|ts above th +11011|1290|65|5|14|16678.06|0.03|0.08|A|F|1992-08-30|1992-08-03|1992-09-08|NONE|SHIP|dolites. express, regular orbits agai +11011|579|80|6|12|17754.84|0.08|0.06|A|F|1992-05-22|1992-08-01|1992-06-02|DELIVER IN PERSON|FOB|ully ironic theodolites about th +11011|960|63|7|31|57689.76|0.08|0.01|R|F|1992-06-18|1992-06-19|1992-06-23|TAKE BACK RETURN|FOB| instructions. final r +11012|410|98|1|47|61589.27|0.06|0.06|N|O|1998-07-25|1998-05-23|1998-08-01|NONE|AIR| about the ironi +11012|171|72|2|49|52487.33|0.07|0.08|N|O|1998-07-14|1998-06-14|1998-08-08|COLLECT COD|REG AIR| final dependencies. special pack +11013|441|71|1|2|2682.88|0.08|0.05|R|F|1994-07-24|1994-06-09|1994-08-02|DELIVER IN PERSON|AIR|ges nag slyly even +11014|323|24|1|43|52602.76|0.04|0.02|A|F|1993-12-16|1993-11-15|1993-12-27|COLLECT COD|RAIL|kages haggle +11014|1708|35|2|9|14487.30|0.10|0.05|A|F|1993-12-12|1993-10-09|1994-01-06|NONE|TRUCK|l asymptotes. slyly ev +11014|70|96|3|20|19401.40|0.02|0.00|A|F|1993-09-24|1993-12-03|1993-09-28|DELIVER IN PERSON|RAIL|y final warhorses after the special +11014|1841|85|4|36|62742.24|0.04|0.01|R|F|1993-11-10|1993-11-05|1993-12-09|TAKE BACK RETURN|REG AIR| carefully final d +11014|255|56|5|5|5776.25|0.08|0.07|A|F|1993-09-18|1993-10-13|1993-09-19|NONE|REG AIR|y around the blit +11015|1388|89|1|16|20630.08|0.04|0.05|N|O|1997-12-03|1997-11-30|1997-12-26|DELIVER IN PERSON|SHIP|lyly final accounts are blithel +11015|1525|46|2|16|22824.32|0.05|0.07|N|O|1997-10-06|1997-10-19|1997-10-28|NONE|SHIP|carefully +11015|258|86|3|15|17373.75|0.10|0.02|N|O|1998-01-06|1997-11-15|1998-01-18|COLLECT COD|SHIP|s. depths na +11015|391|76|4|43|55529.77|0.08|0.03|N|O|1997-09-22|1997-12-11|1997-09-24|COLLECT COD|REG AIR|thely. slyly bold theodolite +11015|1718|19|5|13|21056.23|0.08|0.04|N|O|1997-10-02|1997-11-25|1997-10-31|TAKE BACK RETURN|MAIL|he always final foxes? silent deposits +11040|1710|37|1|48|77362.08|0.03|0.02|N|O|1995-11-13|1996-01-14|1995-12-09|TAKE BACK RETURN|SHIP|sly ironic requ +11040|1864|51|2|19|33551.34|0.07|0.08|N|O|1996-02-11|1995-12-03|1996-02-27|NONE|RAIL|inal deposits. carefully bold asymptot +11040|102|55|3|21|21044.10|0.03|0.06|N|O|1996-01-15|1995-12-12|1996-02-06|TAKE BACK RETURN|MAIL|ly pending accounts. furiously slow reques +11040|775|76|4|49|82112.73|0.04|0.01|N|O|1996-02-14|1996-01-18|1996-02-27|COLLECT COD|MAIL|deposits detect fluffily e +11041|475|76|1|40|55018.80|0.03|0.01|N|O|1997-06-29|1997-05-29|1997-07-27|NONE|SHIP| blithely fluffily +11041|185|86|2|10|10851.80|0.10|0.06|N|O|1997-05-30|1997-05-29|1997-06-27|COLLECT COD|TRUCK| ironic accounts alongsid +11041|1686|87|3|9|14289.12|0.04|0.02|N|O|1997-07-05|1997-06-02|1997-07-19|DELIVER IN PERSON|FOB|egrate furio +11041|545|6|4|24|34692.96|0.06|0.03|N|O|1997-04-17|1997-05-13|1997-04-18|COLLECT COD|MAIL|its wake. blithely fin +11041|1589|70|5|12|17886.96|0.08|0.03|N|O|1997-05-18|1997-05-06|1997-06-10|TAKE BACK RETURN|SHIP|was fluffily pending +11042|81|7|1|6|5886.48|0.04|0.08|N|O|1998-06-03|1998-07-22|1998-06-05|TAKE BACK RETURN|SHIP|ep furiously re +11042|1565|46|2|49|71861.44|0.03|0.04|N|O|1998-07-04|1998-07-24|1998-07-14|NONE|SHIP| orbits. fluffily +11042|421|80|3|49|64749.58|0.04|0.07|N|O|1998-05-30|1998-06-30|1998-06-19|DELIVER IN PERSON|SHIP|ng, final asymptotes. regular, ex +11042|957|26|4|41|76175.95|0.02|0.05|N|O|1998-07-29|1998-07-14|1998-08-01|COLLECT COD|RAIL|o beans are s +11043|1153|90|1|23|24245.45|0.03|0.06|R|F|1995-03-17|1995-04-30|1995-03-29|DELIVER IN PERSON|SHIP|the bold ideas sleep against the fur +11043|24|100|2|24|22176.48|0.07|0.04|R|F|1995-02-24|1995-05-11|1995-02-25|NONE|FOB|he regular, unusual packages a +11043|1676|100|3|23|36286.41|0.04|0.03|R|F|1995-05-30|1995-05-19|1995-06-08|DELIVER IN PERSON|TRUCK|nooze furiously pen +11043|1011|17|4|21|19152.21|0.01|0.05|R|F|1995-04-26|1995-04-29|1995-05-20|DELIVER IN PERSON|RAIL|ments. final requests sleep into the even +11044|1196|69|1|37|40596.03|0.07|0.01|R|F|1992-08-31|1992-08-08|1992-09-03|DELIVER IN PERSON|FOB|s along the fur +11044|85|86|2|6|5910.48|0.03|0.00|R|F|1992-08-22|1992-07-30|1992-09-21|TAKE BACK RETURN|MAIL|ntly ironic attainments +11044|1750|93|3|15|24776.25|0.01|0.02|A|F|1992-09-07|1992-08-12|1992-10-02|NONE|FOB|y final platelets are blithely caref +11045|97|73|1|36|35895.24|0.03|0.00|A|F|1992-05-09|1992-05-14|1992-05-29|COLLECT COD|TRUCK|after the pack +11045|232|60|2|16|18115.68|0.04|0.02|A|F|1992-07-23|1992-05-04|1992-08-06|DELIVER IN PERSON|RAIL|eposits detect quick +11045|1756|57|3|22|36470.50|0.03|0.00|A|F|1992-05-16|1992-05-04|1992-06-10|NONE|MAIL|s play carefully. theodolites +11045|1009|80|4|5|4550.00|0.00|0.03|R|F|1992-06-11|1992-05-12|1992-07-05|NONE|MAIL|refully final deposits boost ar +11045|1345|22|5|46|57331.64|0.06|0.06|R|F|1992-04-15|1992-05-06|1992-04-30|COLLECT COD|RAIL|requests among the furiously final excuse +11045|1912|13|6|18|32650.38|0.03|0.07|R|F|1992-04-09|1992-05-17|1992-04-12|NONE|SHIP|olites integrate slyly express, speci +11045|731|64|7|27|44056.71|0.06|0.04|R|F|1992-06-26|1992-05-24|1992-07-18|NONE|RAIL|asymptotes. blithely even excuses are qui +11046|1956|57|1|46|85465.70|0.06|0.03|N|O|1997-08-01|1997-08-24|1997-08-11|NONE|RAIL|gular, bold accounts grow evenl +11046|489|19|2|33|45852.84|0.07|0.05|N|O|1997-10-06|1997-08-23|1997-10-22|TAKE BACK RETURN|TRUCK|ronic foxes. regul +11046|1318|57|3|45|54868.95|0.02|0.02|N|O|1997-08-03|1997-07-21|1997-08-21|TAKE BACK RETURN|TRUCK|haggle. asymptotes use fluffily according +11046|840|40|4|24|41780.16|0.02|0.04|N|O|1997-09-21|1997-08-02|1997-10-14|TAKE BACK RETURN|MAIL|ckly regular asymptotes breach furi +11046|1044|50|5|4|3780.16|0.04|0.02|N|O|1997-09-08|1997-09-09|1997-10-06|NONE|AIR|furious deposits. evenly f +11046|1839|83|6|48|83559.84|0.02|0.04|N|O|1997-08-14|1997-08-22|1997-08-21|TAKE BACK RETURN|RAIL|ever. quickly regular pinto beans +11046|1504|5|7|18|25299.00|0.08|0.02|N|O|1997-10-08|1997-09-09|1997-10-12|COLLECT COD|AIR|ly quickly +11047|1260|61|1|34|39482.84|0.05|0.08|A|F|1994-03-29|1994-02-04|1994-04-27|NONE|FOB|boost against the regula +11047|660|23|2|15|23409.90|0.06|0.06|R|F|1994-02-08|1994-01-20|1994-03-09|TAKE BACK RETURN|SHIP|dencies. regular accou +11047|1857|1|3|4|7035.40|0.09|0.02|R|F|1994-01-14|1994-02-01|1994-01-30|COLLECT COD|AIR|never special asymptotes. p +11072|1428|7|1|37|49188.54|0.04|0.02|N|O|1996-09-26|1996-09-29|1996-10-13|NONE|RAIL|ely after the quickly final instructions. c +11072|1260|98|2|34|39482.84|0.00|0.04|N|O|1996-07-21|1996-08-31|1996-08-03|DELIVER IN PERSON|AIR| use carefully unusual p +11072|1517|98|3|29|41136.79|0.01|0.04|N|O|1996-08-10|1996-08-13|1996-08-26|TAKE BACK RETURN|SHIP|ss the carefully special instructions +11072|1540|21|4|21|30272.34|0.06|0.06|N|O|1996-11-08|1996-09-14|1996-11-09|TAKE BACK RETURN|REG AIR|ending platelets nag furiously enticing +11072|60|36|5|48|46082.88|0.03|0.02|N|O|1996-08-12|1996-10-03|1996-08-21|NONE|SHIP|l packages wake ideas. furiou +11073|1428|7|1|40|53176.80|0.04|0.00|R|F|1995-01-09|1995-01-08|1995-01-16|NONE|TRUCK|ages against the even ideas sleep quiet +11073|667|99|2|5|7838.30|0.07|0.04|A|F|1995-03-24|1995-01-08|1995-04-17|NONE|TRUCK|egular pinto beans are carefully against t +11073|680|12|3|43|67969.24|0.05|0.04|A|F|1995-03-15|1995-02-26|1995-03-17|NONE|MAIL|ges are furiousl +11073|1487|27|4|37|51373.76|0.03|0.04|R|F|1994-12-16|1995-01-03|1995-01-14|DELIVER IN PERSON|SHIP|ounts. blithely thin pa +11074|1600|1|1|46|69073.60|0.06|0.01|N|O|1995-06-23|1995-07-20|1995-07-19|COLLECT COD|MAIL|y above the caref +11074|1308|47|2|18|21767.40|0.04|0.02|N|O|1995-08-15|1995-08-11|1995-08-24|TAKE BACK RETURN|MAIL|ave to integrat +11074|161|14|3|44|46691.04|0.08|0.01|N|O|1995-08-11|1995-07-11|1995-08-24|NONE|RAIL|leep carefully acro +11074|1923|24|4|44|80296.48|0.10|0.06|N|O|1995-07-13|1995-08-28|1995-07-30|NONE|REG AIR|haggle stealthily slyly express requests. +11074|1326|27|5|24|29455.68|0.08|0.07|N|O|1995-08-10|1995-08-03|1995-08-20|NONE|MAIL|cross the even reque +11074|491|79|6|48|66791.52|0.02|0.02|N|O|1995-10-04|1995-08-25|1995-10-24|DELIVER IN PERSON|RAIL|ckages. evenly daring platelets according +11075|1266|78|1|40|46690.40|0.01|0.04|N|O|1996-04-25|1996-05-15|1996-05-23|COLLECT COD|RAIL|ding requests nod +11075|1992|37|2|29|54925.71|0.03|0.05|N|O|1996-04-12|1996-05-05|1996-04-23|TAKE BACK RETURN|MAIL|ts are carefully among the furiously ironi +11075|349|78|3|37|46225.58|0.10|0.07|N|O|1996-05-19|1996-05-04|1996-05-29|COLLECT COD|SHIP|le furiously around the even d +11075|1630|31|4|45|68923.35|0.09|0.06|N|O|1996-03-20|1996-04-28|1996-04-03|COLLECT COD|RAIL|le furiousl +11076|979|14|1|26|48879.22|0.10|0.05|R|F|1994-09-28|1994-11-02|1994-10-22|TAKE BACK RETURN|SHIP|eep among the hockey p +11076|1127|100|2|8|8224.96|0.00|0.01|A|F|1994-08-22|1994-11-01|1994-09-05|DELIVER IN PERSON|MAIL|s haggle slyly ironic deposits. slyl +11077|1717|44|1|45|72841.95|0.00|0.05|R|F|1994-07-03|1994-04-22|1994-07-10|NONE|FOB| ironic de +11078|757|58|1|28|46417.00|0.06|0.04|A|F|1992-08-06|1992-08-12|1992-08-07|TAKE BACK RETURN|RAIL|xcuses. ironic Tire +11078|1562|43|2|40|58542.40|0.02|0.02|A|F|1992-08-22|1992-08-20|1992-09-11|COLLECT COD|REG AIR|arefully. quickly ex +11079|225|26|1|3|3375.66|0.01|0.03|N|O|1997-11-26|1997-10-22|1997-12-08|DELIVER IN PERSON|SHIP|never even pinto beans. quickly express a +11079|1535|36|2|35|50278.55|0.06|0.05|N|O|1997-12-06|1997-10-08|1997-12-18|NONE|FOB|the foxes eat carefully +11079|205|6|3|42|46418.40|0.05|0.02|N|O|1997-11-30|1997-10-26|1997-12-21|COLLECT COD|FOB| furiously. pending ideas cajole slyl +11104|1971|16|1|26|48697.22|0.00|0.05|N|O|1998-09-08|1998-09-06|1998-09-16|TAKE BACK RETURN|FOB|kages. blithely cl +11105|311|68|1|17|20592.27|0.03|0.04|N|O|1996-03-26|1996-02-07|1996-04-25|COLLECT COD|MAIL|ngside of the stealthily final +11106|1362|1|1|10|12633.60|0.05|0.00|N|O|1995-06-27|1995-06-07|1995-07-21|COLLECT COD|SHIP|kages. slyly regular platelets ar +11106|1467|85|2|35|47896.10|0.03|0.02|R|F|1995-04-16|1995-06-19|1995-05-08|TAKE BACK RETURN|SHIP|ole slyly. slyly specia +11107|1195|32|1|27|29597.13|0.01|0.06|N|O|1995-11-19|1996-01-20|1995-12-16|DELIVER IN PERSON|REG AIR|posits. reque +11107|1313|52|2|2|2428.62|0.05|0.05|N|O|1995-11-04|1995-12-26|1995-11-14|NONE|REG AIR|s shall have to sleep slyly before the +11107|413|1|3|23|30208.43|0.05|0.07|N|O|1995-11-27|1995-12-03|1995-12-25|NONE|AIR|arefully ironic foxes gro +11108|1946|35|1|37|68373.78|0.06|0.04|R|F|1992-08-26|1992-10-08|1992-09-07|COLLECT COD|MAIL|he instructions haggle about the carefull +11108|452|11|2|39|52745.55|0.03|0.06|A|F|1992-10-26|1992-11-05|1992-11-12|DELIVER IN PERSON|TRUCK|ckages. quickly ironic asymptotes wak +11108|220|2|3|15|16803.30|0.08|0.07|R|F|1992-12-06|1992-11-12|1992-12-10|NONE|SHIP|thely blithely express packages. slyly f +11108|31|82|4|4|3724.12|0.08|0.03|R|F|1992-11-27|1992-10-28|1992-12-08|TAKE BACK RETURN|AIR|accounts: +11108|44|45|5|41|38705.64|0.06|0.08|A|F|1992-10-25|1992-09-23|1992-11-21|NONE|TRUCK|e. furiously ironic accounts are. furi +11108|1492|10|6|19|26476.31|0.00|0.00|R|F|1992-10-05|1992-10-05|1992-10-19|TAKE BACK RETURN|TRUCK|al theodolites nag fluffily bold depo +11108|1325|40|7|24|29431.68|0.00|0.06|R|F|1992-11-24|1992-10-03|1992-12-06|NONE|RAIL|. bold excuses are ruthlessly express, pend +11109|1357|58|1|3|3775.05|0.09|0.07|R|F|1995-03-24|1995-05-09|1995-04-03|NONE|AIR|eas-- evenly even excuses mold caref +11109|787|88|2|1|1687.78|0.06|0.05|R|F|1995-03-21|1995-05-31|1995-04-13|NONE|SHIP|nts wake slyly pending instructions. foxes +11110|550|51|1|2|2901.10|0.10|0.03|N|O|1996-09-25|1996-08-08|1996-10-18|NONE|AIR|ns! bold courts besid +11110|95|21|2|33|32837.97|0.09|0.07|N|O|1996-09-01|1996-07-26|1996-09-21|COLLECT COD|RAIL|s about the quickly express deposits gro +11110|1992|25|3|21|39773.79|0.03|0.06|N|O|1996-10-07|1996-08-02|1996-10-30|NONE|TRUCK|beans are among the thin de +11110|1945|46|4|6|11081.64|0.03|0.03|N|O|1996-10-07|1996-07-27|1996-10-14|COLLECT COD|REG AIR|lithely regular ideas. dependencies sub +11110|1076|82|5|41|40059.87|0.05|0.04|N|O|1996-07-15|1996-09-13|1996-07-22|TAKE BACK RETURN|REG AIR|ay accordin +11110|1627|51|6|18|27515.16|0.01|0.01|N|O|1996-07-21|1996-08-18|1996-07-30|COLLECT COD|MAIL| among the blithely +11111|724|89|1|39|63364.08|0.06|0.07|A|F|1995-02-03|1995-04-12|1995-02-24|NONE|FOB|ress instructions are according to the car +11111|215|70|2|25|27880.25|0.00|0.03|A|F|1995-03-24|1995-04-08|1995-03-31|DELIVER IN PERSON|MAIL|ring the pinto beans are careful +11111|134|87|3|1|1034.13|0.01|0.06|A|F|1995-02-19|1995-03-13|1995-03-03|TAKE BACK RETURN|MAIL|uses among the deposits ca +11111|997|98|4|16|30367.84|0.10|0.04|A|F|1995-05-10|1995-04-17|1995-05-15|NONE|MAIL|arefully even excuses wake. blithel +11136|305|34|1|50|60265.00|0.07|0.08|R|F|1994-01-23|1994-02-02|1994-02-20|COLLECT COD|FOB|y express packages ab +11137|1269|70|1|3|3510.78|0.08|0.08|R|F|1992-12-07|1993-02-17|1993-01-04|COLLECT COD|RAIL|s haggle furiously. f +11137|440|28|2|2|2680.88|0.00|0.06|A|F|1993-01-06|1993-01-01|1993-01-22|COLLECT COD|AIR|heodolites cajole about the pendi +11137|1866|10|3|19|33589.34|0.07|0.04|R|F|1992-12-16|1993-01-13|1993-01-06|COLLECT COD|SHIP|tructions wake carefully among the reg +11137|141|68|4|28|29151.92|0.02|0.04|R|F|1993-02-25|1993-01-20|1993-03-21|COLLECT COD|AIR|fter the regular accounts. car +11137|125|78|5|47|48180.64|0.04|0.04|A|F|1993-02-03|1993-01-07|1993-03-01|NONE|SHIP|unts wake furiously. slyly pending pin +11137|889|23|6|32|57276.16|0.04|0.08|A|F|1993-03-05|1993-01-20|1993-03-23|TAKE BACK RETURN|TRUCK|carefully about the instructio +11137|4|5|7|31|28024.00|0.04|0.05|A|F|1993-01-06|1993-01-04|1993-01-13|DELIVER IN PERSON|RAIL|es promise blithely +11138|1744|71|1|40|65829.60|0.06|0.06|R|F|1995-05-12|1995-04-13|1995-05-21|NONE|TRUCK|ut the carefully even orbits wake caref +11138|879|80|2|48|85433.76|0.07|0.05|N|F|1995-06-07|1995-05-05|1995-07-05|NONE|FOB|ions detect. unusual foxes nag daringly +11138|1696|79|3|9|14379.21|0.05|0.00|R|F|1995-05-04|1995-05-19|1995-05-10|DELIVER IN PERSON|FOB|ickly carefully +11139|556|57|1|15|21848.25|0.05|0.08|N|O|1998-08-03|1998-07-07|1998-08-16|NONE|TRUCK| unusual p +11139|637|31|2|39|59967.57|0.08|0.03|N|O|1998-09-09|1998-08-15|1998-10-02|TAKE BACK RETURN|SHIP|gular ideas engage flu +11139|654|48|3|13|20210.45|0.10|0.06|N|O|1998-07-01|1998-07-06|1998-07-19|TAKE BACK RETURN|SHIP|s packages. carefully specia +11139|1141|50|4|17|17716.38|0.10|0.05|N|O|1998-09-15|1998-08-07|1998-10-03|TAKE BACK RETURN|TRUCK|unusual pinto beans integrate +11140|1858|59|1|25|43996.25|0.06|0.02|N|O|1997-10-25|1997-09-30|1997-10-28|TAKE BACK RETURN|TRUCK|atelets. blithely regular exc +11140|1750|51|2|16|26428.00|0.07|0.06|N|O|1997-08-23|1997-10-04|1997-09-11|TAKE BACK RETURN|SHIP|fully even sentiments. slyly even foxes +11140|1173|82|3|9|9667.53|0.08|0.03|N|O|1997-10-07|1997-08-28|1997-10-14|DELIVER IN PERSON|TRUCK|ix slyly pending deposits. fluffily u +11140|20|46|4|9|8280.18|0.07|0.01|N|O|1997-08-19|1997-09-06|1997-09-17|NONE|AIR|ic decoys alongside of the ironic, +11140|1736|21|5|33|54045.09|0.02|0.00|N|O|1997-08-15|1997-09-28|1997-09-10|TAKE BACK RETURN|AIR|d foxes wake blithely +11140|775|40|6|13|21785.01|0.10|0.01|N|O|1997-10-30|1997-10-09|1997-11-13|DELIVER IN PERSON|TRUCK|packages. furiously +11140|1297|72|7|31|37146.99|0.10|0.08|N|O|1997-08-27|1997-09-23|1997-09-18|TAKE BACK RETURN|SHIP|oss the blithe, regular hockey player +11141|1714|15|1|33|53318.43|0.07|0.02|N|O|1998-04-27|1998-03-03|1998-05-06|TAKE BACK RETURN|FOB|requests a +11141|1846|47|2|11|19226.24|0.06|0.05|N|O|1998-04-20|1998-02-19|1998-05-14|COLLECT COD|RAIL|riously ironic courts? c +11141|1755|82|3|2|3313.50|0.03|0.01|N|O|1998-05-16|1998-04-08|1998-05-27|NONE|FOB|ully ruthless accounts sleep slyl +11142|628|60|1|48|73373.76|0.05|0.07|N|O|1997-12-06|1997-12-05|1997-12-14|TAKE BACK RETURN|SHIP|jole furiously against the express a +11142|532|33|2|49|70193.97|0.08|0.07|N|O|1997-11-11|1997-12-24|1997-12-01|NONE|RAIL| sauternes. carefully +11142|449|37|3|9|12144.96|0.02|0.01|N|O|1997-11-29|1997-12-23|1997-12-20|TAKE BACK RETURN|MAIL| sleep along +11142|986|55|4|29|54722.42|0.01|0.06|N|O|1997-10-16|1997-11-04|1997-10-30|TAKE BACK RETURN|AIR|ons haggle attainments. +11142|1596|97|5|44|65893.96|0.06|0.02|N|O|1997-11-17|1997-11-28|1997-11-21|TAKE BACK RETURN|SHIP|ter the final r +11142|310|11|6|37|44781.47|0.06|0.04|N|O|1997-10-19|1997-11-19|1997-11-11|TAKE BACK RETURN|SHIP|xpress courts along the re +11142|1855|99|7|44|77301.40|0.04|0.01|N|O|1997-11-17|1997-12-06|1997-11-29|TAKE BACK RETURN|TRUCK|ithely even packages alongsid +11143|1610|93|1|40|60464.40|0.09|0.00|R|F|1993-03-26|1993-01-26|1993-04-24|COLLECT COD|FOB|re. final packages haggle furiously. pinto +11143|1607|31|2|38|57326.80|0.10|0.04|A|F|1992-12-22|1993-02-10|1993-01-16|DELIVER IN PERSON|SHIP|ronic deposits haggle. packages boost sl +11143|980|15|3|34|63953.32|0.04|0.02|A|F|1993-02-05|1993-02-17|1993-02-14|TAKE BACK RETURN|MAIL|e silent dependencies. quietly special th +11143|302|3|4|1|1202.30|0.05|0.08|R|F|1992-12-16|1993-01-07|1993-01-08|NONE|AIR|uriously regular +11168|654|55|1|8|12437.20|0.04|0.05|R|F|1993-01-21|1992-12-13|1993-01-22|NONE|AIR|ely furious instructions. furiously expr +11168|1369|8|2|47|59706.92|0.01|0.05|R|F|1993-01-20|1992-12-07|1993-02-05|DELIVER IN PERSON|REG AIR|al courts cajole af +11169|1460|78|1|35|47651.10|0.05|0.06|R|F|1993-08-14|1993-07-23|1993-08-19|NONE|REG AIR| blithely. carefully expres +11169|570|31|2|1|1470.57|0.00|0.06|R|F|1993-09-11|1993-08-20|1993-09-20|DELIVER IN PERSON|SHIP| deposits haggle. fluffily even p +11169|124|77|3|39|39940.68|0.10|0.04|A|F|1993-08-13|1993-06-22|1993-09-09|NONE|FOB| instructions. +11169|1025|61|4|41|37966.82|0.10|0.02|R|F|1993-06-05|1993-07-05|1993-06-13|TAKE BACK RETURN|TRUCK|cuses. regular excuse +11170|1622|23|1|40|60944.80|0.03|0.07|N|O|1997-09-07|1997-09-15|1997-09-08|NONE|FOB|ests. slyly exp +11170|1703|4|2|25|40117.50|0.08|0.01|N|O|1997-11-03|1997-10-01|1997-11-27|DELIVER IN PERSON|REG AIR|refully daring pearls wake quickly acco +11170|1720|63|3|4|6486.88|0.00|0.03|N|O|1997-09-29|1997-09-17|1997-10-24|COLLECT COD|AIR|the regular packages. fluffily +11170|813|47|4|28|47986.68|0.10|0.06|N|O|1997-08-10|1997-09-12|1997-08-21|TAKE BACK RETURN|MAIL|leep instead of the furiously ir +11171|1959|92|1|36|66994.20|0.08|0.08|N|O|1995-09-11|1995-09-28|1995-09-16|NONE|MAIL|ccording to the +11171|1259|60|2|35|40608.75|0.08|0.02|N|O|1995-09-21|1995-09-15|1995-10-15|NONE|AIR| notornis could nag about the ironic dep +11172|1908|41|1|22|39817.80|0.09|0.01|N|O|1998-03-09|1998-02-09|1998-04-06|NONE|REG AIR|carefully +11172|922|91|2|23|41927.16|0.10|0.07|N|O|1998-02-06|1998-02-02|1998-02-15|NONE|FOB|d foxes will ha +11172|927|28|3|35|63977.20|0.08|0.02|N|O|1998-02-02|1998-03-28|1998-03-02|TAKE BACK RETURN|FOB|ackages among the blithely +11172|51|77|4|32|30433.60|0.03|0.01|N|O|1998-03-06|1998-02-13|1998-04-01|COLLECT COD|MAIL|always enticing requests after +11173|753|54|1|6|9922.50|0.10|0.06|R|F|1992-04-07|1992-06-29|1992-04-09|NONE|MAIL|cies. blithely ironic sentiments +11173|239|67|2|26|29619.98|0.08|0.05|A|F|1992-05-28|1992-05-07|1992-06-25|TAKE BACK RETURN|AIR|ng pinto bean +11173|1447|87|3|32|43150.08|0.04|0.04|A|F|1992-07-02|1992-05-12|1992-07-31|TAKE BACK RETURN|RAIL|unusual packages haggle furious +11173|134|87|4|16|16546.08|0.05|0.03|R|F|1992-05-30|1992-06-10|1992-06-09|COLLECT COD|AIR| instructions. regular packages sleep +11173|406|94|5|9|11757.60|0.05|0.06|R|F|1992-04-01|1992-05-11|1992-04-17|DELIVER IN PERSON|SHIP|iously unusu +11173|197|76|6|39|42790.41|0.06|0.04|R|F|1992-05-24|1992-05-05|1992-06-22|TAKE BACK RETURN|MAIL|ons. pending deposits wake a +11173|32|33|7|29|27028.87|0.04|0.08|R|F|1992-07-23|1992-05-25|1992-08-07|TAKE BACK RETURN|MAIL|fully express foxes. regular +11174|1135|44|1|22|22794.86|0.01|0.06|A|F|1994-04-24|1994-05-19|1994-05-10|TAKE BACK RETURN|REG AIR|fter the waters. regular +11174|240|95|2|2|2280.48|0.04|0.05|R|F|1994-05-30|1994-05-19|1994-06-27|COLLECT COD|MAIL| the deposit +11174|841|41|3|18|31353.12|0.02|0.04|A|F|1994-05-31|1994-05-12|1994-06-14|NONE|RAIL|carefully bold dependencies use packages. r +11174|649|12|4|8|12397.12|0.01|0.00|R|F|1994-04-22|1994-07-04|1994-05-07|NONE|TRUCK|sits. accounts boost quickly ab +11174|1805|92|5|31|52910.80|0.01|0.00|R|F|1994-06-23|1994-05-16|1994-07-16|TAKE BACK RETURN|AIR|t the ironic deposits cajole slyly across +11174|991|94|6|14|26487.86|0.07|0.08|A|F|1994-08-08|1994-05-11|1994-08-12|NONE|RAIL|. slyly daring requests +11175|1344|45|1|6|7472.04|0.04|0.02|N|O|1998-03-08|1998-05-13|1998-03-31|COLLECT COD|TRUCK|mong the slyl +11175|742|75|2|6|9856.44|0.05|0.00|N|O|1998-04-23|1998-05-25|1998-05-19|TAKE BACK RETURN|REG AIR|ms wake quickly. furiously +11175|1154|63|3|26|27433.90|0.00|0.00|N|O|1998-05-27|1998-05-05|1998-05-31|TAKE BACK RETURN|TRUCK|tegrate along the ironi +11200|294|22|1|36|42994.44|0.10|0.01|N|O|1997-04-14|1997-04-04|1997-04-18|COLLECT COD|TRUCK| theodolites wake. carefull +11200|424|54|2|3|3973.26|0.02|0.00|N|O|1997-03-14|1997-04-28|1997-04-03|COLLECT COD|SHIP|ies. fluffily regular dependencies are fina +11200|1624|66|3|47|71704.14|0.05|0.04|N|O|1997-04-28|1997-05-01|1997-05-26|NONE|SHIP|posits. pending deposits sleep ironic +11201|1767|68|1|2|3337.52|0.05|0.04|N|O|1996-12-21|1997-02-21|1996-12-27|DELIVER IN PERSON|AIR|ns. regular i +11202|292|74|1|39|46499.31|0.04|0.06|R|F|1992-04-29|1992-06-11|1992-05-13|NONE|MAIL| ideas wake fluffily around the +11202|507|68|2|44|61930.00|0.01|0.05|R|F|1992-06-22|1992-05-09|1992-07-16|DELIVER IN PERSON|SHIP|equests wake blithely +11202|1351|90|3|38|47589.30|0.04|0.01|R|F|1992-06-23|1992-04-27|1992-07-12|COLLECT COD|SHIP|y ironic theodolites detect car +11203|712|9|1|39|62895.69|0.05|0.06|N|O|1996-09-06|1996-07-31|1996-09-29|NONE|SHIP|egular ideas sleep according to the fur +11203|242|43|2|19|21702.56|0.04|0.03|N|O|1996-07-26|1996-09-11|1996-08-09|COLLECT COD|REG AIR|g accounts cajole furiously +11204|343|28|1|22|27353.48|0.07|0.06|N|O|1998-11-19|1998-08-25|1998-12-18|TAKE BACK RETURN|REG AIR| deposits. carefully pending acc +11204|1493|11|2|2|2788.98|0.09|0.04|N|O|1998-09-12|1998-09-30|1998-10-01|DELIVER IN PERSON|TRUCK| haggle furiously pending +11205|799|32|1|9|15298.11|0.03|0.08|N|O|1996-11-01|1996-11-05|1996-11-05|TAKE BACK RETURN|RAIL|he foxes at the even asymptotes haggle +11205|907|8|2|9|16271.10|0.07|0.05|N|O|1996-10-20|1996-10-16|1996-11-10|COLLECT COD|AIR| ideas. fluffil +11205|926|61|3|34|62115.28|0.04|0.03|N|O|1996-11-20|1996-10-28|1996-12-16|COLLECT COD|TRUCK|ular forges affix boldly after the silent a +11206|1768|53|1|33|55102.08|0.04|0.01|R|F|1995-04-20|1995-03-28|1995-05-11|TAKE BACK RETURN|REG AIR| accounts use slyly final, even pin +11206|578|39|2|22|32528.54|0.02|0.02|A|F|1995-02-16|1995-02-28|1995-03-06|DELIVER IN PERSON|RAIL|eposits. carefully special pinto b +11206|1266|78|3|23|26846.98|0.03|0.05|A|F|1995-04-02|1995-01-29|1995-04-17|NONE|TRUCK|dolites-- carefully un +11206|1683|84|4|27|42786.36|0.04|0.03|A|F|1995-01-07|1995-02-06|1995-01-14|TAKE BACK RETURN|MAIL| ironic deposits? dolph +11206|819|53|5|33|56753.73|0.08|0.03|A|F|1995-02-18|1995-03-16|1995-03-08|DELIVER IN PERSON|SHIP|beans. blithely iron +11207|85|61|1|40|39403.20|0.02|0.00|N|O|1996-07-23|1996-06-04|1996-08-13|DELIVER IN PERSON|RAIL|usy theodolites cajole against the regula +11207|88|14|2|15|14821.20|0.02|0.02|N|O|1996-04-19|1996-05-07|1996-05-14|NONE|FOB|uests cajole blithely express s +11207|1747|48|3|19|31326.06|0.02|0.00|N|O|1996-07-21|1996-06-20|1996-08-15|NONE|REG AIR|yly regular accounts. excuses use. +11232|872|39|1|10|17728.70|0.00|0.04|N|O|1996-04-14|1996-03-30|1996-05-01|DELIVER IN PERSON|RAIL|sly about the furiously silent ide +11232|979|82|2|4|7519.88|0.02|0.05|N|O|1996-05-15|1996-03-22|1996-06-05|DELIVER IN PERSON|RAIL|ng. slyly regular theo +11232|569|70|3|29|42617.24|0.07|0.04|N|O|1996-05-21|1996-04-05|1996-06-03|TAKE BACK RETURN|REG AIR|. blithely regula +11232|525|26|4|7|9978.64|0.04|0.06|N|O|1996-05-15|1996-04-18|1996-05-29|TAKE BACK RETURN|RAIL|onic requests according to the sheaves wake +11233|1516|17|1|17|24097.67|0.02|0.00|N|O|1995-09-12|1995-10-23|1995-09-19|DELIVER IN PERSON|FOB|usual reques +11233|1382|21|2|25|32084.50|0.05|0.03|N|O|1995-11-28|1995-10-30|1995-12-12|COLLECT COD|RAIL|, regular decoys. ruthlessly +11233|1361|38|3|36|45444.96|0.10|0.02|N|O|1995-10-14|1995-10-26|1995-10-24|COLLECT COD|AIR|ar theodolites. +11234|523|84|1|36|51246.72|0.07|0.07|A|F|1993-04-12|1993-04-03|1993-05-01|DELIVER IN PERSON|REG AIR|nstructions. car +11234|1913|14|2|9|16334.19|0.03|0.07|A|F|1993-05-17|1993-05-01|1993-05-26|NONE|AIR|y about the quickly regular attai +11234|1793|36|3|29|49148.91|0.01|0.01|R|F|1993-05-16|1993-04-18|1993-05-26|TAKE BACK RETURN|AIR|usly pending theodolites +11235|1416|34|1|15|19761.15|0.08|0.04|N|O|1996-05-27|1996-06-10|1996-06-03|NONE|REG AIR| packages +11235|1046|82|2|28|26517.12|0.01|0.07|N|O|1996-05-23|1996-06-27|1996-06-13|NONE|SHIP|d dependencies. caref +11235|131|84|3|50|51556.50|0.10|0.01|N|O|1996-05-23|1996-06-01|1996-06-14|NONE|TRUCK|pinto beans hinder quickly even, iro +11235|355|56|4|9|11298.15|0.08|0.03|N|O|1996-05-29|1996-06-17|1996-06-06|DELIVER IN PERSON|SHIP|inal theodolites sleep furi +11235|238|39|5|48|54635.04|0.01|0.01|N|O|1996-05-16|1996-06-30|1996-06-01|TAKE BACK RETURN|MAIL|ly regular packages. slyl +11235|417|76|6|43|56648.63|0.00|0.06|N|O|1996-04-15|1996-06-01|1996-04-27|COLLECT COD|REG AIR|tegrate furiously accounts. c +11235|908|11|7|34|61502.60|0.05|0.01|N|O|1996-07-26|1996-06-23|1996-08-15|DELIVER IN PERSON|FOB|quests sleep furiously carefully fu +11236|512|13|1|17|24012.67|0.02|0.08|A|F|1993-11-23|1994-01-21|1993-11-29|NONE|MAIL|even instructions against the f +11236|81|57|2|19|18640.52|0.02|0.00|A|F|1993-12-29|1994-01-28|1994-01-20|COLLECT COD|MAIL|refully even dinos nod care +11236|279|80|3|46|54246.42|0.00|0.04|R|F|1993-11-05|1993-12-14|1993-11-30|TAKE BACK RETURN|SHIP|s according +11236|1625|8|4|23|35112.26|0.07|0.08|R|F|1993-12-02|1994-01-08|1993-12-08|COLLECT COD|FOB|ding to the furiousl +11236|1367|6|5|26|32977.36|0.06|0.00|R|F|1994-02-10|1993-12-17|1994-02-18|TAKE BACK RETURN|SHIP|st carefully regular deposits. qu +11236|1420|38|6|34|44928.28|0.07|0.06|R|F|1993-11-13|1993-12-01|1993-11-15|TAKE BACK RETURN|MAIL| carefully regular foxes +11237|546|7|1|43|62201.22|0.05|0.06|N|O|1996-10-06|1996-08-01|1996-11-01|NONE|REG AIR|sly pending accounts use. furiously +11237|1897|98|2|32|57564.48|0.05|0.03|N|O|1996-09-20|1996-07-21|1996-10-18|TAKE BACK RETURN|REG AIR| the fluffily p +11237|1852|53|3|15|26307.75|0.01|0.06|N|O|1996-07-09|1996-08-14|1996-07-16|COLLECT COD|FOB|s. furiously ir +11237|1174|11|4|8|8601.36|0.04|0.04|N|O|1996-06-29|1996-08-11|1996-06-30|TAKE BACK RETURN|TRUCK|according to the fluffily final +11238|1303|4|1|35|42150.50|0.01|0.05|N|O|1996-10-09|1996-10-16|1996-10-30|DELIVER IN PERSON|TRUCK|tect carefully again +11238|1624|25|2|7|10679.34|0.04|0.01|N|O|1996-07-27|1996-09-19|1996-07-31|COLLECT COD|AIR|ly blithely unusual asymptot +11238|1662|4|3|5|7818.30|0.09|0.05|N|O|1996-09-10|1996-08-28|1996-09-16|COLLECT COD|AIR|unts thrash. blithely final requ +11238|1045|46|4|50|47302.00|0.09|0.07|N|O|1996-09-12|1996-09-05|1996-09-25|DELIVER IN PERSON|FOB|t instructions sublate fluffily fl +11238|1079|80|5|2|1960.14|0.00|0.04|N|O|1996-10-17|1996-09-14|1996-10-18|TAKE BACK RETURN|SHIP|ely even id +11238|104|5|6|17|17069.70|0.05|0.05|N|O|1996-11-01|1996-09-14|1996-11-06|COLLECT COD|REG AIR|ic sauternes haggle across t +11239|1321|60|1|41|50115.12|0.04|0.05|R|F|1992-05-15|1992-04-14|1992-05-27|COLLECT COD|RAIL|y ironic pa +11239|1824|11|2|39|67306.98|0.06|0.05|A|F|1992-04-08|1992-04-26|1992-05-04|DELIVER IN PERSON|RAIL| of the carefully final reque +11239|1825|69|3|10|17268.20|0.08|0.04|A|F|1992-02-26|1992-04-03|1992-02-28|DELIVER IN PERSON|SHIP|cial somas. pinto beans may wak +11239|670|71|4|34|53402.78|0.00|0.05|R|F|1992-05-25|1992-04-11|1992-05-28|COLLECT COD|REG AIR|ly final deposits; f +11239|785|86|5|39|65745.42|0.08|0.03|R|F|1992-06-10|1992-04-02|1992-06-27|DELIVER IN PERSON|FOB|ithely. slyly regul +11239|175|76|6|5|5375.85|0.10|0.04|R|F|1992-05-13|1992-03-15|1992-05-24|NONE|REG AIR|he carefully regular requests. f +11239|335|36|7|40|49413.20|0.00|0.08|A|F|1992-05-05|1992-03-21|1992-05-29|NONE|AIR| foxes wake. slyly +11264|1695|96|1|22|35127.18|0.08|0.07|N|O|1996-12-13|1996-10-03|1996-12-17|TAKE BACK RETURN|FOB|inst the quickly final reque +11264|892|92|2|11|19721.79|0.01|0.05|N|O|1996-10-04|1996-11-25|1996-10-25|TAKE BACK RETURN|TRUCK|nal, ironic requests wake a +11264|794|91|3|20|33895.80|0.00|0.02|N|O|1996-12-26|1996-11-18|1997-01-10|TAKE BACK RETURN|REG AIR|luffy patterns use careful +11264|1707|50|4|26|41826.20|0.03|0.03|N|O|1996-11-11|1996-11-13|1996-11-30|TAKE BACK RETURN|REG AIR|nts haggle carefully across the u +11264|355|84|5|16|20085.60|0.03|0.08|N|O|1996-11-12|1996-11-13|1996-12-03|DELIVER IN PERSON|AIR| express theodolites. even accounts hag +11265|1831|32|1|24|41587.92|0.07|0.02|N|O|1997-07-09|1997-08-03|1997-07-20|TAKE BACK RETURN|AIR|to the final +11265|738|35|2|29|47523.17|0.04|0.00|N|O|1997-07-18|1997-07-25|1997-07-19|NONE|MAIL|ke dependencies? slyly quick foxe +11265|92|93|3|4|3968.36|0.03|0.02|N|O|1997-07-21|1997-06-26|1997-08-15|DELIVER IN PERSON|FOB|ly ironic dolphi +11266|1734|35|1|8|13085.84|0.00|0.04|N|O|1997-10-16|1997-10-24|1997-11-07|COLLECT COD|FOB|onic asymptotes sleep slyly furiousl +11267|199|26|1|3|3297.57|0.00|0.01|R|F|1992-05-28|1992-04-11|1992-06-23|NONE|REG AIR|ly express requ +11267|156|35|2|40|42246.00|0.01|0.01|A|F|1992-03-01|1992-03-28|1992-03-29|NONE|TRUCK|symptotes haggle furiously. careful +11268|745|10|1|12|19748.88|0.00|0.03|N|O|1998-10-13|1998-09-05|1998-10-15|TAKE BACK RETURN|TRUCK|carefully. deposits boost across th +11268|978|81|2|7|13152.79|0.01|0.01|N|O|1998-09-15|1998-08-10|1998-10-11|NONE|FOB|ully according to the blit +11268|777|78|3|48|80532.96|0.09|0.07|N|O|1998-10-06|1998-07-30|1998-11-02|COLLECT COD|REG AIR|ut the even excuses. final reque +11268|777|78|4|49|82210.73|0.10|0.05|N|O|1998-09-25|1998-09-03|1998-10-21|TAKE BACK RETURN|RAIL|ns are fluffily according to th +11269|781|46|1|31|52135.18|0.02|0.00|A|F|1992-08-06|1992-08-23|1992-08-12|TAKE BACK RETURN|TRUCK|ual theodolites are q +11269|1821|22|2|33|56853.06|0.01|0.04|R|F|1992-07-26|1992-08-11|1992-07-30|NONE|FOB|lly. silent theodolite +11269|1265|66|3|6|6997.56|0.01|0.06|R|F|1992-08-16|1992-08-23|1992-08-30|DELIVER IN PERSON|SHIP|r ideas wake furio +11269|1062|98|4|41|39485.46|0.09|0.08|A|F|1992-09-18|1992-07-05|1992-09-19|DELIVER IN PERSON|RAIL|theodolites. care +11269|1298|36|5|49|58765.21|0.07|0.03|A|F|1992-08-03|1992-08-20|1992-08-15|DELIVER IN PERSON|REG AIR|d, dogged pains are blithely. car +11269|82|83|6|34|33390.72|0.07|0.02|R|F|1992-08-30|1992-07-27|1992-09-12|TAKE BACK RETURN|FOB|lly regular deposits haggle carefully +11269|1447|87|7|9|12135.96|0.01|0.03|R|F|1992-09-25|1992-06-26|1992-10-14|DELIVER IN PERSON|SHIP|ar foxes boost +11270|720|17|1|6|9724.32|0.03|0.01|N|O|1995-09-05|1995-09-23|1995-09-09|TAKE BACK RETURN|SHIP|deas. sly accounts integrate bl +11270|374|3|2|29|36956.73|0.09|0.06|N|O|1995-08-10|1995-09-06|1995-08-19|TAKE BACK RETURN|REG AIR|requests sleep quic +11270|282|83|3|39|46108.92|0.02|0.06|N|O|1995-10-04|1995-08-25|1995-10-07|TAKE BACK RETURN|SHIP| even pint +11270|1108|9|4|49|49445.90|0.10|0.02|N|O|1995-09-20|1995-08-21|1995-09-21|TAKE BACK RETURN|SHIP|he blithely even packages +11270|843|77|5|28|48827.52|0.02|0.03|N|O|1995-10-16|1995-09-25|1995-11-03|COLLECT COD|AIR|pending foxes use fluffily fluffily +11270|1917|18|6|6|10913.46|0.09|0.01|N|O|1995-08-01|1995-08-19|1995-08-25|NONE|MAIL| haggle under the furiously express pack +11271|1487|5|1|23|31935.04|0.00|0.04|N|O|1995-12-06|1995-12-19|1995-12-10|NONE|SHIP|refully above th +11271|995|96|2|17|32231.83|0.08|0.06|N|O|1995-12-15|1995-11-18|1995-12-30|DELIVER IN PERSON|REG AIR|c pinto beans. quickly regular depend +11271|615|9|3|45|68202.45|0.04|0.04|N|O|1996-01-22|1995-11-19|1996-02-09|DELIVER IN PERSON|TRUCK|y regular dependencies cajole furio +11271|795|28|4|41|69527.39|0.09|0.06|N|O|1996-01-15|1996-01-15|1996-01-18|COLLECT COD|TRUCK|ely even platelets. fluffily permanent idea +11271|485|15|5|21|29095.08|0.04|0.02|N|O|1996-01-19|1995-12-13|1996-02-12|COLLECT COD|MAIL|xpress deposi +11271|609|72|6|2|3019.20|0.00|0.07|N|O|1996-01-21|1995-12-12|1996-02-15|TAKE BACK RETURN|MAIL|pendencies. careful +11271|126|27|7|25|25653.00|0.09|0.02|N|O|1995-12-11|1996-01-16|1995-12-12|NONE|REG AIR|dazzle ironically fu +11296|702|67|1|29|46478.30|0.03|0.02|R|F|1992-03-08|1992-02-11|1992-04-05|DELIVER IN PERSON|TRUCK|riously silent deposits han +11296|1718|19|2|36|58309.56|0.02|0.06|A|F|1992-03-06|1992-03-29|1992-03-09|COLLECT COD|MAIL|, stealthy p +11296|1789|16|3|35|59177.30|0.08|0.00|R|F|1992-02-17|1992-03-08|1992-02-26|NONE|FOB|counts. waters doze blithely instruct +11296|1620|21|4|50|76081.00|0.00|0.07|A|F|1992-02-14|1992-03-21|1992-02-25|NONE|SHIP| packages wake quickly. furiou +11296|996|31|5|35|66394.65|0.07|0.03|A|F|1992-03-24|1992-03-19|1992-04-13|NONE|MAIL|yly above the ruthl +11296|1848|78|6|41|71743.44|0.06|0.07|A|F|1992-03-09|1992-02-12|1992-04-07|NONE|FOB|egular asymptotes are carefully special req +11297|422|52|1|32|42317.44|0.08|0.04|R|F|1993-04-07|1993-03-20|1993-04-30|COLLECT COD|RAIL|ding, expres +11297|755|88|2|45|74508.75|0.08|0.01|R|F|1993-03-15|1993-03-11|1993-04-01|NONE|AIR|ndencies haggle caref +11298|370|55|1|34|43192.58|0.04|0.00|N|O|1998-03-09|1998-03-07|1998-03-26|DELIVER IN PERSON|AIR|ously even i +11298|442|43|2|17|22821.48|0.00|0.08|N|O|1998-02-08|1998-03-21|1998-02-26|COLLECT COD|AIR|. regular, +11298|1874|18|3|32|56827.84|0.09|0.01|N|O|1998-01-29|1998-03-26|1998-02-02|NONE|RAIL|quests cajole quickly furiously careful +11298|651|83|4|43|66720.95|0.01|0.06|N|O|1998-01-18|1998-04-03|1998-02-08|COLLECT COD|MAIL|ffily even packages. quick +11298|1569|90|5|15|22058.40|0.07|0.03|N|O|1998-03-05|1998-03-03|1998-03-30|DELIVER IN PERSON|SHIP|r dolphins play furi +11298|1687|29|6|12|19064.16|0.06|0.07|N|O|1998-01-20|1998-03-21|1998-02-15|DELIVER IN PERSON|AIR|refully regular ideas +11299|1142|43|1|42|43811.88|0.06|0.03|R|F|1993-12-02|1994-01-07|1993-12-04|COLLECT COD|FOB|l requests +11299|257|39|2|15|17358.75|0.07|0.07|R|F|1993-12-21|1993-12-13|1994-01-14|DELIVER IN PERSON|AIR|yly at the carefully ironic theodo +11299|176|55|3|45|48427.65|0.10|0.00|A|F|1993-12-03|1993-12-14|1993-12-13|COLLECT COD|REG AIR|y regular accounts. +11299|1228|66|4|17|19196.74|0.05|0.05|A|F|1993-12-29|1994-02-03|1994-01-03|DELIVER IN PERSON|REG AIR| packages wake +11299|654|17|5|38|59076.70|0.09|0.02|R|F|1994-03-09|1993-12-13|1994-03-13|TAKE BACK RETURN|MAIL|riously pending ex +11299|324|81|6|47|57543.04|0.01|0.07|A|F|1994-01-02|1994-02-01|1994-02-01|TAKE BACK RETURN|FOB|y final packages sleep express foxes. ironi +11299|567|28|7|10|14675.60|0.06|0.08|A|F|1994-01-12|1994-01-19|1994-02-10|DELIVER IN PERSON|RAIL|thely even theodolites! accounts h +11300|713|10|1|47|75844.37|0.03|0.05|N|O|1996-09-07|1996-08-31|1996-09-11|NONE|AIR|ic instructions! even, final +11301|835|69|1|24|41659.92|0.04|0.07|R|F|1992-07-05|1992-06-16|1992-07-06|NONE|MAIL|uctions are carefully about the fu +11301|859|26|2|20|35197.00|0.02|0.00|R|F|1992-06-20|1992-06-15|1992-07-14|NONE|SHIP|egular excuses n +11301|1488|67|3|22|30568.56|0.06|0.01|R|F|1992-03-28|1992-06-07|1992-04-13|NONE|TRUCK|s boost fluffily quickly bold dugouts. +11301|1491|92|4|2|2784.98|0.05|0.08|A|F|1992-06-19|1992-05-10|1992-06-22|TAKE BACK RETURN|MAIL|deas use slyly accoun +11301|1417|96|5|23|30323.43|0.01|0.00|A|F|1992-04-24|1992-05-13|1992-04-26|COLLECT COD|RAIL|lar foxes poach blithel +11301|1662|63|6|33|51600.78|0.02|0.03|A|F|1992-06-23|1992-04-26|1992-06-28|DELIVER IN PERSON|FOB|ges. furiously pending theodolites wake +11302|414|15|1|39|51261.99|0.10|0.07|R|F|1994-04-23|1994-04-04|1994-05-04|DELIVER IN PERSON|AIR| express packages wake careful +11302|77|3|2|16|15633.12|0.00|0.08|A|F|1994-04-11|1994-04-29|1994-05-07|NONE|AIR|lyly regular cou +11302|949|18|3|50|92497.00|0.08|0.01|A|F|1994-05-10|1994-04-01|1994-05-18|NONE|MAIL|posits wake according to th +11302|1216|54|4|32|35750.72|0.10|0.06|A|F|1994-03-27|1994-05-24|1994-03-31|TAKE BACK RETURN|REG AIR|fily special sauternes. furiously fina +11302|89|65|5|27|26705.16|0.01|0.07|R|F|1994-06-30|1994-04-21|1994-07-06|DELIVER IN PERSON|MAIL|r the carefully p +11302|1542|63|6|21|30314.34|0.03|0.00|A|F|1994-06-19|1994-05-13|1994-06-21|TAKE BACK RETURN|RAIL|lar asymptotes integrate carefully bli +11303|1288|89|1|25|29732.00|0.06|0.05|R|F|1992-06-28|1992-06-24|1992-07-19|DELIVER IN PERSON|SHIP|packages: even requests doubt quietly aft +11303|1725|10|2|23|37414.56|0.10|0.04|A|F|1992-07-14|1992-06-16|1992-07-19|TAKE BACK RETURN|SHIP|ts integrate slyly enticingly unusual as +11303|970|39|3|16|29935.52|0.09|0.05|R|F|1992-04-11|1992-05-08|1992-04-12|COLLECT COD|SHIP|l foxes cajole carefully atop th +11328|351|36|1|15|18770.25|0.06|0.06|R|F|1992-07-08|1992-05-04|1992-08-02|TAKE BACK RETURN|MAIL|silent deposits about the carefully bold +11329|19|70|1|27|24813.27|0.02|0.03|N|O|1995-10-27|1995-10-17|1995-11-07|TAKE BACK RETURN|FOB|special, regular dolphins +11329|773|74|2|38|63603.26|0.06|0.01|N|O|1995-11-04|1995-11-02|1995-11-07|NONE|RAIL|sly unusual accounts cajole slyly i +11329|1107|16|3|42|42340.20|0.03|0.02|N|O|1995-10-01|1995-10-03|1995-10-11|DELIVER IN PERSON|AIR| quickly carefully regular deposits! fi +11329|376|33|4|32|40843.84|0.02|0.06|N|O|1995-08-19|1995-10-10|1995-09-04|COLLECT COD|RAIL|ress pinto be +11329|899|99|5|20|35997.80|0.04|0.02|N|O|1995-09-08|1995-09-17|1995-09-26|COLLECT COD|RAIL|c patterns. furi +11329|571|2|6|44|64749.08|0.01|0.05|N|O|1995-10-10|1995-10-08|1995-11-05|NONE|RAIL|tes boost against the quickly pending re +11330|439|40|1|3|4018.29|0.05|0.00|R|F|1992-07-15|1992-05-28|1992-07-28|DELIVER IN PERSON|REG AIR|ly final instructions. pe +11331|1194|31|1|18|19713.42|0.09|0.01|N|O|1996-03-11|1996-03-15|1996-03-12|COLLECT COD|AIR|ly. carefully even multipliers after the +11332|69|70|1|42|40700.52|0.00|0.03|R|F|1994-11-18|1995-01-26|1994-12-02|DELIVER IN PERSON|AIR|nic asymptotes b +11332|1572|53|2|8|11788.56|0.08|0.00|A|F|1994-12-26|1995-01-28|1995-01-12|TAKE BACK RETURN|REG AIR|y quick requests boost slyly. +11332|126|53|3|15|15391.80|0.05|0.06|R|F|1995-03-08|1994-12-28|1995-03-24|TAKE BACK RETURN|MAIL|eans haggle furiously +11332|508|39|4|5|7042.50|0.08|0.00|A|F|1995-03-05|1994-12-24|1995-03-11|DELIVER IN PERSON|SHIP|regular pinto bean +11332|1356|95|5|3|3772.05|0.01|0.01|R|F|1995-01-22|1994-12-25|1995-02-21|COLLECT COD|FOB|ackages according to the finally f +11332|672|73|6|45|70770.15|0.00|0.07|R|F|1994-12-02|1994-12-22|1994-12-28|NONE|MAIL|iously brave accounts boost slyly. furiousl +11332|669|70|7|38|59647.08|0.04|0.04|R|F|1994-11-24|1995-01-11|1994-12-03|DELIVER IN PERSON|SHIP|oost blithely acco +11333|1723|8|1|10|16247.20|0.06|0.03|A|F|1994-10-05|1994-08-14|1994-10-10|COLLECT COD|AIR|ily regular instruction +11334|1906|51|1|43|77739.70|0.01|0.01|N|O|1997-09-23|1997-10-22|1997-10-03|COLLECT COD|FOB|ular ideas wake furiously above +11334|1945|78|2|35|64642.90|0.09|0.05|N|O|1997-10-08|1997-10-10|1997-10-14|NONE|AIR|er the caref +11334|1310|25|3|4|4845.24|0.08|0.04|N|O|1997-11-03|1997-09-07|1997-11-11|COLLECT COD|SHIP|eodolites +11334|141|20|4|38|39563.32|0.03|0.06|N|O|1997-10-07|1997-09-10|1997-11-04|NONE|TRUCK|dazzle furiously above th +11334|920|89|5|33|60090.36|0.10|0.08|N|O|1997-09-18|1997-09-20|1997-10-18|NONE|AIR|as are acro +11334|73|99|6|25|24326.75|0.08|0.00|N|O|1997-11-25|1997-09-28|1997-11-30|TAKE BACK RETURN|FOB|shall sleep. blithely careful +11334|885|52|7|43|76792.84|0.06|0.08|N|O|1997-11-02|1997-10-17|1997-11-17|TAKE BACK RETURN|RAIL| packages. express, unusual accoun +11335|1786|29|1|4|6751.12|0.01|0.08|R|F|1994-12-16|1994-12-10|1994-12-19|NONE|FOB|ven pinto beans sleep car +11335|259|87|2|46|53325.50|0.00|0.02|R|F|1995-01-05|1994-12-26|1995-01-23|COLLECT COD|REG AIR|nal theodoli +11335|838|38|3|7|12171.81|0.08|0.05|A|F|1995-01-25|1994-12-19|1995-02-22|NONE|MAIL|ly ironic, regular accou +11335|174|27|4|17|18260.89|0.03|0.05|R|F|1995-02-08|1994-12-11|1995-02-23|COLLECT COD|SHIP|ong the special, express fox +11335|115|16|5|41|41619.51|0.03|0.03|R|F|1994-12-24|1995-01-15|1995-01-06|COLLECT COD|FOB|pending request +11360|445|4|1|3|4036.32|0.01|0.05|N|O|1997-11-09|1997-10-30|1997-12-08|NONE|FOB|the quickly unusu +11360|661|62|2|41|64028.06|0.07|0.06|N|O|1997-11-25|1997-11-16|1997-12-13|COLLECT COD|FOB| pending asymptotes. car +11361|517|18|1|49|69457.99|0.04|0.01|R|F|1994-10-02|1994-11-23|1994-11-01|TAKE BACK RETURN|RAIL|y ironic deposi +11361|852|52|2|33|57844.05|0.02|0.03|R|F|1994-09-29|1994-11-01|1994-10-22|DELIVER IN PERSON|FOB|ts. ironic +11361|889|23|3|1|1789.88|0.04|0.03|R|F|1994-11-07|1994-12-17|1994-12-07|COLLECT COD|REG AIR|tes. carefully express platelets pl +11361|984|85|4|48|90479.04|0.08|0.03|A|F|1995-01-16|1994-12-06|1995-01-22|TAKE BACK RETURN|MAIL|tions. pending, regular request +11361|544|45|5|22|31779.88|0.02|0.00|R|F|1995-01-09|1994-11-07|1995-02-08|NONE|FOB|counts are blithely accordin +11361|852|19|6|4|7011.40|0.02|0.05|R|F|1994-11-29|1994-11-10|1994-12-15|NONE|MAIL|s sleep asymptotes. caref +11362|1810|11|1|32|54777.92|0.09|0.07|R|F|1992-10-24|1992-11-12|1992-11-04|NONE|REG AIR|eposits cajole carefully according to the +11362|1641|83|2|10|15426.40|0.02|0.05|R|F|1992-12-19|1992-12-09|1993-01-10|NONE|SHIP|affix. quietly daring packages s +11362|1641|42|3|45|69418.80|0.09|0.07|R|F|1993-01-03|1992-10-22|1993-01-30|COLLECT COD|MAIL|blithely after the fi +11362|1798|41|4|50|84989.50|0.00|0.03|A|F|1992-10-23|1992-11-22|1992-11-14|DELIVER IN PERSON|TRUCK|ons after the carefully regular a +11362|551|12|5|18|26127.90|0.08|0.07|A|F|1992-11-05|1992-12-05|1992-11-16|NONE|RAIL|uickly express +11363|1779|6|1|44|73953.88|0.03|0.03|N|O|1998-06-07|1998-05-07|1998-06-08|COLLECT COD|FOB|od careful +11363|1603|4|2|9|13541.40|0.03|0.04|N|O|1998-03-12|1998-04-15|1998-03-20|TAKE BACK RETURN|REG AIR|foxes affix slyly special, bol +11363|71|47|3|20|19421.40|0.03|0.03|N|O|1998-03-15|1998-04-23|1998-03-21|TAKE BACK RETURN|AIR|ents alongside of th +11363|959|28|4|29|53938.55|0.02|0.07|N|O|1998-03-22|1998-03-20|1998-04-12|COLLECT COD|FOB|nal, even theodolite +11364|399|56|1|24|31185.36|0.08|0.08|N|O|1997-04-22|1997-05-25|1997-05-20|NONE|FOB|s above the furiously +11364|859|59|2|44|77433.40|0.04|0.03|N|O|1997-06-12|1997-05-16|1997-06-27|NONE|SHIP|kly ironic deposits a +11365|482|12|1|31|42856.88|0.00|0.04|N|O|1997-12-28|1997-11-03|1998-01-13|COLLECT COD|MAIL|ven depende +11365|407|95|2|31|40529.40|0.00|0.00|N|O|1997-10-21|1997-10-27|1997-11-08|TAKE BACK RETURN|REG AIR|ss packages? sp +11365|1856|100|3|27|47461.95|0.06|0.07|N|O|1997-11-24|1997-10-22|1997-12-14|NONE|MAIL| are. dolp +11365|1505|26|4|17|23910.50|0.09|0.06|N|O|1997-10-30|1997-11-13|1997-11-20|COLLECT COD|AIR| have to cajole blithely? blithely unu +11365|1800|85|5|32|54457.60|0.02|0.05|N|O|1997-12-28|1997-10-09|1998-01-22|DELIVER IN PERSON|AIR| accounts mold blithely about th +11366|1511|52|1|9|12712.59|0.01|0.01|R|F|1992-08-08|1992-07-22|1992-08-30|DELIVER IN PERSON|FOB|counts across the +11367|1076|77|1|19|18564.33|0.06|0.04|A|F|1995-04-13|1995-01-24|1995-04-19|TAKE BACK RETURN|RAIL|ges wake around the ev +11392|338|95|1|46|56963.18|0.00|0.03|R|F|1994-12-02|1994-11-09|1994-12-24|TAKE BACK RETURN|SHIP|y ironic re +11392|1891|21|2|46|82472.94|0.09|0.02|A|F|1994-12-11|1994-10-15|1994-12-25|TAKE BACK RETURN|SHIP|ggle slyly after the ironic packages. final +11393|1900|30|1|49|88293.10|0.08|0.01|A|F|1992-05-08|1992-05-26|1992-05-26|NONE|TRUCK|tions wake courts. carefully even +11393|1280|18|2|48|56701.44|0.06|0.06|A|F|1992-04-12|1992-06-13|1992-05-02|NONE|AIR|cording to the blithely bold +11394|1282|57|1|35|41414.80|0.04|0.06|N|O|1998-04-13|1998-04-28|1998-04-28|DELIVER IN PERSON|FOB|ly regular fo +11394|1886|30|2|8|14303.04|0.09|0.01|N|O|1998-04-16|1998-04-17|1998-05-12|NONE|TRUCK|e regular, special foxes. +11394|685|79|3|32|50741.76|0.02|0.01|N|O|1998-06-06|1998-04-20|1998-06-25|TAKE BACK RETURN|RAIL|heodolites. blithely +11394|7|83|4|50|45350.00|0.06|0.06|N|O|1998-04-05|1998-04-06|1998-05-04|COLLECT COD|FOB|encies. express accounts sleep blithely; sl +11394|1355|94|5|25|31408.75|0.01|0.00|N|O|1998-06-14|1998-04-20|1998-06-27|COLLECT COD|REG AIR|ld foxes nag. quickly ironic +11395|322|23|1|24|29335.68|0.02|0.03|N|O|1997-10-28|1997-10-16|1997-10-31|DELIVER IN PERSON|AIR| regular, enticing accounts breach ab +11395|1123|32|2|7|7168.84|0.04|0.08|N|O|1997-09-25|1997-10-26|1997-10-23|TAKE BACK RETURN|AIR|lar deposit +11395|201|29|3|9|9910.80|0.06|0.05|N|O|1997-09-13|1997-10-01|1997-10-13|COLLECT COD|TRUCK|egular packages. packages accordi +11396|680|74|1|15|23710.20|0.09|0.03|R|F|1992-09-16|1992-10-05|1992-09-19|COLLECT COD|REG AIR|lly even instructions sleep daringl +11396|1995|96|2|15|28454.85|0.03|0.02|A|F|1992-09-14|1992-08-25|1992-09-17|DELIVER IN PERSON|TRUCK|according to the slyly even pa +11396|581|82|3|38|56300.04|0.05|0.07|A|F|1992-10-21|1992-09-26|1992-10-23|DELIVER IN PERSON|REG AIR|odolites believe quickly. bli +11397|517|8|1|41|58117.91|0.09|0.05|N|O|1996-11-19|1996-12-24|1996-12-06|NONE|AIR| ironic pa +11398|213|14|1|18|20037.78|0.06|0.08|A|F|1992-09-21|1992-10-04|1992-10-05|DELIVER IN PERSON|RAIL|en dolphins. slyly fina +11398|773|70|2|17|28454.09|0.09|0.07|R|F|1992-09-30|1992-11-05|1992-10-08|COLLECT COD|FOB| accounts haggle f +11398|202|84|3|46|50701.20|0.10|0.05|R|F|1992-08-14|1992-10-12|1992-09-08|COLLECT COD|AIR|thily regular plat +11398|1131|32|4|35|36124.55|0.07|0.01|R|F|1992-08-30|1992-10-30|1992-09-13|TAKE BACK RETURN|RAIL|aggle quickly alongside of the +11398|1845|89|5|39|68126.76|0.01|0.07|A|F|1992-09-06|1992-10-24|1992-09-12|TAKE BACK RETURN|RAIL|ts doubt furiously special pa +11398|288|89|6|49|58225.72|0.10|0.07|A|F|1992-09-12|1992-11-03|1992-10-05|NONE|RAIL|packages use furiously clos +11399|776|73|1|23|38565.71|0.03|0.06|R|F|1994-07-11|1994-06-02|1994-07-16|TAKE BACK RETURN|SHIP|ses kindle quickly. slyly pe +11424|1676|59|1|37|58373.79|0.03|0.04|A|F|1993-06-30|1993-05-03|1993-07-12|NONE|FOB|ar instructions boost slyly abo +11425|1952|53|1|15|27809.25|0.08|0.05|N|O|1995-09-14|1995-09-09|1995-10-11|DELIVER IN PERSON|SHIP|slyly ironic instructions. careful +11425|59|60|2|4|3836.20|0.05|0.06|N|O|1995-09-19|1995-07-31|1995-10-10|COLLECT COD|REG AIR|e carefully silent foxes. quickly final +11425|141|42|3|44|45810.16|0.02|0.07|N|O|1995-08-04|1995-07-31|1995-08-31|NONE|SHIP|gle. slyly pe +11425|683|84|4|8|12669.44|0.02|0.07|N|O|1995-09-18|1995-08-08|1995-09-21|TAKE BACK RETURN|REG AIR|ily even foxes about the +11425|1781|8|5|5|8413.90|0.04|0.01|N|O|1995-09-01|1995-08-30|1995-09-27|NONE|TRUCK|y. theodolites +11425|1368|45|6|44|55851.84|0.00|0.00|N|O|1995-07-01|1995-08-26|1995-07-29|DELIVER IN PERSON|AIR| courts cajole blithely according +11426|470|100|1|8|10963.76|0.03|0.05|A|F|1994-06-18|1994-07-24|1994-06-28|DELIVER IN PERSON|FOB|y after the special packages. furious +11426|292|20|2|32|38153.28|0.03|0.00|R|F|1994-05-22|1994-07-08|1994-06-19|DELIVER IN PERSON|REG AIR|ly final packages. quickly final asymptote +11426|1016|17|3|20|18340.20|0.06|0.03|A|F|1994-07-19|1994-07-27|1994-08-02|NONE|TRUCK|ents wake accordin +11426|841|75|4|13|22643.92|0.10|0.08|A|F|1994-05-24|1994-07-02|1994-06-10|COLLECT COD|TRUCK|usly. blithely re +11426|1287|25|5|6|7129.68|0.07|0.00|R|F|1994-08-04|1994-07-22|1994-08-29|NONE|RAIL|slyly requests. pendi +11427|41|92|1|24|22584.96|0.05|0.03|R|F|1994-03-03|1994-01-27|1994-03-24|DELIVER IN PERSON|AIR|e furiously. final, regular sauternes +11427|1241|79|2|14|15991.36|0.08|0.04|R|F|1994-03-08|1994-02-13|1994-03-22|TAKE BACK RETURN|MAIL|gside of th +11427|1758|85|3|34|56431.50|0.01|0.07|A|F|1994-03-05|1994-02-08|1994-03-17|TAKE BACK RETURN|REG AIR| the blithely silent ideas. c +11427|216|44|4|50|55810.50|0.09|0.04|A|F|1994-01-18|1993-12-25|1994-02-02|NONE|TRUCK|nts through the slyly unusual pinto +11427|938|7|5|20|36778.60|0.05|0.07|R|F|1994-03-06|1994-02-19|1994-03-29|NONE|MAIL| ironic packages. carefull +11427|1569|90|6|42|61763.52|0.01|0.03|R|F|1994-03-13|1994-02-07|1994-03-25|COLLECT COD|RAIL|y. carefully unusual +11427|1789|74|7|35|59177.30|0.09|0.05|A|F|1993-12-14|1994-01-23|1994-01-11|NONE|REG AIR|usual packages +11428|1141|14|1|7|7294.98|0.08|0.05|R|F|1992-04-06|1992-04-19|1992-04-28|COLLECT COD|SHIP|e quickly even packages. furious +11429|537|68|1|30|43125.90|0.10|0.05|A|F|1993-04-10|1993-04-20|1993-04-14|COLLECT COD|AIR|. blithely speci +11429|1268|6|2|28|32739.28|0.06|0.01|R|F|1993-04-06|1993-05-11|1993-04-26|COLLECT COD|REG AIR|gular dependencies above +11429|1394|9|3|32|41452.48|0.02|0.05|R|F|1993-05-04|1993-06-02|1993-05-07|DELIVER IN PERSON|AIR|even instructions. regular deposits ca +11429|101|28|4|33|33036.30|0.06|0.00|R|F|1993-03-21|1993-05-06|1993-03-29|NONE|MAIL|packages boost furious +11430|364|93|1|3|3793.08|0.04|0.00|N|O|1998-02-04|1998-03-21|1998-02-05|TAKE BACK RETURN|AIR|y slyly bold asymp +11431|622|23|1|11|16748.82|0.04|0.03|R|F|1992-08-08|1992-10-18|1992-08-30|COLLECT COD|RAIL|ins cajole furiously pending ide +11431|1022|23|2|28|25844.56|0.06|0.08|R|F|1992-09-24|1992-10-07|1992-10-20|TAKE BACK RETURN|REG AIR|furiously slyly final p +11431|195|96|3|44|48188.36|0.01|0.08|R|F|1992-09-16|1992-10-14|1992-10-05|TAKE BACK RETURN|SHIP|le furiously above the +11431|1101|38|4|16|16033.60|0.05|0.04|R|F|1992-08-19|1992-10-14|1992-08-21|NONE|FOB|riously. bold asympt +11431|791|88|5|22|37219.38|0.06|0.02|R|F|1992-08-13|1992-10-14|1992-08-26|COLLECT COD|TRUCK|s sleep bravely ca +11431|209|64|6|50|55460.00|0.05|0.07|R|F|1992-08-12|1992-09-16|1992-08-15|TAKE BACK RETURN|TRUCK|accounts are fl +11431|86|37|7|28|27610.24|0.05|0.07|R|F|1992-09-28|1992-09-02|1992-09-30|NONE|SHIP|e carefully above the bo +11456|1032|33|1|24|22392.72|0.04|0.07|A|F|1993-06-13|1993-06-28|1993-06-28|DELIVER IN PERSON|MAIL| haggle blithely around the bravely regular +11456|1227|28|2|6|6769.32|0.04|0.03|A|F|1993-06-20|1993-07-12|1993-06-21|DELIVER IN PERSON|AIR|ly even packages grow. furiou +11456|1552|33|3|5|7267.75|0.03|0.08|A|F|1993-06-20|1993-07-12|1993-06-26|NONE|AIR|oss the regular deposits cajole slyly o +11456|809|76|4|10|17098.00|0.10|0.05|R|F|1993-06-13|1993-05-23|1993-06-18|DELIVER IN PERSON|REG AIR| after the carefu +11457|384|41|1|22|28256.36|0.07|0.04|N|O|1996-02-17|1996-02-11|1996-03-14|TAKE BACK RETURN|FOB|ole quickly. bold, ironic pinto beans wake +11457|878|12|2|12|21346.44|0.01|0.05|N|O|1996-03-21|1996-03-12|1996-04-20|COLLECT COD|TRUCK|ckly even i +11457|549|40|3|34|49284.36|0.08|0.04|N|O|1996-02-07|1996-02-23|1996-02-25|COLLECT COD|AIR|ly. even deposits are final acc +11457|1394|95|4|14|18135.46|0.10|0.08|N|O|1996-02-26|1996-01-14|1996-03-25|NONE|TRUCK|unts boost blithely sly accou +11457|1265|3|5|37|43151.62|0.06|0.03|N|O|1995-12-17|1996-01-24|1996-01-03|COLLECT COD|MAIL|ongside of the +11457|1719|46|6|50|81035.50|0.10|0.05|N|O|1996-01-13|1996-02-04|1996-02-04|DELIVER IN PERSON|SHIP|thely regular courts sleep furiou +11458|1376|91|1|8|10218.96|0.08|0.07|N|O|1998-05-04|1998-06-10|1998-05-25|NONE|MAIL|ake after the carefully silent pinto b +11458|1738|81|2|38|62309.74|0.08|0.04|N|O|1998-05-29|1998-05-05|1998-06-20|TAKE BACK RETURN|RAIL| instructions. platelets de +11458|952|87|3|22|40764.90|0.09|0.03|N|O|1998-07-11|1998-05-18|1998-07-13|TAKE BACK RETURN|FOB| ideas. care +11458|697|60|4|36|57516.84|0.02|0.05|N|O|1998-04-11|1998-06-26|1998-04-21|NONE|AIR|ic deposits. blithely thin platelets +11458|142|95|5|30|31264.20|0.08|0.06|N|O|1998-05-31|1998-06-02|1998-06-11|COLLECT COD|SHIP| accounts integrate slyly about +11458|1882|12|6|2|3567.76|0.05|0.04|N|O|1998-07-13|1998-06-05|1998-08-05|TAKE BACK RETURN|AIR|kages! sil +11459|637|38|1|9|13838.67|0.10|0.00|N|O|1996-09-10|1996-10-05|1996-10-10|COLLECT COD|AIR|dependencies affix furiously +11459|935|70|2|46|84452.78|0.01|0.04|N|O|1996-10-17|1996-08-29|1996-11-06|TAKE BACK RETURN|REG AIR| carefully above the blithely regular pin +11459|1607|90|3|16|24137.60|0.01|0.00|N|O|1996-10-08|1996-09-12|1996-10-26|TAKE BACK RETURN|SHIP|ly final pinto beans +11459|154|33|4|34|35841.10|0.06|0.04|N|O|1996-07-25|1996-08-18|1996-07-29|TAKE BACK RETURN|MAIL|bout the flu +11459|533|94|5|39|55907.67|0.05|0.07|N|O|1996-09-07|1996-09-25|1996-09-18|COLLECT COD|FOB|s. slyly f +11459|989|92|6|5|9449.90|0.09|0.02|N|O|1996-11-04|1996-10-09|1996-11-23|DELIVER IN PERSON|REG AIR|tithes. silent deposits boost along +11459|1572|73|7|5|7367.85|0.08|0.03|N|O|1996-10-12|1996-09-29|1996-11-02|COLLECT COD|REG AIR|egular pinto beans. regular theodolites sn +11460|321|78|1|6|7327.92|0.07|0.06|A|F|1993-11-14|1993-10-31|1993-11-25|DELIVER IN PERSON|AIR|packages. blithely pending ideas i +11460|1368|7|2|32|40619.52|0.10|0.08|A|F|1993-09-21|1993-10-23|1993-09-28|COLLECT COD|SHIP|s the even, regular accounts. +11460|1746|31|3|3|4943.22|0.04|0.01|A|F|1993-12-24|1993-11-03|1993-12-25|NONE|AIR|ing foxes are. bold foxes eat carefull +11461|1682|24|1|16|25338.88|0.05|0.08|N|O|1996-06-29|1996-07-13|1996-07-16|TAKE BACK RETURN|TRUCK|nding packages according to the f +11461|1198|99|2|23|25281.37|0.10|0.03|N|O|1996-05-16|1996-07-19|1996-05-28|COLLECT COD|RAIL|he carefully silent +11461|719|16|3|19|30774.49|0.01|0.01|N|O|1996-08-08|1996-06-09|1996-08-25|TAKE BACK RETURN|FOB|integrate blithely final, eve +11462|843|77|1|8|13950.72|0.03|0.02|N|O|1996-09-07|1996-10-28|1996-09-14|NONE|REG AIR|structions was stealthily. furiously quick +11462|1157|66|2|14|14814.10|0.05|0.07|N|O|1996-09-23|1996-11-16|1996-10-22|NONE|AIR|es sleep furiously acros +11462|1188|89|3|44|47923.92|0.04|0.08|N|O|1996-11-17|1996-11-23|1996-12-09|TAKE BACK RETURN|MAIL| requests acco +11462|841|75|4|5|8709.20|0.04|0.05|N|O|1996-11-26|1996-09-28|1996-12-24|NONE|TRUCK|oxes. furious +11462|1703|46|5|9|14442.30|0.00|0.02|N|O|1996-12-01|1996-11-01|1996-12-28|COLLECT COD|RAIL|ounts-- blithely ironic depos +11462|1698|99|6|39|62387.91|0.05|0.05|N|O|1996-09-03|1996-11-10|1996-09-27|DELIVER IN PERSON|REG AIR|riously. regular ideas after the slyly +11463|304|5|1|17|20473.10|0.03|0.03|N|O|1998-04-02|1998-03-13|1998-04-29|COLLECT COD|MAIL|nts. blithely +11463|1804|48|2|42|71643.60|0.03|0.00|N|O|1998-04-19|1998-03-08|1998-05-13|NONE|RAIL|l deposits! carefully ironic foxes +11463|1738|39|3|48|78707.04|0.07|0.03|N|O|1998-03-15|1998-02-09|1998-04-13|TAKE BACK RETURN|AIR|ages sleep against the blith +11463|571|72|4|8|11772.56|0.06|0.03|N|O|1998-03-20|1998-03-12|1998-04-03|NONE|TRUCK|s. finally special ideas are blithely. +11463|661|62|5|5|7808.30|0.04|0.06|N|O|1998-03-21|1998-02-11|1998-04-13|COLLECT COD|MAIL|inal, unusual ideas cajole furiously regu +11463|973|76|6|25|46849.25|0.02|0.08|N|O|1998-04-16|1998-01-30|1998-04-23|DELIVER IN PERSON|AIR|t requests. final instructions hang acc +11463|332|61|7|19|23414.27|0.00|0.04|N|O|1998-04-14|1998-02-14|1998-05-08|NONE|REG AIR|- even pinto beans cajole after the blithel +11488|123|24|1|28|28647.36|0.09|0.06|R|F|1993-11-10|1993-10-16|1993-11-24|TAKE BACK RETURN|AIR|ccounts. ruthlessly even g +11488|662|63|2|45|70319.70|0.09|0.02|R|F|1993-09-27|1993-11-21|1993-10-22|TAKE BACK RETURN|REG AIR|ffily bold deposits. fluffily thin p +11489|764|97|1|49|81573.24|0.03|0.07|N|O|1996-12-05|1996-12-10|1996-12-26|NONE|REG AIR|gular dependencies detect dolphins. slyly +11489|2000|33|2|19|17138.00|0.06|0.01|N|O|1996-12-24|1996-12-09|1997-01-15|DELIVER IN PERSON|RAIL|usual theodolites. unu +11490|1262|37|1|42|48856.92|0.05|0.01|N|O|1996-11-02|1996-11-28|1996-11-23|NONE|SHIP|roughout the dependencies. furiously +11490|930|33|2|10|18309.30|0.02|0.08|N|O|1996-12-10|1996-12-01|1996-12-25|DELIVER IN PERSON|REG AIR|s above the grouc +11491|1855|56|1|10|17568.50|0.04|0.01|A|F|1993-10-30|1993-11-07|1993-10-31|DELIVER IN PERSON|FOB| accounts n +11491|197|76|2|45|49373.55|0.10|0.05|R|F|1993-12-03|1993-09-29|1993-12-19|COLLECT COD|TRUCK| somas-- pending, regular instruct +11491|1658|41|3|29|45229.85|0.09|0.05|R|F|1993-10-28|1993-09-30|1993-11-19|DELIVER IN PERSON|RAIL|regular excuses. furiousl +11491|1673|97|4|48|75584.16|0.05|0.03|R|F|1993-09-26|1993-10-31|1993-10-26|TAKE BACK RETURN|RAIL|y pending warthogs! blit +11491|1979|24|5|16|30095.52|0.00|0.04|A|F|1993-11-25|1993-10-08|1993-12-25|COLLECT COD|SHIP|ely even dependencies use +11491|458|59|6|18|24452.10|0.02|0.08|R|F|1993-12-10|1993-10-12|1994-01-03|TAKE BACK RETURN|FOB|the pinto bea +11491|1633|75|7|3|4603.89|0.02|0.03|R|F|1993-09-13|1993-10-31|1993-09-23|NONE|REG AIR|uriously regular packages. accoun +11492|74|100|1|20|19481.40|0.02|0.06|N|O|1997-05-30|1997-05-22|1997-05-31|DELIVER IN PERSON|REG AIR|accounts haggle. c +11492|1095|1|2|46|45820.14|0.00|0.00|N|O|1997-06-13|1997-05-05|1997-07-05|NONE|AIR|ackages eat blithely +11492|1461|40|3|48|65398.08|0.08|0.02|N|O|1997-04-15|1997-04-15|1997-05-08|DELIVER IN PERSON|TRUCK| the ironic sauternes wake requests. acco +11492|105|6|4|14|14071.40|0.05|0.03|N|O|1997-04-05|1997-05-02|1997-04-27|NONE|RAIL|y blithe realms +11493|1583|24|1|9|13361.22|0.09|0.02|N|O|1995-12-02|1996-01-04|1995-12-08|COLLECT COD|AIR|lly special theodolite +11493|1887|88|2|28|50088.64|0.04|0.07|N|O|1995-10-26|1995-12-29|1995-11-14|DELIVER IN PERSON|RAIL|final deposits. regular, pending inst +11494|817|18|1|13|22331.53|0.05|0.00|N|O|1997-10-03|1997-10-15|1997-10-17|COLLECT COD|RAIL|the bold requests-- ironic deposit +11494|763|60|2|2|3327.52|0.07|0.02|N|O|1997-08-07|1997-10-17|1997-08-25|TAKE BACK RETURN|TRUCK|ake furiously sp +11494|410|98|3|15|19656.15|0.00|0.03|N|O|1997-08-08|1997-09-05|1997-08-15|TAKE BACK RETURN|RAIL|ng platelets. even pac +11494|225|80|4|40|45008.80|0.01|0.03|N|O|1997-10-09|1997-09-11|1997-10-23|TAKE BACK RETURN|MAIL| carefully regular deposits haggle blithel +11495|1987|88|1|15|28334.70|0.05|0.08|N|O|1995-09-26|1995-09-23|1995-10-26|TAKE BACK RETURN|TRUCK|ronic accounts integrate. furiously regular +11495|949|18|2|8|14799.52|0.06|0.07|N|O|1995-08-19|1995-09-21|1995-09-02|TAKE BACK RETURN|RAIL|ously regular deposits. furiously bold in +11520|309|38|1|45|54418.50|0.10|0.00|A|F|1994-12-11|1994-11-03|1995-01-08|NONE|MAIL|aggle. ruthlessly ironic pac +11520|471|59|2|47|64459.09|0.07|0.05|A|F|1995-01-01|1994-10-30|1995-01-23|COLLECT COD|AIR|express ideas are quickly. bold, bold p +11521|1166|67|1|8|8537.28|0.03|0.05|N|O|1996-09-13|1996-10-26|1996-09-26|COLLECT COD|SHIP|gular foxes +11521|81|32|2|12|11772.96|0.09|0.03|N|O|1997-01-03|1996-11-04|1997-01-11|TAKE BACK RETURN|FOB| among the slyly regula +11522|1044|45|1|16|15120.64|0.03|0.05|A|F|1993-10-02|1993-11-02|1993-10-14|COLLECT COD|RAIL|onic courts. bold dolphins sle +11522|348|77|2|5|6241.70|0.03|0.00|A|F|1993-10-10|1993-11-13|1993-10-19|DELIVER IN PERSON|AIR| foxes. express packages +11523|315|16|1|31|37674.61|0.08|0.02|N|O|1998-11-22|1998-09-13|1998-12-11|TAKE BACK RETURN|AIR|deposits haggle about t +11523|1136|73|2|21|21779.73|0.03|0.06|N|O|1998-08-06|1998-09-09|1998-08-13|DELIVER IN PERSON|AIR| pinto beans +11523|605|99|3|15|22584.00|0.03|0.03|N|O|1998-09-20|1998-08-30|1998-10-14|TAKE BACK RETURN|MAIL| regular platelets. furiously ironic fox +11523|1738|65|4|48|78707.04|0.08|0.05|N|O|1998-08-18|1998-10-11|1998-09-09|NONE|SHIP|ecial instructions poach permanently across +11523|1617|59|5|19|28853.59|0.07|0.00|N|O|1998-11-17|1998-09-01|1998-11-27|COLLECT COD|SHIP|the enticingly regular +11523|667|61|6|17|26650.22|0.04|0.05|N|O|1998-07-28|1998-10-08|1998-08-08|DELIVER IN PERSON|MAIL|affix slyly among the reg +11524|1328|29|1|6|7375.92|0.02|0.03|N|O|1996-02-23|1996-03-06|1996-03-16|TAKE BACK RETURN|SHIP|kly after the final ideas. fluffily reg +11525|796|93|1|33|55994.07|0.08|0.07|N|O|1997-03-21|1997-05-15|1997-03-24|TAKE BACK RETURN|MAIL|. finally express excuses around the q +11525|595|86|2|32|47858.88|0.00|0.02|N|O|1997-06-16|1997-05-19|1997-07-03|DELIVER IN PERSON|TRUCK|are furiously ironic accounts. fluffily exp +11525|366|95|3|5|6331.80|0.03|0.07|N|O|1997-07-12|1997-05-23|1997-08-07|NONE|TRUCK|tions. quickly final p +11525|398|55|4|46|59725.94|0.03|0.01|N|O|1997-05-10|1997-06-18|1997-05-23|TAKE BACK RETURN|SHIP|es haggle car +11526|1333|10|1|12|14811.96|0.08|0.08|N|O|1998-05-26|1998-04-30|1998-06-12|DELIVER IN PERSON|REG AIR|le final, final +11526|740|41|2|30|49222.20|0.01|0.08|N|O|1998-06-12|1998-05-03|1998-06-26|DELIVER IN PERSON|SHIP|uriously pending pearls are slyl +11526|524|25|3|39|55556.28|0.00|0.02|N|O|1998-05-29|1998-05-05|1998-06-11|DELIVER IN PERSON|RAIL| above the ironically spec +11527|210|92|1|47|52179.87|0.10|0.00|A|F|1994-10-24|1994-09-03|1994-11-16|NONE|TRUCK|sual packages haggle. b +11552|1371|86|1|28|35626.36|0.08|0.06|R|F|1993-03-08|1993-03-03|1993-03-31|COLLECT COD|MAIL| are furiously according to the quickly iro +11553|246|74|1|49|56165.76|0.00|0.01|A|F|1994-08-03|1994-06-16|1994-08-23|COLLECT COD|TRUCK|lphins integrate across the ironic +11553|1326|65|2|21|25773.72|0.02|0.07|R|F|1994-07-09|1994-06-14|1994-07-16|COLLECT COD|FOB|inal theodolites. furiously ironic +11553|372|1|3|49|62346.13|0.10|0.02|R|F|1994-04-24|1994-06-21|1994-05-18|NONE|FOB|lly according to the fur +11553|72|48|4|41|39854.87|0.02|0.03|R|F|1994-07-09|1994-05-28|1994-08-06|NONE|REG AIR|bold theodoli +11553|599|60|5|18|26992.62|0.05|0.03|R|F|1994-06-18|1994-06-09|1994-06-26|NONE|SHIP|ing packages. slyly regular dinos wake quic +11554|764|65|1|49|81573.24|0.03|0.03|N|O|1998-07-24|1998-07-14|1998-08-11|COLLECT COD|TRUCK| platelets use blithely +11554|857|57|2|27|47461.95|0.06|0.01|N|O|1998-07-13|1998-07-09|1998-07-20|TAKE BACK RETURN|RAIL|gainst the furiously regular accounts. si +11554|956|91|3|1|1856.95|0.01|0.04|N|O|1998-07-26|1998-08-06|1998-08-13|DELIVER IN PERSON|TRUCK|. ideas sublate slyly f +11554|43|69|4|50|47152.00|0.06|0.07|N|O|1998-07-08|1998-07-20|1998-07-10|DELIVER IN PERSON|SHIP|nic, quiet requests may boost! +11554|1255|30|5|27|31218.75|0.02|0.07|N|O|1998-09-24|1998-07-11|1998-10-23|NONE|REG AIR|alongside of the slyly +11554|196|75|6|40|43847.60|0.09|0.08|N|O|1998-08-20|1998-08-01|1998-09-13|NONE|TRUCK|efully. ironic +11554|1940|29|7|10|18419.40|0.02|0.00|N|O|1998-09-15|1998-07-12|1998-10-08|TAKE BACK RETURN|AIR|quests doubt along the permane +11555|678|79|1|42|66304.14|0.01|0.05|N|O|1996-07-06|1996-07-20|1996-07-12|COLLECT COD|MAIL|kages use carefully; bold i +11555|811|45|2|34|58201.54|0.04|0.03|N|O|1996-07-10|1996-07-10|1996-07-13|DELIVER IN PERSON|REG AIR|ing to the slyly final pains. blith +11555|597|88|3|16|23961.44|0.04|0.01|N|O|1996-06-10|1996-08-22|1996-06-24|TAKE BACK RETURN|SHIP|l packages according to t +11555|139|40|4|47|48839.11|0.09|0.03|N|O|1996-09-05|1996-08-13|1996-10-01|NONE|SHIP|aggle. unusual requests about the +11555|274|56|5|40|46970.80|0.03|0.03|N|O|1996-09-08|1996-06-27|1996-09-15|COLLECT COD|TRUCK|ual excuses. quickly regula +11556|806|73|1|34|58031.20|0.09|0.06|N|O|1996-03-06|1996-04-07|1996-03-23|DELIVER IN PERSON|FOB| even accounts. regular accounts hagg +11556|446|34|2|32|43086.08|0.05|0.04|N|O|1996-04-16|1996-05-16|1996-04-17|NONE|SHIP|nos. slow waters wake blithely +11556|123|76|3|21|21485.52|0.05|0.03|N|O|1996-04-07|1996-04-21|1996-04-27|TAKE BACK RETURN|MAIL|y blithely special dependencies. f +11556|332|33|4|13|16020.29|0.09|0.02|N|O|1996-05-22|1996-05-26|1996-06-13|DELIVER IN PERSON|AIR| pinto beans wake furiousl +11556|1705|90|5|15|24100.50|0.04|0.06|N|O|1996-07-02|1996-05-08|1996-07-25|COLLECT COD|TRUCK|uses sleep blithely. furiously ir +11556|902|3|6|39|70313.10|0.04|0.00|N|O|1996-06-30|1996-04-05|1996-07-22|TAKE BACK RETURN|AIR| ironic, bold accounts snooze carefully. +11556|1725|68|7|7|11387.04|0.03|0.03|N|O|1996-04-26|1996-05-08|1996-05-14|TAKE BACK RETURN|MAIL| bold account +11557|753|54|1|2|3307.50|0.09|0.02|N|O|1997-06-15|1997-05-24|1997-07-04|NONE|MAIL|otes across the carefully regular instruct +11557|61|37|2|35|33637.10|0.04|0.07|N|O|1997-07-28|1997-05-22|1997-08-04|DELIVER IN PERSON|REG AIR|. furiously special +11557|956|57|3|1|1856.95|0.08|0.05|N|O|1997-08-05|1997-05-22|1997-08-19|NONE|RAIL|. asymptotes +11558|642|36|1|9|13883.76|0.04|0.05|A|F|1994-05-02|1994-06-09|1994-05-31|DELIVER IN PERSON|TRUCK|arefully even foxes cajole furiously ac +11558|1677|60|2|21|33152.07|0.03|0.04|A|F|1994-05-05|1994-05-04|1994-05-24|DELIVER IN PERSON|REG AIR|ts. regular re +11559|474|62|1|42|57727.74|0.08|0.02|N|O|1996-01-12|1995-12-03|1996-01-14|DELIVER IN PERSON|FOB|y daring asymptotes. regular +11584|413|14|1|39|51222.99|0.01|0.01|A|F|1994-12-22|1994-12-24|1994-12-29|COLLECT COD|FOB|g the slyly pendin +11584|733|34|2|46|75151.58|0.01|0.08|R|F|1994-12-07|1995-01-04|1995-01-01|COLLECT COD|AIR|ully above the +11584|687|19|3|25|39692.00|0.01|0.06|A|F|1995-01-19|1995-01-09|1995-01-20|TAKE BACK RETURN|SHIP|y express packages haggle. final, iron +11584|1373|12|4|32|40779.84|0.09|0.02|A|F|1995-02-18|1994-12-25|1995-03-07|COLLECT COD|SHIP|hins cajole unusual asymptotes. blithely +11584|705|2|5|22|35325.40|0.03|0.07|R|F|1995-01-13|1995-01-15|1995-02-08|NONE|TRUCK| even deposits? final requests belie +11584|722|87|6|45|73022.40|0.10|0.03|A|F|1994-12-23|1994-12-24|1995-01-05|DELIVER IN PERSON|REG AIR|e carefully regular deposits. fluffily +11584|1177|14|7|32|34501.44|0.00|0.01|R|F|1994-12-21|1995-01-14|1994-12-31|NONE|SHIP|unts. carefully bold pains impress. s +11585|655|87|1|28|43558.20|0.02|0.02|R|F|1994-05-20|1994-04-17|1994-06-16|DELIVER IN PERSON|MAIL|thely at the blithely ironic packages. +11585|1203|15|2|1|1104.20|0.08|0.05|R|F|1994-04-04|1994-05-30|1994-04-18|DELIVER IN PERSON|REG AIR|e. carefully regular +11585|1791|34|3|9|15235.11|0.04|0.03|R|F|1994-06-13|1994-05-29|1994-06-17|DELIVER IN PERSON|FOB|lly regular requests. carefully expre +11586|1788|73|1|12|20277.36|0.06|0.07|R|F|1993-12-29|1994-01-23|1994-01-24|NONE|FOB|are regular, final deposits. slyly bold re +11586|1136|45|2|4|4148.52|0.04|0.00|A|F|1993-11-27|1994-01-30|1993-12-24|COLLECT COD|REG AIR|sits cajole slyly. quickly +11587|1701|28|1|22|35259.40|0.10|0.06|N|O|1998-06-16|1998-05-31|1998-07-09|NONE|SHIP|lyly unusual foxes above the slyly +11587|1501|82|2|33|46282.50|0.09|0.00|N|O|1998-06-03|1998-04-12|1998-06-09|COLLECT COD|SHIP|ly ironic accounts. slyly regular instr +11587|1749|76|3|44|72632.56|0.03|0.05|N|O|1998-05-05|1998-05-27|1998-05-06|COLLECT COD|RAIL|the carefully express pinto bea +11588|1705|32|1|33|53021.10|0.00|0.05|N|O|1998-01-14|1997-12-06|1998-01-28|COLLECT COD|SHIP|r packages are above the blithely s +11588|1869|70|2|18|31875.48|0.06|0.05|N|O|1998-01-16|1997-12-10|1998-01-24|NONE|AIR|regular foxes cajole +11588|949|18|3|9|16649.46|0.06|0.04|N|O|1997-11-15|1997-12-22|1997-12-04|COLLECT COD|FOB|r deposits snooze blithely. sl +11588|1604|87|4|35|52696.00|0.08|0.08|N|O|1998-02-14|1997-12-16|1998-03-14|NONE|MAIL|sly final dol +11588|63|89|5|35|33707.10|0.09|0.04|N|O|1998-01-26|1998-01-16|1998-02-18|TAKE BACK RETURN|TRUCK|posits are; carefully final ideas nag even +11589|851|85|1|21|36788.85|0.07|0.04|A|F|1992-06-03|1992-07-02|1992-07-01|TAKE BACK RETURN|TRUCK|nusual instructions. reg +11589|686|18|2|45|71400.60|0.02|0.02|A|F|1992-06-09|1992-07-08|1992-06-21|COLLECT COD|AIR|es. final, regul +11590|30|31|1|43|39991.29|0.01|0.00|N|O|1996-06-23|1996-06-18|1996-07-07|COLLECT COD|FOB|s cajole packages. +11590|311|40|2|47|56931.57|0.03|0.06|N|O|1996-07-26|1996-06-12|1996-08-25|NONE|TRUCK| ideas wake regular, regular theodoli +11590|1327|4|3|41|50361.12|0.01|0.06|N|O|1996-07-08|1996-05-31|1996-07-15|NONE|SHIP|mptotes run. +11590|1225|37|4|49|55184.78|0.01|0.08|N|O|1996-04-27|1996-05-29|1996-05-15|DELIVER IN PERSON|AIR|es. blithely pending foxes alongside of th +11590|1624|7|5|27|41191.74|0.06|0.07|N|O|1996-05-01|1996-05-26|1996-05-04|COLLECT COD|REG AIR|odolites boost blithel +11591|620|83|1|42|63866.04|0.07|0.01|R|F|1993-02-01|1993-04-02|1993-02-24|COLLECT COD|SHIP| carefully unusual sentiments. b +11591|274|75|2|42|49319.34|0.05|0.04|A|F|1993-02-06|1993-02-22|1993-02-12|COLLECT COD|TRUCK|its nag according to the furiously exp +11616|630|93|1|6|9183.78|0.06|0.00|N|O|1996-10-28|1996-10-10|1996-11-11|TAKE BACK RETURN|RAIL|ideas haggle blithely even theo +11616|503|64|2|42|58947.00|0.00|0.06|N|O|1996-11-08|1996-09-07|1996-11-12|COLLECT COD|REG AIR|nic ideas nag +11616|1166|75|3|27|28813.32|0.02|0.07|N|O|1996-08-10|1996-09-24|1996-09-09|TAKE BACK RETURN|TRUCK|efully final sauternes sleep carefully +11616|251|6|4|42|48352.50|0.08|0.01|N|O|1996-09-13|1996-09-09|1996-09-21|TAKE BACK RETURN|REG AIR|nal packages wake slyly amon +11616|1525|26|5|37|52781.24|0.10|0.02|N|O|1996-08-03|1996-10-29|1996-08-07|COLLECT COD|AIR|counts sleep bl +11616|448|49|6|6|8090.64|0.10|0.07|N|O|1996-09-18|1996-09-28|1996-10-13|COLLECT COD|FOB|nticing excuses. +11616|1789|16|7|34|57486.52|0.03|0.05|N|O|1996-09-13|1996-09-12|1996-09-30|TAKE BACK RETURN|REG AIR|usly even packages. slyly brave s +11617|1491|92|1|8|11139.92|0.05|0.02|R|F|1994-12-29|1995-01-29|1995-01-25|TAKE BACK RETURN|FOB|usly final ideas affix +11617|1738|39|2|46|75427.58|0.02|0.04|A|F|1995-04-03|1995-01-14|1995-04-23|DELIVER IN PERSON|FOB|s sleep blithely ironic pl +11617|987|22|3|33|62303.34|0.08|0.02|A|F|1995-03-20|1995-02-27|1995-03-30|DELIVER IN PERSON|SHIP|slyly express packa +11617|322|79|4|2|2444.64|0.00|0.03|A|F|1995-03-02|1995-02-14|1995-03-10|NONE|AIR|s. slyly bold f +11617|595|96|5|16|23929.44|0.04|0.04|R|F|1995-03-07|1995-02-17|1995-04-04|DELIVER IN PERSON|SHIP|leep carefully. quickly pending +11617|687|81|6|9|14289.12|0.03|0.01|A|F|1995-01-06|1995-03-05|1995-01-13|TAKE BACK RETURN|MAIL|c theodolites. bold excuses boost slyly ne +11618|594|55|1|27|40353.93|0.01|0.02|N|O|1998-05-17|1998-04-01|1998-05-25|COLLECT COD|SHIP|e of the asymptotes are quickly pinto +11618|1682|24|2|4|6334.72|0.00|0.03|N|O|1998-02-23|1998-04-23|1998-03-18|DELIVER IN PERSON|MAIL|t have to sleep carefully in place of the i +11618|1507|28|3|22|30987.00|0.08|0.06|N|O|1998-03-02|1998-03-19|1998-03-28|NONE|AIR|. express platelets breach quickly along +11618|582|43|4|6|8895.48|0.07|0.00|N|O|1998-03-20|1998-04-04|1998-03-23|COLLECT COD|SHIP|ages: busily r +11618|1766|51|5|25|41694.00|0.07|0.06|N|O|1998-06-04|1998-04-26|1998-07-02|DELIVER IN PERSON|RAIL|d packages? furiousl +11619|1661|3|1|8|12501.28|0.02|0.00|N|O|1998-10-15|1998-08-12|1998-11-05|DELIVER IN PERSON|MAIL|bold accounts. daring, unu +11619|737|70|2|10|16377.30|0.08|0.04|N|O|1998-08-05|1998-10-09|1998-09-02|NONE|SHIP|ptotes use quickly furiously regular p +11619|363|92|3|13|16423.68|0.09|0.00|N|O|1998-10-27|1998-08-26|1998-11-07|DELIVER IN PERSON|MAIL|ding dependencies boost fluffily even, +11620|1786|29|1|7|11814.46|0.09|0.04|N|O|1997-07-28|1997-10-07|1997-08-22|COLLECT COD|RAIL| quickly. fluffily ironic +11620|538|69|2|5|7192.65|0.00|0.08|N|O|1997-09-23|1997-10-16|1997-09-26|NONE|REG AIR|uriously express orbits. furiou +11620|1064|100|3|23|22196.38|0.09|0.05|N|O|1997-08-18|1997-09-15|1997-09-11|COLLECT COD|RAIL|into beans. final accounts above the regul +11620|1377|92|4|26|33237.62|0.08|0.06|N|O|1997-07-29|1997-09-13|1997-08-19|NONE|FOB|riously regular warhorses use slyly am +11620|1530|71|5|31|44377.43|0.07|0.03|N|O|1997-09-26|1997-10-18|1997-10-14|COLLECT COD|RAIL|quests. bold requests alongside o +11621|1272|84|1|8|9386.16|0.03|0.08|N|O|1996-01-20|1996-01-26|1996-02-12|COLLECT COD|AIR|usual requests +11621|1920|53|2|47|85630.24|0.03|0.03|N|O|1996-02-12|1995-12-25|1996-03-10|NONE|AIR|ironic ideas impress quickly enti +11621|200|79|3|12|13202.40|0.01|0.05|N|O|1995-12-01|1996-02-07|1995-12-30|COLLECT COD|RAIL|regular excuses; deposits affix fu +11621|1373|12|4|10|12743.70|0.02|0.03|N|O|1996-01-14|1995-12-13|1996-01-28|COLLECT COD|RAIL|pinto beans. carefully final +11621|1526|47|5|35|49963.20|0.01|0.05|N|O|1996-01-08|1996-01-01|1996-01-14|TAKE BACK RETURN|SHIP|o the blithely regular accounts. idly +11621|593|84|6|42|62730.78|0.09|0.05|N|O|1995-12-07|1996-01-10|1995-12-17|TAKE BACK RETURN|MAIL|instructions are according to the care +11622|1501|42|1|22|30855.00|0.02|0.07|N|O|1996-06-01|1996-07-25|1996-06-04|DELIVER IN PERSON|MAIL|cial foxes. slyly thin platelets around +11622|239|40|2|20|22784.60|0.07|0.00|N|O|1996-05-22|1996-06-18|1996-06-19|NONE|REG AIR|old dependencies. slyly regular dolphi +11622|1229|4|3|40|45208.80|0.03|0.03|N|O|1996-08-02|1996-06-20|1996-08-20|TAKE BACK RETURN|SHIP| ironic instructions n +11622|1631|55|4|20|30652.60|0.06|0.07|N|O|1996-07-31|1996-07-22|1996-08-25|COLLECT COD|SHIP|nding realms integrate slyly careful +11622|164|91|5|40|42566.40|0.09|0.03|N|O|1996-06-19|1996-05-27|1996-06-23|NONE|SHIP|lly bold ideas cajole slyly across the +11623|716|49|1|45|72751.95|0.03|0.01|N|O|1996-01-15|1996-03-06|1996-01-19|COLLECT COD|AIR|c deposits. pending f +11623|1614|56|2|48|72749.28|0.05|0.01|N|O|1996-03-27|1996-03-03|1996-04-13|NONE|AIR|ely regular requests. ideas beyond the bli +11623|572|73|3|35|51539.95|0.07|0.04|N|O|1996-02-16|1996-01-21|1996-03-07|DELIVER IN PERSON|TRUCK|ons are. fluffi +11623|1741|68|4|19|31212.06|0.04|0.03|N|O|1996-03-25|1996-01-18|1996-04-13|DELIVER IN PERSON|MAIL|cording to the pending +11623|196|97|5|15|16442.85|0.10|0.05|N|O|1995-12-18|1996-02-24|1995-12-31|TAKE BACK RETURN|SHIP|. dolphins cajole blithely. quickly expres +11623|1420|21|6|46|60785.32|0.06|0.00|N|O|1996-04-05|1996-03-05|1996-04-30|DELIVER IN PERSON|SHIP|tructions. fluffily final warhorses engag +11623|1016|52|7|46|42182.46|0.09|0.08|N|O|1995-12-28|1996-03-14|1996-01-24|NONE|SHIP|ts. furiou +11648|1133|42|1|38|39296.94|0.02|0.00|R|F|1995-05-18|1995-06-21|1995-05-21|NONE|REG AIR|eodolites +11648|1624|25|2|39|59499.18|0.01|0.00|N|O|1995-08-07|1995-06-17|1995-08-15|COLLECT COD|FOB|egular braids run furiousl +11648|358|59|3|5|6291.75|0.04|0.08|A|F|1995-04-26|1995-06-20|1995-05-01|NONE|SHIP|ter the carefully iron +11648|1461|40|4|2|2724.92|0.05|0.08|R|F|1995-05-08|1995-07-01|1995-05-26|NONE|REG AIR|riously carefully +11648|1436|15|5|38|50822.34|0.10|0.06|N|O|1995-06-24|1995-07-04|1995-07-24|COLLECT COD|RAIL|ly express requests. regular as +11648|571|2|6|22|32374.54|0.03|0.00|A|F|1995-05-01|1995-06-20|1995-05-12|DELIVER IN PERSON|REG AIR| haggle bravely t +11648|1693|94|7|24|38272.56|0.07|0.05|N|O|1995-08-06|1995-06-09|1995-09-03|COLLECT COD|MAIL|. sometimes even deposits +11649|611|43|1|3|4534.83|0.08|0.00|N|O|1996-08-07|1996-09-08|1996-08-22|COLLECT COD|REG AIR|sits. carefully regular pac +11649|727|28|2|35|56970.20|0.06|0.01|N|O|1996-10-16|1996-09-08|1996-11-11|COLLECT COD|TRUCK|y final th +11649|1688|30|3|45|71535.60|0.03|0.03|N|O|1996-07-20|1996-07-30|1996-07-30|COLLECT COD|REG AIR|nic packages. quickly express dolphins aff +11649|1881|68|4|44|78446.72|0.10|0.04|N|O|1996-09-21|1996-09-19|1996-10-16|COLLECT COD|TRUCK|osits wake blithely. special dependencies w +11649|680|81|5|40|63227.20|0.04|0.04|N|O|1996-08-01|1996-08-24|1996-08-22|COLLECT COD|FOB|ely ironic requests cajole thinly slyly exp +11649|718|19|6|16|25899.36|0.06|0.03|N|O|1996-07-21|1996-08-13|1996-08-04|COLLECT COD|FOB|le. slyly regular ideas sleep ironically qu +11649|1789|74|7|26|43960.28|0.01|0.04|N|O|1996-08-19|1996-08-28|1996-08-22|COLLECT COD|SHIP|ilently regular accounts cajole +11650|1335|74|1|48|59343.84|0.06|0.01|A|F|1992-11-23|1992-12-02|1992-12-23|DELIVER IN PERSON|MAIL|fily final ideas. +11650|444|32|2|50|67222.00|0.03|0.07|R|F|1993-01-06|1992-12-12|1993-01-16|DELIVER IN PERSON|TRUCK|lly special theodo +11650|34|85|3|30|28020.90|0.04|0.00|R|F|1992-11-09|1992-12-18|1992-11-25|DELIVER IN PERSON|FOB|urts. somet +11651|1381|96|1|41|52577.58|0.00|0.06|A|F|1995-05-26|1995-04-19|1995-06-16|DELIVER IN PERSON|RAIL|ould have to are. slyly expre +11651|1563|44|2|8|11716.48|0.08|0.03|N|F|1995-06-03|1995-04-08|1995-06-18|TAKE BACK RETURN|RAIL|ic accounts detect +11652|1975|64|1|39|73201.83|0.07|0.04|N|O|1995-12-22|1996-01-28|1996-01-04|TAKE BACK RETURN|TRUCK|nic sentiments bo +11652|1997|98|2|11|20888.89|0.06|0.06|N|O|1996-02-13|1996-01-16|1996-03-01|COLLECT COD|AIR|ges. silent, silent waters cajole +11652|292|93|3|28|33384.12|0.08|0.08|N|O|1996-02-11|1996-01-04|1996-02-28|DELIVER IN PERSON|FOB| final requests doubt furiously +11652|1673|97|4|24|37792.08|0.02|0.02|N|O|1996-02-28|1996-01-30|1996-03-07|COLLECT COD|AIR|y about the s +11652|1641|65|5|10|15426.40|0.07|0.08|N|O|1996-01-26|1996-01-13|1996-02-20|TAKE BACK RETURN|REG AIR|blithely express as +11652|1857|1|6|8|14070.80|0.10|0.00|N|O|1996-03-01|1996-01-30|1996-03-13|COLLECT COD|MAIL|an sleep furiously silent Tiresias; bold, s +11652|812|12|7|21|35969.01|0.03|0.07|N|O|1996-02-26|1996-01-22|1996-03-18|DELIVER IN PERSON|SHIP|quickly regular packages haggle. frays h +11653|363|92|1|18|22740.48|0.01|0.01|N|O|1997-09-30|1997-08-24|1997-10-05|DELIVER IN PERSON|FOB|. carefully pending +11653|455|43|2|25|33886.25|0.07|0.01|N|O|1997-09-27|1997-09-25|1997-10-26|TAKE BACK RETURN|TRUCK| even packages. reg +11653|1914|59|3|27|49029.57|0.01|0.04|N|O|1997-10-26|1997-08-18|1997-11-17|TAKE BACK RETURN|AIR|regular packages. pending pa +11653|1784|27|4|42|70802.76|0.10|0.01|N|O|1997-07-30|1997-09-18|1997-08-20|DELIVER IN PERSON|MAIL|ar, regular ideas integrate quickly +11653|159|60|5|22|23301.30|0.07|0.00|N|O|1997-09-01|1997-08-31|1997-09-18|COLLECT COD|AIR|pendencies. blithely even pa +11654|746|43|1|47|77396.78|0.06|0.02|R|F|1993-11-29|1993-12-23|1993-12-15|COLLECT COD|MAIL|sleep blithely against the furiously ironi +11654|1178|87|2|39|42087.63|0.03|0.00|A|F|1993-11-29|1993-12-01|1993-12-22|NONE|FOB|ts integrate blithely. even, enticing inst +11655|1353|92|1|32|40139.20|0.04|0.04|N|O|1998-08-11|1998-09-25|1998-09-02|TAKE BACK RETURN|SHIP|g to the slyly ironic requests. +11655|1741|68|2|49|80494.26|0.06|0.07|N|O|1998-07-04|1998-09-20|1998-07-06|COLLECT COD|SHIP|nal courts. s +11655|499|87|3|46|64376.54|0.01|0.00|N|O|1998-10-10|1998-09-01|1998-10-21|DELIVER IN PERSON|MAIL|ges. blithely even accounts sleep furiou +11680|244|26|1|27|30894.48|0.00|0.01|A|F|1994-11-10|1994-11-05|1994-11-12|TAKE BACK RETURN|SHIP|ounts haggle blithely +11680|269|24|2|35|40924.10|0.09|0.01|R|F|1994-09-17|1994-11-29|1994-09-25|NONE|MAIL|ly pending gifts sleep carefully +11680|1690|14|3|43|68442.67|0.06|0.01|R|F|1994-11-05|1994-11-16|1994-11-25|COLLECT COD|MAIL|integrate furiously. special instruct +11680|850|84|4|49|85791.65|0.02|0.08|R|F|1994-11-05|1994-11-05|1994-11-20|TAKE BACK RETURN|REG AIR| carefully express, spec +11680|202|30|5|24|26452.80|0.01|0.00|R|F|1994-09-08|1994-11-11|1994-09-09|NONE|TRUCK|silent depo +11680|150|77|6|26|27303.90|0.10|0.01|R|F|1994-10-22|1994-11-02|1994-11-02|NONE|MAIL|uickly above the slyly pending +11680|692|24|7|9|14334.21|0.09|0.02|R|F|1994-12-20|1994-11-29|1995-01-19|DELIVER IN PERSON|AIR|ently ironic grouches after the +11681|230|85|1|28|31646.44|0.07|0.02|A|F|1993-02-15|1992-12-11|1993-03-04|TAKE BACK RETURN|REG AIR| carefully carefully ruth +11681|1236|11|2|37|42077.51|0.06|0.06|A|F|1992-12-29|1992-12-11|1993-01-27|TAKE BACK RETURN|RAIL|y ironic ideas. slyly ironic re +11681|10|11|3|31|28210.31|0.09|0.01|A|F|1993-01-26|1992-12-18|1993-02-07|NONE|AIR|uffily. ideas kin +11681|1920|21|4|30|54657.60|0.02|0.06|A|F|1993-01-12|1992-11-24|1993-02-09|NONE|RAIL|. theodolites across the even packages are +11681|1997|30|5|47|89252.53|0.02|0.05|A|F|1993-01-27|1992-12-13|1993-01-29|COLLECT COD|TRUCK|ly even depths. furious +11682|317|46|1|13|15825.03|0.06|0.06|R|F|1993-10-04|1993-08-06|1993-10-11|NONE|REG AIR|lyly among the pending platelets. +11682|689|21|2|35|55638.80|0.05|0.08|R|F|1993-11-01|1993-09-07|1993-11-04|TAKE BACK RETURN|RAIL|ly even foxes +11682|1772|15|3|46|76993.42|0.02|0.07|R|F|1993-08-06|1993-10-03|1993-08-28|COLLECT COD|AIR|arefully unusual or +11683|1626|50|1|31|47356.22|0.00|0.01|R|F|1992-05-04|1992-04-01|1992-06-03|NONE|MAIL|y regular requests. foxes eat fu +11683|1794|79|2|18|30524.22|0.08|0.04|A|F|1992-03-15|1992-03-28|1992-03-19|NONE|TRUCK|nstructions. blithely even accounts cajole +11683|1120|21|3|38|38802.56|0.04|0.07|A|F|1992-05-29|1992-03-17|1992-06-19|NONE|MAIL|totes use slyly carefully bold pa +11683|1988|89|4|1|1889.98|0.08|0.05|R|F|1992-03-17|1992-03-31|1992-03-29|DELIVER IN PERSON|FOB|beans are furiously blithe platele +11683|1225|100|5|7|7883.54|0.09|0.02|A|F|1992-06-01|1992-03-26|1992-06-25|NONE|AIR| requests. slyly u +11683|1717|44|6|8|12949.68|0.03|0.03|R|F|1992-05-27|1992-03-20|1992-06-12|NONE|SHIP|l dolphins: quickly even packa +11683|1248|49|7|40|45969.60|0.08|0.05|A|F|1992-03-02|1992-03-11|1992-04-01|COLLECT COD|MAIL|ooze alongsi +11684|616|48|1|48|72797.28|0.03|0.02|A|F|1992-11-15|1992-10-05|1992-11-25|COLLECT COD|TRUCK|ld pinto beans. carefully d +11684|1913|58|2|30|54447.30|0.07|0.03|R|F|1992-10-10|1992-09-09|1992-10-19|TAKE BACK RETURN|TRUCK|ckly. blithe +11684|1438|17|3|27|36164.61|0.02|0.04|R|F|1992-09-03|1992-09-15|1992-10-02|DELIVER IN PERSON|MAIL|ironic pinto beans-- sly depos +11684|1704|89|4|49|78679.30|0.08|0.05|R|F|1992-08-24|1992-09-08|1992-09-02|NONE|FOB|yly across the furiously pending +11684|1902|47|5|25|45097.50|0.01|0.01|A|F|1992-10-20|1992-10-19|1992-11-09|DELIVER IN PERSON|AIR|e theodolites. foxes solve carefu +11685|642|43|1|19|29310.16|0.08|0.04|N|O|1997-04-02|1997-04-22|1997-05-01|NONE|AIR|ly bold platele +11685|1463|81|2|16|21831.36|0.04|0.02|N|O|1997-06-24|1997-05-28|1997-06-28|TAKE BACK RETURN|RAIL|sits haggle +11685|71|47|3|7|6797.49|0.06|0.07|N|O|1997-04-01|1997-04-30|1997-04-05|NONE|FOB| to the flu +11685|364|49|4|19|24022.84|0.01|0.07|N|O|1997-06-13|1997-04-23|1997-07-04|COLLECT COD|FOB|ests. carefully regular requests among +11685|501|92|5|36|50454.00|0.01|0.00|N|O|1997-07-10|1997-05-26|1997-08-07|DELIVER IN PERSON|FOB|regular platelets. asymp +11685|1194|95|6|30|32855.70|0.03|0.06|N|O|1997-04-05|1997-06-13|1997-04-12|DELIVER IN PERSON|AIR|ily ironic theod +11685|1930|31|7|50|91596.50|0.06|0.04|N|O|1997-04-23|1997-06-05|1997-05-20|DELIVER IN PERSON|REG AIR|nts. furiously final d +11686|900|100|1|36|64832.40|0.10|0.01|A|F|1994-03-28|1994-04-04|1994-04-02|COLLECT COD|FOB|ts cajole. carefully +11686|498|28|2|5|6992.45|0.01|0.04|R|F|1994-04-18|1994-04-05|1994-05-12|TAKE BACK RETURN|SHIP|nding pinto beans h +11686|1289|90|3|50|59514.00|0.04|0.01|A|F|1994-02-06|1994-03-12|1994-02-14|DELIVER IN PERSON|RAIL|he final theodolite +11686|1401|2|4|37|48188.80|0.07|0.01|R|F|1994-03-09|1994-04-18|1994-04-07|DELIVER IN PERSON|MAIL|ully along +11687|235|17|1|23|26110.29|0.07|0.00|N|O|1996-02-22|1996-02-04|1996-02-28|NONE|FOB| are slyly bold ideas. +11687|134|35|2|18|18614.34|0.10|0.07|N|O|1996-04-04|1996-02-29|1996-05-03|NONE|REG AIR|he slyly regular accounts. final requests +11687|1628|52|3|23|35181.26|0.02|0.08|N|O|1996-02-28|1996-02-06|1996-03-22|DELIVER IN PERSON|RAIL|al instructions +11687|1807|8|4|32|54681.60|0.08|0.01|N|O|1996-01-09|1996-03-08|1996-01-20|NONE|AIR|uses detect slyly. slyly even accou +11687|1879|9|5|28|49864.36|0.00|0.05|N|O|1996-01-05|1996-02-21|1996-01-10|TAKE BACK RETURN|TRUCK|nts cajole +11712|1526|27|1|19|27122.88|0.10|0.04|A|F|1994-06-23|1994-07-24|1994-07-01|NONE|MAIL|y final reque +11712|1787|30|2|36|60796.08|0.07|0.05|R|F|1994-05-14|1994-07-09|1994-05-15|COLLECT COD|TRUCK|dolites. furiously +11712|1343|82|3|26|32352.84|0.03|0.04|R|F|1994-08-23|1994-06-26|1994-09-22|NONE|AIR|ounts are. slyly quick theodolites ough +11713|1356|95|1|17|21374.95|0.10|0.08|R|F|1994-03-11|1994-02-07|1994-03-28|COLLECT COD|MAIL|kages. carefully ironic reques +11713|426|27|2|33|43771.86|0.04|0.03|A|F|1994-03-11|1994-02-09|1994-03-21|NONE|TRUCK|gle fluffily quickly c +11713|1231|32|3|46|52082.58|0.09|0.06|A|F|1994-04-07|1994-03-08|1994-04-08|DELIVER IN PERSON|TRUCK|ly final foxes sleep fl +11713|1848|92|4|6|10499.04|0.10|0.07|A|F|1994-03-19|1994-02-20|1994-04-05|COLLECT COD|REG AIR|mong the even instructions wake f +11714|1437|77|1|24|32122.32|0.09|0.02|A|F|1994-10-20|1994-10-27|1994-11-14|DELIVER IN PERSON|FOB|ily blithely unusual deposits. quietly reg +11714|942|77|2|20|36858.80|0.01|0.05|A|F|1994-11-20|1994-10-29|1994-11-24|DELIVER IN PERSON|FOB|g after the pending reques +11714|1021|57|3|46|42412.92|0.09|0.06|A|F|1994-08-29|1994-09-13|1994-09-04|TAKE BACK RETURN|TRUCK|ites wake sometim +11714|1161|62|4|23|24429.68|0.07|0.08|A|F|1994-11-11|1994-10-29|1994-12-08|DELIVER IN PERSON|AIR|r ideas. furious pinto beans wake slyl +11714|991|94|5|17|32163.83|0.08|0.04|R|F|1994-11-05|1994-09-05|1994-11-11|TAKE BACK RETURN|RAIL| ideas should haggle furiously +11714|59|10|6|6|5754.30|0.00|0.01|A|F|1994-11-01|1994-10-27|1994-11-14|DELIVER IN PERSON|SHIP|requests. ironic, even requests +11715|910|11|1|7|12676.37|0.08|0.02|R|F|1994-10-02|1994-10-30|1994-10-22|COLLECT COD|RAIL|s. regular, exp +11715|1947|36|2|25|46223.50|0.03|0.05|A|F|1994-10-18|1994-10-30|1994-10-26|TAKE BACK RETURN|TRUCK|etly slyly regular requests +11715|114|93|3|2|2028.22|0.05|0.01|A|F|1994-12-03|1994-11-13|1994-12-19|TAKE BACK RETURN|FOB|. slyly regular depths n +11715|1579|100|4|4|5922.28|0.01|0.05|A|F|1995-01-04|1994-12-05|1995-01-18|DELIVER IN PERSON|REG AIR|ording to the dogged packages. ironic bra +11716|1442|82|1|38|51050.72|0.02|0.03|A|F|1994-02-09|1993-11-28|1994-03-05|TAKE BACK RETURN|MAIL|osits promise closely. slyly b +11716|1802|46|2|41|69855.80|0.09|0.03|R|F|1993-11-11|1993-12-31|1993-11-29|NONE|AIR|t theodolites among the unusu +11716|428|58|3|48|63764.16|0.08|0.05|A|F|1993-11-27|1993-12-09|1993-12-07|NONE|RAIL|ual accounts affix s +11717|1890|91|1|12|21502.68|0.00|0.06|N|O|1998-06-21|1998-05-11|1998-06-25|NONE|AIR| packages play regular, ironic req +11717|1568|89|2|41|60251.96|0.08|0.08|N|O|1998-04-19|1998-05-13|1998-04-30|NONE|AIR|haggle behind the pending, bol +11717|820|54|3|11|18929.02|0.04|0.00|N|O|1998-05-02|1998-06-16|1998-05-07|TAKE BACK RETURN|MAIL|gular ideas use furiously against the +11717|1035|41|4|38|35569.14|0.04|0.04|N|O|1998-03-23|1998-05-11|1998-04-06|DELIVER IN PERSON|SHIP|deposits. quickly +11717|821|88|5|10|17218.20|0.07|0.06|N|O|1998-06-15|1998-05-21|1998-07-07|COLLECT COD|SHIP|egular accounts. furiously bu +11718|766|31|1|20|33335.20|0.00|0.06|A|F|1995-04-12|1995-03-11|1995-05-03|COLLECT COD|MAIL|across the regular in +11719|948|49|1|21|38827.74|0.03|0.01|A|F|1995-04-16|1995-05-07|1995-05-02|NONE|AIR|carefully against the +11719|1792|19|2|44|74526.76|0.06|0.00|R|F|1995-03-27|1995-03-09|1995-04-06|DELIVER IN PERSON|TRUCK|sits are bli +11719|887|88|3|5|8939.40|0.10|0.06|R|F|1995-05-30|1995-03-19|1995-06-06|DELIVER IN PERSON|SHIP|deas detect past t +11719|976|79|4|17|31908.49|0.01|0.03|A|F|1995-02-20|1995-03-29|1995-03-19|COLLECT COD|SHIP| excuses integrate +11719|1593|74|5|40|59783.60|0.02|0.00|A|F|1995-03-29|1995-03-09|1995-04-09|DELIVER IN PERSON|AIR|hs. carefully fluffy +11719|1976|9|6|18|33803.46|0.05|0.02|R|F|1995-03-09|1995-04-11|1995-03-13|TAKE BACK RETURN|SHIP|nt accounts. fluffily sly +11744|828|29|1|28|48406.96|0.06|0.03|N|O|1996-09-12|1996-08-16|1996-09-23|NONE|FOB|eep ironically. slyl +11744|1720|21|2|42|68112.24|0.01|0.02|N|O|1996-08-25|1996-09-01|1996-08-29|TAKE BACK RETURN|SHIP|requests use quickly; blithely express +11744|1524|5|3|50|71276.00|0.07|0.03|N|O|1996-09-21|1996-08-25|1996-10-15|NONE|FOB| regular packages believe above the re +11745|1245|83|1|34|38972.16|0.03|0.01|R|F|1992-08-03|1992-09-29|1992-08-28|NONE|AIR|s wake. regular platelets haggle ag +11745|1534|55|2|35|50243.55|0.02|0.03|R|F|1992-09-13|1992-09-23|1992-09-19|NONE|RAIL| even sheaves! slyly sile +11745|1258|59|3|29|33618.25|0.02|0.00|A|F|1992-10-02|1992-10-14|1992-10-17|COLLECT COD|REG AIR|ns around the carefully final theo +11745|1524|5|4|12|17106.24|0.07|0.08|A|F|1992-09-17|1992-08-28|1992-09-20|COLLECT COD|TRUCK| the ironic, reg +11745|339|40|5|7|8675.31|0.07|0.03|A|F|1992-11-16|1992-08-29|1992-11-26|COLLECT COD|TRUCK|mptotes. acc +11746|1808|9|1|22|37615.60|0.09|0.05|N|O|1998-05-09|1998-07-05|1998-05-12|DELIVER IN PERSON|RAIL|rbits according +11746|162|15|2|6|6372.96|0.04|0.06|N|O|1998-05-27|1998-06-12|1998-06-09|NONE|RAIL|deas. slowly regul +11746|138|39|3|25|25953.25|0.00|0.02|N|O|1998-08-27|1998-06-08|1998-09-01|COLLECT COD|REG AIR|en deposits de +11746|1318|33|4|26|31702.06|0.00|0.02|N|O|1998-08-09|1998-06-30|1998-08-14|COLLECT COD|REG AIR|st across the ir +11746|171|72|5|13|13925.21|0.01|0.02|N|O|1998-06-16|1998-07-14|1998-07-01|DELIVER IN PERSON|RAIL|nusual excu +11746|1143|80|6|36|37589.04|0.00|0.06|N|O|1998-08-16|1998-06-15|1998-08-26|COLLECT COD|REG AIR| the slyly ironic accounts. i +11746|1939|40|7|12|22091.16|0.06|0.07|N|O|1998-07-22|1998-06-20|1998-07-23|DELIVER IN PERSON|RAIL|heodolites haggle slowly +11747|993|96|1|27|51137.73|0.10|0.01|A|F|1993-06-25|1993-04-13|1993-07-16|COLLECT COD|TRUCK|y express requests. regular de +11748|1977|78|1|23|43216.31|0.00|0.00|A|F|1994-07-04|1994-07-30|1994-07-15|COLLECT COD|AIR|its against the +11749|765|62|1|7|11660.32|0.01|0.07|N|O|1998-04-11|1998-05-02|1998-04-15|COLLECT COD|SHIP|ully according to t +11749|1421|61|2|48|63476.16|0.02|0.01|N|O|1998-05-24|1998-05-11|1998-06-20|NONE|TRUCK|packages. deposits slee +11750|1434|74|1|23|30714.89|0.07|0.08|N|O|1997-04-21|1997-04-21|1997-04-25|COLLECT COD|TRUCK|ending excuses. packages hagg +11750|1489|7|2|21|29200.08|0.06|0.06|N|O|1997-06-09|1997-05-18|1997-06-19|DELIVER IN PERSON|TRUCK|ronic dinos cajole +11750|1919|52|3|31|56448.21|0.02|0.02|N|O|1997-06-27|1997-04-08|1997-07-09|TAKE BACK RETURN|AIR|ckages. caref +11750|1088|24|4|1|989.08|0.05|0.08|N|O|1997-04-02|1997-04-14|1997-04-13|DELIVER IN PERSON|SHIP| even dugouts; slyly special i +11751|908|9|1|23|41604.70|0.05|0.00|N|O|1996-07-06|1996-08-19|1996-07-19|COLLECT COD|RAIL| the regular packages thrash ironic, ir +11751|712|77|2|45|72571.95|0.08|0.07|N|O|1996-09-05|1996-07-12|1996-09-07|DELIVER IN PERSON|SHIP|theodolites. carefully even r +11751|542|43|3|5|7212.70|0.06|0.08|N|O|1996-07-09|1996-08-10|1996-08-01|COLLECT COD|AIR|efully express foxes hagg +11751|209|10|4|29|32166.80|0.01|0.01|N|O|1996-06-09|1996-08-19|1996-07-05|TAKE BACK RETURN|REG AIR|gular excuses wak +11776|1809|39|1|50|85540.00|0.07|0.08|A|F|1992-05-26|1992-04-21|1992-05-31|NONE|AIR|kly regular accounts believe account +11776|1024|25|2|5|4625.10|0.10|0.02|A|F|1992-06-05|1992-03-28|1992-06-12|COLLECT COD|MAIL|fully carefully pending +11777|1871|15|1|31|54958.97|0.05|0.08|R|F|1995-03-13|1995-03-16|1995-03-30|NONE|SHIP|grate carefully according to t +11778|1347|48|1|43|53678.62|0.04|0.05|N|O|1997-06-21|1997-05-07|1997-07-02|COLLECT COD|MAIL|tions according to the furiously +11778|1075|76|2|5|4880.35|0.08|0.05|N|O|1997-07-01|1997-06-20|1997-07-15|TAKE BACK RETURN|SHIP|wake carefully regular sauternes. sl +11778|1066|2|3|47|45451.82|0.05|0.02|N|O|1997-05-20|1997-06-05|1997-05-31|DELIVER IN PERSON|TRUCK|accounts. slyly even requests are be +11779|1503|24|1|15|21067.50|0.05|0.08|R|F|1993-10-05|1993-08-06|1993-10-10|NONE|SHIP|about the quickly pend +11779|865|65|2|9|15892.74|0.00|0.03|A|F|1993-10-15|1993-09-27|1993-11-13|COLLECT COD|RAIL|ins are carefull +11779|1710|53|3|27|43516.17|0.03|0.01|R|F|1993-10-25|1993-08-04|1993-11-13|COLLECT COD|RAIL|. fluffily eve +11779|1819|20|4|7|12045.67|0.06|0.03|A|F|1993-10-24|1993-09-21|1993-11-08|NONE|MAIL|y bold excuses sleep sl +11779|207|89|5|50|55360.00|0.06|0.08|R|F|1993-09-30|1993-09-10|1993-10-20|TAKE BACK RETURN|TRUCK|thely bold packages nag carefully q +11779|152|5|6|32|33668.80|0.02|0.06|R|F|1993-08-12|1993-09-23|1993-09-11|TAKE BACK RETURN|REG AIR|r deposits cajole sl +11780|395|52|1|41|53110.99|0.09|0.07|A|F|1993-10-21|1993-12-12|1993-10-30|TAKE BACK RETURN|SHIP| asymptotes. ironic, even ideas engage s +11780|1950|39|2|36|66670.20|0.04|0.02|A|F|1993-12-24|1993-12-11|1994-01-09|DELIVER IN PERSON|RAIL|above the fluffily even a +11780|936|37|3|7|12858.51|0.09|0.05|R|F|1993-10-18|1993-11-28|1993-10-20|DELIVER IN PERSON|TRUCK|longside of the blithely +11781|350|79|1|37|46262.95|0.07|0.01|N|O|1996-06-14|1996-06-27|1996-06-20|TAKE BACK RETURN|MAIL|packages use alongside of +11781|1136|45|2|42|43559.46|0.07|0.05|N|O|1996-04-24|1996-06-02|1996-04-28|NONE|SHIP| deposits wake. slyly regular dependenc +11781|686|80|3|42|66640.56|0.10|0.03|N|O|1996-07-08|1996-07-07|1996-07-17|NONE|TRUCK| express, +11782|1593|34|1|27|40353.93|0.01|0.00|A|F|1992-08-10|1992-09-05|1992-08-20|DELIVER IN PERSON|AIR|above the quickly even pains. bold +11782|1362|77|2|35|44217.60|0.09|0.08|A|F|1992-09-14|1992-09-06|1992-09-21|TAKE BACK RETURN|FOB|s eat slyly according to th +11782|366|67|3|50|63318.00|0.10|0.07|R|F|1992-10-25|1992-10-02|1992-11-07|COLLECT COD|MAIL|even accounts boost slyly de +11782|1283|84|4|17|20132.76|0.07|0.04|R|F|1992-11-20|1992-09-20|1992-12-20|NONE|AIR|ess deposits cajole carefull +11783|596|57|1|3|4489.77|0.03|0.04|N|O|1998-06-12|1998-05-04|1998-06-21|DELIVER IN PERSON|MAIL|es nag. furiously ca +11783|1561|2|2|13|19013.28|0.05|0.02|N|O|1998-07-20|1998-05-23|1998-07-26|DELIVER IN PERSON|SHIP|ly even theodolites are furiously. reg +11808|608|9|1|12|18103.20|0.03|0.08|A|F|1992-11-15|1992-09-17|1992-11-27|TAKE BACK RETURN|RAIL|instructions affix closel +11808|527|88|2|30|42825.60|0.06|0.04|R|F|1992-09-03|1992-10-22|1992-09-20|TAKE BACK RETURN|SHIP|usual requests ha +11809|224|79|1|22|24732.84|0.07|0.07|N|O|1996-07-18|1996-07-18|1996-07-19|DELIVER IN PERSON|FOB|er the special platelets. request +11809|1232|70|2|49|55528.27|0.03|0.03|N|O|1996-05-03|1996-06-15|1996-05-12|COLLECT COD|FOB|lar sauternes. slyly ironic packages ha +11809|1132|33|3|18|18596.34|0.08|0.03|N|O|1996-07-21|1996-07-05|1996-08-10|TAKE BACK RETURN|AIR|ackages use thinly express +11809|1327|66|4|29|35621.28|0.04|0.02|N|O|1996-06-04|1996-06-14|1996-06-18|NONE|MAIL|ely regular asymptotes lose caref +11809|1146|47|5|3|3141.42|0.08|0.03|N|O|1996-08-04|1996-06-23|1996-08-22|TAKE BACK RETURN|SHIP|urts. deposits wake across the ideas. regul +11809|566|57|6|18|26398.08|0.02|0.01|N|O|1996-07-16|1996-06-10|1996-07-23|NONE|SHIP|ly even ideas integr +11810|694|95|1|47|74950.43|0.00|0.03|A|F|1992-08-02|1992-06-20|1992-08-22|NONE|RAIL|final foxes wake blithely regular idea +11811|1056|27|1|8|7656.40|0.09|0.06|A|F|1993-02-07|1992-11-28|1993-02-09|COLLECT COD|RAIL| quickly along the pendin +11812|6|57|1|20|18120.00|0.05|0.00|A|F|1993-09-16|1993-08-23|1993-10-03|COLLECT COD|REG AIR|ounts doze regular +11813|1476|55|1|49|67496.03|0.03|0.05|A|F|1994-05-24|1994-03-21|1994-05-26|COLLECT COD|MAIL|regular dependencies cajole carefu +11813|506|97|2|32|45008.00|0.02|0.04|A|F|1994-03-17|1994-04-27|1994-03-21|DELIVER IN PERSON|FOB|e alongside of the fu +11813|469|28|3|47|64364.62|0.02|0.07|R|F|1994-02-24|1994-04-13|1994-03-21|NONE|TRUCK|es impress quickly sly +11813|310|39|4|25|30257.75|0.02|0.00|R|F|1994-03-30|1994-05-07|1994-04-21|DELIVER IN PERSON|MAIL|side of the ironic, express pin +11814|1152|89|1|9|9478.35|0.08|0.04|R|F|1993-04-25|1993-03-22|1993-04-29|TAKE BACK RETURN|RAIL|al accounts boost slyly alongsid +11814|1836|66|2|46|79940.18|0.09|0.03|A|F|1993-04-09|1993-03-11|1993-04-19|COLLECT COD|RAIL|eposits wake. slyly regular pack +11814|1156|65|3|39|41228.85|0.06|0.03|R|F|1993-05-12|1993-04-02|1993-06-01|NONE|TRUCK|ss pinto beans nod fl +11814|992|95|4|41|77612.59|0.04|0.00|A|F|1993-04-27|1993-03-06|1993-04-30|TAKE BACK RETURN|AIR|d the pinto b +11815|1377|16|1|38|48578.06|0.04|0.03|N|O|1995-10-31|1995-11-25|1995-11-06|COLLECT COD|REG AIR|e above the fluffily pending +11815|404|5|2|28|36523.20|0.02|0.04|N|O|1995-10-22|1995-11-11|1995-10-29|TAKE BACK RETURN|AIR|ns doze ironically pendin +11815|457|45|3|37|50225.65|0.03|0.06|N|O|1995-10-29|1995-10-19|1995-11-05|DELIVER IN PERSON|SHIP|coys are. carefully ironic platelets hag +11815|1376|15|4|33|42153.21|0.02|0.06|N|O|1995-12-01|1995-10-22|1995-12-07|DELIVER IN PERSON|SHIP|uests are fluffily carefully sp +11815|1616|58|5|12|18211.32|0.02|0.04|N|O|1995-11-21|1995-11-19|1995-12-18|DELIVER IN PERSON|REG AIR|silent deposit +11840|414|15|1|27|35489.07|0.01|0.08|A|F|1994-12-02|1994-10-03|1994-12-16|DELIVER IN PERSON|TRUCK|ymptotes. ironic accounts integra +11840|1235|47|2|13|14770.99|0.10|0.05|R|F|1994-12-10|1994-10-27|1994-12-19|COLLECT COD|MAIL|lly regular packages. ruthlessly regu +11840|839|73|3|25|43495.75|0.10|0.01|A|F|1994-08-31|1994-10-08|1994-09-20|NONE|FOB|fluffily even accounts; quickly expr +11840|739|72|4|37|60670.01|0.00|0.06|R|F|1994-09-17|1994-10-15|1994-09-30|DELIVER IN PERSON|FOB|uests. pinto beans sleep regular pinto bea +11840|1872|16|5|41|72728.67|0.06|0.01|R|F|1994-09-14|1994-10-16|1994-10-14|NONE|MAIL|even packages det +11840|862|63|6|33|58174.38|0.04|0.05|A|F|1994-10-23|1994-11-12|1994-11-19|COLLECT COD|RAIL| stealthy accounts wak +11841|169|70|1|22|23521.52|0.01|0.06|R|F|1993-07-28|1993-05-25|1993-08-21|COLLECT COD|MAIL|c pinto bea +11841|1842|43|2|26|45339.84|0.06|0.05|R|F|1993-05-22|1993-06-21|1993-06-02|DELIVER IN PERSON|SHIP|ockey players. furiously even requ +11841|225|53|3|26|29255.72|0.09|0.05|A|F|1993-05-21|1993-06-21|1993-06-12|COLLECT COD|TRUCK|against the fi +11841|841|42|4|22|38320.48|0.06|0.07|A|F|1993-06-30|1993-06-06|1993-07-25|DELIVER IN PERSON|FOB|counts. furiously sp +11841|1859|3|5|4|7043.40|0.03|0.01|A|F|1993-08-01|1993-07-08|1993-08-09|DELIVER IN PERSON|AIR|iously silent the +11841|245|100|6|14|16033.36|0.08|0.03|A|F|1993-05-10|1993-06-18|1993-06-06|COLLECT COD|MAIL|. special theodolites wake blithely +11842|630|24|1|17|26020.71|0.08|0.00|N|O|1996-07-24|1996-06-12|1996-07-27|DELIVER IN PERSON|MAIL|ns sleep permanently blithely +11842|101|54|2|26|26028.60|0.02|0.06|N|O|1996-04-13|1996-05-25|1996-04-22|TAKE BACK RETURN|AIR|y silent excuses affix s +11842|1915|60|3|21|38155.11|0.01|0.04|N|O|1996-04-14|1996-06-05|1996-04-27|NONE|AIR| according to the stealthily special ho +11843|1892|79|1|37|66373.93|0.02|0.02|R|F|1994-11-10|1994-08-21|1994-11-22|NONE|AIR|e slyly final requests: fluffily pending +11843|368|97|2|32|40587.52|0.06|0.02|R|F|1994-07-26|1994-09-09|1994-08-12|NONE|FOB|es must hav +11843|1414|54|3|50|65770.50|0.01|0.01|A|F|1994-07-25|1994-09-15|1994-08-02|NONE|SHIP| cajole above the ironic deposits. bl +11843|1197|98|4|37|40633.03|0.04|0.05|R|F|1994-11-01|1994-10-04|1994-11-04|TAKE BACK RETURN|AIR|nal excuses. slyly special instruct +11844|481|69|1|5|6907.40|0.06|0.07|N|O|1997-04-06|1997-03-27|1997-04-24|NONE|AIR|odolites sl +11844|43|94|2|38|35835.52|0.09|0.08|N|O|1997-04-03|1997-02-27|1997-04-05|TAKE BACK RETURN|AIR|gainst the ide +11844|1967|12|3|23|42986.08|0.06|0.08|N|O|1997-02-04|1997-03-19|1997-02-28|TAKE BACK RETURN|RAIL|y regular dependenc +11844|27|28|4|1|927.02|0.03|0.08|N|O|1997-01-21|1997-03-13|1997-02-17|NONE|AIR|ending deposits wake theodolites. express +11845|1523|4|1|5|7122.60|0.10|0.05|N|O|1997-05-29|1997-06-18|1997-06-03|NONE|MAIL|ding courts from the careful, +11845|643|6|2|30|46309.20|0.04|0.01|N|O|1997-07-18|1997-05-17|1997-08-07|COLLECT COD|REG AIR|ecial deposits. slyly final platele +11845|117|18|3|48|48821.28|0.05|0.08|N|O|1997-05-21|1997-06-25|1997-06-13|DELIVER IN PERSON|REG AIR|d packages sleep +11845|1882|26|4|13|23190.44|0.03|0.05|N|O|1997-06-14|1997-05-26|1997-07-05|TAKE BACK RETURN|TRUCK|efully across the quickly even theodolite +11846|1426|44|1|15|19911.30|0.04|0.03|A|F|1993-07-01|1993-07-06|1993-07-10|COLLECT COD|REG AIR| final instructions. sl +11846|859|59|2|17|29917.45|0.10|0.02|A|F|1993-07-22|1993-06-29|1993-08-08|TAKE BACK RETURN|SHIP|inal foxes run furiously. pi +11846|1429|8|3|2|2660.84|0.04|0.00|R|F|1993-05-22|1993-07-16|1993-06-01|NONE|TRUCK|ecial accounts. +11846|1756|83|4|1|1657.75|0.10|0.08|A|F|1993-07-01|1993-06-23|1993-07-06|COLLECT COD|RAIL|oach above the slyly regula +11847|1109|18|1|19|19191.90|0.05|0.07|N|O|1997-11-10|1997-11-02|1997-12-06|COLLECT COD|FOB|lyly careful pinto beans are a +11847|177|4|2|14|15080.38|0.02|0.00|N|O|1997-12-20|1997-12-02|1998-01-08|TAKE BACK RETURN|MAIL| ironic deposits. blithe +11847|333|34|3|10|12333.30|0.08|0.00|N|O|1997-10-31|1997-11-23|1997-11-30|TAKE BACK RETURN|FOB|final, ironic +11847|1669|11|4|5|7853.30|0.04|0.05|N|O|1997-12-31|1997-12-25|1998-01-14|NONE|MAIL|fully among the express dependencies. +11847|491|92|5|4|5565.96|0.10|0.05|N|O|1997-10-14|1997-11-23|1997-11-04|NONE|MAIL|egular foxes. carefu +11847|494|95|6|26|36256.74|0.07|0.06|N|O|1997-12-15|1997-11-07|1997-12-23|TAKE BACK RETURN|AIR|efully regular deposits. carefully iron +11872|975|44|1|43|80666.71|0.07|0.01|A|F|1994-10-29|1994-10-07|1994-11-17|COLLECT COD|MAIL|pecial depo +11873|697|60|1|14|22367.66|0.07|0.01|N|O|1996-06-23|1996-07-05|1996-07-20|COLLECT COD|FOB|er. regular foxes above the platele +11874|1335|74|1|50|61816.50|0.09|0.00|R|F|1992-12-02|1992-10-10|1992-12-15|COLLECT COD|REG AIR|mptotes. pending requests +11874|1062|98|2|20|19261.20|0.03|0.05|A|F|1992-12-17|1992-10-29|1992-12-19|NONE|FOB|esias. slyly pending requests are accord +11874|100|26|3|29|29002.90|0.02|0.07|R|F|1992-11-11|1992-11-05|1992-11-17|COLLECT COD|TRUCK|eep blithely quickly special +11874|1070|6|4|15|14566.05|0.05|0.08|R|F|1992-10-24|1992-10-22|1992-11-22|COLLECT COD|RAIL|ole ironic instructions +11874|492|51|5|44|61269.56|0.02|0.00|A|F|1992-12-19|1992-10-28|1993-01-01|DELIVER IN PERSON|TRUCK| slyly regular accounts. unusual pinto +11874|453|54|6|9|12181.05|0.10|0.03|A|F|1992-10-12|1992-12-02|1992-10-31|COLLECT COD|REG AIR|the pending, +11874|1071|77|7|32|31106.24|0.08|0.01|R|F|1992-12-25|1992-12-07|1993-01-15|DELIVER IN PERSON|RAIL|he carefull +11875|683|77|1|40|63347.20|0.04|0.05|R|F|1992-11-11|1992-10-27|1992-12-03|COLLECT COD|MAIL|olphins sleep slyl +11875|225|80|2|30|33756.60|0.05|0.03|R|F|1992-09-08|1992-10-23|1992-10-08|TAKE BACK RETURN|RAIL|egular packages; +11875|711|12|3|1|1611.71|0.01|0.07|A|F|1992-10-06|1992-10-05|1992-10-09|COLLECT COD|RAIL|ve the idly express deposits. +11876|273|55|1|14|16425.78|0.05|0.06|N|O|1995-09-25|1995-08-10|1995-10-04|NONE|FOB|its sleep blithely regular requests. i +11876|77|3|2|3|2931.21|0.00|0.06|N|O|1995-09-07|1995-08-06|1995-09-23|DELIVER IN PERSON|REG AIR|ainst the blithely final +11876|835|35|3|8|13886.64|0.01|0.04|N|O|1995-10-20|1995-09-23|1995-10-27|COLLECT COD|MAIL|ly ruthless accounts; blithely final mul +11876|1024|25|4|34|31450.68|0.09|0.07|N|O|1995-10-29|1995-09-21|1995-11-17|NONE|FOB|r requests detect furiously +11876|1598|19|5|2|2999.18|0.00|0.07|N|O|1995-10-12|1995-09-19|1995-11-04|DELIVER IN PERSON|AIR|heaves-- slyly fluffy deposits sleep +11876|1725|52|6|43|69948.96|0.10|0.00|N|O|1995-10-09|1995-08-04|1995-10-12|DELIVER IN PERSON|AIR|y ironic packages use slyly across t +11877|900|34|1|4|7203.60|0.10|0.01|R|F|1993-06-19|1993-07-08|1993-07-18|COLLECT COD|TRUCK|. special +11877|1643|26|2|4|6178.56|0.00|0.03|R|F|1993-06-12|1993-08-11|1993-06-17|DELIVER IN PERSON|SHIP|ly unusual excuses. special packages boost +11877|1755|40|3|50|82837.50|0.07|0.07|R|F|1993-08-31|1993-07-01|1993-09-23|TAKE BACK RETURN|MAIL|ly final requests +11877|76|77|4|22|21473.54|0.03|0.00|A|F|1993-05-29|1993-07-24|1993-06-09|TAKE BACK RETURN|FOB|ress deposits use eve +11877|1343|44|5|5|6221.70|0.04|0.04|R|F|1993-09-03|1993-08-01|1993-09-19|COLLECT COD|MAIL|to the ironic accounts. slyly pending pack +11878|1342|19|1|50|62167.00|0.06|0.00|A|F|1993-05-26|1993-05-22|1993-06-14|TAKE BACK RETURN|AIR|ns among the ironi +11878|311|96|2|29|35127.99|0.08|0.04|R|F|1993-03-29|1993-03-31|1993-04-04|COLLECT COD|REG AIR|inal accounts boost furiously dep +11879|684|78|1|41|64971.88|0.04|0.07|A|F|1993-07-26|1993-09-10|1993-08-20|TAKE BACK RETURN|TRUCK|t the silent dolphins. carefully pendin +11879|1711|38|2|14|22577.94|0.03|0.06|A|F|1993-10-05|1993-08-24|1993-10-29|COLLECT COD|AIR|quickly final requests. ironic packages +11879|498|57|3|31|43353.19|0.06|0.05|R|F|1993-07-13|1993-09-13|1993-08-03|COLLECT COD|MAIL| carefully slyly even pinto beans. even +11879|1091|62|4|32|31746.88|0.02|0.03|R|F|1993-09-09|1993-09-02|1993-09-14|TAKE BACK RETURN|FOB|engage furiou +11879|6|32|5|22|19932.00|0.02|0.04|R|F|1993-10-13|1993-09-15|1993-10-24|DELIVER IN PERSON|TRUCK|usly along the final, even acc +11904|170|71|1|45|48157.65|0.08|0.06|N|O|1998-01-29|1998-02-07|1998-02-06|DELIVER IN PERSON|MAIL|theodolites haggle busy accounts. +11904|1652|76|2|27|41948.55|0.00|0.02|N|O|1997-12-09|1998-01-28|1998-01-08|DELIVER IN PERSON|FOB| special, even attainments cajole slyly fl +11904|1213|51|3|3|3342.63|0.08|0.07|N|O|1998-03-21|1998-01-08|1998-04-09|COLLECT COD|SHIP|ly fluffily final excuses. always daring +11904|1878|65|4|27|48056.49|0.06|0.03|N|O|1998-03-18|1998-02-17|1998-03-21|COLLECT COD|MAIL|uctions. furiou +11904|497|56|5|28|39129.72|0.02|0.07|N|O|1998-02-09|1998-01-02|1998-02-26|TAKE BACK RETURN|RAIL|t pains are above the ironic packages +11904|870|4|6|21|37188.27|0.07|0.02|N|O|1998-03-31|1998-02-01|1998-04-28|COLLECT COD|REG AIR| integrate carefully ac +11904|1553|94|7|44|64000.20|0.08|0.08|N|O|1998-01-15|1998-02-11|1998-01-19|NONE|AIR|s use unusual instructions. furious +11905|1227|65|1|27|30461.94|0.05|0.01|N|O|1997-08-19|1997-08-11|1997-09-17|NONE|TRUCK|uctions breach quickly acc +11905|391|76|2|18|23245.02|0.01|0.00|N|O|1997-08-30|1997-09-13|1997-09-08|TAKE BACK RETURN|MAIL|pending theodolites nag +11905|1168|5|3|43|45973.88|0.05|0.08|N|O|1997-10-06|1997-08-04|1997-10-22|COLLECT COD|MAIL|sleep carefully. fluffily regular pla +11905|308|93|4|2|2416.60|0.04|0.03|N|O|1997-08-28|1997-09-05|1997-09-25|DELIVER IN PERSON|SHIP|lithely ironi +11906|56|32|1|41|39198.05|0.07|0.07|N|O|1997-01-08|1997-01-21|1997-01-17|DELIVER IN PERSON|SHIP| sentiments detect along the careful +11906|913|82|2|39|70742.49|0.03|0.03|N|O|1996-12-21|1997-02-28|1997-01-11|TAKE BACK RETURN|REG AIR|ly ironic pinto beans nag q +11906|1280|55|3|35|41344.80|0.09|0.00|N|O|1997-01-14|1997-02-08|1997-01-24|TAKE BACK RETURN|TRUCK| carefully final asympt +11906|1601|84|4|45|67617.00|0.10|0.00|N|O|1997-02-14|1997-02-21|1997-02-21|DELIVER IN PERSON|MAIL|. furiously unusual acc +11906|421|22|5|33|43606.86|0.01|0.02|N|O|1997-03-10|1997-02-12|1997-04-09|COLLECT COD|MAIL|efully according t +11906|987|56|6|39|73631.22|0.04|0.03|N|O|1997-01-07|1997-02-09|1997-01-12|NONE|RAIL|y across the +11907|1267|5|1|26|30374.76|0.02|0.07|A|F|1993-12-11|1993-11-09|1993-12-28|DELIVER IN PERSON|TRUCK|s. furious dolphins could +11907|1101|74|2|35|35073.50|0.10|0.01|R|F|1993-10-23|1993-10-01|1993-11-01|COLLECT COD|MAIL|he carefully iron +11907|195|48|3|32|35046.08|0.03|0.08|R|F|1993-12-18|1993-10-16|1993-12-19|COLLECT COD|REG AIR|sleep quickly around the quickly final ac +11907|1302|79|4|24|28879.20|0.08|0.03|A|F|1993-09-03|1993-11-02|1993-09-05|DELIVER IN PERSON|REG AIR|oost. furiously ironic gifts prin +11908|876|10|1|29|51529.23|0.03|0.05|R|F|1993-07-02|1993-08-12|1993-07-27|NONE|REG AIR|arefully blithely special asymptot +11908|755|52|2|13|21524.75|0.08|0.02|A|F|1993-08-31|1993-08-19|1993-09-19|NONE|FOB|ajole along the carefully ironic requests. +11908|680|43|3|30|47420.40|0.02|0.00|A|F|1993-06-19|1993-07-18|1993-06-26|TAKE BACK RETURN|REG AIR|ructions cajole furiously blith +11908|1962|95|4|3|5591.88|0.06|0.07|R|F|1993-06-10|1993-08-13|1993-06-18|NONE|REG AIR|e thinly at the ideas. slyly unusual th +11908|1720|21|5|12|19460.64|0.10|0.08|R|F|1993-07-22|1993-07-01|1993-08-21|NONE|MAIL| requests ar +11908|1210|22|6|35|38892.35|0.08|0.02|A|F|1993-08-22|1993-07-15|1993-09-17|DELIVER IN PERSON|TRUCK| quickly unusual +11909|1593|14|1|8|11956.72|0.07|0.00|R|F|1995-03-01|1995-01-15|1995-03-16|DELIVER IN PERSON|SHIP|bout the slyly final platelets. blithel +11909|796|29|2|20|33935.80|0.07|0.05|A|F|1995-02-10|1995-01-17|1995-02-21|COLLECT COD|FOB|s the furiously ironic re +11909|1899|43|3|4|7203.56|0.01|0.03|R|F|1994-12-08|1995-02-12|1994-12-12|NONE|AIR|nstructions. closely iro +11910|969|38|1|16|29919.36|0.10|0.06|N|O|1995-08-07|1995-09-05|1995-08-27|NONE|AIR|le according to the ironic hockey play +11910|1447|26|2|11|14832.84|0.05|0.05|N|O|1995-07-20|1995-08-09|1995-07-28|NONE|TRUCK|. slyly express platelets det +11910|851|85|3|28|49051.80|0.06|0.08|N|O|1995-09-19|1995-08-25|1995-10-16|NONE|FOB| special instruction +11910|1996|85|4|5|9489.95|0.05|0.02|N|O|1995-08-14|1995-08-23|1995-08-24|DELIVER IN PERSON|TRUCK|lites along the accounts wake blithely +11911|568|99|1|33|48462.48|0.02|0.02|R|F|1994-03-11|1994-02-04|1994-04-01|DELIVER IN PERSON|TRUCK|rets-- slyly final packages boost fluffil +11911|1594|35|2|47|70292.73|0.05|0.05|R|F|1994-02-19|1994-01-04|1994-03-12|NONE|SHIP|asymptotes sle +11911|706|7|3|16|25707.20|0.05|0.08|A|F|1994-01-03|1994-01-27|1994-01-07|NONE|REG AIR|ts hang bli +11911|1084|55|4|43|42358.44|0.06|0.06|A|F|1994-01-03|1994-01-25|1994-01-18|DELIVER IN PERSON|AIR|about the express, bold pinto be +11911|483|42|5|25|34587.00|0.07|0.00|R|F|1993-11-21|1993-12-13|1993-12-04|NONE|TRUCK|deas cajole ironic, final acco +11936|988|57|1|13|24556.74|0.10|0.03|N|O|1995-11-10|1995-11-04|1995-12-06|COLLECT COD|TRUCK|uriously even +11936|849|50|2|5|8749.20|0.08|0.06|N|O|1996-01-05|1995-10-25|1996-01-22|DELIVER IN PERSON|AIR|the ironic instructions. quickly i +11936|718|83|3|21|33992.91|0.03|0.07|N|O|1995-10-16|1995-10-31|1995-11-08|COLLECT COD|REG AIR|pending, even asymptot +11936|342|99|4|5|6211.70|0.05|0.04|N|O|1995-10-22|1995-11-22|1995-11-17|DELIVER IN PERSON|MAIL|nusual dependencies. +11936|201|56|5|33|36339.60|0.10|0.01|N|O|1995-10-05|1995-12-01|1995-10-16|COLLECT COD|REG AIR|iously quickly express +11936|524|25|6|42|59829.84|0.02|0.06|N|O|1995-11-28|1995-11-19|1995-12-16|COLLECT COD|RAIL|e. careful +11937|1238|39|1|6|6835.38|0.07|0.00|N|O|1998-10-24|1998-09-19|1998-11-08|COLLECT COD|TRUCK|neath the ironic excuses. slyly +11937|293|94|2|21|25059.09|0.03|0.04|N|O|1998-08-26|1998-09-17|1998-09-21|NONE|FOB|lyly. fluffily final foxes play to the care +11937|421|51|3|10|13214.20|0.05|0.04|N|O|1998-10-07|1998-08-06|1998-11-06|COLLECT COD|AIR|re fluffily sp +11937|235|63|4|32|36327.36|0.09|0.07|N|O|1998-08-18|1998-09-06|1998-08-30|DELIVER IN PERSON|AIR|quietly bold depe +11937|486|87|5|19|26343.12|0.10|0.03|N|O|1998-08-04|1998-09-22|1998-08-08|DELIVER IN PERSON|RAIL|lites wake. fina +11937|730|31|6|18|29353.14|0.00|0.00|N|O|1998-07-26|1998-09-06|1998-07-30|NONE|FOB|al deposits. final attainments affi +11937|632|26|7|18|27587.34|0.08|0.01|N|O|1998-09-22|1998-08-30|1998-10-15|NONE|REG AIR|e slyly carefully fi +11938|1101|74|1|40|40084.00|0.01|0.05|N|O|1998-08-22|1998-10-18|1998-08-28|COLLECT COD|TRUCK|lay after the silent, ironic ideas. unus +11938|646|78|2|48|74238.72|0.09|0.07|N|O|1998-08-25|1998-10-23|1998-09-02|TAKE BACK RETURN|AIR|hely until the sl +11938|123|24|3|19|19439.28|0.06|0.03|N|O|1998-10-29|1998-08-29|1998-11-14|NONE|MAIL| accounts. +11938|9|10|4|33|29997.00|0.08|0.03|N|O|1998-11-14|1998-09-22|1998-11-20|COLLECT COD|REG AIR|quickly even accounts affix fur +11939|415|74|1|46|60508.86|0.03|0.01|N|O|1996-12-12|1996-11-14|1996-12-14|TAKE BACK RETURN|FOB| boost alongside of the carefu +11939|309|94|2|22|26604.60|0.07|0.03|N|O|1996-12-11|1996-12-23|1996-12-30|DELIVER IN PERSON|REG AIR|dazzle. furiously +11940|734|31|1|9|14712.57|0.01|0.08|N|O|1998-07-16|1998-08-04|1998-08-12|COLLECT COD|TRUCK| cajole furio +11940|1304|81|2|11|13258.30|0.09|0.00|N|O|1998-08-29|1998-08-14|1998-09-27|NONE|SHIP|uickly carefully even +11940|1144|17|3|42|43895.88|0.00|0.00|N|O|1998-07-14|1998-07-04|1998-07-26|TAKE BACK RETURN|FOB|uriously against the regular, unusual ideas +11940|1701|28|4|7|11218.90|0.02|0.03|N|O|1998-09-15|1998-08-19|1998-10-10|NONE|TRUCK| accounts cajole blithel +11940|336|93|5|20|24726.60|0.04|0.04|N|O|1998-06-10|1998-08-25|1998-06-21|NONE|TRUCK|s sleep qu +11940|1265|40|6|36|41985.36|0.00|0.00|N|O|1998-08-30|1998-07-06|1998-09-09|TAKE BACK RETURN|REG AIR|lar, final +11941|451|81|1|11|14865.95|0.00|0.05|A|F|1993-07-16|1993-08-01|1993-07-19|NONE|SHIP|al deposits poach. quickly express +11941|204|32|2|33|36438.60|0.07|0.07|A|F|1993-10-21|1993-08-09|1993-10-26|DELIVER IN PERSON|SHIP|y even realms engage carefully. +11941|150|51|3|34|35705.10|0.08|0.02|A|F|1993-09-23|1993-08-06|1993-09-26|TAKE BACK RETURN|RAIL|unusual dependencies sleep carefully a +11941|1256|31|4|36|41661.00|0.02|0.03|A|F|1993-07-03|1993-07-31|1993-07-21|TAKE BACK RETURN|TRUCK|thely final +11941|1369|70|5|20|25407.20|0.05|0.00|A|F|1993-08-15|1993-08-04|1993-08-18|NONE|AIR|venly regular frets. bold pinto bean +11941|1178|79|6|5|5395.85|0.00|0.08|A|F|1993-08-29|1993-09-08|1993-09-06|NONE|SHIP|. blithely +11942|1258|59|1|36|41733.00|0.01|0.06|A|F|1994-07-04|1994-07-23|1994-07-25|COLLECT COD|REG AIR|s integrate carefully bold, bold ideas. +11943|1022|93|1|46|42458.92|0.07|0.00|R|F|1993-06-08|1993-06-01|1993-06-15|COLLECT COD|SHIP|ly even pinto beans. slyly regul +11943|100|1|2|40|40004.00|0.10|0.04|A|F|1993-04-15|1993-06-18|1993-04-30|NONE|FOB| deposits are pending excuses. furious +11943|318|19|3|50|60915.50|0.00|0.02|R|F|1993-07-23|1993-06-27|1993-07-24|NONE|RAIL|sual asymptotes wake slyly according +11943|924|27|4|33|60222.36|0.09|0.04|A|F|1993-06-24|1993-05-21|1993-07-01|TAKE BACK RETURN|AIR|into beans sleep blit +11943|1940|41|5|9|16577.46|0.04|0.02|R|F|1993-08-06|1993-06-25|1993-08-15|TAKE BACK RETURN|REG AIR|atelets across the careful +11943|1503|84|6|17|23876.50|0.03|0.01|R|F|1993-07-23|1993-06-22|1993-08-13|TAKE BACK RETURN|AIR|ar courts. carefull +11968|453|12|1|15|20301.75|0.06|0.02|A|F|1995-05-19|1995-05-02|1995-06-16|TAKE BACK RETURN|RAIL|ag against the even account +11968|144|45|2|25|26103.50|0.10|0.02|N|F|1995-05-26|1995-06-13|1995-06-22|COLLECT COD|SHIP|sts wake carefully about the close +11969|300|82|1|10|12003.00|0.10|0.04|R|F|1992-01-30|1992-03-01|1992-02-01|COLLECT COD|TRUCK|eans above +11969|1260|98|2|38|44127.88|0.09|0.05|A|F|1992-01-29|1992-03-26|1992-02-10|DELIVER IN PERSON|AIR|yly final hockey players al +11969|955|90|3|37|68670.15|0.04|0.05|R|F|1992-04-24|1992-03-24|1992-04-29|COLLECT COD|FOB|ts. furiously final req +11969|1016|22|4|4|3668.04|0.04|0.05|A|F|1992-02-15|1992-03-27|1992-02-16|COLLECT COD|REG AIR|t the permanently even theodolites sle +11969|1241|42|5|43|49116.32|0.02|0.04|R|F|1992-02-12|1992-04-16|1992-02-21|TAKE BACK RETURN|AIR|he slyly ironic foxe +11969|823|90|6|30|51714.60|0.06|0.07|R|F|1992-04-23|1992-02-19|1992-05-14|COLLECT COD|REG AIR|accounts are after the blithe +11969|1111|84|7|44|44532.84|0.08|0.04|A|F|1992-04-21|1992-03-14|1992-04-24|DELIVER IN PERSON|REG AIR| beans above the carefully express requests +11970|1777|78|1|18|30217.86|0.06|0.00|N|O|1998-06-03|1998-08-20|1998-06-15|DELIVER IN PERSON|SHIP|t the busily regular accounts thrash p +11970|983|52|2|28|52751.44|0.09|0.04|N|O|1998-08-20|1998-07-30|1998-09-08|TAKE BACK RETURN|MAIL|eposits. blithely pending a +11970|199|78|3|17|18686.23|0.02|0.07|N|O|1998-09-05|1998-07-11|1998-09-22|COLLECT COD|MAIL|uickly. carefully unusual asymptotes sle +11970|1801|2|4|21|35758.80|0.01|0.00|N|O|1998-06-12|1998-07-06|1998-06-15|TAKE BACK RETURN|AIR|ake furiously. slyly regula +11970|1366|81|5|48|60833.28|0.00|0.05|N|O|1998-07-28|1998-07-21|1998-08-18|COLLECT COD|REG AIR|e accounts are busily above the +11970|463|22|6|41|55901.86|0.03|0.08|N|O|1998-06-04|1998-07-13|1998-06-08|TAKE BACK RETURN|FOB|y along th +11971|1167|68|1|5|5340.80|0.03|0.08|N|O|1997-04-12|1997-05-15|1997-05-05|NONE|MAIL|ic requests. slyly unusual i +11971|94|20|2|5|4970.45|0.08|0.05|N|O|1997-04-01|1997-06-04|1997-04-23|COLLECT COD|FOB|y furiously ironi +11971|909|44|3|36|65156.40|0.05|0.00|N|O|1997-05-05|1997-06-10|1997-05-27|DELIVER IN PERSON|FOB|yly across the slyly daring foxes-- slyly +11971|447|48|4|34|45812.96|0.00|0.03|N|O|1997-04-03|1997-05-16|1997-05-01|TAKE BACK RETURN|MAIL|out the quickly special accounts ca +11972|1931|32|1|10|18329.30|0.02|0.03|R|F|1994-03-13|1994-02-22|1994-04-08|DELIVER IN PERSON|REG AIR|refully bold instru +11972|1413|14|2|38|49947.58|0.02|0.02|R|F|1994-03-24|1994-02-23|1994-04-19|DELIVER IN PERSON|RAIL|gular sentiments boost. quic +11972|172|99|3|38|40742.46|0.02|0.00|A|F|1994-03-26|1994-02-07|1994-04-05|COLLECT COD|REG AIR| accounts det +11972|1798|25|4|20|33995.80|0.02|0.01|A|F|1994-02-10|1994-02-03|1994-03-04|DELIVER IN PERSON|FOB|sts cajole idly regular reques +11972|206|7|5|5|5531.00|0.01|0.03|A|F|1994-03-15|1994-03-19|1994-04-11|DELIVER IN PERSON|REG AIR|ash across the ca +11973|184|85|1|2|2168.36|0.10|0.07|R|F|1994-04-05|1994-04-21|1994-05-04|NONE|FOB|y requests. regular, express theo +11973|966|69|2|45|84013.20|0.05|0.02|R|F|1994-06-16|1994-05-28|1994-06-26|TAKE BACK RETURN|REG AIR|endencies try +11973|1389|4|3|15|19355.70|0.08|0.07|A|F|1994-03-05|1994-04-06|1994-03-07|NONE|TRUCK|arefully after the +11973|134|87|4|11|11375.43|0.09|0.06|A|F|1994-04-23|1994-04-04|1994-05-20|DELIVER IN PERSON|SHIP| silent deposit +11973|59|35|5|1|959.05|0.05|0.01|R|F|1994-03-31|1994-04-08|1994-04-11|NONE|RAIL|unts. carefully regular acco +11973|1599|40|6|30|45017.70|0.08|0.07|R|F|1994-04-27|1994-04-04|1994-05-16|COLLECT COD|SHIP|ess, final dept +11974|769|66|1|42|70129.92|0.07|0.06|R|F|1992-10-24|1992-12-28|1992-11-08|DELIVER IN PERSON|RAIL|eas cajole; silent +11974|782|83|2|12|20193.36|0.10|0.05|R|F|1992-10-18|1993-01-02|1992-10-28|DELIVER IN PERSON|MAIL|s beyond th +11975|1736|63|1|23|37667.79|0.07|0.05|N|O|1995-06-18|1995-07-03|1995-06-30|COLLECT COD|TRUCK|s detect above the b +11975|674|75|2|19|29918.73|0.10|0.01|N|O|1995-07-01|1995-06-17|1995-07-17|NONE|FOB|regular requests nag qui +11975|713|14|3|40|64548.40|0.02|0.00|N|O|1995-07-23|1995-06-15|1995-08-02|NONE|SHIP|uffily furiously bo +11975|667|99|4|34|53300.44|0.06|0.03|N|O|1995-06-22|1995-05-24|1995-06-26|NONE|MAIL|ate furiously quickly ironic re +11975|1730|73|5|32|52215.36|0.04|0.03|N|O|1995-08-09|1995-05-25|1995-08-11|NONE|FOB|eposits cajole across the fur +12000|1295|70|1|33|39477.57|0.03|0.03|R|F|1994-09-10|1994-08-01|1994-10-04|DELIVER IN PERSON|MAIL|lyly even gifts. f +12000|644|76|2|6|9267.84|0.09|0.01|A|F|1994-06-15|1994-06-17|1994-07-12|COLLECT COD|MAIL|counts. carefu +12000|780|13|3|9|15127.02|0.03|0.05|R|F|1994-09-05|1994-07-22|1994-09-26|TAKE BACK RETURN|AIR|quests play blithel +12000|1969|2|4|13|24322.48|0.00|0.06|R|F|1994-06-09|1994-08-08|1994-06-13|COLLECT COD|RAIL|l ideas haggle across the e +12001|1958|3|1|8|14879.60|0.01|0.01|R|F|1994-07-18|1994-09-30|1994-08-03|TAKE BACK RETURN|SHIP|ickly final packages cajole bli +12001|459|18|2|23|31267.35|0.04|0.05|R|F|1994-08-11|1994-10-05|1994-08-30|NONE|FOB| fluffily final ideas haggle above t +12001|907|10|3|11|19886.90|0.05|0.04|R|F|1994-07-17|1994-09-25|1994-08-12|TAKE BACK RETURN|TRUCK|totes sleep qu +12001|1719|20|4|46|74552.66|0.09|0.07|R|F|1994-09-19|1994-08-10|1994-10-12|NONE|SHIP|eep quietly. regula +12002|1968|57|1|44|82278.24|0.07|0.04|R|F|1994-03-28|1994-02-10|1994-03-30|COLLECT COD|REG AIR|lly pending ideas promise theodolites! r +12003|1720|21|1|10|16217.20|0.06|0.07|N|O|1998-07-06|1998-08-10|1998-07-27|COLLECT COD|REG AIR|nstruction +12004|649|81|1|47|72833.08|0.04|0.07|R|F|1995-02-10|1995-01-30|1995-02-11|COLLECT COD|SHIP|s. dugouts use. slyly regula +12005|342|43|1|13|16150.42|0.03|0.02|R|F|1992-07-09|1992-07-31|1992-08-05|TAKE BACK RETURN|AIR|thely around the quickly express de +12005|1634|17|2|26|39926.38|0.10|0.01|R|F|1992-08-03|1992-08-10|1992-08-29|TAKE BACK RETURN|MAIL| the blithely reg +12005|925|94|3|25|45648.00|0.06|0.07|R|F|1992-09-21|1992-08-17|1992-10-01|NONE|REG AIR|blithely final accounts. even requests ab +12005|1252|53|4|2|2306.50|0.09|0.00|A|F|1992-08-18|1992-08-05|1992-09-10|TAKE BACK RETURN|AIR|refully ironic accounts. fu +12005|1351|28|5|41|51346.35|0.06|0.01|R|F|1992-07-19|1992-08-20|1992-08-14|NONE|FOB|deposits. requests haggle carefu +12005|674|6|6|40|62986.80|0.09|0.07|R|F|1992-07-29|1992-09-22|1992-08-20|COLLECT COD|AIR|s. slyly ironic requests haggle blith +12005|1|77|7|46|41446.00|0.05|0.03|R|F|1992-07-01|1992-08-15|1992-07-18|TAKE BACK RETURN|AIR| furiously express grouches sleep reg +12006|1011|17|1|37|33744.37|0.01|0.04|N|O|1997-06-20|1997-08-31|1997-07-05|TAKE BACK RETURN|AIR|ly thin exc +12006|65|66|2|32|30881.92|0.00|0.05|N|O|1997-09-21|1997-07-05|1997-10-17|NONE|FOB|bout the slyly regular foxes. fur +12006|920|23|3|18|32776.56|0.04|0.02|N|O|1997-09-02|1997-07-25|1997-09-03|COLLECT COD|REG AIR| asymptotes haggle blithely. pe +12006|14|15|4|19|17366.19|0.02|0.05|N|O|1997-08-08|1997-07-24|1997-09-06|COLLECT COD|REG AIR|ial deposits sleep blithely furiously pend +12006|935|38|5|7|12851.51|0.08|0.01|N|O|1997-08-04|1997-08-06|1997-08-10|TAKE BACK RETURN|REG AIR|requests according t +12007|948|51|1|45|83202.30|0.06|0.05|R|F|1994-12-18|1994-12-22|1994-12-30|TAKE BACK RETURN|FOB|s integrate slyly. ideas use. blith +12007|984|53|2|11|20734.78|0.10|0.03|R|F|1994-10-10|1994-10-30|1994-11-04|TAKE BACK RETURN|REG AIR|es sleep blithely a +12007|1582|23|3|41|60826.78|0.08|0.03|R|F|1995-01-27|1994-11-19|1995-02-17|DELIVER IN PERSON|RAIL| about the s +12007|570|31|4|8|11764.56|0.02|0.08|R|F|1994-11-05|1994-12-18|1994-11-21|NONE|SHIP|t the pinto beans. bold, u +12007|1926|15|5|40|73116.80|0.07|0.00|A|F|1994-10-20|1994-12-07|1994-11-05|COLLECT COD|AIR|. dogged w +12032|415|16|1|28|36831.48|0.05|0.03|N|O|1997-10-19|1997-10-13|1997-11-16|TAKE BACK RETURN|AIR|equests are +12032|1289|1|2|39|46420.92|0.01|0.06|N|O|1997-11-27|1997-10-22|1997-11-29|DELIVER IN PERSON|MAIL|sits are carefull +12032|1477|17|3|1|1378.47|0.04|0.07|N|O|1997-11-18|1997-10-18|1997-11-27|DELIVER IN PERSON|TRUCK|ickly care +12032|877|11|4|10|17778.70|0.09|0.00|N|O|1997-08-25|1997-11-08|1997-09-10|TAKE BACK RETURN|TRUCK|ainments wake blithely accor +12033|521|12|1|33|46910.16|0.06|0.03|A|F|1992-11-03|1992-11-27|1992-11-23|DELIVER IN PERSON|SHIP|yly express excuses boost slyly fu +12033|197|76|2|30|32915.70|0.07|0.00|R|F|1992-10-19|1992-10-22|1992-11-09|COLLECT COD|AIR|ily express +12033|485|15|3|22|30480.56|0.02|0.07|R|F|1992-12-22|1992-11-08|1993-01-18|NONE|MAIL|egular courts. ironic, bold deposits a +12033|710|75|4|35|56374.85|0.10|0.08|R|F|1992-11-07|1992-11-03|1992-12-05|TAKE BACK RETURN|RAIL| fluffily even theodolites. pac +12033|1347|86|5|39|48685.26|0.01|0.07|R|F|1993-01-07|1992-10-21|1993-01-13|NONE|AIR|efully ideas. platelets +12034|1673|56|1|33|51964.11|0.03|0.00|N|O|1997-01-22|1997-01-17|1997-02-12|DELIVER IN PERSON|AIR|ffily final foxes. furiously +12034|1927|60|2|21|38407.32|0.06|0.06|N|O|1997-01-29|1997-02-11|1997-02-26|DELIVER IN PERSON|SHIP|le slyly across the blithely final courts +12035|1449|89|1|35|47265.40|0.08|0.04|N|O|1996-12-11|1996-12-30|1996-12-26|DELIVER IN PERSON|RAIL|ly deposits wake. fluffily regul +12035|1446|25|2|41|55245.04|0.00|0.06|N|O|1996-11-15|1997-02-06|1996-11-26|DELIVER IN PERSON|RAIL|accounts. final requests +12035|602|3|3|7|10518.20|0.04|0.05|N|O|1996-12-31|1997-01-17|1997-01-03|NONE|TRUCK| unusual foxes. even, spe +12035|800|33|4|39|66331.20|0.04|0.01|N|O|1997-02-16|1997-02-05|1997-03-05|COLLECT COD|REG AIR|gular dependencies with +12035|560|61|5|1|1460.56|0.08|0.00|N|O|1997-01-20|1997-01-28|1997-01-26|TAKE BACK RETURN|FOB|permanently. slyl +12035|97|48|6|34|33901.06|0.06|0.00|N|O|1996-12-01|1996-12-19|1996-12-27|TAKE BACK RETURN|RAIL|e slyly regula +12035|492|93|7|25|34812.25|0.04|0.02|N|O|1997-03-01|1996-12-15|1997-03-22|TAKE BACK RETURN|SHIP|ions shall have to ca +12036|1644|27|1|38|58734.32|0.04|0.02|N|O|1998-03-23|1998-03-30|1998-04-05|TAKE BACK RETURN|FOB|ounts. pac +12036|1722|23|2|33|53582.76|0.01|0.08|N|O|1998-03-28|1998-02-15|1998-04-19|TAKE BACK RETURN|MAIL| final ideas. slyl +12036|1075|76|3|29|28306.03|0.09|0.00|N|O|1998-03-02|1998-04-07|1998-03-05|TAKE BACK RETURN|SHIP|sts. carefully final r +12036|445|46|4|19|25563.36|0.02|0.07|N|O|1998-04-02|1998-03-12|1998-04-20|DELIVER IN PERSON|TRUCK| are furiously. un +12036|1346|61|5|7|8731.38|0.03|0.05|N|O|1998-01-23|1998-03-03|1998-02-21|COLLECT COD|TRUCK|ntegrate slyly alongside of the c +12036|56|7|6|35|33461.75|0.00|0.04|N|O|1998-02-08|1998-04-16|1998-02-28|TAKE BACK RETURN|REG AIR| carefully always pend +12036|1708|93|7|20|32194.00|0.09|0.03|N|O|1998-05-09|1998-03-02|1998-06-06|TAKE BACK RETURN|FOB| theodolite +12037|555|56|1|3|4366.65|0.02|0.05|N|O|1995-08-20|1995-08-23|1995-09-01|DELIVER IN PERSON|MAIL| platelets above the unusual deposit +12037|1222|23|2|20|22464.40|0.03|0.05|N|O|1995-07-20|1995-08-26|1995-08-07|NONE|FOB|ly express theodolites. special ideas a +12037|1192|1|3|12|13118.28|0.05|0.03|N|O|1995-08-19|1995-09-29|1995-08-26|DELIVER IN PERSON|RAIL| packages u +12037|803|70|4|10|17038.00|0.00|0.01|N|O|1995-09-23|1995-09-19|1995-10-11|NONE|RAIL|aggle slyly. final pint +12037|669|32|5|5|7848.30|0.09|0.06|N|O|1995-10-16|1995-08-14|1995-10-26|NONE|SHIP|ar dugouts kindle quickly regular id +12037|497|56|6|46|64284.54|0.09|0.07|N|O|1995-08-29|1995-08-16|1995-09-04|NONE|FOB|bold instructions. quickly regular r +12037|2000|33|7|13|11726.00|0.04|0.08|N|O|1995-07-03|1995-08-21|1995-07-26|NONE|AIR|ly quickly ironic theodolites. ironic i +12038|316|1|1|15|18244.65|0.04|0.06|N|O|1995-12-14|1996-01-07|1996-01-04|TAKE BACK RETURN|RAIL|dencies. blithely special plate +12038|561|52|2|28|40923.68|0.04|0.04|N|O|1996-02-29|1996-01-26|1996-03-16|COLLECT COD|REG AIR|silent dolphins sleep carefully pend +12039|450|80|1|49|66172.05|0.03|0.06|A|F|1993-08-09|1993-07-29|1993-08-22|TAKE BACK RETURN|RAIL|ly furious +12039|290|91|2|43|51182.47|0.06|0.07|R|F|1993-07-24|1993-08-14|1993-08-21|DELIVER IN PERSON|TRUCK|side of the ironic, final platelets +12039|1313|52|3|44|53429.64|0.10|0.03|R|F|1993-09-25|1993-08-14|1993-10-14|TAKE BACK RETURN|AIR|. quickly re +12039|501|92|4|7|9810.50|0.01|0.04|A|F|1993-08-05|1993-08-10|1993-09-01|NONE|RAIL|le furiously. asymptot +12039|1687|88|5|46|73079.28|0.09|0.01|A|F|1993-07-17|1993-08-08|1993-08-02|DELIVER IN PERSON|TRUCK|earls. slyly +12039|1086|57|6|46|45405.68|0.06|0.05|R|F|1993-08-12|1993-07-17|1993-08-16|COLLECT COD|FOB|hy accounts: final theod +12039|1370|71|7|10|12713.70|0.10|0.07|R|F|1993-08-05|1993-08-31|1993-08-07|DELIVER IN PERSON|AIR|instructions +12064|1963|8|1|9|16784.64|0.04|0.06|R|F|1993-01-01|1992-11-14|1993-01-26|NONE|MAIL|d, bold deposits wake quickly regular +12064|753|86|2|13|21498.75|0.04|0.04|A|F|1992-11-08|1992-11-26|1992-11-25|TAKE BACK RETURN|AIR|ts. ironic deposits alongside of the ironic +12064|1203|15|3|3|3312.60|0.09|0.08|R|F|1992-12-27|1992-12-06|1992-12-31|NONE|FOB|boost slyly pending deposits. care +12064|465|95|4|24|32771.04|0.03|0.04|R|F|1992-12-08|1992-12-03|1993-01-06|DELIVER IN PERSON|AIR|ly. carefully silent a +12064|1443|44|5|24|32266.56|0.08|0.04|A|F|1992-11-17|1992-11-23|1992-12-17|NONE|MAIL|e blithely unusual theodo +12064|1154|55|6|27|28489.05|0.05|0.01|A|F|1992-09-26|1992-10-24|1992-10-05|NONE|RAIL|into beans. fl +12065|1302|17|1|48|57758.40|0.00|0.04|N|O|1997-02-04|1997-03-12|1997-02-17|COLLECT COD|FOB| since the slyl +12066|1212|13|1|12|13358.52|0.09|0.03|A|F|1995-05-15|1995-04-09|1995-06-07|COLLECT COD|TRUCK|ts above the slowly regular pinto beans w +12066|990|93|2|21|39710.79|0.03|0.01|A|F|1995-04-05|1995-03-22|1995-04-12|TAKE BACK RETURN|SHIP|sleep after the quic +12066|673|36|3|23|36194.41|0.03|0.01|R|F|1995-04-22|1995-04-07|1995-05-08|TAKE BACK RETURN|AIR|uests. speci +12066|1963|8|4|35|65273.60|0.08|0.05|R|F|1995-05-27|1995-03-31|1995-06-10|TAKE BACK RETURN|SHIP|ss accounts. even accounts sleep darin +12066|1490|91|5|27|37570.23|0.07|0.07|N|F|1995-06-03|1995-04-18|1995-06-22|COLLECT COD|REG AIR|nusual pinto beans. careful theodo +12067|1503|4|1|23|32303.50|0.06|0.04|R|F|1993-03-16|1993-04-24|1993-04-10|COLLECT COD|FOB|pinto beans cajole +12067|1485|86|2|32|44367.36|0.10|0.00|A|F|1993-04-14|1993-04-04|1993-04-25|NONE|RAIL|eas. blithely ironic d +12067|1332|9|3|22|27133.26|0.04|0.05|A|F|1993-05-09|1993-04-08|1993-06-03|COLLECT COD|TRUCK|the even realms. +12067|107|86|4|30|30213.00|0.08|0.00|R|F|1993-04-06|1993-05-06|1993-04-12|NONE|AIR|es sleep fluffily furi +12067|1428|68|5|1|1329.42|0.02|0.04|A|F|1993-03-09|1993-04-09|1993-03-21|COLLECT COD|TRUCK|nto beans; regular courts are +12067|506|37|6|50|70325.00|0.07|0.07|A|F|1993-02-10|1993-05-06|1993-02-24|NONE|MAIL|es. bold instructions use after the re +12067|1823|53|7|18|31046.76|0.06|0.01|A|F|1993-05-09|1993-05-01|1993-05-11|TAKE BACK RETURN|TRUCK| blithely bold excuses. requests beneath +12068|810|44|1|8|13686.48|0.09|0.03|N|O|1996-08-19|1996-08-03|1996-08-24|NONE|RAIL|ly. unusual, bold theodolites use carefully +12068|1078|84|2|8|7832.56|0.04|0.00|N|O|1996-06-07|1996-08-06|1996-06-15|TAKE BACK RETURN|FOB|der carefully. furiously unusual deposits +12069|1874|4|1|35|62155.45|0.03|0.01|N|O|1995-12-12|1995-12-12|1995-12-22|COLLECT COD|MAIL|ely final acco +12069|1291|66|2|28|33384.12|0.01|0.05|N|O|1995-12-14|1995-12-10|1995-12-22|NONE|REG AIR| carefully regular accounts are slyly: ex +12069|1136|73|3|8|8297.04|0.08|0.08|N|O|1995-11-20|1995-12-29|1995-12-03|DELIVER IN PERSON|MAIL|ans. bold, silent dolphins snooze blithel +12069|98|49|4|35|34933.15|0.05|0.03|N|O|1995-12-28|1996-01-25|1995-12-29|COLLECT COD|REG AIR|uses are! dol +12069|1424|3|5|21|27833.82|0.08|0.07|N|O|1995-12-15|1996-01-29|1996-01-09|DELIVER IN PERSON|REG AIR| bold ideas are furiously accord +12069|856|56|6|41|72030.85|0.08|0.06|N|O|1995-12-04|1996-01-13|1995-12-16|NONE|SHIP|y across the carefull +12070|40|91|1|4|3760.16|0.10|0.03|N|O|1998-08-08|1998-06-23|1998-09-06|TAKE BACK RETURN|TRUCK|slyly ironi +12070|1451|69|2|50|67622.50|0.00|0.04|N|O|1998-06-18|1998-08-15|1998-07-06|TAKE BACK RETURN|TRUCK|sias cajole slyly. furiously dogged ins +12070|1535|76|3|19|27294.07|0.02|0.01|N|O|1998-06-16|1998-07-29|1998-06-19|DELIVER IN PERSON|REG AIR|luffy instructions integrate furious +12070|1276|77|4|48|56508.96|0.02|0.07|N|O|1998-05-28|1998-08-19|1998-06-07|NONE|RAIL|lent theodolites. pi +12070|1785|12|5|14|23614.92|0.09|0.03|N|O|1998-07-22|1998-08-10|1998-07-27|NONE|TRUCK| accounts. quickly silent +12070|488|76|6|40|55539.20|0.00|0.07|N|O|1998-06-19|1998-08-13|1998-06-22|DELIVER IN PERSON|REG AIR|kly final instr +12070|1748|49|7|9|14847.66|0.01|0.03|N|O|1998-05-26|1998-08-16|1998-05-31|DELIVER IN PERSON|FOB|ular packages must wak +12071|934|37|1|27|49543.11|0.02|0.00|N|O|1998-08-17|1998-08-24|1998-09-10|NONE|SHIP|refully carefully final deposits. f +12071|704|37|2|23|36908.10|0.05|0.06|N|O|1998-10-07|1998-08-15|1998-10-28|DELIVER IN PERSON|SHIP|. slyly special attainments poach blit +12071|94|20|3|15|14911.35|0.08|0.06|N|O|1998-08-18|1998-08-13|1998-08-27|DELIVER IN PERSON|RAIL|; careful, unusual requests haggle c +12096|60|36|1|21|20161.26|0.10|0.03|A|F|1992-12-10|1992-11-08|1992-12-13|DELIVER IN PERSON|SHIP|kly after the slyly bold tithes? deposi +12096|494|82|2|48|66935.52|0.00|0.05|A|F|1992-10-08|1992-10-23|1992-10-27|TAKE BACK RETURN|TRUCK|quickly across the slyly +12096|185|12|3|13|14107.34|0.10|0.00|A|F|1992-11-07|1992-11-29|1992-11-25|COLLECT COD|TRUCK|ss deposits hinder caref +12096|57|83|4|29|27754.45|0.04|0.07|A|F|1993-01-15|1992-11-03|1993-01-28|DELIVER IN PERSON|REG AIR|final foxes accord +12096|349|34|5|24|29984.16|0.00|0.04|R|F|1992-12-03|1992-11-20|1992-12-18|TAKE BACK RETURN|TRUCK|aringly ironic ideas h +12096|812|13|6|40|68512.40|0.05|0.03|A|F|1992-11-09|1992-11-12|1992-11-29|DELIVER IN PERSON|SHIP| furiously +12096|1871|72|7|17|30138.79|0.08|0.04|R|F|1992-11-14|1992-11-11|1992-12-02|NONE|TRUCK|dolites affix? slyly even realms integ +12097|1381|58|1|50|64119.00|0.03|0.02|R|F|1994-01-19|1994-01-23|1994-02-14|DELIVER IN PERSON|REG AIR| after the carefull +12097|52|53|2|17|16184.85|0.08|0.06|A|F|1993-12-30|1994-01-17|1994-01-12|NONE|AIR|osits about the depths integ +12097|920|89|3|33|60090.36|0.06|0.01|R|F|1994-03-01|1993-12-16|1994-03-12|TAKE BACK RETURN|RAIL|hins alongside of the blithely i +12097|396|53|4|15|19445.85|0.03|0.08|A|F|1994-02-20|1994-01-10|1994-03-19|TAKE BACK RETURN|TRUCK|lyly silent platele +12098|1574|55|1|25|36889.25|0.08|0.03|A|F|1993-06-24|1993-07-19|1993-07-02|NONE|TRUCK|lithely ironic deposits solve slyly. regula +12099|1331|8|1|22|27111.26|0.10|0.07|A|F|1994-09-23|1994-10-29|1994-10-14|TAKE BACK RETURN|TRUCK|ld deposits boost until the regular plat +12099|859|60|2|19|33437.15|0.01|0.04|R|F|1994-10-10|1994-10-27|1994-10-22|COLLECT COD|AIR|n, special packages sleep across the bl +12099|466|54|3|41|56024.86|0.05|0.08|R|F|1994-12-18|1994-12-11|1994-12-26|NONE|FOB|eath the carefully +12099|1422|40|4|37|48966.54|0.01|0.03|A|F|1994-11-08|1994-12-09|1994-11-15|NONE|SHIP|the carefully careful ideas cajole aga +12099|414|2|5|17|22344.97|0.10|0.03|A|F|1994-12-28|1994-11-25|1995-01-25|NONE|MAIL|nal pinto beans abov +12099|1969|14|6|22|41161.12|0.02|0.03|R|F|1994-09-14|1994-10-25|1994-10-13|TAKE BACK RETURN|FOB|ng courts boost furiously +12100|1810|40|1|36|61625.16|0.00|0.02|N|O|1996-06-10|1996-06-11|1996-06-20|TAKE BACK RETURN|SHIP|regular deposits run carefully final p +12101|1201|13|1|28|30861.60|0.08|0.01|A|F|1995-02-13|1995-02-27|1995-03-14|DELIVER IN PERSON|TRUCK|es haggle express excuses. +12101|16|17|2|25|22900.25|0.04|0.04|A|F|1995-02-13|1995-03-02|1995-02-14|COLLECT COD|REG AIR|al, final foxes about the ir +12101|144|23|3|48|50118.72|0.03|0.06|R|F|1995-03-07|1995-02-06|1995-04-02|NONE|TRUCK|gular platelets. care +12102|366|51|1|22|27859.92|0.07|0.04|N|O|1996-02-09|1995-12-20|1996-03-02|COLLECT COD|MAIL|pending escapade +12102|600|61|2|20|30012.00|0.01|0.05|N|O|1996-01-21|1996-01-18|1996-02-15|COLLECT COD|RAIL|- furiously express warhorses ca +12102|1733|18|3|32|52311.36|0.07|0.06|N|O|1996-01-24|1995-12-28|1996-02-23|TAKE BACK RETURN|RAIL|ccounts cajole around the even ideas. quick +12102|77|78|4|34|33220.38|0.05|0.05|N|O|1996-01-04|1996-01-20|1996-01-25|TAKE BACK RETURN|MAIL|ts nag bold, special deposits. even req +12102|1822|9|5|38|65505.16|0.06|0.07|N|O|1995-11-20|1996-01-10|1995-12-04|TAKE BACK RETURN|REG AIR| platelets; furiously +12103|698|99|1|24|38368.56|0.09|0.01|N|O|1997-02-17|1997-02-23|1997-03-08|COLLECT COD|REG AIR|he finally regular r +12103|924|25|2|33|60222.36|0.02|0.03|N|O|1996-12-23|1996-12-27|1997-01-21|COLLECT COD|RAIL|gular deposits. slyly regular request +12103|1766|67|3|5|8338.80|0.05|0.08|N|O|1997-01-23|1996-12-29|1997-02-05|TAKE BACK RETURN|RAIL|lyly above the quickly unusu +12103|372|29|4|35|44532.95|0.06|0.01|N|O|1996-12-26|1997-01-16|1997-01-22|TAKE BACK RETURN|RAIL| according to the slyly pendin +12103|288|16|5|19|22577.32|0.01|0.00|N|O|1997-01-22|1997-02-17|1997-01-27|DELIVER IN PERSON|SHIP|es. unusual foxes wake foxes. quick +12128|268|50|1|22|25701.72|0.10|0.04|N|O|1997-08-30|1997-09-04|1997-09-01|DELIVER IN PERSON|AIR| accounts are slyl +12128|608|2|2|16|24137.60|0.07|0.03|N|O|1997-07-13|1997-08-19|1997-08-10|COLLECT COD|AIR|he fluffily regular asymptotes thrash aga +12128|106|85|3|31|31189.10|0.01|0.08|N|O|1997-07-06|1997-08-14|1997-07-22|NONE|SHIP| theodolites cajole fluf +12128|834|34|4|47|81537.01|0.06|0.08|N|O|1997-10-20|1997-08-14|1997-11-07|DELIVER IN PERSON|REG AIR|, regular pinto +12129|1911|44|1|8|14503.28|0.00|0.00|A|F|1993-02-06|1993-02-21|1993-03-05|NONE|RAIL|regular requests haggle furious +12129|917|52|2|11|19997.01|0.02|0.06|R|F|1993-01-09|1993-03-15|1993-01-16|TAKE BACK RETURN|SHIP|carefully final theodol +12129|749|14|3|45|74238.30|0.00|0.00|R|F|1993-03-19|1993-02-24|1993-03-21|COLLECT COD|AIR|t the quic +12129|1440|41|4|2|2682.88|0.07|0.01|A|F|1993-01-31|1993-02-16|1993-03-01|NONE|MAIL| above the c +12129|498|28|5|4|5593.96|0.05|0.04|A|F|1993-01-15|1993-02-25|1993-01-30|NONE|RAIL|fix silent asym +12130|949|50|1|35|64747.90|0.07|0.03|N|O|1996-02-04|1996-03-06|1996-03-05|COLLECT COD|SHIP|. regular, express requests befor +12130|1959|60|2|11|20470.45|0.05|0.05|N|O|1995-12-18|1996-02-19|1996-01-03|NONE|MAIL|l tithes about the blithel +12130|1228|29|3|47|53073.34|0.01|0.02|N|O|1996-01-17|1996-02-05|1996-02-08|NONE|TRUCK|yly ironic packages. bold pa +12130|1109|10|4|10|10101.00|0.09|0.04|N|O|1995-12-13|1996-01-20|1995-12-22|COLLECT COD|RAIL|iresias. special packages wak +12130|1839|69|5|7|12185.81|0.05|0.00|N|O|1996-03-01|1996-02-24|1996-03-21|COLLECT COD|FOB|deposits. express, +12131|1060|31|1|26|24987.56|0.03|0.01|N|O|1998-09-20|1998-08-06|1998-10-02|COLLECT COD|SHIP|courts. blithely r +12131|1340|17|2|9|11172.06|0.06|0.06|N|O|1998-06-30|1998-08-12|1998-07-21|DELIVER IN PERSON|FOB|ular requests. unusual pinto +12131|799|96|3|21|35695.59|0.07|0.07|N|O|1998-10-06|1998-07-31|1998-10-13|COLLECT COD|FOB|posits. ideas across the requests kindl +12131|689|83|4|40|63587.20|0.08|0.00|N|O|1998-07-05|1998-08-27|1998-07-07|NONE|AIR|ests haggle +12131|1862|6|5|21|37041.06|0.06|0.04|N|O|1998-07-22|1998-08-07|1998-07-26|TAKE BACK RETURN|SHIP|nstructions are bli +12131|758|59|6|43|71326.25|0.03|0.08|N|O|1998-09-12|1998-07-31|1998-09-25|COLLECT COD|MAIL|pendencies nag slyly. fluffil +12131|1636|37|7|28|43053.64|0.01|0.06|N|O|1998-07-08|1998-09-14|1998-07-23|COLLECT COD|MAIL|usual deposits. furiously regular packa +12132|755|88|1|32|52984.00|0.04|0.05|N|O|1997-01-03|1996-11-05|1997-01-20|TAKE BACK RETURN|SHIP| according to the quickly even theod +12132|707|72|2|48|77169.60|0.01|0.08|N|O|1996-09-09|1996-11-27|1996-09-11|DELIVER IN PERSON|AIR|al ideas! carefully unusual deposits n +12132|1670|12|3|7|11001.69|0.07|0.05|N|O|1996-09-23|1996-10-08|1996-10-19|NONE|REG AIR|nic, express ideas. furiously regul +12132|1553|54|4|31|45091.05|0.04|0.00|N|O|1996-10-02|1996-10-11|1996-10-20|NONE|RAIL|heodolites use along the even packages: +12132|219|20|5|11|12311.31|0.03|0.00|N|O|1996-09-28|1996-11-01|1996-10-15|DELIVER IN PERSON|REG AIR|. busily unusual pinto bean +12132|355|40|6|44|55235.40|0.03|0.08|N|O|1996-10-05|1996-11-17|1996-10-24|COLLECT COD|MAIL|onic, pending deposits +12132|1053|59|7|13|12402.65|0.08|0.07|N|O|1996-10-14|1996-11-03|1996-10-21|TAKE BACK RETURN|RAIL|y. furiously regular theodolites cajole fur +12133|1675|76|1|35|55183.45|0.09|0.04|R|F|1992-08-09|1992-05-16|1992-09-08|COLLECT COD|FOB|en accounts are fluffily +12134|493|81|1|23|32050.27|0.08|0.00|N|O|1996-06-05|1996-07-21|1996-06-26|DELIVER IN PERSON|FOB|sleep fluffil +12134|1318|33|2|22|26824.82|0.03|0.04|N|O|1996-07-22|1996-08-09|1996-08-13|NONE|REG AIR|of the furiously +12135|985|86|1|26|49035.48|0.02|0.08|N|O|1996-01-16|1995-12-18|1996-02-08|DELIVER IN PERSON|SHIP|e pending foxes. unusual packa +12135|1398|13|2|49|63670.11|0.04|0.02|N|O|1995-10-21|1995-11-20|1995-11-08|TAKE BACK RETURN|REG AIR|nto beans sleep closely about the slowl +12135|1181|82|3|36|38958.48|0.10|0.08|N|O|1995-12-23|1995-12-31|1996-01-21|DELIVER IN PERSON|TRUCK|lar theodolites haggle +12135|631|63|4|5|7658.15|0.07|0.06|N|O|1995-10-14|1995-12-13|1995-11-06|DELIVER IN PERSON|MAIL|kages. express gifts affix +12135|605|68|5|12|18067.20|0.04|0.06|N|O|1995-12-02|1995-11-15|1995-12-26|NONE|RAIL|slyly unusual packages. slyly pending +12135|1911|100|6|46|83393.86|0.08|0.08|N|O|1995-11-27|1995-11-09|1995-11-30|NONE|RAIL|was above the +12135|1531|32|7|5|7162.65|0.05|0.06|N|O|1996-01-21|1995-11-28|1996-01-22|TAKE BACK RETURN|FOB|ts. bravely ironic packages wake blithel +12160|1001|72|1|3|2706.00|0.10|0.07|R|F|1994-02-15|1994-02-27|1994-02-27|DELIVER IN PERSON|SHIP|leep quickly along the theodolites. +12160|321|6|2|9|10991.88|0.01|0.01|R|F|1994-01-29|1994-02-18|1994-02-23|TAKE BACK RETURN|TRUCK|ites among the +12160|115|68|3|44|44664.84|0.00|0.01|R|F|1993-12-29|1994-03-09|1994-01-15|NONE|FOB|ets sleep furiously ironic req +12160|1246|21|4|8|9177.92|0.03|0.04|A|F|1994-01-06|1994-01-28|1994-01-12|NONE|FOB|sits wake furious +12161|422|23|1|31|40995.02|0.06|0.05|N|O|1997-04-03|1997-06-10|1997-04-22|COLLECT COD|REG AIR|leep above +12161|248|49|2|5|5741.20|0.02|0.01|N|O|1997-06-28|1997-05-08|1997-07-01|TAKE BACK RETURN|MAIL|y pending ideas. slyly special package +12161|1355|32|3|42|52766.70|0.09|0.02|N|O|1997-03-26|1997-04-28|1997-04-09|COLLECT COD|AIR|uctions about the ev +12161|399|100|4|9|11694.51|0.00|0.07|N|O|1997-05-10|1997-05-10|1997-06-02|DELIVER IN PERSON|FOB|eep carefully +12161|678|72|5|42|66304.14|0.10|0.01|N|O|1997-03-24|1997-05-27|1997-04-11|DELIVER IN PERSON|TRUCK|ly bold ins +12161|866|33|6|14|24736.04|0.05|0.08|N|O|1997-05-08|1997-05-14|1997-05-16|NONE|FOB|grate. slyly regular deposits mold accor +12161|81|82|7|22|21583.76|0.02|0.03|N|O|1997-04-01|1997-05-08|1997-04-29|NONE|FOB|xpress requests sleep fluffi +12162|653|47|1|31|48163.15|0.06|0.06|N|O|1997-03-21|1997-05-09|1997-04-07|DELIVER IN PERSON|FOB|efully express platelets. carefully r +12163|1815|59|1|38|65238.78|0.09|0.07|N|O|1997-08-21|1997-09-28|1997-09-07|TAKE BACK RETURN|FOB|cial packages use acc +12163|1046|17|2|39|36934.56|0.08|0.00|N|O|1997-09-28|1997-09-23|1997-10-04|TAKE BACK RETURN|TRUCK|es. express, si +12163|1653|54|3|32|49748.80|0.01|0.07|N|O|1997-08-10|1997-08-26|1997-08-18|TAKE BACK RETURN|AIR| pending dolphins use furiously ir +12163|1361|62|4|48|60593.28|0.10|0.02|N|O|1997-07-23|1997-09-29|1997-08-09|COLLECT COD|FOB|eans across the furiously final theodolit +12164|1825|55|1|27|46624.14|0.06|0.07|R|F|1994-01-31|1993-11-30|1994-02-26|NONE|SHIP|tead of the blithely r +12164|371|72|2|19|24156.03|0.09|0.04|A|F|1993-12-22|1993-12-16|1994-01-02|COLLECT COD|RAIL|riously ab +12164|1604|5|3|22|33123.20|0.01|0.06|R|F|1993-10-28|1993-12-07|1993-11-18|DELIVER IN PERSON|REG AIR|lithely regular accounts sleep slyly alo +12164|1194|3|4|28|30665.32|0.02|0.02|R|F|1994-01-28|1993-12-30|1994-02-06|COLLECT COD|SHIP|ckly unusual foxes. final deposits a +12164|1652|94|5|5|7768.25|0.04|0.08|R|F|1993-11-06|1993-11-24|1993-12-01|TAKE BACK RETURN|AIR|s affix about +12164|782|83|6|22|37021.16|0.04|0.06|R|F|1993-12-16|1993-11-29|1994-01-07|DELIVER IN PERSON|REG AIR|wake. pendi +12165|1375|14|1|12|15316.44|0.02|0.07|R|F|1994-07-14|1994-06-28|1994-07-25|DELIVER IN PERSON|FOB|tructions. ironic, even foxes +12165|33|84|2|42|39187.26|0.01|0.00|A|F|1994-08-05|1994-07-09|1994-08-13|NONE|SHIP|lly even foxes along the f +12165|1556|77|3|30|43726.50|0.00|0.05|A|F|1994-06-15|1994-05-17|1994-06-30|NONE|MAIL|foxes affix above the +12165|133|60|4|47|48557.11|0.07|0.07|R|F|1994-06-09|1994-05-17|1994-06-30|DELIVER IN PERSON|RAIL|use quickly bold ideas. slyly express braid +12165|235|63|5|4|4540.92|0.01|0.06|A|F|1994-05-13|1994-05-29|1994-05-29|NONE|RAIL|ounts ought to da +12166|1770|55|1|11|18389.47|0.04|0.02|A|F|1995-05-08|1995-05-08|1995-05-21|DELIVER IN PERSON|RAIL| accounts are after the carefully special +12167|27|53|1|22|20394.44|0.00|0.05|N|O|1998-08-10|1998-07-01|1998-09-08|NONE|REG AIR|above the f +12167|508|39|2|26|36621.00|0.02|0.08|N|O|1998-06-25|1998-07-09|1998-07-13|COLLECT COD|SHIP| of the quickly s +12192|922|91|1|15|27343.80|0.07|0.07|R|F|1995-02-10|1995-01-14|1995-03-04|DELIVER IN PERSON|RAIL|dinos. final, silent accounts p +12193|1942|43|1|35|64537.90|0.04|0.06|N|O|1996-10-16|1996-09-18|1996-11-02|DELIVER IN PERSON|TRUCK| quickly slyly regular requests. furiously +12193|1030|1|2|9|8379.27|0.02|0.02|N|O|1996-09-25|1996-09-19|1996-10-08|NONE|SHIP|ly special d +12193|1811|98|3|38|65086.78|0.08|0.03|N|O|1996-10-06|1996-10-09|1996-10-19|TAKE BACK RETURN|AIR|even asymptotes sleep ironic accounts +12193|208|63|4|21|23272.20|0.05|0.07|N|O|1996-10-28|1996-10-09|1996-11-02|DELIVER IN PERSON|RAIL|e blithely. pin +12194|323|24|1|32|39146.24|0.02|0.01|A|F|1995-04-11|1995-05-14|1995-04-18|TAKE BACK RETURN|FOB| ironic instructi +12194|595|26|2|14|20938.26|0.06|0.07|A|F|1995-04-10|1995-05-24|1995-04-17|DELIVER IN PERSON|AIR|deas impress at the quickly unusual the +12195|1788|73|1|40|67591.20|0.04|0.00|N|O|1997-07-16|1997-06-09|1997-07-28|NONE|AIR|eas wake never. fluffily final foxe +12195|68|69|2|46|44530.76|0.03|0.02|N|O|1997-07-17|1997-05-30|1997-08-10|COLLECT COD|REG AIR|ular requests are quickly +12196|876|76|1|1|1776.87|0.09|0.07|A|F|1993-06-15|1993-08-12|1993-06-30|COLLECT COD|SHIP|ounts. blithel +12196|743|44|2|4|6574.96|0.02|0.07|R|F|1993-09-20|1993-08-09|1993-10-02|DELIVER IN PERSON|MAIL|ly regular requests +12196|1477|17|3|6|8270.82|0.04|0.01|A|F|1993-06-18|1993-08-05|1993-06-25|NONE|MAIL|even packages above the instructions are +12196|235|17|4|30|34056.90|0.01|0.00|A|F|1993-07-26|1993-09-01|1993-08-01|DELIVER IN PERSON|FOB|es wake slyly. regular +12196|383|68|5|19|24384.22|0.07|0.08|R|F|1993-09-19|1993-08-01|1993-09-21|COLLECT COD|TRUCK| final Tir +12196|377|78|6|7|8941.59|0.03|0.05|A|F|1993-08-10|1993-07-16|1993-08-16|DELIVER IN PERSON|RAIL|. slyly even +12197|678|10|1|48|75776.16|0.08|0.05|N|O|1997-08-23|1997-09-23|1997-08-29|TAKE BACK RETURN|AIR|usly special instructions according t +12197|102|3|2|44|44092.40|0.01|0.02|N|O|1997-07-26|1997-09-25|1997-08-13|DELIVER IN PERSON|MAIL| to the evenly final ideas. bra +12197|431|32|3|20|26628.60|0.03|0.06|N|O|1997-09-27|1997-08-20|1997-10-01|TAKE BACK RETURN|SHIP|ent theodolites sleep f +12197|431|61|4|41|54588.63|0.01|0.03|N|O|1997-07-29|1997-08-27|1997-08-01|TAKE BACK RETURN|AIR| after the dep +12197|1579|60|5|4|5922.28|0.09|0.03|N|O|1997-10-01|1997-09-08|1997-10-06|COLLECT COD|RAIL|ual instructions affix furiousl +12198|1693|76|1|37|59003.53|0.05|0.07|A|F|1993-06-04|1993-05-15|1993-06-05|TAKE BACK RETURN|REG AIR|ses. pending, final instructions cajo +12199|1349|64|1|3|3751.02|0.03|0.03|N|O|1996-03-04|1996-03-06|1996-03-25|DELIVER IN PERSON|TRUCK|ly silent pinto beans +12199|1719|4|2|2|3241.42|0.08|0.02|N|O|1996-02-23|1996-01-16|1996-03-04|COLLECT COD|FOB|ully about the fur +12199|831|32|3|38|65809.54|0.05|0.08|N|O|1996-02-10|1996-03-08|1996-02-14|COLLECT COD|TRUCK|haggle busily among the blithely spec +12199|1411|51|4|22|28873.02|0.06|0.07|N|O|1995-12-17|1996-02-04|1996-01-09|DELIVER IN PERSON|MAIL|eposits affix blithely even +12224|433|21|1|11|14667.73|0.03|0.00|R|F|1995-04-12|1995-02-06|1995-04-13|NONE|SHIP| integrate bl +12224|552|53|2|46|66817.30|0.00|0.03|A|F|1995-03-12|1995-02-15|1995-04-10|COLLECT COD|MAIL|asymptotes. special requests eat +12224|973|42|3|47|88076.59|0.09|0.05|R|F|1995-03-14|1995-02-09|1995-04-11|DELIVER IN PERSON|AIR|the slyly i +12224|1143|52|4|42|43853.88|0.04|0.08|A|F|1995-01-03|1995-01-23|1995-01-21|DELIVER IN PERSON|RAIL|otes are above the final +12225|1110|19|1|2|2022.22|0.02|0.04|N|O|1997-03-27|1997-03-30|1997-03-31|TAKE BACK RETURN|MAIL|nt requests w +12225|566|97|2|29|42530.24|0.08|0.05|N|O|1997-03-14|1997-03-06|1997-03-19|NONE|TRUCK|cajole fluffily furiously regular a +12225|303|32|3|48|57758.40|0.04|0.04|N|O|1997-04-14|1997-03-11|1997-05-05|DELIVER IN PERSON|MAIL|e, regular excuses boo +12225|1792|35|4|13|22019.27|0.05|0.00|N|O|1997-02-14|1997-04-12|1997-03-04|COLLECT COD|FOB|ide of the carefully silent f +12225|288|89|5|36|42778.08|0.10|0.04|N|O|1997-03-06|1997-03-02|1997-03-19|TAKE BACK RETURN|TRUCK|e blithely. +12225|548|79|6|19|27522.26|0.09|0.05|N|O|1997-05-25|1997-03-21|1997-06-08|COLLECT COD|RAIL|lthily among the quietly ironic asymptotes. +12226|1060|66|1|33|31714.98|0.06|0.07|N|O|1998-04-06|1998-05-12|1998-05-02|TAKE BACK RETURN|REG AIR|ans nag. bold, expr +12226|590|51|2|39|58133.01|0.02|0.07|N|O|1998-04-02|1998-06-12|1998-04-05|COLLECT COD|REG AIR|s. fluffily regular ins +12226|816|50|3|16|27468.96|0.04|0.06|N|O|1998-07-11|1998-06-17|1998-07-20|DELIVER IN PERSON|MAIL|s nag along the ca +12227|1180|53|1|3|3243.54|0.08|0.03|N|O|1998-08-11|1998-08-13|1998-08-29|DELIVER IN PERSON|RAIL|, ironic tithes. furiously even +12227|1515|96|2|44|62326.44|0.00|0.02|N|O|1998-10-09|1998-09-09|1998-11-05|DELIVER IN PERSON|TRUCK|ular accounts. furiously regula +12227|1833|63|3|11|19083.13|0.01|0.07|N|O|1998-08-13|1998-07-28|1998-08-29|COLLECT COD|MAIL|odolites haggle. pint +12227|1247|22|4|34|39040.16|0.10|0.01|N|O|1998-10-06|1998-08-04|1998-10-27|TAKE BACK RETURN|REG AIR|ronic excuses nag fur +12227|1091|62|5|40|39683.60|0.00|0.01|N|O|1998-07-25|1998-07-31|1998-08-22|NONE|TRUCK|as nag around the carefully specia +12227|152|5|6|23|24199.45|0.00|0.03|N|O|1998-09-08|1998-09-12|1998-09-19|COLLECT COD|REG AIR| the furiously pending escapades. +12227|1881|25|7|13|23177.44|0.09|0.08|N|O|1998-08-15|1998-09-22|1998-08-31|DELIVER IN PERSON|AIR| platelets. final, ironic pin +12228|810|10|1|17|29083.77|0.06|0.00|A|F|1994-08-20|1994-08-22|1994-09-18|DELIVER IN PERSON|SHIP|blithely ironic depths +12228|736|37|2|50|81836.50|0.06|0.04|A|F|1994-10-14|1994-08-25|1994-11-01|TAKE BACK RETURN|MAIL| theodolites hagg +12228|1436|15|3|18|24073.74|0.08|0.00|A|F|1994-08-21|1994-08-13|1994-08-27|COLLECT COD|FOB|equests. quickly pendi +12228|116|69|4|9|9144.99|0.10|0.01|R|F|1994-08-07|1994-09-09|1994-09-04|COLLECT COD|TRUCK|jole silently. even deposits hagg +12228|1807|94|5|30|51264.00|0.01|0.00|A|F|1994-08-10|1994-09-04|1994-08-14|COLLECT COD|MAIL|ites cajole. regu +12228|690|84|6|47|74762.43|0.02|0.05|R|F|1994-08-10|1994-09-02|1994-08-21|NONE|AIR|accounts? slyly unusua +12228|840|7|7|6|10445.04|0.02|0.04|A|F|1994-10-01|1994-08-13|1994-10-19|DELIVER IN PERSON|TRUCK|g to the regular warhorses. slyly blithe co +12229|145|24|1|12|12541.68|0.09|0.06|N|O|1996-08-28|1996-09-09|1996-09-11|TAKE BACK RETURN|AIR|ag across the unusual theodolites. a +12229|702|3|2|21|33656.70|0.06|0.06|N|O|1996-09-27|1996-10-14|1996-10-19|TAKE BACK RETURN|AIR|about the bold deposits +12229|1633|57|3|38|58315.94|0.03|0.07|N|O|1996-07-27|1996-08-26|1996-08-03|NONE|SHIP|en deposits: special foxes nag above +12230|44|70|1|19|17936.76|0.03|0.06|N|O|1998-05-03|1998-05-12|1998-05-05|COLLECT COD|TRUCK|e slyly against the +12230|1141|42|2|30|31264.20|0.03|0.03|N|O|1998-06-07|1998-05-10|1998-07-06|TAKE BACK RETURN|TRUCK|ackages. furiously final exc +12230|854|54|3|12|21058.20|0.07|0.00|N|O|1998-06-03|1998-06-20|1998-07-03|COLLECT COD|AIR|le furiousl +12230|1171|8|4|25|26804.25|0.07|0.08|N|O|1998-07-09|1998-06-20|1998-08-07|DELIVER IN PERSON|RAIL|es cajole. quickly regu +12230|1758|1|5|40|66390.00|0.07|0.06|N|O|1998-07-05|1998-06-10|1998-07-10|TAKE BACK RETURN|MAIL|ct unusual requests? carefully ironic foxe +12231|955|58|1|9|16703.55|0.09|0.06|N|O|1997-10-17|1997-09-10|1997-11-16|COLLECT COD|SHIP|ound the fur +12231|640|72|2|17|26190.88|0.07|0.01|N|O|1997-11-22|1997-10-27|1997-12-22|DELIVER IN PERSON|TRUCK|ts cajole. permanently bold attainments ag +12231|1421|61|3|16|21158.72|0.09|0.04|N|O|1997-09-25|1997-09-07|1997-10-02|TAKE BACK RETURN|TRUCK|rts. special pac +12231|1092|28|4|35|34758.15|0.05|0.07|N|O|1997-11-16|1997-08-29|1997-12-12|TAKE BACK RETURN|TRUCK| the pending accoun +12231|600|1|5|44|66026.40|0.02|0.08|N|O|1997-11-17|1997-10-04|1997-12-16|DELIVER IN PERSON|SHIP|ourts. silent, bold T +12231|1906|7|6|43|77739.70|0.01|0.01|N|O|1997-08-29|1997-09-03|1997-09-04|COLLECT COD|SHIP|, bold deposits are never express platelet +12256|1830|60|1|17|29441.11|0.03|0.04|A|F|1993-02-12|1993-03-09|1993-02-24|TAKE BACK RETURN|FOB|ges. unusual multiplier +12256|1904|37|2|11|19864.90|0.02|0.04|R|F|1993-03-21|1993-02-11|1993-04-20|COLLECT COD|TRUCK|xpress deposits thrash blithely about the +12256|411|41|3|20|26228.20|0.09|0.04|R|F|1993-04-12|1993-02-15|1993-05-10|NONE|RAIL|r ideas wake +12256|1178|79|4|19|20504.23|0.08|0.06|R|F|1993-01-16|1993-03-09|1993-02-03|NONE|TRUCK|regular deposits. regular, regular pinto +12256|1244|19|5|44|50390.56|0.01|0.04|R|F|1992-12-24|1993-02-11|1992-12-28|COLLECT COD|TRUCK|ess packages use fluffily inside the +12257|1093|99|1|21|20875.89|0.04|0.05|N|O|1996-07-28|1996-05-29|1996-08-17|TAKE BACK RETURN|REG AIR|nusual asymptotes. quickly even a +12257|1922|11|2|27|49245.84|0.00|0.03|N|O|1996-08-14|1996-07-10|1996-08-20|DELIVER IN PERSON|FOB|gular tithes haggle slyly +12257|1329|6|3|46|56594.72|0.04|0.04|N|O|1996-05-27|1996-05-28|1996-06-07|DELIVER IN PERSON|REG AIR| fluffily final foxes. ca +12258|770|67|1|31|51793.87|0.07|0.03|A|F|1995-02-11|1995-01-22|1995-03-09|TAKE BACK RETURN|FOB|s use. sil +12258|1097|33|2|27|26948.43|0.03|0.05|A|F|1994-12-05|1995-02-25|1995-01-01|DELIVER IN PERSON|MAIL|e slyly stealthy packages. slyly busy id +12258|1609|51|3|25|37765.00|0.05|0.02|R|F|1995-02-28|1995-01-11|1995-03-02|NONE|AIR|ounts are acros +12258|1972|61|4|36|67462.92|0.07|0.05|A|F|1994-12-23|1995-02-07|1995-01-07|TAKE BACK RETURN|TRUCK|iously. care +12258|821|22|5|20|34436.40|0.01|0.00|A|F|1994-12-19|1995-02-06|1994-12-24|DELIVER IN PERSON|REG AIR|elets. bli +12258|822|89|6|39|67189.98|0.07|0.06|R|F|1995-01-20|1995-01-26|1995-02-08|NONE|RAIL|refully. blithely bold deposits ab +12258|1161|62|7|20|21243.20|0.05|0.00|R|F|1994-12-15|1995-01-30|1995-01-03|TAKE BACK RETURN|SHIP|s. quickly express excuses eat: never r +12259|823|57|1|1|1723.82|0.02|0.03|R|F|1993-05-15|1993-05-14|1993-05-31|TAKE BACK RETURN|RAIL| fluffily blithe foxes are ca +12259|57|33|2|34|32539.70|0.06|0.02|R|F|1993-05-15|1993-05-11|1993-05-24|COLLECT COD|SHIP|y even dugouts. final instructions along th +12259|204|59|3|13|14354.60|0.09|0.05|R|F|1993-05-17|1993-04-22|1993-06-14|TAKE BACK RETURN|TRUCK|ets boost. quickly unu +12259|1477|56|4|32|44111.04|0.08|0.05|R|F|1993-04-18|1993-04-16|1993-04-29|DELIVER IN PERSON|TRUCK| ironic attainments. carefully ironic du +12259|512|43|5|34|48025.34|0.10|0.00|A|F|1993-04-07|1993-03-21|1993-04-14|COLLECT COD|SHIP|t have to are +12259|139|92|6|16|16626.08|0.01|0.06|R|F|1993-05-17|1993-03-20|1993-05-28|DELIVER IN PERSON|RAIL|gular accounts haggl +12259|936|39|7|14|25717.02|0.07|0.00|R|F|1993-03-11|1993-04-12|1993-03-29|DELIVER IN PERSON|AIR|ecial sheaves. final accounts cajole +12260|1254|92|1|26|30036.50|0.03|0.02|R|F|1993-01-29|1993-02-15|1993-02-21|COLLECT COD|MAIL|quests. regular pinto beans against the +12260|1476|94|2|11|15152.17|0.09|0.06|A|F|1993-03-26|1993-01-17|1993-04-17|NONE|REG AIR|y. regular packag +12260|806|7|3|36|61444.80|0.07|0.03|A|F|1993-03-05|1993-02-20|1993-03-16|DELIVER IN PERSON|RAIL|ffily even theo +12260|705|70|4|13|20874.10|0.06|0.00|A|F|1993-03-11|1992-12-31|1993-03-19|DELIVER IN PERSON|FOB|ironic courts. fu +12260|1437|38|5|38|50860.34|0.09|0.07|R|F|1993-01-31|1993-01-11|1993-02-24|COLLECT COD|SHIP|sly even theodolites cajole. final requ +12261|306|35|1|28|33776.40|0.09|0.00|A|F|1994-02-13|1994-01-22|1994-03-14|COLLECT COD|SHIP|s cajole carefully. pending Tiresias +12261|751|84|2|30|49552.50|0.08|0.00|R|F|1993-12-30|1993-12-18|1994-01-28|COLLECT COD|AIR|ual, special +12261|925|60|3|41|74862.72|0.05|0.01|R|F|1994-02-03|1993-12-03|1994-02-26|DELIVER IN PERSON|MAIL|o beans sleep across the doggedly reg +12261|1742|69|4|37|60818.38|0.10|0.06|R|F|1993-11-24|1993-12-18|1993-12-21|NONE|REG AIR|after the quickly ironic id +12261|602|96|5|39|58601.40|0.05|0.08|A|F|1994-02-03|1993-12-08|1994-02-26|DELIVER IN PERSON|MAIL|ly quietly ir +12261|48|49|6|49|46453.96|0.05|0.06|R|F|1993-10-29|1994-01-07|1993-11-28|TAKE BACK RETURN|TRUCK|ublate slyly beside th +12261|638|39|7|32|49236.16|0.04|0.04|R|F|1994-01-21|1994-01-15|1994-01-26|NONE|MAIL|as nag carefully a +12262|216|17|1|17|18975.57|0.02|0.07|N|O|1996-01-29|1996-01-25|1996-02-11|DELIVER IN PERSON|AIR|onic packages. ex +12262|958|27|2|33|61345.35|0.05|0.04|N|O|1996-01-12|1996-01-21|1996-02-07|DELIVER IN PERSON|MAIL|ven packages sleep slyly +12262|1523|44|3|9|12820.68|0.08|0.08|N|O|1996-03-04|1996-03-09|1996-03-18|COLLECT COD|FOB|ly silent accounts ha +12262|281|82|4|43|50795.04|0.09|0.00|N|O|1995-12-24|1996-02-18|1996-01-02|DELIVER IN PERSON|RAIL|bold deposit +12263|653|54|1|35|54377.75|0.08|0.02|N|O|1995-08-24|1995-08-29|1995-09-11|TAKE BACK RETURN|SHIP|ccounts sleep slyly blithely express de +12263|934|35|2|33|60552.69|0.05|0.00|N|O|1995-09-14|1995-09-02|1995-10-07|TAKE BACK RETURN|REG AIR|ans use blithely +12263|39|65|3|13|12207.39|0.03|0.00|N|O|1995-08-21|1995-09-16|1995-08-23|COLLECT COD|TRUCK|y. special accounts a +12263|545|76|4|29|41920.66|0.08|0.06|N|O|1995-09-19|1995-09-02|1995-10-19|NONE|RAIL|usly. carefully ironic +12288|753|54|1|21|34728.75|0.05|0.00|N|O|1996-12-29|1996-12-15|1997-01-15|TAKE BACK RETURN|REG AIR|blithely even foxes h +12288|624|87|2|13|19820.06|0.04|0.04|N|O|1996-12-26|1996-12-06|1997-01-09|TAKE BACK RETURN|TRUCK|ackages are blithely. +12288|1677|19|3|17|26837.39|0.05|0.03|N|O|1997-01-19|1997-01-13|1997-01-24|NONE|SHIP|uests detect furiously. qu +12288|1021|22|4|48|44256.96|0.02|0.07|N|O|1997-02-15|1996-12-13|1997-03-01|DELIVER IN PERSON|MAIL|ies about the carefully ir +12289|1855|42|1|39|68517.15|0.02|0.07|N|O|1996-04-16|1996-02-12|1996-05-13|NONE|RAIL|ely. final, even foxes according to +12289|1936|81|2|29|53299.97|0.01|0.08|N|O|1996-03-11|1996-03-21|1996-04-06|COLLECT COD|AIR|ess requests eat thinly blithely unus +12290|1666|8|1|49|76815.34|0.07|0.04|N|O|1995-09-30|1995-08-11|1995-10-14|TAKE BACK RETURN|MAIL|, pending deposits sleep iron +12290|1361|76|2|23|29034.28|0.03|0.02|N|O|1995-10-09|1995-09-01|1995-10-10|NONE|FOB|usual packa +12291|1403|21|1|14|18261.60|0.02|0.08|N|O|1998-05-03|1998-06-12|1998-05-17|TAKE BACK RETURN|RAIL|jole quickly final foxes. unusu +12292|820|87|1|45|77436.90|0.07|0.08|A|F|1992-08-07|1992-07-14|1992-08-09|COLLECT COD|REG AIR|tes? carefully bold packages above th +12292|1157|30|2|25|26453.75|0.10|0.01|A|F|1992-07-20|1992-07-06|1992-07-24|TAKE BACK RETURN|AIR| bold theodolites +12292|1514|35|3|42|59451.42|0.05|0.00|R|F|1992-06-12|1992-07-05|1992-07-07|DELIVER IN PERSON|SHIP| even deposits. qu +12292|293|75|4|15|17899.35|0.02|0.03|R|F|1992-08-26|1992-07-20|1992-09-11|COLLECT COD|RAIL|ely ironic asymptotes. final, +12293|1684|85|1|28|44399.04|0.04|0.07|N|O|1995-10-02|1995-08-26|1995-10-14|COLLECT COD|AIR| slyly slyly +12293|2000|33|2|37|33374.00|0.10|0.02|N|O|1995-09-11|1995-09-07|1995-09-25|DELIVER IN PERSON|REG AIR|lites. carefully final +12293|1443|44|3|20|26888.80|0.03|0.00|N|O|1995-10-16|1995-07-26|1995-10-31|DELIVER IN PERSON|SHIP|warthogs. carefully quiet acc +12294|1321|22|1|15|18334.80|0.06|0.04|N|O|1995-08-31|1995-08-25|1995-09-20|COLLECT COD|AIR|thely special accounts wake slyly +12294|1050|51|2|39|37090.95|0.10|0.00|N|O|1995-11-02|1995-10-03|1995-11-26|DELIVER IN PERSON|AIR|t the slyly bold theodoli +12294|1369|84|3|16|20325.76|0.00|0.08|N|O|1995-07-25|1995-09-13|1995-08-01|COLLECT COD|RAIL|ructions. packages across the ironi +12294|6|82|4|39|35334.00|0.06|0.01|N|O|1995-09-09|1995-08-07|1995-09-22|COLLECT COD|TRUCK|special, regular deposi +12294|760|57|5|48|79716.48|0.05|0.00|N|O|1995-08-02|1995-09-11|1995-08-31|TAKE BACK RETURN|AIR|e of the blithely bold asympto +12295|823|23|1|45|77571.90|0.06|0.00|A|F|1993-12-02|1994-01-17|1993-12-13|COLLECT COD|FOB|ccounts affix f +12295|1490|30|2|8|11131.92|0.06|0.08|A|F|1994-03-01|1994-01-01|1994-03-12|NONE|TRUCK|iously pending ide +12320|1370|85|1|43|54668.91|0.02|0.07|N|O|1996-02-29|1996-02-29|1996-03-28|NONE|REG AIR|ts. special packages above the packages caj +12320|1937|38|2|33|60684.69|0.05|0.06|N|O|1996-02-18|1996-03-09|1996-02-29|COLLECT COD|TRUCK| excuses are carefully abov +12321|1052|58|1|13|12389.65|0.01|0.02|A|F|1994-05-16|1994-05-14|1994-05-31|NONE|AIR|nag. express deposits are blithely fu +12322|553|84|1|11|15989.05|0.00|0.06|N|F|1995-06-10|1995-06-12|1995-06-21|COLLECT COD|MAIL|ily furiou +12322|1185|22|2|20|21723.60|0.00|0.04|N|O|1995-07-20|1995-06-24|1995-08-04|TAKE BACK RETURN|REG AIR| carefully iron +12322|1088|24|3|3|2967.24|0.07|0.06|R|F|1995-05-24|1995-08-05|1995-06-16|NONE|AIR|o the fluffily ironic deposits +12323|1186|23|1|1|1087.18|0.04|0.00|N|O|1995-06-26|1995-06-13|1995-07-13|NONE|MAIL|es sleep slyly. fu +12323|550|51|2|4|5802.20|0.02|0.05|N|O|1995-06-20|1995-06-04|1995-07-06|TAKE BACK RETURN|MAIL|c packages +12323|193|46|3|34|37168.46|0.00|0.08|N|O|1995-07-28|1995-05-26|1995-08-05|COLLECT COD|RAIL|ctions. carefully regular req +12323|978|81|4|35|65763.95|0.09|0.08|N|O|1995-06-28|1995-06-19|1995-07-05|COLLECT COD|TRUCK|efully after the +12323|371|100|5|6|7628.22|0.03|0.05|R|F|1995-04-19|1995-06-16|1995-05-02|NONE|AIR| ideas. fluffily bold dep +12323|755|56|6|12|19869.00|0.00|0.02|N|O|1995-07-20|1995-06-01|1995-08-19|TAKE BACK RETURN|FOB|nts. blithely final platelets are c +12324|273|28|1|11|12905.97|0.07|0.06|N|O|1998-10-08|1998-10-01|1998-11-04|DELIVER IN PERSON|REG AIR| final foxes. slyly sp +12324|1532|13|2|42|60208.26|0.00|0.03|N|O|1998-11-09|1998-09-27|1998-12-08|DELIVER IN PERSON|TRUCK| the furiously pending deposits. i +12324|113|40|3|35|35458.85|0.02|0.08|N|O|1998-09-25|1998-10-22|1998-09-27|DELIVER IN PERSON|MAIL|r, ironic deposits sleep. unus +12324|487|17|4|13|18037.24|0.04|0.03|N|O|1998-11-07|1998-10-14|1998-11-10|NONE|AIR|g to the fluffily even packages cajole +12324|259|87|5|16|18548.00|0.07|0.00|N|O|1998-09-21|1998-10-21|1998-10-02|COLLECT COD|REG AIR|old accounts cajole carefully requests +12324|1654|78|6|34|52892.10|0.03|0.07|N|O|1998-09-12|1998-10-16|1998-09-20|NONE|TRUCK|eans. requests are furiou +12325|625|57|1|49|74755.38|0.08|0.02|R|F|1995-03-07|1995-04-04|1995-03-17|DELIVER IN PERSON|RAIL| furiously final deposits. orbits are qui +12326|427|86|1|12|15929.04|0.06|0.03|R|F|1995-04-17|1995-04-12|1995-05-02|TAKE BACK RETURN|MAIL|ironic, final accounts above the furious +12326|1581|62|2|29|42994.82|0.05|0.03|R|F|1995-03-11|1995-05-04|1995-04-06|NONE|REG AIR|pecial instructions. carefully fin +12326|776|41|3|43|72101.11|0.02|0.00|A|F|1995-05-07|1995-04-09|1995-05-10|DELIVER IN PERSON|TRUCK|eep slyly pending req +12326|1978|79|4|30|56399.10|0.09|0.04|R|F|1995-05-02|1995-03-19|1995-05-08|COLLECT COD|SHIP| bold asymptotes detect regular +12327|1624|48|1|9|13730.58|0.07|0.04|N|O|1998-05-31|1998-05-30|1998-06-11|NONE|SHIP| foxes. express frets at the regular +12327|1684|85|2|10|15856.80|0.05|0.02|N|O|1998-06-27|1998-06-24|1998-07-04|TAKE BACK RETURN|FOB|foxes are regular acco +12327|276|4|3|9|10586.43|0.04|0.03|N|O|1998-07-12|1998-06-19|1998-08-02|COLLECT COD|SHIP|ithely spe +12352|343|72|1|31|38543.54|0.08|0.03|R|F|1992-06-15|1992-05-26|1992-07-15|NONE|FOB|ring, silent d +12352|1957|2|2|44|81793.80|0.09|0.01|A|F|1992-07-23|1992-05-04|1992-08-19|NONE|TRUCK|riously blithely reg +12352|1299|11|3|39|46811.31|0.05|0.08|A|F|1992-04-01|1992-05-27|1992-04-19|TAKE BACK RETURN|AIR|he furiously ironic requests. slyly re +12352|522|13|4|30|42675.60|0.10|0.07|A|F|1992-05-15|1992-05-15|1992-05-23|COLLECT COD|TRUCK|ts wake quietly alon +12352|378|63|5|20|25567.40|0.03|0.03|R|F|1992-06-13|1992-05-04|1992-06-30|COLLECT COD|FOB|t blithely. regular requests +12352|1854|41|6|18|31605.30|0.04|0.00|R|F|1992-04-12|1992-05-27|1992-04-30|DELIVER IN PERSON|SHIP|p ruthlessly despite the slyl +12352|751|84|7|48|79284.00|0.09|0.04|A|F|1992-06-12|1992-05-22|1992-06-29|DELIVER IN PERSON|REG AIR|ularly above the ironic requests. +12353|619|13|1|28|42549.08|0.02|0.04|N|O|1996-05-24|1996-06-10|1996-06-22|TAKE BACK RETURN|MAIL|uests use. fluffily regular foxes +12353|1002|38|2|43|38829.00|0.04|0.03|N|O|1996-08-05|1996-06-20|1996-08-28|NONE|TRUCK|y special accounts are: expres +12353|534|35|3|33|47339.49|0.10|0.01|N|O|1996-06-27|1996-05-25|1996-07-02|TAKE BACK RETURN|SHIP|slyly ironic epitaphs. +12353|1977|10|4|26|48853.22|0.00|0.06|N|O|1996-07-25|1996-06-06|1996-08-02|TAKE BACK RETURN|REG AIR| of the unusual, special packages. eve +12353|135|62|5|43|44510.59|0.05|0.02|N|O|1996-05-07|1996-06-11|1996-05-25|DELIVER IN PERSON|REG AIR|al ideas sleep. +12354|1726|69|1|18|29298.96|0.04|0.07|N|O|1997-02-07|1997-03-16|1997-03-05|TAKE BACK RETURN|TRUCK|ual foxes detect f +12354|219|74|2|15|16788.15|0.09|0.08|N|O|1997-04-27|1997-03-19|1997-05-14|TAKE BACK RETURN|SHIP|d about the regular, +12354|150|77|3|8|8401.20|0.05|0.05|N|O|1997-05-02|1997-03-10|1997-05-08|DELIVER IN PERSON|REG AIR| accounts wake acro +12355|1258|59|1|31|35936.75|0.01|0.02|N|O|1995-09-08|1995-08-19|1995-09-19|NONE|SHIP|ns. blithely reg +12355|551|82|2|36|52255.80|0.09|0.06|N|O|1995-08-11|1995-07-14|1995-08-17|COLLECT COD|TRUCK|egular accounts. fluff +12355|1016|17|3|14|12838.14|0.08|0.02|N|F|1995-06-13|1995-06-28|1995-07-11|NONE|MAIL| express de +12355|1685|86|4|47|74573.96|0.10|0.08|N|O|1995-06-30|1995-08-25|1995-07-03|NONE|TRUCK|thely even deposits haggle fluffily regu +12355|791|24|5|18|30452.22|0.09|0.04|N|F|1995-06-17|1995-08-20|1995-07-13|DELIVER IN PERSON|MAIL|slyly above the ac +12355|947|16|6|35|64677.90|0.05|0.06|N|O|1995-09-21|1995-07-25|1995-10-20|DELIVER IN PERSON|FOB|ackages use by the fur +12355|1130|31|7|20|20622.60|0.01|0.02|N|O|1995-09-08|1995-07-10|1995-10-01|TAKE BACK RETURN|MAIL|ven excuses u +12356|58|84|1|50|47902.50|0.05|0.03|A|F|1993-02-13|1992-12-03|1993-02-17|TAKE BACK RETURN|MAIL|t the blithely slow packages. care +12356|547|48|2|26|37636.04|0.06|0.05|R|F|1992-11-25|1992-12-06|1992-12-24|DELIVER IN PERSON|TRUCK|ep quickly. slyly bo +12356|1124|25|3|38|38954.56|0.07|0.04|A|F|1992-11-19|1992-12-26|1992-12-09|TAKE BACK RETURN|TRUCK|l, pending dependencies. blithely iron +12357|359|88|1|4|5037.40|0.09|0.04|N|O|1995-11-07|1995-11-16|1995-11-25|NONE|REG AIR| pinto beans. carefull +12357|1149|58|2|18|18902.52|0.06|0.04|N|O|1995-09-16|1995-10-06|1995-09-18|TAKE BACK RETURN|TRUCK|detect furiously +12357|1136|37|3|42|43559.46|0.03|0.08|N|O|1995-11-27|1995-10-06|1995-12-10|NONE|REG AIR|final reques +12357|943|12|4|12|22127.28|0.03|0.03|N|O|1995-11-29|1995-11-20|1995-11-30|TAKE BACK RETURN|TRUCK|ages against the unusual d +12358|1899|100|1|19|34216.91|0.04|0.00|N|O|1997-01-15|1996-12-03|1997-02-10|DELIVER IN PERSON|AIR|. carefully even deposi +12358|1539|40|2|27|38894.31|0.02|0.02|N|O|1996-11-17|1996-11-29|1996-12-14|TAKE BACK RETURN|RAIL|yly regular packages about the ir +12358|1336|37|3|3|3711.99|0.04|0.00|N|O|1996-12-26|1996-12-09|1997-01-02|TAKE BACK RETURN|SHIP| regular requests above the de +12358|511|72|4|31|43756.81|0.05|0.05|N|O|1997-01-29|1996-11-28|1997-02-27|TAKE BACK RETURN|REG AIR|nts. fluffily permanent ins +12358|1912|45|5|32|58045.12|0.08|0.01|N|O|1997-01-30|1996-11-10|1997-02-03|NONE|RAIL|ests sleep furiously ironic pa +12358|1405|23|6|1|1306.40|0.06|0.04|N|O|1996-10-16|1996-11-19|1996-11-13|COLLECT COD|RAIL|r the carefully express theodolites. stealt +12358|976|79|7|30|56309.10|0.01|0.02|N|O|1997-01-24|1997-01-06|1997-01-28|COLLECT COD|FOB|the final, final deposits sleep exp +12359|581|72|1|33|48892.14|0.00|0.08|N|O|1997-07-23|1997-07-21|1997-08-08|DELIVER IN PERSON|FOB|nts haggle quickly aft +12359|1087|88|2|42|41499.36|0.03|0.08|N|O|1997-06-16|1997-07-18|1997-06-17|TAKE BACK RETURN|RAIL|ely final theodolit +12359|913|16|3|27|48975.57|0.10|0.02|N|O|1997-08-05|1997-08-19|1997-08-25|NONE|REG AIR|final pinto beans are fluffily amo +12359|1697|98|4|48|76737.12|0.03|0.00|N|O|1997-08-18|1997-08-17|1997-09-12|COLLECT COD|REG AIR|n dependencies above t +12384|1877|21|1|17|30240.79|0.03|0.00|N|O|1998-11-14|1998-09-05|1998-12-01|COLLECT COD|AIR|ove the fluffily regular asympt +12384|1503|4|2|47|66011.50|0.05|0.07|N|O|1998-09-01|1998-09-28|1998-10-01|NONE|MAIL|kly pending foxes cajole regular +12384|453|41|3|20|27069.00|0.09|0.06|N|O|1998-08-11|1998-10-23|1998-09-05|DELIVER IN PERSON|MAIL|arefully among th +12384|1358|73|4|8|10074.80|0.09|0.01|N|O|1998-10-15|1998-10-09|1998-11-05|COLLECT COD|MAIL|eodolites-- always ev +12384|842|42|5|6|10457.04|0.04|0.00|N|O|1998-11-26|1998-10-04|1998-12-08|COLLECT COD|RAIL|ep blithely. blithely ironic r +12384|791|56|6|39|65979.81|0.04|0.01|N|O|1998-08-06|1998-10-11|1998-09-01|NONE|REG AIR|nstructions affix blithely according to +12384|1073|79|7|8|7792.56|0.01|0.01|N|O|1998-09-22|1998-09-22|1998-10-18|TAKE BACK RETURN|RAIL|al requests sleep carefully +12385|1322|99|1|6|7339.92|0.01|0.03|R|F|1993-03-20|1993-02-10|1993-03-26|COLLECT COD|RAIL|quickly unusual +12385|1588|9|2|22|32770.76|0.01|0.04|R|F|1993-01-01|1993-02-12|1993-01-19|DELIVER IN PERSON|TRUCK|fily. ironic, ironic +12385|1919|20|3|1|1820.91|0.00|0.08|R|F|1993-01-28|1993-01-05|1993-02-22|NONE|FOB|ns-- furiously unusual requests snooze a +12385|371|100|4|32|40683.84|0.01|0.02|A|F|1993-01-10|1993-01-01|1993-01-22|NONE|RAIL|quests wake blithely. regular +12385|1451|69|5|6|8114.70|0.02|0.08|A|F|1993-02-19|1993-01-29|1993-03-09|NONE|RAIL|l accounts thrash +12386|965|100|1|49|91432.04|0.10|0.06|R|F|1992-06-29|1992-06-01|1992-07-24|COLLECT COD|REG AIR| the blithely +12386|1751|36|2|34|56193.50|0.07|0.02|R|F|1992-05-26|1992-05-18|1992-06-15|TAKE BACK RETURN|MAIL|ronic theodolites. regular, +12386|1056|27|3|32|30625.60|0.08|0.06|A|F|1992-05-29|1992-05-08|1992-06-08|TAKE BACK RETURN|TRUCK|ecial deposits. furiously steal +12386|845|12|4|43|75071.12|0.03|0.08|A|F|1992-06-19|1992-05-25|1992-07-10|TAKE BACK RETURN|MAIL|odolites. evenly even requ +12386|1703|46|5|43|69002.10|0.07|0.02|A|F|1992-04-15|1992-05-17|1992-05-01|NONE|AIR|ons. furiously regular requ +12387|1287|99|1|46|54660.88|0.10|0.07|N|O|1997-09-18|1997-08-30|1997-10-03|TAKE BACK RETURN|AIR|ic accounts sleep. foxes sleep along the +12388|1869|13|1|47|83230.42|0.01|0.04|N|O|1997-12-07|1997-12-01|1997-12-08|COLLECT COD|SHIP|le after the slyly expres +12388|1693|94|2|17|27109.73|0.09|0.07|N|O|1998-01-13|1997-12-17|1998-01-25|NONE|MAIL|tructions +12388|1196|5|3|15|16457.85|0.04|0.08|N|O|1997-11-17|1998-01-12|1997-12-15|COLLECT COD|TRUCK|le carefully quickly regular acco +12388|1703|46|4|31|49745.70|0.02|0.04|N|O|1997-12-28|1997-11-26|1998-01-07|TAKE BACK RETURN|REG AIR|nic escapades. furiousl +12388|209|64|5|40|44368.00|0.03|0.01|N|O|1997-12-19|1997-11-15|1998-01-12|DELIVER IN PERSON|RAIL|y final packag +12388|1813|100|6|50|85740.50|0.10|0.00|N|O|1997-11-29|1997-12-10|1997-12-09|NONE|REG AIR|ding to the blit +12388|1162|99|7|29|30831.64|0.08|0.08|N|O|1997-11-01|1998-01-07|1997-11-11|NONE|AIR|foxes. quickly i +12389|793|58|1|31|52507.49|0.06|0.06|R|F|1994-09-07|1994-09-30|1994-09-29|DELIVER IN PERSON|TRUCK|fily carefully even foxes. even de +12389|562|23|2|44|64352.64|0.02|0.03|A|F|1994-10-29|1994-10-22|1994-11-13|DELIVER IN PERSON|REG AIR|s? unusual, even instruction +12389|1188|89|3|12|13070.16|0.07|0.04|R|F|1994-09-19|1994-10-18|1994-10-15|DELIVER IN PERSON|AIR|e special accounts. bl +12389|567|68|4|43|63105.08|0.10|0.03|A|F|1994-09-22|1994-09-20|1994-10-05|TAKE BACK RETURN|AIR|ts about the car +12389|67|18|5|20|19341.20|0.06|0.08|A|F|1994-10-04|1994-10-21|1994-10-06|NONE|TRUCK|s. special accounts wake blithely +12389|210|65|6|8|8881.68|0.01|0.02|R|F|1994-08-12|1994-10-06|1994-09-11|DELIVER IN PERSON|FOB|ic foxes. qui +12389|1508|9|7|19|26780.50|0.10|0.06|A|F|1994-10-14|1994-10-04|1994-10-15|TAKE BACK RETURN|MAIL|each carefully about the +12390|1676|59|1|16|25242.72|0.03|0.02|N|O|1996-07-21|1996-08-04|1996-08-20|TAKE BACK RETURN|TRUCK|egular packages boost slyly slyly s +12390|1392|69|2|8|10347.12|0.10|0.03|N|O|1996-07-20|1996-08-17|1996-08-17|DELIVER IN PERSON|REG AIR|sits. slyly ironic dependencies cajole furi +12390|1852|53|3|9|15784.65|0.09|0.06|N|O|1996-06-30|1996-08-18|1996-07-17|TAKE BACK RETURN|FOB|ymptotes cajole slyly after the depo +12391|480|68|1|26|35892.48|0.05|0.05|N|O|1998-10-26|1998-09-23|1998-11-24|DELIVER IN PERSON|TRUCK|s doubt fluffily furiously ironic t +12391|467|68|2|45|61535.70|0.07|0.03|N|O|1998-08-15|1998-08-29|1998-08-22|NONE|SHIP|the final platelets +12416|601|2|1|7|10511.20|0.10|0.05|R|F|1993-10-18|1993-09-01|1993-10-27|DELIVER IN PERSON|AIR|packages. slyly un +12417|452|53|1|25|33811.25|0.03|0.08|R|F|1993-11-23|1993-12-29|1993-12-11|NONE|AIR|unts haggl +12417|1843|30|2|21|36641.64|0.02|0.01|A|F|1993-11-26|1994-01-11|1993-12-12|NONE|AIR|nal instructions use quick +12417|1567|48|3|45|66085.20|0.08|0.00|R|F|1994-01-03|1994-01-07|1994-01-11|COLLECT COD|AIR|ts use carefully acc +12417|1441|42|4|45|60409.80|0.01|0.06|A|F|1994-02-04|1993-11-25|1994-02-28|NONE|TRUCK|ly even reque +12417|499|100|5|24|33587.76|0.01|0.05|A|F|1993-11-03|1993-12-25|1993-11-18|NONE|REG AIR|ages. furiously iron +12418|1922|23|1|7|12767.44|0.05|0.03|A|F|1992-05-20|1992-04-09|1992-06-09|COLLECT COD|RAIL|yly express idea +12418|867|67|2|5|8839.30|0.09|0.03|R|F|1992-04-14|1992-03-27|1992-05-07|COLLECT COD|RAIL|s affix quickly regular theodolite +12418|1109|46|3|38|38383.80|0.05|0.04|A|F|1992-05-11|1992-03-28|1992-06-07|NONE|MAIL|lites above the daringl +12418|103|4|4|34|34105.40|0.04|0.06|A|F|1992-06-05|1992-05-03|1992-06-19|DELIVER IN PERSON|MAIL|ecial requests run fluffily special de +12418|119|46|5|10|10191.10|0.10|0.05|A|F|1992-04-24|1992-05-03|1992-05-16|DELIVER IN PERSON|MAIL|dolites haggle carefully +12418|1890|91|6|12|21502.68|0.08|0.08|A|F|1992-06-15|1992-05-12|1992-06-17|COLLECT COD|SHIP|ly bold pl +12419|907|42|1|26|47005.40|0.09|0.06|N|O|1995-11-28|1995-12-26|1995-12-01|COLLECT COD|REG AIR|quests. unusual request +12419|1151|52|2|18|18938.70|0.02|0.07|N|O|1996-01-29|1995-12-20|1996-02-06|COLLECT COD|FOB|yly according +12419|1742|43|3|44|72324.56|0.08|0.00|N|O|1995-10-31|1996-01-08|1995-11-02|NONE|TRUCK|regular accounts cajole +12419|820|87|4|42|72274.44|0.04|0.04|N|O|1996-02-09|1995-11-15|1996-02-19|TAKE BACK RETURN|REG AIR|oost evenly. slyly final accounts after +12419|50|1|5|24|22801.20|0.05|0.06|N|O|1996-01-25|1996-01-14|1996-02-05|COLLECT COD|RAIL| beans. final, regular accounts nag slyly +12419|1440|58|6|19|25487.36|0.09|0.01|N|O|1995-11-30|1995-12-06|1995-12-20|COLLECT COD|FOB| instructions. care +12419|588|19|7|12|17862.96|0.00|0.04|N|O|1995-11-21|1995-11-18|1995-12-07|DELIVER IN PERSON|RAIL|gular courts. blithe +12420|644|7|1|39|60240.96|0.04|0.06|R|F|1994-04-06|1994-03-20|1994-04-25|NONE|AIR|pinto beans are sl +12420|1771|72|2|22|36800.94|0.09|0.03|A|F|1994-03-31|1994-02-03|1994-04-05|NONE|SHIP|e furiously regular theodolites. fl +12420|1351|90|3|5|6261.75|0.07|0.08|A|F|1994-01-16|1994-03-02|1994-02-01|NONE|REG AIR|excuses believe +12420|634|97|4|7|10742.41|0.10|0.08|A|F|1994-02-18|1994-02-09|1994-02-22|COLLECT COD|TRUCK|y. blithely even deposits haggl +12420|952|87|5|30|55588.50|0.02|0.03|R|F|1994-01-12|1994-02-26|1994-02-06|DELIVER IN PERSON|RAIL|ular deposits boost carefully. quickly +12420|1346|23|6|9|11226.06|0.08|0.03|A|F|1994-02-12|1994-02-12|1994-02-18|DELIVER IN PERSON|FOB| express packages unwind quickly slyly unus +12421|292|93|1|37|44114.73|0.05|0.01|N|O|1996-02-26|1995-12-15|1996-03-22|COLLECT COD|REG AIR|ithely final dolphins sleep afte +12421|1173|82|2|24|25780.08|0.00|0.03|N|O|1995-12-25|1995-12-20|1996-01-06|DELIVER IN PERSON|SHIP|ithely regular acc +12421|1305|20|3|43|51870.90|0.04|0.08|N|O|1995-11-09|1996-01-26|1995-11-20|TAKE BACK RETURN|REG AIR| carefully expr +12421|133|60|4|6|6198.78|0.09|0.08|N|O|1995-12-04|1996-01-05|1995-12-20|DELIVER IN PERSON|MAIL|pending excuses. express ideas detect +12421|505|36|5|43|60436.50|0.07|0.00|N|O|1996-02-20|1996-01-08|1996-03-06|TAKE BACK RETURN|FOB|ages. blit +12421|1167|68|6|27|28840.32|0.10|0.05|N|O|1996-01-13|1996-01-10|1996-01-18|NONE|TRUCK|s. quickly pend +12422|82|33|1|33|32408.64|0.08|0.05|N|O|1995-08-01|1995-08-11|1995-08-24|COLLECT COD|FOB|ts detect against the furiously brave sh +12422|1303|4|2|21|25290.30|0.05|0.08|N|O|1995-07-08|1995-07-24|1995-07-19|COLLECT COD|MAIL|ole. slyly regu +12422|1484|24|3|14|19396.72|0.02|0.00|N|F|1995-06-06|1995-08-09|1995-06-28|NONE|REG AIR|egular foxes. carefully regular +12422|1956|57|4|46|85465.70|0.09|0.08|N|O|1995-09-20|1995-06-26|1995-10-07|TAKE BACK RETURN|REG AIR|ag blithely +12422|93|94|5|16|15889.44|0.02|0.03|N|O|1995-06-19|1995-07-01|1995-06-27|DELIVER IN PERSON|TRUCK|ding to the ideas could use blithely fluf +12422|1497|76|6|29|40556.21|0.02|0.03|N|F|1995-06-16|1995-07-10|1995-06-24|DELIVER IN PERSON|FOB| bold sentimen +12423|900|34|1|2|3601.80|0.08|0.02|R|F|1992-09-05|1992-09-09|1992-09-14|COLLECT COD|RAIL|the fluffily daring pinto beans +12423|1264|76|2|26|30296.76|0.04|0.05|R|F|1992-08-07|1992-10-01|1992-08-11|COLLECT COD|MAIL|uickly ironic theodolites affix. i +12423|594|85|3|38|56794.42|0.05|0.05|R|F|1992-10-09|1992-08-20|1992-10-29|COLLECT COD|SHIP|ggedly unusual theodolites. dogged +12448|1113|22|1|16|16225.76|0.06|0.02|N|O|1996-03-01|1996-01-19|1996-03-06|DELIVER IN PERSON|TRUCK|ic requests; foxes detect s +12448|1226|27|2|17|19162.74|0.05|0.05|N|O|1996-03-05|1995-12-31|1996-04-02|COLLECT COD|TRUCK|e carefully deposits. furiously idle +12448|1588|9|3|42|62562.36|0.03|0.06|N|O|1996-01-24|1995-12-15|1996-02-10|NONE|FOB|ependencies? reg +12448|352|9|4|24|30056.40|0.01|0.05|N|O|1996-02-12|1996-01-05|1996-02-26|COLLECT COD|SHIP|uests haggle s +12448|1799|100|5|17|28913.43|0.07|0.05|N|O|1995-11-24|1996-01-30|1995-12-09|DELIVER IN PERSON|MAIL|foxes above the blithely sl +12449|1522|3|1|45|64058.40|0.02|0.03|A|F|1993-04-08|1993-03-28|1993-04-10|TAKE BACK RETURN|REG AIR|furiously pending accounts +12449|180|7|2|45|48608.10|0.09|0.02|A|F|1993-02-06|1993-04-26|1993-02-24|COLLECT COD|TRUCK|packages. carefully final deposits accor +12449|1682|65|3|16|25338.88|0.06|0.00|A|F|1993-02-04|1993-04-27|1993-03-06|COLLECT COD|RAIL|carefully always final foxe +12450|1091|92|1|40|39683.60|0.01|0.06|R|F|1994-03-31|1994-06-09|1994-04-07|TAKE BACK RETURN|SHIP|efully ironic p +12451|310|95|1|49|59305.19|0.07|0.06|R|F|1993-06-27|1993-07-05|1993-06-28|NONE|FOB|arefully even excuses wake fi +12451|1430|9|2|29|38611.47|0.04|0.06|A|F|1993-06-24|1993-07-11|1993-07-17|NONE|MAIL|pending platelets wake furiously accordin +12451|1010|81|3|19|17309.19|0.02|0.02|R|F|1993-06-04|1993-05-23|1993-06-15|NONE|MAIL|quests about +12451|824|25|4|49|84516.18|0.02|0.08|A|F|1993-05-08|1993-07-14|1993-05-26|COLLECT COD|REG AIR|wake carefull +12451|244|26|5|20|22884.80|0.09|0.05|R|F|1993-06-27|1993-05-29|1993-07-22|DELIVER IN PERSON|TRUCK|the furiously ironic packages? +12451|1561|82|6|28|40951.68|0.00|0.00|A|F|1993-06-13|1993-07-13|1993-07-04|DELIVER IN PERSON|MAIL|fully even foxes wake. special, final acco +12451|277|78|7|26|30609.02|0.00|0.03|R|F|1993-07-01|1993-06-30|1993-07-27|DELIVER IN PERSON|RAIL|ions: ironic packages eat +12452|1252|27|1|14|16145.50|0.08|0.01|R|F|1994-03-29|1994-01-17|1994-04-10|NONE|MAIL|es. carefully regular r +12452|1614|15|2|31|46983.91|0.10|0.07|R|F|1994-01-04|1994-01-15|1994-01-16|NONE|RAIL|g instructions. furious, bra +12452|717|14|3|31|50149.01|0.09|0.07|A|F|1994-01-14|1994-02-09|1994-01-31|NONE|MAIL|jole. special, +12452|616|10|4|44|66730.84|0.10|0.07|A|F|1994-03-29|1994-01-10|1994-04-14|DELIVER IN PERSON|TRUCK|osits. deposits sleep fluffi +12453|1788|89|1|33|55762.74|0.03|0.06|R|F|1994-03-26|1994-03-08|1994-04-06|TAKE BACK RETURN|RAIL|y ironic deposits sleep furiously pen +12453|1400|39|2|20|26028.00|0.00|0.03|R|F|1994-04-04|1994-03-08|1994-04-05|COLLECT COD|MAIL|r the ruthlessly regular +12453|1396|11|3|26|33732.14|0.08|0.05|R|F|1994-01-20|1994-04-07|1994-01-22|DELIVER IN PERSON|TRUCK|ges kindle after the final, unusual pinto +12453|833|34|4|1|1733.83|0.10|0.05|R|F|1994-04-20|1994-04-07|1994-04-26|NONE|REG AIR|y above the fluffily special foxes. f +12453|1584|25|5|28|41596.24|0.07|0.01|R|F|1994-05-09|1994-02-19|1994-06-06|NONE|SHIP|oxes grow past the carefully regular pint +12453|1393|70|6|17|22004.63|0.01|0.08|A|F|1994-02-12|1994-03-04|1994-03-07|DELIVER IN PERSON|MAIL|the carefully final pinto +12454|1170|7|1|39|41775.63|0.05|0.07|N|O|1997-04-01|1997-05-23|1997-04-25|DELIVER IN PERSON|AIR|ts integrate carefully about +12455|1996|29|1|37|70225.63|0.10|0.07|A|F|1992-12-14|1992-10-29|1992-12-28|TAKE BACK RETURN|MAIL|refully alo +12455|864|31|2|10|17648.60|0.09|0.01|A|F|1992-10-05|1992-11-26|1992-10-11|NONE|RAIL|s. ironic foxes are +12455|797|94|3|45|76400.55|0.05|0.06|R|F|1992-12-21|1992-11-06|1992-12-22|NONE|AIR|deposits. quickly even foxes wake quic +12455|995|96|4|29|54983.71|0.09|0.06|A|F|1992-11-23|1992-11-21|1992-11-24|DELIVER IN PERSON|AIR|l escapades. quickly ex +12455|448|36|5|2|2696.88|0.01|0.03|A|F|1992-09-30|1992-10-28|1992-10-05|DELIVER IN PERSON|REG AIR|xpress packages cajole. quickly +12480|613|7|1|30|45408.30|0.05|0.02|A|F|1994-09-11|1994-09-10|1994-09-17|COLLECT COD|RAIL| the quickly regular ideas. +12480|521|12|2|22|31273.44|0.06|0.08|R|F|1994-07-31|1994-08-26|1994-08-12|NONE|RAIL|posits. slyly fluffy dolphins are regular, +12480|869|70|3|26|46016.36|0.02|0.03|R|F|1994-11-05|1994-09-16|1994-11-06|COLLECT COD|TRUCK|ide the slyly +12481|852|52|1|14|24539.90|0.02|0.00|N|O|1995-11-05|1995-08-18|1995-11-20|TAKE BACK RETURN|AIR|ss packages cajole. ironic, regul +12481|1291|92|2|23|27422.67|0.04|0.03|N|O|1995-09-22|1995-09-15|1995-09-27|NONE|TRUCK|ely against the foxes. +12481|1202|3|3|23|25373.60|0.09|0.04|N|O|1995-08-10|1995-08-15|1995-09-07|COLLECT COD|RAIL|s snooze. carefully express accounts ha +12481|1292|67|4|9|10739.61|0.08|0.08|N|O|1995-07-31|1995-10-05|1995-08-17|DELIVER IN PERSON|TRUCK|jole furiously. slowly unusual ac +12482|168|21|1|10|10681.60|0.03|0.05|N|O|1996-02-19|1996-03-05|1996-03-09|DELIVER IN PERSON|RAIL|ckly silent notornis sleep sl +12482|1175|12|2|40|43046.80|0.05|0.06|N|O|1996-04-10|1996-03-09|1996-04-22|NONE|TRUCK|ns. fluffily regular somas against the blit +12482|138|39|3|50|51906.50|0.10|0.02|N|O|1996-05-04|1996-03-04|1996-05-28|COLLECT COD|TRUCK|ayers wake quickly quickly +12482|179|58|4|8|8633.36|0.07|0.02|N|O|1996-03-18|1996-04-06|1996-04-16|COLLECT COD|MAIL|r pinto beans +12482|1128|29|5|45|46310.40|0.10|0.04|N|O|1996-01-11|1996-02-10|1996-02-10|NONE|TRUCK|: special packages above the furiously +12483|894|28|1|22|39487.58|0.07|0.08|R|F|1993-10-31|1993-10-27|1993-11-02|NONE|TRUCK|blithely. epitaphs boost c +12483|1888|32|2|28|50116.64|0.10|0.06|R|F|1993-11-19|1993-10-07|1993-11-23|DELIVER IN PERSON|REG AIR|. slyly even theodolites boost. carefull +12483|11|87|3|29|26419.29|0.07|0.00|R|F|1993-08-22|1993-09-22|1993-09-04|NONE|REG AIR|ng packages affix deposi +12483|512|73|4|28|39550.28|0.01|0.04|R|F|1993-10-28|1993-09-23|1993-11-10|COLLECT COD|RAIL|y bold requests ca +12483|1299|37|5|1|1200.29|0.05|0.01|R|F|1993-08-12|1993-09-11|1993-08-27|TAKE BACK RETURN|MAIL|lyly regular packages. slyly r +12484|351|80|1|34|42545.90|0.06|0.02|N|O|1995-09-28|1995-11-06|1995-10-19|COLLECT COD|TRUCK|quickly even dependenci +12484|362|47|2|30|37870.80|0.10|0.00|N|O|1995-12-12|1995-10-13|1995-12-25|COLLECT COD|SHIP|ly unusual accounts boost furiously ac +12484|1671|54|3|26|40889.42|0.01|0.01|N|O|1995-09-29|1995-10-09|1995-10-28|NONE|REG AIR|have to wake blithely: ironically ironic +12484|75|26|4|1|975.07|0.04|0.07|N|O|1995-11-15|1995-11-16|1995-12-02|DELIVER IN PERSON|REG AIR|s mold blithely boldly express theodolit +12484|126|79|5|50|51306.00|0.01|0.00|N|O|1995-09-19|1995-10-16|1995-09-30|TAKE BACK RETURN|RAIL|after the pending deposits. ex +12484|1282|57|6|14|16565.92|0.07|0.08|N|O|1995-12-07|1995-10-27|1995-12-21|TAKE BACK RETURN|AIR|r theodolites about the unusual foxes belie +12485|1051|52|1|41|39034.05|0.03|0.07|R|F|1993-11-14|1993-10-15|1993-11-30|COLLECT COD|RAIL|egular packages. car +12485|1190|27|2|32|34918.08|0.01|0.07|R|F|1993-11-26|1993-09-10|1993-12-05|DELIVER IN PERSON|FOB|furiously special theodolites sl +12485|361|18|3|8|10090.88|0.08|0.01|R|F|1993-10-05|1993-10-23|1993-10-27|TAKE BACK RETURN|RAIL|hely regular instructions. +12485|1213|14|4|28|31197.88|0.07|0.04|A|F|1993-11-17|1993-11-03|1993-12-07|TAKE BACK RETURN|MAIL|ges. deposits against the regu +12485|103|30|5|29|29089.90|0.05|0.03|A|F|1993-08-31|1993-09-09|1993-09-22|TAKE BACK RETURN|FOB|eposits haggle furiously. regula +12485|1150|87|6|19|19971.85|0.10|0.08|A|F|1993-08-17|1993-09-07|1993-09-07|COLLECT COD|MAIL| packages. s +12485|212|40|7|43|47825.03|0.08|0.01|R|F|1993-09-12|1993-10-16|1993-09-30|COLLECT COD|FOB|lphins. instructions among the slyly s +12486|1471|72|1|26|35684.22|0.09|0.04|A|F|1995-04-30|1995-04-11|1995-05-14|NONE|SHIP| carefully re +12486|1185|58|2|19|20637.42|0.08|0.04|A|F|1995-06-01|1995-04-10|1995-06-07|DELIVER IN PERSON|MAIL|xpress asymptotes u +12486|837|4|3|15|26067.45|0.07|0.04|N|F|1995-06-07|1995-04-09|1995-06-22|TAKE BACK RETURN|SHIP|y idle deposits. furiously +12486|197|76|4|19|20846.61|0.06|0.04|N|O|1995-06-20|1995-05-13|1995-07-19|NONE|RAIL|ts nag. slyly reg +12486|1106|7|5|20|20142.00|0.10|0.05|N|F|1995-06-16|1995-05-08|1995-06-28|TAKE BACK RETURN|MAIL|riously special foxes sleep quickly. f +12486|997|32|6|4|7591.96|0.08|0.05|R|F|1995-03-05|1995-04-03|1995-03-07|DELIVER IN PERSON|TRUCK| slyly ironic pinto beans wake +12486|1580|81|7|38|56300.04|0.01|0.05|N|F|1995-06-15|1995-04-17|1995-06-29|NONE|SHIP|s. carefully regular braids haggle sly +12487|1277|78|1|34|40061.18|0.02|0.05|R|F|1995-02-07|1995-02-28|1995-02-27|TAKE BACK RETURN|FOB|endencies. unusual ideas nod carefully +12512|1248|49|1|25|28731.00|0.03|0.08|N|O|1996-05-02|1996-05-17|1996-05-18|NONE|MAIL|the final, ruthless requests affix +12512|1784|69|2|28|47201.84|0.10|0.01|N|O|1996-07-04|1996-05-06|1996-07-22|DELIVER IN PERSON|AIR| packages. regular accounts haggle fur +12512|1288|63|3|27|32110.56|0.03|0.06|N|O|1996-07-22|1996-05-11|1996-07-25|NONE|RAIL|even, express requests. furiously +12513|254|82|1|31|35781.75|0.07|0.02|N|O|1997-11-18|1997-10-14|1997-12-18|NONE|TRUCK|gside of the re +12513|827|27|2|2|3455.64|0.01|0.04|N|O|1997-09-13|1997-11-28|1997-09-24|TAKE BACK RETURN|REG AIR|ing notornis +12513|1765|8|3|16|26668.16|0.09|0.01|N|O|1997-10-10|1997-10-10|1997-10-15|TAKE BACK RETURN|FOB|foxes. ironic, ironic accounts will +12514|1399|100|1|22|28608.58|0.04|0.06|A|F|1994-08-23|1994-05-28|1994-09-02|COLLECT COD|TRUCK|cial foxes are blithel +12514|676|39|2|6|9460.02|0.01|0.00|R|F|1994-05-27|1994-07-07|1994-06-23|TAKE BACK RETURN|AIR|ily regular accounts poach according to th +12515|1733|76|1|37|60485.01|0.00|0.05|A|F|1993-06-07|1993-07-28|1993-07-01|TAKE BACK RETURN|FOB|ages hang above the final requests. +12515|1911|56|2|29|52574.39|0.07|0.07|A|F|1993-07-03|1993-07-17|1993-07-28|COLLECT COD|MAIL|fily pending package +12515|162|15|3|11|11683.76|0.02|0.07|A|F|1993-06-11|1993-07-23|1993-06-25|COLLECT COD|REG AIR|beans. quickly regular +12516|1816|17|1|35|60123.35|0.09|0.03|R|F|1994-08-04|1994-08-13|1994-08-23|TAKE BACK RETURN|MAIL|refully final depo +12516|619|13|2|28|42549.08|0.03|0.04|R|F|1994-05-26|1994-07-10|1994-06-24|COLLECT COD|SHIP| about the quickly expres +12516|1043|44|3|14|13216.56|0.05|0.08|R|F|1994-09-23|1994-07-18|1994-10-22|DELIVER IN PERSON|SHIP|e the slyly f +12517|546|37|1|21|30377.34|0.07|0.07|N|O|1997-03-27|1997-03-24|1997-04-01|COLLECT COD|RAIL|l dependencies hagg +12517|653|16|2|17|26412.05|0.08|0.08|N|O|1997-02-22|1997-03-24|1997-03-21|COLLECT COD|REG AIR|ully even reque +12517|1803|4|3|17|28981.60|0.05|0.01|N|O|1997-04-18|1997-03-24|1997-04-26|NONE|SHIP|mong the deposits. +12518|631|25|1|11|16847.93|0.08|0.03|A|F|1993-10-25|1993-09-09|1993-10-31|TAKE BACK RETURN|TRUCK|l frays along the bold, bol +12518|753|86|2|19|31421.25|0.08|0.00|A|F|1993-11-03|1993-09-25|1993-11-16|COLLECT COD|MAIL| asymptotes cajole unusual req +12518|1763|90|3|21|34959.96|0.09|0.07|A|F|1993-09-13|1993-10-12|1993-10-13|NONE|RAIL|t according to th +12518|1718|3|4|7|11337.97|0.05|0.02|A|F|1993-09-16|1993-10-03|1993-09-17|DELIVER IN PERSON|TRUCK|st the even foxes. requests haggle blithe +12518|1669|11|5|6|9423.96|0.05|0.00|A|F|1993-07-27|1993-10-21|1993-08-21|DELIVER IN PERSON|TRUCK|ular depos +12518|1064|35|6|3|2895.18|0.03|0.00|R|F|1993-08-12|1993-10-19|1993-08-13|TAKE BACK RETURN|TRUCK|quiet, silent packages sleep quickly +12518|78|79|7|50|48903.50|0.00|0.07|A|F|1993-10-10|1993-08-22|1993-10-11|NONE|MAIL|ets wake slyly. theodolites cajole fluffi +12519|460|90|1|23|31290.58|0.08|0.02|R|F|1994-04-30|1994-03-15|1994-05-04|DELIVER IN PERSON|SHIP|ly. pending instr +12519|487|75|2|47|65211.56|0.05|0.02|A|F|1994-03-08|1994-03-01|1994-04-04|DELIVER IN PERSON|SHIP|e across the fluffily regular packages. +12519|283|11|3|26|30765.28|0.08|0.00|R|F|1994-01-11|1994-02-28|1994-02-04|DELIVER IN PERSON|AIR|g the blithely special accou +12519|1916|61|4|4|7271.64|0.07|0.04|A|F|1994-04-19|1994-03-21|1994-05-04|NONE|RAIL|wake slyly express requests. fur +12519|1485|3|5|20|27729.60|0.03|0.02|A|F|1994-02-17|1994-02-02|1994-02-24|DELIVER IN PERSON|MAIL|sh regular, ironic +12519|72|23|6|36|34994.52|0.09|0.01|A|F|1994-02-25|1994-02-20|1994-03-20|NONE|MAIL|, quiet accounts are al +12544|1333|34|1|25|30858.25|0.04|0.05|A|F|1994-05-22|1994-04-24|1994-06-01|NONE|FOB| ironic accounts +12544|1455|34|2|24|32554.80|0.04|0.02|R|F|1994-04-07|1994-05-09|1994-04-14|COLLECT COD|TRUCK|furiously according to the theodolites. +12545|1750|51|1|4|6607.00|0.03|0.06|N|O|1996-07-19|1996-09-13|1996-08-01|DELIVER IN PERSON|RAIL|unusual ide +12545|1154|27|2|42|44316.30|0.07|0.04|N|O|1996-08-31|1996-08-09|1996-09-09|COLLECT COD|SHIP|as are carefully ironic pinto beans. qui +12545|1324|25|3|20|24506.40|0.10|0.07|N|O|1996-07-08|1996-09-02|1996-07-21|COLLECT COD|SHIP| packages engage carefully according +12545|14|65|4|1|914.01|0.00|0.08|N|O|1996-07-18|1996-09-16|1996-07-21|NONE|SHIP|carefully bol +12546|1202|40|1|4|4412.80|0.00|0.03|N|O|1996-03-30|1996-04-19|1996-04-17|DELIVER IN PERSON|FOB|y unusual foxes h +12546|612|75|2|5|7563.05|0.06|0.07|N|O|1996-05-05|1996-03-30|1996-05-21|TAKE BACK RETURN|FOB|. furiously express Tiresias sleep +12546|902|71|3|28|50481.20|0.01|0.03|N|O|1996-03-13|1996-04-27|1996-03-29|COLLECT COD|TRUCK|eposits; carefully ironic requ +12546|1038|39|4|25|23475.75|0.06|0.01|N|O|1996-02-23|1996-03-28|1996-02-24|NONE|TRUCK|ously ironic deposi +12546|905|6|5|2|3611.80|0.06|0.01|N|O|1996-03-15|1996-03-18|1996-03-18|DELIVER IN PERSON|TRUCK|refully final ideas caj +12547|1529|30|1|50|71526.00|0.07|0.05|N|O|1998-08-04|1998-06-23|1998-08-07|DELIVER IN PERSON|FOB|hely unusual deposits cajo +12547|1721|22|2|46|74645.12|0.00|0.02|N|O|1998-06-04|1998-05-19|1998-06-20|NONE|AIR|ly regular requests +12547|1487|27|3|1|1388.48|0.09|0.06|N|O|1998-04-16|1998-07-11|1998-04-22|TAKE BACK RETURN|RAIL|about the quickly regular fret +12547|927|96|4|32|58493.44|0.03|0.02|N|O|1998-07-08|1998-06-24|1998-08-03|DELIVER IN PERSON|SHIP|yly. furiously reg +12548|1565|86|1|27|39597.12|0.03|0.08|N|O|1998-01-19|1998-01-29|1998-01-26|TAKE BACK RETURN|FOB|he furious +12548|313|14|2|31|37612.61|0.10|0.07|N|O|1997-12-13|1998-02-08|1997-12-25|COLLECT COD|TRUCK|ys dogged deposits. carefully ironic depen +12548|69|20|3|23|22288.38|0.03|0.01|N|O|1997-12-15|1998-02-16|1997-12-18|DELIVER IN PERSON|MAIL|nstructions are furiousl +12548|1165|66|4|41|43712.56|0.03|0.05|N|O|1998-03-19|1997-12-31|1998-04-12|DELIVER IN PERSON|AIR|riously final instructions use qui +12548|731|64|5|40|65269.20|0.05|0.06|N|O|1997-12-29|1998-01-29|1998-01-01|TAKE BACK RETURN|TRUCK|nic platelets solv +12549|371|100|1|13|16527.81|0.05|0.03|N|O|1997-08-07|1997-07-12|1997-08-08|NONE|RAIL|. carefully ironic theodo +12549|1523|44|2|33|47009.16|0.05|0.01|N|O|1997-07-05|1997-08-20|1997-07-22|NONE|AIR|requests. furiously even accounts n +12549|1528|9|3|28|40026.56|0.04|0.02|N|O|1997-07-09|1997-07-06|1997-07-21|NONE|RAIL|oxes haggle against the qui +12550|104|57|1|3|3012.30|0.01|0.06|R|F|1993-03-17|1993-05-22|1993-04-03|DELIVER IN PERSON|RAIL|accounts. furiously bold ac +12550|1152|25|2|35|36860.25|0.08|0.07|R|F|1993-05-17|1993-05-23|1993-06-09|TAKE BACK RETURN|MAIL| accounts. furiously regular p +12551|1657|99|1|30|46759.50|0.01|0.02|A|F|1992-07-31|1992-09-10|1992-08-20|DELIVER IN PERSON|RAIL|equests. carefu +12551|90|66|2|26|25742.34|0.04|0.08|R|F|1992-10-11|1992-07-15|1992-10-13|TAKE BACK RETURN|TRUCK|fully special accou +12551|1314|29|3|25|30382.75|0.07|0.00|A|F|1992-08-26|1992-08-21|1992-09-05|DELIVER IN PERSON|MAIL|he blithely final acc +12551|805|5|4|47|80172.60|0.08|0.01|R|F|1992-07-13|1992-07-31|1992-07-30|NONE|TRUCK|kly unusual instructio +12576|1311|26|1|28|33944.68|0.03|0.03|R|F|1993-04-02|1993-04-10|1993-04-17|DELIVER IN PERSON|RAIL|ll have to are sly +12577|1459|77|1|8|10883.60|0.06|0.04|N|O|1998-06-09|1998-07-29|1998-06-28|TAKE BACK RETURN|SHIP|egular depo +12577|173|26|2|17|18243.89|0.05|0.07|N|O|1998-06-04|1998-08-06|1998-06-06|DELIVER IN PERSON|AIR|refully ironic requests. fin +12577|423|53|3|49|64847.58|0.00|0.06|N|O|1998-06-14|1998-06-30|1998-06-21|NONE|FOB|ickly silent waters cajole furiously a +12577|1042|13|4|43|40550.72|0.10|0.01|N|O|1998-07-15|1998-07-09|1998-08-09|TAKE BACK RETURN|AIR|ily carefully unusual request +12578|1867|68|1|32|56603.52|0.01|0.04|N|O|1996-12-16|1997-01-28|1996-12-27|TAKE BACK RETURN|AIR|lyly express pinto +12578|81|32|2|21|20602.68|0.05|0.03|N|O|1997-01-18|1997-02-03|1997-01-21|COLLECT COD|SHIP|ncies lose. requests after the furiously b +12578|329|86|3|49|60236.68|0.09|0.07|N|O|1997-02-03|1997-01-18|1997-02-28|DELIVER IN PERSON|MAIL|y express foxes +12578|1216|17|4|11|12289.31|0.08|0.04|N|O|1996-12-07|1997-01-01|1997-01-04|TAKE BACK RETURN|FOB|le after th +12578|1081|82|5|17|16695.36|0.01|0.06|N|O|1996-12-20|1997-01-18|1996-12-24|DELIVER IN PERSON|FOB|ronic accounts sublate. final requests wak +12578|473|3|6|17|23348.99|0.07|0.06|N|O|1997-03-16|1996-12-28|1997-04-01|DELIVER IN PERSON|FOB|ts. furiously permanent excuses +12578|589|90|7|47|70010.26|0.06|0.00|N|O|1997-03-05|1996-12-30|1997-03-25|TAKE BACK RETURN|FOB|ccounts boost quickly final, pending req +12579|1879|66|1|26|46302.62|0.02|0.04|N|O|1995-07-08|1995-08-31|1995-07-26|NONE|TRUCK|at the carefully silent ideas. ironic, +12580|9|35|1|32|29088.00|0.10|0.07|R|F|1993-04-05|1993-02-28|1993-05-05|COLLECT COD|REG AIR|s affix. carefully +12580|1526|7|2|10|14275.20|0.03|0.00|A|F|1993-04-22|1993-03-29|1993-05-08|DELIVER IN PERSON|MAIL| haggle carefully quickly ironic d +12581|1660|43|1|37|57781.42|0.06|0.03|A|F|1994-11-11|1994-12-03|1994-12-06|NONE|SHIP|y regular foxes. special +12581|1050|56|2|25|23776.25|0.04|0.07|A|F|1994-12-08|1994-12-06|1995-01-03|DELIVER IN PERSON|FOB|uriously express dep +12581|1019|90|3|28|25760.28|0.01|0.02|R|F|1994-11-13|1994-12-23|1994-11-22|COLLECT COD|TRUCK|oss the quickly +12582|1067|38|1|23|22265.38|0.06|0.08|A|F|1993-03-21|1993-04-08|1993-04-08|TAKE BACK RETURN|AIR|refully regular reque +12583|609|3|1|30|45288.00|0.09|0.04|N|O|1996-02-10|1996-03-27|1996-02-23|DELIVER IN PERSON|AIR|ial, regular plate +12608|614|15|1|4|6058.44|0.10|0.04|R|F|1993-06-16|1993-04-09|1993-07-08|NONE|TRUCK|ironic accounts sleep along the quickly +12608|1815|16|2|7|12017.67|0.08|0.01|R|F|1993-06-22|1993-06-04|1993-07-02|TAKE BACK RETURN|AIR|side of the u +12608|1418|97|3|36|47498.76|0.06|0.01|A|F|1993-05-04|1993-05-26|1993-05-30|COLLECT COD|MAIL|nic realms. sly +12609|684|47|1|31|49125.08|0.03|0.06|N|O|1996-02-08|1996-04-01|1996-02-24|DELIVER IN PERSON|MAIL|en pinto beans haggle furiously according +12609|1926|71|2|15|27418.80|0.08|0.02|N|O|1996-04-29|1996-03-25|1996-05-24|COLLECT COD|TRUCK|ously unusual platelets. carefully +12609|681|82|3|24|37960.32|0.04|0.01|N|O|1996-05-15|1996-03-25|1996-06-13|COLLECT COD|MAIL|ructions. carefully bold asy +12609|452|11|4|11|14876.95|0.01|0.02|N|O|1996-05-15|1996-03-21|1996-06-06|COLLECT COD|TRUCK|nal ideas along th +12610|1832|33|1|6|10402.98|0.07|0.04|A|F|1993-09-26|1993-09-13|1993-10-16|NONE|TRUCK| final, bold platele +12611|750|15|1|26|42919.50|0.04|0.07|N|O|1995-11-08|1995-12-06|1995-11-17|TAKE BACK RETURN|RAIL|ieve carefully along t +12611|1248|23|2|35|40223.40|0.05|0.04|N|O|1995-12-06|1995-12-24|1995-12-28|COLLECT COD|TRUCK|uses across the express, express accoun +12611|973|74|3|3|5621.91|0.00|0.02|N|O|1996-01-20|1995-12-14|1996-01-26|NONE|RAIL|lyly ironic accounts wake slyly special ins +12611|1260|98|4|48|55740.48|0.06|0.03|N|O|1996-01-07|1995-12-26|1996-01-12|NONE|MAIL|al requests should +12611|739|72|5|25|40993.25|0.01|0.04|N|O|1995-11-22|1995-12-25|1995-11-27|COLLECT COD|TRUCK|l requests cajole stealthy asymptotes-- re +12612|436|66|1|25|33410.75|0.04|0.08|R|F|1994-02-17|1994-02-07|1994-03-11|COLLECT COD|FOB|e blithely silent platelets are quickly +12612|1568|9|2|36|52904.16|0.06|0.08|A|F|1994-02-27|1994-01-24|1994-03-18|DELIVER IN PERSON|MAIL|riously regular requ +12612|1262|74|3|45|52346.70|0.01|0.03|R|F|1994-03-14|1994-03-01|1994-04-04|COLLECT COD|AIR|arefully bold instructions caj +12612|169|70|4|15|16037.40|0.01|0.08|A|F|1994-01-18|1994-02-05|1994-02-09|NONE|FOB|ly among the furiously pending theodo +12612|1395|72|5|4|5185.56|0.06|0.01|R|F|1994-04-11|1994-01-21|1994-04-12|COLLECT COD|SHIP|nal excuses boost fur +12612|1376|15|6|17|21715.29|0.06|0.06|A|F|1994-01-27|1994-02-06|1994-01-31|DELIVER IN PERSON|RAIL|slyly regular requests. special +12613|286|68|1|17|20166.76|0.10|0.04|A|F|1993-04-18|1993-06-04|1993-05-06|DELIVER IN PERSON|REG AIR|ic theodolites around the slyly even pac +12613|1282|94|2|9|10649.52|0.03|0.07|A|F|1993-04-20|1993-05-26|1993-05-15|COLLECT COD|TRUCK|ajole blithely even p +12613|1184|85|3|9|9766.62|0.06|0.02|R|F|1993-04-16|1993-07-03|1993-05-12|COLLECT COD|RAIL|s sleep careful +12613|870|37|4|35|61980.45|0.04|0.06|R|F|1993-04-24|1993-05-18|1993-04-27|NONE|TRUCK|osits wake blithely slyly u +12613|495|25|5|11|15350.39|0.10|0.01|R|F|1993-08-01|1993-07-07|1993-08-06|NONE|AIR|iously above the blithely iro +12614|1539|80|1|25|36013.25|0.02|0.05|N|O|1996-05-16|1996-05-25|1996-06-03|NONE|FOB|s. ironic, even packages should h +12614|1789|90|2|18|30434.04|0.08|0.07|N|O|1996-04-27|1996-04-12|1996-05-08|TAKE BACK RETURN|FOB|s by the idly ironic instru +12614|876|76|3|39|69297.93|0.10|0.06|N|O|1996-03-07|1996-04-20|1996-03-28|NONE|RAIL|ccounts across the blithely bol +12614|1962|95|4|35|65238.60|0.01|0.01|N|O|1996-05-30|1996-05-27|1996-06-14|DELIVER IN PERSON|REG AIR| players haggle. special dinos sleep +12614|1553|94|5|46|66909.30|0.03|0.00|N|O|1996-04-19|1996-04-25|1996-05-19|NONE|RAIL|out the furiously special re +12614|41|67|6|11|10351.44|0.09|0.04|N|O|1996-06-09|1996-04-15|1996-06-20|DELIVER IN PERSON|FOB|instructions. regular packages sleep ac +12615|1406|7|1|16|20918.40|0.05|0.05|A|F|1995-04-19|1995-05-18|1995-05-04|COLLECT COD|TRUCK|ously final packages d +12640|1959|48|1|21|39079.95|0.01|0.03|N|O|1998-07-31|1998-09-05|1998-08-05|NONE|TRUCK|uriously ironic deposit +12640|1202|3|2|33|36405.60|0.02|0.03|N|O|1998-09-26|1998-10-14|1998-10-24|NONE|RAIL|carefully quick platelets. +12641|351|8|1|33|41294.55|0.03|0.05|A|F|1995-05-01|1995-05-14|1995-05-29|TAKE BACK RETURN|AIR|d instructions cajole sl +12641|950|19|2|7|12956.65|0.04|0.03|A|F|1995-04-30|1995-04-18|1995-05-24|COLLECT COD|MAIL|deposits haggle bold, +12641|416|4|3|24|31593.84|0.03|0.05|R|F|1995-04-01|1995-04-17|1995-04-04|DELIVER IN PERSON|FOB|luffily reg +12641|1989|34|4|3|5672.94|0.07|0.03|R|F|1995-02-26|1995-05-06|1995-03-19|COLLECT COD|REG AIR|o the fluffil +12641|682|45|5|39|61724.52|0.04|0.03|A|F|1995-04-14|1995-03-28|1995-05-11|COLLECT COD|TRUCK|encies. reg +12641|1942|75|6|46|84821.24|0.06|0.08|N|F|1995-06-17|1995-04-10|1995-07-11|TAKE BACK RETURN|SHIP| platelets. courts thras +12642|246|74|1|40|45849.60|0.04|0.01|R|F|1994-07-08|1994-07-03|1994-07-15|COLLECT COD|AIR|y. furiously quick pack +12642|1217|55|2|13|14536.73|0.08|0.08|A|F|1994-08-23|1994-05-28|1994-09-20|TAKE BACK RETURN|SHIP| pending packages cajole slyly i +12642|741|38|3|1|1641.74|0.07|0.01|R|F|1994-06-01|1994-07-01|1994-06-11|COLLECT COD|RAIL|ts. regular, expr +12642|1609|10|4|37|55892.20|0.00|0.05|R|F|1994-07-07|1994-07-25|1994-07-19|DELIVER IN PERSON|RAIL|o beans boost furiously against the pint +12642|321|6|5|20|24426.40|0.01|0.04|R|F|1994-06-12|1994-05-29|1994-07-04|DELIVER IN PERSON|MAIL|. dependenci +12642|1530|11|6|26|37219.78|0.03|0.07|A|F|1994-08-08|1994-07-13|1994-08-27|COLLECT COD|AIR|e the final pinto beans. packages hag +12642|1409|49|7|50|65520.00|0.04|0.03|A|F|1994-06-09|1994-06-15|1994-06-17|COLLECT COD|RAIL|ckages. sile +12643|1190|91|1|25|27279.75|0.03|0.00|A|F|1993-05-25|1993-06-13|1993-06-10|DELIVER IN PERSON|REG AIR|e carefully +12643|1873|3|2|40|70994.80|0.09|0.06|R|F|1993-07-13|1993-05-04|1993-07-27|COLLECT COD|TRUCK|kages cajole blithely sly +12643|291|46|3|25|29782.25|0.07|0.06|R|F|1993-04-15|1993-04-26|1993-05-09|TAKE BACK RETURN|MAIL| requests. express p +12644|1098|4|1|19|18982.71|0.09|0.04|A|F|1992-02-07|1992-03-31|1992-02-24|DELIVER IN PERSON|AIR|r furiously final packa +12644|1922|67|2|39|71132.88|0.01|0.05|R|F|1992-04-21|1992-03-27|1992-04-30|COLLECT COD|FOB|t quickly after the ironic, final asymptote +12644|1709|36|3|32|51542.40|0.06|0.05|A|F|1992-02-25|1992-04-07|1992-03-08|DELIVER IN PERSON|RAIL|osits detect against the quickly ironic +12644|730|31|4|5|8153.65|0.03|0.00|A|F|1992-04-23|1992-04-23|1992-04-25|COLLECT COD|FOB|ts boost at the ironic br +12645|1127|64|1|17|17478.04|0.01|0.00|A|F|1994-08-25|1994-08-13|1994-09-20|COLLECT COD|RAIL|iet, bold requests wake. care +12645|446|76|2|34|45778.96|0.03|0.06|R|F|1994-09-07|1994-08-27|1994-09-12|DELIVER IN PERSON|RAIL|es dazzle carefully. quick, unusual p +12645|1506|27|3|32|45040.00|0.10|0.02|A|F|1994-09-21|1994-08-06|1994-09-24|NONE|FOB|sly along the regular deposits. even, +12645|172|25|4|11|11793.87|0.01|0.06|A|F|1994-07-12|1994-09-20|1994-07-23|NONE|AIR|. blithely special theodolites according t +12645|1627|10|5|50|76431.00|0.09|0.00|A|F|1994-11-01|1994-09-14|1994-11-16|DELIVER IN PERSON|MAIL|inal requests impress fluffily slyly ir +12645|295|77|6|8|9562.32|0.03|0.01|R|F|1994-10-08|1994-09-25|1994-10-27|TAKE BACK RETURN|AIR|bout the furiously regular depos +12645|1225|37|7|32|36039.04|0.07|0.03|R|F|1994-10-20|1994-09-04|1994-11-19|TAKE BACK RETURN|AIR|theodolites slee +12646|1578|19|1|35|51784.95|0.07|0.06|A|F|1993-05-20|1993-04-08|1993-05-22|DELIVER IN PERSON|FOB|l requests. bold, bold instructions a +12646|1137|10|2|29|30105.77|0.06|0.03|A|F|1993-03-02|1993-05-08|1993-03-15|COLLECT COD|TRUCK|nstructions. quickly express requ +12646|1066|67|3|40|38682.40|0.05|0.00|R|F|1993-05-16|1993-04-07|1993-05-19|DELIVER IN PERSON|TRUCK|pinto beans sol +12647|302|59|1|32|38473.60|0.07|0.07|N|O|1997-06-02|1997-05-15|1997-06-10|NONE|RAIL|thely bold requests. ironic, even cour +12672|1716|1|1|6|9706.26|0.01|0.05|R|F|1994-09-14|1994-08-30|1994-09-17|DELIVER IN PERSON|FOB|y ironic ideas. evenly special orbits int +12672|455|43|2|20|27109.00|0.02|0.02|A|F|1994-08-09|1994-08-16|1994-09-03|NONE|AIR|beans cajole blithel +12673|1322|61|1|18|22019.76|0.07|0.07|R|F|1994-08-22|1994-08-31|1994-09-20|COLLECT COD|SHIP|ckages haggle c +12674|1453|93|1|29|39279.05|0.08|0.00|A|F|1992-09-21|1992-08-31|1992-10-01|DELIVER IN PERSON|AIR|furiously unusu +12674|1102|11|2|21|21065.10|0.08|0.06|R|F|1992-08-19|1992-09-06|1992-08-23|NONE|RAIL|c accounts are carefully +12674|228|56|3|21|23692.62|0.01|0.03|R|F|1992-10-09|1992-08-14|1992-10-20|TAKE BACK RETURN|RAIL| fluffy deposits. quickly bold excus +12674|1149|86|4|9|9451.26|0.01|0.01|A|F|1992-08-19|1992-09-28|1992-09-13|TAKE BACK RETURN|MAIL|al accounts. furiously express pinto beans +12674|178|57|5|6|6469.02|0.00|0.03|R|F|1992-08-14|1992-10-01|1992-08-27|TAKE BACK RETURN|FOB|quickly special f +12675|774|7|1|17|28471.09|0.06|0.08|R|F|1994-02-03|1994-03-19|1994-02-12|NONE|FOB|ites. instructions use always accordin +12675|84|60|2|35|34442.80|0.08|0.01|A|F|1994-02-11|1994-03-08|1994-02-28|DELIVER IN PERSON|MAIL|de of the slyly bold accounts sleep ag +12675|1506|7|3|41|57707.50|0.05|0.07|A|F|1994-05-11|1994-03-06|1994-05-15|DELIVER IN PERSON|FOB|ly regular platelets haggle carefully reg +12675|1602|26|4|26|39093.60|0.08|0.00|R|F|1994-05-10|1994-03-24|1994-06-06|TAKE BACK RETURN|AIR|ns. furiousl +12676|1312|13|1|5|6066.55|0.03|0.00|A|F|1994-04-17|1994-03-10|1994-04-23|NONE|AIR|ly final theodolites. even instructi +12677|1393|32|1|30|38831.70|0.10|0.03|N|O|1996-08-12|1996-08-12|1996-08-15|DELIVER IN PERSON|SHIP|onic platelets. carefully pending ideas abo +12677|764|29|2|13|21641.88|0.03|0.00|N|O|1996-08-17|1996-08-14|1996-08-22|TAKE BACK RETURN|FOB| carefully special requests detect. re +12677|394|79|3|21|27182.19|0.01|0.00|N|O|1996-06-28|1996-07-10|1996-07-15|TAKE BACK RETURN|AIR|bold pinto beans. ca +12677|1073|9|4|40|38962.80|0.06|0.05|N|O|1996-09-07|1996-07-07|1996-09-08|NONE|MAIL|even asymptotes cajole. sly +12677|1769|12|5|17|28402.92|0.05|0.03|N|O|1996-07-12|1996-08-07|1996-07-19|COLLECT COD|TRUCK|slyly ironic forges +12677|1033|39|6|41|38295.23|0.07|0.04|N|O|1996-07-07|1996-08-12|1996-07-19|COLLECT COD|MAIL|refully. slyly final instructions wake. fu +12678|1452|53|1|10|13534.50|0.10|0.05|N|O|1998-05-13|1998-04-03|1998-06-10|TAKE BACK RETURN|FOB|ly bold multipliers. fluffil +12678|342|27|2|5|6211.70|0.10|0.03|N|O|1998-05-26|1998-04-22|1998-06-03|NONE|MAIL|ckages are slyly above the slyly bold i +12678|1906|95|3|16|28926.40|0.03|0.03|N|O|1998-03-25|1998-04-26|1998-03-26|NONE|RAIL|ial deposits nag slyly af +12678|180|59|4|25|27004.50|0.00|0.06|N|O|1998-05-26|1998-04-18|1998-05-27|DELIVER IN PERSON|TRUCK|ackages could have to integr +12678|1789|16|5|1|1690.78|0.01|0.05|N|O|1998-04-16|1998-03-25|1998-05-09|TAKE BACK RETURN|RAIL|ccounts maintain slyly about the q +12679|39|15|1|3|2817.09|0.10|0.06|N|O|1997-10-05|1997-08-24|1997-10-30|TAKE BACK RETURN|SHIP|ular, unusual ideas wake alongside of t +12679|1594|75|2|50|74779.50|0.05|0.03|N|O|1997-07-04|1997-09-15|1997-07-20|DELIVER IN PERSON|SHIP|ccounts across +12704|1349|50|1|21|26257.14|0.09|0.02|A|F|1993-02-20|1993-05-05|1993-03-09|COLLECT COD|RAIL|posits. regular deposits cajol +12704|1332|71|2|30|36999.90|0.10|0.06|R|F|1993-04-18|1993-04-24|1993-05-08|TAKE BACK RETURN|SHIP| pending theo +12704|1793|94|3|28|47454.12|0.07|0.03|A|F|1993-06-07|1993-03-21|1993-06-27|COLLECT COD|RAIL|riously ironic excuses. carefully ex +12704|436|95|4|11|14700.73|0.05|0.03|A|F|1993-02-14|1993-04-25|1993-02-19|NONE|MAIL|lly even pack +12704|640|3|5|16|24650.24|0.10|0.06|A|F|1993-04-29|1993-04-03|1993-05-08|TAKE BACK RETURN|RAIL| are slyly. carefully daring account +12705|1370|9|1|40|50854.80|0.01|0.08|R|F|1995-01-05|1994-12-08|1995-01-30|TAKE BACK RETURN|SHIP| instructions. furiously unusual th +12705|32|33|2|24|22368.72|0.09|0.01|R|F|1994-10-15|1994-11-20|1994-10-22|TAKE BACK RETURN|FOB|- stealthily even requests +12706|1906|39|1|32|57852.80|0.02|0.04|R|F|1995-01-04|1994-12-24|1995-01-16|NONE|RAIL|leep carefully. even +12706|35|61|2|41|38336.23|0.09|0.08|A|F|1995-02-24|1995-01-07|1995-03-16|NONE|MAIL|ss the final, even asympt +12706|1481|21|3|16|22119.68|0.02|0.02|A|F|1995-03-18|1994-12-27|1995-03-19|TAKE BACK RETURN|TRUCK|eposits around the express, special +12706|403|91|4|30|39102.00|0.06|0.05|A|F|1995-01-12|1995-01-16|1995-01-15|COLLECT COD|TRUCK|lly pending asymptote +12707|1687|11|1|17|27007.56|0.09|0.06|R|F|1993-08-15|1993-07-21|1993-09-07|TAKE BACK RETURN|AIR|g carefully final theodolites. blit +12707|1691|92|2|47|74856.43|0.07|0.02|A|F|1993-07-07|1993-07-25|1993-07-08|NONE|MAIL|requests. slyly ironic accounts about th +12707|1504|25|3|11|15460.50|0.06|0.01|A|F|1993-07-31|1993-08-01|1993-08-21|COLLECT COD|REG AIR|roughout the dogg +12707|1357|34|4|35|44042.25|0.04|0.02|R|F|1993-08-04|1993-07-03|1993-08-29|COLLECT COD|RAIL|gle above the silent, bold dependenci +12707|626|20|5|47|71751.14|0.04|0.06|A|F|1993-09-05|1993-08-01|1993-09-26|COLLECT COD|RAIL|efully regular platelets. fl +12707|969|4|6|13|24309.48|0.02|0.03|R|F|1993-08-08|1993-07-01|1993-08-10|COLLECT COD|REG AIR|ges. regular packages cajole furiously. c +12707|1110|83|7|1|1011.11|0.07|0.06|A|F|1993-08-11|1993-07-31|1993-08-13|TAKE BACK RETURN|MAIL|y ironic accounts. blithely pending ideas i +12708|986|89|1|14|26417.72|0.02|0.05|R|F|1993-03-08|1993-02-24|1993-03-22|DELIVER IN PERSON|MAIL|iously pending deposits +12708|1496|97|2|20|27949.80|0.04|0.05|A|F|1993-03-06|1993-03-03|1993-03-24|TAKE BACK RETURN|MAIL|ly unusual requests. quickly regular re +12708|1289|27|3|49|58323.72|0.10|0.08|A|F|1993-01-10|1993-03-07|1993-01-26|DELIVER IN PERSON|MAIL|among the quickly r +12708|1950|51|4|44|81485.80|0.04|0.08|A|F|1993-03-03|1993-03-07|1993-03-26|TAKE BACK RETURN|FOB| carefully ironic pin +12708|1246|58|5|10|11472.40|0.06|0.06|R|F|1993-01-25|1993-03-21|1993-02-11|TAKE BACK RETURN|TRUCK|ly hockey players. slyly unusual dep +12708|218|19|6|7|7827.47|0.02|0.03|A|F|1993-02-03|1993-03-17|1993-02-15|TAKE BACK RETURN|TRUCK|sts. slyly even packages cajole closely. ca +12708|104|5|7|50|50205.00|0.09|0.03|R|F|1993-03-11|1993-03-15|1993-04-03|TAKE BACK RETURN|RAIL|ages nag car +12709|554|45|1|17|24727.35|0.09|0.01|N|O|1996-08-01|1996-06-17|1996-08-21|COLLECT COD|REG AIR|daring instructions use. slyly unusual i +12709|1213|51|2|49|54596.29|0.08|0.03|N|O|1996-07-06|1996-07-07|1996-07-18|DELIVER IN PERSON|FOB|s. slyly ironic de +12710|322|79|1|13|15890.16|0.04|0.06|A|F|1993-11-25|1993-10-07|1993-12-07|COLLECT COD|FOB| sleep blithely across the requests. even +12710|846|46|2|28|48911.52|0.03|0.04|R|F|1993-12-10|1993-11-07|1993-12-17|COLLECT COD|AIR| dependencies alongside of the f +12710|654|86|3|49|76177.85|0.10|0.03|R|F|1993-11-18|1993-11-06|1993-11-26|NONE|RAIL|to beans kindle blithel +12710|1200|9|4|21|23125.20|0.09|0.03|A|F|1993-12-01|1993-11-14|1993-12-30|COLLECT COD|SHIP|accounts. furiously sp +12710|647|79|5|49|75834.36|0.06|0.04|A|F|1993-09-27|1993-09-24|1993-10-27|DELIVER IN PERSON|AIR|n accounts according to the ironic deposi +12710|236|37|6|41|46585.43|0.03|0.06|R|F|1993-12-16|1993-10-30|1994-01-13|TAKE BACK RETURN|REG AIR|ans nag carefully express +12710|1931|76|7|14|25661.02|0.05|0.04|A|F|1993-12-06|1993-10-10|1994-01-01|TAKE BACK RETURN|SHIP|xcuses nag carefu +12711|533|94|1|9|12901.77|0.06|0.01|A|F|1992-06-20|1992-05-15|1992-06-22|COLLECT COD|AIR|ag slyly against the ironic +12711|1135|72|2|48|49734.24|0.09|0.04|A|F|1992-06-11|1992-04-16|1992-06-27|TAKE BACK RETURN|RAIL|symptotes use across the +12711|80|81|3|17|16661.36|0.02|0.06|A|F|1992-06-01|1992-04-19|1992-06-11|DELIVER IN PERSON|SHIP|ges are furiously ironic ideas. furiously +12711|149|28|4|4|4196.56|0.09|0.07|A|F|1992-04-09|1992-03-27|1992-04-27|TAKE BACK RETURN|SHIP|ly unusual foxes use slyly across th +12736|442|43|1|26|34903.44|0.09|0.02|R|F|1993-04-28|1993-05-31|1993-05-06|NONE|MAIL|ke furiously furi +12736|936|71|2|33|60618.69|0.09|0.07|R|F|1993-05-31|1993-05-21|1993-06-22|NONE|AIR|nts solve fluffily about the caref +12736|722|19|3|18|29208.96|0.03|0.05|R|F|1993-04-20|1993-04-28|1993-04-26|DELIVER IN PERSON|REG AIR| wake. quickly st +12736|1987|76|4|48|90671.04|0.10|0.07|A|F|1993-06-13|1993-04-15|1993-07-11|TAKE BACK RETURN|MAIL|s-- quickly special packages shall +12736|965|66|5|48|89566.08|0.10|0.06|R|F|1993-04-14|1993-04-10|1993-05-11|NONE|TRUCK|out the idle ideas. regular, even ideas ca +12736|526|17|6|37|52781.24|0.01|0.00|R|F|1993-06-02|1993-05-28|1993-06-30|TAKE BACK RETURN|TRUCK|ly. carefully regular r +12737|590|81|1|3|4471.77|0.06|0.02|R|F|1994-05-12|1994-06-25|1994-05-18|NONE|MAIL|es are ironically carefu +12737|322|51|2|9|11000.88|0.02|0.07|R|F|1994-05-14|1994-07-03|1994-05-27|NONE|AIR|e quietly along the furi +12737|906|75|3|50|90345.00|0.08|0.07|A|F|1994-08-16|1994-07-16|1994-08-22|DELIVER IN PERSON|FOB|rash according to the slyly final instruc +12737|1311|50|4|42|50917.02|0.03|0.04|R|F|1994-08-11|1994-07-27|1994-09-07|TAKE BACK RETURN|REG AIR|odolites. blithely regul +12737|356|57|5|50|62817.50|0.09|0.04|R|F|1994-06-09|1994-06-16|1994-06-21|COLLECT COD|RAIL|ts detect slyly slowly even +12737|1775|76|6|22|36888.94|0.01|0.05|A|F|1994-08-08|1994-07-23|1994-08-12|TAKE BACK RETURN|FOB|into beans about the furiously eve +12737|1646|47|7|45|69643.80|0.10|0.06|R|F|1994-05-26|1994-06-28|1994-06-07|TAKE BACK RETURN|REG AIR|nal pinto beans use along +12738|277|5|1|11|12949.97|0.01|0.07|N|O|1998-07-12|1998-08-25|1998-08-08|TAKE BACK RETURN|RAIL|sual reque +12738|803|3|2|16|27260.80|0.02|0.03|N|O|1998-07-03|1998-08-03|1998-07-04|COLLECT COD|FOB|r platelets. final dependencies among th +12738|654|55|3|24|37311.60|0.03|0.06|N|O|1998-08-21|1998-08-31|1998-09-09|NONE|SHIP|de of the dep +12738|1852|82|4|37|64892.45|0.10|0.06|N|O|1998-09-25|1998-07-31|1998-10-18|TAKE BACK RETURN|AIR|c foxes use according to t +12738|1380|19|5|32|41004.16|0.01|0.01|N|O|1998-09-04|1998-08-16|1998-10-02|COLLECT COD|FOB|s are quickly ent +12739|1988|21|1|30|56699.40|0.08|0.08|A|F|1992-05-15|1992-05-10|1992-05-26|COLLECT COD|REG AIR| final requests serve blithely blithely +12740|622|85|1|41|62427.42|0.04|0.03|N|O|1997-08-19|1997-07-12|1997-09-09|DELIVER IN PERSON|RAIL| pending requests. regular depo +12741|1325|2|1|41|50279.12|0.00|0.02|A|F|1992-10-17|1992-09-06|1992-11-11|TAKE BACK RETURN|MAIL|of the quickly regular foxes. +12741|498|57|2|27|37759.23|0.10|0.04|A|F|1992-09-10|1992-10-04|1992-10-06|DELIVER IN PERSON|AIR|usual accounts. e +12741|1777|4|3|6|10072.62|0.06|0.06|A|F|1992-07-25|1992-09-16|1992-08-03|DELIVER IN PERSON|RAIL|wake even courts. f +12741|922|25|4|1|1822.92|0.05|0.07|A|F|1992-09-11|1992-08-24|1992-09-13|DELIVER IN PERSON|RAIL|ggle above the regular, ironic requests. as +12741|1989|78|5|32|60511.36|0.01|0.07|R|F|1992-09-24|1992-08-20|1992-10-08|TAKE BACK RETURN|AIR| express theodolite +12742|786|19|1|22|37109.16|0.03|0.01|N|O|1997-08-15|1997-07-11|1997-08-20|TAKE BACK RETURN|AIR| integrate carefully pinto +12743|430|60|1|32|42573.76|0.05|0.00|A|F|1993-10-07|1993-09-06|1993-10-31|NONE|REG AIR|ies sleep carefully slyly special r +12743|1448|66|2|11|14843.84|0.09|0.08|A|F|1993-07-24|1993-08-20|1993-08-04|COLLECT COD|AIR|aters are thinly pending +12743|807|7|3|22|37571.60|0.09|0.06|A|F|1993-08-23|1993-08-07|1993-09-22|TAKE BACK RETURN|SHIP|al theodolites. slyly even foxes atop +12743|335|92|4|9|11117.97|0.09|0.02|R|F|1993-08-07|1993-09-06|1993-08-11|COLLECT COD|AIR|kages boost slyly up the fin +12768|164|65|1|25|26604.00|0.06|0.06|R|F|1994-05-01|1994-06-01|1994-05-31|TAKE BACK RETURN|MAIL|ests cajole furiously pearls. carefully +12768|470|29|2|18|24668.46|0.03|0.08|R|F|1994-04-15|1994-06-09|1994-04-27|TAKE BACK RETURN|TRUCK|ccording to the unusual +12768|359|16|3|17|21408.95|0.08|0.02|R|F|1994-05-26|1994-05-25|1994-06-05|NONE|RAIL|theodolites cajole b +12768|551|12|4|21|30482.55|0.00|0.04|A|F|1994-07-15|1994-06-10|1994-08-02|COLLECT COD|FOB| of the regular pack +12768|806|7|5|10|17068.00|0.06|0.07|R|F|1994-04-23|1994-05-10|1994-05-21|DELIVER IN PERSON|AIR|ly alongside o +12769|1913|14|1|16|29038.56|0.07|0.08|R|F|1992-04-01|1992-03-24|1992-04-21|NONE|RAIL|ven Tiresias cajole qui +12770|460|90|1|3|4081.38|0.09|0.02|A|F|1993-07-22|1993-06-15|1993-08-04|NONE|RAIL|even pinto beans haggle regular, express a +12770|1167|76|2|17|18158.72|0.02|0.08|R|F|1993-07-11|1993-07-11|1993-08-04|NONE|TRUCK|iously even instructions. furiously +12770|102|55|3|49|49102.90|0.05|0.04|A|F|1993-04-28|1993-05-20|1993-04-29|DELIVER IN PERSON|FOB|ly final pinto beans about +12770|1901|2|4|4|7211.60|0.01|0.02|A|F|1993-06-08|1993-05-18|1993-07-08|COLLECT COD|TRUCK| fluffily pend +12770|531|92|5|37|52966.61|0.10|0.06|A|F|1993-07-09|1993-07-04|1993-07-27|DELIVER IN PERSON|MAIL| even deposits wake bravely +12771|596|27|1|30|44897.70|0.08|0.06|R|F|1994-04-14|1994-03-03|1994-04-21|COLLECT COD|SHIP|s. furiously final requests use slyly blith +12771|1483|23|2|28|38765.44|0.09|0.06|A|F|1994-04-03|1994-03-09|1994-04-22|TAKE BACK RETURN|SHIP|ss pinto beans. slyly specia +12771|1968|13|3|28|52358.88|0.01|0.07|R|F|1994-02-16|1994-03-31|1994-03-03|TAKE BACK RETURN|SHIP|ong the quickly furious instruct +12771|551|42|4|41|59513.55|0.06|0.03|A|F|1994-04-09|1994-02-21|1994-05-06|TAKE BACK RETURN|AIR|ole quickly. carefully final foxes use +12771|772|37|5|5|8363.85|0.02|0.08|A|F|1994-04-27|1994-04-06|1994-05-25|NONE|REG AIR|the blithely +12772|79|30|1|37|36225.59|0.09|0.02|R|F|1995-05-17|1995-07-03|1995-05-19|DELIVER IN PERSON|MAIL| furiously reg +12772|1163|64|2|34|36181.44|0.07|0.00|N|O|1995-07-24|1995-08-07|1995-08-06|DELIVER IN PERSON|SHIP|ake slyly against the r +12772|1608|9|3|44|66422.40|0.02|0.03|N|O|1995-07-14|1995-08-06|1995-07-18|NONE|TRUCK|pendencies. even, enticing +12772|1221|33|4|32|35911.04|0.01|0.04|R|F|1995-06-07|1995-06-16|1995-06-13|TAKE BACK RETURN|TRUCK|s. fluffily ironic pinto beans at +12772|1787|72|5|30|50663.40|0.04|0.03|N|O|1995-07-15|1995-06-26|1995-07-21|NONE|SHIP|lly final packages engage carefully reg +12773|1792|93|1|17|28794.43|0.06|0.08|R|F|1995-02-04|1995-04-02|1995-02-09|NONE|AIR| accounts nag sl +12773|1892|93|2|39|69961.71|0.01|0.06|R|F|1995-02-25|1995-03-12|1995-03-27|COLLECT COD|TRUCK|. slyly bold requests +12773|1975|64|3|38|71324.86|0.05|0.02|A|F|1995-03-18|1995-03-13|1995-03-24|NONE|TRUCK| requests. +12773|534|25|4|16|22952.48|0.08|0.03|A|F|1995-03-09|1995-02-28|1995-03-13|TAKE BACK RETURN|RAIL|inly thin Tiresias. furiou +12773|653|85|5|41|63699.65|0.07|0.02|R|F|1995-03-31|1995-03-03|1995-04-18|NONE|SHIP|s; quickly ironic hockey players cajol +12773|1238|76|6|23|26202.29|0.02|0.06|R|F|1995-04-01|1995-03-27|1995-04-11|TAKE BACK RETURN|REG AIR|kly furiously final theodolites. ironic d +12773|231|32|7|20|22624.60|0.03|0.07|R|F|1995-03-09|1995-03-26|1995-03-25|COLLECT COD|FOB|ckly regular packages. final +12774|1054|60|1|16|15280.80|0.08|0.05|R|F|1993-01-09|1992-12-25|1993-01-19|DELIVER IN PERSON|FOB|refully boldly +12774|1524|25|2|29|41340.08|0.04|0.04|A|F|1992-10-24|1992-11-27|1992-11-08|DELIVER IN PERSON|RAIL|ts are furiously: furiously even ac +12774|26|2|3|5|4630.10|0.04|0.04|R|F|1993-02-07|1992-12-13|1993-02-28|DELIVER IN PERSON|TRUCK|ly bold deposits across t +12775|844|45|1|45|78517.80|0.02|0.00|N|O|1996-12-06|1996-12-07|1996-12-25|TAKE BACK RETURN|RAIL| integrate furiously along th +12775|1035|6|2|9|8424.27|0.06|0.02|N|O|1996-10-24|1996-12-11|1996-10-31|DELIVER IN PERSON|AIR| express hockey players sleep fur +12775|1372|49|3|33|42021.21|0.05|0.01|N|O|1996-11-09|1996-11-17|1996-11-25|COLLECT COD|TRUCK| unusual ideas. care +12775|335|36|4|2|2470.66|0.10|0.05|N|O|1996-10-16|1996-12-21|1996-10-28|NONE|TRUCK|lyly final excuses. carefully regular +12800|1529|10|1|47|67234.44|0.01|0.06|R|F|1993-07-12|1993-07-23|1993-07-27|TAKE BACK RETURN|MAIL|equests. slyly regular accounts could +12800|1940|41|2|43|79203.42|0.03|0.07|R|F|1993-09-19|1993-08-17|1993-10-01|DELIVER IN PERSON|TRUCK|s. blithely even foxes impress above +12800|1639|40|3|27|41597.01|0.08|0.06|R|F|1993-06-12|1993-07-02|1993-06-19|DELIVER IN PERSON|REG AIR|icingly bold fo +12800|310|11|4|24|29047.44|0.10|0.04|R|F|1993-07-20|1993-06-25|1993-08-07|COLLECT COD|FOB|itaphs. express, unusual instructions +12800|1792|93|5|47|79608.13|0.02|0.05|A|F|1993-08-23|1993-08-02|1993-09-22|NONE|AIR|refully bold requests should +12801|425|13|1|42|55667.64|0.08|0.07|N|O|1997-08-30|1997-10-01|1997-09-03|COLLECT COD|AIR|old, final deposits +12801|67|43|2|1|967.06|0.04|0.05|N|O|1997-09-10|1997-10-27|1997-10-01|COLLECT COD|SHIP|ve the express, final foxes. +12801|1361|38|3|39|49232.04|0.03|0.03|N|O|1997-10-17|1997-11-15|1997-11-01|NONE|FOB|usly blithely final i +12801|932|33|4|45|82481.85|0.01|0.07|N|O|1997-09-13|1997-10-21|1997-09-18|DELIVER IN PERSON|RAIL|ong the final acc +12801|74|50|5|35|34092.45|0.02|0.01|N|O|1997-09-03|1997-10-03|1997-09-27|COLLECT COD|REG AIR|ously unus +12802|890|57|1|43|77008.27|0.02|0.02|N|O|1998-05-27|1998-05-17|1998-06-19|COLLECT COD|MAIL|s haggle furiously after th +12802|1054|25|2|28|26741.40|0.09|0.01|N|O|1998-03-29|1998-04-25|1998-04-03|TAKE BACK RETURN|REG AIR|he final ideas. blithely fi +12802|1820|50|3|17|29270.94|0.04|0.04|N|O|1998-04-27|1998-04-06|1998-05-06|NONE|AIR|unts wake. even, final +12802|462|63|4|22|29974.12|0.02|0.04|N|O|1998-04-29|1998-05-26|1998-05-16|DELIVER IN PERSON|MAIL|. ironic deposits cajole fluffily +12802|1741|42|5|44|72280.56|0.00|0.00|N|O|1998-06-29|1998-05-20|1998-07-16|DELIVER IN PERSON|SHIP|lyly bold deposits. +12803|45|71|1|16|15120.64|0.08|0.04|R|F|1993-03-30|1993-05-24|1993-04-18|TAKE BACK RETURN|AIR|leep across the furiously pending courts +12803|1161|34|2|13|13808.08|0.10|0.04|A|F|1993-03-12|1993-05-24|1993-03-20|TAKE BACK RETURN|AIR|thogs cajole along the pe +12804|230|12|1|50|56511.50|0.02|0.04|R|F|1992-09-17|1992-07-25|1992-10-13|TAKE BACK RETURN|MAIL|. express, special excuses doubt. carefully +12804|1659|42|2|24|37455.60|0.09|0.05|A|F|1992-07-08|1992-08-04|1992-07-15|NONE|AIR| ironic dolphins cajo +12804|990|93|3|40|75639.60|0.01|0.04|A|F|1992-08-19|1992-08-02|1992-09-04|TAKE BACK RETURN|SHIP|affix after the even, special account +12804|600|61|4|49|73529.40|0.04|0.06|A|F|1992-06-25|1992-08-12|1992-07-04|DELIVER IN PERSON|SHIP|thlessly acc +12804|1559|80|5|19|27750.45|0.00|0.04|R|F|1992-08-13|1992-06-25|1992-09-01|NONE|MAIL|l asymptotes. final reques +12804|1558|39|6|46|67139.30|0.03|0.08|R|F|1992-07-22|1992-08-18|1992-08-01|DELIVER IN PERSON|RAIL|requests use around the even depo +12804|432|91|7|10|13324.30|0.06|0.02|R|F|1992-07-23|1992-07-09|1992-07-28|NONE|MAIL| foxes ought to ha +12805|1910|55|1|9|16307.19|0.04|0.07|N|O|1997-02-13|1997-02-24|1997-02-15|COLLECT COD|FOB|nding, express courts +12805|1359|74|2|24|30248.40|0.04|0.06|N|O|1997-02-16|1997-03-10|1997-02-22|NONE|REG AIR|e regular, regular packages. ex +12805|1430|70|3|23|30622.89|0.09|0.03|N|O|1997-02-25|1997-02-13|1997-03-08|NONE|REG AIR|le quickly +12806|1202|14|1|1|1103.20|0.00|0.06|N|O|1996-01-18|1996-02-21|1996-01-25|TAKE BACK RETURN|FOB|, special deposits nag after +12806|1960|5|2|44|81926.24|0.07|0.07|N|O|1996-03-03|1996-01-25|1996-03-28|COLLECT COD|SHIP|kages. platelets dazzle c +12806|1690|14|3|41|65259.29|0.04|0.03|N|O|1996-01-16|1996-03-19|1996-01-21|COLLECT COD|TRUCK| ironic platelets are +12806|1775|76|4|14|23474.78|0.08|0.06|N|O|1995-12-30|1996-02-26|1996-01-06|TAKE BACK RETURN|TRUCK|ly regular requests. +12806|1563|64|5|3|4393.68|0.00|0.03|N|O|1996-03-03|1996-02-02|1996-03-20|DELIVER IN PERSON|TRUCK|patterns cajole sly +12806|1691|15|6|21|33446.49|0.01|0.03|N|O|1996-01-15|1996-02-19|1996-01-25|TAKE BACK RETURN|AIR|nusual ideas sleep furiously +12807|1308|23|1|7|8465.10|0.10|0.01|N|O|1998-04-14|1998-03-20|1998-05-13|NONE|SHIP|s the deposits use of +12807|632|33|2|16|24522.08|0.00|0.08|N|O|1998-03-19|1998-04-07|1998-04-01|COLLECT COD|REG AIR|rate carefully regular theodolites. +12832|1428|29|1|49|65141.58|0.02|0.04|A|F|1995-03-13|1995-03-04|1995-03-18|NONE|RAIL|ag. carefully final +12833|763|64|1|11|18301.36|0.02|0.01|N|O|1998-08-10|1998-08-01|1998-09-08|TAKE BACK RETURN|FOB|ges affix furiously final courts. +12833|951|20|2|47|87041.65|0.07|0.04|N|O|1998-09-27|1998-08-12|1998-10-22|NONE|RAIL|about the +12834|1434|74|1|28|37392.04|0.06|0.03|N|O|1996-12-26|1996-12-03|1997-01-03|TAKE BACK RETURN|SHIP|p carefully. care +12834|1258|33|2|41|47529.25|0.05|0.01|N|O|1997-01-30|1997-01-28|1997-02-27|NONE|FOB|s. foxes among +12834|1719|46|3|37|59966.27|0.06|0.05|N|O|1996-11-15|1996-12-29|1996-12-11|TAKE BACK RETURN|RAIL|theodolites s +12834|420|21|4|18|23767.56|0.04|0.01|N|O|1996-12-12|1996-12-20|1996-12-19|TAKE BACK RETURN|MAIL|lar gifts. blithely even escapades acr +12834|1167|40|5|16|17090.56|0.03|0.06|N|O|1997-02-21|1996-12-17|1997-03-17|DELIVER IN PERSON|SHIP|the blithely even reque +12834|44|95|6|34|32097.36|0.01|0.01|N|O|1996-12-06|1996-12-25|1996-12-17|TAKE BACK RETURN|REG AIR|sly unusual, regular packages. ide +12834|909|44|7|26|47057.40|0.01|0.07|N|O|1996-12-24|1996-12-26|1996-12-30|TAKE BACK RETURN|MAIL|. ironic deposits haggle quickly p +12835|1560|1|1|1|1461.56|0.08|0.07|N|O|1997-01-27|1997-03-27|1997-01-30|DELIVER IN PERSON|SHIP|ole stealthily blit +12835|1831|32|2|15|25992.45|0.04|0.00|N|O|1997-03-24|1997-03-05|1997-03-31|TAKE BACK RETURN|REG AIR| accounts use along the fluffy +12835|1123|96|3|11|11265.32|0.03|0.03|N|O|1997-05-13|1997-04-20|1997-05-19|DELIVER IN PERSON|FOB|quickly ironic accounts. blithely si +12835|727|92|4|33|53714.76|0.08|0.06|N|O|1997-05-09|1997-03-25|1997-05-28|DELIVER IN PERSON|AIR|xes are furiously after the express acc +12835|604|67|5|5|7523.00|0.04|0.02|N|O|1997-02-24|1997-02-22|1997-03-25|TAKE BACK RETURN|MAIL|sits. carefully final pinto +12835|1441|59|6|5|6712.20|0.00|0.03|N|O|1997-03-10|1997-04-06|1997-03-30|COLLECT COD|RAIL|ely regular asymptotes: regular, e +12835|1577|98|7|28|41399.96|0.07|0.00|N|O|1997-05-20|1997-04-17|1997-06-01|DELIVER IN PERSON|TRUCK|s nag furiously. regular packag +12836|1832|62|1|1|1733.83|0.04|0.03|N|O|1996-05-14|1996-06-23|1996-05-20|TAKE BACK RETURN|AIR|hely pending asymptotes? +12836|1009|80|2|48|43680.00|0.07|0.06|N|O|1996-06-13|1996-06-30|1996-06-28|COLLECT COD|SHIP| the ruthless requests. fina +12836|1835|65|3|33|57315.39|0.03|0.00|N|O|1996-07-08|1996-05-21|1996-08-04|NONE|SHIP|e the foxes snooze carefu +12836|45|96|4|44|41581.76|0.06|0.01|N|O|1996-07-10|1996-05-18|1996-07-14|COLLECT COD|SHIP|dolphins haggle blithely sometimes +12836|1377|78|5|19|24289.03|0.01|0.01|N|O|1996-04-21|1996-06-22|1996-05-08|COLLECT COD|RAIL| pinto beans alongsi +12836|74|100|6|21|20455.47|0.09|0.03|N|O|1996-07-08|1996-06-12|1996-07-11|NONE|REG AIR|ns. ironic accounts could h +12836|1327|28|7|31|38077.92|0.04|0.07|N|O|1996-05-11|1996-05-27|1996-05-30|NONE|TRUCK|arefully even packages. bold, final pint +12837|596|27|1|14|20952.26|0.10|0.03|A|F|1993-01-09|1993-01-26|1993-01-15|DELIVER IN PERSON|RAIL|g the pending deposits are so +12837|24|25|2|38|35112.76|0.05|0.07|R|F|1993-01-11|1993-02-24|1993-01-16|TAKE BACK RETURN|MAIL| the never regular foxes haggle blithely +12837|1464|82|3|8|10923.68|0.00|0.00|R|F|1993-01-22|1993-01-17|1993-02-17|NONE|REG AIR|ckly ironic deposits. +12837|232|87|4|44|49818.12|0.08|0.02|R|F|1993-02-08|1993-01-03|1993-02-13|TAKE BACK RETURN|FOB|gage. slyly bold pinto +12838|1899|29|1|21|37818.69|0.10|0.07|N|O|1998-07-17|1998-08-28|1998-07-25|DELIVER IN PERSON|AIR|nes sleep furiously against the +12838|423|11|2|27|35732.34|0.10|0.05|N|O|1998-09-05|1998-09-18|1998-09-28|DELIVER IN PERSON|MAIL|ways even deposits. furio +12838|1655|38|3|24|37359.60|0.07|0.00|N|O|1998-10-21|1998-08-26|1998-11-10|TAKE BACK RETURN|RAIL|to the bold packages x-ray slyly near +12839|1640|82|1|26|40082.64|0.05|0.01|N|O|1998-01-23|1998-03-12|1998-02-08|COLLECT COD|RAIL|gly bold accoun +12839|774|71|2|34|56942.18|0.02|0.02|N|O|1998-02-16|1998-03-11|1998-03-06|DELIVER IN PERSON|AIR|e furiously +12839|90|16|3|2|1980.18|0.01|0.08|N|O|1998-04-26|1998-03-31|1998-05-26|NONE|MAIL|ages are c +12839|1659|1|4|21|32773.65|0.00|0.07|N|O|1998-02-12|1998-03-01|1998-02-22|DELIVER IN PERSON|TRUCK| fluffily above the final theodolit +12839|458|59|5|5|6792.25|0.10|0.04|N|O|1998-02-14|1998-02-19|1998-03-11|DELIVER IN PERSON|AIR|express accounts b +12839|1168|77|6|37|39558.92|0.08|0.08|N|O|1998-03-14|1998-03-31|1998-04-09|NONE|SHIP|lar deposits cajole +12864|1462|63|1|5|6817.30|0.03|0.02|R|F|1994-08-05|1994-06-23|1994-08-09|TAKE BACK RETURN|TRUCK|uctions. slyly special pearls wake +12864|1939|72|2|43|79159.99|0.04|0.03|R|F|1994-07-12|1994-07-17|1994-08-04|COLLECT COD|MAIL|e carefully final pinto beans cajole +12864|789|54|3|34|57452.52|0.00|0.00|A|F|1994-06-07|1994-07-31|1994-06-28|TAKE BACK RETURN|REG AIR|asymptotes lose quickly +12865|1540|21|1|33|47570.82|0.04|0.00|N|O|1997-06-28|1997-07-18|1997-07-27|COLLECT COD|FOB|ickly final pinto beans haggle furiously +12865|993|62|2|1|1893.99|0.01|0.01|N|O|1997-07-13|1997-08-18|1997-08-07|COLLECT COD|REG AIR|ly special instructions about the qu +12865|1619|61|3|50|76030.50|0.04|0.00|N|O|1997-09-17|1997-07-02|1997-10-16|NONE|AIR|uriously express dolphins haggle bli +12865|431|90|4|21|27960.03|0.08|0.02|N|O|1997-06-11|1997-07-07|1997-07-06|NONE|SHIP|riously pending theodolites. quickly +12865|976|79|5|32|60063.04|0.00|0.05|N|O|1997-09-08|1997-08-04|1997-09-11|DELIVER IN PERSON|MAIL| regularly pending inst +12865|1126|99|6|2|2054.24|0.10|0.02|N|O|1997-08-13|1997-07-05|1997-08-16|NONE|REG AIR|uests use car +12865|701|34|7|21|33635.70|0.08|0.06|N|O|1997-07-03|1997-08-05|1997-07-18|COLLECT COD|MAIL|hinder carefully special deposits. caref +12866|380|9|1|6|7682.28|0.02|0.06|N|O|1997-02-06|1997-04-10|1997-02-07|COLLECT COD|MAIL|eposits. regular Tire +12866|1664|88|2|32|50101.12|0.00|0.07|N|O|1997-05-11|1997-04-10|1997-06-05|COLLECT COD|MAIL|bove the furiousl +12866|1118|27|3|35|35668.85|0.06|0.01|N|O|1997-04-27|1997-04-07|1997-05-26|DELIVER IN PERSON|FOB|y even accounts thr +12866|912|13|4|9|16316.19|0.01|0.02|N|O|1997-04-11|1997-02-20|1997-05-09|DELIVER IN PERSON|SHIP|olites. care +12866|1233|71|5|17|19281.91|0.06|0.07|N|O|1997-02-05|1997-03-10|1997-02-25|DELIVER IN PERSON|FOB|y furiously ironic deposits. unusual +12866|876|43|6|8|14214.96|0.05|0.05|N|O|1997-04-04|1997-03-18|1997-05-04|TAKE BACK RETURN|AIR|t. blithely special ideas wake. slyly +12866|637|69|7|12|18451.56|0.00|0.08|N|O|1997-05-04|1997-03-02|1997-05-28|TAKE BACK RETURN|SHIP|sheaves wake fluffi +12867|722|87|1|14|22718.08|0.02|0.04|A|F|1995-04-20|1995-05-29|1995-05-09|DELIVER IN PERSON|AIR|ts. furiously regular instructio +12867|1833|63|2|45|78067.35|0.10|0.08|N|F|1995-06-10|1995-05-02|1995-07-04|TAKE BACK RETURN|SHIP|final tithes. s +12867|1021|57|3|48|44256.96|0.00|0.06|A|F|1995-06-06|1995-06-08|1995-06-13|NONE|REG AIR|quickly brave +12867|1490|69|4|20|27829.80|0.07|0.03|R|F|1995-04-15|1995-04-15|1995-04-29|DELIVER IN PERSON|SHIP|atelets wake fluffily after th +12867|1737|22|5|15|24580.95|0.06|0.06|A|F|1995-05-17|1995-06-07|1995-06-10|TAKE BACK RETURN|RAIL|ccording to the furio +12868|1881|82|1|10|17828.80|0.02|0.01|R|F|1995-03-12|1995-04-08|1995-03-29|NONE|MAIL|nal ideas. furiousl +12868|505|66|2|46|64653.00|0.00|0.03|A|F|1995-05-30|1995-05-17|1995-06-15|COLLECT COD|MAIL|cajole. carefully even packages integra +12868|430|31|3|32|42573.76|0.00|0.04|N|O|1995-06-21|1995-05-28|1995-07-04|COLLECT COD|RAIL| outside the furiously bold courts. packa +12868|1651|52|4|45|69869.25|0.06|0.05|A|F|1995-04-08|1995-05-31|1995-04-12|DELIVER IN PERSON|MAIL|nal, ironic ideas use blith +12868|1151|88|5|3|3156.45|0.07|0.04|N|F|1995-06-10|1995-04-30|1995-07-07|COLLECT COD|MAIL|efully about the car +12868|999|34|6|15|28499.85|0.02|0.04|R|F|1995-04-11|1995-04-26|1995-04-12|DELIVER IN PERSON|TRUCK|y final accounts lose regular +12869|1437|77|1|35|46845.05|0.06|0.07|A|F|1994-05-23|1994-03-12|1994-06-12|TAKE BACK RETURN|FOB|e slyly. pending foxes along the carefull +12869|983|52|2|44|82895.12|0.05|0.07|R|F|1994-05-15|1994-04-08|1994-05-19|TAKE BACK RETURN|TRUCK|ckages according to the f +12870|337|22|1|39|48255.87|0.01|0.08|A|F|1993-10-22|1993-09-21|1993-11-02|NONE|AIR|ilent ideas. quickly special asympt +12871|142|21|1|33|34390.62|0.00|0.02|N|O|1995-11-29|1995-12-04|1995-12-28|COLLECT COD|FOB|posits. furiously daring foxes boost +12871|318|75|2|50|60915.50|0.09|0.02|N|O|1996-01-13|1995-12-22|1996-01-18|TAKE BACK RETURN|MAIL| snooze quic +12871|535|36|3|29|41630.37|0.08|0.04|N|O|1995-10-17|1995-12-12|1995-10-23|COLLECT COD|REG AIR|ajole alongside of the furiously regular +12871|8|9|4|15|13620.00|0.07|0.02|N|O|1995-11-29|1995-11-09|1995-12-18|TAKE BACK RETURN|MAIL|l packages. grouches use c +12871|378|35|5|25|31959.25|0.02|0.03|N|O|1995-11-29|1995-12-03|1995-12-07|COLLECT COD|RAIL|olites sleep carefully blithely +12871|1874|4|6|10|17758.70|0.00|0.03|N|O|1996-01-26|1995-12-24|1996-02-02|COLLECT COD|MAIL|totes. slyly p +12896|844|11|1|47|82007.48|0.08|0.00|N|O|1997-04-18|1997-02-18|1997-04-30|DELIVER IN PERSON|REG AIR|eposits are quickly. eve +12896|1950|95|2|16|29631.20|0.01|0.02|N|O|1997-01-01|1997-02-27|1997-01-16|NONE|RAIL|its sleep f +12896|1804|48|3|42|71643.60|0.09|0.07|N|O|1996-12-26|1997-02-03|1997-01-04|COLLECT COD|TRUCK|r escapades alongs +12896|847|47|4|48|83896.32|0.01|0.00|N|O|1997-01-30|1997-03-13|1997-02-08|DELIVER IN PERSON|MAIL| final grouches boost +12896|839|73|5|10|17398.30|0.09|0.08|N|O|1997-04-14|1997-02-08|1997-04-27|COLLECT COD|AIR|xes nag carefully. theodolites are +12896|556|47|6|11|16022.05|0.03|0.03|N|O|1997-03-13|1997-02-13|1997-04-09|COLLECT COD|MAIL|against the deposits doze +12896|1920|65|7|17|30972.64|0.06|0.04|N|O|1997-01-21|1997-02-03|1997-02-10|DELIVER IN PERSON|RAIL|th the doggedly regular foxes. iron +12897|1957|58|1|32|59486.40|0.10|0.02|N|O|1995-08-08|1995-08-29|1995-08-22|NONE|RAIL|the furiously regular accoun +12897|1381|82|2|27|34624.26|0.06|0.01|N|O|1995-11-04|1995-09-27|1995-11-27|TAKE BACK RETURN|FOB|g from the slyly silent accounts. packages +12897|816|50|3|19|32619.39|0.03|0.06|N|O|1995-08-02|1995-09-17|1995-08-15|TAKE BACK RETURN|FOB|nstructions wake. fu +12897|1119|20|4|4|4080.44|0.02|0.00|N|O|1995-10-20|1995-08-29|1995-10-29|DELIVER IN PERSON|TRUCK|ully final packages h +12897|241|42|5|2|2282.48|0.00|0.03|N|O|1995-09-27|1995-09-07|1995-10-01|COLLECT COD|AIR|refully ironic theodolites. qui +12897|1040|11|6|29|27290.16|0.08|0.03|N|O|1995-08-17|1995-10-13|1995-08-22|TAKE BACK RETURN|MAIL|lent instructions boost carefully sp +12898|1447|65|1|32|43150.08|0.01|0.05|R|F|1994-11-05|1994-12-06|1994-11-27|COLLECT COD|MAIL|osits affix quickly fluffily regul +12899|329|14|1|18|22127.76|0.10|0.01|N|O|1996-04-09|1996-06-22|1996-05-03|COLLECT COD|AIR|ffily even platelets sleep bl +12899|477|65|2|5|6887.35|0.04|0.07|N|O|1996-07-03|1996-05-28|1996-07-24|TAKE BACK RETURN|SHIP|ic platelets. requests integrate furi +12899|1936|37|3|7|12865.51|0.03|0.07|N|O|1996-04-12|1996-06-30|1996-04-26|TAKE BACK RETURN|MAIL|press asymptotes sle +12900|1828|72|1|11|19028.02|0.03|0.05|R|F|1993-05-20|1993-07-27|1993-05-28|NONE|REG AIR|iously regular accounts. express platel +12900|1196|97|2|19|20846.61|0.00|0.05|R|F|1993-07-08|1993-06-19|1993-07-25|NONE|AIR| pinto beans cajole alongside of the quickl +12901|1633|57|1|33|50642.79|0.04|0.06|R|F|1994-07-09|1994-07-30|1994-07-30|DELIVER IN PERSON|SHIP|ect furiousl +12901|609|3|2|21|31701.60|0.09|0.08|A|F|1994-06-16|1994-07-27|1994-06-26|NONE|AIR|arefully bold accounts +12901|317|74|3|39|47475.09|0.07|0.05|A|F|1994-08-10|1994-07-25|1994-08-13|NONE|RAIL|ests. slyl +12901|272|27|4|46|53924.42|0.04|0.08|R|F|1994-06-30|1994-07-06|1994-07-06|NONE|FOB|st about the unusual +12901|263|64|5|42|48856.92|0.00|0.05|R|F|1994-06-27|1994-07-25|1994-07-21|NONE|RAIL|ructions caj +12901|107|34|6|43|43305.30|0.03|0.08|A|F|1994-09-03|1994-06-16|1994-09-19|TAKE BACK RETURN|TRUCK|according to the furiously ir +12901|1932|77|7|12|22007.16|0.07|0.01|A|F|1994-08-06|1994-07-06|1994-08-08|COLLECT COD|RAIL|anent ideas use fu +12902|976|77|1|50|93848.50|0.09|0.04|R|F|1993-11-27|1993-12-26|1993-12-06|TAKE BACK RETURN|REG AIR|unts haggle furio +12902|376|33|2|15|19145.55|0.05|0.02|A|F|1994-01-28|1993-12-05|1994-02-17|COLLECT COD|AIR|s. even foxes boost carefull +12902|1555|56|3|24|34957.20|0.05|0.04|A|F|1993-10-31|1993-12-14|1993-11-16|NONE|SHIP|after the quickl +12902|737|38|4|37|60596.01|0.04|0.00|R|F|1993-12-06|1993-12-05|1993-12-15|DELIVER IN PERSON|FOB|s. carefully regular requests b +12902|312|13|5|26|31520.06|0.10|0.05|A|F|1993-12-31|1993-12-18|1994-01-26|NONE|FOB|ly. never special +12902|155|34|6|40|42206.00|0.08|0.00|R|F|1993-11-15|1994-01-09|1993-11-26|COLLECT COD|AIR| across th +12902|1349|64|7|44|55014.96|0.08|0.04|R|F|1993-12-14|1993-12-26|1994-01-02|COLLECT COD|MAIL|ites. special, regular ideas across the +12903|580|11|1|20|29611.60|0.05|0.02|R|F|1994-11-04|1994-11-13|1994-11-19|DELIVER IN PERSON|REG AIR|ar, furious hockey play +12903|1319|34|2|20|24406.20|0.05|0.02|R|F|1994-10-30|1994-11-24|1994-11-16|DELIVER IN PERSON|REG AIR|uffily. fluffily ironic packages nag. sly +12903|359|44|3|29|36521.15|0.03|0.01|R|F|1994-12-15|1994-11-30|1995-01-14|DELIVER IN PERSON|TRUCK| requests print furiously above th +12903|1074|45|4|1|975.07|0.09|0.08|R|F|1994-11-20|1994-11-06|1994-12-07|NONE|AIR| pending packages across the final, final +12928|1327|66|1|28|34392.96|0.00|0.03|R|F|1994-04-05|1994-06-06|1994-04-21|NONE|SHIP|s the quickly furious ideas. ironic, ironic +12928|1610|52|2|2|3023.22|0.04|0.08|A|F|1994-04-26|1994-05-01|1994-05-11|NONE|RAIL| ironic accoun +12928|608|2|3|48|72412.80|0.01|0.04|R|F|1994-06-06|1994-05-17|1994-06-10|NONE|MAIL|ctions sleep quickly along the as +12928|194|95|4|8|8753.52|0.00|0.04|R|F|1994-05-02|1994-06-09|1994-05-06|NONE|FOB|ns sleep regular accounts. fluffily regu +12928|1515|16|5|33|46744.83|0.04|0.06|R|F|1994-07-20|1994-05-25|1994-08-14|COLLECT COD|TRUCK|leep fluffily slyly ironic requests. +12928|649|81|6|29|44939.56|0.02|0.02|A|F|1994-07-27|1994-06-04|1994-08-11|COLLECT COD|FOB|gular deposits. regular +12928|831|98|7|27|46759.41|0.10|0.03|A|F|1994-05-24|1994-05-09|1994-06-13|COLLECT COD|RAIL| around the final deposits. furi +12929|571|72|1|40|58862.80|0.02|0.02|A|F|1993-10-11|1993-11-22|1993-11-02|TAKE BACK RETURN|AIR|ages. regu +12929|1586|87|2|7|10413.06|0.06|0.04|A|F|1993-10-04|1993-10-02|1993-10-11|COLLECT COD|AIR|gular deposits use deposits. b +12929|749|14|3|34|56091.16|0.04|0.04|A|F|1993-12-23|1993-10-23|1994-01-18|TAKE BACK RETURN|AIR|sly against the regular +12929|131|58|4|13|13404.69|0.03|0.04|A|F|1993-11-11|1993-10-09|1993-11-16|DELIVER IN PERSON|SHIP|ke regular, close ideas. +12930|187|40|1|10|10871.80|0.04|0.04|N|O|1995-12-27|1996-01-08|1996-01-18|NONE|AIR|ven packages are furiously orbits. ca +12931|1818|5|1|4|6879.24|0.08|0.03|R|F|1992-06-11|1992-06-28|1992-06-23|NONE|TRUCK| epitaphs across the blithely even pin +12931|1824|54|2|24|41419.68|0.04|0.06|A|F|1992-05-27|1992-07-17|1992-06-18|COLLECT COD|AIR| cajole blithely. pending, pendin +12931|1092|63|3|24|23834.16|0.09|0.08|R|F|1992-05-22|1992-06-25|1992-06-19|DELIVER IN PERSON|MAIL|s eat express, ironic packages. blithely +12932|1617|100|1|44|66818.84|0.05|0.07|N|O|1997-10-17|1997-11-19|1997-10-23|COLLECT COD|REG AIR|eodolites cajole pending, iro +12932|402|32|2|50|65120.00|0.07|0.06|N|O|1997-12-16|1997-11-20|1997-12-30|DELIVER IN PERSON|AIR| excuses. regular asymptotes +12932|771|68|3|5|8358.85|0.02|0.02|N|O|1997-09-07|1997-10-15|1997-09-26|NONE|TRUCK|olites. slyly special packages integrate +12932|599|60|4|7|10497.13|0.00|0.03|N|O|1997-09-08|1997-11-12|1997-10-01|COLLECT COD|FOB|ar ideas poach b +12933|1652|94|1|3|4660.95|0.00|0.03|N|O|1998-06-07|1998-04-05|1998-06-11|DELIVER IN PERSON|TRUCK|s among the fur +12933|1595|16|2|27|40407.93|0.07|0.06|N|O|1998-05-24|1998-03-26|1998-06-05|TAKE BACK RETURN|RAIL|furiously final foxes cajole +12933|602|3|3|17|25544.20|0.04|0.03|N|O|1998-03-17|1998-05-09|1998-03-22|COLLECT COD|RAIL|lly unusual dependenc +12933|1092|93|4|30|29792.70|0.00|0.05|N|O|1998-03-06|1998-04-13|1998-03-12|DELIVER IN PERSON|TRUCK| quickly ironic +12933|1677|60|5|50|78933.50|0.07|0.01|N|O|1998-05-29|1998-05-16|1998-06-22|COLLECT COD|REG AIR|uffily. daringly pending packages c +12933|1978|79|6|31|58279.07|0.09|0.06|N|O|1998-03-19|1998-05-07|1998-04-02|TAKE BACK RETURN|AIR|ronic dependencies. carefully regular hocke +12933|1709|94|7|14|22549.80|0.04|0.00|N|O|1998-05-15|1998-05-07|1998-05-25|DELIVER IN PERSON|RAIL| accounts among the special deposits +12934|1682|83|1|37|58596.16|0.10|0.02|A|F|1994-03-15|1994-05-31|1994-04-13|TAKE BACK RETURN|FOB|e stealthy, express epit +12934|790|87|2|34|57486.86|0.01|0.07|R|F|1994-07-04|1994-05-16|1994-07-26|DELIVER IN PERSON|REG AIR|uring the final theodolites. fur +12934|640|41|3|5|7703.20|0.03|0.01|R|F|1994-05-20|1994-05-28|1994-06-04|COLLECT COD|RAIL|ly unusual deposits alongside of the slyl +12934|116|69|4|7|7112.77|0.07|0.04|R|F|1994-06-20|1994-05-10|1994-07-13|TAKE BACK RETURN|SHIP|quickly unusu +12934|111|12|5|13|13144.43|0.02|0.07|A|F|1994-04-25|1994-05-06|1994-05-21|DELIVER IN PERSON|AIR| final requests cajole bold, silent reque +12934|794|95|6|50|84739.50|0.03|0.00|A|F|1994-06-16|1994-05-06|1994-06-23|TAKE BACK RETURN|MAIL|uthless deposits wake slyly. care +12934|1184|93|7|47|51003.46|0.06|0.01|A|F|1994-04-22|1994-05-25|1994-05-16|NONE|SHIP|pecial instructions nag s +12935|17|18|1|9|8253.09|0.10|0.01|A|F|1994-08-10|1994-07-01|1994-08-20|TAKE BACK RETURN|MAIL|special asymptotes sleep furiously. c +12935|1275|50|2|4|4705.08|0.01|0.00|A|F|1994-05-27|1994-08-05|1994-06-13|DELIVER IN PERSON|FOB|jole above the regular, regular gifts +12935|413|72|3|3|3940.23|0.00|0.02|R|F|1994-06-01|1994-07-15|1994-06-22|TAKE BACK RETURN|REG AIR|ons. blithely final instructions print furi +12935|1882|69|4|31|55300.28|0.10|0.07|A|F|1994-08-23|1994-07-07|1994-08-29|NONE|SHIP|ts cajole blithely against +12960|303|4|1|38|45725.40|0.02|0.04|A|F|1993-10-26|1994-01-08|1993-11-14|NONE|AIR|structions +12960|127|28|2|32|32867.84|0.06|0.07|A|F|1994-02-08|1993-12-19|1994-02-21|COLLECT COD|REG AIR|s detect blithely. slyly careful +12960|1374|51|3|8|10202.96|0.01|0.02|R|F|1994-01-05|1993-11-27|1994-02-01|DELIVER IN PERSON|AIR|its cajole. special, bold requests +12960|237|65|4|38|43214.74|0.08|0.06|A|F|1993-12-04|1993-11-18|1993-12-21|TAKE BACK RETURN|SHIP| quiet requ +12961|157|84|1|43|45457.45|0.02|0.01|A|F|1995-04-08|1995-01-31|1995-05-01|COLLECT COD|REG AIR|ilent pinto beans cajole fluffily regul +12961|1373|74|2|15|19115.55|0.04|0.01|A|F|1995-02-16|1995-01-30|1995-03-04|COLLECT COD|TRUCK| pending requests ab +12961|1700|1|3|22|35237.40|0.04|0.02|R|F|1995-03-25|1995-02-06|1995-04-17|NONE|MAIL|blithely i +12961|960|63|4|20|37219.20|0.07|0.03|R|F|1995-01-10|1995-01-30|1995-01-29|NONE|AIR|ges alongside of the accounts +12962|1619|2|1|25|38015.25|0.10|0.07|N|O|1995-10-30|1996-01-26|1995-11-03|NONE|RAIL|ut the blithely express braids. slyly fi +12962|1931|64|2|16|29326.88|0.07|0.04|N|O|1995-12-29|1995-11-30|1996-01-06|NONE|AIR|olites haggle. inst +12962|1537|58|3|43|61856.79|0.00|0.06|N|O|1996-02-04|1996-01-16|1996-03-01|NONE|TRUCK|nts haggle a +12963|746|47|1|42|69163.08|0.00|0.05|N|O|1998-08-27|1998-08-23|1998-09-01|COLLECT COD|TRUCK|d packages affix quickly quickly u +12964|265|20|1|7|8156.82|0.05|0.04|N|O|1998-03-31|1998-03-30|1998-04-06|TAKE BACK RETURN|FOB|uriously even pinto beans +12964|1371|72|2|11|13996.07|0.02|0.07|N|O|1998-05-08|1998-03-27|1998-06-07|NONE|TRUCK|y. regular deposits among the blithely cl +12964|1304|5|3|14|16874.20|0.03|0.00|N|O|1998-05-11|1998-02-26|1998-06-03|DELIVER IN PERSON|REG AIR|pinto beans after the blit +12964|444|3|4|33|44366.52|0.07|0.08|N|O|1998-01-30|1998-03-19|1998-02-12|TAKE BACK RETURN|MAIL|latelets. qui +12964|885|19|5|32|57148.16|0.05|0.07|N|O|1998-03-14|1998-04-02|1998-03-24|DELIVER IN PERSON|AIR|r the furiousl +12964|183|10|6|28|30329.04|0.02|0.07|N|O|1998-02-26|1998-02-22|1998-03-01|DELIVER IN PERSON|MAIL|gh the regular accounts. +12964|619|82|7|38|57745.18|0.10|0.05|N|O|1998-02-02|1998-03-11|1998-02-09|TAKE BACK RETURN|RAIL|riously final deposits; theodoli +12965|499|100|1|15|20992.35|0.00|0.08|A|F|1993-08-17|1993-08-30|1993-09-12|TAKE BACK RETURN|FOB|counts are furiously +12965|1462|80|2|34|46357.64|0.03|0.08|R|F|1993-09-10|1993-09-07|1993-09-21|COLLECT COD|TRUCK| regular requests. bold, +12965|1115|52|3|35|35563.85|0.02|0.03|R|F|1993-06-29|1993-09-19|1993-07-05|COLLECT COD|FOB|even requests haggle quietly spe +12966|464|52|1|35|47756.10|0.02|0.07|N|O|1997-12-15|1997-12-11|1997-12-21|COLLECT COD|AIR|ly furiously regular depo +12966|1648|90|2|1|1549.64|0.05|0.04|N|O|1997-12-28|1997-12-21|1998-01-01|TAKE BACK RETURN|AIR|uickly furious +12967|388|89|1|8|10307.04|0.07|0.02|R|F|1993-10-01|1993-12-03|1993-10-02|TAKE BACK RETURN|FOB|the carefully regular accounts +12992|16|42|1|32|29312.32|0.01|0.02|N|O|1997-04-09|1997-04-13|1997-04-18|COLLECT COD|RAIL|ic deposits. quick +12992|614|77|2|6|9087.66|0.06|0.08|N|O|1997-04-04|1997-04-29|1997-04-17|DELIVER IN PERSON|RAIL|atelets about the slyly pendin +12992|1293|68|3|32|38217.28|0.03|0.01|N|O|1997-05-01|1997-04-03|1997-05-19|NONE|RAIL|pecial ideas. blithely final accounts are b +12992|602|34|4|26|39067.60|0.01|0.02|N|O|1997-06-15|1997-03-29|1997-06-17|DELIVER IN PERSON|MAIL|tes haggle b +12992|666|67|5|44|68933.04|0.03|0.00|N|O|1997-03-14|1997-04-21|1997-03-31|NONE|REG AIR|oxes. carefully bold grouches +12992|671|65|6|10|15716.70|0.00|0.05|N|O|1997-05-31|1997-05-04|1997-06-22|NONE|MAIL|lyly express packages. bold, final foxe +12993|1209|84|1|7|7771.40|0.08|0.06|N|O|1998-07-09|1998-07-21|1998-08-04|COLLECT COD|FOB|er the deposi +12993|907|8|2|22|39773.80|0.05|0.04|N|O|1998-08-03|1998-07-14|1998-08-29|NONE|AIR|never. carefully ironic platelets +12994|175|76|1|48|51608.16|0.00|0.05|A|F|1995-03-12|1995-02-07|1995-03-21|NONE|AIR|long the pending, bold excuses. pending +12995|1011|82|1|46|41952.46|0.03|0.00|N|O|1996-08-02|1996-09-14|1996-09-01|DELIVER IN PERSON|SHIP|fily along the ironic platelets. exc +12995|1826|70|2|14|24189.48|0.01|0.08|N|O|1996-08-20|1996-09-04|1996-09-01|NONE|MAIL|nts haggle bli +12995|1768|53|3|31|51762.56|0.01|0.02|N|O|1996-10-19|1996-10-17|1996-10-30|DELIVER IN PERSON|MAIL|blithely ironic asymptotes nag quickly +12995|1179|52|4|33|35645.61|0.09|0.00|N|O|1996-10-20|1996-09-27|1996-11-18|NONE|FOB|s cajole. furiously ironic theodolites +12995|369|26|5|6|7616.16|0.10|0.08|N|O|1996-10-13|1996-09-01|1996-10-19|TAKE BACK RETURN|MAIL|snooze alongside of t +12995|1459|60|6|30|40813.50|0.01|0.04|N|O|1996-09-23|1996-10-10|1996-09-30|COLLECT COD|SHIP| cajole fluffily express requests. bold, r +12996|660|23|1|8|12485.28|0.09|0.03|N|O|1996-02-19|1996-02-26|1996-03-19|TAKE BACK RETURN|TRUCK|express, ironic +12996|1237|49|2|6|6829.38|0.08|0.01|N|O|1996-02-16|1996-02-03|1996-02-28|NONE|RAIL|y above the always ironic instructions. re +12996|1324|25|3|49|60040.68|0.04|0.03|N|O|1995-12-25|1996-02-12|1996-01-08|NONE|SHIP| nod above the carefully final +12996|1102|11|4|30|30093.00|0.02|0.02|N|O|1996-04-04|1996-01-14|1996-04-28|COLLECT COD|FOB|sts haggle slowly e +12997|1292|4|1|6|7159.74|0.05|0.05|N|O|1996-06-06|1996-08-07|1996-06-30|NONE|RAIL|eposits. sly +12997|1303|4|2|7|8430.10|0.04|0.06|N|O|1996-07-07|1996-06-27|1996-07-08|NONE|REG AIR|eas cajole enticingly? even requests after +12997|696|28|3|5|7983.45|0.05|0.00|N|O|1996-08-18|1996-08-10|1996-09-12|NONE|AIR| accounts wake deposits. request +12998|650|51|1|2|3101.30|0.04|0.08|N|O|1997-01-25|1996-11-29|1997-02-04|COLLECT COD|AIR|cial packages boost. regula +12998|1380|81|2|18|23064.84|0.07|0.06|N|O|1996-10-23|1996-11-23|1996-10-27|COLLECT COD|REG AIR|efully. slyly even platelets cajole +12999|1899|43|1|45|81040.05|0.10|0.05|A|F|1993-07-09|1993-06-23|1993-08-04|TAKE BACK RETURN|TRUCK|y ironic ideas use furiously carefully regu +12999|1522|23|2|31|44129.12|0.01|0.06|A|F|1993-05-09|1993-05-21|1993-05-14|DELIVER IN PERSON|TRUCK|jole silently. quickly final foxes d +12999|650|82|3|36|55823.40|0.00|0.03|A|F|1993-04-24|1993-05-19|1993-05-11|TAKE BACK RETURN|RAIL|unts maintain blithely furiously regular +12999|856|57|4|20|35137.00|0.01|0.04|A|F|1993-07-05|1993-06-24|1993-07-10|DELIVER IN PERSON|TRUCK|e carefully pending Tiresias? pa +13024|790|91|1|24|40578.96|0.04|0.04|R|F|1992-06-16|1992-05-26|1992-07-04|DELIVER IN PERSON|RAIL|ckages along +13024|1258|33|2|1|1159.25|0.10|0.02|R|F|1992-05-15|1992-06-11|1992-06-09|COLLECT COD|AIR|sleep? blithely slow requests +13024|533|34|3|12|17202.36|0.09|0.05|R|F|1992-04-17|1992-04-30|1992-04-24|DELIVER IN PERSON|MAIL|en instructions x-ra +13025|544|75|1|26|37558.04|0.10|0.01|N|O|1998-02-07|1998-03-22|1998-02-08|NONE|FOB|fully bold theodolites wake. ironic +13025|107|60|2|24|24170.40|0.00|0.03|N|O|1998-05-19|1998-03-21|1998-05-31|TAKE BACK RETURN|RAIL|mold blithely final accounts. even acc +13025|1037|8|3|21|19698.63|0.08|0.02|N|O|1998-04-15|1998-02-27|1998-04-21|TAKE BACK RETURN|FOB|nag blithely +13025|939|40|4|32|58877.76|0.00|0.03|N|O|1998-03-15|1998-03-13|1998-04-03|DELIVER IN PERSON|REG AIR| blithely final requests boost +13026|965|100|1|44|82102.24|0.05|0.07|N|O|1997-06-08|1997-05-23|1997-06-18|DELIVER IN PERSON|RAIL|he slyly silent dugouts +13026|1746|89|2|18|29659.32|0.04|0.01|N|O|1997-05-06|1997-06-23|1997-05-29|COLLECT COD|RAIL|ously. carefully regular reques +13026|308|37|3|11|13291.30|0.05|0.00|N|O|1997-07-30|1997-05-17|1997-08-23|TAKE BACK RETURN|AIR|nal foxes do maintain am +13026|1710|95|4|26|41904.46|0.10|0.06|N|O|1997-05-21|1997-06-10|1997-06-20|COLLECT COD|REG AIR|uctions. express +13026|1524|45|5|21|29935.92|0.06|0.07|N|O|1997-06-01|1997-05-07|1997-06-29|DELIVER IN PERSON|FOB|es are never. blithely re +13027|1003|4|1|30|27120.00|0.05|0.02|A|F|1992-01-17|1992-02-24|1992-02-04|DELIVER IN PERSON|TRUCK| accounts. unusual deposits are carefull +13027|222|4|2|33|37033.26|0.01|0.07|R|F|1992-03-24|1992-03-22|1992-04-04|TAKE BACK RETURN|MAIL|, regular package +13027|729|94|3|15|24445.80|0.08|0.04|A|F|1992-04-06|1992-04-04|1992-04-28|NONE|SHIP| final accounts a +13027|1671|13|4|6|9436.02|0.09|0.01|A|F|1992-03-19|1992-04-04|1992-04-10|TAKE BACK RETURN|REG AIR|olites engage slyly carefully regular +13027|1554|35|5|45|65499.75|0.10|0.06|A|F|1992-03-07|1992-03-05|1992-03-18|COLLECT COD|MAIL|along the +13028|1085|21|1|35|34512.80|0.07|0.07|A|F|1994-04-13|1994-06-22|1994-05-09|DELIVER IN PERSON|RAIL|slyly special accoun +13028|1559|40|2|3|4381.65|0.06|0.00|A|F|1994-05-21|1994-07-03|1994-05-30|NONE|RAIL|ake slyly about the regular +13028|924|27|3|40|72996.80|0.10|0.01|A|F|1994-05-30|1994-06-25|1994-06-05|DELIVER IN PERSON|SHIP| blithely. regular, silent foxes cajole c +13028|1431|49|4|49|65289.07|0.03|0.06|A|F|1994-05-18|1994-06-13|1994-06-06|COLLECT COD|TRUCK|ts affix b +13028|447|6|5|43|57939.92|0.01|0.03|R|F|1994-08-05|1994-06-30|1994-08-31|DELIVER IN PERSON|TRUCK|ss the stealthily q +13029|1014|50|1|4|3660.04|0.04|0.08|N|O|1997-11-13|1998-01-13|1997-12-09|DELIVER IN PERSON|MAIL|the ironic, final requests. +13029|614|8|2|14|21204.54|0.04|0.06|N|O|1998-03-03|1998-01-16|1998-03-26|TAKE BACK RETURN|RAIL| carefully regular ex +13029|821|21|3|39|67150.98|0.10|0.01|N|O|1997-12-04|1998-01-14|1997-12-26|NONE|TRUCK| even accounts. accounts cajole. b +13029|170|71|4|34|36385.78|0.00|0.01|N|O|1998-02-04|1998-01-24|1998-03-02|TAKE BACK RETURN|AIR|apades are furiously ab +13029|314|43|5|44|53429.64|0.03|0.04|N|O|1998-01-23|1997-12-21|1998-02-06|NONE|AIR| dependencies. deposits ab +13030|1671|13|1|42|66052.14|0.03|0.00|A|F|1994-10-17|1994-09-24|1994-10-30|TAKE BACK RETURN|RAIL|ts sleep after the express deposits. blithe +13030|182|61|2|46|49780.28|0.08|0.07|A|F|1994-08-07|1994-09-16|1994-09-02|TAKE BACK RETURN|MAIL|refully ironic +13030|1334|11|3|27|33353.91|0.05|0.07|R|F|1994-11-19|1994-09-26|1994-11-27|COLLECT COD|REG AIR|ual, final accounts. final, pe +13031|1122|59|1|19|19439.28|0.01|0.07|R|F|1993-01-17|1993-02-26|1993-01-24|COLLECT COD|TRUCK|round the accounts +13031|764|97|2|39|64925.64|0.01|0.07|R|F|1993-01-07|1993-02-15|1993-01-31|DELIVER IN PERSON|TRUCK|ss packages. final theodolites sleep af +13031|940|41|3|17|31295.98|0.07|0.07|A|F|1993-03-08|1993-02-26|1993-03-27|TAKE BACK RETURN|REG AIR|e slyly sl +13031|1859|89|4|12|21130.20|0.00|0.05|R|F|1993-01-28|1993-02-16|1993-02-07|TAKE BACK RETURN|AIR|ecial asymptotes doze bli +13031|414|15|5|44|57834.04|0.05|0.08|R|F|1993-04-03|1993-02-08|1993-04-04|TAKE BACK RETURN|SHIP|unusual packages. blithely regular fra +13031|78|29|6|38|37166.66|0.08|0.04|R|F|1993-03-08|1993-02-08|1993-03-18|COLLECT COD|MAIL|ly regular dugouts boost carefully careful +13056|1222|23|1|29|32573.38|0.09|0.08|A|F|1994-05-27|1994-05-29|1994-05-31|NONE|FOB|ce of the furiously even the +13056|1235|36|2|36|40904.28|0.03|0.02|R|F|1994-04-24|1994-06-30|1994-05-01|DELIVER IN PERSON|REG AIR|, special deposits haggle thinly accordi +13056|705|70|3|28|44959.60|0.07|0.03|R|F|1994-06-20|1994-07-18|1994-07-13|NONE|MAIL|efully fluffily unusual acc +13056|32|33|4|11|10252.33|0.02|0.01|R|F|1994-07-21|1994-05-28|1994-08-20|TAKE BACK RETURN|REG AIR|lly regular frays boost about +13056|625|57|5|21|32038.02|0.07|0.04|R|F|1994-07-14|1994-06-09|1994-07-30|NONE|SHIP|arefully regular requests are above +13056|467|55|6|28|38288.88|0.09|0.06|R|F|1994-07-06|1994-06-21|1994-08-03|COLLECT COD|SHIP| express deposi +13057|1850|37|1|44|77081.40|0.02|0.02|N|O|1998-02-22|1998-02-12|1998-03-19|COLLECT COD|SHIP|x-ray above the slyly regular instructi +13057|809|76|2|16|27356.80|0.08|0.03|N|O|1998-01-14|1998-01-28|1998-02-07|TAKE BACK RETURN|AIR|ests detect +13058|459|89|1|9|12235.05|0.03|0.05|N|O|1997-05-19|1997-06-14|1997-05-24|COLLECT COD|SHIP|gular deposits. slyly e +13059|413|14|1|22|28895.02|0.01|0.01|N|O|1997-07-20|1997-06-30|1997-08-04|DELIVER IN PERSON|TRUCK|ecial, regul +13059|850|84|2|3|5252.55|0.00|0.05|N|O|1997-07-14|1997-08-20|1997-07-17|TAKE BACK RETURN|AIR| slyly bold theodolites-- quickly fin +13059|1161|34|3|40|42486.40|0.03|0.00|N|O|1997-09-20|1997-07-27|1997-09-22|COLLECT COD|RAIL|elets cajole slyly after the furiou +13059|1339|16|4|36|44651.88|0.08|0.08|N|O|1997-06-29|1997-08-08|1997-07-13|NONE|FOB| ironic packages try to haggle caref +13059|1073|79|5|21|20455.47|0.09|0.05|N|O|1997-06-15|1997-08-06|1997-07-06|TAKE BACK RETURN|RAIL|ely ironic pinto beans. deposits haggle- +13059|1789|32|6|35|59177.30|0.05|0.03|N|O|1997-09-24|1997-07-21|1997-10-14|DELIVER IN PERSON|AIR| instructions +13060|1992|81|1|17|32197.83|0.01|0.08|N|O|1997-06-03|1997-04-24|1997-06-05|NONE|REG AIR|ely final instructi +13060|1785|70|2|30|50603.40|0.05|0.00|N|O|1997-04-30|1997-04-05|1997-05-04|COLLECT COD|REG AIR|es sleep bold re +13060|53|54|3|7|6671.35|0.10|0.03|N|O|1997-02-10|1997-04-24|1997-02-14|COLLECT COD|REG AIR| pending platelets sleep blithely +13060|853|87|4|40|70154.00|0.10|0.07|N|O|1997-03-26|1997-04-14|1997-04-10|TAKE BACK RETURN|AIR|he blithely re +13060|1216|54|5|36|40219.56|0.05|0.01|N|O|1997-04-19|1997-03-10|1997-04-26|COLLECT COD|TRUCK|the doggedly ironic asympt +13060|731|64|6|19|31002.87|0.06|0.04|N|O|1997-05-09|1997-05-02|1997-05-26|NONE|RAIL|he pending courts thrash slyl +13060|740|5|7|32|52503.68|0.10|0.00|N|O|1997-04-14|1997-03-28|1997-05-01|TAKE BACK RETURN|MAIL|encies. furiously unu +13061|588|19|1|1|1488.58|0.04|0.04|N|O|1997-10-17|1997-10-19|1997-11-03|TAKE BACK RETURN|MAIL|ly special deposits wake +13061|1204|16|2|9|9946.80|0.04|0.08|N|O|1997-11-27|1997-12-10|1997-12-05|TAKE BACK RETURN|SHIP|equests are ironic, regular dep +13061|1874|75|3|37|65707.19|0.06|0.04|N|O|1997-11-14|1997-10-28|1997-11-28|TAKE BACK RETURN|AIR|furiously regular sheaves doze a +13062|1026|32|1|39|36153.78|0.05|0.07|N|O|1996-08-08|1996-06-03|1996-08-14|DELIVER IN PERSON|RAIL|enticingly? +13062|1021|57|2|27|24894.54|0.09|0.06|N|O|1996-07-19|1996-07-29|1996-07-25|NONE|FOB|ending braids haggle carefully final pi +13062|442|72|3|2|2684.88|0.10|0.02|N|O|1996-07-22|1996-07-19|1996-08-02|DELIVER IN PERSON|MAIL|he unusual, regular ide +13063|441|100|1|29|38901.76|0.08|0.00|N|O|1997-03-03|1997-03-29|1997-03-22|NONE|MAIL|tes. pending, even warhors +13063|1506|47|2|24|33780.00|0.07|0.06|N|O|1997-02-22|1997-03-13|1997-03-20|COLLECT COD|SHIP|de of the fluffil +13063|448|78|3|27|36407.88|0.03|0.01|N|O|1997-02-25|1997-03-05|1997-03-09|COLLECT COD|REG AIR|to are. furiously regular r +13063|359|88|4|45|56670.75|0.05|0.03|N|O|1997-05-13|1997-03-06|1997-05-17|DELIVER IN PERSON|REG AIR|yly express, express fo +13063|966|67|5|5|9334.80|0.06|0.04|N|O|1997-04-28|1997-04-02|1997-05-11|DELIVER IN PERSON|MAIL|efully furiously r +13063|1541|22|6|45|64914.30|0.04|0.03|N|O|1997-04-24|1997-03-10|1997-05-20|TAKE BACK RETURN|TRUCK|ymptotes integrate? final foxe +13063|1980|13|7|45|84689.10|0.01|0.01|N|O|1997-03-19|1997-03-05|1997-04-08|TAKE BACK RETURN|FOB|s. carefully care +13088|153|6|1|18|18956.70|0.01|0.00|R|F|1993-08-15|1993-05-27|1993-08-21|NONE|RAIL|tes. carefully bold dependencies are +13088|20|96|2|42|38640.84|0.10|0.07|R|F|1993-08-02|1993-07-08|1993-08-14|NONE|REG AIR|s wake slyly above the furiously regular +13088|1511|52|3|35|49437.85|0.00|0.06|A|F|1993-05-08|1993-06-15|1993-05-21|COLLECT COD|AIR|quickly final pinto be +13088|1009|45|4|15|13650.00|0.06|0.01|R|F|1993-07-31|1993-07-06|1993-08-02|COLLECT COD|FOB|ts-- carefu +13088|1903|48|5|3|5414.70|0.01|0.06|A|F|1993-08-04|1993-06-09|1993-08-14|COLLECT COD|TRUCK|s cajole regularly furiously ironic acco +13088|582|73|6|48|71163.84|0.10|0.05|A|F|1993-06-01|1993-06-04|1993-06-23|DELIVER IN PERSON|SHIP|theodolites wak +13088|565|96|7|46|67415.76|0.04|0.04|A|F|1993-08-11|1993-05-29|1993-09-07|NONE|RAIL|y about the slyly final accou +13089|1909|10|1|28|50705.20|0.05|0.08|N|O|1996-04-07|1996-01-25|1996-04-22|DELIVER IN PERSON|AIR|theodolites boost blithely +13089|944|13|2|50|92247.00|0.03|0.08|N|O|1996-03-01|1996-02-01|1996-03-18|COLLECT COD|SHIP|nts detect carefully above th +13089|475|76|3|40|55018.80|0.06|0.08|N|O|1996-02-24|1996-01-29|1996-03-11|NONE|AIR|sts. carefull +13089|653|54|4|49|76128.85|0.07|0.03|N|O|1996-03-19|1996-03-01|1996-04-10|DELIVER IN PERSON|FOB|packages haggle blithel +13090|855|56|1|32|56187.20|0.10|0.00|R|F|1993-10-08|1993-08-31|1993-11-01|COLLECT COD|RAIL|ress instruction +13090|104|83|2|34|34139.40|0.09|0.03|R|F|1993-09-24|1993-09-19|1993-09-28|COLLECT COD|TRUCK|ly regular dinos a +13090|1664|88|3|18|28181.88|0.10|0.08|R|F|1993-11-24|1993-08-28|1993-12-02|COLLECT COD|RAIL|unusual packag +13090|717|50|4|10|16177.10|0.01|0.07|A|F|1993-08-20|1993-09-29|1993-08-25|TAKE BACK RETURN|MAIL|ideas. regular waters +13090|22|23|5|20|18440.40|0.00|0.05|R|F|1993-11-01|1993-10-24|1993-11-16|COLLECT COD|RAIL| furiously regular a +13091|1923|56|1|11|20074.12|0.00|0.00|R|F|1995-02-08|1994-12-28|1995-02-18|DELIVER IN PERSON|SHIP|st boldly after the furiously regular court +13091|436|24|2|11|14700.73|0.10|0.04|A|F|1994-11-22|1995-01-17|1994-12-08|TAKE BACK RETURN|MAIL|egular, pending braids across the +13091|232|87|3|23|26041.29|0.02|0.02|R|F|1995-02-22|1994-12-27|1995-02-23|NONE|AIR|pinto beans sleep. bold instructions aroun +13091|1058|59|4|31|29730.55|0.07|0.06|A|F|1995-01-26|1995-01-21|1995-01-30|DELIVER IN PERSON|TRUCK|even theodolites snooze quickly special +13091|1398|75|5|38|49376.82|0.08|0.04|R|F|1995-01-26|1995-02-10|1995-02-21|NONE|REG AIR|ly final pinto beans wake ideas. bli +13091|1510|91|6|48|67752.48|0.06|0.01|A|F|1995-03-02|1995-01-23|1995-03-29|DELIVER IN PERSON|SHIP|fully. carefully pending accounts +13092|974|77|1|31|58124.07|0.00|0.02|N|O|1998-10-20|1998-08-27|1998-11-17|DELIVER IN PERSON|TRUCK|atelets alongside of the caref +13092|936|71|2|48|88172.64|0.09|0.04|N|O|1998-07-24|1998-09-10|1998-07-27|DELIVER IN PERSON|AIR|dencies. fluffily express dep +13093|1630|31|1|31|47480.53|0.06|0.06|N|O|1996-07-24|1996-06-30|1996-08-11|COLLECT COD|FOB|ckages. regular sentiments use slyly sl +13093|970|73|2|39|72967.83|0.08|0.07|N|O|1996-07-02|1996-07-18|1996-07-20|COLLECT COD|MAIL| pinto beans u +13093|1817|61|3|15|25782.15|0.03|0.03|N|O|1996-05-15|1996-06-18|1996-05-31|COLLECT COD|TRUCK|ages haggle: unusua +13094|1277|89|1|41|48309.07|0.00|0.02|R|F|1993-09-15|1993-11-04|1993-09-19|COLLECT COD|TRUCK| about the regular packages. warthogs +13094|32|58|2|16|14912.48|0.00|0.01|R|F|1993-10-05|1993-09-30|1993-10-14|NONE|FOB|e slyly unusual requests. +13095|225|7|1|42|47259.24|0.10|0.02|N|O|1996-11-20|1996-09-24|1996-12-05|NONE|SHIP|e requests. bold +13095|1016|52|2|49|44933.49|0.02|0.01|N|O|1996-10-18|1996-10-14|1996-11-10|COLLECT COD|FOB|eep packages. f +13095|1288|100|3|46|54706.88|0.08|0.03|N|O|1996-08-29|1996-09-07|1996-09-21|COLLECT COD|SHIP| doggedly furiously ironic deposits. p +13095|592|83|4|34|50748.06|0.10|0.03|N|O|1996-08-25|1996-09-14|1996-09-02|TAKE BACK RETURN|TRUCK|ke against th +13095|1690|32|5|29|46159.01|0.10|0.08|N|O|1996-07-28|1996-09-15|1996-08-24|TAKE BACK RETURN|RAIL|iously iron +13095|1264|65|6|17|19809.42|0.07|0.06|N|O|1996-09-20|1996-09-18|1996-10-10|NONE|REG AIR|en ideas. deposits br +13095|1315|92|7|27|32840.37|0.05|0.00|N|O|1996-10-07|1996-08-21|1996-10-24|TAKE BACK RETURN|RAIL|affix carefully after the carefully pendin +13120|622|16|1|44|66995.28|0.04|0.08|A|F|1994-12-21|1995-01-15|1995-01-03|COLLECT COD|MAIL|en pinto beans. fluffily special +13120|1137|46|2|22|22838.86|0.06|0.00|R|F|1995-03-14|1995-02-11|1995-04-08|NONE|MAIL|. requests cajole slyly. +13121|1061|97|1|50|48103.00|0.10|0.06|A|F|1993-03-26|1993-05-21|1993-03-31|DELIVER IN PERSON|TRUCK| blithely against the car +13121|100|1|2|17|17001.70|0.08|0.06|R|F|1993-03-14|1993-05-20|1993-03-17|TAKE BACK RETURN|REG AIR| the even pin +13121|1723|24|3|1|1624.72|0.06|0.05|A|F|1993-06-17|1993-04-14|1993-06-28|NONE|AIR|ggedly. slyly ironic accou +13121|1495|96|4|44|61445.56|0.00|0.04|A|F|1993-05-01|1993-06-02|1993-05-07|NONE|MAIL|jole. sometimes ironic account +13121|1063|64|5|24|23137.44|0.01|0.07|R|F|1993-05-27|1993-04-12|1993-06-03|TAKE BACK RETURN|AIR|ts. express packages about the fur +13121|755|56|6|11|18213.25|0.05|0.03|A|F|1993-06-23|1993-04-25|1993-07-11|NONE|MAIL|pending idea +13121|247|75|7|18|20650.32|0.00|0.00|R|F|1993-07-01|1993-05-12|1993-07-10|COLLECT COD|MAIL|de of the unusual, regular packages ha +13122|1095|31|1|42|41835.78|0.08|0.08|A|F|1994-10-15|1994-11-28|1994-11-06|DELIVER IN PERSON|AIR|s the final +13122|806|6|2|8|13654.40|0.09|0.02|A|F|1995-01-15|1994-11-23|1995-01-19|DELIVER IN PERSON|AIR|carefully +13122|617|11|3|34|51598.74|0.05|0.06|A|F|1994-12-16|1994-12-09|1995-01-08|COLLECT COD|FOB|usly silent accounts wake slyly. +13122|1938|71|4|16|29438.88|0.00|0.08|A|F|1995-01-02|1994-12-15|1995-01-20|DELIVER IN PERSON|MAIL| ideas. blithely ironic +13122|197|50|5|23|25235.37|0.01|0.08|A|F|1994-10-31|1994-10-30|1994-11-08|TAKE BACK RETURN|AIR|lar courts +13123|1537|58|1|11|15823.83|0.02|0.00|N|O|1998-10-05|1998-08-04|1998-10-27|DELIVER IN PERSON|REG AIR|ts sleep quickly blithe +13123|1476|55|2|13|17907.11|0.06|0.01|N|O|1998-09-17|1998-08-17|1998-10-16|TAKE BACK RETURN|AIR|ously final forges use blithely a +13123|318|19|3|37|45077.47|0.09|0.03|N|O|1998-10-28|1998-09-04|1998-11-25|COLLECT COD|MAIL|al foxes affix furiously ironic accounts +13123|1670|12|4|50|78583.50|0.04|0.07|N|O|1998-07-21|1998-08-30|1998-07-31|TAKE BACK RETURN|MAIL|ts nag according +13123|1564|45|5|16|23448.96|0.03|0.08|N|O|1998-08-22|1998-08-13|1998-09-02|NONE|MAIL|to beans. quickly final accounts ar +13123|521|22|6|18|25587.36|0.09|0.03|N|O|1998-09-21|1998-08-15|1998-10-19|DELIVER IN PERSON|TRUCK|ns sleep furiously. furiously bold +13123|375|76|7|4|5101.48|0.08|0.01|N|O|1998-08-12|1998-09-09|1998-08-21|TAKE BACK RETURN|TRUCK|egular dependencies are carefully. slyly +13124|295|77|1|28|33468.12|0.03|0.07|A|F|1994-01-18|1994-01-27|1994-01-28|NONE|REG AIR|y express patterns +13124|1537|78|2|12|17262.36|0.06|0.04|A|F|1994-02-23|1994-02-06|1994-03-24|TAKE BACK RETURN|SHIP|ld ideas. quickly regular +13124|671|72|3|4|6286.68|0.09|0.06|A|F|1994-04-04|1994-02-26|1994-04-09|NONE|AIR|into beans. daring theodolites cajole s +13125|1485|64|1|16|22183.68|0.06|0.04|R|F|1994-03-07|1994-02-18|1994-03-27|DELIVER IN PERSON|RAIL|structions wake. exp +13125|1211|12|2|2|2224.42|0.01|0.05|R|F|1994-04-10|1994-02-04|1994-04-18|NONE|REG AIR|ies wake blithely ironic d +13125|95|21|3|25|24877.25|0.05|0.05|A|F|1994-02-19|1994-03-03|1994-02-23|DELIVER IN PERSON|SHIP| the blithely bold pi +13125|912|81|4|41|74329.31|0.06|0.06|A|F|1994-01-18|1994-01-22|1994-02-03|DELIVER IN PERSON|FOB|ncies haggle alongsid +13125|1528|69|5|27|38597.04|0.08|0.03|A|F|1994-02-03|1994-02-18|1994-02-06|NONE|TRUCK| dependencies. re +13125|37|38|6|27|25299.81|0.01|0.01|A|F|1994-04-05|1994-02-04|1994-04-17|TAKE BACK RETURN|SHIP|iously final courts. slyly special acc +13125|536|97|7|4|5746.12|0.08|0.00|A|F|1994-01-23|1994-02-16|1994-02-21|COLLECT COD|TRUCK|lithely carefull +13126|1453|93|1|50|67722.50|0.10|0.08|N|O|1996-02-12|1995-12-22|1996-02-26|DELIVER IN PERSON|FOB|luffily furiously final a +13126|1566|47|2|16|23480.96|0.08|0.02|N|O|1995-12-13|1996-01-02|1995-12-28|COLLECT COD|SHIP|r accounts about the +13126|781|14|3|2|3363.56|0.02|0.00|N|O|1995-12-09|1995-12-09|1995-12-26|DELIVER IN PERSON|TRUCK|lar deposits cajole carefully carefu +13126|1470|71|4|11|15086.17|0.10|0.04|N|O|1995-12-13|1996-01-12|1996-01-12|COLLECT COD|SHIP|es. slyly iron +13126|1082|83|5|26|25560.08|0.02|0.04|N|O|1995-12-05|1996-01-16|1995-12-23|DELIVER IN PERSON|TRUCK|o beans haggle quickly +13127|1139|40|1|40|41605.20|0.07|0.00|R|F|1993-09-06|1993-10-30|1993-09-25|COLLECT COD|FOB|tes. furiously special asympt +13152|1706|7|1|40|64308.00|0.00|0.01|R|F|1994-04-12|1994-04-27|1994-04-17|COLLECT COD|MAIL|ts. slyly special accounts sleep agai +13152|1243|44|2|47|53779.28|0.08|0.06|R|F|1994-03-13|1994-05-16|1994-03-19|NONE|MAIL|ns wake carefull +13152|91|42|3|24|23786.16|0.05|0.06|A|F|1994-04-16|1994-04-01|1994-05-15|COLLECT COD|MAIL|ests along the regular accounts caj +13152|866|66|4|48|84809.28|0.01|0.06|A|F|1994-02-18|1994-04-25|1994-02-23|COLLECT COD|FOB|usual pinto beans +13152|235|90|5|47|53355.81|0.07|0.08|R|F|1994-05-07|1994-03-29|1994-05-25|NONE|RAIL| gifts cajole unusual +13153|1751|52|1|23|38013.25|0.06|0.07|N|O|1997-01-26|1997-01-23|1997-02-06|DELIVER IN PERSON|RAIL|nts integrate carefully. +13153|1137|74|2|7|7266.91|0.04|0.06|N|O|1996-12-03|1997-01-16|1997-01-01|NONE|FOB|eep quickly quickly daring foxes; slyly reg +13153|1592|93|3|22|32858.98|0.04|0.00|N|O|1997-02-04|1997-01-10|1997-03-01|TAKE BACK RETURN|SHIP|er. furiously unusu +13153|580|11|4|13|19247.54|0.01|0.05|N|O|1997-03-03|1997-01-08|1997-03-06|DELIVER IN PERSON|AIR|s thrash. regular acco +13153|1208|9|5|32|35494.40|0.03|0.04|N|O|1997-02-28|1997-01-14|1997-03-13|TAKE BACK RETURN|FOB|onic courts affix instruct +13153|614|15|6|21|31806.81|0.04|0.07|N|O|1997-03-07|1996-12-11|1997-04-01|COLLECT COD|SHIP|sely ironic requests sleep. furiously exp +13154|161|40|1|42|44568.72|0.09|0.05|N|O|1997-12-03|1998-01-02|1997-12-27|TAKE BACK RETURN|MAIL| careful pi +13154|484|85|2|31|42918.88|0.04|0.03|N|O|1997-11-02|1997-12-26|1997-11-25|TAKE BACK RETURN|SHIP|hely requests! quickly express asymptotes +13154|423|82|3|33|43672.86|0.04|0.05|N|O|1997-11-12|1997-11-21|1997-12-06|NONE|MAIL|t the carefully +13154|1869|99|4|10|17708.60|0.03|0.05|N|O|1998-02-07|1997-12-09|1998-02-11|COLLECT COD|REG AIR|, ironic ideas haggle en +13154|131|32|5|45|46400.85|0.01|0.07|N|O|1998-02-09|1998-01-06|1998-02-26|COLLECT COD|RAIL|s among the furiously express +13154|602|96|6|34|51088.40|0.10|0.05|N|O|1997-12-12|1997-11-25|1997-12-30|NONE|AIR|ns sleep sometimes? regular, silent +13154|1574|55|7|29|42791.53|0.07|0.05|N|O|1998-01-06|1997-11-26|1998-01-30|COLLECT COD|FOB|lets. caref +13155|303|88|1|5|6016.50|0.06|0.01|N|O|1996-07-15|1996-08-27|1996-07-22|DELIVER IN PERSON|AIR|haggle slyly final hockey pla +13155|1750|35|2|16|26428.00|0.04|0.06|N|O|1996-07-18|1996-08-25|1996-07-27|DELIVER IN PERSON|FOB|ress instructions nag after the +13155|361|18|3|12|15136.32|0.10|0.02|N|O|1996-06-20|1996-08-05|1996-07-14|COLLECT COD|FOB|es cajole. regular foxes cajole care +13155|1130|31|4|24|24747.12|0.05|0.01|N|O|1996-10-13|1996-08-15|1996-11-09|TAKE BACK RETURN|SHIP| packages affix carefully. +13155|532|23|5|23|32948.19|0.08|0.08|N|O|1996-10-13|1996-09-04|1996-10-18|TAKE BACK RETURN|REG AIR|g deposits cajole +13155|260|15|6|31|35968.06|0.08|0.07|N|O|1996-07-24|1996-07-30|1996-07-31|DELIVER IN PERSON|TRUCK|e the slyly unusual deposits. regular, +13155|1727|70|7|35|57005.20|0.10|0.02|N|O|1996-07-18|1996-07-18|1996-07-27|COLLECT COD|RAIL|s. carefully even deposits afte +13156|274|75|1|4|4697.08|0.05|0.06|N|O|1996-01-02|1995-11-14|1996-01-31|NONE|SHIP|nag. furiously ironic depen +13156|1884|85|2|22|39289.36|0.03|0.00|N|O|1995-12-03|1995-12-18|1995-12-07|TAKE BACK RETURN|AIR|the always regular platelets. stealth +13156|1630|54|3|48|73518.24|0.08|0.08|N|O|1996-01-16|1995-11-27|1996-02-15|NONE|REG AIR|lly quickl +13156|280|81|4|32|37768.96|0.10|0.06|N|O|1995-12-20|1995-11-12|1996-01-02|COLLECT COD|SHIP|ess, unusual req +13156|292|20|5|26|30999.54|0.09|0.02|N|O|1996-01-04|1995-12-15|1996-01-13|COLLECT COD|REG AIR|eposits along th +13157|1494|12|1|29|40469.21|0.01|0.08|R|F|1992-03-20|1992-05-03|1992-04-19|COLLECT COD|FOB|ccording to the furiously thin packages. +13157|1819|20|2|13|22370.53|0.09|0.07|R|F|1992-06-12|1992-03-19|1992-06-26|DELIVER IN PERSON|REG AIR|ages wake even accou +13157|1119|28|3|34|34683.74|0.07|0.04|R|F|1992-03-17|1992-03-19|1992-03-28|COLLECT COD|REG AIR|ding pinto +13157|1432|50|4|47|62671.21|0.04|0.02|R|F|1992-03-09|1992-04-04|1992-03-14|NONE|FOB|n requests boost +13157|1459|38|5|33|44894.85|0.03|0.04|R|F|1992-04-05|1992-05-02|1992-04-11|COLLECT COD|RAIL|fluffily. fluffily ironic deposits are car +13157|101|2|6|41|41045.10|0.04|0.07|A|F|1992-02-18|1992-04-13|1992-02-23|DELIVER IN PERSON|FOB|ackages. slyly even requests +13157|253|81|7|26|29984.50|0.08|0.08|A|F|1992-05-11|1992-04-14|1992-05-14|COLLECT COD|RAIL|kages nod furiously expr +13158|872|6|1|49|86870.63|0.10|0.07|A|F|1992-12-08|1993-01-10|1992-12-18|NONE|FOB|s. fluffily pending idea +13158|1322|37|2|24|29359.68|0.06|0.04|R|F|1993-03-22|1993-01-28|1993-03-27|COLLECT COD|MAIL|furiously against the iron +13158|891|91|3|13|23294.57|0.08|0.08|R|F|1993-01-09|1993-02-08|1993-02-08|TAKE BACK RETURN|MAIL|equests affix +13158|492|51|4|2|2784.98|0.07|0.03|R|F|1992-12-14|1992-12-28|1992-12-26|DELIVER IN PERSON|REG AIR|uriously even account +13158|1949|82|5|32|59230.08|0.06|0.08|R|F|1993-01-23|1993-01-21|1993-02-06|DELIVER IN PERSON|RAIL|y ironic asymptotes haggle pending, +13159|998|67|1|50|94949.50|0.02|0.05|N|O|1996-12-25|1997-02-14|1997-01-21|DELIVER IN PERSON|AIR|t, regular pinto beans nag +13159|1819|49|2|26|44741.06|0.09|0.04|N|O|1996-12-20|1997-02-27|1997-01-13|TAKE BACK RETURN|FOB|ckly final somas. deposits af +13159|1310|25|3|12|14535.72|0.10|0.01|N|O|1997-02-20|1997-01-29|1997-03-14|DELIVER IN PERSON|FOB| affix furiously. flu +13159|577|78|4|16|23641.12|0.07|0.02|N|O|1997-02-22|1997-01-14|1997-03-13|COLLECT COD|MAIL|etween the quickly sp +13184|1960|5|1|12|22343.52|0.06|0.04|N|O|1998-05-01|1998-06-18|1998-05-14|TAKE BACK RETURN|MAIL|s wake ruthlessly. furiou +13185|654|86|1|26|40420.90|0.06|0.07|N|O|1997-11-12|1997-09-11|1997-11-18|DELIVER IN PERSON|RAIL|lites use furiously. furiously unusual es +13185|1029|35|2|30|27900.60|0.01|0.05|N|O|1997-09-14|1997-09-07|1997-10-02|NONE|AIR|old dugouts use fur +13185|508|9|3|49|69016.50|0.08|0.00|N|O|1997-08-15|1997-09-17|1997-08-28|TAKE BACK RETURN|SHIP| deposits wake blithely +13185|853|54|4|44|77169.40|0.00|0.03|N|O|1997-09-24|1997-09-24|1997-09-27|NONE|REG AIR|gside of the reg +13185|1937|70|5|6|11033.58|0.08|0.04|N|O|1997-11-11|1997-08-15|1997-11-13|NONE|FOB|ideas wake +13185|1149|50|6|30|31504.20|0.01|0.06|N|O|1997-09-23|1997-10-08|1997-09-27|NONE|TRUCK|lithely pending instructions. even idea +13185|1237|12|7|40|45529.20|0.08|0.05|N|O|1997-10-12|1997-08-21|1997-10-14|COLLECT COD|TRUCK|accounts haggle +13186|446|76|1|42|56550.48|0.01|0.05|N|O|1996-12-20|1996-11-20|1996-12-23|NONE|AIR|posits again +13186|508|69|2|21|29578.50|0.07|0.03|N|O|1996-10-22|1996-10-30|1996-11-19|NONE|MAIL|en requests cajole slyly ag +13186|1649|50|3|18|27911.52|0.08|0.04|N|O|1996-11-11|1996-11-27|1996-11-28|DELIVER IN PERSON|REG AIR|dolphins could boost careful +13186|1469|48|4|35|47966.10|0.04|0.06|N|O|1996-09-29|1996-11-30|1996-10-16|NONE|REG AIR|ecial requests. special, regular acc +13186|1132|5|5|43|44424.59|0.06|0.04|N|O|1996-10-04|1996-11-22|1996-10-16|NONE|TRUCK|c packages wake blithely about the bold +13187|441|100|1|24|32194.56|0.08|0.07|R|F|1994-02-01|1994-02-18|1994-02-08|DELIVER IN PERSON|TRUCK|yly unusual +13187|124|25|2|38|38916.56|0.10|0.08|R|F|1994-01-01|1994-01-12|1994-01-12|COLLECT COD|TRUCK|sts. enticingly ironic requests about t +13187|913|16|3|5|9069.55|0.05|0.05|A|F|1994-01-28|1994-02-21|1994-01-29|TAKE BACK RETURN|AIR|efully iro +13188|1783|10|1|26|43804.28|0.10|0.04|N|O|1998-08-27|1998-09-28|1998-09-18|COLLECT COD|MAIL|lly ironic instruc +13188|958|61|2|18|33461.10|0.08|0.03|N|O|1998-09-03|1998-09-10|1998-09-09|TAKE BACK RETURN|MAIL|ests. blithely final accounts ar +13188|1559|60|3|16|23368.80|0.04|0.02|N|O|1998-10-03|1998-10-06|1998-10-17|TAKE BACK RETURN|RAIL|. carefully regular ac +13189|1355|56|1|2|2512.70|0.06|0.00|A|F|1995-06-04|1995-07-02|1995-06-09|NONE|SHIP|heodolites affix evenly. final, iro +13190|1886|16|1|14|25030.32|0.02|0.01|N|O|1998-07-21|1998-08-01|1998-07-31|DELIVER IN PERSON|RAIL|out the careful +13191|1004|5|1|21|19005.00|0.09|0.05|N|O|1998-03-09|1998-03-24|1998-03-27|DELIVER IN PERSON|REG AIR|ully ironic dugouts a +13191|1870|71|2|41|72646.67|0.06|0.03|N|O|1998-01-01|1998-02-05|1998-01-29|DELIVER IN PERSON|SHIP|ly final theod +13191|815|82|3|33|56621.73|0.03|0.05|N|O|1998-04-09|1998-02-09|1998-04-14|NONE|SHIP|riously packa +13191|830|64|4|29|50194.07|0.07|0.03|N|O|1997-12-29|1998-03-21|1998-01-26|NONE|TRUCK| express deposits. ironic ideas solve a +13191|842|76|5|24|41828.16|0.03|0.02|N|O|1998-02-13|1998-02-02|1998-03-04|DELIVER IN PERSON|MAIL|ainst the packages haggle slyly quickly eve +13191|613|7|6|48|72653.28|0.09|0.02|N|O|1998-02-04|1998-03-21|1998-02-25|COLLECT COD|AIR|uffily silent exc +13191|1080|86|7|28|27470.24|0.03|0.07|N|O|1998-01-12|1998-02-03|1998-01-30|TAKE BACK RETURN|MAIL|ix carefully along the bravely even packa +13216|1491|9|1|27|37597.23|0.10|0.06|A|F|1992-05-31|1992-06-19|1992-06-05|COLLECT COD|FOB|ithely ironic +13216|1786|29|2|37|62447.86|0.06|0.05|R|F|1992-05-29|1992-07-01|1992-06-01|DELIVER IN PERSON|RAIL|gle slyly pending, bold excuses. +13217|461|91|1|50|68073.00|0.07|0.06|N|O|1997-09-27|1997-11-11|1997-10-21|NONE|TRUCK|ular requests detect +13218|270|98|1|36|42129.72|0.07|0.01|A|F|1994-08-06|1994-08-14|1994-08-27|DELIVER IN PERSON|SHIP|slyly regular pi +13218|1325|2|2|20|24526.40|0.00|0.08|A|F|1994-05-18|1994-06-20|1994-05-25|NONE|REG AIR|nic courts. blithely pend +13218|574|35|3|30|44237.10|0.07|0.04|R|F|1994-07-12|1994-07-07|1994-07-22|DELIVER IN PERSON|REG AIR|ular instructions +13218|1807|8|4|49|83731.20|0.06|0.00|A|F|1994-08-03|1994-07-05|1994-08-11|DELIVER IN PERSON|RAIL|fts sleep slyly +13218|1633|57|5|14|21484.82|0.09|0.01|R|F|1994-08-25|1994-07-26|1994-09-23|NONE|REG AIR|instructions. bold, fluffy pea +13218|681|82|6|2|3163.36|0.02|0.04|A|F|1994-08-03|1994-07-10|1994-09-01|DELIVER IN PERSON|RAIL|packages cajole carefully accordi +13219|896|63|1|21|37734.69|0.01|0.02|N|O|1998-01-30|1998-01-05|1998-02-05|TAKE BACK RETURN|FOB|lets boost fluffily. furiousl +13219|524|85|2|43|61254.36|0.04|0.04|N|O|1997-12-27|1997-12-09|1998-01-16|NONE|SHIP|ironic pinto beans are along the careful +13219|949|50|3|29|53648.26|0.00|0.06|N|O|1997-11-02|1997-12-08|1997-11-30|TAKE BACK RETURN|TRUCK|carefully blithely bold deposits +13219|1631|55|4|23|35250.49|0.10|0.07|N|O|1997-12-08|1997-11-29|1997-12-27|DELIVER IN PERSON|FOB|y. even, bol +13220|1019|25|1|30|27600.30|0.01|0.06|N|O|1998-10-23|1998-10-23|1998-11-13|DELIVER IN PERSON|MAIL|odolites sleep. express instructions g +13220|60|11|2|1|960.06|0.01|0.03|N|O|1998-11-16|1998-08-30|1998-12-12|NONE|MAIL|ts. idle courts wake blithely. slyly u +13220|1184|93|3|22|23873.96|0.02|0.06|N|O|1998-09-07|1998-08-30|1998-09-26|COLLECT COD|MAIL|y unusual packages. fur +13220|249|50|4|9|10343.16|0.05|0.01|N|O|1998-09-12|1998-10-10|1998-10-02|COLLECT COD|RAIL|ar deposits. even hockey pla +13220|629|23|5|44|67303.28|0.01|0.05|N|O|1998-10-06|1998-09-14|1998-10-08|DELIVER IN PERSON|SHIP|lly atop the slyly special requests. caref +13221|1019|90|1|20|18400.20|0.03|0.06|N|O|1995-11-09|1996-01-09|1995-11-13|TAKE BACK RETURN|AIR|excuses. car +13221|804|4|2|22|37505.60|0.10|0.07|N|O|1996-01-18|1995-12-18|1996-02-04|COLLECT COD|AIR| somas. quickly express decoys n +13221|570|1|3|34|49999.38|0.00|0.03|N|O|1995-12-24|1995-11-15|1996-01-22|DELIVER IN PERSON|TRUCK|cross the ironic +13222|1424|42|1|20|26508.40|0.06|0.07|N|O|1997-07-29|1997-06-10|1997-08-24|COLLECT COD|TRUCK|c accounts. bold foxes use c +13222|147|74|2|10|10471.40|0.07|0.00|N|O|1997-06-17|1997-07-12|1997-07-14|TAKE BACK RETURN|TRUCK|fully bold packages. even, +13222|321|50|3|35|42746.20|0.03|0.07|N|O|1997-05-19|1997-07-08|1997-05-30|DELIVER IN PERSON|RAIL|nstructions boost furio +13222|1004|40|4|14|12670.00|0.05|0.06|N|O|1997-06-02|1997-07-16|1997-06-07|NONE|FOB|along the packages was blithely e +13223|665|59|1|30|46969.80|0.06|0.04|N|O|1996-08-22|1996-10-14|1996-09-07|NONE|SHIP|slyly above the slyly bo +13248|1315|92|1|10|12163.10|0.08|0.07|N|O|1997-05-12|1997-04-15|1997-05-13|TAKE BACK RETURN|AIR|et theodolites n +13248|373|2|2|18|22920.66|0.03|0.02|N|O|1997-05-09|1997-03-07|1997-05-24|TAKE BACK RETURN|FOB|elets. furiousl +13248|146|99|3|5|5230.70|0.08|0.07|N|O|1997-03-02|1997-04-03|1997-03-30|DELIVER IN PERSON|MAIL|slow deposits det +13249|641|4|1|38|58582.32|0.03|0.05|N|O|1997-09-06|1997-09-27|1997-09-25|TAKE BACK RETURN|RAIL|e sometimes +13249|1489|68|2|24|33371.52|0.08|0.01|N|O|1997-08-14|1997-10-02|1997-08-18|COLLECT COD|TRUCK|inal packages above the final p +13249|1433|73|3|14|18682.02|0.10|0.08|N|O|1997-09-19|1997-09-17|1997-10-07|DELIVER IN PERSON|REG AIR| lose slyly quickly eve +13249|551|42|4|26|37740.30|0.04|0.00|N|O|1997-10-20|1997-08-19|1997-10-21|COLLECT COD|TRUCK|lites. ironic, even d +13249|972|41|5|37|69299.89|0.10|0.08|N|O|1997-11-01|1997-09-24|1997-11-22|DELIVER IN PERSON|MAIL|sly pending warho +13249|1175|48|6|6|6457.02|0.08|0.04|N|O|1997-08-02|1997-10-04|1997-08-13|TAKE BACK RETURN|FOB|hely unusua +13249|1798|41|7|2|3399.58|0.04|0.05|N|O|1997-10-07|1997-09-26|1997-11-04|TAKE BACK RETURN|AIR|ously sile +13250|383|12|1|33|42351.54|0.08|0.06|N|O|1997-09-26|1997-10-27|1997-10-19|TAKE BACK RETURN|RAIL|ts. unusual, silent accounts sleep. furiou +13250|829|29|2|2|3459.64|0.09|0.05|N|O|1997-09-25|1997-11-16|1997-10-17|TAKE BACK RETURN|RAIL|longside of the fi +13250|1871|58|3|37|65596.19|0.09|0.07|N|O|1997-09-12|1997-09-29|1997-09-24|NONE|TRUCK| above the furiou +13250|1147|56|4|4|4192.56|0.03|0.05|N|O|1997-10-12|1997-10-22|1997-10-29|TAKE BACK RETURN|AIR|ckly theodol +13250|1617|18|5|16|24297.76|0.05|0.06|N|O|1997-11-13|1997-09-30|1997-12-10|TAKE BACK RETURN|SHIP| cajole furiously after th +13250|251|79|6|4|4605.00|0.04|0.05|N|O|1997-10-07|1997-11-02|1997-10-09|TAKE BACK RETURN|RAIL|ainst the carefully pending pac +13251|1848|92|1|33|57744.72|0.08|0.07|N|O|1997-07-18|1997-05-23|1997-08-02|TAKE BACK RETURN|SHIP|r packages use along +13251|204|32|2|14|15458.80|0.02|0.06|N|O|1997-05-20|1997-06-03|1997-05-21|DELIVER IN PERSON|TRUCK|old requests nag +13251|1269|7|3|12|14043.12|0.03|0.04|N|O|1997-03-29|1997-05-01|1997-04-19|COLLECT COD|FOB|dolites across the p +13251|1087|93|4|24|23713.92|0.01|0.03|N|O|1997-04-05|1997-04-29|1997-04-30|TAKE BACK RETURN|SHIP|nd furiously regular p +13251|691|23|5|8|12733.52|0.10|0.04|N|O|1997-07-18|1997-05-03|1997-08-16|COLLECT COD|MAIL|ke. blithely silent requests kindle car +13252|502|63|1|9|12622.50|0.10|0.04|R|F|1994-06-28|1994-05-18|1994-07-02|COLLECT COD|MAIL|! quickly regular the +13252|1458|59|2|18|24470.10|0.04|0.03|R|F|1994-05-31|1994-05-06|1994-06-06|NONE|TRUCK| unusual ideas use. packag +13252|579|40|3|50|73978.50|0.10|0.05|A|F|1994-05-17|1994-06-21|1994-06-08|TAKE BACK RETURN|REG AIR|press pinto beans. platel +13252|163|16|4|32|34021.12|0.10|0.06|R|F|1994-05-15|1994-06-04|1994-06-06|DELIVER IN PERSON|FOB|ts wake. quickly special +13252|1295|96|5|18|21533.22|0.03|0.08|A|F|1994-06-09|1994-04-23|1994-07-01|COLLECT COD|REG AIR|press foxes. sly +13252|1019|90|6|3|2760.03|0.08|0.00|A|F|1994-06-28|1994-04-29|1994-07-24|NONE|RAIL| haggle furiously. even accounts affix slyl +13253|1844|31|1|42|73325.28|0.07|0.06|N|O|1997-02-05|1996-12-13|1997-03-02|NONE|REG AIR|haggle. final, special epita +13253|1524|5|2|28|39914.56|0.00|0.05|N|O|1997-01-28|1997-01-12|1997-02-02|COLLECT COD|SHIP|cies affix quickly deposits. bl +13253|1815|59|3|16|27468.96|0.06|0.00|N|O|1996-11-05|1996-12-22|1996-11-17|NONE|AIR|cuses above the regular, +13253|1590|91|4|18|26848.62|0.10|0.08|N|O|1996-11-17|1997-01-03|1996-12-01|NONE|FOB|requests sleep furiously. final +13253|1203|41|5|50|55210.00|0.03|0.07|N|O|1996-12-17|1996-12-12|1996-12-19|COLLECT COD|SHIP|sleep around th +13253|1430|9|6|4|5325.72|0.01|0.00|N|O|1996-12-28|1997-01-01|1997-01-04|NONE|REG AIR|ng the blithely regular id +13253|1799|26|7|30|51023.70|0.10|0.06|N|O|1997-01-20|1996-12-05|1997-02-04|DELIVER IN PERSON|MAIL| furiously near the carefully iron +13254|1028|29|1|49|45521.98|0.09|0.00|N|O|1998-04-08|1998-03-25|1998-05-03|COLLECT COD|SHIP|regular deposits are after the +13254|801|35|2|46|78282.80|0.10|0.03|N|O|1998-03-17|1998-04-25|1998-04-02|TAKE BACK RETURN|MAIL| bold plat +13254|991|26|3|37|70003.63|0.02|0.01|N|O|1998-03-11|1998-05-13|1998-04-10|TAKE BACK RETURN|SHIP|er the furiously ironic frays? +13254|421|22|4|12|15857.04|0.01|0.06|N|O|1998-05-19|1998-03-25|1998-06-12|NONE|AIR|ously. fluffily unusual de +13254|1233|34|5|4|4536.92|0.08|0.04|N|O|1998-03-01|1998-04-08|1998-03-18|TAKE BACK RETURN|MAIL|usual, bold requests boost. furiou +13255|1790|75|1|8|13534.32|0.09|0.08|A|F|1993-11-05|1993-09-06|1993-11-25|COLLECT COD|MAIL|hely ironic pinto beans haggle +13255|1634|17|2|18|27641.34|0.10|0.03|R|F|1993-07-25|1993-09-10|1993-07-30|TAKE BACK RETURN|TRUCK|equests. blithely pending deposit +13255|1406|85|3|8|10459.20|0.09|0.02|A|F|1993-09-30|1993-08-24|1993-10-22|COLLECT COD|TRUCK| slyly; furiously bold +13255|297|52|4|39|46694.31|0.07|0.00|A|F|1993-10-15|1993-09-09|1993-10-26|DELIVER IN PERSON|AIR|ly pending packages impress of the expr +13255|1073|74|5|22|21429.54|0.02|0.04|A|F|1993-11-11|1993-10-03|1993-11-16|COLLECT COD|FOB|osits nag carefully after +13280|1428|29|1|24|31906.08|0.08|0.02|A|F|1994-12-19|1994-11-18|1995-01-10|COLLECT COD|AIR|iously reg +13280|1595|96|2|41|61360.19|0.05|0.08|R|F|1995-01-10|1994-12-04|1995-01-18|DELIVER IN PERSON|RAIL|es. fluffi +13280|720|85|3|45|72932.40|0.07|0.07|A|F|1994-10-05|1994-11-30|1994-10-13|TAKE BACK RETURN|RAIL|al deposits. asy +13280|261|16|4|1|1161.26|0.04|0.02|R|F|1994-10-08|1994-10-22|1994-10-22|DELIVER IN PERSON|RAIL|s sleep slyly blith +13280|864|98|5|42|74124.12|0.07|0.02|R|F|1995-01-02|1994-11-09|1995-01-06|DELIVER IN PERSON|REG AIR|ously after the slyly regular +13281|877|78|1|27|48002.49|0.10|0.01|R|F|1992-08-01|1992-06-22|1992-08-16|DELIVER IN PERSON|TRUCK|lyly final deposits. slyly even ac +13281|1687|88|2|50|79434.00|0.09|0.02|R|F|1992-06-04|1992-07-10|1992-06-30|DELIVER IN PERSON|REG AIR|usly against the carefully ir +13281|808|9|3|27|46137.60|0.00|0.02|A|F|1992-05-09|1992-06-16|1992-05-13|DELIVER IN PERSON|RAIL|nic foxes wake fluffily regu +13282|677|78|1|17|26820.39|0.10|0.05|A|F|1992-09-01|1992-06-15|1992-09-15|TAKE BACK RETURN|TRUCK|ronic requests hag +13282|1066|2|2|1|967.06|0.08|0.03|R|F|1992-08-29|1992-08-03|1992-09-19|COLLECT COD|TRUCK|uriously silent deposits should integra +13282|742|39|3|34|55853.16|0.02|0.02|R|F|1992-07-04|1992-07-15|1992-07-30|TAKE BACK RETURN|RAIL|anent packages cajole packages. silentl +13282|1514|95|4|7|9908.57|0.07|0.02|R|F|1992-09-06|1992-07-28|1992-09-07|NONE|TRUCK|fully bold asymptotes integrate +13282|1259|60|5|8|9282.00|0.02|0.07|A|F|1992-05-14|1992-07-03|1992-06-04|COLLECT COD|FOB|ests. slyly ironic pinto beans after t +13282|1819|49|6|28|48182.68|0.00|0.08|A|F|1992-09-04|1992-07-17|1992-09-22|DELIVER IN PERSON|REG AIR| regularly. blithely pending ideas affi +13283|1738|65|1|37|60670.01|0.03|0.05|N|O|1998-04-07|1998-03-12|1998-04-26|COLLECT COD|FOB|en, regular excuses along the car +13283|1156|65|2|12|12685.80|0.05|0.07|N|O|1998-02-18|1998-02-27|1998-02-25|TAKE BACK RETURN|SHIP| x-ray. final, e +13283|1443|83|3|40|53777.60|0.03|0.06|N|O|1998-03-11|1998-03-02|1998-04-08|NONE|FOB|evenly. silen +13284|846|46|1|39|68126.76|0.00|0.03|R|F|1992-09-23|1992-10-10|1992-09-27|TAKE BACK RETURN|FOB|s courts wake regular accounts. carefully +13284|178|57|2|31|33423.27|0.01|0.05|A|F|1992-09-18|1992-10-29|1992-10-06|TAKE BACK RETURN|FOB| requests use fu +13284|1008|9|3|12|10908.00|0.01|0.00|R|F|1992-09-24|1992-11-04|1992-10-12|TAKE BACK RETURN|FOB|iously ironic ins +13284|150|29|4|20|21003.00|0.03|0.01|R|F|1992-11-21|1992-09-12|1992-12-18|DELIVER IN PERSON|TRUCK|lites wake. even requests +13285|640|3|1|5|7703.20|0.00|0.06|N|O|1995-07-26|1995-06-20|1995-08-12|DELIVER IN PERSON|TRUCK|lyly final reque +13286|1570|91|1|1|1471.57|0.00|0.03|N|O|1995-10-28|1996-01-04|1995-11-25|NONE|FOB| the blithely bold deposits sleep speci +13286|486|87|2|5|6932.40|0.04|0.08|N|O|1996-01-11|1995-11-18|1996-01-28|DELIVER IN PERSON|REG AIR|efully express dependen +13286|638|1|3|46|70776.98|0.10|0.08|N|O|1996-01-18|1995-12-31|1996-01-21|DELIVER IN PERSON|REG AIR|c pinto beans. packages against the fur +13286|388|45|4|3|3865.14|0.09|0.06|N|O|1996-01-07|1995-12-22|1996-02-02|DELIVER IN PERSON|MAIL|eans. regular, exp +13287|1003|74|1|3|2712.00|0.09|0.04|N|O|1997-07-06|1997-04-12|1997-07-15|DELIVER IN PERSON|FOB|gainst the regular asymptote +13287|576|77|2|34|50203.38|0.07|0.00|N|O|1997-05-26|1997-06-03|1997-06-08|NONE|REG AIR|pecial packages. packages sleep final ac +13287|465|53|3|13|17750.98|0.01|0.00|N|O|1997-03-23|1997-06-02|1997-04-20|NONE|RAIL|y ironic requests-- dependenc +13287|1710|11|4|16|25787.36|0.02|0.03|N|O|1997-03-17|1997-04-18|1997-03-19|TAKE BACK RETURN|REG AIR|s run quickly. qu +13287|111|90|5|41|41455.51|0.03|0.05|N|O|1997-06-16|1997-06-04|1997-07-11|DELIVER IN PERSON|FOB|ly fluffily enticing accounts. accounts +13287|912|47|6|8|14503.28|0.08|0.02|N|O|1997-06-15|1997-05-15|1997-07-12|DELIVER IN PERSON|SHIP| deposits sleep after the quic +13287|1231|69|7|18|20380.14|0.05|0.01|N|O|1997-06-25|1997-05-14|1997-07-25|COLLECT COD|TRUCK|lly slyly regular escapades. pin +13312|311|12|1|12|14535.72|0.02|0.02|N|O|1997-01-27|1997-01-11|1997-02-23|TAKE BACK RETURN|FOB|ress requests wake. permanently final +13312|1561|42|2|49|71665.44|0.10|0.03|N|O|1996-12-19|1997-01-15|1997-01-12|TAKE BACK RETURN|MAIL|ffix quickly p +13313|234|16|1|36|40832.28|0.10|0.01|A|F|1994-10-19|1994-09-17|1994-11-13|NONE|REG AIR|uriously. slyly unusual +13313|1397|36|2|19|24669.41|0.02|0.01|A|F|1994-10-04|1994-09-02|1994-11-01|NONE|MAIL|ily ironic ideas above the blithely unusua +13313|1969|2|3|11|20580.56|0.00|0.08|R|F|1994-11-09|1994-09-13|1994-11-21|DELIVER IN PERSON|SHIP| carefully ironic deposits +13313|411|70|4|7|9179.87|0.05|0.01|A|F|1994-10-15|1994-08-17|1994-10-22|TAKE BACK RETURN|RAIL|unts. regular theodolit +13313|538|69|5|30|43155.90|0.00|0.02|R|F|1994-11-04|1994-09-03|1994-11-13|TAKE BACK RETURN|AIR|ular pinto beans +13313|1384|61|6|47|60412.86|0.08|0.06|A|F|1994-10-06|1994-09-26|1994-10-09|DELIVER IN PERSON|RAIL|ously special theodolites nag quickly e +13313|740|73|7|37|60707.38|0.08|0.05|R|F|1994-11-05|1994-08-28|1994-11-27|DELIVER IN PERSON|MAIL|ent foxes thr +13314|89|40|1|41|40552.28|0.04|0.06|A|F|1994-06-05|1994-07-18|1994-06-07|TAKE BACK RETURN|RAIL|lithely regular accounts. even +13314|1118|91|2|36|36687.96|0.05|0.08|A|F|1994-06-25|1994-08-02|1994-07-13|COLLECT COD|MAIL|after the fluffily express account +13314|1838|39|3|12|20877.96|0.02|0.05|A|F|1994-06-24|1994-06-24|1994-07-18|TAKE BACK RETURN|AIR|tions sleep. unusual +13314|1611|35|4|32|48403.52|0.03|0.07|A|F|1994-09-05|1994-07-23|1994-09-12|COLLECT COD|SHIP|al packages. blithely final packages +13314|1629|12|5|1|1530.62|0.03|0.01|A|F|1994-07-25|1994-06-18|1994-08-20|NONE|RAIL| dolphins about +13314|661|24|6|46|71836.36|0.00|0.04|R|F|1994-08-20|1994-07-05|1994-09-12|TAKE BACK RETURN|RAIL|. dogged ideas x-ray slyly furiously +13315|700|94|1|22|35215.40|0.10|0.05|N|O|1996-12-27|1996-12-27|1997-01-14|DELIVER IN PERSON|SHIP|deposits use furiously across the +13315|231|86|2|27|30543.21|0.07|0.03|N|O|1997-01-03|1997-01-11|1997-01-20|TAKE BACK RETURN|REG AIR| the even foxes nag blit +13315|25|76|3|8|7400.16|0.00|0.05|N|O|1996-12-27|1997-01-01|1996-12-31|DELIVER IN PERSON|AIR|olites. careful +13315|565|66|4|43|63019.08|0.07|0.07|N|O|1996-12-10|1997-01-13|1997-01-02|COLLECT COD|RAIL|gle closely with the blithely bold req +13315|1745|46|5|29|47755.46|0.03|0.06|N|O|1996-10-24|1996-11-15|1996-11-21|NONE|FOB|arefully final depo +13315|1230|68|6|10|11312.30|0.07|0.03|N|O|1996-12-12|1996-12-20|1996-12-29|DELIVER IN PERSON|RAIL|equests. regular accoun +13316|1076|77|1|1|977.07|0.10|0.02|R|F|1993-01-26|1993-01-09|1993-02-22|NONE|AIR|gular foxes are fluffily around t +13316|119|98|2|43|43821.73|0.10|0.05|A|F|1993-01-25|1992-12-08|1993-02-08|DELIVER IN PERSON|TRUCK|ts detect furiously according to the exp +13317|1202|77|1|22|24270.40|0.06|0.02|N|O|1996-04-25|1996-06-26|1996-05-16|COLLECT COD|MAIL|unts cajole bli +13317|774|75|2|13|21772.01|0.07|0.01|N|O|1996-07-08|1996-07-06|1996-07-17|TAKE BACK RETURN|SHIP|o the express, +13318|1195|32|1|44|48232.36|0.06|0.02|N|O|1997-09-14|1997-08-03|1997-10-01|TAKE BACK RETURN|MAIL|ly among the +13318|1700|24|2|50|80085.00|0.05|0.01|N|O|1997-06-16|1997-07-14|1997-07-03|TAKE BACK RETURN|RAIL| to the even, pending deposits +13318|85|11|3|11|10835.88|0.02|0.05|N|O|1997-08-26|1997-08-19|1997-09-08|TAKE BACK RETURN|AIR| sometimes regular ex +13318|170|23|4|5|5350.85|0.03|0.07|N|O|1997-06-27|1997-07-21|1997-07-20|NONE|RAIL|ounts promise according to the blithe +13318|891|58|5|39|69883.71|0.01|0.02|N|O|1997-08-13|1997-07-16|1997-08-20|NONE|RAIL|epitaphs use sly +13318|1113|86|6|16|16225.76|0.06|0.07|N|O|1997-07-15|1997-08-11|1997-07-19|DELIVER IN PERSON|TRUCK|y carefully express packages. r +13318|911|14|7|11|19931.01|0.00|0.06|N|O|1997-10-03|1997-08-11|1997-11-02|NONE|FOB|ess instruction +13319|374|75|1|8|10194.96|0.03|0.01|N|O|1996-04-25|1996-04-10|1996-05-16|COLLECT COD|SHIP|ld deposits nag. ironic i +13319|955|90|2|46|85373.70|0.06|0.00|N|O|1996-04-23|1996-04-17|1996-05-16|DELIVER IN PERSON|MAIL|lly excuses +13319|1038|44|3|50|46951.50|0.04|0.07|N|O|1996-01-22|1996-04-12|1996-02-10|DELIVER IN PERSON|RAIL|losely final requests are sly +13344|625|19|1|17|25935.54|0.09|0.02|N|O|1997-04-07|1997-05-26|1997-04-19|NONE|REG AIR|the slyly regu +13344|325|10|2|5|6126.60|0.00|0.06|N|O|1997-04-05|1997-05-19|1997-04-17|DELIVER IN PERSON|TRUCK|ckages promise slyly fi +13344|1541|82|3|30|43276.20|0.08|0.02|N|O|1997-07-17|1997-05-20|1997-08-15|DELIVER IN PERSON|AIR|sts. fluffily bold plate +13344|299|54|4|17|20387.93|0.04|0.01|N|O|1997-07-12|1997-05-21|1997-07-30|TAKE BACK RETURN|MAIL|counts wak +13345|544|5|1|16|23112.64|0.02|0.00|A|F|1992-10-25|1992-10-05|1992-10-26|NONE|AIR| final requests ca +13345|535|96|2|45|64598.85|0.04|0.06|R|F|1992-11-13|1992-11-29|1992-11-16|TAKE BACK RETURN|TRUCK|y final requests hag +13345|322|7|3|38|46448.16|0.04|0.08|R|F|1992-12-08|1992-10-11|1992-12-20|NONE|AIR|elets. carefully special requests sleep flu +13346|299|54|1|15|17989.35|0.05|0.04|A|F|1993-01-23|1993-01-17|1993-02-04|DELIVER IN PERSON|SHIP|ess accounts sleep s +13346|939|8|2|42|77277.06|0.00|0.01|R|F|1993-02-22|1993-01-29|1993-03-11|COLLECT COD|REG AIR|rbits about the e +13346|1412|13|3|32|42029.12|0.05|0.08|A|F|1992-12-15|1993-01-28|1993-01-07|COLLECT COD|FOB|thely pending foxes haggle blithely. s +13346|1315|92|4|26|31624.06|0.02|0.07|A|F|1993-01-05|1993-01-08|1993-02-02|COLLECT COD|RAIL|structions ab +13346|636|37|5|32|49172.16|0.08|0.06|R|F|1992-12-05|1993-01-17|1992-12-27|TAKE BACK RETURN|RAIL|ke regularly according to th +13346|818|52|6|8|13750.48|0.08|0.01|R|F|1993-01-13|1993-01-25|1993-01-19|NONE|RAIL|, special foxes nag carefu +13346|1669|93|7|8|12565.28|0.04|0.00|A|F|1993-01-10|1992-12-20|1993-01-21|TAKE BACK RETURN|RAIL|ts; pending, p +13347|1341|56|1|26|32300.84|0.07|0.05|A|F|1993-07-01|1993-07-13|1993-07-11|DELIVER IN PERSON|REG AIR|ronic deposits +13347|129|82|2|44|45281.28|0.09|0.06|R|F|1993-05-13|1993-06-07|1993-05-26|DELIVER IN PERSON|FOB| furiously +13347|788|53|3|30|50663.40|0.02|0.05|A|F|1993-06-13|1993-05-28|1993-07-07|DELIVER IN PERSON|RAIL|regular depo +13347|1552|93|4|39|56688.45|0.10|0.07|A|F|1993-06-20|1993-06-06|1993-06-28|COLLECT COD|RAIL|ang slyly after the regular foxes. stealt +13347|1546|47|5|34|49216.36|0.05|0.03|A|F|1993-08-10|1993-07-09|1993-08-15|DELIVER IN PERSON|RAIL| requests nag. sentiments sleep fluffily. +13347|1979|24|6|11|20690.67|0.10|0.07|R|F|1993-05-23|1993-06-24|1993-06-13|COLLECT COD|FOB|lar excuses. unusual requests use sly +13348|69|45|1|11|10659.66|0.10|0.06|R|F|1993-11-22|1994-01-24|1993-12-10|TAKE BACK RETURN|RAIL|lithely about the blithely even d +13348|1828|29|2|19|32866.58|0.06|0.01|R|F|1993-11-26|1993-12-23|1993-12-03|NONE|REG AIR|l accounts. slyly regular ideas are b +13348|657|20|3|1|1557.65|0.08|0.01|R|F|1993-12-02|1994-01-20|1993-12-12|NONE|TRUCK|instructions c +13348|692|24|4|15|23890.35|0.03|0.03|A|F|1993-12-19|1993-12-26|1994-01-06|COLLECT COD|RAIL|ffily. furiously bold instructions +13348|1109|18|5|28|28282.80|0.08|0.06|R|F|1994-02-02|1994-01-15|1994-02-26|NONE|AIR|gle daring plate +13349|1984|17|1|20|37719.60|0.06|0.08|A|F|1994-09-28|1994-11-02|1994-10-14|DELIVER IN PERSON|MAIL|usly. quickly pending d +13349|447|77|2|40|53897.60|0.04|0.02|A|F|1994-11-03|1994-11-30|1994-12-01|NONE|REG AIR|uests. even accounts p +13350|1744|29|1|49|80641.26|0.05|0.08|N|O|1998-09-04|1998-07-09|1998-09-24|NONE|TRUCK| the fluffily final packages haggle bl +13350|1096|32|2|31|30909.79|0.08|0.07|N|O|1998-06-29|1998-07-29|1998-07-24|NONE|FOB|al pinto beans haggle along the sile +13350|1083|54|3|2|1968.16|0.09|0.02|N|O|1998-07-10|1998-06-08|1998-07-31|COLLECT COD|AIR|according +13350|1330|45|4|39|48021.87|0.08|0.07|N|O|1998-08-13|1998-08-01|1998-08-29|COLLECT COD|AIR| wake. ironic waters nag acr +13350|1229|67|5|35|39557.70|0.08|0.01|N|O|1998-05-25|1998-06-29|1998-06-02|COLLECT COD|MAIL|ans instead of the slyly pending d +13350|1938|39|6|24|44158.32|0.00|0.08|N|O|1998-08-19|1998-07-12|1998-09-12|TAKE BACK RETURN|MAIL|e requests. pending excus +13351|186|65|1|42|45619.56|0.02|0.07|R|F|1993-08-19|1993-07-19|1993-08-26|NONE|FOB|uickly even deposits doubt slyly +13351|1466|45|2|31|42391.26|0.06|0.08|R|F|1993-05-16|1993-06-06|1993-06-12|DELIVER IN PERSON|AIR|. blithely p +13351|1426|66|3|4|5309.68|0.10|0.01|A|F|1993-08-08|1993-07-14|1993-09-07|TAKE BACK RETURN|AIR|evenly ironic i +13351|224|52|4|29|32602.38|0.09|0.05|A|F|1993-08-30|1993-07-07|1993-09-02|DELIVER IN PERSON|REG AIR|fluffily after the quickly ironic reque +13351|1721|6|5|42|68154.24|0.05|0.03|A|F|1993-07-02|1993-07-14|1993-07-27|DELIVER IN PERSON|RAIL|ly unusual packages are about the quick +13351|431|61|6|7|9320.01|0.02|0.08|R|F|1993-09-03|1993-06-16|1993-09-21|TAKE BACK RETURN|SHIP| accounts. furiously even dependencies ha +13376|399|100|1|43|55873.77|0.09|0.06|A|F|1992-10-20|1992-12-22|1992-10-22|NONE|SHIP|t the ironic deposits. blithe +13376|926|61|2|17|31057.64|0.02|0.08|A|F|1992-11-02|1992-11-19|1992-11-04|DELIVER IN PERSON|RAIL|egular theodoli +13376|918|53|3|27|49110.57|0.10|0.01|A|F|1992-12-28|1992-12-07|1993-01-23|NONE|MAIL|ns are carefully caref +13376|1381|96|4|28|35906.64|0.08|0.07|A|F|1992-12-27|1993-01-03|1993-01-16|NONE|REG AIR|lithely furio +13376|730|95|5|25|40768.25|0.05|0.06|A|F|1993-01-06|1993-01-01|1993-01-21|DELIVER IN PERSON|TRUCK|al, unusual packages unw +13376|1119|92|6|37|37744.07|0.00|0.00|A|F|1992-10-14|1992-11-17|1992-11-06|COLLECT COD|AIR|ckages. final requests wake +13377|716|17|1|35|56584.85|0.03|0.07|N|O|1995-11-15|1995-09-06|1995-11-28|COLLECT COD|TRUCK|press dolph +13377|1474|14|2|1|1375.47|0.02|0.00|N|O|1995-11-17|1995-09-30|1995-12-07|DELIVER IN PERSON|AIR|lthy excuses. +13378|1258|33|1|37|42892.25|0.08|0.07|A|F|1994-09-30|1994-12-10|1994-10-25|TAKE BACK RETURN|AIR|haggle slyly. blithely bold instruct +13378|403|62|2|2|2606.80|0.04|0.01|A|F|1994-09-30|1994-12-09|1994-10-05|COLLECT COD|REG AIR|the thin packages. f +13378|990|93|3|50|94549.50|0.10|0.08|A|F|1994-10-18|1994-11-21|1994-11-09|TAKE BACK RETURN|FOB|kages sleep final, silent pack +13378|1743|28|4|21|34539.54|0.03|0.01|R|F|1994-10-11|1994-11-07|1994-11-02|DELIVER IN PERSON|MAIL|blithely final foxes x-ray quick +13378|92|18|5|37|36707.33|0.06|0.07|A|F|1994-10-03|1994-11-11|1994-10-17|TAKE BACK RETURN|FOB| fluffy asymptotes sleep furiously +13379|1524|5|1|40|57020.80|0.04|0.07|R|F|1994-02-01|1993-12-14|1994-03-03|DELIVER IN PERSON|RAIL|y regular packages. s +13379|1192|93|2|8|8745.52|0.05|0.00|R|F|1993-12-05|1993-12-25|1993-12-26|DELIVER IN PERSON|RAIL|y bold deposits +13379|824|58|3|2|3449.64|0.04|0.02|R|F|1993-11-26|1994-01-26|1993-12-14|COLLECT COD|SHIP|l deposits. special realms sleep fluffil +13379|668|31|4|24|37647.84|0.04|0.03|A|F|1994-03-08|1994-01-11|1994-03-29|COLLECT COD|SHIP|ong the blithely silent packages. +13380|1855|99|1|14|24595.90|0.09|0.00|R|F|1994-09-29|1994-09-11|1994-10-05|NONE|RAIL|ding to the requests. carefully ironi +13380|1937|82|2|5|9194.65|0.02|0.06|A|F|1994-10-06|1994-09-30|1994-10-11|TAKE BACK RETURN|REG AIR|s after the carefu +13380|1300|12|3|21|25227.30|0.09|0.05|A|F|1994-10-20|1994-08-24|1994-11-01|DELIVER IN PERSON|FOB| regular theodolites +13380|1844|88|4|43|75071.12|0.08|0.07|R|F|1994-07-17|1994-08-29|1994-07-21|TAKE BACK RETURN|REG AIR|lets. even at +13381|800|97|1|32|54425.60|0.01|0.04|N|O|1995-10-14|1995-09-28|1995-11-13|TAKE BACK RETURN|MAIL|ly final requests dete +13381|1201|13|2|29|31963.80|0.07|0.05|N|O|1995-08-28|1995-09-17|1995-09-16|COLLECT COD|MAIL|ilent orbits along the fluffily unusual +13381|1501|2|3|12|16830.00|0.10|0.03|N|O|1995-12-12|1995-10-14|1995-12-14|COLLECT COD|MAIL|y. carefully special requests ca +13382|543|74|1|27|38975.58|0.02|0.05|N|O|1996-02-16|1996-01-14|1996-02-24|TAKE BACK RETURN|RAIL|er blithely bl +13382|666|98|2|15|23499.90|0.03|0.02|N|O|1996-02-22|1995-12-02|1996-03-04|COLLECT COD|FOB|tions. even, pending foxes integrat +13382|74|75|3|1|974.07|0.09|0.08|N|O|1996-01-05|1996-01-16|1996-01-18|DELIVER IN PERSON|AIR|s detect closely a +13383|725|22|1|36|58525.92|0.09|0.07|R|F|1992-10-03|1992-07-21|1992-10-15|NONE|TRUCK|hely idle foxes +13383|263|18|2|30|34897.80|0.00|0.06|R|F|1992-07-01|1992-08-12|1992-07-04|DELIVER IN PERSON|FOB|y. regular, even excuses aff +13383|689|90|3|44|69945.92|0.07|0.01|A|F|1992-08-16|1992-08-07|1992-08-18|DELIVER IN PERSON|MAIL|osits after the fluffily final packages +13383|1127|36|4|6|6168.72|0.03|0.03|A|F|1992-06-18|1992-07-31|1992-07-12|COLLECT COD|FOB|y slowly carefully i +13408|398|99|1|34|44145.26|0.05|0.04|R|F|1994-06-04|1994-04-24|1994-07-03|DELIVER IN PERSON|SHIP|. carefully pending accounts according +13408|486|45|2|32|44367.36|0.07|0.07|A|F|1994-04-27|1994-04-12|1994-05-18|TAKE BACK RETURN|MAIL|symptotes haggle around the ironic +13408|1372|11|3|20|25467.40|0.06|0.01|R|F|1994-06-02|1994-05-10|1994-06-14|NONE|FOB|blithely un +13408|350|51|4|40|50014.00|0.01|0.07|A|F|1994-06-11|1994-05-13|1994-07-08|COLLECT COD|MAIL|l requests hang silently. sile +13408|1313|90|5|40|48572.40|0.05|0.02|R|F|1994-05-04|1994-04-19|1994-05-22|COLLECT COD|REG AIR|ly special +13409|1786|71|1|28|47257.84|0.06|0.05|R|F|1993-08-30|1993-09-27|1993-09-10|NONE|AIR|regular accounts-- final decoys pri +13410|1316|55|1|4|4869.24|0.08|0.02|A|F|1993-09-10|1993-07-20|1993-09-17|COLLECT COD|TRUCK|st carefully across the unusual a +13410|901|4|2|12|21622.80|0.08|0.05|A|F|1993-09-18|1993-08-10|1993-09-25|COLLECT COD|RAIL|carefully ironic requests haggl +13410|1048|54|3|1|949.04|0.09|0.06|A|F|1993-08-24|1993-07-21|1993-09-15|DELIVER IN PERSON|REG AIR|deposits. ruthless, u +13410|509|70|4|32|45104.00|0.08|0.08|A|F|1993-09-13|1993-08-19|1993-09-22|COLLECT COD|MAIL|s nag furiously quickly final in +13411|1380|81|1|21|26908.98|0.03|0.03|R|F|1994-07-22|1994-05-18|1994-07-26|COLLECT COD|AIR| packages hag +13411|54|5|2|4|3816.20|0.06|0.01|R|F|1994-07-25|1994-06-16|1994-08-23|TAKE BACK RETURN|MAIL|ipliers. quietly ironic instructions +13411|1044|15|3|22|20790.88|0.04|0.00|A|F|1994-06-29|1994-05-27|1994-07-07|COLLECT COD|TRUCK| special platelets. accounts ac +13411|1330|69|4|26|32014.58|0.04|0.05|R|F|1994-07-17|1994-05-19|1994-08-13|NONE|MAIL|arefully special ideas. b +13411|797|94|5|29|49235.91|0.09|0.06|R|F|1994-08-05|1994-06-14|1994-08-12|TAKE BACK RETURN|TRUCK| ironic pl +13412|1210|48|1|49|54449.29|0.09|0.03|N|O|1997-09-04|1997-09-12|1997-09-16|DELIVER IN PERSON|FOB|ges about the car +13412|1894|95|2|39|70039.71|0.09|0.01|N|O|1997-09-26|1997-09-30|1997-10-24|TAKE BACK RETURN|SHIP|pending pinto beans cajole expr +13413|891|92|1|47|84218.83|0.05|0.01|A|F|1993-03-12|1993-03-28|1993-03-22|NONE|REG AIR|ccounts sleep carefully +13413|1841|85|2|3|5228.52|0.06|0.02|R|F|1993-03-28|1993-03-29|1993-04-11|TAKE BACK RETURN|FOB|egular foxes belie +13413|1545|66|3|44|63647.76|0.10|0.01|A|F|1993-02-21|1993-03-04|1993-03-11|DELIVER IN PERSON|FOB|g. slyly r +13413|245|46|4|46|52681.04|0.08|0.03|R|F|1993-05-08|1993-04-25|1993-05-09|TAKE BACK RETURN|REG AIR|lent theodolites haggle ca +13413|1572|53|5|26|38312.82|0.06|0.06|R|F|1993-04-01|1993-03-13|1993-04-19|TAKE BACK RETURN|SHIP| boldly express dinos +13414|53|4|1|10|9530.50|0.01|0.07|N|O|1995-07-28|1995-08-24|1995-08-10|TAKE BACK RETURN|FOB|otes use qu +13414|733|98|2|1|1633.73|0.04|0.02|N|O|1995-10-27|1995-08-21|1995-11-10|DELIVER IN PERSON|TRUCK|ets detect alo +13414|275|57|3|30|35258.10|0.07|0.07|N|O|1995-07-15|1995-08-25|1995-08-10|NONE|MAIL|cuses. blithely iro +13414|286|87|4|35|41519.80|0.02|0.01|N|O|1995-08-24|1995-08-07|1995-08-28|NONE|AIR|usual packages. even +13414|1344|83|5|45|56040.30|0.05|0.04|N|O|1995-08-02|1995-08-08|1995-08-12|NONE|REG AIR|ions cajole blithely. car +13415|1308|23|1|19|22976.70|0.02|0.01|N|O|1997-06-18|1997-08-05|1997-07-06|NONE|FOB| the packages. regular account +13415|903|38|2|16|28862.40|0.03|0.01|N|O|1997-07-30|1997-08-25|1997-08-14|DELIVER IN PERSON|REG AIR|osits sleep +13415|1839|26|3|2|3481.66|0.01|0.00|N|O|1997-07-05|1997-08-07|1997-07-16|DELIVER IN PERSON|MAIL| final accounts +13415|957|58|4|31|57596.45|0.07|0.05|N|O|1997-09-26|1997-08-01|1997-10-06|DELIVER IN PERSON|MAIL|ccounts should have to w +13415|1903|92|5|32|57756.80|0.04|0.04|N|O|1997-09-06|1997-08-28|1997-09-10|DELIVER IN PERSON|AIR|s. express ac +13415|1382|97|6|44|56468.72|0.04|0.03|N|O|1997-06-27|1997-07-31|1997-07-16|TAKE BACK RETURN|MAIL|tructions. fluffily bold asy +13415|165|44|7|45|47932.20|0.01|0.00|N|O|1997-07-06|1997-08-09|1997-07-07|TAKE BACK RETURN|FOB|riously regular packages nag around the sl +13440|1631|73|1|17|26054.71|0.08|0.02|R|F|1994-01-25|1993-11-15|1994-02-14|TAKE BACK RETURN|RAIL|e carefully. +13441|269|24|1|2|2338.52|0.06|0.07|N|O|1995-10-22|1995-10-03|1995-11-12|NONE|TRUCK|tions. requests at the car +13441|394|79|2|46|59541.94|0.05|0.02|N|O|1995-11-14|1995-11-29|1995-11-27|DELIVER IN PERSON|RAIL|cies. quickly regular asymptotes +13442|1155|92|1|45|47526.75|0.10|0.04|N|O|1997-11-13|1997-09-25|1997-11-19|COLLECT COD|REG AIR| instruction +13442|1703|30|2|3|4814.10|0.01|0.04|N|O|1997-11-24|1997-09-25|1997-12-18|NONE|REG AIR|ickly regular theodolites. fu +13442|1517|38|3|46|65251.46|0.02|0.07|N|O|1997-11-20|1997-10-11|1997-11-24|NONE|FOB|ke carefully aft +13442|1134|71|4|22|22772.86|0.09|0.01|N|O|1997-10-17|1997-09-28|1997-10-29|COLLECT COD|FOB|ironic dinos. stealthily even ideas ha +13443|1954|99|1|14|25983.30|0.01|0.00|A|F|1994-01-23|1993-11-14|1994-01-27|COLLECT COD|AIR|ide of the final packages. slow +13443|1705|90|2|36|57841.20|0.03|0.07|A|F|1993-11-19|1993-12-27|1993-11-28|TAKE BACK RETURN|MAIL|ublate along the furiously pending +13443|1581|62|3|23|34099.34|0.07|0.06|R|F|1994-01-29|1993-11-15|1994-01-31|COLLECT COD|RAIL| across the eve +13443|1579|60|4|21|31091.97|0.03|0.05|A|F|1994-01-24|1993-12-13|1994-02-18|NONE|SHIP|l ideas are sl +13443|44|20|5|20|18880.80|0.03|0.00|R|F|1993-10-29|1993-11-26|1993-11-19|DELIVER IN PERSON|SHIP|uests according to the slyly fi +13443|1433|51|6|13|17347.59|0.02|0.07|A|F|1993-10-22|1993-12-29|1993-10-25|NONE|REG AIR|unts. requests sleep f +13443|1761|62|7|17|28266.92|0.04|0.06|R|F|1993-11-13|1993-12-18|1993-11-14|COLLECT COD|TRUCK|hlessly unusual asymptotes. quick +13444|1754|55|1|22|36426.50|0.05|0.01|A|F|1992-04-09|1992-03-02|1992-04-18|COLLECT COD|TRUCK|ep slyly above the special +13444|1979|80|2|48|90286.56|0.05|0.04|A|F|1992-04-29|1992-02-08|1992-05-20|COLLECT COD|AIR|ickly even accounts. +13444|1188|97|3|12|13070.16|0.06|0.08|R|F|1992-03-21|1992-02-13|1992-04-03|DELIVER IN PERSON|MAIL|hely at the e +13444|397|82|4|5|6486.95|0.04|0.07|A|F|1992-01-15|1992-04-01|1992-01-17|NONE|REG AIR|quests. fluffily final packages +13444|737|2|5|38|62233.74|0.04|0.01|A|F|1992-01-24|1992-03-13|1992-02-18|DELIVER IN PERSON|REG AIR|foxes about the carefully pen +13444|268|50|6|36|42057.36|0.05|0.05|R|F|1992-04-25|1992-02-19|1992-05-13|COLLECT COD|TRUCK|ly, special packages. regular reque +13444|1860|61|7|35|61665.10|0.09|0.03|A|F|1992-01-20|1992-04-04|1992-02-19|DELIVER IN PERSON|TRUCK|y. final asymptotes believe finally. +13445|802|3|1|14|23839.20|0.09|0.00|N|O|1998-01-15|1998-03-10|1998-02-11|COLLECT COD|REG AIR|lly above the blithely +13446|1961|50|1|13|24218.48|0.02|0.00|N|O|1996-06-28|1996-04-17|1996-07-21|DELIVER IN PERSON|AIR|ular deposits. blithely regular acco +13446|977|12|2|17|31925.49|0.02|0.02|N|O|1996-06-03|1996-05-13|1996-06-29|COLLECT COD|FOB|ly along the fluf +13447|1603|27|1|45|67707.00|0.01|0.08|A|F|1993-02-06|1993-02-09|1993-03-05|NONE|FOB|ckly about the furiously ironi +13472|753|86|1|30|49612.50|0.08|0.04|N|O|1995-11-17|1995-12-17|1995-12-02|TAKE BACK RETURN|RAIL|pinto bean +13472|1960|5|2|3|5585.88|0.06|0.02|N|O|1996-02-19|1996-01-09|1996-03-15|DELIVER IN PERSON|AIR|slyly after the carefully +13472|1846|76|3|9|15730.56|0.01|0.06|N|O|1995-11-22|1995-12-08|1995-12-11|DELIVER IN PERSON|REG AIR|riously pending packages +13473|1020|21|1|2|1842.04|0.06|0.05|N|O|1996-03-27|1996-05-09|1996-04-12|DELIVER IN PERSON|TRUCK|according to the carefully even idea +13473|167|68|2|13|13873.08|0.08|0.05|N|O|1996-06-26|1996-06-08|1996-06-30|DELIVER IN PERSON|MAIL|gular sheave +13473|738|3|3|27|44245.71|0.05|0.06|N|O|1996-07-11|1996-05-17|1996-07-18|DELIVER IN PERSON|SHIP|luffy tithes hagg +13473|1962|7|4|18|33551.28|0.08|0.05|N|O|1996-05-27|1996-05-23|1996-05-28|COLLECT COD|AIR|into beans. b +13473|210|11|5|19|21093.99|0.06|0.00|N|O|1996-04-26|1996-05-15|1996-05-22|COLLECT COD|AIR| promise abo +13473|895|96|6|46|82610.94|0.06|0.04|N|O|1996-06-03|1996-05-08|1996-06-16|NONE|AIR|wake fluffily +13474|697|98|1|20|31953.80|0.04|0.04|N|O|1997-06-13|1997-07-09|1997-06-18|DELIVER IN PERSON|TRUCK|heodolites detect +13474|58|59|2|37|35447.85|0.05|0.04|N|O|1997-06-27|1997-08-13|1997-07-22|NONE|SHIP|al waters. blithely final pinto beans nag c +13474|276|77|3|30|35288.10|0.09|0.07|N|O|1997-07-11|1997-07-10|1997-07-24|NONE|TRUCK|nal, ironic instructions are bravely acc +13475|1662|63|1|45|70364.70|0.04|0.04|A|F|1994-07-19|1994-07-29|1994-07-28|NONE|FOB|y ironic accounts integrate qu +13475|576|37|2|45|66445.65|0.07|0.05|A|F|1994-08-09|1994-07-13|1994-08-20|DELIVER IN PERSON|FOB|ly final warthogs along the car +13475|754|51|3|36|59571.00|0.02|0.03|R|F|1994-09-16|1994-08-07|1994-09-18|NONE|SHIP|ong the carefully even theodol +13475|1470|49|4|22|30172.34|0.07|0.04|A|F|1994-06-25|1994-08-28|1994-07-02|TAKE BACK RETURN|RAIL|lar accounts. eve +13475|281|82|5|12|14175.36|0.09|0.01|A|F|1994-07-05|1994-08-01|1994-07-11|DELIVER IN PERSON|REG AIR|y. bold foxes sleep. slyly permanent pla +13475|1554|35|6|24|34933.20|0.03|0.03|A|F|1994-06-19|1994-08-02|1994-07-01|DELIVER IN PERSON|TRUCK| the thinly reg +13475|145|72|7|22|22993.08|0.03|0.04|A|F|1994-10-04|1994-08-26|1994-10-31|NONE|SHIP|ular theodolites. bli +13476|1035|36|1|10|9360.30|0.05|0.05|A|F|1994-01-25|1993-12-07|1994-01-26|DELIVER IN PERSON|MAIL|ly even ideas. +13476|1488|28|2|30|41684.40|0.09|0.06|R|F|1994-01-30|1993-12-04|1994-02-04|DELIVER IN PERSON|TRUCK| regular requests. caref +13476|1614|56|3|38|57593.18|0.09|0.00|R|F|1994-02-08|1993-12-27|1994-02-09|NONE|AIR|blithely special ideas haggle fluffi +13476|696|90|4|29|46304.01|0.06|0.04|R|F|1993-12-21|1993-12-18|1994-01-05|NONE|MAIL|osits. slyly ironic asymptotes w +13476|1014|85|5|40|36600.40|0.05|0.06|A|F|1993-12-20|1993-11-25|1994-01-07|DELIVER IN PERSON|RAIL|nto beans are carefully atop the +13476|1991|24|6|41|77612.59|0.02|0.06|A|F|1994-01-01|1993-12-16|1994-01-11|DELIVER IN PERSON|SHIP|ecial accou +13477|161|40|1|14|14856.24|0.01|0.01|N|O|1998-03-22|1998-02-13|1998-04-06|NONE|MAIL|ic foxes wake slyly. final accounts haggl +13477|1161|98|2|2|2124.32|0.03|0.04|N|O|1997-12-27|1998-01-14|1998-01-17|NONE|AIR|s. quickly special accounts are f +13477|1887|74|3|23|41144.24|0.03|0.05|N|O|1998-02-05|1998-02-14|1998-02-16|DELIVER IN PERSON|REG AIR| are blithely. regular requests sleep abo +13477|959|28|4|19|35339.05|0.07|0.06|N|O|1998-02-23|1998-01-27|1998-03-16|NONE|RAIL|requests boost slyly flu +13477|191|18|5|46|50194.74|0.00|0.00|N|O|1997-12-20|1998-01-03|1998-01-02|NONE|SHIP|gle slyly silent warhorses. +13478|1518|99|1|28|39746.28|0.06|0.06|N|O|1998-01-16|1998-03-08|1998-02-09|COLLECT COD|MAIL|e carefully. slyly express +13478|441|100|2|50|67072.00|0.09|0.00|N|O|1998-03-20|1998-02-10|1998-04-01|NONE|AIR|n requests across th +13478|1482|83|3|18|24902.64|0.10|0.08|N|O|1998-04-23|1998-03-06|1998-05-10|COLLECT COD|MAIL|es. slyly final requests ag +13478|1356|71|4|22|27661.70|0.06|0.04|N|O|1998-04-21|1998-03-23|1998-04-25|NONE|TRUCK|lphins use. fi +13478|1177|86|5|15|16172.55|0.08|0.03|N|O|1998-02-08|1998-03-26|1998-02-27|COLLECT COD|SHIP|uests. ironically express dolphins +13479|1441|59|1|28|37588.32|0.06|0.08|R|F|1995-02-16|1995-01-19|1995-03-07|TAKE BACK RETURN|SHIP|al ideas. unu +13479|1192|65|2|18|19677.42|0.06|0.03|A|F|1995-04-04|1995-02-10|1995-04-18|COLLECT COD|FOB|lly ironic pack +13479|1954|87|3|22|40830.90|0.07|0.06|A|F|1995-02-20|1995-01-24|1995-03-17|COLLECT COD|MAIL|fully slyly final courts. carefull +13479|1799|100|4|34|57826.86|0.08|0.06|A|F|1995-03-11|1995-02-02|1995-03-21|NONE|RAIL|he furiously express packa +13479|1125|62|5|16|16417.92|0.08|0.08|R|F|1995-02-06|1995-01-06|1995-02-28|TAKE BACK RETURN|SHIP|regular requests. silent, final accounts a +13504|1322|99|1|26|31806.32|0.02|0.04|N|O|1997-10-02|1997-08-17|1997-10-06|NONE|RAIL|nent deposits. slyly final dependencies ca +13504|663|64|2|5|7818.30|0.00|0.06|N|O|1997-08-02|1997-09-07|1997-08-27|TAKE BACK RETURN|AIR|inal, regular de +13504|375|60|3|41|52290.17|0.07|0.00|N|O|1997-06-19|1997-07-19|1997-06-25|NONE|RAIL|ect about the qui +13504|233|88|4|31|35130.13|0.02|0.08|N|O|1997-06-24|1997-08-28|1997-06-26|DELIVER IN PERSON|AIR|alongside of t +13505|1974|63|1|6|11255.82|0.02|0.02|N|O|1997-06-09|1997-08-06|1997-06-19|TAKE BACK RETURN|FOB|nding, regular ideas ab +13505|127|80|2|22|22596.64|0.03|0.08|N|O|1997-08-14|1997-07-05|1997-08-31|DELIVER IN PERSON|TRUCK|foxes doubt furiously. ideas serve quickly +13505|825|25|3|32|55226.24|0.10|0.05|N|O|1997-08-13|1997-07-27|1997-09-09|NONE|AIR|unusual ideas +13505|991|60|4|40|75679.60|0.05|0.05|N|O|1997-07-23|1997-07-17|1997-08-08|COLLECT COD|AIR|ven theodolites about the q +13505|1648|90|5|39|60435.96|0.08|0.02|N|O|1997-09-11|1997-08-03|1997-10-02|COLLECT COD|MAIL|heodolites integrate furiou +13506|1041|77|1|12|11304.48|0.02|0.00|N|O|1995-10-03|1995-10-03|1995-10-04|TAKE BACK RETURN|RAIL|es. even, ironic packa +13506|1477|17|2|18|24812.46|0.06|0.01|N|O|1995-08-24|1995-08-30|1995-09-16|DELIVER IN PERSON|MAIL|ove the slyly stealthy instructions +13506|187|66|3|48|52184.64|0.02|0.01|N|O|1995-09-24|1995-09-21|1995-09-26|NONE|TRUCK| pending theodolites cajole furi +13506|113|14|4|25|25327.75|0.06|0.04|N|O|1995-10-18|1995-10-15|1995-11-12|DELIVER IN PERSON|TRUCK|ly final deposits na +13507|672|66|1|11|17299.37|0.07|0.07|A|F|1993-02-16|1993-02-04|1993-03-03|TAKE BACK RETURN|TRUCK| silent packages wake quickly a +13507|1060|66|2|47|45169.82|0.10|0.08|A|F|1993-01-16|1993-02-05|1993-02-09|DELIVER IN PERSON|MAIL|ts. quickly regular depos +13507|1031|37|3|30|27960.90|0.04|0.03|A|F|1993-02-13|1993-01-30|1993-03-09|DELIVER IN PERSON|RAIL|nts hang slyly against the +13507|1487|66|4|22|30546.56|0.09|0.03|R|F|1993-01-11|1993-02-24|1993-02-03|NONE|FOB|. fluffily ironic gifts wake quickly boldl +13508|1696|79|1|2|3195.38|0.10|0.03|N|O|1997-07-18|1997-07-15|1997-07-24|TAKE BACK RETURN|TRUCK|ounts. furiou +13509|891|92|1|39|69883.71|0.03|0.01|N|O|1997-01-04|1996-12-30|1997-01-16|COLLECT COD|REG AIR|fully quic +13510|1059|95|1|22|21121.10|0.06|0.02|N|O|1998-01-16|1997-12-03|1998-01-17|TAKE BACK RETURN|FOB|osits along the even +13510|1134|7|2|29|30018.77|0.08|0.05|N|O|1998-01-15|1997-11-14|1998-01-24|TAKE BACK RETURN|RAIL|theodolites. furiously iron +13510|971|72|3|16|29951.52|0.01|0.05|N|O|1998-01-25|1997-11-18|1998-01-30|COLLECT COD|REG AIR|es use blithely after the cl +13511|577|8|1|42|62057.94|0.00|0.01|N|O|1998-03-24|1998-02-28|1998-04-19|COLLECT COD|RAIL|c accounts nag carefully. slyly fin +13511|97|48|2|29|28915.61|0.05|0.04|N|O|1998-02-16|1998-03-24|1998-03-10|NONE|TRUCK| ironic requests are quickly fur +13511|923|24|3|4|7295.68|0.00|0.07|N|O|1998-03-21|1998-02-23|1998-03-30|TAKE BACK RETURN|REG AIR|wake according to the pinto beans. fina +13511|1154|55|4|13|13716.95|0.10|0.02|N|O|1998-02-08|1998-03-01|1998-02-22|DELIVER IN PERSON|FOB| packages. carefull +13511|1572|53|5|16|23577.12|0.02|0.00|N|O|1998-04-20|1998-03-30|1998-05-01|NONE|RAIL|s requests haggle furiously final asymptote +13536|56|82|1|19|18164.95|0.10|0.06|R|F|1994-10-04|1994-09-24|1994-10-24|NONE|MAIL|l tithes. furiously ironic accou +13536|1632|33|2|25|38340.75|0.01|0.00|A|F|1994-11-23|1994-10-09|1994-12-07|COLLECT COD|AIR|ly even frets nag regular, +13536|227|28|3|36|40579.92|0.10|0.07|A|F|1994-11-09|1994-09-19|1994-11-12|NONE|REG AIR|elets. final theodolites alongside of the +13536|576|7|4|37|54633.09|0.03|0.04|R|F|1994-09-24|1994-09-27|1994-09-28|DELIVER IN PERSON|REG AIR|accounts. slyly +13536|937|38|5|20|36758.60|0.06|0.01|A|F|1994-10-25|1994-10-12|1994-11-19|TAKE BACK RETURN|RAIL|y deposits pro +13536|114|67|6|8|8112.88|0.02|0.08|R|F|1994-10-21|1994-10-06|1994-10-24|DELIVER IN PERSON|MAIL| slyly carefully express acco +13537|481|40|1|20|27629.60|0.08|0.04|R|F|1993-07-29|1993-07-25|1993-08-22|TAKE BACK RETURN|MAIL|grate blithely about the ironic de +13538|360|45|1|49|61757.64|0.02|0.06|N|O|1997-05-23|1997-03-08|1997-06-05|DELIVER IN PERSON|SHIP|against the foxes haggle bli +13538|1097|98|2|1|998.09|0.07|0.07|N|O|1997-02-12|1997-03-12|1997-02-27|DELIVER IN PERSON|MAIL|ng about the regular, ir +13539|497|98|1|15|20962.35|0.10|0.00|N|O|1997-05-08|1997-03-29|1997-05-30|NONE|RAIL|y among the sly +13539|36|87|2|47|43993.41|0.09|0.01|N|O|1997-04-13|1997-04-28|1997-04-30|TAKE BACK RETURN|AIR|heodolites integ +13539|747|80|3|11|18125.14|0.01|0.04|N|O|1997-03-19|1997-05-12|1997-03-25|TAKE BACK RETURN|MAIL|egular, regular theodoli +13539|1002|73|4|50|45150.00|0.06|0.04|N|O|1997-02-15|1997-04-27|1997-03-10|TAKE BACK RETURN|FOB|as use quic +13539|1948|37|5|35|64747.90|0.01|0.01|N|O|1997-03-11|1997-04-01|1997-04-07|COLLECT COD|MAIL|omas sleep daringly. blithely regular exc +13539|57|83|6|4|3828.20|0.04|0.04|N|O|1997-02-24|1997-04-18|1997-03-12|COLLECT COD|FOB|ar, pending excuses around the careful +13540|884|18|1|25|44622.00|0.10|0.02|R|F|1993-06-02|1993-08-02|1993-06-29|TAKE BACK RETURN|MAIL|ily final deposits cajo +13540|954|55|2|44|81617.80|0.06|0.08|R|F|1993-07-01|1993-07-19|1993-07-16|TAKE BACK RETURN|MAIL|ckages x-ray +13540|762|63|3|6|9976.56|0.01|0.01|R|F|1993-08-09|1993-06-26|1993-09-08|NONE|SHIP|lites nag about the slyly even instruc +13540|247|29|4|48|55067.52|0.08|0.02|A|F|1993-08-04|1993-08-04|1993-08-30|TAKE BACK RETURN|TRUCK|lyly. fluffily ironic requests +13540|134|35|5|26|26887.38|0.01|0.02|A|F|1993-07-18|1993-07-22|1993-08-04|COLLECT COD|AIR| pending requests wake +13540|1930|31|6|17|31142.81|0.10|0.04|R|F|1993-09-04|1993-08-12|1993-09-19|TAKE BACK RETURN|AIR|nts. slyly fi +13540|1450|29|7|28|37840.60|0.09|0.05|R|F|1993-09-08|1993-08-13|1993-10-08|DELIVER IN PERSON|MAIL|sly unusual +13541|356|85|1|21|26383.35|0.07|0.02|N|O|1996-09-03|1996-09-02|1996-09-06|NONE|RAIL|ccounts-- final +13541|1470|49|2|1|1371.47|0.04|0.07|N|O|1996-10-02|1996-09-24|1996-10-27|TAKE BACK RETURN|AIR|y even requests. slyly +13541|769|2|3|17|28385.92|0.07|0.04|N|O|1996-09-20|1996-10-02|1996-09-25|DELIVER IN PERSON|MAIL|busily against the slyly even foxe +13542|953|88|1|42|77865.90|0.04|0.03|R|F|1994-07-01|1994-05-21|1994-07-22|TAKE BACK RETURN|RAIL|ep blithely along the slyly regular a +13542|1204|5|2|46|50839.20|0.00|0.06|R|F|1994-06-02|1994-06-05|1994-06-27|TAKE BACK RETURN|SHIP|hely. regular, silent req +13542|788|85|3|46|77683.88|0.10|0.01|A|F|1994-06-21|1994-04-20|1994-07-02|DELIVER IN PERSON|AIR|sts haggle: +13542|1412|30|4|45|59103.45|0.03|0.02|R|F|1994-04-16|1994-05-25|1994-05-06|DELIVER IN PERSON|SHIP|kages cajole quickly about +13542|1416|17|5|34|44791.94|0.05|0.00|R|F|1994-03-24|1994-04-26|1994-03-26|TAKE BACK RETURN|RAIL|press tithes sleep after the pending +13543|786|51|1|11|18554.58|0.10|0.00|R|F|1992-10-05|1992-09-19|1992-10-25|DELIVER IN PERSON|RAIL|g the pending, ironic deposits. packages +13543|1126|99|2|7|7189.84|0.02|0.05|A|F|1992-08-28|1992-10-15|1992-09-08|DELIVER IN PERSON|AIR|ously bold multipliers +13568|1361|38|1|17|21460.12|0.03|0.02|R|F|1993-07-23|1993-07-20|1993-07-26|COLLECT COD|MAIL|riously even depo +13568|1949|38|2|4|7403.76|0.01|0.07|A|F|1993-05-31|1993-07-25|1993-06-12|DELIVER IN PERSON|MAIL|s haggle furiously ironic, even d +13568|510|1|3|38|53599.38|0.06|0.04|A|F|1993-07-18|1993-06-15|1993-07-31|DELIVER IN PERSON|FOB|ver special dolphins sleep blithely ab +13569|6|57|1|26|23556.00|0.05|0.08|R|F|1995-05-21|1995-05-21|1995-06-17|TAKE BACK RETURN|MAIL|kly unusual, even packages. blithely f +13569|1606|30|2|38|57288.80|0.04|0.08|R|F|1995-04-29|1995-05-12|1995-05-26|COLLECT COD|SHIP|es are daringly after the unusual, final a +13569|638|32|3|15|23079.45|0.08|0.01|A|F|1995-05-11|1995-07-04|1995-05-30|COLLECT COD|MAIL|, regular requests believe alongsi +13569|710|11|4|9|14496.39|0.02|0.04|N|O|1995-06-21|1995-06-28|1995-06-24|DELIVER IN PERSON|TRUCK|x carefully against the regular pack +13569|16|17|5|14|12824.14|0.03|0.06|N|O|1995-07-11|1995-05-30|1995-08-04|TAKE BACK RETURN|RAIL|ly. carefully final h +13569|106|85|6|33|33201.30|0.05|0.03|R|F|1995-05-10|1995-06-11|1995-05-22|NONE|SHIP|uests use quickly regular platelets. care +13569|731|28|7|14|22844.22|0.06|0.01|N|O|1995-07-08|1995-05-31|1995-08-05|COLLECT COD|TRUCK|oxes play along the bold ins +13570|1846|76|1|19|33208.96|0.05|0.03|A|F|1993-02-02|1993-02-26|1993-02-04|NONE|SHIP|thely ironic foxes. quickly final re +13570|453|83|2|17|23008.65|0.03|0.05|A|F|1993-02-28|1993-02-17|1993-03-19|COLLECT COD|FOB| packages doubt fluffily. +13570|320|21|3|44|53694.08|0.06|0.08|R|F|1992-12-27|1993-02-19|1993-01-12|TAKE BACK RETURN|SHIP|ainments use furiously spe +13570|798|31|4|33|56060.07|0.08|0.08|A|F|1993-01-23|1993-01-30|1993-01-29|TAKE BACK RETURN|REG AIR|s cajole. carefully regular pla +13570|1278|53|5|50|58963.50|0.03|0.06|R|F|1993-01-25|1993-03-03|1993-02-16|DELIVER IN PERSON|FOB|ly quickly bold pin +13571|32|83|1|25|23300.75|0.02|0.01|N|O|1998-06-08|1998-08-01|1998-07-01|DELIVER IN PERSON|SHIP| the bold, regular platelets. sa +13571|1994|95|2|32|60671.68|0.03|0.02|N|O|1998-09-29|1998-07-15|1998-10-18|TAKE BACK RETURN|AIR|uffily final ideas +13571|398|55|3|20|25967.80|0.01|0.04|N|O|1998-07-02|1998-08-21|1998-07-15|NONE|FOB|lar requests. fluffil +13571|1186|23|4|31|33702.58|0.06|0.02|N|O|1998-10-01|1998-07-10|1998-10-03|NONE|SHIP|usual packages cajole. carefully +13572|1357|58|1|7|8808.45|0.05|0.03|R|F|1992-05-28|1992-08-11|1992-06-02|NONE|AIR|sly bold deposit +13572|1088|59|2|1|989.08|0.08|0.07|A|F|1992-07-15|1992-07-05|1992-08-05|DELIVER IN PERSON|REG AIR|sual accounts. quickly r +13572|1553|54|3|21|30545.55|0.03|0.07|R|F|1992-07-11|1992-06-28|1992-08-01|TAKE BACK RETURN|RAIL|r asymptotes? slyly ev +13572|1754|97|4|8|13246.00|0.10|0.07|A|F|1992-06-18|1992-07-14|1992-06-25|TAKE BACK RETURN|TRUCK|yly ironic accounts; blithely regular attai +13572|374|31|5|42|53523.54|0.05|0.08|R|F|1992-06-26|1992-08-02|1992-07-05|DELIVER IN PERSON|FOB|beans shall snooze thinly re +13572|309|38|6|5|6046.50|0.04|0.07|R|F|1992-07-27|1992-06-25|1992-08-23|COLLECT COD|MAIL|use final requests. carefully express ac +13573|696|90|1|9|14370.21|0.01|0.04|N|O|1997-07-30|1997-06-10|1997-08-15|DELIVER IN PERSON|SHIP|osits among the slyly bol +13573|550|11|2|30|43516.50|0.06|0.01|N|O|1997-05-05|1997-07-08|1997-06-02|DELIVER IN PERSON|SHIP|. blithely ev +13573|1670|12|3|7|11001.69|0.09|0.06|N|O|1997-06-24|1997-06-21|1997-06-27|COLLECT COD|TRUCK|y. quickly final dependencies are carefull +13573|124|51|4|12|12289.44|0.06|0.01|N|O|1997-06-28|1997-06-04|1997-07-26|NONE|REG AIR|t the fluffily special depen +13574|928|63|1|41|74985.72|0.10|0.08|N|O|1997-11-27|1997-12-25|1997-12-27|DELIVER IN PERSON|AIR|usual tithes. slyl +13575|867|1|1|29|51267.94|0.01|0.01|R|F|1992-11-22|1992-11-25|1992-12-08|COLLECT COD|AIR|s sleep fluffily fluffily express sent +13575|1074|80|2|42|40952.94|0.05|0.05|R|F|1992-12-06|1992-10-23|1992-12-27|DELIVER IN PERSON|REG AIR| the deposits. even instr +13600|1433|34|1|24|32026.32|0.02|0.05|A|F|1993-08-07|1993-08-10|1993-08-30|NONE|TRUCK|fully bold asymptotes. platelets sleep. +13600|71|97|2|7|6797.49|0.06|0.05|A|F|1993-08-16|1993-09-01|1993-08-24|DELIVER IN PERSON|AIR|ests. ironic instructions +13600|926|95|3|48|87692.16|0.06|0.03|A|F|1993-11-03|1993-09-19|1993-11-12|DELIVER IN PERSON|FOB|arefully even cour +13601|406|65|1|24|31353.60|0.02|0.07|R|F|1992-11-05|1992-10-28|1992-11-28|NONE|TRUCK| bold deposits. +13601|1464|65|2|48|65542.08|0.04|0.07|R|F|1992-12-06|1992-10-16|1992-12-07|TAKE BACK RETURN|REG AIR|ly final accounts. slyly +13601|1772|73|3|43|71972.11|0.05|0.07|A|F|1992-10-11|1992-10-17|1992-11-09|NONE|MAIL| packages can haggle furiously furio +13601|958|61|4|27|50191.65|0.03|0.02|A|F|1992-08-23|1992-09-29|1992-09-15|NONE|AIR| across the special theodolites affi +13601|125|52|5|32|32803.84|0.04|0.07|R|F|1992-08-28|1992-11-04|1992-09-25|DELIVER IN PERSON|RAIL|yly regular dependencies! blithely daring +13602|1519|20|1|34|48297.34|0.03|0.00|A|F|1994-03-03|1994-03-04|1994-03-27|NONE|SHIP|st the quickly regular instructions. bold +13602|1871|1|2|49|86870.63|0.04|0.07|A|F|1994-03-19|1994-03-24|1994-04-01|COLLECT COD|SHIP|sts thrash fu +13602|1765|66|3|44|73337.44|0.09|0.02|A|F|1994-04-30|1994-03-03|1994-05-27|NONE|SHIP|yly regular excuses. furiously specia +13602|234|35|4|4|4536.92|0.01|0.08|R|F|1994-04-08|1994-03-14|1994-04-26|COLLECT COD|SHIP|luffily special dinos +13602|1622|23|5|49|74657.38|0.01|0.02|R|F|1994-02-08|1994-03-03|1994-02-28|TAKE BACK RETURN|TRUCK|beans detect f +13603|530|21|1|26|37193.78|0.10|0.03|N|O|1997-07-29|1997-09-05|1997-08-27|DELIVER IN PERSON|MAIL|press, even packages +13603|291|46|2|3|3573.87|0.10|0.00|N|O|1997-08-04|1997-07-26|1997-08-16|DELIVER IN PERSON|FOB| the furiously pend +13603|449|79|3|18|24289.92|0.09|0.05|N|O|1997-09-08|1997-08-28|1997-09-15|TAKE BACK RETURN|RAIL|lithely. requests again +13603|1090|26|4|22|21803.98|0.03|0.08|N|O|1997-06-18|1997-07-10|1997-07-07|DELIVER IN PERSON|FOB|ickly even +13603|494|24|5|4|5577.96|0.10|0.08|N|O|1997-06-29|1997-07-29|1997-07-09|COLLECT COD|MAIL|he quickly final foxes are blithely r +13603|681|75|6|44|69593.92|0.03|0.04|N|O|1997-08-06|1997-08-05|1997-08-12|DELIVER IN PERSON|MAIL|ecial courts? final accounts haggle a +13603|25|26|7|39|36075.78|0.00|0.08|N|O|1997-09-27|1997-07-13|1997-10-07|TAKE BACK RETURN|MAIL| blithely even instruc +13604|1417|96|1|15|19776.15|0.02|0.00|R|F|1994-05-22|1994-04-28|1994-06-01|TAKE BACK RETURN|FOB|sleep. furiously special requests u +13604|825|26|2|20|34516.40|0.01|0.05|A|F|1994-03-31|1994-04-23|1994-04-10|NONE|FOB|st have to wake among the silen +13604|1428|29|3|17|22600.14|0.05|0.03|R|F|1994-04-26|1994-04-27|1994-05-01|NONE|TRUCK|ding to the ironic pinto bean +13604|838|38|4|30|52164.90|0.10|0.02|R|F|1994-06-03|1994-03-25|1994-06-13|TAKE BACK RETURN|FOB|deas. regular dependencies are +13604|280|81|5|35|41309.80|0.02|0.08|R|F|1994-03-12|1994-03-07|1994-04-05|TAKE BACK RETURN|RAIL|egular deposits. slyly regular ideas cajole +13604|24|100|6|40|36960.80|0.06|0.03|R|F|1994-04-29|1994-03-10|1994-05-16|COLLECT COD|RAIL|ctions. slyly carefu +13604|885|52|7|42|75006.96|0.01|0.02|A|F|1994-03-06|1994-03-27|1994-03-29|TAKE BACK RETURN|TRUCK| quickly deposits. regular pinto beans +13605|1453|54|1|30|40633.50|0.08|0.01|N|O|1996-08-24|1996-09-02|1996-08-29|NONE|AIR|ep carefully above +13605|790|87|2|27|45651.33|0.08|0.01|N|O|1996-08-01|1996-09-01|1996-08-09|NONE|MAIL|ual accounts. fur +13605|1969|58|3|7|13096.72|0.03|0.05|N|O|1996-10-03|1996-09-08|1996-10-09|COLLECT COD|MAIL|pecial requests alongside of the d +13605|1030|36|4|4|3724.12|0.09|0.08|N|O|1996-09-03|1996-09-03|1996-09-21|DELIVER IN PERSON|MAIL|lar packages sublate blithely final request +13605|391|48|5|40|51655.60|0.04|0.07|N|O|1996-07-05|1996-09-04|1996-07-15|TAKE BACK RETURN|RAIL|s use furio +13605|214|96|6|34|37883.14|0.00|0.05|N|O|1996-07-26|1996-09-01|1996-08-14|COLLECT COD|RAIL|inal packages sleep after +13605|1056|57|7|12|11484.60|0.02|0.04|N|O|1996-06-16|1996-07-30|1996-07-12|DELIVER IN PERSON|REG AIR|luffily regular platelets integrate-- bli +13606|497|98|1|27|37732.23|0.09|0.04|R|F|1994-04-29|1994-07-22|1994-05-01|DELIVER IN PERSON|TRUCK|ic pinto beans sleep furiously after t +13606|173|26|2|13|13951.21|0.09|0.06|R|F|1994-06-23|1994-06-25|1994-07-03|COLLECT COD|REG AIR|kages nag furiously after +13606|309|38|3|27|32651.10|0.10|0.08|R|F|1994-04-28|1994-06-10|1994-05-22|NONE|REG AIR|the excuses. even br +13606|1402|20|4|34|44315.60|0.07|0.07|A|F|1994-05-05|1994-05-28|1994-05-17|COLLECT COD|REG AIR|e blithely. special fox +13606|1664|47|5|17|26616.22|0.02|0.01|R|F|1994-06-15|1994-06-27|1994-07-03|COLLECT COD|SHIP|en accounts +13606|1207|19|6|45|49869.00|0.01|0.04|A|F|1994-07-31|1994-06-19|1994-08-02|DELIVER IN PERSON|TRUCK| packages nag ab +13606|567|98|7|5|7337.80|0.06|0.00|A|F|1994-06-29|1994-07-13|1994-07-22|DELIVER IN PERSON|MAIL|ronic instructions. pen +13607|1722|49|1|42|68196.24|0.03|0.01|R|F|1994-02-20|1994-01-27|1994-03-19|COLLECT COD|FOB| requests; fluffily u +13607|1720|21|2|44|71355.68|0.10|0.08|A|F|1994-01-01|1994-02-09|1994-01-24|COLLECT COD|FOB|ins wake brav +13607|1815|45|3|6|10300.86|0.07|0.02|R|F|1994-02-17|1993-12-19|1994-03-03|COLLECT COD|FOB|e requests. regul +13607|1511|12|4|7|9887.57|0.01|0.03|R|F|1994-02-16|1993-12-26|1994-02-18|COLLECT COD|RAIL|ect blithely regular dependencie +13607|199|78|5|22|24182.18|0.00|0.01|A|F|1993-11-29|1993-12-19|1993-12-20|NONE|RAIL|ans. unusual instructions above +13607|534|65|6|14|20083.42|0.07|0.04|R|F|1994-03-07|1993-12-25|1994-04-02|DELIVER IN PERSON|REG AIR|unts against the +13607|539|30|7|7|10076.71|0.02|0.03|A|F|1994-03-12|1994-02-09|1994-03-19|DELIVER IN PERSON|RAIL|yly express packages. enticingly eve +13632|171|24|1|45|48202.65|0.08|0.07|A|F|1994-04-23|1994-04-29|1994-05-19|TAKE BACK RETURN|SHIP| regular packages are +13632|1207|19|2|1|1108.20|0.04|0.08|R|F|1994-03-20|1994-05-21|1994-04-13|DELIVER IN PERSON|AIR|ons. instructions are ca +13632|1341|56|3|49|60874.66|0.10|0.04|R|F|1994-03-15|1994-06-05|1994-03-24|TAKE BACK RETURN|AIR|jole. pendi +13632|65|66|4|50|48253.00|0.00|0.00|A|F|1994-06-08|1994-05-24|1994-07-03|COLLECT COD|MAIL|ged, final realms. furiously bold accoun +13632|635|98|5|28|42997.64|0.05|0.04|A|F|1994-06-20|1994-05-05|1994-07-07|TAKE BACK RETURN|RAIL|e fluffily accor +13632|1354|69|6|8|10042.80|0.10|0.08|A|F|1994-04-11|1994-05-28|1994-04-12|TAKE BACK RETURN|RAIL|structions after the even account +13632|458|17|7|42|57054.90|0.00|0.03|R|F|1994-06-24|1994-05-31|1994-07-03|TAKE BACK RETURN|RAIL|! quickly final braids a +13633|1804|34|1|13|22175.40|0.02|0.08|A|F|1992-06-30|1992-05-16|1992-07-20|COLLECT COD|REG AIR|ording to the +13633|901|4|2|11|19820.90|0.04|0.06|R|F|1992-07-07|1992-06-21|1992-07-15|TAKE BACK RETURN|AIR|onic accounts are slyly car +13633|1023|59|3|20|18480.40|0.10|0.08|R|F|1992-05-25|1992-06-22|1992-06-02|DELIVER IN PERSON|FOB| carefully regular deposits af +13633|1031|2|4|23|21436.69|0.02|0.01|A|F|1992-06-28|1992-06-14|1992-07-06|DELIVER IN PERSON|RAIL|olites. fluffily regu +13633|1695|37|5|5|7983.45|0.09|0.04|R|F|1992-06-24|1992-06-26|1992-06-28|NONE|AIR|ost carefully. blithely bold d +13633|973|74|6|44|82454.68|0.05|0.06|R|F|1992-05-09|1992-06-28|1992-05-14|DELIVER IN PERSON|RAIL|s integrate. deposits haggle slyly +13634|251|33|1|21|24176.25|0.03|0.07|A|F|1995-05-14|1995-06-01|1995-06-07|NONE|REG AIR|odolites are along the final foxes. +13634|1564|5|2|13|19052.28|0.07|0.02|N|O|1995-07-03|1995-07-07|1995-08-02|TAKE BACK RETURN|FOB|s. slyly dogged patterns nag furiously +13635|725|90|1|22|35765.84|0.02|0.05|A|F|1994-08-19|1994-06-28|1994-09-17|TAKE BACK RETURN|FOB|ourts play c +13635|960|95|2|46|85604.16|0.08|0.07|R|F|1994-06-22|1994-06-27|1994-06-28|DELIVER IN PERSON|AIR| nag blithely idly special ac +13636|1524|25|1|1|1425.52|0.00|0.06|R|F|1994-05-11|1994-03-14|1994-05-31|NONE|TRUCK|ar pinto beans? slyly pendin +13636|1374|51|2|27|34434.99|0.03|0.02|A|F|1994-04-03|1994-03-20|1994-04-08|COLLECT COD|RAIL|are furious +13636|1071|42|3|48|46659.36|0.00|0.06|A|F|1994-05-11|1994-04-19|1994-05-18|DELIVER IN PERSON|REG AIR|lent requests. ironic excuses +13636|1816|46|4|49|84172.69|0.05|0.08|A|F|1994-01-25|1994-03-20|1994-02-10|TAKE BACK RETURN|FOB|dolites. silently pendin +13637|1415|55|1|47|61871.27|0.00|0.08|N|O|1996-02-27|1996-03-02|1996-03-22|COLLECT COD|FOB|he quickly ironic platelets boost b +13638|246|47|1|24|27509.76|0.02|0.07|N|O|1995-11-27|1995-11-07|1995-12-21|DELIVER IN PERSON|TRUCK|fluffily bold accounts affix at th +13638|1817|61|2|43|73908.83|0.01|0.07|N|O|1996-01-06|1995-12-26|1996-01-17|COLLECT COD|TRUCK|special pai +13638|1899|29|3|22|39619.58|0.02|0.04|N|O|1995-11-19|1995-11-28|1995-12-14|TAKE BACK RETURN|AIR|ve the final, sly requests wake f +13638|717|50|4|42|67943.82|0.00|0.02|N|O|1995-10-30|1995-11-18|1995-11-04|TAKE BACK RETURN|REG AIR|ding to the bold theodolites boost fin +13638|1463|3|5|28|38204.88|0.02|0.06|N|O|1995-11-16|1995-11-29|1995-11-30|TAKE BACK RETURN|AIR|ymptotes are slyly +13638|1826|56|6|41|70840.62|0.04|0.05|N|O|1995-12-30|1995-12-11|1996-01-07|COLLECT COD|SHIP|s use. deposits are carefully according t +13639|1017|53|1|34|31212.34|0.05|0.01|N|O|1997-09-25|1997-08-18|1997-10-05|DELIVER IN PERSON|TRUCK|nts. fluffily even reque +13639|521|12|2|46|65389.92|0.03|0.03|N|O|1997-09-18|1997-07-20|1997-10-12|DELIVER IN PERSON|FOB|en accounts eat slyly +13639|63|14|3|31|29854.86|0.01|0.06|N|O|1997-09-05|1997-08-23|1997-10-03|DELIVER IN PERSON|SHIP| even instructi +13664|1885|86|1|19|33950.72|0.04|0.07|N|O|1996-03-23|1996-02-15|1996-04-03|NONE|AIR| print among the regular, regular deposits. +13664|140|93|2|40|41605.60|0.05|0.02|N|O|1996-04-01|1996-03-04|1996-04-15|DELIVER IN PERSON|AIR| poach ent +13664|664|96|3|48|75103.68|0.01|0.08|N|O|1995-12-31|1996-02-16|1996-01-26|NONE|REG AIR|ainst the final cour +13664|1364|41|4|47|59471.92|0.00|0.02|N|O|1996-02-05|1996-02-22|1996-02-07|DELIVER IN PERSON|RAIL|lar accoun +13664|1253|28|5|12|13851.00|0.06|0.06|N|O|1995-12-18|1996-02-25|1996-01-06|NONE|TRUCK|dolites according to the carefully bold pl +13664|540|31|6|45|64824.30|0.06|0.02|N|O|1996-03-22|1996-02-23|1996-04-07|COLLECT COD|REG AIR|posits haggle. cou +13665|1660|2|1|34|53096.44|0.09|0.08|N|O|1996-06-19|1996-06-27|1996-07-01|DELIVER IN PERSON|RAIL|ding asymptotes sl +13665|1890|91|2|16|28670.24|0.02|0.06|N|O|1996-07-03|1996-06-20|1996-08-02|NONE|AIR|uffily final requests engage carefully upo +13665|862|63|3|20|35257.20|0.04|0.07|N|O|1996-04-10|1996-05-10|1996-04-28|DELIVER IN PERSON|MAIL|, ironic pack +13665|425|84|4|30|39762.60|0.01|0.06|N|O|1996-06-07|1996-06-03|1996-06-10|COLLECT COD|RAIL|r instructions boo +13665|1704|89|5|4|6422.80|0.04|0.03|N|O|1996-08-01|1996-06-28|1996-08-29|COLLECT COD|RAIL|etect carefully. carefully ironic deposit +13665|594|95|6|10|14945.90|0.06|0.06|N|O|1996-05-17|1996-06-24|1996-06-03|TAKE BACK RETURN|REG AIR|ackages above the regular asymptote +13666|88|89|1|28|27666.24|0.07|0.05|R|F|1992-05-12|1992-05-31|1992-05-14|NONE|RAIL|ven packages haggle. carefully bold +13666|1600|81|2|21|31533.60|0.00|0.02|R|F|1992-03-31|1992-04-20|1992-04-13|COLLECT COD|FOB| regular requests hang blithely according t +13667|1337|76|1|5|6191.65|0.06|0.04|N|O|1997-01-18|1997-02-03|1997-02-04|TAKE BACK RETURN|RAIL|ul escapades! caref +13667|203|85|2|2|2206.40|0.05|0.08|N|O|1997-03-24|1997-01-03|1997-04-03|NONE|AIR|old theodolites. carefully final pa +13667|119|72|3|16|16305.76|0.05|0.03|N|O|1997-01-05|1997-02-04|1997-01-25|DELIVER IN PERSON|RAIL|ly careful deposits. p +13667|1356|33|4|31|38977.85|0.08|0.08|N|O|1997-01-05|1997-02-13|1997-01-22|COLLECT COD|AIR|. even instructions above th +13667|1517|98|5|35|49647.85|0.03|0.08|N|O|1997-02-13|1997-01-20|1997-03-03|COLLECT COD|MAIL|along the special notornis. quickly spec +13667|1587|88|6|38|56566.04|0.00|0.00|N|O|1996-12-23|1997-01-24|1996-12-28|TAKE BACK RETURN|MAIL|ress theodol +13667|288|43|7|34|40401.52|0.10|0.02|N|O|1997-02-09|1997-01-10|1997-02-19|DELIVER IN PERSON|SHIP|e daringly against the carefu +13668|764|61|1|49|81573.24|0.02|0.02|A|F|1992-04-18|1992-04-04|1992-05-08|NONE|TRUCK|as sleep. per +13668|1632|15|2|6|9201.78|0.09|0.04|A|F|1992-06-04|1992-05-22|1992-06-20|DELIVER IN PERSON|TRUCK|uses. bold p +13668|1787|30|3|50|84439.00|0.05|0.02|R|F|1992-06-09|1992-04-26|1992-06-13|TAKE BACK RETURN|FOB|rding to the furiously bold platelet +13668|101|28|4|44|44048.40|0.01|0.07|A|F|1992-03-24|1992-04-19|1992-03-25|COLLECT COD|REG AIR|s theodolites boost regu +13669|903|4|1|29|52313.10|0.05|0.03|N|O|1996-10-21|1996-10-20|1996-11-18|NONE|REG AIR| special deposits. sile +13669|1142|51|2|40|41725.60|0.03|0.03|N|O|1996-08-30|1996-11-08|1996-09-18|NONE|SHIP|ly unusual asymptotes boost caref +13669|360|17|3|16|20165.76|0.06|0.00|N|O|1996-10-18|1996-11-09|1996-11-15|NONE|MAIL|luffily pending requests. slowly ironic +13669|1524|25|4|7|9978.64|0.04|0.03|N|O|1996-12-09|1996-09-26|1997-01-01|NONE|AIR|instructions. accounts +13669|280|35|5|22|25966.16|0.07|0.08|N|O|1996-08-16|1996-09-27|1996-09-07|TAKE BACK RETURN|AIR|ironic, enticing pac +13669|662|56|6|10|15626.60|0.08|0.02|N|O|1996-09-29|1996-10-16|1996-10-08|NONE|REG AIR|. slowly even excuses nag after t +13669|1398|99|7|13|16892.07|0.06|0.04|N|O|1996-10-15|1996-10-15|1996-11-14|NONE|FOB|o beans nag quickly about the even t +13670|1883|84|1|38|67825.44|0.04|0.08|A|F|1992-06-29|1992-07-17|1992-07-17|TAKE BACK RETURN|MAIL|xpress pack +13670|554|55|2|21|30545.55|0.05|0.01|R|F|1992-06-03|1992-07-06|1992-06-21|NONE|SHIP| theodolites affix ru +13670|1191|64|3|50|54609.50|0.05|0.03|A|F|1992-06-20|1992-07-21|1992-07-13|COLLECT COD|AIR|kly past the requests. qui +13671|889|90|1|14|25058.32|0.06|0.03|N|O|1996-11-11|1996-09-24|1996-12-06|DELIVER IN PERSON|RAIL|uests doubt slyly. quickly final packages w +13671|120|21|2|40|40804.80|0.07|0.05|N|O|1996-10-06|1996-09-24|1996-11-03|COLLECT COD|FOB|le above the ironically final reques +13671|529|60|3|20|28590.40|0.04|0.02|N|O|1996-08-12|1996-10-10|1996-08-24|TAKE BACK RETURN|AIR|g the carefully final dep +13671|1421|39|4|12|15869.04|0.07|0.01|N|O|1996-08-17|1996-09-13|1996-08-27|NONE|MAIL|ost fluffily even deposits. even d +13671|617|49|5|41|62222.01|0.10|0.05|N|O|1996-08-31|1996-09-20|1996-09-05|NONE|RAIL|y pending deposits wake slyl +13671|554|15|6|30|43636.50|0.10|0.06|N|O|1996-10-04|1996-08-26|1996-10-05|COLLECT COD|AIR|gle slyly quic +13671|598|89|7|8|11988.72|0.06|0.01|N|O|1996-08-31|1996-08-25|1996-09-03|TAKE BACK RETURN|REG AIR|ironic foxes wake furiously ironic depos +13696|226|27|1|30|33786.60|0.00|0.00|N|O|1997-12-01|1997-11-01|1997-12-31|COLLECT COD|TRUCK|odolites sleep along the fi +13696|628|91|2|8|12228.96|0.06|0.02|N|O|1997-09-12|1997-11-11|1997-09-20|NONE|REG AIR|ickly final requests. quickl +13696|462|92|3|7|9537.22|0.09|0.04|N|O|1997-11-24|1997-10-31|1997-11-25|NONE|SHIP|ions eat furiously. ironically ironic p +13696|1081|17|4|46|45175.68|0.09|0.02|N|O|1997-09-01|1997-10-17|1997-09-08|DELIVER IN PERSON|MAIL|sual accounts alongside of the +13696|229|57|5|1|1129.22|0.00|0.04|N|O|1997-09-02|1997-10-31|1997-09-24|TAKE BACK RETURN|MAIL|the special, +13696|1339|54|6|18|22325.94|0.07|0.01|N|O|1997-11-15|1997-10-16|1997-12-03|NONE|MAIL|ajole blithely pending pinto b +13697|667|68|1|2|3135.32|0.07|0.08|N|O|1998-07-11|1998-07-01|1998-08-04|DELIVER IN PERSON|TRUCK|the bold pinto beans: expre +13697|1808|38|2|30|51294.00|0.04|0.08|N|O|1998-07-19|1998-05-22|1998-08-18|NONE|SHIP|foxes. furiously pending f +13697|906|75|3|28|50593.20|0.08|0.02|N|O|1998-04-26|1998-06-21|1998-05-10|TAKE BACK RETURN|TRUCK|nly final requests. bo +13698|4|5|1|50|45200.00|0.03|0.03|A|F|1994-09-23|1994-11-01|1994-09-26|TAKE BACK RETURN|MAIL|ffily express accounts use after th +13698|680|12|2|46|72711.28|0.08|0.03|R|F|1994-10-27|1994-10-21|1994-11-06|TAKE BACK RETURN|REG AIR|uses wake careful +13698|32|8|3|34|31689.02|0.00|0.07|R|F|1994-08-19|1994-10-25|1994-09-03|NONE|FOB|y. platelets are quickly. enticingly +13698|159|86|4|7|7414.05|0.10|0.06|R|F|1994-10-13|1994-09-29|1994-11-01|TAKE BACK RETURN|REG AIR|egular courts. ironic instruct +13699|1549|90|1|15|21758.10|0.00|0.05|N|O|1997-05-31|1997-06-07|1997-06-15|DELIVER IN PERSON|FOB| the blithe, pending dependencie +13700|143|96|1|19|19819.66|0.01|0.03|R|F|1992-06-11|1992-03-19|1992-07-06|DELIVER IN PERSON|FOB|, final requests. slyly +13701|611|43|1|47|71045.67|0.02|0.01|N|O|1998-08-01|1998-06-17|1998-08-12|TAKE BACK RETURN|RAIL|s. even depe +13701|249|77|2|5|5746.20|0.04|0.01|N|O|1998-07-14|1998-07-11|1998-08-07|TAKE BACK RETURN|FOB|inal platelets. quickly f +13701|311|40|3|25|30282.75|0.04|0.05|N|O|1998-06-26|1998-08-13|1998-07-13|COLLECT COD|TRUCK|after the furiously even dependenc +13701|37|63|4|3|2811.09|0.01|0.00|N|O|1998-07-25|1998-06-30|1998-08-12|DELIVER IN PERSON|TRUCK|ding epitaphs are. regular +13701|1803|33|5|30|51144.00|0.01|0.08|N|O|1998-07-17|1998-08-05|1998-08-14|TAKE BACK RETURN|FOB|lyly regular theodolites. +13701|542|3|6|41|59144.14|0.02|0.01|N|O|1998-06-11|1998-06-28|1998-06-15|COLLECT COD|TRUCK| sleep slyly. slyly final deposits nag +13702|1898|28|1|20|35997.80|0.10|0.00|N|O|1995-12-23|1995-10-28|1996-01-16|COLLECT COD|FOB|s platelets boost according t +13702|362|19|2|16|20197.76|0.05|0.02|N|O|1995-12-04|1995-11-21|1995-12-22|TAKE BACK RETURN|TRUCK|thely after the carefully bold accounts. +13703|813|80|1|13|22279.53|0.04|0.08|N|O|1997-04-22|1997-03-17|1997-05-14|NONE|REG AIR|kly above the idle deposits. +13703|1635|36|2|20|30732.60|0.02|0.02|N|O|1997-03-14|1997-03-15|1997-04-09|DELIVER IN PERSON|TRUCK|ly silent deposits about the regular pint +13703|1374|75|3|42|53565.54|0.03|0.05|N|O|1997-04-11|1997-03-13|1997-04-17|NONE|MAIL|refully ironic requests. bold do +13703|1055|61|4|38|36329.90|0.02|0.06|N|O|1997-02-27|1997-03-07|1997-03-12|NONE|FOB|kly bold deposits. dependencies thrash som +13703|791|92|5|40|67671.60|0.00|0.08|N|O|1997-03-04|1997-02-18|1997-03-16|NONE|FOB|ructions haggle slyly carefully unusual +13728|863|63|1|36|63498.96|0.04|0.00|N|O|1996-01-22|1996-01-26|1996-02-19|NONE|SHIP|excuses x-ray slyly special ideas. +13728|231|59|2|20|22624.60|0.09|0.02|N|O|1996-01-28|1996-03-09|1996-02-11|NONE|RAIL|sual packages hinder abov +13728|125|26|3|40|41004.80|0.03|0.05|N|O|1996-01-30|1996-01-15|1996-01-31|TAKE BACK RETURN|REG AIR|deas wake furiously. +13729|63|89|1|14|13482.84|0.01|0.06|A|F|1994-04-27|1994-03-19|1994-05-04|COLLECT COD|RAIL|ully above the idly e +13729|271|26|2|18|21082.86|0.02|0.06|A|F|1994-01-19|1994-03-22|1994-01-28|TAKE BACK RETURN|SHIP| sleep. carefully expr +13729|292|47|3|44|52460.76|0.04|0.04|A|F|1994-02-11|1994-03-24|1994-02-26|DELIVER IN PERSON|TRUCK|quests believe alon +13730|1033|34|1|42|39229.26|0.09|0.03|N|F|1995-06-06|1995-07-22|1995-06-28|NONE|RAIL|slyly according to the fu +13731|647|10|1|41|63453.24|0.05|0.02|A|F|1993-07-09|1993-07-07|1993-07-17|TAKE BACK RETURN|RAIL|oldly against t +13731|940|75|2|31|57069.14|0.07|0.00|R|F|1993-05-23|1993-06-29|1993-06-03|TAKE BACK RETURN|SHIP|lithely. sl +13731|243|44|3|30|34297.20|0.00|0.06|R|F|1993-08-23|1993-06-12|1993-08-27|NONE|AIR|oost furiously bold +13731|847|47|4|33|57678.72|0.01|0.02|R|F|1993-08-08|1993-06-21|1993-08-19|COLLECT COD|MAIL|kages sleep quickly. reque +13732|212|67|1|5|5561.05|0.09|0.07|R|F|1993-01-21|1993-02-08|1993-02-07|TAKE BACK RETURN|RAIL|slyly after +13732|1602|85|2|15|22554.00|0.06|0.07|R|F|1993-03-11|1993-02-17|1993-04-06|COLLECT COD|SHIP|o beans. slyly sly dolphins nag. sly +13732|1803|4|3|40|68192.00|0.02|0.07|A|F|1993-03-23|1993-02-19|1993-04-04|NONE|MAIL|y even instruc +13732|864|98|4|38|67064.68|0.04|0.04|A|F|1993-02-04|1993-02-02|1993-02-08|TAKE BACK RETURN|AIR|ronic dolphins use across the foxes. +13733|1984|73|1|50|94299.00|0.02|0.05|N|O|1998-01-15|1998-03-01|1998-02-06|DELIVER IN PERSON|AIR|refully special packages. +13733|1887|17|2|8|14311.04|0.00|0.05|N|O|1998-01-11|1998-03-20|1998-01-14|DELIVER IN PERSON|MAIL|sual dolphins are carefully. furiously sp +13733|1760|61|3|39|64808.64|0.01|0.02|N|O|1998-03-17|1998-03-28|1998-03-26|DELIVER IN PERSON|RAIL|ges: ironic ideas integrate +13733|1116|89|4|3|3051.33|0.10|0.07|N|O|1998-03-12|1998-02-16|1998-03-31|DELIVER IN PERSON|AIR|ly express excuse +13733|1640|41|5|41|63207.24|0.01|0.03|N|O|1998-03-26|1998-03-18|1998-04-23|NONE|RAIL|rding to the quickly regular accounts ca +13733|986|87|6|2|3773.96|0.02|0.05|N|O|1998-02-02|1998-03-23|1998-02-17|COLLECT COD|SHIP|r deposits. blithe +13733|1645|87|7|49|75785.36|0.01|0.06|N|O|1998-03-18|1998-02-14|1998-03-19|NONE|FOB| regular platelets detect. iro +13734|1835|36|1|31|53841.73|0.03|0.01|N|O|1996-11-02|1996-11-07|1996-11-22|TAKE BACK RETURN|REG AIR|lar pinto beans about +13734|1358|59|2|34|42817.90|0.05|0.08|N|O|1996-10-29|1996-10-28|1996-11-04|TAKE BACK RETURN|FOB|ccounts haggle. qui +13734|794|27|3|37|62707.23|0.10|0.06|N|O|1996-09-04|1996-10-08|1996-09-13|NONE|RAIL|y ironic deposits boost slyly ironic ins +13735|837|71|1|25|43445.75|0.03|0.00|A|F|1994-07-11|1994-08-17|1994-08-07|COLLECT COD|RAIL| fluffily final requests wake +13735|545|6|2|23|33247.42|0.05|0.01|R|F|1994-05-30|1994-08-10|1994-06-26|DELIVER IN PERSON|SHIP|osits wake after the final, e +13735|1450|68|3|40|54058.00|0.00|0.05|R|F|1994-06-10|1994-07-20|1994-07-06|COLLECT COD|REG AIR|ickly bold pack +13760|518|49|1|29|41136.79|0.03|0.07|N|O|1996-07-15|1996-07-06|1996-07-16|COLLECT COD|RAIL|t even grouches? blithely +13760|576|67|2|11|16242.27|0.05|0.05|N|O|1996-07-24|1996-08-07|1996-08-11|COLLECT COD|TRUCK|heodolites sleep carefully about the ironi +13760|179|80|3|23|24820.91|0.05|0.03|N|O|1996-08-02|1996-07-15|1996-08-04|NONE|FOB|haggle fluffily final excu +13760|913|48|4|3|5441.73|0.03|0.05|N|O|1996-08-12|1996-08-23|1996-08-28|TAKE BACK RETURN|TRUCK|its alongside o +13760|1284|59|5|14|16593.92|0.08|0.02|N|O|1996-08-09|1996-07-10|1996-09-05|NONE|MAIL|en accounts. slyly +13760|1091|27|6|21|20833.89|0.10|0.08|N|O|1996-07-30|1996-07-10|1996-08-11|NONE|RAIL|ously idle packages haggle furiously even a +13760|1906|95|7|3|5423.70|0.00|0.07|N|O|1996-07-13|1996-07-27|1996-07-22|TAKE BACK RETURN|MAIL|nts are according to the ironi +13761|1962|7|1|22|41007.12|0.03|0.02|R|F|1994-11-12|1994-12-05|1994-11-16|NONE|SHIP|unts use regular asymptotes. pending, fu +13761|1995|40|2|39|73982.61|0.07|0.04|A|F|1994-11-15|1994-12-09|1994-12-09|COLLECT COD|FOB|even, thin foxes ab +13761|678|41|3|19|29994.73|0.03|0.01|A|F|1994-12-19|1994-12-07|1995-01-04|DELIVER IN PERSON|SHIP|boldly final +13761|1928|73|4|1|1829.92|0.10|0.08|R|F|1995-02-09|1994-12-19|1995-02-18|DELIVER IN PERSON|TRUCK| the unusual, final foxes cajole fluffily +13761|1401|80|5|24|31257.60|0.02|0.05|R|F|1995-02-13|1994-12-15|1995-02-18|DELIVER IN PERSON|FOB| carefully bold requests along the even p +13761|353|54|6|2|2506.70|0.10|0.02|R|F|1995-01-23|1995-01-01|1995-01-29|TAKE BACK RETURN|AIR| carefully ironic pi +13761|1299|100|7|17|20404.93|0.00|0.06|A|F|1994-12-28|1994-12-28|1995-01-12|TAKE BACK RETURN|FOB| regular ideas. regular asymptotes s +13762|1768|95|1|27|45083.52|0.09|0.08|A|F|1993-10-02|1993-07-27|1993-10-09|DELIVER IN PERSON|FOB|ording to the furiously blithe dug +13762|630|93|2|22|33673.86|0.09|0.00|A|F|1993-10-14|1993-08-05|1993-10-24|NONE|TRUCK|sts nag blithely af +13762|1792|19|3|3|5081.37|0.04|0.01|R|F|1993-09-24|1993-08-02|1993-10-24|DELIVER IN PERSON|SHIP|sly pending, special pac +13762|1529|50|4|27|38624.04|0.04|0.01|A|F|1993-08-17|1993-08-28|1993-08-23|TAKE BACK RETURN|AIR| quickly ironic foxes slee +13762|612|6|5|25|37815.25|0.08|0.08|R|F|1993-08-15|1993-09-12|1993-08-22|DELIVER IN PERSON|TRUCK|lar, express excuses. ironic, +13762|789|86|6|30|50693.40|0.01|0.05|R|F|1993-08-21|1993-08-15|1993-09-06|COLLECT COD|FOB|. slowly bold requests run furiously across +13762|139|18|7|3|3117.39|0.04|0.05|R|F|1993-07-09|1993-08-20|1993-07-20|DELIVER IN PERSON|TRUCK|ven packages boost carefully bl +13763|78|54|1|25|24451.75|0.03|0.02|N|O|1997-07-28|1997-08-07|1997-08-02|COLLECT COD|RAIL|blithely quiet pinto +13763|1612|36|2|48|72653.28|0.03|0.08|N|O|1997-10-19|1997-08-15|1997-11-18|COLLECT COD|TRUCK|ve to nag carefully. slyly bold accounts +13763|431|90|3|41|54588.63|0.03|0.01|N|O|1997-10-06|1997-08-15|1997-11-04|NONE|REG AIR|y final instructions. even cou +13763|146|47|4|10|10461.40|0.02|0.02|N|O|1997-10-24|1997-09-24|1997-11-14|COLLECT COD|SHIP|g to the quickly +13764|1398|75|1|20|25987.80|0.03|0.03|N|O|1995-09-11|1995-09-14|1995-09-29|COLLECT COD|SHIP|s. quickly regular theodolites +13764|1092|28|2|11|10923.99|0.02|0.03|N|O|1995-11-08|1995-10-08|1995-12-05|TAKE BACK RETURN|AIR|even platelets. carefully even tithes +13764|999|34|3|44|83599.56|0.04|0.06|N|O|1995-08-24|1995-10-05|1995-09-09|DELIVER IN PERSON|RAIL|he silent instruct +13765|785|18|1|27|45516.06|0.02|0.03|A|F|1994-06-01|1994-06-28|1994-06-18|COLLECT COD|REG AIR|r, pending requests about +13765|1860|47|2|9|15856.74|0.03|0.03|R|F|1994-04-22|1994-06-20|1994-05-18|TAKE BACK RETURN|RAIL| regularly fluffily express de +13765|164|91|3|48|51079.68|0.02|0.01|R|F|1994-06-19|1994-05-24|1994-07-03|NONE|SHIP|dependencies integrate ironic wartho +13765|1566|7|4|32|46961.92|0.10|0.05|A|F|1994-04-23|1994-05-20|1994-04-28|NONE|RAIL|uffily above the final requests. bold, expr +13766|916|85|1|26|47239.66|0.06|0.02|R|F|1993-01-09|1992-12-13|1993-01-19|TAKE BACK RETURN|REG AIR|carefully regular warhorses use bl +13767|1505|46|1|17|23910.50|0.01|0.00|R|F|1993-09-15|1993-11-09|1993-10-03|TAKE BACK RETURN|FOB|affix caref +13767|396|25|2|43|55744.77|0.03|0.08|A|F|1993-09-30|1993-11-20|1993-10-04|DELIVER IN PERSON|RAIL|tes. somas t +13767|210|92|3|19|21093.99|0.02|0.08|A|F|1993-11-06|1993-11-13|1993-11-24|NONE|MAIL|ial, daring packages. quickly expr +13767|1261|62|4|9|10460.34|0.03|0.01|R|F|1993-09-21|1993-10-12|1993-10-19|DELIVER IN PERSON|SHIP|l asymptotes. bold ideas cajole ca +13767|832|32|5|13|22526.79|0.09|0.03|A|F|1993-11-27|1993-11-01|1993-11-28|COLLECT COD|SHIP|entiments-- ide +13767|104|83|6|44|44180.40|0.06|0.07|R|F|1993-12-23|1993-11-10|1994-01-21|DELIVER IN PERSON|RAIL|egular packages. furiously iro +13767|200|79|7|28|30805.60|0.06|0.08|A|F|1993-11-26|1993-10-09|1993-12-19|COLLECT COD|SHIP|regular packages gro +13792|348|5|1|42|52430.28|0.10|0.03|N|O|1996-06-01|1996-03-30|1996-06-26|TAKE BACK RETURN|REG AIR|riously ironic requests poach along +13793|1100|36|1|17|17018.70|0.00|0.06|N|O|1995-10-30|1995-11-03|1995-11-14|DELIVER IN PERSON|TRUCK| asymptotes. final, unusual account +13794|502|3|1|50|70125.00|0.10|0.03|R|F|1994-02-14|1994-04-04|1994-02-21|NONE|TRUCK|regular theodolites. quickly sile +13794|371|72|2|6|7628.22|0.03|0.05|R|F|1994-04-16|1994-03-01|1994-04-23|TAKE BACK RETURN|REG AIR|out the regularly ironic p +13794|1895|39|3|24|43125.36|0.03|0.02|R|F|1994-03-08|1994-03-10|1994-03-20|NONE|TRUCK|ding accounts are carefully final, +13794|1401|41|4|49|63817.60|0.01|0.04|A|F|1994-03-23|1994-02-13|1994-04-20|NONE|TRUCK|ccounts. blithely unusu +13794|1048|49|5|35|33216.40|0.03|0.04|A|F|1994-03-05|1994-04-02|1994-03-22|COLLECT COD|SHIP|slyly. blithely final instructio +13794|438|97|6|2|2676.86|0.04|0.03|A|F|1994-04-18|1994-02-15|1994-04-27|COLLECT COD|FOB|sits sleep. thin theodolites thrash furiou +13794|1977|66|7|9|16910.73|0.04|0.05|A|F|1994-01-14|1994-03-26|1994-01-28|COLLECT COD|FOB|sleep after the fluffily pendin +13795|998|67|1|4|7595.96|0.05|0.08|N|O|1995-07-01|1995-06-19|1995-07-24|TAKE BACK RETURN|RAIL|e slyly slyly enticing requests. quick +13795|1205|43|2|10|11062.00|0.01|0.05|R|F|1995-06-06|1995-06-25|1995-06-14|NONE|REG AIR|uriously even requests +13795|269|24|3|9|10523.34|0.06|0.05|A|F|1995-04-14|1995-06-01|1995-04-17|NONE|REG AIR|e the permanent, special +13795|754|55|4|43|71154.25|0.06|0.03|R|F|1995-05-17|1995-05-13|1995-06-06|DELIVER IN PERSON|FOB|uriously express pin +13795|310|95|5|49|59305.19|0.06|0.07|N|O|1995-07-13|1995-06-30|1995-07-14|TAKE BACK RETURN|REG AIR|to the requests use carefully quickly eve +13795|352|37|6|50|62617.50|0.02|0.07|R|F|1995-05-03|1995-06-03|1995-05-16|TAKE BACK RETURN|REG AIR| the carefully bold packages. furiou +13795|1569|90|7|7|10293.92|0.08|0.01|N|O|1995-07-19|1995-06-02|1995-07-21|COLLECT COD|TRUCK|ic, unusual requests nag sly +13796|1835|79|1|47|81631.01|0.00|0.03|N|O|1997-08-14|1997-09-17|1997-09-02|DELIVER IN PERSON|MAIL| deposits serve slyly special a +13796|1245|20|2|40|45849.60|0.00|0.04|N|O|1997-10-12|1997-09-04|1997-10-18|NONE|RAIL| blithely ironic de +13796|1512|13|3|49|69261.99|0.09|0.03|N|O|1997-09-07|1997-08-14|1997-09-16|COLLECT COD|MAIL|ial hockey players after the instructions s +13796|267|49|4|42|49024.92|0.07|0.07|N|O|1997-06-27|1997-09-13|1997-07-02|COLLECT COD|SHIP|gular escapades. bl +13797|670|64|1|34|53402.78|0.02|0.02|N|O|1996-12-14|1996-11-02|1997-01-08|NONE|TRUCK|osits. final deposits use b +13797|1453|32|2|18|24380.10|0.03|0.08|N|O|1996-11-23|1996-11-03|1996-12-22|COLLECT COD|RAIL|gular theodolites. realms boo +13797|872|73|3|22|39003.14|0.08|0.04|N|O|1996-10-07|1996-10-05|1996-10-28|COLLECT COD|MAIL|y silent dependencies. blithely final depo +13797|1509|30|4|35|49367.50|0.06|0.02|N|O|1996-09-09|1996-10-23|1996-09-30|NONE|TRUCK| carefully unusua +13797|542|73|5|36|51931.44|0.10|0.07|N|O|1996-10-31|1996-10-27|1996-11-13|NONE|SHIP|ckages are furiously around +13797|353|10|6|11|13786.85|0.06|0.04|N|O|1996-11-28|1996-11-12|1996-12-17|TAKE BACK RETURN|FOB|en request +13798|1276|51|1|30|35318.10|0.01|0.01|N|O|1996-03-31|1996-03-19|1996-04-07|COLLECT COD|REG AIR| final, express dolphins sl +13798|566|27|2|26|38130.56|0.08|0.06|N|O|1996-05-24|1996-04-28|1996-05-29|NONE|FOB|entiments. requests are accounts. s +13798|137|90|3|11|11408.43|0.01|0.02|N|O|1996-06-02|1996-04-10|1996-06-20|DELIVER IN PERSON|AIR|. ironic ide +13798|1489|90|4|29|40323.92|0.02|0.01|N|O|1996-05-05|1996-04-22|1996-05-17|DELIVER IN PERSON|SHIP| ideas are. slyly express pinto be +13799|506|37|1|42|59073.00|0.09|0.03|R|F|1994-01-30|1994-01-09|1994-02-21|TAKE BACK RETURN|SHIP|tithes. slyly silent requests are carefull +13799|1522|23|2|39|55517.28|0.07|0.02|R|F|1994-03-04|1994-03-01|1994-03-15|DELIVER IN PERSON|RAIL| slyly fin +13799|1023|24|3|38|35112.76|0.07|0.06|A|F|1994-03-27|1994-01-29|1994-04-15|NONE|RAIL|nding instruction +13824|1295|96|1|33|39477.57|0.01|0.07|R|F|1995-04-26|1995-03-08|1995-05-04|COLLECT COD|TRUCK|sly accord +13824|192|71|2|8|8737.52|0.04|0.03|A|F|1995-01-15|1995-02-25|1995-02-06|TAKE BACK RETURN|FOB|e. special requests nag fina +13824|1829|59|3|19|32885.58|0.08|0.01|A|F|1995-03-01|1995-02-24|1995-03-29|TAKE BACK RETURN|REG AIR|riously pending, idle r +13824|418|77|4|27|35597.07|0.09|0.05|A|F|1995-03-19|1995-03-18|1995-04-03|DELIVER IN PERSON|TRUCK|aringly silent requests boost slyly. +13825|13|64|1|34|31042.34|0.06|0.03|A|F|1994-04-14|1994-05-03|1994-04-15|TAKE BACK RETURN|MAIL|g to the regular epitaphs! ironic depos +13825|1983|16|2|5|9424.90|0.04|0.06|R|F|1994-05-01|1994-04-29|1994-05-02|TAKE BACK RETURN|SHIP|e boldly reg +13825|1088|59|3|19|18792.52|0.10|0.08|R|F|1994-05-21|1994-04-26|1994-06-01|COLLECT COD|FOB|onic deposits beneath the +13825|1575|96|4|29|42820.53|0.09|0.06|R|F|1994-07-08|1994-04-29|1994-08-07|TAKE BACK RETURN|REG AIR| silent, express requests. furiou +13825|773|6|5|2|3347.54|0.04|0.07|A|F|1994-06-17|1994-06-11|1994-06-18|DELIVER IN PERSON|MAIL| asymptotes +13825|670|2|6|11|17277.37|0.03|0.01|A|F|1994-05-14|1994-05-22|1994-05-15|COLLECT COD|TRUCK|ously expr +13825|1985|30|7|29|54722.42|0.04|0.04|A|F|1994-07-03|1994-05-27|1994-07-05|NONE|FOB| blithely ironic +13826|1666|90|1|3|4702.98|0.00|0.03|N|O|1997-06-02|1997-05-05|1997-06-04|COLLECT COD|AIR| express pinto beans after the silently reg +13826|1656|80|2|10|15576.50|0.06|0.01|N|O|1997-03-21|1997-04-25|1997-04-08|NONE|MAIL|t the blithely express plate +13826|861|61|3|26|45808.36|0.09|0.04|N|O|1997-04-25|1997-05-20|1997-04-27|COLLECT COD|AIR|eas snooze +13826|1352|29|4|43|53894.05|0.09|0.07|N|O|1997-02-28|1997-04-16|1997-03-21|COLLECT COD|FOB|regular excuses. regular accounts are +13826|54|80|5|48|45794.40|0.06|0.04|N|O|1997-05-01|1997-04-17|1997-05-13|NONE|SHIP|unusual packages h +13827|1269|7|1|38|44469.88|0.01|0.01|R|F|1993-08-08|1993-09-17|1993-08-11|NONE|RAIL|p furiously arou +13828|551|12|1|31|44998.05|0.02|0.08|A|F|1994-08-06|1994-08-25|1994-08-18|NONE|MAIL|lly even excuses. furiously +13828|488|18|2|28|38877.44|0.07|0.05|A|F|1994-09-18|1994-09-04|1994-10-01|TAKE BACK RETURN|MAIL|y. even, unusual deposits sleep +13829|353|54|1|26|32587.10|0.00|0.01|N|O|1996-12-06|1996-11-18|1997-01-05|COLLECT COD|MAIL|s detect slyly final asymptote +13829|764|97|2|23|38289.48|0.07|0.00|N|O|1997-01-17|1996-11-30|1997-01-19|NONE|SHIP|ckly ironic ins +13829|916|17|3|12|21802.92|0.05|0.04|N|O|1996-09-29|1996-11-21|1996-10-20|DELIVER IN PERSON|AIR|ld ideas-- regular instructions +13829|1994|95|4|50|94799.50|0.00|0.04|N|O|1996-11-18|1996-12-14|1996-11-25|DELIVER IN PERSON|SHIP|. platelet +13830|499|87|1|11|15394.39|0.03|0.05|R|F|1995-04-15|1995-02-18|1995-05-06|COLLECT COD|REG AIR|c excuses. +13830|1972|61|2|30|56219.10|0.04|0.08|R|F|1995-03-03|1995-02-18|1995-04-01|TAKE BACK RETURN|TRUCK|ly furiously silent accounts: +13830|1011|17|3|30|27360.30|0.07|0.00|R|F|1995-03-28|1995-01-23|1995-04-15|COLLECT COD|TRUCK|usual pinto beans. blithely regu +13830|1463|3|4|49|66858.54|0.00|0.05|R|F|1995-04-05|1995-02-18|1995-04-23|COLLECT COD|SHIP|iously special dependenc +13831|926|95|1|46|84038.32|0.03|0.05|N|O|1996-05-28|1996-06-07|1996-06-05|DELIVER IN PERSON|RAIL|nd the regularly bold req +13831|1408|87|2|38|49757.20|0.08|0.02|N|O|1996-07-03|1996-06-23|1996-07-17|DELIVER IN PERSON|AIR|kages. instructions according to the s +13831|1079|80|3|20|19601.40|0.03|0.04|N|O|1996-07-16|1996-05-25|1996-07-30|DELIVER IN PERSON|MAIL|aggle furiously even ideas. bl +13831|1501|82|4|30|42075.00|0.07|0.02|N|O|1996-07-31|1996-07-11|1996-08-12|NONE|RAIL|even instruc +13831|832|32|5|12|20793.96|0.01|0.01|N|O|1996-06-09|1996-06-15|1996-06-28|COLLECT COD|REG AIR|ackages mold above the furiously exp +13831|38|64|6|24|22512.72|0.08|0.07|N|O|1996-06-07|1996-06-06|1996-07-03|COLLECT COD|RAIL|thely pending ide +13856|1867|11|1|4|7075.44|0.06|0.00|N|O|1998-03-06|1998-02-26|1998-03-12|DELIVER IN PERSON|SHIP|fully ironic deposits; slyly fl +13856|604|98|2|8|12036.80|0.01|0.07|N|O|1997-12-09|1998-01-14|1997-12-23|COLLECT COD|TRUCK|ly final accounts boost. +13856|965|34|3|23|42917.08|0.06|0.07|N|O|1998-01-26|1998-01-09|1998-02-02|DELIVER IN PERSON|TRUCK|symptotes do +13856|1487|27|4|30|41654.40|0.10|0.00|N|O|1998-01-16|1998-01-23|1998-01-18|NONE|MAIL|usly above the carefully final +13856|1323|62|5|15|18364.80|0.02|0.01|N|O|1998-03-12|1998-01-24|1998-04-07|NONE|MAIL|ng instructions. carefully final account +13856|397|26|6|8|10379.12|0.10|0.03|N|O|1998-03-15|1998-01-24|1998-04-01|TAKE BACK RETURN|FOB|ers among the carefully pendin +13856|1351|52|7|21|26299.35|0.02|0.02|N|O|1998-03-14|1998-01-09|1998-04-11|NONE|FOB|fluffily final packages about the instruct +13857|586|87|1|6|8919.48|0.02|0.06|N|O|1995-08-26|1995-10-11|1995-09-15|TAKE BACK RETURN|TRUCK| furiously pending hock +13858|955|90|1|24|44542.80|0.09|0.02|A|F|1994-07-14|1994-09-27|1994-07-15|TAKE BACK RETURN|REG AIR|nts. ironic accounts sleep slyly +13858|577|78|2|2|2955.14|0.09|0.05|A|F|1994-07-29|1994-08-19|1994-08-05|TAKE BACK RETURN|TRUCK|structions. quickly ironic i +13859|1464|43|1|25|34136.50|0.02|0.07|N|O|1997-02-21|1997-03-05|1997-03-18|NONE|FOB|integrate. quickly ex +13859|1506|7|2|5|7037.50|0.00|0.03|N|O|1997-04-29|1997-03-25|1997-05-23|NONE|FOB|lay. carefully pending excuses h +13859|1909|54|3|38|68814.20|0.06|0.03|N|O|1997-02-20|1997-03-20|1997-03-14|COLLECT COD|SHIP|sts detect +13859|185|38|4|10|10851.80|0.05|0.03|N|O|1997-03-16|1997-03-30|1997-03-24|TAKE BACK RETURN|REG AIR|arefully dolphins. slyly +13859|1044|45|5|5|4725.20|0.04|0.03|N|O|1997-01-20|1997-03-15|1997-02-14|TAKE BACK RETURN|FOB|. carefully speci +13859|852|52|6|32|56091.20|0.02|0.00|N|O|1997-02-14|1997-03-02|1997-02-19|NONE|SHIP|fluffily thin accounts. busily regular requ +13859|960|61|7|27|50245.92|0.08|0.05|N|O|1997-02-13|1997-03-15|1997-02-15|TAKE BACK RETURN|RAIL|ests are quickly according to the +13860|1604|28|1|42|63235.20|0.05|0.03|A|F|1994-11-06|1994-11-29|1994-11-19|TAKE BACK RETURN|SHIP|even, special foxes +13861|441|29|1|18|24145.92|0.06|0.03|A|F|1993-10-06|1993-09-23|1993-10-07|COLLECT COD|TRUCK|nts will have to wake s +13861|1405|84|2|17|22208.80|0.03|0.08|A|F|1993-10-04|1993-10-08|1993-10-30|DELIVER IN PERSON|TRUCK|. pending orbits play +13861|986|87|3|29|54722.42|0.03|0.08|R|F|1993-09-21|1993-09-22|1993-10-13|TAKE BACK RETURN|FOB|ial requests +13861|614|8|4|31|46952.91|0.01|0.05|A|F|1993-11-20|1993-09-24|1993-12-02|DELIVER IN PERSON|REG AIR|nic excuses. final, ironic platelets inte +13861|511|42|5|22|31053.22|0.01|0.08|R|F|1993-11-18|1993-10-12|1993-12-03|COLLECT COD|REG AIR|ts. furiously speci +13861|1232|33|6|25|28330.75|0.09|0.07|A|F|1993-09-28|1993-09-29|1993-10-21|TAKE BACK RETURN|MAIL| ironic instructions. final, even pinto b +13861|1243|44|7|9|10298.16|0.05|0.05|A|F|1993-11-10|1993-09-24|1993-11-21|DELIVER IN PERSON|AIR|ual theodolites haggle furiously until th +13862|564|55|1|39|57117.84|0.08|0.08|N|O|1997-11-22|1997-10-28|1997-12-03|TAKE BACK RETURN|TRUCK|its use permanent +13862|1479|58|2|34|46935.98|0.01|0.06|N|O|1997-12-22|1997-10-03|1998-01-13|COLLECT COD|RAIL|unusual depos +13862|1728|71|3|15|24445.80|0.02|0.00|N|O|1997-10-19|1997-10-05|1997-10-28|TAKE BACK RETURN|FOB|wake alongside of the +13862|804|71|4|3|5114.40|0.04|0.07|N|O|1997-09-06|1997-10-14|1997-09-30|COLLECT COD|RAIL|endencies. slyly ironic accounts e +13862|1119|56|5|34|34683.74|0.04|0.08|N|O|1997-10-06|1997-10-09|1997-11-01|NONE|MAIL|ithely special escapades. carefully bo +13862|392|21|6|50|64619.50|0.03|0.00|N|O|1997-10-17|1997-10-21|1997-10-18|TAKE BACK RETURN|SHIP|ar pains c +13863|1593|34|1|19|28397.21|0.01|0.03|R|F|1992-09-14|1992-07-10|1992-10-01|COLLECT COD|FOB| sleep blithely regular reque +13863|586|77|2|15|22298.70|0.02|0.00|A|F|1992-09-23|1992-07-06|1992-09-27|TAKE BACK RETURN|SHIP|ly even requests use. unusual, bold ide +13863|1881|68|3|48|85578.24|0.10|0.06|A|F|1992-06-09|1992-08-15|1992-06-22|NONE|AIR|quickly about the quickly final depen +13888|1011|47|1|8|7296.08|0.10|0.01|R|F|1993-08-04|1993-07-04|1993-08-22|TAKE BACK RETURN|REG AIR|sly against the careful +13889|1745|72|1|26|42815.24|0.02|0.00|N|O|1995-11-27|1995-11-24|1995-12-27|DELIVER IN PERSON|RAIL|y after the f +13889|1832|76|2|19|32942.77|0.09|0.06|N|O|1995-12-31|1995-11-04|1996-01-06|TAKE BACK RETURN|FOB|nts wake slyly pending accounts. +13890|1437|38|1|12|16061.16|0.04|0.01|N|O|1996-09-18|1996-06-24|1996-09-23|TAKE BACK RETURN|FOB|ar packages nag blithely carefully bold +13890|192|19|2|4|4368.76|0.05|0.06|N|O|1996-06-05|1996-07-04|1996-06-24|TAKE BACK RETURN|MAIL|ounts. blithely silent ideas i +13890|1936|37|3|3|5513.79|0.04|0.02|N|O|1996-08-23|1996-08-04|1996-09-12|DELIVER IN PERSON|SHIP|ic accounts. fluffily regular accounts wak +13890|1525|26|4|18|25677.36|0.06|0.04|N|O|1996-08-05|1996-07-27|1996-08-23|COLLECT COD|TRUCK|y express requests +13891|1073|9|1|25|24351.75|0.08|0.00|N|O|1996-07-15|1996-08-22|1996-07-27|NONE|AIR|e special, ironic deposits. bold pinto bea +13891|415|16|2|17|22361.97|0.05|0.01|N|O|1996-07-24|1996-08-09|1996-08-07|TAKE BACK RETURN|SHIP|efully pending platelets +13891|184|85|3|5|5420.90|0.03|0.04|N|O|1996-07-09|1996-08-23|1996-07-14|TAKE BACK RETURN|MAIL|cajole in place of the slyly iron +13891|1916|5|4|7|12725.37|0.01|0.04|N|O|1996-07-23|1996-09-09|1996-08-01|DELIVER IN PERSON|SHIP| even requests boost blithely daring +13892|350|51|1|49|61267.15|0.06|0.05|A|F|1992-08-09|1992-06-26|1992-09-04|NONE|AIR|ix fluffily around the quickly +13892|861|95|2|44|77521.84|0.06|0.08|R|F|1992-06-09|1992-06-02|1992-06-17|TAKE BACK RETURN|SHIP|aggle carefully along +13892|981|16|3|38|71515.24|0.00|0.08|A|F|1992-07-14|1992-06-19|1992-08-05|NONE|FOB|out the quickly sly in +13893|860|61|1|47|82760.42|0.01|0.07|N|O|1998-06-19|1998-06-10|1998-07-11|NONE|REG AIR|ly regular excus +13893|1162|71|2|31|32957.96|0.09|0.03|N|O|1998-05-03|1998-05-17|1998-05-06|COLLECT COD|REG AIR|structions. +13893|1334|11|3|12|14823.96|0.04|0.00|N|O|1998-05-20|1998-06-30|1998-05-21|TAKE BACK RETURN|TRUCK|ly express theodolites. final packa +13894|225|26|1|22|24754.84|0.01|0.08|R|F|1992-04-19|1992-05-19|1992-05-16|DELIVER IN PERSON|RAIL|furiously silent dolphins. +13894|1499|17|2|39|54619.11|0.01|0.02|A|F|1992-07-21|1992-05-13|1992-08-18|TAKE BACK RETURN|REG AIR|nic dependencies sleep fluffily ca +13894|872|73|3|8|14182.96|0.04|0.06|R|F|1992-08-06|1992-06-15|1992-08-27|TAKE BACK RETURN|TRUCK|ly ironic theodolites +13894|1096|97|4|30|29912.70|0.09|0.08|R|F|1992-08-06|1992-06-11|1992-08-16|COLLECT COD|AIR|even accounts wake slyly unusual pac +13895|1896|40|1|47|84500.83|0.09|0.02|R|F|1994-03-12|1994-01-27|1994-03-19|TAKE BACK RETURN|AIR|blithely slyly steal +13895|1692|34|2|45|71716.05|0.05|0.03|R|F|1994-03-18|1994-01-21|1994-04-07|NONE|RAIL|final sauternes a +13895|266|48|3|9|10496.34|0.08|0.01|A|F|1994-03-17|1993-12-21|1994-04-10|COLLECT COD|REG AIR|fily even +13895|1489|7|4|50|69524.00|0.10|0.08|A|F|1993-12-15|1994-01-13|1993-12-27|DELIVER IN PERSON|MAIL|pecial foxes. ironic accoun +13920|583|14|1|37|54892.46|0.01|0.04|R|F|1995-01-14|1994-12-29|1995-02-02|DELIVER IN PERSON|SHIP|yly fluffily express theodolit +13920|786|87|2|39|65784.42|0.00|0.02|A|F|1995-01-30|1994-12-14|1995-02-17|TAKE BACK RETURN|REG AIR| haggle bold, regular +13920|806|6|3|19|32429.20|0.09|0.07|R|F|1995-01-17|1994-12-06|1995-01-23|NONE|REG AIR|gainst the always quiet +13921|362|47|1|4|5049.44|0.03|0.07|N|O|1997-09-09|1997-09-27|1997-10-05|COLLECT COD|FOB|ounts. fluffily even packag +13921|744|77|2|40|65789.60|0.01|0.04|N|O|1997-09-07|1997-10-29|1997-09-09|NONE|AIR|nic requests cajole furious theodoli +13921|879|79|3|14|24918.18|0.03|0.08|N|O|1997-10-16|1997-11-05|1997-11-04|DELIVER IN PERSON|SHIP|lites. furiously pending +13921|745|46|4|33|54309.42|0.03|0.01|N|O|1997-12-07|1997-10-12|1998-01-03|NONE|MAIL|ss the slyly exp +13922|162|63|1|14|14870.24|0.08|0.03|N|O|1995-10-13|1995-09-28|1995-11-06|COLLECT COD|FOB|eposits x-ray blithely over +13922|1268|80|2|50|58463.00|0.03|0.00|N|O|1995-09-18|1995-10-11|1995-10-04|DELIVER IN PERSON|TRUCK|metimes. reg +13922|243|71|3|37|42299.88|0.01|0.05|N|O|1995-09-30|1995-10-17|1995-10-29|NONE|SHIP| courts sleep among the p +13922|1028|99|4|45|41805.90|0.02|0.07|N|O|1995-11-20|1995-10-23|1995-11-24|COLLECT COD|MAIL| unusual requests. carefully blit +13922|114|93|5|20|20282.20|0.00|0.07|N|O|1995-10-11|1995-09-14|1995-10-26|TAKE BACK RETURN|SHIP|nic requests. furiously unusual foxes c +13922|1098|4|6|41|40962.69|0.09|0.08|N|O|1995-11-01|1995-10-25|1995-11-16|TAKE BACK RETURN|MAIL|ounts sleep bli +13922|150|77|7|32|33604.80|0.09|0.06|N|O|1995-08-31|1995-09-28|1995-09-22|COLLECT COD|FOB|cajole carefully about the reg +13923|555|56|1|42|61133.10|0.02|0.00|R|F|1992-09-02|1992-09-20|1992-09-27|DELIVER IN PERSON|RAIL|ages. bold Tiresi +13923|972|41|2|13|24348.61|0.07|0.03|A|F|1992-10-19|1992-09-09|1992-11-01|TAKE BACK RETURN|RAIL|tealthily spe +13923|737|34|3|1|1637.73|0.00|0.03|R|F|1992-07-23|1992-09-24|1992-07-26|COLLECT COD|AIR|wake furiously accordi +13923|1542|83|4|26|37532.04|0.06|0.01|R|F|1992-10-01|1992-09-08|1992-10-08|NONE|REG AIR| unusual, unusual excuses affix. ca +13923|1971|72|5|2|3745.94|0.08|0.05|A|F|1992-08-15|1992-08-14|1992-08-27|NONE|REG AIR| excuses print carefully bli +13923|438|97|6|24|32122.32|0.05|0.04|A|F|1992-09-17|1992-08-20|1992-10-06|COLLECT COD|AIR|o beans against the f +13924|987|22|1|2|3775.96|0.05|0.02|A|F|1995-04-03|1995-01-28|1995-04-28|DELIVER IN PERSON|SHIP|l courts about the slyly regular frets nag +13925|813|47|1|16|27420.96|0.01|0.07|N|O|1997-04-29|1997-03-16|1997-05-24|TAKE BACK RETURN|FOB|y about the regular dolphins. blithel +13925|562|63|2|16|23400.96|0.00|0.03|N|O|1997-02-14|1997-02-07|1997-02-24|DELIVER IN PERSON|FOB|s print slyly final pa +13925|329|14|3|1|1229.32|0.06|0.08|N|O|1997-04-06|1997-02-11|1997-05-04|NONE|REG AIR|furiously ironic sheaves. requests acro +13925|1116|53|4|38|38650.18|0.06|0.08|N|O|1997-03-08|1997-03-17|1997-03-25|COLLECT COD|MAIL|e alongside of the furiously un +13925|767|32|5|43|71713.68|0.09|0.05|N|O|1997-01-19|1997-03-24|1997-02-04|NONE|AIR|p against the final accounts. pendin +13926|1803|90|1|28|47734.40|0.10|0.05|N|O|1997-08-29|1997-08-17|1997-09-26|NONE|AIR|ke furiously at the quickly ironi +13926|287|42|2|1|1187.28|0.01|0.01|N|O|1997-09-14|1997-08-12|1997-09-26|NONE|AIR|the furiously silent sheaves. ironic, +13926|898|32|3|3|5396.67|0.00|0.08|N|O|1997-10-30|1997-09-19|1997-11-05|COLLECT COD|SHIP|even deposits cajole quickly +13927|1091|62|1|17|16865.53|0.04|0.00|R|F|1994-11-13|1994-10-10|1994-12-07|TAKE BACK RETURN|FOB|ss accounts engage slyly instructions; pen +13927|550|11|2|9|13054.95|0.05|0.02|A|F|1994-11-27|1994-11-16|1994-12-07|DELIVER IN PERSON|SHIP|usly unusual ac +13927|1227|2|3|21|23692.62|0.05|0.01|R|F|1994-09-08|1994-11-11|1994-09-13|COLLECT COD|SHIP| foxes sleep. ironic ideas +13927|952|21|4|24|44470.80|0.01|0.06|A|F|1994-11-27|1994-10-29|1994-12-02|TAKE BACK RETURN|FOB|to beans. furiously final theodolite +13927|1163|64|5|6|6384.96|0.00|0.02|A|F|1994-12-05|1994-10-10|1994-12-07|TAKE BACK RETURN|FOB|posits sleep slyly caref +13927|412|42|6|13|17061.33|0.00|0.00|R|F|1994-10-19|1994-11-25|1994-10-25|COLLECT COD|MAIL|g according to the ironic package +13952|271|72|1|31|36309.37|0.05|0.06|N|O|1997-06-06|1997-06-03|1997-06-18|DELIVER IN PERSON|REG AIR|press depe +13952|132|85|2|41|42317.33|0.09|0.02|N|O|1997-08-12|1997-07-24|1997-08-28|COLLECT COD|AIR|y ironic, regular courts. qui +13952|849|49|3|22|38496.48|0.03|0.05|N|O|1997-05-28|1997-06-28|1997-06-08|TAKE BACK RETURN|REG AIR|express excuses. carefully ru +13953|1840|70|1|29|50513.36|0.02|0.02|N|O|1995-09-09|1995-08-22|1995-09-24|COLLECT COD|AIR|lar packages cajole blithely. car +13953|586|77|2|49|72842.42|0.05|0.06|N|O|1995-09-09|1995-08-03|1995-09-10|NONE|TRUCK| slyly about the r +13953|1332|47|3|48|59199.84|0.03|0.07|N|O|1995-08-11|1995-08-14|1995-09-02|COLLECT COD|REG AIR|uests haggle slyly. theodol +13953|225|80|4|47|52885.34|0.09|0.01|N|O|1995-08-15|1995-07-09|1995-08-28|NONE|TRUCK|ecial deposits. carefully regular dependen +13954|1962|7|1|3|5591.88|0.05|0.06|N|O|1996-06-17|1996-06-13|1996-07-03|COLLECT COD|REG AIR|the ironically regular deposits. expr +13954|977|46|2|45|84508.65|0.08|0.08|N|O|1996-08-30|1996-06-08|1996-09-28|TAKE BACK RETURN|RAIL| deposits. quickly ironic +13954|1649|91|3|20|31012.80|0.06|0.07|N|O|1996-06-06|1996-06-17|1996-06-25|DELIVER IN PERSON|REG AIR|luffy packages are never above the carefu +13954|1082|53|4|13|12780.04|0.06|0.01|N|O|1996-07-03|1996-06-13|1996-07-12|COLLECT COD|RAIL| according to the final accounts use final +13955|973|42|1|28|52471.16|0.00|0.00|N|O|1998-07-18|1998-07-02|1998-08-09|DELIVER IN PERSON|REG AIR|accounts after the blithely regular t +13955|776|9|2|8|13414.16|0.10|0.00|N|O|1998-05-20|1998-08-05|1998-06-03|DELIVER IN PERSON|FOB|nusual packages. +13955|1124|25|3|16|16401.92|0.06|0.00|N|O|1998-07-31|1998-07-24|1998-08-10|TAKE BACK RETURN|MAIL|y even packages. +13955|925|28|4|42|76688.64|0.01|0.08|N|O|1998-08-10|1998-07-14|1998-08-22|COLLECT COD|RAIL|rmanent excuses. even, bo +13956|1127|36|1|20|20562.40|0.03|0.03|A|F|1995-04-02|1995-04-27|1995-04-03|TAKE BACK RETURN|TRUCK|s instructions. slyly bold +13956|1980|13|2|13|24465.74|0.05|0.04|R|F|1995-05-09|1995-05-02|1995-05-13|TAKE BACK RETURN|REG AIR|onic, regular packages boost slyly. pend +13956|539|100|3|4|5758.12|0.08|0.00|N|F|1995-06-12|1995-05-03|1995-06-20|COLLECT COD|TRUCK|deposits instead of the packa +13956|1657|58|4|38|59228.70|0.10|0.07|N|O|1995-07-04|1995-04-17|1995-07-13|TAKE BACK RETURN|TRUCK|ajole slyly. carefully ironic pa +13957|1526|47|1|46|65665.92|0.05|0.00|N|O|1995-08-13|1995-10-12|1995-08-30|TAKE BACK RETURN|TRUCK| nag carefully even packages. fluffily e +13957|331|60|2|32|39402.56|0.07|0.06|N|O|1995-09-09|1995-09-12|1995-10-05|COLLECT COD|MAIL| accounts wake gifts. fluffily d +13957|795|28|3|48|81397.92|0.09|0.02|N|O|1995-09-19|1995-09-21|1995-09-30|NONE|RAIL|y under the slyly e +13958|1097|33|1|7|6986.63|0.10|0.00|R|F|1993-03-15|1993-03-08|1993-03-31|TAKE BACK RETURN|MAIL|s instructions. pending ideas sleep +13958|1264|39|2|29|33792.54|0.10|0.02|R|F|1993-04-23|1993-03-13|1993-05-04|TAKE BACK RETURN|TRUCK|egular theodolites wake agai +13958|110|37|3|16|16161.76|0.10|0.01|A|F|1993-04-25|1993-03-31|1993-05-20|DELIVER IN PERSON|TRUCK|eas after the quickly bold fo +13959|1241|16|1|44|50258.56|0.03|0.04|R|F|1994-05-09|1994-05-25|1994-05-25|DELIVER IN PERSON|SHIP|fily final requ +13959|1230|31|2|47|53167.81|0.10|0.01|R|F|1994-07-22|1994-05-11|1994-07-30|NONE|FOB|are around the dolphin +13984|924|25|1|39|71171.88|0.07|0.00|A|F|1992-11-30|1992-11-08|1992-12-21|TAKE BACK RETURN|AIR|l pinto beans. fin +13984|1086|57|2|45|44418.60|0.07|0.08|R|F|1992-12-03|1992-11-25|1992-12-16|NONE|MAIL|y slyly even +13984|1821|8|3|1|1722.82|0.00|0.04|A|F|1993-01-22|1992-11-12|1993-02-17|COLLECT COD|REG AIR| nag slyly ironic ideas. f +13984|793|26|4|48|81301.92|0.01|0.06|A|F|1992-12-19|1992-12-17|1992-12-22|DELIVER IN PERSON|FOB|ses. furiously even gifts wake furi +13985|355|84|1|7|8787.45|0.02|0.08|N|O|1998-10-09|1998-08-24|1998-11-02|NONE|SHIP|s haggle beyond the slyly bold dinos. regu +13985|366|23|2|7|8864.52|0.05|0.08|N|O|1998-08-22|1998-08-26|1998-09-08|NONE|RAIL|. furiously regular accounts use furiousl +13985|879|79|3|38|67635.06|0.06|0.03|N|O|1998-07-24|1998-07-15|1998-08-03|COLLECT COD|SHIP|es are! silent, regular a +13985|1033|34|4|36|33625.08|0.09|0.04|N|O|1998-09-09|1998-07-24|1998-09-18|DELIVER IN PERSON|MAIL|inal pinto beans. always pending package +13985|806|7|5|8|13654.40|0.04|0.06|N|O|1998-08-17|1998-07-15|1998-08-20|NONE|REG AIR|g deposits: f +13985|1643|85|6|29|44794.56|0.01|0.02|N|O|1998-07-02|1998-08-07|1998-07-29|DELIVER IN PERSON|MAIL|platelets sleep carefully? even dependenci +13986|356|13|1|9|11307.15|0.00|0.08|N|O|1995-11-07|1995-11-13|1995-11-20|DELIVER IN PERSON|TRUCK|old packages use. +13986|731|28|2|24|39161.52|0.03|0.04|N|O|1995-11-07|1996-01-04|1995-11-16|DELIVER IN PERSON|TRUCK|he final accounts; pinto beans wak +13986|872|39|3|23|40776.01|0.10|0.05|N|O|1996-02-09|1996-01-02|1996-03-01|TAKE BACK RETURN|AIR| theodolites. slyly silent deposits are +13986|128|81|4|13|13365.56|0.07|0.08|N|O|1995-11-16|1996-01-05|1995-11-29|DELIVER IN PERSON|REG AIR|le blithely a +13987|475|34|1|25|34386.75|0.07|0.03|N|O|1998-07-28|1998-05-17|1998-08-12|TAKE BACK RETURN|RAIL|refully fina +13987|326|83|2|20|24526.40|0.04|0.05|N|O|1998-07-25|1998-05-17|1998-08-23|DELIVER IN PERSON|AIR|carefully brave foxes. carefully final p +13987|1480|81|3|5|6907.40|0.09|0.07|N|O|1998-07-28|1998-07-01|1998-08-22|DELIVER IN PERSON|TRUCK|y even patter +13988|289|44|1|40|47571.20|0.03|0.08|A|F|1992-08-22|1992-09-15|1992-08-27|NONE|SHIP|slyly final instructions. evenly sile +13988|789|54|2|10|16897.80|0.07|0.06|A|F|1992-08-29|1992-10-30|1992-09-24|DELIVER IN PERSON|FOB|s. even deposits unwind +13988|1726|27|3|28|45576.16|0.01|0.06|A|F|1992-12-01|1992-09-21|1992-12-27|COLLECT COD|AIR|ncies. regular, reg +13989|1731|16|1|14|22858.22|0.03|0.01|N|O|1997-07-26|1997-09-18|1997-07-30|NONE|FOB|nto the the +13989|1492|32|2|49|68281.01|0.06|0.05|N|O|1997-09-26|1997-08-27|1997-10-23|DELIVER IN PERSON|RAIL| warthogs +13989|1629|30|3|33|50510.46|0.04|0.08|N|O|1997-08-13|1997-08-25|1997-08-20|COLLECT COD|REG AIR|tes mold furiously. blithely pending i +13989|1844|88|4|7|12220.88|0.02|0.06|N|O|1997-10-11|1997-08-11|1997-11-08|COLLECT COD|MAIL|eep fluffily amon +13989|1066|67|5|37|35781.22|0.05|0.02|N|O|1997-11-01|1997-08-18|1997-11-12|DELIVER IN PERSON|SHIP|. regular requests hang slyly even f +13990|970|5|1|11|20580.67|0.04|0.01|N|O|1998-05-10|1998-03-10|1998-06-04|TAKE BACK RETURN|AIR|ep blithely. +13990|399|84|2|13|16892.07|0.01|0.01|N|O|1998-05-13|1998-03-16|1998-05-15|TAKE BACK RETURN|FOB|past the furiou +13990|1709|52|3|12|19328.40|0.06|0.02|N|O|1998-03-10|1998-04-18|1998-03-18|TAKE BACK RETURN|REG AIR|inal requests-- carefully +13990|373|58|4|5|6366.85|0.02|0.05|N|O|1998-03-14|1998-04-09|1998-03-30|TAKE BACK RETURN|RAIL|uickly after the regular, unusual +13990|803|37|5|37|63040.60|0.05|0.03|N|O|1998-05-30|1998-03-29|1998-06-20|DELIVER IN PERSON|TRUCK| the slyly final theodolites. blithel +13990|1981|14|6|11|20712.78|0.07|0.03|N|O|1998-05-04|1998-04-05|1998-05-10|NONE|TRUCK|ke carefully sl +13991|1858|2|1|17|29917.45|0.10|0.01|R|F|1992-06-04|1992-04-12|1992-06-26|NONE|SHIP|ests sleep slyly. sheaves sleep above t +13991|1368|83|2|43|54582.48|0.02|0.02|A|F|1992-04-17|1992-04-14|1992-05-12|DELIVER IN PERSON|FOB| beans nag blithely above th +13991|1821|22|3|32|55130.24|0.03|0.05|A|F|1992-03-21|1992-05-08|1992-04-18|TAKE BACK RETURN|SHIP|ironic asymptotes? blithely unusua +13991|886|53|4|43|76835.84|0.00|0.00|R|F|1992-03-18|1992-06-02|1992-03-21|COLLECT COD|FOB|lar packages slee +13991|899|100|5|26|46797.14|0.02|0.01|A|F|1992-03-28|1992-04-25|1992-04-02|DELIVER IN PERSON|SHIP|the ideas. accounts are c +14016|1906|95|1|14|25310.60|0.00|0.00|A|F|1992-09-29|1992-08-12|1992-10-11|TAKE BACK RETURN|AIR|integrate Tiresias. furiously e +14016|1053|24|2|44|41978.20|0.08|0.02|A|F|1992-10-31|1992-08-25|1992-11-16|COLLECT COD|RAIL|ges affix carefully accord +14016|211|93|3|41|45559.61|0.07|0.01|R|F|1992-07-18|1992-09-21|1992-08-05|COLLECT COD|FOB|slyly silent foxes. final accounts na +14016|1313|90|4|48|58286.88|0.03|0.06|A|F|1992-08-27|1992-08-14|1992-09-12|NONE|RAIL|riously even a +14016|1482|61|5|2|2766.96|0.02|0.02|R|F|1992-10-31|1992-09-07|1992-11-11|DELIVER IN PERSON|RAIL| ironic accounts ar +14016|1657|99|6|18|28055.70|0.10|0.08|R|F|1992-09-09|1992-09-20|1992-09-10|DELIVER IN PERSON|TRUCK|deposits. slyly even requ +14016|545|36|7|3|4336.62|0.10|0.00|A|F|1992-08-17|1992-09-30|1992-09-16|NONE|AIR|es. expres +14017|205|87|1|10|11052.00|0.08|0.05|A|F|1994-07-02|1994-05-13|1994-07-12|NONE|TRUCK|uests. special deposits x-ray. rut +14017|1405|6|2|22|28740.80|0.10|0.03|R|F|1994-05-06|1994-04-17|1994-05-18|NONE|RAIL|press foxes wak +14017|786|19|3|31|52290.18|0.05|0.06|R|F|1994-04-21|1994-05-12|1994-05-17|DELIVER IN PERSON|TRUCK|. carefully final d +14017|1094|95|4|37|36818.33|0.06|0.03|R|F|1994-05-12|1994-06-05|1994-05-25|NONE|FOB|tes play slyly after the ironic, +14017|1150|51|5|1|1051.15|0.00|0.08|R|F|1994-05-17|1994-05-29|1994-06-14|DELIVER IN PERSON|REG AIR|ts above the fin +14017|1196|5|6|14|15360.66|0.02|0.06|R|F|1994-06-16|1994-04-29|1994-06-20|TAKE BACK RETURN|FOB|efully carefully bold dependencies. care +14018|330|87|1|11|13533.63|0.00|0.03|R|F|1993-08-05|1993-08-02|1993-08-25|COLLECT COD|AIR| blithely according +14018|1745|72|2|16|26347.84|0.06|0.03|A|F|1993-07-28|1993-08-17|1993-08-03|NONE|FOB|its. blithely pending re +14018|367|96|3|21|26614.56|0.03|0.01|A|F|1993-06-20|1993-07-26|1993-07-18|DELIVER IN PERSON|TRUCK|cross the regular packages hinder pendin +14018|465|24|4|27|36867.42|0.07|0.04|A|F|1993-06-08|1993-08-13|1993-06-25|COLLECT COD|AIR|brave requests. iron +14019|476|64|1|6|8258.82|0.05|0.00|N|O|1997-12-17|1997-10-21|1998-01-12|COLLECT COD|MAIL|hins. fluffily even i +14019|740|5|2|30|49222.20|0.01|0.07|N|O|1997-11-23|1997-11-07|1997-12-07|COLLECT COD|RAIL|nic deposits: special instructi +14019|399|100|3|47|61071.33|0.05|0.04|N|O|1997-11-27|1997-12-05|1997-11-29|NONE|FOB| cajole quickly alongside of the special d +14019|997|32|4|19|36061.81|0.01|0.03|N|O|1997-10-16|1997-12-01|1997-11-13|DELIVER IN PERSON|AIR|s among the fluffily special requests boo +14019|596|97|5|39|58367.01|0.05|0.07|N|O|1997-10-14|1997-11-12|1997-10-30|TAKE BACK RETURN|MAIL|sits wake furiously blithely ironic acc +14020|1973|6|1|24|44999.28|0.00|0.03|N|O|1998-04-02|1998-03-23|1998-04-10|COLLECT COD|TRUCK|unts. packages are carefully about the f +14020|1027|33|2|33|30624.66|0.06|0.01|N|O|1998-04-16|1998-04-16|1998-04-23|NONE|REG AIR|re evenly even, final theodolites. bli +14021|1998|31|1|4|7599.96|0.10|0.00|A|F|1995-04-17|1995-05-13|1995-04-21|DELIVER IN PERSON|FOB|cally slowly +14021|1405|23|2|34|44417.60|0.02|0.00|A|F|1995-04-08|1995-05-11|1995-04-14|COLLECT COD|RAIL|sts haggle slyly. final ideas ca +14021|1519|60|3|20|28410.20|0.10|0.02|R|F|1995-03-12|1995-05-03|1995-03-31|DELIVER IN PERSON|REG AIR|he regular, ironic instructions. furiously +14021|369|26|4|40|50774.40|0.02|0.00|N|O|1995-06-27|1995-06-05|1995-07-01|TAKE BACK RETURN|REG AIR|l instructions out +14021|1965|10|5|27|50407.92|0.10|0.05|A|F|1995-04-04|1995-04-17|1995-04-22|TAKE BACK RETURN|TRUCK|ual foxes. furiously ir +14021|491|92|6|15|20872.35|0.00|0.00|R|F|1995-05-09|1995-04-26|1995-05-18|NONE|RAIL|ly final packages. deposi +14021|68|94|7|12|11616.72|0.01|0.02|A|F|1995-06-03|1995-05-09|1995-06-09|DELIVER IN PERSON|SHIP|ly bold requests are fluffily according to +14022|1108|45|1|4|4036.40|0.05|0.00|R|F|1995-05-16|1995-05-03|1995-06-14|TAKE BACK RETURN|AIR|ully ironic excuses doze quickly. ironic +14022|699|62|2|41|65587.29|0.03|0.06|N|F|1995-06-08|1995-04-01|1995-06-28|TAKE BACK RETURN|REG AIR|es use against the +14023|273|1|1|36|42237.72|0.06|0.08|R|F|1993-05-15|1993-05-04|1993-05-30|TAKE BACK RETURN|RAIL|al accounts are blithely according to the s +14023|1472|12|2|3|4120.41|0.02|0.02|R|F|1993-04-17|1993-05-05|1993-05-07|COLLECT COD|TRUCK|lly express pack +14023|1979|80|3|31|58310.07|0.06|0.07|R|F|1993-04-20|1993-04-13|1993-04-30|TAKE BACK RETURN|RAIL|ress, regular ac +14023|1371|86|4|17|21630.29|0.04|0.05|A|F|1993-02-28|1993-04-10|1993-03-22|DELIVER IN PERSON|SHIP|nic deposits. c +14048|1019|20|1|25|23000.25|0.02|0.07|R|F|1993-08-26|1993-06-27|1993-09-13|NONE|SHIP|; regular instructions print furiously. +14048|385|42|2|7|8997.66|0.01|0.08|A|F|1993-08-25|1993-07-27|1993-09-01|COLLECT COD|TRUCK|telets. regular epitaphs cajole caref +14048|1784|85|3|30|50573.40|0.00|0.00|A|F|1993-06-07|1993-07-29|1993-06-21|COLLECT COD|FOB|s nag quickly. sly dolphins +14048|850|17|4|37|64781.45|0.08|0.06|R|F|1993-07-02|1993-06-24|1993-07-19|COLLECT COD|AIR|ongside of +14048|186|39|5|35|38016.30|0.02|0.08|A|F|1993-09-09|1993-08-01|1993-10-01|TAKE BACK RETURN|AIR|at the pending accounts boost fluffil +14048|678|72|6|2|3157.34|0.10|0.01|A|F|1993-06-13|1993-07-29|1993-07-06|TAKE BACK RETURN|RAIL|he silent packa +14048|605|68|7|21|31617.60|0.06|0.03|A|F|1993-06-04|1993-07-20|1993-06-20|NONE|SHIP|sts among the ironic packages maintain q +14049|314|15|1|39|47358.09|0.00|0.02|N|O|1996-05-14|1996-04-27|1996-05-24|DELIVER IN PERSON|MAIL| haggle according to the slyly da +14049|427|57|2|3|3982.26|0.06|0.00|N|O|1996-02-22|1996-03-22|1996-03-15|COLLECT COD|RAIL| regular asymptotes breach quickly bl +14049|1925|58|3|10|18269.20|0.07|0.07|N|O|1996-05-07|1996-03-31|1996-05-31|TAKE BACK RETURN|AIR|gside of the carefully r +14050|1304|5|1|7|8437.10|0.01|0.02|N|O|1997-10-27|1997-10-17|1997-11-21|COLLECT COD|FOB|egular platelets. regular, ironic request +14050|1305|82|2|14|16888.20|0.08|0.08|N|O|1997-10-19|1997-09-26|1997-10-25|DELIVER IN PERSON|RAIL|inal foxes haggle. even asymptotes haggle +14050|1658|59|3|32|49908.80|0.08|0.04|N|O|1997-09-07|1997-10-19|1997-09-28|COLLECT COD|SHIP|he fluffy packages. pa +14050|1242|54|4|8|9145.92|0.00|0.08|N|O|1997-12-05|1997-11-17|1997-12-14|COLLECT COD|MAIL| regular platelets +14050|126|79|5|47|48227.64|0.07|0.04|N|O|1997-11-09|1997-09-26|1997-11-23|NONE|FOB|even dugouts. fluffily even account +14050|1709|36|6|21|33824.70|0.06|0.01|N|O|1997-09-07|1997-10-06|1997-09-29|TAKE BACK RETURN|TRUCK|ons detect slyly +14051|297|52|1|19|22748.51|0.06|0.04|A|F|1993-10-12|1993-11-25|1993-11-10|TAKE BACK RETURN|FOB|cording to the furiousl +14052|1408|9|1|17|22259.80|0.04|0.08|R|F|1995-04-15|1995-04-17|1995-04-18|NONE|AIR|o the blit +14053|1568|89|1|4|5878.24|0.10|0.08|R|F|1993-03-12|1993-03-22|1993-04-08|NONE|REG AIR|s sleep. even, special th +14053|237|19|2|19|21607.37|0.10|0.02|A|F|1993-04-26|1993-04-29|1993-04-30|NONE|REG AIR|theodolites abov +14054|1395|72|1|46|59633.94|0.06|0.01|N|O|1996-04-10|1996-04-10|1996-04-11|NONE|FOB|slyly pending deposits along +14054|444|45|2|40|53777.60|0.09|0.07|N|O|1996-03-12|1996-02-15|1996-03-31|COLLECT COD|MAIL| carefully even deposits nag stealthily +14054|888|88|3|13|23255.44|0.05|0.05|N|O|1996-04-24|1996-04-03|1996-05-22|NONE|REG AIR|t deposits use fur +14054|1318|95|4|20|24386.20|0.06|0.02|N|O|1996-04-12|1996-04-07|1996-04-30|DELIVER IN PERSON|AIR|ven packages. carefully ironic somas +14054|1208|9|5|17|18856.40|0.08|0.02|N|O|1996-01-26|1996-03-07|1996-02-13|DELIVER IN PERSON|RAIL|ackages. requests are furio +14054|490|91|6|32|44495.68|0.02|0.03|N|O|1996-03-08|1996-02-18|1996-03-19|COLLECT COD|SHIP|ns breach across the special accou +14054|1656|98|7|45|70094.25|0.10|0.07|N|O|1996-01-25|1996-04-03|1996-02-17|NONE|RAIL|regular instructions haggle car +14055|1358|97|1|46|57930.10|0.05|0.06|A|F|1994-12-08|1994-11-22|1994-12-14|COLLECT COD|RAIL|y special deposits use atop +14055|376|5|2|1|1276.37|0.02|0.04|A|F|1994-12-12|1994-11-17|1994-12-17|DELIVER IN PERSON|SHIP|the carefull +14055|1269|81|3|26|30426.76|0.06|0.07|A|F|1994-09-12|1994-11-19|1994-09-20|COLLECT COD|REG AIR| sleep furiously +14080|796|29|1|38|64478.02|0.04|0.01|N|O|1998-08-19|1998-07-11|1998-09-12|DELIVER IN PERSON|MAIL|against the +14081|710|43|1|45|72481.95|0.10|0.06|R|F|1993-10-14|1994-01-04|1993-10-29|TAKE BACK RETURN|REG AIR|ts. pending platele +14081|1217|92|2|41|45846.61|0.08|0.07|A|F|1994-02-02|1993-11-24|1994-02-23|TAKE BACK RETURN|RAIL| bold foxes doubt bold excuses. furious +14082|957|26|1|28|52022.60|0.10|0.03|N|O|1998-06-17|1998-06-10|1998-07-09|NONE|FOB|bold dependencies sleep alongs +14083|566|27|1|8|11732.48|0.00|0.00|A|F|1994-11-12|1994-10-17|1994-12-04|TAKE BACK RETURN|AIR|. express accounts h +14084|1903|36|1|43|77610.70|0.07|0.02|N|O|1995-10-27|1995-10-31|1995-11-07|COLLECT COD|MAIL|ular pinto beans sl +14084|794|27|2|46|77960.34|0.05|0.00|N|O|1995-09-01|1995-09-08|1995-09-14|COLLECT COD|RAIL| foxes cajole blithel +14084|983|18|3|31|58403.38|0.04|0.05|N|O|1995-10-23|1995-10-18|1995-10-29|TAKE BACK RETURN|TRUCK|s. ironic packag +14084|1978|11|4|43|80838.71|0.00|0.08|N|O|1995-08-12|1995-10-09|1995-08-18|COLLECT COD|REG AIR|ut the idly pending id +14084|750|15|5|6|9904.50|0.02|0.02|N|O|1995-08-25|1995-10-12|1995-09-18|TAKE BACK RETURN|SHIP|. theodolites sleep-- packages cajole a +14085|1125|34|1|34|34888.08|0.09|0.03|R|F|1994-03-04|1994-04-17|1994-03-05|DELIVER IN PERSON|TRUCK|ding, final multipliers boo +14085|868|2|2|7|12382.02|0.07|0.01|A|F|1994-03-01|1994-03-11|1994-03-15|COLLECT COD|RAIL|instructions acro +14085|1416|56|3|34|44791.94|0.09|0.03|R|F|1994-05-29|1994-04-03|1994-06-04|DELIVER IN PERSON|SHIP|ke even, bold accounts. quickly +14085|1189|90|4|50|54509.00|0.10|0.02|R|F|1994-05-25|1994-04-11|1994-06-22|TAKE BACK RETURN|MAIL|unts wake carefully pinto +14086|1212|13|1|7|7792.47|0.10|0.01|R|F|1993-12-26|1993-12-11|1994-01-10|NONE|RAIL|use regularly. carefully fina +14086|462|63|2|21|28611.66|0.04|0.04|A|F|1993-12-03|1993-12-03|1993-12-20|COLLECT COD|SHIP|as. slyly bold foxes nag carefully after t +14086|500|88|3|7|9803.50|0.04|0.00|A|F|1993-11-27|1994-01-09|1993-12-01|COLLECT COD|MAIL|aggle. even accounts along the p +14086|1142|15|4|9|9388.26|0.09|0.07|R|F|1993-11-18|1993-12-15|1993-11-30|NONE|REG AIR|gular deposits haggle ag +14087|508|39|1|23|32395.50|0.00|0.06|N|O|1997-04-18|1997-04-06|1997-04-23|TAKE BACK RETURN|REG AIR|ly ironic pin +14087|1288|63|2|35|41624.80|0.02|0.07|N|O|1997-05-17|1997-03-28|1997-06-04|TAKE BACK RETURN|AIR|fix across the final packages. fl +14087|37|13|3|50|46851.50|0.08|0.00|N|O|1997-06-02|1997-05-11|1997-06-08|NONE|TRUCK| express package +14087|67|18|4|37|35781.22|0.06|0.02|N|O|1997-04-29|1997-03-25|1997-05-04|COLLECT COD|REG AIR|ress courts poach quickly against +14087|1854|98|5|30|52675.50|0.01|0.02|N|O|1997-05-14|1997-03-16|1997-06-05|NONE|AIR|arefully about the silent dolphins +14112|511|42|1|15|21172.65|0.03|0.01|R|F|1994-09-13|1994-10-14|1994-09-20|NONE|REG AIR|he accounts. pinto beans boost furious +14113|1649|50|1|4|6202.56|0.02|0.03|N|O|1995-09-09|1995-10-21|1995-09-17|TAKE BACK RETURN|RAIL|ntegrate after +14113|63|14|2|21|20224.26|0.00|0.03|N|O|1995-10-28|1995-10-19|1995-11-10|COLLECT COD|TRUCK|fully fluffy foxes. dependencies +14114|1286|87|1|31|36805.68|0.09|0.05|A|F|1994-05-19|1994-05-22|1994-06-17|NONE|AIR|ross the blithely express +14114|1430|48|2|35|46600.05|0.01|0.06|R|F|1994-06-02|1994-06-04|1994-06-24|TAKE BACK RETURN|AIR|the always even +14114|484|85|3|17|23536.16|0.05|0.04|R|F|1994-05-27|1994-05-19|1994-06-14|DELIVER IN PERSON|RAIL| beans around the even accou +14114|11|62|4|15|13665.15|0.03|0.03|R|F|1994-05-13|1994-05-21|1994-05-24|DELIVER IN PERSON|MAIL|tes detect fluffil +14114|588|19|5|9|13397.22|0.08|0.02|A|F|1994-07-26|1994-05-21|1994-08-17|TAKE BACK RETURN|REG AIR|ggle. regular, even instructio +14114|107|34|6|40|40284.00|0.09|0.03|A|F|1994-05-12|1994-06-12|1994-06-02|TAKE BACK RETURN|MAIL|sly pending packages. even d +14115|71|72|1|31|30103.17|0.08|0.06|A|F|1994-09-05|1994-10-07|1994-09-24|TAKE BACK RETURN|RAIL|even deposits. instructio +14115|404|5|2|30|39132.00|0.00|0.00|A|F|1994-11-05|1994-11-03|1994-11-27|NONE|FOB|aggle quickly at the f +14116|240|41|1|9|10262.16|0.04|0.01|N|O|1995-10-12|1995-12-15|1995-10-22|DELIVER IN PERSON|RAIL|ole besides +14116|293|21|2|7|8353.03|0.04|0.06|N|O|1995-11-09|1995-12-01|1995-12-01|TAKE BACK RETURN|AIR|s unwind carefully blithely spe +14116|988|91|3|30|56669.40|0.05|0.06|N|O|1995-12-17|1995-11-21|1995-12-28|DELIVER IN PERSON|MAIL|aggle. carefully pending Tiresias +14116|1099|5|4|36|36003.24|0.00|0.07|N|O|1995-12-25|1995-12-21|1996-01-19|DELIVER IN PERSON|REG AIR| accounts. furiously even dolphins are +14116|1030|1|5|39|36310.17|0.09|0.03|N|O|1995-12-27|1995-12-07|1996-01-10|TAKE BACK RETURN|RAIL| print quickly. sl +14116|106|33|6|41|41250.10|0.00|0.07|N|O|1995-12-06|1995-11-29|1995-12-16|DELIVER IN PERSON|RAIL| slyly unusual p +14117|1639|40|1|23|35434.49|0.03|0.06|A|F|1993-10-14|1993-10-31|1993-10-25|DELIVER IN PERSON|AIR|sly regular courts. ca +14117|177|30|2|43|46318.31|0.09|0.04|R|F|1993-12-03|1993-10-29|1994-01-01|NONE|SHIP|ts. platelets nag clos +14117|106|59|3|47|47286.70|0.03|0.02|R|F|1993-11-04|1993-10-12|1993-11-05|COLLECT COD|FOB|furiously bold platelets use. furiousl +14117|1365|66|4|48|60785.28|0.06|0.07|A|F|1993-10-09|1993-11-07|1993-10-26|TAKE BACK RETURN|MAIL|hely final d +14117|1196|97|5|32|35110.08|0.04|0.04|A|F|1993-10-29|1993-09-27|1993-11-09|DELIVER IN PERSON|RAIL|wake quickly ironic foxes. slyly sil +14117|1899|100|6|5|9004.45|0.05|0.05|A|F|1993-09-08|1993-10-08|1993-09-28|NONE|FOB|oxes detect furiously. excuses +14117|1414|15|7|39|51300.99|0.05|0.02|R|F|1993-11-02|1993-10-22|1993-11-07|NONE|MAIL|r, stealthy accounts use after the +14118|323|52|1|37|45262.84|0.10|0.01|A|F|1993-07-02|1993-08-16|1993-07-25|DELIVER IN PERSON|SHIP|y careful accounts are +14119|1188|97|1|42|45745.56|0.04|0.01|A|F|1993-07-15|1993-07-28|1993-08-11|NONE|RAIL|ial accounts. blithely even excuses x-ray q +14119|763|96|2|30|49912.80|0.06|0.00|A|F|1993-07-12|1993-07-26|1993-07-19|TAKE BACK RETURN|FOB|furiously pending theodolites. +14119|842|43|3|6|10457.04|0.01|0.04|R|F|1993-07-21|1993-07-27|1993-07-23|TAKE BACK RETURN|AIR|e carefull +14119|1418|97|4|26|34304.66|0.03|0.02|A|F|1993-08-01|1993-07-16|1993-08-16|NONE|MAIL|never express dependencies; quickly bo +14119|1209|21|5|10|11102.00|0.05|0.05|A|F|1993-08-12|1993-08-06|1993-09-08|TAKE BACK RETURN|FOB|sly even pinto beans. carefully pendi +14119|209|91|6|48|53241.60|0.02|0.08|A|F|1993-07-31|1993-07-13|1993-08-21|COLLECT COD|MAIL|y unusual, bo +14144|827|28|1|29|50106.78|0.03|0.05|N|O|1997-08-18|1997-06-28|1997-08-21|DELIVER IN PERSON|SHIP|ed asymptotes cajole fluffil +14144|1842|43|2|48|83704.32|0.04|0.06|N|O|1997-07-13|1997-07-06|1997-07-19|DELIVER IN PERSON|SHIP| the final dependencies. carefully r +14144|1314|53|3|31|37674.61|0.05|0.06|N|O|1997-07-25|1997-07-12|1997-08-16|TAKE BACK RETURN|AIR|carefully ironic dependencies. bl +14144|793|58|4|22|37263.38|0.07|0.05|N|O|1997-08-20|1997-07-16|1997-09-11|DELIVER IN PERSON|REG AIR|y across the even +14144|1929|62|5|8|14647.36|0.05|0.01|N|O|1997-05-29|1997-07-22|1997-06-22|NONE|MAIL|ges wake furiou +14144|843|10|6|46|80216.64|0.00|0.04|N|O|1997-05-24|1997-07-18|1997-05-27|NONE|SHIP|lent request +14145|1388|27|1|45|58022.10|0.02|0.05|N|O|1997-06-13|1997-06-19|1997-06-20|DELIVER IN PERSON|TRUCK|ely final accounts haggle slyly. +14145|156|57|2|43|45414.45|0.02|0.06|N|O|1997-04-25|1997-06-09|1997-04-28|NONE|MAIL|ctions. final, regular requ +14145|1037|43|3|6|5628.18|0.02|0.08|N|O|1997-06-27|1997-07-07|1997-07-11|COLLECT COD|FOB|to are carefully +14145|795|28|4|40|67831.60|0.08|0.05|N|O|1997-07-26|1997-07-09|1997-08-22|COLLECT COD|MAIL|l accounts wake fluffily s +14145|1464|4|5|27|36867.42|0.10|0.00|N|O|1997-05-06|1997-06-30|1997-05-12|TAKE BACK RETURN|RAIL|ly carefully regular foxes +14145|1308|47|6|48|58046.40|0.00|0.02|N|O|1997-05-10|1997-07-09|1997-06-01|NONE|RAIL|ole blithely? ruth +14146|1725|52|1|25|40668.00|0.08|0.06|N|O|1996-01-25|1996-03-17|1996-02-05|TAKE BACK RETURN|FOB| across the final courts. fur +14146|1271|72|2|14|16411.78|0.01|0.03|N|O|1996-04-20|1996-03-31|1996-05-13|NONE|SHIP|aggle blithely ar +14146|1989|90|3|20|37819.60|0.08|0.01|N|O|1996-01-14|1996-02-15|1996-01-29|TAKE BACK RETURN|REG AIR| packages try to hang furiously unusual a +14146|1600|21|4|8|12012.80|0.03|0.05|N|O|1996-03-04|1996-02-04|1996-03-05|TAKE BACK RETURN|REG AIR|lar hockey +14146|152|31|5|4|4208.60|0.02|0.08|N|O|1996-04-11|1996-03-04|1996-04-19|NONE|TRUCK|usy, pending pac +14147|430|18|1|4|5321.72|0.08|0.01|A|F|1993-05-20|1993-05-15|1993-05-27|TAKE BACK RETURN|SHIP|s after the ironic +14147|1607|31|2|12|18103.20|0.05|0.01|A|F|1993-07-01|1993-04-30|1993-07-29|COLLECT COD|SHIP| accounts. final ideas haggle care +14147|1934|67|3|38|69765.34|0.05|0.03|R|F|1993-06-30|1993-05-09|1993-07-30|COLLECT COD|AIR|uctions. ideas unwind! ironic +14147|1672|73|4|47|73962.49|0.07|0.06|R|F|1993-07-02|1993-05-24|1993-07-21|DELIVER IN PERSON|FOB|st the blithel +14147|868|35|5|31|54834.66|0.07|0.08|R|F|1993-03-26|1993-05-27|1993-04-16|TAKE BACK RETURN|FOB|usly even requests. carefully +14147|1436|37|6|17|22736.31|0.06|0.05|R|F|1993-07-07|1993-06-06|1993-07-28|DELIVER IN PERSON|MAIL|eep around the pending pack +14147|1799|42|7|12|20409.48|0.00|0.03|A|F|1993-06-03|1993-05-15|1993-06-25|TAKE BACK RETURN|SHIP| asymptotes along the ironic, regular +14148|1084|20|1|12|11820.96|0.02|0.08|N|O|1998-07-29|1998-06-26|1998-08-09|COLLECT COD|FOB| use fluffily a +14148|1547|28|2|50|72427.00|0.07|0.00|N|O|1998-05-25|1998-06-10|1998-06-07|COLLECT COD|FOB|mptotes cajole among the sl +14148|848|48|3|14|24483.76|0.02|0.07|N|O|1998-08-10|1998-05-30|1998-08-17|DELIVER IN PERSON|FOB|ix. quickly final notornis mol +14148|397|26|4|21|27245.19|0.10|0.03|N|O|1998-05-27|1998-06-24|1998-06-03|NONE|MAIL|uffy, even deposits. blithely ironic pl +14149|569|60|1|5|7347.80|0.04|0.08|N|O|1998-02-17|1998-03-23|1998-03-03|DELIVER IN PERSON|RAIL|luffily ironic dependencies boos +14149|1096|97|2|4|3988.36|0.01|0.08|N|O|1998-05-09|1998-03-18|1998-05-21|NONE|AIR|edly regular asympto +14149|1394|71|3|15|19430.85|0.00|0.04|N|O|1998-05-06|1998-03-05|1998-05-24|TAKE BACK RETURN|REG AIR|iously bold courts! blithely final inst +14149|1485|3|4|10|13864.80|0.05|0.08|N|O|1998-05-04|1998-03-28|1998-05-22|DELIVER IN PERSON|SHIP|ress platelets; slyl +14149|441|100|5|12|16097.28|0.02|0.02|N|O|1998-02-03|1998-04-12|1998-02-22|COLLECT COD|SHIP|nic requests. ca +14149|986|55|6|24|45287.52|0.06|0.08|N|O|1998-03-25|1998-03-16|1998-04-12|NONE|RAIL|onic deposits aft +14149|1528|49|7|35|50033.20|0.08|0.06|N|O|1998-03-27|1998-03-19|1998-04-18|NONE|FOB|instructions +14150|1031|67|1|3|2796.09|0.09|0.03|A|F|1994-03-07|1994-04-27|1994-03-29|TAKE BACK RETURN|AIR|l pinto be +14150|790|87|2|38|64250.02|0.02|0.07|R|F|1994-02-12|1994-05-09|1994-03-03|DELIVER IN PERSON|MAIL|ronic packages integrate enticing +14150|1959|60|3|33|61411.35|0.01|0.04|A|F|1994-02-17|1994-04-16|1994-03-05|TAKE BACK RETURN|SHIP| deposits haggl +14150|1768|95|4|37|61781.12|0.02|0.04|R|F|1994-03-20|1994-04-09|1994-04-01|COLLECT COD|FOB|s. slyly pending pinto be +14151|750|47|1|37|61077.75|0.10|0.04|N|O|1997-08-19|1997-08-07|1997-08-25|TAKE BACK RETURN|RAIL|gular packages are carefully. pendi +14151|21|22|2|36|33156.72|0.01|0.04|N|O|1997-09-30|1997-08-26|1997-10-03|TAKE BACK RETURN|TRUCK|he quickly +14151|1686|69|3|39|61919.52|0.01|0.01|N|O|1997-09-30|1997-07-23|1997-10-29|TAKE BACK RETURN|FOB|about the silently sp +14151|350|79|4|9|11253.15|0.09|0.00|N|O|1997-09-12|1997-07-21|1997-09-20|NONE|FOB| quickly unusual asymptotes haggle +14151|1677|78|5|32|50517.44|0.08|0.04|N|O|1997-08-03|1997-08-18|1997-08-30|COLLECT COD|MAIL| among the quickly spec +14151|1735|78|6|40|65469.20|0.09|0.00|N|O|1997-07-03|1997-08-22|1997-07-12|COLLECT COD|SHIP|d ideas wake carefully ironic idea +14151|66|67|7|16|15456.96|0.00|0.01|N|O|1997-10-04|1997-09-01|1997-10-20|TAKE BACK RETURN|MAIL|uld use quickly bold +14176|75|26|1|22|21451.54|0.04|0.06|R|F|1994-06-14|1994-04-12|1994-06-20|DELIVER IN PERSON|TRUCK|carefully final accounts cajole even, +14176|678|72|2|33|52096.11|0.09|0.07|A|F|1994-06-28|1994-05-04|1994-07-20|COLLECT COD|SHIP|egular theodolites +14176|722|87|3|24|38945.28|0.00|0.02|A|F|1994-05-15|1994-05-10|1994-05-29|TAKE BACK RETURN|AIR|gular theodolites wake-- furio +14176|445|4|4|20|26908.80|0.01|0.08|A|F|1994-06-11|1994-05-05|1994-06-23|COLLECT COD|SHIP|cording to the +14177|490|49|1|23|31981.27|0.03|0.07|R|F|1992-04-09|1992-06-03|1992-04-17|NONE|SHIP|wake furiously blithely final acco +14177|1309|10|2|16|19364.80|0.04|0.07|A|F|1992-04-29|1992-07-01|1992-05-29|TAKE BACK RETURN|TRUCK|ully. ideas sleep a +14177|1867|68|3|34|60141.24|0.02|0.01|A|F|1992-07-10|1992-06-24|1992-08-04|NONE|SHIP|sublate care +14178|1312|27|1|9|10919.79|0.02|0.05|R|F|1995-04-10|1995-03-21|1995-04-21|NONE|RAIL|s past the furio +14179|1765|8|1|41|68337.16|0.02|0.07|N|O|1997-11-29|1997-11-07|1997-11-30|DELIVER IN PERSON|SHIP|osits instead of the slyly regular pin +14179|968|37|2|30|56068.80|0.00|0.08|N|O|1997-11-19|1997-12-02|1997-11-20|NONE|TRUCK|y unusual excuses abou +14179|853|53|3|43|75415.55|0.00|0.05|N|O|1997-09-23|1997-10-10|1997-10-15|TAKE BACK RETURN|REG AIR|into beans are blithely regular requ +14179|797|62|4|40|67911.60|0.01|0.05|N|O|1997-11-15|1997-10-20|1997-12-15|NONE|RAIL|carefully final +14179|1091|97|5|46|45636.14|0.00|0.03|N|O|1997-10-15|1997-10-13|1997-10-29|TAKE BACK RETURN|TRUCK|requests wake +14179|255|56|6|46|53141.50|0.00|0.04|N|O|1997-10-04|1997-10-08|1997-10-25|DELIVER IN PERSON|TRUCK|sts boost furiously. quic +14180|567|98|1|24|35221.44|0.00|0.05|N|O|1997-09-08|1997-07-19|1997-09-23|NONE|TRUCK|t the unusual deposits. bold, pen +14180|1616|99|2|46|69810.06|0.09|0.01|N|O|1997-07-07|1997-06-28|1997-07-26|COLLECT COD|AIR|sts unwind fluffily +14180|856|23|3|32|56219.20|0.08|0.02|N|O|1997-06-13|1997-07-28|1997-07-10|TAKE BACK RETURN|AIR|sits lose slyly +14180|340|69|4|21|26047.14|0.00|0.00|N|O|1997-08-03|1997-06-27|1997-09-01|NONE|MAIL|ts use carefully across the quickly iron +14180|967|36|5|4|7471.84|0.05|0.04|N|O|1997-07-09|1997-08-20|1997-08-02|NONE|FOB|ccording to the quietly final ideas. re +14181|896|30|1|18|32344.02|0.06|0.03|N|O|1998-06-13|1998-03-15|1998-06-21|DELIVER IN PERSON|RAIL|l tithes are. carefully +14181|839|6|2|26|45235.58|0.07|0.08|N|O|1998-03-14|1998-03-15|1998-03-29|NONE|MAIL|furiously final depths. unusual foxes wake +14181|23|99|3|34|31382.68|0.05|0.08|N|O|1998-03-20|1998-03-21|1998-04-19|DELIVER IN PERSON|RAIL|yly pending deposits. final theo +14181|513|44|4|18|25443.18|0.00|0.07|N|O|1998-03-06|1998-03-22|1998-03-07|DELIVER IN PERSON|REG AIR|le slyly final, special pla +14181|77|28|5|3|2931.21|0.00|0.01|N|O|1998-05-04|1998-04-08|1998-05-20|DELIVER IN PERSON|AIR|ly regular ideas cajole fluffi +14181|465|95|6|37|50522.02|0.06|0.08|N|O|1998-05-19|1998-03-16|1998-06-08|DELIVER IN PERSON|MAIL|requests sleep carefully against the furi +14181|450|51|7|29|39163.05|0.07|0.00|N|O|1998-04-01|1998-05-11|1998-04-12|NONE|MAIL|t courts. carefully +14182|1867|11|1|37|65447.82|0.09|0.05|A|F|1994-09-05|1994-07-30|1994-09-23|COLLECT COD|SHIP|quests. ironic, express pe +14182|1185|94|2|5|5430.90|0.02|0.08|R|F|1994-10-21|1994-09-12|1994-10-26|TAKE BACK RETURN|TRUCK|lets are. pending, final packages use. care +14183|1846|47|1|4|6991.36|0.09|0.01|N|O|1997-05-02|1997-05-18|1997-05-10|COLLECT COD|TRUCK|ffily pending instructions haggle bl +14183|1734|77|2|50|81786.50|0.04|0.01|N|O|1997-03-18|1997-06-03|1997-03-21|COLLECT COD|FOB|luffily silent depos +14208|984|19|1|33|62204.34|0.04|0.08|N|O|1995-08-26|1995-07-23|1995-09-10|DELIVER IN PERSON|MAIL| blithely unusual accounts boost car +14208|270|71|2|27|31597.29|0.06|0.04|N|O|1995-07-14|1995-06-06|1995-07-28|COLLECT COD|FOB| alongside o +14208|1023|94|3|28|25872.56|0.04|0.04|N|O|1995-06-29|1995-06-17|1995-07-17|DELIVER IN PERSON|FOB|ar ideas. furiously unusual forges use flu +14209|1909|54|1|26|47083.40|0.06|0.03|N|O|1996-12-16|1997-01-30|1996-12-30|TAKE BACK RETURN|RAIL| ironic deposits. ironic +14209|637|38|2|7|10763.41|0.09|0.04|N|O|1996-11-23|1996-12-24|1996-12-21|COLLECT COD|REG AIR|rding to the bold, silent patterns. blith +14209|590|91|3|35|52170.65|0.07|0.04|N|O|1997-01-22|1997-01-08|1997-02-19|NONE|MAIL|hely above the bold accounts? sly +14209|683|84|4|7|11085.76|0.06|0.07|N|O|1997-01-29|1997-01-11|1997-02-16|DELIVER IN PERSON|RAIL|y regular theodolites aff +14209|1295|33|5|17|20336.93|0.04|0.03|N|O|1996-12-23|1996-12-16|1996-12-29|DELIVER IN PERSON|RAIL|e slyly quick accounts; carefully unusual +14210|609|72|1|15|22644.00|0.00|0.04|A|F|1992-09-13|1992-08-17|1992-10-12|COLLECT COD|MAIL| even depo +14211|472|60|1|11|15097.17|0.00|0.08|R|F|1994-02-28|1994-04-21|1994-03-05|TAKE BACK RETURN|REG AIR|ges nag ruthlessly ironic foxes. pinto bean +14211|1126|27|2|14|14379.68|0.00|0.01|R|F|1994-03-07|1994-04-17|1994-03-13|NONE|SHIP|cross the furiously regular accounts. fl +14211|747|80|3|29|47784.46|0.08|0.02|A|F|1994-03-14|1994-05-08|1994-04-01|DELIVER IN PERSON|REG AIR|ar deposits besides the +14211|722|23|4|35|56795.20|0.06|0.04|R|F|1994-05-01|1994-03-15|1994-05-09|COLLECT COD|MAIL|sits integrate furiously quickly silent exc +14211|1922|11|5|3|5471.76|0.05|0.03|A|F|1994-03-26|1994-05-07|1994-04-03|DELIVER IN PERSON|AIR|lar excuses boost. slyly pen +14211|1375|14|6|41|52331.17|0.00|0.01|R|F|1994-05-28|1994-04-16|1994-05-31|NONE|REG AIR|ctions cajole furious +14212|1746|73|1|44|72500.56|0.08|0.01|A|F|1992-04-24|1992-04-18|1992-05-19|COLLECT COD|MAIL|carefully express r +14212|760|61|2|45|74734.20|0.04|0.07|R|F|1992-03-07|1992-04-28|1992-04-06|COLLECT COD|RAIL|r, special foxes cajole furious +14212|1687|70|3|20|31773.60|0.09|0.03|R|F|1992-02-28|1992-04-14|1992-03-13|COLLECT COD|TRUCK|. dependencies accord +14212|656|19|4|15|23349.75|0.09|0.06|R|F|1992-04-11|1992-03-26|1992-04-20|DELIVER IN PERSON|AIR|ilent platelets abo +14213|189|42|1|45|49013.10|0.01|0.05|R|F|1994-01-05|1994-03-18|1994-01-24|TAKE BACK RETURN|TRUCK|ironic requests are excuses. +14214|1995|28|1|26|49321.74|0.00|0.05|N|O|1997-09-17|1997-10-12|1997-10-15|TAKE BACK RETURN|MAIL|lyly final accounts cajole slyly abov +14214|1076|82|2|3|2931.21|0.09|0.06|N|O|1997-12-08|1997-09-23|1998-01-03|TAKE BACK RETURN|SHIP|ent dependencies. instructions haggle b +14214|1227|65|3|29|32718.38|0.07|0.06|N|O|1997-11-23|1997-10-10|1997-12-06|NONE|TRUCK|pecial sheaves haggle slyly about t +14214|1295|70|4|36|43066.44|0.09|0.07|N|O|1997-09-24|1997-09-20|1997-10-23|TAKE BACK RETURN|TRUCK|cuses. pending, fin +14215|1833|77|1|4|6939.32|0.07|0.05|A|F|1992-09-10|1992-09-26|1992-10-09|DELIVER IN PERSON|SHIP|unts breach quickly +14215|1249|24|2|11|12652.64|0.04|0.08|R|F|1992-08-09|1992-10-02|1992-08-22|TAKE BACK RETURN|TRUCK|y daring pinto +14215|35|11|3|35|32726.05|0.09|0.03|R|F|1992-07-18|1992-08-16|1992-08-08|NONE|RAIL|ously regular courts hang. c +14240|1113|86|1|47|47663.17|0.06|0.00|R|F|1992-06-06|1992-04-08|1992-07-04|COLLECT COD|AIR|eep carefully along the ironic, eve +14240|1115|24|2|26|26418.86|0.00|0.02|R|F|1992-05-08|1992-04-19|1992-06-05|TAKE BACK RETURN|REG AIR|ely slyly regular dependencies: even reque +14240|1371|10|3|14|17813.18|0.06|0.02|A|F|1992-05-24|1992-04-04|1992-06-07|DELIVER IN PERSON|TRUCK|y. thinly special accounts around the dep +14240|1332|71|4|35|43166.55|0.03|0.02|A|F|1992-05-08|1992-05-15|1992-06-07|COLLECT COD|FOB|lites dazzle by the quickly silent account +14240|1121|94|5|9|9199.08|0.05|0.01|A|F|1992-06-04|1992-03-21|1992-06-11|TAKE BACK RETURN|MAIL|express pi +14240|865|32|6|14|24722.04|0.09|0.04|R|F|1992-04-29|1992-04-21|1992-05-03|COLLECT COD|RAIL|ording to the carefu +14240|1879|66|7|26|46302.62|0.00|0.00|R|F|1992-05-10|1992-04-15|1992-05-23|DELIVER IN PERSON|FOB|gular, ironic pinto beans n +14241|1564|85|1|44|64484.64|0.05|0.08|A|F|1992-10-03|1992-09-12|1992-10-04|COLLECT COD|SHIP|ly bold foxes wake. ir +14241|878|45|2|47|83606.89|0.00|0.04|A|F|1992-09-04|1992-09-02|1992-09-22|DELIVER IN PERSON|RAIL|ed excuses above the carefully ironic +14242|445|4|1|17|22872.48|0.03|0.04|N|F|1995-06-17|1995-06-09|1995-06-25|DELIVER IN PERSON|AIR|posits. quickly even instructions are +14242|576|67|2|7|10335.99|0.04|0.05|R|F|1995-05-13|1995-07-04|1995-05-18|DELIVER IN PERSON|FOB|eans according to the slyly +14242|884|84|3|10|17848.80|0.02|0.07|N|O|1995-08-21|1995-07-29|1995-09-15|DELIVER IN PERSON|RAIL|e blithely over the blithely pen +14242|1742|85|4|34|55887.16|0.08|0.08|N|O|1995-08-22|1995-07-23|1995-09-12|DELIVER IN PERSON|MAIL|te at the sil +14242|1372|11|5|6|7640.22|0.09|0.08|N|O|1995-07-13|1995-06-29|1995-07-17|NONE|SHIP|eposits. fluffily express deposits inte +14243|1878|65|1|33|58735.71|0.04|0.05|N|O|1997-03-24|1997-05-04|1997-03-30|TAKE BACK RETURN|REG AIR| silently. warthogs about the package +14243|1674|98|2|3|4727.01|0.09|0.06|N|O|1997-02-28|1997-05-12|1997-03-14|COLLECT COD|RAIL|counts wake quickly against the +14244|773|38|1|14|23432.78|0.00|0.02|N|O|1998-03-25|1998-04-23|1998-03-27|NONE|MAIL|onic packages integrate fluffily +14244|59|85|2|3|2877.15|0.08|0.08|N|O|1998-05-19|1998-05-29|1998-06-06|COLLECT COD|RAIL|wake slyly ironic accounts. express +14244|1064|70|3|27|26056.62|0.01|0.02|N|O|1998-05-19|1998-04-05|1998-06-04|COLLECT COD|FOB| warthogs nag blithely ironic reque +14245|1419|37|1|3|3961.23|0.00|0.02|A|F|1993-03-11|1993-04-14|1993-04-03|DELIVER IN PERSON|FOB|endencies sleep carefu +14245|415|3|2|35|46039.35|0.09|0.07|R|F|1993-03-06|1993-04-13|1993-04-03|NONE|RAIL|d requests eat. quickl +14245|1345|46|3|21|26173.14|0.06|0.01|A|F|1993-04-15|1993-04-11|1993-04-16|COLLECT COD|RAIL|nal, unusual ideas wake carefully. spe +14246|625|26|1|34|51871.08|0.03|0.07|N|O|1997-12-30|1998-01-02|1998-01-25|DELIVER IN PERSON|AIR|counts above the e +14246|407|95|2|20|26148.00|0.00|0.04|N|O|1998-01-07|1997-12-23|1998-01-26|COLLECT COD|AIR| nag. blithely pendi +14246|57|8|3|37|35410.85|0.09|0.00|N|O|1997-11-16|1997-11-15|1997-12-14|NONE|REG AIR|affix among the carefully regul +14246|1043|49|4|19|17936.76|0.08|0.04|N|O|1997-12-01|1997-11-21|1997-12-31|COLLECT COD|MAIL|sual deposits among the final +14246|477|7|5|2|2754.94|0.01|0.05|N|O|1997-10-21|1997-11-12|1997-10-23|COLLECT COD|FOB|cuses. special requests caj +14247|1571|72|1|19|27978.83|0.00|0.03|N|O|1995-11-24|1995-11-13|1995-12-19|COLLECT COD|TRUCK|d excuses caj +14247|1037|73|2|21|19698.63|0.06|0.00|N|O|1995-09-27|1995-10-13|1995-10-14|DELIVER IN PERSON|MAIL|t carefully. furiously ironic mu +14247|1348|49|3|21|26236.14|0.04|0.01|N|O|1995-11-06|1995-09-17|1995-11-21|COLLECT COD|MAIL|ross the slyly regular accounts! furiously +14247|802|36|4|33|56192.40|0.02|0.00|N|O|1995-08-18|1995-09-28|1995-09-02|DELIVER IN PERSON|TRUCK|onic court +14247|669|63|5|38|59647.08|0.02|0.00|N|O|1995-12-12|1995-11-14|1995-12-19|TAKE BACK RETURN|SHIP|eas are quick +14247|440|41|6|6|8042.64|0.03|0.00|N|O|1995-11-24|1995-10-29|1995-12-05|DELIVER IN PERSON|RAIL|kages. carefully even pinto bean +14247|975|76|7|13|24387.61|0.02|0.06|N|O|1995-12-06|1995-11-11|1996-01-02|DELIVER IN PERSON|MAIL|s believe slyly! ironic i +14272|614|77|1|28|42409.08|0.08|0.08|A|F|1992-03-02|1992-04-21|1992-03-20|TAKE BACK RETURN|TRUCK|iously unusu +14272|1216|54|2|11|12289.31|0.09|0.07|A|F|1992-05-22|1992-05-08|1992-06-06|COLLECT COD|FOB| carefully among the ironic +14272|670|71|3|30|47120.10|0.09|0.02|R|F|1992-02-17|1992-04-01|1992-03-04|TAKE BACK RETURN|AIR|are along the slyly bold as +14273|594|55|1|21|31386.39|0.00|0.03|N|O|1996-03-26|1996-05-28|1996-04-12|NONE|RAIL|al accounts. carefully regular pint +14273|1507|88|2|39|54931.50|0.00|0.06|N|O|1996-06-01|1996-06-03|1996-06-16|DELIVER IN PERSON|RAIL|even, final accounts. furiously +14274|1140|41|1|44|45810.16|0.03|0.00|A|F|1994-05-05|1994-03-12|1994-06-03|NONE|TRUCK| regular decoys wake fluffily. theodoli +14274|1501|42|2|34|47685.00|0.09|0.04|R|F|1994-04-12|1994-03-22|1994-04-30|TAKE BACK RETURN|TRUCK|tes. ironic, final package +14274|1134|71|3|13|13456.69|0.03|0.03|R|F|1994-02-06|1994-04-04|1994-02-15|COLLECT COD|RAIL|o beans are above the package +14274|854|55|4|49|85987.65|0.10|0.03|A|F|1994-03-08|1994-03-05|1994-03-09|NONE|MAIL|haggle carefully abo +14274|944|13|5|4|7379.76|0.07|0.07|A|F|1994-03-06|1994-03-25|1994-03-11|COLLECT COD|TRUCK|nding patterns shall engage furiously final +14274|176|77|6|48|51656.16|0.01|0.07|R|F|1994-04-22|1994-02-27|1994-04-24|DELIVER IN PERSON|REG AIR|packages. accounts haggle fluffily after +14275|122|75|1|19|19420.28|0.01|0.07|R|F|1993-10-12|1993-08-13|1993-10-30|TAKE BACK RETURN|RAIL| deposits. frets sleep fluffily after th +14275|342|27|2|31|38512.54|0.01|0.05|A|F|1993-07-26|1993-08-07|1993-08-09|TAKE BACK RETURN|REG AIR|the special packa +14275|1598|79|3|1|1499.59|0.03|0.04|A|F|1993-08-31|1993-09-01|1993-09-19|COLLECT COD|REG AIR|thely silent accounts. realms hagg +14275|694|88|4|6|9568.14|0.04|0.08|R|F|1993-07-01|1993-07-30|1993-07-23|TAKE BACK RETURN|MAIL|ckly silent multipliers a +14275|1742|43|5|23|37806.02|0.08|0.08|R|F|1993-07-09|1993-09-12|1993-08-06|DELIVER IN PERSON|REG AIR|across the blithely re +14275|1253|65|6|41|47324.25|0.09|0.07|R|F|1993-09-15|1993-07-26|1993-10-01|DELIVER IN PERSON|REG AIR|ions. special, final accounts wake +14275|1364|65|7|11|13918.96|0.05|0.00|A|F|1993-07-18|1993-08-24|1993-08-15|COLLECT COD|RAIL|ic, even packages wake blithely. fin +14276|871|72|1|49|86821.63|0.09|0.01|R|F|1994-08-20|1994-08-24|1994-08-30|DELIVER IN PERSON|AIR| special accounts. blithely sly +14276|577|38|2|25|36939.25|0.06|0.01|R|F|1994-09-01|1994-08-13|1994-09-24|DELIVER IN PERSON|REG AIR| cajole slyly furiously ironic +14276|252|34|3|32|36872.00|0.01|0.05|R|F|1994-10-11|1994-07-28|1994-10-25|NONE|TRUCK|ests. silentl +14276|1245|83|4|15|17193.60|0.10|0.00|A|F|1994-09-21|1994-09-16|1994-10-18|NONE|MAIL|haggle quickly regular deposits. car +14276|977|80|5|40|75118.80|0.10|0.07|R|F|1994-09-30|1994-08-25|1994-10-14|COLLECT COD|FOB| final theodolites +14277|186|39|1|35|38016.30|0.03|0.07|N|O|1998-04-24|1998-05-07|1998-04-29|NONE|MAIL|ges. carefully regular courts sleep agai +14277|1057|58|2|3|2874.15|0.05|0.05|N|O|1998-05-14|1998-04-30|1998-06-04|TAKE BACK RETURN|REG AIR|cajole slyly +14277|292|20|3|41|48883.89|0.05|0.06|N|O|1998-05-12|1998-05-04|1998-05-23|NONE|REG AIR| pending requ +14277|853|54|4|16|28061.60|0.10|0.00|N|O|1998-03-16|1998-04-11|1998-04-03|NONE|FOB| furiously bold accounts boost along t +14278|1395|34|1|30|38891.70|0.03|0.03|N|O|1998-06-14|1998-08-01|1998-06-28|COLLECT COD|MAIL|ic, special deposits. carefully regula +14278|1628|11|2|46|70362.52|0.04|0.06|N|O|1998-07-30|1998-07-04|1998-08-17|COLLECT COD|FOB|en theodolites sleep furiously after th +14278|356|13|3|23|28896.05|0.05|0.03|N|O|1998-09-10|1998-08-24|1998-10-04|DELIVER IN PERSON|REG AIR|o the carefully regular foxes. +14278|1882|83|4|14|24974.32|0.03|0.01|N|O|1998-06-17|1998-08-19|1998-06-19|DELIVER IN PERSON|SHIP|sual pinto +14278|1444|45|5|48|64581.12|0.02|0.03|N|O|1998-07-30|1998-07-17|1998-07-31|TAKE BACK RETURN|SHIP|y ironic dolphins +14278|1884|14|6|6|10715.28|0.03|0.00|N|O|1998-07-16|1998-08-23|1998-08-01|NONE|AIR|ely ironic instr +14278|88|89|7|29|28654.32|0.09|0.06|N|O|1998-08-23|1998-07-28|1998-09-05|NONE|FOB|ithe theodolites across the fluff +14279|1456|35|1|4|5429.80|0.00|0.08|N|O|1998-04-15|1998-04-29|1998-05-11|DELIVER IN PERSON|REG AIR|. special, e +14279|939|42|2|47|86476.71|0.03|0.01|N|O|1998-06-02|1998-05-02|1998-06-19|NONE|TRUCK|old deposits use sl +14279|1570|51|3|8|11772.56|0.09|0.05|N|O|1998-05-23|1998-04-08|1998-06-19|DELIVER IN PERSON|MAIL|theodolites nag blit +14279|1358|73|4|42|52892.70|0.00|0.03|N|O|1998-03-14|1998-05-10|1998-03-19|COLLECT COD|AIR|ole blithely pending asympto +14279|1668|10|5|1|1569.66|0.08|0.06|N|O|1998-04-24|1998-03-23|1998-05-10|TAKE BACK RETURN|SHIP|press orbits serve +14304|149|2|1|33|34621.62|0.09|0.03|N|O|1997-12-31|1998-01-01|1998-01-07|NONE|MAIL| unusual instructions grow fluffil +14304|1813|14|2|9|15433.29|0.01|0.07|N|O|1997-11-16|1998-02-07|1997-12-06|COLLECT COD|MAIL|venly regular requests ha +14304|800|1|3|30|51024.00|0.06|0.00|N|O|1998-01-24|1998-01-19|1998-02-10|COLLECT COD|SHIP|efully even packages sleep slyl +14304|1560|81|4|48|70154.88|0.09|0.06|N|O|1998-01-27|1997-12-24|1998-02-10|TAKE BACK RETURN|TRUCK| slyly pending accounts could h +14304|899|66|5|5|8999.45|0.10|0.02|N|O|1998-03-01|1997-12-15|1998-03-25|DELIVER IN PERSON|MAIL|gular instructions sleep fluffily +14304|1612|36|6|30|45408.30|0.08|0.03|N|O|1998-01-07|1997-12-15|1998-01-28|TAKE BACK RETURN|MAIL| blithe accounts a +14305|994|29|1|44|83379.56|0.05|0.02|N|O|1996-08-27|1996-09-12|1996-09-07|TAKE BACK RETURN|SHIP|nto the slyly unusual accounts. furio +14306|867|1|1|15|26517.90|0.04|0.07|A|F|1993-11-15|1993-12-27|1993-11-23|COLLECT COD|FOB|s. permanently furious theodo +14307|682|83|1|16|25322.88|0.01|0.03|N|O|1997-06-30|1997-07-25|1997-07-24|COLLECT COD|AIR|se theodolites are fur +14307|1453|93|2|47|63659.15|0.05|0.01|N|O|1997-07-11|1997-09-10|1997-07-24|COLLECT COD|MAIL|mong the carefully ironic accounts +14307|141|20|3|27|28110.78|0.08|0.05|N|O|1997-10-06|1997-08-01|1997-10-13|NONE|MAIL|he slyly final packages detect +14307|15|91|4|41|37515.41|0.07|0.07|N|O|1997-08-03|1997-08-19|1997-08-05|DELIVER IN PERSON|MAIL|es snooze furiously slyly sil +14307|945|46|5|15|27689.10|0.08|0.08|N|O|1997-08-19|1997-08-02|1997-08-20|NONE|REG AIR|. slyly regular +14308|1575|56|1|20|29531.40|0.04|0.03|N|O|1997-11-11|1997-11-05|1997-11-30|DELIVER IN PERSON|REG AIR|courts. carefully final accounts acco +14308|1111|84|2|46|46557.06|0.08|0.07|N|O|1997-10-17|1997-09-21|1997-11-11|DELIVER IN PERSON|RAIL|equests. slyly unusual instr +14308|1410|89|3|45|59013.45|0.04|0.02|N|O|1997-12-09|1997-10-09|1998-01-07|DELIVER IN PERSON|RAIL|ully bold pinto beans. final, +14309|1710|95|1|37|59633.27|0.08|0.04|R|F|1994-05-18|1994-03-02|1994-06-04|DELIVER IN PERSON|MAIL|ncies x-ray a +14309|1205|6|2|28|30973.60|0.08|0.03|R|F|1994-03-19|1994-03-09|1994-03-22|DELIVER IN PERSON|SHIP| instructions. furiously ironic foxes u +14309|1901|90|3|10|18029.00|0.07|0.01|R|F|1994-05-06|1994-04-16|1994-06-01|DELIVER IN PERSON|AIR|detect fluffily along the +14310|505|66|1|42|59031.00|0.01|0.02|N|O|1997-09-24|1997-12-01|1997-10-08|NONE|SHIP|ly final theodolite +14311|1947|48|1|26|48072.44|0.10|0.00|R|F|1994-11-07|1994-10-26|1994-11-15|COLLECT COD|SHIP|ptotes. carefully ironic foxes according +14311|840|74|2|2|3481.68|0.01|0.06|R|F|1994-09-15|1994-09-22|1994-10-03|TAKE BACK RETURN|TRUCK| careful id +14336|225|53|1|29|32631.38|0.03|0.08|R|F|1994-11-26|1994-12-25|1994-12-21|NONE|FOB|rding to the n +14336|65|91|2|6|5790.36|0.07|0.04|R|F|1995-02-06|1995-01-25|1995-02-10|COLLECT COD|REG AIR|usly at the slyly pending forges! ir +14336|1314|53|3|23|27952.13|0.02|0.07|A|F|1994-12-14|1995-02-08|1995-01-04|DELIVER IN PERSON|REG AIR|lithely carefully fina +14336|298|26|4|44|52724.76|0.04|0.01|A|F|1994-11-25|1995-02-07|1994-12-23|TAKE BACK RETURN|FOB|e blithely acco +14336|319|4|5|45|54868.95|0.08|0.04|A|F|1994-12-02|1995-01-05|1994-12-06|TAKE BACK RETURN|SHIP|uests wake ironic courts. accounts use c +14337|892|26|1|25|44822.25|0.10|0.07|N|O|1997-10-17|1997-12-03|1997-11-12|COLLECT COD|SHIP|ven deposits a +14337|563|94|2|6|8781.36|0.04|0.01|N|O|1997-11-09|1997-12-08|1997-11-12|COLLECT COD|AIR|nd the furiously +14337|382|67|3|37|47448.06|0.04|0.03|N|O|1998-01-27|1997-12-11|1998-02-06|TAKE BACK RETURN|MAIL|osits. even ideas sleep blithely r +14337|692|86|4|50|79634.50|0.06|0.02|N|O|1998-01-07|1997-11-21|1998-01-08|COLLECT COD|RAIL|kly. ironic packages x-ray slyly agains +14337|83|84|5|18|17695.44|0.03|0.02|N|O|1997-11-20|1997-12-15|1997-12-15|NONE|REG AIR|equests. permanent packag +14337|1933|22|6|25|45873.25|0.03|0.01|N|O|1998-01-26|1997-12-06|1998-02-23|COLLECT COD|AIR|ent accounts cajole carefull +14337|1854|98|7|23|40384.55|0.01|0.07|N|O|1997-10-27|1997-12-28|1997-11-20|COLLECT COD|REG AIR|are blithely bold reque +14338|843|43|1|33|57546.72|0.00|0.03|R|F|1993-02-17|1993-05-01|1993-02-25|NONE|AIR|ounts among the bold, even instructions use +14338|232|14|2|35|39628.05|0.04|0.00|A|F|1993-05-16|1993-03-18|1993-06-06|COLLECT COD|RAIL|final dolphins. +14339|1162|63|1|34|36147.44|0.09|0.06|N|O|1997-08-05|1997-10-21|1997-08-24|TAKE BACK RETURN|REG AIR|kages. slyly express p +14339|1980|13|2|28|52695.44|0.01|0.04|N|O|1997-10-24|1997-10-20|1997-11-18|COLLECT COD|MAIL| foxes haggle. fluffily ironic p +14339|1830|31|3|28|48491.24|0.00|0.00|N|O|1997-07-28|1997-08-29|1997-08-01|TAKE BACK RETURN|SHIP|ng to the enticing, unusual p +14339|1877|21|4|14|24904.18|0.01|0.00|N|O|1997-08-15|1997-10-21|1997-09-02|TAKE BACK RETURN|MAIL|uriously ironic theodol +14339|612|44|5|34|51428.74|0.10|0.01|N|O|1997-10-28|1997-09-06|1997-11-12|NONE|REG AIR|he foxes. +14340|1509|30|1|17|23978.50|0.06|0.00|N|O|1996-01-30|1995-12-08|1996-02-27|TAKE BACK RETURN|TRUCK|ronic pinto beans wake closely requests. +14340|469|57|2|29|39714.34|0.10|0.03|N|O|1996-01-29|1995-11-15|1996-02-01|DELIVER IN PERSON|FOB|ag. ironic packages across the furiou +14340|1016|22|3|50|45850.50|0.06|0.08|N|O|1996-01-05|1995-12-05|1996-01-27|COLLECT COD|TRUCK|o beans. sly +14340|229|11|4|18|20325.96|0.03|0.06|N|O|1996-01-08|1995-12-22|1996-02-01|COLLECT COD|AIR|out the even pi +14340|483|13|5|23|31820.04|0.01|0.07|N|O|1995-10-30|1996-01-02|1995-11-21|TAKE BACK RETURN|MAIL|arefully under the slyly special theodol +14340|921|22|6|35|63767.20|0.04|0.01|N|O|1995-11-05|1995-12-21|1995-11-10|TAKE BACK RETURN|AIR|l requests could are about the +14341|689|52|1|48|76304.64|0.01|0.05|R|F|1993-09-18|1993-10-13|1993-10-14|COLLECT COD|RAIL|t the carefully eve +14341|1909|54|2|7|12676.30|0.09|0.05|R|F|1993-10-14|1993-10-28|1993-10-25|COLLECT COD|AIR| along the furiously +14341|1851|52|3|37|64855.45|0.00|0.02|A|F|1993-10-13|1993-10-19|1993-10-31|COLLECT COD|FOB|. final, ironi +14341|1021|27|4|8|7376.16|0.04|0.01|A|F|1993-12-25|1993-11-18|1993-12-27|NONE|SHIP|nic sentiments are sly +14341|1275|76|5|28|32935.56|0.01|0.00|A|F|1993-09-19|1993-11-05|1993-09-28|COLLECT COD|MAIL|oost furiously. ironic, final fox +14342|12|63|1|45|41040.45|0.00|0.06|A|F|1994-08-01|1994-06-09|1994-08-31|DELIVER IN PERSON|FOB|s. furiously even pinto beans accord +14342|896|97|2|33|59297.37|0.01|0.01|A|F|1994-06-16|1994-06-09|1994-06-22|TAKE BACK RETURN|SHIP|ecial deposi +14342|572|33|3|10|14725.70|0.03|0.03|R|F|1994-07-19|1994-07-27|1994-07-30|TAKE BACK RETURN|TRUCK|regular instru +14342|302|31|4|4|4809.20|0.01|0.08|A|F|1994-05-16|1994-05-28|1994-05-29|TAKE BACK RETURN|FOB|ckly pending accounts are. accounts nag +14342|1953|54|5|8|14839.60|0.00|0.03|A|F|1994-08-03|1994-06-19|1994-08-05|NONE|FOB|ickly after the ironic accou +14343|1015|51|1|13|11908.13|0.10|0.02|N|O|1996-04-25|1996-04-24|1996-05-19|TAKE BACK RETURN|MAIL|ly ironic packages breach unus +14343|1147|84|2|44|46118.16|0.01|0.04|N|O|1996-04-23|1996-05-21|1996-05-15|COLLECT COD|SHIP|r accounts sublate about the carefully ir +14368|1261|62|1|42|48814.92|0.09|0.02|N|O|1995-09-19|1995-11-14|1995-10-05|COLLECT COD|TRUCK|nal, ironic packages. fi +14368|1442|82|2|6|8060.64|0.07|0.07|N|O|1995-11-17|1995-10-22|1995-12-14|NONE|RAIL|luffily according to the slowly ironic +14368|1465|83|3|7|9565.22|0.01|0.07|N|O|1995-09-23|1995-11-19|1995-10-20|NONE|AIR|l foxes mold +14368|385|42|4|42|53985.96|0.01|0.00|N|O|1995-12-16|1995-11-24|1996-01-02|NONE|FOB|eas! blithely regular accounts ca +14368|1679|80|5|3|4742.01|0.04|0.03|N|O|1995-11-30|1995-10-20|1995-12-30|TAKE BACK RETURN|SHIP|beneath the slyl +14369|1271|83|1|45|52752.15|0.02|0.01|N|O|1996-12-04|1997-02-20|1996-12-09|NONE|MAIL|sly bold platelets are fluffily +14369|1516|57|2|46|65205.46|0.09|0.05|N|O|1997-03-17|1997-01-01|1997-04-06|NONE|SHIP|refully even accounts cajole furious +14369|410|11|3|34|44553.94|0.00|0.01|N|O|1997-01-20|1997-01-25|1997-01-28|COLLECT COD|REG AIR|eas. permanent instructio +14369|1997|98|4|35|66464.65|0.09|0.05|N|O|1997-01-20|1997-02-06|1997-01-30|DELIVER IN PERSON|AIR|en ideas. regul +14369|170|23|5|33|35315.61|0.05|0.02|N|O|1997-03-17|1997-01-25|1997-04-05|NONE|MAIL|egular requests after the reque +14369|1477|17|6|11|15163.17|0.07|0.07|N|O|1996-12-05|1997-01-03|1996-12-14|TAKE BACK RETURN|SHIP|egrate abou +14370|82|83|1|44|43211.52|0.00|0.06|N|O|1997-07-30|1997-07-28|1997-08-19|DELIVER IN PERSON|MAIL|osits boost b +14370|310|39|2|38|45991.78|0.01|0.08|N|O|1997-07-06|1997-06-26|1997-07-17|COLLECT COD|FOB|phs after the express foxes use slyly bo +14370|289|17|3|42|49949.76|0.07|0.08|N|O|1997-07-01|1997-06-27|1997-07-08|DELIVER IN PERSON|AIR|the pending packages. blithely ironic in +14370|579|70|4|12|17754.84|0.00|0.01|N|O|1997-07-22|1997-06-03|1997-07-26|COLLECT COD|TRUCK|aring requests. foxes ha +14371|87|13|1|33|32573.64|0.08|0.05|A|F|1993-08-11|1993-09-08|1993-08-14|COLLECT COD|TRUCK|ording to the carefully special packages +14371|1565|46|2|49|71861.44|0.08|0.03|R|F|1993-10-20|1993-08-26|1993-10-28|COLLECT COD|TRUCK|deas. pend +14371|211|12|3|16|17779.36|0.06|0.01|R|F|1993-09-13|1993-08-12|1993-09-22|TAKE BACK RETURN|RAIL| wake furiously q +14372|979|48|1|28|52639.16|0.09|0.02|R|F|1993-01-22|1992-12-23|1993-02-05|COLLECT COD|AIR|uickly iron +14372|968|69|2|2|3737.92|0.09|0.08|A|F|1993-02-06|1993-01-12|1993-03-05|NONE|REG AIR|d platelets. special instructions cajole sl +14372|743|40|3|31|50955.94|0.01|0.08|R|F|1992-12-13|1992-12-23|1992-12-29|TAKE BACK RETURN|RAIL|gside of the regular accou +14372|1540|81|4|40|57661.60|0.02|0.06|A|F|1992-12-07|1992-12-30|1992-12-14|TAKE BACK RETURN|TRUCK|above the depos +14373|1152|53|1|49|51604.35|0.01|0.04|A|F|1993-10-08|1993-10-21|1993-10-20|DELIVER IN PERSON|REG AIR|. slyly regular accounts acc +14374|1984|73|1|39|73553.22|0.00|0.07|N|O|1995-08-30|1995-08-14|1995-09-18|COLLECT COD|AIR|. blithely final pinto beans haggl +14374|626|89|2|18|27479.16|0.06|0.07|N|O|1995-07-30|1995-07-04|1995-08-18|TAKE BACK RETURN|REG AIR|c escapades +14374|1970|59|3|9|16847.73|0.10|0.01|N|O|1995-08-17|1995-06-17|1995-08-23|COLLECT COD|REG AIR|y final ideas. carefully final asymptote +14375|1471|89|1|30|41174.10|0.10|0.07|A|F|1993-02-05|1993-04-27|1993-03-07|NONE|TRUCK|arefully at the ironic, regular packa +14375|1563|4|2|5|7322.80|0.07|0.07|A|F|1993-04-15|1993-03-10|1993-05-09|NONE|RAIL|ccounts. carefully ru +14375|1317|94|3|25|30457.75|0.06|0.03|R|F|1993-04-28|1993-03-13|1993-05-19|TAKE BACK RETURN|MAIL|usly after the carefully regular ins +14375|725|90|4|4|6502.88|0.04|0.03|A|F|1993-02-11|1993-03-30|1993-02-25|TAKE BACK RETURN|SHIP|warhorses wake among the qui +14375|1851|38|5|14|24539.90|0.00|0.03|R|F|1993-05-12|1993-03-09|1993-05-28|DELIVER IN PERSON|RAIL|e furiously. pinto beans believe fur +14375|1414|15|6|9|11838.69|0.01|0.05|A|F|1993-02-16|1993-03-31|1993-02-25|DELIVER IN PERSON|REG AIR|deas. blithely even requests a +14375|1778|79|7|12|20157.24|0.05|0.07|R|F|1993-05-05|1993-04-14|1993-05-26|TAKE BACK RETURN|FOB|nic dugouts. pen +14400|1023|24|1|5|4620.10|0.02|0.05|A|F|1994-02-28|1994-03-21|1994-03-28|NONE|RAIL| after the +14400|934|37|2|3|5504.79|0.05|0.05|A|F|1994-03-25|1994-03-16|1994-04-14|DELIVER IN PERSON|TRUCK|ructions nag +14400|1907|8|3|26|47031.40|0.00|0.01|R|F|1994-03-30|1994-04-15|1994-04-08|DELIVER IN PERSON|AIR|ans. special r +14400|599|90|4|23|34490.57|0.01|0.08|R|F|1994-02-09|1994-04-10|1994-02-25|NONE|AIR|posits. ir +14400|1130|39|5|40|41245.20|0.07|0.08|A|F|1994-02-23|1994-03-08|1994-03-25|DELIVER IN PERSON|FOB|long the special deposits. slyly ironic +14400|561|62|6|35|51154.60|0.05|0.02|A|F|1994-03-31|1994-04-02|1994-04-24|DELIVER IN PERSON|RAIL|ng to the slyly regular r +14400|1717|2|7|48|77698.08|0.06|0.05|A|F|1994-05-27|1994-04-23|1994-06-26|COLLECT COD|SHIP|. requests nag instructio +14401|519|10|1|33|46843.83|0.04|0.03|N|O|1995-11-17|1995-09-14|1995-12-09|TAKE BACK RETURN|SHIP|osits haggle slyl +14401|1294|95|2|24|28686.96|0.10|0.01|N|O|1995-10-24|1995-10-13|1995-10-27|COLLECT COD|MAIL|about the special pa +14401|1497|15|3|15|20977.35|0.06|0.05|N|O|1995-09-24|1995-10-28|1995-10-03|NONE|FOB|en requests +14401|1245|46|4|29|33240.96|0.06|0.00|N|O|1995-08-22|1995-10-31|1995-09-03|COLLECT COD|TRUCK|es! unusual multiplier +14401|1798|41|5|20|33995.80|0.07|0.03|N|O|1995-10-07|1995-09-05|1995-10-14|COLLECT COD|MAIL|ns are furiousl +14402|247|48|1|33|37858.92|0.02|0.00|A|F|1993-11-11|1993-12-25|1993-11-25|DELIVER IN PERSON|FOB|cording to t +14402|217|99|2|41|45805.61|0.00|0.08|R|F|1994-02-01|1993-12-02|1994-02-20|DELIVER IN PERSON|MAIL|odolites! regular, regular depos +14402|85|61|3|25|24627.00|0.08|0.00|A|F|1994-01-27|1993-12-08|1994-02-21|TAKE BACK RETURN|TRUCK|ckages. bo +14403|1306|83|1|48|57950.40|0.10|0.05|N|O|1998-03-25|1998-05-21|1998-04-04|COLLECT COD|SHIP|al pearls. blithely +14403|842|9|2|33|57513.72|0.05|0.05|N|O|1998-07-01|1998-05-09|1998-07-20|NONE|TRUCK|eas sleep carefully. theodolites impress. i +14403|1375|76|3|7|8934.59|0.04|0.02|N|O|1998-06-25|1998-05-12|1998-07-18|DELIVER IN PERSON|AIR|lyly ironic asymptotes. fluffily regular +14404|1431|71|1|39|51964.77|0.00|0.00|N|O|1996-12-25|1996-12-31|1997-01-11|DELIVER IN PERSON|SHIP|r pending pinto beans. +14404|1612|36|2|32|48435.52|0.00|0.06|N|O|1997-02-14|1996-12-24|1997-03-11|DELIVER IN PERSON|RAIL|e to are f +14404|1452|92|3|31|41956.95|0.03|0.05|N|O|1997-01-22|1996-12-15|1997-02-18|TAKE BACK RETURN|TRUCK|ronic, final deposit +14404|873|40|4|40|70954.80|0.02|0.03|N|O|1997-01-16|1997-01-18|1997-01-22|DELIVER IN PERSON|MAIL|odolites across the carefully regu +14404|44|70|5|41|38705.64|0.04|0.04|N|O|1996-11-18|1997-01-29|1996-11-22|TAKE BACK RETURN|REG AIR|ly blithely final packag +14404|751|52|6|33|54507.75|0.07|0.00|N|O|1997-02-16|1996-12-05|1997-02-23|COLLECT COD|MAIL|oss the requests boost slyly fu +14404|354|83|7|42|52682.70|0.10|0.01|N|O|1997-02-14|1997-01-20|1997-03-11|TAKE BACK RETURN|RAIL|s. slyly iro +14405|1107|8|1|36|36291.60|0.04|0.00|N|O|1996-06-26|1996-06-14|1996-06-29|COLLECT COD|SHIP|the silent requests. regular dep +14405|563|54|2|17|24880.52|0.04|0.04|N|O|1996-07-29|1996-06-30|1996-08-28|NONE|AIR|egular requests ar +14405|1885|72|3|20|35737.60|0.10|0.08|N|O|1996-07-05|1996-06-26|1996-07-08|COLLECT COD|FOB|ag blithely. care +14406|315|44|1|12|14583.72|0.03|0.00|R|F|1993-07-05|1993-05-25|1993-07-25|DELIVER IN PERSON|MAIL|he blithely r +14406|1442|82|2|9|12090.96|0.04|0.08|A|F|1993-06-04|1993-04-18|1993-06-27|NONE|FOB|grate slyly spe +14406|969|38|3|24|44879.04|0.04|0.01|A|F|1993-03-23|1993-04-18|1993-04-16|TAKE BACK RETURN|TRUCK|e accounts. pending, special instructi +14406|547|48|4|20|28950.80|0.02|0.02|R|F|1993-04-30|1993-05-07|1993-05-19|NONE|MAIL|lar ideas boost carefully instru +14406|284|66|5|12|14211.36|0.06|0.03|R|F|1993-05-21|1993-04-20|1993-06-03|DELIVER IN PERSON|TRUCK| deposits +14406|820|87|6|49|84320.18|0.09|0.07|R|F|1993-03-27|1993-05-28|1993-04-10|COLLECT COD|REG AIR|refully unusual requests haggle iron +14407|22|73|1|24|22128.48|0.04|0.03|A|F|1993-11-17|1994-01-22|1993-12-05|TAKE BACK RETURN|SHIP|bold pinto beans. ironic, re +14432|168|95|1|42|44862.72|0.07|0.06|N|O|1997-01-18|1997-01-20|1997-01-19|NONE|REG AIR|bout the slow +14433|1297|9|1|46|55121.34|0.06|0.03|N|O|1996-05-20|1996-07-26|1996-06-08|DELIVER IN PERSON|SHIP| the blithe, regular foxes boost +14433|1876|77|2|9|16000.83|0.02|0.08|N|O|1996-08-13|1996-08-06|1996-08-17|TAKE BACK RETURN|RAIL|carefully. packag +14433|1607|8|3|5|7543.00|0.03|0.02|N|O|1996-08-24|1996-07-31|1996-09-07|TAKE BACK RETURN|AIR|re. slyly re +14433|1832|33|4|40|69353.20|0.09|0.04|N|O|1996-08-02|1996-07-10|1996-08-22|TAKE BACK RETURN|REG AIR|xes haggle +14433|1959|4|5|5|9304.75|0.03|0.05|N|O|1996-07-28|1996-06-15|1996-08-02|COLLECT COD|FOB|c foxes slee +14433|1435|53|6|40|53457.20|0.05|0.00|N|O|1996-07-10|1996-07-10|1996-08-02|COLLECT COD|SHIP|as. pending dolphins sleep after the +14434|488|47|1|7|9719.36|0.06|0.05|R|F|1995-05-28|1995-04-07|1995-06-17|NONE|REG AIR|ly even deposits. reg +14434|845|45|2|23|40154.32|0.05|0.02|R|F|1995-05-04|1995-04-02|1995-05-19|TAKE BACK RETURN|AIR|requests. ironic instruc +14434|941|10|3|35|64467.90|0.09|0.00|A|F|1995-04-06|1995-03-20|1995-04-15|NONE|TRUCK|cial requests. even, even courts x-ray +14434|152|79|4|2|2104.30|0.05|0.07|R|F|1995-03-25|1995-04-09|1995-04-18|TAKE BACK RETURN|TRUCK|accounts cajole quickly. pending som +14434|730|95|5|41|66859.93|0.08|0.01|A|F|1995-03-01|1995-04-14|1995-03-28|NONE|SHIP|ctions along the regula +14435|1795|22|1|10|16967.90|0.10|0.08|A|F|1993-04-01|1993-02-11|1993-05-01|NONE|TRUCK|ress, ironic packages maintain +14435|718|51|2|25|40467.75|0.08|0.07|R|F|1992-12-23|1993-02-09|1992-12-25|DELIVER IN PERSON|MAIL| boost caref +14435|1810|97|3|22|37659.82|0.01|0.06|A|F|1992-12-28|1993-02-15|1993-01-18|NONE|AIR|sleep slyly am +14435|1169|78|4|32|34245.12|0.02|0.05|R|F|1993-01-22|1993-02-15|1993-01-24|DELIVER IN PERSON|AIR|ickly special packa +14435|448|78|5|8|10787.52|0.03|0.03|A|F|1993-02-22|1993-01-13|1993-03-12|TAKE BACK RETURN|REG AIR|ar foxes: slyly ironic Tiresias solve f +14435|661|55|6|17|26548.22|0.02|0.07|A|F|1993-01-23|1993-02-24|1993-01-29|TAKE BACK RETURN|FOB|thely about +14435|1529|50|7|14|20027.28|0.02|0.08|R|F|1992-12-31|1993-02-10|1993-01-27|TAKE BACK RETURN|RAIL|uses. furiously special notornis haggle flu +14436|698|61|1|33|52756.77|0.09|0.06|R|F|1994-05-05|1994-05-21|1994-05-25|NONE|SHIP| deposits. slyly unusual instr +14436|1818|5|2|39|67072.59|0.03|0.03|A|F|1994-06-17|1994-05-19|1994-07-02|COLLECT COD|MAIL|counts haggle c +14436|728|29|3|9|14658.48|0.05|0.07|R|F|1994-06-07|1994-05-04|1994-07-02|TAKE BACK RETURN|AIR|o beans. regularly pending d +14436|315|100|4|11|13368.41|0.04|0.02|R|F|1994-03-27|1994-05-03|1994-04-14|COLLECT COD|FOB|rmanent deposits are +14436|923|58|5|50|91196.00|0.10|0.04|A|F|1994-05-12|1994-06-02|1994-05-15|TAKE BACK RETURN|AIR|. deposits are according to +14437|93|19|1|36|35751.24|0.09|0.03|R|F|1994-06-28|1994-07-13|1994-07-23|COLLECT COD|RAIL|ronically +14437|1381|96|2|35|44883.30|0.01|0.05|R|F|1994-08-14|1994-07-06|1994-08-28|TAKE BACK RETURN|FOB| slyly pen +14437|1595|36|3|19|28435.21|0.07|0.05|A|F|1994-05-22|1994-07-05|1994-06-20|TAKE BACK RETURN|FOB| instructions haggle carefully even, +14437|1126|35|4|27|27732.24|0.07|0.03|A|F|1994-07-25|1994-07-10|1994-08-15|DELIVER IN PERSON|SHIP|tes across the carefull +14437|397|98|5|30|38921.70|0.00|0.04|A|F|1994-06-07|1994-06-22|1994-06-23|NONE|SHIP|usly pending sentiments use blithely. +14437|1586|7|6|42|62478.36|0.06|0.04|R|F|1994-06-24|1994-08-08|1994-07-13|TAKE BACK RETURN|AIR|ans according to the furiously fin +14437|200|79|7|45|49509.00|0.04|0.04|R|F|1994-07-21|1994-08-02|1994-08-19|DELIVER IN PERSON|FOB|ress foxes. furio +14438|527|58|1|37|52818.24|0.09|0.01|N|O|1995-10-27|1995-11-06|1995-11-08|COLLECT COD|TRUCK|fter the furiously regular sentiments sl +14438|624|87|2|11|16770.82|0.08|0.01|N|O|1995-08-29|1995-10-21|1995-09-16|COLLECT COD|FOB|ng the packages. furiou +14438|425|26|3|33|43738.86|0.06|0.05|N|O|1995-12-01|1995-10-16|1995-12-23|COLLECT COD|SHIP| carefully iron +14439|534|65|1|3|4303.59|0.09|0.03|R|F|1992-09-22|1992-10-22|1992-10-09|NONE|AIR| the carefully pending f +14464|1710|11|1|29|46739.59|0.07|0.01|N|O|1998-05-08|1998-04-19|1998-05-16|TAKE BACK RETURN|SHIP|as against the bold, +14465|1129|38|1|48|49445.76|0.00|0.07|R|F|1994-09-19|1994-09-05|1994-10-17|COLLECT COD|AIR|ding to the fluffily slow dependencie +14465|1244|45|2|7|8016.68|0.01|0.03|R|F|1994-08-28|1994-07-28|1994-09-12|COLLECT COD|SHIP|its. furiously special gifts are regul +14465|1869|99|3|17|30104.62|0.08|0.06|A|F|1994-09-25|1994-08-07|1994-10-02|NONE|TRUCK|r dependencies. quickly fi +14465|26|2|4|12|11112.24|0.10|0.07|R|F|1994-06-26|1994-07-30|1994-07-25|COLLECT COD|REG AIR| are. ironic pinto +14465|370|71|5|6|7622.22|0.01|0.03|A|F|1994-08-24|1994-08-26|1994-09-13|DELIVER IN PERSON|FOB|ular deposits after the ruthless, bold +14466|1302|79|1|17|20456.10|0.09|0.06|N|O|1996-08-21|1996-06-26|1996-09-15|COLLECT COD|RAIL|regular pin +14467|1724|25|1|16|26011.52|0.00|0.08|N|O|1996-07-20|1996-07-10|1996-08-08|COLLECT COD|MAIL|g dependencies. reque +14467|1747|32|2|44|72544.56|0.01|0.00|N|O|1996-08-17|1996-08-24|1996-08-20|COLLECT COD|SHIP|s. carefully regular packages affix acc +14467|1991|24|3|24|45431.76|0.02|0.00|N|O|1996-09-13|1996-07-20|1996-10-07|COLLECT COD|REG AIR|ckages haggle slyly quickly iron +14467|1234|46|4|15|17028.45|0.05|0.01|N|O|1996-06-02|1996-08-13|1996-06-22|COLLECT COD|FOB| slyly careful +14468|924|25|1|10|18249.20|0.01|0.08|N|O|1998-07-27|1998-09-26|1998-08-18|DELIVER IN PERSON|TRUCK|inal theodolites. carefully express +14468|977|12|2|23|43193.31|0.10|0.06|N|O|1998-07-22|1998-10-07|1998-08-14|DELIVER IN PERSON|RAIL|the blithely fi +14469|741|74|1|19|31193.06|0.08|0.07|N|O|1997-06-02|1997-04-23|1997-07-01|NONE|TRUCK|d pinto beans cajole fluffily fluffil +14469|1707|8|2|33|53087.10|0.02|0.00|N|O|1997-05-05|1997-04-09|1997-05-14|DELIVER IN PERSON|SHIP|deposits cajole doggedly sly, s +14470|559|20|1|28|40867.40|0.10|0.06|R|F|1995-05-06|1995-03-26|1995-05-14|TAKE BACK RETURN|TRUCK|slyly express requests lose. bold pac +14470|1690|73|2|38|60484.22|0.04|0.02|A|F|1995-02-22|1995-04-12|1995-03-22|COLLECT COD|RAIL| regular theodolites sleep slyly blit +14470|971|72|3|20|37439.40|0.00|0.07|R|F|1995-05-04|1995-03-11|1995-05-19|DELIVER IN PERSON|MAIL|arefully even ideas. fin +14470|990|25|4|1|1890.99|0.01|0.00|R|F|1995-04-20|1995-03-29|1995-05-05|DELIVER IN PERSON|RAIL|st the bli +14471|391|76|1|50|64569.50|0.06|0.05|N|O|1995-07-03|1995-07-25|1995-07-05|TAKE BACK RETURN|MAIL|kly regular theodolites +14471|1462|2|2|13|17724.98|0.01|0.00|N|O|1995-08-11|1995-08-14|1995-08-30|TAKE BACK RETURN|RAIL|ructions hinder +14471|1502|43|3|50|70175.00|0.01|0.07|N|O|1995-09-24|1995-07-20|1995-10-16|NONE|FOB|s. slyly even dolphins after the theodol +14471|217|99|4|19|21226.99|0.08|0.04|N|O|1995-06-30|1995-08-09|1995-07-30|TAKE BACK RETURN|SHIP|ing accounts use about the fluffily spe +14471|895|62|5|42|75427.38|0.05|0.04|N|F|1995-06-07|1995-08-23|1995-06-29|DELIVER IN PERSON|AIR| cajole quickly evenly special Tire +14471|1778|5|6|35|58791.95|0.05|0.03|A|F|1995-06-07|1995-07-01|1995-06-08|TAKE BACK RETURN|SHIP|refully. furi +14471|1902|47|7|9|16235.10|0.03|0.03|N|O|1995-09-13|1995-07-09|1995-09-15|NONE|AIR|pending theodolites integrat +14496|1274|12|1|22|25855.94|0.03|0.07|N|O|1996-05-20|1996-06-25|1996-06-08|NONE|AIR|sits might +14496|1422|1|2|27|35732.34|0.04|0.08|N|O|1996-07-14|1996-05-27|1996-08-03|DELIVER IN PERSON|AIR|g the blithely special t +14496|1934|23|3|48|88124.64|0.07|0.03|N|O|1996-06-14|1996-05-22|1996-07-04|COLLECT COD|AIR|riously ironic pinto beans sleep ironica +14496|1143|16|4|9|9397.26|0.07|0.05|N|O|1996-08-06|1996-06-30|1996-08-10|DELIVER IN PERSON|MAIL|lphins across the +14496|1849|50|5|29|50774.36|0.06|0.02|N|O|1996-05-26|1996-06-27|1996-05-30|TAKE BACK RETURN|MAIL|es haggle quickly pending +14497|1694|95|1|48|76593.12|0.02|0.07|R|F|1992-07-16|1992-07-26|1992-07-26|TAKE BACK RETURN|SHIP|losely ironic excuses across the carefully +14497|1220|32|2|17|19060.74|0.07|0.03|A|F|1992-08-02|1992-07-20|1992-08-09|COLLECT COD|TRUCK|al deposits sleep among +14497|1178|79|3|1|1079.17|0.08|0.07|A|F|1992-08-03|1992-08-14|1992-09-01|DELIVER IN PERSON|RAIL|s. regular, regular asympt +14497|508|39|4|22|30987.00|0.08|0.08|R|F|1992-08-13|1992-06-22|1992-08-26|TAKE BACK RETURN|REG AIR|ackages haggle permanently? qui +14498|149|76|1|5|5245.70|0.06|0.02|N|O|1996-11-17|1997-01-02|1996-12-04|DELIVER IN PERSON|SHIP|ges are. ideas haggle +14498|1403|21|2|23|30001.20|0.08|0.08|N|O|1996-10-14|1996-11-21|1996-11-04|NONE|FOB|y even packages. bli +14498|942|45|3|10|18429.40|0.08|0.06|N|O|1996-10-28|1996-11-06|1996-11-12|DELIVER IN PERSON|FOB|c, final platelets. quickly special packag +14498|811|78|4|14|23965.34|0.10|0.08|N|O|1996-11-26|1996-12-24|1996-12-22|TAKE BACK RETURN|REG AIR|lthily express deposits. furious +14498|1853|40|5|7|12283.95|0.09|0.08|N|O|1996-10-31|1996-12-16|1996-11-03|COLLECT COD|AIR|to beans are slyly. c +14498|1520|61|6|20|28430.40|0.08|0.03|N|O|1996-11-17|1996-12-19|1996-12-02|NONE|AIR|s. furiously fina +14498|644|7|7|40|61785.60|0.10|0.04|N|O|1996-12-24|1996-11-06|1997-01-01|NONE|FOB|iers. unusual +14499|1372|11|1|46|58575.02|0.10|0.02|R|F|1993-12-24|1994-01-08|1994-01-02|NONE|FOB|eep blithely unusual de +14499|1538|59|2|25|35988.25|0.02|0.01|R|F|1993-12-04|1994-02-07|1993-12-05|TAKE BACK RETURN|SHIP|e blithely final ideas! care +14499|1950|83|3|41|75929.95|0.02|0.02|R|F|1994-01-01|1994-01-23|1994-01-29|TAKE BACK RETURN|TRUCK| foxes are across the +14499|1217|29|4|41|45846.61|0.01|0.07|A|F|1994-02-05|1994-02-11|1994-02-18|TAKE BACK RETURN|RAIL| even excuses are silent foxes. +14499|1275|76|5|42|49403.34|0.00|0.07|R|F|1994-02-10|1994-02-05|1994-03-12|NONE|AIR|tes detect along the carefull +14499|103|30|6|6|6018.60|0.04|0.04|A|F|1994-01-26|1994-01-07|1994-02-16|NONE|AIR| carefully ironic packages. even fox +14499|1078|84|7|36|35246.52|0.04|0.01|A|F|1994-01-30|1994-01-12|1994-02-08|COLLECT COD|SHIP|ys special foxes. caref +14500|1462|2|1|30|40903.80|0.07|0.03|N|O|1995-07-23|1995-07-29|1995-07-29|TAKE BACK RETURN|TRUCK|thely above the silent, pending pint +14500|947|50|2|33|60982.02|0.00|0.01|N|O|1995-09-21|1995-09-04|1995-10-09|NONE|TRUCK|g, stealthy packages about +14501|1160|97|1|33|35018.28|0.01|0.08|N|O|1997-10-20|1997-10-10|1997-11-13|DELIVER IN PERSON|MAIL|lly after th +14501|1362|39|2|36|45480.96|0.06|0.07|N|O|1997-12-04|1997-11-10|1997-12-17|NONE|AIR|fully slow asymptotes play furiously? pendi +14502|563|24|1|33|48297.48|0.05|0.00|N|O|1996-11-11|1996-10-05|1996-12-05|TAKE BACK RETURN|RAIL|xpress deposits +14502|1891|92|2|26|46615.14|0.10|0.00|N|O|1996-09-09|1996-10-05|1996-09-14|NONE|MAIL| final foxes nag. furiously bold warh +14503|979|14|1|11|20679.67|0.07|0.03|R|F|1995-03-26|1995-03-19|1995-04-04|NONE|RAIL|he quickly final depo +14503|769|2|2|30|50092.80|0.05|0.05|A|F|1995-03-22|1995-04-25|1995-04-04|DELIVER IN PERSON|REG AIR|lly according to the furiously express fo +14503|1937|70|3|42|77235.06|0.06|0.02|A|F|1995-04-15|1995-03-24|1995-05-05|NONE|TRUCK|r the furiously pendin +14503|1427|28|4|41|54465.22|0.06|0.06|A|F|1995-05-19|1995-04-21|1995-05-27|COLLECT COD|AIR|aggle furiously slyly ruthless excuses. +14528|1660|61|1|48|74959.68|0.04|0.03|A|F|1994-08-18|1994-08-07|1994-09-02|TAKE BACK RETURN|MAIL|lites are fur +14528|1135|36|2|36|37300.68|0.02|0.06|R|F|1994-07-16|1994-09-02|1994-07-29|DELIVER IN PERSON|AIR|ly even foxe +14528|1035|36|3|21|19656.63|0.05|0.04|A|F|1994-08-27|1994-08-25|1994-08-30|COLLECT COD|REG AIR|ackages. even requests wake s +14528|329|14|4|19|23357.08|0.01|0.00|R|F|1994-07-26|1994-09-01|1994-08-20|DELIVER IN PERSON|FOB|ix against the carefully spec +14529|195|74|1|43|47093.17|0.01|0.03|R|F|1993-11-15|1993-10-21|1993-12-08|NONE|FOB|re. quickly express instructions boo +14529|504|5|2|26|36517.00|0.02|0.01|A|F|1994-01-09|1993-11-24|1994-02-06|TAKE BACK RETURN|TRUCK|ven requests boost carefully int +14529|1770|13|3|22|36778.94|0.05|0.03|A|F|1994-01-08|1993-11-03|1994-01-10|COLLECT COD|RAIL|, silent a +14529|1386|1|4|28|36046.64|0.06|0.04|R|F|1993-10-07|1993-12-05|1993-11-01|COLLECT COD|RAIL| blithely after the sl +14529|206|7|5|22|24336.40|0.01|0.04|A|F|1993-11-16|1993-12-01|1993-12-04|NONE|REG AIR| special instruct +14529|892|59|6|7|12550.23|0.04|0.07|R|F|1994-01-15|1993-11-04|1994-02-12|NONE|SHIP|ts haggle across the ac +14530|1816|46|1|48|82454.88|0.03|0.06|A|F|1994-06-09|1994-06-28|1994-06-18|COLLECT COD|AIR|inal asymptotes sleep alongsi +14530|1493|72|2|35|48807.15|0.06|0.01|A|F|1994-07-28|1994-06-20|1994-08-22|DELIVER IN PERSON|FOB|t deposits! even platelets boost furiou +14530|1532|13|3|16|22936.48|0.09|0.08|A|F|1994-07-04|1994-06-10|1994-07-18|DELIVER IN PERSON|MAIL|busy requests nag slyly doggedly regul +14530|88|89|4|45|44463.60|0.08|0.07|R|F|1994-08-06|1994-05-11|1994-09-04|NONE|FOB|totes sleep blithely ironic +14530|1725|68|5|4|6506.88|0.02|0.07|R|F|1994-06-17|1994-06-05|1994-06-25|NONE|REG AIR|brave packages +14530|1744|29|6|8|13165.92|0.10|0.06|R|F|1994-07-01|1994-06-18|1994-07-02|NONE|REG AIR|es. carefully express escapade +14530|1553|94|7|16|23272.80|0.01|0.02|A|F|1994-06-17|1994-07-05|1994-07-10|COLLECT COD|REG AIR| foxes alongside of the quickly ironic depo +14531|31|82|1|47|43758.41|0.03|0.07|N|O|1997-07-17|1997-07-23|1997-07-18|COLLECT COD|MAIL|luffily regular package +14531|891|91|2|34|60924.26|0.04|0.00|N|O|1997-07-11|1997-07-11|1997-08-02|DELIVER IN PERSON|SHIP|oxes sleep quickly even, regular p +14531|1652|76|3|45|69914.25|0.06|0.02|N|O|1997-08-22|1997-09-05|1997-09-13|TAKE BACK RETURN|MAIL|ng theodolites try to run +14531|734|99|4|34|55580.82|0.08|0.01|N|O|1997-10-05|1997-08-21|1997-10-27|TAKE BACK RETURN|RAIL|c foxes alo +14532|812|46|1|9|15415.29|0.06|0.04|N|O|1996-07-19|1996-06-21|1996-08-16|DELIVER IN PERSON|FOB|ely packages. carefully ironi +14533|115|16|1|19|19287.09|0.06|0.02|N|O|1996-08-27|1996-07-21|1996-08-29|NONE|SHIP|ic accounts. furiously b +14533|793|26|2|4|6775.16|0.01|0.01|N|O|1996-05-31|1996-06-20|1996-06-28|TAKE BACK RETURN|TRUCK|ggle across the ironic p +14533|1884|85|3|36|64291.68|0.04|0.03|N|O|1996-06-21|1996-07-08|1996-07-04|NONE|FOB|into beans. even, +14533|989|24|4|8|15119.84|0.02|0.05|N|O|1996-06-06|1996-07-17|1996-06-19|COLLECT COD|RAIL|ly express somas under t +14533|276|77|5|17|19996.59|0.00|0.00|N|O|1996-06-30|1996-07-08|1996-07-05|NONE|FOB|kages across the fluffily +14533|1495|96|6|27|37705.23|0.07|0.05|N|O|1996-07-21|1996-07-08|1996-08-13|NONE|REG AIR| quickly; unusual accounts +14534|1258|59|1|46|53325.50|0.07|0.02|A|F|1993-09-02|1993-09-11|1993-09-24|COLLECT COD|FOB|. furiousl +14534|768|33|2|43|71756.68|0.05|0.08|R|F|1993-10-03|1993-08-28|1993-10-10|DELIVER IN PERSON|FOB|at furiously regular accounts. fluff +14534|261|62|3|14|16257.64|0.03|0.00|R|F|1993-08-15|1993-08-30|1993-08-16|TAKE BACK RETURN|RAIL|n instructions sleep carefully s +14534|277|78|4|19|22368.13|0.00|0.05|A|F|1993-08-04|1993-08-26|1993-08-07|DELIVER IN PERSON|MAIL|ts. unusual theodolites sleep against the f +14534|895|95|5|48|86202.72|0.03|0.02|R|F|1993-07-28|1993-09-08|1993-08-25|TAKE BACK RETURN|AIR|aggle slyly. furiously special foxes +14535|1227|2|1|5|5641.10|0.00|0.01|A|F|1993-11-13|1993-12-12|1993-12-01|DELIVER IN PERSON|REG AIR|y special grouches. slyly regular packages +14535|68|44|2|27|26137.62|0.02|0.01|R|F|1994-01-19|1993-12-26|1994-02-16|TAKE BACK RETURN|AIR|yly express +14535|1234|46|3|27|30651.21|0.02|0.00|R|F|1993-12-03|1993-11-25|1993-12-08|TAKE BACK RETURN|TRUCK| beans cajole pa +14535|1589|70|4|22|32792.76|0.02|0.06|R|F|1994-01-29|1993-11-03|1994-02-01|DELIVER IN PERSON|RAIL|hely expres +14560|1466|6|1|24|32819.04|0.05|0.06|N|O|1998-01-29|1998-02-07|1998-02-16|COLLECT COD|AIR|refully fluffily express ideas. final p +14561|1168|77|1|50|53458.00|0.03|0.07|N|O|1998-08-02|1998-08-15|1998-08-05|DELIVER IN PERSON|REG AIR|hins hinder ironi +14561|1809|53|2|9|15397.20|0.02|0.02|N|O|1998-09-02|1998-09-09|1998-09-15|COLLECT COD|MAIL|thely after the express instr +14561|62|13|3|29|27899.74|0.04|0.08|N|O|1998-10-13|1998-08-09|1998-10-16|DELIVER IN PERSON|FOB|inal requests. furiously ironic packa +14561|390|91|4|48|61938.72|0.01|0.03|N|O|1998-08-11|1998-08-10|1998-08-13|NONE|FOB|ully. slyly unusual theodolites use; +14561|171|24|5|21|22494.57|0.00|0.02|N|O|1998-07-12|1998-08-29|1998-07-13|COLLECT COD|MAIL|uriously fluffily regular requests. asy +14561|1361|62|6|36|45444.96|0.00|0.08|N|O|1998-07-29|1998-09-08|1998-08-04|TAKE BACK RETURN|SHIP|regular requests poach. always regular +14561|740|73|7|25|41018.50|0.09|0.06|N|O|1998-08-17|1998-08-24|1998-09-02|NONE|FOB|sleep blithely ironic depths. furiously f +14562|1579|80|1|13|19247.41|0.01|0.03|N|O|1996-11-12|1996-10-11|1996-11-21|COLLECT COD|SHIP|out the quickly specia +14562|1381|82|2|36|46165.68|0.07|0.03|N|O|1996-07-25|1996-09-27|1996-08-16|NONE|RAIL| slyly. blithely final +14562|1393|70|3|17|22004.63|0.10|0.05|N|O|1996-08-19|1996-08-29|1996-09-17|NONE|RAIL|arefully regular requests. slyly special +14562|1457|36|4|50|67922.50|0.08|0.05|N|O|1996-11-06|1996-08-28|1996-12-03|DELIVER IN PERSON|REG AIR| after the furiously +14563|1436|54|1|31|41460.33|0.08|0.05|N|O|1996-02-05|1996-01-04|1996-02-23|TAKE BACK RETURN|AIR|r packages haggle. ironic ideas ca +14563|822|56|2|44|75804.08|0.07|0.02|N|O|1996-02-06|1996-01-24|1996-03-05|NONE|SHIP|kly final instructions. furiously regular +14563|1787|30|3|30|50663.40|0.01|0.00|N|O|1996-03-01|1996-01-26|1996-03-04|DELIVER IN PERSON|FOB| the final requests! regular +14563|1764|7|4|32|53304.32|0.02|0.08|N|O|1996-02-05|1996-01-19|1996-02-21|NONE|TRUCK| slyly even warthogs haggle. +14563|1875|76|5|10|17768.70|0.04|0.06|N|O|1996-03-11|1996-01-02|1996-04-05|TAKE BACK RETURN|FOB|fully special +14564|1591|72|1|1|1492.59|0.09|0.00|A|F|1993-09-14|1993-07-15|1993-10-08|TAKE BACK RETURN|FOB|usual packages wake slyly bold, +14565|368|53|1|33|41855.88|0.01|0.00|N|O|1998-01-31|1998-02-05|1998-02-24|TAKE BACK RETURN|FOB|gular, regular dependencies doubt f +14565|1853|40|2|5|8774.25|0.05|0.03|N|O|1998-01-04|1998-02-05|1998-01-30|DELIVER IN PERSON|SHIP|ages nag regular requests +14566|1701|2|1|25|40067.50|0.02|0.01|N|O|1997-01-29|1997-01-18|1997-02-12|NONE|FOB|quickly pend +14566|878|79|2|22|39135.14|0.01|0.04|N|O|1996-12-17|1997-01-10|1996-12-29|DELIVER IN PERSON|TRUCK|dependencie +14566|808|42|3|14|23923.20|0.07|0.08|N|O|1996-12-25|1996-12-10|1997-01-15|DELIVER IN PERSON|REG AIR|yly carefull +14566|1906|95|4|28|50621.20|0.07|0.04|N|O|1997-01-25|1997-01-06|1997-02-05|DELIVER IN PERSON|TRUCK|ters are. bravely ironi +14566|6|57|5|40|36240.00|0.08|0.03|N|O|1997-02-01|1997-01-07|1997-02-10|DELIVER IN PERSON|FOB|egular theodol +14566|617|80|6|20|30352.20|0.00|0.01|N|O|1996-11-09|1997-01-06|1996-11-30|DELIVER IN PERSON|FOB|lites. fluffily express courts alongside o +14566|1317|18|7|3|3654.93|0.07|0.00|N|O|1996-11-03|1996-12-01|1996-11-18|COLLECT COD|TRUCK|nder. furi +14567|816|50|1|19|32619.39|0.07|0.03|N|O|1996-11-03|1997-01-05|1996-11-30|NONE|AIR|e. even deposits haggle slyly quic +14567|1451|30|2|46|62212.70|0.03|0.04|N|O|1996-11-21|1997-01-05|1996-12-03|COLLECT COD|MAIL|? deposits cajole agai +14567|99|75|3|7|6993.63|0.09|0.02|N|O|1997-01-02|1996-11-18|1997-01-21|DELIVER IN PERSON|TRUCK|, even dugo +14567|1401|41|4|6|7814.40|0.08|0.05|N|O|1996-12-31|1996-12-28|1997-01-25|DELIVER IN PERSON|SHIP|ly even accounts. evenly final platelet +14567|208|9|5|31|34354.20|0.06|0.00|N|O|1996-10-29|1996-11-24|1996-11-20|NONE|MAIL|he slowly +14567|1790|75|6|13|21993.27|0.08|0.02|N|O|1997-01-05|1997-01-13|1997-01-23|NONE|REG AIR|y regular platelets. +14567|1062|33|7|16|15408.96|0.03|0.03|N|O|1996-11-17|1996-11-28|1996-11-22|COLLECT COD|TRUCK|platelets. blithel +14592|57|58|1|28|26797.40|0.00|0.04|N|O|1995-08-16|1995-09-28|1995-09-06|TAKE BACK RETURN|AIR|quickly across the slyly final accounts. +14592|538|29|2|21|30209.13|0.06|0.02|N|O|1995-07-22|1995-08-08|1995-08-16|NONE|SHIP| ideas haggle blit +14592|1136|45|3|36|37336.68|0.08|0.07|N|O|1995-07-12|1995-09-15|1995-08-04|TAKE BACK RETURN|AIR|beans sleep according to the ironic, exp +14593|266|48|1|8|9330.08|0.08|0.00|N|O|1998-02-02|1998-04-05|1998-03-03|NONE|SHIP|ncies. pending packages ab +14593|142|43|2|6|6252.84|0.09|0.07|N|O|1998-03-20|1998-04-01|1998-04-12|COLLECT COD|MAIL|unusual pinto +14593|121|100|3|44|44929.28|0.01|0.06|N|O|1998-04-20|1998-04-01|1998-04-21|COLLECT COD|MAIL|s according to the regular, ironic +14594|1311|26|1|15|18184.65|0.10|0.01|A|F|1993-10-13|1993-11-19|1993-11-10|COLLECT COD|SHIP|phs need to a +14595|1669|52|1|20|31413.20|0.01|0.05|N|O|1998-01-11|1998-02-27|1998-02-10|TAKE BACK RETURN|FOB|osits nag sly +14596|1969|58|1|28|52386.88|0.05|0.00|A|F|1994-01-30|1994-03-04|1994-02-15|TAKE BACK RETURN|TRUCK|ructions serve b +14596|1296|97|2|37|44299.73|0.00|0.03|A|F|1994-03-09|1994-03-06|1994-03-23|NONE|SHIP|y across the r +14596|32|58|3|7|6524.21|0.06|0.03|R|F|1994-04-18|1994-03-29|1994-04-21|COLLECT COD|MAIL|al instructions. care +14596|1450|90|4|31|41894.95|0.06|0.05|R|F|1994-02-06|1994-04-08|1994-02-21|DELIVER IN PERSON|FOB| pinto beans wake alo +14596|1698|81|5|8|12797.52|0.01|0.02|A|F|1994-04-20|1994-03-23|1994-05-10|COLLECT COD|TRUCK|encies haggle after the final +14596|1659|83|6|8|12485.20|0.09|0.04|R|F|1994-03-13|1994-04-02|1994-03-22|COLLECT COD|RAIL|uests doubt quickly. +14597|708|41|1|45|72391.50|0.09|0.06|A|F|1993-09-09|1993-10-21|1993-09-15|NONE|AIR|oost. always ironic platelets affix bli +14597|763|60|2|44|73205.44|0.00|0.05|R|F|1993-09-10|1993-10-29|1993-09-14|NONE|FOB|hely bold i +14597|1290|2|3|10|11912.90|0.07|0.00|R|F|1993-10-10|1993-09-30|1993-10-13|NONE|FOB| accounts haggle carefully. even, bold p +14597|1135|44|4|39|40409.07|0.04|0.01|R|F|1993-09-12|1993-11-26|1993-10-12|DELIVER IN PERSON|RAIL|jole after the even accoun +14597|349|50|5|48|59968.32|0.04|0.07|A|F|1993-11-24|1993-10-20|1993-12-16|COLLECT COD|AIR|yly packages. slyl +14597|1993|82|6|18|34109.82|0.01|0.04|R|F|1993-11-11|1993-11-14|1993-12-06|DELIVER IN PERSON|SHIP|lithely regul +14598|1504|25|1|43|60436.50|0.00|0.00|N|O|1998-05-30|1998-04-13|1998-06-19|NONE|TRUCK|en foxes sleep. furiousl +14598|1383|60|2|35|44953.30|0.07|0.03|N|O|1998-05-23|1998-03-17|1998-06-19|TAKE BACK RETURN|RAIL|regular requests sleep slow +14598|190|91|3|40|43607.60|0.08|0.06|N|O|1998-03-05|1998-03-17|1998-03-17|TAKE BACK RETURN|MAIL| slyly bra +14598|1370|47|4|13|16527.81|0.06|0.00|N|O|1998-03-30|1998-04-19|1998-04-08|COLLECT COD|REG AIR|ndencies cajole +14598|573|64|5|7|10314.99|0.06|0.02|N|O|1998-03-18|1998-04-28|1998-04-02|DELIVER IN PERSON|AIR|lithely even dependencie +14599|1228|29|1|12|13550.64|0.02|0.04|A|F|1992-09-03|1992-07-14|1992-09-14|NONE|MAIL|sual deposits sleep furiously ex +14624|1991|24|1|12|22715.88|0.03|0.08|N|O|1998-07-16|1998-06-28|1998-08-15|NONE|AIR| after the pending deposit +14624|859|59|2|35|61594.75|0.08|0.04|N|O|1998-06-18|1998-05-28|1998-06-25|DELIVER IN PERSON|RAIL|ly even deposits. fluffily unus +14624|848|48|3|21|36725.64|0.02|0.03|N|O|1998-06-23|1998-06-14|1998-06-25|DELIVER IN PERSON|FOB|ly special requests. fluffily reg +14624|1040|76|4|36|33877.44|0.01|0.02|N|O|1998-08-12|1998-05-24|1998-09-01|TAKE BACK RETURN|TRUCK|ess packages. furiously special acco +14624|1632|56|5|24|36807.12|0.05|0.07|N|O|1998-07-12|1998-06-27|1998-07-29|DELIVER IN PERSON|REG AIR|phins. final, ironic multipliers +14624|866|100|6|5|8834.30|0.07|0.08|N|O|1998-07-05|1998-06-22|1998-07-12|TAKE BACK RETURN|REG AIR|ng dependencies against +14624|760|93|7|6|9964.56|0.04|0.04|N|O|1998-05-07|1998-07-06|1998-05-26|TAKE BACK RETURN|MAIL|onic requests maintain along +14625|1109|18|1|2|2020.20|0.01|0.03|A|F|1992-03-10|1992-04-01|1992-04-01|DELIVER IN PERSON|REG AIR|ffily bold +14626|610|4|1|4|6042.44|0.01|0.03|N|O|1997-10-27|1997-09-26|1997-11-02|NONE|SHIP|requests. careful +14626|1882|83|2|19|33893.72|0.00|0.00|N|O|1997-09-04|1997-09-14|1997-09-23|DELIVER IN PERSON|SHIP|blithely slyly ironic +14626|1316|17|3|30|36519.30|0.02|0.07|N|O|1997-08-23|1997-10-06|1997-09-04|NONE|RAIL|gular excuses. slyly pendin +14626|128|81|4|41|42152.92|0.07|0.02|N|O|1997-08-14|1997-09-27|1997-08-18|COLLECT COD|TRUCK| packages wake slyly si +14627|188|41|1|40|43527.20|0.02|0.01|A|F|1994-04-23|1994-04-25|1994-04-24|NONE|REG AIR|nic instructions. ironic packages w +14627|986|55|2|1|1886.98|0.04|0.04|R|F|1994-03-29|1994-03-11|1994-04-04|NONE|SHIP|deas was slyly dogge +14627|775|72|3|33|55300.41|0.01|0.07|R|F|1994-02-15|1994-04-07|1994-03-04|DELIVER IN PERSON|MAIL|y silent foxes among the blithely r +14627|1106|43|4|38|38269.80|0.08|0.01|A|F|1994-02-18|1994-03-27|1994-03-19|DELIVER IN PERSON|SHIP|ges. blithely brave dependencies +14627|807|74|5|27|46110.60|0.00|0.07|R|F|1994-04-04|1994-04-19|1994-04-16|TAKE BACK RETURN|FOB|fully unusua +14627|264|65|6|18|20956.68|0.00|0.04|A|F|1994-05-01|1994-03-19|1994-05-03|COLLECT COD|AIR|nag slyly quickly even the +14627|113|40|7|2|2026.22|0.01|0.06|A|F|1994-05-31|1994-04-29|1994-06-09|TAKE BACK RETURN|AIR|regular dinos. fluffily +14628|703|4|1|50|80185.00|0.07|0.01|A|F|1993-08-08|1993-08-13|1993-08-18|TAKE BACK RETURN|MAIL|o integrate care +14629|1752|79|1|50|82687.50|0.06|0.01|A|F|1993-02-13|1993-02-21|1993-02-19|DELIVER IN PERSON|MAIL|en asymptotes lose caref +14630|1822|23|1|39|67228.98|0.02|0.04|A|F|1992-12-26|1992-11-20|1993-01-12|TAKE BACK RETURN|RAIL|ans sleep furiousl +14630|1832|62|2|40|69353.20|0.03|0.00|R|F|1992-11-27|1992-12-16|1992-12-17|DELIVER IN PERSON|TRUCK|ar pinto beans. regular platelets at +14630|1570|91|3|14|20601.98|0.07|0.01|R|F|1993-01-29|1993-01-02|1993-02-15|DELIVER IN PERSON|TRUCK|osits. carefully f +14630|1893|37|4|20|35897.80|0.08|0.03|R|F|1993-02-10|1993-01-10|1993-03-04|COLLECT COD|AIR|althy pinto beans wake. blithely +14631|1590|91|1|14|20882.26|0.01|0.03|N|O|1997-06-01|1997-07-12|1997-06-22|COLLECT COD|FOB|arefully bold deposits are slyly acr +14631|629|30|2|9|13766.58|0.05|0.01|N|O|1997-05-01|1997-07-02|1997-05-19|TAKE BACK RETURN|FOB|ges around the furiously special requests +14656|596|97|1|21|31428.39|0.09|0.00|N|O|1998-01-23|1997-12-23|1998-02-15|DELIVER IN PERSON|AIR|lar deposits. fluffily regular accounts w +14657|338|39|1|49|60678.17|0.04|0.08|A|F|1994-03-23|1994-04-18|1994-03-29|COLLECT COD|SHIP| pinto beans boost fu +14657|236|37|2|50|56811.50|0.09|0.03|A|F|1994-05-07|1994-05-06|1994-05-28|TAKE BACK RETURN|REG AIR|lar platelet +14658|968|69|1|3|5606.88|0.04|0.00|R|F|1994-04-08|1994-06-25|1994-05-03|COLLECT COD|TRUCK|ravely regular pinto beans. b +14658|133|34|2|40|41325.20|0.03|0.07|A|F|1994-04-10|1994-05-21|1994-05-01|DELIVER IN PERSON|REG AIR|among the sl +14659|737|2|1|47|76973.31|0.08|0.08|N|O|1998-03-28|1998-04-22|1998-03-30|TAKE BACK RETURN|SHIP| ironic, unu +14659|1726|69|2|18|29298.96|0.07|0.04|N|O|1998-06-08|1998-05-01|1998-06-20|TAKE BACK RETURN|FOB|ites. carefully +14659|453|54|3|16|21655.20|0.07|0.06|N|O|1998-05-06|1998-04-27|1998-05-22|COLLECT COD|TRUCK|s cajole carefully above the +14659|876|43|4|11|19545.57|0.03|0.02|N|O|1998-06-01|1998-05-04|1998-06-05|COLLECT COD|REG AIR|sleep finally fo +14660|1259|34|1|48|55692.00|0.10|0.04|N|O|1997-06-10|1997-07-02|1997-06-19|COLLECT COD|SHIP|accounts. slyly clos +14660|450|9|2|12|16205.40|0.04|0.07|N|O|1997-08-26|1997-08-09|1997-09-05|NONE|REG AIR|dolites are furiously. slyly ironic accou +14660|46|97|3|8|7568.32|0.06|0.07|N|O|1997-06-20|1997-08-10|1997-06-27|NONE|FOB|ymptotes haggl +14660|1721|48|4|39|63286.08|0.08|0.08|N|O|1997-06-07|1997-08-20|1997-07-06|DELIVER IN PERSON|REG AIR|en requests. the +14661|273|74|1|32|37544.64|0.00|0.02|R|F|1993-03-30|1993-03-24|1993-04-18|DELIVER IN PERSON|FOB|symptotes use. +14662|701|66|1|17|27228.90|0.02|0.03|N|O|1996-01-08|1995-12-22|1996-01-21|TAKE BACK RETURN|TRUCK|across the c +14662|701|98|2|4|6406.80|0.09|0.04|N|O|1996-01-05|1996-01-01|1996-01-20|TAKE BACK RETURN|TRUCK|lent requests integr +14662|1696|38|3|19|30356.11|0.03|0.05|N|O|1995-11-21|1996-02-01|1995-12-16|COLLECT COD|REG AIR|y final, ironic instructions. +14662|1315|16|4|18|21893.58|0.00|0.01|N|O|1996-02-15|1995-12-31|1996-02-19|TAKE BACK RETURN|AIR|unts. express pinto beans c +14662|545|46|5|48|69385.92|0.01|0.04|N|O|1995-11-21|1996-01-21|1995-12-13|DELIVER IN PERSON|RAIL|lar packages nag about the ca +14662|1131|40|6|41|42317.33|0.07|0.07|N|O|1996-02-18|1996-01-13|1996-03-09|TAKE BACK RETURN|AIR|he fluffily regular Ti +14663|1274|49|1|36|42309.72|0.06|0.03|A|F|1993-02-02|1992-12-23|1993-02-23|COLLECT COD|SHIP|elets. slyly +14663|1526|7|2|1|1427.52|0.00|0.01|A|F|1993-02-02|1992-12-21|1993-03-01|DELIVER IN PERSON|MAIL|ges wake fluffily. +14688|13|89|1|11|10043.11|0.04|0.08|N|O|1997-06-19|1997-04-04|1997-07-09|COLLECT COD|FOB|ies are express packages. unusual +14688|656|88|2|20|31133.00|0.01|0.01|N|O|1997-02-19|1997-04-11|1997-03-08|DELIVER IN PERSON|SHIP|ages along the carefully idle requests wa +14688|1731|58|3|10|16327.30|0.02|0.08|N|O|1997-03-14|1997-04-22|1997-04-05|COLLECT COD|AIR|riously even packages sleep a +14688|817|51|4|40|68712.40|0.00|0.00|N|O|1997-04-08|1997-04-06|1997-05-07|DELIVER IN PERSON|SHIP|ruthless packages. furiously special instru +14689|982|51|1|29|54606.42|0.05|0.06|N|O|1998-08-22|1998-09-11|1998-09-09|NONE|TRUCK|ly bold theodolites. t +14689|1484|24|2|6|8312.88|0.01|0.06|N|O|1998-08-30|1998-10-19|1998-09-01|COLLECT COD|FOB|tes are quickly regular packages. bold dep +14689|899|66|3|3|5399.67|0.10|0.07|N|O|1998-09-17|1998-10-21|1998-09-27|DELIVER IN PERSON|SHIP|hy requests. unusual, special cou +14690|874|74|1|23|40822.01|0.02|0.03|N|O|1997-09-16|1997-07-31|1997-10-03|COLLECT COD|SHIP| pinto beans. ironic platele +14691|297|25|1|23|27537.67|0.09|0.01|N|O|1998-06-21|1998-05-28|1998-06-28|DELIVER IN PERSON|MAIL|gedly regular ac +14691|451|52|2|42|56760.90|0.08|0.07|N|O|1998-07-26|1998-07-07|1998-08-01|DELIVER IN PERSON|SHIP|hlessly final requests-- unusual t +14692|1264|39|1|18|20974.68|0.01|0.00|N|O|1996-06-17|1996-05-15|1996-07-07|NONE|REG AIR|es alongside of the accounts nag according +14692|241|96|2|30|34237.20|0.06|0.02|N|O|1996-05-16|1996-03-29|1996-05-20|NONE|SHIP|arefully always even accounts. +14693|612|75|1|31|46890.91|0.01|0.03|A|F|1995-03-07|1995-02-10|1995-03-09|TAKE BACK RETURN|RAIL|packages are upon the packages. careful +14693|887|88|2|47|84030.36|0.06|0.04|A|F|1995-01-19|1995-02-22|1995-02-05|COLLECT COD|RAIL|ch slyly furio +14693|508|39|3|40|56340.00|0.10|0.03|A|F|1995-04-04|1995-02-25|1995-05-02|COLLECT COD|TRUCK|gainst the express, final accounts. fur +14693|743|8|4|16|26299.84|0.07|0.06|R|F|1995-01-24|1995-04-08|1995-02-13|NONE|FOB|e slyly; quickly f +14693|728|93|5|22|35831.84|0.01|0.07|A|F|1995-02-14|1995-04-07|1995-02-20|TAKE BACK RETURN|REG AIR|hall have to cajo +14694|503|4|1|45|63157.50|0.07|0.05|N|O|1998-11-21|1998-10-22|1998-11-26|DELIVER IN PERSON|SHIP|r, express packages wake. furiously re +14694|1645|46|2|17|26292.88|0.04|0.08|N|O|1998-11-01|1998-10-06|1998-11-04|DELIVER IN PERSON|TRUCK|slyly regular foxes. carefully regular +14694|1232|44|3|47|53261.81|0.05|0.02|N|O|1998-09-22|1998-10-13|1998-10-10|DELIVER IN PERSON|SHIP| the unusual +14694|20|46|4|33|30360.66|0.06|0.08|N|O|1998-08-11|1998-09-06|1998-09-10|DELIVER IN PERSON|AIR|rts. slyly even pinto +14694|1728|13|5|22|35853.84|0.06|0.02|N|O|1998-09-23|1998-08-30|1998-10-13|COLLECT COD|REG AIR|arefully special excuses. blit +14694|714|15|6|40|64588.40|0.05|0.02|N|O|1998-10-06|1998-10-03|1998-10-14|COLLECT COD|FOB|venly special requ +14694|1243|81|7|44|50346.56|0.06|0.07|N|O|1998-11-09|1998-10-25|1998-11-21|NONE|SHIP|the quickly express pinto beans. stealthi +14695|372|73|1|32|40715.84|0.08|0.01|A|F|1992-09-23|1992-10-16|1992-10-01|DELIVER IN PERSON|SHIP|g pinto beans are special theodolites. pend +14695|458|46|2|11|14942.95|0.01|0.00|R|F|1992-11-07|1992-11-20|1992-12-01|COLLECT COD|REG AIR|slyly final account +14695|1279|91|3|32|37768.64|0.04|0.04|R|F|1992-10-04|1992-12-01|1992-10-19|COLLECT COD|RAIL|orses. regular theodolites alo +14695|357|86|4|43|54066.05|0.09|0.08|A|F|1992-09-28|1992-10-22|1992-10-24|NONE|AIR|ely regular packages s +14695|1555|76|5|43|62631.65|0.06|0.05|A|F|1992-10-08|1992-12-02|1992-10-30|TAKE BACK RETURN|SHIP|lithely express asymptotes af +14720|446|47|1|23|30968.12|0.06|0.00|R|F|1993-10-06|1993-12-01|1993-10-23|TAKE BACK RETURN|RAIL|ges boost slyly sl +14720|1563|44|2|4|5858.24|0.00|0.01|A|F|1993-09-11|1993-11-27|1993-09-26|DELIVER IN PERSON|AIR|ly silent requests wake fluf +14720|1006|42|3|20|18140.00|0.08|0.06|R|F|1993-11-27|1993-11-09|1993-12-22|NONE|AIR|slyly unusual request +14720|1648|72|4|23|35641.72|0.04|0.07|R|F|1993-10-03|1993-11-13|1993-10-29|DELIVER IN PERSON|MAIL|ly ironic foxes cajole furiously. even +14720|1858|59|5|48|84472.80|0.10|0.08|A|F|1993-12-05|1993-11-24|1993-12-21|COLLECT COD|FOB|bout the ironic accounts sleep carefu +14721|1296|97|1|39|46694.31|0.08|0.08|N|O|1997-07-31|1997-07-28|1997-08-18|TAKE BACK RETURN|REG AIR|ely alongside of the unusual deposits! +14721|1518|59|2|37|52521.87|0.08|0.02|N|O|1997-07-06|1997-06-04|1997-07-28|TAKE BACK RETURN|RAIL|eodolites detect carefully ironic pinto +14721|790|87|3|21|35506.59|0.01|0.06|N|O|1997-06-03|1997-07-21|1997-06-16|NONE|AIR|e blithely sly accounts nag quickly abo +14721|1417|57|4|23|30323.43|0.06|0.03|N|O|1997-05-31|1997-07-08|1997-06-16|COLLECT COD|AIR|ess pinto beans cajo +14721|1334|49|5|3|3705.99|0.00|0.02|N|O|1997-08-16|1997-07-30|1997-09-06|COLLECT COD|MAIL|lar accounts. blithely ironic +14722|794|91|1|49|83044.71|0.06|0.01|N|O|1997-07-18|1997-07-14|1997-07-31|DELIVER IN PERSON|REG AIR|ests. unusual requests dete +14722|286|41|2|35|41519.80|0.03|0.08|N|O|1997-06-14|1997-07-31|1997-07-14|NONE|REG AIR|thely according to the +14722|129|30|3|49|50426.88|0.05|0.03|N|O|1997-08-11|1997-08-01|1997-08-12|TAKE BACK RETURN|SHIP|low foxes. bold deposits against +14722|1395|34|4|46|59633.94|0.02|0.03|N|O|1997-05-29|1997-07-28|1997-06-20|COLLECT COD|REG AIR|lyly ironic multi +14722|1445|85|5|25|33661.00|0.08|0.06|N|O|1997-09-08|1997-08-11|1997-10-05|NONE|AIR|ar requests. even platelets thrash blithely +14723|286|14|1|34|40333.52|0.02|0.02|N|O|1997-01-16|1997-03-17|1997-02-10|COLLECT COD|TRUCK|ironic accoun +14724|1302|17|1|36|43318.80|0.06|0.03|N|O|1996-02-06|1996-02-04|1996-02-11|COLLECT COD|MAIL| regular pinto +14725|1458|98|1|15|20391.75|0.07|0.04|N|O|1995-06-27|1995-07-17|1995-07-24|TAKE BACK RETURN|REG AIR|yly regular packages. +14725|1094|100|2|10|9950.90|0.03|0.02|N|O|1995-07-05|1995-07-29|1995-07-20|DELIVER IN PERSON|TRUCK|quickly ironic instruct +14725|791|24|3|14|23685.06|0.04|0.07|N|O|1995-07-08|1995-09-09|1995-07-20|COLLECT COD|RAIL|y ironic dependencies. sl +14725|1253|54|4|48|55404.00|0.04|0.00|N|O|1995-09-06|1995-07-28|1995-10-04|DELIVER IN PERSON|SHIP|s cajole furiously permanen +14725|859|60|5|50|87992.50|0.05|0.08|N|O|1995-09-06|1995-08-21|1995-09-29|NONE|MAIL|xpress the +14725|1181|82|6|22|23807.96|0.09|0.05|N|O|1995-08-11|1995-08-20|1995-09-09|TAKE BACK RETURN|SHIP| deposits. carefully sp +14725|899|100|7|23|41397.47|0.05|0.06|N|O|1995-06-24|1995-09-07|1995-07-03|COLLECT COD|TRUCK| furiously even theodolites believe bli +14726|1112|85|1|30|30393.30|0.09|0.05|A|F|1992-02-16|1992-03-27|1992-02-29|NONE|TRUCK| above the caref +14726|23|99|2|12|11076.24|0.00|0.08|A|F|1992-03-18|1992-02-08|1992-04-16|DELIVER IN PERSON|TRUCK|ar foxes nag sly +14726|921|22|3|30|54657.60|0.08|0.05|R|F|1992-01-13|1992-02-11|1992-01-28|DELIVER IN PERSON|TRUCK|s cajole above the busily +14727|1343|82|1|12|14932.08|0.10|0.05|R|F|1992-10-21|1992-09-01|1992-10-24|DELIVER IN PERSON|MAIL|ilent theodolites sleep sl +14727|1214|15|2|11|12267.31|0.03|0.04|R|F|1992-08-03|1992-08-19|1992-08-24|DELIVER IN PERSON|TRUCK|al packages sleep before the flu +14727|562|63|3|16|23400.96|0.03|0.06|A|F|1992-07-31|1992-08-21|1992-08-20|DELIVER IN PERSON|RAIL|y quickly +14727|539|70|4|38|54702.14|0.08|0.03|R|F|1992-10-26|1992-09-22|1992-11-17|NONE|RAIL|ts haggle slyly asymptotes. i +14752|1699|23|1|21|33614.49|0.08|0.02|R|F|1994-02-11|1994-03-19|1994-02-20|NONE|MAIL|y on the blithely regular dep +14753|421|22|1|23|30392.66|0.10|0.01|N|O|1997-01-13|1997-02-16|1997-01-23|DELIVER IN PERSON|SHIP|ptotes against the carefully pending pinto +14753|615|47|2|2|3031.22|0.08|0.06|N|O|1997-04-11|1997-03-31|1997-05-03|NONE|TRUCK|sleep quickly against the +14753|1552|73|3|10|14535.50|0.03|0.05|N|O|1997-02-02|1997-03-19|1997-02-03|TAKE BACK RETURN|FOB|ccounts. ironic instructions are fluf +14754|251|33|1|18|20722.50|0.03|0.03|N|O|1996-07-17|1996-08-27|1996-08-10|DELIVER IN PERSON|SHIP|usly final depths wake +14754|1029|35|2|8|7440.16|0.07|0.07|N|O|1996-08-23|1996-08-28|1996-09-03|COLLECT COD|MAIL|sleep carefully according to the regular +14754|487|75|3|12|16649.76|0.02|0.04|N|O|1996-06-30|1996-09-07|1996-07-16|TAKE BACK RETURN|MAIL|ests cajole fina +14754|1396|97|4|3|3892.17|0.06|0.07|N|O|1996-08-16|1996-08-17|1996-08-30|COLLECT COD|MAIL|as. quickly ir +14754|783|48|5|36|60616.08|0.10|0.08|N|O|1996-07-16|1996-08-05|1996-08-10|DELIVER IN PERSON|TRUCK|ncies sublate quickly against the final d +14754|1225|26|6|4|4504.88|0.10|0.08|N|O|1996-07-26|1996-08-23|1996-08-03|DELIVER IN PERSON|FOB|lly thin accounts; carefully +14755|322|23|1|48|58671.36|0.05|0.06|A|F|1993-02-24|1993-03-13|1993-03-18|COLLECT COD|TRUCK|s. even theodolites a +14755|1882|12|2|47|83842.36|0.01|0.05|R|F|1993-01-20|1993-03-13|1993-02-19|TAKE BACK RETURN|SHIP|y against the furiously brave ins +14755|926|29|3|31|56634.52|0.04|0.07|R|F|1993-04-01|1993-03-23|1993-04-02|DELIVER IN PERSON|AIR|rate regular packages. ca +14755|1863|93|4|14|24708.04|0.05|0.06|R|F|1993-01-22|1993-04-04|1993-02-11|NONE|MAIL|le blithely. bold, express deposits a +14755|1586|27|5|29|43139.82|0.08|0.08|R|F|1993-04-03|1993-02-11|1993-04-20|COLLECT COD|FOB| sheaves are. furiously even requests +14755|1693|17|6|36|57408.84|0.06|0.02|A|F|1993-04-26|1993-04-01|1993-05-17|TAKE BACK RETURN|RAIL|heodolites are. ironic, final theo +14755|146|47|7|30|31384.20|0.06|0.05|A|F|1993-02-19|1993-04-04|1993-03-20|COLLECT COD|AIR|y. ironic, ironic +14756|1890|91|1|43|77051.27|0.01|0.02|R|F|1994-11-12|1994-11-06|1994-11-13|COLLECT COD|TRUCK|ldly even packages; blithely ev +14756|847|48|2|23|40200.32|0.05|0.00|A|F|1994-10-05|1994-11-17|1994-10-21|COLLECT COD|REG AIR|tions upon the s +14756|304|61|3|9|10838.70|0.10|0.04|R|F|1994-12-27|1994-10-03|1995-01-11|TAKE BACK RETURN|AIR| regular asymptotes wake furiousl +14756|1124|33|4|6|6150.72|0.01|0.08|A|F|1994-10-09|1994-11-25|1994-10-14|NONE|AIR|he bold accounts boost slyly +14757|1362|39|1|43|54324.48|0.00|0.03|N|O|1998-04-14|1998-03-21|1998-05-11|TAKE BACK RETURN|REG AIR|tes are fluffily a +14758|1137|10|1|8|8305.04|0.09|0.07|R|F|1994-01-28|1994-01-04|1994-02-22|COLLECT COD|AIR|se alongside of the +14758|1134|43|2|9|9316.17|0.10|0.08|R|F|1994-02-06|1994-01-10|1994-02-12|DELIVER IN PERSON|AIR|al deposits wake blit +14758|849|83|3|6|10499.04|0.04|0.03|A|F|1994-02-21|1994-01-04|1994-03-20|COLLECT COD|TRUCK|efully furiously r +14758|263|91|4|2|2326.52|0.00|0.06|R|F|1993-12-13|1994-01-18|1994-01-02|DELIVER IN PERSON|MAIL|posits nag quic +14758|1723|8|5|5|8123.60|0.10|0.07|R|F|1994-01-03|1993-12-24|1994-01-20|DELIVER IN PERSON|RAIL|ial, pending deposits haggl +14759|1396|97|1|19|24650.41|0.01|0.03|N|O|1997-04-24|1997-03-22|1997-05-08|COLLECT COD|MAIL| furiously ironic pinto beans cajole expres +14759|358|87|2|13|16358.55|0.09|0.06|N|O|1997-02-19|1997-03-31|1997-03-05|DELIVER IN PERSON|RAIL| pinto beans. quickly express attainme +14784|529|20|1|36|51462.72|0.05|0.03|R|F|1992-05-11|1992-04-23|1992-05-19|DELIVER IN PERSON|FOB|r special accounts. fu +14784|1141|14|2|11|11463.54|0.05|0.01|R|F|1992-05-23|1992-05-31|1992-06-05|DELIVER IN PERSON|FOB|ously furiously special instructi +14784|239|67|3|21|23923.83|0.03|0.08|R|F|1992-04-10|1992-04-15|1992-04-27|COLLECT COD|AIR|ccounts haggle furiously beyond the regu +14784|1078|14|4|18|17623.26|0.03|0.02|R|F|1992-05-20|1992-05-21|1992-06-02|DELIVER IN PERSON|RAIL|lithely. blithely ironic dependencies bo +14784|1889|90|5|24|42981.12|0.06|0.08|R|F|1992-07-03|1992-05-30|1992-08-01|TAKE BACK RETURN|RAIL|n packages. enticing dolphins sleep. ca +14784|1278|53|6|37|43632.99|0.07|0.00|A|F|1992-06-29|1992-05-26|1992-07-01|COLLECT COD|SHIP|ic accounts. bold excuses integrate careful +14785|1142|79|1|3|3129.42|0.03|0.07|A|F|1994-12-22|1994-12-03|1995-01-10|NONE|RAIL|thy platelets wake. +14785|139|66|2|2|2078.26|0.01|0.05|A|F|1994-10-18|1994-12-07|1994-11-15|DELIVER IN PERSON|MAIL|uriously silent inst +14785|1524|65|3|3|4276.56|0.02|0.06|A|F|1995-01-05|1995-01-01|1995-01-24|TAKE BACK RETURN|MAIL|theodolites are care +14785|997|100|4|1|1897.99|0.01|0.08|R|F|1994-12-28|1994-12-31|1995-01-12|TAKE BACK RETURN|FOB|ages affix furiously excuses. +14785|1393|8|5|21|27182.19|0.04|0.02|R|F|1994-11-05|1994-11-30|1994-12-01|TAKE BACK RETURN|RAIL|long the ironic requests are about +14785|1173|10|6|5|5370.85|0.04|0.03|R|F|1994-10-14|1994-11-27|1994-11-12|COLLECT COD|AIR|he platelets can cajole +14785|1998|43|7|34|64599.66|0.04|0.03|R|F|1994-10-28|1994-12-28|1994-11-04|COLLECT COD|REG AIR| the special, regular theodoli +14786|1152|61|1|33|34753.95|0.02|0.00|N|O|1997-08-05|1997-05-29|1997-08-31|NONE|MAIL|its. pending, regular asymptotes doze qui +14787|1513|34|1|6|8487.06|0.10|0.08|N|O|1998-07-24|1998-09-20|1998-07-28|DELIVER IN PERSON|SHIP|al theodolites ca +14787|1412|13|2|50|65670.50|0.04|0.05|N|O|1998-10-23|1998-08-18|1998-11-08|TAKE BACK RETURN|SHIP|final asymptotes. pending, unusual patte +14787|1893|37|3|32|57436.48|0.01|0.07|N|O|1998-07-29|1998-09-02|1998-08-01|TAKE BACK RETURN|AIR|efully regular instructions nod slyly. p +14788|1370|71|1|41|52126.17|0.09|0.08|N|O|1997-11-05|1998-01-07|1997-11-27|DELIVER IN PERSON|SHIP|ording to the regular, pending foxes +14789|62|88|1|45|43292.70|0.07|0.06|A|F|1993-12-16|1994-02-05|1994-01-10|COLLECT COD|FOB|ut the final accounts. blith +14789|1681|82|2|45|71220.60|0.02|0.05|A|F|1994-03-31|1994-02-20|1994-04-30|COLLECT COD|AIR| ideas. requests cajole furiously r +14789|813|14|3|49|83976.69|0.02|0.05|A|F|1994-02-13|1994-02-01|1994-02-24|COLLECT COD|TRUCK|ests. special packages sleep; +14789|686|80|4|8|12693.44|0.10|0.04|R|F|1994-03-30|1994-01-24|1994-04-06|NONE|TRUCK|equests. bold +14790|1866|96|1|47|83089.42|0.02|0.06|N|O|1996-09-11|1996-10-09|1996-09-20|TAKE BACK RETURN|MAIL|e slowly with the stealthily regula +14790|274|75|2|30|35228.10|0.10|0.04|N|O|1996-09-14|1996-09-22|1996-10-04|TAKE BACK RETURN|SHIP|lyly ironic pinto be +14790|1661|44|3|39|60943.74|0.06|0.07|N|O|1996-09-17|1996-10-12|1996-10-12|DELIVER IN PERSON|AIR|use across the quickly ironic +14790|242|43|4|4|4568.96|0.06|0.00|N|O|1996-09-23|1996-11-01|1996-09-28|DELIVER IN PERSON|AIR|fily ironic dinos c +14790|82|83|5|10|9820.80|0.06|0.04|N|O|1996-09-23|1996-09-23|1996-09-28|TAKE BACK RETURN|MAIL|lar sauternes +14790|282|10|6|28|33103.84|0.00|0.02|N|O|1996-12-02|1996-09-27|1996-12-27|TAKE BACK RETURN|SHIP| accounts; careful accounts +14790|173|100|7|42|45073.14|0.07|0.00|N|O|1996-10-24|1996-10-18|1996-11-22|TAKE BACK RETURN|FOB|regular platele +14791|45|46|1|25|23626.00|0.06|0.05|R|F|1993-03-06|1993-04-10|1993-03-27|DELIVER IN PERSON|AIR|bold packages. furiously pending de +14791|350|79|2|50|62517.50|0.05|0.01|R|F|1993-06-05|1993-04-27|1993-06-14|DELIVER IN PERSON|AIR|the regular frays. fluffily ir +14791|678|41|3|2|3157.34|0.01|0.02|R|F|1993-04-06|1993-04-06|1993-04-30|COLLECT COD|RAIL|ts. orbits wake blithely furiously re +14816|1498|16|1|47|65776.03|0.05|0.01|R|F|1993-08-07|1993-09-23|1993-08-13|NONE|FOB|ording to the acc +14816|1892|22|2|15|26908.35|0.04|0.04|R|F|1993-08-26|1993-09-16|1993-09-08|DELIVER IN PERSON|MAIL|carefully ironic dugou +14817|852|52|1|27|47326.95|0.04|0.00|A|F|1992-08-29|1992-09-04|1992-09-18|COLLECT COD|FOB|press pinto beans. iro +14817|1864|94|2|24|42380.64|0.10|0.04|R|F|1992-08-21|1992-09-14|1992-09-20|TAKE BACK RETURN|AIR|y even ideas wake slyly a +14817|190|91|3|5|5450.95|0.05|0.08|A|F|1992-08-15|1992-09-07|1992-08-26|TAKE BACK RETURN|SHIP|into beans sleep furiousl +14817|534|95|4|25|35863.25|0.10|0.04|A|F|1992-08-03|1992-10-17|1992-08-07|NONE|TRUCK|. deposits are carefully. slyly expre +14817|1057|93|5|15|14370.75|0.08|0.08|R|F|1992-08-01|1992-09-28|1992-08-07|NONE|TRUCK| ironic, express gifts-- blith +14818|1269|70|1|34|39788.84|0.00|0.04|N|O|1997-01-25|1997-02-05|1997-02-07|DELIVER IN PERSON|SHIP|the slyly regula +14818|1925|58|2|24|43846.08|0.10|0.08|N|O|1997-01-05|1997-02-09|1997-01-16|DELIVER IN PERSON|REG AIR|le slyly regular theodolites. furiously eve +14818|483|42|3|1|1383.48|0.08|0.05|N|O|1997-02-23|1997-01-06|1997-03-01|NONE|AIR|ilent theodolites print regular, unusu +14818|482|83|4|22|30414.56|0.08|0.03|N|O|1997-02-03|1997-02-13|1997-02-19|NONE|MAIL|uts detect regular, regular depo +14818|878|45|5|26|46250.62|0.05|0.03|N|O|1996-12-09|1997-01-16|1996-12-21|COLLECT COD|REG AIR|ts sleep carefully after th +14818|1844|31|6|13|22695.92|0.06|0.06|N|O|1997-02-20|1997-02-09|1997-03-14|COLLECT COD|MAIL|unusual deposits haggle blithely quick +14819|1158|31|1|10|10591.50|0.01|0.04|A|F|1993-05-23|1993-03-16|1993-05-28|DELIVER IN PERSON|FOB|ording to the dogged pearls. quickly pen +14819|639|33|2|9|13856.67|0.07|0.04|R|F|1993-02-27|1993-03-23|1993-03-20|COLLECT COD|RAIL|long the accounts. furiously e +14819|1709|36|3|49|78924.30|0.09|0.03|A|F|1993-05-13|1993-02-25|1993-05-17|COLLECT COD|FOB|kages wake blithely. +14819|593|24|4|28|41820.52|0.00|0.04|A|F|1993-04-17|1993-03-16|1993-05-04|TAKE BACK RETURN|SHIP|ular instructions. r +14820|1314|53|1|9|10937.79|0.05|0.02|A|F|1992-03-04|1992-02-13|1992-03-31|COLLECT COD|SHIP| foxes sleep +14820|1883|13|2|46|82104.48|0.01|0.08|R|F|1992-03-09|1992-03-28|1992-03-16|DELIVER IN PERSON|REG AIR|ges cajole carefully regular request +14820|1694|95|3|38|60636.22|0.05|0.07|R|F|1992-02-21|1992-02-27|1992-03-17|DELIVER IN PERSON|SHIP|ep slyly after the f +14821|72|73|1|28|27217.96|0.00|0.00|N|O|1998-10-03|1998-07-31|1998-10-10|NONE|TRUCK|old packages. furious +14821|1351|52|2|39|48841.65|0.00|0.04|N|O|1998-07-05|1998-09-09|1998-07-12|COLLECT COD|FOB|requests sleep carefully among the fu +14821|1099|5|3|22|22001.98|0.09|0.07|N|O|1998-10-10|1998-09-10|1998-10-13|NONE|FOB|le careful +14821|1774|17|4|27|45245.79|0.06|0.06|N|O|1998-06-13|1998-08-31|1998-07-09|DELIVER IN PERSON|SHIP|posits dazzle blithely quickly express acco +14821|1853|97|5|45|78968.25|0.02|0.06|N|O|1998-10-07|1998-07-30|1998-11-05|TAKE BACK RETURN|MAIL|instructions. blithely bold deposit +14821|1560|81|6|39|57000.84|0.08|0.03|N|O|1998-08-14|1998-08-11|1998-08-27|DELIVER IN PERSON|MAIL|ely across the idly spec +14821|45|46|7|43|40636.72|0.01|0.03|N|O|1998-09-27|1998-07-17|1998-10-26|COLLECT COD|AIR|fluffily final deposits eat. furiousl +14822|1832|62|1|23|39878.09|0.06|0.04|N|O|1996-07-22|1996-06-05|1996-08-13|DELIVER IN PERSON|AIR|ironic dep +14822|1992|25|2|29|54925.71|0.08|0.04|N|O|1996-04-21|1996-06-17|1996-05-11|COLLECT COD|TRUCK| fluffily silent multiplier +14822|388|45|3|34|43804.92|0.02|0.02|N|O|1996-06-05|1996-05-29|1996-07-05|COLLECT COD|SHIP|old accounts nag quickly ironic, bold req +14822|368|69|4|38|48197.68|0.06|0.04|N|O|1996-06-22|1996-05-26|1996-07-16|NONE|MAIL|e about the +14823|168|21|1|29|30976.64|0.08|0.04|A|F|1994-03-06|1994-04-12|1994-03-22|TAKE BACK RETURN|FOB|ly final ideas affix daringly across the sl +14823|301|86|2|35|42045.50|0.01|0.00|R|F|1994-05-21|1994-04-06|1994-05-25|NONE|TRUCK|al accounts across the +14823|1300|38|3|31|37240.30|0.01|0.02|A|F|1994-02-22|1994-04-10|1994-03-20|COLLECT COD|SHIP|y bold theodolites-- f +14823|1909|10|4|47|85112.30|0.10|0.06|A|F|1994-04-22|1994-03-27|1994-05-22|NONE|MAIL|uctions x-ray slyly quic +14848|345|74|1|4|4981.36|0.00|0.06|N|O|1996-12-06|1996-12-09|1996-12-27|COLLECT COD|MAIL|e. furiously pending req +14848|1862|63|2|38|67026.68|0.02|0.07|N|O|1996-11-16|1996-12-15|1996-11-17|TAKE BACK RETURN|AIR|ts above t +14848|1507|28|3|11|15493.50|0.05|0.05|N|O|1997-01-11|1997-01-14|1997-01-25|DELIVER IN PERSON|SHIP|gular packages. quickly regul +14848|1403|21|4|5|6522.00|0.10|0.01|N|O|1996-10-26|1997-01-01|1996-11-08|COLLECT COD|AIR|on the special instructions wake slyly alon +14848|1852|96|5|7|12276.95|0.08|0.05|N|O|1996-10-27|1997-01-03|1996-11-01|COLLECT COD|SHIP|ely regular tithes; regular +14848|85|11|6|6|5910.48|0.01|0.06|N|O|1997-01-15|1996-11-30|1997-01-28|NONE|AIR|among the express pinto beans. fluffily +14849|583|44|1|3|4450.74|0.08|0.08|N|O|1997-03-03|1997-04-07|1997-03-11|NONE|AIR|bout the stea +14849|61|87|2|27|25948.62|0.07|0.07|N|O|1997-06-03|1997-05-02|1997-06-20|COLLECT COD|RAIL| shall boost? quickly special theo +14849|1433|34|3|2|2668.86|0.07|0.00|N|O|1997-03-20|1997-04-27|1997-04-05|NONE|RAIL|s maintain bli +14849|425|84|4|25|33135.50|0.04|0.04|N|O|1997-04-17|1997-03-18|1997-05-10|DELIVER IN PERSON|REG AIR|pinto bean +14849|44|70|5|19|17936.76|0.10|0.04|N|O|1997-02-22|1997-05-04|1997-03-11|NONE|AIR|der blithely +14850|1775|76|1|8|13414.16|0.06|0.07|N|O|1998-03-27|1998-01-08|1998-04-16|TAKE BACK RETURN|REG AIR| after the dolp +14850|59|85|2|41|39321.05|0.01|0.03|N|O|1998-02-18|1998-01-04|1998-03-10|COLLECT COD|TRUCK|lar, regular +14850|1146|83|3|28|29319.92|0.01|0.03|N|O|1998-04-02|1998-02-01|1998-04-29|COLLECT COD|MAIL|s impress never about the slyly express +14850|671|34|4|15|23575.05|0.03|0.07|N|O|1998-02-19|1998-01-03|1998-02-27|DELIVER IN PERSON|REG AIR|osits use busily regular, regu +14850|1776|3|5|47|78855.19|0.07|0.00|N|O|1998-03-22|1998-01-12|1998-04-17|NONE|AIR|requests are furiously above the furiou +14850|327|12|6|40|49092.80|0.07|0.01|N|O|1997-12-07|1998-02-05|1998-01-06|NONE|FOB|he express instructions. furiously +14851|1281|19|1|23|27192.44|0.09|0.04|R|F|1992-06-06|1992-07-18|1992-06-07|DELIVER IN PERSON|TRUCK|he pending ideas. quickly final pi +14851|1662|63|2|25|39091.50|0.06|0.03|R|F|1992-08-10|1992-06-27|1992-08-28|DELIVER IN PERSON|RAIL|eodolites unwind blithely according to th +14851|758|59|3|23|38151.25|0.08|0.02|R|F|1992-07-27|1992-06-25|1992-07-28|DELIVER IN PERSON|FOB| asymptotes wake. ironic accounts boost ir +14851|317|46|4|29|35301.99|0.04|0.05|R|F|1992-08-03|1992-07-12|1992-08-16|NONE|REG AIR|ajole furiously furiously regular acc +14851|583|44|5|9|13352.22|0.10|0.02|R|F|1992-08-05|1992-07-13|1992-08-29|DELIVER IN PERSON|SHIP|ously special foxe +14851|1879|66|6|49|87262.63|0.09|0.04|A|F|1992-07-29|1992-07-26|1992-08-20|NONE|RAIL|cies lose blithely furiously regu +14852|257|39|1|22|25459.50|0.03|0.03|N|O|1996-03-26|1996-02-08|1996-04-25|DELIVER IN PERSON|FOB|al pinto beans according +14852|165|92|2|9|9586.44|0.05|0.01|N|O|1996-01-12|1996-02-16|1996-01-25|TAKE BACK RETURN|RAIL|hely final deposits a +14853|1213|14|1|16|17827.36|0.07|0.00|N|O|1996-11-19|1996-12-02|1996-11-26|COLLECT COD|AIR|ld packages acros +14853|1925|14|2|46|84038.32|0.03|0.08|N|O|1996-12-25|1996-11-02|1996-12-26|DELIVER IN PERSON|MAIL|among the slyly re +14853|827|27|3|18|31100.76|0.00|0.00|N|O|1996-12-01|1996-11-20|1996-12-08|TAKE BACK RETURN|RAIL|nts. slyly blithe +14853|186|87|4|16|17378.88|0.02|0.01|N|O|1996-11-18|1996-10-10|1996-12-04|DELIVER IN PERSON|TRUCK|etly accounts. e +14854|1698|99|1|20|31993.80|0.10|0.04|A|F|1993-04-30|1993-06-30|1993-05-08|DELIVER IN PERSON|REG AIR|. blithely final instructions ha +14854|1836|66|2|3|5213.49|0.00|0.07|R|F|1993-08-27|1993-07-26|1993-09-09|DELIVER IN PERSON|AIR| ironic pinto beans use blithely around +14854|1867|97|3|9|15919.74|0.00|0.00|R|F|1993-06-17|1993-06-21|1993-07-14|COLLECT COD|FOB|s dolphins. ironic +14854|1194|95|4|23|25189.37|0.04|0.00|R|F|1993-05-24|1993-07-09|1993-06-14|DELIVER IN PERSON|TRUCK|is integrate quickly dep +14855|940|43|1|2|3681.88|0.09|0.06|A|F|1993-08-13|1993-06-16|1993-08-28|COLLECT COD|RAIL|he blithely fin +14855|1280|18|2|28|33075.84|0.04|0.01|R|F|1993-08-04|1993-06-11|1993-08-20|DELIVER IN PERSON|AIR|ronic packages. slyly +14855|184|85|3|49|53124.82|0.01|0.01|R|F|1993-06-30|1993-06-28|1993-07-06|DELIVER IN PERSON|TRUCK|ckages cajole furiously carefull +14855|119|46|4|43|43821.73|0.06|0.06|A|F|1993-05-16|1993-06-13|1993-06-03|NONE|SHIP|t the slyly +14855|1422|40|5|7|9263.94|0.08|0.08|A|F|1993-08-02|1993-07-22|1993-08-14|DELIVER IN PERSON|REG AIR|uickly regular pinto be +14880|1791|92|1|26|44012.54|0.02|0.03|N|O|1998-02-25|1998-02-18|1998-03-22|DELIVER IN PERSON|RAIL|nts detect. final pinto beans are. furio +14880|1728|29|2|42|68448.24|0.04|0.03|N|O|1997-12-11|1998-01-14|1997-12-24|COLLECT COD|RAIL|bove the final, spec +14880|1977|22|3|23|43216.31|0.09|0.01|N|O|1998-01-10|1998-01-24|1998-02-08|TAKE BACK RETURN|MAIL|nag furiously. fu +14880|1474|14|4|17|23382.99|0.06|0.01|N|O|1998-02-07|1998-01-04|1998-02-08|NONE|FOB|out the ideas. foxes cajole carefully +14880|1802|46|5|13|22149.40|0.01|0.03|N|O|1998-01-25|1998-02-12|1998-02-01|NONE|REG AIR|dencies. bli +14880|1773|100|6|8|13398.16|0.10|0.06|N|O|1998-01-17|1998-01-20|1998-02-12|NONE|REG AIR|-- final instructi +14881|1793|20|1|35|59317.65|0.07|0.03|N|O|1996-10-30|1996-12-14|1996-11-25|NONE|AIR|regular accoun +14881|37|13|2|35|32796.05|0.04|0.00|N|O|1996-11-18|1997-01-08|1996-12-07|NONE|MAIL|nal deposits alongside of the +14881|619|20|3|23|34951.03|0.00|0.08|N|O|1996-11-20|1996-12-21|1996-12-03|TAKE BACK RETURN|REG AIR|cing excuses sleep slyly +14882|1395|10|1|35|45373.65|0.08|0.01|N|O|1997-05-26|1997-03-22|1997-06-25|DELIVER IN PERSON|TRUCK|r accounts. the +14882|322|79|2|41|50115.12|0.08|0.03|N|O|1997-03-18|1997-04-05|1997-03-21|TAKE BACK RETURN|MAIL|s. account +14883|1806|50|1|37|63188.60|0.02|0.03|N|O|1995-09-05|1995-06-07|1995-09-11|DELIVER IN PERSON|MAIL|into beans wake bl +14883|549|80|2|23|33339.42|0.00|0.07|A|F|1995-05-24|1995-07-16|1995-05-31|NONE|SHIP|ts cajole permanently +14883|79|80|3|9|8811.63|0.01|0.04|N|O|1995-06-20|1995-07-07|1995-07-17|COLLECT COD|FOB|ong the carefully regul +14883|337|94|4|9|11135.97|0.10|0.00|N|O|1995-07-16|1995-07-11|1995-08-06|COLLECT COD|AIR|ccounts. express, unusual foxes wa +14883|1670|71|5|8|12573.36|0.04|0.04|N|O|1995-07-10|1995-07-31|1995-07-12|NONE|MAIL|g packages. furiously unusual packages s +14883|82|83|6|18|17677.44|0.02|0.03|N|O|1995-07-16|1995-06-16|1995-07-20|COLLECT COD|FOB|its. permanentl +14884|288|16|1|37|43966.36|0.10|0.00|N|O|1995-11-26|1995-12-03|1995-12-09|DELIVER IN PERSON|TRUCK| quickly slyly final theodolites. qu +14884|680|12|2|18|28452.24|0.08|0.08|N|O|1995-10-05|1995-11-06|1995-10-17|COLLECT COD|REG AIR|y unusual accounts +14884|1075|46|3|42|40994.94|0.03|0.01|N|O|1995-12-09|1995-12-24|1995-12-19|TAKE BACK RETURN|MAIL|regular epitaph +14884|7|8|4|17|15419.00|0.00|0.05|N|O|1995-11-26|1995-10-29|1995-12-19|NONE|TRUCK| cajole furiously regular, bol +14884|1778|79|5|30|50393.10|0.08|0.08|N|O|1995-10-27|1995-12-13|1995-11-04|DELIVER IN PERSON|TRUCK|press dolphins. final excuses about +14884|1781|82|6|34|57214.52|0.08|0.07|N|O|1995-11-19|1995-10-28|1995-11-29|TAKE BACK RETURN|MAIL|. slyly express account +14884|191|44|7|42|45829.98|0.01|0.05|N|O|1996-01-11|1995-12-26|1996-02-02|COLLECT COD|FOB|luffily pending dolphins-- fi +14885|362|47|1|15|18935.40|0.09|0.02|N|O|1997-11-04|1997-11-16|1997-11-10|TAKE BACK RETURN|RAIL| asymptotes across the +14885|392|93|2|28|36186.92|0.07|0.06|N|O|1998-01-15|1997-11-10|1998-02-09|TAKE BACK RETURN|FOB|above the carefully regular +14885|1989|78|3|2|3781.96|0.00|0.08|N|O|1997-11-21|1997-10-27|1997-12-09|NONE|FOB|e furiously express ideas. furiou +14885|673|5|4|37|58225.79|0.09|0.08|N|O|1997-12-23|1997-11-16|1998-01-08|DELIVER IN PERSON|AIR|uests. fluffily pending accounts accord +14885|1342|81|5|40|49733.60|0.05|0.06|N|O|1997-10-17|1997-12-11|1997-11-15|NONE|RAIL|e fluffily even packages use blithel +14885|477|65|6|30|41324.10|0.04|0.01|N|O|1997-12-04|1997-11-17|1997-12-09|COLLECT COD|SHIP| the requests hang slyly a +14885|460|90|7|42|57139.32|0.02|0.01|N|O|1997-10-19|1997-11-08|1997-11-14|TAKE BACK RETURN|AIR|ng to the regular, ironic pinto beans. bo +14886|1610|93|1|50|75580.50|0.02|0.01|A|F|1994-08-08|1994-08-06|1994-08-20|COLLECT COD|AIR| to the packages. +14886|957|26|2|5|9289.75|0.04|0.08|A|F|1994-07-04|1994-07-24|1994-07-07|COLLECT COD|TRUCK| requests. ironic instructio +14887|1487|27|1|23|31935.04|0.05|0.04|N|O|1996-07-08|1996-06-05|1996-07-10|NONE|SHIP|unusual grouches. blithely ironic +14887|1335|12|2|34|42035.22|0.08|0.06|N|O|1996-07-16|1996-05-11|1996-08-04|DELIVER IN PERSON|REG AIR|are quickly alongside of th +14887|265|93|3|14|16313.64|0.02|0.05|N|O|1996-07-16|1996-06-16|1996-08-09|COLLECT COD|RAIL|the quickly final excuses? fluffily even +14887|615|47|4|23|34859.03|0.06|0.08|N|O|1996-04-02|1996-05-22|1996-04-29|NONE|MAIL|unts above the +14912|353|38|1|14|17546.90|0.02|0.02|R|F|1993-11-16|1994-01-24|1993-12-09|COLLECT COD|AIR|the pinto beans-- express deposi +14912|569|30|2|7|10286.92|0.02|0.05|R|F|1993-12-20|1993-12-28|1993-12-22|DELIVER IN PERSON|MAIL| even ideas. unusual deposits sleep slyly +14913|1695|37|1|27|43110.63|0.10|0.06|A|F|1994-03-14|1994-05-03|1994-04-09|NONE|FOB|pinto beans sleep carefull +14913|836|3|2|12|20841.96|0.05|0.01|R|F|1994-05-13|1994-04-20|1994-06-09|NONE|MAIL|ticingly regular courts boost. care +14913|413|72|3|10|13134.10|0.03|0.04|A|F|1994-04-23|1994-04-30|1994-05-22|NONE|SHIP| even, silent deposits. bold, iro +14913|468|98|4|44|60212.24|0.00|0.06|A|F|1994-03-31|1994-03-31|1994-04-05|TAKE BACK RETURN|AIR|cial instructions wake +14913|792|93|5|25|42319.75|0.10|0.05|A|F|1994-03-11|1994-03-28|1994-03-31|TAKE BACK RETURN|TRUCK| unusual, express ideas sleep slyly. +14914|867|67|1|20|35357.20|0.08|0.08|N|O|1998-05-26|1998-05-05|1998-06-02|NONE|SHIP|ests alongsid +14914|514|15|2|38|53751.38|0.04|0.02|N|O|1998-03-17|1998-04-26|1998-04-04|TAKE BACK RETURN|RAIL|even pinto beans against the quickly reg +14914|1092|63|3|20|19861.80|0.07|0.05|N|O|1998-04-03|1998-04-24|1998-04-10|TAKE BACK RETURN|MAIL|oxes. fluffily e +14914|1601|25|4|19|28549.40|0.06|0.05|N|O|1998-05-28|1998-03-25|1998-06-22|NONE|MAIL|es are always against the ir +14914|495|83|5|24|33491.76|0.10|0.02|N|O|1998-02-17|1998-05-09|1998-03-04|TAKE BACK RETURN|MAIL|y permanent foxes b +14914|1502|23|6|20|28070.00|0.10|0.01|N|O|1998-02-19|1998-04-29|1998-03-21|TAKE BACK RETURN|TRUCK|nding depos +14915|824|25|1|1|1724.82|0.06|0.06|N|O|1996-11-22|1996-11-25|1996-12-11|NONE|FOB|ual sheaves sleep +14915|380|65|2|45|57617.10|0.00|0.01|N|O|1997-01-08|1996-10-27|1997-01-22|NONE|SHIP| carefully express instructions. carefu +14916|201|2|1|25|27530.00|0.04|0.07|A|F|1994-05-07|1994-04-20|1994-06-03|TAKE BACK RETURN|FOB|cajole. silent accounts nod iron +14916|135|36|2|43|44510.59|0.04|0.03|A|F|1994-06-26|1994-04-18|1994-07-25|DELIVER IN PERSON|REG AIR|ests doubt furiously. bold +14917|445|4|1|26|34981.44|0.08|0.01|N|O|1998-04-25|1998-03-14|1998-05-07|COLLECT COD|SHIP|nic theodolites. theodolites +14917|1731|74|2|29|47349.17|0.05|0.03|N|O|1998-03-24|1998-02-20|1998-03-28|NONE|FOB|nusual theodolit +14917|1899|86|3|48|86442.72|0.08|0.07|N|O|1998-03-05|1998-04-11|1998-03-13|COLLECT COD|TRUCK|g theodolites affix slyly fina +14917|86|12|4|40|39443.20|0.04|0.06|N|O|1998-02-20|1998-03-13|1998-03-14|COLLECT COD|TRUCK|g bravely. fu +14917|1919|20|5|21|38239.11|0.04|0.05|N|O|1998-02-18|1998-04-01|1998-03-02|DELIVER IN PERSON|AIR|as above the regular excuses ha +14917|62|88|6|43|41368.58|0.10|0.03|N|O|1998-05-11|1998-04-07|1998-05-12|DELIVER IN PERSON|AIR|e. final, pending pint +14918|272|27|1|33|38684.91|0.04|0.05|N|O|1997-09-04|1997-08-30|1997-09-11|TAKE BACK RETURN|FOB|he blithely +14918|1294|95|2|24|28686.96|0.00|0.02|N|O|1997-06-20|1997-08-11|1997-07-10|COLLECT COD|FOB| the pending, e +14919|526|17|1|24|34236.48|0.00|0.07|N|O|1996-09-29|1996-11-09|1996-10-16|COLLECT COD|AIR|jole quickly blith +14944|1734|35|1|50|81786.50|0.01|0.05|N|O|1997-11-30|1997-12-08|1997-12-11|COLLECT COD|RAIL|ges. slyly special requ +14944|1733|18|2|21|34329.33|0.05|0.06|N|O|1998-01-11|1997-12-01|1998-01-26|TAKE BACK RETURN|AIR|uriously express platelets +14945|94|95|1|28|27834.52|0.05|0.06|N|O|1996-07-04|1996-06-09|1996-07-23|COLLECT COD|MAIL|o the regular, regular asymptotes. c +14945|1878|22|2|24|42716.88|0.10|0.03|N|O|1996-05-27|1996-05-05|1996-06-01|NONE|REG AIR|to the carefully eve +14945|1453|54|3|38|51469.10|0.01|0.05|N|O|1996-04-29|1996-04-30|1996-05-20|TAKE BACK RETURN|SHIP|eposits. fluff +14945|547|38|4|2|2895.08|0.09|0.07|N|O|1996-07-03|1996-05-13|1996-07-16|COLLECT COD|FOB|tween the expres +14945|85|86|5|44|43343.52|0.08|0.03|N|O|1996-06-20|1996-05-03|1996-07-14|DELIVER IN PERSON|RAIL|ly around the furiously regular +14945|1393|8|6|37|47892.43|0.05|0.00|N|O|1996-07-02|1996-05-15|1996-07-31|NONE|FOB|ironic asymptotes. +14946|53|79|1|38|36215.90|0.00|0.04|N|O|1996-12-13|1997-02-04|1997-01-08|NONE|MAIL|pon the blithely final courts. bl +14946|795|60|2|37|62744.23|0.01|0.01|N|O|1996-11-27|1997-02-01|1996-11-29|COLLECT COD|AIR|sleep furiously after the furio +14947|312|41|1|14|16972.34|0.09|0.02|N|O|1995-11-05|1995-09-25|1995-11-27|TAKE BACK RETURN|RAIL|bout the even, iro +14947|1071|72|2|29|28190.03|0.04|0.06|N|O|1995-11-08|1995-08-30|1995-12-03|TAKE BACK RETURN|FOB|inal sentiments t +14947|1869|13|3|33|58438.38|0.08|0.07|N|O|1995-10-24|1995-10-05|1995-11-18|NONE|SHIP|iously unusual pinto beans. fluffily regula +14947|783|80|4|38|63983.64|0.06|0.05|N|O|1995-09-10|1995-09-23|1995-09-22|NONE|SHIP|nstructions. final accou +14948|1625|26|1|39|59538.18|0.09|0.01|N|F|1995-06-13|1995-07-03|1995-06-23|NONE|MAIL|ckly regular accounts wak +14948|217|99|2|16|17875.36|0.02|0.02|N|O|1995-09-25|1995-07-26|1995-10-08|COLLECT COD|RAIL|nal platelets. unusual instructions c +14948|611|74|3|40|60464.40|0.10|0.03|N|O|1995-07-12|1995-07-06|1995-08-05|TAKE BACK RETURN|TRUCK| across the bold theodolites wake caref +14949|618|50|1|34|51632.74|0.02|0.05|R|F|1994-02-14|1993-12-30|1994-03-03|TAKE BACK RETURN|AIR|ages. carefully regular de +14949|1369|84|2|34|43192.24|0.00|0.06|A|F|1993-11-27|1993-12-29|1993-12-05|TAKE BACK RETURN|TRUCK|le slyly accounts. +14949|1377|54|3|4|5113.48|0.01|0.07|A|F|1994-01-21|1993-12-31|1994-02-09|COLLECT COD|FOB|equests are about the fluffily expr +14949|839|73|4|24|41755.92|0.01|0.04|A|F|1993-11-30|1994-01-26|1993-12-09|NONE|MAIL|riously bol +14949|858|25|5|1|1758.85|0.04|0.02|R|F|1994-01-25|1993-12-02|1994-02-06|DELIVER IN PERSON|TRUCK|d ideas haggle slyly according to the dari +14949|330|15|6|4|4921.32|0.02|0.07|A|F|1994-02-22|1993-12-31|1994-03-11|TAKE BACK RETURN|AIR|pecial dependencies among the slyly +14950|245|27|1|49|56116.76|0.03|0.02|R|F|1993-10-28|1993-11-28|1993-11-10|NONE|AIR|al packages detect fur +14950|1688|71|2|49|77894.32|0.02|0.00|A|F|1993-11-04|1993-10-30|1993-12-04|DELIVER IN PERSON|TRUCK|e slyly quiet accounts nod car +14951|509|40|1|47|66246.50|0.02|0.06|N|O|1995-08-13|1995-07-27|1995-08-16|TAKE BACK RETURN|RAIL|final packages believe fluffily. care +14951|1640|41|2|44|67832.16|0.09|0.02|N|O|1995-06-22|1995-06-25|1995-07-17|COLLECT COD|AIR|its. pending instructions use furi +14951|1494|34|3|9|12559.41|0.04|0.02|N|O|1995-07-09|1995-07-15|1995-07-30|TAKE BACK RETURN|FOB| instructions cajole aft +14951|1852|53|4|42|73661.70|0.05|0.02|N|O|1995-08-22|1995-06-28|1995-09-21|DELIVER IN PERSON|MAIL|encies. fi +14951|341|70|5|1|1241.34|0.06|0.05|N|O|1995-08-21|1995-07-19|1995-09-13|COLLECT COD|FOB|counts haggle blithely above +14951|1925|26|6|5|9134.60|0.01|0.04|N|O|1995-09-09|1995-07-28|1995-09-13|COLLECT COD|FOB|ic pearls +14976|563|24|1|31|45370.36|0.07|0.04|N|O|1995-09-22|1995-10-05|1995-09-23|NONE|REG AIR|bove the carefully expr +14976|490|78|2|41|57010.09|0.05|0.04|N|O|1995-07-29|1995-10-02|1995-08-01|TAKE BACK RETURN|AIR|es detect ruthlessly. slyly careful +14976|110|37|3|22|22222.42|0.00|0.04|N|O|1995-11-12|1995-09-26|1995-11-27|TAKE BACK RETURN|SHIP|jole furiously. unusual depths snoo +14976|1384|61|4|37|47559.06|0.01|0.00|N|O|1995-07-28|1995-09-03|1995-08-17|TAKE BACK RETURN|MAIL|counts. deposits lose slyly. reg +14976|1692|34|5|11|17530.59|0.07|0.07|N|O|1995-10-31|1995-08-23|1995-11-12|NONE|MAIL|s. blithely even accou +14977|776|41|1|43|72101.11|0.08|0.02|N|O|1998-01-16|1997-12-19|1998-02-08|DELIVER IN PERSON|TRUCK|ess about the slyly final pa +14978|1110|19|1|23|23255.53|0.08|0.03|R|F|1993-09-21|1993-07-06|1993-10-13|TAKE BACK RETURN|AIR|final requests. quietly special tithes a +14978|557|88|2|3|4372.65|0.08|0.04|R|F|1993-06-10|1993-08-17|1993-07-03|DELIVER IN PERSON|SHIP|e even, express foxes haggle si +14978|1469|48|3|24|32891.04|0.04|0.03|R|F|1993-06-01|1993-08-24|1993-06-29|DELIVER IN PERSON|RAIL|theodolites will have to cajole bravely +14978|1130|67|4|47|48463.11|0.09|0.08|R|F|1993-08-27|1993-07-26|1993-09-03|TAKE BACK RETURN|SHIP|regular courts. slyly dogged +14979|849|50|1|15|26247.60|0.00|0.03|N|O|1996-07-07|1996-09-12|1996-07-25|COLLECT COD|REG AIR|ly carefully even dugouts-- ironic dep +14979|531|62|2|46|65850.38|0.04|0.00|N|O|1996-08-01|1996-08-27|1996-08-25|DELIVER IN PERSON|SHIP|n, ironic deposits sleep afte +14980|1717|18|1|19|30755.49|0.09|0.06|R|F|1992-07-17|1992-10-01|1992-08-08|NONE|AIR|es. regular +14980|125|4|2|36|36904.32|0.08|0.03|A|F|1992-09-21|1992-09-08|1992-10-10|DELIVER IN PERSON|TRUCK|haggle carefully final, regular d +14980|585|16|3|40|59423.20|0.03|0.04|R|F|1992-10-26|1992-10-02|1992-11-21|COLLECT COD|FOB| furiously against t +14980|198|25|4|3|3294.57|0.06|0.04|R|F|1992-11-10|1992-09-26|1992-11-30|TAKE BACK RETURN|TRUCK|cies nag. slyly final r +14980|1335|12|5|20|24726.60|0.08|0.06|R|F|1992-09-12|1992-09-10|1992-10-01|DELIVER IN PERSON|AIR|l theodolites. ironic acc +14980|569|70|6|24|35269.44|0.04|0.06|R|F|1992-07-27|1992-09-28|1992-08-25|TAKE BACK RETURN|AIR|es. regular platelets wake carefully care +14981|1842|29|1|7|12206.88|0.08|0.07|A|F|1994-01-30|1993-12-28|1994-02-06|NONE|TRUCK|ages wake. rut +14981|1929|30|2|42|76898.64|0.04|0.03|R|F|1994-01-30|1993-12-14|1994-02-02|DELIVER IN PERSON|AIR|r packages. bl +14981|481|11|3|29|40062.92|0.09|0.06|A|F|1993-12-27|1994-01-13|1994-01-06|NONE|SHIP|al foxes use slyly about the platelets. s +14981|1198|7|4|49|53860.31|0.04|0.01|A|F|1993-11-11|1993-12-26|1993-12-10|TAKE BACK RETURN|SHIP|grate careful +14981|1537|18|5|6|8631.18|0.04|0.03|R|F|1994-01-06|1994-01-01|1994-01-22|DELIVER IN PERSON|REG AIR|eas haggle furiously about the furi +14981|1959|92|6|33|61411.35|0.03|0.00|A|F|1994-01-01|1993-11-29|1994-01-27|TAKE BACK RETURN|RAIL|uests wake fur +14981|958|93|7|17|31602.15|0.07|0.06|A|F|1993-12-17|1993-12-16|1993-12-26|NONE|RAIL|: furiously +14982|1202|40|1|3|3309.60|0.08|0.05|R|F|1994-06-20|1994-04-22|1994-06-28|TAKE BACK RETURN|AIR|iously slyly final +14983|1999|44|1|12|22811.88|0.09|0.04|A|F|1994-05-08|1994-04-23|1994-05-28|NONE|RAIL|old requests poach +14983|1818|48|2|33|56753.73|0.02|0.08|R|F|1994-02-13|1994-05-03|1994-03-13|COLLECT COD|AIR|ages wake q +14983|441|71|3|32|42926.08|0.07|0.01|A|F|1994-03-06|1994-03-28|1994-03-29|NONE|TRUCK|le slyly even, regular r +14983|1160|97|4|44|46691.04|0.07|0.07|R|F|1994-05-10|1994-04-24|1994-05-25|COLLECT COD|RAIL|gle pinto bea +14983|627|90|5|14|21386.68|0.08|0.03|A|F|1994-06-09|1994-05-05|1994-06-18|NONE|REG AIR|ites integra +14983|776|41|6|30|50303.10|0.08|0.07|R|F|1994-03-15|1994-04-16|1994-03-28|TAKE BACK RETURN|FOB|usly blithely brav +15008|1217|29|1|38|42491.98|0.01|0.01|N|O|1997-12-24|1998-03-03|1998-01-08|TAKE BACK RETURN|MAIL|es. quickly pendin +15009|1913|2|1|39|70781.49|0.07|0.07|N|O|1996-04-06|1996-03-03|1996-04-23|COLLECT COD|FOB|as. package +15009|1322|99|2|42|51379.44|0.04|0.06|N|O|1996-01-26|1996-03-06|1996-01-27|TAKE BACK RETURN|REG AIR|ly against the blithel +15009|1611|53|3|23|34790.03|0.07|0.06|N|O|1996-03-30|1996-02-15|1996-04-12|COLLECT COD|FOB|cording to the +15009|888|88|4|3|5366.64|0.03|0.03|N|O|1996-04-18|1996-02-04|1996-05-05|COLLECT COD|TRUCK| beans. express, iro +15010|1428|7|1|4|5317.68|0.09|0.03|R|F|1994-03-24|1994-02-11|1994-04-03|COLLECT COD|MAIL|uests was fluffily b +15010|491|79|2|9|12523.41|0.03|0.08|R|F|1994-02-23|1994-02-05|1994-03-07|COLLECT COD|REG AIR|equests. final accounts may are across th +15010|1784|11|3|36|60688.08|0.04|0.05|R|F|1993-12-23|1994-01-25|1994-01-06|COLLECT COD|SHIP|cording to the closely pending +15010|1719|4|4|44|71311.24|0.07|0.01|A|F|1994-01-08|1994-01-03|1994-01-31|DELIVER IN PERSON|TRUCK|ke according to the carefully eve +15010|1695|96|5|19|30337.11|0.06|0.04|A|F|1994-02-02|1994-02-03|1994-02-24|TAKE BACK RETURN|SHIP|ecial pinto bea +15011|1030|36|1|41|38172.23|0.01|0.02|R|F|1994-11-29|1994-11-04|1994-12-10|DELIVER IN PERSON|MAIL|sly regular requests. +15011|916|85|2|44|79944.04|0.03|0.02|R|F|1994-12-19|1994-10-23|1995-01-10|NONE|FOB|packages. regular pinto beans sleep fl +15012|474|62|1|28|38485.16|0.10|0.03|A|F|1993-03-30|1993-04-18|1993-04-28|NONE|AIR|iously regular dolphin +15013|1732|17|1|49|80052.77|0.03|0.06|A|F|1992-08-14|1992-05-23|1992-08-21|TAKE BACK RETURN|AIR|lites. regul +15014|1656|39|1|13|20249.45|0.10|0.05|R|F|1993-05-15|1993-03-28|1993-05-31|COLLECT COD|SHIP|e according to the accounts. even request +15014|1889|90|2|23|41190.24|0.02|0.04|A|F|1993-04-18|1993-04-01|1993-05-12|TAKE BACK RETURN|REG AIR|s platelets agai +15014|1918|7|3|2|3639.82|0.00|0.03|R|F|1993-03-19|1993-05-04|1993-04-11|NONE|RAIL|press requests +15014|442|43|4|16|21479.04|0.06|0.07|A|F|1993-05-27|1993-04-10|1993-06-11|DELIVER IN PERSON|RAIL|ackages solve slyly +15014|680|43|5|33|52162.44|0.01|0.03|A|F|1993-03-22|1993-04-05|1993-04-19|NONE|REG AIR|al, unusual deposit +15014|1554|35|6|8|11644.40|0.04|0.03|R|F|1993-06-09|1993-04-16|1993-06-29|COLLECT COD|REG AIR|ckages boost furiously: carefully +15015|734|99|1|3|4904.19|0.01|0.06|R|F|1994-01-27|1994-01-26|1994-02-16|DELIVER IN PERSON|SHIP|beans. carefully regul +15015|1831|61|2|7|12129.81|0.00|0.00|A|F|1994-02-22|1994-01-12|1994-03-21|TAKE BACK RETURN|AIR|t the even platelets ha +15015|1022|93|3|3|2769.06|0.09|0.08|R|F|1994-03-13|1994-02-19|1994-03-24|TAKE BACK RETURN|SHIP| fluffy requests. +15015|1161|70|4|29|30802.64|0.00|0.04|R|F|1994-02-20|1994-01-17|1994-03-01|TAKE BACK RETURN|RAIL|y regular, do +15040|1592|93|1|7|10455.13|0.05|0.01|A|F|1994-12-10|1995-01-04|1994-12-18|DELIVER IN PERSON|REG AIR|s wake slyly. unusual, fin +15040|668|100|2|19|29804.54|0.02|0.05|R|F|1994-12-16|1995-02-28|1994-12-21|NONE|REG AIR|quickly regular accounts ac +15040|432|33|3|21|27981.03|0.10|0.08|R|F|1995-03-12|1995-02-19|1995-03-18|COLLECT COD|AIR|regular, eve +15040|1393|32|4|30|38831.70|0.03|0.08|A|F|1994-12-23|1995-02-26|1995-01-06|DELIVER IN PERSON|TRUCK|ealthy accounts wake blithely in +15040|217|99|5|14|15640.94|0.06|0.01|R|F|1995-03-12|1995-01-11|1995-03-23|TAKE BACK RETURN|SHIP|latelets. pendin +15040|1154|63|6|15|15827.25|0.04|0.00|R|F|1995-03-05|1995-01-26|1995-04-03|TAKE BACK RETURN|AIR|pending, close instru +15040|827|94|7|30|51834.60|0.03|0.06|R|F|1995-01-17|1995-01-28|1995-01-19|DELIVER IN PERSON|REG AIR|y above the regular requests. quie +15041|1323|100|1|34|41626.88|0.10|0.07|N|O|1998-06-27|1998-04-26|1998-07-20|DELIVER IN PERSON|RAIL|en, final foxes. thinly final request +15041|1154|91|2|34|35875.10|0.04|0.05|N|O|1998-07-08|1998-05-13|1998-07-14|DELIVER IN PERSON|AIR|the deposits. slyly slo +15041|250|78|3|13|14953.25|0.09|0.06|N|O|1998-05-24|1998-06-06|1998-06-16|DELIVER IN PERSON|RAIL|y final accounts slee +15041|1162|63|4|40|42526.40|0.04|0.08|N|O|1998-06-21|1998-05-05|1998-07-21|NONE|AIR| carefully +15041|797|30|5|48|81493.92|0.01|0.08|N|O|1998-07-12|1998-06-09|1998-08-03|TAKE BACK RETURN|AIR|ironic platelets. ironic deposits nag ca +15041|1767|10|6|2|3337.52|0.00|0.08|N|O|1998-06-26|1998-04-27|1998-07-18|NONE|MAIL|ial requests. fluffily regular excuses impr +15042|1569|70|1|29|42646.24|0.00|0.08|N|O|1996-05-20|1996-06-16|1996-05-22|NONE|SHIP|y ironic deposits are slyly. +15042|1900|87|2|24|43245.60|0.07|0.08|N|O|1996-03-25|1996-05-09|1996-04-22|DELIVER IN PERSON|MAIL|oxes nag carefu +15043|1473|13|1|12|16493.64|0.07|0.03|R|F|1992-11-09|1992-11-21|1992-11-10|TAKE BACK RETURN|MAIL|deas. slyly bold requests use across the +15043|134|35|2|46|47569.98|0.05|0.07|R|F|1992-10-20|1992-11-09|1992-11-02|COLLECT COD|SHIP|nding excuses. c +15043|830|64|3|30|51924.90|0.07|0.01|R|F|1992-11-09|1992-12-19|1992-11-24|COLLECT COD|RAIL|y ironic deposits unwind. express ideas wak +15043|1764|7|4|28|46641.28|0.03|0.00|A|F|1992-11-13|1992-11-01|1992-12-05|NONE|AIR|st against the ideas. furi +15043|1270|71|5|33|38651.91|0.00|0.04|R|F|1992-11-29|1992-11-20|1992-12-24|COLLECT COD|FOB|carefully regular i +15044|1011|82|1|30|27360.30|0.01|0.03|A|F|1992-07-02|1992-06-03|1992-07-16|NONE|AIR|lyly even deposits. ins +15044|625|88|2|31|47294.22|0.07|0.01|A|F|1992-05-25|1992-05-28|1992-06-04|DELIVER IN PERSON|SHIP|nooze care +15045|1008|14|1|32|29088.00|0.07|0.03|A|F|1993-09-30|1993-10-03|1993-10-08|COLLECT COD|MAIL|s accounts are slyly ironic instructions +15045|716|13|2|18|29100.78|0.06|0.04|R|F|1993-12-03|1993-10-31|1993-12-27|DELIVER IN PERSON|MAIL|xes detect ca +15045|1501|82|3|20|28050.00|0.07|0.08|A|F|1993-12-20|1993-11-03|1993-12-29|COLLECT COD|AIR| carefully along the furiously final r +15045|745|42|4|31|51017.94|0.06|0.05|R|F|1993-12-08|1993-10-31|1993-12-24|TAKE BACK RETURN|RAIL| requests are. furiously pending packages +15045|1867|68|5|38|67216.68|0.00|0.03|R|F|1993-09-09|1993-10-05|1993-10-08|COLLECT COD|AIR|are. requests use. deposits h +15045|792|89|6|5|8463.95|0.00|0.08|R|F|1993-08-26|1993-11-13|1993-09-21|TAKE BACK RETURN|MAIL|mptotes. quickly express deposits +15045|655|18|7|16|24890.40|0.04|0.06|R|F|1993-10-06|1993-11-15|1993-10-21|COLLECT COD|MAIL| theodolites. carefully +15046|1873|3|1|30|53246.10|0.00|0.04|N|O|1997-09-21|1997-11-22|1997-10-15|TAKE BACK RETURN|RAIL|equests are bl +15046|374|3|2|3|3823.11|0.03|0.07|N|O|1997-12-27|1997-11-15|1998-01-19|NONE|MAIL|zzle furiously iron +15046|964|33|3|29|54083.84|0.04|0.03|N|O|1997-12-09|1997-11-27|1997-12-20|COLLECT COD|SHIP|ironic, re +15046|1469|48|4|43|58929.78|0.03|0.06|N|O|1997-10-11|1997-11-09|1997-10-21|NONE|TRUCK|ts. blithely ironic attainments wou +15046|1712|39|5|36|58093.56|0.10|0.02|N|O|1997-09-21|1997-10-22|1997-10-10|NONE|FOB|sts after the ideas +15046|269|24|6|12|14031.12|0.10|0.02|N|O|1997-12-02|1997-10-31|1997-12-31|NONE|FOB|even accounts are. unusual i +15047|525|86|1|42|59871.84|0.00|0.01|R|F|1992-11-21|1992-09-12|1992-12-11|DELIVER IN PERSON|REG AIR|nto beans nag even +15072|1389|66|1|34|43872.92|0.01|0.01|N|O|1997-03-06|1997-04-14|1997-03-16|COLLECT COD|FOB|ly across the noto +15072|1847|77|2|47|82195.48|0.03|0.07|N|O|1997-04-14|1997-04-18|1997-05-13|NONE|SHIP|silent instru +15072|1687|70|3|3|4766.04|0.09|0.05|N|O|1997-03-24|1997-04-18|1997-04-06|DELIVER IN PERSON|RAIL|gular excuses. specia +15072|279|34|4|31|36557.37|0.03|0.01|N|O|1997-03-10|1997-03-29|1997-04-02|TAKE BACK RETURN|FOB|es along the slyly r +15072|1558|79|5|41|59841.55|0.05|0.06|N|O|1997-06-26|1997-04-17|1997-07-25|DELIVER IN PERSON|TRUCK|d alongside of the bli +15072|561|22|6|38|55539.28|0.04|0.03|N|O|1997-06-27|1997-05-27|1997-07-27|DELIVER IN PERSON|AIR|l, bold deposits h +15073|119|72|1|39|39745.29|0.04|0.04|A|F|1992-03-21|1992-04-18|1992-03-23|TAKE BACK RETURN|AIR|ackages. pending, special sentiments cajo +15073|638|1|2|12|18463.56|0.08|0.04|A|F|1992-03-19|1992-02-25|1992-04-07|COLLECT COD|FOB|s. silent accounts hang +15073|1524|45|3|15|21382.80|0.01|0.01|A|F|1992-05-16|1992-03-23|1992-05-19|NONE|AIR|egular deposits. regular ac +15074|903|72|1|49|88391.10|0.06|0.07|R|F|1995-01-18|1995-01-17|1995-02-16|COLLECT COD|RAIL|urts along the slyly express deposits a +15074|1785|86|2|23|38795.94|0.04|0.04|A|F|1995-02-02|1995-01-18|1995-02-19|NONE|FOB|hy, final dependencies s +15075|535|26|1|9|12919.77|0.02|0.06|A|F|1994-12-05|1994-11-26|1995-01-02|DELIVER IN PERSON|SHIP|rve-- furiously stealthy instr +15075|127|80|2|39|40057.68|0.04|0.08|A|F|1995-01-08|1994-12-20|1995-01-25|NONE|FOB|ve to boost quickly regular excuses. instru +15075|1911|12|3|26|47135.66|0.10|0.07|A|F|1995-01-18|1994-12-04|1995-01-25|COLLECT COD|TRUCK|he blithely express warthogs-- +15075|496|26|4|39|54463.11|0.07|0.05|R|F|1994-11-22|1994-12-04|1994-12-11|DELIVER IN PERSON|FOB|nts haggle blithely fin +15075|1674|75|5|42|66178.14|0.08|0.00|A|F|1994-12-03|1995-01-02|1994-12-20|DELIVER IN PERSON|TRUCK|ress requests. dinos across the sly +15075|1447|87|6|1|1348.44|0.09|0.08|R|F|1995-02-02|1994-11-27|1995-02-19|COLLECT COD|FOB| according to the +15076|223|5|1|25|28080.50|0.06|0.06|N|O|1996-07-07|1996-06-16|1996-07-09|COLLECT COD|MAIL|quests-- iron +15077|1828|15|1|15|25947.30|0.03|0.08|N|O|1997-09-01|1997-06-17|1997-09-25|TAKE BACK RETURN|SHIP|ts wake thinly regular decoys. final requ +15077|987|22|2|38|71743.24|0.02|0.04|N|O|1997-07-17|1997-07-03|1997-08-16|COLLECT COD|MAIL| beans boost ac +15077|268|96|3|36|42057.36|0.07|0.02|N|O|1997-06-07|1997-08-07|1997-06-28|DELIVER IN PERSON|REG AIR|s. furiously +15077|1115|52|4|6|6096.66|0.04|0.08|N|O|1997-09-05|1997-07-23|1997-09-10|DELIVER IN PERSON|RAIL|ackages sleep d +15077|275|76|5|19|22330.13|0.05|0.05|N|O|1997-08-19|1997-07-23|1997-08-28|COLLECT COD|TRUCK|iously regular somas wak +15077|1997|42|6|35|66464.65|0.07|0.07|N|O|1997-05-22|1997-08-03|1997-06-17|COLLECT COD|FOB|express packages +15077|1175|12|7|37|39818.29|0.03|0.01|N|O|1997-05-16|1997-07-06|1997-05-22|TAKE BACK RETURN|SHIP|sits. quickly expr +15078|1734|35|1|35|57250.55|0.02|0.05|R|F|1993-12-10|1993-12-11|1993-12-18|NONE|TRUCK| theodolites. special, +15078|1184|85|2|44|47747.92|0.00|0.02|R|F|1994-02-09|1993-12-17|1994-02-18|DELIVER IN PERSON|RAIL|s. blithely pending a +15078|1262|63|3|39|45367.14|0.03|0.06|R|F|1993-11-13|1994-01-11|1993-12-11|DELIVER IN PERSON|FOB|final, express accounts. regular, special p +15078|417|18|4|37|48744.17|0.06|0.04|A|F|1993-12-11|1994-01-12|1994-01-05|NONE|RAIL|sits cajole furiousl +15078|1755|40|5|20|33135.00|0.05|0.05|A|F|1993-11-19|1993-12-13|1993-11-23|NONE|RAIL|pecial theodolites haggle around the f +15079|350|51|1|9|11253.15|0.09|0.00|R|F|1993-02-16|1993-03-10|1993-02-19|COLLECT COD|RAIL|nal accounts: carefully ironic foxe +15079|179|6|2|39|42087.63|0.00|0.03|R|F|1993-03-06|1993-03-13|1993-03-28|DELIVER IN PERSON|REG AIR|odolites-- furiou +15079|1034|40|3|24|22440.72|0.10|0.08|A|F|1993-03-20|1993-04-15|1993-04-05|NONE|RAIL| requests poach slyly across the slyly idle +15079|1607|49|4|37|55818.20|0.08|0.08|A|F|1993-04-06|1993-04-07|1993-04-07|TAKE BACK RETURN|REG AIR|slyly daring frets above the slyl +15079|184|37|5|41|44451.38|0.06|0.07|R|F|1993-03-03|1993-04-06|1993-03-25|COLLECT COD|REG AIR|final requests. blithely ironic +15079|1439|40|6|11|14744.73|0.09|0.08|R|F|1993-01-27|1993-03-08|1993-02-20|TAKE BACK RETURN|TRUCK|s sleep furiously ac +15079|1992|25|7|33|62501.67|0.03|0.04|R|F|1993-05-03|1993-03-22|1993-06-02|NONE|SHIP|instructions c +15104|1259|97|1|21|24365.25|0.00|0.02|R|F|1992-07-17|1992-06-05|1992-08-09|NONE|RAIL|bout the final co +15105|1326|3|1|10|12273.20|0.05|0.00|R|F|1995-02-01|1995-01-09|1995-02-14|DELIVER IN PERSON|TRUCK|yly carefully regul +15106|928|97|1|43|78643.56|0.02|0.01|A|F|1995-03-23|1995-04-07|1995-04-14|TAKE BACK RETURN|MAIL|e pending depo +15106|80|31|2|22|21561.76|0.00|0.06|A|F|1995-02-28|1995-04-07|1995-03-19|COLLECT COD|TRUCK|ly express requests snooze. carefull +15106|302|59|3|3|3606.90|0.05|0.03|A|F|1995-03-30|1995-03-03|1995-04-04|DELIVER IN PERSON|MAIL|ly about the slyly unusual deposits. sly +15106|990|91|4|32|60511.68|0.02|0.07|A|F|1995-03-04|1995-04-24|1995-03-05|NONE|SHIP|d packages cajole. bra +15106|191|18|5|29|31644.51|0.01|0.04|A|F|1995-03-19|1995-04-12|1995-03-21|TAKE BACK RETURN|TRUCK|se furiously across the sly +15106|1315|92|6|13|15812.03|0.01|0.02|A|F|1995-03-10|1995-04-04|1995-03-19|TAKE BACK RETURN|MAIL|blithely si +15107|937|40|1|26|47786.18|0.09|0.07|N|O|1996-07-16|1996-08-16|1996-08-12|NONE|SHIP|y silent platelets detect furiously ev +15107|1326|3|2|50|61366.00|0.05|0.03|N|O|1996-06-20|1996-08-04|1996-07-06|TAKE BACK RETURN|RAIL|gedly final packages. quietl +15107|1753|96|3|42|69499.50|0.04|0.01|N|O|1996-06-11|1996-08-22|1996-06-30|DELIVER IN PERSON|FOB|pecial foxes thrash slyly according +15107|758|91|4|14|23222.50|0.07|0.02|N|O|1996-09-21|1996-08-27|1996-10-08|COLLECT COD|FOB|s nag carefully regular depo +15107|142|95|5|50|52107.00|0.07|0.06|N|O|1996-09-08|1996-07-20|1996-10-03|DELIVER IN PERSON|REG AIR|posits. blithely e +15108|1018|54|1|49|45031.49|0.02|0.01|A|F|1994-11-21|1994-10-03|1994-11-29|DELIVER IN PERSON|TRUCK|ly among the slyly final +15108|1028|99|2|39|36231.78|0.05|0.03|R|F|1994-10-20|1994-11-04|1994-10-24|DELIVER IN PERSON|SHIP|osits haggle furiously. express, final p +15108|662|56|3|25|39066.50|0.03|0.06|A|F|1994-10-14|1994-11-05|1994-11-06|DELIVER IN PERSON|FOB|s cajole quickly aroun +15108|179|80|4|29|31295.93|0.06|0.02|A|F|1994-11-22|1994-11-09|1994-12-04|NONE|TRUCK|ular deposits boost foxe +15108|502|33|5|30|42075.00|0.01|0.08|A|F|1994-11-23|1994-10-10|1994-12-01|COLLECT COD|FOB|e blithely across +15108|441|71|6|3|4024.32|0.05|0.04|A|F|1994-09-09|1994-11-11|1994-09-10|COLLECT COD|TRUCK|the slowly regular packages. silent +15109|703|36|1|27|43299.90|0.02|0.04|A|F|1994-01-01|1994-01-18|1994-01-10|COLLECT COD|AIR|ges cajole slyl +15109|1869|56|2|9|15937.74|0.03|0.07|A|F|1994-01-03|1994-02-14|1994-01-21|NONE|TRUCK|ding, bold requests. ev +15109|598|29|3|42|62940.78|0.03|0.05|R|F|1994-02-15|1994-03-02|1994-03-01|TAKE BACK RETURN|MAIL|en accounts. packages after the +15109|67|68|4|39|37715.34|0.08|0.06|R|F|1994-03-15|1994-02-10|1994-03-29|NONE|TRUCK| among the +15109|481|69|5|42|58022.16|0.09|0.08|R|F|1994-01-10|1994-01-29|1994-01-30|COLLECT COD|SHIP|odolites are carefully i +15109|931|100|6|7|12823.51|0.09|0.05|A|F|1994-02-03|1994-03-08|1994-02-05|NONE|AIR|eposits. ironic de +15109|475|76|7|36|49516.92|0.09|0.08|R|F|1994-03-07|1994-02-28|1994-03-16|COLLECT COD|REG AIR|lites are carefu +15110|668|31|1|38|59609.08|0.06|0.07|A|F|1993-09-07|1993-10-29|1993-09-29|TAKE BACK RETURN|TRUCK|s wake. furiously regular theodolites haggl +15111|1974|75|1|19|35643.43|0.09|0.04|A|F|1995-02-18|1995-03-15|1995-03-17|NONE|AIR|ts alongside of the platelets shall u +15111|79|80|2|13|12727.91|0.07|0.00|R|F|1995-03-01|1995-03-08|1995-03-02|DELIVER IN PERSON|REG AIR|theodolites use carefully. slyly regular i +15111|444|3|3|42|56466.48|0.09|0.08|R|F|1995-02-19|1995-02-14|1995-02-24|TAKE BACK RETURN|MAIL|wake slyly. quickly regular requests +15111|1798|83|4|31|52693.49|0.09|0.06|A|F|1995-04-12|1995-03-11|1995-05-10|TAKE BACK RETURN|AIR|ar instructions +15136|68|69|1|39|37754.34|0.10|0.05|N|O|1996-04-07|1996-02-21|1996-04-15|DELIVER IN PERSON|TRUCK|r ideas solve permanently about +15136|403|62|2|45|58653.00|0.04|0.02|N|O|1996-02-17|1996-02-09|1996-02-20|NONE|AIR|e carefully along the slyly pending pla +15137|1783|26|1|11|18532.58|0.10|0.03|N|O|1996-08-10|1996-05-16|1996-08-30|NONE|AIR|regular accounts boo +15137|945|48|2|48|88605.12|0.08|0.02|N|O|1996-05-05|1996-06-03|1996-05-25|NONE|AIR|blithely ruthless platelets. express re +15138|1031|32|1|4|3728.12|0.07|0.01|R|F|1995-03-10|1995-05-11|1995-03-31|DELIVER IN PERSON|SHIP|uests wake carefully above the care +15138|1266|67|2|30|35017.80|0.04|0.02|N|F|1995-06-12|1995-04-15|1995-06-25|NONE|SHIP|even asymptotes outside the c +15139|1986|75|1|3|5663.94|0.04|0.03|A|F|1995-03-02|1995-01-23|1995-03-14|COLLECT COD|AIR|e quickly ironic accounts integrate +15139|1793|94|2|24|40674.96|0.02|0.08|R|F|1995-03-19|1995-01-22|1995-04-08|DELIVER IN PERSON|FOB|slyly after the ir +15139|1433|12|3|24|32026.32|0.01|0.00|R|F|1995-03-19|1995-01-19|1995-03-26|NONE|TRUCK|ly express ideas nag furious +15139|1724|25|4|2|3251.44|0.05|0.07|A|F|1995-03-20|1995-02-13|1995-04-04|COLLECT COD|RAIL|packages detect quickl +15139|832|32|5|5|8664.15|0.05|0.08|A|F|1994-12-04|1995-01-25|1994-12-28|COLLECT COD|FOB| accounts believe +15139|532|33|6|32|45840.96|0.03|0.04|A|F|1994-11-23|1995-02-12|1994-12-21|NONE|TRUCK|ide of the slyly unusual dep +15140|959|60|1|42|78117.90|0.04|0.04|N|O|1996-12-08|1997-01-15|1996-12-23|NONE|FOB| wake furiously n +15140|905|6|2|50|90295.00|0.04|0.00|N|O|1997-01-24|1996-12-27|1997-02-02|COLLECT COD|AIR|arefully regu +15140|1876|20|3|26|46224.62|0.03|0.04|N|O|1996-11-08|1996-12-26|1996-11-19|NONE|FOB|press foxes except the deposi +15140|1929|62|4|12|21971.04|0.08|0.05|N|O|1997-02-16|1996-12-02|1997-03-04|TAKE BACK RETURN|TRUCK| boost regular packages-- blithe +15140|409|97|5|20|26188.00|0.09|0.02|N|O|1997-01-29|1997-01-07|1997-02-16|DELIVER IN PERSON|RAIL|gular requests after the ironic pinto b +15140|1614|15|6|14|21218.54|0.05|0.05|N|O|1997-02-12|1997-01-22|1997-03-08|DELIVER IN PERSON|MAIL|uriously unusual +15140|1516|57|7|50|70875.50|0.10|0.03|N|O|1996-12-14|1996-12-11|1996-12-24|NONE|MAIL|usly about the quickl +15141|1020|56|1|22|20262.44|0.02|0.05|R|F|1992-04-28|1992-03-20|1992-05-16|DELIVER IN PERSON|MAIL|uests haggle slyly carefully express r +15141|1868|98|2|48|84953.28|0.05|0.08|R|F|1992-02-14|1992-03-20|1992-03-02|COLLECT COD|RAIL|ithely even foxes +15141|1453|71|3|4|5417.80|0.00|0.00|A|F|1992-04-16|1992-02-27|1992-05-06|COLLECT COD|MAIL|nusual pinto be +15141|891|25|4|6|10751.34|0.00|0.05|R|F|1992-04-03|1992-03-31|1992-04-17|NONE|RAIL|refully after t +15141|188|89|5|4|4352.72|0.00|0.04|A|F|1992-04-05|1992-02-21|1992-04-13|DELIVER IN PERSON|MAIL|ernes sleep f +15141|1459|99|6|8|10883.60|0.01|0.07|A|F|1992-02-29|1992-02-17|1992-03-30|COLLECT COD|SHIP| the ironic, final excuses. ironic, +15142|525|16|1|12|17106.24|0.05|0.00|A|F|1992-07-06|1992-06-27|1992-07-22|TAKE BACK RETURN|RAIL|ts haggle blithely along +15142|1523|44|2|49|69801.48|0.09|0.00|R|F|1992-06-15|1992-05-25|1992-06-29|DELIVER IN PERSON|FOB|ly across the car +15142|609|41|3|1|1509.60|0.01|0.08|A|F|1992-05-26|1992-06-11|1992-06-16|COLLECT COD|FOB|ajole furiou +15142|412|42|4|13|17061.33|0.07|0.06|A|F|1992-04-28|1992-06-30|1992-05-20|TAKE BACK RETURN|MAIL|kages haggl +15143|787|52|1|7|11814.46|0.08|0.06|N|O|1998-09-19|1998-07-09|1998-10-15|DELIVER IN PERSON|AIR|lyly ironic requests. quickly regular +15143|1458|76|2|49|66613.05|0.01|0.03|N|O|1998-06-09|1998-07-10|1998-06-15|COLLECT COD|FOB|ar packages. even, silen +15143|82|83|3|29|28480.32|0.08|0.00|N|O|1998-09-14|1998-07-05|1998-09-27|DELIVER IN PERSON|MAIL|ong the quickly final courts. blithely pend +15143|1060|66|4|48|46130.88|0.09|0.04|N|O|1998-09-04|1998-08-09|1998-09-30|COLLECT COD|FOB|ctions. ironic the +15168|979|80|1|44|82718.68|0.02|0.06|N|O|1996-07-07|1996-07-23|1996-08-05|NONE|SHIP|its nag slyly furiously dogged +15169|628|91|1|41|62673.42|0.05|0.04|N|O|1996-04-15|1996-07-01|1996-04-16|COLLECT COD|FOB|sits do detect quickly carefu +15169|1723|8|2|25|40618.00|0.10|0.08|N|O|1996-05-01|1996-05-11|1996-05-13|TAKE BACK RETURN|SHIP|e alongside +15170|906|7|1|22|39751.80|0.00|0.05|A|F|1994-04-06|1994-06-07|1994-04-29|TAKE BACK RETURN|AIR|ar, special w +15170|1442|82|2|1|1343.44|0.07|0.06|A|F|1994-05-27|1994-05-24|1994-06-21|NONE|TRUCK| instruction +15170|1525|26|3|10|14265.20|0.01|0.03|R|F|1994-04-18|1994-05-18|1994-05-07|COLLECT COD|MAIL|ing to the instruc +15170|1999|44|4|11|20910.89|0.08|0.07|R|F|1994-03-28|1994-05-09|1994-04-12|DELIVER IN PERSON|REG AIR|players haggle. +15171|778|11|1|27|45326.79|0.08|0.03|N|O|1996-09-12|1996-10-31|1996-09-29|TAKE BACK RETURN|SHIP|, ironic depend +15172|464|94|1|40|54578.40|0.02|0.03|N|O|1995-07-03|1995-08-13|1995-07-22|DELIVER IN PERSON|REG AIR|usly final packages. r +15172|641|35|2|19|29291.16|0.06|0.00|N|O|1995-08-03|1995-08-30|1995-08-05|COLLECT COD|RAIL|eposits boost blithely +15172|1595|16|3|10|14965.90|0.03|0.06|N|O|1995-10-03|1995-08-08|1995-10-30|TAKE BACK RETURN|TRUCK|ding frays cajole regularly above the re +15172|442|30|4|14|18794.16|0.08|0.05|N|O|1995-10-03|1995-08-08|1995-10-21|DELIVER IN PERSON|FOB|ithely close ideas among the slyly final +15172|1623|6|5|1|1524.62|0.09|0.05|N|O|1995-08-24|1995-09-14|1995-08-31|NONE|FOB|e blithely bold +15173|1571|52|1|40|58902.80|0.09|0.05|A|F|1992-07-02|1992-04-05|1992-07-13|TAKE BACK RETURN|FOB| ironic asympt +15173|290|45|2|9|10712.61|0.07|0.05|R|F|1992-05-29|1992-05-27|1992-06-14|NONE|SHIP| furiously regular asy +15173|1454|33|3|21|28464.45|0.04|0.02|A|F|1992-03-18|1992-05-13|1992-04-11|DELIVER IN PERSON|AIR| instructions. qui +15173|70|71|4|21|20371.47|0.07|0.00|R|F|1992-05-13|1992-05-11|1992-06-09|TAKE BACK RETURN|FOB|ntegrate quickly s +15173|936|5|5|22|40412.46|0.04|0.04|R|F|1992-04-03|1992-05-24|1992-04-26|COLLECT COD|REG AIR|y furious ideas. +15173|465|95|6|34|46425.64|0.04|0.04|A|F|1992-06-27|1992-05-23|1992-07-13|COLLECT COD|AIR|lites wake. fluffily unusual excus +15173|1430|9|7|6|7988.58|0.10|0.04|A|F|1992-04-04|1992-04-18|1992-04-05|DELIVER IN PERSON|MAIL| the quickly quiet accounts. furiousl +15174|1669|93|1|47|73821.02|0.08|0.08|A|F|1992-12-24|1993-01-16|1993-01-21|COLLECT COD|TRUCK| the quickly ironic excu +15175|1420|99|1|30|39642.60|0.09|0.06|A|F|1992-09-29|1992-09-19|1992-10-11|COLLECT COD|REG AIR|tain blithel +15175|645|8|2|22|34004.08|0.01|0.03|R|F|1992-10-22|1992-09-22|1992-10-23|COLLECT COD|AIR|above the ironic, f +15200|115|16|1|33|33498.63|0.01|0.01|R|F|1994-08-20|1994-06-01|1994-09-01|TAKE BACK RETURN|SHIP|ly even dolphins nag quickly final, special +15200|847|48|2|2|3495.68|0.01|0.08|R|F|1994-07-12|1994-06-20|1994-08-08|NONE|FOB| slyly abou +15201|133|60|1|2|2066.26|0.01|0.00|N|O|1995-06-22|1995-07-15|1995-07-04|COLLECT COD|TRUCK|ular packages. +15201|820|20|2|40|68832.80|0.07|0.03|N|O|1995-08-03|1995-08-06|1995-08-11|DELIVER IN PERSON|FOB| carefully express requests th +15201|942|45|3|22|40544.68|0.00|0.02|N|O|1995-09-26|1995-07-08|1995-10-24|TAKE BACK RETURN|AIR|ffily final deposits. +15202|314|99|1|48|58286.88|0.08|0.03|R|F|1993-10-31|1993-09-27|1993-11-25|DELIVER IN PERSON|REG AIR|oost. ironi +15202|876|77|2|42|74628.54|0.04|0.07|R|F|1993-07-22|1993-10-04|1993-07-29|DELIVER IN PERSON|REG AIR|equests might wake excuses. f +15202|83|59|3|33|32441.64|0.00|0.03|R|F|1993-08-15|1993-09-11|1993-09-05|COLLECT COD|FOB|es. idly unusual deposits by the carefu +15202|629|92|4|36|55066.32|0.02|0.00|R|F|1993-07-31|1993-10-06|1993-08-04|NONE|FOB|onic theodolites across the fur +15202|1953|86|5|37|68633.15|0.04|0.08|R|F|1993-07-14|1993-09-13|1993-08-12|TAKE BACK RETURN|TRUCK|nding excuses. final d +15202|358|87|6|44|55367.40|0.04|0.07|A|F|1993-09-28|1993-08-26|1993-10-18|COLLECT COD|RAIL|lly regular fo +15202|1541|42|7|17|24523.18|0.03|0.03|R|F|1993-10-08|1993-08-26|1993-10-09|NONE|TRUCK|ages wake furiously against +15203|685|17|1|38|60255.84|0.00|0.04|N|O|1996-10-27|1996-10-18|1996-11-04|TAKE BACK RETURN|SHIP|r pinto beans. ironic, ironic theodolites +15204|1828|58|1|9|15568.38|0.10|0.03|A|F|1993-08-14|1993-06-21|1993-09-12|NONE|SHIP|nusual, regular requ +15205|348|49|1|31|38698.54|0.07|0.07|N|O|1995-07-05|1995-04-24|1995-07-23|NONE|FOB|e the final pinto beans. +15205|1651|34|2|31|48132.15|0.03|0.06|A|F|1995-05-27|1995-05-29|1995-06-16|DELIVER IN PERSON|FOB|ully express +15205|998|67|3|29|55070.71|0.01|0.03|A|F|1995-04-30|1995-04-17|1995-05-18|DELIVER IN PERSON|FOB|haggle furiously blithe w +15205|15|91|4|43|39345.43|0.02|0.00|R|F|1995-04-30|1995-05-21|1995-05-22|NONE|TRUCK|t theodolit +15205|553|14|5|41|59595.55|0.04|0.05|A|F|1995-04-17|1995-05-27|1995-05-01|DELIVER IN PERSON|FOB|pecial requests. bold platelets +15205|902|3|6|11|19831.90|0.05|0.01|A|F|1995-05-15|1995-05-30|1995-05-17|DELIVER IN PERSON|FOB|odolites. unusual, regula +15205|1531|72|7|38|54436.14|0.09|0.04|R|F|1995-04-12|1995-05-14|1995-04-24|NONE|REG AIR|nts impress about the ir +15206|1598|19|1|46|68981.14|0.02|0.05|R|F|1993-12-12|1994-01-25|1994-01-11|NONE|TRUCK| pending ideas. platelets caj +15206|1837|38|2|7|12171.81|0.04|0.07|R|F|1994-02-03|1993-12-21|1994-02-16|TAKE BACK RETURN|RAIL|ide of the regular foxes shall haggle accor +15206|110|11|3|31|31313.41|0.07|0.03|A|F|1994-01-14|1993-12-19|1994-02-03|NONE|RAIL|y. blithely express deposits +15206|1458|37|4|50|67972.50|0.03|0.01|R|F|1994-01-17|1993-12-07|1994-01-30|DELIVER IN PERSON|FOB|symptotes. carefully final dependencies +15206|1152|61|5|26|27381.90|0.00|0.04|R|F|1994-02-24|1994-01-30|1994-03-20|DELIVER IN PERSON|MAIL|olphins must play? furiously expre +15207|77|53|1|47|45922.29|0.05|0.01|A|F|1992-12-26|1992-11-20|1993-01-03|DELIVER IN PERSON|REG AIR|al ideas. even, pending theodoli +15207|1795|38|2|50|84839.50|0.04|0.07|A|F|1992-11-04|1992-11-06|1992-11-21|TAKE BACK RETURN|SHIP|s-- furiously expre +15232|31|32|1|29|26999.87|0.04|0.05|N|O|1997-04-07|1997-02-25|1997-04-13|NONE|RAIL|ously bold packages haggle blithely slyly +15232|1303|18|2|10|12043.00|0.10|0.04|N|O|1997-03-21|1997-03-06|1997-03-22|TAKE BACK RETURN|FOB|refully bold deposits poach furiously +15233|1499|39|1|25|35012.25|0.10|0.08|A|F|1993-02-24|1993-02-01|1993-03-14|COLLECT COD|RAIL|equests. fluffy package +15233|1729|14|2|48|78274.56|0.06|0.03|A|F|1993-04-09|1993-02-03|1993-04-29|NONE|TRUCK|es wake quickly ironic asymptotes; bol +15233|1235|47|3|9|10226.07|0.08|0.07|R|F|1993-01-15|1993-03-27|1993-01-25|COLLECT COD|MAIL|ithely ironic asymptotes. bold ideas caj +15233|49|25|4|26|24675.04|0.10|0.08|R|F|1993-03-15|1993-02-09|1993-03-16|NONE|SHIP|instructions integrate blithely aft +15233|1479|19|5|39|53838.33|0.08|0.00|R|F|1993-01-27|1993-03-26|1993-02-16|NONE|AIR|ly against +15233|1168|5|6|28|29936.48|0.06|0.06|A|F|1993-02-18|1993-02-10|1993-02-25|TAKE BACK RETURN|TRUCK|es across the final accounts +15234|1651|34|1|35|54342.75|0.04|0.07|R|F|1993-05-02|1993-04-27|1993-05-28|COLLECT COD|REG AIR|pendencies. pending, final instructions nod +15234|1580|81|2|22|32594.76|0.00|0.03|R|F|1993-03-25|1993-05-19|1993-04-13|NONE|MAIL|silent platelets. blith +15234|728|61|3|38|61891.36|0.10|0.04|A|F|1993-05-28|1993-05-03|1993-06-08|COLLECT COD|RAIL|y slyly ironic inst +15234|507|38|4|11|15482.50|0.05|0.06|A|F|1993-04-03|1993-04-17|1993-04-17|TAKE BACK RETURN|SHIP|re express re +15235|1759|60|1|49|81376.75|0.08|0.07|N|O|1996-03-23|1996-03-18|1996-04-15|NONE|AIR|special instruction +15235|1449|89|2|35|47265.40|0.08|0.07|N|O|1996-02-14|1996-03-10|1996-02-25|TAKE BACK RETURN|SHIP| accounts. regular pinto beans +15236|909|12|1|32|57916.80|0.04|0.07|A|F|1992-08-06|1992-06-29|1992-08-20|TAKE BACK RETURN|AIR| to the special theod +15236|242|70|2|2|2284.48|0.10|0.06|A|F|1992-06-01|1992-07-07|1992-06-04|NONE|RAIL|es. blithely specia +15236|1564|5|3|3|4396.68|0.07|0.01|A|F|1992-04-16|1992-05-11|1992-04-29|COLLECT COD|RAIL|ugouts integrate carefully expres +15236|573|64|4|34|50101.38|0.05|0.05|R|F|1992-07-21|1992-06-29|1992-07-26|NONE|AIR|bove the theo +15236|1367|68|5|31|39319.16|0.00|0.08|R|F|1992-07-10|1992-06-28|1992-08-03|TAKE BACK RETURN|FOB| even forges nag carefully final th +15237|148|49|1|37|38781.18|0.01|0.04|N|O|1997-05-27|1997-05-28|1997-06-08|TAKE BACK RETURN|REG AIR| even pinto b +15238|1777|62|1|17|28539.09|0.05|0.04|N|O|1997-04-27|1997-06-01|1997-05-07|DELIVER IN PERSON|TRUCK| express package +15238|1340|41|2|14|17378.76|0.03|0.02|N|O|1997-07-04|1997-05-16|1997-07-15|DELIVER IN PERSON|SHIP| regular accounts. special, even deposits +15238|874|75|3|26|46146.62|0.00|0.03|N|O|1997-05-11|1997-04-23|1997-05-12|COLLECT COD|AIR|ly furiously regular requests. foxes mo +15239|122|49|1|44|44973.28|0.03|0.05|N|O|1997-05-17|1997-06-07|1997-05-22|DELIVER IN PERSON|RAIL|totes haggle ruthlessly. blithely ironic +15239|1025|31|2|41|37966.82|0.01|0.08|N|O|1997-07-11|1997-06-04|1997-07-27|TAKE BACK RETURN|REG AIR|tegrate blithely according to the unusual +15239|470|71|3|21|28779.87|0.04|0.05|N|O|1997-08-09|1997-07-21|1997-08-11|COLLECT COD|RAIL|ronic deposits doze furiousl +15239|188|15|4|46|50056.28|0.05|0.03|N|O|1997-06-10|1997-07-22|1997-07-05|COLLECT COD|REG AIR|ggle requests. unusual, s +15239|1195|96|5|1|1096.19|0.10|0.02|N|O|1997-08-13|1997-07-03|1997-09-04|COLLECT COD|AIR|furiously final ideas. fi +15264|367|52|1|47|59565.92|0.02|0.00|N|O|1996-02-11|1995-12-24|1996-03-10|DELIVER IN PERSON|RAIL|usly regular instructions: regular accou +15264|450|51|2|9|12154.05|0.00|0.05|N|O|1995-12-31|1996-01-10|1996-01-24|COLLECT COD|AIR|about the fi +15264|1501|82|3|33|46282.50|0.02|0.06|N|O|1996-02-19|1996-01-07|1996-03-09|TAKE BACK RETURN|TRUCK|st the ironic pinto beans. +15264|120|47|4|9|9181.08|0.06|0.00|N|O|1995-12-01|1996-02-04|1995-12-18|NONE|SHIP|eodolites are carefu +15264|888|88|5|14|25044.32|0.02|0.02|N|O|1996-01-20|1996-02-04|1996-02-18|NONE|MAIL|e blithely regular +15265|1982|15|1|47|88547.06|0.10|0.00|N|O|1996-04-07|1996-04-22|1996-04-19|DELIVER IN PERSON|RAIL| ideas cajole carefully at the +15265|993|96|2|16|30303.84|0.03|0.05|N|O|1996-05-14|1996-05-24|1996-05-15|NONE|AIR|e. blithely final excuses haggle +15265|709|42|3|34|54729.80|0.10|0.02|N|O|1996-04-23|1996-04-01|1996-05-08|NONE|AIR| furiously final packages. pending +15266|59|10|1|32|30689.60|0.04|0.07|R|F|1993-02-27|1993-03-15|1993-03-29|TAKE BACK RETURN|RAIL| sleep fluffily. express pinto beans ar +15266|1108|17|2|43|43391.30|0.10|0.03|A|F|1993-02-26|1993-02-27|1993-02-27|NONE|RAIL| accounts nag sly +15266|459|18|3|49|66613.05|0.02|0.04|R|F|1993-01-28|1993-03-17|1993-02-03|NONE|RAIL|ng theodolites cajole. r +15266|829|96|4|4|6919.28|0.02|0.08|A|F|1993-03-05|1993-03-29|1993-03-31|NONE|MAIL|ly final sen +15266|1403|82|5|16|20870.40|0.08|0.07|A|F|1993-02-22|1993-02-27|1993-03-05|NONE|MAIL|onic asymptotes maintai +15266|548|9|6|18|26073.72|0.03|0.01|R|F|1993-02-09|1993-03-26|1993-02-20|TAKE BACK RETURN|AIR|ests about t +15267|53|4|1|10|9530.50|0.02|0.02|N|O|1996-03-20|1996-06-07|1996-03-22|DELIVER IN PERSON|FOB|ole quickly. finally bold reque +15268|149|50|1|40|41965.60|0.05|0.00|N|O|1996-10-01|1996-10-03|1996-10-02|TAKE BACK RETURN|REG AIR|te furious +15269|629|92|1|10|15296.20|0.09|0.04|N|O|1997-01-03|1996-11-14|1997-01-18|NONE|RAIL|dencies-- regular notornis pro +15269|22|23|2|12|11064.24|0.09|0.02|N|O|1996-12-17|1996-11-22|1996-12-25|DELIVER IN PERSON|TRUCK|ins affix slyly around t +15269|1427|28|3|8|10627.36|0.08|0.08|N|O|1996-09-11|1996-10-31|1996-10-10|COLLECT COD|TRUCK|sly bold requests. ironic pac +15269|835|69|4|48|83319.84|0.04|0.00|N|O|1996-09-26|1996-12-02|1996-10-07|TAKE BACK RETURN|TRUCK|ily special Tiresias +15269|359|16|5|3|3778.05|0.09|0.04|N|O|1996-09-25|1996-11-15|1996-10-03|DELIVER IN PERSON|AIR|tions lose fluffily be +15270|1778|5|1|35|58791.95|0.05|0.01|R|F|1994-04-26|1994-04-06|1994-05-11|TAKE BACK RETURN|TRUCK|lyly silent foxes. never regular depo +15271|509|100|1|47|66246.50|0.03|0.04|A|F|1993-09-03|1993-09-29|1993-09-20|NONE|MAIL|. quickly bold theodolites boost about t +15271|688|51|2|26|41305.68|0.01|0.05|A|F|1993-08-02|1993-09-15|1993-08-13|COLLECT COD|REG AIR|refully regular ideas nag express platelet +15271|1833|77|3|30|52044.90|0.05|0.01|R|F|1993-11-23|1993-09-18|1993-12-21|DELIVER IN PERSON|TRUCK|above the regular ide +15271|300|55|4|34|40810.20|0.06|0.00|A|F|1993-08-16|1993-09-22|1993-08-28|TAKE BACK RETURN|TRUCK| furiously pending fox +15271|1966|55|5|18|33623.28|0.03|0.01|A|F|1993-10-06|1993-09-05|1993-10-13|NONE|MAIL|bold dolphins sleep even, ironic requests +15271|1864|8|6|13|22956.18|0.06|0.07|R|F|1993-10-11|1993-10-07|1993-10-19|TAKE BACK RETURN|FOB|deas haggle blithe +15271|1546|87|7|38|55006.52|0.04|0.02|A|F|1993-11-16|1993-10-14|1993-12-03|DELIVER IN PERSON|RAIL|nusual, fluffy depend +15296|1713|14|1|50|80735.50|0.03|0.03|A|F|1992-09-08|1992-09-16|1992-09-11|COLLECT COD|AIR|nts cajole slyly against the reg +15296|923|26|2|9|16415.28|0.02|0.02|A|F|1992-09-10|1992-09-28|1992-09-25|DELIVER IN PERSON|REG AIR|y ironic requests poach bl +15296|661|24|3|6|9369.96|0.00|0.01|A|F|1992-08-14|1992-10-03|1992-08-18|NONE|MAIL|of the regular, bold de +15297|608|9|1|42|63361.20|0.00|0.04|N|O|1996-10-20|1996-08-18|1996-10-28|NONE|SHIP|lly unusual packages wake. +15297|1248|23|2|2|2298.48|0.05|0.03|N|O|1996-08-30|1996-09-17|1996-09-20|DELIVER IN PERSON|MAIL|uests after the carefully regul +15297|131|10|3|5|5155.65|0.10|0.02|N|O|1996-11-05|1996-08-23|1996-11-24|NONE|SHIP|lly even grouches. spec +15297|951|20|4|39|72226.05|0.03|0.02|N|O|1996-10-10|1996-09-17|1996-10-21|TAKE BACK RETURN|TRUCK| unusual decoys. special, s +15297|1741|84|5|33|54210.42|0.01|0.07|N|O|1996-09-12|1996-09-05|1996-10-04|DELIVER IN PERSON|REG AIR|ounts boost around the furiously final pac +15298|1683|25|1|35|55463.80|0.05|0.03|N|O|1995-12-17|1995-10-08|1995-12-22|NONE|SHIP|manent deposits wake blithely slyly silen +15298|696|59|2|15|23950.35|0.02|0.05|N|O|1995-09-18|1995-10-30|1995-10-02|DELIVER IN PERSON|RAIL|egrate blithely. pending, ironic pa +15298|1711|38|3|25|40317.75|0.10|0.03|N|O|1995-09-17|1995-10-25|1995-09-23|NONE|AIR|ithely ironic foxes acro +15298|179|58|4|2|2158.34|0.06|0.00|N|O|1996-01-02|1995-10-17|1996-01-25|NONE|REG AIR|pecial ideas sleep carefully abo +15298|872|72|5|24|42548.88|0.09|0.03|N|O|1995-10-07|1995-11-10|1995-10-16|TAKE BACK RETURN|TRUCK|sly fluffily regular package +15299|358|87|1|45|56625.75|0.01|0.00|N|O|1996-08-15|1996-07-20|1996-08-28|DELIVER IN PERSON|SHIP|ven courts pri +15299|152|5|2|4|4208.60|0.01|0.01|N|O|1996-07-17|1996-07-05|1996-07-30|COLLECT COD|RAIL|posits haggle around the slowly unusual +15299|1995|96|3|8|15175.92|0.04|0.08|N|O|1996-07-22|1996-08-02|1996-07-25|TAKE BACK RETURN|RAIL|pendencies wake idly furiously even pains +15300|918|87|1|25|45472.75|0.09|0.02|A|F|1995-05-15|1995-04-08|1995-06-05|TAKE BACK RETURN|FOB|ronic deposits +15300|318|75|2|32|38985.92|0.06|0.06|A|F|1995-05-27|1995-03-13|1995-06-14|TAKE BACK RETURN|FOB|hinder quickly after +15300|614|46|3|5|7573.05|0.02|0.06|A|F|1995-03-22|1995-04-18|1995-04-21|COLLECT COD|SHIP|kages. slyly express foxes are blithely +15300|210|65|4|35|38857.35|0.05|0.08|A|F|1995-04-13|1995-05-04|1995-05-12|COLLECT COD|TRUCK|ges haggle blithe +15300|916|19|5|48|87211.68|0.03|0.02|A|F|1995-02-24|1995-04-13|1995-03-13|TAKE BACK RETURN|REG AIR|lar accounts! furiously unusual accounts c +15301|191|18|1|16|17459.04|0.09|0.02|A|F|1995-03-22|1995-02-03|1995-04-18|TAKE BACK RETURN|AIR|ptotes serve blit +15301|241|23|2|40|45649.60|0.09|0.03|R|F|1995-03-16|1995-02-21|1995-03-23|TAKE BACK RETURN|TRUCK|s. carefully bold requests against the qu +15301|884|84|3|6|10709.28|0.06|0.08|A|F|1995-01-13|1995-02-01|1995-01-28|TAKE BACK RETURN|TRUCK|tes. final foxes are furiousl +15302|1916|49|1|42|76352.22|0.04|0.05|N|O|1996-09-07|1996-09-03|1996-09-11|COLLECT COD|AIR|imes along the +15302|457|58|2|15|20361.75|0.03|0.08|N|O|1996-09-06|1996-08-29|1996-09-20|NONE|FOB|ernes integrate slyly about the silent, +15302|1521|62|3|28|39830.56|0.06|0.02|N|O|1996-10-12|1996-09-25|1996-11-05|NONE|SHIP|counts. blithely silent w +15302|701|34|4|50|80085.00|0.03|0.07|N|O|1996-07-15|1996-09-25|1996-07-22|TAKE BACK RETURN|REG AIR|osits. blithely pending ins +15303|896|63|1|24|43125.36|0.05|0.04|R|F|1993-09-16|1993-11-08|1993-10-13|COLLECT COD|REG AIR|egular packages haggle quickly. furi +15303|121|74|2|6|6126.72|0.01|0.05|A|F|1993-09-15|1993-11-12|1993-10-01|NONE|TRUCK|sentiments along the +15303|1501|22|3|17|23842.50|0.05|0.05|A|F|1993-09-23|1993-11-29|1993-10-03|COLLECT COD|AIR|e slyly regular pinto beans wake q +15303|982|51|4|26|48957.48|0.00|0.08|A|F|1993-11-01|1993-10-24|1993-11-21|COLLECT COD|FOB|inal, special theodolites. platelets x- +15303|920|21|5|10|18209.20|0.08|0.06|R|F|1993-12-16|1993-10-14|1994-01-06|DELIVER IN PERSON|SHIP|y ideas are along the instruc +15303|685|79|6|41|65012.88|0.05|0.07|A|F|1993-10-09|1993-12-13|1993-10-16|TAKE BACK RETURN|RAIL|s use? packages about the furio +15328|992|27|1|23|43538.77|0.03|0.06|N|O|1997-01-11|1997-03-19|1997-02-07|COLLECT COD|TRUCK|e foxes serve carefully final requests. +15328|169|96|2|24|25659.84|0.01|0.08|N|O|1997-02-24|1997-02-17|1997-03-07|DELIVER IN PERSON|TRUCK|warhorses must have to affix slyly +15329|900|67|1|31|55827.90|0.02|0.04|A|F|1992-05-13|1992-06-16|1992-05-21|TAKE BACK RETURN|REG AIR|ly ironic pinto beans detect blithely abou +15329|1694|36|2|40|63827.60|0.02|0.01|R|F|1992-07-27|1992-06-15|1992-08-15|NONE|RAIL|oze quickly about t +15330|543|44|1|21|30314.34|0.00|0.04|R|F|1993-08-22|1993-07-25|1993-09-16|DELIVER IN PERSON|RAIL|ronic requests sleep quickly inside +15331|440|41|1|49|65681.56|0.00|0.08|N|O|1997-10-09|1997-10-02|1997-10-17|COLLECT COD|TRUCK|nusual platelets nag bl +15331|815|82|2|21|36032.01|0.06|0.05|N|O|1997-09-15|1997-09-18|1997-10-09|DELIVER IN PERSON|TRUCK|ncies promise blithely pending theodol +15331|1440|19|3|15|20121.60|0.04|0.04|N|O|1997-07-25|1997-09-21|1997-08-12|NONE|RAIL|ar pinto beans wake fluffily e +15331|1696|38|4|7|11183.83|0.09|0.08|N|O|1997-07-29|1997-09-12|1997-08-02|NONE|SHIP| packages hinder. final accounts po +15331|275|76|5|24|28206.48|0.09|0.06|N|O|1997-07-25|1997-09-01|1997-07-31|COLLECT COD|REG AIR|ully about the dependencie +15331|1470|88|6|39|53487.33|0.10|0.07|N|O|1997-08-11|1997-09-24|1997-09-03|DELIVER IN PERSON|AIR|ackages detect. furio +15331|1119|56|7|9|9180.99|0.09|0.04|N|O|1997-07-23|1997-08-13|1997-08-14|TAKE BACK RETURN|MAIL|ven platelets. furiously final +15332|354|39|1|17|21323.95|0.01|0.03|R|F|1993-07-02|1993-08-07|1993-07-08|NONE|SHIP|ven ideas after the instructio +15332|278|79|2|15|17674.05|0.09|0.04|A|F|1993-07-27|1993-08-23|1993-08-22|TAKE BACK RETURN|SHIP|ound the pending +15332|1231|69|3|2|2264.46|0.01|0.01|A|F|1993-09-25|1993-07-16|1993-10-19|DELIVER IN PERSON|AIR| haggle furiously regular acco +15332|1628|29|4|18|27533.16|0.04|0.00|A|F|1993-07-22|1993-07-13|1993-08-04|COLLECT COD|FOB|! ironic, unu +15333|1318|33|1|12|14631.72|0.05|0.04|N|O|1996-04-12|1996-05-08|1996-05-09|TAKE BACK RETURN|SHIP|s use fluffily acc +15333|867|1|2|14|24750.04|0.04|0.03|N|O|1996-06-02|1996-04-27|1996-06-10|COLLECT COD|TRUCK|the dependencies should wake around the +15333|1943|32|3|16|29519.04|0.03|0.08|N|O|1996-02-21|1996-05-04|1996-03-04|COLLECT COD|AIR|y ironic re +15333|703|36|4|18|28866.60|0.07|0.02|N|O|1996-05-17|1996-04-27|1996-06-03|COLLECT COD|FOB|ackages wake slyly. q +15333|1148|49|5|30|31474.20|0.03|0.05|N|O|1996-04-24|1996-04-12|1996-05-08|NONE|TRUCK| use. furiously even pi +15333|1498|99|6|37|51781.13|0.07|0.00|N|O|1996-03-22|1996-04-12|1996-04-21|TAKE BACK RETURN|MAIL|ag blithely amo +15333|819|53|7|45|77391.45|0.01|0.01|N|O|1996-06-09|1996-04-03|1996-06-15|NONE|REG AIR|special, bold theodolites. even, +15334|671|3|1|12|18860.04|0.08|0.07|N|O|1996-05-27|1996-05-04|1996-06-21|COLLECT COD|REG AIR| carefully bold ideas integrat +15334|282|83|2|34|40197.52|0.09|0.01|N|O|1996-05-26|1996-03-19|1996-05-28|COLLECT COD|TRUCK|ously special packages nag furiou +15334|409|68|3|37|48447.80|0.04|0.05|N|O|1996-03-21|1996-03-23|1996-04-12|NONE|AIR|regular packages cajole. regu +15334|962|97|4|44|81970.24|0.06|0.06|N|O|1996-04-18|1996-04-04|1996-05-14|TAKE BACK RETURN|RAIL| excuses. bold +15334|1895|96|5|24|43125.36|0.01|0.04|N|O|1996-04-05|1996-04-23|1996-04-25|NONE|TRUCK|e sly theodolites. carefully special a +15334|648|42|6|47|72786.08|0.04|0.04|N|O|1996-02-24|1996-04-13|1996-03-04|NONE|MAIL|ests. furiously pend +15335|1321|22|1|6|7333.92|0.09|0.00|R|F|1993-12-03|1993-11-09|1993-12-05|TAKE BACK RETURN|MAIL|ilent asymptotes. slyly q +15335|74|25|2|34|33118.38|0.01|0.05|A|F|1993-09-23|1993-11-30|1993-10-11|DELIVER IN PERSON|REG AIR|deposits around +15335|1608|9|3|25|37740.00|0.08|0.02|A|F|1993-12-28|1993-12-11|1994-01-07|COLLECT COD|TRUCK|ructions haggle. de +15335|1719|20|4|27|43759.17|0.01|0.07|R|F|1994-01-14|1993-12-04|1994-02-07|DELIVER IN PERSON|SHIP|each regular +15335|360|89|5|42|52935.12|0.05|0.04|A|F|1993-11-13|1993-11-19|1993-12-07|TAKE BACK RETURN|SHIP|ven deposits sleep quickly acco +15360|1672|14|1|16|25178.72|0.02|0.07|N|O|1997-12-17|1997-12-31|1998-01-03|NONE|RAIL|ironic requests are fluffily even, +15360|522|83|2|48|68280.96|0.02|0.06|N|O|1998-03-05|1997-12-26|1998-03-18|COLLECT COD|TRUCK|beans nag fluffily packages. final requests +15361|885|19|1|18|32145.84|0.08|0.03|A|F|1995-01-30|1995-02-14|1995-02-16|NONE|TRUCK| the regular, final accounts; carefully re +15361|1754|81|2|12|19869.00|0.00|0.04|R|F|1995-03-21|1995-01-01|1995-04-07|DELIVER IN PERSON|SHIP|totes wake unusual, final so +15362|355|84|1|19|23851.65|0.10|0.06|A|F|1994-02-25|1994-01-17|1994-02-26|DELIVER IN PERSON|REG AIR|ar, bold accounts sleep. furiously unusual +15362|732|33|2|19|31021.87|0.05|0.08|A|F|1994-03-01|1994-01-20|1994-03-30|NONE|REG AIR| ironic accounts print: bl +15363|149|76|1|19|19933.66|0.09|0.01|N|O|1997-10-24|1997-08-14|1997-11-04|NONE|REG AIR|iously. final, final pinto b +15363|1211|49|2|3|3336.63|0.05|0.07|N|O|1997-09-14|1997-09-19|1997-09-23|DELIVER IN PERSON|RAIL|eposits. carefully pendi +15363|1154|55|3|1|1055.15|0.10|0.02|N|O|1997-07-10|1997-09-24|1997-07-30|TAKE BACK RETURN|AIR|s sleep quickly a +15363|428|29|4|13|17269.46|0.02|0.01|N|O|1997-09-28|1997-09-11|1997-10-21|COLLECT COD|TRUCK|y final courts +15363|1710|37|5|30|48351.30|0.00|0.00|N|O|1997-08-06|1997-09-27|1997-08-12|COLLECT COD|REG AIR|dependencies wake carefully +15364|1587|28|1|41|61031.78|0.05|0.02|N|O|1998-02-08|1998-03-16|1998-03-02|TAKE BACK RETURN|MAIL|deposits are about the fluffily silent p +15364|1897|84|2|20|35977.80|0.05|0.01|N|O|1998-03-20|1998-02-16|1998-03-31|DELIVER IN PERSON|FOB|s. carefully express pinto beans hinder +15364|1406|24|3|37|48373.80|0.02|0.06|N|O|1998-01-16|1998-03-08|1998-02-13|DELIVER IN PERSON|SHIP|ke. sometimes +15364|1777|20|4|5|8393.85|0.01|0.06|N|O|1998-03-27|1998-04-14|1998-03-29|COLLECT COD|TRUCK|y final instructions! regular platele +15365|851|51|1|8|14014.80|0.01|0.03|N|O|1998-03-30|1998-03-26|1998-04-15|NONE|AIR|e instructions. iro +15365|1947|48|2|46|85051.24|0.08|0.07|N|O|1998-02-19|1998-03-09|1998-03-18|COLLECT COD|FOB| alongside of the furiously iron +15365|1340|55|3|27|33516.18|0.07|0.06|N|O|1998-01-21|1998-02-26|1998-02-11|NONE|REG AIR|sly regular accounts haggle qu +15365|1781|66|4|19|31972.82|0.02|0.04|N|O|1998-02-09|1998-03-11|1998-03-10|NONE|REG AIR|uriously final +15366|1863|64|1|21|37062.06|0.04|0.08|A|F|1994-03-06|1994-03-21|1994-03-16|NONE|AIR|counts aroun +15366|928|63|2|23|42065.16|0.05|0.03|R|F|1994-01-25|1994-03-09|1994-02-24|NONE|RAIL|. special accounts +15367|1480|98|1|17|23485.16|0.10|0.08|A|F|1992-04-30|1992-05-28|1992-05-27|TAKE BACK RETURN|REG AIR|rash deposits. car +15392|526|17|1|25|35663.00|0.07|0.06|A|F|1993-05-12|1993-08-06|1993-06-06|DELIVER IN PERSON|FOB|xes. final foxes boost blithely ove +15393|802|36|1|28|47678.40|0.06|0.00|N|O|1997-12-28|1997-12-31|1998-01-19|DELIVER IN PERSON|FOB|ely carefully pending platelet +15394|314|71|1|15|18214.65|0.06|0.07|N|O|1996-12-08|1996-10-26|1996-12-23|COLLECT COD|SHIP|fully even packages cajole closel +15394|762|63|2|19|31592.44|0.08|0.04|N|O|1996-10-24|1996-11-30|1996-11-10|NONE|RAIL|accounts. f +15394|1578|99|3|30|44387.10|0.03|0.08|N|O|1996-12-11|1996-11-14|1997-01-03|TAKE BACK RETURN|AIR|he quickly +15394|1051|22|4|12|11424.60|0.02|0.01|N|O|1996-10-21|1996-10-10|1996-11-14|NONE|REG AIR|ans. slyly +15395|144|45|1|36|37589.04|0.08|0.07|N|O|1996-07-20|1996-07-22|1996-08-10|TAKE BACK RETURN|TRUCK|rding to the special forges cajole final +15396|141|20|1|3|3123.42|0.01|0.08|N|O|1998-01-28|1998-02-24|1998-02-05|COLLECT COD|AIR|ely final theodolites cajole qui +15396|1335|50|2|13|16072.29|0.04|0.07|N|O|1998-01-12|1998-02-22|1998-01-15|TAKE BACK RETURN|REG AIR|arefully p +15396|796|97|3|29|49206.91|0.08|0.00|N|O|1998-02-01|1998-02-11|1998-02-28|NONE|AIR|sts integrate boldly! slyly +15396|683|77|4|26|41175.68|0.03|0.07|N|O|1998-03-17|1998-02-09|1998-04-14|TAKE BACK RETURN|REG AIR|against the dolphins: carefully unusua +15396|1938|83|5|29|53357.97|0.03|0.03|N|O|1998-03-03|1998-01-17|1998-03-20|TAKE BACK RETURN|SHIP|l pinto beans. silent, fina +15397|1909|42|1|45|81490.50|0.03|0.01|R|F|1993-03-19|1993-03-18|1993-04-11|TAKE BACK RETURN|REG AIR| ironic accoun +15397|669|32|2|50|78483.00|0.06|0.05|R|F|1993-02-22|1993-04-17|1993-03-12|NONE|RAIL|ajole blithely above the furiousl +15397|1775|76|3|34|57010.18|0.10|0.05|R|F|1993-03-29|1993-03-10|1993-04-12|DELIVER IN PERSON|MAIL|e silent accounts. co +15397|650|13|4|24|37215.60|0.01|0.06|R|F|1993-03-18|1993-03-25|1993-04-17|COLLECT COD|RAIL|yly regular waters. carefully pending pi +15397|671|34|5|11|17288.37|0.06|0.02|A|F|1993-05-04|1993-04-07|1993-05-24|TAKE BACK RETURN|AIR|the carefully pending instructions. spe +15397|1806|93|6|29|49526.20|0.07|0.00|R|F|1993-03-29|1993-05-03|1993-04-19|COLLECT COD|SHIP|ly bold pinto beans. braids +15397|357|14|7|25|31433.75|0.08|0.00|R|F|1993-04-04|1993-04-18|1993-04-06|COLLECT COD|TRUCK| sleep slyly after +15398|1860|47|1|19|33475.34|0.03|0.02|R|F|1993-11-30|1994-01-17|1993-12-26|TAKE BACK RETURN|TRUCK|en platelets. f +15398|1772|57|2|17|28454.09|0.08|0.07|R|F|1994-01-18|1994-02-08|1994-02-12|TAKE BACK RETURN|SHIP|tions wake final, ironic theodolites. flu +15399|1582|3|1|50|74179.00|0.04|0.07|A|F|1992-06-05|1992-08-04|1992-06-22|NONE|REG AIR|quickly ironic requests. slyly express acco +15399|794|59|2|15|25421.85|0.01|0.05|R|F|1992-07-08|1992-08-04|1992-07-12|TAKE BACK RETURN|RAIL|refully regular excuses. deposits haggle s +15399|36|87|3|35|32761.05|0.04|0.06|A|F|1992-09-08|1992-08-06|1992-09-22|DELIVER IN PERSON|SHIP|kly. pending +15399|1877|7|4|16|28461.92|0.02|0.01|R|F|1992-06-01|1992-07-09|1992-06-27|TAKE BACK RETURN|RAIL|al dolphins boost +15399|757|58|5|2|3315.50|0.08|0.08|A|F|1992-08-07|1992-07-18|1992-09-04|DELIVER IN PERSON|MAIL|ously express theodolites hag +15399|439|27|6|45|60274.35|0.08|0.06|A|F|1992-08-18|1992-07-14|1992-09-01|COLLECT COD|MAIL|uickly. carefully regular packa +15424|338|39|1|32|39626.56|0.06|0.06|N|O|1997-09-08|1997-10-27|1997-10-05|DELIVER IN PERSON|RAIL|sits nag carefu +15425|1581|82|1|36|53372.88|0.10|0.03|N|O|1995-09-29|1995-10-21|1995-10-26|DELIVER IN PERSON|REG AIR|n, express inst +15425|55|31|2|40|38202.00|0.00|0.02|N|O|1995-08-26|1995-10-18|1995-09-25|TAKE BACK RETURN|SHIP|he instructions! furiously special depos +15425|733|98|3|30|49011.90|0.09|0.07|N|O|1995-08-26|1995-09-11|1995-09-04|TAKE BACK RETURN|RAIL|er the carefully regula +15426|814|15|1|47|80596.07|0.07|0.05|N|O|1997-03-20|1997-04-22|1997-03-23|NONE|RAIL|ggle quickly furiously even packages. ir +15426|446|34|2|34|45778.96|0.00|0.07|N|O|1997-04-09|1997-03-05|1997-05-05|TAKE BACK RETURN|FOB|ajole furiously. slyly pending +15426|290|91|3|21|24996.09|0.02|0.01|N|O|1997-04-28|1997-03-18|1997-05-03|COLLECT COD|AIR|nic packages about +15427|1256|31|1|50|57862.50|0.10|0.02|N|O|1996-03-07|1996-02-24|1996-03-26|COLLECT COD|REG AIR|d accounts sleep across the ironic, +15427|1082|83|2|26|25560.08|0.03|0.03|N|O|1996-02-10|1996-01-26|1996-03-01|TAKE BACK RETURN|SHIP|ous instructions sleep against +15427|547|8|3|27|39083.58|0.00|0.05|N|O|1996-01-13|1996-02-23|1996-02-11|COLLECT COD|SHIP|se, ironic ideas. final deposits about the +15428|615|47|1|33|50015.13|0.08|0.08|R|F|1995-06-01|1995-03-16|1995-06-10|DELIVER IN PERSON|AIR|kly brave ideas are quickly express reques +15428|59|60|2|39|37402.95|0.00|0.05|A|F|1995-05-04|1995-04-15|1995-05-31|TAKE BACK RETURN|FOB|ven ideas about the packages are fluffily +15428|123|76|3|49|50132.88|0.05|0.04|A|F|1995-04-30|1995-04-02|1995-05-25|DELIVER IN PERSON|AIR|y across the careful +15428|1861|91|4|38|66988.68|0.01|0.00|A|F|1995-02-18|1995-03-29|1995-03-15|COLLECT COD|FOB|xcuses after the ca +15429|418|77|1|12|15820.92|0.02|0.08|N|O|1997-07-15|1997-05-25|1997-07-24|NONE|SHIP|nal dolphins nag slyly. furio +15429|889|56|2|1|1789.88|0.02|0.07|N|O|1997-06-11|1997-06-12|1997-06-28|TAKE BACK RETURN|MAIL|lar platelets sleep quickly alon +15429|691|23|3|46|73217.74|0.09|0.04|N|O|1997-05-20|1997-04-23|1997-06-04|COLLECT COD|TRUCK|s. carefully fi +15429|546|77|4|13|18805.02|0.05|0.07|N|O|1997-06-07|1997-04-29|1997-06-11|DELIVER IN PERSON|MAIL|ly regular theodolites. careful +15429|580|11|5|44|65145.52|0.07|0.03|N|O|1997-06-14|1997-06-12|1997-06-20|TAKE BACK RETURN|SHIP|furiously ironic requests. regu +15429|1897|27|6|2|3597.78|0.06|0.04|N|O|1997-07-11|1997-06-10|1997-07-31|DELIVER IN PERSON|REG AIR|uickly final reques +15430|28|54|1|20|18560.40|0.06|0.03|N|O|1998-06-12|1998-04-20|1998-06-26|NONE|AIR|out the ideas are slyly +15430|1218|19|2|1|1119.21|0.08|0.02|N|O|1998-05-20|1998-06-04|1998-05-21|TAKE BACK RETURN|FOB| pinto beans nag carefull +15431|1326|3|1|50|61366.00|0.04|0.07|A|F|1992-09-01|1992-10-04|1992-09-24|COLLECT COD|AIR|ideas haggle acros +15431|1160|97|2|1|1061.16|0.02|0.01|A|F|1992-09-10|1992-10-02|1992-09-17|TAKE BACK RETURN|REG AIR|al packages alongside of the r +15431|1458|76|3|44|59815.80|0.01|0.01|A|F|1992-08-20|1992-08-24|1992-09-08|COLLECT COD|AIR| blithely +15431|57|58|4|46|44024.30|0.00|0.04|A|F|1992-10-29|1992-08-31|1992-11-05|NONE|SHIP| pending theodolit +15431|1198|99|5|13|14289.47|0.08|0.06|R|F|1992-08-24|1992-09-25|1992-09-22|TAKE BACK RETURN|FOB|ironic asymptotes +15431|358|43|6|28|35233.80|0.00|0.06|A|F|1992-09-02|1992-09-08|1992-09-15|DELIVER IN PERSON|REG AIR|platelets would ha +15431|29|80|7|7|6503.14|0.07|0.02|R|F|1992-10-29|1992-10-03|1992-11-18|NONE|FOB|n asymptotes print bl +15456|1352|67|1|26|32587.10|0.05|0.01|R|F|1993-12-15|1993-11-19|1993-12-27|COLLECT COD|REG AIR|ke. packages above the r +15456|278|60|2|15|17674.05|0.07|0.05|R|F|1993-11-11|1993-12-03|1993-11-16|TAKE BACK RETURN|MAIL|arefully even depo +15456|1057|93|3|33|31615.65|0.10|0.05|A|F|1994-01-21|1993-12-01|1994-01-29|COLLECT COD|SHIP| the furiously bold pac +15456|1131|40|4|47|48510.11|0.10|0.06|R|F|1994-01-11|1993-12-28|1994-02-04|DELIVER IN PERSON|TRUCK|requests. quickly expre +15456|1178|51|5|19|20504.23|0.09|0.07|A|F|1994-02-03|1993-12-27|1994-02-20|COLLECT COD|MAIL|ickly above the even +15457|58|9|1|3|2874.15|0.00|0.07|N|O|1997-02-10|1997-01-06|1997-02-22|TAKE BACK RETURN|SHIP| boost. req +15457|281|9|2|27|31894.56|0.04|0.06|N|O|1996-11-26|1996-12-31|1996-12-19|NONE|FOB|kages. accounts sleep quickl +15457|1723|8|3|36|58489.92|0.07|0.00|N|O|1996-12-02|1997-01-26|1996-12-17|COLLECT COD|FOB|g the carefully regular idea +15457|1196|5|4|8|8777.52|0.01|0.06|N|O|1996-12-17|1996-12-30|1996-12-21|TAKE BACK RETURN|REG AIR|gle fluffily after the carefully +15458|1225|26|1|42|47301.24|0.10|0.01|N|O|1997-07-13|1997-08-09|1997-08-02|COLLECT COD|MAIL|ges affix ironic, bold ideas-- blithe +15458|1887|74|2|27|48299.76|0.09|0.05|N|O|1997-09-07|1997-07-30|1997-09-30|COLLECT COD|MAIL|ular deposits ar +15458|902|3|3|44|79327.60|0.08|0.05|N|O|1997-05-28|1997-07-03|1997-06-19|DELIVER IN PERSON|FOB|accounts. idly eve +15459|1481|82|1|23|31797.04|0.07|0.04|R|F|1994-10-09|1994-12-20|1994-10-10|DELIVER IN PERSON|RAIL|beans cajole slyly. depos +15459|717|18|2|3|4853.13|0.06|0.01|A|F|1994-11-06|1994-12-18|1994-11-18|TAKE BACK RETURN|TRUCK|s above the fluffil +15459|308|93|3|11|13291.30|0.06|0.06|R|F|1994-12-02|1995-01-02|1994-12-23|DELIVER IN PERSON|MAIL| pending pinto beans wake alongside of the +15459|791|92|4|38|64288.02|0.08|0.08|R|F|1994-11-23|1994-11-15|1994-11-27|NONE|RAIL|ly among the furiously b +15460|897|97|1|11|19776.79|0.01|0.04|N|O|1997-08-08|1997-08-02|1997-08-26|COLLECT COD|TRUCK|uickly. accoun +15461|261|16|1|8|9290.08|0.05|0.02|R|F|1993-04-16|1993-02-09|1993-05-06|DELIVER IN PERSON|TRUCK|ular accounts wake slyly +15461|186|65|2|49|53222.82|0.07|0.05|R|F|1993-02-25|1993-03-14|1993-03-05|NONE|SHIP|s cajole quickly. unusual, express fo +15462|33|34|1|38|35455.14|0.05|0.01|R|F|1995-04-20|1995-04-19|1995-05-02|NONE|RAIL|y final accounts. carefully final ins +15462|1749|76|2|44|72632.56|0.00|0.00|R|F|1995-04-13|1995-05-06|1995-05-05|NONE|SHIP|ckly ironic foxe +15463|553|84|1|43|62502.65|0.09|0.01|A|F|1993-09-20|1993-09-22|1993-09-29|NONE|REG AIR|l platelets. frets along the carefull +15463|1901|34|2|34|61298.60|0.09|0.07|R|F|1993-10-12|1993-10-01|1993-11-05|NONE|REG AIR|ites haggle carefully +15463|1062|68|3|25|24076.50|0.03|0.03|R|F|1993-11-16|1993-09-12|1993-11-29|DELIVER IN PERSON|MAIL|r theodolites. quickly final packages n +15463|127|6|4|27|27732.24|0.03|0.03|R|F|1993-08-31|1993-09-08|1993-09-24|TAKE BACK RETURN|TRUCK|arefully fluff +15463|1576|57|5|15|22163.55|0.08|0.06|A|F|1993-09-15|1993-09-19|1993-09-16|TAKE BACK RETURN|AIR|nis haggle furiously enti +15463|1699|82|6|16|25611.04|0.05|0.05|R|F|1993-11-19|1993-10-06|1993-12-04|TAKE BACK RETURN|REG AIR|ions cajole furiously. quickly regul +15488|1388|27|1|12|15472.56|0.03|0.01|N|O|1997-03-23|1997-05-01|1997-03-26|TAKE BACK RETURN|TRUCK|uriously even ideas haggle accordin +15488|1694|36|2|11|17552.59|0.10|0.01|N|O|1997-05-30|1997-05-11|1997-06-05|NONE|FOB|ong the fluffily pending deposits nag afte +15488|938|7|3|42|77235.06|0.09|0.07|N|O|1997-06-19|1997-04-02|1997-07-10|DELIVER IN PERSON|MAIL|ly final accounts sleep quick +15488|1194|31|4|50|54759.50|0.06|0.01|N|O|1997-06-12|1997-04-07|1997-06-15|TAKE BACK RETURN|MAIL|its after the ironic pac +15488|280|8|5|13|15343.64|0.05|0.04|N|O|1997-05-31|1997-04-23|1997-06-12|TAKE BACK RETURN|MAIL|e pending ideas haggle furio +15488|696|28|6|6|9580.14|0.02|0.01|N|O|1997-06-21|1997-05-19|1997-07-20|TAKE BACK RETURN|REG AIR|are carefully furiou +15489|1033|34|1|38|35493.14|0.06|0.07|N|O|1996-04-17|1996-05-08|1996-05-02|COLLECT COD|RAIL|osits solve. slyly fi +15490|1367|82|1|4|5073.44|0.01|0.02|N|O|1998-01-12|1997-11-05|1998-01-14|TAKE BACK RETURN|TRUCK|the furiously ironic +15490|440|70|2|30|40213.20|0.02|0.04|N|O|1997-10-09|1997-12-07|1997-10-12|DELIVER IN PERSON|SHIP|g excuses bo +15490|217|18|3|21|23461.41|0.05|0.06|N|O|1997-11-02|1997-10-20|1997-11-20|TAKE BACK RETURN|MAIL|efully care +15491|1762|89|1|10|16637.60|0.08|0.05|R|F|1992-02-01|1992-03-18|1992-02-27|TAKE BACK RETURN|MAIL|y final package +15491|1692|75|2|21|33467.49|0.03|0.07|A|F|1992-03-16|1992-03-14|1992-04-05|TAKE BACK RETURN|RAIL| are across the sil +15491|1005|6|3|49|44394.00|0.09|0.00|R|F|1992-02-14|1992-03-16|1992-03-03|COLLECT COD|TRUCK|mong the car +15491|1252|90|4|36|41517.00|0.07|0.03|R|F|1992-04-15|1992-04-11|1992-05-14|TAKE BACK RETURN|FOB|lyly ironic instructions wake within th +15491|391|48|5|1|1291.39|0.06|0.03|A|F|1992-01-25|1992-03-31|1992-02-11|TAKE BACK RETURN|FOB|dencies thrash above +15491|14|15|6|2|1828.02|0.00|0.02|A|F|1992-01-29|1992-03-16|1992-02-26|COLLECT COD|RAIL|as carefully aft +15491|1217|92|7|48|53674.08|0.06|0.06|R|F|1992-04-05|1992-04-03|1992-04-19|NONE|SHIP|arefully even foxes. slyl +15492|429|59|1|48|63812.16|0.02|0.02|R|F|1992-03-17|1992-05-03|1992-04-02|DELIVER IN PERSON|SHIP|even pinto beans sleep blithely slyly re +15493|922|25|1|47|85677.24|0.07|0.02|N|O|1996-11-07|1996-12-01|1996-11-08|DELIVER IN PERSON|MAIL|. even attainments haggle iron +15493|1535|56|2|21|30167.13|0.04|0.00|N|O|1997-01-02|1997-01-16|1997-01-15|NONE|FOB|y regular instructions wake slyly daring d +15493|936|37|3|11|20206.23|0.04|0.01|N|O|1996-12-24|1997-01-01|1997-01-12|NONE|RAIL|ckly. dari +15493|677|9|4|48|75728.16|0.09|0.08|N|O|1996-11-19|1997-01-18|1996-12-04|DELIVER IN PERSON|TRUCK|lly ironic asymp +15493|1616|17|5|44|66774.84|0.02|0.08|N|O|1996-12-23|1997-01-05|1997-01-03|DELIVER IN PERSON|AIR|dolites boost +15493|77|78|6|19|18564.33|0.10|0.01|N|O|1996-11-12|1997-01-06|1996-12-01|DELIVER IN PERSON|MAIL|sits detec +15494|1934|79|1|40|73437.20|0.01|0.06|N|O|1997-06-10|1997-08-05|1997-07-02|NONE|SHIP|ages was blithely above the +15494|1511|12|2|8|11300.08|0.02|0.02|N|O|1997-09-01|1997-07-18|1997-09-26|NONE|AIR|s at the final requests detect f +15494|759|56|3|26|43153.50|0.03|0.05|N|O|1997-06-14|1997-08-02|1997-07-12|TAKE BACK RETURN|RAIL|riously ir +15495|1641|83|1|42|64790.88|0.02|0.06|N|O|1998-02-28|1998-04-07|1998-03-24|TAKE BACK RETURN|MAIL|ions. stealthy dependenci +15495|1133|42|2|4|4136.52|0.09|0.07|N|O|1998-06-03|1998-04-01|1998-06-15|NONE|RAIL|yly blithe +15495|860|60|3|7|12326.02|0.05|0.08|N|O|1998-05-13|1998-05-19|1998-05-28|DELIVER IN PERSON|SHIP|s nag regular pint +15495|1826|27|4|43|74296.26|0.05|0.03|N|O|1998-05-25|1998-05-08|1998-05-29|TAKE BACK RETURN|REG AIR|usly final excuses +15520|1896|26|1|42|75511.38|0.09|0.06|N|O|1997-11-07|1997-10-02|1997-11-29|TAKE BACK RETURN|TRUCK|deposits. foxes after +15520|514|45|2|46|65067.46|0.09|0.05|N|O|1997-12-05|1997-10-21|1997-12-21|DELIVER IN PERSON|RAIL| pains. blithely even +15520|99|75|3|13|12988.17|0.08|0.06|N|O|1997-08-31|1997-10-14|1997-09-21|COLLECT COD|AIR| final deposi +15520|1956|89|4|1|1857.95|0.09|0.08|N|O|1997-10-12|1997-11-07|1997-10-25|NONE|TRUCK| instructions wake about the requests. blit +15520|28|54|5|47|43616.94|0.08|0.00|N|O|1997-10-26|1997-09-23|1997-11-05|TAKE BACK RETURN|AIR|beans. carefully ironic depe +15520|437|38|6|44|58846.92|0.04|0.07|N|O|1997-10-13|1997-10-20|1997-11-06|DELIVER IN PERSON|TRUCK|uctions use carefully around the +15520|1380|81|7|26|33315.88|0.07|0.02|N|O|1997-12-10|1997-09-22|1997-12-17|NONE|SHIP|. ruthlessly regular forges sleep fluffily; +15521|412|42|1|24|31497.84|0.06|0.03|N|O|1997-04-27|1997-03-20|1997-05-27|COLLECT COD|REG AIR|the carefully even asymptotes. c +15521|1075|46|2|18|17569.26|0.04|0.06|N|O|1997-04-10|1997-04-20|1997-04-16|TAKE BACK RETURN|SHIP|dolites cajole accounts: bravely re +15522|45|71|1|23|21735.92|0.09|0.05|R|F|1994-07-13|1994-07-21|1994-07-23|TAKE BACK RETURN|AIR|ven deposits haggle blithely fur +15522|1263|38|2|18|20956.68|0.09|0.05|A|F|1994-10-03|1994-07-15|1994-11-01|NONE|TRUCK| blithely regular +15522|149|28|3|1|1049.14|0.01|0.07|A|F|1994-08-20|1994-07-23|1994-08-21|TAKE BACK RETURN|AIR|quickly iron +15522|512|73|4|1|1412.51|0.01|0.00|A|F|1994-09-18|1994-08-15|1994-09-27|TAKE BACK RETURN|RAIL|ackages. flu +15522|139|40|5|43|44682.59|0.10|0.05|R|F|1994-06-20|1994-07-24|1994-07-18|TAKE BACK RETURN|MAIL|sts. ideas across the s +15522|1753|80|6|24|39714.00|0.00|0.06|R|F|1994-06-15|1994-08-29|1994-07-08|TAKE BACK RETURN|TRUCK|ve the gifts-- f +15523|1569|70|1|9|13235.04|0.06|0.04|N|O|1998-05-05|1998-07-02|1998-05-11|COLLECT COD|REG AIR| instructions. ironic deposits haggle furio +15523|1663|64|2|14|21905.24|0.00|0.08|N|O|1998-08-07|1998-07-04|1998-08-14|COLLECT COD|AIR|ounts sublate fluffily carefully silen +15523|745|10|3|24|39497.76|0.01|0.03|N|O|1998-07-13|1998-06-07|1998-07-28|NONE|RAIL|ts above the ironic pinto +15523|1676|77|4|29|45752.43|0.04|0.01|N|O|1998-06-03|1998-05-26|1998-07-03|COLLECT COD|AIR|oubt according to the +15523|303|60|5|31|37302.30|0.03|0.04|N|O|1998-06-27|1998-07-05|1998-07-01|COLLECT COD|MAIL|special courts cajole blithely. regular, +15523|1022|58|6|19|17537.38|0.09|0.00|N|O|1998-04-24|1998-06-22|1998-05-02|COLLECT COD|FOB|sits among the unusual ins +15524|1802|89|1|11|18741.80|0.10|0.08|A|F|1992-06-16|1992-06-16|1992-06-17|NONE|RAIL|dolites are blithel +15524|1623|24|2|5|7623.10|0.09|0.05|A|F|1992-05-18|1992-07-05|1992-05-22|DELIVER IN PERSON|FOB|otes according to the theodolites sl +15524|1552|73|3|7|10174.85|0.10|0.00|R|F|1992-08-05|1992-07-17|1992-08-16|COLLECT COD|TRUCK|ar excuses. furiously pen +15525|33|9|1|12|11196.36|0.06|0.00|N|O|1997-10-21|1997-09-27|1997-11-15|COLLECT COD|REG AIR|old accounts. quickly iro +15525|324|81|2|18|22037.76|0.05|0.04|N|O|1997-09-13|1997-09-06|1997-10-12|NONE|REG AIR|against the idea +15526|1549|50|1|30|43516.20|0.06|0.00|N|O|1997-05-10|1997-03-20|1997-05-19|DELIVER IN PERSON|SHIP|o the carefully special req +15527|580|41|1|33|48859.14|0.07|0.08|N|O|1998-10-07|1998-09-01|1998-10-13|NONE|SHIP|t to wake according to +15527|69|45|2|34|32948.04|0.09|0.06|N|O|1998-10-05|1998-07-29|1998-10-23|NONE|FOB|eposits maintain slyly along the fur +15552|1608|91|1|8|12076.80|0.03|0.00|N|O|1996-06-22|1996-06-23|1996-06-26|DELIVER IN PERSON|FOB| unusual packages according +15552|1282|83|2|37|43781.36|0.07|0.04|N|O|1996-04-27|1996-06-28|1996-05-12|DELIVER IN PERSON|TRUCK| regular requests. bold, even requests us +15552|894|94|3|50|89744.50|0.06|0.05|N|O|1996-06-18|1996-06-19|1996-07-14|NONE|MAIL|the slyly pendin +15552|1072|43|4|11|10703.77|0.03|0.05|N|O|1996-05-23|1996-06-14|1996-05-27|DELIVER IN PERSON|RAIL|y pending +15552|1799|84|5|49|83338.71|0.01|0.01|N|O|1996-06-06|1996-07-08|1996-06-13|TAKE BACK RETURN|REG AIR| pending requests. furiously +15552|493|81|6|14|19508.86|0.10|0.01|N|O|1996-04-26|1996-06-28|1996-05-08|TAKE BACK RETURN|RAIL|ructions. +15552|1835|22|7|39|67736.37|0.09|0.01|N|O|1996-05-20|1996-05-24|1996-06-13|NONE|REG AIR|ic, regular requests x-ray. slyly ironic +15553|1015|21|1|50|45800.50|0.04|0.06|N|O|1996-03-13|1996-01-28|1996-04-03|NONE|MAIL|ing excuses boost quickly r +15553|1876|20|2|19|33779.53|0.10|0.05|N|O|1996-03-06|1996-02-16|1996-03-28|TAKE BACK RETURN|TRUCK|eodolites +15554|1312|89|1|5|6066.55|0.06|0.02|R|F|1992-05-04|1992-04-25|1992-05-31|TAKE BACK RETURN|FOB|s detect furiously a +15554|1943|88|2|16|29519.04|0.02|0.01|A|F|1992-04-14|1992-03-21|1992-05-12|TAKE BACK RETURN|REG AIR|into beans. furiously f +15554|808|42|3|47|80313.60|0.08|0.03|R|F|1992-03-29|1992-03-06|1992-04-03|TAKE BACK RETURN|SHIP|ong the quickly express accounts? bold +15554|1482|22|4|2|2766.96|0.07|0.07|A|F|1992-03-14|1992-03-24|1992-03-30|NONE|SHIP|ests nag blithely blithely special s +15555|984|85|1|46|86709.08|0.06|0.02|N|O|1997-10-21|1997-09-12|1997-11-07|NONE|AIR|e furiously regular +15556|137|38|1|33|34225.29|0.08|0.04|A|F|1992-06-21|1992-08-01|1992-07-12|DELIVER IN PERSON|REG AIR|kly even accounts +15556|1107|80|2|39|39315.90|0.10|0.08|R|F|1992-08-03|1992-07-20|1992-08-14|NONE|TRUCK|r excuses are after the accou +15556|1180|17|3|47|50815.46|0.03|0.07|R|F|1992-08-17|1992-07-25|1992-08-24|DELIVER IN PERSON|AIR|n asymptotes-- fluffily silent ideas acc +15556|1805|6|4|31|52910.80|0.00|0.06|R|F|1992-08-25|1992-08-17|1992-09-13|COLLECT COD|RAIL|he carefully special packages! st +15556|63|14|5|16|15408.96|0.03|0.07|R|F|1992-07-20|1992-08-11|1992-08-12|DELIVER IN PERSON|MAIL|eodolites. slyly even +15557|1465|44|1|41|56024.86|0.04|0.02|R|F|1992-04-10|1992-03-10|1992-04-21|TAKE BACK RETURN|MAIL|. regular braids boost. evenly final foxes +15557|1352|29|2|25|31333.75|0.03|0.00|R|F|1992-03-25|1992-04-07|1992-04-23|NONE|RAIL|otes use blithely. fluffily ir +15558|153|32|1|48|50551.20|0.05|0.05|N|O|1997-10-11|1997-12-09|1997-11-08|DELIVER IN PERSON|REG AIR|ccounts. even n +15558|1904|37|2|22|39729.80|0.03|0.06|N|O|1997-10-31|1998-01-02|1997-11-23|DELIVER IN PERSON|TRUCK|iously ironic dependencies cajole +15558|1741|42|3|39|64066.86|0.06|0.01|N|O|1997-11-18|1997-12-20|1997-11-28|TAKE BACK RETURN|SHIP|lithely even ideas are slowly. +15558|1987|20|4|3|5666.94|0.03|0.01|N|O|1997-12-31|1997-12-26|1998-01-12|NONE|RAIL|osits. furiously bold ins +15558|1843|73|5|32|55834.88|0.02|0.06|N|O|1998-01-14|1997-11-14|1998-02-05|TAKE BACK RETURN|TRUCK| carefully? furiously even asymptotes +15558|1294|6|6|36|43030.44|0.04|0.04|N|O|1997-11-12|1997-12-03|1997-11-16|COLLECT COD|RAIL|side of the slyly regular decoys. blithel +15558|1216|54|7|31|34633.51|0.09|0.04|N|O|1998-02-05|1997-12-07|1998-02-12|NONE|RAIL|ly even requ +15559|1406|85|1|17|22225.80|0.00|0.03|N|O|1998-05-25|1998-06-01|1998-06-14|NONE|SHIP|jole carefully. fluffily final depos +15559|1168|41|2|2|2138.32|0.00|0.03|N|O|1998-04-11|1998-05-09|1998-05-08|TAKE BACK RETURN|TRUCK|theodolites. foxes sleep quietly carefull +15559|1621|4|3|35|53291.70|0.10|0.05|N|O|1998-07-05|1998-05-09|1998-07-29|COLLECT COD|REG AIR|tructions above the pains are platele +15584|1164|37|1|42|44736.72|0.05|0.00|N|O|1997-04-10|1997-03-25|1997-04-27|NONE|REG AIR| ideas affix quickly. blithely +15585|1116|17|1|15|15256.65|0.04|0.06|N|O|1997-03-10|1997-02-01|1997-03-14|NONE|MAIL|l packages haggle unusual requests. +15585|880|14|2|28|49864.64|0.10|0.00|N|O|1997-02-04|1997-02-26|1997-02-09|NONE|AIR|otes. even +15585|1561|42|3|7|10237.92|0.02|0.03|N|O|1997-01-30|1997-01-28|1997-02-16|TAKE BACK RETURN|RAIL|iously ironic accounts wake evenly evenly +15585|992|61|4|18|34073.82|0.08|0.04|N|O|1997-01-14|1997-01-24|1997-01-25|TAKE BACK RETURN|REG AIR|ajole quickly across the +15586|1214|26|1|3|3345.63|0.06|0.02|A|F|1995-03-28|1995-02-24|1995-04-10|TAKE BACK RETURN|AIR|s detect ca +15586|122|23|2|17|17376.04|0.06|0.06|R|F|1994-12-23|1995-03-03|1994-12-28|NONE|REG AIR|after the ironic dolphi +15586|590|21|3|47|70057.73|0.05|0.06|A|F|1994-12-19|1995-03-05|1994-12-21|NONE|MAIL| unwind slyly regular ideas +15587|365|22|1|18|22776.48|0.00|0.00|N|O|1997-04-29|1997-06-15|1997-05-22|COLLECT COD|MAIL|silent depend +15587|546|77|2|35|50628.90|0.06|0.08|N|O|1997-06-23|1997-05-30|1997-06-27|NONE|RAIL|uctions among the flu +15587|12|63|3|49|44688.49|0.06|0.07|N|O|1997-04-08|1997-04-24|1997-04-17|COLLECT COD|FOB|thely according to th +15587|44|70|4|38|35873.52|0.10|0.08|N|O|1997-05-02|1997-05-16|1997-05-18|COLLECT COD|TRUCK| even deposits sle +15587|1194|95|5|9|9856.71|0.09|0.02|N|O|1997-05-14|1997-04-25|1997-05-23|NONE|MAIL| blithely after the blithely +15587|1352|53|6|34|42613.90|0.09|0.08|N|O|1997-06-04|1997-05-27|1997-07-04|NONE|TRUCK| against the fluffily +15587|1268|69|7|39|45601.14|0.08|0.08|N|O|1997-04-16|1997-05-25|1997-05-13|NONE|TRUCK| regular theodolites. furiou +15588|210|38|1|8|8881.68|0.05|0.06|N|O|1997-05-15|1997-05-04|1997-05-18|TAKE BACK RETURN|SHIP|ntegrate. r +15588|763|60|2|16|26620.16|0.02|0.06|N|O|1997-07-18|1997-05-20|1997-08-08|NONE|AIR|st carefully according to the sil +15588|417|5|3|2|2634.82|0.03|0.04|N|O|1997-05-22|1997-05-26|1997-05-31|TAKE BACK RETURN|SHIP| the final ideas are slyly care +15588|992|27|4|2|3785.98|0.02|0.01|N|O|1997-07-21|1997-06-09|1997-08-05|DELIVER IN PERSON|FOB|ress accounts cajole +15588|1773|74|5|49|82063.73|0.04|0.00|N|O|1997-04-12|1997-05-23|1997-04-22|COLLECT COD|FOB|deposits run above the stealth +15589|783|84|1|33|55564.74|0.02|0.03|R|F|1994-10-27|1994-12-29|1994-11-17|NONE|AIR|arefully even package +15590|171|50|1|12|12854.04|0.00|0.02|N|O|1997-08-22|1997-09-05|1997-08-29|DELIVER IN PERSON|TRUCK|gainst the special account +15590|290|18|2|15|17854.35|0.02|0.01|N|O|1997-09-16|1997-08-28|1997-10-12|DELIVER IN PERSON|SHIP|eep blithely unusual deposits? fu +15590|1502|3|3|42|58947.00|0.03|0.00|N|O|1997-07-27|1997-08-12|1997-08-10|TAKE BACK RETURN|FOB|ffily. ideas print slyly silent +15590|1322|37|4|3|3669.96|0.02|0.03|N|O|1997-09-07|1997-09-01|1997-09-15|COLLECT COD|REG AIR|. stealthily regular foxes +15590|151|4|5|35|36790.25|0.10|0.03|N|O|1997-07-24|1997-09-02|1997-07-31|TAKE BACK RETURN|SHIP|ffily carefu +15590|1265|3|6|10|11662.60|0.07|0.00|N|O|1997-07-07|1997-09-03|1997-07-09|DELIVER IN PERSON|FOB|ash final, express depos +15591|129|82|1|25|25728.00|0.03|0.06|A|F|1992-07-14|1992-07-14|1992-07-17|DELIVER IN PERSON|TRUCK|riously ironic +15591|1754|39|2|47|77820.25|0.02|0.02|R|F|1992-06-25|1992-07-26|1992-07-04|COLLECT COD|TRUCK| deposits use slyly ironic, final reques +15591|266|48|3|48|55980.48|0.10|0.06|R|F|1992-08-15|1992-07-12|1992-08-25|COLLECT COD|RAIL|ly furiously fin +15591|891|25|4|16|28670.24|0.04|0.01|R|F|1992-07-31|1992-08-26|1992-08-17|DELIVER IN PERSON|FOB|p carefully ironi +15591|1197|70|5|9|9883.71|0.05|0.03|A|F|1992-07-21|1992-08-06|1992-08-03|TAKE BACK RETURN|REG AIR|nusual platelets nag fluffily. cou +15616|1459|77|1|17|23127.65|0.00|0.03|A|F|1992-05-06|1992-05-22|1992-05-14|COLLECT COD|REG AIR| the carefully +15616|1858|2|2|1|1759.85|0.10|0.04|R|F|1992-05-21|1992-06-08|1992-06-01|COLLECT COD|AIR|onic foxes. final ideas along the +15616|1396|97|3|17|22055.63|0.07|0.07|R|F|1992-06-22|1992-05-07|1992-07-04|DELIVER IN PERSON|RAIL|ly across the silent, unu +15616|815|15|4|39|66916.59|0.07|0.06|A|F|1992-06-08|1992-06-02|1992-06-21|COLLECT COD|TRUCK|leep furiously above +15616|118|19|5|45|45814.95|0.09|0.04|A|F|1992-05-23|1992-05-30|1992-05-26|NONE|MAIL|dependencies nag blithely around the +15617|1380|19|1|12|15376.56|0.03|0.00|R|F|1992-11-04|1992-10-11|1992-11-21|COLLECT COD|AIR|iously pending courts. quickly ironic ins +15617|199|100|2|20|21983.80|0.03|0.03|R|F|1992-08-31|1992-10-20|1992-09-27|COLLECT COD|RAIL| carefully regular +15618|1660|84|1|3|4684.98|0.10|0.02|A|F|1993-12-03|1993-09-16|1993-12-09|COLLECT COD|TRUCK|r dependencie +15618|444|3|2|41|55122.04|0.07|0.08|R|F|1993-10-15|1993-10-29|1993-11-08|NONE|RAIL|ual deposit +15618|983|84|3|31|58403.38|0.00|0.03|A|F|1993-11-29|1993-09-08|1993-12-12|COLLECT COD|MAIL|nic theodolites. carefully unusua +15618|1581|22|4|1|1482.58|0.10|0.01|A|F|1993-09-15|1993-10-31|1993-10-09|TAKE BACK RETURN|FOB|re; regular theodolites detect quickly ex +15618|728|61|5|21|34203.12|0.04|0.03|R|F|1993-11-02|1993-10-18|1993-11-28|DELIVER IN PERSON|MAIL|lly final requests should have to boost +15618|228|10|6|48|54154.56|0.05|0.06|R|F|1993-08-23|1993-09-28|1993-09-10|TAKE BACK RETURN|AIR| theodolites must have to play. +15619|1849|36|1|36|63030.24|0.03|0.06|N|O|1995-10-26|1995-08-31|1995-11-20|TAKE BACK RETURN|SHIP|ously regular excuses +15619|1189|90|2|6|6541.08|0.04|0.03|N|O|1995-10-28|1995-08-04|1995-10-29|TAKE BACK RETURN|SHIP|ccounts. quickly pending somas am +15619|352|9|3|42|52598.70|0.05|0.08|N|O|1995-08-30|1995-08-06|1995-09-01|COLLECT COD|REG AIR|ic ideas. final accounts integrate am +15619|1653|36|4|37|57522.05|0.09|0.05|N|O|1995-08-09|1995-08-03|1995-08-13|COLLECT COD|AIR|tegrate blithely blithely r +15619|779|44|5|40|67190.80|0.09|0.03|N|O|1995-08-20|1995-09-03|1995-09-12|NONE|SHIP|ckly ironic +15619|1125|34|6|40|41044.80|0.07|0.00|N|O|1995-08-07|1995-09-11|1995-08-16|DELIVER IN PERSON|FOB|ar platelets above the u +15619|985|86|7|17|32061.66|0.09|0.00|N|O|1995-10-10|1995-09-17|1995-10-23|DELIVER IN PERSON|AIR|. fluffily special the +15620|343|100|1|33|41030.22|0.02|0.06|N|O|1997-09-11|1997-08-31|1997-09-27|NONE|MAIL|lyly. carefully final requ +15621|1049|20|1|33|31351.32|0.01|0.08|N|O|1995-11-24|1995-11-20|1995-12-07|COLLECT COD|FOB|ke slyly regular accounts +15621|1584|25|2|19|28226.02|0.03|0.02|N|O|1995-10-30|1995-10-26|1995-11-22|COLLECT COD|REG AIR|xes. closely unusual pai +15621|218|19|3|26|29073.46|0.08|0.02|N|O|1996-01-14|1995-12-07|1996-01-31|NONE|FOB|e stealthily among the b +15621|687|81|4|7|11113.76|0.02|0.00|N|O|1995-11-10|1995-11-27|1995-12-06|COLLECT COD|TRUCK|e ironic deposits. slyly even theodolite +15621|956|57|5|38|70564.10|0.00|0.03|N|O|1995-12-10|1995-11-05|1996-01-05|DELIVER IN PERSON|RAIL|ecial multipliers cajole blithely +15622|1309|86|1|45|54463.50|0.01|0.08|N|O|1995-09-04|1995-11-08|1995-09-25|NONE|RAIL|platelets; fluffily ironic pinto beans +15622|1938|83|2|8|14719.44|0.08|0.05|N|O|1995-11-24|1995-11-12|1995-12-23|NONE|MAIL|e. even, regular +15622|580|11|3|16|23689.28|0.04|0.01|N|O|1995-10-01|1995-10-31|1995-10-21|TAKE BACK RETURN|AIR| pinto beans use. blithe +15622|392|21|4|33|42648.87|0.09|0.08|N|O|1995-11-02|1995-11-13|1995-11-27|TAKE BACK RETURN|SHIP|l dolphins nag carefully aft +15622|874|8|5|4|7099.48|0.09|0.06|N|O|1995-09-26|1995-11-08|1995-10-04|TAKE BACK RETURN|REG AIR|even deposits are +15622|1007|13|6|41|37228.00|0.05|0.01|N|O|1995-11-15|1995-10-15|1995-11-21|NONE|REG AIR|ing foxes are? final excuses na +15622|292|74|7|31|36960.99|0.08|0.05|N|O|1995-12-04|1995-10-04|1996-01-01|COLLECT COD|AIR|packages. accounts haggle furiously b +15623|584|45|1|3|4453.74|0.08|0.08|A|F|1993-06-12|1993-06-16|1993-06-23|DELIVER IN PERSON|SHIP|n pinto beans. accounts poach care +15648|1440|19|1|21|28170.24|0.09|0.04|N|O|1996-04-14|1996-04-22|1996-04-17|TAKE BACK RETURN|RAIL|d accounts. carefully regu +15648|1871|15|2|37|65596.19|0.07|0.07|N|O|1996-03-31|1996-05-04|1996-04-06|DELIVER IN PERSON|AIR|ss the fina +15648|62|38|3|12|11544.72|0.08|0.04|N|O|1996-05-19|1996-04-29|1996-05-27|DELIVER IN PERSON|MAIL|the furiously silent excuses +15648|641|4|4|14|21582.96|0.00|0.02|N|O|1996-04-13|1996-05-07|1996-05-12|COLLECT COD|SHIP|ze: pending, regular the +15648|1349|64|5|41|51263.94|0.09|0.00|N|O|1996-06-08|1996-05-07|1996-06-26|NONE|SHIP| use carefully a +15648|2000|1|6|41|36982.00|0.03|0.01|N|O|1996-06-05|1996-04-25|1996-06-25|DELIVER IN PERSON|TRUCK|y even platelets according +15648|360|61|7|44|55455.84|0.00|0.06|N|O|1996-05-31|1996-04-25|1996-06-11|DELIVER IN PERSON|SHIP|deas? ironi +15649|755|88|1|47|77820.25|0.07|0.03|N|O|1997-08-23|1997-09-12|1997-08-26|DELIVER IN PERSON|AIR|s. slyly ironic dolph +15650|875|9|1|31|55051.97|0.01|0.01|N|O|1996-11-22|1996-12-15|1996-12-04|TAKE BACK RETURN|TRUCK|ickly furiously bold deposits. packag +15650|1773|74|2|25|41869.25|0.09|0.03|N|O|1996-11-01|1996-11-23|1996-11-19|DELIVER IN PERSON|SHIP|ar escapades. acc +15650|1568|49|3|18|26452.08|0.08|0.03|N|O|1996-12-22|1996-12-18|1996-12-27|TAKE BACK RETURN|REG AIR|odolites haggle ac +15651|1174|47|1|6|6451.02|0.09|0.00|R|F|1993-01-02|1992-11-04|1993-01-05|COLLECT COD|TRUCK|d even, unusual accounts. bold, final i +15651|686|49|2|30|47600.40|0.04|0.03|A|F|1992-11-13|1992-12-08|1992-11-30|NONE|RAIL|accounts across the furiously ironic packag +15651|1082|88|3|4|3932.32|0.00|0.03|A|F|1992-11-06|1992-12-01|1992-11-22|DELIVER IN PERSON|REG AIR|onic foxes poach quic +15651|32|33|4|22|20504.66|0.07|0.08|R|F|1992-10-26|1992-12-28|1992-10-28|TAKE BACK RETURN|AIR|. blithely pending re +15651|1192|65|5|1|1093.19|0.10|0.00|R|F|1992-10-19|1992-11-30|1992-10-29|NONE|MAIL|he pending packages. blithely final s +15652|191|92|1|20|21823.80|0.04|0.01|R|F|1993-02-24|1993-03-30|1993-03-06|COLLECT COD|AIR|he even pearls. slyly silent +15652|970|73|2|9|16838.73|0.02|0.05|R|F|1993-05-09|1993-04-16|1993-05-20|DELIVER IN PERSON|AIR|counts. unusual excuses hag +15652|1470|88|3|17|23314.99|0.04|0.00|R|F|1993-04-22|1993-04-21|1993-05-19|NONE|REG AIR|unts. slyly pendi +15653|781|46|1|27|45408.06|0.10|0.06|N|O|1996-08-14|1996-07-07|1996-08-30|DELIVER IN PERSON|SHIP|metimes bold +15653|209|91|2|30|33276.00|0.03|0.02|N|O|1996-09-02|1996-07-21|1996-09-05|DELIVER IN PERSON|SHIP|e the carefully final +15653|1492|32|3|22|30656.78|0.06|0.03|N|O|1996-09-22|1996-07-27|1996-10-04|DELIVER IN PERSON|AIR|hockey players eat ironic, eve +15654|1772|57|1|49|82014.73|0.00|0.04|A|F|1994-11-21|1995-01-01|1994-11-22|DELIVER IN PERSON|SHIP|to beans cajole fluffily against the +15654|820|54|2|36|61949.52|0.05|0.05|A|F|1995-01-02|1994-11-18|1995-01-12|COLLECT COD|MAIL|ests cajole carefully. carefully expr +15654|490|49|3|31|43105.19|0.00|0.01|A|F|1994-11-05|1994-11-17|1994-11-27|DELIVER IN PERSON|SHIP|ng requests sublate against the fluffily re +15655|1655|38|1|36|56039.40|0.05|0.00|N|O|1996-12-16|1997-01-21|1996-12-24|COLLECT COD|RAIL|olites: requests cajole about the carefull +15655|662|94|2|49|76570.34|0.02|0.04|N|O|1996-12-06|1997-01-20|1996-12-12|COLLECT COD|AIR|ate. unusual hockey players about the qu +15655|768|33|3|16|26700.16|0.01|0.00|N|O|1997-02-21|1997-01-24|1997-03-02|TAKE BACK RETURN|AIR|slyly special deposits sleep blithely +15655|353|10|4|13|16293.55|0.03|0.02|N|O|1997-01-14|1996-12-23|1997-02-06|TAKE BACK RETURN|RAIL|es are quickly alo +15655|141|68|5|46|47892.44|0.10|0.05|N|O|1996-12-03|1997-02-02|1996-12-28|TAKE BACK RETURN|MAIL|the enticing, bold requests. requests +15680|606|38|1|9|13559.40|0.03|0.02|N|O|1998-05-21|1998-04-04|1998-06-07|COLLECT COD|REG AIR|re slyly final reque +15680|1859|46|2|7|12325.95|0.10|0.05|N|O|1998-03-09|1998-02-21|1998-04-05|TAKE BACK RETURN|FOB| packages; carefully bold instructions wak +15680|418|48|3|34|44825.94|0.02|0.05|N|O|1998-05-17|1998-03-21|1998-05-27|COLLECT COD|FOB| the quickly final excuses +15681|876|10|1|17|30206.79|0.07|0.00|N|O|1995-10-22|1995-07-29|1995-10-25|NONE|AIR| fluffily carefully ironic accoun +15681|911|12|2|31|56169.21|0.02|0.01|N|O|1995-08-17|1995-08-13|1995-09-13|COLLECT COD|MAIL|ess requests cajole carefully about t +15681|560|91|3|32|46737.92|0.09|0.05|N|O|1995-08-22|1995-09-09|1995-09-03|TAKE BACK RETURN|MAIL|snooze carefu +15682|755|88|1|48|79476.00|0.05|0.04|N|O|1996-04-08|1996-04-20|1996-05-02|COLLECT COD|MAIL|refully alongside of the blithely p +15682|749|14|2|36|59390.64|0.00|0.07|N|O|1996-05-11|1996-05-10|1996-05-21|DELIVER IN PERSON|RAIL|bt furiously quickly +15683|1105|6|1|11|11067.10|0.00|0.06|R|F|1992-05-23|1992-06-02|1992-06-22|COLLECT COD|RAIL|packages haggle. exp +15683|110|11|2|8|8080.88|0.00|0.04|A|F|1992-05-23|1992-05-21|1992-06-16|NONE|FOB| asymptotes. unusual, ev +15683|950|19|3|11|20360.45|0.04|0.07|R|F|1992-06-20|1992-07-18|1992-07-15|COLLECT COD|TRUCK|ously regular requests accord +15683|1031|2|4|18|16776.54|0.06|0.01|R|F|1992-08-19|1992-06-16|1992-09-05|NONE|FOB|gifts sleep quickly-- carefully bold f +15684|1795|38|1|39|66174.81|0.07|0.08|N|O|1996-06-09|1996-06-30|1996-07-04|DELIVER IN PERSON|SHIP|kages. pending requests haggle slyly th +15684|772|37|2|44|73601.88|0.01|0.03|N|O|1996-05-11|1996-07-13|1996-05-31|TAKE BACK RETURN|FOB|its use up the regu +15684|1193|30|3|42|45955.98|0.02|0.00|N|O|1996-06-23|1996-07-21|1996-07-04|NONE|RAIL| regular package +15684|167|46|4|48|51223.68|0.04|0.01|N|O|1996-06-09|1996-06-21|1996-06-14|DELIVER IN PERSON|RAIL|. furiously ironic fo +15685|496|84|1|25|34912.25|0.05|0.04|N|O|1996-12-21|1997-01-25|1997-01-07|TAKE BACK RETURN|AIR|ly. fluffily even ideas alongside of the e +15685|667|99|2|40|62706.40|0.09|0.07|N|O|1996-12-12|1997-01-25|1997-01-08|COLLECT COD|SHIP|nts sleep car +15685|1935|36|3|3|5510.79|0.01|0.04|N|O|1997-01-02|1996-12-31|1997-01-05|DELIVER IN PERSON|MAIL|. regularly regular deposits breach +15685|1806|50|4|27|46110.60|0.01|0.06|N|O|1996-11-22|1996-12-17|1996-12-08|NONE|FOB|lar instructions about the furiously regu +15685|982|83|5|24|45191.52|0.01|0.06|N|O|1996-11-07|1996-12-17|1996-11-11|DELIVER IN PERSON|FOB|e blithely u +15685|1688|89|6|49|77894.32|0.03|0.01|N|O|1997-01-07|1996-11-28|1997-02-03|COLLECT COD|RAIL|packages are. blithel +15686|79|55|1|9|8811.63|0.08|0.00|N|O|1996-11-21|1997-01-01|1996-11-27|DELIVER IN PERSON|FOB|cajole. ironic, even instructions b +15686|1950|83|2|47|87041.65|0.06|0.05|N|O|1996-11-11|1997-01-03|1996-12-01|NONE|RAIL|requests among +15686|1827|57|3|26|44949.32|0.08|0.08|N|O|1997-01-01|1996-12-11|1997-01-30|COLLECT COD|REG AIR|oldly about the blith +15686|1767|94|4|27|45056.52|0.04|0.01|N|O|1996-11-07|1996-12-05|1996-12-02|NONE|SHIP| furiously regular +15687|1128|29|1|39|40135.68|0.01|0.03|R|F|1992-08-05|1992-05-21|1992-08-12|DELIVER IN PERSON|SHIP|quests cajole. fluffil +15687|546|37|2|50|72327.00|0.10|0.00|R|F|1992-05-28|1992-06-12|1992-06-03|TAKE BACK RETURN|TRUCK|ter the blith +15687|1605|29|3|17|25612.20|0.02|0.04|R|F|1992-04-12|1992-06-24|1992-04-16|COLLECT COD|FOB|ut the theodolites. +15687|887|88|4|27|48272.76|0.06|0.03|A|F|1992-07-22|1992-05-22|1992-08-12|DELIVER IN PERSON|RAIL|al packages haggle carefully upon the regu +15687|1158|95|5|16|16946.40|0.04|0.08|R|F|1992-04-19|1992-06-17|1992-04-23|TAKE BACK RETURN|AIR|l pinto beans. final accounts according to +15712|135|88|1|44|45545.72|0.08|0.05|R|F|1993-01-12|1993-01-06|1993-01-27|NONE|FOB|accounts. c +15712|1130|3|2|42|43307.46|0.05|0.04|A|F|1993-02-01|1993-02-02|1993-02-15|DELIVER IN PERSON|FOB|ding to the accounts wake about the sp +15712|377|78|3|37|47262.69|0.10|0.01|R|F|1993-03-29|1993-02-03|1993-04-16|NONE|MAIL| slyly fina +15712|1248|49|4|33|37924.92|0.10|0.03|R|F|1993-02-27|1993-01-25|1993-03-27|COLLECT COD|RAIL| express deposits +15713|1723|50|1|15|24370.80|0.00|0.07|N|O|1996-03-23|1996-03-10|1996-03-26|COLLECT COD|FOB|dle quickly alongside of the +15713|899|100|2|47|84594.83|0.10|0.05|N|O|1996-03-18|1996-04-20|1996-04-12|COLLECT COD|TRUCK|ess courts. quickly regular idea +15713|1608|91|3|5|7548.00|0.03|0.03|N|O|1996-01-31|1996-03-08|1996-02-26|DELIVER IN PERSON|SHIP|equests x-ray furiou +15714|646|9|1|8|12373.12|0.01|0.04|N|O|1995-07-11|1995-10-01|1995-08-10|TAKE BACK RETURN|RAIL| dazzle furiously. courts wake furiously i +15714|1886|73|2|9|16090.92|0.00|0.07|N|O|1995-09-18|1995-08-18|1995-10-01|TAKE BACK RETURN|TRUCK|l deposits accordin +15714|978|47|3|47|88311.59|0.02|0.08|N|O|1995-08-29|1995-09-18|1995-08-30|NONE|MAIL| along the slyly special asymptot +15714|1816|3|4|4|6871.24|0.01|0.03|N|O|1995-09-29|1995-08-08|1995-10-22|COLLECT COD|FOB|y regular packages boost furiously. pendi +15714|764|65|5|14|23306.64|0.05|0.05|N|O|1995-09-20|1995-08-15|1995-09-30|TAKE BACK RETURN|FOB|packages under the blithely f +15715|755|52|1|30|49672.50|0.05|0.00|A|F|1993-02-10|1993-01-12|1993-02-23|DELIVER IN PERSON|REG AIR|e furiously against the stealthily i +15715|1546|87|2|13|18818.02|0.00|0.04|R|F|1993-01-22|1992-12-25|1993-02-01|COLLECT COD|FOB| the regular deposits. ironic, r +15715|733|30|3|1|1633.73|0.10|0.04|R|F|1993-02-07|1992-11-29|1993-03-05|TAKE BACK RETURN|TRUCK|ideas. furiously unusual ideas +15715|1197|98|4|47|51614.93|0.02|0.03|A|F|1993-01-21|1992-12-18|1993-02-02|COLLECT COD|AIR|ckly special deposits are ruthlessly s +15715|1333|48|5|44|54310.52|0.04|0.06|R|F|1992-12-25|1992-12-22|1993-01-21|DELIVER IN PERSON|TRUCK|ously final asymptotes. unusu +15716|788|89|1|9|15199.02|0.03|0.01|N|O|1996-09-16|1996-10-06|1996-09-19|TAKE BACK RETURN|MAIL|thely even theodolites. blithe +15716|1197|34|2|9|9883.71|0.00|0.08|N|O|1996-11-16|1996-09-26|1996-12-10|COLLECT COD|REG AIR|ly even foxes sleep quickly about the +15716|7|83|3|42|38094.00|0.02|0.07|N|O|1996-10-23|1996-10-09|1996-11-02|NONE|SHIP|ironic requests may mold carefully ironic d +15716|1241|53|4|24|27413.76|0.03|0.08|N|O|1996-10-13|1996-09-26|1996-10-17|NONE|REG AIR|ose carefully finally final dolphins. sil +15716|1205|43|5|44|48672.80|0.04|0.08|N|O|1996-10-06|1996-10-15|1996-10-14|TAKE BACK RETURN|SHIP|nusual deposits-- even pinto be +15716|1771|14|6|10|16727.70|0.07|0.05|N|O|1996-11-12|1996-10-17|1996-12-08|NONE|FOB|ites cajole blithely. furiou +15717|1103|12|1|34|34139.40|0.03|0.07|N|O|1998-06-27|1998-05-30|1998-07-16|TAKE BACK RETURN|REG AIR|y even packages promise. unusua +15717|53|54|2|22|20967.10|0.10|0.01|N|O|1998-06-03|1998-05-24|1998-06-25|DELIVER IN PERSON|RAIL|to beans. regular somas must have to +15717|1276|14|3|37|43558.99|0.04|0.01|N|O|1998-05-28|1998-05-07|1998-05-29|NONE|REG AIR|counts wake slyly. sp +15717|1416|56|4|3|3952.23|0.10|0.07|N|O|1998-04-24|1998-05-24|1998-04-25|TAKE BACK RETURN|FOB|es. carefully dogged packages a +15717|1654|37|5|23|35779.95|0.03|0.03|N|O|1998-03-22|1998-04-26|1998-04-21|COLLECT COD|SHIP|refully final packages sleep. carefully e +15718|1112|85|1|17|17222.87|0.09|0.04|A|F|1994-03-01|1994-03-01|1994-03-13|COLLECT COD|TRUCK|he furiously unusual accounts cajole f +15718|1215|53|2|10|11162.10|0.08|0.00|A|F|1994-04-22|1994-03-03|1994-05-04|TAKE BACK RETURN|SHIP|luffily deposits. regular platelets nag nev +15718|1562|63|3|28|40979.68|0.07|0.01|R|F|1994-05-08|1994-03-21|1994-05-14|TAKE BACK RETURN|REG AIR|ording to the even p +15718|484|85|4|26|35996.48|0.04|0.06|A|F|1994-03-03|1994-03-30|1994-03-18|DELIVER IN PERSON|FOB| express accounts are +15719|341|98|1|13|16137.42|0.08|0.06|R|F|1995-04-14|1995-02-18|1995-05-04|NONE|AIR|ters engage carefully. regular +15719|1148|85|2|16|16786.24|0.07|0.02|A|F|1995-04-03|1995-03-19|1995-04-11|TAKE BACK RETURN|FOB|e furiously alongside of the slyly qu +15719|894|95|3|29|52051.81|0.06|0.00|A|F|1995-04-07|1995-04-02|1995-04-20|DELIVER IN PERSON|REG AIR| after the qu +15719|1585|86|4|25|37164.50|0.04|0.05|A|F|1995-04-21|1995-02-18|1995-05-17|TAKE BACK RETURN|FOB|ely. accounts was slyly. slyly spe +15744|12|88|1|17|15504.17|0.10|0.05|R|F|1993-06-20|1993-05-29|1993-07-09|DELIVER IN PERSON|RAIL|quickly final requests sle +15744|515|76|2|31|43880.81|0.01|0.01|A|F|1993-03-26|1993-05-02|1993-04-06|TAKE BACK RETURN|FOB| quickly ironic epitaphs slee +15745|811|78|1|26|44507.06|0.01|0.04|R|F|1992-08-25|1992-09-24|1992-09-18|COLLECT COD|MAIL|ng deposits. blithely s +15745|982|17|2|36|67787.28|0.05|0.08|A|F|1992-08-07|1992-09-20|1992-09-05|TAKE BACK RETURN|SHIP|boost furiously. carefully final requests +15745|682|76|3|8|12661.44|0.01|0.03|R|F|1992-08-20|1992-09-10|1992-09-05|DELIVER IN PERSON|MAIL|slyly in place of the final, +15745|1021|92|4|33|30426.66|0.00|0.02|A|F|1992-07-08|1992-09-14|1992-07-18|NONE|TRUCK|egular foxes cajole. slyly special de +15746|324|81|1|33|40402.56|0.05|0.02|N|O|1998-03-13|1998-02-27|1998-03-29|TAKE BACK RETURN|MAIL| notornis us +15746|1146|55|2|42|43979.88|0.07|0.03|N|O|1998-04-01|1998-03-21|1998-04-10|TAKE BACK RETURN|AIR| cajole slyly +15746|167|20|3|21|22410.36|0.10|0.07|N|O|1998-02-14|1998-03-31|1998-03-03|TAKE BACK RETURN|REG AIR|ges at the fluffily special +15747|71|72|1|37|35929.59|0.00|0.03|N|O|1996-07-16|1996-06-08|1996-07-30|NONE|FOB|osits use above the quickly re +15747|1627|51|2|1|1528.62|0.01|0.04|N|O|1996-06-06|1996-05-09|1996-07-03|DELIVER IN PERSON|REG AIR|blithely: carefully unusual packages +15747|861|62|3|46|81045.56|0.09|0.06|N|O|1996-04-25|1996-05-19|1996-05-12|TAKE BACK RETURN|REG AIR| even requests. foxes ac +15747|298|53|4|12|14379.48|0.10|0.05|N|O|1996-06-20|1996-04-21|1996-07-04|COLLECT COD|SHIP|ronic foxes nag furiously a +15747|1483|23|5|35|48456.80|0.08|0.02|N|O|1996-03-28|1996-04-24|1996-04-03|TAKE BACK RETURN|RAIL|y unusual ideas. packages use slyl +15748|1156|29|1|50|52857.50|0.07|0.07|R|F|1995-01-01|1995-02-19|1995-01-22|DELIVER IN PERSON|MAIL|es use blithely. final foxes among +15748|327|56|2|22|27001.04|0.07|0.06|A|F|1995-04-10|1995-03-04|1995-04-23|NONE|MAIL|express foxes integrate +15748|179|6|3|38|41008.46|0.05|0.08|A|F|1995-03-13|1995-02-04|1995-03-26|TAKE BACK RETURN|FOB|eas engage against the slyly regular +15748|698|30|4|42|67144.98|0.02|0.02|R|F|1995-01-20|1995-01-19|1995-02-02|TAKE BACK RETURN|AIR| accounts. accounts detect furiously acc +15749|426|85|1|43|57036.06|0.08|0.00|N|O|1998-01-20|1997-11-21|1998-02-03|DELIVER IN PERSON|SHIP|nts. furiously bold deposits wake quickly +15750|1675|58|1|5|7883.35|0.08|0.02|N|O|1997-06-20|1997-08-14|1997-07-07|NONE|REG AIR|ealthy asymptotes wake along t +15750|1307|46|2|6|7249.80|0.05|0.05|N|O|1997-05-30|1997-07-26|1997-06-05|COLLECT COD|SHIP|ideas nag slyly among the carefully expr +15750|550|81|3|6|8703.30|0.05|0.08|N|O|1997-09-22|1997-07-07|1997-10-09|DELIVER IN PERSON|AIR|arefully unusual packages sleep into t +15750|1830|74|4|18|31172.94|0.03|0.05|N|O|1997-06-22|1997-08-09|1997-07-06|COLLECT COD|FOB|fluffily regular re +15751|1038|9|1|31|29109.93|0.03|0.00|R|F|1994-11-12|1994-10-25|1994-11-25|TAKE BACK RETURN|AIR|s cajole furiously afte +15751|1658|82|2|26|40550.90|0.00|0.06|A|F|1994-09-14|1994-11-05|1994-09-21|COLLECT COD|FOB|s. ironic pinto be +15751|1077|83|3|12|11736.84|0.05|0.06|A|F|1994-11-14|1994-10-29|1994-11-26|DELIVER IN PERSON|TRUCK|nag carefully accor +15776|173|74|1|45|48292.65|0.05|0.02|N|O|1997-12-25|1998-02-20|1998-01-24|DELIVER IN PERSON|REG AIR|s. blithely final +15776|1252|64|2|19|21911.75|0.03|0.05|N|O|1998-02-20|1998-02-10|1998-02-28|COLLECT COD|FOB|fully special pac +15776|1201|13|3|42|46292.40|0.10|0.06|N|O|1998-03-09|1998-01-29|1998-03-10|COLLECT COD|AIR|ts detect blit +15776|565|56|4|6|8793.36|0.05|0.03|N|O|1998-01-08|1998-01-24|1998-01-20|TAKE BACK RETURN|AIR|requests detect r +15777|1237|38|1|3|3414.69|0.08|0.03|R|F|1995-01-13|1995-02-25|1995-01-20|TAKE BACK RETURN|TRUCK| accounts x-ray across +15777|1556|77|2|4|5830.20|0.02|0.04|R|F|1995-03-12|1995-03-29|1995-04-08|TAKE BACK RETURN|SHIP|nstructions haggle +15778|1806|7|1|12|20493.60|0.07|0.00|A|F|1993-05-31|1993-07-25|1993-06-07|DELIVER IN PERSON|FOB|ntegrate blithely packages. never i +15778|311|12|2|26|31494.06|0.04|0.08|R|F|1993-08-23|1993-07-16|1993-09-03|DELIVER IN PERSON|TRUCK|ckages integrate +15778|915|16|3|15|27238.65|0.09|0.04|A|F|1993-08-31|1993-07-08|1993-09-25|DELIVER IN PERSON|REG AIR|y bold packages nag bl +15778|1678|2|4|26|41071.42|0.00|0.04|R|F|1993-05-20|1993-07-08|1993-05-23|COLLECT COD|REG AIR|t slyly regular, ironic deposits. slyly +15778|1515|96|5|32|45328.32|0.05|0.00|R|F|1993-08-10|1993-06-25|1993-08-25|NONE|RAIL| frays poach carefully ab +15778|1395|72|6|29|37595.31|0.05|0.04|R|F|1993-06-07|1993-08-05|1993-07-03|COLLECT COD|FOB|beans nag fluffily among the fluffily pe +15779|924|59|1|35|63872.20|0.04|0.07|N|O|1998-05-22|1998-04-06|1998-05-29|DELIVER IN PERSON|SHIP|lyly against the blithely s +15779|1730|31|2|17|27739.41|0.10|0.06|N|O|1998-04-03|1998-05-06|1998-04-13|COLLECT COD|TRUCK|beans wake carefully final r +15779|1343|58|3|35|43551.90|0.08|0.05|N|O|1998-06-14|1998-05-03|1998-06-28|DELIVER IN PERSON|MAIL| foxes detect furiously blithe +15779|586|87|4|45|66896.10|0.03|0.02|N|O|1998-06-21|1998-05-16|1998-07-07|COLLECT COD|SHIP|e of the furiou +15779|1980|81|5|49|92217.02|0.04|0.01|N|O|1998-03-24|1998-03-31|1998-03-28|TAKE BACK RETURN|TRUCK|ously along the perm +15779|426|85|6|37|49077.54|0.04|0.07|N|O|1998-04-12|1998-05-17|1998-05-08|COLLECT COD|TRUCK|sts snooze furiously above the steal +15779|911|46|7|38|68852.58|0.08|0.03|N|O|1998-05-15|1998-05-17|1998-05-22|NONE|RAIL| requests. furiously unusual p +15780|140|41|1|22|22883.08|0.00|0.07|R|F|1995-04-30|1995-06-17|1995-05-06|TAKE BACK RETURN|SHIP| silent theodolit +15780|166|67|2|43|45844.88|0.02|0.00|N|O|1995-06-22|1995-07-08|1995-07-14|DELIVER IN PERSON|REG AIR|dly quickly bold pinto beans. fluffi +15780|591|52|3|9|13424.31|0.05|0.01|R|F|1995-04-23|1995-07-12|1995-05-10|TAKE BACK RETURN|MAIL|t the carefully even accounts h +15780|199|52|4|35|38471.65|0.10|0.08|N|O|1995-07-25|1995-06-12|1995-07-28|COLLECT COD|TRUCK|s packages sleep carefully. some +15780|1005|11|5|5|4530.00|0.00|0.07|R|F|1995-04-28|1995-05-29|1995-05-06|NONE|MAIL|ld ideas. fluffily regular deposits caj +15780|1215|53|6|10|11162.10|0.10|0.03|A|F|1995-04-28|1995-07-09|1995-05-03|NONE|REG AIR| slyly. slyly final excuses doubt carefu +15781|1121|94|1|7|7154.84|0.08|0.02|R|F|1992-09-23|1992-10-24|1992-09-29|NONE|REG AIR|gular packages in +15781|919|88|2|27|49137.57|0.02|0.06|A|F|1992-09-18|1992-11-20|1992-09-23|TAKE BACK RETURN|TRUCK| fluffily bold accounts detect fluf +15781|54|5|3|19|18126.95|0.06|0.05|A|F|1992-09-24|1992-10-11|1992-10-12|NONE|AIR|carefully +15781|1670|12|4|47|73868.49|0.10|0.02|R|F|1992-12-01|1992-10-04|1992-12-16|DELIVER IN PERSON|MAIL|fully expres +15782|653|16|1|17|26412.05|0.04|0.06|R|F|1992-07-20|1992-05-06|1992-07-29|COLLECT COD|SHIP| deposits wake caref +15782|54|80|2|22|20989.10|0.03|0.07|R|F|1992-04-19|1992-06-11|1992-05-02|COLLECT COD|SHIP|fily special deposits. accounts nag +15782|1192|93|3|14|15304.66|0.06|0.06|R|F|1992-04-09|1992-06-07|1992-04-29|COLLECT COD|RAIL|tructions sleep furiously bo +15782|507|38|4|40|56300.00|0.09|0.02|A|F|1992-04-02|1992-06-16|1992-04-12|TAKE BACK RETURN|RAIL|y. slyly unusual excuses haggle fu +15782|1790|75|5|26|43986.54|0.01|0.02|A|F|1992-04-14|1992-06-22|1992-04-15|TAKE BACK RETURN|AIR| patterns nag furiously final pac +15782|1489|68|6|6|8342.88|0.09|0.01|A|F|1992-07-19|1992-06-15|1992-08-18|COLLECT COD|MAIL|elets. special ac +15782|762|63|7|30|49882.80|0.01|0.06|A|F|1992-04-04|1992-05-17|1992-04-29|DELIVER IN PERSON|RAIL|equests haggle furi +15783|938|73|1|21|38617.53|0.07|0.04|N|O|1997-08-05|1997-08-19|1997-08-18|NONE|REG AIR|beans cajole blithely ex +15783|230|85|2|18|20344.14|0.06|0.04|N|O|1997-08-21|1997-08-10|1997-09-06|NONE|AIR|arefully after the dolphi +15783|761|62|3|8|13294.08|0.04|0.08|N|O|1997-07-18|1997-09-05|1997-08-05|TAKE BACK RETURN|MAIL|e slowly quickly idle deposits. unusual, +15808|1949|38|1|10|18509.40|0.01|0.01|R|F|1994-01-09|1994-02-24|1994-01-12|NONE|TRUCK|ses about the regular, even requests haggl +15808|849|16|2|41|71743.44|0.06|0.03|A|F|1994-03-24|1994-03-14|1994-04-23|COLLECT COD|MAIL|ters use furiously +15808|1160|69|3|31|32895.96|0.00|0.05|R|F|1994-02-20|1994-02-04|1994-02-28|COLLECT COD|TRUCK|ep slyly accordin +15808|1057|63|4|31|29699.55|0.09|0.05|A|F|1994-02-28|1994-01-15|1994-03-03|COLLECT COD|RAIL|xpress deposits alongside +15808|1944|33|5|10|18459.40|0.02|0.08|R|F|1994-03-22|1994-01-16|1994-04-02|TAKE BACK RETURN|MAIL|atelets. carefully silen +15808|1659|1|6|40|62426.00|0.07|0.02|A|F|1994-01-10|1994-02-25|1994-01-13|NONE|REG AIR|accounts hagg +15809|242|24|1|28|31982.72|0.00|0.02|N|O|1995-11-11|1995-12-04|1995-11-20|DELIVER IN PERSON|REG AIR| regular dependencies use furiously alongs +15809|108|61|2|6|6048.60|0.07|0.00|N|O|1995-11-05|1995-11-03|1995-12-02|DELIVER IN PERSON|AIR|eposits dazzl +15810|911|46|1|13|23554.83|0.07|0.08|A|F|1993-07-08|1993-08-10|1993-07-25|COLLECT COD|RAIL|egular instruct +15810|41|42|2|10|9410.40|0.01|0.02|A|F|1993-09-08|1993-07-16|1993-10-03|COLLECT COD|FOB|cuses. final instructions across the +15810|1182|91|3|50|54159.00|0.09|0.08|R|F|1993-06-25|1993-09-08|1993-06-29|NONE|SHIP|ithely final accounts. quic +15810|740|5|4|26|42659.24|0.00|0.08|A|F|1993-08-04|1993-08-18|1993-08-13|DELIVER IN PERSON|TRUCK|ual reques +15810|1662|4|5|49|76619.34|0.03|0.07|A|F|1993-08-16|1993-08-25|1993-08-25|NONE|SHIP| over the ironic asymptotes wa +15810|1878|79|6|22|39157.14|0.08|0.04|A|F|1993-08-12|1993-08-29|1993-09-02|TAKE BACK RETURN|MAIL| ironic courts x-ray furiousl +15810|1638|21|7|11|16935.93|0.04|0.01|A|F|1993-09-19|1993-07-23|1993-09-20|DELIVER IN PERSON|FOB|efully pending +15811|1216|28|1|36|40219.56|0.02|0.00|N|O|1998-09-04|1998-10-20|1998-09-07|COLLECT COD|SHIP|nal packages integrate pendin +15811|1630|13|2|26|39822.38|0.00|0.00|N|O|1998-09-03|1998-09-18|1998-09-05|DELIVER IN PERSON|SHIP|furiously bold ideas. bold notornis us +15812|1032|68|1|2|1866.06|0.02|0.05|N|O|1998-02-06|1997-12-01|1998-03-05|COLLECT COD|REG AIR|under the final, even do +15812|971|74|2|31|58031.07|0.03|0.08|N|O|1997-11-04|1997-12-24|1997-11-10|TAKE BACK RETURN|SHIP|nts nag furiously. accounts +15812|248|49|3|18|20668.32|0.05|0.00|N|O|1998-01-31|1997-12-03|1998-02-26|COLLECT COD|SHIP|ly. furiously pending +15812|16|92|4|21|19236.21|0.02|0.02|N|O|1997-10-23|1997-11-28|1997-11-14|NONE|MAIL|ickly. idle multipliers m +15812|1263|75|5|23|26777.98|0.03|0.04|N|O|1998-01-22|1997-12-28|1998-02-11|DELIVER IN PERSON|REG AIR|e blithely after the f +15813|721|22|1|39|63247.08|0.09|0.08|N|O|1998-11-09|1998-10-10|1998-11-25|NONE|REG AIR|y final excuses use fina +15814|1413|53|1|23|30231.43|0.01|0.03|N|O|1996-09-17|1996-11-10|1996-09-20|COLLECT COD|TRUCK|he blithely bold packages. as +15814|936|37|2|30|55107.90|0.02|0.06|N|O|1996-12-07|1996-09-28|1996-12-21|NONE|REG AIR|idle accounts sleep fluffily +15814|7|83|3|27|24489.00|0.08|0.08|N|O|1996-09-01|1996-11-08|1996-09-06|COLLECT COD|AIR|ly bold packages. +15814|1300|75|4|22|26428.60|0.09|0.05|N|O|1996-09-24|1996-10-13|1996-10-19|TAKE BACK RETURN|TRUCK|ions sleep blithely ironic, unusual +15815|153|80|1|38|40019.70|0.00|0.04|R|F|1994-06-12|1994-06-12|1994-06-23|COLLECT COD|MAIL|the slyly even requests. fluffily fi +15815|635|29|2|7|10749.41|0.10|0.04|R|F|1994-08-06|1994-07-21|1994-08-13|DELIVER IN PERSON|SHIP|ructions. final requests affix. fin +15815|159|60|3|44|46602.60|0.04|0.07|R|F|1994-06-19|1994-07-13|1994-07-06|COLLECT COD|REG AIR| furiously after the fluffily ex +15815|57|8|4|9|8613.45|0.00|0.01|A|F|1994-08-07|1994-07-18|1994-08-25|DELIVER IN PERSON|MAIL|kages. fluffily express +15815|517|78|5|24|34020.24|0.05|0.05|A|F|1994-05-08|1994-06-01|1994-06-07|DELIVER IN PERSON|FOB| foxes. bold dependencies above the +15840|1656|57|1|2|3115.30|0.08|0.02|N|O|1998-03-08|1998-04-07|1998-03-13|COLLECT COD|AIR|posits sublate after the bli +15840|1205|80|2|34|37610.80|0.07|0.07|N|O|1998-03-18|1998-02-24|1998-03-21|NONE|FOB| deposits; even theodolites about +15840|1982|71|3|48|90431.04|0.02|0.07|N|O|1998-02-16|1998-03-11|1998-02-24|COLLECT COD|SHIP|blate final s +15840|1552|73|4|11|15989.05|0.07|0.07|N|O|1998-03-04|1998-04-08|1998-03-25|DELIVER IN PERSON|AIR|old theodolites are blithely +15840|948|49|5|26|48072.44|0.07|0.00|N|O|1998-03-08|1998-04-14|1998-03-26|COLLECT COD|SHIP|its. even deposit +15841|407|8|1|28|36607.20|0.07|0.03|N|O|1996-10-09|1996-08-14|1996-10-10|COLLECT COD|SHIP| accounts. carefully regular deposits wa +15841|1745|46|2|45|74103.30|0.00|0.05|N|O|1996-06-28|1996-07-19|1996-07-24|TAKE BACK RETURN|SHIP|ate blithely alongside of the regular +15842|810|44|1|35|59878.35|0.03|0.02|R|F|1993-08-27|1993-08-15|1993-09-24|NONE|REG AIR|ular requests along the slyly re +15842|1572|53|2|13|19156.41|0.10|0.04|R|F|1993-07-25|1993-06-22|1993-07-26|TAKE BACK RETURN|FOB|jole slyly fluff +15842|1513|54|3|28|39606.28|0.05|0.06|R|F|1993-07-05|1993-08-12|1993-07-27|COLLECT COD|FOB|jole quickly up the finally ironic e +15843|1168|41|1|37|39558.92|0.09|0.06|N|O|1996-03-04|1996-01-30|1996-03-06|DELIVER IN PERSON|TRUCK|ts impress carefully. slyly reg +15843|958|59|2|33|61345.35|0.09|0.03|N|O|1996-01-21|1995-12-31|1996-02-13|COLLECT COD|AIR|osits sleep. slyly express +15843|1999|44|3|7|13306.93|0.10|0.02|N|O|1996-02-10|1995-12-19|1996-03-08|TAKE BACK RETURN|FOB|sts. blithely special pinto beans after +15843|523|14|4|20|28470.40|0.05|0.02|N|O|1996-01-16|1996-02-05|1996-02-02|NONE|RAIL|uickly pending +15843|1093|29|5|47|46722.23|0.06|0.05|N|O|1995-11-21|1996-01-18|1995-12-04|COLLECT COD|TRUCK|ously: ironically special pac +15844|830|97|1|16|27693.28|0.00|0.07|A|F|1993-05-30|1993-05-16|1993-06-03|COLLECT COD|MAIL|riously al +15845|302|3|1|36|43282.80|0.04|0.06|N|O|1997-03-21|1997-01-24|1997-03-31|TAKE BACK RETURN|SHIP|press dolphins ca +15845|1580|61|2|35|51855.30|0.09|0.07|N|O|1997-02-04|1997-01-19|1997-02-28|TAKE BACK RETURN|FOB| quickly ironic accounts h +15845|372|29|3|8|10178.96|0.02|0.06|N|O|1996-12-12|1997-01-23|1996-12-30|NONE|REG AIR|ng requests. carefully unusual pl +15845|736|1|4|28|45828.44|0.03|0.04|N|O|1997-02-08|1996-12-26|1997-03-09|DELIVER IN PERSON|AIR|ns. furiously even packages haggle slowl +15845|1070|71|5|21|20392.47|0.06|0.08|N|O|1997-01-03|1997-01-31|1997-01-16|COLLECT COD|FOB|nstruction +15846|1530|51|1|48|68713.44|0.06|0.07|A|F|1993-05-18|1993-07-26|1993-06-13|DELIVER IN PERSON|RAIL|s integrate carefully after +15846|459|89|2|6|8156.70|0.03|0.06|R|F|1993-07-01|1993-06-26|1993-07-17|COLLECT COD|AIR|he carefully unusual courts. carefully +15846|1383|84|3|1|1284.38|0.04|0.06|A|F|1993-07-17|1993-07-26|1993-08-16|TAKE BACK RETURN|AIR|usual theodoli +15846|187|88|4|38|41312.84|0.08|0.05|R|F|1993-09-03|1993-07-01|1993-09-20|NONE|SHIP| unusual deposits use qu +15847|943|46|1|26|47942.44|0.05|0.05|N|O|1996-09-17|1996-08-18|1996-10-16|DELIVER IN PERSON|RAIL|ly regular requests. b +15847|1933|22|2|38|69727.34|0.05|0.04|N|O|1996-08-20|1996-09-16|1996-09-17|NONE|AIR|ts. carefully daring deposits abo +15847|1985|18|3|33|62270.34|0.06|0.02|N|O|1996-08-21|1996-08-27|1996-09-16|DELIVER IN PERSON|TRUCK|s. blithely e +15847|814|14|4|44|75451.64|0.10|0.01|N|O|1996-08-03|1996-09-08|1996-08-09|COLLECT COD|MAIL| fluffily pending pinto beans. pending, +15847|1223|61|5|36|40471.92|0.02|0.08|N|O|1996-07-11|1996-10-02|1996-08-03|NONE|MAIL|its. furiously reg +15872|897|98|1|9|16181.01|0.04|0.05|R|F|1992-12-17|1992-12-17|1993-01-14|DELIVER IN PERSON|RAIL|ole. carefully ironi +15872|1345|60|2|34|42375.56|0.03|0.04|A|F|1992-11-15|1993-01-02|1992-11-25|NONE|RAIL|egular packages haggle fu +15872|559|60|3|28|40867.40|0.00|0.05|R|F|1993-02-12|1993-01-03|1993-03-04|COLLECT COD|MAIL|quietly regular warthogs +15873|66|92|1|19|18355.14|0.05|0.01|R|F|1994-10-04|1994-09-01|1994-10-11|TAKE BACK RETURN|SHIP|g ideas are blithely ironic packages-- q +15874|554|85|1|30|43636.50|0.03|0.06|N|O|1996-05-11|1996-07-06|1996-05-26|DELIVER IN PERSON|REG AIR|tes. blithely sly dolphins haggle +15874|344|45|2|36|44796.24|0.03|0.04|N|O|1996-06-10|1996-06-09|1996-06-25|COLLECT COD|AIR|eas haggle about +15875|1516|37|1|21|29767.71|0.03|0.07|N|O|1996-10-30|1996-10-12|1996-11-15|DELIVER IN PERSON|MAIL|ly even ideas sleep. furiously even braids +15875|1935|36|2|27|49597.11|0.01|0.04|N|O|1996-11-04|1996-11-24|1996-11-30|COLLECT COD|SHIP|r ironic foxes. slyly even frets a +15875|116|17|3|25|25402.75|0.04|0.08|N|O|1996-09-18|1996-10-13|1996-09-24|TAKE BACK RETURN|SHIP|slyly ironic ac +15875|1368|45|4|43|54582.48|0.06|0.04|N|O|1996-11-10|1996-10-04|1996-11-16|TAKE BACK RETURN|AIR|uctions affix quickl +15876|1649|50|1|44|68228.16|0.09|0.03|A|F|1995-03-17|1995-03-29|1995-04-03|COLLECT COD|SHIP| wake against the slyly spe +15876|1486|65|2|28|38849.44|0.09|0.01|R|F|1995-02-08|1995-03-24|1995-02-18|COLLECT COD|TRUCK|ons cajole slyly. carefully +15877|486|16|1|37|51299.76|0.05|0.01|N|O|1996-04-10|1996-05-15|1996-04-26|COLLECT COD|SHIP|rouches haggle bl +15877|605|37|2|28|42156.80|0.04|0.05|N|O|1996-04-06|1996-05-22|1996-04-23|NONE|REG AIR|s wake slyly. +15877|423|82|3|5|6617.10|0.06|0.08|N|O|1996-06-21|1996-05-25|1996-06-22|NONE|REG AIR|lets are ironic, unusual accounts. accounts +15878|1417|96|1|48|63283.68|0.08|0.01|A|F|1994-01-04|1993-12-11|1994-01-09|TAKE BACK RETURN|REG AIR|sly final dinos. bold pinto beans +15878|1573|74|2|2|2949.14|0.07|0.02|R|F|1993-12-07|1994-01-15|1993-12-18|COLLECT COD|SHIP|uffily express dolphin +15878|1727|70|3|35|57005.20|0.05|0.00|R|F|1994-01-27|1993-12-13|1994-02-05|DELIVER IN PERSON|AIR|ts sleep above the even inst +15878|106|33|4|38|38231.80|0.09|0.08|R|F|1994-01-09|1993-12-05|1994-01-23|NONE|TRUCK|gle furiously regular +15878|1777|78|5|44|73865.88|0.01|0.01|A|F|1993-12-11|1994-01-15|1993-12-20|NONE|TRUCK|its haggle carefully. blithely busy req +15879|332|33|1|46|56687.18|0.04|0.01|N|O|1997-11-01|1997-08-06|1997-11-07|DELIVER IN PERSON|FOB|thely bold requests haggl +15879|1397|98|2|44|57129.16|0.02|0.06|N|O|1997-08-09|1997-09-06|1997-08-18|COLLECT COD|TRUCK|accounts haggle ironic, i +15879|805|5|3|34|57997.20|0.10|0.01|N|O|1997-09-11|1997-09-28|1997-09-20|NONE|RAIL|are alongside of the quickly fin +15904|783|48|1|26|43778.28|0.10|0.04|R|F|1995-02-10|1994-12-21|1995-02-26|COLLECT COD|RAIL|ckly accounts. furiously e +15904|216|44|2|15|16743.15|0.03|0.01|A|F|1995-02-25|1994-12-24|1995-03-09|DELIVER IN PERSON|REG AIR| sleep. slyly final deposits sleep careful +15904|1717|60|3|26|42086.46|0.00|0.03|R|F|1995-01-17|1994-12-10|1995-02-07|COLLECT COD|MAIL|sits serve +15904|1354|69|4|4|5021.40|0.09|0.06|R|F|1994-11-17|1995-01-01|1994-11-26|COLLECT COD|TRUCK|ts. quickly final deposits alongside of +15904|1533|54|5|48|68857.44|0.04|0.08|A|F|1994-12-13|1995-01-14|1995-01-12|TAKE BACK RETURN|SHIP|sly special theodolites sleep slyly f +15905|848|82|1|7|12241.88|0.03|0.03|A|F|1993-08-25|1993-07-10|1993-09-01|NONE|SHIP|gular foxes affix carefully final wat +15906|951|86|1|9|16667.55|0.07|0.08|R|F|1993-11-11|1993-11-11|1993-11-25|TAKE BACK RETURN|RAIL|eans. fluffil +15906|476|6|2|42|57811.74|0.07|0.00|R|F|1993-10-18|1993-11-09|1993-10-20|COLLECT COD|AIR|uests. quickly final deposits +15906|748|45|3|39|64300.86|0.05|0.03|R|F|1993-10-05|1993-11-21|1993-10-18|COLLECT COD|MAIL| carefully ironic deposits. pendi +15907|715|16|1|4|6462.84|0.01|0.00|R|F|1995-05-05|1995-06-11|1995-05-20|TAKE BACK RETURN|AIR|the even requests. flu +15907|1458|98|2|34|46221.30|0.00|0.05|A|F|1995-04-29|1995-06-05|1995-05-12|DELIVER IN PERSON|REG AIR|l packages. unusual platelets +15907|485|15|3|35|48491.80|0.08|0.01|A|F|1995-04-23|1995-05-18|1995-05-12|DELIVER IN PERSON|RAIL|fully regular ideas. +15907|562|93|4|48|70202.88|0.03|0.06|A|F|1995-05-05|1995-05-28|1995-05-12|DELIVER IN PERSON|FOB|he even ideas. furiously even requests wake +15907|1555|76|5|19|27674.45|0.09|0.07|N|O|1995-07-19|1995-05-31|1995-08-10|DELIVER IN PERSON|RAIL|ackages hagg +15907|1357|96|6|32|40267.20|0.10|0.01|R|F|1995-05-20|1995-07-06|1995-06-02|TAKE BACK RETURN|RAIL| wake furio +15908|1991|36|1|17|32180.83|0.05|0.05|N|O|1996-04-04|1996-03-19|1996-04-24|TAKE BACK RETURN|SHIP|pecial foxes. carefully un +15908|1612|95|2|12|18163.32|0.02|0.04|N|O|1996-05-05|1996-03-11|1996-05-15|DELIVER IN PERSON|SHIP|ording to the carefully pen +15908|1201|13|3|3|3306.60|0.02|0.03|N|O|1996-03-26|1996-03-04|1996-04-09|DELIVER IN PERSON|RAIL|ter the enticingly even platelet +15908|222|50|4|22|24688.84|0.03|0.05|N|O|1996-02-24|1996-04-11|1996-02-26|NONE|MAIL|ly bold packages su +15908|428|87|5|32|42509.44|0.06|0.06|N|O|1996-05-08|1996-03-03|1996-05-18|NONE|AIR|ix against the furiously iron +15908|965|68|6|47|87700.12|0.05|0.01|N|O|1996-02-04|1996-04-05|1996-02-21|DELIVER IN PERSON|RAIL|ove the fluffily ironi +15908|1310|25|7|5|6056.55|0.07|0.08|N|O|1996-05-13|1996-03-05|1996-05-23|NONE|AIR|near the requests: carefully ev +15909|712|9|1|8|12901.68|0.05|0.01|N|O|1997-01-22|1997-02-10|1997-02-12|TAKE BACK RETURN|SHIP|regular packages. slyly ironic th +15909|805|39|2|19|32410.20|0.01|0.00|N|O|1997-04-02|1997-02-03|1997-04-27|COLLECT COD|RAIL|s boost carefully a +15909|985|20|3|39|73553.22|0.10|0.04|N|O|1997-02-21|1997-01-24|1997-03-18|DELIVER IN PERSON|TRUCK|ven dependencies. caref +15909|785|82|4|32|53944.96|0.10|0.02|N|O|1996-12-28|1997-02-22|1997-01-21|TAKE BACK RETURN|FOB| of the fluffily furious foxes. b +15909|1160|33|5|14|14856.24|0.01|0.05|N|O|1997-02-07|1997-03-13|1997-02-09|NONE|RAIL|ithely regular pinto beans sle +15910|688|20|1|6|9532.08|0.08|0.03|N|O|1997-12-20|1997-11-06|1998-01-01|DELIVER IN PERSON|MAIL|slyly unusual deposits a +15910|1798|99|2|7|11898.53|0.06|0.01|N|O|1997-10-02|1997-11-11|1997-10-31|TAKE BACK RETURN|MAIL|s sleep blithely across +15910|1771|72|3|30|50183.10|0.04|0.04|N|O|1997-11-08|1997-09-27|1997-12-07|TAKE BACK RETURN|TRUCK|pending dependencies. carefully fina +15910|1230|42|4|1|1131.23|0.10|0.06|N|O|1997-09-13|1997-11-17|1997-09-25|NONE|REG AIR|foxes engage flu +15910|1821|51|5|43|74081.26|0.01|0.04|N|O|1997-09-21|1997-10-29|1997-09-22|NONE|MAIL|inal theod +15910|79|55|6|3|2937.21|0.03|0.07|N|O|1997-09-18|1997-11-03|1997-10-15|TAKE BACK RETURN|REG AIR|o beans alongside of the regul +15911|1389|4|1|20|25807.60|0.00|0.02|N|O|1995-10-26|1995-11-09|1995-11-21|TAKE BACK RETURN|TRUCK|. even accounts are carefully! ironic +15911|1770|13|2|8|13374.16|0.10|0.06|N|O|1995-09-23|1995-11-25|1995-10-06|NONE|SHIP|ss requests. deposits wake blith +15911|189|16|3|1|1089.18|0.10|0.05|N|O|1995-11-29|1995-12-02|1995-12-19|DELIVER IN PERSON|TRUCK|symptotes. regular, regular accounts w +15936|1419|59|1|19|25087.79|0.06|0.04|N|O|1996-09-11|1996-10-24|1996-09-29|DELIVER IN PERSON|MAIL|ng ideas of the slyly ironic accounts +15936|1520|41|2|38|54017.76|0.10|0.01|N|O|1996-11-25|1996-11-24|1996-12-01|NONE|REG AIR|nic requests. regular, permanent requ +15936|1844|31|3|33|57612.72|0.09|0.07|N|O|1996-12-10|1996-11-28|1997-01-08|NONE|MAIL|ly final foxes! +15936|378|63|4|24|30680.88|0.10|0.01|N|O|1996-09-10|1996-11-01|1996-10-10|NONE|AIR|o beans. thinly pending +15936|1346|23|5|4|4989.36|0.00|0.03|N|O|1996-09-19|1996-10-08|1996-09-29|NONE|AIR|xpress ideas. slowly expre +15936|1933|22|6|20|36698.60|0.08|0.07|N|O|1996-12-25|1996-12-03|1997-01-08|NONE|AIR|foxes sleep up the blithely regu +15937|156|57|1|43|45414.45|0.09|0.01|R|F|1992-11-11|1993-01-02|1992-11-18|DELIVER IN PERSON|MAIL|y. carefully pending pinto beans p +15937|137|38|2|24|24891.12|0.01|0.08|A|F|1992-11-09|1992-12-20|1992-12-04|DELIVER IN PERSON|SHIP| unusual, ironi +15937|397|26|3|4|5189.56|0.05|0.08|R|F|1992-11-15|1992-12-14|1992-11-29|TAKE BACK RETURN|AIR| permanently about the +15938|107|8|1|16|16113.60|0.07|0.01|N|O|1996-07-24|1996-06-08|1996-08-08|NONE|RAIL| against the fluffily ironic deposits. +15938|385|70|2|31|39846.78|0.08|0.04|N|O|1996-07-28|1996-07-18|1996-08-23|TAKE BACK RETURN|AIR|scapades lose slyly regular, ironic acco +15938|1289|90|3|48|57133.44|0.03|0.07|N|O|1996-07-12|1996-06-27|1996-07-26|COLLECT COD|SHIP|hely even +15938|1259|34|4|38|44089.50|0.01|0.07|N|O|1996-08-27|1996-07-19|1996-09-14|DELIVER IN PERSON|SHIP|ies cajole. furiously special in +15938|1904|49|5|3|5417.70|0.06|0.01|N|O|1996-08-03|1996-07-15|1996-08-16|COLLECT COD|MAIL| accounts. final instructio +15939|1209|84|1|47|52179.40|0.03|0.02|N|O|1997-03-20|1997-03-29|1997-04-14|DELIVER IN PERSON|SHIP|. regular, special accounts n +15939|177|78|2|29|31237.93|0.00|0.01|N|O|1997-05-26|1997-03-11|1997-06-17|DELIVER IN PERSON|TRUCK|unts among the regula +15939|674|37|3|23|36217.41|0.08|0.01|N|O|1997-05-26|1997-05-02|1997-05-31|DELIVER IN PERSON|TRUCK|inal foxes haggle. bold foxes ca +15939|1861|91|4|20|35257.20|0.02|0.02|N|O|1997-04-24|1997-04-09|1997-05-21|COLLECT COD|REG AIR|ometimes across the furiously final pa +15939|1666|67|5|19|29785.54|0.05|0.00|N|O|1997-06-06|1997-05-04|1997-06-11|NONE|TRUCK|arefully specia +15940|418|77|1|12|15820.92|0.07|0.00|A|F|1992-02-17|1992-03-31|1992-03-01|NONE|REG AIR|le after the +15940|188|41|2|43|46791.74|0.04|0.06|R|F|1992-03-16|1992-03-29|1992-03-21|TAKE BACK RETURN|SHIP|o beans according to the carefully even +15940|645|39|3|27|41732.28|0.00|0.06|A|F|1992-02-25|1992-04-05|1992-03-20|COLLECT COD|RAIL| above the pending instruct +15941|539|30|1|32|46064.96|0.09|0.01|N|O|1996-02-26|1996-01-19|1996-02-28|DELIVER IN PERSON|MAIL|ly unusual excuses. slyly ironic de +15941|1566|67|2|22|32286.32|0.01|0.02|N|O|1996-01-30|1996-02-14|1996-02-21|TAKE BACK RETURN|SHIP| evenly final e +15941|1691|15|3|15|23890.35|0.00|0.07|N|O|1996-02-01|1996-03-07|1996-02-19|NONE|RAIL|cajole. carefully final deposits w +15941|418|77|4|17|22412.97|0.00|0.00|N|O|1995-12-19|1996-03-04|1996-01-04|NONE|SHIP|ash. pinto beans according to the express +15941|375|60|5|17|21681.29|0.10|0.01|N|O|1996-02-10|1996-01-21|1996-02-19|COLLECT COD|REG AIR|e ironic Tiresias. dependencies are f +15941|1048|84|6|23|21827.92|0.03|0.02|N|O|1996-03-14|1996-02-18|1996-03-29|COLLECT COD|AIR|ld requests +15942|579|80|1|4|5918.28|0.05|0.03|A|F|1993-11-16|1993-10-07|1993-12-09|NONE|MAIL| of the bold foxes. careful +15942|1320|21|2|41|50074.12|0.01|0.02|A|F|1993-09-21|1993-11-07|1993-10-15|COLLECT COD|FOB|y furiously regular deposits. b +15942|650|51|3|24|37215.60|0.00|0.05|R|F|1993-11-28|1993-10-14|1993-12-01|COLLECT COD|SHIP|ts nag: slyly special depend +15942|1151|52|4|3|3156.45|0.10|0.00|R|F|1993-10-01|1993-10-22|1993-10-22|TAKE BACK RETURN|TRUCK| wake carefully +15942|1605|6|5|20|30132.00|0.03|0.01|R|F|1993-09-12|1993-10-27|1993-10-12|NONE|TRUCK| requests. quickly b +15943|1578|59|1|4|5918.28|0.10|0.04|R|F|1992-03-18|1992-03-07|1992-04-03|COLLECT COD|MAIL|ructions sublate slyly reg +15943|1875|62|2|42|74628.54|0.07|0.05|R|F|1992-02-24|1992-04-28|1992-03-08|DELIVER IN PERSON|REG AIR|uctions. slyly +15968|1765|92|1|4|6667.04|0.00|0.01|N|O|1997-07-19|1997-07-07|1997-07-20|COLLECT COD|SHIP|lently bold packages. slyly even deposits +15968|1631|14|2|46|70500.98|0.01|0.06|N|O|1997-07-17|1997-06-25|1997-07-19|NONE|SHIP|carefully packages. furiously fi +15968|1641|42|3|2|3085.28|0.10|0.06|N|O|1997-08-11|1997-06-09|1997-09-03|COLLECT COD|REG AIR|endencies wake furiously. +15968|535|36|4|18|25839.54|0.08|0.00|N|O|1997-07-11|1997-06-03|1997-07-14|NONE|RAIL|ecial packages-- deposits +15969|1399|38|1|28|36410.92|0.08|0.07|A|F|1993-11-15|1993-10-29|1993-11-28|TAKE BACK RETURN|RAIL|the furiously even requ +15969|432|91|2|16|21318.88|0.05|0.04|A|F|1993-10-08|1993-09-04|1993-10-17|TAKE BACK RETURN|AIR|into beans detect furiously alongside +15970|1677|60|1|40|63146.80|0.01|0.07|N|O|1995-09-25|1995-10-28|1995-10-16|NONE|TRUCK|fully. ideas use furiously. sl +15970|39|65|2|17|15963.51|0.07|0.01|N|O|1995-12-03|1995-11-27|1995-12-29|COLLECT COD|TRUCK|ies. regular orbits should doze always re +15970|1098|34|3|44|43959.96|0.03|0.07|N|O|1996-01-15|1995-11-04|1996-02-01|TAKE BACK RETURN|REG AIR| dependenci +15970|1875|76|4|13|23099.31|0.09|0.06|N|O|1996-01-10|1995-10-27|1996-02-03|NONE|FOB|y final requests wake blithely accord +15971|750|51|1|36|59427.00|0.03|0.02|R|F|1994-09-13|1994-09-29|1994-09-14|NONE|MAIL|ernes need to wake. regular packages a +15971|1604|87|2|25|37640.00|0.06|0.02|R|F|1994-11-18|1994-10-25|1994-12-12|DELIVER IN PERSON|TRUCK|urts are re +15971|430|31|3|49|65191.07|0.04|0.00|R|F|1994-11-22|1994-10-05|1994-12-14|DELIVER IN PERSON|FOB|, pending theodolites. slyly even r +15971|917|52|4|46|83623.86|0.10|0.00|A|F|1994-08-22|1994-09-29|1994-09-21|COLLECT COD|TRUCK|cuses are perm +15972|1446|86|1|1|1347.44|0.02|0.06|N|O|1995-10-26|1995-10-02|1995-11-09|NONE|AIR|refully even courts against the furiousl +15972|181|8|2|36|38922.48|0.10|0.05|N|O|1995-10-14|1995-09-10|1995-10-23|NONE|MAIL|ts with the instructio +15972|171|50|3|4|4284.68|0.04|0.04|N|O|1995-12-05|1995-10-22|1995-12-28|TAKE BACK RETURN|RAIL|ss instructio +15972|1492|93|4|22|30656.78|0.07|0.02|N|O|1995-11-19|1995-09-20|1995-11-27|TAKE BACK RETURN|AIR|s! express, +15973|574|75|1|39|57508.23|0.05|0.03|N|O|1997-09-06|1997-08-29|1997-09-29|DELIVER IN PERSON|FOB| dependencies thrash at +15973|273|28|2|39|45757.53|0.00|0.02|N|O|1997-07-25|1997-10-16|1997-08-07|TAKE BACK RETURN|FOB|express ideas-- special deposits sleep +15974|1767|10|1|29|48394.04|0.08|0.02|N|O|1995-08-22|1995-07-29|1995-09-14|NONE|TRUCK|s promise slyly. f +15974|326|11|2|35|42921.20|0.06|0.07|N|O|1995-08-07|1995-07-12|1995-09-06|TAKE BACK RETURN|TRUCK|ans boost according to the even +15974|12|63|3|16|14592.16|0.03|0.08|N|O|1995-07-17|1995-06-04|1995-07-26|TAKE BACK RETURN|MAIL|regular deposits after the packages slee +15975|165|66|1|4|4260.64|0.08|0.02|N|O|1998-05-12|1998-03-14|1998-06-05|COLLECT COD|AIR|y. even instruction +15975|941|44|2|38|69993.72|0.05|0.02|N|O|1998-03-10|1998-03-31|1998-03-24|COLLECT COD|REG AIR|s are quickly. fluffily +15975|566|27|3|9|13199.04|0.01|0.00|N|O|1998-05-15|1998-04-14|1998-06-03|COLLECT COD|RAIL|e to haggle caref +15975|1982|71|4|17|32027.66|0.08|0.02|N|O|1998-02-20|1998-03-05|1998-03-20|DELIVER IN PERSON|TRUCK|l, ironic requests. regular, qui +15975|587|48|5|21|31239.18|0.06|0.07|N|O|1998-05-01|1998-04-20|1998-05-09|NONE|REG AIR|sts sleep. slyly regular ideas wake. care +15975|1623|47|6|38|57935.56|0.01|0.07|N|O|1998-04-14|1998-03-19|1998-04-26|NONE|SHIP|eposits. blithely ironic p +15975|1456|57|7|20|27149.00|0.06|0.07|N|O|1998-02-21|1998-03-19|1998-03-15|COLLECT COD|MAIL|even, ironic instructions haggle of th +16000|51|27|1|32|30433.60|0.02|0.02|N|O|1998-03-17|1998-02-10|1998-03-30|TAKE BACK RETURN|RAIL|ously sly requests. final, +16000|158|85|2|1|1058.15|0.05|0.07|N|O|1998-01-13|1998-02-05|1998-01-30|NONE|MAIL|deposits use blithely ironic frays. +16000|844|44|3|22|38386.48|0.01|0.08|N|O|1998-03-24|1998-01-23|1998-04-14|DELIVER IN PERSON|SHIP|ar instructions. slowl +16000|1273|48|4|48|56364.96|0.08|0.01|N|O|1998-04-17|1998-02-28|1998-05-16|COLLECT COD|TRUCK|against the accounts. furiou +16000|1468|69|5|4|5477.84|0.06|0.01|N|O|1998-02-14|1998-01-23|1998-03-09|DELIVER IN PERSON|SHIP|ular reque +16000|143|22|6|31|32337.34|0.09|0.00|N|O|1998-04-02|1998-03-09|1998-04-18|NONE|SHIP| regular theodolites. furiously si +16001|1108|81|1|10|10091.00|0.07|0.00|N|O|1996-06-21|1996-07-16|1996-06-24|NONE|TRUCK|ts wake furiously despite the fu +16001|81|57|2|22|21583.76|0.05|0.01|N|O|1996-07-20|1996-07-26|1996-07-27|COLLECT COD|REG AIR|ccounts across the unusual, +16001|1915|60|3|17|30887.47|0.04|0.04|N|O|1996-06-14|1996-07-20|1996-07-06|COLLECT COD|FOB|ic multipliers boost ca +16001|592|23|4|48|71644.32|0.06|0.05|N|O|1996-06-03|1996-06-06|1996-06-12|TAKE BACK RETURN|TRUCK|s cajole quickly. ironic instructio +16001|697|91|5|8|12781.52|0.10|0.08|N|O|1996-08-05|1996-06-30|1996-08-20|COLLECT COD|SHIP|refully regular instructions +16001|355|56|6|13|16319.55|0.04|0.08|N|O|1996-07-22|1996-06-08|1996-07-25|COLLECT COD|TRUCK| requests. fi +16002|68|94|1|10|9680.60|0.10|0.07|N|O|1998-06-27|1998-05-02|1998-07-17|COLLECT COD|FOB|ial, ironic platelet +16002|134|61|2|39|40331.07|0.06|0.08|N|O|1998-06-27|1998-05-13|1998-07-23|NONE|MAIL|tructions cajole. +16002|1927|60|3|4|7315.68|0.07|0.04|N|O|1998-06-19|1998-05-21|1998-06-23|TAKE BACK RETURN|MAIL|ending theodolites. ironic, sile +16003|91|92|1|3|2973.27|0.10|0.03|N|O|1998-01-09|1998-03-11|1998-01-19|TAKE BACK RETURN|AIR|deposits solve on the q +16003|1882|83|2|48|85626.24|0.06|0.04|N|O|1998-01-02|1998-01-25|1998-01-22|NONE|MAIL|symptotes. slyly express +16003|1482|100|3|37|51188.76|0.07|0.00|N|O|1998-01-26|1998-02-06|1998-02-08|NONE|FOB|te furious +16003|1867|54|4|44|77829.84|0.08|0.07|N|O|1998-03-05|1998-02-22|1998-03-21|COLLECT COD|RAIL|, bold instructions. carefully regular +16003|1948|49|5|47|86947.18|0.04|0.01|N|O|1998-01-22|1998-02-20|1998-02-01|DELIVER IN PERSON|FOB|unts. slyly silent accounts sub +16003|108|61|6|18|18145.80|0.08|0.05|N|O|1998-02-03|1998-02-23|1998-02-11|DELIVER IN PERSON|REG AIR|efully besides the slyly final asympto +16004|889|23|1|26|46536.88|0.04|0.05|N|O|1997-05-03|1997-03-13|1997-05-10|NONE|TRUCK|sly unusual dependencies. pending packa +16004|1056|57|2|12|11484.60|0.09|0.07|N|O|1997-03-16|1997-03-02|1997-04-01|DELIVER IN PERSON|FOB|latelets n +16005|959|60|1|26|48358.70|0.01|0.08|R|F|1993-04-02|1993-02-27|1993-05-01|TAKE BACK RETURN|FOB|nly even requests boost blithely among +16005|1044|80|2|40|37801.60|0.01|0.01|A|F|1993-03-21|1993-03-02|1993-04-05|NONE|SHIP|sly regular theodolites according +16005|1160|61|3|47|49874.52|0.10|0.02|R|F|1993-02-24|1993-03-06|1993-03-15|NONE|TRUCK|. express req +16005|1539|20|4|38|54740.14|0.10|0.03|A|F|1993-04-05|1993-03-16|1993-05-03|DELIVER IN PERSON|AIR|bold packages. final, regular accounts amon +16005|795|96|5|22|37307.38|0.07|0.03|A|F|1993-04-24|1993-03-03|1993-05-24|NONE|TRUCK|arefully according to the sile +16005|1944|45|6|32|59070.08|0.06|0.07|R|F|1993-02-08|1993-02-14|1993-02-10|COLLECT COD|AIR|ully even foxes. accounts sl +16005|1278|53|7|32|37736.64|0.07|0.03|A|F|1993-03-16|1993-03-20|1993-04-03|DELIVER IN PERSON|AIR|pending requests according to +16006|541|2|1|20|28830.80|0.03|0.05|N|O|1997-02-23|1997-04-23|1997-03-19|TAKE BACK RETURN|RAIL| final pinto beans +16006|1986|19|2|33|62303.34|0.09|0.06|N|O|1997-04-22|1997-03-21|1997-05-12|DELIVER IN PERSON|RAIL|rnis snooze fluffily among the furiousl +16006|1887|74|3|32|57244.16|0.06|0.07|N|O|1997-04-10|1997-04-30|1997-05-04|NONE|SHIP|gside of the carefully regular foxes nag am +16006|486|45|4|13|18024.24|0.08|0.01|N|O|1997-04-28|1997-04-21|1997-05-11|NONE|MAIL|unts among the daring, bold acc +16006|1369|46|5|30|38110.80|0.00|0.05|N|O|1997-02-09|1997-04-24|1997-02-26|COLLECT COD|FOB|gle accordin +16007|1438|17|1|1|1339.43|0.09|0.04|A|F|1994-08-14|1994-07-24|1994-09-09|TAKE BACK RETURN|FOB|nag enticingly. regular, regular e +16007|954|89|2|29|53793.55|0.10|0.06|R|F|1994-05-27|1994-07-02|1994-05-30|COLLECT COD|MAIL|ts are about the blit +16007|803|4|3|50|85190.00|0.09|0.02|A|F|1994-04-28|1994-06-01|1994-05-25|COLLECT COD|SHIP|efully. quickly express platelets caj +16007|1952|97|4|27|50056.65|0.04|0.01|A|F|1994-05-29|1994-05-25|1994-06-24|NONE|AIR|odolites slee +16032|1779|64|1|47|78996.19|0.05|0.06|A|F|1995-02-28|1995-01-22|1995-03-03|DELIVER IN PERSON|TRUCK| always special instructions +16032|51|52|2|36|34237.80|0.10|0.08|A|F|1994-12-26|1995-03-01|1995-01-06|TAKE BACK RETURN|REG AIR|. dependencies wake carefully +16032|1116|17|3|42|42718.62|0.10|0.02|R|F|1995-01-27|1995-02-26|1995-02-01|NONE|TRUCK|final foxes wake quickly blithely regul +16032|1478|18|4|29|40004.63|0.09|0.01|R|F|1995-02-19|1995-01-12|1995-02-25|DELIVER IN PERSON|AIR|le about the ca +16032|474|4|5|31|42608.57|0.04|0.01|R|F|1994-12-20|1995-01-17|1994-12-30|NONE|SHIP|ickly bold depe +16033|1487|27|1|25|34712.00|0.01|0.08|N|O|1996-07-07|1996-05-27|1996-07-30|TAKE BACK RETURN|AIR|olites cajole slyly +16033|1728|13|2|2|3259.44|0.01|0.06|N|O|1996-08-03|1996-07-23|1996-08-24|COLLECT COD|AIR|es. accounts boost carefully ag +16033|1773|100|3|10|16747.70|0.06|0.06|N|O|1996-07-28|1996-07-07|1996-08-08|NONE|TRUCK|s about the regular deposits nag aft +16033|169|48|4|9|9622.44|0.10|0.07|N|O|1996-07-18|1996-07-09|1996-08-11|TAKE BACK RETURN|MAIL|sly even foxes sleep across the thin pint +16033|1832|19|5|28|48547.24|0.09|0.03|N|O|1996-05-28|1996-06-30|1996-06-01|DELIVER IN PERSON|TRUCK| sleep quickly. furiously special escapa +16033|979|14|6|18|33839.46|0.10|0.07|N|O|1996-07-10|1996-06-11|1996-08-08|TAKE BACK RETURN|MAIL|lets would wake busily express deposit +16034|448|78|1|27|36407.88|0.10|0.06|N|O|1997-10-19|1997-10-13|1997-10-22|COLLECT COD|FOB|en packages: carefully ironic requests ca +16034|179|6|2|37|39929.29|0.01|0.08|N|O|1997-10-05|1997-09-15|1997-10-24|COLLECT COD|TRUCK|. blithely express dependencies are +16034|957|60|3|48|89181.60|0.02|0.00|N|O|1997-08-20|1997-10-24|1997-08-27|DELIVER IN PERSON|SHIP|platelets. blithely regular requests +16035|1892|79|1|24|43053.36|0.06|0.06|A|F|1993-08-07|1993-05-27|1993-08-17|DELIVER IN PERSON|SHIP|l dugouts cajole q +16035|747|80|2|31|51079.94|0.04|0.01|A|F|1993-06-30|1993-06-25|1993-07-07|DELIVER IN PERSON|FOB|detect. fluffily final accounts integrate f +16036|898|98|1|49|88145.61|0.03|0.06|A|F|1992-02-22|1992-03-29|1992-03-12|TAKE BACK RETURN|TRUCK|ven notornis. blithel +16036|1663|87|2|30|46939.80|0.03|0.04|A|F|1992-04-30|1992-02-21|1992-05-30|TAKE BACK RETURN|MAIL|ly regular asymptotes shall have +16036|1510|31|3|44|62106.44|0.05|0.04|A|F|1992-04-20|1992-03-11|1992-04-24|NONE|SHIP|otes. regular +16036|1336|51|4|50|61866.50|0.09|0.01|R|F|1992-04-09|1992-04-05|1992-04-22|COLLECT COD|AIR|tructions integra +16037|791|24|1|4|6767.16|0.01|0.07|N|O|1998-07-20|1998-06-24|1998-08-18|DELIVER IN PERSON|REG AIR|heodolites. slyly sp +16037|1792|35|2|3|5081.37|0.08|0.04|N|O|1998-06-30|1998-07-17|1998-07-14|NONE|FOB|above the blithely bold instructions. speci +16037|824|24|3|16|27597.12|0.01|0.07|N|O|1998-06-28|1998-07-03|1998-07-24|NONE|REG AIR|n, express deposits. unusual +16037|1333|48|4|47|58013.51|0.00|0.00|N|O|1998-05-26|1998-07-10|1998-05-30|COLLECT COD|REG AIR|ges affix carefully ironic instruct +16038|260|15|1|5|5801.30|0.06|0.05|N|O|1998-08-07|1998-08-23|1998-09-03|COLLECT COD|MAIL|r accounts-- closely unusual pinto bean +16038|261|43|2|19|22063.94|0.06|0.02|N|O|1998-08-14|1998-09-02|1998-08-21|TAKE BACK RETURN|AIR|usly final depths among the pend +16038|574|75|3|12|17694.84|0.02|0.02|N|O|1998-10-09|1998-08-08|1998-11-06|TAKE BACK RETURN|REG AIR|nt ideas. c +16038|387|16|4|7|9011.66|0.00|0.05|N|O|1998-07-18|1998-07-20|1998-07-19|COLLECT COD|MAIL|cajole around the acc +16038|637|69|5|41|63042.83|0.02|0.07|N|O|1998-09-14|1998-09-12|1998-09-28|TAKE BACK RETURN|MAIL|final, bold foxes. quickly fin +16039|965|66|1|35|65308.60|0.06|0.00|R|F|1992-06-01|1992-08-12|1992-06-27|NONE|AIR|ackages solve furiously fur +16039|831|65|2|26|45027.58|0.06|0.00|R|F|1992-08-25|1992-06-23|1992-09-23|DELIVER IN PERSON|RAIL|ly even exc +16039|1544|65|3|50|72277.00|0.01|0.04|R|F|1992-08-30|1992-07-20|1992-09-10|DELIVER IN PERSON|TRUCK|ains after the furiou +16039|1140|13|4|49|51015.86|0.03|0.03|A|F|1992-08-02|1992-07-08|1992-08-22|TAKE BACK RETURN|FOB|lly ironic accounts. +16064|190|91|1|46|50148.74|0.08|0.06|A|F|1992-01-24|1992-02-25|1992-02-04|TAKE BACK RETURN|REG AIR|sual dependencies. unusual, fin +16064|1663|5|2|43|67280.38|0.04|0.04|A|F|1992-01-18|1992-02-12|1992-01-26|COLLECT COD|RAIL|across the furiously +16064|1940|41|3|1|1841.94|0.09|0.03|R|F|1992-04-18|1992-03-05|1992-05-15|NONE|AIR|eposits acr +16065|617|49|1|14|21246.54|0.00|0.04|A|F|1993-07-23|1993-10-11|1993-07-24|DELIVER IN PERSON|FOB|accounts. quickly regular inst +16065|1809|39|2|17|29083.60|0.00|0.02|A|F|1993-08-23|1993-10-17|1993-08-31|COLLECT COD|TRUCK|egular foxes unwind s +16066|1039|10|1|33|31020.99|0.04|0.08|N|O|1998-09-14|1998-08-07|1998-09-23|DELIVER IN PERSON|AIR| accounts. slyly final r +16066|1986|87|2|4|7551.92|0.08|0.08|N|O|1998-09-09|1998-08-24|1998-09-20|COLLECT COD|REG AIR|furiously regular accounts. slyl +16066|99|75|3|23|22979.07|0.07|0.01|N|O|1998-08-15|1998-07-16|1998-09-12|TAKE BACK RETURN|AIR|express accou +16067|559|20|1|23|33569.65|0.06|0.02|N|O|1996-11-17|1996-11-16|1996-11-24|TAKE BACK RETURN|AIR|old slyly afte +16067|627|59|2|37|56521.94|0.09|0.00|N|O|1996-11-18|1996-11-20|1996-12-07|TAKE BACK RETURN|TRUCK|y ironic ideas nag +16067|972|73|3|6|11237.82|0.08|0.07|N|O|1997-01-03|1996-11-18|1997-01-27|COLLECT COD|FOB|ng to the quickly regular pinto be +16067|404|92|4|27|35218.80|0.00|0.08|N|O|1996-12-17|1996-11-27|1997-01-02|TAKE BACK RETURN|FOB|ly bold acco +16067|1706|7|5|13|20900.10|0.08|0.01|N|O|1997-01-19|1996-10-30|1997-02-07|NONE|TRUCK|ounts wake ac +16068|1951|52|1|40|74118.00|0.05|0.04|A|F|1992-11-13|1993-01-10|1992-11-22|NONE|SHIP|ts sleep fluffily across the furiously regu +16069|1824|25|1|3|5177.46|0.09|0.06|A|F|1993-08-17|1993-10-28|1993-09-02|COLLECT COD|FOB|ve enticingly even +16069|1746|47|2|29|47784.46|0.00|0.01|R|F|1993-08-24|1993-09-14|1993-09-21|DELIVER IN PERSON|TRUCK|pendencies affix aro +16069|1060|31|3|42|40364.52|0.07|0.05|A|F|1993-11-02|1993-09-08|1993-11-17|DELIVER IN PERSON|REG AIR|s at the carefully ironic ideas sleep iro +16070|733|66|1|48|78419.04|0.05|0.07|R|F|1992-08-14|1992-07-12|1992-08-26|COLLECT COD|RAIL|e quickly regular accounts. bold plat +16070|1586|87|2|5|7437.90|0.02|0.05|A|F|1992-07-02|1992-07-08|1992-07-19|DELIVER IN PERSON|REG AIR|inally even +16071|1502|23|1|44|61754.00|0.07|0.04|R|F|1992-09-08|1992-10-23|1992-09-11|NONE|AIR|the special requests cajole +16096|1088|59|1|46|45497.68|0.00|0.08|A|F|1995-03-11|1995-03-25|1995-04-09|DELIVER IN PERSON|SHIP|hely pending ideas boost ironic, final +16096|356|13|2|20|25127.00|0.01|0.05|R|F|1995-03-21|1995-03-03|1995-03-25|COLLECT COD|AIR|pecial, ironic excuses about the c +16096|1173|82|3|38|40818.46|0.08|0.07|R|F|1995-04-09|1995-03-24|1995-04-23|DELIVER IN PERSON|SHIP|ts. regular excu +16096|1537|78|4|39|56102.67|0.03|0.08|R|F|1995-03-27|1995-03-05|1995-04-07|COLLECT COD|RAIL|its! packages integrate regula +16096|704|69|5|9|14442.30|0.03|0.01|A|F|1995-03-03|1995-04-19|1995-04-02|NONE|FOB|accounts ha +16096|468|27|6|32|43790.72|0.10|0.05|A|F|1995-04-14|1995-04-12|1995-04-18|COLLECT COD|SHIP| may wake ca +16097|233|88|1|4|4532.92|0.01|0.04|N|O|1996-09-22|1996-10-29|1996-10-01|TAKE BACK RETURN|TRUCK|ng to the furiously silent sheaves. +16097|1026|97|2|43|39861.86|0.04|0.04|N|O|1996-12-04|1996-11-17|1996-12-19|NONE|RAIL|ly ironic requests. fu +16097|200|79|3|40|44008.00|0.02|0.04|N|O|1996-11-11|1996-10-08|1996-11-19|DELIVER IN PERSON|REG AIR|ckly ironic deposits. fu +16097|1310|49|4|39|47241.09|0.07|0.01|N|O|1996-11-20|1996-09-29|1996-11-26|COLLECT COD|TRUCK|eep about the furiously regular +16098|842|42|1|50|87142.00|0.01|0.00|A|F|1992-11-04|1992-10-13|1992-11-14|COLLECT COD|SHIP|structions above the quietl +16098|122|23|2|37|37818.44|0.03|0.06|R|F|1992-09-25|1992-10-11|1992-10-14|DELIVER IN PERSON|REG AIR|s. express accounts sleep courts. bold pint +16098|875|75|3|17|30189.79|0.04|0.02|A|F|1992-09-20|1992-09-05|1992-10-18|TAKE BACK RETURN|MAIL|al requests nag after t +16098|1486|87|4|49|67986.52|0.09|0.08|R|F|1992-10-16|1992-10-12|1992-10-28|NONE|REG AIR|equests sol +16098|1513|14|5|9|12730.59|0.06|0.08|R|F|1992-10-03|1992-10-20|1992-10-10|COLLECT COD|REG AIR|onic asympt +16099|1636|60|1|31|47666.53|0.05|0.00|N|O|1998-04-28|1998-02-26|1998-05-19|NONE|TRUCK|eposits. iron +16099|178|79|2|10|10781.70|0.00|0.06|N|O|1998-02-16|1998-03-30|1998-03-11|DELIVER IN PERSON|FOB|ly dependencies. fluffily iron +16099|151|78|3|46|48352.90|0.02|0.04|N|O|1998-03-07|1998-04-03|1998-03-14|DELIVER IN PERSON|MAIL|. busily unus +16099|1555|36|4|30|43696.50|0.03|0.00|N|O|1998-02-13|1998-03-10|1998-02-25|DELIVER IN PERSON|TRUCK|fluffily pending id +16100|1282|94|1|27|31948.56|0.08|0.00|R|F|1995-03-23|1995-04-20|1995-04-03|NONE|AIR|eposits are deposits. even, +16100|418|19|2|6|7910.46|0.07|0.05|R|F|1995-03-22|1995-05-27|1995-04-20|NONE|FOB|usly unusual sentimen +16100|1413|53|3|25|32860.25|0.03|0.01|R|F|1995-06-11|1995-05-18|1995-06-15|NONE|SHIP| regular ideas solve after the fluf +16100|591|52|4|31|46239.29|0.09|0.00|R|F|1995-05-14|1995-05-02|1995-06-09|COLLECT COD|RAIL|lyly even dolphins. slyly un +16100|1143|44|5|39|40721.46|0.05|0.00|N|O|1995-07-02|1995-06-04|1995-07-14|COLLECT COD|REG AIR|lly regular excuses cajol +16100|1330|7|6|39|48021.87|0.10|0.01|R|F|1995-03-14|1995-05-13|1995-03-19|DELIVER IN PERSON|AIR|ecial deposits wake slyly ab +16100|666|29|7|21|32899.86|0.00|0.07|R|F|1995-04-28|1995-05-20|1995-05-12|DELIVER IN PERSON|MAIL| against t +16101|697|29|1|22|35149.18|0.02|0.07|A|F|1992-10-28|1992-10-11|1992-11-06|DELIVER IN PERSON|AIR| requests breac +16101|420|50|2|14|18485.88|0.10|0.07|R|F|1992-10-23|1992-10-03|1992-11-01|NONE|FOB| dinos after the carefully expres +16102|1099|70|1|39|39003.51|0.05|0.02|A|F|1995-04-03|1995-02-16|1995-04-20|TAKE BACK RETURN|AIR|ites use. fluffily iro +16102|638|1|2|34|52313.42|0.09|0.07|A|F|1995-01-08|1995-03-12|1995-01-13|DELIVER IN PERSON|AIR|refully. blithely ironic request +16103|1718|61|1|26|42112.46|0.10|0.03|R|F|1992-11-07|1992-10-04|1992-12-03|COLLECT COD|AIR|s against the unusual, ironic theodol +16103|1661|44|2|41|64069.06|0.00|0.00|R|F|1992-11-02|1992-09-03|1992-11-20|COLLECT COD|FOB|ular requests affix car +16103|11|12|3|31|28241.31|0.09|0.00|A|F|1992-08-14|1992-10-03|1992-08-26|COLLECT COD|TRUCK|ke carefully ironic +16103|1986|31|4|33|62303.34|0.04|0.01|R|F|1992-09-06|1992-08-30|1992-10-03|NONE|TRUCK| special deposits detect s +16103|993|96|5|47|89017.53|0.05|0.07|A|F|1992-09-24|1992-10-09|1992-10-15|TAKE BACK RETURN|MAIL|ironic excuses. regular, special +16103|1897|41|6|31|55765.59|0.09|0.08|A|F|1992-10-30|1992-09-22|1992-11-15|COLLECT COD|SHIP|its. slyly ironic sentiments alongside of +16103|1703|46|7|24|38512.80|0.09|0.04|A|F|1992-09-23|1992-08-21|1992-10-22|TAKE BACK RETURN|MAIL|fily bold foxes nod about the +16128|1548|49|1|23|33339.42|0.00|0.07|N|F|1995-05-24|1995-07-26|1995-06-18|COLLECT COD|REG AIR| the quickly bold theodolites wake f +16128|905|6|2|1|1805.90|0.02|0.05|N|O|1995-07-25|1995-08-06|1995-08-23|COLLECT COD|FOB|ely ironic depo +16128|1345|84|3|47|58577.98|0.10|0.06|N|O|1995-08-28|1995-08-06|1995-09-20|NONE|REG AIR|o are carefully +16129|39|90|1|40|37561.20|0.05|0.05|N|O|1998-08-21|1998-07-12|1998-09-02|DELIVER IN PERSON|REG AIR| requests against the fluffil +16129|1083|89|2|13|12793.04|0.08|0.08|N|O|1998-09-01|1998-06-30|1998-09-03|COLLECT COD|REG AIR|ely regular f +16130|1340|79|1|6|7448.04|0.00|0.04|N|O|1996-09-08|1996-08-16|1996-10-02|DELIVER IN PERSON|RAIL|lar courts. blithely final deposit +16130|1399|38|2|23|29908.97|0.03|0.03|N|O|1996-07-26|1996-08-21|1996-08-17|NONE|TRUCK|packages. bold deposits kindle bl +16130|427|57|3|44|58406.48|0.04|0.02|N|O|1996-09-02|1996-07-26|1996-09-16|DELIVER IN PERSON|FOB|s above the ironic instructions wake ca +16130|1732|75|4|20|32674.60|0.02|0.01|N|O|1996-07-26|1996-09-10|1996-08-22|COLLECT COD|AIR|xpress, regular instructi +16130|675|76|5|33|51997.11|0.10|0.07|N|O|1996-07-06|1996-08-31|1996-07-21|DELIVER IN PERSON|TRUCK|s requests use fluffily along the +16130|285|86|6|20|23705.60|0.04|0.02|N|O|1996-08-19|1996-08-30|1996-09-05|TAKE BACK RETURN|REG AIR|the slyly special instructions haggle c +16130|1575|16|7|17|25101.69|0.10|0.06|N|O|1996-08-11|1996-08-22|1996-09-01|NONE|MAIL|luffily regular pinto beans sleep quickly b +16131|412|71|1|24|31497.84|0.03|0.08|N|O|1998-03-07|1997-12-17|1998-03-21|NONE|RAIL|ly special deposits. +16131|1925|70|2|25|45673.00|0.10|0.02|N|O|1998-01-04|1998-01-09|1998-01-23|TAKE BACK RETURN|AIR|thely regular excuses. furiously ironic +16131|1055|56|3|4|3824.20|0.01|0.07|N|O|1998-01-27|1998-01-31|1998-02-22|DELIVER IN PERSON|RAIL|nts. regular, ironic packages around +16131|1755|40|4|40|66270.00|0.00|0.05|N|O|1997-12-24|1997-12-18|1998-01-15|COLLECT COD|FOB| wake against the special, regul +16131|1113|86|5|37|37522.07|0.04|0.01|N|O|1998-02-08|1998-01-19|1998-03-02|COLLECT COD|AIR|dencies cajole bold pinto beans. regul +16131|1184|93|6|30|32555.40|0.04|0.04|N|O|1998-01-28|1998-01-28|1998-02-24|DELIVER IN PERSON|REG AIR|requests. silent reque +16131|1972|5|7|17|31857.49|0.05|0.01|N|O|1998-01-22|1998-02-11|1998-01-27|TAKE BACK RETURN|SHIP|gainst the carefully dogged depos +16132|628|22|1|18|27515.16|0.01|0.05|A|F|1993-02-22|1992-12-10|1993-03-11|COLLECT COD|MAIL| blithely even packages are against +16132|663|57|2|28|43782.48|0.09|0.07|A|F|1992-11-16|1993-01-03|1992-11-21|DELIVER IN PERSON|FOB|final packages. final accounts boost qui +16133|667|61|1|15|23514.90|0.10|0.02|R|F|1995-01-05|1994-12-22|1995-01-22|DELIVER IN PERSON|RAIL|tes haggle b +16133|1014|15|2|29|26535.29|0.09|0.00|A|F|1995-01-15|1994-11-22|1995-01-23|COLLECT COD|MAIL|ggle carefully. express, regular somas boo +16133|1609|33|3|17|25680.20|0.03|0.07|A|F|1994-12-21|1994-12-01|1995-01-05|COLLECT COD|MAIL|express instructions: carefully +16133|1714|15|4|16|25851.36|0.00|0.06|R|F|1994-11-06|1994-12-16|1994-11-07|DELIVER IN PERSON|SHIP|l, even accounts. ironic +16133|1038|74|5|29|27231.87|0.07|0.00|R|F|1995-01-21|1994-12-14|1995-02-13|NONE|MAIL|s deposits. carefully unusual +16133|136|63|6|19|19686.47|0.09|0.07|A|F|1994-11-23|1994-12-13|1994-12-15|COLLECT COD|AIR|refully unusual deposits. ca +16134|1045|81|1|1|946.04|0.10|0.01|A|F|1993-01-08|1993-01-30|1993-01-19|COLLECT COD|MAIL|ular, express grouches. slyly +16134|1782|83|2|5|8418.90|0.05|0.00|A|F|1993-02-12|1993-01-29|1993-02-20|DELIVER IN PERSON|FOB|ress dolphins boost +16134|1335|50|3|4|4945.32|0.03|0.07|R|F|1993-01-27|1992-12-20|1993-02-13|TAKE BACK RETURN|SHIP|arefully regular +16134|1957|90|4|48|89229.60|0.10|0.08|R|F|1992-12-21|1993-01-15|1992-12-28|TAKE BACK RETURN|TRUCK|ic requests against the deposits cajo +16134|1515|96|5|32|45328.32|0.01|0.08|A|F|1993-03-19|1993-01-20|1993-04-04|TAKE BACK RETURN|RAIL|uests sleep alongside of the ev +16134|1795|22|6|31|52600.49|0.06|0.01|A|F|1992-12-22|1993-02-02|1993-01-08|DELIVER IN PERSON|SHIP|r, even excuses. slyly close ac +16134|1127|64|7|25|25703.00|0.04|0.08|R|F|1993-01-12|1993-02-03|1993-01-19|TAKE BACK RETURN|SHIP|gular foxes. furiousl +16135|1|52|1|40|36040.00|0.01|0.07|A|F|1993-06-12|1993-06-28|1993-06-19|NONE|RAIL|arefully regular packages haggle c +16160|1686|69|1|43|68270.24|0.03|0.03|N|O|1995-07-29|1995-08-30|1995-08-02|DELIVER IN PERSON|REG AIR|encies boost quickly alongside of th +16161|609|41|1|34|51326.40|0.05|0.01|A|F|1992-08-10|1992-09-06|1992-08-14|DELIVER IN PERSON|AIR|ar theodol +16161|618|12|2|5|7593.05|0.04|0.02|A|F|1992-10-11|1992-10-21|1992-10-12|NONE|RAIL|e regular, expre +16161|318|3|3|8|9746.48|0.05|0.07|A|F|1992-09-23|1992-09-04|1992-10-10|DELIVER IN PERSON|SHIP|al excuses nag quickly abou +16161|527|88|4|33|47108.16|0.05|0.06|R|F|1992-10-08|1992-10-13|1992-10-21|TAKE BACK RETURN|FOB|ide of the carefully regular instr +16161|239|21|5|25|28480.75|0.03|0.05|A|F|1992-10-18|1992-09-08|1992-11-16|DELIVER IN PERSON|RAIL|ding accounts hin +16161|1112|49|6|23|23301.53|0.04|0.08|R|F|1992-09-03|1992-09-06|1992-09-21|NONE|RAIL|equests. slyly ironi +16161|1809|53|7|13|22240.40|0.01|0.03|R|F|1992-08-27|1992-09-11|1992-09-01|NONE|AIR|uses. thin, even theodolites haggle sl +16162|1975|8|1|48|90094.56|0.00|0.08|A|F|1993-08-22|1993-08-17|1993-08-23|NONE|FOB|ully final foxe +16162|1031|2|2|32|29824.96|0.06|0.02|A|F|1993-06-21|1993-07-08|1993-07-06|COLLECT COD|SHIP|packages among the furiously regular instru +16163|1191|100|1|40|43687.60|0.03|0.07|N|O|1997-09-04|1997-07-24|1997-10-04|COLLECT COD|SHIP|, daring accounts. slyly special +16163|1402|81|2|29|37798.60|0.05|0.07|N|O|1997-09-21|1997-07-09|1997-10-05|TAKE BACK RETURN|RAIL|luffily final +16163|905|8|3|2|3611.80|0.01|0.03|N|O|1997-05-28|1997-08-08|1997-06-27|COLLECT COD|SHIP|tes. final foxes use quickly. +16163|586|77|4|4|5946.32|0.04|0.07|N|O|1997-07-24|1997-08-18|1997-08-20|TAKE BACK RETURN|SHIP|lar waters are furiously bold d +16164|800|33|1|25|42520.00|0.10|0.05|A|F|1992-03-01|1992-03-26|1992-03-15|COLLECT COD|TRUCK|jole regular accounts. furiously quiet t +16164|1676|18|2|16|25242.72|0.08|0.05|A|F|1992-01-22|1992-04-01|1992-02-12|NONE|REG AIR|packages print +16164|631|63|3|39|59733.57|0.07|0.08|R|F|1992-01-13|1992-03-29|1992-01-24|TAKE BACK RETURN|RAIL|ves. ironic, ironic id +16164|1701|28|4|4|6410.80|0.09|0.07|A|F|1992-03-06|1992-03-09|1992-03-11|DELIVER IN PERSON|TRUCK|ully ironic theodolites haggle above +16165|909|44|1|40|72396.00|0.06|0.03|R|F|1993-09-21|1993-10-17|1993-09-26|NONE|TRUCK|ncies. unusual, final +16165|163|16|2|26|27642.16|0.08|0.02|R|F|1993-10-15|1993-09-03|1993-11-08|NONE|MAIL|al requests nag furiously. slyly +16165|1676|18|3|2|3155.34|0.01|0.03|R|F|1993-09-27|1993-09-18|1993-10-03|DELIVER IN PERSON|RAIL|sleep carefully theodolites +16165|303|4|4|18|21659.40|0.03|0.03|R|F|1993-11-14|1993-10-03|1993-11-29|DELIVER IN PERSON|FOB|l accounts. carefully pen +16166|116|43|1|13|13209.43|0.09|0.04|A|F|1993-02-17|1993-03-05|1993-02-25|NONE|MAIL|ter the blithely sil +16166|1253|28|2|43|49632.75|0.00|0.00|A|F|1993-06-01|1993-03-19|1993-06-04|NONE|REG AIR|ts. furiously express deposits a +16167|361|18|1|12|15136.32|0.09|0.00|N|O|1998-02-17|1998-01-11|1998-03-12|COLLECT COD|MAIL|ing pinto beans. re +16167|1201|76|2|33|36372.60|0.04|0.08|N|O|1998-02-21|1998-02-12|1998-03-23|DELIVER IN PERSON|AIR|use. furiously darin +16167|717|82|3|15|24265.65|0.03|0.07|N|O|1998-03-15|1998-01-07|1998-03-24|TAKE BACK RETURN|TRUCK|s. furiously reg +16167|1236|11|4|36|40940.28|0.08|0.02|N|O|1998-02-18|1998-01-08|1998-03-19|DELIVER IN PERSON|RAIL|onic, regula +16167|1797|24|5|16|27180.64|0.09|0.01|N|O|1997-12-13|1998-02-01|1998-01-06|DELIVER IN PERSON|MAIL|t the slyly bold packages. slyly s +16167|152|5|6|17|17886.55|0.01|0.01|N|O|1997-12-13|1998-02-12|1997-12-25|NONE|AIR|eposits nag furious +16192|150|51|1|30|31504.50|0.04|0.04|N|O|1997-08-15|1997-08-07|1997-09-02|DELIVER IN PERSON|TRUCK|. even asy +16192|281|9|2|43|50795.04|0.01|0.03|N|O|1997-10-01|1997-08-28|1997-10-31|TAKE BACK RETURN|REG AIR|kages. furiously bold pack +16192|1612|36|3|24|36326.64|0.10|0.08|N|O|1997-08-14|1997-09-27|1997-09-10|COLLECT COD|MAIL|er the unusual, regular +16192|992|93|4|36|68147.64|0.04|0.03|N|O|1997-10-02|1997-09-21|1997-10-14|NONE|REG AIR|ntegrate after the courts. careful +16192|1935|68|5|31|56944.83|0.03|0.07|N|O|1997-07-05|1997-09-11|1997-07-26|DELIVER IN PERSON|SHIP| the packages wake furio +16193|63|64|1|38|36596.28|0.02|0.01|R|F|1992-05-29|1992-05-18|1992-06-21|TAKE BACK RETURN|SHIP|he carefully ironic asymptotes ha +16193|1006|77|2|40|36280.00|0.10|0.01|R|F|1992-08-06|1992-06-11|1992-08-21|NONE|SHIP|ent instructions boost slyly final +16193|803|70|3|43|73263.40|0.06|0.07|A|F|1992-07-28|1992-05-11|1992-08-07|NONE|RAIL|etect carefully deposi +16193|721|54|4|50|81086.00|0.09|0.04|A|F|1992-05-18|1992-07-07|1992-06-09|COLLECT COD|MAIL|egular instructions. fluffily bold req +16194|816|50|1|5|8584.05|0.09|0.05|R|F|1993-12-07|1993-12-13|1993-12-20|COLLECT COD|AIR|c packages according to t +16194|1171|44|2|1|1072.17|0.05|0.05|R|F|1993-10-29|1993-12-25|1993-11-07|TAKE BACK RETURN|REG AIR| excuses. ironic, +16194|191|92|3|5|5455.95|0.05|0.07|A|F|1993-11-04|1993-11-11|1993-12-03|TAKE BACK RETURN|AIR|permanently ironic dolphins. +16194|1514|15|4|46|65113.46|0.05|0.03|R|F|1993-12-28|1993-12-22|1994-01-07|DELIVER IN PERSON|FOB|ithely. bl +16194|932|1|5|24|43990.32|0.10|0.06|R|F|1993-11-01|1993-12-21|1993-11-25|NONE|TRUCK|nic packages haggle furi +16194|1422|23|6|41|54260.22|0.01|0.03|A|F|1994-02-05|1993-11-12|1994-02-27|TAKE BACK RETURN|TRUCK| wake unusual deposits: +16195|534|65|1|9|12910.77|0.10|0.08|A|F|1992-06-13|1992-08-05|1992-07-12|NONE|MAIL|ronic accounts. e +16195|692|55|2|28|44595.32|0.03|0.06|R|F|1992-09-05|1992-07-13|1992-09-16|NONE|FOB| to the ironically even pack +16196|704|1|1|16|25675.20|0.08|0.08|R|F|1994-11-10|1994-11-24|1994-11-19|TAKE BACK RETURN|MAIL| carefully bold instructions-- furiously ru +16196|766|31|2|17|28334.92|0.07|0.01|R|F|1994-11-13|1994-12-10|1994-12-09|TAKE BACK RETURN|AIR|posits doze thinly regul +16196|1304|81|3|26|31337.80|0.08|0.03|A|F|1995-01-23|1994-12-08|1995-02-09|COLLECT COD|AIR| somas. furiously even frets +16196|1412|30|4|12|15760.92|0.05|0.06|A|F|1994-11-29|1994-12-12|1994-12-14|COLLECT COD|AIR| nag across the blithe theo +16196|141|20|5|31|32275.34|0.07|0.01|R|F|1994-11-11|1994-12-04|1994-11-19|COLLECT COD|TRUCK|counts. furiously ironic request +16197|1183|84|1|8|8673.44|0.07|0.06|A|F|1993-01-03|1993-01-13|1993-01-12|NONE|AIR|theodolites nag furiou +16197|137|16|2|45|46670.85|0.00|0.02|A|F|1992-12-04|1993-01-02|1992-12-22|TAKE BACK RETURN|TRUCK|dependencies. slyly b +16197|16|67|3|44|40304.44|0.00|0.05|R|F|1992-11-03|1992-11-29|1992-11-20|TAKE BACK RETURN|FOB| above the dolphins us +16197|1218|93|4|11|12311.31|0.09|0.01|R|F|1992-12-15|1992-12-02|1992-12-20|COLLECT COD|SHIP|furiously fina +16197|1430|70|5|47|62577.21|0.03|0.03|A|F|1993-02-06|1992-12-18|1993-03-01|TAKE BACK RETURN|SHIP|e furiously about +16198|154|7|1|32|33732.80|0.02|0.07|N|O|1998-08-24|1998-09-06|1998-09-18|TAKE BACK RETURN|RAIL|ide of the furi +16198|1|27|2|33|29733.00|0.00|0.01|N|O|1998-10-07|1998-09-18|1998-10-15|DELIVER IN PERSON|RAIL|ust maintain doggedly special deposi +16199|622|85|1|45|68517.90|0.04|0.08|N|O|1996-12-02|1996-10-07|1996-12-14|COLLECT COD|REG AIR| carefully. bold accounts bo +16199|304|89|2|27|32516.10|0.00|0.04|N|O|1996-09-29|1996-10-14|1996-10-13|TAKE BACK RETURN|RAIL|ly bold instructions detect +16199|41|42|3|34|31995.36|0.04|0.05|N|O|1996-12-26|1996-10-24|1997-01-22|COLLECT COD|MAIL| deposits wake. dogge +16199|1171|80|4|33|35381.61|0.07|0.06|N|O|1996-10-16|1996-10-26|1996-10-18|DELIVER IN PERSON|REG AIR|. even accounts +16199|1889|90|5|50|89544.00|0.09|0.02|N|O|1996-10-25|1996-11-09|1996-11-18|TAKE BACK RETURN|MAIL|l multipliers above the furiously pendi +16199|19|20|6|41|37679.41|0.06|0.04|N|O|1996-10-21|1996-11-16|1996-11-15|DELIVER IN PERSON|REG AIR|ites sleep slyly along the final +16224|1004|75|1|10|9050.00|0.02|0.06|N|O|1997-10-25|1997-11-14|1997-11-05|DELIVER IN PERSON|FOB|equests haggle carefull +16224|430|18|2|30|39912.90|0.04|0.03|N|O|1997-12-25|1997-12-01|1998-01-13|TAKE BACK RETURN|RAIL|posits. blit +16224|1783|10|3|5|8423.90|0.01|0.00|N|O|1998-01-17|1997-11-08|1998-02-05|COLLECT COD|TRUCK| regularly silent foxes +16224|536|27|4|41|58897.73|0.04|0.00|N|O|1997-12-22|1997-10-24|1997-12-27|TAKE BACK RETURN|MAIL|e furiously regula +16224|78|79|5|36|35210.52|0.02|0.03|N|O|1997-12-31|1997-11-01|1998-01-06|NONE|AIR|nic packages. fluffil +16225|61|12|1|36|34598.16|0.02|0.07|A|F|1994-09-13|1994-07-11|1994-09-29|COLLECT COD|TRUCK|s packages wake furiously carefu +16225|1801|88|2|13|22136.40|0.06|0.05|A|F|1994-06-25|1994-08-01|1994-07-07|DELIVER IN PERSON|REG AIR|yly unusual accounts nag blithely a +16225|206|88|3|14|15486.80|0.06|0.04|A|F|1994-06-23|1994-08-17|1994-06-30|NONE|TRUCK|haggle furiously. carefully even esc +16226|450|80|1|41|55368.45|0.06|0.06|N|O|1997-02-01|1997-03-02|1997-02-06|COLLECT COD|TRUCK|unts sleep. attainments wake pend +16227|938|73|1|37|68040.41|0.09|0.01|R|F|1994-10-24|1994-10-29|1994-11-04|COLLECT COD|MAIL|ular accounts. carefully regular +16228|1315|16|1|13|15812.03|0.07|0.03|N|O|1997-12-19|1997-12-10|1998-01-18|TAKE BACK RETURN|FOB|ges wake bli +16228|1077|48|2|44|43035.08|0.09|0.07|N|O|1997-11-26|1998-01-06|1997-12-26|TAKE BACK RETURN|REG AIR|sts against th +16228|199|78|3|34|37372.46|0.01|0.00|N|O|1998-01-26|1998-01-02|1998-02-12|DELIVER IN PERSON|MAIL|side of the regular, regula +16228|1829|73|4|35|60578.70|0.01|0.00|N|O|1997-12-12|1997-12-22|1997-12-15|NONE|TRUCK|ites cajole alongside of the e +16229|214|42|1|33|36768.93|0.10|0.04|A|F|1994-04-26|1994-05-03|1994-05-07|TAKE BACK RETURN|TRUCK|usly pending platelets. b +16229|1946|91|2|20|36958.80|0.06|0.08|A|F|1994-05-25|1994-06-24|1994-06-18|NONE|AIR|blithely about t +16229|1475|54|3|15|20647.05|0.05|0.07|A|F|1994-05-01|1994-06-13|1994-05-14|DELIVER IN PERSON|RAIL|ronic, pending +16229|1049|55|4|6|5700.24|0.01|0.02|A|F|1994-05-02|1994-05-01|1994-05-11|NONE|MAIL|l dolphins. ironi +16229|938|39|5|23|42295.39|0.01|0.06|R|F|1994-07-09|1994-05-13|1994-07-13|NONE|REG AIR| furiously daring accounts after the +16229|1466|84|6|22|30084.12|0.00|0.04|R|F|1994-04-25|1994-05-07|1994-05-23|TAKE BACK RETURN|SHIP|haggle blithely. slyly +16229|1874|4|7|20|35517.40|0.01|0.07|R|F|1994-04-18|1994-06-22|1994-05-13|NONE|SHIP|nic, even packages ha +16230|676|39|1|31|48876.77|0.08|0.00|A|F|1993-04-08|1993-04-30|1993-04-27|TAKE BACK RETURN|FOB|theodolites wake regularly final packages +16230|535|96|2|21|30146.13|0.05|0.01|R|F|1993-04-28|1993-05-14|1993-05-13|DELIVER IN PERSON|REG AIR|ackages: blithely ironic +16230|1707|8|3|31|49869.70|0.09|0.08|A|F|1993-04-07|1993-05-24|1993-04-23|COLLECT COD|FOB|c pinto beans haggl +16230|1745|30|4|26|42815.24|0.08|0.02|R|F|1993-03-27|1993-05-18|1993-04-23|NONE|REG AIR|hins are. bold deposits haggle. furiou +16230|1460|39|5|30|40843.80|0.10|0.07|A|F|1993-05-21|1993-04-16|1993-05-29|NONE|AIR|ly pending req +16230|782|47|6|40|67311.20|0.10|0.03|R|F|1993-05-06|1993-04-12|1993-06-04|DELIVER IN PERSON|RAIL|ic dependenci +16230|655|18|7|17|26446.05|0.07|0.04|R|F|1993-05-12|1993-05-01|1993-05-25|COLLECT COD|SHIP|osits. boldly regular packages slee +16231|432|20|1|20|26648.60|0.05|0.00|A|F|1992-09-25|1992-11-27|1992-09-30|NONE|SHIP|uffily. bli +16231|923|92|2|50|91196.00|0.00|0.03|A|F|1992-10-06|1992-10-26|1992-10-19|DELIVER IN PERSON|MAIL|s according +16231|311|68|3|48|58142.88|0.02|0.04|R|F|1992-12-10|1992-11-17|1992-12-22|COLLECT COD|REG AIR| ironic, regular accou +16231|1352|53|4|37|46373.95|0.02|0.07|A|F|1992-11-17|1992-10-07|1992-11-27|COLLECT COD|FOB|ending depos +16256|1092|98|1|50|49654.50|0.10|0.07|N|O|1997-10-20|1997-11-07|1997-11-16|TAKE BACK RETURN|REG AIR|nal frays-- deposits at the quic +16256|1850|94|2|23|40292.55|0.07|0.08|N|O|1997-12-02|1997-11-24|1997-12-10|NONE|REG AIR|ly final platelets +16256|1121|58|3|37|37818.44|0.01|0.02|N|O|1997-10-25|1997-12-11|1997-11-10|NONE|MAIL| blithely even requests cajol +16257|1144|17|1|9|9406.26|0.00|0.05|A|F|1992-05-19|1992-06-29|1992-05-24|NONE|REG AIR|uriously blithely final pinto bea +16257|1517|58|2|23|32625.73|0.06|0.07|A|F|1992-06-13|1992-07-23|1992-07-08|COLLECT COD|TRUCK|ests cajole among the thin requests: b +16257|1734|61|3|48|78515.04|0.09|0.06|A|F|1992-08-27|1992-06-22|1992-09-08|DELIVER IN PERSON|TRUCK| final theodoli +16258|1442|60|1|2|2686.88|0.08|0.04|N|O|1995-09-11|1995-09-15|1995-10-02|TAKE BACK RETURN|FOB|arls boost slyly. slyl +16258|1448|88|2|5|6747.20|0.06|0.08|N|O|1995-10-10|1995-09-16|1995-10-11|COLLECT COD|SHIP|osits haggle busily. u +16258|1721|64|3|43|69776.96|0.04|0.06|N|O|1995-09-06|1995-09-08|1995-09-24|DELIVER IN PERSON|RAIL| slyly among the slyly ironic +16259|832|32|1|28|48519.24|0.01|0.03|N|O|1996-07-13|1996-08-28|1996-08-06|TAKE BACK RETURN|SHIP|ies sleep quickly beside +16259|159|12|2|35|37070.25|0.01|0.04|N|O|1996-08-06|1996-09-15|1996-08-23|COLLECT COD|SHIP|y final deposits lo +16259|172|25|3|49|52536.33|0.02|0.05|N|O|1996-08-01|1996-09-01|1996-08-30|NONE|FOB|. regular packages sleep blithely across +16259|478|79|4|10|13784.70|0.02|0.03|N|O|1996-08-16|1996-08-18|1996-09-10|NONE|FOB|h! bold accounts above the quic +16260|1414|93|1|41|53931.81|0.07|0.00|N|O|1996-02-21|1996-02-11|1996-02-28|COLLECT COD|AIR|ide of the ideas. regular id +16261|1704|47|1|44|70650.80|0.01|0.00|A|F|1994-01-11|1993-12-06|1994-02-08|NONE|FOB|ctions integrate furiously across +16261|1008|14|2|40|36360.00|0.07|0.06|R|F|1993-11-04|1993-11-09|1993-11-26|NONE|RAIL|s cajole. ac +16261|871|72|3|2|3543.74|0.07|0.01|A|F|1993-10-09|1993-11-17|1993-10-16|TAKE BACK RETURN|REG AIR| deposits. accounts near the regular packa +16261|1528|9|4|34|48603.68|0.02|0.08|A|F|1993-12-04|1993-12-15|1993-12-28|DELIVER IN PERSON|MAIL|ep carefully +16261|797|98|5|8|13582.32|0.06|0.02|R|F|1993-12-24|1993-12-15|1993-12-31|TAKE BACK RETURN|SHIP|he express, express foxes-- accounts aff +16262|674|75|1|22|34642.74|0.06|0.07|R|F|1995-04-02|1995-02-16|1995-04-06|TAKE BACK RETURN|AIR|ual packag +16262|1921|66|2|42|76562.64|0.00|0.08|R|F|1995-03-11|1995-03-16|1995-04-06|COLLECT COD|MAIL| ironic accounts nod. +16262|42|93|3|39|36739.56|0.04|0.03|R|F|1995-02-27|1995-02-26|1995-03-16|NONE|RAIL|foxes x-ray carefully regular dolphins. b +16262|1184|85|4|44|47747.92|0.01|0.04|A|F|1995-03-30|1995-02-11|1995-04-16|TAKE BACK RETURN|TRUCK|sits haggle furiously +16262|1605|29|5|9|13559.40|0.09|0.07|A|F|1995-03-30|1995-02-25|1995-04-08|DELIVER IN PERSON|SHIP|sts. excuses +16262|1655|56|6|47|73162.55|0.06|0.03|R|F|1995-01-09|1995-03-31|1995-01-23|TAKE BACK RETURN|SHIP|osits. slyly bold requests after the +16262|946|81|7|22|40632.68|0.03|0.04|R|F|1995-02-23|1995-02-06|1995-02-28|DELIVER IN PERSON|MAIL|posits. quietly ironic accounts wake. c +16263|1517|18|1|6|8511.06|0.06|0.05|N|O|1998-02-06|1997-12-29|1998-02-07|NONE|TRUCK|ross the slyly silent frets detect care +16263|1467|68|2|48|65686.08|0.03|0.04|N|O|1998-01-02|1998-01-03|1998-01-31|NONE|MAIL|sleep quickly quickly b +16263|986|55|3|31|58496.38|0.10|0.06|N|O|1998-01-23|1997-12-21|1998-02-02|NONE|RAIL|ess packages are sheaves. quickly un +16263|1803|4|4|14|23867.20|0.10|0.06|N|O|1997-12-17|1998-01-27|1997-12-25|COLLECT COD|REG AIR|ld foxes sleep furiously final deposits. +16263|1986|87|5|23|43423.54|0.00|0.07|N|O|1997-11-13|1997-12-18|1997-11-28|TAKE BACK RETURN|TRUCK| final, regular theodolites along +16263|1055|91|6|7|6692.35|0.00|0.07|N|O|1998-01-19|1998-02-03|1998-02-03|NONE|REG AIR|riously. special, reg +16288|1075|46|1|29|28306.03|0.01|0.01|N|O|1996-05-06|1996-04-28|1996-05-09|TAKE BACK RETURN|RAIL|, special instructions nag quick +16288|621|53|2|46|69994.52|0.10|0.02|N|O|1996-03-28|1996-05-22|1996-04-26|TAKE BACK RETURN|FOB|out the qu +16288|188|67|3|26|28292.68|0.05|0.05|N|O|1996-04-18|1996-05-17|1996-05-11|TAKE BACK RETURN|TRUCK|oxes haggle blithely fluffily express +16288|492|93|4|25|34812.25|0.04|0.02|N|O|1996-05-20|1996-04-03|1996-05-24|DELIVER IN PERSON|AIR|ges sleep. ironic, ironic packa +16288|87|13|5|11|10857.88|0.02|0.02|N|O|1996-06-10|1996-04-09|1996-06-27|COLLECT COD|AIR|uctions run furiously; slyly +16289|1173|82|1|17|18260.89|0.10|0.03|A|F|1993-10-14|1993-08-21|1993-11-05|COLLECT COD|RAIL|unusual requests unwind across t +16289|1562|43|2|42|61469.52|0.06|0.03|R|F|1993-09-02|1993-09-03|1993-09-27|COLLECT COD|FOB| accounts. packages sl +16289|418|19|3|36|47462.76|0.08|0.08|R|F|1993-08-26|1993-10-06|1993-09-22|COLLECT COD|FOB|usual requests. deposits +16289|1512|93|4|15|21202.65|0.02|0.00|A|F|1993-09-23|1993-09-22|1993-09-27|COLLECT COD|TRUCK|arefully silent packages sublate c +16289|455|43|5|27|36597.15|0.04|0.00|R|F|1993-10-28|1993-08-21|1993-11-09|COLLECT COD|SHIP|detect quickly bold requests. furi +16289|1794|37|6|31|52569.49|0.01|0.06|A|F|1993-08-20|1993-09-30|1993-08-21|DELIVER IN PERSON|MAIL|. slyly unusual requests sle +16289|368|97|7|3|3805.08|0.01|0.06|A|F|1993-08-24|1993-08-30|1993-09-17|NONE|RAIL|s cajole quietly. blithely +16290|1450|68|1|26|35137.70|0.05|0.05|N|O|1996-11-21|1996-11-01|1996-12-01|DELIVER IN PERSON|MAIL|omise furiousl +16290|157|10|2|48|50743.20|0.04|0.04|N|O|1996-11-02|1996-12-01|1996-11-20|DELIVER IN PERSON|RAIL|r packages. foxes s +16290|762|59|3|2|3325.52|0.07|0.03|N|O|1996-10-19|1996-10-26|1996-10-21|NONE|TRUCK|ged requests caj +16290|69|95|4|43|41669.58|0.05|0.04|N|O|1996-11-12|1996-11-08|1996-12-12|COLLECT COD|RAIL|gular ideas. furiously +16291|1085|86|1|14|13805.12|0.02|0.01|R|F|1995-05-10|1995-05-23|1995-05-12|DELIVER IN PERSON|FOB| final ideas wake against th +16291|821|55|2|22|37880.04|0.04|0.06|N|O|1995-08-05|1995-05-21|1995-08-30|DELIVER IN PERSON|AIR|aggle-- deposi +16292|882|16|1|42|74880.96|0.02|0.05|N|O|1998-03-15|1998-01-02|1998-04-07|DELIVER IN PERSON|RAIL|sly final accounts. special, qui +16292|1153|54|2|36|37949.40|0.00|0.02|N|O|1998-02-03|1998-01-25|1998-02-23|TAKE BACK RETURN|TRUCK|ent foxes. quickly unusual instructio +16292|269|24|3|47|54955.22|0.00|0.06|N|O|1998-01-19|1998-02-05|1998-01-22|DELIVER IN PERSON|FOB|efully blithely iro +16292|429|30|4|33|43870.86|0.00|0.03|N|O|1998-01-28|1997-12-27|1998-02-05|DELIVER IN PERSON|REG AIR|y final accounts sleep. slyly ir +16292|1624|25|5|49|74755.38|0.01|0.01|N|O|1998-01-23|1998-01-16|1998-01-29|DELIVER IN PERSON|FOB|carefully above the +16292|569|70|6|41|60251.96|0.09|0.02|N|O|1997-12-11|1997-12-30|1998-01-09|TAKE BACK RETURN|MAIL| wake furiously final acc +16293|179|32|1|37|39929.29|0.03|0.06|N|O|1997-10-19|1997-10-10|1997-10-29|DELIVER IN PERSON|TRUCK|mptotes sleep slyly bol +16293|669|63|2|17|26684.22|0.09|0.05|N|O|1997-10-11|1997-11-15|1997-11-08|DELIVER IN PERSON|AIR| asymptotes haggle furiously according to +16293|1870|71|3|26|46068.62|0.03|0.05|N|O|1997-10-01|1997-10-09|1997-10-22|DELIVER IN PERSON|TRUCK|. express, express deposits pl +16293|635|29|4|9|13820.67|0.10|0.01|N|O|1997-12-12|1997-11-04|1997-12-19|DELIVER IN PERSON|TRUCK|lar accounts. carefully ironic packages +16293|345|46|5|6|7472.04|0.07|0.02|N|O|1997-12-20|1997-10-11|1997-12-23|COLLECT COD|MAIL|ld, special deposit +16293|175|76|6|37|39781.29|0.01|0.03|N|O|1997-11-04|1997-11-15|1997-11-15|NONE|AIR|al, regular pl +16294|783|48|1|30|50513.40|0.04|0.01|N|O|1996-12-25|1997-02-24|1996-12-28|COLLECT COD|MAIL|y regular asymptotes cajole bravely +16294|511|72|2|28|39522.28|0.03|0.07|N|O|1997-01-04|1997-02-14|1997-02-02|DELIVER IN PERSON|FOB| blithely quickly final theodolites. quic +16294|1864|8|3|29|51209.94|0.10|0.03|N|O|1996-12-30|1997-01-20|1997-01-27|COLLECT COD|RAIL|ickly about the final, final +16294|616|79|4|14|21232.54|0.05|0.05|N|O|1996-12-26|1997-02-21|1997-01-12|COLLECT COD|RAIL|ickly. care +16294|1083|89|5|3|2952.24|0.04|0.07|N|O|1997-03-08|1997-03-18|1997-03-28|COLLECT COD|AIR| sleep blithely to the slow pi +16294|610|42|6|46|69488.06|0.01|0.07|N|O|1997-03-03|1997-03-17|1997-03-17|DELIVER IN PERSON|MAIL|l accounts could +16295|161|40|1|21|22284.36|0.07|0.01|R|F|1993-02-10|1993-01-11|1993-02-19|DELIVER IN PERSON|REG AIR|ing deposits haggle blithel +16320|1593|14|1|19|28397.21|0.07|0.05|N|O|1995-11-27|1995-11-22|1995-12-08|DELIVER IN PERSON|TRUCK|the blithely silen +16320|1954|55|2|12|22271.40|0.04|0.02|N|O|1995-11-04|1995-12-31|1995-11-08|COLLECT COD|SHIP|ously bold instructio +16320|122|1|3|13|13287.56|0.08|0.08|N|O|1995-10-22|1996-01-07|1995-11-01|COLLECT COD|MAIL|bold deposits boost carefully quickly +16320|1198|71|4|4|4396.76|0.08|0.00|N|O|1995-11-29|1995-11-22|1995-12-18|DELIVER IN PERSON|FOB|affix regular re +16320|1937|70|5|31|57006.83|0.00|0.07|N|O|1995-11-28|1996-01-02|1995-12-20|TAKE BACK RETURN|REG AIR| packages boost about the sp +16321|513|14|1|8|11308.08|0.02|0.05|A|F|1994-10-20|1994-11-27|1994-11-04|COLLECT COD|SHIP|jole furiou +16321|1002|73|2|30|27090.00|0.01|0.05|R|F|1994-12-16|1994-12-13|1995-01-08|TAKE BACK RETURN|REG AIR|es integrate ironically car +16322|1931|32|1|8|14663.44|0.07|0.08|R|F|1995-03-22|1995-03-18|1995-04-02|DELIVER IN PERSON|RAIL|. slyly exp +16322|985|20|2|42|79211.16|0.00|0.08|A|F|1995-03-24|1995-02-10|1995-04-01|TAKE BACK RETURN|TRUCK|ructions about the unusual requ +16322|928|31|3|10|18289.20|0.02|0.05|R|F|1995-03-04|1995-02-22|1995-03-30|DELIVER IN PERSON|RAIL|slyly regular realms use above the sly +16323|1261|62|1|50|58113.00|0.07|0.06|N|O|1996-10-07|1996-09-03|1996-10-26|NONE|MAIL|s among the blithely regular packag +16323|946|15|2|48|88653.12|0.07|0.04|N|O|1996-09-08|1996-10-09|1996-10-04|NONE|REG AIR|dogged requests across the fluffily regul +16323|1040|11|3|36|33877.44|0.03|0.03|N|O|1996-10-18|1996-09-27|1996-11-01|TAKE BACK RETURN|AIR|nent packages are furiou +16323|1552|33|4|46|66863.30|0.01|0.01|N|O|1996-11-13|1996-10-13|1996-11-20|DELIVER IN PERSON|SHIP|ar deposits cajole +16324|323|80|1|4|4893.28|0.00|0.07|N|O|1998-03-05|1998-04-04|1998-03-30|NONE|FOB|ructions at the quickly +16324|518|9|2|34|48229.34|0.01|0.02|N|O|1998-06-03|1998-04-07|1998-06-11|COLLECT COD|MAIL| theodolites hang alongside of t +16324|653|85|3|27|41948.55|0.03|0.03|N|O|1998-04-30|1998-05-11|1998-05-26|TAKE BACK RETURN|TRUCK| even asymptotes! even, regular theodo +16325|1941|74|1|6|11057.64|0.00|0.06|N|O|1997-11-07|1997-10-11|1997-11-28|NONE|REG AIR| the expre +16326|1508|29|1|27|38056.50|0.01|0.00|R|F|1993-07-26|1993-07-23|1993-08-25|TAKE BACK RETURN|FOB|requests nag accordin +16326|502|33|2|25|35062.50|0.10|0.05|A|F|1993-05-27|1993-08-08|1993-06-26|DELIVER IN PERSON|FOB|accounts will wake. s +16326|1716|1|3|30|48531.30|0.08|0.01|R|F|1993-05-24|1993-06-25|1993-06-01|DELIVER IN PERSON|FOB| special ideas. enticing deposits of +16326|683|15|4|43|68098.24|0.00|0.05|A|F|1993-08-11|1993-06-17|1993-09-01|TAKE BACK RETURN|REG AIR|press asymptotes. carefully +16326|675|7|5|41|64602.47|0.08|0.04|R|F|1993-06-16|1993-07-12|1993-07-10|TAKE BACK RETURN|FOB| haggle slyly unusual, express cou +16326|968|3|6|40|74758.40|0.01|0.00|R|F|1993-06-21|1993-06-13|1993-07-19|TAKE BACK RETURN|MAIL|around the ironic, +16327|1264|39|1|38|44279.88|0.00|0.04|R|F|1994-02-12|1994-03-09|1994-03-09|TAKE BACK RETURN|RAIL|ly final decoys wake slyly. quickly pending +16352|846|80|1|32|55898.88|0.08|0.01|R|F|1992-08-24|1992-09-07|1992-09-17|NONE|AIR|slyly even pinto beans. t +16352|507|68|2|11|15482.50|0.07|0.06|R|F|1992-08-03|1992-09-29|1992-08-17|NONE|RAIL|symptotes? bold, even +16352|1234|9|3|37|42003.51|0.05|0.02|R|F|1992-10-28|1992-09-17|1992-10-29|TAKE BACK RETURN|TRUCK|uriously even deposits haggle +16352|239|21|4|12|13670.76|0.00|0.06|R|F|1992-08-04|1992-10-24|1992-09-02|DELIVER IN PERSON|REG AIR|ptotes boost +16352|101|54|5|38|38041.80|0.09|0.04|R|F|1992-10-05|1992-09-06|1992-10-09|NONE|REG AIR|g regular th +16352|1929|62|6|13|23801.96|0.06|0.03|A|F|1992-09-07|1992-10-19|1992-09-21|TAKE BACK RETURN|SHIP|en instructions c +16353|795|60|1|15|25436.85|0.01|0.02|N|O|1997-07-28|1997-06-21|1997-08-04|NONE|RAIL|he blithely final dependencies. carefully +16353|328|85|2|8|9826.56|0.00|0.05|N|O|1997-04-13|1997-05-15|1997-05-01|COLLECT COD|MAIL|ven courts. even packages h +16353|176|77|3|37|39818.29|0.10|0.03|N|O|1997-07-14|1997-06-08|1997-08-07|NONE|RAIL|ly. slyly express dependencies believe blit +16353|419|78|4|21|27707.61|0.00|0.03|N|O|1997-05-20|1997-06-08|1997-06-07|DELIVER IN PERSON|RAIL|kly even ideas engag +16353|1843|30|5|29|50600.36|0.08|0.06|N|O|1997-05-17|1997-06-11|1997-05-21|NONE|REG AIR|riously at the q +16354|1360|99|1|7|8829.52|0.07|0.06|N|O|1997-11-10|1997-10-02|1997-11-23|NONE|MAIL|its cajole carefully requests. r +16354|765|62|2|16|26652.16|0.05|0.03|N|O|1997-09-12|1997-11-16|1997-10-10|TAKE BACK RETURN|RAIL|. furiously furious escapades are. unusual, +16354|1039|10|3|18|16920.54|0.02|0.07|N|O|1997-09-05|1997-10-12|1997-09-10|DELIVER IN PERSON|FOB|ly accounts. slyly regula +16354|572|3|4|21|30923.97|0.07|0.04|N|O|1997-11-18|1997-10-28|1997-11-25|DELIVER IN PERSON|TRUCK|ajole. alw +16354|1198|99|5|22|24182.18|0.07|0.05|N|O|1997-10-07|1997-10-12|1997-11-04|NONE|MAIL|to beans cajole quickly! requests are car +16355|306|7|1|38|45839.40|0.07|0.05|N|O|1998-08-10|1998-05-17|1998-09-02|DELIVER IN PERSON|REG AIR|jole slyly ironic theodolites; ideas s +16355|1575|16|2|21|31007.97|0.03|0.03|N|O|1998-05-20|1998-05-24|1998-06-07|TAKE BACK RETURN|REG AIR|r platelets are above the express +16355|767|68|3|31|51700.56|0.09|0.04|N|O|1998-07-08|1998-05-14|1998-08-01|NONE|SHIP|s are slyly along the +16355|514|15|4|18|25461.18|0.05|0.01|N|O|1998-07-18|1998-07-02|1998-07-26|TAKE BACK RETURN|AIR|s grow quickly blithely fina +16355|146|99|5|37|38707.18|0.08|0.08|N|O|1998-07-24|1998-07-02|1998-08-10|NONE|AIR|onic orbits. ironic excuses +16355|1471|72|6|41|56271.27|0.07|0.03|N|O|1998-05-11|1998-07-08|1998-05-20|DELIVER IN PERSON|AIR| accounts. carefully bold instructions +16355|345|30|7|37|46077.58|0.07|0.01|N|O|1998-07-06|1998-06-13|1998-08-05|DELIVER IN PERSON|RAIL| ironic packages sleep furiously furiou +16356|1453|71|1|43|58241.35|0.00|0.08|N|O|1995-08-08|1995-10-28|1995-08-10|TAKE BACK RETURN|TRUCK|furiously regul +16356|1200|73|2|38|41845.60|0.05|0.05|N|O|1995-09-09|1995-09-09|1995-09-14|NONE|REG AIR|ges are furiously. slyly special reques +16356|1972|73|3|23|43101.31|0.07|0.00|N|O|1995-10-17|1995-09-14|1995-11-08|COLLECT COD|AIR|the slyly final deposits. sile +16356|968|71|4|33|61675.68|0.05|0.00|N|O|1995-10-04|1995-09-29|1995-10-11|COLLECT COD|SHIP|venly special packages. furiously expres +16356|725|22|5|6|9754.32|0.10|0.00|N|O|1995-09-28|1995-10-10|1995-10-16|NONE|FOB|ake blithely +16356|579|40|6|30|44387.10|0.10|0.02|N|O|1995-08-29|1995-09-21|1995-09-16|NONE|RAIL|y. slyly bold waters sleep. furiously pe +16356|1570|71|7|13|19130.41|0.01|0.03|N|O|1995-10-31|1995-10-14|1995-11-19|DELIVER IN PERSON|RAIL| fluffily unusual accounts boos +16357|1283|84|1|45|53292.60|0.02|0.01|A|F|1993-03-21|1993-03-03|1993-04-02|TAKE BACK RETURN|SHIP| to the special, fi +16358|1572|93|1|30|44207.10|0.03|0.07|R|F|1994-02-20|1994-02-17|1994-02-22|NONE|AIR|ourts! regular theod +16358|436|37|2|9|12027.87|0.03|0.01|R|F|1994-02-15|1994-02-08|1994-02-21|TAKE BACK RETURN|RAIL|dly across the pinto beans? e +16358|1620|62|3|2|3043.24|0.08|0.07|A|F|1994-01-06|1994-02-07|1994-01-24|DELIVER IN PERSON|RAIL|eposits han +16359|1562|63|1|17|24880.52|0.05|0.01|R|F|1992-09-05|1992-08-04|1992-09-21|COLLECT COD|FOB|al packages. ironi +16359|1758|85|2|10|16597.50|0.07|0.06|A|F|1992-08-15|1992-07-13|1992-09-05|COLLECT COD|TRUCK|long the bold, bold packages. furiously +16359|268|96|3|38|44393.88|0.07|0.03|A|F|1992-05-17|1992-07-31|1992-06-13|TAKE BACK RETURN|AIR|nic instructions boost carefully +16359|415|16|4|42|55247.22|0.05|0.08|A|F|1992-07-13|1992-07-17|1992-07-17|TAKE BACK RETURN|REG AIR|usy foxes atop t +16359|1471|11|5|43|59016.21|0.01|0.08|A|F|1992-07-25|1992-08-06|1992-08-20|NONE|AIR|accounts are f +16384|462|92|1|14|19074.44|0.00|0.02|N|O|1997-09-27|1997-11-05|1997-10-02|DELIVER IN PERSON|MAIL|ly even requests wake furiously acco +16385|138|17|1|26|26991.38|0.04|0.01|A|F|1994-07-11|1994-07-28|1994-07-21|TAKE BACK RETURN|SHIP|olphins. furiously re +16386|1232|33|1|2|2266.46|0.00|0.01|N|O|1997-01-13|1997-02-09|1997-01-28|TAKE BACK RETURN|RAIL| excuses. blithely final t +16386|232|60|2|3|3396.69|0.10|0.01|N|O|1997-02-03|1997-02-24|1997-02-17|DELIVER IN PERSON|SHIP|after the express accounts cajole +16386|310|95|3|17|20575.27|0.01|0.01|N|O|1997-01-28|1997-03-10|1997-01-31|NONE|REG AIR|refully abov +16386|880|81|4|3|5342.64|0.08|0.04|N|O|1997-01-26|1997-03-10|1997-02-24|COLLECT COD|TRUCK|ccounts cajole blithely car +16386|1932|33|5|20|36678.60|0.01|0.04|N|O|1997-03-20|1997-03-12|1997-03-26|NONE|REG AIR|sts wake carefully above the ironic +16386|1927|72|6|40|73156.80|0.00|0.00|N|O|1996-12-29|1997-01-23|1997-01-22|NONE|SHIP|s sleep quickly carefully ironic dolphins +16386|1181|82|7|22|23807.96|0.03|0.07|N|O|1997-03-24|1997-01-22|1997-04-16|DELIVER IN PERSON|MAIL|ial, even foxes wak +16387|1890|77|1|39|69883.71|0.05|0.07|N|O|1998-04-07|1998-05-20|1998-04-20|DELIVER IN PERSON|MAIL|boost carefully unusual ideas. blithely un +16387|1511|92|2|1|1412.51|0.05|0.04|N|O|1998-04-20|1998-06-05|1998-05-06|DELIVER IN PERSON|REG AIR|uctions. quickly final pinto beans p +16388|67|18|1|49|47385.94|0.02|0.04|N|O|1995-07-31|1995-10-09|1995-08-06|NONE|AIR|. stealthily final accounts wake furiously +16388|336|21|2|12|14835.96|0.07|0.01|N|O|1995-07-30|1995-10-02|1995-08-08|NONE|AIR| the furiously daring instru +16389|131|32|1|33|34027.29|0.02|0.00|N|O|1996-04-28|1996-07-05|1996-05-03|TAKE BACK RETURN|AIR|posits doubt quickl +16389|1192|1|2|46|50286.74|0.08|0.04|N|O|1996-07-13|1996-05-27|1996-08-06|DELIVER IN PERSON|AIR|ly pending deposits sle +16389|613|45|3|18|27244.98|0.04|0.00|N|O|1996-05-01|1996-06-25|1996-05-23|TAKE BACK RETURN|TRUCK|ages nag. regular, even wat +16390|1781|24|1|10|16827.80|0.10|0.00|R|F|1992-06-11|1992-05-30|1992-06-20|NONE|TRUCK|e quickly according to the carefu +16391|186|87|1|20|21723.60|0.05|0.04|N|O|1997-04-12|1997-03-24|1997-04-25|TAKE BACK RETURN|TRUCK|after the unusual requests en +16391|37|88|2|36|33733.08|0.06|0.06|N|O|1997-02-12|1997-03-02|1997-02-15|NONE|MAIL|. furiously final packages cajole fluff +16391|1935|36|3|32|58781.76|0.00|0.04|N|O|1997-02-05|1997-03-24|1997-02-16|DELIVER IN PERSON|FOB|ar deposits. carefully regul +16391|1572|93|4|14|20629.98|0.01|0.05|N|O|1997-02-27|1997-04-02|1997-03-06|NONE|RAIL|ar accounts. blithely i +16391|1489|7|5|36|50057.28|0.08|0.04|N|O|1997-02-17|1997-04-08|1997-02-27|DELIVER IN PERSON|TRUCK|boost blithe +16391|1417|35|6|46|60646.86|0.01|0.03|N|O|1997-03-17|1997-04-07|1997-04-09|COLLECT COD|RAIL|l, regular in +16416|295|50|1|41|49006.89|0.10|0.02|N|O|1995-10-29|1995-11-07|1995-11-25|DELIVER IN PERSON|TRUCK|egular, reg +16417|1840|84|1|30|52255.20|0.03|0.02|N|O|1997-03-18|1997-05-01|1997-03-26|DELIVER IN PERSON|MAIL|the ironic courts. bold a +16417|1548|69|2|33|47834.82|0.00|0.06|N|O|1997-05-06|1997-05-31|1997-06-03|COLLECT COD|MAIL|es. blithe +16417|470|71|3|40|54818.80|0.07|0.04|N|O|1997-04-21|1997-05-08|1997-05-08|NONE|AIR|ld near the slyly bold foxes. ironi +16417|903|4|4|26|46901.40|0.08|0.04|N|O|1997-05-18|1997-05-12|1997-06-17|NONE|TRUCK|c accounts. blithely +16418|419|7|1|29|38262.89|0.00|0.07|N|O|1996-04-10|1996-05-11|1996-04-15|NONE|TRUCK|packages bo +16418|962|63|2|1|1862.96|0.10|0.03|N|O|1996-04-16|1996-04-23|1996-04-20|TAKE BACK RETURN|REG AIR|carefully along the stealthy packages. f +16418|27|53|3|46|42642.92|0.02|0.06|N|O|1996-05-24|1996-05-03|1996-06-19|COLLECT COD|SHIP|ing to the daringly final accounts +16418|1219|57|4|45|50409.45|0.09|0.05|N|O|1996-05-02|1996-04-15|1996-05-11|NONE|AIR|! blithely expres +16419|5|6|1|30|27150.00|0.09|0.03|A|F|1994-11-17|1994-10-19|1994-12-17|COLLECT COD|FOB|e bold, ironic accounts. platelets u +16419|1762|89|2|2|3327.52|0.03|0.03|A|F|1994-10-30|1994-10-14|1994-11-28|COLLECT COD|FOB|bold excuses. regular deposits wake +16419|1726|53|3|12|19532.64|0.04|0.08|A|F|1994-08-24|1994-10-03|1994-08-29|COLLECT COD|RAIL|p final deposits. quickly unusual depo +16420|23|74|1|11|10153.22|0.09|0.07|N|O|1996-07-02|1996-05-11|1996-07-08|DELIVER IN PERSON|REG AIR|s boost. pending, regular instructions +16420|1607|90|2|42|63361.20|0.10|0.07|N|O|1996-06-30|1996-07-01|1996-07-07|DELIVER IN PERSON|RAIL|le slyly according to the blithely +16420|467|68|3|19|25981.74|0.04|0.07|N|O|1996-05-12|1996-05-26|1996-05-25|TAKE BACK RETURN|TRUCK|r dependencies are +16420|384|85|4|14|17981.32|0.06|0.04|N|O|1996-05-19|1996-05-19|1996-06-13|COLLECT COD|REG AIR|odolites. requests accord +16420|1054|90|5|47|44887.35|0.09|0.02|N|O|1996-05-10|1996-06-28|1996-05-11|DELIVER IN PERSON|RAIL| cajole. silently ironic excuses doubt. +16421|950|53|1|35|64783.25|0.03|0.02|N|O|1998-09-14|1998-08-04|1998-09-16|DELIVER IN PERSON|MAIL|ar pinto beans use a +16422|1945|90|1|47|86806.18|0.03|0.03|N|O|1995-12-09|1995-11-15|1995-12-14|COLLECT COD|SHIP|usly silent packages. bol +16422|1044|80|2|44|41581.76|0.04|0.01|N|O|1995-12-10|1995-11-09|1996-01-09|TAKE BACK RETURN|MAIL|ly regular deposits cajole. requests sle +16422|1859|60|3|27|47542.95|0.04|0.02|N|O|1995-12-10|1995-12-05|1995-12-25|COLLECT COD|REG AIR|xes wake fluffily. slyly even theodolites +16422|1322|99|4|25|30583.00|0.09|0.05|N|O|1995-11-29|1995-11-22|1995-12-07|COLLECT COD|TRUCK| special sent +16422|1812|13|5|26|44559.06|0.08|0.00|N|O|1995-11-01|1995-11-23|1995-11-30|TAKE BACK RETURN|REG AIR| theodolites. slyly special requests de +16423|267|49|1|15|17508.90|0.05|0.05|A|F|1992-09-04|1992-09-12|1992-09-10|TAKE BACK RETURN|AIR|fluffily regular id +16423|1103|40|2|25|25102.50|0.05|0.03|A|F|1992-11-20|1992-10-30|1992-12-04|TAKE BACK RETURN|FOB|nts cajole slyly among the express, +16423|1862|92|3|1|1763.86|0.10|0.08|R|F|1992-09-17|1992-10-01|1992-09-22|DELIVER IN PERSON|REG AIR|e fluffily. instructions +16423|502|3|4|45|63112.50|0.04|0.02|R|F|1992-09-21|1992-09-26|1992-10-02|COLLECT COD|FOB|ng, regular asymptotes use ruthless, s +16448|552|13|1|16|23240.80|0.05|0.07|R|F|1992-08-17|1992-07-17|1992-08-26|TAKE BACK RETURN|MAIL|ar requests haggl +16448|1994|83|2|40|75839.60|0.03|0.07|A|F|1992-06-23|1992-07-26|1992-07-02|NONE|RAIL|final requests are furiously carefull +16448|558|89|3|20|29171.00|0.06|0.07|R|F|1992-08-22|1992-07-05|1992-08-25|COLLECT COD|RAIL|. carefully regular pac +16449|269|51|1|31|36247.06|0.02|0.06|A|F|1994-01-07|1994-01-15|1994-02-03|NONE|REG AIR|sides the regular pinto beans use +16449|1126|27|2|10|10271.20|0.01|0.06|A|F|1994-03-07|1994-01-16|1994-03-25|COLLECT COD|AIR|posits above the de +16449|849|50|3|45|78742.80|0.00|0.03|A|F|1994-03-03|1993-12-28|1994-03-19|DELIVER IN PERSON|AIR|ly bold asymptotes. +16449|1896|83|4|26|46745.14|0.08|0.07|A|F|1994-01-08|1994-01-06|1994-01-15|NONE|RAIL|ogged instructions. regular Tiresias caj +16450|838|72|1|29|50426.07|0.07|0.05|N|O|1995-06-27|1995-06-21|1995-06-28|COLLECT COD|SHIP|along the regular requests +16450|1001|37|2|29|26158.00|0.04|0.07|N|O|1995-08-11|1995-07-16|1995-09-02|COLLECT COD|TRUCK|sts detect along the furiously unusual de +16450|1206|44|3|16|17715.20|0.07|0.00|N|O|1995-09-06|1995-07-09|1995-09-11|NONE|MAIL|nticing th +16450|741|74|4|50|82087.00|0.02|0.07|N|O|1995-07-06|1995-08-14|1995-07-25|TAKE BACK RETURN|RAIL|ular dolphins integrate. regular +16450|1864|94|5|5|8829.30|0.08|0.04|N|O|1995-08-25|1995-07-08|1995-09-14|COLLECT COD|TRUCK|lly final re +16450|1141|42|6|5|5210.70|0.04|0.07|N|O|1995-08-01|1995-06-16|1995-08-27|DELIVER IN PERSON|MAIL|ular pinto beans wake alongside of the unu +16451|659|91|1|3|4678.95|0.07|0.04|A|F|1994-07-24|1994-09-20|1994-08-06|DELIVER IN PERSON|FOB|ular, regular requests are slyly bold, re +16451|1790|17|2|5|8458.95|0.01|0.08|R|F|1994-07-26|1994-09-20|1994-08-20|COLLECT COD|AIR|uctions nag above the furiously sly +16451|450|9|3|33|44564.85|0.06|0.05|A|F|1994-08-03|1994-08-27|1994-09-02|NONE|MAIL|hely slow dependencies. eve +16451|1000|1|4|48|43248.00|0.04|0.06|R|F|1994-07-26|1994-10-05|1994-08-17|DELIVER IN PERSON|AIR|d the deposits are evenly at the unusual, +16451|317|74|5|34|41388.54|0.04|0.04|R|F|1994-09-27|1994-09-17|1994-10-06|NONE|REG AIR|refully carefull +16452|1412|91|1|18|23641.38|0.01|0.01|A|F|1992-08-25|1992-11-18|1992-09-02|TAKE BACK RETURN|RAIL|as. slyly ironic instructions cajo +16452|1181|54|2|50|54109.00|0.09|0.03|A|F|1992-09-22|1992-10-22|1992-10-11|DELIVER IN PERSON|SHIP|t alongside of t +16452|198|77|3|23|25258.37|0.03|0.08|A|F|1992-12-08|1992-10-08|1992-12-11|TAKE BACK RETURN|REG AIR|er the furiously pending ex +16452|1757|100|4|22|36492.50|0.05|0.05|A|F|1992-10-13|1992-10-20|1992-10-22|NONE|RAIL| Tiresias across the bold re +16452|1496|75|5|1|1397.49|0.06|0.00|R|F|1992-12-04|1992-10-03|1992-12-22|TAKE BACK RETURN|TRUCK|s along the furiously regular pinto beans h +16453|76|2|1|33|32210.31|0.07|0.06|A|F|1993-12-24|1993-12-23|1993-12-29|NONE|FOB|its. fluff +16453|1861|62|2|45|79328.70|0.02|0.06|A|F|1993-12-19|1994-01-29|1994-01-15|COLLECT COD|REG AIR|s. slyly stealthy accounts +16453|1102|39|3|28|28086.80|0.08|0.00|A|F|1994-02-27|1994-01-16|1994-03-09|COLLECT COD|RAIL|s haggle slyly alongside of the ideas. q +16453|1314|91|4|34|41320.54|0.08|0.00|A|F|1994-01-14|1993-12-26|1994-02-10|DELIVER IN PERSON|TRUCK| slyly pending instructi +16453|604|67|5|40|60184.00|0.06|0.01|R|F|1994-01-10|1994-02-14|1994-02-09|DELIVER IN PERSON|RAIL|excuses sleep beneath the fluffily special +16453|1446|86|6|25|33686.00|0.03|0.07|A|F|1993-12-28|1994-02-10|1994-01-12|TAKE BACK RETURN|AIR|alongside of the +16453|1413|31|7|37|48633.17|0.03|0.04|A|F|1994-01-13|1994-01-03|1994-01-27|NONE|TRUCK| foxes. quickly special deposits above t +16454|726|59|1|25|40668.00|0.07|0.04|A|F|1992-05-20|1992-07-30|1992-05-31|DELIVER IN PERSON|FOB|es. final, pending accounts wak +16454|1885|72|2|14|25016.32|0.09|0.03|A|F|1992-08-28|1992-07-26|1992-09-20|TAKE BACK RETURN|MAIL|accounts boost; c +16454|529|30|3|32|45744.64|0.07|0.01|R|F|1992-05-28|1992-06-24|1992-06-04|COLLECT COD|SHIP|ular theodolites across the even packag +16454|726|59|4|47|76455.84|0.01|0.06|A|F|1992-06-04|1992-07-28|1992-06-15|COLLECT COD|AIR|to beans nag slyly carefully +16454|1044|50|5|11|10395.44|0.01|0.00|R|F|1992-08-22|1992-08-07|1992-09-08|TAKE BACK RETURN|FOB|ns wake bold excuses! busily dogg +16454|1181|54|6|45|48698.10|0.05|0.03|A|F|1992-07-24|1992-06-17|1992-08-07|DELIVER IN PERSON|FOB|l instructions use. realms mold blithel +16455|938|41|1|42|77235.06|0.10|0.04|A|F|1992-03-25|1992-05-26|1992-03-31|COLLECT COD|SHIP|l foxes. furiously final deposit +16480|588|19|1|47|69963.26|0.10|0.04|A|F|1995-02-02|1995-01-08|1995-03-01|COLLECT COD|FOB| packages detect slyly among the blithely r +16480|357|42|2|24|30176.40|0.02|0.06|A|F|1994-12-27|1995-03-03|1995-01-08|NONE|AIR|ently after +16480|163|90|3|14|14884.24|0.01|0.08|R|F|1995-01-10|1995-02-28|1995-01-22|COLLECT COD|MAIL|s should have to k +16480|1863|93|4|32|56475.52|0.02|0.06|R|F|1995-02-23|1995-01-26|1995-02-28|COLLECT COD|AIR|us excuses +16480|1987|76|5|2|3777.96|0.00|0.05|A|F|1995-01-22|1995-02-02|1995-02-05|COLLECT COD|FOB|cuses haggle. +16480|1766|51|6|40|66710.40|0.06|0.07|A|F|1994-12-15|1995-02-22|1994-12-20|COLLECT COD|AIR|c, pending accounts use slyly iro +16480|176|3|7|47|50579.99|0.09|0.04|R|F|1995-03-21|1995-01-30|1995-04-11|DELIVER IN PERSON|TRUCK|blithely at the pending sentiments. sp +16481|100|26|1|6|6000.60|0.09|0.06|R|F|1995-05-14|1995-04-02|1995-06-09|TAKE BACK RETURN|FOB|lar instructions; dolphins haggle slyly +16481|680|43|2|44|69549.92|0.04|0.08|A|F|1995-06-05|1995-03-28|1995-06-06|DELIVER IN PERSON|REG AIR| ironic packa +16482|1038|44|1|28|26292.84|0.07|0.01|R|F|1992-07-28|1992-06-16|1992-08-12|NONE|TRUCK|tructions. regul +16483|1921|66|1|19|34635.48|0.00|0.03|N|O|1997-02-18|1996-12-12|1997-03-08|DELIVER IN PERSON|TRUCK|eep fluffily +16483|734|35|2|20|32694.60|0.01|0.07|N|O|1997-02-04|1997-01-29|1997-03-03|TAKE BACK RETURN|RAIL|above the slyly even deposits. re +16484|883|17|1|27|48164.76|0.00|0.04|N|O|1995-06-29|1995-06-02|1995-07-05|NONE|MAIL|ss dugouts ca +16485|793|58|1|30|50813.70|0.04|0.03|N|O|1996-11-24|1996-11-25|1996-11-30|DELIVER IN PERSON|SHIP|its maintain. f +16485|1836|37|2|34|59086.22|0.03|0.03|N|O|1996-09-16|1996-11-08|1996-09-18|DELIVER IN PERSON|REG AIR|lphins use furiously regular, special +16485|488|18|3|9|12496.32|0.05|0.03|N|O|1996-10-26|1996-11-19|1996-11-22|NONE|TRUCK|y. bold instructions cajole accord +16486|164|65|1|42|44694.72|0.02|0.07|A|F|1992-07-16|1992-08-16|1992-08-06|DELIVER IN PERSON|REG AIR|ilent attainments sleep abou +16487|543|34|1|32|46193.28|0.07|0.05|N|O|1997-03-02|1997-02-19|1997-03-15|NONE|SHIP| the furiously unusual packages are furio +16487|1594|35|2|27|40380.93|0.01|0.00|N|O|1997-01-28|1997-01-22|1997-02-07|TAKE BACK RETURN|RAIL|ily ironic packages. accounts use furiousl +16487|1936|81|3|12|22055.16|0.07|0.00|N|O|1997-02-05|1997-01-11|1997-02-13|TAKE BACK RETURN|AIR|the ironic dolphins. blithely regular fr +16487|108|9|4|50|50405.00|0.06|0.04|N|O|1996-12-29|1997-01-23|1997-01-23|TAKE BACK RETURN|REG AIR|r asymptotes haggle furiously after the sp +16512|1978|67|1|26|48879.22|0.00|0.04|R|F|1993-06-21|1993-06-13|1993-07-18|DELIVER IN PERSON|REG AIR|c requests. slyly reg +16512|973|76|2|1|1873.97|0.05|0.01|R|F|1993-06-11|1993-06-23|1993-06-26|COLLECT COD|FOB|tes was bold packages. +16512|664|96|3|1|1564.66|0.00|0.05|R|F|1993-08-15|1993-05-25|1993-08-26|DELIVER IN PERSON|REG AIR| sleep bli +16513|1228|40|1|31|35005.82|0.00|0.07|R|F|1993-10-24|1993-11-20|1993-11-09|DELIVER IN PERSON|RAIL|ffily iron +16513|1210|85|2|30|33336.30|0.08|0.00|R|F|1993-12-22|1993-11-26|1994-01-10|COLLECT COD|FOB|inal accounts along the e +16513|1786|29|3|18|30380.04|0.08|0.01|A|F|1993-12-19|1993-10-21|1994-01-18|DELIVER IN PERSON|AIR|packages. blithe +16514|164|91|1|30|31924.80|0.08|0.01|N|O|1997-06-10|1997-07-03|1997-06-24|DELIVER IN PERSON|SHIP| haggle slyly at the furiou +16514|774|7|2|22|36844.94|0.10|0.05|N|O|1997-07-29|1997-06-17|1997-08-03|TAKE BACK RETURN|MAIL|s cajole furiously e +16514|1606|48|3|47|70857.20|0.07|0.01|N|O|1997-06-30|1997-08-05|1997-07-16|NONE|REG AIR|dolphins are care +16514|1679|80|4|18|28452.06|0.06|0.03|N|O|1997-05-10|1997-07-24|1997-05-15|COLLECT COD|MAIL|y above the slyly regula +16514|1077|78|5|37|36188.59|0.05|0.02|N|O|1997-07-01|1997-07-14|1997-07-17|TAKE BACK RETURN|FOB| beans. bold i +16515|233|61|1|44|49862.12|0.04|0.03|N|O|1996-02-24|1996-02-29|1996-03-24|NONE|MAIL|nos about the ironic decoys +16515|483|13|2|35|48421.80|0.06|0.04|N|O|1996-04-03|1996-02-29|1996-04-16|DELIVER IN PERSON|TRUCK|iously silent foxes. furi +16515|45|21|3|26|24571.04|0.09|0.03|N|O|1996-03-01|1996-03-23|1996-03-23|NONE|REG AIR|ly regular excuses. slyly eve +16515|832|32|4|45|77977.35|0.08|0.03|N|O|1996-04-02|1996-03-21|1996-04-10|COLLECT COD|FOB|ironic packa +16515|730|31|5|33|53814.09|0.00|0.08|N|O|1996-04-29|1996-03-06|1996-05-18|COLLECT COD|SHIP|fully even pinto beans kindle fluffily fina +16516|1645|69|1|44|68052.16|0.09|0.07|N|O|1998-01-12|1997-12-06|1998-01-13|NONE|MAIL|counts detect +16516|57|33|2|39|37324.95|0.01|0.05|N|O|1997-12-28|1998-01-31|1998-01-11|COLLECT COD|SHIP|hely final requests. quickly final accoun +16516|569|30|3|37|54373.72|0.03|0.05|N|O|1998-02-24|1997-12-07|1998-03-17|DELIVER IN PERSON|AIR|gular ideas are +16517|332|61|1|29|35737.57|0.05|0.08|R|F|1995-01-24|1994-11-26|1995-01-30|DELIVER IN PERSON|SHIP|ular excuses play carefully car +16517|311|68|2|26|31494.06|0.00|0.01|A|F|1994-12-19|1994-12-22|1995-01-01|NONE|FOB|s are blithely abov +16518|284|12|1|42|49739.76|0.02|0.03|R|F|1992-12-24|1992-11-03|1993-01-10|NONE|RAIL|thely spec +16518|1314|29|2|46|55904.26|0.08|0.06|R|F|1992-10-28|1992-11-17|1992-11-06|DELIVER IN PERSON|REG AIR|deposits. furiously ex +16519|660|54|1|22|34334.52|0.00|0.03|N|O|1995-09-07|1995-08-14|1995-09-21|COLLECT COD|RAIL|thely even, fluffy deposits! asymptotes +16519|373|74|2|22|28014.14|0.04|0.07|N|O|1995-06-20|1995-09-01|1995-07-06|DELIVER IN PERSON|TRUCK|pendencies. furiously even fox +16519|1863|64|3|50|88243.00|0.05|0.01|N|O|1995-08-20|1995-08-17|1995-09-04|TAKE BACK RETURN|REG AIR|ackages. slyly +16544|1122|95|1|50|51156.00|0.03|0.04|N|O|1998-04-22|1998-04-04|1998-05-06|DELIVER IN PERSON|AIR|ng the carefully express accoun +16544|498|57|2|36|50345.64|0.07|0.06|N|O|1998-03-16|1998-04-28|1998-04-01|NONE|TRUCK|grouches haggle. blithel +16544|18|44|3|19|17442.19|0.10|0.05|N|O|1998-04-07|1998-04-14|1998-05-04|DELIVER IN PERSON|FOB|around the quickly p +16544|1490|8|4|47|65400.03|0.07|0.07|N|O|1998-04-03|1998-05-08|1998-04-07|TAKE BACK RETURN|FOB|around the quickly special theodolites. sl +16544|1832|76|5|23|39878.09|0.04|0.02|N|O|1998-04-10|1998-05-08|1998-04-29|TAKE BACK RETURN|TRUCK|ages. slyly slow dependencies +16544|293|94|6|5|5966.45|0.04|0.07|N|O|1998-03-07|1998-04-01|1998-03-09|COLLECT COD|REG AIR|ly blithely final p +16545|537|98|1|17|24438.01|0.03|0.00|R|F|1993-07-22|1993-06-17|1993-07-30|DELIVER IN PERSON|FOB|equests believe. blithely ironic theodolit +16545|1867|11|2|13|22995.18|0.02|0.00|A|F|1993-07-09|1993-08-01|1993-07-30|COLLECT COD|SHIP|are carefully final deposi +16545|314|15|3|7|8500.17|0.06|0.07|A|F|1993-07-05|1993-07-11|1993-07-30|NONE|TRUCK|the fluffily regular requests. quick +16545|1753|96|4|4|6619.00|0.03|0.04|A|F|1993-08-17|1993-07-10|1993-08-20|COLLECT COD|MAIL|he quickly final instruct +16545|1821|65|5|27|46516.14|0.03|0.07|R|F|1993-08-06|1993-07-11|1993-08-13|TAKE BACK RETURN|AIR| deposits. silent, +16545|1253|54|6|15|17313.75|0.08|0.04|A|F|1993-05-29|1993-06-12|1993-06-13|DELIVER IN PERSON|REG AIR|e carefully pending ideas. slyly final p +16545|437|38|7|35|46810.05|0.09|0.08|R|F|1993-05-20|1993-07-12|1993-06-01|TAKE BACK RETURN|SHIP|e quickly even pinto beans. fluffil +16546|1351|52|1|7|8766.45|0.04|0.04|R|F|1992-09-25|1992-08-21|1992-10-19|NONE|FOB|st fluffily quickly unusual +16547|1510|91|1|33|46579.83|0.08|0.05|R|F|1994-04-14|1994-03-25|1994-04-20|NONE|MAIL|ackages. accounts use. blith +16547|127|6|2|30|30813.60|0.06|0.07|A|F|1994-06-03|1994-04-17|1994-06-27|DELIVER IN PERSON|SHIP|s are carefully. carefully unusua +16547|1930|19|3|40|73277.20|0.02|0.05|A|F|1994-06-17|1994-03-24|1994-07-05|TAKE BACK RETURN|FOB|ual, express excuses +16547|1613|37|4|5|7573.05|0.01|0.04|A|F|1994-05-14|1994-03-29|1994-05-15|DELIVER IN PERSON|AIR|grate furiously alongside of the slyly +16547|1448|27|5|14|18892.16|0.09|0.03|R|F|1994-02-25|1994-04-28|1994-03-16|NONE|SHIP|ites detect quickly re +16547|1437|16|6|41|54875.63|0.05|0.01|A|F|1994-03-04|1994-04-12|1994-03-13|COLLECT COD|FOB|e slyly. express +16547|601|95|7|6|9009.60|0.02|0.00|R|F|1994-02-25|1994-04-18|1994-03-01|TAKE BACK RETURN|AIR|fully bold asymptotes. quickly steal +16548|1635|77|1|36|55318.68|0.04|0.06|R|F|1992-05-17|1992-04-07|1992-06-02|TAKE BACK RETURN|REG AIR|egular pinto beans are f +16548|444|3|2|18|24199.92|0.03|0.08|A|F|1992-04-25|1992-03-13|1992-05-04|TAKE BACK RETURN|TRUCK|p across the stealthily regular pa +16548|1950|39|3|19|35187.05|0.09|0.03|R|F|1992-03-14|1992-03-29|1992-03-15|TAKE BACK RETURN|RAIL|mptotes haggle blith +16548|1503|4|4|31|43539.50|0.06|0.08|A|F|1992-06-05|1992-05-04|1992-07-05|DELIVER IN PERSON|RAIL|ccording to the blithely bold asymptotes. +16549|1845|89|1|15|26202.60|0.07|0.02|N|O|1997-08-27|1997-08-16|1997-09-04|COLLECT COD|REG AIR| furiously about the slyly bold ins +16550|235|36|1|40|45409.20|0.09|0.00|N|O|1996-12-02|1996-09-21|1996-12-18|NONE|REG AIR|the carefully even deposit +16550|80|56|2|40|39203.20|0.08|0.06|N|O|1996-09-16|1996-09-19|1996-09-26|DELIVER IN PERSON|MAIL|ructions after the slyly bol +16550|984|85|3|31|58434.38|0.09|0.05|N|O|1996-09-07|1996-10-28|1996-09-23|COLLECT COD|AIR|foxes. quickly enticing accou +16550|993|94|4|48|90911.52|0.05|0.00|N|O|1996-11-25|1996-10-17|1996-12-12|TAKE BACK RETURN|FOB|slyly bold accounts. realms among the fur +16550|1118|19|5|3|3057.33|0.05|0.02|N|O|1996-10-14|1996-11-05|1996-10-15|TAKE BACK RETURN|FOB|furiously final theodolites b +16550|558|19|6|6|8751.30|0.09|0.08|N|O|1996-11-09|1996-09-16|1996-11-29|DELIVER IN PERSON|MAIL|kly ironic grouches wake slyly even r +16551|947|48|1|45|83157.30|0.05|0.03|A|F|1992-12-24|1993-02-18|1993-01-08|NONE|SHIP|never regular fo +16551|1041|42|2|43|40507.72|0.10|0.07|R|F|1993-03-18|1993-01-04|1993-03-31|TAKE BACK RETURN|AIR|ncies. unusual, final accounts +16551|357|86|3|32|40235.20|0.10|0.02|A|F|1993-01-25|1993-02-16|1993-01-29|TAKE BACK RETURN|TRUCK|egular dependencies +16551|1401|19|4|11|14326.40|0.00|0.05|A|F|1993-03-06|1993-02-17|1993-03-27|DELIVER IN PERSON|MAIL|deas. regular, regular accounts pla +16551|1344|59|5|27|33624.18|0.08|0.08|R|F|1993-01-18|1993-02-03|1993-01-23|NONE|MAIL| regular pinto beans. f +16576|1958|91|1|8|14879.60|0.06|0.02|N|O|1997-01-03|1997-02-04|1997-01-08|COLLECT COD|AIR|s. carefull +16576|234|89|2|44|49906.12|0.04|0.08|N|O|1997-02-28|1997-01-31|1997-03-22|DELIVER IN PERSON|FOB| excuses along the regularly fluffy instruc +16576|416|17|3|27|35543.07|0.08|0.03|N|O|1996-12-08|1996-12-22|1996-12-31|TAKE BACK RETURN|AIR|s ironic courts along +16576|782|15|4|25|42069.50|0.05|0.03|N|O|1996-11-14|1996-12-10|1996-12-13|COLLECT COD|FOB|sits. slyly regular attainments sl +16577|1805|92|1|36|61444.80|0.00|0.07|N|O|1997-05-27|1997-04-15|1997-05-30|NONE|RAIL|o beans wake furio +16577|252|53|2|43|49546.75|0.05|0.03|N|O|1997-04-16|1997-04-14|1997-04-18|NONE|SHIP|s the express accounts nag c +16577|116|17|3|23|23370.53|0.08|0.08|N|O|1997-05-15|1997-03-17|1997-05-31|NONE|RAIL|quests are quickly f +16577|1434|52|4|46|61429.78|0.01|0.07|N|O|1997-05-06|1997-03-24|1997-05-19|NONE|TRUCK|arefully against the final requ +16577|1260|72|5|13|15096.38|0.07|0.02|N|O|1997-03-22|1997-04-11|1997-04-04|TAKE BACK RETURN|AIR|y ironic requests. silent, final deposi +16578|1292|93|1|22|26252.38|0.00|0.07|N|O|1996-01-11|1996-01-14|1996-01-24|DELIVER IN PERSON|FOB|uickly special +16578|161|88|2|19|20162.04|0.05|0.00|N|O|1996-01-27|1996-01-15|1996-02-09|COLLECT COD|TRUCK| slyly quickly regular +16578|300|82|3|46|55213.80|0.05|0.08|N|O|1995-12-27|1995-12-07|1996-01-23|DELIVER IN PERSON|REG AIR|kages. final accounts grow furiou +16578|439|98|4|31|41522.33|0.10|0.02|N|O|1995-11-04|1996-01-15|1995-11-16|NONE|TRUCK|above the blithely dogged r +16578|1586|27|5|4|5950.32|0.07|0.08|N|O|1995-12-29|1995-12-11|1995-12-31|COLLECT COD|AIR|aggle carefully across t +16579|1768|53|1|29|48423.04|0.09|0.03|A|F|1994-01-02|1994-01-12|1994-01-03|DELIVER IN PERSON|REG AIR|rays. regular, unusual the +16579|1181|18|2|13|14068.34|0.07|0.05|R|F|1994-01-25|1994-02-04|1994-02-01|DELIVER IN PERSON|RAIL|n, unusual frays. furiously express inst +16579|1996|85|3|34|64531.66|0.02|0.00|R|F|1994-04-10|1994-02-15|1994-04-20|NONE|RAIL| requests maintain despite the +16580|1006|77|1|11|9977.00|0.04|0.08|R|F|1992-03-10|1992-03-13|1992-04-08|COLLECT COD|AIR|the quickly ironic +16580|1648|72|2|46|71283.44|0.10|0.00|A|F|1992-03-07|1992-04-24|1992-04-03|COLLECT COD|RAIL|pinto beans at the c +16580|904|73|3|36|64976.40|0.10|0.01|A|F|1992-05-08|1992-04-22|1992-05-31|COLLECT COD|FOB|eans wake f +16580|1603|86|4|45|67707.00|0.03|0.07|R|F|1992-04-28|1992-04-16|1992-05-01|TAKE BACK RETURN|FOB|hely ironic ideas inte +16580|1378|17|5|33|42219.21|0.08|0.06|A|F|1992-06-04|1992-04-16|1992-07-03|NONE|REG AIR|s cajole slyly accordi +16580|515|16|6|25|35387.75|0.09|0.08|A|F|1992-04-18|1992-03-15|1992-05-17|COLLECT COD|TRUCK|egular packages acc +16581|939|42|1|7|12879.51|0.02|0.06|N|O|1997-09-26|1997-10-04|1997-10-21|COLLECT COD|MAIL|tly even instructions against the carefull +16581|458|88|2|38|51621.10|0.01|0.06|N|O|1997-09-09|1997-10-01|1997-10-02|DELIVER IN PERSON|AIR|ely ironically close excuses. ideas wake qu +16582|51|77|1|27|25678.35|0.05|0.00|N|O|1995-10-14|1995-11-05|1995-11-06|DELIVER IN PERSON|MAIL|uests impre +16582|1457|75|2|7|9509.15|0.06|0.00|N|O|1996-01-03|1995-11-03|1996-01-22|COLLECT COD|SHIP|lly even platelets. slyly clos +16582|551|12|3|21|30482.55|0.01|0.02|N|O|1995-11-21|1995-12-04|1995-12-14|NONE|FOB|furiously idle deposits besides the even c +16582|922|23|4|29|52864.68|0.09|0.04|N|O|1995-12-02|1995-11-04|1995-12-13|NONE|TRUCK|about the ironic t +16583|127|6|1|4|4108.48|0.09|0.00|N|O|1998-02-08|1997-12-26|1998-02-18|NONE|MAIL|y special foxes cajo +16583|1939|84|2|36|66273.48|0.06|0.00|N|O|1998-01-19|1998-01-23|1998-01-27|NONE|RAIL|asymptotes cajole qu +16583|1832|76|3|16|27741.28|0.04|0.01|N|O|1997-11-26|1997-11-29|1997-12-09|DELIVER IN PERSON|REG AIR|phs. fluffily regular deposits use account +16583|1332|47|4|34|41933.22|0.04|0.08|N|O|1998-01-08|1998-01-26|1998-02-03|DELIVER IN PERSON|TRUCK|lly unusual accounts +16583|1059|65|5|22|21121.10|0.10|0.03|N|O|1998-02-03|1997-12-12|1998-02-05|TAKE BACK RETURN|MAIL|equests haggle fu +16608|1694|95|1|30|47870.70|0.06|0.04|N|O|1996-10-27|1996-11-22|1996-11-12|TAKE BACK RETURN|RAIL|thinly final deposits boost. +16608|879|13|2|31|55175.97|0.10|0.06|N|O|1996-11-15|1996-11-13|1996-11-19|DELIVER IN PERSON|REG AIR|le blithely. furiously final ac +16608|1025|26|3|23|21298.46|0.01|0.06|N|O|1996-11-21|1996-11-12|1996-11-28|NONE|REG AIR|usual requests a +16608|739|36|4|19|31154.87|0.00|0.01|N|O|1996-12-24|1996-12-14|1997-01-01|TAKE BACK RETURN|SHIP|osits detect sl +16608|914|15|5|31|56262.21|0.04|0.03|N|O|1996-11-12|1996-11-15|1996-12-08|COLLECT COD|FOB|ual deposits! carefully final Tiresias serv +16608|672|4|6|39|61334.13|0.05|0.06|N|O|1996-10-03|1996-12-28|1996-10-28|TAKE BACK RETURN|FOB|foxes. dogged asymptotes boost blithely. +16608|1923|68|7|1|1824.92|0.02|0.00|N|O|1996-11-16|1996-12-15|1996-11-25|DELIVER IN PERSON|SHIP|cial, even pinto beans. pending depe +16609|39|65|1|49|46012.47|0.09|0.07|N|O|1997-02-27|1997-01-19|1997-03-20|DELIVER IN PERSON|TRUCK|ross the pending, regular deposit +16609|1837|67|2|15|26082.45|0.03|0.06|N|O|1997-03-29|1997-01-08|1997-04-15|DELIVER IN PERSON|SHIP|instructions. even, regular accounts are +16609|564|95|3|29|42472.24|0.00|0.06|N|O|1997-02-25|1997-02-04|1997-03-21|COLLECT COD|MAIL| unwind ironically. carefully +16609|764|29|4|22|36624.72|0.05|0.01|N|O|1997-02-18|1997-03-07|1997-03-16|NONE|REG AIR| waters int +16609|1599|100|5|4|6002.36|0.04|0.03|N|O|1996-12-25|1997-03-07|1997-01-05|DELIVER IN PERSON|RAIL|ng, pending ideas cajole quickly +16609|393|78|6|6|7760.34|0.01|0.06|N|O|1997-03-01|1997-03-01|1997-03-31|TAKE BACK RETURN|FOB|uriously near the carefully ironic +16610|789|54|1|42|70970.76|0.00|0.05|R|F|1995-01-03|1994-11-11|1995-01-22|TAKE BACK RETURN|MAIL| after the fluffily regula +16610|1787|72|2|6|10132.68|0.03|0.02|A|F|1994-11-17|1994-12-22|1994-11-30|NONE|SHIP|. instructions enga +16610|675|69|3|43|67753.81|0.10|0.06|R|F|1994-11-04|1994-12-27|1994-12-02|NONE|SHIP|ate. special accounts should have to are. s +16610|1869|70|4|28|49584.08|0.02|0.08|A|F|1994-11-19|1994-12-26|1994-12-03|TAKE BACK RETURN|REG AIR| blithely. i +16610|1803|90|5|5|8524.00|0.04|0.04|R|F|1995-01-14|1994-11-18|1995-01-21|TAKE BACK RETURN|TRUCK|refully unusual theodolites. b +16611|258|13|1|50|57912.50|0.04|0.06|N|O|1996-01-21|1996-01-08|1996-02-12|NONE|FOB|ers. furious +16611|766|67|2|10|16667.60|0.10|0.00|N|O|1996-01-18|1996-01-15|1996-02-16|NONE|SHIP|? final theodoli +16611|49|100|3|46|43655.84|0.01|0.08|N|O|1996-01-19|1996-01-06|1996-02-08|TAKE BACK RETURN|REG AIR|ously even wa +16611|28|54|4|19|17632.38|0.06|0.05|N|O|1995-12-18|1996-01-09|1996-01-17|COLLECT COD|SHIP|ven accounts against +16611|1197|6|5|13|14276.47|0.05|0.00|N|O|1996-01-26|1996-01-21|1996-02-03|DELIVER IN PERSON|REG AIR|dolites. carefully car +16611|1909|98|6|42|76057.80|0.03|0.03|N|O|1995-11-16|1996-01-01|1995-12-13|DELIVER IN PERSON|TRUCK|tterns; carefully +16611|1868|55|7|32|56635.52|0.07|0.08|N|O|1995-10-29|1995-12-06|1995-11-20|NONE|TRUCK|atelets. special pinto beans are sl +16612|679|11|1|27|42651.09|0.03|0.07|R|F|1994-03-22|1994-04-23|1994-04-02|TAKE BACK RETURN|TRUCK|slyly ironic accounts will affix +16612|942|11|2|35|64502.90|0.05|0.01|A|F|1994-06-10|1994-04-09|1994-07-02|COLLECT COD|REG AIR|posits-- ironic deposits bo +16612|457|58|3|44|59727.80|0.00|0.08|R|F|1994-04-26|1994-04-16|1994-05-13|DELIVER IN PERSON|TRUCK|ss accounts. s +16612|1074|10|4|35|34127.45|0.08|0.01|R|F|1994-06-14|1994-03-27|1994-06-21|NONE|RAIL|fully pending accounts. +16613|1587|88|1|34|50611.72|0.06|0.02|A|F|1994-01-03|1994-03-21|1994-01-20|DELIVER IN PERSON|RAIL| among the furiously ev +16613|100|1|2|45|45004.50|0.00|0.08|A|F|1994-02-07|1994-03-08|1994-02-20|COLLECT COD|SHIP|ven accounts use caref +16613|1838|25|3|29|50455.07|0.08|0.08|R|F|1994-01-07|1994-03-23|1994-01-29|TAKE BACK RETURN|SHIP|! courts can cajole furiously ide +16613|197|24|4|10|10971.90|0.01|0.08|A|F|1994-01-14|1994-03-11|1994-01-29|NONE|TRUCK|ages haggle blithely whithout the furiou +16613|589|90|5|27|40218.66|0.06|0.03|A|F|1994-03-29|1994-03-10|1994-04-09|TAKE BACK RETURN|SHIP|y regular accounts. blithely re +16613|375|60|6|30|38261.10|0.00|0.02|R|F|1993-12-29|1994-02-07|1993-12-31|DELIVER IN PERSON|AIR|s are furiously carefully even foxes. speci +16614|1403|21|1|35|45654.00|0.02|0.00|N|O|1998-01-06|1997-11-03|1998-02-02|COLLECT COD|SHIP|de of the furiously express +16614|674|68|2|29|45665.43|0.00|0.05|N|O|1997-11-02|1997-10-20|1997-11-18|NONE|FOB|metimes entic +16614|196|75|3|44|48232.36|0.10|0.04|N|O|1997-10-01|1997-11-20|1997-10-25|COLLECT COD|SHIP|ges sleep fluffily bravel +16614|1550|71|4|12|17418.60|0.06|0.03|N|O|1997-10-29|1997-10-19|1997-11-26|NONE|MAIL|its boost carefully around th +16615|1505|46|1|35|49227.50|0.08|0.06|N|O|1997-05-26|1997-05-18|1997-06-23|DELIVER IN PERSON|RAIL|nts cajole fluffily. carefully +16615|1198|7|2|14|15388.66|0.03|0.06|N|O|1997-05-04|1997-05-21|1997-05-13|TAKE BACK RETURN|FOB|s over the pinto be +16615|725|90|3|19|30888.68|0.06|0.03|N|O|1997-04-08|1997-05-08|1997-04-27|NONE|TRUCK|press requests. even accounts about the c +16615|1734|77|4|29|47436.17|0.06|0.04|N|O|1997-04-22|1997-06-09|1997-04-24|COLLECT COD|RAIL|ans among the accounts integ +16640|144|23|1|19|19838.66|0.06|0.01|A|F|1993-10-04|1993-10-08|1993-10-09|TAKE BACK RETURN|AIR|pending accounts +16640|1049|20|2|7|6650.28|0.06|0.04|R|F|1993-11-01|1993-10-25|1993-12-01|NONE|RAIL|refully regular instructio +16640|1705|6|3|39|62661.30|0.04|0.03|A|F|1993-10-07|1993-10-22|1993-11-01|NONE|AIR|ose pinto beans against +16640|1916|17|4|13|23632.83|0.08|0.07|R|F|1993-09-02|1993-10-06|1993-09-17|COLLECT COD|AIR|uctions. car +16640|934|35|5|10|18349.30|0.09|0.01|A|F|1993-10-06|1993-08-28|1993-10-10|NONE|AIR| ideas. quickly bold packages a +16641|845|79|1|39|68087.76|0.05|0.06|A|F|1993-06-30|1993-07-17|1993-07-11|DELIVER IN PERSON|MAIL|uickly alongside of +16641|676|8|2|4|6306.68|0.01|0.00|R|F|1993-05-21|1993-07-21|1993-06-16|TAKE BACK RETURN|TRUCK|ptotes. blithe +16641|1642|84|3|39|60201.96|0.06|0.02|A|F|1993-09-06|1993-08-04|1993-09-10|DELIVER IN PERSON|FOB|zzle quickly alongside of the regular i +16642|194|47|1|11|12036.09|0.10|0.03|N|F|1995-06-05|1995-04-24|1995-06-18|COLLECT COD|TRUCK|the furiously pending packages. +16642|1077|78|2|8|7824.56|0.02|0.01|R|F|1995-04-20|1995-04-07|1995-05-15|DELIVER IN PERSON|AIR|posits. asymptotes nag. brave, unusual +16642|1506|7|3|17|23927.50|0.09|0.06|R|F|1995-05-20|1995-05-16|1995-06-01|COLLECT COD|RAIL|packages play requests. spe +16642|63|39|4|5|4815.30|0.07|0.03|R|F|1995-05-18|1995-06-01|1995-05-29|TAKE BACK RETURN|SHIP|ent packages unwind furiously stealthy d +16643|788|21|1|3|5066.34|0.02|0.05|R|F|1993-05-03|1993-07-04|1993-05-20|TAKE BACK RETURN|FOB|ons. furiously bold d +16643|1145|54|2|44|46030.16|0.10|0.06|A|F|1993-04-27|1993-07-01|1993-05-14|DELIVER IN PERSON|AIR|ress packages wake furiously reg +16643|1198|35|3|47|51661.93|0.05|0.05|R|F|1993-05-17|1993-05-21|1993-06-15|COLLECT COD|REG AIR|use final, final instructions? +16644|610|73|1|5|7553.05|0.07|0.00|N|O|1998-09-24|1998-07-24|1998-10-22|TAKE BACK RETURN|REG AIR|leep above the pinto beans? blithely exp +16644|320|77|2|36|43931.52|0.09|0.08|N|O|1998-09-18|1998-08-14|1998-10-16|DELIVER IN PERSON|MAIL|iously final inst +16644|1641|24|3|46|70961.44|0.09|0.00|N|O|1998-09-21|1998-07-23|1998-09-22|TAKE BACK RETURN|REG AIR|inal, unusual pinto beans wake. special th +16645|1092|28|1|25|24827.25|0.08|0.01|R|F|1994-09-24|1994-11-21|1994-10-09|TAKE BACK RETURN|SHIP|xcuses. furiously even warthogs +16645|1875|19|2|8|14214.96|0.01|0.01|A|F|1994-12-10|1994-11-19|1994-12-15|DELIVER IN PERSON|RAIL|etect above the blithely final packages. b +16646|1876|20|1|47|83559.89|0.09|0.04|N|O|1995-08-29|1995-09-07|1995-09-02|NONE|FOB|sual pinto +16646|1760|45|2|40|66470.40|0.06|0.07|N|O|1995-12-06|1995-10-10|1995-12-30|COLLECT COD|REG AIR|ly. quickly unusual +16646|1168|41|3|24|25659.84|0.00|0.04|N|O|1995-08-15|1995-10-17|1995-08-18|TAKE BACK RETURN|RAIL|nusual deposits nag q +16646|956|91|4|16|29711.20|0.09|0.07|N|O|1995-10-05|1995-10-21|1995-10-28|COLLECT COD|MAIL| along the fina +16647|657|58|1|41|63863.65|0.00|0.02|N|O|1998-02-11|1998-03-27|1998-02-28|COLLECT COD|MAIL|even deposits. even packages serve among +16647|170|97|2|38|40666.46|0.03|0.06|N|O|1998-02-18|1998-04-10|1998-03-04|DELIVER IN PERSON|REG AIR|ully. slyly unusual deposits wak +16647|1066|67|3|26|25143.56|0.07|0.02|N|O|1998-04-06|1998-02-23|1998-05-02|COLLECT COD|REG AIR|kages haggle after the pe +16647|1103|4|4|33|33135.30|0.08|0.03|N|O|1998-03-21|1998-03-17|1998-03-26|TAKE BACK RETURN|MAIL|nusual foxes haggle carefully acr +16647|705|38|5|26|41748.20|0.00|0.06|N|O|1998-04-03|1998-03-20|1998-04-26|DELIVER IN PERSON|RAIL|lly blithely even ideas. blithely final req +16647|295|77|6|13|15538.77|0.04|0.07|N|O|1998-05-10|1998-02-22|1998-05-12|DELIVER IN PERSON|TRUCK|ithely silent ideas subl +16672|70|21|1|12|11640.84|0.00|0.05|N|O|1997-04-13|1997-05-06|1997-04-25|TAKE BACK RETURN|AIR|fully unusual foxes. somas s +16673|1948|93|1|37|68447.78|0.06|0.06|N|O|1996-05-09|1996-04-23|1996-05-12|DELIVER IN PERSON|AIR|ter the express inst +16674|917|52|1|37|67262.67|0.09|0.03|N|O|1995-07-13|1995-06-12|1995-07-23|NONE|FOB|furiously according to t +16674|1134|35|2|25|25878.25|0.05|0.03|N|O|1995-07-10|1995-06-25|1995-07-31|NONE|RAIL|ependencies. quickly regu +16674|953|88|3|45|83427.75|0.03|0.08|N|F|1995-06-16|1995-06-10|1995-06-26|TAKE BACK RETURN|RAIL|uests hinder furiously. +16674|682|45|4|26|41149.68|0.07|0.04|N|O|1995-06-18|1995-06-16|1995-06-27|DELIVER IN PERSON|RAIL|olites. requests sleep. ex +16674|137|38|5|3|3111.39|0.09|0.00|N|O|1995-06-30|1995-07-11|1995-07-01|COLLECT COD|TRUCK|phins. quickly final accounts ha +16674|334|19|6|16|19749.28|0.01|0.04|N|O|1995-08-23|1995-06-28|1995-09-02|TAKE BACK RETURN|MAIL| regular ideas. blithely iron +16674|1741|26|7|8|13141.92|0.04|0.02|N|O|1995-07-06|1995-07-21|1995-08-04|DELIVER IN PERSON|SHIP|ts. slyly ironic theodolites are care +16675|290|45|1|7|8332.03|0.06|0.04|N|O|1998-07-27|1998-07-23|1998-08-06|DELIVER IN PERSON|TRUCK|quickly ironic dolphins promi +16675|80|31|2|48|47043.84|0.10|0.07|N|O|1998-07-06|1998-07-18|1998-07-30|TAKE BACK RETURN|TRUCK|es about the fluffily special pin +16675|1477|78|3|49|67545.03|0.08|0.07|N|O|1998-08-25|1998-08-19|1998-09-21|TAKE BACK RETURN|FOB|s accounts. +16675|1769|96|4|31|51793.56|0.01|0.00|N|O|1998-09-09|1998-07-12|1998-09-23|DELIVER IN PERSON|TRUCK|ake quickly furiously even theodolites +16675|164|91|5|21|22347.36|0.07|0.08|N|O|1998-08-30|1998-07-03|1998-09-29|TAKE BACK RETURN|FOB|xpress requests boost slyly. careful +16675|178|5|6|15|16172.55|0.07|0.03|N|O|1998-09-03|1998-07-24|1998-10-01|DELIVER IN PERSON|SHIP|regular theodolite +16676|1872|16|1|41|72728.67|0.02|0.00|A|F|1994-06-27|1994-05-09|1994-07-18|TAKE BACK RETURN|AIR|r requests haggle slyly. regular packages +16676|100|76|2|13|13001.30|0.07|0.01|R|F|1994-07-04|1994-04-25|1994-07-26|NONE|FOB|ent packages. regul +16676|1972|61|3|16|29983.52|0.04|0.03|A|F|1994-03-29|1994-05-05|1994-04-15|NONE|AIR|ic ideas nag carefully among the fluffily +16676|206|7|4|9|9955.80|0.05|0.00|R|F|1994-06-17|1994-06-16|1994-07-10|DELIVER IN PERSON|FOB|cial platelets. spe +16676|41|92|5|41|38582.64|0.10|0.04|A|F|1994-04-09|1994-06-08|1994-04-23|DELIVER IN PERSON|RAIL|out the furiousl +16676|747|80|6|27|44488.98|0.08|0.06|R|F|1994-03-29|1994-05-12|1994-04-19|COLLECT COD|AIR|lithely blithe foxes. +16677|1479|80|1|37|51077.39|0.05|0.07|A|F|1992-09-30|1992-11-18|1992-10-20|TAKE BACK RETURN|AIR|regular foxes. furiously unusua +16677|1724|25|2|11|17882.92|0.01|0.03|R|F|1992-10-28|1992-12-05|1992-11-17|COLLECT COD|RAIL|lly along the carefully f +16677|1643|26|3|4|6178.56|0.04|0.05|A|F|1992-10-18|1992-10-08|1992-10-24|NONE|MAIL|ecial packages. +16677|1419|37|4|15|19806.15|0.10|0.07|A|F|1992-12-18|1992-12-02|1993-01-16|DELIVER IN PERSON|REG AIR|ests. carefully regu +16677|483|42|5|37|51188.76|0.06|0.04|R|F|1992-09-30|1992-11-20|1992-10-10|DELIVER IN PERSON|FOB|s wake regular, regular deposi +16677|12|63|6|18|16416.18|0.06|0.01|R|F|1992-12-20|1992-11-01|1993-01-17|COLLECT COD|SHIP|ut the final accounts. dependencies +16677|1146|83|7|50|52357.00|0.08|0.02|R|F|1992-09-12|1992-11-19|1992-10-04|COLLECT COD|REG AIR|l asymptotes. regular packages sleep furiou +16678|1797|24|1|9|15289.11|0.00|0.05|N|O|1996-07-10|1996-09-14|1996-07-23|COLLECT COD|TRUCK|excuses. regular packages x-ray +16678|1189|26|2|4|4360.72|0.04|0.06|N|O|1996-09-02|1996-07-27|1996-09-09|NONE|RAIL|ltipliers. theodolites sublate quic +16679|1609|51|1|45|67977.00|0.09|0.06|A|F|1995-02-21|1994-12-25|1995-03-19|TAKE BACK RETURN|RAIL|tes use. blithely pending grouches w +16679|592|53|2|37|55225.83|0.03|0.05|A|F|1995-02-19|1995-02-01|1995-03-06|NONE|FOB|ng furiously. regular packages doze? +16679|1603|86|3|37|55670.20|0.01|0.03|A|F|1995-03-02|1995-01-15|1995-03-16|COLLECT COD|SHIP|ic packages. unusual +16679|228|10|4|5|5641.10|0.03|0.03|R|F|1995-02-23|1995-01-08|1995-03-17|COLLECT COD|MAIL|beans cajole slyly. ironic requests +16679|1233|34|5|17|19281.91|0.01|0.06|R|F|1995-02-15|1994-12-13|1995-02-18|NONE|SHIP|uriously quickly final accounts. never fina +16679|1680|4|6|15|23725.20|0.01|0.00|R|F|1995-01-17|1994-12-23|1995-02-08|DELIVER IN PERSON|TRUCK|ove the special dolph +16704|1273|74|1|47|55190.69|0.04|0.06|R|F|1994-11-15|1994-11-14|1994-11-30|COLLECT COD|AIR| carefully final excuses hagg +16705|503|64|1|40|56140.00|0.10|0.01|N|O|1998-02-18|1998-03-05|1998-03-11|COLLECT COD|FOB|ss, unusual packages sleep boldly +16706|1333|34|1|34|41967.22|0.04|0.07|A|F|1992-10-18|1992-09-09|1992-11-10|COLLECT COD|RAIL| requests? final +16706|822|89|2|36|62021.52|0.00|0.08|A|F|1992-08-22|1992-09-14|1992-09-07|COLLECT COD|REG AIR|ke even, special +16706|977|12|3|22|41315.34|0.01|0.01|A|F|1992-10-19|1992-09-11|1992-10-22|TAKE BACK RETURN|REG AIR|ts are furiously final ideas. p +16706|563|64|4|49|71714.44|0.01|0.00|A|F|1992-10-13|1992-09-08|1992-11-09|DELIVER IN PERSON|AIR|equests sleep f +16706|30|56|5|12|11160.36|0.02|0.03|R|F|1992-09-30|1992-09-10|1992-10-05|DELIVER IN PERSON|FOB|accounts. regular, ironic theodolites cajo +16706|265|47|6|48|55932.48|0.09|0.08|A|F|1992-10-12|1992-09-25|1992-10-20|NONE|SHIP|even requests haggle. theodolites cou +16706|1571|12|7|17|25033.69|0.05|0.06|R|F|1992-08-16|1992-08-06|1992-09-11|NONE|RAIL|furiously bold foxe +16707|1996|29|1|36|68327.64|0.09|0.02|N|O|1998-08-07|1998-07-27|1998-08-14|TAKE BACK RETURN|TRUCK|sts may use carefully around the careful +16708|997|66|1|30|56939.70|0.06|0.05|N|O|1996-12-17|1996-10-16|1997-01-04|DELIVER IN PERSON|REG AIR|gular theodolites sleep slyly. +16708|72|98|2|32|31106.24|0.07|0.05|N|O|1996-10-14|1996-11-17|1996-10-15|NONE|TRUCK|the always f +16708|1803|47|3|16|27276.80|0.07|0.05|N|O|1996-09-13|1996-11-25|1996-09-25|COLLECT COD|TRUCK| wake furiously final, fluff +16708|1999|88|4|26|49425.74|0.00|0.08|N|O|1996-11-05|1996-10-01|1996-11-08|TAKE BACK RETURN|SHIP| regular attainments sleep furiou +16709|1677|60|1|11|17365.37|0.02|0.07|R|F|1993-01-31|1992-12-26|1993-02-15|NONE|SHIP| nag ironic +16709|1890|20|2|43|77051.27|0.08|0.07|R|F|1992-11-26|1992-11-12|1992-12-03|COLLECT COD|SHIP|y quickly special packages. quick +16709|1560|81|3|45|65770.20|0.03|0.00|A|F|1992-12-23|1992-12-24|1992-12-27|TAKE BACK RETURN|AIR| blithely final instructions. final, iro +16709|1548|89|4|22|31889.88|0.09|0.06|R|F|1992-10-24|1993-01-01|1992-11-15|NONE|FOB|quests. bold packages wake +16709|634|66|5|1|1534.63|0.02|0.06|A|F|1992-11-01|1992-12-06|1992-11-25|COLLECT COD|MAIL|ross the blithely permanent accounts. +16709|550|51|6|3|4351.65|0.05|0.06|A|F|1992-11-20|1992-11-20|1992-11-29|NONE|MAIL| pending platelets. slyl +16710|695|58|1|3|4787.07|0.07|0.02|N|O|1995-07-25|1995-06-03|1995-08-01|COLLECT COD|SHIP| regular packages +16711|200|27|1|43|47308.60|0.02|0.03|R|F|1992-08-15|1992-07-14|1992-08-28|TAKE BACK RETURN|MAIL|odolites haggle afte +16711|1456|35|2|37|50225.65|0.01|0.02|R|F|1992-07-23|1992-07-15|1992-08-21|TAKE BACK RETURN|MAIL| pending multipl +16711|352|37|3|41|51346.35|0.04|0.02|A|F|1992-05-05|1992-07-04|1992-05-17|COLLECT COD|FOB|yly fluffy requests. slyly special th +16711|1031|67|4|33|30756.99|0.07|0.05|A|F|1992-08-16|1992-07-23|1992-08-28|DELIVER IN PERSON|FOB|en account +16711|168|21|5|23|24567.68|0.06|0.01|A|F|1992-06-16|1992-07-22|1992-06-27|NONE|FOB|y. fluffil +16711|965|66|6|8|14927.68|0.08|0.05|R|F|1992-07-13|1992-07-22|1992-07-16|DELIVER IN PERSON|TRUCK| fluffy realms w +16711|82|83|7|7|6874.56|0.07|0.01|A|F|1992-05-24|1992-06-22|1992-06-06|COLLECT COD|RAIL|wake carefully al +16736|90|41|1|43|42573.87|0.06|0.08|N|O|1997-12-15|1998-01-11|1998-01-01|COLLECT COD|SHIP| ironic pinto beans detect +16736|312|41|2|30|36369.30|0.09|0.00|N|O|1997-12-02|1997-11-23|1997-12-22|COLLECT COD|REG AIR|mise slyly. quickly +16736|1423|63|3|18|23839.56|0.07|0.04|N|O|1997-11-20|1998-01-15|1997-12-17|DELIVER IN PERSON|AIR|posits. fluffily ironic deposits wake +16736|372|73|4|41|52167.17|0.00|0.05|N|O|1997-10-28|1998-01-10|1997-10-31|DELIVER IN PERSON|AIR|cies are aro +16736|1228|29|5|41|46298.02|0.05|0.01|N|O|1997-12-01|1998-01-10|1997-12-08|NONE|RAIL|s boost slyly fluffily pen +16736|607|39|6|30|45228.00|0.08|0.08|N|O|1998-01-12|1997-12-14|1998-02-10|DELIVER IN PERSON|MAIL|ly unusual foxes. even dep +16736|1170|43|7|49|52487.33|0.06|0.05|N|O|1998-02-01|1997-12-29|1998-02-13|COLLECT COD|TRUCK|ly express deposits. i +16737|1175|12|1|18|19371.06|0.06|0.01|N|O|1995-10-19|1995-08-04|1995-11-17|NONE|SHIP|counts use slyly +16737|648|80|2|12|18583.68|0.00|0.01|N|O|1995-06-28|1995-09-19|1995-07-13|COLLECT COD|REG AIR|jole according to the furiously sp +16738|1379|80|1|2|2560.74|0.09|0.02|R|F|1994-01-16|1994-01-18|1994-02-09|NONE|MAIL|ns. final, bold packages n +16738|1999|44|2|35|66534.65|0.03|0.00|A|F|1994-03-06|1994-01-23|1994-03-14|DELIVER IN PERSON|SHIP|nusual deposits. s +16738|945|48|3|21|38764.74|0.04|0.08|R|F|1994-01-28|1994-01-18|1994-02-06|DELIVER IN PERSON|TRUCK|express ideas abo +16738|919|22|4|17|30938.47|0.02|0.01|A|F|1994-01-31|1994-01-12|1994-02-27|TAKE BACK RETURN|AIR|unts. bold platele +16739|1845|75|1|6|10481.04|0.00|0.07|N|O|1997-05-29|1997-06-07|1997-06-26|COLLECT COD|FOB| blithely accordin +16739|1139|76|2|21|21842.73|0.09|0.03|N|O|1997-04-14|1997-06-19|1997-04-28|NONE|RAIL|eposits detect carefully ab +16739|105|84|3|6|6030.60|0.09|0.08|N|O|1997-04-07|1997-05-01|1997-04-22|COLLECT COD|TRUCK|tructions. furiously even pains cajole s +16739|1760|45|4|4|6647.04|0.08|0.05|N|O|1997-07-21|1997-04-26|1997-08-13|TAKE BACK RETURN|SHIP|ly pending dep +16739|137|90|5|39|40448.07|0.05|0.03|N|O|1997-06-24|1997-06-19|1997-07-06|COLLECT COD|AIR|about the e +16740|1447|87|1|47|63376.68|0.05|0.05|R|F|1992-06-30|1992-04-22|1992-07-22|NONE|TRUCK|efully across the final t +16740|491|21|2|24|33395.76|0.02|0.01|R|F|1992-03-27|1992-04-10|1992-04-04|NONE|REG AIR|mes packages. even, regula +16741|920|55|1|24|43702.08|0.01|0.00|R|F|1994-01-21|1993-11-12|1994-02-18|DELIVER IN PERSON|SHIP|ckly final packages wake carefull +16742|109|10|1|33|33300.30|0.00|0.01|R|F|1993-06-24|1993-08-04|1993-07-11|NONE|MAIL|ronic deposits; bol +16742|1379|56|2|40|51214.80|0.06|0.02|R|F|1993-08-15|1993-07-31|1993-09-01|TAKE BACK RETURN|AIR|unts among t +16743|1556|37|1|40|58302.00|0.01|0.08|N|O|1996-11-06|1996-12-13|1996-12-06|DELIVER IN PERSON|REG AIR|the carefully express foxes. c +16743|814|48|2|24|41155.44|0.04|0.07|N|O|1996-11-17|1996-11-17|1996-12-13|TAKE BACK RETURN|REG AIR|mong the quickly special packages. sly +16743|907|8|3|22|39773.80|0.10|0.03|N|O|1996-10-30|1996-11-18|1996-11-06|NONE|RAIL|he ruthlessly regular foxes. furiously regu +16743|1532|53|4|20|28670.60|0.02|0.08|N|O|1996-10-18|1996-11-10|1996-11-05|COLLECT COD|FOB|ilent, bold braids +16743|1002|38|5|21|18963.00|0.05|0.08|N|O|1997-01-03|1996-12-21|1997-01-05|TAKE BACK RETURN|SHIP|sleep blith +16768|549|50|1|14|20293.56|0.05|0.06|R|F|1994-08-04|1994-08-29|1994-08-16|COLLECT COD|TRUCK|le fluffily above the blithely +16768|1521|22|2|43|61168.36|0.08|0.03|A|F|1994-08-17|1994-09-06|1994-08-20|COLLECT COD|SHIP|t the expres +16768|776|9|3|23|38565.71|0.07|0.08|R|F|1994-10-11|1994-09-13|1994-11-03|TAKE BACK RETURN|REG AIR|lar pinto beans. +16768|906|41|4|31|56013.90|0.08|0.05|A|F|1994-11-17|1994-09-16|1994-11-18|COLLECT COD|MAIL| final accounts. even d +16768|1500|79|5|37|51855.50|0.10|0.08|A|F|1994-08-14|1994-09-26|1994-08-25|TAKE BACK RETURN|TRUCK|odolites cajole +16768|1485|86|6|50|69324.00|0.04|0.04|R|F|1994-09-17|1994-09-22|1994-09-25|COLLECT COD|MAIL|lets. regular platelets are. +16768|1833|77|7|8|13878.64|0.09|0.06|A|F|1994-08-14|1994-09-16|1994-09-04|TAKE BACK RETURN|MAIL|egrate quickly closely pending +16769|535|96|1|41|58856.73|0.10|0.07|N|O|1998-01-05|1997-11-07|1998-01-25|DELIVER IN PERSON|REG AIR| final ideas integrate. blithely express p +16769|1827|57|2|38|65695.16|0.07|0.06|N|O|1997-10-24|1997-12-11|1997-11-18|NONE|SHIP|s wake slyly final reques +16769|1262|63|3|1|1163.26|0.04|0.03|N|O|1998-01-26|1997-12-18|1998-02-13|NONE|REG AIR|nding ideas. regular ideas wake. furiously +16769|1685|68|4|45|71400.60|0.05|0.00|N|O|1998-01-23|1997-12-02|1998-01-26|COLLECT COD|RAIL|sual pinto beans cajole slowly furiously +16769|1111|84|5|7|7084.77|0.00|0.04|N|O|1997-10-29|1997-11-12|1997-11-19|TAKE BACK RETURN|TRUCK|requests cajole b +16769|1685|86|6|5|7933.40|0.06|0.02|N|O|1998-01-24|1997-11-19|1998-02-07|TAKE BACK RETURN|AIR|ions cajole slyly. furiou +16770|1841|71|1|18|31371.12|0.00|0.04|R|F|1994-01-23|1994-02-25|1994-02-21|NONE|MAIL|rs. slyly even requests above +16771|390|91|1|35|45163.65|0.03|0.04|R|F|1994-11-26|1994-12-13|1994-12-18|COLLECT COD|RAIL|ongside of the regular packages wake quie +16771|813|14|2|13|22279.53|0.09|0.07|A|F|1995-01-09|1994-11-07|1995-01-11|NONE|SHIP| regular requests haggle quickly final a +16772|571|72|1|3|4414.71|0.00|0.08|A|F|1993-02-08|1993-02-10|1993-03-09|NONE|TRUCK|. asymptotes cajole furiously +16772|37|38|2|13|12181.39|0.06|0.00|A|F|1993-01-10|1993-03-21|1993-01-28|TAKE BACK RETURN|FOB|. slyly regular pinto beans bo +16772|1579|60|3|15|22208.55|0.02|0.03|A|F|1993-03-11|1993-03-03|1993-04-05|COLLECT COD|AIR| slyly unusual hockey +16772|1668|69|4|24|37671.84|0.00|0.07|R|F|1993-04-09|1993-02-21|1993-05-04|COLLECT COD|RAIL|sly across the fluffily final accou +16772|434|93|5|41|54711.63|0.10|0.00|R|F|1993-02-24|1993-03-26|1993-03-23|DELIVER IN PERSON|SHIP|arefully about the fluffily regul +16772|414|44|6|22|28917.02|0.10|0.07|R|F|1993-02-28|1993-03-25|1993-03-15|NONE|MAIL|ironic, ironic theo +16772|1498|99|7|42|58778.58|0.09|0.05|A|F|1993-04-03|1993-02-26|1993-04-11|TAKE BACK RETURN|SHIP|ts against the never e +16773|499|87|1|7|9796.43|0.10|0.05|N|O|1997-03-05|1997-03-03|1997-03-20|DELIVER IN PERSON|MAIL|the carefully express accounts. c +16774|1484|2|1|50|69274.00|0.06|0.03|N|O|1998-04-27|1998-03-23|1998-05-19|DELIVER IN PERSON|RAIL|arefully regular requests: fluf +16774|1532|53|2|29|41572.37|0.02|0.08|N|O|1998-03-12|1998-03-28|1998-03-31|TAKE BACK RETURN|MAIL| pending asymptotes acco +16774|612|6|3|18|27226.98|0.02|0.00|N|O|1998-04-09|1998-04-08|1998-04-24|TAKE BACK RETURN|RAIL| sleep blithely +16774|1441|59|4|7|9397.08|0.06|0.07|N|O|1998-04-01|1998-02-23|1998-04-16|COLLECT COD|AIR|equests wake car +16775|966|67|1|20|37339.20|0.08|0.06|R|F|1993-03-07|1993-01-11|1993-03-15|COLLECT COD|RAIL|riously ironic packages boost +16775|1171|80|2|47|50391.99|0.00|0.08|R|F|1992-12-13|1992-12-24|1992-12-28|DELIVER IN PERSON|REG AIR| fluffily f +16775|1881|25|3|17|30308.96|0.02|0.02|A|F|1992-12-14|1992-12-26|1992-12-31|NONE|MAIL| of the deposits? carefull +16775|1096|67|4|12|11965.08|0.07|0.00|R|F|1992-12-22|1993-01-18|1993-01-06|DELIVER IN PERSON|SHIP|ously regular courts are quick +16800|73|74|1|27|26272.89|0.10|0.06|N|F|1995-06-11|1995-08-30|1995-07-05|TAKE BACK RETURN|RAIL|y ironic instructions nag reg +16800|452|82|2|1|1352.45|0.07|0.03|N|O|1995-06-19|1995-08-01|1995-07-06|DELIVER IN PERSON|TRUCK|ag. slyly regular foxes are fu +16800|345|30|3|43|53549.62|0.07|0.02|N|O|1995-08-24|1995-08-05|1995-08-27|NONE|REG AIR|platelets. regular +16800|138|65|4|30|31143.90|0.02|0.06|N|O|1995-09-11|1995-08-29|1995-09-19|DELIVER IN PERSON|MAIL| quickly dogg +16800|455|56|5|9|12199.05|0.09|0.01|N|O|1995-09-12|1995-07-11|1995-09-21|TAKE BACK RETURN|TRUCK| cajole. e +16801|555|46|1|49|71321.95|0.05|0.00|N|O|1996-10-01|1996-11-26|1996-10-05|DELIVER IN PERSON|MAIL|-ray blithely. bold courts are slyly regul +16801|1269|81|2|22|25745.72|0.07|0.03|N|O|1996-12-10|1996-11-20|1996-12-31|NONE|REG AIR|he pending accounts. blithely +16801|1893|94|3|5|8974.45|0.02|0.01|N|O|1996-11-10|1996-10-13|1996-11-26|COLLECT COD|RAIL|s. blithel +16801|1821|22|4|8|13782.56|0.07|0.08|N|O|1996-09-09|1996-10-22|1996-09-20|NONE|REG AIR|uickly around +16801|1436|37|5|8|10699.44|0.09|0.01|N|O|1996-10-28|1996-11-15|1996-11-26|COLLECT COD|MAIL|ng the pending, even attai +16802|1496|97|1|5|6987.45|0.03|0.07|N|F|1995-06-17|1995-06-17|1995-07-01|DELIVER IN PERSON|REG AIR|n packages. carefully special somas run +16802|293|75|2|42|50118.18|0.03|0.06|N|F|1995-06-10|1995-06-18|1995-07-09|DELIVER IN PERSON|FOB|s poach. blithely regular +16802|74|75|3|35|34092.45|0.03|0.06|N|O|1995-07-27|1995-06-05|1995-07-28|TAKE BACK RETURN|TRUCK| regular instructi +16802|1653|77|4|42|65295.30|0.03|0.02|N|O|1995-08-14|1995-06-19|1995-08-15|DELIVER IN PERSON|TRUCK|s among the daring packages sle +16802|999|68|5|42|79799.58|0.10|0.02|N|O|1995-08-19|1995-06-03|1995-09-13|DELIVER IN PERSON|SHIP| unusual courts nag e +16802|1796|81|6|16|27164.64|0.06|0.03|A|F|1995-05-21|1995-07-16|1995-06-03|DELIVER IN PERSON|MAIL|s across the s +16803|1716|43|1|34|55002.14|0.08|0.01|N|O|1995-10-11|1995-11-07|1995-10-12|DELIVER IN PERSON|SHIP|sly even, final ideas. fluffi +16803|1360|75|2|26|32795.36|0.09|0.02|N|O|1995-10-13|1995-10-27|1995-11-12|TAKE BACK RETURN|MAIL|ecial accounts. slyly slow acco +16804|878|78|1|4|7115.48|0.01|0.08|A|F|1992-06-04|1992-05-09|1992-06-27|TAKE BACK RETURN|MAIL|platelets. regular accounts boost +16804|1347|62|2|17|21221.78|0.04|0.02|A|F|1992-05-17|1992-05-04|1992-05-18|COLLECT COD|REG AIR|quickly silent dependencies +16804|540|41|3|46|66264.84|0.10|0.08|R|F|1992-07-10|1992-04-16|1992-07-29|TAKE BACK RETURN|REG AIR|hely unusual foxes. carefully final r +16804|268|50|4|13|15187.38|0.03|0.07|R|F|1992-06-13|1992-05-24|1992-06-23|DELIVER IN PERSON|TRUCK|ar dolphins sleep carefully f +16805|340|69|1|26|32248.84|0.04|0.02|N|O|1996-01-05|1996-03-27|1996-01-28|TAKE BACK RETURN|MAIL|e daringly silent theodo +16805|902|37|2|13|23437.70|0.02|0.01|N|O|1996-02-07|1996-03-25|1996-03-02|COLLECT COD|TRUCK|ly over the silent i +16805|1590|31|3|48|71596.32|0.07|0.08|N|O|1996-01-04|1996-03-19|1996-01-12|NONE|MAIL|e quickly even pack +16805|1656|98|4|2|3115.30|0.00|0.03|N|O|1996-04-27|1996-03-07|1996-05-14|DELIVER IN PERSON|REG AIR|long the close, +16805|612|6|5|5|7563.05|0.04|0.03|N|O|1996-03-04|1996-02-02|1996-03-12|TAKE BACK RETURN|TRUCK|ully ironic pinto beans use final acco +16805|1249|24|6|19|21854.56|0.04|0.07|N|O|1996-01-09|1996-02-22|1996-01-25|TAKE BACK RETURN|RAIL|eas snooze after the unusual pinto +16806|542|43|1|49|70684.46|0.08|0.06|R|F|1993-10-03|1993-09-07|1993-10-21|TAKE BACK RETURN|MAIL| deposits integrate again +16806|1710|11|2|29|46739.59|0.04|0.02|A|F|1993-08-18|1993-09-08|1993-08-24|TAKE BACK RETURN|REG AIR| requests? slyly regular courts in +16806|1256|57|3|23|26616.75|0.05|0.03|A|F|1993-07-27|1993-08-23|1993-08-26|TAKE BACK RETURN|AIR|ccounts sleep carefu +16806|1331|32|4|34|41899.22|0.10|0.05|A|F|1993-10-03|1993-09-04|1993-10-09|NONE|FOB|ly final multipliers +16806|1249|61|5|12|13802.88|0.03|0.03|A|F|1993-09-11|1993-07-23|1993-09-22|COLLECT COD|SHIP|xpress instructions at the fluffily bold r +16806|1235|36|6|3|3408.69|0.09|0.01|R|F|1993-09-23|1993-08-02|1993-10-06|NONE|MAIL|ithely regular packages was +16806|146|99|7|36|37661.04|0.08|0.04|A|F|1993-06-26|1993-08-07|1993-07-20|COLLECT COD|RAIL|beans affix quietly according to the blithe +16807|811|12|1|49|83878.69|0.07|0.00|A|F|1992-04-28|1992-03-29|1992-05-18|COLLECT COD|AIR|leep blithely. furiously final r +16807|185|86|2|41|44492.38|0.00|0.02|A|F|1992-05-16|1992-03-29|1992-06-15|DELIVER IN PERSON|TRUCK|carefully pend +16807|1781|24|3|5|8413.90|0.07|0.05|R|F|1992-04-14|1992-02-15|1992-04-15|TAKE BACK RETURN|TRUCK|uriously alongside o +16807|1030|66|4|23|21413.69|0.06|0.02|A|F|1992-03-07|1992-04-03|1992-03-08|TAKE BACK RETURN|FOB|slyly final instructions. carefully +16832|512|73|1|17|24012.67|0.02|0.08|R|F|1993-04-11|1993-03-03|1993-05-08|TAKE BACK RETURN|RAIL|lar theodolites nag final ac +16833|1078|14|1|13|12727.91|0.03|0.00|N|O|1998-01-09|1997-11-17|1998-01-24|COLLECT COD|SHIP|ckages boost blithe +16833|1025|31|2|43|39818.86|0.10|0.06|N|O|1997-11-09|1998-01-12|1997-11-22|COLLECT COD|SHIP|regular th +16833|1069|75|3|32|31041.92|0.10|0.00|N|O|1997-12-25|1997-12-10|1998-01-08|NONE|REG AIR|equests haggle fluffily bold +16833|30|31|4|38|35341.14|0.00|0.02|N|O|1997-11-29|1998-01-12|1997-12-12|COLLECT COD|AIR|e. blithely unusual packages detect fi +16833|1219|94|5|14|15682.94|0.03|0.00|N|O|1998-01-24|1998-01-05|1998-02-10|COLLECT COD|REG AIR|nusual requ +16833|1225|63|6|31|34912.82|0.09|0.08|N|O|1997-10-17|1998-01-01|1997-11-06|COLLECT COD|SHIP|s cajole furiously regular packages +16834|1856|86|1|47|82618.95|0.05|0.05|A|F|1994-01-11|1993-12-29|1994-01-18|NONE|RAIL|could have t +16834|429|59|2|5|6647.10|0.06|0.03|A|F|1994-01-30|1993-12-01|1994-02-07|COLLECT COD|REG AIR|uffily about the quickly unusual depos +16834|1782|83|3|7|11786.46|0.01|0.04|R|F|1993-11-13|1993-12-04|1993-11-18|NONE|AIR|lly unusual foxes cajole car +16834|1119|28|4|12|12241.32|0.10|0.05|A|F|1993-12-23|1993-12-13|1994-01-16|TAKE BACK RETURN|TRUCK|ly around the blithely slow pi +16835|904|39|1|30|54147.00|0.03|0.02|A|F|1994-04-14|1994-04-10|1994-04-24|DELIVER IN PERSON|AIR|nod fluffily arou +16835|1824|54|2|34|58677.88|0.08|0.05|R|F|1994-03-17|1994-04-25|1994-04-15|COLLECT COD|RAIL|y after the slyly final excuses. package +16836|1828|29|1|25|43245.50|0.05|0.01|A|F|1994-02-01|1993-12-07|1994-02-23|TAKE BACK RETURN|AIR|deposits. furiously close asym +16836|1934|35|2|10|18359.30|0.00|0.03|R|F|1994-01-09|1993-11-20|1994-02-03|DELIVER IN PERSON|REG AIR|s. quickly ironic dolphins a +16837|315|16|1|11|13368.41|0.04|0.08|A|F|1995-05-22|1995-03-07|1995-05-24|TAKE BACK RETURN|RAIL|usly final depende +16837|1823|10|2|12|20697.84|0.08|0.06|A|F|1995-05-14|1995-03-27|1995-06-06|NONE|MAIL| sleep bli +16838|957|92|1|11|20437.45|0.03|0.01|A|F|1994-06-28|1994-06-14|1994-07-24|NONE|RAIL|ular deposits sleep furiously ar +16838|805|5|2|13|22175.40|0.07|0.06|A|F|1994-07-26|1994-07-08|1994-08-09|NONE|FOB|ost carefully +16838|335|20|3|7|8647.31|0.04|0.08|A|F|1994-08-18|1994-06-16|1994-09-03|NONE|RAIL|final request +16838|1377|78|4|39|49856.43|0.02|0.02|R|F|1994-07-30|1994-07-14|1994-08-01|NONE|MAIL|ccounts use. final p +16838|597|28|5|30|44927.70|0.06|0.07|A|F|1994-06-24|1994-07-23|1994-07-08|DELIVER IN PERSON|REG AIR|yly ironic foxes are quickly. ironically f +16838|1732|75|6|19|31040.87|0.00|0.04|A|F|1994-06-06|1994-06-22|1994-06-22|TAKE BACK RETURN|MAIL|uests sublate caref +16839|1233|45|1|39|44234.97|0.03|0.04|A|F|1993-09-16|1993-07-05|1993-10-07|DELIVER IN PERSON|REG AIR|ccounts detect alongside of the flu +16839|1905|38|2|4|7227.60|0.10|0.06|R|F|1993-08-22|1993-07-31|1993-09-06|DELIVER IN PERSON|FOB| quickly alongside of the fluffily exp +16864|1739|66|1|49|80395.77|0.09|0.02|A|F|1993-01-19|1993-01-14|1993-02-08|COLLECT COD|REG AIR|beans haggle fluffily. carefully even gr +16865|174|27|1|25|26854.25|0.06|0.04|N|O|1996-05-21|1996-06-16|1996-06-12|DELIVER IN PERSON|SHIP|nal accounts! slyly final requests +16865|236|64|2|26|29541.98|0.07|0.08|N|O|1996-07-16|1996-06-19|1996-08-01|NONE|MAIL|ccounts nag slyly bold +16866|1015|16|1|1|916.01|0.07|0.02|R|F|1992-05-25|1992-04-05|1992-06-17|NONE|AIR|rhorses haggle about the carefully bold ac +16866|1303|18|2|34|40946.20|0.08|0.04|A|F|1992-02-29|1992-04-19|1992-03-17|DELIVER IN PERSON|SHIP|about the finally +16866|745|42|3|20|32914.80|0.05|0.01|R|F|1992-05-09|1992-03-31|1992-05-28|NONE|SHIP| the pinto +16867|1957|2|1|25|46473.75|0.02|0.08|R|F|1992-12-21|1993-01-23|1993-01-13|COLLECT COD|AIR|ounts. enticing requests h +16867|541|42|2|31|44687.74|0.02|0.03|A|F|1992-12-17|1993-01-23|1993-01-04|DELIVER IN PERSON|TRUCK| the idly unusual accounts unwind alongsi +16868|1663|87|1|46|71974.36|0.02|0.04|N|O|1998-08-28|1998-09-22|1998-09-06|COLLECT COD|REG AIR|thely regular request +16868|583|74|2|50|74179.00|0.07|0.06|N|O|1998-09-10|1998-09-11|1998-09-25|DELIVER IN PERSON|TRUCK|counts use finally according to the +16868|1576|97|3|36|53192.52|0.03|0.02|N|O|1998-09-12|1998-10-07|1998-10-10|NONE|FOB|quests cajole along the +16869|1690|73|1|33|52525.77|0.05|0.06|N|O|1998-03-07|1998-03-23|1998-03-08|NONE|RAIL|sleep slyly. furious +16869|1507|8|2|28|39438.00|0.03|0.04|N|O|1998-03-08|1998-03-07|1998-03-26|TAKE BACK RETURN|MAIL|lphins. furiously pending theodo +16869|657|58|3|31|48287.15|0.04|0.03|N|O|1998-04-27|1998-03-28|1998-05-01|NONE|TRUCK|omas. furiously slow packages along +16869|1720|21|4|20|32434.40|0.08|0.06|N|O|1998-02-17|1998-04-11|1998-03-10|DELIVER IN PERSON|FOB|nts nag quietly along the bl +16870|943|46|1|36|66381.84|0.08|0.04|R|F|1994-03-16|1994-02-17|1994-03-21|TAKE BACK RETURN|TRUCK|doze. unusual theodolites boost +16870|1305|44|2|25|30157.50|0.06|0.00|R|F|1994-04-28|1994-03-20|1994-05-07|DELIVER IN PERSON|MAIL|lithely bo +16870|268|69|3|31|36216.06|0.06|0.02|R|F|1994-01-16|1994-03-13|1994-02-10|TAKE BACK RETURN|AIR|nstructions along the quickly regul +16870|759|92|4|20|33195.00|0.06|0.03|R|F|1994-02-05|1994-02-26|1994-03-07|NONE|TRUCK|ven requests use quickly bold excu +16871|667|99|1|21|32920.86|0.03|0.08|A|F|1994-08-08|1994-09-01|1994-09-07|NONE|RAIL|above the carefully unusual instru +16871|1323|100|2|19|23262.08|0.08|0.01|A|F|1994-07-22|1994-10-04|1994-07-31|TAKE BACK RETURN|TRUCK|ts. slyly even reque +16871|1167|4|3|22|23499.52|0.06|0.06|A|F|1994-10-02|1994-09-12|1994-10-15|TAKE BACK RETURN|RAIL|bold dependencies. f +16871|1120|21|4|30|30633.60|0.10|0.03|R|F|1994-08-08|1994-10-12|1994-08-31|NONE|SHIP|y busy accounts. furiously bol +16896|1334|49|1|17|21000.61|0.09|0.06|N|O|1997-08-10|1997-05-25|1997-09-02|DELIVER IN PERSON|REG AIR|instructions. even +16896|1199|36|2|7|7701.33|0.04|0.05|N|O|1997-07-23|1997-06-18|1997-08-10|COLLECT COD|RAIL|special pinto beans. pending acco +16896|734|67|3|13|21251.49|0.10|0.07|N|O|1997-07-07|1997-06-01|1997-07-17|TAKE BACK RETURN|MAIL|y regular escapades integrate quickly iro +16896|423|53|4|46|60877.32|0.04|0.01|N|O|1997-07-29|1997-07-04|1997-08-23|DELIVER IN PERSON|AIR|rmanent, special +16896|1472|51|5|42|57685.74|0.04|0.07|N|O|1997-07-23|1997-07-04|1997-08-04|DELIVER IN PERSON|MAIL|kages nag. furiously final fo +16897|302|59|1|2|2404.60|0.00|0.07|A|F|1992-09-19|1992-07-24|1992-09-23|DELIVER IN PERSON|SHIP| blithely ironic packages. pendi +16897|1274|49|2|35|41134.45|0.05|0.05|R|F|1992-09-22|1992-07-29|1992-10-22|NONE|AIR|efully ironic dependencies against the s +16897|791|56|3|43|72746.97|0.04|0.03|A|F|1992-10-12|1992-08-15|1992-11-09|TAKE BACK RETURN|RAIL| packages cajole slyly ironi +16897|1376|91|4|19|24270.03|0.02|0.05|A|F|1992-08-04|1992-07-30|1992-08-08|COLLECT COD|FOB|s. special d +16897|1150|87|5|26|27329.90|0.10|0.02|A|F|1992-08-24|1992-08-07|1992-09-12|NONE|SHIP|. pending, pending foxes wake fur +16897|1070|71|6|17|16508.19|0.04|0.02|A|F|1992-06-18|1992-08-27|1992-07-04|COLLECT COD|RAIL|kly final instructions. ca +16898|1790|75|1|50|84589.50|0.07|0.06|N|O|1996-01-29|1995-12-01|1996-02-23|NONE|MAIL|bold deposits hinder final accounts. slyl +16898|1362|77|2|1|1263.36|0.02|0.05|N|O|1995-12-12|1996-01-02|1995-12-17|NONE|TRUCK|ans after the furiously +16899|1453|54|1|29|39279.05|0.05|0.02|N|O|1998-09-25|1998-07-27|1998-10-11|NONE|FOB|regular foxes against the +16899|371|100|2|25|31784.25|0.00|0.02|N|O|1998-07-31|1998-08-19|1998-08-25|NONE|SHIP|e above the +16900|1693|94|1|46|73355.74|0.05|0.02|N|O|1998-07-22|1998-08-04|1998-08-01|NONE|RAIL|ven accounts use +16900|15|41|2|47|43005.47|0.05|0.07|N|O|1998-08-18|1998-07-27|1998-08-31|COLLECT COD|MAIL|nts use alongside of the r +16901|1116|53|1|43|43735.73|0.06|0.07|R|F|1994-04-07|1994-02-10|1994-05-02|DELIVER IN PERSON|RAIL|ilent reque +16901|170|49|2|38|40666.46|0.00|0.06|A|F|1994-03-20|1994-01-12|1994-03-22|NONE|TRUCK|gular instructions sleep +16902|123|24|1|13|13300.56|0.02|0.08|N|O|1997-02-03|1997-03-18|1997-02-19|TAKE BACK RETURN|AIR|lphins. even, +16902|1418|97|2|42|55415.22|0.08|0.02|N|O|1997-03-27|1997-02-28|1997-04-06|NONE|REG AIR|ial excuses use. caref +16902|1939|28|3|13|23932.09|0.02|0.07|N|O|1997-02-03|1997-04-21|1997-02-05|NONE|REG AIR|y special inst +16902|1455|95|4|49|66466.05|0.04|0.02|N|O|1997-03-10|1997-03-19|1997-03-27|TAKE BACK RETURN|RAIL|lly against the slyly even accoun +16903|1031|32|1|34|31689.02|0.06|0.08|N|O|1997-08-04|1997-09-26|1997-09-03|NONE|RAIL| across the regular instructions. quick +16903|1933|22|2|13|23854.09|0.09|0.00|N|O|1997-09-05|1997-09-06|1997-09-28|DELIVER IN PERSON|REG AIR|counts. furiously +16903|1228|66|3|9|10162.98|0.03|0.05|N|O|1997-07-31|1997-10-20|1997-08-27|DELIVER IN PERSON|AIR| courts over the slyly regular requests run +16903|1680|4|4|8|12653.44|0.08|0.03|N|O|1997-10-26|1997-09-07|1997-11-15|NONE|REG AIR|ts according to the furi +16903|884|85|5|16|28558.08|0.07|0.01|N|O|1997-08-15|1997-09-13|1997-09-03|DELIVER IN PERSON|TRUCK|l platelets thra +16903|751|48|6|42|69373.50|0.09|0.07|N|O|1997-08-27|1997-10-25|1997-09-12|COLLECT COD|TRUCK| the carefully ironic deposits. slyly s +16903|653|85|7|25|38841.25|0.07|0.07|N|O|1997-08-22|1997-10-05|1997-08-26|DELIVER IN PERSON|TRUCK|counts wake fluffily bold requests. re +16928|937|40|1|32|58813.76|0.08|0.04|N|O|1998-09-27|1998-07-18|1998-09-30|TAKE BACK RETURN|REG AIR|efully unusual packages. qui +16928|1155|92|2|34|35909.10|0.07|0.06|N|O|1998-09-27|1998-09-09|1998-10-14|NONE|RAIL|ts boost slyly above the p +16928|635|29|3|50|76781.50|0.07|0.05|N|O|1998-08-28|1998-08-25|1998-09-27|NONE|FOB|e. bold, final deposits affix sl +16928|1161|70|4|34|36113.44|0.06|0.03|N|O|1998-07-21|1998-09-02|1998-08-06|DELIVER IN PERSON|TRUCK|boost blithely. frets af +16928|1614|38|5|42|63655.62|0.05|0.05|N|O|1998-10-16|1998-08-01|1998-10-22|COLLECT COD|TRUCK|ons boost fluffily quietly reg +16929|901|70|1|2|3603.80|0.10|0.07|A|F|1994-08-06|1994-10-30|1994-08-17|TAKE BACK RETURN|TRUCK|ding accounts solve within the carefu +16929|1185|22|2|30|32585.40|0.09|0.03|R|F|1994-09-06|1994-09-09|1994-09-11|DELIVER IN PERSON|FOB|eodolites against the slyly final deposi +16930|562|63|1|30|43876.80|0.06|0.05|A|F|1992-11-10|1992-12-31|1992-12-10|DELIVER IN PERSON|FOB|cial platelets sleep. blithely fina +16931|373|30|1|9|11460.33|0.10|0.00|N|O|1998-01-21|1997-12-17|1998-01-23|NONE|AIR|efully above the final, regular requests. +16931|73|99|2|38|36976.66|0.02|0.08|N|O|1997-10-23|1997-11-24|1997-11-14|COLLECT COD|FOB|olites. slyly bold +16931|716|17|3|45|72751.95|0.04|0.04|N|O|1997-10-19|1998-01-04|1997-11-08|TAKE BACK RETURN|AIR|gside of th +16931|1412|52|4|29|38088.89|0.07|0.05|N|O|1997-11-24|1997-12-24|1997-12-03|TAKE BACK RETURN|MAIL|ely. ironic requests against the ev +16931|1049|85|5|35|33251.40|0.08|0.03|N|O|1997-10-29|1997-12-14|1997-11-12|NONE|SHIP|uickly regular theodolites. express theod +16931|988|89|6|38|71781.24|0.10|0.01|N|O|1997-10-22|1997-12-21|1997-11-15|TAKE BACK RETURN|FOB|efully express, express asym +16932|1342|19|1|8|9946.72|0.06|0.07|A|F|1993-05-28|1993-06-24|1993-06-25|DELIVER IN PERSON|TRUCK|e asymptotes. fluffily express theod +16932|748|81|2|21|34623.54|0.10|0.08|A|F|1993-05-19|1993-06-07|1993-06-12|COLLECT COD|MAIL|egular depo +16932|774|7|3|36|60291.72|0.08|0.03|A|F|1993-07-21|1993-05-21|1993-07-27|COLLECT COD|SHIP|he carefully b +16932|1339|78|4|28|34729.24|0.05|0.07|R|F|1993-05-19|1993-06-27|1993-06-04|TAKE BACK RETURN|FOB|heodolites. final packages are quickly qui +16932|861|61|5|33|58141.38|0.04|0.03|A|F|1993-08-11|1993-06-18|1993-08-25|DELIVER IN PERSON|RAIL|ly regular pinto beans am +16932|389|18|6|12|15472.56|0.01|0.03|A|F|1993-05-27|1993-06-03|1993-06-03|DELIVER IN PERSON|MAIL|ithely regular dependencies +16933|1528|29|1|15|21442.80|0.01|0.03|R|F|1994-12-13|1994-12-13|1995-01-01|COLLECT COD|FOB|ts across the dependenc +16933|1191|64|2|37|40411.03|0.04|0.00|R|F|1994-11-16|1995-01-01|1994-12-09|COLLECT COD|TRUCK|ckages. slyly special accounts sle +16933|1450|68|3|6|8108.70|0.07|0.02|A|F|1994-10-21|1994-11-28|1994-11-08|NONE|SHIP|oxes? ironic, bold instructi +16934|1148|49|1|26|27277.64|0.10|0.02|N|O|1997-10-18|1997-10-10|1997-11-03|NONE|RAIL|the carefully unusua +16934|1136|45|2|47|48745.11|0.04|0.07|N|O|1997-08-08|1997-08-28|1997-08-10|TAKE BACK RETURN|MAIL|egular asymptotes cajole n +16934|141|68|3|22|22905.08|0.03|0.07|N|O|1997-09-12|1997-09-10|1997-10-08|TAKE BACK RETURN|AIR|quests affix beyo +16934|1779|6|4|6|10084.62|0.09|0.07|N|O|1997-08-18|1997-09-23|1997-09-11|COLLECT COD|FOB|ing dinos. ca +16934|1883|27|5|8|14279.04|0.01|0.06|N|O|1997-10-29|1997-09-19|1997-11-21|COLLECT COD|SHIP|quests wake blithely blithely pen +16934|129|8|6|5|5145.60|0.08|0.04|N|O|1997-08-17|1997-10-09|1997-08-19|NONE|REG AIR|equests wak +16935|1902|3|1|16|28862.40|0.09|0.00|R|F|1993-01-13|1993-03-14|1993-01-25|COLLECT COD|TRUCK|e carefully regular requ +16935|1740|83|2|45|73878.30|0.05|0.03|A|F|1993-01-29|1993-01-31|1993-02-26|NONE|SHIP|ges boost carefully. deposits are +16935|374|59|3|43|54797.91|0.01|0.02|R|F|1993-01-18|1993-01-29|1993-02-13|TAKE BACK RETURN|FOB|ecial deposits. fluffily bold re +16935|1233|8|4|15|17013.45|0.10|0.01|R|F|1993-02-20|1993-03-16|1993-03-18|TAKE BACK RETURN|REG AIR|l accounts. final, thin +16960|141|42|1|1|1041.14|0.00|0.02|A|F|1992-07-09|1992-06-29|1992-07-13|DELIVER IN PERSON|SHIP|uests. carefully regular +16960|374|75|2|32|40779.84|0.09|0.01|A|F|1992-07-19|1992-08-16|1992-08-14|DELIVER IN PERSON|RAIL|blithely ironic platel +16960|859|59|3|49|86232.65|0.00|0.04|A|F|1992-09-02|1992-06-30|1992-09-29|COLLECT COD|MAIL|o beans haggle +16961|517|8|1|5|7087.55|0.00|0.01|R|F|1994-04-17|1994-03-04|1994-05-05|COLLECT COD|AIR|osits cajole blith +16961|1814|1|2|25|42895.25|0.06|0.08|R|F|1994-04-18|1994-03-28|1994-04-29|DELIVER IN PERSON|SHIP|c, even accounts about th +16961|221|3|3|4|4484.88|0.05|0.03|A|F|1994-04-22|1994-03-22|1994-04-26|NONE|FOB| slyly ironic reques +16962|893|93|1|31|55610.59|0.07|0.02|N|O|1996-10-12|1996-11-22|1996-11-07|TAKE BACK RETURN|RAIL|cial deposits +16962|162|89|2|21|22305.36|0.07|0.02|N|O|1996-12-14|1996-11-15|1997-01-04|TAKE BACK RETURN|MAIL|ithely even as +16962|1929|74|3|27|49434.84|0.10|0.08|N|O|1996-12-10|1996-11-02|1997-01-05|NONE|REG AIR|ing accounts wake furio +16962|828|95|4|31|53593.42|0.05|0.01|N|O|1996-12-03|1996-10-22|1996-12-24|DELIVER IN PERSON|REG AIR|eans. carefully even +16962|1327|28|5|40|49132.80|0.00|0.04|N|O|1996-10-24|1996-12-06|1996-11-05|DELIVER IN PERSON|FOB| according to the furiousl +16962|241|23|6|43|49073.32|0.00|0.03|N|O|1996-12-26|1996-11-27|1997-01-24|DELIVER IN PERSON|RAIL|breach slyly. pinto beans bene +16963|1835|65|1|35|60789.05|0.04|0.07|N|O|1996-07-05|1996-07-07|1996-07-28|COLLECT COD|RAIL|equests: fluffily +16963|1630|13|2|30|45948.90|0.10|0.05|N|O|1996-06-15|1996-07-17|1996-06-18|COLLECT COD|FOB|theodolites are. quickly final +16963|1618|60|3|13|19754.93|0.00|0.07|N|O|1996-07-05|1996-06-24|1996-07-08|NONE|AIR|ing asymptotes across the +16963|157|58|4|35|37000.25|0.05|0.03|N|O|1996-07-08|1996-07-04|1996-08-01|NONE|TRUCK| dependencies x-ra +16964|233|34|1|7|7932.61|0.10|0.05|N|O|1995-12-01|1996-01-09|1995-12-17|NONE|FOB|egular requests lose daringly sheaves. +16965|1618|19|1|40|60784.40|0.04|0.04|N|O|1997-04-01|1997-02-21|1997-04-21|NONE|TRUCK|eep furiously quickly fi +16965|1210|22|2|41|45559.61|0.04|0.07|N|O|1997-03-27|1997-02-10|1997-04-22|COLLECT COD|REG AIR| quietly final accounts detect furiously. +16965|1911|56|3|5|9064.55|0.10|0.06|N|O|1997-01-28|1997-02-21|1997-02-21|DELIVER IN PERSON|MAIL|ites among the unusual platele +16965|1210|11|4|4|4444.84|0.08|0.08|N|O|1997-03-17|1997-02-23|1997-03-18|DELIVER IN PERSON|REG AIR|ges affix furiously ironic deposits. specia +16965|1663|46|5|47|73539.02|0.03|0.08|N|O|1997-01-12|1997-03-01|1997-02-06|DELIVER IN PERSON|TRUCK|ly express packages according to the +16965|1817|47|6|39|67033.59|0.04|0.08|N|O|1997-04-11|1997-01-24|1997-04-19|COLLECT COD|MAIL|even foxes boost; final excuses after t +16965|343|44|7|40|49733.60|0.06|0.01|N|O|1997-04-24|1997-02-09|1997-05-08|NONE|RAIL|ironic packages. fluffily ironic plate +16966|574|75|1|2|2949.14|0.08|0.01|R|F|1994-12-16|1994-12-10|1995-01-05|COLLECT COD|RAIL|e quickly a +16966|942|43|2|19|35015.86|0.04|0.02|A|F|1994-10-20|1994-11-12|1994-11-10|DELIVER IN PERSON|REG AIR|structions should h +16966|1236|37|3|24|27293.52|0.10|0.08|R|F|1994-10-14|1994-10-30|1994-10-21|COLLECT COD|SHIP|decoys. braids according to the forg +16966|298|26|4|28|33552.12|0.05|0.02|A|F|1994-12-08|1994-12-08|1995-01-05|DELIVER IN PERSON|AIR|ously about the final theodolites. quick +16966|983|52|5|15|28259.70|0.01|0.03|R|F|1995-01-23|1994-12-14|1995-01-30|TAKE BACK RETURN|MAIL|uriously special excus +16966|1963|96|6|16|29839.36|0.02|0.06|R|F|1994-10-13|1994-10-30|1994-10-26|TAKE BACK RETURN|SHIP| ideas. blithely special pinto bea +16967|232|87|1|38|43024.74|0.08|0.01|N|O|1995-10-02|1995-11-13|1995-10-22|COLLECT COD|MAIL|the fluffily ironic patterns cajole slyly +16967|1460|39|2|49|66711.54|0.01|0.02|N|O|1995-08-25|1995-09-23|1995-09-02|DELIVER IN PERSON|SHIP|ages. carefully final pinto beans wak +16967|1530|71|3|21|30062.13|0.03|0.02|N|O|1995-10-22|1995-10-29|1995-11-09|DELIVER IN PERSON|TRUCK|ly blithely regular requests. expr +16967|1075|76|4|4|3904.28|0.10|0.01|N|O|1995-09-10|1995-10-23|1995-10-08|COLLECT COD|SHIP|grouches mold furiously re +16967|1005|11|5|20|18120.00|0.04|0.07|N|O|1995-11-14|1995-11-01|1995-12-05|COLLECT COD|AIR| accounts ar +16967|1892|22|6|34|60992.26|0.10|0.01|N|O|1995-08-25|1995-10-09|1995-09-16|TAKE BACK RETURN|TRUCK|l asymptote +16992|448|49|1|29|39104.76|0.09|0.07|R|F|1994-03-29|1994-03-06|1994-04-27|NONE|REG AIR|inal foxes sl +16993|1980|81|1|23|43285.54|0.03|0.01|N|O|1995-11-29|1996-01-26|1995-12-16|NONE|SHIP|lent foxes afte +16993|683|77|2|1|1583.68|0.01|0.07|N|O|1995-11-23|1996-02-15|1995-12-12|NONE|TRUCK|instructions nag blith +16993|1591|92|3|8|11940.72|0.05|0.04|N|O|1995-12-27|1996-01-10|1996-01-21|NONE|MAIL|symptotes by the quickly regular +16993|24|25|4|16|14784.32|0.00|0.03|N|O|1996-03-09|1995-12-18|1996-03-10|NONE|RAIL|he special foxes cajole ab +16993|70|71|5|28|27161.96|0.06|0.02|N|O|1996-02-25|1996-02-13|1996-03-13|NONE|MAIL|scapades. busily pen +16993|1600|41|6|46|69073.60|0.01|0.06|N|O|1996-01-28|1996-01-15|1996-02-03|NONE|SHIP|kly quickly regular instructi +16993|650|51|7|19|29462.35|0.02|0.06|N|O|1996-03-11|1995-12-18|1996-04-03|TAKE BACK RETURN|SHIP|es could sleep carefully depende +16994|1333|72|1|14|17280.62|0.04|0.00|N|O|1996-04-25|1996-06-07|1996-05-20|TAKE BACK RETURN|AIR|s. quickly even requests cajole +16994|77|3|2|30|29312.10|0.04|0.01|N|O|1996-07-21|1996-06-25|1996-07-25|NONE|TRUCK|. carefully even foxes +16995|1124|61|1|37|37929.44|0.07|0.03|R|F|1994-02-17|1994-02-28|1994-03-04|NONE|MAIL|. bold accounts according t +16995|1208|9|2|5|5546.00|0.00|0.00|R|F|1994-01-18|1994-03-11|1994-02-11|TAKE BACK RETURN|REG AIR| detect carefully. even, pending r +16996|1532|13|1|43|61641.79|0.02|0.01|A|F|1992-04-06|1992-03-29|1992-04-11|COLLECT COD|TRUCK|y final packages detect furiously abo +16996|1665|48|2|37|57966.42|0.08|0.07|A|F|1992-03-16|1992-04-27|1992-04-15|COLLECT COD|RAIL|nst the furiously bold instructions: caref +16996|1391|92|3|5|6461.95|0.05|0.00|A|F|1992-05-08|1992-03-30|1992-05-20|COLLECT COD|FOB|, even packages in +16996|101|28|4|11|11012.10|0.07|0.07|A|F|1992-04-30|1992-04-18|1992-05-07|DELIVER IN PERSON|TRUCK|ckly even pack +16997|1880|24|1|26|46328.88|0.03|0.06|N|O|1997-11-05|1997-11-01|1997-11-29|DELIVER IN PERSON|AIR|ctions boost b +16997|829|30|2|6|10378.92|0.03|0.00|N|O|1997-09-30|1997-09-21|1997-10-19|COLLECT COD|REG AIR|hely. pinto beans above the +16998|1664|88|1|35|54798.10|0.01|0.02|N|O|1996-04-22|1996-06-21|1996-05-20|COLLECT COD|FOB|s x-ray furiously quickl +16998|523|84|2|48|68328.96|0.02|0.02|N|O|1996-05-25|1996-06-11|1996-06-04|TAKE BACK RETURN|FOB|the pending, +16998|1552|73|3|10|14535.50|0.01|0.08|N|O|1996-05-08|1996-05-31|1996-06-01|TAKE BACK RETURN|SHIP| to the carefully enticing theodolites. fin +16998|1613|37|4|24|36350.64|0.10|0.05|N|O|1996-05-23|1996-06-25|1996-06-14|DELIVER IN PERSON|FOB|r tithes after the fluffily bold requ +16998|120|73|5|32|32643.84|0.03|0.03|N|O|1996-05-16|1996-06-02|1996-05-27|DELIVER IN PERSON|FOB|cajole blithely a +16999|1963|8|1|6|11189.76|0.07|0.04|A|F|1994-03-22|1994-03-07|1994-03-30|DELIVER IN PERSON|SHIP|lly ruthless +16999|1033|34|2|28|26152.84|0.05|0.00|R|F|1994-02-15|1994-04-14|1994-02-19|COLLECT COD|REG AIR|jole final accounts. slyly express id +16999|40|91|3|5|4700.20|0.07|0.01|R|F|1994-05-02|1994-03-11|1994-05-06|COLLECT COD|TRUCK|al pinto beans. theod +16999|281|63|4|7|8268.96|0.03|0.02|R|F|1994-01-22|1994-03-03|1994-02-21|NONE|FOB| foxes sleep regular, +16999|1136|45|5|44|45633.72|0.00|0.08|R|F|1994-02-05|1994-04-16|1994-03-02|NONE|AIR|lar theodolites. furiously pen +16999|128|55|6|30|30843.60|0.03|0.08|A|F|1994-04-08|1994-02-21|1994-04-14|TAKE BACK RETURN|RAIL|cross the re +16999|1226|27|7|11|12399.42|0.07|0.06|R|F|1994-04-06|1994-03-21|1994-05-05|DELIVER IN PERSON|FOB|ts haggle carefully +17024|1767|52|1|26|43387.76|0.00|0.01|A|F|1994-11-24|1994-12-27|1994-12-01|DELIVER IN PERSON|FOB|gular deposits +17024|859|59|2|7|12318.95|0.06|0.00|A|F|1994-11-04|1994-12-08|1994-11-06|NONE|MAIL| furiously unusual requests across the fre +17024|420|50|3|50|66021.00|0.09|0.05|R|F|1994-12-01|1994-11-13|1994-12-27|COLLECT COD|TRUCK|ly quickly silent foxes. even pla +17025|1433|34|1|1|1334.43|0.05|0.00|N|O|1997-01-20|1997-02-06|1997-02-04|TAKE BACK RETURN|FOB|counts abo +17025|839|40|2|23|40016.09|0.06|0.01|N|O|1997-02-15|1997-01-27|1997-02-27|NONE|REG AIR|uickly even platelet +17025|1858|2|3|6|10559.10|0.01|0.07|N|O|1997-02-18|1997-02-04|1997-03-05|DELIVER IN PERSON|FOB|lphins cajole am +17026|66|17|1|46|44438.76|0.07|0.08|N|O|1996-07-04|1996-08-26|1996-07-25|DELIVER IN PERSON|REG AIR|ounts about the blithely final foxes sleep +17026|360|89|2|32|40331.52|0.07|0.07|N|O|1996-10-09|1996-09-07|1996-10-23|NONE|SHIP|blithely. final excuses on the b +17026|130|83|3|42|43265.46|0.03|0.00|N|O|1996-07-26|1996-08-08|1996-07-28|TAKE BACK RETURN|RAIL| through the express accou +17026|1835|79|4|2|3473.66|0.04|0.04|N|O|1996-07-16|1996-08-28|1996-08-04|DELIVER IN PERSON|AIR|ular requests. furiousl +17026|1638|80|5|9|13856.67|0.02|0.07|N|O|1996-08-26|1996-07-27|1996-09-08|DELIVER IN PERSON|REG AIR|its sleep around the slyly special the +17026|915|16|6|40|72636.40|0.04|0.05|N|O|1996-07-13|1996-07-16|1996-07-17|DELIVER IN PERSON|REG AIR|uests. requests wake blithely ironic +17026|1733|18|7|42|68658.66|0.00|0.07|N|O|1996-09-06|1996-08-28|1996-09-22|DELIVER IN PERSON|AIR|he blithely ironic +17027|1728|29|1|36|58669.92|0.09|0.04|N|O|1996-03-12|1996-02-13|1996-03-18|DELIVER IN PERSON|AIR|uickly even asymptotes according +17027|435|94|2|19|25373.17|0.01|0.01|N|O|1995-12-13|1996-01-18|1995-12-29|NONE|REG AIR|l ideas. silen +17027|1334|11|3|18|22235.94|0.10|0.08|N|O|1996-01-08|1996-02-19|1996-01-25|NONE|AIR| the ironic, +17027|13|64|4|48|43824.48|0.09|0.06|N|O|1996-01-11|1996-01-15|1996-01-30|DELIVER IN PERSON|RAIL|y ironic foxes a +17027|201|83|5|43|47351.60|0.07|0.01|N|O|1996-03-20|1996-02-23|1996-04-05|TAKE BACK RETURN|AIR|deas. platelets are blithely evenly bo +17027|935|70|6|12|22031.16|0.04|0.08|N|O|1995-12-02|1996-02-17|1995-12-26|TAKE BACK RETURN|SHIP| nag blithely. blithely ex +17028|1410|28|1|38|49833.58|0.07|0.00|A|F|1994-12-20|1994-11-16|1995-01-19|COLLECT COD|REG AIR|to the slyly r +17028|1531|52|2|20|28650.60|0.00|0.03|R|F|1994-12-31|1995-01-14|1995-01-27|DELIVER IN PERSON|REG AIR|ss packages lose fluffil +17028|1995|96|3|4|7587.96|0.01|0.02|R|F|1994-11-06|1994-12-03|1994-11-19|COLLECT COD|RAIL|blithely clo +17028|920|23|4|32|58269.44|0.00|0.04|A|F|1995-01-14|1994-11-16|1995-02-04|NONE|AIR|regular depo +17028|1622|46|5|35|53326.70|0.06|0.02|A|F|1994-12-20|1994-12-19|1995-01-14|NONE|AIR|refully reg +17029|1906|39|1|23|41581.70|0.08|0.04|N|O|1997-11-30|1997-12-12|1997-12-18|COLLECT COD|FOB|nal deposits haggle fluffily blithely +17029|1351|52|2|9|11271.15|0.01|0.04|N|O|1997-10-19|1997-12-18|1997-11-02|COLLECT COD|SHIP|ly ironic accounts against the c +17029|1842|72|3|29|50571.36|0.10|0.08|N|O|1998-01-24|1998-01-01|1998-02-09|DELIVER IN PERSON|RAIL|equests nag quickly ironic accounts. i +17029|1857|1|4|42|73871.70|0.01|0.04|N|O|1997-11-17|1997-11-18|1997-12-02|DELIVER IN PERSON|FOB|ntil the silent instru +17030|738|39|1|14|22942.22|0.10|0.06|N|O|1997-08-04|1997-08-31|1997-08-20|DELIVER IN PERSON|REG AIR|ithely. slyly express +17030|1003|74|2|43|38872.00|0.05|0.02|N|O|1997-08-13|1997-10-24|1997-09-06|TAKE BACK RETURN|AIR|furiously furiously r +17030|146|47|3|16|16738.24|0.08|0.00|N|O|1997-08-04|1997-09-24|1997-08-07|NONE|MAIL|kly regular foxes +17030|800|33|4|33|56126.40|0.08|0.04|N|O|1997-11-24|1997-09-26|1997-12-17|NONE|REG AIR|according to the +17030|948|17|5|36|66561.84|0.06|0.07|N|O|1997-08-29|1997-09-06|1997-09-16|COLLECT COD|RAIL|structions. quickly silent pattern +17030|38|14|6|31|29078.93|0.08|0.03|N|O|1997-10-11|1997-10-01|1997-11-06|COLLECT COD|TRUCK|egular theod +17030|1747|48|7|17|28028.58|0.00|0.02|N|O|1997-08-09|1997-10-17|1997-08-28|COLLECT COD|RAIL|y ironic packages +17031|1781|66|1|24|40386.72|0.00|0.05|N|O|1996-12-28|1996-12-12|1997-01-16|COLLECT COD|MAIL|uriously always regul +17031|297|79|2|1|1197.29|0.06|0.06|N|O|1996-11-24|1996-10-30|1996-12-09|NONE|SHIP|ar, regular foxes haggle slyly acco +17056|17|68|1|42|38514.42|0.07|0.00|N|O|1998-11-01|1998-10-13|1998-11-04|DELIVER IN PERSON|RAIL|eposits cajole +17056|955|56|2|49|90941.55|0.01|0.06|N|O|1998-10-11|1998-08-29|1998-10-14|COLLECT COD|TRUCK|ously silent inst +17056|1304|19|3|24|28927.20|0.00|0.08|N|O|1998-11-17|1998-10-21|1998-11-25|COLLECT COD|AIR|l deposits +17056|466|25|4|36|49192.56|0.00|0.02|N|O|1998-08-09|1998-08-23|1998-08-30|COLLECT COD|MAIL|ress requests solve furiously +17056|1194|3|5|50|54759.50|0.03|0.03|N|O|1998-10-31|1998-10-06|1998-11-27|NONE|REG AIR|s. even, unusual p +17057|1757|58|1|24|39810.00|0.09|0.06|N|O|1995-06-25|1995-07-05|1995-07-23|TAKE BACK RETURN|SHIP|thely special theodolites was closely since +17058|1354|31|1|28|35149.80|0.07|0.01|A|F|1995-03-06|1995-03-21|1995-03-18|COLLECT COD|MAIL|s wake regul +17058|1197|6|2|9|9883.71|0.05|0.03|R|F|1995-01-14|1995-03-07|1995-02-04|TAKE BACK RETURN|MAIL|ts wake quickly e +17058|1355|56|3|10|12563.50|0.06|0.00|R|F|1995-02-14|1995-03-16|1995-03-05|NONE|MAIL| slyly ironic packages. unu +17058|1978|79|4|1|1879.97|0.03|0.06|A|F|1995-03-23|1995-02-25|1995-03-24|COLLECT COD|SHIP|he furiously special accoun +17058|303|4|5|29|34895.70|0.03|0.06|A|F|1995-01-09|1995-03-26|1995-02-03|DELIVER IN PERSON|FOB| across the final, f +17058|1651|93|6|34|52790.10|0.08|0.03|R|F|1995-04-18|1995-03-13|1995-05-13|DELIVER IN PERSON|FOB|ts about the +17059|812|13|1|19|32543.39|0.02|0.02|N|O|1998-08-01|1998-06-30|1998-08-11|DELIVER IN PERSON|TRUCK|yly regular deposits print blith +17059|1946|79|2|25|46198.50|0.09|0.02|N|O|1998-04-10|1998-05-27|1998-04-26|NONE|SHIP|ites boost along the furious pla +17060|1370|47|1|41|52126.17|0.05|0.05|N|O|1997-09-08|1997-07-08|1997-09-18|COLLECT COD|FOB|quests according +17061|131|84|1|10|10311.30|0.09|0.02|R|F|1992-11-10|1993-01-02|1992-12-02|TAKE BACK RETURN|SHIP|ost across the final instruction +17061|200|53|2|24|26404.80|0.00|0.07|R|F|1993-02-16|1992-12-14|1993-03-13|NONE|MAIL|onic frets among the express, final +17061|27|78|3|2|1854.04|0.10|0.05|A|F|1993-02-13|1992-12-22|1993-03-13|COLLECT COD|FOB|sly special asymptotes. blit +17061|1768|11|4|8|13358.08|0.04|0.00|R|F|1993-02-04|1993-01-27|1993-02-14|DELIVER IN PERSON|SHIP|sleep furiously furiously ironic depen +17061|354|83|5|46|57700.10|0.05|0.07|A|F|1992-12-10|1993-01-26|1993-01-08|COLLECT COD|SHIP|r packages are fluffily regular +17062|1358|35|1|43|54152.05|0.01|0.02|N|O|1997-10-29|1997-10-29|1997-11-19|COLLECT COD|RAIL|y ironic accou +17062|1477|56|2|18|24812.46|0.06|0.00|N|O|1997-10-01|1997-11-25|1997-10-28|COLLECT COD|FOB|nic requests integrate slyly carefully ir +17063|1584|5|1|2|2971.16|0.07|0.06|N|O|1997-10-13|1997-10-13|1997-11-08|DELIVER IN PERSON|SHIP|c packages nag never within the sile +17063|1768|53|2|24|40074.24|0.03|0.06|N|O|1997-10-04|1997-10-05|1997-10-14|DELIVER IN PERSON|REG AIR|sts try to print against the +17063|630|62|3|44|67347.72|0.08|0.07|N|O|1997-11-05|1997-09-02|1997-12-03|NONE|AIR|eans along the final theodolites +17063|1963|52|4|29|54083.84|0.09|0.06|N|O|1997-09-20|1997-09-19|1997-10-12|TAKE BACK RETURN|REG AIR| blithely after the packag +17063|301|2|5|37|44448.10|0.06|0.01|N|O|1997-09-15|1997-10-23|1997-10-13|DELIVER IN PERSON|FOB|onic deposits. iro +17088|1507|28|1|14|19719.00|0.09|0.05|R|F|1992-04-04|1992-05-04|1992-04-23|NONE|FOB|ep blithely according to t +17089|1567|48|1|37|54336.72|0.02|0.04|N|O|1997-08-15|1997-08-25|1997-09-03|DELIVER IN PERSON|REG AIR| x-ray quickly above the carefully regu +17089|1623|6|2|6|9147.72|0.08|0.03|N|O|1997-09-25|1997-07-22|1997-10-18|NONE|FOB|eposits haggle fur +17089|1076|77|3|41|40059.87|0.10|0.04|N|O|1997-10-10|1997-09-03|1997-10-20|COLLECT COD|FOB|ng to the +17089|1847|77|4|10|17488.40|0.10|0.00|N|O|1997-07-02|1997-08-02|1997-07-11|NONE|REG AIR| the unusual, unusua +17089|1028|99|5|14|13006.28|0.02|0.01|N|O|1997-09-14|1997-08-17|1997-10-14|TAKE BACK RETURN|MAIL|eposits wake carefully. fluffily regu +17090|1806|7|1|48|81974.40|0.10|0.00|R|F|1993-06-07|1993-07-20|1993-06-16|NONE|FOB|ously even packages are +17090|1090|61|2|44|43607.96|0.02|0.06|A|F|1993-07-25|1993-06-15|1993-08-13|DELIVER IN PERSON|AIR|oss the quickly express theodolites u +17090|1467|85|3|12|16421.52|0.02|0.05|A|F|1993-08-28|1993-06-19|1993-09-17|TAKE BACK RETURN|RAIL|ets cajole idly carefully ironic gifts. sp +17090|1355|94|4|8|10050.80|0.06|0.08|A|F|1993-08-19|1993-07-26|1993-09-03|DELIVER IN PERSON|REG AIR|deposits are fluffily. furiously +17091|931|34|1|20|36638.60|0.01|0.08|A|F|1992-09-13|1992-09-23|1992-10-02|COLLECT COD|RAIL|t the carefully unusual packages. ca +17091|672|35|2|27|42462.09|0.00|0.08|A|F|1992-07-25|1992-09-20|1992-07-26|DELIVER IN PERSON|REG AIR|c packages. sile +17091|1880|67|3|46|81966.48|0.08|0.04|R|F|1992-10-19|1992-09-03|1992-10-30|COLLECT COD|FOB|final accounts nag fluffily th +17092|285|86|1|16|18964.48|0.06|0.06|N|O|1997-01-23|1996-12-05|1997-02-06|DELIVER IN PERSON|REG AIR|usual platelets above the slyly regular p +17092|481|69|2|9|12433.32|0.01|0.07|N|O|1996-11-30|1996-11-20|1996-12-21|DELIVER IN PERSON|REG AIR| pinto beans poach blithely +17092|1886|73|3|48|85818.24|0.04|0.00|N|O|1996-09-30|1996-11-14|1996-10-19|COLLECT COD|REG AIR|s. quickly express theodolites nag slyly fi +17092|67|93|4|32|30945.92|0.01|0.03|N|O|1996-10-25|1996-12-26|1996-10-29|DELIVER IN PERSON|SHIP| blithely special p +17092|1609|51|5|10|15106.00|0.05|0.01|N|O|1996-12-12|1996-12-10|1996-12-18|DELIVER IN PERSON|TRUCK|. final ideas integ +17092|1412|13|6|30|39402.30|0.04|0.01|N|O|1997-01-12|1996-11-11|1997-01-30|COLLECT COD|REG AIR|he special +17092|272|54|7|29|33995.83|0.02|0.04|N|O|1997-01-22|1996-11-04|1997-02-16|DELIVER IN PERSON|TRUCK|e furiously ruthlessly final deposits. +17093|1067|73|1|24|23233.44|0.10|0.04|A|F|1992-04-07|1992-05-04|1992-05-05|DELIVER IN PERSON|MAIL|ckages cajole carefully sl +17093|578|39|2|9|13307.13|0.06|0.03|A|F|1992-02-15|1992-04-04|1992-03-09|DELIVER IN PERSON|SHIP|ticingly final courts nag express, p +17093|260|61|3|31|35968.06|0.09|0.06|A|F|1992-05-03|1992-03-14|1992-05-21|TAKE BACK RETURN|RAIL|ructions wake slyly among the +17093|1359|98|4|40|50414.00|0.00|0.01|R|F|1992-04-19|1992-04-01|1992-05-05|DELIVER IN PERSON|FOB|ully special escapades unwind carefully abo +17094|1418|19|1|25|32985.25|0.03|0.08|N|O|1996-09-30|1996-09-23|1996-10-09|NONE|REG AIR|ic asymptotes. slyly bold deposits use fur +17094|254|36|2|15|17313.75|0.01|0.03|N|O|1996-08-04|1996-08-29|1996-09-02|TAKE BACK RETURN|SHIP| requests except the carefully +17094|583|44|3|41|60826.78|0.08|0.03|N|O|1996-10-03|1996-09-26|1996-10-15|COLLECT COD|REG AIR| carefully even packages. final depe +17094|1330|69|4|21|25857.93|0.04|0.05|N|O|1996-08-20|1996-09-16|1996-08-21|TAKE BACK RETURN|MAIL|! carefully even theodolites along the +17094|1059|60|5|49|47042.45|0.08|0.05|N|O|1996-09-14|1996-09-27|1996-10-02|NONE|FOB|regular, even foxes +17094|436|95|6|41|54793.63|0.10|0.00|N|O|1996-10-03|1996-08-09|1996-10-23|TAKE BACK RETURN|RAIL|haggle carefully even fo +17094|1164|73|7|18|19172.88|0.01|0.02|N|O|1996-09-18|1996-09-24|1996-09-19|DELIVER IN PERSON|REG AIR|otes x-ray across +17095|1370|85|1|20|25427.40|0.07|0.07|N|O|1997-09-15|1997-11-05|1997-10-05|COLLECT COD|RAIL|into beans haggle fluffily. never special d +17095|1987|32|2|6|11333.88|0.08|0.08|N|O|1997-08-21|1997-10-07|1997-09-07|NONE|TRUCK|furiously about the pending, exp +17095|1462|63|3|9|12271.14|0.10|0.04|N|O|1997-10-04|1997-09-18|1997-10-28|NONE|RAIL|hely furiously final pac +17095|859|93|4|34|59834.90|0.10|0.00|N|O|1997-08-22|1997-09-12|1997-09-17|TAKE BACK RETURN|MAIL|y. packages according to the b +17095|1307|22|5|21|25374.30|0.08|0.04|N|O|1997-11-25|1997-11-02|1997-12-10|NONE|TRUCK|requests might nod carefully always un +17120|945|80|1|21|38764.74|0.02|0.00|N|O|1998-02-27|1998-01-20|1998-03-05|TAKE BACK RETURN|FOB|ublate furiousl +17120|1961|6|2|9|16766.64|0.04|0.06|N|O|1997-12-08|1998-01-27|1997-12-21|NONE|SHIP|rate slyly iro +17121|221|3|1|50|56061.00|0.00|0.05|N|O|1997-04-22|1997-05-12|1997-05-21|NONE|REG AIR| foxes sleep slyly f +17121|149|2|2|18|18884.52|0.10|0.02|N|O|1997-06-13|1997-05-09|1997-06-21|NONE|RAIL|pendencies among the slowly ironic packages +17121|1691|74|3|34|54151.46|0.00|0.01|N|O|1997-03-14|1997-05-27|1997-03-17|TAKE BACK RETURN|MAIL|kages. carefully bold foxes w +17121|1454|55|4|13|17620.85|0.07|0.00|N|O|1997-05-31|1997-04-08|1997-06-03|COLLECT COD|REG AIR|y among the +17121|171|24|5|22|23565.74|0.01|0.06|N|O|1997-03-24|1997-04-28|1997-04-19|NONE|FOB|ash packages. final packages above the b +17122|206|7|1|11|12168.20|0.06|0.06|N|O|1996-09-30|1996-12-23|1996-10-04|TAKE BACK RETURN|REG AIR| blithely silen +17122|1393|8|2|24|31065.36|0.10|0.06|N|O|1996-11-03|1996-11-15|1996-11-22|TAKE BACK RETURN|MAIL|nto beans boost. fluffily unusual pla +17122|883|17|3|40|71355.20|0.07|0.06|N|O|1996-09-26|1996-12-18|1996-10-25|COLLECT COD|TRUCK|ns nag accounts. slyly +17123|1285|97|1|19|22539.32|0.03|0.03|A|F|1993-12-29|1994-01-04|1994-01-28|NONE|MAIL|y express package +17123|972|75|2|48|89902.56|0.06|0.06|R|F|1993-11-20|1993-11-25|1993-12-09|DELIVER IN PERSON|TRUCK|inst the quickly final do +17123|452|53|3|28|37868.60|0.00|0.08|A|F|1994-01-02|1994-01-01|1994-01-24|COLLECT COD|AIR|ven ideas. unusua +17123|1846|90|4|13|22721.92|0.03|0.01|R|F|1993-11-20|1993-12-25|1993-12-07|NONE|MAIL|lets haggle carefully above the f +17124|1102|75|1|33|33102.30|0.03|0.04|A|F|1994-12-14|1995-01-19|1995-01-10|TAKE BACK RETURN|SHIP|gular, ironic requests along the wa +17124|732|97|2|49|80003.77|0.10|0.02|A|F|1994-12-16|1994-12-18|1994-12-17|COLLECT COD|REG AIR|jole quickly-- slyly bold reques +17124|53|54|3|10|9530.50|0.06|0.08|A|F|1995-02-22|1995-01-09|1995-03-17|NONE|SHIP|r packages could +17124|1488|28|4|10|13894.80|0.00|0.00|R|F|1994-11-20|1995-01-14|1994-12-12|TAKE BACK RETURN|RAIL| even, silent dolphins nag blithely. +17124|1159|68|5|46|48766.90|0.08|0.02|A|F|1994-12-01|1994-12-06|1994-12-24|DELIVER IN PERSON|REG AIR|unts wake slyly. furiously +17125|373|2|1|41|52208.17|0.03|0.06|N|O|1996-09-30|1996-10-06|1996-10-25|NONE|MAIL|final grouches according +17125|289|90|2|18|21407.04|0.05|0.04|N|O|1996-09-25|1996-10-20|1996-10-17|DELIVER IN PERSON|FOB|x fluffily acr +17125|1102|39|3|21|21065.10|0.02|0.00|N|O|1996-09-23|1996-09-27|1996-09-26|COLLECT COD|TRUCK|ly ironic instructions haggle +17125|1095|31|4|11|10956.99|0.00|0.06|N|O|1996-08-15|1996-09-11|1996-08-31|COLLECT COD|REG AIR|sly unusual +17125|91|92|5|40|39643.60|0.08|0.03|N|O|1996-08-12|1996-10-25|1996-08-27|TAKE BACK RETURN|MAIL|ronic deposits +17125|19|45|6|5|4595.05|0.05|0.06|N|O|1996-10-31|1996-09-12|1996-11-28|NONE|RAIL|y final theodolit +17125|1938|71|7|19|34958.67|0.04|0.05|N|O|1996-09-16|1996-11-01|1996-10-07|COLLECT COD|TRUCK|y unusual deposits are carefully. +17126|482|70|1|38|52534.24|0.07|0.06|A|F|1993-04-16|1993-02-28|1993-05-01|COLLECT COD|TRUCK| ideas are furiously regular ide +17126|1054|55|2|14|13370.70|0.10|0.02|A|F|1993-02-11|1993-01-18|1993-02-28|DELIVER IN PERSON|SHIP|ts cajole caref +17127|1744|71|1|9|14811.66|0.00|0.03|N|O|1997-01-08|1997-02-16|1997-01-21|NONE|FOB|. blithely silent inst +17127|421|80|2|22|29071.24|0.09|0.08|N|O|1997-02-05|1997-03-13|1997-02-08|COLLECT COD|RAIL|ly final packages haggl +17127|282|10|3|42|49655.76|0.02|0.07|N|O|1997-02-16|1997-03-10|1997-03-18|NONE|REG AIR|ests cajole slyly. unusual, bold instr +17127|1139|76|4|14|14561.82|0.10|0.04|N|O|1997-04-15|1997-02-25|1997-04-28|DELIVER IN PERSON|MAIL|st the furiously re +17127|1564|45|5|49|71812.44|0.05|0.04|N|O|1997-03-02|1997-03-21|1997-03-03|DELIVER IN PERSON|AIR| furiously busy +17152|150|51|1|3|3150.45|0.04|0.06|A|F|1992-06-17|1992-04-12|1992-06-23|NONE|SHIP|ckly ironic pinto beans. regular, +17152|1564|65|2|10|14655.60|0.03|0.01|A|F|1992-07-12|1992-05-11|1992-07-18|NONE|RAIL| requests serve about t +17152|919|20|3|14|25478.74|0.00|0.06|A|F|1992-05-13|1992-05-07|1992-06-02|NONE|REG AIR|ic foxes. unusual, regular id +17152|1807|51|4|14|23923.20|0.07|0.00|R|F|1992-04-12|1992-06-06|1992-04-27|NONE|RAIL|unusual requests wake by the +17152|908|77|5|33|59693.70|0.05|0.00|R|F|1992-04-15|1992-05-08|1992-05-01|COLLECT COD|FOB|es haggle +17152|88|64|6|44|43475.52|0.07|0.06|A|F|1992-03-14|1992-06-01|1992-03-17|TAKE BACK RETURN|RAIL| ironic requests wake. +17153|1669|70|1|43|67538.38|0.02|0.01|N|O|1996-11-23|1996-09-28|1996-12-01|COLLECT COD|SHIP|uctions grow ab +17153|1033|69|2|48|44833.44|0.00|0.08|N|O|1996-10-02|1996-10-04|1996-10-13|COLLECT COD|SHIP|instructions cajole +17153|1451|52|3|49|66270.05|0.05|0.07|N|O|1996-08-24|1996-09-15|1996-09-17|NONE|SHIP|ke blithely along the platelets. slyly +17153|1774|59|4|29|48597.33|0.06|0.04|N|O|1996-09-06|1996-10-08|1996-09-29|TAKE BACK RETURN|RAIL| blithely regular acco +17153|1150|23|5|50|52557.50|0.07|0.07|N|O|1996-10-18|1996-09-28|1996-11-10|DELIVER IN PERSON|AIR| fluffily across the carefully fi +17154|1283|58|1|37|43818.36|0.10|0.07|N|O|1998-06-15|1998-07-31|1998-06-26|NONE|MAIL|s. bold dependencies are blithely a +17155|1651|34|1|12|18631.80|0.10|0.04|A|F|1994-05-05|1994-04-06|1994-05-18|COLLECT COD|REG AIR| the carefully regular theodolites +17155|1409|49|2|34|44553.60|0.03|0.00|A|F|1994-03-31|1994-03-25|1994-04-28|TAKE BACK RETURN|RAIL|hely ironic i +17155|1790|91|3|50|84589.50|0.08|0.01|R|F|1994-04-18|1994-04-29|1994-05-08|NONE|TRUCK|onic packages solve +17155|1341|18|4|16|19877.44|0.05|0.07|R|F|1994-03-22|1994-04-25|1994-04-06|COLLECT COD|MAIL|leep furiously furiou +17155|685|79|5|24|38056.32|0.01|0.07|R|F|1994-02-10|1994-03-25|1994-02-27|DELIVER IN PERSON|REG AIR|ccounts are fluffi +17155|1765|66|6|37|61670.12|0.06|0.01|R|F|1994-04-21|1994-03-08|1994-04-25|TAKE BACK RETURN|TRUCK| waters use fluffily +17156|1191|64|1|10|10921.90|0.10|0.08|N|O|1998-02-13|1998-04-14|1998-03-15|TAKE BACK RETURN|FOB| the slyly pend +17156|938|73|2|34|62523.62|0.08|0.01|N|O|1998-03-20|1998-03-21|1998-04-07|COLLECT COD|REG AIR|y final theodolites cajole fluff +17156|666|29|3|40|62666.40|0.04|0.05|N|O|1998-05-27|1998-04-18|1998-06-23|COLLECT COD|MAIL|l pinto beans are carefully b +17156|534|95|4|9|12910.77|0.06|0.01|N|O|1998-02-23|1998-04-22|1998-03-05|TAKE BACK RETURN|FOB| about the ideas. express e +17156|1483|1|5|2|2768.96|0.02|0.06|N|O|1998-05-27|1998-03-04|1998-06-17|COLLECT COD|SHIP|s. requests shall use carefully r +17156|1318|33|6|35|42675.85|0.09|0.03|N|O|1998-03-14|1998-03-31|1998-04-01|DELIVER IN PERSON|AIR| blithely bold +17157|693|25|1|2|3187.38|0.02|0.03|A|F|1992-11-20|1992-11-30|1992-12-12|NONE|AIR| across the +17157|1755|56|2|40|66270.00|0.02|0.04|R|F|1992-12-15|1992-11-07|1993-01-11|NONE|FOB|ntain. deposits detect blithely even req +17158|175|2|1|39|41931.63|0.09|0.05|R|F|1993-07-01|1993-06-22|1993-07-11|NONE|SHIP|ost slyly. carefully final +17159|1797|40|1|8|13590.32|0.10|0.01|N|O|1996-08-20|1996-10-23|1996-08-21|COLLECT COD|AIR|requests wake blithely according to th +17159|1846|47|2|10|17478.40|0.05|0.00|N|O|1996-09-24|1996-10-03|1996-10-07|TAKE BACK RETURN|MAIL|oss the regular +17159|1394|33|3|19|24612.41|0.03|0.00|N|O|1996-11-02|1996-11-10|1996-11-05|TAKE BACK RETURN|FOB|al accounts wake qu +17159|1660|61|4|44|68713.04|0.10|0.08|N|O|1996-09-11|1996-10-14|1996-10-09|COLLECT COD|SHIP|s. blithely final instructi +17184|1040|11|1|41|38582.64|0.07|0.03|N|O|1997-05-16|1997-04-06|1997-05-28|COLLECT COD|FOB|lites. slyly express deposits +17184|1027|63|2|48|44544.96|0.03|0.06|N|O|1997-03-04|1997-04-06|1997-03-31|DELIVER IN PERSON|RAIL|cajole across t +17185|1217|29|1|6|6709.26|0.09|0.01|A|F|1994-12-19|1994-12-15|1994-12-27|DELIVER IN PERSON|REG AIR| are quickly i +17185|1881|25|2|6|10697.28|0.07|0.02|A|F|1994-11-05|1995-01-11|1994-11-27|NONE|REG AIR|oss the carefully sile +17185|481|11|3|11|15196.28|0.03|0.04|R|F|1994-12-09|1994-12-29|1994-12-19|TAKE BACK RETURN|FOB|deposits are. regular courts dazzle qui +17185|1011|12|4|3|2736.03|0.10|0.08|R|F|1995-01-10|1995-01-15|1995-01-29|COLLECT COD|MAIL|ackages wake slyly above the blithely p +17185|376|61|5|11|14040.07|0.03|0.00|A|F|1994-11-30|1994-12-24|1994-12-12|COLLECT COD|TRUCK|usly even accounts ab +17185|697|60|6|22|35149.18|0.05|0.08|A|F|1995-02-09|1995-01-25|1995-02-25|NONE|REG AIR|ole blithely along the dep +17186|300|55|1|34|40810.20|0.00|0.05|R|F|1994-04-20|1994-03-15|1994-05-16|COLLECT COD|SHIP|ccounts affix; f +17186|1141|50|2|20|20842.80|0.10|0.01|R|F|1994-05-27|1994-04-23|1994-06-13|COLLECT COD|REG AIR|s are blithely according to the slyly +17186|1128|1|3|14|14407.68|0.00|0.05|A|F|1994-04-13|1994-04-12|1994-05-09|DELIVER IN PERSON|MAIL|y regular excuses cajole a +17186|151|4|4|1|1051.15|0.01|0.02|A|F|1994-02-11|1994-04-19|1994-02-17|TAKE BACK RETURN|REG AIR|e carefully deposits. bli +17186|78|29|5|48|46947.36|0.06|0.06|A|F|1994-03-25|1994-04-07|1994-04-22|COLLECT COD|AIR|al accounts should haggle fluffily acc +17186|1778|21|6|33|55432.41|0.06|0.01|R|F|1994-05-20|1994-02-26|1994-06-12|TAKE BACK RETURN|RAIL|p blithely instr +17186|136|63|7|21|21758.73|0.06|0.03|A|F|1994-05-20|1994-03-04|1994-05-28|NONE|TRUCK|he furiously final braids. bravel +17187|1782|9|1|26|43778.28|0.05|0.05|R|F|1992-10-02|1992-11-16|1992-10-21|TAKE BACK RETURN|MAIL|nal packages wake after t +17187|330|31|2|11|13533.63|0.08|0.07|A|F|1992-11-19|1992-12-18|1992-12-11|NONE|MAIL|e past the special, pending dugou +17187|1979|68|3|27|50786.19|0.08|0.06|A|F|1992-10-29|1992-11-22|1992-11-15|NONE|FOB|es. furiously bold depos +17187|770|35|4|19|31744.63|0.08|0.08|R|F|1992-12-13|1992-12-16|1992-12-20|COLLECT COD|RAIL|old packages. even, ironic theodolites main +17187|1284|85|5|26|30817.28|0.00|0.05|A|F|1992-12-27|1992-12-20|1992-12-29|NONE|REG AIR|s use fluffily. quickly express frays caj +17187|1682|24|6|44|69681.92|0.09|0.01|R|F|1993-01-22|1992-12-14|1993-01-28|COLLECT COD|REG AIR|ding instructions haggle carefully +17187|765|66|7|6|9994.56|0.00|0.02|R|F|1992-10-04|1992-12-13|1992-10-29|NONE|REG AIR|lithely. care +17188|1560|61|1|6|8769.36|0.08|0.05|N|O|1998-03-10|1998-03-29|1998-03-29|NONE|AIR|l excuses slee +17188|758|59|2|24|39810.00|0.04|0.04|N|O|1998-04-16|1998-02-25|1998-05-13|NONE|MAIL|gle never. slyly silent accounts hag +17188|851|18|3|21|36788.85|0.01|0.00|N|O|1998-02-05|1998-03-11|1998-02-19|COLLECT COD|SHIP|ermanently ex +17188|1397|74|4|12|15580.68|0.05|0.07|N|O|1998-04-29|1998-03-01|1998-05-24|NONE|SHIP| ironic theodolites. +17188|1580|81|5|33|48892.14|0.05|0.05|N|O|1998-01-18|1998-03-27|1998-02-07|TAKE BACK RETURN|MAIL|xes. unusual platelets boost sl +17189|175|54|1|16|17202.72|0.09|0.06|N|O|1996-01-22|1995-12-14|1996-01-29|COLLECT COD|FOB|gular packages thrash blithely after +17189|1951|40|2|26|48176.70|0.08|0.03|N|O|1996-01-30|1995-12-15|1996-02-10|COLLECT COD|RAIL|regular platelets: furiously iron +17189|856|57|3|39|68517.15|0.09|0.00|N|O|1996-01-01|1995-12-20|1996-01-07|DELIVER IN PERSON|AIR|kly across the slyly bold +17190|1749|34|1|46|75934.04|0.05|0.03|N|O|1996-07-25|1996-08-24|1996-08-24|COLLECT COD|AIR|s. ironic dolphins are quickly ironic pack +17190|1955|88|2|39|72421.05|0.05|0.00|N|O|1996-08-12|1996-08-03|1996-09-06|NONE|TRUCK|e furiously regular, e +17191|1220|21|1|43|48212.46|0.05|0.07|N|O|1995-08-18|1995-05-31|1995-08-31|DELIVER IN PERSON|TRUCK|ily. carefully ironic acco +17191|589|90|2|40|59583.20|0.01|0.05|N|O|1995-07-14|1995-06-07|1995-08-07|NONE|SHIP|. slyly regular pinto beans cajole reque +17191|280|35|3|3|3540.84|0.02|0.07|N|F|1995-05-29|1995-06-23|1995-06-23|TAKE BACK RETURN|FOB|ul ideas boo +17191|1010|16|4|41|37351.41|0.01|0.01|N|O|1995-06-24|1995-06-23|1995-07-04|COLLECT COD|TRUCK| fluffily. the +17216|1543|64|1|27|39002.58|0.03|0.04|R|F|1992-06-16|1992-07-22|1992-07-12|NONE|AIR| special pinto beans affix around th +17216|317|2|2|24|29215.44|0.09|0.06|R|F|1992-06-26|1992-08-02|1992-07-24|DELIVER IN PERSON|TRUCK|dolites. carefully pend +17216|1264|65|3|24|27966.24|0.07|0.00|R|F|1992-05-31|1992-07-07|1992-06-21|TAKE BACK RETURN|AIR|ounts haggle slyly silent packages. i +17216|240|22|4|18|20524.32|0.05|0.03|A|F|1992-07-12|1992-07-01|1992-07-17|NONE|TRUCK|y about the bold +17217|289|90|1|5|5946.40|0.09|0.08|R|F|1994-08-30|1994-11-04|1994-09-06|NONE|FOB|lets. even notornis sleep alongside of +17218|1112|49|1|30|30393.30|0.02|0.04|R|F|1992-09-04|1992-10-06|1992-09-29|TAKE BACK RETURN|FOB|s are carefully slyly bold +17218|706|7|2|10|16067.00|0.05|0.05|R|F|1992-11-07|1992-08-30|1992-11-27|COLLECT COD|MAIL|pendencies haggle quickl +17219|1063|99|1|29|27957.74|0.05|0.02|N|O|1996-04-14|1996-04-09|1996-04-23|NONE|TRUCK|the deposits. theodolites are slyly qu +17219|1544|25|2|21|30356.34|0.03|0.04|N|O|1996-01-29|1996-02-14|1996-02-09|COLLECT COD|SHIP|s use slyly ironic, final packages. +17219|1849|36|3|10|17508.40|0.00|0.07|N|O|1996-03-01|1996-03-25|1996-03-18|TAKE BACK RETURN|TRUCK|ns detect above the neve +17219|698|99|4|19|30375.11|0.03|0.01|N|O|1996-03-16|1996-02-21|1996-04-14|TAKE BACK RETURN|SHIP|quests maintain fluffi +17220|1248|60|1|6|6895.44|0.01|0.01|N|O|1997-02-16|1997-01-28|1997-02-27|TAKE BACK RETURN|RAIL| sleep among the even requests! pendin +17220|1612|36|2|12|18163.32|0.09|0.05|N|O|1997-01-22|1997-01-09|1997-02-11|NONE|MAIL|tructions haggle furious +17220|442|30|3|39|52355.16|0.05|0.04|N|O|1996-11-22|1997-02-02|1996-11-24|COLLECT COD|REG AIR|xes affix. final, express accoun +17221|605|6|1|1|1505.60|0.08|0.04|R|F|1994-08-28|1994-08-18|1994-09-27|DELIVER IN PERSON|AIR|n excuses cajole. +17221|818|18|2|50|85940.50|0.06|0.08|A|F|1994-09-28|1994-09-06|1994-10-04|NONE|TRUCK|slyly bold ideas believe care +17222|1416|56|1|33|43474.53|0.05|0.08|R|F|1993-07-08|1993-05-24|1993-07-19|COLLECT COD|TRUCK| foxes. fluffily even pla +17223|756|53|1|18|29821.50|0.05|0.00|A|F|1994-09-15|1994-09-02|1994-10-05|DELIVER IN PERSON|FOB|ckages integrate carefully speci +17248|1537|58|1|38|54664.14|0.02|0.07|N|O|1996-10-05|1996-10-24|1996-10-19|TAKE BACK RETURN|SHIP|after the furiously ex +17249|1434|52|1|47|62765.21|0.00|0.01|A|F|1993-11-17|1993-11-16|1993-11-29|TAKE BACK RETURN|REG AIR|cross the pending pinto +17249|1889|76|2|29|51935.52|0.09|0.02|A|F|1993-10-21|1993-12-02|1993-11-09|COLLECT COD|RAIL|ges haggle quickly across the quickly e +17249|1081|52|3|32|31426.56|0.10|0.03|R|F|1993-12-01|1993-11-01|1993-12-23|TAKE BACK RETURN|FOB| carefully bold foxes. slowly final asym +17249|162|15|4|27|28678.32|0.07|0.04|R|F|1993-10-14|1993-12-16|1993-10-15|TAKE BACK RETURN|FOB|e even requests haggle carefully above +17249|831|98|5|47|81396.01|0.10|0.07|A|F|1994-01-01|1993-11-15|1994-01-11|NONE|AIR|xpress cour +17249|1608|91|6|48|72460.80|0.10|0.01|A|F|1993-11-07|1993-10-31|1993-12-06|TAKE BACK RETURN|FOB|counts. thinly final pack +17249|1192|93|7|8|8745.52|0.05|0.05|R|F|1993-10-25|1993-11-19|1993-11-17|NONE|FOB|hinder final pinto beans. carefully bo +17250|1877|21|1|46|81828.02|0.01|0.08|A|F|1994-12-15|1994-12-18|1995-01-03|DELIVER IN PERSON|RAIL|usly express deposits haggle slyly pe +17250|1251|89|2|50|57612.50|0.01|0.07|R|F|1995-01-16|1994-11-21|1995-02-03|DELIVER IN PERSON|AIR|, silent theodolites breach. even +17251|232|60|1|44|49818.12|0.00|0.05|R|F|1995-02-01|1994-12-31|1995-03-01|NONE|TRUCK|uests. silently even packages +17251|1492|93|2|35|48772.15|0.08|0.05|A|F|1994-12-26|1995-01-03|1995-01-14|NONE|REG AIR|bold pinto beans nag slyly ironic req +17251|658|52|3|12|18703.80|0.06|0.02|R|F|1995-01-16|1995-01-03|1995-01-29|NONE|MAIL|enticing requests haggle sl +17252|685|79|1|33|52327.44|0.01|0.08|R|F|1995-05-29|1995-07-01|1995-06-10|TAKE BACK RETURN|REG AIR|uriously about the requests. +17252|659|60|2|6|9357.90|0.00|0.00|N|O|1995-07-12|1995-07-07|1995-08-11|COLLECT COD|AIR|ests. caref +17252|1648|90|3|23|35641.72|0.07|0.06|N|O|1995-06-18|1995-07-02|1995-06-22|NONE|RAIL| slyly. carefully bold instructions eat +17252|1673|97|4|41|64561.47|0.06|0.01|R|F|1995-05-28|1995-07-03|1995-06-13|DELIVER IN PERSON|TRUCK|ithely ironic deposi +17252|858|92|5|8|14070.80|0.01|0.01|N|O|1995-08-29|1995-07-16|1995-09-26|TAKE BACK RETURN|AIR|ffix carefully along the busy r +17252|833|100|6|4|6935.32|0.10|0.03|A|F|1995-05-25|1995-06-17|1995-06-12|DELIVER IN PERSON|MAIL|e fluffy depths. s +17252|1981|70|7|47|88500.06|0.10|0.07|N|O|1995-08-10|1995-06-21|1995-08-13|NONE|FOB| the quick foxes. slyly steal +17253|755|20|1|44|72853.00|0.00|0.02|N|O|1995-10-13|1995-09-17|1995-10-24|NONE|TRUCK|nto beans affix closel +17253|18|94|2|15|13770.15|0.03|0.04|N|O|1995-11-30|1995-11-14|1995-12-18|COLLECT COD|FOB|pending asymptotes. final packages +17253|1029|100|3|23|21390.46|0.10|0.00|N|O|1995-08-19|1995-11-07|1995-09-06|TAKE BACK RETURN|SHIP|s are; ironic requests sleep fluffily unu +17253|320|77|4|15|18304.80|0.09|0.08|N|O|1995-12-12|1995-09-23|1996-01-02|TAKE BACK RETURN|MAIL|s against the ironic requests hag +17253|1721|48|5|25|40568.00|0.04|0.02|N|O|1995-08-28|1995-11-03|1995-09-08|TAKE BACK RETURN|SHIP|counts alongside of th +17253|1305|82|6|2|2412.60|0.05|0.03|N|O|1995-08-20|1995-09-28|1995-09-06|NONE|FOB|e slyly silent packages. f +17253|1117|90|7|1|1018.11|0.01|0.00|N|O|1995-10-29|1995-10-09|1995-11-26|DELIVER IN PERSON|RAIL|uriously ironic d +17254|178|5|1|10|10781.70|0.03|0.06|N|O|1997-01-03|1996-11-08|1997-01-08|DELIVER IN PERSON|RAIL|ly even deposits wake. ironic, fi +17254|627|59|2|33|50411.46|0.10|0.01|N|O|1996-10-12|1996-12-04|1996-11-10|COLLECT COD|SHIP|careful accounts +17254|1052|58|3|50|47652.50|0.06|0.02|N|O|1997-01-18|1996-12-04|1997-02-17|DELIVER IN PERSON|RAIL|ests along +17255|1831|75|1|2|3465.66|0.04|0.07|R|F|1993-07-24|1993-09-07|1993-08-06|NONE|RAIL|equests ca +17255|1646|29|2|29|44881.56|0.01|0.00|R|F|1993-10-16|1993-09-08|1993-11-05|DELIVER IN PERSON|SHIP|its are? regular, bold ideas boost a +17280|375|32|1|29|36985.73|0.05|0.00|N|O|1996-07-24|1996-09-08|1996-07-25|NONE|REG AIR|wake carefully. slyl +17280|1828|29|2|18|31136.76|0.01|0.08|N|O|1996-06-29|1996-07-28|1996-07-22|DELIVER IN PERSON|SHIP|fully regular ideas cajole carefully +17281|1454|33|1|32|43374.40|0.06|0.06|R|F|1992-06-23|1992-05-14|1992-07-11|NONE|TRUCK|tainments use carefully quickly regular +17281|1264|76|2|8|9322.08|0.02|0.03|R|F|1992-05-16|1992-06-28|1992-05-17|DELIVER IN PERSON|RAIL|after the slyly final ideas nag af +17281|1152|53|3|47|49498.05|0.02|0.07|A|F|1992-05-21|1992-05-23|1992-06-05|NONE|FOB| against the pending attainments. +17282|73|24|1|28|27245.96|0.10|0.01|A|F|1994-12-09|1995-01-03|1995-01-07|DELIVER IN PERSON|FOB| carefully ironic depo +17282|1726|69|2|36|58597.92|0.00|0.08|A|F|1994-12-02|1995-01-19|1994-12-10|TAKE BACK RETURN|SHIP|accounts cajole above the carefully f +17283|466|67|1|7|9565.22|0.05|0.08|N|O|1995-09-22|1995-12-12|1995-10-09|NONE|SHIP|lly. blithely bold packages detect blithel +17283|614|8|2|5|7573.05|0.07|0.06|N|O|1995-11-30|1995-11-30|1995-12-26|DELIVER IN PERSON|MAIL|ggle idly around the blithely ironic pack +17283|1910|11|3|4|7247.64|0.05|0.07|N|O|1995-09-22|1995-10-26|1995-09-26|DELIVER IN PERSON|RAIL|egular deposits use furiously. blith +17283|328|13|4|26|31936.32|0.06|0.06|N|O|1995-09-27|1995-12-04|1995-10-06|DELIVER IN PERSON|MAIL|lyly alongside o +17283|1989|34|5|2|3781.96|0.09|0.01|N|O|1995-10-18|1995-11-25|1995-10-22|DELIVER IN PERSON|REG AIR|ly final deposits. blith +17283|1192|65|6|13|14211.47|0.01|0.06|N|O|1995-12-05|1995-11-07|1995-12-28|DELIVER IN PERSON|TRUCK|pecial dinos play slyly along the fu +17283|1489|68|7|48|66743.04|0.10|0.02|N|O|1995-12-03|1995-11-25|1995-12-31|DELIVER IN PERSON|RAIL|ies. even, pending packages nag furiously a +17284|77|53|1|13|12701.91|0.03|0.05|R|F|1994-10-22|1994-12-25|1994-11-01|COLLECT COD|TRUCK|ke carefully regular dependencies. silen +17285|699|62|1|22|35193.18|0.06|0.04|A|F|1992-06-05|1992-04-26|1992-06-07|COLLECT COD|MAIL|ffily final dependencies cajole bli +17285|1400|1|2|46|59864.40|0.05|0.03|A|F|1992-05-15|1992-05-17|1992-05-17|TAKE BACK RETURN|AIR|ong the express depo +17286|390|47|1|39|50325.21|0.08|0.00|R|F|1993-10-01|1993-11-27|1993-10-03|NONE|REG AIR|ainments haggle care +17286|1888|89|2|33|59066.04|0.10|0.02|R|F|1993-11-14|1993-12-03|1993-12-09|DELIVER IN PERSON|TRUCK|ges haggle carefully. always b +17286|844|44|3|43|75028.12|0.03|0.01|A|F|1993-12-20|1993-12-20|1994-01-04|NONE|RAIL| the slyly silent deposits. platelets affi +17286|1286|24|4|33|39180.24|0.03|0.02|A|F|1993-12-20|1993-11-12|1993-12-30|DELIVER IN PERSON|AIR|tructions. +17286|147|26|5|23|24084.22|0.02|0.05|R|F|1993-11-24|1993-11-18|1993-11-26|TAKE BACK RETURN|TRUCK|lly regular re +17287|1343|58|1|47|58483.98|0.04|0.04|N|O|1995-07-23|1995-05-15|1995-08-11|COLLECT COD|REG AIR|atelets along the slyly ev +17287|335|92|2|10|12353.30|0.04|0.08|N|O|1995-07-24|1995-05-09|1995-08-22|NONE|MAIL|ts affix carefully. regularly special packa +17287|444|3|3|40|53777.60|0.09|0.08|N|O|1995-07-07|1995-06-28|1995-07-16|COLLECT COD|MAIL|lites. qui +17312|728|25|1|20|32574.40|0.09|0.08|N|O|1995-07-27|1995-07-25|1995-08-11|TAKE BACK RETURN|RAIL|ts are. carefully sly attainme +17312|1481|21|2|26|35944.48|0.05|0.03|N|O|1995-09-10|1995-08-16|1995-09-16|TAKE BACK RETURN|SHIP|the regular, ironic packages. furiously +17312|47|23|3|27|25570.08|0.05|0.03|N|O|1995-07-30|1995-07-10|1995-08-07|COLLECT COD|REG AIR|eposits print quick +17312|1241|79|4|48|54827.52|0.06|0.02|N|O|1995-09-13|1995-07-19|1995-09-14|DELIVER IN PERSON|AIR| accounts? requests cajole f +17313|1016|52|1|42|38514.42|0.02|0.06|R|F|1994-07-04|1994-06-17|1994-07-29|TAKE BACK RETURN|MAIL|long the carefully unusual pack +17313|1578|19|2|27|39948.39|0.03|0.08|A|F|1994-08-15|1994-07-06|1994-08-29|COLLECT COD|FOB|larly alongside of +17313|834|68|3|39|67658.37|0.04|0.02|A|F|1994-06-21|1994-06-11|1994-07-08|NONE|TRUCK| even packages. +17313|800|97|4|23|39118.40|0.07|0.03|R|F|1994-06-29|1994-07-29|1994-07-24|NONE|MAIL|arefully special instru +17314|1315|54|1|16|19460.96|0.10|0.03|N|O|1996-05-09|1996-06-05|1996-05-29|NONE|TRUCK|ests. carefully bold packages haggle. +17314|890|90|2|26|46563.14|0.00|0.02|N|O|1996-07-02|1996-05-25|1996-08-01|COLLECT COD|RAIL|l accounts among the excuses breach fl +17315|767|100|1|40|66710.40|0.10|0.05|A|F|1994-05-29|1994-07-20|1994-06-11|NONE|SHIP|thely permanent +17315|1762|5|2|32|53240.32|0.08|0.02|R|F|1994-08-08|1994-07-05|1994-09-03|COLLECT COD|SHIP|gular requests among the ironic, regul +17315|927|96|3|29|53009.68|0.01|0.00|A|F|1994-06-25|1994-06-04|1994-06-29|COLLECT COD|AIR|eodolites. u +17315|942|43|4|12|22115.28|0.00|0.08|A|F|1994-07-28|1994-06-18|1994-08-20|COLLECT COD|REG AIR|eans sleep slyly instructions. regular dep +17315|1820|50|5|39|67150.98|0.05|0.05|A|F|1994-06-20|1994-06-11|1994-06-27|COLLECT COD|RAIL|y unusual instructions. +17315|1318|19|6|1|1219.31|0.04|0.02|A|F|1994-07-21|1994-06-19|1994-08-16|TAKE BACK RETURN|SHIP|ss requests; quickly i +17315|58|9|7|6|5748.30|0.00|0.01|R|F|1994-06-19|1994-07-02|1994-07-17|DELIVER IN PERSON|FOB|e slyly blithely final accoun +17316|669|32|1|23|36102.18|0.03|0.02|A|F|1993-02-05|1993-03-29|1993-03-06|COLLECT COD|RAIL|nstructions. pendi +17316|1028|29|2|10|9290.20|0.03|0.06|A|F|1993-03-09|1993-04-02|1993-04-01|NONE|FOB|al dependencies. +17316|665|97|3|7|10959.62|0.09|0.04|A|F|1993-04-28|1993-02-23|1993-05-02|TAKE BACK RETURN|RAIL| deposits integrate fluffily. c +17317|1429|30|1|47|62529.74|0.02|0.04|R|F|1995-04-01|1995-02-02|1995-04-29|COLLECT COD|TRUCK|unts agains +17317|884|84|2|44|78534.72|0.03|0.01|A|F|1995-03-28|1995-01-10|1995-04-15|COLLECT COD|SHIP|e ironic instruc +17318|1806|36|1|42|71727.60|0.02|0.07|N|O|1997-09-07|1997-07-24|1997-10-05|DELIVER IN PERSON|AIR|sits haggle slyl +17318|537|38|2|50|71876.50|0.00|0.03|N|O|1997-09-01|1997-07-17|1997-09-15|NONE|REG AIR|: pending, e +17318|937|6|3|31|56975.83|0.04|0.03|N|O|1997-06-18|1997-08-12|1997-07-18|NONE|AIR|ely special foxes +17318|1026|62|4|45|41715.90|0.00|0.06|N|O|1997-08-12|1997-09-06|1997-09-04|TAKE BACK RETURN|MAIL|platelets! quickly bold pinto bea +17319|1290|91|1|7|8339.03|0.06|0.02|R|F|1994-05-23|1994-03-30|1994-06-06|COLLECT COD|MAIL|unts are furiously carefully unusual reques +17344|375|4|1|9|11478.33|0.00|0.06|R|F|1993-09-21|1993-09-26|1993-10-06|DELIVER IN PERSON|MAIL|ggle. furiously ironic th +17344|1817|47|2|16|27500.96|0.06|0.03|R|F|1993-11-04|1993-09-28|1993-12-01|DELIVER IN PERSON|TRUCK|instructions above +17344|1155|28|3|37|39077.55|0.06|0.05|R|F|1993-10-10|1993-10-07|1993-10-21|DELIVER IN PERSON|FOB|es above the furious +17344|966|67|4|36|67210.56|0.02|0.06|R|F|1993-08-31|1993-09-27|1993-09-15|NONE|AIR|st the furiously even packa +17344|1282|94|5|15|17749.20|0.02|0.07|R|F|1993-07-30|1993-09-26|1993-08-12|TAKE BACK RETURN|RAIL|s believe fl +17344|1958|59|6|15|27899.25|0.04|0.02|R|F|1993-08-29|1993-09-08|1993-09-23|TAKE BACK RETURN|SHIP|haggle regular, express dependencies. s +17344|1602|3|7|18|27064.80|0.01|0.07|A|F|1993-07-31|1993-09-09|1993-08-21|NONE|REG AIR|ep blithely. u +17345|1611|35|1|5|7563.05|0.06|0.03|N|O|1995-08-27|1995-09-24|1995-09-09|NONE|FOB|y silent foxes sleep +17345|794|95|2|13|22032.27|0.00|0.04|N|O|1995-11-29|1995-10-31|1995-12-11|DELIVER IN PERSON|AIR|nstructions +17345|165|44|3|36|38345.76|0.10|0.03|N|O|1995-08-09|1995-09-24|1995-08-16|DELIVER IN PERSON|AIR|deposits across the quick +17345|1094|65|4|23|22887.07|0.09|0.08|N|O|1995-11-16|1995-10-06|1995-11-30|DELIVER IN PERSON|FOB|ilent instr +17345|110|37|5|5|5050.55|0.09|0.00|N|O|1995-10-27|1995-09-14|1995-11-10|NONE|REG AIR|etect quickly ironic packag +17345|1158|95|6|50|52957.50|0.03|0.02|N|O|1995-11-26|1995-10-02|1995-12-14|COLLECT COD|FOB|nts from the quickly express packages wake +17346|1909|42|1|31|56137.90|0.04|0.07|N|O|1995-07-03|1995-04-21|1995-08-02|COLLECT COD|AIR|nts. special requests bo +17347|566|57|1|6|8799.36|0.00|0.02|N|O|1998-03-31|1998-05-30|1998-04-18|TAKE BACK RETURN|SHIP|ckly special packages wake carefu +17347|1665|7|2|13|20366.58|0.00|0.03|N|O|1998-04-26|1998-05-27|1998-05-03|DELIVER IN PERSON|TRUCK| against the quickly +17347|1567|88|3|36|52868.16|0.02|0.03|N|O|1998-04-21|1998-05-24|1998-05-07|DELIVER IN PERSON|SHIP| theodolites are across the qu +17347|135|88|4|23|23807.99|0.00|0.04|N|O|1998-04-11|1998-05-31|1998-04-18|TAKE BACK RETURN|SHIP|ithely carefully regular +17347|1200|1|5|38|41845.60|0.08|0.00|N|O|1998-06-29|1998-05-14|1998-07-18|COLLECT COD|TRUCK|packages believe fur +17348|106|7|1|35|35213.50|0.06|0.06|N|O|1997-08-10|1997-09-11|1997-08-20|COLLECT COD|RAIL|o the carefull +17349|470|100|1|46|63041.62|0.05|0.04|N|O|1996-08-25|1996-08-04|1996-09-18|COLLECT COD|SHIP| sleep among the furiously iron +17349|1051|87|2|21|19993.05|0.02|0.02|N|O|1996-07-05|1996-06-25|1996-07-07|NONE|RAIL| bold packages aft +17349|552|13|3|12|17430.60|0.05|0.00|N|O|1996-06-24|1996-07-25|1996-07-20|NONE|MAIL|ic requests solve furiously +17350|640|72|1|43|66247.52|0.05|0.00|N|O|1996-07-26|1996-06-22|1996-08-22|COLLECT COD|RAIL|s wake carefully about the unusual, +17351|630|31|1|33|50510.79|0.02|0.04|A|F|1994-05-31|1994-06-16|1994-06-12|NONE|SHIP|ithely bold packag +17351|1387|88|2|2|2576.76|0.06|0.04|A|F|1994-07-07|1994-06-10|1994-07-25|NONE|REG AIR|gle. carefully express ideas use caref +17376|463|51|1|25|34086.50|0.00|0.04|N|O|1996-02-08|1996-02-14|1996-02-21|DELIVER IN PERSON|MAIL| final theodolites haggle +17376|388|89|2|11|14172.18|0.09|0.05|N|O|1995-12-20|1996-01-16|1995-12-21|NONE|TRUCK| ideas about the unusu +17376|1968|69|3|30|56098.80|0.02|0.01|N|O|1996-01-08|1996-01-12|1996-01-12|DELIVER IN PERSON|MAIL|lieve fluffi +17376|475|5|4|7|9628.29|0.02|0.06|N|O|1996-03-01|1996-01-08|1996-03-31|DELIVER IN PERSON|REG AIR|y carefully expr +17376|827|94|5|45|77751.90|0.00|0.07|N|O|1996-02-02|1996-01-31|1996-02-22|NONE|REG AIR|its cajole: furiously exp +17376|1220|32|6|6|6727.32|0.00|0.04|N|O|1995-12-28|1996-02-03|1996-01-21|TAKE BACK RETURN|REG AIR|r ideas haggle above the c +17376|1752|79|7|22|36382.50|0.04|0.07|N|O|1995-12-14|1996-02-13|1995-12-27|TAKE BACK RETURN|AIR|lar accounts. furiously regular deposit +17377|576|77|1|41|60539.37|0.10|0.03|N|O|1996-02-23|1995-12-20|1996-02-24|TAKE BACK RETURN|TRUCK|tealthily even ideas. blithely bold +17378|1872|2|1|38|67407.06|0.10|0.08|N|O|1996-08-08|1996-10-05|1996-08-17|TAKE BACK RETURN|TRUCK|ake slyly alongside of the +17378|704|69|2|8|12837.60|0.10|0.02|N|O|1996-10-12|1996-08-15|1996-11-09|NONE|REG AIR|. regular pack +17378|1444|62|3|49|65926.56|0.09|0.02|N|O|1996-08-26|1996-10-02|1996-09-10|TAKE BACK RETURN|TRUCK|ven sentiments detect specia +17378|1047|53|4|18|17064.72|0.01|0.08|N|O|1996-08-29|1996-08-12|1996-09-12|DELIVER IN PERSON|TRUCK| instructions use carefully +17378|1937|70|5|33|60684.69|0.06|0.07|N|O|1996-09-27|1996-09-11|1996-10-05|COLLECT COD|SHIP|lites. blithely special +17379|1422|62|1|38|50289.96|0.10|0.01|N|O|1995-11-30|1995-11-10|1995-12-15|NONE|RAIL|boost ruthl +17379|1371|48|2|9|11451.33|0.09|0.07|N|O|1995-08-19|1995-10-08|1995-08-23|DELIVER IN PERSON|AIR|its affix aro +17379|1374|89|3|35|44637.95|0.08|0.03|N|O|1995-12-09|1995-11-03|1995-12-18|COLLECT COD|REG AIR| slow reque +17379|322|7|4|4|4889.28|0.10|0.03|N|O|1995-10-08|1995-10-08|1995-10-23|COLLECT COD|RAIL| the furio +17379|331|88|5|20|24626.60|0.08|0.06|N|O|1995-10-13|1995-11-06|1995-11-02|TAKE BACK RETURN|TRUCK|nts nag. slyly enticing dep +17380|1434|35|1|50|66771.50|0.10|0.04|N|O|1998-04-16|1998-04-30|1998-04-29|NONE|RAIL|ully ironic packages against the fluffi +17380|1472|12|2|49|67300.03|0.09|0.06|N|O|1998-06-11|1998-05-01|1998-07-04|NONE|TRUCK|s wake bli +17380|86|37|3|23|22679.84|0.06|0.01|N|O|1998-05-09|1998-04-17|1998-06-02|NONE|FOB|es. regular depos +17380|1667|91|4|20|31373.20|0.05|0.06|N|O|1998-06-03|1998-05-15|1998-06-21|DELIVER IN PERSON|AIR|y even accounts +17380|1594|35|5|32|47858.88|0.10|0.06|N|O|1998-05-13|1998-04-28|1998-05-19|NONE|AIR|o beans are about the carefu +17380|1738|23|6|18|29515.14|0.05|0.08|N|O|1998-03-21|1998-03-26|1998-04-18|DELIVER IN PERSON|TRUCK|ests after the carefully unusual +17381|917|18|1|24|43629.84|0.03|0.00|R|F|1993-11-18|1993-09-29|1993-12-04|TAKE BACK RETURN|SHIP|ckages. bravely even package +17381|1706|91|2|24|38584.80|0.03|0.01|R|F|1993-10-09|1993-11-13|1993-11-04|DELIVER IN PERSON|AIR|lyly accord +17381|1548|29|3|32|46385.28|0.09|0.08|R|F|1993-12-04|1993-10-14|1993-12-11|TAKE BACK RETURN|AIR|l dependencies breach across the carefu +17381|1149|58|4|15|15752.10|0.03|0.02|A|F|1993-11-30|1993-09-19|1993-12-13|COLLECT COD|RAIL| courts. theodolites by the +17382|1012|48|1|40|36520.40|0.02|0.04|N|O|1995-08-20|1995-09-09|1995-08-21|TAKE BACK RETURN|REG AIR|ly blithely idle deposits. blithely +17382|626|20|2|5|7633.10|0.03|0.05|N|O|1995-09-11|1995-09-11|1995-09-17|DELIVER IN PERSON|REG AIR|ts sleep furiously +17382|667|99|3|21|32920.86|0.07|0.08|N|O|1995-10-25|1995-09-18|1995-11-22|TAKE BACK RETURN|FOB|. ironic theo +17382|1241|79|4|31|35409.44|0.05|0.02|N|O|1995-07-15|1995-09-07|1995-07-26|NONE|AIR|s. foxes use blithely reg +17383|1704|31|1|33|52988.10|0.01|0.04|N|O|1996-05-13|1996-05-24|1996-06-01|TAKE BACK RETURN|REG AIR|lithely final pinto bean +17383|915|50|2|42|76268.22|0.08|0.03|N|O|1996-04-17|1996-06-27|1996-04-29|NONE|MAIL|s after the caref +17383|1254|55|3|50|57762.50|0.07|0.00|N|O|1996-04-29|1996-06-22|1996-05-23|DELIVER IN PERSON|REG AIR|ular accounts. carefully b +17383|981|50|4|24|45167.52|0.08|0.06|N|O|1996-05-31|1996-06-17|1996-06-17|TAKE BACK RETURN|TRUCK|g platelets about the sl +17383|1703|88|5|10|16047.00|0.08|0.00|N|O|1996-04-18|1996-06-21|1996-05-02|TAKE BACK RETURN|TRUCK|sly excuses ne +17383|1631|14|6|19|29119.97|0.07|0.08|N|O|1996-04-12|1996-06-25|1996-04-30|DELIVER IN PERSON|MAIL|ly bold pinto beans among +17408|160|61|1|25|26504.00|0.07|0.05|A|F|1994-06-05|1994-07-14|1994-06-23|NONE|FOB|y pending asymptotes. +17408|439|98|2|34|45540.62|0.05|0.04|R|F|1994-05-31|1994-07-24|1994-06-08|DELIVER IN PERSON|TRUCK|st carefully regular, bold accounts. f +17408|1435|75|3|14|18710.02|0.03|0.04|A|F|1994-07-15|1994-07-29|1994-08-09|TAKE BACK RETURN|AIR|unts? quickly unusual r +17408|510|11|4|38|53599.38|0.02|0.07|A|F|1994-06-05|1994-07-22|1994-06-23|TAKE BACK RETURN|MAIL|und the bold gifts. +17409|1077|78|1|20|19561.40|0.08|0.07|R|F|1993-09-21|1993-10-05|1993-10-16|COLLECT COD|SHIP|e of the even, ironic accoun +17409|771|72|2|47|78573.19|0.00|0.05|A|F|1993-11-21|1993-10-12|1993-12-17|NONE|AIR|unts would believe furiously final pin +17409|386|87|3|4|5145.52|0.01|0.00|A|F|1993-09-07|1993-11-01|1993-09-11|NONE|TRUCK|ges. ironic, unusua +17409|1917|18|4|44|80032.04|0.06|0.05|A|F|1993-08-19|1993-11-01|1993-09-11|NONE|RAIL|es. slyly silent pinto b +17409|593|54|5|21|31365.39|0.04|0.07|A|F|1993-08-28|1993-11-08|1993-08-30|NONE|SHIP|ar requests a +17409|1144|81|6|12|12541.68|0.09|0.06|R|F|1993-11-07|1993-10-13|1993-11-20|TAKE BACK RETURN|AIR|osits. furiousl +17410|682|76|1|34|53811.12|0.04|0.01|A|F|1993-09-03|1993-11-28|1993-09-09|NONE|TRUCK|t the furious +17410|1255|93|2|24|27750.00|0.06|0.06|A|F|1993-10-28|1993-10-15|1993-11-02|TAKE BACK RETURN|SHIP|se-- furiously ironic ideas cajole alongs +17410|1858|45|3|19|33437.15|0.00|0.07|R|F|1993-12-26|1993-10-19|1994-01-22|DELIVER IN PERSON|SHIP|eans may doubt +17411|1847|91|1|18|31479.12|0.03|0.01|A|F|1994-11-02|1994-09-23|1994-11-15|COLLECT COD|AIR|ly ironic deposits. expres +17411|817|84|2|32|54969.92|0.07|0.06|A|F|1994-10-26|1994-11-04|1994-11-03|NONE|REG AIR|even requests. furiously ironic packages ca +17411|1883|70|3|23|41052.24|0.01|0.07|R|F|1994-12-08|1994-09-23|1995-01-03|TAKE BACK RETURN|SHIP|ccording to the iron +17412|686|49|1|14|22213.52|0.03|0.06|N|O|1997-11-29|1998-02-25|1997-12-27|COLLECT COD|REG AIR|the ironic foxes. carefull +17412|1360|37|2|34|42886.24|0.10|0.05|N|O|1998-01-23|1998-01-18|1998-02-14|DELIVER IN PERSON|AIR|lly bold Tiresias. fluf +17412|77|78|3|33|32243.31|0.01|0.05|N|O|1997-12-11|1997-12-29|1997-12-12|DELIVER IN PERSON|MAIL|rate furiously flu +17413|248|3|1|6|6889.44|0.09|0.06|N|O|1996-05-03|1996-03-05|1996-05-05|COLLECT COD|REG AIR|the ironic packag +17413|1397|36|2|15|19475.85|0.04|0.03|N|O|1996-04-10|1996-03-15|1996-04-11|DELIVER IN PERSON|AIR|deposits. silent +17413|1635|18|3|27|41489.01|0.04|0.04|N|O|1996-03-31|1996-03-14|1996-04-05|COLLECT COD|SHIP|lly. blithely fina +17414|1269|7|1|35|40959.10|0.06|0.04|R|F|1992-09-05|1992-09-07|1992-09-22|COLLECT COD|FOB| alongside of the slyly even +17414|77|53|2|35|34197.45|0.04|0.07|A|F|1992-09-01|1992-08-04|1992-09-11|COLLECT COD|SHIP|lithely at the ac +17414|443|31|3|45|60454.80|0.03|0.02|R|F|1992-07-03|1992-08-24|1992-08-02|NONE|RAIL|ly even deposits. care +17414|797|62|4|25|42444.75|0.10|0.03|A|F|1992-07-05|1992-09-14|1992-07-16|COLLECT COD|REG AIR|arefully final deposits haggle +17414|766|67|5|39|65003.64|0.06|0.03|A|F|1992-08-30|1992-09-03|1992-09-16|NONE|MAIL|sly regular requests. bold, express instru +17414|875|76|6|14|24862.18|0.00|0.07|A|F|1992-07-30|1992-09-22|1992-08-11|COLLECT COD|REG AIR|unusual accounts. unusual, unusua +17415|1405|6|1|18|23515.20|0.06|0.01|N|O|1997-01-13|1996-12-15|1997-01-28|TAKE BACK RETURN|MAIL|blithely carefully regular sheaves. +17415|735|32|2|19|31078.87|0.04|0.08|N|O|1996-10-15|1996-11-28|1996-11-09|COLLECT COD|SHIP|g. slyly final asymptotes nag fur +17415|894|61|3|15|26923.35|0.03|0.03|N|O|1996-11-13|1996-11-17|1996-12-01|NONE|RAIL|he foxes. q +17415|516|47|4|34|48161.34|0.10|0.03|N|O|1996-12-23|1996-12-10|1997-01-03|TAKE BACK RETURN|FOB|ternes nag slyly against the expr +17415|1326|3|5|7|8591.24|0.05|0.07|N|O|1996-10-21|1996-12-01|1996-11-13|TAKE BACK RETURN|MAIL|e ideas are slyly even pla +17440|1365|66|1|41|51920.76|0.04|0.07|R|F|1995-04-14|1995-03-06|1995-05-03|COLLECT COD|AIR|eans. foxes wake quickly regular +17440|952|53|2|8|14823.60|0.00|0.06|A|F|1995-04-29|1995-03-21|1995-05-28|COLLECT COD|FOB|aggle sometimes above the thinly ev +17440|449|8|3|50|67472.00|0.00|0.06|R|F|1995-03-18|1995-04-20|1995-04-08|COLLECT COD|FOB|ss the bli +17440|124|51|4|33|33795.96|0.02|0.07|R|F|1995-04-11|1995-04-15|1995-04-29|DELIVER IN PERSON|REG AIR|ronic, expr +17441|612|6|1|15|22689.15|0.08|0.07|R|F|1993-10-11|1993-09-11|1993-10-28|COLLECT COD|FOB|nag furiously. furiously pendi +17441|1072|73|2|10|9730.70|0.03|0.03|A|F|1993-10-09|1993-09-14|1993-10-10|NONE|RAIL|blithely regular +17442|279|34|1|5|5896.35|0.01|0.06|A|F|1994-01-05|1994-02-08|1994-02-01|DELIVER IN PERSON|SHIP|blithely express exc +17442|1357|58|2|3|3775.05|0.00|0.00|A|F|1994-01-30|1994-03-12|1994-02-18|COLLECT COD|MAIL| carefully reg +17442|1425|43|3|3|3979.26|0.10|0.06|R|F|1994-01-18|1994-03-21|1994-01-20|DELIVER IN PERSON|RAIL|ke carefully +17443|1172|45|1|45|48292.65|0.00|0.05|N|O|1998-06-07|1998-05-05|1998-06-23|DELIVER IN PERSON|FOB|ly pending pinto bea +17443|1172|45|2|12|12878.04|0.09|0.00|N|O|1998-07-06|1998-05-12|1998-07-22|COLLECT COD|SHIP|ckages. sly, enticin +17443|365|22|3|28|35430.08|0.06|0.01|N|O|1998-07-13|1998-06-23|1998-07-16|COLLECT COD|MAIL|lithely fluffily pending pinto bea +17443|781|46|4|43|72316.54|0.06|0.06|N|O|1998-06-30|1998-05-12|1998-07-12|NONE|SHIP|ts cajole quickly! furiously r +17443|57|8|5|1|957.05|0.05|0.08|N|O|1998-06-22|1998-05-07|1998-07-22|DELIVER IN PERSON|MAIL|symptotes are slyly. fluffily final depende +17443|39|90|6|32|30048.96|0.04|0.04|N|O|1998-04-23|1998-06-26|1998-04-29|NONE|AIR|rding to the special accounts. sly reques +17443|1111|48|7|17|17205.87|0.07|0.05|N|O|1998-06-20|1998-06-05|1998-07-06|NONE|AIR| regular pac +17444|1442|43|1|31|41646.64|0.07|0.04|A|F|1994-06-05|1994-05-26|1994-06-09|NONE|RAIL| integrate above the permanent packages. qu +17444|332|33|2|50|61616.50|0.00|0.06|A|F|1994-06-02|1994-05-24|1994-06-30|NONE|RAIL| blithely regular ide +17444|1675|76|3|2|3153.34|0.02|0.03|R|F|1994-04-17|1994-06-15|1994-05-11|NONE|TRUCK|riously final deposits wake carefully among +17445|847|14|1|34|59426.56|0.03|0.03|N|O|1995-09-05|1995-10-04|1995-09-23|TAKE BACK RETURN|TRUCK|ross the ca +17445|1611|35|2|31|46890.91|0.01|0.07|N|O|1995-12-12|1995-11-08|1995-12-22|NONE|FOB|odolites imp +17446|1359|74|1|20|25207.00|0.09|0.08|A|F|1994-08-30|1994-08-18|1994-09-26|TAKE BACK RETURN|REG AIR|endencies wa +17446|1832|62|2|30|52014.90|0.00|0.00|R|F|1994-10-01|1994-08-18|1994-10-11|TAKE BACK RETURN|AIR|ly final instructions af +17447|211|39|1|30|33336.30|0.10|0.00|R|F|1992-07-13|1992-07-29|1992-08-02|NONE|FOB|y bold theodolites. regular deposit +17447|1857|1|2|22|38694.70|0.01|0.02|R|F|1992-06-20|1992-07-21|1992-06-27|DELIVER IN PERSON|TRUCK|gle. quickly regular +17472|472|31|1|44|60388.68|0.10|0.00|N|O|1995-08-21|1995-08-31|1995-09-18|NONE|SHIP|nic frets. fluffily even +17472|69|95|2|48|46514.88|0.00|0.06|N|O|1995-09-04|1995-08-16|1995-09-21|DELIVER IN PERSON|TRUCK|lithely ironic dinos haggle slyly +17473|286|41|1|21|24911.88|0.03|0.01|N|O|1998-06-03|1998-05-05|1998-06-13|COLLECT COD|FOB|ove the furiously final courts. blithely pe +17473|203|4|2|46|50747.20|0.05|0.06|N|O|1998-06-10|1998-05-25|1998-06-17|DELIVER IN PERSON|AIR|ly-- final accounts ca +17473|1480|98|3|3|4144.44|0.04|0.02|N|O|1998-07-30|1998-05-25|1998-08-20|COLLECT COD|TRUCK|press, express instruction +17474|69|70|1|24|23257.44|0.05|0.07|N|O|1997-05-25|1997-05-04|1997-05-26|TAKE BACK RETURN|RAIL|uriously regu +17474|1564|85|2|25|36639.00|0.00|0.08|N|O|1997-05-24|1997-04-17|1997-05-29|COLLECT COD|FOB|ions cajole. quickly re +17475|120|99|1|1|1020.12|0.10|0.05|A|F|1993-11-22|1993-11-10|1993-12-02|DELIVER IN PERSON|TRUCK|ckages. carefully regu +17475|558|59|2|38|55424.90|0.07|0.08|A|F|1993-10-11|1993-12-07|1993-10-22|COLLECT COD|REG AIR|ites. pack +17475|1563|44|3|25|36614.00|0.01|0.08|A|F|1993-12-01|1993-10-13|1993-12-02|COLLECT COD|TRUCK|y express packages ag +17475|1852|39|4|23|40338.55|0.01|0.05|R|F|1993-11-03|1993-11-25|1993-11-18|TAKE BACK RETURN|FOB|ggle blithely according to the expre +17475|988|57|5|44|83115.12|0.09|0.07|A|F|1993-10-23|1993-11-04|1993-10-31|COLLECT COD|REG AIR|ths wake da +17476|1676|18|1|46|72572.82|0.10|0.05|N|O|1996-08-23|1996-07-08|1996-09-15|COLLECT COD|REG AIR| the theodolites solve ironic asymptotes. f +17476|288|16|2|39|46342.92|0.01|0.02|N|O|1996-08-23|1996-07-02|1996-08-26|TAKE BACK RETURN|MAIL|ickly regular asymptotes cajole +17477|788|21|1|12|20265.36|0.07|0.06|N|O|1997-04-21|1997-05-28|1997-05-02|TAKE BACK RETURN|SHIP|efully above the caref +17477|1443|61|2|41|55122.04|0.06|0.02|N|O|1997-03-07|1997-04-06|1997-03-08|TAKE BACK RETURN|TRUCK|frets. final multipliers wa +17477|84|85|3|17|16729.36|0.09|0.00|N|O|1997-05-09|1997-05-03|1997-05-30|NONE|TRUCK|ctions. slyly final pinto beans boost f +17477|187|66|4|23|25005.14|0.10|0.03|N|O|1997-04-12|1997-04-20|1997-04-16|NONE|REG AIR|requests affix blithely +17478|1076|82|1|41|40059.87|0.09|0.08|N|O|1996-12-18|1997-02-01|1996-12-22|DELIVER IN PERSON|RAIL|its cajole around the +17478|1002|3|2|41|37023.00|0.07|0.02|N|O|1996-12-10|1997-02-06|1996-12-14|NONE|FOB|as-- ironic foxes sleep slyly blith +17478|34|85|3|15|14010.45|0.08|0.02|N|O|1997-01-03|1997-02-14|1997-01-31|DELIVER IN PERSON|TRUCK|express, ironic accounts boost slyly f +17479|1209|47|1|48|53289.60|0.03|0.03|N|O|1998-07-03|1998-05-08|1998-07-15|COLLECT COD|FOB|y. thin, special instructions d +17479|178|57|2|13|14016.21|0.07|0.07|N|O|1998-06-29|1998-06-14|1998-07-21|COLLECT COD|MAIL|lyly above +17479|240|68|3|22|25085.28|0.06|0.01|N|O|1998-05-24|1998-05-30|1998-05-26|NONE|MAIL| final theodolites. care +17479|1104|5|4|12|12061.20|0.02|0.06|N|O|1998-06-25|1998-06-17|1998-07-01|NONE|AIR|ithely above the quickl +17504|1905|6|1|48|86731.20|0.05|0.02|R|F|1994-08-23|1994-10-23|1994-08-25|TAKE BACK RETURN|AIR|o beans nag a +17504|1131|32|2|50|51606.50|0.02|0.00|R|F|1994-10-03|1994-10-19|1994-10-27|TAKE BACK RETURN|FOB| even deposits wake agains +17505|1854|55|1|19|33361.15|0.08|0.05|N|O|1996-05-06|1996-04-18|1996-06-05|COLLECT COD|SHIP|usual packages abo +17505|1968|13|2|26|48618.96|0.05|0.08|N|O|1996-05-17|1996-04-04|1996-06-13|DELIVER IN PERSON|REG AIR| furiously silen +17505|1430|48|3|14|18640.02|0.07|0.00|N|O|1996-04-28|1996-05-13|1996-04-30|COLLECT COD|FOB|ual instructions. carefully regu +17505|73|49|4|20|19461.40|0.04|0.00|N|O|1996-03-30|1996-04-26|1996-04-04|DELIVER IN PERSON|TRUCK|ully bold packages boost fluffily. fur +17506|971|6|1|40|74878.80|0.07|0.03|A|F|1993-04-07|1993-05-01|1993-04-27|DELIVER IN PERSON|AIR|es thrash furiously. slyly regular mu +17506|339|40|2|3|3717.99|0.06|0.03|A|F|1993-03-27|1993-05-16|1993-04-18|DELIVER IN PERSON|TRUCK|onic escapades. pending requests +17506|1524|25|3|22|31361.44|0.06|0.07|A|F|1993-04-20|1993-05-30|1993-05-13|NONE|FOB|h accounts. carefully e +17507|366|95|1|39|49388.04|0.00|0.02|R|F|1992-08-23|1992-07-14|1992-09-21|NONE|SHIP|ently special theodolites. silent, f +17507|1991|24|2|18|34073.82|0.10|0.05|R|F|1992-06-30|1992-08-03|1992-07-10|COLLECT COD|SHIP|gle. ideas wake busily. requests integra +17507|341|26|3|41|50894.94|0.00|0.08|R|F|1992-07-06|1992-07-30|1992-07-27|NONE|TRUCK| platelets boost furiously at the ca +17507|1569|10|4|15|22058.40|0.06|0.06|A|F|1992-09-13|1992-07-18|1992-10-11|DELIVER IN PERSON|RAIL|kages are s +17507|7|83|5|19|17233.00|0.10|0.04|A|F|1992-08-17|1992-07-23|1992-09-04|COLLECT COD|SHIP|ronic pinto beans. careful +17507|985|20|6|37|69781.26|0.00|0.05|R|F|1992-10-07|1992-07-29|1992-10-25|DELIVER IN PERSON|RAIL|ly special asymptotes haggle: foxes +17507|90|66|7|12|11881.08|0.08|0.04|R|F|1992-08-31|1992-07-19|1992-09-30|DELIVER IN PERSON|FOB|fter the f +17508|1841|42|1|42|73199.28|0.00|0.00|A|F|1992-08-22|1992-08-17|1992-09-17|NONE|REG AIR|t. slyly final excuses about the furiously +17508|1419|37|2|30|39612.30|0.09|0.00|A|F|1992-09-08|1992-08-26|1992-09-29|NONE|RAIL|ing instructions against the pe +17508|37|88|3|8|7496.24|0.10|0.06|A|F|1992-07-12|1992-08-21|1992-07-26|COLLECT COD|MAIL|carefully even pinto beans boost some +17508|118|45|4|15|15271.65|0.05|0.07|A|F|1992-10-01|1992-08-04|1992-10-23|COLLECT COD|TRUCK|ously pending requ +17509|544|35|1|18|26001.72|0.08|0.01|N|O|1995-11-04|1995-10-31|1995-11-17|DELIVER IN PERSON|TRUCK| final, regular the +17509|731|96|2|35|57110.55|0.05|0.01|N|O|1995-09-06|1995-11-11|1995-09-25|COLLECT COD|RAIL|deas. blithely unusual accounts unwind b +17509|484|85|3|20|27689.60|0.07|0.08|N|O|1995-09-24|1995-10-18|1995-10-06|TAKE BACK RETURN|MAIL| slyly even packa +17509|935|38|4|29|53241.97|0.02|0.04|N|O|1995-11-22|1995-11-22|1995-12-02|DELIVER IN PERSON|RAIL|c packages a +17510|1915|48|1|9|16352.19|0.09|0.06|A|F|1993-02-01|1993-01-19|1993-02-14|COLLECT COD|MAIL|the even, dogged deposits. slyly pendin +17511|149|76|1|12|12589.68|0.09|0.06|N|O|1996-02-13|1996-02-02|1996-03-13|NONE|FOB|arefully unusual ac +17536|22|73|1|46|42412.92|0.03|0.08|N|O|1997-11-09|1998-01-03|1997-12-01|TAKE BACK RETURN|AIR|ent instructions. regul +17536|235|90|2|32|36327.36|0.08|0.02|N|O|1998-02-22|1998-01-14|1998-03-12|TAKE BACK RETURN|AIR|ronic accounts haggle +17536|150|3|3|48|50407.20|0.06|0.03|N|O|1997-11-13|1998-01-07|1997-11-24|TAKE BACK RETURN|RAIL|eodolites haggle against the carefully +17536|15|66|4|41|37515.41|0.07|0.07|N|O|1998-03-01|1997-12-09|1998-03-10|COLLECT COD|SHIP|ss about the even +17536|1999|32|5|47|89346.53|0.01|0.05|N|O|1998-01-21|1997-12-28|1998-02-13|DELIVER IN PERSON|REG AIR|nts. carefully ironic i +17536|623|55|6|6|9141.72|0.02|0.05|N|O|1997-11-14|1998-01-18|1997-12-06|TAKE BACK RETURN|RAIL|ss accounts wake furiously furiously bold s +17536|954|89|7|30|55648.50|0.08|0.05|N|O|1997-11-25|1998-01-24|1997-12-07|NONE|RAIL|l accounts. +17537|996|65|1|18|34145.82|0.07|0.08|N|O|1998-08-07|1998-09-20|1998-08-11|COLLECT COD|SHIP|! quickly ironi +17537|1661|62|2|10|15626.60|0.04|0.08|N|O|1998-09-18|1998-09-10|1998-09-27|TAKE BACK RETURN|FOB| pinto beans thra +17537|1898|28|3|8|14399.12|0.07|0.07|N|O|1998-10-25|1998-09-02|1998-11-20|COLLECT COD|RAIL|ructions along the blith +17537|356|13|4|42|52766.70|0.06|0.02|N|O|1998-07-05|1998-09-15|1998-07-09|COLLECT COD|TRUCK|gainst the furiously special requests. fu +17537|1067|68|5|45|43562.70|0.07|0.04|N|O|1998-07-29|1998-09-21|1998-08-23|NONE|AIR|to beans use s +17537|880|80|6|37|65892.56|0.10|0.04|N|O|1998-08-11|1998-08-26|1998-09-06|TAKE BACK RETURN|AIR|packages haggle +17538|1139|48|1|34|35364.42|0.01|0.00|R|F|1994-11-09|1994-10-22|1994-11-19|DELIVER IN PERSON|TRUCK|ent packages! blithely even requests +17538|1474|75|2|34|46765.98|0.03|0.00|R|F|1994-12-10|1994-11-28|1994-12-24|NONE|RAIL|ely final the +17538|1947|92|3|31|57317.14|0.06|0.06|R|F|1994-12-01|1994-10-28|1994-12-27|COLLECT COD|TRUCK|ely permanently +17538|186|65|4|7|7603.26|0.04|0.00|R|F|1994-11-14|1994-10-21|1994-12-03|COLLECT COD|SHIP|cross the express, ironic +17539|1404|44|1|24|31329.60|0.05|0.06|N|O|1995-11-19|1995-11-16|1995-11-24|COLLECT COD|REG AIR| sleep blithely special pinto beans. +17539|312|97|2|33|40006.23|0.01|0.04|N|O|1996-01-04|1995-11-22|1996-01-15|TAKE BACK RETURN|FOB|ly final account +17539|1549|50|3|6|8703.24|0.03|0.08|N|O|1995-12-24|1995-11-20|1996-01-18|COLLECT COD|AIR|uests breach furiously. even +17539|1627|28|4|16|24457.92|0.10|0.04|N|O|1995-12-11|1995-10-27|1996-01-07|TAKE BACK RETURN|MAIL|. carefully regular accounts sleep furio +17539|51|77|5|35|33286.75|0.02|0.01|N|O|1995-09-29|1995-12-11|1995-10-18|NONE|RAIL|y even requests. pendi +17540|1550|51|1|29|42094.95|0.00|0.02|A|F|1992-03-19|1992-03-23|1992-04-06|DELIVER IN PERSON|TRUCK|requests cajole quickly special +17540|985|86|2|31|58465.38|0.07|0.02|R|F|1992-04-23|1992-04-04|1992-05-20|TAKE BACK RETURN|TRUCK|tions sleep aga +17540|1721|22|3|2|3245.44|0.08|0.06|A|F|1992-02-05|1992-04-03|1992-02-10|NONE|AIR|uickly pending instr +17541|1728|13|1|21|34224.12|0.06|0.06|R|F|1993-03-21|1993-04-27|1993-04-17|DELIVER IN PERSON|SHIP|ar escapades haggle fina +17541|909|10|2|20|36198.00|0.08|0.01|A|F|1993-02-01|1993-03-02|1993-02-02|COLLECT COD|REG AIR| affix quickly. fluffily final hock +17541|499|87|3|36|50381.64|0.09|0.03|A|F|1993-05-19|1993-04-15|1993-06-14|COLLECT COD|MAIL|eans. brave dugouts haggle qui +17541|112|65|4|27|27326.97|0.02|0.00|R|F|1993-04-12|1993-03-06|1993-05-03|NONE|RAIL|old deposits. carefully express ex +17542|1681|5|1|10|15826.80|0.00|0.02|R|F|1993-10-08|1993-11-03|1993-10-16|COLLECT COD|TRUCK|ording to th +17542|1489|68|2|9|12514.32|0.10|0.03|A|F|1993-12-10|1993-10-08|1994-01-06|NONE|AIR|s excuses haggle. even warth +17542|1037|73|3|47|44087.41|0.01|0.07|R|F|1993-09-14|1993-10-27|1993-10-10|TAKE BACK RETURN|FOB|final dependen +17543|1195|68|1|23|25212.37|0.04|0.08|A|F|1992-07-04|1992-07-08|1992-07-22|TAKE BACK RETURN|TRUCK|ckages. regul +17543|1639|22|2|23|35434.49|0.04|0.01|R|F|1992-06-25|1992-08-13|1992-07-10|COLLECT COD|RAIL|ongside of t +17543|188|67|3|45|48968.10|0.05|0.05|A|F|1992-09-09|1992-07-31|1992-09-23|COLLECT COD|MAIL|nal requests +17568|1952|85|1|29|53764.55|0.00|0.06|R|F|1994-01-17|1993-11-24|1994-02-02|TAKE BACK RETURN|AIR|arefully final ideas. even +17568|282|64|2|22|26010.16|0.06|0.06|R|F|1993-11-09|1993-11-17|1993-11-30|DELIVER IN PERSON|SHIP|ly even braids use careful +17568|667|61|3|44|68977.04|0.06|0.03|A|F|1994-01-06|1993-11-26|1994-01-10|TAKE BACK RETURN|TRUCK| packages. quickly +17568|1398|13|4|21|27287.19|0.01|0.03|R|F|1993-11-07|1993-11-17|1993-11-26|DELIVER IN PERSON|MAIL|packages-- expr +17568|1584|85|5|45|66851.10|0.08|0.07|A|F|1993-10-11|1994-01-07|1993-10-21|DELIVER IN PERSON|FOB|boost carefully slyly final requests. pi +17568|1931|32|6|9|16496.37|0.05|0.06|A|F|1993-12-22|1993-11-11|1994-01-02|DELIVER IN PERSON|FOB|ously pending sauterne +17568|1082|53|7|50|49154.00|0.00|0.01|A|F|1993-11-12|1994-01-06|1993-11-17|NONE|REG AIR|ts sleep slyly +17569|1160|33|1|13|13795.08|0.06|0.06|N|O|1997-11-07|1997-09-18|1997-11-27|NONE|SHIP|riously pending theodolites +17569|1813|43|2|4|6859.24|0.00|0.00|N|O|1997-08-15|1997-09-04|1997-09-04|TAKE BACK RETURN|TRUCK| theodolites. silent, +17569|1223|35|3|16|17987.52|0.02|0.03|N|O|1997-10-02|1997-08-26|1997-10-17|TAKE BACK RETURN|AIR|en ideas use about the blithely +17569|1659|42|4|30|46819.50|0.07|0.05|N|O|1997-09-21|1997-09-11|1997-10-04|DELIVER IN PERSON|AIR|old deposits. even a +17569|306|35|5|41|49458.30|0.02|0.03|N|O|1997-11-03|1997-09-06|1997-11-22|COLLECT COD|MAIL|es. pending, p +17569|1693|17|6|13|20730.97|0.03|0.02|N|O|1997-10-03|1997-09-03|1997-10-05|COLLECT COD|TRUCK|ending deposits ag +17569|1232|44|7|35|39663.05|0.06|0.03|N|O|1997-07-28|1997-08-30|1997-08-01|DELIVER IN PERSON|TRUCK|ven accounts cajole carefully final packa +17570|758|55|1|18|29857.50|0.08|0.05|N|O|1996-11-12|1996-11-21|1996-11-23|TAKE BACK RETURN|FOB|. furiously regular packages across the +17570|1085|56|2|33|32540.64|0.05|0.06|N|O|1996-11-02|1996-11-11|1996-11-17|COLLECT COD|MAIL|tes. slyly regular dependencies maintain +17570|9|85|3|23|20907.00|0.05|0.04|N|O|1996-12-22|1996-10-16|1997-01-07|TAKE BACK RETURN|REG AIR|ss foxes wak +17570|579|10|4|3|4438.71|0.09|0.04|N|O|1996-12-05|1996-11-24|1996-12-12|TAKE BACK RETURN|SHIP|ly. carefully ironic accounts are blithel +17570|1517|58|5|31|43973.81|0.03|0.03|N|O|1996-10-25|1996-11-26|1996-11-21|DELIVER IN PERSON|AIR| asymptotes wake slyly across the platelets +17570|563|54|6|29|42443.24|0.08|0.07|N|O|1996-12-10|1996-12-03|1997-01-02|DELIVER IN PERSON|MAIL|pecial theodolites. ironic +17571|1738|39|1|43|70508.39|0.00|0.07|A|F|1992-07-06|1992-05-25|1992-07-20|TAKE BACK RETURN|AIR|ut the final foxes. slyly special request +17571|692|93|2|39|62114.91|0.10|0.05|R|F|1992-07-14|1992-05-11|1992-07-21|DELIVER IN PERSON|MAIL|ckages according to the express waters +17571|638|70|3|44|67699.72|0.07|0.07|A|F|1992-04-19|1992-04-23|1992-05-19|COLLECT COD|SHIP| express requests run carefully regul +17571|656|57|4|42|65379.30|0.06|0.00|A|F|1992-05-26|1992-05-12|1992-06-16|COLLECT COD|AIR| instructions are regular, regular +17571|1965|98|5|43|80279.28|0.06|0.07|A|F|1992-04-14|1992-04-20|1992-05-14|TAKE BACK RETURN|SHIP|ual platelets. q +17571|998|67|6|20|37979.80|0.09|0.08|A|F|1992-04-17|1992-05-02|1992-04-30|NONE|REG AIR|l instructions kindl +17571|655|18|7|18|28001.70|0.08|0.06|R|F|1992-03-23|1992-04-17|1992-04-06|DELIVER IN PERSON|SHIP|s wake slyly about the pinto +17572|1039|45|1|30|28200.90|0.06|0.05|N|O|1998-06-19|1998-06-06|1998-06-20|COLLECT COD|RAIL| wake blithely at t +17572|1111|20|2|8|8096.88|0.06|0.00|N|O|1998-06-03|1998-06-28|1998-06-13|TAKE BACK RETURN|RAIL|theodolites +17573|1905|38|1|34|61434.60|0.02|0.00|N|O|1995-10-10|1995-10-09|1995-11-03|DELIVER IN PERSON|REG AIR|ly regular requests haggle care +17573|422|81|2|26|34382.92|0.08|0.07|N|O|1995-11-02|1995-11-11|1995-11-25|TAKE BACK RETURN|AIR|dencies. slyly silent multiplie +17573|811|45|3|38|65048.78|0.03|0.07|N|O|1995-11-25|1995-11-21|1995-12-08|NONE|TRUCK|y even instructions. slyly regular foxes n +17574|724|89|1|17|27620.24|0.02|0.02|N|O|1997-11-23|1997-10-30|1997-12-07|TAKE BACK RETURN|MAIL|y special platelets boos +17575|1744|71|1|6|9874.44|0.09|0.05|N|O|1998-08-24|1998-08-19|1998-09-04|DELIVER IN PERSON|REG AIR|ous, regular accounts cajole a +17600|1274|86|1|20|23505.40|0.04|0.03|N|O|1995-12-16|1995-11-07|1995-12-25|NONE|RAIL|c accounts. blithely f +17600|1846|90|2|13|22721.92|0.09|0.05|N|O|1995-10-09|1995-12-16|1995-10-24|NONE|AIR|furiously? fluffily final packages h +17600|1574|55|3|41|60498.37|0.04|0.06|N|O|1995-12-06|1995-11-28|1996-01-03|DELIVER IN PERSON|SHIP|ously after the slyly ironic pinto beans. +17600|620|14|4|19|28891.78|0.05|0.04|N|O|1996-01-01|1995-11-08|1996-01-06|COLLECT COD|RAIL|counts integrate requests. qu +17600|1645|46|5|44|68052.16|0.09|0.03|N|O|1995-11-01|1995-12-26|1995-11-22|COLLECT COD|RAIL|uffily unusua +17600|1564|45|6|28|41035.68|0.09|0.02|N|O|1996-01-27|1995-11-17|1996-02-25|COLLECT COD|SHIP|long the carefully regular foxes are sl +17601|663|95|1|16|25018.56|0.01|0.04|N|O|1998-04-22|1998-04-01|1998-04-30|TAKE BACK RETURN|RAIL|ealthily ironic +17601|694|95|2|10|15946.90|0.07|0.08|N|O|1998-04-06|1998-05-23|1998-04-10|COLLECT COD|TRUCK|slowly express pearls wake slyly +17602|1180|17|1|18|19461.24|0.07|0.07|A|F|1992-06-13|1992-04-12|1992-07-10|DELIVER IN PERSON|TRUCK|ests sleep slyly +17603|655|87|1|49|76226.85|0.07|0.01|N|O|1998-03-16|1998-02-01|1998-04-14|DELIVER IN PERSON|AIR|ccounts use carefully. +17603|946|81|2|6|11081.64|0.06|0.05|N|O|1998-03-11|1998-03-17|1998-03-30|NONE|REG AIR|ake. final, un +17603|363|48|3|26|32847.36|0.10|0.03|N|O|1998-01-23|1998-03-15|1998-02-10|COLLECT COD|REG AIR|quickly final acco +17604|1589|90|1|22|32792.76|0.01|0.05|N|O|1998-01-13|1997-12-10|1998-02-08|TAKE BACK RETURN|REG AIR|ts. carefully ironic +17605|149|28|1|37|38818.18|0.04|0.06|N|O|1998-01-16|1998-04-02|1998-01-20|DELIVER IN PERSON|FOB|ly express re +17605|231|32|2|38|42986.74|0.06|0.07|N|O|1998-01-15|1998-04-08|1998-02-03|DELIVER IN PERSON|REG AIR|y about the blithely regul +17605|328|85|3|39|47904.48|0.03|0.05|N|O|1998-02-28|1998-03-05|1998-03-20|NONE|REG AIR|according to the special +17605|872|73|4|42|74460.54|0.04|0.04|N|O|1998-04-06|1998-04-03|1998-04-19|DELIVER IN PERSON|FOB|eas snooze along t +17605|1593|34|5|30|44837.70|0.02|0.03|N|O|1998-01-25|1998-03-13|1998-02-09|COLLECT COD|FOB|lites affix around the blithely bo +17605|475|5|6|9|12379.23|0.07|0.08|N|O|1998-04-30|1998-03-17|1998-05-03|COLLECT COD|AIR|ove the even foxes wake carefully pend +17605|1696|97|7|23|36746.87|0.10|0.05|N|O|1998-02-26|1998-03-28|1998-03-14|COLLECT COD|RAIL|. final ideas around the final foxes are fi +17606|647|48|1|26|40238.64|0.07|0.00|N|O|1997-03-24|1997-02-05|1997-04-23|TAKE BACK RETURN|FOB| the final courts +17606|1043|14|2|34|32097.36|0.09|0.08|N|O|1996-12-12|1997-02-13|1997-01-09|NONE|REG AIR| accounts sleep slyly. quiet depende +17607|218|100|1|41|45846.61|0.01|0.01|R|F|1992-06-13|1992-05-07|1992-06-24|DELIVER IN PERSON|FOB|ate slyly above the s +17632|1272|47|1|20|23465.40|0.07|0.05|A|F|1993-05-23|1993-05-10|1993-06-01|DELIVER IN PERSON|REG AIR|ously final packages. blithely silent acco +17632|852|19|2|4|7011.40|0.00|0.07|R|F|1993-03-31|1993-04-09|1993-04-30|TAKE BACK RETURN|RAIL|s nag. fluffily iron +17632|18|69|3|46|42228.46|0.01|0.07|R|F|1993-05-06|1993-03-24|1993-06-04|COLLECT COD|REG AIR|s are near the express, unusu +17632|1199|100|4|7|7701.33|0.05|0.07|R|F|1993-04-24|1993-04-25|1993-05-22|TAKE BACK RETURN|FOB|s cajole about the carefully quick r +17632|1847|77|5|28|48967.52|0.10|0.01|R|F|1993-04-20|1993-03-31|1993-04-24|COLLECT COD|FOB|lites haggle according to the +17632|491|50|6|47|65400.03|0.01|0.08|A|F|1993-04-02|1993-04-21|1993-04-13|DELIVER IN PERSON|REG AIR|sts wake fluffily packages. fu +17633|953|56|1|15|27809.25|0.10|0.06|R|F|1992-12-15|1993-01-23|1993-01-09|NONE|REG AIR|ts. sly requests bo +17633|847|81|2|6|10487.04|0.10|0.08|A|F|1992-12-06|1993-01-22|1992-12-24|COLLECT COD|FOB|ly final requests. slowly regular f +17633|624|87|3|37|56410.94|0.02|0.08|R|F|1993-03-12|1993-01-11|1993-03-18|COLLECT COD|REG AIR|e slowly ironic, unusual +17633|709|42|4|12|19316.40|0.03|0.01|R|F|1993-02-24|1993-01-01|1993-03-20|COLLECT COD|SHIP|ven multipliers wake ab +17633|1020|56|5|50|46051.00|0.06|0.05|R|F|1993-01-25|1993-02-05|1993-01-31|TAKE BACK RETURN|MAIL|ng to the blithely special d +17633|59|60|6|42|40280.10|0.01|0.05|A|F|1993-02-24|1993-02-15|1993-03-15|TAKE BACK RETURN|RAIL|s deposits? final theodolites +17633|775|8|7|32|53624.64|0.01|0.06|A|F|1993-01-25|1993-01-21|1993-02-04|DELIVER IN PERSON|RAIL|y express epitaphs above the fin +17634|1140|13|1|45|46851.30|0.05|0.04|A|F|1992-10-08|1992-09-10|1992-10-14|COLLECT COD|RAIL|r the carefu +17634|1722|23|2|17|27603.24|0.01|0.02|R|F|1992-11-11|1992-10-15|1992-11-14|TAKE BACK RETURN|TRUCK|accounts above the furi +17634|690|22|3|6|9544.14|0.06|0.06|R|F|1992-08-15|1992-09-06|1992-09-14|COLLECT COD|RAIL|uffily unusual, unusual depos +17634|605|37|4|8|12044.80|0.01|0.02|R|F|1992-10-26|1992-08-30|1992-10-27|TAKE BACK RETURN|FOB|ar, ironic ideas cajole slyly after the +17635|981|16|1|16|30111.68|0.01|0.08|R|F|1992-04-30|1992-04-06|1992-05-19|TAKE BACK RETURN|MAIL|c, careful requests wake slyly alongside o +17635|456|86|2|44|59683.80|0.05|0.04|R|F|1992-04-27|1992-04-11|1992-05-24|TAKE BACK RETURN|TRUCK|s; regular +17635|1293|31|3|33|39411.57|0.03|0.00|R|F|1992-04-16|1992-03-30|1992-04-20|TAKE BACK RETURN|SHIP|uriously. requests use. idly bol +17635|964|99|4|45|83923.20|0.08|0.03|R|F|1992-05-21|1992-05-06|1992-05-22|TAKE BACK RETURN|REG AIR|al requests. quickly even accou +17635|939|8|5|49|90156.57|0.02|0.04|A|F|1992-02-28|1992-04-01|1992-03-14|DELIVER IN PERSON|MAIL|ar pinto beans haggle slyly alongsi +17635|1028|29|6|20|18580.40|0.05|0.08|R|F|1992-03-13|1992-04-23|1992-03-21|TAKE BACK RETURN|SHIP|ackages. carefully silent +17636|1456|74|1|47|63800.15|0.04|0.07|R|F|1994-05-17|1994-04-23|1994-06-01|DELIVER IN PERSON|REG AIR| the unusual deposits cajole alo +17636|1299|37|2|16|19204.64|0.02|0.04|R|F|1994-06-04|1994-04-17|1994-07-02|DELIVER IN PERSON|FOB| use fluffily express asymptotes. ironic de +17636|999|34|3|47|89299.53|0.08|0.05|R|F|1994-05-10|1994-04-19|1994-05-26|COLLECT COD|FOB|lets. slyly +17636|322|23|4|5|6111.60|0.01|0.07|A|F|1994-02-06|1994-03-09|1994-02-26|NONE|SHIP|y special pinto beans after the ironic +17636|293|48|5|39|46538.31|0.02|0.05|R|F|1994-02-15|1994-04-28|1994-02-18|DELIVER IN PERSON|SHIP| regular platelets affix after the slyly s +17637|1958|3|1|42|78117.90|0.04|0.03|A|F|1992-11-02|1992-09-29|1992-11-30|COLLECT COD|RAIL|s forges boost slyly blithely final inst +17637|1192|93|2|17|18584.23|0.06|0.06|R|F|1992-11-01|1992-11-17|1992-11-09|DELIVER IN PERSON|FOB|olites wake ironic ideas. carefully expres +17637|369|70|3|9|11424.24|0.00|0.06|A|F|1992-11-11|1992-11-17|1992-11-18|TAKE BACK RETURN|SHIP|to beans are carefully re +17638|1320|59|1|28|34196.96|0.08|0.05|N|O|1995-12-17|1995-11-13|1996-01-01|DELIVER IN PERSON|MAIL|use furiously. furiously unusua +17638|1139|12|2|14|14561.82|0.09|0.07|N|O|1995-10-03|1995-11-23|1995-10-26|NONE|RAIL|l dinos nag quickly above the slyly exp +17638|1537|38|3|18|25893.54|0.00|0.00|N|O|1995-12-24|1995-12-03|1996-01-12|TAKE BACK RETURN|SHIP|y unusual deposits cajole alongside of +17639|1122|31|1|28|28647.36|0.01|0.06|N|O|1997-11-29|1997-11-03|1997-12-16|COLLECT COD|TRUCK|ealms. regu +17639|1455|56|2|39|52901.55|0.02|0.08|N|O|1997-12-15|1997-10-29|1998-01-12|COLLECT COD|TRUCK|gular frays. excuses use fur +17664|870|37|1|23|40730.01|0.04|0.06|N|O|1998-10-12|1998-09-15|1998-11-06|COLLECT COD|TRUCK|he slyly ironic platelets. quickly ir +17664|1371|86|2|16|20357.92|0.06|0.02|N|O|1998-08-24|1998-08-10|1998-09-23|TAKE BACK RETURN|RAIL|foxes are +17664|603|66|3|39|58640.40|0.06|0.08|N|O|1998-10-17|1998-08-15|1998-11-14|COLLECT COD|RAIL| accounts haggle fluffily +17664|392|49|4|5|6461.95|0.08|0.04|N|O|1998-08-26|1998-08-18|1998-09-08|COLLECT COD|RAIL|ven instru +17664|154|33|5|19|20028.85|0.04|0.03|N|O|1998-09-24|1998-08-11|1998-10-23|TAKE BACK RETURN|RAIL|ully slyly regular instructions. quickl +17664|371|28|6|7|8899.59|0.01|0.04|N|O|1998-08-25|1998-08-23|1998-09-10|NONE|MAIL|the packages. slyly bo +17665|622|54|1|50|76131.00|0.02|0.07|N|O|1996-05-22|1996-05-30|1996-06-11|NONE|SHIP|ly against the carefully regula +17665|645|77|2|15|23184.60|0.01|0.00|N|O|1996-06-27|1996-04-21|1996-07-15|DELIVER IN PERSON|REG AIR| excuses sle +17665|1814|1|3|49|84074.69|0.08|0.06|N|O|1996-03-10|1996-05-15|1996-03-20|DELIVER IN PERSON|SHIP|quests. fluf +17666|1191|92|1|2|2184.38|0.09|0.03|R|F|1993-12-24|1993-11-21|1994-01-19|DELIVER IN PERSON|RAIL|l theodolites. deposits w +17666|574|75|2|37|54559.09|0.01|0.05|A|F|1993-12-24|1993-11-18|1994-01-15|COLLECT COD|RAIL|nic theodolites. fluff +17666|460|61|3|5|6802.30|0.08|0.07|A|F|1993-11-25|1993-10-24|1993-12-06|DELIVER IN PERSON|SHIP|y blithely final pl +17666|1805|49|4|22|37549.60|0.06|0.04|R|F|1993-10-28|1993-11-16|1993-11-07|NONE|REG AIR| haggle. silent foxes nag carefully a +17666|1658|100|5|38|59266.70|0.09|0.07|A|F|1994-01-03|1993-11-05|1994-01-21|TAKE BACK RETURN|REG AIR|lly express asymptotes sleep bl +17667|922|23|1|31|56510.52|0.02|0.06|N|O|1998-07-13|1998-09-01|1998-08-02|NONE|SHIP|ing to the accounts. special ideas above +17667|349|78|2|17|21238.78|0.02|0.08|N|O|1998-08-30|1998-09-16|1998-08-31|COLLECT COD|FOB|symptotes are quickly? caref +17668|1521|22|1|13|18492.76|0.05|0.04|R|F|1995-03-19|1995-01-11|1995-04-08|DELIVER IN PERSON|FOB|theodolites. even, regular deposi +17668|1726|69|2|39|63481.08|0.08|0.08|R|F|1995-02-19|1995-02-14|1995-03-03|DELIVER IN PERSON|MAIL|ep furiously flu +17668|1581|62|3|26|38547.08|0.01|0.03|R|F|1995-01-23|1995-02-14|1995-02-02|NONE|TRUCK|bout the quickly even requests +17668|635|29|4|26|39926.38|0.03|0.07|R|F|1994-11-28|1995-01-24|1994-12-04|TAKE BACK RETURN|SHIP|packages. blithely +17668|1002|3|5|37|33411.00|0.10|0.04|R|F|1995-01-07|1995-01-07|1995-01-26|COLLECT COD|AIR|e slyly even accounts. thin +17668|1688|89|6|38|60407.84|0.05|0.00|A|F|1995-02-13|1995-01-04|1995-02-15|NONE|TRUCK|haggle carefull +17668|1747|32|7|43|70895.82|0.01|0.02|A|F|1995-03-11|1994-12-29|1995-03-18|TAKE BACK RETURN|REG AIR|to beans wake daringly silent courts. fluf +17669|588|19|1|21|31260.18|0.05|0.02|R|F|1994-07-16|1994-06-08|1994-07-25|NONE|AIR|xcuses cajole furiously ca +17669|658|21|2|39|60787.35|0.08|0.02|R|F|1994-06-16|1994-07-06|1994-07-09|NONE|FOB|d accounts. reque +17670|285|13|1|27|32002.56|0.05|0.05|A|F|1994-12-06|1994-11-16|1994-12-17|NONE|TRUCK|. final th +17670|810|11|2|28|47902.68|0.07|0.06|R|F|1994-12-06|1994-10-04|1994-12-31|COLLECT COD|RAIL|ctions under the regular requ +17670|739|40|3|29|47552.17|0.10|0.05|R|F|1994-10-23|1994-10-01|1994-10-27|NONE|SHIP|ges are carefully at the ironic requests +17670|1575|56|4|9|13289.13|0.04|0.05|A|F|1994-11-24|1994-10-16|1994-11-30|TAKE BACK RETURN|MAIL|lyly even requests are fluffi +17670|975|76|5|10|18759.70|0.05|0.04|A|F|1994-11-14|1994-11-15|1994-11-24|COLLECT COD|AIR| final excuses was furiously around the ev +17670|212|40|6|15|16683.15|0.08|0.05|A|F|1994-11-25|1994-11-03|1994-12-07|COLLECT COD|TRUCK| pinto beans. daringly regular pains hinder +17671|1459|99|1|38|51697.10|0.00|0.02|R|F|1992-11-29|1992-10-03|1992-12-09|TAKE BACK RETURN|TRUCK|ar ideas boost slyly unusual ex +17696|889|89|1|6|10739.28|0.10|0.06|N|O|1997-09-25|1997-08-26|1997-10-24|COLLECT COD|AIR| ironic asymptotes use. bold package +17696|1686|28|2|45|71445.60|0.10|0.03|N|O|1997-09-19|1997-08-25|1997-09-29|COLLECT COD|REG AIR|sts in place of the carefully special asy +17697|887|88|1|49|87606.12|0.05|0.06|R|F|1993-12-03|1994-01-25|1994-01-01|TAKE BACK RETURN|FOB|tealthily ironic notornis detect at the +17697|1620|3|2|49|74559.38|0.09|0.02|R|F|1994-03-18|1993-12-24|1994-04-17|DELIVER IN PERSON|TRUCK|nding frets. ironic p +17697|897|98|3|25|44947.25|0.05|0.02|R|F|1993-11-21|1994-01-12|1993-11-23|COLLECT COD|AIR|ges cajole across +17697|339|96|4|14|17350.62|0.08|0.01|A|F|1994-02-09|1993-12-20|1994-03-06|TAKE BACK RETURN|FOB|sts sleep quickly furiou +17697|1700|24|5|5|8008.50|0.08|0.05|R|F|1993-11-29|1994-02-13|1993-12-01|DELIVER IN PERSON|RAIL|ost fluffily slyly unusual f +17697|1732|75|6|42|68616.66|0.10|0.02|R|F|1993-12-31|1994-01-12|1994-01-29|NONE|REG AIR|quests print among the +17697|1679|80|7|21|33194.07|0.05|0.04|R|F|1993-11-30|1994-01-10|1993-12-22|TAKE BACK RETURN|FOB|tes are furiously after t +17698|1151|24|1|2|2104.30|0.03|0.00|R|F|1992-09-03|1992-07-14|1992-09-27|DELIVER IN PERSON|MAIL| excuses cajole. ca +17698|1150|59|2|45|47301.75|0.01|0.07|A|F|1992-07-01|1992-07-26|1992-07-04|NONE|SHIP| foxes. blithely even theodolites w +17698|1390|29|3|4|5165.56|0.00|0.03|A|F|1992-07-21|1992-07-09|1992-08-18|NONE|AIR|es according to t +17698|228|29|4|41|46257.02|0.09|0.06|A|F|1992-08-23|1992-07-09|1992-09-22|TAKE BACK RETURN|FOB| the sometimes silent packa +17698|731|32|5|41|66900.93|0.05|0.04|A|F|1992-05-18|1992-06-23|1992-06-13|COLLECT COD|REG AIR|uickly final accounts against the ca +17698|1002|38|6|10|9030.00|0.06|0.02|A|F|1992-09-05|1992-07-15|1992-09-19|NONE|FOB|nic requests boost? quietly s +17699|1190|91|1|31|33826.89|0.02|0.02|N|O|1997-10-16|1997-11-23|1997-10-27|COLLECT COD|MAIL| slyly pending foxes wake ca +17699|1698|22|2|48|76785.12|0.02|0.06|N|O|1997-11-20|1997-12-03|1997-12-09|COLLECT COD|TRUCK|latelets. furio +17699|1696|38|3|38|60712.22|0.07|0.06|N|O|1998-01-18|1997-12-03|1998-01-26|NONE|FOB|ven accounts nag c +17699|720|53|4|15|24310.80|0.04|0.08|N|O|1997-10-19|1997-12-18|1997-11-01|DELIVER IN PERSON|RAIL|nic platel +17699|405|93|5|32|41772.80|0.07|0.00|N|O|1997-12-12|1997-12-08|1997-12-25|TAKE BACK RETURN|TRUCK|ly even ideas. depo +17699|227|82|6|7|7890.54|0.03|0.07|N|O|1997-12-14|1997-11-30|1998-01-12|NONE|MAIL|x fluffily. slowly reg +17699|333|18|7|23|28366.59|0.10|0.04|N|O|1997-11-17|1997-11-18|1997-11-19|DELIVER IN PERSON|RAIL|packages nag. e +17700|609|3|1|33|49816.80|0.05|0.02|R|F|1992-11-23|1993-01-13|1992-12-06|TAKE BACK RETURN|TRUCK| to the slyly regular attainmen +17700|1653|77|2|13|20210.45|0.10|0.03|A|F|1993-02-08|1993-01-10|1993-03-03|DELIVER IN PERSON|REG AIR|o beans unw +17700|80|31|3|46|45083.68|0.07|0.00|A|F|1993-02-05|1992-12-06|1993-02-15|NONE|MAIL| dolphins enga +17700|1685|27|4|23|36493.64|0.01|0.02|A|F|1992-11-04|1993-01-11|1992-11-12|COLLECT COD|REG AIR| unusual packages sleep sl +17700|395|24|5|4|5181.56|0.06|0.07|R|F|1992-12-09|1992-12-30|1992-12-31|DELIVER IN PERSON|FOB| carefully furiously regular +17700|1829|59|6|31|53655.42|0.02|0.04|A|F|1992-12-04|1992-11-28|1992-12-11|NONE|REG AIR|blithely silent excuses haggle dar +17701|923|92|1|43|78428.56|0.05|0.06|R|F|1992-06-07|1992-07-18|1992-06-24|NONE|REG AIR|ven pains. blithely +17701|1957|2|2|41|76216.95|0.07|0.04|A|F|1992-07-26|1992-08-04|1992-08-14|DELIVER IN PERSON|AIR|ts run fluffily. quickly bold ins +17701|513|14|3|17|24029.67|0.02|0.03|A|F|1992-08-08|1992-08-03|1992-08-20|DELIVER IN PERSON|AIR|ngly regular asy +17701|1228|29|4|10|11292.20|0.02|0.04|R|F|1992-08-11|1992-08-19|1992-09-10|TAKE BACK RETURN|AIR|along the blithely ironic +17701|305|6|5|11|13258.30|0.07|0.07|A|F|1992-08-26|1992-08-01|1992-09-17|COLLECT COD|FOB|usual, bold requests will have to was +17701|1986|87|6|18|33983.64|0.02|0.00|R|F|1992-09-10|1992-07-15|1992-09-20|DELIVER IN PERSON|RAIL|ongside of the quickly ironic depo +17701|156|57|7|27|28516.05|0.07|0.03|R|F|1992-06-15|1992-08-05|1992-07-04|TAKE BACK RETURN|SHIP|ckly regular platelets hang slo +17702|83|59|1|47|46204.76|0.10|0.07|R|F|1992-07-10|1992-05-27|1992-07-22|DELIVER IN PERSON|MAIL|ly. regular foxes h +17702|460|61|2|25|34011.50|0.06|0.08|R|F|1992-07-07|1992-06-29|1992-08-02|COLLECT COD|FOB|uests. furiously final deposits +17702|1190|63|3|38|41465.22|0.10|0.01|R|F|1992-08-06|1992-07-07|1992-08-22|COLLECT COD|MAIL|de of the carefully ironic co +17702|947|16|4|23|42502.62|0.00|0.01|A|F|1992-06-03|1992-06-09|1992-06-04|DELIVER IN PERSON|AIR|arefully. even, expre +17702|379|8|5|22|28146.14|0.07|0.01|A|F|1992-05-01|1992-05-28|1992-05-27|COLLECT COD|AIR|egular packages. slyly +17702|1895|39|6|41|73672.49|0.06|0.00|R|F|1992-06-12|1992-05-24|1992-06-21|COLLECT COD|RAIL|fully unusual foxes. theodolites along the +17703|429|30|1|28|37223.76|0.07|0.03|N|O|1996-08-03|1996-07-31|1996-08-29|COLLECT COD|FOB|place of the b +17703|64|65|2|12|11568.72|0.02|0.04|N|O|1996-05-24|1996-06-20|1996-06-11|DELIVER IN PERSON|RAIL|even ideas. quickly even request +17703|1059|60|3|42|40322.10|0.08|0.05|N|O|1996-08-25|1996-08-01|1996-09-10|TAKE BACK RETURN|TRUCK|instructions. ironic accounts wake f +17703|1561|2|4|34|49727.04|0.05|0.02|N|O|1996-07-02|1996-06-29|1996-07-05|NONE|MAIL|fully final packages affix blithely a +17728|485|86|1|20|27709.60|0.10|0.04|N|O|1998-07-01|1998-05-12|1998-07-03|TAKE BACK RETURN|TRUCK|carefully even notornis haggle quickly. +17729|1270|71|1|20|23425.40|0.01|0.08|R|F|1993-08-20|1993-06-03|1993-09-03|TAKE BACK RETURN|MAIL|ts. regular, final requests along +17729|242|70|2|45|51400.80|0.06|0.02|A|F|1993-07-29|1993-06-04|1993-08-17|NONE|MAIL|ously ironic packages. quickly +17729|1529|30|3|29|41485.08|0.09|0.05|A|F|1993-05-05|1993-07-06|1993-06-01|TAKE BACK RETURN|FOB|c requests sleep bravely. caref +17729|735|68|4|10|16357.30|0.03|0.03|A|F|1993-07-08|1993-06-22|1993-07-12|NONE|MAIL|ffily ironic instructions cajole +17729|632|33|5|30|45978.90|0.05|0.05|R|F|1993-08-11|1993-07-07|1993-08-23|COLLECT COD|MAIL|ep fluffily carefully ironic i +17730|327|28|1|21|25773.72|0.10|0.03|N|O|1998-03-24|1998-04-17|1998-04-11|TAKE BACK RETURN|RAIL|lar foxes. bol +17730|1693|35|2|23|36677.87|0.09|0.02|N|O|1998-02-20|1998-03-25|1998-03-12|COLLECT COD|REG AIR|lly even accounts unwind slyly above the s +17731|598|59|1|13|19481.67|0.02|0.05|N|O|1998-02-08|1998-02-02|1998-02-28|COLLECT COD|RAIL|ely even the +17731|1882|26|2|17|30325.96|0.09|0.04|N|O|1998-02-18|1998-02-09|1998-03-13|TAKE BACK RETURN|TRUCK| blithely final accounts. final, +17731|116|95|3|8|8128.88|0.02|0.02|N|O|1997-12-24|1997-12-23|1998-01-07|TAKE BACK RETURN|MAIL| platelets. dependencies are blithely. s +17731|1287|62|4|23|27330.44|0.02|0.00|N|O|1998-01-04|1998-01-07|1998-01-20|DELIVER IN PERSON|FOB|iously express deposits are. fur +17731|178|79|5|2|2156.34|0.06|0.01|N|O|1998-01-14|1998-01-10|1998-01-24|NONE|TRUCK| express fo +17731|213|68|6|32|35622.72|0.06|0.00|N|O|1998-02-26|1998-01-12|1998-02-27|NONE|RAIL| unusual accounts use pe +17732|458|59|1|45|61130.25|0.02|0.08|N|O|1997-04-27|1997-04-11|1997-05-07|COLLECT COD|RAIL|ironic accounts +17732|521|82|2|47|66811.44|0.09|0.03|N|O|1997-05-17|1997-04-01|1997-05-31|NONE|RAIL|ests across the p +17733|515|16|1|35|49542.85|0.08|0.00|N|O|1996-08-17|1996-08-26|1996-08-25|DELIVER IN PERSON|FOB|cuses. requests sleep fluffily according +17733|609|3|2|50|75480.00|0.09|0.04|N|O|1996-09-13|1996-08-16|1996-10-13|COLLECT COD|RAIL|quickly. blithel +17733|1453|93|3|25|33861.25|0.07|0.08|N|O|1996-07-21|1996-07-14|1996-07-24|COLLECT COD|REG AIR|after the pinto beans. furiously final ins +17733|1153|62|4|24|25299.60|0.08|0.02|N|O|1996-07-12|1996-07-06|1996-08-06|COLLECT COD|SHIP|fully final sentiments. furiously ir +17733|29|5|5|23|21367.46|0.08|0.07|N|O|1996-06-13|1996-08-29|1996-06-28|COLLECT COD|MAIL|egrate furiously regula +17734|108|35|1|2|2016.20|0.05|0.05|N|O|1996-11-09|1996-10-25|1996-11-18|TAKE BACK RETURN|MAIL|unusual accounts. +17735|1624|48|1|43|65601.66|0.08|0.06|A|F|1992-07-16|1992-08-17|1992-08-07|TAKE BACK RETURN|FOB|instructions. care +17735|48|99|2|40|37921.60|0.04|0.05|R|F|1992-11-11|1992-10-04|1992-11-15|TAKE BACK RETURN|REG AIR|ld instructions nag boldly. +17735|321|6|3|47|57402.04|0.07|0.04|A|F|1992-07-31|1992-09-06|1992-08-21|DELIVER IN PERSON|MAIL|ickly regu +17735|862|29|4|42|74040.12|0.07|0.07|R|F|1992-08-18|1992-10-08|1992-09-03|COLLECT COD|MAIL|ecial instructions sleep fin +17735|703|100|5|3|4811.10|0.05|0.05|R|F|1992-11-05|1992-09-18|1992-11-27|NONE|MAIL|n packages. carefully +17760|71|72|1|5|4855.35|0.10|0.06|R|F|1992-07-05|1992-08-06|1992-07-23|DELIVER IN PERSON|SHIP|he pending theod +17760|140|41|2|31|32244.34|0.08|0.05|R|F|1992-09-05|1992-07-31|1992-09-10|COLLECT COD|FOB|lithely carefully special deposits. car +17760|1978|79|3|25|46999.25|0.03|0.00|A|F|1992-09-17|1992-07-08|1992-09-30|COLLECT COD|MAIL|Tiresias serve. special foxes cajole regula +17760|1935|36|4|5|9184.65|0.04|0.05|A|F|1992-10-04|1992-08-31|1992-10-18|DELIVER IN PERSON|TRUCK|l asymptote +17760|950|85|5|24|44422.80|0.10|0.04|A|F|1992-08-26|1992-07-24|1992-09-14|DELIVER IN PERSON|REG AIR|ding accounts wake slyly above the speci +17760|29|55|6|31|28799.62|0.08|0.07|R|F|1992-07-19|1992-07-10|1992-08-09|DELIVER IN PERSON|RAIL|le idle deposits. ideas nag slyly acco +17760|1598|19|7|3|4498.77|0.04|0.03|R|F|1992-08-13|1992-09-02|1992-08-27|NONE|RAIL| of the car +17761|745|46|1|50|82287.00|0.02|0.01|R|F|1993-10-28|1993-08-09|1993-11-23|TAKE BACK RETURN|MAIL| haggle about the enticingly pending ac +17761|1967|68|2|33|61675.68|0.08|0.04|A|F|1993-10-11|1993-08-13|1993-10-22|COLLECT COD|MAIL|posits sleep along the even packages. unu +17761|1062|33|3|27|26002.62|0.04|0.08|A|F|1993-10-24|1993-09-10|1993-10-29|DELIVER IN PERSON|FOB|ly daring multipl +17761|1433|51|4|7|9341.01|0.05|0.08|R|F|1993-10-17|1993-08-07|1993-10-18|TAKE BACK RETURN|MAIL|oxes are slyly accounts. ironic, regul +17762|645|39|1|50|77282.00|0.02|0.08|N|O|1998-05-15|1998-04-29|1998-06-14|TAKE BACK RETURN|RAIL|ress final depo +17762|1921|66|2|29|52864.68|0.07|0.01|N|O|1998-02-27|1998-04-10|1998-03-09|DELIVER IN PERSON|REG AIR|its. brave, bold pinto beans above the fu +17762|328|29|3|17|20881.44|0.02|0.00|N|O|1998-06-04|1998-05-03|1998-06-30|COLLECT COD|AIR|ly regular +17762|225|26|4|37|41633.14|0.05|0.04|N|O|1998-06-08|1998-05-14|1998-06-19|NONE|RAIL| wake. slyly ironic +17762|1443|83|5|1|1344.44|0.06|0.04|N|O|1998-03-03|1998-05-08|1998-03-23|TAKE BACK RETURN|RAIL|kly ironic accounts sublate. caref +17762|1499|17|6|42|58820.58|0.08|0.05|N|O|1998-05-13|1998-04-06|1998-05-25|TAKE BACK RETURN|SHIP|ges cajole packages. final as +17763|1153|26|1|44|46382.60|0.01|0.06|N|O|1997-08-06|1997-06-06|1997-08-26|NONE|MAIL|regular pi +17763|1823|24|2|30|51744.60|0.10|0.06|N|O|1997-07-02|1997-07-26|1997-07-13|DELIVER IN PERSON|TRUCK|y silent requests +17763|1133|70|3|16|16546.08|0.05|0.03|N|O|1997-08-15|1997-06-06|1997-08-19|TAKE BACK RETURN|MAIL|gular theodolites affix blithely idle +17763|472|60|4|23|31566.81|0.04|0.08|N|O|1997-05-08|1997-06-24|1997-05-13|DELIVER IN PERSON|FOB|ironic ideas are carefully a +17764|1320|21|1|6|7327.92|0.05|0.05|A|F|1994-12-03|1994-12-07|1994-12-27|TAKE BACK RETURN|SHIP|o the slyly fi +17764|3|4|2|22|19866.00|0.01|0.03|R|F|1994-12-24|1994-12-03|1995-01-09|DELIVER IN PERSON|MAIL|l dependencies u +17764|1866|10|3|39|68946.54|0.02|0.06|A|F|1995-01-11|1994-10-25|1995-01-21|DELIVER IN PERSON|RAIL|kages cajole pen +17765|795|60|1|42|71223.18|0.04|0.04|N|O|1995-10-07|1995-11-24|1995-10-10|COLLECT COD|TRUCK|aggle above +17765|1210|48|2|44|48893.24|0.02|0.02|N|O|1996-01-05|1995-10-16|1996-01-17|TAKE BACK RETURN|FOB|requests. fluffily even requests slee +17765|365|22|3|28|35430.08|0.02|0.00|N|O|1995-12-05|1995-10-18|1995-12-21|NONE|MAIL|cial packages haggle s +17765|243|44|4|46|52589.04|0.03|0.01|N|O|1995-10-11|1995-12-05|1995-10-14|TAKE BACK RETURN|AIR|counts wake slyly +17765|942|43|5|28|51602.32|0.04|0.05|N|O|1995-10-26|1995-11-24|1995-11-03|TAKE BACK RETURN|REG AIR|eans. regular, bold pinto beans acros +17766|1934|79|1|24|44062.32|0.01|0.03|N|O|1996-10-29|1996-12-10|1996-11-09|COLLECT COD|AIR|thely around the bold ide +17767|1586|27|1|23|34214.34|0.01|0.04|N|O|1997-01-24|1997-02-06|1997-02-12|TAKE BACK RETURN|REG AIR|ual deposits +17792|886|86|1|25|44672.00|0.01|0.07|N|O|1997-01-23|1997-01-16|1997-02-08|NONE|AIR|ckages. blithely special packages +17792|1766|67|2|20|33355.20|0.04|0.01|N|O|1996-11-30|1996-12-22|1996-12-09|DELIVER IN PERSON|RAIL|about the reg +17792|951|20|3|39|72226.05|0.00|0.02|N|O|1997-03-04|1997-01-08|1997-03-27|NONE|REG AIR|ts sleep slyly bold +17792|1384|61|4|21|26992.98|0.06|0.02|N|O|1997-01-01|1997-02-14|1997-01-06|COLLECT COD|RAIL| final deposits. f +17792|402|3|5|50|65120.00|0.08|0.03|N|O|1997-02-07|1997-01-17|1997-02-27|NONE|AIR|rs wake quietly. carefully +17792|636|99|6|11|16902.93|0.06|0.00|N|O|1996-12-03|1997-01-17|1997-01-02|NONE|REG AIR|arefully regular foxes use expres +17792|774|75|7|8|13398.16|0.06|0.02|N|O|1997-01-15|1996-12-27|1997-01-29|NONE|AIR|gular request +17793|1986|31|1|45|84959.10|0.01|0.06|N|O|1996-07-18|1996-08-03|1996-08-01|TAKE BACK RETURN|SHIP|r, pending foxes dete +17794|1626|9|1|34|51939.08|0.01|0.00|A|F|1994-06-13|1994-06-08|1994-06-24|DELIVER IN PERSON|SHIP|y silent foxes promise against the c +17794|1349|88|2|32|40010.88|0.07|0.00|A|F|1994-04-27|1994-07-02|1994-05-20|NONE|REG AIR|eposits cajole deposits. carefu +17794|1466|67|3|32|43758.72|0.01|0.02|R|F|1994-05-22|1994-06-25|1994-05-31|TAKE BACK RETURN|TRUCK|uctions haggle across +17794|1603|45|4|25|37615.00|0.01|0.07|R|F|1994-04-06|1994-06-24|1994-05-02|COLLECT COD|AIR|ess foxes u +17794|486|87|5|8|11091.84|0.01|0.04|R|F|1994-06-30|1994-05-14|1994-07-21|NONE|REG AIR|usly despite the pending packages. bli +17794|1803|4|6|34|57963.20|0.00|0.03|A|F|1994-05-27|1994-05-08|1994-06-23|DELIVER IN PERSON|RAIL|egular requests. carefully final foxes caj +17795|1351|90|1|48|60112.80|0.02|0.01|A|F|1994-04-17|1994-05-28|1994-04-29|COLLECT COD|RAIL|old ideas wake blithely across the per +17795|944|47|2|49|90402.06|0.01|0.07|A|F|1994-04-03|1994-05-22|1994-04-10|DELIVER IN PERSON|MAIL| regular pains +17795|130|57|3|22|22662.86|0.01|0.02|R|F|1994-07-22|1994-06-24|1994-08-04|NONE|SHIP|ending pac +17795|1327|66|4|16|19653.12|0.10|0.08|A|F|1994-06-15|1994-06-03|1994-07-15|DELIVER IN PERSON|RAIL|arefully among the even, s +17795|791|88|5|22|37219.38|0.02|0.04|A|F|1994-08-01|1994-05-27|1994-08-27|COLLECT COD|REG AIR|to beans integrate slyly. even as +17795|47|98|6|8|7576.32|0.07|0.07|A|F|1994-08-01|1994-05-29|1994-08-07|COLLECT COD|AIR|ts. slyly special instructi +17796|1671|95|1|45|70770.15|0.01|0.06|N|O|1995-06-22|1995-07-15|1995-07-04|COLLECT COD|MAIL|y. carefully reg +17796|128|29|2|7|7196.84|0.00|0.04|N|F|1995-05-28|1995-05-29|1995-06-22|DELIVER IN PERSON|AIR|ely. unusual, furious escapades cajo +17796|202|30|3|20|22044.00|0.03|0.07|A|F|1995-05-09|1995-06-03|1995-05-18|COLLECT COD|SHIP|ic escapades cajole around the theodol +17796|855|89|4|13|22826.05|0.01|0.04|N|O|1995-08-19|1995-07-02|1995-09-17|TAKE BACK RETURN|FOB|l dugouts. fluffily regula +17797|63|89|1|17|16372.02|0.02|0.02|A|F|1992-08-18|1992-09-23|1992-08-21|TAKE BACK RETURN|REG AIR| requests about +17797|1750|77|2|32|52856.00|0.10|0.01|R|F|1992-10-27|1992-08-31|1992-11-14|TAKE BACK RETURN|AIR|nal accounts doubt +17797|1030|1|3|32|29792.96|0.05|0.05|R|F|1992-08-01|1992-09-08|1992-08-17|COLLECT COD|MAIL|g accounts. fluffi +17798|566|27|1|37|54262.72|0.05|0.01|A|F|1993-01-31|1993-01-19|1993-02-12|DELIVER IN PERSON|AIR|riously ab +17798|556|47|2|34|49522.70|0.08|0.03|A|F|1993-01-05|1993-01-22|1993-01-08|TAKE BACK RETURN|MAIL| slyly against the pending accounts. speci +17798|1873|17|3|2|3549.74|0.01|0.00|R|F|1993-01-25|1992-12-19|1993-02-19|TAKE BACK RETURN|TRUCK|ructions. blithel +17798|328|85|4|1|1228.32|0.03|0.08|R|F|1992-11-17|1992-12-03|1992-11-28|DELIVER IN PERSON|MAIL|le blithely across the slyly final depende +17798|1725|10|5|22|35787.84|0.08|0.03|R|F|1993-01-31|1993-01-20|1993-02-27|COLLECT COD|REG AIR| ironic deposits +17798|14|15|6|49|44786.49|0.06|0.05|A|F|1993-02-22|1993-01-05|1993-03-22|DELIVER IN PERSON|MAIL|ests sleep quickly silent instructions. qui +17799|1602|3|1|15|22554.00|0.01|0.07|R|F|1992-11-24|1992-11-17|1992-12-07|COLLECT COD|FOB|g the fluffily regula +17799|1742|85|2|1|1643.74|0.07|0.07|A|F|1992-11-15|1992-11-27|1992-11-23|TAKE BACK RETURN|RAIL|ainst the caref +17799|1180|81|3|4|4324.72|0.03|0.05|R|F|1992-11-26|1992-11-10|1992-12-10|DELIVER IN PERSON|SHIP|ites. blithel +17799|1413|14|4|37|48633.17|0.08|0.00|R|F|1992-10-07|1992-12-15|1992-10-28|COLLECT COD|MAIL|unts haggle blithely. ironic packa +17824|1394|95|1|29|37566.31|0.10|0.07|N|O|1996-07-01|1996-07-21|1996-07-15|TAKE BACK RETURN|MAIL|ithely. permanently regular deposits w +17824|1217|55|2|4|4472.84|0.07|0.04|N|O|1996-09-20|1996-06-29|1996-10-18|COLLECT COD|AIR|ogs sleep flu +17824|856|90|3|17|29866.45|0.07|0.01|N|O|1996-07-04|1996-08-02|1996-07-10|DELIVER IN PERSON|REG AIR|ding to the final accounts affix c +17824|838|39|4|5|8694.15|0.00|0.01|N|O|1996-08-03|1996-08-10|1996-08-07|DELIVER IN PERSON|RAIL|inst the blithely quiet courts. +17825|373|58|1|33|42021.21|0.00|0.07|R|F|1993-01-30|1993-03-30|1993-02-17|COLLECT COD|SHIP| fluffily e +17825|1930|63|2|10|18319.30|0.06|0.07|A|F|1993-05-05|1993-03-21|1993-06-04|COLLECT COD|MAIL|alongside of the slyly spec +17825|586|87|3|37|55003.46|0.02|0.01|A|F|1993-03-01|1993-03-19|1993-03-19|TAKE BACK RETURN|AIR|dencies nag +17825|780|13|4|37|62188.86|0.10|0.03|R|F|1993-04-10|1993-03-09|1993-04-17|COLLECT COD|SHIP|ses. regular, ironic instructions engage bl +17825|1471|11|5|27|37056.69|0.02|0.07|R|F|1993-03-26|1993-02-16|1993-03-28|TAKE BACK RETURN|FOB| silent theo +17825|1862|92|6|43|75845.98|0.07|0.05|A|F|1993-02-27|1993-02-25|1993-03-21|DELIVER IN PERSON|RAIL|ong the slyly unusual accounts are sl +17826|390|75|1|20|25807.80|0.00|0.06|A|F|1992-09-12|1992-07-31|1992-09-17|TAKE BACK RETURN|RAIL|ainst the furiously ironic deposits. r +17826|1782|9|2|25|42094.50|0.08|0.07|R|F|1992-07-02|1992-09-20|1992-07-29|COLLECT COD|MAIL|tions promis +17826|329|58|3|17|20898.44|0.03|0.05|R|F|1992-08-25|1992-08-13|1992-09-09|DELIVER IN PERSON|FOB|press reque +17826|914|15|4|49|88930.59|0.10|0.03|A|F|1992-09-15|1992-08-21|1992-10-09|DELIVER IN PERSON|SHIP|fully expres +17827|1243|55|1|29|33182.96|0.04|0.08|N|O|1996-12-18|1996-10-31|1997-01-05|COLLECT COD|SHIP|y alongside +17827|1629|12|2|12|18367.44|0.01|0.08|N|O|1996-09-17|1996-10-09|1996-09-21|TAKE BACK RETURN|FOB|lyly. bold, ironic excuses ab +17827|1287|99|3|27|32083.56|0.07|0.08|N|O|1996-09-26|1996-09-27|1996-10-12|DELIVER IN PERSON|FOB|ngside of the qui +17827|571|2|4|46|67692.22|0.06|0.00|N|O|1996-11-15|1996-09-30|1996-11-16|DELIVER IN PERSON|FOB|nic ideas sleep slyly across the dogg +17827|884|84|5|3|5354.64|0.05|0.07|N|O|1996-08-31|1996-10-24|1996-09-22|TAKE BACK RETURN|FOB|ckages nag f +17827|539|100|6|29|41746.37|0.02|0.04|N|O|1996-11-22|1996-09-28|1996-11-29|COLLECT COD|SHIP|ges about the special acc +17828|1305|44|1|39|47045.70|0.02|0.08|N|O|1996-03-03|1996-02-11|1996-03-29|TAKE BACK RETURN|FOB|inly regular instruct +17828|1218|56|2|32|35814.72|0.07|0.02|N|O|1996-04-04|1996-03-27|1996-04-19|TAKE BACK RETURN|REG AIR|nts along the quickly ironic +17828|276|4|3|38|44698.26|0.08|0.06|N|O|1996-05-05|1996-03-15|1996-05-31|NONE|REG AIR|kly along the quietly regular ins +17828|1751|36|4|45|74373.75|0.04|0.08|N|O|1996-04-13|1996-03-17|1996-05-11|COLLECT COD|TRUCK|ng to the accounts. even pa +17828|1284|22|5|35|41484.80|0.01|0.07|N|O|1996-04-07|1996-02-13|1996-04-21|NONE|TRUCK| according to th +17828|1786|13|6|23|38818.94|0.07|0.04|N|O|1996-02-01|1996-04-04|1996-02-11|TAKE BACK RETURN|SHIP|ounts. regular, regu +17828|785|50|7|8|13486.24|0.00|0.05|N|O|1996-02-12|1996-03-07|1996-03-06|COLLECT COD|MAIL|onic, even request +17829|1233|34|1|48|54443.04|0.01|0.07|A|F|1994-07-03|1994-06-04|1994-07-18|DELIVER IN PERSON|AIR| detect carefully slyly iron +17829|589|50|2|14|20854.12|0.08|0.00|A|F|1994-03-22|1994-05-03|1994-04-10|COLLECT COD|MAIL|posits engage blithely ironic p +17829|535|26|3|31|44501.43|0.07|0.01|A|F|1994-03-28|1994-05-21|1994-04-17|TAKE BACK RETURN|TRUCK|ly even ideas haggle unusual r +17830|353|38|1|19|23813.65|0.10|0.06|N|O|1996-12-22|1996-11-20|1997-01-15|DELIVER IN PERSON|AIR|uests. carefully ironic w +17830|939|8|2|21|38638.53|0.08|0.06|N|O|1996-12-19|1996-11-10|1997-01-01|NONE|AIR| depths. furiously regular excuses cajol +17831|1765|92|1|48|80004.48|0.03|0.03|A|F|1992-12-10|1992-12-27|1993-01-08|COLLECT COD|AIR|riously final accou +17831|590|21|2|49|73038.91|0.02|0.05|R|F|1992-11-10|1992-12-28|1992-11-29|TAKE BACK RETURN|REG AIR|kages must have to wake fluf +17831|979|82|3|3|5639.91|0.00|0.01|R|F|1992-11-25|1992-12-28|1992-11-26|NONE|REG AIR|ids. blithely even theodolites should have +17831|206|7|4|18|19911.60|0.04|0.03|R|F|1992-11-28|1992-12-16|1992-12-16|TAKE BACK RETURN|FOB|lyly. carefully express +17831|1321|60|5|25|30558.00|0.08|0.02|A|F|1993-02-17|1993-01-06|1993-02-28|NONE|REG AIR| the ruthlessly regular requests. f +17856|231|13|1|10|11312.30|0.10|0.04|N|O|1997-03-07|1997-02-15|1997-03-18|NONE|REG AIR| silent requests. blithely special +17856|507|68|2|15|21112.50|0.08|0.03|N|O|1997-03-06|1997-01-25|1997-03-15|COLLECT COD|MAIL|ithely ironic +17856|301|86|3|35|42045.50|0.02|0.04|N|O|1997-03-20|1996-12-27|1997-04-06|DELIVER IN PERSON|REG AIR|ly against the fi +17857|507|68|1|32|45040.00|0.06|0.03|N|O|1997-06-24|1997-07-14|1997-07-21|COLLECT COD|AIR|quickly against the blithely u +17857|1425|43|2|2|2652.84|0.08|0.08|N|O|1997-06-17|1997-08-03|1997-06-20|NONE|REG AIR|he fluffily regula +17857|1527|68|3|6|8571.12|0.07|0.06|N|O|1997-07-26|1997-08-21|1997-08-25|DELIVER IN PERSON|TRUCK|ses cajole slyly bold packages. c +17857|636|68|4|12|18439.56|0.05|0.02|N|O|1997-07-24|1997-08-28|1997-08-13|NONE|RAIL|ounts after the unusual r +17857|436|24|5|48|64148.64|0.05|0.00|N|O|1997-09-07|1997-08-25|1997-10-05|COLLECT COD|AIR|affix. furiously pending requests lose. clo +17857|1791|92|6|28|47398.12|0.01|0.02|N|O|1997-08-24|1997-08-04|1997-09-12|DELIVER IN PERSON|TRUCK|nic accounts alongsid +17857|1185|94|7|13|14120.34|0.05|0.08|N|O|1997-06-30|1997-08-17|1997-07-25|NONE|SHIP|ously regular the +17858|1457|75|1|4|5433.80|0.08|0.07|A|F|1993-12-15|1993-11-23|1994-01-01|TAKE BACK RETURN|TRUCK|s use blithely against t +17858|1087|88|2|12|11856.96|0.05|0.08|R|F|1993-11-03|1993-11-29|1993-11-30|DELIVER IN PERSON|FOB|nding packages nag deposits. i +17858|1174|11|3|39|41931.63|0.02|0.01|A|F|1994-01-19|1993-11-20|1994-02-17|DELIVER IN PERSON|MAIL|integrate after t +17858|1550|91|4|15|21773.25|0.03|0.02|R|F|1993-10-20|1993-12-11|1993-10-24|DELIVER IN PERSON|AIR| packages. even, unusual d +17858|470|29|5|43|58930.21|0.00|0.06|A|F|1993-12-14|1993-10-30|1994-01-04|DELIVER IN PERSON|AIR|he final pinto beans. silent +17858|452|82|6|26|35163.70|0.07|0.06|A|F|1993-09-29|1993-12-14|1993-10-26|NONE|TRUCK|yly final accounts haggle carefully alongs +17858|478|8|7|22|30326.34|0.02|0.03|R|F|1993-12-30|1993-11-20|1994-01-08|DELIVER IN PERSON|FOB|hrough the carefully silent theodolites. +17859|1047|83|1|10|9480.40|0.05|0.06|R|F|1993-06-27|1993-07-28|1993-07-22|DELIVER IN PERSON|TRUCK|uses are slyly thr +17859|798|31|2|43|73047.97|0.04|0.06|A|F|1993-09-14|1993-08-04|1993-09-28|COLLECT COD|TRUCK| haggle instructions. qu +17859|468|98|3|48|65686.08|0.07|0.08|R|F|1993-07-11|1993-08-05|1993-08-10|DELIVER IN PERSON|MAIL| packages. unusual, regular foxes use f +17859|547|78|4|5|7237.70|0.01|0.06|R|F|1993-08-03|1993-07-31|1993-08-22|NONE|MAIL|en ideas. slyly final +17859|327|12|5|2|2454.64|0.05|0.07|A|F|1993-08-11|1993-07-16|1993-09-03|TAKE BACK RETURN|TRUCK|ts. blithely special theodolites boost alon +17860|1970|15|1|43|80494.71|0.09|0.02|R|F|1995-04-22|1995-06-03|1995-05-02|TAKE BACK RETURN|AIR|cajole after the boldly eve +17860|898|99|2|36|64760.04|0.06|0.03|N|O|1995-07-03|1995-06-27|1995-07-11|COLLECT COD|TRUCK|ly close re +17860|476|77|3|44|60564.68|0.03|0.03|N|O|1995-07-22|1995-05-07|1995-08-03|COLLECT COD|REG AIR|ld requests according to the evenly iron +17860|720|21|4|7|11345.04|0.01|0.00|R|F|1995-04-22|1995-06-07|1995-05-09|TAKE BACK RETURN|REG AIR|s the furiously bold fo +17860|1894|81|5|24|43101.36|0.06|0.08|A|F|1995-04-16|1995-05-08|1995-04-19|TAKE BACK RETURN|FOB|integrate according to th +17861|1639|63|1|26|40056.38|0.08|0.06|N|O|1997-02-17|1996-12-20|1997-02-28|TAKE BACK RETURN|MAIL| ironic ideas must have to boost carefull +17861|339|40|2|23|28504.59|0.02|0.01|N|O|1997-02-23|1997-01-26|1997-03-13|COLLECT COD|SHIP|olites boost carefully final foxes. +17861|152|79|3|27|28408.05|0.08|0.05|N|O|1996-12-21|1996-12-02|1997-01-05|NONE|AIR|e blithely ironi +17862|289|17|1|45|53517.60|0.01|0.01|R|F|1992-06-17|1992-07-16|1992-07-14|DELIVER IN PERSON|MAIL|nd the pinto beans use carefully agains +17862|958|27|2|43|79934.85|0.00|0.02|R|F|1992-08-13|1992-06-11|1992-09-01|DELIVER IN PERSON|AIR|asymptotes +17862|1037|8|3|13|12194.39|0.07|0.02|R|F|1992-07-11|1992-06-11|1992-07-20|TAKE BACK RETURN|MAIL|ding pinto beans ac +17862|1290|28|4|7|8339.03|0.03|0.04|A|F|1992-07-19|1992-08-04|1992-08-03|TAKE BACK RETURN|REG AIR|ic ideas? pending accounts ar +17862|1575|96|5|11|16242.27|0.06|0.02|A|F|1992-06-06|1992-07-31|1992-07-06|DELIVER IN PERSON|TRUCK|ns. even deposits play slyly above the +17862|1936|81|6|15|27568.95|0.08|0.05|A|F|1992-06-01|1992-06-10|1992-06-30|DELIVER IN PERSON|FOB|bold packages bo +17863|1995|40|1|4|7587.96|0.02|0.04|N|O|1996-06-10|1996-08-06|1996-06-23|TAKE BACK RETURN|TRUCK|regular Tiresias. instr +17888|553|54|1|5|7267.75|0.08|0.06|N|O|1996-04-08|1996-02-12|1996-04-16|COLLECT COD|SHIP|lar deposi +17888|1722|7|2|45|73067.40|0.06|0.04|N|O|1996-03-14|1996-02-20|1996-03-23|TAKE BACK RETURN|RAIL|refully pending accounts. ironic, +17888|834|35|3|2|3469.66|0.10|0.05|N|O|1996-04-10|1996-02-18|1996-04-24|NONE|SHIP|s nag. carefully +17889|1889|19|1|32|57308.16|0.04|0.06|A|F|1992-10-27|1992-10-31|1992-10-31|NONE|RAIL|pecial pinto beans cajole specia +17889|1230|42|2|12|13574.76|0.02|0.04|R|F|1992-11-18|1992-10-04|1992-12-17|TAKE BACK RETURN|MAIL|g requests. regular packages doubt slyly +17889|185|38|3|27|29299.86|0.03|0.06|R|F|1992-11-18|1992-10-31|1992-12-07|DELIVER IN PERSON|REG AIR|ly. accounts c +17889|1790|33|4|8|13534.32|0.01|0.03|R|F|1992-09-20|1992-09-09|1992-09-23|NONE|TRUCK|ly final requ +17890|261|43|1|43|49934.18|0.08|0.03|N|O|1995-11-10|1995-12-19|1995-12-05|NONE|AIR|detect blithely after the carefully regul +17891|652|46|1|37|57448.05|0.06|0.02|R|F|1995-01-09|1995-02-11|1995-01-21|NONE|SHIP|ully bold courts +17891|1419|98|2|23|30369.43|0.07|0.04|A|F|1995-04-20|1995-02-28|1995-05-05|NONE|RAIL|tes snooze. quick +17891|625|57|3|22|33563.64|0.00|0.06|A|F|1995-02-13|1995-02-23|1995-02-16|COLLECT COD|RAIL|furiously silent realms wake furiousl +17891|682|83|4|2|3165.36|0.02|0.07|A|F|1995-01-25|1995-02-18|1995-02-14|COLLECT COD|FOB| furiously ironic pac +17892|1819|6|1|22|37857.82|0.01|0.02|N|O|1996-11-28|1996-10-16|1996-12-28|COLLECT COD|SHIP|e fluffily. fluffily express ideas +17892|1477|78|2|43|59274.21|0.06|0.04|N|O|1996-11-09|1996-10-27|1996-11-30|COLLECT COD|SHIP|latelets. blithely reg +17892|437|25|3|13|17386.59|0.08|0.01|N|O|1996-11-14|1996-09-23|1996-11-21|TAKE BACK RETURN|RAIL| express packages wake qui +17892|270|25|4|12|14043.24|0.07|0.08|N|O|1996-11-30|1996-10-24|1996-12-18|NONE|AIR|fully above t +17892|1748|49|5|32|52791.68|0.05|0.07|N|O|1996-11-19|1996-10-05|1996-12-12|DELIVER IN PERSON|RAIL|o beans. quietly +17893|1615|16|1|24|36398.64|0.09|0.03|A|F|1992-06-04|1992-04-25|1992-06-14|NONE|FOB|the slyly pending dugouts. pending +17893|112|13|2|5|5060.55|0.08|0.02|R|F|1992-06-04|1992-06-17|1992-06-26|TAKE BACK RETURN|TRUCK|kly ironic warthogs. quickly pending accou +17893|1271|9|3|9|10550.43|0.03|0.06|A|F|1992-03-29|1992-06-02|1992-04-04|DELIVER IN PERSON|TRUCK|leep blithely unusual acco +17894|1939|84|1|47|86523.71|0.04|0.02|A|F|1993-02-20|1993-01-26|1993-03-17|TAKE BACK RETURN|REG AIR|ests. care +17895|1308|47|1|25|30232.50|0.04|0.02|N|O|1996-11-21|1996-11-07|1996-11-25|DELIVER IN PERSON|AIR|e even dolphins. regular +17895|1600|21|2|37|55559.20|0.08|0.03|N|O|1996-09-09|1996-09-21|1996-09-26|NONE|AIR|n dolphins haggle across the fluf +17895|1929|74|3|30|54927.60|0.04|0.02|N|O|1996-09-08|1996-10-18|1996-09-09|TAKE BACK RETURN|FOB|nic asymptotes integrate +17895|1222|34|4|13|14601.86|0.01|0.01|N|O|1996-10-15|1996-11-09|1996-10-17|NONE|SHIP|egular asymptotes use blithely about the +17895|765|30|5|22|36646.72|0.03|0.03|N|O|1996-09-09|1996-10-30|1996-10-05|NONE|MAIL|the foxes. special ideas sublate. +17895|67|18|6|12|11604.72|0.00|0.07|N|O|1996-08-14|1996-10-30|1996-08-30|NONE|REG AIR|le furiously against the fluff +17920|1199|100|1|48|52809.12|0.07|0.08|N|O|1998-03-04|1998-03-09|1998-03-12|NONE|TRUCK|the slyly even id +17920|1309|48|2|2|2420.60|0.09|0.02|N|O|1998-05-12|1998-03-27|1998-06-05|NONE|MAIL|counts? furiously special foxes b +17920|1623|6|3|12|18295.44|0.00|0.05|N|O|1998-02-28|1998-03-21|1998-03-06|TAKE BACK RETURN|SHIP| express dependencies. furiously +17920|523|14|4|48|68328.96|0.09|0.06|N|O|1998-03-24|1998-04-12|1998-04-14|COLLECT COD|TRUCK|e furiously. furio +17920|722|55|5|37|60040.64|0.04|0.01|N|O|1998-02-04|1998-04-10|1998-02-13|COLLECT COD|RAIL|fter the carefully even a +17920|420|8|6|13|17165.46|0.05|0.02|N|O|1998-03-26|1998-03-24|1998-04-11|COLLECT COD|TRUCK|sly expres +17920|849|50|7|39|68243.76|0.09|0.02|N|O|1998-03-17|1998-04-23|1998-03-22|COLLECT COD|AIR|eodolites +17921|1062|63|1|36|34670.16|0.10|0.01|N|O|1998-09-09|1998-10-14|1998-09-19|NONE|REG AIR| boost blithely pac +17921|828|28|2|24|41491.68|0.09|0.01|N|O|1998-10-27|1998-10-14|1998-11-07|DELIVER IN PERSON|RAIL|ke furiously blithe requests. furio +17921|1793|20|3|3|5084.37|0.03|0.07|N|O|1998-08-24|1998-10-20|1998-08-28|TAKE BACK RETURN|AIR|s above the blithely final platelet +17921|527|58|4|28|39970.56|0.02|0.03|N|O|1998-09-13|1998-09-05|1998-10-10|NONE|SHIP|nt foxes. ir +17921|656|19|5|21|32689.65|0.07|0.00|N|O|1998-09-21|1998-10-08|1998-10-19|TAKE BACK RETURN|TRUCK|y. fluffily regular accounts wake +17921|1699|23|6|19|30413.11|0.04|0.06|N|O|1998-08-28|1998-08-30|1998-08-29|NONE|TRUCK|ts cajole. quickly +17922|1324|39|1|25|30633.00|0.02|0.01|R|F|1994-12-01|1994-12-18|1994-12-26|TAKE BACK RETURN|TRUCK|eodolites haggle carefully blithely pend +17923|32|58|1|33|30756.99|0.03|0.02|N|O|1998-10-15|1998-09-05|1998-11-09|DELIVER IN PERSON|RAIL| haggle slyl +17923|1751|78|2|44|72721.00|0.05|0.01|N|O|1998-10-12|1998-08-19|1998-10-31|NONE|RAIL|ons haggle blithely alongside of the ironic +17923|1459|60|3|33|44894.85|0.06|0.02|N|O|1998-07-10|1998-08-19|1998-07-18|TAKE BACK RETURN|AIR|haggle carefully ironic foxes. quickly +17923|930|65|4|4|7323.72|0.07|0.03|N|O|1998-07-07|1998-09-09|1998-07-13|DELIVER IN PERSON|MAIL|ld deposits are slyly furiously speci +17924|1965|66|1|48|89614.08|0.08|0.02|N|O|1995-11-13|1995-11-23|1995-12-07|COLLECT COD|TRUCK|urts mold among the sl +17924|1995|84|2|14|26557.86|0.00|0.00|N|O|1995-09-28|1995-10-01|1995-10-18|NONE|MAIL|are. quickly express requests +17924|858|59|3|33|58042.05|0.07|0.03|N|O|1995-11-11|1995-11-22|1995-12-07|COLLECT COD|REG AIR|ses sleep carefully. qu +17924|1842|29|4|31|54059.04|0.07|0.02|N|O|1995-10-02|1995-09-26|1995-10-31|COLLECT COD|MAIL|ar accounts wa +17924|254|82|5|8|9234.00|0.00|0.07|N|O|1995-09-07|1995-10-28|1995-09-13|COLLECT COD|AIR| slyly even packages; furiously final +17925|1194|95|1|14|15332.66|0.02|0.07|A|F|1992-12-03|1992-12-20|1992-12-31|DELIVER IN PERSON|AIR|ke despite the blithely even ac +17926|1757|58|1|35|58056.25|0.00|0.04|N|O|1995-11-24|1996-01-22|1995-12-09|TAKE BACK RETURN|RAIL|ounts. carefully unu +17926|335|92|2|26|32118.58|0.10|0.08|N|O|1996-03-09|1996-02-07|1996-03-17|NONE|SHIP|ever pending packages must have to +17926|1383|84|3|45|57797.10|0.05|0.07|N|O|1995-11-30|1996-01-05|1995-12-24|TAKE BACK RETURN|AIR|pending instructions. special frets unwind +17927|907|76|1|35|63276.50|0.06|0.01|A|F|1994-11-02|1994-10-28|1994-11-12|COLLECT COD|FOB|accounts. fluffily special foxes among +17927|1300|38|2|9|10811.70|0.01|0.01|A|F|1994-12-07|1994-10-21|1994-12-08|NONE|MAIL|? slyly special deposits nag. furiously fi +17927|1055|61|3|10|9560.50|0.09|0.07|R|F|1994-10-14|1994-09-26|1994-10-18|NONE|REG AIR|s. quietly regular accounts +17927|161|14|4|1|1061.16|0.04|0.05|R|F|1994-11-07|1994-10-02|1994-11-10|TAKE BACK RETURN|AIR| the special, regular deposit +17952|593|94|1|41|61237.19|0.06|0.06|R|F|1993-11-23|1993-11-19|1993-12-13|NONE|MAIL|he quickly even depos +17952|266|48|2|24|27990.24|0.03|0.00|A|F|1994-01-20|1993-11-28|1994-01-23|COLLECT COD|MAIL|ithely about the p +17953|1988|33|1|47|88829.06|0.01|0.04|R|F|1992-11-30|1992-09-23|1992-12-09|TAKE BACK RETURN|RAIL|ges. even, regular dolphins according to th +17953|1496|75|2|1|1397.49|0.07|0.06|A|F|1992-11-25|1992-10-29|1992-12-10|NONE|RAIL|cross the quickly sp +17953|1210|22|3|35|38892.35|0.01|0.08|A|F|1992-10-29|1992-10-11|1992-11-12|NONE|SHIP|eep quickly slyly blithe pack +17953|1304|19|4|1|1205.30|0.10|0.04|R|F|1992-09-24|1992-11-13|1992-10-07|DELIVER IN PERSON|AIR|bold instructions are. express, bold inst +17953|1884|71|5|9|16072.92|0.05|0.01|A|F|1992-11-14|1992-10-28|1992-12-01|NONE|REG AIR|rding to the pending, regular pac +17953|1366|43|6|28|35486.08|0.08|0.08|A|F|1992-11-16|1992-10-05|1992-11-20|NONE|FOB|ss platelets wake ironic, iron +17953|1871|1|7|5|8864.35|0.08|0.08|R|F|1992-09-04|1992-09-26|1992-09-20|DELIVER IN PERSON|SHIP|rnes use final, sil +17954|649|81|1|36|55787.04|0.07|0.07|R|F|1993-01-05|1993-01-11|1993-02-02|TAKE BACK RETURN|AIR|ep slyly carefully regular deposits; qu +17954|1557|38|2|13|18961.15|0.00|0.06|R|F|1992-11-19|1993-02-06|1992-12-19|DELIVER IN PERSON|TRUCK|quests boost. final deposi +17955|1065|71|1|39|37676.34|0.00|0.05|N|O|1998-11-07|1998-09-13|1998-12-05|DELIVER IN PERSON|FOB|ests nag furiously quickly silent pa +17955|1416|17|2|21|27665.61|0.09|0.08|N|O|1998-10-19|1998-10-19|1998-10-31|TAKE BACK RETURN|RAIL|nto beans sleep +17955|1019|90|3|3|2760.03|0.05|0.08|N|O|1998-10-13|1998-09-22|1998-10-29|DELIVER IN PERSON|RAIL| above the fluffil +17955|1274|12|4|45|52887.15|0.03|0.01|N|O|1998-07-31|1998-08-26|1998-08-26|COLLECT COD|MAIL|thely bold instructions. accounts are +17955|1472|51|5|19|26095.93|0.07|0.03|N|O|1998-10-09|1998-08-28|1998-10-16|NONE|TRUCK|ironic warthogs across the +17955|226|81|6|3|3378.66|0.08|0.01|N|O|1998-10-17|1998-09-29|1998-10-26|DELIVER IN PERSON|SHIP|refully bold +17956|1748|33|1|33|54441.42|0.00|0.03|A|F|1993-12-05|1993-09-18|1993-12-07|DELIVER IN PERSON|MAIL|haggle slyly pending, silent ac +17956|1831|18|2|32|55450.56|0.03|0.02|A|F|1993-09-17|1993-09-07|1993-09-21|NONE|MAIL|. blithely pending dependencies +17956|567|28|3|20|29351.20|0.05|0.05|A|F|1993-10-14|1993-10-08|1993-10-31|COLLECT COD|AIR|haggle. blithely f +17957|379|64|1|38|48616.06|0.00|0.07|R|F|1994-01-10|1994-02-02|1994-02-02|DELIVER IN PERSON|MAIL|es wake. quickly spe +17958|1184|85|1|5|5425.90|0.00|0.05|N|O|1995-10-20|1995-10-20|1995-10-25|DELIVER IN PERSON|TRUCK|thely alongside of the furiously special +17958|1637|20|2|39|60006.57|0.04|0.00|N|O|1995-10-02|1995-10-22|1995-10-04|DELIVER IN PERSON|MAIL| cajole slyly. final accounts eat slyly. s +17958|764|97|3|40|66590.40|0.02|0.00|N|O|1995-09-26|1995-10-10|1995-10-11|COLLECT COD|SHIP|ending deposits wake even requests. even fo +17958|980|49|4|36|67715.28|0.07|0.03|N|O|1995-08-14|1995-10-30|1995-09-05|COLLECT COD|SHIP|s decoys. fluffily pending package +17958|1595|36|5|13|19455.67|0.10|0.01|N|O|1995-09-08|1995-10-30|1995-09-20|DELIVER IN PERSON|MAIL|uests wake slyly pending reque +17959|1358|73|1|26|32743.10|0.02|0.04|R|F|1992-12-15|1992-10-25|1992-12-17|TAKE BACK RETURN|TRUCK|ffily quickly even a +17959|69|95|2|5|4845.30|0.03|0.06|R|F|1992-11-14|1992-11-09|1992-11-29|TAKE BACK RETURN|AIR|. carefully regular acco +17959|1298|36|3|30|35978.70|0.00|0.00|A|F|1992-12-09|1992-11-04|1992-12-28|TAKE BACK RETURN|RAIL|ronic deposits cajole +17959|1108|17|4|3|3027.30|0.10|0.07|R|F|1992-12-25|1992-10-18|1993-01-13|DELIVER IN PERSON|SHIP|ns according to the blithely final ideas bo +17984|203|4|1|16|17651.20|0.07|0.02|N|O|1997-09-14|1997-07-04|1997-10-01|TAKE BACK RETURN|AIR|ding to the quickly special the +17984|323|8|2|43|52602.76|0.04|0.04|N|O|1997-08-12|1997-08-10|1997-09-01|DELIVER IN PERSON|REG AIR|. blithely pending braid +17984|1858|59|3|31|54555.35|0.10|0.01|N|O|1997-09-10|1997-07-30|1997-10-04|TAKE BACK RETURN|FOB|o beans according to +17984|1130|67|4|4|4124.52|0.03|0.02|N|O|1997-09-05|1997-06-26|1997-09-24|NONE|FOB|deas among the thinly pending packages +17984|39|65|5|30|28170.90|0.05|0.05|N|O|1997-07-05|1997-07-29|1997-07-29|DELIVER IN PERSON|RAIL|s. foxes haggle fluffily. +17984|1348|87|6|21|26236.14|0.01|0.01|N|O|1997-09-16|1997-07-25|1997-10-03|NONE|TRUCK| carefully +17984|1861|48|7|31|54648.66|0.04|0.07|N|O|1997-07-20|1997-08-03|1997-07-26|COLLECT COD|MAIL| braids. slyly pending packages boost fu +17985|131|32|1|40|41245.20|0.05|0.08|A|F|1995-04-19|1995-06-13|1995-05-05|COLLECT COD|REG AIR|mptotes. quiet +17985|172|73|2|27|28948.59|0.10|0.06|A|F|1995-05-01|1995-07-02|1995-05-17|NONE|TRUCK|yly bold foxes need to wake slyly +17985|1778|21|3|44|73909.88|0.01|0.02|N|O|1995-08-11|1995-05-24|1995-09-03|NONE|SHIP|s use iron +17985|987|90|4|3|5663.94|0.00|0.06|N|F|1995-06-07|1995-06-21|1995-06-28|TAKE BACK RETURN|REG AIR|etect. regular packages sleep regul +17986|1411|29|1|50|65620.50|0.05|0.08|A|F|1992-05-04|1992-05-09|1992-05-26|COLLECT COD|SHIP|ckages. slyly bold foxes sleep bl +17986|703|4|2|13|20848.10|0.10|0.08|A|F|1992-06-21|1992-06-09|1992-07-11|TAKE BACK RETURN|SHIP|sits hang blithely even +17986|362|47|3|32|40395.52|0.09|0.00|A|F|1992-04-10|1992-05-09|1992-04-25|NONE|SHIP|ding instructions a +17986|864|98|4|25|44121.50|0.09|0.02|R|F|1992-07-11|1992-05-29|1992-07-13|TAKE BACK RETURN|SHIP|ackages. pint +17986|15|66|5|1|915.01|0.09|0.06|A|F|1992-04-26|1992-05-29|1992-05-02|NONE|RAIL|en accounts: carefu +17987|317|18|1|3|3651.93|0.03|0.01|A|F|1994-11-27|1994-09-18|1994-12-14|NONE|TRUCK|ions according to the fluffily regular th +17987|418|19|2|35|46144.35|0.06|0.00|A|F|1994-08-09|1994-10-28|1994-08-11|DELIVER IN PERSON|TRUCK|lites. bold packages wake careful +17987|1778|79|3|4|6719.08|0.04|0.06|R|F|1994-11-15|1994-10-07|1994-12-15|NONE|REG AIR|ns are doggedly. carefully regular +17988|24|50|1|36|33264.72|0.04|0.00|A|F|1994-01-20|1993-11-23|1994-02-12|NONE|REG AIR|egular, iro +17988|1408|9|2|1|1309.40|0.08|0.05|A|F|1994-01-01|1993-11-22|1994-01-08|NONE|TRUCK|e furiously. regular deposits +17988|1762|47|3|29|48249.04|0.01|0.01|A|F|1993-11-26|1993-12-12|1993-11-27|TAKE BACK RETURN|FOB|deposits haggle blithely carefully d +17988|969|4|4|41|76668.36|0.05|0.01|A|F|1993-10-23|1993-12-14|1993-10-28|NONE|RAIL|the idle requ +17988|606|38|5|41|61770.60|0.04|0.02|R|F|1993-12-01|1993-11-13|1993-12-16|COLLECT COD|REG AIR|structions. blithely unusual sauternes boos +17988|1318|19|6|15|18289.65|0.07|0.07|R|F|1993-11-12|1993-10-28|1993-11-22|TAKE BACK RETURN|TRUCK|ckly ironic instructions haggle fluf +17988|1708|9|7|36|57949.20|0.07|0.02|R|F|1993-11-08|1993-11-12|1993-11-30|NONE|SHIP|ts cajole across the deposits. +17989|1586|67|1|50|74379.00|0.09|0.07|A|F|1994-02-16|1994-03-28|1994-02-25|COLLECT COD|RAIL|accounts. requests mold about the +17989|1757|42|2|34|56397.50|0.10|0.08|R|F|1994-02-11|1994-04-17|1994-02-23|TAKE BACK RETURN|SHIP|ages sleep. quickly +17989|375|32|3|5|6376.85|0.04|0.05|A|F|1994-03-01|1994-03-17|1994-03-18|TAKE BACK RETURN|TRUCK|carefully unusu +17990|1393|32|1|33|42714.87|0.02|0.00|N|O|1998-05-12|1998-05-30|1998-05-15|TAKE BACK RETURN|REG AIR|ly quickly express depo +17990|812|13|2|15|25692.15|0.01|0.06|N|O|1998-05-23|1998-06-08|1998-06-03|DELIVER IN PERSON|SHIP|ss courts. express fray +17990|1183|84|3|8|8673.44|0.02|0.07|N|O|1998-04-21|1998-06-11|1998-05-19|TAKE BACK RETURN|AIR|kly careful +17990|966|1|4|17|31738.32|0.03|0.00|N|O|1998-03-30|1998-04-30|1998-04-14|NONE|AIR|carefully final packages. quickly ironic e +17990|1741|26|5|5|8213.70|0.04|0.03|N|O|1998-04-18|1998-04-29|1998-04-27|COLLECT COD|MAIL| are furiously into th +17990|250|78|6|40|46010.00|0.00|0.07|N|O|1998-07-13|1998-05-20|1998-07-21|NONE|FOB|usly unusual accounts. quic +17990|404|92|7|38|49567.20|0.02|0.07|N|O|1998-04-08|1998-06-14|1998-04-23|DELIVER IN PERSON|MAIL|nments use. pending pinto beans haggle. f +17991|1682|24|1|2|3167.36|0.04|0.03|N|O|1998-08-27|1998-08-14|1998-08-28|NONE|TRUCK|le. regula +17991|808|9|2|10|17088.00|0.00|0.03|N|O|1998-10-06|1998-08-08|1998-10-28|DELIVER IN PERSON|REG AIR|n, pending +18016|1443|22|1|48|64533.12|0.03|0.06|N|O|1996-05-01|1996-05-18|1996-05-13|NONE|TRUCK|ncies. care +18016|314|71|2|43|52215.33|0.01|0.04|N|O|1996-03-25|1996-05-28|1996-04-12|DELIVER IN PERSON|MAIL| requests wake after the bli +18016|457|87|3|14|19004.30|0.01|0.07|N|O|1996-04-08|1996-06-12|1996-05-05|TAKE BACK RETURN|FOB|r accounts. slyl +18016|1978|79|4|18|33839.46|0.02|0.02|N|O|1996-05-28|1996-06-11|1996-06-24|NONE|AIR|ously ironic requ +18017|717|14|1|23|37207.33|0.09|0.07|R|F|1993-07-07|1993-05-15|1993-07-13|TAKE BACK RETURN|MAIL|furiously regular req +18017|478|8|2|23|31704.81|0.02|0.02|A|F|1993-05-09|1993-05-26|1993-06-08|NONE|FOB|blithely bo +18017|1456|96|3|46|62442.70|0.03|0.03|A|F|1993-07-16|1993-06-22|1993-07-30|DELIVER IN PERSON|REG AIR|y unusual pinto beans shall haggle. br +18017|1330|45|4|31|38171.23|0.08|0.02|R|F|1993-04-26|1993-05-29|1993-05-05|COLLECT COD|AIR|y ideas use furiously permanently final +18017|3|4|5|41|37023.00|0.04|0.04|R|F|1993-04-01|1993-05-16|1993-04-07|NONE|MAIL|use slyly above t +18018|1229|4|1|41|46339.02|0.04|0.08|N|O|1998-03-22|1998-01-08|1998-03-30|TAKE BACK RETURN|REG AIR|ular, regular requests sleep. quickl +18019|634|28|1|4|6138.52|0.04|0.02|N|O|1997-07-04|1997-07-13|1997-08-01|DELIVER IN PERSON|REG AIR|ly pending waters. carefully silent instruc +18019|1546|87|2|49|70929.46|0.01|0.07|N|O|1997-05-30|1997-06-03|1997-06-03|DELIVER IN PERSON|SHIP|ously unusual accounts wake +18019|506|37|3|49|68918.50|0.07|0.00|N|O|1997-05-27|1997-06-15|1997-06-05|DELIVER IN PERSON|AIR|r accounts. +18019|6|32|4|41|37146.00|0.02|0.01|N|O|1997-07-22|1997-06-04|1997-08-04|COLLECT COD|RAIL|ully thin, final ac +18020|872|6|1|13|23047.31|0.10|0.08|N|O|1996-02-21|1996-02-21|1996-03-17|DELIVER IN PERSON|MAIL|ly. theodolites above the pend +18020|1246|84|2|10|11472.40|0.07|0.00|N|O|1996-02-08|1996-03-12|1996-03-09|COLLECT COD|RAIL|ly express accounts cajole qu +18020|1393|8|3|37|47892.43|0.06|0.03|N|O|1996-03-23|1996-02-04|1996-03-25|DELIVER IN PERSON|REG AIR|l instructio +18020|1479|80|4|47|64882.09|0.03|0.02|N|O|1996-02-17|1996-03-28|1996-03-14|COLLECT COD|FOB| theodolites are blithely. +18020|396|97|5|2|2592.78|0.07|0.02|N|O|1995-12-30|1996-01-29|1996-01-21|TAKE BACK RETURN|MAIL|yly regular, final in +18020|1202|3|6|45|49644.00|0.10|0.04|N|O|1996-02-23|1996-03-16|1996-03-19|COLLECT COD|MAIL| blithely regular pack +18021|1676|77|1|43|67839.81|0.07|0.04|R|F|1994-04-27|1994-05-24|1994-05-10|DELIVER IN PERSON|TRUCK|uriously ideas. regula +18021|279|7|2|32|37736.64|0.08|0.06|A|F|1994-05-18|1994-05-29|1994-05-26|TAKE BACK RETURN|TRUCK|old theodolites integrate against th +18022|823|90|1|22|37924.04|0.07|0.04|N|O|1996-07-18|1996-07-10|1996-07-31|TAKE BACK RETURN|REG AIR|s above the instructio +18023|1759|44|1|2|3321.50|0.01|0.01|R|F|1995-03-15|1995-04-16|1995-03-21|NONE|FOB|ular asymptote +18023|1287|88|2|42|49907.76|0.09|0.08|A|F|1995-03-15|1995-04-09|1995-03-16|NONE|RAIL|s detect. ironically even requ +18023|1129|38|3|4|4120.48|0.04|0.08|R|F|1995-03-20|1995-04-22|1995-03-22|COLLECT COD|FOB|gular requests. sp +18023|1167|4|4|4|4272.64|0.10|0.07|A|F|1995-04-22|1995-05-05|1995-05-06|COLLECT COD|RAIL|s. final, bold t +18048|1283|95|1|1|1184.28|0.00|0.08|A|F|1994-08-14|1994-09-29|1994-09-05|DELIVER IN PERSON|RAIL|ar pinto beans haggle. fluffily ironic +18048|1938|71|2|34|62557.62|0.00|0.02|A|F|1994-08-17|1994-09-02|1994-09-04|COLLECT COD|MAIL|quickly regular ideas boost fina +18048|976|77|3|43|80709.71|0.05|0.07|A|F|1994-11-01|1994-09-21|1994-11-08|NONE|REG AIR|to beans unwind past +18048|1618|42|4|39|59264.79|0.07|0.06|A|F|1994-10-02|1994-10-03|1994-10-31|DELIVER IN PERSON|MAIL|azzle carefully even packages. fluff +18049|1556|37|1|14|20405.70|0.00|0.03|A|F|1994-09-08|1994-10-30|1994-09-22|COLLECT COD|TRUCK|n deposits boost furiou +18049|1259|97|2|20|23205.00|0.01|0.00|R|F|1994-12-08|1994-10-27|1994-12-22|NONE|SHIP|packages grow requests. ironic, fi +18049|808|42|3|34|58099.20|0.08|0.04|A|F|1994-12-07|1994-10-30|1994-12-09|DELIVER IN PERSON|REG AIR|er theodolites. quietly ironic pinto bea +18049|1094|95|4|33|32837.97|0.08|0.00|A|F|1994-09-07|1994-11-01|1994-10-04|TAKE BACK RETURN|AIR|ess, regular req +18049|206|61|5|45|49779.00|0.04|0.07|A|F|1994-11-29|1994-11-10|1994-12-22|TAKE BACK RETURN|REG AIR|closely ironic requests. a +18050|1928|73|1|20|36598.40|0.05|0.06|N|O|1996-04-17|1996-02-23|1996-05-08|COLLECT COD|REG AIR|sts mold. quickly ir +18050|1402|3|2|1|1303.40|0.10|0.04|N|O|1996-03-16|1996-04-06|1996-04-15|NONE|REG AIR|ckly even theodolites. perman +18050|223|51|3|41|46052.02|0.09|0.02|N|O|1996-01-26|1996-02-11|1996-02-25|COLLECT COD|AIR|the regular accounts wake about the blit +18050|1154|91|4|41|43261.15|0.00|0.07|N|O|1996-03-15|1996-03-01|1996-03-18|COLLECT COD|FOB|uickly even pin +18050|550|51|5|28|40615.40|0.08|0.04|N|O|1996-02-22|1996-02-21|1996-03-13|TAKE BACK RETURN|SHIP| packages after the slyly +18050|1773|58|6|47|78714.19|0.04|0.03|N|O|1996-05-06|1996-02-14|1996-05-31|TAKE BACK RETURN|SHIP|pinto beans poach blithely express, i +18051|1522|43|1|32|45552.64|0.02|0.08|N|O|1998-05-29|1998-04-13|1998-06-17|COLLECT COD|RAIL| regular accounts. bold deposits must +18051|85|11|2|9|8865.72|0.09|0.04|N|O|1998-03-17|1998-04-01|1998-04-04|NONE|AIR|y according to the furiou +18051|1580|1|3|25|37039.50|0.07|0.06|N|O|1998-03-01|1998-04-01|1998-03-02|COLLECT COD|TRUCK| sleep quickly above +18051|295|50|4|12|14343.48|0.03|0.02|N|O|1998-03-19|1998-04-13|1998-04-10|NONE|RAIL|e the carefull +18051|553|44|5|31|45060.05|0.08|0.04|N|O|1998-03-15|1998-04-12|1998-03-24|DELIVER IN PERSON|FOB|ccounts promise slyly across the fin +18052|1422|1|1|49|64847.58|0.02|0.03|N|O|1998-02-02|1998-01-20|1998-02-12|NONE|TRUCK|ithely unusual deposits. final, +18052|331|32|2|4|4925.32|0.06|0.05|N|O|1998-02-02|1998-01-31|1998-02-07|NONE|REG AIR|e against the b +18052|230|85|3|36|40688.28|0.09|0.00|N|O|1997-12-19|1997-12-20|1998-01-01|COLLECT COD|RAIL|lyly final pinto +18052|1053|59|4|30|28621.50|0.04|0.07|N|O|1997-11-25|1998-01-18|1997-12-08|NONE|MAIL|ackages haggle. slyly ironic accou +18052|1300|12|5|26|31233.80|0.07|0.01|N|O|1998-03-03|1998-02-02|1998-03-19|COLLECT COD|RAIL|according to the +18053|14|90|1|19|17366.19|0.07|0.00|N|O|1997-10-06|1997-09-26|1997-11-02|COLLECT COD|SHIP|oss the quie +18053|1669|93|2|23|36125.18|0.03|0.00|N|O|1997-09-29|1997-10-19|1997-10-12|DELIVER IN PERSON|SHIP|nic, regular accounts integr +18053|1532|13|3|48|68809.44|0.00|0.05|N|O|1997-10-11|1997-10-22|1997-10-21|TAKE BACK RETURN|REG AIR|refully daring platelets integrate slyly u +18053|871|38|4|40|70874.80|0.09|0.04|N|O|1997-10-15|1997-11-04|1997-10-21|DELIVER IN PERSON|SHIP|sly even packages around the regu +18054|845|12|1|28|48883.52|0.06|0.00|N|O|1995-10-07|1995-10-08|1995-10-12|TAKE BACK RETURN|RAIL|usly express deposits. carefully regular +18055|1179|16|1|7|7561.19|0.06|0.01|R|F|1993-05-09|1993-04-22|1993-05-25|COLLECT COD|TRUCK|sits cajole carefully special foxes. e +18055|1342|43|2|22|27353.48|0.01|0.06|R|F|1993-05-17|1993-04-17|1993-05-19|DELIVER IN PERSON|FOB|. even epitaphs along the silent reque +18055|430|31|3|11|14634.73|0.08|0.02|A|F|1993-05-25|1993-04-08|1993-06-10|DELIVER IN PERSON|TRUCK|eposits wake fluff +18055|828|28|4|47|81254.54|0.03|0.08|A|F|1993-02-11|1993-04-26|1993-02-17|COLLECT COD|SHIP| boost final excuses. +18055|970|5|5|32|59871.04|0.09|0.01|A|F|1993-05-07|1993-04-09|1993-06-04|COLLECT COD|FOB|cies across the carefully final platelet +18055|311|40|6|33|39973.23|0.07|0.05|A|F|1993-05-16|1993-04-21|1993-06-09|COLLECT COD|TRUCK|ests cajole quickly bold deposits. +18080|314|43|1|49|59501.19|0.08|0.02|A|F|1994-10-20|1994-07-23|1994-11-17|DELIVER IN PERSON|FOB|s, final pack +18080|896|97|2|6|10781.34|0.04|0.08|A|F|1994-09-02|1994-08-29|1994-09-20|TAKE BACK RETURN|FOB|arefully regular ide +18080|294|76|3|41|48965.89|0.00|0.03|R|F|1994-07-28|1994-09-12|1994-08-18|DELIVER IN PERSON|AIR|e carefully. +18080|1548|69|4|10|14495.40|0.02|0.06|A|F|1994-10-12|1994-08-04|1994-11-09|COLLECT COD|MAIL|lly bold orbits solve carefully express pa +18080|1563|84|5|30|43936.80|0.04|0.07|R|F|1994-09-21|1994-09-17|1994-10-18|TAKE BACK RETURN|FOB| regular i +18081|1830|31|1|10|17318.30|0.05|0.02|N|O|1996-11-02|1996-11-22|1996-11-19|COLLECT COD|MAIL|ets cajole regu +18081|807|41|2|5|8539.00|0.00|0.08|N|O|1997-01-11|1996-12-27|1997-02-05|TAKE BACK RETURN|TRUCK|kages with the furiou +18081|566|97|3|27|39597.12|0.10|0.06|N|O|1997-01-03|1996-11-30|1997-01-27|DELIVER IN PERSON|AIR|leep about the s +18082|223|51|1|22|24710.84|0.09|0.02|N|O|1998-08-04|1998-09-24|1998-08-18|TAKE BACK RETURN|REG AIR|egular depths mai +18083|1774|1|1|50|83788.50|0.06|0.05|R|F|1994-05-22|1994-05-06|1994-06-06|DELIVER IN PERSON|RAIL|al theodolites. accounts according to the +18083|338|23|2|2|2476.66|0.08|0.00|R|F|1994-04-19|1994-04-24|1994-05-08|TAKE BACK RETURN|TRUCK| unusual warthogs haggle qu +18084|876|10|1|12|21322.44|0.00|0.03|N|O|1996-10-28|1996-10-26|1996-11-11|TAKE BACK RETURN|AIR|ter the quickly b +18084|177|4|2|25|26929.25|0.08|0.00|N|O|1996-11-18|1996-10-27|1996-12-13|TAKE BACK RETURN|RAIL|y unusual requests +18084|1175|84|3|14|15066.38|0.04|0.03|N|O|1996-10-12|1996-10-31|1996-11-03|NONE|FOB|p above the regular deposits. carefull +18084|1956|89|4|46|85465.70|0.10|0.03|N|O|1996-10-30|1996-09-21|1996-11-16|DELIVER IN PERSON|MAIL|t the furiously close ideas cajole d +18084|889|23|5|45|80544.60|0.00|0.06|N|O|1996-09-15|1996-10-27|1996-10-15|COLLECT COD|MAIL|ged foxes nod ab +18084|1184|85|6|7|7596.26|0.08|0.00|N|O|1996-10-24|1996-10-17|1996-11-09|NONE|REG AIR|ending, express theodolites accordin +18085|1720|47|1|42|68112.24|0.00|0.04|N|O|1995-10-10|1995-10-31|1995-10-24|DELIVER IN PERSON|TRUCK| ideas boost quic +18085|133|34|2|44|45457.72|0.10|0.01|N|O|1995-11-19|1995-11-19|1995-12-08|COLLECT COD|TRUCK| dolphins above the deposits sleep carefull +18085|604|67|3|9|13541.40|0.06|0.05|N|O|1995-11-24|1995-12-23|1995-12-12|TAKE BACK RETURN|REG AIR| furiously pending requests. accounts b +18085|163|64|4|1|1063.16|0.01|0.01|N|O|1995-10-31|1995-12-19|1995-11-29|TAKE BACK RETURN|AIR|cial pinto be +18086|1494|34|1|25|34887.25|0.07|0.01|N|O|1998-05-26|1998-06-27|1998-06-05|TAKE BACK RETURN|MAIL|mptotes sleep. silent foxe +18086|795|28|2|26|44090.54|0.04|0.06|N|O|1998-09-12|1998-07-22|1998-09-16|TAKE BACK RETURN|REG AIR|deposits after the depos +18086|366|95|3|23|29126.28|0.03|0.00|N|O|1998-07-21|1998-06-27|1998-08-18|TAKE BACK RETURN|FOB|warhorses. even, regular re +18086|930|31|4|5|9154.65|0.09|0.02|N|O|1998-06-02|1998-08-03|1998-06-15|TAKE BACK RETURN|SHIP|rate blithely fu +18086|314|43|5|1|1214.31|0.04|0.06|N|O|1998-07-01|1998-06-27|1998-07-20|TAKE BACK RETURN|AIR|nto beans. blithely ironic requ +18086|353|38|6|34|42613.90|0.09|0.04|N|O|1998-09-19|1998-08-05|1998-09-23|TAKE BACK RETURN|RAIL|gouts are slyly. blithely final reques +18086|842|42|7|45|78427.80|0.03|0.00|N|O|1998-08-13|1998-08-04|1998-08-17|TAKE BACK RETURN|TRUCK|xpress asymptotes. i +18087|12|38|1|8|7296.08|0.00|0.05|A|F|1993-04-27|1993-05-22|1993-05-04|COLLECT COD|RAIL|uriously silent deposits boost +18087|37|13|2|49|45914.47|0.05|0.02|A|F|1993-04-24|1993-05-09|1993-05-04|NONE|MAIL|osits. blithely ironic requests can wake s +18087|1722|65|3|36|58453.92|0.10|0.07|A|F|1993-06-18|1993-05-28|1993-07-07|NONE|MAIL|quickly regula +18087|429|88|4|50|66471.00|0.06|0.03|A|F|1993-07-13|1993-06-11|1993-07-30|COLLECT COD|REG AIR|regular deposits haggle +18087|1468|86|5|32|43822.72|0.07|0.01|R|F|1993-04-03|1993-06-20|1993-04-21|TAKE BACK RETURN|RAIL|mong the special foxes cajol +18112|416|17|1|34|44757.94|0.03|0.07|A|F|1992-06-25|1992-04-30|1992-07-09|COLLECT COD|MAIL| ironic pinto beans. care +18112|543|4|2|45|64959.30|0.08|0.06|R|F|1992-05-20|1992-05-12|1992-05-22|DELIVER IN PERSON|TRUCK| after the slyly bold deposits. bold, +18112|1551|52|3|20|29051.00|0.06|0.08|R|F|1992-04-28|1992-05-28|1992-05-28|DELIVER IN PERSON|RAIL|into beans are. quickly even a +18112|123|2|4|31|31716.72|0.04|0.05|R|F|1992-05-12|1992-05-09|1992-06-07|NONE|TRUCK|uests affi +18113|1273|11|1|23|27008.21|0.09|0.08|R|F|1992-09-15|1992-11-05|1992-09-19|DELIVER IN PERSON|TRUCK|dolphins. realms wake qu +18113|840|7|2|28|48743.52|0.02|0.06|R|F|1992-09-24|1992-10-21|1992-10-07|COLLECT COD|MAIL|lyly bold deposits nag against the bo +18113|1779|64|3|13|21850.01|0.05|0.04|R|F|1992-10-11|1992-11-18|1992-11-08|TAKE BACK RETURN|FOB|longside of the +18113|1761|46|4|28|46557.28|0.03|0.00|A|F|1992-11-17|1992-10-15|1992-12-07|TAKE BACK RETURN|AIR|s haggle quickly at the bold requests. ev +18113|1293|68|5|37|44188.73|0.09|0.07|R|F|1992-09-23|1992-11-05|1992-10-20|DELIVER IN PERSON|MAIL| theodolites sle +18114|1642|66|1|49|75638.36|0.04|0.06|N|O|1996-11-29|1997-01-14|1996-12-28|NONE|FOB|cajole carefully sp +18114|1169|42|2|1|1070.16|0.00|0.03|N|O|1996-12-27|1997-02-03|1997-01-21|DELIVER IN PERSON|TRUCK| the slyly special packages. +18114|941|76|3|17|31312.98|0.10|0.05|N|O|1997-02-17|1997-02-10|1997-02-19|DELIVER IN PERSON|AIR|uests about t +18115|1640|82|1|19|29291.16|0.00|0.03|R|F|1993-09-30|1993-09-01|1993-10-08|COLLECT COD|AIR|es affix carefully a +18115|627|28|2|17|25969.54|0.10|0.04|R|F|1993-07-24|1993-08-09|1993-08-08|NONE|AIR| instructions wak +18116|514|15|1|25|35362.75|0.02|0.04|N|F|1995-06-14|1995-06-08|1995-07-13|TAKE BACK RETURN|SHIP|final foxes serve furiousl +18116|819|20|2|45|77391.45|0.07|0.06|A|F|1995-05-18|1995-06-13|1995-05-23|TAKE BACK RETURN|AIR|integrate carefully. regular packages could +18116|1214|26|3|7|7806.47|0.10|0.05|N|F|1995-05-31|1995-06-14|1995-06-22|TAKE BACK RETURN|RAIL|totes cajole +18116|289|71|4|32|38056.96|0.07|0.08|N|O|1995-07-13|1995-07-06|1995-07-20|NONE|AIR| after the express +18116|1125|26|5|18|18470.16|0.10|0.00|N|F|1995-05-30|1995-06-24|1995-06-21|TAKE BACK RETURN|REG AIR|ons are quickly according to +18117|1022|58|1|45|41535.90|0.00|0.02|R|F|1994-03-21|1994-04-20|1994-03-25|DELIVER IN PERSON|TRUCK|ect according to the pinto bea +18117|1228|29|2|8|9033.76|0.05|0.05|A|F|1994-05-09|1994-03-10|1994-05-29|NONE|AIR|lites wake slyly. q +18117|945|14|3|43|79375.42|0.03|0.04|A|F|1994-05-05|1994-03-10|1994-05-10|DELIVER IN PERSON|AIR|regular forges according to the pe +18118|1064|70|1|33|31846.98|0.06|0.00|N|O|1997-07-02|1997-05-07|1997-07-04|COLLECT COD|TRUCK|s are fluffi +18118|605|99|2|17|25595.20|0.00|0.00|N|O|1997-07-02|1997-04-21|1997-07-05|DELIVER IN PERSON|MAIL| packages cajole furiousl +18118|1105|42|3|2|2012.20|0.08|0.02|N|O|1997-04-10|1997-05-04|1997-04-15|TAKE BACK RETURN|SHIP|thely. quickly even deposits across t +18118|999|2|4|17|32299.83|0.06|0.01|N|O|1997-03-26|1997-04-30|1997-04-21|DELIVER IN PERSON|REG AIR| carefully bold deposits haggle slyl +18118|730|31|5|50|81536.50|0.08|0.00|N|O|1997-06-16|1997-04-05|1997-07-13|TAKE BACK RETURN|MAIL|counts. notornis wake blithel +18118|673|5|6|23|36194.41|0.00|0.04|N|O|1997-05-24|1997-04-09|1997-05-30|COLLECT COD|RAIL|blithely unusual ideas boost ca +18119|667|99|1|36|56435.76|0.10|0.07|R|F|1994-09-16|1994-09-21|1994-10-03|TAKE BACK RETURN|FOB| sleep quickly +18119|442|72|2|34|45642.96|0.02|0.07|A|F|1994-08-26|1994-08-20|1994-08-29|COLLECT COD|TRUCK|p carefully quickly final depen +18119|1724|51|3|6|9754.32|0.04|0.02|R|F|1994-08-03|1994-09-09|1994-08-28|COLLECT COD|REG AIR|ests cajole blithely amo +18119|1275|50|4|27|31759.29|0.05|0.04|R|F|1994-09-03|1994-07-30|1994-09-18|TAKE BACK RETURN|TRUCK|ly about the ironically +18144|484|14|1|26|35996.48|0.03|0.08|N|O|1995-07-09|1995-08-07|1995-07-19|NONE|REG AIR|ructions. ironic, unusual foxes wake +18144|1690|91|2|36|57300.84|0.04|0.06|N|O|1995-08-06|1995-07-27|1995-08-20|NONE|FOB|fully regular deposits. courts are +18144|1672|55|3|5|7868.35|0.01|0.05|N|O|1995-09-11|1995-07-21|1995-09-18|COLLECT COD|TRUCK| bold deposits. +18144|127|28|4|35|35949.20|0.07|0.06|N|O|1995-06-27|1995-08-26|1995-07-14|COLLECT COD|AIR|nd. blithely ironic reque +18144|475|34|5|20|27509.40|0.04|0.08|N|O|1995-10-06|1995-07-25|1995-10-26|TAKE BACK RETURN|SHIP|ely special idea +18145|1604|28|1|15|22584.00|0.00|0.04|R|F|1993-12-11|1993-11-15|1993-12-16|NONE|RAIL|sly final ideas under the s +18145|414|2|2|37|48633.17|0.02|0.07|R|F|1993-09-12|1993-11-06|1993-09-14|TAKE BACK RETURN|MAIL|jole blithely at the ironic i +18145|609|72|3|48|72460.80|0.04|0.06|R|F|1993-10-09|1993-11-18|1993-10-26|COLLECT COD|TRUCK|deposits use ruthlessly +18145|1388|27|4|12|15472.56|0.04|0.06|R|F|1993-11-13|1993-11-29|1993-11-20|COLLECT COD|TRUCK| cajole across the accounts. special accoun +18146|1267|5|1|4|4673.04|0.09|0.02|N|O|1997-12-07|1997-11-28|1997-12-16|NONE|REG AIR|blithely express requests ought to thr +18146|937|38|2|14|25731.02|0.10|0.07|N|O|1997-12-10|1997-12-18|1998-01-04|COLLECT COD|TRUCK|gular frays cajole slyly. ironic exc +18147|899|66|1|9|16199.01|0.09|0.07|A|F|1994-08-07|1994-09-13|1994-08-11|NONE|SHIP|ns promise slyly according to the bra +18147|921|24|2|13|23684.96|0.06|0.04|R|F|1994-09-18|1994-09-03|1994-10-07|TAKE BACK RETURN|SHIP|ide of the carefully even packages. regular +18147|1445|46|3|33|44432.52|0.04|0.01|R|F|1994-09-17|1994-10-05|1994-10-06|TAKE BACK RETURN|TRUCK|sts integrat +18147|1124|33|4|38|38954.56|0.07|0.07|R|F|1994-08-07|1994-10-13|1994-08-11|TAKE BACK RETURN|TRUCK|the fluffily +18147|1648|90|5|7|10847.48|0.04|0.05|A|F|1994-08-09|1994-08-26|1994-09-02|TAKE BACK RETURN|REG AIR|arefully final deposits at the special, +18148|1362|77|1|14|17687.04|0.10|0.02|N|O|1996-11-04|1996-10-08|1996-12-03|DELIVER IN PERSON|TRUCK|r the permanent theodolites. blith +18149|1358|35|1|45|56670.75|0.09|0.02|N|O|1997-02-20|1997-02-23|1997-03-02|NONE|AIR|ves. slyly final foxes are amo +18149|356|57|2|20|25127.00|0.09|0.01|N|O|1997-04-28|1997-04-10|1997-04-29|DELIVER IN PERSON|REG AIR|unts wake furiously. quickly pe +18149|979|48|3|48|90238.56|0.07|0.03|N|O|1997-03-09|1997-02-20|1997-03-15|COLLECT COD|REG AIR|luffily even accounts. slyly unusual Tire +18149|427|28|4|35|46459.70|0.06|0.03|N|O|1997-04-02|1997-04-13|1997-04-03|NONE|MAIL|lessly furiously s +18149|563|24|5|5|7317.80|0.06|0.06|N|O|1997-03-13|1997-04-14|1997-03-20|DELIVER IN PERSON|MAIL|heodolites after the final depen +18149|1415|33|6|3|3949.23|0.03|0.00|N|O|1997-01-22|1997-03-30|1997-01-24|COLLECT COD|REG AIR|ickly slyly even deposits +18149|364|21|7|27|34137.72|0.06|0.01|N|O|1997-03-23|1997-02-25|1997-03-30|TAKE BACK RETURN|REG AIR|deas. ironic, ironic deposit +18150|430|60|1|8|10643.44|0.07|0.02|N|O|1997-07-27|1997-06-03|1997-08-10|TAKE BACK RETURN|AIR|tect carefully special courts. asymptotes +18150|1164|65|2|12|12781.92|0.03|0.06|N|O|1997-05-11|1997-06-21|1997-06-02|DELIVER IN PERSON|AIR|s accounts boost quickly after the regul +18150|1802|3|3|15|25557.00|0.03|0.03|N|O|1997-05-30|1997-06-09|1997-06-15|NONE|AIR|resias across the blithely pending +18150|1266|78|4|33|38519.58|0.07|0.01|N|O|1997-05-26|1997-05-18|1997-06-13|NONE|MAIL|sits. fluffil +18150|1651|52|5|49|76079.85|0.07|0.07|N|O|1997-05-31|1997-06-26|1997-06-13|TAKE BACK RETURN|TRUCK|furiously. furiou +18150|800|1|6|29|49323.20|0.01|0.00|N|O|1997-06-01|1997-05-26|1997-06-04|COLLECT COD|RAIL| instructions. bold +18151|1571|72|1|45|66265.65|0.08|0.01|N|O|1996-02-21|1996-02-25|1996-03-04|DELIVER IN PERSON|REG AIR|al instructi +18151|1201|76|2|39|42985.80|0.09|0.06|N|O|1996-01-30|1996-03-13|1996-02-07|DELIVER IN PERSON|REG AIR|es wake slyl +18151|481|82|3|46|63548.08|0.04|0.03|N|O|1996-02-19|1996-02-04|1996-03-03|NONE|FOB|s. quickly +18151|278|33|4|29|34169.83|0.00|0.08|N|O|1996-02-04|1996-03-20|1996-02-06|TAKE BACK RETURN|TRUCK|ld instructions. pending +18151|1153|26|5|33|34786.95|0.03|0.03|N|O|1996-04-26|1996-03-24|1996-05-25|COLLECT COD|RAIL|ronic instructions. carefully +18151|231|32|6|34|38461.82|0.04|0.05|N|O|1996-04-25|1996-03-01|1996-05-25|COLLECT COD|TRUCK|ar packages. deposits affix about the final +18176|1619|61|1|22|33453.42|0.04|0.07|N|O|1996-07-21|1996-07-09|1996-07-30|TAKE BACK RETURN|AIR|ven ideas along the carefully ironic fo +18176|1098|4|2|8|7992.72|0.05|0.06|N|O|1996-06-11|1996-07-29|1996-07-08|TAKE BACK RETURN|FOB| slyly regular requests; furiously eve +18177|796|97|1|11|18664.69|0.10|0.02|R|F|1994-06-16|1994-05-11|1994-06-22|COLLECT COD|AIR|e the fluffily fina +18177|489|77|2|47|65305.56|0.07|0.08|A|F|1994-05-29|1994-04-02|1994-06-03|DELIVER IN PERSON|FOB|fluffily regular p +18177|866|67|3|20|35337.20|0.05|0.04|A|F|1994-05-13|1994-03-27|1994-05-20|TAKE BACK RETURN|FOB|theodolite +18177|1135|44|4|17|17614.21|0.08|0.06|R|F|1994-05-21|1994-04-11|1994-06-20|COLLECT COD|MAIL|usly express packages are inside the +18177|673|74|5|12|18884.04|0.04|0.05|R|F|1994-06-06|1994-04-04|1994-06-08|TAKE BACK RETURN|TRUCK|riously even +18178|522|23|1|9|12802.68|0.05|0.07|R|F|1995-01-09|1994-12-25|1995-01-10|TAKE BACK RETURN|REG AIR|fully ironic accounts detect bold r +18178|1439|79|2|17|22787.31|0.07|0.00|A|F|1995-02-24|1994-12-18|1995-02-27|COLLECT COD|REG AIR|al ideas accordi +18178|1028|29|3|32|29728.64|0.08|0.02|A|F|1995-02-14|1994-12-10|1995-03-08|COLLECT COD|FOB|ccounts would cajole bli +18178|853|20|4|29|50861.65|0.05|0.05|A|F|1995-02-13|1995-01-28|1995-02-28|COLLECT COD|RAIL|final somas sleep! special courts b +18179|573|64|1|18|26524.26|0.04|0.01|R|F|1994-08-17|1994-10-09|1994-09-16|NONE|REG AIR|r, even req +18179|620|52|2|12|18247.44|0.04|0.08|A|F|1994-08-18|1994-09-09|1994-08-27|NONE|AIR|ckages. special, express requests na +18179|1775|76|3|15|25151.55|0.09|0.08|A|F|1994-11-04|1994-09-27|1994-11-08|TAKE BACK RETURN|SHIP|x-ray slyly +18179|1678|61|4|39|61607.13|0.05|0.05|R|F|1994-08-08|1994-10-30|1994-08-26|DELIVER IN PERSON|TRUCK|he accounts. accounts use +18179|1959|92|5|10|18609.50|0.03|0.03|R|F|1994-10-10|1994-09-03|1994-10-31|NONE|FOB| are quickly among +18179|1635|77|6|47|72221.61|0.03|0.08|R|F|1994-08-14|1994-09-29|1994-08-27|COLLECT COD|TRUCK|ffily. unusual, special ideas pro +18180|341|70|1|38|47170.92|0.07|0.01|A|F|1992-05-07|1992-03-13|1992-05-24|DELIVER IN PERSON|SHIP|thely unusual excuses wake furiously re +18180|630|24|2|8|12245.04|0.00|0.00|R|F|1992-01-24|1992-02-27|1992-02-01|NONE|REG AIR|inst the acc +18181|1495|35|1|11|15361.39|0.05|0.03|N|O|1996-05-24|1996-05-14|1996-06-18|NONE|RAIL|g slyly quickly final requests +18181|443|73|2|2|2686.88|0.05|0.03|N|O|1996-05-15|1996-04-27|1996-06-03|COLLECT COD|RAIL|ly requests. final, even deposits are abov +18181|1704|89|3|27|43353.90|0.01|0.03|N|O|1996-06-22|1996-04-20|1996-07-06|NONE|RAIL|ven dependencies must have to wake +18181|655|49|4|18|28001.70|0.07|0.02|N|O|1996-07-09|1996-05-10|1996-07-29|DELIVER IN PERSON|SHIP|ckages. regular tithes snooze furiously. +18182|547|38|1|19|27503.26|0.02|0.04|A|F|1995-04-27|1995-06-15|1995-04-29|COLLECT COD|FOB|against the furiously spe +18182|1363|78|2|8|10114.88|0.06|0.05|N|O|1995-06-27|1995-05-29|1995-07-08|COLLECT COD|FOB|inst the sly +18182|163|90|3|14|14884.24|0.06|0.05|N|O|1995-08-08|1995-06-03|1995-08-18|COLLECT COD|MAIL|ainst the regular, regular accounts +18182|58|34|4|9|8622.45|0.04|0.01|N|O|1995-07-04|1995-05-30|1995-08-03|DELIVER IN PERSON|RAIL|y special platelets. +18182|1687|88|5|49|77845.32|0.04|0.03|N|O|1995-06-19|1995-05-14|1995-06-20|NONE|FOB|otornis. instructi +18182|1447|48|6|43|57982.92|0.03|0.08|N|F|1995-06-13|1995-05-15|1995-06-26|DELIVER IN PERSON|TRUCK|s. blithely final asymptot +18182|1471|89|7|39|53526.33|0.03|0.07|N|O|1995-07-14|1995-06-12|1995-07-22|TAKE BACK RETURN|MAIL|out the final accounts +18183|1548|89|1|10|14495.40|0.08|0.08|N|O|1997-02-06|1997-01-30|1997-02-24|DELIVER IN PERSON|AIR|fily packages. caref +18183|1201|13|2|20|22044.00|0.03|0.08|N|O|1997-03-19|1997-03-11|1997-04-09|TAKE BACK RETURN|FOB|ar dugouts around the fluffily ir +18208|555|46|1|27|39299.85|0.10|0.03|A|F|1992-07-07|1992-05-04|1992-07-08|DELIVER IN PERSON|AIR|sly about the never regular asymptotes +18208|1334|49|2|48|59295.84|0.06|0.07|R|F|1992-07-25|1992-06-11|1992-08-07|COLLECT COD|TRUCK|sly express notornis grow caref +18208|1789|90|3|22|37197.16|0.04|0.00|R|F|1992-04-19|1992-05-03|1992-04-24|TAKE BACK RETURN|MAIL|thrash blithely ironic, special +18208|1184|21|4|27|29299.86|0.09|0.02|R|F|1992-06-09|1992-05-03|1992-06-25|TAKE BACK RETURN|REG AIR|y even instructions are. carefully +18208|912|47|5|17|30819.47|0.09|0.08|R|F|1992-05-14|1992-06-18|1992-06-08|NONE|AIR| the furiously bold acc +18208|1328|5|6|49|60236.68|0.02|0.03|R|F|1992-06-20|1992-05-15|1992-07-06|NONE|AIR|eas cajole qui +18209|676|39|1|10|15766.70|0.00|0.01|N|O|1996-05-02|1996-05-23|1996-05-20|TAKE BACK RETURN|TRUCK|kly along the furio +18209|123|50|2|25|25578.00|0.08|0.01|N|O|1996-03-18|1996-04-06|1996-04-11|COLLECT COD|RAIL|s. carefully final +18209|404|5|3|5|6522.00|0.09|0.01|N|O|1996-02-27|1996-05-02|1996-03-01|TAKE BACK RETURN|TRUCK|lyly final accoun +18209|1529|10|4|16|22888.32|0.06|0.03|N|O|1996-05-31|1996-04-09|1996-06-17|COLLECT COD|TRUCK|aggle above the ca +18209|953|54|5|47|87135.65|0.07|0.02|N|O|1996-06-02|1996-04-03|1996-06-26|COLLECT COD|AIR|as among the bold dependencies use carefu +18210|400|85|1|21|27308.40|0.07|0.01|A|F|1993-10-27|1993-09-24|1993-11-03|NONE|TRUCK|le slyly against the furiously +18210|856|56|2|46|80815.10|0.00|0.06|A|F|1993-11-05|1993-09-21|1993-11-16|NONE|TRUCK|c foxes. blithely reg +18210|1610|34|3|17|25697.37|0.05|0.00|R|F|1993-08-19|1993-11-02|1993-09-12|COLLECT COD|SHIP|s. carefully slow pinto beans u +18210|631|32|4|13|19911.19|0.03|0.07|R|F|1993-09-04|1993-10-27|1993-09-16|DELIVER IN PERSON|MAIL| fluffily r +18210|18|69|5|38|34884.38|0.02|0.05|A|F|1993-09-13|1993-09-12|1993-10-08|DELIVER IN PERSON|MAIL| unusual accounts? ironic pinto +18210|1389|28|6|42|54195.96|0.09|0.08|A|F|1993-12-06|1993-09-27|1993-12-24|COLLECT COD|TRUCK|as boost slyly across the hoc +18210|1147|20|7|47|49262.58|0.01|0.05|R|F|1993-08-24|1993-10-01|1993-09-05|COLLECT COD|FOB|y even deposits haggle furiousl +18211|1730|15|1|38|62005.74|0.09|0.01|N|O|1996-10-08|1996-09-03|1996-10-18|COLLECT COD|AIR| nag. silent depos +18211|798|63|2|21|35674.59|0.01|0.07|N|O|1996-08-16|1996-09-25|1996-09-12|DELIVER IN PERSON|AIR|fluffily final +18211|1337|14|3|27|33434.91|0.03|0.07|N|O|1996-09-13|1996-08-31|1996-09-21|NONE|REG AIR|uffily along the quickly si +18211|12|13|4|36|32832.36|0.05|0.01|N|O|1996-11-16|1996-09-27|1996-11-26|DELIVER IN PERSON|FOB|fully ironic pack +18211|552|43|5|1|1452.55|0.00|0.03|N|O|1996-10-23|1996-10-14|1996-11-06|TAKE BACK RETURN|SHIP|y pending instructio +18211|503|64|6|23|32280.50|0.09|0.05|N|O|1996-08-15|1996-09-17|1996-09-14|DELIVER IN PERSON|MAIL|requests are slyly stea +18211|660|54|7|32|49941.12|0.09|0.06|N|O|1996-11-11|1996-09-23|1996-11-16|DELIVER IN PERSON|SHIP|l deposits. furiously ironic requests sle +18212|602|3|1|22|33057.20|0.00|0.02|N|O|1997-08-31|1997-09-29|1997-09-14|DELIVER IN PERSON|SHIP|y special deposits: bold foxes h +18212|1828|72|2|15|25947.30|0.02|0.06|N|O|1997-11-13|1997-10-16|1997-12-11|COLLECT COD|MAIL|s; instructions wake ironic foxes. quick +18212|939|8|3|22|40478.46|0.10|0.02|N|O|1997-10-24|1997-09-12|1997-11-21|TAKE BACK RETURN|RAIL|eposits cajole carefully. regular requests +18212|496|84|4|36|50273.64|0.06|0.01|N|O|1997-09-13|1997-08-21|1997-09-24|COLLECT COD|RAIL|ously slyly blithe instru +18212|434|22|5|28|37364.04|0.04|0.06|N|O|1997-11-04|1997-09-07|1997-11-22|TAKE BACK RETURN|RAIL|ages. fluffily ironic deposits +18212|626|89|6|47|71751.14|0.02|0.07|N|O|1997-10-12|1997-09-30|1997-10-24|NONE|SHIP|thlessly re +18212|131|84|7|30|30933.90|0.06|0.08|N|O|1997-10-06|1997-09-24|1997-10-30|DELIVER IN PERSON|RAIL|e furiously even a +18213|1895|82|1|28|50312.92|0.06|0.04|A|F|1994-01-03|1993-11-13|1994-01-08|TAKE BACK RETURN|REG AIR|e against the regular ins +18213|596|27|2|21|31428.39|0.07|0.07|R|F|1993-09-21|1993-11-01|1993-09-24|NONE|TRUCK|haggle evenly carefull +18213|108|35|3|33|33267.30|0.10|0.02|A|F|1994-01-02|1993-11-06|1994-01-30|DELIVER IN PERSON|RAIL|cial ideas haggle about th +18213|586|87|4|10|14865.80|0.06|0.07|A|F|1993-11-28|1993-10-23|1993-12-04|DELIVER IN PERSON|REG AIR|pinto beans wake blithely final packag +18214|1656|39|1|22|34268.30|0.01|0.06|N|O|1996-04-29|1996-02-27|1996-05-23|NONE|REG AIR| special ideas! c +18215|1648|72|1|39|60435.96|0.06|0.04|R|F|1993-10-06|1993-11-30|1993-10-22|DELIVER IN PERSON|TRUCK| doze. carefully pending +18215|448|36|2|28|37756.32|0.08|0.05|R|F|1993-10-04|1993-10-29|1993-10-13|COLLECT COD|RAIL| bold excuses sleep according to the even +18215|1641|83|3|9|13883.76|0.07|0.01|A|F|1994-01-07|1993-11-03|1994-01-20|NONE|MAIL|ing to the slyly final ideas wake furio +18240|1514|95|1|11|15570.61|0.01|0.04|N|O|1997-12-10|1998-01-04|1997-12-18|TAKE BACK RETURN|AIR|ing deposits. final accounts again +18240|1830|31|2|38|65809.54|0.02|0.08|N|O|1998-02-15|1998-02-08|1998-02-22|NONE|FOB|latelets. furiously bold platel +18240|610|42|3|3|4531.83|0.01|0.04|N|O|1998-02-15|1998-02-08|1998-03-17|NONE|FOB|le alongside of the furiously final deposit +18241|1912|1|1|27|48975.57|0.10|0.05|A|F|1993-10-02|1993-09-18|1993-10-19|NONE|MAIL|inos nag quickly carefully regul +18241|1570|71|2|34|50033.38|0.01|0.04|R|F|1993-08-06|1993-09-21|1993-08-28|NONE|RAIL|l, express as +18241|1235|36|3|36|40904.28|0.08|0.04|R|F|1993-08-11|1993-08-30|1993-08-17|NONE|FOB|requests solv +18241|1869|99|4|3|5312.58|0.04|0.07|R|F|1993-09-27|1993-10-23|1993-10-26|DELIVER IN PERSON|RAIL|requests. special, blithe accounts dete +18241|94|95|5|24|23858.16|0.03|0.06|R|F|1993-09-10|1993-10-20|1993-10-10|DELIVER IN PERSON|SHIP|ronic dolphins against the slyly st +18242|407|95|1|39|50988.60|0.02|0.08|R|F|1994-11-24|1995-01-09|1994-12-17|DELIVER IN PERSON|AIR|s wake slyly exp +18242|1727|28|2|9|14658.48|0.00|0.06|A|F|1995-02-28|1994-12-01|1995-03-10|NONE|FOB| tithes. regular platele +18242|1822|23|3|13|22409.66|0.01|0.07|R|F|1994-12-15|1995-01-06|1994-12-17|DELIVER IN PERSON|SHIP|ggle bold reque +18243|1319|20|1|28|34168.68|0.04|0.00|N|O|1997-08-07|1997-09-23|1997-08-10|TAKE BACK RETURN|SHIP|ggle-- blithely pending warhorses hagg +18243|210|11|2|12|13322.52|0.00|0.02|N|O|1997-09-20|1997-09-06|1997-10-15|TAKE BACK RETURN|FOB|ously final +18244|1543|44|1|1|1444.54|0.06|0.04|N|F|1995-06-08|1995-04-26|1995-07-03|DELIVER IN PERSON|FOB| express accounts. +18244|1268|80|2|8|9354.08|0.00|0.04|N|F|1995-05-28|1995-04-13|1995-06-19|DELIVER IN PERSON|MAIL|counts dazzle among the carefully ir +18244|966|69|3|10|18669.60|0.08|0.06|A|F|1995-04-16|1995-05-03|1995-04-18|DELIVER IN PERSON|MAIL| sleep above the quickly fluffy fo +18244|1773|74|4|6|10048.62|0.09|0.03|A|F|1995-04-13|1995-04-04|1995-04-14|DELIVER IN PERSON|TRUCK|l dependencies are slyl +18244|230|31|5|7|7911.61|0.06|0.06|R|F|1995-03-18|1995-03-24|1995-03-20|NONE|RAIL|uriously final accoun +18244|1580|1|6|36|53336.88|0.10|0.02|R|F|1995-04-14|1995-04-11|1995-04-17|DELIVER IN PERSON|SHIP|ily. final packages +18245|1273|85|1|9|10568.43|0.02|0.00|R|F|1993-06-26|1993-07-16|1993-07-08|COLLECT COD|RAIL|pecial, pending requests +18245|564|25|2|31|45401.36|0.10|0.01|R|F|1993-10-02|1993-07-06|1993-10-31|TAKE BACK RETURN|RAIL|out the blithely ironic dolphins. qui +18246|1534|15|1|47|67469.91|0.04|0.07|N|O|1997-07-20|1997-07-10|1997-07-28|DELIVER IN PERSON|SHIP| ruthless packages sle +18246|164|43|2|42|44694.72|0.01|0.01|N|O|1997-10-02|1997-08-20|1997-10-27|DELIVER IN PERSON|TRUCK|ar deposits play. blithely even deposit +18247|1815|2|1|45|77256.45|0.09|0.08|A|F|1994-11-18|1994-12-21|1994-12-09|NONE|TRUCK|es. fluffi +18272|1211|12|1|15|16683.15|0.09|0.07|N|O|1998-09-27|1998-08-21|1998-10-20|NONE|MAIL|posits along the slyly unusual dep +18272|1295|33|2|14|16748.06|0.06|0.06|N|O|1998-07-16|1998-08-14|1998-08-10|DELIVER IN PERSON|REG AIR|bout the slyly regular packages wake bl +18272|926|27|3|20|36538.40|0.05|0.04|N|O|1998-07-22|1998-07-25|1998-08-14|TAKE BACK RETURN|REG AIR|ly ironic t +18272|1297|35|4|26|31155.54|0.03|0.00|N|O|1998-08-24|1998-08-17|1998-09-11|NONE|TRUCK|ockey play +18273|39|65|1|48|45073.44|0.04|0.05|N|O|1995-11-19|1995-12-14|1995-11-27|COLLECT COD|AIR|s mold slyly. furious +18273|693|56|2|48|76497.12|0.02|0.02|N|O|1995-11-22|1995-11-12|1995-12-16|NONE|AIR| regular requests cajole c +18273|1882|12|3|8|14271.04|0.06|0.03|N|O|1995-12-29|1995-10-27|1996-01-06|NONE|MAIL|ing to the ironic wart +18273|1881|11|4|10|17828.80|0.01|0.08|N|O|1995-09-22|1995-11-14|1995-10-14|TAKE BACK RETURN|MAIL| packages. re +18273|1096|67|5|32|31906.88|0.07|0.08|N|O|1995-12-04|1995-11-26|1995-12-26|COLLECT COD|FOB|fully. unusual accounts at the alway +18273|585|46|6|17|25254.86|0.04|0.01|N|O|1996-01-13|1995-12-06|1996-01-14|TAKE BACK RETURN|TRUCK|according to the express co +18274|1606|7|1|11|16583.60|0.08|0.06|R|F|1993-12-09|1993-11-02|1993-12-31|DELIVER IN PERSON|SHIP|eposits. final theodolites sle +18275|888|88|1|5|8944.40|0.08|0.07|A|F|1992-02-29|1992-03-04|1992-03-05|COLLECT COD|REG AIR|counts. quickly express packages n +18275|1235|47|2|41|46585.43|0.10|0.07|A|F|1992-04-26|1992-03-11|1992-05-20|NONE|RAIL|nding instructions +18275|1500|40|3|34|47651.00|0.01|0.01|R|F|1992-03-25|1992-02-29|1992-04-02|DELIVER IN PERSON|RAIL|could have +18275|778|43|4|7|11751.39|0.06|0.05|A|F|1992-02-11|1992-03-03|1992-03-04|NONE|REG AIR|nts. special accou +18275|649|81|5|32|49588.48|0.10|0.05|A|F|1992-03-10|1992-04-10|1992-03-19|DELIVER IN PERSON|RAIL|sts. ironic packages cajole a +18275|261|62|6|41|47611.66|0.03|0.08|A|F|1992-03-02|1992-03-17|1992-03-03|NONE|MAIL|y bold accounts. ironically final req +18276|1828|15|1|50|86491.00|0.04|0.05|N|O|1997-04-12|1997-02-20|1997-04-22|TAKE BACK RETURN|SHIP|equests. special warhorses upon th +18276|1425|4|2|36|47751.12|0.10|0.08|N|O|1997-01-29|1997-03-27|1997-02-24|NONE|AIR|ress somas sleep quickly? slyly ironic in +18276|562|23|3|41|59964.96|0.08|0.00|N|O|1997-03-29|1997-03-19|1997-04-21|DELIVER IN PERSON|REG AIR|y about the unusual +18276|1342|43|4|45|55950.30|0.01|0.07|N|O|1997-04-05|1997-02-12|1997-04-22|TAKE BACK RETURN|REG AIR|the blithely special dolphins x-r +18277|1979|12|1|31|58310.07|0.05|0.04|N|O|1998-03-24|1998-05-10|1998-04-17|TAKE BACK RETURN|SHIP|hely even deposits wake quickly amo +18277|956|57|2|10|18569.50|0.02|0.07|N|O|1998-03-12|1998-04-17|1998-03-18|DELIVER IN PERSON|SHIP|ld, final packages. furiously even epit +18277|1943|32|3|7|12914.58|0.10|0.03|N|O|1998-04-15|1998-05-21|1998-04-26|DELIVER IN PERSON|TRUCK|carefully ironic ideas believe caref +18277|1096|2|4|27|26921.43|0.05|0.04|N|O|1998-06-11|1998-05-06|1998-07-11|NONE|REG AIR|nt ideas are blithely. fu +18278|1329|6|1|29|35679.28|0.05|0.03|N|O|1996-06-01|1996-05-18|1996-06-09|NONE|SHIP|quickly regular deposi +18279|990|91|1|16|30255.84|0.03|0.07|A|F|1994-06-22|1994-04-24|1994-07-10|NONE|FOB|ly express packages. pl +18279|1052|58|2|7|6671.35|0.07|0.08|R|F|1994-06-18|1994-04-01|1994-06-19|NONE|TRUCK|ffily ironic pinto beans are qui +18279|269|24|3|31|36247.06|0.06|0.03|A|F|1994-05-29|1994-04-25|1994-06-05|NONE|AIR|ests. accounts detect +18279|1790|17|4|14|23685.06|0.02|0.02|R|F|1994-05-25|1994-03-30|1994-06-13|COLLECT COD|AIR|packages haggle after the carefu +18279|379|64|5|34|43498.58|0.03|0.01|R|F|1994-06-21|1994-05-13|1994-07-21|COLLECT COD|REG AIR|regular platelets so +18279|1512|13|6|33|46645.83|0.03|0.02|A|F|1994-06-26|1994-04-22|1994-07-19|NONE|AIR|among the foxes haggle +18304|1287|25|1|22|26142.16|0.06|0.01|A|F|1992-08-07|1992-09-04|1992-08-20|DELIVER IN PERSON|MAIL|old deposits. i +18304|670|64|2|46|72250.82|0.00|0.01|A|F|1992-08-26|1992-08-09|1992-09-17|TAKE BACK RETURN|SHIP|ly pending foxes. blithely special a +18304|1591|12|3|47|70151.73|0.01|0.00|A|F|1992-09-28|1992-08-17|1992-09-29|COLLECT COD|MAIL|quests-- fluffily ironic foxes +18304|647|10|4|46|71191.44|0.09|0.03|A|F|1992-10-01|1992-08-14|1992-10-14|TAKE BACK RETURN|SHIP|f the fluffily +18304|190|43|5|34|37066.46|0.06|0.02|R|F|1992-10-10|1992-09-21|1992-10-15|DELIVER IN PERSON|SHIP|eep fluffily +18304|1097|3|6|1|998.09|0.02|0.08|A|F|1992-09-05|1992-09-08|1992-10-05|COLLECT COD|FOB|structions. fluffily ironic accounts sleep +18304|85|61|7|35|34477.80|0.10|0.08|A|F|1992-09-25|1992-08-11|1992-10-07|NONE|MAIL|iously. warthogs sleep speci +18305|389|18|1|9|11604.42|0.08|0.04|N|O|1997-11-04|1997-11-02|1997-11-15|COLLECT COD|TRUCK|cial dependencies grow bli +18305|1423|63|2|10|13244.20|0.09|0.07|N|O|1997-11-30|1997-11-07|1997-12-22|DELIVER IN PERSON|FOB| nag along +18305|1040|76|3|44|41405.76|0.04|0.06|N|O|1997-12-06|1997-09-25|1997-12-07|COLLECT COD|SHIP|es use fluffily among the +18305|1281|56|4|12|14187.36|0.00|0.05|N|O|1997-08-23|1997-10-06|1997-09-19|TAKE BACK RETURN|AIR|according to the quickly +18305|1726|11|5|17|27671.24|0.10|0.03|N|O|1997-08-28|1997-11-15|1997-09-24|COLLECT COD|RAIL|usly after the f +18305|937|6|6|5|9189.65|0.05|0.07|N|O|1997-10-29|1997-10-10|1997-11-15|COLLECT COD|TRUCK|iously express gr +18306|571|72|1|9|13244.13|0.06|0.05|N|O|1996-08-08|1996-08-26|1996-08-16|DELIVER IN PERSON|TRUCK|sublate quickly. ironic, +18306|410|40|2|35|45864.35|0.06|0.00|N|O|1996-09-11|1996-08-18|1996-09-22|TAKE BACK RETURN|REG AIR|al accounts. car +18307|1011|17|1|14|12768.14|0.09|0.05|R|F|1993-02-11|1993-03-28|1993-02-18|TAKE BACK RETURN|TRUCK|ructions cajole. slyly even excuses snooze +18307|1310|87|2|18|21803.58|0.01|0.02|R|F|1993-02-27|1993-04-25|1993-03-17|DELIVER IN PERSON|AIR| ideas. final sheav +18307|1672|73|3|41|64520.47|0.08|0.04|R|F|1993-05-29|1993-05-01|1993-06-26|NONE|AIR|foxes sleep blit +18307|1391|92|4|36|46526.04|0.04|0.04|R|F|1993-02-16|1993-04-16|1993-02-25|TAKE BACK RETURN|FOB|ts boost slyly. blithely blithe requests +18307|648|80|5|10|15486.40|0.01|0.04|A|F|1993-02-07|1993-04-27|1993-02-20|COLLECT COD|RAIL|uctions. unusual, regular request +18308|110|37|1|7|7070.77|0.03|0.05|R|F|1995-01-03|1994-12-16|1995-01-25|NONE|REG AIR| blithely according t +18308|558|59|2|20|29171.00|0.03|0.06|A|F|1995-01-27|1994-12-11|1995-02-26|COLLECT COD|AIR|es wake slyly silent packages. +18308|1456|35|3|1|1357.45|0.06|0.04|A|F|1995-01-02|1994-12-10|1995-01-31|TAKE BACK RETURN|AIR| accounts sleep silent asymptotes. +18308|1747|32|4|10|16487.40|0.06|0.06|A|F|1994-10-15|1994-12-17|1994-10-16|COLLECT COD|SHIP|osits are accordi +18308|197|98|5|48|52665.12|0.01|0.07|A|F|1995-01-13|1994-12-19|1995-01-25|COLLECT COD|RAIL|haggle furiously ironic package +18308|1588|29|6|32|47666.56|0.06|0.06|R|F|1994-10-22|1994-12-08|1994-11-13|TAKE BACK RETURN|MAIL|oxes? ironic pack +18308|527|28|7|46|65665.92|0.10|0.02|A|F|1994-12-02|1994-12-15|1994-12-03|NONE|MAIL|foxes. finally ironic ideas +18309|1633|57|1|3|4603.89|0.04|0.00|N|O|1996-03-01|1996-04-05|1996-03-18|NONE|REG AIR|telets cajole furiously bold deposits. fluf +18309|1168|5|2|45|48112.20|0.05|0.04|N|O|1996-05-31|1996-03-30|1996-06-27|TAKE BACK RETURN|SHIP|ial asymptotes. blithely fina +18310|798|99|1|2|3397.58|0.05|0.05|R|F|1993-09-04|1993-08-12|1993-09-13|COLLECT COD|SHIP|nag slyly aroun +18311|293|21|1|29|34605.41|0.03|0.01|N|O|1998-03-22|1998-04-27|1998-04-15|NONE|RAIL|ng the ironic do +18311|59|60|2|18|17262.90|0.08|0.03|N|O|1998-06-08|1998-04-27|1998-07-01|NONE|AIR|ironic requests use. final accou +18311|1583|84|3|39|57898.62|0.10|0.08|N|O|1998-04-30|1998-05-08|1998-05-11|TAKE BACK RETURN|AIR|usly special +18311|1177|78|4|28|30188.76|0.04|0.02|N|O|1998-03-21|1998-06-07|1998-04-15|COLLECT COD|SHIP|symptotes wake carefully. exp +18336|1286|61|1|49|58176.72|0.09|0.04|A|F|1994-04-28|1994-06-29|1994-04-29|TAKE BACK RETURN|SHIP|ackages wake carefully +18336|458|17|2|8|10867.60|0.08|0.00|A|F|1994-06-07|1994-07-07|1994-06-27|NONE|MAIL|fully even ideas haggle slyly after the ca +18336|1082|83|3|48|47187.84|0.09|0.06|A|F|1994-07-25|1994-06-23|1994-08-17|NONE|TRUCK| requests serve slyly caref +18336|1130|67|4|34|35058.42|0.08|0.05|A|F|1994-05-09|1994-07-22|1994-05-12|TAKE BACK RETURN|AIR|ular instructions alo +18336|36|12|5|9|8424.27|0.08|0.06|R|F|1994-07-07|1994-06-30|1994-07-22|NONE|AIR|gle furiously final packages. unusual r +18336|1078|79|6|4|3916.28|0.04|0.05|R|F|1994-08-18|1994-07-10|1994-08-21|COLLECT COD|RAIL|accounts. blithely speci +18337|1871|72|1|14|24820.18|0.04|0.08|A|F|1994-03-05|1994-05-07|1994-03-07|TAKE BACK RETURN|FOB|arefully regular deposits. +18337|14|90|2|16|14624.16|0.01|0.01|A|F|1994-05-01|1994-03-28|1994-05-31|TAKE BACK RETURN|SHIP|tructions are carefully carefull +18337|128|7|3|16|16449.92|0.00|0.00|R|F|1994-04-02|1994-04-16|1994-04-13|COLLECT COD|REG AIR|hely. special, regular foxes am +18337|1909|54|4|13|23541.70|0.03|0.03|R|F|1994-04-22|1994-04-22|1994-05-15|TAKE BACK RETURN|AIR|of the carefully final p +18338|1870|71|1|47|83277.89|0.03|0.05|A|F|1994-06-01|1994-07-31|1994-06-10|DELIVER IN PERSON|AIR|losely unusual theodolit +18338|1753|54|2|17|28130.75|0.05|0.05|A|F|1994-07-11|1994-07-31|1994-07-22|NONE|SHIP|thely express packag +18338|1802|32|3|21|35779.80|0.04|0.05|A|F|1994-07-12|1994-08-08|1994-08-05|DELIVER IN PERSON|REG AIR| foxes! idly even d +18338|1220|58|4|5|5606.10|0.10|0.07|R|F|1994-07-30|1994-07-04|1994-08-04|COLLECT COD|TRUCK|ironic deposits against th +18338|558|89|5|36|52507.80|0.05|0.00|A|F|1994-08-14|1994-07-20|1994-08-26|TAKE BACK RETURN|SHIP| packages us +18338|534|65|6|29|41601.37|0.01|0.02|A|F|1994-08-20|1994-07-24|1994-09-11|NONE|AIR|ong the slyly final pa +18339|1177|78|1|35|37735.95|0.09|0.03|N|O|1998-03-01|1998-01-09|1998-03-20|COLLECT COD|TRUCK|refully. final deposits +18339|1173|82|2|18|19335.06|0.02|0.02|N|O|1998-02-10|1997-12-19|1998-02-25|DELIVER IN PERSON|MAIL|ons. express +18340|634|97|1|38|58315.94|0.00|0.02|N|O|1995-08-25|1995-09-12|1995-09-07|TAKE BACK RETURN|MAIL| after the +18340|1827|71|2|47|81254.54|0.08|0.04|N|O|1995-09-22|1995-09-14|1995-10-19|NONE|REG AIR|symptotes according to the pac +18340|1150|51|3|8|8409.20|0.07|0.02|N|O|1995-07-14|1995-08-06|1995-07-28|COLLECT COD|TRUCK| ironic sauternes use carefully quickly +18340|1503|44|4|15|21067.50|0.09|0.06|N|O|1995-09-11|1995-08-04|1995-09-20|COLLECT COD|AIR|y quickly bold depo +18340|987|56|5|40|75519.20|0.03|0.00|N|O|1995-07-22|1995-09-10|1995-07-27|TAKE BACK RETURN|REG AIR|unts. furiously even packages s +18341|1189|90|1|48|52328.64|0.04|0.04|R|F|1993-09-08|1993-08-20|1993-09-15|DELIVER IN PERSON|SHIP|arefully alongside of the furiously sp +18342|454|84|1|35|47405.75|0.07|0.05|N|O|1997-03-06|1997-02-14|1997-03-08|DELIVER IN PERSON|TRUCK|lly regular accounts +18342|94|45|2|39|38769.51|0.10|0.06|N|O|1996-12-13|1996-12-22|1997-01-02|DELIVER IN PERSON|AIR|scapades sleep slyly furiously even idea +18342|101|54|3|14|14015.40|0.04|0.00|N|O|1997-02-13|1997-01-21|1997-03-13|DELIVER IN PERSON|SHIP|ccounts. unusu +18342|327|84|4|30|36819.60|0.07|0.04|N|O|1997-02-11|1997-02-11|1997-02-16|DELIVER IN PERSON|MAIL|ses. quickly final warhorses boost sil +18342|1955|100|5|20|37139.00|0.01|0.06|N|O|1997-01-11|1997-01-10|1997-01-21|TAKE BACK RETURN|FOB|after the quickly unusual p +18342|550|51|6|3|4351.65|0.06|0.00|N|O|1997-02-10|1997-02-04|1997-02-24|COLLECT COD|REG AIR|e deposits nag above the regular pac +18342|232|60|7|9|10190.07|0.06|0.02|N|O|1996-12-12|1997-01-26|1996-12-17|COLLECT COD|AIR|se above the blithely special accounts. f +18343|1650|74|1|8|12413.20|0.10|0.01|N|O|1998-07-17|1998-06-22|1998-08-03|DELIVER IN PERSON|AIR|ithely pen +18368|955|24|1|13|24127.35|0.07|0.04|A|F|1993-03-06|1993-03-01|1993-03-30|TAKE BACK RETURN|TRUCK|he closely even requests +18368|225|80|2|7|7876.54|0.10|0.03|A|F|1992-12-27|1993-02-26|1993-01-21|COLLECT COD|RAIL|he quickly regular ex +18368|758|91|3|16|26540.00|0.06|0.02|A|F|1993-03-15|1993-01-02|1993-04-12|NONE|AIR| packages detect +18368|1302|79|4|14|16846.20|0.05|0.02|R|F|1993-02-01|1993-02-08|1993-02-28|DELIVER IN PERSON|FOB| dinos. blithely final excuses in +18369|912|15|1|2|3625.82|0.04|0.02|N|O|1998-04-25|1998-04-26|1998-05-25|TAKE BACK RETURN|REG AIR|n foxes run regular packa +18369|1375|52|2|32|40843.84|0.01|0.02|N|O|1998-03-06|1998-03-19|1998-03-19|DELIVER IN PERSON|RAIL|to beans are carefully re +18370|568|99|1|6|8811.36|0.07|0.05|A|F|1995-04-25|1995-03-07|1995-05-22|DELIVER IN PERSON|FOB|nto beans use furiou +18370|1235|73|2|3|3408.69|0.06|0.04|R|F|1995-03-20|1995-03-22|1995-04-01|TAKE BACK RETURN|MAIL|lyly pending packages. expr +18370|763|28|3|39|64886.64|0.00|0.08|A|F|1995-03-12|1995-04-05|1995-03-24|NONE|REG AIR|fully silent packages. +18370|1567|48|4|35|51399.60|0.02|0.01|R|F|1995-03-11|1995-03-13|1995-03-12|DELIVER IN PERSON|TRUCK| excuses. quickly even packages cajol +18371|1723|66|1|27|43867.44|0.06|0.02|R|F|1994-11-28|1994-12-11|1994-12-07|NONE|MAIL|eodolites use +18372|1122|95|1|15|15346.80|0.03|0.03|N|O|1995-12-17|1996-01-02|1996-01-10|NONE|FOB|ng pinto beans. furiously expres +18372|1723|50|2|40|64988.80|0.01|0.06|N|O|1996-02-09|1996-01-15|1996-02-18|COLLECT COD|REG AIR|instructions. slyly bold +18372|1564|65|3|38|55691.28|0.05|0.01|N|O|1996-01-01|1995-11-23|1996-01-20|NONE|SHIP|l theodolites affix slyly packages. +18373|1190|63|1|7|7638.33|0.05|0.03|A|F|1992-08-10|1992-07-05|1992-08-23|TAKE BACK RETURN|REG AIR| express pe +18374|234|35|1|15|17013.45|0.01|0.07|R|F|1992-11-20|1992-11-20|1992-12-19|COLLECT COD|TRUCK|hily even accounts. quickly special +18374|1328|67|2|26|31962.32|0.02|0.07|R|F|1993-01-12|1992-11-30|1993-01-17|TAKE BACK RETURN|FOB|le quickly. spec +18374|240|22|3|49|55871.76|0.05|0.05|R|F|1992-10-19|1992-12-19|1992-10-29|NONE|AIR|hely special ideas-- fu +18374|1137|46|4|27|28029.51|0.05|0.06|A|F|1993-01-24|1992-11-09|1993-02-08|NONE|TRUCK| wake slyly. furiously final foxes are +18374|30|6|5|8|7440.24|0.09|0.00|A|F|1993-01-03|1992-12-17|1993-02-01|DELIVER IN PERSON|MAIL|pending foxes? +18375|768|69|1|11|18356.36|0.00|0.04|N|O|1995-11-01|1995-12-14|1995-11-26|TAKE BACK RETURN|FOB|as maintain. pend +18375|1847|77|2|28|48967.52|0.10|0.03|N|O|1995-11-09|1995-11-25|1995-11-22|COLLECT COD|REG AIR|mas cajole slyly abov +18375|1158|95|3|7|7414.05|0.07|0.00|N|O|1995-09-30|1995-12-10|1995-10-09|DELIVER IN PERSON|FOB|gged, unusual accounts +18375|1339|40|4|24|29767.92|0.05|0.04|N|O|1995-10-04|1995-11-21|1995-10-18|COLLECT COD|SHIP|un blithely slyly express deposits? flu +18375|157|84|5|42|44400.30|0.10|0.03|N|O|1995-11-03|1995-12-12|1995-11-19|NONE|MAIL|aphs haggle slyly slyly final de +18400|430|89|1|40|53217.20|0.07|0.07|N|O|1995-12-14|1996-02-17|1996-01-01|DELIVER IN PERSON|SHIP|special acc +18400|812|46|2|43|73650.83|0.03|0.05|N|O|1996-03-05|1996-01-29|1996-03-16|NONE|AIR|lyly ironic instructions. +18401|126|79|1|23|23600.76|0.01|0.00|N|O|1996-10-23|1996-11-27|1996-10-25|NONE|FOB|nent deposits boo +18401|468|98|2|38|52001.48|0.05|0.05|N|O|1996-12-06|1996-12-24|1996-12-15|DELIVER IN PERSON|REG AIR| foxes haggle from the final +18402|989|92|1|47|88829.06|0.06|0.02|R|F|1994-12-18|1994-10-23|1995-01-16|NONE|MAIL|riously bold frets cajole? sly +18402|497|85|2|15|20962.35|0.01|0.05|R|F|1994-10-15|1994-10-19|1994-10-17|NONE|RAIL|unts affix furiously ironic ideas! e +18402|1904|49|3|46|83071.40|0.03|0.07|R|F|1994-11-30|1994-11-01|1994-12-12|DELIVER IN PERSON|TRUCK|s. slyly regular id +18402|1321|22|4|41|50115.12|0.06|0.08|R|F|1994-10-16|1994-11-25|1994-11-01|TAKE BACK RETURN|AIR|nstructions about the quietly regular +18402|414|44|5|24|31545.84|0.08|0.01|A|F|1994-12-10|1994-10-17|1994-12-25|DELIVER IN PERSON|MAIL|es. blithe theodolites boost quickly slyl +18403|659|91|1|30|46789.50|0.08|0.04|N|O|1996-12-18|1997-01-21|1997-01-07|COLLECT COD|TRUCK|s. platelets cajole so +18403|1514|95|2|22|31141.22|0.10|0.01|N|O|1996-11-28|1997-01-13|1996-12-22|COLLECT COD|MAIL|nt accounts a +18403|1099|100|3|5|5000.45|0.01|0.05|N|O|1997-01-22|1996-12-27|1997-01-26|DELIVER IN PERSON|SHIP| the accounts. ca +18404|1072|8|1|10|9730.70|0.06|0.08|N|O|1998-06-07|1998-06-01|1998-06-23|DELIVER IN PERSON|FOB|tions boost slo +18404|420|21|2|25|33010.50|0.07|0.02|N|O|1998-05-28|1998-06-24|1998-06-07|DELIVER IN PERSON|AIR|g accounts sleep fluffily alo +18405|1618|42|1|3|4558.83|0.00|0.08|R|F|1994-01-11|1994-03-24|1994-02-05|TAKE BACK RETURN|SHIP|doze carefully excuses. pending, ruth +18405|29|80|2|43|39947.86|0.02|0.06|R|F|1994-02-09|1994-02-27|1994-02-26|COLLECT COD|SHIP|posits: slyly permanent package +18405|1959|48|3|37|68855.15|0.10|0.00|A|F|1994-03-21|1994-03-04|1994-03-23|TAKE BACK RETURN|MAIL|ng packages haggle blithely. +18405|1477|17|4|37|51003.39|0.04|0.00|A|F|1994-04-15|1994-04-06|1994-04-21|NONE|SHIP| furiously expres +18405|664|27|5|15|23469.90|0.07|0.01|R|F|1994-03-12|1994-02-13|1994-03-21|NONE|MAIL|deposits. p +18406|1379|94|1|26|33289.62|0.00|0.05|A|F|1994-05-18|1994-07-12|1994-05-19|NONE|RAIL|ffix. quickly +18406|189|90|2|35|38121.30|0.00|0.01|A|F|1994-06-30|1994-06-15|1994-07-25|DELIVER IN PERSON|SHIP|. carefully even t +18407|156|83|1|6|6336.90|0.09|0.06|A|F|1992-12-24|1992-12-26|1993-01-10|COLLECT COD|RAIL|nag along the fluffily even pack +18407|1071|42|2|21|20413.47|0.05|0.00|A|F|1993-02-02|1992-11-27|1993-02-27|NONE|SHIP|ly ironic foxe +18432|223|5|1|36|40435.92|0.00|0.06|A|F|1995-04-01|1995-05-19|1995-04-14|TAKE BACK RETURN|FOB|ly express accounts. boldly exp +18432|1385|86|2|28|36018.64|0.08|0.02|A|F|1995-04-14|1995-05-24|1995-05-11|DELIVER IN PERSON|SHIP|g instructions: regular requests doze +18432|1805|6|3|35|59738.00|0.08|0.00|R|F|1995-04-22|1995-05-27|1995-05-04|DELIVER IN PERSON|REG AIR| furiously carefully regular +18432|1770|71|4|24|40122.48|0.05|0.05|R|F|1995-04-10|1995-05-15|1995-05-01|COLLECT COD|RAIL| the even, even deposi +18432|1508|9|5|40|56380.00|0.09|0.06|A|F|1995-05-01|1995-04-19|1995-05-03|NONE|SHIP|riously packages. hockey players na +18432|161|62|6|19|20162.04|0.05|0.06|N|F|1995-06-15|1995-05-04|1995-07-14|NONE|MAIL|uickly after the +18433|906|75|1|27|48786.30|0.06|0.05|N|O|1998-05-01|1998-06-10|1998-05-04|COLLECT COD|SHIP|ly final packages. quickly pending ac +18433|75|76|2|15|14626.05|0.09|0.04|N|O|1998-07-30|1998-06-23|1998-08-28|COLLECT COD|MAIL|use past the carefu +18433|976|79|3|23|43170.31|0.05|0.05|N|O|1998-06-02|1998-06-10|1998-06-13|TAKE BACK RETURN|RAIL|uests sleep furio +18433|144|23|4|24|25059.36|0.05|0.04|N|O|1998-08-03|1998-06-10|1998-08-27|DELIVER IN PERSON|FOB|the final packages. quic +18434|1524|45|1|37|52744.24|0.09|0.01|N|O|1997-10-09|1997-08-13|1997-10-23|NONE|AIR|r accounts ca +18434|897|31|2|40|71915.60|0.05|0.08|N|O|1997-09-04|1997-08-11|1997-09-15|COLLECT COD|TRUCK|al asymptotes ought to haggle. slyly eve +18434|762|95|3|8|13302.08|0.07|0.00|N|O|1997-07-17|1997-09-12|1997-07-25|DELIVER IN PERSON|SHIP|r, final idea +18435|613|76|1|10|15136.10|0.06|0.08|N|O|1996-07-07|1996-05-07|1996-07-09|DELIVER IN PERSON|MAIL|ously special pinto beans h +18435|1266|41|2|50|58363.00|0.07|0.00|N|O|1996-03-30|1996-06-04|1996-04-28|TAKE BACK RETURN|AIR|inal ideas. furiously final dolphins h +18435|971|40|3|31|58031.07|0.05|0.01|N|O|1996-03-17|1996-05-02|1996-03-23|TAKE BACK RETURN|AIR|owly final accounts sleep car +18435|465|24|4|41|55983.86|0.04|0.05|N|O|1996-03-24|1996-05-10|1996-04-21|COLLECT COD|SHIP|s accounts wake +18436|1646|47|1|36|55715.04|0.04|0.04|N|O|1996-03-15|1996-02-16|1996-04-07|TAKE BACK RETURN|SHIP|al instructions. bold r +18436|1479|58|2|37|51077.39|0.00|0.03|N|O|1996-01-20|1996-02-04|1996-01-31|COLLECT COD|RAIL|ckages detect carefully carefully p +18436|1206|18|3|45|49824.00|0.09|0.07|N|O|1995-12-17|1996-01-30|1996-01-08|DELIVER IN PERSON|RAIL|after the pending theodolites. fluffily +18437|1199|100|1|31|34105.89|0.09|0.01|A|F|1994-07-25|1994-06-28|1994-08-24|TAKE BACK RETURN|FOB|ly regular depth +18438|1881|11|1|41|73098.08|0.08|0.08|N|O|1996-08-10|1996-10-04|1996-08-20|DELIVER IN PERSON|MAIL|its sublate carefully enticing requests. q +18438|1222|23|2|49|55037.78|0.01|0.07|N|O|1996-08-15|1996-10-12|1996-09-07|COLLECT COD|REG AIR|ounts. blithely stealthy asymptotes cajo +18438|61|87|3|11|10571.66|0.09|0.00|N|O|1996-09-17|1996-10-23|1996-10-05|TAKE BACK RETURN|TRUCK|sual pinto beans. quickly silent +18438|1133|70|4|49|50672.37|0.05|0.08|N|O|1996-09-25|1996-10-14|1996-10-09|DELIVER IN PERSON|MAIL|e slyly fina +18438|1361|76|5|27|34083.72|0.03|0.00|N|O|1996-09-12|1996-10-23|1996-09-22|TAKE BACK RETURN|MAIL|ges. express theodolites haggle blithe +18438|568|99|6|29|42588.24|0.08|0.01|N|O|1996-11-10|1996-09-24|1996-11-11|TAKE BACK RETURN|AIR|ong the enticingly final ideas. ironi +18439|1702|29|1|49|78581.30|0.01|0.08|N|O|1998-09-01|1998-08-25|1998-09-04|NONE|SHIP|fily. careful, regular grouches after th +18439|1470|10|2|48|65830.56|0.08|0.04|N|O|1998-10-04|1998-07-30|1998-10-18|TAKE BACK RETURN|FOB|ages. slyly quick foxes about t +18439|1369|8|3|31|39381.16|0.08|0.05|N|O|1998-07-13|1998-08-02|1998-07-24|TAKE BACK RETURN|REG AIR|ependencies integrate f +18439|279|34|4|25|29481.75|0.10|0.05|N|O|1998-09-18|1998-07-15|1998-10-14|TAKE BACK RETURN|AIR|n deposits. bravely ev +18439|823|90|5|5|8619.10|0.08|0.02|N|O|1998-07-25|1998-08-20|1998-08-08|TAKE BACK RETURN|AIR|e of the unusual requests. slyly bold saut +18439|633|34|6|17|26071.71|0.00|0.04|N|O|1998-06-19|1998-07-08|1998-07-12|TAKE BACK RETURN|TRUCK|uests. furiously r +18464|1894|24|1|2|3591.78|0.02|0.07|R|F|1992-07-06|1992-06-11|1992-07-21|DELIVER IN PERSON|MAIL|eep blithely. permanently even packages +18464|154|81|2|19|20028.85|0.04|0.04|A|F|1992-03-31|1992-05-28|1992-04-09|NONE|RAIL|ckly final dolphins +18464|1022|23|3|22|20306.44|0.05|0.08|A|F|1992-04-30|1992-05-04|1992-05-16|COLLECT COD|FOB|evenly ironic accou +18464|1077|13|4|3|2934.21|0.05|0.08|R|F|1992-05-03|1992-06-05|1992-05-19|TAKE BACK RETURN|RAIL|as. thinly s +18464|608|2|5|49|73921.40|0.08|0.07|R|F|1992-06-04|1992-06-20|1992-06-23|NONE|FOB|y even requests. fluffily express dependen +18464|1626|9|6|1|1527.62|0.02|0.05|A|F|1992-07-17|1992-06-27|1992-08-09|NONE|TRUCK|y regular theodo +18464|718|83|7|18|29136.78|0.04|0.06|R|F|1992-04-20|1992-05-31|1992-04-28|DELIVER IN PERSON|MAIL|fily even accounts must cajole. +18465|1670|71|1|4|6286.68|0.10|0.07|A|F|1993-06-13|1993-07-02|1993-06-18|TAKE BACK RETURN|TRUCK|y. slyly even foxes use carefully slyly spe +18465|1986|31|2|29|54751.42|0.04|0.03|R|F|1993-04-24|1993-05-31|1993-04-28|TAKE BACK RETURN|SHIP|eodolites. reg +18465|418|6|3|28|36915.48|0.03|0.05|A|F|1993-08-08|1993-06-23|1993-08-16|COLLECT COD|SHIP|hind the express packages doubt +18465|751|52|4|4|6607.00|0.01|0.05|A|F|1993-07-12|1993-07-08|1993-08-10|DELIVER IN PERSON|REG AIR|ar packages sleep ac +18465|1984|17|5|20|37719.60|0.07|0.00|R|F|1993-05-07|1993-07-10|1993-05-20|NONE|REG AIR|s. never special packages doubt b +18465|244|26|6|43|49202.32|0.09|0.06|R|F|1993-07-17|1993-07-01|1993-08-15|DELIVER IN PERSON|MAIL|lar requests haggle alongside of the sp +18465|147|48|7|11|11518.54|0.07|0.03|A|F|1993-04-29|1993-05-25|1993-05-27|NONE|FOB|ites. packages boost acc +18466|230|85|1|1|1130.23|0.04|0.06|R|F|1992-07-21|1992-07-13|1992-08-15|TAKE BACK RETURN|REG AIR| the unusual, pending requests. final, pe +18466|1004|40|2|28|25340.00|0.00|0.04|A|F|1992-09-15|1992-07-07|1992-09-30|TAKE BACK RETURN|MAIL| quickly f +18466|237|92|3|34|38665.82|0.03|0.01|A|F|1992-08-05|1992-08-13|1992-09-02|NONE|FOB|ts! furiously +18466|622|54|4|9|13703.58|0.03|0.00|R|F|1992-05-27|1992-07-31|1992-06-03|DELIVER IN PERSON|RAIL|des use carefully. regular patterns nag fu +18466|1164|73|5|28|29824.48|0.02|0.08|R|F|1992-07-09|1992-07-28|1992-07-23|COLLECT COD|MAIL|oxes believe +18466|947|48|6|48|88701.12|0.03|0.07|R|F|1992-08-15|1992-07-24|1992-08-29|NONE|REG AIR|lly final accounts sleep furiously. bol +18467|76|2|1|12|11712.84|0.08|0.03|A|F|1993-01-23|1993-01-10|1993-02-03|NONE|SHIP|ecial somas. blithely regu +18468|311|12|1|35|42395.85|0.06|0.02|A|F|1994-03-14|1994-02-24|1994-04-07|NONE|RAIL|riously fluffily regular pl +18468|1548|49|2|20|28990.80|0.03|0.04|R|F|1994-02-27|1994-02-13|1994-02-28|NONE|SHIP|t the final accounts slee +18468|768|65|3|9|15018.84|0.07|0.06|R|F|1994-03-20|1994-01-25|1994-03-21|NONE|TRUCK|heodolites. ideas a +18468|24|50|4|14|12936.28|0.10|0.08|A|F|1994-02-28|1994-02-16|1994-03-19|COLLECT COD|TRUCK|counts boost care +18468|714|11|5|16|25835.36|0.08|0.03|A|F|1994-03-10|1994-01-22|1994-04-05|NONE|FOB|e slyly slyly express instr +18469|678|10|1|11|17365.37|0.04|0.06|N|O|1998-09-01|1998-08-07|1998-09-16|COLLECT COD|MAIL|ar requests use alwa +18469|187|66|2|32|34789.76|0.05|0.03|N|O|1998-08-12|1998-07-31|1998-08-24|COLLECT COD|REG AIR|o beans ca +18469|97|48|3|21|20938.89|0.05|0.06|N|O|1998-07-10|1998-09-12|1998-07-31|DELIVER IN PERSON|AIR|ter the blithely ironic accounts. +18469|1689|72|4|12|19088.16|0.08|0.02|N|O|1998-07-14|1998-09-12|1998-07-22|TAKE BACK RETURN|SHIP|ely. slyly final deposits sleep q +18469|1974|63|5|38|71286.86|0.09|0.07|N|O|1998-09-20|1998-09-18|1998-09-25|TAKE BACK RETURN|REG AIR|old packages sleep +18470|379|80|1|3|3838.11|0.10|0.00|N|O|1998-06-27|1998-06-17|1998-07-19|NONE|AIR|courts dazzle among the regula +18470|1156|93|2|31|32771.65|0.05|0.02|N|O|1998-07-02|1998-05-24|1998-07-10|DELIVER IN PERSON|REG AIR|fluffily even foxes. blithely pen +18470|734|35|3|37|60485.01|0.03|0.02|N|O|1998-04-03|1998-04-30|1998-04-04|COLLECT COD|FOB|s. blithely bold packages according to +18470|1776|77|4|10|16777.70|0.01|0.01|N|O|1998-04-07|1998-06-18|1998-04-27|DELIVER IN PERSON|FOB|y along the furio +18471|1360|75|1|23|29011.28|0.10|0.06|R|F|1994-03-24|1994-05-02|1994-03-28|NONE|AIR|regular deposit +18471|1899|86|2|12|21610.68|0.02|0.06|R|F|1994-03-08|1994-05-08|1994-03-21|COLLECT COD|REG AIR|he fluffily final de +18471|963|64|3|38|70830.48|0.08|0.07|A|F|1994-05-16|1994-04-05|1994-05-27|COLLECT COD|MAIL|regular instructions. furiously re +18471|1607|49|4|41|61852.60|0.00|0.00|R|F|1994-05-11|1994-04-14|1994-06-01|COLLECT COD|MAIL|s sleep carefully. slyly final instruction +18471|337|38|5|34|42069.22|0.07|0.04|R|F|1994-03-22|1994-04-01|1994-03-30|COLLECT COD|FOB|eans. ruthlessly special theod +18471|372|1|6|14|17813.18|0.10|0.05|R|F|1994-03-09|1994-05-20|1994-03-14|NONE|FOB| beans against the ev +18496|696|97|1|47|75044.43|0.06|0.04|A|F|1994-07-24|1994-06-16|1994-08-23|COLLECT COD|MAIL|ng the bli +18496|802|36|2|19|32353.20|0.00|0.08|R|F|1994-08-20|1994-07-20|1994-09-09|DELIVER IN PERSON|FOB|y special theodolites along the +18496|350|7|3|2|2500.70|0.06|0.04|R|F|1994-07-15|1994-07-12|1994-07-23|DELIVER IN PERSON|MAIL|nal asymptotes. furiously even deposits n +18496|1426|66|4|30|39822.60|0.07|0.04|R|F|1994-08-29|1994-07-11|1994-09-06|NONE|TRUCK|ctions about t +18497|1122|23|1|11|11254.32|0.07|0.02|N|O|1997-08-26|1997-07-30|1997-09-13|NONE|TRUCK|oxes above the ironic, fi +18497|794|27|2|28|47454.12|0.01|0.01|N|O|1997-08-15|1997-07-28|1997-09-10|NONE|TRUCK|riously unusual Tiresias +18498|1274|49|1|43|50536.61|0.03|0.03|N|O|1996-12-18|1996-12-19|1996-12-23|NONE|TRUCK|nding theodolites sleep furiou +18498|188|89|2|12|13058.16|0.04|0.06|N|O|1997-02-27|1997-01-15|1997-03-05|COLLECT COD|RAIL|ake carefully furio +18498|1731|58|3|14|22858.22|0.10|0.04|N|O|1997-03-09|1997-01-18|1997-03-21|DELIVER IN PERSON|MAIL|g to the slyly sly accounts cajole packa +18498|491|79|4|15|20872.35|0.01|0.00|N|O|1997-01-12|1997-01-26|1997-01-15|TAKE BACK RETURN|AIR|al accounts are carefully. accounts sle +18498|862|62|5|4|7051.44|0.03|0.05|N|O|1996-11-21|1997-02-07|1996-11-29|NONE|TRUCK|y final requests are. +18498|29|80|6|21|19509.42|0.07|0.05|N|O|1997-01-02|1996-12-20|1997-01-17|COLLECT COD|REG AIR|ns cajole blithely express ideas. caref +18498|542|73|7|4|5770.16|0.00|0.01|N|O|1996-12-03|1997-01-16|1996-12-11|DELIVER IN PERSON|TRUCK|ave to sleep slyly regular deposits. fu +18499|576|77|1|35|51679.95|0.10|0.06|N|O|1997-09-24|1997-08-12|1997-10-11|COLLECT COD|TRUCK|x slyly. doggedly +18499|246|28|2|27|30948.48|0.02|0.08|N|O|1997-09-12|1997-08-05|1997-10-07|DELIVER IN PERSON|MAIL|al, special packages mold. regular requ +18500|746|43|1|2|3293.48|0.10|0.01|A|F|1992-03-07|1992-03-29|1992-03-17|DELIVER IN PERSON|REG AIR|its cajole fu +18500|735|68|2|45|73607.85|0.07|0.04|A|F|1992-02-14|1992-04-09|1992-03-04|DELIVER IN PERSON|REG AIR| doggedly ironic accounts. furiously final +18500|1644|86|3|7|10819.48|0.05|0.03|A|F|1992-06-07|1992-04-07|1992-06-30|TAKE BACK RETURN|AIR|he furiously busy escapades. unusual accoun +18500|1858|45|4|45|79193.25|0.05|0.05|R|F|1992-03-23|1992-03-29|1992-04-13|COLLECT COD|FOB|t packages print quickly +18500|916|19|5|5|9084.55|0.08|0.01|R|F|1992-04-07|1992-03-27|1992-04-17|DELIVER IN PERSON|TRUCK|lyly. quickly unusual fo +18501|1663|46|1|33|51633.78|0.07|0.03|N|O|1997-01-11|1997-01-27|1997-01-26|COLLECT COD|MAIL|ily ironic a +18502|223|78|1|48|53914.56|0.05|0.05|N|O|1997-04-10|1997-03-23|1997-04-23|NONE|MAIL|sts hinder blithely against the sil +18502|1517|38|2|40|56740.40|0.08|0.06|N|O|1997-03-22|1997-03-23|1997-04-18|NONE|FOB|y even pinto beans. even r +18502|312|97|3|8|9698.48|0.03|0.01|N|O|1997-04-02|1997-04-22|1997-04-05|NONE|TRUCK|deposits. accounts +18503|1709|36|1|38|61206.60|0.09|0.01|R|F|1995-05-19|1995-06-26|1995-06-16|NONE|TRUCK| requests; final pi +18503|1010|46|2|27|24597.27|0.01|0.05|N|O|1995-06-19|1995-07-29|1995-06-20|DELIVER IN PERSON|SHIP|uriously after the final +18503|889|90|3|16|28638.08|0.03|0.03|N|O|1995-06-26|1995-06-26|1995-07-10|TAKE BACK RETURN|AIR| requests sleep qu +18503|1684|26|4|18|28542.24|0.10|0.00|N|O|1995-07-06|1995-07-06|1995-07-24|TAKE BACK RETURN|SHIP| the bold frets +18503|1566|7|5|39|57234.84|0.04|0.03|N|F|1995-06-07|1995-07-18|1995-07-07|DELIVER IN PERSON|RAIL|ully pending platelets grow always abov +18503|611|43|6|50|75580.50|0.08|0.08|N|O|1995-07-03|1995-06-25|1995-07-31|COLLECT COD|FOB|en notornis? blithely +18528|890|57|1|1|1790.89|0.04|0.03|N|F|1995-06-15|1995-07-30|1995-07-11|DELIVER IN PERSON|FOB|s. express, +18528|277|59|2|30|35318.10|0.05|0.02|R|F|1995-05-30|1995-07-17|1995-06-07|COLLECT COD|FOB|the careful +18528|1811|41|3|42|71938.02|0.07|0.04|R|F|1995-05-06|1995-07-23|1995-05-21|TAKE BACK RETURN|SHIP|packages impress +18528|1669|11|4|47|73821.02|0.09|0.00|N|F|1995-06-13|1995-07-07|1995-07-04|COLLECT COD|REG AIR|ar requests sleep carefully b +18528|1773|74|5|4|6699.08|0.06|0.03|N|O|1995-07-13|1995-06-14|1995-07-31|DELIVER IN PERSON|AIR|ccounts detect furiously deposi +18528|1848|92|6|31|54245.04|0.10|0.05|N|F|1995-06-05|1995-06-07|1995-07-02|DELIVER IN PERSON|SHIP|symptotes. blithely +18529|1585|86|1|38|56490.04|0.02|0.00|N|O|1996-12-16|1996-11-11|1997-01-15|NONE|RAIL|fter the quickly pending deposits +18530|1886|30|1|35|62575.80|0.02|0.00|R|F|1995-01-18|1995-02-20|1995-02-11|TAKE BACK RETURN|TRUCK| fluffily after t +18530|1233|34|2|35|39698.05|0.01|0.07|R|F|1995-01-27|1995-02-18|1995-02-03|DELIVER IN PERSON|MAIL| the express deposits. blithely expr +18530|71|97|3|8|7768.56|0.02|0.03|R|F|1995-01-15|1995-02-18|1995-01-19|DELIVER IN PERSON|FOB|refully. blithely ironic warthogs haggle +18531|1257|69|1|46|53279.50|0.07|0.02|R|F|1992-12-13|1993-01-02|1993-01-08|NONE|TRUCK|y bold requests. fluffily ironic requ +18532|255|10|1|34|39278.50|0.04|0.00|N|O|1996-01-26|1995-12-01|1996-02-23|TAKE BACK RETURN|REG AIR|ilent, final re +18532|317|18|2|50|60865.50|0.02|0.04|N|O|1995-12-13|1996-01-08|1996-01-07|DELIVER IN PERSON|SHIP|unts haggle sl +18532|1691|92|3|44|70078.36|0.01|0.03|N|O|1995-12-02|1996-01-03|1995-12-24|COLLECT COD|SHIP|y silent packages nag caref +18532|225|7|4|32|36007.04|0.07|0.06|N|O|1996-02-01|1995-11-24|1996-02-14|NONE|AIR|y even pinto beans. pending +18532|875|9|5|4|7103.48|0.04|0.03|N|O|1996-01-09|1996-01-11|1996-01-27|NONE|SHIP|. blithely spec +18533|1468|86|1|14|19172.44|0.08|0.00|R|F|1994-12-03|1995-01-28|1994-12-07|DELIVER IN PERSON|MAIL|the fluffily +18533|1888|89|2|31|55486.28|0.01|0.06|A|F|1995-01-20|1994-12-27|1995-02-03|NONE|MAIL|y final re +18533|1390|5|3|43|55529.77|0.01|0.00|A|F|1994-11-16|1995-01-13|1994-12-05|DELIVER IN PERSON|TRUCK|sits sleep idly carefully +18534|951|54|1|45|83337.75|0.01|0.00|N|O|1996-04-03|1996-02-20|1996-05-02|TAKE BACK RETURN|RAIL|mong the carefully specia +18535|593|54|1|17|25391.03|0.06|0.00|N|O|1996-09-21|1996-10-10|1996-10-18|DELIVER IN PERSON|FOB|lithely bold excuses. pending +18535|775|72|2|32|53624.64|0.09|0.05|N|O|1996-08-14|1996-10-11|1996-09-03|TAKE BACK RETURN|TRUCK|as. carefully regular i +18560|13|14|1|44|40172.44|0.06|0.01|A|F|1993-11-09|1993-10-06|1993-11-11|DELIVER IN PERSON|AIR|riously. unusual depend +18560|1255|30|2|14|16187.50|0.08|0.08|A|F|1993-09-24|1993-11-01|1993-10-16|NONE|RAIL|egular packages nag carefully. fu +18561|1210|22|1|47|52226.87|0.04|0.03|A|F|1994-03-06|1994-04-03|1994-03-26|NONE|RAIL|ess requests cajole slyly about the sly +18561|870|70|2|32|56667.84|0.00|0.03|A|F|1994-03-30|1994-03-16|1994-04-27|COLLECT COD|MAIL|ully even packages. dependencies boost bl +18561|374|59|3|15|19115.55|0.00|0.08|A|F|1994-02-03|1994-02-22|1994-03-05|COLLECT COD|REG AIR|nto beans nag finally +18561|1579|100|4|24|35533.68|0.03|0.01|A|F|1994-02-19|1994-03-15|1994-03-21|TAKE BACK RETURN|FOB|regular accounts. ironic packag +18561|796|93|5|8|13574.32|0.01|0.04|A|F|1994-03-24|1994-03-14|1994-04-11|TAKE BACK RETURN|REG AIR|k deposits among the dogged +18561|56|7|6|29|27725.45|0.00|0.00|R|F|1994-02-16|1994-03-23|1994-02-21|COLLECT COD|RAIL| always regular pinto b +18561|11|37|7|8|7288.08|0.10|0.03|R|F|1994-04-26|1994-02-12|1994-05-20|DELIVER IN PERSON|REG AIR|nal, even pinto beans. +18562|453|83|1|7|9474.15|0.00|0.00|N|O|1996-03-17|1996-02-22|1996-03-29|DELIVER IN PERSON|TRUCK|beans. regular +18562|370|27|2|4|5081.48|0.02|0.07|N|O|1996-02-12|1996-02-08|1996-02-22|NONE|AIR|posits play blithely above the express +18562|231|13|3|2|2262.46|0.05|0.00|N|O|1996-04-17|1996-02-07|1996-05-06|DELIVER IN PERSON|AIR| slyly final theodolites. accounts believ +18562|43|44|4|27|25462.08|0.03|0.02|N|O|1996-02-23|1996-01-25|1996-03-08|TAKE BACK RETURN|FOB|iously ironic deposits de +18562|1140|41|5|13|13534.82|0.01|0.01|N|O|1995-12-25|1996-03-13|1996-01-22|COLLECT COD|AIR|ully special packages. ideas hang al +18562|163|16|6|19|20200.04|0.06|0.06|N|O|1995-12-31|1996-02-26|1996-01-10|COLLECT COD|TRUCK|xcuses among t +18562|933|2|7|1|1833.93|0.00|0.05|N|O|1996-03-21|1996-03-11|1996-03-25|COLLECT COD|MAIL|slyly above the furiously b +18563|721|54|1|18|29190.96|0.09|0.01|N|O|1996-11-18|1996-12-10|1996-12-08|NONE|SHIP|ounts must detect +18563|482|83|2|26|35944.48|0.03|0.03|N|O|1996-12-31|1996-11-03|1997-01-16|NONE|MAIL|s wake above t +18563|309|38|3|1|1209.30|0.07|0.04|N|O|1996-11-06|1996-12-22|1996-12-05|COLLECT COD|AIR| wake furiously among the ca +18563|920|21|4|49|89225.08|0.04|0.08|N|O|1997-01-04|1996-12-31|1997-02-01|NONE|MAIL|osits cajole furious +18564|1864|65|1|39|68868.54|0.01|0.03|N|O|1996-06-07|1996-06-15|1996-07-01|TAKE BACK RETURN|AIR|haggle blithely slyly ironic ideas. +18564|589|90|2|10|14895.80|0.01|0.08|N|O|1996-04-22|1996-06-16|1996-05-07|TAKE BACK RETURN|MAIL|int blithely attainmen +18564|809|10|3|33|56423.40|0.04|0.03|N|O|1996-04-02|1996-06-12|1996-04-24|NONE|MAIL|pinto bean +18564|182|61|4|47|50862.46|0.07|0.05|N|O|1996-03-25|1996-05-03|1996-04-12|COLLECT COD|SHIP|ake slyly after the +18565|87|38|1|11|10857.88|0.07|0.05|R|F|1993-01-04|1993-01-01|1993-01-26|TAKE BACK RETURN|TRUCK|dolites boost. blithely brave dinos +18565|478|8|2|37|51003.39|0.07|0.01|R|F|1993-01-09|1993-01-02|1993-02-04|COLLECT COD|SHIP|ing to the slyly regular requests. express +18566|655|18|1|23|35779.95|0.08|0.00|N|O|1996-10-26|1996-09-01|1996-11-05|COLLECT COD|AIR| beans detect around the fu +18566|1367|44|2|10|12683.60|0.07|0.01|N|O|1996-08-05|1996-10-05|1996-08-11|TAKE BACK RETURN|SHIP|deposits across the +18566|1850|51|3|46|80585.10|0.03|0.06|N|O|1996-10-13|1996-09-27|1996-11-01|TAKE BACK RETURN|AIR|above the furiously regular account +18567|1588|9|1|10|14895.80|0.10|0.06|N|O|1997-03-03|1997-04-19|1997-03-25|TAKE BACK RETURN|RAIL|ironic requests are quickly. fina +18567|328|57|2|17|20881.44|0.09|0.03|N|O|1997-05-08|1997-03-15|1997-06-03|NONE|MAIL|y stealthy dugouts promi +18567|634|28|3|3|4603.89|0.01|0.00|N|O|1997-04-09|1997-05-06|1997-04-21|COLLECT COD|MAIL|ounts against the blithely unusual dep +18567|800|33|4|14|23811.20|0.02|0.04|N|O|1997-05-30|1997-03-28|1997-06-07|NONE|FOB| slyly according to the special, regular +18567|1991|92|5|3|5678.97|0.06|0.05|N|O|1997-02-20|1997-04-14|1997-03-15|COLLECT COD|MAIL| permanently final, regular deposit +18567|938|73|6|1|1838.93|0.06|0.03|N|O|1997-03-18|1997-04-08|1997-03-23|NONE|FOB|usly final f +18592|828|95|1|38|65695.16|0.02|0.01|A|F|1992-12-15|1992-11-05|1993-01-03|TAKE BACK RETURN|REG AIR|, final pinto beans boost special foxes. +18592|998|1|2|39|74060.61|0.08|0.02|A|F|1992-11-11|1992-11-18|1992-11-14|NONE|RAIL|osits cajole slyly fl +18592|1017|18|3|10|9180.10|0.05|0.03|R|F|1992-11-07|1992-11-21|1992-12-01|COLLECT COD|RAIL|s across the deposits sleep after th +18592|1682|24|4|6|9502.08|0.10|0.00|A|F|1992-12-12|1992-12-22|1992-12-25|NONE|TRUCK| foxes detect carefully ironi +18592|52|28|5|40|38082.00|0.08|0.06|R|F|1992-11-28|1992-12-02|1992-12-22|DELIVER IN PERSON|FOB| blithely even, even acco +18592|1707|50|6|3|4826.10|0.09|0.07|A|F|1993-01-30|1992-12-22|1993-02-28|DELIVER IN PERSON|FOB|yly unusual warhorses boost quickly t +18593|1114|15|1|8|8120.88|0.10|0.08|N|O|1995-10-21|1995-12-05|1995-11-01|COLLECT COD|RAIL|unts cajole quickly c +18593|972|41|2|21|39332.37|0.08|0.06|N|O|1996-01-13|1995-10-23|1996-02-12|NONE|SHIP|of the ironic foxes are enticingly aro +18593|1149|22|3|45|47256.30|0.00|0.06|N|O|1995-11-12|1995-11-20|1995-11-29|DELIVER IN PERSON|AIR|kages cajole alongside of the special +18593|1143|16|4|37|38633.18|0.06|0.06|N|O|1996-01-17|1995-10-28|1996-02-02|COLLECT COD|SHIP|ress packages sleep enticingly exce +18593|1412|91|5|49|64357.09|0.01|0.06|N|O|1996-01-12|1995-12-08|1996-02-03|NONE|REG AIR|pendencies ar +18593|890|90|6|27|48354.03|0.05|0.01|N|O|1995-11-12|1995-11-06|1995-11-13|TAKE BACK RETURN|MAIL|y express packages dazzle careful +18594|114|67|1|50|50705.50|0.09|0.01|N|O|1998-01-29|1998-02-26|1998-02-13|TAKE BACK RETURN|AIR|roughout the express packages; special +18594|1315|16|2|34|41354.54|0.04|0.07|N|O|1998-02-04|1998-02-10|1998-02-19|NONE|MAIL|. quickly unusual packages impre +18594|1328|67|3|45|55319.40|0.02|0.04|N|O|1998-04-01|1998-02-16|1998-05-01|DELIVER IN PERSON|MAIL| special dependencies? quickly t +18595|374|59|1|25|31859.25|0.00|0.01|R|F|1994-05-20|1994-03-30|1994-06-07|NONE|SHIP|unts. slyly ironic deposits are furiously a +18595|1863|7|2|18|31767.48|0.09|0.08|R|F|1994-03-01|1994-03-03|1994-03-10|COLLECT COD|REG AIR|lets are regular, expr +18595|1301|40|3|2|2404.60|0.07|0.03|A|F|1994-05-26|1994-03-04|1994-06-03|NONE|MAIL|sits. regular acco +18595|1277|89|4|29|34169.83|0.01|0.03|A|F|1994-03-26|1994-04-27|1994-03-30|NONE|MAIL|ublate carefu +18595|1153|90|5|5|5270.75|0.08|0.04|A|F|1994-04-25|1994-04-18|1994-05-15|NONE|SHIP|lar packages; blithely regular pack +18595|615|16|6|20|30312.20|0.09|0.02|R|F|1994-02-20|1994-03-16|1994-02-24|TAKE BACK RETURN|FOB|ter the furiously pending pa +18595|1381|20|7|18|23082.84|0.04|0.05|R|F|1994-02-22|1994-04-30|1994-03-03|NONE|FOB|the carefully regular p +18596|168|47|1|24|25635.84|0.05|0.07|R|F|1992-11-04|1992-12-18|1992-11-23|TAKE BACK RETURN|MAIL|pinto beans. +18596|582|83|2|27|40029.66|0.06|0.01|A|F|1992-11-03|1992-11-13|1992-11-04|DELIVER IN PERSON|TRUCK|lar, even requests. ironic dependencies al +18596|1228|66|3|48|54202.56|0.07|0.02|A|F|1992-11-04|1992-12-17|1992-11-11|NONE|TRUCK|t furiously above the furio +18596|704|1|4|10|16047.00|0.01|0.07|A|F|1992-11-23|1992-12-10|1992-12-07|COLLECT COD|REG AIR| slyly exp +18596|949|84|5|42|77697.48|0.04|0.01|A|F|1992-10-15|1992-11-05|1992-11-06|TAKE BACK RETURN|REG AIR|requests! pending platelets sleep. furi +18596|299|54|6|10|11992.90|0.09|0.00|A|F|1992-11-03|1992-12-14|1992-12-01|COLLECT COD|AIR|ly regular foxes. r +18597|273|1|1|17|19945.59|0.05|0.00|A|F|1993-10-03|1993-12-09|1993-10-19|COLLECT COD|RAIL| quickly pending accounts. final +18597|560|21|2|34|49659.04|0.10|0.00|R|F|1993-12-29|1993-11-20|1994-01-20|DELIVER IN PERSON|SHIP|ross the closely special requests? +18597|1062|98|3|10|9630.60|0.03|0.02|R|F|1993-10-27|1993-11-27|1993-11-11|TAKE BACK RETURN|FOB|ies according to the express, +18597|1992|81|4|35|66289.65|0.01|0.04|R|F|1993-12-06|1993-11-15|1993-12-16|COLLECT COD|TRUCK|l, regular ideas. requests are. foxes caj +18597|1829|73|5|42|72694.44|0.01|0.01|R|F|1993-12-10|1993-11-19|1993-12-15|DELIVER IN PERSON|MAIL|eposits sleep blithely +18597|231|86|6|50|56561.50|0.00|0.08|A|F|1993-12-01|1993-12-24|1993-12-13|NONE|SHIP| blithely final ideas unw +18598|1570|11|1|34|50033.38|0.01|0.01|A|F|1993-12-04|1993-10-15|1993-12-09|DELIVER IN PERSON|TRUCK|ake furiously regular, furio +18598|557|18|2|9|13117.95|0.10|0.00|A|F|1993-09-30|1993-10-31|1993-10-08|NONE|RAIL|es cajole according to the +18598|605|68|3|47|70763.20|0.09|0.00|A|F|1993-10-22|1993-10-15|1993-11-10|COLLECT COD|AIR|e. even theodolites cajole acro +18598|1526|67|4|12|17130.24|0.10|0.03|A|F|1993-09-27|1993-10-14|1993-10-03|COLLECT COD|FOB|the carefull +18598|1789|32|5|3|5072.34|0.08|0.06|R|F|1993-10-14|1993-11-01|1993-10-26|DELIVER IN PERSON|MAIL|the accounts sleep +18599|265|93|1|4|4661.04|0.10|0.05|R|F|1994-06-05|1994-06-15|1994-06-06|TAKE BACK RETURN|TRUCK|e: quickly ironic dependencies abo +18599|799|64|2|1|1699.79|0.05|0.04|A|F|1994-07-16|1994-04-27|1994-08-06|TAKE BACK RETURN|TRUCK| carefully busily bold pinto beans +18599|1556|77|3|12|17490.60|0.09|0.05|R|F|1994-07-10|1994-05-10|1994-07-11|DELIVER IN PERSON|MAIL|sts nag bl +18599|1944|33|4|10|18459.40|0.00|0.01|A|F|1994-03-27|1994-05-01|1994-04-04|TAKE BACK RETURN|AIR| blithely carefully ironic foxes. +18599|808|75|5|31|52972.80|0.03|0.02|A|F|1994-07-19|1994-05-25|1994-07-30|TAKE BACK RETURN|FOB|ironic accounts x-ray doggedly aga +18599|502|33|6|41|57502.50|0.02|0.02|R|F|1994-03-27|1994-06-14|1994-04-15|DELIVER IN PERSON|FOB|s sleep about the s +18624|451|10|1|45|60815.25|0.04|0.00|N|O|1995-08-01|1995-09-06|1995-08-25|COLLECT COD|REG AIR|uriously bold requests. +18624|607|39|2|29|43720.40|0.03|0.03|N|O|1995-08-17|1995-10-05|1995-09-16|DELIVER IN PERSON|RAIL|ress pinto beans. furiously unusua +18624|1975|8|3|39|73201.83|0.05|0.02|N|O|1995-10-09|1995-10-09|1995-10-13|TAKE BACK RETURN|MAIL|orses. fluffily ironic accou +18624|755|56|4|21|34770.75|0.04|0.02|N|O|1995-08-13|1995-10-13|1995-08-30|DELIVER IN PERSON|SHIP|ies. furiously silent accounts +18624|453|83|5|19|25715.55|0.04|0.08|N|O|1995-09-22|1995-09-12|1995-10-16|TAKE BACK RETURN|MAIL|hely even deposits haggle +18625|784|85|1|7|11793.46|0.01|0.08|R|F|1992-01-26|1992-02-28|1992-02-08|NONE|RAIL|yly bold deposits int +18625|1979|24|2|47|88405.59|0.04|0.08|R|F|1992-01-29|1992-02-20|1992-02-23|DELIVER IN PERSON|AIR|bove the quickly pen +18625|575|66|3|7|10328.99|0.03|0.07|R|F|1992-03-17|1992-03-06|1992-04-06|DELIVER IN PERSON|RAIL| before the slowly unus +18625|887|21|4|26|46484.88|0.10|0.06|A|F|1992-03-08|1992-04-03|1992-03-13|DELIVER IN PERSON|REG AIR|quests integrate quickly! fur +18625|1733|60|5|10|16347.30|0.09|0.02|A|F|1992-03-08|1992-03-03|1992-03-20|COLLECT COD|REG AIR| the ironic depen +18625|467|97|6|45|61535.70|0.00|0.08|R|F|1992-03-17|1992-04-03|1992-04-04|NONE|FOB|s. blithely ironic pinto +18625|1377|78|7|32|40907.84|0.03|0.07|R|F|1992-03-20|1992-02-07|1992-04-01|COLLECT COD|AIR|ial deposits along the even acco +18626|1491|9|1|31|43167.19|0.02|0.00|R|F|1994-06-05|1994-05-06|1994-06-25|COLLECT COD|RAIL|re fluffily express packages. closely u +18626|475|34|2|32|44015.04|0.04|0.05|A|F|1994-04-01|1994-05-17|1994-04-12|NONE|RAIL|lithely bold packages! blithely ex +18626|601|64|3|35|52556.00|0.01|0.00|R|F|1994-06-12|1994-04-05|1994-06-14|DELIVER IN PERSON|TRUCK|ual instructions cajole after the b +18626|44|70|4|2|1888.08|0.10|0.08|A|F|1994-05-14|1994-03-25|1994-06-12|DELIVER IN PERSON|SHIP|ts integrate flu +18627|1195|68|1|36|39462.84|0.00|0.06|R|F|1994-03-21|1994-03-10|1994-03-30|COLLECT COD|RAIL| warthogs affix ironic instructions +18627|771|72|2|48|80244.96|0.00|0.03|A|F|1994-04-08|1994-03-19|1994-04-12|COLLECT COD|REG AIR|es wake ideas. qu +18627|1884|14|3|12|21430.56|0.07|0.04|R|F|1994-02-11|1994-01-28|1994-03-05|TAKE BACK RETURN|TRUCK| unusual idea +18628|1054|55|1|30|28651.50|0.01|0.08|A|F|1992-10-01|1992-10-23|1992-10-18|DELIVER IN PERSON|SHIP|tes. fluffily special asymptotes need to +18629|687|19|1|36|57156.48|0.07|0.06|A|F|1994-12-18|1994-12-11|1994-12-22|DELIVER IN PERSON|SHIP|slow requests. furiously even i +18629|84|85|2|48|47235.84|0.08|0.08|A|F|1994-11-16|1995-01-25|1994-11-28|COLLECT COD|FOB|around the silently even ideas. d +18629|1778|21|3|2|3359.54|0.06|0.05|R|F|1995-02-27|1994-12-08|1995-03-11|COLLECT COD|FOB| cajole quietly. blithely final depos +18629|813|47|4|24|41131.44|0.02|0.07|R|F|1995-02-05|1995-01-19|1995-02-14|TAKE BACK RETURN|REG AIR|er the pinto beans. ev +18629|1271|9|5|4|4689.08|0.03|0.00|R|F|1994-11-04|1995-01-27|1994-11-29|COLLECT COD|AIR|pths wake acros +18630|1495|74|1|1|1396.49|0.01|0.01|N|O|1997-12-23|1998-03-03|1998-01-11|NONE|AIR|urts cajole about the f +18630|1019|55|2|34|31280.34|0.10|0.05|N|O|1998-02-12|1998-01-30|1998-02-25|TAKE BACK RETURN|TRUCK|ar theodolites are +18630|429|59|3|9|11964.78|0.07|0.05|N|O|1998-03-26|1998-03-07|1998-04-05|NONE|MAIL|out the furiously permanen +18631|311|96|1|19|23014.89|0.02|0.03|N|O|1995-10-06|1995-12-12|1995-10-30|NONE|AIR|es are carefully bold foxes. regula +18656|962|65|1|37|68929.52|0.04|0.06|N|O|1998-09-28|1998-08-12|1998-10-14|COLLECT COD|FOB|ymptotes. slyly bold sentiments are. silent +18656|829|96|2|19|32866.58|0.07|0.07|N|O|1998-08-15|1998-09-27|1998-09-05|DELIVER IN PERSON|SHIP|ounts. fluffily pending asym +18657|1750|93|1|24|39642.00|0.03|0.05|N|O|1997-05-04|1997-05-11|1997-05-24|DELIVER IN PERSON|AIR| even frets after the +18657|1483|23|2|50|69224.00|0.05|0.08|N|O|1997-06-09|1997-04-02|1997-06-14|DELIVER IN PERSON|AIR|hely silent deposits doubt a +18657|1119|56|3|25|25502.75|0.09|0.04|N|O|1997-03-09|1997-03-17|1997-03-13|TAKE BACK RETURN|SHIP|ges wake quickly quickly even ex +18657|1211|23|4|20|22244.20|0.08|0.04|N|O|1997-05-19|1997-04-23|1997-06-13|NONE|SHIP|posits. regular theodol +18657|692|93|5|43|68485.67|0.04|0.01|N|O|1997-04-08|1997-04-17|1997-04-13|DELIVER IN PERSON|TRUCK|ets. fluffily +18657|884|18|6|1|1784.88|0.10|0.05|N|O|1997-02-27|1997-03-20|1997-03-17|DELIVER IN PERSON|AIR|ithely regular dependencies na +18658|91|67|1|21|20812.89|0.05|0.04|N|O|1997-05-15|1997-06-13|1997-05-24|TAKE BACK RETURN|MAIL|he permanently final dependencies. re +18658|131|10|2|39|40214.07|0.01|0.05|N|O|1997-06-18|1997-07-17|1997-06-23|TAKE BACK RETURN|AIR|n excuses. quick, final requests cajo +18658|314|43|3|16|19428.96|0.06|0.03|N|O|1997-07-04|1997-07-05|1997-07-08|NONE|TRUCK| even asympto +18658|451|81|4|40|54058.00|0.00|0.00|N|O|1997-07-02|1997-06-29|1997-07-04|COLLECT COD|RAIL|otornis nag +18658|330|59|5|23|28297.59|0.09|0.07|N|O|1997-06-07|1997-07-12|1997-06-19|COLLECT COD|MAIL| cajole carefully above the +18658|286|87|6|36|42706.08|0.00|0.05|N|O|1997-06-16|1997-07-01|1997-06-17|COLLECT COD|SHIP|slyly at the carefully regular accounts. d +18658|1352|67|7|12|15040.20|0.08|0.02|N|O|1997-06-20|1997-07-08|1997-07-05|TAKE BACK RETURN|AIR| special plate +18659|339|68|1|40|49573.20|0.03|0.00|N|O|1996-05-17|1996-04-24|1996-05-18|COLLECT COD|REG AIR|ily final foxes cajole carefull +18659|874|74|2|23|40822.01|0.10|0.01|N|O|1996-05-13|1996-04-29|1996-06-07|NONE|MAIL|unusual ideas. slyly final a +18659|932|67|3|44|80648.92|0.09|0.05|N|O|1996-03-14|1996-05-13|1996-03-28|TAKE BACK RETURN|RAIL| regular accounts: blithely ironic +18660|1336|75|1|37|45781.21|0.10|0.08|N|O|1998-02-07|1998-04-06|1998-02-16|TAKE BACK RETURN|RAIL|c requests about the carefully fi +18660|1545|86|2|42|60754.68|0.10|0.07|N|O|1998-02-22|1998-04-14|1998-03-01|DELIVER IN PERSON|AIR|ithely regular i +18660|907|8|3|28|50621.20|0.00|0.06|N|O|1998-04-17|1998-03-18|1998-05-17|TAKE BACK RETURN|SHIP|to the special, +18660|1983|84|4|18|33929.64|0.06|0.04|N|O|1998-04-11|1998-04-13|1998-04-23|TAKE BACK RETURN|MAIL|instructions are. +18660|98|74|5|30|29942.70|0.08|0.00|N|O|1998-04-14|1998-04-25|1998-04-27|DELIVER IN PERSON|AIR|nusual theodolites +18660|900|100|6|25|45022.50|0.03|0.02|N|O|1998-05-11|1998-03-31|1998-05-14|NONE|TRUCK|c packages +18661|1029|35|1|4|3720.08|0.06|0.08|A|F|1992-09-15|1992-10-22|1992-10-03|NONE|TRUCK|ul ideas hang. ironic theodo +18661|230|12|2|8|9041.84|0.09|0.00|A|F|1992-11-03|1992-12-05|1992-11-30|TAKE BACK RETURN|FOB|slyly after the ironic th +18661|507|38|3|3|4222.50|0.09|0.03|A|F|1992-11-01|1992-11-25|1992-11-18|DELIVER IN PERSON|FOB|theodolites boost slyly beside +18662|326|11|1|34|41694.88|0.02|0.00|N|O|1996-05-22|1996-05-17|1996-06-18|NONE|FOB|to the carefully even packages. +18663|143|22|1|12|12517.68|0.05|0.01|N|O|1995-09-03|1995-08-26|1995-09-25|TAKE BACK RETURN|FOB|y blithe, even requests! regular, +18663|1980|81|2|4|7527.92|0.10|0.03|N|O|1995-11-03|1995-10-03|1995-11-11|COLLECT COD|REG AIR|long the furiously unusual pi +18663|86|87|3|36|35498.88|0.07|0.05|N|O|1995-07-31|1995-08-18|1995-08-04|COLLECT COD|SHIP|y pending ideas cajole carefully carefu +18663|643|75|4|43|66376.52|0.00|0.07|N|O|1995-08-13|1995-08-26|1995-08-16|DELIVER IN PERSON|TRUCK|ly furiously special requests: even, +18663|559|90|5|30|43786.50|0.07|0.00|N|O|1995-09-02|1995-08-25|1995-09-23|TAKE BACK RETURN|SHIP|instructions wake furiously fluffily +18663|344|1|6|25|31108.50|0.01|0.05|N|O|1995-08-19|1995-09-23|1995-08-26|TAKE BACK RETURN|TRUCK|deposits. slyly bold pinto beans wake fu +18663|607|70|7|24|36182.40|0.04|0.07|N|O|1995-08-06|1995-09-12|1995-08-09|COLLECT COD|SHIP|blithely regular +18688|815|49|1|41|70348.21|0.07|0.05|R|F|1995-03-08|1995-04-20|1995-03-10|DELIVER IN PERSON|MAIL| furiously sly frays ac +18688|868|2|2|48|84905.28|0.05|0.01|A|F|1995-03-29|1995-04-28|1995-04-14|TAKE BACK RETURN|MAIL|s after the even, ironic +18688|1568|9|3|10|14695.60|0.06|0.00|N|O|1995-06-25|1995-04-12|1995-07-23|DELIVER IN PERSON|FOB|ly. slyly ironic packages +18688|1232|44|4|15|16998.45|0.10|0.01|A|F|1995-03-27|1995-05-20|1995-04-22|DELIVER IN PERSON|REG AIR|special asym +18688|1229|67|5|20|22604.40|0.00|0.04|A|F|1995-03-15|1995-04-11|1995-03-21|COLLECT COD|TRUCK|ts cajole quickly. slyly ironic fox +18688|1968|1|6|28|52358.88|0.07|0.04|R|F|1995-05-18|1995-04-08|1995-06-15|TAKE BACK RETURN|MAIL| furiously ironic packages. fluffi +18688|1043|79|7|20|18880.80|0.00|0.03|R|F|1995-05-21|1995-05-04|1995-06-12|TAKE BACK RETURN|AIR|rding to the fluffily sile +18689|27|28|1|35|32445.70|0.03|0.00|R|F|1995-02-14|1995-03-10|1995-03-14|COLLECT COD|FOB|nstructions. quickly final foxes are care +18689|633|27|2|35|53677.05|0.08|0.06|R|F|1994-12-30|1995-01-29|1995-01-25|COLLECT COD|MAIL|y bold accounts. blithel +18689|199|26|3|40|43967.60|0.08|0.03|A|F|1994-12-28|1995-03-01|1995-01-07|TAKE BACK RETURN|TRUCK|es sublate around the furio +18689|1230|5|4|40|45249.20|0.04|0.06|R|F|1995-02-28|1995-03-18|1995-03-12|NONE|AIR|lent courts sleep blit +18689|1589|10|5|38|56642.04|0.07|0.05|R|F|1995-03-06|1995-02-06|1995-03-20|TAKE BACK RETURN|TRUCK|es breach slyly across the foxes. un +18689|215|70|6|31|34571.51|0.07|0.03|A|F|1994-12-28|1995-02-08|1995-01-25|COLLECT COD|FOB|fix blithel +18690|1826|13|1|36|62201.52|0.03|0.07|N|O|1997-10-06|1997-11-06|1997-10-31|TAKE BACK RETURN|AIR|ully above the +18690|1093|99|2|9|8946.81|0.10|0.00|N|O|1997-11-18|1997-11-03|1997-11-20|COLLECT COD|AIR|w, ironic ideas. blithe +18690|903|4|3|24|43293.60|0.01|0.05|N|O|1998-01-19|1997-11-14|1998-02-09|COLLECT COD|FOB|es haggle furiously. fluffily even packa +18690|1201|13|4|28|30861.60|0.07|0.08|N|O|1998-01-28|1997-12-03|1998-02-19|DELIVER IN PERSON|FOB|cajole slyly special foxes. furiously c +18690|1629|12|5|27|41326.74|0.09|0.08|N|O|1997-11-17|1997-12-20|1997-11-22|NONE|RAIL|ickly among the quickly pe +18690|1356|33|6|39|49036.65|0.08|0.02|N|O|1997-11-24|1997-11-01|1997-12-10|TAKE BACK RETURN|RAIL|ke furiously. sp +18690|1967|56|7|18|33641.28|0.09|0.05|N|O|1998-01-26|1997-12-24|1998-02-25|COLLECT COD|FOB|ickly even requests. even depe +18691|1390|91|1|17|21953.63|0.05|0.06|N|O|1996-12-21|1997-02-18|1997-01-05|DELIVER IN PERSON|SHIP|ns. silent pac +18691|137|16|2|29|30076.77|0.02|0.02|N|O|1997-03-25|1997-02-27|1997-04-10|NONE|TRUCK| ironic deposits sleep quickly +18691|1311|50|3|38|46067.78|0.01|0.01|N|O|1997-01-04|1997-02-06|1997-01-07|TAKE BACK RETURN|MAIL|eodolites boost abo +18691|1220|32|4|20|22424.40|0.05|0.00|N|O|1997-01-02|1997-03-05|1997-01-12|NONE|FOB|ts haggle. caref +18691|976|79|5|34|63816.98|0.08|0.08|N|O|1997-04-07|1997-01-30|1997-04-21|TAKE BACK RETURN|REG AIR| haggle. carefully regula +18692|711|44|1|43|69303.53|0.07|0.07|N|O|1996-09-07|1996-08-27|1996-09-22|COLLECT COD|RAIL|nusual dinos over +18692|1017|53|2|39|35802.39|0.04|0.01|N|O|1996-06-11|1996-08-31|1996-06-28|COLLECT COD|REG AIR|endencies. furiously bold f +18692|1453|54|3|10|13544.50|0.02|0.08|N|O|1996-07-02|1996-07-07|1996-07-30|DELIVER IN PERSON|FOB|cial accounts. furiously final pinto be +18692|493|81|4|2|2786.98|0.09|0.00|N|O|1996-08-28|1996-07-21|1996-08-31|DELIVER IN PERSON|FOB| cajole quickly. qu +18693|1617|18|1|3|4555.83|0.00|0.07|N|O|1996-10-16|1996-10-05|1996-11-14|COLLECT COD|REG AIR|above the foxes. +18693|973|74|2|33|61841.01|0.00|0.00|N|O|1996-11-17|1996-09-08|1996-11-21|TAKE BACK RETURN|AIR|sly even accounts. carefully even th +18693|732|65|3|47|76738.31|0.01|0.07|N|O|1996-07-30|1996-09-08|1996-08-29|DELIVER IN PERSON|TRUCK|quests. qu +18693|1444|62|4|23|30945.12|0.03|0.07|N|O|1996-10-22|1996-09-17|1996-10-31|NONE|AIR|theodolites. quickly ca +18693|1157|66|5|9|9523.35|0.03|0.01|N|O|1996-09-13|1996-10-12|1996-10-06|NONE|REG AIR| carefully even accounts are slyly sl +18694|530|91|1|6|8583.18|0.03|0.06|N|O|1998-07-24|1998-08-06|1998-07-31|COLLECT COD|MAIL|l theodolites hagg +18694|1321|60|2|1|1222.32|0.00|0.02|N|O|1998-07-13|1998-06-24|1998-07-16|DELIVER IN PERSON|RAIL|ly. slyly express t +18694|461|49|3|50|68073.00|0.07|0.01|N|O|1998-08-31|1998-08-16|1998-09-16|TAKE BACK RETURN|AIR| above the carefully even instru +18695|1869|56|1|44|77917.84|0.02|0.07|N|O|1996-12-22|1996-11-13|1996-12-30|DELIVER IN PERSON|RAIL|ess instructions against the excuse +18720|876|10|1|44|78182.28|0.08|0.08|N|O|1996-05-07|1996-04-26|1996-05-19|COLLECT COD|MAIL|s detect slyly si +18720|1745|30|2|32|52695.68|0.03|0.07|N|O|1996-05-11|1996-05-17|1996-05-27|DELIVER IN PERSON|SHIP|ites hinder blithely. pending, spec +18720|111|12|3|15|15166.65|0.10|0.07|N|O|1996-03-23|1996-04-25|1996-04-13|DELIVER IN PERSON|REG AIR|ctions wake ca +18720|621|53|4|40|60864.80|0.06|0.06|N|O|1996-06-18|1996-05-16|1996-07-10|COLLECT COD|FOB|ickly about the requests. pending foxes +18720|928|29|5|16|29262.72|0.00|0.04|N|O|1996-03-10|1996-04-07|1996-03-29|TAKE BACK RETURN|MAIL| courts. furiou +18720|785|82|6|8|13486.24|0.09|0.02|N|O|1996-05-30|1996-04-05|1996-06-25|DELIVER IN PERSON|FOB|ully unusual req +18720|633|65|7|34|52143.42|0.01|0.02|N|O|1996-04-01|1996-04-09|1996-04-05|TAKE BACK RETURN|RAIL| cajole special, ironic pack +18721|212|13|1|10|11122.10|0.07|0.07|A|F|1993-10-05|1993-08-25|1993-10-14|DELIVER IN PERSON|MAIL|ent accounts breach furiously final, +18722|142|69|1|6|6252.84|0.00|0.05|R|F|1993-09-25|1993-09-06|1993-09-27|TAKE BACK RETURN|REG AIR|ave somas use. slyly ironi +18722|1855|42|2|17|29866.45|0.05|0.05|R|F|1993-10-28|1993-08-22|1993-11-24|NONE|FOB|ans. regular packages use furio +18722|582|73|3|35|51890.30|0.02|0.00|R|F|1993-10-30|1993-09-30|1993-10-31|TAKE BACK RETURN|SHIP|eep furiously fluffily final deposits; q +18723|1939|72|1|15|27613.95|0.03|0.07|R|F|1994-09-10|1994-10-08|1994-10-05|TAKE BACK RETURN|SHIP| the quick +18723|965|68|2|32|59710.72|0.06|0.01|A|F|1994-08-24|1994-10-19|1994-09-09|COLLECT COD|RAIL|ffily unusual deposits cajo +18723|546|7|3|2|2893.08|0.07|0.01|A|F|1994-08-31|1994-10-15|1994-09-30|NONE|MAIL| slyly ironic pla +18723|538|39|4|17|24455.01|0.09|0.05|R|F|1994-11-26|1994-11-06|1994-11-28|DELIVER IN PERSON|TRUCK|ges cajole a +18723|543|44|5|46|66402.84|0.08|0.04|R|F|1994-10-09|1994-10-22|1994-10-19|NONE|MAIL|lites. furiously p +18723|989|58|6|9|17009.82|0.09|0.00|A|F|1994-09-12|1994-10-27|1994-09-24|COLLECT COD|RAIL|arefully q +18723|1491|31|7|1|1392.49|0.01|0.06|A|F|1994-10-07|1994-09-20|1994-11-03|NONE|TRUCK|unts wake regular packages. pinto beans ab +18724|1729|56|1|18|29352.96|0.07|0.07|A|F|1993-05-09|1993-05-02|1993-05-30|DELIVER IN PERSON|FOB|kages. furiously unusu +18724|219|74|2|3|3357.63|0.08|0.01|R|F|1993-05-19|1993-05-01|1993-06-11|TAKE BACK RETURN|FOB|leep deposits. sly +18724|815|16|3|35|60053.35|0.02|0.07|A|F|1993-02-27|1993-03-30|1993-03-06|COLLECT COD|TRUCK|to beans wake furiously +18725|460|90|1|49|66662.54|0.03|0.01|A|F|1993-02-21|1993-01-18|1993-03-07|DELIVER IN PERSON|MAIL|g the stealthily +18725|713|10|2|3|4841.13|0.10|0.06|R|F|1992-12-08|1993-02-12|1993-01-05|COLLECT COD|RAIL|s boost. blithe pearls +18725|435|36|3|36|48075.48|0.10|0.02|R|F|1993-03-06|1993-01-02|1993-03-14|COLLECT COD|REG AIR|e above the +18726|1984|17|1|38|71667.24|0.05|0.08|R|F|1995-01-18|1994-12-23|1995-02-07|DELIVER IN PERSON|FOB|egular reques +18726|1842|86|2|23|40108.32|0.03|0.00|R|F|1994-10-08|1994-12-20|1994-10-27|COLLECT COD|REG AIR|ut the sly +18726|1307|8|3|14|16916.20|0.08|0.01|R|F|1994-10-28|1994-11-22|1994-11-15|DELIVER IN PERSON|MAIL|nstructions wake quick +18726|1620|3|4|10|15216.20|0.04|0.03|A|F|1994-10-01|1994-11-20|1994-10-24|COLLECT COD|FOB| regular accounts cajole fluffily +18726|1759|44|5|37|61447.75|0.08|0.05|R|F|1995-01-11|1994-11-08|1995-01-18|NONE|RAIL|usly final deposits. platelets about the sl +18727|348|5|1|43|53678.62|0.05|0.03|N|O|1997-06-01|1997-04-14|1997-06-08|COLLECT COD|AIR|ake carefully above the bold req +18727|634|97|2|14|21484.82|0.02|0.06|N|O|1997-03-29|1997-03-09|1997-04-03|DELIVER IN PERSON|MAIL| above the slyly +18727|1244|82|3|27|30921.48|0.07|0.04|N|O|1997-03-17|1997-04-03|1997-03-23|DELIVER IN PERSON|RAIL|usly regular deposits at the +18752|1140|13|1|24|24987.36|0.07|0.00|N|O|1995-06-25|1995-07-12|1995-07-14|TAKE BACK RETURN|FOB|ect furiously across the sl +18753|1219|57|1|40|44808.40|0.03|0.05|A|F|1994-10-24|1994-10-11|1994-11-04|NONE|AIR|carefully across the special e +18753|1034|70|2|27|25245.81|0.01|0.03|A|F|1994-11-02|1994-09-10|1994-11-26|COLLECT COD|AIR| cajole after the inst +18753|422|10|3|42|55541.64|0.09|0.03|A|F|1994-09-19|1994-10-23|1994-10-14|NONE|REG AIR|counts use busily a +18753|1892|93|4|23|41259.47|0.09|0.00|A|F|1994-11-23|1994-09-17|1994-12-22|NONE|FOB|s haggle carefully around the furiously un +18753|798|95|5|20|33975.80|0.05|0.01|R|F|1994-11-07|1994-10-07|1994-12-05|TAKE BACK RETURN|SHIP| the blithely bold pack +18753|40|91|6|27|25381.08|0.09|0.05|R|F|1994-10-29|1994-09-02|1994-11-18|COLLECT COD|SHIP| even packages. special accounts +18754|1010|81|1|8|7288.08|0.01|0.04|A|F|1994-10-16|1994-11-17|1994-11-03|TAKE BACK RETURN|TRUCK| about the theodolites. depos +18754|1236|74|2|9|10235.07|0.01|0.01|A|F|1994-12-04|1994-11-19|1994-12-07|NONE|FOB|y express accounts. blith +18754|906|75|3|20|36138.00|0.07|0.00|R|F|1994-11-11|1994-11-27|1994-11-25|DELIVER IN PERSON|REG AIR| even accounts +18754|296|24|4|47|56225.63|0.04|0.00|A|F|1994-11-27|1994-10-31|1994-12-27|COLLECT COD|SHIP|. slyly bold theodolites sleep furiou +18754|846|80|5|35|61139.40|0.01|0.07|R|F|1995-01-15|1994-12-25|1995-01-20|NONE|RAIL|yly special deposits? slyl +18754|163|42|6|41|43589.56|0.06|0.00|A|F|1995-01-22|1994-10-30|1995-02-04|TAKE BACK RETURN|REG AIR|riously according +18754|69|70|7|38|36824.28|0.04|0.02|R|F|1994-10-11|1994-11-14|1994-10-17|DELIVER IN PERSON|MAIL|y across the quickly regular acco +18755|879|46|1|20|35597.40|0.04|0.01|N|O|1997-06-08|1997-04-13|1997-07-08|DELIVER IN PERSON|FOB|ents haggle about the s +18755|1989|22|2|15|28364.70|0.05|0.08|N|O|1997-03-01|1997-03-30|1997-03-11|DELIVER IN PERSON|FOB|fily-- spec +18755|641|73|3|33|50874.12|0.02|0.03|N|O|1997-05-22|1997-04-27|1997-05-26|NONE|AIR|old attainments. quickly bold packag +18756|701|66|1|8|12813.60|0.09|0.01|A|F|1992-07-13|1992-06-27|1992-07-24|DELIVER IN PERSON|RAIL|ld deposits haggle slyly across th +18757|466|67|1|38|51925.48|0.00|0.01|R|F|1992-06-12|1992-07-12|1992-07-12|TAKE BACK RETURN|MAIL|inal packages wake against the final, r +18757|1479|58|2|24|33131.28|0.02|0.02|A|F|1992-07-22|1992-07-09|1992-08-17|DELIVER IN PERSON|FOB|excuses. regular, regular foxes w +18757|1457|36|3|31|42111.95|0.03|0.01|R|F|1992-08-23|1992-07-24|1992-09-07|NONE|MAIL|symptotes affix b +18757|579|80|4|13|19234.41|0.08|0.00|A|F|1992-06-01|1992-07-25|1992-06-03|NONE|MAIL|eposits boost even theodolites +18757|1554|95|5|2|2911.10|0.07|0.04|R|F|1992-09-13|1992-07-18|1992-10-09|DELIVER IN PERSON|REG AIR|fully into the packages-- carefully +18757|74|75|6|4|3896.28|0.02|0.06|A|F|1992-09-15|1992-07-14|1992-09-19|COLLECT COD|RAIL|, unusual deposits use car +18758|796|61|1|7|11877.53|0.02|0.04|A|F|1993-06-15|1993-07-13|1993-07-15|COLLECT COD|AIR|yly bold escapades detect. sil +18758|650|44|2|24|37215.60|0.02|0.04|A|F|1993-07-05|1993-07-20|1993-07-12|DELIVER IN PERSON|TRUCK|unts. ruthl +18758|512|3|3|40|56500.40|0.00|0.06|A|F|1993-06-26|1993-07-14|1993-07-13|DELIVER IN PERSON|SHIP|g the final, final request +18759|1881|11|1|12|21394.56|0.04|0.04|N|O|1996-07-25|1996-07-14|1996-07-29|DELIVER IN PERSON|RAIL|deas sleep p +18784|594|85|1|41|61278.19|0.09|0.05|A|F|1992-10-16|1992-11-03|1992-11-03|TAKE BACK RETURN|AIR|s use at the slyly pendin +18785|1710|11|1|36|58021.56|0.01|0.07|A|F|1994-08-11|1994-09-20|1994-09-05|NONE|SHIP|ully according to +18785|93|94|2|44|43695.96|0.10|0.02|R|F|1994-10-25|1994-09-07|1994-11-22|COLLECT COD|AIR| above the quickly even +18786|1799|100|1|19|32315.01|0.07|0.04|N|O|1997-04-29|1997-05-21|1997-05-29|COLLECT COD|RAIL|ng the regular excuses integr +18786|831|65|2|46|79664.18|0.08|0.07|N|O|1997-06-27|1997-05-15|1997-07-27|NONE|MAIL|ding requests. iro +18786|1986|87|3|3|5663.94|0.10|0.03|N|O|1997-05-23|1997-06-05|1997-06-02|NONE|REG AIR| ironic foxes! furiously even fo +18786|746|79|4|38|62576.12|0.10|0.07|N|O|1997-07-15|1997-05-26|1997-08-01|DELIVER IN PERSON|SHIP|. final courts nod carefully along +18786|1050|51|5|26|24727.30|0.08|0.03|N|O|1997-04-04|1997-05-24|1997-04-20|DELIVER IN PERSON|FOB|l foxes wake +18786|722|87|6|13|21095.36|0.05|0.01|N|O|1997-06-03|1997-06-21|1997-06-28|COLLECT COD|MAIL|ular accounts l +18787|1154|27|1|16|16882.40|0.09|0.05|A|F|1995-02-13|1995-01-15|1995-02-14|COLLECT COD|TRUCK|ong the closely express dependenc +18787|710|75|2|15|24160.65|0.05|0.08|R|F|1994-12-03|1994-11-26|1994-12-22|DELIVER IN PERSON|AIR|sts sleep carefully. car +18787|1251|63|3|50|57612.50|0.09|0.08|R|F|1995-01-13|1994-12-23|1995-02-05|COLLECT COD|SHIP|ily expres +18787|1213|14|4|37|41225.77|0.01|0.05|R|F|1995-01-25|1995-01-09|1995-02-05|NONE|AIR|gly along the fur +18788|1461|40|1|18|24524.28|0.02|0.03|R|F|1994-11-28|1994-11-10|1994-11-29|NONE|MAIL|ly theodolites. regular deposits can a +18788|981|16|2|23|43285.54|0.00|0.07|R|F|1994-11-04|1994-12-02|1994-11-05|DELIVER IN PERSON|FOB|Tiresias haggle +18788|1563|84|3|42|61511.52|0.10|0.00|A|F|1994-11-06|1994-11-14|1994-11-09|TAKE BACK RETURN|TRUCK|oss the dependencies boo +18788|61|37|4|37|35559.22|0.06|0.08|R|F|1995-01-31|1994-12-21|1995-02-22|COLLECT COD|SHIP|ial epitaphs doze above the +18789|1889|33|1|48|85962.24|0.03|0.04|R|F|1995-03-18|1995-05-08|1995-03-31|DELIVER IN PERSON|TRUCK|nts. busily regular requests boo +18789|687|81|2|32|50805.76|0.04|0.04|N|F|1995-06-02|1995-04-22|1995-06-25|NONE|TRUCK|furiously final war +18789|356|57|3|38|47741.30|0.02|0.05|R|F|1995-05-08|1995-06-08|1995-05-27|DELIVER IN PERSON|AIR|s. ironic id +18789|1404|22|4|19|24802.60|0.07|0.02|A|F|1995-06-01|1995-05-21|1995-06-13|DELIVER IN PERSON|SHIP|ructions serv +18789|235|90|5|34|38597.82|0.08|0.00|N|O|1995-07-10|1995-05-31|1995-07-14|DELIVER IN PERSON|TRUCK|arefully quickly bold accou +18789|238|93|6|6|6829.38|0.00|0.05|A|F|1995-05-26|1995-05-04|1995-05-29|DELIVER IN PERSON|FOB|ts. accoun +18790|400|29|1|1|1300.40|0.07|0.01|A|F|1994-06-02|1994-04-16|1994-06-29|COLLECT COD|SHIP|ess packages de +18790|528|59|2|43|61426.36|0.01|0.00|A|F|1994-02-17|1994-05-13|1994-03-12|TAKE BACK RETURN|TRUCK|s! blithely pending +18790|1505|26|3|7|9845.50|0.05|0.04|R|F|1994-04-28|1994-04-26|1994-05-14|COLLECT COD|FOB|lites. closel +18790|148|49|4|1|1048.14|0.01|0.06|A|F|1994-03-30|1994-03-17|1994-04-18|COLLECT COD|SHIP|st furiously. slyly regular packa +18791|108|35|1|39|39315.90|0.04|0.00|A|F|1993-11-22|1993-10-18|1993-12-19|TAKE BACK RETURN|FOB|slyly special theodolites. fox +18816|1477|78|1|37|51003.39|0.06|0.02|A|F|1994-03-08|1994-04-28|1994-03-09|NONE|TRUCK|ckly final pin +18816|560|61|2|9|13145.04|0.03|0.01|R|F|1994-04-29|1994-04-26|1994-05-13|COLLECT COD|MAIL|as about the blithely permanent deposit +18816|415|74|3|44|57878.04|0.07|0.02|A|F|1994-04-25|1994-05-10|1994-04-27|DELIVER IN PERSON|SHIP|ronic foxes according to the quickly +18816|447|6|4|33|44465.52|0.02|0.01|R|F|1994-05-18|1994-04-08|1994-05-28|COLLECT COD|SHIP|ily pending packages detect +18816|381|38|5|43|55099.34|0.04|0.04|A|F|1994-03-30|1994-04-03|1994-04-26|NONE|FOB|. final, reg +18816|1038|9|6|45|42256.35|0.00|0.02|R|F|1994-05-28|1994-03-27|1994-06-20|NONE|SHIP|gainst the deposits +18816|291|92|7|3|3573.87|0.02|0.05|A|F|1994-04-07|1994-04-28|1994-04-22|DELIVER IN PERSON|SHIP| requests caj +18817|25|26|1|2|1850.04|0.02|0.05|N|O|1997-01-22|1997-01-10|1997-02-20|NONE|AIR|are furiously regular pinto beans. care +18817|908|43|2|26|47031.40|0.08|0.00|N|O|1996-12-09|1997-02-04|1997-01-03|TAKE BACK RETURN|AIR|ructions l +18817|70|71|3|8|7760.56|0.01|0.07|N|O|1997-02-19|1997-01-27|1997-02-26|COLLECT COD|MAIL|fter the pending packages. slyly sp +18817|1299|74|4|48|57613.92|0.09|0.07|N|O|1997-01-21|1996-12-29|1997-01-30|TAKE BACK RETURN|FOB|courts. dolphins cajole final, express d +18817|1381|82|5|21|26929.98|0.10|0.02|N|O|1997-01-16|1997-02-11|1997-01-30|DELIVER IN PERSON|REG AIR|e carefully regul +18818|50|76|1|17|16150.85|0.07|0.02|N|O|1997-12-16|1997-12-03|1997-12-24|NONE|REG AIR|al packages into the quickly ironic +18818|377|62|2|25|31934.25|0.03|0.05|N|O|1997-12-06|1997-11-22|1998-01-05|TAKE BACK RETURN|MAIL|osits doze above the +18818|1348|25|3|4|4997.36|0.03|0.02|N|O|1997-10-06|1997-11-08|1997-10-23|NONE|MAIL|riously final deposi +18818|332|89|4|9|11090.97|0.02|0.06|N|O|1997-11-02|1997-10-28|1997-11-22|NONE|RAIL|ly. requests +18818|177|78|5|10|10771.70|0.02|0.04|N|O|1997-11-25|1997-10-30|1997-11-29|NONE|RAIL|ular requests nag carefully. furiously spec +18818|16|17|6|14|12824.14|0.09|0.01|N|O|1997-12-07|1997-11-30|1997-12-16|TAKE BACK RETURN|TRUCK|eposits. bli +18819|1934|79|1|48|88124.64|0.06|0.01|R|F|1994-06-23|1994-04-22|1994-07-05|DELIVER IN PERSON|MAIL| furiously e +18819|867|1|2|43|76017.98|0.02|0.00|A|F|1994-06-25|1994-03-31|1994-07-18|DELIVER IN PERSON|MAIL|sts integrate silently above the qui +18819|1608|32|3|19|28682.40|0.09|0.05|R|F|1994-04-05|1994-05-16|1994-04-09|NONE|RAIL|lithely ironic pack +18819|167|68|4|32|34149.12|0.07|0.02|R|F|1994-06-03|1994-04-29|1994-06-05|COLLECT COD|TRUCK|ake blithely somas. car +18819|1964|9|5|30|55978.80|0.03|0.00|A|F|1994-06-10|1994-04-16|1994-07-08|COLLECT COD|SHIP|ounts. slyly bol +18819|513|4|6|36|50886.36|0.07|0.02|A|F|1994-05-18|1994-04-28|1994-05-27|DELIVER IN PERSON|MAIL|ckly bold r +18820|1127|100|1|27|27759.24|0.07|0.03|R|F|1995-03-23|1995-04-11|1995-04-05|COLLECT COD|AIR|ily ironic requests. blithely pendin +18820|1959|4|2|2|3721.90|0.07|0.08|A|F|1995-05-08|1995-04-04|1995-05-18|DELIVER IN PERSON|MAIL|lyly across the blithely express pi +18820|1748|49|3|37|61040.38|0.00|0.06|R|F|1995-04-07|1995-04-13|1995-04-24|COLLECT COD|SHIP|e quickly bold foxes. packages above the re +18820|448|7|4|44|59331.36|0.10|0.02|A|F|1995-04-24|1995-04-09|1995-05-13|NONE|TRUCK|r requests are b +18820|407|37|5|13|16996.20|0.07|0.08|R|F|1995-06-02|1995-03-25|1995-06-03|DELIVER IN PERSON|AIR|about the slyly ironic +18820|1933|78|6|1|1834.93|0.05|0.08|A|F|1995-02-23|1995-04-27|1995-03-25|COLLECT COD|TRUCK|against the slyly b +18821|1125|98|1|45|46175.40|0.08|0.03|N|O|1996-04-03|1996-05-22|1996-04-22|TAKE BACK RETURN|AIR|ccounts. slyly ironic packages after the +18821|1225|63|2|8|9009.76|0.01|0.03|N|O|1996-06-11|1996-04-25|1996-06-28|NONE|FOB|ully final dep +18821|195|96|3|43|47093.17|0.07|0.06|N|O|1996-05-14|1996-04-13|1996-05-16|DELIVER IN PERSON|FOB|refully thin instructions are sl +18821|1488|6|4|22|30568.56|0.09|0.01|N|O|1996-03-16|1996-04-27|1996-03-22|COLLECT COD|SHIP|aggle after the fluffily ironic deposits. d +18821|824|24|5|19|32771.58|0.01|0.06|N|O|1996-05-10|1996-03-30|1996-05-13|DELIVER IN PERSON|REG AIR|furiously ironic accounts cajole carefully +18821|676|77|6|29|45723.43|0.00|0.02|N|O|1996-03-28|1996-03-26|1996-04-05|TAKE BACK RETURN|MAIL|its are blithely. instruction +18822|20|71|1|13|11960.26|0.06|0.01|A|F|1994-03-10|1994-02-19|1994-04-06|COLLECT COD|RAIL|quests wake. blit +18822|1514|15|2|31|43880.81|0.04|0.02|A|F|1994-02-28|1994-02-08|1994-03-22|TAKE BACK RETURN|REG AIR|o beans. even, iron +18822|322|79|3|17|20779.44|0.07|0.02|R|F|1994-02-15|1994-03-11|1994-03-09|NONE|AIR|s. furious requests lose slyly among t +18822|821|21|4|23|39601.86|0.01|0.06|A|F|1994-04-13|1994-03-15|1994-05-12|NONE|FOB|out the quickly final packages +18822|1746|47|5|26|42841.24|0.09|0.02|A|F|1994-01-27|1994-03-19|1994-01-31|NONE|TRUCK|lites. quickly silent acco +18823|1468|69|1|29|39714.34|0.04|0.07|R|F|1992-11-28|1992-11-30|1992-12-25|COLLECT COD|SHIP|gle: brave p +18823|1694|77|2|12|19148.28|0.09|0.00|R|F|1992-12-31|1992-11-28|1993-01-29|DELIVER IN PERSON|SHIP|posits nag furiously. carefully ironic pa +18848|658|90|1|27|42083.55|0.02|0.05|N|O|1998-07-26|1998-05-14|1998-08-13|COLLECT COD|TRUCK|s above the theodolites. carefully bol +18848|1268|6|2|50|58463.00|0.02|0.03|N|O|1998-04-26|1998-04-29|1998-05-20|TAKE BACK RETURN|AIR|tes haggle slyly caref +18848|521|12|3|9|12793.68|0.06|0.06|N|O|1998-07-18|1998-05-04|1998-08-06|DELIVER IN PERSON|SHIP|ges kindle finally ironic t +18848|591|52|4|6|8949.54|0.07|0.06|N|O|1998-07-11|1998-05-01|1998-08-08|TAKE BACK RETURN|TRUCK|blithely ironic packages. blithely +18849|1542|83|1|12|17322.48|0.08|0.02|R|F|1992-11-02|1992-09-21|1992-11-30|NONE|FOB|ic courts haggle +18849|1999|88|2|47|89346.53|0.09|0.02|A|F|1992-10-22|1992-09-16|1992-11-11|DELIVER IN PERSON|REG AIR|sily across the deposits. fluffily qu +18849|785|86|3|22|37087.16|0.03|0.00|R|F|1992-08-11|1992-09-24|1992-09-07|NONE|RAIL|integrate slowly +18849|1872|59|4|27|47894.49|0.04|0.00|A|F|1992-11-22|1992-10-07|1992-12-01|DELIVER IN PERSON|FOB|the blithely final requests are sil +18850|1163|64|1|20|21283.20|0.09|0.01|R|F|1993-07-25|1993-08-12|1993-08-13|COLLECT COD|REG AIR| along the w +18850|339|68|2|25|30983.25|0.00|0.08|A|F|1993-08-18|1993-08-04|1993-09-05|TAKE BACK RETURN|TRUCK|gle furiously. bravely bold foxes +18850|647|10|3|38|58810.32|0.10|0.08|R|F|1993-08-02|1993-06-28|1993-08-31|TAKE BACK RETURN|RAIL|e quickly special sentiments. furiousl +18850|1820|7|4|6|10330.92|0.09|0.07|R|F|1993-09-03|1993-08-25|1993-09-21|NONE|REG AIR|ges are among the multip +18850|257|58|5|25|28931.25|0.04|0.00|R|F|1993-09-15|1993-06-27|1993-10-03|COLLECT COD|MAIL|boost after the carefull +18850|269|51|6|29|33908.54|0.00|0.03|R|F|1993-08-22|1993-08-11|1993-09-05|COLLECT COD|MAIL|bold deposits. +18851|581|12|1|37|54818.46|0.09|0.04|R|F|1993-03-31|1993-03-14|1993-04-04|TAKE BACK RETURN|RAIL|about the e +18851|607|39|2|47|70857.20|0.10|0.01|R|F|1993-02-17|1993-02-26|1993-03-03|TAKE BACK RETURN|RAIL|er the carefu +18851|1808|38|3|19|32486.20|0.09|0.00|A|F|1993-02-08|1993-02-28|1993-03-04|COLLECT COD|TRUCK|s about the furiously even depende +18851|1086|22|4|33|32573.64|0.04|0.00|R|F|1993-02-15|1993-02-11|1993-02-22|TAKE BACK RETURN|REG AIR|r the blithely even ideas. ironic deposits +18852|1808|38|1|40|68392.00|0.07|0.00|N|O|1995-12-05|1995-11-23|1995-12-28|NONE|MAIL| unusual pac +18852|1998|99|2|1|1899.99|0.07|0.02|N|O|1995-09-27|1995-10-29|1995-10-19|COLLECT COD|RAIL| wake slyly according +18852|446|76|3|2|2692.88|0.01|0.00|N|O|1996-01-19|1995-11-20|1996-02-16|COLLECT COD|MAIL|equests sleep past +18852|561|92|4|8|11692.48|0.10|0.02|N|O|1995-12-12|1995-11-14|1995-12-28|NONE|MAIL|express requests c +18852|1650|92|5|21|32584.65|0.07|0.04|N|O|1995-09-25|1995-11-29|1995-10-08|NONE|MAIL| after the bold theodolites. fu +18853|940|9|1|12|22091.28|0.05|0.07|R|F|1993-03-22|1993-02-25|1993-04-20|TAKE BACK RETURN|REG AIR|instructions. furious +18853|1578|99|2|49|72498.93|0.08|0.01|R|F|1993-03-06|1993-04-03|1993-03-18|NONE|RAIL|the regular, permanent theodolites. ironi +18853|1625|67|3|22|33585.64|0.06|0.01|A|F|1993-04-25|1993-02-17|1993-05-12|TAKE BACK RETURN|SHIP| around the slyly expr +18853|510|11|4|49|69114.99|0.07|0.02|R|F|1993-03-05|1993-03-27|1993-03-25|COLLECT COD|AIR|solve express asymptotes. regul +18854|1501|22|1|20|28050.00|0.02|0.08|N|O|1997-06-05|1997-05-14|1997-06-23|NONE|MAIL|al packages hang even request +18854|774|39|2|18|30145.86|0.10|0.07|N|O|1997-05-20|1997-06-18|1997-06-07|COLLECT COD|TRUCK|even pains use; +18854|1780|65|3|17|28590.26|0.00|0.03|N|O|1997-04-20|1997-04-24|1997-04-27|TAKE BACK RETURN|AIR| accounts use slyly. asymptotes are +18854|1349|26|4|7|8752.38|0.03|0.03|N|O|1997-04-21|1997-05-26|1997-05-15|COLLECT COD|SHIP|ly unusual pains us +18855|1202|3|1|40|44128.00|0.08|0.01|R|F|1994-12-21|1994-10-24|1994-12-24|NONE|RAIL|kages. furiously flu +18855|1977|22|2|33|62006.01|0.02|0.00|R|F|1995-01-08|1994-10-23|1995-01-22|COLLECT COD|TRUCK| deposits cajole +18855|487|17|3|48|66599.04|0.10|0.01|R|F|1994-11-04|1994-11-04|1994-11-05|TAKE BACK RETURN|RAIL| the furiously ironic d +18855|1077|13|4|43|42057.01|0.02|0.07|A|F|1994-10-20|1994-11-20|1994-10-23|TAKE BACK RETURN|RAIL|counts. blithely ironic packages solve +18855|1214|52|5|8|8921.68|0.02|0.07|A|F|1994-10-10|1994-12-02|1994-10-14|NONE|SHIP|lyly bold packages aff +18880|1802|89|1|33|56225.40|0.00|0.04|A|F|1995-01-04|1994-12-24|1995-01-28|NONE|RAIL|egrate quickly alongside of the b +18880|1394|9|2|39|50520.21|0.00|0.08|R|F|1995-02-06|1995-01-13|1995-02-17|TAKE BACK RETURN|MAIL|quests haggle blith +18880|1514|15|3|40|56620.40|0.02|0.07|R|F|1994-11-28|1994-11-25|1994-12-12|DELIVER IN PERSON|SHIP|. deposits during the regular accounts lose +18881|31|32|1|37|34448.11|0.00|0.08|N|O|1998-05-08|1998-04-28|1998-05-20|NONE|SHIP|y fluffy ideas. blithely bold a +18881|440|28|2|31|41553.64|0.08|0.02|N|O|1998-06-24|1998-06-21|1998-07-17|TAKE BACK RETURN|TRUCK|t accounts cajole. pending requests wake q +18881|673|5|3|41|64520.47|0.03|0.00|N|O|1998-04-10|1998-05-05|1998-04-15|COLLECT COD|REG AIR|sits. blithely bold requ +18881|1842|72|4|7|12206.88|0.06|0.04|N|O|1998-05-10|1998-05-29|1998-06-01|TAKE BACK RETURN|MAIL|ts. unusual dependencies +18882|12|88|1|10|9120.10|0.09|0.02|N|O|1998-04-23|1998-04-07|1998-05-20|NONE|FOB|nically around the fur +18882|96|22|2|39|38847.51|0.10|0.00|N|O|1998-02-15|1998-03-18|1998-03-15|NONE|AIR| blithely regular theodol +18882|738|3|3|18|29497.14|0.00|0.03|N|O|1998-03-22|1998-04-04|1998-04-06|TAKE BACK RETURN|SHIP|g the carefully special deposits. regu +18882|818|18|4|30|51564.30|0.05|0.01|N|O|1998-01-29|1998-03-12|1998-02-12|COLLECT COD|AIR|ular pinto b +18882|85|11|5|15|14776.20|0.05|0.02|N|O|1998-04-17|1998-04-02|1998-05-03|COLLECT COD|SHIP|tructions wake carefully pending packages. +18882|175|54|6|27|29029.59|0.01|0.06|N|O|1998-04-17|1998-02-16|1998-04-22|DELIVER IN PERSON|REG AIR|efully furiously final foxes. regular, thi +18882|219|20|7|49|54841.29|0.03|0.00|N|O|1998-04-08|1998-02-16|1998-05-07|DELIVER IN PERSON|MAIL|symptotes wake slyly fina +18883|603|35|1|31|46611.60|0.08|0.08|N|O|1996-07-19|1996-08-08|1996-07-25|TAKE BACK RETURN|AIR|g the blithely +18883|1165|66|2|48|51175.68|0.05|0.02|N|O|1996-08-18|1996-08-28|1996-08-20|NONE|FOB|s. final packages can sleep carefully: care +18884|1437|38|1|32|42829.76|0.08|0.04|N|O|1995-09-16|1995-09-18|1995-10-05|COLLECT COD|REG AIR|across the slowly express packages +18884|438|97|2|29|38814.47|0.05|0.01|N|O|1995-08-13|1995-09-07|1995-09-09|TAKE BACK RETURN|TRUCK|s pending requests nag carefull +18884|19|70|3|11|10109.11|0.04|0.07|N|O|1995-07-13|1995-08-30|1995-07-28|NONE|AIR|gular deposit +18884|28|29|4|48|44544.96|0.02|0.00|N|O|1995-08-19|1995-09-02|1995-08-23|NONE|AIR|r deposits haggle f +18884|1426|44|5|32|42477.44|0.02|0.04|N|O|1995-09-02|1995-09-12|1995-09-29|NONE|AIR|ic excuses-- furiously special escap +18884|1044|50|6|15|14175.60|0.10|0.07|N|O|1995-08-27|1995-08-15|1995-09-26|NONE|SHIP|structions are furiously quick +18884|323|80|7|8|9786.56|0.00|0.08|N|O|1995-10-06|1995-09-10|1995-10-31|TAKE BACK RETURN|SHIP|olites mold carefully-- idle, final +18885|996|65|1|49|92952.51|0.06|0.08|N|O|1998-07-20|1998-07-06|1998-07-28|TAKE BACK RETURN|TRUCK|bout the furiously ironic bra +18885|1434|35|2|12|16025.16|0.03|0.04|N|O|1998-07-06|1998-07-03|1998-07-24|DELIVER IN PERSON|FOB|n excuses. silently sp +18885|1080|51|3|31|30413.48|0.07|0.03|N|O|1998-07-22|1998-07-30|1998-08-14|COLLECT COD|SHIP| the furiously final pinto beans. carefully +18885|1390|5|4|46|59403.94|0.04|0.03|N|O|1998-09-21|1998-08-12|1998-10-09|TAKE BACK RETURN|REG AIR|riously final accounts cajole ca +18885|1246|58|5|6|6883.44|0.08|0.00|N|O|1998-07-10|1998-06-29|1998-07-19|TAKE BACK RETURN|AIR|l requests sleep furiously +18885|1312|13|6|25|30332.75|0.07|0.06|N|O|1998-08-02|1998-07-25|1998-08-11|TAKE BACK RETURN|MAIL|uriously unusual c +18885|621|84|7|39|59343.18|0.07|0.02|N|O|1998-07-20|1998-07-28|1998-07-23|DELIVER IN PERSON|RAIL|al foxes sleep carefully carefull +18886|1163|64|1|32|34053.12|0.07|0.02|R|F|1992-05-14|1992-04-09|1992-05-30|DELIVER IN PERSON|MAIL|lithely regular pinto beans +18886|212|94|2|2|2224.42|0.03|0.03|R|F|1992-05-26|1992-03-17|1992-06-10|TAKE BACK RETURN|SHIP|y express ins +18886|1748|75|3|39|64339.86|0.05|0.05|R|F|1992-03-28|1992-03-24|1992-04-24|COLLECT COD|REG AIR| unusual dependencies cajole furiously +18886|1246|21|4|49|56214.76|0.05|0.02|A|F|1992-03-03|1992-03-17|1992-03-06|COLLECT COD|REG AIR|ular decoys boost carefully about the +18886|415|3|5|50|65770.50|0.01|0.06|A|F|1992-03-04|1992-03-31|1992-03-29|DELIVER IN PERSON|AIR|y regular dependencies about +18887|636|99|1|41|63001.83|0.06|0.02|R|F|1993-12-23|1994-01-21|1994-01-09|COLLECT COD|TRUCK|iously fluffy platelets. carefully s +18887|1460|78|2|17|23144.82|0.10|0.05|R|F|1994-02-22|1994-01-16|1994-03-20|NONE|AIR|haggle furiously. +18887|72|48|3|26|25273.82|0.05|0.06|A|F|1994-01-30|1994-01-29|1994-02-12|DELIVER IN PERSON|RAIL|iously blithely +18887|1997|30|4|10|18989.90|0.09|0.08|A|F|1994-01-23|1994-01-29|1994-02-12|NONE|TRUCK|de of the +18912|811|45|1|6|10270.86|0.07|0.05|N|O|1997-08-10|1997-07-21|1997-08-12|COLLECT COD|REG AIR|. express the +18912|674|75|2|9|14172.03|0.04|0.07|N|O|1997-08-15|1997-08-01|1997-08-19|TAKE BACK RETURN|REG AIR|eas eat carefully about t +18912|525|86|3|42|59871.84|0.00|0.05|N|O|1997-09-15|1997-07-10|1997-09-26|TAKE BACK RETURN|RAIL|ecial, final depe +18912|762|27|4|14|23278.64|0.03|0.08|N|O|1997-08-13|1997-06-30|1997-09-08|COLLECT COD|SHIP| fluffily accounts. silent pack +18912|489|19|5|49|68084.52|0.09|0.02|N|O|1997-05-24|1997-07-28|1997-06-08|DELIVER IN PERSON|SHIP| hockey players haggle quickly +18913|1954|43|1|39|72382.05|0.02|0.06|N|O|1998-06-14|1998-08-25|1998-06-24|COLLECT COD|REG AIR|e ironic, pending requests. slyly ir +18913|1786|29|2|13|21941.14|0.09|0.01|N|O|1998-08-02|1998-08-14|1998-08-31|NONE|REG AIR|r dolphins use slyly against th +18913|230|31|3|12|13562.76|0.09|0.06|N|O|1998-07-25|1998-07-26|1998-07-28|COLLECT COD|RAIL|ts. ironic deposits ac +18913|1042|13|4|16|15088.64|0.02|0.00|N|O|1998-06-26|1998-07-13|1998-07-14|NONE|REG AIR| furiously final accounts. blithely regular +18913|1058|29|5|22|21099.10|0.10|0.06|N|O|1998-07-28|1998-07-23|1998-08-14|TAKE BACK RETURN|REG AIR|its detect quickly carefully ruthless +18913|1200|1|6|13|14315.60|0.08|0.05|N|O|1998-06-17|1998-07-27|1998-06-30|TAKE BACK RETURN|AIR| theodolites. ideas are furiously +18914|1213|14|1|21|23398.41|0.04|0.04|R|F|1993-12-28|1993-11-19|1994-01-01|DELIVER IN PERSON|TRUCK| enticingly +18915|1214|89|1|1|1115.21|0.07|0.03|R|F|1994-02-22|1994-03-31|1994-03-08|TAKE BACK RETURN|TRUCK|the carefully unusual theodolites h +18916|1068|74|1|34|32948.04|0.04|0.07|N|O|1996-04-09|1996-03-22|1996-04-16|COLLECT COD|MAIL|le furiously bold deposits. slyly ir +18916|296|97|2|8|9570.32|0.03|0.05|N|O|1996-03-18|1996-03-04|1996-03-28|DELIVER IN PERSON|MAIL|inal dependenci +18916|1691|92|3|34|54151.46|0.03|0.00|N|O|1996-02-22|1996-02-24|1996-03-01|TAKE BACK RETURN|RAIL|its. regular, final packages wa +18917|1697|80|1|14|22381.66|0.04|0.00|R|F|1992-08-09|1992-07-25|1992-08-24|COLLECT COD|FOB|ans wake slyly. care +18917|665|66|2|8|12525.28|0.04|0.06|R|F|1992-06-26|1992-06-16|1992-07-22|TAKE BACK RETURN|REG AIR|ymptotes use doggedly +18918|22|23|1|2|1844.04|0.10|0.07|A|F|1992-11-02|1993-01-17|1992-11-15|COLLECT COD|MAIL|. quickly bold deposits s +18918|1090|96|2|21|20812.89|0.08|0.05|A|F|1993-01-23|1993-01-17|1993-01-29|COLLECT COD|REG AIR|ts haggle slyly furiously r +18918|1614|38|3|8|12124.88|0.05|0.00|A|F|1992-12-26|1993-01-19|1993-01-24|DELIVER IN PERSON|TRUCK|ake carefully blit +18918|84|10|4|14|13777.12|0.03|0.05|A|F|1993-01-11|1992-12-04|1993-02-03|NONE|SHIP|s cajole by the unus +18918|147|74|5|1|1047.14|0.05|0.00|A|F|1993-01-17|1993-01-01|1993-01-19|TAKE BACK RETURN|SHIP|ages sleep even, dogged re +18919|421|22|1|13|17178.46|0.09|0.02|R|F|1994-09-14|1994-09-08|1994-09-29|NONE|TRUCK|he quickly ironic courts cajole +18919|662|94|2|3|4687.98|0.03|0.06|R|F|1994-10-05|1994-08-29|1994-10-21|TAKE BACK RETURN|TRUCK|ual deposits sleep among the fluffily +18919|462|92|3|16|21799.36|0.06|0.02|A|F|1994-10-04|1994-08-04|1994-10-26|COLLECT COD|REG AIR|lar platelets use slyly. furiously +18944|936|71|1|8|14695.44|0.06|0.04|N|O|1997-01-05|1997-01-20|1997-01-24|COLLECT COD|TRUCK|nto beans x-ray special esc +18944|484|72|2|31|42918.88|0.06|0.02|N|O|1997-02-11|1996-12-18|1997-03-09|DELIVER IN PERSON|AIR|counts boost slyly according to the furi +18944|677|40|3|16|25242.72|0.00|0.07|N|O|1996-11-27|1997-01-04|1996-12-19|DELIVER IN PERSON|FOB|ar requests sleep quickly +18944|708|9|4|24|38608.80|0.03|0.07|N|O|1996-11-25|1996-11-30|1996-12-13|TAKE BACK RETURN|REG AIR|counts. quickly r +18944|381|82|5|25|32034.50|0.08|0.02|N|O|1997-01-07|1996-12-07|1997-02-06|DELIVER IN PERSON|MAIL|deposits? regul +18944|47|98|6|2|1894.08|0.03|0.02|N|O|1996-11-27|1996-11-27|1996-11-29|TAKE BACK RETURN|TRUCK|l requests promise quickly. quickly i +18944|1075|81|7|22|21473.54|0.02|0.00|N|O|1996-12-22|1997-01-25|1996-12-30|TAKE BACK RETURN|REG AIR|riously. carefully regular forges wake bli +18945|693|56|1|22|35061.18|0.03|0.05|A|F|1994-05-05|1994-04-02|1994-05-19|TAKE BACK RETURN|REG AIR|final frays. furiously pending platel +18945|663|95|2|49|76619.34|0.05|0.07|A|F|1994-03-12|1994-04-11|1994-03-24|COLLECT COD|MAIL|posits cajole ruthlessly regular, ir +18945|563|54|3|18|26344.08|0.10|0.06|A|F|1994-03-26|1994-04-04|1994-04-06|DELIVER IN PERSON|FOB|ickly pending foxes. fluffily enticin +18945|1974|7|4|41|76914.77|0.09|0.06|R|F|1994-05-02|1994-03-25|1994-05-09|TAKE BACK RETURN|REG AIR|ep according +18946|164|91|1|45|47887.20|0.04|0.08|A|F|1993-07-28|1993-06-24|1993-08-06|TAKE BACK RETURN|FOB|ly along the regular +18946|1417|35|2|1|1318.41|0.02|0.05|R|F|1993-07-23|1993-06-30|1993-07-25|COLLECT COD|SHIP|ffily final theodolites h +18947|1324|39|1|29|35534.28|0.02|0.00|N|O|1997-08-03|1997-09-17|1997-08-30|COLLECT COD|RAIL|lites are. carefully regular requests a +18947|651|83|2|30|46549.50|0.04|0.06|N|O|1997-07-16|1997-08-23|1997-07-31|TAKE BACK RETURN|SHIP|rash blithely sile +18947|1680|63|3|42|66430.56|0.00|0.01|N|O|1997-09-28|1997-08-15|1997-10-10|TAKE BACK RETURN|MAIL|he busy asymptotes are dependencies. +18948|21|97|1|30|27630.60|0.09|0.02|N|O|1996-10-27|1996-10-11|1996-10-29|TAKE BACK RETURN|RAIL|ly even pains. accounts +18948|358|15|2|35|44042.25|0.00|0.02|N|O|1996-11-02|1996-10-05|1996-11-16|NONE|SHIP|lar foxes cajole carefully +18948|1677|78|3|20|31573.40|0.01|0.05|N|O|1996-10-18|1996-11-19|1996-11-10|TAKE BACK RETURN|RAIL| accounts despite the unusual, even theod +18948|1835|22|4|2|3473.66|0.04|0.07|N|O|1996-10-02|1996-11-15|1996-10-31|DELIVER IN PERSON|MAIL|es wake slyly alongside of the +18948|1195|68|5|30|32885.70|0.06|0.07|N|O|1996-11-20|1996-10-31|1996-12-02|NONE|TRUCK|eas. final dependencies sleep quickl +18949|145|98|1|46|48076.44|0.08|0.07|N|O|1998-04-21|1998-05-31|1998-05-20|NONE|FOB|sleep furiously even req +18949|183|36|2|37|40077.66|0.10|0.07|N|O|1998-03-16|1998-05-19|1998-03-20|COLLECT COD|MAIL|gle. carefully pending dugouts acc +18949|1711|38|3|43|69346.53|0.01|0.07|N|O|1998-05-09|1998-04-22|1998-06-01|TAKE BACK RETURN|SHIP|y regular pinto be +18949|740|41|4|4|6562.96|0.08|0.01|N|O|1998-06-07|1998-05-10|1998-06-15|DELIVER IN PERSON|SHIP|sts hang carefully against the pack +18949|1273|85|5|31|36402.37|0.08|0.01|N|O|1998-06-17|1998-05-25|1998-06-30|TAKE BACK RETURN|TRUCK|ronic dolphins i +18949|868|68|6|26|45990.36|0.07|0.05|N|O|1998-03-08|1998-05-08|1998-03-09|NONE|FOB|ar excuses sleep ca +18950|958|93|1|19|35320.05|0.04|0.05|R|F|1992-05-24|1992-04-28|1992-06-11|NONE|RAIL|special accounts print +18951|1675|76|1|22|34686.74|0.00|0.06|N|O|1995-10-09|1995-09-14|1995-10-24|COLLECT COD|RAIL|aggle carefully at the dogged req +18951|1441|59|2|18|24163.92|0.09|0.04|N|O|1995-07-17|1995-08-03|1995-08-10|NONE|MAIL| express notornis breach. requests boost +18951|182|9|3|18|19479.24|0.05|0.02|N|O|1995-10-17|1995-09-13|1995-11-08|COLLECT COD|SHIP|eas boost slyly after the blithely regul +18951|23|24|4|47|43381.94|0.05|0.05|N|O|1995-09-17|1995-08-30|1995-10-13|COLLECT COD|AIR|counts. furiously sly excuses print quic +18951|1127|36|5|35|35984.20|0.03|0.00|N|O|1995-10-13|1995-09-16|1995-10-28|NONE|REG AIR|yly pending escapades +18976|1488|6|1|33|45852.84|0.07|0.03|N|O|1996-10-06|1996-10-07|1996-10-11|COLLECT COD|AIR|ickly bold foxes solve +18976|831|31|2|45|77932.35|0.01|0.07|N|O|1996-10-06|1996-10-04|1996-11-03|COLLECT COD|MAIL|ously quick requests. furiously bold acco +18977|1842|86|1|16|27901.44|0.04|0.07|N|O|1998-02-12|1998-02-10|1998-03-09|DELIVER IN PERSON|SHIP|egularly regular instructions alongside o +18977|555|16|2|28|40755.40|0.07|0.03|N|O|1998-02-10|1998-02-07|1998-03-04|NONE|SHIP|uffily quickly final theodoli +18977|1992|37|3|45|85229.55|0.02|0.00|N|O|1998-03-24|1998-01-14|1998-03-29|TAKE BACK RETURN|RAIL|sts wake slyly packages. pending d +18978|1250|88|1|24|27630.00|0.10|0.07|A|F|1992-12-10|1992-11-04|1992-12-13|NONE|FOB|ide of the q +18978|973|8|2|14|26235.58|0.00|0.03|R|F|1992-09-13|1992-10-25|1992-09-19|COLLECT COD|SHIP|ggle carefully at +18978|898|99|3|2|3597.78|0.04|0.08|A|F|1992-11-27|1992-10-02|1992-12-17|DELIVER IN PERSON|MAIL|s are fluffily-- fur +18978|115|94|4|15|15226.65|0.09|0.06|A|F|1992-12-22|1992-10-23|1993-01-04|NONE|FOB|ending, special foxes cajo +18978|1655|56|5|36|56039.40|0.06|0.04|R|F|1992-12-13|1992-09-23|1992-12-27|NONE|TRUCK|cial requests sleep busily iro +18979|1026|97|1|13|12051.26|0.10|0.05|N|O|1998-07-06|1998-07-11|1998-07-20|COLLECT COD|REG AIR|eep around the furiously ir +18979|1236|74|2|1|1137.23|0.00|0.06|N|O|1998-05-24|1998-08-08|1998-06-06|TAKE BACK RETURN|FOB|ound the blithely bold theodolites sleep q +18979|473|3|3|33|45324.51|0.04|0.00|N|O|1998-07-22|1998-07-24|1998-08-09|NONE|FOB|le. blithely even accounts sleep +18979|1749|34|4|46|75934.04|0.01|0.03|N|O|1998-08-25|1998-07-08|1998-09-05|DELIVER IN PERSON|REG AIR|s the furiously pending depend +18979|1348|49|5|24|29984.16|0.00|0.07|N|O|1998-06-30|1998-08-06|1998-07-24|COLLECT COD|REG AIR|ual accounts print after the quickly sil +18979|1870|71|6|46|81506.02|0.03|0.02|N|O|1998-08-18|1998-07-23|1998-08-23|COLLECT COD|RAIL|posits cajole furiou +18979|1016|52|7|14|12838.14|0.09|0.05|N|O|1998-07-27|1998-06-15|1998-08-06|COLLECT COD|SHIP|es. ironic, regula +18980|711|76|1|7|11281.97|0.08|0.07|A|F|1993-06-05|1993-07-12|1993-07-02|TAKE BACK RETURN|FOB|ickly furiously pending theodolite +18980|1537|78|2|39|56102.67|0.00|0.05|R|F|1993-05-16|1993-06-23|1993-05-31|COLLECT COD|FOB|affix furiously express courts. f +18980|301|30|3|41|49253.30|0.10|0.05|A|F|1993-07-31|1993-06-21|1993-08-24|TAKE BACK RETURN|TRUCK|of the carefully unusual instructions +18980|1989|34|4|34|64293.32|0.02|0.07|R|F|1993-05-11|1993-05-30|1993-05-23|COLLECT COD|TRUCK|ccounts are furiously furiously i +18980|787|20|5|1|1687.78|0.02|0.07|A|F|1993-08-10|1993-07-10|1993-08-15|COLLECT COD|REG AIR|ades. slyl +18980|1239|77|6|9|10262.07|0.00|0.06|R|F|1993-06-23|1993-07-10|1993-07-17|NONE|TRUCK|ests. slyly regular deposits +18980|1135|8|7|27|27975.51|0.08|0.01|A|F|1993-04-26|1993-06-23|1993-05-21|COLLECT COD|REG AIR|s detect slyly spe +18981|876|10|1|21|37314.27|0.00|0.08|N|O|1996-02-28|1996-03-09|1996-03-16|DELIVER IN PERSON|REG AIR| unusual tithes serve careful +18981|14|65|2|23|21022.23|0.08|0.07|N|O|1996-05-25|1996-03-29|1996-05-31|TAKE BACK RETURN|FOB| slyly special package +18981|821|21|3|5|8609.10|0.08|0.02|N|O|1996-04-19|1996-04-20|1996-05-17|COLLECT COD|TRUCK|lessly even theodolites. +18981|1764|65|4|41|68296.16|0.09|0.03|N|O|1996-04-17|1996-04-13|1996-05-10|COLLECT COD|AIR|s. regular instructions cajole. excus +18982|345|30|1|35|43586.90|0.03|0.08|N|O|1998-07-06|1998-06-04|1998-07-25|DELIVER IN PERSON|FOB|refully regular ideas use carefully alon +18982|1528|29|2|32|45744.64|0.09|0.03|N|O|1998-05-21|1998-05-04|1998-06-02|COLLECT COD|AIR|y bold ideas. furiously bold multi +18983|1772|99|1|7|11716.39|0.09|0.05|A|F|1992-09-12|1992-10-22|1992-10-04|NONE|REG AIR|al requests cajole slyly silent ideas. +19008|789|54|1|16|27036.48|0.09|0.06|N|O|1997-02-25|1997-02-09|1997-03-06|DELIVER IN PERSON|TRUCK|ular, regular excuses. even, even pinto be +19009|1131|68|1|2|2064.26|0.02|0.07|R|F|1992-03-29|1992-06-22|1992-04-16|TAKE BACK RETURN|SHIP|eodolites sleep slyly carefully unus +19010|1520|1|1|47|66811.44|0.10|0.07|A|F|1994-06-24|1994-08-18|1994-07-09|TAKE BACK RETURN|MAIL|e fluffily. slyly i +19010|1660|61|2|42|65589.72|0.00|0.02|R|F|1994-07-20|1994-08-28|1994-08-19|COLLECT COD|MAIL|fully ironic asympto +19010|1510|91|3|31|43756.81|0.09|0.02|A|F|1994-09-21|1994-07-16|1994-10-19|NONE|AIR|zzle: pending i +19010|807|74|4|50|85390.00|0.01|0.06|R|F|1994-09-07|1994-08-29|1994-09-12|DELIVER IN PERSON|REG AIR|oubt furiou +19011|910|45|1|42|76058.22|0.10|0.05|N|O|1997-03-30|1997-04-16|1997-04-27|COLLECT COD|MAIL|nstructions sleep qu +19012|364|21|1|48|60689.28|0.06|0.06|A|F|1993-06-19|1993-05-16|1993-07-14|NONE|REG AIR|press excuses ha +19013|167|46|1|18|19208.88|0.02|0.06|N|O|1997-12-01|1997-12-21|1997-12-28|NONE|TRUCK| carefully regular requests. iron +19014|856|57|1|3|5270.55|0.02|0.04|N|O|1997-11-21|1997-11-08|1997-12-12|NONE|RAIL| cajole into +19014|1600|81|2|46|69073.60|0.03|0.00|N|O|1997-12-30|1997-10-31|1998-01-27|NONE|SHIP|ironic package +19014|1030|36|3|47|43758.41|0.05|0.00|N|O|1998-01-13|1997-12-06|1998-02-05|DELIVER IN PERSON|REG AIR|oggedly. sil +19014|776|73|4|48|80484.96|0.10|0.00|N|O|1998-01-15|1997-11-11|1998-01-18|TAKE BACK RETURN|FOB| carefully regular deposit +19014|12|88|5|38|34656.38|0.10|0.05|N|O|1997-10-08|1997-11-23|1997-10-26|NONE|REG AIR|sual theodol +19014|1761|4|6|5|8313.80|0.04|0.03|N|O|1997-09-30|1997-11-10|1997-10-07|TAKE BACK RETURN|FOB|ideas wake +19015|1755|98|1|35|57986.25|0.08|0.03|N|O|1998-03-01|1998-04-18|1998-03-03|DELIVER IN PERSON|AIR|bout the carefully ironic foxe +19015|885|19|2|35|62505.80|0.09|0.08|N|O|1998-02-11|1998-03-26|1998-03-10|NONE|AIR|ily above the blithely fin +19040|1346|61|1|38|47398.92|0.10|0.04|N|O|1995-12-22|1996-01-23|1996-01-13|DELIVER IN PERSON|REG AIR|nic packages haggle careful +19040|1793|94|2|24|40674.96|0.02|0.08|N|O|1996-02-28|1996-02-18|1996-03-02|TAKE BACK RETURN|FOB|inal deposits above the regular theodoli +19040|520|81|3|2|2841.04|0.09|0.08|N|O|1996-01-31|1996-03-10|1996-02-22|NONE|AIR|s sleep carefully qu +19040|1157|58|4|48|50791.20|0.07|0.00|N|O|1996-04-10|1996-03-16|1996-04-13|TAKE BACK RETURN|MAIL|c asymptotes. fluffily fluffy reques +19040|619|82|5|2|3039.22|0.02|0.03|N|O|1996-03-01|1996-03-05|1996-03-29|COLLECT COD|REG AIR|y throughout t +19040|880|80|6|32|56988.16|0.03|0.03|N|O|1996-02-28|1996-03-10|1996-03-01|COLLECT COD|TRUCK|arefully furiously even courts. blithely i +19040|795|28|7|14|23741.06|0.00|0.04|N|O|1996-01-25|1996-03-08|1996-02-19|TAKE BACK RETURN|REG AIR|en foxes haggle about the caref +19041|222|50|1|18|20199.96|0.06|0.00|N|O|1995-11-24|1995-09-13|1995-12-21|DELIVER IN PERSON|SHIP|use slyly p +19041|521|52|2|2|2843.04|0.01|0.04|N|O|1995-09-02|1995-09-29|1995-09-13|NONE|TRUCK|e carefully foxes. bl +19041|1837|81|3|49|85202.67|0.00|0.03|N|O|1995-08-24|1995-08-30|1995-09-13|DELIVER IN PERSON|MAIL|es. slyly brave theodolites boos +19041|1405|84|4|19|24821.60|0.07|0.08|N|O|1995-11-03|1995-10-09|1995-11-08|TAKE BACK RETURN|TRUCK|s the blithely regular packages. final +19041|848|82|5|23|40223.32|0.01|0.07|N|O|1995-10-31|1995-09-10|1995-11-15|TAKE BACK RETURN|MAIL| accounts a +19041|84|85|6|39|38379.12|0.00|0.03|N|O|1995-11-05|1995-09-25|1995-11-25|COLLECT COD|REG AIR|uriously silent packages nag across the ev +19041|1011|47|7|17|15504.17|0.03|0.02|N|O|1995-11-08|1995-10-03|1995-12-02|COLLECT COD|MAIL|es integrate +19042|953|56|1|16|29663.20|0.02|0.04|A|F|1994-04-19|1994-04-09|1994-05-13|TAKE BACK RETURN|TRUCK| ironically q +19042|1406|46|2|45|58833.00|0.04|0.04|R|F|1994-03-22|1994-05-08|1994-04-19|TAKE BACK RETURN|RAIL|eas are carefully along the deposits. ir +19042|1173|82|3|34|36521.78|0.10|0.05|A|F|1994-04-01|1994-04-02|1994-04-26|NONE|REG AIR|s integrate +19042|56|82|4|30|28681.50|0.01|0.02|R|F|1994-06-05|1994-04-02|1994-07-01|TAKE BACK RETURN|AIR|e. carefully even +19042|902|5|5|43|77524.70|0.05|0.07|A|F|1994-06-12|1994-04-14|1994-06-18|DELIVER IN PERSON|SHIP|n ideas. final +19042|417|76|6|3|3952.23|0.06|0.02|R|F|1994-06-28|1994-04-08|1994-07-11|COLLECT COD|RAIL|ular pinto beans are carefu +19042|135|62|7|41|42440.33|0.07|0.07|A|F|1994-06-10|1994-05-05|1994-06-15|TAKE BACK RETURN|SHIP|unts integra +19043|699|100|1|5|7998.45|0.02|0.06|N|O|1996-03-23|1996-02-08|1996-04-04|TAKE BACK RETURN|RAIL|blithely bold +19043|290|18|2|25|29757.25|0.00|0.07|N|O|1995-12-24|1996-02-25|1996-01-04|DELIVER IN PERSON|RAIL|ously regular requests haggl +19044|757|58|1|29|48074.75|0.03|0.08|R|F|1992-06-07|1992-06-21|1992-07-01|DELIVER IN PERSON|MAIL|requests. quickly regular accounts x-r +19044|211|39|2|19|21112.99|0.04|0.08|A|F|1992-07-07|1992-06-22|1992-07-29|NONE|FOB|odolites. careful +19044|963|32|3|9|16775.64|0.07|0.01|A|F|1992-06-12|1992-07-01|1992-06-13|NONE|TRUCK|e deposits. blithely u +19044|1011|17|4|41|37392.41|0.08|0.05|A|F|1992-06-22|1992-07-07|1992-07-22|TAKE BACK RETURN|AIR|wake daringly above the even deposits +19044|1471|50|5|41|56271.27|0.08|0.08|A|F|1992-05-07|1992-05-13|1992-05-26|COLLECT COD|FOB|special deposits. carefully quick +19045|1406|7|1|30|39222.00|0.04|0.08|N|O|1995-09-06|1995-07-22|1995-09-21|COLLECT COD|REG AIR|are. quickly regular +19045|622|85|2|30|45678.60|0.06|0.04|N|F|1995-06-01|1995-07-19|1995-06-18|DELIVER IN PERSON|RAIL| wake quickly. carefully even accoun +19045|1809|39|3|40|68432.00|0.06|0.00|N|F|1995-06-07|1995-07-14|1995-07-05|COLLECT COD|SHIP|lar pinto b +19046|526|57|1|19|27103.88|0.03|0.07|A|F|1993-06-19|1993-06-15|1993-06-30|NONE|TRUCK|accounts. carefully final in +19046|1121|94|2|46|47017.52|0.01|0.02|R|F|1993-05-21|1993-05-22|1993-05-24|COLLECT COD|RAIL| requests ab +19047|1405|45|1|10|13064.00|0.05|0.01|R|F|1994-02-04|1994-03-11|1994-02-16|NONE|MAIL| final accounts. f +19047|18|44|2|45|41310.45|0.03|0.01|A|F|1994-03-20|1994-03-09|1994-03-22|DELIVER IN PERSON|FOB|pending, daring +19047|1339|78|3|35|43411.55|0.03|0.00|R|F|1994-03-10|1994-03-21|1994-03-29|TAKE BACK RETURN|FOB|uests run carefully packages. s +19047|1375|90|4|28|35738.36|0.00|0.01|A|F|1994-04-16|1994-04-20|1994-05-04|TAKE BACK RETURN|SHIP|posits. carefully express packa +19047|1113|22|5|39|39550.29|0.06|0.01|A|F|1994-03-19|1994-04-25|1994-03-27|NONE|REG AIR|y express packages. fluffily final a +19047|1429|47|6|42|55877.64|0.06|0.08|R|F|1994-05-20|1994-03-10|1994-06-04|DELIVER IN PERSON|MAIL|bold escapades use carefully e +19072|1896|83|1|35|62926.15|0.03|0.01|N|O|1998-03-02|1998-01-12|1998-03-24|TAKE BACK RETURN|MAIL|ully slyly specia +19072|935|38|2|7|12851.51|0.09|0.03|N|O|1998-03-07|1998-01-03|1998-03-31|NONE|FOB| the dependencies affix along the fluf +19072|591|82|3|13|19390.67|0.10|0.05|N|O|1998-01-05|1998-01-10|1998-01-17|TAKE BACK RETURN|RAIL| sleep regular, pendin +19072|612|6|4|39|58991.79|0.04|0.00|N|O|1998-01-28|1997-12-15|1998-02-23|COLLECT COD|FOB|efully final accounts wake blithely instruc +19073|425|84|1|26|34460.92|0.05|0.05|R|F|1994-09-12|1994-09-06|1994-10-12|TAKE BACK RETURN|SHIP|uffily final accou +19073|217|18|2|23|25695.83|0.09|0.01|R|F|1994-07-23|1994-08-09|1994-08-02|NONE|MAIL|ully careful the +19073|1537|78|3|43|61856.79|0.04|0.03|R|F|1994-10-08|1994-08-26|1994-11-02|COLLECT COD|TRUCK|riously bold packages. +19073|165|44|4|9|9586.44|0.05|0.05|R|F|1994-09-14|1994-09-04|1994-09-23|DELIVER IN PERSON|MAIL|thely unusual accounts boost +19073|224|79|5|7|7869.54|0.01|0.08|A|F|1994-08-15|1994-08-28|1994-08-26|DELIVER IN PERSON|RAIL| beans. ironic escapades hag +19073|1701|44|6|48|76929.60|0.04|0.06|A|F|1994-08-02|1994-07-25|1994-08-17|TAKE BACK RETURN|REG AIR| carefully regular in +19074|392|93|1|35|45233.65|0.02|0.01|R|F|1992-06-27|1992-08-28|1992-07-16|COLLECT COD|FOB| even deposits +19074|428|58|2|36|47823.12|0.05|0.08|A|F|1992-08-16|1992-08-31|1992-08-27|COLLECT COD|REG AIR|ments cajole furiously +19074|98|24|3|3|2994.27|0.01|0.07|A|F|1992-09-23|1992-09-23|1992-10-23|NONE|REG AIR| ideas. pains haggle furiously a +19074|1240|78|4|22|25107.28|0.03|0.02|A|F|1992-08-11|1992-09-01|1992-08-29|DELIVER IN PERSON|RAIL|even grouches nag slyly even theodolites. d +19075|1976|9|1|39|73240.83|0.03|0.07|A|F|1994-12-22|1994-11-14|1995-01-18|DELIVER IN PERSON|TRUCK|o beans. quickly bold multipli +19075|1300|75|2|7|8409.10|0.04|0.06|A|F|1994-10-17|1994-12-11|1994-11-08|TAKE BACK RETURN|RAIL|beans. slyly spec +19075|903|4|3|12|21646.80|0.07|0.06|A|F|1994-11-21|1994-12-07|1994-12-08|TAKE BACK RETURN|MAIL|even deposits wa +19075|959|28|4|24|44638.80|0.01|0.01|A|F|1994-10-31|1994-11-22|1994-11-17|COLLECT COD|AIR|xcuses. carefully iron +19075|544|45|5|26|37558.04|0.04|0.01|R|F|1995-01-22|1994-12-06|1995-02-12|NONE|REG AIR|ns are acros +19076|1003|39|1|30|27120.00|0.09|0.02|N|O|1997-02-15|1997-02-22|1997-03-01|COLLECT COD|REG AIR|ts are furiously furiou +19076|263|45|2|14|16285.64|0.00|0.08|N|O|1997-02-19|1997-02-24|1997-02-20|TAKE BACK RETURN|FOB|ang enticingly after the blithely fina +19076|1033|4|3|6|5604.18|0.03|0.01|N|O|1997-04-14|1997-03-07|1997-05-13|COLLECT COD|RAIL|ngside of the furiously bold accounts. +19076|412|13|4|13|17061.33|0.00|0.08|N|O|1997-02-16|1997-02-15|1997-03-02|COLLECT COD|REG AIR| special ideas haggle above the the +19076|1245|20|5|12|13754.88|0.02|0.07|N|O|1997-03-04|1997-02-06|1997-03-27|DELIVER IN PERSON|SHIP|lly slyly ironic pinto beans. +19077|1748|49|1|48|79187.52|0.07|0.08|N|O|1996-03-25|1996-02-27|1996-03-30|TAKE BACK RETURN|RAIL|ithely final packages. special pac +19077|1850|37|2|5|8759.25|0.08|0.04|N|O|1996-03-09|1996-03-07|1996-03-18|COLLECT COD|FOB|s. busy depos +19077|1145|18|3|4|4184.56|0.02|0.08|N|O|1996-02-19|1996-04-01|1996-02-29|NONE|MAIL|silent dependencies haggle furiously +19077|672|4|4|32|50325.44|0.08|0.02|N|O|1996-03-22|1996-03-29|1996-03-28|TAKE BACK RETURN|AIR|y. quickly pen +19078|93|44|1|14|13903.26|0.01|0.07|R|F|1994-10-31|1994-09-01|1994-11-06|NONE|MAIL|c foxes will have to use finally. +19078|815|49|2|10|17158.10|0.07|0.02|A|F|1994-08-21|1994-09-07|1994-08-24|COLLECT COD|SHIP|ically final theodolites. brave hockey +19078|1556|97|3|34|49556.70|0.09|0.08|R|F|1994-08-15|1994-10-06|1994-09-14|COLLECT COD|AIR|ly silent packages at the blith +19078|1948|37|4|20|36998.80|0.08|0.07|A|F|1994-11-13|1994-09-04|1994-11-19|DELIVER IN PERSON|AIR|tes. ironic deposits wake +19079|562|63|1|14|20475.84|0.10|0.05|N|O|1998-05-13|1998-05-26|1998-05-20|TAKE BACK RETURN|REG AIR|ly ironic dolphins. ironically +19079|754|19|2|44|72809.00|0.10|0.04|N|O|1998-05-09|1998-05-25|1998-05-30|TAKE BACK RETURN|FOB|g blithely for the express theodolites. +19079|566|27|3|15|21998.40|0.05|0.04|N|O|1998-07-11|1998-04-26|1998-07-19|NONE|AIR|instructions. escapades wake slyly about th +19079|91|42|4|14|13875.26|0.00|0.02|N|O|1998-04-07|1998-05-03|1998-04-28|TAKE BACK RETURN|MAIL|se. final ideas wake. qui +19104|433|63|1|10|13334.30|0.09|0.02|R|F|1993-09-09|1993-10-05|1993-10-06|TAKE BACK RETURN|RAIL|ts after the fur +19104|1821|8|2|2|3445.64|0.10|0.08|A|F|1993-09-16|1993-10-31|1993-10-13|TAKE BACK RETURN|RAIL|ithely even accounts sublate +19104|82|33|3|10|9820.80|0.05|0.04|A|F|1993-11-06|1993-10-02|1993-11-14|NONE|TRUCK| quickly above the slyly regular pla +19104|501|32|4|20|28030.00|0.09|0.04|R|F|1993-09-21|1993-10-14|1993-10-13|NONE|SHIP|its boost doggedly pendi +19104|708|41|5|34|54695.80|0.05|0.07|R|F|1993-09-09|1993-11-02|1993-09-21|NONE|AIR|fily regular deposits. quickly final pinto +19104|546|37|6|20|28930.80|0.10|0.04|R|F|1993-09-29|1993-09-29|1993-10-16|TAKE BACK RETURN|SHIP|t. ruthless deposits kindle furiousl +19105|1539|40|1|14|20167.42|0.07|0.03|R|F|1995-01-27|1994-12-31|1995-02-26|DELIVER IN PERSON|AIR|onic theodolites wake furious +19105|1766|51|2|48|80052.48|0.01|0.00|A|F|1995-01-28|1994-12-18|1995-02-01|TAKE BACK RETURN|TRUCK|ut the foxes kin +19105|1435|75|3|25|33410.75|0.07|0.02|R|F|1995-01-10|1994-12-09|1995-01-20|TAKE BACK RETURN|AIR|foxes haggle. regular, even asy +19106|281|36|1|6|7087.68|0.07|0.04|N|O|1995-07-31|1995-05-31|1995-08-24|COLLECT COD|SHIP|ipliers. reque +19106|1113|22|2|32|32451.52|0.00|0.05|A|F|1995-05-08|1995-05-25|1995-05-25|NONE|REG AIR| carefully above the carefully spec +19107|1155|92|1|40|42246.00|0.10|0.01|N|O|1997-10-29|1997-08-12|1997-11-04|TAKE BACK RETURN|FOB|riously express, unusual +19107|769|34|2|46|76808.96|0.10|0.08|N|O|1997-07-29|1997-09-22|1997-08-15|DELIVER IN PERSON|REG AIR|r theodolites haggle carefull +19108|335|92|1|48|59295.84|0.02|0.07|N|O|1996-01-22|1996-01-12|1996-02-07|DELIVER IN PERSON|FOB|blithely express instructions. +19108|142|21|2|18|18758.52|0.05|0.06|N|O|1996-02-07|1996-01-15|1996-03-04|TAKE BACK RETURN|FOB|quests mold fluffily special, ironic +19108|296|24|3|23|27514.67|0.04|0.00|N|O|1995-11-25|1995-12-12|1995-12-23|NONE|MAIL|ironic excuses. blithely +19108|546|7|4|21|30377.34|0.06|0.01|N|O|1995-11-01|1995-12-07|1995-11-16|COLLECT COD|REG AIR|st the regula +19109|1396|73|1|1|1297.39|0.03|0.05|R|F|1992-11-11|1992-10-15|1992-11-20|NONE|SHIP| fluffily regular tithes. u +19109|1802|46|2|10|17038.00|0.07|0.08|A|F|1992-11-16|1992-11-09|1992-11-30|TAKE BACK RETURN|RAIL|eposits ha +19110|1950|83|1|21|38890.95|0.05|0.08|N|O|1996-07-16|1996-08-02|1996-08-04|COLLECT COD|AIR|ways along the slyly regular p +19110|187|14|2|38|41312.84|0.07|0.00|N|O|1996-10-12|1996-07-18|1996-10-29|NONE|SHIP| carefully idly +19111|340|25|1|45|55815.30|0.05|0.08|R|F|1995-01-30|1994-12-29|1995-02-21|NONE|MAIL|on the blithely regular accounts detect +19111|797|98|2|27|45840.33|0.02|0.02|R|F|1995-01-22|1994-11-22|1995-01-31|NONE|AIR|kages wake. slyly special +19111|1916|61|3|48|87259.68|0.08|0.04|R|F|1995-01-04|1994-12-04|1995-01-09|NONE|TRUCK|y. fluffily pending requests need to haggle +19111|166|93|4|26|27720.16|0.02|0.04|A|F|1995-01-26|1994-12-14|1995-02-14|NONE|AIR|le. slyly reg +19111|579|70|5|44|65101.08|0.01|0.00|R|F|1994-11-12|1994-11-14|1994-11-22|NONE|FOB|s. express, unusual excuses ca +19111|103|30|6|2|2006.20|0.10|0.00|R|F|1994-12-21|1994-12-05|1995-01-13|NONE|AIR|ly final packages wake stealth +19136|1787|88|1|14|23642.92|0.01|0.06|R|F|1993-11-03|1993-09-27|1993-11-28|COLLECT COD|RAIL|usly after t +19137|1215|90|1|13|14510.73|0.02|0.00|N|O|1995-12-10|1995-11-10|1996-01-03|DELIVER IN PERSON|RAIL|into beans wake furiously about the blithel +19137|188|89|2|32|34821.76|0.08|0.08|N|O|1995-10-01|1995-10-08|1995-10-31|DELIVER IN PERSON|AIR|sts solve slyly. ideas affix furiously +19137|950|85|3|23|42571.85|0.02|0.02|N|O|1995-11-23|1995-10-03|1995-12-22|TAKE BACK RETURN|MAIL|ly even theodolites promise after the bli +19138|770|67|1|5|8353.85|0.01|0.06|N|O|1995-11-30|1995-11-05|1995-12-06|COLLECT COD|TRUCK|the quickly even excuses. slyly close +19138|981|82|2|21|39521.58|0.02|0.06|N|O|1995-10-31|1995-10-12|1995-11-29|TAKE BACK RETURN|MAIL|ully special accounts. carefully unusual i +19138|926|61|3|48|87692.16|0.09|0.08|N|O|1995-12-24|1995-11-27|1996-01-12|TAKE BACK RETURN|TRUCK| are. carefully express asymptote +19138|1827|14|4|11|19017.02|0.07|0.01|N|O|1995-12-14|1995-10-30|1995-12-29|NONE|AIR|iously regular accounts. dependencies x-ray +19138|1777|62|5|12|20145.24|0.06|0.02|N|O|1995-10-23|1995-10-13|1995-10-24|NONE|AIR|bold dugouts sleep bl +19139|1981|14|1|12|22595.76|0.00|0.06|R|F|1993-12-17|1994-02-26|1993-12-26|DELIVER IN PERSON|AIR|lites. silent accou +19139|1752|53|2|47|77726.25|0.09|0.06|R|F|1994-01-13|1994-01-12|1994-02-01|DELIVER IN PERSON|REG AIR|nusual warhors +19139|205|6|3|30|33156.00|0.04|0.05|A|F|1994-03-18|1994-03-01|1994-04-13|DELIVER IN PERSON|AIR|gular pinto beans affix even accounts. +19139|1908|97|4|34|61536.60|0.06|0.00|A|F|1994-01-24|1994-01-03|1994-01-29|DELIVER IN PERSON|TRUCK|unts past +19140|1347|62|1|48|59920.32|0.02|0.01|A|F|1994-10-02|1994-12-07|1994-10-31|DELIVER IN PERSON|MAIL|he carefully final pl +19140|1697|80|2|37|59151.53|0.07|0.00|A|F|1994-10-22|1994-12-19|1994-10-23|TAKE BACK RETURN|FOB|y carefully regular acco +19140|1448|88|3|11|14843.84|0.08|0.03|A|F|1994-10-25|1994-12-08|1994-11-10|NONE|RAIL|express packages maintain furiously. bold +19140|1787|14|4|25|42219.50|0.05|0.01|A|F|1994-10-16|1994-11-11|1994-11-07|NONE|AIR| unwind quickly pending packa +19140|1833|34|5|44|76332.52|0.03|0.06|A|F|1994-12-23|1994-10-31|1994-12-27|TAKE BACK RETURN|TRUCK|o beans was; carefully p +19140|669|32|6|24|37671.84|0.00|0.07|A|F|1994-11-18|1994-12-26|1994-12-14|DELIVER IN PERSON|FOB| final instructions wake carefully spe +19141|1622|5|1|2|3047.24|0.08|0.04|R|F|1993-01-19|1992-12-07|1993-01-26|TAKE BACK RETURN|AIR|to beans. special reque +19141|1253|91|2|12|13851.00|0.00|0.05|A|F|1992-12-18|1993-01-07|1993-01-13|COLLECT COD|AIR|of the final accounts. regular p +19142|554|85|1|13|18909.15|0.08|0.04|N|O|1996-11-05|1996-12-02|1996-11-22|DELIVER IN PERSON|REG AIR|s about the requests +19142|9|85|2|16|14544.00|0.05|0.04|N|O|1996-12-10|1996-12-17|1997-01-09|NONE|AIR| haggle carefully carefully express id +19142|1586|27|3|45|66941.10|0.04|0.06|N|O|1996-10-05|1996-12-04|1996-11-01|COLLECT COD|MAIL|d tithes nag quickly +19142|395|80|4|45|58292.55|0.04|0.04|N|O|1996-12-23|1996-11-23|1997-01-22|NONE|RAIL|ites after t +19142|544|5|5|30|43336.20|0.05|0.01|N|O|1996-12-24|1996-11-13|1997-01-02|DELIVER IN PERSON|FOB|to beans boost. iron +19142|740|41|6|44|72192.56|0.00|0.08|N|O|1997-01-12|1996-11-04|1997-02-05|TAKE BACK RETURN|FOB|ate enticingly express r +19142|177|56|7|29|31237.93|0.00|0.05|N|O|1996-11-10|1996-10-28|1996-11-21|NONE|RAIL|phs. furiously thi +19143|1796|81|1|2|3395.58|0.02|0.05|R|F|1993-03-04|1992-12-27|1993-04-02|COLLECT COD|AIR|phins wake furiously +19143|1096|97|2|17|16950.53|0.07|0.03|A|F|1992-12-09|1992-12-27|1992-12-22|DELIVER IN PERSON|TRUCK| wake. carefully express depo +19143|1764|91|3|20|33315.20|0.04|0.02|A|F|1993-02-27|1993-01-26|1993-03-28|TAKE BACK RETURN|MAIL|quests. furiously regular requests are. i +19143|1384|99|4|5|6426.90|0.00|0.05|A|F|1993-01-14|1992-12-16|1993-01-28|TAKE BACK RETURN|FOB|uickly express ideas along +19143|977|12|5|22|41315.34|0.06|0.05|R|F|1993-02-14|1992-12-25|1993-03-03|COLLECT COD|AIR|inal deposits ab +19143|559|60|6|9|13135.95|0.10|0.07|A|F|1992-11-06|1992-12-05|1992-12-06|TAKE BACK RETURN|RAIL|inal packages. carefully even re +19168|1432|11|1|34|45336.62|0.05|0.02|N|O|1997-03-08|1997-04-09|1997-04-02|COLLECT COD|SHIP|fully final platelets wake slyly alo +19168|866|100|2|44|77741.84|0.05|0.02|N|O|1997-04-03|1997-04-29|1997-04-29|DELIVER IN PERSON|SHIP|iously final +19169|893|60|1|25|44847.25|0.05|0.03|N|O|1997-05-23|1997-06-11|1997-06-01|TAKE BACK RETURN|TRUCK| ideas nag slyly about the carefully +19169|142|43|2|21|21884.94|0.02|0.07|N|O|1997-06-08|1997-07-27|1997-07-03|TAKE BACK RETURN|AIR| ironic instructions. quickly bold sau +19169|124|77|3|26|26627.12|0.10|0.05|N|O|1997-07-18|1997-07-04|1997-07-22|NONE|REG AIR|lly even instruc +19169|100|76|4|36|36003.60|0.08|0.00|N|O|1997-09-05|1997-07-09|1997-09-14|DELIVER IN PERSON|MAIL|lyly even fo +19169|1061|32|5|15|14430.90|0.07|0.06|N|O|1997-05-11|1997-06-16|1997-05-15|TAKE BACK RETURN|RAIL|ending deposits sleep slyly. regular dug +19169|292|93|6|48|57229.92|0.00|0.08|N|O|1997-05-19|1997-07-27|1997-06-10|DELIVER IN PERSON|REG AIR|uests. regular accoun +19169|1476|55|7|43|59231.21|0.03|0.06|N|O|1997-07-27|1997-06-11|1997-08-08|TAKE BACK RETURN|MAIL|riously pending pinto beans use. +19170|1044|45|1|2|1890.08|0.05|0.04|N|O|1997-08-22|1997-06-12|1997-09-18|COLLECT COD|TRUCK| pinto beans cajole carefully +19170|1860|4|2|2|3523.72|0.05|0.06|N|O|1997-06-16|1997-06-23|1997-07-15|TAKE BACK RETURN|SHIP|uriously across +19170|1965|98|3|21|39206.16|0.02|0.01|N|O|1997-06-04|1997-07-21|1997-07-03|DELIVER IN PERSON|RAIL|uickly along the blithely speci +19171|1398|99|1|35|45478.65|0.08|0.07|N|O|1996-11-28|1996-10-27|1996-12-11|NONE|FOB|yly pending asymptotes. +19171|962|97|2|13|24218.48|0.09|0.07|N|O|1996-11-16|1996-10-17|1996-11-20|NONE|MAIL|pecial pains. regular, regular +19171|150|29|3|1|1050.15|0.09|0.00|N|O|1996-11-06|1996-09-24|1996-11-11|DELIVER IN PERSON|REG AIR|deas. deposits are blithely. regula +19171|1436|37|4|18|24073.74|0.03|0.02|N|O|1996-10-19|1996-11-22|1996-11-09|DELIVER IN PERSON|AIR|g furiously unusual pinto beans. slyl +19171|640|72|5|43|66247.52|0.02|0.04|N|O|1996-09-08|1996-10-13|1996-09-24|DELIVER IN PERSON|TRUCK|players sleep slyly above the decoys +19172|1424|25|1|33|43738.86|0.09|0.07|N|O|1996-03-24|1996-03-25|1996-04-11|TAKE BACK RETURN|FOB|ously stealthy theodolites. slyly dogged re +19172|1846|76|2|24|41948.16|0.03|0.07|N|O|1996-05-17|1996-05-17|1996-05-27|DELIVER IN PERSON|TRUCK|es nag again +19172|912|15|3|15|27193.65|0.02|0.01|N|O|1996-03-13|1996-04-03|1996-03-30|DELIVER IN PERSON|FOB|e slyly furiou +19172|1408|9|4|37|48447.80|0.05|0.01|N|O|1996-04-10|1996-04-03|1996-04-16|TAKE BACK RETURN|RAIL| even deposits use never +19172|809|76|5|34|58133.20|0.00|0.03|N|O|1996-03-21|1996-05-20|1996-03-27|TAKE BACK RETURN|SHIP|accounts h +19172|1406|46|6|28|36607.20|0.08|0.07|N|O|1996-04-22|1996-05-15|1996-05-12|DELIVER IN PERSON|REG AIR|ide of the th +19172|940|41|7|31|57069.14|0.07|0.03|N|O|1996-04-03|1996-04-07|1996-04-30|DELIVER IN PERSON|REG AIR| ironic theodolites nag furiously e +19173|1957|2|1|15|27884.25|0.10|0.03|N|O|1996-01-29|1996-01-13|1996-02-04|NONE|SHIP|riously final packages wak +19174|851|18|1|23|40292.55|0.03|0.03|R|F|1993-10-03|1993-08-31|1993-10-20|TAKE BACK RETURN|FOB|ans. ironic +19174|787|20|2|35|59072.30|0.00|0.06|R|F|1993-08-14|1993-10-09|1993-08-15|TAKE BACK RETURN|RAIL|lites. carefully regular asymptotes +19174|999|2|3|37|70299.63|0.04|0.07|A|F|1993-11-05|1993-08-21|1993-12-01|NONE|MAIL|t blithely against the slyly final forge +19174|1232|33|4|49|55528.27|0.05|0.02|A|F|1993-10-29|1993-08-23|1993-11-09|TAKE BACK RETURN|AIR|ress packages boost blithe +19174|1386|87|5|1|1287.38|0.04|0.05|R|F|1993-10-21|1993-09-04|1993-11-08|NONE|RAIL|fully special accounts cajole +19174|166|45|6|43|45844.88|0.04|0.04|R|F|1993-10-06|1993-08-21|1993-11-03|COLLECT COD|MAIL|s sleep. regular frays detect pending +19174|1396|97|7|33|42813.87|0.05|0.07|A|F|1993-09-16|1993-10-09|1993-09-17|COLLECT COD|REG AIR|foxes. carefully regular warthogs +19175|11|62|1|36|32796.36|0.05|0.07|R|F|1994-10-21|1994-10-02|1994-11-11|TAKE BACK RETURN|AIR|y ironic requests. stealthily regular reque +19175|471|1|2|5|6857.35|0.09|0.03|R|F|1994-12-07|1994-11-15|1994-12-26|TAKE BACK RETURN|FOB|ests nag. thinly silent a +19175|1084|90|3|14|13791.12|0.09|0.07|R|F|1994-10-20|1994-10-21|1994-11-15|COLLECT COD|AIR|e packages. slyly pending de +19175|453|12|4|42|56844.90|0.07|0.08|A|F|1994-12-16|1994-11-11|1995-01-07|TAKE BACK RETURN|AIR|ly above the fluffily ruthless requests. +19175|112|65|5|26|26314.86|0.09|0.00|R|F|1994-10-25|1994-09-25|1994-11-24|DELIVER IN PERSON|AIR| ironic ideas. quickly express the +19175|359|16|6|6|7556.10|0.01|0.06|R|F|1994-09-10|1994-10-09|1994-09-29|NONE|SHIP|sits haggle blithely. carefully unusual +19175|1192|1|7|11|12025.09|0.10|0.02|R|F|1994-08-25|1994-10-28|1994-09-07|TAKE BACK RETURN|TRUCK|al packages. quiet +19200|882|49|1|35|62400.80|0.04|0.02|N|O|1997-09-23|1997-08-27|1997-10-23|TAKE BACK RETURN|REG AIR|furiously unusual foxes lose quickly. regu +19200|1458|37|2|48|65253.60|0.10|0.05|N|O|1997-08-06|1997-08-26|1997-08-17|COLLECT COD|MAIL| epitaphs engage. furiously u +19200|946|49|3|49|90500.06|0.08|0.08|N|O|1997-11-02|1997-09-07|1997-11-15|DELIVER IN PERSON|AIR| regular deposits dazzle even, p +19201|1753|80|1|41|67844.75|0.07|0.06|N|O|1996-08-21|1996-07-09|1996-09-15|TAKE BACK RETURN|RAIL|ts haggle. furio +19201|1198|35|2|50|54959.50|0.07|0.03|N|O|1996-09-15|1996-08-07|1996-10-15|COLLECT COD|REG AIR| slyly. special, special foxes nag slyl +19201|1837|24|3|20|34776.60|0.06|0.01|N|O|1996-09-02|1996-08-10|1996-09-17|COLLECT COD|FOB| furiously special sauternes. slyly pend +19201|291|92|4|19|22634.51|0.04|0.03|N|O|1996-08-08|1996-08-30|1996-08-23|NONE|SHIP|, final platelets haggle +19201|925|26|5|36|65733.12|0.04|0.05|N|O|1996-08-05|1996-07-11|1996-08-12|COLLECT COD|RAIL|arefully around the fluffily +19201|607|70|6|14|21106.40|0.05|0.00|N|O|1996-08-23|1996-08-18|1996-08-30|NONE|RAIL|ublate bold pa +19202|204|5|1|6|6625.20|0.05|0.04|N|O|1998-10-31|1998-09-16|1998-11-14|TAKE BACK RETURN|SHIP|deas maintain +19203|632|95|1|25|38315.75|0.00|0.07|N|O|1996-11-11|1996-10-19|1996-12-08|DELIVER IN PERSON|FOB|ar packages. +19203|1567|68|2|26|38182.56|0.01|0.01|N|O|1996-08-28|1996-10-17|1996-09-08|DELIVER IN PERSON|MAIL| even foxes affix after the foxes. even d +19203|299|100|3|5|5996.45|0.03|0.06|N|O|1996-11-26|1996-10-13|1996-12-01|COLLECT COD|SHIP|ironic requests. blithely ironic pl +19203|200|53|4|6|6601.20|0.10|0.06|N|O|1996-10-10|1996-09-07|1996-10-30|DELIVER IN PERSON|AIR|thely furiously enticing account +19204|1408|26|1|3|3928.20|0.09|0.08|R|F|1994-12-19|1994-11-05|1995-01-16|COLLECT COD|RAIL|ly bold deposits cajole s +19204|752|53|2|1|1652.75|0.00|0.04|A|F|1994-11-02|1994-11-14|1994-11-10|COLLECT COD|SHIP|inst the instructio +19204|375|4|3|45|57391.65|0.02|0.04|R|F|1994-12-28|1994-11-08|1995-01-07|TAKE BACK RETURN|FOB|symptotes. slowly pending ideas caj +19204|1682|83|4|13|20587.84|0.00|0.03|A|F|1994-09-23|1994-10-28|1994-10-01|TAKE BACK RETURN|FOB| bold inst +19204|1627|51|5|12|18343.44|0.05|0.07|A|F|1994-10-14|1994-11-29|1994-10-26|NONE|FOB|ages cajole along +19204|926|29|6|20|36538.40|0.08|0.06|A|F|1994-12-19|1994-11-13|1994-12-23|DELIVER IN PERSON|AIR|sentiments must haggle furiously re +19204|1931|64|7|21|38491.53|0.09|0.03|A|F|1994-11-17|1994-11-24|1994-12-04|NONE|FOB| carefully; quickly final depos +19205|1743|70|1|27|44407.98|0.07|0.04|R|F|1993-09-07|1993-10-25|1993-09-12|DELIVER IN PERSON|SHIP|ic, final packages +19205|1048|19|2|11|10439.44|0.01|0.03|A|F|1993-08-23|1993-10-15|1993-09-04|TAKE BACK RETURN|RAIL|ding, even dependencies wake a +19205|1435|14|3|23|30737.89|0.06|0.07|R|F|1993-10-25|1993-10-02|1993-11-17|COLLECT COD|TRUCK|thely express pinto beans. accoun +19205|1647|71|4|1|1548.64|0.07|0.04|R|F|1993-10-07|1993-09-18|1993-10-22|TAKE BACK RETURN|REG AIR|ely. carefully ironic packages haggl +19205|513|74|5|43|60780.93|0.06|0.04|R|F|1993-10-29|1993-09-30|1993-11-27|TAKE BACK RETURN|MAIL|ggle according to th +19205|1909|54|6|40|72436.00|0.05|0.08|A|F|1993-09-06|1993-09-17|1993-09-12|TAKE BACK RETURN|SHIP|pending requests x-ray bold, regular pla +19205|1062|98|7|20|19261.20|0.01|0.07|A|F|1993-08-12|1993-09-13|1993-08-25|NONE|SHIP|. slyly pending ideas should use blithely +19206|205|60|1|22|24314.40|0.01|0.07|A|F|1993-04-19|1993-05-08|1993-05-10|DELIVER IN PERSON|SHIP|fully ironic excuses. fluffily bo +19206|104|31|2|27|27110.70|0.05|0.06|A|F|1993-05-11|1993-06-19|1993-06-03|TAKE BACK RETURN|FOB|ts. furiously regular ideas cajole bli +19206|1212|87|3|13|14471.73|0.07|0.04|A|F|1993-07-04|1993-05-31|1993-07-30|NONE|MAIL|s. final packages serve carefully accordin +19206|165|92|4|49|52192.84|0.00|0.00|A|F|1993-06-24|1993-05-14|1993-07-06|COLLECT COD|SHIP| ideas wake regular pinto beans. e +19206|803|70|5|43|73263.40|0.06|0.05|A|F|1993-07-07|1993-05-14|1993-08-01|COLLECT COD|AIR| excuses alongside of the slow req +19207|1743|70|1|13|21381.62|0.09|0.04|A|F|1992-06-05|1992-06-02|1992-06-18|DELIVER IN PERSON|MAIL|l requests. slyly ir +19207|820|87|2|46|79157.72|0.09|0.02|A|F|1992-05-28|1992-04-27|1992-06-13|DELIVER IN PERSON|TRUCK|unusual accounts nag +19207|31|82|3|9|8379.27|0.03|0.00|R|F|1992-03-23|1992-05-22|1992-04-13|COLLECT COD|SHIP|ously slyly even deposits. furio +19207|532|33|4|16|22920.48|0.10|0.01|A|F|1992-05-10|1992-06-06|1992-05-30|DELIVER IN PERSON|MAIL|y pending dependencies. slow ideas along +19207|994|63|5|12|22739.88|0.10|0.08|R|F|1992-05-26|1992-04-15|1992-06-12|NONE|RAIL|e the ironic pinto beans. blithely +19207|1331|8|6|8|9858.64|0.08|0.03|A|F|1992-06-16|1992-04-24|1992-06-22|COLLECT COD|AIR|y furiously r +19207|1283|95|7|27|31975.56|0.08|0.06|R|F|1992-05-17|1992-06-09|1992-06-06|COLLECT COD|REG AIR|oze along the +19232|946|15|1|10|18469.40|0.03|0.02|R|F|1994-10-18|1994-09-19|1994-10-30|TAKE BACK RETURN|FOB|fully final +19232|1782|25|2|4|6735.12|0.05|0.02|R|F|1994-08-18|1994-08-27|1994-09-14|NONE|SHIP|nt deposit +19232|1359|98|3|35|44112.25|0.02|0.05|R|F|1994-09-16|1994-08-19|1994-10-09|DELIVER IN PERSON|AIR| carefully. slyly expre +19232|383|68|4|29|37218.02|0.10|0.02|A|F|1994-10-27|1994-09-15|1994-11-13|TAKE BACK RETURN|REG AIR|ress packages integrate carefully ex +19232|753|86|5|36|59535.00|0.01|0.07|R|F|1994-08-10|1994-10-03|1994-08-24|COLLECT COD|AIR|ies wake quic +19233|1880|24|1|4|7127.52|0.00|0.07|R|F|1994-12-30|1995-01-29|1995-01-02|TAKE BACK RETURN|RAIL|lites haggle fluffily bl +19234|1122|31|1|25|25578.00|0.01|0.06|A|F|1994-02-14|1994-04-20|1994-03-16|TAKE BACK RETURN|RAIL|ly among the even, pending +19234|420|21|2|8|10563.36|0.07|0.08|A|F|1994-04-24|1994-04-12|1994-05-19|DELIVER IN PERSON|AIR|y pending requests. carefully b +19234|348|77|3|48|59920.32|0.04|0.02|R|F|1994-02-27|1994-04-14|1994-03-21|DELIVER IN PERSON|REG AIR|ar, special packa +19234|1768|69|4|11|18367.36|0.09|0.08|A|F|1994-03-29|1994-03-29|1994-04-09|COLLECT COD|FOB| blithely even reques +19234|372|73|5|10|12723.70|0.05|0.02|A|F|1994-03-15|1994-03-09|1994-03-23|TAKE BACK RETURN|AIR|ctions wake against t +19234|1689|90|6|9|14316.12|0.03|0.01|R|F|1994-03-23|1994-02-28|1994-03-24|NONE|FOB|counts. slyly unusu +19235|940|9|1|3|5522.82|0.09|0.07|N|O|1996-06-22|1996-06-11|1996-06-23|NONE|SHIP|ackages sleep against the fluff +19235|213|14|2|48|53434.08|0.10|0.00|N|O|1996-06-18|1996-05-16|1996-06-19|DELIVER IN PERSON|SHIP|wake blith +19235|1298|99|3|16|19188.64|0.05|0.05|N|O|1996-04-22|1996-06-21|1996-04-30|COLLECT COD|REG AIR|inal instructions haggle after t +19235|1002|38|4|49|44247.00|0.01|0.05|N|O|1996-06-15|1996-06-21|1996-07-10|DELIVER IN PERSON|SHIP|ully across the special +19236|408|67|1|41|53644.40|0.05|0.01|N|O|1998-04-17|1998-03-16|1998-04-25|DELIVER IN PERSON|MAIL|eans about the careful +19236|1531|12|2|47|67328.91|0.02|0.05|N|O|1998-05-30|1998-04-17|1998-06-01|COLLECT COD|TRUCK|kly unusual instructions among the blith +19236|1963|96|3|28|52218.88|0.09|0.00|N|O|1998-05-20|1998-03-21|1998-05-30|DELIVER IN PERSON|FOB|refully special grouc +19236|1919|20|4|8|14567.28|0.04|0.06|N|O|1998-05-16|1998-03-08|1998-06-13|TAKE BACK RETURN|TRUCK| brave dependenc +19236|659|60|5|21|32752.65|0.07|0.04|N|O|1998-03-27|1998-03-13|1998-04-09|TAKE BACK RETURN|AIR|ording to t +19237|1108|45|1|36|36327.60|0.06|0.00|N|F|1995-06-08|1995-07-05|1995-06-20|NONE|MAIL|onic accounts; furiously pending dependenci +19237|74|50|2|13|12662.91|0.03|0.06|N|O|1995-07-13|1995-06-14|1995-07-17|NONE|MAIL|final packages run. ca +19237|285|67|3|50|59264.00|0.08|0.00|A|F|1995-04-22|1995-05-26|1995-05-09|COLLECT COD|AIR|ronic requests with the fluffily bold dep +19237|248|76|4|26|29854.24|0.01|0.06|R|F|1995-05-18|1995-05-13|1995-06-05|COLLECT COD|REG AIR| quickly. pinto be +19237|1318|19|5|40|48772.40|0.04|0.04|R|F|1995-05-25|1995-06-16|1995-06-01|COLLECT COD|TRUCK|s. bold, pending pinto +19237|1151|88|6|35|36825.25|0.01|0.00|N|O|1995-07-23|1995-07-02|1995-08-10|NONE|AIR|egular requests. bravely exp +19238|725|22|1|41|66654.52|0.08|0.02|N|O|1997-04-05|1997-05-16|1997-04-15|DELIVER IN PERSON|FOB|the requests. blithely regular +19238|1189|26|2|35|38156.30|0.01|0.06|N|O|1997-05-28|1997-04-21|1997-05-30|NONE|REG AIR|c depths. pending, pending es +19238|1216|28|3|43|48040.03|0.09|0.06|N|O|1997-06-06|1997-05-25|1997-06-21|COLLECT COD|RAIL|he slyly special requests; i +19238|1580|1|4|33|48892.14|0.09|0.00|N|O|1997-04-25|1997-04-22|1997-04-29|TAKE BACK RETURN|SHIP|ccounts-- pending pinto beans +19238|45|71|5|37|34966.48|0.09|0.06|N|O|1997-03-28|1997-05-14|1997-04-22|TAKE BACK RETURN|FOB|pecial notornis sleep slyly. bl +19239|1675|76|1|13|20496.71|0.06|0.07|N|O|1996-08-18|1996-06-28|1996-09-02|NONE|AIR|te furiously b +19239|298|26|2|28|33552.12|0.07|0.06|N|O|1996-08-01|1996-06-29|1996-08-20|COLLECT COD|FOB|r dolphins haggle quickly final pac +19264|874|74|1|46|81644.02|0.09|0.03|N|O|1995-10-16|1995-12-18|1995-11-13|DELIVER IN PERSON|MAIL|along the final, ironic deposits; caref +19264|517|78|2|43|60952.93|0.04|0.02|N|O|1996-01-11|1995-12-28|1996-02-03|DELIVER IN PERSON|SHIP| according to the bold, fi +19264|1183|56|3|8|8673.44|0.02|0.06|N|O|1995-10-14|1995-11-22|1995-10-31|NONE|MAIL| slyly regular sauternes wake +19264|1825|69|4|21|36263.22|0.04|0.02|N|O|1995-12-13|1995-11-23|1995-12-17|DELIVER IN PERSON|RAIL|e instructions +19264|1037|43|5|11|10318.33|0.08|0.04|N|O|1996-01-21|1995-11-22|1996-02-01|NONE|REG AIR|y even req +19264|231|86|6|24|27149.52|0.04|0.05|N|O|1996-01-21|1995-12-18|1996-01-30|DELIVER IN PERSON|FOB|ully final Tire +19265|1488|67|1|50|69474.00|0.07|0.08|N|O|1997-03-24|1997-02-15|1997-04-23|TAKE BACK RETURN|FOB|he slyly bold theo +19265|604|36|2|30|45138.00|0.05|0.04|N|O|1997-04-09|1997-02-27|1997-04-14|TAKE BACK RETURN|REG AIR|lly final requests. express packages sle +19265|163|16|3|36|38273.76|0.01|0.05|N|O|1997-04-17|1997-01-17|1997-04-19|TAKE BACK RETURN|AIR|: carefully silent packages are accord +19265|97|73|4|25|24927.25|0.09|0.00|N|O|1997-03-06|1997-02-08|1997-03-30|TAKE BACK RETURN|RAIL| silent instructions use slyly iron +19265|1845|75|5|27|47164.68|0.06|0.06|N|O|1997-03-14|1997-02-12|1997-03-23|NONE|MAIL|ely ironic packages x-ray according to t +19265|1063|69|6|35|33742.10|0.05|0.05|N|O|1997-03-03|1997-02-15|1997-03-24|COLLECT COD|FOB|ions nag furiously along th +19266|1964|53|1|9|16793.64|0.00|0.04|N|O|1997-09-03|1997-10-08|1997-09-13|TAKE BACK RETURN|TRUCK|y even pinto bea +19266|585|76|2|9|13370.22|0.02|0.02|N|O|1997-11-03|1997-11-11|1997-11-27|TAKE BACK RETURN|TRUCK|totes. blithely ironic theo +19266|1840|41|3|32|55738.88|0.09|0.00|N|O|1997-10-10|1997-11-12|1997-11-08|DELIVER IN PERSON|AIR|. multipliers ar +19266|911|12|4|30|54357.30|0.07|0.06|N|O|1997-09-16|1997-09-28|1997-09-21|TAKE BACK RETURN|SHIP|the slyly even instructions. slyly even de +19266|930|99|5|35|64082.55|0.07|0.03|N|O|1997-08-23|1997-11-14|1997-08-30|DELIVER IN PERSON|RAIL|he furiously final foxes. fluffi +19267|1152|89|1|5|5265.75|0.07|0.06|N|O|1998-05-06|1998-05-19|1998-05-09|TAKE BACK RETURN|RAIL|ests haggle sile +19267|1165|38|2|13|13860.08|0.01|0.00|N|O|1998-04-24|1998-03-29|1998-05-01|TAKE BACK RETURN|SHIP|g to the asymptotes believe +19268|1677|60|1|19|29994.73|0.10|0.08|N|O|1998-04-19|1998-05-02|1998-05-17|DELIVER IN PERSON|MAIL|ss patterns wake quickly. caref +19268|1185|58|2|50|54309.00|0.10|0.00|N|O|1998-05-07|1998-06-06|1998-05-14|TAKE BACK RETURN|REG AIR|the evenly close +19268|224|25|3|34|38223.48|0.09|0.04|N|O|1998-07-22|1998-05-22|1998-08-06|NONE|MAIL| the escapades wake fluffily against th +19268|937|40|4|42|77193.06|0.03|0.03|N|O|1998-07-14|1998-06-04|1998-07-21|TAKE BACK RETURN|RAIL| bold accounts. special reque +19268|1381|96|5|23|29494.74|0.02|0.07|N|O|1998-07-13|1998-05-04|1998-07-29|COLLECT COD|REG AIR|ions. carefully enticing foxes alongsi +19269|132|33|1|18|18578.34|0.08|0.06|N|O|1998-10-25|1998-10-03|1998-10-28|DELIVER IN PERSON|MAIL|furiously across the furiously enti +19269|1328|43|2|22|27045.04|0.02|0.00|N|O|1998-10-17|1998-09-03|1998-11-01|COLLECT COD|SHIP|ly express foxes nag slyly. ironic de +19269|1285|97|3|42|49823.76|0.03|0.03|N|O|1998-09-13|1998-10-19|1998-10-03|TAKE BACK RETURN|TRUCK|ongside of the ironic, special ex +19270|87|88|1|40|39483.20|0.00|0.02|N|O|1997-11-29|1998-02-01|1997-12-15|DELIVER IN PERSON|SHIP|s are against the quickly e +19270|577|78|2|7|10342.99|0.08|0.01|N|O|1998-03-17|1997-12-20|1998-03-18|TAKE BACK RETURN|TRUCK|s cajole fluffily. ruthle +19270|190|69|3|32|34886.08|0.07|0.08|N|O|1997-11-28|1998-01-21|1997-12-26|COLLECT COD|AIR|y ironic instru +19270|1355|56|4|39|48997.65|0.04|0.02|N|O|1998-02-16|1997-12-30|1998-03-09|NONE|REG AIR|xes. furiousl +19270|1817|61|5|8|13750.48|0.06|0.08|N|O|1998-03-10|1998-01-28|1998-04-05|TAKE BACK RETURN|RAIL|carefully pending deposits sl +19270|318|19|6|46|56042.26|0.09|0.08|N|O|1998-03-11|1998-02-12|1998-03-26|DELIVER IN PERSON|RAIL|lly instructions. slyly final ac +19270|996|97|7|9|17072.91|0.02|0.02|N|O|1997-12-05|1998-02-16|1998-01-01|COLLECT COD|REG AIR|ing to the unusua +19271|310|11|1|26|31468.06|0.07|0.05|N|O|1997-03-04|1997-02-08|1997-03-10|TAKE BACK RETURN|MAIL|ual theodolites +19271|1484|63|2|25|34637.00|0.10|0.06|N|O|1997-03-04|1996-12-29|1997-03-16|TAKE BACK RETURN|SHIP|ckages besides +19271|431|90|3|26|34617.18|0.04|0.00|N|O|1996-12-23|1997-02-19|1997-01-13|TAKE BACK RETURN|SHIP|even packages wake slyly iro +19271|1229|4|4|27|30515.94|0.03|0.01|N|O|1997-03-11|1997-02-02|1997-03-12|COLLECT COD|REG AIR|ly regular pinto beans nag fluffily +19296|759|56|1|29|48132.75|0.05|0.01|A|F|1993-07-01|1993-05-27|1993-07-04|COLLECT COD|REG AIR|he unusual platelets. slyly +19296|909|10|2|18|32578.20|0.01|0.01|R|F|1993-05-28|1993-06-03|1993-06-25|TAKE BACK RETURN|AIR|ual platelet +19296|1718|3|3|32|51830.72|0.05|0.07|A|F|1993-06-10|1993-06-09|1993-06-17|COLLECT COD|AIR|t the bold deposits. fo +19296|1049|20|4|12|11400.48|0.09|0.02|R|F|1993-04-21|1993-06-11|1993-04-22|DELIVER IN PERSON|TRUCK|w foxes among the unusual packages caj +19296|789|54|5|16|27036.48|0.03|0.08|A|F|1993-07-11|1993-06-05|1993-07-15|COLLECT COD|REG AIR| haggle carefully a +19296|1196|33|6|23|25235.37|0.09|0.07|R|F|1993-06-03|1993-07-10|1993-06-09|TAKE BACK RETURN|RAIL|n ideas slee +19296|1328|5|7|26|31962.32|0.01|0.06|R|F|1993-07-24|1993-05-27|1993-08-13|TAKE BACK RETURN|RAIL|against the slyly dogged requ +19297|655|18|1|9|14000.85|0.01|0.07|N|O|1996-07-14|1996-07-02|1996-08-03|TAKE BACK RETURN|REG AIR|ructions haggle carefully among the r +19297|1695|37|2|21|33530.49|0.10|0.00|N|O|1996-06-03|1996-05-29|1996-06-06|DELIVER IN PERSON|REG AIR|furiously slyly special excuses. express, +19297|1731|58|3|42|68574.66|0.09|0.05|N|O|1996-05-17|1996-07-06|1996-05-29|COLLECT COD|TRUCK|nt instructio +19298|825|26|1|33|56952.06|0.02|0.01|N|O|1997-10-28|1997-10-09|1997-11-23|COLLECT COD|SHIP|es above the special +19298|1857|58|2|3|5276.55|0.06|0.04|N|O|1997-09-10|1997-11-18|1997-09-18|DELIVER IN PERSON|RAIL|gle fluffily ab +19298|1321|36|3|39|47670.48|0.01|0.08|N|O|1997-12-08|1997-09-21|1997-12-23|DELIVER IN PERSON|MAIL|nts. ironic asymptotes use sl +19298|205|33|4|42|46418.40|0.01|0.01|N|O|1997-09-12|1997-10-24|1997-09-29|TAKE BACK RETURN|SHIP|posits integrate fluffily q +19298|1871|58|5|27|47867.49|0.06|0.03|N|O|1997-10-20|1997-11-10|1997-10-24|COLLECT COD|FOB|oss the furiously bold requests. slyly +19299|765|66|1|33|54970.08|0.02|0.01|R|F|1994-07-03|1994-06-11|1994-07-14|TAKE BACK RETURN|MAIL|lar deposits. slyly final r +19299|1885|72|2|33|58967.04|0.07|0.08|A|F|1994-05-29|1994-05-12|1994-06-06|DELIVER IN PERSON|SHIP|leep. blithely regular foxes +19299|584|85|3|38|56414.04|0.05|0.05|A|F|1994-05-06|1994-04-19|1994-05-22|DELIVER IN PERSON|MAIL|ven courts. ironic asymptotes +19299|435|94|4|23|30714.89|0.01|0.05|A|F|1994-04-25|1994-05-17|1994-05-16|TAKE BACK RETURN|RAIL|ckages wake blithely amon +19299|1253|28|5|10|11542.50|0.02|0.06|R|F|1994-04-25|1994-06-13|1994-04-28|DELIVER IN PERSON|REG AIR|iously final +19299|219|74|6|49|54841.29|0.02|0.06|R|F|1994-04-29|1994-05-10|1994-05-02|NONE|TRUCK|the silent foxes affix among the slyly +19300|1203|41|1|9|9937.80|0.09|0.02|A|F|1995-02-07|1995-02-15|1995-02-17|COLLECT COD|SHIP|sleep quickly after the quickly regular +19300|1655|79|2|32|49812.80|0.04|0.05|A|F|1995-01-13|1995-02-12|1995-01-18|TAKE BACK RETURN|RAIL|across the even requests: final, regular +19300|1665|48|3|28|43866.48|0.08|0.07|A|F|1995-03-24|1995-03-16|1995-04-04|TAKE BACK RETURN|MAIL|s cajole slyly at t +19300|1120|93|4|2|2042.24|0.02|0.07|R|F|1995-01-12|1995-03-06|1995-01-28|DELIVER IN PERSON|SHIP|ng instructions against the ironi +19300|729|30|5|41|66818.52|0.06|0.07|A|F|1995-03-22|1995-02-18|1995-03-25|COLLECT COD|FOB|hely about the quic +19301|1582|3|1|10|14835.80|0.02|0.04|R|F|1992-04-14|1992-06-02|1992-04-22|TAKE BACK RETURN|REG AIR|ly express packages. car +19301|741|38|2|43|70594.82|0.01|0.01|A|F|1992-07-13|1992-06-21|1992-08-10|TAKE BACK RETURN|SHIP|lphins. sl +19301|1516|37|3|46|65205.46|0.05|0.04|R|F|1992-06-24|1992-05-03|1992-07-17|DELIVER IN PERSON|TRUCK|past the express, +19301|1180|17|4|1|1081.18|0.03|0.04|A|F|1992-07-31|1992-06-03|1992-08-24|DELIVER IN PERSON|SHIP|efully close excuses haggle slyly eve +19302|1193|66|1|49|53615.31|0.03|0.00|N|O|1998-10-19|1998-07-26|1998-10-29|TAKE BACK RETURN|REG AIR|e the furiously final requests. deposits sn +19302|1802|46|2|28|47706.40|0.01|0.01|N|O|1998-07-01|1998-08-16|1998-07-27|COLLECT COD|FOB|refully final packages +19302|457|87|3|23|31221.35|0.00|0.05|N|O|1998-10-24|1998-08-18|1998-11-16|TAKE BACK RETURN|MAIL|erns. blithely e +19303|1801|2|1|2|3405.60|0.07|0.04|A|F|1993-04-30|1993-03-14|1993-05-28|COLLECT COD|AIR|refully slyly ironic pinto beans. iro +19303|1816|60|2|42|72148.02|0.01|0.05|R|F|1993-04-23|1993-05-02|1993-05-22|DELIVER IN PERSON|AIR|uickly across the carefully bold account +19303|1788|31|3|28|47313.84|0.02|0.05|A|F|1993-02-11|1993-04-29|1993-03-01|NONE|MAIL|sual excuses cajole alongside of the s +19303|1708|51|4|9|14487.30|0.02|0.01|R|F|1993-02-10|1993-04-18|1993-02-21|TAKE BACK RETURN|SHIP|e against the regula +19303|216|17|5|22|24556.62|0.08|0.00|R|F|1993-02-11|1993-03-09|1993-02-23|TAKE BACK RETURN|RAIL|kly above +19328|87|88|1|9|8883.72|0.08|0.04|N|O|1997-11-25|1997-11-09|1997-12-24|COLLECT COD|AIR|pinto beans. idly ironic multiplie +19328|1579|60|2|48|71067.36|0.01|0.08|N|O|1998-01-02|1997-12-11|1998-01-19|DELIVER IN PERSON|RAIL|refully alongside +19328|1962|95|3|42|78286.32|0.06|0.08|N|O|1997-11-01|1997-11-18|1997-11-18|TAKE BACK RETURN|MAIL|nusual pinto beans wake slyly despite the +19328|559|90|4|27|39407.85|0.00|0.06|N|O|1997-12-26|1997-12-11|1998-01-07|NONE|TRUCK|into beans sleep slyly quickly even deposi +19329|1467|68|1|26|35579.96|0.10|0.02|R|F|1993-03-22|1993-04-20|1993-04-05|NONE|AIR|usual packages +19329|275|57|2|32|37608.64|0.06|0.01|R|F|1993-07-07|1993-05-07|1993-07-21|DELIVER IN PERSON|REG AIR|ccording to the packages. blith +19330|642|43|1|50|77132.00|0.06|0.00|N|O|1997-07-13|1997-06-04|1997-08-07|NONE|REG AIR|odolites integrate: blithely even packag +19330|817|51|2|34|58405.54|0.02|0.06|N|O|1997-07-09|1997-06-25|1997-08-08|COLLECT COD|MAIL|ids cajole slyly according to th +19330|1884|14|3|41|73221.08|0.09|0.04|N|O|1997-06-18|1997-07-04|1997-07-07|COLLECT COD|AIR|usual deposits. quickly regular requests h +19331|1233|34|1|40|45369.20|0.03|0.03|N|O|1997-08-05|1997-06-01|1997-08-13|DELIVER IN PERSON|REG AIR|lly bold platelets! express requ +19331|1183|20|2|15|16262.70|0.01|0.03|N|O|1997-08-06|1997-06-24|1997-08-07|TAKE BACK RETURN|RAIL| deposits. ironic, ironi +19332|22|48|1|45|41490.90|0.10|0.00|R|F|1992-05-14|1992-04-18|1992-05-25|TAKE BACK RETURN|REG AIR|uriously. iron +19332|616|48|2|44|66730.84|0.06|0.03|A|F|1992-03-14|1992-04-01|1992-03-24|DELIVER IN PERSON|MAIL|os. ironic dep +19332|804|4|3|48|81830.40|0.06|0.06|A|F|1992-05-11|1992-05-21|1992-05-27|TAKE BACK RETURN|MAIL|. carefully pending ideas +19332|1354|31|4|1|1255.35|0.08|0.03|R|F|1992-06-16|1992-04-10|1992-07-10|TAKE BACK RETURN|REG AIR|uffily special deposits. final, +19332|814|81|5|46|78881.26|0.05|0.00|A|F|1992-05-28|1992-04-16|1992-06-02|NONE|SHIP|pending excuses nag furiously depos +19333|819|19|1|10|17198.10|0.06|0.05|R|F|1993-06-19|1993-06-30|1993-07-07|TAKE BACK RETURN|REG AIR| excuses. slyl +19333|462|21|2|4|5449.84|0.07|0.02|A|F|1993-06-16|1993-06-30|1993-07-13|NONE|SHIP|s the carefully express +19333|781|78|3|43|72316.54|0.06|0.06|A|F|1993-05-14|1993-06-10|1993-05-23|COLLECT COD|RAIL| special theodolite +19333|1501|42|4|50|70125.00|0.07|0.05|R|F|1993-05-31|1993-06-05|1993-06-20|NONE|AIR|en ideas wake: silent, ironic platelet +19333|22|23|5|3|2766.06|0.09|0.04|R|F|1993-06-27|1993-05-29|1993-07-05|NONE|TRUCK|sly bold ideas. ironic +19333|517|8|6|7|9922.57|0.05|0.02|R|F|1993-07-02|1993-06-10|1993-07-18|TAKE BACK RETURN|MAIL|unts. fluffily p +19333|737|38|7|5|8188.65|0.04|0.03|R|F|1993-06-23|1993-05-31|1993-06-29|NONE|AIR|ges detect; blithely ironic acco +19334|1198|35|1|49|53860.31|0.06|0.06|N|O|1997-08-24|1997-10-04|1997-09-18|COLLECT COD|SHIP|latelets. quiet ideas nag +19334|404|34|2|29|37827.60|0.04|0.03|N|O|1997-10-12|1997-10-25|1997-11-06|NONE|AIR|e carefully pending pac +19334|644|7|3|29|44794.56|0.03|0.00|N|O|1997-08-28|1997-09-11|1997-09-25|COLLECT COD|MAIL|ructions wake acro +19335|708|9|1|4|6434.80|0.05|0.07|N|O|1997-10-26|1997-12-08|1997-11-09|DELIVER IN PERSON|TRUCK| silent somas +19335|1820|7|2|43|74038.26|0.05|0.04|N|O|1997-12-31|1997-10-31|1998-01-13|TAKE BACK RETURN|SHIP| above the even +19335|616|48|3|10|15166.10|0.03|0.07|N|O|1997-10-09|1997-11-29|1997-11-02|DELIVER IN PERSON|AIR|ly ironic theodolites use furiously reg +19335|519|80|4|48|68136.48|0.03|0.02|N|O|1997-12-20|1997-10-11|1997-12-25|COLLECT COD|REG AIR|. ironic accounts within the +19360|1356|71|1|28|35205.80|0.06|0.05|N|O|1996-12-30|1996-11-16|1997-01-16|NONE|SHIP|g the carefully even id +19360|1559|100|2|34|49658.70|0.03|0.00|N|O|1996-12-26|1996-11-22|1997-01-12|TAKE BACK RETURN|REG AIR|deposits impress alongside of +19361|1294|95|1|17|20319.93|0.02|0.07|R|F|1992-11-28|1992-12-20|1992-12-06|TAKE BACK RETURN|TRUCK|structions. slyly silent requests promise +19361|1650|74|2|6|9309.90|0.10|0.06|A|F|1992-10-11|1992-12-10|1992-10-14|COLLECT COD|TRUCK|carefully ironic ideas. carefull +19361|1883|13|3|29|51761.52|0.06|0.03|R|F|1992-11-13|1992-12-06|1992-11-24|DELIVER IN PERSON|AIR|o the ironic, regular accounts hag +19361|1408|87|4|21|27497.40|0.05|0.00|A|F|1992-10-09|1992-11-07|1992-10-12|NONE|MAIL|ajole pinto beans. deposits +19361|1922|23|5|49|89372.08|0.06|0.07|R|F|1992-11-06|1992-11-11|1992-11-23|COLLECT COD|MAIL|he carefully even theodolites haggle fur +19361|1065|66|6|21|20287.26|0.10|0.01|A|F|1992-10-27|1992-11-04|1992-10-28|NONE|TRUCK|packages cajo +19361|498|57|7|37|51744.13|0.00|0.03|A|F|1992-11-18|1992-12-17|1992-12-15|DELIVER IN PERSON|TRUCK|uriously steal +19362|1145|82|1|49|51260.86|0.03|0.06|N|O|1997-10-07|1997-10-07|1997-10-30|TAKE BACK RETURN|AIR|ver permanent accounts haggle ironicall +19362|580|41|2|25|37014.50|0.08|0.02|N|O|1997-09-25|1997-10-09|1997-10-16|NONE|REG AIR|heodolites past t +19362|1323|62|3|6|7345.92|0.06|0.03|N|O|1997-09-02|1997-10-21|1997-09-30|TAKE BACK RETURN|SHIP| dependencies doubt sometimes a +19362|1408|26|4|12|15712.80|0.05|0.07|N|O|1997-10-30|1997-10-18|1997-11-18|TAKE BACK RETURN|TRUCK|accounts serve. ca +19363|1801|31|1|23|39164.40|0.00|0.05|N|O|1995-09-30|1995-09-17|1995-10-04|TAKE BACK RETURN|TRUCK|thely regular de +19363|35|86|2|4|3740.12|0.06|0.00|N|O|1995-07-25|1995-08-15|1995-08-03|TAKE BACK RETURN|MAIL|ly above the fluffily bo +19363|1790|91|3|35|59212.65|0.07|0.01|N|O|1995-10-24|1995-08-17|1995-10-27|TAKE BACK RETURN|AIR|ously regular instructi +19363|1629|30|4|26|39796.12|0.00|0.04|N|O|1995-10-26|1995-09-08|1995-10-27|TAKE BACK RETURN|AIR|hely silent acc +19363|908|11|5|38|68738.20|0.08|0.06|N|O|1995-09-06|1995-09-26|1995-09-16|NONE|AIR| of the express instr +19363|440|41|6|3|4021.32|0.01|0.00|N|O|1995-11-02|1995-08-05|1995-11-09|COLLECT COD|REG AIR|y final packages wake +19363|1521|42|7|47|66858.44|0.07|0.03|N|O|1995-10-21|1995-10-04|1995-11-13|COLLECT COD|SHIP|as. final, regular accounts haggle +19364|1435|14|1|17|22719.31|0.02|0.01|N|O|1997-10-26|1997-12-11|1997-11-16|COLLECT COD|AIR|eans. furiou +19364|695|89|2|32|51062.08|0.02|0.00|N|O|1998-01-09|1998-01-02|1998-01-30|TAKE BACK RETURN|SHIP|ages about the regular +19365|1866|67|1|31|54803.66|0.06|0.04|A|F|1995-04-15|1995-03-04|1995-05-14|DELIVER IN PERSON|FOB|enly unusual requests accordi +19365|322|51|2|26|31780.32|0.09|0.08|A|F|1995-04-25|1995-04-16|1995-05-20|NONE|MAIL|he quick packages. carefully iron +19365|1091|97|3|13|12897.17|0.05|0.02|A|F|1995-03-22|1995-03-30|1995-04-07|DELIVER IN PERSON|REG AIR|platelets sleep slyly realms. ironic inst +19365|906|7|4|38|68662.20|0.07|0.07|R|F|1995-03-29|1995-03-15|1995-04-02|TAKE BACK RETURN|TRUCK|olites. slyly +19366|969|4|1|48|89758.08|0.00|0.05|A|F|1992-08-27|1992-06-25|1992-09-05|TAKE BACK RETURN|RAIL|riously un +19366|449|50|2|47|63423.68|0.05|0.01|A|F|1992-06-01|1992-07-29|1992-06-25|NONE|FOB| special instruct +19367|1292|30|1|5|5966.45|0.05|0.08|R|F|1994-07-19|1994-07-07|1994-08-03|NONE|RAIL|posits: blithely ironic ideas sleep quiet +19367|498|99|2|14|19578.86|0.00|0.02|A|F|1994-05-07|1994-05-26|1994-05-17|NONE|RAIL|ffix. idle packages haggle blithely. even +19367|1842|43|3|31|54059.04|0.02|0.08|A|F|1994-05-21|1994-06-24|1994-06-07|DELIVER IN PERSON|AIR|slyly final theodolites abo +19392|586|17|1|4|5946.32|0.08|0.08|N|O|1997-03-17|1997-04-06|1997-03-29|TAKE BACK RETURN|MAIL|e quietly. instructions above the +19392|867|34|2|9|15910.74|0.03|0.04|N|O|1997-04-14|1997-03-21|1997-04-16|TAKE BACK RETURN|MAIL|eodolites. slyly final pla +19392|421|22|3|4|5285.68|0.08|0.08|N|O|1997-05-08|1997-03-16|1997-05-17|DELIVER IN PERSON|RAIL|rve daringly above +19393|1104|5|1|40|40204.00|0.05|0.07|A|F|1995-04-02|1995-03-26|1995-04-05|DELIVER IN PERSON|TRUCK|uietly bold requests. furiously regula +19394|1088|24|1|27|26705.16|0.02|0.08|R|F|1993-01-10|1993-03-19|1993-01-28|COLLECT COD|RAIL| slyly unusual deposits cajole sly +19394|439|69|2|12|16073.16|0.05|0.04|R|F|1993-04-09|1993-03-10|1993-05-09|NONE|MAIL|furiously across the thin the +19394|1946|91|3|13|24023.22|0.10|0.04|R|F|1993-01-10|1993-02-04|1993-01-16|DELIVER IN PERSON|AIR|dencies boost slyly. fluffily +19394|235|17|4|32|36327.36|0.09|0.03|R|F|1993-01-02|1993-02-05|1993-01-04|COLLECT COD|MAIL|the foxes nag ir +19394|1289|27|5|33|39279.24|0.05|0.08|R|F|1993-02-11|1993-03-25|1993-02-15|COLLECT COD|AIR|regular deposits. brave packages cajol +19395|1405|23|1|40|52256.00|0.09|0.07|N|O|1995-12-22|1995-11-01|1996-01-15|NONE|RAIL|e even, bold dolphins +19396|510|71|1|4|5642.04|0.01|0.00|N|O|1998-08-08|1998-09-04|1998-08-23|DELIVER IN PERSON|MAIL|x carefully. +19396|119|46|2|2|2038.22|0.09|0.02|N|O|1998-09-09|1998-09-03|1998-10-05|DELIVER IN PERSON|TRUCK|ns cajole at the furiously express packages +19396|1102|3|3|16|16049.60|0.04|0.03|N|O|1998-11-06|1998-10-07|1998-12-03|NONE|REG AIR| enticing requests upon the furiously iro +19396|67|93|4|10|9670.60|0.02|0.08|N|O|1998-09-20|1998-10-01|1998-10-14|COLLECT COD|SHIP|arefully sile +19396|250|78|5|9|10352.25|0.02|0.08|N|O|1998-09-07|1998-09-20|1998-09-29|TAKE BACK RETURN|AIR|the furiously i +19397|1512|93|1|33|46645.83|0.10|0.04|N|O|1997-08-24|1997-09-15|1997-09-21|DELIVER IN PERSON|FOB|nts; quickly blithe accounts brea +19397|615|78|2|7|10609.27|0.08|0.07|N|O|1997-11-12|1997-09-20|1997-12-11|COLLECT COD|REG AIR|ic packages haggle quickly aft +19397|1495|35|3|46|64238.54|0.04|0.01|N|O|1997-09-25|1997-09-23|1997-10-09|NONE|SHIP|ourts sleep. ac +19397|911|80|4|4|7247.64|0.06|0.00|N|O|1997-08-08|1997-09-07|1997-09-01|DELIVER IN PERSON|SHIP|ar foxes haggle express pac +19397|1680|81|5|14|22143.52|0.05|0.03|N|O|1997-11-08|1997-09-26|1997-12-02|DELIVER IN PERSON|MAIL|ts use slyly even +19398|917|18|1|29|52719.39|0.10|0.07|R|F|1994-10-06|1994-10-22|1994-10-25|TAKE BACK RETURN|REG AIR|e excuses. fluffily +19398|1201|2|2|37|40781.40|0.06|0.01|A|F|1994-10-03|1994-10-22|1994-10-05|TAKE BACK RETURN|RAIL|ic requests eat about the furiously even re +19398|695|89|3|31|49466.39|0.03|0.06|A|F|1994-09-29|1994-09-15|1994-10-20|NONE|MAIL|aggle quickly among the special reque +19398|661|24|4|23|35918.18|0.08|0.02|A|F|1994-10-10|1994-10-30|1994-10-23|DELIVER IN PERSON|REG AIR|ructions around the furiously pending the +19398|1916|61|5|30|54537.30|0.10|0.04|R|F|1994-11-25|1994-09-20|1994-11-28|TAKE BACK RETURN|AIR|lithely special +19399|410|11|1|4|5241.64|0.00|0.08|A|F|1994-04-06|1994-03-17|1994-05-01|NONE|SHIP|oxes nag among the ca +19399|235|90|2|42|47679.66|0.05|0.02|R|F|1994-02-17|1994-04-17|1994-02-19|COLLECT COD|RAIL|fix quickly +19399|1042|78|3|18|16974.72|0.04|0.05|A|F|1994-05-02|1994-03-05|1994-06-01|TAKE BACK RETURN|RAIL|special requests. blithely pending inst +19424|1603|86|1|2|3009.20|0.02|0.05|N|O|1995-07-31|1995-06-23|1995-08-12|COLLECT COD|SHIP|r requests. regula +19424|1780|65|2|12|20181.36|0.09|0.06|N|O|1995-07-26|1995-07-01|1995-08-25|NONE|REG AIR|ously fluffil +19424|638|39|3|23|35388.49|0.03|0.07|N|F|1995-06-15|1995-05-13|1995-06-20|NONE|TRUCK| fluffily bold packages. ironic instruc +19424|1370|47|4|37|47040.69|0.03|0.06|N|O|1995-07-07|1995-06-12|1995-07-12|DELIVER IN PERSON|AIR|refully furious t +19424|1267|68|5|7|8177.82|0.07|0.01|N|O|1995-07-27|1995-05-27|1995-08-15|NONE|REG AIR|theodolites sleep slyly amo +19424|822|56|6|30|51684.60|0.08|0.02|N|O|1995-08-05|1995-06-18|1995-08-17|COLLECT COD|TRUCK|ly unusual +19424|359|88|7|8|10074.80|0.07|0.06|N|F|1995-06-09|1995-06-11|1995-06-29|NONE|TRUCK|p slyly according to the final foxes; +19425|1182|83|1|45|48743.10|0.10|0.02|R|F|1992-11-24|1992-10-31|1992-11-29|DELIVER IN PERSON|REG AIR|cuses to the blithely final fox +19425|1300|12|2|16|19220.80|0.01|0.06|R|F|1993-01-24|1992-11-15|1993-01-30|NONE|MAIL| unwind. slyly unusual packages wak +19425|243|98|3|42|48016.08|0.10|0.05|A|F|1993-01-07|1992-10-29|1993-02-01|NONE|REG AIR|uests boost flu +19425|1483|62|4|17|23536.16|0.03|0.01|R|F|1992-10-19|1992-11-17|1992-10-25|NONE|TRUCK|carefully special foxes sleep alongsi +19426|1358|59|1|30|37780.50|0.05|0.05|N|O|1998-02-16|1998-01-17|1998-03-04|DELIVER IN PERSON|FOB|long the carefully +19426|1956|1|2|39|72460.05|0.05|0.05|N|O|1997-12-05|1998-02-05|1997-12-18|DELIVER IN PERSON|FOB|carefully along the final p +19426|1436|54|3|9|12036.87|0.09|0.07|N|O|1998-02-12|1998-01-20|1998-03-06|DELIVER IN PERSON|SHIP|es boost carefully dol +19426|402|90|4|29|37769.60|0.03|0.01|N|O|1998-03-01|1997-12-28|1998-03-18|TAKE BACK RETURN|MAIL|ccounts. furiously regular pac +19427|159|38|1|7|7414.05|0.06|0.05|N|O|1998-09-04|1998-07-15|1998-10-01|COLLECT COD|TRUCK|ven dependencies was fluffily f +19427|1623|47|2|26|39640.12|0.05|0.02|N|O|1998-09-11|1998-07-02|1998-09-20|COLLECT COD|MAIL| ruthlessly; ironic instructions slee +19427|1549|90|3|45|65274.30|0.05|0.02|N|O|1998-06-15|1998-07-05|1998-06-30|COLLECT COD|MAIL|es. quickly +19428|1817|4|1|26|44689.06|0.07|0.00|R|F|1993-06-22|1993-07-27|1993-07-02|COLLECT COD|SHIP|ironic somas haggle. dogged, e +19428|1038|44|2|11|10329.33|0.01|0.03|R|F|1993-06-05|1993-07-23|1993-06-07|NONE|RAIL| deposits are furio +19429|1140|41|1|44|45810.16|0.02|0.00|A|F|1994-09-29|1994-10-13|1994-09-30|TAKE BACK RETURN|TRUCK|blithely regular requests +19429|1382|21|2|18|23100.84|0.06|0.05|A|F|1994-10-12|1994-11-06|1994-10-13|DELIVER IN PERSON|REG AIR|y carefully thin tithes. final ideas h +19429|188|41|3|18|19587.24|0.03|0.07|R|F|1994-08-26|1994-11-20|1994-08-31|COLLECT COD|TRUCK|ctions. carefully even courts d +19429|1262|37|4|29|33734.54|0.05|0.08|R|F|1994-12-14|1994-09-24|1995-01-05|DELIVER IN PERSON|RAIL|deposits. requests are fluffily slyl +19429|1263|1|5|49|57048.74|0.03|0.08|A|F|1994-10-09|1994-11-09|1994-11-07|TAKE BACK RETURN|MAIL|special excuses solve +19429|764|97|6|20|33295.20|0.08|0.01|A|F|1994-08-31|1994-11-02|1994-09-09|DELIVER IN PERSON|AIR| quickly final pinto beans. +19430|707|72|1|1|1607.70|0.00|0.00|R|F|1994-01-22|1994-02-09|1994-02-16|DELIVER IN PERSON|REG AIR|cies are blithely +19430|1842|86|2|44|76728.96|0.00|0.01|R|F|1993-12-16|1994-01-31|1993-12-21|NONE|MAIL|ets. foxes +19430|868|69|3|30|53065.80|0.07|0.04|A|F|1994-02-11|1994-02-12|1994-02-18|TAKE BACK RETURN|AIR|pendencies. foxes nag quickly +19431|1315|16|1|36|43787.16|0.07|0.01|A|F|1994-08-09|1994-07-28|1994-08-26|NONE|RAIL|uffily unusu +19431|1685|27|2|19|30146.92|0.06|0.00|R|F|1994-07-11|1994-08-01|1994-07-20|COLLECT COD|AIR| the unusual deposits. packages cajole +19431|1585|6|3|33|49057.14|0.01|0.06|R|F|1994-08-06|1994-07-22|1994-08-20|TAKE BACK RETURN|FOB|dependencies. flu +19431|134|87|4|17|17580.21|0.04|0.03|A|F|1994-07-19|1994-07-04|1994-07-27|COLLECT COD|RAIL|bold foxes wake. ironic +19431|1467|46|5|20|27369.20|0.05|0.01|R|F|1994-08-18|1994-08-13|1994-09-10|TAKE BACK RETURN|TRUCK|ole blithely. carefully bold p +19456|1465|44|1|38|51925.48|0.05|0.01|N|O|1996-08-09|1996-09-25|1996-08-17|TAKE BACK RETURN|REG AIR|quickly bold requests! doggedly silent f +19456|1482|61|2|6|8300.88|0.06|0.04|N|O|1996-10-11|1996-09-10|1996-11-08|DELIVER IN PERSON|FOB| of the final, regular deposits af +19456|497|85|3|30|41924.70|0.02|0.06|N|O|1996-10-07|1996-09-23|1996-11-03|NONE|SHIP|ar requests cajole blit +19456|1177|50|4|41|44204.97|0.08|0.05|N|O|1996-10-26|1996-08-13|1996-11-13|NONE|AIR|es haggle above the fi +19456|1194|95|5|13|14237.47|0.03|0.00|N|O|1996-08-26|1996-09-17|1996-09-01|DELIVER IN PERSON|REG AIR|reach regular deposits. fluff +19456|594|55|6|50|74729.50|0.02|0.03|N|O|1996-08-06|1996-08-27|1996-08-15|DELIVER IN PERSON|AIR|slyly unusual ac +19457|435|23|1|25|33385.75|0.03|0.08|R|F|1994-07-16|1994-09-13|1994-08-06|COLLECT COD|RAIL|even foxes nod car +19457|1554|35|2|23|33477.65|0.04|0.04|R|F|1994-09-06|1994-10-07|1994-09-08|DELIVER IN PERSON|FOB|inal accounts nag slyly after the regu +19457|551|42|3|35|50804.25|0.04|0.00|R|F|1994-08-21|1994-08-26|1994-09-12|DELIVER IN PERSON|REG AIR|ic foxes. carefully even accounts n +19458|819|86|1|9|15478.29|0.04|0.02|N|O|1996-07-17|1996-07-28|1996-08-03|DELIVER IN PERSON|RAIL| accounts. ironic pinto beans +19458|1882|83|2|24|42813.12|0.06|0.01|N|O|1996-08-23|1996-06-27|1996-09-10|COLLECT COD|AIR|its believe furiously. carefully regular i +19458|1229|30|3|28|31646.16|0.00|0.01|N|O|1996-09-06|1996-06-27|1996-09-30|COLLECT COD|AIR|pliers engage across the foxes. furiously b +19458|1311|12|4|28|33944.68|0.09|0.07|N|O|1996-08-22|1996-07-07|1996-08-25|DELIVER IN PERSON|TRUCK|encies after the carefully express i +19458|1235|47|5|23|26133.29|0.03|0.05|N|O|1996-09-05|1996-07-16|1996-10-02|DELIVER IN PERSON|FOB|ms. evenly pendi +19458|1494|12|6|13|18141.37|0.03|0.05|N|O|1996-05-31|1996-08-18|1996-06-05|NONE|MAIL|ts. unusual, even ideas detect. blithely +19459|1586|87|1|33|49090.14|0.08|0.07|N|O|1996-10-20|1996-10-27|1996-11-09|NONE|AIR|l pinto beans. instructions haggle d +19460|1015|16|1|36|32976.36|0.01|0.03|N|O|1998-01-28|1998-02-27|1998-02-17|DELIVER IN PERSON|TRUCK|ress tithes. slyly regular d +19460|646|9|2|34|52585.76|0.02|0.00|N|O|1998-03-31|1998-02-18|1998-04-18|DELIVER IN PERSON|SHIP|es integrate. express, regular fox +19460|1508|9|3|33|46513.50|0.06|0.05|N|O|1998-03-16|1998-02-19|1998-04-10|COLLECT COD|RAIL|fily special deposits w +19460|1573|54|4|24|35389.68|0.05|0.07|N|O|1998-01-27|1998-03-11|1998-02-03|DELIVER IN PERSON|FOB|haggle slyly. carefully final requests n +19460|814|48|5|33|56588.73|0.08|0.03|N|O|1998-02-26|1998-03-09|1998-03-13|COLLECT COD|MAIL|y pending +19460|426|14|6|20|26528.40|0.05|0.02|N|O|1998-03-30|1998-03-06|1998-04-13|COLLECT COD|REG AIR|l deposits nag in place of the foxes. perma +19460|1920|53|7|31|56479.52|0.01|0.04|N|O|1998-02-28|1998-02-14|1998-03-10|TAKE BACK RETURN|FOB|deas. sly, special deposits use furious +19461|1868|69|1|18|31857.48|0.00|0.01|N|O|1998-09-06|1998-09-18|1998-09-12|NONE|FOB|egular theodolites. fluffily expres +19461|215|70|2|3|3345.63|0.09|0.01|N|O|1998-11-06|1998-09-12|1998-12-06|DELIVER IN PERSON|TRUCK|s about the furiou +19461|1534|35|3|33|47372.49|0.03|0.08|N|O|1998-11-18|1998-09-02|1998-12-13|COLLECT COD|REG AIR|uickly even ac +19461|920|89|4|48|87404.16|0.04|0.06|N|O|1998-08-16|1998-09-15|1998-09-06|COLLECT COD|FOB| requests. slyly +19461|569|60|5|44|64660.64|0.04|0.00|N|O|1998-11-05|1998-10-12|1998-11-30|TAKE BACK RETURN|MAIL|the deposits haggle after the ironic ins +19461|150|51|6|9|9451.35|0.10|0.07|N|O|1998-08-18|1998-09-16|1998-09-06|TAKE BACK RETURN|AIR|ngside of the slyly eve +19462|944|45|1|10|18449.40|0.09|0.02|N|O|1995-12-11|1995-11-10|1995-12-22|DELIVER IN PERSON|FOB| regular deposits wake i +19462|592|83|2|25|37314.75|0.09|0.01|N|O|1996-01-01|1995-11-26|1996-01-22|COLLECT COD|REG AIR|ffily ironic requests unwind according t +19462|1172|81|3|15|16097.55|0.08|0.08|N|O|1995-11-27|1995-10-22|1995-11-29|COLLECT COD|MAIL|xcuses do ha +19462|131|84|4|18|18560.34|0.01|0.04|N|O|1995-12-27|1995-11-23|1996-01-11|DELIVER IN PERSON|REG AIR|olites haggle carefully across the +19462|762|95|5|22|36580.72|0.07|0.08|N|O|1995-11-30|1995-11-28|1995-12-30|DELIVER IN PERSON|FOB| pinto beans sleep carefully bold, +19463|1377|54|1|9|11505.33|0.09|0.06|N|O|1996-05-26|1996-06-06|1996-06-24|TAKE BACK RETURN|RAIL|sits nag inside the fur +19488|471|72|1|47|64459.09|0.05|0.03|N|O|1998-10-28|1998-10-02|1998-11-26|DELIVER IN PERSON|MAIL|eodolites nag about the regular theo +19488|393|78|2|11|14227.29|0.03|0.02|N|O|1998-11-02|1998-10-06|1998-11-08|TAKE BACK RETURN|REG AIR|eposits along the slyly even theodolites +19488|699|31|3|25|39992.25|0.05|0.02|N|O|1998-09-06|1998-09-25|1998-09-18|NONE|AIR|ecial, thin accounts. furiously ev +19488|1299|100|4|29|34808.41|0.03|0.08|N|O|1998-07-13|1998-10-07|1998-07-29|NONE|RAIL|about the instructions. thinly +19488|1627|69|5|27|41272.74|0.04|0.01|N|O|1998-09-02|1998-09-18|1998-09-19|DELIVER IN PERSON|AIR| use carefully across the carefully +19488|794|95|6|43|72875.97|0.06|0.04|N|O|1998-10-30|1998-09-13|1998-11-15|TAKE BACK RETURN|TRUCK|aggle blithely special sheaves. ironic +19489|1390|67|1|46|59403.94|0.00|0.08|N|O|1998-06-11|1998-05-05|1998-06-23|DELIVER IN PERSON|REG AIR|ly pending deposits wake af +19489|1770|71|2|18|30091.86|0.07|0.01|N|O|1998-06-15|1998-05-23|1998-07-15|NONE|MAIL|unts sleep according t +19489|1948|93|3|25|46248.50|0.00|0.00|N|O|1998-05-08|1998-05-04|1998-05-23|DELIVER IN PERSON|FOB| accounts nag furiously above the +19489|420|50|4|33|43573.86|0.02|0.06|N|O|1998-07-15|1998-06-21|1998-07-17|TAKE BACK RETURN|FOB|ccounts wake among +19490|1332|9|1|43|53033.19|0.08|0.04|N|O|1996-11-18|1996-10-17|1996-11-23|COLLECT COD|SHIP| carefully final theodolit +19490|482|12|2|11|15207.28|0.08|0.08|N|O|1996-11-08|1996-10-31|1996-12-07|COLLECT COD|SHIP|e slyly pending theodolites. s +19490|1648|72|3|6|9297.84|0.00|0.01|N|O|1996-12-06|1996-09-30|1996-12-20|DELIVER IN PERSON|FOB|ly deposits use blithely slyly regular th +19491|553|14|1|19|27617.45|0.06|0.01|A|F|1993-12-01|1993-12-06|1993-12-13|COLLECT COD|FOB| even accounts use blithely blith +19492|100|51|1|20|20002.00|0.02|0.03|A|F|1994-03-24|1994-02-08|1994-04-02|COLLECT COD|FOB|ly unusual excuses do +19492|946|15|2|49|90500.06|0.10|0.04|A|F|1994-01-10|1994-03-06|1994-01-28|DELIVER IN PERSON|FOB|regular asymptotes are car +19492|670|33|3|36|56544.12|0.10|0.08|R|F|1994-03-07|1994-01-22|1994-03-21|NONE|RAIL|e carefully. f +19492|153|54|4|15|15797.25|0.07|0.08|R|F|1994-04-01|1994-02-07|1994-04-06|DELIVER IN PERSON|AIR|ctions haggle packages. packages acro +19492|1136|73|5|39|40448.07|0.02|0.00|R|F|1994-04-08|1994-02-14|1994-04-17|NONE|TRUCK|regular dolp +19492|584|45|6|41|60867.78|0.03|0.04|A|F|1994-02-09|1994-02-03|1994-02-22|NONE|RAIL|silent, ironic accounts cajole +19493|1430|9|1|22|29291.46|0.02|0.00|A|F|1994-05-13|1994-03-22|1994-05-22|COLLECT COD|TRUCK|boost. fluffily even accounts haggle +19493|1098|99|2|35|34968.15|0.05|0.05|A|F|1994-06-04|1994-03-11|1994-06-22|COLLECT COD|MAIL|riously ironic +19493|922|25|3|32|58333.44|0.10|0.05|R|F|1994-03-19|1994-04-20|1994-03-20|TAKE BACK RETURN|SHIP|hely ironic instructions: final, fi +19494|1144|45|1|36|37625.04|0.01|0.08|A|F|1993-03-04|1993-02-25|1993-04-02|NONE|REG AIR|regular, even accounts +19494|85|61|2|7|6895.56|0.09|0.07|A|F|1993-04-14|1993-03-26|1993-04-30|DELIVER IN PERSON|FOB|egular ideas are fluffily ironic dep +19495|1943|32|1|21|38743.74|0.09|0.06|N|O|1998-03-16|1998-03-24|1998-04-15|COLLECT COD|AIR|deposits. +19495|222|23|2|46|51622.12|0.05|0.08|N|O|1998-04-07|1998-04-17|1998-04-23|COLLECT COD|REG AIR|requests haggle fluffily across the carefu +19520|231|86|1|46|52036.58|0.04|0.05|R|F|1992-05-31|1992-06-25|1992-06-22|NONE|RAIL|ding to the regular, final deposits nag +19521|1489|29|1|26|36152.48|0.00|0.02|A|F|1995-03-18|1995-01-27|1995-04-08|TAKE BACK RETURN|SHIP|nts. carefully regular +19521|1204|42|2|36|39787.20|0.09|0.08|R|F|1995-01-05|1995-01-30|1995-01-19|DELIVER IN PERSON|AIR|s. regular +19521|1745|46|3|23|37875.02|0.10|0.01|R|F|1995-02-02|1995-01-23|1995-02-07|COLLECT COD|MAIL|st the furiously regular +19521|711|12|4|8|12893.68|0.10|0.03|R|F|1994-12-20|1995-01-23|1995-01-07|TAKE BACK RETURN|REG AIR|pains sleep across the +19522|1652|76|1|18|27965.70|0.05|0.01|A|F|1995-02-11|1994-12-29|1995-02-16|COLLECT COD|RAIL|silent deposits. +19522|1492|10|2|41|57133.09|0.09|0.00|R|F|1994-11-29|1995-01-14|1994-12-15|NONE|AIR|ickly. furiously ironic pinto beans wake pe +19523|897|97|1|9|16181.01|0.00|0.00|N|O|1996-02-15|1996-02-15|1996-02-20|NONE|FOB|s wake slyly even, fin +19523|679|42|2|11|17376.37|0.10|0.03|N|O|1996-03-11|1996-02-20|1996-03-18|TAKE BACK RETURN|MAIL| pending platelets after the blithely eve +19523|1185|94|3|13|14120.34|0.00|0.07|N|O|1995-12-22|1996-02-12|1995-12-26|TAKE BACK RETURN|TRUCK|yly unusual accounts +19523|1454|55|4|26|35241.70|0.10|0.01|N|O|1995-12-15|1996-01-10|1996-01-07|NONE|AIR|rls. blithely +19523|53|54|5|24|22873.20|0.03|0.06|N|O|1996-02-25|1996-01-10|1996-02-27|COLLECT COD|REG AIR|accounts sleep b +19524|1473|91|1|25|34361.75|0.08|0.08|R|F|1993-02-25|1993-02-16|1993-03-07|TAKE BACK RETURN|TRUCK|inal requests wake slyly furiously +19524|193|46|2|27|29516.13|0.02|0.05|A|F|1993-03-30|1993-03-30|1993-04-09|NONE|TRUCK| even accounts affix besides t +19524|1750|35|3|41|67721.75|0.10|0.06|A|F|1993-01-16|1993-04-08|1993-01-22|COLLECT COD|RAIL|ly alongside of the instructio +19524|1312|27|4|1|1213.31|0.02|0.07|R|F|1993-04-10|1993-03-09|1993-05-04|TAKE BACK RETURN|RAIL|ar platelets. carefully even req +19524|996|99|5|27|51218.73|0.10|0.06|R|F|1993-04-07|1993-03-08|1993-04-28|TAKE BACK RETURN|TRUCK|ggle carefully. bold foxes try t +19525|1097|98|1|41|40921.69|0.02|0.06|N|O|1998-03-15|1998-01-02|1998-04-13|TAKE BACK RETURN|AIR|ajole blithely express, e +19525|1182|83|2|47|50909.46|0.01|0.02|N|O|1998-03-05|1998-01-16|1998-03-13|TAKE BACK RETURN|REG AIR| promise fluffily carefully expr +19525|1337|38|3|23|28481.59|0.03|0.00|N|O|1998-01-12|1998-01-03|1998-01-20|DELIVER IN PERSON|FOB|yly unusual theo +19525|1678|79|4|11|17376.37|0.08|0.08|N|O|1998-02-19|1998-02-13|1998-03-12|DELIVER IN PERSON|SHIP|olites. accounts engage slyly r +19525|1721|22|5|37|60040.64|0.05|0.05|N|O|1998-03-11|1998-02-02|1998-03-22|NONE|TRUCK|ully across the regularly regu +19526|347|48|1|4|4989.36|0.02|0.06|A|F|1994-10-26|1994-12-20|1994-11-12|NONE|TRUCK|e slyly reg +19526|1761|4|2|9|14964.84|0.10|0.01|A|F|1994-11-18|1994-12-06|1994-12-08|NONE|RAIL|sly against the unusual +19527|894|28|1|27|48462.03|0.07|0.08|N|O|1996-07-21|1996-07-27|1996-08-11|DELIVER IN PERSON|AIR|al pinto beans hinder quickly pa +19527|1068|69|2|19|18412.14|0.10|0.02|N|O|1996-07-21|1996-08-09|1996-07-29|NONE|SHIP|nag quickly about the final depos +19527|635|67|3|30|46068.90|0.00|0.06|N|O|1996-07-20|1996-09-07|1996-08-11|DELIVER IN PERSON|AIR|requests. carefully iron +19527|219|47|4|28|31337.88|0.10|0.08|N|O|1996-06-10|1996-07-20|1996-06-27|DELIVER IN PERSON|MAIL| the carefully special packages. pending p +19552|342|71|1|36|44724.24|0.01|0.06|N|O|1996-11-24|1996-12-14|1996-12-16|NONE|RAIL|accounts grow +19553|433|21|1|28|37336.04|0.01|0.03|N|O|1997-05-05|1997-03-25|1997-05-27|DELIVER IN PERSON|MAIL|ironic ideas. theodolites cajole slyly +19553|333|90|2|28|34533.24|0.00|0.05|N|O|1997-03-02|1997-05-03|1997-03-23|DELIVER IN PERSON|FOB|ccording to the sp +19554|1506|47|1|26|36595.00|0.02|0.07|N|F|1995-06-13|1995-05-30|1995-06-20|NONE|FOB|ts haggle carefully. slyl +19554|1817|47|2|28|48126.68|0.09|0.01|A|F|1995-05-20|1995-06-21|1995-05-23|TAKE BACK RETURN|MAIL|special ideas. furiously pending deposits h +19554|1519|20|3|49|69604.99|0.05|0.07|N|F|1995-06-06|1995-07-14|1995-06-26|NONE|REG AIR| are blithel +19554|554|55|4|45|65454.75|0.09|0.00|A|F|1995-06-05|1995-06-09|1995-06-09|TAKE BACK RETURN|SHIP|eas engage furiously above the +19554|250|78|5|42|48310.50|0.07|0.07|N|F|1995-06-15|1995-07-14|1995-07-06|DELIVER IN PERSON|AIR|ges breach furiously requests. quic +19555|1189|62|1|50|54509.00|0.05|0.00|A|F|1993-02-25|1993-05-08|1993-02-26|TAKE BACK RETURN|FOB|ly bold packages +19555|80|6|2|11|10780.88|0.04|0.02|R|F|1993-06-09|1993-05-06|1993-06-26|NONE|AIR|e quickly carefully special do +19555|775|76|3|29|48597.33|0.06|0.05|A|F|1993-05-29|1993-04-11|1993-06-24|TAKE BACK RETURN|SHIP|eposits try to wake accor +19555|1092|98|4|29|28799.61|0.09|0.07|A|F|1993-03-14|1993-05-10|1993-04-07|NONE|REG AIR|e foxes. fluffily quiet deposits cajol +19555|1877|78|5|7|12452.09|0.01|0.02|R|F|1993-06-09|1993-04-19|1993-07-09|TAKE BACK RETURN|REG AIR|olites integrate. unusual depos +19555|179|6|6|18|19425.06|0.04|0.02|A|F|1993-05-31|1993-04-03|1993-06-10|NONE|RAIL|nal deposit +19556|1671|54|1|38|59761.46|0.10|0.04|A|F|1994-02-22|1994-03-14|1994-03-22|TAKE BACK RETURN|SHIP|usly regular request +19556|292|93|2|12|14307.48|0.00|0.02|A|F|1994-03-16|1994-03-18|1994-04-06|TAKE BACK RETURN|REG AIR|l accounts hagg +19556|1164|37|3|1|1065.16|0.04|0.08|R|F|1994-01-19|1994-03-27|1994-02-07|COLLECT COD|TRUCK|ect. blithely pending pains d +19556|677|40|4|29|45752.43|0.03|0.00|R|F|1994-02-23|1994-02-07|1994-03-25|DELIVER IN PERSON|TRUCK|y final depo +19556|1958|91|5|14|26039.30|0.02|0.08|A|F|1994-04-19|1994-02-18|1994-04-22|TAKE BACK RETURN|SHIP|oss the quickly unusual excuses caj +19556|1378|79|6|21|26866.77|0.03|0.03|A|F|1994-01-17|1994-03-14|1994-01-29|DELIVER IN PERSON|MAIL|olites. instructions sleep. slyly specia +19556|1900|30|7|31|55858.90|0.04|0.01|A|F|1994-01-24|1994-03-22|1994-01-29|COLLECT COD|AIR|equests sleep. slyly ironic platel +19557|1550|71|1|30|43546.50|0.04|0.08|N|O|1996-01-24|1995-11-30|1996-01-25|DELIVER IN PERSON|AIR|ly final courts. regular, +19557|674|68|2|19|29918.73|0.09|0.07|N|O|1995-12-05|1996-01-05|1995-12-25|TAKE BACK RETURN|RAIL|ites. final ideas +19557|242|43|3|47|53685.28|0.06|0.08|N|O|1995-11-20|1996-01-11|1995-12-16|DELIVER IN PERSON|REG AIR|ep furiously along the fluf +19557|371|28|4|45|57211.65|0.01|0.03|N|O|1996-01-06|1996-01-06|1996-01-23|TAKE BACK RETURN|SHIP| accounts over t +19557|1726|53|5|44|71619.68|0.01|0.03|N|O|1995-11-04|1996-01-29|1995-12-03|DELIVER IN PERSON|RAIL|elets wake. d +19557|1501|22|6|38|53295.00|0.07|0.00|N|O|1996-01-09|1996-01-15|1996-02-02|COLLECT COD|FOB|ic deposits cajo +19557|1529|30|7|18|25749.36|0.01|0.04|N|O|1996-02-29|1996-01-28|1996-03-10|DELIVER IN PERSON|REG AIR|quickly dogged forges. slyly regular requ +19558|182|35|1|34|36794.12|0.02|0.08|R|F|1995-04-25|1995-05-26|1995-04-26|TAKE BACK RETURN|SHIP| nag across the quickly regular ideas +19558|1532|33|2|2|2867.06|0.06|0.02|A|F|1995-04-24|1995-05-24|1995-05-04|NONE|AIR|ments. regular package +19558|1669|11|3|44|69109.04|0.10|0.04|A|F|1995-03-22|1995-04-24|1995-03-24|COLLECT COD|SHIP|he slyly express instructions +19559|542|33|1|44|63471.76|0.08|0.04|A|F|1993-08-07|1993-06-12|1993-08-25|TAKE BACK RETURN|REG AIR|ly regular accoun +19559|1369|84|2|46|58436.56|0.03|0.05|R|F|1993-05-20|1993-05-17|1993-06-18|NONE|REG AIR|leep blithely. careful +19559|1293|94|3|43|51354.47|0.02|0.04|A|F|1993-07-16|1993-06-27|1993-08-14|TAKE BACK RETURN|MAIL|ly even accounts: final deposits alon +19559|834|1|4|49|85006.67|0.03|0.06|A|F|1993-07-26|1993-06-24|1993-07-30|NONE|REG AIR|regular gifts maintain +19559|1275|87|5|34|39993.18|0.09|0.07|A|F|1993-08-05|1993-07-01|1993-08-27|TAKE BACK RETURN|RAIL|l asymptotes. slyly pending Ti +19584|1801|45|1|48|81734.40|0.09|0.07|R|F|1994-08-15|1994-06-05|1994-09-06|NONE|TRUCK|ss the regular requests. ironic +19584|1490|91|2|38|52876.62|0.03|0.05|A|F|1994-06-26|1994-06-17|1994-07-16|TAKE BACK RETURN|FOB|blithely regular requests run. regular, +19584|1546|87|3|15|21713.10|0.00|0.07|A|F|1994-05-11|1994-06-26|1994-05-21|DELIVER IN PERSON|TRUCK| slyly special platelets are +19585|1609|51|1|13|19637.80|0.03|0.06|N|O|1997-12-07|1997-10-07|1997-12-09|NONE|RAIL|ter the fo +19585|1799|84|2|25|42519.75|0.08|0.05|N|O|1997-11-28|1997-10-09|1997-12-26|NONE|SHIP|aggle against the slyly regular courts. flu +19585|1754|97|3|20|33115.00|0.05|0.08|N|O|1997-11-12|1997-11-05|1997-12-01|TAKE BACK RETURN|MAIL| grow carefully ironic i +19585|456|44|4|18|24416.10|0.00|0.04|N|O|1997-09-21|1997-11-03|1997-10-08|DELIVER IN PERSON|FOB|y quick dolphins. careful +19586|873|40|1|3|5321.61|0.04|0.04|R|F|1993-01-08|1993-01-07|1993-01-26|TAKE BACK RETURN|FOB|nts are against the carefully regul +19587|646|78|1|13|20106.32|0.09|0.05|A|F|1994-12-08|1994-11-08|1995-01-02|COLLECT COD|TRUCK|s! sometimes express platelets boo +19587|1383|84|2|19|24403.22|0.04|0.00|A|F|1994-11-14|1994-09-26|1994-12-08|TAKE BACK RETURN|FOB|telets. slyly unusual pinto be +19587|1726|27|3|35|56970.20|0.02|0.03|R|F|1994-12-02|1994-10-09|1994-12-31|DELIVER IN PERSON|FOB|ndencies are +19587|932|35|4|24|43990.32|0.02|0.01|R|F|1994-12-15|1994-10-13|1994-12-24|TAKE BACK RETURN|SHIP|arefully unusual packages hagg +19587|1591|92|5|20|29851.80|0.07|0.06|A|F|1994-09-10|1994-09-24|1994-09-25|COLLECT COD|TRUCK|s haggle across the furio +19587|1465|83|6|44|60124.24|0.00|0.06|R|F|1994-11-27|1994-10-29|1994-12-11|TAKE BACK RETURN|TRUCK|lent dependencies us +19588|302|59|1|15|18034.50|0.06|0.00|N|O|1995-07-19|1995-09-12|1995-07-25|NONE|FOB|p accounts. foxes above +19588|1716|59|2|45|72796.95|0.10|0.04|N|O|1995-06-25|1995-08-26|1995-06-30|TAKE BACK RETURN|SHIP|s are blithel +19588|1186|59|3|35|38051.30|0.06|0.07|N|O|1995-07-06|1995-08-21|1995-07-20|NONE|FOB|ajole express, fin +19588|175|2|4|27|29029.59|0.01|0.07|N|O|1995-10-07|1995-09-17|1995-10-30|DELIVER IN PERSON|TRUCK|sts are blithely. dependencies +19589|1120|29|1|21|21443.52|0.07|0.07|A|F|1992-11-23|1992-10-30|1992-12-05|DELIVER IN PERSON|FOB|ely. carefully pen +19589|746|11|2|2|3293.48|0.00|0.07|A|F|1992-11-24|1992-09-22|1992-11-29|TAKE BACK RETURN|SHIP| dependencies. quick +19589|1135|36|3|39|40409.07|0.03|0.08|R|F|1992-08-19|1992-09-28|1992-09-06|COLLECT COD|FOB|ding to the blithely regular t +19589|766|63|4|1|1666.76|0.00|0.07|A|F|1992-10-16|1992-11-08|1992-10-31|TAKE BACK RETURN|MAIL| bold epitaphs wake final, final acco +19590|833|67|1|13|22539.79|0.10|0.07|N|O|1998-02-15|1998-01-16|1998-02-20|COLLECT COD|TRUCK|fluffily special i +19591|899|100|1|22|39597.58|0.09|0.05|N|O|1998-05-19|1998-04-11|1998-05-23|DELIVER IN PERSON|REG AIR|press theodo +19591|392|93|2|26|33602.14|0.04|0.06|N|O|1998-03-15|1998-03-16|1998-03-23|COLLECT COD|TRUCK|final dependencies. blithely fin +19616|940|9|1|50|92047.00|0.03|0.02|N|O|1996-02-13|1996-02-10|1996-02-18|COLLECT COD|AIR|ge about the +19616|1198|71|2|13|14289.47|0.05|0.03|N|O|1996-02-19|1996-03-13|1996-03-19|COLLECT COD|FOB|jole blithely +19616|967|68|3|44|82190.24|0.07|0.05|N|O|1996-03-28|1996-03-16|1996-04-02|NONE|RAIL|en, silent instructions +19616|1006|77|4|17|15419.00|0.00|0.06|N|O|1996-03-27|1996-03-22|1996-04-22|DELIVER IN PERSON|TRUCK|s. theodolites alongside of the blithely +19616|1603|4|5|46|69211.60|0.04|0.03|N|O|1996-01-11|1996-02-25|1996-02-04|COLLECT COD|RAIL|ests cajole blithel +19616|901|4|6|38|68472.20|0.05|0.01|N|O|1996-01-24|1996-02-14|1996-01-27|TAKE BACK RETURN|REG AIR|al dependenc +19616|316|1|7|25|30407.75|0.06|0.04|N|O|1996-02-28|1996-01-23|1996-03-05|NONE|TRUCK|leep quickly along the regular theodolites +19617|354|39|1|45|56445.75|0.09|0.06|R|F|1992-03-05|1992-04-02|1992-03-10|TAKE BACK RETURN|SHIP|odolites wake c +19617|826|60|2|14|24175.48|0.03|0.06|A|F|1992-03-01|1992-02-23|1992-03-20|TAKE BACK RETURN|TRUCK|nts across the qui +19618|1741|68|1|36|59138.64|0.06|0.02|N|O|1998-07-17|1998-07-12|1998-07-23|COLLECT COD|AIR| pending ideas detect +19618|1624|48|2|29|44242.98|0.03|0.01|N|O|1998-09-03|1998-06-19|1998-09-25|NONE|RAIL|ow, even patterns wake +19618|652|46|3|38|59000.70|0.01|0.08|N|O|1998-06-11|1998-07-12|1998-06-16|NONE|AIR|ic foxes. foxes wake according t +19618|730|95|4|6|9784.38|0.09|0.06|N|O|1998-06-07|1998-07-18|1998-07-04|COLLECT COD|SHIP|even requests w +19619|1896|97|1|5|8989.45|0.01|0.02|N|O|1996-07-23|1996-08-08|1996-07-28|NONE|MAIL|s. furiously regular +19619|784|81|2|9|15163.02|0.05|0.06|N|O|1996-06-25|1996-07-27|1996-07-22|TAKE BACK RETURN|SHIP|encies snooze as +19619|1043|79|3|21|19824.84|0.09|0.00|N|O|1996-07-02|1996-07-26|1996-07-16|COLLECT COD|REG AIR|atelets according to the +19619|389|18|4|15|19340.70|0.08|0.07|N|O|1996-08-02|1996-08-08|1996-08-05|COLLECT COD|REG AIR|he carefull +19619|405|6|5|19|24802.60|0.08|0.05|N|O|1996-06-19|1996-08-03|1996-07-09|COLLECT COD|SHIP| carefully. blith +19620|61|37|1|20|19221.20|0.00|0.06|N|O|1997-06-12|1997-06-23|1997-06-24|DELIVER IN PERSON|MAIL|xes above the blithely close pac +19620|436|66|2|12|16037.16|0.07|0.03|N|O|1997-07-03|1997-06-12|1997-07-13|DELIVER IN PERSON|FOB|s print carefully blithely unusu +19620|491|92|3|33|45919.17|0.06|0.06|N|O|1997-06-15|1997-07-01|1997-07-01|DELIVER IN PERSON|MAIL|ent account +19620|1019|20|4|6|5520.06|0.06|0.07|N|O|1997-08-14|1997-06-30|1997-08-30|NONE|AIR|final notorni +19620|1941|30|5|25|46073.50|0.00|0.03|N|O|1997-08-01|1997-06-10|1997-08-28|TAKE BACK RETURN|AIR|yly. carefully idle d +19621|171|50|1|13|13925.21|0.00|0.05|N|O|1995-12-14|1995-10-15|1996-01-10|TAKE BACK RETURN|REG AIR|e carefully sometimes ironic +19621|929|32|2|15|27448.80|0.00|0.07|N|O|1995-11-09|1995-11-09|1995-11-12|DELIVER IN PERSON|MAIL|r the furiously express reques +19621|716|81|3|48|77602.08|0.06|0.06|N|O|1995-11-11|1995-12-02|1995-11-15|TAKE BACK RETURN|FOB|lar accounts. quickly thin reque +19621|939|42|4|27|49678.11|0.10|0.08|N|O|1996-01-03|1995-10-08|1996-01-12|TAKE BACK RETURN|FOB|ironic requests. e +19621|480|10|5|8|11043.84|0.05|0.05|N|O|1995-12-06|1995-11-08|1995-12-21|DELIVER IN PERSON|REG AIR|d excuses. quick +19621|1168|69|6|47|50250.52|0.08|0.04|N|O|1995-12-07|1995-10-11|1995-12-22|NONE|RAIL|al, silent platelets use through +19621|143|96|7|13|13560.82|0.04|0.05|N|O|1995-10-02|1995-11-17|1995-10-04|DELIVER IN PERSON|SHIP|telets. blithe +19622|1749|76|1|16|26411.84|0.00|0.02|N|O|1997-09-20|1997-10-31|1997-10-15|NONE|SHIP|ggle blithely slyly express th +19622|625|26|2|20|30512.40|0.08|0.08|N|O|1997-09-17|1997-09-29|1997-09-18|COLLECT COD|AIR|ously accounts: +19623|91|67|1|26|25768.34|0.10|0.00|A|F|1992-03-18|1992-03-28|1992-04-03|COLLECT COD|SHIP|inal pinto beans. regular packages after th +19623|369|54|2|15|19040.40|0.05|0.08|R|F|1992-05-31|1992-05-17|1992-06-24|NONE|REG AIR| regular ac +19623|1345|46|3|46|57331.64|0.02|0.07|A|F|1992-06-02|1992-03-28|1992-07-02|TAKE BACK RETURN|MAIL|nding idea +19623|1272|73|4|1|1173.27|0.10|0.00|A|F|1992-03-01|1992-04-21|1992-03-05|NONE|RAIL|ages sleep slyly +19623|1806|93|5|45|76851.00|0.06|0.01|R|F|1992-05-04|1992-04-21|1992-05-22|COLLECT COD|AIR|against the carefully regular packages are +19623|788|89|6|5|8443.90|0.08|0.03|A|F|1992-02-26|1992-04-11|1992-03-21|DELIVER IN PERSON|TRUCK| furiously even r +19623|638|70|7|50|76931.50|0.05|0.03|R|F|1992-05-02|1992-05-10|1992-05-31|DELIVER IN PERSON|SHIP|ithely ironic deposits. caref +19648|994|95|1|50|94749.50|0.10|0.06|N|O|1996-11-30|1996-12-27|1996-12-22|NONE|MAIL|carefully bold packages. regular package +19648|572|63|2|19|27978.83|0.08|0.03|N|O|1997-01-30|1997-01-06|1997-02-01|TAKE BACK RETURN|TRUCK| wake slyl +19648|494|95|3|13|18128.37|0.02|0.02|N|O|1997-02-12|1997-01-13|1997-03-08|TAKE BACK RETURN|REG AIR|ide of the deposits. furiously ironi +19648|1671|72|4|26|40889.42|0.10|0.01|N|O|1996-11-02|1997-01-06|1996-12-01|COLLECT COD|FOB|s against the carefully bold dep +19648|722|87|5|9|14604.48|0.03|0.06|N|O|1996-11-11|1997-01-10|1996-12-10|TAKE BACK RETURN|AIR|l requests against the blithely +19648|874|74|6|34|60345.58|0.07|0.06|N|O|1996-12-27|1996-12-08|1996-12-30|NONE|AIR| lose daringly. bold accounts cajole +19648|1521|2|7|33|46943.16|0.02|0.00|N|O|1996-12-17|1996-11-17|1997-01-03|COLLECT COD|FOB|al packages dazzl +19649|1823|53|1|15|25872.30|0.02|0.05|N|O|1995-08-10|1995-06-29|1995-09-02|NONE|AIR|platelets. daring, even ex +19649|6|82|2|21|19026.00|0.07|0.03|N|O|1995-07-25|1995-06-11|1995-08-11|TAKE BACK RETURN|AIR|nic foxes wake furiously. blithe +19649|1205|6|3|36|39823.20|0.05|0.08|N|O|1995-08-03|1995-06-22|1995-08-14|COLLECT COD|MAIL| theodolites boost car +19649|1501|42|4|27|37867.50|0.01|0.00|R|F|1995-06-08|1995-07-16|1995-06-11|COLLECT COD|MAIL|ts according to the express deposits a +19649|1284|96|5|27|32002.56|0.00|0.08|N|O|1995-08-18|1995-07-01|1995-09-07|DELIVER IN PERSON|RAIL|bout the ironic +19650|1800|43|1|40|68072.00|0.06|0.05|R|F|1994-07-05|1994-08-09|1994-07-17|COLLECT COD|MAIL|ully-- blithely i +19650|1031|32|2|24|22368.72|0.04|0.04|A|F|1994-09-18|1994-09-12|1994-10-01|NONE|RAIL|packages wake blithely. unusual, bo +19651|425|26|1|31|41088.02|0.03|0.07|N|O|1997-02-17|1997-02-15|1997-03-13|COLLECT COD|REG AIR|ravely final packages cajole caref +19651|1810|54|2|21|35948.01|0.05|0.07|N|O|1997-01-19|1997-01-11|1997-02-10|NONE|TRUCK|lar theodoli +19651|6|57|3|9|8154.00|0.10|0.01|N|O|1997-03-18|1996-12-28|1997-04-01|TAKE BACK RETURN|AIR|ts. furiously ir +19651|1854|55|4|46|80769.10|0.03|0.03|N|O|1997-03-11|1997-02-16|1997-03-13|DELIVER IN PERSON|SHIP|ly regular accounts wake blithely. quick +19651|1203|41|5|48|53001.60|0.04|0.07|N|O|1997-01-27|1997-01-28|1997-02-09|NONE|SHIP|usly: accou +19651|1681|64|6|39|61724.52|0.03|0.06|N|O|1997-01-30|1997-02-14|1997-01-31|DELIVER IN PERSON|SHIP| furiously special package +19651|1319|96|7|26|31728.06|0.00|0.01|N|O|1997-02-27|1997-02-02|1997-03-19|DELIVER IN PERSON|FOB|epths. blithely regular accounts c +19652|1685|9|1|48|76160.64|0.01|0.06|R|F|1992-08-13|1992-07-15|1992-09-09|TAKE BACK RETURN|REG AIR|ronic packages. fu +19652|1778|21|2|29|48713.33|0.03|0.04|A|F|1992-09-25|1992-07-26|1992-10-25|COLLECT COD|MAIL|e carefully ironic deposits. quick +19652|1399|76|3|19|24707.41|0.10|0.03|A|F|1992-08-12|1992-08-27|1992-08-24|TAKE BACK RETURN|REG AIR|ate blithely. fluffily regular deposits +19652|929|64|4|19|34768.48|0.07|0.01|R|F|1992-10-02|1992-08-08|1992-10-03|DELIVER IN PERSON|AIR|nic dolphi +19652|1393|32|5|45|58247.55|0.07|0.02|R|F|1992-09-09|1992-08-31|1992-09-23|NONE|SHIP|lithely expre +19652|1141|50|6|1|1042.14|0.05|0.08|R|F|1992-07-25|1992-08-13|1992-08-12|TAKE BACK RETURN|MAIL|ach furiously. quickly ironic pa +19652|1346|85|7|2|2494.68|0.09|0.08|A|F|1992-07-08|1992-08-03|1992-07-29|TAKE BACK RETURN|TRUCK|hithout the evenly final requests. r +19653|882|49|1|24|42789.12|0.07|0.04|R|F|1993-01-10|1992-10-20|1993-02-03|DELIVER IN PERSON|REG AIR|odolites are blithely furiously final pac +19653|1407|86|2|43|56261.20|0.00|0.06|A|F|1992-12-19|1992-12-09|1992-12-31|DELIVER IN PERSON|FOB|ecial packages wake carefully slyly +19653|1358|35|3|13|16371.55|0.03|0.00|A|F|1992-10-18|1992-10-28|1992-11-09|DELIVER IN PERSON|FOB|unts. furiously quiet theodo +19653|1958|47|4|44|81837.80|0.05|0.00|A|F|1992-12-19|1992-10-14|1992-12-27|COLLECT COD|FOB|g requests. pains us +19653|1696|38|5|15|23965.35|0.10|0.01|R|F|1993-01-08|1992-12-07|1993-02-03|COLLECT COD|TRUCK| regular packages. carefully unusual theo +19653|866|33|6|10|17668.60|0.03|0.00|A|F|1992-11-23|1992-11-14|1992-12-01|TAKE BACK RETURN|REG AIR|ng the slyly bold requests. ironi +19654|1009|15|1|39|35490.00|0.03|0.04|R|F|1995-01-24|1995-03-25|1995-02-01|COLLECT COD|RAIL|its across the pinto beans wake across t +19654|1766|51|2|8|13342.08|0.07|0.05|A|F|1995-04-12|1995-04-06|1995-05-09|TAKE BACK RETURN|SHIP|ckly ironic packages? carefully +19654|1206|44|3|20|22144.00|0.01|0.05|A|F|1995-03-30|1995-03-31|1995-04-14|TAKE BACK RETURN|AIR|nusual deposits haggle ironically express +19654|153|6|4|27|28435.05|0.03|0.03|A|F|1995-04-29|1995-04-10|1995-05-25|TAKE BACK RETURN|TRUCK|ons wake express accoun +19654|514|5|5|18|25461.18|0.02|0.01|R|F|1995-05-03|1995-04-08|1995-05-08|NONE|MAIL|l deposits use: bl +19655|1313|14|1|8|9714.48|0.01|0.05|A|F|1994-02-18|1994-02-12|1994-02-25|TAKE BACK RETURN|RAIL| ideas accor +19655|721|18|2|26|42164.72|0.02|0.08|R|F|1994-05-08|1994-04-09|1994-05-13|COLLECT COD|AIR|ructions boost slowly. deposits +19680|1541|62|1|6|8655.24|0.02|0.04|A|F|1992-10-09|1992-12-02|1992-10-30|TAKE BACK RETURN|FOB|y final foxes. slyly final +19680|1475|93|2|48|66070.56|0.04|0.02|A|F|1992-11-16|1992-12-17|1992-12-06|DELIVER IN PERSON|RAIL| express dependencies about the i +19680|1237|49|3|43|48943.89|0.07|0.08|A|F|1992-10-22|1992-10-29|1992-11-01|NONE|TRUCK| even packages haggle bli +19680|951|52|4|19|35187.05|0.02|0.03|R|F|1992-10-21|1992-12-17|1992-11-20|COLLECT COD|TRUCK|es. pending, steal +19680|1371|72|5|8|10178.96|0.01|0.04|A|F|1992-12-13|1992-11-05|1993-01-11|TAKE BACK RETURN|MAIL|ans boost furiously furiously final +19681|738|39|1|48|78659.04|0.09|0.08|N|O|1998-03-26|1998-03-22|1998-04-01|NONE|RAIL|p! special foxes above the fu +19681|1743|44|2|24|39473.76|0.09|0.06|N|O|1998-02-01|1998-03-01|1998-02-14|DELIVER IN PERSON|RAIL|lithely express excuses wake f +19681|1564|5|3|5|7327.80|0.02|0.05|N|O|1998-03-30|1998-03-12|1998-04-04|COLLECT COD|FOB|ntain slyly along th +19681|1630|72|4|4|6126.52|0.08|0.07|N|O|1998-01-01|1998-02-19|1998-01-10|TAKE BACK RETURN|AIR|furiously bold instruc +19681|848|49|5|23|40223.32|0.07|0.00|N|O|1998-03-22|1998-03-17|1998-04-20|NONE|REG AIR|he ironic deposits will brea +19682|1810|97|1|40|68472.40|0.04|0.01|N|O|1997-03-25|1997-04-04|1997-04-18|COLLECT COD|RAIL|y; final excuses +19682|1281|82|2|10|11822.80|0.08|0.00|N|O|1997-04-22|1997-03-25|1997-05-10|TAKE BACK RETURN|FOB|ully even +19682|1255|30|3|30|34687.50|0.08|0.08|N|O|1997-05-22|1997-04-09|1997-06-19|TAKE BACK RETURN|FOB|blithely fi +19682|1221|59|4|5|5611.10|0.10|0.07|N|O|1997-03-05|1997-04-29|1997-03-11|NONE|SHIP| deposits. carefully final theo +19682|449|37|5|35|47230.40|0.02|0.01|N|O|1997-05-17|1997-04-15|1997-06-06|COLLECT COD|FOB|ticingly careful deposits. fluffily +19682|577|8|6|14|20685.98|0.03|0.02|N|O|1997-03-21|1997-03-28|1997-03-24|NONE|MAIL|cial, even accounts. fu +19682|633|27|7|25|38340.75|0.00|0.06|N|O|1997-06-10|1997-05-03|1997-06-13|COLLECT COD|RAIL|sly ironic +19683|593|94|1|4|5974.36|0.04|0.03|A|F|1994-02-26|1994-03-19|1994-03-22|COLLECT COD|AIR|ously express no +19683|1600|1|2|17|25527.20|0.09|0.00|R|F|1994-03-09|1994-04-27|1994-04-05|DELIVER IN PERSON|REG AIR|gle furiously +19684|651|45|1|30|46549.50|0.04|0.04|A|F|1993-12-21|1993-10-16|1994-01-16|TAKE BACK RETURN|FOB|encies. ironic instructions +19684|1403|21|2|49|63915.60|0.03|0.00|R|F|1993-10-14|1993-11-07|1993-10-27|NONE|TRUCK|ously final i +19684|1644|86|3|27|41732.28|0.01|0.02|R|F|1993-12-25|1993-10-05|1994-01-19|TAKE BACK RETURN|FOB|final instructions wake bli +19685|1552|33|1|20|29071.00|0.06|0.04|N|O|1998-01-07|1997-12-17|1998-01-24|COLLECT COD|FOB|ronic dino +19685|1493|94|2|21|29284.29|0.07|0.06|N|O|1997-12-02|1997-12-13|1997-12-20|COLLECT COD|REG AIR|sly silent tithes poach +19686|1657|40|1|4|6234.60|0.06|0.00|A|F|1993-10-01|1993-09-23|1993-10-20|DELIVER IN PERSON|TRUCK|. final instructions was blithely spec +19686|1763|90|2|31|51607.56|0.07|0.05|A|F|1993-11-22|1993-10-09|1993-12-14|COLLECT COD|RAIL| unusual deposits. ironic, fin +19686|429|59|3|23|30576.66|0.10|0.07|A|F|1993-08-22|1993-09-17|1993-09-13|COLLECT COD|SHIP| cajole slyly. permanently unusual ac +19686|565|56|4|20|29311.20|0.01|0.08|A|F|1993-09-11|1993-09-30|1993-10-07|COLLECT COD|FOB|arefully b +19687|1437|55|1|5|6692.15|0.01|0.07|A|F|1993-08-25|1993-09-18|1993-08-31|DELIVER IN PERSON|REG AIR|s across the regular, reg +19687|1341|56|2|40|49693.60|0.07|0.04|A|F|1993-12-04|1993-09-18|1993-12-07|TAKE BACK RETURN|REG AIR|y even theodolites about the car +19687|1651|75|3|30|46579.50|0.09|0.00|A|F|1993-11-30|1993-09-15|1993-12-15|NONE|MAIL|nally ironic pinto be +19687|536|37|4|41|58897.73|0.00|0.00|R|F|1993-08-28|1993-09-21|1993-09-04|NONE|MAIL|s furiously. quickly regul +19687|1520|1|5|21|29851.92|0.06|0.03|A|F|1993-09-02|1993-10-20|1993-09-28|NONE|SHIP|y pending asymptotes. s +19687|1193|2|6|10|10941.90|0.00|0.02|A|F|1993-09-29|1993-11-06|1993-10-18|DELIVER IN PERSON|RAIL|y even packages use. finally final req +19687|1420|60|7|34|44928.28|0.03|0.08|A|F|1993-11-02|1993-11-01|1993-11-17|DELIVER IN PERSON|MAIL|e deposits. iro +19712|1463|81|1|17|23195.82|0.10|0.08|N|O|1998-02-22|1998-02-16|1998-03-20|NONE|RAIL|ely unusual dependencies. +19712|1380|81|2|41|52536.58|0.09|0.05|N|O|1998-03-10|1998-04-07|1998-04-03|COLLECT COD|AIR|thely bold accounts are from t +19712|1241|42|3|11|12564.64|0.07|0.01|N|O|1998-04-02|1998-02-11|1998-04-16|COLLECT COD|MAIL|ke packages. even req +19712|800|65|4|21|35716.80|0.10|0.02|N|O|1998-03-16|1998-03-17|1998-04-04|NONE|RAIL|, regular p +19712|1635|77|5|13|19976.19|0.05|0.07|N|O|1998-05-01|1998-04-02|1998-05-29|COLLECT COD|FOB|pecial inst +19713|1371|72|1|3|3817.11|0.10|0.05|N|O|1996-10-30|1996-10-03|1996-11-14|COLLECT COD|FOB|lar ideas. patterns print fur +19713|1690|32|2|24|38200.56|0.00|0.02|N|O|1996-10-03|1996-09-27|1996-10-22|NONE|REG AIR|ly requests. fluff +19714|959|28|1|42|78117.90|0.07|0.03|A|F|1993-11-25|1993-10-11|1993-12-08|DELIVER IN PERSON|AIR|platelets +19714|1342|57|2|26|32326.84|0.05|0.02|A|F|1993-11-30|1993-10-30|1993-12-10|TAKE BACK RETURN|FOB|deposits ar +19714|1758|43|3|47|78008.25|0.05|0.06|R|F|1993-11-15|1993-10-26|1993-11-27|NONE|AIR| wake permanently accounts. b +19714|946|47|4|44|81265.36|0.07|0.01|A|F|1993-10-11|1993-12-01|1993-10-30|DELIVER IN PERSON|RAIL|special accounts +19715|1103|40|1|19|19077.90|0.08|0.00|R|F|1992-03-30|1992-03-30|1992-04-25|NONE|REG AIR|fter the bravely r +19716|37|38|1|32|29984.96|0.03|0.03|A|F|1995-01-21|1994-12-11|1995-02-07|COLLECT COD|MAIL| carefully fl +19716|199|26|2|3|3297.57|0.01|0.04|A|F|1994-11-27|1994-11-09|1994-12-08|TAKE BACK RETURN|RAIL| sleep across the +19716|342|27|3|39|48451.26|0.05|0.06|R|F|1994-10-24|1994-12-22|1994-11-15|COLLECT COD|AIR| even requ +19717|341|70|1|7|8689.38|0.01|0.06|N|O|1998-11-02|1998-09-14|1998-11-10|DELIVER IN PERSON|REG AIR|ronic ideas. regular, unusual de +19717|309|66|2|23|27813.90|0.08|0.07|N|O|1998-10-10|1998-09-12|1998-10-16|NONE|RAIL|beans. accounts wake +19717|1054|60|3|38|36291.90|0.10|0.01|N|O|1998-08-18|1998-10-18|1998-08-23|TAKE BACK RETURN|MAIL|blithely above the pen +19717|1231|69|4|36|40760.28|0.04|0.05|N|O|1998-09-13|1998-09-20|1998-09-20|NONE|RAIL|equests. sly +19718|1694|77|1|7|11169.83|0.06|0.03|A|F|1992-07-26|1992-09-05|1992-07-30|COLLECT COD|TRUCK| ironic packages s +19718|1217|55|2|21|23482.41|0.09|0.03|A|F|1992-07-29|1992-09-06|1992-08-11|NONE|TRUCK|express multipliers. ironic, final r +19718|1086|87|3|25|24677.00|0.04|0.04|R|F|1992-10-05|1992-08-17|1992-10-30|DELIVER IN PERSON|MAIL|ly regular foxes +19718|714|15|4|8|12917.68|0.10|0.02|A|F|1992-07-19|1992-09-12|1992-08-08|DELIVER IN PERSON|TRUCK|wake ironi +19718|1201|76|5|25|27555.00|0.04|0.05|A|F|1992-10-23|1992-08-02|1992-10-25|TAKE BACK RETURN|RAIL|nusual instructions hagg +19719|1095|1|1|6|5976.54|0.00|0.03|N|O|1996-06-26|1996-07-16|1996-07-20|TAKE BACK RETURN|RAIL|e final, ironic instructio +19719|167|46|2|35|37350.60|0.01|0.02|N|O|1996-06-05|1996-07-19|1996-06-18|COLLECT COD|AIR| pending instruct +19719|1568|49|3|49|72008.44|0.05|0.01|N|O|1996-06-06|1996-07-30|1996-06-29|TAKE BACK RETURN|MAIL| detect qu +19719|1709|36|4|7|11274.90|0.06|0.00|N|O|1996-07-31|1996-07-02|1996-08-01|NONE|REG AIR|nding packages across the ironic, fi +19744|309|38|1|5|6046.50|0.03|0.04|R|F|1993-03-31|1993-05-19|1993-04-12|DELIVER IN PERSON|SHIP|furiously unusual pinto beans are. q +19744|431|90|2|33|43937.19|0.02|0.00|A|F|1993-03-16|1993-04-14|1993-04-05|COLLECT COD|RAIL|uriously! requests wake al +19744|446|76|3|5|6732.20|0.08|0.03|R|F|1993-05-31|1993-05-01|1993-06-21|COLLECT COD|REG AIR|uriously blithely pe +19744|449|79|4|45|60724.80|0.06|0.04|A|F|1993-04-22|1993-05-25|1993-05-22|TAKE BACK RETURN|AIR| express packages sleep daringl +19744|811|12|5|46|78743.26|0.05|0.05|R|F|1993-06-19|1993-05-23|1993-07-15|NONE|MAIL|le slyly busy deposits: final atta +19745|1866|10|1|44|77785.84|0.05|0.02|R|F|1993-01-31|1993-03-01|1993-03-01|NONE|REG AIR|olphins. quick +19745|1180|89|2|41|44328.38|0.10|0.03|R|F|1993-01-18|1993-02-08|1993-02-09|TAKE BACK RETURN|REG AIR|special packages. unusual excuses haggl +19745|2000|89|3|22|19844.00|0.09|0.02|R|F|1993-03-13|1993-02-21|1993-03-18|COLLECT COD|REG AIR|counts are quickly ex +19745|850|50|4|34|59528.90|0.06|0.07|R|F|1993-02-10|1993-02-11|1993-03-11|COLLECT COD|REG AIR|y silent a +19745|684|78|5|26|41201.68|0.03|0.03|R|F|1993-04-06|1993-02-27|1993-04-16|TAKE BACK RETURN|RAIL|lent platelets. qu +19745|1794|37|6|11|18653.69|0.10|0.06|A|F|1993-04-04|1993-03-03|1993-04-20|COLLECT COD|FOB|posits must wake carefully pending pin +19746|1906|51|1|10|18079.00|0.10|0.02|N|O|1998-11-06|1998-08-30|1998-11-07|TAKE BACK RETURN|TRUCK| carefully +19746|242|43|2|28|31982.72|0.02|0.08|N|O|1998-10-04|1998-09-05|1998-10-29|NONE|RAIL|ctions are blithe +19746|560|61|3|4|5842.24|0.01|0.07|N|O|1998-10-13|1998-09-02|1998-10-15|NONE|REG AIR|ys. furiously pending deposit +19746|1733|60|4|1|1634.73|0.00|0.06|N|O|1998-10-27|1998-09-24|1998-10-29|DELIVER IN PERSON|FOB|ously. pending, final requests about t +19747|1017|53|1|30|27540.30|0.10|0.02|N|O|1996-11-28|1996-11-01|1996-12-26|TAKE BACK RETURN|MAIL|ove the requests use +19747|856|56|2|37|65003.45|0.01|0.07|N|O|1996-08-20|1996-09-16|1996-08-23|COLLECT COD|MAIL|s. even, ironic dependencies are sly +19747|517|8|3|28|39690.28|0.01|0.00|N|O|1996-10-27|1996-10-30|1996-11-09|TAKE BACK RETURN|MAIL|ckages along the silent deposits cajole +19747|1002|3|4|42|37926.00|0.05|0.05|N|O|1996-10-30|1996-10-17|1996-11-18|NONE|TRUCK|sleep after the slyly +19747|884|51|5|43|76749.84|0.00|0.00|N|O|1996-08-25|1996-10-08|1996-08-27|COLLECT COD|AIR|deposits are platelets. +19748|563|24|1|42|61469.52|0.04|0.02|R|F|1993-11-18|1993-09-29|1993-12-08|NONE|TRUCK|packages. furiously unusual ex +19748|1518|59|2|28|39746.28|0.09|0.01|R|F|1993-09-27|1993-10-25|1993-09-30|COLLECT COD|MAIL|old asymptotes. f +19749|393|78|1|9|11640.51|0.01|0.04|N|O|1997-05-31|1997-06-24|1997-06-24|DELIVER IN PERSON|TRUCK|ests. furiously +19749|1483|1|2|24|33227.52|0.07|0.03|N|O|1997-07-21|1997-05-10|1997-08-06|NONE|SHIP|riously special requests sleep blithely sly +19749|1756|41|3|25|41443.75|0.01|0.00|N|O|1997-05-17|1997-06-24|1997-05-26|COLLECT COD|REG AIR|y unusual requests. even, bold accounts c +19749|1455|34|4|25|33911.25|0.09|0.00|N|O|1997-07-02|1997-06-06|1997-07-10|TAKE BACK RETURN|FOB|nag alongside of the furiously special idea +19749|935|38|5|17|31210.81|0.04|0.08|N|O|1997-06-18|1997-05-04|1997-06-20|DELIVER IN PERSON|AIR|furiously regular deposits are carefully e +19750|912|47|1|22|39884.02|0.03|0.05|A|F|1994-10-17|1994-10-09|1994-11-05|COLLECT COD|AIR|. pending deposits nag theodol +19750|818|18|2|5|8594.05|0.00|0.07|A|F|1994-09-22|1994-09-23|1994-09-26|COLLECT COD|RAIL|es wake. special ideas cajole furiousl +19750|520|11|3|11|15625.72|0.07|0.04|A|F|1994-12-09|1994-10-09|1994-12-15|COLLECT COD|RAIL|ly carefully final excuses. doggedly +19750|440|41|4|38|50936.72|0.05|0.02|R|F|1994-11-27|1994-09-23|1994-12-19|NONE|FOB|ajole above the final dolphins. slyly re +19751|602|96|1|42|63109.20|0.01|0.06|N|O|1996-09-28|1996-10-22|1996-10-23|DELIVER IN PERSON|RAIL|uickly slyly brave requests. fluffil +19751|1403|43|2|10|13044.00|0.04|0.05|N|O|1996-12-02|1996-11-05|1996-12-31|TAKE BACK RETURN|REG AIR|eas. pending, special de +19751|1806|7|3|34|58065.20|0.05|0.06|N|O|1996-10-06|1996-11-20|1996-10-14|TAKE BACK RETURN|MAIL|are carefully quickly special +19751|15|66|4|39|35685.39|0.09|0.01|N|O|1996-12-07|1996-11-17|1996-12-30|DELIVER IN PERSON|REG AIR|t the slyly final ideas unwind +19751|559|50|5|24|35029.20|0.07|0.01|N|O|1996-10-07|1996-11-17|1996-10-18|DELIVER IN PERSON|FOB|nic dependencies. carefully +19751|709|74|6|18|28974.60|0.01|0.00|N|O|1996-09-29|1996-11-25|1996-10-27|NONE|REG AIR|oxes wake. ironic ideas kindle sl +19776|432|20|1|20|26648.60|0.01|0.00|N|O|1996-07-05|1996-07-05|1996-07-26|COLLECT COD|TRUCK|ly quickly +19776|664|96|2|15|23469.90|0.09|0.03|N|O|1996-07-03|1996-07-11|1996-07-08|TAKE BACK RETURN|FOB|hins haggl +19776|727|60|3|9|14649.48|0.06|0.01|N|O|1996-05-14|1996-06-23|1996-05-18|TAKE BACK RETURN|AIR|he accounts +19776|67|68|4|33|31912.98|0.01|0.00|N|O|1996-06-12|1996-06-01|1996-07-12|COLLECT COD|MAIL|ly stealthy +19776|608|9|5|30|45258.00|0.01|0.01|N|O|1996-06-28|1996-07-09|1996-07-27|DELIVER IN PERSON|SHIP|. pinto beans believe. care +19777|1699|100|1|14|22409.66|0.05|0.07|R|F|1993-02-01|1993-01-11|1993-02-11|COLLECT COD|REG AIR|thely even packages. qui +19777|1678|79|2|2|3159.34|0.00|0.02|A|F|1993-01-17|1992-12-12|1993-01-26|NONE|MAIL|ix after the f +19777|782|47|3|7|11779.46|0.09|0.08|A|F|1993-02-13|1992-12-23|1993-02-27|DELIVER IN PERSON|MAIL|slyly always brave ideas. furiously b +19777|485|86|4|20|27709.60|0.08|0.06|R|F|1992-12-20|1992-12-26|1993-01-04|TAKE BACK RETURN|MAIL|es-- slyly quiet foxes along th +19777|620|14|5|38|57783.56|0.02|0.04|A|F|1993-01-29|1993-01-05|1993-02-22|NONE|MAIL| boost quickly. quickly regular depo +19777|41|17|6|3|2823.12|0.02|0.07|A|F|1992-11-08|1992-11-26|1992-11-22|COLLECT COD|AIR|regularly across +19778|1810|54|1|47|80455.07|0.01|0.00|R|F|1992-10-25|1992-12-14|1992-11-19|DELIVER IN PERSON|RAIL| the quickly regular foxes. ironic, f +19778|954|57|2|2|3709.90|0.06|0.07|R|F|1993-01-03|1992-11-11|1993-01-26|DELIVER IN PERSON|REG AIR|al, unusual courts hagg +19778|430|31|3|25|33260.75|0.00|0.04|R|F|1993-01-25|1992-12-05|1993-02-07|COLLECT COD|SHIP| stealthy foxes +19778|1397|98|4|37|48040.43|0.10|0.00|A|F|1992-12-24|1992-12-18|1993-01-11|COLLECT COD|FOB|sual deposits wake after the bold foxes. +19778|144|97|5|16|16706.24|0.08|0.04|R|F|1992-10-27|1992-11-13|1992-11-18|TAKE BACK RETURN|AIR|ns. blithely regular deposits +19778|1669|11|6|23|36125.18|0.04|0.06|A|F|1992-12-06|1992-11-18|1993-01-05|DELIVER IN PERSON|SHIP| furiously regular ideas cajole according +19779|636|30|1|12|18439.56|0.08|0.04|A|F|1994-07-15|1994-08-05|1994-08-09|DELIVER IN PERSON|MAIL| pending dependencies along +19779|745|46|2|11|18103.14|0.08|0.07|A|F|1994-06-13|1994-07-09|1994-07-11|TAKE BACK RETURN|TRUCK|ainst the fluffily ironic w +19779|1936|81|3|32|58813.76|0.03|0.07|R|F|1994-08-13|1994-07-10|1994-08-15|NONE|AIR|sts. carefully even reque +19779|29|30|4|32|29728.64|0.06|0.04|R|F|1994-09-13|1994-08-14|1994-09-23|TAKE BACK RETURN|RAIL|ding accounts. deposi +19780|1944|45|1|12|22151.28|0.03|0.02|R|F|1995-05-26|1995-03-07|1995-05-27|TAKE BACK RETURN|SHIP|e after the +19780|1886|16|2|45|80454.60|0.03|0.04|A|F|1995-03-14|1995-03-22|1995-04-06|TAKE BACK RETURN|MAIL|yly final packages. furiou +19780|308|65|3|1|1208.30|0.05|0.04|R|F|1995-05-24|1995-04-24|1995-06-08|TAKE BACK RETURN|MAIL| daringly slyly regular +19780|1652|35|4|42|65253.30|0.01|0.08|R|F|1995-03-27|1995-04-14|1995-04-05|COLLECT COD|SHIP|ggle. carefully regular tithes serve aroun +19781|276|58|1|25|29406.75|0.07|0.06|N|O|1996-12-14|1997-01-07|1997-01-05|DELIVER IN PERSON|SHIP|foxes slee +19781|814|48|2|27|46299.87|0.06|0.04|N|O|1997-01-05|1996-12-30|1997-01-29|NONE|AIR|nic foxes impress blithely regular +19781|1533|34|3|12|17214.36|0.03|0.02|N|O|1996-10-29|1996-12-25|1996-11-24|COLLECT COD|RAIL|refully. ironic asymptotes wake alongside o +19782|1714|41|1|30|48471.30|0.06|0.04|A|F|1992-12-07|1993-01-09|1992-12-14|COLLECT COD|AIR|eans. slyly even excuses inside the +19782|342|27|2|32|39754.88|0.02|0.06|A|F|1992-11-09|1992-12-28|1992-11-19|COLLECT COD|FOB| even deposits u +19782|1026|97|3|34|31518.68|0.06|0.06|R|F|1993-02-11|1992-12-15|1993-02-15|TAKE BACK RETURN|SHIP|to beans. bold theodolites n +19782|438|26|4|24|32122.32|0.10|0.03|R|F|1993-01-13|1993-01-11|1993-01-30|DELIVER IN PERSON|FOB|ly silent platel +19783|872|73|1|38|67369.06|0.03|0.04|R|F|1992-11-20|1992-12-01|1992-11-27|TAKE BACK RETURN|MAIL|iously slyly ironic depo +19783|1644|45|2|33|51006.12|0.02|0.08|A|F|1992-10-05|1992-10-28|1992-10-11|TAKE BACK RETURN|TRUCK|are furiously? blithely regular courts poa +19783|276|77|3|10|11762.70|0.03|0.04|A|F|1992-10-19|1992-11-17|1992-10-27|DELIVER IN PERSON|MAIL|al asymptotes. carefu +19783|1589|70|4|34|50679.72|0.05|0.00|R|F|1992-12-17|1992-12-05|1992-12-31|DELIVER IN PERSON|MAIL| integrate. q +19783|376|33|5|17|21698.29|0.07|0.01|R|F|1993-01-09|1992-10-29|1993-02-01|NONE|REG AIR|ly final instructions. slyly even pint +19808|293|75|1|25|29832.25|0.10|0.07|N|O|1996-09-09|1996-09-02|1996-09-21|TAKE BACK RETURN|REG AIR|requests haggle carefully after the even a +19808|695|89|2|2|3191.38|0.00|0.04|N|O|1996-08-01|1996-08-20|1996-08-11|DELIVER IN PERSON|AIR|the slyly even pinto beans. pending, +19808|1015|21|3|31|28396.31|0.08|0.01|N|O|1996-08-20|1996-09-01|1996-09-11|NONE|SHIP|c pinto beans breach quickly +19808|1877|7|4|35|62260.45|0.08|0.05|N|O|1996-07-30|1996-08-23|1996-08-14|DELIVER IN PERSON|RAIL|e enticing, silent foxes affix slyly neve +19808|262|44|5|49|56950.74|0.09|0.01|N|O|1996-08-02|1996-08-07|1996-08-08|TAKE BACK RETURN|AIR|y regular requests. s +19808|1776|3|6|29|48655.33|0.01|0.01|N|O|1996-07-11|1996-09-25|1996-08-08|COLLECT COD|TRUCK|telets. carefully unusual pin +19809|1484|24|1|6|8312.88|0.06|0.06|N|O|1997-09-10|1997-09-08|1997-09-17|TAKE BACK RETURN|SHIP|furiously along +19809|1754|81|2|39|64574.25|0.06|0.00|N|O|1997-12-02|1997-09-27|1997-12-25|DELIVER IN PERSON|SHIP|y even accounts afte +19809|1049|50|3|13|12350.52|0.07|0.02|N|O|1997-10-05|1997-11-02|1997-10-09|DELIVER IN PERSON|SHIP|osits. carefully daring cour +19809|1991|24|4|25|47324.75|0.00|0.02|N|O|1997-10-22|1997-09-24|1997-11-17|DELIVER IN PERSON|FOB|special courts use furiousl +19809|1961|62|5|36|67066.56|0.10|0.04|N|O|1997-09-30|1997-10-23|1997-10-27|TAKE BACK RETURN|SHIP|xes. quickly regular +19809|161|62|6|4|4244.64|0.09|0.01|N|O|1997-10-14|1997-11-04|1997-11-06|COLLECT COD|RAIL| platelets boost quie +19810|1784|11|1|3|5057.34|0.09|0.04|N|O|1998-05-14|1998-05-07|1998-05-22|DELIVER IN PERSON|TRUCK|the finally fina +19811|319|4|1|28|34140.68|0.08|0.04|N|O|1995-11-13|1995-09-17|1995-11-15|NONE|SHIP| bold accounts haggle slyly fi +19811|111|38|2|2|2022.22|0.01|0.02|N|O|1995-09-25|1995-10-30|1995-10-23|COLLECT COD|TRUCK| about the enticingly expres +19811|128|29|3|46|47293.52|0.00|0.04|N|O|1995-08-26|1995-09-15|1995-09-01|TAKE BACK RETURN|AIR|e express ideas wa +19811|1582|63|4|47|69728.26|0.00|0.06|N|O|1995-09-26|1995-09-22|1995-10-22|NONE|MAIL|er the asymptotes. even packages sle +19811|1516|37|5|42|59535.42|0.05|0.08|N|O|1995-11-03|1995-10-21|1995-12-03|DELIVER IN PERSON|RAIL|ons atop the slyly express r +19811|1066|37|6|32|30945.92|0.07|0.01|N|O|1995-09-20|1995-10-03|1995-09-25|DELIVER IN PERSON|AIR|n accounts. carefully final the +19811|987|22|7|48|90623.04|0.05|0.02|N|O|1995-10-09|1995-10-12|1995-10-15|NONE|SHIP|r excuses. quickly special deposits snooz +19812|894|94|1|22|39487.58|0.04|0.05|A|F|1993-07-10|1993-05-23|1993-07-13|DELIVER IN PERSON|REG AIR|ly careful package +19812|1291|66|2|22|26230.38|0.08|0.00|A|F|1993-05-12|1993-06-14|1993-05-16|NONE|RAIL|y. quietly even asympto +19812|733|66|3|44|71884.12|0.00|0.08|R|F|1993-07-22|1993-06-29|1993-08-05|COLLECT COD|AIR|te. dependenci +19812|853|87|4|45|78923.25|0.03|0.07|A|F|1993-04-04|1993-05-03|1993-04-06|DELIVER IN PERSON|AIR|ounts wake blithely. bold theodol +19813|748|13|1|40|65949.60|0.03|0.05|R|F|1993-05-20|1993-04-12|1993-06-07|NONE|RAIL|fully. carefully final packages h +19813|79|55|2|43|42100.01|0.07|0.07|A|F|1993-05-22|1993-04-05|1993-06-21|NONE|TRUCK|ges nod slyly a +19813|556|87|3|43|62631.65|0.03|0.01|A|F|1993-05-05|1993-05-24|1993-05-13|TAKE BACK RETURN|REG AIR|ns sleep carefully. ru +19813|430|31|4|14|18626.02|0.06|0.07|A|F|1993-03-25|1993-04-25|1993-04-23|COLLECT COD|REG AIR|ending deposits. furiously specia +19814|819|20|1|4|6879.24|0.02|0.05|R|F|1995-05-02|1995-06-13|1995-05-06|TAKE BACK RETURN|TRUCK|ve furiously. ironic deposits sleep fl +19815|571|62|1|38|55919.66|0.09|0.01|R|F|1993-06-12|1993-06-16|1993-06-28|DELIVER IN PERSON|FOB|blithely fluffy p +19815|431|61|2|36|47931.48|0.09|0.03|R|F|1993-04-21|1993-06-06|1993-05-14|COLLECT COD|MAIL|ackages sleep slowly. sly +19815|1702|29|3|50|80185.00|0.10|0.03|R|F|1993-05-12|1993-06-01|1993-05-28|NONE|SHIP|uickly final r +19815|1528|49|4|31|44315.12|0.09|0.00|R|F|1993-05-22|1993-06-05|1993-06-12|NONE|RAIL|tions kindle blithely after t +19815|264|65|5|11|12806.86|0.00|0.06|R|F|1993-06-04|1993-06-21|1993-06-27|TAKE BACK RETURN|RAIL| hang carefully +19840|933|34|1|38|69689.34|0.01|0.06|R|F|1993-06-12|1993-07-09|1993-07-06|NONE|AIR|n platelets are among the bl +19840|147|100|2|28|29319.92|0.02|0.05|A|F|1993-07-31|1993-08-20|1993-08-09|TAKE BACK RETURN|SHIP|heodolites boost. the +19840|1348|49|3|5|6246.70|0.01|0.08|A|F|1993-08-16|1993-07-18|1993-09-14|COLLECT COD|SHIP|ng the final accounts. even requests u +19841|1929|74|1|18|32956.56|0.08|0.03|A|F|1994-01-18|1994-02-23|1994-01-19|NONE|RAIL|posits doubt c +19841|1821|51|2|6|10336.92|0.03|0.02|A|F|1994-02-10|1994-02-10|1994-02-13|TAKE BACK RETURN|REG AIR|ions about the slyly even requests do are s +19841|1228|29|3|43|48556.46|0.04|0.03|R|F|1994-04-12|1994-02-12|1994-04-24|COLLECT COD|MAIL|its are slyly b +19841|1544|65|4|32|46257.28|0.00|0.08|A|F|1994-01-14|1994-02-26|1994-01-21|DELIVER IN PERSON|SHIP|p carefully blithely re +19841|1572|53|5|45|66310.65|0.03|0.06|A|F|1994-03-30|1994-03-04|1994-04-25|TAKE BACK RETURN|MAIL|y regular instructions abov +19841|39|90|6|34|31927.02|0.05|0.06|R|F|1994-03-25|1994-03-23|1994-03-29|NONE|REG AIR|nts. carefully +19841|264|19|7|9|10478.34|0.01|0.06|R|F|1994-02-17|1994-03-05|1994-03-03|DELIVER IN PERSON|RAIL|s; always bo +19842|790|23|1|27|45651.33|0.10|0.05|N|O|1996-09-29|1996-09-10|1996-10-16|DELIVER IN PERSON|RAIL| slyly bold orb +19842|325|10|2|42|51463.44|0.02|0.02|N|O|1996-09-22|1996-09-22|1996-10-14|NONE|SHIP|rding to the quick pinto beans +19842|814|48|3|18|30866.58|0.08|0.05|N|O|1996-09-07|1996-08-26|1996-09-17|DELIVER IN PERSON|REG AIR|ly unusual excuses detect f +19842|550|51|4|39|56571.45|0.02|0.02|N|O|1996-10-29|1996-08-30|1996-10-30|DELIVER IN PERSON|FOB| special accounts nag quickly s +19842|446|34|5|1|1346.44|0.02|0.01|N|O|1996-08-19|1996-10-12|1996-09-15|DELIVER IN PERSON|REG AIR|quickly according to the packages. regula +19842|1519|100|6|49|69604.99|0.10|0.03|N|O|1996-07-18|1996-08-27|1996-08-04|DELIVER IN PERSON|MAIL|lways carefully r +19842|1159|32|7|40|42406.00|0.00|0.04|N|O|1996-08-07|1996-09-06|1996-08-21|COLLECT COD|FOB|ts are furiously alongside of the slyly +19843|1617|18|1|19|28853.59|0.03|0.07|A|F|1993-10-16|1993-10-03|1993-11-13|DELIVER IN PERSON|SHIP|apades. dep +19843|1970|71|2|5|9359.85|0.07|0.03|A|F|1993-10-31|1993-10-17|1993-11-15|TAKE BACK RETURN|TRUCK|eans detect blithely +19843|1784|11|3|19|32029.82|0.03|0.02|R|F|1993-09-19|1993-09-07|1993-10-02|COLLECT COD|REG AIR|ke across the ca +19843|788|53|4|7|11821.46|0.09|0.05|A|F|1993-09-28|1993-10-11|1993-10-03|DELIVER IN PERSON|REG AIR|ly special requests. final i +19843|597|28|5|22|32946.98|0.10|0.00|A|F|1993-08-17|1993-10-14|1993-08-25|NONE|AIR|lar packages +19843|1965|54|6|31|57875.76|0.10|0.08|R|F|1993-09-24|1993-09-30|1993-09-29|TAKE BACK RETURN|AIR|sleep slyly even waters. regular dugo +19843|1878|79|7|22|39157.14|0.00|0.02|A|F|1993-11-18|1993-10-19|1993-11-26|TAKE BACK RETURN|REG AIR|accounts haggle b +19844|739|40|1|45|73787.85|0.01|0.04|N|O|1996-07-26|1996-06-25|1996-08-11|NONE|TRUCK|blithely express sentiments. unusu +19844|126|79|2|15|15391.80|0.01|0.00|N|O|1996-04-28|1996-07-13|1996-05-26|DELIVER IN PERSON|FOB|sleep carefully. blithely +19844|1533|34|3|17|24387.01|0.08|0.08|N|O|1996-06-19|1996-05-22|1996-06-30|TAKE BACK RETURN|MAIL|its: packages are carefull +19844|1170|7|4|35|37490.95|0.09|0.08|N|O|1996-08-14|1996-05-22|1996-09-11|TAKE BACK RETURN|RAIL|ully special +19844|1588|9|5|37|55114.46|0.10|0.02|N|O|1996-08-13|1996-07-02|1996-09-04|NONE|FOB|ular deposi +19844|249|31|6|48|55163.52|0.07|0.01|N|O|1996-05-17|1996-06-15|1996-06-04|DELIVER IN PERSON|RAIL|hely regular, bold patterns +19845|1760|87|1|41|68132.16|0.07|0.08|R|F|1994-11-05|1994-09-07|1994-11-07|TAKE BACK RETURN|TRUCK|yly ironic requests hang across the +19845|768|65|2|47|78431.72|0.02|0.03|R|F|1994-08-13|1994-08-15|1994-08-29|DELIVER IN PERSON|REG AIR|deposits are carefully even accounts. eve +19846|247|2|1|43|49331.32|0.00|0.03|N|O|1996-11-21|1996-12-29|1996-11-30|COLLECT COD|REG AIR| wake carefully even multipliers-- dep +19846|1535|36|2|41|58897.73|0.10|0.01|N|O|1996-12-09|1997-01-02|1996-12-15|DELIVER IN PERSON|FOB|ly final excuses around the quickly +19846|126|79|3|11|11287.32|0.05|0.00|N|O|1997-01-24|1997-01-31|1997-02-10|COLLECT COD|REG AIR|egular pack +19846|833|100|4|26|45079.58|0.03|0.05|N|O|1997-02-28|1997-02-10|1997-03-16|DELIVER IN PERSON|MAIL|en, even ac +19846|1308|47|5|41|49581.30|0.07|0.05|N|O|1997-01-19|1996-12-18|1997-01-20|TAKE BACK RETURN|RAIL|bold excuses sleep agains +19846|946|15|6|34|62795.96|0.09|0.07|N|O|1997-03-05|1997-01-16|1997-03-28|NONE|AIR|r excuses. carefu +19846|919|54|7|22|40038.02|0.05|0.02|N|O|1996-12-03|1996-12-17|1997-01-01|TAKE BACK RETURN|MAIL|warhorses engage carefully f +19847|1527|68|1|41|58569.32|0.06|0.06|A|F|1993-05-20|1993-04-07|1993-05-23|DELIVER IN PERSON|TRUCK|ongside of the carefully permanent +19847|1076|82|2|18|17587.26|0.03|0.05|A|F|1993-03-26|1993-04-09|1993-04-11|NONE|AIR|ns haggle silent deposits. care +19847|1252|53|3|17|19605.25|0.10|0.02|A|F|1993-03-21|1993-03-24|1993-04-11|DELIVER IN PERSON|SHIP|jole blithely among the even th +19847|1586|87|4|26|38677.08|0.02|0.02|R|F|1993-03-28|1993-05-12|1993-04-24|NONE|REG AIR|requests sleep furi +19872|1460|78|1|31|42205.26|0.09|0.06|N|O|1998-07-08|1998-04-27|1998-07-28|NONE|REG AIR|ld foxes sleep. furiously unusual s +19873|1852|39|1|33|57877.05|0.09|0.07|R|F|1993-01-12|1993-01-08|1993-01-28|NONE|FOB|egular ideas u +19873|1026|32|2|25|23175.50|0.00|0.04|R|F|1992-12-02|1992-12-24|1992-12-16|NONE|FOB|gle slyly ac +19874|1470|88|1|18|24686.46|0.04|0.06|A|F|1992-07-05|1992-08-25|1992-07-27|NONE|MAIL|ts among the slyly +19874|152|31|2|33|34720.95|0.03|0.08|A|F|1992-07-05|1992-09-04|1992-07-31|DELIVER IN PERSON|FOB|fully regular packages along the +19874|613|45|3|49|74166.89|0.10|0.00|R|F|1992-07-08|1992-08-14|1992-07-15|DELIVER IN PERSON|SHIP|ly final att +19875|139|66|1|29|30134.77|0.06|0.01|N|O|1997-02-27|1997-03-01|1997-03-07|NONE|SHIP|ely. ideas sn +19875|178|57|2|45|48517.65|0.05|0.08|N|O|1997-01-26|1997-03-15|1997-02-22|COLLECT COD|MAIL|theodolites wake. even plate +19875|716|49|3|43|69518.53|0.06|0.04|N|O|1997-01-02|1997-02-03|1997-01-05|COLLECT COD|MAIL|ely pending waters. final, regular +19875|707|4|4|46|73954.20|0.00|0.00|N|O|1997-03-26|1997-02-12|1997-04-19|COLLECT COD|REG AIR|ong the quickly even asympto +19875|474|75|5|43|59102.21|0.00|0.06|N|O|1997-03-20|1997-02-01|1997-03-24|DELIVER IN PERSON|REG AIR|refully silent instruction +19875|1635|59|6|15|23049.45|0.09|0.01|N|O|1997-01-10|1997-03-26|1997-02-05|TAKE BACK RETURN|FOB| quickly. slyly unusual requests ha +19875|754|51|7|16|26476.00|0.03|0.08|N|O|1997-01-28|1997-03-18|1997-02-05|COLLECT COD|MAIL|es sleep evenly a +19876|127|28|1|26|26705.12|0.08|0.02|N|O|1998-09-19|1998-10-25|1998-10-10|TAKE BACK RETURN|TRUCK|ously silent deposits. accounts are ideas +19876|197|24|2|29|31818.51|0.05|0.08|N|O|1998-09-19|1998-09-02|1998-09-28|DELIVER IN PERSON|FOB| furiously final foxes. +19876|1159|32|3|45|47706.75|0.08|0.07|N|O|1998-11-23|1998-10-04|1998-12-02|COLLECT COD|FOB|furiously daring requests. un +19876|253|54|4|50|57662.50|0.03|0.05|N|O|1998-11-19|1998-09-02|1998-11-27|NONE|SHIP|nding packages. deposits wake slyly. quick +19877|1843|87|1|17|29662.28|0.05|0.01|N|O|1998-07-31|1998-08-30|1998-08-29|TAKE BACK RETURN|RAIL|xpress patterns nag. s +19877|505|66|2|10|14055.00|0.10|0.01|N|O|1998-07-31|1998-08-14|1998-08-02|NONE|FOB|ackages cajole up the f +19877|752|49|3|44|72721.00|0.00|0.03|N|O|1998-08-05|1998-09-14|1998-08-17|TAKE BACK RETURN|REG AIR|n, even depos +19877|320|77|4|31|37829.92|0.01|0.04|N|O|1998-08-10|1998-09-22|1998-08-31|DELIVER IN PERSON|TRUCK|ronic requests boost alongs +19877|664|65|5|5|7823.30|0.04|0.03|N|O|1998-08-16|1998-09-06|1998-09-10|NONE|SHIP|tions cajole fluffily pending packages. +19877|128|55|6|12|12337.44|0.07|0.06|N|O|1998-09-06|1998-08-26|1998-10-02|NONE|TRUCK|oss the furiously close packag +19877|1905|6|7|50|90345.00|0.06|0.03|N|O|1998-07-02|1998-08-24|1998-07-13|TAKE BACK RETURN|SHIP|arefully regular requests wake. fur +19878|49|25|1|44|41757.76|0.03|0.00|N|O|1998-02-23|1998-03-20|1998-03-09|TAKE BACK RETURN|MAIL|ost furiously ironic ideas. ironic +19878|166|19|2|43|45844.88|0.10|0.03|N|O|1998-03-06|1998-03-05|1998-03-24|DELIVER IN PERSON|AIR|the quickly even theodolites. final pa +19878|294|76|3|6|7165.74|0.08|0.06|N|O|1998-05-08|1998-02-14|1998-05-28|DELIVER IN PERSON|REG AIR|thely regular deposit +19878|821|55|4|19|32714.58|0.10|0.03|N|O|1998-04-19|1998-03-19|1998-04-25|COLLECT COD|REG AIR|rets with +19878|314|71|5|9|10928.79|0.06|0.02|N|O|1998-02-20|1998-04-04|1998-03-16|DELIVER IN PERSON|FOB|sts. blithely regul +19878|783|48|6|1|1683.78|0.08|0.00|N|O|1998-02-10|1998-02-26|1998-03-10|NONE|SHIP|fully furiously ironic notornis. +19879|1302|79|1|38|45725.40|0.01|0.03|R|F|1994-10-12|1994-11-18|1994-10-20|TAKE BACK RETURN|RAIL|theodolites. sly accounts use bl +19879|727|60|2|43|69991.96|0.09|0.07|R|F|1994-12-20|1994-12-16|1994-12-27|TAKE BACK RETURN|SHIP|nts cajole slyly regular ideas. pending p +19879|1758|43|3|12|19917.00|0.04|0.04|R|F|1994-12-03|1994-11-13|1994-12-12|TAKE BACK RETURN|FOB|packages. carefully special packages ar +19904|443|31|1|31|41646.64|0.07|0.00|N|O|1998-04-30|1998-05-24|1998-05-09|COLLECT COD|TRUCK|ns serve carefu +19904|975|76|2|19|35643.43|0.08|0.05|N|O|1998-06-24|1998-04-06|1998-07-14|NONE|FOB|ts wake ironic packages. ide +19904|1929|30|3|35|64082.20|0.01|0.07|N|O|1998-06-09|1998-04-12|1998-07-02|COLLECT COD|MAIL| deposits. quickly final accounts a +19904|665|28|4|19|29747.54|0.07|0.02|N|O|1998-06-02|1998-04-08|1998-06-27|NONE|MAIL|fluffily enticing sauternes. careful +19904|1474|14|5|3|4126.41|0.04|0.00|N|O|1998-05-01|1998-05-06|1998-05-23|TAKE BACK RETURN|SHIP|egular deposits nag accord +19904|1489|90|6|19|26419.12|0.01|0.00|N|O|1998-06-15|1998-04-12|1998-06-17|DELIVER IN PERSON|FOB|ructions use. +19904|1650|92|7|46|71375.90|0.04|0.01|N|O|1998-06-22|1998-04-09|1998-07-13|DELIVER IN PERSON|RAIL|e carefully along the pe +19905|461|20|1|50|68073.00|0.07|0.00|A|F|1992-11-06|1992-10-20|1992-11-09|COLLECT COD|REG AIR| beans. bol +19905|1509|90|2|36|50778.00|0.09|0.05|R|F|1992-09-05|1992-11-08|1992-09-13|COLLECT COD|SHIP|he furiously even depos +19905|1799|42|3|48|81637.92|0.06|0.07|A|F|1992-11-23|1992-10-14|1992-12-05|TAKE BACK RETURN|AIR|es. fluffily unusual deposi +19905|1023|94|4|33|30492.66|0.05|0.03|A|F|1992-08-18|1992-09-19|1992-09-12|DELIVER IN PERSON|REG AIR|y across the regular accounts. finally unu +19905|63|39|5|43|41411.58|0.01|0.01|R|F|1992-10-26|1992-09-30|1992-11-15|COLLECT COD|RAIL|d requests across the quickly final a +19905|223|78|6|28|31450.16|0.03|0.04|R|F|1992-08-14|1992-09-21|1992-08-20|COLLECT COD|AIR|after the ironic requests. blithely u +19906|264|65|1|10|11642.60|0.07|0.05|R|F|1994-07-21|1994-07-04|1994-08-10|NONE|REG AIR|sly pending warhorses. i +19906|1476|94|2|42|57853.74|0.00|0.05|R|F|1994-07-22|1994-06-08|1994-07-26|DELIVER IN PERSON|AIR| blithely careful asy +19906|1666|90|3|30|47029.80|0.10|0.05|A|F|1994-05-25|1994-05-19|1994-06-15|TAKE BACK RETURN|SHIP|affix across the regula +19906|952|87|4|11|20382.45|0.09|0.06|A|F|1994-05-06|1994-06-25|1994-05-12|COLLECT COD|RAIL|ead of the silent re +19906|1474|14|5|22|30260.34|0.02|0.04|A|F|1994-07-20|1994-05-24|1994-07-31|NONE|AIR|ntegrate furiousl +19907|1208|20|1|50|55460.00|0.02|0.03|N|O|1998-07-25|1998-08-19|1998-08-17|TAKE BACK RETURN|RAIL|nal sentiments wake. silent +19907|1744|87|2|13|21394.62|0.06|0.04|N|O|1998-07-13|1998-08-08|1998-07-30|COLLECT COD|MAIL|uriously bold requests. +19907|1921|54|3|15|27343.80|0.03|0.03|N|O|1998-10-03|1998-08-02|1998-10-15|DELIVER IN PERSON|FOB| slyly final packages. +19907|1575|76|4|47|69398.79|0.06|0.06|N|O|1998-09-11|1998-08-12|1998-10-02|NONE|RAIL|accounts past the regular theodol +19907|1240|41|5|36|41084.64|0.01|0.00|N|O|1998-09-04|1998-08-07|1998-09-12|NONE|SHIP|odolites ab +19908|1086|57|1|20|19741.60|0.09|0.00|A|F|1993-01-22|1993-04-02|1993-02-19|DELIVER IN PERSON|SHIP| instructions across the fl +19908|1047|48|2|9|8532.36|0.08|0.00|A|F|1993-01-10|1993-03-11|1993-01-16|NONE|REG AIR|ven packages are. slyly final packag +19908|457|16|3|5|6787.25|0.02|0.05|R|F|1993-02-15|1993-04-01|1993-03-10|NONE|RAIL|totes after the blithely +19908|1642|25|4|5|7718.20|0.01|0.01|R|F|1993-03-25|1993-02-23|1993-04-10|NONE|RAIL|eodolites are carefully carefully unusual +19908|1685|9|5|40|63467.20|0.05|0.07|A|F|1993-04-26|1993-03-13|1993-04-27|DELIVER IN PERSON|AIR|ts affix across th +19908|467|97|6|35|47861.10|0.09|0.07|A|F|1993-04-29|1993-03-25|1993-05-27|TAKE BACK RETURN|FOB|ges sleep. bold accounts along the final +19908|965|66|7|22|41051.12|0.05|0.01|A|F|1993-01-20|1993-02-18|1993-02-05|DELIVER IN PERSON|FOB|e blithely silent instructions are furiousl +19909|226|54|1|24|27029.28|0.09|0.01|N|O|1996-11-03|1996-11-21|1996-11-05|TAKE BACK RETURN|FOB| theodolites. a +19909|785|18|2|14|23600.92|0.05|0.00|N|O|1996-09-29|1996-10-25|1996-10-16|TAKE BACK RETURN|MAIL|inal accoun +19909|901|2|3|6|10811.40|0.03|0.01|N|O|1996-10-28|1996-11-27|1996-11-14|DELIVER IN PERSON|SHIP|ckly furiously special re +19909|344|29|4|31|38574.54|0.07|0.03|N|O|1996-10-28|1996-10-27|1996-11-03|DELIVER IN PERSON|REG AIR|ggle furiously regular pinto beans. closely +19909|74|75|5|38|37014.66|0.05|0.00|N|O|1996-12-23|1996-11-18|1997-01-01|TAKE BACK RETURN|SHIP|ly. quickly bold instructions sleep. +19909|1602|44|6|10|15036.00|0.07|0.03|N|O|1997-01-11|1996-11-28|1997-01-12|TAKE BACK RETURN|AIR| deposits haggle daringly u +19909|834|35|7|4|6939.32|0.01|0.00|N|O|1996-10-22|1996-10-25|1996-11-10|NONE|SHIP| deposits boost furiously at th +19910|876|77|1|13|23099.31|0.04|0.07|N|O|1995-07-07|1995-07-07|1995-07-10|DELIVER IN PERSON|FOB|requests about the blithely +19910|111|12|2|26|26288.86|0.07|0.01|A|F|1995-05-15|1995-06-11|1995-05-29|DELIVER IN PERSON|FOB|ly special foxes cajole slyly +19910|1855|85|3|48|84328.80|0.01|0.00|N|F|1995-06-15|1995-06-30|1995-07-13|DELIVER IN PERSON|RAIL|ly ironic p +19910|437|67|4|36|48147.48|0.07|0.00|N|O|1995-08-19|1995-07-29|1995-08-29|NONE|MAIL|s impress blithely +19911|414|73|1|7|9200.87|0.03|0.06|N|O|1995-10-14|1995-11-28|1995-10-30|NONE|TRUCK|. regular inst +19911|1410|28|2|27|35408.07|0.08|0.08|N|O|1995-12-13|1995-11-09|1996-01-12|COLLECT COD|MAIL|y pending foxes through th +19911|867|68|3|28|49500.08|0.02|0.01|N|O|1995-10-18|1995-11-25|1995-10-30|COLLECT COD|REG AIR|equests wake. ironic ideas cajole +19911|1939|28|4|13|23932.09|0.10|0.04|N|O|1996-01-21|1995-12-28|1996-02-06|COLLECT COD|RAIL|platelets-- b +19911|281|36|5|29|34257.12|0.10|0.04|N|O|1995-10-11|1995-11-23|1995-10-26|DELIVER IN PERSON|FOB|ackages cajole furio +19911|752|17|6|23|38013.25|0.02|0.04|N|O|1995-10-11|1995-11-14|1995-10-12|DELIVER IN PERSON|MAIL|press notornis. c +19911|263|64|7|39|45367.14|0.01|0.07|N|O|1995-11-28|1995-11-20|1995-12-08|DELIVER IN PERSON|SHIP|are blithely ag +19936|958|61|1|23|42755.85|0.08|0.02|A|F|1993-02-17|1993-01-31|1993-03-06|TAKE BACK RETURN|RAIL| requests wake carefully +19936|965|66|2|5|9329.80|0.08|0.02|R|F|1993-01-25|1993-01-29|1993-02-07|DELIVER IN PERSON|TRUCK|he pending, ironic inst +19936|990|59|3|41|77530.59|0.05|0.01|A|F|1992-12-31|1993-01-12|1993-01-01|NONE|REG AIR|horses. quickly regular patterns +19936|141|20|4|12|12493.68|0.02|0.03|A|F|1993-01-28|1992-12-23|1993-02-24|TAKE BACK RETURN|REG AIR|s. blithely slow accounts nag blithely af +19936|1761|46|5|43|71498.68|0.07|0.06|R|F|1992-12-05|1993-02-10|1992-12-17|COLLECT COD|RAIL|kly pending accounts haggle quickly c +19937|832|32|1|22|38122.26|0.02|0.05|N|O|1998-10-10|1998-09-16|1998-10-23|TAKE BACK RETURN|SHIP|lyly pending requests sleep a +19938|859|59|1|47|82712.95|0.10|0.03|A|F|1995-05-09|1995-06-01|1995-06-04|NONE|MAIL|s accounts are. slyly bl +19938|124|77|2|12|12289.44|0.03|0.08|N|F|1995-06-17|1995-06-02|1995-06-29|COLLECT COD|MAIL|slyly final packages wa +19938|796|97|3|20|33935.80|0.08|0.07|A|F|1995-05-08|1995-05-08|1995-05-09|TAKE BACK RETURN|FOB|y pending foxes are care +19938|1427|45|4|43|57122.06|0.07|0.08|N|O|1995-06-24|1995-05-13|1995-06-26|COLLECT COD|MAIL|ending ideas across +19938|300|82|5|46|55213.80|0.01|0.07|R|F|1995-04-25|1995-05-24|1995-05-11|DELIVER IN PERSON|MAIL|equests haggle furious +19938|1545|46|6|18|26037.72|0.07|0.03|N|O|1995-07-15|1995-06-12|1995-07-18|COLLECT COD|TRUCK|nts. blithe instructions should wa +19938|1064|65|7|41|39567.46|0.04|0.02|A|F|1995-04-28|1995-05-21|1995-05-04|TAKE BACK RETURN|SHIP|xes haggle carefully at the fu +19939|415|74|1|33|43408.53|0.07|0.08|N|O|1997-05-28|1997-05-27|1997-06-10|COLLECT COD|SHIP|to cajole furiously blithely iron +19939|1805|49|2|34|58031.20|0.06|0.08|N|O|1997-06-13|1997-05-12|1997-07-10|TAKE BACK RETURN|SHIP|ideas use furiously. unusual deposits +19939|1760|87|3|26|43205.76|0.09|0.08|N|O|1997-07-20|1997-06-18|1997-08-16|NONE|REG AIR|es cajole blithely ironic requests. deposi +19939|953|54|4|11|20393.45|0.10|0.01|N|O|1997-04-08|1997-06-22|1997-04-29|DELIVER IN PERSON|RAIL| unusual ins +19940|648|49|1|23|35618.72|0.08|0.02|N|O|1996-07-19|1996-08-16|1996-08-16|TAKE BACK RETURN|FOB| nag carefully unusual, +19940|83|9|2|24|23593.92|0.01|0.01|N|O|1996-10-30|1996-08-06|1996-11-26|TAKE BACK RETURN|FOB|regular requests are fu +19940|732|97|3|46|75105.58|0.06|0.07|N|O|1996-10-30|1996-08-18|1996-11-19|NONE|SHIP|ests are blithely according to the regular +19940|1067|3|4|18|17425.08|0.10|0.02|N|O|1996-10-15|1996-09-22|1996-10-21|COLLECT COD|FOB|! regular ideas was furiously fi +19941|1669|70|1|47|73821.02|0.02|0.01|A|F|1994-02-05|1994-02-11|1994-02-09|TAKE BACK RETURN|FOB|ly ironic foxes. furiously +19941|201|29|2|9|9910.80|0.03|0.04|R|F|1994-02-13|1994-01-12|1994-03-08|COLLECT COD|REG AIR|e blithely along the express request +19941|385|70|3|28|35990.64|0.01|0.02|A|F|1994-01-20|1994-02-04|1994-02-15|DELIVER IN PERSON|MAIL|oys detect quickly furiously final pla +19941|75|26|4|43|41928.01|0.05|0.01|R|F|1994-02-16|1994-02-19|1994-02-17|COLLECT COD|MAIL|bravely bold requests slee +19941|1672|14|5|6|9442.02|0.08|0.01|R|F|1994-03-18|1994-01-27|1994-04-14|COLLECT COD|MAIL|s. deposits are bold instructions. fina +19941|1178|51|6|4|4316.68|0.00|0.01|R|F|1994-03-25|1994-02-17|1994-04-21|DELIVER IN PERSON|RAIL|iously even, final instructions. sly +19941|456|86|7|14|18990.30|0.08|0.04|R|F|1994-01-04|1994-01-21|1994-01-28|COLLECT COD|FOB| regular accounts. slyly f +19942|359|16|1|32|40299.20|0.10|0.05|N|O|1998-07-15|1998-07-01|1998-07-22|DELIVER IN PERSON|RAIL|icing foxes wake quickly bol +19942|1862|63|2|3|5291.58|0.10|0.04|N|O|1998-06-01|1998-07-05|1998-06-06|COLLECT COD|AIR|riously ironic foxes! perman +19942|761|26|3|11|18279.36|0.08|0.08|N|O|1998-08-11|1998-06-10|1998-09-01|DELIVER IN PERSON|TRUCK|iously final requests boost. furiou +19942|286|68|4|8|9490.24|0.01|0.03|N|O|1998-05-19|1998-05-25|1998-05-28|TAKE BACK RETURN|SHIP|refully silent accounts. f +19943|80|81|1|28|27442.24|0.10|0.04|A|F|1995-03-04|1995-01-23|1995-04-03|DELIVER IN PERSON|SHIP|ly ironic packages. quickly re +19943|1221|59|2|15|16833.30|0.02|0.01|A|F|1994-12-27|1994-12-30|1995-01-22|DELIVER IN PERSON|FOB|he carefully final +19968|594|25|1|44|65761.96|0.00|0.07|N|O|1998-01-01|1998-01-26|1998-01-25|NONE|RAIL|nal packages +19968|22|98|2|34|31348.68|0.09|0.02|N|O|1998-04-02|1998-03-04|1998-05-01|TAKE BACK RETURN|TRUCK|. furiousl +19968|1851|38|3|16|28045.60|0.03|0.05|N|O|1998-03-31|1998-02-12|1998-04-06|TAKE BACK RETURN|FOB|ideas boost afte +19968|504|5|4|48|67416.00|0.01|0.00|N|O|1997-12-14|1998-02-06|1997-12-18|DELIVER IN PERSON|AIR| quickly pending foxes +19968|1585|66|5|49|72842.42|0.06|0.00|N|O|1998-03-26|1998-02-12|1998-04-05|NONE|RAIL| silent ideas are carefully i +19968|1022|28|6|44|40612.88|0.10|0.07|N|O|1997-12-30|1998-02-07|1998-01-18|TAKE BACK RETURN|AIR|al ideas boost. quick accounts us +19968|562|63|7|38|55577.28|0.05|0.08|N|O|1998-01-27|1998-01-13|1998-01-30|COLLECT COD|MAIL|ve to haggle regular p +19969|594|55|1|23|34375.57|0.02|0.00|N|O|1997-08-18|1997-08-11|1997-09-17|TAKE BACK RETURN|RAIL|ly according to the +19969|856|56|2|14|24595.90|0.02|0.01|N|O|1997-08-11|1997-07-18|1997-08-21|COLLECT COD|TRUCK| the blithely final packages. ironic depos +19969|299|27|3|35|41975.15|0.05|0.00|N|O|1997-06-25|1997-07-04|1997-06-26|TAKE BACK RETURN|RAIL|final dinos +19970|411|99|1|19|24916.79|0.08|0.04|N|O|1996-12-21|1997-02-08|1996-12-27|NONE|SHIP| furiously permane +19970|901|2|2|11|19820.90|0.02|0.01|N|O|1997-02-18|1997-01-03|1997-02-24|TAKE BACK RETURN|AIR|inst the quickly careful pack +19970|1894|95|3|40|71835.60|0.10|0.01|N|O|1997-02-14|1997-02-08|1997-02-27|COLLECT COD|RAIL|eodolites are +19970|961|30|4|27|50272.92|0.04|0.02|N|O|1996-12-31|1997-01-14|1997-01-25|TAKE BACK RETURN|SHIP|e, regular packages are +19970|463|64|5|14|19088.44|0.06|0.00|N|O|1997-01-17|1997-02-04|1997-02-11|COLLECT COD|FOB|ckly final foxes cajole ideas. +19970|305|90|6|48|57854.40|0.08|0.00|N|O|1997-01-22|1996-12-26|1997-01-24|COLLECT COD|REG AIR|nstructions boost +19971|1610|93|1|25|37790.25|0.06|0.02|N|O|1996-08-05|1996-08-14|1996-08-24|DELIVER IN PERSON|FOB|carefully. theo +19971|1245|46|2|40|45849.60|0.00|0.08|N|O|1996-07-23|1996-08-06|1996-08-19|NONE|FOB|f the blithely regular courts sleep final p +19971|317|46|3|12|14607.72|0.03|0.04|N|O|1996-09-16|1996-09-19|1996-09-17|DELIVER IN PERSON|TRUCK|press instructions haggle across the bl +19971|1335|12|4|35|43271.55|0.00|0.06|N|O|1996-10-16|1996-08-24|1996-10-20|TAKE BACK RETURN|TRUCK|eep furiously. +19971|400|85|5|29|37711.60|0.00|0.08|N|O|1996-10-26|1996-08-03|1996-11-25|NONE|REG AIR|cording to the +19971|1616|58|6|46|69810.06|0.08|0.05|N|O|1996-07-27|1996-08-30|1996-08-09|DELIVER IN PERSON|TRUCK|nts cajole amon +19972|1541|42|1|28|40391.12|0.00|0.07|A|F|1992-09-28|1992-08-10|1992-10-28|DELIVER IN PERSON|REG AIR|gged excuses was? slyly +19972|1648|49|2|50|77482.00|0.00|0.02|R|F|1992-08-02|1992-09-06|1992-08-13|COLLECT COD|RAIL|ffily final depende +19972|32|58|3|6|5592.18|0.10|0.00|R|F|1992-06-29|1992-07-27|1992-07-03|COLLECT COD|MAIL|ymptotes ag +19973|1323|62|1|45|55094.40|0.01|0.08|N|O|1996-05-14|1996-03-24|1996-05-18|DELIVER IN PERSON|REG AIR|aggle carefully after +19974|173|52|1|14|15024.38|0.05|0.08|A|F|1993-12-06|1993-12-08|1994-01-01|TAKE BACK RETURN|SHIP|l accounts are along the slyly final depos +19974|193|94|2|4|4372.76|0.02|0.08|R|F|1994-01-23|1993-12-27|1994-02-17|TAKE BACK RETURN|FOB|aggle-- blithely final platelets nag flu +19974|1032|68|3|33|30789.99|0.01|0.05|A|F|1994-02-26|1993-12-11|1994-03-10|NONE|MAIL|asymptotes sleep slyly slyly +19974|1379|56|4|3|3841.11|0.03|0.02|R|F|1994-02-17|1994-01-04|1994-03-06|COLLECT COD|RAIL|s haggle slyly +19974|1477|95|5|8|11027.76|0.05|0.06|R|F|1993-12-14|1994-01-12|1993-12-15|TAKE BACK RETURN|MAIL|s instructions impress blith +19974|1818|62|6|44|75671.64|0.02|0.06|R|F|1994-02-07|1993-12-07|1994-02-20|NONE|RAIL|ses affix across the expre +19974|1577|58|7|25|36964.25|0.02|0.03|A|F|1994-01-15|1994-01-12|1994-02-05|DELIVER IN PERSON|MAIL|y ironic deposits. ideas are slyly a +19975|35|61|1|38|35531.14|0.07|0.00|A|F|1994-04-14|1994-05-18|1994-05-04|COLLECT COD|SHIP|riously brave deposits. furiously +19975|837|4|2|13|22591.79|0.05|0.04|R|F|1994-06-05|1994-06-24|1994-06-20|NONE|FOB|cross the carefully silent dep +19975|726|27|3|21|34161.12|0.01|0.06|A|F|1994-05-29|1994-06-29|1994-06-24|TAKE BACK RETURN|RAIL|y furiously even packages. furiously even r +19975|512|3|4|44|62150.44|0.04|0.08|R|F|1994-05-21|1994-05-28|1994-06-07|TAKE BACK RETURN|FOB|ickly. sly +19975|294|76|5|7|8360.03|0.07|0.03|A|F|1994-04-25|1994-06-25|1994-05-09|TAKE BACK RETURN|MAIL| across the blithely final instructio +20000|989|90|1|32|60479.36|0.06|0.02|N|O|1996-07-28|1996-10-10|1996-08-13|COLLECT COD|MAIL|s need to boost furiously. +20000|1614|15|2|7|10609.27|0.03|0.04|N|O|1996-10-07|1996-08-27|1996-11-02|COLLECT COD|SHIP|onic ideas wake. furiously fi +20001|587|78|1|37|55040.46|0.05|0.06|A|F|1993-01-04|1992-11-29|1993-01-12|COLLECT COD|AIR|ully. sile +20001|1787|72|2|9|15199.02|0.01|0.06|R|F|1992-10-26|1993-01-05|1992-10-31|TAKE BACK RETURN|MAIL|riously regular requests? f +20002|1151|60|1|5|5260.75|0.10|0.07|R|F|1992-08-18|1992-10-14|1992-08-29|TAKE BACK RETURN|REG AIR|odolites caj +20002|1651|75|2|43|66763.95|0.10|0.08|A|F|1992-11-17|1992-10-09|1992-12-06|TAKE BACK RETURN|REG AIR|slyly. regular pinto beans nag slyly reg +20002|1752|79|3|2|3307.50|0.03|0.06|A|F|1992-10-14|1992-10-18|1992-11-04|TAKE BACK RETURN|SHIP|sleep fluffily express excuses. regular, fi +20003|1653|54|1|33|51303.45|0.09|0.03|R|F|1992-04-10|1992-03-21|1992-04-20|TAKE BACK RETURN|FOB|ully regular theodolites. blith +20003|1421|22|2|10|13224.20|0.09|0.07|R|F|1992-04-20|1992-04-23|1992-05-04|DELIVER IN PERSON|AIR| blithely regula +20003|691|85|3|40|63667.60|0.00|0.04|R|F|1992-05-14|1992-03-31|1992-06-09|NONE|TRUCK|carefully express dep +20003|43|19|4|45|42436.80|0.05|0.08|A|F|1992-04-02|1992-03-18|1992-04-21|TAKE BACK RETURN|SHIP|pecial accounts; pendin +20003|834|34|5|9|15613.47|0.07|0.05|R|F|1992-02-03|1992-03-23|1992-02-07|TAKE BACK RETURN|SHIP|usly against the packages. regular requests +20004|1279|17|1|43|50751.61|0.08|0.01|N|O|1996-06-17|1996-08-03|1996-07-02|COLLECT COD|REG AIR|nal notornis are busily above th +20004|372|57|2|26|33081.62|0.03|0.01|N|O|1996-09-01|1996-08-17|1996-09-13|DELIVER IN PERSON|AIR|y ironic requests are +20004|1394|33|3|49|63474.11|0.02|0.01|N|O|1996-07-27|1996-09-07|1996-08-09|DELIVER IN PERSON|MAIL|counts. regular, brave a +20004|1959|4|4|4|7443.80|0.08|0.07|N|O|1996-08-11|1996-09-10|1996-08-25|NONE|REG AIR|nst the ironic pac +20004|1130|31|5|47|48463.11|0.01|0.05|N|O|1996-07-10|1996-08-30|1996-07-22|COLLECT COD|REG AIR|warhorses wake slyly over the blithely b +20005|746|79|1|2|3293.48|0.02|0.08|N|O|1998-03-12|1998-03-03|1998-03-17|DELIVER IN PERSON|REG AIR|. furiously final packages sleep. p +20005|208|90|2|33|36570.60|0.07|0.06|N|O|1998-01-28|1998-04-21|1998-01-31|NONE|REG AIR|carefully final platelets. speci +20005|207|89|3|6|6643.20|0.00|0.01|N|O|1998-03-07|1998-04-22|1998-03-13|DELIVER IN PERSON|SHIP|gside of the special dinos. un +20005|239|40|4|37|42151.51|0.01|0.00|N|O|1998-04-25|1998-04-12|1998-05-05|TAKE BACK RETURN|REG AIR|ular, unusua +20005|574|75|5|23|33915.11|0.04|0.02|N|O|1998-03-31|1998-04-26|1998-04-15|COLLECT COD|AIR|its would wake +20005|409|10|6|4|5237.60|0.04|0.02|N|O|1998-02-05|1998-04-08|1998-02-25|COLLECT COD|REG AIR|across the deposits. +20005|188|15|7|3|3264.54|0.05|0.04|N|O|1998-02-08|1998-03-26|1998-02-17|NONE|RAIL|ns breach furiously among the blithely +20006|361|90|1|33|41624.88|0.10|0.03|N|O|1996-07-12|1996-07-18|1996-07-13|NONE|RAIL|r the regu +20006|1175|48|2|36|38742.12|0.05|0.06|N|O|1996-10-04|1996-08-29|1996-11-01|TAKE BACK RETURN|MAIL| use slyly after the blithely regular dep +20006|427|15|3|44|58406.48|0.04|0.06|N|O|1996-10-01|1996-08-09|1996-10-08|TAKE BACK RETURN|AIR|een the pending, final packages. +20006|883|17|4|47|83842.36|0.10|0.03|N|O|1996-09-29|1996-07-28|1996-10-19|TAKE BACK RETURN|REG AIR|iously regular +20006|271|53|5|10|11712.70|0.10|0.00|N|O|1996-08-08|1996-09-10|1996-08-23|NONE|FOB|symptotes. ca +20006|1928|61|6|23|42088.16|0.00|0.04|N|O|1996-06-27|1996-09-04|1996-07-05|NONE|MAIL|mong the furiously regular packages +20006|160|39|7|19|20143.04|0.05|0.05|N|O|1996-07-14|1996-07-30|1996-07-18|TAKE BACK RETURN|SHIP|instructions nag car +20007|1169|42|1|31|33174.96|0.02|0.04|R|F|1994-09-21|1994-09-19|1994-10-17|TAKE BACK RETURN|MAIL|ven, bold dependencies nag +20032|514|45|1|47|66481.97|0.01|0.00|A|F|1993-02-13|1992-12-06|1993-02-17|DELIVER IN PERSON|RAIL|ithely acc +20032|506|67|2|3|4219.50|0.10|0.01|R|F|1993-02-25|1992-12-22|1993-02-26|NONE|AIR|ular, regular pinto beans. blithel +20032|711|8|3|32|51574.72|0.01|0.00|R|F|1993-01-13|1992-12-29|1993-01-20|DELIVER IN PERSON|TRUCK|hin requests. final, ironic de +20032|38|39|4|32|30016.96|0.07|0.06|R|F|1993-01-05|1993-01-01|1993-01-16|COLLECT COD|FOB|nts sleep permanent +20033|1677|19|1|37|58410.79|0.00|0.07|A|F|1993-09-05|1993-08-13|1993-10-04|COLLECT COD|SHIP|ts. packages sleep. deposits use carefu +20034|1220|21|1|49|54939.78|0.06|0.02|N|O|1996-10-30|1996-08-26|1996-11-19|DELIVER IN PERSON|MAIL|inal, bold instructions sle +20034|475|5|2|11|15130.17|0.03|0.02|N|O|1996-08-04|1996-09-26|1996-08-22|DELIVER IN PERSON|TRUCK|. pending, silent package +20035|1438|56|1|6|8036.58|0.08|0.00|N|O|1996-05-04|1996-06-21|1996-05-08|DELIVER IN PERSON|REG AIR|xpress ideas. ironic dependencies sleep fur +20035|1047|83|2|35|33181.40|0.01|0.04|N|O|1996-06-12|1996-06-06|1996-07-11|TAKE BACK RETURN|REG AIR| regular re +20036|1332|47|1|27|33299.91|0.06|0.01|A|F|1994-03-26|1994-02-05|1994-03-30|NONE|REG AIR|bout the furiously +20036|15|16|2|49|44835.49|0.03|0.07|A|F|1993-12-26|1994-03-04|1994-01-01|TAKE BACK RETURN|REG AIR|through the slyly regul +20036|109|10|3|48|48436.80|0.02|0.02|A|F|1994-02-08|1994-02-11|1994-02-10|TAKE BACK RETURN|RAIL|, unusual depo +20036|1423|24|4|37|49003.54|0.01|0.00|A|F|1994-02-28|1994-03-01|1994-03-20|TAKE BACK RETURN|AIR|tegrate regular asymptotes. caref +20036|1311|50|5|31|37581.61|0.09|0.00|R|F|1994-01-17|1994-03-04|1994-02-12|NONE|REG AIR|to beans u +20037|998|99|1|31|58868.69|0.05|0.00|R|F|1994-02-19|1994-03-08|1994-02-22|TAKE BACK RETURN|MAIL|r foxes. final accounts are carefully quick +20037|614|77|2|10|15146.10|0.02|0.02|R|F|1994-02-15|1994-03-23|1994-02-22|TAKE BACK RETURN|AIR|tect express attainments. express realms +20037|383|68|3|34|43634.92|0.07|0.04|A|F|1994-01-19|1994-03-07|1994-02-18|TAKE BACK RETURN|REG AIR|ix furiously +20037|694|88|4|31|49435.39|0.05|0.08|R|F|1994-04-25|1994-02-11|1994-05-14|TAKE BACK RETURN|AIR|odolites wa +20037|777|74|5|7|11744.39|0.01|0.01|R|F|1994-01-12|1994-02-25|1994-01-19|DELIVER IN PERSON|REG AIR| instructions. furiously +20037|273|74|6|42|49277.34|0.09|0.02|R|F|1994-04-06|1994-03-26|1994-04-22|DELIVER IN PERSON|MAIL|es around the carefully pending theodolit +20037|1053|24|7|18|17172.90|0.01|0.05|A|F|1994-02-07|1994-02-28|1994-03-07|NONE|AIR| accounts nag fluffily ironic excuses. +20038|1911|44|1|46|83393.86|0.00|0.08|R|F|1993-04-06|1993-04-25|1993-05-03|TAKE BACK RETURN|MAIL|en theodolites according to the regular +20038|1277|89|2|8|9426.16|0.05|0.05|R|F|1993-03-04|1993-05-20|1993-03-05|DELIVER IN PERSON|SHIP|quickly ironic deposi +20038|1284|22|3|32|37928.96|0.06|0.02|R|F|1993-05-14|1993-05-18|1993-06-04|TAKE BACK RETURN|FOB|usly regular t +20038|1372|73|4|13|16553.81|0.01|0.08|A|F|1993-06-06|1993-04-07|1993-07-01|NONE|TRUCK|uriously regular requests use. specia +20039|623|55|1|27|41137.74|0.08|0.04|N|O|1998-07-10|1998-06-21|1998-07-25|COLLECT COD|REG AIR|beans snooze slyly after the ironic sheave +20039|1145|18|2|44|46030.16|0.06|0.02|N|O|1998-05-21|1998-06-11|1998-06-09|TAKE BACK RETURN|AIR|y final packages. even, dogg +20064|655|49|1|12|18667.80|0.08|0.08|N|O|1998-03-01|1998-02-18|1998-03-02|COLLECT COD|FOB|s. quickly ironic packages haggle carefully +20065|156|83|1|30|31684.50|0.05|0.03|N|O|1998-09-12|1998-09-12|1998-09-29|COLLECT COD|RAIL|g requests. slyly fina +20065|1183|92|2|25|27104.50|0.01|0.07|N|O|1998-11-11|1998-10-18|1998-11-20|NONE|MAIL|accounts use quickly after the +20065|1633|34|3|29|44504.27|0.02|0.04|N|O|1998-08-15|1998-10-15|1998-08-18|TAKE BACK RETURN|RAIL|ges boost slyly above the +20065|1077|13|4|26|25429.82|0.06|0.05|N|O|1998-08-01|1998-10-15|1998-08-26|NONE|RAIL| foxes. slyly bold sauternes across the +20066|1338|39|1|22|27265.26|0.10|0.04|A|F|1992-12-13|1992-11-30|1993-01-04|COLLECT COD|FOB|s sleep blithely across t +20066|581|12|2|4|5926.32|0.04|0.07|A|F|1992-10-25|1992-11-04|1992-11-01|NONE|AIR|final dependencies +20066|1178|87|3|48|51800.16|0.08|0.08|R|F|1992-11-29|1992-10-24|1992-12-06|TAKE BACK RETURN|FOB|heodolites. evenly unusual pinto +20066|1356|33|4|44|55323.40|0.07|0.03|R|F|1992-09-13|1992-10-19|1992-10-02|NONE|REG AIR|eposits nod furiously. blithe accounts +20066|656|19|5|13|20236.45|0.00|0.08|R|F|1992-11-30|1992-10-10|1992-12-30|DELIVER IN PERSON|SHIP|nally regular pinto beans. carefully e +20066|1970|3|6|4|7487.88|0.03|0.04|A|F|1992-10-28|1992-12-01|1992-11-18|TAKE BACK RETURN|AIR|iously enticing courts +20066|954|89|7|36|66778.20|0.02|0.08|R|F|1992-11-02|1992-11-08|1992-11-11|NONE|TRUCK|packages. requests use blithely regular t +20067|1564|85|1|17|24914.52|0.04|0.04|N|O|1995-09-13|1995-09-22|1995-09-30|COLLECT COD|FOB|usly regular depe +20067|1004|10|2|24|21720.00|0.10|0.01|N|O|1995-10-21|1995-09-19|1995-10-24|NONE|REG AIR|nusual requests haggle even accounts. b +20068|913|14|1|19|34464.29|0.08|0.02|R|F|1995-05-10|1995-05-28|1995-05-12|COLLECT COD|RAIL|uses are carefully +20068|1241|42|2|9|10280.16|0.05|0.08|N|O|1995-06-28|1995-04-20|1995-07-12|TAKE BACK RETURN|AIR| ironic packages mo +20068|1840|70|3|32|55738.88|0.10|0.03|R|F|1995-03-12|1995-05-11|1995-03-23|COLLECT COD|TRUCK|ons are slyly al +20068|155|8|4|37|39040.55|0.01|0.04|R|F|1995-05-14|1995-04-28|1995-05-18|COLLECT COD|TRUCK| serve above the never regular p +20069|885|19|1|12|21430.56|0.06|0.03|A|F|1994-11-01|1994-12-01|1994-11-11|COLLECT COD|FOB|s doze. furiously special theodolites +20069|1385|24|2|15|19295.70|0.08|0.05|R|F|1994-10-04|1994-11-12|1994-10-31|TAKE BACK RETURN|RAIL|ular, pending instruc +20069|1606|7|3|20|30152.00|0.07|0.01|R|F|1995-01-08|1994-12-13|1995-01-31|COLLECT COD|TRUCK|y even accounts haggle fluffily about the q +20069|1335|74|4|12|14835.96|0.02|0.00|A|F|1994-12-05|1994-10-29|1994-12-25|TAKE BACK RETURN|AIR|quickly express platelets serve quickly s +20070|1506|27|1|6|8445.00|0.10|0.01|N|O|1996-06-06|1996-05-20|1996-07-04|COLLECT COD|AIR|ful courts. furiously +20070|1855|56|2|15|26352.75|0.03|0.00|N|O|1996-06-10|1996-04-23|1996-06-13|DELIVER IN PERSON|MAIL|platelets wake around the +20070|999|100|3|21|39899.79|0.02|0.03|N|O|1996-05-26|1996-06-03|1996-06-19|NONE|RAIL|even deposits haggl +20070|874|8|4|38|67445.06|0.03|0.08|N|O|1996-05-01|1996-05-19|1996-05-11|COLLECT COD|TRUCK|he ironic, express pack +20070|1805|6|5|9|15361.20|0.05|0.06|N|O|1996-07-13|1996-05-01|1996-08-09|DELIVER IN PERSON|TRUCK|r deposits wake slyly blithely silent +20071|1529|30|1|15|21457.80|0.10|0.02|N|O|1995-10-05|1995-10-27|1995-10-30|DELIVER IN PERSON|SHIP|sly regular asym +20071|1102|11|2|45|45139.50|0.02|0.04|N|O|1995-12-17|1995-11-02|1995-12-24|TAKE BACK RETURN|TRUCK|es integrate above the regularly iron +20071|1539|20|3|32|46096.96|0.04|0.03|N|O|1995-10-28|1995-12-09|1995-11-12|DELIVER IN PERSON|SHIP| the blithely final ideas detect fluffily +20071|547|48|4|5|7237.70|0.06|0.00|N|O|1995-12-23|1995-11-15|1996-01-20|NONE|RAIL|posits poach. silent +20071|760|57|5|48|79716.48|0.03|0.01|N|O|1996-01-06|1995-12-16|1996-01-22|DELIVER IN PERSON|RAIL| bold waters wake slyly regular package +20071|1018|89|6|17|15623.17|0.06|0.07|N|O|1995-10-04|1995-12-08|1995-10-07|DELIVER IN PERSON|RAIL|ites lose after the special +20096|1815|2|1|46|78973.26|0.01|0.03|R|F|1992-12-01|1992-10-30|1992-12-31|DELIVER IN PERSON|AIR|use slyly above the silent requests. +20096|1397|12|2|49|63621.11|0.08|0.07|A|F|1992-11-06|1992-09-27|1992-12-06|NONE|MAIL|carefully perman +20096|1069|70|3|27|26191.62|0.04|0.03|R|F|1992-11-12|1992-09-28|1992-11-18|NONE|RAIL|nal accounts sleep alongs +20097|87|88|1|10|9870.80|0.00|0.04|N|O|1996-05-08|1996-07-06|1996-06-05|COLLECT COD|FOB|ecial accounts afte +20097|561|22|2|15|21923.40|0.00|0.03|N|O|1996-07-28|1996-07-11|1996-08-07|COLLECT COD|TRUCK|arefully closely +20097|1035|36|3|29|27144.87|0.06|0.04|N|O|1996-08-13|1996-07-10|1996-08-28|COLLECT COD|TRUCK| above the pinto beans. special packa +20097|1229|67|4|7|7911.54|0.01|0.06|N|O|1996-07-12|1996-06-22|1996-08-10|COLLECT COD|REG AIR|press instr +20097|1378|17|5|12|15352.44|0.01|0.00|N|O|1996-08-04|1996-06-26|1996-08-14|TAKE BACK RETURN|TRUCK|e quickly. even +20097|409|97|6|25|32735.00|0.06|0.02|N|O|1996-07-21|1996-07-25|1996-08-02|NONE|RAIL|quickly final deposits. fu +20097|942|45|7|8|14743.52|0.01|0.03|N|O|1996-06-05|1996-06-05|1996-06-22|COLLECT COD|AIR|r deposits. final i +20098|1000|1|1|26|23426.00|0.03|0.05|N|O|1996-03-23|1996-02-17|1996-03-25|COLLECT COD|FOB|lly unusual somas haggle carefully slyly ru +20098|877|78|2|43|76448.41|0.08|0.08|N|O|1995-12-12|1996-02-19|1996-01-09|DELIVER IN PERSON|TRUCK|ainst the slyly even +20098|1897|41|3|16|28782.24|0.04|0.05|N|O|1996-03-06|1996-02-19|1996-03-11|COLLECT COD|FOB|thely after the final or +20098|895|96|4|24|43101.36|0.00|0.04|N|O|1995-12-10|1996-01-21|1995-12-31|DELIVER IN PERSON|SHIP|y final packages play slyly +20099|871|71|1|26|46068.62|0.08|0.00|N|O|1998-01-02|1997-11-21|1998-01-24|TAKE BACK RETURN|FOB|ses are furiously regular foxes. bold th +20099|103|4|2|3|3009.30|0.09|0.05|N|O|1997-09-29|1997-12-17|1997-10-21|TAKE BACK RETURN|TRUCK|he pending instruct +20099|723|20|3|9|14613.48|0.05|0.07|N|O|1998-01-20|1997-12-20|1998-01-29|TAKE BACK RETURN|SHIP|fully pending deposits. furiously specia +20099|1238|13|4|24|27341.52|0.03|0.02|N|O|1997-11-08|1997-11-03|1997-11-26|DELIVER IN PERSON|AIR|ld asymptotes cajole carefully slyly pendin +20099|884|51|5|41|73180.08|0.00|0.01|N|O|1998-01-17|1997-11-01|1998-01-26|DELIVER IN PERSON|REG AIR|owly express requests. requests nag. r +20099|1870|57|6|38|67331.06|0.03|0.08|N|O|1997-10-13|1997-11-11|1997-10-21|NONE|REG AIR|re closely. per +20100|1771|98|1|9|15054.93|0.02|0.01|A|F|1994-04-06|1994-06-03|1994-04-14|DELIVER IN PERSON|FOB|ess packages n +20100|1605|47|2|49|73823.40|0.05|0.00|A|F|1994-04-23|1994-05-07|1994-05-08|DELIVER IN PERSON|REG AIR|ly ironic epitaphs. even +20101|495|83|1|47|65588.03|0.02|0.07|N|O|1996-08-21|1996-07-23|1996-09-18|COLLECT COD|FOB|ding depos +20102|863|97|1|11|19402.46|0.08|0.05|N|O|1995-07-01|1995-08-13|1995-07-17|COLLECT COD|REG AIR|above the quickly regular in +20102|400|1|2|17|22106.80|0.10|0.01|N|O|1995-08-16|1995-08-21|1995-09-09|COLLECT COD|MAIL|deposits. regula +20102|1094|30|3|5|4975.45|0.05|0.06|N|O|1995-08-22|1995-08-01|1995-08-26|TAKE BACK RETURN|SHIP|grouches b +20102|1944|77|4|8|14767.52|0.00|0.05|N|O|1995-08-23|1995-08-05|1995-09-21|DELIVER IN PERSON|MAIL|unts. unusual, brave instructio +20103|1013|19|1|45|41130.45|0.05|0.01|R|F|1993-04-27|1993-05-12|1993-05-11|TAKE BACK RETURN|FOB|nts haggle quickly slyly silent requests. +20103|1578|19|2|50|73978.50|0.01|0.05|A|F|1993-05-17|1993-05-09|1993-06-04|TAKE BACK RETURN|RAIL|egular requests. quickly pending th +20103|1564|45|3|35|51294.60|0.10|0.05|A|F|1993-06-07|1993-04-13|1993-06-27|NONE|SHIP|te across the pint +20103|1434|52|4|39|52081.77|0.00|0.04|R|F|1993-05-10|1993-04-10|1993-05-27|DELIVER IN PERSON|RAIL|kages wake quickly. ironic +20103|936|5|5|43|78987.99|0.07|0.01|A|F|1993-05-19|1993-04-11|1993-05-22|NONE|FOB| wake furiously? quickly fi +20103|1833|77|6|19|32961.77|0.01|0.04|A|F|1993-04-01|1993-04-06|1993-04-16|NONE|REG AIR|l ideas are +20103|1884|85|7|4|7143.52|0.04|0.07|R|F|1993-06-01|1993-03-16|1993-06-08|DELIVER IN PERSON|RAIL|n theodolites +20128|1804|91|1|6|10234.80|0.05|0.08|A|F|1994-12-13|1994-11-02|1995-01-10|DELIVER IN PERSON|REG AIR|dolites. f +20128|393|22|2|44|56909.16|0.03|0.03|R|F|1994-12-25|1994-11-13|1994-12-26|COLLECT COD|FOB|the special packages. carefully fina +20128|1555|76|3|5|7282.75|0.04|0.03|R|F|1994-09-16|1994-10-28|1994-10-08|NONE|REG AIR|beans haggle q +20128|709|10|4|34|54729.80|0.09|0.01|A|F|1994-09-26|1994-10-29|1994-10-11|NONE|RAIL| carefully +20128|1483|62|5|28|38765.44|0.01|0.02|R|F|1994-09-09|1994-10-16|1994-09-23|DELIVER IN PERSON|SHIP|y regular accounts along the +20128|1020|91|6|37|34077.74|0.07|0.07|A|F|1994-10-06|1994-11-14|1994-10-16|TAKE BACK RETURN|AIR|hockey players use fluffily furiously +20128|678|72|7|23|36309.41|0.06|0.08|A|F|1994-09-18|1994-11-15|1994-09-23|NONE|REG AIR|nusual foxes wake furiously pending, iro +20129|1931|32|1|4|7331.72|0.04|0.04|N|O|1997-06-04|1997-07-05|1997-06-24|DELIVER IN PERSON|AIR|e above the carefully final +20130|766|67|1|2|3333.52|0.10|0.08|R|F|1992-07-03|1992-08-30|1992-07-08|TAKE BACK RETURN|RAIL| silent requests +20130|955|56|2|23|42686.85|0.01|0.03|R|F|1992-07-18|1992-07-31|1992-08-12|DELIVER IN PERSON|TRUCK|c deposits. exp +20131|1220|58|1|26|29151.72|0.05|0.03|R|F|1992-10-18|1992-12-29|1992-11-15|NONE|AIR|ily final Tiresi +20131|229|57|2|35|39522.70|0.04|0.04|R|F|1992-10-17|1992-11-30|1992-10-22|DELIVER IN PERSON|REG AIR|t quickly among +20132|268|69|1|31|36216.06|0.00|0.01|R|F|1993-09-03|1993-08-12|1993-09-28|DELIVER IN PERSON|MAIL|nal instructions integrate along the blithe +20133|1073|74|1|39|37988.73|0.02|0.01|A|F|1994-10-06|1994-11-23|1994-10-21|COLLECT COD|MAIL|ly bold packag +20133|1519|40|2|50|71025.50|0.08|0.06|R|F|1994-12-05|1994-12-08|1994-12-24|NONE|FOB|n, express accounts haggle furiously +20133|1817|61|3|9|15469.29|0.05|0.06|R|F|1994-12-31|1994-11-29|1995-01-29|TAKE BACK RETURN|MAIL|vely ironic ideas wake quickly +20134|1903|92|1|17|30683.30|0.04|0.02|A|F|1995-04-29|1995-05-14|1995-05-27|COLLECT COD|SHIP|s. regular, regular platele +20134|1305|82|2|12|14475.60|0.00|0.08|A|F|1995-05-06|1995-05-15|1995-05-21|NONE|TRUCK|e slyly ironic requests nag fluffily b +20134|1069|75|3|17|16491.02|0.04|0.02|N|O|1995-06-29|1995-05-11|1995-07-29|DELIVER IN PERSON|FOB|ct furiously even deposits. blithely ironi +20134|1524|45|4|39|55595.28|0.06|0.02|R|F|1995-04-10|1995-05-16|1995-04-11|TAKE BACK RETURN|FOB|into beans. even, express co +20134|265|93|5|26|30296.76|0.02|0.00|A|F|1995-05-20|1995-04-21|1995-05-26|DELIVER IN PERSON|FOB|onic deposits. sl +20134|1222|60|6|21|23587.62|0.10|0.00|R|F|1995-04-29|1995-05-21|1995-05-01|NONE|SHIP| ironic ideas along the care +20135|1789|74|1|17|28743.26|0.03|0.06|A|F|1994-10-11|1994-08-01|1994-10-27|NONE|MAIL|nag among the +20135|757|90|2|19|31497.25|0.07|0.08|R|F|1994-09-15|1994-08-11|1994-10-13|COLLECT COD|RAIL|yly ironic platelets nag. furiously exp +20135|851|51|3|22|38540.70|0.08|0.05|R|F|1994-08-08|1994-09-12|1994-09-04|TAKE BACK RETURN|SHIP|egular requests wake furiou +20135|272|100|4|24|28134.48|0.00|0.04|R|F|1994-07-26|1994-07-31|1994-08-05|COLLECT COD|MAIL| regular foxes +20135|177|56|5|5|5385.85|0.10|0.06|A|F|1994-07-24|1994-08-26|1994-08-07|NONE|TRUCK|ost. furiously silent deposits alon +20135|310|95|6|5|6051.55|0.04|0.05|R|F|1994-07-09|1994-08-12|1994-08-07|TAKE BACK RETURN|FOB|ar courts are according to the +20135|1002|73|7|41|37023.00|0.08|0.05|A|F|1994-09-18|1994-09-18|1994-10-07|DELIVER IN PERSON|REG AIR|eas use blithely even courts. fu +20160|343|28|1|29|36056.86|0.06|0.00|N|O|1995-12-21|1996-01-05|1995-12-23|NONE|AIR| final deposits wa +20160|303|60|2|35|42115.50|0.07|0.05|N|O|1996-01-20|1996-01-15|1996-02-03|DELIVER IN PERSON|SHIP|ilent accounts. final, +20160|619|51|3|32|48627.52|0.01|0.01|N|O|1995-12-26|1995-12-24|1996-01-11|DELIVER IN PERSON|MAIL|s. regular excuse +20160|666|60|4|14|21933.24|0.06|0.05|N|O|1995-11-18|1995-12-18|1995-11-20|DELIVER IN PERSON|REG AIR|pending pinto beans sleep furiously furi +20160|646|78|5|27|41759.28|0.05|0.07|N|O|1995-10-28|1995-12-30|1995-11-22|NONE|AIR|accounts. furio +20161|1746|47|1|4|6590.96|0.02|0.08|R|F|1995-04-22|1995-05-16|1995-05-03|DELIVER IN PERSON|REG AIR|ggle quickly express theo +20161|1651|52|2|32|49684.80|0.01|0.06|A|F|1995-05-27|1995-04-26|1995-06-07|DELIVER IN PERSON|RAIL|ss accounts-- even sauternes cajol +20162|1667|9|1|20|31373.20|0.04|0.02|R|F|1994-03-10|1994-03-28|1994-04-01|DELIVER IN PERSON|RAIL| ironic requests toward the +20162|1548|49|2|47|68128.38|0.06|0.04|A|F|1994-06-01|1994-04-10|1994-06-28|COLLECT COD|TRUCK|r the carefully pending accounts. slyly exp +20162|555|86|3|1|1455.55|0.04|0.07|R|F|1994-06-10|1994-05-01|1994-06-20|NONE|AIR|ets about the ironic, regular d +20162|814|14|4|13|22292.53|0.03|0.07|A|F|1994-05-12|1994-04-11|1994-05-15|DELIVER IN PERSON|RAIL| theodolit +20162|1129|38|5|18|18542.16|0.00|0.04|A|F|1994-05-08|1994-04-15|1994-05-12|COLLECT COD|SHIP|ular instructions. ironic +20163|1096|32|1|24|23930.16|0.01|0.00|N|O|1998-05-04|1998-07-18|1998-05-10|TAKE BACK RETURN|RAIL|ronic requests nag pen +20163|1337|14|2|22|27243.26|0.04|0.06|N|O|1998-06-03|1998-06-29|1998-06-26|NONE|FOB| along the regular deposits. sometimes f +20164|683|15|1|23|36424.64|0.07|0.00|N|O|1996-08-17|1996-09-16|1996-09-14|COLLECT COD|MAIL|y regular reques +20164|415|3|2|26|34200.66|0.00|0.08|N|O|1996-10-17|1996-09-19|1996-11-09|NONE|FOB|carefully iron +20164|892|93|3|29|51993.81|0.03|0.02|N|O|1996-07-23|1996-09-13|1996-08-11|TAKE BACK RETURN|AIR|regular accounts. ironic, +20164|1303|18|4|37|44559.10|0.09|0.07|N|O|1996-09-22|1996-10-14|1996-10-07|NONE|REG AIR|e final packages. carefully even excuses +20164|1913|14|5|1|1814.91|0.01|0.04|N|O|1996-10-27|1996-10-03|1996-11-18|NONE|MAIL|express, express instructions doubt s +20164|1980|13|6|16|30111.68|0.10|0.08|N|O|1996-11-12|1996-10-01|1996-12-12|COLLECT COD|REG AIR|ages cajole blithely unusual requests. fu +20165|1059|95|1|48|46082.40|0.00|0.04|N|O|1996-04-28|1996-05-04|1996-04-29|DELIVER IN PERSON|SHIP|l asymptotes cajole slowly +20165|344|29|2|5|6221.70|0.00|0.04|N|O|1996-04-11|1996-03-21|1996-05-08|TAKE BACK RETURN|FOB|dolphins. +20165|555|46|3|9|13099.95|0.02|0.07|N|O|1996-06-12|1996-04-02|1996-07-06|COLLECT COD|TRUCK|ully bold, regular accounts. carefull +20166|333|90|1|4|4933.32|0.02|0.04|R|F|1994-06-20|1994-05-06|1994-06-22|DELIVER IN PERSON|SHIP|nusual warthogs about the pending acco +20166|86|12|2|8|7888.64|0.03|0.08|A|F|1994-06-20|1994-05-12|1994-07-18|COLLECT COD|REG AIR|t the furiou +20166|1658|82|3|39|60826.35|0.08|0.03|R|F|1994-05-19|1994-04-13|1994-05-29|COLLECT COD|FOB| final foxes. quickly even waters +20166|1762|89|4|43|71541.68|0.00|0.05|A|F|1994-06-11|1994-04-22|1994-06-23|TAKE BACK RETURN|TRUCK|ic excuses boost quickly. quickly regula +20167|1388|89|1|31|39970.78|0.09|0.03|A|F|1992-11-15|1992-10-19|1992-12-13|TAKE BACK RETURN|RAIL|uld wake sly +20167|1550|31|2|15|21773.25|0.03|0.08|A|F|1992-08-09|1992-09-13|1992-08-30|DELIVER IN PERSON|REG AIR|bout the closely regular deposits. iron +20192|1658|41|1|47|73303.55|0.10|0.02|A|F|1994-02-05|1993-12-21|1994-02-10|TAKE BACK RETURN|MAIL|ependencies. requests wake quickly +20192|1890|91|2|19|34045.91|0.10|0.07|R|F|1993-10-17|1993-12-26|1993-10-19|NONE|TRUCK|uickly silent p +20192|1820|50|3|1|1721.82|0.05|0.07|R|F|1994-01-25|1993-11-16|1994-01-29|COLLECT COD|REG AIR|pending packages-- quickly even acco +20192|1737|22|4|25|40968.25|0.05|0.03|R|F|1993-12-20|1993-12-02|1993-12-27|TAKE BACK RETURN|REG AIR|dolites hagg +20193|1386|63|1|46|59219.48|0.02|0.04|R|F|1994-01-23|1994-02-03|1994-01-24|DELIVER IN PERSON|TRUCK|y unusual pinto bea +20193|421|22|2|32|42285.44|0.07|0.06|R|F|1994-01-29|1994-01-03|1994-02-09|TAKE BACK RETURN|SHIP|carefully sp +20193|76|52|3|28|27329.96|0.05|0.04|R|F|1993-12-12|1994-01-12|1994-01-06|NONE|REG AIR|ubt furiously +20193|367|68|4|4|5069.44|0.03|0.05|R|F|1993-11-27|1994-01-13|1993-12-18|TAKE BACK RETURN|SHIP|refully special foxes are +20193|1356|57|5|50|62867.50|0.10|0.08|A|F|1994-02-16|1993-12-31|1994-03-12|DELIVER IN PERSON|SHIP|ake furiously furiously bold ex +20193|68|44|6|50|48403.00|0.10|0.08|A|F|1994-01-13|1993-12-22|1994-01-24|DELIVER IN PERSON|AIR|l, fluffy pac +20194|1062|33|1|23|22150.38|0.00|0.02|R|F|1992-03-28|1992-04-17|1992-04-14|TAKE BACK RETURN|REG AIR|cuses about the regular courts hinder +20194|1643|26|2|46|71053.44|0.09|0.08|R|F|1992-06-30|1992-05-10|1992-07-22|DELIVER IN PERSON|SHIP|efully furiously final +20194|1526|27|3|29|41398.08|0.02|0.06|R|F|1992-05-09|1992-04-28|1992-05-18|COLLECT COD|AIR|y bold excuses promise +20194|652|15|4|10|15526.50|0.04|0.01|A|F|1992-05-17|1992-04-19|1992-05-31|COLLECT COD|AIR| unusual grouches; regular theodolites ac +20195|913|48|1|40|72556.40|0.07|0.01|N|O|1998-10-30|1998-09-17|1998-11-19|NONE|RAIL|tes. slyly final asymptotes hagg +20195|370|55|2|26|33029.62|0.10|0.04|N|O|1998-11-29|1998-09-20|1998-12-06|COLLECT COD|RAIL|enticingly silent packages. +20196|1134|35|1|35|36229.55|0.04|0.04|N|O|1996-09-03|1996-07-14|1996-10-01|COLLECT COD|TRUCK|, sly reques +20196|783|80|2|24|40410.72|0.10|0.08|N|O|1996-06-28|1996-06-15|1996-06-30|COLLECT COD|RAIL|mise furiously during the busily regular th +20196|1592|93|3|16|23897.44|0.05|0.00|N|O|1996-08-08|1996-07-01|1996-09-07|NONE|FOB|s cajole slyly ir +20197|1297|98|1|6|7189.74|0.06|0.01|R|F|1994-06-03|1994-07-23|1994-06-30|DELIVER IN PERSON|TRUCK|nts; bold multipliers p +20197|1603|27|2|20|30092.00|0.02|0.00|R|F|1994-06-13|1994-06-10|1994-07-04|TAKE BACK RETURN|FOB|ending asymptotes across the thi +20197|1018|89|3|4|3676.04|0.09|0.01|A|F|1994-06-30|1994-07-18|1994-07-26|DELIVER IN PERSON|RAIL|packages nag furiously around the quickly +20197|1713|98|4|42|67817.82|0.01|0.01|A|F|1994-07-25|1994-06-12|1994-08-07|TAKE BACK RETURN|RAIL|ites haggle fluffily. de +20197|1509|30|5|33|46546.50|0.03|0.07|A|F|1994-08-26|1994-07-24|1994-09-06|NONE|TRUCK|nal requests +20197|26|77|6|26|24076.52|0.07|0.07|R|F|1994-07-30|1994-06-02|1994-08-06|COLLECT COD|REG AIR|unts will have to thrash carefully fluffily +20197|776|9|7|7|11737.39|0.03|0.08|R|F|1994-07-26|1994-07-13|1994-08-25|NONE|AIR| nag ironic deposits. regular packages sle +20198|751|48|1|4|6607.00|0.08|0.00|N|O|1995-08-28|1995-08-21|1995-09-16|DELIVER IN PERSON|SHIP|bout the ironic +20198|85|61|2|9|8865.72|0.01|0.00|N|O|1995-07-07|1995-07-17|1995-07-08|NONE|AIR|ages. regular packages sleep furi +20198|45|71|3|46|43471.84|0.10|0.03|N|O|1995-09-23|1995-08-30|1995-10-04|TAKE BACK RETURN|FOB| regular accounts use furiously. ideas +20198|1335|36|4|1|1236.33|0.04|0.03|N|O|1995-07-28|1995-08-17|1995-08-08|NONE|AIR| regular requests poach. +20198|899|99|5|13|23398.57|0.02|0.06|N|O|1995-08-27|1995-08-27|1995-09-09|TAKE BACK RETURN|TRUCK|slyly special excuses on +20198|1036|42|6|44|41229.32|0.10|0.03|N|O|1995-08-29|1995-07-25|1995-09-03|NONE|SHIP|en deposits integrate sl +20198|851|85|7|11|19270.35|0.03|0.02|N|O|1995-09-10|1995-09-07|1995-09-26|NONE|AIR| unusual, special +20199|1|27|1|29|26129.00|0.09|0.01|A|F|1994-07-12|1994-05-28|1994-07-18|COLLECT COD|AIR|osits use after the furiously express +20199|275|30|2|20|23505.40|0.06|0.05|R|F|1994-07-29|1994-07-14|1994-08-08|TAKE BACK RETURN|SHIP|efully along t +20199|264|92|3|9|10478.34|0.06|0.06|A|F|1994-06-26|1994-06-17|1994-07-03|DELIVER IN PERSON|RAIL|avely. even theodolit +20199|1146|55|4|24|25131.36|0.07|0.02|A|F|1994-08-01|1994-06-24|1994-08-08|COLLECT COD|FOB|furiously ironic foxes. furious +20199|1165|66|5|29|30918.64|0.01|0.00|A|F|1994-05-29|1994-07-03|1994-06-03|TAKE BACK RETURN|MAIL|ess instruct +20199|1592|73|6|27|40326.93|0.01|0.08|R|F|1994-05-19|1994-06-25|1994-05-26|DELIVER IN PERSON|SHIP|terns sleep f +20199|1594|15|7|5|7477.95|0.03|0.07|R|F|1994-05-18|1994-06-14|1994-06-05|NONE|RAIL| instructions; express accounts los +20224|680|81|1|36|56904.48|0.03|0.02|A|F|1994-10-17|1994-08-25|1994-10-22|NONE|RAIL|mptotes sleep. quickly unusual th +20225|674|37|1|18|28344.06|0.03|0.07|R|F|1993-11-09|1993-08-31|1993-12-07|DELIVER IN PERSON|TRUCK|al pinto beans. deposits cajole spe +20225|1615|39|2|12|18199.32|0.00|0.01|R|F|1993-11-06|1993-08-30|1993-11-27|DELIVER IN PERSON|SHIP|iously against the expre +20225|546|47|3|9|13018.86|0.05|0.02|A|F|1993-10-01|1993-10-19|1993-10-19|TAKE BACK RETURN|MAIL|quickly before the even pinto bean +20225|1415|16|4|13|17113.33|0.00|0.06|R|F|1993-09-18|1993-10-18|1993-10-16|COLLECT COD|REG AIR|ending excuses haggle. final, regular dep +20225|129|56|5|11|11320.32|0.02|0.05|R|F|1993-08-02|1993-10-17|1993-08-31|TAKE BACK RETURN|REG AIR|requests cajole blithely above the +20225|866|66|6|12|21202.32|0.06|0.00|A|F|1993-09-17|1993-09-16|1993-09-24|NONE|TRUCK|unts sleep furiously. deposits are. slyl +20225|1700|42|7|45|72076.50|0.01|0.08|A|F|1993-09-09|1993-09-13|1993-10-09|DELIVER IN PERSON|REG AIR|xcuses are ironically quick foxes-- q +20226|1225|26|1|30|33786.60|0.10|0.00|R|F|1994-02-19|1994-05-03|1994-03-18|NONE|SHIP| instructions +20226|1637|38|2|14|21540.82|0.05|0.02|A|F|1994-05-19|1994-03-24|1994-06-09|NONE|REG AIR|uctions. regular deposits +20227|683|15|1|11|17420.48|0.02|0.01|N|O|1995-07-22|1995-06-10|1995-07-23|DELIVER IN PERSON|TRUCK|ependencies boost furio +20227|1309|10|2|46|55673.80|0.01|0.03|R|F|1995-06-03|1995-06-09|1995-06-17|DELIVER IN PERSON|FOB|deas nag against the ironic, regular pla +20227|1376|77|3|12|15328.44|0.03|0.05|N|O|1995-08-06|1995-07-11|1995-08-10|NONE|FOB|ever final accounts haggle quickly +20228|1957|46|1|32|59486.40|0.10|0.07|N|O|1998-02-15|1998-03-25|1998-02-24|NONE|MAIL|arefully platelets. c +20229|1448|66|1|33|44531.52|0.08|0.02|A|F|1994-11-05|1995-01-27|1994-11-17|NONE|TRUCK|lly. stealthy accounts affix ca +20229|1094|30|2|48|47764.32|0.07|0.00|R|F|1995-01-12|1994-12-02|1995-01-14|COLLECT COD|MAIL|ronic instructions haggle s +20229|1588|89|3|17|25322.86|0.05|0.08|A|F|1994-12-11|1994-12-19|1994-12-21|COLLECT COD|REG AIR|y ironic requests s +20229|139|92|4|49|50917.37|0.10|0.02|R|F|1995-02-01|1995-01-24|1995-02-11|NONE|RAIL|the quickly even tithes are a +20229|925|94|5|20|36518.40|0.05|0.01|A|F|1995-02-18|1995-01-28|1995-03-09|COLLECT COD|FOB|althily express +20230|1034|35|1|47|43946.41|0.09|0.05|N|O|1997-02-04|1996-12-25|1997-03-01|COLLECT COD|TRUCK|s use furiously unusual deposits. slyly +20231|1480|98|1|25|34537.00|0.02|0.07|N|O|1995-08-11|1995-09-13|1995-09-08|NONE|SHIP|old deposits wake slyly blithely ironic re +20231|124|51|2|34|34820.08|0.10|0.04|N|O|1995-11-23|1995-09-08|1995-11-25|TAKE BACK RETURN|RAIL|sts eat carefully furiously iron +20231|495|96|3|32|44655.68|0.06|0.03|N|O|1995-10-13|1995-09-18|1995-10-17|DELIVER IN PERSON|FOB|furiously pending deposits above +20231|325|54|4|27|33083.64|0.00|0.03|N|O|1995-10-30|1995-08-29|1995-11-23|DELIVER IN PERSON|TRUCK|es. carefully ironic idea +20256|310|39|1|46|55674.26|0.04|0.01|A|F|1992-05-06|1992-04-20|1992-05-20|DELIVER IN PERSON|RAIL|e slyly. blithely final packag +20257|1354|31|1|36|45192.60|0.05|0.07|N|O|1996-05-18|1996-05-21|1996-05-26|TAKE BACK RETURN|AIR|oss the slyly unusual fo +20257|924|27|2|27|49272.84|0.10|0.02|N|O|1996-03-13|1996-04-10|1996-04-05|COLLECT COD|RAIL|heodolites. quickly careful attainments a +20257|1346|61|3|48|59872.32|0.10|0.00|N|O|1996-05-15|1996-05-11|1996-05-23|TAKE BACK RETURN|FOB|ecial depths. slyly ironic instru +20257|213|68|4|1|1113.21|0.03|0.03|N|O|1996-03-31|1996-05-22|1996-04-05|TAKE BACK RETURN|RAIL|t the quickly r +20257|1928|17|5|21|38428.32|0.08|0.01|N|O|1996-03-21|1996-04-21|1996-04-06|NONE|REG AIR|y special theodolites. always un +20258|1852|96|1|16|28061.60|0.10|0.02|N|O|1997-11-14|1997-12-07|1997-11-27|NONE|SHIP|sual waters wake carefully sp +20258|1536|37|2|4|5750.12|0.02|0.05|N|O|1997-11-10|1997-12-05|1997-11-15|COLLECT COD|MAIL|es cajole carefu +20259|677|40|1|50|78883.50|0.04|0.02|N|O|1995-08-11|1995-07-06|1995-08-21|COLLECT COD|FOB|y even theodolites wake blithely +20259|1294|6|2|13|15538.77|0.04|0.03|N|O|1995-07-04|1995-08-07|1995-07-19|TAKE BACK RETURN|SHIP| express packages above the +20260|1259|71|1|3|3480.75|0.05|0.01|N|O|1998-01-21|1997-12-02|1998-01-29|DELIVER IN PERSON|TRUCK|iously ironic sent +20261|937|72|1|19|34920.67|0.02|0.03|A|F|1994-07-14|1994-06-26|1994-07-24|NONE|SHIP|se quickly. blithely even platelets +20261|894|95|2|7|12564.23|0.02|0.06|R|F|1994-06-07|1994-08-12|1994-07-07|TAKE BACK RETURN|TRUCK|ts sleep according to the ironic +20261|449|8|3|35|47230.40|0.06|0.05|R|F|1994-07-13|1994-08-04|1994-07-21|COLLECT COD|FOB|carefully fluf +20262|1144|81|1|45|47031.30|0.03|0.07|R|F|1995-03-21|1995-03-05|1995-03-25|COLLECT COD|TRUCK|y regular dugouts. permanent pin +20262|248|30|2|24|27557.76|0.02|0.01|A|F|1995-02-17|1995-03-25|1995-03-01|NONE|AIR|accounts. slyly even +20262|26|2|3|12|11112.24|0.08|0.06|A|F|1995-03-18|1995-02-05|1995-03-28|NONE|MAIL| regular pinto bea +20262|1311|26|4|22|26670.82|0.02|0.07|A|F|1995-03-31|1995-02-25|1995-04-19|TAKE BACK RETURN|AIR|furiously. final a +20262|643|75|5|41|63289.24|0.02|0.08|A|F|1995-04-05|1995-01-28|1995-04-29|TAKE BACK RETURN|REG AIR|xes use slyly carefully even dolphins. req +20262|1415|33|6|2|2632.82|0.01|0.07|A|F|1995-02-12|1995-03-20|1995-03-12|COLLECT COD|MAIL| requests. finally pen +20262|1865|9|7|19|33570.34|0.08|0.08|R|F|1995-01-22|1995-02-14|1995-02-02|DELIVER IN PERSON|FOB|brave deposi +20263|109|36|1|42|42382.20|0.02|0.08|R|F|1995-03-01|1995-01-22|1995-03-04|DELIVER IN PERSON|REG AIR|le quickly ideas. final, final accounts acc +20263|1365|80|2|50|63318.00|0.07|0.02|R|F|1995-03-09|1995-02-07|1995-03-17|TAKE BACK RETURN|FOB| nag blithely carefully ironic requests. f +20263|1247|22|3|35|40188.40|0.08|0.08|R|F|1995-03-12|1995-02-08|1995-03-27|DELIVER IN PERSON|TRUCK|bold accounts; carefully reg +20263|1668|92|4|10|15696.60|0.02|0.00|R|F|1995-01-03|1995-01-05|1995-01-31|NONE|REG AIR|ng the carefully regular packages need t +20263|1048|49|5|24|22776.96|0.02|0.00|A|F|1994-12-07|1995-01-21|1994-12-26|COLLECT COD|AIR|nstructions wake fluffily acros +20263|1848|92|6|13|22747.92|0.06|0.07|A|F|1995-01-01|1995-01-24|1995-01-12|TAKE BACK RETURN|FOB|ns-- carefully regular deposits use +20288|723|20|1|17|27603.24|0.09|0.08|N|O|1996-09-29|1996-10-27|1996-10-27|DELIVER IN PERSON|MAIL| wake across the carefully bo +20289|1797|82|1|6|10192.74|0.09|0.08|N|O|1997-06-26|1997-09-06|1997-06-27|COLLECT COD|FOB|o beans. d +20289|291|19|2|43|51225.47|0.07|0.00|N|O|1997-09-13|1997-08-13|1997-09-17|COLLECT COD|MAIL|n theodolites above the +20289|1847|48|3|14|24483.76|0.00|0.04|N|O|1997-07-04|1997-07-25|1997-07-23|NONE|TRUCK|across the fluffily ex +20289|1828|72|4|19|32866.58|0.02|0.02|N|O|1997-10-06|1997-08-02|1997-10-24|TAKE BACK RETURN|FOB|ly daring deposits. caref +20289|1769|54|5|38|63488.88|0.06|0.05|N|O|1997-08-13|1997-08-28|1997-08-19|TAKE BACK RETURN|TRUCK|avely around the regula +20290|1239|40|1|5|5701.15|0.05|0.01|N|O|1998-02-25|1998-01-03|1998-03-22|DELIVER IN PERSON|MAIL|slyly ironic pains. iron +20290|866|33|2|48|84809.28|0.06|0.04|N|O|1998-01-02|1998-01-03|1998-01-03|COLLECT COD|MAIL| above the slyly ironic deposits? regula +20290|341|98|3|26|32274.84|0.07|0.00|N|O|1998-02-03|1998-01-03|1998-03-03|NONE|FOB|ons accordi +20290|218|19|4|49|54792.29|0.01|0.02|N|O|1998-02-02|1997-12-08|1998-02-28|DELIVER IN PERSON|SHIP|he slyly even pa +20290|370|71|5|49|62248.13|0.00|0.06|N|O|1997-11-05|1997-12-22|1997-11-13|COLLECT COD|MAIL|pendencies; slyly regular dependencie +20290|651|45|6|14|21723.10|0.08|0.04|N|O|1998-01-28|1997-12-16|1998-02-22|DELIVER IN PERSON|RAIL|ular instructions might boost ironica +20291|124|51|1|16|16385.92|0.02|0.06|N|O|1997-06-15|1997-04-29|1997-07-02|TAKE BACK RETURN|AIR|c deposits haggle above the theod +20291|1840|27|2|16|27869.44|0.08|0.02|N|O|1997-06-23|1997-06-25|1997-07-14|DELIVER IN PERSON|TRUCK|integrate blithely express deposit +20291|403|4|3|12|15640.80|0.03|0.01|N|O|1997-06-25|1997-06-23|1997-07-12|DELIVER IN PERSON|RAIL|t the slyly regular escap +20292|1988|21|1|27|51029.46|0.02|0.01|A|F|1992-11-11|1993-01-20|1992-11-27|DELIVER IN PERSON|MAIL|express depende +20292|1426|66|2|48|63716.16|0.07|0.02|A|F|1993-01-30|1993-01-27|1993-02-20|DELIVER IN PERSON|AIR|regular accounts haggle across t +20292|1877|64|3|38|67597.06|0.08|0.02|A|F|1993-01-07|1992-12-17|1993-01-31|NONE|REG AIR|the enticingly fluff +20292|1380|19|4|17|21783.46|0.02|0.08|R|F|1993-01-09|1993-01-04|1993-01-12|DELIVER IN PERSON|RAIL|l packages-- pending, +20292|973|74|5|31|58093.07|0.00|0.00|A|F|1992-12-09|1992-12-15|1992-12-14|DELIVER IN PERSON|REG AIR|te furiously blithely pending accounts. en +20292|1485|86|6|4|5545.92|0.04|0.02|A|F|1993-03-01|1993-01-09|1993-03-17|TAKE BACK RETURN|SHIP|ly across the +20292|964|33|7|44|82058.24|0.01|0.05|A|F|1992-12-14|1993-01-26|1992-12-28|TAKE BACK RETURN|FOB| foxes are silent, bo +20293|132|59|1|48|49542.24|0.05|0.02|N|O|1997-12-26|1998-01-26|1998-01-04|COLLECT COD|TRUCK|posits. furiously unusual platelets +20293|896|63|2|10|17968.90|0.00|0.00|N|O|1998-03-03|1998-03-14|1998-03-06|DELIVER IN PERSON|FOB|dolphins wake. packages affix furio +20293|1356|57|3|35|44007.25|0.08|0.04|N|O|1998-03-24|1998-03-04|1998-04-07|COLLECT COD|MAIL|run above the regular, bold excuses. blit +20293|1248|49|4|8|9193.92|0.00|0.04|N|O|1998-04-20|1998-03-15|1998-05-09|COLLECT COD|RAIL|sits sleep ca +20293|1805|92|5|37|63151.60|0.00|0.00|N|O|1998-02-10|1998-02-27|1998-03-03|DELIVER IN PERSON|FOB|express theodolites. final hocke +20294|600|1|1|17|25510.20|0.09|0.08|R|F|1993-01-11|1993-03-24|1993-01-14|NONE|TRUCK|y final requests sleep. unusual, regular id +20294|1869|13|2|43|76146.98|0.07|0.07|A|F|1993-01-23|1993-02-14|1993-01-28|NONE|RAIL|ly silent courts cajole careful +20295|1351|52|1|29|36318.15|0.06|0.00|R|F|1993-05-26|1993-04-11|1993-05-29|COLLECT COD|MAIL|xcuses haggle quickly iron +20320|209|37|1|23|25511.60|0.06|0.01|N|O|1997-03-25|1997-01-19|1997-04-13|DELIVER IN PERSON|SHIP|althy excuses nod iron +20320|1682|83|2|30|47510.40|0.06|0.08|N|O|1996-12-19|1997-02-07|1997-01-02|DELIVER IN PERSON|SHIP|ending packages c +20320|285|40|3|27|32002.56|0.09|0.06|N|O|1997-02-27|1997-02-28|1997-03-23|COLLECT COD|REG AIR| quickly special reques +20320|1828|15|4|3|5189.46|0.02|0.04|N|O|1996-12-13|1997-03-03|1996-12-19|DELIVER IN PERSON|TRUCK|ly idle packages are alon +20320|18|69|5|40|36720.40|0.05|0.02|N|O|1997-04-02|1997-02-14|1997-04-24|NONE|FOB| ideas. carefully express pin +20320|990|25|6|45|85094.55|0.01|0.01|N|O|1997-01-27|1997-02-05|1997-02-02|DELIVER IN PERSON|RAIL|o beans use carefully. blithely fi +20321|1993|38|1|9|17054.91|0.01|0.06|N|O|1996-09-16|1996-11-21|1996-09-21|NONE|TRUCK|pendencies around the ironic +20321|648|49|2|13|20132.32|0.02|0.07|N|O|1996-11-30|1996-11-29|1996-12-26|DELIVER IN PERSON|MAIL| express ideas alo +20321|994|97|3|26|49269.74|0.06|0.04|N|O|1996-09-10|1996-10-08|1996-09-28|NONE|AIR|ely daring instructions. ca +20322|1697|98|1|4|6394.76|0.05|0.00|R|F|1994-10-22|1994-09-27|1994-10-27|NONE|TRUCK|totes upon the slyly fluffy deposits +20322|426|14|2|48|63668.16|0.05|0.07|R|F|1994-08-23|1994-08-27|1994-09-20|DELIVER IN PERSON|SHIP|y special instructions nag. sly +20322|1170|71|3|41|43917.97|0.04|0.02|A|F|1994-08-16|1994-09-13|1994-09-06|DELIVER IN PERSON|AIR|g regular, pending dolphins. bl +20322|1207|8|4|40|44328.00|0.08|0.08|A|F|1994-08-06|1994-08-24|1994-08-13|NONE|FOB|ets integrate +20322|86|12|5|26|25638.08|0.08|0.03|A|F|1994-08-29|1994-09-07|1994-09-21|NONE|FOB|. final packages should serv +20322|1365|42|6|3|3799.08|0.08|0.08|R|F|1994-09-14|1994-08-04|1994-09-22|COLLECT COD|REG AIR|l requests use blithely slyly regul +20323|1384|85|1|6|7712.28|0.08|0.00|N|O|1995-08-11|1995-06-14|1995-08-17|DELIVER IN PERSON|FOB| orbits according to the regul +20323|173|74|2|27|28975.59|0.02|0.01|N|O|1995-07-08|1995-07-26|1995-07-20|TAKE BACK RETURN|RAIL|pendencies among the slyly express sautern +20323|1112|21|3|46|46603.06|0.05|0.07|N|O|1995-08-16|1995-07-20|1995-08-29|NONE|TRUCK|kly blithely regular +20324|1725|26|1|37|60188.64|0.00|0.06|N|O|1995-08-12|1995-07-31|1995-08-18|NONE|RAIL| dogged frays. carefully bold deposits na +20324|1511|92|2|38|53675.38|0.04|0.02|N|O|1995-07-22|1995-08-31|1995-08-02|TAKE BACK RETURN|SHIP|nal ideas +20325|1133|70|1|46|47569.98|0.08|0.02|R|F|1993-08-21|1993-09-12|1993-08-29|DELIVER IN PERSON|AIR|y even excuses engage furiously. warho +20325|641|4|2|27|41624.28|0.04|0.04|R|F|1993-07-12|1993-09-17|1993-07-26|COLLECT COD|FOB|fily even ideas boost fluffily +20325|838|38|3|10|17388.30|0.07|0.04|A|F|1993-11-01|1993-09-20|1993-11-04|COLLECT COD|REG AIR|uests are +20325|1156|93|4|18|19028.70|0.02|0.00|R|F|1993-09-04|1993-08-12|1993-10-04|DELIVER IN PERSON|TRUCK|ests. quickly blithe foxes sh +20325|1420|38|5|25|33035.50|0.00|0.06|R|F|1993-09-19|1993-08-30|1993-09-29|TAKE BACK RETURN|AIR| requests. carefully final account +20325|372|29|6|48|61073.76|0.04|0.06|A|F|1993-08-07|1993-09-01|1993-08-16|TAKE BACK RETURN|REG AIR|l, express pinto beans cajole. +20325|261|62|7|45|52256.70|0.08|0.00|R|F|1993-09-15|1993-09-20|1993-09-20|NONE|REG AIR|aggle quickly. fluffily bold instructions n +20326|733|98|1|48|78419.04|0.09|0.00|N|O|1996-02-03|1996-02-20|1996-02-27|NONE|SHIP|s wake furiously a +20326|708|5|2|26|41826.20|0.02|0.07|N|O|1996-01-06|1996-01-31|1996-01-24|NONE|RAIL|across the +20327|101|28|1|6|6006.60|0.10|0.05|N|O|1996-07-07|1996-08-15|1996-07-28|TAKE BACK RETURN|AIR|y. blithely ironic d +20327|334|19|2|12|14811.96|0.01|0.02|N|O|1996-07-04|1996-07-26|1996-07-05|COLLECT COD|TRUCK|according to the regul +20327|1024|30|3|19|17575.38|0.09|0.08|N|O|1996-06-03|1996-08-02|1996-06-11|NONE|SHIP|ccounts promise slyly slyly final pa +20327|1039|40|4|35|32901.05|0.02|0.07|N|O|1996-06-11|1996-08-25|1996-06-16|NONE|REG AIR|efully blithely express ac +20327|431|32|5|45|59914.35|0.08|0.05|N|O|1996-09-06|1996-07-20|1996-09-09|COLLECT COD|TRUCK|ess, special deposits n +20352|1553|74|1|8|11636.40|0.09|0.06|N|O|1998-04-15|1998-04-11|1998-05-10|DELIVER IN PERSON|MAIL|slyly. unusu +20352|937|38|2|31|56975.83|0.08|0.03|N|O|1998-03-11|1998-04-20|1998-03-21|COLLECT COD|REG AIR|ously packages: slyly fina +20352|171|24|3|48|51416.16|0.10|0.08|N|O|1998-04-20|1998-03-19|1998-05-08|TAKE BACK RETURN|REG AIR|to beans are fluffily special, +20352|1540|61|4|20|28830.80|0.02|0.03|N|O|1998-06-07|1998-04-08|1998-06-23|COLLECT COD|TRUCK|iously express accounts. blithely even excu +20352|362|91|5|28|35346.08|0.04|0.00|N|O|1998-04-14|1998-05-10|1998-05-13|NONE|FOB| slyly even realms after the instruction +20353|1527|68|1|30|42855.60|0.06|0.05|N|O|1997-08-12|1997-08-22|1997-08-30|COLLECT COD|REG AIR|riously ironic deposits. blithely ir +20353|883|83|2|47|83842.36|0.04|0.03|N|O|1997-10-05|1997-09-23|1997-10-27|NONE|FOB|es cajole blithely. theodolites +20354|588|89|1|41|61031.78|0.00|0.05|R|F|1992-11-19|1992-10-20|1992-11-29|TAKE BACK RETURN|AIR|lyly pending +20354|286|14|2|43|51010.04|0.07|0.08|R|F|1992-10-27|1992-12-02|1992-11-24|DELIVER IN PERSON|SHIP|uickly. ironic, unusual pa +20354|1766|9|3|32|53368.32|0.01|0.07|A|F|1992-11-06|1992-11-08|1992-11-26|DELIVER IN PERSON|FOB| are boldly silent asymptotes. express, +20354|542|3|4|33|47603.82|0.06|0.04|R|F|1992-12-07|1992-12-18|1992-12-10|NONE|TRUCK|ly pending platelets. foxes wake blithe +20354|798|95|5|45|76445.55|0.02|0.05|R|F|1992-12-19|1992-10-30|1993-01-04|NONE|FOB|are blithely along the slyly bold fo +20355|751|84|1|41|67721.75|0.06|0.06|R|F|1993-09-10|1993-07-08|1993-09-16|TAKE BACK RETURN|REG AIR|packages sleep. carefully regu +20356|1587|68|1|46|68474.68|0.00|0.06|N|O|1995-11-08|1995-10-28|1995-11-25|TAKE BACK RETURN|FOB|ependencies: carefully final +20356|1349|26|2|29|36259.86|0.10|0.01|N|O|1995-12-03|1995-12-13|1996-01-02|TAKE BACK RETURN|AIR|regular deposits across th +20357|34|10|1|20|18680.60|0.06|0.02|N|O|1996-11-22|1996-12-12|1996-12-07|COLLECT COD|RAIL|foxes sleep regular plate +20357|978|47|2|28|52611.16|0.04|0.06|N|O|1997-02-14|1997-01-09|1997-03-01|NONE|FOB|ng pearls nag furious +20357|137|38|3|2|2074.26|0.07|0.04|N|O|1997-02-18|1997-01-20|1997-03-17|TAKE BACK RETURN|AIR|t the bold deposits. slyly re +20358|571|32|1|5|7357.85|0.08|0.00|N|O|1997-04-18|1997-05-16|1997-04-27|TAKE BACK RETURN|TRUCK|packages sinc +20358|689|52|2|27|42921.36|0.10|0.04|N|O|1997-06-26|1997-04-20|1997-06-30|TAKE BACK RETURN|MAIL|ly ironic foxes. expre +20358|170|97|3|30|32105.10|0.02|0.02|N|O|1997-04-06|1997-04-25|1997-04-22|TAKE BACK RETURN|MAIL|n requests snooze across the blithely even +20359|432|33|1|14|18654.02|0.09|0.04|R|F|1994-11-04|1995-01-02|1994-11-13|NONE|TRUCK|accounts again +20359|137|16|2|28|29039.64|0.03|0.03|R|F|1994-11-24|1994-12-04|1994-12-21|COLLECT COD|MAIL|ar deposits. carefully regular instruct +20359|944|79|3|18|33208.92|0.06|0.02|A|F|1995-02-11|1995-01-26|1995-02-22|COLLECT COD|RAIL|nstructions. carefully ironic +20384|657|89|1|5|7788.25|0.03|0.00|N|O|1995-12-14|1996-01-10|1995-12-24|TAKE BACK RETURN|MAIL|ptotes wake slyly. slyly even accounts b +20384|1279|80|2|3|3540.81|0.09|0.00|N|O|1995-12-07|1995-12-14|1995-12-19|DELIVER IN PERSON|TRUCK|s alongside of the quickly regular +20384|269|51|3|31|36247.06|0.06|0.08|N|O|1995-12-02|1996-01-03|1995-12-09|DELIVER IN PERSON|FOB|in ironically alongsid +20384|312|69|4|7|8486.17|0.03|0.00|N|O|1996-01-04|1995-12-19|1996-01-08|TAKE BACK RETURN|RAIL|d foxes affix again +20384|992|27|5|41|77612.59|0.03|0.06|N|O|1996-01-06|1995-12-14|1996-01-26|DELIVER IN PERSON|FOB|blate. final, regular +20384|1182|55|6|50|54159.00|0.07|0.02|N|O|1995-12-20|1995-12-20|1996-01-12|COLLECT COD|MAIL|ending request +20385|571|2|1|37|54448.09|0.07|0.08|N|O|1996-09-10|1996-10-10|1996-09-11|DELIVER IN PERSON|SHIP|ly ironic platelets. reg +20385|1424|3|2|29|38437.18|0.01|0.00|N|O|1996-08-03|1996-08-30|1996-08-10|COLLECT COD|REG AIR|y special instructions sleep ir +20385|1191|92|3|36|39318.84|0.02|0.00|N|O|1996-10-07|1996-09-30|1996-10-08|COLLECT COD|RAIL|ffily regular i +20385|1557|78|4|34|49590.70|0.03|0.00|N|O|1996-09-07|1996-09-23|1996-09-13|TAKE BACK RETURN|AIR|nag furiously special ideas. accounts wake +20385|1594|35|5|28|41876.52|0.01|0.05|N|O|1996-08-12|1996-10-02|1996-09-06|DELIVER IN PERSON|MAIL|ests. quickly ironic frays wake furiously +20385|1601|25|6|44|66114.40|0.08|0.03|N|O|1996-08-13|1996-08-28|1996-08-31|DELIVER IN PERSON|REG AIR| blithely +20386|422|10|1|33|43639.86|0.00|0.03|A|F|1993-04-29|1993-04-13|1993-05-12|TAKE BACK RETURN|MAIL|unusual grouches. permanently express +20386|518|19|2|23|32625.73|0.06|0.08|A|F|1993-05-24|1993-05-28|1993-06-17|DELIVER IN PERSON|TRUCK|ng packages. blithely +20387|629|61|1|33|50477.46|0.08|0.02|N|O|1997-08-14|1997-07-21|1997-08-17|TAKE BACK RETURN|MAIL|ckly regular packages sleep sly +20387|61|62|2|14|13454.84|0.10|0.02|N|O|1997-05-29|1997-06-20|1997-05-30|TAKE BACK RETURN|FOB|ions are f +20387|707|4|3|29|46623.30|0.07|0.07|N|O|1997-08-03|1997-07-27|1997-08-04|DELIVER IN PERSON|AIR|sly ironic requests +20388|643|75|1|27|41678.28|0.09|0.04|N|O|1996-07-26|1996-06-14|1996-08-11|NONE|REG AIR|ess pinto beans x-ray carefully. un +20388|1603|4|2|26|39119.60|0.02|0.08|N|O|1996-08-05|1996-07-23|1996-08-30|NONE|MAIL|carefully special asymptotes. quickly regu +20388|540|41|3|20|28810.80|0.05|0.06|N|O|1996-05-08|1996-07-11|1996-05-16|NONE|REG AIR|lar accounts wake furio +20388|1385|24|4|37|47596.06|0.06|0.07|N|O|1996-05-16|1996-07-02|1996-06-08|COLLECT COD|FOB|luffily bold theodolites detect slyly. u +20389|885|19|1|39|69649.32|0.02|0.02|A|F|1994-10-05|1994-09-13|1994-10-08|COLLECT COD|RAIL|ut the ironic packages. ex +20389|878|12|2|27|48029.49|0.04|0.02|A|F|1994-08-29|1994-10-21|1994-09-03|DELIVER IN PERSON|FOB|egular instructions slee +20389|1308|23|3|46|55627.80|0.06|0.00|R|F|1994-10-17|1994-10-30|1994-11-16|DELIVER IN PERSON|TRUCK|usly bold pinto beans-- slyly express +20389|499|58|4|24|33587.76|0.08|0.05|R|F|1994-09-08|1994-09-13|1994-09-12|NONE|FOB|ully ironic orbits abo +20390|770|67|1|16|26732.32|0.03|0.02|A|F|1994-12-12|1994-11-21|1994-12-22|TAKE BACK RETURN|AIR|es snooze quickly +20390|250|51|2|43|49460.75|0.04|0.01|R|F|1994-09-29|1994-11-20|1994-09-30|DELIVER IN PERSON|MAIL|ultipliers. furiously i +20390|805|6|3|10|17058.00|0.05|0.04|R|F|1994-12-12|1994-10-12|1994-12-25|TAKE BACK RETURN|TRUCK|blithely around the unusual, unusual accou +20390|100|76|4|21|21002.10|0.06|0.00|R|F|1994-09-16|1994-11-22|1994-10-02|COLLECT COD|TRUCK|ts snooze blithely even requests. +20390|1367|6|5|10|12683.60|0.01|0.04|A|F|1994-11-22|1994-10-08|1994-12-07|COLLECT COD|AIR|e the ironic, final +20390|1026|27|6|34|31518.68|0.05|0.07|R|F|1994-12-23|1994-11-09|1995-01-09|NONE|MAIL|final requests cajole carefully about +20391|1110|11|1|50|50555.50|0.08|0.00|A|F|1994-02-26|1994-03-31|1994-03-04|NONE|MAIL|deposits are ac +20416|1682|6|1|45|71265.60|0.09|0.05|N|O|1996-07-15|1996-08-01|1996-07-16|COLLECT COD|FOB|y regular w +20416|1957|46|2|49|91088.55|0.08|0.04|N|O|1996-07-05|1996-09-04|1996-07-06|NONE|AIR|eposits mold slyly after the packages. +20416|1691|92|3|22|35039.18|0.00|0.02|N|O|1996-08-17|1996-09-13|1996-09-12|NONE|MAIL|final deposits sleep blithely +20416|803|3|4|28|47706.40|0.09|0.02|N|O|1996-09-01|1996-08-02|1996-09-11|DELIVER IN PERSON|REG AIR|alms according to th +20416|541|42|5|35|50453.90|0.00|0.02|N|O|1996-07-18|1996-07-27|1996-08-03|DELIVER IN PERSON|MAIL|egular excuses. sly +20417|1545|46|1|5|7232.70|0.07|0.08|A|F|1992-04-30|1992-04-21|1992-05-16|COLLECT COD|FOB|unts. final deposits haggle carefu +20417|499|100|2|28|39185.72|0.00|0.06|A|F|1992-05-27|1992-03-24|1992-05-30|NONE|TRUCK|s integrate ironic theo +20417|1029|100|3|10|9300.20|0.08|0.02|R|F|1992-05-29|1992-04-08|1992-06-18|TAKE BACK RETURN|MAIL|requests use slyly requ +20418|774|39|1|3|5024.31|0.09|0.01|N|O|1997-11-21|1997-11-30|1997-12-02|COLLECT COD|AIR|y ironic p +20418|542|33|2|40|57701.60|0.07|0.05|N|O|1998-01-03|1997-12-01|1998-01-12|NONE|RAIL|ckages. special, final dependencies are q +20418|1712|39|3|38|61320.98|0.01|0.02|N|O|1997-10-26|1997-10-12|1997-11-01|NONE|AIR|xes cajole acro +20418|404|5|4|22|28696.80|0.10|0.07|N|O|1997-09-16|1997-11-27|1997-10-12|TAKE BACK RETURN|AIR|furiously bold ideas are carefull +20418|1743|86|5|10|16447.40|0.03|0.02|N|O|1997-11-04|1997-12-07|1997-11-09|NONE|FOB|l theodolites; bold requests us +20418|828|62|6|4|6915.28|0.05|0.01|N|O|1997-11-22|1997-11-22|1997-12-04|NONE|SHIP|to beans detect blithely +20419|1324|39|1|50|61266.00|0.06|0.04|N|O|1997-11-16|1997-11-07|1997-12-05|DELIVER IN PERSON|TRUCK| furiously unusual deposits are slyly b +20420|1191|64|1|30|32765.70|0.05|0.06|N|O|1997-10-11|1997-09-16|1997-10-19|TAKE BACK RETURN|MAIL| theodolites af +20420|1224|99|2|43|48384.46|0.03|0.01|N|O|1997-07-11|1997-08-27|1997-07-22|DELIVER IN PERSON|FOB|accounts. blithely final deposits boost +20421|990|25|1|3|5672.97|0.03|0.08|N|O|1998-07-23|1998-07-25|1998-08-09|COLLECT COD|MAIL| slyly final instructions +20421|285|40|2|49|58078.72|0.06|0.01|N|O|1998-07-29|1998-07-30|1998-08-04|TAKE BACK RETURN|FOB|ronic multipliers wake a +20421|92|18|3|27|26786.43|0.04|0.08|N|O|1998-06-20|1998-07-28|1998-07-01|NONE|RAIL|ly. ironic, pending p +20422|1103|40|1|8|8032.80|0.04|0.03|R|F|1994-03-09|1994-04-22|1994-04-03|DELIVER IN PERSON|RAIL|lly bold accounts are fur +20422|643|75|2|4|6174.56|0.00|0.01|A|F|1994-02-19|1994-03-08|1994-02-25|COLLECT COD|TRUCK|. blithely re +20422|1260|61|3|9|10451.34|0.10|0.05|A|F|1994-03-09|1994-03-30|1994-03-25|NONE|FOB|ic deposits cajole +20422|482|70|4|44|60829.12|0.07|0.02|R|F|1994-03-18|1994-04-12|1994-03-25|COLLECT COD|SHIP|ackages haggle fluffily by the requests. s +20422|520|51|5|19|26989.88|0.06|0.02|A|F|1994-01-31|1994-02-26|1994-02-01|NONE|RAIL|equests. regular packages integ +20423|460|19|1|38|51697.48|0.06|0.01|N|O|1998-02-20|1997-12-16|1998-03-02|COLLECT COD|TRUCK|y permanent packages unwind slyly across th +20423|396|97|2|39|50559.21|0.10|0.03|N|O|1998-01-23|1998-01-03|1998-02-22|NONE|AIR|grate furiously again +20423|539|100|3|8|11516.24|0.05|0.05|N|O|1998-02-23|1998-02-03|1998-03-21|NONE|MAIL|ular packages breach fluffi +20423|1326|3|4|12|14727.84|0.01|0.01|N|O|1998-01-23|1998-02-03|1998-02-11|DELIVER IN PERSON|SHIP| carefully re +20423|1335|36|5|46|56871.18|0.07|0.06|N|O|1997-11-21|1998-01-27|1997-12-06|COLLECT COD|FOB|long the furiously blithe +20448|616|17|1|46|69764.06|0.04|0.07|N|O|1995-08-05|1995-10-17|1995-08-25|TAKE BACK RETURN|AIR|to beans are quickly pe +20448|1431|71|2|9|11991.87|0.01|0.02|N|O|1995-11-01|1995-10-18|1995-11-18|NONE|AIR|latelets. slyly unusual requests wake +20449|1569|50|1|37|54410.72|0.08|0.06|A|F|1993-01-12|1993-04-04|1993-01-31|TAKE BACK RETURN|SHIP|long the fu +20449|1037|38|2|18|16884.54|0.02|0.07|A|F|1993-05-05|1993-03-23|1993-05-18|NONE|MAIL|final asymptotes i +20449|1798|99|3|21|35695.59|0.05|0.08|A|F|1993-01-26|1993-03-17|1993-02-13|COLLECT COD|MAIL|unts among +20449|1591|72|4|39|58211.01|0.00|0.00|R|F|1993-04-19|1993-02-12|1993-04-30|NONE|AIR|ldly bold dependenci +20449|289|44|5|48|57085.44|0.04|0.07|A|F|1993-03-19|1993-03-31|1993-03-24|COLLECT COD|RAIL|und the carefully even pinto be +20450|1029|65|1|24|22320.48|0.06|0.05|R|F|1992-12-14|1993-02-12|1992-12-17|TAKE BACK RETURN|REG AIR| the carefully +20450|916|19|2|5|9084.55|0.06|0.06|R|F|1993-04-05|1993-01-25|1993-04-23|DELIVER IN PERSON|AIR|daring instructions haggle quickl +20450|1407|25|3|24|31401.60|0.05|0.08|R|F|1993-01-03|1993-02-25|1993-01-28|NONE|TRUCK|re along the slow, unusual pinto beans. fu +20451|1635|77|1|17|26122.71|0.02|0.06|A|F|1992-08-18|1992-08-20|1992-09-15|TAKE BACK RETURN|REG AIR| forges. regular +20451|1339|40|2|27|33488.91|0.09|0.06|R|F|1992-08-23|1992-07-13|1992-09-09|NONE|SHIP|hinly quick +20451|301|30|3|20|24026.00|0.07|0.06|A|F|1992-05-27|1992-07-06|1992-06-10|TAKE BACK RETURN|SHIP|ests along the quickly +20451|1951|84|4|11|20382.45|0.03|0.00|A|F|1992-09-12|1992-08-22|1992-09-14|TAKE BACK RETURN|AIR|deposits. carefully final dugouts are bus +20451|49|100|5|34|32267.36|0.01|0.04|R|F|1992-06-25|1992-08-04|1992-07-15|NONE|AIR|fully requests. +20451|1269|44|6|20|23405.20|0.01|0.00|A|F|1992-09-20|1992-08-17|1992-09-26|DELIVER IN PERSON|AIR|refully ironic theodolites wake flu +20451|377|6|7|21|26824.77|0.09|0.06|R|F|1992-09-22|1992-06-26|1992-09-23|COLLECT COD|REG AIR|iously furiously +20452|312|13|1|4|4849.24|0.05|0.04|R|F|1995-04-30|1995-03-31|1995-05-16|TAKE BACK RETURN|SHIP|instructions boost carefully slyly ironic +20452|324|53|2|28|34280.96|0.03|0.01|R|F|1995-01-24|1995-03-01|1995-01-27|TAKE BACK RETURN|MAIL|unwind carefully above the blithely regu +20453|1253|65|1|45|51941.25|0.09|0.08|N|O|1995-06-19|1995-04-27|1995-07-04|DELIVER IN PERSON|SHIP|final accounts. bold, special packag +20453|1301|2|2|14|16832.20|0.04|0.05|N|O|1995-06-28|1995-04-21|1995-07-20|COLLECT COD|AIR| pinto beans sleep asymptotes. furio +20453|857|58|3|2|3515.70|0.04|0.07|R|F|1995-05-12|1995-05-02|1995-06-03|DELIVER IN PERSON|MAIL|eyond the car +20453|420|79|4|3|3961.26|0.03|0.04|N|O|1995-06-20|1995-05-20|1995-07-09|NONE|MAIL|ffily even requests are bli +20453|167|20|5|39|41619.24|0.03|0.01|A|F|1995-06-11|1995-06-05|1995-06-17|NONE|AIR| fluffily af +20453|323|24|6|49|59942.68|0.03|0.08|N|O|1995-07-02|1995-05-24|1995-07-20|NONE|TRUCK|ironic requests sleep blithely +20454|739|4|1|35|57390.55|0.06|0.05|A|F|1995-04-08|1995-05-18|1995-04-13|NONE|SHIP|ses. slyly even packages ac +20455|757|54|1|48|79572.00|0.00|0.00|R|F|1993-10-11|1993-08-24|1993-10-31|COLLECT COD|FOB|to sleep. fluffily even +20455|722|23|2|41|66531.52|0.06|0.02|A|F|1993-08-21|1993-08-24|1993-08-26|COLLECT COD|MAIL|re quickly: blithely ironic requests +20455|1734|61|3|40|65429.20|0.03|0.08|A|F|1993-08-26|1993-08-28|1993-09-17|NONE|RAIL|haggle care +20455|1001|37|4|21|18942.00|0.01|0.06|R|F|1993-07-19|1993-09-17|1993-08-11|COLLECT COD|MAIL|thlessly e +20480|1598|79|1|12|17995.08|0.06|0.08|R|F|1994-02-22|1994-03-25|1994-03-14|COLLECT COD|TRUCK| fluffily sly platelets affix. careful +20480|1723|66|2|39|63364.08|0.08|0.07|A|F|1994-02-20|1994-03-31|1994-02-25|DELIVER IN PERSON|AIR|ilent multipliers. +20480|451|81|3|7|9460.15|0.02|0.03|R|F|1994-03-18|1994-04-02|1994-04-04|COLLECT COD|SHIP| sleep fluffily. express instr +20480|255|83|4|36|41589.00|0.01|0.03|A|F|1994-02-13|1994-03-15|1994-03-07|NONE|AIR|tes integrate blithe +20480|1773|58|5|19|31820.63|0.08|0.08|R|F|1994-04-18|1994-03-31|1994-05-10|COLLECT COD|TRUCK|es use. theodolites +20480|1229|41|6|2|2260.44|0.06|0.06|A|F|1994-02-22|1994-03-08|1994-03-21|DELIVER IN PERSON|REG AIR|y special pinto beans among th +20480|626|27|7|17|25952.54|0.10|0.03|A|F|1994-02-22|1994-03-08|1994-03-17|DELIVER IN PERSON|TRUCK|riously. requests among the as +20481|1311|88|1|25|30307.75|0.07|0.00|N|O|1997-11-24|1997-12-29|1997-12-18|TAKE BACK RETURN|FOB|eas. pending, even accounts mold doggedly +20481|427|86|2|4|5309.68|0.10|0.05|N|O|1997-11-30|1998-01-06|1997-12-29|COLLECT COD|RAIL|kly against the even deposi +20481|1564|65|3|7|10258.92|0.03|0.00|N|O|1997-12-08|1997-12-18|1997-12-12|NONE|MAIL|ntegrate furiously. careful +20481|863|30|4|9|15874.74|0.09|0.02|N|O|1998-02-05|1998-01-08|1998-02-08|TAKE BACK RETURN|RAIL|quickly ironic d +20481|50|51|5|29|27551.45|0.02|0.00|N|O|1998-02-11|1998-01-31|1998-03-02|DELIVER IN PERSON|TRUCK|even courts. thinly regular t +20481|1225|26|6|1|1126.22|0.07|0.04|N|O|1997-11-17|1998-01-31|1997-12-08|TAKE BACK RETURN|FOB|efully according +20482|468|56|1|10|13684.60|0.00|0.03|N|O|1995-11-13|1995-09-25|1995-11-22|NONE|RAIL|efully. even, even platelets nag pinto b +20482|1513|54|2|19|26875.69|0.07|0.05|N|O|1995-10-05|1995-09-24|1995-11-02|TAKE BACK RETURN|AIR|ully even pinto beans. excuses against +20482|1060|96|3|26|24987.56|0.06|0.03|N|O|1995-09-18|1995-09-22|1995-10-03|TAKE BACK RETURN|SHIP|s boost quickly. stealthily fin +20482|733|98|4|36|58814.28|0.01|0.05|N|O|1995-11-04|1995-09-15|1995-11-16|NONE|RAIL|ep quickly. quickly express inst +20482|221|22|5|38|42606.36|0.02|0.07|N|O|1995-10-09|1995-09-21|1995-10-30|NONE|RAIL|uests cajole furiously +20482|1826|27|6|32|55290.24|0.02|0.03|N|O|1995-08-16|1995-09-15|1995-08-27|COLLECT COD|SHIP|y final dolphins haggle dependencies +20483|513|4|1|37|52299.87|0.00|0.02|A|F|1993-03-05|1993-02-21|1993-03-22|COLLECT COD|REG AIR|al deposits against the carefully ironic +20483|774|75|2|10|16747.70|0.07|0.00|R|F|1993-03-18|1993-03-14|1993-04-13|TAKE BACK RETURN|TRUCK|al escapades. pe +20483|191|44|3|21|22914.99|0.10|0.02|A|F|1993-01-20|1993-03-03|1993-02-18|COLLECT COD|FOB|c instructions will integrate blithely +20483|97|23|4|16|15953.44|0.03|0.05|R|F|1993-03-03|1993-03-18|1993-03-13|DELIVER IN PERSON|REG AIR|ns. fluffily even +20484|511|12|1|38|53637.38|0.10|0.04|R|F|1994-04-26|1994-04-04|1994-05-07|COLLECT COD|AIR|nic deposi +20484|209|91|2|31|34385.20|0.09|0.08|R|F|1994-04-30|1994-04-26|1994-05-24|DELIVER IN PERSON|REG AIR|sly ironic depo +20484|1549|70|3|9|13054.86|0.00|0.06|R|F|1994-05-30|1994-03-11|1994-06-01|TAKE BACK RETURN|RAIL|xpress accounts. +20484|1191|28|4|48|52425.12|0.06|0.07|R|F|1994-03-08|1994-04-13|1994-03-16|TAKE BACK RETURN|RAIL|ptotes are flu +20485|1963|52|1|24|44759.04|0.00|0.00|N|O|1996-11-30|1997-01-12|1996-12-13|COLLECT COD|REG AIR|are quickly alongside of +20485|187|40|2|34|36964.12|0.03|0.01|N|O|1997-03-16|1997-01-02|1997-03-26|TAKE BACK RETURN|SHIP|ts haggle fluffily regular, i +20485|973|76|3|21|39353.37|0.07|0.08|N|O|1997-01-06|1997-01-18|1997-01-19|NONE|TRUCK|after the slyly final platelets. ironic +20485|16|92|4|49|44884.49|0.04|0.01|N|O|1996-12-03|1997-01-18|1996-12-15|DELIVER IN PERSON|REG AIR|ic requests. car +20486|237|65|1|20|22744.60|0.01|0.06|R|F|1995-03-22|1995-05-17|1995-04-01|DELIVER IN PERSON|FOB| final ideas. even acc +20486|875|9|2|6|10655.22|0.01|0.05|A|F|1995-05-01|1995-05-13|1995-05-06|TAKE BACK RETURN|MAIL|ly regular asymptotes engage f +20486|69|95|3|29|28102.74|0.05|0.01|A|F|1995-03-28|1995-05-03|1995-04-21|TAKE BACK RETURN|TRUCK|re furiously ironic waters. +20486|762|95|4|23|38243.48|0.07|0.07|A|F|1995-03-27|1995-05-12|1995-04-24|TAKE BACK RETURN|REG AIR|blithely bold deposits sleep s +20486|44|20|5|29|27377.16|0.03|0.08|A|F|1995-04-30|1995-05-29|1995-05-29|DELIVER IN PERSON|FOB|hes use around the slyly f +20486|1863|64|6|48|84713.28|0.04|0.01|R|F|1995-03-27|1995-05-02|1995-03-31|COLLECT COD|MAIL| slyly even dugouts. quickly ruthless w +20487|1431|10|1|19|25316.17|0.08|0.08|N|O|1996-06-22|1996-07-26|1996-06-30|COLLECT COD|TRUCK|deas. even, ironic deposits are carefull +20487|1191|64|2|48|52425.12|0.08|0.02|N|O|1996-06-22|1996-08-24|1996-07-08|NONE|FOB|yly regular reques +20487|726|23|3|12|19520.64|0.02|0.07|N|O|1996-07-25|1996-07-21|1996-08-04|COLLECT COD|SHIP|eve busily about +20487|1983|84|4|41|77284.18|0.07|0.04|N|O|1996-07-24|1996-08-21|1996-08-17|DELIVER IN PERSON|FOB|requests alongside of the platel +20512|334|35|1|38|46904.54|0.01|0.05|N|O|1996-02-18|1996-01-09|1996-03-19|NONE|RAIL|slyly even +20512|32|58|2|42|39145.26|0.06|0.03|N|O|1996-03-04|1995-12-06|1996-03-11|COLLECT COD|RAIL|de of the pending, pending requests. quick +20512|465|66|3|17|23212.82|0.00|0.02|N|O|1995-11-09|1996-01-30|1995-11-22|NONE|RAIL|ns. final, express p +20512|35|36|4|44|41141.32|0.09|0.08|N|O|1996-02-20|1996-01-29|1996-03-03|TAKE BACK RETURN|MAIL|ly regular ideas. unusual depe +20512|330|87|5|50|61516.50|0.04|0.01|N|O|1996-02-09|1996-01-03|1996-03-09|COLLECT COD|TRUCK|al requests are blithely agai +20512|1271|9|6|37|43373.99|0.04|0.05|N|O|1995-12-12|1996-01-18|1995-12-28|NONE|RAIL|r alongside o +20513|691|92|1|44|70034.36|0.02|0.07|A|F|1994-09-28|1994-09-25|1994-10-28|DELIVER IN PERSON|MAIL|nst the blithely special accounts. express, +20513|1572|93|2|20|29471.40|0.04|0.08|A|F|1994-08-02|1994-09-30|1994-08-05|TAKE BACK RETURN|SHIP|nal, express pac +20513|230|12|3|9|10172.07|0.00|0.02|R|F|1994-10-25|1994-09-08|1994-11-15|COLLECT COD|RAIL|kages cajole furiously bu +20513|1124|25|4|42|43055.04|0.08|0.08|A|F|1994-07-22|1994-09-03|1994-07-27|DELIVER IN PERSON|FOB|to beans cajole bol +20513|1716|43|5|29|46913.59|0.06|0.00|R|F|1994-10-13|1994-08-12|1994-10-21|COLLECT COD|SHIP|wake carefully final deposits. pac +20514|1352|29|1|25|31333.75|0.00|0.00|N|O|1998-08-30|1998-08-03|1998-09-18|COLLECT COD|RAIL|. carefully final requests boo +20514|1912|57|2|34|61672.94|0.06|0.01|N|O|1998-08-18|1998-06-25|1998-08-30|DELIVER IN PERSON|SHIP|ing to the evenly express requests. +20514|185|64|3|41|44492.38|0.02|0.00|N|O|1998-07-17|1998-06-22|1998-08-06|NONE|TRUCK| even packages. finally final packages +20515|1783|10|1|14|23586.92|0.04|0.03|N|O|1996-01-18|1996-01-05|1996-02-11|COLLECT COD|FOB|le accounts. +20516|733|34|1|4|6534.92|0.04|0.01|N|O|1996-04-04|1996-04-01|1996-04-24|COLLECT COD|FOB|eans cajole thinly slyly final dolphins. ex +20516|917|18|2|16|29086.56|0.08|0.03|N|O|1996-05-15|1996-05-12|1996-06-01|TAKE BACK RETURN|TRUCK|ons doubt b +20516|1009|10|3|13|11830.00|0.08|0.00|N|O|1996-05-17|1996-05-18|1996-05-21|DELIVER IN PERSON|AIR|. unusual deposits haggle +20517|1275|87|1|38|44698.26|0.07|0.08|A|F|1993-12-04|1993-10-23|1993-12-31|DELIVER IN PERSON|RAIL|egular platelet +20517|1932|77|2|22|40346.46|0.01|0.00|A|F|1993-12-04|1993-11-08|1993-12-10|DELIVER IN PERSON|RAIL|lphins serve blithely carefully even +20517|121|48|3|34|34718.08|0.01|0.02|R|F|1993-12-31|1993-11-29|1994-01-28|NONE|FOB|ickly quickly special accounts +20517|1388|3|4|31|39970.78|0.08|0.05|A|F|1993-11-23|1993-11-09|1993-12-01|DELIVER IN PERSON|REG AIR| packages. slyly +20517|159|86|5|9|9532.35|0.05|0.07|R|F|1993-12-29|1993-10-31|1994-01-14|COLLECT COD|FOB|st. furiously idle deposits wa +20517|26|27|6|36|33336.72|0.06|0.07|A|F|1993-12-15|1993-12-14|1994-01-04|TAKE BACK RETURN|MAIL|usly ironic requests about the b +20518|485|73|1|47|65117.56|0.10|0.07|A|F|1994-10-24|1994-12-25|1994-11-22|DELIVER IN PERSON|RAIL|the bravely ironic +20518|1048|19|2|15|14235.60|0.05|0.08|R|F|1994-12-09|1994-12-31|1994-12-19|NONE|SHIP|lithely quick deposits +20518|325|82|3|35|42886.20|0.09|0.03|R|F|1994-12-22|1994-12-01|1995-01-13|DELIVER IN PERSON|REG AIR|ke slyly platelets +20519|519|10|1|7|9936.57|0.10|0.03|A|F|1994-07-01|1994-07-07|1994-07-30|TAKE BACK RETURN|RAIL|ss carefully quickly pending platelets. bli +20519|1134|43|2|50|51756.50|0.01|0.03|R|F|1994-05-06|1994-06-13|1994-05-27|DELIVER IN PERSON|MAIL|ainst the furiously final f +20519|586|87|3|2|2973.16|0.07|0.01|R|F|1994-04-17|1994-05-12|1994-05-02|DELIVER IN PERSON|MAIL| instructions +20519|1236|74|4|49|55724.27|0.09|0.03|R|F|1994-06-24|1994-05-13|1994-07-20|TAKE BACK RETURN|TRUCK|s. furiously regular +20519|320|21|5|6|7321.92|0.01|0.06|R|F|1994-07-26|1994-06-04|1994-08-10|DELIVER IN PERSON|TRUCK|uriously regul +20519|480|10|6|38|52458.24|0.04|0.00|A|F|1994-04-21|1994-06-11|1994-04-30|TAKE BACK RETURN|TRUCK|ly even accounts. final +20544|1681|64|1|46|72803.28|0.06|0.03|N|O|1998-05-01|1998-04-02|1998-05-03|DELIVER IN PERSON|RAIL|nic, even accounts. qu +20545|500|88|1|26|36413.00|0.06|0.00|R|F|1993-11-28|1993-11-24|1993-12-19|COLLECT COD|TRUCK|nto beans +20545|1310|11|2|13|15747.03|0.06|0.00|A|F|1994-01-02|1993-11-21|1994-01-26|COLLECT COD|REG AIR|ackages cajole regularly. even, regu +20545|1238|39|3|37|42151.51|0.06|0.04|A|F|1994-02-03|1993-11-09|1994-02-25|COLLECT COD|TRUCK| the blithely silent dolphins +20545|363|64|4|3|3790.08|0.06|0.03|A|F|1993-11-28|1994-01-08|1993-12-10|DELIVER IN PERSON|TRUCK| slyly ironic +20545|1092|93|5|46|45682.14|0.04|0.08|A|F|1993-11-16|1993-12-06|1993-11-25|TAKE BACK RETURN|SHIP|bout the regular, even foxes sleep inside +20546|761|62|1|19|31573.44|0.05|0.05|R|F|1995-03-04|1995-02-20|1995-03-29|TAKE BACK RETURN|TRUCK|d requests ar +20546|1577|78|2|34|50271.38|0.07|0.05|R|F|1995-01-23|1995-01-13|1995-01-29|NONE|FOB|ructions. ironic, final a +20546|918|19|3|22|40016.02|0.09|0.01|A|F|1995-01-29|1995-02-28|1995-02-20|DELIVER IN PERSON|SHIP|cally even asymptotes. +20547|482|83|1|1|1382.48|0.09|0.05|A|F|1993-11-14|1993-11-18|1993-11-25|COLLECT COD|REG AIR| requests cajole regular, silent ideas. fur +20547|105|84|2|32|32163.20|0.06|0.00|R|F|1993-10-25|1993-11-12|1993-10-27|DELIVER IN PERSON|MAIL|ole quickly according to the blithely f +20548|1990|79|1|31|58651.69|0.10|0.03|A|F|1994-06-03|1994-06-28|1994-06-28|DELIVER IN PERSON|TRUCK|wake. daring reque +20548|539|70|2|39|56141.67|0.05|0.05|A|F|1994-08-10|1994-06-18|1994-08-19|COLLECT COD|TRUCK| the silent requests. pinto beans are caref +20548|1938|27|3|19|34958.67|0.08|0.01|R|F|1994-08-01|1994-06-15|1994-08-16|COLLECT COD|REG AIR|even reques +20548|553|54|4|34|49420.70|0.02|0.05|A|F|1994-05-14|1994-06-25|1994-05-30|TAKE BACK RETURN|REG AIR|unusual theodoli +20548|362|47|5|49|61855.64|0.01|0.07|R|F|1994-08-22|1994-06-28|1994-09-04|NONE|REG AIR|c accounts wake. quickly express a +20548|1050|86|6|24|22825.20|0.08|0.07|R|F|1994-08-22|1994-08-01|1994-08-28|TAKE BACK RETURN|REG AIR| grow furiously. +20549|1417|57|1|24|31641.84|0.00|0.03|R|F|1994-05-03|1994-03-18|1994-05-26|DELIVER IN PERSON|RAIL|ntegrate. carefully quick accou +20549|537|28|2|2|2875.06|0.09|0.00|A|F|1994-05-05|1994-03-29|1994-06-03|COLLECT COD|MAIL|unts haggle carefully carefully regu +20550|1185|22|1|21|22809.78|0.06|0.01|N|O|1998-05-21|1998-07-18|1998-05-25|DELIVER IN PERSON|RAIL|gular depen +20550|1114|23|2|34|34513.74|0.01|0.04|N|O|1998-07-08|1998-07-26|1998-07-11|DELIVER IN PERSON|AIR|ld deposits. carefully eve +20550|1047|48|3|1|948.04|0.08|0.02|N|O|1998-06-26|1998-07-31|1998-07-12|NONE|REG AIR|pending deposits. special foxes sleep +20551|395|80|1|17|22021.63|0.02|0.01|N|O|1996-06-06|1996-07-12|1996-06-16|DELIVER IN PERSON|FOB| final packag +20551|1561|42|2|43|62890.08|0.00|0.06|N|O|1996-05-14|1996-07-13|1996-06-06|COLLECT COD|REG AIR|le slyly r +20551|408|9|3|4|5233.60|0.09|0.04|N|O|1996-07-06|1996-06-05|1996-07-12|DELIVER IN PERSON|SHIP| carefully regular pack +20551|266|48|4|50|58313.00|0.05|0.01|N|O|1996-07-28|1996-06-04|1996-07-29|DELIVER IN PERSON|RAIL|es alongside of the closely u +20551|991|92|5|49|92707.51|0.08|0.06|N|O|1996-08-15|1996-07-16|1996-08-28|COLLECT COD|FOB|ending accoun +20551|1084|85|6|22|21671.76|0.08|0.06|N|O|1996-08-04|1996-06-08|1996-08-25|TAKE BACK RETURN|FOB|. slyly fina +20576|1495|35|1|21|29326.29|0.07|0.07|R|F|1993-12-10|1993-12-23|1993-12-24|COLLECT COD|FOB|aphs nag carefully across the carefully +20576|885|86|2|48|85722.24|0.07|0.08|R|F|1993-10-19|1993-12-20|1993-11-06|DELIVER IN PERSON|FOB|oxes impress. theodolites among the +20576|1326|65|3|18|22091.76|0.08|0.03|A|F|1993-12-10|1993-10-30|1993-12-24|NONE|AIR|ests cajole fluffily. silently +20576|845|45|4|47|82054.48|0.02|0.05|A|F|1993-11-25|1993-11-24|1993-12-03|DELIVER IN PERSON|MAIL| wake furiously slyly even grou +20576|1617|41|5|23|34928.03|0.06|0.07|R|F|1993-11-11|1993-11-27|1993-11-27|COLLECT COD|MAIL|ress, special excuses us +20576|123|76|6|4|4092.48|0.07|0.06|R|F|1993-11-08|1993-10-26|1993-11-17|COLLECT COD|RAIL| fluffily regular re +20576|406|65|7|17|22208.80|0.04|0.00|A|F|1993-10-09|1993-12-24|1993-10-17|NONE|REG AIR|ully unusual dependencies wake +20577|474|62|1|18|24740.46|0.03|0.05|R|F|1993-05-10|1993-04-05|1993-05-29|NONE|TRUCK|. permanently express +20577|1862|49|2|12|21166.32|0.04|0.08|R|F|1993-05-30|1993-03-28|1993-06-12|DELIVER IN PERSON|TRUCK|ts wake. blithely ironi +20577|1052|23|3|14|13342.70|0.01|0.02|R|F|1993-03-02|1993-03-13|1993-03-28|TAKE BACK RETURN|MAIL|lace of the sometimes unusual pinto +20577|338|95|4|41|50771.53|0.09|0.03|R|F|1993-05-01|1993-05-07|1993-05-21|NONE|TRUCK|the carefully ironic foxes a +20577|787|84|5|26|43882.28|0.05|0.06|R|F|1993-02-18|1993-05-09|1993-03-04|TAKE BACK RETURN|REG AIR|final patterns are bli +20577|1434|35|6|9|12018.87|0.03|0.04|R|F|1993-03-06|1993-03-20|1993-03-24|COLLECT COD|TRUCK|kages doubt agai +20577|1351|52|7|15|18785.25|0.05|0.05|A|F|1993-05-07|1993-04-19|1993-05-22|TAKE BACK RETURN|TRUCK| haggle. regular excuses h +20578|803|70|1|16|27260.80|0.10|0.07|N|O|1997-09-19|1997-08-04|1997-10-18|NONE|TRUCK|ironic asymptotes. carefull +20578|1677|19|2|17|26837.39|0.09|0.01|N|O|1997-08-27|1997-08-06|1997-09-18|DELIVER IN PERSON|FOB|l packages nag across the fl +20578|1822|23|3|43|74124.26|0.10|0.04|N|O|1997-08-21|1997-08-28|1997-09-10|COLLECT COD|TRUCK|al requests cajol +20578|88|89|4|44|43475.52|0.01|0.03|N|O|1997-09-12|1997-09-03|1997-09-26|NONE|MAIL|arefully final accounts haggle un +20578|637|100|5|30|46128.90|0.01|0.04|N|O|1997-07-12|1997-09-06|1997-08-10|COLLECT COD|TRUCK| haggle quickly. ruthlessly fi +20579|1678|20|1|21|33173.07|0.05|0.00|A|F|1992-11-28|1992-12-17|1992-12-08|TAKE BACK RETURN|TRUCK| express platelets. blithely q +20579|619|82|2|23|34951.03|0.08|0.04|R|F|1992-10-10|1992-11-23|1992-10-15|TAKE BACK RETURN|RAIL|es are. blithely regular accounts above th +20579|1792|77|3|5|8468.95|0.00|0.02|A|F|1992-12-25|1992-12-29|1993-01-24|COLLECT COD|RAIL|efully regu +20579|985|54|4|7|13201.86|0.08|0.01|R|F|1993-01-08|1992-11-15|1993-01-17|DELIVER IN PERSON|MAIL|ly final instructions. unusual, careful p +20579|1649|91|5|12|18607.68|0.03|0.06|R|F|1992-11-17|1992-12-15|1992-11-25|TAKE BACK RETURN|REG AIR|nts breach slyly slyly silent dependencies +20580|1789|74|1|4|6763.12|0.06|0.03|N|O|1995-10-13|1995-10-22|1995-11-06|NONE|AIR|ions use above the quickl +20580|1254|29|2|28|32347.00|0.04|0.08|N|O|1995-11-23|1995-10-14|1995-11-24|NONE|REG AIR|onic ideas subla +20580|270|98|3|45|52662.15|0.02|0.08|N|O|1995-12-18|1995-11-10|1996-01-11|NONE|SHIP|requests kindle furiously i +20581|1554|95|1|2|2911.10|0.04|0.00|N|O|1996-11-25|1996-11-27|1996-12-17|COLLECT COD|FOB|refully after the sly +20582|1856|43|1|22|38672.70|0.09|0.05|N|O|1997-07-01|1997-07-18|1997-07-21|TAKE BACK RETURN|REG AIR|es cajole furiously after the ironic a +20582|1665|48|2|28|43866.48|0.03|0.00|N|O|1997-06-12|1997-06-27|1997-06-24|NONE|AIR|blithely about the slyly even +20582|435|65|3|44|58758.92|0.04|0.00|N|O|1997-07-12|1997-07-25|1997-07-22|TAKE BACK RETURN|AIR|fully unusual platelets. bl +20582|1508|89|4|4|5638.00|0.07|0.08|N|O|1997-07-17|1997-07-25|1997-08-05|COLLECT COD|FOB|riously expres +20582|1159|96|5|48|50887.20|0.10|0.06|N|O|1997-07-08|1997-07-10|1997-07-20|NONE|REG AIR| final deposits: regular accounts +20582|602|34|6|11|16528.60|0.03|0.02|N|O|1997-08-20|1997-07-31|1997-08-27|TAKE BACK RETURN|RAIL| frets according to the carefully final +20583|170|49|1|10|10701.70|0.00|0.06|N|O|1997-07-19|1997-06-11|1997-08-08|NONE|SHIP|efully furiously even requests +20608|1219|57|1|25|28005.25|0.10|0.06|N|O|1998-06-10|1998-04-27|1998-06-13|NONE|AIR|nstructions integrate. instructions +20608|1855|99|2|45|79058.25|0.08|0.07|N|O|1998-07-12|1998-04-25|1998-07-23|TAKE BACK RETURN|TRUCK|le fluffily. unusual, final th +20608|1893|94|3|11|19743.79|0.03|0.07|N|O|1998-05-14|1998-05-20|1998-06-05|TAKE BACK RETURN|AIR|oxes about the regular pi +20608|1025|61|4|30|27780.60|0.00|0.05|N|O|1998-05-30|1998-06-11|1998-06-20|TAKE BACK RETURN|RAIL| slyly unusual deposit +20608|205|6|5|17|18788.40|0.08|0.03|N|O|1998-06-20|1998-04-24|1998-07-01|NONE|MAIL|latelets use sl +20608|110|63|6|14|14141.54|0.08|0.06|N|O|1998-04-09|1998-05-08|1998-04-19|TAKE BACK RETURN|AIR| accounts. regular, busy ac +20609|1119|92|1|42|42844.62|0.07|0.06|A|F|1992-11-23|1993-01-10|1992-12-16|COLLECT COD|AIR|fully regular accounts. theodolit +20610|323|52|1|20|24466.40|0.09|0.06|N|O|1998-01-30|1998-01-06|1998-03-01|NONE|RAIL|latelets. theodolites wake f +20610|1397|74|2|30|38951.70|0.06|0.00|N|O|1998-01-07|1998-01-25|1998-01-24|DELIVER IN PERSON|SHIP| accounts alon +20610|904|5|3|42|75805.80|0.01|0.02|N|O|1998-02-19|1997-12-22|1998-02-27|DELIVER IN PERSON|RAIL|ickly regular f +20610|1275|13|4|29|34111.83|0.09|0.04|N|O|1998-03-09|1998-01-23|1998-03-14|TAKE BACK RETURN|SHIP| express requests are quickly iron +20610|788|21|5|10|16887.80|0.06|0.03|N|O|1997-12-18|1998-02-11|1998-01-17|NONE|TRUCK|instructions detect fluffi +20611|999|100|1|11|20899.89|0.10|0.05|N|O|1996-07-24|1996-04-30|1996-08-23|DELIVER IN PERSON|RAIL|s. courts haggle blithely above th +20612|259|14|1|40|46370.00|0.04|0.08|N|O|1996-12-26|1996-12-28|1997-01-18|TAKE BACK RETURN|FOB|al requests. final foxes haggle carefull +20612|1796|97|2|40|67911.60|0.06|0.07|N|O|1997-02-23|1997-02-07|1997-03-20|NONE|AIR|lyly unusual +20612|1179|16|3|8|8641.36|0.03|0.00|N|O|1996-11-30|1997-01-07|1996-12-04|NONE|AIR|hely regular pinto beans hang slyly about +20612|1082|18|4|4|3932.32|0.08|0.04|N|O|1997-01-03|1997-02-02|1997-01-17|DELIVER IN PERSON|AIR|aters arou +20612|421|22|5|45|59463.90|0.10|0.04|N|O|1996-12-14|1997-01-02|1996-12-27|TAKE BACK RETURN|RAIL|ily furiously final theodolites-- +20612|1692|16|6|47|74903.43|0.10|0.05|N|O|1997-03-07|1997-01-25|1997-03-27|DELIVER IN PERSON|REG AIR|es doubt according to the blithely +20613|1451|91|1|16|21639.20|0.10|0.05|R|F|1992-11-18|1992-12-06|1992-12-12|TAKE BACK RETURN|MAIL|carefully quick depen +20614|987|22|1|36|67967.28|0.05|0.08|R|F|1994-08-18|1994-06-20|1994-09-12|NONE|TRUCK|ly special deposits. +20614|97|48|2|29|28915.61|0.05|0.08|A|F|1994-07-02|1994-06-20|1994-07-19|TAKE BACK RETURN|FOB|s nag slyly about the r +20615|414|2|1|33|43375.53|0.08|0.07|R|F|1992-06-02|1992-06-20|1992-06-05|DELIVER IN PERSON|SHIP|. quickly ironic d +20615|622|54|2|13|19794.06|0.05|0.00|A|F|1992-07-03|1992-05-20|1992-07-04|COLLECT COD|FOB|te furiously among the deposits! +20615|1284|85|3|1|1185.28|0.03|0.00|R|F|1992-06-04|1992-06-18|1992-06-28|COLLECT COD|MAIL| slyly furio +20615|1244|82|4|40|45809.60|0.03|0.01|R|F|1992-06-06|1992-06-30|1992-06-15|NONE|FOB|ly final i +20615|1578|99|5|41|60662.37|0.08|0.04|A|F|1992-06-05|1992-07-05|1992-06-18|DELIVER IN PERSON|AIR|cial foxes inside the furiously even +20640|311|68|1|35|42395.85|0.01|0.07|N|O|1998-03-05|1998-01-18|1998-03-23|NONE|RAIL|etly even requests. final, pending pa +20640|1443|44|2|39|52433.16|0.04|0.00|N|O|1998-02-18|1998-02-21|1998-02-20|TAKE BACK RETURN|MAIL|eodolites s +20640|301|58|3|38|45649.40|0.03|0.01|N|O|1998-01-07|1998-01-23|1998-01-19|TAKE BACK RETURN|REG AIR|st busily alongside of t +20640|1426|5|4|1|1327.42|0.08|0.02|N|O|1998-02-27|1998-01-17|1998-03-09|COLLECT COD|REG AIR|s hinder behind +20640|786|87|5|47|79278.66|0.00|0.02|N|O|1998-01-24|1998-02-17|1998-01-30|NONE|AIR|deposits. final foxes wak +20640|933|68|6|11|20173.23|0.07|0.03|N|O|1997-12-11|1998-02-21|1998-01-10|TAKE BACK RETURN|RAIL|g to the s +20640|1085|21|7|6|5916.48|0.05|0.07|N|O|1998-03-31|1998-02-18|1998-04-24|TAKE BACK RETURN|RAIL|to beans. blithely regula +20641|1217|29|1|26|29073.46|0.01|0.02|R|F|1995-05-01|1995-03-25|1995-05-03|COLLECT COD|RAIL|e slyly unusua +20641|1043|49|2|48|45313.92|0.07|0.07|A|F|1995-06-04|1995-05-15|1995-06-10|TAKE BACK RETURN|REG AIR|l pinto be +20641|423|82|3|48|63524.16|0.09|0.01|R|F|1995-04-15|1995-04-28|1995-05-15|DELIVER IN PERSON|REG AIR|uickly regular accounts-- requests in +20641|756|89|4|38|62956.50|0.04|0.00|A|F|1995-04-30|1995-05-09|1995-05-03|TAKE BACK RETURN|TRUCK| affix furiously pending reque +20642|1202|40|1|23|25373.60|0.07|0.00|R|F|1992-09-01|1992-06-24|1992-09-29|TAKE BACK RETURN|MAIL|ts use furiously +20642|901|2|2|14|25226.60|0.02|0.01|R|F|1992-06-21|1992-07-12|1992-07-07|NONE|TRUCK|jole unusual theodolites. s +20642|982|83|3|25|47074.50|0.06|0.02|R|F|1992-08-12|1992-06-25|1992-09-03|NONE|TRUCK| express foxes b +20642|1744|45|4|19|31269.06|0.06|0.01|A|F|1992-08-21|1992-07-29|1992-08-24|TAKE BACK RETURN|REG AIR|e about the requests. even, express accoun +20642|166|67|5|47|50109.52|0.03|0.00|A|F|1992-09-17|1992-06-25|1992-09-25|NONE|MAIL|hins. ironically e +20642|1605|6|6|42|63277.20|0.10|0.06|R|F|1992-09-12|1992-07-26|1992-10-10|NONE|TRUCK|equests sleep fluffily about the foxes. iro +20642|884|84|7|39|69610.32|0.01|0.04|R|F|1992-05-29|1992-07-23|1992-06-05|NONE|TRUCK|lar ideas. +20643|841|42|1|27|47029.68|0.06|0.00|N|O|1995-10-05|1995-09-23|1995-10-19|COLLECT COD|TRUCK|instructions. foxes haggle fi +20643|1993|94|2|27|51164.73|0.06|0.01|N|O|1995-10-06|1995-09-21|1995-10-25|COLLECT COD|MAIL|d the quiet +20644|1373|50|1|12|15292.44|0.05|0.03|N|O|1995-07-26|1995-09-08|1995-08-06|NONE|TRUCK|c dependencies. requests wake fluffily-- qu +20644|649|50|2|19|29443.16|0.05|0.06|N|O|1995-08-29|1995-07-23|1995-09-14|NONE|SHIP|al dependencies. even pinto beans wake b +20644|569|100|3|12|17634.72|0.09|0.02|N|O|1995-10-22|1995-08-22|1995-11-21|DELIVER IN PERSON|MAIL|silent, even acco +20645|139|40|1|18|18704.34|0.01|0.02|R|F|1992-04-04|1992-05-05|1992-04-11|NONE|SHIP|ounts serve enticingly unusual +20646|770|71|1|42|70172.34|0.09|0.06|A|F|1995-05-24|1995-06-29|1995-05-26|TAKE BACK RETURN|TRUCK|hely ironic requ +20646|203|85|2|36|39715.20|0.10|0.00|A|F|1995-05-23|1995-06-26|1995-06-11|COLLECT COD|RAIL|ld, silent platelets. slyly +20646|1949|50|3|18|33316.92|0.08|0.02|R|F|1995-05-23|1995-05-31|1995-06-02|TAKE BACK RETURN|RAIL|pinto beans. r +20646|1762|47|4|30|49912.80|0.05|0.06|A|F|1995-05-08|1995-06-03|1995-05-16|TAKE BACK RETURN|AIR|n asymptotes use +20646|1183|92|5|18|19515.24|0.09|0.06|N|F|1995-06-05|1995-06-25|1995-06-22|DELIVER IN PERSON|MAIL|tes wake furiously! pinto beans aff +20647|391|20|1|23|29701.97|0.09|0.07|N|O|1998-04-21|1998-04-07|1998-05-01|NONE|FOB|y along the slyly r +20672|1883|70|1|41|73180.08|0.00|0.01|R|F|1993-06-06|1993-07-19|1993-06-23|COLLECT COD|MAIL| theodolites wake +20673|279|61|1|28|33019.56|0.10|0.03|N|O|1996-07-18|1996-06-18|1996-08-12|NONE|MAIL|y. requests cajole. +20673|1327|4|2|50|61416.00|0.01|0.05|N|O|1996-09-14|1996-08-11|1996-10-14|COLLECT COD|RAIL|ar asymptotes sleep a +20673|418|6|3|39|51417.99|0.01|0.06|N|O|1996-07-16|1996-07-16|1996-08-01|TAKE BACK RETURN|MAIL|lar asymptotes. fluff +20673|1219|57|4|31|34726.51|0.07|0.08|N|O|1996-08-22|1996-07-12|1996-08-29|NONE|RAIL|. furiously final requests cajo +20673|907|42|5|4|7231.60|0.02|0.01|N|O|1996-08-08|1996-07-11|1996-09-05|COLLECT COD|REG AIR|s; slyly special depos +20673|1323|38|6|48|58767.36|0.05|0.04|N|O|1996-09-13|1996-08-14|1996-10-13|DELIVER IN PERSON|TRUCK|ideas nag slyly according +20674|1045|16|1|48|45409.92|0.05|0.03|R|F|1993-12-30|1994-01-11|1994-01-07|TAKE BACK RETURN|FOB|heodolites inte +20674|803|3|2|25|42595.00|0.08|0.03|R|F|1994-04-04|1994-02-13|1994-04-09|NONE|AIR|l packages. express pinto beans nag along +20674|9|10|3|46|41814.00|0.04|0.08|A|F|1994-03-29|1994-03-06|1994-04-06|NONE|FOB|ly regular gifts cajole blithely slyl +20675|883|84|1|46|82058.48|0.02|0.00|R|F|1993-04-12|1993-06-04|1993-04-22|TAKE BACK RETURN|TRUCK|heodolites. furiously silent accou +20675|1529|50|2|19|27179.88|0.01|0.02|A|F|1993-07-02|1993-05-12|1993-07-08|COLLECT COD|SHIP|posits. unusual +20676|306|91|1|39|47045.70|0.03|0.00|A|F|1993-03-19|1993-02-08|1993-04-03|TAKE BACK RETURN|AIR|egular deposits cajole +20676|1781|24|2|48|80773.44|0.01|0.08|A|F|1993-02-03|1993-01-14|1993-03-01|DELIVER IN PERSON|AIR|ously final packages cajole after the +20676|1511|92|3|40|56500.40|0.04|0.07|R|F|1993-02-24|1993-02-14|1993-03-06|DELIVER IN PERSON|SHIP|out the regular, final request +20676|565|56|4|35|51294.60|0.02|0.07|R|F|1993-02-08|1992-12-26|1993-03-05|TAKE BACK RETURN|TRUCK|ns. furiously ironic deposits +20676|1479|19|5|3|4141.41|0.07|0.06|R|F|1992-11-25|1993-01-02|1992-12-14|NONE|RAIL| do wake q +20676|980|83|6|2|3761.96|0.05|0.01|R|F|1993-01-27|1993-01-30|1993-02-07|TAKE BACK RETURN|RAIL|gular pinto beans about the careful +20676|1370|47|7|42|53397.54|0.04|0.05|A|F|1993-01-11|1993-02-14|1993-02-05|TAKE BACK RETURN|SHIP|theodolites. furio +20677|318|3|1|49|59697.19|0.03|0.01|N|O|1996-12-03|1997-01-26|1996-12-05|COLLECT COD|AIR|ests haggle carefu +20677|943|46|2|3|5531.82|0.08|0.02|N|O|1997-03-20|1997-01-11|1997-03-31|COLLECT COD|RAIL|e against the +20677|433|92|3|1|1333.43|0.05|0.03|N|O|1997-01-04|1997-01-17|1997-01-05|COLLECT COD|RAIL|ending theodolites sleep slyly r +20677|1722|7|4|38|61701.36|0.00|0.03|N|O|1997-01-13|1997-01-21|1997-01-17|DELIVER IN PERSON|FOB|r the final instructions. carefully +20677|1685|9|5|40|63467.20|0.03|0.05|N|O|1997-01-06|1997-01-12|1997-01-17|TAKE BACK RETURN|SHIP| packages grow furiously +20678|793|26|1|20|33875.80|0.07|0.06|N|O|1997-03-29|1997-05-10|1997-04-11|COLLECT COD|TRUCK|ependencies. carefully final deposits wak +20678|647|10|2|25|38691.00|0.04|0.04|N|O|1997-05-15|1997-04-13|1997-05-19|DELIVER IN PERSON|TRUCK|al grouches dete +20678|1882|12|3|29|51732.52|0.10|0.08|N|O|1997-05-18|1997-04-11|1997-06-07|NONE|FOB|ss asymptotes-- blithely ironic accounts b +20679|1207|19|1|40|44328.00|0.00|0.00|A|F|1993-09-13|1993-10-25|1993-09-26|DELIVER IN PERSON|AIR|ecial deposits b +20679|399|84|2|42|54574.38|0.00|0.02|R|F|1993-09-16|1993-09-17|1993-10-10|COLLECT COD|REG AIR|s pinto beans. regular, slow pinto be +20679|921|56|3|31|56479.52|0.05|0.04|R|F|1993-11-28|1993-11-06|1993-12-16|NONE|AIR| ideas are against the requests. car +20679|429|59|4|36|47859.12|0.00|0.02|R|F|1993-09-29|1993-11-01|1993-10-18|TAKE BACK RETURN|TRUCK|uickly pending depo +20679|1183|84|5|16|17346.88|0.00|0.07|R|F|1993-11-22|1993-09-21|1993-12-18|TAKE BACK RETURN|AIR|lar foxes solve +20679|326|11|6|10|12263.20|0.00|0.06|A|F|1993-12-02|1993-11-09|1993-12-17|NONE|SHIP|quests wake furiously among the blithely +20679|1335|12|7|34|42035.22|0.02|0.07|A|F|1993-11-02|1993-11-08|1993-11-27|COLLECT COD|MAIL|ons are caref +20704|957|26|1|10|18579.50|0.06|0.01|A|F|1993-04-28|1993-04-12|1993-05-12|DELIVER IN PERSON|MAIL|l deposits across the blithe, pending +20704|102|3|2|19|19039.90|0.02|0.03|R|F|1993-04-20|1993-05-07|1993-04-24|COLLECT COD|MAIL|l accounts. furious +20704|470|100|3|49|67153.03|0.06|0.06|R|F|1993-04-12|1993-03-21|1993-04-24|COLLECT COD|SHIP|y final request +20704|697|91|4|21|33551.49|0.10|0.02|R|F|1993-05-24|1993-04-10|1993-06-18|NONE|AIR|. special instructions sublate +20704|1386|87|5|24|30897.12|0.09|0.06|R|F|1993-04-23|1993-04-30|1993-05-15|DELIVER IN PERSON|SHIP|gular, regular +20705|1437|77|1|16|21414.88|0.02|0.04|N|O|1998-09-16|1998-07-19|1998-10-15|TAKE BACK RETURN|REG AIR|cingly bold packages are +20705|1171|80|2|5|5360.85|0.03|0.04|N|O|1998-09-16|1998-08-06|1998-09-24|TAKE BACK RETURN|TRUCK|egrate express courts. sly +20705|438|68|3|35|46845.05|0.01|0.07|N|O|1998-09-19|1998-07-10|1998-09-25|COLLECT COD|TRUCK| packages. fluffily regular dinos detect +20705|35|11|4|26|24310.78|0.02|0.08|N|O|1998-08-14|1998-07-19|1998-09-08|DELIVER IN PERSON|MAIL|eas haggle quickly accordin +20705|1820|7|5|31|53376.42|0.08|0.03|N|O|1998-09-12|1998-08-21|1998-10-02|NONE|TRUCK|posits. dependencies ha +20705|931|66|6|12|21983.16|0.05|0.01|N|O|1998-07-02|1998-08-04|1998-07-28|COLLECT COD|FOB|d. quickly r +20706|1724|67|1|13|21134.36|0.00|0.00|A|F|1994-10-22|1994-10-04|1994-10-29|NONE|REG AIR|tructions. slyly expre +20707|1986|75|1|9|16991.82|0.04|0.01|N|O|1996-04-27|1996-06-20|1996-05-06|TAKE BACK RETURN|AIR| believe blithel +20707|856|56|2|8|14054.80|0.00|0.08|N|O|1996-05-23|1996-05-08|1996-05-26|COLLECT COD|AIR|slyly pending accounts. quickly r +20707|1175|48|3|4|4304.68|0.09|0.07|N|O|1996-07-21|1996-05-27|1996-07-31|COLLECT COD|MAIL|ven pinto beans haggle fluffily abov +20708|1533|34|1|15|21517.95|0.03|0.02|A|F|1992-05-10|1992-02-25|1992-05-12|TAKE BACK RETURN|RAIL|frets. carefully +20708|856|56|2|27|47434.95|0.10|0.01|R|F|1992-03-12|1992-03-03|1992-04-11|TAKE BACK RETURN|REG AIR|en excuses aga +20708|1100|71|3|32|32035.20|0.05|0.07|R|F|1992-04-20|1992-03-31|1992-04-27|NONE|SHIP|y bold grouches. quickly special ideas dete +20708|805|6|4|8|13646.40|0.07|0.08|R|F|1992-02-16|1992-03-11|1992-03-15|DELIVER IN PERSON|TRUCK|quests doubt. depos +20708|1408|26|5|47|61541.80|0.04|0.04|A|F|1992-03-31|1992-02-27|1992-04-26|NONE|MAIL|uternes. caref +20708|1648|49|6|29|44939.56|0.04|0.05|R|F|1992-03-10|1992-02-26|1992-04-03|TAKE BACK RETURN|TRUCK|riously abou +20709|756|53|1|41|67926.75|0.10|0.00|R|F|1994-10-16|1994-10-25|1994-11-11|TAKE BACK RETURN|FOB|osits. reg +20709|1804|91|2|38|64820.40|0.00|0.05|R|F|1994-11-08|1994-11-10|1994-11-09|COLLECT COD|SHIP|furiously reg +20709|399|28|3|37|48077.43|0.04|0.05|R|F|1994-11-13|1994-10-25|1994-11-27|COLLECT COD|RAIL|t carefully. fluffily close deposits +20709|1562|83|4|39|57078.84|0.05|0.02|A|F|1994-09-14|1994-11-10|1994-09-29|COLLECT COD|AIR|uickly unusual req +20709|376|33|5|18|22974.66|0.02|0.02|R|F|1994-08-14|1994-09-12|1994-08-25|NONE|MAIL|sits integrate +20710|726|59|1|37|60188.64|0.05|0.05|A|F|1995-03-04|1995-02-02|1995-03-24|TAKE BACK RETURN|MAIL|lent accounts haggle fluffily blithely +20710|1394|95|2|23|29793.97|0.06|0.01|A|F|1995-01-02|1995-02-27|1995-01-31|NONE|TRUCK|pinto beans. final pinto be +20710|1268|6|3|5|5846.30|0.06|0.05|R|F|1995-02-19|1995-02-17|1995-02-23|DELIVER IN PERSON|SHIP| haggle against the pending acc +20710|1694|77|4|13|20743.97|0.05|0.08|A|F|1995-01-31|1995-01-22|1995-02-23|TAKE BACK RETURN|MAIL|deposits wake quickly am +20710|1259|97|5|15|17403.75|0.00|0.07|A|F|1995-03-21|1995-02-02|1995-04-07|COLLECT COD|SHIP| pending, even sauternes after the dolp +20711|581|42|1|21|31113.18|0.02|0.02|R|F|1994-04-05|1994-04-11|1994-05-05|COLLECT COD|RAIL|wake blithely acr +20711|1922|11|2|20|36478.40|0.09|0.05|A|F|1994-02-07|1994-03-27|1994-03-02|COLLECT COD|TRUCK|es integra +20711|1313|28|3|17|20643.27|0.02|0.03|A|F|1994-02-01|1994-03-25|1994-03-02|TAKE BACK RETURN|SHIP|structions are furiously according to t +20711|915|16|4|5|9079.55|0.01|0.08|R|F|1994-02-01|1994-03-06|1994-02-11|TAKE BACK RETURN|TRUCK|c asymptotes across the +20736|433|92|1|43|57337.49|0.04|0.03|N|O|1996-01-14|1995-10-25|1996-01-18|DELIVER IN PERSON|FOB|sts are furiously bold, sp +20737|1885|72|1|27|48245.76|0.05|0.06|N|O|1996-02-22|1996-01-26|1996-03-08|COLLECT COD|RAIL|carefully +20737|416|46|2|10|13164.10|0.01|0.04|N|O|1996-04-20|1996-02-05|1996-04-24|NONE|FOB|der fluffily express accou +20737|1970|3|3|17|31823.49|0.08|0.05|N|O|1996-01-07|1996-03-22|1996-01-10|COLLECT COD|SHIP| furiously regular packages +20737|1714|15|4|31|50087.01|0.07|0.06|N|O|1996-03-10|1996-02-28|1996-03-25|NONE|AIR|l, ironic accounts. ironic packages are +20737|340|97|5|32|39690.88|0.08|0.00|N|O|1996-03-06|1996-03-14|1996-03-17|NONE|FOB| ideas. slyl +20737|46|72|6|15|14190.60|0.09|0.01|N|O|1996-03-14|1996-03-23|1996-03-21|TAKE BACK RETURN|MAIL|thely expre +20737|697|60|7|15|23965.35|0.09|0.00|N|O|1996-02-04|1996-03-10|1996-02-21|TAKE BACK RETURN|FOB|y regular +20738|1165|66|1|22|23455.52|0.09|0.07|R|F|1992-11-22|1992-10-17|1992-12-21|COLLECT COD|FOB| beans hagg +20738|1073|9|2|35|34092.45|0.02|0.01|R|F|1992-10-25|1992-11-08|1992-11-01|TAKE BACK RETURN|AIR|furiously bold asymptotes nag carefully +20738|1992|81|3|13|24621.87|0.09|0.07|R|F|1992-12-10|1992-11-24|1993-01-01|TAKE BACK RETURN|SHIP|ular, even requests nag blithely. +20738|1010|11|4|3|2733.03|0.09|0.02|R|F|1992-10-11|1992-11-29|1992-10-30|NONE|MAIL|the regular, silent depo +20738|1863|7|5|27|47651.22|0.00|0.07|A|F|1992-12-22|1992-11-01|1992-12-24|NONE|AIR|er the regular, regular requests. even pack +20738|684|16|6|32|50709.76|0.03|0.07|A|F|1992-11-30|1992-11-04|1992-12-07|COLLECT COD|SHIP|ent deposits. theodol +20738|1950|39|7|38|70374.10|0.06|0.01|R|F|1992-09-30|1992-10-05|1992-10-01|TAKE BACK RETURN|MAIL|counts eat carefully +20739|1282|94|1|36|42598.08|0.03|0.08|N|O|1997-05-01|1997-05-04|1997-05-09|DELIVER IN PERSON|FOB|encies. qu +20739|1853|83|2|35|61419.75|0.07|0.04|N|O|1997-06-09|1997-06-17|1997-06-29|DELIVER IN PERSON|REG AIR|es. requests before the furiously expr +20739|1335|36|3|41|50689.53|0.08|0.06|N|O|1997-07-06|1997-05-31|1997-07-31|COLLECT COD|FOB|nto beans sleep alongside of the s +20739|825|25|4|5|8629.10|0.10|0.08|N|O|1997-07-01|1997-05-06|1997-07-11|DELIVER IN PERSON|FOB|rate slyly ruthless instructions. excuse +20740|1224|62|1|10|11252.20|0.01|0.05|R|F|1993-04-02|1993-03-24|1993-04-11|COLLECT COD|MAIL|posits. regular platelets cajole furiousl +20740|621|15|2|47|71516.14|0.08|0.02|R|F|1993-04-03|1993-03-17|1993-04-30|NONE|AIR|gular packages. quickly bold ac +20740|1977|78|3|39|73279.83|0.08|0.04|A|F|1993-04-10|1993-03-10|1993-05-10|DELIVER IN PERSON|AIR|ependencies. pending acc +20740|779|80|4|33|55432.41|0.07|0.03|R|F|1993-03-10|1993-03-29|1993-03-27|TAKE BACK RETURN|MAIL|uses. boldly spe +20740|489|90|5|14|19452.72|0.07|0.05|A|F|1993-02-12|1993-03-13|1993-03-13|COLLECT COD|TRUCK|cross the warhorses. carefully fi +20740|1337|52|6|29|35911.57|0.01|0.05|A|F|1993-04-29|1993-03-12|1993-05-04|TAKE BACK RETURN|TRUCK|riously ironic +20741|60|36|1|42|40322.52|0.09|0.02|A|F|1994-01-10|1993-12-02|1994-01-16|DELIVER IN PERSON|RAIL|ar accounts are c +20741|731|32|2|40|65269.20|0.03|0.03|A|F|1994-02-02|1993-12-26|1994-02-20|NONE|FOB|y regular packages. iro +20741|534|95|3|23|32994.19|0.10|0.05|R|F|1993-12-27|1993-12-06|1994-01-18|NONE|AIR|, pending requests. regular theodolites +20741|599|90|4|27|40488.93|0.02|0.08|R|F|1994-02-04|1994-01-25|1994-03-02|COLLECT COD|SHIP|ickly. fur +20741|854|55|5|18|31587.30|0.01|0.02|A|F|1994-02-04|1994-01-23|1994-02-27|DELIVER IN PERSON|RAIL| about the +20742|1831|75|1|43|74511.69|0.07|0.06|A|F|1992-03-08|1992-02-05|1992-04-03|DELIVER IN PERSON|MAIL|he ironic, pending requests. furiously u +20742|1686|69|2|26|41279.68|0.07|0.02|A|F|1992-01-29|1992-03-16|1992-02-24|DELIVER IN PERSON|AIR|thely brave ideas in place of the quickl +20742|256|84|3|24|27750.00|0.09|0.02|A|F|1992-02-22|1992-03-08|1992-03-22|DELIVER IN PERSON|MAIL|ve the regular deposits haggle +20743|1808|95|1|6|10258.80|0.00|0.00|N|O|1996-01-18|1996-03-04|1996-01-27|COLLECT COD|FOB|ronic packag +20743|1762|89|2|27|44921.52|0.01|0.02|N|O|1995-12-20|1996-01-28|1995-12-25|TAKE BACK RETURN|TRUCK| to thrash f +20743|1663|64|3|48|75103.68|0.09|0.04|N|O|1996-03-04|1996-03-10|1996-04-03|COLLECT COD|RAIL|inal dependencies haggle furiously abo +20743|854|21|4|6|10529.10|0.01|0.05|N|O|1995-12-18|1996-02-05|1996-01-08|TAKE BACK RETURN|TRUCK|he slyly express pa +20743|359|16|5|30|37780.50|0.06|0.02|N|O|1996-03-16|1996-01-25|1996-03-25|TAKE BACK RETURN|REG AIR|ar warhorses? fluffily even sauterne +20768|878|45|1|38|67597.06|0.04|0.03|R|F|1992-12-04|1992-12-24|1992-12-08|NONE|AIR|s sleep bli +20768|1629|71|2|28|42857.36|0.04|0.04|A|F|1993-01-25|1992-12-16|1993-02-01|TAKE BACK RETURN|AIR|sits poach aga +20768|1574|15|3|29|42791.53|0.10|0.03|A|F|1993-02-10|1992-11-28|1993-02-24|NONE|REG AIR|nal theodolit +20769|611|12|1|2|3023.22|0.01|0.07|N|O|1998-08-14|1998-09-25|1998-09-09|TAKE BACK RETURN|REG AIR|usly even ideas wake slyly across t +20769|243|71|2|33|37726.92|0.04|0.01|N|O|1998-08-21|1998-09-20|1998-08-29|TAKE BACK RETURN|REG AIR| bold theodolites try to was around th +20769|181|60|3|13|14055.34|0.06|0.08|N|O|1998-07-11|1998-09-18|1998-07-14|COLLECT COD|SHIP|according to the +20769|1782|9|4|26|43778.28|0.08|0.01|N|O|1998-10-14|1998-09-06|1998-11-07|TAKE BACK RETURN|FOB|quests are blithely. +20769|508|39|5|26|36621.00|0.01|0.03|N|O|1998-09-27|1998-08-29|1998-10-20|NONE|TRUCK|pinto beans +20770|378|79|1|23|29402.51|0.09|0.08|R|F|1993-07-06|1993-08-15|1993-07-16|TAKE BACK RETURN|FOB|. slyly bold +20770|1523|24|2|32|45584.64|0.07|0.06|A|F|1993-07-02|1993-08-16|1993-07-15|DELIVER IN PERSON|MAIL|lithely final asympto +20770|420|50|3|5|6602.10|0.07|0.00|A|F|1993-08-20|1993-08-21|1993-08-28|DELIVER IN PERSON|SHIP| instructions +20771|1649|32|1|37|57373.68|0.01|0.02|N|O|1996-03-26|1996-05-22|1996-04-08|COLLECT COD|FOB|ts nag acr +20771|1816|3|2|20|34356.20|0.07|0.07|N|O|1996-05-01|1996-04-26|1996-05-31|DELIVER IN PERSON|SHIP|elets. slyly pending requests across the ca +20772|1147|48|1|21|22010.94|0.05|0.01|A|F|1993-08-07|1993-07-27|1993-08-23|NONE|REG AIR|into beans sleep carefu +20772|94|20|2|17|16899.53|0.01|0.02|A|F|1993-06-23|1993-08-20|1993-06-24|COLLECT COD|TRUCK|kly according to the c +20772|1511|32|3|11|15537.61|0.00|0.03|A|F|1993-09-27|1993-08-10|1993-09-29|DELIVER IN PERSON|AIR|x-ray. fluffily bold deposits caj +20772|1062|33|4|27|26002.62|0.05|0.04|A|F|1993-07-06|1993-07-20|1993-07-27|TAKE BACK RETURN|REG AIR| regular ac +20773|1938|83|1|12|22079.16|0.03|0.06|R|F|1994-06-08|1994-06-01|1994-06-30|NONE|REG AIR|tes-- carefully fi +20773|1551|72|2|33|47934.15|0.01|0.08|A|F|1994-05-25|1994-05-27|1994-06-03|TAKE BACK RETURN|AIR|press regularly care +20774|1858|45|1|11|19358.35|0.05|0.06|R|F|1994-12-26|1994-10-05|1995-01-04|COLLECT COD|AIR|he bold depo +20774|1143|16|2|24|25059.36|0.09|0.03|A|F|1994-10-01|1994-11-11|1994-10-30|TAKE BACK RETURN|SHIP|fully along the blithely regular packages; +20774|1216|17|3|6|6703.26|0.09|0.05|A|F|1994-09-15|1994-10-03|1994-10-04|DELIVER IN PERSON|FOB| furiously. quick +20774|610|11|4|7|10574.27|0.07|0.07|R|F|1994-11-12|1994-11-11|1994-11-14|NONE|REG AIR|ss theodolites wake reques +20775|339|96|1|42|52051.86|0.04|0.01|R|F|1993-05-15|1993-04-02|1993-06-01|TAKE BACK RETURN|AIR|l foxes along the unusual, r +20800|1496|36|1|21|29347.29|0.02|0.00|R|F|1994-09-10|1994-10-06|1994-09-16|NONE|REG AIR|uriously carefully even pac +20801|424|12|1|37|49003.54|0.05|0.03|N|O|1997-07-12|1997-05-18|1997-08-05|NONE|SHIP|sits unwind bli +20801|1921|10|2|16|29166.72|0.01|0.03|N|O|1997-04-12|1997-05-14|1997-04-23|COLLECT COD|REG AIR|arefully. evenly final packages w +20801|331|16|3|6|7387.98|0.07|0.05|N|O|1997-04-13|1997-05-20|1997-05-08|NONE|FOB|ar requests wake according to the +20801|1946|47|4|35|64677.90|0.06|0.06|N|O|1997-05-22|1997-06-04|1997-06-11|DELIVER IN PERSON|RAIL|ugouts. blithely enticing pearls sleep +20801|1062|33|5|39|37559.34|0.07|0.08|N|O|1997-07-17|1997-04-25|1997-07-21|DELIVER IN PERSON|AIR|ckages. blithely +20801|868|2|6|30|53065.80|0.06|0.02|N|O|1997-05-28|1997-06-05|1997-06-25|TAKE BACK RETURN|TRUCK|ies cajole slyly. pending foxes haggle +20802|1920|65|1|16|29150.72|0.03|0.01|N|O|1995-11-01|1995-12-16|1995-11-14|TAKE BACK RETURN|RAIL|ithely dog +20803|1425|26|1|30|39792.60|0.04|0.01|R|F|1992-05-05|1992-04-17|1992-05-17|TAKE BACK RETURN|MAIL|y bold deposits kindle against the even de +20803|1071|77|2|11|10692.77|0.02|0.01|R|F|1992-04-05|1992-04-22|1992-04-28|COLLECT COD|SHIP|le about the furi +20803|75|51|3|15|14626.05|0.00|0.07|A|F|1992-03-13|1992-03-28|1992-04-05|DELIVER IN PERSON|TRUCK|ounts; theodolites engage fluffily ab +20804|62|38|1|7|6734.42|0.00|0.05|N|O|1995-12-08|1996-02-21|1995-12-26|DELIVER IN PERSON|MAIL|h furiously. stealthily blithe dugouts alo +20804|1020|26|2|49|45129.98|0.07|0.03|N|O|1996-02-25|1995-12-28|1996-03-24|TAKE BACK RETURN|MAIL|uriously about the special, bold +20804|1965|10|3|4|7467.84|0.03|0.00|N|O|1996-02-28|1996-01-02|1996-03-12|DELIVER IN PERSON|RAIL|nic deposit +20804|876|10|4|39|69297.93|0.09|0.05|N|O|1996-01-18|1996-02-22|1996-01-22|DELIVER IN PERSON|TRUCK|es affix against the bravely +20804|647|48|5|32|49524.48|0.06|0.03|N|O|1996-01-23|1996-01-25|1996-02-02|TAKE BACK RETURN|TRUCK|ully. slyly pending deposits nod quickl +20804|1097|98|6|38|37927.42|0.05|0.07|N|O|1995-12-15|1996-01-07|1995-12-18|DELIVER IN PERSON|MAIL|blithely atop +20804|1275|87|7|18|21172.86|0.06|0.03|N|O|1995-12-15|1996-01-04|1996-01-12|DELIVER IN PERSON|AIR|e final, express requests. final +20805|697|98|1|9|14379.21|0.02|0.03|R|F|1995-01-13|1995-03-07|1995-02-11|COLLECT COD|TRUCK|ide of the asymptotes +20805|270|25|2|30|35108.10|0.00|0.01|R|F|1995-04-01|1995-03-06|1995-04-20|COLLECT COD|FOB|s. ideas are furiously. slyly bold acco +20805|884|84|3|31|55331.28|0.07|0.05|R|F|1995-03-22|1995-03-06|1995-04-02|NONE|FOB|ide of the regul +20805|658|90|4|17|26497.05|0.04|0.06|R|F|1995-05-04|1995-03-18|1995-05-06|NONE|RAIL|elets sleep quickly. sly +20805|1375|14|5|47|59989.39|0.03|0.05|R|F|1995-03-12|1995-02-24|1995-03-19|COLLECT COD|FOB|ing, stealthy platelets wake across th +20806|1528|69|1|47|67187.44|0.06|0.01|N|O|1997-01-18|1996-11-12|1997-01-26|NONE|SHIP|deposits sleep ev +20806|1394|9|2|14|18135.46|0.08|0.05|N|O|1997-01-27|1996-12-26|1997-02-16|TAKE BACK RETURN|SHIP|silent packages impress quickly furi +20806|612|44|3|40|60504.40|0.10|0.05|N|O|1996-10-17|1996-12-18|1996-10-27|TAKE BACK RETURN|FOB|ously express attainments wake. p +20806|1635|59|4|46|70684.98|0.01|0.05|N|O|1996-11-13|1996-12-11|1996-12-11|COLLECT COD|FOB| ideas promise carefully regu +20807|266|48|1|5|5831.30|0.03|0.04|R|F|1992-08-09|1992-09-14|1992-08-30|TAKE BACK RETURN|AIR|ggle. express deposits +20807|1170|71|2|21|22494.57|0.03|0.06|R|F|1992-09-11|1992-10-04|1992-09-28|TAKE BACK RETURN|FOB|structions sle +20807|117|44|3|7|7119.77|0.02|0.02|A|F|1992-09-22|1992-09-01|1992-10-14|DELIVER IN PERSON|FOB|ns wake closely. instructions p +20807|153|6|4|15|15797.25|0.01|0.07|R|F|1992-07-23|1992-09-26|1992-08-13|COLLECT COD|MAIL|yly ironic depo +20807|676|77|5|27|42570.09|0.02|0.01|R|F|1992-11-15|1992-09-12|1992-12-12|NONE|AIR|inal accounts. fluffi +20807|111|12|6|23|23255.53|0.08|0.00|A|F|1992-08-10|1992-08-27|1992-08-29|DELIVER IN PERSON|AIR|theodolites. quickly ir +20832|405|64|1|37|48299.80|0.04|0.00|R|F|1993-08-22|1993-10-02|1993-08-27|TAKE BACK RETURN|TRUCK|rding to the furiously dogged reques +20832|83|59|2|9|8847.72|0.07|0.05|A|F|1993-10-15|1993-09-05|1993-11-08|NONE|TRUCK|e silent, ironi +20832|1388|65|3|40|51575.20|0.02|0.08|A|F|1993-10-11|1993-10-15|1993-10-23|DELIVER IN PERSON|FOB|ithely. excuses affix packages. +20833|1429|8|1|41|54547.22|0.05|0.04|N|O|1998-10-14|1998-09-17|1998-10-22|DELIVER IN PERSON|RAIL|ounts slee +20834|61|37|1|39|37481.34|0.06|0.06|A|F|1992-02-28|1992-02-16|1992-03-04|TAKE BACK RETURN|AIR| ironic foxes after the slyly +20835|1925|58|1|20|36538.40|0.03|0.07|N|O|1996-01-21|1996-03-10|1996-01-26|NONE|REG AIR|e quietly among the quickly +20835|5|31|2|1|905.00|0.02|0.08|N|O|1996-03-18|1996-03-17|1996-04-01|DELIVER IN PERSON|AIR|dependencies between the carefull +20835|1470|88|3|39|53487.33|0.00|0.04|N|O|1996-02-23|1996-03-09|1996-03-18|COLLECT COD|FOB|s use. deposits alongside of +20835|61|87|4|26|24987.56|0.04|0.00|N|O|1996-03-19|1996-03-09|1996-04-05|COLLECT COD|TRUCK|ake slyly about the permanently f +20835|80|56|5|39|38223.12|0.09|0.08|N|O|1996-05-09|1996-04-08|1996-05-15|COLLECT COD|REG AIR|sts. furiously special +20836|1624|48|1|30|45768.60|0.05|0.04|N|O|1998-09-30|1998-07-17|1998-10-20|COLLECT COD|RAIL|s doubt slyly at the unusu +20837|564|65|1|42|61511.52|0.01|0.02|A|F|1994-03-03|1994-05-03|1994-03-31|DELIVER IN PERSON|MAIL|t the quickly special requ +20837|792|57|2|6|10156.74|0.00|0.05|R|F|1994-04-12|1994-03-10|1994-04-13|DELIVER IN PERSON|TRUCK|above the quickly +20838|1482|22|1|46|63640.08|0.04|0.06|A|F|1994-07-24|1994-05-13|1994-08-01|TAKE BACK RETURN|FOB|round the slyly bold requests. +20838|1889|90|2|49|87753.12|0.02|0.02|R|F|1994-05-31|1994-06-28|1994-06-26|NONE|REG AIR|ole slyly. even account +20838|970|71|3|43|80451.71|0.05|0.07|R|F|1994-04-26|1994-06-15|1994-05-02|NONE|MAIL|. somas haggle care +20838|97|48|4|35|34898.15|0.06|0.04|R|F|1994-05-19|1994-07-09|1994-05-23|NONE|SHIP|ts. carefully even +20838|148|49|5|38|39829.32|0.00|0.08|A|F|1994-06-16|1994-06-15|1994-07-09|NONE|SHIP|as. even, fina +20838|504|65|6|26|36517.00|0.01|0.07|R|F|1994-06-07|1994-06-05|1994-06-13|COLLECT COD|SHIP|carefully bold requests. perm +20839|1161|70|1|46|48859.36|0.08|0.04|N|O|1998-09-30|1998-08-15|1998-10-01|DELIVER IN PERSON|FOB|unusual epitaphs integrate furiously? furi +20839|1308|23|2|18|21767.40|0.00|0.04|N|O|1998-09-18|1998-07-20|1998-10-10|TAKE BACK RETURN|REG AIR|ess requests haggle. quickly even dep +20864|1781|24|1|24|40386.72|0.07|0.06|N|O|1996-04-01|1996-02-02|1996-04-24|COLLECT COD|MAIL|ironic packag +20864|36|37|2|42|39313.26|0.01|0.05|N|O|1996-02-07|1996-01-24|1996-03-05|COLLECT COD|REG AIR|ove the thin ti +20864|671|72|3|5|7858.35|0.08|0.08|N|O|1996-02-13|1996-02-18|1996-02-25|TAKE BACK RETURN|AIR| across the regular fox +20864|90|16|4|29|28712.61|0.01|0.06|N|O|1996-02-05|1996-01-07|1996-02-25|DELIVER IN PERSON|MAIL|accounts are quick +20864|1965|98|5|40|74678.40|0.10|0.07|N|O|1996-01-14|1996-01-29|1996-01-29|NONE|AIR|al foxes. regular braids a +20864|1884|85|6|45|80364.60|0.01|0.08|N|O|1996-01-22|1996-03-03|1996-02-17|DELIVER IN PERSON|RAIL|ven dependencies are quickly about the sile +20865|1516|57|1|13|18427.63|0.00|0.02|N|O|1998-04-03|1998-03-14|1998-04-12|DELIVER IN PERSON|RAIL|ding requests. carefully final package +20865|637|31|2|50|76881.50|0.06|0.08|N|O|1998-03-11|1998-01-23|1998-03-13|DELIVER IN PERSON|FOB| blithely pending requests wake furi +20865|1962|63|3|43|80150.28|0.04|0.01|N|O|1998-04-05|1998-01-26|1998-04-29|COLLECT COD|TRUCK|around the blithe deposits +20865|1612|95|4|32|48435.52|0.07|0.08|N|O|1998-02-07|1998-03-06|1998-02-26|NONE|FOB|usly quick a +20865|1158|59|5|36|38129.40|0.05|0.08|N|O|1998-03-15|1998-02-01|1998-03-26|DELIVER IN PERSON|REG AIR|kages nag blithely bold pinto +20865|596|57|6|43|64353.37|0.07|0.07|N|O|1998-02-16|1998-01-30|1998-03-07|NONE|RAIL|deposits lose. carefully ironic deposi +20865|1519|40|7|25|35512.75|0.04|0.00|N|O|1998-04-14|1998-02-03|1998-04-22|DELIVER IN PERSON|SHIP|arefully unusu +20866|1663|87|1|9|14081.94|0.04|0.07|A|F|1995-06-04|1995-04-27|1995-06-09|DELIVER IN PERSON|FOB|c theodolites wake carefully ironic +20866|1789|32|2|45|76085.10|0.02|0.01|N|O|1995-06-20|1995-05-30|1995-07-03|TAKE BACK RETURN|FOB|sual, even theodolites agai +20866|589|50|3|31|46176.98|0.10|0.05|R|F|1995-04-30|1995-05-14|1995-05-16|COLLECT COD|AIR|ajole alongside of the blithely final id +20866|965|100|4|12|22391.52|0.01|0.07|N|O|1995-07-06|1995-05-12|1995-08-01|COLLECT COD|SHIP|hely bold accounts. f +20866|678|79|5|47|74197.49|0.04|0.03|A|F|1995-04-07|1995-05-31|1995-04-22|NONE|RAIL|uests sleep furiously. +20867|1465|5|1|17|23229.82|0.01|0.04|N|O|1997-01-21|1997-01-13|1997-02-20|TAKE BACK RETURN|FOB|sly special platelets wake slyly acr +20867|1530|71|2|2|2863.06|0.00|0.05|N|O|1997-01-03|1997-01-14|1997-01-19|TAKE BACK RETURN|MAIL|sts. somas about the pend +20867|802|36|3|16|27244.80|0.07|0.08|N|O|1996-12-16|1997-01-18|1996-12-19|COLLECT COD|TRUCK|uickly after the +20867|437|96|4|47|62859.21|0.03|0.03|N|O|1996-12-15|1997-01-04|1996-12-26|TAKE BACK RETURN|TRUCK|low accoun +20867|1663|46|5|3|4693.98|0.06|0.08|N|O|1997-01-08|1997-01-05|1997-01-10|COLLECT COD|TRUCK|detect alongs +20868|1711|12|1|6|9676.26|0.07|0.01|A|F|1994-01-15|1993-11-16|1994-01-27|TAKE BACK RETURN|SHIP|s cajole carefully af +20868|1416|95|2|13|17126.33|0.07|0.04|R|F|1994-01-12|1993-11-30|1994-02-09|NONE|FOB|. final, slow requests run +20868|83|59|3|9|8847.72|0.10|0.00|R|F|1994-01-31|1994-01-04|1994-02-24|NONE|FOB|ly. deposits +20869|309|38|1|10|12093.00|0.00|0.07|N|O|1996-09-29|1996-11-20|1996-10-12|COLLECT COD|FOB|. blithely pending accounts a +20870|279|34|1|17|20047.59|0.06|0.04|A|F|1994-12-05|1994-10-11|1994-12-20|TAKE BACK RETURN|MAIL|regular accounts. ru +20870|198|51|2|3|3294.57|0.07|0.00|R|F|1994-10-30|1994-10-19|1994-11-19|COLLECT COD|AIR|ounts wake slyly +20870|510|11|3|33|46546.83|0.08|0.03|R|F|1994-11-26|1994-10-25|1994-12-05|NONE|REG AIR|ly carefully regular +20870|1510|51|4|20|28230.20|0.06|0.05|R|F|1994-10-23|1994-10-31|1994-11-21|DELIVER IN PERSON|FOB|tructions. +20870|1979|80|5|42|79000.74|0.01|0.03|A|F|1994-11-27|1994-09-27|1994-12-09|NONE|MAIL| blithely final foxes wake +20871|1870|100|1|39|69102.93|0.01|0.06|A|F|1993-12-10|1993-12-12|1993-12-14|NONE|RAIL|al courts. quickl +20871|15|16|2|9|8235.09|0.04|0.01|R|F|1993-12-22|1993-11-11|1994-01-10|COLLECT COD|TRUCK|sual pinto beans. regu +20896|69|95|1|28|27133.68|0.06|0.07|A|F|1993-04-03|1993-03-25|1993-04-28|DELIVER IN PERSON|AIR|riously pending theodolites? s +20897|673|74|1|37|58225.79|0.09|0.07|A|F|1995-06-02|1995-05-19|1995-06-16|NONE|TRUCK|gular excuses sleep furiously. excus +20897|771|68|2|44|73557.88|0.05|0.05|N|O|1995-07-11|1995-05-11|1995-08-01|DELIVER IN PERSON|RAIL|ccounts sleep quickly. theodolite +20898|358|43|1|21|26425.35|0.10|0.00|N|O|1995-12-10|1996-01-26|1996-01-04|DELIVER IN PERSON|TRUCK|ly ironic deposits cajole furiously +20898|1660|61|2|13|20301.58|0.05|0.07|N|O|1996-02-02|1995-12-23|1996-02-24|TAKE BACK RETURN|FOB|cial depos +20898|566|27|3|32|46929.92|0.09|0.01|N|O|1996-02-29|1995-12-09|1996-03-14|COLLECT COD|TRUCK|t blithely regular deposits. flu +20898|203|4|4|7|7722.40|0.10|0.05|N|O|1995-12-24|1995-12-24|1996-01-12|COLLECT COD|RAIL|brave deposits cajole about the b +20898|1398|13|5|20|25987.80|0.02|0.03|N|O|1995-12-05|1996-01-02|1996-01-02|DELIVER IN PERSON|MAIL| express platelets. dogged, +20899|90|41|1|10|9900.90|0.03|0.06|R|F|1993-07-16|1993-06-17|1993-07-21|COLLECT COD|MAIL| wake fluffily even +20899|1867|11|2|11|19457.46|0.06|0.07|A|F|1993-06-05|1993-06-09|1993-06-18|NONE|AIR|nal packages cajole. theodolites wake. depo +20899|257|39|3|38|43975.50|0.10|0.07|R|F|1993-04-26|1993-06-09|1993-05-19|DELIVER IN PERSON|AIR|its! silent, regular packages integra +20899|893|94|4|15|26908.35|0.07|0.00|A|F|1993-07-17|1993-05-22|1993-07-27|TAKE BACK RETURN|SHIP|c, regular excuses. slyly +20900|1211|49|1|16|17795.36|0.07|0.03|A|F|1994-01-14|1994-02-17|1994-01-25|DELIVER IN PERSON|AIR| packages above the ex +20900|886|86|2|3|5360.64|0.05|0.08|R|F|1994-03-14|1993-12-31|1994-04-08|DELIVER IN PERSON|FOB|l excuses belie +20900|1557|98|3|8|11668.40|0.06|0.04|A|F|1994-01-04|1994-01-22|1994-01-07|NONE|MAIL|ing ideas haggle furiously i +20901|1998|99|1|44|83599.56|0.08|0.03|A|F|1995-04-30|1995-05-03|1995-05-01|NONE|SHIP| bold braids haggl +20902|1429|69|1|33|43903.86|0.08|0.02|N|O|1997-03-12|1997-03-14|1997-03-31|COLLECT COD|RAIL|ular, express plat +20902|176|3|2|25|26904.25|0.00|0.03|N|O|1997-03-10|1997-03-28|1997-04-06|NONE|AIR|usly even pinto beans x-ray. dep +20902|969|4|3|26|48618.96|0.00|0.04|N|O|1997-03-30|1997-03-13|1997-04-11|NONE|FOB| blithely e +20902|956|57|4|13|24140.35|0.04|0.01|N|O|1997-02-10|1997-02-07|1997-03-10|NONE|SHIP|requests along the even ide +20903|1651|75|1|50|77632.50|0.07|0.08|R|F|1994-05-24|1994-08-13|1994-05-27|NONE|TRUCK|arefully daring gifts. express deposits +20903|225|53|2|23|25880.06|0.01|0.02|A|F|1994-06-14|1994-06-25|1994-06-27|NONE|TRUCK|s wake blith +20928|402|61|1|24|31257.60|0.00|0.07|N|O|1995-06-27|1995-07-03|1995-07-05|TAKE BACK RETURN|MAIL| packages dazzle. careful +20928|1903|36|2|34|61366.60|0.10|0.03|N|O|1995-07-05|1995-05-17|1995-07-27|TAKE BACK RETURN|AIR|sual, regula +20928|1255|93|3|27|31218.75|0.04|0.03|N|F|1995-06-02|1995-06-28|1995-06-19|TAKE BACK RETURN|MAIL|inst the pin +20928|159|38|4|4|4236.60|0.09|0.05|A|F|1995-06-02|1995-05-27|1995-06-11|DELIVER IN PERSON|RAIL|sleep. final, regular foxes nag bl +20929|1397|74|1|43|55830.77|0.06|0.03|N|O|1998-04-23|1998-02-02|1998-05-21|TAKE BACK RETURN|TRUCK| even foxes. ideas are after the expre +20929|1447|26|2|18|24271.92|0.02|0.08|N|O|1998-02-08|1998-03-23|1998-02-15|DELIVER IN PERSON|SHIP|nto beans. slyly ironic account +20930|1140|41|1|6|6246.84|0.02|0.00|N|O|1996-05-27|1996-06-27|1996-06-11|COLLECT COD|REG AIR|ar deposits b +20930|723|88|2|46|74691.12|0.08|0.04|N|O|1996-06-21|1996-07-29|1996-07-06|NONE|FOB|unusual deposits alongs +20930|1052|58|3|10|9530.50|0.09|0.01|N|O|1996-09-07|1996-08-01|1996-09-14|DELIVER IN PERSON|TRUCK|! enticingly even +20930|294|49|4|43|51354.47|0.01|0.07|N|O|1996-05-28|1996-08-10|1996-06-15|COLLECT COD|SHIP|rate slyly unusual deposi +20931|1290|91|1|34|40503.86|0.01|0.07|R|F|1995-04-20|1995-03-20|1995-05-16|NONE|MAIL|onic, even +20931|74|75|2|1|974.07|0.03|0.00|A|F|1995-03-11|1995-03-26|1995-03-25|COLLECT COD|SHIP|ing asymptotes. slyly even excuses a +20931|1784|11|3|18|30344.04|0.02|0.00|A|F|1995-02-17|1995-04-06|1995-03-10|DELIVER IN PERSON|MAIL| brave accounts run +20931|812|79|4|15|25692.15|0.00|0.01|A|F|1995-04-29|1995-02-28|1995-05-16|NONE|AIR|ording to the deposits are unus +20931|956|57|5|33|61279.35|0.02|0.08|R|F|1995-03-03|1995-04-14|1995-03-21|DELIVER IN PERSON|AIR|lent pinto bean +20931|519|20|6|10|14195.10|0.08|0.06|R|F|1995-04-20|1995-04-19|1995-05-17|DELIVER IN PERSON|REG AIR|al deposits nag pinto beans: slyly ironic +20932|528|89|1|24|34284.48|0.06|0.00|A|F|1992-10-06|1992-10-12|1992-10-29|COLLECT COD|SHIP|haggle furiously. fur +20932|142|69|2|26|27095.64|0.10|0.05|R|F|1992-08-30|1992-09-23|1992-09-07|COLLECT COD|AIR|eas boost above the sl +20932|1225|37|3|18|20271.96|0.04|0.05|A|F|1992-10-31|1992-09-19|1992-11-10|DELIVER IN PERSON|FOB| the slyly regular packages +20932|1204|16|4|25|27630.00|0.04|0.04|R|F|1992-10-06|1992-10-15|1992-10-19|NONE|REG AIR|its wake quickly above the regular, re +20932|1219|31|5|37|41447.77|0.00|0.05|R|F|1992-10-23|1992-10-26|1992-10-26|NONE|FOB|slow asymptotes. f +20932|1448|88|6|46|62074.24|0.02|0.06|A|F|1992-09-25|1992-10-09|1992-10-05|DELIVER IN PERSON|MAIL| the carefully final packages affix ac +20932|761|26|7|37|61485.12|0.09|0.07|A|F|1992-09-27|1992-10-27|1992-10-12|TAKE BACK RETURN|AIR|he final dependencies. even ideas w +20933|164|91|1|7|7449.12|0.10|0.08|R|F|1992-11-04|1992-11-14|1992-11-23|DELIVER IN PERSON|RAIL|tes detect quickly. expre +20933|943|78|2|26|47942.44|0.10|0.06|A|F|1992-09-25|1992-10-29|1992-10-25|COLLECT COD|RAIL|structions +20933|873|74|3|30|53216.10|0.04|0.04|R|F|1992-11-14|1992-11-03|1992-12-03|TAKE BACK RETURN|REG AIR| accounts nag slyly. furious +20933|1512|93|4|35|49472.85|0.06|0.08|R|F|1992-11-25|1992-10-15|1992-12-04|TAKE BACK RETURN|REG AIR|ly regular deposits sleep +20933|1018|89|5|9|8271.09|0.08|0.04|A|F|1992-12-15|1992-10-14|1992-12-17|DELIVER IN PERSON|REG AIR|ounts integrate bold deposit +20933|382|11|6|8|10259.04|0.05|0.04|R|F|1992-12-22|1992-11-20|1993-01-12|TAKE BACK RETURN|AIR|lithely furious the +20933|586|77|7|31|46083.98|0.03|0.01|A|F|1992-10-25|1992-10-10|1992-11-10|NONE|AIR|s. express deposits +20934|561|22|1|48|70154.88|0.03|0.00|A|F|1993-05-13|1993-02-25|1993-05-31|DELIVER IN PERSON|FOB|le blithely beneath the furio +20934|1189|90|2|25|27254.50|0.03|0.07|A|F|1993-04-13|1993-02-20|1993-04-30|NONE|MAIL|unusual depos +20934|95|46|3|16|15921.44|0.02|0.02|R|F|1993-01-30|1993-04-06|1993-02-04|NONE|AIR|ic dependencies. bli +20934|1194|3|4|18|19713.42|0.02|0.01|A|F|1993-03-11|1993-03-01|1993-03-25|DELIVER IN PERSON|AIR|y ironic, unusual theodolites. quic +20934|16|67|5|44|40304.44|0.07|0.02|A|F|1993-02-26|1993-03-09|1993-03-22|DELIVER IN PERSON|SHIP| carefully regular theodolites. deposits wa +20935|1993|26|1|42|79589.58|0.04|0.01|N|O|1996-06-29|1996-05-30|1996-07-22|NONE|RAIL|ep furiously furiously regular ideas +20960|1234|46|1|13|14757.99|0.03|0.01|N|O|1996-01-03|1996-02-06|1996-01-24|COLLECT COD|SHIP|slyly unusual a +20960|193|72|2|7|7652.33|0.10|0.08|N|O|1996-01-05|1996-02-17|1996-01-06|DELIVER IN PERSON|RAIL|ic packages haggle quickly unusual pinto +20960|1556|77|3|12|17490.60|0.09|0.03|N|O|1995-12-27|1996-02-16|1995-12-31|DELIVER IN PERSON|REG AIR| the quickly u +20960|167|68|4|31|33081.96|0.06|0.08|N|O|1996-01-11|1996-02-06|1996-01-31|COLLECT COD|MAIL|ckly express deposits. +20961|1014|20|1|13|11895.13|0.07|0.05|A|F|1993-04-13|1993-03-11|1993-05-01|TAKE BACK RETURN|FOB|r deposits. bo +20961|36|37|2|43|40249.29|0.09|0.00|A|F|1993-03-11|1993-02-26|1993-03-16|NONE|SHIP|slyly final excuses snooze quickly +20961|898|99|3|41|73754.49|0.01|0.04|R|F|1993-03-19|1993-03-07|1993-03-22|COLLECT COD|RAIL|reach carefully above the furiously ironic +20961|213|14|4|30|33396.30|0.03|0.02|A|F|1993-03-04|1993-03-10|1993-03-24|TAKE BACK RETURN|TRUCK|gular packages. ironically final ideas abo +20961|829|63|5|27|46705.14|0.04|0.08|R|F|1993-05-16|1993-04-02|1993-06-08|TAKE BACK RETURN|TRUCK|xcuses. bli +20961|1144|45|6|31|32399.34|0.04|0.06|A|F|1993-02-14|1993-02-23|1993-03-13|COLLECT COD|SHIP|blithely regul +20961|1816|60|7|12|20613.72|0.09|0.07|A|F|1993-05-15|1993-03-14|1993-05-25|TAKE BACK RETURN|REG AIR|, bold requests. slyly final excuses u +20962|1888|18|1|43|76964.84|0.08|0.07|R|F|1992-05-02|1992-05-03|1992-05-23|NONE|MAIL|posits sleep sometimes. slyly final ideas +20962|1331|8|2|21|25878.93|0.00|0.05|R|F|1992-05-31|1992-04-11|1992-06-12|NONE|TRUCK|erve slyly express asymptot +20962|1957|58|3|41|76216.95|0.10|0.01|A|F|1992-02-17|1992-04-19|1992-02-28|DELIVER IN PERSON|RAIL|elets sleep flu +20962|112|39|4|32|32387.52|0.05|0.00|A|F|1992-04-09|1992-04-13|1992-04-18|COLLECT COD|RAIL|onic foxes among the furiously express +20962|1472|73|5|44|60432.68|0.07|0.08|A|F|1992-04-07|1992-05-13|1992-04-24|COLLECT COD|RAIL|he express, regular theodolit +20963|1405|6|1|25|32660.00|0.09|0.01|A|F|1994-10-27|1994-11-30|1994-11-05|NONE|TRUCK|usual asym +20964|1617|18|1|24|36446.64|0.03|0.01|R|F|1992-07-08|1992-06-02|1992-07-17|DELIVER IN PERSON|RAIL|oxes. furiously final accounts cajole blit +20964|428|58|2|44|58450.48|0.06|0.06|R|F|1992-04-03|1992-06-17|1992-04-28|COLLECT COD|RAIL|leep furiously alon +20964|1860|47|3|15|26427.90|0.05|0.01|R|F|1992-04-10|1992-05-04|1992-05-05|TAKE BACK RETURN|RAIL|lites; even, ev +20964|735|100|4|44|71972.12|0.06|0.08|A|F|1992-05-12|1992-05-04|1992-05-17|DELIVER IN PERSON|TRUCK|egular requests. accounts wake a +20964|687|88|5|3|4763.04|0.06|0.02|R|F|1992-04-27|1992-06-23|1992-05-27|DELIVER IN PERSON|RAIL|slyly final accounts lose +20964|1887|74|6|41|73344.08|0.04|0.04|R|F|1992-07-29|1992-04-30|1992-08-05|TAKE BACK RETURN|RAIL|riously even pinto be +20964|1086|92|7|30|29612.40|0.04|0.01|A|F|1992-04-21|1992-06-07|1992-05-08|TAKE BACK RETURN|AIR| daringly. bravely pending foxe +20965|1566|47|1|16|23480.96|0.09|0.02|A|F|1995-02-03|1995-02-01|1995-02-14|TAKE BACK RETURN|SHIP| cajole slyly +20965|833|34|2|48|83223.84|0.02|0.07|A|F|1994-12-30|1995-02-18|1995-01-04|COLLECT COD|AIR|olites doubt blithe +20965|1921|66|3|17|30989.64|0.10|0.01|R|F|1994-12-26|1995-01-31|1994-12-30|NONE|AIR|l packages are. fluffily unusual request +20965|114|67|4|3|3042.33|0.06|0.07|A|F|1995-04-18|1995-03-13|1995-05-14|TAKE BACK RETURN|TRUCK| fluffy deposits. sly +20965|787|20|5|26|43882.28|0.07|0.01|A|F|1995-03-29|1995-02-02|1995-04-15|DELIVER IN PERSON|FOB|e packages. pending pi +20966|1166|75|1|14|14940.24|0.08|0.02|R|F|1993-10-17|1993-11-21|1993-10-27|COLLECT COD|FOB|accounts. regula +20966|1914|15|2|23|41765.93|0.08|0.08|R|F|1993-10-10|1993-11-21|1993-11-04|TAKE BACK RETURN|REG AIR|d of the fluffily regular packag +20966|785|86|3|30|50573.40|0.06|0.05|A|F|1993-10-31|1993-12-10|1993-11-01|DELIVER IN PERSON|FOB| sleep fluffily carefully +20966|232|14|4|20|22644.60|0.00|0.04|A|F|1993-09-22|1993-10-29|1993-09-25|TAKE BACK RETURN|FOB|quests hinder quickly f +20966|412|71|5|42|55121.22|0.01|0.01|R|F|1993-11-06|1993-11-26|1993-11-22|COLLECT COD|AIR|theodolites +20967|7|8|1|2|1814.00|0.01|0.05|R|F|1995-05-20|1995-05-23|1995-06-01|TAKE BACK RETURN|SHIP|ccording to the quickly special theodo +20967|750|47|2|2|3301.50|0.06|0.00|N|O|1995-07-09|1995-06-02|1995-07-21|COLLECT COD|TRUCK|al foxes. slyly final +20967|1091|27|3|47|46628.23|0.10|0.04|R|F|1995-03-25|1995-06-08|1995-04-11|TAKE BACK RETURN|SHIP|e evenly even requests. furiously iro +20967|1215|16|4|30|33486.30|0.01|0.04|N|F|1995-06-03|1995-06-03|1995-06-25|COLLECT COD|SHIP|symptotes. furiously re +20967|1866|96|5|29|51267.94|0.10|0.00|R|F|1995-04-17|1995-05-23|1995-04-22|COLLECT COD|REG AIR|ironic dependencies sleep +20967|1165|2|6|48|51175.68|0.02|0.00|N|O|1995-07-11|1995-05-23|1995-08-01|DELIVER IN PERSON|AIR|bove the pending asymptotes haggle never a +20967|589|80|7|27|40218.66|0.03|0.04|R|F|1995-04-22|1995-05-24|1995-05-16|TAKE BACK RETURN|AIR|slyly. accounts ca +20992|297|25|1|35|41905.15|0.04|0.08|A|F|1992-10-06|1992-10-05|1992-10-30|TAKE BACK RETURN|MAIL|e slyly silen +20992|1332|9|2|14|17266.62|0.06|0.07|A|F|1992-09-20|1992-09-15|1992-10-10|COLLECT COD|SHIP| beans. close +20992|70|21|3|9|8730.63|0.10|0.08|R|F|1992-11-28|1992-09-10|1992-12-17|TAKE BACK RETURN|FOB| requests are +20992|1147|48|4|21|22010.94|0.10|0.08|A|F|1992-11-23|1992-09-28|1992-11-29|COLLECT COD|MAIL|xpress, bold accounts solve among +20993|538|69|1|9|12946.77|0.06|0.05|N|O|1996-04-05|1996-03-11|1996-04-21|COLLECT COD|SHIP|ke. furiously ironic requests cajole care +20993|157|36|2|31|32771.65|0.01|0.04|N|O|1996-05-16|1996-02-29|1996-06-14|NONE|AIR| the never express ideas +20994|683|15|1|31|49094.08|0.07|0.05|N|O|1996-06-08|1996-06-20|1996-06-10|DELIVER IN PERSON|AIR|tructions boost carefully about the fu +20994|1684|85|2|50|79284.00|0.04|0.03|N|O|1996-04-21|1996-06-25|1996-05-09|TAKE BACK RETURN|RAIL|p carefully. furiously even ideas hagg +20994|433|92|3|42|56004.06|0.06|0.05|N|O|1996-04-13|1996-07-11|1996-04-14|COLLECT COD|MAIL|ly express theodo +20995|1297|9|1|27|32353.83|0.00|0.06|A|F|1992-05-23|1992-06-03|1992-06-01|COLLECT COD|REG AIR|. carefully final asymptotes poa +20995|1875|62|2|28|49752.36|0.07|0.02|R|F|1992-05-25|1992-06-01|1992-06-24|COLLECT COD|FOB|rding to the final, ironic excuses +20995|48|99|3|22|20856.88|0.05|0.00|A|F|1992-07-13|1992-05-16|1992-07-19|TAKE BACK RETURN|TRUCK|ns. ironic account +20995|1264|39|4|9|10487.34|0.03|0.07|A|F|1992-07-22|1992-06-12|1992-07-26|NONE|MAIL| detect quickly pending accounts. ev +20996|1228|66|1|35|39522.70|0.08|0.07|N|O|1996-11-01|1996-10-31|1996-11-29|DELIVER IN PERSON|RAIL|uches wake slyly accounts. ironic depo +20996|292|93|2|3|3576.87|0.03|0.01|N|O|1996-11-29|1996-09-30|1996-12-03|COLLECT COD|TRUCK|eaves along the special +20996|990|59|3|4|7563.96|0.04|0.03|N|O|1996-11-23|1996-09-15|1996-12-14|TAKE BACK RETURN|TRUCK|nts use qu +20997|835|36|1|16|27773.28|0.08|0.02|N|O|1998-05-26|1998-04-08|1998-06-21|COLLECT COD|REG AIR|ithely according to the carefully reg +20997|683|84|2|14|22171.52|0.01|0.05|N|O|1998-03-27|1998-04-08|1998-04-22|NONE|MAIL|es cajole among the slyly +20997|1203|78|3|8|8833.60|0.00|0.04|N|O|1998-03-22|1998-04-10|1998-04-03|NONE|REG AIR|eans. blithely final accounts use; quic +20997|1927|60|4|38|69498.96|0.05|0.00|N|O|1998-04-02|1998-04-10|1998-04-04|COLLECT COD|TRUCK|odolites kindle furiously across +20997|375|32|5|12|15304.44|0.01|0.00|N|O|1998-07-03|1998-04-07|1998-07-31|NONE|TRUCK|cross the unus +20997|1727|70|6|1|1628.72|0.00|0.00|N|O|1998-04-08|1998-05-20|1998-05-05|DELIVER IN PERSON|RAIL|final requests. carefully even pi +20997|1250|62|7|3|3453.75|0.05|0.08|N|O|1998-05-25|1998-05-16|1998-05-27|COLLECT COD|FOB|tes cajole carefully across t +20998|380|37|1|39|49934.82|0.09|0.08|N|O|1997-03-06|1997-03-27|1997-03-19|COLLECT COD|TRUCK|final packages affi +20998|410|40|2|45|58968.45|0.02|0.00|N|O|1997-02-23|1997-03-27|1997-03-19|TAKE BACK RETURN|REG AIR| express ideas. +20998|1572|53|3|27|39786.39|0.09|0.08|N|O|1997-02-18|1997-04-12|1997-02-20|TAKE BACK RETURN|REG AIR|e express, bold packages. fina +20998|1972|61|4|36|67462.92|0.00|0.06|N|O|1997-03-31|1997-03-28|1997-04-22|NONE|RAIL|ing to the c +20998|1128|29|5|26|26757.12|0.05|0.08|N|O|1997-03-14|1997-03-04|1997-04-07|NONE|RAIL|ag among the express de +20998|1868|69|6|23|40706.78|0.03|0.02|N|O|1997-03-30|1997-04-23|1997-04-20|NONE|FOB|e blithely a +20998|1840|41|7|8|13934.72|0.01|0.04|N|O|1997-02-22|1997-04-25|1997-03-10|COLLECT COD|RAIL|ic accounts. accounts are daringly. +20999|1761|46|1|4|6651.04|0.07|0.06|N|O|1997-07-23|1997-07-14|1997-08-16|TAKE BACK RETURN|AIR|theodolites. express, express pl +20999|1373|12|2|20|25487.40|0.04|0.00|N|O|1997-05-31|1997-06-23|1997-06-23|TAKE BACK RETURN|TRUCK| above the fluffi +20999|13|64|3|8|7304.08|0.04|0.02|N|O|1997-06-10|1997-06-03|1997-06-12|DELIVER IN PERSON|REG AIR|ly unusual ideas dete +20999|1276|14|4|50|58863.50|0.07|0.03|N|O|1997-07-13|1997-07-20|1997-07-26|DELIVER IN PERSON|SHIP|ffily unusual excu +20999|839|39|5|2|3479.66|0.06|0.02|N|O|1997-08-07|1997-06-03|1997-08-24|DELIVER IN PERSON|AIR|. furiously eve +20999|314|43|6|10|12143.10|0.02|0.03|N|O|1997-05-23|1997-06-19|1997-06-01|NONE|AIR|s ideas. quickly special instr +21024|1092|63|1|10|9930.90|0.10|0.03|A|F|1994-03-17|1994-03-16|1994-03-20|DELIVER IN PERSON|FOB|cuses. furiousl +21024|878|78|2|16|28461.92|0.03|0.01|A|F|1994-03-31|1994-03-16|1994-04-13|TAKE BACK RETURN|RAIL| unusual instructi +21024|1386|63|3|26|33471.88|0.02|0.07|A|F|1994-04-29|1994-01-30|1994-05-16|COLLECT COD|AIR|s nag carefully qui +21025|1382|59|1|14|17967.32|0.05|0.04|R|F|1993-10-22|1993-11-05|1993-11-01|TAKE BACK RETURN|FOB|asymptotes promis +21025|948|83|2|12|22187.28|0.09|0.05|A|F|1993-12-31|1993-11-11|1994-01-05|NONE|REG AIR|unts boost furiously. ironic, re +21025|1331|32|3|31|38202.23|0.04|0.00|R|F|1993-10-25|1993-11-25|1993-11-20|DELIVER IN PERSON|FOB|bout the carefully final +21025|1261|99|4|5|5811.30|0.06|0.05|R|F|1993-10-22|1993-11-19|1993-10-24|COLLECT COD|REG AIR|g asymptotes run blithe +21026|1957|2|1|43|79934.85|0.00|0.02|N|O|1996-09-13|1996-11-03|1996-10-09|NONE|AIR|y final dolphins +21026|1736|37|2|40|65509.20|0.10|0.04|N|O|1996-09-25|1996-10-16|1996-10-14|TAKE BACK RETURN|SHIP|lar dependenc +21027|1638|62|1|49|75441.87|0.05|0.01|R|F|1993-04-10|1993-03-18|1993-04-28|TAKE BACK RETURN|FOB|e furiously final requests integ +21027|1357|34|2|16|20133.60|0.04|0.00|R|F|1993-02-26|1993-03-23|1993-03-10|DELIVER IN PERSON|SHIP|ely blithely special dependenci +21027|185|12|3|24|26044.32|0.08|0.00|A|F|1993-03-14|1993-03-01|1993-04-10|NONE|REG AIR|y ironic accounts. +21027|1550|31|4|43|62416.65|0.10|0.07|A|F|1993-03-03|1993-04-04|1993-03-24|TAKE BACK RETURN|TRUCK|s wake against the furiously final platel +21027|1952|97|5|8|14831.60|0.00|0.01|A|F|1993-04-03|1993-03-13|1993-04-23|COLLECT COD|AIR|tes mold never regular +21027|562|93|6|27|39489.12|0.04|0.07|R|F|1993-03-10|1993-03-19|1993-03-20|COLLECT COD|MAIL|sits haggle along the furiously even acc +21028|822|56|1|11|18951.02|0.03|0.04|A|F|1992-08-29|1992-08-08|1992-08-30|COLLECT COD|TRUCK|es. carefully bold theodolites alongsid +21028|679|42|2|44|69505.48|0.08|0.02|A|F|1992-09-29|1992-07-08|1992-10-10|COLLECT COD|REG AIR|uriously bold pla +21029|976|77|1|29|54432.13|0.07|0.05|N|O|1996-05-20|1996-06-03|1996-05-26|COLLECT COD|REG AIR|efully. final courts among the furi +21030|500|88|1|45|63022.50|0.05|0.00|R|F|1992-06-08|1992-07-14|1992-06-22|DELIVER IN PERSON|RAIL| furiously across the +21030|895|29|2|14|25142.46|0.08|0.07|A|F|1992-05-04|1992-06-05|1992-05-28|TAKE BACK RETURN|SHIP|tes. bold accounts nod +21030|1729|30|3|1|1630.72|0.02|0.05|R|F|1992-08-07|1992-06-23|1992-08-15|TAKE BACK RETURN|FOB|ven deposits eat final platelets. furi +21030|605|37|4|18|27100.80|0.06|0.08|R|F|1992-07-08|1992-06-07|1992-07-22|DELIVER IN PERSON|RAIL|arefully express packages. evenl +21030|1330|31|5|31|38171.23|0.07|0.08|A|F|1992-07-13|1992-06-30|1992-07-15|COLLECT COD|SHIP|dencies are carefully along +21031|1169|78|1|41|43876.56|0.07|0.01|N|O|1995-10-12|1995-09-20|1995-11-05|COLLECT COD|SHIP|ckly ironic account +21031|1356|95|2|2|2514.70|0.02|0.01|N|O|1995-09-02|1995-11-02|1995-09-19|TAKE BACK RETURN|RAIL|usual dolphins. quickly ironic a +21056|1806|93|1|23|39279.40|0.04|0.08|A|F|1993-01-14|1992-12-22|1993-01-25|TAKE BACK RETURN|FOB|ts run among +21056|272|100|2|33|38684.91|0.02|0.03|R|F|1992-12-16|1992-12-22|1993-01-12|NONE|MAIL|lly pending foxes thrash fluffily. depende +21057|1158|95|1|16|16946.40|0.01|0.06|R|F|1995-04-12|1995-03-23|1995-05-03|COLLECT COD|AIR|egular foxes. iron +21057|1974|7|2|6|11255.82|0.03|0.00|A|F|1995-02-23|1995-03-28|1995-03-13|NONE|RAIL|as are carefully speci +21057|458|88|3|30|40753.50|0.03|0.06|A|F|1995-02-11|1995-04-03|1995-03-07|NONE|SHIP|ending somas. +21057|1294|6|4|5|5976.45|0.08|0.03|R|F|1995-03-30|1995-05-03|1995-03-31|NONE|TRUCK|sias. quickly ironic pains do +21057|29|55|5|19|17651.38|0.08|0.05|R|F|1995-05-19|1995-04-08|1995-06-05|TAKE BACK RETURN|REG AIR|ully unusual ex +21057|1045|16|6|48|45409.92|0.05|0.06|A|F|1995-04-29|1995-05-03|1995-05-22|DELIVER IN PERSON|AIR|lar accounts. furiously even dep +21057|925|26|7|2|3651.84|0.09|0.03|R|F|1995-03-08|1995-04-27|1995-03-31|TAKE BACK RETURN|AIR|kindle after the unusual pac +21058|1257|58|1|23|26639.75|0.04|0.06|R|F|1992-10-29|1992-12-05|1992-11-18|DELIVER IN PERSON|RAIL|ymptotes haggle b +21058|463|22|2|24|32723.04|0.04|0.01|A|F|1992-11-24|1992-11-13|1992-12-12|DELIVER IN PERSON|RAIL| the carefully bol +21059|204|5|1|40|44168.00|0.09|0.05|R|F|1993-01-09|1992-12-13|1993-02-01|TAKE BACK RETURN|FOB|nstructions about the +21060|1237|49|1|43|48943.89|0.00|0.03|N|O|1998-06-26|1998-07-05|1998-07-14|TAKE BACK RETURN|MAIL|o beans cajo +21060|343|44|2|6|7460.04|0.00|0.07|N|O|1998-08-15|1998-08-02|1998-08-26|COLLECT COD|REG AIR|ggle. carefully +21060|824|25|3|4|6899.28|0.07|0.03|N|O|1998-08-22|1998-08-03|1998-09-15|NONE|AIR|lithely along the quie +21060|846|13|4|34|59392.56|0.02|0.05|N|O|1998-07-20|1998-07-23|1998-08-03|NONE|MAIL|lly regular courts. regular, expres +21061|1381|20|1|37|47448.06|0.03|0.06|R|F|1995-04-22|1995-03-12|1995-05-22|DELIVER IN PERSON|FOB| detect carefully above the deposits. +21061|1816|46|2|3|5153.43|0.09|0.06|A|F|1995-01-10|1995-01-23|1995-01-13|COLLECT COD|TRUCK|above the +21062|1684|67|1|39|61841.52|0.04|0.02|N|O|1998-02-11|1997-11-28|1998-02-26|DELIVER IN PERSON|REG AIR|y according to the packages +21062|489|19|2|50|69474.00|0.08|0.04|N|O|1998-02-01|1997-12-14|1998-02-09|TAKE BACK RETURN|SHIP|thely regular deposits after th +21062|1503|84|3|10|14045.00|0.00|0.00|N|O|1997-12-10|1997-12-15|1998-01-06|NONE|REG AIR|special accounts. carefully ironic accoun +21062|1991|24|4|15|28394.85|0.04|0.05|N|O|1997-12-06|1997-11-15|1998-01-01|TAKE BACK RETURN|FOB|uctions about the furi +21062|1120|29|5|14|14295.68|0.10|0.06|N|O|1997-11-22|1997-12-06|1997-11-26|DELIVER IN PERSON|TRUCK|ar deposits ha +21062|726|27|6|32|52055.04|0.08|0.02|N|O|1998-01-15|1997-12-03|1998-01-24|NONE|RAIL|aggle caref +21062|1622|46|7|14|21330.68|0.06|0.05|N|O|1997-11-04|1997-12-05|1997-11-07|TAKE BACK RETURN|SHIP|ges. carefully ir +21063|1233|8|1|37|41966.51|0.09|0.05|N|O|1995-08-15|1995-05-22|1995-08-28|NONE|MAIL|cording to th +21063|663|95|2|38|59419.08|0.00|0.02|R|F|1995-05-07|1995-06-30|1995-05-25|TAKE BACK RETURN|TRUCK|the regular requests boost blithe +21088|1303|18|1|18|21677.40|0.10|0.02|N|O|1997-05-10|1997-05-02|1997-05-14|COLLECT COD|REG AIR|ven accounts cajole b +21088|415|45|2|41|53931.81|0.01|0.05|N|O|1997-03-11|1997-05-17|1997-03-26|TAKE BACK RETURN|REG AIR|eve slyly. care +21089|903|72|1|28|50509.20|0.10|0.05|N|O|1995-11-26|1995-09-14|1995-12-10|NONE|MAIL|lithely ironic depths along the +21089|1738|23|2|3|4919.19|0.10|0.01|N|O|1995-10-12|1995-10-03|1995-10-13|NONE|MAIL|ily even accounts wa +21089|1061|32|3|7|6734.42|0.08|0.07|N|O|1995-10-16|1995-09-08|1995-11-07|TAKE BACK RETURN|AIR|uctions. p +21089|1874|4|4|35|62155.45|0.07|0.04|N|O|1995-10-08|1995-09-02|1995-11-02|NONE|FOB|he packages ought to are. slyly iro +21089|1821|22|5|43|74081.26|0.07|0.03|N|O|1995-10-01|1995-09-08|1995-10-31|DELIVER IN PERSON|RAIL|lites wake idly. instructions h +21089|161|88|6|50|53058.00|0.05|0.07|N|O|1995-09-12|1995-09-21|1995-09-25|COLLECT COD|RAIL|carefully unusual instructions. ironic, +21090|1756|99|1|19|31497.25|0.08|0.06|A|F|1992-08-29|1992-06-24|1992-08-30|TAKE BACK RETURN|MAIL|e idly final dependencies. +21090|1315|16|2|15|18244.65|0.09|0.05|R|F|1992-07-21|1992-06-26|1992-08-12|COLLECT COD|SHIP|ual platelets nag car +21090|362|63|3|48|60593.28|0.07|0.01|A|F|1992-07-09|1992-07-09|1992-07-15|COLLECT COD|RAIL|s the pending theodolites. fluffily ironic +21090|1315|54|4|44|53517.64|0.07|0.07|A|F|1992-05-22|1992-06-15|1992-05-26|NONE|AIR|ly bold accounts cajole about the slyly eve +21091|1782|67|1|7|11786.46|0.03|0.03|R|F|1995-04-04|1995-03-06|1995-04-25|COLLECT COD|SHIP|gular pinto bean +21091|1198|71|2|12|13190.28|0.07|0.03|A|F|1995-02-08|1995-02-18|1995-02-19|COLLECT COD|REG AIR|e quickly +21091|1938|83|3|20|36798.60|0.00|0.01|R|F|1994-12-22|1995-03-08|1994-12-25|COLLECT COD|RAIL| of the blithely express +21091|1350|51|4|43|53808.05|0.02|0.02|A|F|1995-01-23|1995-02-22|1995-02-05|COLLECT COD|AIR|ording to the express requests. special i +21092|719|52|1|46|74506.66|0.01|0.06|N|O|1997-04-01|1997-04-02|1997-04-03|DELIVER IN PERSON|AIR| carefully regular g +21092|1044|45|2|5|4725.20|0.03|0.04|N|O|1997-02-13|1997-03-08|1997-02-15|NONE|FOB|tly even requests. exp +21092|906|75|3|25|45172.50|0.07|0.05|N|O|1997-04-17|1997-03-21|1997-05-07|DELIVER IN PERSON|REG AIR|ts across the ideas are carefully a +21092|1677|19|4|22|34730.74|0.01|0.06|N|O|1997-04-06|1997-03-01|1997-04-30|NONE|MAIL|unusual excuses boost quickly alongside o +21093|464|65|1|49|66858.54|0.05|0.07|A|F|1994-05-28|1994-03-31|1994-06-13|COLLECT COD|TRUCK|riously regular requests +21093|1753|54|2|8|13238.00|0.10|0.00|R|F|1994-04-20|1994-05-12|1994-05-12|COLLECT COD|REG AIR|ven ideas. unusual pinto beans wake; slyly +21094|1993|38|1|25|47374.75|0.00|0.07|A|F|1994-08-13|1994-09-21|1994-08-18|COLLECT COD|FOB| ironic pinto +21094|298|80|2|24|28758.96|0.10|0.05|R|F|1994-09-18|1994-08-21|1994-10-09|COLLECT COD|TRUCK|bout the careful +21095|545|6|1|2|2891.08|0.01|0.06|R|F|1994-02-24|1994-04-21|1994-02-25|NONE|SHIP|. quickly ironic packages kindle. f +21095|588|49|2|19|28283.02|0.06|0.08|R|F|1994-05-27|1994-03-20|1994-06-10|COLLECT COD|FOB|tions: quickly +21095|15|91|3|45|41175.45|0.07|0.08|R|F|1994-04-30|1994-04-03|1994-05-03|TAKE BACK RETURN|MAIL|xes grow quic +21095|1569|50|4|44|64704.64|0.06|0.04|R|F|1994-03-11|1994-05-09|1994-03-15|TAKE BACK RETURN|FOB|ely. furiously fina +21095|1135|36|5|34|35228.42|0.07|0.07|A|F|1994-03-16|1994-04-30|1994-04-08|DELIVER IN PERSON|SHIP|posits against the slyly even deposits boo +21095|521|12|6|41|58282.32|0.03|0.03|R|F|1994-04-21|1994-04-18|1994-04-27|COLLECT COD|SHIP|ccounts! bold deposits integrat +21120|351|52|1|10|12513.50|0.04|0.00|R|F|1993-04-16|1993-05-20|1993-05-02|COLLECT COD|MAIL|s haggle slyly fluff +21120|1872|73|2|9|15964.83|0.07|0.01|A|F|1993-05-30|1993-05-14|1993-06-22|NONE|AIR|slyly regular requests? ironic, thin depe +21120|87|38|3|26|25664.08|0.03|0.03|R|F|1993-04-26|1993-06-06|1993-05-07|DELIVER IN PERSON|TRUCK|riously among the furiously special foxes. +21120|643|75|4|10|15436.40|0.02|0.00|A|F|1993-05-10|1993-04-16|1993-06-04|COLLECT COD|FOB|ess packages detect along the iro +21120|198|77|5|46|50516.74|0.01|0.08|A|F|1993-04-19|1993-05-05|1993-05-10|COLLECT COD|SHIP|le slyly about the +21121|63|14|1|2|1926.12|0.10|0.01|A|F|1994-12-21|1994-12-11|1995-01-16|NONE|SHIP|use furiously af +21121|1805|35|2|3|5120.40|0.00|0.04|A|F|1994-12-23|1994-10-21|1994-12-30|NONE|MAIL|o beans. special, +21122|1568|9|1|23|33799.88|0.00|0.02|N|O|1997-04-14|1997-05-01|1997-05-10|TAKE BACK RETURN|MAIL|gular pinto beans wake about th +21122|1501|22|2|16|22440.00|0.07|0.06|N|O|1997-04-17|1997-05-05|1997-05-16|COLLECT COD|REG AIR|foxes are carefully fluffily ironic pac +21122|1961|50|3|21|39122.16|0.08|0.02|N|O|1997-04-26|1997-04-09|1997-05-22|DELIVER IN PERSON|MAIL|rint. regular deposits cajole accordin +21122|120|21|4|27|27543.24|0.07|0.07|N|O|1997-02-17|1997-05-07|1997-03-11|TAKE BACK RETURN|REG AIR|ng the sometimes regular accounts. b +21122|582|43|5|10|14825.80|0.08|0.06|N|O|1997-04-09|1997-03-25|1997-04-14|DELIVER IN PERSON|RAIL|. requests +21122|125|26|6|26|26653.12|0.03|0.07|N|O|1997-03-28|1997-04-29|1997-04-22|NONE|AIR|ly unusual acco +21123|541|32|1|23|33155.42|0.09|0.00|N|O|1998-11-16|1998-08-27|1998-11-23|TAKE BACK RETURN|TRUCK|bout the furiously regular sauternes. bl +21123|883|17|2|16|28542.08|0.03|0.03|N|O|1998-09-26|1998-09-18|1998-10-23|COLLECT COD|SHIP|ts. requests sleep furiously about the +21123|1795|80|3|32|54297.28|0.05|0.08|N|O|1998-09-23|1998-08-29|1998-10-22|TAKE BACK RETURN|TRUCK|nic patterns above the slyly +21123|1746|73|4|50|82387.00|0.03|0.00|N|O|1998-09-25|1998-09-23|1998-10-07|DELIVER IN PERSON|SHIP|silent accounts sublate. +21123|912|13|5|19|34445.29|0.01|0.01|N|O|1998-10-18|1998-08-22|1998-11-08|COLLECT COD|REG AIR|gular asymptotes mold carefully +21123|1828|72|6|26|44975.32|0.08|0.03|N|O|1998-11-14|1998-09-22|1998-11-29|DELIVER IN PERSON|AIR|uriously regular ins +21123|993|28|7|6|11363.94|0.01|0.06|N|O|1998-10-26|1998-09-01|1998-11-12|NONE|REG AIR|le silently regular deposits. +21124|941|44|1|44|81045.36|0.05|0.03|N|O|1996-09-19|1996-11-17|1996-09-30|NONE|AIR| instructio +21124|726|91|2|16|26027.52|0.06|0.00|N|O|1996-09-20|1996-10-19|1996-10-09|DELIVER IN PERSON|FOB|aggle along +21124|1857|44|3|22|38694.70|0.09|0.02|N|O|1996-10-19|1996-11-12|1996-11-08|NONE|MAIL|s cajole blithely carefully regular +21124|885|85|4|45|80364.60|0.07|0.02|N|O|1996-09-21|1996-10-22|1996-10-09|COLLECT COD|FOB|the sometimes regular pinto +21125|327|56|1|32|39274.24|0.05|0.08|A|F|1995-05-31|1995-04-28|1995-06-12|COLLECT COD|TRUCK|s use slyly slyly ironic accounts. bl +21125|400|29|2|8|10403.20|0.01|0.08|R|F|1995-05-17|1995-04-26|1995-05-28|COLLECT COD|MAIL|ic Tiresias. quickly bold pains +21125|1063|34|3|8|7712.48|0.10|0.03|A|F|1995-03-16|1995-03-31|1995-04-08|DELIVER IN PERSON|AIR|ts affix q +21125|1999|44|4|1|1900.99|0.06|0.07|A|F|1995-05-02|1995-05-28|1995-05-21|COLLECT COD|SHIP| courts haggle blithely fina +21126|663|64|1|48|75055.68|0.10|0.03|R|F|1992-04-04|1992-05-30|1992-04-22|NONE|TRUCK|erns are above the platelet +21126|203|31|2|21|23167.20|0.08|0.03|R|F|1992-05-24|1992-05-21|1992-06-07|COLLECT COD|RAIL|ndencies across the carefully ex +21126|1102|3|3|6|6018.60|0.07|0.08|R|F|1992-05-02|1992-05-01|1992-05-09|COLLECT COD|TRUCK|es detect f +21127|1555|56|1|47|68457.85|0.00|0.06|R|F|1993-12-13|1993-10-29|1994-01-10|COLLECT COD|TRUCK|c ideas de +21127|200|27|2|47|51709.40|0.10|0.00|A|F|1993-10-02|1993-10-27|1993-10-15|DELIVER IN PERSON|REG AIR|late quickly blithely regul +21127|1504|5|3|38|53409.00|0.09|0.08|R|F|1993-10-13|1993-12-21|1993-11-06|DELIVER IN PERSON|RAIL|. special requests among the carefully f +21152|627|90|1|34|51939.08|0.03|0.07|N|O|1998-02-15|1997-12-13|1998-03-13|DELIVER IN PERSON|TRUCK|usual ideas +21152|165|92|2|24|25563.84|0.05|0.07|N|O|1997-12-30|1997-11-25|1998-01-20|DELIVER IN PERSON|AIR|ts; even accounts are careful +21152|1419|59|3|48|63379.68|0.00|0.01|N|O|1998-02-07|1997-11-24|1998-03-01|TAKE BACK RETURN|RAIL|riously blithely express gro +21152|244|72|4|23|26317.52|0.03|0.02|N|O|1997-11-26|1997-11-26|1997-12-14|NONE|TRUCK|hs wake carefully f +21152|335|36|5|48|59295.84|0.09|0.05|N|O|1997-12-16|1998-01-10|1998-01-06|DELIVER IN PERSON|MAIL| pending ins +21152|170|97|6|38|40666.46|0.06|0.05|N|O|1998-01-18|1998-01-01|1998-02-15|NONE|SHIP|ly ironic r +21153|616|79|1|38|57631.18|0.10|0.06|A|F|1994-01-26|1994-03-04|1994-02-21|TAKE BACK RETURN|SHIP|l requests. slyly pending deposits accor +21153|191|44|2|16|17459.04|0.07|0.01|A|F|1994-03-06|1994-03-04|1994-04-05|TAKE BACK RETURN|MAIL|nt notornis alongside +21153|785|82|3|4|6743.12|0.05|0.05|R|F|1994-02-01|1994-02-18|1994-02-15|COLLECT COD|RAIL|ent packages nag +21153|1090|91|4|14|13875.26|0.05|0.02|A|F|1994-02-17|1994-04-09|1994-03-11|TAKE BACK RETURN|FOB|silent, unusual +21153|659|53|5|40|62386.00|0.00|0.08|A|F|1994-05-11|1994-03-21|1994-06-05|NONE|SHIP|nto beans. quic +21153|424|12|6|35|46354.70|0.00|0.06|R|F|1994-03-05|1994-03-07|1994-03-16|COLLECT COD|SHIP| beans. even dependencies are. s +21153|1540|21|7|41|59103.14|0.10|0.02|A|F|1994-04-14|1994-03-30|1994-05-08|NONE|RAIL|requests sleep furious +21154|1036|7|1|6|5622.18|0.02|0.02|R|F|1993-08-26|1993-09-24|1993-09-17|NONE|REG AIR|fily. quickly bold pinto beans ca +21154|655|87|2|10|15556.50|0.10|0.08|R|F|1993-10-01|1993-10-06|1993-10-30|NONE|RAIL| ideas print furiously according to +21154|1328|29|3|5|6146.60|0.03|0.08|A|F|1993-11-04|1993-11-12|1993-11-10|NONE|FOB|haggle. carefully even deposi +21155|1566|7|1|44|64572.64|0.07|0.03|R|F|1995-05-13|1995-03-11|1995-06-06|NONE|REG AIR|e bold, pending deposits. slyly i +21155|1400|39|2|33|42946.20|0.10|0.02|A|F|1995-03-13|1995-04-04|1995-03-31|COLLECT COD|FOB| players haggle slyly among the +21155|940|9|3|1|1840.94|0.06|0.01|R|F|1995-04-07|1995-04-18|1995-04-21|TAKE BACK RETURN|FOB|y express accounts nag bl +21155|1096|2|4|47|46863.23|0.03|0.08|N|F|1995-05-31|1995-04-08|1995-06-27|COLLECT COD|REG AIR| blithely. furiously ironic accounts th +21156|514|75|1|42|59409.42|0.05|0.05|N|O|1997-08-04|1997-06-27|1997-08-23|DELIVER IN PERSON|SHIP|es haggle across the regular dependencies +21156|728|29|2|48|78178.56|0.10|0.06|N|O|1997-05-02|1997-07-10|1997-05-22|NONE|SHIP| packages need to sleep across the +21156|866|100|3|11|19435.46|0.10|0.05|N|O|1997-08-02|1997-05-15|1997-08-31|TAKE BACK RETURN|MAIL|ions. regular +21156|169|70|4|23|24590.68|0.10|0.00|N|O|1997-06-05|1997-06-20|1997-07-03|DELIVER IN PERSON|AIR|thely fluffily special re +21156|700|32|5|39|62427.30|0.06|0.03|N|O|1997-05-05|1997-07-02|1997-05-29|COLLECT COD|TRUCK|ests. carefully +21156|1730|73|6|27|44056.71|0.09|0.02|N|O|1997-06-19|1997-05-24|1997-07-11|TAKE BACK RETURN|REG AIR| braids! furiously i +21156|1064|35|7|6|5790.36|0.08|0.05|N|O|1997-05-20|1997-06-05|1997-06-02|TAKE BACK RETURN|AIR|s. furiously regular dependencies after +21157|1996|29|1|24|45551.76|0.06|0.00|N|O|1996-02-18|1996-04-07|1996-03-13|COLLECT COD|AIR|es are fluffily across the furi +21157|869|69|2|28|49556.08|0.07|0.05|N|O|1996-05-23|1996-05-05|1996-06-14|COLLECT COD|RAIL| quickly. fluffily ironic foxes about the +21157|217|18|3|31|34633.51|0.07|0.08|N|O|1996-02-09|1996-03-24|1996-02-17|TAKE BACK RETURN|RAIL| cajole above the carefully re +21157|1223|24|4|7|7869.54|0.00|0.08|N|O|1996-04-26|1996-04-01|1996-05-01|DELIVER IN PERSON|REG AIR|fully final p +21157|1430|31|5|4|5325.72|0.04|0.07|N|O|1996-04-04|1996-04-21|1996-04-24|NONE|TRUCK|s affix furiously quickly ironic packa +21157|1194|31|6|35|38331.65|0.03|0.02|N|O|1996-05-09|1996-04-22|1996-05-18|NONE|AIR|ending, bold theodolites a +21158|1971|60|1|18|33713.46|0.06|0.05|N|O|1997-01-02|1996-12-27|1997-01-03|NONE|RAIL|ns. bold packages believe. iron +21159|581|72|1|24|35557.92|0.06|0.06|N|O|1995-08-15|1995-08-09|1995-09-11|COLLECT COD|RAIL|ickly express accoun +21159|159|86|2|43|45543.45|0.09|0.05|N|O|1995-09-10|1995-08-11|1995-09-19|TAKE BACK RETURN|TRUCK|s use blithely +21159|1913|58|3|40|72596.40|0.00|0.03|N|O|1995-08-03|1995-08-09|1995-08-27|DELIVER IN PERSON|MAIL|ular, express accounts doubt +21159|26|77|4|50|46301.00|0.02|0.05|N|O|1995-07-04|1995-08-27|1995-07-28|TAKE BACK RETURN|REG AIR|requests. furiously reg +21184|1622|5|1|26|39614.12|0.05|0.00|N|O|1998-10-27|1998-09-17|1998-11-23|COLLECT COD|MAIL|ithin the blithely pending reques +21184|1032|38|2|11|10263.33|0.01|0.02|N|O|1998-08-09|1998-09-18|1998-09-02|TAKE BACK RETURN|SHIP|e slyly final exc +21184|1179|52|3|18|19443.06|0.03|0.04|N|O|1998-08-26|1998-10-08|1998-09-18|NONE|MAIL|asymptotes affix quickly in place of +21184|1023|29|4|6|5544.12|0.05|0.00|N|O|1998-11-09|1998-10-04|1998-11-23|COLLECT COD|MAIL|fully unusual packages sleep furiously +21185|1449|28|1|39|52667.16|0.03|0.01|N|O|1997-04-03|1997-04-09|1997-04-09|NONE|MAIL|are after the slyly ironic de +21185|723|56|2|13|21108.36|0.01|0.04|N|O|1997-02-08|1997-03-27|1997-03-07|TAKE BACK RETURN|TRUCK|ly furious packages detect furiously sly +21186|1065|1|1|10|9660.60|0.05|0.01|A|F|1992-06-24|1992-08-09|1992-07-18|DELIVER IN PERSON|SHIP|unts. carefully even +21186|698|30|2|17|27177.73|0.07|0.03|A|F|1992-07-20|1992-06-27|1992-07-24|DELIVER IN PERSON|AIR|ongside of the fluf +21186|674|37|3|46|72434.82|0.03|0.02|A|F|1992-08-05|1992-07-10|1992-08-07|TAKE BACK RETURN|AIR|uriously final theodolites eat carefull +21187|618|19|1|13|19741.93|0.09|0.00|N|O|1997-01-19|1996-11-23|1997-02-18|TAKE BACK RETURN|REG AIR|uffily express depos +21187|164|91|2|50|53208.00|0.08|0.07|N|O|1997-01-04|1996-12-05|1997-02-01|DELIVER IN PERSON|TRUCK|arefully around t +21187|653|85|3|29|45055.85|0.03|0.04|N|O|1997-01-22|1996-12-03|1997-01-23|COLLECT COD|AIR|ng accounts use slyly regular depos +21187|51|52|4|3|2853.15|0.06|0.00|N|O|1997-01-18|1996-10-26|1997-02-17|DELIVER IN PERSON|RAIL|nic attainment +21187|928|63|5|12|21947.04|0.07|0.07|N|O|1996-12-11|1996-12-18|1997-01-04|TAKE BACK RETURN|TRUCK| carefully final wa +21187|1941|74|6|16|29487.04|0.10|0.05|N|O|1996-12-04|1996-11-06|1996-12-30|COLLECT COD|AIR|ounts. ideas hagg +21188|375|4|1|3|3826.11|0.05|0.08|N|O|1996-01-03|1995-12-14|1996-01-21|COLLECT COD|AIR|oss the careful +21188|1328|29|2|7|8605.24|0.06|0.03|N|O|1995-10-08|1995-11-01|1995-10-12|TAKE BACK RETURN|AIR| quickly daring e +21188|87|88|3|45|44418.60|0.10|0.06|N|O|1996-01-12|1995-11-20|1996-01-24|NONE|FOB|lly final r +21188|1716|17|4|9|14559.39|0.05|0.05|N|O|1995-10-29|1995-11-18|1995-11-10|NONE|AIR|ets could have +21188|1442|60|5|19|25525.36|0.03|0.06|N|O|1996-01-18|1995-11-26|1996-01-23|TAKE BACK RETURN|MAIL|posits use. fur +21189|1259|34|1|19|22044.75|0.03|0.03|N|O|1996-06-14|1996-03-27|1996-06-16|TAKE BACK RETURN|FOB| blithely among the quickly iro +21189|586|17|2|37|55003.46|0.01|0.07|N|O|1996-02-25|1996-05-02|1996-03-11|NONE|TRUCK|nic asymptotes sleep carefully. fi +21189|661|93|3|34|53096.44|0.00|0.03|N|O|1996-05-08|1996-04-03|1996-06-07|TAKE BACK RETURN|SHIP|ly. bold requests haggle accou +21189|1757|100|4|21|34833.75|0.10|0.01|N|O|1996-05-08|1996-03-29|1996-05-13|TAKE BACK RETURN|RAIL|final ideas s +21189|809|9|5|29|49584.20|0.10|0.02|N|O|1996-02-17|1996-04-21|1996-02-25|COLLECT COD|RAIL|, even packages. ca +21190|388|17|1|32|41228.16|0.10|0.03|R|F|1994-07-02|1994-08-21|1994-07-14|DELIVER IN PERSON|TRUCK|ingly quickly +21190|361|18|2|26|32795.36|0.01|0.04|A|F|1994-08-18|1994-08-13|1994-09-06|TAKE BACK RETURN|SHIP|long the bold, pending pinto beans. fluf +21190|341|98|3|24|29792.16|0.09|0.08|A|F|1994-07-18|1994-07-08|1994-08-16|COLLECT COD|TRUCK| are along the regular, final theodolites +21190|734|35|4|11|17982.03|0.07|0.00|R|F|1994-06-16|1994-07-30|1994-06-23|NONE|FOB|. accounts +21190|1119|92|5|21|21422.31|0.06|0.00|R|F|1994-08-04|1994-08-01|1994-08-30|DELIVER IN PERSON|RAIL|thin packages wake. blithely even +21191|822|89|1|38|65467.16|0.04|0.03|A|F|1992-12-08|1993-01-24|1992-12-11|NONE|REG AIR|gs around t +21191|351|36|2|13|16267.55|0.03|0.02|R|F|1993-03-09|1992-12-25|1993-03-25|TAKE BACK RETURN|REG AIR|rmanently above the slyly expres +21191|1901|46|3|38|68510.20|0.10|0.04|A|F|1992-12-17|1992-12-29|1992-12-20|COLLECT COD|AIR| asymptotes. requests nag slyly carefu +21191|530|61|4|20|28610.60|0.06|0.03|A|F|1993-03-10|1992-12-26|1993-03-30|NONE|RAIL|packages. slyly ruthle +21216|1796|81|1|35|59422.65|0.04|0.05|N|O|1998-09-02|1998-09-23|1998-09-10|COLLECT COD|AIR|luffily according to +21217|571|62|1|8|11772.56|0.09|0.00|R|F|1994-12-22|1994-10-17|1995-01-04|NONE|AIR|finally spec +21218|452|82|1|21|28401.45|0.04|0.03|N|O|1997-06-21|1997-08-25|1997-07-21|NONE|TRUCK|he careful, express +21219|316|1|1|37|45003.47|0.07|0.03|R|F|1995-05-01|1995-04-06|1995-05-25|TAKE BACK RETURN|REG AIR|usly even requests sleep carefully +21219|485|15|2|38|52648.24|0.06|0.03|R|F|1995-03-10|1995-03-21|1995-03-17|COLLECT COD|RAIL|imes blithely +21219|645|39|3|47|72645.08|0.04|0.01|R|F|1995-03-25|1995-04-06|1995-04-14|TAKE BACK RETURN|SHIP|efully final dependencies p +21219|160|39|4|6|6360.96|0.04|0.04|A|F|1995-04-13|1995-02-18|1995-04-16|COLLECT COD|MAIL| pending accounts +21219|1793|36|5|6|10168.74|0.03|0.04|A|F|1995-03-28|1995-03-22|1995-04-22|NONE|AIR| furiously silent accounts. carefull +21219|448|78|6|10|13484.40|0.02|0.02|R|F|1995-04-23|1995-02-22|1995-04-28|DELIVER IN PERSON|SHIP| final packages wake slyl +21220|1514|35|1|28|39634.28|0.02|0.05|R|F|1993-02-22|1993-02-16|1993-03-14|NONE|TRUCK|onic attainments haggle q +21220|1480|98|2|42|58022.16|0.05|0.08|R|F|1993-01-20|1993-03-17|1993-02-06|DELIVER IN PERSON|RAIL| bold accounts integrate quickly agai +21220|1977|22|3|27|50732.19|0.10|0.06|R|F|1993-03-13|1993-03-17|1993-03-19|NONE|AIR| the carefully express a +21220|476|35|4|9|12388.23|0.04|0.02|A|F|1993-01-19|1993-03-14|1993-01-31|DELIVER IN PERSON|MAIL|de of the blithely regular packages. +21220|585|16|5|38|56452.04|0.02|0.02|R|F|1993-01-17|1993-01-23|1993-02-16|COLLECT COD|SHIP|lithely around the furiously bold foxes +21220|1923|24|6|30|54747.60|0.08|0.06|R|F|1993-01-12|1993-03-06|1993-01-23|COLLECT COD|FOB|uts. fluffily reg +21220|263|18|7|44|51183.44|0.07|0.03|A|F|1993-01-26|1993-03-05|1993-01-29|DELIVER IN PERSON|AIR|y slyly express excuses. ironic instr +21221|1982|83|1|26|48983.48|0.00|0.06|R|F|1994-08-01|1994-09-27|1994-08-10|COLLECT COD|MAIL|special acc +21222|273|1|1|2|2346.54|0.08|0.03|R|F|1994-03-31|1994-03-25|1994-04-09|DELIVER IN PERSON|MAIL|ven sauternes. pat +21222|815|16|2|6|10294.86|0.02|0.07|R|F|1994-05-24|1994-04-02|1994-06-05|TAKE BACK RETURN|MAIL|, even accounts ar +21222|570|31|3|43|63234.51|0.09|0.02|A|F|1994-04-26|1994-03-16|1994-05-15|NONE|REG AIR|. fluffily express +21222|288|16|4|34|40401.52|0.05|0.06|A|F|1994-04-01|1994-03-19|1994-04-05|DELIVER IN PERSON|TRUCK|pinto beans haggle c +21222|1955|44|5|44|81705.80|0.00|0.05|R|F|1994-05-29|1994-03-10|1994-06-04|NONE|REG AIR|lar accounts nag unusual asymptotes. +21222|831|65|6|33|57150.39|0.08|0.07|R|F|1994-02-23|1994-03-22|1994-02-24|COLLECT COD|AIR|ternes. furiously final requests wak +21223|512|73|1|3|4237.53|0.01|0.01|R|F|1992-03-26|1992-04-18|1992-04-17|COLLECT COD|TRUCK|equests. dolphins sleep daringl +21223|361|62|2|37|46670.32|0.00|0.07|A|F|1992-04-27|1992-05-05|1992-05-16|DELIVER IN PERSON|TRUCK|y express deposits. slyly special +21223|808|75|3|45|76896.00|0.04|0.04|A|F|1992-03-25|1992-05-23|1992-04-03|COLLECT COD|AIR|enly bold dolphins cajole blithely sile +21223|1847|34|4|10|17488.40|0.00|0.07|R|F|1992-04-10|1992-05-30|1992-04-20|TAKE BACK RETURN|SHIP|otes across the carefully brave i +21223|350|79|5|15|18755.25|0.10|0.08|A|F|1992-05-13|1992-05-17|1992-06-05|NONE|RAIL|blithely even +21223|1866|96|6|29|51267.94|0.07|0.01|A|F|1992-06-12|1992-06-11|1992-07-10|COLLECT COD|TRUCK|haggle slyly ironic +21223|1079|80|7|17|16661.19|0.09|0.06|A|F|1992-04-28|1992-05-04|1992-05-04|TAKE BACK RETURN|FOB|ites. carefully final packag +21248|979|82|1|34|63918.98|0.01|0.07|N|O|1996-10-20|1996-10-25|1996-11-17|NONE|FOB|s cajole slyly; s +21248|945|14|2|34|62761.96|0.06|0.05|N|O|1996-10-11|1996-09-28|1996-10-21|DELIVER IN PERSON|RAIL|l packages sleep bli +21248|320|21|3|46|56134.72|0.10|0.01|N|O|1996-08-16|1996-11-01|1996-09-12|DELIVER IN PERSON|REG AIR|ithely after the slyly un +21248|405|35|4|30|39162.00|0.01|0.05|N|O|1996-11-26|1996-10-17|1996-11-29|NONE|RAIL|refully final foxes doubt careful +21248|1210|85|5|3|3333.63|0.06|0.06|N|O|1996-12-01|1996-10-30|1996-12-26|DELIVER IN PERSON|FOB|l, special deposits run furiousl +21248|157|58|6|26|27485.90|0.03|0.04|N|O|1996-09-21|1996-11-07|1996-10-19|NONE|RAIL|sly pending foxes integrate blithely. ironi +21249|219|1|1|34|38053.14|0.06|0.07|A|F|1993-10-05|1993-12-05|1993-10-09|NONE|FOB|y final, ironic warth +21249|1273|85|2|24|28182.48|0.10|0.03|A|F|1993-10-07|1993-11-15|1993-10-15|NONE|REG AIR|furiously ironic epita +21249|553|84|3|38|55234.90|0.10|0.02|A|F|1994-01-08|1993-10-24|1994-01-12|COLLECT COD|AIR|to beans doze blithely slyly pending instru +21249|501|62|4|32|44848.00|0.07|0.05|R|F|1993-10-07|1993-12-15|1993-10-29|COLLECT COD|TRUCK|egular instructions hi +21249|58|34|5|6|5748.30|0.04|0.00|A|F|1993-11-02|1993-12-06|1993-11-23|TAKE BACK RETURN|FOB|ets. quickly pending requests believe +21249|1711|12|6|1|1612.71|0.01|0.07|R|F|1994-01-19|1993-10-28|1994-02-02|COLLECT COD|RAIL|requests; sometimes s +21250|1920|9|1|15|27328.80|0.10|0.02|N|O|1997-07-17|1997-09-22|1997-08-13|COLLECT COD|FOB|ndencies kindle careful +21250|1345|22|2|45|56085.30|0.01|0.04|N|O|1997-08-15|1997-10-04|1997-08-17|COLLECT COD|MAIL|ss furiously accord +21250|71|72|3|7|6797.49|0.02|0.06|N|O|1997-10-11|1997-08-14|1997-11-08|TAKE BACK RETURN|RAIL| even dependencies +21251|1680|81|1|42|66430.56|0.00|0.05|N|O|1996-12-03|1997-01-14|1996-12-04|COLLECT COD|TRUCK|ost blithely theodolites. furiously ironic +21251|389|18|2|41|52864.58|0.00|0.02|N|O|1996-12-30|1997-02-19|1997-01-22|NONE|AIR|atelets. furiously fina +21251|1322|23|3|9|11009.88|0.01|0.00|N|O|1997-02-14|1997-01-09|1997-03-14|TAKE BACK RETURN|TRUCK|ular instructio +21252|676|8|1|10|15766.70|0.00|0.01|N|O|1996-06-24|1996-07-10|1996-07-09|COLLECT COD|AIR|inally regular ideas wak +21252|1264|39|2|30|34957.80|0.01|0.00|N|O|1996-06-05|1996-08-25|1996-06-24|COLLECT COD|SHIP|riously special instructio +21252|1942|43|3|29|53474.26|0.05|0.06|N|O|1996-07-30|1996-07-25|1996-08-23|NONE|REG AIR|ily unusual pinto beans sl +21252|1692|34|4|50|79684.50|0.05|0.04|N|O|1996-08-15|1996-07-13|1996-09-10|NONE|AIR|areful packages. furiously final asymptotes +21252|1338|53|5|32|39658.56|0.02|0.05|N|O|1996-07-12|1996-08-10|1996-07-18|DELIVER IN PERSON|MAIL|ing braids; packages haggl +21252|1722|65|6|34|55206.48|0.02|0.04|N|O|1996-07-29|1996-07-19|1996-08-26|DELIVER IN PERSON|TRUCK|requests among the +21253|430|89|1|50|66521.50|0.00|0.01|A|F|1992-05-20|1992-06-18|1992-06-08|TAKE BACK RETURN|AIR|efully across the quickly regular asympt +21253|902|71|2|34|61298.60|0.09|0.01|R|F|1992-08-01|1992-05-19|1992-08-07|NONE|RAIL|ss packages cajol +21253|1273|48|3|37|43447.99|0.07|0.08|R|F|1992-04-26|1992-06-07|1992-05-20|NONE|SHIP|ses. even, pending instructio +21254|1399|14|1|13|16905.07|0.01|0.07|A|F|1993-11-16|1993-09-20|1993-12-04|NONE|RAIL|ts. slyly ironic pac +21254|771|68|2|31|51824.87|0.00|0.04|A|F|1993-10-16|1993-11-10|1993-11-13|NONE|AIR|efully blithely express accoun +21255|383|84|1|30|38501.40|0.06|0.03|R|F|1994-09-19|1994-11-11|1994-10-07|COLLECT COD|SHIP|ly above the quickly even deposits. carefu +21255|1379|80|2|20|25607.40|0.00|0.05|A|F|1994-12-19|1994-10-04|1995-01-01|NONE|RAIL|warthogs. silent the +21255|1060|31|3|27|25948.62|0.01|0.06|A|F|1994-11-11|1994-11-04|1994-12-03|COLLECT COD|RAIL|s the packag +21255|1691|33|4|31|49373.39|0.05|0.04|A|F|1994-11-14|1994-09-29|1994-11-27|NONE|FOB|losely regular pa +21255|1004|10|5|29|26245.00|0.00|0.07|R|F|1994-09-10|1994-11-19|1994-09-21|NONE|AIR|the regular excuses. fur +21255|1671|13|6|47|73915.49|0.08|0.01|R|F|1994-10-14|1994-10-02|1994-10-29|TAKE BACK RETURN|SHIP|ar, regular dependencies u +21280|730|31|1|29|47291.17|0.07|0.01|N|O|1997-12-16|1998-01-08|1998-01-10|DELIVER IN PERSON|SHIP|ep alongside of t +21280|1677|78|2|17|26837.39|0.05|0.06|N|O|1998-03-06|1998-02-20|1998-03-26|TAKE BACK RETURN|RAIL|ajole bold, ironic packa +21280|121|100|3|36|36760.32|0.04|0.05|N|O|1998-01-25|1998-01-31|1998-02-19|DELIVER IN PERSON|AIR|icing requests about the blithely r +21280|1909|10|4|5|9054.50|0.05|0.08|N|O|1997-12-21|1998-02-22|1998-01-19|COLLECT COD|TRUCK|nal packages. theo +21280|1980|81|5|18|33875.64|0.03|0.07|N|O|1998-01-13|1998-01-25|1998-02-07|NONE|SHIP|- fluffily final fox +21280|1061|62|6|40|38482.40|0.03|0.03|N|O|1997-12-18|1998-01-31|1997-12-31|TAKE BACK RETURN|SHIP|tegrate regular +21280|1586|7|7|49|72891.42|0.03|0.03|N|O|1998-03-17|1998-02-18|1998-03-18|COLLECT COD|MAIL| ironic, busy accounts. s +21281|1037|43|1|10|9380.30|0.01|0.02|N|F|1995-06-01|1995-05-31|1995-07-01|TAKE BACK RETURN|FOB|ironic platelets +21281|1631|14|2|45|68968.35|0.01|0.07|N|F|1995-06-11|1995-06-16|1995-06-20|NONE|TRUCK|eas boost. +21281|1840|70|3|11|19160.24|0.10|0.01|A|F|1995-04-30|1995-06-21|1995-05-02|NONE|SHIP|arefully regular excuses hagg +21281|470|29|4|15|20557.05|0.09|0.01|A|F|1995-06-03|1995-05-21|1995-06-14|DELIVER IN PERSON|RAIL|in even theodolites. slyly +21282|1291|92|1|50|59614.50|0.07|0.01|N|O|1998-07-27|1998-06-18|1998-07-28|DELIVER IN PERSON|FOB|slyly final gifts. accounts +21282|1995|28|2|8|15175.92|0.02|0.01|N|O|1998-06-04|1998-06-08|1998-06-20|NONE|SHIP| ironic packages according to the +21282|1905|94|3|41|74082.90|0.10|0.07|N|O|1998-08-09|1998-06-05|1998-08-22|DELIVER IN PERSON|REG AIR|nusual packages wake fluffily even +21282|502|33|4|12|16830.00|0.03|0.03|N|O|1998-05-18|1998-06-27|1998-05-21|TAKE BACK RETURN|AIR|ecoys: asymptotes nag blithely along the q +21282|119|98|5|43|43821.73|0.02|0.03|N|O|1998-06-26|1998-06-18|1998-06-30|DELIVER IN PERSON|AIR|ckages was. furiously brave pearls +21283|326|83|1|43|52731.76|0.04|0.05|N|O|1997-03-04|1997-03-28|1997-04-03|NONE|SHIP|r pinto beans could have to ca +21283|1505|26|2|33|46414.50|0.05|0.08|N|O|1997-04-17|1997-03-18|1997-04-24|DELIVER IN PERSON|RAIL|fter the slyly bold dependencies haggle sly +21283|1080|81|3|8|7848.64|0.05|0.08|N|O|1997-01-15|1997-02-06|1997-02-12|COLLECT COD|REG AIR|riously ent +21283|1560|1|4|25|36539.00|0.00|0.08|N|O|1997-03-13|1997-02-24|1997-03-30|TAKE BACK RETURN|REG AIR|ithely. quickly ironic theodo +21283|713|14|5|9|14523.39|0.01|0.02|N|O|1997-04-14|1997-03-28|1997-05-14|COLLECT COD|FOB|cuses at the slyly final requests i +21283|484|85|6|31|42918.88|0.07|0.01|N|O|1997-01-11|1997-03-01|1997-01-25|COLLECT COD|AIR| after the escapa +21283|1492|71|7|47|65494.03|0.00|0.03|N|O|1997-02-03|1997-03-30|1997-02-07|TAKE BACK RETURN|MAIL| the idle, +21284|143|96|1|26|27121.64|0.00|0.02|A|F|1992-10-25|1992-12-09|1992-11-07|DELIVER IN PERSON|MAIL|o beans. quickly regular +21284|571|72|2|37|54448.09|0.03|0.02|A|F|1992-10-17|1992-11-09|1992-11-16|TAKE BACK RETURN|FOB|resias are +21285|1130|39|1|5|5155.65|0.09|0.05|A|F|1993-10-10|1993-09-17|1993-10-17|TAKE BACK RETURN|AIR| requests must wa +21285|455|14|2|30|40663.50|0.07|0.05|A|F|1993-07-29|1993-10-01|1993-08-18|COLLECT COD|MAIL|en theodolites +21285|1770|13|3|30|50153.10|0.08|0.06|R|F|1993-11-01|1993-09-09|1993-11-02|COLLECT COD|TRUCK|usly after the fluffily regular platelets. +21285|1149|22|4|25|26253.50|0.10|0.07|R|F|1993-09-01|1993-09-06|1993-09-05|COLLECT COD|AIR|uctions sleep blithely on the c +21285|1578|59|5|9|13316.13|0.10|0.02|A|F|1993-07-25|1993-08-22|1993-07-30|NONE|TRUCK|y silent realms. carefully regular in +21286|19|95|1|26|23894.26|0.01|0.04|A|F|1994-08-30|1994-08-13|1994-09-16|TAKE BACK RETURN|SHIP|al foxes sleep carefully. multip +21286|1767|10|2|30|50062.80|0.10|0.03|A|F|1994-08-06|1994-08-10|1994-09-04|COLLECT COD|SHIP|ong the furiously final +21286|108|87|3|45|45364.50|0.03|0.08|A|F|1994-06-05|1994-07-15|1994-06-11|COLLECT COD|AIR|y beneath the sly +21286|1908|41|4|31|56106.90|0.04|0.04|R|F|1994-09-04|1994-07-02|1994-10-02|TAKE BACK RETURN|TRUCK|after the final ins +21287|1727|54|1|16|26059.52|0.07|0.07|N|O|1997-01-31|1997-04-14|1997-02-07|DELIVER IN PERSON|RAIL|to beans are ruthlessly: regular accounts +21287|145|46|2|5|5225.70|0.00|0.00|N|O|1997-03-12|1997-04-11|1997-03-27|COLLECT COD|RAIL|ts for the furiously ironic deposit +21287|1267|79|3|20|23365.20|0.07|0.08|N|O|1997-02-09|1997-04-18|1997-02-22|TAKE BACK RETURN|AIR|iously quickly re +21287|1539|80|4|47|67704.91|0.03|0.06|N|O|1997-02-28|1997-04-19|1997-03-25|TAKE BACK RETURN|SHIP|ly unusual asymptotes against the bli +21287|1230|31|5|42|47511.66|0.00|0.00|N|O|1997-05-14|1997-04-12|1997-06-05|NONE|TRUCK|the quickly brave i +21287|1879|66|6|17|30274.79|0.00|0.05|N|O|1997-02-25|1997-03-11|1997-02-27|COLLECT COD|REG AIR|ironic foxes are against the quickly pen +21287|99|50|7|40|39963.60|0.05|0.05|N|O|1997-02-14|1997-03-28|1997-03-04|DELIVER IN PERSON|SHIP|its nag blithely express, ironic asymptot +21312|275|3|1|42|49361.34|0.00|0.07|N|O|1996-05-11|1996-03-12|1996-06-07|COLLECT COD|REG AIR| lose about t +21312|1720|63|2|3|4865.16|0.02|0.00|N|O|1996-04-18|1996-03-09|1996-05-11|TAKE BACK RETURN|AIR| along the regular attainments. bold, +21313|1170|71|1|32|34277.44|0.01|0.04|A|F|1992-11-10|1992-09-14|1992-12-08|DELIVER IN PERSON|SHIP|y. furiously ironic the +21313|1769|54|2|20|33415.20|0.00|0.06|R|F|1992-10-13|1992-09-05|1992-10-19|TAKE BACK RETURN|SHIP|ickly express deposits abo +21314|1256|31|1|7|8100.75|0.01|0.08|A|F|1994-11-07|1995-01-27|1994-11-21|TAKE BACK RETURN|REG AIR|ng the regular, ironic requests. +21314|1412|91|2|32|42029.12|0.06|0.08|R|F|1995-01-14|1994-12-12|1995-01-23|DELIVER IN PERSON|AIR|nding deposits wake quic +21314|272|27|3|24|28134.48|0.07|0.00|R|F|1995-01-10|1994-12-26|1995-02-07|NONE|SHIP|ke blithely quickly pe +21314|975|76|4|17|31891.49|0.05|0.04|R|F|1994-12-26|1994-12-03|1995-01-04|TAKE BACK RETURN|REG AIR|sits. theodolites snooze alongside of +21314|721|86|5|16|25947.52|0.00|0.05|A|F|1995-01-19|1995-01-28|1995-02-03|COLLECT COD|MAIL|slyly. carefully final packages was +21314|1211|49|6|45|50049.45|0.09|0.08|R|F|1994-12-05|1995-01-08|1994-12-15|COLLECT COD|AIR|poach alongside of +21314|1104|77|7|24|24122.40|0.01|0.06|R|F|1994-11-30|1995-01-20|1994-12-23|COLLECT COD|SHIP|he ironic request +21315|314|15|1|18|21857.58|0.00|0.02|N|O|1997-01-05|1996-12-05|1997-01-15|NONE|MAIL|tions are quic +21315|1076|12|2|37|36151.59|0.09|0.06|N|O|1996-11-20|1996-11-14|1996-12-05|DELIVER IN PERSON|RAIL|lphins. silent deposits lose carefully +21315|674|75|3|19|29918.73|0.10|0.07|N|O|1996-10-17|1996-11-28|1996-10-28|COLLECT COD|RAIL|r the blithely final accounts detect +21315|1416|34|4|28|36887.48|0.09|0.01|N|O|1996-12-23|1996-12-19|1996-12-27|NONE|TRUCK|nding requests sleep +21316|1821|8|1|39|67189.98|0.08|0.01|N|O|1998-02-05|1998-01-08|1998-02-11|TAKE BACK RETURN|FOB|st the special, final deposits. qu +21316|954|89|2|42|77907.90|0.09|0.07|N|O|1998-01-05|1997-12-22|1998-01-07|DELIVER IN PERSON|RAIL|ions dazzle. carefully final theodolites pr +21316|1062|68|3|7|6741.42|0.04|0.08|N|O|1997-12-04|1997-12-07|1997-12-11|TAKE BACK RETURN|FOB|posits. frays are always alongside of +21316|116|17|4|50|50805.50|0.00|0.03|N|O|1997-12-05|1998-01-19|1997-12-07|TAKE BACK RETURN|FOB|ial deposits. blithel +21317|1766|93|1|39|65042.64|0.05|0.03|N|F|1995-06-11|1995-05-16|1995-07-02|COLLECT COD|MAIL|o the even theodolit +21317|1322|99|2|38|46486.16|0.04|0.07|N|O|1995-08-07|1995-06-12|1995-08-23|TAKE BACK RETURN|FOB|sleep idly. c +21317|896|30|3|26|46719.14|0.03|0.08|N|O|1995-06-19|1995-05-25|1995-07-06|DELIVER IN PERSON|FOB|ly ironic accounts acc +21317|1548|49|4|26|37688.04|0.04|0.02|N|O|1995-07-07|1995-05-25|1995-07-20|NONE|SHIP|slyly pending theodolites affix alongsi +21317|678|10|5|45|71040.15|0.05|0.07|R|F|1995-05-10|1995-06-24|1995-05-11|DELIVER IN PERSON|TRUCK|tructions. carefully regular decoy +21318|102|55|1|33|33069.30|0.07|0.02|A|F|1993-10-03|1993-09-14|1993-10-26|DELIVER IN PERSON|TRUCK|its after the slyly ironic +21318|134|35|2|28|28955.64|0.07|0.05|A|F|1993-08-26|1993-08-23|1993-09-08|DELIVER IN PERSON|FOB|onic depos +21318|1460|100|3|12|16337.52|0.07|0.01|A|F|1993-09-19|1993-09-03|1993-10-03|TAKE BACK RETURN|AIR|y about the regular accounts. furio +21318|305|90|4|25|30132.50|0.04|0.06|A|F|1993-10-21|1993-08-07|1993-10-22|COLLECT COD|RAIL|ly ironic deposits haggle b +21318|219|74|5|46|51483.66|0.10|0.03|R|F|1993-08-11|1993-10-01|1993-09-02|TAKE BACK RETURN|FOB|arly final deposits at the re +21318|1804|34|6|46|78466.80|0.05|0.06|A|F|1993-08-10|1993-09-19|1993-08-22|DELIVER IN PERSON|SHIP|l instructi +21319|1060|61|1|32|30753.92|0.04|0.00|R|F|1993-05-21|1993-06-02|1993-06-11|NONE|MAIL|thlessly. slyly regular instructio +21319|1800|1|2|4|6807.20|0.00|0.08|R|F|1993-08-12|1993-07-15|1993-09-05|DELIVER IN PERSON|SHIP|ges run blit +21319|507|68|3|35|49262.50|0.03|0.01|R|F|1993-07-04|1993-07-14|1993-07-20|DELIVER IN PERSON|FOB|s wake car +21319|562|93|4|44|64352.64|0.06|0.00|R|F|1993-05-02|1993-06-11|1993-05-19|DELIVER IN PERSON|MAIL|eodolites cajole even instru +21319|715|12|5|19|30698.49|0.10|0.06|R|F|1993-06-06|1993-06-29|1993-06-15|DELIVER IN PERSON|SHIP|furiously ab +21344|114|93|1|15|15211.65|0.00|0.03|A|F|1993-03-10|1993-02-09|1993-04-02|COLLECT COD|TRUCK| quickly alongside of the regula +21344|772|69|2|6|10036.62|0.09|0.02|A|F|1993-01-22|1993-01-12|1993-02-15|NONE|SHIP|odolites. slyly regular packages across the +21344|1810|54|3|22|37659.82|0.09|0.05|R|F|1993-02-25|1993-01-12|1993-02-27|DELIVER IN PERSON|SHIP| cajole even instructions. sly +21344|1773|58|4|41|68665.57|0.03|0.00|R|F|1993-03-07|1993-01-12|1993-03-25|NONE|REG AIR|ly final packages boost slyly. slyl +21345|68|19|1|37|35818.22|0.07|0.04|A|F|1993-05-30|1993-07-04|1993-06-09|NONE|REG AIR|the regular theo +21345|1446|25|2|3|4042.32|0.04|0.07|A|F|1993-07-04|1993-06-16|1993-07-22|COLLECT COD|SHIP| slyly pending theodolites haggle ironi +21345|719|20|3|11|17816.81|0.08|0.04|R|F|1993-06-11|1993-07-24|1993-07-07|TAKE BACK RETURN|AIR|l grouches wake care +21345|938|73|4|35|64362.55|0.03|0.05|A|F|1993-05-29|1993-06-25|1993-06-06|COLLECT COD|MAIL|g quickly unusual deposits. sly +21346|272|27|1|4|4689.08|0.09|0.07|N|O|1995-08-25|1995-07-30|1995-08-28|DELIVER IN PERSON|TRUCK|ages affix slyly along the slyly +21346|172|73|2|11|11793.87|0.04|0.06|N|O|1995-07-15|1995-08-15|1995-08-04|DELIVER IN PERSON|REG AIR|ar, regular deposits are blithely +21346|329|58|3|1|1229.32|0.02|0.00|N|O|1995-07-14|1995-07-18|1995-07-29|DELIVER IN PERSON|RAIL|ular instructions detec +21346|918|87|4|22|40016.02|0.07|0.02|N|O|1995-06-25|1995-07-30|1995-07-09|COLLECT COD|MAIL|cial deposits. ironic, final theodolite +21346|179|32|5|45|48562.65|0.10|0.05|N|O|1995-08-02|1995-07-25|1995-08-10|DELIVER IN PERSON|TRUCK|cing foxes are quic +21346|1337|52|6|50|61916.50|0.05|0.06|N|O|1995-08-08|1995-08-08|1995-08-19|NONE|TRUCK|osits hagg +21346|1276|51|7|19|22368.13|0.08|0.00|N|O|1995-10-02|1995-08-18|1995-10-11|TAKE BACK RETURN|MAIL|s wake carefully. quickly +21347|1835|36|1|3|5210.49|0.07|0.01|N|O|1998-09-15|1998-08-13|1998-10-08|DELIVER IN PERSON|TRUCK|r attainments haggle blit +21347|1506|47|2|22|30965.00|0.06|0.04|N|O|1998-06-07|1998-08-02|1998-06-09|TAKE BACK RETURN|FOB| accounts hang blithely ar +21347|665|28|3|33|51666.78|0.10|0.02|N|O|1998-06-06|1998-08-09|1998-06-12|TAKE BACK RETURN|REG AIR|special accoun +21347|897|98|4|32|57532.48|0.07|0.07|N|O|1998-06-08|1998-07-22|1998-06-26|DELIVER IN PERSON|REG AIR|s around the final platelets +21347|513|74|5|42|59367.42|0.01|0.06|N|O|1998-07-27|1998-08-14|1998-08-08|DELIVER IN PERSON|MAIL|equests. unusual, speci +21347|1176|13|6|26|28006.42|0.00|0.01|N|O|1998-07-05|1998-07-10|1998-07-07|NONE|FOB|c requests +21348|1355|56|1|19|23870.65|0.06|0.02|R|F|1995-05-19|1995-04-21|1995-06-02|TAKE BACK RETURN|RAIL|except the +21349|907|76|1|9|16271.10|0.02|0.07|N|O|1998-11-11|1998-09-26|1998-11-19|DELIVER IN PERSON|MAIL|ly silent pa +21349|1960|93|2|40|74478.40|0.03|0.07|N|O|1998-10-17|1998-09-03|1998-10-25|DELIVER IN PERSON|FOB|iously even grouches among the blithely +21349|569|70|3|11|16165.16|0.06|0.02|N|O|1998-09-13|1998-09-13|1998-09-28|TAKE BACK RETURN|REG AIR|uickly special +21349|1979|12|4|24|45143.28|0.00|0.06|N|O|1998-10-04|1998-08-30|1998-10-13|COLLECT COD|REG AIR|ronic accounts use +21349|1138|39|5|37|38447.81|0.07|0.06|N|O|1998-08-16|1998-09-13|1998-09-03|TAKE BACK RETURN|TRUCK|ular pinto bea +21350|1509|10|1|21|29620.50|0.08|0.00|R|F|1995-03-31|1995-04-06|1995-04-17|TAKE BACK RETURN|REG AIR|uches cajole e +21351|1124|33|1|4|4100.48|0.07|0.03|N|O|1998-04-09|1998-05-23|1998-04-27|TAKE BACK RETURN|REG AIR|d hockey players nag instructions. +21351|305|90|2|4|4821.20|0.01|0.06|N|O|1998-04-03|1998-06-04|1998-04-17|COLLECT COD|REG AIR|ing theodolites are bli +21351|1979|80|3|12|22571.64|0.10|0.00|N|O|1998-04-10|1998-04-12|1998-04-11|NONE|SHIP|s haggle acc +21376|1811|41|1|39|66799.59|0.01|0.02|N|O|1996-08-13|1996-08-22|1996-09-10|NONE|FOB|h evenly regular packages. never +21376|1874|4|2|26|46172.62|0.09|0.02|N|O|1996-07-10|1996-08-27|1996-07-14|NONE|SHIP|blithely ironic pains serve. packages +21376|1689|90|3|31|49311.08|0.05|0.03|N|O|1996-06-28|1996-07-28|1996-07-02|COLLECT COD|REG AIR| slyly blithely unusual accounts: +21376|1550|91|4|20|29031.00|0.01|0.07|N|O|1996-10-03|1996-07-16|1996-10-04|NONE|RAIL|gular dependencies hag +21376|210|38|5|25|27755.25|0.05|0.07|N|O|1996-08-14|1996-07-12|1996-09-10|DELIVER IN PERSON|FOB|ly final theodolites about +21376|1271|83|6|41|48063.07|0.04|0.03|N|O|1996-09-13|1996-07-22|1996-10-07|TAKE BACK RETURN|RAIL|lly regular ideas. special ideas p +21376|1692|34|7|50|79684.50|0.04|0.04|N|O|1996-09-11|1996-08-01|1996-09-17|COLLECT COD|FOB|furiously b +21377|1468|8|1|5|6847.30|0.10|0.02|R|F|1993-06-09|1993-04-22|1993-06-17|COLLECT COD|RAIL|s haggle slyly pending accounts. caref +21377|1760|45|2|33|54838.08|0.03|0.02|R|F|1993-06-22|1993-05-20|1993-07-14|COLLECT COD|FOB|heodolites cajole carefull +21377|1511|32|3|1|1412.51|0.08|0.04|A|F|1993-05-10|1993-04-18|1993-05-25|DELIVER IN PERSON|RAIL|ess sheaves. r +21378|522|23|1|26|36985.52|0.06|0.06|N|O|1995-10-02|1995-10-05|1995-10-25|DELIVER IN PERSON|AIR| to the blit +21378|1431|10|2|35|46635.05|0.00|0.03|N|O|1995-10-03|1995-10-06|1995-11-02|COLLECT COD|MAIL| beans wake carefully blith +21378|2000|1|3|47|42394.00|0.01|0.06|N|O|1995-10-02|1995-10-17|1995-10-22|COLLECT COD|SHIP|gular excuses. carefully bold ideas c +21378|1936|25|4|31|56975.83|0.03|0.05|N|O|1995-12-05|1995-10-12|1995-12-19|NONE|MAIL|ts: furiously ironic de +21378|1077|83|5|18|17605.26|0.09|0.05|N|O|1995-09-25|1995-10-30|1995-09-30|COLLECT COD|TRUCK|tealthy realms cajole fluffily above the t +21378|1768|95|6|8|13358.08|0.02|0.02|N|O|1995-09-29|1995-09-13|1995-10-19|DELIVER IN PERSON|REG AIR|ourts. even accounts haggle. ironic deposit +21379|1736|63|1|28|45856.44|0.05|0.04|R|F|1995-03-01|1995-04-06|1995-03-27|COLLECT COD|REG AIR|ithely after the slyly ironic dep +21379|25|76|2|15|13875.30|0.03|0.06|A|F|1995-05-16|1995-04-10|1995-05-22|NONE|AIR|nal packages boost fu +21379|1977|66|3|37|69521.89|0.00|0.00|A|F|1995-05-04|1995-02-23|1995-05-08|DELIVER IN PERSON|SHIP| lose above the ca +21379|724|89|4|37|60114.64|0.02|0.04|A|F|1995-03-04|1995-04-07|1995-03-29|NONE|AIR| requests. blithely regular inst +21380|1854|55|1|16|28093.60|0.05|0.04|N|O|1997-04-29|1997-06-02|1997-05-06|DELIVER IN PERSON|SHIP|eposits. slyly ironic somas b +21380|198|99|2|24|26356.56|0.04|0.02|N|O|1997-04-29|1997-05-19|1997-05-19|COLLECT COD|RAIL|ideas! carefully final pint +21380|850|51|3|49|85791.65|0.07|0.06|N|O|1997-05-22|1997-05-10|1997-06-14|NONE|REG AIR|l packages. slyly regular pinto bea +21380|1049|20|4|17|16150.68|0.08|0.08|N|O|1997-07-05|1997-05-08|1997-07-31|DELIVER IN PERSON|MAIL|ecial deposits haggl +21380|1033|4|5|28|26152.84|0.04|0.06|N|O|1997-06-30|1997-05-31|1997-07-28|TAKE BACK RETURN|AIR|e blithely regular accounts. expre +21381|1588|69|1|9|13406.22|0.00|0.08|R|F|1994-08-17|1994-08-11|1994-09-06|DELIVER IN PERSON|RAIL|ong the final, final requests are ex +21382|1892|36|1|40|71755.60|0.06|0.06|R|F|1992-03-16|1992-02-26|1992-03-24|COLLECT COD|REG AIR|quickly. blithely pending account +21382|1474|92|2|24|33011.28|0.01|0.04|R|F|1992-03-06|1992-02-12|1992-03-27|COLLECT COD|TRUCK|kages wake across the slowly +21382|477|78|3|26|35814.22|0.01|0.06|R|F|1992-02-08|1992-03-26|1992-02-13|NONE|FOB|hang after the esc +21382|838|5|4|27|46948.41|0.10|0.02|R|F|1992-02-20|1992-04-08|1992-02-23|DELIVER IN PERSON|MAIL|longside of the blit +21382|580|81|5|46|68106.68|0.00|0.07|R|F|1992-02-02|1992-04-03|1992-02-09|COLLECT COD|SHIP|es haggle across the carefully express excu +21382|1674|16|6|43|67753.81|0.04|0.05|A|F|1992-01-29|1992-03-10|1992-02-23|DELIVER IN PERSON|REG AIR|efully stealthy requests. fina +21382|1391|30|7|41|52987.99|0.05|0.04|R|F|1992-03-09|1992-02-23|1992-03-21|DELIVER IN PERSON|RAIL| beans! regular excuses a +21383|1288|63|1|50|59464.00|0.10|0.01|R|F|1994-05-10|1994-03-12|1994-06-04|DELIVER IN PERSON|FOB|s theodolites among the u +21383|513|74|2|9|12721.59|0.05|0.05|A|F|1994-03-12|1994-03-09|1994-03-13|NONE|AIR|blithely according to the furio +21383|797|94|3|29|49235.91|0.00|0.00|A|F|1994-04-21|1994-04-05|1994-04-26|DELIVER IN PERSON|REG AIR| deposits. carefully silent +21383|725|26|4|28|45520.16|0.08|0.06|A|F|1994-03-02|1994-03-15|1994-03-29|TAKE BACK RETURN|REG AIR|ly even esc +21408|687|19|1|9|14289.12|0.02|0.02|N|O|1997-12-12|1997-11-15|1998-01-03|DELIVER IN PERSON|AIR| unusual accounts wake fur +21408|424|54|2|16|21190.72|0.07|0.06|N|O|1997-10-29|1997-10-25|1997-10-31|NONE|SHIP|ven accounts cajole +21408|1926|27|3|21|38386.32|0.02|0.00|N|O|1997-11-22|1997-11-20|1997-12-18|TAKE BACK RETURN|REG AIR|press theodolites. slyly r +21408|1498|99|4|21|29389.29|0.06|0.05|N|O|1997-10-25|1997-11-14|1997-10-27|DELIVER IN PERSON|SHIP|lly blithely unusual requests? p +21408|322|51|5|15|18334.80|0.05|0.06|N|O|1997-10-05|1997-10-30|1997-10-15|NONE|MAIL|he carefully e +21408|275|57|6|9|10577.43|0.05|0.03|N|O|1997-09-24|1997-11-26|1997-10-08|NONE|REG AIR|l, regular packages across +21408|487|75|7|41|56886.68|0.03|0.04|N|O|1997-11-22|1997-10-16|1997-11-29|TAKE BACK RETURN|TRUCK|ully special pinto beans. fluffil +21409|277|32|1|26|30609.02|0.04|0.07|R|F|1994-03-18|1994-03-31|1994-03-22|COLLECT COD|MAIL|pecial, expres +21409|936|5|2|35|64292.55|0.06|0.00|R|F|1994-06-02|1994-05-02|1994-07-01|DELIVER IN PERSON|RAIL| the theodolites? bo +21410|569|30|1|4|5878.24|0.07|0.05|A|F|1992-07-22|1992-07-19|1992-07-24|COLLECT COD|SHIP|fluffily. regular deposits wake blithely. +21410|783|16|2|28|47145.84|0.04|0.07|R|F|1992-05-12|1992-07-29|1992-05-30|TAKE BACK RETURN|TRUCK|deposits nag fin +21411|422|52|1|40|52896.80|0.09|0.04|N|O|1997-10-29|1997-10-11|1997-11-01|COLLECT COD|REG AIR|nal, ironic packages +21411|696|28|2|20|31933.80|0.08|0.07|N|O|1997-10-25|1997-09-23|1997-11-22|COLLECT COD|TRUCK|about the blithely +21411|1624|66|3|12|18307.44|0.02|0.01|N|O|1997-09-08|1997-09-16|1997-10-04|COLLECT COD|RAIL|ular requests aro +21411|617|11|4|32|48563.52|0.05|0.05|N|O|1997-11-03|1997-08-14|1997-11-06|NONE|REG AIR|haggle quickly fluffil +21412|1636|37|1|13|19989.19|0.03|0.03|N|O|1995-08-07|1995-09-10|1995-08-20|NONE|MAIL|ges sleep furiously. decoys was fl +21412|841|42|2|25|43546.00|0.06|0.08|N|O|1995-08-03|1995-08-17|1995-08-12|TAKE BACK RETURN|RAIL|uests play furiously. even requests +21412|1718|19|3|29|46971.59|0.04|0.07|N|O|1995-08-14|1995-09-01|1995-09-04|TAKE BACK RETURN|SHIP|haggle. quickly regular packages sl +21412|168|69|4|2|2136.32|0.08|0.01|N|O|1995-10-02|1995-10-04|1995-10-21|COLLECT COD|TRUCK|ronic package +21412|1596|17|5|2|2995.18|0.04|0.04|N|O|1995-10-31|1995-09-11|1995-11-21|TAKE BACK RETURN|SHIP|y ironic ideas. fluffily r +21413|644|38|1|50|77232.00|0.10|0.03|N|O|1997-07-08|1997-09-05|1997-07-29|DELIVER IN PERSON|MAIL|regular accounts nag carefully ab +21413|1251|63|2|41|47242.25|0.08|0.04|N|O|1997-10-10|1997-07-25|1997-10-24|COLLECT COD|FOB|urts wake furio +21413|798|95|3|21|35674.59|0.03|0.04|N|O|1997-07-01|1997-08-23|1997-07-24|DELIVER IN PERSON|TRUCK|regular packages wake carefully. requests h +21413|908|77|4|24|43413.60|0.06|0.00|N|O|1997-09-08|1997-08-06|1997-09-11|DELIVER IN PERSON|RAIL|inal deposits. care +21413|1031|37|5|34|31689.02|0.03|0.01|N|O|1997-08-23|1997-07-19|1997-08-30|COLLECT COD|FOB|deposits. furiously +21413|1353|54|6|34|42647.90|0.06|0.03|N|O|1997-08-21|1997-07-17|1997-08-23|DELIVER IN PERSON|REG AIR|. regular accounts cajole +21414|1987|32|1|41|77448.18|0.01|0.06|A|F|1995-06-05|1995-06-24|1995-06-11|TAKE BACK RETURN|REG AIR|special packages sl +21414|1124|33|2|14|14351.68|0.07|0.06|N|O|1995-08-04|1995-07-12|1995-08-19|COLLECT COD|RAIL|ounts cajole. bli +21414|1621|45|3|50|76131.00|0.00|0.04|A|F|1995-05-07|1995-06-21|1995-05-28|DELIVER IN PERSON|RAIL|slyly final pint +21414|698|99|4|46|73539.74|0.09|0.07|R|F|1995-05-11|1995-06-12|1995-06-09|DELIVER IN PERSON|REG AIR| sleep furiously special accounts. iro +21414|1526|7|5|48|68520.96|0.06|0.03|N|O|1995-06-24|1995-07-28|1995-07-18|NONE|TRUCK| deposits boost +21414|1621|22|6|28|42633.36|0.01|0.02|N|O|1995-07-02|1995-06-08|1995-07-29|NONE|SHIP|ross the furiously special +21415|472|60|1|24|32939.28|0.02|0.02|R|F|1992-07-24|1992-06-15|1992-08-19|NONE|RAIL|carefully accounts. closely express depende +21415|1057|58|2|22|21077.10|0.07|0.08|R|F|1992-07-15|1992-06-02|1992-08-14|TAKE BACK RETURN|FOB|slyly bold a +21415|609|3|3|10|15096.00|0.07|0.05|A|F|1992-07-18|1992-07-12|1992-07-28|TAKE BACK RETURN|SHIP|elets over the fluffily fin +21440|345|2|1|24|29888.16|0.06|0.08|A|F|1993-01-21|1993-02-04|1993-01-30|DELIVER IN PERSON|AIR|, pending platelets. +21440|1158|59|2|46|48720.90|0.05|0.05|R|F|1992-11-23|1992-12-18|1992-12-01|NONE|RAIL|sits are carefully blithely express ins +21440|1221|33|3|26|29177.72|0.10|0.07|A|F|1992-11-30|1993-02-01|1992-12-15|COLLECT COD|RAIL|inder alongside of the blithely +21440|672|73|4|45|70770.15|0.08|0.07|A|F|1993-01-29|1993-01-18|1993-02-24|COLLECT COD|MAIL|ccounts cajole blithely permane +21441|1073|44|1|34|33118.38|0.05|0.03|N|O|1997-06-08|1997-07-30|1997-06-21|NONE|TRUCK|iously ironic deposit +21441|1154|27|2|20|21103.00|0.09|0.08|N|O|1997-09-07|1997-08-14|1997-09-09|DELIVER IN PERSON|SHIP|. express reques +21441|118|45|3|35|35633.85|0.00|0.07|N|O|1997-06-10|1997-08-16|1997-06-20|NONE|AIR|he ironic instructions. un +21442|536|27|1|38|54588.14|0.04|0.06|R|F|1995-03-17|1995-03-20|1995-04-12|DELIVER IN PERSON|AIR|press ideas unwi +21442|185|12|2|8|8681.44|0.00|0.08|A|F|1995-03-31|1995-03-19|1995-04-08|DELIVER IN PERSON|SHIP|y special ide +21442|83|34|3|37|36373.96|0.02|0.06|A|F|1995-04-23|1995-02-24|1995-05-12|TAKE BACK RETURN|FOB|ons. even, ironi +21442|1793|78|4|9|15253.11|0.08|0.07|R|F|1995-01-22|1995-01-28|1995-02-03|TAKE BACK RETURN|RAIL| nag furiously. carefully reg +21442|1198|71|5|14|15388.66|0.04|0.04|R|F|1995-04-19|1995-02-04|1995-05-18|COLLECT COD|MAIL|e slyly stealthily regular platelets. sl +21442|244|72|6|45|51490.80|0.05|0.01|R|F|1995-03-04|1995-03-22|1995-03-11|DELIVER IN PERSON|REG AIR|le busily. slyly +21443|238|20|1|22|25041.06|0.07|0.03|N|O|1996-01-23|1996-03-15|1996-01-27|DELIVER IN PERSON|FOB|ly against the even accounts. per +21443|1226|27|2|18|20289.96|0.09|0.08|N|O|1996-02-28|1996-02-19|1996-03-13|NONE|TRUCK|old ideas hinde +21443|1073|9|3|15|14611.05|0.06|0.06|N|O|1996-03-13|1996-02-24|1996-03-29|TAKE BACK RETURN|TRUCK|regular instruct +21443|236|18|4|12|13634.76|0.09|0.08|N|O|1996-01-22|1996-04-04|1996-01-23|TAKE BACK RETURN|FOB|y special deposits. quickly pending req +21444|910|11|1|17|30785.47|0.07|0.01|N|O|1995-06-24|1995-06-12|1995-06-26|COLLECT COD|RAIL|ndencies impress. carefully +21444|325|26|2|15|18379.80|0.05|0.00|N|O|1995-07-14|1995-07-05|1995-08-05|NONE|RAIL|otes. furiously si +21444|1408|87|3|46|60232.40|0.09|0.04|N|O|1995-08-01|1995-05-19|1995-08-21|COLLECT COD|TRUCK|eposits mold furiously careful +21444|224|6|4|24|26981.28|0.10|0.08|N|O|1995-07-13|1995-07-11|1995-07-17|NONE|REG AIR|s-- pending packages +21444|1216|17|5|21|23461.41|0.04|0.04|N|F|1995-06-17|1995-07-11|1995-06-25|DELIVER IN PERSON|SHIP| have to wake quietly after the packages +21444|1971|72|6|43|80537.71|0.10|0.00|N|O|1995-07-17|1995-06-15|1995-07-25|COLLECT COD|FOB|engage? even instructions are blit +21445|102|55|1|18|18037.80|0.03|0.01|R|F|1995-01-06|1995-01-23|1995-01-15|TAKE BACK RETURN|REG AIR|the furiously ironic fox +21445|1820|64|2|48|82647.36|0.05|0.01|R|F|1995-02-15|1994-12-21|1995-02-20|NONE|FOB|y regular excuses. unusual, ironic frays +21445|37|13|3|41|38418.23|0.09|0.01|R|F|1994-12-27|1995-02-13|1994-12-28|DELIVER IN PERSON|TRUCK|iously regular accounts wake: carefully +21445|257|12|4|50|57862.50|0.02|0.02|R|F|1994-12-12|1994-12-20|1994-12-15|NONE|AIR|ove the accounts. ir +21445|1801|88|5|8|13622.40|0.09|0.02|R|F|1995-01-15|1995-01-07|1995-01-22|COLLECT COD|MAIL| regular pac +21445|42|68|6|44|41449.76|0.07|0.02|R|F|1995-01-06|1995-01-28|1995-02-04|COLLECT COD|TRUCK|oss the ironic asymptotes. exc +21445|136|63|7|19|19686.47|0.01|0.03|A|F|1994-11-19|1995-01-17|1994-11-27|DELIVER IN PERSON|REG AIR|ly according +21446|1148|21|1|32|33572.48|0.07|0.00|N|O|1998-09-01|1998-07-06|1998-09-09|COLLECT COD|TRUCK|asymptotes cajole thr +21446|885|85|2|27|48218.76|0.00|0.05|N|O|1998-06-22|1998-07-26|1998-06-29|TAKE BACK RETURN|SHIP|oxes. final, b +21447|1700|42|1|50|80085.00|0.06|0.07|A|F|1993-07-29|1993-08-28|1993-08-27|TAKE BACK RETURN|AIR|lets; blithely final dolphins use along +21447|493|23|2|45|62707.05|0.05|0.08|R|F|1993-07-30|1993-08-25|1993-08-28|TAKE BACK RETURN|SHIP|fily even pack +21447|271|53|3|36|42165.72|0.09|0.01|A|F|1993-08-05|1993-08-04|1993-08-21|TAKE BACK RETURN|SHIP|g excuses wake blithely. fu +21447|716|13|4|16|25867.36|0.00|0.06|R|F|1993-09-01|1993-07-22|1993-09-25|DELIVER IN PERSON|SHIP| express requests +21447|462|63|5|16|21799.36|0.08|0.01|R|F|1993-06-25|1993-08-01|1993-07-18|DELIVER IN PERSON|TRUCK|counts haggle above the furiousl +21447|732|65|6|36|58778.28|0.10|0.02|A|F|1993-08-16|1993-08-08|1993-09-08|TAKE BACK RETURN|REG AIR| accounts. silent, ironic theodolites cajo +21447|677|78|7|4|6310.68|0.05|0.05|A|F|1993-06-20|1993-08-05|1993-07-14|NONE|RAIL|ffily pendi +21472|888|88|1|36|64399.68|0.10|0.02|N|O|1996-01-20|1996-03-03|1996-02-12|DELIVER IN PERSON|MAIL|ly final tithes detect blith +21473|763|64|1|27|44921.52|0.01|0.06|N|O|1995-07-06|1995-05-25|1995-07-09|COLLECT COD|FOB|equests. exc +21473|254|9|2|27|31164.75|0.00|0.00|A|F|1995-04-06|1995-05-30|1995-04-15|TAKE BACK RETURN|TRUCK|ironically sly +21474|997|98|1|37|70225.63|0.01|0.05|A|F|1993-06-06|1993-05-30|1993-06-16|TAKE BACK RETURN|MAIL|quests boost slyly according to +21474|250|51|2|46|52911.50|0.08|0.00|A|F|1993-04-22|1993-06-06|1993-05-20|COLLECT COD|REG AIR| unusual, ironic platele +21474|611|43|3|43|64999.23|0.06|0.05|R|F|1993-08-04|1993-05-05|1993-08-11|DELIVER IN PERSON|FOB|ans cajole +21474|1130|31|4|48|49494.24|0.05|0.07|R|F|1993-07-22|1993-05-14|1993-08-21|NONE|SHIP| quickly against the even sauternes. caref +21475|1752|37|1|7|11576.25|0.07|0.03|R|F|1995-03-10|1995-04-28|1995-03-30|COLLECT COD|MAIL| silently along the blithely even packa +21475|187|14|2|47|51097.46|0.09|0.00|R|F|1995-05-12|1995-04-30|1995-06-08|NONE|AIR|ely about the bold w +21475|1868|12|3|34|60175.24|0.06|0.01|A|F|1995-03-12|1995-05-21|1995-03-13|NONE|FOB|al frets. carefully permanen +21475|684|16|4|32|50709.76|0.08|0.02|A|F|1995-04-27|1995-05-15|1995-05-12|NONE|AIR| close dolphins are caref +21475|783|84|5|17|28624.26|0.09|0.03|A|F|1995-03-16|1995-03-26|1995-04-06|COLLECT COD|FOB|sts sublate carefully +21476|626|20|1|39|59538.18|0.01|0.06|N|O|1995-07-13|1995-08-03|1995-07-28|COLLECT COD|RAIL| cajole. final foxes wake furi +21476|1125|34|2|11|11287.32|0.08|0.08|N|O|1995-09-09|1995-07-01|1995-10-08|TAKE BACK RETURN|TRUCK|long the slyly unusual som +21476|1429|47|3|49|65190.58|0.03|0.08|N|O|1995-07-23|1995-07-31|1995-07-25|COLLECT COD|TRUCK|uriously final requests hang quickly. gifts +21476|1826|56|4|27|46651.14|0.08|0.00|N|O|1995-07-17|1995-07-15|1995-08-11|NONE|AIR| are blithely unusual accou +21477|723|20|1|27|43840.44|0.07|0.05|N|O|1995-07-17|1995-07-03|1995-08-06|TAKE BACK RETURN|MAIL|ffily regula +21477|1213|88|2|25|27855.25|0.00|0.01|N|O|1995-07-10|1995-08-20|1995-07-19|TAKE BACK RETURN|TRUCK|ckages-- final pinto beans nag slyly amon +21477|965|66|3|16|29855.36|0.04|0.04|N|O|1995-08-24|1995-07-23|1995-09-10|NONE|MAIL|ackages haggle slyly carefully sp +21477|1629|53|4|47|71939.14|0.05|0.08|N|O|1995-09-16|1995-08-12|1995-10-09|COLLECT COD|TRUCK|refully even gif +21477|1029|35|5|49|45570.98|0.10|0.02|N|F|1995-06-11|1995-07-11|1995-06-21|NONE|REG AIR|ages. carefully spe +21478|753|18|1|45|74418.75|0.01|0.02|A|F|1992-04-11|1992-05-15|1992-04-22|COLLECT COD|TRUCK|ounts. final, regul +21478|1803|4|2|43|73306.40|0.06|0.08|R|F|1992-06-09|1992-04-23|1992-07-01|TAKE BACK RETURN|AIR| unusual pint +21478|1404|22|3|46|60048.40|0.04|0.00|R|F|1992-04-28|1992-05-18|1992-05-14|DELIVER IN PERSON|TRUCK|gular, bold instructions. unusua +21478|1122|95|4|29|29670.48|0.08|0.03|R|F|1992-04-12|1992-04-29|1992-05-12|COLLECT COD|REG AIR| hockey players sleep regul +21478|1172|81|5|34|36487.78|0.05|0.07|R|F|1992-05-11|1992-04-09|1992-05-16|DELIVER IN PERSON|REG AIR|uickly regular excuses. carefully +21478|404|34|6|25|32610.00|0.07|0.03|R|F|1992-03-10|1992-06-01|1992-03-30|NONE|TRUCK|ar accounts affix carefully by +21479|1286|98|1|24|28494.72|0.06|0.06|R|F|1994-09-30|1994-10-29|1994-10-08|COLLECT COD|FOB|y bold inst +21479|200|79|2|19|20903.80|0.10|0.05|R|F|1994-12-06|1994-11-17|1994-12-25|NONE|REG AIR|ily special theodolites are +21479|24|75|3|42|38808.84|0.07|0.08|R|F|1994-10-20|1994-10-13|1994-10-21|NONE|TRUCK|the quickly regular pinto beans sleep c +21479|1986|75|4|6|11327.88|0.05|0.08|R|F|1994-10-09|1994-10-08|1994-10-27|TAKE BACK RETURN|FOB|se after the fluffi +21504|943|78|1|24|44254.56|0.02|0.03|N|O|1998-02-23|1998-01-13|1998-02-26|TAKE BACK RETURN|FOB|al, final +21504|877|77|2|6|10667.22|0.03|0.03|N|O|1998-03-02|1998-01-10|1998-03-12|DELIVER IN PERSON|TRUCK|ringly express deposits wake fu +21504|1094|100|3|35|34828.15|0.06|0.03|N|O|1998-01-27|1998-01-11|1998-02-24|NONE|FOB| ironic packages use fluffi +21504|1242|43|4|43|49159.32|0.09|0.01|N|O|1998-01-30|1997-12-23|1998-02-12|TAKE BACK RETURN|REG AIR| the deposits. blithely final theodo +21504|86|12|5|6|5916.48|0.02|0.01|N|O|1998-02-16|1997-12-19|1998-02-19|TAKE BACK RETURN|REG AIR|ly bold ideas acc +21504|562|93|6|33|48264.48|0.09|0.02|N|O|1998-01-16|1998-01-01|1998-02-07|COLLECT COD|FOB|es use. carefully even acco +21505|313|98|1|14|16986.34|0.05|0.05|A|F|1993-03-27|1993-02-16|1993-04-07|DELIVER IN PERSON|RAIL|ounts integrat +21505|1383|60|2|37|47522.06|0.03|0.03|A|F|1993-02-22|1993-01-30|1993-03-17|DELIVER IN PERSON|MAIL|latelets x- +21505|1659|83|3|42|65547.30|0.10|0.04|A|F|1992-12-17|1993-02-06|1993-01-07|TAKE BACK RETURN|RAIL|lithely even grouches nag upon the unu +21505|496|84|4|49|68428.01|0.07|0.03|R|F|1993-04-01|1993-01-26|1993-04-07|NONE|RAIL|tructions haggle fur +21505|328|29|5|7|8598.24|0.09|0.03|R|F|1993-02-02|1993-01-17|1993-02-15|DELIVER IN PERSON|MAIL|bold somas doubt car +21505|526|17|6|50|71326.00|0.06|0.05|R|F|1993-03-24|1993-02-16|1993-04-09|COLLECT COD|RAIL|unts. slyly regular requests sleep +21506|1904|37|1|9|16253.10|0.01|0.07|R|F|1994-07-16|1994-08-03|1994-08-11|TAKE BACK RETURN|AIR|iously stealthy foxes haggle +21506|515|46|2|50|70775.50|0.04|0.04|A|F|1994-08-21|1994-07-10|1994-08-25|DELIVER IN PERSON|AIR|ake. slyly fina +21506|281|9|3|46|54338.88|0.09|0.06|A|F|1994-06-26|1994-07-31|1994-07-10|TAKE BACK RETURN|REG AIR|rate. blithely express ide +21506|1693|35|4|29|46246.01|0.10|0.04|A|F|1994-08-04|1994-08-27|1994-08-30|COLLECT COD|SHIP|r, special packag +21507|73|24|1|45|43788.15|0.03|0.07|N|O|1997-09-06|1997-08-31|1997-09-27|TAKE BACK RETURN|FOB|arefully along the iron +21507|1604|46|2|25|37640.00|0.08|0.01|N|O|1997-10-02|1997-08-11|1997-10-13|TAKE BACK RETURN|AIR|t the express accounts. r +21507|200|53|3|44|48408.80|0.02|0.01|N|O|1997-07-01|1997-09-10|1997-07-05|NONE|AIR|final deposits are furio +21508|1739|40|1|39|63988.47|0.05|0.01|N|O|1998-06-19|1998-07-06|1998-07-02|DELIVER IN PERSON|TRUCK|sits across the special packages play alon +21508|293|75|2|17|20285.93|0.03|0.04|N|O|1998-08-15|1998-05-29|1998-08-23|COLLECT COD|FOB|eposits nag furiousl +21509|1798|83|1|26|44194.54|0.04|0.05|R|F|1992-07-26|1992-09-26|1992-08-10|DELIVER IN PERSON|REG AIR|ly regular deposits use furiously +21509|752|53|2|37|61151.75|0.09|0.06|R|F|1992-08-29|1992-09-10|1992-09-11|COLLECT COD|AIR|. requests ser +21509|177|78|3|21|22620.57|0.03|0.00|R|F|1992-09-11|1992-08-24|1992-09-17|NONE|TRUCK| play at the carefully bold packages-- in +21509|1392|69|4|39|50442.21|0.04|0.07|A|F|1992-09-05|1992-08-12|1992-09-15|NONE|MAIL| blithely close asymptotes. blithe +21510|343|28|1|1|1243.34|0.09|0.05|R|F|1992-08-10|1992-07-13|1992-09-07|COLLECT COD|MAIL| the ironic theodolites. +21510|1093|94|2|46|45728.14|0.00|0.06|A|F|1992-06-28|1992-07-10|1992-07-07|TAKE BACK RETURN|REG AIR|its use furiously fluffily unusual +21510|751|48|3|21|34686.75|0.08|0.04|R|F|1992-07-14|1992-06-20|1992-08-12|TAKE BACK RETURN|REG AIR|sts integrate. ironic, sil +21511|788|21|1|50|84439.00|0.08|0.04|N|O|1996-04-20|1996-06-25|1996-04-21|DELIVER IN PERSON|TRUCK|rding to the quickly silent d +21511|725|90|2|11|17882.92|0.02|0.02|N|O|1996-07-22|1996-05-23|1996-08-01|DELIVER IN PERSON|TRUCK|ironic requests +21511|1001|7|3|26|23452.00|0.01|0.03|N|O|1996-06-22|1996-06-26|1996-07-08|TAKE BACK RETURN|SHIP|uctions above the packages wake across +21511|1209|10|4|37|41077.40|0.10|0.03|N|O|1996-08-13|1996-05-31|1996-08-25|DELIVER IN PERSON|SHIP|use furiously ironic ideas. ironic +21511|823|23|5|32|55162.24|0.09|0.01|N|O|1996-04-27|1996-06-19|1996-05-26|COLLECT COD|TRUCK|wake about the ironic theodol +21511|817|17|6|37|63558.97|0.05|0.03|N|O|1996-05-20|1996-06-12|1996-06-01|DELIVER IN PERSON|MAIL| fluffily ironic requests use carefu +21536|1829|59|1|21|36347.22|0.00|0.00|N|O|1997-05-30|1997-06-30|1997-06-11|DELIVER IN PERSON|MAIL|t blithely after the carefully +21536|488|47|2|20|27769.60|0.04|0.04|N|O|1997-08-07|1997-06-22|1997-08-22|TAKE BACK RETURN|TRUCK|kly carefully regular theodolites. re +21536|1292|30|3|7|8353.03|0.02|0.00|N|O|1997-05-10|1997-06-09|1997-06-01|TAKE BACK RETURN|FOB|efully across the slyly final instructio +21536|148|27|4|23|24107.22|0.02|0.00|N|O|1997-05-27|1997-06-27|1997-06-16|TAKE BACK RETURN|AIR|s engage. express, si +21536|666|98|5|8|12533.28|0.10|0.05|N|O|1997-05-29|1997-06-24|1997-06-15|DELIVER IN PERSON|REG AIR| deposits. blithely pending accounts affix +21536|1411|29|6|40|52496.40|0.06|0.03|N|O|1997-08-03|1997-06-04|1997-08-15|DELIVER IN PERSON|AIR|e slyly unusual packages! care +21537|588|79|1|23|34237.34|0.10|0.03|R|F|1992-02-25|1992-04-12|1992-03-21|TAKE BACK RETURN|FOB|gular asymptotes. slyly even accounts are +21537|649|81|2|11|17046.04|0.03|0.06|R|F|1992-03-31|1992-04-16|1992-04-24|COLLECT COD|MAIL|ronic packages wake blithely furiously spe +21537|488|89|3|8|11107.84|0.10|0.02|A|F|1992-02-27|1992-03-24|1992-03-08|NONE|REG AIR| furiously unusual theodoli +21538|680|43|1|35|55323.80|0.10|0.07|R|F|1994-10-02|1994-09-12|1994-10-05|TAKE BACK RETURN|FOB|ronic foxes-- furiously regular pea +21538|1552|53|2|41|59595.55|0.00|0.04|R|F|1994-08-06|1994-10-26|1994-08-31|NONE|TRUCK|usly ironi +21538|779|80|3|42|70550.34|0.03|0.04|R|F|1994-09-24|1994-10-17|1994-09-29|DELIVER IN PERSON|REG AIR|ronic instructions are blithel +21538|157|58|4|32|33828.80|0.02|0.08|A|F|1994-09-14|1994-09-30|1994-10-01|TAKE BACK RETURN|SHIP|fily. regular, express pinto be +21539|1041|12|1|34|32029.36|0.02|0.01|A|F|1993-09-02|1993-09-08|1993-09-30|DELIVER IN PERSON|FOB| ironic package +21539|900|34|2|23|41420.70|0.05|0.05|R|F|1993-09-09|1993-10-06|1993-10-04|NONE|FOB|ronic requests. +21539|520|21|3|16|22728.32|0.06|0.02|A|F|1993-11-01|1993-08-22|1993-11-06|TAKE BACK RETURN|FOB| theodolites d +21539|111|64|4|13|13144.43|0.00|0.05|R|F|1993-08-24|1993-09-23|1993-09-20|TAKE BACK RETURN|SHIP|r the bold accounts are sly +21539|869|69|5|7|12389.02|0.04|0.02|R|F|1993-08-22|1993-08-22|1993-08-25|NONE|TRUCK|slyly even decoys. furi +21540|1034|35|1|44|41141.32|0.00|0.05|R|F|1992-07-13|1992-06-20|1992-07-27|DELIVER IN PERSON|TRUCK|its boost silent, ironic packages. unusual +21540|1496|14|2|46|64284.54|0.07|0.03|A|F|1992-09-09|1992-08-03|1992-10-09|TAKE BACK RETURN|AIR|hely pending warthogs are. carefully final +21541|1332|47|1|49|60433.17|0.05|0.02|A|F|1994-11-18|1995-01-02|1994-11-26|DELIVER IN PERSON|TRUCK|ily requests. carefully ironic ideas +21542|1910|55|1|42|76100.22|0.10|0.00|N|F|1995-06-16|1995-08-03|1995-07-02|COLLECT COD|FOB|le. fluffily ir +21542|1641|24|2|1|1542.64|0.03|0.02|A|F|1995-06-07|1995-08-06|1995-06-15|COLLECT COD|FOB| pains affix ironic, even ex +21542|721|86|3|42|68112.24|0.05|0.00|N|O|1995-08-05|1995-07-22|1995-08-29|COLLECT COD|FOB|g carefully. blithely sp +21542|1766|93|4|1|1667.76|0.09|0.02|N|O|1995-09-09|1995-06-22|1995-10-03|TAKE BACK RETURN|AIR|ges. platelets are. instru +21542|1381|82|5|9|11541.42|0.03|0.01|N|O|1995-06-23|1995-06-28|1995-06-30|TAKE BACK RETURN|RAIL|en theodolites nag. slyly bol +21542|317|18|6|8|9738.48|0.05|0.08|N|F|1995-06-09|1995-08-08|1995-06-20|NONE|AIR|usly unusual accounts. +21542|536|97|7|31|44532.43|0.05|0.06|N|O|1995-09-17|1995-07-07|1995-09-29|DELIVER IN PERSON|SHIP|out the regular, ironic +21543|1340|79|1|13|16137.42|0.00|0.07|A|F|1992-03-23|1992-05-30|1992-04-07|TAKE BACK RETURN|RAIL|ions nag slyly. c +21543|268|96|2|27|31543.02|0.08|0.03|A|F|1992-04-18|1992-05-24|1992-04-30|COLLECT COD|MAIL|s haggle carefully. iron +21543|912|15|3|32|58013.12|0.08|0.05|R|F|1992-05-11|1992-04-27|1992-05-15|NONE|AIR|kages haggle slyly bold dolphins. bo +21543|1744|71|4|36|59246.64|0.01|0.01|R|F|1992-03-24|1992-04-16|1992-04-05|NONE|RAIL|quickly along the +21543|163|64|5|5|5315.80|0.01|0.04|R|F|1992-06-30|1992-05-01|1992-07-19|TAKE BACK RETURN|FOB|regular ideas. caref +21568|859|26|1|30|52795.50|0.07|0.00|N|O|1995-09-26|1995-10-15|1995-10-11|TAKE BACK RETURN|AIR|ously final +21569|1026|27|1|12|11124.24|0.05|0.01|N|O|1996-09-13|1996-12-03|1996-10-05|COLLECT COD|REG AIR|ons. unusu +21569|1194|31|2|9|9856.71|0.08|0.00|N|O|1996-12-30|1996-11-24|1997-01-20|TAKE BACK RETURN|AIR| ironic deposits sleep carefully alongsi +21570|250|78|1|14|16103.50|0.10|0.04|N|O|1996-05-19|1996-03-21|1996-06-15|NONE|AIR|e furiously according to the +21570|808|42|2|27|46137.60|0.02|0.00|N|O|1996-05-17|1996-04-30|1996-05-18|TAKE BACK RETURN|REG AIR|e the regular, special packages. ironic ide +21571|1125|98|1|27|27705.24|0.05|0.07|N|O|1995-12-12|1995-10-14|1996-01-02|TAKE BACK RETURN|REG AIR|ons after the fluffily bold requests hagg +21571|398|99|2|32|41548.48|0.05|0.04|N|O|1995-11-18|1995-10-19|1995-11-22|NONE|FOB|ncies. regular deposits use furious +21571|1053|24|3|43|41024.15|0.07|0.00|N|O|1995-09-10|1995-10-14|1995-09-13|NONE|FOB|o beans wake slyly. furiously spe +21571|439|98|4|9|12054.87|0.08|0.08|N|O|1995-08-25|1995-09-27|1995-08-28|COLLECT COD|TRUCK|deposits. packages sleep f +21571|1108|17|5|4|4036.40|0.00|0.02|N|O|1995-08-25|1995-09-27|1995-08-29|DELIVER IN PERSON|SHIP|as slyly regular foxes. bl +21571|1679|80|6|18|28452.06|0.06|0.05|N|O|1995-11-03|1995-10-17|1995-11-18|NONE|TRUCK| packages accord +21572|1535|16|1|5|7182.65|0.03|0.06|R|F|1994-06-06|1994-04-09|1994-06-25|TAKE BACK RETURN|AIR|kages. thinly final f +21572|1773|100|2|38|63641.26|0.01|0.01|R|F|1994-02-22|1994-04-08|1994-03-03|TAKE BACK RETURN|RAIL|e brave dugouts; +21572|339|40|3|29|35940.57|0.02|0.02|R|F|1994-04-29|1994-04-25|1994-05-27|COLLECT COD|RAIL|ong the quick packages. quickly ironic +21572|586|47|4|41|60949.78|0.04|0.01|A|F|1994-04-02|1994-04-14|1994-04-03|COLLECT COD|REG AIR|o the blithely ruthless asymptotes boost +21572|1140|41|5|10|10411.40|0.04|0.05|A|F|1994-05-30|1994-03-29|1994-06-27|DELIVER IN PERSON|SHIP|nusual instructions. slyly regul +21572|1683|7|6|3|4754.04|0.07|0.00|R|F|1994-05-28|1994-03-27|1994-06-20|DELIVER IN PERSON|FOB|nal packages +21572|684|85|7|14|22185.52|0.01|0.07|A|F|1994-02-21|1994-05-08|1994-03-21|TAKE BACK RETURN|SHIP|ounts affix a +21573|1326|3|1|47|57684.04|0.09|0.08|A|F|1992-07-04|1992-06-25|1992-07-25|COLLECT COD|RAIL|ld instructions. slyly f +21573|1552|73|2|29|42152.95|0.06|0.07|R|F|1992-06-25|1992-07-10|1992-07-10|TAKE BACK RETURN|FOB|sits are against the regular, even package +21573|1029|65|3|15|13950.30|0.04|0.02|A|F|1992-06-13|1992-07-07|1992-06-28|DELIVER IN PERSON|TRUCK|es. fluffily even brai +21573|193|94|4|12|13118.28|0.07|0.07|R|F|1992-07-30|1992-06-13|1992-08-15|NONE|AIR|totes nag slyly special platelets. un +21573|1975|20|5|21|39416.37|0.04|0.06|R|F|1992-07-08|1992-07-16|1992-07-16|COLLECT COD|FOB|usly. requests cajole slyly stealthily u +21573|1882|69|6|10|17838.80|0.08|0.04|R|F|1992-06-06|1992-06-27|1992-06-15|COLLECT COD|RAIL|hely pending pearls integrate fluffily fi +21573|440|41|7|18|24127.92|0.10|0.02|A|F|1992-08-09|1992-07-01|1992-08-18|DELIVER IN PERSON|TRUCK|le blithely. accounts wake furiously +21574|688|82|1|3|4766.04|0.01|0.06|A|F|1993-04-20|1993-04-06|1993-04-22|COLLECT COD|REG AIR|ly regular platelets wake furiously about +21574|319|20|2|4|4877.24|0.02|0.02|R|F|1993-03-22|1993-04-03|1993-03-23|NONE|FOB|n instructions. +21574|711|8|3|36|58021.56|0.01|0.05|A|F|1993-02-18|1993-03-15|1993-02-27|COLLECT COD|AIR|special accounts sleep +21574|1466|6|4|46|62903.16|0.05|0.05|R|F|1993-04-30|1993-04-15|1993-05-23|TAKE BACK RETURN|SHIP|ly among the p +21574|1593|14|5|11|16440.49|0.07|0.06|A|F|1993-04-19|1993-03-14|1993-05-14|DELIVER IN PERSON|MAIL|ly ironic asymptotes wake carefully +21575|946|47|1|11|20316.34|0.00|0.03|N|O|1997-05-05|1997-03-22|1997-05-12|NONE|RAIL|ss the slyly bold +21575|892|92|2|26|46615.14|0.09|0.00|N|O|1997-04-28|1997-04-14|1997-05-28|COLLECT COD|RAIL| ironic, unusual req +21575|1693|94|3|6|9568.14|0.01|0.05|N|O|1997-03-08|1997-04-24|1997-03-30|TAKE BACK RETURN|TRUCK|thely special deposits nag carefu +21600|1077|78|1|4|3912.28|0.06|0.00|A|F|1993-05-20|1993-05-22|1993-06-03|NONE|REG AIR|slyly unusual depos +21600|1849|79|2|41|71784.44|0.05|0.06|A|F|1993-05-09|1993-05-07|1993-05-17|COLLECT COD|TRUCK|ndencies. carefully regu +21600|607|70|3|33|49750.80|0.01|0.02|A|F|1993-06-30|1993-06-15|1993-07-17|TAKE BACK RETURN|TRUCK| detect over the carefully spe +21600|191|44|4|37|40374.03|0.06|0.08|R|F|1993-04-14|1993-05-09|1993-04-29|DELIVER IN PERSON|TRUCK|e doggedly to the +21601|588|89|1|4|5954.32|0.03|0.01|N|O|1995-06-29|1995-05-27|1995-07-01|COLLECT COD|TRUCK|lyly ironic requests +21601|141|94|2|33|34357.62|0.02|0.02|N|O|1995-07-31|1995-06-08|1995-08-25|COLLECT COD|MAIL|dolites; slyly express theodoli +21601|117|18|3|5|5085.55|0.00|0.00|N|O|1995-07-27|1995-05-20|1995-08-04|TAKE BACK RETURN|RAIL|ep? packages wake furiously. regu +21601|914|15|4|43|78041.13|0.08|0.02|N|O|1995-07-17|1995-06-21|1995-07-20|NONE|FOB|sias. slyly even packages +21602|1572|73|1|37|54522.09|0.08|0.03|R|F|1994-10-06|1994-09-12|1994-10-19|NONE|SHIP|deposits. slyly even pinto beans use bli +21602|1882|26|2|46|82058.48|0.05|0.06|A|F|1994-08-22|1994-08-08|1994-08-30|TAKE BACK RETURN|SHIP|at the final, even excu +21603|624|87|1|9|13721.58|0.09|0.02|N|O|1997-06-06|1997-05-29|1997-06-29|COLLECT COD|TRUCK|s. carefully +21603|901|4|2|42|75679.80|0.03|0.00|N|O|1997-04-23|1997-05-31|1997-05-05|NONE|MAIL|y bold excuses about the fur +21604|1530|31|1|28|40082.84|0.02|0.03|A|F|1992-04-07|1992-06-21|1992-04-12|NONE|REG AIR|into beans +21604|1122|59|2|8|8184.96|0.06|0.05|R|F|1992-07-11|1992-05-02|1992-08-07|COLLECT COD|RAIL|ly about the enticingly regular foxes. +21604|177|56|3|33|35546.61|0.00|0.05|R|F|1992-04-12|1992-05-21|1992-05-11|NONE|SHIP|al packages +21604|192|71|4|30|32765.70|0.10|0.07|R|F|1992-05-28|1992-05-14|1992-06-19|DELIVER IN PERSON|REG AIR|alms haggle +21604|489|77|5|22|30568.56|0.07|0.04|R|F|1992-07-01|1992-05-03|1992-07-14|NONE|RAIL|efully pending ac +21604|1034|40|6|42|39271.26|0.05|0.08|R|F|1992-07-28|1992-05-05|1992-08-07|TAKE BACK RETURN|TRUCK|yly carefully special inst +21605|902|37|1|28|50481.20|0.08|0.00|R|F|1992-05-04|1992-07-07|1992-05-13|COLLECT COD|TRUCK|wly beside the r +21605|1880|67|2|26|46328.88|0.07|0.05|A|F|1992-04-10|1992-06-06|1992-04-25|TAKE BACK RETURN|RAIL| quickly express bra +21605|1122|59|3|36|36832.32|0.09|0.06|R|F|1992-05-19|1992-06-10|1992-06-01|NONE|MAIL|y. furiously bold requests integrate +21605|540|71|4|2|2881.08|0.02|0.08|A|F|1992-05-19|1992-06-08|1992-05-26|DELIVER IN PERSON|FOB|ccounts use caref +21605|1789|90|5|18|30434.04|0.03|0.00|R|F|1992-06-16|1992-06-29|1992-07-13|COLLECT COD|REG AIR|pending dependenci +21605|61|37|6|23|22104.38|0.03|0.00|A|F|1992-07-10|1992-06-30|1992-07-20|TAKE BACK RETURN|AIR|thely quick asymptotes wake +21606|61|62|1|50|48053.00|0.00|0.08|R|F|1995-04-11|1995-03-09|1995-04-29|TAKE BACK RETURN|FOB|quickly regu +21606|397|54|2|23|29839.97|0.03|0.06|R|F|1995-04-19|1995-03-13|1995-05-15|COLLECT COD|REG AIR|ggle at the accounts +21606|162|15|3|29|30802.64|0.10|0.08|A|F|1995-04-04|1995-04-23|1995-04-20|TAKE BACK RETURN|TRUCK|f the regular packages +21606|630|31|4|5|7653.15|0.03|0.00|R|F|1995-05-06|1995-04-12|1995-05-22|DELIVER IN PERSON|RAIL|requests are fluffily +21606|1070|41|5|7|6797.49|0.09|0.07|A|F|1995-05-24|1995-03-14|1995-06-05|NONE|AIR|es. carefully ironic accounts +21606|1329|44|6|21|25836.72|0.02|0.07|A|F|1995-02-07|1995-04-08|1995-03-04|TAKE BACK RETURN|SHIP| bold dugouts. carefully +21607|1354|93|1|21|26362.35|0.05|0.04|A|F|1992-06-12|1992-05-29|1992-06-13|DELIVER IN PERSON|TRUCK|ly express pinto beans. slyly regul +21607|231|32|2|20|22624.60|0.07|0.04|A|F|1992-06-27|1992-04-19|1992-07-22|TAKE BACK RETURN|FOB| the final ideas. regular, regular ins +21607|1548|29|3|4|5798.16|0.01|0.06|A|F|1992-07-02|1992-05-21|1992-07-26|DELIVER IN PERSON|SHIP|iously special instructions. carefully u +21607|1790|91|4|5|8458.95|0.01|0.08|A|F|1992-04-16|1992-05-28|1992-05-09|TAKE BACK RETURN|AIR|ructions. regular, regular deposits integ +21607|383|84|5|12|15400.56|0.04|0.05|A|F|1992-04-28|1992-04-27|1992-04-29|NONE|SHIP|ronic ideas could haggle qu +21632|469|70|1|14|19172.44|0.08|0.00|A|F|1993-05-16|1993-02-24|1993-06-09|COLLECT COD|REG AIR|ole above the pack +21633|1965|10|1|30|56008.80|0.10|0.04|R|F|1994-07-25|1994-06-16|1994-07-26|COLLECT COD|TRUCK|uickly final requests. fluffily ironic +21633|1353|92|2|36|45156.60|0.09|0.06|A|F|1994-07-05|1994-06-16|1994-07-14|TAKE BACK RETURN|REG AIR|refully among the carefully even requests +21633|1726|69|3|10|16277.20|0.02|0.03|R|F|1994-05-18|1994-05-20|1994-05-25|COLLECT COD|TRUCK|eodolites wake above the pen +21633|1069|70|4|37|35892.22|0.04|0.05|R|F|1994-06-21|1994-05-15|1994-06-30|DELIVER IN PERSON|RAIL|ng the carefully p +21633|869|3|5|50|88493.00|0.08|0.03|R|F|1994-04-05|1994-05-13|1994-04-15|TAKE BACK RETURN|TRUCK|lyly unusual asymp +21633|872|73|6|34|60277.58|0.05|0.08|A|F|1994-04-19|1994-06-09|1994-04-28|COLLECT COD|FOB|onic courts. b +21633|473|3|7|25|34336.75|0.04|0.00|A|F|1994-04-10|1994-06-13|1994-04-26|DELIVER IN PERSON|MAIL|across the blithely furious requests nag sl +21634|1564|85|1|23|33707.88|0.07|0.04|A|F|1993-01-23|1993-01-05|1993-01-28|DELIVER IN PERSON|REG AIR|regular foxes. blithe +21634|1763|90|2|13|21641.88|0.07|0.03|R|F|1993-01-05|1992-12-03|1993-01-07|COLLECT COD|REG AIR|fully around the regular, regular reque +21634|1102|3|3|7|7021.70|0.05|0.04|A|F|1992-11-16|1993-01-09|1992-12-10|NONE|REG AIR|ickly. unusual theodolites among t +21634|324|9|4|44|53870.08|0.00|0.08|A|F|1993-02-14|1993-01-02|1993-03-08|DELIVER IN PERSON|SHIP|t accounts. furiously silent platelets c +21634|693|94|5|27|43029.63|0.10|0.07|A|F|1993-02-08|1993-01-07|1993-02-17|COLLECT COD|TRUCK|nts. regular requ +21635|1994|39|1|18|34127.82|0.09|0.07|A|F|1995-03-02|1995-01-17|1995-03-03|NONE|FOB|ly alongside of the care +21635|1173|46|2|13|13964.21|0.06|0.01|A|F|1994-12-15|1995-01-02|1995-01-06|NONE|AIR| fluffily silent ideas cajole furiou +21635|83|9|3|17|16712.36|0.01|0.00|A|F|1995-03-21|1995-01-15|1995-04-03|DELIVER IN PERSON|REG AIR|anent dinos. quietly unusu +21635|1338|53|4|3|3717.99|0.00|0.07|A|F|1994-12-11|1995-02-12|1994-12-22|COLLECT COD|RAIL|nt dependencies. quic +21636|78|4|1|19|18583.33|0.05|0.05|A|F|1994-10-10|1994-10-15|1994-10-31|NONE|REG AIR|wly regular deposits nag slyly daringly +21636|1981|14|2|35|65904.30|0.05|0.08|R|F|1994-08-29|1994-10-19|1994-09-14|COLLECT COD|REG AIR| slyly about the quickly reg +21636|4|80|3|42|37968.00|0.06|0.06|R|F|1994-12-09|1994-10-22|1995-01-02|COLLECT COD|TRUCK|, ironic deposits. regular, s +21636|653|47|4|44|68360.60|0.08|0.00|A|F|1994-09-15|1994-10-22|1994-10-12|DELIVER IN PERSON|REG AIR|. carefully pending request +21636|429|30|5|29|38553.18|0.09|0.00|R|F|1994-08-28|1994-10-10|1994-09-05|DELIVER IN PERSON|REG AIR|ending platelets. special dolphi +21636|825|25|6|20|34516.40|0.05|0.05|R|F|1994-11-03|1994-10-07|1994-11-09|TAKE BACK RETURN|TRUCK|ms cajole blithely. fluffily regular +21637|1661|62|1|33|51567.78|0.07|0.05|N|O|1998-03-14|1998-04-25|1998-04-13|TAKE BACK RETURN|SHIP|ly pending packages. express, special +21638|565|26|1|16|23448.96|0.09|0.03|A|F|1992-04-19|1992-06-12|1992-05-17|COLLECT COD|MAIL|nt requests. furiously even depo +21638|485|44|2|33|45720.84|0.08|0.01|A|F|1992-06-27|1992-06-02|1992-07-07|NONE|MAIL| slyly packages. regular, bol +21639|239|21|1|39|44429.97|0.04|0.08|R|F|1995-04-22|1995-04-11|1995-04-23|COLLECT COD|RAIL|uffily idle accounts believe blithely q +21639|1841|71|2|10|17428.40|0.09|0.07|A|F|1995-03-21|1995-04-26|1995-04-05|COLLECT COD|MAIL|sly slyly express de +21639|1569|90|3|34|49999.04|0.05|0.01|R|F|1995-02-23|1995-03-11|1995-03-02|TAKE BACK RETURN|RAIL|ve deposits de +21639|1248|60|4|14|16089.36|0.00|0.00|R|F|1995-04-16|1995-03-18|1995-05-02|DELIVER IN PERSON|SHIP|l pearls wake slyly special court +21639|1471|72|5|31|42546.57|0.03|0.07|R|F|1995-03-25|1995-04-07|1995-04-17|COLLECT COD|MAIL|r accounts? +21664|720|17|1|33|53483.76|0.01|0.03|A|F|1994-11-22|1995-02-08|1994-11-25|COLLECT COD|REG AIR| use fluffily furiously +21664|1543|64|2|33|47669.82|0.10|0.08|R|F|1995-01-19|1994-12-16|1995-01-29|DELIVER IN PERSON|MAIL|ts? bravely bold multipliers ca +21664|348|5|3|41|51181.94|0.06|0.05|R|F|1994-12-21|1994-12-29|1994-12-25|DELIVER IN PERSON|TRUCK|r the furiously pending +21664|369|70|4|23|29195.28|0.06|0.01|A|F|1994-11-24|1994-12-25|1994-11-25|TAKE BACK RETURN|SHIP|alongside of the special, even accoun +21665|160|87|1|26|27564.16|0.05|0.07|R|F|1992-11-10|1992-12-08|1992-11-18|DELIVER IN PERSON|RAIL|eans. even instructions promise carefully a +21665|40|41|2|4|3760.16|0.00|0.00|A|F|1993-02-12|1993-01-05|1993-03-02|COLLECT COD|TRUCK|rts. slyly even requests cajole ca +21665|244|26|3|5|5721.20|0.06|0.06|A|F|1993-02-03|1992-11-24|1993-03-05|NONE|TRUCK|ar platelets? packag +21665|1688|71|4|26|41331.68|0.00|0.06|A|F|1992-11-07|1992-11-19|1992-12-04|NONE|RAIL|es after the furiousl +21665|1659|60|5|17|26531.05|0.06|0.04|A|F|1992-12-15|1992-11-16|1993-01-07|DELIVER IN PERSON|REG AIR|ording to the pending theo +21666|151|52|1|5|5255.75|0.04|0.02|A|F|1994-04-03|1994-01-23|1994-04-22|NONE|FOB|. final pinto beans are slyly ac +21666|1840|27|2|41|71415.44|0.02|0.07|R|F|1993-12-21|1994-02-10|1994-01-05|TAKE BACK RETURN|AIR|ld furiously +21666|513|14|3|3|4240.53|0.06|0.03|A|F|1994-03-12|1994-02-22|1994-04-08|NONE|SHIP|pendencies poach fluffily pending, final +21666|1961|94|4|20|37259.20|0.03|0.00|A|F|1994-01-05|1994-01-19|1994-01-06|COLLECT COD|MAIL|, pending de +21667|1077|13|1|18|17605.26|0.00|0.04|N|O|1996-08-31|1996-07-07|1996-09-28|NONE|MAIL| the blithely ironic somas wake about th +21667|1878|79|2|50|88993.50|0.02|0.06|N|O|1996-06-05|1996-08-15|1996-06-25|COLLECT COD|TRUCK|final theodolite +21667|1455|95|3|27|36624.15|0.05|0.07|N|O|1996-09-17|1996-06-29|1996-10-11|TAKE BACK RETURN|RAIL| pearls across the regular ideas +21667|1352|91|4|24|30080.40|0.10|0.07|N|O|1996-05-28|1996-08-12|1996-06-18|TAKE BACK RETURN|FOB|al pains. furiously express theodo +21667|480|68|5|25|34512.00|0.02|0.06|N|O|1996-07-20|1996-07-27|1996-07-24|COLLECT COD|MAIL|. express, special dolphins cajole aroun +21667|1616|17|6|16|24281.76|0.05|0.06|N|O|1996-06-13|1996-08-12|1996-06-24|NONE|SHIP|ffily unusual ex +21667|1122|95|7|10|10231.20|0.04|0.07|N|O|1996-08-16|1996-07-20|1996-09-06|NONE|TRUCK|platelets boost after the slyly reg +21668|1994|27|1|38|72047.62|0.05|0.04|N|O|1996-12-22|1996-12-19|1997-01-15|DELIVER IN PERSON|SHIP|ully silent packa +21668|436|37|2|44|58802.92|0.05|0.06|N|O|1997-02-07|1997-02-01|1997-03-07|DELIVER IN PERSON|TRUCK|osits. regular ideas +21668|3|4|3|24|21672.00|0.04|0.01|N|O|1997-01-05|1997-01-30|1997-02-04|DELIVER IN PERSON|FOB|l accounts use +21668|192|45|4|24|26212.56|0.04|0.00|N|O|1997-01-07|1996-12-08|1997-02-02|NONE|TRUCK| furiously. furiously final +21669|1005|76|1|7|6342.00|0.06|0.04|N|O|1995-10-29|1995-09-09|1995-11-25|NONE|RAIL|instructions. carefully express braids a +21669|942|43|2|50|92147.00|0.04|0.05|N|O|1995-08-12|1995-09-21|1995-09-01|TAKE BACK RETURN|SHIP|ges against the slyly special ideas +21669|1866|10|3|9|15910.74|0.04|0.03|N|O|1995-07-28|1995-09-30|1995-08-27|TAKE BACK RETURN|MAIL|nto beans. slyly final instructions +21669|218|100|4|3|3354.63|0.09|0.07|N|O|1995-10-05|1995-09-17|1995-10-23|NONE|SHIP|fily enticing platelets. furiously sile +21670|1477|17|1|48|66166.56|0.00|0.07|R|F|1995-01-15|1995-03-28|1995-02-02|COLLECT COD|FOB|tect against the slyly bold ideas. +21670|345|30|2|37|46077.58|0.06|0.05|A|F|1995-02-20|1995-03-08|1995-03-04|COLLECT COD|REG AIR|l accounts +21670|464|23|3|38|51849.48|0.10|0.00|A|F|1995-03-01|1995-03-08|1995-03-08|COLLECT COD|MAIL|fluffily according to +21670|1457|36|4|30|40753.50|0.02|0.04|R|F|1995-01-15|1995-03-07|1995-01-25|NONE|TRUCK|asymptotes breach quickly +21671|1876|63|1|16|28445.92|0.00|0.06|R|F|1993-09-02|1993-07-18|1993-09-10|TAKE BACK RETURN|AIR|arefully ironic packages boos +21671|496|97|2|25|34912.25|0.09|0.03|A|F|1993-10-02|1993-08-02|1993-10-23|NONE|TRUCK|fully above the sometimes regular reques +21696|100|26|1|26|26002.60|0.03|0.03|R|F|1993-11-19|1994-01-16|1993-12-15|TAKE BACK RETURN|MAIL|eposits sleep +21696|1752|79|2|16|26460.00|0.09|0.08|R|F|1993-11-15|1993-12-11|1993-11-18|TAKE BACK RETURN|SHIP|ording to the ironic, even ide +21696|1028|34|3|35|32515.70|0.01|0.00|R|F|1993-12-19|1993-12-12|1993-12-29|DELIVER IN PERSON|AIR|yly ironic accoun +21696|669|63|4|45|70634.70|0.03|0.03|A|F|1993-10-29|1994-01-10|1993-11-08|COLLECT COD|RAIL|nts nag. blithely final accounts nag quic +21697|1742|85|1|42|69037.08|0.08|0.02|N|O|1996-04-13|1996-05-28|1996-04-29|COLLECT COD|FOB|l instructions according to the s +21697|123|24|2|42|42971.04|0.00|0.06|N|O|1996-03-25|1996-04-10|1996-04-24|DELIVER IN PERSON|MAIL|ges are furiously special, regular foxes +21697|1032|38|3|14|13062.42|0.02|0.01|N|O|1996-04-08|1996-04-30|1996-04-16|DELIVER IN PERSON|SHIP|. regular, express accounts cou +21697|128|81|4|34|34956.08|0.03|0.03|N|O|1996-03-31|1996-04-09|1996-04-06|TAKE BACK RETURN|SHIP|to beans are +21697|991|94|5|38|71895.62|0.04|0.04|N|O|1996-05-17|1996-04-25|1996-05-20|TAKE BACK RETURN|MAIL|ar deposits cajole +21698|563|24|1|18|26344.08|0.01|0.05|N|O|1998-03-26|1998-04-07|1998-04-04|TAKE BACK RETURN|REG AIR|cross the ironic packages. unusu +21698|843|44|2|36|62778.24|0.02|0.05|N|O|1998-03-16|1998-04-27|1998-03-25|TAKE BACK RETURN|TRUCK|r requests. unusual, silent pinto bean +21698|847|48|3|5|8739.20|0.04|0.01|N|O|1998-03-09|1998-05-02|1998-03-28|DELIVER IN PERSON|SHIP|s against the q +21698|710|7|4|7|11274.97|0.08|0.07|N|O|1998-04-19|1998-05-14|1998-05-04|COLLECT COD|MAIL| blithely fin +21698|820|87|5|25|43020.50|0.04|0.04|N|O|1998-04-22|1998-05-07|1998-05-17|DELIVER IN PERSON|FOB|ilently special reques +21698|1811|12|6|32|54809.92|0.05|0.06|N|O|1998-04-29|1998-05-13|1998-05-17|TAKE BACK RETURN|MAIL|riously. blith +21698|7|58|7|34|30838.00|0.05|0.08|N|O|1998-06-11|1998-04-25|1998-07-09|DELIVER IN PERSON|AIR|y final pinto beans are slyl +21699|215|97|1|20|22304.20|0.02|0.01|N|O|1995-12-25|1996-02-28|1996-01-10|DELIVER IN PERSON|SHIP|pendencies wake furiously +21699|1248|23|2|26|29880.24|0.07|0.07|N|O|1996-01-25|1996-01-08|1996-02-02|COLLECT COD|SHIP|ies wake blithely. th +21699|951|86|3|24|44446.80|0.10|0.03|N|O|1996-01-11|1996-02-29|1996-01-25|DELIVER IN PERSON|TRUCK|slyly. furiously regular pinto b +21699|1683|66|4|49|77649.32|0.05|0.02|N|O|1996-03-09|1996-01-30|1996-03-30|DELIVER IN PERSON|FOB|ss instructi +21700|1017|18|1|38|34884.38|0.06|0.00|N|O|1997-08-19|1997-10-02|1997-09-09|DELIVER IN PERSON|AIR| final deposits boost +21700|1309|10|2|35|42360.50|0.10|0.03|N|O|1997-11-14|1997-09-17|1997-12-13|DELIVER IN PERSON|SHIP|lyly regular excuse +21700|489|48|3|49|68084.52|0.03|0.07|N|O|1997-10-01|1997-09-10|1997-10-30|COLLECT COD|RAIL|old theodolites hinder above the care +21700|1867|54|4|21|37146.06|0.02|0.06|N|O|1997-08-13|1997-10-07|1997-09-10|TAKE BACK RETURN|MAIL|e according to +21700|1877|21|5|10|17788.70|0.10|0.05|N|O|1997-09-14|1997-08-21|1997-09-25|DELIVER IN PERSON|REG AIR|even packa +21700|1314|15|6|29|35243.99|0.05|0.00|N|O|1997-11-06|1997-10-06|1997-11-18|DELIVER IN PERSON|MAIL|n courts. sheaves are about the sl +21701|1403|82|1|7|9130.80|0.09|0.07|N|O|1996-04-17|1996-03-13|1996-05-03|DELIVER IN PERSON|RAIL|ckly. carefully special packages affix. qu +21701|1370|9|2|49|62297.13|0.00|0.07|N|O|1996-03-18|1996-02-20|1996-03-28|NONE|REG AIR| furiously final e +21702|446|76|1|13|17503.72|0.04|0.01|R|F|1994-01-11|1994-02-21|1994-01-18|DELIVER IN PERSON|TRUCK|es nod always reques +21703|1724|51|1|8|13005.76|0.01|0.07|A|F|1994-05-19|1994-04-17|1994-06-03|NONE|FOB|f the silent +21703|339|24|2|14|17350.62|0.09|0.01|R|F|1994-04-01|1994-04-11|1994-04-23|DELIVER IN PERSON|MAIL|he carefully bold pinto beans-- i +21703|501|92|3|49|68673.50|0.01|0.02|R|F|1994-05-20|1994-04-10|1994-05-31|NONE|MAIL|ake ruthlessly bold dependencies. brave +21703|377|78|4|3|3832.11|0.04|0.04|A|F|1994-05-16|1994-05-14|1994-05-22|DELIVER IN PERSON|SHIP|l requests. furiousl +21703|298|99|5|16|19172.64|0.08|0.06|R|F|1994-04-01|1994-04-23|1994-04-09|DELIVER IN PERSON|AIR|sleep furiously. blithely bold +21728|1217|92|1|6|6709.26|0.08|0.02|N|O|1997-02-03|1997-02-26|1997-02-26|DELIVER IN PERSON|MAIL|pliers haggle quickly along +21728|30|56|2|13|12090.39|0.08|0.07|N|O|1997-04-23|1997-03-14|1997-05-19|TAKE BACK RETURN|SHIP|s the carefully regular c +21728|365|22|3|32|40491.52|0.03|0.03|N|O|1997-02-06|1997-03-26|1997-02-10|DELIVER IN PERSON|SHIP|nusual packages cajole blithely. regular g +21728|1457|58|4|31|42111.95|0.08|0.01|N|O|1997-04-10|1997-03-19|1997-04-14|DELIVER IN PERSON|SHIP|ould sleep. regular, final deposits bo +21728|1248|49|5|29|33327.96|0.03|0.05|N|O|1997-03-13|1997-02-16|1997-04-12|DELIVER IN PERSON|RAIL|platelets use above the quickly bold idea +21729|373|30|1|21|26740.77|0.09|0.00|A|F|1992-12-21|1993-02-06|1993-01-11|COLLECT COD|AIR|r excuses. pending, unusual foxes wake alon +21729|1188|89|2|48|52280.64|0.09|0.07|R|F|1993-02-12|1993-02-07|1993-03-03|COLLECT COD|SHIP|r foxes. silent, ironic accounts +21729|766|31|3|49|81671.24|0.09|0.07|R|F|1993-02-16|1993-01-08|1993-03-18|COLLECT COD|SHIP|refully. accounts c +21729|1989|90|4|37|69966.26|0.00|0.04|R|F|1992-12-28|1993-02-16|1992-12-30|TAKE BACK RETURN|SHIP|e quickly after the blithely ironi +21729|949|50|5|31|57348.14|0.00|0.05|R|F|1993-01-11|1993-02-21|1993-01-31|DELIVER IN PERSON|FOB| detect. furiously unusual water +21729|1108|17|6|23|23209.30|0.09|0.02|A|F|1992-12-12|1993-01-17|1993-01-04|COLLECT COD|MAIL|pending packages are bold, even +21730|851|51|1|19|33285.15|0.09|0.07|N|O|1996-05-02|1996-04-18|1996-05-04|NONE|AIR|ays against the carefully p +21730|961|64|2|24|44687.04|0.06|0.04|N|O|1996-05-04|1996-05-14|1996-05-06|COLLECT COD|TRUCK|ze blithely. bold +21730|1236|48|3|28|31842.44|0.05|0.02|N|O|1996-04-18|1996-04-22|1996-04-24|COLLECT COD|FOB|gular, unusual a +21730|1084|20|4|21|20686.68|0.00|0.00|N|O|1996-03-22|1996-04-04|1996-04-12|NONE|RAIL|y bold platelets. e +21730|1453|54|5|10|13544.50|0.06|0.02|N|O|1996-04-12|1996-05-17|1996-05-04|COLLECT COD|AIR|pending pinto beans wake acco +21730|1079|80|6|8|7840.56|0.08|0.00|N|O|1996-04-13|1996-04-07|1996-04-15|NONE|AIR|sts nag across the slyly unusual instr +21731|927|28|1|23|42042.16|0.02|0.03|N|O|1995-12-13|1996-02-13|1995-12-31|COLLECT COD|SHIP| platelets will h +21731|1739|82|2|13|21329.49|0.03|0.06|N|O|1995-11-28|1996-01-14|1995-12-23|NONE|FOB|yly ironic accounts haggle. s +21731|1606|48|3|33|49750.80|0.06|0.08|N|O|1995-12-30|1996-01-10|1996-01-12|TAKE BACK RETURN|RAIL|counts. ironic excuses wake +21731|1563|84|4|9|13181.04|0.01|0.03|N|O|1996-01-16|1996-02-05|1996-01-25|NONE|SHIP|ly quickly close accou +21731|1931|32|5|8|14663.44|0.05|0.03|N|O|1996-01-20|1996-02-12|1996-02-13|DELIVER IN PERSON|RAIL|nal requests sleep a +21731|1044|50|6|25|23626.00|0.01|0.04|N|O|1995-12-29|1996-02-05|1996-01-13|TAKE BACK RETURN|SHIP|le around the expr +21732|581|42|1|13|19260.54|0.04|0.04|N|O|1996-02-10|1996-02-22|1996-03-02|COLLECT COD|REG AIR|unts sleep carefully. regular +21732|795|92|2|44|74614.76|0.06|0.01|N|O|1996-01-28|1996-02-10|1996-02-05|DELIVER IN PERSON|TRUCK|ncies. unusual +21732|1634|76|3|14|21498.82|0.03|0.00|N|O|1996-03-13|1996-02-19|1996-04-02|NONE|RAIL|e regular pinto beans. slyly eve +21732|1820|21|4|45|77481.90|0.03|0.08|N|O|1996-04-18|1996-03-29|1996-05-18|TAKE BACK RETURN|AIR|ongside of the final hoc +21732|715|48|5|3|4847.13|0.06|0.08|N|O|1996-03-09|1996-04-02|1996-03-13|DELIVER IN PERSON|SHIP|thely fluffily bold instructions. even grou +21732|260|88|6|23|26685.98|0.10|0.05|N|O|1996-01-29|1996-02-22|1996-02-08|COLLECT COD|MAIL|nal instructions: quickly regul +21733|546|7|1|42|60754.68|0.09|0.02|N|O|1997-01-04|1997-01-05|1997-01-09|DELIVER IN PERSON|REG AIR|uickly across the bli +21733|930|33|2|34|62251.62|0.06|0.00|N|O|1996-11-21|1997-02-15|1996-12-15|TAKE BACK RETURN|AIR|quickly. furi +21733|824|25|3|1|1724.82|0.04|0.00|N|O|1997-02-24|1997-02-01|1997-03-18|COLLECT COD|TRUCK|rash slyly final ideas. slyl +21733|743|76|4|27|44380.98|0.06|0.07|N|O|1997-03-06|1996-12-18|1997-03-27|COLLECT COD|FOB|ickly special platelets among the quickl +21733|1881|68|5|44|78446.72|0.05|0.03|N|O|1997-01-10|1997-01-23|1997-01-12|TAKE BACK RETURN|SHIP|ts cajole carefully. qui +21733|76|2|6|37|36114.59|0.08|0.07|N|O|1997-03-03|1997-01-11|1997-03-13|NONE|FOB|nic, special foxes. final, bold +21733|1807|8|7|44|75187.20|0.03|0.05|N|O|1996-12-28|1997-01-28|1997-01-10|NONE|RAIL|phins cajole blithely alongside of +21734|1212|13|1|4|4452.84|0.03|0.07|N|O|1996-03-13|1996-05-14|1996-03-16|NONE|REG AIR|ake against the warhorses. final r +21734|1320|35|2|5|6106.60|0.03|0.05|N|O|1996-04-24|1996-04-30|1996-05-05|DELIVER IN PERSON|SHIP|ly. requests alongsi +21734|1568|89|3|11|16165.16|0.04|0.00|N|O|1996-06-13|1996-04-29|1996-06-21|NONE|REG AIR|onic instructions +21734|508|99|4|42|59157.00|0.01|0.01|N|O|1996-03-24|1996-04-19|1996-04-09|DELIVER IN PERSON|FOB|es. furiously pending +21735|786|87|1|36|60724.08|0.01|0.01|A|F|1993-05-16|1993-05-25|1993-05-29|TAKE BACK RETURN|REG AIR|ts cajole slyly. deposits detect quickly +21735|1576|77|2|12|17730.84|0.10|0.03|A|F|1993-03-11|1993-05-20|1993-04-10|NONE|SHIP|y silent pinto beans. blithely +21735|1640|41|3|28|43165.92|0.00|0.02|R|F|1993-06-01|1993-05-21|1993-06-19|DELIVER IN PERSON|SHIP|ffily regular accounts cajole accord +21735|147|100|4|12|12565.68|0.04|0.07|A|F|1993-04-25|1993-04-21|1993-05-19|DELIVER IN PERSON|MAIL|y. regular foxes nag sl +21735|1216|54|5|33|36867.93|0.07|0.07|R|F|1993-05-27|1993-05-24|1993-05-29|DELIVER IN PERSON|REG AIR|regular deposits are slyly across the flu +21735|1877|64|6|14|24904.18|0.06|0.02|R|F|1993-06-19|1993-05-31|1993-07-18|NONE|FOB| special packages sleep slyly ironic theod +21760|1753|38|1|39|64535.25|0.05|0.00|A|F|1995-04-13|1995-03-11|1995-04-20|TAKE BACK RETURN|RAIL|kly. carefully bold accounts +21760|1159|60|2|2|2120.30|0.04|0.04|R|F|1995-02-05|1995-04-06|1995-02-10|COLLECT COD|TRUCK|packages detect accounts. fi +21761|1782|25|1|28|47145.84|0.05|0.05|N|O|1997-03-29|1997-04-06|1997-04-08|DELIVER IN PERSON|SHIP|l, regular ideas wake slyly +21761|1100|1|2|7|7007.70|0.08|0.05|N|O|1997-05-29|1997-04-26|1997-06-23|DELIVER IN PERSON|SHIP|ckly pendi +21762|1420|38|1|47|62106.74|0.00|0.00|N|O|1996-10-01|1996-11-14|1996-10-18|DELIVER IN PERSON|REG AIR|ly fluffily special accounts. fluffily +21762|623|55|2|45|68562.90|0.03|0.06|N|O|1996-10-06|1996-11-17|1996-10-31|NONE|SHIP|nts nag quickly. fluffily ironi +21762|1778|5|3|21|35275.17|0.07|0.02|N|O|1996-10-01|1996-11-01|1996-10-15|NONE|AIR|sts. carefully special +21762|815|49|4|30|51474.30|0.06|0.05|N|O|1996-09-12|1996-11-11|1996-10-10|COLLECT COD|REG AIR|ven ideas among the furiously final pin +21762|542|43|5|24|34620.96|0.06|0.02|N|O|1996-11-16|1996-10-26|1996-11-19|COLLECT COD|AIR|accounts. blithely spec +21763|1589|30|1|45|67076.10|0.08|0.00|A|F|1992-06-16|1992-07-06|1992-07-07|NONE|MAIL|hins after the final, regular dolphin +21763|188|41|2|2|2176.36|0.01|0.07|R|F|1992-08-06|1992-06-28|1992-08-20|NONE|SHIP|otornis. accounts lose slyly. furiously e +21763|1441|59|3|2|2684.88|0.07|0.05|A|F|1992-07-10|1992-08-20|1992-07-23|TAKE BACK RETURN|REG AIR| carefully regular dolphins +21763|230|58|4|39|44078.97|0.07|0.03|R|F|1992-07-25|1992-07-25|1992-08-19|TAKE BACK RETURN|RAIL| express request +21764|1682|65|1|25|39592.00|0.10|0.02|N|O|1997-06-02|1997-04-18|1997-06-25|DELIVER IN PERSON|SHIP|cajole fluffily express +21764|763|64|2|5|8318.80|0.00|0.01|N|O|1997-05-09|1997-04-01|1997-05-20|NONE|SHIP|requests impress fluffily i +21764|1801|31|3|14|23839.20|0.08|0.07|N|O|1997-03-03|1997-05-17|1997-03-12|DELIVER IN PERSON|FOB| across the furiously regular depo +21764|141|20|4|20|20822.80|0.05|0.03|N|O|1997-06-23|1997-04-23|1997-07-15|NONE|TRUCK|cajole furiou +21764|1693|35|5|18|28704.42|0.00|0.03|N|O|1997-04-24|1997-04-10|1997-05-13|NONE|TRUCK|l packages against t +21765|1742|85|1|19|31231.06|0.03|0.02|N|O|1997-05-13|1997-06-07|1997-05-25|DELIVER IN PERSON|FOB|y pending foxes. caref +21765|613|76|2|8|12108.88|0.09|0.02|N|O|1997-05-21|1997-06-08|1997-06-09|TAKE BACK RETURN|REG AIR|uffily stealthy dugouts among the even +21765|999|2|3|29|55099.71|0.10|0.05|N|O|1997-07-12|1997-05-08|1997-07-18|COLLECT COD|AIR|ular pinto beans about the final, fina +21766|178|79|1|17|18328.89|0.03|0.05|A|F|1994-09-20|1994-08-02|1994-09-29|COLLECT COD|MAIL|al deposits affix furiously slyly +21766|377|6|2|6|7664.22|0.01|0.02|A|F|1994-08-28|1994-08-03|1994-09-15|DELIVER IN PERSON|SHIP|c packages. final +21766|24|25|3|21|19404.42|0.00|0.02|R|F|1994-09-04|1994-08-17|1994-09-21|DELIVER IN PERSON|SHIP|es alongsi +21766|636|30|4|1|1536.63|0.07|0.01|A|F|1994-10-01|1994-08-17|1994-10-09|TAKE BACK RETURN|SHIP|into beans are blithely quick +21766|622|85|5|1|1522.62|0.09|0.07|R|F|1994-07-20|1994-08-08|1994-08-03|NONE|TRUCK|ages. final dolphins caj +21766|207|35|6|30|33216.00|0.05|0.07|A|F|1994-08-05|1994-08-28|1994-08-27|DELIVER IN PERSON|MAIL|es boost. slyly silent deposits +21767|852|19|1|36|63102.60|0.06|0.08|N|O|1998-06-27|1998-07-02|1998-07-23|NONE|FOB|nding theodolites are +21767|49|100|2|36|34165.44|0.05|0.00|N|O|1998-04-20|1998-06-09|1998-05-08|NONE|REG AIR| accounts across +21767|764|61|3|20|33295.20|0.01|0.00|N|O|1998-05-24|1998-06-02|1998-06-17|NONE|FOB|carefully regula +21767|1239|14|4|1|1140.23|0.02|0.01|N|O|1998-06-29|1998-06-12|1998-07-15|COLLECT COD|AIR|ronic platelets about the bold pac +21767|1712|39|5|37|59707.27|0.09|0.05|N|O|1998-07-03|1998-05-16|1998-07-21|TAKE BACK RETURN|RAIL|ckly pending theodolites u +21792|21|97|1|24|22104.48|0.04|0.05|A|F|1992-12-18|1992-11-03|1993-01-13|TAKE BACK RETURN|TRUCK|es sleep blithely above the close +21792|1343|82|2|4|4977.36|0.02|0.05|A|F|1992-09-28|1992-11-23|1992-09-30|DELIVER IN PERSON|REG AIR|l requests. carefully final pinto beans +21793|555|86|1|14|20377.70|0.04|0.07|A|F|1995-05-30|1995-05-26|1995-05-31|TAKE BACK RETURN|REG AIR| the regular, even accounts. st +21793|1561|42|2|20|29251.20|0.00|0.07|N|O|1995-08-15|1995-06-15|1995-09-11|TAKE BACK RETURN|REG AIR|eposits cajole. car +21794|1180|53|1|40|43247.20|0.08|0.07|R|F|1994-09-27|1994-08-29|1994-10-25|COLLECT COD|FOB| ideas. slyly +21794|629|92|2|48|73421.76|0.04|0.04|R|F|1994-08-24|1994-07-15|1994-09-10|DELIVER IN PERSON|FOB| bold packages abov +21794|466|25|3|25|34161.50|0.06|0.03|A|F|1994-09-17|1994-08-18|1994-09-18|TAKE BACK RETURN|AIR|ost carefully regular depo +21794|752|85|4|8|13222.00|0.06|0.01|R|F|1994-09-08|1994-09-07|1994-10-02|NONE|TRUCK| the bold packages. fin +21794|208|9|5|35|38787.00|0.08|0.02|R|F|1994-08-05|1994-08-18|1994-08-22|NONE|RAIL|ly express asymptotes across the packag +21794|1930|75|6|29|53125.97|0.01|0.03|R|F|1994-07-08|1994-08-15|1994-07-27|DELIVER IN PERSON|AIR|slyly final accounts cajole blithely care +21795|1522|63|1|29|41282.08|0.02|0.03|R|F|1993-07-12|1993-08-06|1993-08-02|NONE|SHIP|owly unusual packages snooze slyly. sil +21795|1705|90|2|24|38560.80|0.03|0.07|R|F|1993-09-30|1993-07-25|1993-10-20|DELIVER IN PERSON|AIR|ong the foxes. accounts nag. blithely even +21795|609|3|3|29|43778.40|0.04|0.02|A|F|1993-08-23|1993-07-14|1993-09-08|TAKE BACK RETURN|REG AIR|refully regular re +21795|523|54|4|23|32740.96|0.07|0.00|A|F|1993-10-07|1993-09-10|1993-10-17|DELIVER IN PERSON|TRUCK|es mold car +21795|1281|93|5|26|30739.28|0.06|0.04|A|F|1993-08-15|1993-07-15|1993-09-09|COLLECT COD|FOB|inal theodolites m +21795|399|28|6|49|63670.11|0.05|0.05|R|F|1993-06-15|1993-08-27|1993-06-19|TAKE BACK RETURN|MAIL|into beans cajole blithely theodolites. +21795|1500|18|7|34|47651.00|0.08|0.04|A|F|1993-09-18|1993-08-23|1993-09-23|TAKE BACK RETURN|MAIL|ccording to th +21796|17|18|1|24|22008.24|0.05|0.01|A|F|1992-05-31|1992-07-12|1992-06-08|NONE|REG AIR|nt courts. ironic foxes affix. fluffil +21796|1797|40|2|37|62855.23|0.03|0.01|A|F|1992-08-08|1992-07-04|1992-08-13|COLLECT COD|AIR|kly regular accounts believe quickly slyly +21796|1759|86|3|21|34875.75|0.09|0.00|R|F|1992-05-20|1992-07-16|1992-05-25|NONE|TRUCK|es affix furiously ironi +21796|1062|63|4|18|17335.08|0.08|0.03|R|F|1992-07-17|1992-06-25|1992-08-09|COLLECT COD|AIR|ly. express, regular +21796|930|65|5|22|40280.46|0.02|0.02|A|F|1992-08-06|1992-06-06|1992-08-17|COLLECT COD|RAIL|tes. blithely pending platelets haggle c +21796|1898|42|6|40|71995.60|0.08|0.04|R|F|1992-08-27|1992-06-30|1992-08-31|TAKE BACK RETURN|SHIP|r accounts alongside of the blith +21797|894|28|1|31|55641.59|0.05|0.08|N|O|1997-06-01|1997-06-25|1997-06-27|TAKE BACK RETURN|FOB| requests. blit +21797|750|47|2|41|67680.75|0.01|0.08|N|O|1997-08-19|1997-08-01|1997-09-10|DELIVER IN PERSON|RAIL|blithely regu +21797|271|26|3|2|2342.54|0.10|0.01|N|O|1997-07-13|1997-06-09|1997-07-21|NONE|REG AIR|g the caref +21797|309|94|4|31|37488.30|0.02|0.00|N|O|1997-07-28|1997-06-20|1997-07-31|TAKE BACK RETURN|FOB|phs. foxes sleep express reques +21797|281|63|5|9|10631.52|0.05|0.02|N|O|1997-09-05|1997-07-11|1997-09-22|TAKE BACK RETURN|REG AIR|ymptotes. carefully express frays +21797|401|60|6|38|49453.20|0.04|0.06|N|O|1997-08-07|1997-06-17|1997-08-18|COLLECT COD|FOB|se carefully after the busily unusu +21798|899|66|1|11|19798.79|0.09|0.07|N|O|1998-07-20|1998-09-02|1998-08-05|DELIVER IN PERSON|TRUCK|c theodolites sleep furio +21798|1398|13|2|49|63670.11|0.03|0.01|N|O|1998-06-27|1998-08-18|1998-07-25|DELIVER IN PERSON|REG AIR|n packages after the furiously expres +21798|350|7|3|15|18755.25|0.06|0.04|N|O|1998-08-11|1998-09-10|1998-09-08|NONE|RAIL|egular packages against +21799|1821|65|1|29|49961.78|0.09|0.05|R|F|1995-06-07|1995-06-04|1995-06-08|TAKE BACK RETURN|REG AIR|regular pac +21799|1371|86|2|12|15268.44|0.06|0.08|A|F|1995-05-20|1995-05-24|1995-05-28|TAKE BACK RETURN|FOB|aters. furiously final deposi +21799|591|22|3|34|50714.06|0.06|0.08|R|F|1995-05-05|1995-05-20|1995-05-11|DELIVER IN PERSON|AIR|the packages. furiously ironic deposi +21799|309|10|4|14|16930.20|0.02|0.04|A|F|1995-05-18|1995-06-06|1995-06-13|NONE|FOB| packages. carefully pending +21799|445|4|5|30|40363.20|0.06|0.01|A|F|1995-05-11|1995-06-07|1995-06-05|DELIVER IN PERSON|MAIL|ructions haggle carefully furiou +21799|1934|23|6|23|42226.39|0.04|0.00|N|F|1995-06-11|1995-05-24|1995-06-24|NONE|REG AIR|along the b +21824|1141|14|1|24|25011.36|0.09|0.04|R|F|1995-04-21|1995-03-11|1995-05-15|COLLECT COD|AIR|egular instructions. +21824|1973|62|2|3|5624.91|0.01|0.04|A|F|1995-03-30|1995-04-19|1995-04-08|NONE|AIR|express packages. +21825|1814|58|1|17|29168.77|0.03|0.06|A|F|1993-02-22|1993-03-01|1993-03-16|TAKE BACK RETURN|SHIP|quickly pending ideas. slyly unusu +21825|1579|20|2|4|5922.28|0.09|0.01|R|F|1993-03-29|1993-02-13|1993-04-05|COLLECT COD|RAIL|olphins grow carefully +21826|1786|13|1|4|6751.12|0.04|0.08|N|O|1996-06-29|1996-05-06|1996-06-30|COLLECT COD|MAIL| furiously regula +21826|1902|91|2|45|81175.50|0.09|0.02|N|O|1996-05-23|1996-06-07|1996-06-03|TAKE BACK RETURN|MAIL|uctions? blithely re +21826|975|10|3|24|45023.28|0.09|0.04|N|O|1996-05-09|1996-06-10|1996-05-13|TAKE BACK RETURN|MAIL|refully bold d +21826|1100|36|4|1|1001.10|0.10|0.08|N|O|1996-06-12|1996-04-27|1996-06-23|DELIVER IN PERSON|AIR|final packages. carefully unusu +21826|743|76|5|34|55887.16|0.03|0.02|N|O|1996-06-05|1996-05-17|1996-06-12|TAKE BACK RETURN|MAIL| the stealthily final foxes +21826|1205|6|6|28|30973.60|0.02|0.02|N|O|1996-07-18|1996-05-02|1996-07-29|NONE|MAIL|ter the blithe +21827|1779|6|1|38|63869.26|0.04|0.03|A|F|1992-12-13|1992-12-29|1992-12-25|TAKE BACK RETURN|TRUCK| sleep furiousl +21827|123|2|2|30|30693.60|0.04|0.06|R|F|1993-01-19|1993-01-03|1993-01-21|TAKE BACK RETURN|RAIL|ven deposits. blithely regular package +21828|755|56|1|12|19869.00|0.01|0.08|N|O|1997-01-03|1997-01-31|1997-01-22|COLLECT COD|FOB|elets. quickly ironic court +21828|657|89|2|6|9345.90|0.08|0.06|N|O|1997-03-18|1997-02-12|1997-04-07|DELIVER IN PERSON|RAIL|ag carefully escapades +21828|1273|48|3|47|55190.69|0.09|0.08|N|O|1997-02-18|1997-01-19|1997-03-06|DELIVER IN PERSON|FOB| depths haggle furiously about th +21828|500|88|4|10|14005.00|0.01|0.04|N|O|1996-12-22|1997-01-13|1996-12-24|COLLECT COD|MAIL|cial deposit +21828|982|51|5|28|52723.44|0.08|0.03|N|O|1997-01-22|1997-02-08|1997-02-20|DELIVER IN PERSON|TRUCK|e the final pinto beans. regular p +21828|648|49|6|50|77432.00|0.07|0.08|N|O|1997-03-19|1996-12-19|1997-03-22|COLLECT COD|RAIL|ions are slyly special deposits. slyly p +21829|1344|21|1|5|6226.70|0.10|0.01|N|O|1998-03-02|1998-03-10|1998-03-19|TAKE BACK RETURN|FOB| slyly expre +21830|1940|73|1|31|57100.14|0.04|0.06|A|F|1994-02-02|1994-03-13|1994-03-01|DELIVER IN PERSON|MAIL|ress packages sleep carefully about th +21831|697|60|1|7|11183.83|0.02|0.01|A|F|1994-11-16|1994-11-11|1994-12-06|TAKE BACK RETURN|REG AIR|re slyly about the ruthlessly special requ +21831|353|82|2|24|30080.40|0.09|0.03|A|F|1994-11-07|1994-11-07|1994-11-12|COLLECT COD|FOB|the quickly bold deposits. ironic pinto be +21831|674|68|3|35|55113.45|0.10|0.07|A|F|1994-10-08|1994-11-24|1994-11-01|COLLECT COD|REG AIR|dencies. fluffily ev +21831|977|78|4|5|9389.85|0.06|0.04|A|F|1994-11-26|1994-12-14|1994-12-04|COLLECT COD|FOB| brave courts haggle fluffily around t +21831|984|87|5|5|9424.90|0.02|0.01|A|F|1994-09-27|1994-11-10|1994-10-09|TAKE BACK RETURN|REG AIR|gular accounts about the slyly +21856|892|92|1|27|48408.03|0.08|0.07|R|F|1992-07-06|1992-06-19|1992-07-11|NONE|SHIP|slyly across the bold excuses. slyly even +21856|1832|62|2|26|45079.58|0.06|0.00|A|F|1992-05-23|1992-06-06|1992-05-29|NONE|REG AIR|ly even requests nag carefully furiously u +21856|264|46|3|1|1164.26|0.06|0.06|R|F|1992-05-06|1992-06-09|1992-05-11|NONE|TRUCK| ideas. express, fina +21856|658|59|4|8|12469.20|0.03|0.07|R|F|1992-07-22|1992-05-26|1992-07-28|COLLECT COD|SHIP|s attainments. bli +21856|1134|7|5|22|22772.86|0.00|0.01|R|F|1992-06-14|1992-06-02|1992-06-17|NONE|SHIP|iet requests hag +21857|675|7|1|17|26786.39|0.04|0.01|R|F|1992-10-12|1992-09-21|1992-10-15|DELIVER IN PERSON|SHIP|le; blithely bo +21858|508|99|1|36|50706.00|0.02|0.00|N|O|1997-12-30|1997-12-17|1998-01-24|COLLECT COD|AIR|y slyly special Tiresias. ironi +21858|154|55|2|33|34786.95|0.06|0.07|N|O|1998-01-23|1997-12-16|1998-02-20|TAKE BACK RETURN|TRUCK|ar, pending packages caj +21858|858|58|3|24|42212.40|0.08|0.07|N|O|1998-01-31|1998-01-12|1998-02-01|COLLECT COD|REG AIR|furiously unusual +21858|1893|37|4|10|17948.90|0.06|0.08|N|O|1998-01-16|1997-12-22|1998-02-06|NONE|RAIL|al deposits wake across t +21858|375|60|5|19|24232.03|0.01|0.05|N|O|1998-01-14|1998-01-14|1998-01-22|TAKE BACK RETURN|RAIL| alongside of the quickly spec +21858|45|71|6|8|7560.32|0.07|0.07|N|O|1997-11-11|1997-11-27|1997-12-02|DELIVER IN PERSON|RAIL|refully unusual packages. slyly ir +21858|419|20|7|21|27707.61|0.03|0.08|N|O|1998-01-18|1997-12-10|1998-02-06|DELIVER IN PERSON|AIR|s regular deposits about the slyly +21859|1567|88|1|37|54336.72|0.06|0.04|N|O|1995-12-15|1996-01-22|1995-12-16|NONE|TRUCK|blithely bold forges. quickly brave +21859|817|18|2|36|61841.16|0.07|0.03|N|O|1996-02-18|1995-12-26|1996-03-16|DELIVER IN PERSON|AIR| promise. express, ir +21859|1308|85|3|18|21767.40|0.07|0.03|N|O|1996-02-12|1996-01-04|1996-02-18|TAKE BACK RETURN|AIR|eposits. regular accounts +21859|936|37|4|7|12858.51|0.01|0.03|N|O|1996-01-12|1996-01-12|1996-01-18|TAKE BACK RETURN|FOB|quests above the dolphins boost slyly abo +21859|1933|22|5|12|22019.16|0.04|0.07|N|O|1996-02-18|1995-12-24|1996-02-29|TAKE BACK RETURN|AIR|posits sleep. ir +21860|924|27|1|42|76646.64|0.10|0.06|A|F|1992-05-11|1992-05-29|1992-05-27|DELIVER IN PERSON|AIR|ag. regular dolphins against +21860|1211|86|2|47|52273.87|0.05|0.06|R|F|1992-06-27|1992-07-06|1992-07-07|DELIVER IN PERSON|REG AIR|t theodolites haggle fluffil +21860|796|93|3|48|81445.92|0.09|0.03|R|F|1992-07-04|1992-07-23|1992-07-19|NONE|AIR|uests according to the regular, +21861|340|97|1|36|44652.24|0.04|0.04|A|F|1994-11-02|1994-10-12|1994-11-30|NONE|SHIP|he quickly +21861|827|27|2|31|53562.42|0.02|0.06|A|F|1994-10-17|1994-09-19|1994-11-04|DELIVER IN PERSON|SHIP|riously furiously pending instructions. +21861|222|77|3|15|16833.30|0.00|0.08|A|F|1994-08-26|1994-11-11|1994-09-15|TAKE BACK RETURN|SHIP|ag fluffily furiously pending +21861|1908|97|4|2|3619.80|0.00|0.07|A|F|1994-10-16|1994-09-30|1994-11-05|NONE|SHIP|osits breach across +21861|596|57|5|44|65849.96|0.08|0.01|A|F|1994-08-27|1994-10-15|1994-09-24|NONE|RAIL|he ironic deposits. quickly express asym +21861|179|80|6|29|31295.93|0.10|0.00|A|F|1994-11-17|1994-11-10|1994-12-06|NONE|MAIL|ve the reg +21862|1504|45|1|33|46381.50|0.01|0.05|R|F|1993-09-29|1993-10-18|1993-10-06|NONE|AIR|riously after the furiou +21862|1016|22|2|11|10087.11|0.09|0.00|A|F|1993-11-02|1993-12-10|1993-11-27|COLLECT COD|MAIL|ions. regular +21862|1353|54|3|28|35121.80|0.06|0.05|R|F|1993-11-25|1993-11-27|1993-12-02|DELIVER IN PERSON|SHIP|iously unu +21862|1592|13|4|22|32858.98|0.08|0.01|R|F|1993-10-23|1993-11-08|1993-11-12|NONE|SHIP|usly about the slyly fina +21863|37|88|1|12|11244.36|0.09|0.07|A|F|1994-01-20|1993-12-23|1994-01-24|DELIVER IN PERSON|FOB|lithely special packages. blithely +21863|857|91|2|27|47461.95|0.05|0.00|A|F|1994-03-08|1993-12-29|1994-04-01|TAKE BACK RETURN|SHIP|. final platelets use never acr +21863|946|47|3|48|88653.12|0.07|0.00|A|F|1994-01-08|1994-02-18|1994-01-23|DELIVER IN PERSON|SHIP|usly for the final +21863|1798|99|4|26|44194.54|0.08|0.01|A|F|1993-12-28|1994-02-07|1994-01-04|DELIVER IN PERSON|MAIL|l accounts sleep qui +21863|669|63|5|12|18835.92|0.10|0.07|R|F|1994-03-04|1994-01-07|1994-03-29|DELIVER IN PERSON|TRUCK|e blithely up the bold platelets +21888|1065|36|1|14|13524.84|0.07|0.08|A|F|1992-04-07|1992-06-01|1992-04-28|NONE|REG AIR|lly ironic accounts cajole blithely +21888|651|14|2|17|26378.05|0.01|0.08|R|F|1992-05-03|1992-05-22|1992-05-13|TAKE BACK RETURN|REG AIR|nt quickly f +21888|106|33|3|3|3018.30|0.06|0.08|A|F|1992-05-12|1992-05-23|1992-05-22|TAKE BACK RETURN|AIR|closely bol +21888|1709|52|4|12|19328.40|0.06|0.04|A|F|1992-07-09|1992-06-10|1992-08-03|TAKE BACK RETURN|REG AIR| carefully even accounts. slyly special p +21888|802|36|5|24|40867.20|0.04|0.06|R|F|1992-04-14|1992-05-30|1992-05-06|DELIVER IN PERSON|SHIP|nt, special accounts! furiousl +21889|348|5|1|48|59920.32|0.08|0.01|R|F|1993-07-21|1993-05-11|1993-08-12|TAKE BACK RETURN|AIR|. carefull +21889|202|57|2|29|31963.80|0.00|0.03|A|F|1993-05-14|1993-06-03|1993-05-15|COLLECT COD|AIR|he fluffily regular accounts haggle b +21889|1154|91|3|12|12661.80|0.02|0.04|R|F|1993-07-31|1993-06-19|1993-08-27|NONE|TRUCK|riously final ideas. fluffily ironic packa +21889|540|41|4|11|15845.94|0.08|0.05|R|F|1993-04-29|1993-05-15|1993-05-15|DELIVER IN PERSON|SHIP|nstructions nag slyly special depos +21889|184|11|5|11|11925.98|0.02|0.00|A|F|1993-07-17|1993-05-17|1993-07-30|DELIVER IN PERSON|AIR|ubt furiou +21889|1191|28|6|33|36042.27|0.06|0.02|R|F|1993-06-28|1993-06-13|1993-07-11|NONE|AIR|ructions caj +21890|787|88|1|33|55696.74|0.00|0.07|A|F|1995-03-06|1995-03-03|1995-03-27|COLLECT COD|AIR|ggle slyly unusual +21890|1051|87|2|22|20945.10|0.04|0.08|R|F|1995-02-09|1995-04-24|1995-02-20|COLLECT COD|RAIL|requests. even plate +21890|1708|35|3|4|6438.80|0.10|0.06|A|F|1995-05-01|1995-04-19|1995-05-20|DELIVER IN PERSON|RAIL|cuses are furio +21890|883|84|4|14|24974.32|0.07|0.00|R|F|1995-03-22|1995-04-23|1995-04-04|DELIVER IN PERSON|REG AIR|al instructions after +21890|1562|43|5|5|7317.80|0.10|0.01|A|F|1995-04-14|1995-04-06|1995-04-16|COLLECT COD|SHIP|efully unusual pi +21891|1401|80|1|6|7814.40|0.02|0.06|N|O|1997-12-20|1998-01-03|1997-12-21|TAKE BACK RETURN|AIR|sly regular ideas promise. blithely ex +21891|638|1|2|4|6154.52|0.01|0.05|N|O|1997-12-02|1997-12-31|1997-12-24|DELIVER IN PERSON|RAIL| boost quickly furiously final +21892|364|93|1|43|54367.48|0.03|0.02|R|F|1993-10-07|1993-08-20|1993-10-22|TAKE BACK RETURN|FOB|express pla +21893|931|66|1|25|45798.25|0.04|0.07|N|O|1995-12-08|1995-12-26|1995-12-10|DELIVER IN PERSON|REG AIR|ld foxes. accounts h +21893|1428|68|2|1|1329.42|0.06|0.02|N|O|1995-12-08|1995-12-30|1995-12-17|NONE|FOB|uriously. idly ironic pinto bean +21893|1834|64|3|18|31244.94|0.02|0.01|N|O|1995-12-27|1996-01-08|1996-01-05|DELIVER IN PERSON|REG AIR| sleep. slyly ev +21893|71|22|4|9|8739.63|0.05|0.07|N|O|1996-01-17|1996-01-08|1996-02-11|TAKE BACK RETURN|MAIL| unusual, even th +21893|26|2|5|29|26854.58|0.08|0.06|N|O|1996-02-16|1996-01-10|1996-03-13|DELIVER IN PERSON|AIR|s. furiously special d +21894|38|39|1|42|39397.26|0.01|0.01|N|O|1996-01-05|1996-03-18|1996-01-17|DELIVER IN PERSON|SHIP|quests cajole at the quickly ruthles +21894|18|94|2|50|45900.50|0.00|0.01|N|O|1996-02-01|1996-02-15|1996-02-22|TAKE BACK RETURN|RAIL|ajole furiously fluffily pend +21894|361|90|3|46|58022.56|0.10|0.00|N|O|1996-02-18|1996-02-14|1996-02-29|NONE|FOB|r foxes wake carefully above t +21894|1703|88|4|23|36908.10|0.08|0.05|N|O|1996-01-10|1996-02-21|1996-02-02|DELIVER IN PERSON|SHIP|tornis. unusual account +21894|1054|25|5|1|955.05|0.05|0.00|N|O|1996-01-24|1996-02-28|1996-02-01|COLLECT COD|TRUCK|ial deposits. carefully specia +21895|1578|59|1|20|29591.40|0.09|0.01|N|O|1998-08-21|1998-07-08|1998-09-10|NONE|MAIL|uffily dogged dolphi +21895|1178|51|2|21|22662.57|0.00|0.01|N|O|1998-07-12|1998-08-24|1998-08-07|NONE|REG AIR| unusual dep +21895|460|90|3|3|4081.38|0.05|0.06|N|O|1998-06-29|1998-07-04|1998-06-30|COLLECT COD|REG AIR|t slyly even deposits. slyly even asymp +21895|1598|79|4|13|19494.67|0.06|0.05|N|O|1998-07-17|1998-08-10|1998-08-03|NONE|RAIL|ter the packages. unusual, express p +21895|1660|2|5|47|73398.02|0.01|0.06|N|O|1998-07-30|1998-07-30|1998-08-07|COLLECT COD|AIR| slyly unusual excuses across the blith +21920|1328|5|1|13|15981.16|0.05|0.03|N|O|1998-06-10|1998-04-14|1998-06-13|COLLECT COD|FOB|iously stealthy courts. +21920|622|23|2|1|1522.62|0.03|0.05|N|O|1998-03-20|1998-04-14|1998-03-21|COLLECT COD|AIR|oys haggle furiously. slyly p +21920|533|94|3|7|10034.71|0.09|0.06|N|O|1998-06-12|1998-05-27|1998-06-16|DELIVER IN PERSON|TRUCK|counts are quickly above the fluf +21920|1245|46|4|47|53873.28|0.08|0.06|N|O|1998-04-01|1998-06-07|1998-04-28|COLLECT COD|MAIL|- blithely bold requests detect. qu +21920|883|84|5|1|1783.88|0.08|0.08|N|O|1998-06-23|1998-05-03|1998-07-02|NONE|TRUCK|ss excuses. pending, e +21920|198|99|6|2|2196.38|0.09|0.08|N|O|1998-05-02|1998-06-03|1998-05-08|NONE|SHIP|carefully against t +21920|126|27|7|8|8208.96|0.01|0.05|N|O|1998-05-06|1998-04-26|1998-05-07|DELIVER IN PERSON|REG AIR| among the pending, +21921|1591|72|1|33|49255.47|0.07|0.03|R|F|1995-01-05|1994-12-09|1995-02-04|NONE|REG AIR|ending, final dolphins are carefully stealt +21921|788|89|2|49|82750.22|0.09|0.04|A|F|1994-12-05|1994-11-08|1995-01-02|TAKE BACK RETURN|RAIL| across the permanently re +21922|471|30|1|27|37029.69|0.09|0.01|R|F|1994-12-14|1994-12-28|1995-01-13|COLLECT COD|MAIL|ent requests will haggle. quickly +21922|155|8|2|30|31654.50|0.08|0.03|R|F|1994-11-20|1994-12-18|1994-11-30|NONE|AIR|the quickly final excuses. reque +21922|692|55|3|10|15926.90|0.03|0.06|A|F|1995-02-19|1995-02-02|1995-03-13|COLLECT COD|FOB|s affix slyly final requests. accounts amo +21922|1656|98|4|46|71651.90|0.00|0.05|R|F|1995-02-06|1995-01-13|1995-02-22|COLLECT COD|REG AIR|y blithely ironic asymptotes. rut +21922|160|39|5|25|26504.00|0.03|0.04|R|F|1994-12-05|1994-12-30|1994-12-09|NONE|RAIL|final instruction +21922|1075|46|6|44|42947.08|0.08|0.06|R|F|1994-12-10|1995-01-25|1995-01-05|COLLECT COD|RAIL|uickly above the slyly silent acco +21923|877|44|1|49|87115.63|0.00|0.04|N|O|1998-08-09|1998-07-26|1998-08-24|TAKE BACK RETURN|SHIP|y along the regular, i +21923|793|94|2|13|22019.27|0.01|0.05|N|O|1998-10-05|1998-09-09|1998-11-01|DELIVER IN PERSON|TRUCK|even requests use blithely +21923|1931|20|3|7|12830.51|0.08|0.05|N|O|1998-07-14|1998-08-28|1998-07-27|DELIVER IN PERSON|RAIL|lly bold multipliers alo +21923|314|71|4|50|60715.50|0.07|0.06|N|O|1998-08-19|1998-07-27|1998-09-06|COLLECT COD|AIR| decoys doubt a +21924|300|1|1|25|30007.50|0.03|0.01|N|O|1998-08-19|1998-07-18|1998-09-06|DELIVER IN PERSON|TRUCK|ithely ironic requests cajole. pending +21924|1561|42|2|2|2925.12|0.06|0.00|N|O|1998-08-16|1998-07-13|1998-08-25|DELIVER IN PERSON|REG AIR|luffily quiet packages. furiously +21924|1921|22|3|27|49218.84|0.01|0.04|N|O|1998-07-11|1998-06-11|1998-07-31|NONE|TRUCK|ep regular foxes: furi +21925|220|2|1|38|42568.36|0.06|0.08|R|F|1992-09-14|1992-08-18|1992-09-30|COLLECT COD|RAIL|etect carefully fluffily even accounts. un +21925|1699|82|2|25|40017.25|0.08|0.05|A|F|1992-09-13|1992-08-25|1992-09-27|COLLECT COD|MAIL|y unusual packages mold after the exp +21925|493|52|3|32|44591.68|0.02|0.00|A|F|1992-08-22|1992-08-31|1992-09-09|DELIVER IN PERSON|TRUCK|ding sauterne +21925|1133|6|4|35|36194.55|0.05|0.06|A|F|1992-08-26|1992-09-17|1992-09-05|COLLECT COD|REG AIR|en, regular pinto beans kindle bli +21925|1898|42|5|38|68395.82|0.09|0.08|R|F|1992-08-07|1992-09-14|1992-08-26|COLLECT COD|TRUCK|refully unusual +21926|1248|23|1|48|55163.52|0.07|0.03|N|O|1996-09-09|1996-10-17|1996-10-01|NONE|FOB|kly? quick +21926|1264|76|2|48|55932.48|0.05|0.07|N|O|1996-09-25|1996-11-03|1996-10-12|COLLECT COD|RAIL|gular pinto beans are qui +21926|316|1|3|18|21893.58|0.10|0.02|N|O|1996-09-05|1996-11-14|1996-09-21|NONE|RAIL|ld theodolites +21927|938|73|1|35|64362.55|0.08|0.07|N|O|1996-02-15|1996-02-19|1996-02-21|DELIVER IN PERSON|FOB|omise furiously alongside of the furiou +21927|1330|45|2|24|29551.92|0.06|0.04|N|O|1996-02-27|1996-01-19|1996-03-10|DELIVER IN PERSON|MAIL|elets. dependencies maintain +21927|606|7|3|1|1506.60|0.07|0.04|N|O|1995-12-21|1996-01-26|1996-01-01|DELIVER IN PERSON|MAIL|odolites. slyly pending +21927|46|22|4|45|42571.80|0.07|0.04|N|O|1995-12-19|1996-01-31|1995-12-28|NONE|SHIP|ts. busily final accounts +21927|1940|73|5|46|84729.24|0.04|0.05|N|O|1996-02-02|1996-02-09|1996-02-20|TAKE BACK RETURN|REG AIR|. unusual, ironic tithes are fluffi +21927|1023|24|6|35|32340.70|0.08|0.01|N|O|1996-04-01|1996-03-09|1996-04-27|COLLECT COD|RAIL|lites about th +21952|1576|17|1|35|51714.95|0.01|0.03|A|F|1993-10-04|1993-09-15|1993-10-11|NONE|REG AIR|ng deposits are furiously after the bl +21952|1008|14|2|19|17271.00|0.10|0.03|R|F|1993-10-04|1993-08-17|1993-10-30|TAKE BACK RETURN|AIR|ve the slyly pending requests detect +21953|459|18|1|42|57096.90|0.08|0.03|R|F|1994-09-02|1994-08-14|1994-09-07|COLLECT COD|SHIP|requests. blithely i +21953|1852|53|2|1|1753.85|0.03|0.02|R|F|1994-09-06|1994-06-30|1994-09-30|COLLECT COD|RAIL|xes after the ruthlessly ironic instruct +21953|1094|65|3|13|12936.17|0.06|0.08|A|F|1994-09-02|1994-08-18|1994-09-21|DELIVER IN PERSON|FOB|l dinos. quickly bold accounts hagg +21954|1925|26|1|39|71249.88|0.01|0.07|A|F|1992-12-11|1992-12-06|1992-12-27|NONE|MAIL|s play furiously carefully close excus +21955|452|82|1|44|59507.80|0.07|0.00|N|O|1997-06-03|1997-06-16|1997-06-08|NONE|TRUCK|gle finally slyly regular requ +21955|1651|34|2|42|65211.30|0.10|0.03|N|O|1997-07-07|1997-05-20|1997-08-05|COLLECT COD|AIR|riously special dependencies. ca +21955|1715|16|3|12|19400.52|0.00|0.06|N|O|1997-05-11|1997-07-10|1997-05-15|COLLECT COD|MAIL|s around th +21956|895|62|1|38|68243.82|0.00|0.02|A|F|1995-05-19|1995-03-31|1995-06-12|COLLECT COD|SHIP|ckages. pending, ironic packages cajol +21956|795|96|2|41|69527.39|0.05|0.00|A|F|1995-04-17|1995-04-07|1995-05-11|DELIVER IN PERSON|SHIP|nal dependencies. fluffily bold +21956|1843|87|3|13|22682.92|0.05|0.08|A|F|1995-03-09|1995-03-09|1995-03-24|NONE|AIR|bove the expre +21956|1715|42|4|48|77602.08|0.00|0.03|R|F|1995-05-14|1995-03-25|1995-05-18|NONE|TRUCK|old deposits boost furiously idl +21956|1280|18|5|38|44888.64|0.05|0.00|A|F|1995-04-23|1995-04-08|1995-05-07|COLLECT COD|FOB|al deposits ca +21957|1605|88|1|43|64783.80|0.09|0.02|N|O|1996-06-17|1996-07-14|1996-06-18|COLLECT COD|TRUCK|lets wake carefully. pending depos +21957|1452|31|2|1|1353.45|0.05|0.01|N|O|1996-07-24|1996-07-26|1996-08-13|TAKE BACK RETURN|FOB| the special, regular pac +21958|1526|47|1|44|62810.88|0.06|0.05|A|F|1994-08-12|1994-07-10|1994-09-05|COLLECT COD|SHIP| ironic pack +21958|525|16|2|37|52744.24|0.01|0.08|R|F|1994-08-04|1994-07-20|1994-08-23|NONE|TRUCK|y final excuses. quickly ironic +21958|1376|53|3|47|60036.39|0.10|0.00|R|F|1994-08-30|1994-07-11|1994-09-06|DELIVER IN PERSON|REG AIR| the special, pending instructions boos +21958|1787|72|4|38|64173.64|0.09|0.01|A|F|1994-08-31|1994-08-12|1994-09-23|COLLECT COD|RAIL| against the ironic deposits. entic +21958|1197|70|5|28|30749.32|0.01|0.02|R|F|1994-08-01|1994-07-14|1994-08-22|COLLECT COD|TRUCK|haggle fluffily final sentim +21959|68|94|1|42|40658.52|0.09|0.05|N|O|1996-06-06|1996-04-12|1996-06-13|COLLECT COD|REG AIR|ncies engage slyly slyly even pain +21959|221|3|2|13|14575.86|0.07|0.02|N|O|1996-05-27|1996-04-26|1996-05-30|NONE|TRUCK|usly after the final, fin +21959|475|63|3|39|53643.33|0.05|0.08|N|O|1996-02-28|1996-05-13|1996-03-23|TAKE BACK RETURN|REG AIR|y bold accounts cajole bl +21959|351|36|4|36|45048.60|0.10|0.08|N|O|1996-02-24|1996-05-14|1996-03-19|COLLECT COD|REG AIR| haggle above the blithely +21959|772|73|5|37|61892.49|0.00|0.04|N|O|1996-05-16|1996-04-30|1996-06-15|COLLECT COD|FOB|uriously blithely even d +21984|1013|49|1|50|45700.50|0.02|0.08|N|O|1998-02-01|1998-01-04|1998-02-16|COLLECT COD|MAIL|final, silent theodolites. furiously pe +21984|1494|73|2|23|32096.27|0.06|0.00|N|O|1998-02-20|1997-12-02|1998-02-26|COLLECT COD|SHIP|side of th +21984|103|4|3|26|26080.60|0.02|0.03|N|O|1998-01-05|1997-12-28|1998-01-24|TAKE BACK RETURN|SHIP|uriously even foxes. furiously ev +21984|1782|83|4|22|37043.16|0.09|0.03|N|O|1997-10-31|1997-12-22|1997-11-16|TAKE BACK RETURN|REG AIR|ounts after the bold deposits hag +21985|199|100|1|40|43967.60|0.04|0.08|A|F|1994-08-28|1994-11-09|1994-09-23|COLLECT COD|SHIP|t quickly even sheave +21985|150|51|2|20|21003.00|0.01|0.04|R|F|1994-11-06|1994-10-28|1994-12-02|COLLECT COD|REG AIR|uriously express +21985|357|42|3|20|25147.00|0.09|0.01|A|F|1994-11-14|1994-09-26|1994-11-16|NONE|MAIL|riously regular dolphins integrate qu +21985|1468|69|4|29|39714.34|0.02|0.06|A|F|1994-09-04|1994-10-03|1994-09-21|COLLECT COD|FOB|odolites according to the furiously bol +21985|1947|48|5|25|46223.50|0.01|0.04|A|F|1994-11-13|1994-09-30|1994-12-12|DELIVER IN PERSON|MAIL|uriously regular +21985|596|87|6|23|34421.57|0.07|0.08|R|F|1994-11-03|1994-11-08|1994-11-10|DELIVER IN PERSON|FOB|symptotes! +21986|1654|96|1|10|15556.50|0.07|0.06|N|O|1997-11-08|1997-10-02|1997-11-17|NONE|REG AIR|against the regular, regular request +21986|479|80|2|14|19312.58|0.08|0.06|N|O|1997-11-03|1997-09-26|1997-11-04|DELIVER IN PERSON|TRUCK|. quickly silent ideas boost slyly blith +21986|711|8|3|3|4835.13|0.08|0.07|N|O|1997-09-12|1997-08-15|1997-09-16|DELIVER IN PERSON|TRUCK|efully blithely ironic accounts! final ins +21986|239|94|4|47|53543.81|0.05|0.03|N|O|1997-10-26|1997-09-11|1997-11-13|COLLECT COD|TRUCK| fluffily after the unusual pai +21986|274|2|5|1|1174.27|0.10|0.04|N|O|1997-11-02|1997-09-16|1997-11-23|COLLECT COD|REG AIR|press depen +21986|1805|35|6|31|52910.80|0.08|0.00|N|O|1997-09-08|1997-08-12|1997-09-17|DELIVER IN PERSON|REG AIR|ometimes aft +21986|1460|100|7|31|42205.26|0.06|0.04|N|O|1997-10-30|1997-09-03|1997-11-25|TAKE BACK RETURN|MAIL|sly final instructions. fluffily final se +21987|1591|72|1|39|58211.01|0.07|0.02|A|F|1992-09-29|1992-08-12|1992-10-27|COLLECT COD|TRUCK|eans use! blithely bold deposits a +21988|1832|33|1|41|71087.03|0.04|0.02|A|F|1993-05-13|1993-05-07|1993-06-08|DELIVER IN PERSON|AIR|y about the ironic, regular +21988|928|31|2|16|29262.72|0.01|0.04|A|F|1993-05-09|1993-06-23|1993-05-27|TAKE BACK RETURN|AIR|of the regul +21989|1551|92|1|47|68269.85|0.07|0.03|A|F|1995-04-20|1995-03-22|1995-05-18|TAKE BACK RETURN|TRUCK|ding dependencies boo +21989|741|38|2|10|16417.40|0.00|0.06|R|F|1995-04-30|1995-03-29|1995-05-08|NONE|RAIL|iously silent ins +21989|1378|55|3|20|25587.40|0.06|0.03|R|F|1995-04-06|1995-04-13|1995-05-06|TAKE BACK RETURN|SHIP|t the unusual accounts. deposits +21989|4|30|4|32|28928.00|0.02|0.02|N|F|1995-06-09|1995-05-02|1995-07-08|COLLECT COD|REG AIR|ing, silent theodolites nag b +21989|1830|17|5|31|53686.73|0.03|0.05|R|F|1995-03-05|1995-03-15|1995-03-10|TAKE BACK RETURN|AIR|l, unusual accoun +21989|166|45|6|36|38381.76|0.05|0.04|A|F|1995-02-13|1995-04-12|1995-02-18|TAKE BACK RETURN|REG AIR|yly ironic excuses run final, regular pa +21989|1529|50|7|24|34332.48|0.03|0.07|A|F|1995-05-17|1995-03-27|1995-05-28|DELIVER IN PERSON|REG AIR|above the furiousl +21990|1792|93|1|7|11856.53|0.03|0.02|A|F|1992-12-13|1992-11-15|1993-01-09|DELIVER IN PERSON|SHIP|uickly even ideas are furiously +21990|836|70|2|43|74683.69|0.02|0.07|A|F|1992-10-25|1992-11-16|1992-11-13|TAKE BACK RETURN|MAIL|cajole. sly +21990|1185|94|3|1|1086.18|0.05|0.06|R|F|1992-11-26|1992-10-14|1992-12-04|TAKE BACK RETURN|SHIP|gouts after the closely +21990|950|51|4|7|12956.65|0.07|0.04|A|F|1992-09-06|1992-09-22|1992-09-09|DELIVER IN PERSON|FOB|y even ideas wake alongsid +21991|1420|21|1|7|9249.94|0.09|0.08|N|O|1997-08-17|1997-08-07|1997-09-12|COLLECT COD|AIR|lites sleep slyly. final platelets hag +21991|439|98|2|27|36164.61|0.08|0.05|N|O|1997-07-06|1997-07-30|1997-07-18|COLLECT COD|RAIL|pecial pinto beans. fluffily spec +22016|253|35|1|50|57662.50|0.02|0.06|N|O|1996-11-09|1996-10-01|1996-11-25|TAKE BACK RETURN|REG AIR|t carefully. id +22016|1070|6|2|43|41756.01|0.04|0.01|N|O|1996-11-19|1996-10-08|1996-11-20|DELIVER IN PERSON|RAIL|usly across the slyly regular forges. +22016|163|64|3|37|39336.92|0.10|0.04|N|O|1996-09-18|1996-09-27|1996-09-22|COLLECT COD|SHIP|s use despite the slyly ironic package +22016|1428|46|4|10|13294.20|0.08|0.04|N|O|1996-09-09|1996-09-07|1996-10-01|NONE|AIR|e enticingly furiously +22016|381|38|5|49|62787.62|0.04|0.05|N|O|1996-10-03|1996-10-07|1996-10-10|COLLECT COD|TRUCK|oss the furiously final r +22016|429|88|6|46|61153.32|0.07|0.04|N|O|1996-10-02|1996-09-07|1996-10-21|NONE|FOB|nal foxes nag afte +22016|591|92|7|10|14915.90|0.02|0.05|N|O|1996-08-09|1996-10-11|1996-08-30|DELIVER IN PERSON|TRUCK| special, final theodo +22017|1924|13|1|37|67559.04|0.08|0.08|R|F|1995-03-02|1995-03-06|1995-03-12|TAKE BACK RETURN|RAIL|y ironic re +22017|383|68|2|25|32084.50|0.01|0.01|R|F|1995-03-25|1995-02-28|1995-04-13|NONE|SHIP|c packages. fluff +22018|957|60|1|44|81749.80|0.02|0.07|N|O|1996-07-20|1996-07-12|1996-08-11|COLLECT COD|RAIL|packages according to the slyl +22018|1357|96|2|42|52850.70|0.02|0.02|N|O|1996-10-02|1996-07-28|1996-10-08|NONE|AIR|sts are slyly unusual accounts. furiou +22019|233|88|1|16|18131.68|0.04|0.06|N|O|1995-11-07|1995-12-30|1995-12-02|TAKE BACK RETURN|AIR| carefully +22019|584|15|2|39|57898.62|0.08|0.01|N|O|1995-11-12|1996-01-28|1995-12-04|TAKE BACK RETURN|SHIP| boost quickly regular, furious depend +22020|957|60|1|6|11147.70|0.07|0.08|A|F|1993-08-12|1993-07-10|1993-08-24|TAKE BACK RETURN|AIR| fluffily alongside of the regu +22020|72|48|2|44|42771.08|0.08|0.06|A|F|1993-08-09|1993-06-22|1993-08-12|TAKE BACK RETURN|SHIP|fully across the quickly unusual ins +22020|1717|60|3|49|79316.79|0.02|0.06|R|F|1993-07-25|1993-06-22|1993-08-11|DELIVER IN PERSON|SHIP|nts. furiously pending reque +22020|849|50|4|15|26247.60|0.01|0.06|A|F|1993-08-03|1993-06-17|1993-08-22|NONE|REG AIR|thely idle theodolites. carefully stealthy +22020|674|37|5|31|48814.77|0.00|0.00|A|F|1993-06-27|1993-07-09|1993-07-23|DELIVER IN PERSON|REG AIR|lites. furiously unusual asympt +22020|1556|97|6|14|20405.70|0.07|0.01|R|F|1993-06-28|1993-06-29|1993-07-23|COLLECT COD|FOB|egular requests. furiously ironic +22020|1465|44|7|1|1366.46|0.09|0.08|A|F|1993-05-21|1993-07-02|1993-06-01|TAKE BACK RETURN|TRUCK|ckages haggle slyly against t +22021|752|53|1|5|8263.75|0.10|0.08|N|O|1996-06-07|1996-08-14|1996-06-21|NONE|TRUCK|nts haggle among the exp +22021|1362|1|2|1|1263.36|0.07|0.01|N|O|1996-08-21|1996-08-19|1996-09-01|COLLECT COD|REG AIR|es. deposits nag carefully after the s +22021|340|41|3|46|57055.64|0.09|0.08|N|O|1996-09-04|1996-07-15|1996-09-20|NONE|MAIL| wake according to the courts. +22021|622|54|4|19|28929.78|0.04|0.02|N|O|1996-08-15|1996-08-08|1996-08-19|DELIVER IN PERSON|AIR|ial pinto beans haggle quietly regula +22022|1507|48|1|14|19719.00|0.09|0.02|R|F|1993-07-12|1993-05-29|1993-07-19|DELIVER IN PERSON|AIR| ruthlessly carefully special tithes: blit +22022|1309|24|2|14|16944.20|0.00|0.05|R|F|1993-06-05|1993-05-31|1993-06-18|DELIVER IN PERSON|TRUCK|efully unusual accounts boost f +22022|292|47|3|13|15499.77|0.09|0.06|A|F|1993-07-26|1993-07-03|1993-08-07|TAKE BACK RETURN|MAIL|nts kindle against the carefully special pa +22023|1933|22|1|5|9174.65|0.07|0.04|N|O|1996-04-11|1996-03-02|1996-04-24|TAKE BACK RETURN|FOB|yly slyly bold pinto bean +22048|1041|47|1|9|8478.36|0.09|0.04|N|O|1997-12-09|1998-01-01|1997-12-17|DELIVER IN PERSON|TRUCK|thely regular requests sleep furio +22049|111|12|1|22|22244.42|0.10|0.00|N|O|1997-09-12|1997-10-15|1997-10-08|TAKE BACK RETURN|TRUCK|asymptotes. carefully bold reque +22050|107|34|1|21|21149.10|0.08|0.08|A|F|1993-07-30|1993-09-21|1993-08-08|TAKE BACK RETURN|AIR|print against the blithely +22050|1874|75|2|33|58603.71|0.07|0.04|R|F|1993-08-15|1993-08-04|1993-08-30|TAKE BACK RETURN|SHIP| carefully pending d +22050|1748|33|3|36|59390.64|0.01|0.07|R|F|1993-09-07|1993-08-15|1993-09-11|COLLECT COD|TRUCK|un except the bold deposits. blithely +22050|1234|72|4|46|52220.58|0.00|0.07|R|F|1993-06-30|1993-08-23|1993-07-22|DELIVER IN PERSON|MAIL|. quickly unusual accounts against the +22050|1118|91|5|48|48917.28|0.07|0.05|R|F|1993-10-07|1993-08-07|1993-10-17|NONE|REG AIR|. slyly regular the +22050|1551|92|6|19|27598.45|0.05|0.07|R|F|1993-09-18|1993-08-10|1993-10-08|DELIVER IN PERSON|FOB|e thinly unusual, ironic account +22051|38|39|1|43|40335.29|0.02|0.01|N|O|1996-03-14|1996-03-03|1996-03-18|NONE|REG AIR|ymptotes. care +22051|597|58|2|3|4492.77|0.05|0.03|N|O|1996-03-16|1996-02-25|1996-04-12|TAKE BACK RETURN|MAIL|unts run fluffily quickly pending dependen +22051|157|84|3|47|49686.05|0.09|0.07|N|O|1996-03-26|1996-02-22|1996-04-08|TAKE BACK RETURN|TRUCK|ts boost afte +22051|497|56|4|15|20962.35|0.00|0.06|N|O|1996-04-28|1996-03-02|1996-05-02|COLLECT COD|AIR|odolites use. fu +22051|1163|36|5|21|22347.36|0.03|0.04|N|O|1996-03-07|1996-03-11|1996-03-13|NONE|REG AIR|rns. slyly bold asymptotes nag quickly ca +22052|880|81|1|41|73016.08|0.07|0.01|N|O|1995-12-07|1996-02-05|1995-12-30|DELIVER IN PERSON|FOB|es. special, eve +22052|1168|5|2|28|29936.48|0.05|0.06|N|O|1995-12-01|1996-01-06|1995-12-23|NONE|MAIL|tions run quickly. pending, bo +22052|394|51|3|50|64719.50|0.10|0.04|N|O|1995-12-01|1996-01-09|1995-12-05|COLLECT COD|SHIP|onic asymptotes haggle q +22052|873|40|4|15|26608.05|0.04|0.03|N|O|1996-01-11|1996-01-16|1996-01-25|TAKE BACK RETURN|MAIL| final asymptotes. slyly pendin +22053|1664|47|1|35|54798.10|0.10|0.08|R|F|1993-09-12|1993-10-10|1993-09-21|TAKE BACK RETURN|REG AIR|onic deposits. final packages cajo +22053|783|48|2|17|28624.26|0.00|0.08|R|F|1993-10-14|1993-09-22|1993-10-23|DELIVER IN PERSON|FOB|ing, ironic theodoli +22053|347|48|3|16|19957.44|0.01|0.05|R|F|1993-11-28|1993-10-22|1993-12-27|COLLECT COD|MAIL|nal packages wake carefully accordi +22053|300|55|4|30|36009.00|0.06|0.04|R|F|1993-10-16|1993-10-21|1993-10-19|COLLECT COD|MAIL|s serve against th +22053|549|50|5|33|47834.82|0.02|0.01|R|F|1993-10-29|1993-11-13|1993-11-15|TAKE BACK RETURN|SHIP|tions. final +22053|956|25|6|46|85419.70|0.03|0.06|A|F|1993-12-15|1993-11-12|1993-12-16|COLLECT COD|REG AIR|he requests lose blithely among the accou +22054|1553|94|1|21|30545.55|0.00|0.00|R|F|1993-09-27|1993-09-17|1993-09-30|TAKE BACK RETURN|SHIP|lithely. always ironic +22054|1968|13|2|47|87888.12|0.03|0.00|A|F|1993-08-17|1993-09-21|1993-08-23|DELIVER IN PERSON|REG AIR|carefully special ideas n +22054|1675|99|3|26|40993.42|0.04|0.05|R|F|1993-08-17|1993-10-04|1993-08-26|NONE|SHIP| at the pending excuses d +22055|474|75|1|49|67349.03|0.01|0.01|R|F|1992-11-19|1992-10-25|1992-11-20|DELIVER IN PERSON|SHIP|ecial dolphins +22055|107|60|2|5|5035.50|0.04|0.02|R|F|1992-09-30|1992-12-02|1992-10-02|COLLECT COD|MAIL|ans. blithely ironic fox +22055|796|61|3|16|27148.64|0.10|0.02|R|F|1992-11-20|1992-12-23|1992-12-19|NONE|SHIP|yly along the slyly final +22080|936|39|1|49|90009.57|0.06|0.07|A|F|1993-01-31|1992-12-19|1993-02-21|COLLECT COD|SHIP|beans are ironic +22080|126|79|2|27|27705.24|0.01|0.08|A|F|1992-11-29|1992-11-18|1992-12-19|DELIVER IN PERSON|REG AIR|etect packages. blith +22081|1021|22|1|12|11064.24|0.01|0.04|A|F|1992-07-11|1992-07-07|1992-07-24|TAKE BACK RETURN|FOB|eans x-ray. fluffily exp +22081|431|32|2|12|15977.16|0.01|0.01|A|F|1992-08-18|1992-06-19|1992-08-30|COLLECT COD|MAIL|ns. quickly ironic requests +22081|253|54|3|3|3459.75|0.04|0.05|A|F|1992-07-05|1992-07-15|1992-07-08|DELIVER IN PERSON|RAIL| deposits lose quickly according to +22081|572|73|4|7|10307.99|0.02|0.03|R|F|1992-07-30|1992-07-10|1992-08-21|TAKE BACK RETURN|TRUCK|sits! blithely regular pa +22081|737|34|5|23|37667.79|0.09|0.00|R|F|1992-06-23|1992-07-15|1992-07-17|NONE|AIR|hely express instructions. ca +22081|661|55|6|49|76521.34|0.08|0.07|A|F|1992-06-06|1992-07-15|1992-07-03|NONE|TRUCK|ndencies. daringly +22082|757|58|1|17|28181.75|0.06|0.06|N|O|1997-10-12|1997-09-18|1997-10-27|COLLECT COD|SHIP|efully acros +22082|143|70|2|1|1043.14|0.00|0.00|N|O|1997-11-19|1997-10-20|1997-12-15|COLLECT COD|AIR| fluffy requests boost blithely. final, +22082|1107|8|3|38|38307.80|0.07|0.05|N|O|1997-10-02|1997-09-19|1997-10-26|TAKE BACK RETURN|TRUCK|furiously regular packages wake bli +22082|1284|22|4|34|40299.52|0.08|0.08|N|O|1997-10-21|1997-10-02|1997-11-20|NONE|TRUCK|oost slyly +22083|781|78|1|1|1681.78|0.05|0.08|R|F|1994-02-27|1994-03-20|1994-03-19|TAKE BACK RETURN|SHIP| the express asymptote +22083|1550|91|2|46|66771.30|0.03|0.07|R|F|1994-04-09|1994-04-20|1994-05-09|NONE|FOB|jole bravely according to the blithely spe +22083|882|49|3|16|28526.08|0.00|0.06|R|F|1994-03-04|1994-03-31|1994-03-31|TAKE BACK RETURN|RAIL|eposits after the bold, even packag +22083|484|43|4|17|23536.16|0.08|0.01|R|F|1994-04-02|1994-03-25|1994-04-14|COLLECT COD|AIR| furiously ironic packages +22084|543|44|1|32|46193.28|0.07|0.00|A|F|1992-09-04|1992-10-11|1992-09-10|DELIVER IN PERSON|REG AIR|riously. carefull +22085|1007|43|1|10|9080.00|0.03|0.05|A|F|1992-06-01|1992-05-24|1992-06-23|DELIVER IN PERSON|REG AIR|. blithely pending requests sleep slyly +22085|1333|34|2|8|9874.64|0.06|0.01|A|F|1992-03-11|1992-04-11|1992-03-28|COLLECT COD|MAIL| deposits among the carefully +22085|527|28|3|16|22840.32|0.08|0.05|A|F|1992-06-05|1992-05-06|1992-06-11|DELIVER IN PERSON|MAIL|efully final pinto be +22085|107|8|4|11|11078.10|0.09|0.02|A|F|1992-03-31|1992-04-22|1992-04-13|DELIVER IN PERSON|RAIL|e bold packages are furiously +22085|1923|24|5|17|31023.64|0.05|0.07|A|F|1992-05-12|1992-05-06|1992-05-29|TAKE BACK RETURN|SHIP|platelets. furiously ir +22085|1558|39|6|41|59841.55|0.02|0.06|R|F|1992-06-17|1992-05-30|1992-07-06|NONE|TRUCK|s wake above the deposits. blithely +22085|1258|33|7|8|9274.00|0.02|0.04|R|F|1992-03-21|1992-06-03|1992-03-25|COLLECT COD|TRUCK|ross the furiously sile +22086|975|76|1|10|18759.70|0.06|0.01|N|O|1996-03-10|1996-03-10|1996-04-05|COLLECT COD|AIR|hinly even reques +22087|1617|100|1|41|62263.01|0.06|0.04|R|F|1994-09-14|1994-09-16|1994-09-28|DELIVER IN PERSON|FOB|ns. slyly bold +22112|873|40|1|3|5321.61|0.02|0.07|N|O|1996-03-10|1996-04-17|1996-03-23|DELIVER IN PERSON|RAIL|nag blithely carefully final +22112|1467|46|2|27|36948.42|0.00|0.03|N|O|1996-02-01|1996-03-28|1996-02-04|TAKE BACK RETURN|AIR|gular notorni +22112|844|45|3|29|50600.36|0.10|0.07|N|O|1996-04-11|1996-03-31|1996-04-22|NONE|SHIP|riously regular pinto beans m +22112|731|32|4|25|40793.25|0.06|0.01|N|O|1996-05-08|1996-04-07|1996-05-28|DELIVER IN PERSON|MAIL| ideas are +22113|683|46|1|22|34840.96|0.00|0.03|R|F|1993-07-10|1993-05-04|1993-07-25|NONE|TRUCK|ly about the furiously +22113|273|74|2|22|25811.94|0.05|0.01|R|F|1993-04-07|1993-04-30|1993-04-17|TAKE BACK RETURN|AIR|longside of the p +22113|1044|15|3|19|17955.76|0.02|0.01|R|F|1993-06-20|1993-05-15|1993-07-09|NONE|TRUCK|elets cajo +22113|209|64|4|1|1109.20|0.07|0.03|A|F|1993-04-01|1993-06-06|1993-04-14|COLLECT COD|TRUCK|instructions cajole quickly. pending instru +22113|1166|67|5|6|6402.96|0.05|0.05|A|F|1993-06-17|1993-05-16|1993-07-09|NONE|AIR|ideas. blithely ironic d +22114|884|18|1|1|1784.88|0.08|0.06|N|O|1996-04-02|1996-05-16|1996-05-01|DELIVER IN PERSON|AIR|, ironic platelets. slyly regular r +22114|1908|9|2|23|41627.70|0.05|0.00|N|O|1996-06-10|1996-05-09|1996-06-14|TAKE BACK RETURN|AIR|he pending, bold excuses. slyly bl +22114|1649|50|3|9|13955.76|0.01|0.03|N|O|1996-06-05|1996-06-17|1996-06-06|COLLECT COD|REG AIR|s. regular +22114|718|19|4|2|3237.42|0.07|0.02|N|O|1996-05-13|1996-06-09|1996-05-21|DELIVER IN PERSON|RAIL|ilent tithes. fluffily even instruct +22114|529|60|5|23|32878.96|0.04|0.03|N|O|1996-06-26|1996-05-05|1996-07-01|COLLECT COD|AIR|n instructions do use +22115|1182|19|1|43|46576.74|0.04|0.03|R|F|1993-09-01|1993-07-31|1993-09-02|DELIVER IN PERSON|MAIL|ses x-ray so +22115|1729|56|2|15|24460.80|0.05|0.06|A|F|1993-07-13|1993-07-25|1993-07-25|TAKE BACK RETURN|SHIP| courts snooze blithely according to +22115|1949|94|3|23|42571.62|0.07|0.05|R|F|1993-09-30|1993-09-04|1993-10-08|DELIVER IN PERSON|REG AIR|ce of the bold, regular reques +22115|635|98|4|23|35319.49|0.02|0.04|A|F|1993-08-04|1993-08-22|1993-08-23|NONE|MAIL|s. regular theodolites +22115|128|55|5|14|14393.68|0.05|0.06|R|F|1993-10-13|1993-08-25|1993-10-16|DELIVER IN PERSON|FOB|dolites along the blithely final excu +22116|606|38|1|30|45198.00|0.07|0.02|N|O|1996-11-18|1996-09-16|1996-12-08|DELIVER IN PERSON|SHIP|s the blit +22116|1839|26|2|7|12185.81|0.06|0.02|N|O|1996-09-26|1996-11-11|1996-10-03|TAKE BACK RETURN|TRUCK|larly close requests. ex +22116|1760|3|3|50|83088.00|0.00|0.02|N|O|1996-10-13|1996-10-29|1996-10-23|TAKE BACK RETURN|SHIP| foxes run slyly +22116|1874|61|4|2|3551.74|0.00|0.08|N|O|1996-08-19|1996-10-31|1996-09-01|DELIVER IN PERSON|FOB| slyly even ideas haggl +22116|742|75|5|6|9856.44|0.01|0.03|N|O|1996-08-20|1996-09-28|1996-09-02|DELIVER IN PERSON|AIR|egular requests wake +22117|1662|45|1|37|57855.42|0.06|0.02|R|F|1993-11-16|1993-09-16|1993-11-22|DELIVER IN PERSON|AIR|uriously final excuses. quickly fina +22117|1894|38|2|11|19754.79|0.05|0.07|A|F|1993-09-20|1993-10-30|1993-10-11|TAKE BACK RETURN|FOB|n courts. furiously regular packages +22117|1502|23|3|29|40701.50|0.05|0.06|R|F|1993-09-24|1993-10-26|1993-09-29|TAKE BACK RETURN|SHIP|nal theodolites wake furio +22117|79|5|4|2|1958.14|0.01|0.06|A|F|1993-10-03|1993-10-03|1993-11-02|DELIVER IN PERSON|AIR|cies. even theodolites a +22117|1|27|5|27|24327.00|0.03|0.05|A|F|1993-11-07|1993-11-06|1993-11-15|NONE|SHIP|ar requests p +22117|1489|7|6|48|66743.04|0.09|0.00|R|F|1993-09-02|1993-10-11|1993-09-10|NONE|RAIL|sts wake brave deposi +22117|1147|20|7|5|5240.70|0.06|0.01|R|F|1993-08-27|1993-10-09|1993-09-11|COLLECT COD|AIR|to beans detect according to the +22118|993|62|1|10|18939.90|0.02|0.07|A|F|1994-01-30|1994-04-11|1994-01-31|COLLECT COD|TRUCK|e ideas. fl +22118|1770|71|2|24|40122.48|0.06|0.07|A|F|1994-02-10|1994-04-18|1994-03-12|COLLECT COD|SHIP|iously bold packages cajole boldly r +22118|645|39|3|37|57188.68|0.06|0.01|R|F|1994-02-13|1994-04-05|1994-03-06|NONE|REG AIR|requests use carefully. blit +22119|253|54|1|9|10379.25|0.03|0.08|A|F|1994-09-27|1994-10-15|1994-10-11|COLLECT COD|TRUCK|. quickly regular pint +22119|516|17|2|10|14165.10|0.07|0.03|A|F|1994-10-21|1994-10-14|1994-10-26|TAKE BACK RETURN|FOB|ites are bravely acco +22119|964|67|3|36|67138.56|0.07|0.04|A|F|1994-08-28|1994-09-27|1994-09-22|TAKE BACK RETURN|TRUCK| instructions thrash after the s +22119|1053|89|4|27|25759.35|0.06|0.04|R|F|1994-10-06|1994-09-19|1994-10-26|TAKE BACK RETURN|SHIP|ents integrate carefully final p +22119|1490|91|5|28|38961.72|0.01|0.03|A|F|1994-10-11|1994-10-11|1994-10-18|TAKE BACK RETURN|RAIL|ss the instructions: fluf +22119|382|39|6|34|43600.92|0.00|0.03|R|F|1994-09-16|1994-09-09|1994-10-04|COLLECT COD|REG AIR|ges sleep bl +22144|254|82|1|38|43861.50|0.02|0.04|N|O|1998-03-26|1998-05-04|1998-04-17|COLLECT COD|MAIL|ross the instructions use quic +22145|1865|66|1|36|63606.96|0.03|0.02|N|O|1996-04-02|1996-04-15|1996-04-26|NONE|RAIL|lites use furiously u +22146|1841|28|1|26|45313.84|0.02|0.06|N|O|1998-08-16|1998-07-18|1998-08-19|TAKE BACK RETURN|RAIL|l packages. bold dependencie +22146|695|89|2|6|9574.14|0.10|0.00|N|O|1998-07-10|1998-08-02|1998-07-15|COLLECT COD|REG AIR|alms mold. furiously final +22146|626|58|3|48|73277.76|0.10|0.03|N|O|1998-08-20|1998-07-24|1998-09-13|NONE|MAIL|ress, ruthless foxes sleep quickly al +22146|528|59|4|26|37141.52|0.08|0.02|N|O|1998-07-12|1998-08-11|1998-08-04|DELIVER IN PERSON|AIR|c deposits. slyly pending accounts are bli +22146|1593|74|5|48|71740.32|0.04|0.01|N|O|1998-05-23|1998-07-28|1998-06-19|TAKE BACK RETURN|REG AIR|as haggle regular +22147|1348|25|1|16|19989.44|0.04|0.02|A|F|1994-03-23|1994-04-08|1994-04-20|COLLECT COD|AIR|des are carefully after the dolphins. neve +22147|858|59|2|18|31659.30|0.10|0.05|R|F|1994-04-05|1994-03-03|1994-04-18|DELIVER IN PERSON|REG AIR| integrate quickly. quick +22147|350|79|3|7|8752.45|0.03|0.02|A|F|1994-02-09|1994-03-08|1994-02-10|DELIVER IN PERSON|REG AIR|ate furiously. special, ironic +22147|901|70|4|18|32434.20|0.05|0.01|A|F|1994-02-23|1994-02-17|1994-03-21|COLLECT COD|AIR|as are quickly +22147|673|74|5|43|67667.81|0.08|0.04|A|F|1994-02-16|1994-03-23|1994-03-12|COLLECT COD|REG AIR|s the regu +22147|347|76|6|29|36172.86|0.01|0.03|A|F|1994-04-05|1994-03-10|1994-04-23|TAKE BACK RETURN|SHIP|lar foxes. furiously furi +22148|124|25|1|40|40964.80|0.07|0.01|N|O|1998-05-20|1998-05-19|1998-05-30|NONE|FOB|ns. fluffily blithe instructions boost +22148|1527|68|2|30|42855.60|0.06|0.04|N|O|1998-06-14|1998-05-26|1998-07-03|NONE|TRUCK|efully regular forges. +22148|1886|87|3|38|67939.44|0.03|0.06|N|O|1998-07-02|1998-06-09|1998-08-01|DELIVER IN PERSON|TRUCK|lithely express deposits. quickly reg +22148|1470|71|4|12|16457.64|0.07|0.02|N|O|1998-03-25|1998-05-06|1998-03-31|COLLECT COD|SHIP| nod blithely special excuses. furiously +22148|170|49|5|48|51368.16|0.04|0.04|N|O|1998-06-12|1998-06-11|1998-06-20|DELIVER IN PERSON|AIR|hely slyly final ideas. e +22148|468|69|6|25|34211.50|0.02|0.04|N|O|1998-06-02|1998-04-24|1998-06-19|DELIVER IN PERSON|RAIL|s cajole quickly ironically final +22148|1676|18|7|46|72572.82|0.02|0.02|N|O|1998-07-06|1998-04-23|1998-07-21|COLLECT COD|REG AIR|nal deposits. furiously unusual ac +22149|466|67|1|38|51925.48|0.00|0.03|N|O|1996-01-01|1995-11-13|1996-01-05|DELIVER IN PERSON|RAIL|counts use pending +22149|970|71|2|34|63612.98|0.02|0.06|N|O|1995-10-24|1995-11-12|1995-11-07|DELIVER IN PERSON|AIR|ter the special do +22149|68|44|3|16|15488.96|0.09|0.07|N|O|1995-11-07|1995-12-16|1995-11-24|DELIVER IN PERSON|TRUCK|usly ironic packages cajole slyly sile +22150|1217|92|1|19|21245.99|0.10|0.00|N|O|1998-05-09|1998-03-05|1998-05-22|NONE|FOB|riously. slyly regular theodo +22150|11|87|2|4|3644.04|0.09|0.01|N|O|1998-05-25|1998-04-19|1998-06-16|NONE|AIR|xpress braids cajole fluf +22150|1130|3|3|10|10311.30|0.09|0.06|N|O|1998-04-26|1998-03-04|1998-05-24|DELIVER IN PERSON|FOB| instructions are carefully: s +22150|1361|76|4|30|37870.80|0.01|0.07|N|O|1998-05-15|1998-03-04|1998-05-23|TAKE BACK RETURN|RAIL|ideas haggle fluffily unusual dep +22150|1630|13|5|16|24506.08|0.07|0.00|N|O|1998-05-18|1998-04-05|1998-05-27|COLLECT COD|RAIL|ully ironic +22151|1085|86|1|37|36484.96|0.09|0.00|R|F|1993-11-25|1993-10-01|1993-12-13|TAKE BACK RETURN|REG AIR| deposits. slyly close instructions sol +22151|548|49|2|24|34764.96|0.06|0.02|R|F|1993-08-23|1993-10-02|1993-09-09|TAKE BACK RETURN|TRUCK|le. carefully ironic deposits haggle blit +22176|1000|35|1|47|42347.00|0.01|0.05|A|F|1994-09-04|1994-10-18|1994-09-23|TAKE BACK RETURN|MAIL| permanent +22176|1287|99|2|20|23765.60|0.01|0.04|A|F|1994-11-20|1994-11-11|1994-12-07|TAKE BACK RETURN|RAIL|olphins use slyly ironic waters. r +22176|1355|32|3|15|18845.25|0.07|0.03|A|F|1994-09-27|1994-10-20|1994-10-14|COLLECT COD|SHIP|t have to are blithely final requests. bl +22176|904|7|4|2|3609.80|0.03|0.02|R|F|1994-11-09|1994-10-15|1994-11-30|DELIVER IN PERSON|RAIL|ial deposits. special theodolites cajole +22176|1509|10|5|26|36673.00|0.08|0.00|R|F|1994-09-27|1994-11-10|1994-10-10|TAKE BACK RETURN|SHIP|y bold ideas sleep carefully. bold +22176|753|54|6|5|8268.75|0.02|0.03|A|F|1994-08-18|1994-10-15|1994-08-22|TAKE BACK RETURN|FOB|lly silent attainments accord +22176|478|79|7|20|27569.40|0.03|0.05|R|F|1994-09-15|1994-10-10|1994-10-07|NONE|FOB| packages. furious +22177|1064|70|1|49|47287.94|0.03|0.01|N|O|1997-08-16|1997-09-27|1997-09-09|TAKE BACK RETURN|TRUCK|ornis. packages around the carefully regul +22177|1103|4|2|15|15061.50|0.00|0.06|N|O|1997-07-31|1997-08-28|1997-08-21|TAKE BACK RETURN|AIR|t, bold ideas. blith +22177|1580|1|3|24|35557.92|0.10|0.01|N|O|1997-09-28|1997-09-30|1997-10-17|COLLECT COD|TRUCK|ironic packages are fluffily along the +22177|1709|10|4|27|43488.90|0.07|0.00|N|O|1997-11-01|1997-08-23|1997-11-06|NONE|TRUCK|regular requests. re +22178|57|58|1|22|21055.10|0.10|0.08|A|F|1994-05-04|1994-06-08|1994-06-01|COLLECT COD|REG AIR|gular deposits are furiously furiou +22179|1854|84|1|47|82524.95|0.00|0.06|A|F|1993-11-15|1993-12-15|1993-12-13|COLLECT COD|SHIP|ly among the furio +22180|1251|26|1|25|28806.25|0.10|0.08|N|O|1998-06-22|1998-06-26|1998-07-21|DELIVER IN PERSON|TRUCK|requests boost. dog +22181|775|72|1|27|45245.79|0.01|0.03|N|O|1996-01-11|1995-11-24|1996-01-19|COLLECT COD|MAIL| the accounts. finally dogged pac +22181|506|7|2|33|46414.50|0.04|0.00|N|O|1996-01-06|1995-12-20|1996-01-07|COLLECT COD|RAIL|, even deposits. furiou +22181|1827|14|3|48|82983.36|0.08|0.06|N|O|1995-12-24|1995-11-16|1996-01-01|TAKE BACK RETURN|RAIL|ag carefully. slyly regular platel +22181|604|98|4|34|51156.40|0.06|0.07|N|O|1995-11-22|1995-12-27|1995-12-16|DELIVER IN PERSON|SHIP|jole blithely even pinto +22182|1807|51|1|26|44428.80|0.09|0.01|A|F|1992-12-19|1992-11-14|1993-01-01|TAKE BACK RETURN|TRUCK|le quickly alongside o +22182|556|47|2|2|2913.10|0.03|0.05|A|F|1992-12-12|1992-11-27|1993-01-06|TAKE BACK RETURN|SHIP|g the ironic foxes. slyly thin packa +22182|454|84|3|14|18962.30|0.06|0.04|R|F|1992-10-29|1992-10-20|1992-11-25|COLLECT COD|REG AIR|equests haggle across the carefully +22182|1842|43|4|11|19182.24|0.03|0.05|R|F|1992-12-21|1992-11-10|1993-01-01|DELIVER IN PERSON|RAIL|kly accounts. quickly silent packages abou +22182|1627|69|5|12|18343.44|0.02|0.00|A|F|1992-12-05|1992-10-12|1992-12-14|TAKE BACK RETURN|REG AIR|long the ironic attainments thr +22183|1153|54|1|48|50599.20|0.00|0.08|A|F|1992-05-22|1992-06-05|1992-06-01|NONE|RAIL|xcuses cajole carefull +22183|1923|68|2|40|72996.80|0.01|0.01|A|F|1992-08-14|1992-05-26|1992-08-18|TAKE BACK RETURN|TRUCK|al packages. careful +22183|537|28|3|37|53188.61|0.06|0.01|R|F|1992-06-22|1992-05-25|1992-07-10|NONE|SHIP|ins. fluffily permanent pains sleep fluf +22183|376|5|4|46|58713.02|0.08|0.03|R|F|1992-05-20|1992-07-01|1992-06-10|NONE|REG AIR|ke blithely. slyly regular pac +22183|673|5|5|11|17310.37|0.02|0.01|R|F|1992-06-29|1992-06-15|1992-07-24|TAKE BACK RETURN|AIR|tions integrate bravely +22183|124|25|6|31|31747.72|0.09|0.00|R|F|1992-08-20|1992-07-23|1992-09-17|TAKE BACK RETURN|SHIP| bold, silent notornis. quic +22183|981|82|7|23|43285.54|0.06|0.01|R|F|1992-07-22|1992-06-06|1992-08-01|DELIVER IN PERSON|FOB|ng the slyly final packages boost alon +22208|1417|57|1|5|6592.05|0.01|0.08|R|F|1994-11-15|1994-12-03|1994-12-07|NONE|FOB|fluffily. express, blithe requests in +22208|1668|92|2|10|15696.60|0.01|0.03|A|F|1995-01-30|1994-12-28|1995-02-28|TAKE BACK RETURN|FOB|arefully regular +22208|282|10|3|24|28374.72|0.03|0.06|R|F|1995-01-19|1994-12-12|1995-01-26|COLLECT COD|SHIP|ial requests. +22208|885|85|4|2|3571.76|0.08|0.00|R|F|1994-11-10|1994-12-07|1994-11-27|DELIVER IN PERSON|REG AIR|uickly even pinto beans; fluffily +22208|1775|2|5|25|41919.25|0.00|0.01|R|F|1994-12-29|1995-01-01|1995-01-23|DELIVER IN PERSON|SHIP|quickly final foxes sleep fl +22208|255|37|6|6|6931.50|0.10|0.02|R|F|1994-10-30|1994-11-18|1994-11-07|DELIVER IN PERSON|FOB|ckly ironic deposits dazzle quickly after +22209|1196|5|1|43|47179.17|0.06|0.05|A|F|1993-11-04|1993-11-06|1993-11-08|COLLECT COD|MAIL|hlessly regular, idle sentiments. b +22209|229|57|2|12|13550.64|0.01|0.05|A|F|1993-10-08|1993-11-09|1993-10-18|TAKE BACK RETURN|AIR|ing to the slyly ironic pinto beans. idly +22209|857|24|3|13|22852.05|0.07|0.08|A|F|1993-10-15|1993-11-13|1993-11-11|COLLECT COD|SHIP|special instructions sleep +22210|829|96|1|49|84761.18|0.04|0.08|N|O|1995-10-03|1995-12-13|1995-10-07|NONE|TRUCK|unusual packages de +22210|674|75|2|49|77158.83|0.00|0.05|N|O|1996-01-01|1995-11-15|1996-01-14|COLLECT COD|SHIP|blithely special de +22210|852|53|3|3|5258.55|0.03|0.07|N|O|1995-12-11|1995-12-04|1996-01-02|COLLECT COD|SHIP|ironic ideas for the thin +22210|892|92|4|37|66336.93|0.04|0.04|N|O|1995-12-28|1995-11-04|1996-01-25|COLLECT COD|MAIL|s. carefully +22210|620|83|5|5|7603.10|0.01|0.02|N|O|1995-09-29|1995-12-04|1995-10-14|DELIVER IN PERSON|RAIL|eodolites. r +22211|1089|60|1|30|29702.40|0.10|0.00|N|O|1996-01-10|1995-12-07|1996-01-26|TAKE BACK RETURN|RAIL|st the always even pinto b +22211|1561|62|2|41|59964.96|0.09|0.02|N|O|1996-01-08|1995-11-10|1996-02-05|DELIVER IN PERSON|SHIP|osits cajole blithely furiously regular p +22211|1076|82|3|3|2931.21|0.07|0.06|N|O|1995-12-14|1995-12-31|1996-01-13|DELIVER IN PERSON|AIR|s grow. foxes shall sleep +22211|243|25|4|47|53732.28|0.09|0.06|N|O|1995-10-16|1995-12-23|1995-10-26|NONE|REG AIR| packages wake final theodol +22211|1297|98|5|12|14379.48|0.02|0.05|N|O|1995-12-10|1995-12-28|1995-12-30|NONE|SHIP|carefully across +22211|1872|2|6|12|21286.44|0.01|0.05|N|O|1995-11-10|1995-11-09|1995-11-27|TAKE BACK RETURN|SHIP|c accounts. dogged packages use pack +22212|139|92|1|8|8313.04|0.00|0.07|A|F|1993-12-21|1993-12-14|1993-12-23|TAKE BACK RETURN|AIR|unusual requests +22212|740|5|2|46|75474.04|0.00|0.08|R|F|1993-12-01|1993-10-30|1993-12-21|TAKE BACK RETURN|FOB|pendencies are furiously. slyly regular +22213|1417|35|1|39|51417.99|0.00|0.08|N|O|1997-08-13|1997-09-18|1997-08-18|COLLECT COD|FOB| excuses across the quickly re +22213|466|25|2|2|2732.92|0.02|0.03|N|O|1997-07-19|1997-09-04|1997-08-15|NONE|FOB|outs? furiously regular platelets sleep +22213|351|8|3|8|10010.80|0.08|0.01|N|O|1997-11-06|1997-09-25|1997-11-10|DELIVER IN PERSON|FOB|furiously special reques +22213|1077|13|4|12|11736.84|0.10|0.08|N|O|1997-07-30|1997-09-21|1997-08-19|TAKE BACK RETURN|FOB|ncies. blithel +22213|1179|80|5|8|8641.36|0.04|0.06|N|O|1997-11-02|1997-10-08|1997-11-30|NONE|FOB|encies. carefully final instructions subla +22214|989|92|1|6|11339.88|0.09|0.02|N|O|1998-11-04|1998-09-20|1998-11-30|DELIVER IN PERSON|REG AIR|inst the quickly regular accounts. bo +22214|21|72|2|48|44208.96|0.04|0.07|N|O|1998-08-21|1998-08-20|1998-09-12|TAKE BACK RETURN|REG AIR|e slyly regular platelets. +22214|780|45|3|48|80677.44|0.01|0.02|N|O|1998-09-13|1998-09-14|1998-09-23|TAKE BACK RETURN|MAIL|pending instructions. carefully expr +22214|385|42|4|49|62983.62|0.08|0.01|N|O|1998-10-12|1998-08-25|1998-10-26|DELIVER IN PERSON|REG AIR|ccounts cajole furiously even depos +22215|321|22|1|47|57402.04|0.05|0.05|N|O|1996-05-04|1996-05-27|1996-05-25|COLLECT COD|REG AIR|s nag slyly into the final, +22215|1891|35|2|12|21514.68|0.10|0.04|N|O|1996-04-10|1996-04-27|1996-05-07|COLLECT COD|SHIP|es. blithely sly accounts shoul +22215|1440|58|3|39|52316.16|0.00|0.06|N|O|1996-06-29|1996-05-02|1996-07-16|NONE|RAIL|mptotes hag +22215|1517|38|4|33|46810.83|0.10|0.01|N|O|1996-05-10|1996-05-09|1996-05-15|DELIVER IN PERSON|FOB|osits poach deposits. furiously ironic +22215|329|14|5|16|19669.12|0.01|0.05|N|O|1996-05-19|1996-06-11|1996-05-23|COLLECT COD|FOB|. slyly regular asymptotes are blit +22240|93|19|1|27|26813.43|0.00|0.03|N|O|1996-10-30|1996-12-23|1996-11-06|COLLECT COD|TRUCK|hely after +22241|391|20|1|42|54238.38|0.06|0.04|R|F|1994-05-07|1994-04-26|1994-05-12|DELIVER IN PERSON|REG AIR|pending packages sleep aroun +22241|1517|58|2|1|1418.51|0.05|0.05|A|F|1994-02-10|1994-04-30|1994-02-16|TAKE BACK RETURN|AIR| slyly qui +22242|1193|2|1|46|50332.74|0.05|0.01|R|F|1994-06-18|1994-08-27|1994-07-07|COLLECT COD|FOB| express accounts. blithely iro +22242|70|46|2|12|11640.84|0.04|0.06|R|F|1994-09-06|1994-08-15|1994-09-25|NONE|AIR|uctions affix sil +22242|891|91|3|25|44797.25|0.09|0.04|R|F|1994-08-19|1994-08-12|1994-08-27|NONE|SHIP|theodolites affix. +22242|851|52|4|29|50803.65|0.03|0.02|R|F|1994-08-07|1994-08-19|1994-08-18|TAKE BACK RETURN|MAIL|atelets haggle +22242|1226|38|5|17|19162.74|0.10|0.01|R|F|1994-09-08|1994-07-22|1994-09-20|TAKE BACK RETURN|REG AIR|counts against the ironic requ +22243|486|45|1|16|22183.68|0.06|0.01|A|F|1994-02-02|1994-03-28|1994-03-02|DELIVER IN PERSON|SHIP|ts eat carefully +22243|1752|53|2|49|81033.75|0.07|0.07|R|F|1994-04-27|1994-02-15|1994-04-30|COLLECT COD|TRUCK|quickly express in +22243|627|90|3|22|33607.64|0.02|0.07|A|F|1994-04-20|1994-03-17|1994-05-14|COLLECT COD|TRUCK|. foxes sleep +22243|273|55|4|36|42237.72|0.00|0.00|R|F|1994-03-03|1994-04-13|1994-03-10|TAKE BACK RETURN|AIR|ites. quickly even t +22243|1204|42|5|44|48628.80|0.02|0.06|A|F|1994-04-30|1994-03-13|1994-05-30|TAKE BACK RETURN|REG AIR|: carefully even +22243|27|3|6|21|19467.42|0.10|0.05|A|F|1994-04-21|1994-02-16|1994-05-10|COLLECT COD|TRUCK| always above the carefully regular +22244|909|78|1|4|7239.60|0.01|0.05|A|F|1995-05-05|1995-07-04|1995-06-04|DELIVER IN PERSON|REG AIR|round the slyly thin ideas: unusual +22244|1229|30|2|11|12432.42|0.08|0.00|N|O|1995-07-20|1995-06-24|1995-08-01|TAKE BACK RETURN|SHIP|ong the slyly even pi +22245|1002|3|1|16|14448.00|0.09|0.06|R|F|1994-07-11|1994-07-09|1994-07-25|TAKE BACK RETURN|AIR|n instructions? slyly spe +22245|220|2|2|2|2240.44|0.06|0.01|R|F|1994-06-19|1994-07-20|1994-07-01|DELIVER IN PERSON|AIR|ously even sauternes. carefully final +22245|1150|23|3|47|49404.05|0.10|0.03|A|F|1994-07-23|1994-07-10|1994-07-28|DELIVER IN PERSON|REG AIR|inal braids s +22245|366|51|4|7|8864.52|0.05|0.04|A|F|1994-06-16|1994-07-06|1994-06-29|TAKE BACK RETURN|MAIL|cording to the carefu +22246|1964|65|1|43|80236.28|0.07|0.01|N|O|1997-05-29|1997-07-01|1997-06-12|COLLECT COD|AIR|ar realms wake blithely about the blit +22246|773|6|2|29|48539.33|0.10|0.05|N|O|1997-05-26|1997-06-06|1997-06-24|TAKE BACK RETURN|FOB|old, even requests. packages nag f +22246|1597|38|3|44|65937.96|0.04|0.04|N|O|1997-07-26|1997-07-04|1997-08-02|DELIVER IN PERSON|FOB|osits. express pa +22246|1979|12|4|4|7523.88|0.10|0.02|N|O|1997-08-14|1997-06-19|1997-08-18|TAKE BACK RETURN|TRUCK| wake slyly near the quickly silent +22246|830|30|5|19|32885.77|0.06|0.07|N|O|1997-06-14|1997-07-07|1997-07-04|NONE|RAIL|re around the blithely final accounts. depe +22246|1393|8|6|32|41420.48|0.02|0.07|N|O|1997-06-05|1997-07-15|1997-06-25|COLLECT COD|AIR|latelets after the b +22246|334|63|7|5|6171.65|0.10|0.07|N|O|1997-07-06|1997-06-17|1997-07-08|COLLECT COD|MAIL|onic platelets cajole carefully expr +22247|1321|36|1|12|14667.84|0.05|0.00|N|O|1998-07-28|1998-05-08|1998-08-22|TAKE BACK RETURN|MAIL|tes haggle +22247|16|42|2|30|27480.30|0.06|0.07|N|O|1998-05-17|1998-05-11|1998-05-29|TAKE BACK RETURN|TRUCK| platelets nag al +22247|381|66|3|36|46129.68|0.07|0.00|N|O|1998-04-17|1998-06-11|1998-05-16|COLLECT COD|AIR|ly regular platelets are blithely f +22247|104|31|4|34|34139.40|0.00|0.00|N|O|1998-05-26|1998-05-17|1998-06-16|DELIVER IN PERSON|SHIP|ickly regular accounts sleep fluff +22247|942|43|5|5|9214.70|0.10|0.01|N|O|1998-06-19|1998-05-10|1998-06-27|DELIVER IN PERSON|TRUCK|fily excuse +22247|669|32|6|27|42380.82|0.10|0.06|N|O|1998-06-12|1998-05-22|1998-06-24|TAKE BACK RETURN|AIR|elets poach. blithely ironic accou +22272|933|34|1|32|58685.76|0.10|0.08|A|F|1992-06-16|1992-07-18|1992-06-25|TAKE BACK RETURN|SHIP|against the blithely regul +22272|1348|87|2|36|44976.24|0.07|0.01|A|F|1992-06-15|1992-06-18|1992-07-03|NONE|SHIP|xes. quickly even in +22272|1448|49|3|19|25639.36|0.09|0.08|A|F|1992-08-29|1992-07-31|1992-09-26|NONE|AIR|hely ironic ideas. final, even pinto bean +22272|828|29|4|21|36305.22|0.03|0.02|A|F|1992-08-22|1992-06-30|1992-09-04|DELIVER IN PERSON|REG AIR|al frets do haggle quickly blithely fi +22272|1548|89|5|21|30440.34|0.08|0.05|A|F|1992-08-09|1992-07-08|1992-08-26|TAKE BACK RETURN|AIR|ven dolphi +22272|570|71|6|43|63234.51|0.08|0.01|A|F|1992-06-18|1992-06-29|1992-07-02|DELIVER IN PERSON|RAIL|quickly even r +22273|1851|38|1|22|38562.70|0.08|0.01|N|O|1997-05-24|1997-03-01|1997-06-13|NONE|FOB|ual decoys wake +22273|1001|37|2|22|19844.00|0.06|0.03|N|O|1997-01-27|1997-02-25|1997-02-10|NONE|SHIP|ing, ironic asymptot +22273|307|64|3|20|24146.00|0.04|0.03|N|O|1997-03-07|1997-02-27|1997-04-03|NONE|AIR|eas are furiously carefully special foxes. +22273|1318|57|4|37|45114.47|0.09|0.02|N|O|1997-04-21|1997-03-11|1997-05-02|COLLECT COD|FOB|y alongside of the requests. +22273|1000|69|5|31|27931.00|0.06|0.07|N|O|1997-03-02|1997-03-20|1997-04-01|NONE|AIR| packages. even, regular +22273|462|63|6|21|28611.66|0.06|0.04|N|O|1997-03-30|1997-03-18|1997-04-09|COLLECT COD|RAIL|ly after the carefully ironic packages. +22273|844|44|7|42|73283.28|0.02|0.00|N|O|1997-02-07|1997-03-24|1997-02-14|COLLECT COD|FOB|rate slyly quick +22274|903|38|1|43|77567.70|0.09|0.02|A|F|1993-11-26|1993-09-18|1993-12-04|NONE|RAIL|packages cajole caref +22275|1250|25|1|4|4605.00|0.00|0.07|N|O|1997-09-13|1997-09-20|1997-09-15|COLLECT COD|RAIL|oss the pinto beans. carefull +22275|1270|8|2|26|30453.02|0.04|0.06|N|O|1997-10-14|1997-08-26|1997-11-07|NONE|MAIL|le fluffily quickly final theodolites. reg +22275|1930|19|3|35|64117.55|0.07|0.00|N|O|1997-09-02|1997-09-05|1997-09-23|DELIVER IN PERSON|FOB|anent pinto beans. slyly +22275|1396|97|4|7|9081.73|0.00|0.05|N|O|1997-10-02|1997-09-29|1997-10-03|COLLECT COD|SHIP| silent, ironic excuses. ca +22275|187|40|5|12|13046.16|0.05|0.08|N|O|1997-09-11|1997-09-26|1997-09-23|TAKE BACK RETURN|MAIL|ily regular hockey players. even accounts +22276|378|35|1|22|28124.14|0.03|0.03|A|F|1995-04-08|1995-04-07|1995-04-20|TAKE BACK RETURN|REG AIR| orbits x-ray. fluffily ironic re +22276|1632|15|2|26|39874.38|0.05|0.04|R|F|1995-05-13|1995-03-20|1995-05-28|TAKE BACK RETURN|REG AIR|ly final pa +22276|1902|91|3|37|66744.30|0.04|0.00|R|F|1995-04-11|1995-03-06|1995-04-23|COLLECT COD|REG AIR| wake alongs +22276|794|95|4|25|42369.75|0.02|0.04|N|F|1995-05-29|1995-03-27|1995-06-22|COLLECT COD|TRUCK|ronic accounts +22276|1436|15|5|41|54834.63|0.10|0.01|R|F|1995-04-27|1995-03-19|1995-05-18|COLLECT COD|TRUCK|ronic courts. furiously silent pinto beans +22276|51|27|6|50|47552.50|0.09|0.04|A|F|1995-05-10|1995-03-30|1995-05-27|TAKE BACK RETURN|TRUCK| excuses. accounts wake above the c +22276|1130|39|7|3|3093.39|0.04|0.01|N|F|1995-05-29|1995-04-18|1995-06-18|NONE|FOB|n accounts wake furiously pending asympto +22277|1635|77|1|42|64538.46|0.04|0.02|N|O|1998-06-09|1998-06-23|1998-07-02|COLLECT COD|REG AIR|gular packages. special, ironi +22277|359|44|2|47|59189.45|0.07|0.04|N|O|1998-07-13|1998-04-30|1998-08-03|NONE|AIR|requests cajole pending, ironic deposit +22277|1143|52|3|10|10441.40|0.09|0.01|N|O|1998-06-26|1998-06-13|1998-06-27|DELIVER IN PERSON|SHIP|xpress, iron +22277|35|11|4|22|20570.66|0.05|0.08|N|O|1998-04-09|1998-05-10|1998-04-22|DELIVER IN PERSON|REG AIR|ctions nag daringly bold packages. +22277|1723|50|5|30|48741.60|0.02|0.06|N|O|1998-07-11|1998-05-05|1998-08-02|DELIVER IN PERSON|RAIL| ironic accounts among the fluffy reque +22277|1872|59|6|39|69180.93|0.01|0.00|N|O|1998-04-30|1998-06-04|1998-05-18|NONE|AIR|final pinto beans boost bl +22278|910|13|1|27|48894.57|0.10|0.01|N|O|1996-08-01|1996-06-23|1996-08-31|DELIVER IN PERSON|REG AIR| requests. carefully final theodolites c +22278|548|39|2|14|20279.56|0.10|0.00|N|O|1996-04-21|1996-06-14|1996-04-24|NONE|RAIL| unusual accounts +22278|1294|32|3|34|40639.86|0.00|0.06|N|O|1996-07-17|1996-05-27|1996-07-30|TAKE BACK RETURN|TRUCK|oxes engage quickly final foxes. +22278|1696|79|4|6|9586.14|0.09|0.08|N|O|1996-05-13|1996-05-12|1996-06-12|NONE|MAIL|to beans af +22279|1477|56|1|5|6892.35|0.08|0.08|R|F|1995-01-24|1995-02-12|1995-01-28|NONE|FOB|the furiously unusual requests. blit +22279|1287|62|2|9|10694.52|0.10|0.06|A|F|1995-02-09|1995-03-01|1995-03-03|DELIVER IN PERSON|TRUCK|ly against the blithel +22279|146|47|3|14|14645.96|0.06|0.05|A|F|1995-04-09|1995-03-06|1995-04-17|NONE|MAIL|ccounts cajole idly furious +22279|509|100|4|15|21142.50|0.08|0.00|R|F|1995-01-30|1995-01-23|1995-02-14|DELIVER IN PERSON|SHIP|l dolphins boost thinly express theodolit +22304|1085|91|1|31|30568.48|0.02|0.00|N|O|1995-12-02|1996-01-25|1995-12-30|DELIVER IN PERSON|TRUCK|y about the quickly +22304|1336|37|2|24|29695.92|0.03|0.05|N|O|1996-02-24|1996-02-10|1996-03-01|NONE|FOB|g deposits nag carefully. final, regul +22304|1517|18|3|31|43973.81|0.07|0.04|N|O|1995-12-04|1996-02-09|1995-12-25|DELIVER IN PERSON|MAIL|e deposits. quickly unusu +22304|325|26|4|23|28182.36|0.00|0.05|N|O|1995-12-04|1995-12-27|1995-12-16|TAKE BACK RETURN|REG AIR|gular packages: fluffily pen +22304|843|43|5|43|74985.12|0.02|0.07|N|O|1996-01-10|1996-01-11|1996-01-23|NONE|RAIL|elets play. carefully express deposit +22305|1465|83|1|30|40993.80|0.05|0.04|R|F|1992-08-02|1992-08-27|1992-08-03|DELIVER IN PERSON|REG AIR|sits cajole +22305|620|21|2|1|1520.62|0.02|0.04|A|F|1992-07-27|1992-09-21|1992-08-21|COLLECT COD|SHIP|. unusual pinto beans nag acro +22306|1265|3|1|19|22158.94|0.05|0.05|N|O|1996-08-22|1996-09-30|1996-08-30|NONE|RAIL|y ironic hockey pla +22306|1916|5|2|13|23632.83|0.09|0.06|N|O|1996-11-14|1996-10-16|1996-11-26|DELIVER IN PERSON|MAIL|requests. ruthlessly p +22306|651|14|3|45|69824.25|0.09|0.04|N|O|1996-09-24|1996-09-27|1996-09-25|TAKE BACK RETURN|TRUCK|en requests about the ironic theodolites +22306|977|12|4|14|26291.58|0.10|0.02|N|O|1996-09-09|1996-11-08|1996-10-09|DELIVER IN PERSON|FOB|eas sleep blithely furiously reg +22306|252|7|5|8|9218.00|0.03|0.08|N|O|1996-09-01|1996-09-19|1996-09-26|NONE|REG AIR| cajole bravely above the regular excuses. +22307|1626|50|1|4|6110.48|0.08|0.03|A|F|1993-11-11|1993-11-27|1993-11-28|TAKE BACK RETURN|MAIL|ross the final requests sleep blit +22307|1598|39|2|30|44987.70|0.06|0.02|R|F|1993-09-25|1993-12-01|1993-10-15|COLLECT COD|FOB|even instruction +22307|419|20|3|12|15832.92|0.09|0.00|R|F|1993-10-17|1993-12-17|1993-11-01|COLLECT COD|RAIL| pending, final fo +22307|610|42|4|43|64956.23|0.08|0.07|R|F|1993-10-08|1993-11-07|1993-11-06|TAKE BACK RETURN|SHIP| final packages affix. slyly final +22307|658|90|5|30|46759.50|0.09|0.04|R|F|1993-10-02|1993-11-29|1993-10-14|COLLECT COD|TRUCK|ong the car +22308|1534|75|1|6|8613.18|0.06|0.06|A|F|1994-05-28|1994-06-24|1994-06-10|NONE|AIR|uthless theodolites at the thinly ironic +22308|70|96|2|38|36862.66|0.07|0.04|A|F|1994-05-14|1994-05-27|1994-05-18|NONE|AIR|sits grow above the fluffily unusual plat +22308|1004|75|3|16|14480.00|0.10|0.06|R|F|1994-04-13|1994-05-22|1994-04-30|COLLECT COD|FOB| cajole slyly. slyly expr +22308|1557|98|4|41|59800.55|0.09|0.04|R|F|1994-06-14|1994-05-11|1994-07-06|DELIVER IN PERSON|REG AIR|er the pending, even requests snooze slyly +22308|1798|99|5|13|22097.27|0.06|0.00|R|F|1994-05-03|1994-06-28|1994-05-23|TAKE BACK RETURN|AIR|blithely. fluffily pen +22308|1381|82|6|29|37189.02|0.07|0.06|A|F|1994-05-14|1994-05-14|1994-05-16|COLLECT COD|AIR|lly even packages against the ironic, +22309|654|48|1|26|40420.90|0.05|0.04|N|O|1997-04-04|1997-02-25|1997-04-05|NONE|FOB|ongside of the slyly even requests. slyl +22309|667|30|2|7|10973.62|0.05|0.00|N|O|1997-04-01|1997-02-01|1997-04-30|DELIVER IN PERSON|RAIL|kages. slyly regul +22309|1035|6|3|33|30888.99|0.03|0.04|N|O|1997-01-12|1997-02-18|1997-02-01|DELIVER IN PERSON|SHIP|ts are blithely. furiously special requests +22309|279|34|4|33|38915.91|0.03|0.06|N|O|1997-02-16|1997-03-08|1997-03-10|COLLECT COD|AIR| packages sleep +22309|500|30|5|38|53219.00|0.07|0.04|N|O|1997-02-21|1997-03-26|1997-02-24|DELIVER IN PERSON|AIR|onic reques +22309|652|15|6|47|72974.55|0.02|0.07|N|O|1997-01-13|1997-03-06|1997-01-14|DELIVER IN PERSON|REG AIR|gular hockey players promise a +22309|1734|19|7|47|76879.31|0.05|0.02|N|O|1997-04-14|1997-02-26|1997-05-04|NONE|AIR|final requests. pinto beans sleep. deposi +22310|1322|99|1|34|41592.88|0.02|0.08|N|O|1998-02-12|1998-01-02|1998-03-06|DELIVER IN PERSON|REG AIR|sts boost slyly slyly regul +22310|714|47|2|8|12917.68|0.01|0.07|N|O|1998-03-08|1998-01-22|1998-03-09|COLLECT COD|MAIL|equests use carefully blith +22310|1580|21|3|1|1481.58|0.06|0.08|N|O|1997-12-15|1997-12-26|1998-01-14|TAKE BACK RETURN|SHIP| slyly bold req +22310|1847|91|4|4|6995.36|0.06|0.06|N|O|1998-01-22|1998-01-21|1998-01-29|NONE|FOB|lyly blithely brave accounts. express ideas +22310|1876|20|5|15|26668.05|0.05|0.05|N|O|1998-03-23|1998-01-23|1998-03-30|TAKE BACK RETURN|REG AIR|. carefully ironic packages cajole furio +22310|1167|40|6|15|16022.40|0.06|0.00|N|O|1998-02-23|1998-01-11|1998-03-25|NONE|AIR|long the reg +22311|1270|71|1|27|31624.29|0.10|0.05|N|O|1998-08-03|1998-07-30|1998-08-22|COLLECT COD|MAIL|h furiously ruthless ideas. furiously ironi +22311|471|59|2|14|19200.58|0.10|0.08|N|O|1998-09-26|1998-07-27|1998-10-14|COLLECT COD|REG AIR|express asympt +22311|1989|34|3|35|66184.30|0.10|0.07|N|O|1998-08-09|1998-07-14|1998-08-16|TAKE BACK RETURN|MAIL|hs wake idly ab +22311|405|35|4|27|35245.80|0.09|0.04|N|O|1998-10-03|1998-08-25|1998-10-22|TAKE BACK RETURN|MAIL|, bold platelets? fu +22311|683|77|5|17|26922.56|0.05|0.00|N|O|1998-08-21|1998-08-11|1998-09-08|NONE|FOB| foxes maintain blithely. ironic packages b +22311|92|43|6|12|11905.08|0.09|0.08|N|O|1998-08-07|1998-09-02|1998-09-04|DELIVER IN PERSON|FOB|use instructions. fur +22311|1776|61|7|23|38588.71|0.04|0.00|N|O|1998-08-21|1998-07-20|1998-09-02|COLLECT COD|RAIL|yly even requests wake slyly along the sp +22336|866|67|1|13|22969.18|0.04|0.04|N|O|1997-09-17|1997-09-22|1997-09-20|NONE|TRUCK|ounts after the regular a +22336|689|83|2|26|41331.68|0.04|0.05|N|O|1997-09-30|1997-09-12|1997-10-29|NONE|REG AIR|gle furiously after the slyly sp +22336|188|89|3|39|42439.02|0.03|0.04|N|O|1997-09-19|1997-09-25|1997-10-03|NONE|REG AIR|osits wake quickly final packag +22336|61|12|4|44|42286.64|0.04|0.04|N|O|1997-08-09|1997-09-08|1997-08-10|TAKE BACK RETURN|RAIL|sts. slyly +22336|707|4|5|23|36977.10|0.04|0.06|N|O|1997-10-21|1997-09-02|1997-11-05|COLLECT COD|MAIL| regular packages are furiously carefully +22336|1639|81|6|38|58543.94|0.04|0.01|N|O|1997-09-17|1997-10-13|1997-09-21|NONE|RAIL|ic accounts wak +22337|1691|92|1|49|78041.81|0.10|0.00|N|O|1996-04-10|1996-05-07|1996-05-07|TAKE BACK RETURN|RAIL|bove the quickly express waters. even dep +22337|1060|66|2|40|38442.40|0.09|0.05|N|O|1996-04-24|1996-05-19|1996-04-26|COLLECT COD|MAIL|en deposits. blithely pending ideas +22337|226|81|3|3|3378.66|0.00|0.04|N|O|1996-06-01|1996-05-23|1996-06-21|DELIVER IN PERSON|AIR| dolphins. slyly even +22337|1098|34|4|45|44959.05|0.07|0.04|N|O|1996-03-04|1996-04-10|1996-03-19|DELIVER IN PERSON|SHIP|e ironic, ironic pa +22338|1094|100|1|37|36818.33|0.04|0.08|A|F|1993-06-02|1993-06-22|1993-06-28|NONE|TRUCK|g packages. sl +22338|1888|32|2|9|16108.92|0.02|0.02|A|F|1993-08-23|1993-07-02|1993-09-18|DELIVER IN PERSON|TRUCK|gular requests are according to the furi +22338|379|64|3|35|44777.95|0.05|0.05|R|F|1993-08-29|1993-06-20|1993-09-18|COLLECT COD|MAIL|he regular deposi +22338|626|89|4|1|1526.62|0.07|0.00|R|F|1993-08-04|1993-07-20|1993-08-24|COLLECT COD|REG AIR|hs sleep finall +22338|1635|77|5|42|64538.46|0.06|0.05|A|F|1993-08-13|1993-08-03|1993-08-29|TAKE BACK RETURN|FOB|ly bold ideas-- express, regular de +22339|978|13|1|22|41337.34|0.03|0.08|A|F|1995-02-09|1995-02-01|1995-03-01|COLLECT COD|MAIL|t platelet +22339|1415|55|2|25|32910.25|0.00|0.00|A|F|1995-03-02|1995-01-23|1995-03-22|TAKE BACK RETURN|SHIP|ar packages +22339|1091|27|3|37|36707.33|0.10|0.06|A|F|1994-12-24|1994-12-15|1995-01-19|NONE|RAIL|deas wake slyly along the ironic de +22340|1077|48|1|43|42057.01|0.05|0.06|N|O|1998-08-09|1998-07-14|1998-09-01|NONE|AIR|uriously express asymptotes. quic +22340|1552|93|2|16|23256.80|0.08|0.08|N|O|1998-05-27|1998-07-06|1998-06-09|NONE|SHIP| fluffily quiet accounts cajole quickly a +22341|1918|19|1|46|83715.86|0.02|0.01|N|O|1996-03-16|1996-02-07|1996-03-22|COLLECT COD|AIR|ites. deposits nag along the q +22341|736|33|2|50|81836.50|0.08|0.01|N|O|1995-12-03|1996-02-11|1995-12-18|COLLECT COD|SHIP|iously regular ideas wake f +22342|1681|82|1|50|79134.00|0.07|0.01|R|F|1994-08-06|1994-06-30|1994-08-27|TAKE BACK RETURN|SHIP|egular pac +22342|1564|85|2|21|30776.76|0.07|0.00|A|F|1994-07-31|1994-07-05|1994-08-05|DELIVER IN PERSON|RAIL| the blithely pending d +22342|1718|19|3|38|61548.98|0.02|0.02|R|F|1994-06-08|1994-08-22|1994-07-03|DELIVER IN PERSON|TRUCK| beans sleep slyly about th +22342|1523|24|4|25|35613.00|0.02|0.05|R|F|1994-06-16|1994-08-25|1994-07-08|COLLECT COD|SHIP|egular, regular packages cajo +22342|543|34|5|3|4330.62|0.03|0.01|A|F|1994-08-23|1994-08-14|1994-09-17|NONE|MAIL|n packages. ironic di +22343|900|67|1|26|46823.40|0.02|0.06|N|O|1996-04-30|1996-02-24|1996-05-28|COLLECT COD|REG AIR|y above the slyly silent deposits +22343|1137|74|2|35|36334.55|0.07|0.00|N|O|1996-03-29|1996-04-15|1996-04-04|TAKE BACK RETURN|SHIP|iously ironic instructions are slyly +22343|531|62|3|46|65850.38|0.01|0.00|N|O|1996-02-28|1996-03-11|1996-03-16|NONE|REG AIR|al gifts. spe +22368|89|65|1|1|989.08|0.09|0.07|A|F|1993-06-19|1993-03-30|1993-07-02|DELIVER IN PERSON|FOB| carefully +22368|1715|100|2|2|3233.42|0.06|0.02|A|F|1993-06-11|1993-05-21|1993-06-14|NONE|SHIP| use daringly about the permanently ir +22368|1410|28|3|12|15736.92|0.08|0.02|A|F|1993-03-13|1993-04-01|1993-04-04|TAKE BACK RETURN|TRUCK|carefully requests. expres +22368|1921|10|4|35|63802.20|0.08|0.06|R|F|1993-03-16|1993-05-06|1993-04-05|COLLECT COD|TRUCK|riously busy instructions +22368|1924|57|5|27|49299.84|0.08|0.00|A|F|1993-04-04|1993-04-13|1993-04-11|DELIVER IN PERSON|SHIP|etect carefully. +22368|1471|50|6|6|8234.82|0.06|0.01|R|F|1993-04-29|1993-03-22|1993-05-05|COLLECT COD|REG AIR|regular accounts. asymptotes cajole qu +22368|488|89|7|17|23604.16|0.04|0.03|A|F|1993-04-19|1993-04-25|1993-04-28|DELIVER IN PERSON|REG AIR|ndencies are after the +22369|978|79|1|41|77037.77|0.00|0.01|N|O|1996-05-25|1996-05-22|1996-05-29|TAKE BACK RETURN|FOB|fully express ideas cajole fu +22369|1185|94|2|34|36930.12|0.07|0.04|N|O|1996-06-28|1996-04-17|1996-07-16|NONE|REG AIR|ndencies wake. furiously i +22369|958|93|3|6|11153.70|0.02|0.04|N|O|1996-06-30|1996-05-11|1996-07-02|DELIVER IN PERSON|FOB|kages among the reg +22369|1978|11|4|38|71438.86|0.08|0.04|N|O|1996-04-09|1996-05-19|1996-04-26|DELIVER IN PERSON|REG AIR|out the careful +22369|1251|52|5|4|4609.00|0.08|0.01|N|O|1996-04-13|1996-04-20|1996-05-04|TAKE BACK RETURN|REG AIR| packages cajole blithely final pinto b +22370|1874|75|1|15|26638.05|0.03|0.04|N|O|1998-04-03|1998-01-14|1998-04-22|COLLECT COD|REG AIR|odolites. furiously final foxe +22370|345|30|2|23|28642.82|0.04|0.07|N|O|1998-04-11|1998-02-02|1998-05-05|COLLECT COD|TRUCK| blithely dogged grouches +22370|940|75|3|11|20250.34|0.02|0.01|N|O|1998-04-08|1998-03-08|1998-05-05|TAKE BACK RETURN|MAIL|boost blithely even dependencies. slyly re +22370|1266|4|4|24|28014.24|0.00|0.01|N|O|1998-04-15|1998-01-31|1998-04-25|COLLECT COD|SHIP|c, thin theodolites. slyly s +22370|525|26|5|48|68424.96|0.02|0.07|N|O|1998-04-01|1998-01-31|1998-04-13|COLLECT COD|REG AIR|s sleep fluffily theodolites. pendin +22370|389|90|6|7|9025.66|0.04|0.04|N|O|1998-02-01|1998-01-23|1998-02-21|NONE|MAIL| slyly across the silent foxes; furious +22371|1585|26|1|14|20812.12|0.04|0.04|A|F|1994-07-11|1994-06-21|1994-08-09|TAKE BACK RETURN|MAIL| requests haggle fluffily packages. sl +22371|364|49|2|8|10114.88|0.08|0.07|A|F|1994-06-10|1994-06-29|1994-06-20|DELIVER IN PERSON|AIR|ments. quickly sile +22371|1600|41|3|1|1501.60|0.03|0.03|R|F|1994-05-01|1994-06-06|1994-05-19|DELIVER IN PERSON|AIR|ding instructions cajole ironic request +22372|1701|44|1|8|12821.60|0.05|0.07|N|O|1997-07-01|1997-06-10|1997-07-31|COLLECT COD|REG AIR|ions engage slyly with the furiously r +22372|384|13|2|35|44953.30|0.01|0.06|N|O|1997-04-30|1997-06-03|1997-05-07|TAKE BACK RETURN|MAIL|ons haggle furiously about the +22372|146|73|3|40|41845.60|0.03|0.01|N|O|1997-06-15|1997-05-26|1997-07-11|COLLECT COD|MAIL|e according to +22372|1081|17|4|46|45175.68|0.01|0.08|N|O|1997-04-24|1997-05-22|1997-05-07|NONE|FOB|ding, regular deposits sleep furiously. +22372|1852|82|5|32|56123.20|0.09|0.08|N|O|1997-06-23|1997-06-14|1997-07-06|DELIVER IN PERSON|SHIP| carefully ironic asymptotes should +22372|64|90|6|15|14460.90|0.02|0.08|N|O|1997-04-24|1997-05-11|1997-05-22|TAKE BACK RETURN|MAIL|lly regular +22372|1310|87|7|22|26648.82|0.03|0.01|N|O|1997-05-27|1997-06-02|1997-06-14|COLLECT COD|RAIL|manently regular ac +22373|885|52|1|17|30359.96|0.02|0.05|A|F|1992-05-15|1992-05-02|1992-06-13|NONE|MAIL|cing accounts. even accounts run furi +22373|1175|12|2|23|24751.91|0.09|0.01|A|F|1992-05-20|1992-04-28|1992-05-31|COLLECT COD|AIR|r accounts caj +22373|676|8|3|33|52030.11|0.04|0.07|A|F|1992-06-29|1992-05-02|1992-07-21|NONE|SHIP| beans. regular inst +22373|1531|32|4|45|64463.85|0.03|0.01|A|F|1992-04-06|1992-06-16|1992-04-14|DELIVER IN PERSON|RAIL| fluffily regular packages. careful +22373|258|59|5|50|57912.50|0.06|0.02|R|F|1992-06-29|1992-05-15|1992-07-20|TAKE BACK RETURN|RAIL|pending co +22373|532|63|6|48|68761.44|0.08|0.05|A|F|1992-07-09|1992-05-02|1992-07-28|DELIVER IN PERSON|REG AIR| bold requests. sly, iro +22374|1209|21|1|20|22204.00|0.02|0.05|R|F|1994-12-18|1994-11-21|1995-01-02|TAKE BACK RETURN|REG AIR|. special, final theodolites cajole bli +22374|490|49|2|14|19466.86|0.04|0.01|R|F|1994-09-29|1994-12-14|1994-09-30|TAKE BACK RETURN|AIR|ly after the unusual, +22374|807|74|3|21|35863.80|0.03|0.05|R|F|1994-11-04|1994-12-18|1994-11-30|TAKE BACK RETURN|MAIL|e quickly. slyly ironi +22375|491|50|1|20|27829.80|0.03|0.08|A|F|1995-05-07|1995-05-28|1995-05-22|DELIVER IN PERSON|REG AIR|ounts are quickly blithely eve +22375|1557|98|2|8|11668.40|0.06|0.04|R|F|1995-04-13|1995-06-16|1995-04-23|DELIVER IN PERSON|TRUCK|ans are slyly. even, regular pac +22375|987|56|3|2|3775.96|0.05|0.00|A|F|1995-04-30|1995-06-25|1995-05-11|COLLECT COD|SHIP|y regular theodolites; furiou +22400|388|89|1|14|18037.32|0.02|0.08|A|F|1993-07-04|1993-08-15|1993-07-27|NONE|REG AIR|y against the regular frets. br +22400|798|63|2|13|22084.27|0.07|0.08|R|F|1993-07-28|1993-08-03|1993-08-05|COLLECT COD|TRUCK|e slyly above t +22401|21|72|1|4|3684.08|0.10|0.01|N|O|1997-03-05|1997-03-26|1997-03-19|TAKE BACK RETURN|FOB|le furiously. furiously pending accounts u +22401|547|48|2|24|34740.96|0.04|0.06|N|O|1997-05-31|1997-04-15|1997-06-29|DELIVER IN PERSON|RAIL|y. fluffily unusua +22402|658|21|1|16|24938.40|0.09|0.04|A|F|1994-07-19|1994-08-12|1994-08-15|NONE|FOB|ns around the slyly +22402|1678|2|2|27|42651.09|0.10|0.03|R|F|1994-08-03|1994-08-15|1994-08-04|DELIVER IN PERSON|REG AIR|nag slyly. blithely blithe plat +22402|284|66|3|9|10658.52|0.07|0.00|A|F|1994-06-08|1994-07-18|1994-06-23|COLLECT COD|FOB|was. furiously even +22402|501|2|4|33|46249.50|0.06|0.05|R|F|1994-06-09|1994-08-26|1994-06-29|DELIVER IN PERSON|REG AIR|instructions. instructions after the +22403|1063|99|1|24|23137.44|0.00|0.04|N|O|1998-09-05|1998-09-28|1998-09-28|DELIVER IN PERSON|TRUCK|lar, regular requests. +22403|468|98|2|44|60212.24|0.09|0.00|N|O|1998-11-29|1998-09-29|1998-12-05|COLLECT COD|AIR| nag carefully special ideas. +22403|560|21|3|34|49659.04|0.06|0.08|N|O|1998-10-19|1998-10-16|1998-10-24|NONE|MAIL|lithely doggedly special theodolite +22404|1742|43|1|18|29587.32|0.02|0.05|R|F|1994-02-20|1994-01-23|1994-03-06|COLLECT COD|TRUCK|phins. slyly even dep +22404|6|57|2|37|33522.00|0.05|0.02|A|F|1994-02-08|1994-01-26|1994-03-01|COLLECT COD|REG AIR|express dolphins nag after the theodolit +22404|1489|7|3|9|12514.32|0.00|0.03|A|F|1994-03-12|1994-01-27|1994-04-08|DELIVER IN PERSON|REG AIR| cajole sil +22405|1770|55|1|17|28420.09|0.03|0.01|N|O|1997-05-07|1997-05-28|1997-05-28|DELIVER IN PERSON|SHIP|fluffily final pearls along the regular, i +22406|1114|87|1|8|8120.88|0.00|0.01|N|O|1996-07-01|1996-04-26|1996-07-15|COLLECT COD|RAIL|e deposits. furio +22406|1054|90|2|32|30561.60|0.03|0.06|N|O|1996-07-01|1996-05-26|1996-07-18|NONE|REG AIR| final grouches +22406|1091|92|3|28|27778.52|0.00|0.02|N|O|1996-07-03|1996-05-19|1996-07-30|NONE|MAIL|usily unusual foxes. furiousl +22406|208|90|4|1|1108.20|0.07|0.00|N|O|1996-05-10|1996-06-15|1996-05-19|TAKE BACK RETURN|MAIL|ffily express pinto beans above the +22406|1295|33|5|11|13159.19|0.04|0.08|N|O|1996-06-07|1996-06-02|1996-06-14|TAKE BACK RETURN|AIR|integrate. even, final +22406|1186|87|6|39|42400.02|0.10|0.06|N|O|1996-04-20|1996-04-26|1996-05-12|TAKE BACK RETURN|REG AIR|carefully along the furious +22407|593|94|1|17|25391.03|0.01|0.03|R|F|1995-02-24|1995-01-28|1995-02-26|TAKE BACK RETURN|MAIL|ilent requests across the accounts wake +22407|1859|46|2|5|8804.25|0.06|0.08|R|F|1995-02-03|1995-01-17|1995-02-07|TAKE BACK RETURN|REG AIR|ions. close foxes aff +22407|743|44|3|39|64105.86|0.08|0.02|R|F|1995-01-28|1994-12-24|1995-02-09|DELIVER IN PERSON|MAIL|egular orbits +22407|1492|32|4|37|51559.13|0.01|0.02|R|F|1995-03-05|1995-01-31|1995-03-07|COLLECT COD|FOB| warthogs sleep quickly quic +22407|1682|65|5|41|64930.88|0.07|0.01|R|F|1994-12-09|1994-12-30|1994-12-20|TAKE BACK RETURN|MAIL|gular foxes sleep against th +22407|1769|96|6|12|20049.12|0.02|0.04|A|F|1994-11-30|1995-01-10|1994-12-18|DELIVER IN PERSON|FOB|quests are furiously unusua +22432|1944|45|1|42|77529.48|0.01|0.06|R|F|1993-03-18|1993-01-21|1993-04-11|COLLECT COD|REG AIR|accounts. pending requests affix silently f +22432|1897|41|2|47|84547.83|0.00|0.01|R|F|1993-01-05|1993-02-25|1993-02-01|TAKE BACK RETURN|MAIL|ide of the quickly express theodol +22432|1463|81|3|35|47756.10|0.04|0.07|R|F|1993-02-04|1993-01-13|1993-02-27|NONE|TRUCK|express courts among the bold pinto +22432|786|83|4|3|5060.34|0.05|0.02|R|F|1992-12-13|1993-01-27|1993-01-07|TAKE BACK RETURN|RAIL| blithely fluffily final ideas. blith +22432|1625|49|5|20|30532.40|0.02|0.03|R|F|1992-12-19|1993-01-29|1992-12-31|DELIVER IN PERSON|TRUCK|ckages haggle fluffily +22433|350|51|1|19|23756.65|0.08|0.04|N|F|1995-06-11|1995-05-01|1995-06-24|TAKE BACK RETURN|REG AIR|lites maintain furiously. quic +22433|1427|45|2|50|66421.00|0.05|0.02|R|F|1995-04-23|1995-04-16|1995-05-01|NONE|MAIL|d sleep furiously alongside of the +22433|735|100|3|44|71972.12|0.10|0.00|N|O|1995-06-21|1995-04-16|1995-06-28|TAKE BACK RETURN|REG AIR|tions. fluffily even pinto bea +22434|801|35|1|8|13614.40|0.02|0.06|A|F|1992-12-26|1992-11-06|1993-01-18|COLLECT COD|RAIL|e instructions nag alongside of the blit +22434|1157|94|2|47|49733.05|0.00|0.06|A|F|1992-09-06|1992-10-03|1992-09-17|DELIVER IN PERSON|RAIL|nic foxes cajole slyly about the +22434|477|78|3|47|64741.09|0.08|0.01|R|F|1992-09-08|1992-11-27|1992-10-05|NONE|MAIL|ly. furiously special packages +22434|544|45|4|40|57781.60|0.10|0.02|R|F|1992-12-04|1992-11-21|1992-12-18|COLLECT COD|AIR|y even, unusual excuses. quickly regular id +22434|1203|41|5|23|25396.60|0.06|0.08|R|F|1992-12-03|1992-10-31|1992-12-23|TAKE BACK RETURN|FOB|the furious +22434|447|48|6|45|60634.80|0.05|0.06|A|F|1992-11-14|1992-11-25|1992-12-05|DELIVER IN PERSON|SHIP|accounts are above the special +22434|1698|40|7|27|43191.63|0.10|0.06|R|F|1992-09-02|1992-10-25|1992-09-12|NONE|TRUCK|! ironic, unusual packages above t +22435|1488|6|1|45|62526.60|0.02|0.07|N|O|1997-07-20|1997-07-08|1997-07-21|TAKE BACK RETURN|RAIL|t thinly even acco +22435|1028|64|2|40|37160.80|0.08|0.02|N|O|1997-06-10|1997-08-05|1997-06-17|NONE|MAIL|sits integrate. special reque +22436|931|34|1|35|64117.55|0.08|0.08|N|O|1996-08-29|1996-07-01|1996-09-11|NONE|SHIP| quickly regular pinto +22436|1286|61|2|28|33243.84|0.04|0.08|N|O|1996-07-12|1996-07-20|1996-08-01|NONE|TRUCK|ng the blithely regular pinto +22436|37|88|3|27|25299.81|0.10|0.00|N|O|1996-06-17|1996-06-23|1996-06-23|TAKE BACK RETURN|REG AIR|ackages haggle slyly +22436|1734|19|4|7|11450.11|0.00|0.07|N|O|1996-09-15|1996-07-03|1996-10-02|TAKE BACK RETURN|TRUCK| carefully. special dependencies sleep s +22436|376|5|5|32|40843.84|0.07|0.02|N|O|1996-08-18|1996-08-02|1996-08-24|DELIVER IN PERSON|MAIL|beans wake sl +22436|1237|12|6|6|6829.38|0.07|0.08|N|O|1996-09-02|1996-07-09|1996-09-13|TAKE BACK RETURN|REG AIR|platelets sleep slyly. slyl +22437|27|3|1|45|41715.90|0.00|0.04|A|F|1994-10-12|1994-09-04|1994-11-07|NONE|AIR|lay across the fluffily even +22438|17|93|1|50|45850.50|0.06|0.08|N|O|1997-10-06|1997-11-27|1997-10-12|TAKE BACK RETURN|AIR|al packages. regular, unus +22438|1281|56|2|7|8275.96|0.10|0.05|N|O|1997-12-14|1997-11-04|1997-12-18|COLLECT COD|REG AIR|pecial packages. furiously ironic depo +22438|1117|18|3|14|14253.54|0.05|0.05|N|O|1997-11-04|1997-11-19|1997-11-23|TAKE BACK RETURN|TRUCK|ely slyly pending pains. express +22438|1344|21|4|20|24906.80|0.09|0.04|N|O|1998-01-10|1997-11-09|1998-01-24|DELIVER IN PERSON|TRUCK|ecial requests sleep blithely aft +22438|1780|7|5|43|72316.54|0.02|0.01|N|O|1998-01-19|1997-11-11|1998-02-02|DELIVER IN PERSON|AIR|gle according to the even accounts. f +22438|846|80|6|43|75114.12|0.02|0.07|N|O|1997-09-30|1997-11-30|1997-10-15|DELIVER IN PERSON|FOB|ironic depos +22438|1910|99|7|18|32614.38|0.01|0.01|N|O|1997-12-29|1997-10-31|1998-01-10|TAKE BACK RETURN|RAIL| instructions wake above the slyly +22439|1750|93|1|35|57811.25|0.01|0.06|N|O|1997-10-16|1997-10-18|1997-10-26|COLLECT COD|FOB|excuses. regular +22439|503|94|2|50|70175.00|0.01|0.00|N|O|1997-10-04|1997-10-20|1997-10-13|COLLECT COD|REG AIR|anently final pinto beans. fina +22439|93|19|3|11|10923.99|0.03|0.01|N|O|1997-09-05|1997-10-05|1997-09-07|TAKE BACK RETURN|RAIL|sual, express pinto beans are furiously car +22439|252|7|4|33|38024.25|0.02|0.05|N|O|1997-09-11|1997-10-14|1997-10-09|DELIVER IN PERSON|AIR|ole blithely against the ev +22439|1365|66|5|15|18995.40|0.09|0.05|N|O|1997-09-06|1997-11-14|1997-09-19|TAKE BACK RETURN|AIR|out the slyly express platelets. +22464|1676|100|1|33|52063.11|0.06|0.04|N|O|1998-05-26|1998-04-30|1998-06-19|NONE|AIR|final depos +22464|1928|17|2|41|75026.72|0.02|0.02|N|O|1998-03-29|1998-03-27|1998-04-15|NONE|SHIP| fluffily ironic +22464|1341|18|3|48|59632.32|0.08|0.07|N|O|1998-06-06|1998-03-30|1998-07-02|NONE|TRUCK|ealms nag carefully accounts +22464|1195|4|4|46|50424.74|0.05|0.06|N|O|1998-06-11|1998-04-06|1998-07-04|DELIVER IN PERSON|TRUCK|usly. blithely final +22465|1937|70|1|8|14711.44|0.00|0.07|R|F|1992-10-24|1992-09-02|1992-11-04|TAKE BACK RETURN|REG AIR|ly final ideas. fu +22465|602|96|2|11|16528.60|0.00|0.01|R|F|1992-10-25|1992-09-26|1992-11-14|NONE|RAIL|nic deposits alongside of the silent packa +22466|1265|66|1|23|26823.98|0.06|0.08|R|F|1992-05-11|1992-05-21|1992-05-31|NONE|FOB|efully express instructions. sl +22466|909|12|2|11|19908.90|0.05|0.05|A|F|1992-06-20|1992-05-28|1992-06-23|TAKE BACK RETURN|TRUCK|pending platelets haggle carefully ironi +22466|23|99|3|26|23998.52|0.01|0.02|A|F|1992-04-22|1992-06-22|1992-05-13|NONE|AIR|elets. furiously +22466|684|47|4|40|63387.20|0.09|0.02|R|F|1992-06-15|1992-05-31|1992-07-05|COLLECT COD|MAIL|eep carefully specia +22467|186|39|1|17|18465.06|0.02|0.06|N|O|1998-05-23|1998-04-22|1998-06-05|NONE|TRUCK|unts haggle. +22467|645|39|2|7|10819.48|0.07|0.00|N|O|1998-03-03|1998-03-07|1998-03-07|NONE|SHIP|as are fluffily across the dino +22467|884|84|3|10|17848.80|0.07|0.08|N|O|1998-02-27|1998-03-28|1998-03-06|COLLECT COD|REG AIR|ages wake blithely furious +22467|547|78|4|21|30398.34|0.08|0.02|N|O|1998-05-18|1998-04-03|1998-06-09|DELIVER IN PERSON|TRUCK|ickly bold deposits a +22468|609|3|1|31|46797.60|0.04|0.04|A|F|1993-08-11|1993-08-25|1993-09-10|TAKE BACK RETURN|TRUCK|final deposits +22468|700|32|2|38|60826.60|0.09|0.08|R|F|1993-06-14|1993-08-04|1993-06-30|DELIVER IN PERSON|FOB|furiously unusu +22468|786|87|3|49|82652.22|0.03|0.04|A|F|1993-07-21|1993-07-28|1993-08-10|TAKE BACK RETURN|MAIL|are quickly si +22468|206|34|4|48|53097.60|0.01|0.03|A|F|1993-07-18|1993-08-20|1993-07-24|NONE|FOB|inal, unusual deposits +22468|1256|68|5|2|2314.50|0.05|0.03|R|F|1993-06-24|1993-09-08|1993-07-17|COLLECT COD|FOB| fluffily bold excuses. bold packag +22468|1333|34|6|24|29623.92|0.02|0.02|A|F|1993-08-05|1993-08-31|1993-08-18|TAKE BACK RETURN|SHIP|ests. carefully unusual dependencies +22469|1541|42|1|48|69241.92|0.03|0.04|R|F|1994-01-04|1993-12-10|1994-01-11|NONE|AIR|hinder. ironic excus +22469|1031|2|2|35|32621.05|0.08|0.06|R|F|1993-12-06|1993-12-30|1993-12-23|DELIVER IN PERSON|SHIP|ly according t +22469|1311|26|3|36|43643.16|0.03|0.02|R|F|1994-01-21|1993-12-24|1994-02-07|COLLECT COD|TRUCK|ys. foxes cajole carefully. fluffily ironic +22469|623|86|4|33|50279.46|0.02|0.05|R|F|1994-01-08|1993-12-13|1994-01-16|COLLECT COD|AIR|he unusual asy +22469|668|69|5|13|20392.58|0.00|0.01|A|F|1993-11-16|1994-01-08|1993-11-27|COLLECT COD|SHIP|onic ideas maintain fur +22469|266|67|6|24|27990.24|0.04|0.06|A|F|1993-11-18|1993-12-20|1993-12-06|COLLECT COD|SHIP|ake carefully at the even, final pac +22470|927|28|1|17|31074.64|0.06|0.03|R|F|1993-11-19|1993-10-04|1993-12-15|NONE|FOB|al notornis after the unusual +22470|1136|37|2|14|14519.82|0.10|0.06|A|F|1993-07-27|1993-08-29|1993-08-18|NONE|AIR|unusual req +22471|984|19|1|16|30159.68|0.04|0.07|N|O|1997-06-23|1997-06-03|1997-07-22|DELIVER IN PERSON|MAIL|es wake furious +22471|564|65|2|44|64440.64|0.02|0.02|N|O|1997-04-25|1997-06-14|1997-05-12|DELIVER IN PERSON|RAIL| accounts. +22471|660|23|3|32|49941.12|0.01|0.01|N|O|1997-05-07|1997-07-14|1997-05-22|TAKE BACK RETURN|SHIP|l deposits dazzle blithely accordi +22471|1808|9|4|18|30776.40|0.04|0.02|N|O|1997-05-17|1997-05-18|1997-06-16|TAKE BACK RETURN|TRUCK|ickly blithely express court +22496|1913|2|1|17|30853.47|0.03|0.01|A|F|1994-08-24|1994-11-19|1994-09-10|DELIVER IN PERSON|SHIP|gside of the +22497|1195|68|1|39|42751.41|0.02|0.07|R|F|1992-06-15|1992-07-04|1992-06-22|TAKE BACK RETURN|MAIL|structions. carefully special instruct +22497|409|39|2|11|14403.40|0.00|0.02|R|F|1992-06-01|1992-07-13|1992-06-20|COLLECT COD|SHIP|ag blithely after the regular sheaves. fluf +22497|1428|46|3|32|42541.44|0.01|0.05|R|F|1992-07-04|1992-07-10|1992-08-03|COLLECT COD|MAIL| quickly ac +22497|920|89|4|43|78299.56|0.10|0.04|R|F|1992-05-01|1992-07-25|1992-05-11|DELIVER IN PERSON|RAIL|e furiously final packages. iron +22498|1021|27|1|50|46101.00|0.01|0.03|R|F|1994-01-15|1994-02-01|1994-01-20|NONE|FOB|ely special requests. blithely regular requ +22498|951|20|2|10|18519.50|0.06|0.03|R|F|1993-11-20|1993-12-23|1993-12-14|COLLECT COD|SHIP|nal requests doze. fluffily pending +22498|885|52|3|6|10715.28|0.07|0.05|A|F|1993-11-23|1994-01-28|1993-12-21|COLLECT COD|TRUCK|y regular instructions +22498|1213|25|4|7|7799.47|0.02|0.04|R|F|1994-03-02|1993-12-21|1994-03-10|TAKE BACK RETURN|SHIP|e quickly alongside of t +22498|1797|40|5|9|15289.11|0.06|0.06|A|F|1994-02-23|1993-12-29|1994-03-03|TAKE BACK RETURN|AIR|. even theodolites are after the slyly +22499|284|66|1|21|24869.88|0.03|0.03|R|F|1994-11-11|1995-01-02|1994-11-16|NONE|MAIL|efully furious deposits. +22500|1135|72|1|47|48698.11|0.03|0.00|R|F|1992-08-24|1992-10-06|1992-08-29|NONE|AIR|ggle quickl +22500|1680|81|2|14|22143.52|0.02|0.06|R|F|1992-11-18|1992-09-18|1992-12-18|NONE|SHIP|final requests cajole. carefully fluffy +22501|1011|82|1|46|41952.46|0.05|0.01|A|F|1993-06-01|1993-07-08|1993-06-22|COLLECT COD|AIR| since the carefully reg +22501|418|77|2|9|11865.69|0.08|0.06|R|F|1993-09-06|1993-07-21|1993-09-21|NONE|MAIL|erve carefully bold accounts. finally expre +22501|1290|65|3|44|52416.76|0.05|0.08|A|F|1993-05-25|1993-06-29|1993-06-02|DELIVER IN PERSON|RAIL|cies. ironic platelets cajole blithely. +22502|1540|21|1|22|31713.88|0.07|0.05|N|O|1998-07-09|1998-05-25|1998-07-26|TAKE BACK RETURN|TRUCK|lar, even accounts at the s +22502|971|6|2|42|78622.74|0.04|0.08|N|O|1998-06-19|1998-06-08|1998-07-13|TAKE BACK RETURN|FOB|ly final platelets. fl +22502|1677|60|3|14|22101.38|0.02|0.00|N|O|1998-05-21|1998-05-09|1998-06-05|TAKE BACK RETURN|MAIL|ges. slyly exp +22502|236|91|4|34|38631.82|0.10|0.00|N|O|1998-05-27|1998-04-20|1998-06-04|COLLECT COD|SHIP|yly final re +22503|1699|82|1|5|8003.45|0.00|0.00|N|O|1998-01-16|1998-01-25|1998-01-23|TAKE BACK RETURN|AIR|somas wake slyly acc +22503|1078|14|2|9|8811.63|0.06|0.06|N|O|1997-12-25|1998-01-27|1998-01-06|NONE|MAIL|, ironic foxe +22503|962|63|3|7|13040.72|0.04|0.08|N|O|1998-01-14|1998-03-02|1998-02-06|DELIVER IN PERSON|REG AIR|sits cajole quietly along th +22528|1560|41|1|29|42385.24|0.03|0.04|N|O|1995-11-30|1996-01-26|1995-12-14|COLLECT COD|REG AIR|counts. slyly express pinto beans wake blit +22528|674|75|2|42|66136.14|0.04|0.05|N|O|1996-02-22|1995-12-24|1996-03-17|NONE|SHIP|ccounts. care +22529|631|32|1|22|33695.86|0.05|0.07|A|F|1993-05-27|1993-07-15|1993-06-15|DELIVER IN PERSON|AIR|ter the final, furious ex +22529|97|73|2|3|2991.27|0.05|0.04|R|F|1993-07-31|1993-07-01|1993-08-23|COLLECT COD|REG AIR|ldly pending plate +22529|1416|34|3|16|21078.56|0.01|0.08|A|F|1993-05-12|1993-06-25|1993-05-22|DELIVER IN PERSON|RAIL|gle carefully accor +22529|339|96|4|42|52051.86|0.06|0.03|A|F|1993-06-07|1993-07-29|1993-06-08|COLLECT COD|SHIP|beans. express inst +22529|1318|95|5|2|2438.62|0.05|0.01|A|F|1993-08-29|1993-07-27|1993-09-03|DELIVER IN PERSON|REG AIR|ts was fluffily b +22530|81|82|1|32|31394.56|0.01|0.05|N|O|1997-05-18|1997-04-04|1997-05-28|DELIVER IN PERSON|RAIL|pending courts wak +22530|1949|82|2|14|25913.16|0.10|0.07|N|O|1997-03-18|1997-03-18|1997-03-21|TAKE BACK RETURN|FOB| ironic accounts after the +22530|1234|35|3|1|1135.23|0.03|0.01|N|O|1997-02-02|1997-03-23|1997-02-11|NONE|FOB|s boost along the furiously ir +22531|1973|6|1|24|44999.28|0.04|0.08|N|O|1996-02-09|1996-02-18|1996-03-07|NONE|AIR|counts cajole +22531|1218|56|2|4|4476.84|0.03|0.01|N|O|1995-12-27|1996-02-13|1996-01-09|COLLECT COD|AIR|capades. orbits use carefully final ideas +22531|1617|59|3|21|31890.81|0.01|0.06|N|O|1996-01-28|1996-02-12|1996-02-23|DELIVER IN PERSON|TRUCK|ding theodoli +22531|288|43|4|19|22577.32|0.03|0.04|N|O|1996-03-14|1996-02-15|1996-04-07|COLLECT COD|MAIL|ecial theodolites cajole blithely +22531|1815|16|5|49|84123.69|0.03|0.00|N|O|1996-01-29|1995-12-27|1996-02-11|DELIVER IN PERSON|RAIL|ely regula +22532|21|22|1|9|8289.18|0.08|0.00|R|F|1995-06-07|1995-04-22|1995-06-08|TAKE BACK RETURN|AIR| the express, slow theodoli +22532|737|34|2|17|27841.41|0.02|0.05|R|F|1995-03-03|1995-04-27|1995-03-27|DELIVER IN PERSON|FOB|ly alongside +22532|1719|46|3|9|14586.39|0.07|0.02|R|F|1995-04-03|1995-04-21|1995-05-02|COLLECT COD|AIR|nding theodolites. excu +22532|1033|4|4|12|11208.36|0.06|0.01|R|F|1995-05-21|1995-04-03|1995-06-14|NONE|RAIL| blithely. carefully final +22533|953|22|1|3|5561.85|0.06|0.02|N|O|1996-03-04|1996-01-10|1996-03-16|COLLECT COD|MAIL|al packages cajole alongside o +22533|1422|62|2|29|38379.18|0.01|0.08|N|O|1996-02-05|1996-01-31|1996-03-06|NONE|FOB|e. slyly ironic instr +22533|1228|40|3|18|20325.96|0.10|0.07|N|O|1996-01-08|1996-01-17|1996-01-25|TAKE BACK RETURN|RAIL| furiously bold realms x-ray ca +22533|1072|73|4|34|33084.38|0.07|0.01|N|O|1996-02-13|1996-01-15|1996-03-04|NONE|MAIL| final accounts- +22533|36|87|5|31|29016.93|0.05|0.06|N|O|1995-12-06|1996-01-01|1996-01-02|DELIVER IN PERSON|AIR| unusual instructions. thinly e +22534|171|98|1|1|1071.17|0.10|0.04|N|O|1995-08-22|1995-09-22|1995-09-12|NONE|TRUCK| beans cajole blithely carefully fin +22534|964|65|2|31|57813.76|0.00|0.01|N|O|1995-11-01|1995-10-07|1995-11-28|NONE|FOB|ainst the unusual, final +22534|1549|50|3|42|60922.68|0.09|0.03|N|O|1995-10-25|1995-10-12|1995-11-10|TAKE BACK RETURN|TRUCK|pecial accounts haggle quickly +22535|1789|32|1|24|40578.72|0.03|0.06|A|F|1994-11-16|1994-10-15|1994-11-25|COLLECT COD|MAIL|ironic theodolites sleep carefu +22560|1880|24|1|11|19600.68|0.10|0.06|N|O|1996-04-03|1996-05-16|1996-04-13|NONE|AIR|iously even instru +22560|728|29|2|17|27688.24|0.10|0.01|N|O|1996-06-15|1996-05-27|1996-06-28|TAKE BACK RETURN|RAIL|ular accounts cajole. carefull +22560|398|83|3|2|2596.78|0.04|0.02|N|O|1996-06-02|1996-04-06|1996-06-27|COLLECT COD|MAIL|latelets acro +22560|1021|92|4|7|6454.14|0.06|0.08|N|O|1996-03-04|1996-04-06|1996-03-06|TAKE BACK RETURN|SHIP|ly according +22560|636|30|5|2|3073.26|0.10|0.07|N|O|1996-06-26|1996-05-20|1996-07-11|TAKE BACK RETURN|FOB|he pinto beans t +22560|261|43|6|48|55740.48|0.05|0.00|N|O|1996-06-07|1996-04-13|1996-07-01|DELIVER IN PERSON|SHIP|es. ironic theodolites wake along the +22560|1421|39|7|5|6612.10|0.05|0.07|N|O|1996-04-19|1996-04-13|1996-05-07|COLLECT COD|TRUCK|o beans. fluffily even accounts boost +22561|1558|99|1|47|68598.85|0.08|0.06|A|F|1995-05-15|1995-02-25|1995-05-29|COLLECT COD|RAIL|r theodolites boost to +22561|991|92|2|35|66219.65|0.01|0.07|A|F|1995-04-06|1995-02-23|1995-04-24|TAKE BACK RETURN|SHIP|heaves boost slyl +22561|1759|86|3|15|24911.25|0.05|0.07|R|F|1995-04-14|1995-04-07|1995-05-14|TAKE BACK RETURN|FOB|ong the slyly express dep +22561|1928|17|4|23|42088.16|0.00|0.01|A|F|1995-05-03|1995-04-03|1995-05-12|DELIVER IN PERSON|RAIL| accounts haggle furiously a +22561|1447|87|5|6|8090.64|0.01|0.07|R|F|1995-05-08|1995-03-04|1995-05-16|NONE|AIR|al theodolites sleep quickly quick +22561|1113|14|6|31|31437.41|0.07|0.04|R|F|1995-02-05|1995-03-11|1995-02-17|DELIVER IN PERSON|RAIL|thely express deposits hagg +22561|388|73|7|5|6441.90|0.01|0.00|A|F|1995-03-25|1995-04-13|1995-04-02|DELIVER IN PERSON|TRUCK|luffily si +22562|360|61|1|13|16384.68|0.01|0.03|R|F|1994-06-15|1994-06-09|1994-06-23|TAKE BACK RETURN|SHIP|ilent ideas sleep blithely brave, do +22562|138|17|2|34|35296.42|0.00|0.07|A|F|1994-07-02|1994-05-18|1994-07-17|COLLECT COD|SHIP|kages. pai +22562|821|88|3|4|6887.28|0.02|0.08|R|F|1994-06-26|1994-06-16|1994-07-04|TAKE BACK RETURN|TRUCK|lose dependen +22562|1046|47|4|1|947.04|0.07|0.03|A|F|1994-07-06|1994-04-27|1994-07-17|TAKE BACK RETURN|AIR|e even packages! unusual acco +22562|1532|33|5|20|28670.60|0.10|0.01|A|F|1994-05-03|1994-05-11|1994-05-05|NONE|RAIL|nts cajole blithely furiously +22563|1759|44|1|23|38197.25|0.08|0.08|R|F|1992-07-26|1992-08-18|1992-08-08|DELIVER IN PERSON|RAIL| the blithely regular gifts. carefull +22563|1499|100|2|19|26609.31|0.01|0.02|R|F|1992-08-19|1992-07-08|1992-09-17|TAKE BACK RETURN|MAIL|s. quickly even forges haggle furiously ex +22563|1664|65|3|2|3131.32|0.02|0.00|A|F|1992-07-15|1992-07-25|1992-07-29|NONE|SHIP|g accounts nag furiously slyly express pi +22563|1148|49|4|1|1049.14|0.00|0.06|R|F|1992-06-05|1992-07-23|1992-06-14|TAKE BACK RETURN|FOB|sy ideas detect never aroun +22563|1007|8|5|43|39044.00|0.08|0.05|A|F|1992-06-21|1992-08-01|1992-06-25|DELIVER IN PERSON|REG AIR|s sleep about the careful +22563|221|3|6|4|4484.88|0.09|0.03|R|F|1992-06-20|1992-06-21|1992-07-09|NONE|SHIP|ays wake about the regul +22564|155|82|1|9|9496.35|0.10|0.08|R|F|1995-04-01|1995-05-22|1995-04-18|TAKE BACK RETURN|RAIL|pending escapades. slyly unusua +22565|399|28|1|16|20790.24|0.03|0.02|N|O|1998-06-01|1998-04-03|1998-06-12|NONE|SHIP|dependencies! even instructions boost ab +22565|1424|64|2|37|49040.54|0.01|0.07|N|O|1998-02-12|1998-04-28|1998-02-17|TAKE BACK RETURN|SHIP|gular, final requests hag +22565|848|15|3|43|75200.12|0.08|0.06|N|O|1998-05-01|1998-03-13|1998-05-24|NONE|FOB|itaphs. blithely unusual requests +22565|1451|30|4|4|5409.80|0.10|0.06|N|O|1998-05-29|1998-04-14|1998-06-23|TAKE BACK RETURN|SHIP|fully about the fluffil +22565|954|57|5|39|72343.05|0.10|0.07|N|O|1998-05-20|1998-04-01|1998-06-15|TAKE BACK RETURN|RAIL|unts. special, +22565|462|92|6|43|58585.78|0.05|0.00|N|O|1998-05-12|1998-04-07|1998-06-02|DELIVER IN PERSON|AIR| pending, final +22566|336|21|1|47|58107.51|0.02|0.00|N|O|1998-05-20|1998-06-11|1998-06-04|NONE|REG AIR|fully ironic requests sleep ironic p +22566|1390|91|2|41|52946.99|0.06|0.08|N|O|1998-08-22|1998-07-29|1998-08-24|NONE|FOB|press accounts serve among +22566|1647|89|3|8|12389.12|0.00|0.08|N|O|1998-08-01|1998-06-05|1998-08-22|COLLECT COD|AIR|nal foxes sl +22566|1832|33|4|44|76288.52|0.01|0.03|N|O|1998-06-24|1998-06-10|1998-07-01|NONE|FOB|c courts along the depos +22567|1396|11|1|16|20758.24|0.09|0.05|N|O|1996-10-31|1996-09-08|1996-11-12|COLLECT COD|SHIP|to beans kindle c +22567|475|76|2|5|6877.35|0.05|0.00|N|O|1996-11-18|1996-09-26|1996-11-29|DELIVER IN PERSON|FOB|ular ideas x-ray carefully alongside +22567|494|24|3|14|19522.86|0.09|0.08|N|O|1996-11-23|1996-10-06|1996-12-08|NONE|FOB| requests +22567|1809|10|4|2|3421.60|0.07|0.05|N|O|1996-11-06|1996-10-02|1996-11-20|COLLECT COD|FOB| slyly unusual ins +22567|380|37|5|46|58897.48|0.09|0.02|N|O|1996-08-26|1996-10-06|1996-09-18|NONE|REG AIR|c packages use always above the +22567|115|94|6|26|26392.86|0.08|0.00|N|O|1996-10-15|1996-09-13|1996-11-01|NONE|TRUCK|kly: unusual foxes affix furiously. careful +22592|944|45|1|33|60883.02|0.07|0.08|N|O|1997-09-17|1997-08-22|1997-09-23|TAKE BACK RETURN|AIR|y pending realms. i +22592|267|95|2|45|52526.70|0.10|0.03|N|O|1997-10-17|1997-08-28|1997-10-29|NONE|FOB|s along the carefully regular pinto bea +22592|144|23|3|39|40721.46|0.00|0.05|N|O|1997-10-01|1997-07-24|1997-10-18|NONE|RAIL|yly bold pains nag fluffily deposits +22592|331|60|4|14|17238.62|0.10|0.05|N|O|1997-06-26|1997-08-31|1997-07-09|COLLECT COD|SHIP|om the carefully final accounts. blithe +22593|1520|21|1|44|62546.88|0.02|0.01|N|O|1998-07-30|1998-07-14|1998-08-23|NONE|RAIL| carefully final packages +22593|473|32|2|24|32963.28|0.02|0.07|N|O|1998-08-03|1998-08-10|1998-08-18|TAKE BACK RETURN|SHIP|xcuses. final, +22593|961|62|3|16|29791.36|0.06|0.01|N|O|1998-08-27|1998-07-07|1998-09-07|DELIVER IN PERSON|TRUCK|aggle furiously regula +22593|986|87|4|30|56609.40|0.08|0.05|N|O|1998-08-17|1998-08-12|1998-08-19|COLLECT COD|FOB|ss, bold depen +22594|623|24|1|50|76181.00|0.07|0.00|A|F|1993-07-20|1993-06-09|1993-08-06|TAKE BACK RETURN|FOB|sits. final, ironic ex +22594|24|50|2|17|15708.34|0.04|0.06|A|F|1993-08-05|1993-07-22|1993-09-03|DELIVER IN PERSON|MAIL|uctions x-ray fu +22594|1191|100|3|33|36042.27|0.03|0.04|A|F|1993-08-18|1993-07-23|1993-09-12|TAKE BACK RETURN|SHIP|hely for the blit +22595|362|91|1|1|1262.36|0.10|0.07|N|O|1996-04-15|1996-05-03|1996-04-25|DELIVER IN PERSON|REG AIR|. furiously special package +22595|726|23|2|37|60188.64|0.07|0.05|N|O|1996-05-12|1996-06-01|1996-05-27|COLLECT COD|MAIL|sits. quickly special instructio +22595|570|61|3|47|69116.79|0.09|0.02|N|O|1996-07-09|1996-05-20|1996-07-30|COLLECT COD|FOB|ic deposits nag slyly +22595|1531|32|4|14|20055.42|0.02|0.00|N|O|1996-06-25|1996-06-03|1996-07-09|COLLECT COD|SHIP|old instructions. +22595|1421|39|5|13|17191.46|0.09|0.04|N|O|1996-06-24|1996-04-14|1996-07-11|TAKE BACK RETURN|FOB|until the silent dependencies hagg +22595|1754|39|6|15|24836.25|0.09|0.08|N|O|1996-06-09|1996-05-30|1996-06-16|DELIVER IN PERSON|RAIL| slyly even sheaves affix. ruthlessly eve +22595|522|23|7|2|2845.04|0.09|0.06|N|O|1996-05-01|1996-06-11|1996-05-06|DELIVER IN PERSON|AIR| slyly final requests cajole blith +22596|769|66|1|2|3339.52|0.10|0.06|N|O|1997-01-26|1996-11-05|1997-02-05|NONE|REG AIR|express ideas cajole bl +22596|1197|98|2|11|12080.09|0.10|0.04|N|O|1996-10-09|1996-11-30|1996-10-20|COLLECT COD|TRUCK|carefully pending d +22596|1800|1|3|39|66370.20|0.06|0.01|N|O|1997-01-02|1996-11-18|1997-01-26|COLLECT COD|FOB|y regular instructions. +22596|1125|62|4|27|27705.24|0.07|0.00|N|O|1997-01-08|1996-11-14|1997-02-07|TAKE BACK RETURN|TRUCK|gularly ironic +22596|165|66|5|17|18107.72|0.03|0.06|N|O|1996-10-14|1996-11-22|1996-10-17|TAKE BACK RETURN|RAIL| alongside of the decoys-- ir +22596|1449|89|6|33|44564.52|0.06|0.01|N|O|1996-12-05|1996-12-11|1997-01-03|COLLECT COD|TRUCK|y even inst +22596|1403|21|7|9|11739.60|0.01|0.04|N|O|1996-12-15|1996-12-29|1997-01-06|COLLECT COD|REG AIR| regular packages acro +22597|1600|1|1|20|30032.00|0.06|0.01|N|O|1996-03-05|1996-03-31|1996-03-11|DELIVER IN PERSON|MAIL|unusual requests. slyly regu +22597|327|12|2|3|3681.96|0.02|0.00|N|O|1996-03-23|1996-03-06|1996-04-21|TAKE BACK RETURN|RAIL|n accounts engage slyly ironic pack +22597|1126|35|3|19|19515.28|0.06|0.04|N|O|1996-03-02|1996-02-27|1996-03-03|TAKE BACK RETURN|SHIP|y express excuses. pending instructions ha +22598|821|88|1|25|43045.50|0.00|0.03|R|F|1993-07-14|1993-05-17|1993-07-17|TAKE BACK RETURN|FOB| special, ironic foxes. +22598|1414|54|2|35|46039.35|0.06|0.02|A|F|1993-07-19|1993-04-28|1993-08-15|COLLECT COD|REG AIR|kages haggle slyly ironic packages. even d +22598|296|97|3|4|4785.16|0.08|0.00|R|F|1993-06-17|1993-05-02|1993-07-04|COLLECT COD|AIR|unts around the blithely fin +22598|1284|85|4|31|36743.68|0.08|0.05|A|F|1993-07-06|1993-04-24|1993-07-15|COLLECT COD|SHIP| slyly fina +22598|346|47|5|24|29912.16|0.00|0.00|R|F|1993-06-15|1993-06-04|1993-06-20|NONE|REG AIR|fully inside the ironic ideas? thinly +22598|1531|52|6|30|42975.90|0.08|0.04|A|F|1993-06-10|1993-06-15|1993-06-19|COLLECT COD|FOB|ffily silent escapades n +22599|1240|78|1|20|22824.80|0.06|0.08|N|O|1997-07-17|1997-08-15|1997-08-03|COLLECT COD|TRUCK|ackages should have to grow +22599|59|35|2|13|12467.65|0.04|0.02|N|O|1997-10-08|1997-08-28|1997-10-21|TAKE BACK RETURN|FOB|ests haggle blithely furiously final the +22624|1767|94|1|35|58406.60|0.08|0.07|N|O|1996-04-07|1996-02-19|1996-05-04|TAKE BACK RETURN|RAIL| the slyly slow asymptotes wake +22624|45|46|2|23|21735.92|0.04|0.00|N|O|1996-02-15|1996-04-03|1996-03-03|DELIVER IN PERSON|TRUCK| even deposits. finally pending pinto bean +22624|626|89|3|3|4579.86|0.06|0.04|N|O|1996-02-20|1996-03-25|1996-03-05|TAKE BACK RETURN|REG AIR|its. foxes haggle above the +22624|146|73|4|11|11507.54|0.03|0.04|N|O|1996-01-24|1996-02-23|1996-02-01|TAKE BACK RETURN|REG AIR|l deposits above the fl +22624|299|27|5|29|34779.41|0.00|0.05|N|O|1996-02-05|1996-03-24|1996-02-14|TAKE BACK RETURN|RAIL|fully fina +22624|777|74|6|4|6711.08|0.02|0.02|N|O|1996-04-28|1996-03-28|1996-05-10|NONE|FOB|eas integrate slyly +22624|884|18|7|3|5354.64|0.00|0.05|N|O|1996-02-29|1996-04-11|1996-03-05|TAKE BACK RETURN|FOB|y quickly even deposits. f +22625|1305|44|1|19|22919.70|0.08|0.03|R|F|1994-10-17|1994-12-10|1994-10-26|COLLECT COD|SHIP|he blithely regular deposits +22625|146|25|2|48|50214.72|0.07|0.05|A|F|1994-10-04|1994-11-14|1994-10-25|NONE|MAIL|deas wake furiously +22625|1555|56|3|39|56805.45|0.06|0.05|R|F|1994-10-17|1994-12-11|1994-11-04|NONE|AIR|ndencies. sauternes +22625|148|27|4|23|24107.22|0.06|0.07|R|F|1994-11-27|1994-12-29|1994-12-17|NONE|RAIL|s! final requests wake requests. furiously +22626|1285|60|1|38|45078.64|0.09|0.00|R|F|1993-10-20|1993-09-22|1993-11-01|COLLECT COD|TRUCK|the quickly regular accounts. c +22626|545|46|2|14|20237.56|0.00|0.06|A|F|1993-09-17|1993-08-06|1993-09-24|DELIVER IN PERSON|SHIP|uctions. carefully bold accounts sno +22626|1798|99|3|18|30596.22|0.01|0.02|A|F|1993-07-06|1993-09-23|1993-07-26|TAKE BACK RETURN|TRUCK| even dependencies wake permanent +22626|676|70|4|22|34686.74|0.07|0.05|A|F|1993-09-26|1993-08-02|1993-10-23|TAKE BACK RETURN|AIR|packages wake furi +22626|359|60|5|10|12593.50|0.10|0.07|A|F|1993-09-23|1993-08-16|1993-10-09|TAKE BACK RETURN|FOB|e requests. pending ideas s +22626|1435|14|6|16|21382.88|0.06|0.02|A|F|1993-09-09|1993-08-28|1993-09-23|TAKE BACK RETURN|TRUCK|ns haggle carefully always final ideas. car +22626|414|15|7|4|5257.64|0.02|0.04|R|F|1993-08-01|1993-08-28|1993-08-05|DELIVER IN PERSON|RAIL|al tithes. regular, ironic account +22627|709|6|1|13|20926.10|0.00|0.04|R|F|1993-04-06|1993-06-15|1993-04-21|TAKE BACK RETURN|FOB|s wake slyly. furiously pending accoun +22627|1116|17|2|31|31530.41|0.10|0.00|R|F|1993-06-12|1993-06-15|1993-07-12|COLLECT COD|FOB|dencies. busy packages cajole slyl +22627|535|66|3|30|43065.90|0.09|0.00|R|F|1993-07-31|1993-06-06|1993-08-29|DELIVER IN PERSON|TRUCK| final foxes serve care +22627|576|77|4|1|1476.57|0.07|0.04|A|F|1993-07-04|1993-06-18|1993-07-18|TAKE BACK RETURN|SHIP|its are requests. regular asymptotes alon +22627|1717|18|5|43|69604.53|0.10|0.00|A|F|1993-04-13|1993-05-24|1993-04-23|DELIVER IN PERSON|REG AIR|ly ironic instructions. sile +22627|1800|85|6|22|37439.60|0.01|0.08|R|F|1993-04-11|1993-05-05|1993-04-29|COLLECT COD|AIR| blithely slyly busy accounts. idly +22628|726|59|1|25|40668.00|0.07|0.07|A|F|1995-01-28|1994-12-14|1995-02-09|NONE|AIR| furiously even sauternes. slyly regular re +22628|1452|31|2|19|25715.55|0.10|0.00|A|F|1995-02-25|1994-11-29|1995-03-19|NONE|SHIP|ly. special pinto b +22628|1637|38|3|34|52313.42|0.10|0.06|R|F|1995-01-17|1994-12-17|1995-01-20|DELIVER IN PERSON|REG AIR|s haggle accor +22628|637|69|4|24|36903.12|0.06|0.03|R|F|1994-12-05|1995-01-14|1994-12-18|DELIVER IN PERSON|AIR|ncies nag per +22628|252|7|5|19|21892.75|0.06|0.04|R|F|1995-02-02|1995-01-06|1995-02-23|COLLECT COD|REG AIR|ously unusual accounts use fluffil +22629|1847|34|1|24|41972.16|0.05|0.06|A|F|1993-08-10|1993-06-29|1993-08-20|COLLECT COD|REG AIR|he platelets. quickly silent pack +22629|521|12|2|44|62546.88|0.00|0.08|R|F|1993-05-10|1993-06-10|1993-05-24|NONE|TRUCK|fluffily after the carefully +22629|819|20|3|18|30956.58|0.07|0.00|A|F|1993-05-20|1993-05-30|1993-06-12|COLLECT COD|SHIP|n requests haggle blithely abo +22629|170|23|4|2|2140.34|0.02|0.03|A|F|1993-06-12|1993-05-16|1993-06-29|TAKE BACK RETURN|FOB|luffily about the platelets. ironic acc +22629|1924|57|5|6|10955.52|0.07|0.08|A|F|1993-05-22|1993-06-24|1993-05-28|TAKE BACK RETURN|FOB|ages haggle bravely even, pending +22629|1676|77|6|38|59951.46|0.06|0.06|R|F|1993-04-17|1993-05-23|1993-04-20|COLLECT COD|RAIL|ts boost idly furiousl +22630|1853|83|1|47|82477.95|0.09|0.02|A|F|1994-04-23|1994-03-20|1994-04-26|TAKE BACK RETURN|MAIL|ngly regular de +22630|908|11|2|10|18089.00|0.04|0.02|A|F|1994-02-23|1994-04-21|1994-03-19|COLLECT COD|TRUCK|nusual dep +22630|1581|22|3|20|29651.60|0.02|0.02|R|F|1994-04-08|1994-03-27|1994-04-24|DELIVER IN PERSON|FOB| the fluffily final requests. express, reg +22631|799|32|1|12|20397.48|0.00|0.03|N|O|1996-08-07|1996-06-14|1996-08-09|COLLECT COD|TRUCK|ake blithely against the pack +22631|1215|16|2|11|12278.31|0.10|0.02|N|O|1996-08-01|1996-06-02|1996-08-28|DELIVER IN PERSON|REG AIR| wake blithely slyly express +22631|1822|9|3|35|60333.70|0.00|0.02|N|O|1996-04-09|1996-05-29|1996-05-01|COLLECT COD|AIR|t the blithely regular deposits. +22631|889|89|4|7|12529.16|0.04|0.00|N|O|1996-07-06|1996-05-27|1996-07-07|NONE|FOB|deposits can cajol +22631|950|19|5|1|1850.95|0.02|0.00|N|O|1996-04-12|1996-06-04|1996-04-13|NONE|FOB| special pa +22631|609|72|6|32|48307.20|0.10|0.07|N|O|1996-08-01|1996-06-23|1996-08-21|DELIVER IN PERSON|RAIL|final theodolites are final, +22631|231|59|7|3|3393.69|0.05|0.08|N|O|1996-05-13|1996-06-09|1996-05-18|TAKE BACK RETURN|AIR|f the fluffily ironic courts wake +22656|256|57|1|28|32375.00|0.04|0.02|R|F|1994-01-10|1994-02-24|1994-01-27|COLLECT COD|FOB|ges. accounts use quickly. quickl +22657|1560|41|1|45|65770.20|0.07|0.00|N|O|1995-12-09|1996-01-26|1995-12-22|TAKE BACK RETURN|AIR|silent dolphins +22657|163|90|2|23|24452.68|0.00|0.00|N|O|1995-12-29|1995-12-17|1995-12-30|TAKE BACK RETURN|SHIP|ges. quickly regular instructions +22657|1625|67|3|30|45798.60|0.00|0.02|N|O|1996-02-02|1995-12-11|1996-02-09|TAKE BACK RETURN|AIR|ms. regular, express requests are amon +22657|24|75|4|38|35112.76|0.08|0.02|N|O|1995-11-02|1996-01-05|1995-11-05|COLLECT COD|FOB|ackages. carefully final depo +22657|205|33|5|29|32050.80|0.06|0.00|N|O|1995-11-03|1995-12-13|1995-11-10|COLLECT COD|TRUCK|e slyly hockey players. slowly +22657|503|4|6|35|49122.50|0.02|0.02|N|O|1995-12-10|1996-01-19|1996-01-09|NONE|FOB| even packages could have to hinder a +22657|1845|46|7|17|29696.28|0.07|0.00|N|O|1996-02-08|1995-11-30|1996-02-09|COLLECT COD|FOB|fully even ideas cajole qui +22658|115|68|1|35|35528.85|0.10|0.02|N|O|1995-07-25|1995-07-25|1995-08-14|DELIVER IN PERSON|RAIL|ronic accounts +22658|474|33|2|31|42608.57|0.03|0.00|N|O|1995-07-21|1995-07-22|1995-08-05|DELIVER IN PERSON|FOB|blithely about the sly +22658|968|37|3|43|80365.28|0.09|0.08|N|O|1995-08-24|1995-06-10|1995-08-27|NONE|REG AIR|tions boost-- quic +22658|1354|55|4|20|25107.00|0.03|0.07|A|F|1995-05-31|1995-07-05|1995-06-13|TAKE BACK RETURN|MAIL| beans haggle +22659|717|14|1|17|27501.07|0.09|0.06|N|O|1998-10-21|1998-09-06|1998-11-16|TAKE BACK RETURN|RAIL|symptotes nag +22659|662|25|2|15|23439.90|0.04|0.01|N|O|1998-10-03|1998-09-18|1998-11-02|TAKE BACK RETURN|SHIP|l frets haggle quickly blithely expr +22659|43|44|3|17|16031.68|0.10|0.04|N|O|1998-08-27|1998-09-05|1998-09-05|COLLECT COD|AIR|ily quickly even platelets +22659|1858|45|4|3|5279.55|0.06|0.08|N|O|1998-08-28|1998-08-28|1998-09-07|TAKE BACK RETURN|SHIP|usly ironic packages. r +22659|248|49|5|39|44781.36|0.05|0.04|N|O|1998-09-09|1998-08-01|1998-09-13|TAKE BACK RETURN|RAIL|r accounts haggle furious +22660|1058|59|1|45|43157.25|0.05|0.08|A|F|1993-10-16|1993-10-03|1993-10-29|DELIVER IN PERSON|SHIP| furiously express depen +22660|1427|6|2|33|43837.86|0.01|0.04|R|F|1993-10-09|1993-08-15|1993-10-16|TAKE BACK RETURN|RAIL|uffily bold requests nag after the +22660|1480|59|3|36|49733.28|0.07|0.03|A|F|1993-09-24|1993-10-10|1993-10-20|NONE|MAIL|ding to the final, final +22660|693|56|4|50|79684.50|0.10|0.07|A|F|1993-07-26|1993-10-10|1993-08-23|COLLECT COD|FOB|cajole among the furiously ironic instru +22660|1220|58|5|19|21303.18|0.02|0.01|A|F|1993-08-13|1993-10-08|1993-09-12|DELIVER IN PERSON|FOB|requests across the foxes use along +22661|1131|68|1|29|29931.77|0.05|0.03|A|F|1993-12-19|1993-12-02|1994-01-08|DELIVER IN PERSON|SHIP| the fluffily express fo +22661|708|41|2|13|20913.10|0.02|0.06|R|F|1994-01-04|1993-12-22|1994-01-17|TAKE BACK RETURN|FOB|quests nag. blithely special asymptot +22661|1461|62|3|28|38148.88|0.10|0.08|R|F|1993-12-15|1993-11-09|1994-01-08|TAKE BACK RETURN|AIR|have to sleep. fluffily ironic frays +22662|1355|70|1|6|7538.10|0.04|0.00|N|O|1998-08-15|1998-08-13|1998-09-06|TAKE BACK RETURN|FOB|detect. unusual, even theodolites nag a +22662|1214|15|2|27|30110.67|0.02|0.04|N|O|1998-07-08|1998-07-26|1998-07-27|DELIVER IN PERSON|SHIP|y. final, pending instructions +22662|358|15|3|23|28942.05|0.02|0.07|N|O|1998-09-17|1998-07-01|1998-10-06|NONE|RAIL|kly carefully unusual +22662|68|44|4|41|39690.46|0.03|0.03|N|O|1998-07-03|1998-07-23|1998-07-25|TAKE BACK RETURN|AIR|ackages are? +22662|87|38|5|23|22702.84|0.05|0.03|N|O|1998-09-07|1998-08-07|1998-09-08|TAKE BACK RETURN|REG AIR|he instructions detect furiously qu +22662|1674|57|6|37|58299.79|0.01|0.01|N|O|1998-06-22|1998-08-30|1998-07-17|COLLECT COD|FOB| ironic deposits sleep! care +22663|186|87|1|11|11947.98|0.06|0.01|R|F|1992-05-11|1992-04-06|1992-06-05|NONE|AIR| express requests detect carefully +22663|1509|30|2|40|56420.00|0.02|0.00|A|F|1992-04-21|1992-02-22|1992-04-24|COLLECT COD|FOB| above the sp +22663|1246|47|3|1|1147.24|0.01|0.02|A|F|1992-03-13|1992-03-22|1992-03-14|DELIVER IN PERSON|RAIL|. platelets are blithely. carefull +22663|978|47|4|21|39458.37|0.07|0.01|A|F|1992-03-01|1992-04-01|1992-03-07|NONE|MAIL|the requests are even +22663|1248|60|5|22|25283.28|0.04|0.07|A|F|1992-04-08|1992-03-07|1992-04-22|NONE|REG AIR|al packages. blithely pending depo +22663|1197|70|6|17|18669.23|0.00|0.03|A|F|1992-04-24|1992-03-29|1992-04-29|DELIVER IN PERSON|RAIL|s sleep furious, reg +22688|1764|7|1|5|8328.80|0.08|0.08|A|F|1992-04-23|1992-05-28|1992-05-06|NONE|FOB|uctions. specia +22688|511|12|2|43|60694.93|0.09|0.07|R|F|1992-06-13|1992-07-09|1992-07-09|DELIVER IN PERSON|RAIL| sauternes snooze. instructions along the f +22688|548|49|3|48|69529.92|0.07|0.06|R|F|1992-08-02|1992-05-20|1992-08-10|NONE|REG AIR|ly. furiously even requests sleep car +22689|1130|31|1|9|9280.17|0.01|0.08|N|O|1996-01-05|1996-01-06|1996-02-01|DELIVER IN PERSON|AIR|longside of the careful +22689|109|88|2|8|8072.80|0.07|0.08|N|O|1995-12-01|1995-12-22|1995-12-06|TAKE BACK RETURN|SHIP|itaphs haggle stealth +22689|1314|15|3|46|55904.26|0.03|0.08|N|O|1996-01-30|1995-12-15|1996-02-07|TAKE BACK RETURN|AIR|oxes. quickly bo +22689|1471|50|4|14|19214.58|0.02|0.07|N|O|1995-10-18|1995-12-18|1995-11-07|COLLECT COD|SHIP|l instructions. blithely +22689|1358|73|5|13|16371.55|0.00|0.03|N|O|1995-11-28|1995-12-13|1995-12-19|COLLECT COD|MAIL|ing theodolites +22689|218|100|6|40|44728.40|0.05|0.04|N|O|1995-10-14|1995-12-10|1995-10-28|NONE|MAIL|ckages wake furiously ironic p +22690|871|72|1|41|72646.67|0.09|0.07|A|F|1992-12-04|1992-10-30|1992-12-17|TAKE BACK RETURN|SHIP|foxes are slyly acro +22690|403|33|2|26|33888.40|0.10|0.04|R|F|1992-09-30|1992-10-30|1992-10-10|NONE|AIR|le blithely! pending dependencies +22690|1245|57|3|4|4584.96|0.08|0.06|A|F|1992-11-07|1992-11-13|1992-11-13|TAKE BACK RETURN|TRUCK|ly. ironic +22690|1767|68|4|27|45056.52|0.06|0.04|A|F|1992-10-06|1992-11-17|1992-10-09|DELIVER IN PERSON|REG AIR|gular packages except the s +22690|1753|80|5|8|13238.00|0.05|0.04|A|F|1992-11-02|1992-11-25|1992-11-20|TAKE BACK RETURN|AIR|ajole slyly according to the fluffil +22690|673|67|6|29|45636.43|0.03|0.00|A|F|1992-11-25|1992-12-17|1992-11-27|COLLECT COD|REG AIR|uriously. furiously ironic packages +22691|1393|8|1|42|54364.38|0.01|0.03|N|O|1997-06-29|1997-06-27|1997-07-06|DELIVER IN PERSON|FOB|n, regular dependencies are quic +22691|569|70|2|46|67599.76|0.07|0.03|N|O|1997-05-17|1997-07-22|1997-06-04|NONE|REG AIR| regular accounts. blithely +22691|1287|62|3|45|53472.60|0.04|0.07|N|O|1997-08-09|1997-07-15|1997-08-22|NONE|SHIP|instruction +22691|1096|67|4|7|6979.63|0.05|0.01|N|O|1997-07-16|1997-07-12|1997-08-03|DELIVER IN PERSON|SHIP|ests. slyly ironic attainments h +22692|914|49|1|12|21778.92|0.03|0.02|N|O|1998-02-15|1998-02-16|1998-02-19|DELIVER IN PERSON|REG AIR|uffily even deposits among the blith +22692|1091|92|2|40|39683.60|0.03|0.00|N|O|1998-01-13|1998-02-06|1998-02-09|DELIVER IN PERSON|FOB|ular instructions use never. slyly +22692|843|43|3|12|20926.08|0.00|0.07|N|O|1998-04-06|1998-02-25|1998-04-26|COLLECT COD|REG AIR|ly bold fray +22692|1248|23|4|8|9193.92|0.07|0.08|N|O|1998-02-09|1998-03-12|1998-02-17|NONE|REG AIR|he blithely regular dolphins +22693|519|20|1|44|62458.44|0.02|0.07|A|F|1992-01-17|1992-03-11|1992-02-13|DELIVER IN PERSON|MAIL|poach blithely. furi +22693|624|25|2|37|56410.94|0.03|0.00|R|F|1992-01-21|1992-03-09|1992-02-01|DELIVER IN PERSON|RAIL|ons haggle carefully agai +22693|794|95|3|21|35590.59|0.09|0.06|R|F|1992-03-18|1992-02-12|1992-03-23|TAKE BACK RETURN|SHIP|nal foxes. fluffily even deposits nag +22693|1051|22|4|6|5712.30|0.04|0.07|R|F|1992-02-10|1992-03-05|1992-02-29|TAKE BACK RETURN|SHIP|s about the +22693|1225|100|5|24|27029.28|0.00|0.07|A|F|1992-04-16|1992-02-18|1992-04-17|COLLECT COD|RAIL|deas serve quic +22693|1965|10|6|32|59742.72|0.05|0.00|R|F|1992-04-07|1992-02-16|1992-04-30|NONE|MAIL|ts. fluffily even requests nag blithely +22694|871|38|1|19|33665.53|0.02|0.02|R|F|1993-11-19|1993-11-24|1993-11-20|DELIVER IN PERSON|MAIL|e final deposits. bo +22694|1520|21|2|25|35538.00|0.09|0.03|R|F|1994-02-10|1993-11-29|1994-02-20|COLLECT COD|SHIP|side of the bravely unusual asymp +22694|1659|60|3|27|42137.55|0.09|0.04|A|F|1993-12-03|1994-01-11|1993-12-24|NONE|TRUCK|haggle bold requests. busily regular acc +22695|1603|45|1|49|73725.40|0.07|0.01|A|F|1994-09-05|1994-09-02|1994-10-05|TAKE BACK RETURN|FOB| sleep into the furiously regular +22695|915|16|2|34|61740.94|0.05|0.04|A|F|1994-09-12|1994-08-28|1994-09-14|NONE|FOB|. slowly regular courts detect busily +22695|191|18|3|22|24006.18|0.04|0.07|A|F|1994-07-17|1994-08-30|1994-08-12|TAKE BACK RETURN|SHIP|beans promise ironic depen +22720|1201|76|1|37|40781.40|0.01|0.02|N|O|1997-11-09|1997-11-07|1997-12-05|COLLECT COD|FOB| excuses cajole quick +22720|642|5|2|11|16969.04|0.01|0.03|N|O|1997-12-09|1997-10-04|1998-01-03|NONE|RAIL|e fluffily above +22720|1833|20|3|30|52044.90|0.04|0.07|N|O|1997-09-24|1997-11-15|1997-10-01|TAKE BACK RETURN|REG AIR| are carefully furiou +22720|1625|67|4|18|27479.16|0.04|0.00|N|O|1997-10-02|1997-09-20|1997-10-06|TAKE BACK RETURN|RAIL|ts cajole fluffily slyly bli +22720|1491|70|5|25|34812.25|0.01|0.04|N|O|1997-09-19|1997-10-10|1997-10-11|DELIVER IN PERSON|RAIL|longside of the spec +22720|174|75|6|38|40818.46|0.02|0.01|N|O|1997-08-27|1997-09-27|1997-08-29|DELIVER IN PERSON|FOB|ar, bold requests against +22720|187|88|7|35|38051.30|0.02|0.06|N|O|1997-08-24|1997-10-18|1997-09-12|NONE|REG AIR|ly regular packages. regular deposits abo +22721|1060|31|1|22|21143.32|0.09|0.00|N|O|1996-12-24|1996-12-24|1997-01-15|NONE|FOB|e regular packages. ev +22721|137|38|2|17|17631.21|0.03|0.06|N|O|1997-01-09|1997-01-04|1997-01-21|TAKE BACK RETURN|RAIL| sleep. carefully regula +22721|1060|61|3|48|46130.88|0.10|0.02|N|O|1997-03-20|1997-02-04|1997-04-18|DELIVER IN PERSON|REG AIR|efully ironic reque +22721|1199|8|4|10|11001.90|0.03|0.01|N|O|1996-12-26|1997-02-18|1997-01-05|COLLECT COD|TRUCK| idly across the requests. slyly +22722|695|27|1|38|60636.22|0.03|0.02|A|F|1992-10-07|1992-09-06|1992-10-28|NONE|REG AIR|yly final, final deposit +22722|199|52|2|40|43967.60|0.08|0.04|A|F|1992-10-03|1992-09-07|1992-10-05|DELIVER IN PERSON|MAIL|ronic platelets. furiously unusual +22722|131|84|3|34|35058.42|0.09|0.03|A|F|1992-10-15|1992-09-19|1992-10-28|NONE|SHIP|instructions haggle furiously. +22722|377|6|4|48|61313.76|0.10|0.05|A|F|1992-08-14|1992-08-06|1992-08-30|COLLECT COD|FOB|l accounts doze slyly slyly ironic packag +22722|921|24|5|31|56479.52|0.01|0.02|A|F|1992-10-27|1992-09-25|1992-11-06|DELIVER IN PERSON|AIR| unusual theodolites. even r +22722|1371|48|6|29|36898.73|0.04|0.03|R|F|1992-10-13|1992-08-15|1992-10-20|TAKE BACK RETURN|SHIP| across the en +22722|532|93|7|2|2865.06|0.04|0.06|R|F|1992-10-08|1992-09-07|1992-10-31|DELIVER IN PERSON|MAIL|l deposits haggle sly +22723|609|10|1|30|45288.00|0.06|0.07|R|F|1994-07-13|1994-08-09|1994-08-04|COLLECT COD|MAIL|arefully final attainments. +22723|21|97|2|12|11052.24|0.09|0.06|R|F|1994-07-13|1994-07-11|1994-08-02|COLLECT COD|RAIL|uses. carefully pending deposi +22723|603|4|3|15|22554.00|0.02|0.05|R|F|1994-08-19|1994-06-28|1994-08-26|TAKE BACK RETURN|FOB|hely furious +22723|721|54|4|32|51895.04|0.03|0.01|A|F|1994-07-22|1994-06-25|1994-07-26|TAKE BACK RETURN|FOB|inst the regular, r +22724|1234|35|1|6|6811.38|0.07|0.02|N|O|1998-08-10|1998-07-25|1998-08-15|DELIVER IN PERSON|REG AIR|efully regular foxes; sl +22724|768|33|2|35|58406.60|0.04|0.01|N|O|1998-06-21|1998-07-05|1998-07-01|DELIVER IN PERSON|TRUCK|gular requests. f +22724|975|76|3|26|48775.22|0.00|0.05|N|O|1998-05-05|1998-06-26|1998-05-17|DELIVER IN PERSON|RAIL|es boost furious +22725|959|62|1|27|50218.65|0.02|0.03|N|O|1996-11-01|1996-12-26|1996-11-10|NONE|SHIP|he furiously pendi +22725|594|85|2|50|74729.50|0.05|0.05|N|O|1996-11-22|1996-12-14|1996-12-10|DELIVER IN PERSON|FOB|osits against the +22725|152|53|3|42|44190.30|0.06|0.04|N|O|1996-11-20|1996-12-30|1996-12-15|TAKE BACK RETURN|AIR| fluffily. blithely e +22725|491|21|4|28|38961.72|0.10|0.07|N|O|1996-11-25|1996-12-06|1996-12-03|COLLECT COD|TRUCK|y alongside of the regular accounts. +22725|1604|5|5|46|69257.60|0.03|0.08|N|O|1996-11-23|1997-01-05|1996-11-25|NONE|AIR|riously regular requests +22726|684|47|1|12|19016.16|0.04|0.04|A|F|1992-05-11|1992-07-06|1992-05-20|COLLECT COD|MAIL|odolites. fluffily special depo +22726|728|93|2|13|21173.36|0.00|0.03|R|F|1992-06-08|1992-07-10|1992-06-19|COLLECT COD|AIR|cial requests. reg +22727|771|36|1|17|28420.09|0.04|0.02|N|O|1995-09-04|1995-09-27|1995-10-01|COLLECT COD|SHIP|pendencies up the slyly ironic asymptotes +22727|1902|91|2|32|57724.80|0.00|0.06|N|O|1995-09-21|1995-08-11|1995-10-02|TAKE BACK RETURN|FOB|ully special deposits need to boost furio +22752|1251|89|1|18|20740.50|0.08|0.06|A|F|1993-02-08|1993-01-18|1993-02-09|COLLECT COD|AIR|unusual excuses b +22752|768|33|2|42|70087.92|0.04|0.08|A|F|1993-02-21|1993-02-15|1993-03-09|TAKE BACK RETURN|RAIL| unusual, +22752|174|53|3|40|42966.80|0.04|0.07|R|F|1993-02-13|1993-02-20|1993-03-13|NONE|FOB|ts. special, +22752|90|66|4|32|31682.88|0.05|0.05|A|F|1993-01-13|1993-01-15|1993-01-15|TAKE BACK RETURN|SHIP|usly regular +22752|236|91|5|42|47721.66|0.10|0.02|A|F|1992-12-10|1993-02-19|1992-12-15|TAKE BACK RETURN|AIR|equests cajole stealthily fluffily eve +22752|1643|26|6|44|67964.16|0.04|0.06|A|F|1992-12-15|1993-02-21|1993-01-11|COLLECT COD|TRUCK|packages. blithely even fox +22752|1822|52|7|29|49990.78|0.01|0.07|R|F|1993-04-07|1993-01-30|1993-04-24|TAKE BACK RETURN|FOB|o beans pr +22753|844|78|1|48|83752.32|0.08|0.07|R|F|1995-04-22|1995-04-17|1995-04-26|NONE|SHIP|quickly ev +22754|266|21|1|12|13995.12|0.08|0.02|A|F|1992-06-26|1992-06-06|1992-07-03|DELIVER IN PERSON|FOB| quickly final courts against th +22754|730|63|2|24|39137.52|0.01|0.07|R|F|1992-08-18|1992-07-24|1992-09-04|NONE|MAIL|y express packa +22754|1291|66|3|2|2384.58|0.08|0.01|R|F|1992-04-30|1992-05-31|1992-05-14|TAKE BACK RETURN|TRUCK|mes special requests. packages haggle +22755|1467|46|1|31|42422.26|0.09|0.02|R|F|1994-06-04|1994-05-26|1994-06-08|COLLECT COD|MAIL|refully. express instru +22755|885|52|2|44|78578.72|0.00|0.00|R|F|1994-07-26|1994-06-02|1994-08-05|NONE|SHIP|quests despite the ironic, pending +22755|674|37|3|24|37792.08|0.07|0.05|R|F|1994-07-05|1994-05-29|1994-07-23|TAKE BACK RETURN|FOB| requests use quickly blithely even req +22755|1890|91|4|45|80635.05|0.01|0.08|A|F|1994-05-24|1994-05-28|1994-06-09|COLLECT COD|RAIL|ffy instructions among t +22755|1190|91|5|24|26188.56|0.06|0.07|R|F|1994-04-05|1994-06-03|1994-04-29|DELIVER IN PERSON|MAIL|t slyly about the blithely pending +22755|394|79|6|38|49186.82|0.05|0.01|R|F|1994-07-06|1994-06-26|1994-07-29|DELIVER IN PERSON|FOB| the carefully even instr +22755|1839|26|7|4|6963.32|0.09|0.00|A|F|1994-04-24|1994-06-04|1994-05-16|NONE|MAIL|ffix blith +22756|317|74|1|49|59648.19|0.00|0.08|A|F|1994-12-31|1995-02-05|1995-01-27|COLLECT COD|REG AIR|ously special exc +22756|1507|8|2|5|7042.50|0.10|0.08|A|F|1995-02-01|1995-03-04|1995-02-16|TAKE BACK RETURN|FOB|lithely regular packages s +22756|929|98|3|46|84176.32|0.00|0.04|A|F|1995-04-17|1995-03-04|1995-05-13|DELIVER IN PERSON|MAIL|s. even, final dependencies +22756|1610|93|4|49|74068.89|0.00|0.06|R|F|1995-02-10|1995-02-03|1995-02-22|COLLECT COD|SHIP|uickly. final accoun +22757|720|85|1|39|63208.08|0.08|0.04|A|F|1994-05-18|1994-05-23|1994-06-04|NONE|SHIP|ic excuses. carefully final p +22757|1254|55|2|38|43899.50|0.05|0.03|R|F|1994-05-20|1994-05-18|1994-06-03|COLLECT COD|FOB|oxes detec +22757|1050|86|3|12|11412.60|0.02|0.05|R|F|1994-04-23|1994-06-13|1994-04-26|NONE|REG AIR|ic platelets +22758|1181|82|1|32|34629.76|0.01|0.01|R|F|1994-05-27|1994-06-05|1994-06-18|DELIVER IN PERSON|MAIL|es. carefully bold requests serve across +22758|1771|14|2|47|78620.19|0.02|0.05|A|F|1994-07-14|1994-05-17|1994-08-10|NONE|AIR|even frets. quickly regular pearls +22759|1835|65|1|46|79894.18|0.09|0.00|R|F|1992-11-23|1992-11-29|1992-12-16|DELIVER IN PERSON|AIR|haggle slyly regular foxes. special pinto b +22759|1437|38|2|1|1338.43|0.04|0.08|R|F|1992-12-17|1992-11-21|1992-12-19|COLLECT COD|AIR|. slyly even deposits haggle furiously ac +22784|1603|45|1|3|4513.80|0.04|0.04|N|O|1995-07-28|1995-07-31|1995-08-17|NONE|AIR|quickly even accounts sleep quic +22784|168|21|2|31|33112.96|0.00|0.02|N|O|1995-08-18|1995-07-17|1995-09-04|TAKE BACK RETURN|TRUCK|y according to the unusual instructions. +22784|779|76|3|22|36954.94|0.04|0.07|N|O|1995-07-27|1995-06-24|1995-08-05|NONE|AIR|hy pinto beans. dependencies haggle. sl +22784|28|79|4|46|42688.92|0.07|0.07|N|O|1995-08-07|1995-08-22|1995-08-27|COLLECT COD|MAIL|y regular dependencies boost b +22785|508|69|1|20|28170.00|0.06|0.03|R|F|1993-11-05|1993-12-28|1993-11-25|TAKE BACK RETURN|MAIL|forges use quickly blithely ironic +22785|159|86|2|42|44484.30|0.00|0.06|A|F|1993-12-28|1993-12-27|1994-01-14|TAKE BACK RETURN|TRUCK|ronic, stealthy excuses against the cour +22785|1194|31|3|3|3285.57|0.04|0.07|R|F|1993-11-18|1994-01-02|1993-11-24|DELIVER IN PERSON|TRUCK|unts are carefully account +22786|789|86|1|21|35485.38|0.08|0.07|N|O|1996-09-15|1996-08-30|1996-09-20|TAKE BACK RETURN|FOB|silent platele +22786|1396|73|2|20|25947.80|0.03|0.01|N|O|1996-07-23|1996-09-09|1996-08-07|COLLECT COD|FOB|nts are blithely requests. slyly +22786|1820|21|3|21|36158.22|0.00|0.08|N|O|1996-07-16|1996-08-18|1996-07-23|COLLECT COD|MAIL|xpress packages. silently final plat +22786|27|3|4|26|24102.52|0.02|0.08|N|O|1996-09-24|1996-09-26|1996-10-20|COLLECT COD|FOB|e packages. slyly even foxes throug +22786|1942|75|5|37|68225.78|0.06|0.07|N|O|1996-08-29|1996-09-29|1996-09-09|NONE|RAIL|lar patterns against the slyly ironic ins +22787|211|12|1|28|31113.88|0.02|0.02|N|O|1995-07-09|1995-05-12|1995-07-14|TAKE BACK RETURN|SHIP| sleep across the furiously bold instructi +22787|312|41|2|28|33944.68|0.02|0.05|N|O|1995-07-16|1995-05-07|1995-08-04|DELIVER IN PERSON|TRUCK|regular, regular requests. bli +22787|1257|95|3|33|38222.25|0.08|0.05|N|O|1995-06-26|1995-05-14|1995-07-04|DELIVER IN PERSON|REG AIR|rmanently. final, final idea +22787|380|9|4|23|29448.74|0.05|0.08|N|O|1995-07-06|1995-05-23|1995-08-04|NONE|MAIL|deposits. fluffily regula +22787|906|7|5|33|59627.70|0.06|0.07|N|O|1995-07-06|1995-06-08|1995-07-18|DELIVER IN PERSON|TRUCK|ake against the specia +22787|1341|18|6|3|3727.02|0.01|0.07|N|F|1995-06-09|1995-07-02|1995-07-01|NONE|RAIL|lithely even instructions. fur +22787|519|50|7|31|44004.81|0.01|0.05|N|O|1995-07-18|1995-06-23|1995-08-11|DELIVER IN PERSON|RAIL|special ideas are aga +22788|1611|53|1|5|7563.05|0.02|0.02|N|O|1998-07-31|1998-06-24|1998-08-18|NONE|TRUCK|ffix blithely fluffily express excu +22788|1135|72|2|15|15541.95|0.02|0.01|N|O|1998-07-21|1998-07-19|1998-08-03|TAKE BACK RETURN|SHIP|accounts. re +22788|1203|4|3|37|40855.40|0.09|0.05|N|O|1998-07-08|1998-07-12|1998-08-02|COLLECT COD|REG AIR|ully regular pinto beans! ironic, iron +22788|236|91|4|3|3408.69|0.03|0.03|N|O|1998-06-07|1998-07-21|1998-07-04|DELIVER IN PERSON|AIR|depths: fluffily regular warthogs +22788|809|10|5|4|6839.20|0.06|0.01|N|O|1998-06-08|1998-07-20|1998-06-14|DELIVER IN PERSON|RAIL|ully across the dependencies. carefully fl +22789|402|90|1|23|29955.20|0.02|0.06|N|O|1996-05-08|1996-03-24|1996-05-16|DELIVER IN PERSON|RAIL|endencies. ir +22789|1324|39|2|27|33083.64|0.01|0.04|N|O|1996-05-08|1996-04-05|1996-05-10|DELIVER IN PERSON|AIR|furiously pending requests-- special i +22790|183|84|1|26|28162.68|0.09|0.08|N|O|1998-04-07|1998-04-29|1998-04-18|COLLECT COD|AIR|deposits. i +22790|289|17|2|46|54706.88|0.04|0.06|N|O|1998-04-20|1998-06-01|1998-04-23|NONE|RAIL|slyly even excuses boost +22790|1621|45|3|29|44155.98|0.09|0.05|N|O|1998-06-12|1998-05-13|1998-06-19|NONE|FOB|structions wake quiet +22790|843|77|4|16|27901.44|0.04|0.01|N|O|1998-06-07|1998-04-28|1998-06-28|COLLECT COD|AIR|ts integrate slyly accounts. slyly even req +22790|1831|61|5|38|65847.54|0.07|0.00|N|O|1998-07-03|1998-06-05|1998-07-28|COLLECT COD|REG AIR| pearls sleep carefully. +22790|417|5|6|40|52696.40|0.04|0.06|N|O|1998-05-31|1998-05-19|1998-06-28|NONE|RAIL| alongside of the carefully +22791|149|76|1|16|16786.24|0.02|0.08|N|O|1997-04-12|1997-03-06|1997-04-30|DELIVER IN PERSON|RAIL|y regular platelets. carefully regul +22791|819|20|2|19|32676.39|0.04|0.04|N|O|1997-03-29|1997-04-24|1997-04-22|COLLECT COD|SHIP|nusual excuses. deposits w +22791|1983|72|3|9|16964.82|0.01|0.08|N|O|1997-05-15|1997-03-12|1997-06-08|NONE|TRUCK|ggle regular, final packages. blithely +22791|624|25|4|6|9147.72|0.03|0.07|N|O|1997-03-12|1997-02-27|1997-03-25|COLLECT COD|FOB|ts x-ray against the blit +22816|579|70|1|22|32550.54|0.03|0.03|R|F|1995-05-27|1995-05-18|1995-06-14|DELIVER IN PERSON|FOB|nal requests. pending instructio +22816|131|58|2|35|36089.55|0.00|0.01|N|F|1995-05-31|1995-07-01|1995-06-23|TAKE BACK RETURN|AIR|sly accounts. carefully bold packages sleep +22816|1046|82|3|10|9470.40|0.00|0.07|N|O|1995-08-11|1995-05-22|1995-09-08|DELIVER IN PERSON|TRUCK|y blithely final instructions. permane +22817|1112|13|1|48|48629.28|0.04|0.06|A|F|1993-02-26|1993-01-05|1993-03-12|DELIVER IN PERSON|AIR|the regular somas; carefully express pack +22817|1660|84|2|4|6246.64|0.08|0.06|R|F|1993-01-08|1993-01-24|1993-01-22|DELIVER IN PERSON|REG AIR|y regular requests. furiously ironic dinos +22817|1875|76|3|49|87066.63|0.06|0.02|R|F|1993-02-17|1992-12-27|1993-02-24|DELIVER IN PERSON|SHIP|thely bold foxes. quickly unusual instruc +22818|504|95|1|5|7022.50|0.03|0.01|R|F|1994-06-13|1994-07-15|1994-06-20|TAKE BACK RETURN|SHIP|press requests. quickly thin accounts prom +22818|86|37|2|4|3944.32|0.03|0.03|R|F|1994-07-27|1994-07-14|1994-08-24|COLLECT COD|MAIL|aggle carefully express instructions. caref +22818|1088|89|3|20|19781.60|0.06|0.04|A|F|1994-07-11|1994-08-15|1994-07-14|COLLECT COD|REG AIR|d deposits sleep quickly final, express +22818|1627|10|4|31|47387.22|0.02|0.07|R|F|1994-08-21|1994-07-17|1994-08-29|NONE|MAIL|fully unusual requests cajole +22818|1699|41|5|42|67228.98|0.05|0.04|A|F|1994-08-15|1994-08-18|1994-09-04|COLLECT COD|AIR|es. pending +22818|1966|99|6|1|1867.96|0.05|0.05|A|F|1994-08-04|1994-08-05|1994-08-09|NONE|FOB|l theodolites. blithe +22818|1537|38|7|39|56102.67|0.03|0.04|R|F|1994-06-25|1994-07-02|1994-07-03|TAKE BACK RETURN|RAIL|luffily. carefully express +22819|857|91|1|42|73829.70|0.02|0.08|R|F|1993-01-01|1993-02-06|1993-01-31|DELIVER IN PERSON|MAIL|ch furiously even platelets. regul +22819|1828|58|2|47|81301.54|0.01|0.00|R|F|1993-01-06|1993-01-14|1993-01-31|COLLECT COD|REG AIR| requests. carefully regular dep +22819|1461|40|3|16|21799.36|0.01|0.08|R|F|1993-02-24|1992-12-28|1993-03-13|COLLECT COD|FOB|d the thin accounts +22819|1471|89|4|41|56271.27|0.08|0.01|R|F|1993-01-07|1993-01-25|1993-01-27|NONE|FOB|es. finall +22820|1036|7|1|35|32796.05|0.00|0.08|R|F|1993-09-21|1993-11-15|1993-09-25|TAKE BACK RETURN|REG AIR|deas use never slowly regul +22820|1715|58|2|30|48501.30|0.06|0.00|R|F|1993-11-18|1993-10-06|1993-11-27|DELIVER IN PERSON|SHIP|odolites. dolphins ha +22820|1589|90|3|20|29811.60|0.07|0.01|R|F|1993-10-21|1993-09-25|1993-11-04|NONE|REG AIR|nic frets use ruthlessly unusual +22820|98|99|4|41|40921.69|0.02|0.05|A|F|1993-09-24|1993-10-09|1993-10-16|COLLECT COD|RAIL|regular accounts nag pending asympto +22820|760|93|5|9|14946.84|0.06|0.07|A|F|1993-10-07|1993-11-03|1993-10-14|DELIVER IN PERSON|TRUCK|y dogged ideas impress carefully +22821|1344|59|1|28|34869.52|0.06|0.05|N|O|1997-04-18|1997-04-18|1997-05-08|TAKE BACK RETURN|REG AIR|oldly final requests are according to +22821|519|10|2|13|18453.63|0.05|0.08|N|O|1997-05-06|1997-04-28|1997-05-07|NONE|AIR|y unusual pinto beans. furiously s +22821|194|95|3|43|47050.17|0.09|0.07|N|O|1997-07-02|1997-04-18|1997-07-22|TAKE BACK RETURN|RAIL|eep quickly carefully ironic +22821|1484|85|4|48|66503.04|0.05|0.01|N|O|1997-04-07|1997-05-26|1997-05-02|NONE|RAIL|le furiously about the +22822|813|80|1|21|35990.01|0.07|0.06|A|F|1993-12-03|1993-12-26|1993-12-30|DELIVER IN PERSON|REG AIR|otes boost slyly idly even pearls. furiousl +22822|1527|68|2|27|38570.04|0.07|0.03|A|F|1994-01-29|1993-12-13|1994-02-28|DELIVER IN PERSON|FOB|efully final requests. ironic excuses sleep +22822|1506|27|3|31|43632.50|0.04|0.08|R|F|1994-03-05|1994-01-03|1994-03-09|DELIVER IN PERSON|REG AIR|s run ironic, regular hockey pla +22822|256|38|4|30|34687.50|0.00|0.03|A|F|1994-01-25|1994-01-01|1994-01-30|TAKE BACK RETURN|FOB|ecial theodolites hinder furiously +22823|726|59|1|3|4880.16|0.10|0.07|N|O|1997-03-15|1997-04-06|1997-03-25|TAKE BACK RETURN|REG AIR|sts. carefully sp +22823|1875|19|2|4|7107.48|0.05|0.03|N|O|1997-05-20|1997-03-25|1997-06-03|COLLECT COD|AIR| final deposits. dolphins sleep accor +22823|1029|100|3|2|1860.04|0.04|0.01|N|O|1997-05-04|1997-04-17|1997-05-17|DELIVER IN PERSON|SHIP|luffily express packages. fi +22848|224|6|1|6|6745.32|0.09|0.02|N|O|1996-02-06|1996-02-20|1996-02-20|TAKE BACK RETURN|REG AIR|ent, final requests-- even instructio +22848|247|2|2|13|14914.12|0.05|0.08|N|O|1996-01-22|1996-03-09|1996-01-31|COLLECT COD|FOB|. fluffily final req +22848|1225|63|3|19|21398.18|0.02|0.06|N|O|1996-03-31|1996-01-27|1996-04-25|DELIVER IN PERSON|MAIL|. regular asymptotes solve +22848|1395|72|4|2|2592.78|0.06|0.05|N|O|1996-02-01|1996-01-12|1996-02-10|COLLECT COD|REG AIR|t carefully quick +22848|959|28|5|48|89277.60|0.00|0.02|N|O|1996-01-17|1996-02-15|1996-02-13|DELIVER IN PERSON|TRUCK|pending pa +22848|1647|30|6|32|49556.48|0.08|0.00|N|O|1995-12-31|1996-02-19|1996-01-17|NONE|SHIP|ironic accounts. packages use- +22849|1287|88|1|1|1188.28|0.08|0.00|A|F|1995-05-24|1995-04-10|1995-06-14|NONE|SHIP|tructions sleep accor +22849|129|56|2|31|31902.72|0.00|0.06|A|F|1995-05-30|1995-04-09|1995-06-05|NONE|SHIP|even packages may solve quickly +22849|920|23|3|36|65553.12|0.07|0.01|R|F|1995-05-22|1995-05-12|1995-05-26|TAKE BACK RETURN|SHIP| pinto beans. express platelets c +22849|331|32|4|6|7387.98|0.08|0.08|R|F|1995-04-11|1995-04-10|1995-05-11|TAKE BACK RETURN|TRUCK|accounts sleep along the ironic +22849|688|20|5|42|66724.56|0.04|0.04|A|F|1995-04-29|1995-05-05|1995-05-06|DELIVER IN PERSON|SHIP|onic deposits are blithely about the fur +22849|1789|16|6|24|40578.72|0.08|0.07|A|F|1995-03-16|1995-03-26|1995-04-04|COLLECT COD|TRUCK|nt, ironic requ +22849|1225|26|7|12|13514.64|0.02|0.02|R|F|1995-03-09|1995-04-18|1995-04-05|COLLECT COD|FOB|ld platelets solve above t +22850|135|14|1|47|48651.11|0.06|0.08|R|F|1995-05-07|1995-06-09|1995-05-29|DELIVER IN PERSON|RAIL|along the caref +22850|276|4|2|27|31759.29|0.05|0.04|R|F|1995-05-10|1995-06-19|1995-06-08|TAKE BACK RETURN|RAIL|dependencies +22850|489|19|3|11|15284.28|0.07|0.02|R|F|1995-05-09|1995-07-07|1995-05-20|DELIVER IN PERSON|SHIP|posits. slyly specia +22850|1672|96|4|31|48783.77|0.02|0.07|A|F|1995-05-15|1995-07-03|1995-05-28|COLLECT COD|RAIL|s cajole carefully. quickly even dep +22850|526|17|5|48|68472.96|0.09|0.00|R|F|1995-05-22|1995-07-27|1995-06-12|TAKE BACK RETURN|REG AIR|are carefully. packages after the bra +22851|438|97|1|20|26768.60|0.06|0.00|R|F|1994-05-26|1994-05-22|1994-06-15|COLLECT COD|MAIL|the quickly unusual grouches cajole +22851|1638|39|2|29|44649.27|0.00|0.06|A|F|1994-04-29|1994-04-03|1994-05-05|TAKE BACK RETURN|TRUCK|he regular depend +22851|823|57|3|9|15514.38|0.05|0.02|R|F|1994-03-15|1994-05-09|1994-04-12|TAKE BACK RETURN|MAIL|ckages. blithel +22851|1891|35|4|7|12550.23|0.02|0.06|R|F|1994-03-08|1994-04-30|1994-03-29|COLLECT COD|SHIP|even instructions boost +22851|196|49|5|44|48232.36|0.04|0.03|A|F|1994-06-19|1994-04-11|1994-07-10|NONE|AIR|ar, special theodolites use s +22851|1231|43|6|34|38495.82|0.04|0.04|A|F|1994-05-12|1994-05-16|1994-05-16|TAKE BACK RETURN|SHIP|ular packages nag carefully. regular +22852|1891|92|1|29|51993.81|0.10|0.01|N|O|1997-06-12|1997-05-16|1997-06-26|TAKE BACK RETURN|FOB|heodolites. blithely ironic pa +22852|1580|1|2|15|22223.70|0.03|0.08|N|O|1997-05-05|1997-05-07|1997-05-12|COLLECT COD|TRUCK|ccording to the furio +22852|862|96|3|1|1762.86|0.06|0.05|N|O|1997-06-14|1997-05-28|1997-06-29|NONE|TRUCK|ackages integrate. attainments c +22853|204|32|1|43|47480.60|0.06|0.00|R|F|1994-06-15|1994-05-29|1994-06-24|COLLECT COD|AIR|bold packages poach s +22854|1718|3|1|12|19436.52|0.05|0.03|N|O|1996-12-24|1996-10-13|1997-01-08|COLLECT COD|AIR|long the iron +22854|1373|12|2|6|7646.22|0.00|0.03|N|O|1996-09-15|1996-10-15|1996-10-10|COLLECT COD|SHIP|ltipliers. furiously even pinto be +22854|945|46|3|26|47994.44|0.09|0.01|N|O|1996-11-10|1996-10-26|1996-11-15|DELIVER IN PERSON|AIR|g the regular foxes nag blithely along t +22854|1446|47|4|46|61982.24|0.09|0.00|N|O|1996-10-29|1996-10-18|1996-11-16|NONE|SHIP|ites alongside of the special pac +22854|1932|33|5|22|40346.46|0.08|0.00|N|O|1996-11-06|1996-10-08|1996-11-17|DELIVER IN PERSON|REG AIR|ending packages. furious +22854|439|40|6|7|9376.01|0.02|0.05|N|O|1996-09-19|1996-10-23|1996-10-02|NONE|TRUCK|s. final, final depos +22854|1201|39|7|13|14328.60|0.03|0.04|N|O|1996-10-13|1996-10-24|1996-10-24|COLLECT COD|FOB|s. final instructions wa +22855|282|64|1|36|42562.08|0.03|0.06|N|O|1997-10-01|1997-10-08|1997-10-29|COLLECT COD|REG AIR|s haggle quickly among the fluffily regula +22855|1196|69|2|14|15360.66|0.00|0.08|N|O|1997-10-18|1997-09-19|1997-10-21|DELIVER IN PERSON|AIR| wake carefully at the regula +22880|1237|49|1|40|45529.20|0.00|0.07|A|F|1993-07-29|1993-08-11|1993-08-17|COLLECT COD|FOB|kages. even, regular deposits nag arou +22880|1941|30|2|25|46073.50|0.04|0.07|A|F|1993-06-08|1993-08-02|1993-06-28|COLLECT COD|MAIL|pendencies cajole silent, iron +22880|1218|56|3|22|24622.62|0.01|0.04|A|F|1993-06-19|1993-07-03|1993-07-05|TAKE BACK RETURN|SHIP|s among the slyly special dependencies wake +22880|303|60|4|25|30082.50|0.03|0.00|R|F|1993-07-24|1993-07-30|1993-07-26|TAKE BACK RETURN|AIR|usual dinos. busily unusual instructions +22880|1769|12|5|30|50122.80|0.08|0.01|A|F|1993-07-06|1993-08-21|1993-07-15|TAKE BACK RETURN|RAIL|eodolites wake +22880|876|43|6|22|39091.14|0.08|0.05|R|F|1993-08-08|1993-06-30|1993-08-16|TAKE BACK RETURN|REG AIR|regular requests haggle carefully +22881|1390|5|1|43|55529.77|0.06|0.06|A|F|1993-07-04|1993-05-29|1993-07-24|TAKE BACK RETURN|TRUCK|in-- slyly ironic packages print bli +22881|1008|44|2|10|9090.00|0.05|0.08|A|F|1993-07-20|1993-06-29|1993-07-24|DELIVER IN PERSON|RAIL|ously. regular foxes acco +22882|1659|83|1|18|28091.70|0.03|0.01|A|F|1993-11-18|1993-12-06|1993-12-11|NONE|SHIP|ts x-ray furio +22882|621|84|2|10|15216.20|0.02|0.00|R|F|1993-10-19|1993-12-10|1993-11-06|TAKE BACK RETURN|MAIL|e carefull +22882|692|93|3|11|17519.59|0.00|0.08|R|F|1993-10-27|1993-10-21|1993-11-14|DELIVER IN PERSON|RAIL|aggle carefully above the sl +22882|182|61|4|26|28136.68|0.07|0.03|A|F|1993-12-22|1993-10-27|1994-01-12|NONE|REG AIR|ages. slyly special deposits +22883|1730|15|1|20|32634.60|0.08|0.02|R|F|1992-06-12|1992-05-11|1992-06-15|NONE|FOB|sleep among the blithely silent accounts. +22883|1430|48|2|1|1331.43|0.03|0.00|R|F|1992-07-18|1992-07-02|1992-07-29|DELIVER IN PERSON|FOB| pending packages are against +22884|83|59|1|27|26543.16|0.00|0.05|N|O|1996-05-17|1996-06-15|1996-06-12|COLLECT COD|TRUCK|ans. quickly +22884|1463|3|2|2|2728.92|0.01|0.08|N|O|1996-05-22|1996-07-28|1996-06-14|NONE|SHIP|luffy packages bo +22885|772|73|1|8|13382.16|0.04|0.06|R|F|1995-01-10|1995-02-01|1995-01-17|DELIVER IN PERSON|MAIL| furiously express requests sleep +22885|171|98|2|49|52487.33|0.09|0.08|R|F|1995-02-27|1995-01-02|1995-03-20|TAKE BACK RETURN|AIR|fluffily across the special asympt +22885|520|11|3|29|41195.08|0.02|0.05|R|F|1994-12-11|1995-02-14|1994-12-12|TAKE BACK RETURN|REG AIR| final accounts-- quickly even de +22885|1493|94|4|31|43229.19|0.02|0.08|R|F|1995-03-07|1995-02-18|1995-04-03|TAKE BACK RETURN|FOB| fluffily across +22885|1403|82|5|19|24783.60|0.04|0.02|R|F|1995-02-18|1994-12-31|1995-03-10|NONE|TRUCK|ions are s +22886|1529|50|1|26|37193.52|0.04|0.08|R|F|1993-04-21|1993-03-06|1993-04-23|COLLECT COD|SHIP|deas-- ironic accou +22886|871|38|2|31|54927.97|0.03|0.06|R|F|1993-03-23|1993-03-01|1993-04-19|DELIVER IN PERSON|FOB| close deposits cajole after the quickly +22886|1653|95|3|50|77732.50|0.03|0.04|A|F|1993-05-20|1993-03-17|1993-06-12|NONE|MAIL|tructions boost across th +22886|556|87|4|25|36413.75|0.04|0.08|R|F|1993-04-13|1993-03-15|1993-04-15|COLLECT COD|MAIL|usly ironic ideas boost blithely +22886|1480|20|5|17|23485.16|0.07|0.08|A|F|1993-05-13|1993-03-24|1993-05-19|TAKE BACK RETURN|RAIL|slyly even deposits after +22887|1826|70|1|40|69112.80|0.02|0.04|R|F|1994-02-27|1994-02-15|1994-03-21|DELIVER IN PERSON|SHIP|carefully express packages. furiously f +22887|359|16|2|1|1259.35|0.02|0.06|R|F|1994-02-26|1994-01-31|1994-03-14|DELIVER IN PERSON|RAIL|ackages. blith +22887|1648|72|3|43|66634.52|0.04|0.06|R|F|1994-01-14|1994-02-06|1994-02-13|DELIVER IN PERSON|AIR|counts impress quic +22887|885|52|4|10|17858.80|0.07|0.01|A|F|1993-12-30|1993-12-21|1994-01-11|COLLECT COD|REG AIR|ross the carefully blithe deposits wa +22912|1740|83|1|20|32834.80|0.05|0.08|A|F|1994-02-05|1994-01-03|1994-02-27|COLLECT COD|TRUCK|requests. fluffily pe +22912|1626|50|2|33|50411.46|0.07|0.05|R|F|1994-02-05|1994-01-07|1994-02-16|TAKE BACK RETURN|AIR|eas nag alongside of +22912|21|72|3|48|44208.96|0.03|0.02|R|F|1993-12-19|1993-11-22|1994-01-04|NONE|TRUCK|y. slyly bold +22912|1555|36|4|45|65544.75|0.07|0.02|R|F|1993-11-06|1993-12-03|1993-11-13|COLLECT COD|MAIL|kly after the final packages. even pinto +22913|1433|51|1|34|45370.62|0.01|0.06|R|F|1993-08-08|1993-08-14|1993-09-05|COLLECT COD|RAIL|sts affix always across the +22913|44|20|2|2|1888.08|0.07|0.08|R|F|1993-08-08|1993-08-16|1993-08-19|DELIVER IN PERSON|FOB|st along the furiously regular +22913|829|30|3|44|76112.08|0.02|0.07|A|F|1993-10-04|1993-08-03|1993-10-30|TAKE BACK RETURN|RAIL|blithely ironic pinto be +22913|778|43|4|41|68829.57|0.00|0.01|R|F|1993-08-16|1993-09-20|1993-09-01|DELIVER IN PERSON|SHIP|use ironically bl +22913|938|41|5|43|79073.99|0.05|0.01|A|F|1993-08-07|1993-08-28|1993-08-24|DELIVER IN PERSON|AIR|daring reque +22913|129|30|6|23|23669.76|0.06|0.01|A|F|1993-07-04|1993-07-28|1993-07-27|TAKE BACK RETURN|TRUCK|dencies above the even requests are furiou +22913|982|83|7|21|39542.58|0.00|0.05|A|F|1993-07-20|1993-08-29|1993-08-17|COLLECT COD|MAIL|nd the final req +22914|951|54|1|31|57410.45|0.10|0.07|A|F|1992-03-21|1992-02-25|1992-04-03|COLLECT COD|AIR|tions. silent, regular excuses above the s +22914|374|3|2|31|39505.47|0.09|0.06|R|F|1992-02-12|1992-03-19|1992-03-07|COLLECT COD|FOB|ackages along the carefully special depe +22914|148|49|3|21|22010.94|0.03|0.04|R|F|1992-02-02|1992-03-24|1992-02-05|NONE|TRUCK|express instructions +22914|446|5|4|26|35007.44|0.01|0.08|A|F|1992-03-07|1992-04-13|1992-04-03|COLLECT COD|FOB|ch. regular accounts +22914|1678|2|5|31|48969.77|0.06|0.02|A|F|1992-03-26|1992-03-18|1992-04-01|COLLECT COD|REG AIR|nst the silent +22914|1315|30|6|42|51085.02|0.08|0.06|R|F|1992-01-19|1992-03-22|1992-02-06|TAKE BACK RETURN|AIR|unusual ac +22914|398|83|7|49|63621.11|0.03|0.05|A|F|1992-05-08|1992-02-23|1992-05-25|NONE|RAIL|side of the re +22915|1023|29|1|7|6468.14|0.08|0.01|N|O|1997-12-01|1997-11-25|1997-12-31|NONE|SHIP|express asymptotes are across the sil +22915|1898|28|2|43|77395.27|0.01|0.01|N|O|1997-12-30|1997-12-13|1998-01-16|TAKE BACK RETURN|FOB|ts. even accou +22916|661|93|1|13|20301.58|0.01|0.03|R|F|1992-03-12|1992-04-30|1992-04-02|COLLECT COD|MAIL|detect furiously according to th +22917|1677|1|1|10|15786.70|0.05|0.06|R|F|1994-03-05|1994-04-26|1994-03-15|TAKE BACK RETURN|MAIL|sleep blit +22917|366|95|2|47|59518.92|0.09|0.07|R|F|1994-03-27|1994-04-09|1994-04-25|DELIVER IN PERSON|REG AIR|t. slyly ironic the +22917|1492|93|3|17|23689.33|0.09|0.03|A|F|1994-05-28|1994-04-20|1994-06-22|NONE|SHIP|furiously final excus +22917|1517|98|4|41|58158.91|0.04|0.08|R|F|1994-03-10|1994-05-08|1994-03-29|NONE|REG AIR|oss the carefully final foxes wake f +22918|620|21|1|14|21288.68|0.06|0.02|N|O|1996-05-16|1996-04-14|1996-05-18|TAKE BACK RETURN|AIR|ts wake bli +22918|1808|9|2|17|29066.60|0.10|0.01|N|O|1996-05-17|1996-03-14|1996-05-19|NONE|MAIL| quickly r +22918|989|58|3|5|9449.90|0.05|0.08|N|O|1996-02-03|1996-03-23|1996-02-11|NONE|FOB|ackages are fluffily. regularly specia +22918|1026|97|4|10|9270.20|0.06|0.07|N|O|1996-05-05|1996-04-21|1996-05-18|TAKE BACK RETURN|RAIL|tain carefully accounts. accounts haggle ac +22918|105|58|5|44|44224.40|0.09|0.00|N|O|1996-05-12|1996-03-26|1996-05-16|COLLECT COD|MAIL|kly. ironic grouches engage at the slyl +22918|1418|97|6|29|38262.89|0.08|0.02|N|O|1996-02-24|1996-04-09|1996-03-09|DELIVER IN PERSON|AIR|counts are against the slyly ironic +22918|1628|70|7|10|15296.20|0.07|0.02|N|O|1996-02-07|1996-04-05|1996-02-11|COLLECT COD|TRUCK|pecial requests sublate slyly +22919|841|75|1|20|34836.80|0.08|0.02|R|F|1994-10-06|1994-08-20|1994-10-14|COLLECT COD|MAIL|l requests breach furiously pending depo +22944|514|75|1|5|7072.55|0.01|0.07|N|O|1997-08-06|1997-09-15|1997-08-09|DELIVER IN PERSON|FOB|nal accounts. ca +22944|1777|4|2|20|33575.40|0.05|0.01|N|O|1997-08-20|1997-08-24|1997-09-11|NONE|FOB|eans. regular theodolites haggle blithel +22945|799|32|1|20|33995.80|0.04|0.05|R|F|1995-04-03|1995-05-11|1995-04-29|DELIVER IN PERSON|MAIL|ual requests u +22945|246|1|2|41|46995.84|0.00|0.08|N|O|1995-07-25|1995-05-14|1995-08-08|COLLECT COD|MAIL| regular deposits about the ironic packag +22945|414|73|3|32|42061.12|0.04|0.01|A|F|1995-06-09|1995-05-14|1995-06-11|DELIVER IN PERSON|TRUCK| accounts. deposits sle +22945|1506|27|4|46|64745.00|0.05|0.05|N|O|1995-06-26|1995-06-25|1995-07-23|NONE|REG AIR|kly express accounts boost car +22945|1451|52|5|43|58155.35|0.08|0.06|N|O|1995-07-10|1995-06-09|1995-07-20|NONE|SHIP| sometimes fina +22946|864|64|1|19|33532.34|0.02|0.06|R|F|1994-01-14|1994-03-18|1994-01-31|NONE|MAIL|blithely furiously even +22946|1480|59|2|9|12433.32|0.03|0.07|A|F|1994-03-20|1994-02-19|1994-04-11|DELIVER IN PERSON|REG AIR|iously ironi +22946|256|38|3|41|47406.25|0.04|0.05|A|F|1994-04-25|1994-02-11|1994-05-23|DELIVER IN PERSON|MAIL|even ideas lose after the blithely final r +22946|1024|60|4|23|21275.46|0.09|0.07|R|F|1994-01-13|1994-03-18|1994-01-30|DELIVER IN PERSON|AIR|eans. fluffily fin +22946|1715|42|5|29|46884.59|0.05|0.00|R|F|1994-01-17|1994-03-17|1994-01-22|TAKE BACK RETURN|AIR|fily thin p +22946|500|88|6|19|26609.50|0.03|0.02|A|F|1994-03-12|1994-04-09|1994-04-06|DELIVER IN PERSON|RAIL|equests. car +22946|22|73|7|19|17518.38|0.02|0.01|A|F|1994-05-06|1994-02-28|1994-05-19|COLLECT COD|REG AIR|e blithely express excuses nag quickly +22947|1693|35|1|15|23920.35|0.06|0.01|R|F|1995-01-06|1995-03-09|1995-01-12|NONE|AIR|ongside of the blithely e +22947|220|2|2|48|53770.56|0.05|0.07|R|F|1995-03-16|1995-03-18|1995-03-28|COLLECT COD|RAIL| mold. accounts against the sly +22947|1641|65|3|9|13883.76|0.01|0.04|A|F|1994-12-28|1995-02-27|1995-01-22|COLLECT COD|RAIL|hely alongsid +22947|594|25|4|46|68751.14|0.08|0.06|R|F|1994-12-22|1995-02-08|1995-01-02|COLLECT COD|MAIL|ns. special, unu +22947|1307|22|5|50|60415.00|0.00|0.01|R|F|1995-04-11|1995-03-19|1995-04-29|DELIVER IN PERSON|FOB|ter the carefully final accounts. slyly +22948|508|39|1|26|36621.00|0.00|0.07|R|F|1993-02-06|1993-01-09|1993-02-17|TAKE BACK RETURN|TRUCK|ally silent accounts. pending, regular +22948|1157|94|2|44|46558.60|0.00|0.00|A|F|1992-11-27|1993-01-17|1992-11-29|TAKE BACK RETURN|MAIL|unts nag along the ideas. finally specia +22948|1340|79|3|4|4965.36|0.05|0.01|A|F|1993-02-24|1993-01-16|1993-03-14|DELIVER IN PERSON|TRUCK| blithely regular deposits lose furio +22948|1533|74|4|43|61684.79|0.03|0.00|R|F|1992-12-05|1993-01-08|1992-12-26|DELIVER IN PERSON|SHIP|ts. blithel +22948|645|46|5|12|18547.68|0.02|0.04|A|F|1993-01-19|1993-01-04|1993-02-03|COLLECT COD|FOB|structions wake deposits. express warthog +22949|1986|31|1|12|22655.76|0.03|0.03|N|O|1998-06-30|1998-07-10|1998-07-13|COLLECT COD|MAIL|ang quickly alongside of the express +22949|1321|36|2|50|61116.00|0.07|0.06|N|O|1998-08-22|1998-08-05|1998-09-18|TAKE BACK RETURN|FOB| unusual deposits alongside of the even +22949|1866|10|3|39|68946.54|0.01|0.03|N|O|1998-07-01|1998-07-18|1998-07-07|DELIVER IN PERSON|AIR| according to the express deposits. qui +22950|213|14|1|6|6679.26|0.05|0.05|N|O|1996-03-02|1996-01-29|1996-03-26|DELIVER IN PERSON|FOB|ze through the un +22950|585|76|2|39|57937.62|0.05|0.01|N|O|1996-03-12|1996-03-13|1996-04-07|COLLECT COD|AIR|telets; furiously even requests a +22950|1754|97|3|23|38082.25|0.10|0.03|N|O|1996-01-29|1996-03-01|1996-02-28|COLLECT COD|MAIL|sauternes boost quickly about the slyly +22951|849|16|1|2|3499.68|0.10|0.02|R|F|1992-08-30|1992-06-07|1992-09-26|DELIVER IN PERSON|FOB|y regular theodolit +22951|1298|36|2|12|14391.48|0.00|0.07|A|F|1992-08-25|1992-07-20|1992-09-15|DELIVER IN PERSON|RAIL|tions against the instructions haggle +22976|411|70|1|47|61636.27|0.09|0.05|N|O|1998-04-26|1998-05-11|1998-05-08|TAKE BACK RETURN|RAIL|al packages according to the quick +22976|615|16|2|17|25765.37|0.01|0.01|N|O|1998-05-20|1998-05-24|1998-06-05|NONE|FOB|usly regular accounts. carefu +22976|1719|20|3|49|79414.79|0.08|0.04|N|O|1998-06-15|1998-06-03|1998-06-30|DELIVER IN PERSON|RAIL|n, final deposits. requests +22976|1998|43|4|3|5699.97|0.04|0.03|N|O|1998-04-14|1998-06-06|1998-04-26|TAKE BACK RETURN|RAIL|lly even pinto beans ca +22977|333|90|1|1|1233.33|0.01|0.08|N|O|1995-09-22|1995-11-08|1995-10-22|TAKE BACK RETURN|FOB|lithely special pinto beans. +22978|1737|22|1|5|8193.65|0.10|0.03|A|F|1994-05-11|1994-07-02|1994-06-06|DELIVER IN PERSON|REG AIR|fts detect quickly about the slyly bold pla +22978|237|19|2|5|5686.15|0.03|0.04|R|F|1994-07-14|1994-06-12|1994-07-15|DELIVER IN PERSON|FOB|pinto beans after the ideas boost fur +22978|869|70|3|13|23008.18|0.10|0.03|A|F|1994-04-26|1994-06-20|1994-05-05|DELIVER IN PERSON|SHIP|special pinto beans +22978|649|43|4|18|27893.52|0.06|0.04|A|F|1994-04-23|1994-06-26|1994-05-15|COLLECT COD|SHIP|are. blithely even packages +22978|1006|12|5|19|17233.00|0.01|0.07|R|F|1994-04-05|1994-06-29|1994-05-03|TAKE BACK RETURN|TRUCK|egular packages. c +22978|42|43|6|38|35797.52|0.08|0.08|A|F|1994-07-17|1994-06-29|1994-08-10|NONE|SHIP| blithely regular +22979|1821|51|1|42|72358.44|0.04|0.08|A|F|1992-10-09|1992-11-26|1992-11-04|TAKE BACK RETURN|FOB|s according to the final +22979|694|95|2|17|27109.73|0.04|0.06|R|F|1992-11-28|1992-12-15|1992-12-12|COLLECT COD|FOB|ven theodolites. slyly ironic deposits na +22980|1355|70|1|17|21357.95|0.06|0.04|A|F|1993-01-01|1992-11-29|1993-01-25|DELIVER IN PERSON|AIR|s! ironical +22980|996|97|2|12|22763.88|0.09|0.02|R|F|1992-12-20|1992-12-18|1993-01-15|TAKE BACK RETURN|FOB|carefully sil +22980|672|66|3|37|58188.79|0.07|0.08|A|F|1992-10-04|1992-12-09|1992-10-13|COLLECT COD|RAIL|lithely regular packages. final +22980|108|9|4|28|28226.80|0.04|0.03|A|F|1992-10-03|1992-11-07|1992-10-27|COLLECT COD|RAIL|ular pinto beans try to detect abo +22980|873|40|5|1|1773.87|0.07|0.08|A|F|1992-11-17|1992-11-05|1992-12-11|TAKE BACK RETURN|MAIL|fully final theodolites. q +22981|1799|84|1|49|83338.71|0.01|0.08|N|O|1995-06-29|1995-07-22|1995-07-19|COLLECT COD|AIR|nt accounts. requests sleep. care +22982|36|12|1|38|35569.14|0.08|0.08|N|O|1996-03-05|1996-01-29|1996-03-12|TAKE BACK RETURN|RAIL|s. accounts a +22982|945|80|2|21|38764.74|0.03|0.01|N|O|1996-01-10|1996-02-18|1996-01-29|TAKE BACK RETURN|TRUCK|s. blithely even +22982|1738|39|3|49|80346.77|0.03|0.04|N|O|1996-01-01|1996-02-06|1996-01-23|DELIVER IN PERSON|AIR|posits about the even pinto beans a +22982|805|39|4|42|71643.60|0.01|0.08|N|O|1996-01-09|1996-03-21|1996-01-31|COLLECT COD|REG AIR|requests are accordi +22983|977|78|1|17|31925.49|0.05|0.04|R|F|1995-02-01|1995-02-08|1995-02-08|COLLECT COD|AIR|gside of the regula +23008|215|70|1|41|45723.61|0.00|0.00|R|F|1995-01-25|1994-11-16|1995-02-11|COLLECT COD|TRUCK|ncies cajole about the enticingly ir +23008|1825|26|2|34|58711.88|0.09|0.04|A|F|1994-10-18|1994-12-28|1994-10-19|TAKE BACK RETURN|FOB|ges. even packages promise +23008|1882|83|3|41|73139.08|0.01|0.03|A|F|1994-11-06|1994-11-12|1994-11-22|NONE|SHIP|r ideas are. regular exc +23008|483|84|4|42|58106.16|0.05|0.07|A|F|1994-10-17|1994-11-18|1994-11-14|TAKE BACK RETURN|AIR|o beans against the requests snooze car +23008|612|44|5|50|75630.50|0.02|0.06|A|F|1994-12-15|1994-12-24|1994-12-29|NONE|TRUCK|eodolites. regul +23009|962|31|1|5|9314.80|0.04|0.04|R|F|1992-06-16|1992-07-01|1992-07-02|TAKE BACK RETURN|REG AIR|ests. final +23009|434|22|2|26|34695.18|0.00|0.00|A|F|1992-06-26|1992-05-29|1992-07-26|NONE|REG AIR|te. regular ac +23009|192|93|3|24|26212.56|0.07|0.05|A|F|1992-05-07|1992-07-26|1992-05-08|COLLECT COD|FOB|ding, sly dependencies. instructions about +23009|431|90|4|39|51925.77|0.07|0.04|A|F|1992-07-02|1992-06-21|1992-07-17|DELIVER IN PERSON|TRUCK|uffy pinto beans-- furiously even r +23010|522|53|1|35|49788.20|0.01|0.07|R|F|1992-04-25|1992-03-05|1992-04-29|TAKE BACK RETURN|REG AIR|nag slyly according to the slyly unusual re +23010|1286|98|2|9|10685.52|0.09|0.08|A|F|1992-01-12|1992-02-17|1992-01-22|NONE|TRUCK|ly. special, speci +23010|792|25|3|30|50783.70|0.03|0.06|R|F|1992-04-16|1992-03-24|1992-05-06|COLLECT COD|TRUCK|ons. ironic courts are c +23010|148|75|4|5|5240.70|0.09|0.08|R|F|1992-02-18|1992-02-22|1992-03-06|NONE|SHIP|al deposits. express accounts boost +23011|398|83|1|19|24669.41|0.04|0.06|A|F|1993-06-19|1993-09-02|1993-07-14|COLLECT COD|MAIL|gedly never unusu +23011|807|41|2|46|78558.80|0.10|0.06|A|F|1993-09-23|1993-07-31|1993-10-04|COLLECT COD|REG AIR|nal, final packages. unusual req +23011|1797|40|3|46|78144.34|0.01|0.02|A|F|1993-07-10|1993-08-08|1993-07-29|COLLECT COD|MAIL|lithely regular reque +23011|1732|59|4|47|76785.31|0.01|0.06|A|F|1993-07-11|1993-07-27|1993-07-16|DELIVER IN PERSON|TRUCK|ly regular inst +23011|100|26|5|7|7000.70|0.03|0.03|A|F|1993-06-23|1993-09-05|1993-06-29|COLLECT COD|FOB|terns sleep carefully +23011|1957|58|6|46|85511.70|0.01|0.03|A|F|1993-06-18|1993-07-20|1993-07-12|DELIVER IN PERSON|AIR|efully even deposits. care +23012|1902|91|1|9|16235.10|0.09|0.01|N|O|1996-10-17|1996-09-19|1996-11-13|COLLECT COD|MAIL| asymptotes +23012|229|57|2|22|24842.84|0.08|0.04|N|O|1996-12-01|1996-09-27|1996-12-19|TAKE BACK RETURN|SHIP|ully ironic pinto +23012|1317|32|3|6|7309.86|0.01|0.02|N|O|1996-12-07|1996-11-12|1996-12-10|COLLECT COD|TRUCK|ns sleep blithely final foxes +23012|1895|25|4|48|86250.72|0.07|0.05|N|O|1996-11-09|1996-09-22|1996-11-12|NONE|MAIL|quickly pending req +23012|433|21|5|20|26668.60|0.08|0.00|N|O|1996-12-03|1996-10-13|1997-01-01|DELIVER IN PERSON|FOB|thely. decoys cajo +23013|436|24|1|9|12027.87|0.03|0.07|R|F|1993-07-13|1993-08-17|1993-07-23|COLLECT COD|REG AIR|s against the blithely i +23013|126|27|2|20|20522.40|0.10|0.05|R|F|1993-10-24|1993-09-08|1993-11-19|NONE|TRUCK|ual, final deposits sleep bold p +23013|1294|32|3|45|53788.05|0.03|0.03|R|F|1993-09-15|1993-08-02|1993-09-24|NONE|MAIL|uests. fluffily express accoun +23013|624|87|4|37|56410.94|0.10|0.08|A|F|1993-09-30|1993-09-17|1993-10-19|TAKE BACK RETURN|SHIP|fluffily furiously unusual ideas. de +23013|1571|92|5|35|51539.95|0.03|0.06|A|F|1993-09-14|1993-08-09|1993-10-03|TAKE BACK RETURN|AIR|l deposits +23014|31|82|1|45|41896.35|0.02|0.03|N|O|1996-01-21|1995-12-29|1996-02-05|TAKE BACK RETURN|MAIL|ithely. fluffily pending r +23015|1265|66|1|17|19826.42|0.07|0.05|R|F|1992-02-27|1992-02-28|1992-03-04|TAKE BACK RETURN|REG AIR|r the furiously even sentiments +23015|1655|56|2|50|77832.50|0.10|0.07|A|F|1992-02-21|1992-04-06|1992-03-16|NONE|RAIL|y express dolphins nag carefully careful +23015|259|14|3|13|15070.25|0.00|0.00|A|F|1992-01-16|1992-03-20|1992-02-02|COLLECT COD|TRUCK|tly special forges +23040|168|95|1|10|10681.60|0.00|0.00|N|O|1997-09-25|1997-09-18|1997-10-15|DELIVER IN PERSON|TRUCK|ously even instructions. +23040|922|25|2|24|43750.08|0.01|0.07|N|O|1997-09-20|1997-09-20|1997-10-03|COLLECT COD|MAIL|carefully a +23040|431|19|3|33|43937.19|0.04|0.07|N|O|1997-11-01|1997-10-26|1997-11-04|TAKE BACK RETURN|FOB|bout the special deposits; caref +23040|416|46|4|13|17113.33|0.10|0.06|N|O|1997-08-10|1997-09-10|1997-08-13|NONE|FOB| careful instructions cajole whith +23041|957|92|1|10|18579.50|0.02|0.02|R|F|1993-08-14|1993-09-26|1993-08-21|DELIVER IN PERSON|REG AIR| dolphins? fluffily ironic request +23041|1573|14|2|36|53084.52|0.04|0.07|A|F|1993-08-19|1993-10-19|1993-09-12|NONE|MAIL|ongside of the even +23041|522|13|3|22|31295.44|0.03|0.06|A|F|1993-08-20|1993-09-30|1993-09-10|DELIVER IN PERSON|SHIP| cajole slyly. quickly p +23041|453|41|4|31|41956.95|0.00|0.01|R|F|1993-08-17|1993-09-23|1993-08-28|DELIVER IN PERSON|MAIL| to the slyly close asymptote +23041|1942|31|5|20|36878.80|0.04|0.04|R|F|1993-09-06|1993-10-15|1993-09-14|NONE|FOB|lites. instr +23041|1368|83|6|30|38080.80|0.00|0.03|R|F|1993-11-10|1993-08-26|1993-11-14|DELIVER IN PERSON|RAIL| the carefully bold reques +23042|1448|49|1|30|40483.20|0.06|0.04|A|F|1994-05-11|1994-07-06|1994-05-29|DELIVER IN PERSON|TRUCK|eep blithely. quickly final foxes doubt th +23043|1005|6|1|44|39864.00|0.02|0.08|N|O|1995-08-05|1995-07-12|1995-08-14|NONE|TRUCK|al packages. special deposits c +23043|668|62|2|49|76864.34|0.06|0.02|R|F|1995-06-07|1995-07-14|1995-06-11|COLLECT COD|FOB|riously unusual i +23044|9|35|1|34|30906.00|0.07|0.00|N|O|1996-12-21|1997-01-10|1996-12-22|DELIVER IN PERSON|REG AIR|thy, permanent gifts are about the carefull +23044|632|95|2|14|21456.82|0.09|0.07|N|O|1997-01-23|1996-12-03|1997-01-30|NONE|FOB|e quickly. quickl +23044|72|98|3|37|35966.59|0.02|0.07|N|O|1997-02-17|1997-01-14|1997-03-01|TAKE BACK RETURN|FOB|taphs. blithely final requ +23044|93|69|4|38|37737.42|0.00|0.01|N|O|1996-11-12|1997-01-05|1996-11-20|COLLECT COD|FOB|e blithely along the evenly fin +23044|1968|1|5|44|82278.24|0.00|0.00|N|O|1996-10-25|1997-01-15|1996-11-14|DELIVER IN PERSON|TRUCK|inly slyly regular pa +23044|36|62|6|2|1872.06|0.10|0.04|N|O|1996-12-10|1997-01-16|1996-12-20|TAKE BACK RETURN|AIR|al packages; carefully special pin +23044|901|2|7|22|39641.80|0.06|0.05|N|O|1997-02-07|1997-01-08|1997-02-28|DELIVER IN PERSON|RAIL|final theodolites. blithely fluffy dinos a +23045|1066|72|1|1|967.06|0.02|0.08|N|O|1996-04-07|1996-05-16|1996-05-05|DELIVER IN PERSON|RAIL| pending pac +23045|1407|47|2|25|32710.00|0.10|0.05|N|O|1996-06-24|1996-05-14|1996-07-23|TAKE BACK RETURN|REG AIR|egular asymptotes. bold requests must +23045|1322|37|3|24|29359.68|0.00|0.00|N|O|1996-03-23|1996-04-12|1996-04-12|NONE|MAIL|sly even instructions. e +23046|261|43|1|21|24386.46|0.04|0.07|R|F|1994-01-23|1993-12-20|1994-02-07|NONE|AIR|instructions. reques +23046|1212|50|2|42|46754.82|0.09|0.03|A|F|1994-02-01|1993-12-23|1994-02-04|DELIVER IN PERSON|FOB|. requests nod. furiously special pack +23046|1389|28|3|43|55486.34|0.03|0.04|A|F|1993-10-19|1993-11-23|1993-10-20|NONE|SHIP|carefully final packages. fur +23046|682|83|4|34|53811.12|0.05|0.03|A|F|1994-01-10|1993-11-09|1994-01-16|DELIVER IN PERSON|SHIP|bold theodolites cajole blithely fu +23046|1476|77|5|50|68873.50|0.06|0.03|A|F|1993-10-12|1993-11-27|1993-10-21|DELIVER IN PERSON|FOB|fully special excuses. blithel +23046|1293|94|6|10|11942.90|0.06|0.05|A|F|1993-11-11|1993-12-24|1993-11-14|COLLECT COD|SHIP|es. ironic instructions +23046|1677|19|7|8|12629.36|0.08|0.03|A|F|1993-12-07|1993-11-22|1993-12-13|NONE|AIR|ully even depths! carefully final reques +23047|320|5|1|32|39050.24|0.02|0.02|N|O|1996-07-12|1996-08-11|1996-07-18|NONE|RAIL|ckly regular deposits against the requests +23047|1768|95|2|47|78478.72|0.10|0.05|N|O|1996-07-21|1996-06-15|1996-08-11|DELIVER IN PERSON|FOB| might play s +23047|138|39|3|9|9343.17|0.00|0.07|N|O|1996-06-17|1996-08-04|1996-06-19|COLLECT COD|MAIL|es affix slyly ev +23047|1974|7|4|21|39395.37|0.08|0.03|N|O|1996-08-29|1996-08-07|1996-09-06|COLLECT COD|RAIL|ely final dependencies. carefully final in +23047|1624|25|5|17|25935.54|0.05|0.02|N|O|1996-08-19|1996-07-06|1996-08-23|TAKE BACK RETURN|FOB|ironic, even accou +23072|1874|75|1|50|88793.50|0.00|0.01|N|O|1996-11-06|1996-10-27|1996-11-12|NONE|SHIP|ven ideas was fluffily b +23073|454|55|1|37|50114.65|0.04|0.06|A|F|1993-06-11|1993-05-22|1993-07-10|NONE|TRUCK|le furiously at +23073|939|42|2|29|53357.97|0.06|0.06|A|F|1993-06-11|1993-05-18|1993-06-20|DELIVER IN PERSON|FOB|long the final, final instru +23073|746|43|3|9|14820.66|0.00|0.03|A|F|1993-04-28|1993-06-12|1993-05-05|TAKE BACK RETURN|FOB|s. blithely regul +23073|1250|88|4|31|35688.75|0.01|0.08|R|F|1993-05-17|1993-05-27|1993-05-18|TAKE BACK RETURN|SHIP|are enticingly regular requests. final, i +23073|812|12|5|29|49671.49|0.04|0.00|R|F|1993-05-11|1993-05-04|1993-05-22|DELIVER IN PERSON|SHIP| pending re +23073|1781|24|6|47|79090.66|0.00|0.06|A|F|1993-05-18|1993-06-14|1993-05-28|NONE|AIR|. special, bold realms solve c +23073|500|59|7|30|42015.00|0.07|0.03|R|F|1993-04-26|1993-05-14|1993-05-19|NONE|TRUCK|blithely regular acc +23074|644|38|1|46|71053.44|0.10|0.05|N|O|1998-08-31|1998-07-17|1998-09-12|TAKE BACK RETURN|RAIL|efully furiously regular dependencies. ca +23074|56|32|2|33|31549.65|0.01|0.00|N|O|1998-06-26|1998-08-09|1998-07-11|TAKE BACK RETURN|SHIP|mptotes haggle fluffil +23075|1401|19|1|29|37769.60|0.06|0.07|A|F|1994-07-06|1994-06-07|1994-07-12|TAKE BACK RETURN|REG AIR| special deposits hag +23076|1985|18|1|19|35852.62|0.08|0.05|R|F|1994-07-17|1994-07-18|1994-07-22|TAKE BACK RETURN|RAIL|ans wake daringly. unus +23076|1241|16|2|45|51400.80|0.02|0.03|R|F|1994-09-14|1994-07-13|1994-10-08|COLLECT COD|SHIP|old requests haggl +23076|1924|25|3|18|32866.56|0.01|0.08|R|F|1994-07-10|1994-08-06|1994-07-11|COLLECT COD|MAIL|eodolites according to the carefully even +23076|1118|19|4|28|28535.08|0.05|0.06|A|F|1994-07-19|1994-07-30|1994-07-22|COLLECT COD|FOB|uests. packages sublate fluffily regular +23076|1807|37|5|24|41011.20|0.06|0.04|R|F|1994-05-31|1994-07-10|1994-06-01|DELIVER IN PERSON|TRUCK|ke alongside of the c +23076|677|9|6|21|33131.07|0.06|0.04|R|F|1994-07-12|1994-08-03|1994-07-18|COLLECT COD|RAIL|requests. somas wake even, bold depos +23077|1313|52|1|36|43715.16|0.04|0.08|N|O|1998-05-20|1998-05-24|1998-05-25|DELIVER IN PERSON|REG AIR| even packages. slyly ironic the +23077|136|63|2|36|37300.68|0.03|0.04|N|O|1998-06-26|1998-05-25|1998-07-20|DELIVER IN PERSON|REG AIR|ggle fluffily th +23077|1103|12|3|24|24098.40|0.09|0.05|N|O|1998-03-29|1998-04-04|1998-04-25|DELIVER IN PERSON|SHIP| to the pending, +23077|1098|69|4|26|25976.34|0.04|0.06|N|O|1998-05-21|1998-04-22|1998-06-04|NONE|AIR|ing to the deposits. fluffil +23078|832|66|1|2|3465.66|0.00|0.08|N|O|1995-11-13|1995-10-29|1995-12-02|DELIVER IN PERSON|REG AIR| the theodolites. furiously pending acco +23078|785|82|2|10|16857.80|0.10|0.07|N|O|1995-12-24|1995-10-18|1996-01-06|NONE|AIR|y bold dependencies ha +23078|593|94|3|43|64224.37|0.01|0.08|N|O|1995-11-11|1995-10-28|1995-11-15|NONE|REG AIR|accounts against the requests are +23078|1949|82|4|1|1850.94|0.00|0.01|N|O|1995-12-12|1995-11-09|1995-12-26|DELIVER IN PERSON|MAIL|pt the ironic, ironic +23078|1478|79|5|14|19312.58|0.10|0.08|N|O|1995-12-03|1995-12-07|1995-12-06|COLLECT COD|FOB|ithely regular +23078|1712|13|6|13|20978.23|0.01|0.01|N|O|1995-09-19|1995-10-23|1995-09-22|TAKE BACK RETURN|SHIP|eve slyly alo +23078|1256|57|7|23|26616.75|0.07|0.03|N|O|1995-11-05|1995-11-15|1995-11-25|COLLECT COD|AIR|express theodolites. slyly special +23079|1099|70|1|44|44003.96|0.00|0.08|N|O|1997-04-13|1997-04-30|1997-04-29|TAKE BACK RETURN|TRUCK|unts; quietly special +23079|1179|52|2|23|24843.91|0.10|0.05|N|O|1997-03-28|1997-05-10|1997-04-19|NONE|FOB|e furiously even instructions ar +23079|1121|58|3|40|40884.80|0.07|0.03|N|O|1997-05-28|1997-04-06|1997-06-08|COLLECT COD|FOB|ounts. quickly furious excus +23079|69|45|4|15|14535.90|0.02|0.02|N|O|1997-04-03|1997-03-26|1997-04-06|TAKE BACK RETURN|TRUCK|ans cajole fu +23104|1934|67|1|28|51406.04|0.03|0.04|N|O|1995-07-31|1995-05-29|1995-08-06|COLLECT COD|REG AIR|lites sleep ironically after the slyly e +23104|293|48|2|25|29832.25|0.00|0.07|R|F|1995-05-01|1995-06-09|1995-05-15|DELIVER IN PERSON|RAIL| regular foxes. perm +23104|1520|61|3|36|51174.72|0.06|0.03|R|F|1995-05-11|1995-05-16|1995-06-05|TAKE BACK RETURN|MAIL|ide of the fluffil +23105|1910|55|1|3|5435.73|0.06|0.06|A|F|1994-10-25|1995-01-08|1994-11-02|TAKE BACK RETURN|TRUCK|he slyly regular foxes. unu +23105|956|91|2|32|59422.40|0.04|0.01|R|F|1995-01-06|1995-01-11|1995-02-02|TAKE BACK RETURN|TRUCK|es. pinto beans integr +23105|1094|100|3|18|17911.62|0.00|0.08|R|F|1994-10-18|1995-01-11|1994-10-19|COLLECT COD|RAIL|s. dogged accounts s +23105|635|29|4|13|19963.19|0.00|0.08|A|F|1994-12-13|1994-12-01|1994-12-18|DELIVER IN PERSON|SHIP|y across the requests. slyly +23106|367|24|1|8|10138.88|0.04|0.04|A|F|1993-11-28|1994-01-10|1993-12-15|COLLECT COD|REG AIR| furiously ironic instructions. deposits +23106|1525|66|2|50|71326.00|0.01|0.07|A|F|1994-01-16|1993-12-01|1994-01-30|DELIVER IN PERSON|REG AIR|uickly regular deposits. instr +23106|1636|78|3|20|30752.60|0.01|0.06|A|F|1993-11-03|1994-01-09|1993-11-15|NONE|TRUCK|ate quickly regular ideas. packages sleep +23106|157|84|4|19|20085.85|0.07|0.08|A|F|1994-01-30|1993-11-28|1994-02-01|NONE|REG AIR|usly regular accounts acr +23106|409|39|5|19|24878.60|0.01|0.01|A|F|1993-12-18|1993-12-19|1994-01-11|TAKE BACK RETURN|FOB|totes. deposits across the fluffily +23106|1408|48|6|15|19641.00|0.09|0.02|R|F|1994-01-25|1993-12-14|1994-02-06|COLLECT COD|AIR|n requests. requests are +23107|783|84|1|37|62299.86|0.06|0.07|N|O|1995-06-30|1995-08-19|1995-07-28|COLLECT COD|AIR|lent accounts solve blithel +23108|1438|39|1|12|16073.16|0.09|0.08|N|O|1998-04-16|1998-06-25|1998-05-09|TAKE BACK RETURN|RAIL|even requests was carefully carefully fin +23108|1453|71|2|20|27089.00|0.07|0.07|N|O|1998-07-20|1998-06-15|1998-08-06|TAKE BACK RETURN|REG AIR|e fluffily a +23108|553|84|3|11|15989.05|0.04|0.04|N|O|1998-06-05|1998-06-29|1998-06-21|COLLECT COD|TRUCK|l theodolites. final accounts h +23108|646|40|4|20|30932.80|0.03|0.04|N|O|1998-04-22|1998-05-16|1998-05-11|NONE|TRUCK|s. slyly thin requests haggle a +23108|949|52|5|34|62897.96|0.07|0.00|N|O|1998-04-16|1998-06-26|1998-05-07|COLLECT COD|RAIL|nusual requests. ironic +23108|656|19|6|2|3113.30|0.00|0.07|N|O|1998-05-10|1998-05-24|1998-06-04|DELIVER IN PERSON|MAIL|es play carefu +23109|606|7|1|27|40678.20|0.03|0.05|N|O|1997-08-12|1997-07-29|1997-08-14|NONE|SHIP|, regular excuses cajole express, unusua +23109|1791|76|2|26|44012.54|0.02|0.03|N|O|1997-05-16|1997-07-22|1997-05-26|NONE|REG AIR|blithely bold deposits. +23110|920|89|1|19|34597.48|0.04|0.06|N|O|1997-01-25|1996-12-20|1997-01-30|TAKE BACK RETURN|SHIP|e blithely bold requests are flu +23110|1984|73|2|50|94299.00|0.07|0.01|N|O|1996-12-09|1996-12-10|1996-12-18|TAKE BACK RETURN|RAIL|ly ironic foxes wake fluffil +23110|242|97|3|18|20560.32|0.01|0.01|N|O|1996-12-15|1996-12-16|1996-12-18|NONE|TRUCK| of the furiously regul +23111|614|77|1|28|42409.08|0.00|0.07|A|F|1992-08-13|1992-07-04|1992-08-31|COLLECT COD|MAIL|. accounts haggle carefully +23111|1527|8|2|15|21427.80|0.07|0.00|R|F|1992-07-05|1992-07-07|1992-07-31|DELIVER IN PERSON|REG AIR|ng courts beside the special requests +23111|783|48|3|5|8418.90|0.10|0.01|A|F|1992-07-29|1992-05-28|1992-08-15|TAKE BACK RETURN|FOB|lyly silent ideas. slyly ironic deposit +23111|1482|100|4|25|34587.00|0.02|0.03|R|F|1992-06-21|1992-07-24|1992-07-03|COLLECT COD|TRUCK|o beans. carefully unusual +23111|1111|84|5|25|25302.75|0.00|0.02|R|F|1992-07-12|1992-06-22|1992-07-17|TAKE BACK RETURN|MAIL|olites los +23111|649|43|6|26|40290.64|0.04|0.00|R|F|1992-07-14|1992-07-25|1992-07-29|DELIVER IN PERSON|FOB|gle slyly afte +23111|1200|9|7|25|27530.00|0.10|0.03|R|F|1992-05-09|1992-06-14|1992-06-06|NONE|FOB|y players maintain. carefully regular inst +23136|606|38|1|25|37665.00|0.04|0.07|A|F|1994-12-20|1994-12-15|1994-12-21|COLLECT COD|REG AIR|arefully regular sheaves a +23136|125|52|2|11|11276.32|0.05|0.02|R|F|1994-12-11|1994-11-07|1994-12-12|DELIVER IN PERSON|AIR| furiously acr +23136|1444|23|3|38|51126.72|0.09|0.06|A|F|1994-11-29|1994-10-29|1994-12-23|TAKE BACK RETURN|MAIL|p. pending requests wake across the bo +23136|1766|51|4|2|3335.52|0.02|0.05|A|F|1994-11-14|1994-12-17|1994-12-08|TAKE BACK RETURN|MAIL|affix regular, express +23136|1667|9|5|10|15686.60|0.05|0.05|A|F|1994-12-11|1994-11-13|1994-12-27|COLLECT COD|RAIL|old dependenci +23136|413|14|6|6|7880.46|0.05|0.05|R|F|1994-11-07|1994-11-11|1994-11-08|DELIVER IN PERSON|REG AIR|wake regular foxes +23137|314|43|1|29|35214.99|0.04|0.00|A|F|1993-02-07|1992-12-19|1993-02-23|TAKE BACK RETURN|AIR|sly pending theodolites are qu +23137|1141|78|2|9|9379.26|0.09|0.03|R|F|1993-02-24|1993-01-14|1993-03-10|DELIVER IN PERSON|MAIL|ges. carefully express theodolites haggle +23138|1806|93|1|29|49526.20|0.10|0.00|N|O|1997-09-17|1997-10-11|1997-10-14|TAKE BACK RETURN|FOB|s. packages are fluffi +23138|735|36|2|40|65429.20|0.00|0.08|N|O|1997-09-20|1997-09-27|1997-10-14|NONE|REG AIR|. slyly final theodolites haggle fu +23138|1091|62|3|45|44644.05|0.05|0.06|N|O|1997-08-17|1997-09-24|1997-08-18|TAKE BACK RETURN|AIR|e quickly regular theodolites. b +23138|1427|6|4|11|14612.62|0.04|0.06|N|O|1997-08-02|1997-09-21|1997-08-16|COLLECT COD|AIR|sual accounts. carefully e +23139|733|34|1|17|27773.41|0.08|0.04|N|O|1995-08-30|1995-07-30|1995-09-18|NONE|RAIL|arefully special accounts. regular braids +23139|717|18|2|29|46913.59|0.02|0.05|N|O|1995-09-07|1995-07-20|1995-10-06|DELIVER IN PERSON|SHIP|riously bold requests. furiously bold +23139|1078|84|3|42|41120.94|0.05|0.02|R|F|1995-06-12|1995-07-09|1995-06-15|TAKE BACK RETURN|RAIL|daringly eve +23140|1036|42|1|29|27173.87|0.03|0.06|A|F|1992-06-07|1992-05-02|1992-06-26|DELIVER IN PERSON|REG AIR|foxes cajole blithely fluffi +23140|1834|35|2|9|15622.47|0.04|0.00|R|F|1992-03-06|1992-03-30|1992-03-24|NONE|SHIP|r the furiously regular theodolit +23140|1622|46|3|35|53326.70|0.05|0.00|R|F|1992-05-04|1992-04-08|1992-05-12|COLLECT COD|RAIL|uriously even acc +23140|568|59|4|47|69022.32|0.10|0.06|A|F|1992-04-27|1992-04-07|1992-05-18|TAKE BACK RETURN|MAIL|old theodolites against the carefu +23140|1457|36|5|28|38036.60|0.03|0.08|R|F|1992-05-16|1992-04-07|1992-06-12|COLLECT COD|TRUCK| special theodolites boost silently +23140|335|92|6|33|40765.89|0.02|0.07|R|F|1992-06-09|1992-03-15|1992-06-15|COLLECT COD|SHIP|ick excuses nag carefully slyly fin +23140|1242|43|7|34|38870.16|0.09|0.06|A|F|1992-02-24|1992-04-20|1992-03-08|COLLECT COD|AIR| furiously pending depend +23141|420|21|1|19|25087.98|0.10|0.02|N|O|1997-09-30|1997-11-04|1997-10-01|NONE|AIR|ts. ironic accounts wake blithely blithely +23141|490|49|2|9|12514.41|0.01|0.03|N|O|1997-10-11|1997-11-05|1997-10-20|DELIVER IN PERSON|AIR|cajole furiously around the +23141|1778|63|3|35|58791.95|0.07|0.01|N|O|1997-10-17|1997-09-11|1997-11-09|TAKE BACK RETURN|SHIP|xes nod. e +23141|1462|80|4|1|1363.46|0.05|0.01|N|O|1997-10-22|1997-10-20|1997-11-08|NONE|SHIP|s are furiously +23141|1158|67|5|1|1059.15|0.03|0.02|N|O|1997-08-25|1997-09-27|1997-09-22|NONE|MAIL|ress deposits sleep bold platelets. ironic +23142|154|33|1|45|47436.75|0.01|0.04|N|O|1996-07-26|1996-08-02|1996-07-29|TAKE BACK RETURN|RAIL|s are furiously above the fluffily special +23142|636|30|2|23|35342.49|0.07|0.02|N|O|1996-06-03|1996-07-06|1996-06-06|NONE|FOB|y special excuses. quick +23142|771|4|3|13|21733.01|0.07|0.05|N|O|1996-09-25|1996-07-13|1996-10-20|COLLECT COD|SHIP|onic accounts grow. fluffily +23142|1789|16|4|13|21980.14|0.10|0.03|N|O|1996-06-20|1996-07-26|1996-07-08|NONE|MAIL| sleep slyly careful +23142|1115|52|5|24|24386.64|0.06|0.00|N|O|1996-06-20|1996-07-10|1996-07-04|DELIVER IN PERSON|TRUCK|tructions. carefully bold deposits are! flu +23143|1570|51|1|20|29431.40|0.04|0.01|N|O|1996-11-01|1996-11-23|1996-11-22|COLLECT COD|AIR|ld pinto beans affix slowly. bold requ +23168|1282|20|1|36|42598.08|0.08|0.03|R|F|1993-12-01|1993-12-14|1993-12-26|TAKE BACK RETURN|TRUCK|sits nag carefully ironic, +23168|186|65|2|49|53222.82|0.07|0.07|A|F|1994-01-08|1993-12-07|1994-02-05|TAKE BACK RETURN|MAIL|ajole about the unusual packages. fu +23168|772|37|3|32|53528.64|0.00|0.01|R|F|1993-12-30|1993-11-14|1994-01-22|NONE|AIR|wake boldly about the regular instru +23168|1372|87|4|50|63668.50|0.09|0.01|A|F|1993-10-02|1993-12-08|1993-10-05|COLLECT COD|AIR|uffily ruthl +23168|1438|56|5|46|61613.78|0.05|0.00|R|F|1993-09-27|1993-11-18|1993-10-21|NONE|AIR|ly pending theodolites. regular +23168|1544|25|6|10|14455.40|0.04|0.01|R|F|1993-10-09|1993-10-16|1993-10-30|DELIVER IN PERSON|RAIL|ze fluffily; slyly ir +23168|499|87|7|34|47582.66|0.01|0.01|A|F|1993-11-19|1993-11-14|1993-12-06|NONE|TRUCK|ges nag. qui +23169|332|17|1|26|32040.58|0.05|0.06|N|O|1995-10-05|1995-08-03|1995-10-11|COLLECT COD|REG AIR|carefully even asymptotes. unusual, +23169|1772|57|2|42|70298.34|0.02|0.01|N|O|1995-08-22|1995-08-05|1995-08-30|DELIVER IN PERSON|REG AIR| final dependencies alon +23169|790|55|3|39|65940.81|0.04|0.03|N|O|1995-08-01|1995-09-06|1995-08-12|TAKE BACK RETURN|AIR| blithe waters. furio +23169|1774|1|4|18|30163.86|0.09|0.06|N|O|1995-06-28|1995-08-01|1995-07-15|TAKE BACK RETURN|SHIP|ld sheaves cajole carefully +23169|1501|42|5|26|36465.00|0.01|0.04|N|O|1995-06-25|1995-08-09|1995-07-09|TAKE BACK RETURN|TRUCK| the blithely ironic accoun +23170|443|73|1|43|57767.92|0.02|0.04|A|F|1994-07-24|1994-08-05|1994-08-12|COLLECT COD|REG AIR|ges alongside of the forge +23170|680|12|2|48|75872.64|0.04|0.05|A|F|1994-06-03|1994-07-31|1994-06-20|DELIVER IN PERSON|MAIL|eposits. slyly final ideas after the +23170|1300|12|3|32|38441.60|0.02|0.08|A|F|1994-07-19|1994-07-25|1994-08-01|NONE|RAIL|platelets haggle furiou +23170|463|22|4|34|46357.64|0.09|0.04|R|F|1994-09-17|1994-07-10|1994-09-18|NONE|MAIL|. furiously even instructions cajole +23170|1882|83|5|6|10703.28|0.08|0.05|R|F|1994-07-23|1994-08-08|1994-08-12|NONE|SHIP|al deposits? regu +23170|931|34|6|3|5495.79|0.10|0.05|A|F|1994-09-18|1994-07-16|1994-10-11|COLLECT COD|SHIP| final ideas use carefully final +23170|982|17|7|12|22595.76|0.01|0.04|A|F|1994-09-09|1994-08-04|1994-10-09|NONE|MAIL|l patterns. blithely unusu +23171|897|64|1|22|39553.58|0.09|0.02|N|O|1996-09-18|1996-07-26|1996-10-05|TAKE BACK RETURN|REG AIR|olites are slyly about the pend +23171|1270|71|2|14|16397.78|0.00|0.08|N|O|1996-07-28|1996-08-25|1996-08-11|NONE|RAIL|er above the packages. fluf +23171|586|17|3|19|28245.02|0.08|0.08|N|O|1996-09-28|1996-07-29|1996-10-05|COLLECT COD|FOB|nusual, final requests. furiously ironic +23171|2000|1|4|47|42394.00|0.03|0.06|N|O|1996-10-22|1996-09-22|1996-10-31|COLLECT COD|MAIL|ayers. instructions are slyly express +23172|719|20|1|11|17816.81|0.06|0.03|R|F|1992-05-29|1992-07-20|1992-06-04|DELIVER IN PERSON|MAIL|efully among the p +23172|1877|21|2|4|7115.48|0.04|0.04|A|F|1992-06-24|1992-07-12|1992-07-08|TAKE BACK RETURN|SHIP| bold accounts c +23172|1408|87|3|33|43210.20|0.09|0.00|A|F|1992-06-07|1992-05-25|1992-06-16|TAKE BACK RETURN|TRUCK|deas try to play fu +23173|869|3|1|45|79643.70|0.00|0.00|N|O|1998-07-22|1998-08-16|1998-08-13|NONE|REG AIR|sual, silent ideas +23173|1433|51|2|47|62718.21|0.04|0.07|N|O|1998-08-10|1998-07-29|1998-09-08|NONE|AIR|gular instruc +23173|1121|30|3|38|38840.56|0.07|0.03|N|O|1998-10-03|1998-07-30|1998-10-06|DELIVER IN PERSON|RAIL| pending deposits. fi +23173|1852|96|4|43|75415.55|0.03|0.03|N|O|1998-08-05|1998-07-29|1998-08-31|TAKE BACK RETURN|SHIP|the furiously regular +23173|699|31|5|17|27194.73|0.08|0.05|N|O|1998-06-30|1998-09-11|1998-07-23|DELIVER IN PERSON|FOB|osits. carefully iron +23173|964|65|6|1|1864.96|0.01|0.08|N|O|1998-06-26|1998-07-18|1998-07-15|DELIVER IN PERSON|REG AIR|ickly stealthy deposit +23174|156|9|1|36|38021.40|0.10|0.04|R|F|1992-11-20|1992-10-15|1992-11-25|NONE|FOB|its. quickly regular pinto beans a +23174|1038|39|2|36|33805.08|0.01|0.00|A|F|1992-08-18|1992-09-26|1992-08-27|TAKE BACK RETURN|FOB|cross the finally bold pinto bea +23174|1474|92|3|46|63271.62|0.02|0.02|A|F|1992-11-10|1992-09-28|1992-11-11|COLLECT COD|AIR|ve the packages cajole furiously along t +23174|760|61|4|26|43179.76|0.07|0.07|R|F|1992-09-09|1992-09-01|1992-09-16|COLLECT COD|REG AIR|furiously blithely bol +23174|436|37|5|23|30737.89|0.07|0.05|A|F|1992-08-16|1992-10-14|1992-09-12|TAKE BACK RETURN|RAIL|y blithely regular pinto beans. s +23174|236|18|6|14|15907.22|0.05|0.08|A|F|1992-08-21|1992-10-24|1992-09-02|NONE|FOB|y final deposits cajole carefully regular r +23175|1951|52|1|13|24088.35|0.10|0.04|N|O|1996-04-24|1996-04-26|1996-05-10|TAKE BACK RETURN|TRUCK|ar theodolites. frets hinder b +23175|388|73|2|9|11595.42|0.10|0.08|N|O|1996-05-17|1996-04-03|1996-05-24|NONE|AIR|luffily furious +23200|516|47|1|19|26913.69|0.01|0.04|N|O|1996-12-27|1996-12-24|1997-01-18|NONE|MAIL|xes. quickly ironic packages nod along t +23200|1526|27|2|23|32832.96|0.09|0.04|N|O|1997-02-12|1996-12-26|1997-03-08|TAKE BACK RETURN|REG AIR|lithely silent ac +23200|889|90|3|46|82334.48|0.04|0.07|N|O|1996-11-27|1997-01-15|1996-12-18|TAKE BACK RETURN|MAIL|xpress pinto beans haggle alongside of +23200|171|72|4|2|2142.34|0.05|0.06|N|O|1996-12-26|1996-12-11|1997-01-01|DELIVER IN PERSON|SHIP| beans boost. qui +23200|529|60|5|48|68616.96|0.06|0.07|N|O|1997-02-25|1996-12-09|1997-03-11|DELIVER IN PERSON|RAIL|spite the qu +23201|830|64|1|47|81349.01|0.01|0.07|N|O|1997-03-24|1997-02-10|1997-04-21|COLLECT COD|RAIL|yly ironic, regular theodolites. blithel +23201|369|70|2|44|55851.84|0.09|0.03|N|O|1997-02-17|1997-02-06|1997-02-24|TAKE BACK RETURN|TRUCK|g the special, ironic id +23202|1953|86|1|36|66778.20|0.09|0.05|N|O|1995-10-28|1995-10-03|1995-11-04|COLLECT COD|REG AIR|jole. slyly final Tiresias haggle blithely +23202|465|66|2|48|65542.08|0.07|0.00|N|O|1995-08-04|1995-10-17|1995-08-15|DELIVER IN PERSON|FOB|ickly final packages. packages kindle b +23202|1054|55|3|27|25786.35|0.00|0.01|N|O|1995-08-12|1995-10-23|1995-08-29|NONE|FOB|ringly unusual deposits a +23202|1707|50|4|35|56304.50|0.04|0.05|N|O|1995-11-21|1995-09-03|1995-12-15|COLLECT COD|AIR|ending requests are pending deposits? spe +23203|1313|28|1|10|12143.10|0.06|0.03|N|O|1998-01-31|1997-12-18|1998-02-05|TAKE BACK RETURN|AIR|es. furiously regular packages hagg +23203|568|29|2|30|44056.80|0.05|0.05|N|O|1997-11-07|1997-12-18|1997-11-11|COLLECT COD|SHIP|nic, regular instructions integrate fu +23203|1602|44|3|28|42100.80|0.05|0.05|N|O|1997-11-30|1997-11-30|1997-12-15|COLLECT COD|SHIP| ironic accounts +23203|412|71|4|20|26248.20|0.03|0.03|N|O|1997-11-08|1997-12-03|1997-12-07|TAKE BACK RETURN|REG AIR|ent ideas doze ruthlessly iron +23203|479|80|5|47|64835.09|0.06|0.02|N|O|1998-01-01|1997-11-18|1998-01-09|NONE|MAIL|t bold courts. even re +23204|1543|24|1|29|41891.66|0.03|0.08|N|O|1997-05-01|1997-04-27|1997-05-12|TAKE BACK RETURN|SHIP|even requests sleep slyly +23204|304|5|2|19|22881.70|0.07|0.05|N|O|1997-06-23|1997-05-07|1997-07-17|NONE|AIR|kages. carefully silent ideas d +23204|1326|41|3|4|4909.28|0.09|0.06|N|O|1997-04-13|1997-04-21|1997-05-05|COLLECT COD|MAIL|y across the decoys. blithely express theod +23205|1403|82|1|48|62611.20|0.05|0.01|R|F|1994-07-30|1994-06-28|1994-08-05|DELIVER IN PERSON|RAIL|nal packages +23205|692|55|2|36|57336.84|0.01|0.04|A|F|1994-06-14|1994-08-19|1994-06-27|DELIVER IN PERSON|REG AIR|xes haggle fluffily against t +23205|1288|100|3|48|57085.44|0.09|0.03|A|F|1994-09-21|1994-08-02|1994-10-14|COLLECT COD|SHIP|lar requests. caref +23205|622|16|4|40|60904.80|0.00|0.02|A|F|1994-07-10|1994-07-07|1994-07-12|DELIVER IN PERSON|SHIP| the blithe +23205|1401|41|5|4|5209.60|0.05|0.05|R|F|1994-06-19|1994-06-25|1994-06-21|TAKE BACK RETURN|REG AIR|cajole quickly. bold c +23205|726|91|6|5|8133.60|0.03|0.02|R|F|1994-06-14|1994-08-16|1994-07-11|NONE|AIR|s. slyly bold accounts by the slyly bol +23206|953|22|1|34|63034.30|0.04|0.04|N|O|1997-02-07|1997-02-05|1997-03-01|NONE|MAIL|rding to the fluffily re +23207|951|20|1|27|50002.65|0.09|0.04|R|F|1994-01-13|1993-12-14|1994-02-09|TAKE BACK RETURN|TRUCK|the carefully special +23207|1649|50|2|27|41867.28|0.10|0.00|R|F|1993-11-17|1993-12-25|1993-11-21|NONE|FOB| quickly furiously busy excuses. +23207|1362|63|3|10|12633.60|0.10|0.04|R|F|1994-02-04|1993-11-24|1994-02-12|NONE|AIR|ts are. regular deposits detect +23207|884|51|4|12|21418.56|0.06|0.06|R|F|1994-02-15|1993-12-29|1994-03-09|TAKE BACK RETURN|TRUCK|ic sentiments slee +23207|825|26|5|23|39693.86|0.08|0.00|A|F|1993-12-08|1994-01-08|1993-12-18|NONE|FOB|rint carefully eve +23207|167|94|6|28|29880.48|0.00|0.05|R|F|1994-01-02|1993-12-17|1994-01-12|NONE|RAIL|ependencies haggl +23232|1440|80|1|24|32194.56|0.05|0.02|R|F|1993-06-27|1993-06-05|1993-07-21|NONE|REG AIR| requests up the pending excuses us +23232|1953|42|2|24|44518.80|0.04|0.06|R|F|1993-05-13|1993-06-20|1993-05-29|NONE|FOB|es. even deposits ki +23232|1345|46|3|36|44868.24|0.00|0.04|R|F|1993-07-20|1993-05-20|1993-07-29|COLLECT COD|TRUCK|e carefully even, +23232|437|25|4|13|17386.59|0.07|0.03|A|F|1993-07-05|1993-07-01|1993-08-01|TAKE BACK RETURN|RAIL|to beans. slyly bold depo +23232|17|18|5|49|44933.49|0.09|0.04|R|F|1993-07-16|1993-06-14|1993-08-07|COLLECT COD|FOB|r accounts after the ironic +23232|1775|2|6|26|43596.02|0.05|0.00|R|F|1993-07-26|1993-06-16|1993-08-09|COLLECT COD|RAIL|riously special deposit +23232|518|19|7|33|46810.83|0.02|0.06|A|F|1993-04-23|1993-07-07|1993-05-15|COLLECT COD|RAIL|press foxes boost carefully unusual, +23233|1235|47|1|6|6817.38|0.00|0.06|R|F|1994-06-04|1994-05-02|1994-06-19|DELIVER IN PERSON|MAIL|re about the blith +23233|1968|13|2|24|44879.04|0.10|0.07|R|F|1994-03-22|1994-04-27|1994-04-13|DELIVER IN PERSON|SHIP|sly special requests integrate furio +23234|599|30|1|20|29991.80|0.10|0.04|R|F|1993-11-26|1993-10-18|1993-12-02|TAKE BACK RETURN|RAIL|ss packages; blithely even theod +23235|299|27|1|25|29982.25|0.03|0.06|N|O|1995-10-03|1995-10-04|1995-10-14|DELIVER IN PERSON|SHIP|sly bold requests. furiousl +23235|842|42|2|28|48799.52|0.07|0.03|N|O|1995-09-20|1995-08-09|1995-10-06|COLLECT COD|TRUCK|nts cajole under t +23235|109|36|3|5|5045.50|0.03|0.08|N|O|1995-08-22|1995-08-11|1995-08-25|DELIVER IN PERSON|AIR|ecial packages cajole carefull +23235|1574|15|4|26|38364.82|0.00|0.06|N|O|1995-10-29|1995-09-10|1995-10-30|COLLECT COD|MAIL| ironic packages against the blithely iron +23235|817|51|5|27|46380.87|0.05|0.03|N|O|1995-08-14|1995-08-21|1995-09-04|TAKE BACK RETURN|AIR|tes wake carefully regu +23235|1123|32|6|5|5120.60|0.01|0.06|N|O|1995-10-06|1995-10-02|1995-10-24|COLLECT COD|RAIL|r the ironic deposits b +23235|362|91|7|43|54281.48|0.05|0.03|N|O|1995-07-27|1995-08-11|1995-08-18|COLLECT COD|SHIP|unusual packag +23236|1228|3|1|36|40651.92|0.02|0.01|N|O|1998-05-06|1998-06-10|1998-06-04|DELIVER IN PERSON|TRUCK|nst the regular, unusual +23237|98|99|1|50|49904.50|0.08|0.08|N|O|1996-04-27|1996-02-22|1996-05-11|NONE|MAIL|t furiousl +23237|198|77|2|30|32945.70|0.07|0.03|N|O|1996-02-10|1996-02-12|1996-03-04|DELIVER IN PERSON|FOB|y atop the carefully ironic instructions +23237|1585|86|3|22|32704.76|0.10|0.01|N|O|1996-04-18|1996-02-19|1996-05-16|NONE|FOB|ons x-ray fluffily. pending package +23237|1744|45|4|48|78995.52|0.04|0.07|N|O|1996-03-12|1996-02-24|1996-04-06|COLLECT COD|SHIP|ackages nag. carefully ironic e +23237|1430|31|5|27|35948.61|0.09|0.02|N|O|1996-01-28|1996-02-26|1996-02-19|COLLECT COD|FOB|e foxes. accounts around the bold +23237|1300|12|6|3|3603.90|0.08|0.05|N|O|1996-02-24|1996-04-06|1996-03-08|COLLECT COD|AIR| furiously. blithely ev +23237|1570|71|7|21|30902.97|0.04|0.00|N|O|1996-03-01|1996-03-18|1996-03-23|COLLECT COD|SHIP|e slyly regular theodol +23238|894|94|1|39|70000.71|0.06|0.06|R|F|1993-06-19|1993-06-10|1993-07-03|NONE|RAIL|packages. blithely regular p +23238|1341|18|2|34|42239.56|0.01|0.05|A|F|1993-07-23|1993-05-07|1993-08-17|COLLECT COD|MAIL|ully silen +23238|1168|41|3|30|32074.80|0.03|0.06|R|F|1993-04-24|1993-06-09|1993-05-23|COLLECT COD|MAIL|. quickly bo +23238|24|75|4|10|9240.20|0.10|0.05|R|F|1993-04-16|1993-06-07|1993-04-30|NONE|RAIL|ld, bold requests after the theodolites d +23238|1151|60|5|30|31564.50|0.07|0.03|R|F|1993-07-27|1993-05-15|1993-08-20|COLLECT COD|MAIL|ily furious theodolites play carefully u +23238|607|8|6|26|39197.60|0.03|0.00|R|F|1993-05-29|1993-05-30|1993-06-25|DELIVER IN PERSON|AIR|s cajole s +23238|820|54|7|35|60228.70|0.07|0.04|R|F|1993-07-14|1993-05-07|1993-07-29|TAKE BACK RETURN|MAIL|arefully dogged asymptotes haggle slyly ab +23239|1965|10|1|22|41073.12|0.06|0.04|N|O|1997-05-30|1997-06-06|1997-06-24|TAKE BACK RETURN|RAIL|dolites. requests +23239|686|18|2|49|77747.32|0.08|0.08|N|O|1997-03-24|1997-05-21|1997-04-06|COLLECT COD|AIR|cial platelets! sl +23239|453|12|3|5|6767.25|0.02|0.00|N|O|1997-06-03|1997-04-19|1997-06-24|NONE|MAIL|se ironic in +23239|1234|9|4|41|46544.43|0.00|0.00|N|O|1997-05-29|1997-04-14|1997-06-03|NONE|RAIL|ctions wake blithely orbits. account +23239|1407|25|5|26|34018.40|0.03|0.07|N|O|1997-05-24|1997-04-17|1997-06-03|TAKE BACK RETURN|TRUCK|he slyly final theodolites. fl +23239|591|52|6|12|17899.08|0.03|0.05|N|O|1997-06-05|1997-05-28|1997-06-08|COLLECT COD|TRUCK|ickly final escapades detect abov +23264|1920|53|1|16|29150.72|0.10|0.04|R|F|1994-03-28|1994-01-15|1994-04-08|COLLECT COD|SHIP|ickly ruthless foxes. ironi +23264|1929|18|2|49|89715.08|0.07|0.04|A|F|1993-12-12|1994-02-05|1994-01-03|COLLECT COD|REG AIR|ss accounts cajole f +23264|790|23|3|49|82848.71|0.03|0.04|A|F|1994-03-03|1994-01-12|1994-03-12|DELIVER IN PERSON|AIR|he blithely regular request +23265|108|9|1|43|43348.30|0.01|0.07|N|O|1996-04-25|1996-06-05|1996-05-18|TAKE BACK RETURN|RAIL|egular foxes after the bo +23265|438|68|2|44|58890.92|0.04|0.08|N|O|1996-06-21|1996-05-07|1996-06-29|TAKE BACK RETURN|RAIL| slyly among the quickly final account +23265|1442|60|3|12|16121.28|0.05|0.06|N|O|1996-04-12|1996-05-19|1996-04-24|TAKE BACK RETURN|AIR| slyly furiously f +23265|1474|92|4|24|33011.28|0.03|0.08|N|O|1996-05-10|1996-05-23|1996-05-25|NONE|SHIP| ironic deposits. furiously final depos +23265|1476|55|5|27|37191.69|0.04|0.08|N|O|1996-05-10|1996-06-11|1996-06-01|COLLECT COD|REG AIR|ainst the furiously pending +23266|1784|27|1|27|45516.06|0.00|0.06|A|F|1995-05-21|1995-04-03|1995-05-30|TAKE BACK RETURN|REG AIR|cial, unusu +23266|988|57|2|9|17000.82|0.08|0.01|A|F|1995-03-16|1995-05-04|1995-04-06|COLLECT COD|REG AIR|en packages cajole blithely acr +23267|1215|27|1|50|55810.50|0.10|0.06|N|O|1996-09-04|1996-09-25|1996-09-29|COLLECT COD|TRUCK|odolites. slyly spe +23267|1442|21|2|19|25525.36|0.06|0.01|N|O|1996-07-04|1996-09-20|1996-07-16|COLLECT COD|RAIL|ests. carefully regular accounts +23267|1097|68|3|38|37927.42|0.06|0.08|N|O|1996-07-11|1996-08-05|1996-08-04|NONE|RAIL| sleep ruthlessly about the +23267|1913|14|4|42|76226.22|0.04|0.02|N|O|1996-10-02|1996-09-24|1996-10-19|COLLECT COD|RAIL|al theodolites cajole blithe +23267|1401|80|5|28|36467.20|0.00|0.07|N|O|1996-10-10|1996-08-16|1996-11-07|DELIVER IN PERSON|MAIL|. blithely bold th +23267|1971|60|6|6|11237.82|0.08|0.07|N|O|1996-08-02|1996-08-01|1996-08-06|DELIVER IN PERSON|TRUCK|uests use carefully +23268|1615|16|1|6|9099.66|0.01|0.02|A|F|1992-04-27|1992-02-18|1992-05-05|COLLECT COD|TRUCK|s cajole. f +23268|1369|46|2|32|40651.52|0.08|0.02|R|F|1992-02-10|1992-02-26|1992-02-28|COLLECT COD|SHIP|ial platelet +23268|826|26|3|3|5180.46|0.04|0.07|A|F|1992-03-15|1992-03-07|1992-03-22|DELIVER IN PERSON|RAIL|unts unwind carefully. carefully +23268|782|47|4|32|53848.96|0.10|0.05|R|F|1992-02-08|1992-02-20|1992-02-11|DELIVER IN PERSON|AIR| to the express foxes. +23268|1747|90|5|9|14838.66|0.05|0.07|R|F|1992-03-04|1992-02-19|1992-03-17|DELIVER IN PERSON|SHIP|ndencies grow slyl +23269|309|10|1|47|56837.10|0.03|0.01|N|O|1998-05-30|1998-04-08|1998-06-28|TAKE BACK RETURN|AIR|tes are sl +23269|1025|31|2|48|44448.96|0.04|0.02|N|O|1998-05-17|1998-04-18|1998-06-15|COLLECT COD|AIR|e at the slyly special theodo +23269|614|8|3|46|69672.06|0.06|0.08|N|O|1998-05-25|1998-04-08|1998-06-04|COLLECT COD|RAIL|er the final r +23269|1983|72|4|36|67859.28|0.05|0.06|N|O|1998-03-02|1998-05-03|1998-03-18|COLLECT COD|REG AIR|ar, regular pin +23269|894|28|5|7|12564.23|0.01|0.00|N|O|1998-03-08|1998-05-03|1998-03-25|COLLECT COD|TRUCK|ic sentiments. fluff +23270|1045|81|1|15|14190.60|0.06|0.01|A|F|1995-04-08|1995-06-09|1995-05-04|TAKE BACK RETURN|MAIL|instructions use fl +23270|515|76|2|36|50958.36|0.10|0.07|R|F|1995-04-29|1995-06-07|1995-05-09|NONE|AIR|ccounts. blithely regular re +23270|1139|12|3|22|22882.86|0.02|0.04|A|F|1995-05-07|1995-05-12|1995-05-15|NONE|REG AIR|kly after the closely silent +23270|777|78|4|34|57044.18|0.09|0.01|R|F|1995-06-03|1995-05-16|1995-06-07|COLLECT COD|REG AIR| packages a +23270|488|76|5|18|24992.64|0.09|0.05|A|F|1995-04-23|1995-05-14|1995-05-13|COLLECT COD|TRUCK|to beans until the c +23270|624|18|6|11|16770.82|0.06|0.07|R|F|1995-04-03|1995-04-19|1995-04-16|NONE|TRUCK|y quickly accord +23270|1477|56|7|43|59274.21|0.02|0.05|A|F|1995-04-22|1995-05-05|1995-05-20|TAKE BACK RETURN|MAIL| pending platelets nag fu +23271|667|30|1|32|50165.12|0.08|0.08|A|F|1993-12-15|1994-01-22|1994-01-06|COLLECT COD|RAIL|coys. slyly regular req +23271|762|59|2|15|24941.40|0.07|0.02|A|F|1993-12-04|1994-01-11|1993-12-29|COLLECT COD|REG AIR|ending theodolites cajole carefully bo +23271|1676|18|3|25|39441.75|0.08|0.05|A|F|1994-02-04|1993-12-21|1994-02-26|DELIVER IN PERSON|SHIP|e fluffily pending theodolites. blithely e +23296|1901|90|1|41|73918.90|0.06|0.02|N|O|1998-01-31|1997-12-05|1998-02-07|NONE|RAIL|the slyly unusual theodolites. carefully b +23296|1617|41|2|41|62263.01|0.06|0.06|N|O|1997-12-08|1998-01-04|1998-01-04|TAKE BACK RETURN|REG AIR|ake carefully after the +23296|1478|57|3|50|68973.50|0.06|0.05|N|O|1997-10-20|1997-12-18|1997-11-09|DELIVER IN PERSON|MAIL|ly final accounts. re +23296|1106|7|4|19|19134.90|0.07|0.03|N|O|1998-01-21|1997-11-22|1998-01-30|TAKE BACK RETURN|RAIL|s. quickly final ideas ag +23296|1566|67|5|9|13208.04|0.01|0.01|N|O|1998-01-03|1997-12-31|1998-01-24|DELIVER IN PERSON|MAIL| slyly after the +23296|1711|12|6|5|8063.55|0.00|0.06|N|O|1998-01-11|1997-12-28|1998-02-07|DELIVER IN PERSON|RAIL|, bold dolphins x-ray carefully a +23296|1839|83|7|9|15667.47|0.00|0.06|N|O|1998-01-17|1997-12-28|1998-01-24|COLLECT COD|MAIL|uickly even packages. ca +23297|1577|58|1|13|19221.41|0.00|0.03|A|F|1992-10-05|1992-09-08|1992-11-02|TAKE BACK RETURN|RAIL|he quickly express accounts. dinos shall +23297|1306|45|2|28|33804.40|0.00|0.00|R|F|1992-08-04|1992-08-30|1992-08-16|NONE|FOB|ven requests wa +23297|241|23|3|16|18259.84|0.07|0.03|A|F|1992-10-22|1992-08-09|1992-11-09|TAKE BACK RETURN|SHIP|es cajole carefully after the busi +23297|262|44|4|45|52301.70|0.06|0.01|R|F|1992-08-07|1992-08-05|1992-09-03|DELIVER IN PERSON|REG AIR|requests. blithely quick packages believe +23297|384|13|5|46|59081.48|0.08|0.00|A|F|1992-08-04|1992-09-01|1992-08-30|TAKE BACK RETURN|SHIP|l deposits. carefully pending fox +23297|1014|20|6|42|38430.42|0.06|0.05|R|F|1992-09-23|1992-09-15|1992-10-12|DELIVER IN PERSON|FOB|ntain furiously about the deposits +23297|749|14|7|48|79187.52|0.04|0.01|R|F|1992-08-17|1992-08-22|1992-08-21|TAKE BACK RETURN|TRUCK|tegrate idly blithely silent request +23298|54|55|1|16|15264.80|0.07|0.06|A|F|1994-11-16|1994-12-13|1994-12-04|COLLECT COD|RAIL|he slyly silent packages. quickly e +23298|440|99|2|50|67022.00|0.05|0.02|R|F|1995-01-12|1995-01-30|1995-02-10|COLLECT COD|MAIL|sheaves are s +23298|543|34|3|32|46193.28|0.08|0.05|A|F|1994-11-20|1994-12-24|1994-12-07|TAKE BACK RETURN|MAIL|ake silently evenly ironic accounts. car +23298|809|43|4|50|85490.00|0.10|0.06|R|F|1995-01-24|1994-12-14|1995-01-27|NONE|AIR|are blithely final, final excuses. reg +23299|581|12|1|4|5926.32|0.05|0.06|A|F|1992-10-27|1992-09-29|1992-11-03|DELIVER IN PERSON|TRUCK| the packages haggle +23299|1584|25|2|8|11884.64|0.09|0.00|A|F|1992-09-15|1992-10-06|1992-09-28|TAKE BACK RETURN|RAIL| silent, ironic dependencie +23299|1923|56|3|4|7299.68|0.05|0.04|A|F|1992-08-29|1992-11-09|1992-09-26|COLLECT COD|TRUCK|st the iron +23299|1560|41|4|3|4384.68|0.05|0.06|R|F|1992-10-04|1992-11-10|1992-10-12|DELIVER IN PERSON|FOB|iers haggle closely unusual exc +23300|1829|59|1|21|36347.22|0.00|0.04|N|O|1996-02-21|1996-04-17|1996-03-19|DELIVER IN PERSON|SHIP|olphins affix. fluffily regular i +23300|1242|17|2|39|44586.36|0.06|0.08|N|O|1996-03-12|1996-04-22|1996-04-04|TAKE BACK RETURN|FOB|gular ideas. fluffily expre +23300|1275|13|3|12|14115.24|0.10|0.08|N|O|1996-02-08|1996-04-04|1996-02-18|TAKE BACK RETURN|MAIL|nent foxes sleep car +23300|1155|64|4|32|33796.80|0.07|0.02|N|O|1996-02-10|1996-04-04|1996-03-04|NONE|FOB| haggle deposits. stealt +23300|64|15|5|10|9640.60|0.06|0.03|N|O|1996-05-25|1996-05-04|1996-05-29|COLLECT COD|MAIL|fily after the unusual +23301|919|22|1|28|50957.48|0.00|0.04|N|O|1995-08-01|1995-07-02|1995-08-23|TAKE BACK RETURN|SHIP|ironic, pending +23301|998|33|2|24|45575.76|0.09|0.02|N|O|1995-07-30|1995-06-27|1995-08-21|COLLECT COD|REG AIR|sts. fluffily special packages cajole fluf +23301|285|13|3|19|22520.32|0.02|0.00|N|O|1995-07-30|1995-05-22|1995-08-06|NONE|RAIL|s cajole carefully +23302|764|61|1|36|59931.36|0.10|0.07|N|O|1996-03-31|1996-05-07|1996-04-18|COLLECT COD|SHIP|s the courts haggle carefull +23302|569|70|2|14|20573.84|0.04|0.04|N|O|1996-03-31|1996-05-16|1996-04-07|COLLECT COD|TRUCK|he final, regular pinto be +23302|1957|90|3|15|27884.25|0.10|0.01|N|O|1996-03-29|1996-04-14|1996-04-11|NONE|MAIL|ld requests impress carefully regular, r +23302|186|13|4|37|40188.66|0.02|0.08|N|O|1996-04-11|1996-04-16|1996-05-10|COLLECT COD|TRUCK|es about the blithely special notornis sl +23302|1043|79|5|49|46257.96|0.02|0.07|N|O|1996-03-31|1996-03-29|1996-04-04|DELIVER IN PERSON|MAIL|xpress theo +23302|842|76|6|3|5228.52|0.00|0.02|N|O|1996-04-24|1996-05-13|1996-05-24|TAKE BACK RETURN|SHIP|ideas. ironic, silent gifts enga +23302|1302|79|7|2|2406.60|0.09|0.04|N|O|1996-04-10|1996-05-26|1996-05-03|DELIVER IN PERSON|REG AIR|egular notornis. slyly slo +23303|456|86|1|33|44762.85|0.04|0.02|A|F|1994-07-04|1994-09-04|1994-07-05|NONE|TRUCK|he packages cajole slyly regular fo +23303|1517|38|2|14|19859.14|0.00|0.08|A|F|1994-09-23|1994-08-09|1994-09-27|NONE|REG AIR|ts around the furious +23328|1677|78|1|25|39466.75|0.01|0.01|R|F|1993-12-16|1993-11-17|1994-01-13|DELIVER IN PERSON|TRUCK|y between the regular +23328|432|20|2|14|18654.02|0.08|0.00|A|F|1993-11-01|1993-11-28|1993-11-14|TAKE BACK RETURN|RAIL|structions. blithely exp +23329|429|30|1|27|35894.34|0.02|0.01|R|F|1994-01-22|1994-03-08|1994-02-18|NONE|AIR|ously. express, +23329|288|89|2|38|45154.64|0.07|0.06|R|F|1994-03-23|1994-02-06|1994-04-04|NONE|TRUCK|cuses hinder carefully ironic requests. unu +23329|1119|92|3|19|19382.09|0.07|0.04|R|F|1994-04-04|1994-01-26|1994-04-21|DELIVER IN PERSON|RAIL|ld deposits wake furiously after t +23329|789|86|4|40|67591.20|0.00|0.03|R|F|1994-03-10|1994-01-26|1994-03-19|DELIVER IN PERSON|RAIL|y pending accounts cajole blithel +23329|999|2|5|38|72199.62|0.04|0.02|R|F|1994-01-04|1994-02-14|1994-02-01|COLLECT COD|RAIL|s accounts. blithely final instructions h +23330|1182|83|1|1|1083.18|0.00|0.01|A|F|1993-12-27|1994-02-22|1993-12-31|NONE|TRUCK|ve the furiously unusual ideas. quickly sp +23330|108|61|2|7|7056.70|0.03|0.02|A|F|1994-01-12|1994-03-12|1994-01-14|DELIVER IN PERSON|FOB|alongside of t +23330|134|35|3|12|12409.56|0.09|0.06|A|F|1994-04-10|1994-03-08|1994-04-16|NONE|SHIP|tect furiously. blithely silent somas +23330|920|55|4|35|63732.20|0.04|0.03|R|F|1994-03-29|1994-01-20|1994-04-19|TAKE BACK RETURN|RAIL| slyly regul +23330|771|72|5|40|66870.80|0.10|0.06|R|F|1993-12-19|1994-02-18|1993-12-23|COLLECT COD|FOB|telets. ideas boost +23330|250|51|6|11|12652.75|0.02|0.04|A|F|1994-03-15|1994-01-17|1994-03-24|DELIVER IN PERSON|TRUCK|furiously bold theodolites: q +23331|776|9|1|43|72101.11|0.02|0.06|R|F|1993-08-29|1993-09-27|1993-09-27|NONE|AIR|g asymptotes. carefully regular p +23331|1127|28|2|22|22618.64|0.09|0.08|R|F|1993-11-09|1993-09-26|1993-12-06|NONE|REG AIR| quickly quickly final foxes. furiou +23332|338|95|1|42|52009.86|0.01|0.05|A|F|1993-06-03|1993-06-29|1993-06-22|DELIVER IN PERSON|REG AIR|carefully. special, regular theodolit +23332|1937|70|2|10|18389.30|0.01|0.08|A|F|1993-06-22|1993-05-05|1993-06-23|TAKE BACK RETURN|REG AIR|nly. platelets sleep according t +23332|1682|24|3|35|55428.80|0.01|0.04|R|F|1993-05-09|1993-06-15|1993-05-29|NONE|RAIL|its wake across +23333|1172|73|1|45|48292.65|0.05|0.01|R|F|1994-11-09|1994-09-20|1994-11-22|COLLECT COD|RAIL|. idly even theodolites detect slyly someti +23333|1028|99|2|4|3716.08|0.09|0.08|A|F|1994-11-27|1994-09-20|1994-12-22|DELIVER IN PERSON|SHIP|sly final foxes are. carefully +23333|1848|92|3|5|8749.20|0.09|0.03|A|F|1994-10-30|1994-09-22|1994-11-22|COLLECT COD|FOB|ly. pending accounts affix across the b +23333|1232|33|4|42|47595.66|0.08|0.03|R|F|1994-08-31|1994-11-01|1994-09-10|TAKE BACK RETURN|REG AIR|re furiousl +23333|1927|28|5|3|5486.76|0.02|0.06|A|F|1994-09-20|1994-10-07|1994-10-07|NONE|TRUCK| even acco +23333|1804|5|6|9|15352.20|0.03|0.08|R|F|1994-10-17|1994-10-03|1994-10-28|TAKE BACK RETURN|AIR|idle, pending pinto beans along the +23333|983|84|7|30|56519.40|0.04|0.03|A|F|1994-08-24|1994-09-14|1994-09-17|DELIVER IN PERSON|FOB|ully unusual accounts. final requests +23334|138|39|1|32|33220.16|0.10|0.04|R|F|1992-01-27|1992-03-25|1992-02-01|COLLECT COD|REG AIR|nts nag abo +23335|543|44|1|47|67846.38|0.03|0.08|A|F|1994-05-13|1994-05-27|1994-05-14|DELIVER IN PERSON|REG AIR|le quickly against the pa +23335|1452|31|2|6|8120.70|0.04|0.05|A|F|1994-06-09|1994-04-27|1994-06-16|NONE|AIR|quickly toward +23335|820|87|3|3|5162.46|0.08|0.07|A|F|1994-06-05|1994-03-31|1994-06-21|TAKE BACK RETURN|AIR| foxes. slyly even ideas integra +23335|1233|71|4|18|20416.14|0.04|0.01|R|F|1994-04-15|1994-05-18|1994-05-12|TAKE BACK RETURN|REG AIR|ously fluffily final ideas. ca +23335|1266|78|5|33|38519.58|0.02|0.06|A|F|1994-04-22|1994-05-25|1994-05-06|TAKE BACK RETURN|AIR|lithely brave +23360|1971|72|1|12|22475.64|0.02|0.03|A|F|1994-07-30|1994-08-06|1994-08-02|COLLECT COD|RAIL|t the quickly ironic platelets +23360|1312|89|2|31|37612.61|0.04|0.06|A|F|1994-07-09|1994-06-29|1994-07-24|TAKE BACK RETURN|FOB|furiously even instructions nag u +23361|1978|23|1|7|13159.79|0.03|0.01|A|F|1993-10-18|1993-08-28|1993-10-25|TAKE BACK RETURN|TRUCK|ly even fo +23361|327|28|2|9|11045.88|0.10|0.01|R|F|1993-08-05|1993-09-26|1993-09-04|NONE|FOB|le instructi +23361|800|33|3|40|68032.00|0.07|0.00|A|F|1993-10-10|1993-09-02|1993-10-24|NONE|FOB|y final packages. slyly iro +23361|10|11|4|6|5460.06|0.10|0.02|R|F|1993-09-21|1993-09-11|1993-10-18|COLLECT COD|TRUCK|sits. carefully regula +23361|1744|29|5|19|31269.06|0.08|0.04|A|F|1993-08-19|1993-09-02|1993-08-30|TAKE BACK RETURN|AIR| regular, bus +23362|471|1|1|48|65830.56|0.07|0.03|A|F|1993-12-04|1993-10-15|1993-12-21|DELIVER IN PERSON|FOB|lar theodolites poach quickly arou +23362|1277|89|2|20|23565.40|0.06|0.07|R|F|1993-09-19|1993-10-21|1993-10-14|NONE|SHIP| the furiously even ide +23362|206|34|3|9|9955.80|0.01|0.04|A|F|1993-11-20|1993-11-06|1993-12-08|NONE|REG AIR|sly about the furiou +23362|1189|90|4|10|10901.80|0.06|0.06|R|F|1993-09-17|1993-10-21|1993-10-03|TAKE BACK RETURN|MAIL|carefully. busily regular cour +23363|1337|14|1|44|54486.52|0.05|0.00|R|F|1992-06-05|1992-08-04|1992-06-23|DELIVER IN PERSON|RAIL|wake furiously. careful +23363|126|79|2|26|26679.12|0.00|0.07|R|F|1992-05-31|1992-07-06|1992-06-16|COLLECT COD|REG AIR| platelets wake among the blithely unusua +23363|1083|19|3|49|48219.92|0.05|0.04|R|F|1992-09-14|1992-07-31|1992-09-24|TAKE BACK RETURN|FOB|nd the pinto beans. always r +23363|847|47|4|20|34956.80|0.03|0.00|R|F|1992-07-12|1992-08-23|1992-08-04|DELIVER IN PERSON|AIR|furiously silent instru +23363|1392|93|5|7|9053.73|0.06|0.06|A|F|1992-09-06|1992-08-20|1992-09-25|DELIVER IN PERSON|RAIL|sts are. regular, express dependencies +23364|1911|100|1|48|87019.68|0.05|0.04|N|O|1998-06-12|1998-04-20|1998-06-28|COLLECT COD|FOB|counts. ironic requests try to haggle +23364|1540|41|2|6|8649.24|0.04|0.01|N|O|1998-06-21|1998-05-10|1998-06-27|TAKE BACK RETURN|REG AIR|ly quickly regular wat +23364|710|43|3|14|22549.94|0.01|0.01|N|O|1998-04-16|1998-05-08|1998-04-30|NONE|RAIL|ly express packages above the slyly +23364|1108|81|4|23|23209.30|0.06|0.08|N|O|1998-03-15|1998-05-13|1998-04-10|NONE|SHIP|pitaphs haggle +23364|1653|36|5|40|62186.00|0.07|0.05|N|O|1998-06-20|1998-05-24|1998-07-01|DELIVER IN PERSON|REG AIR|the deposits. carefully regu +23364|848|48|6|48|83944.32|0.02|0.06|N|O|1998-05-12|1998-05-15|1998-05-25|COLLECT COD|SHIP|e ideas hang furiously. ironic orbi +23365|1633|75|1|23|35296.49|0.05|0.00|N|O|1998-07-02|1998-05-04|1998-07-16|TAKE BACK RETURN|MAIL|y bold deposits. s +23366|1635|77|1|7|10756.41|0.09|0.08|A|F|1994-01-27|1994-01-09|1994-02-09|TAKE BACK RETURN|SHIP|le blithel +23366|41|92|2|46|43287.84|0.08|0.02|R|F|1993-11-24|1994-02-05|1993-12-06|NONE|SHIP|sits. slyly final accounts +23366|1805|6|3|5|8534.00|0.06|0.01|R|F|1993-12-09|1994-01-10|1993-12-13|DELIVER IN PERSON|AIR|equests. slyly careful idea +23366|586|87|4|3|4459.74|0.04|0.02|R|F|1994-03-12|1994-02-05|1994-03-27|DELIVER IN PERSON|MAIL|ironic packages are after the express t +23366|1990|91|5|5|9459.95|0.02|0.08|A|F|1994-01-05|1994-02-03|1994-02-03|NONE|MAIL|terns sleep. furiously iron +23366|1247|59|6|37|42484.88|0.09|0.04|A|F|1994-02-13|1994-02-02|1994-02-23|DELIVER IN PERSON|REG AIR|ermanently final, permanent d +23367|1211|12|1|44|48937.24|0.04|0.04|N|O|1995-09-26|1995-09-18|1995-09-27|DELIVER IN PERSON|RAIL| sauternes nag. bold asymptotes wake p +23367|909|12|2|50|90495.00|0.09|0.05|N|O|1995-10-24|1995-08-09|1995-11-13|NONE|RAIL|l packages grow. slyly silent pinto bea +23392|1361|76|1|45|56806.20|0.02|0.07|R|F|1994-10-25|1994-10-07|1994-11-22|NONE|REG AIR| beans use quickly. carefully f +23392|1265|40|2|11|12828.86|0.09|0.01|A|F|1994-08-22|1994-10-25|1994-09-02|DELIVER IN PERSON|MAIL|ffily silent warthogs sle +23392|1790|17|3|47|79514.13|0.03|0.05|R|F|1994-09-11|1994-11-03|1994-10-08|TAKE BACK RETURN|MAIL|sleep carefully enticingly even pac +23392|1672|73|4|2|3147.34|0.02|0.00|A|F|1994-10-18|1994-09-21|1994-11-07|TAKE BACK RETURN|SHIP|ully after th +23392|1016|22|5|16|14672.16|0.04|0.02|R|F|1994-09-20|1994-10-11|1994-10-17|NONE|AIR|olites across the final, silent instruction +23393|1623|24|1|14|21344.68|0.02|0.04|A|F|1992-11-12|1992-11-20|1992-12-11|TAKE BACK RETURN|FOB|nusual excuses +23393|1838|68|2|12|20877.96|0.04|0.00|R|F|1992-09-10|1992-10-15|1992-10-09|NONE|REG AIR|e slyly asymptotes: slyly b +23393|1152|53|3|47|49498.05|0.07|0.05|A|F|1992-12-15|1992-10-15|1992-12-17|COLLECT COD|REG AIR|atelets impress busily. quickly final depos +23393|722|19|4|20|32454.40|0.09|0.02|R|F|1992-08-28|1992-11-04|1992-09-10|COLLECT COD|RAIL|inal, regular idea +23393|673|36|5|34|53504.78|0.09|0.08|A|F|1992-12-15|1992-09-30|1992-12-21|DELIVER IN PERSON|REG AIR|foxes. sheaves nag deposits. fur +23394|1212|13|1|11|12245.31|0.08|0.01|R|F|1993-05-09|1993-07-22|1993-05-28|TAKE BACK RETURN|RAIL|yly. regular, special packages +23394|1403|21|2|2|2608.80|0.02|0.03|R|F|1993-08-18|1993-06-15|1993-09-13|NONE|SHIP|o beans alongside of t +23394|1355|32|3|12|15076.20|0.10|0.05|R|F|1993-05-12|1993-06-05|1993-06-02|COLLECT COD|TRUCK| pinto beans wake furi +23394|1134|71|4|33|34159.29|0.04|0.02|A|F|1993-05-06|1993-06-07|1993-05-24|COLLECT COD|REG AIR|pths across the quickly un +23394|672|4|5|25|39316.75|0.01|0.03|A|F|1993-06-06|1993-07-08|1993-06-22|NONE|TRUCK|lly dependencie +23394|894|61|6|39|70000.71|0.08|0.08|R|F|1993-08-17|1993-07-01|1993-09-09|TAKE BACK RETURN|FOB|. slyly final pinto beans about the furi +23395|1448|88|1|20|26988.80|0.06|0.04|R|F|1993-02-09|1992-12-04|1993-02-20|COLLECT COD|SHIP|ly along th +23395|1288|26|2|35|41624.80|0.07|0.04|R|F|1992-10-31|1992-12-30|1992-11-10|NONE|FOB|s deposits haggle slyly even d +23396|1150|23|1|45|47301.75|0.00|0.07|R|F|1993-07-02|1993-09-11|1993-07-16|DELIVER IN PERSON|AIR|rls cajole f +23396|392|49|2|40|51695.60|0.04|0.01|A|F|1993-06-30|1993-08-20|1993-07-02|TAKE BACK RETURN|TRUCK|lly regular +23396|1129|66|3|21|21632.52|0.10|0.04|R|F|1993-10-03|1993-09-13|1993-10-19|DELIVER IN PERSON|RAIL|slyly furious foxes. furiously final depen +23396|1202|3|4|41|45231.20|0.08|0.03|R|F|1993-07-14|1993-08-23|1993-07-19|COLLECT COD|SHIP|y regular excuses. slyly express accou +23396|1606|48|5|32|48243.20|0.04|0.05|R|F|1993-09-18|1993-08-04|1993-10-06|COLLECT COD|REG AIR|ully. accounts sleep r +23396|1266|78|6|34|39686.84|0.01|0.07|A|F|1993-09-20|1993-08-14|1993-10-05|TAKE BACK RETURN|FOB| blithely bo +23397|1750|51|1|10|16517.50|0.02|0.05|N|O|1998-08-20|1998-09-07|1998-08-27|COLLECT COD|RAIL|ly. idle ideas are carefully. b +23397|69|70|2|41|39731.46|0.00|0.08|N|O|1998-09-13|1998-08-28|1998-09-26|COLLECT COD|TRUCK|ironic foxes are. pending pinto beans sl +23397|773|74|3|26|43518.02|0.09|0.04|N|O|1998-11-07|1998-08-27|1998-11-30|NONE|AIR|ly bold asymptotes. perma +23397|1027|63|4|13|12064.26|0.04|0.00|N|O|1998-08-26|1998-10-14|1998-09-05|DELIVER IN PERSON|SHIP|silent warthogs +23397|1753|80|5|24|39714.00|0.00|0.01|N|O|1998-07-26|1998-08-18|1998-08-19|COLLECT COD|AIR|ly after the quickly bra +23398|1545|46|1|38|54968.52|0.05|0.04|R|F|1994-07-08|1994-04-13|1994-07-22|DELIVER IN PERSON|TRUCK|encies haggle furiously blithely re +23398|382|39|2|42|53859.96|0.05|0.06|A|F|1994-06-23|1994-05-26|1994-07-16|NONE|SHIP|ithely into +23398|897|97|3|22|39553.58|0.09|0.04|R|F|1994-07-08|1994-04-13|1994-07-16|NONE|REG AIR|regular foxes. decoys nag furi +23398|1210|22|4|43|47782.03|0.09|0.02|A|F|1994-07-08|1994-05-23|1994-07-29|DELIVER IN PERSON|MAIL|uffily. blithely +23398|1101|10|5|44|44092.40|0.08|0.05|A|F|1994-04-10|1994-04-26|1994-04-28|COLLECT COD|AIR|kages ought to sleep slyly. slyly ste +23398|494|82|6|40|55779.60|0.08|0.00|R|F|1994-04-29|1994-05-12|1994-05-12|NONE|RAIL|ress dolphins na +23399|1652|35|1|6|9321.90|0.00|0.01|R|F|1994-03-01|1994-03-17|1994-03-25|DELIVER IN PERSON|FOB|as! unusual foxe +23399|937|72|2|26|47786.18|0.00|0.02|A|F|1994-04-17|1994-03-03|1994-05-03|TAKE BACK RETURN|SHIP| pending deposits. s +23399|1358|73|3|15|18890.25|0.06|0.01|A|F|1994-03-12|1994-03-23|1994-04-04|DELIVER IN PERSON|TRUCK|y ironic deposits wake +23424|1366|5|1|16|20277.76|0.08|0.00|A|F|1993-06-26|1993-06-15|1993-07-12|DELIVER IN PERSON|SHIP|n dependencies. blithely pending +23424|74|100|2|17|16559.19|0.00|0.02|R|F|1993-06-16|1993-06-23|1993-07-12|TAKE BACK RETURN|REG AIR| furiously; furiousl +23425|944|79|1|30|55348.20|0.09|0.02|N|O|1998-08-30|1998-09-02|1998-09-17|COLLECT COD|TRUCK| carefully express packages un +23426|1915|16|1|24|43605.84|0.04|0.02|R|F|1995-05-08|1995-05-08|1995-06-04|DELIVER IN PERSON|REG AIR|ges. carefully ironic packages are. +23426|91|67|2|7|6937.63|0.10|0.08|A|F|1995-04-27|1995-04-02|1995-05-25|NONE|SHIP|t quickly regular foxes. un +23426|498|28|3|25|34962.25|0.05|0.06|R|F|1995-05-07|1995-05-13|1995-05-11|NONE|MAIL|ounts. blithely regular packages +23426|1043|49|4|2|1888.08|0.09|0.03|A|F|1995-04-22|1995-03-27|1995-05-14|TAKE BACK RETURN|MAIL|ymptotes cajole +23426|1565|66|5|28|41063.68|0.02|0.00|A|F|1995-02-18|1995-03-20|1995-02-25|NONE|FOB| ironic frets affix carefull +23426|566|97|6|42|61595.52|0.07|0.02|R|F|1995-04-19|1995-03-29|1995-04-24|COLLECT COD|AIR|ly even packa +23427|1230|42|1|2|2262.46|0.00|0.08|N|O|1995-11-06|1995-10-23|1995-11-10|DELIVER IN PERSON|AIR|usly slyly unusual theodolites. slyly ex +23427|353|38|2|40|50134.00|0.07|0.08|N|O|1995-08-19|1995-09-10|1995-08-27|NONE|AIR|riously. ste +23427|1425|26|3|16|21222.72|0.05|0.01|N|O|1995-09-23|1995-10-23|1995-10-22|TAKE BACK RETURN|TRUCK|r instructions doze +23427|779|12|4|23|38634.71|0.02|0.06|N|O|1995-11-14|1995-09-10|1995-12-08|TAKE BACK RETURN|FOB|y special accounts sublate carefully slyly +23428|1700|83|1|38|60864.60|0.07|0.07|R|F|1992-12-27|1993-01-27|1993-01-26|NONE|MAIL|ide of the silent, ironi +23428|336|93|2|27|33380.91|0.04|0.02|A|F|1992-12-17|1992-12-10|1993-01-02|TAKE BACK RETURN|AIR| regular depo +23428|961|30|3|46|85650.16|0.10|0.08|A|F|1992-10-31|1992-12-28|1992-11-12|TAKE BACK RETURN|AIR|uses. even, final dependencies haggle s +23428|1430|9|4|27|35948.61|0.03|0.05|A|F|1993-02-25|1992-12-08|1993-03-26|TAKE BACK RETURN|MAIL|inal pinto bean +23428|1583|64|5|32|47506.56|0.01|0.02|R|F|1992-12-09|1993-01-01|1992-12-27|NONE|MAIL|requests run quickly. carefully final +23428|1390|67|6|36|46490.04|0.07|0.02|R|F|1993-02-20|1992-12-01|1993-03-01|COLLECT COD|AIR|ss accounts serve permanently along the ev +23429|750|83|1|17|28062.75|0.02|0.08|R|F|1994-05-14|1994-04-29|1994-06-07|TAKE BACK RETURN|TRUCK|platelets across the furiously b +23429|839|73|2|43|74812.69|0.01|0.08|A|F|1994-05-22|1994-05-28|1994-06-01|NONE|AIR|ach blithe +23429|1065|71|3|39|37676.34|0.00|0.03|R|F|1994-05-04|1994-05-22|1994-05-06|TAKE BACK RETURN|MAIL|ss foxes sleep. re +23429|1280|18|4|5|5906.40|0.03|0.08|R|F|1994-03-21|1994-06-11|1994-04-09|COLLECT COD|TRUCK|s. furiously bold asympt +23429|1615|57|5|18|27298.98|0.08|0.03|R|F|1994-04-05|1994-06-07|1994-04-29|NONE|MAIL|furiously ironic foxes. quickl +23429|1113|86|6|40|40564.40|0.03|0.03|R|F|1994-03-31|1994-05-06|1994-04-25|NONE|RAIL|ide of the sl +23430|29|55|1|40|37160.80|0.00|0.06|N|O|1997-01-05|1997-02-13|1997-01-09|DELIVER IN PERSON|RAIL|sual escapade +23430|1384|99|2|19|24422.22|0.09|0.08|N|O|1997-03-20|1997-02-23|1997-03-28|COLLECT COD|AIR| slyly according +23430|451|39|3|50|67572.50|0.08|0.07|N|O|1997-02-26|1997-02-17|1997-03-15|DELIVER IN PERSON|REG AIR|for the blith +23430|79|30|4|16|15665.12|0.03|0.00|N|O|1997-03-21|1997-02-08|1997-04-17|DELIVER IN PERSON|MAIL|nst the dogged theodo +23430|788|85|5|14|23642.92|0.06|0.06|N|O|1997-03-11|1997-02-10|1997-04-06|DELIVER IN PERSON|REG AIR|ously ironic accounts. ironic accou +23431|900|1|1|8|14407.20|0.04|0.07|N|O|1995-06-28|1995-08-30|1995-07-21|NONE|AIR|oxes boost +23431|1096|32|2|43|42874.87|0.08|0.02|N|O|1995-07-22|1995-08-23|1995-07-25|COLLECT COD|FOB|nal asymptotes. blithely express +23431|21|47|3|12|11052.24|0.01|0.05|N|O|1995-06-22|1995-07-12|1995-07-17|NONE|RAIL|yly regular +23431|1538|19|4|16|23032.48|0.10|0.05|N|O|1995-09-18|1995-08-13|1995-09-29|DELIVER IN PERSON|MAIL|foxes use carefully against the blithe +23456|346|75|1|39|48607.26|0.05|0.03|N|O|1997-07-22|1997-08-03|1997-08-06|DELIVER IN PERSON|FOB| blithely pending p +23456|107|60|2|20|20142.00|0.09|0.00|N|O|1997-10-11|1997-08-14|1997-11-03|DELIVER IN PERSON|RAIL| even instructions. fin +23456|1826|56|3|45|77751.90|0.01|0.01|N|O|1997-07-08|1997-09-14|1997-07-23|COLLECT COD|AIR|gular, pending pinto bea +23456|1732|59|4|50|81686.50|0.06|0.03|N|O|1997-10-20|1997-09-09|1997-10-28|TAKE BACK RETURN|REG AIR|onic packages. furiousl +23456|1950|51|5|49|90745.55|0.07|0.02|N|O|1997-09-25|1997-08-03|1997-10-05|DELIVER IN PERSON|SHIP|nic, regular +23456|146|73|6|36|37661.04|0.00|0.03|N|O|1997-07-16|1997-09-21|1997-08-10|NONE|TRUCK|ests wake carefully slyly bold depths. r +23457|165|44|1|6|6390.96|0.05|0.06|N|O|1997-06-30|1997-07-29|1997-07-23|COLLECT COD|REG AIR|gular deposits maintain sile +23457|1210|11|2|23|25557.83|0.07|0.02|N|O|1997-08-05|1997-08-25|1997-09-04|DELIVER IN PERSON|TRUCK|ions. quickly final i +23457|1015|51|3|44|40304.44|0.02|0.01|N|O|1997-06-10|1997-08-24|1997-06-22|DELIVER IN PERSON|REG AIR|y special foxes. bli +23457|1715|42|4|39|63051.69|0.07|0.04|N|O|1997-08-24|1997-07-14|1997-09-21|DELIVER IN PERSON|SHIP|. slyly pend +23457|1614|97|5|18|27280.98|0.06|0.04|N|O|1997-08-30|1997-07-28|1997-09-03|NONE|REG AIR|al requests doubt requests. pinto bea +23457|1342|81|6|50|62167.00|0.04|0.08|N|O|1997-08-01|1997-08-02|1997-08-23|NONE|AIR| to sleep furiously. quickly final request +23458|1894|38|1|20|35917.80|0.07|0.02|R|F|1994-01-25|1994-02-21|1994-01-29|DELIVER IN PERSON|TRUCK|thely final accounts. slowly sp +23459|1650|51|1|49|76030.85|0.02|0.04|R|F|1993-10-20|1993-10-02|1993-11-15|DELIVER IN PERSON|SHIP|y. furiously regular packages c +23459|379|80|2|15|19190.55|0.09|0.00|A|F|1993-09-03|1993-09-24|1993-09-07|COLLECT COD|AIR|ess, final d +23459|730|27|3|28|45660.44|0.04|0.06|R|F|1993-09-04|1993-09-29|1993-09-07|TAKE BACK RETURN|SHIP|packages are along the s +23460|1887|88|1|48|85866.24|0.02|0.05|R|F|1992-12-26|1992-12-13|1993-01-17|COLLECT COD|TRUCK|quickly quickly express theodolite +23460|404|34|2|34|44349.60|0.10|0.03|A|F|1992-12-07|1993-01-15|1992-12-31|COLLECT COD|MAIL|s. even pinto beans nod carefully +23461|338|39|1|5|6191.65|0.05|0.08|N|O|1998-07-20|1998-06-28|1998-08-08|NONE|AIR|g to the slyly pending acco +23462|1060|96|1|15|14415.90|0.06|0.01|N|O|1996-09-06|1996-11-25|1996-09-11|NONE|SHIP|ing requests. courts cajole alongside of +23462|335|20|2|21|25941.93|0.06|0.04|N|O|1996-11-22|1996-11-27|1996-12-06|COLLECT COD|RAIL|thely fina +23462|1394|33|3|24|31089.36|0.05|0.08|N|O|1996-12-08|1996-11-19|1996-12-14|COLLECT COD|MAIL|usly special requests. regular deposit +23462|1622|23|4|14|21330.68|0.08|0.01|N|O|1996-12-11|1996-11-21|1996-12-24|DELIVER IN PERSON|TRUCK|osits boost busily b +23463|587|88|1|39|58015.62|0.06|0.05|N|O|1997-08-11|1997-05-17|1997-08-25|COLLECT COD|REG AIR| around the deposits. furiously bold depo +23488|1224|99|1|43|48384.46|0.07|0.03|A|F|1994-05-01|1994-03-07|1994-05-27|TAKE BACK RETURN|SHIP| theodolites nag fluffily regula +23488|325|10|2|33|40435.56|0.06|0.01|A|F|1994-02-14|1994-03-26|1994-03-11|DELIVER IN PERSON|REG AIR|ly quickly +23488|793|94|3|20|33875.80|0.08|0.00|A|F|1994-02-03|1994-03-06|1994-02-26|NONE|MAIL| permanent accounts boost slyly ac +23488|1160|61|4|10|10611.60|0.06|0.00|A|F|1994-01-14|1994-04-04|1994-01-16|DELIVER IN PERSON|MAIL|ffily special decoys use +23488|384|41|5|1|1284.38|0.05|0.08|A|F|1994-03-02|1994-04-01|1994-03-18|TAKE BACK RETURN|AIR|e furiously ironic i +23488|1145|54|6|38|39753.32|0.05|0.08|R|F|1994-04-19|1994-02-12|1994-04-20|DELIVER IN PERSON|TRUCK| beans affix blithely. +23488|1978|23|7|5|9399.85|0.07|0.06|R|F|1994-01-14|1994-03-04|1994-01-27|COLLECT COD|MAIL|ngage careful +23489|695|27|1|14|22339.66|0.09|0.03|A|F|1992-12-15|1992-11-08|1992-12-17|NONE|TRUCK|ng to the regular packages. evenl +23489|1488|67|2|26|36126.48|0.06|0.05|R|F|1992-12-20|1992-11-12|1993-01-13|DELIVER IN PERSON|REG AIR|bove the carefully flu +23489|734|99|3|18|29425.14|0.09|0.02|A|F|1992-11-27|1992-09-28|1992-12-01|COLLECT COD|MAIL|counts. quickly re +23490|1717|44|1|29|46942.59|0.09|0.00|N|O|1998-04-30|1998-04-25|1998-05-24|COLLECT COD|MAIL|ly blithely +23491|1364|65|1|39|49349.04|0.03|0.05|R|F|1992-12-03|1993-01-20|1993-01-02|COLLECT COD|TRUCK|cajole quickly regular requests. s +23491|1157|94|2|40|42326.00|0.07|0.05|A|F|1993-03-03|1993-01-08|1993-03-14|COLLECT COD|TRUCK|esias are fl +23491|987|22|3|10|18879.80|0.03|0.01|A|F|1992-12-15|1992-12-09|1992-12-27|TAKE BACK RETURN|REG AIR|ely furiously regular asym +23492|1496|75|1|38|53104.62|0.01|0.00|N|O|1997-11-07|1997-11-20|1997-11-19|NONE|REG AIR|al requests haggle silently a +23492|756|89|2|15|24851.25|0.01|0.06|N|O|1997-09-23|1997-11-10|1997-09-30|TAKE BACK RETURN|TRUCK|eposits. regular accounts nag furiously +23492|141|20|3|21|21863.94|0.06|0.00|N|O|1997-10-04|1997-12-10|1997-10-16|DELIVER IN PERSON|MAIL|ironic packages mainta +23492|933|36|4|27|49516.11|0.00|0.08|N|O|1997-10-18|1997-10-21|1997-11-14|NONE|SHIP|se about the express +23492|1700|1|5|47|75279.90|0.03|0.05|N|O|1997-11-18|1997-10-11|1997-12-16|NONE|TRUCK|s. dependencies nag furiously. slyly e +23492|1238|76|6|23|26202.29|0.06|0.00|N|O|1997-11-25|1997-11-28|1997-12-18|DELIVER IN PERSON|FOB|capades wake boldly against t +23493|26|2|1|29|26854.58|0.04|0.05|R|F|1994-12-28|1994-10-28|1995-01-12|COLLECT COD|RAIL|y express th +23493|4|55|2|31|28024.00|0.10|0.00|R|F|1994-11-15|1994-12-10|1994-12-13|NONE|RAIL|ans according to the +23494|1387|2|1|19|24479.22|0.04|0.06|N|O|1997-09-13|1997-09-27|1997-09-25|DELIVER IN PERSON|RAIL| ironic ac +23494|1667|50|2|49|76864.34|0.05|0.02|N|O|1997-10-07|1997-10-14|1997-10-29|TAKE BACK RETURN|TRUCK|ly final packages. +23494|1891|35|3|33|59165.37|0.10|0.03|N|O|1997-12-11|1997-11-10|1998-01-02|NONE|TRUCK|furiously according +23495|353|38|1|15|18800.25|0.02|0.02|R|F|1993-10-26|1993-10-04|1993-11-24|COLLECT COD|REG AIR| bold requests cajole blithe +23495|702|67|2|43|68916.10|0.08|0.08|R|F|1993-07-24|1993-08-25|1993-08-13|TAKE BACK RETURN|FOB| carefully final deposits. carefully pendin +23495|1327|42|3|49|60187.68|0.02|0.06|A|F|1993-08-13|1993-09-12|1993-08-20|COLLECT COD|AIR|furiously even deposits affix furiousl +23520|107|86|1|18|18127.80|0.05|0.05|N|O|1996-10-06|1996-10-20|1996-10-14|COLLECT COD|TRUCK|carefully. even reque +23520|1493|11|2|32|44623.68|0.03|0.05|N|O|1996-10-16|1996-09-08|1996-11-06|NONE|TRUCK| express packages. carefully ironic +23520|520|81|3|5|7102.60|0.03|0.01|N|O|1996-11-20|1996-08-30|1996-11-21|DELIVER IN PERSON|RAIL|ietly. carefully fluffy +23520|626|89|4|45|68697.90|0.06|0.01|N|O|1996-11-14|1996-08-29|1996-11-21|COLLECT COD|MAIL|ely final packages +23521|766|31|1|31|51669.56|0.02|0.05|N|O|1998-05-10|1998-06-10|1998-06-06|TAKE BACK RETURN|RAIL| final accounts. quickly bold dep +23521|1096|2|2|23|22933.07|0.03|0.02|N|O|1998-07-13|1998-04-20|1998-08-06|COLLECT COD|MAIL|ully ironic deposits sleep neve +23521|1055|56|3|6|5736.30|0.04|0.06|N|O|1998-04-02|1998-05-04|1998-04-04|DELIVER IN PERSON|AIR| pending pinto +23522|45|46|1|4|3780.16|0.08|0.04|N|F|1995-06-06|1995-06-01|1995-07-02|TAKE BACK RETURN|RAIL|requests wake-- furiously bold accounts +23522|508|69|2|39|54931.50|0.04|0.05|N|F|1995-06-13|1995-05-18|1995-07-06|DELIVER IN PERSON|REG AIR|oxes accord +23522|1205|6|3|31|34292.20|0.02|0.05|N|F|1995-06-08|1995-06-01|1995-06-30|COLLECT COD|TRUCK|g accounts wake fluffily. evenly even +23522|1381|58|4|20|25647.60|0.10|0.08|N|O|1995-08-10|1995-07-04|1995-09-01|NONE|FOB|c packages. ironic platelets nag careful +23522|400|1|5|5|6502.00|0.10|0.02|N|O|1995-07-26|1995-05-17|1995-08-19|COLLECT COD|TRUCK|ending accoun +23522|516|77|6|32|45328.32|0.01|0.01|R|F|1995-04-29|1995-05-25|1995-05-16|NONE|REG AIR|ages. slyly regular requests sub +23522|930|31|7|19|34787.67|0.03|0.03|N|O|1995-07-02|1995-05-31|1995-07-26|DELIVER IN PERSON|REG AIR|ely bold packages cajole carefully a +23523|959|60|1|43|79977.85|0.06|0.02|N|O|1998-06-13|1998-06-20|1998-07-08|TAKE BACK RETURN|SHIP|ffily ironic deposits should have to cajol +23523|1447|87|2|40|53937.60|0.01|0.03|N|O|1998-06-12|1998-06-14|1998-06-29|TAKE BACK RETURN|FOB|iers above the bold, final depos +23523|145|46|3|50|52257.00|0.10|0.08|N|O|1998-07-11|1998-08-07|1998-08-08|NONE|REG AIR|ding packages cajole +23523|628|22|4|40|61144.80|0.02|0.04|N|O|1998-08-06|1998-07-09|1998-08-20|DELIVER IN PERSON|TRUCK|use fluffily bold deposits +23523|1710|53|5|28|45127.88|0.03|0.05|N|O|1998-09-02|1998-08-03|1998-09-27|DELIVER IN PERSON|MAIL|ously silent packages according to the +23523|835|69|6|22|38188.26|0.02|0.08|N|O|1998-08-02|1998-07-06|1998-08-19|DELIVER IN PERSON|RAIL| beans use across the s +23524|1343|58|1|45|55995.30|0.08|0.03|R|F|1994-06-23|1994-07-17|1994-07-01|NONE|SHIP|al instructions alongside of the blith +23524|1272|73|2|6|7039.62|0.08|0.06|A|F|1994-05-17|1994-06-11|1994-05-22|DELIVER IN PERSON|FOB|- ironically bold packages ar +23524|1140|49|3|7|7287.98|0.02|0.06|A|F|1994-06-22|1994-07-09|1994-06-23|NONE|MAIL|unwind. quickly even foxes cajole slyly +23524|1661|44|4|21|32815.86|0.09|0.05|R|F|1994-06-22|1994-07-02|1994-07-08|TAKE BACK RETURN|RAIL|n packages boost fluffily +23524|1520|21|5|25|35538.00|0.02|0.07|A|F|1994-06-05|1994-07-16|1994-06-25|DELIVER IN PERSON|AIR|ents. furiously ironic packages are +23525|470|71|1|24|32891.28|0.03|0.05|N|O|1997-02-16|1997-02-01|1997-03-10|NONE|RAIL|gainst the final not +23525|571|62|2|1|1471.57|0.03|0.06|N|O|1997-01-09|1997-03-02|1997-01-22|TAKE BACK RETURN|TRUCK|eposits use among the carefu +23525|499|100|3|6|8396.94|0.03|0.06|N|O|1997-03-02|1997-01-30|1997-03-28|DELIVER IN PERSON|RAIL|ckly special requests haggle after +23525|166|19|4|44|46911.04|0.04|0.00|N|O|1997-03-12|1997-01-25|1997-03-22|TAKE BACK RETURN|RAIL|. furiously final courts doze fu +23525|885|85|5|48|85722.24|0.10|0.00|N|O|1996-12-16|1997-02-08|1997-01-14|COLLECT COD|AIR|ounts detect slyly along the furious +23526|948|83|1|16|29583.04|0.09|0.05|N|O|1998-07-23|1998-07-15|1998-08-04|COLLECT COD|MAIL|ake bold, final waters. slyly regular acco +23526|1670|94|2|22|34576.74|0.05|0.08|N|O|1998-06-10|1998-08-07|1998-07-02|DELIVER IN PERSON|MAIL|slyly bold dep +23526|1538|59|3|35|50383.55|0.03|0.00|N|O|1998-08-17|1998-06-25|1998-09-07|NONE|RAIL|iously pending requests mold fluff +23527|525|56|1|11|15680.72|0.04|0.03|N|O|1997-07-20|1997-10-12|1997-08-10|COLLECT COD|AIR|e carefully ironic package +23552|339|24|1|11|13632.63|0.09|0.01|N|O|1998-02-07|1998-04-08|1998-03-09|NONE|REG AIR|ular courts after +23552|905|40|2|14|25282.60|0.06|0.01|N|O|1998-05-05|1998-03-01|1998-05-18|NONE|AIR|ges haggle +23552|1404|22|3|14|18275.60|0.09|0.05|N|O|1998-03-12|1998-03-03|1998-04-04|NONE|AIR|sits. bold, final deposits nag furious +23552|423|53|4|49|64847.58|0.01|0.01|N|O|1998-05-10|1998-03-27|1998-06-02|DELIVER IN PERSON|MAIL|lly even a +23553|1723|24|1|37|60114.64|0.06|0.04|N|O|1998-06-05|1998-07-13|1998-06-22|TAKE BACK RETURN|SHIP|ly express +23553|1660|61|2|30|46849.80|0.09|0.05|N|O|1998-08-11|1998-07-29|1998-08-18|NONE|TRUCK|ccounts wake along +23553|837|38|3|11|19116.13|0.07|0.00|N|O|1998-07-19|1998-07-19|1998-07-28|COLLECT COD|TRUCK|yly alongside of the i +23553|529|30|4|39|55751.28|0.01|0.03|N|O|1998-06-28|1998-07-22|1998-07-13|DELIVER IN PERSON|REG AIR|y even packages integrate fu +23554|1693|35|1|21|33488.49|0.04|0.07|N|O|1997-03-12|1997-01-18|1997-04-09|TAKE BACK RETURN|TRUCK|s need to are. furiously bold accounts s +23554|1031|37|2|35|32621.05|0.03|0.02|N|O|1997-03-14|1997-02-08|1997-04-11|TAKE BACK RETURN|RAIL|y. furiously bold dep +23554|823|57|3|2|3447.64|0.08|0.01|N|O|1997-03-16|1997-02-18|1997-04-04|COLLECT COD|MAIL|inal accounts use idly about the even reque +23554|1058|59|4|16|15344.80|0.04|0.07|N|O|1997-01-11|1997-01-15|1997-02-07|TAKE BACK RETURN|REG AIR|heodolites. blithely regular packages sle +23554|81|57|5|48|47091.84|0.00|0.01|N|O|1996-12-15|1997-01-27|1996-12-19|NONE|SHIP| carefully +23555|520|21|1|7|9943.64|0.02|0.08|R|F|1993-02-05|1993-01-19|1993-02-07|DELIVER IN PERSON|MAIL| regular realms. +23555|1030|36|2|49|45620.47|0.06|0.08|A|F|1993-04-01|1993-03-11|1993-04-21|TAKE BACK RETURN|AIR|gular foxes cajole +23555|886|86|3|30|53606.40|0.00|0.02|R|F|1993-01-21|1993-01-17|1993-01-23|TAKE BACK RETURN|FOB|p across the blithely pending +23555|809|76|4|13|22227.40|0.04|0.01|A|F|1993-03-03|1993-02-06|1993-03-11|TAKE BACK RETURN|MAIL|e. regular, thin packages boost even +23555|726|23|5|46|74829.12|0.00|0.04|A|F|1993-03-12|1993-02-24|1993-03-25|COLLECT COD|TRUCK|, pending packages ha +23555|820|21|6|28|48182.96|0.03|0.05|R|F|1992-12-27|1993-03-07|1992-12-29|NONE|FOB|. slyly pending deposits accordi +23555|645|46|7|34|52551.76|0.04|0.04|R|F|1993-01-24|1993-01-29|1993-02-20|NONE|MAIL|ckly unusual +23556|1951|52|1|12|22235.40|0.06|0.06|R|F|1995-04-29|1995-04-01|1995-05-22|NONE|TRUCK|ar excuses are ironically final exc +23556|1667|91|2|22|34510.52|0.02|0.06|A|F|1995-05-11|1995-03-30|1995-05-27|NONE|MAIL|leep carefully ironic +23557|372|29|1|15|19085.55|0.10|0.08|N|O|1995-08-15|1995-07-01|1995-09-04|NONE|FOB|thely express foxes +23557|296|24|2|40|47851.60|0.00|0.07|N|O|1995-09-26|1995-08-18|1995-10-22|NONE|SHIP|quickly sly pinto beans. slyly r +23557|1610|34|3|45|68022.45|0.01|0.07|N|O|1995-06-21|1995-07-01|1995-07-06|TAKE BACK RETURN|AIR|ly express re +23557|137|38|4|48|49782.24|0.09|0.03|N|O|1995-09-15|1995-07-06|1995-10-10|NONE|AIR|ounts haggle furio +23557|1809|10|5|13|22240.40|0.08|0.01|N|O|1995-08-18|1995-08-30|1995-09-15|TAKE BACK RETURN|AIR|ang. carefully bold requests hinder +23557|1346|23|6|50|62367.00|0.06|0.05|N|O|1995-07-26|1995-07-30|1995-08-12|NONE|REG AIR|the special fo +23558|1979|24|1|29|54548.13|0.08|0.01|N|O|1995-09-16|1995-10-19|1995-09-27|COLLECT COD|MAIL|instructions detect furiously iro +23558|1746|47|2|18|29659.32|0.09|0.03|N|O|1995-11-30|1995-10-18|1995-12-09|NONE|AIR|-- final accounts +23558|601|33|3|30|45048.00|0.01|0.02|N|O|1995-11-04|1995-10-12|1995-11-15|TAKE BACK RETURN|FOB|accounts along the regular packages nag be +23558|1964|9|4|20|37319.20|0.03|0.01|N|O|1995-10-28|1995-10-11|1995-11-11|TAKE BACK RETURN|SHIP| deposits use +23558|632|95|5|43|65903.09|0.10|0.04|N|O|1995-08-15|1995-09-23|1995-08-26|TAKE BACK RETURN|TRUCK|ing sauternes doubt furiously fina +23558|1451|30|6|42|56802.90|0.06|0.05|N|O|1995-10-09|1995-10-04|1995-10-11|DELIVER IN PERSON|REG AIR|telets. fluffily bold deposits to the unusu +23558|69|95|7|27|26164.62|0.05|0.06|N|O|1995-09-20|1995-09-15|1995-10-10|COLLECT COD|REG AIR|ully even accounts i +23559|838|38|1|22|38254.26|0.03|0.03|R|F|1993-08-15|1993-09-08|1993-09-01|DELIVER IN PERSON|REG AIR|tes. slow platelets use quickly ex +23559|512|73|2|13|18362.63|0.05|0.06|R|F|1993-09-28|1993-09-13|1993-10-11|COLLECT COD|FOB|dencies. ev +23559|1841|42|3|7|12199.88|0.06|0.08|A|F|1993-08-10|1993-10-04|1993-08-15|NONE|TRUCK|sits. even, special accounts ca +23559|1146|19|4|6|6282.84|0.00|0.07|A|F|1993-11-15|1993-09-10|1993-11-25|TAKE BACK RETURN|FOB|oxes cajole pi +23559|1761|46|5|19|31592.44|0.10|0.03|A|F|1993-08-13|1993-09-16|1993-09-03|COLLECT COD|RAIL| furiously bold accounts wake blithe packag +23559|676|70|6|20|31533.40|0.06|0.02|R|F|1993-09-26|1993-09-21|1993-10-19|TAKE BACK RETURN|TRUCK|ounts cajole furiously regular pinto be +23559|1879|80|7|27|48083.49|0.01|0.07|R|F|1993-08-07|1993-08-26|1993-08-10|DELIVER IN PERSON|TRUCK|leep idly express frets. fur +23584|929|30|1|45|82346.40|0.00|0.02|R|F|1992-06-24|1992-05-20|1992-07-13|TAKE BACK RETURN|SHIP|s across the carefully even theodol +23584|184|63|2|21|22767.78|0.03|0.07|A|F|1992-06-08|1992-05-17|1992-06-11|TAKE BACK RETURN|MAIL|endencies. requests w +23584|166|93|3|31|33050.96|0.09|0.07|A|F|1992-05-28|1992-05-12|1992-06-12|NONE|MAIL|counts integrate sly +23584|1815|45|4|4|6867.24|0.10|0.06|A|F|1992-04-01|1992-04-25|1992-04-17|COLLECT COD|SHIP|eposits haggle above the furiously iron +23585|313|70|1|36|43679.16|0.08|0.08|R|F|1993-02-04|1993-01-28|1993-02-09|TAKE BACK RETURN|MAIL| above the carefully +23585|25|76|2|10|9250.20|0.10|0.04|R|F|1993-02-24|1992-12-19|1993-03-11|NONE|FOB|egular requests. requests cajole regular +23585|1752|37|3|37|61188.75|0.05|0.08|R|F|1993-02-04|1992-12-11|1993-02-15|COLLECT COD|SHIP|ajole slyly spec +23585|984|87|4|19|35814.62|0.08|0.08|A|F|1993-02-06|1992-12-23|1993-02-27|NONE|AIR|riously express +23585|1353|92|5|33|41393.55|0.04|0.08|R|F|1992-12-26|1993-01-15|1993-01-25|TAKE BACK RETURN|RAIL|g to the regular +23586|714|47|1|44|71047.24|0.01|0.08|R|F|1993-03-04|1993-02-22|1993-03-22|TAKE BACK RETURN|FOB|eas. carefully ironic tithes nag fina +23586|609|41|2|43|64912.80|0.05|0.01|R|F|1993-03-06|1993-03-21|1993-03-09|NONE|SHIP|es wake quickly bold accoun +23586|1840|27|3|39|67931.76|0.08|0.00|A|F|1993-04-17|1993-02-25|1993-05-07|TAKE BACK RETURN|MAIL|ickly regular +23587|241|42|1|2|2282.48|0.00|0.02|A|F|1992-08-05|1992-06-26|1992-08-31|COLLECT COD|AIR|sts about the ironic dependencies +23587|1584|85|2|18|26740.44|0.00|0.01|A|F|1992-06-29|1992-07-31|1992-07-22|NONE|TRUCK|ions cajole +23587|131|32|3|4|4124.52|0.04|0.00|A|F|1992-08-25|1992-07-17|1992-09-14|COLLECT COD|AIR|cross the fluffily even deposits cajole c +23587|1391|30|4|14|18093.46|0.05|0.07|A|F|1992-07-07|1992-06-22|1992-07-25|DELIVER IN PERSON|SHIP|carefully above the pending, regular theodo +23587|1936|25|5|23|42272.39|0.00|0.07|R|F|1992-06-16|1992-06-16|1992-07-02|COLLECT COD|AIR|ckly express accounts cajole furi +23588|1046|52|1|8|7576.32|0.10|0.03|N|O|1996-12-15|1997-01-04|1997-01-08|DELIVER IN PERSON|SHIP|oxes. special requests boost. ironic t +23589|549|80|1|1|1449.54|0.00|0.02|N|O|1998-06-02|1998-05-27|1998-06-12|NONE|AIR|nal requests might sleep regular, spec +23589|1931|76|2|3|5498.79|0.08|0.05|N|O|1998-05-29|1998-06-07|1998-06-08|NONE|MAIL|riously even packages cajole blith +23589|387|88|3|44|56644.72|0.10|0.08|N|O|1998-08-10|1998-07-02|1998-09-01|COLLECT COD|SHIP|ly pending courts hagg +23589|69|95|4|32|31009.92|0.08|0.08|N|O|1998-05-31|1998-07-05|1998-06-07|NONE|SHIP|ly even foxes integrate furiously blithel +23590|942|11|1|16|29487.04|0.01|0.06|N|O|1996-04-17|1996-04-06|1996-05-12|COLLECT COD|TRUCK| the quickly regular packages. fluffily +23590|191|18|2|27|29462.13|0.02|0.08|N|O|1996-04-13|1996-03-15|1996-04-20|COLLECT COD|FOB|ongside of t +23590|1274|49|3|30|35258.10|0.07|0.06|N|O|1996-01-14|1996-03-09|1996-01-22|COLLECT COD|SHIP|ncies. quickly bold pains lose +23590|27|78|4|11|10197.22|0.06|0.06|N|O|1996-02-12|1996-03-02|1996-02-24|TAKE BACK RETURN|REG AIR| regular packag +23591|1259|71|1|11|12762.75|0.05|0.00|N|O|1997-04-29|1997-06-26|1997-04-30|DELIVER IN PERSON|MAIL|s. carefully regular requests ag +23591|723|88|2|4|6494.88|0.02|0.08|N|O|1997-06-07|1997-05-19|1997-06-15|DELIVER IN PERSON|REG AIR| about the regular, +23591|689|52|3|4|6358.72|0.08|0.01|N|O|1997-08-08|1997-06-29|1997-09-05|COLLECT COD|FOB|ly furiously final instru +23591|763|96|4|43|71541.68|0.09|0.05|N|O|1997-05-29|1997-05-27|1997-06-07|NONE|MAIL|bold excuses d +23616|1498|38|1|19|26590.31|0.03|0.04|R|F|1992-12-03|1992-10-31|1992-12-08|TAKE BACK RETURN|RAIL|hang carefully even ideas. specia +23616|558|19|2|29|42297.95|0.03|0.07|A|F|1992-11-06|1992-09-28|1992-11-27|NONE|AIR|e. final ideas haggle. +23616|371|72|3|5|6356.85|0.10|0.08|A|F|1992-11-09|1992-10-07|1992-12-06|COLLECT COD|REG AIR|uests are +23616|768|69|4|45|75094.20|0.09|0.02|A|F|1992-10-16|1992-10-25|1992-11-01|TAKE BACK RETURN|AIR|l platelets. slyly regular theodolites +23616|312|97|5|21|25458.51|0.00|0.01|A|F|1992-11-07|1992-10-22|1992-11-18|TAKE BACK RETURN|RAIL| the final packages. carefull +23617|1487|27|1|26|36100.48|0.08|0.02|A|F|1995-05-08|1995-07-16|1995-05-13|DELIVER IN PERSON|RAIL|ld deposits sleep quickly furi +23617|1025|96|2|44|40744.88|0.07|0.07|N|O|1995-08-27|1995-07-18|1995-09-06|NONE|TRUCK|riously re +23617|747|48|3|23|37898.02|0.10|0.03|N|F|1995-05-30|1995-07-21|1995-06-23|NONE|REG AIR|o beans use carefully. furi +23617|781|46|4|43|72316.54|0.01|0.08|N|O|1995-08-08|1995-06-15|1995-08-31|DELIVER IN PERSON|REG AIR| blithely sly +23617|471|59|5|44|60344.68|0.02|0.07|N|O|1995-08-30|1995-06-27|1995-09-13|NONE|SHIP|t along the quickly express pinto beans. +23618|1098|4|1|4|3996.36|0.08|0.03|R|F|1993-01-14|1992-12-31|1993-01-17|DELIVER IN PERSON|AIR|boldly special requests use quic +23618|746|79|2|2|3293.48|0.03|0.07|R|F|1992-12-25|1993-01-20|1992-12-31|TAKE BACK RETURN|RAIL|e regular accounts. final excuses sleep +23618|1402|42|3|14|18247.60|0.02|0.07|A|F|1993-02-05|1993-01-15|1993-02-18|TAKE BACK RETURN|MAIL|. even excu +23619|1675|76|1|7|11036.69|0.07|0.04|R|F|1993-02-28|1993-02-18|1993-03-09|DELIVER IN PERSON|REG AIR|eodolites are. de +23619|989|92|2|10|18899.80|0.04|0.05|A|F|1993-04-03|1993-03-18|1993-04-05|TAKE BACK RETURN|TRUCK| quickly unusual t +23619|566|67|3|47|68928.32|0.05|0.04|R|F|1993-02-20|1993-03-21|1993-03-14|COLLECT COD|RAIL|ng the fluffily regular pinto beans. +23619|935|4|4|31|56913.83|0.04|0.05|A|F|1993-03-04|1993-03-20|1993-03-14|NONE|FOB|the never ironic ideas +23619|800|33|5|14|23811.20|0.10|0.07|A|F|1993-04-21|1993-02-28|1993-05-18|DELIVER IN PERSON|SHIP|de of the blithel +23620|419|49|1|3|3958.23|0.08|0.06|N|O|1998-09-22|1998-10-03|1998-09-25|COLLECT COD|FOB| above the regular dependencies. quickly +23620|1996|29|2|32|60735.68|0.04|0.00|N|O|1998-08-22|1998-08-30|1998-09-05|TAKE BACK RETURN|MAIL|inal deposits alongside of the ca +23620|793|26|3|8|13550.32|0.00|0.05|N|O|1998-08-07|1998-08-30|1998-08-17|TAKE BACK RETURN|RAIL|y ironic theodolites affix slyly among t +23620|1118|27|4|32|32611.52|0.10|0.00|N|O|1998-08-21|1998-09-17|1998-08-31|DELIVER IN PERSON|RAIL|lithely along the final, fi +23620|542|73|5|12|17310.48|0.03|0.08|N|O|1998-09-12|1998-09-30|1998-09-30|DELIVER IN PERSON|RAIL|s. carefully daring deposits use even dept +23621|1312|27|1|29|35185.99|0.05|0.05|N|O|1997-04-02|1997-03-29|1997-04-09|COLLECT COD|TRUCK|dencies affix quickly asymptote +23621|977|46|2|20|37559.40|0.05|0.00|N|O|1997-01-19|1997-03-19|1997-01-21|COLLECT COD|FOB|sy accounts wake. bold dolphins across +23621|1641|65|3|28|43193.92|0.03|0.07|N|O|1997-02-11|1997-03-15|1997-03-03|DELIVER IN PERSON|REG AIR|as-- dependencies detect q +23621|64|65|4|13|12532.78|0.09|0.04|N|O|1997-01-08|1997-02-28|1997-01-31|COLLECT COD|SHIP|s was. pending foxes among the +23621|1841|85|5|41|71456.44|0.03|0.04|N|O|1997-03-14|1997-02-23|1997-04-09|DELIVER IN PERSON|MAIL| the furiously expres +23621|934|37|6|5|9174.65|0.09|0.07|N|O|1997-02-12|1997-03-18|1997-02-21|COLLECT COD|MAIL|indle even, even +23622|1335|74|1|22|27199.26|0.01|0.03|R|F|1994-07-31|1994-06-28|1994-08-16|COLLECT COD|SHIP| beans. furiously unusual packages +23622|592|93|2|32|47762.88|0.10|0.05|R|F|1994-04-11|1994-06-10|1994-05-01|DELIVER IN PERSON|AIR|ic accounts! unusual requests above the ex +23622|1325|40|3|36|44147.52|0.06|0.04|R|F|1994-07-10|1994-06-04|1994-07-16|COLLECT COD|TRUCK|lithely final foxes. furiou +23622|227|82|4|46|51852.12|0.09|0.07|R|F|1994-05-10|1994-06-04|1994-05-12|COLLECT COD|MAIL|s haggle slyly across the furiou +23622|544|45|5|16|23112.64|0.00|0.01|A|F|1994-07-17|1994-07-01|1994-08-16|COLLECT COD|MAIL|ckly enticing ideas play carefully slyly e +23623|1122|95|1|35|35809.20|0.09|0.02|N|O|1997-02-15|1997-02-23|1997-02-19|NONE|SHIP|r excuses affix. furiously express d +23623|1220|58|2|48|53818.56|0.06|0.04|N|O|1997-03-19|1997-03-06|1997-04-06|TAKE BACK RETURN|AIR|regular request +23623|411|70|3|18|23605.38|0.03|0.07|N|O|1997-03-17|1997-03-11|1997-04-07|DELIVER IN PERSON|RAIL|alongside of the accounts. fin +23648|1263|38|1|29|33763.54|0.06|0.08|A|F|1992-12-19|1992-11-27|1993-01-14|DELIVER IN PERSON|RAIL|esias. blithely si +23648|771|36|2|6|10030.62|0.10|0.01|A|F|1993-01-08|1992-12-23|1993-02-06|NONE|TRUCK|eodolites among the regular, +23648|454|42|3|16|21671.20|0.08|0.07|R|F|1992-11-24|1992-10-25|1992-12-11|TAKE BACK RETURN|AIR|e unusual requests. carefully final i +23648|188|41|4|27|29380.86|0.04|0.08|A|F|1992-12-11|1992-11-12|1992-12-19|TAKE BACK RETURN|AIR|final instructions cajole at the qu +23648|1695|78|5|7|11176.83|0.09|0.07|A|F|1992-10-24|1992-12-06|1992-11-12|TAKE BACK RETURN|SHIP|ing dependencies detect +23648|919|54|6|44|80076.04|0.00|0.04|R|F|1992-11-01|1992-10-28|1992-11-10|TAKE BACK RETURN|RAIL|nts boost theodolites. furiously pen +23648|1332|71|7|23|28366.59|0.00|0.01|A|F|1992-10-14|1992-12-16|1992-11-07|DELIVER IN PERSON|RAIL|ffily ironic accounts should have +23649|764|65|1|28|46613.28|0.03|0.04|R|F|1992-11-01|1992-10-13|1992-11-17|TAKE BACK RETURN|FOB| quickly pending, unusual courts. bold ac +23649|1366|81|2|35|44357.60|0.07|0.06|R|F|1992-11-20|1992-10-21|1992-11-27|TAKE BACK RETURN|TRUCK| about the bo +23649|713|14|3|23|37115.33|0.09|0.07|A|F|1992-11-22|1992-10-21|1992-12-07|TAKE BACK RETURN|RAIL|ound the regula +23649|987|88|4|3|5663.94|0.09|0.05|A|F|1992-10-16|1992-10-07|1992-10-24|TAKE BACK RETURN|RAIL|ravely. instructions cajole slyly after +23649|304|61|5|41|49376.30|0.10|0.01|A|F|1992-12-22|1992-12-04|1993-01-05|TAKE BACK RETURN|RAIL| packages-- unusual, express accounts u +23649|1596|17|6|38|56908.42|0.05|0.01|A|F|1992-12-14|1992-10-26|1992-12-27|COLLECT COD|FOB|ts. furiously regular theodolites +23649|354|55|7|45|56445.75|0.10|0.03|R|F|1992-10-17|1992-11-21|1992-10-22|NONE|TRUCK|tions across the special de +23650|1103|76|1|30|30123.00|0.08|0.00|N|O|1997-02-02|1997-02-08|1997-02-14|NONE|FOB|bove the idle foxes. even accou +23650|1669|52|2|8|12565.28|0.09|0.05|N|O|1997-04-05|1997-03-09|1997-05-05|COLLECT COD|MAIL|s foxes haggle idly. regu +23651|224|6|1|46|51714.12|0.06|0.02|N|O|1997-12-10|1998-02-10|1998-01-02|NONE|AIR|ost carefully. bold accounts +23651|537|28|2|29|41688.37|0.10|0.07|N|O|1997-12-26|1998-02-11|1998-01-01|TAKE BACK RETURN|MAIL|iously bold packages dete +23651|206|7|3|41|45354.20|0.07|0.02|N|O|1997-11-25|1998-02-04|1997-12-25|NONE|FOB|s nag blithely final, b +23651|1399|100|4|12|15604.68|0.07|0.01|N|O|1998-02-12|1998-01-19|1998-02-15|DELIVER IN PERSON|FOB|gular requests de +23651|1616|40|5|3|4552.83|0.03|0.06|N|O|1998-03-01|1998-02-04|1998-03-03|COLLECT COD|MAIL|y final accounts +23652|1861|62|1|41|72277.26|0.07|0.05|R|F|1994-12-02|1994-10-02|1994-12-23|TAKE BACK RETURN|RAIL|thely ironic pinto beans ca +23652|1727|12|2|6|9772.32|0.05|0.05|R|F|1994-11-04|1994-10-12|1994-11-25|NONE|REG AIR|ackages. ironic, unusual requests among +23653|1058|64|1|50|47952.50|0.07|0.08|N|O|1997-01-04|1996-11-13|1997-01-21|TAKE BACK RETURN|RAIL|pending forges. fluffily regular p +23653|154|33|2|22|23191.30|0.03|0.08|N|O|1996-12-09|1996-12-11|1996-12-20|TAKE BACK RETURN|RAIL|unts. blithely +23653|1775|18|3|20|33535.40|0.03|0.05|N|O|1997-01-27|1996-12-27|1997-01-28|NONE|SHIP|uriously pending platel +23653|711|44|4|16|25787.36|0.00|0.05|N|O|1996-10-15|1997-01-07|1996-11-11|NONE|SHIP|aggle quickly +23653|922|23|5|3|5468.76|0.09|0.07|N|O|1996-10-24|1996-12-03|1996-11-04|COLLECT COD|FOB|he quickly silent instructions. dolphi +23654|1466|84|1|43|58800.78|0.04|0.05|N|O|1997-01-31|1996-12-13|1997-02-16|COLLECT COD|TRUCK| are quickly +23654|1875|62|2|29|51529.23|0.04|0.03|N|O|1997-01-08|1996-11-21|1997-01-26|DELIVER IN PERSON|MAIL|inal, ironic accounts. r +23654|1399|14|3|39|50715.21|0.02|0.08|N|O|1996-12-27|1996-11-21|1996-12-29|DELIVER IN PERSON|SHIP|c deposits +23654|1913|2|4|43|78041.13|0.04|0.03|N|O|1997-01-31|1996-11-06|1997-02-18|TAKE BACK RETURN|RAIL|s cajole slyly. carefully ironic platel +23654|629|23|5|47|71892.14|0.09|0.08|N|O|1996-10-09|1996-12-14|1996-10-21|TAKE BACK RETURN|SHIP|g the carefully final i +23655|1399|14|1|26|33810.14|0.10|0.01|N|O|1996-11-20|1996-12-14|1996-12-02|TAKE BACK RETURN|RAIL|ular requests. silent f +23655|1891|35|2|30|53786.70|0.02|0.04|N|O|1997-01-11|1996-11-02|1997-01-28|NONE|MAIL|ul deposits cajole slyly? f +23655|1413|31|3|40|52576.40|0.02|0.08|N|O|1996-10-30|1996-11-06|1996-11-07|NONE|TRUCK|ideas against the even ideas are carefully +23655|619|13|4|39|59264.79|0.06|0.08|N|O|1996-09-20|1996-11-10|1996-10-07|TAKE BACK RETURN|REG AIR|uffily pend +23680|1773|100|1|25|41869.25|0.10|0.07|R|F|1994-01-03|1993-12-29|1994-01-13|NONE|REG AIR|the blithely unusual a +23680|1675|76|2|10|15766.70|0.03|0.01|A|F|1994-01-14|1994-01-06|1994-02-11|DELIVER IN PERSON|TRUCK|lithely final instructions. quickly +23681|1899|86|1|25|45022.25|0.03|0.00|A|F|1992-07-07|1992-07-05|1992-08-01|NONE|MAIL|ously ironic packag +23682|1586|87|1|29|43139.82|0.07|0.04|N|O|1998-04-15|1998-05-11|1998-04-16|DELIVER IN PERSON|RAIL|onic accounts. slyly regular pint +23682|1214|26|2|7|7806.47|0.01|0.00|N|O|1998-03-27|1998-05-05|1998-04-25|TAKE BACK RETURN|FOB|theodolites about the always express ideas +23683|1987|32|1|19|35890.62|0.01|0.07|N|O|1996-11-13|1996-11-22|1996-12-11|COLLECT COD|FOB|ickly final accounts wake car +23684|1848|92|1|42|73493.28|0.09|0.05|N|O|1998-04-18|1998-05-09|1998-04-22|COLLECT COD|REG AIR|into beans. final de +23684|479|38|2|46|63455.62|0.03|0.05|N|O|1998-06-17|1998-04-22|1998-06-29|NONE|FOB|l deposits cajole slyly even +23684|1320|97|3|38|46410.16|0.02|0.01|N|O|1998-05-30|1998-05-06|1998-06-17|NONE|FOB|slyly. slyly silent ideas within the quickl +23684|1479|97|4|8|11043.76|0.02|0.08|N|O|1998-04-16|1998-05-06|1998-04-17|TAKE BACK RETURN|AIR|xpress requests sleep fu +23684|36|87|5|43|40249.29|0.01|0.08|N|O|1998-05-29|1998-05-03|1998-06-24|DELIVER IN PERSON|AIR|y pending +23684|1345|22|6|45|56085.30|0.00|0.06|N|O|1998-06-07|1998-04-26|1998-07-02|DELIVER IN PERSON|TRUCK|the blithely final dugouts nag after +23684|1785|86|7|23|38795.94|0.03|0.05|N|O|1998-06-04|1998-04-29|1998-07-01|NONE|RAIL|ans. carefully reg +23685|1252|90|1|44|50743.00|0.01|0.00|A|F|1992-08-04|1992-08-11|1992-08-26|NONE|RAIL|e furiously. express, busy pla +23685|619|51|2|45|68382.45|0.06|0.07|R|F|1992-08-19|1992-09-08|1992-09-13|DELIVER IN PERSON|FOB|osits hang. silent, +23685|1872|16|3|26|46120.62|0.09|0.05|R|F|1992-10-08|1992-09-28|1992-10-22|DELIVER IN PERSON|FOB|ully ironic pinto b +23685|404|34|4|40|52176.00|0.01|0.04|R|F|1992-09-03|1992-08-08|1992-09-22|TAKE BACK RETURN|FOB|lyly ironic excuses. pendi +23685|329|14|5|26|31962.32|0.01|0.06|A|F|1992-07-10|1992-08-10|1992-08-04|DELIVER IN PERSON|REG AIR|ial packages about the quickly +23685|1221|59|6|40|44888.80|0.01|0.02|R|F|1992-08-15|1992-09-11|1992-09-07|NONE|MAIL|ly final foxes are pending deposits. final, +23685|1085|91|7|6|5916.48|0.05|0.00|R|F|1992-07-23|1992-09-05|1992-07-28|NONE|TRUCK|counts. furiously speci +23686|38|39|1|7|6566.21|0.01|0.01|N|O|1996-12-05|1997-01-26|1996-12-25|DELIVER IN PERSON|AIR|eposits after the furious +23686|1490|91|2|15|20872.35|0.03|0.08|N|O|1996-12-05|1997-02-06|1996-12-18|COLLECT COD|MAIL| sleep among the ironic, ironi +23686|1668|10|3|45|70634.70|0.10|0.05|N|O|1997-02-01|1997-02-24|1997-02-06|COLLECT COD|RAIL|l accounts about the special packages are a +23686|535|36|4|13|18661.89|0.09|0.00|N|O|1997-02-18|1997-01-24|1997-03-14|COLLECT COD|AIR|ructions print regular, +23686|1670|94|5|2|3143.34|0.01|0.06|N|O|1997-01-18|1997-01-26|1997-01-31|TAKE BACK RETURN|SHIP|ages integrate carefully boldly unusual the +23686|1166|75|6|28|29880.48|0.01|0.03|N|O|1997-03-17|1997-01-22|1997-04-07|DELIVER IN PERSON|REG AIR|l excuses. regular, +23687|622|54|1|34|51769.08|0.08|0.00|N|O|1996-11-16|1997-01-06|1996-12-09|DELIVER IN PERSON|REG AIR|encies affix +23712|1246|21|1|29|33269.96|0.09|0.00|A|F|1993-10-12|1993-10-28|1993-11-03|NONE|REG AIR|the even accounts are a +23713|1772|15|1|10|16737.70|0.00|0.06|R|F|1993-03-16|1993-01-14|1993-04-05|COLLECT COD|REG AIR|cross the slyly special de +23713|424|12|2|50|66221.00|0.10|0.01|R|F|1993-01-22|1992-12-29|1993-02-09|DELIVER IN PERSON|REG AIR|accounts across the regularl +23713|1384|61|3|32|41132.16|0.09|0.00|A|F|1993-03-24|1993-01-12|1993-04-05|NONE|TRUCK|le according to the regul +23713|239|94|4|11|12531.53|0.01|0.00|A|F|1993-02-03|1993-02-09|1993-02-22|NONE|REG AIR|riously regular theodolites acros +23714|1557|38|1|6|8751.30|0.07|0.00|N|O|1996-04-12|1996-05-11|1996-05-10|DELIVER IN PERSON|REG AIR|ns. blithely regular +23714|578|79|2|43|63578.51|0.04|0.01|N|O|1996-08-02|1996-05-07|1996-08-27|NONE|SHIP|lar dinos. final theod +23715|1710|11|1|40|64468.40|0.09|0.06|N|O|1997-07-29|1997-07-28|1997-08-11|COLLECT COD|AIR|ets integrate. final, unusual +23716|543|74|1|32|46193.28|0.09|0.02|N|O|1997-04-10|1997-05-22|1997-04-14|TAKE BACK RETURN|AIR| blithely among the final th +23716|686|80|2|18|28560.24|0.08|0.01|N|O|1997-06-21|1997-04-20|1997-06-27|NONE|RAIL|ly bold deposits. blith +23716|1435|36|3|47|62812.21|0.08|0.08|N|O|1997-05-15|1997-05-30|1997-05-16|DELIVER IN PERSON|SHIP|refully carefully dogged pinto beans. pa +23716|1569|50|4|44|64704.64|0.04|0.04|N|O|1997-04-04|1997-05-15|1997-04-14|NONE|FOB| deposits wake ir +23716|301|58|5|20|24026.00|0.03|0.04|N|O|1997-06-14|1997-04-12|1997-06-22|DELIVER IN PERSON|SHIP|g instructions. +23716|1240|41|6|17|19401.08|0.08|0.06|N|O|1997-06-28|1997-05-25|1997-07-11|NONE|MAIL|leep furiously slyly +23717|1872|73|1|11|19512.57|0.10|0.08|R|F|1993-12-01|1994-01-15|1993-12-05|COLLECT COD|SHIP|e slyly ironic +23717|1343|58|2|50|62217.00|0.04|0.02|A|F|1993-11-20|1994-02-05|1993-12-10|COLLECT COD|AIR| after the bold deposits serve blithely +23718|1239|51|1|45|51310.35|0.08|0.05|A|F|1994-04-05|1994-04-21|1994-05-01|DELIVER IN PERSON|RAIL|y. carefully regular idea +23718|51|77|2|31|29482.55|0.08|0.06|A|F|1994-04-10|1994-03-19|1994-05-04|COLLECT COD|TRUCK| integrate slyly slyly +23718|867|34|3|6|10607.16|0.04|0.05|R|F|1994-05-15|1994-04-05|1994-05-24|TAKE BACK RETURN|TRUCK| ironic pinto beans detect around the furi +23718|1502|43|4|46|64561.00|0.04|0.08|R|F|1994-05-19|1994-03-06|1994-05-29|TAKE BACK RETURN|FOB|onic sheaves. +23719|825|25|1|38|65581.16|0.09|0.07|A|F|1993-08-03|1993-10-23|1993-08-14|NONE|TRUCK| the pending packages. r +23719|225|7|2|2|2250.44|0.08|0.05|R|F|1993-09-21|1993-09-09|1993-10-17|DELIVER IN PERSON|SHIP|above the quickly i +23719|865|32|3|39|68868.54|0.03|0.07|A|F|1993-09-01|1993-09-08|1993-09-06|TAKE BACK RETURN|TRUCK|ironic platelets engage. regu +23744|1972|73|1|38|71210.86|0.04|0.04|N|O|1998-04-19|1998-04-21|1998-04-28|DELIVER IN PERSON|SHIP| haggle carefully among the c +23744|72|23|2|29|28190.03|0.06|0.05|N|O|1998-04-20|1998-04-20|1998-05-07|COLLECT COD|SHIP|ns cajole idly after the quickly bold pi +23744|1414|15|3|34|44723.94|0.00|0.03|N|O|1998-03-15|1998-04-26|1998-03-19|NONE|AIR|nding tithes cajole do +23744|415|45|4|24|31569.84|0.04|0.02|N|O|1998-02-18|1998-03-12|1998-03-11|DELIVER IN PERSON|FOB| accounts. accounts integrate around +23744|1254|66|5|22|25415.50|0.07|0.04|N|O|1998-05-20|1998-04-27|1998-06-13|TAKE BACK RETURN|REG AIR|lyly final pa +23745|1830|74|1|3|5195.49|0.09|0.03|A|F|1993-01-24|1993-02-16|1993-02-12|COLLECT COD|TRUCK| the final accounts. slyly fi +23745|856|23|2|15|26352.75|0.06|0.02|R|F|1993-03-26|1993-01-26|1993-04-18|NONE|TRUCK|er the final platelets. +23745|1894|38|3|40|71835.60|0.09|0.08|A|F|1992-12-23|1993-01-19|1993-01-07|NONE|FOB|lyly final foxes. carefu +23745|400|57|4|36|46814.40|0.05|0.06|R|F|1993-03-06|1993-03-04|1993-04-02|DELIVER IN PERSON|TRUCK|ag carefully among the blithely +23745|446|47|5|16|21543.04|0.09|0.07|A|F|1993-01-11|1993-02-08|1993-02-02|NONE|AIR|wake. blithely pending foxes use along the +23745|719|16|6|15|24295.65|0.07|0.04|A|F|1992-12-09|1993-03-01|1993-01-05|NONE|REG AIR|ainst the slyly regular accounts +23745|336|21|7|44|54398.52|0.05|0.08|R|F|1993-02-12|1993-02-10|1993-03-11|DELIVER IN PERSON|RAIL|y about the silent +23746|197|76|1|8|8777.52|0.03|0.00|A|F|1994-02-21|1994-01-20|1994-03-22|NONE|FOB|ep blithely slyly final deposits. quickly +23746|141|42|2|9|9370.26|0.09|0.01|R|F|1994-03-09|1994-03-13|1994-03-14|NONE|FOB|ls. carefull +23746|695|89|3|36|57444.84|0.05|0.02|R|F|1994-01-07|1994-02-16|1994-01-19|TAKE BACK RETURN|RAIL|pending realms. blithely final r +23746|1037|73|4|18|16884.54|0.01|0.00|A|F|1994-04-07|1994-02-04|1994-04-27|DELIVER IN PERSON|FOB|s may nag carefully. eve +23746|427|57|5|18|23893.56|0.09|0.02|R|F|1993-12-18|1994-01-25|1994-01-08|COLLECT COD|SHIP|ns. regular d +23746|561|52|6|21|30692.76|0.05|0.00|R|F|1994-01-09|1994-02-06|1994-01-14|NONE|FOB|requests. furiously express asymptotes d +23747|1997|98|1|44|83555.56|0.02|0.04|N|O|1998-07-06|1998-07-23|1998-07-22|DELIVER IN PERSON|TRUCK| the theodolites. fina +23747|519|50|2|31|44004.81|0.04|0.06|N|O|1998-09-09|1998-07-29|1998-10-01|TAKE BACK RETURN|REG AIR|mptotes nag against +23748|1734|35|1|14|22900.22|0.09|0.00|A|F|1992-09-17|1992-10-03|1992-10-04|DELIVER IN PERSON|REG AIR|xcuses. accounts nag ins +23749|1246|47|1|14|16061.36|0.00|0.01|N|O|1997-04-29|1997-03-17|1997-05-12|DELIVER IN PERSON|FOB|oys use carefully furiously +23749|1741|42|2|46|75566.04|0.10|0.08|N|O|1997-01-28|1997-03-31|1997-02-22|COLLECT COD|TRUCK|ng the ironic packages. final +23749|1545|86|3|8|11572.32|0.01|0.05|N|O|1997-02-24|1997-03-30|1997-03-16|NONE|AIR|onic deposits integrate. blith +23749|928|97|4|4|7315.68|0.00|0.00|N|O|1997-05-21|1997-03-08|1997-06-01|DELIVER IN PERSON|AIR|s haggle slyly again +23749|149|2|5|42|44063.88|0.05|0.05|N|O|1997-05-20|1997-03-26|1997-06-06|COLLECT COD|FOB|requests cajole slyly r +23749|871|71|6|3|5315.61|0.07|0.00|N|O|1997-02-09|1997-04-20|1997-03-01|TAKE BACK RETURN|MAIL|egular accounts boos +23750|230|85|1|1|1130.23|0.02|0.02|R|F|1992-10-27|1992-09-30|1992-11-16|TAKE BACK RETURN|SHIP|ongside of the furi +23750|332|89|2|27|33272.91|0.04|0.02|A|F|1992-12-14|1992-10-07|1993-01-12|DELIVER IN PERSON|REG AIR|aggle slyly along the platelets. careful +23750|1918|51|3|23|41857.93|0.10|0.04|A|F|1992-09-27|1992-10-05|1992-10-27|COLLECT COD|REG AIR|encies boost! quickly regular +23750|426|56|4|9|11937.78|0.04|0.00|A|F|1992-10-13|1992-10-12|1992-10-24|NONE|AIR|le regular requests! express instruction +23751|1049|20|1|13|12350.52|0.09|0.02|A|F|1994-05-27|1994-06-14|1994-06-19|COLLECT COD|TRUCK|. final ideas are furiously about +23751|545|46|2|33|47702.82|0.02|0.06|A|F|1994-07-09|1994-06-16|1994-07-27|DELIVER IN PERSON|REG AIR|inst the furiously final theodoli +23751|1401|41|3|21|27350.40|0.00|0.01|A|F|1994-07-13|1994-05-16|1994-08-03|DELIVER IN PERSON|RAIL|odolites integrate enticingly +23751|1447|48|4|8|10787.52|0.04|0.08|R|F|1994-05-28|1994-06-04|1994-06-12|DELIVER IN PERSON|REG AIR|ithely. fi +23776|1703|46|1|7|11232.90|0.07|0.06|A|F|1992-10-07|1992-10-10|1992-11-06|DELIVER IN PERSON|REG AIR|y regular asy +23776|760|57|2|39|64769.64|0.02|0.00|R|F|1992-12-06|1992-09-10|1992-12-22|COLLECT COD|SHIP|usly express ideas dazzle +23777|852|53|1|2|3505.70|0.05|0.03|A|F|1993-02-06|1993-01-28|1993-02-16|DELIVER IN PERSON|TRUCK|eas. pinto beans play against +23777|606|100|2|41|61770.60|0.08|0.07|R|F|1993-02-18|1993-02-08|1993-03-11|DELIVER IN PERSON|FOB|al platelets lose care +23777|511|72|3|8|11292.08|0.10|0.06|R|F|1993-02-20|1992-12-28|1993-03-15|COLLECT COD|TRUCK|ges; ironic, pending warh +23777|1173|46|4|2|2148.34|0.10|0.01|R|F|1993-01-22|1993-02-25|1993-02-16|NONE|FOB| slyly against the blithe +23777|1214|52|5|4|4460.84|0.08|0.02|A|F|1993-03-05|1993-02-01|1993-04-04|NONE|RAIL|riously regular depths nag blithely abo +23777|1946|35|6|25|46198.50|0.07|0.00|A|F|1993-03-02|1992-12-28|1993-03-07|TAKE BACK RETURN|RAIL|s sleep boldly after the fl +23778|1464|82|1|44|60080.24|0.00|0.02|R|F|1994-08-06|1994-08-21|1994-08-10|TAKE BACK RETURN|RAIL|nal deposits cajole fluffily i +23778|1478|79|2|5|6897.35|0.03|0.05|A|F|1994-07-16|1994-10-04|1994-08-09|DELIVER IN PERSON|FOB|ealms across the slowly ironic platelets ar +23778|1365|42|3|26|32925.36|0.05|0.07|R|F|1994-10-04|1994-09-20|1994-10-09|NONE|TRUCK|thely regular +23778|43|69|4|1|943.04|0.01|0.02|A|F|1994-08-25|1994-08-16|1994-09-24|DELIVER IN PERSON|REG AIR|nto the final theodolites. regular, e +23778|28|54|5|10|9280.20|0.09|0.02|A|F|1994-08-08|1994-08-15|1994-09-03|NONE|RAIL|arefully pending instructions +23778|91|92|6|48|47572.32|0.08|0.07|R|F|1994-08-06|1994-08-23|1994-09-02|COLLECT COD|MAIL|ong the even, silent platelets. unus +23779|1803|4|1|44|75011.20|0.08|0.06|N|O|1998-07-31|1998-09-17|1998-08-29|COLLECT COD|SHIP|cross the dogged inst +23779|1770|71|2|19|31763.63|0.05|0.02|N|O|1998-07-04|1998-08-14|1998-07-16|COLLECT COD|RAIL|the final ideas-- slyly express a +23779|627|90|3|42|64160.04|0.06|0.00|N|O|1998-07-31|1998-08-01|1998-08-10|DELIVER IN PERSON|REG AIR|bout the blithely even deposits +23779|1060|61|4|23|22104.38|0.07|0.06|N|O|1998-09-30|1998-08-02|1998-10-21|NONE|REG AIR|e carefully. carefu +23779|83|34|5|35|34407.80|0.07|0.06|N|O|1998-07-15|1998-08-01|1998-07-19|NONE|REG AIR|the slyly bold platelets. qui +23779|1843|73|6|31|54090.04|0.06|0.04|N|O|1998-09-27|1998-09-07|1998-09-30|TAKE BACK RETURN|RAIL| pending packages a +23780|941|76|1|25|46048.50|0.06|0.07|N|O|1997-06-25|1997-07-01|1997-07-20|NONE|SHIP| theodolites. theod +23781|1404|5|1|13|16970.20|0.07|0.05|N|O|1995-12-22|1996-01-13|1995-12-29|DELIVER IN PERSON|TRUCK|cial pinto beans haggle f +23781|1584|25|2|9|13370.22|0.01|0.05|N|O|1995-12-22|1995-12-09|1995-12-24|NONE|SHIP|ake blithely slyly silent pa +23781|75|26|3|2|1950.14|0.01|0.04|N|O|1996-01-27|1996-01-18|1996-02-17|NONE|AIR|unusual instructions. depths +23781|465|66|4|24|32771.04|0.00|0.02|N|O|1996-01-25|1995-12-24|1996-02-04|DELIVER IN PERSON|MAIL|ly. silent, daring forges are furiously b +23782|1878|8|1|7|12459.09|0.06|0.00|R|F|1993-02-01|1993-03-15|1993-02-11|DELIVER IN PERSON|REG AIR| wake quickly among the slyly ironic +23782|688|20|2|48|76256.64|0.01|0.03|R|F|1993-02-03|1993-04-01|1993-02-15|TAKE BACK RETURN|FOB|le. blithely +23782|1533|14|3|41|58815.73|0.10|0.03|A|F|1993-03-08|1993-03-08|1993-03-16|COLLECT COD|AIR|ests boost slyly unusual depo +23782|532|23|4|18|25785.54|0.10|0.06|A|F|1993-02-08|1993-03-19|1993-02-09|COLLECT COD|FOB|against the carefully final pinto bea +23783|446|47|1|16|21543.04|0.09|0.05|N|O|1995-06-20|1995-05-19|1995-07-09|TAKE BACK RETURN|TRUCK|kages. blithely reg +23808|1908|53|1|10|18099.00|0.00|0.06|R|F|1994-03-10|1994-05-04|1994-03-24|NONE|FOB|ng theodolites would wake carefully abo +23808|1499|17|2|1|1400.49|0.00|0.02|R|F|1994-05-28|1994-04-02|1994-06-01|COLLECT COD|TRUCK|lyly even reques +23808|378|79|3|45|57526.65|0.09|0.05|R|F|1994-02-12|1994-03-19|1994-02-16|COLLECT COD|AIR|sits are f +23808|789|54|4|15|25346.70|0.05|0.02|R|F|1994-05-07|1994-04-08|1994-05-17|NONE|TRUCK|, ironic packages. final +23808|683|77|5|25|39592.00|0.10|0.03|R|F|1994-02-12|1994-03-15|1994-02-25|TAKE BACK RETURN|MAIL| the court +23809|1558|79|1|42|61301.10|0.09|0.01|R|F|1992-06-20|1992-07-09|1992-07-10|NONE|REG AIR|affix. furiously bold packages +23809|431|19|2|12|15977.16|0.02|0.02|R|F|1992-09-17|1992-07-23|1992-09-20|NONE|FOB|among the sly +23809|1748|91|3|26|42893.24|0.08|0.02|R|F|1992-09-29|1992-08-04|1992-10-04|DELIVER IN PERSON|RAIL|fluffily even packages are alon +23809|1427|28|4|47|62435.74|0.03|0.04|A|F|1992-08-23|1992-08-23|1992-09-06|COLLECT COD|FOB| theodolites. +23809|989|58|5|21|39689.58|0.01|0.00|R|F|1992-09-24|1992-07-24|1992-10-23|COLLECT COD|TRUCK| beans. express pinto be +23809|950|19|6|31|57379.45|0.08|0.04|R|F|1992-09-07|1992-08-19|1992-09-08|COLLECT COD|TRUCK|special platelets above the reques +23809|839|40|7|16|27837.28|0.05|0.02|A|F|1992-08-24|1992-08-27|1992-08-30|TAKE BACK RETURN|FOB|counts wake busily after the theodolites +23810|66|17|1|17|16423.02|0.08|0.08|R|F|1993-07-30|1993-07-19|1993-08-28|TAKE BACK RETURN|MAIL|g the blithel +23811|1222|60|1|17|19094.74|0.03|0.02|N|O|1997-06-01|1997-08-12|1997-06-13|DELIVER IN PERSON|REG AIR| even deposits wake blithely agai +23811|198|25|2|50|54909.50|0.10|0.05|N|O|1997-07-27|1997-08-03|1997-08-15|NONE|REG AIR|uriously near the wate +23811|731|96|3|38|62005.74|0.00|0.07|N|O|1997-08-06|1997-07-16|1997-08-11|TAKE BACK RETURN|MAIL|e the blithely b +23812|493|94|1|20|27869.80|0.09|0.04|R|F|1992-09-12|1992-10-26|1992-09-22|COLLECT COD|MAIL|es express pinto beans. theod +23812|916|19|2|20|36338.20|0.02|0.06|R|F|1992-08-19|1992-10-04|1992-09-10|DELIVER IN PERSON|SHIP|he warhorses. warhors +23812|1360|99|3|19|23965.84|0.01|0.08|R|F|1992-11-26|1992-09-14|1992-11-27|DELIVER IN PERSON|FOB|es nag fluffily after t +23812|1084|55|4|23|22656.84|0.00|0.05|R|F|1992-10-21|1992-09-24|1992-11-04|COLLECT COD|MAIL|c instructions are carefully according to +23812|1511|52|5|41|57912.91|0.00|0.07|R|F|1992-08-19|1992-10-05|1992-09-10|DELIVER IN PERSON|MAIL|ly against the furiou +23813|1506|87|1|8|11260.00|0.02|0.05|N|O|1997-10-01|1997-09-15|1997-10-11|TAKE BACK RETURN|AIR|final requests. evenly even instructio +23813|34|85|2|12|11208.36|0.08|0.02|N|O|1997-09-24|1997-07-25|1997-10-10|COLLECT COD|FOB|deposits cajole quickly final packages. +23813|1405|6|3|43|56175.20|0.07|0.04|N|O|1997-10-14|1997-07-22|1997-10-27|DELIVER IN PERSON|SHIP|unts sleep carefully final reque +23814|1951|52|1|19|35206.05|0.06|0.06|N|O|1998-07-10|1998-06-16|1998-07-25|NONE|SHIP| the slyly ir +23814|1975|8|2|35|65693.95|0.09|0.02|N|O|1998-05-30|1998-06-10|1998-06-07|DELIVER IN PERSON|AIR| quickly silent pinto beans +23814|1572|73|3|42|61889.94|0.00|0.08|N|O|1998-07-05|1998-06-14|1998-07-10|COLLECT COD|REG AIR|ounts are quickl +23814|1962|51|4|49|91334.04|0.08|0.04|N|O|1998-06-06|1998-05-19|1998-07-04|NONE|FOB|ans haggle quickly along the +23814|1549|90|5|44|63823.76|0.09|0.08|N|O|1998-04-26|1998-07-02|1998-05-18|COLLECT COD|RAIL|odolites. furiously pending pinto beans s +23815|1197|34|1|45|49418.55|0.05|0.07|N|O|1997-05-04|1997-04-03|1997-05-06|DELIVER IN PERSON|TRUCK|y evenly even +23815|258|13|2|24|27798.00|0.03|0.03|N|O|1997-05-14|1997-03-30|1997-06-03|DELIVER IN PERSON|MAIL|egular reques +23840|1514|95|1|48|67944.48|0.01|0.04|R|F|1994-07-08|1994-06-15|1994-07-11|NONE|RAIL|ven requests haggle furiously ironic excu +23841|1015|51|1|4|3664.04|0.05|0.03|R|F|1992-09-03|1992-10-15|1992-09-26|NONE|MAIL|ully even account +23841|637|69|2|50|76881.50|0.09|0.03|R|F|1992-11-20|1992-10-13|1992-11-28|NONE|TRUCK|ent, even packages sleep sl +23842|1521|62|1|45|64013.40|0.06|0.08|R|F|1993-12-13|1993-12-07|1993-12-21|NONE|SHIP|usly carefully bold deposi +23842|349|34|2|48|59968.32|0.00|0.00|A|F|1994-01-02|1993-10-25|1994-01-25|NONE|TRUCK|nto beans. boldl +23842|556|17|3|4|5826.20|0.01|0.08|R|F|1994-01-02|1993-12-04|1994-01-20|NONE|TRUCK|equests use n +23842|1349|88|4|24|30008.16|0.03|0.00|R|F|1993-10-23|1993-12-05|1993-11-11|DELIVER IN PERSON|AIR|iously special dep +23842|38|39|5|23|21574.69|0.09|0.06|A|F|1993-10-10|1993-12-01|1993-10-25|NONE|FOB|slyly. silent deposits are +23842|45|46|6|15|14175.60|0.00|0.01|A|F|1994-01-10|1993-11-28|1994-01-20|DELIVER IN PERSON|SHIP|ts. furiously special deposit +23842|271|99|7|48|56220.96|0.07|0.08|R|F|1993-10-23|1993-11-29|1993-11-16|TAKE BACK RETURN|MAIL|uriously unusual pinto bea +23843|1040|76|1|3|2823.12|0.08|0.05|N|O|1996-07-01|1996-07-17|1996-07-22|TAKE BACK RETURN|AIR| packages affix. slyly regular accou +23843|1435|14|2|29|38756.47|0.09|0.08|N|O|1996-08-10|1996-07-27|1996-08-29|TAKE BACK RETURN|MAIL|dencies are slyly +23843|1673|56|3|12|18896.04|0.06|0.08|N|O|1996-09-05|1996-07-19|1996-09-13|NONE|AIR|usly above the permanent deposits. br +23844|226|27|1|1|1126.22|0.07|0.08|A|F|1994-07-13|1994-09-27|1994-08-01|COLLECT COD|RAIL|ts integrate finally after +23844|726|23|2|26|42294.72|0.00|0.02|R|F|1994-09-28|1994-09-15|1994-10-06|COLLECT COD|FOB| are slyly against th +23844|485|15|3|29|40178.92|0.02|0.02|A|F|1994-10-03|1994-09-04|1994-10-21|DELIVER IN PERSON|SHIP|quests cajole careful +23844|1218|19|4|3|3357.63|0.05|0.05|A|F|1994-08-29|1994-08-31|1994-09-18|NONE|AIR|ely express reque +23844|1126|63|5|21|21569.52|0.03|0.05|A|F|1994-08-28|1994-08-09|1994-09-22|COLLECT COD|AIR|ace of the carefully re +23844|435|94|6|20|26708.60|0.07|0.03|A|F|1994-09-30|1994-08-28|1994-10-08|DELIVER IN PERSON|SHIP|posits sleep qu +23844|1078|84|7|45|44058.15|0.01|0.04|R|F|1994-09-22|1994-09-28|1994-10-22|DELIVER IN PERSON|AIR|ully ironic foxes across the blithely s +23845|1871|58|1|11|19501.57|0.08|0.00|N|O|1997-06-30|1997-07-09|1997-07-20|TAKE BACK RETURN|SHIP|s. blithely ironic fo +23845|690|91|2|18|28632.42|0.10|0.07|N|O|1997-06-20|1997-08-08|1997-07-14|DELIVER IN PERSON|REG AIR|rmanent requests. regular, bold re +23845|1474|14|3|25|34386.75|0.03|0.06|N|O|1997-08-01|1997-07-06|1997-08-11|DELIVER IN PERSON|TRUCK|ffix around t +23846|776|77|1|27|45272.79|0.07|0.08|N|O|1997-11-04|1997-10-18|1997-11-07|NONE|REG AIR|integrate final esc +23846|1543|84|2|3|4333.62|0.09|0.08|N|O|1997-11-25|1997-11-02|1997-12-13|DELIVER IN PERSON|RAIL|ts among the special packa +23846|1208|20|3|5|5546.00|0.01|0.04|N|O|1997-12-05|1997-11-02|1997-12-31|TAKE BACK RETURN|FOB|y unusual, c +23846|1456|35|4|48|65157.60|0.09|0.07|N|O|1997-10-11|1997-10-06|1997-11-05|TAKE BACK RETURN|FOB|ges mold around the quickly r +23847|1110|47|1|2|2022.22|0.09|0.06|R|F|1993-02-07|1992-12-15|1993-02-10|TAKE BACK RETURN|RAIL| special, ironic excuses. carefully +23847|379|80|2|21|26866.77|0.04|0.07|A|F|1993-01-06|1993-02-03|1993-01-20|DELIVER IN PERSON|SHIP|final dependencies nod blithely. +23872|1963|8|1|39|72733.44|0.09|0.01|N|O|1997-02-06|1996-12-20|1997-02-16|DELIVER IN PERSON|SHIP|s. theodolites haggle a +23873|779|76|1|32|53752.64|0.10|0.02|A|F|1994-11-24|1995-02-17|1994-12-04|NONE|RAIL|counts. busily express dep +23874|1654|37|1|22|34224.30|0.00|0.00|A|F|1993-12-03|1993-09-20|1993-12-06|TAKE BACK RETURN|AIR|ns use fluffily ironic accounts. +23875|720|53|1|4|6482.88|0.09|0.04|N|O|1995-12-23|1996-01-06|1996-01-15|DELIVER IN PERSON|REG AIR|egrate along the blithely slow +23875|910|11|2|41|74247.31|0.04|0.04|N|O|1996-01-12|1996-01-03|1996-02-10|COLLECT COD|AIR|carefully regular deposits eat flu +23876|128|81|1|41|42152.92|0.05|0.03|A|F|1992-11-29|1992-12-19|1992-12-18|NONE|AIR|es cajole thinly. final foxes along the ir +23876|1106|43|2|3|3021.30|0.10|0.04|R|F|1992-12-24|1992-11-24|1993-01-02|TAKE BACK RETURN|REG AIR|regular requests wake slyly. doggedly i +23876|1647|89|3|44|68140.16|0.09|0.04|R|F|1993-01-12|1992-12-19|1993-01-30|COLLECT COD|FOB|es into the carefully unusual f +23877|49|75|1|47|44604.88|0.00|0.00|A|F|1994-09-18|1994-09-01|1994-10-17|NONE|AIR|uickly bold requests. slyly final depos +23877|1994|95|2|7|13271.93|0.10|0.05|R|F|1994-08-04|1994-10-07|1994-08-18|COLLECT COD|AIR|furiously after the quickly final de +23877|592|53|3|28|41792.52|0.03|0.04|A|F|1994-10-04|1994-09-14|1994-10-08|TAKE BACK RETURN|MAIL|d multipliers! slyly final accounts +23877|768|1|4|48|80100.48|0.03|0.06|A|F|1994-11-01|1994-09-14|1994-12-01|NONE|SHIP|lyly ironic +23877|1548|29|5|13|18844.02|0.07|0.06|R|F|1994-07-28|1994-10-02|1994-07-30|DELIVER IN PERSON|SHIP| bold instructions. +23877|579|80|6|47|69539.79|0.06|0.07|R|F|1994-10-29|1994-09-24|1994-11-09|NONE|AIR|symptotes integrate +23877|1313|52|7|47|57072.57|0.03|0.08|A|F|1994-09-02|1994-10-04|1994-09-30|NONE|AIR|lar, silent +23878|605|68|1|27|40651.20|0.01|0.07|N|O|1996-12-10|1997-01-03|1997-01-03|NONE|RAIL| blithely. slyly final accou +23878|550|81|2|32|46417.60|0.04|0.04|N|O|1997-01-26|1997-02-06|1997-02-13|TAKE BACK RETURN|FOB|efully fina +23878|1033|4|3|6|5604.18|0.09|0.00|N|O|1997-01-16|1997-02-11|1997-02-09|TAKE BACK RETURN|AIR|, ironic reque +23878|894|95|4|24|43077.36|0.03|0.01|N|O|1997-01-14|1997-01-08|1997-02-04|DELIVER IN PERSON|TRUCK|ts promise. +23879|219|47|1|14|15668.94|0.07|0.08|N|O|1998-10-12|1998-08-30|1998-10-25|DELIVER IN PERSON|REG AIR|le about the regular excuses. slyly f +23879|647|10|2|9|13928.76|0.09|0.00|N|O|1998-09-01|1998-09-09|1998-09-02|DELIVER IN PERSON|REG AIR|y carefully express +23879|1881|82|3|49|87361.12|0.06|0.08|N|O|1998-09-17|1998-08-22|1998-09-22|COLLECT COD|AIR| packages alongside of the fluffily ir +23879|1342|57|4|15|18650.10|0.01|0.05|N|O|1998-09-07|1998-10-07|1998-10-04|NONE|MAIL|ly. requests breach slyly quickl +23879|1851|81|5|22|38562.70|0.09|0.01|N|O|1998-10-15|1998-09-24|1998-10-16|COLLECT COD|FOB|sly bold theodolites haggle blit +23879|119|72|6|16|16305.76|0.03|0.03|N|O|1998-10-25|1998-09-02|1998-11-18|DELIVER IN PERSON|TRUCK|nooze quickly at the ca +23879|1054|60|7|27|25786.35|0.10|0.06|N|O|1998-10-15|1998-09-05|1998-10-22|TAKE BACK RETURN|MAIL|. final packages wake slyly a +23904|1217|55|1|27|30191.67|0.01|0.04|N|O|1997-02-21|1997-01-04|1997-03-03|NONE|REG AIR|ing deposits nod above the furiously +23904|1941|86|2|24|44230.56|0.09|0.00|N|O|1997-01-29|1997-01-12|1997-02-03|COLLECT COD|REG AIR| use. pending dol +23904|1366|43|3|31|39288.16|0.03|0.01|N|O|1997-01-15|1996-12-15|1997-01-16|DELIVER IN PERSON|REG AIR|foxes. furiously final dependencies +23904|1255|30|4|7|8093.75|0.09|0.06|N|O|1997-02-13|1996-12-19|1997-02-17|DELIVER IN PERSON|MAIL|s doze fluffily. regul +23905|480|68|1|35|48316.80|0.02|0.04|N|O|1997-11-24|1997-11-05|1997-11-25|TAKE BACK RETURN|TRUCK|t packages are fluffily after th +23905|1237|49|2|8|9105.84|0.09|0.02|N|O|1997-12-25|1997-11-26|1998-01-22|NONE|AIR|nal packages alongside +23906|1222|23|1|25|28080.50|0.04|0.02|A|F|1993-11-05|1993-11-18|1993-11-28|TAKE BACK RETURN|FOB|counts. blithely regular i +23906|78|79|2|1|978.07|0.09|0.01|A|F|1993-12-26|1993-12-02|1994-01-12|DELIVER IN PERSON|REG AIR|uffily ironic asymptotes? quickly furious d +23906|1905|6|3|25|45172.50|0.00|0.03|R|F|1993-10-23|1993-11-24|1993-10-24|TAKE BACK RETURN|MAIL|dolites. fluf +23907|1332|47|1|16|19733.28|0.06|0.04|N|O|1995-10-24|1995-10-11|1995-11-02|DELIVER IN PERSON|TRUCK|ctions cajole acco +23907|888|22|2|13|23255.44|0.07|0.06|N|O|1995-08-23|1995-09-12|1995-09-16|NONE|SHIP|e. silent accounts need to haggle foxes. s +23907|1346|61|3|38|47398.92|0.06|0.06|N|O|1995-08-09|1995-09-02|1995-08-30|NONE|REG AIR|. express accounts according +23907|434|64|4|4|5337.72|0.04|0.06|N|O|1995-08-08|1995-09-30|1995-08-15|TAKE BACK RETURN|RAIL|ithely express packages. regular requests +23907|501|2|5|7|9810.50|0.09|0.02|N|O|1995-09-12|1995-09-17|1995-09-30|TAKE BACK RETURN|FOB| pinto beans. +23908|976|77|1|25|46924.25|0.00|0.00|N|O|1997-05-04|1997-06-22|1997-05-18|NONE|AIR|dinos. blithely ironic +23908|174|27|2|23|24705.91|0.01|0.02|N|O|1997-08-02|1997-06-01|1997-08-30|NONE|TRUCK| requests are. special, even packages boos +23908|1572|53|3|10|14735.70|0.08|0.02|N|O|1997-07-31|1997-07-13|1997-08-23|TAKE BACK RETURN|SHIP|lyly around the blithely final dependen +23908|526|27|4|5|7132.60|0.02|0.07|N|O|1997-05-14|1997-06-30|1997-06-08|TAKE BACK RETURN|SHIP| express requests. +23908|428|87|5|37|49151.54|0.08|0.03|N|O|1997-06-05|1997-06-18|1997-06-08|NONE|REG AIR|ccording to the blithely i +23908|231|86|6|48|54299.04|0.07|0.03|N|O|1997-05-30|1997-06-17|1997-06-14|TAKE BACK RETURN|AIR|tside the furiously pendin +23908|1908|53|7|36|65156.40|0.03|0.00|N|O|1997-06-02|1997-06-09|1997-06-18|TAKE BACK RETURN|MAIL|asymptotes. somas wake carefully. or +23909|798|31|1|49|83240.71|0.08|0.08|N|O|1997-01-25|1997-02-16|1997-02-15|NONE|SHIP|instructions about the even packages dete +23909|415|3|2|15|19731.15|0.00|0.03|N|O|1997-04-20|1997-04-01|1997-05-03|TAKE BACK RETURN|MAIL|ly according to the expr +23910|62|63|1|44|42330.64|0.06|0.02|N|O|1996-05-31|1996-08-03|1996-06-11|COLLECT COD|FOB|regular theodolites cajole regular +23911|1469|48|1|37|50707.02|0.04|0.08|A|F|1992-07-31|1992-07-29|1992-08-27|NONE|MAIL|ep blithely. regular, bol +23911|1496|75|2|4|5589.96|0.02|0.04|A|F|1992-08-03|1992-07-23|1992-08-25|COLLECT COD|REG AIR|ckly special ideas after the slyly +23911|599|90|3|46|68981.14|0.01|0.02|R|F|1992-06-20|1992-08-08|1992-06-27|NONE|TRUCK|deposits! si +23911|333|62|4|30|36999.90|0.09|0.03|R|F|1992-06-18|1992-07-08|1992-06-19|COLLECT COD|TRUCK|quests cajole doggedly final forges-- reg +23911|781|78|5|25|42044.50|0.07|0.01|A|F|1992-06-28|1992-08-08|1992-07-01|TAKE BACK RETURN|REG AIR|es. slyly even deposits are fur +23936|145|24|1|36|37625.04|0.10|0.05|A|F|1995-02-25|1995-02-26|1995-03-18|DELIVER IN PERSON|FOB|. furiously even packages along the c +23936|757|90|2|18|29839.50|0.04|0.03|R|F|1995-03-13|1995-02-13|1995-04-08|TAKE BACK RETURN|RAIL|ithely express deposits +23936|1278|79|3|41|48350.07|0.04|0.06|A|F|1995-04-06|1995-01-25|1995-04-13|TAKE BACK RETURN|SHIP|ans. fluffil +23936|1864|51|4|44|77697.84|0.01|0.03|R|F|1995-01-26|1995-01-30|1995-01-28|COLLECT COD|FOB|en pinto beans across the quickly pe +23936|53|29|5|25|23826.25|0.07|0.04|A|F|1995-02-03|1995-02-26|1995-02-08|NONE|SHIP| wake furiously-- slyly i +23936|1209|84|6|22|24424.40|0.09|0.05|A|F|1995-02-10|1995-03-11|1995-02-14|DELIVER IN PERSON|REG AIR|ourts eat. furio +23936|993|28|7|34|64395.66|0.05|0.00|A|F|1995-03-18|1995-01-30|1995-03-28|TAKE BACK RETURN|MAIL|thely ironic orbits nag besides the slyly +23937|214|96|1|7|7799.47|0.10|0.00|N|O|1997-03-29|1997-05-31|1997-04-14|TAKE BACK RETURN|REG AIR|tes haggle accounts. furiously pend +23937|1668|10|2|42|65925.72|0.00|0.07|N|O|1997-05-07|1997-04-27|1997-05-15|NONE|MAIL|s. slyly special requests s +23937|7|58|3|31|28117.00|0.07|0.01|N|O|1997-06-12|1997-04-21|1997-06-16|COLLECT COD|AIR|s use furiously accounts. pinto beans +23938|650|13|1|16|24810.40|0.03|0.05|N|O|1997-03-31|1997-02-03|1997-04-04|DELIVER IN PERSON|AIR|ding platelets +23938|1293|31|2|18|21497.22|0.05|0.04|N|O|1997-02-14|1997-02-15|1997-02-28|TAKE BACK RETURN|REG AIR|counts. regular, special dependenc +23938|1754|97|3|10|16557.50|0.01|0.05|N|O|1997-03-01|1997-02-03|1997-03-18|NONE|REG AIR|onic deposits use acros +23938|1083|89|4|20|19681.60|0.07|0.03|N|O|1997-01-25|1997-01-27|1997-01-29|COLLECT COD|FOB|r the carefully quick dolphins. theodolite +23938|1106|15|5|9|9063.90|0.02|0.01|N|O|1997-01-27|1997-02-22|1997-02-06|NONE|TRUCK| carefully final foxes sle +23938|199|78|6|37|40670.03|0.01|0.07|N|O|1997-02-12|1997-01-15|1997-02-13|NONE|MAIL|lyly even instructions. sly +23939|1130|39|1|17|17529.21|0.00|0.06|N|O|1998-04-21|1998-05-29|1998-05-17|NONE|MAIL|riously final packages. +23939|497|98|2|20|27949.80|0.03|0.02|N|O|1998-06-12|1998-05-20|1998-07-11|NONE|AIR|packages a +23940|1713|14|1|35|56514.85|0.10|0.03|R|F|1995-04-24|1995-05-11|1995-05-21|DELIVER IN PERSON|AIR|lly furiously final pack +23940|1240|52|2|47|53638.28|0.03|0.08|A|F|1995-05-01|1995-06-29|1995-05-16|COLLECT COD|FOB|efully against the furiously +23941|998|1|1|13|24686.87|0.02|0.03|N|O|1996-07-27|1996-08-11|1996-08-18|DELIVER IN PERSON|REG AIR|y thin accounts wake +23941|1179|88|2|49|52928.33|0.03|0.07|N|O|1996-08-26|1996-07-27|1996-09-11|COLLECT COD|TRUCK|riously unusual accounts about t +23941|1519|20|3|5|7102.55|0.04|0.01|N|O|1996-07-10|1996-08-26|1996-07-29|NONE|AIR|he furiousl +23941|62|88|4|32|30785.92|0.04|0.01|N|O|1996-07-18|1996-07-29|1996-08-16|DELIVER IN PERSON|FOB|he even accounts wake even +23941|1798|25|5|7|11898.53|0.05|0.04|N|O|1996-10-08|1996-08-01|1996-10-11|COLLECT COD|TRUCK|f the furiously pending pack +23941|101|2|6|46|46050.60|0.08|0.03|N|O|1996-08-14|1996-08-10|1996-08-24|NONE|REG AIR|ven deposits. dep +23942|1710|53|1|25|40292.75|0.04|0.03|A|F|1993-01-17|1993-02-25|1993-02-02|NONE|RAIL|nic accounts. final +23943|655|56|1|49|76226.85|0.10|0.05|N|O|1995-09-25|1995-08-28|1995-09-27|TAKE BACK RETURN|MAIL|arefully unusu +23943|1867|68|2|48|84905.28|0.10|0.05|N|O|1995-08-19|1995-08-09|1995-09-15|NONE|REG AIR|ly express pack +23943|1033|34|3|49|45767.47|0.08|0.02|N|O|1995-09-22|1995-09-03|1995-09-30|COLLECT COD|MAIL|y special pinto beans +23943|833|67|4|26|45079.58|0.10|0.00|N|O|1995-08-20|1995-09-05|1995-08-31|COLLECT COD|RAIL|eas. furiously regular asymptotes accordin +23943|225|26|5|45|50634.90|0.08|0.06|N|O|1995-08-21|1995-08-12|1995-08-22|TAKE BACK RETURN|RAIL|riously spe +23943|1748|33|6|38|62690.12|0.04|0.08|N|O|1995-09-13|1995-07-28|1995-10-08|COLLECT COD|SHIP|posits at the dolphins are across +23943|1542|23|7|16|23096.64|0.07|0.06|N|O|1995-07-18|1995-07-26|1995-08-07|TAKE BACK RETURN|MAIL|atelets are +23968|93|69|1|18|17875.62|0.03|0.08|N|O|1995-06-30|1995-05-17|1995-07-09|COLLECT COD|TRUCK|enly regula +23968|500|30|2|41|57420.50|0.09|0.07|A|F|1995-04-09|1995-04-29|1995-04-17|TAKE BACK RETURN|REG AIR|iously bold pinto beans. blithely re +23968|1360|61|3|37|46670.32|0.08|0.00|R|F|1995-05-14|1995-04-13|1995-05-19|NONE|MAIL|o the requests. careful +23968|1764|91|4|41|68296.16|0.00|0.05|R|F|1995-03-13|1995-04-23|1995-03-24|COLLECT COD|TRUCK| asymptotes are across the +23968|681|82|5|28|44287.04|0.02|0.04|R|F|1995-05-20|1995-04-26|1995-06-05|DELIVER IN PERSON|TRUCK|ithely unusual requests after the +23968|1866|67|6|49|86625.14|0.01|0.00|R|F|1995-03-06|1995-05-29|1995-03-15|DELIVER IN PERSON|SHIP|silent excuses. qu +23969|1870|57|1|29|51384.23|0.01|0.06|N|O|1997-08-22|1997-10-06|1997-09-16|DELIVER IN PERSON|REG AIR|lyly bold accounts along the p +23969|1376|53|2|40|51094.80|0.04|0.07|N|O|1997-10-07|1997-11-01|1997-10-17|TAKE BACK RETURN|MAIL|al deposit +23969|1522|63|3|37|52670.24|0.01|0.06|N|O|1997-08-15|1997-10-01|1997-08-29|TAKE BACK RETURN|AIR|ffily regular fox +23969|1622|23|4|12|18283.44|0.01|0.07|N|O|1997-09-25|1997-10-06|1997-09-27|DELIVER IN PERSON|TRUCK|es. even foxes after the even, +23970|285|67|1|49|58078.72|0.02|0.02|N|O|1998-07-16|1998-05-20|1998-07-19|COLLECT COD|TRUCK|uctions according to the furio +23970|1398|99|2|45|58472.55|0.03|0.06|N|O|1998-07-23|1998-06-03|1998-08-11|COLLECT COD|RAIL|y regular deposits a +23970|1725|68|3|4|6506.88|0.00|0.04|N|O|1998-07-08|1998-06-29|1998-07-22|COLLECT COD|TRUCK|ed notornis cajole blithely accordin +23970|809|76|4|29|49584.20|0.00|0.08|N|O|1998-05-17|1998-05-09|1998-06-07|DELIVER IN PERSON|TRUCK| regular, pending reques +23971|742|43|1|12|19712.88|0.10|0.05|A|F|1995-03-07|1995-02-17|1995-03-21|COLLECT COD|AIR| furiously around the blith +23971|1725|26|2|22|35787.84|0.08|0.07|R|F|1995-02-10|1995-02-11|1995-03-04|COLLECT COD|MAIL|ost about the thinly ironic foxes. +23972|210|11|1|29|32196.09|0.07|0.02|R|F|1993-10-26|1993-10-20|1993-11-20|DELIVER IN PERSON|AIR|c instructions nag about the foxes. iron +23972|1959|92|2|26|48384.70|0.09|0.01|R|F|1993-10-04|1993-10-15|1993-10-22|DELIVER IN PERSON|TRUCK|ts according to +23972|773|38|3|7|11716.39|0.01|0.08|A|F|1993-08-27|1993-10-03|1993-09-12|NONE|TRUCK|nt, express frets doubt furiously carefully +23972|1724|51|4|44|71531.68|0.00|0.06|R|F|1993-10-14|1993-09-18|1993-11-11|NONE|AIR| final courts cajole furiously silent asym +23973|715|16|1|31|50087.01|0.06|0.03|N|O|1996-09-08|1996-10-01|1996-09-10|TAKE BACK RETURN|FOB|ckages. final requests haggle furious +23973|749|14|2|32|52791.68|0.02|0.03|N|O|1996-08-20|1996-08-22|1996-09-15|NONE|RAIL|ial requests ought to b +23973|531|92|3|21|30062.13|0.03|0.07|N|O|1996-09-08|1996-09-02|1996-09-27|DELIVER IN PERSON|TRUCK|efully according to the ironic requests +23974|808|8|1|20|34176.00|0.03|0.03|A|F|1992-10-05|1992-09-18|1992-10-25|DELIVER IN PERSON|FOB|quickly regular foxes. furiously final p +23974|891|58|2|45|80635.05|0.00|0.00|A|F|1992-07-27|1992-10-18|1992-08-20|COLLECT COD|SHIP|ctions wake +23974|1361|76|3|50|63118.00|0.05|0.04|A|F|1992-10-28|1992-09-17|1992-10-30|COLLECT COD|AIR|g above the ironic, final packages. furious +23975|1787|30|1|12|20265.36|0.09|0.07|N|O|1997-04-07|1997-04-26|1997-05-04|TAKE BACK RETURN|SHIP|ly express instructions. special, iron +23975|111|38|2|10|10111.10|0.02|0.04|N|O|1997-04-14|1997-05-20|1997-04-24|TAKE BACK RETURN|AIR| accounts are carefully in place of the qui +24000|109|36|1|2|2018.20|0.07|0.07|N|O|1995-07-29|1995-08-12|1995-08-11|NONE|FOB|tions breach blithely accor +24001|1252|27|1|20|23065.00|0.07|0.05|N|O|1997-06-01|1997-07-03|1997-06-28|TAKE BACK RETURN|RAIL| sleep carefully +24002|1678|79|1|7|11057.69|0.07|0.04|N|O|1996-11-24|1997-01-19|1996-12-11|COLLECT COD|FOB| the furiously even ideas. accounts +24002|934|37|2|30|55047.90|0.07|0.08|N|O|1997-01-13|1996-12-31|1997-01-30|TAKE BACK RETURN|MAIL|warthogs haggle slyly. regular gro +24002|137|64|3|43|44596.59|0.03|0.07|N|O|1997-02-13|1997-01-17|1997-03-14|DELIVER IN PERSON|SHIP|s integrate after the express deposits. b +24003|1449|67|1|21|28359.24|0.04|0.05|R|F|1995-01-23|1994-12-04|1995-02-19|DELIVER IN PERSON|AIR| deposits use quickly r +24003|651|83|2|21|32584.65|0.05|0.07|R|F|1995-01-23|1994-12-01|1995-02-02|NONE|AIR|ular packages shall have to sleep among +24003|1291|92|3|22|26230.38|0.00|0.07|R|F|1995-02-19|1994-12-25|1995-02-26|TAKE BACK RETURN|AIR|al Tiresias- +24003|346|75|4|20|24926.80|0.08|0.08|R|F|1995-02-15|1994-12-10|1995-03-12|TAKE BACK RETURN|REG AIR|ag permanently across the ir +24003|443|31|5|23|30899.12|0.00|0.00|A|F|1995-01-16|1995-01-14|1995-02-10|NONE|FOB|oost about the final, ironic th +24003|1370|9|6|13|16527.81|0.06|0.04|R|F|1994-12-25|1994-12-07|1995-01-15|TAKE BACK RETURN|SHIP|nts was furiously regular instr +24004|1130|67|1|45|46400.85|0.05|0.07|R|F|1992-07-17|1992-08-11|1992-07-31|TAKE BACK RETURN|RAIL|s lose. silent pinto beans so +24004|783|16|2|48|80821.44|0.04|0.06|R|F|1992-08-17|1992-09-09|1992-09-10|COLLECT COD|TRUCK|uests. bold accounts detect +24004|1533|54|3|21|30125.13|0.03|0.06|A|F|1992-07-05|1992-08-12|1992-08-04|DELIVER IN PERSON|REG AIR|d accounts ser +24004|1206|44|4|48|53145.60|0.03|0.04|R|F|1992-09-03|1992-07-16|1992-09-21|COLLECT COD|FOB|carefully permanent pinto beans. bold dug +24004|785|18|5|11|18543.58|0.06|0.05|A|F|1992-08-22|1992-09-11|1992-09-16|NONE|SHIP|s impress a +24004|1031|32|6|34|31689.02|0.07|0.02|A|F|1992-09-26|1992-07-25|1992-10-20|COLLECT COD|FOB|y special requests haggle caref +24005|327|12|1|17|20864.44|0.10|0.05|A|F|1992-03-05|1992-04-09|1992-04-02|COLLECT COD|SHIP|tructions x-ra +24005|1972|73|2|46|86202.62|0.04|0.08|R|F|1992-02-07|1992-02-26|1992-02-18|NONE|SHIP|quickly sly deposits abo +24005|1061|32|3|42|40406.52|0.09|0.04|A|F|1992-01-23|1992-02-19|1992-02-04|TAKE BACK RETURN|MAIL|usly according to the slyly ir +24006|40|91|1|22|20680.88|0.05|0.06|N|O|1997-01-14|1996-12-03|1997-01-27|DELIVER IN PERSON|SHIP|thely slyly regula +24006|1423|41|2|41|54301.22|0.03|0.01|N|O|1996-12-18|1997-01-10|1996-12-21|DELIVER IN PERSON|FOB|fully across the careful +24006|1137|46|3|46|47753.98|0.08|0.04|N|O|1997-01-01|1996-11-16|1997-01-20|NONE|FOB|sts. packages haggle fu +24006|733|34|4|30|49011.90|0.05|0.01|N|O|1996-12-04|1996-11-19|1996-12-26|COLLECT COD|MAIL|ic foxes after th +24006|758|59|5|5|8293.75|0.08|0.05|N|O|1997-02-09|1996-12-02|1997-02-28|TAKE BACK RETURN|MAIL|silent packages along the furiously s +24006|206|34|6|2|2212.40|0.04|0.01|N|O|1997-01-10|1996-12-15|1997-02-02|TAKE BACK RETURN|REG AIR|s. quickly final accounts use blithely +24006|1599|100|7|20|30011.80|0.09|0.07|N|O|1996-11-05|1997-01-01|1996-12-03|COLLECT COD|REG AIR|its cajole furiously c +24007|1398|13|1|15|19490.85|0.09|0.03|R|F|1993-11-27|1993-09-28|1993-11-30|TAKE BACK RETURN|RAIL|gular platelets. slyly +24007|1490|69|2|7|9740.43|0.00|0.07|A|F|1993-10-03|1993-11-19|1993-10-15|DELIVER IN PERSON|TRUCK|ake. accounts cajole at the ideas. foxes +24007|729|94|3|10|16297.20|0.01|0.04|R|F|1993-10-20|1993-11-07|1993-10-26|TAKE BACK RETURN|MAIL|dogged accounts +24007|1265|40|4|14|16327.64|0.03|0.08|R|F|1993-09-04|1993-11-22|1993-09-18|NONE|RAIL|ily after t +24007|238|93|5|21|23902.83|0.05|0.06|R|F|1993-10-30|1993-10-10|1993-11-04|NONE|FOB|ing accounts sleep r +24007|1339|78|6|47|58295.51|0.05|0.00|A|F|1993-09-18|1993-10-30|1993-09-26|TAKE BACK RETURN|FOB|ording to the never regular packages. +24007|1397|12|7|20|25967.80|0.06|0.00|A|F|1993-11-23|1993-11-03|1993-12-20|DELIVER IN PERSON|AIR|usual ideas. quickly even +24032|975|10|1|6|11255.82|0.09|0.06|N|O|1997-09-07|1997-10-07|1997-09-27|NONE|SHIP|heodolites haggle +24032|709|6|2|12|19316.40|0.09|0.08|N|O|1997-12-07|1997-10-12|1997-12-26|DELIVER IN PERSON|RAIL|unts alongside of the brave depen +24032|228|10|3|12|13538.64|0.08|0.06|N|O|1997-10-09|1997-10-22|1997-11-07|COLLECT COD|REG AIR|re carefully dependencies. +24032|1215|27|4|48|53578.08|0.05|0.06|N|O|1997-10-01|1997-10-04|1997-10-05|COLLECT COD|TRUCK| dependencies sublate regu +24033|1759|86|1|48|79716.00|0.06|0.02|R|F|1995-01-22|1995-02-12|1995-02-13|COLLECT COD|TRUCK| instead of the asymptotes cajole slyly +24034|1645|46|1|41|63412.24|0.00|0.04|N|O|1997-03-03|1997-02-20|1997-04-01|NONE|RAIL|refully pending i +24034|746|43|2|5|8233.70|0.09|0.07|N|O|1997-04-06|1997-03-22|1997-04-23|NONE|TRUCK|e quickly furious pinto beans. final +24034|639|71|3|17|26173.71|0.02|0.08|N|O|1997-02-22|1997-02-08|1997-03-01|NONE|FOB| cajole quickly. busily ironic instructio +24034|1672|96|4|35|55078.45|0.05|0.00|N|O|1997-04-22|1997-03-18|1997-04-30|TAKE BACK RETURN|MAIL|usly blithely special foxes. +24034|1598|79|5|1|1499.59|0.00|0.03|N|O|1997-04-08|1997-02-02|1997-04-16|TAKE BACK RETURN|FOB|gular grouches. dependencies sleep f +24034|1436|54|6|4|5349.72|0.02|0.04|N|O|1997-02-22|1997-03-23|1997-03-06|COLLECT COD|TRUCK|y. quickly final +24034|1103|12|7|29|29118.90|0.09|0.06|N|O|1997-01-22|1997-03-09|1997-01-26|COLLECT COD|SHIP|g to the slyly regular d +24035|1705|32|1|18|28920.60|0.04|0.02|R|F|1995-04-07|1995-05-01|1995-04-15|COLLECT COD|RAIL|iously after the even, final a +24035|900|67|2|21|37818.90|0.04|0.00|R|F|1995-05-19|1995-04-30|1995-06-08|TAKE BACK RETURN|MAIL|lly against the furiously ironic packag +24035|1598|99|3|8|11996.72|0.01|0.05|A|F|1995-04-17|1995-05-30|1995-04-28|DELIVER IN PERSON|MAIL|quickly special sauternes boost +24035|535|26|4|39|55985.67|0.07|0.00|N|F|1995-06-16|1995-06-04|1995-06-20|DELIVER IN PERSON|SHIP|uests. ironic instructions are q +24035|647|48|5|10|15476.40|0.09|0.04|N|O|1995-07-11|1995-05-26|1995-07-16|TAKE BACK RETURN|AIR|sits upon the requests wake quick +24036|1572|73|1|30|44207.10|0.09|0.07|N|O|1995-07-05|1995-07-21|1995-07-31|DELIVER IN PERSON|TRUCK|! deposits alon +24036|680|74|2|3|4742.04|0.08|0.08|N|O|1995-07-15|1995-07-29|1995-07-18|NONE|MAIL|y special accounts boost blithely finally +24036|1092|28|3|50|49654.50|0.03|0.06|N|O|1995-06-24|1995-09-02|1995-07-08|TAKE BACK RETURN|AIR|s. express accounts +24036|544|75|4|43|62115.22|0.02|0.05|N|O|1995-08-10|1995-07-24|1995-08-18|COLLECT COD|AIR|riously against the quickly eve +24036|143|44|5|3|3129.42|0.05|0.07|N|O|1995-10-15|1995-08-29|1995-10-23|COLLECT COD|MAIL|ajole furiously furiously express notornis +24037|470|100|1|6|8222.82|0.03|0.06|N|O|1996-12-05|1996-11-09|1996-12-17|TAKE BACK RETURN|FOB|y bold accounts according t +24037|1216|28|2|4|4468.84|0.03|0.08|N|O|1996-12-13|1996-11-22|1996-12-15|NONE|RAIL|refully never silent courts. careful +24037|1800|85|3|4|6807.20|0.10|0.03|N|O|1996-10-04|1996-11-16|1996-10-29|COLLECT COD|REG AIR|platelets sleep blithely. ca +24037|1075|11|4|2|1952.14|0.05|0.05|N|O|1997-01-14|1996-12-27|1997-01-22|COLLECT COD|RAIL| furiously regular platelets snooze. p +24037|1036|7|5|5|4685.15|0.03|0.02|N|O|1996-10-31|1996-11-06|1996-11-14|DELIVER IN PERSON|RAIL|gainst the slyly reg +24037|176|29|6|9|9685.53|0.02|0.05|N|O|1996-10-09|1996-12-02|1996-10-19|TAKE BACK RETURN|AIR| sleep finally final account +24037|1497|76|7|36|50345.64|0.06|0.08|N|O|1996-12-07|1996-11-04|1996-12-22|TAKE BACK RETURN|AIR|to beans. never +24038|428|16|1|13|17269.46|0.04|0.01|N|O|1995-07-28|1995-09-13|1995-08-11|DELIVER IN PERSON|REG AIR|y along the slyly regular pack +24038|863|63|2|14|24694.04|0.02|0.00|N|O|1995-08-13|1995-09-08|1995-09-04|NONE|AIR|sleep slyly according to the slyly +24038|627|28|3|6|9165.72|0.02|0.04|N|O|1995-07-09|1995-08-29|1995-07-18|COLLECT COD|SHIP|sits sleep blithel +24038|314|71|4|13|15786.03|0.06|0.04|N|O|1995-08-13|1995-09-15|1995-08-21|TAKE BACK RETURN|TRUCK|e regular, even waters +24038|935|4|5|11|20195.23|0.08|0.01|N|O|1995-06-30|1995-08-17|1995-07-18|COLLECT COD|FOB|nts are fu +24038|1089|25|6|42|41583.36|0.09|0.03|N|O|1995-08-23|1995-08-17|1995-09-14|COLLECT COD|RAIL|usly even requests print carefully i +24039|723|24|1|42|68196.24|0.00|0.05|A|F|1992-10-17|1992-08-18|1992-11-06|TAKE BACK RETURN|AIR|h carefully ir +24039|20|71|2|3|2760.06|0.00|0.08|A|F|1992-08-16|1992-08-21|1992-09-07|COLLECT COD|REG AIR|tterns! ironic, pending re +24039|1842|43|3|26|45339.84|0.03|0.02|R|F|1992-08-04|1992-09-13|1992-08-06|TAKE BACK RETURN|MAIL| regular courts sleep blithel +24064|403|91|1|14|18247.60|0.03|0.06|A|F|1993-08-26|1993-09-03|1993-09-21|TAKE BACK RETURN|MAIL|bove the unusual +24064|732|97|2|43|70207.39|0.03|0.01|R|F|1993-10-12|1993-10-23|1993-10-27|TAKE BACK RETURN|SHIP| quickly unusual foxes. grouche +24064|1484|85|3|10|13854.80|0.04|0.03|A|F|1993-11-10|1993-08-27|1993-11-24|TAKE BACK RETURN|TRUCK|es cajole blithely. furiously bold req +24064|323|80|4|12|14679.84|0.01|0.05|R|F|1993-10-21|1993-10-23|1993-11-03|COLLECT COD|AIR|ly regular accounts. +24064|1051|57|5|36|34273.80|0.00|0.00|R|F|1993-10-03|1993-09-25|1993-10-11|DELIVER IN PERSON|MAIL|nent waters. instructions +24065|99|50|1|15|14986.35|0.05|0.00|N|O|1997-05-19|1997-04-23|1997-06-12|NONE|TRUCK|theodolites. ruthlessly even instructions +24065|1299|100|2|41|49211.89|0.02|0.02|N|O|1997-06-06|1997-05-23|1997-06-26|TAKE BACK RETURN|AIR|kly: regular frays cajole +24065|1418|97|3|16|21110.56|0.10|0.07|N|O|1997-05-24|1997-05-19|1997-06-12|NONE|MAIL|ously even accounts. instructions cajole +24065|19|20|4|31|28489.31|0.09|0.00|N|O|1997-07-04|1997-04-21|1997-07-08|DELIVER IN PERSON|RAIL|its sleep ironic p +24065|1093|29|5|42|41751.78|0.09|0.07|N|O|1997-04-09|1997-06-08|1997-04-19|TAKE BACK RETURN|REG AIR|final, ironic pinto beans. furiousl +24066|344|73|1|33|41063.22|0.03|0.06|A|F|1992-06-28|1992-06-08|1992-07-09|COLLECT COD|AIR| sleep carefully boldly final instruction +24066|1039|10|2|47|44181.41|0.07|0.01|A|F|1992-04-21|1992-06-18|1992-05-12|TAKE BACK RETURN|MAIL| regular, unusual foxes. furious +24066|1149|22|3|35|36754.90|0.07|0.07|R|F|1992-04-22|1992-06-01|1992-05-08|COLLECT COD|SHIP|refully bold grouches. ent +24066|85|86|4|44|43343.52|0.07|0.04|R|F|1992-04-28|1992-06-16|1992-04-29|TAKE BACK RETURN|FOB|refully fluffily regular instruct +24066|1022|93|5|22|20306.44|0.07|0.05|R|F|1992-05-27|1992-07-03|1992-06-05|NONE|SHIP|ake quickly. careful +24067|1110|47|1|41|41455.51|0.08|0.01|R|F|1992-11-15|1992-11-14|1992-11-22|TAKE BACK RETURN|AIR|he special, regular instructions. warthogs +24067|1675|58|2|45|70950.15|0.00|0.00|R|F|1992-10-25|1992-10-26|1992-11-08|COLLECT COD|SHIP|blithely ironic foxes thrash fluffi +24067|1544|65|3|15|21683.10|0.00|0.01|A|F|1992-12-05|1992-10-22|1992-12-22|DELIVER IN PERSON|FOB|beans among the f +24067|1936|37|4|24|44110.32|0.02|0.00|A|F|1992-09-20|1992-11-19|1992-10-13|TAKE BACK RETURN|SHIP|y pending asymptotes sleep +24067|83|84|5|23|22610.84|0.08|0.06|R|F|1992-09-18|1992-11-14|1992-09-22|TAKE BACK RETURN|FOB|g warthogs aff +24067|1879|23|6|11|19589.57|0.10|0.03|A|F|1992-09-18|1992-10-01|1992-09-19|NONE|MAIL|gedly special depos +24067|1575|56|7|24|35437.68|0.08|0.03|R|F|1992-10-19|1992-09-26|1992-11-15|TAKE BACK RETURN|SHIP|inos are fu +24068|647|48|1|44|68096.16|0.06|0.02|N|O|1998-05-17|1998-06-07|1998-05-24|DELIVER IN PERSON|MAIL|hely regular ins +24068|1884|14|2|29|51790.52|0.04|0.00|N|O|1998-05-22|1998-06-08|1998-06-21|DELIVER IN PERSON|TRUCK|fully slyly ruthless req +24068|277|32|3|13|15304.51|0.04|0.04|N|O|1998-05-20|1998-05-14|1998-06-08|COLLECT COD|REG AIR|e. quickly unusual asymptotes caj +24068|629|92|4|38|58125.56|0.01|0.05|N|O|1998-04-04|1998-05-11|1998-04-09|TAKE BACK RETURN|RAIL|le carefully along the careful +24068|198|51|5|35|38436.65|0.07|0.03|N|O|1998-07-05|1998-06-10|1998-07-17|NONE|REG AIR|yly carefully bold platelets. sheave +24068|571|62|6|14|20601.98|0.05|0.02|N|O|1998-06-29|1998-06-25|1998-07-19|COLLECT COD|MAIL|ickly final packages. carefully silent +24068|190|43|7|23|25074.37|0.09|0.07|N|O|1998-06-19|1998-06-13|1998-07-18|NONE|AIR|express hockey players. qui +24069|145|24|1|18|18812.52|0.10|0.01|A|F|1993-11-12|1993-09-04|1993-11-30|COLLECT COD|SHIP|blithely express deposits. final +24069|630|62|2|23|35204.49|0.08|0.01|R|F|1993-08-27|1993-09-24|1993-09-06|COLLECT COD|RAIL|ctions. qui +24070|1109|18|1|24|24242.40|0.01|0.08|A|F|1995-05-22|1995-04-26|1995-06-04|NONE|REG AIR|ts breach idle, e +24070|33|9|2|30|27990.90|0.03|0.06|A|F|1995-05-13|1995-04-27|1995-05-24|NONE|SHIP|ronic pinto be +24070|89|65|3|18|17803.44|0.07|0.00|A|F|1995-05-19|1995-05-04|1995-05-21|TAKE BACK RETURN|REG AIR|kages eat unusual fox +24070|1289|1|4|2|2380.56|0.08|0.04|A|F|1995-04-13|1995-05-22|1995-04-29|DELIVER IN PERSON|SHIP|its. even braids cajole qu +24070|426|85|5|7|9284.94|0.03|0.04|A|F|1995-04-16|1995-06-05|1995-04-24|COLLECT COD|MAIL|le among the slyly even foxes. regul +24070|84|60|6|22|21649.76|0.00|0.04|N|F|1995-05-24|1995-05-21|1995-06-18|NONE|FOB|oggedly regular theodolites. slyly silent +24070|161|14|7|4|4244.64|0.03|0.08|A|F|1995-04-07|1995-04-21|1995-04-28|DELIVER IN PERSON|TRUCK|leep evenly across the requests. +24071|1518|39|1|25|35487.75|0.06|0.04|R|F|1992-05-05|1992-05-24|1992-05-20|NONE|SHIP|s requests +24071|486|74|2|27|37434.96|0.05|0.06|A|F|1992-07-13|1992-06-27|1992-07-22|TAKE BACK RETURN|FOB|bold instructions integrate? bold asympto +24096|160|87|1|2|2120.32|0.02|0.04|R|F|1995-05-13|1995-05-29|1995-05-25|COLLECT COD|AIR|ully among the carefully regular packages. +24097|798|95|1|21|35674.59|0.06|0.04|R|F|1993-09-10|1993-09-08|1993-09-27|TAKE BACK RETURN|SHIP|slyly slyly even ideas. +24097|36|37|2|21|19656.63|0.08|0.04|A|F|1993-10-06|1993-09-13|1993-10-22|COLLECT COD|TRUCK| quick foxes. ironi +24097|22|48|3|14|12908.28|0.07|0.02|R|F|1993-11-24|1993-10-19|1993-12-06|DELIVER IN PERSON|TRUCK|egular deposits detec +24097|1839|69|4|38|66151.54|0.01|0.04|A|F|1993-11-06|1993-09-06|1993-11-12|COLLECT COD|REG AIR|eas need to nod. pa +24097|1945|46|5|30|55408.20|0.02|0.00|A|F|1993-10-21|1993-11-03|1993-10-31|COLLECT COD|MAIL|ular braids. special packa +24097|1202|77|6|2|2206.40|0.00|0.06|A|F|1993-11-23|1993-10-23|1993-12-15|COLLECT COD|FOB|e after the boldly unusual platel +24097|1148|85|7|7|7343.98|0.08|0.01|R|F|1993-11-05|1993-09-22|1993-12-01|COLLECT COD|FOB|ual accounts; slyly +24098|654|17|1|18|27983.70|0.05|0.04|A|F|1992-07-25|1992-06-27|1992-07-26|TAKE BACK RETURN|AIR|thely even +24098|973|74|2|14|26235.58|0.06|0.01|A|F|1992-05-18|1992-07-08|1992-06-13|COLLECT COD|AIR| regular, final pinto beans. unusual packag +24098|1059|65|3|35|33601.75|0.03|0.06|A|F|1992-07-11|1992-06-20|1992-08-09|COLLECT COD|SHIP|, even theod +24098|1644|86|4|29|44823.56|0.04|0.00|R|F|1992-06-21|1992-05-21|1992-07-20|COLLECT COD|RAIL|nts according to the blithely pending pla +24098|953|54|5|2|3707.90|0.02|0.04|R|F|1992-04-20|1992-07-11|1992-05-07|NONE|REG AIR|olites. express foxes are caref +24098|1081|17|6|32|31426.56|0.04|0.06|R|F|1992-08-17|1992-07-10|1992-09-02|NONE|AIR|uses alongside of the reques +24099|226|8|1|10|11262.20|0.03|0.00|N|O|1995-09-01|1995-07-10|1995-09-15|DELIVER IN PERSON|REG AIR|wake about the express, iron +24099|1666|90|2|23|36056.18|0.05|0.01|N|F|1995-06-17|1995-07-04|1995-07-10|TAKE BACK RETURN|TRUCK| express dugouts sleep blith +24099|1387|2|3|7|9018.66|0.09|0.01|N|F|1995-06-13|1995-07-18|1995-06-23|TAKE BACK RETURN|RAIL| quickly final foxes haggle sly +24099|1866|10|4|18|31821.48|0.08|0.06|N|F|1995-06-08|1995-07-09|1995-07-04|DELIVER IN PERSON|FOB|aggle: brave requests +24099|98|74|5|17|16967.53|0.06|0.03|N|O|1995-07-06|1995-08-04|1995-07-27|NONE|REG AIR|lphins. carefully special +24099|299|27|6|35|41975.15|0.04|0.05|N|F|1995-06-14|1995-08-18|1995-06-21|TAKE BACK RETURN|TRUCK|usly bold deposits wake quickly fi +24099|1459|60|7|29|39453.05|0.01|0.04|N|O|1995-09-13|1995-07-16|1995-10-07|NONE|AIR|boost after t +24100|1172|9|1|44|47219.48|0.03|0.02|N|O|1995-07-20|1995-06-22|1995-08-18|COLLECT COD|SHIP|ounts. regular packages +24101|23|24|1|17|15691.34|0.08|0.06|A|F|1992-05-22|1992-06-19|1992-05-24|DELIVER IN PERSON|MAIL|warhorses haggle unusual, un +24101|416|75|2|43|56605.63|0.00|0.04|A|F|1992-04-24|1992-07-07|1992-05-15|TAKE BACK RETURN|MAIL|al tithes affix. blit +24101|1370|85|3|35|44497.95|0.00|0.03|A|F|1992-08-01|1992-06-16|1992-08-03|TAKE BACK RETURN|MAIL|gular packages cajole above t +24102|611|12|1|26|39301.86|0.01|0.08|A|F|1994-01-07|1994-02-13|1994-01-23|COLLECT COD|RAIL| haggle. expr +24102|171|50|2|3|3213.51|0.04|0.02|A|F|1994-02-24|1994-01-14|1994-03-12|COLLECT COD|MAIL|nts detect permanently. sile +24102|914|83|3|35|63521.85|0.06|0.00|R|F|1994-02-20|1994-02-27|1994-03-16|TAKE BACK RETURN|FOB|ic, even asym +24102|1485|86|4|15|20797.20|0.05|0.02|R|F|1994-03-04|1994-03-01|1994-04-02|COLLECT COD|TRUCK|ickly even packages +24102|408|38|5|17|22242.80|0.08|0.00|A|F|1994-03-30|1994-01-21|1994-04-16|COLLECT COD|FOB|y special platelets sleep qui +24102|1763|90|6|14|23306.64|0.06|0.08|A|F|1993-12-13|1994-01-03|1993-12-29|COLLECT COD|FOB|ts-- packages use blithely after the u +24102|626|27|7|31|47325.22|0.00|0.02|R|F|1994-03-09|1994-01-19|1994-03-12|TAKE BACK RETURN|RAIL|the even packag +24103|148|49|1|37|38781.18|0.01|0.02|R|F|1995-01-06|1994-11-08|1995-01-20|DELIVER IN PERSON|TRUCK|y according t +24103|121|48|2|38|38802.56|0.00|0.01|A|F|1994-12-09|1994-10-17|1994-12-27|DELIVER IN PERSON|TRUCK|osits! even accounts cajole slyly abou +24103|384|85|3|34|43668.92|0.03|0.07|R|F|1994-12-29|1994-12-11|1995-01-17|TAKE BACK RETURN|MAIL|final, expres +24103|1430|70|4|47|62577.21|0.07|0.04|R|F|1994-11-20|1994-10-18|1994-12-12|DELIVER IN PERSON|AIR|sual escapades wake above the flu +24103|1681|64|5|40|63307.20|0.07|0.05|A|F|1994-09-30|1994-11-10|1994-10-02|TAKE BACK RETURN|MAIL| ironic accounts. deposits sleep +24103|1559|80|6|47|68645.85|0.07|0.00|A|F|1994-09-24|1994-11-12|1994-10-23|NONE|AIR| requests boost careful +24128|1637|79|1|22|33849.86|0.00|0.03|A|F|1993-12-21|1994-02-06|1993-12-29|NONE|MAIL|s above the slyly even asymptotes +24128|413|14|2|42|55163.22|0.10|0.06|R|F|1993-12-18|1994-01-29|1994-01-15|DELIVER IN PERSON|SHIP|osits haggle. furiously special dependencie +24128|623|17|3|16|24377.92|0.00|0.04|R|F|1994-03-06|1994-01-02|1994-03-23|COLLECT COD|MAIL|s. silent p +24129|1310|25|1|18|21803.58|0.04|0.05|N|O|1995-07-13|1995-10-04|1995-07-16|DELIVER IN PERSON|RAIL|tructions. carefully special ac +24130|1359|74|1|20|25207.00|0.03|0.00|N|O|1995-11-09|1995-08-16|1995-11-30|DELIVER IN PERSON|REG AIR|ns boost. furious +24130|1294|32|2|33|39444.57|0.03|0.04|N|O|1995-08-04|1995-09-26|1995-08-09|NONE|REG AIR|xpress dinos. +24130|1555|36|3|40|58262.00|0.10|0.01|N|O|1995-08-30|1995-10-08|1995-09-07|COLLECT COD|TRUCK|ironic pinto +24130|638|1|4|29|44620.27|0.02|0.00|N|O|1995-11-01|1995-08-26|1995-11-28|DELIVER IN PERSON|TRUCK|its. unusual, ironic r +24131|817|51|1|30|51534.30|0.08|0.08|N|O|1996-07-13|1996-09-08|1996-07-27|COLLECT COD|FOB|courts. quickly final ideas integ +24131|524|15|2|39|55556.28|0.05|0.01|N|O|1996-09-24|1996-08-09|1996-10-03|NONE|TRUCK|ounts. blithely even ideas +24132|507|38|1|15|21112.50|0.08|0.07|R|F|1994-10-23|1994-08-19|1994-11-05|NONE|FOB|ptotes haggle. furiously even +24132|1746|31|2|21|34602.54|0.00|0.01|R|F|1994-08-05|1994-08-22|1994-09-02|COLLECT COD|AIR|ut the slyly ruthless dependencies. stea +24132|1746|89|3|33|54375.42|0.09|0.08|A|F|1994-09-16|1994-09-12|1994-09-26|TAKE BACK RETURN|FOB| dependenci +24132|821|22|4|11|18940.02|0.00|0.04|A|F|1994-08-21|1994-09-08|1994-09-03|DELIVER IN PERSON|RAIL|ites. regular platelets are carefully nev +24132|389|18|5|8|10315.04|0.03|0.04|A|F|1994-08-14|1994-08-30|1994-08-16|COLLECT COD|RAIL|al asymptotes. unusual ideas believe sil +24132|304|5|6|13|15655.90|0.01|0.04|A|F|1994-07-17|1994-08-06|1994-07-30|TAKE BACK RETURN|FOB|pendencies across the regular, final +24132|39|40|7|47|44134.41|0.07|0.07|R|F|1994-10-31|1994-09-28|1994-11-05|COLLECT COD|TRUCK|ts nag blithely above the fl +24133|1592|13|1|3|4480.77|0.01|0.02|N|O|1996-09-21|1996-09-11|1996-10-19|NONE|AIR|e final, pendin +24133|1295|96|2|35|41870.15|0.00|0.01|N|O|1996-09-22|1996-08-17|1996-09-24|DELIVER IN PERSON|SHIP|ic, ironic instructions sleep fur +24133|1496|14|3|5|6987.45|0.03|0.05|N|O|1996-09-20|1996-09-13|1996-10-11|COLLECT COD|REG AIR|structions haggl +24133|1327|28|4|25|30708.00|0.05|0.06|N|O|1996-08-15|1996-08-16|1996-09-06|COLLECT COD|RAIL|ckly across the furiously +24134|404|92|1|14|18261.60|0.10|0.04|N|O|1998-07-12|1998-08-06|1998-07-26|NONE|SHIP| along the +24134|762|27|2|33|54871.08|0.08|0.04|N|O|1998-05-23|1998-06-22|1998-06-11|NONE|FOB|ress theodolites: +24134|110|37|3|18|18181.98|0.07|0.04|N|O|1998-07-18|1998-08-16|1998-07-19|DELIVER IN PERSON|TRUCK|egular packages. bl +24134|600|61|4|10|15006.00|0.05|0.03|N|O|1998-07-15|1998-07-08|1998-07-19|DELIVER IN PERSON|RAIL|bt slyly around the acco +24135|1201|2|1|31|34168.20|0.04|0.01|A|F|1993-05-09|1993-04-03|1993-05-15|NONE|REG AIR| the instructions. furiously regular dolphi +24135|987|88|2|9|16991.82|0.05|0.04|A|F|1993-04-29|1993-04-20|1993-05-19|DELIVER IN PERSON|REG AIR|s across the furiously e +24135|681|13|3|34|53777.12|0.02|0.05|A|F|1993-05-06|1993-04-19|1993-05-28|DELIVER IN PERSON|FOB|ing excuses affix +24135|551|12|4|32|46449.60|0.05|0.01|R|F|1993-01-28|1993-02-24|1993-02-02|DELIVER IN PERSON|FOB|ccording to the fur +24135|1146|47|5|43|45027.02|0.06|0.03|A|F|1993-01-25|1993-04-04|1993-02-09|NONE|RAIL|mold slyly: idea +24160|1209|21|1|35|38857.00|0.00|0.05|A|F|1995-03-26|1995-04-22|1995-03-27|NONE|SHIP|e slyly about the a +24160|126|27|2|18|18470.16|0.06|0.04|A|F|1995-03-20|1995-03-25|1995-04-10|COLLECT COD|MAIL| even packages play furiou +24161|1851|81|1|41|71866.85|0.07|0.00|R|F|1994-09-23|1994-10-22|1994-09-26|TAKE BACK RETURN|MAIL|. regular dependencies +24162|719|84|1|29|46971.59|0.00|0.06|R|F|1994-09-21|1994-10-20|1994-09-30|COLLECT COD|AIR|! express, final accoun +24162|1456|35|2|49|66515.05|0.02|0.06|A|F|1994-09-26|1994-10-31|1994-10-14|TAKE BACK RETURN|SHIP|carefully exp +24162|411|12|3|48|62947.68|0.04|0.05|R|F|1994-11-30|1994-11-13|1994-12-27|TAKE BACK RETURN|RAIL|ests. slyly pendin +24162|1397|98|4|42|54532.38|0.10|0.04|R|F|1994-10-28|1994-11-10|1994-11-11|NONE|SHIP|nts. pinto beans nag blithely even +24162|537|28|5|17|24438.01|0.01|0.04|R|F|1994-11-04|1994-09-24|1994-11-07|TAKE BACK RETURN|RAIL|es need to cajole quickly +24162|815|49|6|28|48042.68|0.04|0.05|A|F|1994-09-08|1994-10-01|1994-09-16|TAKE BACK RETURN|MAIL|ly furiously regular ideas. ironic, +24162|741|6|7|28|45968.72|0.06|0.07|R|F|1994-08-27|1994-09-24|1994-09-02|NONE|TRUCK|ic accounts +24163|1774|1|1|34|56976.18|0.05|0.02|N|O|1998-06-24|1998-05-21|1998-07-14|DELIVER IN PERSON|AIR|special, fin +24163|1153|54|2|33|34786.95|0.03|0.05|N|O|1998-06-05|1998-06-16|1998-06-22|DELIVER IN PERSON|SHIP|nic accounts +24163|1616|40|3|13|19728.93|0.04|0.04|N|O|1998-04-21|1998-06-03|1998-05-18|COLLECT COD|RAIL|nding acco +24163|1505|46|4|9|12658.50|0.10|0.05|N|O|1998-06-20|1998-04-23|1998-07-18|NONE|FOB|e furiously pending deposits. pa +24163|1520|1|5|5|7107.60|0.07|0.07|N|O|1998-06-21|1998-05-16|1998-07-04|NONE|RAIL|efully express instructions. c +24163|1325|2|6|34|41694.88|0.08|0.00|N|O|1998-05-08|1998-05-24|1998-05-12|TAKE BACK RETURN|AIR| players. blithely ironic packages serve +24163|871|71|7|9|15946.83|0.01|0.04|N|O|1998-03-28|1998-05-20|1998-04-16|COLLECT COD|RAIL|arefully unusual platelets hagg +24164|107|86|1|32|32227.20|0.07|0.02|N|O|1998-08-23|1998-08-06|1998-08-24|COLLECT COD|FOB|somas. blithely final packages x-ray. ev +24164|695|58|2|2|3191.38|0.10|0.00|N|O|1998-09-10|1998-07-15|1998-09-23|TAKE BACK RETURN|MAIL|uctions. furiously +24164|544|35|3|38|54892.52|0.00|0.00|N|O|1998-08-23|1998-08-04|1998-08-31|DELIVER IN PERSON|REG AIR| dependencies. fluffily +24164|1581|82|4|45|66716.10|0.04|0.05|N|O|1998-06-19|1998-08-11|1998-07-16|DELIVER IN PERSON|FOB|ular accounts. special +24164|258|86|5|11|12740.75|0.06|0.01|N|O|1998-07-03|1998-08-18|1998-07-06|TAKE BACK RETURN|FOB|need to nag furiously caref +24164|1707|50|6|19|30565.30|0.04|0.05|N|O|1998-06-09|1998-08-07|1998-06-18|NONE|SHIP| foxes along the slyly final accounts dete +24165|371|100|1|7|8899.59|0.05|0.02|R|F|1995-03-15|1995-01-22|1995-03-28|DELIVER IN PERSON|AIR| the unusual request +24165|642|5|2|34|52449.76|0.03|0.00|A|F|1995-01-01|1995-01-23|1995-01-08|TAKE BACK RETURN|TRUCK|ites wake blithely brave +24165|1939|40|3|49|90205.57|0.03|0.01|A|F|1995-03-11|1995-02-24|1995-03-27|TAKE BACK RETURN|TRUCK|courts. busily pending theod +24166|368|69|1|39|49466.04|0.05|0.08|A|F|1992-10-14|1992-09-28|1992-10-25|DELIVER IN PERSON|MAIL|jole. ironic, regula +24166|1928|17|2|44|80516.48|0.10|0.06|A|F|1992-11-09|1992-09-23|1992-12-03|NONE|FOB|nto beans. unusual packages among the expre +24167|152|5|1|32|33668.80|0.10|0.07|A|F|1992-04-09|1992-03-20|1992-05-01|TAKE BACK RETURN|RAIL|lites are slyly +24167|711|12|2|23|37069.33|0.10|0.08|R|F|1992-03-05|1992-03-23|1992-03-19|DELIVER IN PERSON|MAIL|ng requests. escapades +24167|811|12|3|3|5135.43|0.03|0.00|R|F|1992-02-17|1992-03-15|1992-03-13|NONE|AIR|es. slyly final forges do +24167|1040|76|4|21|19761.84|0.08|0.01|R|F|1992-02-07|1992-02-21|1992-02-26|TAKE BACK RETURN|TRUCK| regular package +24167|636|99|5|32|49172.16|0.05|0.07|R|F|1992-05-01|1992-03-02|1992-05-17|COLLECT COD|AIR|snooze slyly. slyly expr +24192|782|79|1|25|42069.50|0.01|0.03|N|O|1998-04-15|1998-05-23|1998-04-29|NONE|RAIL|lithely bold ideas. regul +24192|1891|21|2|25|44822.25|0.01|0.03|N|O|1998-03-30|1998-04-18|1998-04-23|COLLECT COD|REG AIR|s. furiously regular court +24192|1003|74|3|36|32544.00|0.02|0.04|N|O|1998-04-30|1998-04-27|1998-05-06|DELIVER IN PERSON|MAIL|ons. bravely final deposits haggle steal +24192|704|5|4|28|44931.60|0.02|0.07|N|O|1998-06-25|1998-04-18|1998-07-14|NONE|RAIL| realms sleep carefully. quickly i +24192|572|73|5|34|50067.38|0.01|0.01|N|O|1998-05-28|1998-05-09|1998-06-01|COLLECT COD|AIR|jole blithely. sl +24192|1585|86|6|32|47570.56|0.01|0.02|N|O|1998-05-08|1998-05-31|1998-06-02|COLLECT COD|SHIP|ar ideas sleep furiously a +24193|972|75|1|46|86156.62|0.03|0.02|R|F|1994-06-02|1994-05-04|1994-06-08|DELIVER IN PERSON|AIR| quickly along the expres +24193|762|59|2|15|24941.40|0.01|0.07|A|F|1994-07-04|1994-05-25|1994-08-01|NONE|REG AIR| theodolit +24193|650|51|3|25|38766.25|0.03|0.02|A|F|1994-05-23|1994-05-31|1994-06-01|TAKE BACK RETURN|SHIP|tions use busily special deposits. furious +24193|1487|88|4|18|24992.64|0.09|0.03|R|F|1994-04-21|1994-06-03|1994-05-19|DELIVER IN PERSON|REG AIR|unusual packages. special hockey pl +24193|1739|82|5|7|11485.11|0.09|0.03|R|F|1994-07-10|1994-05-13|1994-07-27|NONE|AIR| the furiously ironic ideas are caref +24193|940|41|6|26|47864.44|0.02|0.04|R|F|1994-05-31|1994-05-09|1994-06-26|TAKE BACK RETURN|REG AIR|p furiously alongside of the finall +24193|655|49|7|41|63781.65|0.02|0.07|R|F|1994-04-01|1994-06-02|1994-04-25|TAKE BACK RETURN|MAIL|carefully. +24194|1123|96|1|4|4096.48|0.08|0.08|N|O|1996-01-03|1995-12-24|1996-01-05|DELIVER IN PERSON|FOB|slyly excuse +24195|1862|92|1|15|26457.90|0.03|0.06|N|O|1996-12-17|1996-12-04|1996-12-23|COLLECT COD|TRUCK|ages haggle quickly. i +24195|82|33|2|49|48121.92|0.08|0.03|N|O|1996-10-29|1996-11-03|1996-10-31|DELIVER IN PERSON|MAIL|press foxes haggle slyly. slyl +24195|1969|58|3|17|31806.32|0.01|0.00|N|O|1996-12-20|1996-12-05|1997-01-18|TAKE BACK RETURN|MAIL|structions. deposits haggle fu +24195|1689|31|4|38|60445.84|0.09|0.03|N|O|1996-12-27|1996-11-05|1997-01-11|TAKE BACK RETURN|MAIL|. accounts are +24195|294|22|5|33|39411.57|0.05|0.01|N|O|1996-09-28|1996-10-26|1996-10-04|COLLECT COD|TRUCK|d among the pending Tiresias. car +24196|1105|6|1|14|14085.40|0.02|0.08|R|F|1993-09-05|1993-09-04|1993-09-28|COLLECT COD|REG AIR|ily about the final d +24196|1909|98|2|18|32596.20|0.03|0.01|R|F|1993-09-04|1993-08-31|1993-09-23|TAKE BACK RETURN|FOB|. carefully special pain +24196|902|5|3|3|5408.70|0.07|0.05|A|F|1993-10-25|1993-09-14|1993-11-20|TAKE BACK RETURN|RAIL|ns. blithely regular instructions sl +24196|1664|65|4|37|57929.42|0.06|0.04|R|F|1993-11-28|1993-10-29|1993-12-20|COLLECT COD|MAIL|onic, pending packages. blithely expr +24197|348|5|1|3|3745.02|0.02|0.06|R|F|1993-03-03|1993-03-16|1993-03-11|TAKE BACK RETURN|MAIL| carefully +24197|1030|1|2|1|931.03|0.05|0.07|A|F|1993-03-12|1993-03-16|1993-03-28|NONE|AIR|y against the slyly even foxes. +24197|371|28|3|4|5085.48|0.02|0.02|A|F|1993-04-21|1993-03-20|1993-05-14|NONE|FOB| fluffily acros +24197|339|24|4|18|22307.94|0.09|0.08|A|F|1993-03-06|1993-05-04|1993-03-30|NONE|AIR|sits are ironic courts. slyly i +24197|599|60|5|50|74979.50|0.01|0.07|A|F|1993-05-18|1993-03-29|1993-05-23|NONE|AIR|wake slyly alongside of the bold, regular +24197|1259|71|6|11|12762.75|0.01|0.07|R|F|1993-03-07|1993-03-20|1993-04-05|NONE|RAIL|ithely special instructions dete +24197|634|66|7|31|47573.53|0.07|0.00|R|F|1993-04-13|1993-04-17|1993-05-11|COLLECT COD|MAIL|yly furiously spe +24198|1168|41|1|16|17106.56|0.02|0.07|R|F|1995-02-18|1995-03-30|1995-03-20|NONE|TRUCK|s nag fluff +24198|521|22|2|37|52596.24|0.00|0.08|A|F|1995-04-23|1995-04-20|1995-05-01|NONE|AIR| accounts dazzle quickly after +24198|650|51|3|22|34114.30|0.01|0.01|R|F|1995-02-25|1995-04-04|1995-03-20|DELIVER IN PERSON|AIR|ar courts cajole slyly after +24198|86|37|4|16|15777.28|0.01|0.04|R|F|1995-04-19|1995-03-21|1995-05-08|NONE|FOB|ress packages. blithely final e +24198|1400|15|5|37|48151.80|0.10|0.08|R|F|1995-03-19|1995-04-09|1995-04-16|COLLECT COD|SHIP|ate quickly. careful +24198|942|77|6|50|92147.00|0.05|0.02|A|F|1995-04-23|1995-04-03|1995-05-02|DELIVER IN PERSON|TRUCK|ans sleep blithely. fluffily bold ideas ca +24199|884|85|1|37|66040.56|0.03|0.00|R|F|1994-09-10|1994-08-30|1994-09-22|DELIVER IN PERSON|FOB|yly regular accounts poach abov +24224|1644|68|1|5|7728.20|0.01|0.07|N|O|1997-12-25|1997-12-02|1997-12-31|COLLECT COD|REG AIR|ar requests. carefully ironic ideas nag +24224|1506|47|2|38|53485.00|0.04|0.00|N|O|1997-10-19|1997-12-05|1997-10-25|TAKE BACK RETURN|SHIP|ly pending asymptotes. +24224|847|47|3|41|71661.44|0.09|0.03|N|O|1997-10-28|1997-10-22|1997-11-23|COLLECT COD|FOB|tes. blithely express packages sno +24225|1857|58|1|39|68595.15|0.08|0.07|N|O|1996-08-12|1996-06-02|1996-09-06|COLLECT COD|SHIP| regular deposits. bold packages use blit +24226|1587|68|1|45|66986.10|0.10|0.00|N|O|1997-01-27|1997-03-21|1997-01-29|DELIVER IN PERSON|REG AIR|uches cajole furiously careful +24226|1097|68|2|31|30940.79|0.01|0.02|N|O|1997-02-18|1997-03-09|1997-03-05|TAKE BACK RETURN|SHIP|ickly. slyl +24226|1977|78|3|21|39458.37|0.09|0.06|N|O|1997-03-13|1997-03-03|1997-04-07|TAKE BACK RETURN|SHIP|round the c +24226|419|78|4|31|40901.71|0.00|0.02|N|O|1997-04-13|1997-04-04|1997-05-13|TAKE BACK RETURN|RAIL| against the ideas. furiously +24226|1044|15|5|5|4725.20|0.06|0.04|N|O|1997-04-27|1997-03-14|1997-05-08|COLLECT COD|AIR|ly even acc +24227|1272|47|1|46|53970.42|0.02|0.07|R|F|1993-12-04|1993-10-10|1993-12-29|TAKE BACK RETURN|FOB|n packages a +24227|951|86|2|3|5555.85|0.06|0.04|A|F|1993-12-15|1993-11-12|1993-12-25|COLLECT COD|SHIP|accounts. asymptotes sleep blithely ev +24227|123|2|3|32|32739.84|0.02|0.05|A|F|1993-10-18|1993-11-02|1993-10-28|TAKE BACK RETURN|REG AIR| fluffily special patterns. regular r +24227|352|81|4|25|31308.75|0.06|0.01|A|F|1993-09-16|1993-11-08|1993-10-05|DELIVER IN PERSON|RAIL|nic pinto beans-- silent accounts nag slyly +24228|1181|54|1|45|48698.10|0.05|0.05|R|F|1994-08-19|1994-08-19|1994-08-23|NONE|FOB| quickly express platelets. +24228|591|92|2|35|52205.65|0.02|0.02|A|F|1994-10-29|1994-09-12|1994-11-22|COLLECT COD|AIR|thely furious theodolites. +24229|1638|39|1|39|60045.57|0.05|0.03|N|O|1996-11-26|1996-10-23|1996-12-12|NONE|AIR|s. final, ironic in +24229|897|64|2|32|57532.48|0.05|0.08|N|O|1996-12-07|1996-10-24|1997-01-04|TAKE BACK RETURN|FOB|s: furiousl +24229|850|17|3|50|87542.50|0.07|0.07|N|O|1996-09-28|1996-11-21|1996-10-27|TAKE BACK RETURN|TRUCK|indle idly. req +24229|835|35|4|30|52074.90|0.05|0.02|N|O|1996-11-21|1996-10-13|1996-11-25|DELIVER IN PERSON|AIR|special pinto beans. pe +24229|340|69|5|17|21085.78|0.00|0.02|N|O|1996-10-19|1996-09-30|1996-11-03|DELIVER IN PERSON|TRUCK| dogged theodolites. furiously +24230|259|14|1|45|52166.25|0.03|0.03|N|O|1996-11-22|1996-12-17|1996-12-16|NONE|MAIL|hes. quickly unus +24230|905|40|2|19|34312.10|0.02|0.01|N|O|1996-11-01|1996-11-22|1996-11-24|DELIVER IN PERSON|REG AIR|dinos. quietly ironic ideas wake furiou +24230|1884|85|3|6|10715.28|0.05|0.01|N|O|1997-02-06|1996-12-21|1997-03-06|DELIVER IN PERSON|AIR|carefully bold deposits al +24230|1835|22|4|11|19105.13|0.07|0.04|N|O|1997-02-07|1996-12-29|1997-02-11|DELIVER IN PERSON|FOB|ges. slyly final requests +24230|1616|40|5|37|56151.57|0.05|0.01|N|O|1996-12-16|1996-11-25|1997-01-03|DELIVER IN PERSON|AIR| run carefully ironic asymptotes. furiously +24230|520|51|6|37|52559.24|0.09|0.08|N|O|1996-12-31|1996-12-19|1997-01-26|COLLECT COD|RAIL|y unusual pinto b +24231|1921|22|1|17|30989.64|0.08|0.04|A|F|1994-08-13|1994-10-18|1994-08-20|COLLECT COD|SHIP| even requests nag slyly about the +24231|1760|87|2|43|71455.68|0.10|0.02|R|F|1994-10-21|1994-09-28|1994-11-12|DELIVER IN PERSON|AIR| carefully idle packages +24231|537|38|3|33|47438.49|0.05|0.05|R|F|1994-09-23|1994-10-10|1994-10-04|DELIVER IN PERSON|TRUCK|beans. even packag +24231|415|74|4|38|49985.58|0.02|0.05|A|F|1994-11-29|1994-10-18|1994-12-08|NONE|SHIP|eans. foxes engage furiously bol +24231|1706|91|5|25|40192.50|0.07|0.05|A|F|1994-11-24|1994-09-24|1994-12-08|COLLECT COD|AIR|ual deposits +24231|1864|51|6|20|35317.20|0.08|0.04|R|F|1994-09-21|1994-09-17|1994-10-15|COLLECT COD|FOB|oubt. carefully regular requests use sile +24256|448|49|1|17|22923.48|0.03|0.04|N|O|1997-07-12|1997-05-27|1997-07-31|COLLECT COD|REG AIR|tes sleep quickly. blithely +24256|717|18|2|19|30736.49|0.02|0.02|N|O|1997-05-27|1997-06-06|1997-06-11|DELIVER IN PERSON|MAIL|e quickly across the carefully ironic a +24256|1033|69|3|10|9340.30|0.09|0.02|N|O|1997-07-15|1997-05-15|1997-08-10|TAKE BACK RETURN|SHIP|haggle slyly furiously even reque +24257|833|67|1|49|84957.67|0.03|0.02|A|F|1992-10-05|1992-10-27|1992-10-11|DELIVER IN PERSON|MAIL| carefully regular cour +24257|459|47|2|26|35345.70|0.10|0.05|R|F|1992-11-03|1992-09-11|1992-11-10|DELIVER IN PERSON|TRUCK|blithely final accounts. special th +24258|599|100|1|39|58484.01|0.03|0.06|N|O|1996-07-27|1996-06-19|1996-08-24|COLLECT COD|REG AIR|uriously unusual pinto beans. furiously +24258|685|17|2|36|57084.48|0.03|0.06|N|O|1996-07-07|1996-07-02|1996-07-08|DELIVER IN PERSON|MAIL|ccounts use furiously. slyly unusual reque +24258|1164|1|3|7|7456.12|0.10|0.07|N|O|1996-07-30|1996-07-12|1996-08-20|TAKE BACK RETURN|MAIL|ckages. busy, fina +24258|577|78|4|30|44327.10|0.08|0.02|N|O|1996-05-28|1996-07-06|1996-06-04|COLLECT COD|FOB|st. blithely even deposits doze +24258|93|19|5|36|35751.24|0.02|0.02|N|O|1996-06-30|1996-06-28|1996-07-12|TAKE BACK RETURN|MAIL|ironic packages. unusual p +24258|1608|91|6|50|75480.00|0.03|0.00|N|O|1996-07-04|1996-06-26|1996-07-22|NONE|SHIP|gle slyly along the +24258|543|4|7|46|66402.84|0.00|0.05|N|O|1996-06-09|1996-06-05|1996-06-30|TAKE BACK RETURN|AIR|s use across th +24259|947|16|1|32|59134.08|0.02|0.05|N|O|1996-09-19|1996-07-15|1996-09-24|TAKE BACK RETURN|SHIP|. even requests haggle furiously +24259|1054|60|2|21|20056.05|0.02|0.08|N|O|1996-07-01|1996-06-30|1996-07-20|TAKE BACK RETURN|REG AIR|usual foxes cajole carefully slyl +24259|1622|5|3|13|19807.06|0.01|0.06|N|O|1996-09-02|1996-07-16|1996-09-19|NONE|FOB|s affix slyly foxes. +24260|391|76|1|28|36158.92|0.00|0.03|R|F|1993-10-17|1993-12-11|1993-10-26|TAKE BACK RETURN|MAIL|ove the carefully f +24260|1678|20|2|39|61607.13|0.02|0.05|R|F|1994-01-26|1993-12-23|1994-02-06|NONE|MAIL|silent requests sleep final +24260|1193|30|3|32|35014.08|0.07|0.01|R|F|1993-12-31|1993-11-18|1994-01-06|COLLECT COD|REG AIR|packages. fluffily iro +24260|916|51|4|22|39972.02|0.09|0.03|A|F|1994-01-10|1993-12-23|1994-01-15|NONE|TRUCK|ies. silent deposits about the furious +24260|1695|19|5|14|22353.66|0.02|0.07|R|F|1993-12-06|1993-12-08|1993-12-08|TAKE BACK RETURN|AIR| the unusual excuses affix +24261|1410|89|1|18|23605.38|0.00|0.02|R|F|1992-10-06|1992-10-20|1992-10-13|TAKE BACK RETURN|TRUCK|nusual pinto beans. deposits +24262|196|23|1|18|19731.42|0.05|0.08|R|F|1994-04-02|1994-03-06|1994-05-02|COLLECT COD|TRUCK|ly along the furious +24262|145|98|2|2|2090.28|0.06|0.07|A|F|1994-03-12|1994-04-11|1994-04-07|TAKE BACK RETURN|AIR|l ideas haggle pending, special d +24262|870|71|3|19|33646.53|0.08|0.05|A|F|1994-04-20|1994-04-08|1994-05-20|NONE|MAIL|onically express excuses haggle fur +24262|256|57|4|39|45093.75|0.03|0.07|R|F|1994-04-18|1994-03-27|1994-04-28|DELIVER IN PERSON|FOB|affix against the furiously iro +24262|1197|34|5|42|46123.98|0.00|0.03|A|F|1994-05-24|1994-03-18|1994-06-17|NONE|TRUCK|to beans nag against the p +24263|1175|12|1|31|33361.27|0.07|0.04|A|F|1992-09-18|1992-11-12|1992-09-23|COLLECT COD|MAIL| have to affix. excus +24288|494|95|1|46|64146.54|0.08|0.00|A|F|1993-06-06|1993-05-06|1993-06-20|DELIVER IN PERSON|FOB|equests above the blithely regular request +24288|1931|76|2|14|25661.02|0.05|0.03|R|F|1993-03-17|1993-05-26|1993-03-24|TAKE BACK RETURN|REG AIR|cial packages thrash alon +24288|1554|55|3|19|27655.45|0.10|0.02|A|F|1993-04-09|1993-05-14|1993-04-29|COLLECT COD|RAIL| ironic platelet +24288|1849|50|4|22|38518.48|0.08|0.05|R|F|1993-03-29|1993-05-18|1993-04-17|TAKE BACK RETURN|MAIL|ously express requests wa +24289|226|27|1|28|31534.16|0.02|0.00|N|O|1997-10-21|1997-09-18|1997-11-05|COLLECT COD|AIR|es after the fluffil +24289|562|53|2|22|32176.32|0.00|0.08|N|O|1997-08-17|1997-08-14|1997-09-09|COLLECT COD|MAIL|c deposits do was among the ironically fi +24289|125|4|3|5|5125.60|0.08|0.04|N|O|1997-08-20|1997-09-07|1997-08-26|NONE|RAIL|ccounts. furiously even packages are q +24289|351|80|4|37|46299.95|0.10|0.05|N|O|1997-07-23|1997-09-06|1997-07-27|DELIVER IN PERSON|SHIP|ound the quickly darin +24290|269|97|1|40|46770.40|0.00|0.01|A|F|1992-03-05|1992-03-13|1992-04-02|COLLECT COD|TRUCK|integrate along the b +24290|1694|36|2|18|28722.42|0.02|0.06|A|F|1992-01-24|1992-03-21|1992-02-02|TAKE BACK RETURN|FOB|e express, ironic packa +24291|699|62|1|15|23995.35|0.10|0.06|A|F|1992-05-29|1992-06-28|1992-06-19|DELIVER IN PERSON|MAIL|he accounts. carefully idle instru +24291|213|14|2|6|6679.26|0.10|0.03|R|F|1992-06-08|1992-06-03|1992-06-26|NONE|FOB|ully special +24291|778|75|3|23|38611.71|0.07|0.06|R|F|1992-06-22|1992-06-06|1992-06-29|COLLECT COD|TRUCK|luffily final deposits u +24291|1055|26|4|42|40154.10|0.05|0.06|R|F|1992-07-28|1992-07-04|1992-08-25|DELIVER IN PERSON|TRUCK|ly brave packages nag about th +24291|1237|49|5|8|9105.84|0.07|0.04|R|F|1992-05-22|1992-07-10|1992-06-06|TAKE BACK RETURN|TRUCK|ve carefully; fin +24291|1043|79|6|20|18880.80|0.10|0.07|A|F|1992-06-15|1992-06-12|1992-07-03|TAKE BACK RETURN|RAIL| packages. slowly regular deposits integra +24291|334|63|7|43|53076.19|0.05|0.03|A|F|1992-08-18|1992-06-30|1992-09-14|TAKE BACK RETURN|REG AIR|fully regular instruction +24292|1812|99|1|19|32562.39|0.05|0.05|A|F|1994-06-24|1994-05-11|1994-07-09|TAKE BACK RETURN|AIR| quickly across t +24292|1534|75|2|42|60292.26|0.02|0.05|R|F|1994-06-21|1994-05-02|1994-06-24|DELIVER IN PERSON|AIR|as serve fu +24292|248|30|3|32|36743.68|0.01|0.03|R|F|1994-05-12|1994-05-27|1994-06-01|DELIVER IN PERSON|FOB|t courts. slyly brave ide +24292|1501|42|4|13|18232.50|0.05|0.03|A|F|1994-05-12|1994-05-10|1994-06-01|NONE|AIR|g quietly. even packages thra +24292|929|98|5|45|82346.40|0.00|0.05|A|F|1994-06-25|1994-05-03|1994-07-09|NONE|REG AIR|l requests. slyly +24293|222|77|1|4|4488.88|0.08|0.00|N|O|1997-05-25|1997-06-17|1997-05-26|TAKE BACK RETURN|AIR|s instructions. blithely express warthog +24294|385|70|1|45|57842.10|0.00|0.00|A|F|1994-08-18|1994-09-20|1994-08-23|COLLECT COD|AIR|ly Tiresias. slyly ironic asymptote +24294|547|38|2|40|57901.60|0.07|0.06|R|F|1994-10-05|1994-10-30|1994-10-12|COLLECT COD|MAIL|ronic excuses nag furiously +24294|1699|41|3|5|8003.45|0.05|0.07|R|F|1994-10-13|1994-10-21|1994-10-28|DELIVER IN PERSON|AIR|slyly clos +24294|523|84|4|33|46976.16|0.00|0.07|R|F|1994-10-13|1994-09-08|1994-10-22|COLLECT COD|FOB|ecial packages. slyly furio +24294|1322|61|5|14|17126.48|0.02|0.05|R|F|1994-09-03|1994-10-10|1994-09-30|DELIVER IN PERSON|AIR|ng sauternes. express, ironic foxe +24294|199|78|6|6|6595.14|0.09|0.05|R|F|1994-08-11|1994-10-04|1994-08-30|COLLECT COD|SHIP|ding to the regular acco +24295|929|64|1|15|27448.80|0.10|0.04|N|O|1998-04-12|1998-05-03|1998-04-21|NONE|RAIL| ironic packages; bold, furious +24320|958|93|1|50|92947.50|0.04|0.06|A|F|1994-01-30|1994-03-16|1994-01-31|TAKE BACK RETURN|MAIL|longside of the slyly ironic req +24321|1873|74|1|7|12424.09|0.05|0.08|A|F|1994-12-03|1994-12-23|1995-01-02|DELIVER IN PERSON|REG AIR|the carefully bold foxes. +24321|836|3|2|38|65999.54|0.08|0.08|R|F|1994-12-11|1995-01-20|1994-12-12|NONE|MAIL|ccording to the blithely +24321|473|74|3|18|24722.46|0.09|0.04|R|F|1995-02-18|1995-01-28|1995-03-02|DELIVER IN PERSON|FOB|uickly regular t +24321|1467|46|4|6|8210.76|0.08|0.02|R|F|1995-02-01|1995-01-15|1995-02-03|TAKE BACK RETURN|MAIL|egular requests play fluffily ar +24321|375|32|5|44|56116.28|0.09|0.01|A|F|1994-12-12|1995-01-21|1994-12-23|DELIVER IN PERSON|AIR|the ideas. regular packages nag fluffily fu +24321|179|32|6|25|26979.25|0.02|0.03|A|F|1995-01-26|1994-12-11|1995-02-04|DELIVER IN PERSON|FOB|oost furiously after the furiou +24322|1787|88|1|16|27020.48|0.08|0.01|N|O|1997-03-12|1997-03-22|1997-03-14|COLLECT COD|FOB|g, pending waters. even ideas do +24322|99|50|2|4|3996.36|0.06|0.03|N|O|1997-05-07|1997-03-04|1997-05-25|COLLECT COD|RAIL|sts cajole fluffily silent instruc +24322|846|46|3|29|50658.36|0.02|0.02|N|O|1997-03-04|1997-04-08|1997-03-22|NONE|TRUCK|en ideas sleep carefully regu +24322|673|67|4|44|69241.48|0.02|0.06|N|O|1997-03-05|1997-03-03|1997-03-22|TAKE BACK RETURN|RAIL| about the fluffily ironic deposits. iro +24322|545|36|5|22|31801.88|0.08|0.08|N|O|1997-03-26|1997-03-19|1997-04-19|COLLECT COD|AIR|slyly regular ideas affix slyly. slyly fina +24322|1099|70|6|50|50004.50|0.07|0.03|N|O|1997-04-26|1997-03-12|1997-05-11|NONE|FOB|slyly blithel +24323|1624|66|1|37|56447.94|0.05|0.07|N|O|1997-08-31|1997-08-25|1997-09-26|COLLECT COD|FOB|slyly according to the carefully regu +24323|102|55|2|46|46096.60|0.10|0.01|N|O|1997-07-14|1997-08-11|1997-07-29|TAKE BACK RETURN|AIR| are slyly among the blithely +24323|302|87|3|29|34866.70|0.06|0.05|N|O|1997-09-14|1997-08-27|1997-10-01|DELIVER IN PERSON|TRUCK|r the ideas. regular instructions s +24323|714|47|4|14|22605.94|0.06|0.00|N|O|1997-08-21|1997-08-27|1997-09-01|DELIVER IN PERSON|TRUCK|posits are +24323|787|52|5|19|32067.82|0.06|0.05|N|O|1997-09-18|1997-07-28|1997-10-10|DELIVER IN PERSON|AIR|riously express ideas. ironic, +24324|1950|39|1|25|46298.75|0.10|0.05|R|F|1993-07-07|1993-07-12|1993-07-15|TAKE BACK RETURN|TRUCK|xpress packages nag slyly acc +24324|933|36|2|9|16505.37|0.02|0.07|A|F|1993-08-10|1993-07-14|1993-08-27|NONE|FOB|c platelets. theodolites +24325|1287|62|1|27|32083.56|0.08|0.05|N|O|1996-09-27|1996-10-18|1996-10-18|NONE|FOB|around the bold, regular +24325|1752|95|2|26|42997.50|0.10|0.03|N|O|1996-10-09|1996-10-05|1996-11-05|TAKE BACK RETURN|MAIL|excuses. even, iro +24325|1270|82|3|16|18740.32|0.09|0.03|N|O|1996-12-01|1996-10-13|1996-12-09|TAKE BACK RETURN|AIR|ons. carefully silent dependencies +24325|1437|16|4|50|66921.50|0.05|0.00|N|O|1996-09-23|1996-10-29|1996-10-07|TAKE BACK RETURN|TRUCK|lyly slyly regular pin +24326|1084|55|1|44|43343.52|0.01|0.02|N|O|1995-12-06|1995-12-07|1995-12-17|DELIVER IN PERSON|AIR| even accounts are: regular excuses h +24326|819|86|2|41|70512.21|0.01|0.02|N|O|1995-10-19|1995-12-07|1995-11-04|TAKE BACK RETURN|FOB|ckly special excuses wake +24326|106|7|3|48|48292.80|0.07|0.00|N|O|1996-01-18|1995-12-03|1996-02-09|COLLECT COD|FOB| quickly besides the final instructi +24326|271|72|4|26|30453.02|0.09|0.03|N|O|1995-12-15|1995-11-29|1995-12-18|COLLECT COD|AIR|uests wake about the platelets. +24326|917|86|5|38|69080.58|0.08|0.05|N|O|1995-12-27|1995-11-24|1996-01-19|DELIVER IN PERSON|REG AIR|lyly blithely +24327|1267|68|1|49|57244.74|0.03|0.00|N|O|1996-04-01|1996-04-09|1996-04-14|DELIVER IN PERSON|SHIP|yly final excuses haggle. +24352|1593|94|1|34|50816.06|0.07|0.02|R|F|1993-09-02|1993-07-06|1993-09-13|COLLECT COD|RAIL|efully special +24352|1782|25|2|1|1683.78|0.02|0.04|R|F|1993-05-18|1993-07-17|1993-06-15|DELIVER IN PERSON|SHIP| dolphins haggle furio +24352|379|64|3|46|58851.02|0.06|0.05|A|F|1993-07-25|1993-07-17|1993-07-27|NONE|TRUCK|l, bold realm +24352|45|96|4|24|22680.96|0.02|0.08|R|F|1993-08-02|1993-06-12|1993-09-01|COLLECT COD|MAIL|ackages. furiously even the +24352|1221|96|5|46|51622.12|0.08|0.08|A|F|1993-07-12|1993-07-03|1993-07-14|TAKE BACK RETURN|SHIP|ing pinto beans. furiously +24353|1404|22|1|28|36551.20|0.05|0.03|N|O|1996-09-15|1996-07-20|1996-09-24|NONE|MAIL|into beans solve fluffily above the req +24353|1653|95|2|42|65295.30|0.09|0.08|N|O|1996-07-31|1996-07-01|1996-08-23|TAKE BACK RETURN|REG AIR|side of the ruthlessly pending request +24354|1816|46|1|32|54969.92|0.01|0.03|N|O|1998-02-28|1998-02-19|1998-03-12|DELIVER IN PERSON|FOB|regular account +24354|1015|51|2|49|44884.49|0.03|0.06|N|O|1998-04-16|1998-03-15|1998-05-05|COLLECT COD|TRUCK|furiously pending platele +24354|1993|38|3|31|58744.69|0.02|0.00|N|O|1998-01-17|1998-04-04|1998-01-27|NONE|TRUCK|haggle quickly after the slyly +24354|248|76|4|48|55115.52|0.01|0.08|N|O|1998-01-17|1998-02-12|1998-01-31|DELIVER IN PERSON|MAIL|egular excuses +24354|127|54|5|47|48274.64|0.05|0.00|N|O|1998-02-03|1998-04-01|1998-02-20|DELIVER IN PERSON|TRUCK|inal accounts against the furiously spec +24355|828|62|1|18|31118.76|0.07|0.00|N|O|1997-08-29|1997-08-13|1997-09-24|DELIVER IN PERSON|REG AIR|uriously r +24355|1907|52|2|25|45222.50|0.01|0.03|N|O|1997-07-21|1997-09-11|1997-08-19|DELIVER IN PERSON|FOB|s. silent deposits wake furiously pen +24355|304|61|3|39|46967.70|0.02|0.07|N|O|1997-11-01|1997-08-18|1997-11-29|TAKE BACK RETURN|MAIL| boost silently +24355|1300|75|4|43|51655.90|0.07|0.03|N|O|1997-09-20|1997-08-08|1997-10-09|TAKE BACK RETURN|RAIL|fluffily unusual pinto beans. final foxes +24355|1024|30|5|19|17575.38|0.10|0.04|N|O|1997-10-02|1997-08-24|1997-10-30|COLLECT COD|TRUCK| packages serve furiously ironic, regu +24356|1355|32|1|19|23870.65|0.07|0.00|A|F|1993-09-03|1993-07-21|1993-09-14|NONE|REG AIR|solve slyl +24356|589|50|2|5|7447.90|0.08|0.08|A|F|1993-06-21|1993-06-15|1993-07-15|NONE|SHIP|haggle reg +24356|1557|98|3|15|21878.25|0.00|0.04|A|F|1993-07-28|1993-06-14|1993-08-02|DELIVER IN PERSON|REG AIR|ructions cajole fluffily whit +24357|577|38|1|44|65013.08|0.01|0.03|N|O|1996-02-22|1996-04-06|1996-02-27|TAKE BACK RETURN|REG AIR|ackages boost slyly packages. express, perm +24357|837|4|2|21|36494.43|0.02|0.05|N|O|1996-04-26|1996-03-20|1996-05-24|COLLECT COD|SHIP|efully unusua +24357|725|26|3|2|3251.44|0.06|0.00|N|O|1996-04-30|1996-04-07|1996-05-12|COLLECT COD|MAIL|quickly regular +24357|1510|11|4|33|46579.83|0.07|0.03|N|O|1996-05-01|1996-04-05|1996-05-25|TAKE BACK RETURN|SHIP|ect fluffily express accounts. regular +24358|1811|98|1|13|22266.53|0.07|0.07|R|F|1994-07-28|1994-07-14|1994-08-16|TAKE BACK RETURN|SHIP|le carefully slyly specia +24358|23|74|2|44|40612.88|0.01|0.01|R|F|1994-05-23|1994-07-23|1994-05-28|COLLECT COD|AIR| cajole among the ironic a +24358|1747|90|3|47|77490.78|0.00|0.08|R|F|1994-06-11|1994-07-27|1994-06-27|TAKE BACK RETURN|TRUCK|ully according to the +24358|1342|19|4|26|32326.84|0.06|0.00|R|F|1994-08-22|1994-08-06|1994-08-28|DELIVER IN PERSON|TRUCK|e slyly carefully final packages. ironic Ti +24358|412|13|5|3|3937.23|0.01|0.03|R|F|1994-08-12|1994-07-28|1994-08-31|DELIVER IN PERSON|RAIL|sly regular deposits across the requests ca +24359|1762|89|1|21|34938.96|0.08|0.02|N|O|1998-06-16|1998-04-24|1998-07-10|DELIVER IN PERSON|TRUCK|thely slowly unu +24359|1491|92|2|11|15317.39|0.00|0.04|N|O|1998-06-25|1998-05-23|1998-07-07|TAKE BACK RETURN|FOB|hely past the pending, final accoun +24359|1466|67|3|47|64270.62|0.00|0.02|N|O|1998-04-16|1998-04-11|1998-04-24|TAKE BACK RETURN|REG AIR| the theod +24359|575|66|4|16|23609.12|0.09|0.02|N|O|1998-05-26|1998-04-11|1998-06-17|COLLECT COD|AIR|lithely af +24359|60|11|5|21|20161.26|0.08|0.01|N|O|1998-03-12|1998-04-13|1998-03-15|NONE|RAIL|nal excuses sleep. final requests at +24359|338|95|6|45|55724.85|0.03|0.04|N|O|1998-04-22|1998-04-30|1998-05-13|NONE|RAIL| carefully final dependen +24384|1190|91|1|17|18550.23|0.09|0.07|A|F|1995-04-25|1995-04-27|1995-05-07|NONE|SHIP|furiously regular foxes wake boldly +24384|1982|71|2|31|58403.38|0.00|0.02|N|O|1995-06-24|1995-06-21|1995-07-21|TAKE BACK RETURN|FOB|e silent, express packages. f +24384|1849|36|3|20|35016.80|0.10|0.01|N|O|1995-07-17|1995-06-17|1995-08-10|COLLECT COD|REG AIR|osits haggle regularly against the regul +24384|674|75|4|41|64561.47|0.06|0.00|R|F|1995-06-14|1995-06-07|1995-06-16|TAKE BACK RETURN|REG AIR|y pending asymptot +24384|1743|44|5|25|41118.50|0.02|0.04|R|F|1995-06-02|1995-05-15|1995-06-05|DELIVER IN PERSON|FOB|uternes. regular depos +24384|603|4|6|11|16539.60|0.07|0.04|R|F|1995-04-24|1995-05-21|1995-05-21|DELIVER IN PERSON|MAIL| dependencies. furiously pendin +24384|533|94|7|44|63075.32|0.03|0.01|A|F|1995-04-30|1995-05-07|1995-05-26|COLLECT COD|TRUCK|ly. even notornis alongside of the care +24385|1679|3|1|49|77452.83|0.05|0.01|R|F|1993-03-20|1993-03-03|1993-04-05|NONE|TRUCK| grouches. quickly iro +24385|419|78|2|32|42221.12|0.00|0.05|A|F|1993-05-10|1993-03-22|1993-05-24|NONE|TRUCK|n, brave theodolites boost furiously +24385|1160|69|3|25|26529.00|0.07|0.04|R|F|1993-02-12|1993-04-21|1993-02-24|TAKE BACK RETURN|RAIL|lly express requests are. blithely ev +24385|1400|77|4|44|57261.60|0.10|0.08|A|F|1993-05-22|1993-03-27|1993-06-13|NONE|REG AIR|as haggle fu +24385|335|20|5|20|24706.60|0.04|0.07|A|F|1993-05-05|1993-04-05|1993-05-11|COLLECT COD|REG AIR|ously express dependenc +24386|318|75|1|47|57260.57|0.10|0.02|A|F|1992-07-15|1992-09-12|1992-08-04|COLLECT COD|MAIL|telets! pending theodolites according to th +24386|1818|5|2|4|6879.24|0.01|0.01|R|F|1992-10-04|1992-09-23|1992-10-13|DELIVER IN PERSON|TRUCK|ffily alongside of the excuses. pending ide +24386|1933|34|3|6|11009.58|0.04|0.08|A|F|1992-09-29|1992-08-11|1992-10-04|NONE|TRUCK|he blithely ruthless deposits. q +24386|481|82|4|38|52496.24|0.04|0.04|A|F|1992-08-27|1992-08-28|1992-09-23|TAKE BACK RETURN|REG AIR|ial requests cajole carefully a +24386|430|60|5|48|63860.64|0.02|0.08|R|F|1992-10-11|1992-08-07|1992-10-20|TAKE BACK RETURN|AIR|ing theodolites dete +24386|615|9|6|9|13640.49|0.05|0.01|R|F|1992-09-12|1992-08-01|1992-10-02|COLLECT COD|FOB|ourts: slyly ironic ideas at the +24386|800|97|7|3|5102.40|0.03|0.05|R|F|1992-07-24|1992-08-06|1992-07-25|TAKE BACK RETURN|RAIL|es sleep. furiously fi +24387|1420|60|1|6|7928.52|0.00|0.08|N|O|1995-10-10|1995-10-10|1995-11-06|TAKE BACK RETURN|TRUCK|ajole carefully with the s +24387|204|59|2|9|9937.80|0.01|0.04|N|O|1995-12-08|1995-10-07|1995-12-17|COLLECT COD|AIR| packages? re +24387|1606|30|3|30|45228.00|0.04|0.03|N|O|1995-12-09|1995-10-24|1995-12-18|DELIVER IN PERSON|FOB| the regular +24387|632|64|4|35|53642.05|0.08|0.06|N|O|1995-09-09|1995-09-15|1995-09-29|COLLECT COD|TRUCK|uctions haggle. express dolphins +24387|1365|4|5|4|5065.44|0.10|0.02|N|O|1995-08-13|1995-09-18|1995-08-30|TAKE BACK RETURN|FOB| blithely carefully final instruction +24387|193|72|6|13|14211.47|0.08|0.07|N|O|1995-10-24|1995-10-14|1995-11-14|TAKE BACK RETURN|MAIL|ly ironic sentiments na +24387|1401|19|7|30|39072.00|0.08|0.07|N|O|1995-10-10|1995-10-07|1995-10-20|NONE|SHIP|ven deposit +24388|1440|19|1|20|26828.80|0.05|0.02|A|F|1995-04-12|1995-04-26|1995-04-16|NONE|SHIP|ual deposits wake +24388|1600|41|2|27|40543.20|0.08|0.03|A|F|1995-05-25|1995-04-23|1995-06-10|COLLECT COD|TRUCK|nal foxes. requests +24388|1412|30|3|7|9193.87|0.10|0.04|A|F|1995-02-17|1995-03-05|1995-03-17|COLLECT COD|RAIL|ar excuses. quickly unusual deposits +24388|1570|91|4|3|4414.71|0.02|0.01|A|F|1995-01-31|1995-02-27|1995-02-28|DELIVER IN PERSON|TRUCK|eposits sleep for the fu +24388|1392|31|5|7|9053.73|0.08|0.03|R|F|1995-03-26|1995-03-15|1995-04-02|COLLECT COD|FOB|etect instead of the +24389|958|93|1|6|11153.70|0.03|0.02|N|O|1998-03-01|1998-03-14|1998-03-06|NONE|RAIL|whithout the b +24389|1023|24|2|45|41580.90|0.09|0.06|N|O|1998-04-22|1998-04-05|1998-05-14|DELIVER IN PERSON|SHIP|g the bold pinto beans. +24390|982|17|1|36|67787.28|0.08|0.02|A|F|1992-10-02|1992-08-06|1992-10-24|DELIVER IN PERSON|MAIL|cies nag along the unusual ideas. +24390|1553|94|2|15|21818.25|0.09|0.06|A|F|1992-10-02|1992-08-27|1992-10-22|NONE|MAIL|y blithely +24390|73|24|3|30|29192.10|0.09|0.00|A|F|1992-06-22|1992-07-24|1992-07-12|COLLECT COD|SHIP|dencies do +24390|1730|15|4|38|62005.74|0.06|0.00|R|F|1992-08-16|1992-08-01|1992-09-07|NONE|AIR|gside of the theodolites. carefully +24390|193|46|5|3|3279.57|0.07|0.01|A|F|1992-09-16|1992-07-16|1992-10-05|NONE|SHIP|requests cajole carefully slyly regular d +24390|1726|11|6|14|22788.08|0.03|0.05|A|F|1992-07-19|1992-08-24|1992-08-04|DELIVER IN PERSON|MAIL|le fluffily. furiously fin +24391|672|66|1|48|75488.16|0.01|0.01|R|F|1994-05-27|1994-05-31|1994-06-17|DELIVER IN PERSON|SHIP|ter the blithely pending frets. s +24391|1152|25|2|48|50551.20|0.10|0.00|A|F|1994-05-31|1994-06-01|1994-06-05|COLLECT COD|REG AIR|usual accounts sublate bli +24391|194|21|3|9|9847.71|0.08|0.07|A|F|1994-07-06|1994-05-16|1994-07-21|NONE|REG AIR|aggle carefully quickly even asym +24391|1723|66|4|16|25995.52|0.07|0.06|R|F|1994-06-20|1994-05-17|1994-06-27|COLLECT COD|AIR|otes. slyly +24391|537|28|5|24|34500.72|0.09|0.00|A|F|1994-05-14|1994-04-20|1994-05-25|DELIVER IN PERSON|REG AIR|ckages among +24416|1636|19|1|31|47666.53|0.05|0.04|N|O|1997-01-23|1996-12-01|1997-02-14|COLLECT COD|FOB|ies. thinly regular pinto beans +24416|255|83|2|43|49675.75|0.10|0.04|N|O|1996-11-18|1996-12-20|1996-11-20|TAKE BACK RETURN|RAIL|ct carefully excuses. furiously regul +24416|1325|64|3|50|61316.00|0.07|0.07|N|O|1997-01-01|1996-12-17|1997-01-21|COLLECT COD|MAIL|nt packages. fluffily +24416|168|95|4|28|29908.48|0.01|0.01|N|O|1996-12-14|1996-11-19|1997-01-08|DELIVER IN PERSON|SHIP| fluffily. furiously fi +24417|1972|73|1|16|29983.52|0.09|0.05|N|O|1998-09-03|1998-09-11|1998-09-15|TAKE BACK RETURN|AIR|ly even deposi +24417|896|96|2|31|55703.59|0.07|0.04|N|O|1998-07-14|1998-08-19|1998-07-16|NONE|SHIP| pending, ironic deposits. quick +24417|1994|95|3|15|28439.85|0.08|0.08|N|O|1998-08-04|1998-09-02|1998-08-11|TAKE BACK RETURN|AIR|sly final a +24417|554|85|4|45|65454.75|0.01|0.07|N|O|1998-08-08|1998-08-22|1998-08-10|COLLECT COD|TRUCK| alongside of the furiousl +24417|1752|79|5|28|46305.00|0.09|0.06|N|O|1998-10-24|1998-08-17|1998-10-29|DELIVER IN PERSON|AIR| unusual dolphins. blithely final deposits +24418|86|62|1|12|11832.96|0.09|0.06|A|F|1992-11-30|1992-10-10|1992-12-14|NONE|TRUCK|eposits are across the fur +24418|685|86|2|39|61841.52|0.00|0.01|R|F|1992-12-09|1992-11-14|1992-12-16|NONE|RAIL|t the blithely +24418|1779|6|3|40|67230.80|0.03|0.08|A|F|1992-11-20|1992-11-15|1992-12-10|TAKE BACK RETURN|REG AIR|beans nod b +24419|1473|52|1|31|42608.57|0.09|0.03|N|O|1998-09-02|1998-10-18|1998-09-18|DELIVER IN PERSON|FOB| cajole ruthle +24419|1295|33|2|35|41870.15|0.10|0.08|N|O|1998-08-11|1998-09-02|1998-09-04|NONE|REG AIR| quickly even th +24419|340|97|3|10|12403.40|0.04|0.04|N|O|1998-09-20|1998-09-13|1998-09-24|COLLECT COD|TRUCK|sleep slyly furiously f +24419|1798|41|4|49|83289.71|0.09|0.08|N|O|1998-11-08|1998-09-26|1998-11-25|NONE|FOB|r deposits. permanent, regular the +24419|927|30|5|7|12795.44|0.03|0.01|N|O|1998-10-18|1998-09-12|1998-10-28|COLLECT COD|RAIL|manent pinto beans grow furiously along the +24419|994|29|6|27|51164.73|0.10|0.00|N|O|1998-09-17|1998-09-07|1998-10-04|COLLECT COD|REG AIR|. final packages sleep busily. quic +24419|1126|99|7|35|35949.20|0.00|0.02|N|O|1998-09-15|1998-10-03|1998-10-11|TAKE BACK RETURN|MAIL| before the theodolites. fluffily ironic +24420|448|7|1|43|57982.92|0.02|0.08|R|F|1992-07-14|1992-07-02|1992-08-02|TAKE BACK RETURN|AIR| theodolites agai +24420|156|9|2|31|32740.65|0.05|0.03|R|F|1992-08-20|1992-07-06|1992-09-11|DELIVER IN PERSON|RAIL|ng the carefully ironic req +24420|1719|62|3|23|37276.33|0.09|0.06|A|F|1992-06-19|1992-07-13|1992-06-30|COLLECT COD|TRUCK|atelets affix alongside of the q +24420|1413|14|4|1|1314.41|0.02|0.06|R|F|1992-07-20|1992-08-14|1992-08-17|NONE|TRUCK|ar gifts sleep regular a +24420|288|89|5|27|32083.56|0.09|0.00|R|F|1992-06-29|1992-06-29|1992-07-14|TAKE BACK RETURN|AIR|ly bold excuses. thinly unusual asymptotes +24420|1591|32|6|8|11940.72|0.08|0.05|A|F|1992-06-29|1992-08-07|1992-07-20|NONE|MAIL|quickly pending ideas detect across +24420|302|59|7|43|51698.90|0.09|0.01|A|F|1992-06-20|1992-07-27|1992-07-16|DELIVER IN PERSON|AIR|carefully ironic deposits haggle slyly bli +24421|1145|18|1|17|17784.38|0.04|0.04|N|O|1997-07-13|1997-10-01|1997-07-23|COLLECT COD|SHIP| special deposits boost above the f +24421|224|79|2|9|10117.98|0.06|0.02|N|O|1997-09-10|1997-09-27|1997-09-14|DELIVER IN PERSON|AIR|ouches cajole quickly unusual de +24422|816|17|1|39|66955.59|0.04|0.00|N|O|1996-03-17|1996-03-06|1996-04-04|NONE|MAIL|sts. requests affix +24422|1090|91|2|14|13875.26|0.03|0.08|N|O|1996-03-18|1996-02-18|1996-04-10|DELIVER IN PERSON|AIR|requests h +24422|1551|52|3|2|2905.10|0.03|0.07|N|O|1996-04-01|1996-03-16|1996-04-14|TAKE BACK RETURN|MAIL| ironic, regular th +24422|1300|1|4|30|36039.00|0.06|0.08|N|O|1996-02-22|1996-02-12|1996-02-29|DELIVER IN PERSON|TRUCK|refully even foxes wake. +24423|1727|54|1|24|39089.28|0.10|0.07|N|O|1998-04-23|1998-04-19|1998-05-08|TAKE BACK RETURN|AIR|ld accounts boost slyly after +24448|19|20|1|36|33084.36|0.03|0.02|A|F|1992-02-10|1992-04-06|1992-02-26|TAKE BACK RETURN|RAIL|ies. even packages use f +24448|1004|5|2|30|27150.00|0.02|0.08|A|F|1992-04-22|1992-04-19|1992-04-30|NONE|RAIL|sheaves are. carefully regular accou +24448|863|97|3|12|21166.32|0.04|0.01|A|F|1992-03-04|1992-03-30|1992-03-30|DELIVER IN PERSON|TRUCK| cajole around the dugouts-- quick +24448|222|4|4|37|41522.14|0.04|0.07|R|F|1992-03-08|1992-04-07|1992-04-07|COLLECT COD|REG AIR|ross the silent theodolite +24448|961|96|5|2|3723.92|0.10|0.00|A|F|1992-05-18|1992-05-01|1992-05-29|COLLECT COD|TRUCK|ffix slyly accordi +24448|1190|91|6|49|53468.31|0.06|0.03|A|F|1992-05-21|1992-05-07|1992-05-22|DELIVER IN PERSON|MAIL|re carefully final requests-- furiously pe +24449|422|52|1|13|17191.46|0.02|0.07|N|O|1997-08-05|1997-07-30|1997-08-08|NONE|MAIL|regular packages w +24449|234|62|2|46|52174.58|0.01|0.01|N|O|1997-09-03|1997-08-19|1997-09-30|TAKE BACK RETURN|AIR|kly bold asymptotes cajole across the +24449|1614|56|3|2|3031.22|0.08|0.03|N|O|1997-08-15|1997-07-21|1997-09-05|COLLECT COD|AIR|kages. requests about the qui +24449|1180|89|4|38|41084.84|0.08|0.02|N|O|1997-08-26|1997-07-31|1997-09-08|COLLECT COD|AIR|ray. fluffily ironic requests hag +24449|578|69|5|31|45835.67|0.02|0.02|N|O|1997-07-21|1997-09-13|1997-08-05|COLLECT COD|RAIL|. boldly bold dependenci +24450|817|17|1|48|82454.88|0.04|0.08|R|F|1992-08-20|1992-08-11|1992-09-16|DELIVER IN PERSON|AIR|ress requests b +24450|1074|45|2|40|39002.80|0.02|0.02|R|F|1992-10-21|1992-09-02|1992-11-09|COLLECT COD|REG AIR|pecial packages. bold pinto beans boos +24450|1857|87|3|49|86183.65|0.00|0.04|A|F|1992-07-22|1992-09-18|1992-08-05|DELIVER IN PERSON|FOB|side of the even package +24450|1920|21|4|8|14575.36|0.03|0.07|A|F|1992-09-15|1992-09-22|1992-10-04|COLLECT COD|TRUCK|the quickly regula +24450|1800|85|5|42|71475.60|0.09|0.07|R|F|1992-08-06|1992-09-17|1992-08-18|NONE|REG AIR|across the slyly bold excus +24451|52|53|1|44|41890.20|0.08|0.08|R|F|1993-02-06|1993-02-01|1993-03-07|NONE|REG AIR| express requests wake carefully ironic p +24451|270|52|2|27|31597.29|0.09|0.00|A|F|1993-02-06|1993-03-01|1993-02-15|TAKE BACK RETURN|FOB|s. fluffily +24452|922|57|1|2|3645.84|0.00|0.00|R|F|1994-06-23|1994-07-19|1994-07-07|COLLECT COD|FOB|dencies affix blithely pending, ev +24452|1230|5|2|13|14705.99|0.05|0.01|A|F|1994-06-14|1994-07-19|1994-07-07|DELIVER IN PERSON|MAIL|ost. regular grouches alon +24452|528|19|3|32|45712.64|0.09|0.07|R|F|1994-07-15|1994-07-07|1994-07-29|COLLECT COD|FOB|raids. express, dogged packages ca +24453|1581|62|1|32|47442.56|0.06|0.07|A|F|1992-08-11|1992-08-01|1992-09-01|COLLECT COD|SHIP|ix carefully carefully unusual plat +24454|672|73|1|28|44034.76|0.07|0.04|R|F|1994-07-12|1994-06-28|1994-07-20|TAKE BACK RETURN|FOB|y final requests eat. carefully pending +24454|17|68|2|33|30261.33|0.10|0.05|R|F|1994-07-12|1994-05-25|1994-07-30|TAKE BACK RETURN|TRUCK|se regular, +24454|1687|70|3|4|6354.72|0.05|0.01|R|F|1994-06-22|1994-06-03|1994-07-04|TAKE BACK RETURN|SHIP|e slyly bold, ex +24455|666|29|1|8|12533.28|0.09|0.02|R|F|1994-12-10|1995-02-04|1995-01-07|NONE|REG AIR|etect. carefull +24455|694|26|2|44|70166.36|0.04|0.05|A|F|1995-03-25|1995-02-24|1995-04-04|NONE|MAIL|o beans. notornis across the carefully busy +24455|1051|87|3|28|26657.40|0.01|0.00|R|F|1995-01-15|1995-02-17|1995-01-18|COLLECT COD|REG AIR|slyly final requests sleep blithely. ir +24455|495|54|4|37|51633.13|0.00|0.03|R|F|1994-12-30|1995-02-11|1995-01-05|NONE|FOB| blithely ironic ins +24480|220|2|1|28|31366.16|0.09|0.00|R|F|1994-03-21|1994-04-05|1994-03-30|COLLECT COD|AIR|ly final asymptotes use quickly. ironi +24480|262|90|2|16|18596.16|0.05|0.05|A|F|1994-05-22|1994-05-19|1994-05-29|COLLECT COD|SHIP|into beans. final, silent asymptotes wake +24481|1145|54|1|19|19876.66|0.10|0.05|N|O|1996-01-30|1996-01-17|1996-02-17|NONE|AIR|ackages haggle bravely. excuse +24481|1288|26|2|22|26164.16|0.02|0.06|N|O|1996-01-26|1996-01-06|1996-02-12|TAKE BACK RETURN|REG AIR|ep across the blithely special +24481|358|15|3|30|37750.50|0.09|0.03|N|O|1996-01-10|1996-02-23|1996-01-19|DELIVER IN PERSON|REG AIR|nal platelets. ironic realms alo +24482|1317|94|1|12|14619.72|0.00|0.08|N|O|1996-03-19|1996-02-10|1996-03-31|DELIVER IN PERSON|FOB|ke slyly among the blithely +24483|1819|20|1|7|12045.67|0.07|0.08|N|O|1996-06-08|1996-06-03|1996-06-23|NONE|REG AIR|ress foxes. package +24483|726|91|2|40|65068.80|0.07|0.04|N|O|1996-04-25|1996-04-30|1996-04-29|TAKE BACK RETURN|SHIP|ven ideas. bold requests hagg +24483|1354|93|3|14|17574.90|0.07|0.03|N|O|1996-06-29|1996-05-26|1996-07-21|NONE|RAIL|he slyly special requests use furiousl +24483|1681|82|4|49|77551.32|0.08|0.08|N|O|1996-04-12|1996-05-29|1996-04-25|TAKE BACK RETURN|SHIP|nusual requests dazzle among the +24483|64|40|5|11|10604.66|0.07|0.05|N|O|1996-06-23|1996-05-20|1996-06-24|COLLECT COD|TRUCK|thily permanent packa +24484|824|25|1|28|48294.96|0.05|0.08|A|F|1995-05-11|1995-03-13|1995-05-27|DELIVER IN PERSON|TRUCK|ckages boos +24484|1408|87|2|46|60232.40|0.07|0.06|R|F|1995-02-22|1995-03-25|1995-03-16|COLLECT COD|AIR|odolites cajole according to th +24484|1734|19|3|13|21264.49|0.08|0.03|R|F|1995-04-28|1995-04-08|1995-05-28|DELIVER IN PERSON|RAIL|ans. slyly bo +24484|738|71|4|6|9832.38|0.06|0.05|R|F|1995-02-16|1995-02-26|1995-02-17|COLLECT COD|AIR|accounts nag. sly deposits will c +24484|325|10|5|43|52688.76|0.10|0.07|R|F|1995-02-06|1995-04-01|1995-02-13|TAKE BACK RETURN|FOB|p carefully. fluffily even accounts +24484|1617|100|6|41|62263.01|0.01|0.05|R|F|1995-04-23|1995-03-02|1995-05-07|COLLECT COD|REG AIR|e furiously express inst +24485|610|11|1|5|7553.05|0.04|0.06|A|F|1994-07-31|1994-05-28|1994-08-06|NONE|FOB|n ideas sleep regular acc +24486|1017|23|1|27|24786.27|0.09|0.00|N|O|1995-08-03|1995-07-11|1995-08-30|DELIVER IN PERSON|TRUCK| wake furiousl +24486|1000|69|2|31|27931.00|0.04|0.05|R|F|1995-05-22|1995-07-20|1995-06-12|DELIVER IN PERSON|MAIL|furiously regular packa +24486|439|40|3|16|21430.88|0.10|0.02|N|O|1995-08-04|1995-07-18|1995-08-26|COLLECT COD|REG AIR|silent, pending accounts wake +24486|1863|64|4|9|15883.74|0.01|0.00|N|F|1995-06-16|1995-05-31|1995-06-25|COLLECT COD|AIR|ons-- blithely unusual pinto beans haggle +24486|486|45|5|10|13864.80|0.06|0.01|R|F|1995-06-16|1995-06-19|1995-06-17|COLLECT COD|FOB|y dogged dep +24486|479|9|6|50|68973.50|0.00|0.05|A|F|1995-06-15|1995-06-09|1995-06-17|NONE|AIR|ges haggle slyly ironic reques +24486|751|16|7|37|61114.75|0.01|0.06|N|O|1995-06-28|1995-06-08|1995-07-15|COLLECT COD|SHIP|final requests. fur +24487|1110|19|1|46|46511.06|0.01|0.06|A|F|1992-04-07|1992-05-10|1992-05-02|NONE|REG AIR|ing, regular accounts. fl +24512|1543|84|1|30|43336.20|0.02|0.01|N|O|1995-12-13|1995-11-17|1995-12-23|TAKE BACK RETURN|SHIP|ions integrate slyly. stealthil +24512|1849|93|2|26|45521.84|0.05|0.02|N|O|1995-11-30|1995-10-11|1995-12-17|TAKE BACK RETURN|RAIL| regular courts affix across the furi +24512|1573|54|3|23|33915.11|0.00|0.07|N|O|1995-11-19|1995-11-05|1995-11-23|TAKE BACK RETURN|RAIL|final attainments. excuses use so +24513|1064|35|1|38|36672.28|0.02|0.01|N|O|1998-03-13|1998-02-18|1998-03-21|DELIVER IN PERSON|MAIL|lently unus +24514|485|86|1|18|24938.64|0.09|0.03|N|O|1995-12-03|1995-12-15|1995-12-14|NONE|SHIP|the final, furious a +24514|195|22|2|44|48188.36|0.06|0.02|N|O|1995-12-01|1996-01-01|1995-12-14|COLLECT COD|SHIP| the fluffily +24514|386|71|3|16|20582.08|0.04|0.00|N|O|1996-02-07|1995-12-19|1996-02-20|TAKE BACK RETURN|REG AIR|. unusual, regu +24515|448|7|1|25|33711.00|0.07|0.03|R|F|1993-06-22|1993-06-26|1993-07-21|COLLECT COD|SHIP|ss theodolites nag carefully against the e +24515|224|25|2|48|53962.56|0.10|0.06|R|F|1993-06-21|1993-07-23|1993-06-29|COLLECT COD|RAIL|ly regular braids haggle; regular instruc +24515|532|93|3|34|48706.02|0.08|0.02|A|F|1993-08-21|1993-06-10|1993-09-07|DELIVER IN PERSON|FOB|as. carefully unusual theodo +24515|1936|69|4|48|88220.64|0.03|0.01|R|F|1993-05-23|1993-06-11|1993-06-13|DELIVER IN PERSON|AIR|dencies. regular requests nag +24515|630|31|5|1|1530.63|0.00|0.07|A|F|1993-08-04|1993-06-24|1993-08-05|NONE|AIR|ach quickly c +24515|336|65|6|38|46980.54|0.10|0.01|R|F|1993-07-13|1993-06-28|1993-08-10|COLLECT COD|REG AIR|g deposits across the slyly ironic reques +24515|1554|75|7|29|42210.95|0.08|0.02|A|F|1993-05-17|1993-07-10|1993-06-02|NONE|AIR| special ideas are about the +24516|945|80|1|43|79375.42|0.07|0.07|R|F|1993-12-10|1993-11-14|1994-01-01|NONE|REG AIR| slyly atop the final reques +24517|279|61|1|36|42453.72|0.09|0.03|A|F|1994-07-18|1994-09-02|1994-08-01|DELIVER IN PERSON|AIR|nal requests haggle. blithely +24518|1463|64|1|49|66858.54|0.05|0.03|N|O|1998-01-18|1997-11-05|1998-01-27|COLLECT COD|AIR|onic theodol +24518|1957|46|2|31|57627.45|0.09|0.00|N|O|1997-11-28|1997-12-19|1997-12-01|NONE|MAIL|old, special re +24519|327|12|1|29|35592.28|0.05|0.03|N|O|1995-09-10|1995-08-01|1995-10-07|TAKE BACK RETURN|RAIL| carefully pending idea +24519|82|8|2|12|11784.96|0.02|0.00|N|O|1995-06-30|1995-09-08|1995-07-19|COLLECT COD|RAIL|ithely regular hockey players: packages acc +24519|933|2|3|30|55017.90|0.01|0.02|N|O|1995-07-13|1995-09-07|1995-07-22|NONE|AIR|are furiously. regular platelets affix car +24519|1442|21|4|44|59111.36|0.02|0.03|N|O|1995-07-31|1995-07-15|1995-08-10|NONE|FOB| x-ray. furiousl +24519|805|6|5|9|15352.20|0.03|0.03|N|O|1995-07-03|1995-08-12|1995-07-20|DELIVER IN PERSON|AIR|ests cajole slyly fu +24519|374|75|6|48|61169.76|0.04|0.01|N|O|1995-08-06|1995-09-04|1995-08-14|TAKE BACK RETURN|MAIL|ss, pending packages are. slyly +24519|587|48|7|20|29751.60|0.03|0.05|N|O|1995-08-11|1995-07-22|1995-08-18|TAKE BACK RETURN|FOB|thely unusual excuses sleep blithely foxes +24544|258|40|1|14|16215.50|0.08|0.03|R|F|1994-01-30|1994-04-27|1994-03-01|DELIVER IN PERSON|FOB|y ironic accounts are slyly +24544|84|10|2|26|25586.08|0.05|0.08|R|F|1994-04-23|1994-03-31|1994-04-29|DELIVER IN PERSON|FOB|al escapades wake ironic deposits. neve +24544|1174|75|3|50|53758.50|0.00|0.04|R|F|1994-05-25|1994-04-12|1994-05-26|NONE|TRUCK|wake. blithely unusual platelets sleep furi +24544|368|69|4|7|8878.52|0.09|0.02|A|F|1994-04-01|1994-03-28|1994-04-19|COLLECT COD|REG AIR|yly bold depe +24544|1301|78|5|18|21641.40|0.04|0.04|R|F|1994-03-21|1994-03-02|1994-03-31|COLLECT COD|TRUCK|ounts wake. closely regula +24544|169|48|6|21|22452.36|0.07|0.05|A|F|1994-02-17|1994-03-08|1994-02-21|NONE|TRUCK|ly ironic theodolites around the slyly sile +24544|226|8|7|38|42796.36|0.09|0.03|R|F|1994-02-03|1994-04-11|1994-02-05|DELIVER IN PERSON|TRUCK| special instructions +24545|1859|89|1|45|79238.25|0.05|0.04|N|O|1996-06-28|1996-08-07|1996-07-21|COLLECT COD|SHIP|ly unusual pinto beans. caref +24545|1920|21|2|41|74698.72|0.08|0.07|N|O|1996-10-07|1996-08-22|1996-10-17|NONE|SHIP| thrash quickly among the slyly fi +24545|227|82|3|42|47343.24|0.03|0.02|N|O|1996-07-07|1996-09-18|1996-07-13|COLLECT COD|SHIP|ns cajole even depen +24545|218|100|4|16|17891.36|0.07|0.04|N|O|1996-09-14|1996-08-03|1996-09-22|COLLECT COD|RAIL|thogs. carefully special instructions +24545|177|30|5|33|35546.61|0.08|0.04|N|O|1996-09-21|1996-07-28|1996-10-20|DELIVER IN PERSON|REG AIR|lly after the furiously special pin +24546|390|75|1|33|42582.87|0.01|0.08|A|F|1992-06-27|1992-05-03|1992-07-24|TAKE BACK RETURN|FOB|ts eat after the final pinto beans. +24546|742|43|2|24|39425.76|0.03|0.03|A|F|1992-05-05|1992-06-04|1992-05-28|COLLECT COD|RAIL| frets use. final pint +24546|282|10|3|23|27192.44|0.02|0.03|A|F|1992-06-28|1992-06-12|1992-07-22|COLLECT COD|FOB|structions caj +24546|1772|57|4|42|70298.34|0.07|0.03|A|F|1992-04-07|1992-05-11|1992-04-09|DELIVER IN PERSON|AIR|cial theodolites cajole slyly final pinto +24546|1396|97|5|19|24650.41|0.03|0.04|A|F|1992-06-25|1992-05-10|1992-07-18|COLLECT COD|FOB| packages can boost blith +24546|1420|21|6|23|30392.66|0.05|0.06|A|F|1992-05-02|1992-05-27|1992-05-31|TAKE BACK RETURN|FOB|nstructions across the +24546|1216|17|7|38|42453.98|0.07|0.02|R|F|1992-05-18|1992-05-01|1992-06-07|DELIVER IN PERSON|TRUCK|ully ironic foxes pla +24547|136|37|1|34|35228.42|0.03|0.05|N|O|1997-08-15|1997-09-27|1997-09-14|DELIVER IN PERSON|SHIP|slyly daring dependencies. bold hockey +24547|93|94|2|12|11917.08|0.02|0.07|N|O|1997-10-17|1997-10-16|1997-11-07|DELIVER IN PERSON|MAIL|equests boost. slyly regular requests +24547|688|89|3|5|7943.40|0.09|0.04|N|O|1997-08-01|1997-09-06|1997-08-14|TAKE BACK RETURN|FOB|furiously across the +24548|745|42|1|11|18103.14|0.01|0.04|A|F|1995-03-31|1995-04-22|1995-04-22|DELIVER IN PERSON|MAIL|kages eat f +24549|1868|69|1|11|19468.46|0.09|0.00|N|O|1997-05-25|1997-05-30|1997-06-16|TAKE BACK RETURN|FOB|ggle furiously ev +24549|780|81|2|38|63869.64|0.01|0.04|N|O|1997-07-01|1997-06-12|1997-07-17|COLLECT COD|TRUCK|osits. furiously regular d +24550|1819|63|1|45|77436.45|0.09|0.03|N|O|1997-02-19|1997-01-09|1997-03-02|COLLECT COD|MAIL|oost furiously through the regular, reg +24550|1276|77|2|39|45913.53|0.10|0.05|N|O|1997-02-04|1997-01-05|1997-03-06|DELIVER IN PERSON|RAIL|ependencies. ca +24550|290|72|3|21|24996.09|0.10|0.06|N|O|1996-12-25|1997-01-02|1997-01-09|COLLECT COD|AIR|ccording to the carefully even pa +24550|1081|17|4|11|10802.88|0.01|0.01|N|O|1996-12-09|1997-01-09|1996-12-19|DELIVER IN PERSON|TRUCK|ingly silent deposits. p +24551|542|73|1|35|50488.90|0.08|0.03|N|O|1997-01-21|1997-04-03|1997-02-09|DELIVER IN PERSON|MAIL|about the slyly silen +24551|641|42|2|26|40082.64|0.01|0.04|N|O|1997-02-24|1997-03-26|1997-03-11|COLLECT COD|AIR|s wake between the furiously regular hocke +24551|916|17|3|45|81760.95|0.10|0.02|N|O|1997-03-14|1997-02-07|1997-04-13|TAKE BACK RETURN|TRUCK|en, pending asym +24551|1799|100|4|23|39118.17|0.07|0.08|N|O|1997-03-17|1997-03-02|1997-04-14|TAKE BACK RETURN|SHIP|r, ironic accounts mold fluffily r +24551|271|26|5|37|43336.99|0.03|0.03|N|O|1997-02-20|1997-03-05|1997-03-18|NONE|RAIL|posits. fluffily even foxes engage +24551|362|19|6|36|45444.96|0.06|0.03|N|O|1997-02-12|1997-03-23|1997-02-15|COLLECT COD|MAIL|nstructions. final platelets are +24551|754|19|7|26|43023.50|0.04|0.01|N|O|1997-03-23|1997-03-22|1997-03-26|TAKE BACK RETURN|SHIP| the blithely qui +24576|442|1|1|12|16109.28|0.06|0.06|A|F|1992-12-16|1993-03-07|1992-12-29|DELIVER IN PERSON|MAIL|ly ironic deposits. +24576|1461|62|2|31|42236.26|0.04|0.03|A|F|1992-12-31|1993-02-12|1993-01-02|NONE|TRUCK|y ironic excuses. slyly bold deposit +24576|1314|15|3|8|9722.48|0.10|0.06|A|F|1993-02-24|1993-02-15|1993-03-20|COLLECT COD|TRUCK|ests. deposits ca +24576|112|91|4|15|15181.65|0.01|0.06|R|F|1993-03-24|1993-01-21|1993-04-07|NONE|REG AIR|uctions are alongs +24576|1133|70|5|12|12409.56|0.09|0.06|R|F|1993-01-09|1993-02-03|1993-01-21|COLLECT COD|AIR|, ironic courts are blithely above t +24576|1217|55|6|31|34664.51|0.03|0.00|A|F|1992-12-23|1993-03-04|1993-01-03|DELIVER IN PERSON|TRUCK|ke carefully furiously e +24577|1840|84|1|27|47029.68|0.02|0.01|R|F|1993-03-19|1993-05-02|1993-03-20|TAKE BACK RETURN|TRUCK|luffy requests affix blithely among the bli +24577|811|78|2|14|23965.34|0.06|0.03|R|F|1993-04-20|1993-05-29|1993-05-04|COLLECT COD|RAIL|structions; accounts wake slyly +24577|1715|100|3|29|46884.59|0.05|0.03|R|F|1993-06-28|1993-05-16|1993-07-09|DELIVER IN PERSON|AIR|rays dazzle against the unusual +24578|1569|90|1|48|70586.88|0.08|0.05|N|O|1996-12-23|1996-12-02|1997-01-08|DELIVER IN PERSON|AIR|e. furiously unusual packages wake. furio +24579|1865|52|1|42|74208.12|0.05|0.06|A|F|1992-12-19|1993-01-02|1992-12-25|NONE|SHIP|s. sometimes unusual packages promise +24579|531|62|2|12|17178.36|0.07|0.04|R|F|1993-03-13|1993-01-03|1993-04-05|NONE|AIR|ly final theodo +24579|443|2|3|6|8060.64|0.07|0.08|R|F|1993-01-23|1992-12-26|1993-02-16|DELIVER IN PERSON|AIR|lly. bold pinto beans eat ca +24579|932|1|4|33|60486.69|0.06|0.07|A|F|1992-12-02|1993-01-21|1992-12-04|DELIVER IN PERSON|MAIL|ess packages. slyly close platelets ab +24579|563|24|5|36|52688.16|0.09|0.08|A|F|1993-01-05|1992-12-22|1993-01-26|COLLECT COD|TRUCK|y ironic packages. furiously bold +24579|693|87|6|18|28686.42|0.02|0.07|A|F|1993-01-07|1993-01-15|1993-01-27|DELIVER IN PERSON|AIR|ely ironic packages? quickly unusual reques +24580|1524|45|1|4|5702.08|0.10|0.05|A|F|1992-09-23|1992-09-14|1992-10-02|DELIVER IN PERSON|SHIP|nal reques +24580|606|7|2|3|4519.80|0.06|0.01|A|F|1992-10-16|1992-08-23|1992-10-28|NONE|AIR|efully bold +24580|291|46|3|43|51225.47|0.00|0.08|R|F|1992-10-02|1992-08-19|1992-10-24|DELIVER IN PERSON|TRUCK| blithely expr +24581|246|47|1|25|28656.00|0.10|0.01|A|F|1993-05-02|1993-06-12|1993-05-17|TAKE BACK RETURN|RAIL|usly unusual excuses cajole regularl +24581|1937|82|2|2|3677.86|0.05|0.05|R|F|1993-04-18|1993-06-19|1993-05-08|TAKE BACK RETURN|MAIL|its. special packages acr +24581|1600|1|3|29|43546.40|0.03|0.01|A|F|1993-04-26|1993-05-14|1993-05-15|COLLECT COD|MAIL|xes nag ca +24581|1538|59|4|13|18713.89|0.02|0.04|A|F|1993-04-15|1993-05-12|1993-04-26|DELIVER IN PERSON|FOB|ng to the final instru +24582|808|75|1|43|73478.40|0.04|0.00|N|O|1996-10-20|1996-08-31|1996-11-17|DELIVER IN PERSON|MAIL|ackages wake carefu +24582|631|32|2|6|9189.78|0.07|0.04|N|O|1996-07-08|1996-08-14|1996-07-27|NONE|FOB|foxes. quickly final pinto b +24582|1428|7|3|32|42541.44|0.05|0.01|N|O|1996-08-13|1996-09-15|1996-08-18|DELIVER IN PERSON|MAIL|instructio +24582|1557|58|4|30|43756.50|0.06|0.03|N|O|1996-07-26|1996-08-08|1996-07-30|DELIVER IN PERSON|MAIL|ronic instructions boo +24582|1947|36|5|12|22187.28|0.06|0.02|N|O|1996-07-17|1996-08-16|1996-08-14|TAKE BACK RETURN|RAIL|ccounts. accounts use slyly careful +24582|1458|37|6|18|24470.10|0.01|0.00|N|O|1996-08-10|1996-08-07|1996-08-24|COLLECT COD|RAIL|efully final +24583|1750|35|1|37|61114.75|0.03|0.00|N|O|1995-11-28|1995-10-11|1995-12-25|DELIVER IN PERSON|FOB|encies. slyly regular frays +24608|1637|38|1|43|66161.09|0.06|0.07|R|F|1992-10-28|1992-10-02|1992-11-11|DELIVER IN PERSON|FOB|ourts wake even, f +24608|1022|28|2|50|46151.00|0.00|0.08|A|F|1992-10-28|1992-10-04|1992-11-06|DELIVER IN PERSON|AIR|press somas: requests along the slyly +24608|1014|15|3|22|20130.22|0.06|0.02|A|F|1992-10-18|1992-09-26|1992-11-15|COLLECT COD|REG AIR|y slyly regular Tiresias. qu +24608|1970|3|4|10|18719.70|0.05|0.02|A|F|1992-11-04|1992-10-26|1992-11-19|NONE|FOB|bove the unusual dolphins cajole ca +24608|1033|34|5|9|8406.27|0.09|0.04|R|F|1992-09-28|1992-10-28|1992-10-04|TAKE BACK RETURN|TRUCK|special requests. requests use furiousl +24609|1955|100|1|49|90990.55|0.03|0.03|A|F|1994-09-10|1994-10-15|1994-09-14|NONE|RAIL|to beans. carefully re +24609|973|8|2|18|33731.46|0.08|0.05|R|F|1994-10-24|1994-10-01|1994-11-09|NONE|SHIP|ep above the daringly special pac +24609|1989|78|3|14|26473.72|0.01|0.05|R|F|1994-11-01|1994-09-29|1994-11-17|DELIVER IN PERSON|SHIP|ecial, even foxes sleep fur +24610|396|25|1|43|55744.77|0.02|0.07|A|F|1993-03-18|1993-03-30|1993-03-27|COLLECT COD|REG AIR|se quickly furiously ironic pi +24610|1203|41|2|36|39751.20|0.02|0.00|A|F|1993-02-06|1993-03-23|1993-02-20|COLLECT COD|REG AIR| blithely pe +24610|1305|6|3|47|56696.10|0.07|0.03|A|F|1993-03-18|1993-03-19|1993-03-19|TAKE BACK RETURN|REG AIR| the ironic inst +24610|40|16|4|46|43241.84|0.06|0.05|R|F|1993-04-26|1993-03-29|1993-05-21|COLLECT COD|MAIL|ly according +24610|1310|87|5|35|42395.85|0.09|0.08|R|F|1993-02-18|1993-03-05|1993-03-13|COLLECT COD|RAIL|s above the carefully regular depos +24610|1554|75|6|27|39299.85|0.10|0.08|A|F|1993-05-11|1993-03-08|1993-05-12|DELIVER IN PERSON|AIR|leep slyly. +24610|1462|80|7|20|27269.20|0.05|0.04|A|F|1993-05-17|1993-03-05|1993-06-13|COLLECT COD|FOB|nag fluffily pending theodolites. final, +24611|676|70|1|36|56760.12|0.02|0.03|N|O|1998-08-22|1998-09-01|1998-09-10|DELIVER IN PERSON|AIR|ts sleep furiously blithe +24611|1193|94|2|39|42673.41|0.08|0.07|N|O|1998-07-15|1998-07-29|1998-07-18|COLLECT COD|REG AIR|thely special accounts haggle careful +24611|406|7|3|17|22208.80|0.07|0.05|N|O|1998-09-29|1998-08-12|1998-10-24|COLLECT COD|AIR|lyly express +24611|328|57|4|35|42991.20|0.10|0.02|N|O|1998-07-17|1998-09-09|1998-08-07|COLLECT COD|TRUCK|side of the q +24611|1335|74|5|46|56871.18|0.05|0.03|N|O|1998-09-23|1998-09-10|1998-10-12|TAKE BACK RETURN|AIR|sual, ironic cou +24611|1606|48|6|28|42212.80|0.06|0.05|N|O|1998-07-13|1998-08-07|1998-07-15|DELIVER IN PERSON|REG AIR|atelets. furiously express a +24612|156|83|1|46|48582.90|0.09|0.07|R|F|1994-09-13|1994-08-16|1994-09-23|TAKE BACK RETURN|REG AIR|packages wake qu +24612|72|23|2|12|11664.84|0.07|0.04|A|F|1994-09-25|1994-08-29|1994-10-03|NONE|TRUCK| carefully after the slyly reg +24613|602|3|1|3|4507.80|0.09|0.07|R|F|1992-11-04|1992-08-27|1992-11-08|TAKE BACK RETURN|REG AIR|lites: ironic, pe +24613|873|74|2|47|83371.89|0.00|0.02|A|F|1992-07-21|1992-09-15|1992-08-13|NONE|TRUCK| the furiously final instructio +24613|185|38|3|50|54259.00|0.01|0.01|R|F|1992-10-29|1992-10-12|1992-11-26|COLLECT COD|AIR|ecial packages use; tithes wake al +24613|745|78|4|24|39497.76|0.01|0.01|A|F|1992-08-23|1992-09-20|1992-09-03|NONE|TRUCK|egular decoys. blithely ironic de +24613|400|29|5|13|16905.20|0.01|0.05|R|F|1992-09-10|1992-09-07|1992-09-26|TAKE BACK RETURN|RAIL|nag carefully ironic foxes. final pack +24613|505|36|6|7|9838.50|0.00|0.07|R|F|1992-07-26|1992-08-20|1992-07-27|COLLECT COD|TRUCK|quickly regul +24613|128|7|7|41|42152.92|0.09|0.04|A|F|1992-08-20|1992-08-16|1992-08-29|NONE|AIR|rays about the enticingly ex +24614|1500|1|1|2|2803.00|0.10|0.03|R|F|1994-12-18|1995-01-18|1994-12-25|TAKE BACK RETURN|TRUCK| bold instruct +24614|1269|7|2|1|1170.26|0.09|0.07|R|F|1995-01-31|1994-12-31|1995-02-26|COLLECT COD|SHIP|olites boost slyl +24614|509|70|3|14|19733.00|0.00|0.07|A|F|1994-12-28|1995-01-31|1995-01-06|DELIVER IN PERSON|FOB|ost furiously against the pen +24615|99|75|1|7|6993.63|0.04|0.05|A|F|1993-09-20|1993-09-28|1993-09-27|NONE|RAIL|ate quickly among the slyly regula +24615|866|66|2|50|88343.00|0.01|0.05|A|F|1993-08-30|1993-11-07|1993-09-14|TAKE BACK RETURN|MAIL|odolites. furiously even packages after t +24615|1181|54|3|20|21643.60|0.07|0.00|A|F|1993-09-15|1993-10-23|1993-10-02|DELIVER IN PERSON|REG AIR|ely expres +24640|626|58|1|40|61064.80|0.09|0.02|R|F|1995-05-31|1995-03-12|1995-06-07|TAKE BACK RETURN|MAIL|lithely unusual, ex +24640|1620|21|2|20|30432.40|0.04|0.07|R|F|1995-02-25|1995-04-29|1995-03-08|TAKE BACK RETURN|REG AIR|icingly regu +24640|382|67|3|17|21800.46|0.05|0.00|R|F|1995-04-23|1995-04-05|1995-05-23|TAKE BACK RETURN|TRUCK|tructions cajole. fluffily reg +24640|728|93|4|12|19544.64|0.04|0.05|R|F|1995-02-04|1995-03-24|1995-03-03|NONE|REG AIR|s print. requests +24640|1363|78|5|20|25287.20|0.03|0.07|A|F|1995-02-20|1995-03-08|1995-03-03|NONE|FOB|-- slyly regular theodolites wake qu +24640|914|49|6|29|52632.39|0.10|0.01|A|F|1995-05-31|1995-03-04|1995-06-03|TAKE BACK RETURN|MAIL|quests. furiously busy foxes c +24640|478|37|7|4|5513.88|0.10|0.06|A|F|1995-02-24|1995-03-17|1995-03-09|COLLECT COD|RAIL|furiously regular pains use furiously ac +24641|905|8|1|4|7223.60|0.00|0.04|N|O|1996-05-14|1996-05-03|1996-06-01|NONE|SHIP|symptotes. fluffily regula +24641|1755|98|2|37|61299.75|0.07|0.02|N|O|1996-04-06|1996-05-22|1996-04-13|NONE|MAIL|theodolites after the blith +24641|1832|62|3|22|38144.26|0.07|0.08|N|O|1996-06-05|1996-05-02|1996-06-28|NONE|AIR|ag special, regular pinto beans. bravely +24641|303|4|4|32|38505.60|0.02|0.03|N|O|1996-06-21|1996-05-24|1996-07-07|COLLECT COD|RAIL|nusual packages. final pinto beans integrat +24642|795|92|1|17|28828.43|0.08|0.01|N|O|1996-11-23|1997-01-12|1996-12-20|NONE|RAIL| dogged asymptotes detect furiously sly +24642|1895|25|2|39|70078.71|0.03|0.02|N|O|1996-11-21|1997-01-17|1996-12-01|DELIVER IN PERSON|TRUCK|alongside of the furiously bold pearls hagg +24642|625|19|3|30|45768.60|0.04|0.03|N|O|1996-10-30|1996-12-08|1996-11-09|TAKE BACK RETURN|SHIP|ate slyly. slyly bold p +24643|272|54|1|30|35168.10|0.03|0.01|R|F|1992-07-23|1992-07-05|1992-08-05|DELIVER IN PERSON|SHIP|carefully against the final pains. slyly bo +24643|1815|45|2|5|8584.05|0.05|0.00|R|F|1992-07-20|1992-06-16|1992-07-22|TAKE BACK RETURN|RAIL|quickly special ide +24644|1726|27|1|11|17904.92|0.04|0.00|R|F|1994-11-04|1994-10-05|1994-11-21|DELIVER IN PERSON|MAIL| after the carefully unusual requests slee +24644|1634|17|2|3|4606.89|0.01|0.03|R|F|1994-09-21|1994-10-06|1994-09-23|NONE|SHIP|st the quickly unusual packages a +24644|363|64|3|42|53061.12|0.08|0.08|A|F|1994-07-30|1994-10-09|1994-08-10|TAKE BACK RETURN|REG AIR|equests nag. quickly idle deposits cajole c +24645|1095|66|1|22|21913.98|0.04|0.05|R|F|1995-02-25|1995-01-27|1995-03-18|NONE|REG AIR|lar theodolites haggle slyly iron +24645|1047|83|2|29|27493.16|0.05|0.06|A|F|1995-01-23|1995-02-12|1995-02-15|NONE|AIR|unts are carefully: blithely +24646|1010|16|1|19|17309.19|0.00|0.05|N|O|1995-07-18|1995-05-24|1995-08-13|NONE|MAIL| shall cajole ideas. car +24646|720|21|2|19|30793.68|0.08|0.04|A|F|1995-05-19|1995-06-16|1995-06-03|COLLECT COD|RAIL|ackages. sometimes +24646|1599|40|3|32|48018.88|0.08|0.01|N|O|1995-06-28|1995-06-25|1995-07-18|NONE|SHIP|nic accounts nag slyly permane +24646|1043|14|4|19|17936.76|0.07|0.02|A|F|1995-05-20|1995-06-18|1995-06-12|NONE|TRUCK|side the bold e +24646|1877|7|5|12|21346.44|0.08|0.04|A|F|1995-04-26|1995-06-21|1995-04-29|COLLECT COD|SHIP|. ironic, regular warthogs mold slyly. +24646|1751|78|6|18|29749.50|0.04|0.02|N|O|1995-07-04|1995-06-07|1995-07-31|COLLECT COD|RAIL| requests. requests sleep furiously. +24647|611|74|1|18|27208.98|0.07|0.00|A|F|1994-09-08|1994-08-27|1994-10-07|TAKE BACK RETURN|MAIL|. carefully regular accounts sleep carefull +24647|1382|21|2|30|38501.40|0.08|0.02|R|F|1994-06-08|1994-08-16|1994-06-09|TAKE BACK RETURN|RAIL|ely bold orbits. furiously bold courts c +24647|850|51|3|8|14006.80|0.08|0.00|R|F|1994-10-03|1994-07-19|1994-10-06|COLLECT COD|MAIL|ickly dependencies. slyly bold foxes n +24647|1850|51|4|18|31533.30|0.07|0.00|R|F|1994-07-19|1994-08-31|1994-07-25|DELIVER IN PERSON|SHIP|ual deposits along the r +24647|1663|5|5|38|59457.08|0.10|0.03|A|F|1994-08-16|1994-07-15|1994-08-17|COLLECT COD|RAIL|ly final req +24647|1054|55|6|15|14325.75|0.10|0.07|R|F|1994-06-12|1994-08-15|1994-06-24|COLLECT COD|AIR|eposits eat +24672|1249|50|1|35|40258.40|0.01|0.06|A|F|1992-06-16|1992-04-29|1992-06-17|NONE|TRUCK|en foxes. regular requests haggle blit +24672|721|22|2|46|74599.12|0.10|0.03|R|F|1992-06-17|1992-05-02|1992-07-13|NONE|FOB|eas sleep careful +24672|1499|17|3|38|53218.62|0.02|0.06|A|F|1992-05-24|1992-06-02|1992-06-07|NONE|RAIL|s. furiously +24672|1945|90|4|15|27704.10|0.07|0.00|R|F|1992-07-06|1992-04-19|1992-07-20|COLLECT COD|RAIL|y final accounts. +24672|750|15|5|43|70982.25|0.01|0.07|A|F|1992-05-08|1992-04-30|1992-05-12|NONE|REG AIR|sts sleep carefully; +24672|1709|10|6|3|4832.10|0.04|0.01|A|F|1992-06-16|1992-04-17|1992-06-27|COLLECT COD|TRUCK|s. blithely final pinto beans nag furiou +24673|1119|20|1|37|37744.07|0.09|0.04|N|O|1997-08-25|1997-08-03|1997-09-04|COLLECT COD|FOB| fluffy requests wake alongside +24673|1115|16|2|34|34547.74|0.05|0.08|N|O|1997-06-29|1997-09-18|1997-07-26|TAKE BACK RETURN|SHIP|gular accounts after the care +24673|863|97|3|7|12347.02|0.04|0.01|N|O|1997-07-08|1997-09-02|1997-07-31|DELIVER IN PERSON|RAIL|ly final deposits. carefully +24674|1113|86|1|43|43606.73|0.00|0.04|N|O|1996-07-12|1996-07-03|1996-07-16|NONE|FOB|ully ironic accounts a +24674|1683|7|2|36|57048.48|0.05|0.01|N|O|1996-08-19|1996-06-26|1996-09-18|COLLECT COD|MAIL|posits boost fluffily. quickly f +24674|1652|35|3|14|21751.10|0.06|0.01|N|O|1996-06-11|1996-08-10|1996-06-13|DELIVER IN PERSON|MAIL|ke. theodolites across +24675|794|91|1|21|35590.59|0.05|0.08|R|F|1994-09-07|1994-06-30|1994-09-27|TAKE BACK RETURN|REG AIR|eep. dinos sleep +24676|1816|3|1|1|1717.81|0.10|0.07|A|F|1994-06-19|1994-06-23|1994-06-28|TAKE BACK RETURN|SHIP|o the regular, regular packages. sometimes +24676|834|68|2|7|12143.81|0.08|0.01|R|F|1994-05-13|1994-06-04|1994-06-02|TAKE BACK RETURN|REG AIR|e. slyly regular accounts sleep. s +24677|251|52|1|40|46050.00|0.08|0.08|A|F|1992-05-04|1992-04-05|1992-05-21|COLLECT COD|REG AIR|lly special ideas. exp +24678|972|75|1|38|71172.86|0.09|0.08|N|O|1997-09-21|1997-10-23|1997-10-21|DELIVER IN PERSON|FOB|he ironic foxes poach +24678|701|98|2|41|65669.70|0.06|0.08|N|O|1997-08-09|1997-10-14|1997-09-01|DELIVER IN PERSON|TRUCK|ounts. unusual, even wart +24678|944|79|3|7|12914.58|0.10|0.04|N|O|1997-09-16|1997-09-25|1997-09-18|TAKE BACK RETURN|AIR|lithely final notorn +24679|1801|88|1|30|51084.00|0.05|0.06|N|O|1995-07-25|1995-07-22|1995-08-19|NONE|MAIL| furiously final deposits sleep +24679|893|27|2|20|35877.80|0.09|0.08|N|O|1995-08-23|1995-06-22|1995-09-07|NONE|FOB|ickly special plate +24679|1397|74|3|39|50637.21|0.10|0.01|A|F|1995-05-09|1995-06-22|1995-05-31|COLLECT COD|SHIP|yly regular depende +24679|249|4|4|48|55163.52|0.02|0.03|N|O|1995-08-04|1995-06-27|1995-08-06|COLLECT COD|REG AIR|ly final accounts sleep. +24679|922|25|5|33|60156.36|0.10|0.03|N|O|1995-08-19|1995-07-29|1995-09-09|TAKE BACK RETURN|SHIP|cajole. blithel +24679|261|62|6|10|11612.60|0.05|0.03|N|O|1995-08-21|1995-07-14|1995-08-24|DELIVER IN PERSON|FOB|sual dependencies. silen +24679|1472|51|7|3|4120.41|0.00|0.05|N|O|1995-06-21|1995-07-08|1995-07-05|DELIVER IN PERSON|RAIL|onic asymptotes sleep among the slyly re +24704|79|55|1|11|10769.77|0.00|0.05|A|F|1994-12-11|1994-12-06|1994-12-21|NONE|RAIL|ly unusual platelets. pearls na +24704|161|62|2|25|26529.00|0.08|0.07|A|F|1995-01-14|1995-01-24|1995-02-08|NONE|FOB|pending foxes. fluffil +24705|317|46|1|36|43823.16|0.03|0.04|N|O|1995-12-07|1995-11-15|1995-12-28|DELIVER IN PERSON|RAIL|uriously quick instructions. furiously fina +24705|899|100|2|42|75595.38|0.09|0.08|N|O|1995-09-26|1995-10-26|1995-10-08|DELIVER IN PERSON|AIR|refully express instructions. care +24705|1692|16|3|12|19124.28|0.06|0.01|N|O|1995-12-12|1995-10-22|1995-12-22|COLLECT COD|SHIP|e regular packages use pe +24706|1058|64|1|3|2877.15|0.10|0.01|A|F|1992-08-14|1992-07-22|1992-08-25|DELIVER IN PERSON|RAIL|ng accounts maintain. re +24706|158|11|2|12|12697.80|0.03|0.04|A|F|1992-05-15|1992-05-27|1992-05-28|COLLECT COD|MAIL|uctions sleep slyly ironic asymptotes. qu +24706|25|51|3|15|13875.30|0.00|0.03|R|F|1992-08-22|1992-05-26|1992-09-06|TAKE BACK RETURN|TRUCK|final foxes use carefully slyly fina +24707|1240|15|1|5|5706.20|0.03|0.03|A|F|1992-05-21|1992-04-13|1992-06-14|COLLECT COD|TRUCK|arefully afte +24707|1186|95|2|42|45661.56|0.08|0.03|A|F|1992-05-25|1992-04-10|1992-05-28|DELIVER IN PERSON|REG AIR|deposits. bl +24707|1244|82|3|12|13742.88|0.02|0.04|A|F|1992-07-06|1992-05-19|1992-08-01|NONE|RAIL|slyly above the +24707|29|30|4|40|37160.80|0.06|0.00|A|F|1992-04-11|1992-04-23|1992-04-19|COLLECT COD|FOB|furiously regula +24707|335|20|5|18|22235.94|0.02|0.07|R|F|1992-06-08|1992-04-24|1992-07-02|COLLECT COD|REG AIR|nic accounts. care +24708|1588|69|1|31|46176.98|0.02|0.02|R|F|1993-01-12|1993-01-25|1993-01-31|COLLECT COD|TRUCK|lly pending accounts. blithe +24709|1057|63|1|16|15328.80|0.10|0.06|R|F|1995-05-01|1995-03-22|1995-05-26|NONE|RAIL|y regular deposits boost careful +24710|1850|51|1|32|56059.20|0.02|0.00|R|F|1994-01-26|1993-11-15|1994-02-06|DELIVER IN PERSON|MAIL|y final packa +24710|710|7|2|1|1610.71|0.00|0.00|A|F|1993-12-10|1993-11-29|1993-12-18|TAKE BACK RETURN|RAIL|mptotes hag +24711|1353|30|1|43|53937.05|0.10|0.02|R|F|1992-12-11|1992-12-07|1992-12-27|COLLECT COD|RAIL|xpress deposits nag fluffily across the +24711|1588|29|2|3|4468.74|0.05|0.06|R|F|1993-01-29|1992-12-10|1993-02-14|DELIVER IN PERSON|AIR|riously special cou +24711|1665|48|3|33|51699.78|0.09|0.05|R|F|1992-12-15|1993-01-21|1992-12-17|DELIVER IN PERSON|MAIL|s. pinto beans maintain. furiousl +24711|771|4|4|23|38450.71|0.06|0.06|A|F|1993-02-25|1993-01-08|1993-03-21|DELIVER IN PERSON|REG AIR|nwind blithely. quickly regu +24711|416|17|5|43|56605.63|0.08|0.04|R|F|1993-01-17|1993-01-04|1993-02-08|TAKE BACK RETURN|REG AIR|g to the regular +24711|46|47|6|1|946.04|0.00|0.02|A|F|1992-11-05|1993-01-17|1992-11-07|COLLECT COD|SHIP|egular courts. p +24711|5|81|7|5|4525.00|0.01|0.07|A|F|1992-12-29|1993-01-14|1993-01-22|NONE|RAIL|ole along the slyly bold deposits. furiousl +24736|1988|77|1|50|94499.00|0.08|0.05|N|O|1998-03-14|1998-03-17|1998-03-18|TAKE BACK RETURN|RAIL|cies mold across the +24736|512|13|2|42|59325.42|0.05|0.01|N|O|1998-04-01|1998-03-31|1998-04-12|TAKE BACK RETURN|FOB|lyly pending asymp +24736|1173|74|3|25|26854.25|0.04|0.03|N|O|1998-01-26|1998-02-28|1998-02-09|DELIVER IN PERSON|RAIL|he ironic, +24736|1226|64|4|49|55233.78|0.01|0.00|N|O|1998-02-23|1998-03-01|1998-03-21|COLLECT COD|MAIL| according to the blithely fi +24736|480|81|5|5|6902.40|0.07|0.05|N|O|1998-04-06|1998-04-06|1998-04-16|NONE|SHIP|cuses. unusual instructions l +24736|1590|31|6|17|25357.03|0.09|0.01|N|O|1998-02-11|1998-03-16|1998-03-12|TAKE BACK RETURN|AIR|xcuses are +24736|1140|41|7|41|42686.74|0.10|0.00|N|O|1998-03-28|1998-03-24|1998-04-01|COLLECT COD|MAIL|e quickly pending foxes. ev +24737|1235|36|1|45|51130.35|0.02|0.03|R|F|1995-03-21|1995-01-28|1995-04-03|COLLECT COD|REG AIR|equests. i +24737|1620|3|2|20|30432.40|0.06|0.01|R|F|1995-04-05|1995-01-16|1995-05-04|COLLECT COD|FOB|ully final packages sleep blithely +24737|308|93|3|38|45915.40|0.02|0.07|R|F|1995-01-13|1995-02-21|1995-02-07|NONE|RAIL|en foxes boost multipliers. slyly brave pla +24737|697|29|4|43|68700.67|0.01|0.07|R|F|1995-01-17|1995-01-29|1995-02-09|DELIVER IN PERSON|TRUCK|l instructions sleep. fluffily +24737|180|33|5|33|35645.94|0.03|0.01|R|F|1995-03-31|1995-02-13|1995-04-10|COLLECT COD|MAIL|o beans haggle quickly-- carefully regu +24738|1420|99|1|18|23785.56|0.08|0.00|A|F|1994-02-25|1993-12-31|1994-03-03|TAKE BACK RETURN|RAIL|e carefully unu +24738|1395|10|2|29|37595.31|0.08|0.07|R|F|1994-02-06|1994-01-28|1994-02-28|NONE|MAIL|fluffily i +24739|596|57|1|43|64353.37|0.07|0.00|N|O|1996-09-04|1996-08-05|1996-09-21|NONE|FOB|ully according to t +24739|1875|19|2|37|65744.19|0.04|0.06|N|O|1996-09-07|1996-07-02|1996-10-07|TAKE BACK RETURN|REG AIR| regular, regular accou +24740|73|49|1|14|13622.98|0.03|0.08|R|F|1993-02-03|1993-03-09|1993-02-08|DELIVER IN PERSON|FOB|to the regular pinto beans. t +24740|708|9|2|27|43434.90|0.02|0.08|R|F|1993-01-15|1993-02-22|1993-02-12|DELIVER IN PERSON|FOB| requests wake careful +24741|1163|64|1|26|27668.16|0.08|0.08|N|O|1996-12-11|1997-01-16|1996-12-24|COLLECT COD|TRUCK| deposits sleep cl +24741|1251|52|2|47|54155.75|0.01|0.08|N|O|1997-01-25|1996-12-23|1997-02-15|NONE|MAIL|osits sleep carefull +24742|752|17|1|42|69415.50|0.08|0.05|R|F|1995-04-27|1995-06-12|1995-05-08|NONE|TRUCK|ess requests affix +24743|1105|42|1|29|29176.90|0.02|0.08|A|F|1992-10-21|1992-08-31|1992-11-13|NONE|MAIL|uickly to the +24743|283|84|2|28|33131.84|0.01|0.04|A|F|1992-08-04|1992-08-04|1992-08-16|COLLECT COD|SHIP|ndencies use +24743|997|66|3|11|20877.89|0.10|0.01|R|F|1992-08-28|1992-09-04|1992-09-19|DELIVER IN PERSON|AIR| regular theodolites sleep +24768|509|100|1|5|7047.50|0.09|0.08|N|O|1998-05-19|1998-07-07|1998-05-28|NONE|MAIL|ideas among the slyly pendin +24768|1910|43|2|27|48921.57|0.09|0.06|N|O|1998-08-03|1998-07-28|1998-08-25|TAKE BACK RETURN|MAIL| pinto beans us +24768|178|31|3|38|40970.46|0.01|0.06|N|O|1998-06-19|1998-06-19|1998-06-24|TAKE BACK RETURN|TRUCK|y final deposits c +24769|543|74|1|28|40419.12|0.07|0.05|N|O|1995-11-27|1995-12-29|1995-12-22|NONE|MAIL|bove the ironicall +24769|900|100|2|13|23411.70|0.07|0.06|N|O|1995-12-26|1996-01-20|1996-01-11|COLLECT COD|TRUCK|ole slyly final +24769|1422|23|3|26|34408.92|0.03|0.05|N|O|1995-12-11|1996-02-01|1996-01-09|DELIVER IN PERSON|MAIL|he final accounts. quiet hockey players b +24769|982|51|4|44|82851.12|0.09|0.06|N|O|1995-12-20|1996-02-05|1995-12-23|NONE|TRUCK|y after the sile +24769|183|10|5|21|22746.78|0.04|0.00|N|O|1996-02-19|1996-01-20|1996-02-21|TAKE BACK RETURN|RAIL|y furious foxes sleep furiously. fur +24769|1074|75|6|41|39977.87|0.08|0.06|N|O|1996-01-22|1996-01-06|1996-02-06|NONE|RAIL| express foxes are carefully c +24769|138|39|7|3|3114.39|0.01|0.08|N|O|1996-03-02|1996-01-03|1996-03-10|NONE|AIR|even packages across +24770|206|61|1|3|3318.60|0.09|0.00|A|F|1992-06-25|1992-05-27|1992-07-16|TAKE BACK RETURN|MAIL|olites. unusual instructions +24770|537|28|2|40|57501.20|0.04|0.00|A|F|1992-04-17|1992-05-05|1992-05-14|NONE|MAIL|side of the slyl +24771|726|27|1|50|81336.00|0.10|0.02|N|O|1996-08-05|1996-05-21|1996-08-21|COLLECT COD|AIR|counts affix among the final, +24771|1951|40|2|28|51882.60|0.04|0.04|N|O|1996-04-29|1996-06-15|1996-05-21|COLLECT COD|AIR|notornis after +24771|943|12|3|33|60850.02|0.06|0.04|N|O|1996-07-10|1996-07-04|1996-07-19|COLLECT COD|REG AIR|deas along the deposits dou +24772|132|59|1|13|13417.69|0.00|0.05|N|O|1996-09-17|1996-08-25|1996-10-06|COLLECT COD|MAIL|thely special accounts w +24773|1264|39|1|5|5826.30|0.10|0.08|N|O|1998-07-28|1998-06-11|1998-08-23|TAKE BACK RETURN|AIR|n requests acro +24773|770|35|2|29|48452.33|0.06|0.04|N|O|1998-08-17|1998-05-24|1998-09-07|TAKE BACK RETURN|AIR|y after the blithely ironic +24773|1269|81|3|13|15213.38|0.09|0.04|N|O|1998-05-08|1998-07-20|1998-05-12|TAKE BACK RETURN|SHIP|e the fluffily quick foxes. fluffi +24773|1488|67|4|19|26400.12|0.06|0.02|N|O|1998-06-12|1998-06-07|1998-06-16|DELIVER IN PERSON|MAIL|larly against the unusual deposits. +24773|1946|47|5|2|3695.88|0.06|0.03|N|O|1998-05-25|1998-06-30|1998-06-03|TAKE BACK RETURN|RAIL|e carefully after the +24774|1478|79|1|3|4138.41|0.05|0.07|N|O|1997-06-22|1997-08-11|1997-07-15|NONE|SHIP| close, special packages wake slyly c +24774|166|45|2|40|42646.40|0.02|0.02|N|O|1997-06-06|1997-07-15|1997-06-11|TAKE BACK RETURN|REG AIR|e quickly reg +24774|324|53|3|25|30608.00|0.04|0.06|N|O|1997-06-06|1997-08-14|1997-06-12|NONE|AIR|r requests. final, ironic requests along th +24775|1150|51|1|42|44148.30|0.09|0.02|R|F|1992-06-01|1992-04-20|1992-06-05|NONE|MAIL|slyly ironic instructions. slyly i +24775|448|36|2|7|9439.08|0.07|0.03|A|F|1992-05-23|1992-04-18|1992-06-19|COLLECT COD|TRUCK|he regular pinto beans. quickly pen +24800|1828|15|1|50|86491.00|0.03|0.04|N|O|1998-05-28|1998-06-15|1998-05-29|DELIVER IN PERSON|SHIP|bout the fluffily unusual deposits. eve +24800|398|99|2|40|51935.60|0.05|0.03|N|O|1998-06-05|1998-06-07|1998-07-05|COLLECT COD|AIR|cross the deposits! deposits detect. somet +24800|1536|17|3|43|61813.79|0.06|0.08|N|O|1998-06-18|1998-05-31|1998-07-16|NONE|MAIL|ependencies are around th +24800|1024|95|4|50|46251.00|0.07|0.02|N|O|1998-05-12|1998-05-20|1998-05-31|COLLECT COD|RAIL|r asymptotes. blithely ironic +24801|1616|40|1|1|1517.61|0.09|0.02|R|F|1992-12-11|1993-01-12|1992-12-22|TAKE BACK RETURN|FOB|ly. quickly +24801|360|45|2|9|11343.24|0.10|0.01|R|F|1993-03-10|1992-12-24|1993-03-19|NONE|REG AIR|al deposits wake furio +24801|356|13|3|10|12563.50|0.05|0.02|A|F|1992-11-25|1993-01-03|1992-12-23|NONE|RAIL| the special packages-- bl +24801|1974|75|4|23|43147.31|0.10|0.01|A|F|1993-02-11|1992-12-18|1993-02-28|COLLECT COD|REG AIR|ackages are slyly special id +24801|1308|85|5|7|8465.10|0.07|0.08|A|F|1993-01-11|1993-02-03|1993-02-08|DELIVER IN PERSON|MAIL|bold requests ought to haggle furio +24801|1607|90|6|3|4525.80|0.07|0.06|R|F|1992-12-03|1993-02-08|1992-12-19|TAKE BACK RETURN|AIR|press pinto beans wake blithely sil +24802|1731|58|1|30|48981.90|0.02|0.01|R|F|1994-01-26|1994-04-11|1994-02-22|TAKE BACK RETURN|MAIL|ost carefully across th +24802|1731|16|2|22|35920.06|0.07|0.07|R|F|1994-02-05|1994-03-09|1994-02-23|COLLECT COD|RAIL|e the carefully regular instructions. eve +24803|56|57|1|47|44934.35|0.07|0.00|N|O|1997-03-16|1997-05-09|1997-04-05|NONE|AIR|carefully furiously busy foxes. blithely +24803|1390|5|2|46|59403.94|0.02|0.04|N|O|1997-04-29|1997-04-12|1997-05-20|NONE|FOB|r the platelets. quickly silent d +24804|507|8|1|35|49262.50|0.04|0.03|N|O|1995-09-20|1995-08-25|1995-09-21|COLLECT COD|REG AIR|ing accounts across the fin +24804|807|8|2|35|59773.00|0.00|0.03|N|O|1995-07-16|1995-08-08|1995-07-30|DELIVER IN PERSON|FOB|as. quickly re +24805|361|46|1|20|25227.20|0.05|0.03|A|F|1995-01-18|1994-12-27|1995-01-21|NONE|RAIL|furiously. blithely unusual plate +24805|1921|10|2|43|78385.56|0.01|0.04|A|F|1995-01-22|1995-02-01|1995-02-07|NONE|RAIL|unts. always regular asymptotes wake. s +24806|679|73|1|21|33173.07|0.00|0.01|R|F|1993-09-21|1993-11-24|1993-10-02|TAKE BACK RETURN|AIR|gular forges. carefull +24806|242|24|2|19|21702.56|0.09|0.08|R|F|1993-09-30|1993-11-18|1993-10-04|COLLECT COD|TRUCK|accounts. fluffily unusual platelets affix +24806|1255|93|3|9|10406.25|0.07|0.00|A|F|1993-10-25|1993-11-23|1993-11-23|NONE|REG AIR|lar dependencie +24807|69|95|1|13|12597.78|0.01|0.07|N|O|1996-07-11|1996-05-27|1996-08-05|COLLECT COD|AIR| fluffily regular packages wake +24832|1796|81|1|47|79796.13|0.05|0.03|N|O|1997-04-20|1997-04-21|1997-05-18|TAKE BACK RETURN|RAIL|g above the blithel +24832|65|16|2|50|48253.00|0.05|0.05|N|O|1997-03-25|1997-05-01|1997-04-04|DELIVER IN PERSON|REG AIR|olites cajole car +24832|1280|55|3|25|29532.00|0.06|0.07|N|O|1997-06-25|1997-05-20|1997-06-26|DELIVER IN PERSON|RAIL|s regular ideas. quiet, ev +24832|958|93|4|46|85511.70|0.08|0.06|N|O|1997-04-22|1997-05-01|1997-05-20|NONE|SHIP|carefully ironic packages wake furiousl +24832|1977|22|5|32|60127.04|0.02|0.05|N|O|1997-06-18|1997-05-31|1997-07-04|COLLECT COD|REG AIR|riously pending forges abou +24832|823|57|6|50|86191.00|0.05|0.04|N|O|1997-06-10|1997-05-02|1997-07-01|COLLECT COD|TRUCK|ons. slyly silent +24833|1380|81|1|6|7688.28|0.10|0.05|A|F|1993-11-04|1993-10-02|1993-11-28|TAKE BACK RETURN|MAIL|olphins wake. careful +24833|1017|88|2|39|35802.39|0.07|0.02|R|F|1993-07-30|1993-08-21|1993-08-03|NONE|MAIL|the ironic ideas +24833|1418|58|3|25|32985.25|0.09|0.06|R|F|1993-10-28|1993-09-12|1993-11-24|NONE|FOB|eodolites after the furi +24833|176|29|4|30|32285.10|0.03|0.05|A|F|1993-11-01|1993-09-26|1993-11-29|NONE|AIR|riously reg +24833|1763|48|5|20|33295.20|0.07|0.06|A|F|1993-08-24|1993-08-24|1993-09-22|NONE|RAIL|packages. quickly regular pinto +24833|558|59|6|13|18961.15|0.10|0.06|R|F|1993-09-14|1993-10-05|1993-10-09|DELIVER IN PERSON|MAIL|egular somas use carefully furiously bo +24834|295|50|1|30|35858.70|0.07|0.06|A|F|1994-07-20|1994-07-28|1994-07-30|NONE|SHIP|lithely ironic requests +24835|1135|72|1|45|46625.85|0.02|0.01|N|O|1998-04-02|1998-03-04|1998-04-29|COLLECT COD|MAIL|arefully final platelets about the re +24835|1971|4|2|20|37459.40|0.00|0.07|N|O|1998-05-10|1998-04-24|1998-05-14|NONE|TRUCK|es. quickly special +24836|745|42|1|13|21394.62|0.07|0.03|N|O|1998-07-19|1998-07-29|1998-08-13|TAKE BACK RETURN|MAIL|elets. sly +24836|683|46|2|38|60179.84|0.09|0.02|N|O|1998-07-05|1998-06-27|1998-07-16|DELIVER IN PERSON|REG AIR|across the boldly bold t +24836|1543|64|3|36|52003.44|0.08|0.07|N|O|1998-06-29|1998-08-03|1998-07-16|DELIVER IN PERSON|SHIP| according to the enticin +24836|1928|73|4|19|34768.48|0.05|0.05|N|O|1998-08-31|1998-07-13|1998-09-12|COLLECT COD|MAIL|hogs. blithely r +24836|1462|2|5|18|24542.28|0.08|0.03|N|O|1998-06-02|1998-06-28|1998-06-03|COLLECT COD|REG AIR| furiously +24836|788|21|6|26|43908.28|0.07|0.03|N|O|1998-06-15|1998-07-09|1998-07-15|NONE|AIR|: slyly express depos +24837|630|31|1|16|24490.08|0.04|0.00|N|O|1997-06-04|1997-06-12|1997-06-20|DELIVER IN PERSON|RAIL|egular theodolit +24837|928|31|2|35|64012.20|0.01|0.08|N|O|1997-07-23|1997-05-30|1997-08-08|NONE|REG AIR|xpress deposits haggle ca +24837|197|76|3|29|31818.51|0.00|0.04|N|O|1997-07-14|1997-06-17|1997-08-09|DELIVER IN PERSON|TRUCK| foxes cajole alon +24837|1216|17|4|20|22344.20|0.00|0.02|N|O|1997-07-09|1997-06-06|1997-07-17|TAKE BACK RETURN|MAIL|efully ironic +24837|1205|43|5|46|50885.20|0.05|0.00|N|O|1997-08-10|1997-05-30|1997-08-30|DELIVER IN PERSON|RAIL|s sleep carefully. blithely regul +24838|626|89|1|17|25952.54|0.07|0.04|N|O|1997-08-18|1997-07-24|1997-08-26|COLLECT COD|AIR|press asymptotes about the blith +24838|1214|52|2|27|30110.67|0.10|0.02|N|O|1997-08-28|1997-07-31|1997-09-06|TAKE BACK RETURN|TRUCK| carefully carefully special requests +24838|1872|16|3|47|83371.89|0.02|0.05|N|O|1997-07-27|1997-08-15|1997-08-12|TAKE BACK RETURN|TRUCK| blithely ironic theodolites are +24838|849|50|4|21|36746.64|0.02|0.00|N|O|1997-08-13|1997-09-17|1997-08-29|NONE|FOB| ironic courts. daringly regular g +24838|1146|83|5|21|21989.94|0.07|0.02|N|O|1997-07-25|1997-07-25|1997-07-27|NONE|REG AIR|ct about the r +24838|1598|99|6|14|20994.26|0.02|0.04|N|O|1997-08-28|1997-08-13|1997-09-13|NONE|REG AIR|t the quickly regular acc +24838|735|100|7|20|32714.60|0.02|0.03|N|O|1997-10-19|1997-09-18|1997-10-24|COLLECT COD|TRUCK|kages are furiously iron +24839|1371|86|1|4|5089.48|0.06|0.04|N|O|1998-09-28|1998-09-21|1998-10-20|COLLECT COD|AIR|in ideas! slyly final packages +24839|800|65|2|43|73134.40|0.03|0.05|N|O|1998-08-11|1998-09-23|1998-08-12|NONE|AIR| furiously ironic package +24839|89|65|3|25|24727.00|0.02|0.00|N|O|1998-08-01|1998-10-17|1998-08-25|COLLECT COD|REG AIR|ndencies shall are blithel +24839|1671|95|4|50|78633.50|0.06|0.04|N|O|1998-09-10|1998-10-07|1998-10-08|COLLECT COD|REG AIR|into beans wa +24839|1223|35|5|33|37099.26|0.07|0.06|N|O|1998-10-12|1998-08-29|1998-11-10|DELIVER IN PERSON|RAIL|deposits sleep carefully about the regu +24839|38|89|6|9|8442.27|0.03|0.03|N|O|1998-09-23|1998-09-26|1998-10-05|COLLECT COD|MAIL|ven account +24839|1122|59|7|37|37855.44|0.01|0.04|N|O|1998-09-17|1998-09-21|1998-10-08|NONE|AIR| final packages above the qu +24864|1091|92|1|6|5952.54|0.10|0.03|A|F|1992-02-19|1992-02-15|1992-02-29|COLLECT COD|MAIL|ly unusual depths across the ironi +24864|1048|54|2|22|20878.88|0.00|0.00|R|F|1992-04-11|1992-04-09|1992-05-10|COLLECT COD|SHIP|affix slyly. even, fi +24864|1389|28|3|17|21936.46|0.05|0.08|A|F|1992-04-15|1992-03-27|1992-04-21|DELIVER IN PERSON|RAIL|ages snooze finally again +24864|1802|32|4|23|39187.40|0.01|0.00|A|F|1992-04-08|1992-02-22|1992-04-23|COLLECT COD|TRUCK|ructions. blithel +24864|1120|93|5|35|35739.20|0.08|0.05|R|F|1992-04-09|1992-02-15|1992-04-24|COLLECT COD|FOB|ts was blit +24864|1444|62|6|24|32290.56|0.08|0.08|A|F|1992-04-03|1992-04-12|1992-04-23|NONE|FOB|theodolites. asymptotes sleep ab +24865|503|94|1|35|49122.50|0.06|0.01|R|F|1992-06-07|1992-05-21|1992-06-27|COLLECT COD|SHIP|xes. stealt +24865|1351|90|2|31|38822.85|0.09|0.02|A|F|1992-04-23|1992-04-24|1992-05-06|COLLECT COD|TRUCK|ly fluffy packa +24865|1227|39|3|37|41744.14|0.05|0.05|R|F|1992-07-13|1992-04-19|1992-08-05|NONE|REG AIR|efully fluffily final packages. ca +24865|255|56|4|20|23105.00|0.08|0.05|R|F|1992-03-27|1992-06-06|1992-04-15|DELIVER IN PERSON|FOB|ously to the quickly iro +24865|5|31|5|30|27150.00|0.09|0.05|A|F|1992-07-05|1992-05-18|1992-07-28|COLLECT COD|SHIP|nt packages are. slyly bold dependenci +24865|1768|69|6|2|3339.52|0.03|0.06|R|F|1992-04-05|1992-05-30|1992-04-09|TAKE BACK RETURN|FOB|ages sleep along the doggedly fi +24865|738|35|7|27|44245.71|0.04|0.04|A|F|1992-04-17|1992-05-09|1992-05-04|TAKE BACK RETURN|TRUCK|sits wake ruthlessly. bl +24866|1521|62|1|41|58323.32|0.06|0.05|R|F|1993-12-20|1994-01-09|1994-01-06|COLLECT COD|MAIL|de of the pending deposits dete +24866|1405|84|2|6|7838.40|0.02|0.08|R|F|1993-12-16|1994-02-04|1994-01-01|TAKE BACK RETURN|FOB|y final foxes: fluffily pendin +24866|924|25|3|46|83946.32|0.10|0.03|A|F|1994-02-05|1994-03-04|1994-03-01|NONE|MAIL|usual accounts. quickly final excuses +24866|1|52|4|22|19822.00|0.09|0.03|A|F|1994-01-14|1994-02-06|1994-01-31|NONE|SHIP|rts. requests nag quickly to the +24867|1238|13|1|11|12531.53|0.03|0.04|R|F|1994-05-23|1994-04-17|1994-06-10|DELIVER IN PERSON|RAIL|unusual deposits boost blithely above th +24868|1232|70|1|5|5666.15|0.05|0.02|A|F|1992-07-20|1992-07-05|1992-08-04|NONE|RAIL|d accounts. regular ideas believe behin +24868|1332|47|2|49|60433.17|0.03|0.06|A|F|1992-05-30|1992-08-25|1992-06-20|NONE|SHIP|ronic deposits. silent accounts +24868|51|52|3|23|21874.15|0.01|0.01|R|F|1992-05-30|1992-07-17|1992-05-31|TAKE BACK RETURN|MAIL| above the requests. furiously final pi +24868|179|58|4|13|14029.21|0.02|0.02|R|F|1992-06-09|1992-08-20|1992-07-03|NONE|RAIL|ing accounts h +24868|228|29|5|28|31590.16|0.10|0.02|R|F|1992-09-06|1992-07-01|1992-09-28|NONE|TRUCK|enly special packages +24868|1069|75|6|33|32011.98|0.00|0.05|A|F|1992-07-13|1992-08-17|1992-07-21|TAKE BACK RETURN|REG AIR|ular pinto beans. furiously +24868|1238|39|7|26|29619.98|0.10|0.02|A|F|1992-07-07|1992-07-26|1992-07-23|NONE|SHIP|dinos after the fluffily +24869|486|87|1|17|23570.16|0.07|0.03|R|F|1994-07-16|1994-08-12|1994-08-02|DELIVER IN PERSON|FOB|encies integrate slyly car +24869|489|19|2|14|19452.72|0.07|0.03|A|F|1994-06-21|1994-07-19|1994-07-16|NONE|AIR|e along the fluffily pending requests. f +24869|463|22|3|43|58628.78|0.01|0.05|R|F|1994-08-22|1994-08-13|1994-09-02|TAKE BACK RETURN|FOB| furiously final deposits according +24869|1998|43|4|4|7599.96|0.04|0.02|A|F|1994-09-23|1994-07-24|1994-10-12|DELIVER IN PERSON|RAIL|s nag quickly across +24869|1719|62|5|4|6482.84|0.09|0.02|A|F|1994-10-06|1994-08-26|1994-10-29|COLLECT COD|MAIL| even requests. pending ideas across +24869|98|99|6|43|42917.87|0.07|0.01|A|F|1994-10-07|1994-09-04|1994-10-17|TAKE BACK RETURN|TRUCK|ithely quickly pe +24869|960|95|7|39|72577.44|0.03|0.04|A|F|1994-10-02|1994-08-21|1994-10-17|NONE|MAIL|along the bold excuses. final req +24870|91|42|1|27|26759.43|0.01|0.08|A|F|1994-08-07|1994-07-02|1994-09-02|NONE|TRUCK|pecial instructions need +24870|1246|84|2|10|11472.40|0.04|0.01|A|F|1994-06-27|1994-06-28|1994-07-11|NONE|SHIP|regular theodo +24870|1317|56|3|40|48732.40|0.09|0.06|R|F|1994-05-13|1994-07-18|1994-05-30|NONE|TRUCK| to the ideas. blithely ironic ac +24871|600|91|1|48|72028.80|0.00|0.07|A|F|1995-05-21|1995-06-16|1995-05-30|TAKE BACK RETURN|REG AIR|iously expres +24871|788|21|2|42|70928.76|0.09|0.08|N|O|1995-07-17|1995-05-27|1995-08-01|DELIVER IN PERSON|MAIL|erns-- slyly final deposits nag. care +24871|1295|70|3|6|7177.74|0.10|0.04|N|O|1995-07-17|1995-06-17|1995-07-21|COLLECT COD|FOB| unusual requests. +24871|1487|88|4|43|59704.64|0.03|0.04|N|O|1995-07-10|1995-06-06|1995-07-25|TAKE BACK RETURN|FOB|e thinly. +24871|1549|50|5|24|34812.96|0.05|0.06|N|F|1995-06-12|1995-05-28|1995-07-04|COLLECT COD|RAIL|indle quickly. caref +24871|835|35|6|3|5207.49|0.08|0.04|R|F|1995-05-17|1995-05-04|1995-06-12|DELIVER IN PERSON|REG AIR|s. unusual ideas use carefully. +24871|957|92|7|40|74318.00|0.03|0.01|A|F|1995-04-14|1995-05-20|1995-05-13|DELIVER IN PERSON|TRUCK|mong the theodolites! grouches are fur +24896|842|42|1|43|74942.12|0.03|0.03|R|F|1993-05-16|1993-04-18|1993-06-13|DELIVER IN PERSON|RAIL|eas sublate blithely +24896|1517|58|2|11|15603.61|0.07|0.01|R|F|1993-02-21|1993-05-02|1993-03-13|DELIVER IN PERSON|TRUCK|nst the blithely express f +24896|1352|29|3|15|18800.25|0.01|0.03|A|F|1993-03-21|1993-04-12|1993-03-24|TAKE BACK RETURN|TRUCK|lly patterns. blithely final foxes w +24897|1529|30|1|30|42915.60|0.10|0.04|N|O|1998-02-21|1998-03-30|1998-03-02|DELIVER IN PERSON|RAIL|y sometimes bold d +24897|1303|80|2|49|59010.70|0.03|0.08|N|O|1998-04-30|1998-04-07|1998-05-19|NONE|RAIL|y regular deposits are along the +24897|1173|46|3|10|10741.70|0.09|0.02|N|O|1998-04-23|1998-04-25|1998-05-03|COLLECT COD|SHIP|s. furiously final deposits will have to c +24898|55|56|1|45|42977.25|0.02|0.02|N|O|1997-02-03|1997-04-04|1997-03-01|COLLECT COD|TRUCK|ructions cajole quic +24898|1675|99|2|33|52030.11|0.04|0.08|N|O|1997-04-24|1997-03-17|1997-05-13|NONE|MAIL|quests. fluffily eve +24898|769|70|3|8|13358.08|0.10|0.03|N|O|1997-04-17|1997-04-06|1997-04-29|TAKE BACK RETURN|MAIL|ven decoys are across the slyly idle fox +24898|1590|71|4|20|29831.80|0.07|0.06|N|O|1997-01-21|1997-03-14|1997-01-24|DELIVER IN PERSON|MAIL| the even +24898|1067|38|5|45|43562.70|0.03|0.04|N|O|1997-05-16|1997-04-18|1997-06-01|TAKE BACK RETURN|TRUCK|ly special packages play carefull +24898|178|79|6|36|38814.12|0.06|0.03|N|O|1997-05-20|1997-04-14|1997-06-15|TAKE BACK RETURN|TRUCK|ial instructions sleep. blithely even i +24899|185|12|1|21|22788.78|0.09|0.08|N|O|1995-12-04|1995-10-08|1995-12-06|TAKE BACK RETURN|AIR|iously final foxes. express excuses +24899|1715|100|2|20|32334.20|0.06|0.01|N|O|1995-12-14|1995-10-21|1995-12-19|DELIVER IN PERSON|MAIL|posits among the regular deposits w +24899|1809|53|3|41|70142.80|0.05|0.01|N|O|1995-11-23|1995-10-10|1995-11-24|COLLECT COD|RAIL|ven deposits nod blithely quickly eve +24899|1416|34|4|45|59283.45|0.02|0.00|N|O|1995-09-20|1995-10-22|1995-10-20|COLLECT COD|SHIP|y blithely unusual theodolites. +24899|646|40|5|38|58772.32|0.06|0.03|N|O|1995-11-25|1995-10-14|1995-12-15|DELIVER IN PERSON|TRUCK|requests. quickly enticing ideas +24900|1280|18|1|36|42526.08|0.04|0.03|N|O|1996-11-28|1996-09-06|1996-12-06|DELIVER IN PERSON|MAIL|eas use furiously fluffily pending +24900|1438|39|2|38|50898.34|0.08|0.01|N|O|1996-09-13|1996-09-08|1996-10-01|TAKE BACK RETURN|RAIL|ajole blithely. bold requests lose qui +24900|1357|34|3|48|60400.80|0.09|0.07|N|O|1996-11-15|1996-09-21|1996-12-15|NONE|REG AIR|ing deposits. blithe +24900|768|33|4|35|58406.60|0.02|0.06|N|O|1996-10-14|1996-09-16|1996-11-05|COLLECT COD|AIR|ts; furiously slow accounts are blit +24900|1965|54|5|46|85880.16|0.10|0.04|N|O|1996-10-21|1996-09-22|1996-10-25|DELIVER IN PERSON|TRUCK|final packages. final ideas use amo +24901|658|52|1|16|24938.40|0.06|0.05|N|O|1996-09-09|1996-10-14|1996-09-25|COLLECT COD|AIR|uriously final d +24901|242|43|2|23|26271.52|0.04|0.00|N|O|1996-09-23|1996-11-13|1996-09-30|COLLECT COD|RAIL|onic ideas. stealthy, silent ideas wake +24901|602|34|3|27|40570.20|0.09|0.00|N|O|1996-10-26|1996-10-18|1996-11-04|TAKE BACK RETURN|SHIP|sits haggle fluffily slyly +24901|1178|15|4|32|34533.44|0.09|0.02|N|O|1996-09-21|1996-10-25|1996-10-18|TAKE BACK RETURN|REG AIR|courts sleep sl +24901|326|55|5|15|18394.80|0.10|0.03|N|O|1996-12-22|1996-11-06|1996-12-31|TAKE BACK RETURN|REG AIR| waters after the blithely express req +24902|1522|23|1|45|64058.40|0.05|0.03|R|F|1993-07-18|1993-08-07|1993-08-09|NONE|RAIL|rses are slyly above the re +24902|46|97|2|18|17028.72|0.01|0.03|R|F|1993-06-06|1993-06-27|1993-06-20|TAKE BACK RETURN|SHIP|s use furiously quickly regular theodo +24902|234|16|3|42|47637.66|0.10|0.03|A|F|1993-06-26|1993-07-08|1993-07-04|COLLECT COD|TRUCK| blithely. quickly regular theodolites +24902|286|41|4|16|18980.48|0.04|0.01|R|F|1993-06-15|1993-07-21|1993-06-22|TAKE BACK RETURN|RAIL|oost carefully. ironic, silent requests a +24902|659|60|5|29|45229.85|0.09|0.01|A|F|1993-09-22|1993-07-27|1993-10-16|TAKE BACK RETURN|FOB|equests-- regular orbits boost care +24902|1483|1|6|28|38765.44|0.07|0.01|A|F|1993-09-05|1993-07-20|1993-09-08|DELIVER IN PERSON|MAIL|s. slyly silent instructi +24903|414|2|1|13|17087.33|0.03|0.07|A|F|1993-11-29|1993-12-15|1993-12-01|NONE|MAIL| the slyly regular requests bo +24903|984|85|2|46|86709.08|0.00|0.06|A|F|1993-12-14|1993-11-19|1993-12-29|NONE|FOB|posits wake acco +24903|1655|38|3|39|60709.35|0.03|0.06|A|F|1994-02-04|1993-12-06|1994-02-19|NONE|AIR|counts boost +24903|1424|64|4|20|26508.40|0.03|0.05|R|F|1993-12-09|1993-12-07|1993-12-17|NONE|TRUCK|ngly. slyly ironic gifts b +24903|948|83|5|14|25885.16|0.04|0.03|A|F|1994-02-03|1993-12-09|1994-02-20|COLLECT COD|SHIP|l requests was final ideas. unusual pack +24903|643|44|6|42|64832.88|0.04|0.03|R|F|1994-02-02|1994-01-11|1994-03-03|COLLECT COD|REG AIR|ounts. pending, even requests +24903|104|57|7|23|23094.30|0.08|0.03|A|F|1994-01-03|1994-01-10|1994-01-15|NONE|AIR| boost furiously speci +24928|1995|96|1|10|18969.90|0.03|0.01|N|O|1996-07-16|1996-06-21|1996-08-04|TAKE BACK RETURN|FOB| slyly furiously expres +24928|1836|23|2|6|10426.98|0.08|0.01|N|O|1996-05-24|1996-06-19|1996-05-27|COLLECT COD|REG AIR|s. accounts use carefully ironic depos +24929|493|81|1|36|50165.64|0.02|0.00|N|O|1996-10-30|1996-11-26|1996-11-06|NONE|TRUCK|ly regular instructions across the ironi +24929|323|24|2|35|42816.20|0.05|0.04|N|O|1996-10-27|1996-11-19|1996-10-30|DELIVER IN PERSON|MAIL|sual packages. blithely e +24929|1347|86|3|2|2496.68|0.10|0.02|N|O|1997-01-21|1996-12-03|1997-02-20|DELIVER IN PERSON|SHIP|s. carefully even instructions sleep slyly? +24929|397|54|4|2|2594.78|0.09|0.07|N|O|1996-11-29|1996-11-14|1996-12-07|COLLECT COD|FOB|usual requests. dependencies sleep carefu +24930|1245|57|1|37|42410.88|0.04|0.07|N|O|1998-05-05|1998-06-15|1998-05-20|TAKE BACK RETURN|MAIL|. regular instructio +24930|789|22|2|34|57452.52|0.04|0.01|N|O|1998-06-26|1998-07-09|1998-07-15|TAKE BACK RETURN|RAIL|ully regular accounts. pending deposits +24930|382|83|3|41|52577.58|0.08|0.02|N|O|1998-05-10|1998-05-26|1998-05-30|NONE|AIR|ainst the packages use +24931|1333|10|1|32|39498.56|0.10|0.05|N|O|1995-12-06|1996-02-02|1995-12-16|TAKE BACK RETURN|SHIP|arefully ironic asympto +24931|769|70|2|35|58441.60|0.02|0.08|N|O|1996-02-21|1996-02-05|1996-03-14|NONE|RAIL|he packages. +24931|1297|35|3|10|11982.90|0.03|0.08|N|O|1996-01-26|1995-12-25|1996-02-03|COLLECT COD|REG AIR|jole carefully along the +24931|748|49|4|41|67598.34|0.07|0.03|N|O|1996-02-10|1996-01-27|1996-02-22|COLLECT COD|REG AIR|ly. ideas are about the furiousl +24931|1671|54|5|42|66052.14|0.01|0.02|N|O|1995-12-18|1996-01-17|1996-01-09|COLLECT COD|MAIL|uriously regular req +24931|375|76|6|43|54840.91|0.09|0.03|N|O|1996-01-05|1995-12-16|1996-01-17|TAKE BACK RETURN|SHIP|he deposits. theod +24931|1690|73|7|19|30242.11|0.00|0.01|N|O|1995-12-26|1995-12-24|1996-01-23|COLLECT COD|AIR|ts: ironic acc +24932|198|25|1|35|38436.65|0.00|0.00|N|O|1996-03-14|1996-05-20|1996-04-11|TAKE BACK RETURN|SHIP| blithely express ideas mold furiously afte +24932|78|29|2|13|12714.91|0.01|0.04|N|O|1996-02-27|1996-04-08|1996-03-18|DELIVER IN PERSON|AIR|thely. slyly regular deposits +24932|1356|57|3|6|7544.10|0.05|0.01|N|O|1996-03-10|1996-05-05|1996-03-27|COLLECT COD|RAIL|ily regular ideas alongside of the p +24932|1666|49|4|5|7838.30|0.07|0.02|N|O|1996-05-14|1996-05-21|1996-05-18|NONE|SHIP| theodolites boos +24933|1043|79|1|41|38705.64|0.06|0.08|R|F|1994-08-10|1994-10-22|1994-08-23|DELIVER IN PERSON|FOB|silent pinto beans hang furio +24933|100|76|2|19|19001.90|0.03|0.07|A|F|1994-08-19|1994-09-16|1994-09-07|COLLECT COD|RAIL|uctions wake! +24933|1799|26|3|20|34015.80|0.03|0.06|R|F|1994-09-20|1994-09-12|1994-09-21|DELIVER IN PERSON|FOB|er the carefully fluffy deposits +24933|1389|4|4|28|36130.64|0.06|0.04|R|F|1994-10-22|1994-10-17|1994-10-29|DELIVER IN PERSON|MAIL|xes. accou +24933|1835|79|5|21|36473.43|0.06|0.07|A|F|1994-09-11|1994-09-15|1994-10-04|TAKE BACK RETURN|REG AIR| cajole carefully after the carefully +24934|991|94|1|6|11351.94|0.02|0.04|A|F|1995-03-25|1995-03-27|1995-03-26|TAKE BACK RETURN|RAIL|cial orbits are blithely slyly spec +24935|770|67|1|26|43440.02|0.05|0.05|N|O|1998-08-13|1998-10-03|1998-09-05|DELIVER IN PERSON|FOB|elets. spe +24960|721|86|1|4|6486.88|0.04|0.03|A|F|1995-05-14|1995-03-15|1995-05-19|NONE|RAIL|cial accounts. +24960|654|55|2|47|73068.55|0.10|0.06|A|F|1995-04-28|1995-04-01|1995-05-01|DELIVER IN PERSON|SHIP|rash furiously; ironi +24960|1728|55|3|13|21186.36|0.06|0.00|R|F|1995-02-13|1995-04-28|1995-03-04|TAKE BACK RETURN|REG AIR|uctions! packages c +24960|554|85|4|43|62545.65|0.00|0.03|R|F|1995-04-14|1995-03-07|1995-04-23|DELIVER IN PERSON|FOB|s. carefully ironic court +24960|972|41|5|25|46824.25|0.04|0.02|R|F|1995-05-23|1995-04-28|1995-05-31|TAKE BACK RETURN|REG AIR|regularly regular asymptotes +24960|725|22|6|12|19508.64|0.05|0.07|R|F|1995-04-29|1995-03-17|1995-05-16|COLLECT COD|REG AIR|ntegrate s +24960|600|31|7|50|75030.00|0.07|0.05|A|F|1995-05-13|1995-04-28|1995-05-26|NONE|SHIP|lithely bold ideas. car +24961|63|64|1|6|5778.36|0.06|0.03|A|F|1993-05-16|1993-03-02|1993-05-17|NONE|RAIL|platelets doubt slyly blit +24961|556|87|2|17|24761.35|0.06|0.07|R|F|1993-03-06|1993-02-27|1993-03-21|DELIVER IN PERSON|SHIP|le furiously accoun +24962|816|17|1|46|78973.26|0.08|0.02|N|O|1998-03-05|1998-03-22|1998-03-26|DELIVER IN PERSON|SHIP| special excuses +24962|1579|20|2|3|4441.71|0.09|0.04|N|O|1998-04-07|1998-04-25|1998-04-21|DELIVER IN PERSON|SHIP|olites. quickly unusual instr +24962|1471|72|3|13|17842.11|0.05|0.04|N|O|1998-04-18|1998-04-15|1998-05-18|DELIVER IN PERSON|FOB|al ideas hagg +24962|74|50|4|3|2922.21|0.02|0.02|N|O|1998-02-13|1998-03-14|1998-03-11|NONE|FOB|s alongside of th +24962|344|29|5|24|29864.16|0.04|0.08|N|O|1998-05-14|1998-04-26|1998-05-19|TAKE BACK RETURN|FOB| grouches detect care +24963|703|100|1|41|65751.70|0.03|0.07|N|O|1996-02-23|1996-03-20|1996-03-20|COLLECT COD|SHIP| cajole stealt +24963|24|25|2|30|27720.60|0.03|0.02|N|O|1996-02-16|1996-02-23|1996-02-22|COLLECT COD|REG AIR|s doubt quickly final requests. b +24963|1360|61|3|20|25227.20|0.03|0.05|N|O|1996-03-15|1996-03-18|1996-04-08|NONE|TRUCK|nusual requests along the caref +24963|1322|61|4|35|42816.20|0.02|0.06|N|O|1996-03-04|1996-03-17|1996-03-31|COLLECT COD|REG AIR|oost blithely amo +24963|1769|96|5|20|33415.20|0.01|0.08|N|O|1996-01-09|1996-01-28|1996-01-11|TAKE BACK RETURN|AIR| regular packages. final in +24963|1295|7|6|24|28710.96|0.08|0.01|N|O|1996-01-27|1996-02-06|1996-02-16|DELIVER IN PERSON|RAIL|ely final packages are blit +24964|409|10|1|50|65470.00|0.03|0.00|A|F|1995-02-17|1995-03-25|1995-03-19|TAKE BACK RETURN|AIR| after the even depe +24964|1798|99|2|14|23797.06|0.05|0.01|A|F|1995-03-27|1995-02-14|1995-04-15|TAKE BACK RETURN|REG AIR|nts. fluffy, regular foxes cajole carefull +24964|657|20|3|30|46729.50|0.05|0.01|R|F|1995-01-15|1995-02-13|1995-01-19|NONE|REG AIR| haggle. carefully silent instr +24964|319|4|4|28|34140.68|0.04|0.03|R|F|1995-02-15|1995-02-09|1995-02-23|COLLECT COD|TRUCK|uests doubt carefu +24964|1289|64|5|2|2380.56|0.08|0.05|R|F|1995-04-04|1995-03-05|1995-04-16|TAKE BACK RETURN|AIR|dolites. pinto beans above +24965|161|14|1|50|53058.00|0.03|0.08|A|F|1995-04-21|1995-06-26|1995-05-09|COLLECT COD|REG AIR|ously unusual T +24965|1186|59|2|36|39138.48|0.06|0.00|N|O|1995-06-22|1995-05-10|1995-07-20|NONE|MAIL|fully fluffily +24965|1933|66|3|40|73397.20|0.00|0.08|R|F|1995-04-08|1995-05-29|1995-04-19|TAKE BACK RETURN|MAIL|among the +24965|771|72|4|17|28420.09|0.09|0.04|A|F|1995-05-13|1995-05-01|1995-06-02|NONE|SHIP|refully pending dolphins wake furio +24965|676|8|5|5|7883.35|0.03|0.05|R|F|1995-05-13|1995-06-01|1995-06-01|DELIVER IN PERSON|SHIP|posits haggle fluf +24966|330|59|1|42|51673.86|0.00|0.03|N|O|1996-03-05|1996-03-08|1996-03-10|COLLECT COD|MAIL|against the regular ideas. idle accoun +24966|1467|46|2|7|9579.22|0.05|0.07|N|O|1996-02-20|1996-01-31|1996-03-14|NONE|MAIL|ilent foxes sleep blithely closely cl +24966|487|46|3|21|29137.08|0.04|0.01|N|O|1996-01-15|1996-02-01|1996-01-18|TAKE BACK RETURN|SHIP|have to nag permanentl +24966|1790|33|4|1|1691.79|0.10|0.05|N|O|1996-01-24|1996-01-31|1996-02-05|TAKE BACK RETURN|RAIL|gle: slyly bold packages kindle regular, f +24966|1780|65|5|8|13454.24|0.09|0.01|N|O|1996-01-09|1996-03-05|1996-02-05|TAKE BACK RETURN|TRUCK|ounts. carefully regular deposits gr +24966|1210|85|6|9|10000.89|0.05|0.08|N|O|1996-01-09|1996-02-17|1996-02-01|TAKE BACK RETURN|RAIL|egular accounts wake blithely. furiou +24966|772|5|7|49|81965.73|0.02|0.04|N|O|1996-01-02|1996-02-12|1996-01-23|NONE|REG AIR|ular deposits. final pinto be +24967|766|63|1|23|38335.48|0.10|0.03|N|O|1997-06-07|1997-04-19|1997-06-25|COLLECT COD|RAIL|ending pinto beans wake slyly slyly regula +24967|1700|24|2|16|25627.20|0.09|0.05|N|O|1997-06-25|1997-05-05|1997-07-23|TAKE BACK RETURN|TRUCK|pecial, iro +24967|1091|62|3|35|34723.15|0.07|0.01|N|O|1997-05-27|1997-04-19|1997-06-09|COLLECT COD|AIR| blithely regular pinto beans use ca +24967|1524|5|4|27|38489.04|0.09|0.05|N|O|1997-03-22|1997-06-12|1997-04-08|NONE|TRUCK|ly special pa +24992|785|50|1|11|18543.58|0.03|0.04|N|O|1998-05-13|1998-06-20|1998-05-18|NONE|MAIL|xpress, bold ideas. fox +24992|59|35|2|5|4795.25|0.09|0.02|N|O|1998-06-21|1998-06-19|1998-07-15|NONE|SHIP|avely. final asymptotes poach blit +24992|54|55|3|37|35299.85|0.06|0.08|N|O|1998-03-30|1998-05-07|1998-04-01|NONE|RAIL|ay bold deposits. furiously bold war +24992|1983|72|4|50|94249.00|0.04|0.01|N|O|1998-06-29|1998-05-25|1998-07-25|NONE|FOB|gular packages. ir +24993|1644|86|1|49|75736.36|0.07|0.05|R|F|1993-03-14|1993-05-09|1993-03-26|TAKE BACK RETURN|MAIL|en, idle dugouts. final, +24993|1156|57|2|31|32771.65|0.04|0.06|R|F|1993-06-30|1993-04-19|1993-07-19|NONE|REG AIR|ly even packages use across the fur +24993|40|41|3|19|17860.76|0.00|0.07|A|F|1993-04-11|1993-04-28|1993-04-25|TAKE BACK RETURN|REG AIR|lyly final accounts lose blithely c +24993|1065|36|4|10|9660.60|0.05|0.06|A|F|1993-05-05|1993-05-01|1993-05-06|TAKE BACK RETURN|SHIP|gular packages above +24994|1707|50|1|11|17695.70|0.09|0.03|N|O|1998-10-17|1998-09-13|1998-11-12|DELIVER IN PERSON|AIR| doze fluffily along the carefully final d +24994|799|96|2|20|33995.80|0.01|0.04|N|O|1998-10-11|1998-07-31|1998-10-24|COLLECT COD|TRUCK|s nod slyly slyly ironic accounts. specia +24994|1264|39|3|33|38453.58|0.04|0.00|N|O|1998-08-27|1998-09-12|1998-09-18|DELIVER IN PERSON|AIR|le furiously +24995|1855|99|1|9|15811.65|0.06|0.05|N|O|1998-03-23|1998-01-24|1998-04-04|COLLECT COD|AIR| pains cajole. blithely sile +24995|265|66|2|44|51271.44|0.00|0.02|N|O|1998-03-19|1997-12-30|1998-03-20|NONE|TRUCK|t even foxes. theodolites wake accordin +24996|1888|89|1|17|30427.96|0.04|0.08|N|O|1995-11-19|1995-12-07|1995-12-12|COLLECT COD|FOB|es wake. carefully pending accounts accordi +24996|1689|31|2|50|79534.00|0.08|0.03|N|O|1995-10-24|1995-11-29|1995-11-16|COLLECT COD|RAIL|p slyly pending, regular requ +24996|1481|21|3|50|69124.00|0.02|0.03|N|O|1995-11-11|1995-11-18|1995-11-28|TAKE BACK RETURN|REG AIR|. regular, pend +24996|861|95|4|1|1761.86|0.10|0.00|N|O|1995-12-31|1995-12-12|1996-01-29|NONE|MAIL|ully slow pearls. +24996|949|50|5|43|79547.42|0.06|0.06|N|O|1996-01-02|1995-11-14|1996-01-29|NONE|TRUCK| final, even platelets affix at the sly +24996|48|99|6|13|12324.52|0.10|0.05|N|O|1995-10-08|1995-12-22|1995-10-17|COLLECT COD|FOB|lar sheaves +24997|559|20|1|44|64220.20|0.01|0.00|N|O|1998-10-06|1998-08-19|1998-10-14|DELIVER IN PERSON|AIR|ithely final theodolites. slyly un +24997|1492|32|2|48|66887.52|0.08|0.01|N|O|1998-09-06|1998-09-22|1998-09-25|TAKE BACK RETURN|MAIL|sits sleep caref +24997|535|96|3|34|48808.02|0.05|0.06|N|O|1998-07-26|1998-09-24|1998-08-03|TAKE BACK RETURN|SHIP|ironically after the even packages. theod +24998|1549|90|1|12|17406.48|0.03|0.00|N|O|1996-10-02|1996-09-04|1996-10-08|TAKE BACK RETURN|TRUCK| instructions above +24998|1063|69|2|40|38562.40|0.06|0.03|N|O|1996-11-02|1996-08-18|1996-12-01|TAKE BACK RETURN|FOB|oxes across the ironic, even +24998|212|13|3|45|50049.45|0.09|0.06|N|O|1996-09-01|1996-09-04|1996-09-03|NONE|SHIP|press pinto bean +24998|1785|86|4|19|32048.82|0.08|0.02|N|O|1996-10-05|1996-10-04|1996-10-10|TAKE BACK RETURN|RAIL|iously blithely unusual foxes. slyly re +24999|1089|60|1|44|43563.52|0.09|0.01|N|O|1997-04-16|1997-05-13|1997-04-23|DELIVER IN PERSON|TRUCK|ckages wake blithely pendi +25024|1358|97|1|16|20149.60|0.04|0.04|N|O|1997-10-28|1997-10-03|1997-11-21|DELIVER IN PERSON|TRUCK|refully unusual requests boost slyly s +25025|1082|88|1|20|19661.60|0.07|0.00|N|O|1996-12-03|1996-12-02|1996-12-14|TAKE BACK RETURN|SHIP| express reque +25026|1498|77|1|28|39185.72|0.05|0.07|N|O|1996-11-11|1996-11-20|1996-11-26|TAKE BACK RETURN|MAIL|xes mold regular, stealthy +25026|845|45|2|46|80308.64|0.07|0.03|N|O|1996-12-27|1996-11-04|1997-01-13|COLLECT COD|RAIL|ng asymptotes sleep quickly even theo +25026|1744|45|3|20|32914.80|0.01|0.00|N|O|1996-10-11|1996-11-16|1996-11-08|TAKE BACK RETURN|AIR|st the carefully final pac +25027|1683|84|1|32|50709.76|0.03|0.06|A|F|1995-01-17|1995-02-26|1995-01-28|COLLECT COD|AIR|ly bold deposits. carefully spe +25027|1671|95|2|37|58188.79|0.07|0.00|A|F|1995-03-25|1995-03-07|1995-04-13|TAKE BACK RETURN|SHIP|lly along the ironic, even deposits. final +25027|812|13|3|26|44533.06|0.10|0.00|A|F|1995-01-05|1995-03-06|1995-01-24|DELIVER IN PERSON|SHIP|ss deposits. slyly final +25027|79|55|4|20|19581.40|0.02|0.05|R|F|1995-01-17|1995-02-20|1995-01-28|TAKE BACK RETURN|REG AIR|ously final warhorses haggle pas +25028|1233|45|1|19|21550.37|0.09|0.08|A|F|1995-03-05|1995-03-02|1995-03-23|TAKE BACK RETURN|SHIP|ic packages detect careful +25028|1575|56|2|29|42820.53|0.07|0.01|R|F|1995-01-20|1995-03-18|1995-02-15|DELIVER IN PERSON|FOB|es integrate after the fluffily silent f +25028|1811|12|3|15|25692.15|0.08|0.06|A|F|1995-02-11|1995-03-23|1995-02-13|DELIVER IN PERSON|SHIP|deposits. f +25028|818|19|4|40|68752.40|0.07|0.02|R|F|1995-01-26|1995-03-18|1995-02-23|TAKE BACK RETURN|RAIL|ckly final ideas are about +25028|1587|88|5|4|5954.32|0.04|0.08|R|F|1995-02-21|1995-03-12|1995-03-14|NONE|FOB| to the final, final acc +25029|1920|21|1|31|56479.52|0.00|0.04|N|O|1997-12-07|1998-02-02|1997-12-23|COLLECT COD|TRUCK| the carefully express ideas. slyl +25029|30|31|2|12|11160.36|0.08|0.04|N|O|1998-02-09|1998-01-18|1998-02-22|COLLECT COD|AIR|s affix blithely regular waters. +25030|1966|55|1|3|5603.88|0.07|0.04|N|O|1998-10-12|1998-09-29|1998-10-31|TAKE BACK RETURN|TRUCK|accounts after +25030|206|34|2|14|15486.80|0.06|0.04|N|O|1998-08-04|1998-08-19|1998-08-14|TAKE BACK RETURN|RAIL|old pearls cajole ironic +25030|929|64|3|4|7319.68|0.05|0.04|N|O|1998-10-24|1998-09-26|1998-10-29|DELIVER IN PERSON|AIR|pending accounts nag quickly alongside of +25030|1383|22|4|13|16696.94|0.05|0.00|N|O|1998-11-10|1998-09-29|1998-11-28|DELIVER IN PERSON|MAIL| unusual, eve +25030|1841|28|5|11|19171.24|0.05|0.02|N|O|1998-10-04|1998-09-29|1998-10-14|DELIVER IN PERSON|RAIL|ar instructions. even, special instru +25031|1119|20|1|36|36723.96|0.05|0.01|R|F|1994-12-06|1994-10-10|1995-01-03|NONE|REG AIR|fix quickly bold package +25031|1296|34|2|46|55075.34|0.02|0.05|A|F|1994-10-23|1994-11-18|1994-11-20|NONE|TRUCK|osits. fluffily ironic accounts d +25031|1897|84|3|10|17988.90|0.08|0.00|R|F|1994-11-01|1994-10-14|1994-11-10|COLLECT COD|TRUCK| final requests nag blithely bli +25031|110|37|4|2|2020.22|0.03|0.04|R|F|1994-12-15|1994-11-17|1994-12-21|DELIVER IN PERSON|SHIP|eans are alongside of the regular +25031|1237|75|5|12|13658.76|0.08|0.04|A|F|1994-10-02|1994-11-18|1994-10-10|TAKE BACK RETURN|MAIL|ake above the regular foxes. i +25031|1929|62|6|17|31125.64|0.02|0.06|A|F|1994-09-30|1994-10-05|1994-10-28|TAKE BACK RETURN|SHIP|he quickly even ideas. ruthlessly fin +25031|326|83|7|14|17168.48|0.00|0.07|A|F|1994-09-23|1994-11-07|1994-10-12|NONE|MAIL|ic accounts along the blithely speci +25056|1152|61|1|13|13690.95|0.09|0.02|A|F|1993-12-15|1993-12-20|1993-12-30|DELIVER IN PERSON|SHIP|y final, furious packages. f +25056|985|54|2|21|39605.58|0.04|0.07|A|F|1994-01-03|1993-12-10|1994-01-17|COLLECT COD|SHIP| requests. special, r +25056|288|16|3|14|16635.92|0.09|0.01|A|F|1993-10-22|1993-11-29|1993-11-13|TAKE BACK RETURN|TRUCK|c requests. slyly final package +25056|666|67|4|3|4699.98|0.06|0.04|A|F|1993-10-20|1993-10-30|1993-11-11|COLLECT COD|FOB|sly carefully regular co +25056|31|32|5|36|33517.08|0.05|0.07|A|F|1993-10-02|1993-10-31|1993-10-03|TAKE BACK RETURN|RAIL|c accounts grow accordi +25057|1465|83|1|13|17763.98|0.07|0.04|N|O|1998-05-09|1998-06-05|1998-05-27|DELIVER IN PERSON|MAIL|oward the regula +25058|991|26|1|2|3783.98|0.02|0.05|R|F|1995-05-18|1995-07-13|1995-06-08|COLLECT COD|FOB|e final courts. final, bold requests +25058|1003|4|2|8|7232.00|0.07|0.04|N|O|1995-07-18|1995-06-12|1995-08-03|DELIVER IN PERSON|SHIP|quests play quickly even requests. +25058|240|41|3|3|3420.72|0.07|0.01|A|F|1995-05-20|1995-07-29|1995-06-08|COLLECT COD|SHIP|y regular platelets. closely even foxes +25058|1865|9|4|28|49472.08|0.05|0.05|N|O|1995-09-03|1995-06-15|1995-09-13|DELIVER IN PERSON|MAIL|es haggle +25059|1182|83|1|5|5415.90|0.03|0.06|N|O|1998-01-12|1997-12-26|1998-01-29|NONE|REG AIR|eposits. ironic account +25059|1369|70|2|3|3811.08|0.10|0.08|N|O|1997-12-10|1998-01-08|1998-01-05|DELIVER IN PERSON|SHIP|express packages alon +25060|68|19|1|21|20329.26|0.04|0.08|A|F|1994-11-19|1994-09-06|1994-12-19|DELIVER IN PERSON|MAIL|r accounts are bra +25060|1086|57|2|33|32573.64|0.08|0.06|R|F|1994-10-06|1994-09-07|1994-10-27|DELIVER IN PERSON|RAIL|eep furiously regular, ironic r +25060|792|25|3|21|35548.59|0.01|0.00|A|F|1994-11-08|1994-10-12|1994-12-07|DELIVER IN PERSON|MAIL|ges try to p +25060|1109|46|4|9|9090.90|0.06|0.04|A|F|1994-08-17|1994-08-21|1994-09-11|DELIVER IN PERSON|AIR|asymptotes. pending instructi +25060|1176|85|5|39|42009.63|0.10|0.03|A|F|1994-11-06|1994-09-02|1994-11-26|TAKE BACK RETURN|SHIP|ular, final foxes nag fluffily furiousl +25060|1839|40|6|17|29594.11|0.01|0.04|R|F|1994-09-30|1994-10-02|1994-10-23|DELIVER IN PERSON|MAIL|deas: furious +25060|614|8|7|21|31806.81|0.02|0.06|R|F|1994-09-13|1994-08-31|1994-09-29|TAKE BACK RETURN|MAIL|riously alongside +25061|1331|70|1|4|4929.32|0.10|0.00|N|O|1996-04-16|1996-01-26|1996-05-08|COLLECT COD|SHIP|quests cajole dogg +25061|1727|70|2|22|35831.84|0.04|0.03|N|O|1996-02-03|1996-03-14|1996-02-19|NONE|SHIP|fully. care +25061|736|33|3|1|1636.73|0.05|0.05|N|O|1996-03-19|1996-03-16|1996-04-15|COLLECT COD|TRUCK|beans x-ray furiously blithely ironi +25061|579|70|4|21|31070.97|0.06|0.06|N|O|1995-12-31|1996-01-20|1996-01-28|DELIVER IN PERSON|FOB|jole quickly according to the bold depo +25061|1920|65|5|22|40082.24|0.00|0.01|N|O|1996-02-27|1996-03-09|1996-03-05|TAKE BACK RETURN|RAIL|y ironic deposits gro +25061|1992|25|6|26|49243.74|0.01|0.03|N|O|1995-12-21|1996-01-23|1996-01-11|COLLECT COD|TRUCK|egular accounts. slyl +25061|854|21|7|14|24567.90|0.06|0.06|N|O|1996-03-04|1996-02-20|1996-03-28|COLLECT COD|MAIL|furiously pending packages. +25062|524|55|1|29|41311.08|0.01|0.08|A|F|1994-01-03|1993-12-07|1994-01-16|COLLECT COD|TRUCK|r packages. ironic, ironic packages caj +25062|1649|50|2|7|10854.48|0.06|0.00|A|F|1994-03-01|1994-01-13|1994-03-13|TAKE BACK RETURN|AIR|aggle about the packages. ironic +25062|1730|57|3|30|48951.90|0.08|0.05|A|F|1994-02-27|1994-01-02|1994-03-03|TAKE BACK RETURN|MAIL|regular packages about the ironic instruct +25063|137|38|1|39|40448.07|0.09|0.03|A|F|1994-07-07|1994-08-29|1994-07-14|NONE|AIR|r, regular deposits cajole +25088|515|76|1|22|31141.22|0.10|0.00|N|O|1998-07-01|1998-09-07|1998-07-03|NONE|SHIP|g the quickly regular dependen +25088|807|74|2|26|44402.80|0.05|0.00|N|O|1998-10-14|1998-08-17|1998-10-23|COLLECT COD|TRUCK|regular, final packages sle +25088|728|93|3|32|52119.04|0.05|0.00|N|O|1998-06-23|1998-07-24|1998-07-20|DELIVER IN PERSON|SHIP|r the slyly pending accounts. fina +25088|855|56|4|24|42140.40|0.08|0.05|N|O|1998-06-24|1998-08-28|1998-07-21|NONE|SHIP|r deposits. regular a +25089|1396|73|1|40|51895.60|0.07|0.08|N|O|1998-09-13|1998-09-25|1998-10-10|TAKE BACK RETURN|SHIP|s will haggle. carefully regular account +25089|121|100|2|38|38802.56|0.07|0.04|N|O|1998-11-08|1998-09-18|1998-11-20|NONE|SHIP|nto beans alongside of +25090|1606|48|1|40|60304.00|0.01|0.02|R|F|1993-08-08|1993-08-05|1993-08-24|NONE|MAIL|bold packages. carefully pending +25090|1558|99|2|12|17514.60|0.04|0.02|R|F|1993-07-14|1993-07-24|1993-07-29|TAKE BACK RETURN|FOB|y bold requests. +25090|1142|43|3|37|38596.18|0.09|0.02|R|F|1993-09-09|1993-07-06|1993-09-10|TAKE BACK RETURN|AIR|ackages are +25091|116|43|1|8|8128.88|0.03|0.02|R|F|1993-03-04|1993-05-19|1993-03-06|DELIVER IN PERSON|RAIL| among the excuses poach carefull +25091|1754|55|2|36|59607.00|0.02|0.02|R|F|1993-03-11|1993-04-17|1993-04-06|NONE|RAIL| ideas. regular accounts +25092|1816|46|1|47|80737.07|0.10|0.00|R|F|1994-02-19|1994-01-02|1994-02-20|TAKE BACK RETURN|SHIP|posits. final, final foxes sleep idly. +25092|431|19|2|23|30622.89|0.06|0.06|R|F|1994-03-15|1994-01-10|1994-04-11|NONE|FOB|aggle after the blithely pen +25092|1160|61|3|10|10611.60|0.00|0.06|A|F|1994-01-07|1994-01-29|1994-01-19|DELIVER IN PERSON|RAIL|counts sleep alongside of the final, regu +25092|343|28|4|31|38543.54|0.03|0.03|A|F|1994-03-03|1994-01-03|1994-03-05|NONE|REG AIR|iously. regular ideas against the specia +25092|341|98|5|26|32274.84|0.00|0.05|A|F|1994-03-04|1994-02-22|1994-03-24|TAKE BACK RETURN|MAIL|the regular platele +25092|1798|83|6|16|27196.64|0.03|0.02|A|F|1994-01-04|1994-01-18|1994-01-28|DELIVER IN PERSON|FOB| warthogs. quickly express deposits haggle +25092|68|69|7|22|21297.32|0.10|0.05|R|F|1993-12-14|1994-02-16|1993-12-17|NONE|SHIP|leep closely even, even requests. dependen +25093|795|60|1|19|32220.01|0.06|0.00|R|F|1993-01-04|1992-12-01|1993-01-13|TAKE BACK RETURN|REG AIR|und the even fox +25093|1682|24|2|13|20587.84|0.09|0.00|A|F|1992-11-19|1993-01-12|1992-12-13|TAKE BACK RETURN|REG AIR|es sleep quickly. final +25093|1431|71|3|48|63956.64|0.01|0.02|A|F|1993-01-22|1992-12-02|1993-02-14|DELIVER IN PERSON|FOB|eans. fluffily regula +25093|282|10|4|46|54384.88|0.03|0.00|R|F|1992-12-30|1992-12-27|1993-01-08|TAKE BACK RETURN|TRUCK|eas are carefully slyly express idea +25094|24|75|1|1|924.02|0.04|0.04|A|F|1994-06-14|1994-07-01|1994-06-29|DELIVER IN PERSON|REG AIR|ickly fina +25094|678|72|2|26|41045.42|0.04|0.07|R|F|1994-05-24|1994-06-11|1994-06-09|DELIVER IN PERSON|SHIP|are furiously according to th +25095|1428|68|1|15|19941.30|0.10|0.01|A|F|1995-05-20|1995-04-02|1995-06-05|DELIVER IN PERSON|FOB|usly final theodolites use furiously +25095|484|43|2|49|67839.52|0.01|0.05|A|F|1995-04-01|1995-03-21|1995-04-20|TAKE BACK RETURN|RAIL|eposits are +25095|854|55|3|17|29832.45|0.03|0.06|R|F|1995-03-06|1995-04-19|1995-03-17|NONE|MAIL|nusual asymptotes use. unusual instruc +25095|1744|87|4|47|77349.78|0.03|0.08|A|F|1995-02-23|1995-04-03|1995-03-07|DELIVER IN PERSON|RAIL|ke slyly final deposits. quickly u +25095|1480|81|5|43|59403.64|0.07|0.01|A|F|1995-03-24|1995-02-28|1995-04-16|NONE|REG AIR|its. pending, u +25095|52|3|6|22|20945.10|0.06|0.02|A|F|1995-03-16|1995-03-14|1995-04-04|COLLECT COD|AIR|to the regular, +25120|97|73|1|50|49854.50|0.06|0.01|A|F|1994-06-02|1994-05-02|1994-06-29|TAKE BACK RETURN|SHIP|into beans. silently specia +25120|370|27|2|43|54625.91|0.08|0.03|A|F|1994-04-20|1994-04-13|1994-04-27|DELIVER IN PERSON|SHIP|riously. furious +25120|1115|88|3|24|24386.64|0.10|0.07|R|F|1994-03-27|1994-04-05|1994-04-19|COLLECT COD|SHIP|gle silent ideas. fluffily +25120|1024|25|4|9|8325.18|0.00|0.04|R|F|1994-03-30|1994-05-04|1994-04-07|TAKE BACK RETURN|RAIL|ffix sometimes unusual, pe +25120|8|59|5|47|42676.00|0.10|0.04|A|F|1994-05-30|1994-04-05|1994-06-08|DELIVER IN PERSON|SHIP|ar instructions. carefully bold instruction +25121|1795|22|1|23|39026.17|0.05|0.04|R|F|1993-11-25|1993-12-18|1993-12-14|DELIVER IN PERSON|MAIL|deas sleep bli +25121|241|42|2|23|26248.52|0.02|0.06|A|F|1994-02-06|1994-02-01|1994-02-23|TAKE BACK RETURN|TRUCK|eposits boost against the ironi +25121|1948|37|3|8|14799.52|0.09|0.04|R|F|1994-03-10|1994-02-13|1994-04-02|NONE|AIR|ideas. sile +25122|1963|96|1|4|7459.84|0.01|0.05|N|O|1998-07-23|1998-08-10|1998-08-08|COLLECT COD|SHIP|riously. carefully unusual deposit +25122|1030|36|2|29|26999.87|0.10|0.03|N|O|1998-10-02|1998-09-09|1998-10-21|TAKE BACK RETURN|AIR|counts. slyly pending +25122|1653|54|3|26|40420.90|0.01|0.04|N|O|1998-08-06|1998-09-29|1998-08-22|NONE|RAIL|ven deposits. quickly ironic +25123|859|26|1|22|38716.70|0.04|0.07|R|F|1992-11-23|1992-12-19|1992-11-24|DELIVER IN PERSON|FOB|ependencies. furi +25123|1889|33|2|9|16117.92|0.08|0.08|A|F|1992-12-15|1992-11-09|1993-01-14|DELIVER IN PERSON|SHIP|leep. careful +25124|136|63|1|16|16578.08|0.01|0.01|N|O|1998-01-05|1998-01-23|1998-01-26|TAKE BACK RETURN|SHIP|ackages are carefully. ironic pint +25124|286|68|2|46|54568.88|0.04|0.03|N|O|1998-01-11|1998-02-26|1998-02-06|TAKE BACK RETURN|FOB|ic theodolit +25124|1282|83|3|10|11832.80|0.00|0.03|N|O|1998-02-17|1998-01-20|1998-03-10|DELIVER IN PERSON|SHIP|s. furiously express packages are daring, +25124|1472|73|4|48|65926.56|0.09|0.07|N|O|1997-12-29|1998-02-06|1998-01-19|NONE|TRUCK|ades promise carefully. quickly bold accou +25124|1556|37|5|27|39353.85|0.00|0.05|N|O|1998-02-11|1998-02-27|1998-03-13|DELIVER IN PERSON|MAIL|rd the ironic courts. slyly silent +25124|1611|53|6|42|63529.62|0.07|0.01|N|O|1997-12-27|1998-02-28|1998-01-10|COLLECT COD|AIR|lithely final packages along the silen +25125|793|90|1|11|18631.69|0.09|0.01|N|O|1997-10-12|1997-11-10|1997-10-18|NONE|RAIL|rding to the quick requests. carefully fin +25125|1165|74|2|17|18124.72|0.03|0.03|N|O|1997-12-20|1997-10-03|1997-12-26|DELIVER IN PERSON|FOB|y special warhorses around +25125|1132|41|3|40|41325.20|0.03|0.00|N|O|1997-12-26|1997-11-21|1998-01-22|TAKE BACK RETURN|FOB|ccounts detect +25125|1162|35|4|25|26579.00|0.04|0.04|N|O|1997-12-23|1997-11-08|1998-01-08|DELIVER IN PERSON|SHIP|blithely even req +25125|1838|82|5|7|12178.81|0.05|0.01|N|O|1997-09-24|1997-11-16|1997-10-01|NONE|AIR| fluffily. furiously regular instruct +25126|740|5|1|38|62348.12|0.06|0.01|R|F|1993-04-02|1993-01-24|1993-04-18|NONE|SHIP|nic pinto beans affix careful +25126|1285|97|2|16|18980.48|0.04|0.08|R|F|1993-03-24|1993-03-04|1993-04-11|NONE|FOB|yly ironic requests ca +25126|1306|83|3|36|43462.80|0.09|0.00|A|F|1993-03-17|1993-01-28|1993-04-16|COLLECT COD|REG AIR|s ideas nag furiously about t +25126|371|28|4|12|15256.44|0.05|0.00|R|F|1993-03-01|1993-02-22|1993-03-15|NONE|REG AIR|aggle blithely p +25126|1742|43|5|28|46024.72|0.04|0.03|A|F|1993-03-01|1993-01-26|1993-03-17|NONE|FOB|furiously slyly final deposits. sly +25126|776|9|6|48|80484.96|0.05|0.00|A|F|1993-02-28|1993-03-02|1993-03-02|COLLECT COD|FOB|areful accounts. bold dinos cajole furiousl +25126|1670|53|7|27|42435.09|0.10|0.06|R|F|1993-02-13|1993-02-28|1993-03-15|COLLECT COD|RAIL|onic, daring depths are blithely final n +25127|1712|97|1|8|12909.68|0.08|0.06|N|O|1996-08-03|1996-10-02|1996-08-14|TAKE BACK RETURN|MAIL|the express dolphins. iron +25127|1562|43|2|30|43906.80|0.06|0.08|N|O|1996-10-07|1996-08-21|1996-10-30|COLLECT COD|MAIL|lithely above t +25127|1019|90|3|39|35880.39|0.02|0.02|N|O|1996-10-30|1996-10-07|1996-11-02|DELIVER IN PERSON|FOB|rns wake. ironic, regular accounts sleep ca +25127|454|84|4|33|44696.85|0.00|0.00|N|O|1996-09-22|1996-08-16|1996-10-05|NONE|AIR|hely ironic accounts. blithel +25127|236|37|5|25|28405.75|0.03|0.07|N|O|1996-09-03|1996-08-26|1996-09-09|TAKE BACK RETURN|REG AIR|inst the quickly express cour +25152|902|5|1|5|9014.50|0.10|0.04|R|F|1992-12-18|1992-12-07|1992-12-20|NONE|AIR| unusual, express +25152|1630|31|2|6|9189.78|0.05|0.01|R|F|1992-12-05|1992-11-23|1992-12-18|COLLECT COD|AIR| furiously above the bravely regula +25152|873|74|3|41|72728.67|0.02|0.02|A|F|1992-11-05|1993-01-13|1992-12-05|DELIVER IN PERSON|TRUCK|le even ac +25152|1357|58|4|46|57884.10|0.10|0.08|R|F|1992-12-04|1992-12-13|1992-12-09|COLLECT COD|AIR|carefully e +25153|434|22|1|23|30691.89|0.04|0.07|N|O|1998-03-30|1998-03-12|1998-04-10|TAKE BACK RETURN|MAIL|y express packages. ironically spe +25154|1841|28|1|47|81913.48|0.03|0.03|R|F|1993-09-14|1993-10-14|1993-10-08|COLLECT COD|TRUCK|y even requests haggle c +25154|1785|28|2|22|37109.16|0.01|0.03|A|F|1993-09-05|1993-11-06|1993-09-25|COLLECT COD|AIR|se furiously on the e +25154|125|26|3|7|7175.84|0.03|0.08|A|F|1993-12-03|1993-10-11|1993-12-25|NONE|SHIP|furiously even requests are against the +25155|1865|9|1|37|65373.82|0.01|0.06|A|F|1993-04-01|1993-03-18|1993-04-07|TAKE BACK RETURN|RAIL|s haggle final, even +25155|1649|91|2|37|57373.68|0.01|0.02|R|F|1993-02-03|1993-03-24|1993-02-24|TAKE BACK RETURN|REG AIR|heodolites ca +25155|252|53|3|45|51851.25|0.02|0.00|A|F|1993-03-01|1993-04-18|1993-03-06|NONE|FOB|structions solve carefully. gr +25155|534|25|4|40|57381.20|0.08|0.00|A|F|1993-04-08|1993-04-20|1993-04-27|TAKE BACK RETURN|MAIL|ly. packages integrate blithely a +25155|322|51|5|3|3666.96|0.03|0.03|R|F|1993-05-22|1993-02-26|1993-06-09|DELIVER IN PERSON|RAIL|ggle quickly +25155|619|51|6|42|63823.62|0.08|0.07|R|F|1993-02-26|1993-02-21|1993-03-04|COLLECT COD|FOB|hely brave platelets according +25155|1022|23|7|32|29536.64|0.08|0.04|R|F|1993-04-30|1993-03-03|1993-05-28|COLLECT COD|MAIL|fluffily regular instru +25156|526|87|1|37|52781.24|0.06|0.01|N|O|1996-03-07|1996-04-14|1996-04-04|COLLECT COD|MAIL|accounts. unusual, final e +25156|1876|6|2|46|81782.02|0.10|0.07|N|O|1996-05-16|1996-05-12|1996-06-14|NONE|AIR|y regular asymptotes doze blith +25156|1321|98|3|4|4889.28|0.05|0.01|N|O|1996-03-11|1996-05-21|1996-03-27|DELIVER IN PERSON|REG AIR|he furiously regular requests. daring +25156|155|56|4|17|17937.55|0.00|0.06|N|O|1996-03-20|1996-04-08|1996-04-14|COLLECT COD|MAIL|arefully final deposi +25156|742|43|5|15|24641.10|0.05|0.07|N|O|1996-05-08|1996-04-26|1996-05-24|NONE|FOB|ding packages. furiously +25156|1815|16|6|43|73822.83|0.02|0.06|N|O|1996-06-19|1996-05-06|1996-06-27|COLLECT COD|RAIL|ep blithely among the expre +25157|1594|15|1|26|38885.34|0.10|0.02|R|F|1993-08-13|1993-08-12|1993-08-31|NONE|SHIP|o beans cajole +25157|421|80|2|44|58142.48|0.06|0.00|R|F|1993-07-07|1993-08-02|1993-07-08|COLLECT COD|FOB|onic, pending accounts sl +25157|85|11|3|25|24627.00|0.02|0.05|R|F|1993-05-31|1993-07-08|1993-06-24|NONE|TRUCK|ideas about the fluf +25157|561|52|4|34|49693.04|0.06|0.08|A|F|1993-07-01|1993-08-21|1993-07-25|DELIVER IN PERSON|REG AIR|ely ironic excuses s +25158|1105|14|1|26|26158.60|0.09|0.05|N|O|1996-09-22|1996-09-30|1996-10-18|COLLECT COD|RAIL|above the slyl +25158|260|61|2|50|58013.00|0.09|0.03|N|O|1996-10-22|1996-10-17|1996-11-21|TAKE BACK RETURN|AIR|g platelets. asymptotes wake fluffily. reg +25158|1211|23|3|50|55610.50|0.03|0.00|N|O|1996-09-22|1996-10-07|1996-10-18|NONE|REG AIR|thin deposits. quickly brave +25158|1855|99|4|9|15811.65|0.10|0.00|N|O|1996-10-23|1996-10-10|1996-11-19|TAKE BACK RETURN|AIR|etly final packages among the fina +25159|745|78|1|4|6582.96|0.00|0.03|N|O|1996-05-02|1996-05-30|1996-05-19|DELIVER IN PERSON|AIR|ronic deposits. furiously regular +25159|1414|93|2|22|28939.02|0.00|0.00|N|O|1996-06-25|1996-05-24|1996-07-24|TAKE BACK RETURN|SHIP|of the blithely bold theodolit +25159|139|18|3|8|8313.04|0.03|0.03|N|O|1996-06-21|1996-05-03|1996-06-30|NONE|AIR|y ironic excuses sublate slyly acc +25159|1919|64|4|20|36418.20|0.04|0.06|N|O|1996-04-04|1996-05-04|1996-04-11|NONE|FOB| beans. blithely even accounts use caref +25159|609|41|5|4|6038.40|0.07|0.07|N|O|1996-05-22|1996-05-24|1996-06-03|TAKE BACK RETURN|AIR|t the carefully bold pinto +25159|93|19|6|43|42702.87|0.04|0.04|N|O|1996-04-06|1996-04-29|1996-05-05|TAKE BACK RETURN|RAIL|ic packages. even accounts ab +25184|1525|26|1|29|41369.08|0.00|0.02|R|F|1995-06-04|1995-04-02|1995-06-11|TAKE BACK RETURN|AIR|e quickly regu +25184|1055|56|2|47|44934.35|0.10|0.03|A|F|1995-04-25|1995-04-09|1995-05-24|TAKE BACK RETURN|TRUCK|counts. evenly silent req +25185|840|41|1|16|27853.44|0.02|0.07|A|F|1993-06-20|1993-08-20|1993-07-19|TAKE BACK RETURN|TRUCK|c, bold excuses. furiously special +25186|1913|46|1|12|21778.92|0.06|0.05|N|O|1996-11-21|1996-12-01|1996-12-15|TAKE BACK RETURN|SHIP| quickly express requests. carefully i +25186|709|10|2|29|46681.30|0.01|0.02|N|O|1997-01-10|1996-12-02|1997-02-03|COLLECT COD|AIR|grate bravely across the carefully even +25186|1707|50|3|39|62739.30|0.05|0.07|N|O|1996-11-02|1997-01-16|1996-11-16|DELIVER IN PERSON|SHIP|platelets. stealthily +25187|1406|46|1|7|9151.80|0.05|0.08|N|O|1997-04-15|1997-03-26|1997-04-21|COLLECT COD|AIR|s will have to wake slyly. carefully +25187|1043|14|2|31|29265.24|0.00|0.00|N|O|1997-05-30|1997-04-13|1997-06-13|DELIVER IN PERSON|FOB|ly ironic deposits eat enticingly according +25188|60|11|1|43|41282.58|0.08|0.04|A|F|1995-04-16|1995-02-12|1995-04-17|COLLECT COD|FOB|ronic, express packages. even, bold +25188|1995|96|2|38|72085.62|0.01|0.07|R|F|1995-04-28|1995-02-07|1995-05-16|TAKE BACK RETURN|SHIP|ounts use blithely quick +25188|1161|34|3|36|38237.76|0.08|0.00|R|F|1995-04-18|1995-03-12|1995-05-06|TAKE BACK RETURN|RAIL|ly even accounts affix across the slyly +25189|495|96|1|39|54424.11|0.09|0.05|R|F|1994-01-13|1994-01-23|1994-01-23|TAKE BACK RETURN|REG AIR|t evenly above th +25189|696|28|2|50|79834.50|0.04|0.01|A|F|1993-12-06|1994-01-06|1994-01-03|TAKE BACK RETURN|FOB|r deposits caj +25189|1272|10|3|30|35198.10|0.09|0.00|R|F|1993-12-28|1993-12-19|1994-01-24|DELIVER IN PERSON|SHIP|y pending instructions eat furio +25190|1687|70|1|24|38128.32|0.07|0.02|N|O|1997-12-19|1998-01-15|1998-01-11|TAKE BACK RETURN|RAIL|ggle blithely among the spe +25190|194|21|2|12|13130.28|0.07|0.07|N|O|1998-02-24|1998-03-02|1998-03-21|DELIVER IN PERSON|SHIP|deposits integ +25190|49|75|3|34|32267.36|0.10|0.06|N|O|1997-12-16|1998-02-24|1998-01-12|DELIVER IN PERSON|FOB|uses breach blithely. regul +25190|724|89|4|5|8123.60|0.00|0.07|N|O|1998-01-09|1998-02-20|1998-01-12|NONE|MAIL|ges. regular, unu +25190|348|49|5|30|37450.20|0.06|0.01|N|O|1998-01-03|1998-02-17|1998-01-12|DELIVER IN PERSON|SHIP|ut the ironic, unusual ideas. even packag +25191|180|59|1|50|54009.00|0.08|0.06|A|F|1995-04-12|1995-05-03|1995-05-10|TAKE BACK RETURN|SHIP|tructions. slyly ironic accounts +25191|114|41|2|29|29409.19|0.06|0.04|A|F|1995-04-13|1995-06-07|1995-04-16|COLLECT COD|AIR|ole blithely bold, u +25191|1054|60|3|40|38202.00|0.09|0.02|N|O|1995-06-26|1995-06-01|1995-07-19|COLLECT COD|SHIP|bove the slyly regular packages. carefully +25191|1376|91|4|30|38321.10|0.05|0.08|N|F|1995-06-16|1995-05-29|1995-06-24|TAKE BACK RETURN|SHIP|nts. even, r +25191|761|94|5|36|59823.36|0.00|0.04|R|F|1995-04-17|1995-06-13|1995-05-06|COLLECT COD|FOB|the carefully regular foxes. s +25191|1109|82|6|23|23232.30|0.06|0.07|N|O|1995-06-29|1995-06-19|1995-07-19|COLLECT COD|AIR| slow dependencies according to the f +25216|1740|41|1|42|68953.08|0.08|0.08|A|F|1993-01-08|1993-03-05|1993-02-02|COLLECT COD|SHIP|e quickly darin +25216|1655|79|2|10|15566.50|0.05|0.00|R|F|1993-03-10|1993-02-16|1993-04-08|DELIVER IN PERSON|REG AIR|leep carefully. blithely regular req +25217|1803|4|1|27|46029.60|0.03|0.02|N|O|1998-10-05|1998-09-02|1998-10-07|DELIVER IN PERSON|MAIL|ructions hang furious +25217|631|63|2|33|50543.79|0.10|0.06|N|O|1998-09-14|1998-09-17|1998-09-22|COLLECT COD|REG AIR|olites nag around the even packages. carefu +25217|50|26|3|15|14250.75|0.06|0.02|N|O|1998-07-13|1998-08-03|1998-07-28|DELIVER IN PERSON|SHIP|riously ironic sentiments. even pinto b +25218|1468|8|1|3|4108.38|0.09|0.03|N|O|1998-07-04|1998-05-29|1998-07-16|NONE|TRUCK|tes sleep against the dep +25218|750|15|2|26|42919.50|0.06|0.01|N|O|1998-04-19|1998-06-01|1998-05-14|COLLECT COD|FOB|kly unusual deposits sleep carefully acc +25218|791|56|3|24|40602.96|0.01|0.04|N|O|1998-06-16|1998-05-26|1998-07-14|DELIVER IN PERSON|FOB|posits. fluffily ironic accoun +25218|1600|81|4|43|64568.80|0.03|0.04|N|O|1998-06-01|1998-06-07|1998-06-09|COLLECT COD|RAIL|p carefully about the caref +25218|193|46|5|24|26236.56|0.09|0.04|N|O|1998-05-04|1998-06-12|1998-06-01|TAKE BACK RETURN|SHIP|ess, final instructions integrate. caref +25218|676|39|6|28|44146.76|0.03|0.01|N|O|1998-03-25|1998-06-15|1998-03-31|DELIVER IN PERSON|REG AIR|fully unusual deposits. car +25218|1776|61|7|44|73821.88|0.10|0.07|N|O|1998-06-05|1998-06-22|1998-06-28|COLLECT COD|AIR|uickly along the +25219|1749|92|1|44|72632.56|0.08|0.03|N|O|1997-11-16|1997-10-26|1997-11-28|DELIVER IN PERSON|AIR|ial accounts. blithely even deposits w +25219|921|22|2|12|21863.04|0.09|0.04|N|O|1997-11-13|1997-11-17|1997-12-04|NONE|MAIL|y. unusual excuses are except the carefully +25219|503|94|3|33|46315.50|0.08|0.08|N|O|1997-11-07|1997-10-31|1997-11-27|NONE|REG AIR|ual, final requests haggle expres +25219|1654|78|4|2|3111.30|0.05|0.04|N|O|1997-11-19|1997-11-20|1997-12-11|DELIVER IN PERSON|REG AIR|ajole slyly. blithely pending packages alo +25219|941|10|5|15|27629.10|0.06|0.06|N|O|1997-11-02|1997-11-26|1997-12-02|TAKE BACK RETURN|MAIL|e carefully +25219|398|55|6|1|1298.39|0.01|0.05|N|O|1997-12-25|1997-11-09|1998-01-05|COLLECT COD|AIR| above the +25219|566|27|7|1|1466.56|0.01|0.02|N|O|1997-11-04|1997-10-29|1997-11-23|COLLECT COD|FOB|posits. slyly u +25220|110|37|1|21|21212.31|0.06|0.04|N|O|1997-12-16|1998-01-26|1997-12-27|TAKE BACK RETURN|SHIP|ns use carefully +25220|1569|50|2|34|49999.04|0.07|0.02|N|O|1998-03-15|1998-02-04|1998-03-20|NONE|RAIL|ns maintain ironic, even +25220|1213|88|3|5|5571.05|0.09|0.03|N|O|1998-02-13|1998-01-29|1998-02-17|COLLECT COD|SHIP| deposits must have to haggle +25221|1281|56|1|20|23645.60|0.06|0.01|N|O|1995-07-25|1995-09-04|1995-08-24|DELIVER IN PERSON|SHIP| regular ideas. thin, ironic requests +25221|1498|38|2|44|61577.56|0.09|0.06|N|O|1995-06-20|1995-08-14|1995-07-02|TAKE BACK RETURN|TRUCK| wake alongside +25221|1244|19|3|42|48100.08|0.03|0.02|N|O|1995-10-05|1995-09-10|1995-10-08|TAKE BACK RETURN|SHIP|nic warthogs. slyly f +25221|1008|9|4|32|29088.00|0.09|0.05|N|O|1995-09-28|1995-08-06|1995-10-05|NONE|REG AIR|asymptotes d +25221|1554|75|5|49|71321.95|0.03|0.05|N|O|1995-09-24|1995-08-20|1995-10-09|DELIVER IN PERSON|TRUCK|ven dinos are. furiousl +25221|228|56|6|10|11282.20|0.04|0.01|N|O|1995-06-28|1995-08-24|1995-07-17|TAKE BACK RETURN|RAIL| requests are r +25221|638|1|7|18|27695.34|0.10|0.02|N|O|1995-07-08|1995-08-10|1995-08-01|COLLECT COD|FOB|ress, careful theodolites kindle b +25222|228|10|1|48|54154.56|0.10|0.02|N|O|1998-01-09|1997-12-30|1998-01-22|NONE|SHIP|e slyly pendin +25222|1602|3|2|42|63151.20|0.00|0.07|N|O|1997-12-05|1998-01-17|1997-12-25|COLLECT COD|TRUCK| deposits are. evenly brave ac +25222|1088|89|3|38|37585.04|0.04|0.02|N|O|1998-02-15|1998-01-28|1998-03-05|TAKE BACK RETURN|SHIP|esides the furi +25222|1899|29|4|9|16208.01|0.10|0.05|N|O|1998-03-07|1998-02-20|1998-03-28|DELIVER IN PERSON|RAIL| use blithely furi +25223|1317|56|1|42|51169.02|0.00|0.05|N|O|1996-09-02|1996-06-14|1996-09-15|DELIVER IN PERSON|AIR|er the slyly +25223|1226|1|2|28|31562.16|0.06|0.05|N|O|1996-05-31|1996-07-01|1996-06-20|TAKE BACK RETURN|FOB| furiously unusual, ironic dolphins. e +25223|469|28|3|28|38344.88|0.04|0.05|N|O|1996-08-22|1996-06-19|1996-08-24|COLLECT COD|TRUCK|re slyly along the slyly regular requests. +25223|676|77|4|17|26803.39|0.07|0.05|N|O|1996-05-13|1996-08-07|1996-05-18|NONE|AIR|ymptotes wake silently daring +25223|916|51|5|3|5450.73|0.00|0.03|N|O|1996-06-10|1996-06-11|1996-06-18|TAKE BACK RETURN|MAIL|ckages sleep furiously above +25223|415|74|6|19|24992.79|0.08|0.03|N|O|1996-05-21|1996-06-10|1996-06-05|TAKE BACK RETURN|SHIP|egular accounts. sauter +25248|516|7|1|11|15581.61|0.07|0.03|N|O|1996-03-28|1996-01-11|1996-04-26|DELIVER IN PERSON|SHIP|of the furiousl +25248|1610|11|2|8|12092.88|0.03|0.06|N|O|1996-01-04|1996-01-25|1996-01-05|TAKE BACK RETURN|MAIL|e-- slyly regular accounts are sly +25248|1345|60|3|18|22434.12|0.05|0.01|N|O|1996-01-25|1996-01-06|1996-02-17|NONE|TRUCK|c deposits. ironic the +25248|844|45|4|12|20938.08|0.05|0.05|N|O|1996-01-24|1996-01-19|1996-02-12|DELIVER IN PERSON|REG AIR|osits use quickly. regular, special ins +25249|1520|21|1|17|24165.84|0.06|0.00|A|F|1992-11-08|1993-02-01|1992-11-18|DELIVER IN PERSON|AIR|as unwind about the +25249|1683|66|2|38|60217.84|0.07|0.06|R|F|1993-02-24|1992-12-17|1993-03-06|DELIVER IN PERSON|TRUCK|ets alongside +25249|82|33|3|25|24552.00|0.08|0.02|A|F|1993-02-04|1993-02-01|1993-02-21|NONE|MAIL|sleep above the bo +25249|115|94|4|19|19287.09|0.05|0.02|A|F|1992-12-28|1992-12-11|1993-01-25|TAKE BACK RETURN|TRUCK|. special accounts eat sometimes unus +25250|532|93|1|43|61598.79|0.08|0.00|N|O|1995-07-25|1995-09-14|1995-08-06|COLLECT COD|TRUCK|ual platelets. furiously bold theodo +25251|218|73|1|13|14536.73|0.01|0.02|N|O|1996-09-14|1996-07-06|1996-09-23|TAKE BACK RETURN|TRUCK|bold platelets use. furiously regular +25251|1643|26|2|1|1544.64|0.00|0.02|N|O|1996-07-21|1996-06-24|1996-08-20|COLLECT COD|MAIL|ly among the blithely unusual pin +25251|1105|6|3|26|26158.60|0.04|0.06|N|O|1996-06-23|1996-08-07|1996-07-14|NONE|AIR|nstructions cajole furious +25251|1631|73|4|45|68968.35|0.10|0.01|N|O|1996-07-28|1996-07-11|1996-08-20|TAKE BACK RETURN|RAIL|sts wake about the bold packages. s +25251|1541|22|5|38|54816.52|0.09|0.08|N|O|1996-07-19|1996-06-19|1996-08-14|DELIVER IN PERSON|TRUCK|sits; platelets sl +25251|1337|76|6|46|56963.18|0.10|0.02|N|O|1996-06-01|1996-08-03|1996-06-16|COLLECT COD|MAIL|efully bold +25252|1766|93|1|17|28351.92|0.00|0.08|A|F|1992-09-10|1992-09-06|1992-09-23|DELIVER IN PERSON|TRUCK|ven accounts detect qui +25252|643|75|2|7|10805.48|0.02|0.04|R|F|1992-09-12|1992-10-14|1992-09-17|DELIVER IN PERSON|FOB|quests impress. quickly final +25253|1290|65|1|10|11912.90|0.06|0.03|N|O|1995-08-18|1995-09-28|1995-08-29|TAKE BACK RETURN|MAIL|bold, regular ideas boost above the slyl +25253|954|55|2|38|70488.10|0.05|0.08|N|O|1995-10-08|1995-10-06|1995-11-04|COLLECT COD|MAIL|aggle furiously around the quickly reg +25253|1763|48|3|46|76578.96|0.06|0.00|N|O|1995-11-12|1995-09-15|1995-11-23|NONE|REG AIR|ins. regular requests r +25253|1401|2|4|17|22140.80|0.06|0.06|N|O|1995-09-21|1995-10-02|1995-09-30|NONE|TRUCK|iously alongside of the +25253|1340|17|5|45|55860.30|0.03|0.06|N|O|1995-10-10|1995-09-19|1995-10-14|TAKE BACK RETURN|RAIL|ar foxes. platelets according to the +25253|1986|19|6|50|94399.00|0.10|0.07|N|O|1995-08-14|1995-10-29|1995-09-12|DELIVER IN PERSON|RAIL|es sleep carefully fluffily silent theodol +25253|921|24|7|16|29150.72|0.07|0.02|N|O|1995-08-26|1995-09-30|1995-09-14|COLLECT COD|AIR|endencies. even, sile +25254|840|41|1|16|27853.44|0.04|0.08|R|F|1993-12-31|1993-12-16|1994-01-20|DELIVER IN PERSON|REG AIR|uriously even +25254|1585|66|2|35|52030.30|0.05|0.03|A|F|1993-10-30|1993-10-26|1993-11-05|NONE|MAIL|ages sleep carefully. final packages need +25254|124|51|3|24|24578.88|0.08|0.04|A|F|1993-11-12|1993-12-17|1993-12-09|COLLECT COD|TRUCK|old courts integrate furi +25254|129|30|4|36|37048.32|0.07|0.08|A|F|1993-09-30|1993-12-06|1993-10-15|TAKE BACK RETURN|FOB|sual, final deposits. +25254|312|97|5|40|48492.40|0.01|0.06|A|F|1993-12-02|1993-10-29|1993-12-13|TAKE BACK RETURN|RAIL|l platelets. express pinto beans use f +25254|1478|79|6|42|57937.74|0.00|0.04|R|F|1993-11-11|1993-11-25|1993-11-12|TAKE BACK RETURN|AIR|deposits would integrate. fur +25255|1118|19|1|20|20382.20|0.04|0.08|R|F|1992-03-18|1992-05-09|1992-04-15|COLLECT COD|SHIP|carefully special warthogs. furiously +25255|1827|71|2|41|70881.62|0.09|0.06|R|F|1992-05-25|1992-04-22|1992-06-12|NONE|SHIP|pinto beans nag careful +25255|403|4|3|10|13034.00|0.05|0.04|R|F|1992-02-23|1992-04-11|1992-02-28|TAKE BACK RETURN|AIR|ironic, final +25255|1163|72|4|39|41502.24|0.07|0.03|A|F|1992-05-07|1992-04-18|1992-05-24|DELIVER IN PERSON|TRUCK|ully regular foxes. bold pinto beans w +25280|1567|8|1|33|48462.48|0.06|0.06|N|O|1995-06-18|1995-08-04|1995-07-14|NONE|REG AIR|into beans. furiously unus +25280|1777|62|2|43|72187.11|0.07|0.00|N|O|1995-08-31|1995-07-20|1995-09-09|NONE|RAIL|kages mold regular excuses. d +25281|69|70|1|11|10659.66|0.02|0.04|N|O|1996-06-02|1996-06-11|1996-06-14|COLLECT COD|AIR|ts. instructions alongside of the fl +25281|1554|95|2|24|34933.20|0.04|0.02|N|O|1996-04-04|1996-05-12|1996-04-11|COLLECT COD|SHIP|s about the quickly expre +25281|394|23|3|18|23299.02|0.09|0.08|N|O|1996-06-11|1996-05-12|1996-07-09|DELIVER IN PERSON|TRUCK|he quickly ironic foxes must +25281|1074|75|4|16|15601.12|0.10|0.07|N|O|1996-06-24|1996-06-23|1996-06-30|DELIVER IN PERSON|RAIL|alongside of t +25281|964|65|5|39|72733.44|0.09|0.01|N|O|1996-07-02|1996-06-07|1996-07-11|COLLECT COD|SHIP|nal accounts doze af +25282|682|14|1|48|75968.64|0.04|0.05|N|O|1996-04-20|1996-03-10|1996-05-01|TAKE BACK RETURN|REG AIR|alongside of the carefully even +25282|734|67|2|4|6538.92|0.04|0.07|N|O|1996-03-31|1996-02-12|1996-04-15|NONE|TRUCK|ests use carefully against the requests +25282|122|23|3|1|1022.12|0.09|0.00|N|O|1996-04-23|1996-03-31|1996-05-12|COLLECT COD|SHIP|usly unusual dolphins. furiously regula +25282|497|27|4|48|67079.52|0.03|0.06|N|O|1996-01-16|1996-03-02|1996-02-02|TAKE BACK RETURN|AIR|s haggle accounts: regular, +25282|1866|96|5|31|54803.66|0.01|0.06|N|O|1996-03-24|1996-03-20|1996-04-15|NONE|AIR| deposits. final, un +25282|776|9|6|35|58686.95|0.02|0.08|N|O|1996-03-03|1996-03-30|1996-03-13|COLLECT COD|SHIP|xpress instructions wake +25282|698|61|7|16|25579.04|0.04|0.05|N|O|1996-04-01|1996-02-25|1996-04-17|DELIVER IN PERSON|AIR|arefully blithe requ +25283|680|74|1|48|75872.64|0.10|0.06|N|O|1998-09-27|1998-09-20|1998-10-11|DELIVER IN PERSON|AIR|y pending +25283|1974|19|2|5|9379.85|0.03|0.00|N|O|1998-08-16|1998-08-12|1998-09-14|DELIVER IN PERSON|SHIP|kly after the re +25283|184|11|3|16|17346.88|0.09|0.00|N|O|1998-10-04|1998-08-28|1998-10-30|COLLECT COD|RAIL|ng to the requests are furiously accordi +25283|344|73|4|30|37330.20|0.04|0.04|N|O|1998-10-08|1998-07-28|1998-11-06|COLLECT COD|TRUCK|carefully fin +25283|1865|52|5|43|75974.98|0.08|0.03|N|O|1998-07-03|1998-09-19|1998-07-17|NONE|TRUCK|nag quickly abou +25284|494|53|1|31|43229.19|0.04|0.06|A|F|1993-12-12|1993-12-08|1994-01-05|DELIVER IN PERSON|SHIP|ackages integrate slyly regular asymptotes. +25284|1830|74|2|38|65809.54|0.05|0.04|R|F|1994-01-06|1993-11-16|1994-01-16|TAKE BACK RETURN|FOB|y fluffily ironic pinto beans +25284|400|1|3|32|41612.80|0.01|0.03|A|F|1993-11-10|1993-12-10|1993-12-05|TAKE BACK RETURN|REG AIR|press ideas. requests +25284|1289|64|4|8|9522.24|0.00|0.05|A|F|1993-11-23|1993-11-05|1993-11-27|TAKE BACK RETURN|FOB|ular platelets haggle after the bold, +25285|1568|69|1|19|27921.64|0.08|0.01|N|O|1995-10-24|1995-10-22|1995-11-21|TAKE BACK RETURN|AIR|e blithely accounts. quickly special acc +25286|1286|98|1|45|53427.60|0.02|0.03|N|O|1996-08-11|1996-08-29|1996-09-03|COLLECT COD|MAIL|the furiously regular foxes nag ironic excu +25286|1022|58|2|21|19383.42|0.00|0.00|N|O|1996-09-20|1996-10-25|1996-09-25|TAKE BACK RETURN|FOB| according to the ironic, unusu +25286|250|78|3|40|46010.00|0.08|0.00|N|O|1996-11-16|1996-09-21|1996-11-30|DELIVER IN PERSON|TRUCK|platelets haggle +25287|1151|88|1|2|2104.30|0.10|0.01|A|F|1994-01-03|1994-02-01|1994-01-21|DELIVER IN PERSON|SHIP|uests wake carefully careful +25287|1371|10|2|11|13996.07|0.07|0.02|R|F|1994-04-14|1994-03-09|1994-04-28|NONE|RAIL|es. regular requests integr +25287|1637|79|3|33|50774.79|0.02|0.08|R|F|1994-04-15|1994-03-17|1994-04-25|COLLECT COD|SHIP|haggle above the quickly final depos +25287|1571|52|4|19|27978.83|0.10|0.04|R|F|1994-03-20|1994-02-22|1994-04-13|TAKE BACK RETURN|FOB|lyly regular packages! pending foxes caj +25312|428|29|1|28|37195.76|0.06|0.05|N|O|1996-06-16|1996-04-25|1996-07-15|NONE|REG AIR|. permanently pending warhorse +25312|1836|23|2|17|29543.11|0.07|0.00|N|O|1996-05-29|1996-06-10|1996-06-15|DELIVER IN PERSON|RAIL|ironic courts. i +25312|1345|84|3|15|18695.10|0.06|0.08|N|O|1996-06-21|1996-04-23|1996-07-08|COLLECT COD|TRUCK| carefully even pinto beans. slyly fin +25312|1569|50|4|2|2941.12|0.02|0.05|N|O|1996-03-30|1996-06-02|1996-04-27|COLLECT COD|AIR|hely furiously silent de +25312|1474|75|5|2|2750.94|0.04|0.08|N|O|1996-04-13|1996-06-02|1996-04-25|NONE|TRUCK|the requests. furiously even ideas s +25313|1594|95|1|42|62814.78|0.07|0.02|R|F|1992-09-10|1992-10-22|1992-09-26|DELIVER IN PERSON|AIR|ress requests use about the +25313|1715|16|2|7|11316.97|0.00|0.01|A|F|1992-09-07|1992-10-01|1992-09-08|TAKE BACK RETURN|SHIP|e quickly. accounts dazzle blit +25313|1015|51|3|35|32060.35|0.03|0.02|A|F|1992-10-07|1992-10-22|1992-10-16|COLLECT COD|SHIP|e slyly final theodo +25314|1062|33|1|41|39485.46|0.01|0.05|R|F|1992-04-27|1992-04-20|1992-05-05|TAKE BACK RETURN|MAIL|ct. slyly bold courts haggle slyly sp +25314|834|34|2|30|52044.90|0.02|0.00|R|F|1992-03-19|1992-05-18|1992-03-31|COLLECT COD|FOB|ven gifts. slyly final +25314|1175|84|3|45|48427.65|0.06|0.04|A|F|1992-04-25|1992-04-24|1992-05-06|DELIVER IN PERSON|REG AIR|encies haggle +25314|1757|100|4|41|68008.75|0.06|0.08|R|F|1992-04-16|1992-04-06|1992-04-26|TAKE BACK RETURN|TRUCK|e furiously careful packa +25314|1851|52|5|8|14022.80|0.08|0.02|A|F|1992-06-06|1992-04-07|1992-06-10|NONE|REG AIR|onic packages +25314|1410|50|6|15|19671.15|0.07|0.02|R|F|1992-05-12|1992-04-04|1992-05-29|DELIVER IN PERSON|REG AIR|cial requests wake idly blithely regu +25314|608|40|7|28|42240.80|0.05|0.05|A|F|1992-03-12|1992-05-11|1992-03-30|COLLECT COD|MAIL|iously special deposits. blithely pending i +25315|73|24|1|8|7784.56|0.08|0.04|R|F|1994-03-07|1994-01-12|1994-03-17|COLLECT COD|SHIP|ions sleep slyly regular r +25315|578|39|2|48|70971.36|0.07|0.05|A|F|1994-03-06|1994-01-25|1994-03-17|NONE|MAIL|s are fluffily aft +25315|778|11|3|13|21824.01|0.04|0.08|A|F|1994-01-01|1994-01-03|1994-01-02|DELIVER IN PERSON|MAIL| even dependencies haggle above the unusual +25315|578|9|4|24|35485.68|0.03|0.04|A|F|1994-02-03|1994-02-17|1994-02-15|NONE|SHIP| ironic, regular excuses. slyly final fox +25315|1689|31|5|20|31813.60|0.06|0.02|R|F|1994-02-19|1994-01-25|1994-03-21|COLLECT COD|FOB|. regular ideas use furiously. quic +25315|1072|43|6|24|23353.68|0.08|0.06|A|F|1994-03-02|1994-02-18|1994-03-22|COLLECT COD|MAIL|ymptotes. carefully bold request +25315|608|40|7|16|24137.60|0.10|0.00|A|F|1994-02-21|1994-02-18|1994-03-07|COLLECT COD|MAIL|s cajole. special packag +25316|850|17|1|14|24511.90|0.05|0.01|N|O|1997-02-08|1997-01-27|1997-03-08|TAKE BACK RETURN|SHIP| bold dolphins. slyly pending d +25316|1406|85|2|20|26148.00|0.01|0.00|N|O|1997-02-22|1997-01-30|1997-03-13|COLLECT COD|MAIL|slyly ironi +25316|671|65|3|36|56580.12|0.02|0.08|N|O|1997-01-31|1997-02-03|1997-02-20|COLLECT COD|AIR|ly. slyly special reques +25316|40|41|4|47|44181.88|0.07|0.00|N|O|1997-02-06|1996-12-27|1997-02-20|TAKE BACK RETURN|FOB|s. carefully even ideas nag. ruthless, +25316|1068|69|5|8|7752.48|0.01|0.05|N|O|1996-11-28|1997-01-17|1996-12-28|DELIVER IN PERSON|TRUCK|en excuses. quickl +25317|34|35|1|10|9340.30|0.01|0.01|N|O|1995-07-08|1995-08-19|1995-07-11|NONE|FOB| asymptotes across the final +25317|187|14|2|19|20656.42|0.06|0.04|N|O|1995-09-02|1995-08-13|1995-09-30|NONE|FOB|kly even asympt +25317|75|26|3|21|20476.47|0.02|0.02|N|O|1995-09-24|1995-09-25|1995-10-01|NONE|FOB|riously ironic requests abo +25318|719|20|1|40|64788.40|0.04|0.02|N|O|1996-01-29|1996-02-09|1996-02-08|DELIVER IN PERSON|TRUCK|gs boost slyly even +25318|116|95|2|35|35563.85|0.05|0.04|N|O|1996-02-26|1996-01-11|1996-03-03|COLLECT COD|AIR|quickly blithely final theodolites. +25318|1678|2|3|36|56868.12|0.09|0.04|N|O|1996-01-04|1996-01-22|1996-01-20|NONE|TRUCK|ironic pearls nag +25318|446|47|4|25|33661.00|0.06|0.02|N|O|1996-01-30|1995-12-29|1996-02-15|NONE|MAIL|ag final requests. carefu +25318|616|48|5|28|42465.08|0.05|0.00|N|O|1996-02-13|1996-01-14|1996-03-10|DELIVER IN PERSON|AIR|ckly furiously final foxes. quickly ironic +25319|1677|1|1|26|41045.42|0.03|0.08|N|O|1997-05-21|1997-05-04|1997-06-09|COLLECT COD|MAIL|le carefully after the even foxes +25319|285|40|2|40|47411.20|0.08|0.02|N|O|1997-04-20|1997-05-09|1997-04-24|COLLECT COD|RAIL|xes. slyly fluffy fo +25319|1280|92|3|43|50795.04|0.01|0.04|N|O|1997-06-12|1997-03-24|1997-06-27|TAKE BACK RETURN|MAIL|ntegrate idly ironi +25319|1793|20|4|18|30506.22|0.00|0.02|N|O|1997-03-28|1997-05-12|1997-04-01|NONE|TRUCK| the carefully regular foxes. blithely +25344|1198|7|1|47|51661.93|0.02|0.06|N|O|1997-04-16|1997-06-30|1997-05-02|TAKE BACK RETURN|TRUCK|ans haggle furiously quickly pending pinto +25345|457|16|1|34|46153.30|0.02|0.03|N|O|1996-06-06|1996-06-17|1996-06-17|DELIVER IN PERSON|FOB|ecial packages abou +25345|21|22|2|10|9210.20|0.00|0.00|N|O|1996-05-04|1996-06-21|1996-05-12|COLLECT COD|AIR|ependencies. +25346|954|57|1|22|40808.90|0.10|0.02|N|O|1997-09-25|1997-11-19|1997-10-14|DELIVER IN PERSON|FOB| packages boost furiously after the flu +25346|1948|37|2|44|81397.36|0.06|0.05|N|O|1997-12-04|1997-10-16|1998-01-03|NONE|AIR| the carefully expres +25346|1002|38|3|37|33411.00|0.06|0.08|N|O|1997-12-18|1997-10-19|1998-01-01|DELIVER IN PERSON|TRUCK|refully. furiously special in +25347|359|60|1|13|16371.55|0.03|0.03|A|F|1994-06-22|1994-09-11|1994-07-03|COLLECT COD|FOB|unusual packages may haggle fu +25347|49|25|2|25|23726.00|0.08|0.07|R|F|1994-08-28|1994-08-28|1994-09-02|NONE|AIR|egular packages are about the iro +25347|178|31|3|23|24797.91|0.10|0.00|A|F|1994-08-01|1994-08-14|1994-08-18|COLLECT COD|RAIL|ke blithely. evenly even accounts us +25347|1502|83|4|10|14035.00|0.01|0.04|R|F|1994-10-06|1994-08-10|1994-11-03|NONE|TRUCK| silent deposits. pending ex +25347|406|7|5|10|13064.00|0.00|0.06|R|F|1994-06-14|1994-08-21|1994-07-04|TAKE BACK RETURN|REG AIR|uld have to haggle. final theodolites +25347|1555|36|6|23|33500.65|0.09|0.01|R|F|1994-08-08|1994-08-16|1994-08-28|DELIVER IN PERSON|TRUCK|slyly regular orbits. slyly pendi +25347|248|30|7|19|21816.56|0.09|0.02|R|F|1994-07-14|1994-09-09|1994-07-29|COLLECT COD|RAIL|e carefully against the +25348|1359|36|1|27|34029.45|0.00|0.05|A|F|1992-08-28|1992-07-30|1992-08-31|COLLECT COD|MAIL|lyly. slyly regular ide +25348|244|99|2|28|32038.72|0.00|0.06|R|F|1992-09-08|1992-07-20|1992-09-22|COLLECT COD|FOB| packages instea +25348|1294|32|3|19|22710.51|0.09|0.03|A|F|1992-08-10|1992-07-24|1992-08-28|COLLECT COD|AIR|leep quickly +25348|1169|78|4|32|34245.12|0.05|0.05|R|F|1992-05-12|1992-06-15|1992-05-25|TAKE BACK RETURN|FOB|l, pending requests. final, unusu +25348|1305|82|5|29|34982.70|0.02|0.02|R|F|1992-08-06|1992-07-26|1992-08-14|DELIVER IN PERSON|AIR|ackages sleep fluffily bold ideas. +25348|1411|90|6|7|9186.87|0.01|0.03|R|F|1992-06-08|1992-08-06|1992-06-23|COLLECT COD|SHIP|ngside of the packages detect carefull +25349|410|69|1|41|53726.81|0.07|0.07|N|O|1996-05-18|1996-04-04|1996-06-16|DELIVER IN PERSON|REG AIR|uickly regular +25349|132|59|2|5|5160.65|0.05|0.00|N|O|1996-05-28|1996-03-10|1996-06-13|TAKE BACK RETURN|RAIL|ainst the final, express packages. +25349|164|91|3|5|5320.80|0.07|0.01|N|O|1996-05-11|1996-04-12|1996-05-30|NONE|MAIL|yly bold asympto +25350|1837|24|1|10|17388.30|0.01|0.07|R|F|1994-03-05|1994-03-03|1994-03-10|TAKE BACK RETURN|TRUCK|e fluffily across the blithely unusual fo +25350|416|46|2|46|60554.86|0.04|0.00|R|F|1994-02-15|1994-02-05|1994-02-21|COLLECT COD|FOB|w theodolites sleep abo +25350|1587|8|3|40|59543.20|0.06|0.00|A|F|1994-01-21|1994-01-24|1994-02-07|DELIVER IN PERSON|REG AIR| final excuses sleep furiously. iro +25350|1725|68|4|37|60188.64|0.06|0.03|A|F|1993-12-27|1994-01-03|1994-01-19|TAKE BACK RETURN|FOB|ly regular deposits affix accounts. +25350|1010|11|5|27|24597.27|0.02|0.05|A|F|1994-04-04|1994-01-08|1994-05-02|NONE|MAIL|ly regular accounts sleep slyly sl +25350|31|57|6|21|19551.63|0.07|0.02|R|F|1994-01-06|1994-01-07|1994-01-15|TAKE BACK RETURN|FOB|y. silent frays nag +25350|1222|60|7|42|47175.24|0.07|0.05|A|F|1994-04-01|1994-01-20|1994-04-10|DELIVER IN PERSON|TRUCK|lithely pending fox +25351|1729|30|1|23|37506.56|0.03|0.05|R|F|1992-01-27|1992-03-27|1992-02-06|TAKE BACK RETURN|REG AIR|nding pinto +25376|1398|13|1|13|16892.07|0.01|0.07|R|F|1995-05-31|1995-06-22|1995-06-17|NONE|SHIP|slyly slow packages +25376|412|42|2|48|62995.68|0.09|0.03|A|F|1995-04-06|1995-06-24|1995-04-07|TAKE BACK RETURN|REG AIR|ccounts. spe +25376|258|86|3|12|13899.00|0.04|0.07|A|F|1995-05-23|1995-04-28|1995-06-15|TAKE BACK RETURN|AIR|onically regular deposits. +25377|1430|9|1|13|17308.59|0.08|0.06|A|F|1993-01-23|1993-02-13|1993-02-05|TAKE BACK RETURN|AIR| have to wake special, bold accounts +25378|674|6|1|23|36217.41|0.03|0.00|N|O|1995-12-23|1996-02-09|1996-01-12|NONE|RAIL|e regular pac +25378|880|80|2|16|28494.08|0.07|0.07|N|O|1996-03-04|1996-02-24|1996-03-18|COLLECT COD|TRUCK|s cajole ca +25378|524|85|3|18|25641.36|0.04|0.02|N|O|1996-02-08|1996-02-25|1996-02-13|TAKE BACK RETURN|TRUCK|ckly even platelets d +25378|1639|81|4|1|1540.63|0.09|0.08|N|O|1995-12-21|1996-01-28|1996-01-03|COLLECT COD|TRUCK|y express accounts across the slyly +25379|1023|29|1|11|10164.22|0.09|0.07|N|O|1997-01-23|1996-12-24|1997-02-22|COLLECT COD|SHIP|blithely regular instru +25380|26|2|1|1|926.02|0.04|0.03|A|F|1995-01-17|1994-12-25|1995-01-25|TAKE BACK RETURN|FOB|the regula +25380|558|49|2|7|10209.85|0.09|0.06|A|F|1994-11-24|1994-12-06|1994-12-17|DELIVER IN PERSON|FOB|ithely across +25381|1749|92|1|49|80886.26|0.10|0.04|N|O|1996-12-14|1996-11-17|1996-12-29|TAKE BACK RETURN|RAIL|blithely silent foxes haggl +25382|1835|79|1|35|60789.05|0.08|0.06|N|O|1998-07-10|1998-08-01|1998-07-29|NONE|SHIP|le express +25383|865|65|1|34|60039.24|0.00|0.00|N|O|1998-01-13|1998-01-08|1998-01-16|COLLECT COD|SHIP|cross the never bold pinto beans. unusua +25383|1239|40|2|7|7981.61|0.01|0.02|N|O|1997-12-07|1998-02-24|1997-12-08|NONE|REG AIR|thely alongside of the furiousl +25408|349|6|1|27|33732.18|0.06|0.05|N|O|1996-04-04|1996-02-11|1996-04-22|TAKE BACK RETURN|MAIL|cial asymptotes. blithely unusual pack +25408|76|27|2|17|16593.19|0.05|0.01|N|O|1996-03-08|1996-04-06|1996-03-11|NONE|AIR|counts. furiously ironic accounts are ag +25409|1876|63|1|15|26668.05|0.10|0.08|N|O|1998-01-25|1997-11-23|1998-02-22|TAKE BACK RETURN|FOB|fluffily requests. slyly bold exc +25409|632|33|2|5|7663.15|0.01|0.02|N|O|1997-12-09|1997-12-16|1997-12-20|NONE|FOB| across the b +25409|871|5|3|19|33665.53|0.05|0.02|N|O|1997-11-11|1997-12-09|1997-11-13|COLLECT COD|RAIL|wind above t +25409|573|74|4|21|30944.97|0.10|0.03|N|O|1997-12-21|1997-11-23|1998-01-16|DELIVER IN PERSON|FOB|regular requests. slyly unusual deposits ma +25410|906|7|1|4|7227.60|0.06|0.04|N|O|1998-06-24|1998-05-11|1998-07-16|DELIVER IN PERSON|FOB|nal packages cajole. quickly regular exc +25410|1162|35|2|4|4252.64|0.00|0.00|N|O|1998-06-10|1998-04-29|1998-07-10|TAKE BACK RETURN|MAIL|ns. carefully br +25410|1233|71|3|31|35161.13|0.02|0.08|N|O|1998-05-17|1998-05-25|1998-05-19|TAKE BACK RETURN|FOB|quests affix across +25410|1705|6|4|31|49807.70|0.02|0.03|N|O|1998-07-13|1998-05-23|1998-07-26|TAKE BACK RETURN|SHIP|ct furiously. dogge +25410|1484|63|5|9|12469.32|0.02|0.02|N|O|1998-05-04|1998-04-19|1998-06-03|NONE|AIR|uickly even instructions. deposits c +25410|1465|66|6|24|32795.04|0.10|0.03|N|O|1998-07-10|1998-06-13|1998-08-03|COLLECT COD|REG AIR|dependencie +25410|1168|69|7|49|52388.84|0.06|0.05|N|O|1998-06-02|1998-04-29|1998-06-07|NONE|AIR| quickly even instructions was according to +25411|1807|37|1|28|47846.40|0.01|0.08|N|O|1997-06-28|1997-06-07|1997-07-15|DELIVER IN PERSON|AIR|t instructions sleep blithely ev +25411|229|11|2|41|46298.02|0.02|0.04|N|O|1997-05-18|1997-04-25|1997-06-05|TAKE BACK RETURN|MAIL|pinto beans. carefully pen +25411|1125|26|3|43|44123.16|0.01|0.07|N|O|1997-05-05|1997-05-07|1997-05-21|TAKE BACK RETURN|TRUCK|. final requests are. regular +25411|477|7|4|17|23416.99|0.02|0.02|N|O|1997-06-07|1997-05-18|1997-06-09|DELIVER IN PERSON|FOB|ut the fluffily regular foxes. +25412|1837|67|1|1|1738.83|0.00|0.06|N|O|1995-07-21|1995-08-27|1995-08-15|DELIVER IN PERSON|RAIL|final theodo +25412|1611|12|2|15|22689.15|0.08|0.02|N|O|1995-07-08|1995-08-25|1995-07-19|NONE|SHIP|equests. blithely pending asym +25412|279|80|3|24|28302.48|0.02|0.06|N|O|1995-09-19|1995-08-10|1995-10-09|TAKE BACK RETURN|TRUCK|deposits. close +25412|681|44|4|32|50613.76|0.04|0.06|N|O|1995-09-22|1995-07-07|1995-10-20|NONE|SHIP|ickly even +25412|1920|65|5|50|91096.00|0.10|0.00|N|O|1995-08-03|1995-07-14|1995-08-21|DELIVER IN PERSON|TRUCK|dencies haggle a +25412|668|100|6|39|61177.74|0.09|0.01|N|O|1995-08-31|1995-07-24|1995-09-10|TAKE BACK RETURN|FOB|ole. slowly regular frets use: +25412|1098|99|7|46|45958.14|0.03|0.03|N|O|1995-06-25|1995-08-24|1995-07-15|DELIVER IN PERSON|MAIL|gage. regular packages nag bli +25413|1370|9|1|3|3814.11|0.10|0.00|N|O|1996-11-24|1996-11-25|1996-12-22|TAKE BACK RETURN|FOB|eposits sleep furiously ironic pack +25413|995|96|2|1|1895.99|0.08|0.03|N|O|1996-10-18|1996-10-22|1996-11-10|NONE|TRUCK|al deposits. blithely ironic pinto be +25413|924|25|3|15|27373.80|0.06|0.03|N|O|1997-01-02|1996-11-23|1997-01-08|DELIVER IN PERSON|REG AIR|rbits was boldly foxes. final pinto bea +25413|887|88|4|31|55424.28|0.04|0.08|N|O|1996-11-18|1996-12-12|1996-12-15|DELIVER IN PERSON|REG AIR|instructions wake. accounts above the theod +25413|469|28|5|13|17802.98|0.09|0.05|N|O|1996-09-17|1996-11-22|1996-10-09|TAKE BACK RETURN|SHIP|lly express accounts. requests across the r +25413|1631|32|6|19|29119.97|0.07|0.05|N|O|1996-12-23|1996-11-01|1997-01-01|COLLECT COD|TRUCK|foxes. slyly regular inst +25413|890|24|7|8|14327.12|0.04|0.02|N|O|1996-10-10|1996-10-31|1996-10-14|TAKE BACK RETURN|SHIP| are even, regular account +25414|882|16|1|40|71315.20|0.04|0.05|N|O|1996-08-03|1996-05-26|1996-08-25|DELIVER IN PERSON|REG AIR|ly slyly ironic foxes. quickly even foxes +25414|144|45|2|20|20882.80|0.10|0.07|N|O|1996-06-24|1996-05-20|1996-06-25|COLLECT COD|MAIL|tions cajole above the slyly ironic +25414|1993|38|3|15|28424.85|0.09|0.05|N|O|1996-08-02|1996-07-14|1996-08-05|TAKE BACK RETURN|RAIL|platelets. slyly regular packages are afte +25414|1875|19|4|6|10661.22|0.06|0.08|N|O|1996-06-25|1996-05-28|1996-07-08|NONE|MAIL|sly pending instructions. furiously even i +25414|110|63|5|8|8080.88|0.02|0.08|N|O|1996-04-28|1996-07-12|1996-05-22|NONE|AIR|ns use iron +25414|895|62|6|47|84406.83|0.07|0.05|N|O|1996-06-24|1996-07-17|1996-07-14|COLLECT COD|FOB|ly regular deposits use blithely. excuses +25415|227|55|1|43|48470.46|0.05|0.00|N|O|1998-01-02|1997-12-16|1998-01-06|COLLECT COD|FOB|g the ironic platelets. express req +25415|1911|56|2|44|79768.04|0.03|0.04|N|O|1997-12-02|1998-01-18|1997-12-13|NONE|AIR|furiously slowly final packages. careful +25415|1363|40|3|46|58160.56|0.09|0.06|N|O|1997-12-08|1998-02-03|1998-01-04|DELIVER IN PERSON|RAIL|ake idly slyly regul +25415|1297|72|4|49|58716.21|0.10|0.02|N|O|1998-01-17|1997-12-20|1998-01-25|NONE|REG AIR|ly slyly sil +25415|1158|31|5|17|18005.55|0.05|0.00|N|O|1997-12-02|1997-12-20|1997-12-04|DELIVER IN PERSON|REG AIR|toward the quickly special do +25415|945|80|6|9|16613.46|0.09|0.04|N|O|1998-03-10|1998-02-07|1998-04-09|TAKE BACK RETURN|AIR|ideas are c +25415|1787|14|7|15|25331.70|0.04|0.01|N|O|1998-01-28|1998-02-07|1998-01-29|COLLECT COD|FOB|y even requ +25440|818|19|1|1|1718.81|0.07|0.01|R|F|1994-03-05|1994-04-13|1994-03-16|COLLECT COD|AIR|ites print blithely furiously +25440|427|28|2|15|19911.30|0.10|0.03|R|F|1994-05-03|1994-03-19|1994-05-24|COLLECT COD|AIR|eodolites use. furiously e +25440|925|60|3|40|73036.80|0.07|0.04|R|F|1994-05-28|1994-03-26|1994-06-25|NONE|MAIL|furiously regular re +25440|676|77|4|37|58336.79|0.01|0.05|R|F|1994-04-03|1994-03-16|1994-04-19|DELIVER IN PERSON|SHIP|gular, regular ideas are fluffily ir +25440|185|12|5|49|53173.82|0.08|0.01|R|F|1994-03-11|1994-03-27|1994-03-29|TAKE BACK RETURN|TRUCK|es wake final deposits. quickly +25440|47|23|6|32|30305.28|0.08|0.05|A|F|1994-06-04|1994-03-26|1994-06-10|DELIVER IN PERSON|MAIL|ic waters. fluffi +25441|939|42|1|17|31278.81|0.10|0.08|A|F|1995-03-18|1995-03-08|1995-03-19|COLLECT COD|AIR|ly ironic packages detect regular packag +25442|1766|93|1|17|28351.92|0.00|0.03|A|F|1992-01-26|1992-02-21|1992-02-20|COLLECT COD|AIR|ly unusual ideas +25442|971|72|2|23|43055.31|0.00|0.06|A|F|1992-03-20|1992-02-15|1992-04-06|TAKE BACK RETURN|AIR|instructions! special, ruthless theodoli +25442|1157|94|3|33|34918.95|0.06|0.05|A|F|1992-03-27|1992-02-29|1992-04-05|COLLECT COD|MAIL|ets haggle sl +25442|463|51|4|23|31359.58|0.09|0.06|A|F|1992-04-05|1992-03-19|1992-05-04|DELIVER IN PERSON|MAIL|aggle alongside of the bravely ironi +25442|1998|43|5|3|5699.97|0.05|0.07|A|F|1992-04-12|1992-03-31|1992-04-20|COLLECT COD|MAIL|kly upon the +25443|1829|30|1|19|32885.58|0.05|0.08|A|F|1992-12-02|1992-11-07|1992-12-10|NONE|REG AIR|ickly even theodolites. closely pending ac +25443|1303|42|2|33|39741.90|0.07|0.03|A|F|1992-11-21|1992-11-21|1992-11-25|COLLECT COD|REG AIR|osely bold, regular ideas. ironic deposi +25443|930|99|3|13|23802.09|0.04|0.07|R|F|1992-10-23|1992-11-23|1992-11-12|COLLECT COD|TRUCK|around the bold packages. e +25444|77|3|1|2|1954.14|0.02|0.05|R|F|1993-05-14|1993-03-05|1993-05-27|DELIVER IN PERSON|REG AIR| express dolphins. furiously even +25444|1572|13|2|30|44207.10|0.02|0.07|A|F|1993-04-07|1993-03-24|1993-04-17|DELIVER IN PERSON|REG AIR|he even requests. furiously f +25445|957|58|1|50|92897.50|0.06|0.00|A|F|1994-05-31|1994-08-07|1994-06-30|DELIVER IN PERSON|REG AIR|the packages caj +25445|31|57|2|11|10241.33|0.06|0.03|R|F|1994-05-31|1994-07-25|1994-06-19|TAKE BACK RETURN|RAIL|y special ex +25445|1311|12|3|4|4849.24|0.06|0.07|R|F|1994-08-05|1994-08-22|1994-08-26|NONE|MAIL|theodolites. +25445|1710|37|4|19|30622.49|0.09|0.06|A|F|1994-08-18|1994-08-18|1994-09-02|COLLECT COD|TRUCK|bout the express accounts use carefully +25445|1105|6|5|39|39237.90|0.00|0.00|R|F|1994-06-13|1994-07-13|1994-07-01|TAKE BACK RETURN|AIR| final, regular multipliers wake. stealt +25445|1441|42|6|23|30876.12|0.04|0.04|R|F|1994-07-09|1994-07-13|1994-08-08|DELIVER IN PERSON|SHIP|oxes. quickly regular pinto b +25445|599|100|7|48|71980.32|0.08|0.06|R|F|1994-09-09|1994-07-11|1994-09-19|TAKE BACK RETURN|REG AIR|ending requests sl +25446|40|41|1|39|36661.56|0.05|0.01|R|F|1993-03-12|1992-12-31|1993-03-29|TAKE BACK RETURN|FOB|sly unusual pinto beans. blithely fi +25446|935|4|2|34|62421.62|0.00|0.08|A|F|1992-11-19|1993-01-19|1992-12-07|NONE|SHIP|ions detect fluffily. slyly bold accou +25447|886|53|1|15|26803.20|0.00|0.05|R|F|1992-09-15|1992-07-06|1992-09-16|DELIVER IN PERSON|AIR|d instructions hinder fluffily final as +25447|168|21|2|2|2136.32|0.00|0.05|A|F|1992-05-31|1992-06-24|1992-06-16|TAKE BACK RETURN|TRUCK|ackages. enticing, final packag +25447|1867|11|3|41|72523.26|0.06|0.08|R|F|1992-06-16|1992-06-24|1992-07-06|DELIVER IN PERSON|REG AIR|usly expre +25447|1926|59|4|15|27418.80|0.07|0.06|R|F|1992-09-05|1992-08-16|1992-09-08|TAKE BACK RETURN|RAIL|l, final ideas sleep final reque +25447|943|46|5|29|53474.26|0.10|0.05|A|F|1992-08-06|1992-07-22|1992-09-05|NONE|TRUCK|nstructions above +25472|497|85|1|21|29347.29|0.09|0.02|A|F|1994-08-09|1994-08-16|1994-09-01|NONE|MAIL|ular, bold dependencies use s +25472|525|26|2|43|61297.36|0.05|0.05|R|F|1994-07-18|1994-08-15|1994-08-14|COLLECT COD|MAIL|deposits dazzle. quickly pending packa +25473|1281|93|1|19|22463.32|0.09|0.01|R|F|1993-02-07|1992-12-17|1993-02-25|NONE|TRUCK|nstructions. permanent dolp +25473|1364|41|2|22|27837.92|0.00|0.05|R|F|1993-01-20|1992-12-13|1993-02-06|COLLECT COD|AIR|r requests are. dep +25473|1485|64|3|13|18024.24|0.06|0.06|A|F|1993-01-19|1992-12-12|1993-02-13|NONE|SHIP|efully pending pac +25474|818|19|1|38|65314.78|0.01|0.04|A|F|1992-07-31|1992-08-06|1992-08-18|NONE|REG AIR|inal accounts. express theodolites u +25474|731|96|2|7|11422.11|0.08|0.00|R|F|1992-08-05|1992-09-13|1992-08-09|DELIVER IN PERSON|FOB|e furiously fluffily regular pin +25474|1123|60|3|13|13313.56|0.06|0.08|A|F|1992-09-04|1992-08-18|1992-10-04|TAKE BACK RETURN|RAIL|hlessly regular platelets hag +25474|1860|4|4|35|61665.10|0.06|0.02|A|F|1992-10-18|1992-07-25|1992-11-06|DELIVER IN PERSON|REG AIR|iously. blithely regular ins +25474|949|50|5|34|62897.96|0.08|0.04|A|F|1992-07-27|1992-08-10|1992-08-11|COLLECT COD|MAIL|lly according to the regular asymptotes. +25474|591|22|6|43|64138.37|0.01|0.02|R|F|1992-09-26|1992-08-31|1992-10-24|TAKE BACK RETURN|TRUCK|e pending, unu +25475|686|80|1|8|12693.44|0.08|0.05|A|F|1994-06-30|1994-06-20|1994-07-15|TAKE BACK RETURN|REG AIR|carefully along the quickl +25475|1517|38|2|27|38299.77|0.10|0.04|R|F|1994-07-15|1994-05-19|1994-08-09|DELIVER IN PERSON|MAIL|le after the carefully final +25475|1460|78|3|9|12253.14|0.07|0.00|A|F|1994-06-30|1994-05-25|1994-07-24|TAKE BACK RETURN|AIR|out the furiously re +25476|1657|58|1|17|26497.05|0.05|0.03|A|F|1992-11-25|1992-11-14|1992-12-15|TAKE BACK RETURN|TRUCK| blithely regular accounts +25476|1862|63|2|30|52915.80|0.10|0.05|A|F|1992-11-13|1992-12-26|1992-11-21|TAKE BACK RETURN|RAIL|hely special deposits boost slyly +25477|30|31|1|7|6510.21|0.02|0.03|R|F|1993-09-23|1993-12-04|1993-10-07|NONE|FOB|al, express packages believe carefully acc +25477|442|43|2|7|9397.08|0.08|0.01|A|F|1993-09-28|1993-12-18|1993-10-01|TAKE BACK RETURN|REG AIR|r the busily final attainments. slyl +25477|1298|73|3|2|2398.58|0.00|0.05|R|F|1993-12-22|1993-12-09|1993-12-27|DELIVER IN PERSON|TRUCK|ackages. da +25477|215|70|4|49|54645.29|0.10|0.08|A|F|1993-10-22|1993-12-14|1993-11-11|TAKE BACK RETURN|TRUCK|egular packages grow final r +25477|1469|87|5|13|17815.98|0.06|0.04|R|F|1994-01-06|1993-11-29|1994-01-15|COLLECT COD|MAIL| fluffily unusual instruction +25477|1996|41|6|16|30367.84|0.02|0.02|A|F|1993-11-24|1993-10-30|1993-12-19|NONE|AIR|sual accounts doubt about +25478|1204|79|1|26|28735.20|0.02|0.07|R|F|1992-06-01|1992-07-22|1992-06-06|TAKE BACK RETURN|FOB|gular deposits. carefully si +25478|119|72|2|6|6114.66|0.08|0.06|A|F|1992-06-30|1992-07-09|1992-07-20|NONE|SHIP|ng packages. fluffily i +25478|969|38|3|25|46749.00|0.01|0.00|R|F|1992-07-15|1992-06-08|1992-07-31|NONE|SHIP|e furiousl +25478|568|99|4|12|17622.72|0.09|0.01|R|F|1992-07-24|1992-07-09|1992-08-18|TAKE BACK RETURN|REG AIR|y bold deposits. slyly regular ac +25478|1896|83|5|2|3595.78|0.10|0.04|A|F|1992-08-18|1992-07-18|1992-09-13|DELIVER IN PERSON|SHIP|tly even requests use after the es +25479|520|81|1|10|14205.20|0.00|0.01|A|F|1995-06-15|1995-06-03|1995-06-16|DELIVER IN PERSON|RAIL|iously bold pinto beans. furiou +25479|875|42|2|47|83465.89|0.03|0.01|R|F|1995-05-14|1995-07-05|1995-06-06|COLLECT COD|AIR| ironic theodolites wake after the +25504|914|15|1|9|16334.19|0.04|0.05|N|O|1995-06-25|1995-08-09|1995-07-03|TAKE BACK RETURN|FOB|ptotes affix carefully about th +25504|1267|79|2|32|37384.32|0.03|0.03|N|O|1995-07-28|1995-08-19|1995-08-20|TAKE BACK RETURN|REG AIR|ts sleep. fluffily final requests alon +25504|1157|30|3|26|27511.90|0.07|0.00|N|O|1995-07-13|1995-07-05|1995-08-12|TAKE BACK RETURN|RAIL|ect slyly even deposits. quickly +25505|1609|33|1|3|4531.80|0.06|0.06|N|O|1997-02-08|1997-03-11|1997-02-17|TAKE BACK RETURN|SHIP|uickly even asym +25505|1940|73|2|29|53416.26|0.07|0.01|N|O|1997-03-21|1997-03-07|1997-04-09|NONE|SHIP|ses sublate among the regular, +25505|863|30|3|20|35277.20|0.02|0.04|N|O|1997-01-02|1997-02-03|1997-01-04|COLLECT COD|MAIL|ully bold +25505|247|75|4|43|49331.32|0.09|0.07|N|O|1997-04-11|1997-02-03|1997-04-16|TAKE BACK RETURN|RAIL|uests. blithely even requests doze furious +25505|785|82|5|1|1685.78|0.00|0.03|N|O|1997-03-15|1997-03-30|1997-04-02|DELIVER IN PERSON|TRUCK|pths wake blithely even, even ideas. quick +25505|999|68|6|29|55099.71|0.03|0.04|N|O|1997-01-03|1997-03-12|1997-01-12|NONE|FOB|p among the +25506|1551|92|1|36|52291.80|0.08|0.08|R|F|1993-06-20|1993-05-15|1993-06-21|TAKE BACK RETURN|TRUCK| fluffily even foxe +25507|1570|71|1|19|27959.83|0.01|0.06|A|F|1994-09-08|1994-10-10|1994-09-30|NONE|REG AIR|ly even excuse +25507|1386|25|2|50|64369.00|0.09|0.08|R|F|1994-11-25|1994-09-09|1994-12-16|TAKE BACK RETURN|TRUCK|ffily against the +25507|976|77|3|34|63816.98|0.02|0.07|A|F|1994-11-16|1994-10-20|1994-11-30|COLLECT COD|FOB| packages wake. flu +25507|476|77|4|34|46799.98|0.06|0.04|A|F|1994-09-10|1994-09-27|1994-09-30|DELIVER IN PERSON|TRUCK|ct quickly ironic accounts. carefully +25507|1368|7|5|34|43158.24|0.07|0.01|R|F|1994-09-26|1994-10-20|1994-10-05|COLLECT COD|RAIL| wake from the ca +25507|1749|50|6|25|41268.50|0.07|0.00|R|F|1994-08-28|1994-10-19|1994-09-07|TAKE BACK RETURN|REG AIR|c foxes eat furiously. blithely pending id +25507|571|62|7|14|20601.98|0.07|0.06|A|F|1994-10-05|1994-10-22|1994-11-03|NONE|SHIP|tions are around the ironic theodol +25508|250|5|1|20|23005.00|0.09|0.00|N|O|1998-09-09|1998-09-25|1998-09-15|TAKE BACK RETURN|TRUCK| pending instructio +25508|897|97|2|24|43149.36|0.03|0.01|N|O|1998-07-27|1998-09-12|1998-07-30|COLLECT COD|MAIL|cording to the carefully ironic accoun +25508|1035|71|3|5|4680.15|0.08|0.03|N|O|1998-09-29|1998-08-15|1998-10-07|COLLECT COD|AIR|ic pinto beans. ironic asymptotes at +25509|1421|22|1|4|5289.68|0.08|0.06|R|F|1994-07-25|1994-07-15|1994-07-28|DELIVER IN PERSON|AIR|ets wake. furiously reg +25509|42|18|2|36|33913.44|0.07|0.07|A|F|1994-09-01|1994-08-04|1994-09-15|COLLECT COD|RAIL|sly pending pinto be +25509|213|95|3|50|55660.50|0.07|0.07|R|F|1994-09-08|1994-07-06|1994-10-05|DELIVER IN PERSON|SHIP|cial accounts are slyl +25510|144|23|1|39|40721.46|0.07|0.02|R|F|1994-09-13|1994-09-22|1994-10-07|TAKE BACK RETURN|AIR|. special theodolites cajo +25510|345|46|2|38|47322.92|0.08|0.04|A|F|1994-10-21|1994-08-21|1994-10-31|DELIVER IN PERSON|TRUCK|slyly special instructions. ev +25510|1839|26|3|6|10444.98|0.09|0.06|R|F|1994-07-27|1994-09-18|1994-08-22|DELIVER IN PERSON|TRUCK|ets are blithely above the qu +25511|1669|11|1|3|4711.98|0.02|0.06|A|F|1994-04-25|1994-03-05|1994-05-14|COLLECT COD|SHIP|refully ironic +25511|364|21|2|25|31609.00|0.09|0.03|R|F|1994-02-01|1994-03-31|1994-02-24|TAKE BACK RETURN|FOB|at the quickly even packages. +25511|783|80|3|46|77453.88|0.05|0.05|R|F|1994-04-02|1994-03-27|1994-04-10|NONE|MAIL|refully even instructions. carefully pendin +25536|570|1|1|9|13235.13|0.03|0.04|N|O|1995-09-02|1995-08-25|1995-09-10|COLLECT COD|RAIL|lithely blithely regular ideas. plate +25537|1066|2|1|18|17407.08|0.10|0.03|R|F|1993-08-19|1993-07-07|1993-09-09|NONE|SHIP|as use alongside of t +25537|1764|49|2|6|9994.56|0.10|0.08|A|F|1993-08-14|1993-06-07|1993-09-13|COLLECT COD|REG AIR|to beans. even, pending accounts ha +25537|612|44|3|39|58991.79|0.07|0.08|A|F|1993-07-13|1993-05-31|1993-07-18|NONE|RAIL|ep about the ironic a +25538|1277|78|1|32|37704.64|0.02|0.04|N|O|1996-08-02|1996-09-19|1996-08-13|TAKE BACK RETURN|RAIL|l Tiresias are among the quic +25539|1365|80|1|49|62051.64|0.07|0.08|N|O|1997-10-29|1997-12-25|1997-11-27|NONE|FOB|packages above the carefully +25539|1205|43|2|37|40929.40|0.00|0.03|N|O|1997-12-24|1997-11-18|1998-01-14|NONE|SHIP|eans. deposits lose carefully +25539|55|31|3|5|4775.25|0.06|0.06|N|O|1998-01-06|1998-01-02|1998-01-18|NONE|AIR|ke furiously. furious +25540|1600|1|1|41|61565.60|0.02|0.01|N|O|1996-06-03|1996-06-05|1996-06-12|TAKE BACK RETURN|REG AIR|s. regular instruction +25541|1611|53|1|44|66554.84|0.07|0.04|A|F|1994-03-19|1994-03-06|1994-04-10|DELIVER IN PERSON|MAIL|counts. blithely even asymptotes print bl +25541|986|87|2|21|39626.58|0.02|0.02|R|F|1994-04-12|1994-03-21|1994-04-24|COLLECT COD|FOB| above the +25541|1282|20|3|48|56797.44|0.03|0.06|R|F|1994-03-30|1994-04-07|1994-04-06|NONE|AIR| the slyly unusual p +25542|342|27|1|17|21119.78|0.06|0.03|A|F|1993-01-14|1993-02-08|1993-01-18|TAKE BACK RETURN|MAIL|ly even accounts. blithely final dolph +25542|511|42|2|3|4234.53|0.09|0.00|R|F|1993-02-04|1993-02-18|1993-02-13|TAKE BACK RETURN|TRUCK|eaves. foxes haggle slyly. flu +25542|1572|73|3|22|32418.54|0.01|0.06|A|F|1993-03-27|1993-02-11|1993-04-26|TAKE BACK RETURN|SHIP|refully aft +25542|833|100|4|23|39878.09|0.05|0.07|R|F|1993-01-02|1993-02-03|1993-01-07|COLLECT COD|SHIP|. asymptote +25542|376|33|5|9|11487.33|0.08|0.06|R|F|1993-02-12|1993-03-02|1993-03-04|NONE|TRUCK| theodolites. furio +25543|594|25|1|39|58289.01|0.04|0.02|R|F|1993-11-03|1993-11-30|1993-11-30|TAKE BACK RETURN|SHIP|he quickly +25568|1864|51|1|26|45912.36|0.08|0.06|N|O|1997-02-13|1996-12-11|1997-02-19|TAKE BACK RETURN|MAIL| regular, idle ideas +25568|172|73|2|43|46103.31|0.10|0.03|N|O|1996-12-14|1996-12-06|1997-01-01|COLLECT COD|FOB|ial accounts are bl +25568|162|41|3|34|36113.44|0.07|0.08|N|O|1996-12-05|1996-11-30|1997-01-01|NONE|AIR|g the blithely ironic packages. ironic idea +25568|1261|36|4|15|17433.90|0.04|0.03|N|O|1997-01-25|1996-12-17|1997-02-05|COLLECT COD|MAIL|r deposits are quickly carefully final i +25568|1200|37|5|19|20922.80|0.04|0.07|N|O|1996-12-01|1996-12-02|1996-12-10|COLLECT COD|TRUCK|tes boost slyly quickly regular +25569|1292|93|1|48|57277.92|0.01|0.01|A|F|1992-07-11|1992-09-11|1992-07-28|TAKE BACK RETURN|REG AIR|ular ideas. s +25569|1981|70|2|3|5648.94|0.09|0.06|R|F|1992-08-13|1992-09-05|1992-09-04|DELIVER IN PERSON|SHIP| dazzle doggedly up the +25569|1317|94|3|4|4873.24|0.01|0.08|R|F|1992-10-28|1992-09-21|1992-11-26|TAKE BACK RETURN|MAIL|s cajole carefully furiously ruth +25569|25|51|4|10|9250.20|0.06|0.03|A|F|1992-07-26|1992-09-05|1992-08-05|DELIVER IN PERSON|MAIL|iers boost quickly ir +25569|483|71|5|7|9684.36|0.04|0.04|R|F|1992-10-09|1992-09-10|1992-10-19|TAKE BACK RETURN|AIR| the carefully express theodolites x-ra +25569|655|49|6|5|7778.25|0.01|0.05|A|F|1992-10-23|1992-09-23|1992-11-13|DELIVER IN PERSON|MAIL|sual accounts. regular req +25569|399|56|7|25|32484.75|0.00|0.06|R|F|1992-10-23|1992-08-14|1992-11-18|DELIVER IN PERSON|TRUCK|ages sleep slyly according to the carefu +25570|994|97|1|26|49269.74|0.06|0.00|R|F|1992-06-12|1992-03-23|1992-07-03|DELIVER IN PERSON|TRUCK|unts-- furiously reg +25570|365|94|2|9|11388.24|0.09|0.06|R|F|1992-06-11|1992-04-26|1992-07-04|DELIVER IN PERSON|TRUCK|luffily final shea +25570|1998|31|3|21|39899.79|0.08|0.06|A|F|1992-06-11|1992-03-25|1992-06-17|TAKE BACK RETURN|FOB|special deposits. foxes about the +25570|88|39|4|14|13833.12|0.07|0.02|A|F|1992-05-23|1992-03-26|1992-06-11|DELIVER IN PERSON|MAIL|. quickly pending deposits use blit +25571|1896|40|1|35|62926.15|0.06|0.08|R|F|1992-09-03|1992-10-19|1992-09-07|TAKE BACK RETURN|SHIP| furiously b +25572|638|70|1|15|23079.45|0.04|0.00|A|F|1995-05-01|1995-04-03|1995-05-08|DELIVER IN PERSON|MAIL|as cajole carefully deposits. slyly e +25572|584|45|2|48|71259.84|0.03|0.08|A|F|1995-03-03|1995-03-02|1995-03-26|NONE|TRUCK|al theodolites haggle requests. bo +25573|1340|17|1|38|47170.92|0.01|0.06|A|F|1993-11-27|1993-12-08|1993-12-21|DELIVER IN PERSON|SHIP|nts cajole fur +25573|897|98|2|18|32362.02|0.05|0.06|A|F|1994-01-30|1993-12-20|1994-02-14|NONE|FOB|lar accounts. slyly quick requests +25573|1799|26|3|25|42519.75|0.02|0.08|R|F|1994-02-15|1994-01-07|1994-03-16|COLLECT COD|RAIL|s. carefully regular theodolites beside +25573|1285|86|4|11|13049.08|0.04|0.04|R|F|1993-12-09|1994-01-11|1994-01-04|NONE|REG AIR|into beans. furiou +25573|1371|72|5|44|55984.28|0.00|0.06|A|F|1993-11-12|1994-01-25|1993-12-08|DELIVER IN PERSON|SHIP| express accounts +25573|109|62|6|34|34309.40|0.09|0.08|R|F|1994-01-21|1993-12-25|1994-02-07|TAKE BACK RETURN|SHIP| packages: furiously unusual dolphi +25573|1683|7|7|9|14262.12|0.03|0.04|A|F|1994-02-15|1994-01-10|1994-02-27|DELIVER IN PERSON|MAIL|wake above +25574|673|67|1|45|70815.15|0.10|0.02|R|F|1994-04-03|1994-05-12|1994-04-04|TAKE BACK RETURN|REG AIR|ans. silent dep +25574|1281|56|2|25|29557.00|0.09|0.08|R|F|1994-03-29|1994-05-17|1994-04-27|COLLECT COD|MAIL| accounts above the blithely +25574|368|69|3|31|39319.16|0.00|0.00|A|F|1994-03-29|1994-05-18|1994-04-25|COLLECT COD|REG AIR|bove the final ideas. bold id +25574|1400|77|4|35|45549.00|0.02|0.03|A|F|1994-05-27|1994-06-06|1994-06-07|NONE|REG AIR|wake slyly. ironic pi +25574|353|38|5|26|32587.10|0.07|0.07|R|F|1994-06-10|1994-05-02|1994-06-27|DELIVER IN PERSON|REG AIR|s cajole alongside of the slowly r +25574|295|96|6|22|26296.38|0.06|0.07|R|F|1994-04-26|1994-06-11|1994-05-02|COLLECT COD|AIR|inal, pending accounts +25575|1297|9|1|18|21569.22|0.03|0.00|R|F|1992-08-09|1992-07-05|1992-08-20|NONE|AIR|odolites doze. closely regular depo +25575|915|16|2|40|72636.40|0.03|0.06|R|F|1992-09-23|1992-07-09|1992-10-12|COLLECT COD|FOB|f the slyl +25575|1667|91|3|5|7843.30|0.05|0.04|R|F|1992-09-11|1992-08-09|1992-09-28|DELIVER IN PERSON|MAIL|final asymptotes above the deposits hag +25575|798|63|4|45|76445.55|0.07|0.04|R|F|1992-09-05|1992-08-12|1992-09-06|COLLECT COD|MAIL|frets boost quickly above the fu +25600|672|73|1|16|25162.72|0.04|0.08|N|O|1998-08-19|1998-09-23|1998-08-21|DELIVER IN PERSON|AIR|ly carefully reg +25600|1583|4|2|19|28207.02|0.10|0.02|N|O|1998-08-24|1998-09-11|1998-09-10|COLLECT COD|REG AIR|ly ironic accounts haggle carefully a +25600|1014|20|3|22|20130.22|0.09|0.08|N|O|1998-09-02|1998-09-04|1998-10-02|TAKE BACK RETURN|REG AIR|l asymptot +25600|454|84|4|3|4063.35|0.07|0.01|N|O|1998-08-29|1998-08-18|1998-09-05|COLLECT COD|RAIL|c dependencies are q +25600|1174|11|5|12|12902.04|0.06|0.07|N|O|1998-08-05|1998-09-17|1998-08-08|TAKE BACK RETURN|REG AIR|lithely final accounts +25600|959|94|6|35|65098.25|0.09|0.02|N|O|1998-07-28|1998-09-08|1998-08-15|NONE|REG AIR|. final orbits about the pending dolphins +25601|1455|56|1|8|10851.60|0.09|0.00|A|F|1994-01-15|1994-03-16|1994-02-13|TAKE BACK RETURN|REG AIR|unts haggle. quickly fin +25601|1171|44|2|23|24659.91|0.02|0.02|A|F|1994-01-24|1994-03-04|1994-02-19|DELIVER IN PERSON|FOB|tes. carefu +25601|1412|52|3|6|7880.46|0.10|0.05|A|F|1994-04-03|1994-03-17|1994-04-27|TAKE BACK RETURN|TRUCK|onic excuses wake furi +25601|1203|41|4|21|23188.20|0.02|0.06|R|F|1994-02-11|1994-02-12|1994-02-25|NONE|TRUCK| boost. fluffily even re +25601|875|76|5|48|85241.76|0.03|0.03|R|F|1994-01-10|1994-02-20|1994-01-29|NONE|MAIL| furiously ironic accou +25602|680|81|1|32|50581.76|0.04|0.08|N|O|1996-05-10|1996-04-29|1996-05-19|NONE|MAIL|y special, pending ideas. pendi +25602|849|83|2|31|54245.04|0.02|0.06|N|O|1996-06-18|1996-05-05|1996-07-16|COLLECT COD|MAIL|horses. carefully final requ +25602|1072|43|3|21|20434.47|0.04|0.01|N|O|1996-04-15|1996-04-26|1996-04-22|COLLECT COD|FOB|r, special dep +25603|1686|28|1|28|44455.04|0.08|0.02|A|F|1995-05-12|1995-05-06|1995-05-18|DELIVER IN PERSON|AIR|t theodolites doze carefully. carefu +25603|1920|9|2|39|71054.88|0.00|0.06|A|F|1995-04-11|1995-04-25|1995-04-21|COLLECT COD|MAIL|y about the carefully regular pi +25603|1523|64|3|18|25641.36|0.01|0.08|N|F|1995-06-14|1995-04-24|1995-06-18|COLLECT COD|REG AIR|quests nag carefu +25603|476|77|4|4|5505.88|0.00|0.03|A|F|1995-04-16|1995-05-13|1995-05-08|TAKE BACK RETURN|TRUCK|nal courts. deposits along the +25604|506|37|1|31|43601.50|0.07|0.07|N|O|1997-12-04|1998-01-03|1997-12-10|DELIVER IN PERSON|REG AIR| hinder. ironic ideas play furio +25604|724|89|2|32|51991.04|0.04|0.00|N|O|1997-12-14|1998-01-17|1998-01-04|NONE|FOB|y. carefully bold packag +25604|1684|26|3|2|3171.36|0.09|0.04|N|O|1998-03-09|1998-01-11|1998-04-06|NONE|TRUCK|equests: carefull +25604|1374|75|4|36|45913.32|0.09|0.00|N|O|1997-12-08|1998-01-01|1998-01-02|DELIVER IN PERSON|AIR| to wake quickly. slyly unusu +25604|1682|65|5|34|53845.12|0.02|0.02|N|O|1997-12-04|1998-02-14|1997-12-23|NONE|REG AIR|l ideas. never even pa +25604|502|63|6|33|46282.50|0.10|0.02|N|O|1998-01-08|1998-01-02|1998-01-13|DELIVER IN PERSON|REG AIR|ptotes boost evenly according to the re +25604|1491|9|7|28|38989.72|0.09|0.01|N|O|1998-03-14|1998-01-20|1998-03-19|NONE|FOB|itaphs. furiously final dolphin +25605|968|69|1|6|11213.76|0.06|0.04|R|F|1994-08-09|1994-07-11|1994-09-04|TAKE BACK RETURN|SHIP|sits cajole car +25606|1412|52|1|18|23641.38|0.00|0.01|A|F|1992-06-10|1992-06-25|1992-07-10|DELIVER IN PERSON|RAIL|l theodolites cajole carefully. quickly fi +25607|1616|58|1|7|10623.27|0.01|0.03|N|O|1997-03-12|1997-02-09|1997-04-09|DELIVER IN PERSON|AIR| about the f +25607|1564|5|2|4|5862.24|0.02|0.00|N|O|1996-12-11|1997-01-14|1996-12-23|TAKE BACK RETURN|TRUCK|eep carefully about +25607|1191|100|3|39|42595.41|0.01|0.00|N|O|1997-02-28|1997-02-04|1997-03-11|COLLECT COD|SHIP|y special e +25607|1591|72|4|19|28359.21|0.07|0.05|N|O|1996-12-18|1996-12-28|1997-01-07|COLLECT COD|MAIL| deposits wake a +25632|103|56|1|10|10031.00|0.04|0.05|N|O|1996-11-16|1996-10-26|1996-12-07|TAKE BACK RETURN|SHIP|en instructions. furiously ironic +25632|507|38|2|7|9852.50|0.07|0.08|N|O|1996-11-12|1996-11-04|1996-11-27|TAKE BACK RETURN|RAIL|thy accounts nag caref +25632|1692|75|3|36|57372.84|0.02|0.00|N|O|1996-12-18|1996-11-29|1997-01-05|TAKE BACK RETURN|RAIL| ironic ideas sublate carefully. regular, +25632|1374|89|4|34|43362.58|0.08|0.04|N|O|1996-09-07|1996-10-14|1996-09-11|COLLECT COD|RAIL|uriously slyly final pinto beans. car +25632|359|16|5|33|41558.55|0.00|0.04|N|O|1996-10-09|1996-10-05|1996-10-24|NONE|REG AIR|counts among t +25632|292|74|6|48|57229.92|0.03|0.01|N|O|1996-11-27|1996-11-14|1996-12-05|TAKE BACK RETURN|FOB|zzle blithel +25632|673|5|7|41|64520.47|0.07|0.07|N|O|1996-09-22|1996-11-24|1996-10-21|TAKE BACK RETURN|REG AIR|n place of the requests are across the bl +25633|633|27|1|22|33739.86|0.06|0.02|N|O|1995-11-06|1995-09-02|1995-11-12|DELIVER IN PERSON|SHIP|lyly above the ideas. final de +25633|659|53|2|26|40550.90|0.04|0.00|N|O|1995-09-09|1995-10-07|1995-09-12|DELIVER IN PERSON|AIR|lithely ironic courts hang s +25633|1446|47|3|41|55245.04|0.09|0.04|N|O|1995-11-03|1995-09-14|1995-11-16|COLLECT COD|SHIP|carefully regul +25633|1576|77|4|35|51714.95|0.00|0.01|N|O|1995-11-16|1995-09-16|1995-12-03|COLLECT COD|TRUCK|yly even pinto beans integrate after th +25633|1308|85|5|11|13302.30|0.10|0.00|N|O|1995-11-24|1995-09-05|1995-12-02|DELIVER IN PERSON|MAIL|nal orbits play along the quickly +25633|1163|72|6|44|46823.04|0.08|0.01|N|O|1995-10-07|1995-09-03|1995-10-26|DELIVER IN PERSON|MAIL|s requests nag blithely about the permanen +25634|236|91|1|48|54539.04|0.09|0.08|A|F|1993-09-07|1993-10-25|1993-09-16|DELIVER IN PERSON|REG AIR| blithely about the regular, fi +25634|831|98|2|30|51954.90|0.06|0.00|A|F|1993-11-08|1993-09-04|1993-12-06|TAKE BACK RETURN|RAIL| deposits sleep slyly furiously specia +25634|465|24|3|47|64176.62|0.08|0.05|R|F|1993-09-10|1993-10-06|1993-09-25|COLLECT COD|MAIL|xpress accounts sleep c +25634|624|18|4|5|7623.10|0.05|0.05|R|F|1993-09-28|1993-10-18|1993-10-06|COLLECT COD|RAIL| beans wake. pending deposits are past +25634|1860|90|5|24|42284.64|0.01|0.02|R|F|1993-08-27|1993-10-14|1993-09-12|DELIVER IN PERSON|AIR|along the ironic pinto beans. +25634|1553|34|6|38|55272.90|0.08|0.08|A|F|1993-09-04|1993-09-08|1993-09-30|TAKE BACK RETURN|RAIL|ely final pinto beans bo +25634|408|9|7|23|30093.20|0.09|0.08|A|F|1993-11-20|1993-10-01|1993-12-02|COLLECT COD|FOB|s. slyly bold as +25635|1243|55|1|28|32038.72|0.07|0.07|A|F|1992-09-12|1992-08-26|1992-10-08|TAKE BACK RETURN|AIR|s the slyly bold forges. final asymptote +25635|1081|52|2|47|46157.76|0.06|0.05|A|F|1992-06-09|1992-07-21|1992-07-07|DELIVER IN PERSON|MAIL|iously unu +25635|384|69|3|24|30825.12|0.05|0.06|R|F|1992-07-18|1992-07-20|1992-08-06|TAKE BACK RETURN|REG AIR|pendencies haggle slyly furiously regular +25635|76|77|4|16|15617.12|0.08|0.07|A|F|1992-07-23|1992-08-25|1992-08-10|DELIVER IN PERSON|MAIL|final foxes. sometimes reg +25636|103|30|1|14|14043.40|0.02|0.07|N|O|1998-07-20|1998-08-22|1998-07-24|TAKE BACK RETURN|REG AIR|usual accounts haggle furiously. sly +25636|1517|58|2|21|29788.71|0.03|0.01|N|O|1998-10-04|1998-09-01|1998-11-01|DELIVER IN PERSON|FOB|unusual ideas print quickly af +25636|710|43|3|30|48321.30|0.03|0.03|N|O|1998-10-15|1998-08-13|1998-10-20|COLLECT COD|AIR|ge along the slyly regular accounts. f +25636|924|93|4|20|36498.40|0.06|0.05|N|O|1998-10-03|1998-09-09|1998-10-22|NONE|FOB|equests acros +25637|785|18|1|25|42144.50|0.09|0.08|A|F|1992-05-19|1992-05-23|1992-06-17|COLLECT COD|FOB|even requests. qu +25637|566|27|2|6|8799.36|0.03|0.03|A|F|1992-05-20|1992-04-08|1992-05-27|DELIVER IN PERSON|REG AIR|ix according to the re +25637|1722|23|3|3|4871.16|0.00|0.00|A|F|1992-06-10|1992-04-02|1992-07-01|COLLECT COD|TRUCK|gle final ideas. pending pl +25637|1707|8|4|6|9652.20|0.04|0.03|A|F|1992-06-25|1992-04-19|1992-07-02|COLLECT COD|FOB|patterns doze fl +25637|872|72|5|30|53186.10|0.08|0.05|A|F|1992-06-16|1992-04-24|1992-07-06|COLLECT COD|MAIL|ges. furiously regular deposits us +25637|1602|26|6|11|16539.60|0.10|0.01|A|F|1992-04-06|1992-03-31|1992-04-27|DELIVER IN PERSON|FOB|es. slyly unusual instructio +25637|317|74|7|16|19476.96|0.01|0.04|R|F|1992-06-04|1992-05-16|1992-06-20|TAKE BACK RETURN|REG AIR|thless theodolites haggle carefully aro +25638|1439|57|1|38|50936.34|0.08|0.06|A|F|1994-08-28|1994-09-13|1994-09-06|DELIVER IN PERSON|AIR| even requests boost blithely ironic acc +25638|1184|85|2|47|51003.46|0.07|0.06|R|F|1994-10-24|1994-09-16|1994-11-22|DELIVER IN PERSON|FOB|leep about the furiou +25638|648|49|3|39|60396.96|0.05|0.07|R|F|1994-10-29|1994-10-08|1994-11-18|NONE|FOB|l packages alongside of the s +25639|1434|35|1|46|61429.78|0.04|0.01|A|F|1995-02-05|1995-01-10|1995-02-10|COLLECT COD|AIR| deposits +25639|1719|20|2|29|47000.59|0.01|0.07|A|F|1995-02-06|1994-11-26|1995-02-15|NONE|AIR|ully unusual waters use furious +25664|1639|63|1|48|73950.24|0.08|0.04|R|F|1995-03-04|1995-03-19|1995-03-28|TAKE BACK RETURN|REG AIR|ideas above the unusual, final requests +25664|1970|15|2|48|89854.56|0.10|0.06|R|F|1995-04-17|1995-03-11|1995-04-23|DELIVER IN PERSON|TRUCK|refully blithely bold grouches +25665|1352|67|1|18|22560.30|0.08|0.06|N|O|1996-08-17|1996-10-19|1996-09-12|COLLECT COD|SHIP|ial, ironic foxes! silent packages x-ray s +25665|1430|31|2|24|31954.32|0.01|0.01|N|O|1996-10-25|1996-10-13|1996-10-28|TAKE BACK RETURN|TRUCK|telets are. pending th +25666|63|89|1|1|963.06|0.08|0.08|A|F|1992-10-25|1992-10-17|1992-11-19|COLLECT COD|SHIP|cial ideas nag dogged +25666|1263|38|2|15|17463.90|0.02|0.04|R|F|1992-09-30|1992-10-03|1992-10-17|DELIVER IN PERSON|FOB|pending requests. fluffily bold exc +25666|67|43|3|16|15472.96|0.04|0.00|R|F|1992-10-16|1992-11-26|1992-11-08|NONE|AIR| beans doze blithely. carefully regular de +25666|1942|43|4|6|11063.64|0.02|0.01|A|F|1992-09-23|1992-10-04|1992-10-09|TAKE BACK RETURN|MAIL|side of the fluffily even d +25666|63|14|5|40|38522.40|0.03|0.06|R|F|1992-10-05|1992-11-10|1992-10-28|COLLECT COD|AIR|lly ironic asymptotes. blithely ir +25667|1446|47|1|31|41770.64|0.01|0.03|N|O|1995-12-15|1996-01-15|1995-12-16|COLLECT COD|TRUCK|its wake! ironic, bo +25668|214|96|1|2|2228.42|0.09|0.06|N|O|1997-05-24|1997-07-11|1997-05-31|DELIVER IN PERSON|SHIP|nal instruction +25669|1532|33|1|46|65942.38|0.03|0.02|R|F|1995-05-13|1995-02-17|1995-05-23|COLLECT COD|MAIL|ggle blithely according to th +25669|1595|16|2|15|22448.85|0.09|0.04|A|F|1995-02-05|1995-04-06|1995-02-23|TAKE BACK RETURN|MAIL|n courts? unusual pinto beans w +25669|1690|14|3|50|79584.50|0.10|0.04|A|F|1995-04-30|1995-02-21|1995-05-24|TAKE BACK RETURN|REG AIR|sts. final, regular pinto beans +25669|575|36|4|19|28035.83|0.07|0.01|R|F|1995-05-04|1995-03-19|1995-05-20|NONE|REG AIR|fully regular pinto beans. +25669|1749|50|5|7|11555.18|0.05|0.06|R|F|1995-02-02|1995-03-31|1995-02-19|NONE|RAIL|ge blithely. quietly special deposits among +25670|516|77|1|38|53827.38|0.07|0.01|N|O|1998-04-10|1998-02-08|1998-04-26|TAKE BACK RETURN|SHIP|accounts should +25670|1948|93|2|48|88797.12|0.02|0.03|N|O|1998-01-01|1998-03-04|1998-01-11|TAKE BACK RETURN|AIR|riously. even accounts above the theod +25670|1407|25|3|20|26168.00|0.09|0.08|N|O|1998-03-25|1998-01-25|1998-04-05|DELIVER IN PERSON|REG AIR|ave request +25670|819|20|4|1|1719.81|0.04|0.06|N|O|1998-04-03|1998-02-01|1998-05-03|TAKE BACK RETURN|MAIL| platelets. carefully regular account +25670|1645|46|5|29|44852.56|0.10|0.05|N|O|1998-03-06|1998-03-11|1998-03-23|NONE|MAIL|pecial theodolites. sentiments wak +25671|576|37|1|24|35437.68|0.08|0.04|N|O|1997-07-26|1997-06-17|1997-08-08|TAKE BACK RETURN|AIR|regular accounts. +25671|13|64|2|9|8217.09|0.04|0.02|N|O|1997-05-21|1997-07-15|1997-05-27|TAKE BACK RETURN|FOB| dolphins! u +25671|1086|92|3|45|44418.60|0.02|0.06|N|O|1997-06-04|1997-06-14|1997-06-19|COLLECT COD|MAIL| regularly quickly f +25671|1060|66|4|4|3844.24|0.05|0.01|N|O|1997-06-29|1997-06-27|1997-07-01|NONE|TRUCK| haggle. idly daring theodolite +25671|709|74|5|12|19316.40|0.08|0.02|N|O|1997-07-09|1997-06-01|1997-07-30|COLLECT COD|REG AIR|xpress braid +25696|52|53|1|6|5712.30|0.00|0.07|R|F|1993-04-15|1993-05-17|1993-04-19|NONE|FOB|uthlessly express platelets sleep carefull +25696|1631|55|2|48|73566.24|0.09|0.00|A|F|1993-03-02|1993-05-17|1993-03-11|NONE|RAIL|. quickly even +25696|1093|99|3|34|33799.06|0.09|0.03|R|F|1993-05-05|1993-04-14|1993-05-10|DELIVER IN PERSON|TRUCK|y carefully express de +25696|503|34|4|13|18245.50|0.09|0.04|A|F|1993-05-31|1993-04-26|1993-06-05|COLLECT COD|FOB| beans boost quickly +25696|1430|48|5|4|5325.72|0.04|0.06|R|F|1993-02-21|1993-04-14|1993-03-18|TAKE BACK RETURN|FOB|d dolphins eat. +25697|1826|70|1|6|10366.92|0.02|0.06|N|O|1995-07-11|1995-06-13|1995-07-27|TAKE BACK RETURN|FOB|elets cajole bravely iron +25697|57|83|2|32|30625.60|0.00|0.04|R|F|1995-05-07|1995-07-05|1995-05-29|NONE|FOB|ording to the silent +25697|1056|57|3|1|957.05|0.01|0.01|A|F|1995-06-01|1995-07-09|1995-06-08|TAKE BACK RETURN|REG AIR|ing to the carefull +25698|993|94|1|1|1893.99|0.07|0.03|N|O|1998-06-23|1998-05-11|1998-06-26|COLLECT COD|RAIL|ly. foxes across +25698|1943|76|2|49|90402.06|0.09|0.02|N|O|1998-03-03|1998-05-07|1998-03-12|TAKE BACK RETURN|REG AIR|e carefully fluffily regular pack +25698|701|34|3|16|25627.20|0.02|0.02|N|O|1998-03-04|1998-05-30|1998-03-27|NONE|FOB|. carefully regular braid +25699|720|17|1|6|9724.32|0.10|0.04|N|O|1997-11-20|1998-01-17|1997-12-12|DELIVER IN PERSON|REG AIR|into beans w +25699|1710|37|2|29|46739.59|0.07|0.07|N|O|1997-12-27|1997-12-23|1998-01-13|COLLECT COD|RAIL|ts lose furiously. final dep +25699|442|30|3|44|59067.36|0.10|0.01|N|O|1998-01-10|1997-12-31|1998-01-12|NONE|FOB|refully regular pi +25699|206|88|4|49|54203.80|0.10|0.02|N|O|1998-03-15|1998-01-17|1998-03-29|TAKE BACK RETURN|TRUCK| along the unusual accounts +25699|1635|77|5|11|16902.93|0.08|0.03|N|O|1998-03-15|1997-12-27|1998-04-10|DELIVER IN PERSON|MAIL|ending dolphins caj +25699|1806|36|6|44|75143.20|0.09|0.07|N|O|1998-01-29|1998-01-16|1998-02-24|COLLECT COD|MAIL|totes sleep furiously t +25700|2000|89|1|23|20746.00|0.05|0.00|N|O|1997-08-04|1997-06-02|1997-08-17|TAKE BACK RETURN|MAIL| deposits affix blithely even, regu +25701|6|57|1|43|38958.00|0.08|0.05|N|O|1996-02-24|1996-03-18|1996-03-20|COLLECT COD|AIR| accounts hagg +25701|112|65|2|2|2024.22|0.02|0.03|N|O|1996-03-16|1996-03-15|1996-04-10|DELIVER IN PERSON|REG AIR|accounts boost quickly sly +25701|1434|35|3|15|20031.45|0.00|0.02|N|O|1996-03-05|1996-04-30|1996-03-30|DELIVER IN PERSON|FOB|onic instructions us +25701|883|83|4|36|64219.68|0.10|0.08|N|O|1996-02-20|1996-03-18|1996-03-14|COLLECT COD|SHIP|refully ironic requests a +25701|1385|86|5|33|42450.54|0.02|0.00|N|O|1996-02-27|1996-04-22|1996-03-06|TAKE BACK RETURN|FOB| requests sleep quickly furi +25701|1426|44|6|45|59733.90|0.06|0.04|N|O|1996-05-29|1996-04-02|1996-06-25|TAKE BACK RETURN|RAIL|y regular +25702|336|21|1|37|45744.21|0.02|0.01|N|O|1996-07-21|1996-08-25|1996-07-31|TAKE BACK RETURN|SHIP| of the slyly final excuses. deposits slee +25702|1546|67|2|40|57901.60|0.01|0.03|N|O|1996-08-11|1996-09-07|1996-08-23|TAKE BACK RETURN|TRUCK|e fluffily. carefully unusual instructio +25702|558|89|3|45|65634.75|0.09|0.00|N|O|1996-08-13|1996-08-13|1996-08-14|NONE|REG AIR|ven requests +25702|1258|70|4|48|55644.00|0.09|0.06|N|O|1996-08-20|1996-09-10|1996-08-28|DELIVER IN PERSON|FOB|gage fluffily. reque +25703|1827|71|1|14|24203.48|0.09|0.04|A|F|1994-04-16|1994-05-01|1994-05-12|DELIVER IN PERSON|REG AIR| furiously ironic requests. slyly pendi +25703|281|9|2|30|35438.40|0.07|0.07|A|F|1994-05-31|1994-04-12|1994-06-11|COLLECT COD|RAIL|ly final attainments nag furi +25703|558|59|3|13|18961.15|0.08|0.03|R|F|1994-06-25|1994-04-12|1994-06-27|TAKE BACK RETURN|TRUCK|eodolites haggle quickly according to the +25728|920|55|1|6|10925.52|0.07|0.03|N|O|1997-05-07|1997-05-09|1997-05-26|TAKE BACK RETURN|SHIP|pecial theodolites wake slyly blithely +25728|322|79|2|11|13445.52|0.00|0.00|N|O|1997-06-01|1997-05-04|1997-06-25|TAKE BACK RETURN|REG AIR|etect furiously express accounts. +25728|1343|82|3|43|53506.62|0.06|0.04|N|O|1997-04-04|1997-04-25|1997-04-15|TAKE BACK RETURN|FOB|ounts nod slyly aro +25728|502|63|4|26|36465.00|0.07|0.03|N|O|1997-05-28|1997-04-19|1997-06-03|COLLECT COD|SHIP|uriously regular frays. instructions bo +25728|1781|24|5|13|21876.14|0.10|0.00|N|O|1997-02-19|1997-04-22|1997-03-12|COLLECT COD|RAIL|lly alongside of the blithely permanent ac +25728|589|80|6|39|58093.62|0.03|0.02|N|O|1997-03-03|1997-04-17|1997-03-19|DELIVER IN PERSON|TRUCK| the slyly special ideas wake carefull +25729|1591|12|1|8|11940.72|0.03|0.08|N|O|1995-10-09|1995-11-10|1995-10-16|DELIVER IN PERSON|TRUCK|the unusual, pending theodolites. foxes are +25730|1694|36|1|23|36700.87|0.09|0.06|N|O|1998-01-24|1997-11-12|1998-02-14|TAKE BACK RETURN|AIR|to the stealthily even fo +25730|464|23|2|5|6822.30|0.02|0.03|N|O|1998-01-05|1997-12-28|1998-01-11|COLLECT COD|AIR|pending theodoli +25731|1112|85|1|7|7091.77|0.08|0.03|A|F|1994-05-22|1994-06-14|1994-05-31|NONE|SHIP|ake about the carefully fin +25731|1827|28|2|23|39762.86|0.07|0.00|R|F|1994-06-15|1994-05-14|1994-06-23|NONE|SHIP|s. furiously regular pa +25731|1047|53|3|37|35077.48|0.08|0.01|R|F|1994-07-02|1994-05-30|1994-07-11|NONE|RAIL|l dependencies haggle. bold, r +25731|1195|4|4|6|6577.14|0.00|0.03|A|F|1994-05-05|1994-06-19|1994-05-25|DELIVER IN PERSON|AIR|ithely unusual deposits. blithely +25731|1748|91|5|36|59390.64|0.07|0.05|R|F|1994-06-04|1994-05-14|1994-06-22|COLLECT COD|FOB|leep carefully final, ironic accounts; unu +25731|6|7|6|38|34428.00|0.06|0.02|R|F|1994-07-05|1994-06-03|1994-07-23|NONE|TRUCK|ully according +25731|1904|49|7|12|21670.80|0.01|0.07|R|F|1994-04-15|1994-05-18|1994-05-07|NONE|TRUCK|fter the regular theodolites. qui +25732|1353|30|1|10|12543.50|0.07|0.01|N|O|1996-05-28|1996-03-19|1996-06-17|DELIVER IN PERSON|SHIP|arefully ironic courts against the slyly pe +25732|1148|21|2|27|28326.78|0.09|0.06|N|O|1996-05-17|1996-04-25|1996-05-21|DELIVER IN PERSON|RAIL|express pinto +25732|1390|29|3|17|21953.63|0.02|0.00|N|O|1996-05-17|1996-04-18|1996-06-12|NONE|MAIL|uickly final deposit +25732|1924|57|4|12|21911.04|0.03|0.08|N|O|1996-06-03|1996-04-20|1996-06-21|NONE|SHIP|yly even dependencies sleep quic +25732|1410|28|5|25|32785.25|0.10|0.02|N|O|1996-06-03|1996-03-27|1996-06-04|TAKE BACK RETURN|TRUCK| blithely even deposits haggle fluffily +25732|515|6|6|27|38218.77|0.05|0.03|N|O|1996-03-26|1996-04-25|1996-04-24|NONE|AIR|fily across the theodo +25732|1858|59|7|50|87992.50|0.08|0.06|N|O|1996-05-06|1996-04-24|1996-06-04|COLLECT COD|TRUCK|ily special +25733|770|71|1|36|60147.72|0.06|0.04|R|F|1992-06-28|1992-07-07|1992-07-21|TAKE BACK RETURN|AIR|the ironic, special ideas are after the r +25733|14|40|2|49|44786.49|0.10|0.08|A|F|1992-06-22|1992-07-21|1992-07-16|TAKE BACK RETURN|TRUCK|nic accounts. carefully regular pa +25733|104|5|3|19|19077.90|0.09|0.00|R|F|1992-06-30|1992-07-10|1992-07-09|COLLECT COD|REG AIR|rnis are fluffily about the instru +25733|1410|28|4|30|39342.30|0.03|0.02|R|F|1992-08-17|1992-06-14|1992-09-15|NONE|RAIL|doubt blithe +25733|1377|54|5|32|40907.84|0.10|0.00|R|F|1992-05-24|1992-07-12|1992-06-19|TAKE BACK RETURN|MAIL|iously slyly +25733|1924|13|6|12|21911.04|0.03|0.03|R|F|1992-06-13|1992-06-20|1992-06-28|COLLECT COD|SHIP|ructions cajole carefully platelets. pendin +25734|71|97|1|47|45640.29|0.01|0.04|N|O|1997-09-26|1997-08-16|1997-10-20|TAKE BACK RETURN|REG AIR|y bold ideas wake carefully after the caref +25734|24|25|2|44|40656.88|0.05|0.04|N|O|1997-08-09|1997-08-23|1997-08-25|COLLECT COD|FOB|uests. bold theodolites can wake +25734|867|1|3|19|33589.34|0.01|0.04|N|O|1997-08-06|1997-09-06|1997-08-31|COLLECT COD|MAIL|ly carefull +25734|1300|12|4|37|44448.10|0.10|0.03|N|O|1997-07-15|1997-09-19|1997-08-09|DELIVER IN PERSON|MAIL|le slyly. foxes nod regular, even re +25735|518|79|1|43|60995.93|0.04|0.08|R|F|1994-04-09|1994-02-16|1994-04-29|TAKE BACK RETURN|MAIL|ons haggle-- regular idea +25735|1738|65|2|21|34434.33|0.04|0.00|R|F|1994-04-12|1994-02-10|1994-04-19|TAKE BACK RETURN|MAIL|pinto beans are quickly fluff +25735|1075|81|3|40|39042.80|0.05|0.02|R|F|1994-03-12|1994-02-22|1994-03-22|DELIVER IN PERSON|TRUCK|ular realms. slyly final packages haggle +25735|170|23|4|27|28894.59|0.07|0.08|A|F|1994-01-31|1994-02-27|1994-02-07|NONE|MAIL|ounts. ironically pendin +25760|437|38|1|29|38785.47|0.01|0.00|N|O|1996-09-07|1996-09-24|1996-09-17|TAKE BACK RETURN|SHIP|d deposits according to the fluffily regul +25760|395|52|2|8|10363.12|0.08|0.01|N|O|1996-10-24|1996-09-26|1996-11-23|TAKE BACK RETURN|MAIL| express account +25760|1237|75|3|32|36423.36|0.00|0.06|N|O|1996-09-12|1996-09-28|1996-10-05|COLLECT COD|MAIL|us ideas according t +25760|953|88|4|49|90843.55|0.07|0.00|N|O|1996-08-11|1996-08-27|1996-08-27|NONE|TRUCK|nstructions nag carefully. furiousl +25760|1976|77|5|4|7511.88|0.07|0.03|N|O|1996-09-22|1996-09-18|1996-10-01|DELIVER IN PERSON|FOB|arefully silent d +25761|1267|68|1|7|8177.82|0.08|0.07|N|O|1998-09-14|1998-09-23|1998-09-21|NONE|RAIL|ccording to +25762|762|63|1|25|41569.00|0.01|0.05|N|O|1997-04-14|1997-05-14|1997-04-29|DELIVER IN PERSON|RAIL| pinto bea +25762|324|9|2|27|33056.64|0.05|0.05|N|O|1997-04-30|1997-04-26|1997-05-11|COLLECT COD|RAIL|theodolites. q +25762|1746|89|3|19|31307.06|0.08|0.00|N|O|1997-03-09|1997-05-08|1997-03-25|NONE|REG AIR|c patterns. furiously slow requ +25763|874|74|1|1|1774.87|0.05|0.07|N|O|1997-09-24|1997-09-21|1997-10-09|DELIVER IN PERSON|MAIL|ong the furiously ironic platelets. bra +25763|574|5|2|10|14745.70|0.05|0.03|N|O|1997-09-03|1997-08-12|1997-09-09|NONE|SHIP|ic packages cajole f +25763|559|60|3|12|17514.60|0.09|0.01|N|O|1997-09-06|1997-10-07|1997-09-14|NONE|AIR| the fluffily regular accounts. excu +25764|1816|17|1|4|6871.24|0.08|0.02|N|O|1997-11-28|1997-12-17|1997-12-28|DELIVER IN PERSON|AIR|uses according to the fluffily +25765|816|17|1|21|36053.01|0.08|0.07|R|F|1994-06-17|1994-06-20|1994-06-29|COLLECT COD|MAIL|boost slyly according to the quic +25766|744|41|1|4|6578.96|0.00|0.04|N|O|1998-03-03|1998-03-02|1998-03-08|NONE|FOB|ts affix past the regula +25767|525|16|1|32|45616.64|0.01|0.03|R|F|1992-04-20|1992-04-21|1992-04-26|NONE|FOB|ajole blithely. enticing asymptotes slee +25767|1857|1|2|32|56283.20|0.05|0.03|A|F|1992-05-12|1992-05-15|1992-05-21|TAKE BACK RETURN|TRUCK|lyly express dependencie +25767|1038|44|3|35|32866.05|0.06|0.03|R|F|1992-06-30|1992-04-19|1992-07-22|DELIVER IN PERSON|SHIP|es upon the furiously f +25767|1406|85|4|34|44451.60|0.09|0.06|R|F|1992-04-01|1992-05-01|1992-04-30|NONE|FOB|nt packages impress from the bl +25767|1998|87|5|8|15199.92|0.09|0.06|R|F|1992-06-07|1992-05-24|1992-06-11|COLLECT COD|AIR|escapades wake furiously blithely unusual +25767|1144|45|6|35|36579.90|0.00|0.07|R|F|1992-03-11|1992-04-12|1992-03-13|DELIVER IN PERSON|RAIL|ously slow theodolites lose after the t +25792|555|46|1|26|37844.30|0.07|0.01|N|O|1996-12-22|1996-12-23|1997-01-10|TAKE BACK RETURN|TRUCK|d courts. quickly unusua +25792|1273|85|2|36|42273.72|0.08|0.02|N|O|1997-02-16|1996-12-27|1997-03-12|NONE|SHIP|quests use +25793|292|47|1|45|53653.05|0.02|0.04|R|F|1992-06-29|1992-07-07|1992-07-04|TAKE BACK RETURN|FOB|l pinto beans are carefully according +25793|1124|25|2|38|38954.56|0.03|0.02|R|F|1992-04-19|1992-06-17|1992-04-27|TAKE BACK RETURN|AIR|arefully along the slyly dogged platelets +25794|1152|89|1|24|25275.60|0.03|0.05|N|O|1997-12-13|1997-12-27|1997-12-14|COLLECT COD|SHIP|elets haggl +25794|497|27|2|37|51707.13|0.06|0.03|N|O|1997-10-22|1997-11-27|1997-10-27|COLLECT COD|RAIL|slyly ironic pack +25794|305|62|3|22|26516.60|0.10|0.03|N|O|1997-10-07|1997-12-27|1997-10-22|DELIVER IN PERSON|SHIP|te carefully blithely fin +25794|1720|63|4|45|72977.40|0.06|0.08|N|O|1997-11-07|1997-11-17|1997-11-18|DELIVER IN PERSON|FOB|pendencies sleep after t +25794|64|90|5|20|19281.20|0.10|0.03|N|O|1998-01-11|1997-12-23|1998-01-19|DELIVER IN PERSON|MAIL|theodolites kindle c +25794|1348|87|6|10|12493.40|0.00|0.02|N|O|1997-12-22|1997-11-25|1997-12-26|NONE|FOB|slyly unusual packag +25795|350|51|1|49|61267.15|0.09|0.06|N|O|1997-11-29|1997-11-08|1997-12-11|DELIVER IN PERSON|SHIP|gle across th +25796|1882|83|1|2|3567.76|0.06|0.01|A|F|1993-04-05|1993-02-23|1993-04-19|DELIVER IN PERSON|AIR|aggle according to the furiously re +25796|25|51|2|40|37000.80|0.07|0.04|R|F|1993-04-07|1993-03-31|1993-05-07|COLLECT COD|REG AIR| final instructions sleep against the s +25796|67|93|3|3|2901.18|0.03|0.08|R|F|1993-01-09|1993-02-05|1993-02-08|NONE|TRUCK| carefully regular requests use blithely a +25796|918|87|4|9|16370.19|0.06|0.05|R|F|1993-03-12|1993-03-12|1993-04-11|TAKE BACK RETURN|TRUCK|d platelets haggle slyly against the f +25796|435|65|5|35|46740.05|0.09|0.08|A|F|1993-01-12|1993-03-24|1993-02-01|COLLECT COD|MAIL|r packages. +25796|642|74|6|30|46279.20|0.05|0.04|R|F|1993-01-02|1993-03-30|1993-01-13|NONE|TRUCK|ly special excuses +25797|1289|27|1|21|24995.88|0.08|0.00|R|F|1992-09-14|1992-10-18|1992-10-13|TAKE BACK RETURN|REG AIR|ole carefully idle accounts. reg +25797|308|37|2|45|54373.50|0.05|0.04|R|F|1992-11-03|1992-10-04|1992-11-30|TAKE BACK RETURN|MAIL|blithely. furiously regular foxe +25797|1119|20|3|11|11221.21|0.10|0.02|R|F|1992-11-08|1992-10-15|1992-12-08|NONE|TRUCK|ickly according to the sly +25797|1661|3|4|31|48442.46|0.10|0.05|R|F|1992-11-23|1992-10-12|1992-12-06|DELIVER IN PERSON|AIR|ecial foxes above the slyly pending +25797|242|24|5|19|21702.56|0.00|0.00|A|F|1992-10-27|1992-10-20|1992-11-06|NONE|REG AIR|ly carefully even asymptotes. bold +25798|1554|35|1|14|20377.70|0.06|0.02|N|O|1998-05-16|1998-06-19|1998-05-25|TAKE BACK RETURN|REG AIR|ies could detect carefully slyly fi +25798|1635|36|2|10|15366.30|0.09|0.05|N|O|1998-08-22|1998-06-13|1998-09-08|COLLECT COD|SHIP|usual dependencies. blithely reg +25799|1783|68|1|36|60652.08|0.08|0.02|R|F|1995-04-01|1995-05-25|1995-04-19|TAKE BACK RETURN|FOB|ully express pac +25799|1676|100|2|35|55218.45|0.03|0.03|A|F|1995-03-20|1995-04-30|1995-03-25|TAKE BACK RETURN|FOB|to beans affix b +25799|180|81|3|23|24844.14|0.02|0.07|R|F|1995-04-16|1995-03-31|1995-04-22|TAKE BACK RETURN|MAIL| theodolites serve. packages across t +25824|756|89|1|2|3313.50|0.03|0.05|A|F|1994-11-07|1994-10-12|1994-11-24|NONE|FOB|ly pending +25824|833|67|2|46|79756.18|0.01|0.08|R|F|1994-10-28|1994-11-06|1994-11-23|COLLECT COD|TRUCK|deposits. express de +25824|1662|4|3|24|37527.84|0.10|0.06|A|F|1995-01-03|1994-11-01|1995-01-24|TAKE BACK RETURN|REG AIR|fily final instructi +25824|1744|45|4|14|23040.36|0.02|0.01|A|F|1994-12-06|1994-10-18|1995-01-04|NONE|REG AIR|nic, express d +25824|662|25|5|50|78133.00|0.08|0.03|R|F|1994-09-12|1994-11-12|1994-10-10|TAKE BACK RETURN|RAIL|. regular accounts +25824|901|70|6|12|21622.80|0.00|0.08|R|F|1994-10-29|1994-11-30|1994-11-07|DELIVER IN PERSON|MAIL|kages sleep slyly. blithely even +25824|1332|47|7|44|54266.52|0.00|0.01|A|F|1994-11-09|1994-10-16|1994-12-02|DELIVER IN PERSON|FOB|fluffily unusual requests are carefully flu +25825|1030|36|1|38|35379.14|0.08|0.07|R|F|1992-09-22|1992-10-11|1992-10-10|TAKE BACK RETURN|SHIP|s. furiously regular the +25825|941|76|2|33|60784.02|0.02|0.06|R|F|1992-10-20|1992-08-20|1992-11-19|TAKE BACK RETURN|AIR|special asymptotes was qui +25825|1266|41|3|46|53693.96|0.03|0.06|A|F|1992-09-15|1992-09-09|1992-09-20|DELIVER IN PERSON|SHIP|fully regular +25825|779|80|4|2|3359.54|0.00|0.05|R|F|1992-10-20|1992-10-03|1992-11-06|DELIVER IN PERSON|FOB| the fluffily ironic excus +25826|49|75|1|22|20878.88|0.03|0.04|N|O|1996-10-26|1996-11-30|1996-11-03|TAKE BACK RETURN|FOB|onically final patter +25826|220|21|2|17|19043.74|0.09|0.03|N|O|1996-12-06|1996-12-04|1996-12-17|COLLECT COD|TRUCK|nding dependencies. even excuses sl +25826|123|76|3|16|16369.92|0.08|0.06|N|O|1997-02-15|1997-01-19|1997-03-17|DELIVER IN PERSON|REG AIR|ss the pending deposits! b +25826|1518|19|4|18|25551.18|0.01|0.00|N|O|1996-12-12|1996-12-14|1997-01-06|NONE|REG AIR|ringly quick ideas sleep carefully sil +25826|1423|24|5|2|2648.84|0.02|0.08|N|O|1996-12-03|1996-12-06|1996-12-21|TAKE BACK RETURN|SHIP|rhorses haggle +25826|273|55|6|39|45757.53|0.03|0.07|N|O|1996-11-03|1996-12-23|1996-11-21|NONE|SHIP|grate quickly regular the +25827|967|68|1|4|7471.84|0.05|0.05|N|O|1998-09-14|1998-08-29|1998-10-08|TAKE BACK RETURN|AIR|ep carefully according to the slyly ironic +25828|1853|40|1|28|49135.80|0.05|0.07|R|F|1993-12-30|1994-01-16|1994-01-21|TAKE BACK RETURN|FOB|hely. furiously final theodo +25828|1360|75|2|18|22704.48|0.04|0.02|R|F|1994-02-06|1993-12-29|1994-03-04|DELIVER IN PERSON|AIR|ccounts. furi +25828|81|57|3|19|18640.52|0.02|0.03|A|F|1994-01-06|1994-02-15|1994-01-28|TAKE BACK RETURN|REG AIR|y brave depos +25828|56|82|4|20|19121.00|0.06|0.08|A|F|1994-03-14|1994-02-07|1994-03-18|DELIVER IN PERSON|AIR|y never ironic d +25828|722|87|5|30|48681.60|0.00|0.04|A|F|1993-12-04|1994-01-31|1993-12-20|DELIVER IN PERSON|AIR|fully. furious +25828|1802|46|6|25|42595.00|0.04|0.03|A|F|1993-12-29|1994-02-09|1994-01-20|COLLECT COD|SHIP|to the fluffily specia +25829|1151|88|1|11|11573.65|0.05|0.01|N|O|1997-07-14|1997-07-02|1997-07-15|TAKE BACK RETURN|AIR|l theodolites wake inside the s +25829|930|31|2|43|78729.99|0.07|0.05|N|O|1997-05-28|1997-06-28|1997-06-04|DELIVER IN PERSON|SHIP|ily ironic packages. ca +25830|1849|93|1|6|10505.04|0.04|0.07|R|F|1993-05-08|1993-07-15|1993-05-28|NONE|FOB|cajole carefully ab +25830|721|18|2|17|27569.24|0.06|0.01|R|F|1993-08-09|1993-06-15|1993-08-27|TAKE BACK RETURN|RAIL|l foxes wake to th +25830|557|18|3|17|24778.35|0.06|0.02|A|F|1993-05-13|1993-07-13|1993-06-11|TAKE BACK RETURN|AIR|ronic, ironic theodolites. fluffi +25830|551|42|4|27|39191.85|0.03|0.08|R|F|1993-07-19|1993-07-04|1993-07-27|DELIVER IN PERSON|TRUCK|liers nag sly +25831|644|76|1|12|18535.68|0.01|0.05|A|F|1994-10-02|1994-11-06|1994-10-18|DELIVER IN PERSON|REG AIR| wake braids. even deposits +25831|1532|13|2|10|14335.30|0.04|0.04|A|F|1995-01-06|1994-11-21|1995-01-30|TAKE BACK RETURN|MAIL|r requests acr +25831|1366|81|3|31|39288.16|0.05|0.02|A|F|1994-12-19|1994-12-07|1995-01-11|COLLECT COD|AIR| the furiously bold accounts +25831|64|40|4|49|47238.94|0.01|0.04|R|F|1994-12-11|1994-12-06|1994-12-23|DELIVER IN PERSON|SHIP|es: slyly even pac +25831|1522|43|5|44|62634.88|0.02|0.03|A|F|1994-10-08|1994-11-09|1994-10-24|TAKE BACK RETURN|AIR|ctions along the depo +25856|1508|49|1|18|25371.00|0.01|0.08|R|F|1992-10-09|1992-10-16|1992-10-10|COLLECT COD|MAIL| wake slyly +25856|196|75|2|33|36174.27|0.02|0.03|R|F|1992-10-05|1992-11-23|1992-11-01|COLLECT COD|TRUCK|ckages. blithely final ideas wa +25856|1863|93|3|21|37062.06|0.08|0.07|A|F|1992-10-06|1992-10-29|1992-10-23|TAKE BACK RETURN|RAIL|ly. pinto beans +25856|971|74|4|28|52415.16|0.07|0.06|R|F|1992-10-30|1992-11-26|1992-11-29|NONE|TRUCK|nal packages. care +25856|91|17|5|32|31714.88|0.07|0.07|R|F|1992-11-24|1992-11-09|1992-12-14|NONE|FOB|equests against the bold f +25856|1349|64|6|38|47512.92|0.02|0.08|R|F|1992-10-14|1992-11-18|1992-11-07|DELIVER IN PERSON|FOB|eep across +25856|1321|98|7|9|11000.88|0.05|0.07|A|F|1992-12-17|1992-11-23|1992-12-25|DELIVER IN PERSON|MAIL|hely across the furiously regular accounts +25857|1878|22|1|43|76534.41|0.05|0.05|N|O|1996-03-31|1996-06-06|1996-04-27|DELIVER IN PERSON|SHIP|the quickly ironic requests nag f +25858|1531|12|1|9|12892.77|0.07|0.04|A|F|1995-05-13|1995-03-31|1995-05-28|NONE|SHIP|al deposits. special requests haggle qui +25858|1049|55|2|44|41801.76|0.03|0.08|N|F|1995-05-30|1995-03-25|1995-06-26|TAKE BACK RETURN|RAIL| quickly specia +25858|366|95|3|39|49388.04|0.09|0.00|R|F|1995-04-15|1995-03-08|1995-05-02|NONE|RAIL|ly. slyly pending excuses are a +25858|1965|66|4|19|35472.24|0.02|0.04|A|F|1995-03-01|1995-03-20|1995-03-10|NONE|SHIP| final, bold requests; blithely dogg +25859|79|5|1|46|45037.22|0.02|0.08|N|O|1997-02-06|1997-03-06|1997-02-12|DELIVER IN PERSON|TRUCK| after the +25859|911|46|2|28|50733.48|0.05|0.05|N|O|1997-04-21|1997-03-20|1997-05-12|DELIVER IN PERSON|REG AIR|eodolites. care +25859|775|8|3|21|35191.17|0.07|0.02|N|O|1997-04-12|1997-02-28|1997-04-14|TAKE BACK RETURN|RAIL|xes. furiously ironic requests about the u +25859|1174|11|4|38|40856.46|0.02|0.05|N|O|1997-01-29|1997-03-12|1997-02-08|NONE|MAIL|. slyly pend +25860|485|86|1|10|13854.80|0.07|0.02|R|F|1993-01-25|1993-03-01|1993-02-21|DELIVER IN PERSON|MAIL|uriously sp +25860|1660|2|2|50|78083.00|0.05|0.08|A|F|1993-01-19|1993-03-29|1993-02-06|TAKE BACK RETURN|REG AIR|nd the bold, even packages +25860|1838|39|3|2|3479.66|0.09|0.00|A|F|1993-03-06|1993-04-02|1993-03-17|NONE|TRUCK|s across t +25860|76|52|4|4|3904.28|0.00|0.03|R|F|1993-03-14|1993-02-20|1993-03-28|COLLECT COD|FOB|ls-- pinto be +25861|1486|65|1|46|63824.08|0.06|0.04|R|F|1992-11-21|1992-09-17|1992-12-19|TAKE BACK RETURN|AIR|slyly final pl +25861|1525|46|2|11|15691.72|0.08|0.05|A|F|1992-08-10|1992-10-11|1992-08-23|DELIVER IN PERSON|FOB|ngside of t +25861|383|12|3|35|44918.30|0.10|0.05|A|F|1992-09-13|1992-09-28|1992-10-10|COLLECT COD|TRUCK|sly special dolphins after t +25861|545|36|4|17|24574.18|0.10|0.05|A|F|1992-10-16|1992-10-19|1992-11-14|NONE|AIR|l courts. slyly regular pinto +25861|314|43|5|47|57072.57|0.03|0.01|A|F|1992-09-27|1992-10-30|1992-10-04|COLLECT COD|SHIP|theodolites. final packages haggle! +25861|1472|73|6|16|21975.52|0.03|0.01|A|F|1992-11-28|1992-09-07|1992-12-19|DELIVER IN PERSON|AIR|slyly final platel +25862|1620|44|1|37|56299.94|0.00|0.02|N|O|1997-12-07|1997-10-27|1997-12-27|NONE|FOB|ructions use even pinto beans +25863|799|64|1|25|42494.75|0.08|0.05|N|F|1995-06-05|1995-07-14|1995-06-18|DELIVER IN PERSON|AIR|usly ironic f +25863|601|95|2|46|69073.60|0.05|0.04|N|O|1995-08-16|1995-06-16|1995-09-07|TAKE BACK RETURN|MAIL|ly regular requests play carefully +25863|290|45|3|46|54753.34|0.06|0.08|N|F|1995-06-13|1995-06-23|1995-06-26|NONE|TRUCK| instructions. slyly express requests wak +25863|876|43|4|32|56859.84|0.01|0.04|N|F|1995-06-12|1995-06-10|1995-07-07|NONE|SHIP|ans around the even deposi +25863|1393|8|5|37|47892.43|0.05|0.05|R|F|1995-05-28|1995-07-01|1995-06-09|DELIVER IN PERSON|TRUCK|its alongside of the theodolites s +25888|1227|39|1|35|39487.70|0.06|0.07|N|O|1996-12-17|1996-12-26|1997-01-15|NONE|TRUCK|lar deposits +25888|1643|26|2|36|55607.04|0.04|0.02|N|O|1997-01-24|1996-12-17|1997-01-25|TAKE BACK RETURN|SHIP|s nag. slyly ironic foxes boost fina +25888|73|24|3|39|37949.73|0.07|0.00|N|O|1996-11-20|1996-12-27|1996-11-29|TAKE BACK RETURN|REG AIR|deposits nag quietl +25889|946|47|1|7|12928.58|0.09|0.03|A|F|1993-09-29|1993-07-15|1993-10-19|DELIVER IN PERSON|REG AIR|silent packages. i +25889|162|15|2|43|45672.88|0.01|0.07|R|F|1993-09-10|1993-08-05|1993-10-04|COLLECT COD|SHIP|longside of the fluffily ironic +25889|229|30|3|38|42910.36|0.10|0.00|R|F|1993-06-26|1993-08-28|1993-06-30|DELIVER IN PERSON|FOB|counts. even accounts nag slyly according t +25890|57|83|1|46|44024.30|0.00|0.00|N|O|1998-02-21|1998-02-01|1998-03-09|TAKE BACK RETURN|REG AIR|he fluffy foxes. blithely unusual pack +25890|349|34|2|24|29984.16|0.00|0.04|N|O|1998-03-12|1998-02-25|1998-04-03|COLLECT COD|MAIL|fully special packages: r +25890|1519|60|3|3|4261.53|0.09|0.07|N|O|1998-01-12|1998-01-24|1998-01-22|TAKE BACK RETURN|MAIL|egrate furiously instructions. theodolites +25890|916|85|4|2|3633.82|0.04|0.08|N|O|1998-02-15|1998-01-26|1998-03-07|NONE|MAIL|ly regular instructions sleep +25891|1033|69|1|6|5604.18|0.09|0.07|N|O|1997-04-05|1997-03-21|1997-04-24|NONE|RAIL|avely regular excuses. quickly final asym +25891|934|69|2|32|58717.76|0.00|0.01|N|O|1997-03-19|1997-04-25|1997-04-10|NONE|FOB|gle quickly even package +25891|1481|60|3|32|44239.36|0.08|0.06|N|O|1997-04-05|1997-05-04|1997-04-15|DELIVER IN PERSON|SHIP|the furiously special dependencies. slyl +25891|1007|78|4|28|25424.00|0.08|0.04|N|O|1997-05-12|1997-03-17|1997-05-31|COLLECT COD|MAIL|eposits sleep along the furiously special r +25891|782|79|5|45|75725.10|0.03|0.08|N|O|1997-02-17|1997-04-26|1997-02-21|COLLECT COD|REG AIR|quests wake after the requests. pend +25892|146|47|1|13|13599.82|0.05|0.06|N|O|1996-01-17|1996-03-01|1996-02-13|TAKE BACK RETURN|FOB|counts thrash a +25893|1744|71|1|13|21394.62|0.07|0.06|N|O|1997-12-07|1997-11-03|1997-12-21|COLLECT COD|MAIL|y ironic pin +25893|184|37|2|21|22767.78|0.04|0.07|N|O|1997-12-11|1997-11-21|1997-12-20|NONE|AIR|endencies print always slyl +25893|471|72|3|14|19200.58|0.10|0.05|N|O|1998-01-04|1997-11-26|1998-01-19|TAKE BACK RETURN|AIR|odolites integrate bli +25893|971|72|4|35|65518.95|0.06|0.05|N|O|1997-09-30|1997-12-15|1997-10-03|COLLECT COD|REG AIR|ar pearls; unusual foxes ar +25893|1503|44|5|1|1404.50|0.07|0.04|N|O|1997-09-25|1997-12-04|1997-09-30|TAKE BACK RETURN|TRUCK|regular foxes use fluffily. ironic +25893|528|19|6|16|22856.32|0.09|0.06|N|O|1997-12-27|1997-11-22|1998-01-04|NONE|FOB|ts. carefully pending +25894|344|45|1|37|46040.58|0.06|0.08|N|O|1996-11-29|1996-10-31|1996-12-02|COLLECT COD|FOB|tructions boost quickly; blit +25895|283|38|1|35|41414.80|0.05|0.05|R|F|1992-04-24|1992-07-15|1992-04-26|TAKE BACK RETURN|TRUCK|accounts. accoun +25895|1561|62|2|44|64352.64|0.03|0.00|A|F|1992-07-30|1992-06-22|1992-08-28|DELIVER IN PERSON|REG AIR|c, pending theodolite +25895|1099|5|3|24|24002.16|0.05|0.05|R|F|1992-07-22|1992-06-25|1992-08-03|NONE|TRUCK|instructions are blithely ru +25895|485|86|4|14|19396.72|0.08|0.08|R|F|1992-07-10|1992-06-03|1992-07-22|TAKE BACK RETURN|TRUCK|ve the regul +25920|1556|37|1|35|51014.25|0.07|0.07|N|O|1998-02-25|1998-02-08|1998-03-01|NONE|REG AIR| notornis cajole slyly according to t +25920|325|26|2|36|44111.52|0.00|0.08|N|O|1998-01-12|1998-01-21|1998-02-06|COLLECT COD|RAIL|ackages wake. requests cajole abou +25920|1193|2|3|21|22977.99|0.08|0.00|N|O|1997-12-28|1998-02-02|1998-01-27|TAKE BACK RETURN|SHIP|latelets use carefully acco +25920|1245|20|4|21|24071.04|0.07|0.06|N|O|1998-01-14|1997-12-25|1998-02-11|NONE|FOB|unts beyond the slyly silent ideas +25920|237|38|5|15|17058.45|0.03|0.07|N|O|1998-01-15|1998-01-10|1998-02-10|NONE|RAIL|egular packages. blithely ironi +25920|946|81|6|27|49867.38|0.02|0.05|N|O|1998-02-16|1998-01-27|1998-02-28|COLLECT COD|MAIL|phs haggle through the +25920|1874|75|7|40|71034.80|0.09|0.06|N|O|1997-12-16|1998-02-01|1997-12-19|DELIVER IN PERSON|FOB|n ideas boost according to the furiousl +25921|377|78|1|1|1277.37|0.07|0.03|N|O|1997-10-02|1997-07-20|1997-10-07|DELIVER IN PERSON|AIR|. quickly stealthy +25921|549|50|2|7|10146.78|0.03|0.00|N|O|1997-07-08|1997-09-08|1997-07-14|DELIVER IN PERSON|FOB|quickly final +25921|1858|45|3|49|86232.65|0.00|0.02|N|O|1997-09-11|1997-07-18|1997-10-11|TAKE BACK RETURN|REG AIR| requests w +25921|1859|60|4|50|88042.50|0.05|0.00|N|O|1997-08-25|1997-08-30|1997-08-30|DELIVER IN PERSON|RAIL|s; final, pending requests haggle blithe +25921|1548|49|5|7|10146.78|0.05|0.03|N|O|1997-10-11|1997-09-10|1997-10-12|NONE|FOB| blithely final platelets. spec +25921|934|35|6|10|18349.30|0.04|0.00|N|O|1997-07-26|1997-08-27|1997-08-21|TAKE BACK RETURN|FOB|y special ex +25921|973|74|7|15|28109.55|0.07|0.04|N|O|1997-07-22|1997-09-05|1997-08-04|COLLECT COD|AIR|osits. even requests alongs +25922|239|21|1|10|11392.30|0.08|0.05|N|O|1995-11-18|1995-10-21|1995-11-22|NONE|AIR|lly even pinto beans. enticingly fin +25923|1326|3|1|22|27001.04|0.04|0.06|R|F|1993-05-13|1993-06-18|1993-05-14|TAKE BACK RETURN|REG AIR|nal packages. express accounts +25923|1864|8|2|35|61805.10|0.01|0.02|A|F|1993-05-12|1993-06-04|1993-05-19|TAKE BACK RETURN|AIR|c courts affix f +25923|1181|18|3|2|2164.36|0.03|0.07|R|F|1993-06-28|1993-05-14|1993-06-29|TAKE BACK RETURN|MAIL|excuses use. express, pending requests nee +25923|1649|32|4|14|21708.96|0.04|0.00|R|F|1993-07-25|1993-06-17|1993-08-02|COLLECT COD|RAIL|ove the special, regular reques +25924|1788|31|1|43|72660.54|0.09|0.03|N|O|1997-11-16|1997-10-03|1997-11-25|NONE|TRUCK|ully express req +25924|962|65|2|42|78244.32|0.01|0.02|N|O|1997-09-21|1997-11-22|1997-10-08|DELIVER IN PERSON|TRUCK| deposits. quickly regular sheaves +25924|665|66|3|24|37575.84|0.07|0.01|N|O|1997-12-08|1997-10-04|1997-12-13|TAKE BACK RETURN|AIR|fluffily alongside of the quick +25924|1748|49|4|11|18147.14|0.03|0.03|N|O|1997-09-29|1997-10-15|1997-10-09|DELIVER IN PERSON|FOB|nic foxes. regular, even depo +25924|1755|40|5|48|79524.00|0.08|0.07|N|O|1997-11-28|1997-10-14|1997-12-04|COLLECT COD|REG AIR|s boost. regular accounts would ser +25924|1370|9|6|38|48312.06|0.07|0.05|N|O|1997-10-12|1997-11-26|1997-11-07|COLLECT COD|AIR|ong the unusual, special +25924|768|65|7|13|21693.88|0.08|0.07|N|O|1997-10-08|1997-10-03|1997-10-14|TAKE BACK RETURN|SHIP|usual, final ideas after +25925|610|42|1|16|24169.76|0.10|0.04|N|O|1997-09-15|1997-09-26|1997-09-29|COLLECT COD|RAIL| cajole blit +25925|751|48|2|26|42945.50|0.10|0.00|N|O|1997-11-15|1997-09-23|1997-12-01|COLLECT COD|TRUCK|ronic accounts. ca +25925|128|29|3|18|18506.16|0.07|0.04|N|O|1997-11-03|1997-09-07|1997-11-15|COLLECT COD|RAIL| furiously regular dolphins. fluf +25925|1760|45|4|37|61485.12|0.03|0.04|N|O|1997-09-15|1997-10-13|1997-10-06|DELIVER IN PERSON|AIR|escapades. final, even foxes sleep: +25925|2000|45|5|7|6314.00|0.03|0.00|N|O|1997-11-16|1997-10-02|1997-12-13|COLLECT COD|REG AIR|lithely even dolphins must cajole +25926|1348|63|1|24|29984.16|0.00|0.02|R|F|1995-03-02|1994-12-23|1995-03-16|NONE|FOB|fluffily final requests. blithe +25926|613|14|2|41|62058.01|0.06|0.03|A|F|1995-01-19|1995-01-10|1995-01-20|COLLECT COD|RAIL|osits. ironic, special requests +25926|998|1|3|42|79757.58|0.08|0.04|A|F|1994-12-03|1995-02-18|1994-12-08|TAKE BACK RETURN|AIR|eposits about the in +25926|1026|32|4|38|35226.76|0.08|0.06|A|F|1995-03-12|1994-12-27|1995-03-15|DELIVER IN PERSON|MAIL| along the p +25926|1800|85|5|19|32334.20|0.10|0.05|R|F|1995-01-18|1995-01-22|1995-02-02|DELIVER IN PERSON|MAIL| requests are final ideas. regular theo +25926|1130|3|6|26|26809.38|0.03|0.08|A|F|1995-03-20|1995-01-18|1995-04-19|TAKE BACK RETURN|AIR|counts. furiously ironic packag +25926|751|84|7|41|67721.75|0.03|0.06|A|F|1995-02-28|1995-02-06|1995-03-02|COLLECT COD|TRUCK|ly final accounts are slyl +25927|1470|88|1|15|20572.05|0.07|0.02|A|F|1994-08-03|1994-07-13|1994-08-10|NONE|SHIP|p. regular, unusual ideas impr +25927|541|42|2|15|21623.10|0.05|0.06|A|F|1994-05-11|1994-06-11|1994-05-28|NONE|REG AIR|egular packages a +25927|1071|72|3|13|12636.91|0.00|0.04|A|F|1994-04-27|1994-06-09|1994-05-02|NONE|SHIP|refully carefully qu +25927|683|46|4|23|36424.64|0.06|0.07|A|F|1994-05-29|1994-06-27|1994-06-13|TAKE BACK RETURN|RAIL|the bold requests sleep slyly even account +25927|1366|67|5|38|48159.68|0.03|0.06|R|F|1994-06-06|1994-07-07|1994-06-20|TAKE BACK RETURN|MAIL|. carefully regular accounts agai +25927|921|22|6|40|72876.80|0.08|0.08|A|F|1994-06-10|1994-07-05|1994-06-25|COLLECT COD|SHIP| shall dazzle across the +25952|1525|66|1|17|24250.84|0.07|0.08|R|F|1993-12-29|1993-11-26|1994-01-22|COLLECT COD|SHIP|he regular requests wake acco +25952|1607|31|2|43|64869.80|0.01|0.00|R|F|1993-11-29|1993-11-01|1993-12-26|NONE|MAIL| even, even foxes. b +25952|627|21|3|49|74853.38|0.08|0.05|A|F|1993-09-25|1993-10-25|1993-10-20|DELIVER IN PERSON|TRUCK|. carefull +25953|201|56|1|31|34137.20|0.04|0.04|R|F|1994-12-25|1994-11-18|1995-01-01|DELIVER IN PERSON|REG AIR|, pending es +25953|632|95|2|28|42913.64|0.08|0.02|A|F|1995-01-06|1994-11-24|1995-01-14|DELIVER IN PERSON|MAIL|attainments wake silently. slyly eve +25953|358|87|3|21|26425.35|0.02|0.05|R|F|1994-11-10|1994-12-27|1994-11-24|DELIVER IN PERSON|TRUCK|enticing instructions +25953|1514|95|4|26|36803.26|0.02|0.06|A|F|1994-12-07|1994-10-31|1994-12-21|COLLECT COD|TRUCK|requests. ironically unusual foxes use acr +25954|1739|24|1|30|49221.90|0.07|0.04|A|F|1995-02-28|1995-04-17|1995-03-08|DELIVER IN PERSON|TRUCK|gular theodolite +25955|1384|61|1|4|5141.52|0.01|0.03|N|O|1995-07-24|1995-06-08|1995-08-04|NONE|MAIL| instructions haggle fluffily amo +25955|1956|57|2|18|33443.10|0.02|0.01|A|F|1995-05-11|1995-06-17|1995-05-22|TAKE BACK RETURN|FOB| regular theodoli +25955|247|2|3|9|10325.16|0.03|0.00|N|O|1995-08-20|1995-06-04|1995-09-08|DELIVER IN PERSON|SHIP|uests along the carefully r +25955|68|94|4|35|33882.10|0.02|0.05|N|O|1995-08-20|1995-07-23|1995-08-21|COLLECT COD|RAIL|e packages. even, busy deposits u +25956|480|10|1|47|64882.56|0.07|0.07|N|O|1998-06-25|1998-07-18|1998-06-29|COLLECT COD|FOB|re requests. ironic +25956|1413|92|2|38|49947.58|0.05|0.05|N|O|1998-09-03|1998-07-29|1998-09-15|COLLECT COD|REG AIR|dependencies. express deposits ab +25956|966|69|3|24|44807.04|0.04|0.05|N|O|1998-08-15|1998-07-24|1998-08-30|TAKE BACK RETURN|SHIP|thin packages cajole acc +25957|1748|33|1|34|56091.16|0.01|0.07|N|O|1996-11-29|1996-09-06|1996-12-23|TAKE BACK RETURN|MAIL|es wake slyly slyly iro +25957|1249|24|2|39|44859.36|0.08|0.08|N|O|1996-08-12|1996-10-18|1996-08-29|NONE|RAIL| ideas. furiously bold tithes integrate +25957|1822|23|3|29|49990.78|0.09|0.00|N|O|1996-09-07|1996-09-06|1996-09-08|DELIVER IN PERSON|AIR|hely special sentiments are fluffi +25958|1597|78|1|25|37464.75|0.03|0.00|N|O|1997-09-09|1997-07-26|1997-09-25|DELIVER IN PERSON|TRUCK|posits wake furiously. slyly +25958|22|48|2|50|46101.00|0.04|0.00|N|O|1997-08-23|1997-09-18|1997-09-16|DELIVER IN PERSON|RAIL|inal, pending asymptotes. fluffily +25958|1175|48|3|17|18294.89|0.06|0.08|N|O|1997-08-20|1997-09-12|1997-08-23|DELIVER IN PERSON|MAIL|furiously regul +25958|1170|43|4|20|21423.40|0.06|0.07|N|O|1997-07-01|1997-07-26|1997-07-12|NONE|TRUCK|ns are furiously regular account +25958|1696|20|5|17|27160.73|0.09|0.03|N|O|1997-08-10|1997-09-09|1997-09-05|NONE|AIR|egular platelets must haggle af +25958|218|73|6|19|21245.99|0.06|0.01|N|O|1997-06-23|1997-08-05|1997-07-12|DELIVER IN PERSON|AIR|. ironic instru +25958|893|27|7|16|28702.24|0.10|0.00|N|O|1997-09-09|1997-09-08|1997-10-06|COLLECT COD|FOB|nal accounts na +25959|1933|78|1|48|88076.64|0.00|0.01|A|F|1994-09-28|1994-10-10|1994-10-12|COLLECT COD|MAIL|s boost carefully carefully bold account +25959|404|63|2|11|14348.40|0.09|0.06|R|F|1994-09-09|1994-09-19|1994-09-17|DELIVER IN PERSON|TRUCK|blithely regular accounts caj +25959|1290|65|3|25|29782.25|0.05|0.01|A|F|1994-08-24|1994-08-24|1994-09-02|COLLECT COD|SHIP|es wake slyly final dependen +25984|2000|33|1|29|26158.00|0.06|0.06|N|O|1997-05-26|1997-07-03|1997-06-15|TAKE BACK RETURN|REG AIR|as special ideas. ironic +25985|1589|90|1|6|8943.48|0.03|0.03|A|F|1992-10-01|1992-11-02|1992-10-14|COLLECT COD|SHIP|ay wake quickly even ideas. blithely re +25985|66|92|2|21|20287.26|0.07|0.04|R|F|1992-11-09|1992-10-16|1992-11-18|DELIVER IN PERSON|FOB|accounts. final, +25985|1610|52|3|33|49883.13|0.00|0.00|R|F|1992-09-21|1992-11-22|1992-10-15|DELIVER IN PERSON|SHIP|ending requests wake sl +25985|208|9|4|41|45436.20|0.09|0.06|A|F|1992-10-06|1992-10-15|1992-10-22|TAKE BACK RETURN|RAIL| blithely pending ideas-- slyly b +25985|1890|91|5|6|10751.34|0.03|0.01|A|F|1992-11-17|1992-11-12|1992-12-07|TAKE BACK RETURN|AIR|ions haggle furi +25985|1824|25|6|23|39693.86|0.07|0.00|A|F|1992-09-12|1992-11-10|1992-09-15|DELIVER IN PERSON|MAIL|esias. blithely pendi +25986|1127|28|1|44|45237.28|0.03|0.01|A|F|1992-07-06|1992-08-20|1992-07-25|DELIVER IN PERSON|RAIL|egular requests +25986|969|38|2|21|39269.16|0.03|0.05|R|F|1992-10-19|1992-08-27|1992-10-22|NONE|SHIP|ptotes cajole carefully. +25986|1267|68|3|45|52571.70|0.02|0.04|A|F|1992-07-10|1992-09-20|1992-08-08|COLLECT COD|FOB| instructions hang. quickly slow foxes hagg +25986|1846|47|4|8|13982.72|0.09|0.02|R|F|1992-07-09|1992-08-05|1992-07-30|NONE|REG AIR|ully express packa +25986|1692|93|5|16|25499.04|0.08|0.03|A|F|1992-06-25|1992-08-30|1992-07-15|COLLECT COD|SHIP|lithely pending dep +25986|1630|72|6|39|59733.57|0.04|0.00|A|F|1992-07-16|1992-09-04|1992-08-04|NONE|RAIL|posits integrate slyly. ironic pinto +25987|1933|66|1|7|12844.51|0.09|0.07|N|O|1997-12-12|1997-11-12|1997-12-13|NONE|RAIL|e silent, express re +25987|1863|50|2|18|31767.48|0.02|0.00|N|O|1997-11-01|1997-12-10|1997-11-10|DELIVER IN PERSON|RAIL| furiously alongside +25987|260|88|3|42|48730.92|0.07|0.01|N|O|1997-11-21|1997-11-20|1997-12-20|TAKE BACK RETURN|FOB|te furiously. unusual requests wake +25988|1552|33|1|31|45060.05|0.10|0.05|N|O|1997-02-10|1996-12-04|1997-03-04|NONE|MAIL|inder furiously final +25988|1108|17|2|10|10091.00|0.05|0.05|N|O|1997-02-09|1996-11-28|1997-02-14|COLLECT COD|TRUCK|y final packages. carefully +25989|561|22|1|36|52616.16|0.04|0.03|N|O|1998-07-20|1998-07-11|1998-08-19|COLLECT COD|AIR|s. quickly express packages +25989|635|67|2|2|3071.26|0.07|0.07|N|O|1998-06-01|1998-07-09|1998-06-10|COLLECT COD|FOB|l requests along the carefully +25989|374|59|3|16|20389.92|0.06|0.07|N|O|1998-06-01|1998-07-25|1998-06-15|TAKE BACK RETURN|RAIL|al theodolites are along the carefully reg +25989|1489|90|4|36|50057.28|0.05|0.02|N|O|1998-06-29|1998-07-11|1998-07-26|DELIVER IN PERSON|TRUCK|ect furiously. accounts among the bold idea +25989|752|53|5|45|74373.75|0.05|0.05|N|O|1998-09-05|1998-08-09|1998-09-19|DELIVER IN PERSON|FOB|y pinto beans. ironic excuses aga +25989|956|25|6|48|89133.60|0.03|0.07|N|O|1998-09-12|1998-08-08|1998-10-06|TAKE BACK RETURN|FOB|s solve. dolphins after the silent fo +25989|1155|56|7|27|28516.05|0.06|0.06|N|O|1998-07-13|1998-08-02|1998-07-19|DELIVER IN PERSON|RAIL|s affix in +25990|839|6|1|39|67853.37|0.00|0.02|R|F|1994-04-18|1994-05-14|1994-05-17|TAKE BACK RETURN|AIR|refully even accounts cajol +25990|294|49|2|17|20302.93|0.08|0.01|A|F|1994-05-15|1994-04-10|1994-05-17|TAKE BACK RETURN|RAIL|atelets haggle at the blithely ironic +25990|811|45|3|17|29100.77|0.06|0.04|A|F|1994-04-15|1994-04-18|1994-05-02|TAKE BACK RETURN|RAIL|oost until the +25990|1473|74|4|44|60476.68|0.10|0.08|R|F|1994-04-06|1994-05-16|1994-04-25|NONE|FOB|as integrate slyly according to the +25990|1918|19|5|48|87355.68|0.03|0.04|R|F|1994-04-17|1994-04-29|1994-05-17|DELIVER IN PERSON|MAIL|hely even accounts among the s +25991|1014|20|1|24|21960.24|0.00|0.06|N|O|1998-07-18|1998-06-05|1998-08-08|COLLECT COD|FOB|n accounts sleep. pending d +25991|1941|74|2|18|33172.92|0.06|0.06|N|O|1998-05-31|1998-07-11|1998-06-05|NONE|TRUCK| furiously furious dependencies after +25991|1148|85|3|12|12589.68|0.04|0.05|N|O|1998-04-24|1998-05-24|1998-05-01|COLLECT COD|SHIP|telets use quickly across +25991|1484|63|4|30|41564.40|0.07|0.04|N|O|1998-06-14|1998-05-19|1998-07-07|DELIVER IN PERSON|TRUCK|ions. furi +25991|634|66|5|50|76731.50|0.00|0.08|N|O|1998-05-12|1998-06-05|1998-05-21|NONE|FOB|uickly quickly final excuses +25991|1510|11|6|33|46579.83|0.02|0.08|N|O|1998-08-15|1998-06-04|1998-09-03|TAKE BACK RETURN|MAIL|fully bold requests. blith +26016|1086|22|1|8|7896.64|0.08|0.03|A|F|1994-11-10|1994-12-19|1994-12-02|COLLECT COD|TRUCK|ickly express fo +26016|502|93|2|41|57502.50|0.05|0.07|A|F|1994-11-04|1994-12-18|1994-11-15|NONE|TRUCK| sleep among the quickly regular reque +26016|416|75|3|32|42125.12|0.02|0.04|R|F|1994-11-25|1994-12-01|1994-12-19|COLLECT COD|TRUCK|yly silent cou +26016|1448|66|4|25|33736.00|0.05|0.06|R|F|1994-10-24|1994-12-26|1994-10-28|TAKE BACK RETURN|SHIP|ies. ideas sleep ideas. s +26016|1598|19|5|25|37489.75|0.05|0.04|A|F|1994-12-11|1994-12-29|1994-12-14|DELIVER IN PERSON|SHIP| integrate +26017|1678|79|1|6|9478.02|0.01|0.02|N|O|1998-08-30|1998-07-20|1998-09-18|DELIVER IN PERSON|AIR| carefully iro +26017|1223|24|2|28|31478.16|0.05|0.05|N|O|1998-09-17|1998-08-16|1998-10-04|COLLECT COD|TRUCK|ecial request +26017|604|67|3|36|54165.60|0.05|0.07|N|O|1998-09-27|1998-08-08|1998-10-25|DELIVER IN PERSON|TRUCK|al accounts sleep carefully. slyly iro +26017|147|26|4|5|5235.70|0.00|0.06|N|O|1998-08-06|1998-07-13|1998-08-22|COLLECT COD|TRUCK|ses wake sl +26017|1630|31|5|32|49012.16|0.07|0.06|N|O|1998-07-24|1998-08-30|1998-08-19|TAKE BACK RETURN|FOB|lly. finally even packages are fluffi +26018|634|28|1|30|46038.90|0.08|0.06|N|O|1997-08-15|1997-10-07|1997-08-16|COLLECT COD|SHIP|fix. pending dep +26018|417|76|2|31|40839.71|0.08|0.07|N|O|1997-09-05|1997-08-27|1997-09-11|COLLECT COD|AIR|rnis sleep. slyly silent depende +26018|329|86|3|26|31962.32|0.10|0.00|N|O|1997-08-26|1997-09-04|1997-09-02|TAKE BACK RETURN|AIR|ng-- accounts hinder pendin +26018|110|37|4|46|46465.06|0.04|0.05|N|O|1997-07-13|1997-09-10|1997-08-01|NONE|REG AIR|inal packages. packages along the fu +26018|1350|89|5|14|17518.90|0.09|0.02|N|O|1997-10-26|1997-08-25|1997-11-03|TAKE BACK RETURN|AIR|d, regular excuses sle +26018|1195|4|6|4|4384.76|0.04|0.03|N|O|1997-08-13|1997-08-28|1997-09-07|COLLECT COD|SHIP|x furiously blithely regu +26018|345|74|7|4|4981.36|0.06|0.06|N|O|1997-08-27|1997-09-22|1997-09-04|TAKE BACK RETURN|FOB| against the ironic, unusual acco +26019|1376|77|1|41|52372.17|0.04|0.07|N|O|1998-03-13|1998-01-30|1998-04-05|DELIVER IN PERSON|SHIP|osits beneath the unusual, bold theod +26019|710|43|2|5|8053.55|0.00|0.07|N|O|1998-03-20|1998-01-21|1998-04-14|COLLECT COD|RAIL|ove the fluffily final request +26019|275|3|3|33|38783.91|0.02|0.08|N|O|1998-02-09|1998-01-16|1998-02-20|NONE|SHIP|ckages along the pi +26020|438|39|1|38|50860.34|0.08|0.02|N|O|1996-05-31|1996-04-06|1996-06-16|DELIVER IN PERSON|AIR| slyly special dependencies +26020|1386|1|2|36|46345.68|0.10|0.00|N|O|1996-05-26|1996-04-16|1996-06-05|COLLECT COD|AIR|ironic requests. even dolphins wake. expr +26020|66|17|3|41|39608.46|0.07|0.05|N|O|1996-05-04|1996-04-25|1996-05-17|DELIVER IN PERSON|RAIL|packages haggle fur +26021|280|8|1|13|15343.64|0.00|0.04|A|F|1992-12-03|1992-11-28|1992-12-12|NONE|TRUCK|o beans must use above the +26021|560|51|2|10|14605.60|0.07|0.08|A|F|1992-12-02|1992-10-25|1992-12-21|DELIVER IN PERSON|RAIL|ix alongside of the reg +26021|900|1|3|32|57628.80|0.00|0.03|R|F|1992-11-07|1992-10-28|1992-11-21|NONE|RAIL|even packages. slyl +26022|37|13|1|22|20614.66|0.04|0.07|N|O|1997-12-16|1998-01-12|1998-01-10|COLLECT COD|TRUCK|s snooze carefully across +26022|1064|70|2|1|965.06|0.05|0.00|N|O|1997-12-15|1997-12-18|1998-01-08|COLLECT COD|RAIL|usly. blithely even asympt +26022|1154|91|3|45|47481.75|0.00|0.08|N|O|1997-10-26|1998-01-07|1997-11-23|DELIVER IN PERSON|FOB| alongside of the quietly +26022|1105|6|4|43|43262.30|0.03|0.02|N|O|1997-10-27|1997-12-06|1997-11-06|TAKE BACK RETURN|REG AIR|c foxes. r +26022|740|73|5|43|70551.82|0.01|0.04|N|O|1997-11-29|1997-12-15|1997-12-24|NONE|RAIL|furiously afte +26023|467|97|1|19|25981.74|0.08|0.01|R|F|1993-10-08|1993-10-13|1993-10-14|COLLECT COD|FOB|es. pending deposits must have to use caref +26023|459|60|2|44|59815.80|0.09|0.06|A|F|1993-08-28|1993-11-12|1993-09-18|TAKE BACK RETURN|RAIL|. regular, final deposits lose caref +26023|730|63|3|33|53814.09|0.09|0.05|R|F|1993-09-11|1993-11-07|1993-09-16|NONE|MAIL|es are fur +26023|1834|64|4|17|29509.11|0.06|0.08|R|F|1993-11-25|1993-10-19|1993-12-23|COLLECT COD|AIR|furiously express req +26023|1666|49|5|26|40759.16|0.07|0.02|R|F|1993-11-27|1993-10-07|1993-12-27|NONE|AIR| requests. regular +26048|1603|27|1|47|70716.20|0.08|0.00|N|O|1998-07-25|1998-08-31|1998-08-07|COLLECT COD|TRUCK|eposits boost furiously along the +26048|84|35|2|9|8856.72|0.03|0.02|N|O|1998-10-05|1998-08-10|1998-10-11|COLLECT COD|MAIL| around the final, unusual packages. +26049|1938|71|1|4|7359.72|0.04|0.08|A|F|1995-03-15|1995-05-05|1995-03-25|DELIVER IN PERSON|MAIL|t dolphins. carefully regular accounts acc +26049|850|17|2|24|42020.40|0.00|0.04|R|F|1995-05-24|1995-04-19|1995-06-09|TAKE BACK RETURN|RAIL|s against the +26050|1273|11|1|1|1174.27|0.01|0.07|N|O|1995-09-11|1995-07-29|1995-10-03|NONE|SHIP|accounts sleep carefully. e +26050|166|93|2|38|40514.08|0.01|0.05|N|O|1995-07-27|1995-07-30|1995-08-25|DELIVER IN PERSON|REG AIR|g deposits alongside of th +26050|550|41|3|23|33362.65|0.02|0.07|N|O|1995-08-31|1995-08-20|1995-09-01|DELIVER IN PERSON|RAIL| slyly final p +26050|1080|51|4|11|10791.88|0.00|0.07|N|O|1995-07-28|1995-07-28|1995-08-25|DELIVER IN PERSON|REG AIR|regularly sly excuses are. +26050|146|25|5|13|13599.82|0.07|0.05|N|O|1995-08-30|1995-08-14|1995-09-10|COLLECT COD|REG AIR|final somas. quickly express id +26050|1873|74|6|12|21298.44|0.10|0.05|N|O|1995-08-13|1995-09-14|1995-08-26|NONE|RAIL|slyly regul +26050|1128|29|7|7|7203.84|0.06|0.07|N|O|1995-07-09|1995-07-23|1995-07-13|COLLECT COD|MAIL|bove the permanent accounts n +26051|221|22|1|43|48212.46|0.10|0.08|A|F|1993-09-02|1993-08-01|1993-10-01|TAKE BACK RETURN|REG AIR|es are blithely after the even packages. +26051|1342|19|2|6|7460.04|0.01|0.05|A|F|1993-09-23|1993-08-03|1993-10-13|COLLECT COD|MAIL|eas. blithely specia +26051|446|34|3|24|32314.56|0.07|0.04|A|F|1993-07-07|1993-08-07|1993-08-06|TAKE BACK RETURN|AIR|deas: furiously pe +26051|1054|90|4|17|16235.85|0.05|0.08|R|F|1993-09-12|1993-08-02|1993-09-17|DELIVER IN PERSON|RAIL| the slyly fina +26051|48|99|5|11|10428.44|0.01|0.06|A|F|1993-07-30|1993-08-27|1993-08-27|TAKE BACK RETURN|RAIL| special accounts are. blithely +26052|609|41|1|25|37740.00|0.05|0.01|N|O|1996-07-31|1996-06-19|1996-08-18|NONE|FOB|as wake busily ideas. +26052|987|22|2|50|94399.00|0.00|0.00|N|O|1996-08-27|1996-06-16|1996-09-01|NONE|FOB|press theodolites cajole ca +26052|1184|85|3|28|30385.04|0.10|0.03|N|O|1996-07-27|1996-07-01|1996-08-23|DELIVER IN PERSON|RAIL|ding excus +26053|1879|66|1|16|28493.92|0.05|0.00|R|F|1992-03-09|1992-03-29|1992-03-15|DELIVER IN PERSON|RAIL|fully unusual deposits. car +26053|397|82|2|19|24650.41|0.10|0.05|R|F|1992-04-23|1992-03-25|1992-05-22|NONE|REG AIR|e alongside of the deposits. furi +26053|920|23|3|40|72836.80|0.03|0.00|R|F|1992-03-17|1992-03-16|1992-04-06|COLLECT COD|TRUCK|hely. regular deposits na +26053|1311|12|4|25|30307.75|0.01|0.01|A|F|1992-02-06|1992-03-18|1992-02-15|DELIVER IN PERSON|MAIL| final accounts. silent wat +26053|1745|30|5|16|26347.84|0.05|0.01|A|F|1992-01-30|1992-04-11|1992-02-25|DELIVER IN PERSON|AIR| carefully regular account +26054|518|19|1|42|59577.42|0.04|0.03|A|F|1993-06-08|1993-03-25|1993-06-16|DELIVER IN PERSON|SHIP|ven foxes haggle silent accounts. care +26054|1504|5|2|12|16866.00|0.09|0.06|R|F|1993-04-26|1993-04-30|1993-04-29|NONE|FOB|egular instructions. +26054|1562|3|3|37|54151.72|0.10|0.03|R|F|1993-06-10|1993-04-13|1993-07-05|DELIVER IN PERSON|SHIP|hins thrash quickly again +26054|992|95|4|20|37859.80|0.06|0.02|A|F|1993-03-11|1993-04-27|1993-03-15|TAKE BACK RETURN|MAIL|ess pinto beans grow furiously final pa +26054|1761|46|5|45|74824.20|0.08|0.08|A|F|1993-04-10|1993-05-10|1993-05-09|NONE|TRUCK|ges. theodolites are never. carefully p +26054|1041|12|6|37|34855.48|0.10|0.08|R|F|1993-03-16|1993-04-23|1993-04-01|COLLECT COD|SHIP|ng the unus +26055|1666|49|1|44|68977.04|0.08|0.02|A|F|1993-01-02|1993-01-14|1993-01-05|NONE|FOB|e slyly. idly special ideas affix q +26055|1554|95|2|24|34933.20|0.04|0.06|R|F|1992-12-01|1993-01-28|1992-12-04|NONE|SHIP|kages sleep among the fina +26055|1418|97|3|18|23749.38|0.03|0.04|A|F|1993-01-13|1993-01-14|1993-01-21|COLLECT COD|REG AIR|usual accounts haggle slyly. quickly r +26055|987|88|4|7|13215.86|0.00|0.02|R|F|1993-02-13|1993-02-05|1993-02-16|COLLECT COD|TRUCK|to the fina +26055|175|54|5|26|27954.42|0.10|0.00|A|F|1993-03-16|1993-01-30|1993-04-09|DELIVER IN PERSON|SHIP| throughout the f +26080|707|4|1|41|65915.70|0.09|0.06|A|F|1994-04-09|1994-03-05|1994-04-21|TAKE BACK RETURN|SHIP|carefully final instructions. ir +26080|1148|85|2|45|47211.30|0.04|0.02|R|F|1994-03-27|1994-03-07|1994-04-21|DELIVER IN PERSON|MAIL|into beans sleep +26080|107|34|3|12|12085.20|0.02|0.01|A|F|1994-01-05|1994-01-28|1994-01-25|NONE|MAIL|arefully against +26080|342|43|4|47|58389.98|0.09|0.07|R|F|1993-12-19|1994-03-15|1994-01-09|TAKE BACK RETURN|SHIP|ronic, fin +26081|51|2|1|45|42797.25|0.04|0.07|R|F|1994-01-01|1994-01-03|1994-01-02|NONE|FOB|accounts nag quickly furiously p +26081|758|59|2|1|1658.75|0.02|0.08|R|F|1993-12-18|1994-01-12|1994-01-17|COLLECT COD|AIR|cing, bold pinto beans are +26082|1338|53|1|23|28504.59|0.10|0.06|N|O|1996-05-06|1996-04-14|1996-05-10|TAKE BACK RETURN|SHIP|e fluffily according to the evenly r +26082|807|74|2|6|10246.80|0.07|0.06|N|O|1996-04-26|1996-04-25|1996-05-19|TAKE BACK RETURN|REG AIR|ake. blithely ironic deposits +26082|1559|80|3|35|51119.25|0.06|0.06|N|O|1996-04-21|1996-04-08|1996-05-16|COLLECT COD|AIR|. blithely unusual hockey players n +26082|1056|57|4|43|41153.15|0.10|0.07|N|O|1996-04-03|1996-03-30|1996-05-03|TAKE BACK RETURN|RAIL|ar packages boost ruthlessly quickly close +26083|125|52|1|25|25628.00|0.00|0.05|N|O|1996-05-14|1996-08-03|1996-05-17|DELIVER IN PERSON|FOB|ys final platelets haggle foxe +26083|1966|99|2|36|67246.56|0.04|0.07|N|O|1996-06-21|1996-06-30|1996-07-14|DELIVER IN PERSON|REG AIR|packages are carefully instruc +26083|1058|29|3|40|38362.00|0.00|0.04|N|O|1996-06-05|1996-06-25|1996-06-28|NONE|MAIL|xpress, regular accounts are. furio +26083|1106|15|4|50|50355.00|0.02|0.05|N|O|1996-05-28|1996-07-18|1996-06-18|TAKE BACK RETURN|SHIP|o beans sleep busily idle asymptotes. sl +26083|1708|51|5|35|56339.50|0.06|0.05|N|O|1996-08-30|1996-07-16|1996-09-15|COLLECT COD|MAIL|ide the instructions. s +26084|43|44|1|35|33006.40|0.06|0.05|R|F|1993-01-29|1992-11-23|1993-02-04|DELIVER IN PERSON|REG AIR| about the pending +26084|1551|32|2|43|62459.65|0.03|0.05|R|F|1992-12-06|1992-12-03|1992-12-21|COLLECT COD|REG AIR|ic, special fox +26085|544|35|1|30|43336.20|0.09|0.07|N|O|1998-03-27|1998-03-03|1998-04-09|TAKE BACK RETURN|FOB|ly carefully ironic +26085|205|6|2|1|1105.20|0.04|0.04|N|O|1998-03-02|1998-02-25|1998-03-25|COLLECT COD|SHIP|old requests. blithel +26085|1364|41|3|26|32899.36|0.04|0.00|N|O|1998-02-06|1998-03-01|1998-02-17|COLLECT COD|RAIL|ve fluffily for the entic +26086|1775|76|1|39|65394.03|0.00|0.06|N|O|1997-09-03|1997-09-01|1997-09-18|NONE|AIR|. furiously pending deposits +26086|416|46|2|3|3949.23|0.04|0.05|N|O|1997-07-15|1997-09-13|1997-08-03|COLLECT COD|RAIL|refully regular frays sleep. unusual, e +26087|1708|51|1|34|54729.80|0.07|0.03|N|O|1996-12-06|1997-01-11|1997-01-02|TAKE BACK RETURN|FOB|ual deposits. quickly even ac +26087|1348|87|2|20|24986.80|0.03|0.08|N|O|1996-12-23|1996-11-25|1997-01-10|NONE|FOB| foxes sleep furiously final acc +26112|339|68|1|34|42137.22|0.07|0.01|N|O|1998-06-13|1998-04-29|1998-06-20|DELIVER IN PERSON|REG AIR|ully blithe deposits. carefully si +26112|1206|18|2|18|19929.60|0.02|0.01|N|O|1998-07-12|1998-06-12|1998-07-30|TAKE BACK RETURN|FOB|e blithely bold theodolites. furiously s +26112|556|87|3|6|8739.30|0.02|0.01|N|O|1998-05-17|1998-06-14|1998-05-25|DELIVER IN PERSON|TRUCK|es are acros +26113|1464|65|1|49|66907.54|0.05|0.07|N|O|1998-10-27|1998-09-19|1998-11-02|COLLECT COD|RAIL|es integrate. final, regular pinto bean +26113|1262|63|2|24|27918.24|0.01|0.02|N|O|1998-07-29|1998-09-14|1998-08-06|DELIVER IN PERSON|TRUCK|are against the platelet +26113|923|92|3|3|5471.76|0.03|0.03|N|O|1998-09-25|1998-09-16|1998-10-12|DELIVER IN PERSON|TRUCK|y. slow, even gifts along +26113|1745|88|4|16|26347.84|0.05|0.01|N|O|1998-09-17|1998-08-18|1998-10-04|DELIVER IN PERSON|TRUCK|s after the furiously even packages +26113|1984|29|5|35|66009.30|0.02|0.08|N|O|1998-11-12|1998-09-25|1998-11-29|COLLECT COD|RAIL|ar, blithe pinto beans wake at the +26113|1922|23|6|24|43774.08|0.06|0.04|N|O|1998-09-01|1998-09-25|1998-09-28|COLLECT COD|MAIL|ely final dugouts alongside of the i +26114|472|2|1|34|46663.98|0.05|0.07|N|O|1997-12-29|1997-10-09|1998-01-27|NONE|REG AIR|have to use. slyly fin +26114|362|47|2|14|17673.04|0.00|0.02|N|O|1997-09-20|1997-10-11|1997-10-02|TAKE BACK RETURN|RAIL|its. silent foxes haggle +26114|1439|18|3|3|4021.29|0.00|0.02|N|O|1997-10-16|1997-11-04|1997-10-30|NONE|REG AIR|yly final deposits haggle around the fur +26114|518|49|4|39|55321.89|0.00|0.05|N|O|1997-11-22|1997-11-23|1997-12-05|NONE|MAIL|ans x-ray. +26115|721|86|1|47|76220.84|0.07|0.07|N|O|1997-01-19|1996-12-27|1997-02-16|NONE|RAIL|ctions wake blithely. slyly regular +26115|1582|23|2|28|41540.24|0.01|0.06|N|O|1996-12-24|1997-01-19|1997-01-20|DELIVER IN PERSON|MAIL|t the quickly iron +26115|1941|86|3|19|35015.86|0.01|0.01|N|O|1997-01-23|1997-01-31|1997-02-15|TAKE BACK RETURN|REG AIR|he enticin +26115|265|93|4|39|45445.14|0.09|0.01|N|O|1996-12-18|1996-12-16|1997-01-12|NONE|RAIL|es. blithely pending dep +26115|151|30|5|18|18920.70|0.03|0.03|N|O|1996-11-30|1997-01-28|1996-12-30|COLLECT COD|AIR|owly silent asymptote +26115|1618|19|6|23|34951.03|0.08|0.08|N|O|1997-02-10|1997-01-11|1997-03-07|TAKE BACK RETURN|FOB|foxes. regular, silent instructions caj +26115|1312|13|7|37|44892.47|0.07|0.05|N|O|1996-12-20|1996-12-10|1997-01-16|DELIVER IN PERSON|SHIP|equests serve blithely deposi +26116|460|48|1|47|63941.62|0.05|0.05|R|F|1992-11-15|1993-01-17|1992-12-13|NONE|MAIL|ntil the carefu +26116|1361|38|2|31|39133.16|0.08|0.00|R|F|1993-01-28|1992-12-21|1993-02-05|NONE|MAIL| about the blithe +26116|153|32|3|34|35807.10|0.04|0.02|A|F|1993-02-03|1992-12-08|1993-03-02|NONE|FOB| packages boost f +26116|1323|100|4|5|6121.60|0.05|0.08|R|F|1992-12-23|1993-01-12|1993-01-14|TAKE BACK RETURN|MAIL|olphins wake fluffily al +26116|610|73|5|44|66466.84|0.04|0.02|A|F|1992-11-25|1992-12-29|1992-12-17|COLLECT COD|REG AIR|hs cajole carefully alongside +26116|1201|76|6|16|17635.20|0.06|0.01|A|F|1992-11-28|1992-12-12|1992-12-01|TAKE BACK RETURN|REG AIR|encies engage c +26117|1854|98|1|48|84280.80|0.08|0.04|N|O|1997-08-22|1997-08-05|1997-09-17|DELIVER IN PERSON|TRUCK|gly. silent, silent foxes are +26118|369|98|1|18|22848.48|0.06|0.02|N|O|1998-01-20|1998-01-26|1998-01-23|NONE|RAIL|uests. carefully ironic requests are fluff +26118|762|63|2|7|11639.32|0.00|0.02|N|O|1997-12-28|1998-01-16|1998-01-02|DELIVER IN PERSON|SHIP|xes wake furiously. foxes +26118|1446|64|3|49|66024.56|0.06|0.07|N|O|1997-12-23|1998-01-23|1997-12-31|DELIVER IN PERSON|REG AIR|otes are carefully. care +26119|1457|36|1|13|17659.85|0.03|0.04|R|F|1994-12-08|1995-02-01|1994-12-24|TAKE BACK RETURN|AIR|doubt furiously across +26144|1297|98|1|20|23965.80|0.10|0.04|N|O|1995-12-16|1996-01-03|1996-01-10|COLLECT COD|TRUCK|al, express instructions +26144|636|37|2|9|13829.67|0.04|0.06|N|O|1996-02-24|1996-01-17|1996-03-15|NONE|FOB|egular foxes wake +26144|1166|75|3|7|7470.12|0.02|0.00|N|O|1996-01-03|1995-12-22|1996-01-11|COLLECT COD|REG AIR|en requests. +26144|733|66|4|40|65349.20|0.01|0.03|N|O|1996-01-29|1995-11-27|1996-02-14|COLLECT COD|TRUCK|s. quickly express requests +26144|177|78|5|23|24774.91|0.09|0.06|N|O|1996-01-29|1995-12-06|1996-02-24|NONE|AIR|nal, even packages. qui +26144|1804|48|6|6|10234.80|0.10|0.04|N|O|1996-01-18|1995-12-18|1996-01-29|DELIVER IN PERSON|AIR|slyly final +26145|1295|33|1|34|40673.86|0.10|0.06|N|O|1995-09-25|1995-09-03|1995-10-08|DELIVER IN PERSON|REG AIR|ironic depths. ironic accounts d +26145|185|86|2|37|40151.66|0.04|0.02|N|O|1995-10-29|1995-08-14|1995-11-09|NONE|RAIL|r the furiously unu +26145|1239|40|3|18|20524.14|0.05|0.01|N|O|1995-09-05|1995-09-03|1995-09-07|COLLECT COD|FOB|inal theodo +26145|1176|13|4|22|23697.74|0.04|0.00|N|O|1995-08-18|1995-09-30|1995-08-26|COLLECT COD|RAIL|lites. escapades w +26146|1693|76|1|5|7973.45|0.00|0.06|R|F|1994-11-02|1994-11-20|1994-11-22|NONE|SHIP|nts wake ca +26146|945|46|2|47|86759.18|0.10|0.01|R|F|1995-01-18|1994-11-17|1995-02-04|NONE|REG AIR| wake. regular, regular p +26146|1749|34|3|40|66029.60|0.08|0.01|A|F|1994-11-09|1994-12-09|1994-11-20|NONE|RAIL| ironic courts hag +26146|387|16|4|37|47633.06|0.00|0.08|A|F|1994-12-07|1994-12-06|1994-12-18|TAKE BACK RETURN|FOB|iously blit +26146|51|52|5|21|19972.05|0.05|0.05|R|F|1994-12-11|1994-12-08|1995-01-09|COLLECT COD|RAIL|ole furiously quickly ironic courts. sly +26146|878|45|6|15|26683.05|0.07|0.05|A|F|1995-01-17|1994-12-25|1995-01-30|TAKE BACK RETURN|MAIL|ggle quickly even foxes +26147|789|22|1|23|38864.94|0.07|0.05|N|O|1995-07-27|1995-07-15|1995-08-19|TAKE BACK RETURN|MAIL|etly regular dependencies. slyly dari +26147|281|63|2|4|4725.12|0.02|0.01|A|F|1995-06-08|1995-06-02|1995-06-15|TAKE BACK RETURN|FOB| carefully regular packa +26147|1527|68|3|25|35713.00|0.04|0.00|N|O|1995-06-23|1995-06-03|1995-06-24|COLLECT COD|REG AIR|n ideas are fluffily. ironi +26147|1256|57|4|45|52076.25|0.05|0.06|N|O|1995-06-29|1995-06-30|1995-07-27|COLLECT COD|RAIL|egular deposits? regu +26147|1420|21|5|19|25106.98|0.00|0.06|N|O|1995-06-22|1995-05-26|1995-07-04|DELIVER IN PERSON|AIR|ke carefully +26148|113|40|1|28|28367.08|0.05|0.03|R|F|1994-07-05|1994-06-19|1994-07-22|TAKE BACK RETURN|REG AIR|eposits. caref +26148|852|86|2|47|82383.95|0.06|0.02|R|F|1994-06-17|1994-05-07|1994-07-05|TAKE BACK RETURN|SHIP|regular ideas h +26149|1540|21|1|17|24506.18|0.08|0.08|N|O|1996-09-20|1996-07-27|1996-10-16|COLLECT COD|MAIL|n, ironic packages cajole slyly ironi +26149|115|68|2|27|27407.97|0.06|0.01|N|O|1996-07-26|1996-08-03|1996-08-16|NONE|AIR|ar, regular accounts int +26149|946|47|3|22|40632.68|0.09|0.06|N|O|1996-08-04|1996-08-12|1996-09-03|DELIVER IN PERSON|MAIL|y furiously silent +26149|1267|42|4|36|42057.36|0.09|0.05|N|O|1996-06-28|1996-07-09|1996-07-20|DELIVER IN PERSON|RAIL|ost furiously +26150|165|92|1|46|48997.36|0.06|0.06|N|O|1998-07-03|1998-07-27|1998-07-22|NONE|AIR|nal platelets. regular, entic +26150|532|93|2|18|25785.54|0.07|0.00|N|O|1998-08-12|1998-08-03|1998-08-23|TAKE BACK RETURN|SHIP|s sleep unu +26150|499|29|3|19|26590.31|0.09|0.05|N|O|1998-06-28|1998-09-23|1998-07-23|DELIVER IN PERSON|MAIL|counts use blithely +26150|1462|63|4|8|10907.68|0.09|0.07|N|O|1998-07-15|1998-09-22|1998-08-11|TAKE BACK RETURN|REG AIR|ns cajole regular, regul +26150|1565|6|5|31|45463.36|0.05|0.00|N|O|1998-10-10|1998-07-27|1998-10-14|TAKE BACK RETURN|REG AIR|y carefully ironic packages. slyly regu +26151|25|51|1|1|925.02|0.09|0.04|A|F|1992-04-23|1992-03-31|1992-05-16|COLLECT COD|FOB|he unusual, regular deposits cajole caref +26151|1159|32|2|27|28624.05|0.02|0.08|R|F|1992-06-09|1992-04-13|1992-06-17|TAKE BACK RETURN|TRUCK|. furiously unusual requests can boost +26151|956|59|3|44|81705.80|0.09|0.04|R|F|1992-02-15|1992-04-13|1992-02-23|TAKE BACK RETURN|RAIL|ular packages. careful asympto +26151|1151|52|4|18|18938.70|0.07|0.03|R|F|1992-05-20|1992-04-26|1992-05-22|NONE|RAIL|es integrate permanently. doggedl +26151|1723|66|5|36|58489.92|0.01|0.00|A|F|1992-05-23|1992-04-04|1992-06-03|DELIVER IN PERSON|MAIL| are blithely +26176|568|29|1|11|16154.16|0.02|0.08|N|O|1996-01-01|1996-01-14|1996-01-17|COLLECT COD|FOB|furiously. sly +26176|665|66|2|26|40707.16|0.07|0.05|N|O|1996-02-28|1995-12-27|1996-03-26|NONE|REG AIR|y regular in +26176|1126|63|3|45|46220.40|0.06|0.00|N|O|1996-03-10|1996-02-04|1996-03-21|DELIVER IN PERSON|REG AIR|oost blithely. carefully bold t +26177|855|56|1|5|8779.25|0.00|0.03|N|O|1996-04-15|1996-02-17|1996-05-03|TAKE BACK RETURN|REG AIR|ing accounts. furiously unusual pla +26177|770|35|2|8|13366.16|0.07|0.01|N|O|1996-02-25|1996-03-20|1996-03-23|NONE|FOB|ing, ironic deposits sleep +26177|1714|57|3|50|80785.50|0.05|0.08|N|O|1996-03-13|1996-02-11|1996-03-29|DELIVER IN PERSON|REG AIR|ts impress blithely deposits. regular +26178|293|48|1|24|28638.96|0.01|0.04|N|O|1997-08-02|1997-09-22|1997-08-05|TAKE BACK RETURN|FOB|s. carefully unu +26178|304|89|2|32|38537.60|0.02|0.00|N|O|1997-08-13|1997-10-05|1997-08-17|NONE|TRUCK|wake carefully alongs +26179|386|43|1|23|29586.74|0.08|0.01|N|O|1997-06-10|1997-06-11|1997-07-06|NONE|REG AIR|l foxes nag qu +26179|745|10|2|37|60892.38|0.06|0.08|N|O|1997-06-07|1997-05-24|1997-06-22|NONE|RAIL| accounts. tithes cajole carefully around +26179|1221|22|3|50|56111.00|0.02|0.08|N|O|1997-06-01|1997-05-05|1997-06-26|NONE|TRUCK|tructions c +26179|521|12|4|50|71076.00|0.03|0.00|N|O|1997-05-14|1997-05-19|1997-05-25|TAKE BACK RETURN|TRUCK|ously special accounts. pendin +26179|782|15|5|3|5048.34|0.05|0.03|N|O|1997-04-18|1997-05-15|1997-04-19|DELIVER IN PERSON|REG AIR|romise qui +26179|1635|18|6|14|21512.82|0.04|0.06|N|O|1997-06-13|1997-06-23|1997-07-13|DELIVER IN PERSON|TRUCK|nal, regular somas cajole above t +26180|609|3|1|4|6038.40|0.08|0.03|A|F|1995-01-27|1995-01-30|1995-02-20|NONE|MAIL|egular pac +26180|157|84|2|38|40171.70|0.05|0.01|R|F|1995-02-14|1995-01-20|1995-03-15|COLLECT COD|AIR|mptotes. quickly regular +26180|1113|50|3|34|34479.74|0.09|0.01|R|F|1994-12-08|1995-02-08|1994-12-17|TAKE BACK RETURN|RAIL| slyly special pinto beans wake ag +26180|667|68|4|28|43894.48|0.05|0.04|A|F|1994-12-25|1995-01-07|1995-01-19|NONE|AIR|t among the furi +26180|1464|4|5|36|49156.56|0.05|0.06|A|F|1995-02-22|1995-02-25|1995-03-05|DELIVER IN PERSON|MAIL|fix furiously final depe +26180|39|15|6|9|8451.27|0.08|0.07|R|F|1995-03-18|1995-02-01|1995-03-26|NONE|RAIL|efully blithe depos +26181|596|57|1|6|8979.54|0.05|0.03|A|F|1994-06-17|1994-05-29|1994-06-29|DELIVER IN PERSON|FOB|xpress, furious foxes above the ironically +26181|845|45|2|14|24441.76|0.03|0.01|R|F|1994-05-24|1994-06-26|1994-06-15|NONE|FOB|fluffily. final, regular packages b +26182|527|28|1|5|7137.60|0.08|0.06|A|F|1993-03-30|1993-04-12|1993-04-27|COLLECT COD|TRUCK|into beans. furiously unu +26182|1389|28|2|49|63228.62|0.08|0.00|R|F|1993-04-13|1993-03-03|1993-05-12|NONE|MAIL|s sleep even, unusual multipli +26182|1883|84|3|49|87459.12|0.06|0.03|R|F|1993-02-22|1993-02-18|1993-02-23|DELIVER IN PERSON|MAIL|. special accounts cajole +26182|967|70|4|23|42963.08|0.03|0.06|R|F|1993-05-17|1993-04-07|1993-06-11|DELIVER IN PERSON|RAIL|deposits are against the +26183|526|57|1|32|45648.64|0.10|0.00|N|O|1996-03-11|1996-04-02|1996-03-17|DELIVER IN PERSON|AIR|wake even theodolites. +26208|867|1|1|10|17678.60|0.10|0.08|N|O|1996-04-19|1996-06-09|1996-05-14|COLLECT COD|MAIL|ic dependencies. thinly fluffy +26208|58|84|2|8|7664.40|0.10|0.02|N|O|1996-04-27|1996-06-16|1996-04-28|DELIVER IN PERSON|MAIL|the closely bold accounts. carefully +26208|990|59|3|5|9454.95|0.05|0.04|N|O|1996-03-22|1996-06-07|1996-04-13|NONE|RAIL| the blithely busy ac +26208|416|46|4|34|44757.94|0.08|0.04|N|O|1996-06-25|1996-05-07|1996-07-02|DELIVER IN PERSON|REG AIR|ular, silent accounts. even requests +26208|1926|59|5|11|20107.12|0.03|0.01|N|O|1996-03-30|1996-05-13|1996-04-15|COLLECT COD|TRUCK|ccounts are regul +26208|1660|43|6|41|64028.06|0.00|0.02|N|O|1996-04-05|1996-06-12|1996-04-28|DELIVER IN PERSON|REG AIR|he furiously regular excus +26209|943|12|1|18|33190.92|0.07|0.02|N|O|1997-07-06|1997-06-30|1997-07-28|NONE|AIR|the furiously special requests? pen +26209|526|57|2|39|55634.28|0.09|0.07|N|O|1997-05-20|1997-07-22|1997-05-29|DELIVER IN PERSON|SHIP|ickly. fluffi +26210|566|57|1|36|52796.16|0.04|0.08|A|F|1993-03-25|1993-03-30|1993-04-09|COLLECT COD|AIR| slyly along +26210|1023|94|2|8|7392.16|0.01|0.00|R|F|1993-04-25|1993-04-09|1993-05-02|DELIVER IN PERSON|FOB|ngly regular foxes boos +26210|1272|10|3|37|43410.99|0.02|0.06|A|F|1993-05-11|1993-05-07|1993-06-02|NONE|AIR|ross the furiously special pinto beans-- ir +26210|552|83|4|39|56649.45|0.03|0.01|A|F|1993-05-29|1993-04-15|1993-05-30|NONE|FOB|ly ironic platelets +26210|1503|4|5|28|39326.00|0.04|0.08|A|F|1993-05-13|1993-04-27|1993-05-19|COLLECT COD|SHIP|ts affix furiously a +26211|1119|56|1|30|30603.30|0.09|0.04|N|O|1996-05-06|1996-03-28|1996-06-01|NONE|FOB|theodolites. pending, unusual +26212|1521|42|1|19|27027.88|0.10|0.08|N|O|1996-05-10|1996-05-06|1996-06-07|TAKE BACK RETURN|SHIP|requests sle +26212|241|42|2|49|55920.76|0.00|0.03|N|O|1996-07-29|1996-05-21|1996-07-30|NONE|SHIP|odolites. regular foxes boost fluffily fi +26212|1407|47|3|6|7850.40|0.09|0.05|N|O|1996-04-18|1996-06-21|1996-04-26|DELIVER IN PERSON|FOB|ove the slyly pending a +26212|1827|14|4|43|74339.26|0.02|0.01|N|O|1996-04-25|1996-06-07|1996-05-16|COLLECT COD|FOB|yly. slyly +26212|1800|85|5|17|28930.60|0.01|0.04|N|O|1996-07-16|1996-05-14|1996-07-28|DELIVER IN PERSON|RAIL| the even requests hagg +26212|981|16|6|41|77161.18|0.07|0.01|N|O|1996-07-07|1996-06-23|1996-07-25|TAKE BACK RETURN|TRUCK|lyly express ins +26213|1717|60|1|42|67985.82|0.02|0.02|N|O|1997-04-09|1997-04-15|1997-04-12|NONE|SHIP|uickly pending accounts. ironic theo +26214|1549|50|1|18|26109.72|0.06|0.02|N|O|1996-01-05|1995-12-27|1996-01-22|COLLECT COD|AIR|ts! bold accounts among th +26214|1958|47|2|49|91137.55|0.07|0.03|N|O|1996-01-05|1995-12-22|1996-01-06|NONE|FOB|ross the theodolites. regular deposits ma +26214|480|39|3|18|24848.64|0.03|0.06|N|O|1996-03-05|1996-02-10|1996-03-06|NONE|SHIP|ross the furiously +26215|733|30|1|44|71884.12|0.02|0.02|N|O|1995-09-17|1995-08-14|1995-10-17|TAKE BACK RETURN|SHIP|arefully pending dep +26215|1457|75|2|40|54338.00|0.10|0.05|N|O|1995-09-08|1995-08-04|1995-09-13|DELIVER IN PERSON|AIR|uriously bold pinto beans +26215|1839|69|3|36|62669.88|0.04|0.03|N|O|1995-10-30|1995-10-02|1995-11-11|DELIVER IN PERSON|FOB|nusual requests. unusual realms cajole slyl +26215|35|11|4|19|17765.57|0.07|0.08|N|O|1995-08-04|1995-09-05|1995-08-24|COLLECT COD|SHIP|ise blithely along t +26215|137|38|5|10|10371.30|0.07|0.05|N|O|1995-09-06|1995-08-11|1995-09-25|DELIVER IN PERSON|AIR|d haggle blithely requests. q +26240|592|53|1|4|5970.36|0.02|0.06|R|F|1995-04-05|1995-01-30|1995-04-23|TAKE BACK RETURN|REG AIR|s kindle alongside of the carefully bold d +26240|1255|93|2|41|47406.25|0.09|0.00|A|F|1995-04-15|1995-02-11|1995-05-08|DELIVER IN PERSON|MAIL|the express, final instructi +26240|574|35|3|47|69304.79|0.09|0.01|R|F|1994-12-24|1995-03-13|1995-01-18|TAKE BACK RETURN|REG AIR|ests doubt against the bold accoun +26240|793|94|4|43|72832.97|0.02|0.06|R|F|1995-01-02|1995-01-31|1995-01-17|DELIVER IN PERSON|SHIP|ckages sleep always furiously bold deposits +26240|1483|84|5|47|65070.56|0.06|0.04|R|F|1995-04-03|1995-02-10|1995-04-26|DELIVER IN PERSON|TRUCK|en, unusual excuses sleep fluff +26240|1116|25|6|5|5085.55|0.01|0.06|R|F|1995-03-05|1995-02-08|1995-03-07|DELIVER IN PERSON|SHIP|arefully unusual tithes atop the blithely +26241|495|96|1|43|60006.07|0.07|0.00|N|O|1996-05-15|1996-04-04|1996-06-14|DELIVER IN PERSON|MAIL|ly blithely unusual deposits. ideas believe +26241|1093|64|2|25|24852.25|0.07|0.05|N|O|1996-04-09|1996-04-26|1996-05-09|TAKE BACK RETURN|AIR|he fluffily express deposits. unu +26241|444|3|3|42|56466.48|0.10|0.06|N|O|1996-02-15|1996-03-14|1996-03-14|TAKE BACK RETURN|TRUCK|ss the furiously even depths s +26241|259|41|4|48|55644.00|0.07|0.02|N|O|1996-02-16|1996-04-30|1996-02-27|NONE|SHIP|ong the regular excuses hagg +26241|1689|90|5|41|65217.88|0.10|0.01|N|O|1996-02-13|1996-03-25|1996-03-14|NONE|REG AIR|y. quickly regular courts a +26241|199|52|6|9|9892.71|0.05|0.08|N|O|1996-04-05|1996-04-17|1996-04-15|NONE|AIR|above the bli +26241|166|67|7|11|11727.76|0.02|0.06|N|O|1996-04-09|1996-03-22|1996-05-07|TAKE BACK RETURN|SHIP|y pending pinto beans. regular deposit +26242|1930|63|1|48|87932.64|0.00|0.04|N|O|1997-03-11|1997-02-05|1997-03-21|TAKE BACK RETURN|SHIP|ic dependencies about t +26242|1953|42|2|4|7419.80|0.05|0.08|N|O|1997-04-14|1997-02-04|1997-04-27|COLLECT COD|MAIL| requests. carefully express requests ar +26242|1741|84|3|39|64066.86|0.07|0.03|N|O|1997-04-10|1997-03-16|1997-04-11|COLLECT COD|MAIL|ndencies nag furiously. furiously f +26242|601|95|4|49|73578.40|0.01|0.06|N|O|1997-01-13|1997-03-20|1997-01-29|COLLECT COD|MAIL|ar requests use furiously slyly pending fox +26242|1322|99|5|32|39146.24|0.07|0.00|N|O|1997-01-13|1997-02-02|1997-01-19|COLLECT COD|RAIL|y regular multipliers det +26242|1975|64|6|9|16892.73|0.05|0.05|N|O|1997-02-08|1997-03-07|1997-02-26|NONE|FOB|ggle blithely quickly ironic accounts. s +26243|720|53|1|35|56725.20|0.07|0.03|N|O|1995-08-15|1995-09-22|1995-09-08|COLLECT COD|REG AIR|ests wake alongside of th +26243|393|94|2|22|28454.58|0.00|0.01|N|O|1995-09-18|1995-09-26|1995-10-09|NONE|RAIL|yly. ideas sleep flu +26243|62|63|3|27|25975.62|0.08|0.01|N|O|1995-09-18|1995-10-01|1995-09-30|NONE|TRUCK|es are bli +26243|1134|71|4|50|51756.50|0.10|0.00|N|O|1995-10-26|1995-09-17|1995-11-11|DELIVER IN PERSON|RAIL|ash upon the busily ironic acco +26244|1367|6|1|2|2536.72|0.10|0.08|A|F|1993-09-26|1993-09-18|1993-10-11|DELIVER IN PERSON|FOB|hely ironic requests sleep. at +26244|1203|78|2|44|48584.80|0.06|0.06|R|F|1993-10-30|1993-10-12|1993-11-16|TAKE BACK RETURN|MAIL|ual requests are +26244|1360|37|3|44|55499.84|0.04|0.01|A|F|1993-09-23|1993-10-13|1993-10-21|TAKE BACK RETURN|AIR|pinto beans nod deposits. slyly +26244|979|82|4|35|65798.95|0.03|0.01|A|F|1993-11-01|1993-10-16|1993-11-06|TAKE BACK RETURN|SHIP|c pinto beans +26245|117|70|1|27|27461.97|0.02|0.03|R|F|1995-02-18|1995-03-11|1995-03-16|TAKE BACK RETURN|AIR|ic instructions +26246|316|1|1|28|34056.68|0.05|0.01|N|O|1995-08-17|1995-07-14|1995-08-24|DELIVER IN PERSON|RAIL|theodolites boost +26246|1675|58|2|40|63066.80|0.05|0.00|N|O|1995-07-02|1995-06-30|1995-07-07|DELIVER IN PERSON|TRUCK|xpress deposits. slyly regular +26247|1164|73|1|11|11716.76|0.04|0.06|N|O|1998-03-02|1997-12-09|1998-03-15|NONE|TRUCK|press, silent requests use acc +26247|1851|52|2|21|36809.85|0.01|0.00|N|O|1998-01-12|1998-01-25|1998-02-10|COLLECT COD|TRUCK|blithely even p +26247|1006|42|3|5|4535.00|0.08|0.03|N|O|1998-02-21|1997-12-07|1998-03-09|NONE|TRUCK|lithely across the silent, bold deposits +26272|1958|59|1|11|20459.45|0.09|0.00|A|F|1992-07-31|1992-08-06|1992-08-30|DELIVER IN PERSON|SHIP|od carefully pending forges; carefully fi +26272|760|93|2|27|44840.52|0.06|0.01|A|F|1992-08-29|1992-09-20|1992-09-06|DELIVER IN PERSON|RAIL|s haggle slyly above the carefully ir +26272|1280|55|3|29|34257.12|0.06|0.07|R|F|1992-07-03|1992-08-07|1992-07-30|DELIVER IN PERSON|TRUCK|ly even deposits sl +26272|1195|32|4|20|21923.80|0.02|0.01|R|F|1992-08-13|1992-08-28|1992-09-07|COLLECT COD|TRUCK|ically express inst +26272|1363|64|5|44|55631.84|0.02|0.04|A|F|1992-10-11|1992-08-15|1992-10-23|DELIVER IN PERSON|TRUCK| to the regular packages. furio +26272|1484|2|6|1|1385.48|0.09|0.06|A|F|1992-09-11|1992-08-02|1992-09-12|COLLECT COD|REG AIR|. packages haggle regularly. furiously u +26273|1179|52|1|37|39966.29|0.00|0.06|N|O|1998-03-01|1998-03-05|1998-03-11|TAKE BACK RETURN|REG AIR|ly. boldly final foxes haggle! regular, +26273|474|33|2|45|61851.15|0.03|0.08|N|O|1998-01-14|1998-03-19|1998-01-24|NONE|MAIL|the furiously final fox +26273|1365|4|3|40|50654.40|0.04|0.00|N|O|1998-03-02|1998-03-01|1998-03-31|TAKE BACK RETURN|TRUCK|accounts around the unusual, pend +26273|53|4|4|36|34309.80|0.08|0.08|N|O|1998-03-28|1998-02-03|1998-04-17|TAKE BACK RETURN|AIR|. bold, express +26273|707|72|5|28|45015.60|0.01|0.07|N|O|1998-02-17|1998-03-05|1998-03-04|COLLECT COD|AIR|o beans haggle quietly never silent +26273|1842|43|6|16|27901.44|0.10|0.04|N|O|1998-01-06|1998-02-16|1998-01-19|DELIVER IN PERSON|MAIL|ly fluffily express theodolites. even, bo +26274|1990|79|1|26|49191.74|0.03|0.02|A|F|1992-09-13|1992-08-18|1992-09-21|TAKE BACK RETURN|REG AIR|thely pending excuses! qu +26274|1028|99|2|43|39947.86|0.05|0.06|A|F|1992-07-18|1992-08-01|1992-08-14|TAKE BACK RETURN|TRUCK|y regular deposits nag carefully bold +26274|400|29|3|39|50715.60|0.05|0.04|A|F|1992-08-19|1992-07-22|1992-09-17|COLLECT COD|RAIL|lyly regular packages. expres +26274|1866|96|4|47|83089.42|0.09|0.00|R|F|1992-07-23|1992-09-02|1992-08-08|DELIVER IN PERSON|REG AIR|its nag carefully even platelet +26274|1227|39|5|22|24820.84|0.04|0.02|A|F|1992-08-15|1992-08-15|1992-09-03|DELIVER IN PERSON|TRUCK|carefully pending asymptotes boost car +26274|1034|40|6|5|4675.15|0.09|0.07|A|F|1992-07-29|1992-08-18|1992-08-16|TAKE BACK RETURN|FOB|e unusual excuse +26275|360|89|1|1|1260.36|0.04|0.04|A|F|1994-02-22|1994-01-21|1994-03-24|COLLECT COD|AIR|nd around +26276|1825|55|1|47|81160.54|0.10|0.01|A|F|1994-01-10|1993-12-07|1994-02-05|COLLECT COD|SHIP|unusual packages haggle regularly furio +26276|277|32|2|16|18836.32|0.05|0.03|A|F|1993-11-05|1993-10-30|1993-11-09|COLLECT COD|SHIP|. sometimes f +26276|362|63|3|17|21460.12|0.06|0.08|R|F|1993-12-27|1993-11-07|1994-01-24|TAKE BACK RETURN|FOB|ntain blithely ex +26277|557|18|1|16|23320.80|0.05|0.00|N|O|1995-09-02|1995-09-17|1995-09-13|DELIVER IN PERSON|FOB| the quickly bold r +26277|1584|5|2|48|71307.84|0.07|0.02|N|O|1995-08-04|1995-07-31|1995-08-17|DELIVER IN PERSON|TRUCK|ly above the express instructions. furiousl +26278|697|98|1|39|62309.91|0.07|0.04|R|F|1994-06-01|1994-05-19|1994-07-01|TAKE BACK RETURN|TRUCK|fully above the carefu +26278|587|88|2|34|50577.72|0.06|0.03|A|F|1994-04-20|1994-05-27|1994-05-07|COLLECT COD|RAIL|eodolites use blithel +26279|1690|73|1|44|70034.36|0.05|0.02|A|F|1994-09-03|1994-10-13|1994-09-15|DELIVER IN PERSON|RAIL|p deposits. furiously regular foxes aft +26279|1115|24|2|44|44708.84|0.08|0.07|R|F|1994-10-11|1994-10-09|1994-10-20|COLLECT COD|AIR|s wake bol +26279|474|4|3|24|32987.28|0.04|0.01|A|F|1994-08-30|1994-10-15|1994-09-03|DELIVER IN PERSON|AIR|ar deposits sleep furiousl +26279|971|74|4|30|56159.10|0.07|0.07|R|F|1994-08-29|1994-10-10|1994-09-15|TAKE BACK RETURN|FOB|mptotes cajole above the requ +26279|1487|66|5|28|38877.44|0.05|0.01|A|F|1994-11-15|1994-09-21|1994-12-15|DELIVER IN PERSON|FOB|ely final deposits. pinto beans +26279|23|99|6|43|39689.86|0.04|0.00|R|F|1994-08-06|1994-09-24|1994-09-04|COLLECT COD|TRUCK|e blithely +26304|1971|16|1|36|67426.92|0.03|0.06|N|O|1995-07-16|1995-04-27|1995-07-31|TAKE BACK RETURN|SHIP| after the blithely even pi +26304|1281|93|2|15|17734.20|0.06|0.06|R|F|1995-04-25|1995-06-08|1995-05-12|TAKE BACK RETURN|SHIP|symptotes-- final, ironic accounts are aga +26304|1229|41|3|49|55380.78|0.02|0.00|A|F|1995-03-27|1995-05-08|1995-04-24|COLLECT COD|SHIP|into beans must cajole into th +26304|1710|53|4|50|80585.50|0.06|0.08|A|F|1995-03-25|1995-04-19|1995-04-02|NONE|TRUCK|xpress realms mold carefully even reque +26304|1380|81|5|37|47411.06|0.02|0.08|A|F|1995-04-14|1995-05-29|1995-04-19|NONE|REG AIR|olites. careful +26304|1355|32|6|40|50254.00|0.09|0.07|N|O|1995-06-24|1995-06-15|1995-07-23|NONE|SHIP|usly bold accounts. even, even p +26305|543|74|1|47|67846.38|0.03|0.02|A|F|1994-02-24|1994-02-06|1994-03-11|TAKE BACK RETURN|REG AIR|the slyly re +26305|250|78|2|4|4601.00|0.06|0.03|R|F|1994-01-17|1994-01-17|1994-01-18|COLLECT COD|REG AIR|yly special accounts haggle slyly finally +26305|353|10|3|7|8773.45|0.01|0.04|A|F|1994-03-12|1994-02-07|1994-04-06|DELIVER IN PERSON|FOB|nding reques +26305|744|9|4|6|9868.44|0.02|0.05|A|F|1993-12-17|1994-02-07|1994-01-16|NONE|MAIL|efully express foxes wake slyly among +26305|1688|30|5|24|38152.32|0.04|0.00|R|F|1994-03-30|1994-02-09|1994-04-28|NONE|SHIP|gular packages. dugouts e +26305|1454|72|6|31|42018.95|0.04|0.03|R|F|1994-02-15|1994-01-19|1994-03-14|COLLECT COD|SHIP|ns. idly unusual excuses det +26305|400|85|7|4|5201.60|0.06|0.04|A|F|1993-12-07|1994-02-08|1993-12-12|DELIVER IN PERSON|AIR|the silent packages cajo +26306|1824|11|1|45|77661.90|0.06|0.06|R|F|1993-02-22|1993-01-18|1993-03-21|DELIVER IN PERSON|TRUCK|cally ironic packages affix always +26306|334|19|2|31|38264.23|0.03|0.01|R|F|1993-02-19|1992-12-17|1993-03-17|NONE|RAIL|en asymptotes. slyly express platelet +26306|1161|34|3|45|47797.20|0.06|0.03|A|F|1993-02-14|1993-01-04|1993-03-15|NONE|REG AIR|atelets nag +26306|1403|43|4|34|44349.60|0.02|0.06|R|F|1993-02-28|1993-01-02|1993-03-18|COLLECT COD|MAIL|tructions. deposits about the blithe +26306|716|17|5|22|35567.62|0.05|0.03|R|F|1993-02-27|1992-12-09|1993-03-18|TAKE BACK RETURN|SHIP|lyly accounts. reg +26307|1632|56|1|36|55210.68|0.03|0.06|N|O|1996-08-07|1996-08-09|1996-08-11|DELIVER IN PERSON|AIR|kly even excuses! furiously f +26307|513|74|2|25|35337.75|0.10|0.08|N|O|1996-10-06|1996-07-17|1996-10-15|NONE|TRUCK|le; ironic theodolites ca +26307|1791|34|3|26|44012.54|0.03|0.00|N|O|1996-08-16|1996-08-28|1996-09-01|DELIVER IN PERSON|REG AIR|furiously ironic requests bo +26307|122|1|4|40|40884.80|0.00|0.08|N|O|1996-08-13|1996-08-09|1996-09-09|TAKE BACK RETURN|TRUCK| the slyly final dinos. sl +26307|1288|89|5|14|16649.92|0.00|0.01|N|O|1996-10-06|1996-08-01|1996-10-10|COLLECT COD|TRUCK|ges! blithely special packag +26308|1791|92|1|50|84639.50|0.06|0.00|N|O|1996-01-01|1996-02-24|1996-01-27|DELIVER IN PERSON|REG AIR|oss the bold instructions are quic +26308|1615|39|2|38|57631.18|0.04|0.02|N|O|1995-12-05|1996-01-06|1996-01-02|NONE|TRUCK| furiously ironi +26309|77|53|1|26|25403.82|0.09|0.08|A|F|1992-02-25|1992-05-07|1992-03-04|COLLECT COD|MAIL| the express requests. fluffily silen +26309|1792|35|2|43|72832.97|0.06|0.05|A|F|1992-04-07|1992-05-01|1992-04-24|TAKE BACK RETURN|RAIL|c instructions caj +26309|806|40|3|46|78512.80|0.05|0.07|R|F|1992-06-03|1992-04-19|1992-06-24|NONE|TRUCK|unts. slyly final accou +26309|1747|74|4|13|21433.62|0.03|0.08|R|F|1992-03-20|1992-04-23|1992-04-13|TAKE BACK RETURN|MAIL|eas sleep busily +26309|248|49|5|21|24113.04|0.02|0.08|R|F|1992-04-26|1992-05-15|1992-05-07|TAKE BACK RETURN|RAIL|sheaves maintain slyly +26309|1867|97|6|12|21226.32|0.01|0.07|R|F|1992-02-23|1992-04-24|1992-02-26|TAKE BACK RETURN|MAIL|deposits ca +26309|786|51|7|14|23614.92|0.02|0.05|A|F|1992-02-29|1992-03-29|1992-03-18|NONE|SHIP|ously after the slyly pendi +26310|261|89|1|2|2322.52|0.00|0.00|A|F|1992-09-25|1992-10-12|1992-10-19|TAKE BACK RETURN|SHIP|te blithely. pendin +26310|106|33|2|30|30183.00|0.05|0.03|R|F|1992-09-02|1992-10-10|1992-09-09|NONE|FOB|o the care +26310|161|88|3|7|7428.12|0.08|0.01|R|F|1992-11-12|1992-10-28|1992-11-13|DELIVER IN PERSON|RAIL|ing to the slyly express packages. iron +26310|944|79|4|46|84867.24|0.03|0.05|A|F|1992-10-31|1992-09-10|1992-11-05|DELIVER IN PERSON|TRUCK|ealms. fluffily pending orbits +26310|329|14|5|4|4917.28|0.05|0.07|A|F|1992-11-22|1992-09-24|1992-11-25|COLLECT COD|TRUCK|uctions x-ray silent, regu +26311|1944|45|1|24|44302.56|0.08|0.05|N|O|1996-01-01|1995-12-17|1996-01-18|COLLECT COD|RAIL| slowly against the deposi +26311|411|12|2|42|55079.22|0.06|0.08|N|O|1996-01-29|1996-01-22|1996-02-01|DELIVER IN PERSON|RAIL| even foxes aft +26311|91|42|3|24|23786.16|0.07|0.00|N|O|1995-12-22|1996-01-07|1996-01-14|NONE|RAIL| furiously pe +26311|335|64|4|36|44471.88|0.07|0.02|N|O|1995-11-24|1996-01-26|1995-12-06|TAKE BACK RETURN|MAIL| carefully express theodolites los +26336|838|72|1|5|8694.15|0.01|0.01|A|F|1992-07-12|1992-07-16|1992-07-19|DELIVER IN PERSON|RAIL|slyly unusual deposits alongside of the +26336|377|34|2|27|34488.99|0.09|0.06|R|F|1992-06-22|1992-08-09|1992-07-07|DELIVER IN PERSON|SHIP|eep slyly across the final, even reque +26336|674|68|3|24|37792.08|0.09|0.04|A|F|1992-09-17|1992-08-01|1992-10-02|NONE|FOB| ironic excuses above +26336|32|83|4|38|35417.14|0.03|0.01|A|F|1992-06-01|1992-07-11|1992-06-19|COLLECT COD|MAIL|theodolites ha +26337|1372|73|1|49|62395.13|0.05|0.01|R|F|1994-11-22|1995-01-08|1994-12-13|DELIVER IN PERSON|FOB|ys? pending theodo +26337|866|66|2|25|44171.50|0.04|0.05|A|F|1995-03-05|1994-12-31|1995-03-14|TAKE BACK RETURN|MAIL|escapades sleep f +26338|1883|84|1|12|21418.56|0.03|0.00|A|F|1992-06-01|1992-05-27|1992-06-29|NONE|RAIL| fluffily carefully pending excu +26338|1167|68|2|46|49135.36|0.03|0.06|R|F|1992-06-17|1992-05-12|1992-06-19|NONE|REG AIR|y. carefully regular packages sle +26338|1588|69|3|15|22343.70|0.05|0.04|A|F|1992-04-19|1992-05-11|1992-04-21|COLLECT COD|TRUCK|maintain. ca +26338|1866|53|4|37|65410.82|0.06|0.05|R|F|1992-05-09|1992-06-16|1992-05-23|DELIVER IN PERSON|RAIL|latelets integrate carefully against the qu +26339|1618|1|1|2|3039.22|0.04|0.07|R|F|1992-12-06|1992-11-03|1992-12-12|DELIVER IN PERSON|FOB|leep. carefully special packages s +26339|227|9|2|20|22544.40|0.00|0.04|A|F|1992-12-06|1992-10-24|1992-12-28|NONE|AIR|ess instructions +26339|150|51|3|20|21003.00|0.07|0.03|R|F|1992-10-18|1992-10-12|1992-11-15|DELIVER IN PERSON|TRUCK|slyly among the regul +26339|403|91|4|44|57349.60|0.10|0.04|A|F|1992-10-18|1992-09-28|1992-10-30|NONE|RAIL|carefully express dependen +26340|809|10|1|4|6839.20|0.01|0.06|N|O|1997-12-12|1997-11-27|1997-12-26|NONE|RAIL|ngside of the reque +26340|403|33|2|21|27371.40|0.00|0.05|N|O|1997-10-06|1997-11-16|1997-11-02|DELIVER IN PERSON|TRUCK|s sleep quickly. dep +26340|1241|16|3|38|43405.12|0.05|0.02|N|O|1997-11-24|1997-11-01|1997-12-06|COLLECT COD|TRUCK|ideas among the final, +26340|175|76|4|41|44081.97|0.07|0.01|N|O|1997-10-17|1997-11-13|1997-11-15|DELIVER IN PERSON|REG AIR|inst the final sauternes. carefully speci +26341|1337|14|1|22|27243.26|0.03|0.00|A|F|1993-09-18|1993-10-04|1993-10-11|NONE|TRUCK|uffily final packages; carefully eve +26341|793|90|2|43|72832.97|0.06|0.02|R|F|1993-08-25|1993-10-16|1993-09-08|DELIVER IN PERSON|SHIP| the furiously f +26341|1203|4|3|7|7729.40|0.02|0.08|A|F|1993-08-06|1993-09-07|1993-09-01|DELIVER IN PERSON|TRUCK|posits nag against the silen +26342|1950|39|1|23|42594.85|0.04|0.00|A|F|1994-12-18|1994-11-25|1995-01-01|TAKE BACK RETURN|AIR|uickly special account +26342|746|43|2|11|18114.14|0.03|0.02|R|F|1995-01-17|1994-12-17|1995-01-19|DELIVER IN PERSON|SHIP|uickly around the b +26342|484|43|3|47|65070.56|0.05|0.08|A|F|1994-12-06|1995-01-13|1995-01-01|COLLECT COD|TRUCK|y even foxes. ac +26342|1335|12|4|47|58107.51|0.04|0.06|R|F|1994-11-01|1994-11-24|1994-11-13|DELIVER IN PERSON|FOB|the busily pending depths. ironic, pe +26342|1378|55|5|9|11514.33|0.00|0.07|A|F|1994-10-25|1994-12-16|1994-11-15|NONE|FOB|posits. carefully regular de +26343|32|83|1|19|17708.57|0.10|0.06|N|O|1998-05-22|1998-05-21|1998-06-14|NONE|TRUCK|or the reg +26343|397|26|2|22|28542.58|0.02|0.02|N|O|1998-05-04|1998-05-01|1998-05-17|TAKE BACK RETURN|REG AIR|ithely blithely even pinto beans. expre +26343|1329|68|3|17|20915.44|0.07|0.05|N|O|1998-07-23|1998-05-08|1998-07-26|COLLECT COD|AIR| special deposits de +26368|1849|50|1|28|49023.52|0.07|0.00|A|F|1993-11-02|1993-09-27|1993-11-07|DELIVER IN PERSON|AIR|al packages was along the reg +26368|1060|96|2|43|41325.58|0.09|0.00|A|F|1993-09-09|1993-09-09|1993-09-21|TAKE BACK RETURN|MAIL|ously final theodolite +26368|1773|100|3|9|15072.93|0.04|0.07|R|F|1993-10-31|1993-08-29|1993-11-07|COLLECT COD|SHIP| bold package +26369|404|63|1|20|26088.00|0.06|0.07|R|F|1992-12-15|1993-02-20|1993-01-14|NONE|REG AIR|ounts wake quietly express deposits? slyly +26370|485|73|1|34|47106.32|0.05|0.08|N|O|1995-08-18|1995-09-09|1995-08-28|NONE|AIR|tipliers detect fu +26370|185|38|2|19|20618.42|0.08|0.06|N|O|1995-11-19|1995-11-02|1995-12-07|TAKE BACK RETURN|SHIP|g to the regular ideas. even accounts beli +26370|604|67|3|20|30092.00|0.06|0.03|N|O|1995-11-19|1995-09-15|1995-12-10|DELIVER IN PERSON|MAIL|ke carefully regular theodolites; ideas +26370|666|67|4|28|43866.48|0.03|0.08|N|O|1995-09-28|1995-09-28|1995-10-25|TAKE BACK RETURN|AIR|the furiously final platelets-- fluffily +26370|1869|99|5|16|28333.76|0.02|0.07|N|O|1995-11-16|1995-10-11|1995-11-27|DELIVER IN PERSON|FOB|leep carefu +26371|1235|10|1|44|49994.12|0.10|0.05|N|O|1998-11-19|1998-09-01|1998-11-20|DELIVER IN PERSON|REG AIR|s. carefully even foxes cajole +26371|17|68|2|27|24759.27|0.06|0.08|N|O|1998-07-31|1998-08-23|1998-08-18|TAKE BACK RETURN|FOB|unusual forges. ideas c +26371|98|49|3|26|25950.34|0.02|0.07|N|O|1998-08-21|1998-09-22|1998-09-13|TAKE BACK RETURN|REG AIR|g requests after the ironic, +26371|1254|29|4|32|36968.00|0.06|0.00|N|O|1998-09-18|1998-10-07|1998-10-18|COLLECT COD|TRUCK|instructions b +26371|1839|26|5|27|47002.41|0.09|0.08|N|O|1998-09-13|1998-09-30|1998-09-21|TAKE BACK RETURN|AIR|e theodolit +26371|647|41|6|35|54167.40|0.00|0.03|N|O|1998-10-12|1998-08-24|1998-11-08|TAKE BACK RETURN|TRUCK|ckly final requests. blithely +26372|149|28|1|15|15737.10|0.08|0.08|R|F|1994-10-03|1994-09-03|1994-10-23|COLLECT COD|RAIL|its are furiously packages. fluffily +26372|1950|39|2|2|3703.90|0.09|0.02|A|F|1994-08-07|1994-08-25|1994-08-24|COLLECT COD|MAIL|ests boost ideas. deposits detect flu +26372|587|88|3|17|25288.86|0.06|0.01|R|F|1994-08-31|1994-08-21|1994-09-30|COLLECT COD|FOB|re furiously final deposi +26372|1656|98|4|49|76324.85|0.04|0.04|R|F|1994-11-04|1994-10-08|1994-12-01|TAKE BACK RETURN|RAIL|w furiously. regular packages boost careful +26372|343|28|5|27|33570.18|0.01|0.01|R|F|1994-11-01|1994-09-09|1994-11-04|COLLECT COD|FOB|ts cajole furiously dogged packages. slyl +26372|1202|40|6|7|7722.40|0.05|0.00|R|F|1994-07-27|1994-09-24|1994-08-10|DELIVER IN PERSON|TRUCK|quickly even +26373|1117|54|1|21|21380.31|0.06|0.05|A|F|1993-09-23|1993-09-11|1993-09-27|NONE|TRUCK|. slyly even dependenc +26373|490|91|2|4|5561.96|0.07|0.07|A|F|1993-11-03|1993-08-23|1993-11-27|TAKE BACK RETURN|AIR|lar accounts cajole. final foxes are qui +26373|719|16|3|49|79365.79|0.06|0.05|R|F|1993-09-29|1993-08-28|1993-10-06|TAKE BACK RETURN|MAIL|pinto beans c +26373|1619|43|4|18|27370.98|0.00|0.08|R|F|1993-10-06|1993-10-20|1993-10-19|TAKE BACK RETURN|TRUCK|, ironic accounts. pending i +26374|1900|30|1|5|9009.50|0.02|0.03|R|F|1995-02-03|1994-12-17|1995-02-07|NONE|FOB|ent requests haggle blithely quick +26374|769|66|2|22|36734.72|0.08|0.07|R|F|1995-03-04|1995-01-17|1995-03-31|COLLECT COD|AIR|l platelets. pending accounts are furious +26374|1840|41|3|31|53997.04|0.01|0.06|R|F|1995-02-26|1995-01-07|1995-03-01|COLLECT COD|AIR|its. slyly final accounts haggle agains +26374|618|19|4|12|18223.32|0.06|0.04|R|F|1994-11-25|1994-12-23|1994-12-19|NONE|RAIL|quests cajol +26374|1566|47|5|36|52832.16|0.02|0.08|R|F|1995-02-02|1995-01-21|1995-02-19|DELIVER IN PERSON|MAIL|nic requests might w +26374|1254|92|6|43|49675.75|0.09|0.07|R|F|1994-11-23|1995-01-03|1994-12-09|DELIVER IN PERSON|RAIL|n deposits detect sometimes. packag +26375|1645|69|1|26|40212.64|0.08|0.07|N|O|1996-05-28|1996-07-03|1996-06-19|NONE|SHIP|phins. carefully even d +26375|1451|91|2|41|55450.45|0.05|0.05|N|O|1996-07-31|1996-07-08|1996-08-24|NONE|AIR|: ironic instructions am +26375|64|15|3|40|38562.40|0.04|0.08|N|O|1996-08-29|1996-08-05|1996-09-21|COLLECT COD|MAIL|lar, regular decoys. carefully +26375|39|90|4|15|14085.45|0.07|0.03|N|O|1996-08-17|1996-06-23|1996-08-26|NONE|MAIL|eodolites sleep furiously. ca +26400|1040|76|1|9|8469.36|0.00|0.07|N|O|1998-07-23|1998-06-25|1998-07-31|TAKE BACK RETURN|AIR|nic accounts. shea +26400|506|37|2|50|70325.00|0.07|0.02|N|O|1998-05-30|1998-07-01|1998-06-23|DELIVER IN PERSON|AIR| theodolites. packages integrate fur +26400|1016|52|3|1|917.01|0.10|0.05|N|O|1998-05-08|1998-06-23|1998-05-09|TAKE BACK RETURN|FOB|g courts. slyly even instructions after t +26400|421|9|4|12|15857.04|0.08|0.01|N|O|1998-04-14|1998-05-10|1998-04-26|DELIVER IN PERSON|RAIL|e furiously. furiously final ideas cajo +26400|303|88|5|3|3609.90|0.00|0.08|N|O|1998-05-23|1998-06-26|1998-06-11|COLLECT COD|SHIP| integrate carefully deposit +26400|35|61|6|37|34596.11|0.05|0.06|N|O|1998-05-28|1998-06-06|1998-06-23|NONE|FOB|aring asymptotes sleep quickl +26400|863|63|7|29|51151.94|0.05|0.07|N|O|1998-07-17|1998-06-30|1998-07-24|NONE|REG AIR|y by the r +26401|186|65|1|2|2172.36|0.10|0.05|A|F|1993-12-05|1993-11-19|1993-12-22|TAKE BACK RETURN|MAIL|counts cajole ca +26401|1231|43|2|4|4528.92|0.07|0.07|R|F|1993-11-03|1993-11-30|1993-12-01|DELIVER IN PERSON|TRUCK|wake even requests. unusual s +26401|1119|20|3|1|1020.11|0.06|0.08|A|F|1993-12-20|1993-12-13|1993-12-23|DELIVER IN PERSON|RAIL|riously. carefully even pinto beans sl +26401|718|15|4|12|19424.52|0.01|0.06|R|F|1994-02-07|1993-12-15|1994-02-26|NONE|TRUCK|erns. blithely final deposits integrate unu +26401|886|53|5|42|75048.96|0.01|0.00|R|F|1994-02-07|1993-12-31|1994-03-09|COLLECT COD|SHIP|. furiously ironic pac +26402|840|41|1|49|85301.16|0.10|0.01|A|F|1995-01-20|1994-12-21|1995-01-28|TAKE BACK RETURN|MAIL| sleep furious +26402|1301|2|2|33|39675.90|0.09|0.05|R|F|1994-10-20|1994-12-11|1994-10-26|TAKE BACK RETURN|RAIL|luffily unusua +26402|1708|51|3|41|65997.70|0.10|0.00|R|F|1995-01-08|1994-12-14|1995-01-13|NONE|REG AIR|ular platelets caj +26403|1955|88|1|4|7427.80|0.01|0.01|N|O|1998-03-08|1998-02-11|1998-04-01|NONE|AIR| ironic packages wake +26403|1704|31|2|22|35325.40|0.02|0.05|N|O|1998-03-29|1998-03-11|1998-04-14|DELIVER IN PERSON|RAIL| slyly among the fluffily pending accounts +26404|102|3|1|36|36075.60|0.06|0.07|N|O|1997-04-23|1997-03-24|1997-04-27|NONE|RAIL|cajole above the regul +26404|1809|96|2|29|49613.20|0.07|0.07|N|O|1997-01-07|1997-02-22|1997-01-20|NONE|FOB|oxes. final, special excuses haggle carefu +26404|1263|1|3|27|31435.02|0.01|0.00|N|O|1997-04-29|1997-02-12|1997-05-10|DELIVER IN PERSON|SHIP|kages are carefully unusual dinos. busily +26404|138|17|4|50|51906.50|0.07|0.08|N|O|1997-01-27|1997-02-23|1997-02-23|TAKE BACK RETURN|FOB|press theodolites wa +26404|264|65|5|25|29106.50|0.07|0.06|N|O|1997-02-27|1997-03-01|1997-03-12|TAKE BACK RETURN|RAIL|lets nag about the carefully ironic dep +26404|1860|4|6|31|54617.66|0.08|0.08|N|O|1997-01-24|1997-03-20|1997-02-12|TAKE BACK RETURN|FOB|ackages nag. ca +26404|1452|53|7|9|12181.05|0.10|0.03|N|O|1997-01-10|1997-03-18|1997-02-02|DELIVER IN PERSON|AIR|nal accounts beli +26405|1897|98|1|36|64760.04|0.03|0.07|A|F|1993-08-19|1993-09-02|1993-09-02|COLLECT COD|SHIP|permanent gifts are idly carefull +26405|436|37|2|35|46775.05|0.08|0.02|R|F|1993-09-19|1993-07-23|1993-10-02|TAKE BACK RETURN|TRUCK|carefully regular packages +26405|800|1|3|1|1700.80|0.01|0.00|R|F|1993-07-06|1993-08-16|1993-07-21|COLLECT COD|SHIP|- packages sleep quickly. even fo +26405|1528|29|4|22|31449.44|0.02|0.07|R|F|1993-08-08|1993-09-04|1993-08-13|NONE|AIR|s. furiously regular co +26406|364|65|1|6|7586.16|0.01|0.05|N|O|1995-07-14|1995-05-27|1995-07-24|TAKE BACK RETURN|AIR|e regular, pending requests. ironic, +26406|366|95|2|48|60785.28|0.03|0.08|N|O|1995-08-11|1995-06-06|1995-08-16|DELIVER IN PERSON|RAIL|lar packages are according to the express +26406|367|68|3|46|58298.56|0.09|0.05|N|O|1995-07-24|1995-06-11|1995-08-23|DELIVER IN PERSON|REG AIR|dencies. r +26406|668|69|4|5|7843.30|0.02|0.02|N|F|1995-06-03|1995-06-25|1995-06-18|TAKE BACK RETURN|SHIP|ccounts arou +26407|735|36|1|50|81786.50|0.08|0.01|R|F|1992-10-05|1992-08-23|1992-10-25|DELIVER IN PERSON|REG AIR| the bold, pending ideas sleep pending, +26407|1994|39|2|48|91007.52|0.01|0.02|R|F|1992-06-22|1992-08-29|1992-06-23|COLLECT COD|AIR|affix furiously between +26407|1179|52|3|37|39966.29|0.05|0.05|A|F|1992-08-30|1992-09-15|1992-09-08|TAKE BACK RETURN|SHIP|ns! furiously regular +26407|115|94|4|39|39589.29|0.00|0.03|R|F|1992-08-28|1992-08-17|1992-09-21|NONE|RAIL|sleep furiously ironic pinto beans +26407|180|7|5|5|5400.90|0.08|0.05|R|F|1992-07-19|1992-08-28|1992-07-30|NONE|REG AIR| sleep furiously. quic +26407|1629|30|6|14|21428.68|0.03|0.05|R|F|1992-07-30|1992-09-08|1992-08-15|TAKE BACK RETURN|RAIL|structions sleep carefully a +26432|817|17|1|25|42945.25|0.05|0.02|A|F|1995-02-09|1995-03-09|1995-02-18|DELIVER IN PERSON|MAIL|lar theodol +26432|1073|79|2|30|29222.10|0.05|0.01|A|F|1995-04-04|1995-03-15|1995-04-20|NONE|MAIL|egular requests solve. slyly fina +26432|349|78|3|2|2498.68|0.04|0.05|R|F|1995-01-01|1995-02-19|1995-01-30|COLLECT COD|REG AIR|its above the carefully final foxes d +26432|991|92|4|31|58651.69|0.00|0.08|R|F|1995-02-02|1995-02-10|1995-02-22|NONE|AIR|ges. blithely final packages after the r +26432|1969|58|5|4|7483.84|0.03|0.08|A|F|1995-04-20|1995-03-08|1995-05-07|COLLECT COD|FOB|sts above the regular instructions wa +26433|678|41|1|25|39466.75|0.04|0.05|N|O|1996-09-12|1996-07-19|1996-09-20|DELIVER IN PERSON|REG AIR|press ideas. express +26433|626|89|2|9|13739.58|0.01|0.02|N|O|1996-07-14|1996-08-28|1996-07-16|COLLECT COD|REG AIR|ular pinto beans sublate +26433|258|13|3|13|15057.25|0.09|0.07|N|O|1996-08-15|1996-07-23|1996-09-01|TAKE BACK RETURN|TRUCK|lar attainment +26433|78|29|4|29|28364.03|0.06|0.05|N|O|1996-06-19|1996-07-28|1996-06-21|COLLECT COD|RAIL|ckages x-ray accounts. stealthily unusual p +26433|876|76|5|14|24876.18|0.03|0.00|N|O|1996-07-30|1996-07-09|1996-08-25|TAKE BACK RETURN|TRUCK|r the carefully final requests. furiousl +26433|1033|39|6|17|15878.51|0.04|0.00|N|O|1996-08-30|1996-07-15|1996-09-06|COLLECT COD|SHIP|efully. slyl +26434|1914|59|1|6|10895.46|0.04|0.02|N|O|1996-02-02|1996-01-05|1996-02-23|DELIVER IN PERSON|TRUCK|accounts are after the +26434|1676|77|2|42|66262.14|0.08|0.07|N|O|1996-02-03|1996-01-14|1996-02-12|NONE|SHIP|onic deposits +26434|1245|83|3|17|19486.08|0.09|0.00|N|O|1996-01-25|1996-01-04|1996-02-23|TAKE BACK RETURN|RAIL|kages. quickly +26434|530|31|4|25|35763.25|0.07|0.03|N|O|1996-01-19|1996-02-22|1996-02-04|COLLECT COD|SHIP|ccording to the furiously ex +26435|604|5|1|27|40624.20|0.10|0.02|A|F|1994-10-30|1994-12-30|1994-11-22|COLLECT COD|RAIL|equests use quietly. final, eve +26436|709|10|1|34|54729.80|0.05|0.06|R|F|1994-06-17|1994-07-24|1994-06-30|TAKE BACK RETURN|AIR|ular deposits ar +26436|758|59|2|32|53080.00|0.05|0.01|A|F|1994-06-24|1994-06-14|1994-07-05|COLLECT COD|TRUCK|nal, unusual deposits doze furiousl +26436|250|5|3|20|23005.00|0.03|0.03|R|F|1994-06-23|1994-07-25|1994-07-02|NONE|RAIL|ongside of the regular accounts. depo +26436|1450|51|4|46|62166.70|0.03|0.05|A|F|1994-08-29|1994-07-08|1994-08-30|COLLECT COD|REG AIR|the ironic pearls. +26436|1530|71|5|13|18609.89|0.09|0.01|R|F|1994-05-18|1994-06-30|1994-06-11|NONE|SHIP|al foxes. furiously bold package +26436|1539|40|6|23|33132.19|0.06|0.05|R|F|1994-09-02|1994-06-26|1994-09-04|TAKE BACK RETURN|RAIL|riously final theodolites nag. bold, fin +26437|347|76|1|15|18710.10|0.08|0.02|N|O|1996-01-29|1996-01-14|1996-02-20|DELIVER IN PERSON|SHIP|s sleep slyly. i +26437|741|74|2|1|1641.74|0.04|0.03|N|O|1996-02-20|1996-02-15|1996-03-18|TAKE BACK RETURN|RAIL|odolites. final requests +26437|877|77|3|12|21334.44|0.05|0.01|N|O|1996-01-14|1996-02-26|1996-01-26|TAKE BACK RETURN|AIR|efully according to the +26437|663|26|4|34|53164.44|0.01|0.06|N|O|1996-01-26|1996-02-19|1996-02-20|DELIVER IN PERSON|RAIL|quests! carefully ir +26437|717|18|5|27|43678.17|0.01|0.00|N|O|1996-03-24|1996-01-16|1996-03-25|COLLECT COD|RAIL|counts sleep slyly. ironic pinto +26437|1126|27|6|18|18488.16|0.02|0.05|N|O|1995-12-17|1995-12-29|1995-12-28|TAKE BACK RETURN|RAIL|rts. quickly brave foxes wake slyly. fina +26437|1045|46|7|1|946.04|0.01|0.08|N|O|1995-12-15|1996-01-06|1996-01-06|TAKE BACK RETURN|SHIP| wake blithely alongside of the slyly f +26438|861|61|1|3|5285.58|0.09|0.04|N|O|1996-04-18|1996-03-18|1996-05-07|COLLECT COD|MAIL|arefully regular, special platelets. care +26439|533|24|1|35|50173.55|0.10|0.07|N|O|1995-12-28|1995-10-27|1996-01-23|NONE|AIR|ar epitaphs sleep slyly. +26439|1881|11|2|38|67749.44|0.00|0.04|N|O|1995-09-17|1995-11-03|1995-10-05|DELIVER IN PERSON|AIR| ironic theodolites haggle brav +26439|11|12|3|3|2733.03|0.03|0.00|N|O|1995-09-30|1995-12-04|1995-10-22|DELIVER IN PERSON|TRUCK|ackages wake slyly a +26439|288|70|4|27|32083.56|0.02|0.05|N|O|1995-12-15|1995-12-14|1996-01-01|NONE|TRUCK|totes according to the bold, spec +26439|292|47|5|27|32191.83|0.04|0.03|N|O|1995-12-20|1995-10-25|1995-12-30|DELIVER IN PERSON|REG AIR|s. slyly pending packages un +26439|1847|77|6|41|71702.44|0.09|0.03|N|O|1995-12-02|1995-11-22|1995-12-15|NONE|SHIP|ending, ironic asymptotes wake final +26464|1096|2|1|29|28915.61|0.09|0.04|N|O|1996-03-31|1996-02-15|1996-04-22|TAKE BACK RETURN|MAIL|sleep express, pending deposits. +26464|1745|88|2|15|24701.10|0.05|0.00|N|O|1996-03-02|1996-01-22|1996-03-17|NONE|TRUCK|onic instructions +26464|1351|66|3|45|56355.75|0.02|0.00|N|O|1995-12-14|1996-02-05|1995-12-19|NONE|REG AIR|t pending excuses. ironic, even asymptot +26464|1098|69|4|22|21979.98|0.02|0.05|N|O|1996-02-08|1996-02-01|1996-02-25|COLLECT COD|AIR|y bold requests abou +26464|1742|85|5|31|50955.94|0.08|0.05|N|O|1995-12-14|1996-01-21|1996-01-12|TAKE BACK RETURN|FOB| dependencie +26464|1595|96|6|19|28435.21|0.05|0.01|N|O|1996-01-15|1996-02-14|1996-01-30|TAKE BACK RETURN|REG AIR| ironic instructions serve fl +26464|1356|57|7|24|30176.40|0.04|0.00|N|O|1996-02-27|1996-02-27|1996-03-06|COLLECT COD|RAIL|ng packages. unusual, special +26465|644|45|1|47|72598.08|0.07|0.04|N|O|1997-05-08|1997-04-14|1997-05-15|COLLECT COD|AIR|ly special foxes haggl +26465|911|46|2|16|28990.56|0.05|0.08|N|O|1997-02-28|1997-05-12|1997-03-23|NONE|AIR| dependencies. slyly express r +26465|1132|69|3|7|7231.91|0.05|0.07|N|O|1997-04-23|1997-03-20|1997-05-16|NONE|AIR| accounts u +26465|755|56|4|6|9934.50|0.05|0.01|N|O|1997-02-22|1997-04-25|1997-03-01|DELIVER IN PERSON|AIR|lithely. pending ideas sleep. ironic th +26465|1321|22|5|46|56226.72|0.07|0.05|N|O|1997-03-24|1997-04-23|1997-04-03|NONE|TRUCK|usual asymptotes cajole ideas. car +26466|356|85|1|12|15076.20|0.09|0.07|R|F|1994-07-25|1994-08-18|1994-08-15|COLLECT COD|AIR|y ironic deposi +26466|1826|27|2|20|34556.40|0.07|0.03|R|F|1994-09-11|1994-07-19|1994-10-10|COLLECT COD|TRUCK| hockey players use. ironic accounts doze c +26466|166|19|3|9|9595.44|0.02|0.05|R|F|1994-08-21|1994-08-08|1994-08-30|DELIVER IN PERSON|REG AIR|t the blithely e +26467|1146|47|1|3|3141.42|0.01|0.07|N|O|1997-03-31|1997-05-03|1997-04-16|TAKE BACK RETURN|RAIL|es boost furiously above t +26468|1757|42|1|36|59715.00|0.06|0.04|N|O|1997-05-09|1997-05-12|1997-05-24|DELIVER IN PERSON|AIR|tes. furiously final accounts sleep +26468|1355|94|2|12|15076.20|0.09|0.07|N|O|1997-05-26|1997-05-27|1997-05-30|NONE|FOB|ons above the express, bold theodolit +26468|1496|97|3|37|51707.13|0.01|0.00|N|O|1997-06-23|1997-06-14|1997-06-27|COLLECT COD|REG AIR| accounts. packages across the requests ha +26468|1281|93|4|34|40197.52|0.06|0.05|N|O|1997-03-22|1997-06-07|1997-03-27|TAKE BACK RETURN|TRUCK|deposits near the sly +26468|1002|3|5|28|25284.00|0.07|0.07|N|O|1997-06-09|1997-05-08|1997-07-03|DELIVER IN PERSON|TRUCK| carefully. fluffily special bra +26469|39|40|1|23|21597.69|0.03|0.04|A|F|1992-10-20|1992-09-03|1992-11-03|NONE|REG AIR|es are blithely spe +26469|1477|95|2|23|31704.81|0.02|0.02|R|F|1992-10-06|1992-09-14|1992-10-21|NONE|REG AIR|ular pinto beans haggle bl +26469|1597|78|3|17|25476.03|0.02|0.06|R|F|1992-11-04|1992-10-05|1992-11-13|COLLECT COD|RAIL| ironic accounts haggle blithely along +26469|240|68|4|25|28506.00|0.06|0.06|A|F|1992-11-09|1992-09-03|1992-11-28|NONE|SHIP| are carefully furiously special +26469|122|49|5|25|25553.00|0.04|0.08|R|F|1992-09-30|1992-10-08|1992-10-02|COLLECT COD|TRUCK|rs cajole above the enticingly ironic reque +26469|945|14|6|1|1845.94|0.05|0.03|R|F|1992-10-25|1992-10-26|1992-11-24|COLLECT COD|FOB|s. ironic warhorses sublate about t +26470|1927|16|1|19|34749.48|0.00|0.02|R|F|1994-04-23|1994-04-23|1994-05-16|TAKE BACK RETURN|REG AIR|ss, special accounts. carefully unu +26470|693|56|2|41|65341.29|0.03|0.06|R|F|1994-04-25|1994-05-28|1994-05-04|COLLECT COD|REG AIR|refully even epitaphs use ironic instru +26470|1102|39|3|43|43133.30|0.04|0.04|R|F|1994-05-29|1994-04-28|1994-06-12|DELIVER IN PERSON|REG AIR|n packages. doggedly dogged notornis +26470|105|32|4|34|34173.40|0.04|0.04|A|F|1994-06-19|1994-05-16|1994-06-28|COLLECT COD|SHIP|usly special excuses affix after the +26471|1380|57|1|42|53817.96|0.07|0.05|N|O|1997-05-17|1997-04-29|1997-05-31|TAKE BACK RETURN|REG AIR|wake quickly ironic, silent fox +26471|1214|89|2|27|30110.67|0.02|0.02|N|O|1997-04-01|1997-05-14|1997-04-12|NONE|FOB|he careful +26471|1140|41|3|33|34357.62|0.01|0.07|N|O|1997-03-25|1997-06-12|1997-04-20|DELIVER IN PERSON|TRUCK|quickly about the blithely f +26496|273|55|1|13|15252.51|0.03|0.00|N|O|1996-08-27|1996-07-20|1996-09-14|DELIVER IN PERSON|SHIP|as. even foxes dazzle quickly. carefully +26496|587|48|2|40|59503.20|0.02|0.04|N|O|1996-08-16|1996-08-21|1996-09-10|COLLECT COD|REG AIR|ackages. carefully +26496|773|70|3|35|58581.95|0.05|0.00|N|O|1996-08-24|1996-08-03|1996-09-23|TAKE BACK RETURN|FOB|blithely express pack +26496|399|56|4|21|27287.19|0.01|0.06|N|O|1996-09-30|1996-08-13|1996-10-26|DELIVER IN PERSON|AIR|nusual, final accounts: idea +26496|1981|70|5|2|3765.96|0.06|0.05|N|O|1996-08-04|1996-07-30|1996-08-28|COLLECT COD|RAIL|gle quickl +26497|874|8|1|50|88743.50|0.02|0.07|N|O|1997-09-04|1997-09-07|1997-09-12|COLLECT COD|RAIL|nt deposits. express +26498|684|47|1|30|47540.40|0.07|0.00|N|O|1996-11-21|1996-12-31|1996-12-05|NONE|AIR|eas. carefully final +26498|1203|78|2|50|55210.00|0.09|0.00|N|O|1997-01-13|1996-12-29|1997-01-31|COLLECT COD|RAIL|iously according to +26498|25|51|3|17|15725.34|0.07|0.08|N|O|1997-01-31|1996-11-17|1997-02-19|DELIVER IN PERSON|FOB|ependencies na +26499|113|92|1|11|11144.21|0.06|0.08|R|F|1993-03-20|1993-04-12|1993-04-03|DELIVER IN PERSON|TRUCK|ests are fluffily. slyly ironic packages bo +26499|1105|42|2|35|35213.50|0.01|0.02|A|F|1993-05-07|1993-03-24|1993-06-06|NONE|MAIL|sual, unusual f +26499|1310|87|3|49|59354.19|0.07|0.02|R|F|1993-05-13|1993-04-08|1993-06-07|TAKE BACK RETURN|TRUCK|sts. carefully silent a +26499|191|70|4|33|36009.27|0.10|0.01|A|F|1993-06-20|1993-05-04|1993-06-27|NONE|REG AIR|y ironic deposits nag. furiously ironi +26499|600|61|5|33|49519.80|0.08|0.08|R|F|1993-03-06|1993-04-14|1993-03-25|TAKE BACK RETURN|TRUCK|ly carefully +26499|1543|84|6|15|21668.10|0.10|0.06|A|F|1993-02-27|1993-05-16|1993-03-15|NONE|AIR|ully special ideas +26499|824|25|7|38|65543.16|0.04|0.05|R|F|1993-04-09|1993-05-23|1993-04-27|COLLECT COD|REG AIR|s. fluffily even package +26500|1239|77|1|37|42188.51|0.08|0.02|N|O|1997-02-16|1997-02-25|1997-03-04|DELIVER IN PERSON|MAIL|ways express deposits a +26500|1966|55|2|16|29887.36|0.10|0.04|N|O|1997-03-17|1997-02-24|1997-03-19|NONE|RAIL|ickly along t +26500|1058|59|3|11|10549.55|0.04|0.02|N|O|1997-02-20|1997-01-15|1997-03-02|TAKE BACK RETURN|TRUCK|osits. regul +26500|748|81|4|29|47813.46|0.10|0.04|N|O|1996-12-31|1997-01-18|1997-01-09|TAKE BACK RETURN|MAIL|lites. special requests br +26500|1357|96|5|5|6291.75|0.03|0.03|N|O|1997-03-14|1997-02-14|1997-04-08|DELIVER IN PERSON|SHIP|olphins. furiousl +26501|1678|2|1|50|78983.50|0.02|0.03|R|F|1993-06-17|1993-08-12|1993-06-28|DELIVER IN PERSON|TRUCK|unusual deposits wake. regular +26501|1356|95|2|7|8801.45|0.08|0.08|A|F|1993-08-16|1993-07-25|1993-08-22|NONE|FOB|t the carefully f +26501|1640|23|3|1|1541.64|0.10|0.03|R|F|1993-07-27|1993-06-23|1993-08-10|TAKE BACK RETURN|REG AIR|about the express requests? furiously +26502|528|29|1|21|29998.92|0.01|0.00|A|F|1993-02-11|1993-02-12|1993-03-10|COLLECT COD|REG AIR|are after th +26502|1310|49|2|21|25437.51|0.06|0.00|A|F|1993-03-04|1993-02-08|1993-04-01|NONE|REG AIR|tes at the pending deposits use a +26503|1833|20|1|46|79802.18|0.09|0.01|A|F|1995-05-09|1995-07-16|1995-06-01|NONE|FOB|ages. requests +26503|1248|86|2|34|39074.16|0.10|0.01|N|O|1995-08-03|1995-05-24|1995-08-26|DELIVER IN PERSON|SHIP|al attainments. s +26503|1436|76|3|5|6687.15|0.02|0.01|N|O|1995-07-27|1995-07-18|1995-08-25|NONE|MAIL|. slyly final pinto beans wake blithely th +26503|680|43|4|7|11064.76|0.08|0.05|R|F|1995-04-29|1995-06-18|1995-05-12|DELIVER IN PERSON|SHIP|egular packages alongside +26503|100|1|5|17|17001.70|0.03|0.06|N|F|1995-06-05|1995-05-26|1995-06-24|TAKE BACK RETURN|REG AIR|l requests affix +26503|1784|69|6|31|52259.18|0.02|0.04|A|F|1995-05-10|1995-07-18|1995-06-05|COLLECT COD|RAIL|ial pinto b +26503|168|69|7|31|33112.96|0.05|0.00|N|O|1995-08-12|1995-07-05|1995-08-30|NONE|FOB|ccounts. furiously regular deposi +26528|553|44|1|39|56688.45|0.05|0.06|N|O|1996-01-07|1996-01-25|1996-01-28|DELIVER IN PERSON|FOB|ial packages affix blithely above the evenl +26528|335|92|2|1|1235.33|0.03|0.05|N|O|1996-02-12|1996-01-01|1996-03-05|COLLECT COD|REG AIR|oxes sleep slyly carefully even acco +26529|1428|46|1|48|63812.16|0.03|0.05|R|F|1995-02-20|1995-03-10|1995-02-27|NONE|TRUCK|ges. regular accounts haggle furiously sil +26529|655|49|2|35|54447.75|0.10|0.06|A|F|1995-03-20|1995-03-22|1995-04-09|TAKE BACK RETURN|MAIL| foxes haggle +26529|1744|29|3|26|42789.24|0.06|0.05|R|F|1995-03-29|1995-03-21|1995-04-14|DELIVER IN PERSON|MAIL| pending deposits promise +26529|663|57|4|47|73492.02|0.05|0.02|R|F|1995-02-02|1995-03-20|1995-03-03|TAKE BACK RETURN|TRUCK|nst the carefully regular request +26529|438|26|5|10|13384.30|0.07|0.02|A|F|1995-03-04|1995-03-24|1995-04-03|NONE|REG AIR|al pinto beans sleep +26529|418|77|6|3|3955.23|0.01|0.07|R|F|1995-04-27|1995-03-07|1995-05-08|TAKE BACK RETURN|SHIP|press deposits are slyly after the p +26530|1405|84|1|20|26128.00|0.09|0.08|N|O|1998-07-09|1998-09-26|1998-07-10|DELIVER IN PERSON|RAIL|lent pinto beans haggle finally alon +26531|1374|51|1|17|21681.29|0.00|0.05|N|O|1995-06-22|1995-09-16|1995-06-27|TAKE BACK RETURN|FOB|ully about the final fox +26531|1213|88|2|44|49025.24|0.00|0.01|N|O|1995-08-30|1995-09-12|1995-09-18|DELIVER IN PERSON|MAIL|efully even asymptotes +26531|1680|81|3|10|15816.80|0.05|0.05|N|O|1995-09-29|1995-08-07|1995-10-19|NONE|RAIL|y unusual pearls wake carefully after the c +26531|401|2|4|15|19521.00|0.03|0.04|N|O|1995-10-04|1995-08-05|1995-10-31|DELIVER IN PERSON|FOB|blithely daring accounts affix blithely +26531|784|49|5|21|35380.38|0.01|0.07|N|O|1995-07-14|1995-08-31|1995-07-31|NONE|RAIL|ess pinto +26531|622|23|6|30|45678.60|0.01|0.03|N|O|1995-07-05|1995-08-08|1995-07-14|TAKE BACK RETURN|MAIL|inal requests wake. carefully ironic a +26531|480|68|7|50|69024.00|0.01|0.04|N|O|1995-10-11|1995-09-09|1995-10-21|DELIVER IN PERSON|RAIL|carefully ironic +26532|205|87|1|22|24314.40|0.08|0.01|A|F|1994-12-30|1995-01-17|1995-01-10|DELIVER IN PERSON|RAIL|kages. special as +26532|1839|40|2|50|87041.50|0.07|0.05|R|F|1995-03-18|1995-01-21|1995-03-28|TAKE BACK RETURN|AIR|pendencies-- final the +26533|1051|87|1|5|4760.25|0.01|0.02|R|F|1993-06-10|1993-07-03|1993-07-10|DELIVER IN PERSON|FOB|nto beans cajole carefully slyly bold ide +26533|925|60|2|7|12781.44|0.09|0.06|A|F|1993-08-10|1993-07-13|1993-08-21|DELIVER IN PERSON|AIR|e across the stealthy, regular +26533|432|33|3|34|45302.62|0.08|0.06|R|F|1993-07-13|1993-05-29|1993-07-21|COLLECT COD|MAIL|x-ray. final accounts detect +26534|1724|9|1|13|21134.36|0.05|0.05|N|O|1996-04-08|1996-02-29|1996-05-07|TAKE BACK RETURN|AIR| according to the fur +26534|801|2|2|48|81686.40|0.04|0.04|N|O|1996-04-03|1996-02-07|1996-04-16|COLLECT COD|TRUCK|e final deposits. accounts detect +26535|1348|87|1|38|47474.92|0.02|0.03|R|F|1992-04-14|1992-04-27|1992-04-30|NONE|TRUCK|es breach furiously even +26535|1259|34|2|7|8121.75|0.05|0.01|R|F|1992-05-21|1992-04-24|1992-06-12|NONE|TRUCK|ackages hang +26535|1804|91|3|35|59703.00|0.04|0.03|R|F|1992-03-30|1992-05-14|1992-04-17|TAKE BACK RETURN|FOB|ans. regular fo +26535|1170|43|4|26|27850.42|0.01|0.03|R|F|1992-05-09|1992-05-24|1992-06-04|NONE|MAIL|l packages-- blithely even accounts prom +26535|319|4|5|9|10973.79|0.07|0.00|R|F|1992-07-19|1992-05-02|1992-07-20|NONE|AIR|daring deposits. packages +26560|1622|46|1|34|51803.08|0.10|0.07|N|O|1998-03-06|1998-01-22|1998-03-07|DELIVER IN PERSON|SHIP|cial dolphins. carefully final accounts abo +26560|652|84|2|35|54342.75|0.08|0.01|N|O|1997-12-29|1998-02-08|1998-01-16|NONE|SHIP|quickly around the b +26561|1720|63|1|38|61625.36|0.04|0.08|N|O|1998-09-07|1998-10-15|1998-09-18|NONE|REG AIR|leep quickly. slyly reg +26561|1461|40|2|41|55860.86|0.04|0.01|N|O|1998-11-25|1998-10-16|1998-12-17|DELIVER IN PERSON|REG AIR|es. furiously special asymptotes mai +26562|1107|80|1|21|21170.10|0.04|0.06|N|O|1998-05-15|1998-06-08|1998-05-21|TAKE BACK RETURN|SHIP|lar dependencies nag carefu +26563|64|40|1|47|45310.82|0.00|0.03|N|O|1997-03-03|1997-04-14|1997-03-18|TAKE BACK RETURN|REG AIR|sleep bold deposits. +26563|92|68|2|13|12897.17|0.00|0.04|N|O|1997-05-25|1997-03-22|1997-06-03|NONE|RAIL|s. fluffily unusual attainme +26563|410|69|3|42|55037.22|0.01|0.08|N|O|1997-02-03|1997-03-09|1997-03-02|COLLECT COD|REG AIR|boost according to the accounts? ex +26563|1445|24|4|29|39046.76|0.04|0.08|N|O|1997-03-24|1997-03-05|1997-04-20|NONE|AIR|deas. ironic, regular excuses according +26563|1219|20|5|31|34726.51|0.01|0.03|N|O|1997-05-01|1997-04-05|1997-05-04|TAKE BACK RETURN|TRUCK|ges lose slyly +26563|1743|28|6|13|21381.62|0.10|0.06|N|O|1997-04-01|1997-04-11|1997-04-11|TAKE BACK RETURN|AIR|areful accounts use slyl +26563|1314|15|7|17|20660.27|0.05|0.07|N|O|1997-03-31|1997-04-23|1997-04-15|COLLECT COD|RAIL|odolites cajole blithely blithely iro +26564|1552|53|1|17|24710.35|0.01|0.02|R|F|1994-07-14|1994-06-08|1994-08-06|COLLECT COD|FOB|d, special accou +26564|1557|58|2|6|8751.30|0.10|0.06|A|F|1994-08-27|1994-07-02|1994-09-21|DELIVER IN PERSON|RAIL|osits. pending, r +26564|591|52|3|42|62646.78|0.00|0.04|A|F|1994-05-05|1994-06-01|1994-05-19|DELIVER IN PERSON|FOB|kages. fluffily regular +26564|901|4|4|8|14415.20|0.07|0.01|A|F|1994-06-30|1994-07-27|1994-07-25|COLLECT COD|FOB|counts haggle sly +26564|1164|37|5|42|44736.72|0.03|0.08|A|F|1994-06-22|1994-06-24|1994-07-22|NONE|AIR|ndencies. excuses are across t +26565|1699|82|1|31|49621.39|0.10|0.06|R|F|1995-02-01|1994-12-10|1995-03-02|DELIVER IN PERSON|AIR|furiously quick de +26565|1819|6|2|46|79157.26|0.07|0.08|R|F|1994-12-03|1994-12-30|1994-12-13|TAKE BACK RETURN|AIR|final pinto beans. even +26565|326|27|3|34|41694.88|0.06|0.08|A|F|1995-01-01|1994-11-24|1995-01-26|TAKE BACK RETURN|SHIP|o the quickly silent instruct +26565|559|20|4|27|39407.85|0.10|0.03|R|F|1994-11-06|1994-12-31|1994-11-25|COLLECT COD|FOB|l requests cajole regular depos +26565|1800|43|5|36|61264.80|0.09|0.04|R|F|1994-11-25|1995-01-10|1994-12-09|TAKE BACK RETURN|REG AIR|hely. final, final deposits are fina +26566|379|8|1|8|10234.96|0.09|0.01|N|O|1995-12-03|1995-12-22|1995-12-22|TAKE BACK RETURN|MAIL|s use. quickly unusual pa +26566|1601|84|2|38|57098.80|0.08|0.06|N|O|1995-11-16|1996-01-09|1995-11-29|DELIVER IN PERSON|FOB|uctions. furiously special instructions det +26566|1830|31|3|27|46759.41|0.03|0.01|N|O|1995-12-27|1996-01-29|1996-01-03|DELIVER IN PERSON|AIR|sts. carefull +26567|1855|85|1|47|82571.95|0.10|0.08|A|F|1994-10-27|1994-11-11|1994-11-12|NONE|REG AIR|s sleep quickly. regular, r +26567|839|40|2|23|40016.09|0.05|0.03|A|F|1994-12-21|1994-10-05|1995-01-05|COLLECT COD|REG AIR|tealthy packages mold slyly ac +26567|1094|30|3|4|3980.36|0.01|0.00|R|F|1994-10-18|1994-10-15|1994-11-12|COLLECT COD|MAIL|uickly careful +26567|347|32|4|42|52388.28|0.04|0.01|A|F|1994-11-01|1994-10-10|1994-11-14|DELIVER IN PERSON|MAIL|rhorses from the finall +26567|614|77|5|1|1514.61|0.00|0.08|R|F|1994-12-22|1994-11-24|1995-01-02|DELIVER IN PERSON|FOB|lar accounts x-r +26567|1522|3|6|1|1423.52|0.00|0.04|A|F|1994-12-20|1994-10-13|1995-01-13|COLLECT COD|AIR|instructions wa +26567|323|52|7|23|28136.36|0.10|0.08|A|F|1994-10-20|1994-11-16|1994-11-14|NONE|MAIL|y: quickly thin pinto be +26592|1033|39|1|50|46701.50|0.05|0.01|N|O|1997-07-21|1997-07-30|1997-08-08|TAKE BACK RETURN|REG AIR|romise aro +26592|49|50|2|33|31318.32|0.08|0.07|N|O|1997-06-02|1997-06-14|1997-06-29|DELIVER IN PERSON|RAIL|etect. final, e +26593|1640|23|1|10|15416.40|0.07|0.05|N|O|1995-10-07|1995-09-29|1995-11-02|DELIVER IN PERSON|SHIP|usual deposits affix +26594|1474|14|1|10|13754.70|0.01|0.04|R|F|1995-05-11|1995-06-20|1995-05-31|DELIVER IN PERSON|MAIL|ages. permanent +26594|335|64|2|31|38295.23|0.09|0.04|R|F|1995-05-26|1995-07-18|1995-06-08|TAKE BACK RETURN|REG AIR|, ironic foxes boost +26594|1367|44|3|10|12683.60|0.01|0.01|N|O|1995-08-09|1995-07-14|1995-08-25|NONE|SHIP|ular accounts. always regul +26594|337|22|4|48|59391.84|0.00|0.03|N|O|1995-07-29|1995-06-15|1995-08-04|NONE|FOB|unusual packages promise +26595|1837|67|1|26|45209.58|0.06|0.07|N|O|1997-06-24|1997-04-22|1997-07-21|TAKE BACK RETURN|MAIL|s sleep fluffily. unusual deposits ar +26595|1378|79|2|19|24308.03|0.07|0.00|N|O|1997-06-28|1997-06-15|1997-07-20|NONE|TRUCK|beans wake furiously iron +26596|1622|23|1|49|74657.38|0.02|0.03|N|O|1996-12-24|1997-01-14|1997-01-10|DELIVER IN PERSON|REG AIR|usly ironic excuses integrat +26596|835|2|2|38|65961.54|0.02|0.03|N|O|1996-11-20|1996-12-10|1996-11-27|COLLECT COD|MAIL|y according to the s +26596|198|99|3|15|16472.85|0.07|0.06|N|O|1996-12-22|1997-01-13|1997-01-04|COLLECT COD|AIR|ix ironic dependen +26597|15|41|1|7|6405.07|0.02|0.00|R|F|1995-01-27|1995-02-15|1995-01-28|COLLECT COD|FOB|thely. furiously special instructions are +26597|756|89|2|36|59643.00|0.01|0.03|A|F|1995-03-28|1995-03-05|1995-04-05|DELIVER IN PERSON|MAIL|ng deposits impress e +26597|504|5|3|12|16854.00|0.10|0.03|A|F|1995-03-19|1995-03-24|1995-04-04|TAKE BACK RETURN|FOB|oxes engage. slyly ironic asymptotes eat +26597|318|19|4|15|18274.65|0.03|0.05|A|F|1995-04-10|1995-02-17|1995-05-07|COLLECT COD|TRUCK|deas. requests about the furiously ironi +26597|1637|79|5|38|58467.94|0.09|0.08|A|F|1995-02-25|1995-03-03|1995-03-27|NONE|SHIP|structions sleep slyly slyly even dependenc +26598|1316|17|1|7|8521.17|0.08|0.05|N|O|1997-12-23|1997-12-16|1998-01-18|COLLECT COD|REG AIR|fily final requests sleep across the slyly +26598|633|65|2|30|46008.90|0.09|0.03|N|O|1997-11-06|1997-11-15|1997-12-04|TAKE BACK RETURN|AIR|luffily quiet instructions are quietly spec +26598|925|28|3|16|29214.72|0.08|0.08|N|O|1997-10-26|1997-12-05|1997-11-04|NONE|SHIP|the furiously ironic deposits af +26599|251|33|1|10|11512.50|0.02|0.02|N|O|1997-05-22|1997-07-28|1997-06-15|DELIVER IN PERSON|SHIP| doggedly final dependencies; final de +26624|1037|73|1|32|30016.96|0.10|0.05|N|O|1997-05-06|1997-04-27|1997-05-16|DELIVER IN PERSON|SHIP|kages boost +26624|895|62|2|12|21550.68|0.01|0.03|N|O|1997-03-22|1997-04-13|1997-04-21|COLLECT COD|RAIL|cial requests above the carefu +26624|1636|60|3|33|50741.79|0.08|0.03|N|O|1997-04-29|1997-05-01|1997-05-16|NONE|SHIP|ealms should have to are slyly fluffily +26624|1144|53|4|39|40760.46|0.02|0.06|N|O|1997-06-17|1997-04-07|1997-07-05|NONE|FOB|slyly close depende +26624|1631|14|5|41|62837.83|0.10|0.00|N|O|1997-03-27|1997-04-28|1997-04-01|TAKE BACK RETURN|FOB|uffily across th +26625|1261|99|1|27|31381.02|0.03|0.07|N|O|1995-12-19|1995-11-24|1996-01-04|COLLECT COD|FOB|oxes. furiously express asymptotes against +26626|105|58|1|23|23117.30|0.01|0.04|R|F|1994-11-20|1995-01-30|1994-12-04|COLLECT COD|SHIP|tly quickly ironic requests. i +26626|1975|76|2|32|60063.04|0.06|0.02|A|F|1995-02-04|1995-02-10|1995-02-11|NONE|SHIP|ptotes kindle quickly eve +26627|1751|94|1|31|51235.25|0.02|0.07|A|F|1994-11-15|1995-01-12|1994-12-10|TAKE BACK RETURN|RAIL|ggle carefully. slyly pending dep +26627|1465|44|2|12|16397.52|0.07|0.02|R|F|1995-02-28|1995-01-13|1995-03-26|NONE|FOB|gged notornis. slyly iron +26627|1672|14|3|2|3147.34|0.03|0.01|R|F|1995-02-09|1994-12-19|1995-03-05|NONE|RAIL|ffily ironic packages. blithely bold de +26627|1480|98|4|10|13814.80|0.00|0.00|R|F|1995-01-02|1994-12-13|1995-01-07|TAKE BACK RETURN|REG AIR|s. quickly ironic theodolites across th +26627|1574|95|5|7|10328.99|0.10|0.00|A|F|1995-02-04|1995-01-02|1995-03-06|NONE|REG AIR|ts across the pinto +26627|1814|1|6|29|49758.49|0.01|0.07|R|F|1995-01-29|1995-01-04|1995-02-14|COLLECT COD|MAIL|uriously final request +26628|1151|60|1|33|34720.95|0.00|0.04|N|O|1997-02-16|1997-02-25|1997-02-22|TAKE BACK RETURN|AIR|ts are fluffily abov +26628|1680|81|2|39|61685.52|0.10|0.05|N|O|1997-03-17|1997-03-18|1997-04-13|COLLECT COD|TRUCK|quickly slyly special theodolites. +26628|356|13|3|42|52766.70|0.09|0.04|N|O|1997-05-14|1997-03-18|1997-05-30|NONE|SHIP|arefully bold forges breach blithel +26628|1212|13|4|5|5566.05|0.08|0.06|N|O|1997-04-24|1997-02-20|1997-04-28|DELIVER IN PERSON|TRUCK|ic requests wake carefully against the acco +26628|1518|19|5|50|70975.50|0.09|0.03|N|O|1997-02-24|1997-02-24|1997-03-01|DELIVER IN PERSON|REG AIR| wake. blithely pendin +26628|399|100|6|5|6496.95|0.03|0.06|N|O|1997-02-20|1997-03-19|1997-03-10|DELIVER IN PERSON|AIR|ts. blithely +26628|677|71|7|30|47330.10|0.08|0.02|N|O|1997-05-09|1997-03-13|1997-05-21|COLLECT COD|RAIL|e requests. platelets sleep blithely agains +26629|1648|31|1|8|12397.12|0.09|0.02|R|F|1994-11-01|1994-09-14|1994-11-20|TAKE BACK RETURN|SHIP|e the final courts. +26629|1531|72|2|34|48706.02|0.06|0.00|R|F|1994-07-31|1994-08-28|1994-08-30|DELIVER IN PERSON|REG AIR|nstructions detect ac +26629|1400|39|3|30|39042.00|0.09|0.04|R|F|1994-10-31|1994-08-21|1994-11-26|COLLECT COD|RAIL|usual, regular platelets sleep slyly w +26629|1531|12|4|32|45840.96|0.10|0.05|A|F|1994-09-29|1994-09-01|1994-10-10|COLLECT COD|TRUCK|refully. unusual d +26629|1844|31|5|10|17458.40|0.01|0.02|A|F|1994-11-01|1994-09-25|1994-11-09|DELIVER IN PERSON|RAIL|sily along the warhorses. slyl +26629|1851|52|6|26|45574.10|0.06|0.05|R|F|1994-08-17|1994-09-03|1994-08-27|COLLECT COD|REG AIR| quickly regular accou +26630|1708|35|1|1|1609.70|0.06|0.08|R|F|1994-03-03|1994-01-27|1994-03-26|DELIVER IN PERSON|SHIP| blithely regular pinto beans along +26630|424|25|2|11|14568.62|0.07|0.00|A|F|1994-03-06|1994-01-15|1994-03-20|DELIVER IN PERSON|RAIL| final accounts-- even pinto beans w +26630|205|60|3|39|43102.80|0.09|0.00|R|F|1993-12-04|1994-02-23|1993-12-12|COLLECT COD|MAIL|ly even deposits. ironic depo +26630|1713|14|4|50|80735.50|0.07|0.05|R|F|1994-03-21|1994-02-23|1994-04-03|TAKE BACK RETURN|AIR|al accounts doze blithely ironic i +26631|989|92|1|46|86939.08|0.00|0.05|R|F|1994-02-12|1994-01-08|1994-02-27|DELIVER IN PERSON|TRUCK|c deposits. unusual excuses believe flu +26631|1112|49|2|27|27353.97|0.09|0.01|R|F|1993-11-23|1994-01-06|1993-12-06|DELIVER IN PERSON|RAIL|tes haggle ca +26631|1151|24|3|49|51555.35|0.00|0.03|A|F|1994-01-10|1993-12-23|1994-02-06|DELIVER IN PERSON|FOB|nal courts; pla +26631|341|70|4|21|26068.14|0.02|0.03|A|F|1993-11-11|1994-01-17|1993-12-11|TAKE BACK RETURN|REG AIR|ly daring accounts are along the quickly +26631|317|2|5|12|14607.72|0.10|0.02|R|F|1993-12-01|1994-01-27|1993-12-19|DELIVER IN PERSON|SHIP|refully ironi +26631|1955|88|6|50|92847.50|0.01|0.02|R|F|1993-12-01|1993-12-16|1993-12-25|COLLECT COD|FOB|. express dependencies al +26631|1458|37|7|47|63894.15|0.08|0.02|R|F|1994-01-14|1993-12-24|1994-02-01|TAKE BACK RETURN|SHIP| pinto beans. furiously even packages are +26656|765|30|1|27|44975.52|0.01|0.05|R|F|1992-07-23|1992-09-02|1992-08-11|NONE|SHIP|quests. deposits cajo +26656|39|40|2|44|41317.32|0.09|0.07|R|F|1992-08-25|1992-08-17|1992-09-20|DELIVER IN PERSON|FOB|refully ironic packages. permanent, silent +26657|818|18|1|3|5156.43|0.00|0.01|A|F|1993-01-01|1992-11-07|1993-01-12|TAKE BACK RETURN|FOB|hely. furiously even pinto beans across t +26657|1255|67|2|7|8093.75|0.05|0.02|R|F|1992-10-26|1992-11-16|1992-11-09|COLLECT COD|SHIP|s. fluffily iron +26657|181|60|3|7|7568.26|0.01|0.03|A|F|1992-11-22|1992-12-23|1992-12-20|COLLECT COD|REG AIR|lly blithely unusual deposi +26657|592|83|4|40|59703.60|0.06|0.02|R|F|1992-12-20|1992-12-18|1993-01-10|DELIVER IN PERSON|MAIL|quests. ironic instructions across the fu +26657|707|8|5|24|38584.80|0.01|0.01|R|F|1992-12-20|1992-11-12|1993-01-02|NONE|AIR|the furiously +26658|207|62|1|1|1107.20|0.04|0.04|N|O|1996-03-05|1996-02-25|1996-03-09|DELIVER IN PERSON|TRUCK|final, express cour +26658|1438|78|2|34|45540.62|0.01|0.03|N|O|1995-12-24|1996-02-23|1996-01-14|DELIVER IN PERSON|SHIP|y final dependencies haggl +26658|1247|59|3|18|20668.32|0.10|0.05|N|O|1996-04-10|1996-02-16|1996-04-22|NONE|TRUCK|as. slyly final +26658|1039|10|4|22|20680.66|0.03|0.08|N|O|1996-02-03|1996-02-17|1996-02-14|TAKE BACK RETURN|REG AIR|press instru +26659|1798|99|1|18|30596.22|0.05|0.04|N|O|1997-06-14|1997-06-14|1997-07-03|COLLECT COD|REG AIR|al deposits sleep. carefully even t +26659|764|65|2|49|81573.24|0.00|0.01|N|O|1997-05-07|1997-05-15|1997-05-23|NONE|FOB|iously after the fo +26659|1569|10|3|43|63234.08|0.05|0.02|N|O|1997-04-24|1997-06-23|1997-05-21|DELIVER IN PERSON|SHIP|yly regular pinto beans cajole after the +26659|391|76|4|29|37450.31|0.00|0.03|N|O|1997-04-11|1997-05-01|1997-04-25|NONE|AIR|egular instructions. furiously final a +26659|1706|33|5|32|51446.40|0.04|0.07|N|O|1997-07-08|1997-05-29|1997-07-26|COLLECT COD|MAIL|nusual sheaves cajole slyly quickly r +26659|1639|63|6|21|32353.23|0.03|0.08|N|O|1997-06-28|1997-05-13|1997-07-14|NONE|TRUCK|e furiously blithe +26660|358|15|1|16|20133.60|0.07|0.02|R|F|1992-07-08|1992-05-09|1992-07-13|COLLECT COD|SHIP| blithely bold pinto beans. bold p +26660|658|90|2|28|43642.20|0.02|0.04|R|F|1992-05-24|1992-06-16|1992-06-20|COLLECT COD|AIR|. slyly ironic fox +26660|363|20|3|47|59377.92|0.07|0.02|A|F|1992-07-04|1992-06-08|1992-08-01|COLLECT COD|TRUCK|ully pending deposits. slyly final excuse +26661|1745|72|1|30|49402.20|0.03|0.06|R|F|1993-02-08|1993-03-20|1993-02-23|DELIVER IN PERSON|MAIL| platelets boost furiously +26661|1167|40|2|21|22431.36|0.00|0.05|R|F|1993-02-27|1993-03-17|1993-03-10|COLLECT COD|FOB|furiously among the quickly special accou +26661|277|78|3|2|2354.54|0.01|0.00|A|F|1993-04-18|1993-03-06|1993-05-09|DELIVER IN PERSON|FOB|g to the silent accounts. furious +26661|1860|47|4|18|31713.48|0.06|0.05|A|F|1993-02-24|1993-01-28|1993-03-20|TAKE BACK RETURN|RAIL|unts print accord +26661|474|4|5|22|30238.34|0.01|0.02|A|F|1993-03-07|1993-03-09|1993-03-23|NONE|REG AIR|y over the idly sile +26662|45|71|1|20|18900.80|0.04|0.08|R|F|1994-02-28|1994-05-05|1994-03-29|COLLECT COD|AIR|ly among the furiously ironi +26662|803|37|2|1|1703.80|0.06|0.05|R|F|1994-03-17|1994-05-03|1994-03-24|NONE|FOB|boost fluffily. quickly brave platelets +26662|269|97|3|10|11692.60|0.10|0.08|A|F|1994-03-16|1994-04-10|1994-03-17|COLLECT COD|REG AIR|ests haggle slyly regular acco +26662|1867|68|4|37|65447.82|0.02|0.00|A|F|1994-06-10|1994-04-25|1994-06-13|DELIVER IN PERSON|RAIL|l, unusual accounts abov +26662|1097|98|5|19|18963.71|0.08|0.00|A|F|1994-04-30|1994-03-27|1994-05-19|DELIVER IN PERSON|REG AIR|onic requests +26663|414|44|1|48|63091.68|0.08|0.07|N|O|1996-08-09|1996-05-26|1996-08-30|NONE|MAIL|ainst the excuse +26663|321|22|2|35|42746.20|0.10|0.02|N|O|1996-05-24|1996-06-11|1996-06-11|TAKE BACK RETURN|REG AIR|ounts. blithely pe +26663|661|24|3|31|48411.46|0.00|0.06|N|O|1996-08-14|1996-06-13|1996-09-02|DELIVER IN PERSON|TRUCK|ake blithely fluffy, regular de +26663|489|77|4|35|48631.80|0.01|0.05|N|O|1996-04-27|1996-07-04|1996-05-17|DELIVER IN PERSON|FOB|gular packages along the c +26663|894|95|5|26|46667.14|0.01|0.07|N|O|1996-06-30|1996-07-05|1996-07-15|DELIVER IN PERSON|TRUCK| unusual excuses +26663|1280|92|6|1|1181.28|0.04|0.05|N|O|1996-06-10|1996-06-11|1996-06-28|DELIVER IN PERSON|TRUCK|ke. blithely regular packages affix blith +26688|1183|84|1|23|24936.14|0.08|0.08|R|F|1993-11-03|1993-11-11|1993-11-19|TAKE BACK RETURN|AIR|thely according to the b +26688|962|97|2|26|48436.96|0.07|0.04|A|F|1993-12-18|1993-10-28|1994-01-01|TAKE BACK RETURN|SHIP|asymptotes across the blithely +26688|1306|7|3|28|33804.40|0.01|0.00|A|F|1993-09-05|1993-10-03|1993-09-27|NONE|MAIL|ctions detect above the express plate +26688|912|81|4|6|10877.46|0.10|0.00|A|F|1993-10-27|1993-10-27|1993-10-28|COLLECT COD|REG AIR|ravely regular requests hang care +26688|1260|72|5|43|49934.18|0.05|0.03|R|F|1993-12-02|1993-10-26|1993-12-16|TAKE BACK RETURN|RAIL|accounts. carefully unusual accounts poa +26689|1949|38|1|13|24062.22|0.05|0.08|A|F|1994-10-09|1994-12-01|1994-10-19|TAKE BACK RETURN|AIR|en packages. +26689|1863|64|2|26|45886.36|0.05|0.00|R|F|1995-01-14|1994-11-03|1995-01-20|NONE|REG AIR|s. slyly pending requests sleep slyly. care +26689|1669|70|3|18|28271.88|0.06|0.03|R|F|1994-11-18|1994-12-26|1994-12-15|NONE|RAIL|ng the ironic requests. always express +26689|973|76|4|8|14991.76|0.01|0.05|R|F|1994-12-24|1994-12-25|1995-01-14|TAKE BACK RETURN|TRUCK|blithely regular accounts eat +26690|942|43|1|2|3685.88|0.07|0.00|A|F|1994-04-07|1994-05-27|1994-04-25|NONE|RAIL|y daringly ironic requests. packages af +26690|902|3|2|18|32452.20|0.09|0.08|A|F|1994-04-26|1994-04-16|1994-05-15|COLLECT COD|AIR|its affix. slowly pending +26690|1520|41|3|2|2843.04|0.10|0.04|A|F|1994-06-29|1994-04-21|1994-07-18|NONE|MAIL|l dependencies are blithely f +26690|1296|97|4|39|46694.31|0.07|0.02|A|F|1994-06-08|1994-04-02|1994-06-28|NONE|REG AIR| unusual, regular foxes detect qu +26690|1817|18|5|48|82502.88|0.00|0.05|R|F|1994-05-17|1994-04-19|1994-06-08|COLLECT COD|TRUCK|ding to the regular depende +26691|1250|25|1|25|28781.25|0.01|0.06|R|F|1992-10-09|1992-10-19|1992-10-10|NONE|AIR|y about the requests. iron +26691|348|49|2|32|39946.88|0.10|0.00|A|F|1992-08-09|1992-09-05|1992-09-03|DELIVER IN PERSON|FOB|hily even dep +26691|1149|22|3|40|42005.60|0.02|0.04|A|F|1992-12-01|1992-09-06|1992-12-22|TAKE BACK RETURN|AIR|ate above the +26691|1673|56|4|7|11022.69|0.02|0.08|A|F|1992-10-07|1992-09-08|1992-10-30|DELIVER IN PERSON|RAIL|aggle slyly bol +26691|1300|75|5|4|4805.20|0.01|0.04|R|F|1992-09-14|1992-09-19|1992-09-20|DELIVER IN PERSON|MAIL|pendencies by the furiously ironic fox +26691|246|74|6|33|37825.92|0.00|0.05|R|F|1992-10-17|1992-09-08|1992-10-23|TAKE BACK RETURN|AIR|ilent accounts. slyly fina +26692|894|95|1|12|21538.68|0.10|0.06|A|F|1993-10-10|1993-10-14|1993-10-27|NONE|RAIL|pinto beans sleep. unusual a +26693|1006|12|1|12|10884.00|0.01|0.07|R|F|1993-10-30|1993-10-07|1993-11-06|TAKE BACK RETURN|SHIP|. regular, final pains +26693|1992|25|2|41|77653.59|0.01|0.05|A|F|1993-12-20|1993-11-13|1993-12-31|COLLECT COD|FOB|onic pinto beans inte +26693|341|42|3|15|18620.10|0.07|0.08|A|F|1993-11-28|1993-10-10|1993-12-28|COLLECT COD|SHIP|beans sleep furiously after +26694|517|8|1|34|48195.34|0.09|0.01|N|O|1998-02-20|1998-04-08|1998-03-09|COLLECT COD|TRUCK|y ironic accounts +26694|1594|95|2|48|71788.32|0.02|0.05|N|O|1998-04-02|1998-04-02|1998-04-06|TAKE BACK RETURN|AIR|ly final deposits cajole bl +26694|1518|59|3|7|9936.57|0.03|0.03|N|O|1998-05-25|1998-04-27|1998-06-21|NONE|AIR| ideas. final, ironic packages across the +26694|1217|92|4|22|24600.62|0.03|0.07|N|O|1998-05-08|1998-03-19|1998-06-01|COLLECT COD|RAIL|y pending pac +26695|35|36|1|28|26180.84|0.01|0.00|R|F|1993-08-22|1993-09-02|1993-09-15|COLLECT COD|FOB|ckages. even, regular +26695|1388|27|2|16|20630.08|0.05|0.02|R|F|1993-06-16|1993-08-12|1993-07-14|DELIVER IN PERSON|RAIL|dolites. slyly regular ideas are furio +26695|403|4|3|1|1303.40|0.00|0.04|A|F|1993-07-13|1993-07-17|1993-08-05|TAKE BACK RETURN|MAIL|l, pending deposits cajole. carefully unusu +26695|198|77|4|31|34043.89|0.06|0.03|A|F|1993-06-09|1993-07-28|1993-06-26|NONE|FOB| unusual foxes sleep slyly slyly i +26695|46|22|5|8|7568.32|0.01|0.04|A|F|1993-08-27|1993-07-12|1993-09-14|COLLECT COD|FOB| platelets according to +26695|594|25|6|2|2989.18|0.04|0.00|A|F|1993-08-02|1993-07-16|1993-08-24|COLLECT COD|SHIP|y even pinto bea +26720|1729|14|1|19|30983.68|0.02|0.01|N|O|1997-02-19|1997-03-14|1997-02-25|COLLECT COD|REG AIR|o the enticing, ironic deposits. slyly ex +26720|934|3|2|4|7339.72|0.08|0.08|N|O|1997-01-11|1997-03-14|1997-01-12|COLLECT COD|AIR|erve fluffily alon +26721|1990|91|1|37|70003.63|0.04|0.03|N|O|1997-04-11|1997-05-16|1997-04-18|COLLECT COD|MAIL| sheaves sleep +26721|939|42|2|33|60717.69|0.00|0.08|N|O|1997-05-22|1997-06-13|1997-06-09|TAKE BACK RETURN|AIR| blithely bold accounts slee +26721|850|50|3|50|87542.50|0.09|0.06|N|O|1997-07-12|1997-05-24|1997-08-06|NONE|AIR|tealthy packages. courts at th +26721|1466|67|4|8|10939.68|0.01|0.05|N|O|1997-06-10|1997-06-14|1997-07-05|NONE|MAIL|excuses haggle across the regular, bold acc +26721|1722|7|5|16|25979.52|0.09|0.03|N|O|1997-07-01|1997-05-11|1997-07-16|TAKE BACK RETURN|RAIL|g the furiously ironic theod +26721|381|82|6|50|64069.00|0.02|0.00|N|O|1997-05-05|1997-04-29|1997-06-04|DELIVER IN PERSON|MAIL| Tiresias dete +26721|1350|27|7|11|13764.85|0.05|0.07|N|O|1997-05-30|1997-06-13|1997-06-27|COLLECT COD|AIR|telets cajole +26722|747|48|1|24|39545.76|0.05|0.02|N|O|1996-06-17|1996-07-16|1996-07-07|DELIVER IN PERSON|MAIL|s. quickly silent deposits wake f +26722|500|30|2|32|44816.00|0.00|0.05|N|O|1996-07-19|1996-06-15|1996-08-07|DELIVER IN PERSON|FOB|ent deposits eat about the slyly +26722|1783|26|3|26|43804.28|0.05|0.03|N|O|1996-07-24|1996-06-25|1996-08-13|COLLECT COD|FOB|bout the ironic pac +26722|1169|70|4|40|42806.40|0.02|0.05|N|O|1996-06-21|1996-08-06|1996-07-19|NONE|AIR| unusual packages. theodolites sleep +26722|395|96|5|1|1295.39|0.08|0.07|N|O|1996-06-13|1996-08-08|1996-07-06|NONE|FOB|lyly pending packa +26723|248|30|1|10|11482.40|0.02|0.07|R|F|1995-03-29|1995-05-12|1995-04-24|DELIVER IN PERSON|AIR|refully across the ironic, +26723|208|36|2|50|55410.00|0.08|0.03|A|F|1995-04-04|1995-05-11|1995-04-10|DELIVER IN PERSON|MAIL|s wake. final deposits x-ray +26723|30|81|3|32|29760.96|0.09|0.01|A|F|1995-05-09|1995-05-21|1995-06-04|NONE|MAIL|ckly furiously +26723|1482|22|4|10|13834.80|0.06|0.03|N|F|1995-06-10|1995-05-30|1995-06-26|DELIVER IN PERSON|AIR|r packages. deposits against the q +26723|1320|35|5|14|17098.48|0.01|0.03|R|F|1995-03-12|1995-05-18|1995-03-30|NONE|FOB|al platelets hi +26724|524|25|1|33|47009.16|0.04|0.00|R|F|1994-03-30|1994-04-10|1994-04-29|DELIVER IN PERSON|SHIP|sts haggle quickly. b +26724|1542|43|2|37|53410.98|0.09|0.08|R|F|1994-03-18|1994-05-01|1994-04-12|NONE|RAIL|ptotes are qui +26724|1678|79|3|13|20535.71|0.10|0.08|A|F|1994-02-08|1994-04-08|1994-03-03|COLLECT COD|REG AIR|ng ideas wake: regular, even requests s +26724|411|12|4|15|19671.15|0.06|0.07|R|F|1994-04-25|1994-03-12|1994-05-13|COLLECT COD|RAIL|nding pinto beans integrate closely after +26724|1248|86|5|4|4596.96|0.01|0.06|R|F|1994-03-15|1994-04-26|1994-04-10|NONE|RAIL|e. requests after the un +26724|1927|72|6|12|21947.04|0.09|0.03|R|F|1994-05-05|1994-05-06|1994-05-25|NONE|FOB| boost: furiously even instructio +26725|506|37|1|28|39382.00|0.07|0.02|N|O|1998-07-10|1998-07-08|1998-07-27|TAKE BACK RETURN|REG AIR|y regular warthog +26726|959|94|1|24|44638.80|0.03|0.06|A|F|1993-01-15|1993-03-03|1993-02-14|TAKE BACK RETURN|TRUCK|ajole boldl +26726|1052|23|2|23|21920.15|0.09|0.07|A|F|1993-01-17|1993-02-24|1993-02-02|COLLECT COD|TRUCK|packages. deposits wake blithely ruth +26726|1842|29|3|17|29645.28|0.05|0.06|A|F|1993-02-08|1993-02-11|1993-02-27|NONE|RAIL| unusual requests boost furiousl +26726|1928|17|4|3|5489.76|0.05|0.01|R|F|1993-01-26|1993-02-27|1993-02-23|DELIVER IN PERSON|REG AIR|eans. slyly final packages affix. fur +26726|1844|31|5|5|8729.20|0.03|0.00|A|F|1993-02-16|1993-03-02|1993-03-05|TAKE BACK RETURN|FOB|quests. furiously ironic +26726|1410|89|6|5|6557.05|0.05|0.08|R|F|1993-03-09|1993-03-12|1993-03-11|TAKE BACK RETURN|FOB| bold, ironic pinto beans. quickly sp +26726|1059|65|7|37|35521.85|0.02|0.07|A|F|1993-04-25|1993-03-03|1993-04-29|NONE|REG AIR|quests. bold, f +26727|260|88|1|39|45250.14|0.05|0.05|N|O|1998-09-24|1998-07-16|1998-10-06|COLLECT COD|RAIL|. unusual deposits mold ruthlessly slyly +26727|362|19|2|38|47969.68|0.06|0.04|N|O|1998-07-20|1998-08-29|1998-08-18|DELIVER IN PERSON|FOB|ly enticing requests +26727|33|59|3|39|36388.17|0.01|0.03|N|O|1998-08-12|1998-08-23|1998-09-02|COLLECT COD|RAIL| slyly during the pending, exp +26727|1558|39|4|3|4378.65|0.09|0.02|N|O|1998-09-07|1998-08-26|1998-10-02|COLLECT COD|TRUCK|ng hockey players +26727|1949|50|5|41|75888.54|0.09|0.06|N|O|1998-07-19|1998-07-22|1998-07-31|NONE|AIR| packages. bold requests +26752|130|83|1|13|13391.69|0.00|0.03|N|O|1996-08-26|1996-09-19|1996-09-02|NONE|AIR|ithely. furiously ev +26752|966|69|2|4|7467.84|0.10|0.06|N|O|1996-10-08|1996-10-06|1996-11-06|COLLECT COD|AIR|un at the ironic, ruthless reques +26752|953|88|3|37|68596.15|0.04|0.03|N|O|1996-07-31|1996-09-10|1996-08-17|DELIVER IN PERSON|RAIL|egular platelets boost blithely. slyly +26753|1134|43|1|42|43475.46|0.06|0.02|R|F|1992-11-08|1992-11-27|1992-11-16|NONE|AIR|eep carefull +26753|84|60|2|24|23617.92|0.09|0.03|A|F|1992-12-19|1992-12-15|1993-01-07|DELIVER IN PERSON|FOB|its about the furiously pending ac +26754|189|42|1|2|2178.36|0.05|0.06|N|O|1998-04-27|1998-04-11|1998-05-15|TAKE BACK RETURN|MAIL| ironic instructions: unusua +26754|1496|97|2|27|37732.23|0.10|0.03|N|O|1998-03-18|1998-03-29|1998-04-05|NONE|AIR|s wake quickly. blithely +26754|379|80|3|32|40939.84|0.09|0.00|N|O|1998-04-21|1998-04-17|1998-05-17|TAKE BACK RETURN|FOB|the furiously bold packages. spe +26754|894|94|4|19|34102.91|0.02|0.03|N|O|1998-03-30|1998-05-04|1998-04-27|NONE|TRUCK|accounts nag: +26754|880|47|5|20|35617.60|0.03|0.08|N|O|1998-04-13|1998-03-18|1998-05-05|TAKE BACK RETURN|MAIL|he carefully special du +26754|1960|93|6|4|7447.84|0.01|0.03|N|O|1998-03-19|1998-03-31|1998-04-08|NONE|RAIL|quests haggle about the carefully even +26755|914|83|1|35|63521.85|0.08|0.07|N|O|1996-12-05|1997-01-06|1996-12-17|DELIVER IN PERSON|AIR| quickly bold requests +26755|206|61|2|16|17699.20|0.00|0.04|N|O|1997-01-17|1997-02-08|1997-02-03|DELIVER IN PERSON|TRUCK|ording to the +26755|65|16|3|26|25091.56|0.00|0.07|N|O|1997-02-14|1997-02-01|1997-03-06|COLLECT COD|RAIL|ely final dolph +26755|1884|14|4|34|60719.92|0.04|0.04|N|O|1997-03-15|1997-03-04|1997-03-23|COLLECT COD|REG AIR|ggle. quickly regular +26755|1774|59|5|41|68706.57|0.05|0.03|N|O|1997-03-04|1997-01-19|1997-03-17|DELIVER IN PERSON|MAIL|lets sleep furiously about the close, final +26756|38|39|1|33|30954.99|0.06|0.00|A|F|1992-08-06|1992-07-28|1992-08-07|DELIVER IN PERSON|AIR|r platelets boost according to +26756|317|18|2|1|1217.31|0.06|0.00|A|F|1992-06-03|1992-07-14|1992-06-13|DELIVER IN PERSON|REG AIR|s. carefully silent requests cajole +26756|1386|63|3|33|42483.54|0.02|0.05|A|F|1992-05-31|1992-08-09|1992-06-09|DELIVER IN PERSON|MAIL|usual deposits about +26756|245|46|4|26|29776.24|0.08|0.04|R|F|1992-07-05|1992-07-28|1992-07-09|TAKE BACK RETURN|TRUCK| the carefully special platelets. i +26756|1|77|5|27|24327.00|0.05|0.06|A|F|1992-08-11|1992-06-14|1992-08-14|COLLECT COD|SHIP|ironic dolp +26756|983|52|6|12|22607.76|0.02|0.04|A|F|1992-07-11|1992-06-10|1992-08-03|NONE|AIR| boldly regular requests detect qu +26757|1181|90|1|45|48698.10|0.09|0.06|N|O|1997-01-31|1997-01-05|1997-02-06|NONE|AIR|even courts sleep. pending, final packages +26758|1477|95|1|46|63409.62|0.09|0.05|R|F|1994-06-30|1994-07-27|1994-07-16|TAKE BACK RETURN|SHIP| bold dependencies cajole blithely +26758|84|60|2|46|45267.68|0.06|0.07|R|F|1994-06-25|1994-08-04|1994-07-20|COLLECT COD|FOB| the final packages. blithel +26758|493|81|3|8|11147.92|0.01|0.07|A|F|1994-07-07|1994-08-22|1994-08-01|NONE|TRUCK|ests. slyly special packages abov +26758|1728|13|4|42|68448.24|0.07|0.07|A|F|1994-08-21|1994-07-18|1994-08-25|COLLECT COD|TRUCK|n accounts are furiously after the car +26758|114|15|5|26|26366.86|0.04|0.01|R|F|1994-09-15|1994-07-03|1994-09-24|TAKE BACK RETURN|MAIL|y regular accounts. special, +26759|752|53|1|5|8263.75|0.02|0.08|A|F|1992-02-13|1992-03-13|1992-02-27|DELIVER IN PERSON|AIR| foxes. never sile +26759|415|45|2|47|61824.27|0.09|0.01|A|F|1992-03-15|1992-02-26|1992-04-10|NONE|SHIP|ong the boldly regular pinto beans? slyl +26759|1234|35|3|38|43138.74|0.02|0.04|A|F|1992-05-22|1992-04-14|1992-06-07|DELIVER IN PERSON|REG AIR|packages. q +26759|1241|16|4|12|13706.88|0.09|0.06|R|F|1992-04-09|1992-03-05|1992-04-10|TAKE BACK RETURN|AIR|ter the instructions haggle +26759|355|12|5|47|59001.45|0.08|0.02|A|F|1992-04-23|1992-04-15|1992-05-20|NONE|AIR|to beans. bli +26759|73|49|6|25|24326.75|0.04|0.06|A|F|1992-02-25|1992-03-11|1992-03-17|NONE|RAIL|aves. silent ideas after the sp +26759|950|53|7|2|3701.90|0.00|0.04|R|F|1992-01-28|1992-04-16|1992-02-13|COLLECT COD|SHIP|leep furiously slyly unusu +26784|1137|38|1|47|48792.11|0.04|0.00|R|F|1993-10-26|1993-09-23|1993-11-03|COLLECT COD|AIR|regular requests affix quickly pac +26784|100|1|2|11|11001.10|0.08|0.04|A|F|1993-11-08|1993-09-29|1993-12-01|NONE|MAIL|kages. accounts believe after the furiousl +26784|1585|6|3|50|74329.00|0.07|0.01|A|F|1993-08-18|1993-09-24|1993-09-03|TAKE BACK RETURN|SHIP|x regular, final ideas. express, fi +26784|1089|25|4|5|4950.40|0.04|0.04|A|F|1993-09-19|1993-10-05|1993-10-19|COLLECT COD|RAIL|ar deposits. furiousl +26785|1857|58|1|12|21106.20|0.07|0.00|N|O|1996-08-27|1996-09-20|1996-08-30|NONE|TRUCK|nal packages among the sile +26785|818|19|2|45|77346.45|0.10|0.00|N|O|1996-10-03|1996-09-20|1996-10-17|TAKE BACK RETURN|TRUCK|cuses. foxes solve furiously final f +26785|1824|25|3|29|50048.78|0.04|0.02|N|O|1996-09-11|1996-08-12|1996-09-25|NONE|REG AIR|riously silent platelets use +26785|601|95|4|5|7508.00|0.06|0.00|N|O|1996-07-30|1996-09-12|1996-08-25|COLLECT COD|RAIL|hely furiously special de +26785|248|3|5|3|3444.72|0.10|0.03|N|O|1996-08-03|1996-08-02|1996-08-28|DELIVER IN PERSON|AIR|ts sleep carefully bold accounts. qu +26786|260|88|1|11|12762.86|0.02|0.01|R|F|1993-07-11|1993-06-24|1993-07-17|DELIVER IN PERSON|AIR|wake slyly regular +26786|852|19|2|14|24539.90|0.00|0.07|A|F|1993-07-23|1993-05-09|1993-08-12|TAKE BACK RETURN|RAIL|al instructions +26786|1887|88|3|12|21466.56|0.00|0.00|R|F|1993-07-30|1993-06-11|1993-08-12|DELIVER IN PERSON|TRUCK|slyly iron +26786|768|1|4|32|53400.32|0.08|0.00|R|F|1993-06-17|1993-05-12|1993-06-30|DELIVER IN PERSON|SHIP|y regular theodolites across the +26786|1398|13|5|26|33784.14|0.03|0.02|A|F|1993-07-23|1993-05-26|1993-08-05|DELIVER IN PERSON|MAIL|s foxes. fluffily final instructions +26786|1342|43|6|4|4973.36|0.07|0.08|A|F|1993-07-24|1993-05-19|1993-08-14|TAKE BACK RETURN|FOB|ironic, regular excu +26787|339|24|1|49|60727.17|0.01|0.02|N|O|1995-10-26|1995-11-19|1995-11-06|NONE|TRUCK|eas poach dari +26787|841|41|2|3|5225.52|0.01|0.06|N|O|1995-10-11|1995-11-22|1995-10-20|DELIVER IN PERSON|SHIP|ly regular instru +26787|160|39|3|29|30744.64|0.00|0.01|N|O|1995-12-14|1995-12-06|1995-12-23|COLLECT COD|AIR|mold regular request +26787|364|21|4|17|21494.12|0.03|0.04|N|O|1995-11-08|1995-11-22|1995-11-16|NONE|REG AIR|y. final, fin +26788|1491|70|1|6|8354.94|0.00|0.06|R|F|1993-04-30|1993-03-07|1993-05-21|NONE|SHIP|uickly final excuses a +26788|1727|12|2|26|42346.72|0.04|0.06|R|F|1993-04-08|1993-05-02|1993-04-17|DELIVER IN PERSON|RAIL|ing, bold deposits use quickly. quickly fi +26788|1255|56|3|29|33531.25|0.01|0.00|A|F|1993-05-28|1993-03-10|1993-06-18|TAKE BACK RETURN|SHIP|ong the special packages. unusual, bold +26788|1407|86|4|12|15700.80|0.05|0.02|R|F|1993-02-12|1993-03-27|1993-02-20|DELIVER IN PERSON|MAIL|thely. quickly re +26788|981|16|5|25|47049.50|0.02|0.01|A|F|1993-02-04|1993-03-19|1993-02-25|TAKE BACK RETURN|AIR|ites. carefully enticing asymptotes a +26788|420|79|6|40|52816.80|0.05|0.07|R|F|1993-04-23|1993-04-23|1993-05-05|DELIVER IN PERSON|FOB|nic excuses are slyly. fluffily i +26789|167|94|1|33|35216.28|0.04|0.05|R|F|1994-07-19|1994-05-22|1994-08-14|TAKE BACK RETURN|RAIL| boost carefully. fluffil +26790|846|80|1|4|6987.36|0.00|0.02|N|O|1997-03-12|1997-01-13|1997-03-23|DELIVER IN PERSON|TRUCK|nal accounts around the slyly +26790|1250|88|2|16|18420.00|0.01|0.06|N|O|1996-12-20|1996-12-17|1997-01-10|NONE|SHIP|gle blithely according to the somas. unus +26790|427|15|3|6|7964.52|0.01|0.00|N|O|1996-11-29|1996-12-14|1996-12-26|COLLECT COD|AIR|e of the quickly regular acco +26790|429|30|4|19|25258.98|0.03|0.01|N|O|1996-11-28|1997-01-13|1996-12-09|TAKE BACK RETURN|SHIP|ses. blithely fina +26790|312|97|5|13|15760.03|0.03|0.07|N|O|1997-02-16|1997-02-02|1997-02-22|DELIVER IN PERSON|MAIL|fluffy pinto +26790|1768|53|6|11|18367.36|0.04|0.06|N|O|1997-03-10|1997-01-13|1997-03-22|COLLECT COD|AIR|ide of the car +26790|437|38|7|8|10699.44|0.04|0.01|N|O|1996-12-10|1997-02-01|1996-12-27|TAKE BACK RETURN|AIR|quests nag slyly agains +26791|296|24|1|46|55029.34|0.02|0.03|A|F|1995-05-01|1995-06-06|1995-05-18|COLLECT COD|AIR|carefully ironic platelets. din +26791|815|49|2|32|54905.92|0.09|0.04|N|O|1995-07-28|1995-06-10|1995-08-14|COLLECT COD|RAIL|ly final excuses. bravely regular deposits +26791|1429|47|3|31|41243.02|0.08|0.02|N|O|1995-08-19|1995-07-01|1995-09-02|NONE|REG AIR|y ironic excuse +26791|1600|41|4|10|15016.00|0.02|0.08|N|O|1995-07-20|1995-06-15|1995-07-25|DELIVER IN PERSON|REG AIR|final, dogge +26791|742|7|5|38|62424.12|0.05|0.04|R|F|1995-05-07|1995-06-27|1995-05-20|DELIVER IN PERSON|TRUCK|. requests alo +26816|1939|40|1|37|68114.41|0.02|0.03|A|F|1993-10-22|1993-10-24|1993-11-06|COLLECT COD|TRUCK|riously expr +26816|529|60|2|38|54321.76|0.00|0.00|A|F|1993-09-03|1993-10-31|1993-09-27|TAKE BACK RETURN|SHIP|grate among the carefully ev +26816|119|46|3|7|7133.77|0.06|0.01|R|F|1993-09-27|1993-09-10|1993-10-13|DELIVER IN PERSON|RAIL| even foxes wake caref +26817|154|81|1|44|46382.60|0.08|0.02|N|O|1998-05-09|1998-06-05|1998-05-29|DELIVER IN PERSON|REG AIR|ts. ironic, +26817|772|73|2|11|18400.47|0.03|0.02|N|O|1998-04-16|1998-06-01|1998-05-13|DELIVER IN PERSON|REG AIR| the silent requests +26817|1944|45|3|11|20305.34|0.03|0.06|N|O|1998-07-27|1998-06-21|1998-07-30|COLLECT COD|SHIP|fily. finally bold ideas try to w +26817|1579|60|4|42|62183.94|0.00|0.08|N|O|1998-06-17|1998-05-30|1998-06-19|DELIVER IN PERSON|TRUCK|tes. furiously ironic acco +26818|1355|32|1|29|36434.15|0.10|0.07|R|F|1992-03-20|1992-03-29|1992-04-04|DELIVER IN PERSON|FOB|le blithely. furiously blithe pack +26818|1217|18|2|50|55910.50|0.03|0.00|A|F|1992-01-18|1992-03-03|1992-02-04|DELIVER IN PERSON|REG AIR|equests detect fluffily about th +26818|834|1|3|50|86741.50|0.09|0.06|A|F|1992-04-30|1992-02-29|1992-05-15|TAKE BACK RETURN|AIR|ress epitaphs. ironic instruc +26818|1796|23|4|50|84889.50|0.07|0.08|A|F|1992-01-21|1992-03-12|1992-02-17|TAKE BACK RETURN|RAIL|e. furiously regular reque +26818|1563|64|5|3|4393.68|0.05|0.06|A|F|1992-04-29|1992-04-02|1992-05-29|COLLECT COD|TRUCK|regular, regular dep +26818|1552|93|6|30|43606.50|0.05|0.02|R|F|1992-04-15|1992-02-22|1992-04-29|TAKE BACK RETURN|REG AIR|instruction +26818|1810|97|7|3|5135.43|0.01|0.04|A|F|1992-05-01|1992-02-19|1992-05-20|DELIVER IN PERSON|FOB|ly regular platelets. final s +26819|67|18|1|4|3868.24|0.10|0.08|N|O|1996-03-21|1996-02-21|1996-04-16|COLLECT COD|MAIL|kages are fluffily quickly expr +26820|1503|84|1|8|11236.00|0.04|0.00|R|F|1994-10-09|1994-09-08|1994-10-16|NONE|AIR|s are blithely blithely ironic deposit +26821|331|88|1|44|54178.52|0.00|0.00|N|O|1995-12-25|1996-02-18|1996-01-07|TAKE BACK RETURN|SHIP|o nag against the final r +26821|1969|70|2|6|11225.76|0.10|0.05|N|O|1996-03-24|1996-02-14|1996-04-12|NONE|RAIL|ing packages integrate. c +26821|896|63|3|48|86250.72|0.10|0.07|N|O|1996-03-05|1996-01-01|1996-03-06|TAKE BACK RETURN|REG AIR| carefully fi +26822|1247|48|1|20|22964.80|0.07|0.05|A|F|1994-07-18|1994-07-24|1994-07-23|NONE|SHIP|x furiously according +26822|564|65|2|22|32220.32|0.06|0.06|R|F|1994-06-17|1994-06-13|1994-06-26|COLLECT COD|TRUCK|accounts haggle blithely. stealth +26822|1548|89|3|9|13045.86|0.05|0.08|R|F|1994-06-10|1994-07-03|1994-07-07|DELIVER IN PERSON|AIR|he pending accounts. regu +26822|1996|97|4|28|53143.72|0.10|0.01|R|F|1994-07-26|1994-08-03|1994-08-21|COLLECT COD|MAIL|e special, regular instructions +26823|1311|88|1|41|49704.71|0.09|0.00|N|O|1997-04-26|1997-07-01|1997-05-21|NONE|RAIL| carefully special requests +26848|264|19|1|26|30270.76|0.03|0.00|N|O|1995-06-23|1995-05-31|1995-06-26|DELIVER IN PERSON|TRUCK|o the slyly even instr +26848|490|49|2|21|29200.29|0.07|0.00|R|F|1995-03-18|1995-05-05|1995-03-28|NONE|AIR| beans. ironic accounts wake furio +26848|999|68|3|36|68399.64|0.09|0.05|A|F|1995-05-10|1995-04-13|1995-06-01|TAKE BACK RETURN|AIR|rding to the regular, bold foxes. quickl +26848|235|17|4|1|1135.23|0.03|0.00|N|O|1995-06-30|1995-06-02|1995-07-18|COLLECT COD|FOB| wake above the blithely final real +26848|1878|79|5|17|30257.79|0.01|0.07|N|O|1995-07-02|1995-04-17|1995-07-22|COLLECT COD|AIR|uctions boost careful +26849|1474|14|1|46|63271.62|0.09|0.01|N|O|1998-06-20|1998-05-13|1998-07-08|NONE|SHIP|gular, final deposits. asymptotes snoo +26849|651|14|2|35|54307.75|0.08|0.04|N|O|1998-05-25|1998-06-13|1998-06-19|DELIVER IN PERSON|REG AIR|ly across the furiously expre +26849|156|57|3|3|3168.45|0.05|0.07|N|O|1998-04-30|1998-06-05|1998-05-18|COLLECT COD|MAIL|ers. carefully iron +26850|1140|13|1|2|2082.28|0.01|0.02|N|O|1996-02-17|1996-03-02|1996-02-22|DELIVER IN PERSON|SHIP|ests. furiously pending pinto b +26850|1465|44|2|20|27329.20|0.10|0.01|N|O|1995-12-07|1996-03-03|1995-12-25|COLLECT COD|REG AIR|egular requests nag +26850|1962|51|3|20|37279.20|0.07|0.04|N|O|1995-12-07|1996-01-16|1995-12-22|COLLECT COD|SHIP|ts sleep quickly final packages. +26850|1656|98|4|27|42056.55|0.03|0.08|N|O|1995-12-26|1996-02-23|1996-01-12|NONE|AIR|pinto beans alongside of the furiously u +26850|1120|29|5|8|8168.96|0.10|0.00|N|O|1996-01-20|1996-01-24|1996-02-17|DELIVER IN PERSON|MAIL|ns wake slyly. reques +26850|1966|11|6|12|22415.52|0.08|0.06|N|O|1996-04-03|1996-02-02|1996-04-27|DELIVER IN PERSON|MAIL|cies sublate. final deposits boost pend +26851|1191|28|1|4|4368.76|0.03|0.00|N|O|1995-08-13|1995-10-09|1995-08-28|COLLECT COD|AIR|theodolite +26851|1093|94|2|2|1988.18|0.00|0.07|N|O|1995-09-02|1995-09-30|1995-09-17|NONE|FOB|, regular pinto beans integ +26851|693|56|3|11|17530.59|0.08|0.07|N|O|1995-10-09|1995-10-22|1995-10-30|TAKE BACK RETURN|RAIL|telets affix ideas. blithely special ideas +26852|1641|42|1|47|72504.08|0.07|0.04|R|F|1993-07-01|1993-05-06|1993-07-11|COLLECT COD|AIR|ar deposits in place +26852|164|65|2|7|7449.12|0.01|0.05|A|F|1993-05-12|1993-06-04|1993-05-22|DELIVER IN PERSON|MAIL| regular dolphins! quickly unusual request +26853|1146|19|1|20|20942.80|0.04|0.01|A|F|1992-09-10|1992-07-18|1992-09-12|COLLECT COD|SHIP|express foxes +26853|526|87|2|20|28530.40|0.10|0.06|A|F|1992-08-22|1992-08-25|1992-08-24|DELIVER IN PERSON|FOB| fluffily r +26853|1294|32|3|16|19124.64|0.02|0.01|A|F|1992-07-03|1992-09-08|1992-07-18|DELIVER IN PERSON|AIR|into beans hagg +26853|82|83|4|8|7856.64|0.09|0.06|A|F|1992-08-24|1992-07-24|1992-09-08|TAKE BACK RETURN|REG AIR|tructions inside the blithely even th +26853|1178|79|5|1|1079.17|0.05|0.00|A|F|1992-06-22|1992-07-13|1992-06-29|DELIVER IN PERSON|SHIP|ve the bold accounts. final foxes acro +26853|1931|32|6|47|86147.71|0.06|0.02|A|F|1992-07-25|1992-09-10|1992-08-17|DELIVER IN PERSON|SHIP|e unusual, quick pinto beans n +26854|1360|61|1|33|41624.88|0.01|0.06|A|F|1994-07-31|1994-09-05|1994-08-12|TAKE BACK RETURN|FOB| furiously ironic packa +26854|1483|1|2|34|47072.32|0.01|0.03|A|F|1994-07-16|1994-08-21|1994-07-19|COLLECT COD|TRUCK|iously regular instructions are across the +26854|366|67|3|39|49388.04|0.04|0.07|R|F|1994-09-30|1994-08-27|1994-10-17|TAKE BACK RETURN|FOB|foxes. ironica +26854|563|24|4|23|33661.88|0.09|0.07|R|F|1994-07-16|1994-08-07|1994-07-30|COLLECT COD|SHIP|eposits: closely even accounts +26854|859|93|5|37|65114.45|0.06|0.06|R|F|1994-08-29|1994-07-24|1994-09-19|COLLECT COD|REG AIR|rint slyly above t +26855|343|44|1|30|37300.20|0.10|0.07|R|F|1994-06-05|1994-04-15|1994-07-02|DELIVER IN PERSON|MAIL| platelets. slyly bold requests s +26880|689|21|1|46|73125.28|0.02|0.00|N|O|1996-03-13|1996-02-25|1996-03-31|TAKE BACK RETURN|RAIL|al pinto beans. furiously final accou +26881|650|82|1|22|34114.30|0.03|0.03|A|F|1994-08-05|1994-10-04|1994-08-14|TAKE BACK RETURN|TRUCK|n deposits. fluffily regular accounts +26881|861|61|2|9|15856.74|0.02|0.06|A|F|1994-10-19|1994-09-27|1994-10-22|DELIVER IN PERSON|REG AIR|to the accounts. carefully regular ideas se +26881|1286|98|3|9|10685.52|0.02|0.07|R|F|1994-10-29|1994-09-12|1994-11-04|NONE|TRUCK|grate. regular requests above the theod +26881|1619|2|4|5|7603.05|0.06|0.02|A|F|1994-10-20|1994-10-02|1994-11-02|NONE|REG AIR|l foxes. blithely ironic accounts aga +26882|178|5|1|45|48517.65|0.06|0.00|N|O|1995-10-18|1995-08-05|1995-11-03|TAKE BACK RETURN|MAIL|mong the express +26882|1353|30|2|21|26341.35|0.02|0.01|N|O|1995-08-16|1995-09-12|1995-09-15|DELIVER IN PERSON|REG AIR|ggle quietly spe +26882|1100|6|3|10|10011.00|0.09|0.06|N|O|1995-07-22|1995-08-20|1995-07-29|COLLECT COD|SHIP|y pending packages +26882|889|23|4|25|44747.00|0.03|0.08|N|O|1995-07-07|1995-09-14|1995-07-26|NONE|REG AIR|ully ironi +26882|308|37|5|32|38665.60|0.04|0.02|N|O|1995-07-22|1995-09-06|1995-08-02|TAKE BACK RETURN|REG AIR|es are! iron +26883|1574|75|1|31|45742.67|0.07|0.08|A|F|1992-05-01|1992-04-09|1992-05-15|COLLECT COD|RAIL|al packages grow bl +26884|823|23|1|39|67228.98|0.09|0.04|A|F|1993-05-18|1993-05-05|1993-06-16|TAKE BACK RETURN|AIR|ts integrate quickl +26884|575|6|2|27|39840.39|0.10|0.00|A|F|1993-03-30|1993-05-06|1993-04-20|COLLECT COD|REG AIR|ong the carefully eve +26884|1869|13|3|47|83230.42|0.07|0.08|R|F|1993-04-11|1993-05-12|1993-05-10|DELIVER IN PERSON|TRUCK|lyly express braids +26885|1095|1|1|27|26894.43|0.08|0.08|N|O|1997-08-27|1997-07-12|1997-08-29|TAKE BACK RETURN|FOB|luffily bold theodolites +26885|1083|89|2|13|12793.04|0.03|0.03|N|O|1997-08-14|1997-06-23|1997-08-25|NONE|AIR|sly final ideas sleep. blithely bold ideas +26885|1704|5|3|29|46565.30|0.04|0.00|N|O|1997-06-06|1997-06-17|1997-07-04|NONE|TRUCK| quick, special packages are fur +26885|386|87|4|25|32159.50|0.00|0.04|N|O|1997-06-22|1997-07-02|1997-06-27|DELIVER IN PERSON|FOB|lyly special d +26885|1179|52|5|32|34565.44|0.05|0.02|N|O|1997-08-02|1997-07-02|1997-08-26|NONE|SHIP|al pinto bea +26885|1166|67|6|27|28813.32|0.05|0.07|N|O|1997-07-04|1997-07-31|1997-07-24|COLLECT COD|REG AIR|yly final packages. furiously speci +26885|183|10|7|41|44410.38|0.02|0.01|N|O|1997-08-22|1997-08-09|1997-09-03|TAKE BACK RETURN|TRUCK|thely even requests nag carefully. +26886|262|17|1|48|55788.48|0.02|0.05|N|O|1995-08-23|1995-08-02|1995-09-18|COLLECT COD|SHIP|sts integrate furi +26887|265|47|1|6|6991.56|0.00|0.06|N|O|1995-06-22|1995-06-28|1995-07-04|NONE|MAIL|foxes. fluffily ironic accounts wake sp +26887|268|69|2|43|50235.18|0.04|0.06|N|O|1995-09-04|1995-06-21|1995-09-23|DELIVER IN PERSON|REG AIR| deposits above the sly dep +26887|1005|41|3|4|3624.00|0.03|0.07|A|F|1995-05-18|1995-06-18|1995-06-03|COLLECT COD|AIR|al requests haggle blit +26887|1218|56|4|45|50364.45|0.02|0.07|A|F|1995-05-17|1995-07-12|1995-05-31|TAKE BACK RETURN|MAIL| quickly final +26887|1213|88|5|17|18941.57|0.08|0.01|N|F|1995-05-28|1995-07-25|1995-06-26|DELIVER IN PERSON|TRUCK|ly regular accounts a +26912|1200|37|1|5|5506.00|0.00|0.02|R|F|1992-05-12|1992-06-22|1992-05-20|COLLECT COD|FOB|y courts. packages h +26912|237|38|2|1|1137.23|0.09|0.04|A|F|1992-05-14|1992-06-13|1992-05-17|DELIVER IN PERSON|AIR|ld deposits haggle slyly carefully unusua +26912|1393|32|3|5|6471.95|0.08|0.03|R|F|1992-06-20|1992-06-09|1992-07-17|COLLECT COD|RAIL|st slyly. even, silent instructio +26913|917|18|1|37|67262.67|0.05|0.04|A|F|1994-10-22|1994-12-09|1994-11-07|NONE|RAIL|ular depos +26913|200|1|2|48|52809.60|0.10|0.05|A|F|1995-01-05|1994-11-11|1995-02-02|COLLECT COD|MAIL|refully unusual packages. ex +26913|961|96|3|32|59582.72|0.02|0.04|A|F|1995-01-15|1994-11-14|1995-02-01|NONE|FOB|y even dolphins: blithe +26913|391|76|4|22|28410.58|0.03|0.02|A|F|1994-12-16|1994-12-18|1995-01-13|DELIVER IN PERSON|REG AIR|ular accounts are slyly ev +26914|339|24|1|40|49573.20|0.00|0.03|N|O|1997-01-14|1996-12-10|1997-01-24|TAKE BACK RETURN|REG AIR|alongside of the quickly pending depo +26914|1468|47|2|1|1369.46|0.03|0.02|N|O|1997-01-29|1996-12-19|1997-01-30|COLLECT COD|REG AIR|ual accounts. quickly regula +26914|1177|86|3|40|43126.80|0.03|0.04|N|O|1997-02-12|1997-01-27|1997-03-03|TAKE BACK RETURN|TRUCK|al accounts grow after the iron +26914|1642|25|4|22|33960.08|0.07|0.06|N|O|1997-01-24|1997-01-11|1997-02-08|COLLECT COD|AIR|r courts s +26915|211|39|1|50|55560.50|0.00|0.07|N|O|1996-05-01|1996-03-17|1996-05-10|COLLECT COD|RAIL| blithely fina +26915|92|68|2|21|20833.89|0.09|0.01|N|O|1996-04-24|1996-03-30|1996-05-13|DELIVER IN PERSON|MAIL|ly regular d +26915|221|22|3|45|50454.90|0.04|0.07|N|O|1996-02-02|1996-03-05|1996-02-29|DELIVER IN PERSON|FOB| eat slyly above the regular pi +26915|912|15|4|21|38071.11|0.06|0.05|N|O|1996-03-03|1996-03-19|1996-03-14|NONE|MAIL|quickly fi +26915|1440|58|5|34|45608.96|0.07|0.00|N|O|1996-02-12|1996-02-19|1996-02-21|TAKE BACK RETURN|AIR|ic, regular packages. fluffil +26915|681|75|6|31|49032.08|0.07|0.02|N|O|1996-01-31|1996-02-14|1996-02-22|COLLECT COD|AIR|thely final packages. blithely eve +26915|1510|31|7|26|36699.26|0.00|0.02|N|O|1996-02-26|1996-02-18|1996-03-02|DELIVER IN PERSON|REG AIR|mes brave deposits alongside of +26916|1191|100|1|25|27304.75|0.05|0.05|R|F|1993-08-14|1993-08-09|1993-08-22|TAKE BACK RETURN|AIR| platelets sleep carefully according to the +26916|182|35|2|13|14068.34|0.02|0.06|R|F|1993-09-13|1993-08-09|1993-10-04|NONE|REG AIR|fully permanent requests haggle qui +26916|870|4|3|19|33646.53|0.04|0.00|R|F|1993-10-14|1993-09-03|1993-11-08|COLLECT COD|AIR|the never special theodoli +26916|761|58|4|2|3323.52|0.00|0.02|A|F|1993-09-22|1993-08-19|1993-09-23|COLLECT COD|FOB| quickly special theodolite +26916|1286|24|5|28|33243.84|0.10|0.00|R|F|1993-07-12|1993-08-28|1993-07-22|DELIVER IN PERSON|SHIP|onic deposits w +26916|289|17|6|13|15460.64|0.06|0.00|A|F|1993-09-25|1993-09-12|1993-10-17|NONE|AIR|ites. deposits haggle carefully accor +26917|1181|18|1|9|9739.62|0.03|0.04|N|O|1996-01-06|1996-01-30|1996-02-01|TAKE BACK RETURN|FOB|n deposits can cajole. unusual, +26918|1208|9|1|17|18856.40|0.01|0.07|A|F|1994-04-09|1994-06-26|1994-04-26|TAKE BACK RETURN|TRUCK|olve slyly +26918|1995|40|2|47|89158.53|0.02|0.00|A|F|1994-07-22|1994-06-18|1994-08-02|NONE|TRUCK|nts. foxes t +26918|1257|58|3|30|34747.50|0.09|0.02|R|F|1994-08-06|1994-05-17|1994-08-20|TAKE BACK RETURN|RAIL|s. carefully ironic accounts a +26918|1636|60|4|40|61505.20|0.01|0.03|R|F|1994-05-23|1994-05-15|1994-06-05|DELIVER IN PERSON|REG AIR|press, final reques +26918|439|40|5|16|21430.88|0.08|0.06|A|F|1994-04-26|1994-05-27|1994-04-27|TAKE BACK RETURN|TRUCK|wind: depo +26919|374|59|1|19|24213.03|0.08|0.00|A|F|1993-03-08|1993-02-22|1993-03-30|NONE|REG AIR|mes ironic dinos; quickl +26919|1158|59|2|37|39188.55|0.10|0.01|A|F|1993-03-08|1993-03-03|1993-03-25|DELIVER IN PERSON|REG AIR|he final deposits. +26919|1366|5|3|29|36753.44|0.03|0.00|R|F|1993-03-16|1993-01-23|1993-03-28|DELIVER IN PERSON|RAIL|carefully final pinto beans cajole above t +26919|1813|100|4|42|72022.02|0.09|0.03|R|F|1993-03-09|1993-01-23|1993-04-04|TAKE BACK RETURN|TRUCK|riously final instructions. blithel +26919|931|66|5|30|54957.90|0.01|0.03|R|F|1993-03-09|1993-02-07|1993-04-02|COLLECT COD|AIR| ironic accounts wake b +26919|634|28|6|37|56781.31|0.03|0.04|R|F|1993-01-22|1993-01-21|1993-02-06|NONE|TRUCK|eans are slyly ironic excuses. fluf +26944|1524|25|1|10|14255.20|0.03|0.01|R|F|1994-12-10|1994-12-11|1994-12-31|NONE|AIR|accounts. furiousl +26945|1604|28|1|10|15056.00|0.06|0.08|A|F|1994-04-14|1994-03-12|1994-04-20|COLLECT COD|SHIP|ckages. furiously special pinto beans sleep +26945|464|23|2|23|31382.58|0.09|0.00|R|F|1994-04-25|1994-04-05|1994-05-09|COLLECT COD|RAIL|ove the fur +26945|923|24|3|19|34654.48|0.02|0.07|A|F|1994-04-26|1994-03-23|1994-05-23|TAKE BACK RETURN|AIR|eep pinto beans +26945|953|88|4|48|88989.60|0.06|0.08|A|F|1994-03-18|1994-04-01|1994-03-28|DELIVER IN PERSON|SHIP|posits. furiously final dependen +26946|1952|41|1|26|48202.70|0.05|0.06|N|O|1997-12-08|1997-09-17|1997-12-16|TAKE BACK RETURN|MAIL| beans detect. carefully even dep +26947|1336|51|1|50|61866.50|0.05|0.04|R|F|1993-09-08|1993-07-15|1993-09-17|NONE|SHIP|ages. furiously pending req +26947|893|93|2|12|21526.68|0.02|0.00|R|F|1993-07-06|1993-07-19|1993-07-24|NONE|MAIL| even requests wake. pending, even request +26947|1536|17|3|46|66126.38|0.07|0.07|R|F|1993-06-08|1993-07-25|1993-06-13|COLLECT COD|TRUCK|nstructions cajole sl +26947|1299|74|4|19|22805.51|0.05|0.06|A|F|1993-07-06|1993-08-18|1993-07-15|COLLECT COD|TRUCK|egular accounts after th +26947|1178|15|5|20|21583.40|0.08|0.06|A|F|1993-08-16|1993-08-14|1993-09-15|TAKE BACK RETURN|FOB|y ironic deposits. busy, express +26947|1771|72|6|13|21746.01|0.00|0.04|A|F|1993-06-11|1993-08-12|1993-06-25|DELIVER IN PERSON|FOB|ccounts are slyly +26948|1467|68|1|11|15053.06|0.08|0.06|N|O|1996-02-14|1996-01-15|1996-03-13|COLLECT COD|FOB|final excuses. +26948|644|38|2|32|49428.48|0.09|0.08|N|O|1996-02-06|1996-01-16|1996-02-19|DELIVER IN PERSON|RAIL|ake quickly fl +26948|657|51|3|4|6230.60|0.07|0.07|N|O|1996-01-12|1995-12-29|1996-02-09|COLLECT COD|FOB|s are quickly blithely r +26948|1061|62|4|11|10582.66|0.06|0.07|N|O|1995-11-28|1996-01-13|1995-12-09|DELIVER IN PERSON|REG AIR| use atop the special packages. blithely b +26948|1556|57|5|23|33523.65|0.01|0.04|N|O|1995-12-20|1996-02-06|1995-12-30|NONE|AIR|ress requests. ironicall +26948|1891|35|6|17|30479.13|0.08|0.08|N|O|1995-12-13|1996-01-28|1996-01-01|DELIVER IN PERSON|REG AIR|packages. regular, specia +26949|673|36|1|8|12589.36|0.04|0.08|A|F|1994-11-02|1994-09-27|1994-11-08|TAKE BACK RETURN|RAIL| sleep carefully furiously iron +26949|896|63|2|34|61094.26|0.04|0.07|R|F|1994-10-19|1994-09-22|1994-10-25|TAKE BACK RETURN|TRUCK| quickly i +26949|439|27|3|33|44201.19|0.05|0.04|A|F|1994-11-02|1994-09-22|1994-11-20|TAKE BACK RETURN|FOB|pinto beans. blithely final accounts cajole +26949|1431|49|4|37|49299.91|0.06|0.08|A|F|1994-09-21|1994-09-25|1994-10-02|TAKE BACK RETURN|RAIL| quickly after the ir +26949|545|36|5|11|15900.94|0.06|0.03|R|F|1994-11-17|1994-09-25|1994-11-19|DELIVER IN PERSON|RAIL|ly. carefully re +26950|380|9|1|23|29448.74|0.06|0.00|N|O|1997-08-13|1997-07-16|1997-09-08|DELIVER IN PERSON|TRUCK|e ironic theodolites. blithely unusual id +26950|1023|59|2|50|46201.00|0.09|0.01|N|O|1997-06-02|1997-06-15|1997-06-08|COLLECT COD|SHIP|beans wake +26950|198|51|3|26|28552.94|0.03|0.07|N|O|1997-06-28|1997-06-17|1997-07-21|NONE|AIR|xes cajole furiously. pe +26950|11|62|4|33|30063.33|0.08|0.00|N|O|1997-08-13|1997-07-19|1997-08-28|COLLECT COD|RAIL|ests! blithely bold requ +26950|1986|87|5|23|43423.54|0.05|0.08|N|O|1997-05-26|1997-06-23|1997-06-21|COLLECT COD|REG AIR|beans. fluffily eve +26951|1300|75|1|19|22824.70|0.06|0.05|A|F|1993-05-10|1993-05-15|1993-06-06|TAKE BACK RETURN|AIR|thless, regular +26951|798|31|2|42|71349.18|0.01|0.03|A|F|1993-07-24|1993-06-03|1993-08-07|TAKE BACK RETURN|TRUCK|lithely express accounts. furiously ironic +26976|235|36|1|37|42003.51|0.00|0.08|N|O|1995-07-23|1995-07-01|1995-08-02|COLLECT COD|SHIP| pinto bea +26976|969|72|2|45|84148.20|0.03|0.03|N|F|1995-06-08|1995-07-24|1995-06-21|TAKE BACK RETURN|FOB| slyly ironic excuses haggle blithely +26976|865|66|3|13|22956.18|0.07|0.06|N|O|1995-07-30|1995-07-21|1995-08-22|NONE|AIR|special, ironic r +26976|1742|43|4|25|41093.50|0.05|0.00|N|O|1995-09-12|1995-07-28|1995-09-17|TAKE BACK RETURN|TRUCK|above the slyly regular deposits boost fur +26976|284|12|5|43|50924.04|0.03|0.01|N|O|1995-08-04|1995-06-24|1995-08-13|COLLECT COD|SHIP|. final, final +26976|897|98|6|39|70117.71|0.00|0.02|N|O|1995-08-08|1995-07-14|1995-09-01|TAKE BACK RETURN|REG AIR|. blithely regular accounts use quickly +26976|767|100|7|33|55036.08|0.05|0.08|N|O|1995-08-09|1995-08-16|1995-08-15|TAKE BACK RETURN|RAIL|es haggle blithely. +26977|104|5|1|45|45184.50|0.00|0.06|R|F|1995-01-08|1995-01-13|1995-01-12|COLLECT COD|FOB|ross the blithely pending accounts. sil +26977|741|6|2|33|54177.42|0.02|0.02|R|F|1995-02-16|1995-02-28|1995-02-25|DELIVER IN PERSON|AIR|its wake furiously. ironic +26978|344|1|1|44|54750.96|0.08|0.01|R|F|1993-09-10|1993-08-31|1993-09-18|TAKE BACK RETURN|MAIL|special requests. even, ironic accounts c +26978|97|23|2|48|47860.32|0.01|0.05|R|F|1993-08-29|1993-08-06|1993-09-05|DELIVER IN PERSON|REG AIR|furiously bold theod +26978|1083|19|3|7|6888.56|0.08|0.07|R|F|1993-08-04|1993-08-07|1993-08-28|DELIVER IN PERSON|FOB|l deposits use sly +26978|1099|70|4|14|14001.26|0.06|0.00|R|F|1993-08-22|1993-09-24|1993-09-04|TAKE BACK RETURN|MAIL|lithely pending th +26978|718|83|5|35|56654.85|0.01|0.05|A|F|1993-10-20|1993-09-23|1993-10-26|NONE|MAIL|e to doze furiously. +26978|1983|84|6|48|90479.04|0.04|0.05|R|F|1993-09-23|1993-09-11|1993-10-13|DELIVER IN PERSON|FOB| according to the qu +26978|182|9|7|1|1082.18|0.08|0.06|R|F|1993-09-24|1993-09-18|1993-09-28|TAKE BACK RETURN|AIR| platelets +26979|1074|80|1|31|30227.17|0.08|0.00|A|F|1992-06-10|1992-05-20|1992-06-18|DELIVER IN PERSON|SHIP|ts are alongside of the blith +26979|170|49|2|17|18192.89|0.05|0.04|R|F|1992-06-29|1992-06-13|1992-07-29|COLLECT COD|MAIL|usual acco +26979|1346|61|3|49|61119.66|0.02|0.08|R|F|1992-04-24|1992-06-23|1992-05-23|DELIVER IN PERSON|AIR|ans. express +26979|422|10|4|34|44962.28|0.06|0.03|R|F|1992-05-31|1992-06-24|1992-06-08|COLLECT COD|REG AIR|ithely ironic theodolit +26979|1461|79|5|33|44961.18|0.02|0.02|A|F|1992-07-20|1992-06-22|1992-07-31|NONE|REG AIR|ckages detect carefully bold +26980|606|69|1|27|40678.20|0.04|0.07|A|F|1992-08-13|1992-07-09|1992-08-18|COLLECT COD|MAIL|es poach c +26980|870|71|2|46|81460.02|0.09|0.08|A|F|1992-07-27|1992-05-31|1992-08-15|COLLECT COD|TRUCK|sual instructions. bli +26981|1016|52|1|42|38514.42|0.05|0.07|R|F|1992-11-15|1992-10-27|1992-12-03|DELIVER IN PERSON|AIR| between the sly ideas. +26981|745|10|2|47|77349.78|0.07|0.02|A|F|1992-11-25|1992-10-31|1992-12-05|TAKE BACK RETURN|AIR|lets. final d +26981|186|13|3|26|28240.68|0.01|0.02|A|F|1992-11-17|1992-10-08|1992-12-16|DELIVER IN PERSON|MAIL|! special accounts wake careful +26981|1524|25|4|9|12829.68|0.03|0.07|A|F|1992-10-21|1992-11-05|1992-11-13|COLLECT COD|MAIL|uctions. p +26981|102|29|5|43|43090.30|0.06|0.05|A|F|1992-12-13|1992-10-24|1993-01-06|NONE|AIR| above the quickly b +26982|923|58|1|31|56541.52|0.09|0.08|R|F|1992-08-16|1992-06-04|1992-08-23|DELIVER IN PERSON|FOB|onic deposits. care +26982|237|65|2|48|54587.04|0.07|0.06|R|F|1992-06-28|1992-06-25|1992-07-16|TAKE BACK RETURN|AIR|lly according to the slyly expres +26982|595|86|3|15|22433.85|0.01|0.03|A|F|1992-05-09|1992-06-29|1992-05-29|COLLECT COD|TRUCK|ts hang quickly. final pe +26982|461|91|4|47|63988.62|0.02|0.07|R|F|1992-05-19|1992-06-29|1992-05-24|DELIVER IN PERSON|AIR|onic tithes. slyly +26982|911|12|5|27|48921.57|0.10|0.01|A|F|1992-06-26|1992-07-14|1992-07-19|NONE|MAIL|bold warthogs. bold +26982|493|94|6|18|25082.82|0.06|0.02|A|F|1992-05-01|1992-06-10|1992-05-18|TAKE BACK RETURN|SHIP|ccounts. ironic, ironic pa +26982|799|100|7|20|33995.80|0.09|0.07|R|F|1992-06-29|1992-07-12|1992-07-04|NONE|RAIL|ly regular accounts haggle +26983|1827|28|1|43|74339.26|0.01|0.08|N|O|1996-10-03|1996-09-13|1996-10-29|COLLECT COD|SHIP|posits are +27008|1589|30|1|19|28321.02|0.06|0.04|N|O|1998-03-13|1998-04-26|1998-04-04|COLLECT COD|AIR|ggle blithely at the ironi +27008|1361|62|2|34|42920.24|0.07|0.02|N|O|1998-05-30|1998-04-25|1998-06-29|TAKE BACK RETURN|SHIP|lyly asymptotes. fluffily b +27009|1191|100|1|31|33857.89|0.09|0.08|A|F|1994-04-20|1994-02-21|1994-05-01|DELIVER IN PERSON|SHIP| deposits hang according to +27009|315|72|2|26|31598.06|0.09|0.03|R|F|1994-01-28|1994-02-21|1994-02-05|NONE|TRUCK|eep. final, ironic accounts among the blit +27009|1409|27|3|39|51105.60|0.09|0.02|A|F|1993-12-30|1994-02-13|1994-01-12|TAKE BACK RETURN|FOB| packages wake careful +27010|843|44|1|42|73241.28|0.09|0.06|N|O|1997-02-05|1997-03-29|1997-02-23|NONE|MAIL| along the ironic ac +27010|25|26|2|15|13875.30|0.02|0.07|N|O|1997-01-31|1997-03-23|1997-02-23|TAKE BACK RETURN|REG AIR|re carefully daringly +27010|1042|43|3|31|29234.24|0.09|0.03|N|O|1997-02-26|1997-03-14|1997-03-15|COLLECT COD|MAIL|usual theodolites. careful, even de +27010|1331|46|4|43|52990.19|0.08|0.00|N|O|1997-03-27|1997-03-26|1997-04-14|TAKE BACK RETURN|MAIL|en Tiresias about th +27011|710|75|1|7|11274.97|0.06|0.04|A|F|1994-04-08|1994-03-04|1994-05-02|TAKE BACK RETURN|MAIL|mong the carefully silent accounts. s +27011|1229|41|2|19|21474.18|0.07|0.08|A|F|1994-02-20|1994-02-11|1994-03-21|DELIVER IN PERSON|MAIL|ly; doggedly regular deposits a +27011|923|92|3|9|16415.28|0.08|0.03|R|F|1994-02-15|1994-02-27|1994-03-06|DELIVER IN PERSON|RAIL|d the express asymptote +27011|1896|97|4|26|46745.14|0.10|0.04|A|F|1994-04-30|1994-03-12|1994-05-15|COLLECT COD|RAIL|ly pending, pending deposits +27011|1602|44|5|17|25561.20|0.01|0.02|R|F|1994-01-06|1994-03-07|1994-01-18|NONE|REG AIR|refully pending ideas are furiously +27011|1401|19|6|40|52096.00|0.00|0.08|A|F|1994-01-22|1994-02-28|1994-02-15|TAKE BACK RETURN|AIR|riously regular +27011|6|32|7|19|17214.00|0.06|0.05|A|F|1994-04-03|1994-02-16|1994-04-26|COLLECT COD|RAIL|special gifts. silent instructions +27012|1858|59|1|17|29917.45|0.09|0.00|A|F|1993-06-13|1993-07-13|1993-07-05|NONE|SHIP| regular pinto beans +27012|1609|10|2|18|27190.80|0.09|0.05|R|F|1993-07-31|1993-06-11|1993-08-15|TAKE BACK RETURN|SHIP|s theodolites are slyly against the blit +27013|329|14|1|49|60236.68|0.07|0.04|A|F|1994-10-03|1994-09-13|1994-10-09|NONE|SHIP|eposits: busily regular the +27013|1355|32|2|17|21357.95|0.02|0.07|A|F|1994-07-13|1994-08-26|1994-07-30|NONE|FOB|kages. unusual dolphins around +27013|1208|83|3|46|51023.20|0.06|0.08|A|F|1994-10-24|1994-09-14|1994-11-13|TAKE BACK RETURN|SHIP|final requests. accounts are. furiously ir +27013|830|64|4|35|60579.05|0.04|0.00|R|F|1994-08-15|1994-09-18|1994-09-13|TAKE BACK RETURN|AIR| regular e +27013|1648|90|5|33|51138.12|0.02|0.03|R|F|1994-09-13|1994-08-11|1994-09-21|COLLECT COD|SHIP|al foxes cajole +27014|124|51|1|49|50181.88|0.03|0.06|N|O|1997-09-08|1997-11-05|1997-09-21|NONE|MAIL|onic, entici +27014|272|27|2|9|10550.43|0.02|0.01|N|O|1997-09-11|1997-09-28|1997-09-13|COLLECT COD|MAIL| quickly pending ideas. asymptotes +27014|278|33|3|31|36526.37|0.10|0.00|N|O|1997-08-25|1997-09-28|1997-09-23|NONE|RAIL|. carefully even pinto beans hagg +27014|422|81|4|32|42317.44|0.00|0.05|N|O|1997-10-08|1997-11-09|1997-10-30|NONE|TRUCK| haggle carefully atop the carefully unus +27015|886|86|1|1|1786.88|0.04|0.05|R|F|1992-04-24|1992-03-30|1992-05-24|COLLECT COD|AIR|c, ironic foxe +27015|500|30|2|20|28010.00|0.03|0.08|A|F|1992-02-29|1992-03-21|1992-03-06|TAKE BACK RETURN|REG AIR| use furiously regular excuses. +27040|128|7|1|41|42152.92|0.04|0.08|N|O|1997-07-14|1997-08-08|1997-08-09|TAKE BACK RETURN|TRUCK|sly bold requests use qui +27040|1192|29|2|9|9838.71|0.00|0.03|N|O|1997-07-15|1997-08-25|1997-08-11|COLLECT COD|MAIL| wake fina +27040|1457|75|3|6|8150.70|0.08|0.01|N|O|1997-09-10|1997-08-23|1997-09-12|DELIVER IN PERSON|SHIP|round the carefully ironic +27040|369|70|4|32|40619.52|0.01|0.05|N|O|1997-07-26|1997-07-04|1997-08-02|COLLECT COD|RAIL|inally blithe +27041|1675|58|1|15|23650.05|0.04|0.06|N|O|1998-10-18|1998-09-28|1998-10-31|COLLECT COD|RAIL|ending accounts was carefully. fu +27041|1700|42|2|1|1601.70|0.08|0.02|N|O|1998-09-26|1998-09-04|1998-10-07|DELIVER IN PERSON|FOB|usual deposits between t +27042|1630|13|1|36|55138.68|0.10|0.07|A|F|1994-11-12|1994-12-16|1994-11-28|NONE|SHIP|l accounts ha +27042|318|19|2|22|26802.82|0.08|0.06|A|F|1994-11-18|1994-11-25|1994-12-13|TAKE BACK RETURN|SHIP|dolites maintain furiously ideas? blit +27042|1993|82|3|42|79589.58|0.09|0.02|A|F|1994-11-13|1994-12-10|1994-11-15|COLLECT COD|TRUCK|ld theodolites after t +27042|725|22|4|24|39017.28|0.02|0.03|A|F|1994-10-12|1994-11-23|1994-11-08|TAKE BACK RETURN|REG AIR|, pending frets. bold packages +27042|1041|42|5|15|14130.60|0.06|0.02|A|F|1994-10-04|1994-12-05|1994-10-15|DELIVER IN PERSON|MAIL|y slyly even escapades. fluffily ironic cou +27043|1419|20|1|26|34330.66|0.05|0.05|N|O|1998-01-03|1997-11-30|1998-02-02|NONE|REG AIR|pinto beans. quickly ironic packages +27043|959|62|2|15|27899.25|0.06|0.01|N|O|1997-10-29|1997-12-10|1997-11-08|DELIVER IN PERSON|REG AIR|y even packages about the regula +27043|1415|33|3|19|25011.79|0.00|0.03|N|O|1997-11-05|1997-11-17|1997-11-15|COLLECT COD|TRUCK|g blithely final realms. quickly even acco +27043|1519|40|4|5|7102.55|0.03|0.00|N|O|1997-10-17|1997-11-17|1997-10-18|TAKE BACK RETURN|MAIL| multipliers +27043|1534|15|5|50|71776.50|0.01|0.05|N|O|1997-10-06|1997-12-06|1997-10-21|DELIVER IN PERSON|RAIL|as. regular, special deposits w +27043|1672|14|6|14|22031.38|0.06|0.05|N|O|1997-10-27|1997-11-09|1997-11-22|NONE|AIR|furiously silent theodolites. u +27044|851|85|1|47|82336.95|0.10|0.06|N|O|1997-06-18|1997-06-12|1997-07-11|COLLECT COD|MAIL|theodolites cajol +27044|40|91|2|46|43241.84|0.09|0.06|N|O|1997-04-01|1997-04-14|1997-04-29|DELIVER IN PERSON|TRUCK|quests sleep carefully unusual requests. +27044|1067|68|3|1|968.06|0.03|0.04|N|O|1997-05-31|1997-05-29|1997-06-15|NONE|REG AIR|uests cajole fluffily unusual accounts. +27044|1093|29|4|26|25846.34|0.01|0.04|N|O|1997-05-16|1997-04-28|1997-05-29|TAKE BACK RETURN|MAIL|eas thrash slyly. furiously final +27044|1164|65|5|2|2130.32|0.03|0.03|N|O|1997-05-03|1997-05-25|1997-06-02|NONE|REG AIR|sual pinto bean +27044|1770|97|6|19|31763.63|0.03|0.00|N|O|1997-05-16|1997-05-09|1997-05-27|NONE|TRUCK| dependencies are slyly ironic theodo +27044|212|94|7|21|23356.41|0.01|0.03|N|O|1997-04-03|1997-04-27|1997-04-05|DELIVER IN PERSON|REG AIR|. express requests haggle ac +27045|1357|72|1|32|40267.20|0.05|0.05|A|F|1992-03-03|1992-05-01|1992-03-11|TAKE BACK RETURN|REG AIR|wake quickly unusual accoun +27045|1662|63|2|23|35964.18|0.02|0.01|R|F|1992-06-21|1992-04-29|1992-07-17|TAKE BACK RETURN|TRUCK|al requests print. furi +27045|455|43|3|37|50151.65|0.10|0.03|R|F|1992-06-11|1992-04-28|1992-07-09|TAKE BACK RETURN|REG AIR|d excuses integrate furiously above the +27045|1342|57|4|18|22380.12|0.05|0.01|R|F|1992-04-07|1992-05-10|1992-04-10|TAKE BACK RETURN|MAIL| the carefully bold ideas. slyly expr +27045|1335|74|5|43|53162.19|0.00|0.01|A|F|1992-06-10|1992-05-29|1992-07-08|COLLECT COD|SHIP|sits. furiously express packages haggl +27046|828|62|1|41|70881.62|0.03|0.01|N|O|1998-02-04|1998-01-18|1998-03-04|NONE|TRUCK| accounts. slyly final +27047|1674|75|1|40|63026.80|0.10|0.06|A|F|1994-01-26|1994-01-02|1994-01-27|NONE|TRUCK|. express, pending ideas +27047|175|76|2|46|49457.82|0.01|0.02|R|F|1993-12-24|1994-02-09|1993-12-26|DELIVER IN PERSON|RAIL|l excuses nag furiously. fur +27047|325|26|3|35|42886.20|0.07|0.02|A|F|1994-02-21|1994-02-20|1994-03-19|NONE|MAIL|owly special requests. quickly +27047|696|59|4|6|9580.14|0.07|0.02|R|F|1993-12-10|1994-02-02|1993-12-14|NONE|SHIP|ide of the furiousl +27047|1014|85|5|17|15555.17|0.03|0.06|A|F|1993-12-04|1994-01-27|1993-12-08|NONE|MAIL| the quickly bold deposi +27072|1046|52|1|33|31252.32|0.00|0.06|R|F|1993-07-20|1993-08-28|1993-07-29|TAKE BACK RETURN|MAIL| wake fluffily above +27073|1497|76|1|30|41954.70|0.09|0.06|N|O|1995-07-29|1995-05-26|1995-08-02|NONE|SHIP|al requests around the carefully ironi +27074|695|96|1|21|33509.49|0.06|0.06|N|O|1997-10-16|1997-09-09|1997-10-24|COLLECT COD|FOB|ess ideas use about the bold, bold theodoli +27074|1774|1|2|4|6703.08|0.08|0.06|N|O|1997-08-08|1997-10-05|1997-08-27|NONE|REG AIR|ffily ironic ideas impress sl +27074|554|85|3|34|49454.70|0.05|0.04|N|O|1997-07-19|1997-08-21|1997-07-29|DELIVER IN PERSON|MAIL|sly slyly busy deposits. quickly regular +27074|363|48|4|40|50534.40|0.10|0.03|N|O|1997-09-25|1997-08-19|1997-10-16|NONE|AIR| are slyly even, u +27075|603|66|1|30|45108.00|0.09|0.04|N|O|1998-08-22|1998-07-05|1998-09-09|DELIVER IN PERSON|SHIP|ackages against the b +27075|658|59|2|17|26497.05|0.10|0.05|N|O|1998-08-04|1998-08-20|1998-08-19|TAKE BACK RETURN|REG AIR|gainst the ironic reque +27075|819|53|3|6|10318.86|0.10|0.07|N|O|1998-06-15|1998-08-24|1998-06-23|COLLECT COD|TRUCK|. furiously ironic deposits nag sl +27075|376|33|4|35|44672.95|0.04|0.00|N|O|1998-08-16|1998-07-23|1998-09-09|TAKE BACK RETURN|RAIL|d foxes are among the slyly final request +27076|1255|93|1|12|13875.00|0.09|0.02|R|F|1992-05-21|1992-05-27|1992-05-22|TAKE BACK RETURN|SHIP|ular requests wake quickly permanently fin +27076|338|23|2|12|14859.96|0.01|0.03|A|F|1992-05-14|1992-06-07|1992-06-05|NONE|AIR|ges affix blithely +27076|878|79|3|3|5336.61|0.04|0.04|A|F|1992-04-13|1992-06-06|1992-05-13|TAKE BACK RETURN|AIR|. carefully even requests de +27076|1633|16|4|28|42969.64|0.00|0.07|A|F|1992-03-24|1992-04-27|1992-04-08|DELIVER IN PERSON|FOB|ajole carefully. regular pinto beans agains +27076|417|47|5|45|59283.45|0.03|0.06|R|F|1992-07-01|1992-05-28|1992-07-13|TAKE BACK RETURN|RAIL|ests integrate flu +27077|1634|58|1|26|39926.38|0.01|0.01|A|F|1993-04-10|1993-04-15|1993-05-05|TAKE BACK RETURN|TRUCK|aggle daringly +27077|703|68|2|24|38488.80|0.10|0.06|R|F|1993-03-27|1993-04-17|1993-03-30|COLLECT COD|SHIP|. furiously fluffy packages nag. blithe +27077|1617|18|3|41|62263.01|0.06|0.02|A|F|1993-06-25|1993-05-15|1993-07-25|COLLECT COD|TRUCK| integrate q +27077|685|86|4|15|23785.20|0.09|0.00|R|F|1993-04-26|1993-06-04|1993-05-08|COLLECT COD|RAIL| alongside of the pack +27077|1818|19|5|20|34396.20|0.10|0.01|R|F|1993-04-15|1993-05-26|1993-05-05|TAKE BACK RETURN|RAIL|furiously express requests haggle +27078|1984|85|1|27|50921.46|0.08|0.03|A|F|1992-08-30|1992-09-18|1992-09-23|NONE|SHIP|ly. blithely fur +27079|1656|80|1|27|42056.55|0.02|0.00|A|F|1994-05-21|1994-06-04|1994-05-23|TAKE BACK RETURN|TRUCK| blithely. stealthily ironic rea +27104|1605|47|1|44|66290.40|0.03|0.03|A|F|1993-11-10|1993-11-10|1993-12-03|TAKE BACK RETURN|FOB|dencies. fina +27104|798|99|2|1|1698.79|0.03|0.03|A|F|1993-11-19|1993-09-28|1993-12-04|NONE|MAIL|ingly. carefully special accounts a +27104|1006|7|3|27|24489.00|0.09|0.08|A|F|1993-12-02|1993-10-06|1993-12-14|DELIVER IN PERSON|RAIL|nusual excuses across the +27104|128|29|4|19|19534.28|0.05|0.01|R|F|1993-09-17|1993-11-16|1993-09-18|COLLECT COD|SHIP|ges. slyly quiet deposits about the ironic +27104|544|45|5|32|46225.28|0.00|0.02|R|F|1993-09-06|1993-10-31|1993-09-22|NONE|FOB| of the express dependencies cajole regula +27105|1780|7|1|2|3363.56|0.10|0.07|A|F|1995-03-06|1995-04-03|1995-03-23|DELIVER IN PERSON|SHIP|he final, fi +27105|1410|89|2|16|20982.56|0.06|0.05|R|F|1995-04-11|1995-04-12|1995-04-23|COLLECT COD|TRUCK|cording to +27105|1848|49|3|48|83992.32|0.03|0.06|A|F|1995-02-27|1995-04-26|1995-03-01|TAKE BACK RETURN|REG AIR|uests boost +27106|522|13|1|8|11380.16|0.09|0.06|N|O|1996-02-05|1996-01-05|1996-02-07|DELIVER IN PERSON|RAIL|lent accounts: slyly bold request +27106|66|67|2|28|27049.68|0.05|0.02|N|O|1996-02-09|1996-02-04|1996-03-06|NONE|RAIL| except the ironic, final +27106|298|80|3|15|17974.35|0.04|0.08|N|O|1996-03-11|1996-02-10|1996-03-13|DELIVER IN PERSON|AIR|r along the regularly even foxes. +27106|1983|28|4|31|58434.38|0.02|0.00|N|O|1996-01-07|1996-02-20|1996-01-15|COLLECT COD|REG AIR|riously regular deposits. ironic +27106|1840|84|5|7|12192.88|0.01|0.02|N|O|1996-02-16|1996-01-05|1996-03-15|COLLECT COD|MAIL|final instruct +27106|873|73|6|12|21286.44|0.02|0.02|N|O|1995-12-04|1996-01-20|1995-12-29|DELIVER IN PERSON|REG AIR|could sublate blithely quick deposits. +27107|1634|35|1|31|47604.53|0.02|0.06|R|F|1993-10-15|1993-08-27|1993-11-09|TAKE BACK RETURN|RAIL|l, stealthy ideas boo +27107|288|70|2|21|24953.88|0.01|0.01|R|F|1993-08-13|1993-09-11|1993-09-04|DELIVER IN PERSON|SHIP|players. regular packages haggle carefully. +27107|1607|31|3|41|61852.60|0.01|0.07|A|F|1993-10-28|1993-09-09|1993-11-19|DELIVER IN PERSON|FOB|kages haggle fluffily +27107|1079|50|4|2|1960.14|0.08|0.06|R|F|1993-09-21|1993-09-08|1993-10-18|COLLECT COD|SHIP|as haggle carefully furiously pe +27108|1736|79|1|40|65509.20|0.02|0.00|N|O|1996-06-12|1996-05-18|1996-06-17|TAKE BACK RETURN|AIR|ly. special r +27108|976|45|2|11|20646.67|0.08|0.07|N|O|1996-07-28|1996-06-19|1996-08-12|NONE|RAIL|ep furiously regular d +27108|1152|53|3|21|22116.15|0.01|0.06|N|O|1996-04-29|1996-07-03|1996-05-01|NONE|AIR|usly silen +27108|1235|73|4|29|32950.67|0.00|0.00|N|O|1996-05-22|1996-06-05|1996-05-24|DELIVER IN PERSON|MAIL|theodolites. pending, regular wa +27108|1336|75|5|14|17322.62|0.04|0.00|N|O|1996-05-20|1996-07-14|1996-05-24|COLLECT COD|MAIL|riously final packages wake furiousl +27108|513|4|6|28|39578.28|0.02|0.03|N|O|1996-05-18|1996-07-13|1996-06-09|DELIVER IN PERSON|TRUCK|ns use furiously final +27109|650|44|1|20|31013.00|0.02|0.06|R|F|1992-05-27|1992-03-30|1992-06-05|COLLECT COD|REG AIR|equests are daringly special pa +27109|1902|35|2|21|37881.90|0.07|0.08|A|F|1992-02-13|1992-03-19|1992-02-23|DELIVER IN PERSON|AIR|cial packages among the furiously +27109|1749|76|3|7|11555.18|0.03|0.07|A|F|1992-05-17|1992-03-27|1992-06-11|COLLECT COD|REG AIR|unts nod. furiously final i +27110|1871|72|1|40|70914.80|0.03|0.05|N|O|1996-08-08|1996-06-24|1996-09-02|COLLECT COD|RAIL|old, final foxes use. final, iron +27110|1930|75|2|9|16487.37|0.08|0.01|N|O|1996-06-17|1996-05-18|1996-07-11|NONE|REG AIR|ers cajole furiously at the final dolphins. +27110|800|65|3|21|35716.80|0.00|0.04|N|O|1996-04-17|1996-07-03|1996-05-03|NONE|FOB|sly. slow dolphins sleep carefu +27111|974|77|1|23|43124.31|0.00|0.02|A|F|1994-05-03|1994-04-29|1994-05-25|NONE|REG AIR|e carefull +27111|763|64|2|48|79860.48|0.02|0.04|R|F|1994-06-03|1994-06-05|1994-06-05|COLLECT COD|MAIL|fluffily among the carefu +27111|774|75|3|24|40194.48|0.10|0.02|A|F|1994-07-01|1994-05-24|1994-07-20|TAKE BACK RETURN|SHIP|y according to +27136|636|68|1|7|10756.41|0.07|0.03|N|O|1998-06-13|1998-06-17|1998-07-07|NONE|SHIP|ly regular ideas. regularly ironic dep +27136|532|23|2|28|40110.84|0.01|0.06|N|O|1998-05-18|1998-05-26|1998-05-31|DELIVER IN PERSON|AIR|slyly regular ideas cajole about the un +27136|476|6|3|29|39917.63|0.04|0.06|N|O|1998-05-27|1998-06-14|1998-06-08|COLLECT COD|REG AIR|olve fluffily. furiou +27136|1165|2|4|3|3198.48|0.00|0.04|N|O|1998-06-01|1998-07-03|1998-06-02|TAKE BACK RETURN|SHIP|l notornis haggle. accounts nag care +27136|711|44|5|12|19340.52|0.03|0.02|N|O|1998-05-12|1998-07-10|1998-06-11|NONE|TRUCK|ular requests-- c +27136|214|42|6|45|50139.45|0.06|0.07|N|O|1998-05-11|1998-06-11|1998-05-25|NONE|REG AIR|above the +27136|535|36|7|43|61727.79|0.05|0.04|N|O|1998-07-05|1998-06-10|1998-07-20|DELIVER IN PERSON|TRUCK|kly even pinto beans integra +27137|1177|50|1|33|35579.61|0.01|0.08|R|F|1992-02-10|1992-02-11|1992-02-28|DELIVER IN PERSON|TRUCK|ect slyly. blithely pending requests h +27137|986|87|2|36|67931.28|0.02|0.00|A|F|1992-04-30|1992-02-28|1992-05-04|NONE|REG AIR|special notornis. carefully i +27137|1673|56|3|24|37792.08|0.06|0.03|R|F|1992-01-04|1992-02-18|1992-01-22|DELIVER IN PERSON|RAIL|s above th +27137|829|30|4|38|65733.16|0.07|0.02|A|F|1992-01-23|1992-02-02|1992-01-28|COLLECT COD|FOB|pecial dependencies are carefully across +27137|590|51|5|37|55151.83|0.03|0.03|A|F|1992-01-06|1992-02-24|1992-01-13|DELIVER IN PERSON|MAIL|lthy packages might +27138|537|98|1|23|33063.19|0.03|0.04|R|F|1992-07-03|1992-07-06|1992-07-04|DELIVER IN PERSON|MAIL|. slyly even platelets wake blithely. quick +27138|1620|21|2|16|24345.92|0.05|0.00|R|F|1992-09-24|1992-08-12|1992-09-26|COLLECT COD|SHIP|e of the even requests. car +27138|1222|97|3|23|25834.06|0.00|0.01|A|F|1992-09-14|1992-08-18|1992-10-03|COLLECT COD|REG AIR|ently final deposits since +27138|1760|3|4|28|46529.28|0.07|0.07|A|F|1992-08-13|1992-08-05|1992-08-28|NONE|MAIL|lly. instructions wake carefu +27138|684|78|5|32|50709.76|0.06|0.03|A|F|1992-06-22|1992-08-07|1992-06-29|DELIVER IN PERSON|SHIP|refully special acc +27138|1544|25|6|4|5782.16|0.10|0.04|R|F|1992-08-12|1992-08-16|1992-09-03|COLLECT COD|FOB|hely requests. slyly furious +27139|1610|52|1|7|10581.27|0.03|0.07|A|F|1994-11-22|1995-01-11|1994-12-02|NONE|REG AIR|c platelets across the carefully +27139|486|87|2|19|26343.12|0.05|0.03|R|F|1995-01-03|1994-12-07|1995-01-29|COLLECT COD|RAIL| across the carefully bold the +27139|1462|41|3|47|64082.62|0.10|0.07|R|F|1994-12-19|1994-12-30|1995-01-08|DELIVER IN PERSON|REG AIR|ironic ideas +27140|47|98|1|9|8523.36|0.08|0.08|N|O|1997-08-07|1997-07-05|1997-09-06|NONE|RAIL| beans. furiously special foxes haggle requ +27140|1949|82|2|16|29615.04|0.03|0.08|N|O|1997-09-22|1997-08-12|1997-10-15|DELIVER IN PERSON|REG AIR|o beans wake. furious +27140|513|14|3|30|42405.30|0.10|0.02|N|O|1997-07-17|1997-08-16|1997-07-22|NONE|FOB|ites. quick +27140|1248|23|4|37|42521.88|0.09|0.07|N|O|1997-07-18|1997-06-29|1997-07-28|DELIVER IN PERSON|MAIL|final foxes-- stealthy, fi +27140|309|38|5|2|2418.60|0.09|0.03|N|O|1997-08-14|1997-07-15|1997-08-15|DELIVER IN PERSON|RAIL| blithely express requests. fin +27141|116|43|1|40|40644.40|0.09|0.02|R|F|1993-05-19|1993-03-29|1993-05-28|TAKE BACK RETURN|REG AIR|furiously bold theodolites about the furi +27141|632|64|2|32|49044.16|0.05|0.03|R|F|1993-03-16|1993-04-17|1993-03-27|NONE|REG AIR|lar asymptotes. brave deposit +27141|634|35|3|24|36831.12|0.02|0.06|R|F|1993-02-14|1993-05-02|1993-02-21|DELIVER IN PERSON|REG AIR|the blithely bold theodolites. +27142|1802|89|1|1|1703.80|0.03|0.02|R|F|1992-08-24|1992-08-04|1992-09-13|DELIVER IN PERSON|FOB|sts use blithely. +27142|399|100|2|24|31185.36|0.04|0.04|R|F|1992-06-20|1992-06-21|1992-06-22|COLLECT COD|TRUCK|y ironic, final accou +27142|1331|32|3|46|56687.18|0.06|0.06|A|F|1992-07-09|1992-07-12|1992-07-30|COLLECT COD|AIR| slyly regular ac +27142|414|44|4|37|48633.17|0.02|0.01|R|F|1992-06-23|1992-07-30|1992-07-07|COLLECT COD|FOB|en pinto beans. ca +27143|982|17|1|16|30127.68|0.04|0.04|N|O|1997-09-22|1997-11-23|1997-10-15|NONE|REG AIR|ronic, express deposits detect blith +27143|483|84|2|41|56722.68|0.03|0.02|N|O|1997-11-24|1997-10-18|1997-12-04|TAKE BACK RETURN|FOB|besides the carefully pendin +27143|186|65|3|11|11947.98|0.09|0.04|N|O|1997-10-30|1997-10-27|1997-11-03|COLLECT COD|AIR|refully abo +27143|271|26|4|34|39823.18|0.02|0.08|N|O|1997-09-14|1997-12-05|1997-10-08|NONE|FOB|are. blithely even foxes a +27143|1597|18|5|25|37464.75|0.09|0.00|N|O|1997-10-18|1997-11-21|1997-10-19|TAKE BACK RETURN|AIR|e carefully final d +27168|320|77|1|37|45151.84|0.10|0.05|R|F|1994-12-13|1994-12-11|1994-12-26|NONE|FOB|refully regular theodolites. excuses thra +27168|1595|96|2|4|5986.36|0.00|0.00|R|F|1995-01-28|1995-01-21|1995-02-03|NONE|SHIP|gifts thrash caref +27168|34|10|3|8|7472.24|0.03|0.03|A|F|1995-02-04|1995-01-23|1995-02-28|TAKE BACK RETURN|TRUCK|ost careful dependencies. pinto bea +27168|1487|88|4|47|65258.56|0.05|0.08|R|F|1995-01-16|1994-12-03|1995-01-26|NONE|SHIP|lly final pinto beans in +27168|1256|68|5|1|1157.25|0.08|0.01|R|F|1994-11-04|1994-12-19|1994-11-05|TAKE BACK RETURN|REG AIR|totes. courts hagg +27168|786|87|6|9|15181.02|0.07|0.08|A|F|1994-12-13|1994-11-29|1994-12-20|NONE|FOB| blithely special foxes. i +27169|1045|51|1|17|16082.68|0.05|0.02|N|O|1995-11-09|1995-11-03|1995-12-03|NONE|REG AIR|evenly final hockey players +27169|1338|39|2|25|30983.25|0.04|0.08|N|O|1995-09-21|1995-11-15|1995-10-19|COLLECT COD|TRUCK|cial deposits along the furi +27169|1827|28|3|30|51864.60|0.08|0.01|N|O|1995-09-16|1995-10-15|1995-10-15|NONE|MAIL|riously silent, regular +27169|1579|80|4|9|13325.13|0.00|0.05|N|O|1995-11-10|1995-11-14|1995-12-10|COLLECT COD|MAIL|sts promise furiously +27170|100|1|1|42|42004.20|0.09|0.00|N|O|1998-10-04|1998-08-22|1998-10-20|COLLECT COD|REG AIR|y against the regular, express pac +27170|1859|3|2|23|40499.55|0.01|0.05|N|O|1998-07-13|1998-08-28|1998-08-12|TAKE BACK RETURN|FOB|odolites. quickly unusu +27170|804|38|3|2|3409.60|0.02|0.07|N|O|1998-09-02|1998-07-28|1998-09-14|NONE|FOB|le quickly beside the final, p +27170|793|58|4|19|32182.01|0.00|0.06|N|O|1998-09-03|1998-07-28|1998-09-04|COLLECT COD|REG AIR|y deposits. fluffily ironic deposits cajole +27170|1301|2|5|25|30057.50|0.00|0.03|N|O|1998-08-20|1998-09-07|1998-09-02|COLLECT COD|REG AIR|ffily about the slyly regular pinto bean +27170|679|73|6|11|17376.37|0.00|0.00|N|O|1998-07-21|1998-08-13|1998-08-12|NONE|SHIP|es are caref +27171|1102|39|1|22|22068.20|0.03|0.02|A|F|1992-03-04|1992-05-16|1992-03-31|DELIVER IN PERSON|MAIL| deposits boost about the c +27171|1563|84|2|31|45401.36|0.03|0.00|A|F|1992-04-10|1992-04-07|1992-04-18|NONE|FOB|press packages sleep care +27171|1341|42|3|42|52178.28|0.09|0.03|A|F|1992-03-27|1992-05-07|1992-04-01|TAKE BACK RETURN|MAIL| final decoys cajole: quickly final foxe +27171|1599|80|4|10|15005.90|0.05|0.01|R|F|1992-03-20|1992-03-28|1992-04-14|NONE|FOB|regular dep +27171|1604|87|5|43|64740.80|0.09|0.06|R|F|1992-05-17|1992-03-31|1992-05-26|TAKE BACK RETURN|REG AIR| ideas are. stealthily +27172|979|82|1|27|50759.19|0.08|0.01|N|O|1996-04-24|1996-05-02|1996-05-03|NONE|RAIL| against the finall +27173|230|31|1|6|6781.38|0.06|0.06|A|F|1995-02-17|1995-01-10|1995-03-03|COLLECT COD|MAIL|es. slyly even asymptotes cajole blit +27174|1987|88|1|31|58558.38|0.05|0.00|N|O|1996-02-05|1995-12-19|1996-02-07|TAKE BACK RETURN|AIR|onic, ironic packages. blithely +27174|1239|77|2|16|18243.68|0.03|0.06|N|O|1995-10-19|1996-01-02|1995-10-28|NONE|TRUCK|e express, +27174|1971|72|3|11|20602.67|0.07|0.06|N|O|1995-12-04|1996-01-04|1995-12-10|NONE|REG AIR|s detect slyly instructions. furiousl +27174|548|39|4|30|43456.20|0.06|0.00|N|O|1995-12-09|1995-12-13|1995-12-14|NONE|SHIP| the unusual, stealthy +27175|374|59|1|22|28036.14|0.10|0.04|A|F|1993-09-18|1993-11-09|1993-10-14|DELIVER IN PERSON|AIR|ites? carefully special accounts promise s +27175|1604|46|2|33|49684.80|0.08|0.04|R|F|1993-11-22|1993-10-29|1993-12-18|NONE|MAIL|low accoun +27200|1527|48|1|38|54283.76|0.02|0.07|N|O|1995-09-06|1995-11-08|1995-09-23|TAKE BACK RETURN|MAIL|pending deposits. blithely r +27200|1272|73|2|10|11732.70|0.05|0.05|N|O|1995-10-19|1995-11-09|1995-10-21|NONE|REG AIR|tect slyly carefu +27200|1757|84|3|11|18246.25|0.08|0.04|N|O|1995-12-05|1995-10-25|1995-12-26|TAKE BACK RETURN|MAIL|final packages. even depos +27200|135|88|4|35|36229.55|0.00|0.08|N|O|1995-10-20|1995-11-06|1995-11-09|TAKE BACK RETURN|SHIP|cial accounts. busy packages detect +27200|276|4|5|43|50579.61|0.07|0.02|N|O|1995-08-29|1995-10-14|1995-09-04|NONE|FOB|ng to the furiou +27201|1492|93|1|50|69674.50|0.03|0.01|A|F|1992-09-17|1992-09-18|1992-09-24|TAKE BACK RETURN|MAIL|ymptotes try to wake furiously c +27201|853|20|2|23|40338.55|0.00|0.03|A|F|1992-09-09|1992-10-23|1992-09-19|NONE|RAIL|the furious +27201|234|89|3|49|55577.27|0.02|0.00|A|F|1992-09-25|1992-08-26|1992-10-13|TAKE BACK RETURN|FOB|re blithely slyly final ideas? furious +27201|1315|92|4|6|7297.86|0.03|0.03|R|F|1992-10-19|1992-10-23|1992-11-18|COLLECT COD|MAIL|en dependencies sleep carefully alo +27201|53|29|5|9|8577.45|0.00|0.06|R|F|1992-11-14|1992-08-25|1992-11-25|DELIVER IN PERSON|RAIL|rs cajole finally silent packages. unusual +27201|929|30|6|7|12809.44|0.08|0.05|R|F|1992-10-08|1992-09-15|1992-10-14|COLLECT COD|MAIL|nusual foxes. blithely ironi +27202|1444|23|1|23|30945.12|0.04|0.07|N|O|1996-07-11|1996-07-13|1996-08-09|NONE|REG AIR|luffily aft +27203|1839|26|1|42|73114.86|0.10|0.08|N|O|1996-03-15|1996-03-01|1996-03-18|DELIVER IN PERSON|AIR|ending dolphins are quickly ato +27203|1182|19|2|41|44410.38|0.02|0.03|N|O|1996-02-28|1996-03-11|1996-02-29|DELIVER IN PERSON|MAIL|gular excuses are. specia +27203|911|14|3|38|68852.58|0.10|0.07|N|O|1996-02-04|1996-04-19|1996-02-18|TAKE BACK RETURN|TRUCK|leep. carefully f +27203|1683|66|4|36|57048.48|0.03|0.01|N|O|1996-01-31|1996-04-06|1996-02-23|TAKE BACK RETURN|REG AIR| deposits. furiou +27203|1348|49|5|36|44976.24|0.06|0.07|N|O|1996-03-07|1996-03-11|1996-03-18|TAKE BACK RETURN|REG AIR|quickly. pending, pending pint +27203|704|1|6|14|22465.80|0.01|0.04|N|O|1996-05-04|1996-03-10|1996-05-23|COLLECT COD|TRUCK|arefully. +27203|13|14|7|13|11869.13|0.04|0.06|N|O|1996-02-17|1996-03-18|1996-03-13|DELIVER IN PERSON|FOB|fully express theodolites cajole +27204|1090|26|1|23|22795.07|0.03|0.06|N|O|1996-07-27|1996-07-06|1996-08-25|TAKE BACK RETURN|MAIL| use carefully quickly regul +27204|743|8|2|9|14793.66|0.07|0.08|N|O|1996-07-04|1996-07-15|1996-07-15|TAKE BACK RETURN|REG AIR|le blithely. furiously final decoys a +27204|1330|45|3|35|43096.55|0.09|0.01|N|O|1996-08-02|1996-08-18|1996-08-16|NONE|MAIL|. ideas pro +27204|421|22|4|25|33035.50|0.07|0.02|N|O|1996-06-17|1996-07-06|1996-06-22|DELIVER IN PERSON|TRUCK|ts at the quickly unusual ideas +27204|721|18|5|8|12973.76|0.10|0.06|N|O|1996-07-17|1996-08-13|1996-08-03|DELIVER IN PERSON|MAIL|bout the furio +27205|515|46|1|19|26894.69|0.04|0.02|R|F|1993-08-18|1993-08-11|1993-09-04|DELIVER IN PERSON|MAIL|he express instructions cajole sl +27205|876|10|2|47|83512.89|0.05|0.03|R|F|1993-08-22|1993-07-28|1993-09-20|COLLECT COD|SHIP|ously even the +27205|784|81|3|19|32010.82|0.04|0.02|R|F|1993-08-16|1993-07-14|1993-08-31|TAKE BACK RETURN|FOB|usual requests hag +27205|222|77|4|7|7855.54|0.02|0.04|R|F|1993-06-14|1993-07-28|1993-07-10|TAKE BACK RETURN|SHIP|sits sleep furiously regular +27205|817|84|5|2|3435.62|0.08|0.03|R|F|1993-07-24|1993-07-17|1993-07-25|TAKE BACK RETURN|SHIP|ar theodolites +27206|52|3|1|34|32369.70|0.02|0.00|R|F|1993-05-25|1993-05-27|1993-06-10|COLLECT COD|TRUCK|asymptotes. unusual, regular +27206|1181|54|2|6|6493.08|0.04|0.02|A|F|1993-08-08|1993-06-03|1993-08-15|NONE|REG AIR|egular Tiresias poach furi +27206|1099|100|3|46|46004.14|0.03|0.01|A|F|1993-06-05|1993-07-04|1993-06-22|DELIVER IN PERSON|RAIL| asymptotes ha +27206|93|19|4|34|33765.06|0.09|0.02|A|F|1993-08-17|1993-06-27|1993-08-30|DELIVER IN PERSON|MAIL|al accounts again +27207|636|68|1|26|39952.38|0.02|0.08|N|O|1996-12-24|1996-10-07|1997-01-09|COLLECT COD|REG AIR|fter the ir +27232|1723|24|1|36|58489.92|0.01|0.01|A|F|1993-10-06|1993-10-22|1993-10-28|COLLECT COD|SHIP| blithely express foxes. final +27232|1592|13|2|17|25391.03|0.05|0.06|A|F|1993-09-05|1993-09-29|1993-09-21|NONE|AIR|g asymptotes. packages ar +27232|1587|28|3|10|14885.80|0.06|0.00|R|F|1993-10-09|1993-10-07|1993-10-26|COLLECT COD|AIR|ing accounts. furiously pending packages +27233|478|79|1|50|68923.50|0.04|0.06|N|O|1996-09-12|1996-08-28|1996-09-19|NONE|RAIL| theodolites. brave asy +27233|1551|92|2|34|49386.70|0.08|0.01|N|O|1996-07-25|1996-09-26|1996-08-24|COLLECT COD|RAIL| accounts. deposits acros +27233|554|15|3|7|10181.85|0.06|0.01|N|O|1996-08-18|1996-09-14|1996-09-09|TAKE BACK RETURN|TRUCK|e unusual requests. even, ironic +27233|1710|11|4|45|72526.95|0.06|0.07|N|O|1996-09-26|1996-09-20|1996-10-10|TAKE BACK RETURN|SHIP|ake across the blithely final p +27233|218|73|5|32|35782.72|0.09|0.04|N|O|1996-07-02|1996-09-07|1996-07-12|DELIVER IN PERSON|FOB| slyly regular deposits-- requests +27234|1420|38|1|43|56821.06|0.08|0.05|N|O|1997-12-24|1997-12-19|1998-01-15|TAKE BACK RETURN|AIR|ests. speci +27234|1774|17|2|18|30163.86|0.05|0.08|N|O|1998-01-17|1997-11-23|1998-02-16|COLLECT COD|SHIP|ly ironic, s +27234|1979|12|3|36|67714.92|0.01|0.03|N|O|1997-12-14|1997-11-21|1998-01-08|NONE|MAIL| deposits wake carefully along +27234|1277|15|4|17|20030.59|0.00|0.08|N|O|1997-11-17|1997-11-28|1997-12-03|NONE|TRUCK|dolites are. theodolites e +27235|1135|72|1|31|32120.03|0.10|0.08|R|F|1992-12-02|1992-12-25|1992-12-18|TAKE BACK RETURN|SHIP|ructions. furious +27235|274|56|2|30|35228.10|0.06|0.02|A|F|1993-02-10|1993-01-28|1993-02-12|COLLECT COD|TRUCK|to wake slyly silent instructions. sly +27235|441|71|3|47|63047.68|0.01|0.06|R|F|1993-01-09|1992-12-12|1993-02-02|TAKE BACK RETURN|RAIL|the instruct +27236|559|50|1|22|32110.10|0.05|0.02|R|F|1993-04-26|1993-04-07|1993-05-06|TAKE BACK RETURN|FOB|ong the carefully ironic p +27236|657|20|2|40|62306.00|0.01|0.02|A|F|1993-04-15|1993-05-24|1993-05-13|DELIVER IN PERSON|TRUCK| beans: blithely ironic deposits +27236|654|55|3|37|57522.05|0.00|0.00|R|F|1993-04-16|1993-05-31|1993-04-19|NONE|AIR|uests haggle. regular dolph +27236|1300|1|4|36|43246.80|0.09|0.05|A|F|1993-04-30|1993-05-20|1993-05-13|NONE|RAIL|. packages unwind quickly above the u +27236|1155|56|5|41|43302.15|0.04|0.00|R|F|1993-04-28|1993-04-22|1993-05-05|NONE|MAIL|ackages. pending pinto be +27236|942|43|6|41|75560.54|0.04|0.03|A|F|1993-04-07|1993-04-11|1993-04-24|TAKE BACK RETURN|REG AIR|s among the +27236|50|76|7|37|35151.85|0.09|0.08|A|F|1993-03-15|1993-05-16|1993-04-04|COLLECT COD|AIR| boost blithely bol +27237|1854|55|1|6|10535.10|0.03|0.07|N|O|1996-04-26|1996-05-06|1996-05-08|NONE|RAIL|lar platelets. quickl +27237|69|95|2|22|21319.32|0.07|0.03|N|O|1996-06-03|1996-05-06|1996-07-02|TAKE BACK RETURN|REG AIR| above the spe +27237|717|18|3|16|25883.36|0.01|0.05|N|O|1996-05-09|1996-04-12|1996-05-12|COLLECT COD|FOB|ns. furiously regular instructions s +27238|339|96|1|41|50812.53|0.10|0.00|N|O|1995-08-25|1995-10-21|1995-09-17|TAKE BACK RETURN|AIR| according to the final packages. +27238|1197|98|2|10|10981.90|0.05|0.06|N|O|1995-11-20|1995-10-05|1995-12-16|TAKE BACK RETURN|SHIP|onic, pending asymptotes us +27238|990|59|3|31|58620.69|0.10|0.00|N|O|1995-10-08|1995-09-14|1995-10-16|COLLECT COD|TRUCK|special deposits are +27238|1892|93|4|48|86106.72|0.07|0.00|N|O|1995-09-05|1995-11-11|1995-09-19|COLLECT COD|REG AIR| regular instructions haggle across +27239|1084|85|1|49|48268.92|0.05|0.07|N|O|1998-03-17|1998-03-31|1998-04-06|NONE|AIR| nag carefully along the +27239|428|58|2|19|25239.98|0.07|0.03|N|O|1998-04-21|1998-05-02|1998-04-28|COLLECT COD|MAIL|arefully ironic theodolites haggle +27239|345|2|3|12|14944.08|0.05|0.02|N|O|1998-03-17|1998-04-04|1998-03-26|COLLECT COD|TRUCK|es! regular accounts do are blithely even +27264|1108|17|1|13|13118.30|0.05|0.08|N|O|1995-09-16|1995-08-12|1995-09-27|NONE|FOB|ate furiously unusu +27264|1498|99|2|36|50381.64|0.09|0.08|N|O|1995-09-07|1995-07-21|1995-09-14|COLLECT COD|REG AIR|nding foxes. furiously f +27264|1468|8|3|43|58886.78|0.02|0.01|N|F|1995-06-17|1995-08-16|1995-06-23|NONE|SHIP|t the slyl +27264|723|56|4|19|30850.68|0.03|0.07|A|F|1995-06-14|1995-07-26|1995-06-17|NONE|RAIL|ly final pack +27265|664|58|1|18|28163.88|0.07|0.02|A|F|1992-06-14|1992-07-27|1992-07-09|NONE|TRUCK|tructions. special accounts are furiously +27265|559|20|2|14|20433.70|0.06|0.07|A|F|1992-05-14|1992-06-09|1992-05-20|TAKE BACK RETURN|REG AIR|theodolites may wake furiously among the sp +27265|855|55|3|6|10535.10|0.02|0.00|R|F|1992-05-28|1992-08-01|1992-06-03|TAKE BACK RETURN|TRUCK|ronic somas across the quickl +27265|44|70|4|36|33985.44|0.06|0.08|A|F|1992-05-23|1992-07-19|1992-05-25|DELIVER IN PERSON|REG AIR|ages. silent +27265|341|70|5|1|1241.34|0.09|0.05|R|F|1992-05-19|1992-07-11|1992-06-10|DELIVER IN PERSON|FOB|kly regular asymptotes are. dependencies e +27266|418|19|1|28|36915.48|0.10|0.06|N|O|1995-12-06|1995-11-20|1995-12-10|COLLECT COD|RAIL|hinder slyly atop the slyly fi +27266|547|8|2|8|11580.32|0.05|0.03|N|O|1995-12-04|1995-11-12|1995-12-31|COLLECT COD|REG AIR|s! slyly even requests af +27266|1428|29|3|31|41212.02|0.06|0.06|N|O|1995-10-05|1995-10-09|1995-10-17|DELIVER IN PERSON|FOB|even accounts wake furiously. +27266|1299|74|4|22|26406.38|0.06|0.08|N|O|1995-09-30|1995-10-15|1995-10-06|NONE|REG AIR| close instructions after the final +27266|1453|32|5|37|50114.65|0.07|0.07|N|O|1995-11-28|1995-11-27|1995-12-28|NONE|AIR|ckages sleep furiously ironic requests. re +27266|1153|26|6|44|46382.60|0.02|0.06|N|O|1995-11-23|1995-10-18|1995-12-10|DELIVER IN PERSON|SHIP|ronic platelets integrate +27266|476|64|7|5|6882.35|0.08|0.03|N|O|1995-12-05|1995-11-14|1995-12-30|NONE|AIR|ly slyly even r +27267|1150|87|1|50|52557.50|0.06|0.07|N|O|1996-10-25|1996-11-29|1996-11-21|TAKE BACK RETURN|RAIL|al ideas. carefully ironic +27267|602|3|2|40|60104.00|0.03|0.08|N|O|1996-12-18|1996-11-20|1997-01-01|TAKE BACK RETURN|RAIL|uietly against the silent deposits. +27267|1866|67|3|40|70714.40|0.08|0.03|N|O|1996-09-17|1996-10-28|1996-10-15|NONE|REG AIR| carefully fina +27267|1160|61|4|23|24406.68|0.00|0.03|N|O|1996-10-05|1996-11-09|1996-10-20|NONE|RAIL|sts was furiously above the unusual, regula +27268|521|82|1|40|56860.80|0.01|0.02|A|F|1995-01-10|1994-12-30|1995-01-18|DELIVER IN PERSON|SHIP|carefully against the fur +27268|156|9|2|7|7393.05|0.09|0.08|R|F|1995-01-08|1995-01-18|1995-01-09|DELIVER IN PERSON|REG AIR|he final deposit +27268|447|35|3|2|2694.88|0.03|0.02|A|F|1995-02-17|1995-01-19|1995-03-12|TAKE BACK RETURN|AIR|atelets na +27269|1529|30|1|20|28610.40|0.05|0.04|N|O|1997-07-08|1997-08-24|1997-08-05|DELIVER IN PERSON|FOB|ounts. fluffy warthogs cajole acr +27269|1400|39|2|48|62467.20|0.04|0.04|N|O|1997-07-20|1997-09-17|1997-07-21|DELIVER IN PERSON|RAIL|y. platelets boost quickly sly +27269|1110|11|3|48|48533.28|0.04|0.07|N|O|1997-08-12|1997-08-09|1997-08-17|TAKE BACK RETURN|SHIP|carefully? dep +27269|202|57|4|16|17635.20|0.01|0.01|N|O|1997-08-09|1997-09-03|1997-08-27|NONE|MAIL|nic foxes. blith +27269|1736|79|5|21|34392.33|0.05|0.04|N|O|1997-07-04|1997-09-07|1997-07-29|NONE|TRUCK|nusual dinos. reg +27270|1811|55|1|32|54809.92|0.00|0.07|R|F|1993-06-17|1993-05-10|1993-07-12|DELIVER IN PERSON|FOB|leep fluffily. reg +27270|1290|2|2|1|1191.29|0.08|0.07|R|F|1993-05-16|1993-04-15|1993-05-25|TAKE BACK RETURN|TRUCK|des haggle? fu +27270|669|70|3|26|40811.16|0.01|0.07|A|F|1993-07-08|1993-05-11|1993-07-09|NONE|FOB|arefully pending asymptotes a +27271|1859|46|1|18|31695.30|0.02|0.00|N|O|1995-10-09|1995-10-22|1995-10-30|DELIVER IN PERSON|REG AIR|st the carefully special deposits. +27271|328|57|2|14|17196.48|0.10|0.03|N|O|1995-09-20|1995-10-21|1995-10-15|DELIVER IN PERSON|MAIL|uffily close gifts boost furiously +27271|259|14|3|33|38255.25|0.00|0.07|N|O|1995-12-05|1995-11-16|1995-12-07|NONE|SHIP|carefully re +27271|786|83|4|2|3373.56|0.09|0.05|N|O|1995-10-19|1995-10-22|1995-11-09|COLLECT COD|FOB|ounts are. bold accounts s +27271|1533|14|5|2|2869.06|0.03|0.02|N|O|1996-01-01|1995-11-14|1996-01-05|DELIVER IN PERSON|SHIP|ccounts haggle carefully aroun +27271|521|22|6|29|41224.08|0.04|0.06|N|O|1995-10-19|1995-11-17|1995-11-06|COLLECT COD|AIR|en accounts about the furiously +27271|1761|4|7|44|73161.44|0.08|0.07|N|O|1995-12-11|1995-11-04|1995-12-12|COLLECT COD|TRUCK|ely brave pac +27296|854|21|1|46|80723.10|0.05|0.04|N|O|1997-11-20|1997-10-09|1997-12-11|TAKE BACK RETURN|SHIP|s ideas. regular foxes boo +27296|1381|20|2|30|38471.40|0.08|0.06|N|O|1997-11-13|1997-11-14|1997-11-14|COLLECT COD|TRUCK|lithely unusual theodolites haggle fluffi +27296|162|63|3|26|27616.16|0.00|0.00|N|O|1997-11-04|1997-10-17|1997-11-27|DELIVER IN PERSON|REG AIR|packages haggle. quickly special in +27296|797|94|4|5|8488.95|0.02|0.01|N|O|1997-11-17|1997-09-30|1997-12-09|TAKE BACK RETURN|MAIL|sly bold deposits d +27296|1973|18|5|28|52499.16|0.07|0.08|N|O|1997-12-10|1997-11-10|1997-12-30|TAKE BACK RETURN|REG AIR|ly Tiresias print above the +27296|608|71|6|21|31680.60|0.02|0.05|N|O|1997-09-30|1997-11-14|1997-10-22|TAKE BACK RETURN|AIR|ccounts. even deposits after t +27297|1530|71|1|2|2863.06|0.00|0.03|N|O|1997-10-05|1997-08-11|1997-10-21|DELIVER IN PERSON|REG AIR|ons cajole blithely silent requests. +27297|1741|84|2|34|55853.16|0.03|0.07|N|O|1997-09-23|1997-08-23|1997-09-28|DELIVER IN PERSON|TRUCK|ironic excuses according to the ironic +27298|1310|87|1|29|35127.99|0.05|0.01|N|O|1995-12-21|1995-12-31|1996-01-19|COLLECT COD|SHIP|y quick packages. slyly final +27298|508|99|2|4|5634.00|0.03|0.06|N|O|1996-03-08|1996-01-28|1996-03-09|NONE|AIR|us packages. ideas poa +27298|1678|2|3|8|12637.36|0.06|0.01|N|O|1996-01-06|1996-01-14|1996-01-13|DELIVER IN PERSON|REG AIR|deas. quickly final epit +27298|55|56|4|28|26741.40|0.03|0.02|N|O|1996-02-14|1995-12-30|1996-03-02|NONE|SHIP|quests wake. regular ex +27298|782|15|5|7|11779.46|0.08|0.00|N|O|1996-03-19|1996-02-17|1996-04-12|COLLECT COD|SHIP|s atop the express, +27299|1087|88|1|45|44463.60|0.06|0.06|R|F|1992-11-05|1992-09-29|1992-11-25|NONE|RAIL|ounts integrate quickly arou +27299|1436|15|2|21|28086.03|0.09|0.03|A|F|1992-10-21|1992-09-08|1992-10-22|DELIVER IN PERSON|REG AIR|lithely final theodoli +27299|1851|81|3|15|26292.75|0.02|0.01|R|F|1992-09-19|1992-09-25|1992-10-12|COLLECT COD|SHIP|ss pinto beans. ironic asymptotes p +27299|394|95|4|29|37537.31|0.10|0.06|A|F|1992-08-16|1992-10-05|1992-09-12|TAKE BACK RETURN|REG AIR|. quickly regular packages integr +27299|1251|52|5|9|10370.25|0.00|0.06|A|F|1992-10-13|1992-09-21|1992-10-16|COLLECT COD|REG AIR|unusual accounts across +27299|89|40|6|23|22748.84|0.07|0.06|A|F|1992-10-11|1992-10-08|1992-11-10|TAKE BACK RETURN|TRUCK|ronic, express requests. furiously perman +27300|1059|30|1|31|29761.55|0.06|0.02|A|F|1992-10-03|1992-12-11|1992-10-05|COLLECT COD|REG AIR|out the slyly ev +27300|321|6|2|44|53738.08|0.01|0.02|A|F|1992-10-11|1992-11-23|1992-10-13|NONE|SHIP|le quickly carefull +27300|512|3|3|19|26837.69|0.09|0.05|A|F|1993-01-09|1992-11-15|1993-01-28|TAKE BACK RETURN|REG AIR|pades. even, +27300|602|34|4|1|1502.60|0.09|0.05|R|F|1993-01-13|1992-12-22|1993-01-23|DELIVER IN PERSON|SHIP| integrate blithely-- pending gifts +27300|1466|6|5|34|46493.64|0.09|0.04|R|F|1993-01-05|1992-12-14|1993-01-18|TAKE BACK RETURN|MAIL|ost against the blithel +27300|565|26|6|31|45432.36|0.04|0.08|R|F|1993-01-20|1992-12-29|1993-01-26|NONE|REG AIR|al packages cajole above the furiously iro +27300|623|17|7|8|12188.96|0.07|0.08|A|F|1992-12-16|1992-12-21|1992-12-24|COLLECT COD|RAIL|uctions. qui +27301|1602|26|1|50|75180.00|0.07|0.02|R|F|1993-06-03|1993-07-03|1993-06-22|NONE|FOB|ending deposits are pending, final +27301|1364|3|2|21|26572.56|0.05|0.00|A|F|1993-06-09|1993-05-23|1993-07-01|NONE|RAIL|rts nag carefu +27302|684|78|1|7|11092.76|0.09|0.05|R|F|1992-11-22|1992-10-18|1992-12-19|TAKE BACK RETURN|AIR|furiously. carefully regula +27302|1450|68|2|45|60815.25|0.00|0.00|A|F|1993-01-09|1992-10-27|1993-01-14|COLLECT COD|MAIL|nts haggle furiously eve +27302|587|48|3|5|7437.90|0.06|0.00|A|F|1992-09-18|1992-11-11|1992-10-09|NONE|FOB|ts. quickly even +27302|1369|84|4|7|8892.52|0.04|0.00|R|F|1992-09-16|1992-10-22|1992-09-30|TAKE BACK RETURN|FOB|ges. accounts unwind carefully ironic +27302|519|80|5|15|21292.65|0.06|0.03|A|F|1992-10-23|1992-11-28|1992-10-28|NONE|RAIL|lar foxes. slyly regula +27302|387|72|6|27|34759.26|0.10|0.07|A|F|1992-11-16|1992-10-31|1992-11-21|TAKE BACK RETURN|AIR|ress requests. ironically fi +27303|1863|93|1|48|84713.28|0.10|0.01|R|F|1993-03-31|1993-03-30|1993-04-11|DELIVER IN PERSON|REG AIR|side of the furiously even accounts. flu +27303|1596|77|2|28|41932.52|0.02|0.08|A|F|1993-04-06|1993-03-31|1993-04-30|TAKE BACK RETURN|MAIL|y regular accounts use s +27303|30|6|3|34|31621.02|0.04|0.04|A|F|1993-04-18|1993-02-12|1993-05-18|NONE|MAIL|arefully at the +27303|1471|89|4|8|10979.76|0.10|0.06|A|F|1993-03-18|1993-03-27|1993-03-24|TAKE BACK RETURN|REG AIR|unusual deposits are qui +27328|1582|63|1|45|66761.10|0.05|0.03|N|O|1995-07-08|1995-07-17|1995-07-29|COLLECT COD|REG AIR|wly silent excuses. ironi +27328|1501|42|2|38|53295.00|0.00|0.07|N|O|1995-08-26|1995-08-07|1995-09-19|DELIVER IN PERSON|AIR|ons wake. ironic realms ab +27328|967|70|3|28|52302.88|0.02|0.02|N|O|1995-10-03|1995-07-10|1995-10-12|TAKE BACK RETURN|REG AIR|hely according to the bold theodo +27328|1008|9|4|1|909.00|0.00|0.03|N|O|1995-08-18|1995-08-21|1995-09-03|NONE|REG AIR|theodolites boost carefully unusua +27328|285|40|5|15|17779.20|0.01|0.00|N|O|1995-07-25|1995-08-16|1995-08-09|TAKE BACK RETURN|MAIL|p. pending depen +27329|1722|7|1|8|12989.76|0.02|0.00|R|F|1993-03-14|1993-03-17|1993-04-02|DELIVER IN PERSON|SHIP|uses. regular accounts s +27329|615|16|2|40|60624.40|0.00|0.02|R|F|1993-03-17|1993-03-02|1993-04-07|COLLECT COD|AIR|s. never even packages cajole +27329|121|100|3|48|49013.76|0.08|0.01|R|F|1993-04-23|1993-02-25|1993-05-01|DELIVER IN PERSON|TRUCK|olphins after the accounts nag quickly +27329|286|68|4|11|13049.08|0.05|0.00|R|F|1993-01-29|1993-03-20|1993-02-20|NONE|AIR| furiously ironic theodolites. carefully +27330|1802|32|1|14|23853.20|0.10|0.06|R|F|1994-09-30|1994-11-02|1994-10-27|COLLECT COD|FOB|ickly careful deposits. expre +27330|738|39|2|4|6554.92|0.09|0.08|R|F|1994-12-23|1994-11-17|1995-01-21|COLLECT COD|REG AIR|ar excuses promise silently; express, +27330|904|73|3|34|61366.60|0.00|0.08|R|F|1994-10-15|1994-11-14|1994-11-01|COLLECT COD|FOB|furiously regular instruc +27330|773|38|4|41|68624.57|0.05|0.03|A|F|1994-11-10|1994-10-29|1994-11-26|NONE|TRUCK|ic braids. silently e +27330|1155|56|5|36|38021.40|0.02|0.07|R|F|1994-11-17|1994-12-16|1994-12-06|COLLECT COD|TRUCK|fully. even platelets are carefu +27330|1800|43|6|40|68072.00|0.02|0.04|A|F|1994-12-24|1994-12-04|1995-01-12|TAKE BACK RETURN|FOB|sits along the fluffily +27330|887|87|7|43|76878.84|0.01|0.01|A|F|1994-10-13|1994-11-07|1994-11-07|DELIVER IN PERSON|SHIP|il the even, sly requests. furi +27331|1558|79|1|46|67139.30|0.01|0.04|A|F|1994-02-07|1994-03-10|1994-02-23|TAKE BACK RETURN|TRUCK|r pinto beans nag. pen +27331|544|45|2|47|67893.38|0.06|0.08|A|F|1994-05-05|1994-03-04|1994-05-22|DELIVER IN PERSON|REG AIR|l platelets na +27331|266|48|3|42|48982.92|0.04|0.08|A|F|1994-05-20|1994-02-27|1994-06-14|TAKE BACK RETURN|TRUCK|ow slyly after the da +27332|583|84|1|17|25220.86|0.03|0.02|N|O|1996-05-25|1996-06-16|1996-06-19|DELIVER IN PERSON|SHIP|beans wake except the slyly +27333|38|39|1|20|18760.60|0.03|0.06|A|F|1994-02-20|1994-01-17|1994-03-02|DELIVER IN PERSON|TRUCK| furiously regular requests sle +27333|1374|51|2|18|22956.66|0.10|0.08|R|F|1993-12-04|1994-02-01|1993-12-10|DELIVER IN PERSON|FOB|aggle against the quickly speci +27333|1080|81|3|39|38262.12|0.00|0.03|R|F|1994-03-13|1994-02-15|1994-04-10|DELIVER IN PERSON|FOB| the furiously regular ex +27333|1230|31|4|45|50905.35|0.10|0.06|R|F|1993-12-21|1994-01-28|1994-01-10|NONE|FOB|ar packages cajol +27333|1517|18|5|33|46810.83|0.05|0.08|R|F|1993-12-18|1994-02-15|1993-12-29|COLLECT COD|FOB|onic pinto beans wake +27333|1021|27|6|38|35036.76|0.02|0.06|A|F|1994-02-20|1994-02-05|1994-02-28|NONE|MAIL|s. even account +27334|1881|68|1|31|55269.28|0.09|0.01|N|O|1996-05-13|1996-03-12|1996-06-04|DELIVER IN PERSON|AIR|e special foxes. blithely ironic +27334|416|75|2|12|15796.92|0.05|0.02|N|O|1996-03-18|1996-04-26|1996-04-16|DELIVER IN PERSON|MAIL|lly blithely even package +27334|944|79|3|10|18449.40|0.04|0.05|N|O|1996-03-22|1996-04-23|1996-03-31|TAKE BACK RETURN|REG AIR| even packages nag furiously even +27334|242|97|4|32|36551.68|0.00|0.05|N|O|1996-05-16|1996-04-03|1996-05-31|DELIVER IN PERSON|SHIP| pinto beans h +27334|1033|39|5|38|35493.14|0.08|0.07|N|O|1996-04-16|1996-03-14|1996-04-30|DELIVER IN PERSON|FOB|osits sleep fluffily accordin +27334|1122|23|6|1|1023.12|0.09|0.01|N|O|1996-03-03|1996-03-28|1996-03-25|DELIVER IN PERSON|TRUCK|ounts haggle fu +27335|165|92|1|38|40476.08|0.00|0.00|A|F|1994-01-03|1994-01-28|1994-01-07|COLLECT COD|SHIP| to the quickly expre +27335|20|46|2|9|8280.18|0.02|0.08|A|F|1994-01-15|1994-01-29|1994-01-20|COLLECT COD|MAIL|usly carefully special platelets +27335|1877|64|3|3|5336.61|0.07|0.01|A|F|1994-01-28|1994-01-14|1994-02-10|DELIVER IN PERSON|AIR|quests nag. fluffily even i +27360|1421|22|1|38|50251.96|0.05|0.08|N|O|1996-09-12|1996-08-18|1996-09-22|TAKE BACK RETURN|AIR|lyly final attainments sleep sly +27360|498|57|2|28|39157.72|0.09|0.02|N|O|1996-09-27|1996-08-26|1996-10-20|NONE|REG AIR|times pending de +27361|1600|21|1|22|33035.20|0.07|0.07|R|F|1995-04-14|1995-03-08|1995-04-22|COLLECT COD|SHIP|e slyly furiously expres +27362|1932|65|1|29|53183.97|0.08|0.05|R|F|1994-02-07|1994-03-22|1994-03-09|COLLECT COD|AIR|egular, regular deposits. blithely ironic +27363|1624|48|1|18|27461.16|0.07|0.04|N|O|1995-11-14|1995-12-04|1995-11-20|COLLECT COD|SHIP|dependencies wake furiously. slyly regular +27363|1196|33|2|35|38401.65|0.07|0.05|N|O|1996-01-31|1996-01-07|1996-02-19|NONE|TRUCK|es wake fluff +27363|1763|48|3|2|3329.52|0.03|0.05|N|O|1996-02-15|1995-12-09|1996-02-29|COLLECT COD|TRUCK|y special dependencies. eve +27363|295|77|4|21|25101.09|0.10|0.08|N|O|1996-01-28|1996-01-05|1996-02-08|TAKE BACK RETURN|REG AIR|ding to the silent, pe +27364|1514|95|1|50|70775.50|0.10|0.07|N|O|1995-08-04|1995-08-08|1995-08-26|NONE|RAIL|ng theodolites run car +27364|434|93|2|50|66721.50|0.02|0.05|N|O|1995-08-04|1995-07-13|1995-08-18|COLLECT COD|AIR|furiously final +27364|1793|36|3|12|20337.48|0.10|0.01|N|O|1995-06-20|1995-07-09|1995-07-12|COLLECT COD|MAIL|e quickly pending foxes. dogged, ruth +27364|1994|39|4|17|32231.83|0.04|0.03|N|O|1995-08-08|1995-08-05|1995-08-23|NONE|SHIP| boldly furiously final reque +27364|1716|59|5|20|32354.20|0.03|0.05|N|O|1995-08-25|1995-07-27|1995-09-03|DELIVER IN PERSON|AIR|osely express deposits. fluff +27364|834|68|6|23|39901.09|0.02|0.07|N|O|1995-06-30|1995-08-01|1995-07-08|TAKE BACK RETURN|FOB| silent deposits. packag +27364|96|97|7|34|33867.06|0.00|0.02|R|F|1995-05-26|1995-07-12|1995-05-29|COLLECT COD|MAIL|s the pending, even packages. slyly regula +27365|28|79|1|4|3712.08|0.04|0.05|N|O|1997-12-08|1997-09-21|1998-01-03|NONE|SHIP|rts serve carefully ab +27365|1358|59|2|21|26446.35|0.00|0.06|N|O|1997-11-14|1997-09-11|1997-12-14|TAKE BACK RETURN|RAIL|s boost. bold foxes are quietly fi +27365|1895|39|3|18|32344.02|0.00|0.00|N|O|1997-09-02|1997-10-07|1997-10-01|COLLECT COD|MAIL|requests haggle decoys. quickly reg +27365|931|66|4|2|3663.86|0.02|0.01|N|O|1997-11-08|1997-10-18|1997-11-18|COLLECT COD|FOB|fter the pending ideas. silen +27366|224|25|1|29|32602.38|0.09|0.07|N|O|1997-09-04|1997-10-27|1997-09-19|COLLECT COD|FOB| final asymptotes +27366|1902|3|2|20|36078.00|0.06|0.04|N|O|1997-09-03|1997-09-10|1997-09-07|DELIVER IN PERSON|FOB|y regular requests. ironic, unusua +27366|951|20|3|40|74078.00|0.03|0.01|N|O|1997-09-12|1997-09-06|1997-10-10|DELIVER IN PERSON|TRUCK| packages. furiously regula +27366|147|74|4|26|27225.64|0.09|0.06|N|O|1997-11-17|1997-09-06|1997-12-14|TAKE BACK RETURN|FOB|s use slyly. furiously ironic idea +27366|75|26|5|38|37052.66|0.10|0.06|N|O|1997-08-24|1997-10-01|1997-08-25|COLLECT COD|MAIL|ests. dependencies was furio +27367|1687|70|1|25|39717.00|0.00|0.06|N|O|1997-05-22|1997-05-14|1997-06-11|DELIVER IN PERSON|FOB|ccounts cajole slyly. permanent foxes +27367|98|49|2|35|34933.15|0.07|0.01|N|O|1997-04-29|1997-05-21|1997-05-21|NONE|RAIL|carefully special reque +27367|493|52|3|35|48772.15|0.04|0.05|N|O|1997-04-28|1997-05-28|1997-05-04|NONE|REG AIR| regular dependencies use. express pinto +27367|1130|3|4|7|7217.91|0.06|0.04|N|O|1997-05-26|1997-04-20|1997-06-16|TAKE BACK RETURN|RAIL| sleep daringly acc +27367|760|57|5|43|71412.68|0.10|0.06|N|O|1997-04-27|1997-04-11|1997-04-30|DELIVER IN PERSON|AIR|intain. blithely fi +27367|1468|47|6|14|19172.44|0.02|0.01|N|O|1997-06-15|1997-04-26|1997-06-19|DELIVER IN PERSON|TRUCK|ve the depths. slyly bold acco +27367|13|89|7|21|19173.21|0.06|0.04|N|O|1997-04-13|1997-04-15|1997-04-27|COLLECT COD|FOB|quickly even instructions. final +27392|1726|53|1|41|66736.52|0.04|0.08|A|F|1992-03-08|1992-04-11|1992-03-17|COLLECT COD|AIR|sits haggle furiously. requests after +27392|1501|42|2|41|57502.50|0.08|0.00|A|F|1992-05-04|1992-04-14|1992-05-14|COLLECT COD|MAIL| accounts haggle carefully closely +27392|835|2|3|37|64225.71|0.06|0.05|A|F|1992-04-06|1992-04-17|1992-05-03|DELIVER IN PERSON|REG AIR|ooze carefu +27392|488|76|4|21|29158.08|0.05|0.02|R|F|1992-03-11|1992-04-11|1992-03-24|COLLECT COD|RAIL| special requ +27392|1671|95|5|16|25162.72|0.00|0.00|A|F|1992-04-05|1992-04-06|1992-04-25|NONE|AIR|inal dependencies. blithely final deposit +27393|1398|13|1|20|25987.80|0.01|0.02|N|O|1997-07-26|1997-06-07|1997-08-10|DELIVER IN PERSON|SHIP|bout the pending packages. blithel +27394|1894|81|1|42|75427.38|0.09|0.07|N|O|1998-05-24|1998-05-15|1998-05-26|TAKE BACK RETURN|FOB|old excuses. slyly +27394|272|54|2|19|22273.13|0.05|0.00|N|O|1998-05-05|1998-05-19|1998-05-26|DELIVER IN PERSON|REG AIR|accounts nag fluffily f +27394|1283|95|3|40|47371.20|0.03|0.08|N|O|1998-05-30|1998-04-11|1998-06-17|COLLECT COD|RAIL|y ironic requests can mold quickly r +27394|1107|16|4|10|10081.00|0.08|0.08|N|O|1998-04-02|1998-05-22|1998-04-24|COLLECT COD|MAIL|to the even, permanent requests. reg +27394|557|18|5|39|56844.45|0.04|0.00|N|O|1998-04-20|1998-04-20|1998-05-17|NONE|TRUCK|ular accounts lose. accounts use against +27394|547|8|6|30|43426.20|0.06|0.03|N|O|1998-05-21|1998-04-07|1998-05-26|TAKE BACK RETURN|TRUCK|nic foxes. slyly final +27395|1277|52|1|26|30635.02|0.07|0.03|N|O|1997-12-13|1997-11-24|1998-01-05|TAKE BACK RETURN|REG AIR|ss, even dependencies cajole furiousl +27396|492|22|1|37|51522.13|0.08|0.04|R|F|1994-02-26|1994-02-10|1994-03-17|COLLECT COD|SHIP| are blithely alongside of the id +27396|452|82|2|1|1352.45|0.08|0.04|A|F|1993-12-14|1994-03-09|1994-01-11|NONE|FOB|y ironic ideas haggl +27396|1160|97|3|43|45629.88|0.05|0.05|A|F|1994-02-25|1994-01-26|1994-03-15|NONE|MAIL|gle carefully. da +27396|438|39|4|40|53537.20|0.00|0.05|R|F|1994-01-13|1994-02-20|1994-01-20|DELIVER IN PERSON|AIR|es. special foxes cajole carefully. +27397|1109|82|1|8|8080.80|0.06|0.05|N|O|1997-05-02|1997-04-17|1997-05-13|COLLECT COD|SHIP| instructions cajol +27398|98|99|1|21|20959.89|0.09|0.03|A|F|1992-11-05|1992-12-16|1992-11-23|DELIVER IN PERSON|MAIL| requests wake slyly +27398|1397|36|2|14|18177.46|0.05|0.08|A|F|1992-10-01|1992-11-19|1992-10-02|COLLECT COD|REG AIR|ly bold orbits. slyly un +27398|1475|93|3|48|66070.56|0.05|0.07|R|F|1993-01-04|1992-12-07|1993-01-24|DELIVER IN PERSON|TRUCK| slyly bold deposits are blithely. car +27398|1397|12|4|28|36354.92|0.07|0.00|A|F|1992-12-07|1992-12-27|1992-12-25|TAKE BACK RETURN|REG AIR|requests. carefully special +27398|36|12|5|28|26208.84|0.06|0.03|A|F|1992-12-17|1992-12-10|1992-12-29|NONE|MAIL|ts. carefully even excuses cajole. even +27399|1933|78|1|31|56882.83|0.01|0.04|N|O|1997-06-01|1997-05-04|1997-06-02|TAKE BACK RETURN|AIR|e ruthlessly final +27399|1220|21|2|12|13454.64|0.06|0.08|N|O|1997-05-15|1997-05-27|1997-05-23|DELIVER IN PERSON|AIR|osits wake blithely. ironic ac +27399|529|30|3|39|55751.28|0.06|0.00|N|O|1997-03-17|1997-05-31|1997-04-04|NONE|MAIL| permanent requests boost furiously. slyly +27399|1787|14|4|21|35464.38|0.04|0.04|N|O|1997-04-16|1997-05-10|1997-04-27|TAKE BACK RETURN|SHIP|alongside o +27399|1951|84|5|11|20382.45|0.08|0.02|N|O|1997-05-28|1997-04-06|1997-06-24|DELIVER IN PERSON|FOB|ly ironic packages sleep blithely quickly e +27399|788|85|6|38|64173.64|0.04|0.01|N|O|1997-03-22|1997-04-14|1997-04-21|NONE|MAIL|. closely unusual deposit +27399|408|9|7|14|18317.60|0.00|0.02|N|O|1997-05-18|1997-04-29|1997-05-26|TAKE BACK RETURN|SHIP| accounts. silently even +27424|1362|1|1|33|41690.88|0.03|0.08|N|O|1997-04-12|1997-03-16|1997-05-04|TAKE BACK RETURN|REG AIR| furiously express ac +27424|842|76|2|33|57513.72|0.09|0.06|N|O|1997-05-04|1997-03-05|1997-05-14|COLLECT COD|SHIP|luffily slyly pending +27424|1684|8|3|32|50741.76|0.01|0.05|N|O|1997-04-22|1997-03-25|1997-05-06|COLLECT COD|RAIL| pending wart +27424|708|73|4|35|56304.50|0.09|0.06|N|O|1997-03-09|1997-03-29|1997-03-18|NONE|RAIL|arthogs haggle blithely about +27425|661|55|1|24|37479.84|0.00|0.02|R|F|1995-03-29|1995-03-18|1995-04-20|DELIVER IN PERSON|REG AIR|unts. blithely +27426|970|71|1|26|48645.22|0.05|0.01|A|F|1993-06-12|1993-04-13|1993-06-15|COLLECT COD|FOB|. quickly pending ideas across the sly +27426|1293|5|2|45|53743.05|0.09|0.04|R|F|1993-03-14|1993-05-11|1993-04-03|NONE|TRUCK|ravely regular accounts. quickly s +27426|85|36|3|18|17731.44|0.08|0.04|A|F|1993-04-19|1993-04-02|1993-04-24|DELIVER IN PERSON|SHIP|ajole quickly ironic packages. ca +27427|1579|60|1|50|74028.50|0.09|0.06|R|F|1993-11-18|1993-11-06|1993-11-19|COLLECT COD|FOB| ruthlessly final dep +27427|142|43|2|13|13547.82|0.02|0.02|A|F|1993-11-17|1993-12-18|1993-12-07|DELIVER IN PERSON|MAIL|ts. quickly regular foxes haggl +27427|853|87|3|3|5261.55|0.06|0.05|A|F|1993-11-09|1993-12-19|1993-11-24|NONE|RAIL|uctions print fluffily sly +27427|471|30|4|50|68573.50|0.08|0.01|A|F|1993-12-22|1993-11-12|1994-01-15|COLLECT COD|AIR|the quickl +27428|1096|2|1|35|34898.15|0.03|0.01|N|O|1996-06-11|1996-07-11|1996-07-02|COLLECT COD|TRUCK|late alongside of the furiously fi +27429|900|1|1|12|21610.80|0.09|0.03|N|O|1998-05-20|1998-07-11|1998-06-17|NONE|AIR|about the e +27430|1388|27|1|2|2578.76|0.10|0.03|R|F|1995-04-12|1995-03-05|1995-04-22|DELIVER IN PERSON|REG AIR|yly silent p +27430|939|8|2|20|36798.60|0.03|0.07|A|F|1995-03-07|1995-04-14|1995-04-04|NONE|FOB|s. slyly ironic requests are quickly cl +27430|1114|51|3|13|13196.43|0.00|0.05|A|F|1995-05-20|1995-03-27|1995-05-23|TAKE BACK RETURN|AIR| asymptotes. carefully expre +27430|1672|55|4|7|11015.69|0.01|0.05|A|F|1995-03-14|1995-04-23|1995-04-06|DELIVER IN PERSON|REG AIR|ickly regular +27430|741|6|5|16|26267.84|0.00|0.02|R|F|1995-03-25|1995-03-10|1995-04-03|TAKE BACK RETURN|TRUCK|fily. slowly special accounts nod quickly +27431|1565|66|1|3|4399.68|0.10|0.03|N|O|1998-06-26|1998-07-26|1998-07-16|TAKE BACK RETURN|MAIL|r instructions haggle pla +27431|1140|49|2|13|13534.82|0.07|0.06|N|O|1998-07-30|1998-07-22|1998-08-13|TAKE BACK RETURN|REG AIR|usly. quickly +27431|408|96|3|33|43177.20|0.03|0.02|N|O|1998-06-14|1998-06-20|1998-07-11|TAKE BACK RETURN|TRUCK|ly. regular packages thrash abou +27431|738|3|4|7|11471.11|0.08|0.04|N|O|1998-08-21|1998-07-18|1998-09-09|TAKE BACK RETURN|AIR|ites. slyly s +27456|1218|56|1|10|11192.10|0.04|0.04|A|F|1994-05-03|1994-07-03|1994-05-28|COLLECT COD|MAIL|sly. regular epitaphs along the +27456|1667|50|2|18|28235.88|0.10|0.06|A|F|1994-06-09|1994-06-08|1994-06-29|DELIVER IN PERSON|SHIP|oxes detect along the express packa +27456|1372|11|3|28|35654.36|0.04|0.07|R|F|1994-06-09|1994-05-18|1994-06-13|COLLECT COD|AIR|regular dolphins. fluffily even account +27456|1006|42|4|1|907.00|0.04|0.00|A|F|1994-07-13|1994-06-01|1994-08-12|DELIVER IN PERSON|AIR|ges doubt quickly upon t +27456|452|53|5|17|22991.65|0.07|0.01|R|F|1994-05-22|1994-06-26|1994-06-15|DELIVER IN PERSON|RAIL|sly final pinto beans +27456|599|100|6|48|71980.32|0.00|0.05|A|F|1994-08-10|1994-05-17|1994-08-23|COLLECT COD|REG AIR|s. special packages are slyly even acco +27457|1300|1|1|43|51655.90|0.05|0.08|N|O|1995-06-18|1995-07-23|1995-07-14|TAKE BACK RETURN|RAIL| dazzle carefully. pinto beans n +27457|756|89|2|23|38105.25|0.09|0.08|N|O|1995-08-20|1995-07-23|1995-09-02|COLLECT COD|REG AIR|y unusual instructions haggle quickl +27457|109|10|3|10|10091.00|0.08|0.07|N|O|1995-09-07|1995-07-15|1995-09-21|COLLECT COD|REG AIR|the carefully bold packages? always idle r +27457|1171|44|4|9|9649.53|0.10|0.07|N|O|1995-07-09|1995-07-29|1995-08-08|COLLECT COD|REG AIR| final ideas. bold, final frets nag b +27457|1953|86|5|50|92747.50|0.06|0.07|R|F|1995-06-07|1995-06-29|1995-06-09|DELIVER IN PERSON|RAIL|o beans haggle. slyly expres +27458|641|73|1|11|16958.04|0.08|0.04|N|O|1997-08-30|1997-10-01|1997-09-23|TAKE BACK RETURN|RAIL|arefully final deposits. furiously ironic +27458|401|89|2|27|35137.80|0.01|0.03|N|O|1997-09-29|1997-09-23|1997-10-10|COLLECT COD|REG AIR| quickly-- blithely regular instru +27458|1988|33|3|44|83159.12|0.08|0.03|N|O|1997-10-10|1997-10-01|1997-10-13|DELIVER IN PERSON|RAIL|ly quiet packages use slyly ag +27459|1212|13|1|38|42301.98|0.05|0.00|N|O|1997-05-29|1997-06-07|1997-06-12|TAKE BACK RETURN|FOB|cial requests +27459|829|63|2|34|58813.88|0.07|0.06|N|O|1997-04-14|1997-05-26|1997-05-01|COLLECT COD|TRUCK| ironic excuses use bli +27459|1549|90|3|2|2901.08|0.01|0.01|N|O|1997-06-19|1997-07-03|1997-07-07|NONE|TRUCK|heodolites +27459|1673|15|4|39|61412.13|0.01|0.04|N|O|1997-07-05|1997-06-04|1997-07-07|TAKE BACK RETURN|FOB|ial frays sleep caref +27459|1174|75|5|30|32255.10|0.10|0.00|N|O|1997-06-11|1997-05-23|1997-07-10|NONE|RAIL|ts cajole ca +27459|1638|62|6|24|36951.12|0.06|0.03|N|O|1997-04-22|1997-06-28|1997-05-21|NONE|MAIL|se blithely. dependen +27459|1795|22|7|37|62781.23|0.08|0.03|N|O|1997-05-11|1997-06-08|1997-05-15|TAKE BACK RETURN|MAIL|to the blithely bold ideas. slyly iron +27460|1629|71|1|24|36734.88|0.06|0.00|R|F|1994-06-13|1994-06-28|1994-07-10|TAKE BACK RETURN|MAIL|requests about the car +27460|1237|38|2|50|56911.50|0.03|0.07|A|F|1994-06-21|1994-08-03|1994-06-26|DELIVER IN PERSON|TRUCK|ously regular packages. fu +27460|1236|37|3|25|28430.75|0.06|0.02|A|F|1994-08-21|1994-07-03|1994-08-23|DELIVER IN PERSON|AIR|y unusual forges sleep. even +27460|1124|97|4|5|5125.60|0.01|0.01|A|F|1994-07-17|1994-07-01|1994-07-22|TAKE BACK RETURN|AIR|accounts wake above the carefully +27460|1418|36|5|2|2638.82|0.08|0.06|A|F|1994-07-17|1994-07-25|1994-08-03|TAKE BACK RETURN|SHIP|s boost carefully sauternes. s +27460|1968|57|6|43|80408.28|0.08|0.03|R|F|1994-05-26|1994-07-08|1994-06-09|TAKE BACK RETURN|AIR|y final deposit +27460|354|55|7|29|36376.15|0.01|0.01|A|F|1994-07-11|1994-08-11|1994-07-27|NONE|TRUCK|n, even theo +27461|1916|5|1|16|29086.56|0.07|0.06|A|F|1993-06-04|1993-03-30|1993-06-24|TAKE BACK RETURN|TRUCK|encies along +27461|1405|84|2|29|37885.60|0.02|0.02|A|F|1993-05-07|1993-05-24|1993-05-13|TAKE BACK RETURN|AIR|carefully enticing pinto beans cajo +27461|1378|17|3|38|48616.06|0.09|0.08|R|F|1993-05-09|1993-05-28|1993-05-12|TAKE BACK RETURN|SHIP|. regularly unusual acc +27461|26|77|4|7|6482.14|0.07|0.06|A|F|1993-04-19|1993-05-12|1993-05-11|TAKE BACK RETURN|SHIP|t blithely against the deposits. +27461|1226|27|5|50|56361.00|0.05|0.08|A|F|1993-04-27|1993-04-19|1993-05-13|TAKE BACK RETURN|REG AIR|ing foxes. regular foxes +27461|431|19|6|23|30622.89|0.00|0.03|A|F|1993-04-15|1993-04-13|1993-04-19|DELIVER IN PERSON|AIR|structions nag care +27461|227|55|7|31|34943.82|0.01|0.05|A|F|1993-04-12|1993-04-14|1993-04-17|TAKE BACK RETURN|AIR| pending ideas +27462|40|66|1|2|1880.08|0.06|0.06|N|O|1998-04-18|1998-06-10|1998-04-24|NONE|AIR|ven packages nag final foxes. fi +27462|1473|74|2|12|16493.64|0.07|0.03|N|O|1998-04-15|1998-05-13|1998-05-10|DELIVER IN PERSON|TRUCK|ronic instru +27462|1273|11|3|8|9394.16|0.08|0.08|N|O|1998-07-14|1998-05-26|1998-08-07|TAKE BACK RETURN|MAIL|nts. quickly final theodolites c +27462|1968|69|4|25|46749.00|0.05|0.01|N|O|1998-04-20|1998-05-10|1998-05-07|DELIVER IN PERSON|FOB|ly. blithely quick requests cajole b +27462|539|30|5|2|2879.06|0.10|0.07|N|O|1998-05-17|1998-06-07|1998-05-30|DELIVER IN PERSON|REG AIR|arefully bold accounts. furiously bold +27462|176|77|6|43|46275.31|0.05|0.03|N|O|1998-06-14|1998-05-17|1998-06-19|TAKE BACK RETURN|REG AIR|haggle quickly? ex +27462|960|63|7|28|52106.88|0.09|0.07|N|O|1998-06-30|1998-05-18|1998-07-06|DELIVER IN PERSON|SHIP|g the quickly bol +27463|337|66|1|42|51967.86|0.01|0.01|R|F|1995-02-17|1994-12-29|1995-03-01|TAKE BACK RETURN|SHIP|even packages; final package +27463|1957|46|2|24|44614.80|0.05|0.08|A|F|1994-11-16|1995-02-04|1994-11-28|COLLECT COD|AIR|reach. package +27463|1239|14|3|5|5701.15|0.10|0.08|R|F|1994-12-24|1995-01-12|1994-12-28|COLLECT COD|RAIL|ong the theodolites. spe +27463|1202|77|4|9|9928.80|0.07|0.00|A|F|1995-02-17|1995-01-07|1995-03-02|TAKE BACK RETURN|RAIL|dependencies eat furio +27463|1378|17|5|8|10234.96|0.04|0.00|R|F|1995-01-22|1994-12-21|1995-02-02|COLLECT COD|SHIP|ously special req +27463|369|98|6|6|7616.16|0.07|0.03|R|F|1995-01-26|1994-12-19|1995-01-31|COLLECT COD|REG AIR|. daringly even a +27463|1310|25|7|14|16958.34|0.00|0.07|R|F|1995-02-09|1994-12-20|1995-02-15|COLLECT COD|RAIL|s integrate blithely fluffily silent +27488|470|29|1|10|13704.70|0.04|0.05|N|O|1998-06-14|1998-04-13|1998-07-13|DELIVER IN PERSON|REG AIR|cross the packages detect +27488|309|66|2|26|31441.80|0.00|0.06|N|O|1998-03-03|1998-05-20|1998-03-11|TAKE BACK RETURN|REG AIR|ly. carefully even dependencies boost f +27488|1381|58|3|3|3847.14|0.08|0.03|N|O|1998-06-14|1998-05-09|1998-06-26|NONE|MAIL|ns wake blithely. final, express platele +27488|1552|33|4|6|8721.30|0.09|0.04|N|O|1998-03-14|1998-04-16|1998-03-15|COLLECT COD|REG AIR| furiously regular requests. slyl +27489|1347|86|1|19|23718.46|0.07|0.03|N|O|1996-11-26|1996-11-07|1996-11-30|DELIVER IN PERSON|AIR|silent accounts ab +27489|94|45|2|4|3976.36|0.09|0.06|N|O|1996-11-16|1996-11-28|1996-11-26|NONE|REG AIR| unusual ideas +27490|460|48|1|22|29930.12|0.03|0.06|A|F|1992-06-19|1992-05-30|1992-06-29|NONE|TRUCK|totes. special package +27490|1173|46|2|12|12890.04|0.02|0.07|R|F|1992-06-15|1992-04-23|1992-06-28|DELIVER IN PERSON|MAIL| bold requests. f +27490|1906|39|3|37|66892.30|0.10|0.01|R|F|1992-05-10|1992-05-19|1992-06-08|TAKE BACK RETURN|REG AIR| dolphins. pains +27490|64|40|4|28|26993.68|0.00|0.05|R|F|1992-06-16|1992-05-18|1992-07-02|NONE|REG AIR|e alongside of the quickly regular excus +27490|221|76|5|27|30272.94|0.10|0.05|R|F|1992-05-20|1992-05-26|1992-05-29|DELIVER IN PERSON|TRUCK| platelets sleep final request +27490|1309|86|6|10|12103.00|0.03|0.05|A|F|1992-06-21|1992-05-05|1992-07-05|COLLECT COD|TRUCK|y bold patterns mold sl +27490|1956|89|7|7|13005.65|0.10|0.02|A|F|1992-03-19|1992-05-12|1992-04-14|COLLECT COD|AIR| even instruc +27491|781|46|1|13|21863.14|0.07|0.07|R|F|1994-06-01|1994-05-25|1994-06-11|DELIVER IN PERSON|SHIP|ns cajole furiously after the +27491|534|25|2|2|2869.06|0.05|0.00|A|F|1994-04-29|1994-05-15|1994-05-03|DELIVER IN PERSON|RAIL|arefully silent +27491|1017|53|3|17|15606.17|0.06|0.05|A|F|1994-05-01|1994-05-25|1994-05-31|TAKE BACK RETURN|AIR|ly close accounts sleep quietly. de +27491|1976|77|4|44|82630.68|0.01|0.06|A|F|1994-07-24|1994-06-04|1994-08-17|COLLECT COD|FOB|refully even th +27491|1540|21|5|35|50453.90|0.08|0.01|R|F|1994-06-29|1994-05-13|1994-07-20|TAKE BACK RETURN|FOB|y. final accounts along the slyly bold +27491|1699|41|6|48|76833.12|0.01|0.05|A|F|1994-07-18|1994-05-27|1994-07-29|NONE|RAIL|ve accounts above +27492|483|42|1|9|12451.32|0.02|0.00|N|O|1998-03-25|1998-04-19|1998-04-05|DELIVER IN PERSON|MAIL|ckly quickly final requ +27492|176|77|2|4|4304.68|0.02|0.06|N|O|1998-05-04|1998-06-07|1998-05-10|NONE|SHIP|quests integrat +27492|464|23|3|50|68223.00|0.06|0.07|N|O|1998-05-27|1998-04-24|1998-06-10|DELIVER IN PERSON|RAIL|ideas was besid +27492|277|78|4|7|8240.89|0.04|0.05|N|O|1998-06-29|1998-05-22|1998-07-29|NONE|MAIL|egular instructions. furiously f +27492|150|29|5|19|19952.85|0.02|0.01|N|O|1998-05-24|1998-05-10|1998-06-07|NONE|SHIP|ve the slyly final theodolites? +27492|498|28|6|10|13984.90|0.06|0.08|N|O|1998-05-07|1998-05-21|1998-05-08|NONE|AIR|sits. quickly special packages n +27492|1209|21|7|37|41077.40|0.07|0.02|N|O|1998-06-28|1998-05-14|1998-07-02|NONE|MAIL|c platelets boost quickly besides the fin +27493|851|18|1|32|56059.20|0.05|0.02|N|O|1997-04-12|1997-04-30|1997-05-03|TAKE BACK RETURN|FOB|egular excuses are blithely al +27493|1843|30|2|15|26172.60|0.00|0.01|N|O|1997-06-16|1997-04-20|1997-07-15|NONE|REG AIR|usly final +27494|732|65|1|39|63676.47|0.00|0.00|N|O|1997-04-05|1997-05-13|1997-04-17|DELIVER IN PERSON|MAIL| furiously special pinto bea +27494|1400|39|2|2|2602.80|0.10|0.04|N|O|1997-05-24|1997-04-16|1997-06-14|DELIVER IN PERSON|REG AIR|s. blithely r +27494|41|17|3|30|28231.20|0.08|0.07|N|O|1997-04-27|1997-04-30|1997-05-17|COLLECT COD|AIR|are pending d +27494|133|86|4|49|50623.37|0.07|0.02|N|O|1997-03-25|1997-05-26|1997-03-30|DELIVER IN PERSON|FOB|ly silent foxes +27494|492|22|5|37|51522.13|0.08|0.06|N|O|1997-07-14|1997-05-24|1997-08-09|COLLECT COD|SHIP|uffily regular +27494|1544|85|6|24|34692.96|0.05|0.01|N|O|1997-04-30|1997-06-02|1997-05-09|NONE|FOB|ourts. fluffily +27495|1930|75|1|16|29310.88|0.03|0.08|N|O|1997-11-21|1997-10-16|1997-12-06|DELIVER IN PERSON|RAIL|sly special dep +27495|1046|17|2|41|38828.64|0.00|0.05|N|O|1997-08-23|1997-08-28|1997-09-06|COLLECT COD|FOB|s sleep furiously fur +27495|1678|20|3|14|22115.38|0.10|0.08|N|O|1997-09-07|1997-08-28|1997-09-17|DELIVER IN PERSON|RAIL|efully ironic re +27495|1328|67|4|40|49172.80|0.09|0.00|N|O|1997-10-17|1997-10-10|1997-10-22|NONE|TRUCK|eposits are +27495|1226|38|5|33|37198.26|0.05|0.03|N|O|1997-10-10|1997-10-15|1997-10-15|DELIVER IN PERSON|TRUCK| final excuses. furiously fina +27520|30|6|1|14|13020.42|0.04|0.05|N|O|1996-09-20|1996-08-27|1996-09-30|DELIVER IN PERSON|SHIP| quickly quietly pending theodolit +27520|1062|98|2|41|39485.46|0.05|0.02|N|O|1996-11-11|1996-10-11|1996-11-16|DELIVER IN PERSON|AIR| against the carefully even foxes. bold re +27520|1012|48|3|14|12782.14|0.03|0.03|N|O|1996-08-29|1996-10-03|1996-09-14|DELIVER IN PERSON|RAIL|ing ideas integrate slyly. +27520|1650|51|4|32|49652.80|0.02|0.07|N|O|1996-10-29|1996-09-28|1996-11-01|NONE|MAIL|fully regular asym +27520|120|47|5|48|48965.76|0.00|0.04|N|O|1996-07-15|1996-09-17|1996-07-23|DELIVER IN PERSON|MAIL|fully ironic +27520|994|97|6|17|32214.83|0.09|0.02|N|O|1996-10-16|1996-09-01|1996-10-23|NONE|AIR|pecial pinto beans. pending ide +27520|1105|78|7|46|46280.60|0.00|0.07|N|O|1996-08-06|1996-08-21|1996-08-25|COLLECT COD|RAIL|sly final instructions use furiously reg +27521|1017|18|1|32|29376.32|0.08|0.06|R|F|1994-03-28|1994-03-02|1994-04-05|DELIVER IN PERSON|TRUCK|express packages +27522|1859|89|1|40|70434.00|0.04|0.02|N|O|1998-03-03|1998-02-06|1998-03-09|NONE|AIR|r accounts wake slyly. bold deposits ar +27522|1667|9|2|1|1568.66|0.03|0.00|N|O|1998-04-18|1998-02-07|1998-04-30|DELIVER IN PERSON|REG AIR|oxes haggle blithely never final theo +27522|841|42|3|34|59222.56|0.02|0.00|N|O|1998-01-16|1998-03-22|1998-01-28|DELIVER IN PERSON|REG AIR|slyly regular requests. regular, ironic i +27522|1872|16|4|14|24834.18|0.10|0.06|N|O|1998-01-16|1998-03-17|1998-02-12|COLLECT COD|MAIL|lently ironic accounts. bli +27522|861|95|5|15|26427.90|0.03|0.00|N|O|1998-01-03|1998-02-11|1998-01-09|DELIVER IN PERSON|TRUCK|arefully quick platelets boost +27522|66|67|6|30|28981.80|0.09|0.04|N|O|1998-04-15|1998-02-23|1998-04-19|TAKE BACK RETURN|SHIP|re carefully against the quickly pe +27522|906|75|7|9|16262.10|0.06|0.00|N|O|1998-01-18|1998-02-08|1998-02-11|COLLECT COD|RAIL|of the even requests +27523|1560|1|1|21|30692.76|0.08|0.07|N|O|1997-05-03|1997-04-06|1997-05-20|TAKE BACK RETURN|FOB|. express deposits wake above the carefully +27524|1638|39|1|41|63124.83|0.04|0.00|R|F|1993-02-05|1993-03-04|1993-02-08|TAKE BACK RETURN|TRUCK|pendencies. +27524|478|37|2|12|16541.64|0.04|0.08|A|F|1993-02-15|1993-03-21|1993-02-24|TAKE BACK RETURN|MAIL| players: careful, even h +27524|656|19|3|24|37359.60|0.01|0.01|A|F|1993-05-04|1993-04-28|1993-05-12|COLLECT COD|FOB|endencies wake above the quick +27524|1170|7|4|14|14996.38|0.01|0.03|A|F|1993-03-01|1993-04-16|1993-03-29|NONE|TRUCK|ully even de +27525|1280|92|1|24|28350.72|0.09|0.00|R|F|1992-08-07|1992-08-19|1992-08-28|DELIVER IN PERSON|SHIP|l accounts integrate. carefull +27525|1058|59|2|12|11508.60|0.10|0.05|A|F|1992-08-07|1992-07-26|1992-09-03|TAKE BACK RETURN|AIR|osits. regular courts boost furio +27525|1889|76|3|33|59099.04|0.03|0.04|A|F|1992-09-16|1992-07-25|1992-09-28|NONE|SHIP| special theodolites print slyly against +27525|1249|87|4|12|13802.88|0.03|0.04|R|F|1992-07-01|1992-08-19|1992-07-17|COLLECT COD|SHIP|ts mold against the regular dependenc +27526|399|28|1|46|59771.94|0.02|0.03|N|O|1995-12-15|1995-12-26|1995-12-25|NONE|RAIL|sts. slyly special deposit +27526|962|31|2|35|65203.60|0.01|0.01|N|O|1995-11-01|1995-11-23|1995-11-08|TAKE BACK RETURN|REG AIR| boost among the brav +27526|695|89|3|41|65423.29|0.05|0.05|N|O|1996-01-11|1995-12-07|1996-01-17|DELIVER IN PERSON|FOB|ending dep +27526|517|18|4|12|17010.12|0.05|0.08|N|O|1996-01-03|1995-11-16|1996-01-11|COLLECT COD|MAIL|ar courts. final, special depo +27526|1529|70|5|44|62942.88|0.10|0.01|N|O|1995-11-11|1995-11-15|1995-12-04|DELIVER IN PERSON|FOB|gly ironic excuses. quic +27527|1056|62|1|9|8613.45|0.00|0.03|R|F|1994-01-21|1994-02-16|1994-02-09|COLLECT COD|MAIL|ong the fin +27527|315|16|2|14|17014.34|0.00|0.02|A|F|1993-12-10|1994-02-19|1993-12-18|NONE|REG AIR|slyly ironic deposits. regular packages ha +27527|1124|25|3|27|27678.24|0.01|0.06|R|F|1994-01-22|1994-02-21|1994-02-07|TAKE BACK RETURN|MAIL|requests solve quickly re +27527|1685|27|4|6|9520.08|0.01|0.01|A|F|1994-03-08|1994-02-05|1994-03-29|NONE|MAIL| pending packages detect slyl +27527|430|89|5|2|2660.86|0.04|0.08|A|F|1994-02-03|1994-02-20|1994-02-17|COLLECT COD|MAIL|hs. carefully ironic deposits acco +27527|792|57|6|18|30470.22|0.01|0.05|A|F|1994-01-08|1994-02-18|1994-02-06|DELIVER IN PERSON|MAIL|xpress ideas. express foxes wake. +27552|1370|9|1|11|13985.07|0.00|0.08|A|F|1992-10-30|1992-12-09|1992-11-20|COLLECT COD|AIR|lly silent decoys are blithely p +27552|912|15|2|41|74329.31|0.10|0.05|A|F|1992-12-27|1992-10-29|1993-01-16|NONE|REG AIR|pecial sauternes a +27553|146|25|1|23|24061.22|0.08|0.04|N|O|1995-09-02|1995-10-24|1995-09-19|DELIVER IN PERSON|REG AIR| at the requests use slyly de +27553|1015|16|2|36|32976.36|0.01|0.04|N|O|1995-10-16|1995-10-07|1995-10-26|NONE|TRUCK|es. blithely iron +27553|1971|4|3|42|78664.74|0.09|0.02|N|O|1995-11-17|1995-11-09|1995-11-19|DELIVER IN PERSON|SHIP|ding to the pending, final sentim +27553|1099|35|4|10|10000.90|0.01|0.05|N|O|1995-11-29|1995-11-07|1995-12-09|COLLECT COD|MAIL| instructions nag slyly ironic foxes +27554|998|99|1|43|81656.57|0.03|0.01|R|F|1995-05-07|1995-06-06|1995-05-31|TAKE BACK RETURN|MAIL|ding packages +27554|1311|26|2|37|44855.47|0.10|0.00|R|F|1995-05-22|1995-04-13|1995-06-14|TAKE BACK RETURN|AIR|theodolites. express, ironic d +27555|595|96|1|18|26920.62|0.07|0.03|R|F|1994-11-29|1994-10-18|1994-12-16|TAKE BACK RETURN|FOB|sits across the sly +27555|617|11|2|30|45528.30|0.05|0.05|A|F|1994-11-22|1994-10-16|1994-12-01|TAKE BACK RETURN|MAIL|usual instructions cajole. regular, f +27555|1147|48|3|4|4192.56|0.01|0.01|R|F|1994-10-15|1994-11-23|1994-11-04|DELIVER IN PERSON|AIR|ld excuses wake. fluffily final ideas s +27555|725|26|4|17|27637.24|0.06|0.06|A|F|1994-11-16|1994-11-21|1994-11-26|COLLECT COD|SHIP| slyly special, ironic requests. slyly eve +27555|252|34|5|16|18436.00|0.02|0.05|R|F|1994-12-22|1994-10-03|1995-01-03|COLLECT COD|SHIP|hely regular reques +27556|1023|29|1|15|13860.30|0.05|0.08|R|F|1992-07-01|1992-08-10|1992-07-09|COLLECT COD|AIR|ely unusual accou +27556|1895|96|2|37|66484.93|0.09|0.04|A|F|1992-08-08|1992-08-08|1992-08-21|DELIVER IN PERSON|TRUCK|e: slyly ironic dependencies affix carefull +27556|244|72|3|17|19452.08|0.08|0.08|R|F|1992-06-08|1992-07-05|1992-06-22|DELIVER IN PERSON|SHIP| evenly even ideas. quickly bold deposits w +27557|517|48|1|28|39690.28|0.09|0.05|A|F|1992-03-26|1992-04-15|1992-04-22|COLLECT COD|RAIL|arefully special accounts. final instructio +27557|744|45|2|13|21381.62|0.07|0.03|A|F|1992-04-18|1992-04-15|1992-04-22|COLLECT COD|REG AIR|posits. slyly final theo +27557|933|68|3|22|40346.46|0.10|0.01|R|F|1992-04-15|1992-03-11|1992-05-06|DELIVER IN PERSON|REG AIR| evenly final deposits s +27557|837|38|4|36|62561.88|0.10|0.01|A|F|1992-03-26|1992-03-13|1992-03-29|COLLECT COD|TRUCK|aggle express pa +27557|1362|39|5|27|34110.72|0.10|0.00|R|F|1992-04-19|1992-03-10|1992-05-14|COLLECT COD|MAIL|special pinto beans boost fur +27557|1691|15|6|21|33446.49|0.07|0.01|R|F|1992-04-29|1992-03-18|1992-05-06|TAKE BACK RETURN|SHIP|y bold deposits shall have to sleep +27557|732|65|7|19|31021.87|0.09|0.03|R|F|1992-02-29|1992-04-20|1992-03-29|COLLECT COD|REG AIR|special deposits cajol +27558|1|27|1|10|9010.00|0.02|0.07|N|O|1995-09-03|1995-09-13|1995-09-15|DELIVER IN PERSON|REG AIR|cording to the ironic deposits could wake a +27559|1410|28|1|42|55079.22|0.09|0.01|N|O|1995-12-27|1996-01-10|1995-12-28|TAKE BACK RETURN|TRUCK|long the slyly regular deposits. q +27559|422|10|2|28|37027.76|0.08|0.02|N|O|1995-12-11|1995-12-19|1995-12-14|COLLECT COD|RAIL|en platele +27559|1743|28|3|47|77302.78|0.10|0.01|N|O|1995-12-11|1995-12-27|1995-12-19|NONE|REG AIR|low deposits haggle bl +27584|1732|33|1|44|71884.12|0.07|0.00|N|O|1998-08-27|1998-06-08|1998-09-16|TAKE BACK RETURN|AIR|ly final deposits along the regular accou +27584|1376|15|2|23|29379.51|0.02|0.04|N|O|1998-06-17|1998-06-14|1998-06-27|COLLECT COD|FOB|y regular deposits above the regular de +27584|1681|82|3|10|15826.80|0.06|0.02|N|O|1998-06-15|1998-06-29|1998-06-18|DELIVER IN PERSON|MAIL|oss the regular, final foxes. +27584|1611|12|4|33|49916.13|0.02|0.01|N|O|1998-08-10|1998-08-02|1998-08-15|COLLECT COD|AIR|bove the furious, +27584|152|31|5|24|25251.60|0.01|0.01|N|O|1998-07-11|1998-07-27|1998-07-31|COLLECT COD|AIR|ests. furiously pending +27584|1639|63|6|40|61625.20|0.02|0.08|N|O|1998-08-26|1998-06-28|1998-09-09|DELIVER IN PERSON|FOB| the carefully unusua +27584|1849|79|7|45|78787.80|0.08|0.08|N|O|1998-05-21|1998-07-28|1998-05-28|TAKE BACK RETURN|REG AIR|counts. fluffily final +27585|999|34|1|1|1899.99|0.03|0.05|N|O|1997-10-07|1997-09-30|1997-10-31|TAKE BACK RETURN|AIR|e warhorses. final pa +27585|1594|75|2|27|40380.93|0.01|0.01|N|O|1997-11-11|1997-11-03|1997-11-21|NONE|FOB|pecial, unusual deposits. unu +27585|1361|76|3|32|40395.52|0.00|0.06|N|O|1997-11-09|1997-11-04|1997-11-15|TAKE BACK RETURN|TRUCK|posits. even, regul +27585|588|79|4|32|47634.56|0.02|0.00|N|O|1997-11-12|1997-10-18|1997-12-08|DELIVER IN PERSON|FOB|y. fluffily unusual +27585|469|57|5|43|58886.78|0.03|0.08|N|O|1997-10-18|1997-10-31|1997-10-30|COLLECT COD|TRUCK|es use. qui +27585|488|47|6|37|51373.76|0.06|0.06|N|O|1997-10-05|1997-09-22|1997-10-24|NONE|MAIL|. quickly +27585|1483|23|7|46|63686.08|0.08|0.06|N|O|1997-10-06|1997-09-29|1997-10-25|TAKE BACK RETURN|RAIL| requests hagg +27586|865|99|1|31|54741.66|0.05|0.02|N|O|1998-01-04|1998-02-20|1998-01-28|DELIVER IN PERSON|RAIL|eposits detect slyly accounts. carefully +27586|978|13|2|33|62006.01|0.04|0.07|N|O|1998-02-22|1998-02-14|1998-02-28|COLLECT COD|SHIP|ideas. closely ironic instructions wake ag +27586|1971|4|3|30|56189.10|0.10|0.03|N|O|1998-03-05|1998-01-27|1998-03-11|DELIVER IN PERSON|FOB|ing to the slyly final +27586|1713|98|4|37|59744.27|0.03|0.01|N|O|1998-04-20|1998-02-11|1998-05-01|NONE|FOB|posits. blithely stealthy pack +27586|86|62|5|24|23665.92|0.00|0.00|N|O|1997-12-25|1998-03-06|1998-01-23|COLLECT COD|RAIL|es thrash among the furiously regular saut +27587|446|47|1|25|33661.00|0.01|0.07|N|O|1996-11-28|1996-12-08|1996-12-23|DELIVER IN PERSON|AIR| instructions. carefully regular theodo +27587|873|40|2|22|39025.14|0.00|0.04|N|O|1996-12-02|1996-12-16|1996-12-06|NONE|MAIL|c accounts. brave gifts use requests +27587|1449|28|3|10|13504.40|0.00|0.08|N|O|1996-11-22|1996-12-05|1996-12-07|TAKE BACK RETURN|AIR|ithely express requests +27587|1191|92|4|1|1092.19|0.03|0.04|N|O|1997-02-16|1997-01-20|1997-03-14|TAKE BACK RETURN|RAIL|elets. ironi +27587|213|95|5|3|3339.63|0.02|0.01|N|O|1996-11-20|1996-12-13|1996-11-25|NONE|RAIL|oxes. furiously special +27587|822|56|6|10|17228.20|0.02|0.08|N|O|1996-12-20|1996-11-24|1997-01-07|NONE|FOB|unusual accounts s +27588|1657|99|1|22|34290.30|0.03|0.03|N|O|1998-10-22|1998-10-24|1998-11-19|COLLECT COD|AIR|xpress tithes cajole. final +27589|934|3|1|11|20184.23|0.02|0.00|N|O|1995-10-12|1995-10-17|1995-11-06|TAKE BACK RETURN|TRUCK|ccounts will hav +27589|401|89|2|42|54658.80|0.10|0.08|N|O|1995-11-25|1995-11-06|1995-12-16|NONE|TRUCK|beans. slyly even ideas nag +27589|1819|63|3|12|20649.72|0.09|0.01|N|O|1995-10-08|1995-10-20|1995-10-24|DELIVER IN PERSON|AIR|sts affix furiously bold foxes. +27589|118|19|4|15|15271.65|0.01|0.08|N|O|1995-11-07|1995-11-23|1995-12-02|DELIVER IN PERSON|TRUCK|unusual foxes cajole furiously q +27589|434|64|5|19|25354.17|0.06|0.01|N|O|1995-11-09|1995-12-01|1995-11-15|NONE|TRUCK|jole stealthily along the slyly spe +27590|1995|84|1|2|3793.98|0.04|0.05|A|F|1994-07-16|1994-09-22|1994-08-01|DELIVER IN PERSON|TRUCK|gainst the daringly pending requests? furio +27590|1803|4|2|7|11933.60|0.02|0.08|A|F|1994-07-25|1994-09-04|1994-08-03|TAKE BACK RETURN|SHIP|sits after the silently reg +27590|1845|89|3|43|75114.12|0.09|0.03|R|F|1994-10-12|1994-09-05|1994-10-24|NONE|MAIL|tructions. ironic +27590|1305|44|4|13|15681.90|0.06|0.03|A|F|1994-10-26|1994-10-03|1994-11-07|COLLECT COD|FOB|uickly regular pinto +27590|1689|90|5|28|44539.04|0.05|0.04|A|F|1994-09-06|1994-10-06|1994-10-05|NONE|MAIL|ructions. slyly exp +27591|1700|83|1|19|30432.30|0.06|0.01|N|O|1998-02-09|1998-02-27|1998-03-06|COLLECT COD|SHIP| special, final +27591|221|22|2|27|30272.94|0.05|0.08|N|O|1998-01-29|1998-04-03|1998-02-19|DELIVER IN PERSON|MAIL| boost furiously bo +27591|1701|86|3|25|40067.50|0.02|0.01|N|O|1998-05-01|1998-04-06|1998-05-14|TAKE BACK RETURN|FOB|ests. final requests sle +27591|1032|3|4|47|43852.41|0.05|0.00|N|O|1998-05-04|1998-03-29|1998-05-15|COLLECT COD|REG AIR|hely against the +27591|626|20|5|33|50378.46|0.02|0.04|N|O|1998-03-28|1998-02-17|1998-04-16|COLLECT COD|TRUCK|ccounts abo +27591|661|62|6|5|7808.30|0.03|0.06|N|O|1998-03-11|1998-04-02|1998-04-05|TAKE BACK RETURN|RAIL|eans wake closely! quickly silent accou +27591|1786|71|7|46|77637.88|0.08|0.02|N|O|1998-03-27|1998-03-19|1998-04-01|COLLECT COD|RAIL|, fluffy dolphins. carefu +27616|934|3|1|41|75232.13|0.07|0.03|A|F|1992-11-08|1992-09-10|1992-12-04|DELIVER IN PERSON|TRUCK|cial foxes sublate slyly. slyly regul +27616|169|96|2|21|22452.36|0.00|0.06|A|F|1992-10-05|1992-09-25|1992-10-08|TAKE BACK RETURN|MAIL|the carefully bold requests +27616|1080|51|3|35|34337.80|0.06|0.00|R|F|1992-11-09|1992-09-07|1992-11-20|NONE|TRUCK|osits use ruthless requests. caref +27616|1076|47|4|13|12701.91|0.07|0.08|R|F|1992-10-03|1992-10-10|1992-10-21|DELIVER IN PERSON|REG AIR|g to the p +27616|1994|27|5|35|66359.65|0.07|0.00|A|F|1992-11-12|1992-10-25|1992-12-04|DELIVER IN PERSON|AIR| slyly express instructions. ironic +27617|5|6|1|3|2715.00|0.01|0.06|A|F|1993-02-26|1993-01-19|1993-03-07|COLLECT COD|TRUCK|ctions. furiously express decoys slee +27617|1425|4|2|50|66321.00|0.05|0.07|A|F|1993-01-25|1993-01-23|1993-01-31|COLLECT COD|RAIL|fter the carefully silent r +27617|255|37|3|3|3465.75|0.08|0.03|A|F|1992-11-13|1993-01-18|1992-12-06|DELIVER IN PERSON|REG AIR| silent accounts hi +27617|31|7|4|15|13965.45|0.02|0.06|A|F|1993-02-17|1992-12-27|1993-03-06|DELIVER IN PERSON|AIR|ang across the fluffily express pac +27618|875|76|1|47|83465.89|0.08|0.04|R|F|1993-08-20|1993-08-14|1993-09-19|COLLECT COD|REG AIR|rs. express requests +27618|1260|98|2|30|34837.80|0.09|0.03|A|F|1993-06-02|1993-07-22|1993-06-21|DELIVER IN PERSON|REG AIR|furiously final i +27619|1839|26|1|11|19149.13|0.09|0.01|A|F|1994-10-01|1994-11-03|1994-10-09|DELIVER IN PERSON|MAIL|the ironic pains a +27619|1697|80|2|20|31973.80|0.08|0.01|A|F|1994-10-02|1994-11-10|1994-10-03|TAKE BACK RETURN|RAIL|ajole requests: caref +27619|116|69|3|40|40644.40|0.02|0.07|A|F|1994-08-22|1994-10-07|1994-09-04|COLLECT COD|SHIP|final packages sleep +27620|1030|36|1|25|23275.75|0.09|0.04|N|O|1996-12-20|1996-12-12|1997-01-17|DELIVER IN PERSON|FOB|st across the pending deposit +27621|786|83|1|12|20241.36|0.09|0.00|N|O|1997-12-13|1997-11-25|1998-01-08|NONE|FOB|s sleep quic +27621|1772|57|2|1|1673.77|0.03|0.05|N|O|1998-01-07|1997-11-27|1998-02-02|DELIVER IN PERSON|REG AIR|ions haggle blithely quickly bol +27621|1410|28|3|16|20982.56|0.01|0.06|N|O|1998-01-05|1997-11-14|1998-01-07|TAKE BACK RETURN|TRUCK| nag carefully +27621|1085|56|4|7|6902.56|0.09|0.02|N|O|1997-12-07|1997-12-27|1997-12-13|NONE|SHIP|arefully quiet ideas are across the slyly +27621|503|4|5|5|7017.50|0.08|0.06|N|O|1997-11-17|1997-12-04|1997-11-21|NONE|TRUCK|c accounts are carefully. +27622|991|94|1|42|79463.58|0.07|0.04|R|F|1995-03-31|1995-03-19|1995-04-03|TAKE BACK RETURN|AIR|fter the blithely fi +27623|158|59|1|19|20104.85|0.10|0.05|N|O|1996-04-22|1996-04-10|1996-05-17|COLLECT COD|RAIL|final warhorses. silent +27623|478|37|2|17|23433.99|0.08|0.03|N|O|1996-04-21|1996-04-17|1996-04-24|TAKE BACK RETURN|RAIL|beans. quickly even ideas haggle slyly abo +27623|626|58|3|27|41218.74|0.02|0.01|N|O|1996-05-22|1996-05-04|1996-05-27|COLLECT COD|RAIL|. realms after the blithely unusu +27623|1371|86|4|27|34353.99|0.09|0.02|N|O|1996-03-13|1996-04-22|1996-04-08|COLLECT COD|TRUCK|e furiously +27623|1208|9|5|25|27730.00|0.10|0.03|N|O|1996-03-18|1996-03-16|1996-03-27|NONE|RAIL|ffily regular deposits wake account +27623|1309|10|6|29|35098.70|0.03|0.07|N|O|1996-04-14|1996-04-06|1996-04-27|TAKE BACK RETURN|TRUCK|telets. slyly spec +27623|224|52|7|45|50589.90|0.06|0.00|N|O|1996-02-24|1996-04-20|1996-03-25|TAKE BACK RETURN|SHIP|ind special accounts. blithely +27648|1091|27|1|43|42659.87|0.06|0.00|A|F|1994-12-29|1994-11-21|1995-01-11|COLLECT COD|AIR|fix slyly. express asympto +27648|225|80|2|15|16878.30|0.07|0.08|R|F|1994-09-21|1994-10-24|1994-10-21|TAKE BACK RETURN|REG AIR|ly. final +27649|860|27|1|16|28173.76|0.08|0.00|N|O|1996-03-25|1996-04-05|1996-04-24|TAKE BACK RETURN|AIR| the fluffily quiet requests +27649|824|58|2|8|13798.56|0.09|0.06|N|O|1996-05-09|1996-04-03|1996-05-24|TAKE BACK RETURN|TRUCK|y ironic packages. carefully pend +27649|1634|35|3|1|1535.63|0.05|0.04|N|O|1996-02-22|1996-04-12|1996-03-15|COLLECT COD|AIR|ccording to the fina +27650|1789|16|1|1|1690.78|0.03|0.08|A|F|1992-11-11|1992-08-26|1992-11-26|COLLECT COD|TRUCK|e across the pac +27651|643|6|1|28|43221.92|0.10|0.07|N|O|1998-01-05|1998-01-05|1998-01-16|TAKE BACK RETURN|REG AIR|foxes about the unusual deposits cajole ca +27651|1645|28|2|35|54132.40|0.05|0.00|N|O|1998-02-03|1997-12-31|1998-02-13|COLLECT COD|SHIP| ideas. express pinto +27651|898|65|3|31|55765.59|0.04|0.08|N|O|1998-01-30|1998-01-14|1998-02-12|TAKE BACK RETURN|SHIP| cajole fluffil +27651|577|8|4|26|38416.82|0.05|0.06|N|O|1998-01-21|1998-01-01|1998-02-04|TAKE BACK RETURN|TRUCK|s. final, f +27651|505|66|5|16|22488.00|0.02|0.01|N|O|1998-02-23|1998-02-07|1998-02-28|DELIVER IN PERSON|FOB|ake carefully according to the quic +27652|414|15|1|49|64406.09|0.10|0.00|R|F|1993-03-24|1993-03-04|1993-04-20|NONE|MAIL|ial requests a +27652|1123|24|2|32|32771.84|0.07|0.04|A|F|1993-03-26|1993-03-23|1993-03-27|COLLECT COD|AIR|even dolphin +27652|1738|81|3|49|80346.77|0.03|0.02|R|F|1993-01-29|1993-02-21|1993-02-25|NONE|TRUCK|ids haggle. carefully regular requ +27652|817|17|4|45|77301.45|0.01|0.00|A|F|1993-03-27|1993-02-16|1993-04-21|NONE|MAIL| somas. quickly even asymptotes wake. +27652|532|33|5|31|44408.43|0.08|0.00|R|F|1993-02-14|1993-02-22|1993-02-23|TAKE BACK RETURN|MAIL|nts. evenly regular deposits a +27652|723|20|6|17|27603.24|0.03|0.06|A|F|1993-02-06|1993-02-14|1993-02-28|TAKE BACK RETURN|RAIL|. blithely unusual packages haggle +27653|451|81|1|22|29731.90|0.01|0.08|N|O|1995-07-25|1995-08-15|1995-08-04|NONE|REG AIR| the fluffily dogged deposits. slyly +27654|1340|55|1|11|13654.74|0.03|0.01|A|F|1994-01-21|1993-10-28|1994-01-30|NONE|RAIL|r dependencies hi +27654|378|63|2|18|23010.66|0.04|0.03|A|F|1993-09-27|1993-11-07|1993-10-08|COLLECT COD|FOB|the regular dependencies. slyly ironi +27654|1595|36|3|15|22448.85|0.05|0.02|R|F|1994-01-15|1993-11-18|1994-02-02|DELIVER IN PERSON|FOB|s theodolites +27654|1370|47|4|12|15256.44|0.08|0.04|R|F|1994-01-13|1993-11-17|1994-01-25|TAKE BACK RETURN|TRUCK|accounts sleep abo +27655|1088|94|1|1|989.08|0.05|0.05|N|O|1998-01-29|1998-02-27|1998-02-09|COLLECT COD|SHIP|equests detect furiously regular plate +27655|919|88|2|27|49137.57|0.08|0.04|N|O|1998-03-31|1998-03-04|1998-04-22|TAKE BACK RETURN|SHIP|lithely quiet ideas boost. carefully fin +27680|522|23|1|49|69703.48|0.07|0.05|A|F|1993-04-12|1993-04-02|1993-05-12|DELIVER IN PERSON|MAIL| the blithely even accounts mold +27680|489|77|2|47|65305.56|0.09|0.07|A|F|1993-03-19|1993-04-07|1993-03-31|DELIVER IN PERSON|AIR|al accounts affi +27680|1016|17|3|23|21091.23|0.02|0.02|A|F|1993-02-01|1993-04-12|1993-03-02|DELIVER IN PERSON|SHIP|ep after the furiously ironic dep +27680|1152|25|4|27|28435.05|0.01|0.07|R|F|1993-04-24|1993-03-01|1993-05-19|TAKE BACK RETURN|FOB|stealthily unusual deposits ca +27680|484|72|5|38|52610.24|0.04|0.00|R|F|1993-02-19|1993-03-19|1993-03-19|NONE|FOB| final packages acc +27680|177|4|6|35|37700.95|0.03|0.02|R|F|1993-04-25|1993-03-09|1993-05-24|COLLECT COD|REG AIR|nal courts. fluffily regular id +27680|1519|40|7|38|53979.38|0.06|0.00|A|F|1993-04-13|1993-04-23|1993-04-28|DELIVER IN PERSON|REG AIR|ar packages. carefully regular accounts p +27681|1133|70|1|27|27921.51|0.08|0.07|A|F|1994-01-11|1994-01-11|1994-01-29|DELIVER IN PERSON|RAIL|ly final requests detect. re +27681|1600|81|2|10|15016.00|0.06|0.00|A|F|1993-12-03|1994-01-12|1993-12-15|DELIVER IN PERSON|RAIL|ithely final excuses hang careful +27681|1906|95|3|44|79547.60|0.04|0.01|A|F|1993-12-10|1993-12-26|1993-12-27|NONE|TRUCK|pending, regular packag +27682|1243|18|1|17|19452.08|0.08|0.03|A|F|1994-09-30|1994-09-13|1994-10-23|NONE|RAIL|heaves are finally regular pla +27682|1035|71|2|37|34633.11|0.01|0.05|A|F|1994-09-21|1994-08-30|1994-10-21|COLLECT COD|TRUCK|ely dependencies. quickly i +27683|507|98|1|12|16890.00|0.00|0.01|N|O|1995-12-08|1995-12-15|1995-12-22|TAKE BACK RETURN|SHIP|ourts according to the carefully regular +27683|1247|85|2|2|2296.48|0.00|0.00|N|O|1996-02-04|1995-12-02|1996-02-06|COLLECT COD|FOB|ckly regular deposits across the ironic +27683|1261|62|3|39|45328.14|0.04|0.03|N|O|1995-12-15|1995-12-29|1996-01-14|COLLECT COD|RAIL|fully special requests. i +27684|1349|50|1|19|23756.46|0.03|0.03|N|O|1995-10-18|1995-10-15|1995-10-27|NONE|FOB|toward the furiously pending dolp +27684|1435|75|2|45|60139.35|0.02|0.07|N|O|1995-11-06|1995-11-02|1995-12-01|TAKE BACK RETURN|REG AIR| unusual asymptotes-- bold fox +27684|19|45|3|48|44112.48|0.04|0.00|N|O|1995-10-15|1995-11-06|1995-10-24|DELIVER IN PERSON|FOB|uickly final ac +27684|187|40|4|31|33702.58|0.00|0.05|N|O|1995-11-12|1995-10-13|1995-11-21|TAKE BACK RETURN|TRUCK|e along the carefully furi +27685|1365|42|1|36|45588.96|0.04|0.04|N|O|1997-09-09|1997-11-15|1997-10-04|COLLECT COD|FOB|g, even requests cajo +27685|559|20|2|2|2919.10|0.08|0.08|N|O|1997-11-21|1997-11-15|1997-12-01|TAKE BACK RETURN|RAIL|onic ideas. +27686|1870|57|1|21|37209.27|0.05|0.06|A|F|1993-05-13|1993-03-04|1993-06-01|DELIVER IN PERSON|FOB|. express dolphins nag quickly among +27687|665|59|1|47|73586.02|0.07|0.05|R|F|1993-07-18|1993-06-04|1993-08-11|TAKE BACK RETURN|AIR|y quickly final theodolites. requests +27687|157|84|2|30|31714.50|0.01|0.01|R|F|1993-08-06|1993-06-22|1993-08-18|DELIVER IN PERSON|FOB|fily ironic accounts +27687|1920|21|3|28|51013.76|0.10|0.04|A|F|1993-05-26|1993-05-30|1993-05-29|NONE|REG AIR|r packages along the carefully pendin +27712|679|73|1|36|56868.12|0.01|0.07|R|F|1993-04-26|1993-04-07|1993-05-17|COLLECT COD|RAIL|. packages wake. furiously unusual t +27712|1230|68|2|28|31674.44|0.05|0.02|R|F|1993-04-24|1993-04-15|1993-05-15|NONE|AIR|hely express asymptotes above the carefully +27712|31|82|3|29|26999.87|0.00|0.00|A|F|1993-05-16|1993-04-22|1993-05-22|COLLECT COD|AIR|onic patterns. carefu +27712|138|17|4|10|10381.30|0.08|0.08|A|F|1993-03-24|1993-04-12|1993-04-18|DELIVER IN PERSON|SHIP|furiously. blithely regular instruct +27713|1737|38|1|43|70465.39|0.10|0.06|N|O|1997-03-30|1997-01-22|1997-04-28|DELIVER IN PERSON|SHIP|ously after the slyly unusual pinto bea +27714|888|22|1|7|12522.16|0.00|0.02|N|O|1997-07-25|1997-08-04|1997-08-02|DELIVER IN PERSON|REG AIR| final grouch +27714|1425|65|2|23|30507.66|0.00|0.06|N|O|1997-06-22|1997-08-22|1997-06-30|COLLECT COD|RAIL|sts. slyly even packages of the r +27714|1285|23|3|22|26098.16|0.04|0.04|N|O|1997-08-25|1997-07-21|1997-09-11|TAKE BACK RETURN|AIR|ully special deposits aroun +27715|432|33|1|29|38640.47|0.06|0.07|N|O|1995-12-29|1995-11-12|1996-01-13|NONE|MAIL|counts use furiously bol +27715|1504|5|2|3|4216.50|0.08|0.04|N|O|1995-12-03|1995-12-14|1995-12-06|TAKE BACK RETURN|MAIL|xpress courts across t +27715|773|38|3|48|80340.96|0.05|0.08|N|O|1995-12-17|1995-12-14|1995-12-23|DELIVER IN PERSON|AIR|accounts wa +27715|1618|1|4|30|45588.30|0.06|0.06|N|O|1995-09-21|1995-11-02|1995-09-25|TAKE BACK RETURN|SHIP|accounts haggle slyly ironic sheaves. spec +27715|1718|3|5|18|29154.78|0.08|0.05|N|O|1995-12-13|1995-11-11|1996-01-12|NONE|FOB| quickly final requests are +27715|1994|39|6|20|37919.80|0.06|0.03|N|O|1995-11-03|1995-12-10|1995-11-05|NONE|REG AIR|oost. carefully close excuses are around th +27715|1128|65|7|31|31902.72|0.00|0.06|N|O|1996-01-07|1995-10-22|1996-01-15|COLLECT COD|RAIL|ke furiously unusual, unusual inst +27716|1998|87|1|6|11399.94|0.09|0.08|N|O|1996-06-29|1996-05-29|1996-07-28|COLLECT COD|TRUCK|nic multipliers. regular deposits haggle f +27716|1034|70|2|23|21505.69|0.08|0.03|N|O|1996-07-14|1996-07-18|1996-07-21|NONE|REG AIR| fluffily regular d +27716|41|92|3|31|29172.24|0.02|0.08|N|O|1996-05-19|1996-06-24|1996-05-20|DELIVER IN PERSON|FOB|es. fluffily ironic in +27716|56|57|4|7|6692.35|0.10|0.07|N|O|1996-05-18|1996-06-12|1996-06-10|NONE|REG AIR| special foxes: theodolites haggle s +27716|1270|71|5|42|49193.34|0.05|0.06|N|O|1996-06-12|1996-06-29|1996-07-04|TAKE BACK RETURN|TRUCK|nts integrate slyly u +27717|1289|90|1|18|21425.04|0.04|0.08|N|O|1995-12-03|1996-01-05|1995-12-11|COLLECT COD|MAIL| slyly regul +27717|1029|100|2|22|20460.44|0.10|0.06|N|O|1996-01-28|1996-01-18|1996-02-21|DELIVER IN PERSON|MAIL|ic deposits. carefully ironic theo +27717|148|49|3|8|8385.12|0.02|0.06|N|O|1996-02-17|1996-01-10|1996-03-10|TAKE BACK RETURN|FOB|he carefully even excuses. slyly pe +27717|771|68|4|12|20061.24|0.02|0.05|N|O|1995-11-01|1995-12-15|1995-11-24|COLLECT COD|MAIL|lyly about the carefully careful +27718|70|46|1|26|25221.82|0.03|0.04|N|O|1997-06-15|1997-05-02|1997-06-29|TAKE BACK RETURN|FOB|eep quietly. special instructions are. +27718|929|32|2|17|31108.64|0.03|0.01|N|O|1997-02-28|1997-04-22|1997-03-29|COLLECT COD|TRUCK|y bold accounts. +27719|632|95|1|14|21456.82|0.03|0.06|N|F|1995-06-07|1995-04-11|1995-06-28|NONE|MAIL|t packages poach carefully among the unusu +27719|308|65|2|21|25374.30|0.03|0.00|N|F|1995-06-12|1995-05-09|1995-07-01|TAKE BACK RETURN|RAIL|slyly special requests according to th +27719|1719|4|3|40|64828.40|0.05|0.08|N|F|1995-06-02|1995-04-10|1995-06-30|COLLECT COD|TRUCK|c requests dete +27719|1132|69|4|21|21695.73|0.09|0.07|A|F|1995-03-31|1995-04-03|1995-04-01|TAKE BACK RETURN|REG AIR|sits. furiously final foxes ca +27719|1619|43|5|31|47138.91|0.00|0.03|N|F|1995-06-02|1995-04-20|1995-06-23|NONE|SHIP|ss accounts wake carefully along t +27719|919|88|6|15|27298.65|0.07|0.03|A|F|1995-02-19|1995-04-07|1995-03-15|COLLECT COD|RAIL|deposits. +27744|1240|15|1|32|36519.68|0.04|0.01|R|F|1993-11-17|1993-09-15|1993-12-03|COLLECT COD|MAIL| beans use slyly with the fluffily fl +27745|1302|3|1|19|22862.70|0.07|0.04|R|F|1993-10-31|1993-12-14|1993-11-20|DELIVER IN PERSON|AIR|haggle carefull +27745|122|49|2|18|18398.16|0.10|0.00|A|F|1994-01-05|1993-12-07|1994-01-08|TAKE BACK RETURN|MAIL|ven deposits. +27745|964|33|3|2|3729.92|0.09|0.06|A|F|1993-10-05|1993-10-23|1993-10-16|TAKE BACK RETURN|TRUCK|encies past the request +27745|513|14|4|33|46645.83|0.04|0.02|R|F|1993-10-28|1993-12-18|1993-11-21|NONE|RAIL|to the final foxes sleep always arou +27745|992|93|5|45|85184.55|0.07|0.06|A|F|1993-12-30|1993-11-18|1994-01-01|TAKE BACK RETURN|TRUCK|old theodolites haggle blith +27745|532|63|6|2|2865.06|0.00|0.05|R|F|1994-01-17|1993-11-23|1994-01-19|DELIVER IN PERSON|MAIL| cajole fl +27745|343|100|7|30|37300.20|0.00|0.04|A|F|1993-10-16|1993-11-16|1993-10-31|TAKE BACK RETURN|FOB| regular a +27746|903|6|1|33|59528.70|0.03|0.01|A|F|1994-03-23|1994-01-04|1994-04-14|NONE|TRUCK|ing deposits. special courts wake af +27746|1406|46|2|50|65370.00|0.07|0.08|R|F|1994-02-11|1994-02-24|1994-02-23|DELIVER IN PERSON|TRUCK|ts cajole carefully i +27746|71|97|3|16|15537.12|0.04|0.02|R|F|1993-12-12|1994-02-15|1994-01-01|COLLECT COD|TRUCK|le carefully furiously special d +27746|1371|48|4|41|52167.17|0.10|0.02|A|F|1993-12-13|1994-01-16|1994-01-04|COLLECT COD|FOB|ly regular dependencies haggle quic +27746|1576|57|5|38|56147.66|0.08|0.06|A|F|1994-02-27|1994-02-07|1994-03-16|TAKE BACK RETURN|FOB| the dolphins; spe +27746|1595|96|6|34|50884.06|0.02|0.08|A|F|1994-01-18|1994-01-15|1994-02-09|NONE|MAIL|l theodolites. express deposits thrash furi +27746|923|26|7|50|91196.00|0.09|0.03|R|F|1994-03-18|1994-01-07|1994-03-22|DELIVER IN PERSON|AIR|sleep final, bra +27747|94|20|1|25|24852.25|0.03|0.05|N|O|1995-07-26|1995-06-13|1995-08-17|NONE|RAIL|le slyly carefu +27748|375|76|1|47|59942.39|0.01|0.06|N|O|1996-09-28|1996-10-09|1996-10-07|TAKE BACK RETURN|RAIL|packages sleep furiously. furiously daring +27748|587|48|2|18|26776.44|0.10|0.02|N|O|1996-09-19|1996-09-19|1996-10-12|TAKE BACK RETURN|TRUCK|eans. pend +27748|1947|36|3|48|88749.12|0.00|0.01|N|O|1996-11-20|1996-10-04|1996-12-17|NONE|TRUCK| carefully even fox +27748|1507|8|4|16|22536.00|0.05|0.08|N|O|1996-11-10|1996-09-22|1996-12-02|TAKE BACK RETURN|SHIP|ests haggle furiously before the fina +27748|620|52|5|16|24329.92|0.01|0.06|N|O|1996-11-17|1996-09-17|1996-12-14|TAKE BACK RETURN|FOB|ly after the slyly pending deposits. care +27748|124|77|6|36|36868.32|0.02|0.01|N|O|1996-10-30|1996-10-23|1996-11-12|DELIVER IN PERSON|TRUCK|refully according to the blithe +27749|613|45|1|18|27244.98|0.10|0.00|N|O|1998-07-24|1998-08-23|1998-08-07|DELIVER IN PERSON|REG AIR|y regular package +27749|367|96|2|15|19010.40|0.04|0.04|N|O|1998-08-17|1998-06-25|1998-08-25|COLLECT COD|SHIP| ironic, regular accounts ru +27749|214|42|3|50|55710.50|0.07|0.08|N|O|1998-06-27|1998-07-01|1998-07-02|COLLECT COD|FOB|packages are quickly along the bu +27749|1136|9|4|46|47707.98|0.01|0.07|N|O|1998-05-29|1998-08-15|1998-06-04|NONE|RAIL|ual pinto beans. unusual reques +27749|1181|90|5|46|49780.28|0.07|0.08|N|O|1998-06-04|1998-08-04|1998-06-20|NONE|AIR|ly regular accounts after the f +27749|1651|75|6|10|15526.50|0.02|0.05|N|O|1998-06-07|1998-07-23|1998-06-13|NONE|SHIP|ng platelets. fluffily express acco +27750|1666|49|1|16|25082.56|0.07|0.05|R|F|1992-12-19|1992-12-29|1992-12-25|DELIVER IN PERSON|SHIP|usual ideas above the bold, +27750|31|7|2|40|37241.20|0.09|0.07|A|F|1992-12-24|1992-12-26|1992-12-30|TAKE BACK RETURN|TRUCK|ar ideas after the rut +27750|1749|50|3|32|52823.68|0.03|0.06|A|F|1992-12-19|1993-01-07|1992-12-27|COLLECT COD|MAIL|urts sleep carefully. carefully even +27750|1525|26|4|45|64193.40|0.00|0.07|A|F|1992-12-31|1992-12-18|1993-01-10|DELIVER IN PERSON|MAIL|longside of the pac +27751|1516|37|1|3|4252.53|0.08|0.05|N|O|1998-06-10|1998-05-18|1998-07-03|COLLECT COD|REG AIR|l ideas along the blithely fin +27751|1353|68|2|16|20069.60|0.08|0.04|N|O|1998-07-12|1998-05-31|1998-07-14|TAKE BACK RETURN|RAIL|e regular ideas. fluffily quick a +27751|513|4|3|42|59367.42|0.06|0.06|N|O|1998-04-06|1998-06-22|1998-04-10|TAKE BACK RETURN|AIR|uriously abou +27751|1365|42|4|36|45588.96|0.03|0.07|N|O|1998-07-24|1998-05-15|1998-07-30|DELIVER IN PERSON|FOB|e fluffily final accounts. careful +27751|637|69|5|14|21526.82|0.07|0.05|N|O|1998-06-17|1998-06-01|1998-06-26|COLLECT COD|REG AIR| final, even requests among +27751|12|63|6|19|17328.19|0.02|0.02|N|O|1998-05-12|1998-05-23|1998-05-24|COLLECT COD|REG AIR|bits engage quickly. furiously +27776|1117|26|1|3|3054.33|0.05|0.04|R|F|1993-07-23|1993-06-15|1993-08-19|COLLECT COD|MAIL|furiously silen +27776|1618|1|2|47|71421.67|0.00|0.03|R|F|1993-08-12|1993-06-10|1993-08-18|NONE|AIR|ages. thinly final pain +27776|1907|96|3|11|19897.90|0.08|0.00|R|F|1993-05-12|1993-07-11|1993-05-30|COLLECT COD|FOB| after the unusual accounts! ironic, iron +27776|933|2|4|21|38512.53|0.07|0.01|A|F|1993-08-23|1993-06-23|1993-08-29|COLLECT COD|TRUCK|ly final asymptotes +27777|1983|28|1|45|84824.10|0.10|0.03|N|O|1998-08-13|1998-07-24|1998-09-05|DELIVER IN PERSON|TRUCK|ts across the bold, bold ac +27777|1986|75|2|23|43423.54|0.01|0.07|N|O|1998-09-12|1998-08-23|1998-09-21|NONE|SHIP|te quickly slyly final requests. +27777|1657|58|3|6|9351.90|0.09|0.00|N|O|1998-10-19|1998-08-10|1998-11-15|DELIVER IN PERSON|MAIL| instructions beli +27778|1658|41|1|28|43670.20|0.01|0.03|N|O|1995-11-08|1995-10-18|1995-11-19|DELIVER IN PERSON|RAIL|ess accounts. i +27778|637|31|2|24|36903.12|0.09|0.05|N|O|1995-09-26|1995-11-15|1995-10-18|NONE|AIR|s. pending, special ideas +27778|1311|50|3|27|32732.37|0.03|0.04|N|O|1995-10-09|1995-10-13|1995-10-13|DELIVER IN PERSON|MAIL|gular plate +27778|36|37|4|34|31825.02|0.05|0.05|N|O|1995-11-30|1995-10-20|1995-12-03|NONE|TRUCK|posits sleep blithely acros +27778|396|53|5|9|11667.51|0.03|0.01|N|O|1995-10-17|1995-10-08|1995-11-16|TAKE BACK RETURN|AIR|c, pending packages +27779|200|79|1|5|5501.00|0.06|0.02|R|F|1993-08-31|1993-08-25|1993-09-23|DELIVER IN PERSON|SHIP|ts along the furiously pending fo +27779|524|55|2|15|21367.80|0.03|0.05|R|F|1993-10-18|1993-10-10|1993-10-22|DELIVER IN PERSON|SHIP|e regular accounts. slyly unus +27780|105|6|1|36|36183.60|0.06|0.03|A|F|1993-01-04|1993-01-17|1993-01-08|NONE|RAIL|counts! carefully special d +27780|1752|79|2|17|28113.75|0.02|0.07|R|F|1993-01-31|1992-12-26|1993-02-16|COLLECT COD|MAIL| bold foxes wake carefully. furi +27780|1756|57|3|6|9946.50|0.06|0.03|A|F|1992-11-21|1992-12-07|1992-11-30|DELIVER IN PERSON|MAIL|ccounts cajole. unu +27780|916|85|4|6|10901.46|0.09|0.02|A|F|1993-01-12|1993-01-14|1993-01-21|NONE|AIR|ual, regular pi +27780|115|68|5|22|22332.42|0.09|0.03|R|F|1992-11-09|1992-12-22|1992-12-08|COLLECT COD|FOB|arefully ironic waters. regul +27781|1640|41|1|49|75540.36|0.08|0.03|N|O|1995-09-29|1995-12-10|1995-10-13|NONE|AIR|usual multiplie +27781|98|99|2|20|19961.80|0.09|0.05|N|O|1995-09-18|1995-12-14|1995-10-11|TAKE BACK RETURN|FOB| instructions +27781|956|57|3|25|46423.75|0.05|0.03|N|O|1995-11-08|1995-12-13|1995-11-18|NONE|TRUCK|iously even deposits. regularly e +27781|1172|45|4|6|6439.02|0.00|0.02|N|O|1995-11-16|1995-10-30|1995-11-29|TAKE BACK RETURN|RAIL|posits maintain blithel +27782|486|45|1|25|34662.00|0.01|0.06|N|O|1996-04-08|1996-05-03|1996-05-04|DELIVER IN PERSON|AIR|ly. furiously pending ideas cajole furi +27782|279|34|2|45|53067.15|0.05|0.04|N|O|1996-02-23|1996-04-26|1996-03-01|COLLECT COD|FOB|al dolphins sleep slyly about the +27782|1494|73|3|20|27909.80|0.08|0.08|N|O|1996-05-28|1996-05-15|1996-06-17|COLLECT COD|REG AIR|ely bold requests wake fur +27782|788|53|4|25|42219.50|0.07|0.05|N|O|1996-04-17|1996-05-04|1996-05-14|NONE|MAIL|. accounts +27782|1918|51|5|3|5459.73|0.02|0.00|N|O|1996-04-27|1996-04-12|1996-05-25|TAKE BACK RETURN|RAIL| among the furiously final deposits sle +27782|1895|82|6|31|55703.59|0.08|0.08|N|O|1996-06-07|1996-03-24|1996-06-25|TAKE BACK RETURN|SHIP|nts wake blithely express, s +27782|141|68|7|17|17699.38|0.00|0.08|N|O|1996-06-18|1996-04-01|1996-06-20|NONE|REG AIR|ely ironic epitaphs. bli +27783|86|12|1|19|18735.52|0.02|0.01|N|O|1996-03-01|1996-05-01|1996-03-20|NONE|RAIL|pecial, fin +27783|1435|14|2|22|29401.46|0.08|0.04|N|O|1996-03-18|1996-04-07|1996-03-26|TAKE BACK RETURN|SHIP| furiously special requests boost car +27783|1331|32|3|32|39434.56|0.10|0.04|N|O|1996-04-21|1996-03-31|1996-04-28|TAKE BACK RETURN|MAIL|usly about the fluffy deposits. car +27808|682|14|1|50|79134.00|0.04|0.08|A|F|1993-03-04|1993-04-19|1993-03-06|TAKE BACK RETURN|REG AIR|onic ideas hagg +27808|1517|38|2|15|21277.65|0.08|0.01|A|F|1993-05-18|1993-03-24|1993-06-10|COLLECT COD|FOB|terns cajole. carefully bold packages boo +27809|360|89|1|20|25207.20|0.09|0.07|N|O|1996-01-11|1995-12-13|1996-01-25|NONE|SHIP|ular instructions +27810|293|21|1|17|20285.93|0.05|0.01|R|F|1993-03-19|1993-03-18|1993-04-14|COLLECT COD|FOB|fluffily pending ideas. requests are caref +27810|369|98|2|30|38080.80|0.00|0.02|A|F|1993-04-02|1993-04-21|1993-04-21|COLLECT COD|REG AIR|. blithely ironic ideas wake s +27810|1835|79|3|1|1736.83|0.06|0.02|A|F|1993-05-17|1993-04-17|1993-06-02|COLLECT COD|AIR| slyly final theodolites are furio +27810|1803|47|4|30|51144.00|0.04|0.03|A|F|1993-03-24|1993-04-20|1993-04-23|TAKE BACK RETURN|AIR| express ideas cajole +27810|311|96|5|23|27860.13|0.01|0.06|R|F|1993-04-07|1993-02-28|1993-04-15|NONE|RAIL|even accounts serve slyly al +27810|1366|81|6|16|20277.76|0.10|0.02|A|F|1993-03-27|1993-03-12|1993-04-25|DELIVER IN PERSON|REG AIR|ans cajole slyly after +27811|1135|36|1|42|43517.46|0.07|0.08|R|F|1995-04-27|1995-04-21|1995-05-09|TAKE BACK RETURN|FOB|ts use carefully qu +27811|1462|63|2|4|5453.84|0.08|0.02|A|F|1995-04-23|1995-04-20|1995-05-21|COLLECT COD|RAIL|y regular packages wake carefully. +27811|768|69|3|50|83438.00|0.07|0.00|A|F|1995-03-07|1995-05-05|1995-04-03|TAKE BACK RETURN|FOB| theodolites wake afte +27811|1338|39|4|31|38419.23|0.02|0.04|R|F|1995-05-19|1995-04-13|1995-06-10|DELIVER IN PERSON|TRUCK|ptotes wake sl +27811|1430|9|5|11|14645.73|0.08|0.06|A|F|1995-04-30|1995-04-07|1995-05-13|DELIVER IN PERSON|SHIP|fily permanent cour +27812|1164|65|1|34|36215.44|0.02|0.05|N|O|1997-11-17|1997-10-24|1997-11-28|DELIVER IN PERSON|AIR|es sleep quickly +27812|1271|9|2|43|50407.61|0.08|0.01|N|O|1997-12-13|1997-12-17|1998-01-06|DELIVER IN PERSON|FOB|erve after the quickly +27813|1679|62|1|18|28452.06|0.00|0.07|R|F|1994-02-18|1994-03-09|1994-03-02|TAKE BACK RETURN|RAIL|ronic foxes. blithely pending packages c +27813|292|74|2|2|2384.58|0.07|0.01|A|F|1994-03-14|1994-03-29|1994-03-19|NONE|FOB| bold requests wake furio +27813|1471|50|3|23|31566.81|0.09|0.00|R|F|1994-02-02|1994-03-04|1994-02-22|COLLECT COD|MAIL|e the blithely special deposits. regular a +27813|293|48|4|17|20285.93|0.09|0.06|R|F|1994-01-28|1994-03-24|1994-02-21|TAKE BACK RETURN|TRUCK|mong the theodolites. b +27814|90|41|1|50|49504.50|0.09|0.04|N|O|1998-01-12|1997-12-20|1998-02-08|TAKE BACK RETURN|MAIL|uses. instructions subla +27814|598|99|2|22|32968.98|0.05|0.00|N|O|1997-12-07|1997-11-26|1997-12-23|COLLECT COD|MAIL|n the carefully ev +27814|121|22|3|41|41865.92|0.08|0.00|N|O|1997-11-10|1997-12-10|1997-11-20|DELIVER IN PERSON|RAIL|ic pinto beans +27814|1784|69|4|43|72488.54|0.00|0.07|N|O|1998-01-24|1998-01-18|1998-01-30|NONE|TRUCK|e furiously notornis! quic +27814|1014|85|5|6|5490.06|0.05|0.07|N|O|1998-01-20|1997-12-24|1998-02-10|DELIVER IN PERSON|REG AIR|ole. furio +27814|451|81|6|14|18920.30|0.06|0.00|N|O|1998-02-16|1997-12-05|1998-03-11|DELIVER IN PERSON|SHIP|uffy deposits against the +27815|216|17|1|42|46880.82|0.07|0.04|N|O|1996-07-02|1996-06-30|1996-07-11|COLLECT COD|TRUCK|y express packages. even t +27815|559|50|2|14|20433.70|0.03|0.03|N|O|1996-04-22|1996-05-29|1996-04-24|DELIVER IN PERSON|REG AIR|ide of the ironic instruction +27815|506|7|3|46|64699.00|0.06|0.07|N|O|1996-05-11|1996-06-08|1996-05-18|COLLECT COD|RAIL|hroughout the furiously even accounts. +27815|806|6|4|8|13654.40|0.04|0.08|N|O|1996-07-16|1996-07-06|1996-07-24|TAKE BACK RETURN|FOB|usly final, ironic deposits. depo +27815|159|38|5|27|28597.05|0.00|0.03|N|O|1996-05-21|1996-06-18|1996-06-05|DELIVER IN PERSON|REG AIR|requests. carefully iron +27815|610|4|6|33|49850.13|0.05|0.08|N|O|1996-04-14|1996-06-02|1996-04-18|DELIVER IN PERSON|FOB|ronic excuses. slyly final d +27840|1949|94|1|48|88845.12|0.04|0.02|R|F|1994-09-02|1994-09-16|1994-09-06|NONE|TRUCK|olites are among the blithely fi +27840|1687|88|2|28|44483.04|0.05|0.07|A|F|1994-07-22|1994-09-09|1994-08-20|TAKE BACK RETURN|RAIL|ly special asymptotes nag blithely +27840|484|43|3|24|33227.52|0.02|0.07|R|F|1994-09-16|1994-09-24|1994-09-30|NONE|RAIL|s wake aro +27840|519|10|4|24|34068.24|0.09|0.03|R|F|1994-09-02|1994-08-18|1994-09-20|TAKE BACK RETURN|FOB|s wake acr +27840|513|74|5|29|40991.79|0.07|0.08|A|F|1994-09-05|1994-09-12|1994-09-19|DELIVER IN PERSON|AIR|al dependencies cajole fluffily. fur +27841|747|12|1|5|8238.70|0.01|0.03|R|F|1992-12-03|1992-10-29|1992-12-18|DELIVER IN PERSON|RAIL| instructions cajole carefully +27841|1168|77|2|22|23521.52|0.03|0.05|A|F|1992-10-24|1992-11-11|1992-11-08|NONE|RAIL|s above the bold, ev +27841|1865|52|3|47|83042.42|0.01|0.03|A|F|1992-09-23|1992-12-09|1992-10-08|NONE|RAIL|ts dazzle ca +27841|446|47|4|10|13464.40|0.02|0.06|R|F|1992-12-02|1992-12-09|1992-12-18|DELIVER IN PERSON|SHIP|uriously pending pinto b +27841|203|4|5|49|54056.80|0.10|0.01|A|F|1992-10-10|1992-12-12|1992-10-24|NONE|MAIL|fully regular deposits sl +27841|877|78|6|46|81782.02|0.02|0.02|A|F|1993-01-02|1992-12-10|1993-01-03|COLLECT COD|TRUCK| frays. excuses are about the r +27841|1079|50|7|24|23521.68|0.03|0.01|A|F|1992-10-22|1992-11-28|1992-11-21|DELIVER IN PERSON|FOB|the regular, pending req +27842|578|79|1|12|17742.84|0.00|0.01|N|O|1998-06-16|1998-08-13|1998-07-15|TAKE BACK RETURN|FOB|s haggle quickly. blithely iro +27842|968|71|2|18|33641.28|0.09|0.05|N|O|1998-07-31|1998-08-06|1998-08-27|COLLECT COD|REG AIR|lets unwind quickly abov +27842|11|62|3|6|5466.06|0.02|0.05|N|O|1998-06-28|1998-07-25|1998-07-24|COLLECT COD|MAIL|old, special +27842|767|100|4|34|56703.84|0.02|0.00|N|O|1998-08-31|1998-08-25|1998-09-15|DELIVER IN PERSON|REG AIR|inal accounts. blithely regular deposits ar +27842|1529|50|5|17|24318.84|0.07|0.06|N|O|1998-09-19|1998-08-06|1998-09-26|DELIVER IN PERSON|MAIL|kages according to the furiously +27843|43|44|1|26|24519.04|0.08|0.01|A|F|1993-11-28|1993-10-28|1993-12-10|COLLECT COD|TRUCK|lar deposits. carefully ironic foxes +27843|1718|3|2|2|3239.42|0.08|0.03|A|F|1993-11-06|1993-10-15|1993-11-28|COLLECT COD|TRUCK|s the fluffily bold +27843|1851|38|3|17|29798.45|0.10|0.00|R|F|1993-12-18|1993-12-05|1994-01-15|DELIVER IN PERSON|RAIL|alongside of the blit +27843|1536|57|4|13|18687.89|0.04|0.00|A|F|1993-12-19|1993-10-15|1993-12-24|COLLECT COD|MAIL|eas cajole blithely ac +27843|1330|45|5|36|44327.88|0.05|0.07|A|F|1993-12-24|1993-12-05|1994-01-03|DELIVER IN PERSON|TRUCK|ccounts are. care +27844|1666|67|1|7|10973.62|0.10|0.02|N|O|1995-09-14|1995-08-09|1995-09-16|COLLECT COD|AIR|r the unusual platelets. furiously re +27844|1861|5|2|15|26442.90|0.00|0.08|N|O|1995-08-22|1995-08-20|1995-09-02|DELIVER IN PERSON|MAIL|s. slyly final depend +27844|1611|35|3|26|39327.86|0.07|0.01|N|O|1995-08-03|1995-08-03|1995-08-15|DELIVER IN PERSON|AIR|ven courts affix slyly about the fu +27844|551|12|4|45|65319.75|0.07|0.05|N|O|1995-07-14|1995-08-08|1995-07-18|DELIVER IN PERSON|AIR| may wake above the requests. furiously ir +27845|983|86|1|44|82895.12|0.01|0.07|N|O|1995-09-18|1995-09-18|1995-10-17|COLLECT COD|FOB|long the quickly r +27845|971|40|2|2|3743.94|0.08|0.04|N|O|1995-09-10|1995-10-01|1995-10-02|NONE|SHIP|al pinto beans wake quickly sl +27845|1484|2|3|14|19396.72|0.09|0.03|N|O|1995-11-08|1995-08-21|1995-11-30|COLLECT COD|TRUCK|riously final packages after the special +27845|365|50|4|12|15184.32|0.04|0.05|N|O|1995-09-20|1995-08-17|1995-10-09|NONE|TRUCK| foxes. slyly pending waters +27845|1450|68|5|29|39192.05|0.09|0.03|N|O|1995-07-16|1995-09-19|1995-08-10|TAKE BACK RETURN|SHIP|above the slyly ironic platelets. ironi +27846|806|6|1|34|58031.20|0.07|0.04|N|O|1996-06-13|1996-07-10|1996-06-29|DELIVER IN PERSON|FOB|ess packages s +27847|529|90|1|8|11436.16|0.08|0.06|N|O|1998-10-13|1998-09-09|1998-10-30|COLLECT COD|FOB| pending asymptot +27847|337|38|2|3|3711.99|0.03|0.02|N|O|1998-08-27|1998-08-28|1998-09-19|TAKE BACK RETURN|AIR|r the pending, bold re +27847|693|87|3|24|38248.56|0.09|0.06|N|O|1998-09-21|1998-10-08|1998-09-28|TAKE BACK RETURN|RAIL|posits nag. expres +27847|815|16|4|39|66916.59|0.08|0.06|N|O|1998-10-05|1998-10-08|1998-10-07|COLLECT COD|AIR|, even requests haggle fluffily pen +27872|499|87|1|20|27989.80|0.03|0.00|N|O|1995-12-02|1995-11-14|1995-12-07|DELIVER IN PERSON|REG AIR|latelets use furiously. slyly regu +27872|1084|55|2|50|49254.00|0.05|0.01|N|O|1995-12-14|1995-12-19|1996-01-04|COLLECT COD|SHIP|e carefully caref +27872|633|34|3|22|33739.86|0.07|0.07|N|O|1996-01-17|1995-12-02|1996-02-15|COLLECT COD|RAIL|s-- blithely ruthless +27872|1377|78|4|34|43464.58|0.08|0.06|N|O|1995-12-30|1995-11-19|1996-01-24|TAKE BACK RETURN|AIR|s sleep during the carefully +27872|1192|29|5|4|4372.76|0.06|0.06|N|O|1995-11-09|1995-12-30|1995-11-25|NONE|FOB|l packages. furiously ev +27872|806|6|6|50|85340.00|0.09|0.03|N|O|1996-01-24|1996-01-03|1996-02-15|NONE|MAIL|ly. slyly bold de +27873|16|92|1|17|15572.17|0.07|0.03|N|O|1996-06-15|1996-08-06|1996-07-14|NONE|TRUCK|even packages nag. final, i +27873|220|75|2|47|52650.34|0.06|0.08|N|O|1996-07-26|1996-08-06|1996-08-24|TAKE BACK RETURN|FOB|ld fluffily alongside of the ironic +27874|106|85|1|44|44268.40|0.10|0.08|N|O|1997-10-08|1997-10-08|1997-10-29|NONE|TRUCK|usual platelets are above the +27874|443|31|2|28|37616.32|0.02|0.04|N|O|1997-09-09|1997-10-20|1997-09-15|NONE|REG AIR|oss the pending hockey players. express +27874|1053|59|3|18|17172.90|0.04|0.07|N|O|1997-10-30|1997-10-26|1997-11-12|TAKE BACK RETURN|RAIL|the carefully regula +27874|1554|95|4|3|4366.65|0.07|0.00|N|O|1997-11-27|1997-11-23|1997-12-16|TAKE BACK RETURN|SHIP|furiously about the bold, ironic idea +27874|304|5|5|32|38537.60|0.02|0.06|N|O|1997-10-20|1997-11-09|1997-11-05|COLLECT COD|AIR|d accounts ar +27875|1888|89|1|12|21478.56|0.06|0.04|A|F|1993-05-27|1993-05-15|1993-05-28|TAKE BACK RETURN|MAIL|ross the caref +27875|122|49|2|28|28619.36|0.00|0.05|A|F|1993-04-16|1993-06-11|1993-05-05|DELIVER IN PERSON|RAIL|ffily express de +27875|326|83|3|26|31884.32|0.09|0.05|R|F|1993-04-20|1993-06-01|1993-05-06|DELIVER IN PERSON|TRUCK|equests sleep slyly sl +27875|294|49|4|33|39411.57|0.07|0.07|A|F|1993-07-02|1993-06-02|1993-07-28|COLLECT COD|SHIP|nal ideas are. +27875|805|6|5|10|17058.00|0.08|0.00|A|F|1993-06-26|1993-06-24|1993-06-28|NONE|SHIP|ate slyly. sly in +27875|870|70|6|25|44271.75|0.10|0.04|R|F|1993-04-08|1993-05-26|1993-05-04|COLLECT COD|AIR|arefully final requests cajole s +27876|1288|89|1|26|30921.28|0.06|0.03|A|F|1993-11-07|1993-10-15|1993-12-07|NONE|MAIL|ermanently final courts. ir +27876|1972|5|2|30|56219.10|0.08|0.07|A|F|1993-09-13|1993-10-23|1993-09-27|TAKE BACK RETURN|RAIL|s against t +27876|1530|11|3|33|47240.49|0.07|0.05|R|F|1993-12-12|1993-11-21|1993-12-18|DELIVER IN PERSON|SHIP|tions might +27876|1721|22|4|4|6490.88|0.05|0.04|R|F|1993-10-01|1993-11-17|1993-10-03|TAKE BACK RETURN|TRUCK|nt requests wake blithely. alway +27877|1677|19|1|2|3157.34|0.01|0.01|N|O|1997-04-21|1997-05-29|1997-04-29|COLLECT COD|AIR|theodolites are furious +27877|481|69|2|16|22103.68|0.08|0.05|N|O|1997-06-24|1997-05-10|1997-07-14|DELIVER IN PERSON|SHIP|ckly pending +27877|1817|4|3|40|68752.40|0.07|0.00|N|O|1997-05-27|1997-04-26|1997-06-17|DELIVER IN PERSON|MAIL|ckly even accounts. ironic asympto +27877|192|19|4|7|7645.33|0.07|0.04|N|O|1997-03-30|1997-05-19|1997-04-21|DELIVER IN PERSON|TRUCK|om the quickly unusual epitaphs. iro +27877|265|47|5|15|17478.90|0.02|0.01|N|O|1997-04-28|1997-06-07|1997-05-17|TAKE BACK RETURN|SHIP|into beans. blithely regular tithes affi +27877|1935|36|6|11|20206.23|0.10|0.00|N|O|1997-06-01|1997-04-25|1997-06-16|TAKE BACK RETURN|AIR|equests poach ironic, final pinto beans. +27877|687|81|7|41|65094.88|0.05|0.00|N|O|1997-04-11|1997-05-18|1997-05-05|DELIVER IN PERSON|SHIP|c foxes. express, ev +27878|990|93|1|21|39710.79|0.05|0.04|N|O|1997-04-29|1997-06-15|1997-05-15|TAKE BACK RETURN|SHIP|osits. blithely express packages x-ray +27879|213|41|1|26|28943.46|0.00|0.00|A|F|1993-03-14|1993-05-04|1993-03-17|NONE|SHIP|ing foxes run across the final pa +27879|1177|50|2|22|23719.74|0.07|0.03|A|F|1993-03-11|1993-05-10|1993-04-10|TAKE BACK RETURN|TRUCK| unusual requests. quickly final p +27879|645|46|3|3|4636.92|0.03|0.04|A|F|1993-03-11|1993-05-16|1993-03-29|DELIVER IN PERSON|SHIP|ve the carefully silent deposits. quick +27904|166|19|1|29|30918.64|0.03|0.06|N|O|1995-10-06|1995-10-31|1995-10-29|COLLECT COD|AIR|ns. theodolites may sleep slyly carefully +27904|1032|33|2|21|19593.63|0.08|0.02|N|O|1995-11-16|1995-10-06|1995-11-22|TAKE BACK RETURN|FOB|p furiously final ideas. +27905|1736|37|1|32|52407.36|0.07|0.02|N|O|1997-12-01|1998-01-23|1997-12-09|TAKE BACK RETURN|REG AIR|n accounts! pinto beans are bravely +27905|1814|15|2|42|72064.02|0.08|0.00|N|O|1998-02-18|1997-12-19|1998-03-08|TAKE BACK RETURN|AIR|uests was along the regular w +27905|1036|37|3|46|43103.38|0.09|0.04|N|O|1997-11-12|1998-01-28|1997-11-15|DELIVER IN PERSON|SHIP|usual requests wake bli +27905|1735|36|4|19|31097.87|0.00|0.07|N|O|1998-02-05|1998-01-27|1998-02-14|NONE|TRUCK| pinto beans. even depths cajole +27906|426|14|1|36|47751.12|0.00|0.03|N|O|1997-06-25|1997-08-16|1997-07-25|DELIVER IN PERSON|AIR|rses. furiously final attainments poach +27906|1200|37|2|8|8809.60|0.04|0.07|N|O|1997-08-24|1997-07-23|1997-09-06|TAKE BACK RETURN|MAIL|uickly final deposits wake above the +27906|185|12|3|3|3255.54|0.05|0.03|N|O|1997-06-21|1997-07-30|1997-07-09|COLLECT COD|FOB|p blithely final acc +27906|39|90|4|43|40378.29|0.10|0.04|N|O|1997-09-18|1997-07-12|1997-09-30|NONE|SHIP|le carefully along the furiously final +27906|506|97|5|4|5626.00|0.08|0.08|N|O|1997-07-27|1997-07-17|1997-08-14|TAKE BACK RETURN|TRUCK|s. slyly special instructions are +27906|614|15|6|5|7573.05|0.01|0.04|N|O|1997-09-18|1997-07-11|1997-09-30|DELIVER IN PERSON|FOB|o beans boost blithely about +27907|1242|17|1|15|17148.60|0.06|0.03|N|O|1998-03-05|1998-01-23|1998-03-11|DELIVER IN PERSON|FOB|s might sublate amo +27908|916|51|1|27|49056.57|0.01|0.08|A|F|1994-06-12|1994-07-06|1994-06-15|TAKE BACK RETURN|FOB|he silent ac +27908|755|88|2|22|36426.50|0.07|0.01|R|F|1994-05-19|1994-06-26|1994-06-16|TAKE BACK RETURN|RAIL|ly quick pinto +27908|794|95|3|4|6779.16|0.06|0.05|R|F|1994-07-22|1994-07-09|1994-08-08|TAKE BACK RETURN|MAIL|regular, final patterns detect unde +27909|474|62|1|6|8246.82|0.06|0.05|R|F|1992-05-06|1992-04-12|1992-05-22|NONE|TRUCK| theodolites affix a +27909|1715|100|2|13|21017.23|0.01|0.00|R|F|1992-06-07|1992-04-03|1992-06-10|TAKE BACK RETURN|AIR|er the furiously express deposits. +27909|420|8|3|48|63380.16|0.03|0.06|A|F|1992-02-14|1992-04-26|1992-03-05|DELIVER IN PERSON|REG AIR|s besides the never re +27909|394|79|4|24|31065.36|0.04|0.07|R|F|1992-05-23|1992-03-25|1992-06-13|COLLECT COD|FOB|ld deposits boost blithely blith +27909|833|34|5|29|50281.07|0.08|0.02|R|F|1992-04-20|1992-04-23|1992-05-06|NONE|FOB|s. furiously ent +27910|1338|39|1|27|33461.91|0.08|0.06|A|F|1995-01-07|1994-12-16|1995-01-12|DELIVER IN PERSON|RAIL|nto beans nag slyly according to th +27910|1566|7|2|13|19078.28|0.09|0.02|R|F|1994-12-17|1994-12-15|1994-12-20|NONE|RAIL|oxes. carefully brave packages are quickly +27910|236|91|3|41|46585.43|0.01|0.06|A|F|1995-02-01|1995-01-21|1995-03-03|DELIVER IN PERSON|SHIP| to the ironic depo +27910|748|81|4|38|62652.12|0.00|0.08|R|F|1995-03-10|1995-02-01|1995-04-04|DELIVER IN PERSON|SHIP|fully bold requests +27911|1873|60|1|50|88743.50|0.09|0.06|N|O|1997-03-09|1997-02-05|1997-03-22|TAKE BACK RETURN|TRUCK|nic requests a +27911|316|1|2|21|25542.51|0.07|0.05|N|O|1997-03-01|1997-01-15|1997-03-24|TAKE BACK RETURN|RAIL|e finally. blithely reg +27911|494|53|3|40|55779.60|0.00|0.07|N|O|1997-03-23|1997-02-25|1997-04-04|DELIVER IN PERSON|TRUCK|ironic theodolites after +27911|538|29|4|40|57541.20|0.01|0.00|N|O|1997-01-21|1997-01-22|1997-02-16|DELIVER IN PERSON|SHIP| doggedly final packages +27911|1543|64|5|26|37558.04|0.05|0.03|N|O|1997-04-02|1997-02-10|1997-04-16|TAKE BACK RETURN|MAIL|ironic theod +27936|309|10|1|2|2418.60|0.08|0.04|N|O|1995-07-27|1995-09-20|1995-08-02|NONE|REG AIR|fter the slyly silent dependencies boost +27936|328|29|2|9|11054.88|0.08|0.08|N|O|1995-07-17|1995-09-18|1995-07-19|NONE|REG AIR|ent dinos affix according to the blithely +27936|1361|100|3|25|31559.00|0.03|0.05|N|O|1995-09-11|1995-08-17|1995-09-30|TAKE BACK RETURN|MAIL|usly express e +27936|26|52|4|43|39818.86|0.00|0.01|N|O|1995-07-12|1995-08-13|1995-07-26|COLLECT COD|REG AIR|al instructions. unusual requests detec +27936|40|41|5|36|33841.44|0.03|0.05|N|O|1995-07-30|1995-08-29|1995-08-02|TAKE BACK RETURN|FOB|eposits. regular +27936|1220|32|6|22|24666.84|0.10|0.03|N|O|1995-09-16|1995-08-23|1995-09-17|TAKE BACK RETURN|TRUCK|ymptotes lose furiously f +27936|971|6|7|24|44927.28|0.08|0.03|N|O|1995-09-16|1995-08-16|1995-10-14|TAKE BACK RETURN|SHIP|the special, regular platelets. blithel +27937|398|27|1|16|20774.24|0.03|0.02|N|O|1998-04-07|1998-03-01|1998-04-09|TAKE BACK RETURN|TRUCK|ites. accounts are against the even, bold p +27937|77|3|2|26|25403.82|0.07|0.03|N|O|1998-02-25|1998-04-23|1998-03-12|DELIVER IN PERSON|REG AIR|to beans use furiously against +27937|1566|7|3|18|26416.08|0.06|0.06|N|O|1998-03-15|1998-03-30|1998-03-23|NONE|RAIL|e carefully among the blit +27937|359|60|4|40|50374.00|0.10|0.03|N|O|1998-03-21|1998-03-03|1998-03-24|DELIVER IN PERSON|TRUCK|ls detect according to the pendi +27937|1365|66|5|39|49388.04|0.10|0.02|N|O|1998-05-02|1998-03-18|1998-05-09|TAKE BACK RETURN|RAIL|an play fu +27938|329|30|1|29|35650.28|0.02|0.06|R|F|1994-06-28|1994-06-28|1994-07-24|DELIVER IN PERSON|REG AIR|anently slyly final ideas. ne +27938|657|89|2|17|26480.05|0.04|0.01|R|F|1994-06-11|1994-07-05|1994-06-27|COLLECT COD|REG AIR|uctions. carefully fi +27938|728|61|3|1|1628.72|0.02|0.05|R|F|1994-05-19|1994-07-19|1994-06-08|TAKE BACK RETURN|AIR|s. furiously +27939|1501|22|1|9|12622.50|0.07|0.06|R|F|1992-06-13|1992-06-07|1992-07-03|COLLECT COD|REG AIR| above the +27939|1141|42|2|17|17716.38|0.01|0.00|R|F|1992-05-06|1992-07-07|1992-05-14|NONE|SHIP|ly even requests. furiously silent deposi +27939|972|73|3|37|69299.89|0.02|0.04|R|F|1992-06-09|1992-05-26|1992-06-17|TAKE BACK RETURN|TRUCK|e slyly ac +27939|495|83|4|14|19536.86|0.09|0.03|R|F|1992-07-19|1992-06-18|1992-08-04|TAKE BACK RETURN|RAIL|tithes against +27939|201|83|5|48|52857.60|0.04|0.01|A|F|1992-05-25|1992-06-19|1992-06-09|DELIVER IN PERSON|RAIL|slyly silent asymptotes ar +27939|400|57|6|1|1300.40|0.08|0.05|A|F|1992-05-10|1992-05-26|1992-06-09|COLLECT COD|TRUCK|urts. slyly special deposits hang. r +27940|1063|34|1|9|8676.54|0.02|0.03|N|O|1998-03-28|1998-01-20|1998-04-17|COLLECT COD|AIR|usly final instructions; ironic dep +27940|1554|35|2|49|71321.95|0.01|0.00|N|O|1998-01-28|1998-03-08|1998-02-18|COLLECT COD|FOB|platelets upon the slyly slow foxes c +27940|937|6|3|25|45948.25|0.02|0.04|N|O|1998-02-17|1998-01-10|1998-03-15|DELIVER IN PERSON|SHIP|l ideas sleep blithely carefully regular +27941|279|34|1|23|27123.21|0.02|0.01|A|F|1993-09-29|1993-09-23|1993-10-09|NONE|TRUCK|ges believe in pla +27941|1810|11|2|18|30812.58|0.09|0.02|A|F|1993-10-24|1993-08-13|1993-11-01|NONE|MAIL|arly ironic deposits +27941|569|30|3|35|51434.60|0.06|0.00|R|F|1993-08-19|1993-08-15|1993-08-28|DELIVER IN PERSON|SHIP|ts against the regular, i +27941|254|82|4|28|32319.00|0.09|0.05|A|F|1993-08-17|1993-09-30|1993-08-18|COLLECT COD|AIR|beans. even deposits across the +27942|20|46|1|37|34040.74|0.07|0.03|N|O|1998-02-14|1998-01-05|1998-02-26|COLLECT COD|RAIL|ackages. even, regular deposit +27942|504|5|2|45|63202.50|0.07|0.02|N|O|1998-01-16|1997-12-02|1998-01-30|DELIVER IN PERSON|AIR|lyly bold deposits. b +27942|683|84|3|26|41175.68|0.06|0.02|N|O|1998-02-14|1997-12-09|1998-02-24|TAKE BACK RETURN|RAIL|ing to the furio +27942|937|72|4|9|16541.37|0.01|0.07|N|O|1997-11-27|1997-12-18|1997-12-21|DELIVER IN PERSON|TRUCK|en instructions sleep ironic pl +27942|390|75|5|33|42582.87|0.09|0.04|N|O|1998-02-18|1997-12-24|1998-02-28|NONE|AIR|ecial requests. regular, +27942|820|54|6|5|8604.10|0.06|0.06|N|O|1997-11-10|1997-12-29|1997-12-09|TAKE BACK RETURN|RAIL|equests wake. packages slee +27942|1723|24|7|17|27620.24|0.01|0.01|N|O|1998-01-24|1998-01-17|1998-02-19|NONE|FOB|as sleep according to the blithely f +27943|406|7|1|2|2612.80|0.06|0.06|N|O|1997-12-18|1998-01-21|1998-01-09|NONE|FOB|oys. blithel +27943|585|46|2|22|32682.76|0.00|0.08|N|O|1998-03-29|1998-01-28|1998-04-24|COLLECT COD|SHIP|y. regularly ironic deposits serve s +27968|100|76|1|30|30003.00|0.09|0.06|N|O|1998-02-06|1998-02-21|1998-03-03|TAKE BACK RETURN|TRUCK|ggle above the silent excuses. quickly re +27968|642|74|2|5|7713.20|0.08|0.00|N|O|1998-02-10|1998-01-18|1998-02-25|COLLECT COD|AIR|s sleep careful +27968|266|21|3|3|3498.78|0.01|0.02|N|O|1997-12-03|1998-02-02|1997-12-04|NONE|REG AIR| carefully permanent instruct +27968|482|12|4|43|59446.64|0.03|0.01|N|O|1998-01-14|1998-01-31|1998-01-19|NONE|MAIL|l deposits sleep furiously bold deposit +27968|1156|65|5|50|52857.50|0.03|0.02|N|O|1998-03-10|1998-01-06|1998-04-06|DELIVER IN PERSON|REG AIR|e ideas cajole according to the +27968|320|77|6|49|59795.68|0.04|0.01|N|O|1998-02-17|1998-02-02|1998-03-07|COLLECT COD|MAIL|ckly ruthless dolphins sleep slyly. accou +27968|1278|16|7|20|23585.40|0.05|0.06|N|O|1998-02-07|1998-02-22|1998-02-22|DELIVER IN PERSON|RAIL|hely. blithely special ideas +27969|881|48|1|27|48110.76|0.08|0.07|A|F|1993-06-18|1993-09-04|1993-07-09|TAKE BACK RETURN|REG AIR|express instructions. spe +27969|1043|44|2|30|28321.20|0.00|0.02|R|F|1993-10-05|1993-08-31|1993-10-18|TAKE BACK RETURN|TRUCK|deposits. pending gifts wake +27969|2|78|3|44|39688.00|0.06|0.03|A|F|1993-08-19|1993-08-07|1993-09-11|COLLECT COD|RAIL|longside of the carefully final pac +27969|1059|65|4|6|5760.30|0.05|0.07|R|F|1993-09-02|1993-08-24|1993-09-21|DELIVER IN PERSON|REG AIR|. special accounts haggle. packages cajo +27969|550|51|5|11|15956.05|0.05|0.07|A|F|1993-07-05|1993-07-15|1993-07-18|NONE|MAIL|its haggle furiously. quickly furiou +27969|1320|35|6|42|51295.44|0.04|0.06|R|F|1993-07-25|1993-08-04|1993-08-06|TAKE BACK RETURN|SHIP|uick braids wake fluffily around the slyly +27970|1158|31|1|3|3177.45|0.09|0.04|N|O|1998-10-01|1998-08-19|1998-10-07|TAKE BACK RETURN|FOB|uickly bold court +27971|517|8|1|42|59535.42|0.06|0.08|N|O|1996-12-29|1997-03-19|1997-01-06|DELIVER IN PERSON|TRUCK| furiously o +27971|208|36|2|38|42111.60|0.04|0.02|N|O|1997-01-17|1997-03-26|1997-01-19|COLLECT COD|RAIL|ecial asymptotes haggle carefully ab +27971|208|63|3|5|5541.00|0.04|0.05|N|O|1997-01-23|1997-03-09|1997-02-15|NONE|FOB|al foxes are according to the final +27971|1364|41|4|25|31634.00|0.06|0.02|N|O|1997-02-16|1997-01-30|1997-03-12|DELIVER IN PERSON|AIR| ironic account +27971|1977|78|5|1|1878.97|0.10|0.01|N|O|1997-02-13|1997-02-13|1997-03-06|DELIVER IN PERSON|RAIL|egrate aft +27972|193|20|1|20|21863.80|0.02|0.00|N|O|1996-09-16|1996-09-30|1996-09-22|COLLECT COD|SHIP|tes wake across the regular, +27972|822|89|2|27|46516.14|0.06|0.04|N|O|1996-11-18|1996-09-02|1996-12-13|TAKE BACK RETURN|REG AIR|quests. slyly +27972|664|96|3|1|1564.66|0.02|0.06|N|O|1996-11-12|1996-09-09|1996-12-08|NONE|FOB|quests-- blithely quick packag +27972|120|73|4|27|27543.24|0.01|0.02|N|O|1996-08-09|1996-10-20|1996-09-02|TAKE BACK RETURN|TRUCK|quests nag according to t +27972|1787|88|5|25|42219.50|0.10|0.04|N|O|1996-09-08|1996-08-28|1996-10-01|DELIVER IN PERSON|MAIL|ar requests wake slyly. careful deposits +27972|1680|22|6|42|66430.56|0.02|0.02|N|O|1996-08-12|1996-09-15|1996-09-05|TAKE BACK RETURN|FOB|lyly express deposits are furiou +27973|1172|73|1|23|24682.91|0.05|0.00|R|F|1993-04-19|1993-04-23|1993-05-05|NONE|MAIL|slyly regular, +27973|218|73|2|48|53674.08|0.09|0.06|A|F|1993-03-21|1993-05-05|1993-04-13|COLLECT COD|SHIP|ounts sleep. carefully +27973|1392|31|3|47|60789.33|0.05|0.08|A|F|1993-06-09|1993-05-20|1993-06-28|TAKE BACK RETURN|SHIP|ely ironic packages. slyly regu +27973|311|96|4|15|18169.65|0.07|0.04|R|F|1993-03-13|1993-05-29|1993-03-19|NONE|RAIL|ily. evenly express requests ha +27973|518|19|5|39|55321.89|0.02|0.07|R|F|1993-05-08|1993-04-07|1993-05-10|NONE|SHIP|olites cajole. carefully final pinto bean +27974|67|68|1|20|19341.20|0.02|0.05|A|F|1993-12-15|1994-01-01|1994-01-09|DELIVER IN PERSON|TRUCK|ickly regular waters along the requests +27974|1547|28|2|46|66632.84|0.06|0.03|R|F|1993-12-30|1993-11-12|1994-01-27|COLLECT COD|MAIL|pecial platelets. requests na +27974|435|36|3|35|46740.05|0.10|0.01|A|F|1994-01-23|1993-11-13|1994-02-14|NONE|REG AIR| quickly furiously +27974|235|17|4|10|11352.30|0.05|0.00|R|F|1993-11-10|1993-12-07|1993-11-28|NONE|FOB|theodolites wake about the quickly i +27974|899|33|5|48|86394.72|0.10|0.08|A|F|1994-01-04|1993-11-15|1994-01-28|DELIVER IN PERSON|FOB|s the blith +27974|321|22|6|18|21983.76|0.08|0.01|A|F|1993-11-30|1993-11-26|1993-12-22|NONE|MAIL|round the s +27975|125|78|1|40|41004.80|0.02|0.02|N|F|1995-06-05|1995-04-05|1995-06-25|COLLECT COD|FOB|al, even instructions +27975|213|41|2|11|12245.31|0.01|0.04|A|F|1995-03-05|1995-04-15|1995-03-23|COLLECT COD|TRUCK|nusual excuses must haggle at the +27975|1173|82|3|44|47263.48|0.09|0.01|A|F|1995-04-27|1995-05-04|1995-05-12|DELIVER IN PERSON|REG AIR|posits according +28000|826|26|1|31|53531.42|0.08|0.01|N|O|1995-07-20|1995-06-22|1995-08-18|TAKE BACK RETURN|FOB|ely regular orbits. blithely regular f +28000|204|86|2|17|18771.40|0.09|0.01|R|F|1995-04-18|1995-05-17|1995-04-30|COLLECT COD|FOB|permanently ironic +28000|1006|42|3|7|6349.00|0.02|0.04|A|F|1995-04-06|1995-06-12|1995-05-04|TAKE BACK RETURN|SHIP|ickly among the slyly +28001|1492|71|1|38|52952.62|0.10|0.00|A|F|1994-10-02|1994-08-17|1994-10-30|COLLECT COD|FOB|ole blithely across the slowly i +28001|1409|88|2|40|52416.00|0.05|0.04|R|F|1994-10-02|1994-08-08|1994-10-24|TAKE BACK RETURN|FOB|ly express req +28001|748|81|3|22|36272.28|0.08|0.03|A|F|1994-08-21|1994-08-15|1994-09-04|NONE|MAIL|he furiously sp +28001|1183|56|4|26|28188.68|0.00|0.04|R|F|1994-06-21|1994-08-08|1994-07-10|DELIVER IN PERSON|AIR|bout the regular foxes +28001|1250|62|5|43|49503.75|0.01|0.03|A|F|1994-06-26|1994-08-03|1994-07-18|NONE|AIR|ructions. final instructions affix boldl +28001|534|35|6|23|32994.19|0.06|0.04|R|F|1994-08-12|1994-07-15|1994-08-16|NONE|FOB|ious pinto beans detect +28002|62|13|1|2|1924.12|0.09|0.08|R|F|1995-01-16|1995-01-07|1995-01-27|TAKE BACK RETURN|FOB|se. carefully pending package +28002|1473|74|2|12|16493.64|0.03|0.03|A|F|1994-12-02|1994-12-05|1994-12-20|COLLECT COD|SHIP| pending requests caj +28002|300|82|3|19|22805.70|0.05|0.06|A|F|1994-11-19|1994-11-21|1994-11-29|NONE|AIR|lithely ironic deposi +28002|360|89|4|13|16384.68|0.04|0.06|A|F|1994-12-01|1994-12-28|1994-12-07|COLLECT COD|MAIL|l deposits. do +28002|53|4|5|17|16201.85|0.10|0.03|R|F|1995-01-28|1995-01-02|1995-02-27|DELIVER IN PERSON|AIR|ajole pending requests. q +28002|89|40|6|19|18792.52|0.04|0.05|A|F|1994-12-20|1994-11-16|1995-01-07|NONE|AIR|ly final accounts use slyly +28002|392|77|7|16|20678.24|0.02|0.07|R|F|1995-01-06|1994-12-29|1995-01-20|COLLECT COD|MAIL| cajole slyly. sheav +28003|858|58|1|7|12311.95|0.07|0.06|A|F|1995-04-12|1995-05-06|1995-04-28|NONE|MAIL|efully slyly pending ac +28003|676|70|2|8|12613.36|0.08|0.00|N|O|1995-06-20|1995-06-07|1995-06-26|COLLECT COD|MAIL|e slyly above the regular excuses. unusua +28003|1532|33|3|12|17202.36|0.05|0.02|A|F|1995-04-30|1995-05-26|1995-05-02|TAKE BACK RETURN|TRUCK|bold packages with +28003|242|43|4|30|34267.20|0.02|0.02|A|F|1995-04-17|1995-05-14|1995-05-09|NONE|AIR|c theodolites wake +28003|1726|11|5|38|61853.36|0.08|0.04|N|F|1995-06-13|1995-06-14|1995-06-26|NONE|MAIL|ing, express theodolites use inst +28003|213|14|6|21|23377.41|0.07|0.06|R|F|1995-04-09|1995-05-25|1995-04-10|NONE|FOB|ackages. furiously bold foxes among t +28003|1430|9|7|44|58582.92|0.01|0.05|A|F|1995-04-07|1995-05-26|1995-04-13|TAKE BACK RETURN|FOB| haggle regular dependencies. slyly +28004|859|93|1|50|87992.50|0.09|0.01|N|O|1998-09-23|1998-09-17|1998-10-14|DELIVER IN PERSON|REG AIR|cording to the +28004|205|60|2|40|44208.00|0.01|0.05|N|O|1998-09-11|1998-08-27|1998-09-16|DELIVER IN PERSON|REG AIR| to the ideas boost fluffily instruction +28004|1068|69|3|48|46514.88|0.02|0.04|N|O|1998-07-10|1998-09-04|1998-08-03|DELIVER IN PERSON|RAIL|ut the fur +28004|1158|31|4|30|31774.50|0.08|0.07|N|O|1998-07-27|1998-09-04|1998-08-26|NONE|TRUCK|deas. quickly r +28004|931|32|5|7|12823.51|0.04|0.03|N|O|1998-08-08|1998-09-18|1998-08-22|NONE|RAIL| regular packages. slyly ironic ideas boos +28005|653|85|1|14|21751.10|0.00|0.07|A|F|1995-01-26|1995-03-13|1995-02-20|TAKE BACK RETURN|REG AIR|old courts haggle furiously eve +28005|543|34|2|43|62072.22|0.05|0.05|R|F|1995-05-20|1995-04-14|1995-06-16|NONE|MAIL|uriously pending pinto +28006|349|50|1|7|8745.38|0.02|0.06|N|O|1997-08-24|1997-07-12|1997-08-28|NONE|MAIL|olites haggle busi +28006|860|27|2|39|68673.54|0.09|0.02|N|O|1997-07-26|1997-06-23|1997-08-15|COLLECT COD|TRUCK|es haggle slyly against the bl +28006|680|12|3|19|30032.92|0.10|0.00|N|O|1997-06-10|1997-07-04|1997-06-30|NONE|FOB| regular deposits. unusua +28006|182|9|4|31|33547.58|0.09|0.05|N|O|1997-08-08|1997-06-24|1997-08-18|COLLECT COD|FOB|ans wake; blithely slow multipliers slee +28006|1618|60|5|5|7598.05|0.09|0.03|N|O|1997-09-08|1997-06-19|1997-09-22|COLLECT COD|RAIL|ly ironic theodolit +28006|1450|90|6|13|17568.85|0.06|0.06|N|O|1997-07-23|1997-07-15|1997-08-12|TAKE BACK RETURN|TRUCK|erns haggle fluf +28007|779|76|1|28|47033.56|0.00|0.01|A|F|1993-08-08|1993-06-10|1993-08-19|DELIVER IN PERSON|SHIP|ual accounts. even hockey players wake fu +28007|1039|45|2|33|31020.99|0.00|0.05|A|F|1993-05-17|1993-06-12|1993-05-18|TAKE BACK RETURN|SHIP|regular instructions sleep fur +28007|1594|15|3|30|44867.70|0.00|0.01|A|F|1993-06-22|1993-05-12|1993-07-16|DELIVER IN PERSON|MAIL|eas boost according to th +28007|11|12|4|36|32796.36|0.05|0.08|R|F|1993-05-09|1993-06-15|1993-05-13|NONE|AIR| ironic theodolites wake on t +28007|167|94|5|1|1067.16|0.05|0.04|A|F|1993-07-10|1993-06-18|1993-07-20|COLLECT COD|REG AIR|etect carefully about +28007|1805|6|6|38|64858.40|0.00|0.07|A|F|1993-06-05|1993-05-19|1993-06-27|NONE|RAIL| express foxes haggle. slyly close real +28032|1637|61|1|34|52313.42|0.06|0.01|N|O|1998-03-25|1998-05-01|1998-03-31|NONE|RAIL|boldly accor +28032|1687|88|2|9|14298.12|0.03|0.01|N|O|1998-03-16|1998-03-20|1998-04-09|NONE|AIR|ve the blithely bold pains +28032|668|31|3|14|21961.24|0.02|0.01|N|O|1998-04-19|1998-03-23|1998-05-18|COLLECT COD|FOB|accounts. re +28033|143|44|1|8|8345.12|0.00|0.02|R|F|1993-11-27|1993-10-20|1993-12-07|COLLECT COD|MAIL|yly final cour +28033|652|84|2|3|4657.95|0.09|0.08|A|F|1993-09-27|1993-11-03|1993-09-28|COLLECT COD|RAIL|xes haggle carefully throughout +28033|22|23|3|21|19362.42|0.04|0.03|A|F|1993-09-20|1993-11-26|1993-09-25|COLLECT COD|SHIP|affix after the regular, regular excuse +28033|432|62|4|23|30645.89|0.07|0.05|R|F|1993-11-30|1993-11-18|1993-12-12|NONE|MAIL|yly special ideas a +28033|455|56|5|48|65061.60|0.03|0.01|R|F|1993-10-17|1993-11-21|1993-11-04|COLLECT COD|FOB|til the ironic, unusual accounts sleep pend +28033|754|19|6|36|59571.00|0.09|0.02|R|F|1993-11-08|1993-11-14|1993-12-05|DELIVER IN PERSON|RAIL|ly silent packages cajole. carefu +28033|587|78|7|31|46114.98|0.06|0.06|R|F|1993-11-29|1993-11-10|1993-12-05|TAKE BACK RETURN|TRUCK|instructions across the express requests +28034|394|51|1|9|11649.51|0.00|0.07|N|O|1996-01-15|1996-01-08|1996-01-25|DELIVER IN PERSON|FOB|st along the quickly +28035|1569|90|1|16|23528.96|0.10|0.01|N|O|1995-08-27|1995-06-13|1995-09-12|COLLECT COD|MAIL|wake acros +28035|1768|95|2|1|1669.76|0.03|0.08|N|O|1995-08-25|1995-06-14|1995-09-11|DELIVER IN PERSON|MAIL|. carefully regular escapades should +28035|990|91|3|34|64293.66|0.08|0.01|N|O|1995-08-09|1995-08-06|1995-08-29|DELIVER IN PERSON|TRUCK| furiously even requ +28035|1862|49|4|29|51151.94|0.01|0.08|A|F|1995-05-10|1995-06-15|1995-06-08|COLLECT COD|SHIP| cajole quickl +28035|1263|64|5|47|54720.22|0.10|0.08|R|F|1995-06-11|1995-07-02|1995-06-16|TAKE BACK RETURN|MAIL|ts sleep blithely deposits. bold pack +28036|1581|22|1|15|22238.70|0.07|0.00|R|F|1993-12-23|1994-01-02|1993-12-27|COLLECT COD|AIR|ly bold acc +28036|581|42|2|15|22223.70|0.10|0.04|A|F|1994-02-09|1994-01-10|1994-02-19|DELIVER IN PERSON|RAIL|structions affix after the packages. +28036|624|56|3|48|73181.76|0.07|0.06|R|F|1993-11-22|1994-01-11|1993-12-12|TAKE BACK RETURN|SHIP|l foxes nag blithely. slyly fina +28036|78|4|4|24|23473.68|0.04|0.07|R|F|1993-12-25|1993-12-18|1994-01-01|NONE|REG AIR|uests. blithe +28036|1366|67|5|14|17743.04|0.03|0.06|R|F|1994-01-11|1994-01-19|1994-01-26|DELIVER IN PERSON|RAIL|ffily regular dependencies boost slyly +28036|1939|28|6|43|79159.99|0.02|0.06|R|F|1994-01-27|1994-02-03|1994-02-20|DELIVER IN PERSON|MAIL|quests-- close, even excuses boost +28037|1032|38|1|7|6531.21|0.10|0.00|R|F|1994-12-18|1995-01-22|1994-12-19|DELIVER IN PERSON|FOB|ording to the ironic, final plate +28037|114|41|2|17|17239.87|0.01|0.05|A|F|1995-04-09|1995-02-25|1995-04-24|NONE|MAIL|ng requests +28037|45|71|3|23|21735.92|0.05|0.04|A|F|1995-03-04|1995-02-11|1995-03-31|TAKE BACK RETURN|MAIL|ular, final packages wake abov +28037|1116|89|4|10|10171.10|0.09|0.06|A|F|1995-02-01|1995-02-03|1995-02-28|DELIVER IN PERSON|AIR|ts. even requests acco +28037|1422|23|5|15|19851.30|0.05|0.02|A|F|1995-01-10|1995-02-22|1995-01-30|COLLECT COD|RAIL|nooze blithely alongs +28038|421|9|1|18|23785.56|0.06|0.01|N|O|1996-09-09|1996-07-11|1996-09-25|COLLECT COD|MAIL|ges are carefully ironic, express cou +28038|1405|84|2|14|18289.60|0.03|0.05|N|O|1996-08-10|1996-07-19|1996-09-07|DELIVER IN PERSON|RAIL| theodolites cajole +28038|4|55|3|34|30736.00|0.01|0.04|N|O|1996-07-25|1996-08-19|1996-07-30|DELIVER IN PERSON|RAIL|ily ironic ideas. requests nag. dogged dep +28038|1487|88|4|23|31935.04|0.07|0.04|N|O|1996-09-22|1996-08-31|1996-10-08|NONE|FOB|ans integrate +28038|1391|6|5|11|14216.29|0.04|0.07|N|O|1996-07-27|1996-08-14|1996-08-26|NONE|FOB|s, even dependencies. pending, +28038|370|99|6|42|53355.54|0.08|0.08|N|O|1996-08-02|1996-08-13|1996-08-29|TAKE BACK RETURN|MAIL|uses sleep blithely iron +28039|1779|22|1|27|45380.79|0.03|0.03|R|F|1992-12-17|1992-11-12|1993-01-15|COLLECT COD|TRUCK|uffily final packages detect slyly. ca +28039|1080|51|2|38|37281.04|0.00|0.07|A|F|1992-12-01|1992-12-08|1992-12-20|TAKE BACK RETURN|MAIL|gage around t +28064|497|98|1|26|36334.74|0.00|0.04|A|F|1993-09-24|1993-12-01|1993-10-04|TAKE BACK RETURN|MAIL|ckages haggle after the iro +28064|1754|39|2|43|71197.25|0.09|0.02|R|F|1993-12-25|1993-10-29|1994-01-11|COLLECT COD|RAIL|e fluffily even +28064|220|75|3|7|7841.54|0.01|0.02|A|F|1993-11-28|1993-10-23|1993-12-22|COLLECT COD|SHIP|blithely regular requests. furi +28064|1826|70|4|4|6911.28|0.03|0.07|R|F|1993-11-05|1993-11-21|1993-11-27|DELIVER IN PERSON|REG AIR|terns wake busily. +28064|1089|90|5|42|41583.36|0.05|0.03|R|F|1993-11-19|1993-10-20|1993-12-11|COLLECT COD|SHIP|jole across the slyly brave packages. fur +28064|1097|68|6|10|9980.90|0.07|0.05|R|F|1993-09-07|1993-11-27|1993-09-23|DELIVER IN PERSON|AIR|al requests. blit +28064|873|40|7|33|58537.71|0.02|0.07|R|F|1993-12-31|1993-10-30|1994-01-27|COLLECT COD|MAIL|posits. final, f +28065|1496|75|1|21|29347.29|0.10|0.08|N|O|1998-03-03|1998-01-24|1998-03-12|TAKE BACK RETURN|SHIP|lyly around the slyly final th +28065|735|68|2|41|67064.93|0.02|0.04|N|O|1998-01-14|1997-12-30|1998-02-11|NONE|FOB|ix carefully. ironic pinto beans h +28065|688|82|3|26|41305.68|0.10|0.00|N|O|1997-12-18|1997-12-26|1998-01-01|COLLECT COD|TRUCK|ng requests maintain carefully. fu +28065|1880|24|4|1|1781.88|0.01|0.01|N|O|1997-12-16|1998-01-25|1997-12-29|DELIVER IN PERSON|TRUCK|ly regular accounts use slyly across t +28065|1938|27|5|45|82796.85|0.03|0.00|N|O|1998-03-08|1997-12-17|1998-03-29|NONE|AIR|hely theodolites. quickly +28066|1203|15|1|19|20979.80|0.10|0.04|N|O|1997-04-05|1997-06-03|1997-05-05|NONE|AIR| bold accounts. even packag +28066|1265|66|2|3|3498.78|0.08|0.02|N|O|1997-06-21|1997-05-30|1997-07-20|NONE|FOB|ular, bold requests boost stealthily +28066|1974|63|3|18|33767.46|0.08|0.04|N|O|1997-06-04|1997-04-18|1997-06-10|COLLECT COD|AIR|ccounts-- ev +28066|906|41|4|32|57820.80|0.04|0.07|N|O|1997-03-25|1997-05-26|1997-04-17|DELIVER IN PERSON|MAIL|eposits. blithely final packages about +28067|1092|98|1|34|33765.06|0.02|0.05|A|F|1994-04-16|1994-02-16|1994-04-26|NONE|RAIL|ravely alongside of the quickly +28067|1487|5|2|43|59704.64|0.00|0.04|A|F|1994-04-25|1994-03-23|1994-04-27|DELIVER IN PERSON|REG AIR|t quickly bold a +28067|538|69|3|33|47471.49|0.00|0.08|A|F|1994-04-17|1994-03-29|1994-04-29|COLLECT COD|REG AIR|efully: quickly unusu +28067|1956|89|4|39|72460.05|0.02|0.04|A|F|1994-01-23|1994-03-06|1994-01-25|COLLECT COD|AIR|en asymptotes. blithely ironic request +28067|1921|66|5|37|67448.04|0.09|0.03|A|F|1994-04-03|1994-03-13|1994-04-27|NONE|REG AIR|dolites print slowly even packages. carefu +28067|1177|86|6|42|45283.14|0.03|0.01|A|F|1994-03-13|1994-03-25|1994-04-02|COLLECT COD|FOB|t the furiously even platelets. final +28067|1029|100|7|20|18600.40|0.05|0.04|R|F|1994-03-08|1994-03-05|1994-03-23|NONE|REG AIR|cajole quickly above the furious +28068|1251|26|1|37|42633.25|0.10|0.07|R|F|1993-09-30|1993-10-19|1993-10-04|TAKE BACK RETURN|TRUCK| cajole. slyly final instructions acc +28068|673|67|2|8|12589.36|0.01|0.01|R|F|1993-09-29|1993-09-29|1993-10-15|TAKE BACK RETURN|SHIP|ully final pinto beans. bold p +28068|256|11|3|31|35843.75|0.00|0.00|R|F|1993-11-18|1993-11-14|1993-11-20|TAKE BACK RETURN|TRUCK|inal theodol +28068|689|52|4|15|23845.20|0.06|0.04|R|F|1993-09-21|1993-11-14|1993-09-27|TAKE BACK RETURN|SHIP|lly final requests can poach among t +28068|15|91|5|12|10980.12|0.01|0.02|A|F|1993-10-31|1993-11-22|1993-11-06|TAKE BACK RETURN|RAIL|aggle furiously pending +28068|914|15|6|26|47187.66|0.08|0.00|A|F|1993-12-19|1993-11-20|1993-12-31|NONE|RAIL|y quickly across the regu +28068|1425|26|7|35|46424.70|0.01|0.02|R|F|1993-12-20|1993-10-22|1994-01-19|NONE|FOB|even theodolites. even +28069|49|50|1|49|46502.96|0.07|0.03|R|F|1994-05-30|1994-08-07|1994-06-07|NONE|MAIL|sts. slyly pending pac +28069|542|3|2|6|8655.24|0.01|0.05|R|F|1994-06-08|1994-07-21|1994-06-28|COLLECT COD|RAIL|ans. packa +28069|1062|68|3|30|28891.80|0.03|0.05|R|F|1994-06-02|1994-08-11|1994-06-29|DELIVER IN PERSON|TRUCK|al requests. blithely regular ac +28069|508|99|4|21|29578.50|0.00|0.03|R|F|1994-06-19|1994-08-19|1994-07-11|TAKE BACK RETURN|AIR|eposits. fl +28069|1156|29|5|44|46514.60|0.01|0.05|R|F|1994-06-12|1994-07-28|1994-07-01|COLLECT COD|AIR|fully special deposits. +28069|392|77|6|32|41356.48|0.07|0.06|A|F|1994-08-12|1994-06-21|1994-08-30|TAKE BACK RETURN|TRUCK|ding foxes x-ray s +28069|50|1|7|11|10450.55|0.10|0.02|A|F|1994-08-04|1994-07-07|1994-08-07|TAKE BACK RETURN|MAIL|iously ironic hockey players am +28070|1295|33|1|38|45459.02|0.10|0.01|N|O|1997-12-13|1997-12-02|1997-12-18|TAKE BACK RETURN|AIR|es. excuses alongside of the foxes +28071|1982|27|1|24|45215.52|0.09|0.01|N|O|1995-11-01|1995-09-06|1995-11-26|COLLECT COD|FOB|impress boldly bold +28071|1072|73|2|22|21407.54|0.07|0.02|N|O|1995-07-17|1995-08-21|1995-08-03|NONE|FOB|g to the silentl +28071|433|21|3|25|33335.75|0.10|0.02|N|O|1995-10-25|1995-09-12|1995-11-12|DELIVER IN PERSON|RAIL|e the furiously ironic +28096|523|84|1|42|59787.84|0.06|0.04|N|O|1998-08-08|1998-07-08|1998-08-30|DELIVER IN PERSON|TRUCK|slyly unus +28097|1598|39|1|22|32990.98|0.03|0.03|R|F|1994-05-19|1994-07-15|1994-05-27|DELIVER IN PERSON|FOB|ounts. ironic foxes wake furiously. pi +28097|224|25|2|4|4496.88|0.01|0.01|R|F|1994-08-17|1994-06-18|1994-08-22|NONE|REG AIR|ding deposits a +28097|1912|45|3|6|10883.46|0.01|0.04|R|F|1994-07-13|1994-07-01|1994-07-19|DELIVER IN PERSON|FOB|ccounts nag slyly acr +28097|1791|92|4|12|20313.48|0.07|0.05|A|F|1994-07-23|1994-07-14|1994-08-05|TAKE BACK RETURN|FOB|sh furiously deposits. +28098|1891|92|1|26|46615.14|0.06|0.00|N|O|1997-09-30|1997-09-15|1997-10-04|TAKE BACK RETURN|SHIP|ggle! regular accounts sleep so +28099|1633|34|1|20|30692.60|0.03|0.04|N|O|1996-12-02|1996-12-19|1996-12-13|TAKE BACK RETURN|SHIP|ct across the regular, regular platelets. c +28099|1182|83|2|10|10831.80|0.03|0.01|N|O|1996-10-25|1996-12-22|1996-10-29|DELIVER IN PERSON|FOB|gular, bold courts boost furiously a +28099|1235|36|3|31|35223.13|0.06|0.03|N|O|1997-01-07|1996-11-03|1997-01-25|NONE|TRUCK|y silent excuses. reg +28099|257|58|4|20|23145.00|0.10|0.03|N|O|1996-12-20|1996-11-03|1997-01-07|COLLECT COD|FOB|nag ironically express accounts. blithely +28099|1956|1|5|2|3715.90|0.06|0.05|N|O|1996-10-16|1996-12-23|1996-11-13|TAKE BACK RETURN|TRUCK|ter the final packages. furiously specia +28099|661|93|6|29|45288.14|0.09|0.07|N|O|1996-12-18|1996-12-13|1997-01-13|DELIVER IN PERSON|MAIL|bold accounts sublate furiously furiousl +28099|1894|95|7|17|30530.13|0.08|0.06|N|O|1996-09-29|1996-11-16|1996-10-24|COLLECT COD|RAIL|ckages impre +28100|609|3|1|47|70951.20|0.08|0.07|N|O|1995-11-14|1996-01-03|1995-12-12|NONE|SHIP|g blithely. ironic accounts integrate +28100|305|90|2|2|2410.60|0.06|0.08|N|O|1996-03-06|1996-01-27|1996-03-08|COLLECT COD|RAIL|he furiously furious reques +28100|452|11|3|6|8114.70|0.03|0.08|N|O|1996-02-28|1996-01-15|1996-03-24|DELIVER IN PERSON|AIR|l packages sleep among the bo +28100|65|66|4|26|25091.56|0.04|0.05|N|O|1995-11-17|1996-01-05|1995-12-01|DELIVER IN PERSON|MAIL|ully after the theodolites +28100|587|88|5|49|72891.42|0.01|0.04|N|O|1995-12-12|1995-12-24|1996-01-11|COLLECT COD|FOB|ccounts. blithely special courts acros +28101|1798|25|1|3|5099.37|0.08|0.05|N|O|1998-05-23|1998-05-17|1998-06-05|COLLECT COD|REG AIR|blithely. car +28101|1004|40|2|26|23530.00|0.01|0.02|N|O|1998-06-02|1998-06-12|1998-06-10|TAKE BACK RETURN|SHIP|se carefully unusual excuses. blithel +28102|394|79|1|30|38831.70|0.07|0.01|N|O|1998-03-01|1998-03-16|1998-03-22|NONE|AIR|ggle carefully. escapades a +28103|1997|98|1|46|87353.54|0.00|0.08|R|F|1992-08-31|1992-09-15|1992-09-09|TAKE BACK RETURN|TRUCK| about the fluffy requests. bold +28103|1627|69|2|32|48915.84|0.10|0.07|R|F|1992-11-10|1992-09-01|1992-11-28|NONE|RAIL|fully throughout th +28128|1291|29|1|48|57229.92|0.07|0.03|N|O|1996-09-10|1996-10-18|1996-09-29|TAKE BACK RETURN|TRUCK|ronic dolphins wake above the u +28128|916|17|2|12|21802.92|0.10|0.06|N|O|1996-08-17|1996-09-29|1996-09-05|COLLECT COD|TRUCK|uffily after the fluffi +28128|844|11|3|49|85497.16|0.06|0.07|N|O|1996-09-27|1996-08-24|1996-10-20|DELIVER IN PERSON|RAIL|ke bold asymptote +28128|528|29|4|19|27141.88|0.10|0.07|N|O|1996-08-04|1996-09-28|1996-08-18|DELIVER IN PERSON|FOB|yly. furiously special warh +28128|266|48|5|42|48982.92|0.09|0.03|N|O|1996-08-11|1996-09-30|1996-08-24|DELIVER IN PERSON|FOB|ions after the car +28128|58|59|6|40|38322.00|0.09|0.04|N|O|1996-09-07|1996-10-13|1996-09-19|DELIVER IN PERSON|TRUCK|slyly final accounts. idly +28128|448|49|7|3|4045.32|0.08|0.04|N|O|1996-10-09|1996-10-16|1996-10-30|TAKE BACK RETURN|RAIL| beans. sometimes fin +28129|873|73|1|6|10643.22|0.01|0.05|A|F|1992-02-03|1992-03-05|1992-02-29|NONE|REG AIR|the carefully ironic foxes. final f +28129|61|37|2|42|40364.52|0.10|0.08|A|F|1992-02-14|1992-03-07|1992-02-27|NONE|TRUCK|ck requests alongside +28129|105|32|3|13|13066.30|0.04|0.04|R|F|1992-03-26|1992-03-13|1992-04-12|NONE|AIR|are furiously acros +28129|1410|11|4|17|22293.97|0.02|0.06|A|F|1992-05-07|1992-03-16|1992-06-05|TAKE BACK RETURN|SHIP|ong the quickly eve +28129|1776|61|5|49|82210.73|0.08|0.03|R|F|1992-02-22|1992-04-03|1992-03-03|DELIVER IN PERSON|REG AIR|ts wake carefu +28129|966|69|6|5|9334.80|0.05|0.08|R|F|1992-02-09|1992-03-07|1992-02-10|DELIVER IN PERSON|AIR|nal packages are. packages amo +28129|1371|10|7|7|8906.59|0.10|0.07|A|F|1992-03-27|1992-02-29|1992-04-10|TAKE BACK RETURN|RAIL|kly slow w +28130|649|50|1|13|20145.32|0.10|0.03|R|F|1994-08-22|1994-09-08|1994-09-03|DELIVER IN PERSON|AIR|closely si +28130|212|94|2|46|51161.66|0.05|0.03|R|F|1994-11-04|1994-10-15|1994-11-28|DELIVER IN PERSON|SHIP|y unusual theodolites. unusual +28130|373|58|3|8|10186.96|0.09|0.04|R|F|1994-09-14|1994-09-14|1994-09-25|COLLECT COD|FOB| silent accounts haggle after the regu +28130|637|100|4|33|50741.79|0.06|0.04|A|F|1994-08-10|1994-10-26|1994-08-19|COLLECT COD|FOB|sly against the slyly regular +28130|914|17|5|23|41742.93|0.05|0.03|R|F|1994-10-19|1994-10-19|1994-11-03|COLLECT COD|RAIL|y about the slyly bo +28130|956|59|6|22|40852.90|0.01|0.08|A|F|1994-11-20|1994-10-29|1994-12-02|DELIVER IN PERSON|AIR|efully even requests. slyly +28130|1867|54|7|19|33608.34|0.10|0.04|A|F|1994-11-23|1994-10-14|1994-12-05|DELIVER IN PERSON|REG AIR|e regular deposit +28131|1814|58|1|4|6863.24|0.00|0.01|A|F|1992-07-09|1992-07-30|1992-07-17|COLLECT COD|FOB|ts haggle blithely. quickly u +28131|498|86|2|48|67127.52|0.09|0.01|R|F|1992-09-09|1992-07-28|1992-10-08|NONE|REG AIR|y regular accounts. ir +28131|1891|92|3|5|8964.45|0.02|0.03|R|F|1992-08-13|1992-08-18|1992-09-02|COLLECT COD|REG AIR|y express pinto beans. final foxes wak +28131|1957|46|4|26|48332.70|0.03|0.04|R|F|1992-08-25|1992-08-22|1992-09-04|DELIVER IN PERSON|REG AIR|yly special multipliers. reg +28131|1164|65|5|21|22368.36|0.01|0.02|A|F|1992-07-06|1992-07-14|1992-07-17|TAKE BACK RETURN|MAIL|y express deposits wake unusual, +28132|594|85|1|27|40353.93|0.01|0.07|N|O|1998-08-12|1998-08-11|1998-08-19|TAKE BACK RETURN|FOB|ously unusual, even deposits. unusual accou +28132|1455|73|2|49|66466.05|0.09|0.01|N|O|1998-05-28|1998-06-18|1998-06-13|DELIVER IN PERSON|TRUCK|ccounts nag. furiously pending +28132|1925|58|3|23|42019.16|0.03|0.06|N|O|1998-06-05|1998-07-30|1998-06-17|NONE|AIR|olites against the ironic, even dugou +28132|666|29|4|6|9399.96|0.02|0.02|N|O|1998-06-16|1998-07-09|1998-07-11|DELIVER IN PERSON|SHIP|s the fluff +28133|35|61|1|14|13090.42|0.02|0.07|N|O|1998-05-08|1998-05-03|1998-05-29|DELIVER IN PERSON|AIR|onic reque +28133|645|39|2|17|26275.88|0.01|0.01|N|O|1998-04-09|1998-04-18|1998-04-20|COLLECT COD|TRUCK|riously against the u +28133|408|38|3|41|53644.40|0.04|0.01|N|O|1998-05-25|1998-06-10|1998-06-16|NONE|FOB|to sleep carefully across the dependencies +28133|533|24|4|28|40138.84|0.07|0.06|N|O|1998-06-15|1998-06-11|1998-07-12|TAKE BACK RETURN|TRUCK|posits use blithely spec +28134|591|52|1|27|40272.93|0.07|0.07|N|O|1997-05-03|1997-04-28|1997-05-15|COLLECT COD|AIR|thely fluffily bold pinto bean +28134|851|85|2|22|38540.70|0.00|0.04|N|O|1997-04-19|1997-05-27|1997-05-11|TAKE BACK RETURN|TRUCK|der. careful +28134|1893|94|3|31|55641.59|0.06|0.07|N|O|1997-05-27|1997-06-19|1997-06-16|DELIVER IN PERSON|REG AIR|uctions. unusual, special cou +28135|465|95|1|15|20481.90|0.05|0.00|A|F|1994-11-11|1994-11-25|1994-11-19|DELIVER IN PERSON|RAIL|uests haggle furiously after the special, +28135|636|37|2|16|24586.08|0.03|0.01|R|F|1994-11-02|1994-12-15|1994-12-01|NONE|REG AIR|ts are blithely +28135|933|34|3|12|22007.16|0.01|0.07|A|F|1994-12-24|1994-10-27|1995-01-09|DELIVER IN PERSON|AIR|olphins about the enticing foxes engag +28135|1607|49|4|9|13577.40|0.10|0.00|A|F|1994-12-27|1994-11-29|1995-01-15|DELIVER IN PERSON|SHIP|eas; express deposits lose special deposi +28135|1507|8|5|28|39438.00|0.09|0.00|R|F|1994-12-19|1994-12-03|1994-12-22|DELIVER IN PERSON|FOB|haggle slyly? +28160|1913|58|1|26|47187.66|0.10|0.00|N|O|1997-11-04|1997-10-01|1997-11-15|TAKE BACK RETURN|REG AIR|kages; even packages about +28160|665|66|2|47|73586.02|0.07|0.00|N|O|1997-10-28|1997-11-10|1997-11-24|TAKE BACK RETURN|REG AIR|nst the sly +28160|1470|71|3|42|57601.74|0.06|0.03|N|O|1997-11-12|1997-11-01|1997-12-06|COLLECT COD|SHIP|ajole carefully. slyly final acc +28160|1178|15|4|20|21583.40|0.05|0.03|N|O|1997-12-08|1997-11-17|1997-12-14|DELIVER IN PERSON|REG AIR|cial accounts above the regular +28160|900|67|5|6|10805.40|0.03|0.01|N|O|1997-10-17|1997-10-15|1997-10-27|COLLECT COD|SHIP| even packages wake slyly expr +28161|1652|53|1|33|51270.45|0.09|0.06|R|F|1994-08-28|1994-08-20|1994-09-18|DELIVER IN PERSON|MAIL|blithely around the carefully +28161|433|21|2|7|9334.01|0.05|0.02|A|F|1994-09-10|1994-08-28|1994-10-01|NONE|MAIL|efully: even dependencie +28161|727|28|3|50|81386.00|0.05|0.02|A|F|1994-08-27|1994-09-05|1994-09-12|NONE|MAIL|s. accounts haggle slyly a +28161|31|32|4|18|16758.54|0.08|0.06|R|F|1994-07-07|1994-08-10|1994-08-04|DELIVER IN PERSON|TRUCK|al instructions thrash. slyly +28161|907|8|5|39|70508.10|0.08|0.05|A|F|1994-09-10|1994-08-10|1994-09-11|TAKE BACK RETURN|SHIP|ts nag among the quickl +28161|1999|100|6|23|43722.77|0.03|0.08|A|F|1994-10-06|1994-07-27|1994-10-22|NONE|TRUCK|n fluffily according to the slyly final pac +28161|1827|14|7|39|67423.98|0.04|0.02|R|F|1994-09-16|1994-08-12|1994-10-06|TAKE BACK RETURN|AIR|ons. final, furious requests alon +28162|1824|54|1|25|43145.50|0.04|0.05|R|F|1993-11-03|1993-12-06|1993-11-22|DELIVER IN PERSON|SHIP| even requests boost carefully i +28162|1446|25|2|8|10779.52|0.07|0.00|R|F|1993-10-14|1993-12-26|1993-11-01|TAKE BACK RETURN|AIR|bove the unusual, express pac +28162|1860|61|3|28|49332.08|0.03|0.06|R|F|1994-02-02|1993-12-10|1994-02-26|DELIVER IN PERSON|RAIL| quickly final accounts. caref +28162|536|37|4|31|44532.43|0.03|0.02|R|F|1993-12-15|1993-11-18|1993-12-21|NONE|MAIL|st carefully across the deposits. fur +28163|631|25|1|49|75049.87|0.06|0.00|A|F|1994-10-09|1994-11-03|1994-10-28|COLLECT COD|TRUCK|ely even dependencies integrate +28163|741|42|2|8|13133.92|0.00|0.04|A|F|1994-08-18|1994-10-12|1994-08-31|DELIVER IN PERSON|FOB|ses. final p +28163|80|6|3|8|7840.64|0.07|0.03|A|F|1994-09-02|1994-10-29|1994-09-14|DELIVER IN PERSON|AIR|uests haggle furiously regular, ironic +28163|341|42|4|28|34757.52|0.03|0.00|R|F|1994-10-14|1994-09-27|1994-11-09|NONE|TRUCK|oxes. carefully bold deposits +28163|672|73|5|19|29880.73|0.05|0.08|R|F|1994-11-28|1994-09-28|1994-12-12|TAKE BACK RETURN|AIR|even deposi +28163|1951|40|6|4|7411.80|0.05|0.01|A|F|1994-11-25|1994-10-13|1994-11-29|TAKE BACK RETURN|FOB| the slyly pending pinto be +28164|116|95|1|20|20322.20|0.03|0.03|N|O|1997-12-30|1997-11-07|1998-01-09|COLLECT COD|AIR| blithely carefully eve +28164|854|88|2|3|5264.55|0.07|0.07|N|O|1997-11-03|1997-11-07|1997-11-19|TAKE BACK RETURN|RAIL|aggle furiously above the furiously expr +28164|1422|62|3|31|41026.02|0.10|0.03|N|O|1997-10-07|1997-10-24|1997-11-06|COLLECT COD|REG AIR|ernes sleep slyly. slyly regular instru +28164|945|46|4|46|84913.24|0.05|0.03|N|O|1997-10-19|1997-10-27|1997-10-26|NONE|AIR|ss platelets. r +28164|1905|50|5|18|32524.20|0.01|0.06|N|O|1997-12-18|1997-10-12|1997-12-21|COLLECT COD|FOB|cial instruct +28165|1486|26|1|39|54111.72|0.04|0.00|R|F|1992-10-01|1992-08-29|1992-10-20|TAKE BACK RETURN|RAIL|lithely care +28165|19|70|2|29|26651.29|0.06|0.08|A|F|1992-09-17|1992-09-14|1992-10-12|NONE|AIR| theodolites; instructions +28165|1505|26|3|34|47821.00|0.08|0.05|A|F|1992-10-23|1992-10-04|1992-11-17|TAKE BACK RETURN|REG AIR|dolites are daring, e +28165|119|98|4|18|18343.98|0.09|0.04|R|F|1992-08-16|1992-09-16|1992-09-15|TAKE BACK RETURN|REG AIR|fluffily final pinto beans use! slyly pe +28165|152|53|5|9|9469.35|0.05|0.03|R|F|1992-09-05|1992-09-03|1992-09-22|NONE|AIR|fully ironic requests abov +28165|257|58|6|41|47447.25|0.05|0.00|R|F|1992-08-27|1992-08-27|1992-09-12|COLLECT COD|MAIL| slyly unusual requests; spec +28166|1796|97|1|29|49235.91|0.05|0.02|R|F|1993-07-10|1993-06-28|1993-07-24|NONE|RAIL|ss, unusual platelets wake quickly. f +28166|1920|65|2|15|27328.80|0.09|0.04|A|F|1993-07-11|1993-07-13|1993-08-04|COLLECT COD|FOB|slyly. pending packages sleep furio +28166|892|93|3|14|25100.46|0.00|0.00|R|F|1993-06-05|1993-07-04|1993-07-02|DELIVER IN PERSON|MAIL|nusual, ironic +28166|1554|35|4|19|27655.45|0.10|0.03|R|F|1993-08-01|1993-06-13|1993-08-09|NONE|REG AIR|express accounts wake slyly carefully un +28167|84|10|1|2|1968.16|0.05|0.07|N|O|1997-09-22|1997-06-26|1997-10-03|COLLECT COD|AIR|l asymptotes integrate +28167|248|30|2|32|36743.68|0.08|0.04|N|O|1997-07-04|1997-08-02|1997-07-31|TAKE BACK RETURN|REG AIR|s sleep across the final excuses; package +28192|715|80|1|3|4847.13|0.07|0.01|N|O|1997-10-14|1997-11-19|1997-10-19|TAKE BACK RETURN|REG AIR|ely. furiously regular deposits a +28192|1059|95|2|31|29761.55|0.05|0.06|N|O|1997-10-17|1998-01-02|1997-11-03|DELIVER IN PERSON|REG AIR| blithely special +28192|1630|54|3|19|29100.97|0.10|0.06|N|O|1997-12-11|1997-11-24|1998-01-09|NONE|SHIP|ding to the carefully ironic deposits. fi +28193|1331|70|1|26|32040.58|0.10|0.08|A|F|1994-04-24|1994-05-18|1994-05-15|COLLECT COD|TRUCK|ronic instructions after the instructions +28194|1233|71|1|45|51040.35|0.04|0.00|N|O|1997-03-08|1997-02-05|1997-03-20|NONE|RAIL| furiously quickly permanent excuses. caref +28194|515|46|2|13|18401.63|0.08|0.02|N|O|1996-12-31|1997-03-04|1997-01-16|NONE|SHIP|ep furiously slyly +28194|542|43|3|49|70684.46|0.05|0.06|N|O|1996-12-29|1997-02-17|1997-01-05|NONE|SHIP|ly for the fluffily special deposits. furio +28194|1813|57|4|25|42870.25|0.03|0.00|N|O|1996-12-31|1997-02-17|1997-01-18|NONE|TRUCK|gular theodolites wake fu +28194|690|84|5|45|71581.05|0.01|0.04|N|O|1997-02-09|1997-02-07|1997-02-17|NONE|SHIP|ronic requests cajole furiously s +28195|1702|87|1|33|52922.10|0.01|0.05|R|F|1994-12-26|1995-02-14|1994-12-28|TAKE BACK RETURN|REG AIR|ged sheaves. pending theodolites are fi +28195|317|18|2|4|4869.24|0.03|0.03|R|F|1995-04-07|1995-02-11|1995-05-03|COLLECT COD|AIR|ructions haggle sl +28196|625|57|1|49|74755.38|0.04|0.02|N|O|1995-11-20|1996-01-12|1995-12-07|DELIVER IN PERSON|SHIP|gular, final foxes nag quickly +28197|178|79|1|23|24797.91|0.01|0.03|A|F|1992-02-19|1992-02-25|1992-03-04|DELIVER IN PERSON|FOB|iously final accounts. closely +28197|777|42|2|41|68788.57|0.01|0.02|R|F|1992-03-07|1992-02-26|1992-03-12|NONE|RAIL|l requests. unusual +28198|1293|5|1|31|37022.99|0.10|0.08|R|F|1992-03-11|1992-04-12|1992-03-27|DELIVER IN PERSON|RAIL|packages. sp +28198|1344|45|2|50|62267.00|0.02|0.03|A|F|1992-04-12|1992-03-28|1992-04-23|TAKE BACK RETURN|RAIL| the carefully ironic deposits boos +28198|1472|73|3|48|65926.56|0.04|0.03|R|F|1992-02-19|1992-05-03|1992-02-24|COLLECT COD|SHIP|he ideas grow final idea +28198|1943|76|4|9|16604.46|0.02|0.07|A|F|1992-06-07|1992-03-29|1992-06-12|COLLECT COD|RAIL|ound the carefully express theodolites. +28199|90|16|1|44|43563.96|0.01|0.03|N|O|1997-07-05|1997-06-24|1997-07-28|TAKE BACK RETURN|FOB|y bold deposits. slow packa +28199|1815|45|2|21|36053.01|0.10|0.06|N|O|1997-08-01|1997-06-29|1997-08-22|DELIVER IN PERSON|RAIL|ets. slyly bold idea +28199|1087|58|3|19|18773.52|0.03|0.07|N|O|1997-06-16|1997-07-22|1997-07-13|NONE|AIR|ng packages. slyly blithe requests ar +28199|585|16|4|10|14855.80|0.03|0.02|N|O|1997-06-25|1997-06-16|1997-07-17|NONE|RAIL|ly. ideas cajole slyly among the +28199|641|35|5|20|30832.80|0.01|0.03|N|O|1997-06-19|1997-07-26|1997-07-05|NONE|AIR|re. regular instructions along t +28199|1642|43|6|50|77182.00|0.02|0.06|N|O|1997-08-13|1997-06-06|1997-08-21|TAKE BACK RETURN|RAIL|cross the furiously unusual dep +28199|1612|95|7|32|48435.52|0.06|0.08|N|O|1997-08-24|1997-06-21|1997-08-28|NONE|AIR|es. regular s +28224|1822|52|1|4|6895.28|0.09|0.04|A|F|1993-01-11|1993-02-15|1993-01-25|DELIVER IN PERSON|FOB|ructions above the slyly bol +28224|1004|5|2|39|35295.00|0.03|0.08|A|F|1992-12-26|1993-03-10|1993-01-06|DELIVER IN PERSON|TRUCK|nic theodo +28224|1833|34|3|47|81537.01|0.02|0.03|A|F|1993-01-30|1993-02-01|1993-02-12|COLLECT COD|RAIL|carefully. ev +28224|1037|43|4|44|41273.32|0.01|0.06|A|F|1993-03-26|1993-02-05|1993-03-27|DELIVER IN PERSON|RAIL|nal packages +28225|71|22|1|16|15537.12|0.03|0.06|R|F|1994-02-16|1994-03-09|1994-02-20|DELIVER IN PERSON|TRUCK|into beans are q +28225|1773|58|2|39|65316.03|0.00|0.01|A|F|1994-03-12|1994-04-04|1994-04-10|NONE|FOB| final deposits affix bli +28225|1366|81|3|45|57031.20|0.00|0.08|A|F|1994-02-13|1994-04-07|1994-03-04|NONE|AIR|ornis dazzle express requests. foxes +28225|1142|51|4|46|47984.44|0.07|0.05|A|F|1994-05-15|1994-03-24|1994-05-18|COLLECT COD|REG AIR|ut the slyly regular packages mold pendi +28225|342|27|5|28|34785.52|0.01|0.02|R|F|1994-02-02|1994-03-30|1994-02-28|NONE|TRUCK| doze thinly final packag +28225|1779|22|6|29|48742.33|0.00|0.01|R|F|1994-03-16|1994-04-22|1994-04-13|DELIVER IN PERSON|RAIL| the blithely s +28225|1496|75|7|11|15372.39|0.10|0.00|A|F|1994-01-31|1994-04-08|1994-02-08|NONE|REG AIR|telets are ca +28226|1661|44|1|31|48442.46|0.03|0.05|N|O|1998-09-14|1998-09-13|1998-09-27|TAKE BACK RETURN|REG AIR|ven ideas nod blithely carefull +28227|1269|70|1|1|1170.26|0.00|0.07|N|O|1997-02-17|1996-12-20|1997-02-26|NONE|TRUCK|furiously express packages accor +28227|114|15|2|34|34479.74|0.02|0.05|N|O|1996-12-10|1996-12-28|1996-12-31|DELIVER IN PERSON|AIR| braids us +28227|1501|82|3|21|29452.50|0.09|0.07|N|O|1996-11-11|1996-12-20|1996-11-24|NONE|AIR|. final accounts doze alwa +28227|184|85|4|7|7589.26|0.10|0.07|N|O|1997-01-25|1996-12-27|1997-02-09|TAKE BACK RETURN|MAIL| packages. carefully ironic +28227|1825|12|5|3|5180.46|0.04|0.06|N|O|1997-01-02|1996-12-29|1997-01-09|COLLECT COD|MAIL|blithely regula +28227|32|33|6|3|2796.09|0.06|0.06|N|O|1996-12-01|1996-12-26|1996-12-19|NONE|RAIL| accounts kindle. quic +28228|309|10|1|33|39906.90|0.07|0.05|R|F|1992-09-19|1992-09-15|1992-10-10|TAKE BACK RETURN|AIR|furiously slyly special t +28228|1903|48|2|6|10829.40|0.06|0.04|R|F|1992-08-06|1992-10-07|1992-08-28|DELIVER IN PERSON|MAIL|s. regular asymptotes nag fluffil +28228|1810|40|3|12|20541.72|0.08|0.01|R|F|1992-08-13|1992-08-26|1992-08-18|TAKE BACK RETURN|RAIL|nding packages sleep caref +28228|1187|60|4|4|4352.72|0.04|0.05|R|F|1992-10-01|1992-09-15|1992-10-22|COLLECT COD|SHIP|thy foxes. fur +28228|811|11|5|13|22253.53|0.07|0.00|R|F|1992-09-08|1992-08-26|1992-09-18|NONE|REG AIR|al gifts despite the slyly express accounts +28229|1924|25|1|8|14607.36|0.04|0.07|N|O|1996-11-03|1996-09-24|1996-11-17|TAKE BACK RETURN|AIR|le carefully. quickly ironic ins +28230|159|12|1|43|45543.45|0.09|0.07|N|O|1997-09-24|1997-10-29|1997-09-30|COLLECT COD|AIR|ar deposits wake carefully regular pinto +28230|1199|100|2|35|38506.65|0.01|0.07|N|O|1997-11-30|1997-11-04|1997-12-29|DELIVER IN PERSON|AIR| carefully regular requests u +28230|1513|94|3|45|63652.95|0.04|0.04|N|O|1997-11-20|1997-11-22|1997-11-24|NONE|TRUCK| the regular ideas. ironic, final depos +28230|166|19|4|19|20257.04|0.04|0.04|N|O|1997-12-26|1997-11-25|1997-12-27|NONE|TRUCK|posits haggle furiously ironic accounts. +28231|944|79|1|50|92247.00|0.01|0.04|R|F|1993-03-02|1993-01-31|1993-03-12|DELIVER IN PERSON|AIR|uickly even requests among +28231|1694|77|2|43|68614.67|0.06|0.05|R|F|1992-12-15|1992-12-08|1993-01-01|NONE|MAIL|old ideas. +28256|334|35|1|47|58013.51|0.03|0.05|R|F|1994-05-01|1994-05-04|1994-05-29|DELIVER IN PERSON|FOB|carefully expr +28256|1845|46|2|2|3493.68|0.08|0.01|A|F|1994-06-14|1994-04-12|1994-07-10|TAKE BACK RETURN|SHIP|tructions under the quickly speci +28257|1202|14|1|37|40818.40|0.04|0.05|N|O|1998-08-08|1998-05-30|1998-08-09|NONE|SHIP| deposits. foxes boost quickly: care +28257|1120|29|2|42|42887.04|0.01|0.00|N|O|1998-08-10|1998-07-03|1998-08-30|NONE|MAIL|ter the bold multipliers. +28258|1005|41|1|20|18120.00|0.09|0.03|R|F|1994-04-15|1994-04-28|1994-04-16|COLLECT COD|FOB|structions m +28258|1341|56|2|32|39754.88|0.03|0.01|A|F|1994-06-10|1994-05-17|1994-07-06|DELIVER IN PERSON|FOB|sual, bold +28258|179|80|3|4|4316.68|0.10|0.06|A|F|1994-06-19|1994-05-21|1994-06-28|COLLECT COD|SHIP|s detect quickly +28258|750|51|4|46|75934.50|0.07|0.02|R|F|1994-05-16|1994-05-08|1994-05-27|DELIVER IN PERSON|REG AIR|y ironic packages impress fluffily during +28258|1441|81|5|6|8054.64|0.03|0.05|A|F|1994-05-21|1994-05-13|1994-06-03|NONE|FOB|hinly regular accounts boo +28258|1997|98|6|22|41777.78|0.10|0.05|R|F|1994-05-06|1994-04-27|1994-05-31|COLLECT COD|SHIP|ly final theodol +28259|1347|48|1|7|8738.38|0.09|0.06|A|F|1995-02-17|1994-12-09|1995-03-11|COLLECT COD|REG AIR|inal, final foxes affix sly +28259|787|88|2|10|16877.80|0.01|0.08|A|F|1995-01-22|1994-12-31|1995-01-28|NONE|REG AIR|latelets. ironic ideas acros +28259|611|5|3|34|51394.74|0.01|0.06|A|F|1995-01-07|1994-12-07|1995-01-26|TAKE BACK RETURN|MAIL| ironic instructions. requests a +28259|850|84|4|35|61279.75|0.02|0.00|R|F|1994-12-19|1994-12-16|1995-01-07|NONE|FOB|blithely blithe instructions along the spec +28259|698|61|5|41|65546.29|0.02|0.01|R|F|1994-12-14|1994-12-19|1994-12-21|NONE|AIR|? final, even dependencies wake. blith +28260|773|6|1|33|55234.41|0.02|0.07|N|O|1996-10-23|1996-09-28|1996-11-16|NONE|REG AIR|pades grow carefully caref +28260|1881|82|2|25|44572.00|0.01|0.08|N|O|1996-10-23|1996-10-30|1996-11-11|TAKE BACK RETURN|TRUCK|slyly. carefully ironic packages a +28260|126|5|3|20|20522.40|0.03|0.08|N|O|1996-10-03|1996-10-28|1996-10-04|TAKE BACK RETURN|TRUCK|ly deposits. blithely regular ac +28260|109|88|4|34|34309.40|0.03|0.01|N|O|1996-10-26|1996-11-21|1996-11-12|TAKE BACK RETURN|RAIL| even excuses. deposits integrat +28260|1426|5|5|17|22566.14|0.07|0.03|N|O|1996-09-17|1996-10-03|1996-10-09|NONE|SHIP|kages impress. dolphins prom +28260|1666|90|6|1|1567.66|0.09|0.02|N|O|1996-11-10|1996-10-14|1996-12-06|COLLECT COD|TRUCK|posits. ironic +28260|1305|20|7|27|32570.10|0.03|0.06|N|O|1996-12-20|1996-09-27|1997-01-16|DELIVER IN PERSON|REG AIR|counts wake regular packages. busy i +28261|859|93|1|32|56315.20|0.07|0.02|A|F|1993-04-01|1993-01-09|1993-04-19|TAKE BACK RETURN|REG AIR| the blithely pend +28261|755|56|2|17|28147.75|0.00|0.00|A|F|1993-04-01|1993-01-31|1993-04-13|TAKE BACK RETURN|MAIL| sublate quickly above the special accou +28261|457|45|3|15|20361.75|0.00|0.03|A|F|1993-03-20|1993-01-23|1993-03-21|COLLECT COD|REG AIR|ymptotes cajole care +28262|388|45|1|46|59265.48|0.03|0.08|R|F|1995-03-22|1995-03-22|1995-04-18|TAKE BACK RETURN|MAIL|nic, unusual pinto bea +28262|943|46|2|38|70069.72|0.07|0.01|A|F|1995-04-21|1995-02-04|1995-05-10|COLLECT COD|RAIL|ckages. slyly ironic packa +28262|1117|18|3|25|25452.75|0.10|0.07|A|F|1995-04-27|1995-03-11|1995-04-28|COLLECT COD|REG AIR|out the caref +28263|263|45|1|40|46530.40|0.04|0.02|N|O|1997-03-22|1997-03-26|1997-03-31|NONE|MAIL| special dinos along the sp +28263|441|71|2|36|48291.84|0.06|0.00|N|O|1997-03-11|1997-03-07|1997-03-14|NONE|RAIL|ages. ironic dolphins are blithely +28263|16|42|3|13|11908.13|0.04|0.01|N|O|1997-05-04|1997-03-19|1997-05-11|COLLECT COD|AIR|gouts. furi +28288|1240|41|1|19|21683.56|0.09|0.00|N|O|1996-06-01|1996-05-19|1996-06-20|NONE|RAIL|x slyly against the stealthy, re +28288|70|46|2|46|44623.22|0.07|0.05|N|O|1996-03-18|1996-05-05|1996-04-08|TAKE BACK RETURN|RAIL|s the accounts. furiously e +28288|1575|96|3|15|22148.55|0.03|0.00|N|O|1996-05-12|1996-06-06|1996-05-27|COLLECT COD|TRUCK|ins are slyly +28288|1286|24|4|34|40367.52|0.10|0.02|N|O|1996-03-21|1996-06-08|1996-03-24|TAKE BACK RETURN|RAIL|refully pending accounts boost +28289|1102|75|1|1|1003.10|0.07|0.04|A|F|1993-02-16|1993-03-07|1993-02-27|DELIVER IN PERSON|REG AIR|ggle among t +28289|1211|49|2|16|17795.36|0.04|0.08|R|F|1993-04-24|1993-03-09|1993-05-06|TAKE BACK RETURN|TRUCK|ending dependencies c +28290|1352|53|1|41|51387.35|0.06|0.02|R|F|1994-01-14|1994-02-12|1994-02-13|TAKE BACK RETURN|RAIL|ests. slyly r +28290|996|65|2|23|43630.77|0.02|0.07|R|F|1994-04-30|1994-02-23|1994-05-28|NONE|AIR| the slyly ironic de +28290|1614|56|3|16|24249.76|0.09|0.02|A|F|1994-02-20|1994-04-02|1994-03-13|NONE|REG AIR|ix furiously about the blithely even +28290|1496|97|4|33|46117.17|0.04|0.02|R|F|1994-04-12|1994-03-18|1994-04-29|NONE|TRUCK|fully pending deposits cajole blit +28290|1681|64|5|12|18992.16|0.05|0.03|A|F|1994-01-15|1994-03-19|1994-02-01|COLLECT COD|AIR| express excuses? slyly iron +28290|564|55|6|32|46865.92|0.05|0.00|A|F|1994-01-27|1994-02-19|1994-02-25|COLLECT COD|SHIP|accounts wake against the fluffily express +28290|177|56|7|40|43086.80|0.01|0.00|R|F|1994-03-10|1994-03-06|1994-03-24|COLLECT COD|AIR|pending idea +28291|218|46|1|39|43610.19|0.08|0.01|R|F|1994-07-03|1994-05-08|1994-07-17|TAKE BACK RETURN|TRUCK|dolites maintain. regular foxes integra +28291|1338|77|2|16|19829.28|0.07|0.02|R|F|1994-04-01|1994-05-22|1994-05-01|NONE|TRUCK|l, ironic frays. carefully u +28292|1679|3|1|5|7903.35|0.00|0.02|R|F|1993-06-17|1993-03-30|1993-07-04|NONE|SHIP|ounts: quickly regular acc +28293|705|2|1|41|65833.70|0.01|0.03|N|O|1998-01-31|1997-11-23|1998-02-10|COLLECT COD|AIR|usly even +28293|253|81|2|7|8072.75|0.01|0.00|N|O|1998-01-09|1997-12-20|1998-01-31|NONE|MAIL|uests haggle carefully. quickly even depo +28293|330|87|3|29|35679.57|0.06|0.00|N|O|1997-11-07|1997-12-31|1997-11-23|NONE|RAIL|gle furiously. regular, unus +28293|1981|82|4|50|94149.00|0.04|0.07|N|O|1997-10-26|1997-12-15|1997-11-22|DELIVER IN PERSON|FOB|ites integrate blithe +28294|1233|71|1|10|11342.30|0.06|0.08|R|F|1992-06-13|1992-07-17|1992-06-28|COLLECT COD|AIR|nally at the silently express accounts +28294|866|67|2|17|30036.62|0.06|0.08|A|F|1992-08-17|1992-07-19|1992-09-16|TAKE BACK RETURN|TRUCK|ar depths about the +28294|991|60|3|26|49191.74|0.07|0.04|R|F|1992-07-01|1992-06-28|1992-07-02|DELIVER IN PERSON|MAIL|onic senti +28294|517|48|4|31|43942.81|0.00|0.00|R|F|1992-09-10|1992-07-21|1992-09-11|COLLECT COD|REG AIR|s are carefully about the instruct +28295|1036|37|1|39|36544.17|0.09|0.03|N|O|1998-03-25|1998-02-09|1998-04-17|TAKE BACK RETURN|AIR|sts are carefully regular pint +28295|344|73|2|19|23642.46|0.05|0.05|N|O|1997-12-19|1998-03-03|1998-01-02|NONE|MAIL|es. regular foxes serve! fur +28295|1385|86|3|23|29586.74|0.01|0.01|N|O|1998-02-09|1998-01-26|1998-03-03|COLLECT COD|MAIL|its. blithely ironic requests c +28295|188|41|4|11|11969.98|0.07|0.02|N|O|1997-12-17|1998-02-27|1998-01-04|NONE|SHIP| ironic excuses boost slyly above the fina +28320|1072|78|1|21|20434.47|0.07|0.00|A|F|1993-01-19|1993-02-24|1993-01-22|TAKE BACK RETURN|SHIP| special asymptot +28320|1738|81|2|22|36074.06|0.02|0.07|A|F|1993-02-03|1993-03-06|1993-02-16|TAKE BACK RETURN|FOB|dencies. unusual deposits caj +28320|115|42|3|31|31468.41|0.08|0.07|A|F|1993-02-20|1993-03-21|1993-03-06|NONE|FOB|r deposits are ironically. furiousl +28321|1927|16|1|1|1828.92|0.07|0.06|R|F|1993-09-13|1993-09-10|1993-09-16|DELIVER IN PERSON|TRUCK| the carefully regul +28321|1093|29|2|14|13917.26|0.08|0.01|R|F|1993-09-11|1993-09-29|1993-09-17|NONE|MAIL|lithe excuses. even +28321|1986|87|3|17|32095.66|0.05|0.03|A|F|1993-11-12|1993-09-06|1993-11-21|NONE|AIR|theodolites lose blithely deposits. s +28321|1270|71|4|22|25767.94|0.03|0.06|R|F|1993-09-11|1993-09-15|1993-09-29|COLLECT COD|REG AIR|s solve carefully according t +28321|620|83|5|40|60824.80|0.06|0.03|A|F|1993-11-22|1993-10-04|1993-12-12|COLLECT COD|SHIP| ironic packages use slyly. +28321|1124|33|6|42|43055.04|0.02|0.08|R|F|1993-10-21|1993-09-10|1993-10-24|COLLECT COD|AIR|slyly ironic, final foxes. regular, iron +28321|1417|57|7|44|58010.04|0.07|0.02|A|F|1993-10-14|1993-10-03|1993-10-18|TAKE BACK RETURN|TRUCK|fully unusual deposits above the pending, +28322|754|19|1|50|82737.50|0.04|0.07|N|O|1996-03-20|1996-03-11|1996-04-01|NONE|AIR|lites doubt furiously acro +28322|786|87|2|6|10120.68|0.10|0.00|N|O|1995-12-21|1996-03-06|1995-12-27|TAKE BACK RETURN|AIR|l asymptotes sleep quickl +28322|506|7|3|16|22504.00|0.00|0.05|N|O|1996-03-27|1996-02-02|1996-04-19|TAKE BACK RETURN|FOB|he blithely regular +28322|1068|4|4|20|19381.20|0.01|0.07|N|O|1996-01-26|1996-03-08|1996-02-09|COLLECT COD|SHIP|ding to the daringl +28322|1835|79|5|28|48631.24|0.04|0.07|N|O|1996-02-08|1996-01-15|1996-02-17|NONE|SHIP|must have to thrash. +28322|505|96|6|44|61842.00|0.03|0.05|N|O|1996-02-26|1996-03-12|1996-03-12|DELIVER IN PERSON|TRUCK|hely. carefully final accoun +28323|153|80|1|30|31594.50|0.09|0.06|N|O|1996-05-26|1996-05-17|1996-06-20|NONE|AIR|re slyly within +28323|771|72|2|11|18389.47|0.02|0.06|N|O|1996-05-25|1996-05-28|1996-06-19|COLLECT COD|TRUCK|d pinto beans hag +28323|1132|33|3|42|43391.46|0.02|0.03|N|O|1996-06-07|1996-05-11|1996-06-29|DELIVER IN PERSON|MAIL|nic dependencie +28324|1965|10|1|38|70944.48|0.02|0.00|N|O|1995-11-16|1995-11-01|1995-11-22|NONE|AIR|s. slyly ir +28324|1566|67|2|5|7337.80|0.01|0.02|N|O|1995-11-23|1995-09-14|1995-12-21|TAKE BACK RETURN|RAIL|lent accounts integrate bl +28324|203|4|3|49|54056.80|0.00|0.02|N|O|1995-08-15|1995-09-09|1995-09-13|COLLECT COD|SHIP|olites cajole unu +28324|1145|46|4|14|14645.96|0.07|0.08|N|O|1995-10-05|1995-09-16|1995-10-19|NONE|RAIL|ronic packages run carefully furiou +28324|219|47|5|46|51483.66|0.03|0.05|N|O|1995-11-25|1995-11-05|1995-12-09|COLLECT COD|REG AIR|gular pinto beans haggle. ideas against +28324|1903|48|6|3|5414.70|0.07|0.02|N|O|1995-09-08|1995-09-23|1995-10-01|DELIVER IN PERSON|REG AIR|cial, bold foxe +28324|1693|76|7|28|44651.32|0.03|0.02|N|O|1995-12-01|1995-10-10|1995-12-26|NONE|MAIL| regular epitaphs run sl +28325|1422|40|1|30|39702.60|0.07|0.08|N|O|1996-10-01|1996-08-30|1996-10-18|NONE|RAIL| cajole slyly blithely express ideas. +28325|55|6|2|17|16235.85|0.09|0.07|N|O|1996-10-20|1996-08-30|1996-11-11|TAKE BACK RETURN|SHIP|lar dependencies. regular account +28325|1751|36|3|6|9916.50|0.07|0.07|N|O|1996-07-20|1996-10-02|1996-08-04|TAKE BACK RETURN|MAIL| instructions grow about +28325|644|38|4|28|43249.92|0.04|0.07|N|O|1996-08-10|1996-09-02|1996-09-02|TAKE BACK RETURN|AIR|ial packages nag permanently carefull +28326|501|32|1|3|4204.50|0.06|0.08|N|O|1998-10-14|1998-08-12|1998-10-24|DELIVER IN PERSON|FOB|tect fluffily after +28326|1005|6|2|42|38052.00|0.08|0.01|N|O|1998-10-10|1998-09-29|1998-10-24|COLLECT COD|REG AIR|ular foxes. furiously final accou +28326|272|73|3|36|42201.72|0.09|0.04|N|O|1998-09-22|1998-08-10|1998-09-23|TAKE BACK RETURN|SHIP|nts. slyly even deposits wake. furious +28326|836|70|4|40|69473.20|0.03|0.04|N|O|1998-08-19|1998-08-20|1998-08-30|NONE|MAIL|yly special instructions across t +28326|1931|20|5|25|45823.25|0.01|0.01|N|O|1998-08-24|1998-09-29|1998-09-11|NONE|AIR|p slyly blithely express deposits. +28326|1892|36|6|14|25114.46|0.08|0.06|N|O|1998-07-11|1998-10-02|1998-08-08|TAKE BACK RETURN|AIR|requests after the furiously even pinto be +28326|1369|70|7|29|36840.44|0.01|0.08|N|O|1998-10-26|1998-08-17|1998-11-25|NONE|FOB|uriously final dolphins. stealthy, final i +28327|739|40|1|2|3279.46|0.03|0.02|R|F|1994-09-10|1994-08-30|1994-10-03|COLLECT COD|RAIL|ogs cajole slyly packages. accounts h +28327|766|67|2|20|33335.20|0.09|0.00|R|F|1994-06-19|1994-08-02|1994-07-13|COLLECT COD|TRUCK|y bold requests cajole a +28327|1860|61|3|12|21142.32|0.02|0.07|R|F|1994-07-20|1994-08-31|1994-08-01|TAKE BACK RETURN|FOB|ic requests. +28327|1958|47|4|45|83697.75|0.06|0.04|A|F|1994-09-04|1994-09-08|1994-10-01|COLLECT COD|FOB|ickly even accounts wake quickl +28352|850|84|1|42|73535.70|0.02|0.08|N|O|1998-01-18|1998-03-18|1998-01-31|DELIVER IN PERSON|MAIL|inal instructions about +28352|1414|32|2|12|15784.92|0.09|0.04|N|O|1998-02-09|1998-03-07|1998-03-08|DELIVER IN PERSON|MAIL|ween the stealthy pi +28352|1762|89|3|45|74869.20|0.09|0.03|N|O|1998-01-25|1998-03-19|1998-02-24|COLLECT COD|AIR|tions. even id +28352|1538|19|4|26|37427.78|0.01|0.04|N|O|1998-03-30|1998-02-05|1998-04-27|COLLECT COD|MAIL| furiously final +28352|1023|24|5|19|17556.38|0.08|0.06|N|O|1998-01-11|1998-03-11|1998-01-28|DELIVER IN PERSON|RAIL|eas alongside of the ironic deposits haggl +28353|111|64|1|14|14155.54|0.10|0.08|R|F|1993-08-01|1993-06-28|1993-08-17|DELIVER IN PERSON|REG AIR|iously ironic packages haggle fur +28354|1896|83|1|24|43149.36|0.10|0.04|R|F|1994-06-03|1994-05-08|1994-06-05|COLLECT COD|SHIP| express instructions sleep. blithely regu +28354|1247|22|2|49|56263.76|0.07|0.04|R|F|1994-05-06|1994-05-27|1994-05-28|DELIVER IN PERSON|RAIL|ironic acco +28354|854|54|3|29|50890.65|0.04|0.01|R|F|1994-06-28|1994-05-27|1994-07-15|DELIVER IN PERSON|FOB| use. slyl +28354|424|54|4|42|55625.64|0.07|0.08|R|F|1994-04-22|1994-06-17|1994-04-28|COLLECT COD|REG AIR| beans are carefully after +28355|1405|45|1|12|15676.80|0.09|0.04|R|F|1993-11-09|1993-11-29|1993-11-15|NONE|RAIL|y final packages are fluffily across +28355|855|89|2|35|61454.75|0.08|0.08|R|F|1993-11-12|1993-12-21|1993-12-06|TAKE BACK RETURN|TRUCK|ymptotes th +28355|1695|37|3|41|65464.29|0.05|0.02|A|F|1993-11-11|1993-12-14|1993-11-16|COLLECT COD|AIR|inal instructions +28355|447|35|4|34|45812.96|0.10|0.02|R|F|1994-01-20|1993-11-13|1994-02-04|DELIVER IN PERSON|SHIP|ld instructions +28355|738|35|5|34|55716.82|0.07|0.03|A|F|1993-10-17|1993-12-31|1993-10-19|DELIVER IN PERSON|SHIP|to beans. even dep +28355|1297|9|6|43|51526.47|0.01|0.00|R|F|1994-01-21|1993-11-12|1994-02-20|TAKE BACK RETURN|MAIL|arefully regular multipliers! un +28355|715|80|7|14|22619.94|0.08|0.00|A|F|1993-12-16|1993-11-17|1993-12-17|NONE|FOB|s. fluffily final deposits are. bra +28356|994|95|1|4|7579.96|0.10|0.00|N|O|1997-11-29|1997-12-06|1997-12-02|COLLECT COD|REG AIR|ndencies boost c +28357|1333|34|1|41|50607.53|0.05|0.02|A|F|1993-06-25|1993-07-07|1993-07-23|DELIVER IN PERSON|FOB| final pin +28357|1959|48|2|9|16748.55|0.10|0.06|R|F|1993-06-05|1993-07-10|1993-06-23|COLLECT COD|AIR|nic dependencies. carefully ironi +28357|603|35|3|32|48115.20|0.05|0.07|A|F|1993-07-20|1993-07-08|1993-07-27|COLLECT COD|FOB|usly even, regular dependencies. bol +28357|1899|100|4|6|10805.34|0.07|0.00|R|F|1993-08-30|1993-07-22|1993-09-04|NONE|TRUCK| regular depo +28358|665|59|1|32|50101.12|0.02|0.04|R|F|1994-05-15|1994-06-08|1994-06-01|NONE|RAIL|r platelets across the silent, regular +28358|473|3|2|23|31589.81|0.00|0.04|A|F|1994-06-08|1994-06-28|1994-06-28|NONE|FOB|w foxes sn +28359|336|21|1|23|28435.59|0.02|0.06|N|O|1997-07-24|1997-08-01|1997-08-07|TAKE BACK RETURN|REG AIR|nusual grouches. final, sp +28359|240|95|2|9|10262.16|0.03|0.02|N|O|1997-07-02|1997-06-17|1997-07-18|TAKE BACK RETURN|REG AIR|tes doubt furiously among +28359|578|69|3|15|22178.55|0.05|0.02|N|O|1997-07-31|1997-07-22|1997-08-08|COLLECT COD|MAIL|ng theodolites slee +28359|330|15|4|17|20915.61|0.03|0.01|N|O|1997-06-03|1997-06-08|1997-06-14|NONE|SHIP|al packages-- carefully +28359|1447|65|5|17|22923.48|0.10|0.03|N|O|1997-05-14|1997-06-07|1997-06-05|TAKE BACK RETURN|TRUCK|usly above the asymptotes. slyly spec +28384|1448|49|1|38|51278.72|0.00|0.02|N|O|1997-04-11|1997-03-05|1997-05-05|NONE|AIR|ickly about the ca +28384|697|29|2|11|17574.59|0.09|0.07|N|O|1997-03-01|1997-03-07|1997-03-05|NONE|RAIL|kages nag idly above the slyly even p +28384|870|4|3|47|83230.89|0.05|0.04|N|O|1997-04-09|1997-04-04|1997-05-08|TAKE BACK RETURN|REG AIR|s. requests sleep +28384|535|26|4|7|10048.71|0.04|0.07|N|O|1997-01-07|1997-03-17|1997-01-18|TAKE BACK RETURN|FOB|nic accounts a +28385|1087|93|1|45|44463.60|0.02|0.08|A|F|1992-12-28|1992-12-03|1993-01-20|COLLECT COD|MAIL|ly regular accounts against the regular +28386|660|23|1|8|12485.28|0.06|0.06|N|O|1998-04-21|1998-04-16|1998-04-25|COLLECT COD|TRUCK|e according to the bold, enticing s +28386|1056|57|2|15|14355.75|0.08|0.01|N|O|1998-03-27|1998-05-02|1998-04-24|NONE|FOB|equests. bl +28386|1749|76|3|43|70981.82|0.03|0.08|N|O|1998-06-08|1998-03-29|1998-06-20|COLLECT COD|SHIP| ironic foxes. slyly b +28386|574|5|4|42|61931.94|0.03|0.06|N|O|1998-05-31|1998-03-30|1998-06-08|NONE|FOB|ructions. +28386|1411|51|5|43|56433.63|0.01|0.08|N|O|1998-03-27|1998-03-26|1998-04-25|TAKE BACK RETURN|FOB|final theo +28386|1069|40|6|18|17461.08|0.04|0.05|N|O|1998-04-10|1998-05-01|1998-04-15|DELIVER IN PERSON|TRUCK|accounts. express, enticing orbits wake +28387|185|38|1|9|9766.62|0.01|0.03|A|F|1992-07-02|1992-08-24|1992-07-05|NONE|SHIP|fully. carefully final packa +28387|97|48|2|16|15953.44|0.05|0.03|R|F|1992-07-16|1992-09-22|1992-08-03|NONE|RAIL|ly special +28387|1515|96|3|27|38245.77|0.09|0.08|R|F|1992-10-20|1992-09-10|1992-10-26|DELIVER IN PERSON|FOB|fter the accou +28387|1918|51|4|27|49137.57|0.07|0.01|A|F|1992-10-12|1992-09-06|1992-11-10|TAKE BACK RETURN|MAIL| beans across the slyly pend +28387|1449|28|5|23|31060.12|0.00|0.00|R|F|1992-08-23|1992-08-19|1992-08-29|NONE|FOB|uffily special foxes cajole carefu +28387|620|83|6|36|54742.32|0.01|0.03|R|F|1992-08-09|1992-08-03|1992-08-21|COLLECT COD|FOB|he even accounts. quickly regular d +28387|829|63|7|31|53624.42|0.01|0.04|A|F|1992-08-30|1992-09-10|1992-09-03|NONE|RAIL|eep slyly expres +28388|1758|85|1|24|39834.00|0.02|0.02|R|F|1994-03-19|1994-03-05|1994-04-03|TAKE BACK RETURN|RAIL| packages cajole furiously around th +28388|1989|34|2|45|85094.10|0.10|0.00|R|F|1993-12-22|1994-01-28|1993-12-30|TAKE BACK RETURN|SHIP|as. bold theodolites h +28388|263|91|3|29|33734.54|0.05|0.06|R|F|1993-12-31|1994-03-08|1994-01-23|NONE|MAIL|l accounts are carefull +28389|633|27|1|45|69013.35|0.10|0.05|A|F|1994-11-10|1994-12-23|1994-11-30|COLLECT COD|FOB| tithes run quickly +28389|1578|99|2|12|17754.84|0.04|0.03|R|F|1995-02-10|1995-01-26|1995-02-26|NONE|SHIP|ng packages. +28389|578|69|3|34|50271.38|0.04|0.02|R|F|1994-12-25|1995-01-10|1995-01-02|TAKE BACK RETURN|RAIL|s cajole boldly even, unusual foxes. slyl +28389|329|58|4|48|59007.36|0.10|0.07|R|F|1994-11-26|1995-01-03|1994-12-19|COLLECT COD|RAIL|hins. careful request +28389|1361|100|5|32|40395.52|0.01|0.01|A|F|1995-02-12|1995-01-08|1995-02-13|TAKE BACK RETURN|MAIL|ssly about the slyly final packages. slyl +28390|31|57|1|21|19551.63|0.07|0.01|A|F|1992-02-27|1992-03-19|1992-02-29|NONE|TRUCK|onic requests sleep finally +28390|345|74|2|13|16189.42|0.06|0.07|R|F|1992-04-02|1992-04-22|1992-04-04|TAKE BACK RETURN|SHIP|he carefull +28390|1421|39|3|25|33060.50|0.01|0.08|R|F|1992-02-15|1992-04-14|1992-02-17|TAKE BACK RETURN|SHIP|ep ironic pack +28390|1268|43|4|36|42093.36|0.01|0.08|R|F|1992-04-10|1992-03-11|1992-04-17|DELIVER IN PERSON|MAIL|platelets across the pending +28390|1861|62|5|12|21154.32|0.08|0.02|A|F|1992-02-21|1992-04-12|1992-03-15|NONE|REG AIR|uickly packages. iron +28390|1173|74|6|1|1074.17|0.01|0.07|A|F|1992-03-09|1992-03-28|1992-04-07|DELIVER IN PERSON|RAIL|d, express ideas nag carefu +28391|1163|72|1|36|38309.76|0.10|0.02|N|O|1998-02-09|1998-01-30|1998-02-26|DELIVER IN PERSON|TRUCK|requests. e +28391|1271|72|2|48|56268.96|0.05|0.02|N|O|1998-01-30|1998-03-13|1998-02-07|TAKE BACK RETURN|TRUCK|ges. final acco +28391|25|26|3|12|11100.24|0.06|0.04|N|O|1998-01-12|1998-03-16|1998-01-30|COLLECT COD|AIR|ic ideas. blithely even ideas wak +28391|1805|6|4|39|66565.20|0.07|0.07|N|O|1998-03-09|1998-02-26|1998-04-08|COLLECT COD|RAIL| slyly blithely ironic forges. s +28416|193|20|1|36|39354.84|0.10|0.07|N|O|1997-03-01|1997-01-30|1997-03-06|TAKE BACK RETURN|SHIP|cajole quick +28416|509|70|2|33|46513.50|0.01|0.05|N|O|1997-01-03|1997-01-20|1997-01-08|TAKE BACK RETURN|FOB|efully. dolphins use f +28416|1761|62|3|16|26604.16|0.04|0.08|N|O|1996-12-11|1997-01-12|1996-12-18|COLLECT COD|FOB|ans poach at the furiously sil +28416|418|19|4|39|51417.99|0.00|0.03|N|O|1996-12-10|1996-12-14|1997-01-02|DELIVER IN PERSON|RAIL|final, even th +28416|1899|100|5|12|21610.68|0.08|0.05|N|O|1997-03-02|1997-01-14|1997-03-27|TAKE BACK RETURN|FOB|blithely regular platelets. qu +28416|1005|6|6|29|26274.00|0.02|0.01|N|O|1997-02-22|1997-01-30|1997-03-08|NONE|RAIL| slyly even requests. qu +28417|1221|96|1|10|11222.20|0.03|0.02|N|O|1998-05-13|1998-04-15|1998-05-24|TAKE BACK RETURN|MAIL|to the blithely i +28417|1628|52|2|35|53536.70|0.03|0.08|N|O|1998-01-31|1998-04-23|1998-02-21|COLLECT COD|RAIL|nal instruc +28417|567|98|3|44|64572.64|0.07|0.08|N|O|1998-04-29|1998-03-16|1998-05-20|NONE|RAIL|he blithely regular accounts. darin +28417|245|73|4|29|33211.96|0.10|0.05|N|O|1998-04-03|1998-03-28|1998-04-16|COLLECT COD|MAIL|sits haggle. furiously final pinto beans +28417|1062|98|5|31|29854.86|0.01|0.03|N|O|1998-02-07|1998-03-27|1998-03-03|DELIVER IN PERSON|AIR|se against the pending packag +28417|1130|39|6|10|10311.30|0.05|0.02|N|O|1998-02-11|1998-03-10|1998-03-03|TAKE BACK RETURN|FOB|play fluffily-- even deposits wake sly +28417|223|51|7|5|5616.10|0.00|0.07|N|O|1998-04-18|1998-03-30|1998-05-09|COLLECT COD|TRUCK|slyly pending +28418|1437|55|1|47|62906.21|0.08|0.08|A|F|1992-06-04|1992-07-25|1992-06-19|NONE|MAIL|against the ruthlessly e +28419|539|30|1|31|44625.43|0.01|0.00|A|F|1995-02-07|1994-12-31|1995-02-17|COLLECT COD|REG AIR|odolites haggle alongside of th +28420|1478|57|1|3|4138.41|0.00|0.03|A|F|1995-01-19|1994-11-08|1995-02-18|COLLECT COD|REG AIR|o beans. final, express a +28420|1843|73|2|5|8724.20|0.10|0.08|A|F|1994-10-18|1994-12-09|1994-11-05|TAKE BACK RETURN|AIR|final request +28421|957|60|1|34|63170.30|0.01|0.00|N|O|1998-03-25|1998-05-16|1998-04-06|COLLECT COD|RAIL|yly silent, regular theodolites. re +28422|397|98|1|20|25947.80|0.08|0.07|N|O|1997-12-15|1998-01-13|1997-12-22|NONE|MAIL|uriously regular theodolit +28423|1182|83|1|37|40077.66|0.01|0.01|N|O|1997-01-05|1996-12-08|1997-01-24|DELIVER IN PERSON|SHIP| bravely thin instructions cajo +28423|324|9|2|29|35505.28|0.07|0.00|N|O|1996-12-25|1996-10-20|1997-01-01|DELIVER IN PERSON|MAIL|ithely express multiplie +28448|831|98|1|20|34636.60|0.09|0.03|N|O|1995-10-23|1995-11-09|1995-10-29|DELIVER IN PERSON|TRUCK|rding to the +28448|363|20|2|44|55587.84|0.01|0.07|N|O|1995-12-21|1995-10-20|1996-01-12|TAKE BACK RETURN|REG AIR|ely fluffily quick requests. express acco +28449|252|7|1|23|26501.75|0.09|0.00|N|O|1998-07-07|1998-05-03|1998-07-26|TAKE BACK RETURN|MAIL|ourts boost? carefully silent de +28450|445|33|1|33|44399.52|0.08|0.03|N|O|1998-05-07|1998-06-01|1998-05-13|TAKE BACK RETURN|MAIL|s sleep furiousl +28450|461|20|2|18|24506.28|0.05|0.08|N|O|1998-08-14|1998-07-10|1998-08-22|NONE|REG AIR|hely express instructions wake blit +28451|1070|76|1|4|3884.28|0.07|0.06|R|F|1994-03-16|1994-04-05|1994-04-15|COLLECT COD|SHIP|s cajole carefully even, eve +28451|1291|29|2|11|13115.19|0.06|0.00|R|F|1994-05-03|1994-03-30|1994-05-24|COLLECT COD|SHIP|engage quickly aroun +28451|1269|7|3|46|53831.96|0.04|0.02|R|F|1994-02-26|1994-03-17|1994-03-26|TAKE BACK RETURN|RAIL|ckly even excuses. excuses along the expr +28451|1407|47|4|36|47102.40|0.04|0.07|R|F|1994-03-26|1994-02-12|1994-04-04|NONE|AIR|jole slyly pinto beans? care +28451|507|38|5|11|15482.50|0.10|0.03|R|F|1994-04-24|1994-03-08|1994-05-13|TAKE BACK RETURN|REG AIR| slyly final dependencies alo +28451|63|14|6|45|43337.70|0.10|0.01|R|F|1994-05-03|1994-03-09|1994-05-26|DELIVER IN PERSON|AIR|ecial deposits wake permanently e +28451|909|10|7|49|88685.10|0.04|0.03|R|F|1994-02-10|1994-02-27|1994-03-11|TAKE BACK RETURN|TRUCK|ular accounts. slyly regular packages +28452|514|15|1|7|9901.57|0.05|0.00|N|O|1997-03-20|1997-05-23|1997-03-21|DELIVER IN PERSON|TRUCK| theodolites haggl +28453|499|100|1|19|26590.31|0.01|0.02|R|F|1993-02-13|1993-02-02|1993-03-02|NONE|FOB|tes engage car +28454|591|92|1|3|4474.77|0.05|0.07|R|F|1992-11-14|1992-10-16|1992-11-25|NONE|AIR|accounts are quickly above th +28454|1791|18|2|42|71097.18|0.04|0.05|R|F|1992-09-17|1992-10-04|1992-10-02|NONE|AIR|odolites above the even theodoli +28454|1924|25|3|24|43822.08|0.07|0.03|A|F|1992-08-30|1992-09-12|1992-09-03|NONE|REG AIR|slyly busy asymptotes; regular pinto beans +28454|1585|86|4|45|66896.10|0.02|0.03|R|F|1992-10-20|1992-09-27|1992-10-21|NONE|MAIL| dolphins alon +28455|738|3|1|23|37690.79|0.06|0.04|A|F|1993-06-28|1993-08-06|1993-07-12|DELIVER IN PERSON|RAIL|e quickly ironic packages. slyly ironic r +28455|1265|3|2|37|43151.62|0.08|0.01|R|F|1993-08-24|1993-08-13|1993-09-16|TAKE BACK RETURN|RAIL| requests s +28455|338|23|3|40|49533.20|0.09|0.06|A|F|1993-08-24|1993-07-22|1993-08-28|COLLECT COD|FOB|sts cajole fu +28480|865|66|1|12|21190.32|0.01|0.03|A|F|1994-06-15|1994-05-28|1994-06-22|DELIVER IN PERSON|MAIL|thely ironic dolphins. even acco +28480|883|84|2|14|24974.32|0.00|0.05|R|F|1994-04-14|1994-05-04|1994-05-10|COLLECT COD|TRUCK|ies thrash. unusual accounts are car +28481|795|96|1|48|81397.92|0.06|0.01|R|F|1994-02-22|1994-03-19|1994-03-05|TAKE BACK RETURN|TRUCK|pending, expr +28481|1050|51|2|11|10461.55|0.07|0.08|A|F|1994-05-11|1994-03-16|1994-05-31|NONE|TRUCK|rding to the deposits. blithely special +28482|1152|53|1|43|45285.45|0.08|0.06|A|F|1993-03-21|1993-05-20|1993-04-19|DELIVER IN PERSON|SHIP|ing packages. even, fin +28482|411|12|2|28|36719.48|0.10|0.01|R|F|1993-06-05|1993-05-12|1993-06-22|TAKE BACK RETURN|TRUCK|s wake after the bold deposits +28483|1493|94|1|48|66935.52|0.03|0.04|N|O|1997-04-22|1997-05-15|1997-05-22|TAKE BACK RETURN|REG AIR|rts haggle slyly +28483|716|17|2|13|21017.23|0.08|0.07|N|O|1997-04-10|1997-04-07|1997-05-08|TAKE BACK RETURN|FOB|deposits. requests amon +28483|167|68|3|48|51223.68|0.03|0.08|N|O|1997-05-24|1997-05-21|1997-06-02|TAKE BACK RETURN|AIR|yly final accounts. slyly regul +28483|493|52|4|26|36230.74|0.06|0.01|N|O|1997-03-27|1997-06-01|1997-04-23|COLLECT COD|SHIP|ests. quiet asymptotes sleep furiously +28484|1524|45|1|48|68424.96|0.04|0.02|N|O|1998-08-29|1998-10-28|1998-09-27|TAKE BACK RETURN|FOB|ons. slyly final +28484|941|42|2|43|79203.42|0.10|0.00|N|O|1998-08-28|1998-09-10|1998-09-17|TAKE BACK RETURN|FOB|y regular d +28485|323|8|1|26|31806.32|0.10|0.07|A|F|1992-04-29|1992-02-20|1992-05-15|NONE|AIR|requests above the silently +28485|267|95|2|25|29181.50|0.06|0.05|R|F|1992-05-04|1992-03-08|1992-05-21|DELIVER IN PERSON|REG AIR|ckages nag blithely across the quickly i +28485|1358|73|3|2|2518.70|0.05|0.06|R|F|1992-03-14|1992-03-09|1992-03-29|DELIVER IN PERSON|MAIL| accounts. pending +28485|964|67|4|40|74598.40|0.02|0.05|R|F|1992-02-10|1992-02-15|1992-03-02|NONE|TRUCK|ress deposits. courts are quic +28485|1792|93|5|24|40650.96|0.07|0.06|R|F|1992-02-23|1992-02-26|1992-03-08|DELIVER IN PERSON|MAIL|n theodolites: unusual, final esca +28485|1053|54|6|31|29575.55|0.05|0.05|R|F|1992-03-26|1992-03-27|1992-04-12|NONE|RAIL|y blithely express p +28485|1283|84|7|21|24869.88|0.05|0.03|R|F|1992-05-03|1992-02-14|1992-06-02|NONE|FOB|. blithely regular t +28486|1065|66|1|26|25117.56|0.08|0.02|A|F|1994-10-30|1994-11-15|1994-11-18|NONE|AIR|l packages must have to wake carefully +28486|938|39|2|12|22067.16|0.00|0.07|A|F|1994-12-15|1994-10-20|1994-12-29|COLLECT COD|REG AIR|. quickly silent +28486|1131|4|3|26|26835.38|0.07|0.07|A|F|1994-12-23|1994-10-06|1994-12-27|COLLECT COD|SHIP|al, pending ideas s +28486|741|42|4|43|70594.82|0.03|0.01|A|F|1994-08-30|1994-11-17|1994-08-31|NONE|REG AIR|ong the furio +28486|1213|25|5|42|46796.82|0.06|0.05|R|F|1994-11-21|1994-10-06|1994-12-01|COLLECT COD|TRUCK| beans haggle alongside of the carefull +28486|1723|8|6|8|12997.76|0.08|0.06|R|F|1994-11-03|1994-11-05|1994-11-08|TAKE BACK RETURN|REG AIR|rding to the pac +28487|103|56|1|49|49151.90|0.02|0.03|N|O|1997-10-03|1997-10-16|1997-10-16|DELIVER IN PERSON|TRUCK|ven accounts. slow instructions ha +28512|1725|26|1|50|81336.00|0.03|0.04|R|F|1993-07-21|1993-06-01|1993-08-14|COLLECT COD|FOB|final packages acros +28512|37|13|2|31|29047.93|0.02|0.08|R|F|1993-07-02|1993-07-20|1993-07-31|TAKE BACK RETURN|AIR|lites are ato +28512|936|5|3|11|20206.23|0.02|0.08|R|F|1993-07-24|1993-07-04|1993-08-02|COLLECT COD|FOB|nes are. requests wake carefully. stealthil +28512|1525|26|4|11|15691.72|0.08|0.05|R|F|1993-05-28|1993-07-04|1993-06-05|COLLECT COD|SHIP|ular deposits ha +28512|1187|24|5|37|40262.66|0.01|0.01|R|F|1993-08-27|1993-06-25|1993-09-13|COLLECT COD|FOB|uctions. blithely even deposits ar +28512|291|46|6|48|57181.92|0.09|0.08|R|F|1993-07-27|1993-06-15|1993-08-13|DELIVER IN PERSON|AIR|al pinto beans. furiously +28512|1097|68|7|23|22956.07|0.10|0.03|R|F|1993-05-19|1993-06-30|1993-05-30|NONE|AIR|deas cajole about the silent i +28513|492|22|1|24|33419.76|0.05|0.06|N|O|1998-01-15|1997-12-19|1998-02-11|NONE|AIR|ing sauternes after the slyly regular f +28513|855|89|2|2|3511.70|0.08|0.01|N|O|1997-12-08|1997-12-06|1997-12-19|DELIVER IN PERSON|RAIL|ffix carefully regular requests. ir +28513|747|44|3|3|4943.22|0.00|0.05|N|O|1997-11-06|1997-11-20|1997-12-02|COLLECT COD|AIR| ironic deposits. slyly +28513|482|83|4|41|56681.68|0.10|0.03|N|O|1997-11-10|1997-10-25|1997-11-18|NONE|SHIP|s sleep. ev +28513|1157|94|5|19|20104.85|0.07|0.06|N|O|1997-10-09|1997-10-31|1997-10-30|DELIVER IN PERSON|SHIP|ronic excuses. regular requests +28513|1112|49|6|46|46603.06|0.06|0.06|N|O|1998-01-04|1997-10-29|1998-02-02|NONE|RAIL|hely final foxe +28513|1913|46|7|33|59892.03|0.01|0.01|N|O|1997-12-16|1997-11-21|1998-01-07|NONE|TRUCK|p against the furiously special theodolit +28514|1795|22|1|24|40722.96|0.05|0.01|N|O|1998-08-03|1998-07-12|1998-08-05|DELIVER IN PERSON|RAIL|lly against the carefully unusual platele +28514|1774|1|2|31|51948.87|0.10|0.05|N|O|1998-09-04|1998-08-05|1998-10-03|DELIVER IN PERSON|RAIL|are across the furiou +28514|173|26|3|48|51512.16|0.00|0.03|N|O|1998-06-29|1998-08-17|1998-07-08|DELIVER IN PERSON|SHIP|ress requests. carefully specia +28514|1145|46|4|19|19876.66|0.04|0.01|N|O|1998-06-09|1998-08-21|1998-06-17|DELIVER IN PERSON|SHIP|dependencies. car +28514|607|8|5|21|31659.60|0.04|0.03|N|O|1998-09-24|1998-07-29|1998-09-28|NONE|MAIL|fully bold +28514|1750|77|6|30|49552.50|0.01|0.04|N|O|1998-07-27|1998-07-24|1998-08-14|NONE|SHIP|even requests poach carefull +28514|109|62|7|13|13118.30|0.00|0.02|N|O|1998-06-24|1998-08-23|1998-07-20|COLLECT COD|AIR|y unusual instruc +28515|668|31|1|28|43922.48|0.03|0.01|A|F|1993-08-09|1993-08-26|1993-08-29|DELIVER IN PERSON|TRUCK|ongside of the n +28515|659|22|2|6|9357.90|0.07|0.02|A|F|1993-08-29|1993-08-04|1993-09-16|NONE|SHIP|es sleep along the ironic instructions +28515|538|39|3|14|20139.42|0.02|0.07|A|F|1993-09-04|1993-08-29|1993-09-11|COLLECT COD|SHIP|ly pending requests are carefully regul +28515|394|23|4|43|55658.77|0.06|0.02|R|F|1993-08-23|1993-08-31|1993-09-01|NONE|MAIL| packages are fluffily among +28515|899|33|5|39|70195.71|0.06|0.02|A|F|1993-07-09|1993-09-02|1993-08-02|NONE|MAIL|carefully. quiet waters grow carefully quic +28515|1849|50|6|16|28013.44|0.08|0.08|R|F|1993-10-15|1993-08-23|1993-11-12|COLLECT COD|AIR|ong the bold dep +28516|743|40|1|46|75612.04|0.09|0.00|R|F|1992-08-21|1992-09-12|1992-09-17|DELIVER IN PERSON|TRUCK|ironic, ironic tithes use acc +28516|1621|4|2|15|22839.30|0.07|0.05|R|F|1992-11-12|1992-10-17|1992-12-11|DELIVER IN PERSON|FOB|nts sleep c +28517|1067|38|1|3|2904.18|0.06|0.02|N|O|1996-08-10|1996-08-28|1996-08-30|DELIVER IN PERSON|RAIL|ng the thinly ironic packages; slyly i +28518|1394|9|1|1|1295.39|0.03|0.03|N|O|1995-09-29|1995-08-03|1995-10-28|COLLECT COD|TRUCK|oss the final deposits. bold +28518|624|87|2|45|68607.90|0.04|0.04|N|O|1995-09-21|1995-09-13|1995-10-13|TAKE BACK RETURN|RAIL|ns haggle. sly, +28519|559|90|1|14|20433.70|0.08|0.01|A|F|1993-09-17|1993-07-23|1993-10-15|COLLECT COD|AIR|ily even requests. accounts thrash +28519|1146|55|2|35|36649.90|0.02|0.06|A|F|1993-07-13|1993-08-20|1993-07-27|NONE|REG AIR|uring the fin +28519|1855|56|3|35|61489.75|0.06|0.03|A|F|1993-06-29|1993-08-24|1993-07-28|NONE|TRUCK| ironic excuses. thin +28519|797|62|4|32|54329.28|0.04|0.03|A|F|1993-08-05|1993-09-02|1993-08-27|DELIVER IN PERSON|REG AIR|lithely furiously even acc +28519|375|4|5|8|10202.96|0.07|0.06|R|F|1993-09-25|1993-09-07|1993-10-15|NONE|MAIL|busy accounts. slowly pending p +28519|1821|51|6|9|15505.38|0.08|0.08|A|F|1993-08-26|1993-09-03|1993-09-09|NONE|FOB|thely regular requests sl +28544|15|66|1|1|915.01|0.09|0.06|A|F|1992-12-01|1992-10-11|1992-12-25|NONE|FOB|lithely. ideas x-ray bli +28544|788|53|2|23|38841.94|0.07|0.04|A|F|1992-12-20|1992-10-09|1992-12-23|DELIVER IN PERSON|AIR|old packages above the pinto beans wake +28544|1784|27|3|38|64059.64|0.09|0.06|R|F|1992-11-17|1992-11-01|1992-12-05|TAKE BACK RETURN|RAIL|gular excuses are +28545|1567|8|1|30|44056.80|0.08|0.08|N|O|1995-11-11|1995-11-05|1995-11-26|NONE|SHIP|y silent requests above the special i +28545|735|68|2|14|22900.22|0.04|0.00|N|O|1995-10-14|1995-11-06|1995-10-29|COLLECT COD|TRUCK|sts affix care +28545|1721|64|3|36|58417.92|0.08|0.06|N|O|1995-11-29|1995-11-21|1995-12-11|COLLECT COD|RAIL|riously fin +28545|1648|49|4|5|7748.20|0.08|0.02|N|O|1995-10-19|1995-10-03|1995-10-24|NONE|FOB|hins nag. carefully silent accounts +28546|216|98|1|11|12278.31|0.02|0.04|R|F|1992-10-29|1992-12-07|1992-11-22|DELIVER IN PERSON|AIR|sits. caref +28546|1684|67|2|35|55498.80|0.09|0.05|A|F|1993-01-04|1992-12-23|1993-01-17|DELIVER IN PERSON|REG AIR|s integrate according to the +28546|135|62|3|6|6210.78|0.00|0.07|R|F|1992-09-27|1992-12-11|1992-10-21|COLLECT COD|MAIL|inal packages above the carefully care +28546|1614|38|4|8|12124.88|0.02|0.07|R|F|1992-10-27|1992-12-10|1992-11-26|NONE|REG AIR|instructions. daringly pending de +28546|1679|3|5|3|4742.01|0.09|0.01|R|F|1993-01-14|1992-10-31|1993-01-18|NONE|FOB| final requ +28546|1269|81|6|24|28086.24|0.00|0.06|A|F|1992-11-18|1992-11-15|1992-12-08|NONE|AIR|le carefully ab +28546|1970|59|7|17|31823.49|0.06|0.01|R|F|1992-10-27|1992-11-29|1992-11-20|NONE|REG AIR|ular requests are +28547|293|94|1|37|44151.73|0.07|0.02|N|O|1997-02-15|1997-02-14|1997-03-04|NONE|RAIL|nding instructions integrate +28547|1515|36|2|11|15581.61|0.10|0.07|N|O|1997-01-21|1997-02-14|1997-02-13|NONE|REG AIR|rts sleep unusual packages. d +28548|219|74|1|21|23503.41|0.08|0.05|N|O|1998-04-07|1998-03-01|1998-04-27|TAKE BACK RETURN|MAIL|ar accounts nag quickly. fl +28548|1312|27|2|14|16986.34|0.07|0.04|N|O|1998-05-12|1998-04-04|1998-06-01|DELIVER IN PERSON|REG AIR|ole carefully according to the fluffily iro +28548|254|9|3|4|4617.00|0.10|0.02|N|O|1998-03-25|1998-02-24|1998-04-21|COLLECT COD|TRUCK| bold excuses! permane +28548|351|80|4|18|22524.30|0.00|0.00|N|O|1998-04-01|1998-04-02|1998-04-16|COLLECT COD|SHIP|odolites was carefully regular excu +28548|898|65|5|47|84547.83|0.05|0.05|N|O|1998-05-13|1998-04-06|1998-05-24|NONE|RAIL|ithely even courts. quickly bus +28548|1611|94|6|43|65042.23|0.09|0.03|N|O|1998-01-24|1998-03-01|1998-02-01|COLLECT COD|MAIL|l ideas doze quickly ac +28549|220|75|1|7|7841.54|0.08|0.03|N|O|1997-09-15|1997-08-16|1997-10-01|NONE|FOB| cajole quietly +28549|872|6|2|14|24820.18|0.03|0.03|N|O|1997-08-17|1997-08-22|1997-08-24|TAKE BACK RETURN|SHIP|press cour +28549|27|53|3|43|39861.86|0.09|0.04|N|O|1997-09-23|1997-09-11|1997-09-24|NONE|MAIL| doze quickly among +28549|1279|80|4|28|33047.56|0.01|0.04|N|O|1997-09-25|1997-08-19|1997-10-09|DELIVER IN PERSON|TRUCK| are according to the carefully iro +28549|1148|57|5|25|26228.50|0.02|0.05|N|O|1997-10-22|1997-08-09|1997-10-27|DELIVER IN PERSON|SHIP| quickly even th +28549|871|71|6|25|44296.75|0.06|0.00|N|O|1997-10-17|1997-10-01|1997-10-18|NONE|MAIL|equests cajole furiously across the flu +28550|1640|64|1|26|40082.64|0.02|0.03|A|F|1995-05-16|1995-05-22|1995-06-09|DELIVER IN PERSON|TRUCK| slyly unusual requests are eve +28550|1937|26|2|35|64362.55|0.02|0.05|R|F|1995-04-21|1995-06-10|1995-04-30|NONE|TRUCK| carefully +28550|440|70|3|27|36191.88|0.08|0.05|N|O|1995-06-26|1995-05-21|1995-07-25|COLLECT COD|AIR|sly express packages wake. +28550|512|13|4|21|29662.71|0.05|0.04|N|O|1995-07-18|1995-06-04|1995-07-26|COLLECT COD|TRUCK|hes affix carefully according to the slyl +28550|985|54|5|39|73553.22|0.05|0.02|R|F|1995-05-13|1995-06-05|1995-05-15|DELIVER IN PERSON|FOB|ng ideas. ironic requests boost +28550|795|92|6|27|45786.33|0.00|0.04|A|F|1995-04-08|1995-05-04|1995-04-13|NONE|FOB| ironic instructions. iron +28551|723|88|1|30|48711.60|0.06|0.05|N|O|1998-02-04|1998-01-11|1998-02-05|DELIVER IN PERSON|TRUCK| across the blithely bold platelets. caref +28551|350|7|2|37|46262.95|0.07|0.00|N|O|1998-01-04|1998-01-09|1998-01-30|TAKE BACK RETURN|FOB| sleep according to the furious +28551|1018|19|3|36|33084.36|0.08|0.08|N|O|1997-12-07|1998-01-10|1997-12-08|TAKE BACK RETURN|AIR|riously even theodolites. u +28551|573|4|4|26|38312.82|0.00|0.03|N|O|1998-02-13|1998-02-20|1998-03-12|TAKE BACK RETURN|MAIL| silent instructions. c +28551|1043|44|5|41|38705.64|0.07|0.00|N|O|1998-03-31|1998-02-11|1998-04-16|TAKE BACK RETURN|SHIP| haggle furiously blithely +28551|1053|89|6|47|44840.35|0.04|0.06|N|O|1998-03-07|1998-01-02|1998-03-24|TAKE BACK RETURN|AIR|nic requests. furiously final frays us +28551|293|94|7|29|34605.41|0.03|0.03|N|O|1997-12-07|1998-01-20|1997-12-24|COLLECT COD|REG AIR|nts. furiously slow p +28576|1085|21|1|5|4930.40|0.09|0.07|N|O|1998-04-21|1998-06-22|1998-04-26|DELIVER IN PERSON|TRUCK|ove the pe +28576|1774|59|2|7|11730.39|0.01|0.04|N|O|1998-05-22|1998-06-28|1998-06-03|DELIVER IN PERSON|TRUCK|accounts caj +28576|1351|28|3|4|5009.40|0.05|0.07|N|O|1998-07-09|1998-06-19|1998-07-20|NONE|REG AIR|to beans. regular packages s +28576|213|68|4|39|43415.19|0.05|0.02|N|O|1998-06-30|1998-06-21|1998-07-10|COLLECT COD|REG AIR|lets was carefully regular +28576|1439|18|5|36|48255.48|0.07|0.07|N|O|1998-05-24|1998-05-23|1998-06-18|NONE|FOB|, regular +28576|86|62|6|12|11832.96|0.00|0.06|N|O|1998-06-01|1998-06-08|1998-06-21|TAKE BACK RETURN|SHIP|ke carefully after the silent, regular +28577|566|57|1|3|4399.68|0.02|0.04|N|O|1996-07-03|1996-05-12|1996-07-08|DELIVER IN PERSON|SHIP|e slyly accord +28577|93|69|2|33|32771.97|0.01|0.03|N|O|1996-03-22|1996-06-01|1996-04-17|DELIVER IN PERSON|RAIL|boost furiously. sly +28577|1575|76|3|29|42820.53|0.08|0.03|N|O|1996-05-26|1996-04-20|1996-05-27|NONE|FOB|into beans wake slyly fu +28577|677|71|4|39|61529.13|0.07|0.00|N|O|1996-03-27|1996-04-28|1996-04-25|DELIVER IN PERSON|SHIP|ccounts are above the +28577|1991|36|5|19|35966.81|0.01|0.03|N|O|1996-04-12|1996-05-14|1996-04-29|COLLECT COD|REG AIR| regular, special pa +28577|1089|90|6|46|45543.68|0.02|0.08|N|O|1996-03-16|1996-04-05|1996-03-23|NONE|REG AIR|hely silent accounts sleep final +28578|1779|6|1|45|75634.65|0.09|0.04|N|O|1998-10-03|1998-08-19|1998-10-12|TAKE BACK RETURN|TRUCK| bold epitaphs haggle. pending account +28578|1054|90|2|13|12415.65|0.00|0.02|N|O|1998-08-28|1998-08-13|1998-09-03|DELIVER IN PERSON|MAIL|jole above the quickly pending acc +28578|1053|89|3|6|5724.30|0.05|0.00|N|O|1998-08-28|1998-08-23|1998-09-15|TAKE BACK RETURN|TRUCK| accounts; orbits are. furiously +28578|1188|25|4|12|13070.16|0.01|0.08|N|O|1998-07-06|1998-07-26|1998-07-23|TAKE BACK RETURN|SHIP|tect carefully regul +28579|1314|29|1|5|6076.55|0.00|0.02|N|O|1997-12-27|1997-12-22|1998-01-23|TAKE BACK RETURN|MAIL| integrate fluffily. quickly express +28579|664|58|2|13|20340.58|0.06|0.05|N|O|1998-01-12|1997-12-17|1998-02-03|DELIVER IN PERSON|TRUCK| regular deposits are b +28579|21|22|3|39|35919.78|0.03|0.05|N|O|1997-11-02|1997-12-22|1997-11-22|COLLECT COD|RAIL| the carefully ironic pi +28580|173|52|1|16|17170.72|0.03|0.06|A|F|1993-11-07|1993-09-26|1993-12-02|COLLECT COD|RAIL|cajole fluffily +28581|370|99|1|18|22866.66|0.01|0.00|N|O|1996-03-22|1996-02-15|1996-04-10|COLLECT COD|AIR|ccounts detect quickly f +28581|934|35|2|14|25689.02|0.09|0.02|N|O|1996-03-19|1996-01-23|1996-04-14|COLLECT COD|TRUCK|heodolites wake +28581|977|12|3|40|75118.80|0.09|0.01|N|O|1995-12-21|1996-01-19|1996-01-07|COLLECT COD|AIR|sly above the express excuses. +28581|1790|91|4|15|25376.85|0.09|0.08|N|O|1996-03-11|1996-01-27|1996-04-06|COLLECT COD|MAIL|quickly regul +28581|794|27|5|38|64402.02|0.05|0.04|N|O|1996-02-10|1996-01-28|1996-02-27|NONE|FOB|ently regular deposits ha +28581|1135|72|6|4|4144.52|0.06|0.08|N|O|1995-12-16|1996-02-09|1995-12-20|TAKE BACK RETURN|TRUCK|nically idly regular foxes. ca +28582|1535|16|1|26|37349.78|0.04|0.05|R|F|1992-02-10|1992-03-09|1992-03-03|COLLECT COD|RAIL| alongside of the ca +28582|1661|3|2|8|12501.28|0.03|0.00|A|F|1992-05-21|1992-04-21|1992-06-17|NONE|TRUCK|hs use slyly. fluffily express deposits h +28582|1061|97|3|36|34634.16|0.10|0.05|A|F|1992-03-02|1992-03-01|1992-03-21|COLLECT COD|SHIP|requests. unusual, regular accounts nag +28582|744|9|4|4|6578.96|0.03|0.03|R|F|1992-04-10|1992-03-14|1992-05-04|NONE|REG AIR|ndencies! sauternes engag +28582|1327|66|5|6|7369.92|0.09|0.08|A|F|1992-05-01|1992-03-23|1992-05-04|NONE|REG AIR|es nag carefully a +28582|1895|25|6|5|8984.45|0.09|0.08|A|F|1992-02-05|1992-03-19|1992-02-12|COLLECT COD|RAIL|eposits. unusual accou +28583|963|64|1|19|35415.24|0.09|0.07|A|F|1995-01-31|1995-01-20|1995-02-02|TAKE BACK RETURN|AIR| under the ev +28608|428|16|1|35|46494.70|0.03|0.07|A|F|1995-04-13|1995-04-13|1995-04-14|DELIVER IN PERSON|RAIL|ve against the accounts. slyl +28608|738|71|2|7|11471.11|0.06|0.06|R|F|1995-02-18|1995-03-29|1995-03-05|NONE|MAIL| the accounts. careful +28609|1293|68|1|35|41800.15|0.03|0.00|N|O|1997-05-12|1997-05-25|1997-06-08|DELIVER IN PERSON|SHIP|old courts among the bli +28610|758|55|1|31|51421.25|0.04|0.06|N|O|1996-12-11|1996-12-28|1996-12-30|NONE|AIR|pendencies. iron +28610|1135|36|2|7|7252.91|0.08|0.02|N|O|1997-01-08|1997-01-13|1997-01-29|NONE|MAIL|osely silent +28610|640|72|3|33|50841.12|0.08|0.05|N|O|1996-11-27|1997-01-08|1996-12-24|DELIVER IN PERSON|MAIL|ress ideas after the +28610|986|21|4|14|26417.72|0.06|0.03|N|O|1997-02-21|1997-01-06|1997-03-20|NONE|TRUCK|into beans are blithely packages. silent +28611|1106|7|1|15|15106.50|0.00|0.08|A|F|1993-04-06|1993-01-28|1993-04-21|TAKE BACK RETURN|RAIL|along the carefully final +28611|1499|17|2|47|65823.03|0.09|0.07|R|F|1993-03-14|1993-02-12|1993-03-30|NONE|SHIP|thely pending requests after the slyly regu +28611|210|65|3|27|29975.67|0.04|0.00|R|F|1993-01-03|1993-03-03|1993-01-29|NONE|TRUCK|ngly furiously bold realms. ir +28611|299|54|4|10|11992.90|0.07|0.03|A|F|1993-01-19|1993-02-25|1993-02-07|NONE|REG AIR|e furiously on the bold pa +28611|679|73|5|11|17376.37|0.05|0.02|A|F|1993-01-31|1993-03-28|1993-02-10|TAKE BACK RETURN|REG AIR|ar excuses nag +28612|508|99|1|19|26761.50|0.08|0.03|N|O|1997-09-24|1997-11-04|1997-10-05|NONE|FOB|s integrate among the sl +28612|1586|67|2|40|59503.20|0.00|0.08|N|O|1997-12-25|1997-10-15|1998-01-06|DELIVER IN PERSON|FOB|. requests boost silently. quic +28612|232|33|3|2|2264.46|0.08|0.06|N|O|1997-12-03|1997-10-15|1997-12-05|NONE|MAIL| cajole above th +28612|567|68|4|15|22013.40|0.01|0.08|N|O|1997-12-28|1997-11-15|1998-01-25|DELIVER IN PERSON|MAIL|ng, even accounts +28612|1398|75|5|26|33784.14|0.02|0.07|N|O|1997-09-25|1997-11-24|1997-09-26|NONE|MAIL|le after the pinto beans. blithely regula +28612|702|67|6|29|46478.30|0.10|0.00|N|O|1997-11-13|1997-11-14|1997-12-02|DELIVER IN PERSON|AIR| slyly against the furiously regular pint +28613|320|49|1|4|4881.28|0.03|0.01|N|O|1996-12-17|1996-12-27|1996-12-27|COLLECT COD|SHIP|lar packages above the even +28613|1888|89|2|27|48326.76|0.10|0.08|N|O|1997-02-11|1996-12-09|1997-02-13|DELIVER IN PERSON|SHIP|ites sleep blithely +28613|1795|80|3|14|23755.06|0.01|0.03|N|O|1997-01-30|1996-12-29|1997-02-17|COLLECT COD|TRUCK|osits wake slyly sil +28613|712|9|4|19|30641.49|0.07|0.00|N|O|1996-12-26|1997-01-21|1997-01-06|DELIVER IN PERSON|TRUCK|haggle furiously +28613|1937|70|5|45|82751.85|0.09|0.02|N|O|1997-03-06|1997-01-01|1997-03-31|COLLECT COD|RAIL| beans. deposits lo +28613|1749|50|6|17|28062.58|0.08|0.01|N|O|1996-12-30|1997-01-29|1997-01-11|COLLECT COD|MAIL|kages detect +28613|765|66|7|38|63298.88|0.07|0.00|N|O|1996-11-12|1997-01-20|1996-11-23|TAKE BACK RETURN|REG AIR|inal packages. silently final package +28614|1728|29|1|23|37483.56|0.10|0.04|A|F|1994-10-29|1995-01-12|1994-11-02|COLLECT COD|TRUCK|gle carefully ironic foxes. carefully re +28614|1048|19|2|34|32267.36|0.02|0.07|A|F|1995-02-13|1995-01-14|1995-03-11|DELIVER IN PERSON|SHIP|ecial pinto beans hang caref +28614|1044|15|3|23|21735.92|0.10|0.00|R|F|1994-11-28|1994-12-02|1994-12-09|DELIVER IN PERSON|REG AIR|e carefully regular accou +28614|1946|47|4|18|33262.92|0.03|0.04|A|F|1995-02-02|1994-12-02|1995-02-16|TAKE BACK RETURN|SHIP|even pinto beans thrash above the instru +28614|231|13|5|2|2262.46|0.00|0.02|R|F|1995-01-31|1994-12-07|1995-02-08|COLLECT COD|RAIL|-ray close instructions +28614|1913|14|6|32|58077.12|0.08|0.03|R|F|1995-01-03|1994-12-12|1995-01-13|DELIVER IN PERSON|AIR|final platelets are furiously after +28615|1084|90|1|9|8865.72|0.05|0.07|N|O|1997-03-26|1997-02-23|1997-04-19|DELIVER IN PERSON|REG AIR|refully slyly +28615|762|95|2|5|8313.80|0.06|0.08|N|O|1997-02-20|1997-03-21|1997-03-08|COLLECT COD|SHIP|ic, unusual foxes haggle furiously flu +28615|644|45|3|9|13901.76|0.02|0.03|N|O|1997-01-28|1997-02-20|1997-02-08|TAKE BACK RETURN|RAIL|ly unusual waters lose furio +28615|1303|18|4|42|50580.60|0.04|0.01|N|O|1997-04-09|1997-03-21|1997-05-05|COLLECT COD|RAIL|about the s +28640|1491|31|1|23|32027.27|0.10|0.01|N|O|1996-05-01|1996-05-19|1996-05-19|NONE|RAIL|des. special accounts sleep arou +28640|1209|84|2|28|31085.60|0.09|0.08|N|O|1996-05-09|1996-05-05|1996-05-18|COLLECT COD|MAIL| express asymptotes use +28640|1571|92|3|48|70683.36|0.07|0.05|N|O|1996-06-09|1996-06-08|1996-07-04|NONE|SHIP|ites. fluffily regular platelet +28641|1643|44|1|42|64874.88|0.09|0.04|N|O|1995-12-31|1995-12-10|1996-01-28|DELIVER IN PERSON|TRUCK|ar accounts sleep ca +28641|346|75|2|1|1246.34|0.06|0.00|N|O|1995-11-24|1995-11-24|1995-12-08|DELIVER IN PERSON|SHIP|ular dependencies wake slyly. ironic, +28642|1825|55|1|2|3453.64|0.02|0.05|A|F|1995-03-05|1995-03-03|1995-03-07|NONE|SHIP| about the furiously unus +28642|1185|86|2|28|30413.04|0.08|0.00|R|F|1995-03-31|1995-03-01|1995-04-20|TAKE BACK RETURN|FOB|ut the ironic pearls. regular deposits a +28642|1366|81|3|49|62100.64|0.01|0.01|A|F|1995-01-27|1995-04-10|1995-01-28|TAKE BACK RETURN|FOB|ly final d +28642|1477|56|4|44|60652.68|0.02|0.08|A|F|1995-05-09|1995-02-22|1995-05-25|DELIVER IN PERSON|AIR|lar requests instead of the deposits subla +28643|21|22|1|36|33156.72|0.09|0.07|R|F|1993-05-07|1993-07-06|1993-05-27|DELIVER IN PERSON|RAIL|ages use across the r +28643|671|72|2|18|28290.06|0.10|0.07|R|F|1993-06-01|1993-06-25|1993-06-04|DELIVER IN PERSON|REG AIR|lphins. packages are. excuses +28643|792|25|3|38|64326.02|0.05|0.04|R|F|1993-07-25|1993-06-12|1993-08-15|NONE|MAIL|lyly unusual +28643|290|91|4|30|35708.70|0.00|0.05|A|F|1993-07-03|1993-06-23|1993-08-02|DELIVER IN PERSON|AIR|requests. pac +28644|26|77|1|10|9260.20|0.00|0.02|N|O|1997-06-23|1997-08-25|1997-07-12|TAKE BACK RETURN|MAIL|hall boost carefully. +28644|903|4|2|38|68548.20|0.10|0.01|N|O|1997-06-23|1997-08-02|1997-07-21|TAKE BACK RETURN|SHIP|tes boost regularly among the b +28644|646|9|3|16|24746.24|0.05|0.05|N|O|1997-08-24|1997-08-26|1997-09-15|TAKE BACK RETURN|AIR|iously quickly regular foxes. carefully fi +28644|1679|21|4|10|15806.70|0.02|0.03|N|O|1997-06-21|1997-09-07|1997-07-18|COLLECT COD|SHIP|as. carefully silent deposits inte +28645|67|18|1|44|42550.64|0.07|0.06|R|F|1994-01-13|1993-12-22|1994-01-15|DELIVER IN PERSON|TRUCK|ously final excuses cajole through the car +28645|1069|70|2|12|11640.72|0.10|0.02|R|F|1994-01-02|1993-11-20|1994-01-05|TAKE BACK RETURN|MAIL|ts. blithely final ideas haggle toward the +28645|589|80|3|47|70010.26|0.09|0.00|R|F|1993-11-17|1993-12-07|1993-11-20|NONE|TRUCK|uests around the bold the +28645|802|36|4|17|28947.60|0.03|0.03|A|F|1994-02-08|1993-11-25|1994-02-15|COLLECT COD|AIR|tions dazzle quickly. regular a +28646|891|92|1|25|44797.25|0.02|0.08|N|O|1997-08-03|1997-07-24|1997-08-25|COLLECT COD|SHIP|e dependencies eat never final ho +28646|1034|35|2|26|24310.78|0.09|0.07|N|O|1997-07-30|1997-08-09|1997-07-31|DELIVER IN PERSON|MAIL|lly final notornis. quic +28646|1945|78|3|8|14775.52|0.01|0.00|N|O|1997-08-11|1997-08-06|1997-09-03|NONE|RAIL|ld, regular requests +28646|1596|97|4|14|20966.26|0.02|0.07|N|O|1997-07-26|1997-07-30|1997-08-01|DELIVER IN PERSON|AIR|sts. quickly busy ideas sl +28647|64|40|1|1|964.06|0.06|0.02|R|F|1994-06-22|1994-05-10|1994-06-24|NONE|SHIP|eposits. furiously ironic asympt +28672|1989|78|1|15|28364.70|0.10|0.02|N|O|1996-02-16|1996-02-15|1996-03-08|COLLECT COD|REG AIR|its thrash furiously upon the stealthily un +28672|98|24|2|14|13973.26|0.03|0.00|N|O|1996-03-16|1996-01-18|1996-04-11|COLLECT COD|SHIP|cajole thinly. acc +28672|1036|37|3|15|14055.45|0.05|0.06|N|O|1996-04-04|1996-01-31|1996-04-06|NONE|AIR| final dep +28672|1168|5|4|8|8553.28|0.01|0.04|N|O|1996-02-01|1996-01-31|1996-02-04|COLLECT COD|TRUCK|egrate stealthily eve +28672|1326|27|5|4|4909.28|0.03|0.06|N|O|1996-04-07|1996-01-18|1996-05-04|DELIVER IN PERSON|AIR|e quickly even asym +28673|1683|25|1|10|15846.80|0.00|0.02|N|O|1997-11-26|1997-12-27|1997-12-02|COLLECT COD|FOB|ully express pinto beans +28674|702|67|1|6|9616.20|0.04|0.07|N|O|1995-09-03|1995-10-03|1995-09-09|NONE|TRUCK|lly express d +28674|386|15|2|1|1286.38|0.05|0.03|N|O|1995-12-08|1995-11-11|1995-12-27|TAKE BACK RETURN|TRUCK|kages sleep quickly ironic +28674|755|52|3|11|18213.25|0.00|0.06|N|O|1995-08-17|1995-10-17|1995-08-21|COLLECT COD|MAIL|fully against the f +28674|1389|66|4|25|32259.50|0.02|0.02|N|O|1995-09-01|1995-10-29|1995-09-15|TAKE BACK RETURN|AIR|nt requests detect among the perman +28674|766|31|5|16|26668.16|0.05|0.07|N|O|1995-10-07|1995-10-10|1995-11-06|TAKE BACK RETURN|SHIP|tructions. fluffily express +28675|1413|92|1|16|21030.56|0.03|0.07|A|F|1994-11-30|1994-12-11|1994-12-24|NONE|REG AIR|carefully even accounts! blithely +28675|1973|6|2|13|24374.61|0.06|0.04|A|F|1994-12-14|1994-12-04|1995-01-13|DELIVER IN PERSON|SHIP|tes. regular excuses wake carefull +28675|177|78|3|48|51704.16|0.02|0.00|A|F|1994-10-24|1994-11-21|1994-11-21|TAKE BACK RETURN|FOB|rts cajole alongside of the deposit +28675|1976|9|4|22|41315.34|0.04|0.07|A|F|1994-11-29|1994-12-06|1994-12-22|DELIVER IN PERSON|RAIL|ons. deposits promise thinly around the th +28675|154|33|5|32|33732.80|0.01|0.02|R|F|1994-11-20|1994-12-30|1994-12-13|COLLECT COD|AIR|ts. final pinto beans sle +28675|991|92|6|15|28379.85|0.05|0.05|R|F|1995-01-07|1995-01-04|1995-01-28|DELIVER IN PERSON|AIR|ly. unusual accounts alongs +28676|560|91|1|36|52580.16|0.07|0.02|N|O|1998-07-16|1998-07-04|1998-07-22|DELIVER IN PERSON|MAIL| ironic platelets. carefully regul +28676|1469|70|2|36|49336.56|0.02|0.06|N|O|1998-07-09|1998-07-31|1998-08-03|NONE|SHIP|e carefully ironic dependencies. +28676|1868|98|3|9|15928.74|0.01|0.03|N|O|1998-06-14|1998-08-10|1998-07-11|TAKE BACK RETURN|RAIL|eodolites detect above the +28677|1004|40|1|5|4525.00|0.06|0.02|N|O|1997-09-12|1997-09-14|1997-09-28|DELIVER IN PERSON|REG AIR|slyly express accounts. furiousl +28677|1896|83|2|17|30564.13|0.06|0.04|N|O|1997-09-21|1997-10-03|1997-10-18|TAKE BACK RETURN|FOB|instructions boost carefully at the dogg +28678|78|79|1|9|8802.63|0.03|0.07|A|F|1994-01-31|1994-04-04|1994-02-02|DELIVER IN PERSON|RAIL|furiously final accounts. furiously regu +28679|1619|2|1|9|13685.49|0.10|0.01|N|O|1995-09-01|1995-10-17|1995-09-25|TAKE BACK RETURN|REG AIR|gular requests. car +28679|196|23|2|9|9865.71|0.10|0.00|N|O|1995-09-23|1995-11-13|1995-10-05|NONE|FOB|fluffily unusual accounts are. carefull +28679|791|92|3|13|21993.27|0.02|0.02|N|O|1995-12-16|1995-10-19|1995-12-23|TAKE BACK RETURN|RAIL|. blithely special ideas +28679|1800|85|4|33|56159.40|0.03|0.00|N|O|1995-11-13|1995-11-01|1995-12-08|TAKE BACK RETURN|RAIL|are furiously blithely quick as +28704|515|16|1|2|2831.02|0.00|0.07|N|O|1996-07-26|1996-09-24|1996-08-21|COLLECT COD|FOB|dolites after the deposits h +28705|296|24|1|1|1196.29|0.05|0.02|N|O|1998-03-21|1998-02-18|1998-04-11|TAKE BACK RETURN|TRUCK|cuses serve furiously. furiously final idea +28705|668|31|2|50|78433.00|0.04|0.08|N|O|1998-02-08|1998-02-20|1998-02-17|TAKE BACK RETURN|FOB|ms sleep. furiously special c +28705|1761|62|3|14|23278.64|0.09|0.04|N|O|1998-03-29|1998-02-05|1998-04-14|NONE|SHIP|pending pinto beans. instructions ar +28705|1537|18|4|40|57541.20|0.01|0.00|N|O|1998-03-29|1998-02-22|1998-04-08|NONE|TRUCK|ending, express p +28705|871|5|5|26|46068.62|0.09|0.03|N|O|1998-01-10|1998-03-09|1998-01-21|TAKE BACK RETURN|FOB|slyly. Tiresias along the +28705|1417|57|6|26|34278.66|0.08|0.00|N|O|1998-01-18|1998-03-21|1998-02-05|DELIVER IN PERSON|AIR|uctions sleep slyly. bold, silent +28705|815|49|7|30|51474.30|0.01|0.03|N|O|1998-03-24|1998-03-07|1998-03-29|NONE|SHIP|ts was about the expr +28706|977|78|1|26|48827.22|0.10|0.03|A|F|1994-08-20|1994-08-26|1994-09-08|NONE|RAIL|uests nag. carefully express d +28707|155|56|1|1|1055.15|0.05|0.08|N|O|1997-04-15|1997-03-16|1997-05-11|TAKE BACK RETURN|MAIL|quests boost carefully! accounts wake. +28707|711|76|2|46|74138.66|0.00|0.02|N|O|1997-03-11|1997-03-18|1997-03-30|COLLECT COD|SHIP|y final account +28707|415|74|3|41|53931.81|0.01|0.03|N|O|1997-02-06|1997-04-14|1997-02-21|DELIVER IN PERSON|REG AIR| deposits sleep fl +28708|956|91|1|30|55708.50|0.03|0.05|N|O|1997-04-22|1997-04-16|1997-05-21|DELIVER IN PERSON|MAIL|long the blithel +28709|893|60|1|4|7175.56|0.02|0.06|N|O|1997-09-11|1997-09-09|1997-09-22|COLLECT COD|MAIL|bold accounts sleep furiou +28709|1326|3|2|9|11045.88|0.06|0.04|N|O|1997-06-20|1997-08-28|1997-07-13|COLLECT COD|REG AIR|nic requests according to the silent packa +28709|1722|7|3|30|48711.60|0.05|0.08|N|O|1997-07-15|1997-07-25|1997-07-25|COLLECT COD|FOB|ackages. express deposits wake slyly +28709|1928|73|4|34|62217.28|0.10|0.04|N|O|1997-08-29|1997-07-18|1997-09-09|TAKE BACK RETURN|TRUCK|ake silently. quickly +28709|834|35|5|16|27757.28|0.04|0.03|N|O|1997-08-03|1997-09-02|1997-09-01|NONE|TRUCK|according to th +28710|1427|67|1|1|1328.42|0.00|0.05|A|F|1992-07-14|1992-06-12|1992-08-02|DELIVER IN PERSON|TRUCK|old instructions. carefully +28710|1269|7|2|24|28086.24|0.01|0.07|R|F|1992-04-17|1992-07-01|1992-05-04|NONE|REG AIR|ly regular theodolites. slyl +28710|63|14|3|8|7704.48|0.10|0.00|R|F|1992-06-12|1992-06-03|1992-06-16|TAKE BACK RETURN|MAIL|e fluffily. slyly ex +28711|1114|87|1|33|33498.63|0.03|0.07|R|F|1995-02-11|1994-12-19|1995-02-22|DELIVER IN PERSON|SHIP|ns along the slyly b +28736|1155|56|1|4|4224.60|0.03|0.01|A|F|1994-06-26|1994-06-23|1994-07-04|DELIVER IN PERSON|SHIP|s wake bravely after +28736|133|12|2|30|30993.90|0.09|0.05|R|F|1994-08-17|1994-07-18|1994-08-20|NONE|AIR|carefully ironic platelets doze along the +28737|301|86|1|29|34837.70|0.00|0.06|N|O|1995-11-16|1995-11-15|1995-11-26|DELIVER IN PERSON|SHIP|refully against the slyly unusual accoun +28737|1686|28|2|36|57156.48|0.02|0.01|N|O|1995-11-05|1996-01-02|1995-11-30|TAKE BACK RETURN|TRUCK|ckages haggle do +28737|329|30|3|23|28274.36|0.07|0.07|N|O|1996-01-16|1995-11-16|1996-02-03|DELIVER IN PERSON|FOB|about the ironic packages. blithely final r +28737|645|8|4|31|47914.84|0.03|0.04|N|O|1995-12-28|1995-12-28|1996-01-18|TAKE BACK RETURN|REG AIR|requests wake quick +28737|1615|98|5|24|36398.64|0.05|0.08|N|O|1995-12-05|1995-12-24|1996-01-03|COLLECT COD|RAIL|ccording to th +28737|801|1|6|16|27228.80|0.00|0.01|N|O|1996-01-17|1995-11-29|1996-02-11|DELIVER IN PERSON|FOB|final packages doze blithely. en +28738|783|48|1|27|45462.06|0.08|0.04|R|F|1992-11-25|1992-09-20|1992-12-20|TAKE BACK RETURN|MAIL| to the accounts. fluffily regular de +28738|1334|73|2|13|16059.29|0.10|0.07|A|F|1992-09-25|1992-11-04|1992-10-12|COLLECT COD|MAIL|usly final packages. d +28738|1560|61|3|38|55539.28|0.05|0.07|R|F|1992-12-04|1992-10-13|1992-12-09|TAKE BACK RETURN|FOB|yly ironic requests nag. hockey players +28738|1380|81|4|9|11532.42|0.04|0.04|A|F|1992-08-17|1992-09-28|1992-09-05|COLLECT COD|MAIL|requests; slyly bold ideas wake silent as +28738|1938|83|5|47|86476.71|0.01|0.08|A|F|1992-10-09|1992-10-28|1992-10-16|COLLECT COD|MAIL|ly regular depo +28738|1349|88|6|31|38760.54|0.05|0.08|A|F|1992-09-17|1992-10-10|1992-10-08|DELIVER IN PERSON|AIR| the blithely reg +28738|240|41|7|17|19384.08|0.03|0.06|R|F|1992-11-02|1992-09-18|1992-11-05|TAKE BACK RETURN|SHIP|ial requests. bli +28739|34|60|1|45|42031.35|0.07|0.00|N|O|1996-12-10|1996-10-26|1996-12-31|DELIVER IN PERSON|AIR|al ideas use +28739|1157|58|2|41|43384.15|0.03|0.08|N|O|1996-12-17|1996-11-29|1997-01-15|NONE|RAIL|ges boost fluffily against the even ideas. +28739|229|57|3|49|55331.78|0.00|0.05|N|O|1996-11-27|1996-11-28|1996-11-29|NONE|MAIL|y bold requests. acc +28740|1835|65|1|26|45157.58|0.05|0.07|R|F|1992-12-21|1992-12-18|1993-01-15|NONE|AIR|deposits. ironic theodo +28740|235|17|2|23|26110.29|0.00|0.04|A|F|1992-11-28|1993-01-02|1992-12-13|COLLECT COD|TRUCK|y regular deposits. deposit +28740|988|23|3|43|81226.14|0.03|0.04|A|F|1992-10-12|1992-12-12|1992-10-23|DELIVER IN PERSON|MAIL|lly ironic package +28740|600|31|4|6|9003.60|0.00|0.00|A|F|1992-10-22|1993-01-02|1992-10-24|NONE|FOB|kly pending instruc +28741|125|4|1|5|5125.60|0.09|0.03|A|F|1995-04-25|1995-04-01|1995-05-19|COLLECT COD|RAIL|hely special epit +28741|947|16|2|20|36958.80|0.03|0.01|N|O|1995-06-29|1995-05-10|1995-07-10|TAKE BACK RETURN|MAIL|ts serve along the furiously regula +28741|854|54|3|16|28077.60|0.06|0.05|R|F|1995-04-21|1995-05-13|1995-05-10|DELIVER IN PERSON|TRUCK| final requests h +28741|1218|30|4|29|32457.09|0.10|0.08|R|F|1995-04-20|1995-05-21|1995-05-17|NONE|MAIL|detect bravely unusual depende +28741|1213|25|5|26|28969.46|0.08|0.02|R|F|1995-05-23|1995-05-16|1995-06-12|TAKE BACK RETURN|AIR|c, final excuses. special, iron +28741|327|56|6|11|13500.52|0.10|0.03|N|O|1995-06-18|1995-05-12|1995-06-23|DELIVER IN PERSON|MAIL|l packages cajole among the slyly i +28742|1714|15|1|42|67859.82|0.03|0.04|R|F|1992-05-07|1992-07-11|1992-05-30|COLLECT COD|RAIL| beans wake furiously. care +28742|553|44|2|19|27617.45|0.02|0.03|R|F|1992-08-27|1992-06-09|1992-09-22|COLLECT COD|FOB|s. asymptotes nag blit +28742|498|28|3|17|23774.33|0.09|0.05|A|F|1992-07-31|1992-07-24|1992-08-11|DELIVER IN PERSON|REG AIR|blithely regular requests sleep above the +28742|1598|19|4|24|35990.16|0.08|0.06|A|F|1992-07-30|1992-06-09|1992-08-18|NONE|RAIL|deposits. furiously regular accounts a +28743|1337|52|1|19|23528.27|0.00|0.07|N|O|1996-06-08|1996-07-02|1996-06-23|TAKE BACK RETURN|TRUCK|ily ironic waters. slyly +28743|170|71|2|9|9631.53|0.02|0.07|N|O|1996-07-15|1996-07-31|1996-08-01|DELIVER IN PERSON|RAIL|efully. furiously special instructions sl +28743|405|6|3|20|26108.00|0.05|0.06|N|O|1996-09-05|1996-07-15|1996-10-04|COLLECT COD|SHIP|inal forges might cajole. accounts wake +28743|264|46|4|24|27942.24|0.09|0.06|N|O|1996-07-30|1996-08-01|1996-08-20|DELIVER IN PERSON|FOB|multipliers boost alongside of the ironi +28768|1523|44|1|32|45584.64|0.03|0.00|N|O|1996-11-16|1996-10-20|1996-11-22|COLLECT COD|MAIL|und the pending requ +28768|1637|79|2|30|46158.90|0.03|0.01|N|O|1996-11-23|1996-10-06|1996-12-03|TAKE BACK RETURN|MAIL|nic reques +28768|297|79|3|46|55075.34|0.03|0.04|N|O|1996-08-12|1996-09-11|1996-09-04|COLLECT COD|TRUCK| sleep ironically requests. slyly i +28768|1030|31|4|12|11172.36|0.09|0.02|N|O|1996-09-18|1996-10-28|1996-10-13|NONE|REG AIR|nusual dolphins according to the +28768|1174|75|5|9|9676.53|0.00|0.07|N|O|1996-08-16|1996-10-02|1996-08-17|DELIVER IN PERSON|TRUCK|hely about th +28768|1222|97|6|18|20217.96|0.06|0.01|N|O|1996-10-10|1996-10-03|1996-10-23|DELIVER IN PERSON|TRUCK|inal package +28768|1082|53|7|25|24577.00|0.06|0.03|N|O|1996-11-26|1996-10-02|1996-12-04|NONE|FOB|alongside of the furiously regular +28769|672|35|1|23|36171.41|0.10|0.00|R|F|1993-10-01|1993-11-08|1993-10-16|NONE|AIR|g the special, expr +28769|831|98|2|48|83127.84|0.02|0.03|A|F|1993-11-29|1993-10-30|1993-12-11|TAKE BACK RETURN|TRUCK|do sleep blithely blithely +28769|1563|44|3|17|24897.52|0.05|0.02|R|F|1993-11-04|1993-10-30|1993-11-22|COLLECT COD|RAIL|sits use slyly. +28769|264|46|4|31|36092.06|0.06|0.08|A|F|1993-11-02|1993-10-07|1993-11-23|DELIVER IN PERSON|TRUCK|xpress requests wake +28769|1235|73|5|20|22724.60|0.02|0.00|R|F|1993-12-04|1993-10-07|1993-12-08|TAKE BACK RETURN|FOB|o beans. quickly regular +28770|1818|62|1|13|22357.53|0.00|0.06|N|O|1997-07-29|1997-08-19|1997-08-15|NONE|AIR|ly ironic excuses. furiousl +28770|248|30|2|10|11482.40|0.00|0.06|N|O|1997-07-28|1997-10-09|1997-08-11|NONE|RAIL|ckly furiously bold ideas. carefully even i +28770|1648|72|3|42|65084.88|0.05|0.04|N|O|1997-09-19|1997-10-10|1997-09-27|NONE|AIR|efully regular instructions +28770|1579|60|4|32|47378.24|0.09|0.08|N|O|1997-11-08|1997-08-29|1997-11-27|DELIVER IN PERSON|AIR| regular grouches. bold, bold accounts da +28770|1140|49|5|20|20822.80|0.05|0.02|N|O|1997-09-04|1997-08-19|1997-09-24|TAKE BACK RETURN|TRUCK|ly final packages. ironic reque +28770|771|72|6|26|43466.02|0.00|0.03|N|O|1997-11-06|1997-09-11|1997-11-30|COLLECT COD|FOB|ns are across the blithe +28771|728|93|1|3|4886.16|0.02|0.02|R|F|1992-06-08|1992-07-03|1992-07-07|TAKE BACK RETURN|AIR|nts. ideas c +28772|1880|24|1|34|60583.92|0.01|0.07|R|F|1994-05-05|1994-05-04|1994-05-30|TAKE BACK RETURN|RAIL|ly silent packages are slyly eve +28772|958|27|2|41|76216.95|0.07|0.04|R|F|1994-05-07|1994-04-27|1994-05-08|COLLECT COD|TRUCK|pending pinto beans haggle furiously a +28772|1431|49|3|33|43970.19|0.05|0.07|R|F|1994-02-21|1994-03-19|1994-03-16|NONE|REG AIR|ly final excu +28772|369|26|4|11|13962.96|0.04|0.01|R|F|1994-04-03|1994-03-30|1994-04-10|NONE|AIR|furiously unusu +28772|1458|59|5|46|62534.70|0.03|0.05|R|F|1994-03-11|1994-04-26|1994-03-28|DELIVER IN PERSON|SHIP|requests. ironic deposits after +28772|1945|90|6|48|88653.12|0.00|0.06|A|F|1994-03-13|1994-04-05|1994-04-04|NONE|RAIL|d, final packages. slyly +28773|646|78|1|25|38666.00|0.08|0.00|R|F|1995-05-29|1995-04-24|1995-06-04|NONE|RAIL|e enticingl +28773|1945|46|2|43|79418.42|0.07|0.04|R|F|1995-04-14|1995-04-06|1995-05-06|NONE|FOB|eposits. quickly ironic packages nag f +28773|402|32|3|24|31257.60|0.03|0.05|R|F|1995-03-16|1995-04-28|1995-04-02|COLLECT COD|TRUCK|ly according to the instruc +28773|905|74|4|1|1805.90|0.00|0.05|A|F|1995-05-09|1995-04-07|1995-05-25|TAKE BACK RETURN|RAIL|ang carefully. fur +28773|1588|29|5|5|7447.90|0.02|0.06|R|F|1995-03-09|1995-04-29|1995-03-22|TAKE BACK RETURN|RAIL|. carefully ironic war +28773|1218|19|6|32|35814.72|0.03|0.01|R|F|1995-05-28|1995-04-12|1995-05-29|NONE|AIR|requests boo +28774|200|1|1|46|50609.20|0.00|0.06|A|F|1994-04-27|1994-03-26|1994-05-12|COLLECT COD|RAIL|ly. furiously ironic deposits after the fur +28774|1560|61|2|48|70154.88|0.07|0.03|A|F|1994-03-01|1994-03-14|1994-03-04|NONE|REG AIR|ly accounts. furiously unusual foxes ha +28774|27|78|3|15|13905.30|0.06|0.02|A|F|1994-02-26|1994-02-07|1994-03-18|DELIVER IN PERSON|MAIL|slyly special packages. furiously e +28775|1466|84|1|14|19144.44|0.10|0.00|A|F|1994-10-13|1994-12-28|1994-10-24|DELIVER IN PERSON|TRUCK|xes cajole slyly among the carefu +28775|1398|37|2|4|5197.56|0.09|0.00|R|F|1994-10-21|1994-12-27|1994-10-27|COLLECT COD|AIR|its after the blithely +28775|669|1|3|3|4708.98|0.06|0.01|R|F|1995-01-13|1994-11-13|1995-01-25|NONE|AIR|inal, ironic deposits. carefull +28775|634|35|4|49|75196.87|0.09|0.07|R|F|1994-12-14|1994-11-17|1995-01-06|DELIVER IN PERSON|REG AIR|y final deposi +28775|1696|97|5|36|57516.84|0.00|0.07|R|F|1994-12-30|1995-01-01|1995-01-07|DELIVER IN PERSON|REG AIR| accounts cajole among the ironic +28800|1161|70|1|38|40362.08|0.01|0.03|N|O|1998-04-01|1998-05-03|1998-04-03|NONE|MAIL|fily ironic, even excuses. fluffily +28801|1588|9|1|45|67031.10|0.09|0.04|A|F|1993-11-29|1993-11-06|1993-11-30|NONE|AIR|gular ideas among the u +28801|1978|79|2|11|20679.67|0.03|0.08|R|F|1993-10-23|1993-11-19|1993-10-29|DELIVER IN PERSON|TRUCK| packages! furiousl +28802|1092|98|1|19|18868.71|0.01|0.05|A|F|1993-12-12|1994-01-01|1993-12-19|DELIVER IN PERSON|FOB|es. ironic, special deposi +28802|1072|43|2|17|16542.19|0.10|0.03|A|F|1994-01-20|1994-01-27|1994-02-01|TAKE BACK RETURN|SHIP|nusual ideas haggle even, +28802|1682|83|3|40|63347.20|0.07|0.07|R|F|1993-12-27|1994-01-10|1994-01-15|TAKE BACK RETURN|TRUCK|boost carefully around the fl +28802|792|93|4|8|13542.32|0.02|0.02|R|F|1993-11-17|1994-01-20|1993-11-24|NONE|MAIL| express packages sleep bli +28802|69|20|5|19|18412.14|0.03|0.03|A|F|1994-02-05|1994-01-02|1994-02-14|TAKE BACK RETURN|FOB|ely regular packages sleep +28803|1429|69|1|4|5321.68|0.10|0.06|N|O|1996-07-09|1996-09-05|1996-07-20|TAKE BACK RETURN|RAIL|leep ruthlessly. blithely final reques +28803|1288|100|2|14|16649.92|0.01|0.05|N|O|1996-10-15|1996-07-23|1996-11-02|DELIVER IN PERSON|RAIL|ouches boost furiously +28803|371|72|3|2|2542.74|0.00|0.00|N|O|1996-08-08|1996-07-22|1996-09-07|COLLECT COD|FOB|ironic pinto beans +28803|559|60|4|27|39407.85|0.05|0.01|N|O|1996-08-16|1996-08-23|1996-09-05|COLLECT COD|AIR| regular packages doze; thin warhorses use +28804|862|63|1|4|7051.44|0.07|0.02|N|O|1997-10-01|1997-08-18|1997-10-28|DELIVER IN PERSON|MAIL| slyly for the slow acc +28805|1446|47|1|10|13474.40|0.08|0.04|N|O|1995-07-19|1995-06-19|1995-08-17|COLLECT COD|FOB|fily close theodolites wake abo +28805|1706|7|2|25|40192.50|0.06|0.05|A|F|1995-05-25|1995-05-15|1995-05-30|TAKE BACK RETURN|AIR|g platelets across the closely +28805|560|91|3|35|51119.60|0.06|0.01|A|F|1995-04-04|1995-06-02|1995-04-24|COLLECT COD|REG AIR|ilent deposits +28805|1349|88|4|42|52514.28|0.01|0.08|N|O|1995-07-13|1995-06-14|1995-07-30|NONE|MAIL| the carefully even courts wake slyly abo +28805|1045|16|5|9|8514.36|0.03|0.08|N|O|1995-08-01|1995-05-24|1995-08-11|DELIVER IN PERSON|REG AIR|tes. express dugouts s +28806|857|91|1|46|80861.10|0.02|0.01|N|O|1996-12-05|1996-10-29|1997-01-02|DELIVER IN PERSON|RAIL|aggle; care +28806|1640|41|2|34|52415.76|0.07|0.01|N|O|1996-11-30|1996-12-08|1996-12-09|TAKE BACK RETURN|SHIP|ong the blithely regular packages. re +28806|1368|69|3|18|22848.48|0.06|0.02|N|O|1996-12-19|1996-10-29|1997-01-01|TAKE BACK RETURN|AIR|among the ideas are al +28807|1502|43|1|37|51929.50|0.00|0.03|N|O|1995-06-18|1995-05-02|1995-07-10|NONE|MAIL|quickly ironic +28807|700|1|2|7|11204.90|0.00|0.08|A|F|1995-05-28|1995-06-19|1995-06-16|DELIVER IN PERSON|TRUCK|platelets na +28807|891|91|3|14|25086.46|0.04|0.08|N|O|1995-07-18|1995-05-27|1995-08-13|TAKE BACK RETURN|REG AIR|ackages x-ray among the express instructio +28807|1966|55|4|13|24283.48|0.10|0.06|R|F|1995-04-13|1995-06-20|1995-04-28|COLLECT COD|SHIP|e express, even requests. pinto beans ha +28807|400|29|5|34|44213.60|0.01|0.04|N|O|1995-07-30|1995-06-10|1995-08-11|COLLECT COD|TRUCK| silent foxes use fl +28832|1992|93|1|38|71971.62|0.07|0.02|R|F|1993-10-11|1993-10-26|1993-11-02|DELIVER IN PERSON|SHIP|s use slyly even +28832|755|20|2|12|19869.00|0.00|0.00|R|F|1993-12-28|1993-10-26|1994-01-19|COLLECT COD|AIR|tes nag past the regular instr +28832|406|36|3|11|14370.40|0.03|0.06|R|F|1993-11-13|1993-10-28|1993-12-09|NONE|FOB|ronic accounts. express +28832|1145|46|4|17|17784.38|0.07|0.00|A|F|1993-11-24|1993-11-02|1993-12-02|COLLECT COD|AIR|quests sleep +28833|558|89|1|22|32088.10|0.09|0.07|N|O|1996-06-27|1996-06-11|1996-07-22|TAKE BACK RETURN|FOB|equests haggle furiously. id +28833|249|50|2|39|44820.36|0.09|0.04|N|O|1996-07-06|1996-05-27|1996-07-25|TAKE BACK RETURN|REG AIR| the carefully regular accou +28834|853|54|1|49|85938.65|0.01|0.01|N|O|1996-06-07|1996-06-01|1996-06-25|TAKE BACK RETURN|FOB|xcuses. blithely final packages +28834|1092|63|2|27|26813.43|0.04|0.08|N|O|1996-08-01|1996-06-02|1996-08-23|NONE|SHIP|pecial packa +28834|91|92|3|8|7928.72|0.08|0.08|N|O|1996-08-09|1996-06-22|1996-09-01|NONE|AIR|ly. express packages cajole carefully. +28835|1970|59|1|6|11231.82|0.06|0.03|R|F|1992-04-15|1992-06-02|1992-05-14|NONE|REG AIR|yly regular excus +28835|1525|46|2|39|55634.28|0.00|0.00|R|F|1992-07-01|1992-06-12|1992-07-12|DELIVER IN PERSON|FOB|hely special instructions nag slyly +28835|1369|46|3|34|43192.24|0.07|0.01|A|F|1992-04-06|1992-06-11|1992-04-16|TAKE BACK RETURN|RAIL|y slow deposits sleep carefully a +28836|1201|13|1|25|27555.00|0.03|0.01|R|F|1994-01-10|1994-01-08|1994-01-19|NONE|FOB|dolites serve. asymptotes use un +28836|989|58|2|10|18899.80|0.07|0.07|A|F|1993-11-15|1993-12-09|1993-12-05|NONE|MAIL|lar requests cajole sl +28836|656|57|3|4|6226.60|0.07|0.00|R|F|1993-11-25|1993-12-02|1993-11-28|DELIVER IN PERSON|FOB|c foxes poach carefully +28836|22|48|4|18|16596.36|0.08|0.07|R|F|1993-11-02|1993-11-28|1993-11-06|DELIVER IN PERSON|AIR|special, pending dependencies cajole wa +28836|286|41|5|13|15421.64|0.08|0.08|A|F|1994-02-07|1993-12-26|1994-02-13|NONE|TRUCK|dependencies sleep. f +28837|1334|35|1|3|3705.99|0.02|0.02|A|F|1993-07-18|1993-07-07|1993-08-17|DELIVER IN PERSON|FOB|gle blithely around +28837|39|40|2|37|34744.11|0.00|0.05|A|F|1993-06-20|1993-07-04|1993-07-19|TAKE BACK RETURN|FOB|s alongside +28838|1290|28|1|42|50034.18|0.01|0.06|N|O|1998-07-17|1998-08-29|1998-08-02|TAKE BACK RETURN|TRUCK|e ironic fray +28838|716|81|2|49|79218.79|0.06|0.08|N|O|1998-08-22|1998-08-08|1998-09-18|NONE|FOB|y even packa +28838|687|88|3|7|11113.76|0.01|0.03|N|O|1998-07-17|1998-09-03|1998-08-13|NONE|AIR|fter the sometimes ironic requests. fluffi +28838|907|42|4|30|54237.00|0.03|0.02|N|O|1998-09-08|1998-08-25|1998-10-03|DELIVER IN PERSON|RAIL|bold requests sleep even depos +28838|771|72|5|50|83588.50|0.03|0.03|N|O|1998-08-15|1998-08-28|1998-08-16|DELIVER IN PERSON|RAIL|ms: ironic requests use agai +28838|226|27|6|31|34912.82|0.05|0.08|N|O|1998-09-02|1998-08-16|1998-09-16|NONE|TRUCK|e quickly ironic ac +28839|1349|26|1|37|46262.58|0.00|0.08|R|F|1994-08-10|1994-07-22|1994-09-03|COLLECT COD|RAIL| special pack +28839|309|38|2|34|41116.20|0.05|0.04|A|F|1994-05-15|1994-06-15|1994-06-12|NONE|AIR|ggle furio +28839|1434|74|3|30|40062.90|0.02|0.06|A|F|1994-06-02|1994-07-03|1994-06-10|NONE|SHIP|ts cajole. never bold pi +28839|646|47|4|19|29386.16|0.09|0.00|A|F|1994-06-16|1994-07-26|1994-06-26|DELIVER IN PERSON|REG AIR|ly. furiously re +28864|1367|82|1|20|25367.20|0.01|0.07|A|F|1993-02-17|1993-01-15|1993-02-28|DELIVER IN PERSON|MAIL|ctions. pinto beans nag carefully slyly si +28864|1787|88|2|24|40530.72|0.07|0.04|A|F|1993-01-20|1992-12-17|1993-01-25|NONE|AIR| requests. sl +28865|1337|52|1|3|3714.99|0.05|0.03|N|O|1998-07-10|1998-05-18|1998-07-23|TAKE BACK RETURN|FOB| accounts c +28865|1700|83|2|42|67271.40|0.07|0.05|N|O|1998-04-28|1998-05-14|1998-05-10|DELIVER IN PERSON|REG AIR|l foxes about the quickly final instru +28866|485|15|1|21|29095.08|0.07|0.08|N|O|1997-08-28|1997-08-11|1997-09-09|DELIVER IN PERSON|AIR|y bold theodolites caj +28866|330|59|2|41|50443.53|0.04|0.01|N|O|1997-06-30|1997-07-20|1997-07-20|DELIVER IN PERSON|RAIL|regularly ironic dependen +28866|417|18|3|25|32935.25|0.08|0.03|N|O|1997-07-26|1997-07-30|1997-07-29|COLLECT COD|AIR|beans x-ray slyly! +28866|1273|85|4|37|43447.99|0.04|0.06|N|O|1997-08-23|1997-09-09|1997-09-13|TAKE BACK RETURN|MAIL|s sleep above the packages. quick +28866|1691|74|5|37|58929.53|0.08|0.02|N|O|1997-08-11|1997-07-21|1997-08-26|TAKE BACK RETURN|AIR|s are against the carefully final pint +28866|1940|41|6|32|58942.08|0.06|0.04|N|O|1997-07-09|1997-09-13|1997-07-25|DELIVER IN PERSON|RAIL|s haggle carefully. carefully pendin +28866|633|34|7|35|53677.05|0.07|0.00|N|O|1997-06-24|1997-08-16|1997-07-04|DELIVER IN PERSON|REG AIR|e slyly bold sheaves. furiousl +28867|1705|32|1|15|24100.50|0.01|0.04|N|O|1995-09-08|1995-09-30|1995-09-29|DELIVER IN PERSON|RAIL|ular requests sleep after the bold +28867|508|99|2|19|26761.50|0.10|0.03|N|O|1995-11-08|1995-09-01|1995-11-22|TAKE BACK RETURN|SHIP|rns haggle blithely beneath the +28867|347|4|3|47|58624.98|0.04|0.06|N|O|1995-09-10|1995-10-02|1995-09-22|DELIVER IN PERSON|AIR|press permanently. attainments maint +28867|1816|46|4|16|27484.96|0.01|0.04|N|O|1995-10-29|1995-09-04|1995-11-08|COLLECT COD|SHIP| instructions solve slyly around the depo +28867|170|71|5|9|9631.53|0.01|0.02|N|O|1995-09-22|1995-09-26|1995-10-14|COLLECT COD|REG AIR|r ideas. furiously even requests abo +28867|834|35|6|23|39901.09|0.02|0.04|N|O|1995-10-04|1995-09-01|1995-10-08|DELIVER IN PERSON|TRUCK|. final, ironic p +28868|1344|83|1|3|3736.02|0.04|0.06|A|F|1992-04-29|1992-06-14|1992-05-20|NONE|REG AIR|kages. carefully close accounts a +28868|37|38|2|36|33733.08|0.08|0.01|R|F|1992-07-05|1992-05-18|1992-07-24|COLLECT COD|SHIP|es engage quickly alo +28868|791|92|3|42|71055.18|0.07|0.07|R|F|1992-07-20|1992-06-20|1992-08-18|NONE|RAIL| carefully final epitaphs wa +28868|1001|2|4|40|36080.00|0.06|0.04|A|F|1992-05-28|1992-06-22|1992-06-03|COLLECT COD|REG AIR| silent instructions mold car +28869|1987|20|1|9|17000.82|0.03|0.03|N|O|1998-07-04|1998-07-17|1998-07-26|DELIVER IN PERSON|SHIP|ng to the special, ruthless pinto beans wa +28869|1046|52|2|43|40722.72|0.03|0.08|N|O|1998-09-01|1998-06-17|1998-10-01|TAKE BACK RETURN|AIR|. blithely special ideas a +28869|741|42|3|32|52535.68|0.10|0.00|N|O|1998-08-16|1998-07-19|1998-08-22|DELIVER IN PERSON|FOB|lar, final packages detect fluffily: blit +28869|1510|31|4|30|42345.30|0.09|0.05|N|O|1998-07-14|1998-06-13|1998-08-03|TAKE BACK RETURN|TRUCK|ggle furiously blithe +28870|1157|58|1|9|9523.35|0.06|0.06|N|O|1996-01-30|1996-01-23|1996-02-24|NONE|FOB| carefully regular sauternes. bold p +28870|1476|94|2|9|12397.23|0.00|0.04|N|O|1996-01-08|1995-12-16|1996-01-22|COLLECT COD|TRUCK|c ideas are. +28870|1669|70|3|40|62826.40|0.09|0.07|N|O|1995-11-28|1996-02-03|1995-12-05|NONE|TRUCK|ual instructions wake furiously among the +28870|315|100|4|38|46181.78|0.07|0.07|N|O|1996-02-29|1995-12-24|1996-03-03|NONE|SHIP|hy, final requests-- blithely regular +28870|742|75|5|30|49282.20|0.10|0.07|N|O|1996-01-25|1996-01-17|1996-01-29|COLLECT COD|RAIL|enticingly. dolphins affix carefully accord +28870|1072|43|6|13|12649.91|0.03|0.04|N|O|1995-12-23|1996-02-03|1995-12-27|NONE|TRUCK|l foxes ag +28871|1609|92|1|37|55892.20|0.00|0.05|R|F|1992-05-17|1992-05-29|1992-06-06|COLLECT COD|RAIL|ans sleep c +28871|1332|47|2|26|32066.58|0.04|0.01|A|F|1992-04-22|1992-07-10|1992-05-21|TAKE BACK RETURN|RAIL|dolites might sno +28871|1110|47|3|31|31344.41|0.05|0.03|R|F|1992-05-18|1992-05-19|1992-05-22|DELIVER IN PERSON|REG AIR|ding to the quickly ironi +28896|1175|48|1|35|37665.95|0.00|0.06|N|O|1998-10-25|1998-09-07|1998-11-24|TAKE BACK RETURN|FOB| deposits. blithely e +28896|1221|22|2|18|20199.96|0.10|0.03|N|O|1998-10-09|1998-08-27|1998-10-25|TAKE BACK RETURN|RAIL|the unusual pinto beans. quietly iron +28896|7|33|3|18|16326.00|0.06|0.02|N|O|1998-09-06|1998-09-26|1998-09-16|NONE|REG AIR|lose quickly about +28896|1209|84|4|37|41077.40|0.02|0.02|N|O|1998-08-06|1998-09-12|1998-08-30|DELIVER IN PERSON|TRUCK|structions sleep carefully even +28897|1551|32|1|46|66817.30|0.03|0.07|A|F|1994-12-01|1994-09-26|1994-12-26|TAKE BACK RETURN|MAIL| final packages u +28897|1426|44|2|49|65043.58|0.05|0.06|A|F|1994-10-30|1994-10-09|1994-11-06|DELIVER IN PERSON|SHIP|ng the ironic, +28897|1556|77|3|32|46641.60|0.08|0.00|A|F|1994-12-07|1994-11-11|1994-12-31|DELIVER IN PERSON|MAIL|e. carefully unusual instruction +28897|1332|47|4|35|43166.55|0.09|0.06|A|F|1994-12-23|1994-11-12|1995-01-01|NONE|TRUCK|o the quickly even packages +28898|485|15|1|3|4156.44|0.03|0.02|N|O|1995-07-01|1995-08-24|1995-07-16|TAKE BACK RETURN|REG AIR| silently special pinto be +28898|279|61|2|43|50708.61|0.00|0.05|N|O|1995-07-28|1995-08-26|1995-08-12|COLLECT COD|TRUCK|ly express pint +28898|106|59|3|24|24146.40|0.00|0.04|N|O|1995-07-07|1995-07-21|1995-07-26|COLLECT COD|TRUCK|ccording to the even courts. +28898|282|64|4|19|22463.32|0.08|0.04|N|O|1995-07-18|1995-08-09|1995-08-03|NONE|AIR|unts. furiously +28898|1878|65|5|11|19578.57|0.10|0.04|N|O|1995-08-07|1995-08-06|1995-08-30|COLLECT COD|TRUCK|about the slyly final din +28899|1444|45|1|44|59199.36|0.03|0.07|R|F|1992-09-29|1992-08-29|1992-10-04|NONE|MAIL|lithely about the slyl +28899|1098|99|2|33|32969.97|0.06|0.01|A|F|1992-07-04|1992-09-09|1992-07-22|COLLECT COD|REG AIR|ular, express ideas. blithely even ins +28899|128|7|3|9|9253.08|0.02|0.05|R|F|1992-10-11|1992-08-14|1992-10-13|DELIVER IN PERSON|REG AIR|nts. furiously pending accounts haggle +28899|965|34|4|44|82102.24|0.10|0.00|R|F|1992-07-31|1992-07-29|1992-08-09|DELIVER IN PERSON|TRUCK|ckages. furiously special platelet +28899|1571|92|5|25|36814.25|0.00|0.01|A|F|1992-07-11|1992-07-17|1992-08-10|NONE|RAIL|ar packages. thinly final depos +28899|1434|13|6|3|4006.29|0.06|0.00|A|F|1992-08-27|1992-09-13|1992-08-29|DELIVER IN PERSON|REG AIR|ole blithely. +28899|1661|44|7|15|23439.90|0.06|0.06|A|F|1992-09-02|1992-08-03|1992-09-06|TAKE BACK RETURN|REG AIR|y accordin +28900|280|81|1|25|29507.00|0.03|0.00|N|O|1996-11-14|1996-10-05|1996-12-02|DELIVER IN PERSON|RAIL|riously regular packages mold carefully +28900|2|53|2|42|37884.00|0.06|0.06|N|O|1996-10-03|1996-10-06|1996-10-25|DELIVER IN PERSON|SHIP|uests. blithely final theod +28900|443|2|3|35|47020.40|0.00|0.06|N|O|1996-12-28|1996-10-12|1997-01-01|DELIVER IN PERSON|MAIL|ourts breach silently slow +28900|1819|20|4|12|20649.72|0.07|0.02|N|O|1996-09-19|1996-10-04|1996-10-09|TAKE BACK RETURN|RAIL|sits. fluffily pending accounts detect b +28900|1728|29|5|12|19556.64|0.01|0.08|N|O|1996-12-19|1996-10-04|1997-01-11|DELIVER IN PERSON|RAIL|ual pinto beans haggl +28901|154|55|1|47|49545.05|0.00|0.05|R|F|1992-09-11|1992-08-27|1992-09-23|DELIVER IN PERSON|AIR|y pending ideas among the +28901|155|34|2|1|1055.15|0.06|0.04|A|F|1992-06-22|1992-08-09|1992-07-20|NONE|TRUCK|nusual, silent court +28901|503|64|3|29|40701.50|0.00|0.05|A|F|1992-08-10|1992-09-04|1992-09-03|COLLECT COD|REG AIR|s. furiously final +28901|368|97|4|9|11415.24|0.06|0.05|A|F|1992-07-13|1992-08-13|1992-07-27|TAKE BACK RETURN|FOB|s the slyly regular packages. request +28901|271|53|5|5|5856.35|0.05|0.08|R|F|1992-09-05|1992-09-07|1992-09-24|COLLECT COD|SHIP|ully final packages. pinto beans throu +28901|1907|96|6|19|34369.10|0.02|0.05|A|F|1992-08-27|1992-07-29|1992-09-21|DELIVER IN PERSON|AIR|. slyly fluffy requests detect qui +28902|145|24|1|30|31354.20|0.05|0.01|R|F|1992-02-17|1992-03-31|1992-02-24|COLLECT COD|AIR|uests. final, unusual deposits cajo +28902|1320|59|2|25|30533.00|0.03|0.00|R|F|1992-03-07|1992-03-07|1992-03-20|DELIVER IN PERSON|FOB|ites according to the carefully re +28902|918|87|3|21|38197.11|0.06|0.04|R|F|1992-02-16|1992-03-15|1992-03-10|DELIVER IN PERSON|FOB|re furiously across the regular do +28902|127|54|4|15|15406.80|0.04|0.06|R|F|1992-05-20|1992-04-17|1992-05-22|NONE|SHIP|ost slyly quickly ironic requests. +28902|832|33|5|12|20793.96|0.04|0.00|R|F|1992-04-28|1992-03-27|1992-05-21|TAKE BACK RETURN|FOB|bravely unusual requests b +28902|503|94|6|44|61754.00|0.02|0.01|R|F|1992-02-12|1992-03-11|1992-03-01|NONE|FOB|es. furious +28902|79|5|7|28|27413.96|0.08|0.02|A|F|1992-02-23|1992-02-26|1992-03-02|TAKE BACK RETURN|TRUCK|ing packages. slyly eve +28903|1716|1|1|32|51766.72|0.08|0.01|R|F|1994-08-14|1994-09-09|1994-08-21|NONE|SHIP| the pinto beans. regul +28903|527|88|2|17|24267.84|0.05|0.03|A|F|1994-10-04|1994-11-01|1994-10-12|COLLECT COD|FOB|eep blithel +28903|633|96|3|25|38340.75|0.03|0.07|A|F|1994-09-04|1994-10-16|1994-09-10|COLLECT COD|MAIL| accounts. regular dinos use slyly final d +28928|773|6|1|13|21759.01|0.07|0.05|R|F|1993-08-10|1993-07-14|1993-09-03|TAKE BACK RETURN|SHIP|es are with the +28928|701|66|2|3|4805.10|0.09|0.00|R|F|1993-07-27|1993-07-09|1993-08-08|NONE|RAIL|slyly thin d +28928|1660|61|3|13|20301.58|0.07|0.03|A|F|1993-07-09|1993-07-16|1993-07-16|COLLECT COD|FOB|y unusual accounts thrash pending accounts. +28928|1823|67|4|22|37946.04|0.08|0.00|R|F|1993-06-15|1993-06-10|1993-07-07|TAKE BACK RETURN|AIR|y special requests +28928|1520|41|5|38|54017.76|0.05|0.01|A|F|1993-08-02|1993-07-15|1993-08-04|DELIVER IN PERSON|AIR|ts. furiously idle packag +28928|306|35|6|19|22919.70|0.00|0.06|A|F|1993-05-08|1993-06-13|1993-05-30|TAKE BACK RETURN|SHIP|he furiously caref +28928|385|42|7|13|16709.94|0.03|0.07|R|F|1993-07-23|1993-06-21|1993-07-31|NONE|TRUCK|ts. slyly quiet f +28929|209|64|1|30|33276.00|0.01|0.05|R|F|1993-01-24|1992-12-17|1993-01-26|COLLECT COD|REG AIR|efully express dependencies poach +28929|388|17|2|18|23190.84|0.05|0.05|A|F|1992-11-30|1992-12-24|1992-12-25|NONE|FOB|blithely ironic dep +28929|1675|58|3|2|3153.34|0.10|0.06|A|F|1992-12-15|1992-11-10|1992-12-16|NONE|FOB|quests sleep ironically fluffil +28929|1298|99|4|10|11992.90|0.04|0.08|R|F|1993-01-08|1992-11-17|1993-01-18|DELIVER IN PERSON|SHIP|theodolites nag carefully thro +28929|531|32|5|39|55829.67|0.02|0.06|A|F|1993-01-19|1992-12-20|1993-02-16|TAKE BACK RETURN|MAIL|pecial excuses nag according to th +28930|523|54|1|8|11388.16|0.02|0.01|N|O|1998-03-11|1998-01-31|1998-03-19|TAKE BACK RETURN|TRUCK|grow furiously blithely spec +28930|1051|87|2|33|31417.65|0.02|0.04|N|O|1997-12-11|1998-03-08|1998-01-03|TAKE BACK RETURN|SHIP|ages wake carefully about the fluffily expr +28930|364|21|3|8|10114.88|0.07|0.05|N|O|1997-12-19|1998-03-09|1997-12-31|DELIVER IN PERSON|AIR|leep slyly according to the blithely +28930|1337|14|4|45|55724.85|0.02|0.08|N|O|1998-01-26|1998-01-21|1998-02-16|TAKE BACK RETURN|FOB|he regular, ironic deposits detec +28930|1604|87|5|24|36134.40|0.04|0.08|N|O|1998-01-25|1998-01-13|1998-02-11|COLLECT COD|RAIL|ntegrate. ironic, regular accounts sleep. +28930|334|63|6|8|9874.64|0.07|0.01|N|O|1998-03-17|1998-03-03|1998-04-03|DELIVER IN PERSON|RAIL| quickly permanent accounts: packages +28930|765|98|7|13|21654.88|0.05|0.03|N|O|1998-01-25|1998-02-14|1998-02-02|NONE|TRUCK|as cajole blithely ironic, +28931|383|68|1|27|34651.26|0.07|0.07|N|O|1995-07-06|1995-08-11|1995-07-16|NONE|TRUCK|s. regular packages use fluffil +28931|194|21|2|45|49238.55|0.08|0.08|N|O|1995-07-23|1995-08-10|1995-08-07|COLLECT COD|FOB|nstructions about the flu +28931|1088|24|3|7|6923.56|0.02|0.07|N|O|1995-09-12|1995-09-14|1995-09-22|DELIVER IN PERSON|SHIP|posits boost blithely under the iron +28931|1177|50|4|17|18328.89|0.08|0.00|N|O|1995-09-12|1995-08-21|1995-09-30|TAKE BACK RETURN|REG AIR| close, final excus +28932|173|100|1|49|52585.33|0.02|0.04|R|F|1993-08-20|1993-08-25|1993-08-24|NONE|RAIL|odolites. furiously sly excuses +28932|399|100|2|33|42879.87|0.10|0.08|R|F|1993-09-05|1993-10-14|1993-09-08|DELIVER IN PERSON|REG AIR|ymptotes cajole sl +28932|1677|1|3|2|3157.34|0.09|0.06|A|F|1993-09-10|1993-08-23|1993-10-05|DELIVER IN PERSON|AIR|ly. slyly regular theodolites alongside of +28932|16|42|4|45|41220.45|0.04|0.08|R|F|1993-08-12|1993-08-23|1993-08-21|DELIVER IN PERSON|MAIL|s. carefully bold forges wake fluffily +28933|374|75|1|7|8920.59|0.09|0.06|R|F|1994-09-23|1994-08-13|1994-10-23|COLLECT COD|AIR|sts. quickly unus +28933|108|35|2|11|11089.10|0.09|0.02|R|F|1994-08-25|1994-09-01|1994-09-22|TAKE BACK RETURN|AIR|dinos haggle carefully ag +28933|1045|81|3|4|3784.16|0.05|0.04|A|F|1994-08-09|1994-10-08|1994-08-20|NONE|SHIP|against th +28933|337|66|4|33|40831.89|0.04|0.06|R|F|1994-07-30|1994-09-18|1994-08-28|COLLECT COD|MAIL|al packages. furiously unusual accounts hag +28934|301|2|1|7|8409.10|0.02|0.06|A|F|1993-01-10|1993-02-26|1993-01-20|COLLECT COD|REG AIR|accounts. finall +28934|1031|67|2|38|35417.14|0.08|0.07|R|F|1992-11-30|1993-02-19|1992-12-29|DELIVER IN PERSON|FOB| pending foxes. furiousl +28934|591|92|3|33|49222.47|0.07|0.00|A|F|1993-02-18|1993-02-02|1993-02-23|COLLECT COD|FOB|yly about the silent, regul +28934|1305|20|4|23|27744.90|0.03|0.01|R|F|1992-12-07|1993-01-07|1992-12-24|COLLECT COD|AIR|hs integrate carefully slyl +28934|400|29|5|14|18205.60|0.04|0.08|R|F|1993-02-12|1993-01-02|1993-03-13|DELIVER IN PERSON|FOB|nd the furiously pending pa +28934|32|8|6|11|10252.33|0.03|0.05|R|F|1992-12-29|1993-01-27|1993-01-21|DELIVER IN PERSON|FOB|xpress pinto beans boost finally care +28935|1617|41|1|8|12148.88|0.01|0.03|N|O|1997-11-11|1997-12-24|1997-11-29|COLLECT COD|MAIL|ly bold packages. ironic sheave +28935|372|73|2|23|29264.51|0.03|0.06|N|O|1998-01-02|1997-12-12|1998-01-30|NONE|AIR|sly express dolphins boost platel +28935|1523|24|3|7|9971.64|0.07|0.05|N|O|1998-03-02|1997-12-09|1998-03-20|TAKE BACK RETURN|FOB|s cajole furiously. slyly regular asymptote +28935|1578|79|4|35|51784.95|0.06|0.07|N|O|1997-12-22|1998-01-03|1998-01-14|NONE|AIR|ay quickly. +28935|917|20|5|3|5453.73|0.07|0.04|N|O|1998-01-10|1997-12-13|1998-01-31|COLLECT COD|FOB|riously even requ +28935|1142|79|6|16|16690.24|0.06|0.01|N|O|1998-02-11|1998-01-17|1998-02-21|TAKE BACK RETURN|REG AIR|esias. slyly regul +28935|463|22|7|29|39540.34|0.10|0.02|N|O|1998-02-05|1998-01-08|1998-02-20|NONE|SHIP|g somas after the unusual pains are f +28960|539|100|1|48|69097.44|0.01|0.04|N|O|1998-03-08|1998-04-15|1998-04-04|TAKE BACK RETURN|AIR|ly bold deposits. +28960|1446|86|2|32|43118.08|0.05|0.01|N|O|1998-04-30|1998-04-10|1998-05-04|TAKE BACK RETURN|RAIL|oxes boost furiously final ideas. sly +28961|1492|10|1|4|5573.96|0.00|0.05|N|O|1998-01-08|1998-02-06|1998-02-05|TAKE BACK RETURN|MAIL| after the blithe +28962|1138|39|1|5|5195.65|0.02|0.05|N|O|1997-10-24|1997-10-21|1997-11-03|DELIVER IN PERSON|REG AIR|c deposits. ca +28962|710|11|2|44|70871.24|0.00|0.05|N|O|1997-10-04|1997-10-31|1997-11-02|NONE|TRUCK|ously quickly ex +28963|1622|64|1|6|9141.72|0.04|0.07|N|O|1996-04-04|1996-02-07|1996-04-20|DELIVER IN PERSON|TRUCK|egular requests. furiously +28963|1112|21|2|25|25327.75|0.02|0.05|N|O|1996-01-04|1996-01-25|1996-01-26|TAKE BACK RETURN|FOB|nto beans? blithely +28963|741|42|3|37|60744.38|0.06|0.01|N|O|1996-03-17|1996-02-16|1996-03-21|DELIVER IN PERSON|REG AIR|are final packages. pi +28963|1608|50|4|14|21134.40|0.00|0.07|N|O|1996-01-30|1996-02-13|1996-02-16|TAKE BACK RETURN|MAIL|ully even deposits haggle. even deposit +28963|1443|61|5|31|41677.64|0.03|0.05|N|O|1996-03-06|1996-02-20|1996-03-16|NONE|FOB|as haggle slyly furiously s +28964|1248|23|1|16|18387.84|0.10|0.04|N|O|1998-03-20|1998-01-31|1998-04-01|DELIVER IN PERSON|TRUCK|ites cajole fluffily. even, bold depo +28964|687|19|2|24|38104.32|0.02|0.05|N|O|1997-12-15|1998-02-03|1998-01-06|DELIVER IN PERSON|AIR|foxes. carefully pending accou +28964|1858|88|3|7|12318.95|0.10|0.00|N|O|1997-12-09|1998-02-12|1998-01-01|DELIVER IN PERSON|REG AIR|ites. fluffily bold ideas cajole r +28964|384|85|4|31|39815.78|0.05|0.06|N|O|1997-12-20|1998-02-15|1998-01-13|COLLECT COD|FOB|wake? silent, final accounts nag +28964|1594|35|5|23|34398.57|0.03|0.06|N|O|1997-12-01|1998-02-02|1997-12-07|COLLECT COD|RAIL|cies. blithely special frets mus +28964|1537|58|6|23|33086.19|0.01|0.05|N|O|1997-12-19|1998-01-05|1998-01-01|TAKE BACK RETURN|SHIP|s. ironic, ironic requ +28965|1693|76|1|35|55814.15|0.10|0.04|N|O|1996-08-29|1996-07-01|1996-09-28|DELIVER IN PERSON|SHIP|ily according to the slyly silent +28965|545|6|2|12|17346.48|0.03|0.03|N|O|1996-07-29|1996-07-25|1996-08-01|DELIVER IN PERSON|MAIL|ly except the packages. foxes nag slyly reg +28965|1391|92|3|18|23263.02|0.06|0.02|N|O|1996-06-22|1996-07-23|1996-07-21|DELIVER IN PERSON|RAIL| foxes. furiously bold accounts +28965|245|27|4|45|51535.80|0.07|0.01|N|O|1996-06-05|1996-07-17|1996-06-26|COLLECT COD|RAIL| regular deposits amon +28965|1867|97|5|11|19457.46|0.00|0.07|N|O|1996-07-22|1996-08-03|1996-08-14|DELIVER IN PERSON|REG AIR|ggle evenly bold +28966|1603|45|1|14|21064.40|0.05|0.00|R|F|1994-09-08|1994-12-01|1994-10-07|COLLECT COD|SHIP|uickly ironic theodoli +28967|370|55|1|47|59707.39|0.08|0.03|A|F|1994-10-12|1994-10-24|1994-10-30|NONE|SHIP|egular multipliers are +28967|882|82|2|28|49920.64|0.05|0.02|R|F|1994-11-10|1994-11-13|1994-12-10|NONE|SHIP|n blithely +28992|119|46|1|11|11210.21|0.06|0.07|N|O|1996-01-09|1995-10-29|1996-02-03|COLLECT COD|MAIL|wake quickly. sly +28992|1131|68|2|17|17546.21|0.09|0.07|N|O|1995-11-10|1995-12-12|1995-12-03|DELIVER IN PERSON|TRUCK|equests wake carefully acr +28992|899|100|3|10|17998.90|0.06|0.00|N|O|1995-11-11|1995-11-25|1995-11-18|COLLECT COD|TRUCK|sts nod blithely after the furious +28992|1078|84|4|10|9790.70|0.02|0.07|N|O|1995-10-08|1995-11-03|1995-11-04|TAKE BACK RETURN|TRUCK|d the furiou +28992|1716|1|5|2|3235.42|0.02|0.07|N|O|1995-12-04|1995-10-24|1995-12-08|DELIVER IN PERSON|MAIL|kages? care +28993|42|93|1|47|44275.88|0.06|0.01|A|F|1995-04-22|1995-05-08|1995-04-23|DELIVER IN PERSON|AIR|t theodolites affix furiou +28994|581|82|1|31|45928.98|0.06|0.00|N|O|1998-09-09|1998-07-21|1998-09-19|TAKE BACK RETURN|AIR|. enticingly silent i +28994|571|32|2|47|69163.79|0.08|0.01|N|O|1998-07-20|1998-08-31|1998-07-30|DELIVER IN PERSON|MAIL|y unusual r +28994|525|26|3|47|66999.44|0.08|0.02|N|O|1998-07-21|1998-08-23|1998-08-01|DELIVER IN PERSON|FOB|deposits. carefully sly deposits +28994|1531|72|4|10|14325.30|0.02|0.08|N|O|1998-09-23|1998-08-24|1998-09-27|TAKE BACK RETURN|MAIL| the packages mold furious +28995|998|33|1|28|53171.72|0.01|0.01|A|F|1993-05-18|1993-07-06|1993-06-10|DELIVER IN PERSON|TRUCK|quests among the final, regular ac +28995|755|56|2|49|81131.75|0.05|0.05|A|F|1993-07-25|1993-08-11|1993-08-19|COLLECT COD|REG AIR|sts. carefully bold dependencies cajole fu +28995|1337|38|3|3|3714.99|0.00|0.00|A|F|1993-05-28|1993-06-24|1993-06-12|NONE|AIR|ar, even requests. ironic theodo +28995|46|97|4|32|30273.28|0.06|0.00|A|F|1993-08-14|1993-06-24|1993-08-30|NONE|RAIL|otes nag against the ev +28995|1116|89|5|29|29496.19|0.00|0.02|A|F|1993-08-09|1993-07-18|1993-08-10|NONE|AIR|ing to the always bold epitaphs. f +28995|1663|5|6|38|59457.08|0.06|0.05|R|F|1993-08-29|1993-08-03|1993-09-16|TAKE BACK RETURN|RAIL|es. final dolphins cajole quick +28995|1349|64|7|33|41261.22|0.06|0.05|A|F|1993-08-10|1993-07-09|1993-08-31|NONE|SHIP|the instructi +28996|773|70|1|47|78667.19|0.06|0.04|N|O|1997-06-15|1997-07-10|1997-07-07|DELIVER IN PERSON|FOB|escapades. unusual pinto beans against +28996|458|46|2|24|32602.80|0.03|0.02|N|O|1997-08-14|1997-07-18|1997-08-17|TAKE BACK RETURN|TRUCK| platelets haggle carefully +28996|657|20|3|16|24922.40|0.09|0.03|N|O|1997-06-15|1997-07-21|1997-06-28|NONE|MAIL|anent accounts haggle slyly blith +28996|168|21|4|22|23499.52|0.08|0.05|N|O|1997-05-26|1997-06-26|1997-05-31|DELIVER IN PERSON|MAIL|es wake quick +28996|327|12|5|23|28228.36|0.02|0.07|N|O|1997-08-09|1997-07-02|1997-08-28|DELIVER IN PERSON|MAIL|nto beans sleep slyly. quic +28996|1391|68|6|26|33602.14|0.05|0.02|N|O|1997-07-23|1997-05-23|1997-08-22|TAKE BACK RETURN|RAIL| the fluffy a +28996|1331|8|7|43|52990.19|0.08|0.07|N|O|1997-07-06|1997-07-01|1997-08-01|NONE|RAIL|, unusual frets. slyly pending asymptot +28997|1375|52|1|23|29356.51|0.05|0.07|N|O|1998-01-23|1997-12-24|1998-02-05|COLLECT COD|RAIL|express foxes use ironic depos +28997|347|48|2|35|43656.90|0.09|0.05|N|O|1998-01-10|1998-01-08|1998-02-04|NONE|AIR|y silent pinto be +28997|1474|53|3|32|44015.04|0.06|0.08|N|O|1997-11-05|1998-01-22|1997-11-14|DELIVER IN PERSON|FOB|y ironic packages use fluffily. accoun +28997|472|2|4|17|23331.99|0.09|0.08|N|O|1998-02-16|1997-12-18|1998-03-08|COLLECT COD|SHIP|ep. regular platelets +28998|388|17|1|2|2576.76|0.05|0.02|R|F|1992-03-28|1992-05-13|1992-03-31|TAKE BACK RETURN|RAIL|s. unusual excuses sublate slyly silent she +28999|53|29|1|14|13342.70|0.03|0.01|R|F|1994-04-23|1994-02-23|1994-05-21|COLLECT COD|AIR|es. blithely furious dependencies use fluf +28999|1641|24|2|43|66333.52|0.09|0.01|R|F|1994-01-25|1994-03-24|1994-02-21|NONE|MAIL|deposits. ironic somas sleep caref +29024|794|95|1|48|81349.92|0.10|0.03|R|F|1992-07-17|1992-06-30|1992-08-05|TAKE BACK RETURN|FOB|excuses. quickly bold reque +29024|705|70|2|50|80285.00|0.10|0.02|R|F|1992-05-12|1992-05-24|1992-05-18|TAKE BACK RETURN|TRUCK|ly even packages across th +29025|1353|92|1|9|11289.15|0.08|0.01|A|F|1994-09-13|1994-08-21|1994-09-27|DELIVER IN PERSON|AIR|lyly. furiously ironic dinos wake quickl +29025|1798|41|2|8|13598.32|0.06|0.04|R|F|1994-09-13|1994-08-28|1994-09-17|TAKE BACK RETURN|RAIL|ckages among the final pinto b +29025|1008|9|3|23|20907.00|0.05|0.08|R|F|1994-08-13|1994-08-20|1994-09-12|DELIVER IN PERSON|REG AIR|l requests must have to nag quickly slow th +29026|169|22|1|39|41697.24|0.05|0.00|N|O|1995-09-11|1995-11-17|1995-09-20|COLLECT COD|SHIP|ronic instruc +29026|192|71|2|42|45871.98|0.00|0.05|N|O|1995-10-28|1995-10-05|1995-11-13|COLLECT COD|FOB|ly sometimes unusual +29026|1505|46|3|30|42195.00|0.01|0.04|N|O|1995-10-13|1995-10-29|1995-11-01|TAKE BACK RETURN|SHIP|kly express packages serve a +29027|102|3|1|50|50105.00|0.05|0.06|R|F|1994-10-19|1994-10-09|1994-11-10|COLLECT COD|TRUCK|slyly blithe accoun +29027|734|35|2|48|78467.04|0.07|0.07|A|F|1994-07-28|1994-09-07|1994-08-06|NONE|REG AIR|regular theodolites are after the iron +29027|234|89|3|24|27221.52|0.01|0.07|A|F|1994-08-29|1994-09-09|1994-09-26|TAKE BACK RETURN|FOB|p carefully express accounts. slyly en +29027|1887|88|4|30|53666.40|0.08|0.04|R|F|1994-08-04|1994-08-27|1994-08-05|DELIVER IN PERSON|FOB|onic ideas. slyly pending instructi +29027|1354|93|5|35|43937.25|0.03|0.06|R|F|1994-09-15|1994-09-14|1994-09-17|DELIVER IN PERSON|TRUCK| quickly ac +29027|913|14|6|4|7255.64|0.06|0.00|R|F|1994-07-30|1994-08-25|1994-08-16|TAKE BACK RETURN|REG AIR|tes; slyly +29028|1161|70|1|13|13808.08|0.02|0.05|A|F|1995-05-14|1995-04-29|1995-06-03|DELIVER IN PERSON|RAIL|ns. enticingly unusual acco +29028|1040|46|2|50|47052.00|0.06|0.08|R|F|1995-04-08|1995-04-01|1995-04-23|NONE|AIR|e even, even foxes wake furiously agains +29028|224|79|3|44|49465.68|0.04|0.05|A|F|1995-05-02|1995-03-30|1995-05-31|TAKE BACK RETURN|AIR|y. slyly express +29028|1576|97|4|24|35461.68|0.07|0.06|R|F|1995-05-13|1995-04-21|1995-05-31|NONE|SHIP|ake regular instruct +29029|196|23|1|27|29597.13|0.03|0.03|N|O|1997-09-25|1997-08-28|1997-10-03|NONE|RAIL|e quickly ironic depend +29029|1359|98|2|3|3781.05|0.08|0.07|N|O|1997-07-29|1997-09-15|1997-07-31|DELIVER IN PERSON|MAIL| carefully pe +29029|1224|62|3|43|48384.46|0.07|0.08|N|O|1997-10-16|1997-09-04|1997-11-13|NONE|RAIL| the slyly even d +29029|507|38|4|10|14075.00|0.08|0.08|N|O|1997-08-12|1997-10-12|1997-08-28|TAKE BACK RETURN|FOB|ly regular dependen +29029|825|25|5|20|34516.40|0.06|0.02|N|O|1997-07-28|1997-09-14|1997-08-12|COLLECT COD|FOB|uctions sleep about the depo +29029|572|33|6|32|47122.24|0.08|0.05|N|O|1997-08-04|1997-10-19|1997-08-13|TAKE BACK RETURN|RAIL|lar asympto +29029|1032|38|7|18|16794.54|0.00|0.05|N|O|1997-08-22|1997-09-29|1997-08-30|NONE|RAIL| ironic theo +29030|666|67|1|42|65799.72|0.04|0.08|A|F|1992-04-02|1992-02-22|1992-04-28|COLLECT COD|REG AIR| foxes doze after the unusua +29031|1798|25|1|6|10198.74|0.01|0.08|N|O|1998-02-16|1997-11-24|1998-03-01|COLLECT COD|REG AIR| impress quickly re +29031|547|78|2|29|41978.66|0.10|0.04|N|O|1997-12-12|1997-12-20|1998-01-01|TAKE BACK RETURN|RAIL|ms. slyly unusual d +29056|281|63|1|39|46069.92|0.10|0.06|A|F|1995-03-31|1995-02-24|1995-04-19|COLLECT COD|RAIL|ans detect quic +29056|528|89|2|22|31427.44|0.07|0.08|R|F|1995-03-28|1995-02-26|1995-04-26|DELIVER IN PERSON|FOB|heodolites. blithely regular deposits wake +29056|267|95|3|29|33850.54|0.03|0.08|R|F|1995-03-02|1995-02-22|1995-03-10|TAKE BACK RETURN|SHIP|nal packages. entic +29056|720|85|4|44|71311.68|0.05|0.05|R|F|1995-03-29|1995-02-20|1995-04-12|COLLECT COD|RAIL|ress packages. excuses +29056|1819|49|5|11|18928.91|0.00|0.03|R|F|1995-02-11|1995-03-03|1995-02-20|NONE|RAIL|iously final accounts haggle. even +29056|250|5|6|33|37958.25|0.06|0.04|R|F|1995-02-08|1995-02-13|1995-03-06|TAKE BACK RETURN|FOB|ording to the final +29057|1406|24|1|42|54910.80|0.00|0.03|N|O|1997-08-16|1997-08-14|1997-08-20|DELIVER IN PERSON|AIR|deposits. +29057|1210|11|2|39|43337.19|0.02|0.00|N|O|1997-06-19|1997-07-10|1997-07-05|TAKE BACK RETURN|MAIL|ithout the tithes. regular +29057|987|88|3|33|62303.34|0.01|0.04|N|O|1997-07-26|1997-08-15|1997-08-21|COLLECT COD|AIR|xcuses. quickly pending warhorses along the +29057|1599|20|4|38|57022.42|0.07|0.06|N|O|1997-09-06|1997-07-24|1997-09-26|COLLECT COD|TRUCK|e slyly ironic requ +29057|1081|52|5|31|30444.48|0.01|0.07|N|O|1997-07-06|1997-08-27|1997-07-27|NONE|SHIP|ly unusual +29057|127|28|6|15|15406.80|0.10|0.02|N|O|1997-07-01|1997-08-22|1997-07-28|TAKE BACK RETURN|FOB|ged packages sleep pearls. bli +29057|106|85|7|22|22134.20|0.07|0.01|N|O|1997-09-25|1997-08-28|1997-10-01|DELIVER IN PERSON|FOB|yly ironic i +29058|1334|11|1|49|60531.17|0.01|0.01|R|F|1993-03-12|1993-03-23|1993-04-09|COLLECT COD|MAIL|jole quickly +29058|1464|82|2|40|54618.40|0.01|0.04|R|F|1993-01-27|1993-02-25|1993-02-10|NONE|TRUCK|luffily about the expres +29058|1836|37|3|16|27805.28|0.10|0.03|R|F|1993-03-27|1993-03-17|1993-04-06|DELIVER IN PERSON|RAIL|ckly ironic ideas x-ray. unusual, regula +29058|167|20|4|45|48022.20|0.02|0.04|R|F|1993-02-25|1993-02-25|1993-03-10|NONE|AIR| sometimes. b +29058|1351|90|5|20|25047.00|0.09|0.07|R|F|1993-02-10|1993-03-28|1993-02-12|DELIVER IN PERSON|AIR|riously fl +29058|302|59|6|49|58912.70|0.00|0.01|A|F|1993-05-01|1993-03-30|1993-05-26|COLLECT COD|AIR|equests. blithely regular pint +29058|136|15|7|42|43517.46|0.02|0.05|R|F|1993-03-31|1993-02-07|1993-04-20|COLLECT COD|REG AIR|ests use slyly close req +29059|1780|81|1|46|77361.88|0.08|0.01|N|O|1998-01-09|1997-12-30|1998-01-13|COLLECT COD|REG AIR|bove the final, ironic foxes. expre +29059|818|85|2|7|12031.67|0.09|0.00|N|O|1997-12-18|1997-12-30|1998-01-16|DELIVER IN PERSON|MAIL| ironic ideas sleep across +29059|1658|100|3|40|62386.00|0.01|0.06|N|O|1998-01-14|1997-12-25|1998-01-25|NONE|TRUCK|ets are blithely ent +29059|396|81|4|11|14260.29|0.02|0.03|N|O|1998-01-01|1998-01-22|1998-01-24|DELIVER IN PERSON|FOB|ess deposits need to solve. +29059|765|98|5|9|14991.84|0.05|0.01|N|O|1997-12-26|1997-12-28|1998-01-04|COLLECT COD|AIR|. slyly final foxes haggl +29060|993|94|1|22|41667.78|0.03|0.04|N|O|1997-08-06|1997-06-27|1997-08-07|DELIVER IN PERSON|SHIP|ay blithely upon the slyly regular deposit +29061|1656|98|1|48|74767.20|0.00|0.03|N|O|1997-03-19|1997-02-27|1997-03-25|NONE|REG AIR|s about the blithely +29061|1717|60|2|18|29136.78|0.03|0.07|N|O|1997-01-24|1997-04-12|1997-02-05|COLLECT COD|RAIL|final deposits. de +29061|645|46|3|3|4636.92|0.01|0.04|N|O|1997-04-06|1997-03-04|1997-04-18|COLLECT COD|AIR|nic sentiments. thinly final requests a +29061|878|12|4|37|65818.19|0.04|0.00|N|O|1997-03-06|1997-02-21|1997-04-04|NONE|SHIP|ong the dependen +29062|1422|1|1|10|13234.20|0.08|0.05|R|F|1994-12-11|1995-01-09|1994-12-17|DELIVER IN PERSON|MAIL|yly even, regular +29063|1670|53|1|32|50293.44|0.05|0.06|A|F|1993-09-13|1993-06-20|1993-09-21|NONE|REG AIR|luffily fi +29063|86|12|2|7|6902.56|0.00|0.03|A|F|1993-09-06|1993-06-29|1993-09-11|TAKE BACK RETURN|RAIL|e. blithely blithe dependencies wake car +29063|117|96|3|45|45769.95|0.08|0.03|A|F|1993-06-14|1993-07-04|1993-07-09|COLLECT COD|RAIL|uternes breach after the final, regular dol +29063|424|54|4|27|35759.34|0.05|0.07|R|F|1993-08-12|1993-07-07|1993-09-05|NONE|FOB| stealthily even +29063|457|58|5|36|48868.20|0.04|0.01|A|F|1993-08-08|1993-06-22|1993-08-18|NONE|REG AIR|nic deposits. +29088|1280|18|1|22|25988.16|0.07|0.05|N|O|1997-08-31|1997-10-28|1997-09-22|TAKE BACK RETURN|SHIP|eat above the s +29088|1660|2|2|45|70274.70|0.04|0.04|N|O|1997-10-17|1997-11-21|1997-10-19|DELIVER IN PERSON|SHIP|quickly ex +29088|1059|65|3|35|33601.75|0.07|0.02|N|O|1997-09-06|1997-10-15|1997-09-09|TAKE BACK RETURN|MAIL|he pending accou +29088|1708|93|4|39|62778.30|0.02|0.07|N|O|1997-10-30|1997-10-03|1997-11-22|TAKE BACK RETURN|REG AIR|ffix furiousl +29089|682|14|1|32|50645.76|0.04|0.03|N|O|1997-03-31|1997-04-30|1997-04-26|COLLECT COD|FOB|sly final requests boost c +29089|391|20|2|17|21953.63|0.00|0.03|N|O|1997-05-02|1997-04-12|1997-05-04|DELIVER IN PERSON|TRUCK|ess pinto beans hang quickl +29089|1921|54|3|43|78385.56|0.09|0.05|N|O|1997-03-21|1997-05-13|1997-04-12|NONE|REG AIR|l foxes haggle furiously. caref +29089|1426|5|4|49|65043.58|0.00|0.08|N|O|1997-06-15|1997-05-09|1997-06-26|TAKE BACK RETURN|MAIL|about the fluffily even ac +29089|536|67|5|10|14365.30|0.00|0.08|N|O|1997-05-10|1997-06-02|1997-05-29|COLLECT COD|REG AIR| even foxes. r +29089|1029|35|6|38|35340.76|0.00|0.00|N|O|1997-05-14|1997-04-20|1997-06-11|DELIVER IN PERSON|RAIL|furiously silen +29090|552|13|1|46|66817.30|0.02|0.01|R|F|1992-03-22|1992-02-29|1992-03-23|TAKE BACK RETURN|AIR|hless requests ca +29090|1266|4|2|2|2334.52|0.07|0.07|A|F|1992-05-08|1992-03-10|1992-05-18|COLLECT COD|FOB|ged requests. exp +29090|343|100|3|12|14920.08|0.08|0.01|R|F|1992-03-13|1992-03-10|1992-03-23|DELIVER IN PERSON|SHIP|cies haggle blithely +29090|1147|20|4|17|17818.38|0.09|0.02|A|F|1992-04-09|1992-03-16|1992-05-06|NONE|REG AIR|usly. pending, ironic instructions wake a +29090|317|18|5|23|27998.13|0.04|0.03|R|F|1992-04-13|1992-04-07|1992-05-05|DELIVER IN PERSON|FOB|eposits. always final packages wa +29090|987|90|6|3|5663.94|0.03|0.05|R|F|1992-05-17|1992-03-01|1992-05-21|TAKE BACK RETURN|FOB|cross the furiously +29090|1834|78|7|41|71169.03|0.04|0.08|R|F|1992-01-28|1992-04-07|1992-02-19|TAKE BACK RETURN|REG AIR|ever pending packages after the specia +29091|54|5|1|9|8586.45|0.02|0.02|N|O|1996-12-19|1997-01-05|1997-01-04|NONE|MAIL|fluffily. slyly pending +29091|1578|19|2|8|11836.56|0.05|0.01|N|O|1997-01-29|1997-02-06|1997-02-26|NONE|TRUCK|accounts. warthogs alongside of the c +29091|1459|38|3|33|44894.85|0.04|0.01|N|O|1996-12-10|1997-02-10|1997-01-09|COLLECT COD|SHIP|iously. blithely even ideas no +29091|55|81|4|30|28651.50|0.08|0.00|N|O|1997-03-07|1997-01-20|1997-03-15|NONE|SHIP| accounts use after the bravely close +29092|1566|87|1|21|30818.76|0.07|0.03|A|F|1994-09-03|1994-09-11|1994-09-13|COLLECT COD|MAIL|e regular packages. carefully ironic acc +29092|1693|76|2|48|76545.12|0.08|0.01|A|F|1994-11-03|1994-09-13|1994-11-24|COLLECT COD|SHIP|nding, final reque +29092|1141|50|3|50|52107.00|0.02|0.03|R|F|1994-09-17|1994-10-09|1994-10-11|TAKE BACK RETURN|TRUCK|cajole slyly final accounts? iron +29093|1315|16|1|39|47436.09|0.04|0.00|N|O|1997-03-07|1996-12-30|1997-03-13|DELIVER IN PERSON|TRUCK|ly doggedly silent dependenc +29093|1464|82|2|17|23212.82|0.03|0.00|N|O|1997-01-07|1997-01-05|1997-01-10|TAKE BACK RETURN|REG AIR|tes haggle above the furiously regular asy +29093|112|39|3|5|5060.55|0.05|0.04|N|O|1997-01-30|1996-12-24|1997-02-16|TAKE BACK RETURN|MAIL|express accounts. carefully special account +29093|1400|15|4|18|23425.20|0.07|0.04|N|O|1997-01-22|1997-02-05|1997-02-06|COLLECT COD|RAIL|nal requests affix fluffily final, re +29094|1629|53|1|13|19898.06|0.10|0.07|N|O|1997-08-09|1997-08-22|1997-08-29|NONE|SHIP|detect behind the quickly ironic +29094|229|84|2|34|38393.48|0.00|0.00|N|O|1997-11-02|1997-08-12|1997-11-29|DELIVER IN PERSON|MAIL|. regular requests solve slyly. fu +29094|1096|67|3|45|44869.05|0.00|0.02|N|O|1997-08-28|1997-08-26|1997-09-17|DELIVER IN PERSON|TRUCK| packages. regularly special theo +29095|1576|57|1|43|63535.51|0.04|0.05|A|F|1995-05-17|1995-06-01|1995-06-13|TAKE BACK RETURN|SHIP|kages unwind carefully. r +29095|1143|80|2|40|41765.60|0.00|0.03|N|O|1995-06-20|1995-04-19|1995-07-03|TAKE BACK RETURN|SHIP|asymptotes. quickly exp +29095|787|88|3|43|72574.54|0.08|0.03|A|F|1995-06-08|1995-05-02|1995-06-17|NONE|SHIP|ngside of the ironic theodol +29095|659|60|4|23|35871.95|0.02|0.00|R|F|1995-06-09|1995-04-30|1995-06-17|TAKE BACK RETURN|SHIP|jole furiously furiously regular deposit +29095|1982|71|5|41|77243.18|0.07|0.03|R|F|1995-05-30|1995-04-20|1995-06-08|DELIVER IN PERSON|RAIL|kly around th +29120|764|61|1|43|71584.68|0.06|0.08|R|F|1993-08-17|1993-08-04|1993-08-28|COLLECT COD|AIR|yly ironic depths. carefully regu +29120|98|74|2|39|38925.51|0.08|0.08|R|F|1993-07-27|1993-08-06|1993-08-25|NONE|TRUCK|ironic pinto beans. furiously ironic +29120|1426|66|3|25|33185.50|0.01|0.06|R|F|1993-06-22|1993-08-05|1993-07-16|NONE|FOB|ole. blithely +29120|828|62|4|9|15559.38|0.06|0.04|A|F|1993-06-09|1993-06-19|1993-06-30|NONE|AIR| silent, express requests. boldly re +29120|99|25|5|40|39963.60|0.01|0.03|A|F|1993-06-12|1993-08-01|1993-06-27|TAKE BACK RETURN|SHIP|bold packages use along +29120|1718|45|6|18|29154.78|0.00|0.03|R|F|1993-07-19|1993-06-14|1993-08-15|DELIVER IN PERSON|FOB|. regular, even deposits sleep so +29120|1815|2|7|21|36053.01|0.07|0.02|A|F|1993-08-28|1993-07-22|1993-09-06|NONE|REG AIR|ickly regular decoys among the even co +29121|307|64|1|36|43462.80|0.01|0.04|R|F|1993-04-24|1993-05-15|1993-05-20|COLLECT COD|SHIP|s about the even +29121|698|92|2|19|30375.11|0.08|0.01|A|F|1993-06-14|1993-05-25|1993-06-24|TAKE BACK RETURN|SHIP|above the carefully +29122|1671|95|1|2|3145.34|0.02|0.05|N|O|1998-05-18|1998-07-06|1998-06-08|TAKE BACK RETURN|MAIL|ely bold ideas should have to +29122|135|88|2|36|37264.68|0.02|0.05|N|O|1998-06-19|1998-07-01|1998-06-25|TAKE BACK RETURN|MAIL|ding excuses. +29122|1058|29|3|43|41239.15|0.01|0.00|N|O|1998-05-27|1998-07-27|1998-06-04|NONE|AIR|eve doggedly across the furio +29122|182|61|4|9|9739.62|0.04|0.03|N|O|1998-09-07|1998-06-22|1998-10-07|DELIVER IN PERSON|SHIP|g requests. blithely pending accounts bo +29122|1022|23|5|49|45227.98|0.10|0.08|N|O|1998-06-10|1998-06-30|1998-06-27|COLLECT COD|MAIL|sly ironic gifts. blithely pending exc +29122|1795|38|6|17|28845.43|0.02|0.02|N|O|1998-07-27|1998-07-06|1998-08-09|TAKE BACK RETURN|RAIL|. deposits print slyly thin +29123|903|72|1|46|82979.40|0.10|0.04|N|O|1997-06-10|1997-06-02|1997-07-10|NONE|TRUCK|efully ironic accounts. carefull +29123|551|52|2|20|29031.00|0.04|0.00|N|O|1997-05-02|1997-05-06|1997-05-06|NONE|REG AIR| epitaphs. furiously pending instruction +29123|100|26|3|19|19001.90|0.06|0.02|N|O|1997-04-10|1997-06-08|1997-04-19|COLLECT COD|TRUCK|ly final requests are thinly across the +29123|1187|88|4|25|27204.50|0.07|0.08|N|O|1997-04-06|1997-06-15|1997-04-25|TAKE BACK RETURN|RAIL|inal packages above th +29124|886|53|1|24|42885.12|0.09|0.02|A|F|1994-11-20|1994-12-25|1994-12-01|NONE|RAIL|uffy pinto beans haggle quickly. blith +29125|1865|9|1|26|45938.36|0.02|0.07|N|O|1997-10-02|1997-09-01|1997-11-01|DELIVER IN PERSON|SHIP|uctions haggle qui +29125|483|42|2|12|16601.76|0.07|0.05|N|O|1997-09-02|1997-09-19|1997-09-25|DELIVER IN PERSON|MAIL|le carefully. slyly express pa +29126|16|67|1|26|23816.26|0.03|0.02|N|O|1995-09-28|1995-09-02|1995-10-28|NONE|FOB|nic foxes along the instru +29126|806|73|2|26|44376.80|0.00|0.01|N|O|1995-09-06|1995-08-24|1995-09-12|DELIVER IN PERSON|REG AIR| accounts. blithe +29126|590|21|3|6|8943.54|0.01|0.07|N|O|1995-10-05|1995-09-13|1995-10-29|COLLECT COD|FOB|even asymptotes +29126|795|92|4|25|42394.75|0.07|0.01|N|O|1995-10-01|1995-09-02|1995-10-29|TAKE BACK RETURN|AIR|wake slyly. furiously even package +29127|91|92|1|34|33697.06|0.10|0.03|A|F|1994-07-01|1994-06-01|1994-07-20|TAKE BACK RETURN|TRUCK| packages cajole slyly. special, specia +29127|1873|60|2|34|60345.58|0.03|0.01|R|F|1994-04-15|1994-06-06|1994-04-22|NONE|TRUCK|ts wake slyl +29127|188|89|3|6|6529.08|0.07|0.00|A|F|1994-07-31|1994-05-20|1994-08-14|COLLECT COD|TRUCK|e slyly spe +29127|1338|53|4|30|37179.90|0.04|0.06|A|F|1994-07-14|1994-05-28|1994-08-10|DELIVER IN PERSON|REG AIR|lets after the fu +29152|156|9|1|23|24291.45|0.01|0.02|N|O|1995-08-18|1995-09-02|1995-09-05|COLLECT COD|AIR| pinto beans doubt alongs +29152|1119|28|2|6|6120.66|0.10|0.08|N|O|1995-08-26|1995-08-30|1995-09-09|DELIVER IN PERSON|AIR|unusual, bold realms sleep accoun +29152|636|99|3|37|56855.31|0.01|0.03|N|O|1995-09-12|1995-09-16|1995-09-25|NONE|RAIL|s cajole blithely. furiously final +29152|1014|20|4|24|21960.24|0.06|0.05|N|O|1995-08-26|1995-09-20|1995-09-06|TAKE BACK RETURN|TRUCK|he bold, pending asymptote +29152|995|96|5|14|26543.86|0.02|0.06|N|O|1995-08-23|1995-09-22|1995-09-09|TAKE BACK RETURN|SHIP|express theodoli +29152|1865|9|6|38|67140.68|0.02|0.03|N|O|1995-11-01|1995-08-31|1995-11-23|COLLECT COD|AIR|oys print. furiously +29153|1421|100|1|31|40995.02|0.01|0.02|N|O|1996-06-15|1996-07-25|1996-06-21|COLLECT COD|REG AIR|d sentiments haggle doggedly regu +29153|77|78|2|15|14656.05|0.09|0.04|N|O|1996-06-29|1996-07-26|1996-07-23|DELIVER IN PERSON|RAIL|s. carefully ironic fox +29153|520|81|3|42|59661.84|0.00|0.04|N|O|1996-08-27|1996-06-24|1996-09-22|DELIVER IN PERSON|TRUCK|unts. pending, final pac +29154|1996|97|1|47|89205.53|0.04|0.00|N|O|1996-12-17|1996-10-28|1996-12-21|DELIVER IN PERSON|RAIL|ieve. carefully ironic +29154|1050|51|2|11|10461.55|0.00|0.02|N|O|1996-10-09|1996-10-31|1996-11-08|COLLECT COD|MAIL|he ironic, daring packages cajole at the bl +29154|1101|2|3|25|25052.50|0.02|0.05|N|O|1997-01-18|1996-12-10|1997-02-11|COLLECT COD|AIR|ns. regular warth +29154|631|25|4|50|76581.50|0.08|0.08|N|O|1996-10-02|1996-12-22|1996-10-04|DELIVER IN PERSON|TRUCK|y bold packages haggle u +29154|1200|9|5|46|50655.20|0.08|0.01|N|O|1996-10-12|1996-11-21|1996-10-18|NONE|AIR|ns sleep dari +29154|663|57|6|23|35964.18|0.02|0.01|N|O|1996-11-12|1996-11-20|1996-12-03|NONE|SHIP|ions boost blithely? blithely final depen +29155|1321|22|1|2|2444.64|0.02|0.06|A|F|1994-10-27|1994-12-11|1994-11-02|TAKE BACK RETURN|REG AIR|arls. slyly express deposits +29155|510|1|2|24|33852.24|0.02|0.04|A|F|1994-10-08|1994-12-17|1994-11-07|DELIVER IN PERSON|MAIL|ickly ironic requests print; bl +29155|1718|45|3|37|59929.27|0.02|0.03|R|F|1994-12-20|1994-11-26|1994-12-23|COLLECT COD|AIR|. carefully regul +29155|1005|76|4|42|38052.00|0.00|0.07|R|F|1994-10-17|1994-11-06|1994-11-06|NONE|RAIL| furiously. carefully final deposits +29155|1743|70|5|45|74013.30|0.00|0.06|A|F|1994-11-18|1994-11-25|1994-12-13|NONE|REG AIR|ously regul +29156|1464|82|1|24|32771.04|0.03|0.03|R|F|1993-04-29|1993-04-11|1993-05-01|COLLECT COD|REG AIR|unusual in +29156|1718|3|2|28|45351.88|0.05|0.04|A|F|1993-03-21|1993-04-05|1993-03-28|TAKE BACK RETURN|MAIL|s. blithely expres +29156|390|91|3|40|51615.60|0.07|0.02|R|F|1993-03-20|1993-05-12|1993-03-22|NONE|SHIP| packages +29156|1244|19|4|1|1145.24|0.03|0.07|A|F|1993-06-10|1993-05-05|1993-06-11|NONE|MAIL|ld accounts. requests promi +29157|987|90|1|16|30207.68|0.09|0.06|N|O|1997-03-16|1997-03-28|1997-04-07|COLLECT COD|RAIL|ven pinto b +29158|293|94|1|42|50118.18|0.06|0.02|N|O|1995-10-24|1995-11-21|1995-11-22|NONE|RAIL|s foxes. final frays +29158|1688|12|2|47|74714.96|0.08|0.03|N|O|1995-12-14|1995-11-22|1995-12-28|NONE|REG AIR|slyly blithely special +29158|1522|43|3|48|68328.96|0.01|0.04|N|O|1996-01-13|1996-01-19|1996-02-10|NONE|AIR|sly final frays accordin +29158|1527|48|4|33|47141.16|0.09|0.08|N|O|1995-11-14|1995-12-18|1995-11-29|COLLECT COD|RAIL|ts use fluffily carefully quiet pinto b +29158|616|10|5|49|74313.89|0.06|0.07|N|O|1995-11-29|1996-01-10|1995-12-07|TAKE BACK RETURN|RAIL|lly special +29158|691|85|6|44|70034.36|0.05|0.03|N|O|1995-12-05|1996-01-06|1995-12-14|DELIVER IN PERSON|SHIP|r accounts. slyly ironic foxe +29158|1479|19|7|42|57979.74|0.00|0.05|N|O|1995-12-29|1996-01-19|1996-01-08|COLLECT COD|MAIL|ld instructions integrate furious depe +29159|1165|2|1|45|47977.20|0.09|0.06|N|O|1997-08-25|1997-07-27|1997-09-03|DELIVER IN PERSON|MAIL| even ideas wake iron +29184|1223|24|1|25|28105.50|0.10|0.01|R|F|1992-09-10|1992-09-17|1992-09-27|DELIVER IN PERSON|SHIP| above the slyly regul +29185|398|99|1|24|31161.36|0.00|0.07|R|F|1993-04-30|1993-03-25|1993-05-15|COLLECT COD|REG AIR|l deposits. +29185|1023|59|2|12|11088.24|0.03|0.01|R|F|1993-01-27|1993-03-28|1993-02-26|DELIVER IN PERSON|SHIP|s. ironic requests c +29185|1980|13|3|32|60223.36|0.01|0.06|A|F|1993-05-03|1993-04-15|1993-05-20|DELIVER IN PERSON|AIR| regular excuses. carefully regular in +29185|1501|42|4|22|30855.00|0.10|0.06|A|F|1993-03-18|1993-04-06|1993-03-29|NONE|FOB|rding to the qui +29185|1068|39|5|42|40700.52|0.05|0.07|A|F|1993-02-11|1993-03-17|1993-03-04|COLLECT COD|TRUCK|ng the ruthlessly +29185|777|74|6|34|57044.18|0.00|0.02|A|F|1993-04-05|1993-02-22|1993-04-30|COLLECT COD|TRUCK|eful, ironic +29185|742|39|7|4|6570.96|0.05|0.02|A|F|1993-02-12|1993-03-21|1993-02-21|TAKE BACK RETURN|REG AIR|ges impress quickly furiously even not +29186|664|96|1|37|57892.42|0.02|0.01|N|O|1998-06-22|1998-05-14|1998-07-15|COLLECT COD|SHIP|es are furiously careful packa +29187|1930|75|1|33|60453.69|0.10|0.02|A|F|1994-09-15|1994-09-21|1994-09-22|NONE|RAIL|posits wake. furiously fi +29187|1497|98|2|33|46150.17|0.01|0.05|R|F|1994-11-29|1994-10-02|1994-12-01|NONE|MAIL|se boldly about the slyl +29187|1703|4|3|48|77025.60|0.04|0.02|R|F|1994-10-19|1994-09-30|1994-11-13|NONE|TRUCK|ily ironic ideas. express pinto beans +29187|1998|87|4|45|85499.55|0.06|0.08|R|F|1994-09-05|1994-10-05|1994-09-16|DELIVER IN PERSON|RAIL|are closely account +29187|1441|20|5|42|56382.48|0.06|0.04|R|F|1994-11-07|1994-10-13|1994-11-10|DELIVER IN PERSON|FOB|uiet accounts according to the +29187|704|1|6|12|19256.40|0.09|0.01|A|F|1994-09-23|1994-09-25|1994-10-09|TAKE BACK RETURN|TRUCK|ly above the blithely unusu +29187|1800|1|7|4|6807.20|0.03|0.04|A|F|1994-11-05|1994-09-29|1994-12-02|DELIVER IN PERSON|SHIP|? final theodolit +29188|80|6|1|16|15681.28|0.07|0.00|A|F|1992-08-18|1992-06-15|1992-08-24|NONE|FOB|final, pendin +29188|970|71|2|24|44903.28|0.05|0.01|R|F|1992-08-13|1992-07-25|1992-09-07|DELIVER IN PERSON|MAIL|ross the final depos +29189|422|23|1|24|31738.08|0.03|0.04|R|F|1993-08-21|1993-08-27|1993-09-05|NONE|TRUCK|n foxes. furious, unusual accounts +29190|613|14|1|15|22704.15|0.04|0.06|N|O|1997-03-28|1997-04-01|1997-04-19|DELIVER IN PERSON|SHIP|es boost furiously-- express dependenci +29191|706|71|1|42|67481.40|0.00|0.00|R|F|1992-10-16|1992-08-31|1992-11-05|COLLECT COD|RAIL|g, ironic accounts? furiously eve +29191|633|65|2|37|56744.31|0.04|0.08|R|F|1992-08-17|1992-08-10|1992-09-15|DELIVER IN PERSON|SHIP|ly quickly bold ideas. furiously i +29191|381|82|3|36|46129.68|0.06|0.01|A|F|1992-08-09|1992-09-07|1992-08-21|COLLECT COD|AIR|onic packages wake carefully ca +29191|1547|48|4|18|26073.72|0.00|0.06|R|F|1992-10-25|1992-09-03|1992-11-12|DELIVER IN PERSON|TRUCK|ns boost fluffi +29191|403|91|5|1|1303.40|0.04|0.03|R|F|1992-07-22|1992-08-03|1992-07-25|NONE|SHIP|ickly final accoun +29191|1218|19|6|42|47006.82|0.09|0.07|R|F|1992-10-20|1992-09-13|1992-10-21|TAKE BACK RETURN|MAIL|e fluffily regular dolphi +29191|1603|4|7|47|70716.20|0.07|0.02|R|F|1992-08-04|1992-08-27|1992-08-14|DELIVER IN PERSON|FOB|y final ide +29216|972|75|1|27|50570.19|0.01|0.02|A|F|1993-04-09|1993-02-21|1993-05-03|TAKE BACK RETURN|FOB|unts. blithely express foxes cajole +29216|1222|60|2|37|41559.14|0.05|0.06|R|F|1993-04-08|1993-01-30|1993-04-18|DELIVER IN PERSON|SHIP|play furiously. ca +29216|197|76|3|32|35110.08|0.00|0.05|R|F|1993-03-15|1993-02-04|1993-03-31|TAKE BACK RETURN|FOB|c sentiments +29217|1616|99|1|20|30352.20|0.09|0.07|N|O|1997-10-21|1997-10-14|1997-11-15|DELIVER IN PERSON|RAIL|y special instructions: permanently final +29217|600|1|2|1|1500.60|0.03|0.04|N|O|1997-10-19|1997-11-27|1997-10-22|DELIVER IN PERSON|REG AIR|riously fin +29218|1397|74|1|30|38951.70|0.01|0.03|A|F|1992-08-10|1992-07-15|1992-08-20|DELIVER IN PERSON|FOB|riously express asymptotes doubt carefull +29218|1056|92|2|6|5742.30|0.06|0.05|A|F|1992-08-24|1992-08-11|1992-09-20|TAKE BACK RETURN|TRUCK|ake carefully whithou +29218|436|95|3|35|46775.05|0.10|0.02|R|F|1992-07-01|1992-08-26|1992-07-26|NONE|RAIL|eas detect about the even, pending accou +29218|1319|58|4|14|17084.34|0.00|0.07|A|F|1992-07-12|1992-08-09|1992-08-02|DELIVER IN PERSON|TRUCK|lyly special requests. slyly ironic instru +29218|797|30|5|23|39049.17|0.04|0.00|R|F|1992-07-09|1992-07-30|1992-08-06|DELIVER IN PERSON|REG AIR|final dependencies. pending theodolit +29218|1187|60|6|27|29380.86|0.00|0.07|A|F|1992-07-17|1992-07-06|1992-08-02|COLLECT COD|RAIL|riously carefully silent theodolites. a +29218|1269|81|7|48|56172.48|0.06|0.01|R|F|1992-06-22|1992-07-17|1992-06-27|COLLECT COD|TRUCK|iously ironic courts haggl +29219|788|89|1|36|60796.08|0.05|0.05|R|F|1994-05-13|1994-05-11|1994-05-29|NONE|RAIL|nal ideas cajole sly +29219|1868|55|2|12|21238.32|0.05|0.08|R|F|1994-07-28|1994-06-03|1994-08-13|COLLECT COD|RAIL|pinto beans u +29219|1682|65|3|3|4751.04|0.04|0.07|A|F|1994-06-09|1994-05-20|1994-06-21|TAKE BACK RETURN|AIR|pendencies. pending the +29219|1683|25|4|3|4754.04|0.04|0.04|R|F|1994-06-21|1994-05-11|1994-07-18|TAKE BACK RETURN|SHIP|gular pearls into the final, even reque +29219|626|89|5|36|54958.32|0.05|0.00|R|F|1994-07-16|1994-05-23|1994-08-08|NONE|RAIL|der. fluffily ir +29219|419|49|6|17|22429.97|0.03|0.08|R|F|1994-04-26|1994-06-26|1994-05-04|NONE|REG AIR|fix idly carefully pen +29220|1912|1|1|35|63486.85|0.08|0.06|A|F|1993-02-17|1993-02-21|1993-03-14|COLLECT COD|SHIP|unusual ideas. sauternes haggle carefu +29220|1624|48|2|18|27461.16|0.04|0.05|R|F|1993-01-28|1993-02-15|1993-02-04|COLLECT COD|TRUCK|quests print carefully unusual requests. b +29220|1784|69|3|1|1685.78|0.05|0.06|R|F|1993-01-04|1993-03-28|1993-02-01|DELIVER IN PERSON|RAIL|elets. carefully final packages are careful +29221|1987|76|1|44|83115.12|0.10|0.04|A|F|1992-06-04|1992-07-08|1992-06-28|DELIVER IN PERSON|SHIP|layers wake. quickly regular dependen +29222|1863|7|1|24|42356.64|0.02|0.04|N|O|1998-03-05|1998-03-24|1998-03-31|TAKE BACK RETURN|REG AIR| ironic attainments. blithe +29222|364|65|2|36|45516.96|0.09|0.03|N|O|1998-05-08|1998-03-31|1998-05-25|TAKE BACK RETURN|MAIL|ackages cajo +29222|841|41|3|42|73157.28|0.01|0.03|N|O|1998-02-25|1998-04-19|1998-03-18|DELIVER IN PERSON|MAIL|carefully. slyly regular fret +29222|983|84|4|21|39563.58|0.09|0.00|N|O|1998-05-31|1998-03-30|1998-06-29|NONE|FOB|foxes. unusual packages wake. f +29223|510|41|1|23|32441.73|0.05|0.05|A|F|1992-03-09|1992-02-29|1992-03-21|COLLECT COD|TRUCK|ns are blithely blithely b +29223|1089|60|2|44|43563.52|0.09|0.04|A|F|1992-04-16|1992-03-22|1992-05-06|COLLECT COD|RAIL|. quickly regular i +29223|1237|12|3|22|25041.06|0.02|0.08|A|F|1992-05-21|1992-03-08|1992-06-12|DELIVER IN PERSON|AIR|y. quiet deposits after the furio +29223|930|31|4|37|67744.41|0.10|0.04|A|F|1992-05-02|1992-04-12|1992-05-26|NONE|MAIL|quickly carefully +29223|834|68|5|7|12143.81|0.09|0.02|R|F|1992-01-30|1992-03-30|1992-02-28|TAKE BACK RETURN|FOB|uickly pending accounts. carefully silent +29223|440|41|6|39|52277.16|0.06|0.02|R|F|1992-03-25|1992-03-24|1992-04-15|NONE|AIR|blithely thin, special deposi +29248|1325|26|1|41|50279.12|0.03|0.05|N|O|1998-07-14|1998-05-20|1998-08-06|NONE|MAIL|ts cajole about the even accounts. unu +29248|1140|77|2|12|12493.68|0.00|0.05|N|O|1998-04-06|1998-05-03|1998-04-17|DELIVER IN PERSON|TRUCK|kages x-ray fluffily above the ne +29248|604|36|3|40|60184.00|0.09|0.05|N|O|1998-05-16|1998-05-08|1998-06-15|NONE|SHIP|onic instructions sleep regular excus +29248|1084|20|4|14|13791.12|0.07|0.07|N|O|1998-04-08|1998-05-12|1998-04-21|COLLECT COD|MAIL|careful accounts. s +29248|507|98|5|11|15482.50|0.05|0.08|N|O|1998-06-12|1998-05-29|1998-07-07|COLLECT COD|TRUCK|uriously pending accounts. deposits sleep +29248|274|75|6|20|23485.40|0.02|0.05|N|O|1998-06-28|1998-05-18|1998-07-01|TAKE BACK RETURN|MAIL| carefully theodolites. quickly +29248|233|88|7|17|19264.91|0.01|0.08|N|O|1998-05-10|1998-05-15|1998-06-05|DELIVER IN PERSON|AIR|iously after the ironic packages. +29249|1911|100|1|44|79768.04|0.09|0.00|N|O|1995-09-21|1995-08-09|1995-09-25|COLLECT COD|RAIL|hockey players are carefully +29249|1258|33|2|20|23185.00|0.08|0.08|N|O|1995-09-27|1995-09-04|1995-10-04|DELIVER IN PERSON|RAIL|s against the pending pinto beans w +29249|519|80|3|22|31229.22|0.05|0.06|N|O|1995-08-26|1995-08-03|1995-08-29|DELIVER IN PERSON|RAIL|osits at the carefully unu +29249|1274|86|4|10|11752.70|0.09|0.08|N|O|1995-10-05|1995-08-25|1995-10-26|COLLECT COD|REG AIR|nag never at the idle, regular packages. re +29249|846|47|5|3|5240.52|0.00|0.00|N|O|1995-09-05|1995-08-11|1995-09-12|COLLECT COD|MAIL| breach blit +29249|77|78|6|45|43968.15|0.03|0.06|N|O|1995-07-12|1995-09-11|1995-08-07|DELIVER IN PERSON|REG AIR|. even, bold ideas are carefully fu +29250|233|15|1|47|53261.81|0.06|0.08|A|F|1992-07-15|1992-07-28|1992-08-01|COLLECT COD|RAIL|even accounts sleep carefully. +29250|860|27|2|41|72195.26|0.09|0.04|R|F|1992-06-23|1992-07-24|1992-07-14|TAKE BACK RETURN|MAIL|sual theodolites integrate al +29250|160|61|3|49|51947.84|0.06|0.04|A|F|1992-08-12|1992-06-18|1992-09-09|DELIVER IN PERSON|SHIP|erve after the care +29250|333|18|4|39|48099.87|0.09|0.02|A|F|1992-06-22|1992-07-29|1992-07-02|NONE|SHIP| sublate daringly +29250|362|47|5|40|50494.40|0.05|0.08|A|F|1992-08-26|1992-06-23|1992-09-11|DELIVER IN PERSON|AIR|nic requests. furiously ironic r +29251|968|3|1|16|29903.36|0.03|0.05|N|O|1998-09-29|1998-07-27|1998-10-04|COLLECT COD|RAIL|le carefully unusual accounts; excuses nag +29252|353|10|1|13|16293.55|0.00|0.02|A|F|1994-11-19|1994-09-23|1994-12-12|NONE|RAIL|e, ironic pinto beans detect r +29252|795|96|2|16|27132.64|0.10|0.01|R|F|1994-12-04|1994-11-01|1994-12-07|NONE|MAIL|s. blithely final theodolites near t +29252|985|54|3|40|75439.20|0.09|0.07|R|F|1994-08-24|1994-10-03|1994-09-06|NONE|REG AIR|dolites affix slyly: pending pains are. fur +29252|926|95|4|47|85865.24|0.03|0.08|A|F|1994-09-27|1994-10-05|1994-10-07|NONE|FOB| above the blithely pe +29252|1351|90|5|19|23794.65|0.10|0.06|R|F|1994-08-20|1994-10-03|1994-09-06|TAKE BACK RETURN|TRUCK| the deposits. even, regular instruc +29252|115|16|6|25|25377.75|0.09|0.00|R|F|1994-10-09|1994-10-19|1994-11-08|COLLECT COD|AIR|r excuses into the express theodoli +29253|1032|33|1|35|32656.05|0.01|0.04|N|O|1997-06-29|1997-07-11|1997-07-15|DELIVER IN PERSON|AIR|beans. quickly silent instructions +29253|148|27|2|16|16770.24|0.06|0.02|N|O|1997-05-14|1997-05-28|1997-06-03|COLLECT COD|TRUCK|lyly final packages. ironic ideas a +29253|1883|70|3|22|39267.36|0.10|0.03|N|O|1997-08-11|1997-07-11|1997-08-15|DELIVER IN PERSON|FOB|ing to the requests. furiously stea +29254|1098|99|1|26|25976.34|0.07|0.07|N|O|1997-11-08|1997-12-16|1997-11-13|DELIVER IN PERSON|REG AIR|ffily regular packages are alongside +29254|1434|13|2|7|9348.01|0.05|0.06|N|O|1998-01-15|1997-10-20|1998-02-11|NONE|AIR| ironic ideas. dogged +29254|543|74|3|26|37532.04|0.08|0.08|N|O|1997-12-20|1997-10-30|1997-12-25|COLLECT COD|TRUCK|sly express deposits. furiously expre +29254|1593|14|4|29|43343.11|0.04|0.05|N|O|1997-10-20|1997-10-22|1997-11-19|DELIVER IN PERSON|TRUCK| are according to the always express fox +29254|1701|86|5|19|30451.30|0.01|0.06|N|O|1997-12-27|1997-11-25|1998-01-13|DELIVER IN PERSON|AIR| boost blithely among the slyly fina +29254|345|30|6|13|16189.42|0.02|0.00|N|O|1997-10-04|1997-12-02|1997-10-05|DELIVER IN PERSON|MAIL| the slyly fi +29254|1769|70|7|21|35085.96|0.04|0.02|N|O|1997-10-21|1997-11-03|1997-11-19|TAKE BACK RETURN|TRUCK|ly special ideas are carefully ironic +29255|1628|70|1|8|12236.96|0.00|0.05|N|O|1996-01-08|1996-02-12|1996-02-01|TAKE BACK RETURN|FOB|nto beans. blithely special ideas +29255|1345|60|2|21|26173.14|0.02|0.06|N|O|1996-04-01|1996-02-01|1996-04-13|NONE|AIR|kly special, regular foxes. furious +29255|1840|84|3|18|31353.12|0.05|0.02|N|O|1996-01-14|1996-02-17|1996-02-07|TAKE BACK RETURN|TRUCK|e slyly unusual packages. requests +29280|1468|47|1|2|2738.92|0.01|0.00|A|F|1992-04-05|1992-06-10|1992-05-04|DELIVER IN PERSON|AIR|unts. pains nod furiously. +29280|1881|11|2|45|80229.60|0.02|0.00|R|F|1992-05-12|1992-05-31|1992-05-25|COLLECT COD|RAIL|ully carefully unusual theodolites +29280|341|70|3|10|12413.40|0.06|0.05|A|F|1992-04-28|1992-06-13|1992-05-09|TAKE BACK RETURN|FOB|ily even dependencies during t +29280|13|89|4|24|21912.24|0.09|0.01|A|F|1992-04-06|1992-06-10|1992-04-21|DELIVER IN PERSON|TRUCK|ackages. instructions detect +29280|1351|90|5|33|41327.55|0.10|0.03|A|F|1992-07-28|1992-04-30|1992-07-31|DELIVER IN PERSON|RAIL| the permanently sile +29280|1266|41|6|28|32683.28|0.02|0.05|A|F|1992-04-17|1992-05-24|1992-05-12|TAKE BACK RETURN|RAIL|. regular depths wake never fin +29281|1486|26|1|43|59661.64|0.00|0.03|N|O|1998-06-13|1998-06-28|1998-06-19|DELIVER IN PERSON|REG AIR| fluffily among the furiously quiet request +29282|1249|50|1|42|48310.08|0.10|0.07|A|F|1993-03-08|1993-02-22|1993-03-22|TAKE BACK RETURN|FOB|ons. express req +29282|314|43|2|43|52215.33|0.00|0.01|R|F|1992-12-04|1993-01-08|1992-12-24|TAKE BACK RETURN|REG AIR|re slyly evenly regular pinto beans. iron +29282|1198|99|3|49|53860.31|0.00|0.06|A|F|1993-01-30|1993-02-11|1993-02-07|COLLECT COD|REG AIR|quests. even, fi +29282|1126|99|4|17|17461.04|0.00|0.05|R|F|1993-03-22|1993-02-21|1993-04-20|COLLECT COD|RAIL|nal requests solve +29282|891|91|5|32|57340.48|0.03|0.01|R|F|1992-12-04|1993-01-26|1992-12-13|COLLECT COD|MAIL|e carefully +29283|812|46|1|40|68512.40|0.09|0.07|N|O|1998-02-23|1998-03-22|1998-02-25|TAKE BACK RETURN|TRUCK|quickly unusual foxes are daringly along t +29283|1564|45|2|38|55691.28|0.06|0.04|N|O|1998-03-29|1998-03-02|1998-04-04|NONE|SHIP|ly regular pinto beans wake: slyly +29283|270|71|3|47|55002.69|0.10|0.01|N|O|1998-01-26|1998-03-04|1998-02-19|DELIVER IN PERSON|SHIP|ng the blithely regular accounts cajole ca +29283|690|91|4|5|7953.45|0.10|0.01|N|O|1998-03-02|1998-03-06|1998-03-12|DELIVER IN PERSON|FOB| ironic foxes. regular sentiments ac +29284|877|78|1|30|53336.10|0.05|0.02|R|F|1994-08-01|1994-06-17|1994-08-16|TAKE BACK RETURN|TRUCK|osits. even packages are across the r +29284|568|29|2|49|71959.44|0.06|0.07|R|F|1994-07-18|1994-07-08|1994-08-15|TAKE BACK RETURN|FOB|usly. quickly +29285|520|81|1|3|4261.56|0.08|0.08|N|O|1997-12-16|1998-01-21|1997-12-17|COLLECT COD|TRUCK| blithely. special instructions afte +29285|1062|98|2|17|16372.02|0.08|0.06|N|O|1998-01-19|1998-02-27|1998-02-01|COLLECT COD|AIR|e carefully r +29285|1018|54|3|26|23894.26|0.05|0.04|N|O|1998-02-12|1998-02-13|1998-03-07|DELIVER IN PERSON|TRUCK|tside the fluffy instructions. regular +29285|731|32|4|37|60374.01|0.10|0.01|N|O|1998-03-22|1998-02-07|1998-04-04|COLLECT COD|AIR|uriously according to the blithely r +29285|433|92|5|25|33335.75|0.02|0.01|N|O|1997-12-18|1998-03-11|1998-01-04|DELIVER IN PERSON|MAIL|ly. express d +29286|825|92|1|17|29338.94|0.08|0.08|R|F|1994-09-08|1994-09-25|1994-09-19|TAKE BACK RETURN|RAIL|inally unusual +29287|1206|81|1|31|34323.20|0.04|0.04|R|F|1994-09-04|1994-08-05|1994-09-20|TAKE BACK RETURN|RAIL| furiously pe +29287|1537|38|2|36|51787.08|0.00|0.00|A|F|1994-07-22|1994-09-03|1994-08-20|NONE|TRUCK|sublate fluffily silently regular theodolit +29287|662|25|3|20|31253.20|0.10|0.07|R|F|1994-08-05|1994-09-25|1994-08-14|DELIVER IN PERSON|AIR|ithely iron +29287|1923|68|4|50|91246.00|0.05|0.02|R|F|1994-07-16|1994-08-17|1994-07-29|NONE|TRUCK|ieve slyly +29287|582|83|5|5|7412.90|0.09|0.01|R|F|1994-07-16|1994-08-23|1994-08-09|NONE|MAIL|ely final packages +29287|1342|43|6|42|52220.28|0.02|0.08|R|F|1994-09-21|1994-09-22|1994-10-10|COLLECT COD|REG AIR| furiously even +29312|1231|32|1|3|3396.69|0.10|0.02|R|F|1994-12-24|1995-02-01|1995-01-11|NONE|MAIL|ounts. specia +29312|5|81|2|8|7240.00|0.04|0.06|R|F|1995-03-08|1995-01-12|1995-03-21|DELIVER IN PERSON|SHIP|ve the ironic pi +29312|596|97|3|41|61360.19|0.10|0.03|A|F|1994-12-22|1995-02-27|1994-12-27|COLLECT COD|REG AIR|hely. blithe +29313|999|68|1|11|20899.89|0.02|0.05|N|O|1998-09-04|1998-09-17|1998-10-01|NONE|RAIL|deas. slyly special asymptotes wake slyly +29313|1526|47|2|32|45680.64|0.08|0.00|N|O|1998-10-11|1998-07-19|1998-11-10|DELIVER IN PERSON|SHIP|nusual excuses alo +29313|1771|98|3|25|41819.25|0.08|0.01|N|O|1998-08-14|1998-08-23|1998-09-06|NONE|RAIL|osits sleep pac +29313|1355|32|4|12|15076.20|0.10|0.07|N|O|1998-08-03|1998-08-09|1998-08-11|NONE|TRUCK|slyly regular deposits. unus +29313|964|33|5|21|39164.16|0.07|0.02|N|O|1998-07-16|1998-09-13|1998-08-06|TAKE BACK RETURN|MAIL|ackages. regu +29313|610|4|6|24|36254.64|0.02|0.03|N|O|1998-08-23|1998-09-06|1998-08-28|COLLECT COD|SHIP|ages above the quickly even accounts ea +29313|1852|96|7|42|73661.70|0.05|0.07|N|O|1998-08-11|1998-07-26|1998-08-24|TAKE BACK RETURN|REG AIR|ains. fluffily ironic accoun +29314|1859|60|1|20|35217.00|0.02|0.02|N|O|1996-04-29|1996-03-18|1996-05-28|DELIVER IN PERSON|AIR|ites integrate about the iro +29314|928|97|2|48|87788.16|0.02|0.08|N|O|1996-04-11|1996-04-08|1996-04-12|COLLECT COD|RAIL|ding to the blithely +29314|168|21|3|44|46999.04|0.03|0.02|N|O|1996-03-02|1996-04-25|1996-03-22|NONE|MAIL|e fluffily iron +29315|1877|21|1|19|33798.53|0.00|0.01|N|O|1998-09-06|1998-08-26|1998-10-03|COLLECT COD|FOB|quests wake even +29315|77|78|2|21|20518.47|0.06|0.06|N|O|1998-08-22|1998-08-23|1998-09-05|COLLECT COD|FOB|ss warhorses detect furiousl +29315|236|64|3|14|15907.22|0.10|0.06|N|O|1998-08-23|1998-10-03|1998-08-29|COLLECT COD|MAIL|lent packages. regular, +29316|34|60|1|11|10274.33|0.02|0.05|N|O|1997-07-14|1997-06-26|1997-07-31|DELIVER IN PERSON|REG AIR|e of the pending packages. idle +29316|61|37|2|14|13454.84|0.01|0.00|N|O|1997-06-24|1997-07-13|1997-07-02|TAKE BACK RETURN|MAIL|ts. slyly ironic warthogs around +29316|460|90|3|4|5441.84|0.00|0.01|N|O|1997-08-06|1997-07-05|1997-08-11|COLLECT COD|REG AIR|ckages cajole slyly above the re +29316|1292|30|4|4|4773.16|0.02|0.02|N|O|1997-06-23|1997-07-27|1997-07-01|NONE|MAIL|carefully ironic requests was quickly. fur +29316|1413|31|5|1|1314.41|0.09|0.00|N|O|1997-06-13|1997-07-26|1997-06-24|DELIVER IN PERSON|AIR|hely even ideas. slyly special pinto beans +29316|1512|53|6|38|53713.38|0.02|0.01|N|O|1997-08-16|1997-07-23|1997-09-11|DELIVER IN PERSON|FOB|the regular deposits eat carefully sil +29316|1083|54|7|14|13777.12|0.07|0.05|N|O|1997-06-23|1997-07-22|1997-07-18|TAKE BACK RETURN|TRUCK|ular accounts al +29317|1762|63|1|35|58231.60|0.03|0.07|N|O|1995-10-11|1995-11-20|1995-10-17|DELIVER IN PERSON|REG AIR| the unusual, even instructions +29317|1703|4|2|8|12837.60|0.03|0.06|N|O|1996-01-18|1995-11-03|1996-02-04|NONE|SHIP| packages? fluffily special asymptote +29317|1668|51|3|4|6278.64|0.06|0.06|N|O|1995-10-12|1995-11-25|1995-10-29|DELIVER IN PERSON|FOB|ake slyly regular +29317|1788|89|4|48|81109.44|0.10|0.06|N|O|1995-12-06|1995-11-14|1995-12-25|COLLECT COD|FOB|jole. dogged foxes across +29317|1884|85|5|11|19644.68|0.05|0.04|N|O|1995-11-22|1995-12-21|1995-12-06|COLLECT COD|FOB|ts cajole furiously. silent pack +29317|216|71|6|50|55810.50|0.06|0.08|N|O|1995-10-26|1995-12-15|1995-11-18|COLLECT COD|RAIL| quickly silent dolphins. eve +29318|499|58|1|47|65776.03|0.05|0.03|N|O|1995-09-15|1995-09-25|1995-10-14|COLLECT COD|RAIL|e furiously a +29318|134|61|2|9|9307.17|0.03|0.03|N|O|1995-09-28|1995-08-24|1995-10-18|DELIVER IN PERSON|AIR| final, regular instructions cajole furio +29318|1685|9|3|48|76160.64|0.08|0.02|N|O|1995-10-04|1995-08-16|1995-10-13|COLLECT COD|TRUCK|gular asymptotes boost unu +29319|1408|9|1|4|5237.60|0.02|0.05|R|F|1994-05-15|1994-02-27|1994-06-02|NONE|MAIL|al dugouts. quickly final packages cajo +29319|1411|29|2|22|28873.02|0.04|0.00|R|F|1994-03-17|1994-03-13|1994-03-20|TAKE BACK RETURN|SHIP|ccounts. blithely ironic deposits +29319|25|26|3|16|14800.32|0.00|0.04|A|F|1994-05-13|1994-03-07|1994-05-18|NONE|SHIP|. quickly express deposits are. ironic req +29319|730|95|4|19|30983.87|0.10|0.03|A|F|1994-03-05|1994-04-05|1994-03-12|DELIVER IN PERSON|SHIP|sly unusual instruction +29319|694|57|5|4|6378.76|0.03|0.07|R|F|1994-05-04|1994-03-19|1994-05-31|NONE|REG AIR|nts detect quickly above the special, pend +29319|1229|4|6|29|32776.38|0.03|0.07|R|F|1994-03-13|1994-04-25|1994-04-12|NONE|REG AIR|ly final packages boost. blithely ironi +29319|142|69|7|34|35432.76|0.01|0.02|A|F|1994-05-19|1994-04-22|1994-06-06|NONE|AIR|uriously pending dependencies use among +29344|1994|27|1|33|62567.67|0.05|0.07|N|O|1998-04-29|1998-05-12|1998-05-29|TAKE BACK RETURN|AIR|posits integrate slyly against th +29345|391|48|1|9|11622.51|0.01|0.00|N|O|1997-05-20|1997-03-31|1997-06-13|DELIVER IN PERSON|TRUCK|cajole blithel +29345|1643|44|2|31|47883.84|0.06|0.07|N|O|1997-05-28|1997-04-06|1997-05-30|COLLECT COD|AIR|pinto beans sleep furiously deposits. +29345|31|32|3|18|16758.54|0.02|0.08|N|O|1997-03-08|1997-03-07|1997-03-25|COLLECT COD|MAIL|. requests along the furiously regular +29345|1375|76|4|25|31909.25|0.01|0.08|N|O|1997-03-20|1997-04-18|1997-04-19|COLLECT COD|RAIL|slyly final +29345|1018|89|5|28|25732.28|0.06|0.00|N|O|1997-04-20|1997-04-29|1997-04-28|COLLECT COD|FOB|nic theodolites about th +29346|232|87|1|33|37363.59|0.05|0.00|R|F|1994-12-14|1994-11-07|1995-01-12|TAKE BACK RETURN|AIR|ctions int +29346|1588|89|2|3|4468.74|0.08|0.08|A|F|1994-11-08|1994-09-20|1994-12-04|TAKE BACK RETURN|SHIP|lly after the c +29346|408|67|3|29|37943.60|0.06|0.07|R|F|1994-09-22|1994-09-19|1994-10-15|COLLECT COD|AIR|beans integrate fur +29346|576|77|4|35|51679.95|0.08|0.07|A|F|1994-08-30|1994-09-25|1994-09-02|COLLECT COD|AIR| dolphins. +29346|810|11|5|28|47902.68|0.06|0.03|A|F|1994-08-18|1994-11-10|1994-08-28|NONE|AIR|en hockey players. quickly regular p +29347|665|97|1|48|75151.68|0.04|0.06|R|F|1992-09-02|1992-10-29|1992-09-15|TAKE BACK RETURN|AIR|ly bold theodolites wake slyly. accounts i +29347|550|41|2|29|42065.95|0.00|0.03|R|F|1992-12-08|1992-09-20|1992-12-15|NONE|FOB|its are slyly acro +29347|385|42|3|1|1285.38|0.05|0.03|A|F|1992-09-20|1992-10-11|1992-10-19|TAKE BACK RETURN|SHIP|imes regular instructions +29347|472|73|4|40|54898.80|0.04|0.01|A|F|1992-08-23|1992-09-21|1992-09-11|NONE|TRUCK|sits use quickly p +29347|1392|7|5|5|6466.95|0.10|0.04|A|F|1992-08-15|1992-10-13|1992-09-11|DELIVER IN PERSON|FOB|ly special p +29347|477|36|6|1|1377.47|0.09|0.02|A|F|1992-10-11|1992-11-09|1992-11-10|COLLECT COD|AIR|dencies. furiously unusual instructions so +29347|124|3|7|27|27651.24|0.07|0.06|R|F|1992-08-20|1992-11-08|1992-08-28|TAKE BACK RETURN|AIR|hely. unusual, r +29348|150|77|1|30|31504.50|0.01|0.02|N|O|1998-08-13|1998-08-22|1998-08-30|DELIVER IN PERSON|SHIP| slyly final deposits +29348|1464|82|2|42|57349.32|0.04|0.01|N|O|1998-06-02|1998-08-17|1998-06-04|NONE|SHIP|lyly final packages nag afte +29348|21|47|3|30|27630.60|0.08|0.02|N|O|1998-07-18|1998-07-06|1998-08-16|COLLECT COD|MAIL| boost. fluffily bold packages haggle ste +29348|18|69|4|34|31212.34|0.10|0.02|N|O|1998-07-17|1998-08-28|1998-08-03|TAKE BACK RETURN|MAIL|ests cajole-- ironic de +29348|1796|97|5|4|6791.16|0.06|0.07|N|O|1998-08-26|1998-08-16|1998-09-12|TAKE BACK RETURN|SHIP|to beans-- regular reques +29349|1356|95|1|49|61610.15|0.08|0.07|A|F|1993-08-07|1993-08-28|1993-08-17|DELIVER IN PERSON|RAIL| above the carefully expres +29349|1231|43|2|8|9057.84|0.09|0.00|R|F|1993-06-13|1993-07-25|1993-06-26|COLLECT COD|TRUCK|s cajole idly f +29349|159|38|3|17|18005.55|0.04|0.03|R|F|1993-07-05|1993-09-06|1993-07-19|NONE|RAIL|ingly final re +29350|1595|76|1|34|50884.06|0.02|0.02|R|F|1994-10-23|1994-10-03|1994-11-03|NONE|FOB|. blithely ironic pinto beans boost quickl +29350|1200|73|2|42|46250.40|0.05|0.05|R|F|1994-09-12|1994-10-26|1994-09-15|TAKE BACK RETURN|AIR|totes. bold theodolites integrate sl +29350|1781|8|3|32|53848.96|0.10|0.06|R|F|1994-11-18|1994-11-20|1994-11-22|TAKE BACK RETURN|MAIL|ccording to the fu +29350|141|68|4|2|2082.28|0.06|0.01|A|F|1994-12-21|1994-10-23|1995-01-13|COLLECT COD|FOB|l, unusual asymptot +29351|64|15|1|30|28921.80|0.04|0.07|N|O|1995-11-16|1995-12-13|1995-12-11|DELIVER IN PERSON|SHIP|e furiously fluffy packages. +29376|649|12|1|19|29443.16|0.06|0.08|A|F|1992-09-29|1992-10-04|1992-10-27|TAKE BACK RETURN|FOB|nts are furiously carefully fin +29376|258|59|2|3|3474.75|0.06|0.02|A|F|1992-08-15|1992-09-16|1992-09-02|NONE|AIR|. slyly silent ideas wake quickly alongside +29376|924|25|3|49|89421.08|0.08|0.02|A|F|1992-09-07|1992-10-13|1992-10-07|NONE|REG AIR|ts use alongside of the final requests. b +29376|1074|10|4|26|25351.82|0.00|0.06|A|F|1992-09-21|1992-10-16|1992-10-16|TAKE BACK RETURN|FOB|nic deposits poach above the packages. s +29377|1204|16|1|41|45313.20|0.03|0.03|N|O|1998-07-20|1998-06-16|1998-07-30|TAKE BACK RETURN|FOB|fully ironic req +29378|100|26|1|46|46004.60|0.04|0.04|N|O|1996-09-24|1996-07-21|1996-10-09|TAKE BACK RETURN|FOB| somas after the even, express pinto bean +29378|1063|34|2|42|40490.52|0.01|0.04|N|O|1996-07-10|1996-07-28|1996-07-20|TAKE BACK RETURN|MAIL|old dinos are among the a +29378|298|80|3|39|46733.31|0.06|0.01|N|O|1996-08-18|1996-08-27|1996-08-23|DELIVER IN PERSON|FOB|final pinto beans cajole alon +29378|1680|81|4|30|47450.40|0.01|0.02|N|O|1996-07-03|1996-08-23|1996-08-01|TAKE BACK RETURN|REG AIR|es sleep blithely about th +29378|1368|69|5|48|60929.28|0.09|0.07|N|O|1996-07-18|1996-07-15|1996-07-22|NONE|TRUCK|quests: dolphins wake +29378|928|63|6|12|21947.04|0.06|0.03|N|O|1996-07-27|1996-07-13|1996-08-04|DELIVER IN PERSON|REG AIR|ect quickly. quickly furious pi +29378|1680|63|7|34|53777.12|0.01|0.02|N|O|1996-06-14|1996-07-12|1996-06-23|TAKE BACK RETURN|FOB| dazzle. packages nag blithely +29379|1472|12|1|11|15108.17|0.04|0.03|N|O|1996-10-06|1996-11-10|1996-10-31|DELIVER IN PERSON|SHIP|requests affix fluffil +29379|1566|7|2|42|61637.52|0.05|0.01|N|O|1996-12-12|1996-10-31|1996-12-15|DELIVER IN PERSON|MAIL|beans around the express, even foxes +29379|1114|51|3|36|36543.96|0.01|0.01|N|O|1996-12-10|1996-09-28|1997-01-05|DELIVER IN PERSON|FOB|e: tithes are blithely. special, even excu +29379|1868|55|4|49|86723.14|0.06|0.07|N|O|1996-08-26|1996-11-16|1996-08-31|TAKE BACK RETURN|REG AIR|ages. ironic requests among the slyly f +29379|1817|18|5|21|36095.01|0.06|0.07|N|O|1996-11-23|1996-11-10|1996-12-03|COLLECT COD|REG AIR|uses. packages are. bold, ironic +29380|1401|19|1|28|36467.20|0.10|0.06|A|F|1994-07-27|1994-06-03|1994-08-03|COLLECT COD|AIR|kages. regular th +29380|1499|78|2|22|30810.78|0.05|0.02|R|F|1994-05-26|1994-07-17|1994-06-04|TAKE BACK RETURN|MAIL|cajole. blithely regular +29380|1465|83|3|22|30062.12|0.10|0.07|R|F|1994-08-07|1994-06-25|1994-08-30|NONE|MAIL|ose carefully iron +29381|1016|17|1|46|42182.46|0.08|0.02|N|O|1996-11-15|1996-09-28|1996-11-24|TAKE BACK RETURN|MAIL|the ironically regular +29381|420|50|2|22|29049.24|0.09|0.08|N|O|1996-09-15|1996-10-11|1996-10-02|DELIVER IN PERSON|SHIP|ironic depe +29381|367|24|3|27|34218.72|0.10|0.08|N|O|1996-11-08|1996-10-23|1996-12-06|TAKE BACK RETURN|REG AIR|de of the furiously expr +29381|616|10|4|18|27298.98|0.08|0.01|N|O|1996-11-16|1996-10-05|1996-11-24|DELIVER IN PERSON|REG AIR|ely ironic dugouts boost car +29382|359|16|1|15|18890.25|0.05|0.00|R|F|1993-12-26|1994-01-16|1994-01-07|TAKE BACK RETURN|MAIL|carefully regular package +29382|1149|86|2|20|21002.80|0.08|0.00|R|F|1993-12-08|1994-01-02|1994-01-05|NONE|FOB| pending instructions nag fl +29382|1608|32|3|12|18115.20|0.01|0.08|R|F|1994-03-15|1994-01-22|1994-03-27|NONE|FOB|carefully +29382|225|7|4|11|12377.42|0.06|0.02|A|F|1994-02-27|1994-01-05|1994-03-07|DELIVER IN PERSON|RAIL|g the daringly +29382|148|1|5|34|35636.76|0.00|0.06|A|F|1994-03-19|1994-01-08|1994-03-22|COLLECT COD|FOB|ins. furiously regular instruction +29382|451|10|6|45|60815.25|0.01|0.05|R|F|1994-03-15|1994-01-27|1994-04-13|NONE|AIR|uickly final multipliers. slyly final depe +29383|399|56|1|3|3898.17|0.04|0.05|N|O|1995-12-21|1996-01-16|1996-01-06|NONE|RAIL| the express instructions. +29383|1362|77|2|17|21477.12|0.07|0.07|N|O|1996-01-01|1995-12-25|1996-01-30|COLLECT COD|TRUCK|er daringly regular pinto beans. ev +29383|1040|11|3|31|29172.24|0.10|0.00|N|O|1996-02-01|1996-01-05|1996-02-12|TAKE BACK RETURN|REG AIR|accounts sleep according to t +29383|1308|23|4|32|38697.60|0.00|0.08|N|O|1996-01-04|1995-12-20|1996-01-18|TAKE BACK RETURN|TRUCK|s cajole sometimes boldly final dec +29383|1103|76|5|40|40164.00|0.02|0.01|N|O|1995-12-09|1996-01-07|1995-12-31|NONE|FOB|thely. regular noto +29408|1786|87|1|40|67511.20|0.02|0.08|R|F|1993-08-21|1993-07-26|1993-09-10|COLLECT COD|RAIL|yly above +29408|391|76|2|16|20662.24|0.03|0.07|A|F|1993-08-21|1993-07-16|1993-09-14|TAKE BACK RETURN|SHIP|ording to the carefully regular pearls +29408|318|47|3|15|18274.65|0.02|0.02|A|F|1993-08-26|1993-06-22|1993-09-07|DELIVER IN PERSON|FOB|hins cajole. blithely ironic accounts aff +29408|94|20|4|44|43739.96|0.03|0.03|R|F|1993-06-14|1993-07-04|1993-06-30|COLLECT COD|TRUCK|kages shall have to haggle furio +29409|403|4|1|5|6517.00|0.01|0.04|A|F|1995-03-11|1995-04-11|1995-03-14|DELIVER IN PERSON|FOB|ments. quickly fina +29409|150|29|2|22|23103.30|0.07|0.06|R|F|1995-02-19|1995-03-13|1995-03-01|NONE|SHIP|quests maintain qu +29409|645|8|3|35|54097.40|0.03|0.04|A|F|1995-01-27|1995-04-10|1995-01-30|COLLECT COD|MAIL|aring, unusual requests across t +29409|88|89|4|1|988.08|0.01|0.00|A|F|1995-01-21|1995-04-02|1995-02-03|NONE|TRUCK| final foxes. blithely +29410|1416|34|1|49|64553.09|0.06|0.00|A|F|1994-11-22|1994-11-13|1994-12-01|COLLECT COD|TRUCK|e quickly according to the pending, perman +29410|778|79|2|9|15108.93|0.03|0.01|A|F|1994-09-29|1994-10-18|1994-10-24|COLLECT COD|MAIL|d packages wake a +29410|582|43|3|21|31134.18|0.04|0.03|A|F|1994-09-24|1994-12-01|1994-09-27|COLLECT COD|FOB|rs. blithely pe +29410|1040|41|4|34|31995.36|0.04|0.02|R|F|1995-01-03|1994-11-02|1995-01-09|DELIVER IN PERSON|FOB|er ironic decoys nag carefully ironic pac +29411|210|65|1|38|42187.98|0.04|0.06|A|F|1992-07-31|1992-06-23|1992-08-19|NONE|MAIL|e quickly express packages cajole slyly +29411|283|84|2|50|59164.00|0.08|0.08|R|F|1992-06-23|1992-07-04|1992-07-17|DELIVER IN PERSON|REG AIR|al accounts. carefully regular packages abo +29411|1284|85|3|36|42670.08|0.03|0.04|A|F|1992-05-27|1992-07-04|1992-06-24|COLLECT COD|AIR|pending requ +29411|633|96|4|50|76681.50|0.03|0.03|A|F|1992-07-10|1992-06-12|1992-08-05|DELIVER IN PERSON|AIR| after the +29411|1900|1|5|8|14415.20|0.03|0.08|R|F|1992-05-17|1992-05-08|1992-05-27|NONE|FOB|dolites affix against the +29411|563|94|6|43|62933.08|0.09|0.05|A|F|1992-07-02|1992-06-12|1992-07-24|COLLECT COD|SHIP|fter the c +29411|279|7|7|36|42453.72|0.05|0.02|R|F|1992-04-24|1992-06-03|1992-05-12|DELIVER IN PERSON|TRUCK|ets. requests dazzle fluffi +29412|758|59|1|14|23222.50|0.09|0.06|A|F|1992-04-27|1992-02-21|1992-05-25|TAKE BACK RETURN|TRUCK|e blithely unusual instru +29413|607|1|1|46|69349.60|0.04|0.07|R|F|1994-06-03|1994-04-14|1994-06-18|DELIVER IN PERSON|SHIP|blithely regular instructions +29413|1371|10|2|46|58529.02|0.03|0.01|A|F|1994-02-21|1994-04-29|1994-03-11|DELIVER IN PERSON|FOB|es. furiously final requ +29413|583|84|3|40|59343.20|0.05|0.06|A|F|1994-04-14|1994-04-02|1994-05-02|TAKE BACK RETURN|AIR|uickly even sauternes are quickly +29414|1627|51|1|18|27515.16|0.04|0.02|N|O|1997-11-20|1997-12-02|1997-11-24|DELIVER IN PERSON|SHIP|ly quickly bold theodolites? +29414|528|59|2|7|9999.64|0.06|0.08|N|O|1998-01-11|1997-11-07|1998-02-06|DELIVER IN PERSON|MAIL|es. final, bold senti +29414|122|1|3|36|36796.32|0.01|0.00|N|O|1997-12-19|1997-11-15|1998-01-12|DELIVER IN PERSON|REG AIR|eodolites doubt fluff +29414|1160|61|4|4|4244.64|0.09|0.06|N|O|1997-10-01|1997-12-06|1997-10-24|DELIVER IN PERSON|MAIL|egular requests sleep carefully furiously e +29415|1102|39|1|6|6018.60|0.07|0.01|A|F|1994-08-16|1994-09-27|1994-09-11|COLLECT COD|REG AIR|ular, fluffy requests wake carefully aga +29415|183|10|2|4|4332.72|0.04|0.07|R|F|1994-09-15|1994-09-15|1994-10-03|DELIVER IN PERSON|FOB|elets boost regular pa +29440|1217|92|1|33|36900.93|0.02|0.07|A|F|1993-04-23|1993-06-08|1993-05-19|NONE|SHIP|ers x-ray carefully. sl +29440|610|11|2|38|57403.18|0.07|0.02|A|F|1993-05-11|1993-06-27|1993-05-18|DELIVER IN PERSON|FOB|ainst the even, regular reque +29441|941|42|1|50|92097.00|0.04|0.07|R|F|1992-09-05|1992-11-19|1992-09-25|TAKE BACK RETURN|FOB|e regular accounts! blithely careful deposi +29441|437|25|2|10|13374.30|0.03|0.00|A|F|1992-09-05|1992-11-26|1992-09-22|NONE|SHIP|packages. instructions play qu +29441|1060|96|3|14|13454.84|0.03|0.06|A|F|1992-10-12|1992-11-29|1992-11-04|NONE|FOB|accounts h +29441|595|26|4|21|31407.39|0.06|0.04|R|F|1992-11-26|1992-11-20|1992-12-07|DELIVER IN PERSON|MAIL|to the bold, unusual accounts. carefu +29441|1324|1|5|22|26957.04|0.04|0.02|R|F|1992-12-21|1992-11-23|1992-12-27|TAKE BACK RETURN|AIR|jole blithely ironic requests. special +29442|904|5|1|29|52342.10|0.03|0.07|N|O|1998-04-16|1998-03-17|1998-05-15|NONE|MAIL|side of the regular requests hagg +29442|1602|44|2|11|16539.60|0.04|0.03|N|O|1998-06-01|1998-04-15|1998-06-29|NONE|REG AIR|le fluffily. furiousl +29442|199|52|3|14|15388.66|0.02|0.04|N|O|1998-02-27|1998-04-17|1998-02-28|TAKE BACK RETURN|RAIL|es. pinto beans breach about the flu +29443|705|2|1|43|69045.10|0.02|0.00|R|F|1993-05-14|1993-05-14|1993-06-10|DELIVER IN PERSON|RAIL|structions are quickly. fluffy +29443|526|17|2|47|67046.44|0.02|0.05|R|F|1993-05-08|1993-04-17|1993-05-28|COLLECT COD|SHIP|e furiously pending, pending acco +29443|323|8|3|39|47709.48|0.03|0.04|A|F|1993-04-11|1993-03-22|1993-05-05|COLLECT COD|MAIL|he blithely regular accoun +29443|1821|51|4|10|17228.20|0.00|0.04|R|F|1993-03-15|1993-05-01|1993-03-27|COLLECT COD|SHIP| the regular, bold instructions. +29443|744|9|5|17|27960.58|0.03|0.06|A|F|1993-03-30|1993-05-11|1993-04-21|DELIVER IN PERSON|AIR|p around the fluffily silent accou +29443|1273|11|6|35|41099.45|0.08|0.00|A|F|1993-05-02|1993-05-12|1993-05-31|NONE|MAIL| across the slyly bol +29443|113|14|7|25|25327.75|0.08|0.03|R|F|1993-06-09|1993-04-15|1993-06-22|TAKE BACK RETURN|SHIP|hely pending packa +29444|1313|52|1|35|42500.85|0.10|0.02|N|O|1996-08-11|1996-09-11|1996-08-16|NONE|SHIP|eep carefully blithely +29444|89|40|2|32|31650.56|0.05|0.07|N|O|1996-06-21|1996-08-08|1996-06-26|DELIVER IN PERSON|MAIL|s integrate q +29444|1721|48|3|48|77890.56|0.07|0.07|N|O|1996-08-20|1996-08-10|1996-08-27|DELIVER IN PERSON|SHIP|hely even pack +29444|618|19|4|8|12148.88|0.05|0.02|N|O|1996-08-09|1996-09-12|1996-08-20|DELIVER IN PERSON|AIR|ans sleep among +29444|1804|48|5|20|34116.00|0.04|0.02|N|O|1996-09-10|1996-07-30|1996-09-24|NONE|RAIL|s. pending +29445|1647|30|1|29|44910.56|0.09|0.02|A|F|1993-12-17|1993-12-20|1993-12-21|NONE|AIR|ly final warthogs ha +29446|1523|4|1|12|17094.24|0.00|0.00|N|O|1996-07-10|1996-06-09|1996-07-31|DELIVER IN PERSON|TRUCK|l packages about the even, spec +29446|1094|30|2|47|46769.23|0.06|0.04|N|O|1996-06-05|1996-06-16|1996-06-21|DELIVER IN PERSON|MAIL|ial, ironic deposits until the slyly speci +29446|78|79|3|15|14671.05|0.08|0.04|N|O|1996-07-17|1996-07-26|1996-07-26|DELIVER IN PERSON|TRUCK| deposits sleep carefull +29446|1562|43|4|41|60005.96|0.08|0.08|N|O|1996-05-04|1996-07-22|1996-05-29|NONE|MAIL|usual, regular requests poac +29447|1134|35|1|37|38299.81|0.03|0.03|N|O|1997-06-08|1997-07-25|1997-06-20|COLLECT COD|AIR|regular theod +29447|1077|13|2|22|21517.54|0.02|0.03|N|O|1997-08-12|1997-08-01|1997-08-30|NONE|AIR|ideas nag quickly above the blithely un +29447|1144|53|3|35|36579.90|0.05|0.05|N|O|1997-05-29|1997-07-11|1997-06-04|COLLECT COD|REG AIR|ndencies. pinto beans ha +29447|389|74|4|12|15472.56|0.07|0.06|N|O|1997-05-23|1997-07-08|1997-06-13|TAKE BACK RETURN|REG AIR|nts wake th +29472|1853|40|1|25|43871.25|0.10|0.02|R|F|1993-05-05|1993-06-10|1993-05-09|NONE|SHIP|es about the final foxes. sile +29473|239|67|1|48|54683.04|0.10|0.00|R|F|1992-04-17|1992-03-31|1992-05-03|TAKE BACK RETURN|AIR|kly final packages. slyly bold +29473|1769|96|2|6|10024.56|0.10|0.08|A|F|1992-06-12|1992-04-10|1992-06-14|NONE|SHIP|eas use final packages +29473|581|82|3|2|2963.16|0.10|0.06|A|F|1992-05-28|1992-03-19|1992-06-25|TAKE BACK RETURN|FOB|sts. carefu +29473|797|94|4|13|22071.27|0.03|0.02|A|F|1992-06-09|1992-04-02|1992-06-26|DELIVER IN PERSON|MAIL|y ironic instructions accor +29473|740|5|5|30|49222.20|0.08|0.04|R|F|1992-03-20|1992-05-11|1992-03-25|TAKE BACK RETURN|SHIP|mong the slyly r +29473|725|26|6|15|24385.80|0.09|0.00|A|F|1992-05-11|1992-04-05|1992-06-06|NONE|MAIL| accounts ac +29473|1644|68|7|39|60279.96|0.03|0.07|A|F|1992-02-18|1992-04-19|1992-03-02|TAKE BACK RETURN|SHIP|furious requests will haggle. blit +29474|563|24|1|41|60005.96|0.01|0.05|R|F|1994-05-12|1994-06-03|1994-06-11|NONE|FOB|tegrate slyly furiously regular requests +29474|1945|46|2|13|24010.22|0.09|0.05|A|F|1994-04-03|1994-05-14|1994-04-17|DELIVER IN PERSON|MAIL|s cajole at the finally regula +29474|889|56|3|5|8949.40|0.01|0.05|A|F|1994-03-22|1994-06-08|1994-04-04|DELIVER IN PERSON|FOB| the carefully silent reques +29475|270|71|1|30|35108.10|0.07|0.03|R|F|1993-04-02|1993-04-02|1993-05-01|DELIVER IN PERSON|REG AIR|r theodolites. ironic ideas a +29475|1928|73|2|16|29278.72|0.05|0.00|A|F|1993-03-10|1993-05-06|1993-03-25|COLLECT COD|MAIL|ites integrate slyly +29475|62|13|3|47|45216.82|0.01|0.07|A|F|1993-05-08|1993-04-09|1993-06-04|TAKE BACK RETURN|SHIP|luffily blithe requests. caref +29475|636|99|4|27|41489.01|0.03|0.07|A|F|1993-05-08|1993-04-05|1993-06-03|NONE|TRUCK|yers. carefully regular theodolites are sly +29475|1561|42|5|48|70202.88|0.04|0.07|R|F|1993-05-30|1993-05-06|1993-06-12|DELIVER IN PERSON|REG AIR| bold package +29475|171|72|6|4|4284.68|0.09|0.07|A|F|1993-05-18|1993-05-22|1993-05-23|DELIVER IN PERSON|REG AIR|nag regularly above the busy r +29475|1121|30|7|21|21464.52|0.02|0.07|R|F|1993-03-12|1993-04-28|1993-03-31|NONE|REG AIR|key players after the special instr +29476|1240|41|1|21|23966.04|0.09|0.00|N|O|1997-11-05|1997-11-09|1997-11-29|TAKE BACK RETURN|MAIL|iously final pinto beans. fina +29476|523|54|2|47|66905.44|0.01|0.07|N|O|1997-12-27|1997-12-02|1997-12-30|DELIVER IN PERSON|TRUCK|e quickly furiously even accounts. +29476|1134|7|3|27|27948.51|0.02|0.05|N|O|1997-10-23|1997-10-31|1997-11-17|TAKE BACK RETURN|REG AIR|solve furiousl +29476|468|98|4|31|42422.26|0.02|0.06|N|O|1997-10-18|1997-11-14|1997-11-16|TAKE BACK RETURN|RAIL|l requests may use slyly about the acco +29476|1925|58|5|41|74903.72|0.04|0.03|N|O|1997-12-27|1997-11-19|1998-01-11|TAKE BACK RETURN|RAIL| theodolites use alongside of th +29476|1228|29|6|20|22584.40|0.03|0.08|N|O|1997-09-25|1997-11-27|1997-10-14|COLLECT COD|RAIL|riously regular pla +29476|705|6|7|35|56199.50|0.07|0.07|N|O|1997-11-10|1997-11-26|1997-11-25|TAKE BACK RETURN|MAIL|efully along the silent, special req +29477|1158|31|1|30|31774.50|0.07|0.04|N|O|1998-03-04|1998-02-21|1998-04-03|COLLECT COD|MAIL|s sleep carefully regular foxes +29477|6|7|2|7|6342.00|0.02|0.04|N|O|1998-02-20|1998-03-12|1998-03-17|NONE|RAIL|otes along th +29477|1218|19|3|21|23503.41|0.02|0.06|N|O|1998-03-20|1998-03-20|1998-03-22|COLLECT COD|FOB|al deposits haggle slyly a +29477|1346|61|4|47|58624.98|0.02|0.04|N|O|1998-02-11|1998-02-23|1998-03-06|NONE|SHIP|furiously unusual theodolites across the sl +29477|1065|36|5|8|7728.48|0.10|0.05|N|O|1998-03-23|1998-04-15|1998-04-13|NONE|REG AIR|ly foxes. furiously fin +29477|1946|91|6|23|42502.62|0.08|0.01|N|O|1998-05-17|1998-03-07|1998-06-03|NONE|RAIL|e quickly according to the furiously dar +29477|1293|68|7|23|27468.67|0.10|0.01|N|O|1998-03-28|1998-03-07|1998-04-04|NONE|MAIL|thely. fur +29478|1547|88|1|10|14485.40|0.10|0.06|R|F|1993-04-30|1993-07-01|1993-05-01|COLLECT COD|RAIL|tructions integrate alongside of the +29478|241|42|2|45|51355.80|0.05|0.03|R|F|1993-07-25|1993-06-22|1993-08-14|COLLECT COD|AIR|ss pinto beans along the quic +29479|386|87|1|49|63032.62|0.07|0.07|N|O|1998-01-12|1997-12-14|1998-01-21|COLLECT COD|MAIL| integrate blithely quickl +29479|516|7|2|44|62326.44|0.04|0.07|N|O|1998-01-17|1997-11-28|1998-02-06|NONE|REG AIR|ven packages are above the fin +29479|1145|54|3|46|48122.44|0.04|0.02|N|O|1997-11-12|1997-11-30|1997-11-18|TAKE BACK RETURN|FOB|x slyly. special, u +29504|898|99|1|7|12592.23|0.01|0.01|A|F|1993-10-08|1993-12-10|1993-10-25|TAKE BACK RETURN|RAIL|luffily. blithely ironic t +29504|1827|71|2|14|24203.48|0.10|0.00|A|F|1993-10-10|1993-12-05|1993-10-28|NONE|RAIL|ual packages? regular, regular Tiresias +29504|1528|29|3|42|60039.84|0.08|0.06|A|F|1993-12-23|1993-12-17|1994-01-19|DELIVER IN PERSON|TRUCK|ular gifts b +29504|186|65|4|22|23895.96|0.04|0.06|A|F|1993-10-31|1993-11-05|1993-11-09|DELIVER IN PERSON|FOB|l deposits c +29504|1019|55|5|36|33120.36|0.06|0.07|A|F|1994-01-04|1993-11-24|1994-02-03|DELIVER IN PERSON|RAIL|ironic accounts nod above the ironic hockey +29504|752|85|6|34|56193.50|0.04|0.07|A|F|1993-12-19|1993-10-28|1994-01-08|TAKE BACK RETURN|SHIP|ously. quickly +29504|1407|86|7|31|40560.40|0.03|0.01|A|F|1993-11-21|1993-12-01|1993-12-13|COLLECT COD|SHIP|cajole carefully furiously regular platel +29505|178|5|1|33|35579.61|0.08|0.01|A|F|1993-01-25|1993-03-03|1993-01-27|NONE|TRUCK|ronic, final packages sleep alongside of t +29505|1812|42|2|40|68552.40|0.05|0.04|A|F|1993-01-21|1993-03-04|1993-01-23|DELIVER IN PERSON|MAIL|onic accounts are final req +29505|1236|11|3|42|47763.66|0.04|0.08|R|F|1993-04-01|1993-02-17|1993-04-07|TAKE BACK RETURN|REG AIR|usily pending accounts among +29505|1961|94|4|5|9314.80|0.00|0.01|A|F|1993-04-03|1993-03-25|1993-04-12|NONE|FOB|elets are carefully fluffily expre +29505|262|17|5|22|25569.72|0.09|0.03|A|F|1993-01-10|1993-02-02|1993-02-03|TAKE BACK RETURN|TRUCK| theodolite +29505|655|56|6|34|52892.10|0.02|0.02|A|F|1993-03-22|1993-02-14|1993-04-12|NONE|REG AIR|. deposits dazzle according to the +29506|1495|13|1|12|16757.88|0.03|0.05|N|O|1995-09-10|1995-09-03|1995-09-30|COLLECT COD|MAIL|ans. slyly ironic theodolites +29506|116|69|2|42|42676.62|0.07|0.08|N|O|1995-09-14|1995-07-18|1995-09-19|TAKE BACK RETURN|TRUCK|ts was fluffily about the regular +29506|955|58|3|35|64958.25|0.10|0.03|N|O|1995-08-27|1995-08-11|1995-09-20|DELIVER IN PERSON|FOB|ously regular r +29506|355|12|4|7|8787.45|0.09|0.04|N|O|1995-08-27|1995-08-30|1995-09-06|DELIVER IN PERSON|REG AIR| special requests use blith +29506|1093|94|5|45|44734.05|0.09|0.05|N|O|1995-09-04|1995-08-06|1995-09-16|DELIVER IN PERSON|RAIL|haggle regularly pending req +29506|1383|98|6|35|44953.30|0.07|0.04|N|O|1995-10-14|1995-09-12|1995-11-10|NONE|TRUCK|nticingly blithe packag +29507|1186|87|1|1|1087.18|0.00|0.03|R|F|1992-04-02|1992-04-24|1992-04-23|TAKE BACK RETURN|AIR|fully ironic theodolites. platelets again +29507|462|21|2|18|24524.28|0.03|0.06|R|F|1992-03-29|1992-03-23|1992-04-24|COLLECT COD|FOB| fluffily bold accounts caj +29507|1439|18|3|6|8042.58|0.08|0.07|A|F|1992-05-08|1992-04-25|1992-05-11|DELIVER IN PERSON|MAIL|foxes-- unusual multiplier +29507|197|24|4|23|25235.37|0.02|0.01|A|F|1992-05-03|1992-04-03|1992-05-14|COLLECT COD|SHIP|e of the pending, speci +29507|1622|23|5|48|73133.76|0.05|0.03|A|F|1992-02-17|1992-03-28|1992-03-02|TAKE BACK RETURN|AIR| about the pinto beans. even deposits +29507|548|39|6|20|28970.80|0.01|0.05|A|F|1992-04-23|1992-04-10|1992-04-25|TAKE BACK RETURN|REG AIR|frets. quickly ironic instructions alo +29508|270|98|1|15|17554.05|0.10|0.08|R|F|1994-10-01|1994-08-20|1994-10-05|NONE|FOB|he regularly brave packages print blit +29509|1582|3|1|10|14835.80|0.09|0.04|N|O|1996-07-01|1996-06-28|1996-07-20|COLLECT COD|RAIL|blithely regular +29509|1986|75|2|8|15103.84|0.01|0.07|N|O|1996-05-05|1996-06-06|1996-05-06|COLLECT COD|REG AIR|packages. regular, regular ideas +29509|1188|25|3|32|34853.76|0.04|0.05|N|O|1996-06-03|1996-05-24|1996-06-17|NONE|SHIP|kly regular packages haggle a +29509|1236|48|4|12|13646.76|0.02|0.00|N|O|1996-07-28|1996-05-31|1996-08-26|TAKE BACK RETURN|AIR|ffily ironic requests sleep alon +29510|644|7|1|5|7723.20|0.00|0.08|R|F|1995-05-25|1995-06-12|1995-06-07|COLLECT COD|TRUCK|fully past the slyly regula +29510|1975|20|2|4|7507.88|0.01|0.05|N|O|1995-06-28|1995-07-04|1995-07-21|DELIVER IN PERSON|FOB|y final instructions. daring req +29511|1951|84|1|16|29647.20|0.10|0.00|R|F|1995-05-23|1995-06-25|1995-06-17|TAKE BACK RETURN|SHIP|leep carefully? +29511|1866|96|2|13|22982.18|0.02|0.02|A|F|1995-04-15|1995-06-23|1995-04-17|TAKE BACK RETURN|FOB| boost. pending dependencies +29536|452|11|1|16|21639.20|0.07|0.08|R|F|1992-10-18|1992-10-24|1992-11-04|TAKE BACK RETURN|AIR|gle carefully blithely eve +29536|533|94|2|18|25803.54|0.04|0.00|A|F|1992-11-29|1992-11-17|1992-12-24|NONE|RAIL|lly regular packages cajole fluffily +29536|1102|3|3|19|19058.90|0.02|0.00|A|F|1992-12-24|1992-10-12|1993-01-23|DELIVER IN PERSON|SHIP|riously abo +29536|416|17|4|46|60554.86|0.09|0.00|A|F|1992-11-18|1992-12-03|1992-12-14|DELIVER IN PERSON|TRUCK|ide of the furiously +29536|1407|25|5|35|45794.00|0.08|0.00|A|F|1992-11-09|1992-10-12|1992-12-06|COLLECT COD|RAIL|nts. blithely pending idea +29536|1095|31|6|8|7968.72|0.05|0.07|A|F|1992-12-31|1992-11-21|1993-01-29|NONE|MAIL|e special requests. ironic wa +29536|1864|51|7|28|49444.08|0.08|0.00|R|F|1992-12-05|1992-10-11|1992-12-10|NONE|AIR|. slyly special accounts are. regular, e +29537|732|97|1|28|45716.44|0.08|0.03|A|F|1992-11-06|1992-11-13|1992-11-29|NONE|AIR|bold, regular requests. furiously ironic f +29537|264|46|2|42|48898.92|0.06|0.07|R|F|1992-12-31|1992-12-13|1993-01-26|NONE|RAIL|ged theodolites +29537|910|13|3|1|1810.91|0.02|0.03|R|F|1993-01-19|1992-12-16|1993-02-15|DELIVER IN PERSON|SHIP|ickly above the quickl +29537|1088|24|4|38|37585.04|0.01|0.08|A|F|1992-12-31|1992-10-21|1993-01-27|DELIVER IN PERSON|REG AIR|nstructions. fluffi +29537|929|98|5|11|20129.12|0.10|0.06|R|F|1992-12-12|1992-11-17|1992-12-26|NONE|SHIP|gle carefully. c +29537|772|69|6|13|21746.01|0.00|0.05|A|F|1992-10-22|1992-11-10|1992-11-01|NONE|SHIP|requests. reques +29537|984|85|7|33|62204.34|0.01|0.08|R|F|1992-12-10|1992-12-08|1992-12-14|NONE|MAIL| final deposits above the furiou +29538|1968|69|1|12|22439.52|0.03|0.06|R|F|1995-03-21|1995-02-15|1995-04-03|TAKE BACK RETURN|TRUCK|cajole quickly +29539|303|32|1|47|56555.10|0.06|0.03|N|O|1995-07-24|1995-06-01|1995-08-11|COLLECT COD|FOB| use slyly +29539|1747|48|2|20|32974.80|0.00|0.04|N|O|1995-08-09|1995-07-17|1995-08-13|COLLECT COD|RAIL|ld packages wake carefully along +29539|1385|24|3|7|9004.66|0.05|0.06|N|O|1995-08-15|1995-06-09|1995-08-30|NONE|AIR|ong the blithely s +29540|1937|82|1|36|66201.48|0.04|0.05|N|O|1997-10-04|1997-09-27|1997-10-12|DELIVER IN PERSON|REG AIR|, ironic accou +29540|1768|69|2|14|23376.64|0.08|0.06|N|O|1997-07-28|1997-09-05|1997-07-29|DELIVER IN PERSON|FOB|y unusual, bold pinto beans. theodoli +29540|1803|33|3|35|59668.00|0.01|0.03|N|O|1997-10-12|1997-08-21|1997-11-02|DELIVER IN PERSON|SHIP|y even deposits nag furiously about +29540|587|48|4|29|43139.82|0.05|0.05|N|O|1997-07-29|1997-09-28|1997-08-20|COLLECT COD|MAIL|al packages inside the ironic ideas wake ar +29540|1898|99|5|34|61196.26|0.00|0.05|N|O|1997-07-30|1997-09-21|1997-08-19|DELIVER IN PERSON|TRUCK|ely express theodolites. carefully sil +29540|208|9|6|36|39895.20|0.02|0.08|N|O|1997-08-13|1997-10-02|1997-08-24|NONE|FOB|lly among the blithely bold excuses. final +29541|1368|69|1|47|59659.92|0.04|0.07|R|F|1994-08-16|1994-10-12|1994-09-02|DELIVER IN PERSON|RAIL|requests wa +29542|107|86|1|48|48340.80|0.01|0.06|N|O|1998-05-07|1998-05-12|1998-05-23|DELIVER IN PERSON|AIR|uickly regular requests. furiously idl +29542|566|57|2|27|39597.12|0.03|0.08|N|O|1998-04-15|1998-04-16|1998-04-16|DELIVER IN PERSON|REG AIR|tions. flu +29542|250|32|3|48|55212.00|0.05|0.08|N|O|1998-07-14|1998-06-07|1998-07-30|NONE|FOB|c accounts above the c +29542|600|61|4|34|51020.40|0.10|0.07|N|O|1998-05-03|1998-05-02|1998-05-14|COLLECT COD|REG AIR|y accounts nod slyly. blith +29542|970|73|5|33|61742.01|0.08|0.08|N|O|1998-04-22|1998-05-07|1998-04-24|TAKE BACK RETURN|REG AIR| even, special requests use +29542|1216|54|6|27|30164.67|0.02|0.08|N|O|1998-06-22|1998-05-08|1998-06-29|NONE|MAIL|ironic requests. +29543|255|37|1|22|25415.50|0.10|0.04|N|O|1997-02-24|1997-04-09|1997-02-26|TAKE BACK RETURN|SHIP|ldly final packages af +29543|993|94|2|20|37879.80|0.00|0.04|N|O|1997-05-20|1997-05-05|1997-06-08|COLLECT COD|FOB|e. blithel +29543|97|48|3|40|39883.60|0.06|0.01|N|O|1997-05-05|1997-04-16|1997-05-06|TAKE BACK RETURN|RAIL|, ironic instructi +29543|1067|3|4|11|10648.66|0.03|0.02|N|O|1997-05-08|1997-03-13|1997-05-12|NONE|FOB|ccounts. slyly regular theodo +29568|701|34|1|11|17618.70|0.05|0.05|N|O|1998-03-21|1998-01-24|1998-04-07|COLLECT COD|FOB|ccounts wake blithely. furiously silent pin +29569|1877|78|1|36|64039.32|0.07|0.04|N|O|1995-07-28|1995-08-11|1995-08-15|NONE|MAIL|pecial packages. slyly unusual epitaph +29569|802|36|2|4|6811.20|0.04|0.08|N|O|1995-09-26|1995-08-26|1995-10-14|DELIVER IN PERSON|REG AIR|sly specia +29569|657|51|3|20|31153.00|0.07|0.03|N|O|1995-08-03|1995-08-12|1995-08-07|TAKE BACK RETURN|SHIP|pending deposits. furi +29569|1872|16|4|2|3547.74|0.05|0.01|N|O|1995-08-26|1995-08-28|1995-08-29|TAKE BACK RETURN|RAIL|ged accounts wake a +29569|1343|44|5|37|46040.58|0.07|0.04|N|O|1995-10-25|1995-08-17|1995-11-12|NONE|RAIL|iously pending ideas. f +29569|293|48|6|50|59664.50|0.05|0.06|N|O|1995-08-03|1995-08-14|1995-08-11|NONE|TRUCK|nts haggle furi +29569|755|52|7|30|49672.50|0.05|0.01|N|O|1995-09-15|1995-08-29|1995-09-23|TAKE BACK RETURN|SHIP|c packages thrash furious +29570|1473|13|1|40|54978.80|0.07|0.00|A|F|1994-11-15|1994-10-29|1994-11-18|COLLECT COD|RAIL|y ironic theodolites along +29570|512|3|2|17|24012.67|0.08|0.08|R|F|1994-10-26|1994-10-04|1994-10-31|COLLECT COD|FOB|blithely ironic requests are a +29570|1861|91|3|22|38782.92|0.05|0.04|A|F|1994-11-17|1994-09-20|1994-12-01|DELIVER IN PERSON|SHIP|usly final requests. quickl +29571|1577|98|1|10|14785.70|0.09|0.02|N|O|1996-05-18|1996-06-23|1996-06-14|NONE|SHIP|gle idly according to the bold, s +29571|1286|98|2|37|43929.36|0.08|0.00|N|O|1996-06-05|1996-06-18|1996-06-21|NONE|AIR|. even, regul +29571|1044|45|3|49|46306.96|0.08|0.04|N|O|1996-08-23|1996-06-04|1996-09-20|COLLECT COD|AIR|ts cajole according to the instruc +29571|454|84|4|27|36570.15|0.04|0.08|N|O|1996-08-25|1996-06-08|1996-08-30|COLLECT COD|REG AIR|slyly final platelets. slyly f +29572|197|76|1|9|9874.71|0.10|0.02|A|F|1993-06-11|1993-08-01|1993-07-04|DELIVER IN PERSON|SHIP|al packages haggle fu +29572|1926|27|2|3|5483.76|0.03|0.06|R|F|1993-07-11|1993-08-24|1993-07-26|NONE|REG AIR|foxes sleep carefully about the regul +29572|1314|91|3|34|41320.54|0.07|0.02|R|F|1993-08-28|1993-07-23|1993-09-06|COLLECT COD|MAIL|asymptotes wake pending packages. pending p +29572|1152|89|4|35|36860.25|0.09|0.03|R|F|1993-09-07|1993-07-20|1993-09-17|NONE|TRUCK|ns across the furiously regular cou +29573|1972|17|1|44|82454.68|0.07|0.08|A|F|1992-03-08|1992-02-28|1992-03-26|TAKE BACK RETURN|TRUCK|packages cajole carefully. special, +29574|1157|66|1|6|6348.90|0.01|0.00|N|O|1996-08-13|1996-09-05|1996-08-17|NONE|FOB| regular plat +29574|1679|21|2|46|72710.82|0.03|0.01|N|O|1996-08-16|1996-09-17|1996-09-12|DELIVER IN PERSON|REG AIR| furiously. quic +29574|1496|36|3|5|6987.45|0.07|0.05|N|O|1996-07-28|1996-10-05|1996-08-03|COLLECT COD|RAIL|regular platelets. final ideas boost. +29574|1206|7|4|26|28787.20|0.05|0.04|N|O|1996-09-27|1996-10-09|1996-09-29|COLLECT COD|RAIL|above the platelet +29575|1852|53|1|22|38584.70|0.08|0.06|A|F|1992-09-12|1992-07-05|1992-09-23|DELIVER IN PERSON|RAIL|. regular requests doze furiously-- furio +29600|1907|8|1|1|1808.90|0.10|0.08|N|O|1996-03-05|1996-03-21|1996-03-16|NONE|RAIL|riously fi +29600|1908|9|2|34|61536.60|0.04|0.02|N|O|1996-01-27|1996-03-29|1996-02-12|DELIVER IN PERSON|RAIL| express accounts thrash +29600|1370|71|3|1|1271.37|0.09|0.03|N|O|1996-04-25|1996-03-13|1996-05-17|COLLECT COD|REG AIR|r deposits. special in +29600|1482|61|4|22|30436.56|0.04|0.04|N|O|1996-03-05|1996-03-01|1996-03-13|NONE|AIR|refully pending frets. quickl +29601|302|31|1|16|19236.80|0.01|0.07|N|O|1998-06-16|1998-07-26|1998-07-13|TAKE BACK RETURN|REG AIR|ticing account +29601|937|6|2|29|53299.97|0.10|0.04|N|O|1998-07-11|1998-06-29|1998-07-13|TAKE BACK RETURN|FOB|ests haggle +29601|432|33|3|41|54629.63|0.05|0.05|N|O|1998-06-25|1998-07-28|1998-07-20|TAKE BACK RETURN|TRUCK| quickly ironic accou +29601|994|29|4|34|64429.66|0.00|0.04|N|O|1998-07-29|1998-07-18|1998-07-30|NONE|FOB|aphs. furiously e +29601|319|20|5|49|59746.19|0.04|0.00|N|O|1998-07-19|1998-08-10|1998-07-25|DELIVER IN PERSON|SHIP|riously after the furiously express p +29601|879|13|6|21|37377.27|0.08|0.03|N|O|1998-08-15|1998-06-30|1998-09-01|DELIVER IN PERSON|AIR|kages. blithely even instructions doubt f +29601|647|41|7|45|69643.80|0.03|0.07|N|O|1998-08-22|1998-06-22|1998-08-28|COLLECT COD|REG AIR| accounts. idea +29602|1835|22|1|50|86841.50|0.08|0.01|N|O|1998-02-17|1998-02-08|1998-03-12|NONE|REG AIR|final packages are blithely. r +29603|1936|37|1|25|45948.25|0.08|0.01|N|O|1998-11-09|1998-09-04|1998-11-27|DELIVER IN PERSON|AIR|l theodolites are with the caref +29603|838|39|2|43|74769.69|0.10|0.01|N|O|1998-11-13|1998-10-18|1998-11-16|COLLECT COD|AIR|s: carefully even r +29603|1507|8|3|34|47889.00|0.03|0.06|N|O|1998-08-24|1998-09-05|1998-09-12|NONE|AIR|s. regular, +29603|740|37|4|43|70551.82|0.08|0.01|N|O|1998-10-31|1998-08-27|1998-11-23|COLLECT COD|SHIP|nding ideas according t +29603|1099|35|5|8|8000.72|0.10|0.06|N|O|1998-10-04|1998-10-13|1998-10-22|TAKE BACK RETURN|TRUCK|sometimes about the quickly even accou +29603|1588|9|6|18|26812.44|0.07|0.00|N|O|1998-11-20|1998-09-01|1998-12-01|COLLECT COD|MAIL|fter the quickly pend +29604|1669|11|1|37|58114.42|0.03|0.01|R|F|1993-04-15|1993-03-11|1993-05-07|COLLECT COD|RAIL| packages are. furiously +29604|367|52|2|38|48159.68|0.07|0.00|A|F|1993-03-23|1993-03-16|1993-04-17|NONE|RAIL|e furiously silent accounts detect +29605|1705|48|1|38|61054.60|0.05|0.01|R|F|1993-05-03|1993-02-05|1993-05-30|COLLECT COD|MAIL|sits cajole carefully. blithely brave r +29605|1794|37|2|20|33915.80|0.02|0.03|A|F|1993-05-05|1993-03-22|1993-05-15|COLLECT COD|TRUCK|ly around the qui +29605|1844|45|3|20|34916.80|0.07|0.03|A|F|1993-03-27|1993-02-22|1993-04-24|TAKE BACK RETURN|FOB|ular theodolites sleep slyly after the s +29605|1775|60|4|5|8383.85|0.10|0.06|A|F|1993-02-28|1993-04-06|1993-03-14|DELIVER IN PERSON|SHIP|sleep. closely special orbits run +29606|1008|44|1|22|19998.00|0.08|0.03|N|O|1998-07-14|1998-07-01|1998-07-16|COLLECT COD|REG AIR|ven ideas wake blithely blithely bol +29606|608|71|2|47|70904.20|0.03|0.03|N|O|1998-07-18|1998-06-20|1998-08-09|DELIVER IN PERSON|FOB|the fluffily regular +29606|327|12|3|16|19637.12|0.00|0.05|N|O|1998-07-28|1998-06-01|1998-08-13|DELIVER IN PERSON|SHIP| accounts. carefully +29606|1166|3|4|11|11738.76|0.05|0.06|N|O|1998-07-15|1998-06-21|1998-08-05|TAKE BACK RETURN|MAIL|es. express requests haggle +29607|1296|34|1|24|28734.96|0.04|0.00|A|F|1992-07-06|1992-04-28|1992-07-12|TAKE BACK RETURN|SHIP|en deposits detect +29607|1604|28|2|30|45168.00|0.10|0.05|R|F|1992-04-21|1992-05-23|1992-05-13|NONE|TRUCK|nding dolphins wake sile +29607|156|9|3|35|36965.25|0.08|0.01|R|F|1992-04-12|1992-04-26|1992-04-15|TAKE BACK RETURN|RAIL|old, final requests. +29607|1757|84|4|9|14928.75|0.00|0.02|R|F|1992-03-24|1992-04-22|1992-04-09|TAKE BACK RETURN|RAIL|he packages. quickl +29632|1676|77|1|42|66262.14|0.07|0.03|R|F|1993-10-05|1993-11-02|1993-10-13|NONE|TRUCK|ress deposits haggle quickly even +29632|42|18|2|1|942.04|0.08|0.08|R|F|1993-12-03|1993-09-22|1994-01-02|DELIVER IN PERSON|AIR|boost quickly. pinto beans above the sl +29632|1539|80|3|4|5762.12|0.10|0.03|R|F|1993-11-01|1993-10-01|1993-11-19|NONE|FOB| special requests. slyly unusual warho +29633|1347|48|1|7|8738.38|0.04|0.06|A|F|1994-07-08|1994-09-06|1994-07-30|COLLECT COD|SHIP|ackages. express p +29633|1466|45|2|34|46493.64|0.01|0.05|A|F|1994-10-16|1994-09-01|1994-11-01|NONE|MAIL|alongside of the +29634|1676|59|1|14|22087.38|0.04|0.01|A|F|1995-04-04|1995-01-30|1995-04-16|NONE|FOB|ickly even ideas. brave, +29634|1645|28|2|42|64958.88|0.01|0.05|A|F|1995-01-01|1995-01-13|1995-01-16|COLLECT COD|SHIP|ic instruc +29634|1461|1|3|28|38148.88|0.07|0.06|A|F|1995-02-04|1995-02-19|1995-03-02|TAKE BACK RETURN|SHIP|lites promise blithely above the regu +29634|1529|30|4|47|67234.44|0.09|0.04|A|F|1995-03-16|1995-01-05|1995-03-30|COLLECT COD|REG AIR|e the blithely final asymptotes. b +29635|992|93|1|19|35966.81|0.04|0.08|N|O|1997-10-11|1997-12-11|1997-10-30|DELIVER IN PERSON|SHIP|ly regular packages u +29635|1570|11|2|40|58862.80|0.05|0.08|N|O|1998-02-01|1997-12-10|1998-02-06|COLLECT COD|TRUCK|ep carefully fluffily regular ideas +29635|1721|64|3|28|45436.16|0.10|0.04|N|O|1998-01-26|1997-11-14|1998-02-17|NONE|REG AIR|luffily ironic pinto bean +29635|470|71|4|46|63041.62|0.06|0.05|N|O|1997-10-15|1997-12-09|1997-10-23|NONE|MAIL|sits. enti +29635|1274|49|5|16|18804.32|0.05|0.02|N|O|1997-12-07|1997-12-08|1997-12-15|TAKE BACK RETURN|REG AIR|d requests are after the deposits. f +29636|1276|77|1|35|41204.45|0.07|0.01|A|F|1993-04-24|1993-03-22|1993-05-17|COLLECT COD|MAIL|ages nag. fluf +29636|1950|95|2|33|61114.35|0.03|0.02|R|F|1993-02-03|1993-02-28|1993-02-17|COLLECT COD|REG AIR|ular, silent pinto +29636|183|84|3|8|8665.44|0.07|0.05|A|F|1993-02-24|1993-01-29|1993-02-26|NONE|FOB|the slyly final fox +29636|607|8|4|21|31659.60|0.01|0.00|A|F|1993-04-24|1993-02-19|1993-05-13|TAKE BACK RETURN|SHIP|nal pinto bean +29636|1617|100|5|43|65300.23|0.09|0.01|R|F|1993-02-27|1993-02-01|1993-03-13|NONE|SHIP|ove the regular theodolites. express d +29637|1563|64|1|19|27826.64|0.10|0.08|A|F|1994-09-06|1994-08-23|1994-09-09|NONE|SHIP|to beans. c +29637|1691|92|2|39|62114.91|0.10|0.00|A|F|1994-08-16|1994-06-29|1994-08-17|NONE|MAIL|he furiously express accounts cou +29637|1845|89|3|8|13974.72|0.06|0.02|A|F|1994-08-04|1994-07-24|1994-08-24|COLLECT COD|REG AIR|gside of the special, regular +29637|1685|68|4|9|14280.12|0.07|0.01|R|F|1994-08-24|1994-07-31|1994-08-30|TAKE BACK RETURN|SHIP| are furiously fluffy packages. +29637|1741|26|5|28|45996.72|0.08|0.04|R|F|1994-07-08|1994-07-21|1994-07-23|TAKE BACK RETURN|AIR|foxes. quickly ironic requests nag. +29638|1515|96|1|12|16998.12|0.06|0.05|N|O|1995-11-23|1996-01-14|1995-12-22|DELIVER IN PERSON|AIR|onic, unusual multipliers use w +29638|1827|71|2|4|6915.28|0.02|0.06|N|O|1996-01-12|1996-01-06|1996-01-18|COLLECT COD|FOB|tructions lose fur +29638|539|30|3|9|12955.77|0.02|0.06|N|O|1995-12-25|1996-01-18|1996-01-01|DELIVER IN PERSON|SHIP|unusual instructions. e +29638|646|40|4|36|55679.04|0.05|0.03|N|O|1996-01-17|1995-12-15|1996-01-19|DELIVER IN PERSON|RAIL|press deposits are carefully +29638|1224|99|5|21|23629.62|0.04|0.06|N|O|1996-01-19|1995-11-29|1996-02-14|TAKE BACK RETURN|TRUCK|posits lose. busily bold deposits was bli +29639|1764|91|1|36|59967.36|0.04|0.02|N|O|1995-07-04|1995-05-22|1995-08-02|TAKE BACK RETURN|FOB|equests above +29639|1395|96|2|1|1296.39|0.07|0.08|N|F|1995-06-12|1995-06-19|1995-06-20|DELIVER IN PERSON|SHIP|e slyly final packages. final s +29639|1631|73|3|41|62837.83|0.03|0.03|N|O|1995-07-15|1995-06-16|1995-07-16|DELIVER IN PERSON|REG AIR|efully bold foxes. even, express theodolit +29639|1846|76|4|42|73409.28|0.02|0.03|N|O|1995-07-28|1995-06-13|1995-08-27|COLLECT COD|MAIL| cajole. slyly final deposits are acc +29664|1839|26|1|43|74855.69|0.00|0.05|N|O|1997-04-14|1997-05-19|1997-04-16|DELIVER IN PERSON|AIR|ake slyly. furiousl +29664|626|89|2|11|16792.82|0.01|0.00|N|O|1997-07-08|1997-05-19|1997-07-20|DELIVER IN PERSON|MAIL|unusual, daring platelets. pen +29664|248|30|3|49|56263.76|0.09|0.02|N|O|1997-05-15|1997-05-02|1997-05-23|COLLECT COD|AIR| deposits are furiously alongside of +29664|52|28|4|3|2856.15|0.02|0.07|N|O|1997-05-21|1997-06-14|1997-05-26|NONE|MAIL|the even d +29664|1718|45|5|49|79365.79|0.00|0.06|N|O|1997-04-20|1997-06-08|1997-05-04|NONE|REG AIR|. slyly even instructi +29665|882|83|1|25|44572.00|0.00|0.01|N|O|1996-06-25|1996-06-04|1996-07-21|TAKE BACK RETURN|SHIP|tes boost +29665|1673|74|2|39|61412.13|0.06|0.05|N|O|1996-05-07|1996-05-05|1996-06-04|TAKE BACK RETURN|REG AIR|heodolites sleep fluffily bold instructions +29665|1275|13|3|30|35288.10|0.02|0.05|N|O|1996-07-03|1996-05-30|1996-07-27|COLLECT COD|AIR|o the silent +29665|938|39|4|7|12872.51|0.08|0.03|N|O|1996-05-13|1996-06-01|1996-05-19|COLLECT COD|RAIL|ages shall wake carefully regular, bold dep +29666|1679|62|1|38|60065.46|0.09|0.02|N|O|1996-01-21|1996-02-15|1996-02-19|TAKE BACK RETURN|FOB|arefully busy reque +29666|947|16|2|33|60982.02|0.04|0.06|N|O|1996-03-13|1996-02-14|1996-03-14|COLLECT COD|RAIL|ly bold acc +29666|1057|58|3|34|32573.70|0.00|0.05|N|O|1996-03-01|1996-02-10|1996-03-07|NONE|TRUCK|sits would boost slyly final for +29666|887|88|4|49|87606.12|0.00|0.05|N|O|1996-04-24|1996-03-26|1996-05-05|DELIVER IN PERSON|AIR| beans use quickly? even +29667|143|44|1|33|34423.62|0.04|0.01|A|F|1994-11-15|1994-10-18|1994-11-30|NONE|RAIL|ffily special +29667|1454|72|2|4|5421.80|0.08|0.05|R|F|1994-09-21|1994-09-19|1994-09-22|DELIVER IN PERSON|SHIP|uriously final +29667|395|80|3|39|50520.21|0.05|0.05|R|F|1994-10-01|1994-08-25|1994-10-12|COLLECT COD|REG AIR|hely furiously fina +29667|699|62|4|13|20795.97|0.06|0.06|A|F|1994-10-07|1994-10-20|1994-10-09|COLLECT COD|FOB|oxes. pending, ironic +29667|1467|85|5|5|6842.30|0.01|0.05|A|F|1994-10-27|1994-08-30|1994-11-06|DELIVER IN PERSON|TRUCK|efully special +29667|599|60|6|31|46487.29|0.01|0.08|A|F|1994-11-21|1994-09-30|1994-12-03|COLLECT COD|AIR|into beans +29668|550|51|1|34|49318.70|0.03|0.01|N|O|1997-04-10|1997-01-23|1997-04-20|NONE|AIR|p finally above the furiously pending ex +29668|1385|86|2|26|33445.88|0.04|0.04|N|O|1997-01-12|1997-03-21|1997-01-22|TAKE BACK RETURN|FOB|al packages. slyly regular frays wake. f +29668|1841|28|3|44|76684.96|0.05|0.03|N|O|1996-12-27|1997-02-18|1997-01-08|NONE|RAIL|ding to the carefully i +29668|1044|80|4|10|9450.40|0.06|0.05|N|O|1997-02-13|1997-03-17|1997-03-05|TAKE BACK RETURN|FOB|counts. slyly special requests s +29668|1814|44|5|33|56621.73|0.00|0.07|N|O|1997-01-04|1997-01-26|1997-01-19|COLLECT COD|TRUCK|y special requests. enticing +29669|212|40|1|23|25580.83|0.04|0.07|N|O|1996-05-29|1996-04-12|1996-06-25|NONE|TRUCK| was furiously regular, +29669|233|15|2|14|15865.22|0.05|0.01|N|O|1996-06-11|1996-05-03|1996-06-30|TAKE BACK RETURN|RAIL|al, stealthy dolphins. fluffily final req +29670|1345|22|1|10|12463.40|0.01|0.04|A|F|1994-06-28|1994-05-03|1994-07-13|NONE|SHIP|ests. carefully regular packages wake. +29671|1617|18|1|40|60744.40|0.00|0.01|A|F|1993-05-31|1993-05-20|1993-06-22|DELIVER IN PERSON|MAIL|es after the slyly ironic accounts +29671|1046|47|2|21|19887.84|0.06|0.02|R|F|1993-05-24|1993-04-28|1993-06-20|NONE|MAIL|ully. foxes engage blithely reque +29671|1982|71|3|23|43331.54|0.03|0.01|A|F|1993-07-04|1993-04-28|1993-07-09|COLLECT COD|SHIP| ought to play. regular foxes among t +29671|1815|2|4|44|75539.64|0.02|0.08|R|F|1993-05-13|1993-05-19|1993-06-04|COLLECT COD|SHIP| cajole busily reg +29696|1881|68|1|15|26743.20|0.01|0.07|N|O|1996-08-19|1996-09-29|1996-09-14|COLLECT COD|REG AIR|al, ironic accounts are across the car +29696|1535|16|2|40|57461.20|0.09|0.00|N|O|1996-08-23|1996-09-04|1996-09-14|DELIVER IN PERSON|TRUCK| frets after the final depend +29697|1800|85|1|8|13614.40|0.02|0.03|N|O|1997-04-05|1997-05-20|1997-04-29|TAKE BACK RETURN|TRUCK|lly daring asymptotes haggle s +29697|327|12|2|1|1227.32|0.01|0.06|N|O|1997-04-20|1997-04-23|1997-05-12|COLLECT COD|AIR|ckly express accounts cajole furiously +29697|1180|17|3|49|52977.82|0.01|0.08|N|O|1997-05-06|1997-05-23|1997-05-30|COLLECT COD|RAIL|gular packages. ir +29698|291|73|1|31|36929.99|0.09|0.03|N|O|1996-07-15|1996-08-13|1996-08-13|DELIVER IN PERSON|RAIL| slyly according to the furiously express +29699|1578|99|1|13|19234.41|0.04|0.02|N|O|1996-05-10|1996-05-20|1996-05-17|COLLECT COD|SHIP|unts about the silent foxes wa +29699|369|26|2|15|19040.40|0.04|0.05|N|O|1996-05-18|1996-04-07|1996-05-28|DELIVER IN PERSON|FOB|uriously-- carefully unusual pack +29699|1570|11|3|37|54448.09|0.01|0.00|N|O|1996-05-26|1996-03-25|1996-06-09|TAKE BACK RETURN|SHIP|uests boost. bold pearls +29699|330|59|4|25|30758.25|0.03|0.02|N|O|1996-03-29|1996-05-06|1996-04-09|TAKE BACK RETURN|RAIL|symptotes. blithely +29699|865|99|5|21|37083.06|0.02|0.04|N|O|1996-03-07|1996-04-08|1996-03-23|NONE|REG AIR|silent ideas. special, +29699|1069|70|6|44|42682.64|0.08|0.05|N|O|1996-06-15|1996-04-01|1996-06-29|DELIVER IN PERSON|TRUCK|totes. slyly +29700|1844|45|1|4|6983.36|0.00|0.08|A|F|1993-08-03|1993-05-25|1993-08-30|COLLECT COD|FOB|romise along the carefully regular pl +29700|1334|35|2|46|56825.18|0.06|0.03|A|F|1993-07-06|1993-06-12|1993-08-02|DELIVER IN PERSON|SHIP| among the regular accounts sleep fi +29700|1019|20|3|14|12880.14|0.01|0.07|A|F|1993-06-13|1993-05-15|1993-07-13|COLLECT COD|SHIP|are blithel +29701|459|18|1|39|53018.55|0.03|0.08|N|O|1997-09-22|1997-08-27|1997-09-26|COLLECT COD|MAIL|es according to the furiously ironic t +29702|1387|64|1|19|24479.22|0.02|0.04|R|F|1994-08-11|1994-07-06|1994-08-12|NONE|MAIL|sleep excuses. final, even accounts +29702|770|3|2|33|55135.41|0.03|0.02|A|F|1994-07-22|1994-05-31|1994-08-01|NONE|MAIL|the fluffily bold foxes. asymptotes sl +29702|1958|47|3|45|83697.75|0.02|0.07|R|F|1994-06-03|1994-07-10|1994-07-02|TAKE BACK RETURN|FOB|ckages nag carefu +29702|1013|84|4|33|30162.33|0.04|0.07|A|F|1994-08-05|1994-07-20|1994-08-22|TAKE BACK RETURN|MAIL|jole furiously. furiously +29702|144|71|5|49|51162.86|0.10|0.00|A|F|1994-08-05|1994-06-26|1994-08-31|DELIVER IN PERSON|SHIP| carefully even ideas believe furiously +29703|1318|19|1|30|36579.30|0.08|0.03|N|O|1996-09-11|1996-09-19|1996-10-09|NONE|AIR|fluffily regular i +29703|945|80|2|35|64607.90|0.03|0.01|N|O|1996-09-05|1996-09-09|1996-10-04|DELIVER IN PERSON|FOB|players use carefully slyly bold p +29703|1346|61|3|16|19957.44|0.02|0.01|N|O|1996-07-26|1996-09-19|1996-08-09|DELIVER IN PERSON|SHIP| pinto beans are furiously pending deposits +29703|340|25|4|13|16124.42|0.07|0.08|N|O|1996-10-19|1996-08-21|1996-11-04|NONE|SHIP| accounts. careful +29728|1750|51|1|26|42945.50|0.00|0.03|N|O|1998-08-01|1998-07-29|1998-08-17|DELIVER IN PERSON|AIR|blithely quickly regular dep +29729|822|23|1|16|27565.12|0.08|0.01|N|O|1996-03-07|1996-04-06|1996-04-04|COLLECT COD|TRUCK|refully ironic requests haggle fluffi +29729|177|4|2|2|2154.34|0.08|0.01|N|O|1996-04-21|1996-03-30|1996-04-28|TAKE BACK RETURN|REG AIR|sits haggle slyly ironic pac +29729|95|21|3|29|28857.61|0.00|0.08|N|O|1996-04-26|1996-03-24|1996-05-26|DELIVER IN PERSON|FOB|iously final packages use fur +29729|860|27|4|37|65151.82|0.06|0.01|N|O|1996-05-05|1996-03-22|1996-05-08|DELIVER IN PERSON|FOB|riously slyly final packages. furious +29729|82|58|5|8|7856.64|0.04|0.04|N|O|1996-04-27|1996-03-28|1996-05-26|DELIVER IN PERSON|TRUCK|lly silent theodolites need to wa +29729|1985|30|6|6|11321.88|0.00|0.00|N|O|1996-05-06|1996-02-23|1996-05-27|TAKE BACK RETURN|AIR|riously regular packages above the +29729|1753|54|7|1|1654.75|0.10|0.03|N|O|1996-04-06|1996-02-18|1996-04-18|NONE|SHIP|xpress courts. slyly regular excuses w +29730|968|37|1|11|20558.56|0.00|0.00|A|F|1993-09-27|1993-09-15|1993-10-06|COLLECT COD|RAIL|riously pending platelets sleep a +29730|1396|73|2|35|45408.65|0.04|0.06|R|F|1993-07-21|1993-09-04|1993-07-26|DELIVER IN PERSON|MAIL|ep carefully. ironic, sly packages are quic +29730|1120|21|3|10|10211.20|0.09|0.00|A|F|1993-07-10|1993-08-14|1993-07-20|NONE|MAIL|theodolites are car +29730|1769|70|4|31|51793.56|0.05|0.01|R|F|1993-09-18|1993-08-31|1993-09-24|DELIVER IN PERSON|FOB|ve the furiously +29730|1134|71|5|45|46580.85|0.04|0.03|A|F|1993-08-14|1993-09-06|1993-09-04|NONE|FOB|dependencies believe +29731|184|11|1|29|31441.22|0.04|0.04|N|O|1995-11-30|1996-01-22|1995-12-24|NONE|TRUCK|es print slyly carefully +29731|1793|78|2|22|37285.38|0.09|0.03|N|O|1996-01-23|1996-01-30|1996-01-31|TAKE BACK RETURN|FOB|to beans aft +29731|217|72|3|46|51391.66|0.05|0.05|N|O|1996-03-13|1996-02-04|1996-04-10|NONE|MAIL|quests use slyly regular instructions. car +29732|995|98|1|50|94799.50|0.05|0.00|A|F|1993-02-19|1993-02-07|1993-02-23|NONE|FOB|xpress packages sleep silently +29732|1938|71|2|42|77277.06|0.07|0.04|A|F|1993-03-14|1993-01-26|1993-04-04|COLLECT COD|TRUCK|uriously regular as +29732|1201|39|3|7|7715.40|0.03|0.02|A|F|1993-02-20|1993-01-31|1993-02-26|NONE|RAIL|ing, pending forge +29732|131|10|4|8|8249.04|0.07|0.05|A|F|1993-02-25|1993-02-06|1993-03-16|COLLECT COD|AIR|er the carefully special fr +29733|219|47|1|21|23503.41|0.02|0.01|N|O|1996-11-08|1996-11-14|1996-11-21|NONE|REG AIR|he even, regular theodolites are quickly bl +29733|251|79|2|24|27630.00|0.09|0.01|N|O|1996-10-28|1996-11-17|1996-11-27|COLLECT COD|MAIL|ckly bold dependenc +29734|1225|63|1|19|21398.18|0.06|0.01|N|O|1996-10-25|1996-12-01|1996-11-05|TAKE BACK RETURN|REG AIR|carefully. blithe +29734|629|61|2|42|64244.04|0.02|0.06|N|O|1996-10-05|1996-11-19|1996-10-21|COLLECT COD|TRUCK|ickly alongside of the final accounts +29735|1166|39|1|48|51223.68|0.00|0.06|N|O|1996-12-25|1996-11-05|1997-01-15|COLLECT COD|AIR|final foxes: fluffily final n +29735|1598|39|2|2|2999.18|0.00|0.08|N|O|1997-01-15|1996-12-08|1997-02-12|TAKE BACK RETURN|AIR|elieve even foxes. blithely even foxes aro +29735|342|71|3|8|9938.72|0.01|0.00|N|O|1997-01-10|1996-11-28|1997-01-19|NONE|RAIL|, unusual accounts. express deposit +29735|934|35|4|32|58717.76|0.01|0.00|N|O|1996-11-09|1996-11-27|1996-11-10|COLLECT COD|AIR|press carefully busy, express instr +29735|1789|90|5|9|15217.02|0.10|0.04|N|O|1996-10-08|1996-12-23|1996-10-31|COLLECT COD|AIR|ake pinto b +29760|722|19|1|31|50304.32|0.08|0.04|N|O|1996-05-20|1996-05-21|1996-05-25|COLLECT COD|AIR|pinto beans run caref +29760|1623|6|2|23|35066.26|0.05|0.07|N|O|1996-04-17|1996-04-07|1996-05-17|NONE|MAIL|riously close t +29760|537|98|3|43|61813.79|0.08|0.08|N|O|1996-03-29|1996-05-20|1996-04-14|DELIVER IN PERSON|REG AIR|lly. pending acco +29760|1794|21|4|32|54265.28|0.07|0.06|N|O|1996-04-21|1996-05-13|1996-04-29|NONE|TRUCK|its according to the +29761|552|53|1|15|21788.25|0.07|0.02|A|F|1992-09-15|1992-10-02|1992-09-23|TAKE BACK RETURN|RAIL|slyly about the f +29761|979|80|2|14|26319.58|0.07|0.06|A|F|1992-09-08|1992-09-03|1992-09-19|DELIVER IN PERSON|TRUCK| requests. quickly even +29761|1014|50|3|49|44835.49|0.05|0.01|A|F|1992-07-09|1992-09-24|1992-07-27|TAKE BACK RETURN|AIR|egular accounts a +29761|1504|25|4|3|4216.50|0.00|0.00|A|F|1992-09-13|1992-09-25|1992-09-26|TAKE BACK RETURN|AIR|grate furiously about the fluffily ex +29761|1038|9|5|25|23475.75|0.02|0.00|R|F|1992-08-02|1992-09-03|1992-08-22|NONE|FOB|eodolites alo +29762|1794|95|1|39|66135.81|0.07|0.04|A|F|1993-09-26|1993-10-05|1993-09-27|DELIVER IN PERSON|RAIL|ccounts boost furiously s +29762|1769|70|2|40|66830.40|0.09|0.00|A|F|1993-10-06|1993-10-09|1993-10-07|TAKE BACK RETURN|MAIL|slyly dinos. furiously unusual deposits +29762|1916|17|3|37|67262.67|0.04|0.08|R|F|1993-10-05|1993-09-24|1993-10-12|TAKE BACK RETURN|REG AIR|fix carefully. slyly special +29762|1726|53|4|30|48831.60|0.06|0.05|R|F|1993-11-16|1993-10-25|1993-12-06|NONE|SHIP|otes among the blith +29762|1936|25|5|21|38596.53|0.02|0.05|A|F|1993-11-13|1993-10-16|1993-11-19|DELIVER IN PERSON|REG AIR|d deposits +29763|667|30|1|3|4702.98|0.04|0.08|N|O|1996-07-27|1996-09-22|1996-08-12|DELIVER IN PERSON|FOB|e around t +29763|958|27|2|5|9294.75|0.06|0.00|N|O|1996-09-12|1996-09-10|1996-10-07|COLLECT COD|TRUCK|s engage final platelets. caref +29764|199|52|1|47|51661.93|0.07|0.02|A|F|1992-10-07|1992-10-19|1992-11-02|COLLECT COD|TRUCK|olites run. quick theodolites +29764|403|62|2|3|3910.20|0.01|0.04|R|F|1992-08-11|1992-09-23|1992-08-19|DELIVER IN PERSON|MAIL|al dolphins against the furi +29764|1163|64|3|38|40438.08|0.10|0.02|R|F|1992-11-21|1992-08-28|1992-12-10|TAKE BACK RETURN|TRUCK|above the bold pinto bea +29765|1708|93|1|21|33803.70|0.04|0.01|R|F|1992-09-07|1992-08-23|1992-09-22|COLLECT COD|FOB|nstructions sle +29765|1047|53|2|42|39817.68|0.01|0.00|A|F|1992-10-29|1992-08-24|1992-11-24|TAKE BACK RETURN|MAIL|to beans serve furiously ir +29765|508|69|3|28|39438.00|0.03|0.05|R|F|1992-11-02|1992-08-25|1992-12-01|DELIVER IN PERSON|TRUCK|etect fluffily at the deposits. ca +29765|1807|37|4|11|18796.80|0.04|0.08|A|F|1992-08-19|1992-09-01|1992-09-05|DELIVER IN PERSON|FOB|endencies. q +29765|1487|27|5|13|18050.24|0.04|0.06|A|F|1992-08-24|1992-09-09|1992-08-29|TAKE BACK RETURN|FOB| fluffily +29766|988|23|1|42|79337.16|0.05|0.03|R|F|1994-06-07|1994-06-12|1994-07-07|COLLECT COD|TRUCK| slyly ironic packages. ironic, special +29766|1881|82|2|16|28526.08|0.04|0.01|R|F|1994-04-02|1994-06-03|1994-04-26|NONE|REG AIR|fully pending +29766|276|77|3|12|14115.24|0.04|0.00|A|F|1994-03-27|1994-05-24|1994-03-29|TAKE BACK RETURN|REG AIR|ernes eat carefully at the special ide +29766|940|75|4|33|60751.02|0.10|0.05|A|F|1994-07-17|1994-05-17|1994-08-05|DELIVER IN PERSON|SHIP| carefully pending +29766|946|15|5|32|59102.08|0.09|0.02|R|F|1994-04-18|1994-06-17|1994-04-22|DELIVER IN PERSON|AIR|ar requests. quickly ironic deposits wake +29766|1188|89|6|24|26140.32|0.00|0.05|R|F|1994-05-27|1994-05-01|1994-06-26|COLLECT COD|RAIL|ackages. blithely br +29767|152|5|1|38|39981.70|0.05|0.03|R|F|1995-05-08|1995-04-16|1995-06-04|NONE|SHIP|nal deposits haggle quick +29767|730|27|2|1|1630.73|0.06|0.06|A|F|1995-05-25|1995-03-31|1995-06-08|DELIVER IN PERSON|RAIL|ithely alongside of t +29767|1393|32|3|50|64719.50|0.03|0.04|R|F|1995-03-22|1995-04-06|1995-03-27|NONE|TRUCK|ructions dazzle bl +29767|1423|63|4|38|50327.96|0.00|0.04|A|F|1995-03-27|1995-05-01|1995-04-01|COLLECT COD|RAIL|ronic ideas. fluffy instruct +29767|25|51|5|28|25900.56|0.09|0.03|R|F|1995-04-16|1995-04-22|1995-05-07|NONE|SHIP|theodolites haggle care +29767|1213|14|6|42|46796.82|0.07|0.06|R|F|1995-03-06|1995-03-22|1995-03-07|DELIVER IN PERSON|MAIL| ideas. stealthily ex +29767|1242|43|7|8|9145.92|0.01|0.06|A|F|1995-03-14|1995-03-31|1995-04-06|DELIVER IN PERSON|FOB|eep enticingly among the slowly +29792|22|73|1|18|16596.36|0.06|0.03|A|F|1993-06-12|1993-05-01|1993-07-07|TAKE BACK RETURN|MAIL|s affix. slyly regular instruc +29792|1375|90|2|50|63818.50|0.02|0.08|A|F|1993-04-02|1993-04-09|1993-04-22|TAKE BACK RETURN|REG AIR|ar deposits! express depe +29792|1298|99|3|22|26384.38|0.06|0.01|R|F|1993-05-09|1993-04-11|1993-05-27|TAKE BACK RETURN|FOB|at slyly carefully ironic +29793|1694|95|1|43|68614.67|0.05|0.00|N|O|1997-08-17|1997-09-30|1997-09-12|NONE|MAIL|ake furiously blithely regular plate +29793|331|60|2|21|25857.93|0.10|0.07|N|O|1997-09-13|1997-10-03|1997-09-25|COLLECT COD|REG AIR|ong the special, +29793|799|32|3|50|84989.50|0.07|0.06|N|O|1997-11-13|1997-10-06|1997-12-03|TAKE BACK RETURN|MAIL|es. carefully final deposits after t +29793|12|63|4|11|10032.11|0.06|0.07|N|O|1997-10-18|1997-11-10|1997-10-19|COLLECT COD|FOB|he carefully express ideas sleep furi +29793|1330|45|5|8|9850.64|0.03|0.04|N|O|1997-10-29|1997-10-06|1997-11-20|DELIVER IN PERSON|REG AIR|ve the carefully s +29793|817|84|6|31|53252.11|0.10|0.07|N|O|1997-09-01|1997-11-10|1997-09-13|NONE|TRUCK|lar foxes sleep furiously pending acc +29794|139|92|1|10|10391.30|0.05|0.08|A|F|1994-02-18|1994-03-07|1994-03-13|COLLECT COD|TRUCK|uctions impress blithely. sly +29794|957|60|2|13|24153.35|0.05|0.00|R|F|1994-02-24|1994-03-13|1994-03-21|DELIVER IN PERSON|RAIL|sual ideas. b +29794|1477|17|3|2|2756.94|0.05|0.04|R|F|1994-03-03|1994-02-11|1994-03-13|COLLECT COD|AIR|iously beyond the unusual deposits. f +29795|1640|64|1|11|16958.04|0.07|0.03|N|O|1996-01-04|1996-02-01|1996-01-10|DELIVER IN PERSON|FOB|old, final courts print slyl +29795|863|63|2|48|84665.28|0.07|0.03|N|O|1995-11-27|1996-02-21|1995-11-28|TAKE BACK RETURN|REG AIR|es sleep quickly. quickly final p +29796|1095|31|1|49|48808.41|0.04|0.04|N|O|1998-08-26|1998-07-23|1998-09-05|TAKE BACK RETURN|TRUCK|yly after the fluffily regular acco +29796|532|63|2|45|64463.85|0.00|0.06|N|O|1998-08-03|1998-07-08|1998-08-15|DELIVER IN PERSON|TRUCK|sits should have to sleep furio +29796|997|100|3|7|13285.93|0.06|0.03|N|O|1998-08-26|1998-08-01|1998-09-12|TAKE BACK RETURN|MAIL|accounts. express instructions detect epi +29797|1354|31|1|20|25107.00|0.00|0.06|R|F|1993-10-20|1993-09-19|1993-11-04|DELIVER IN PERSON|TRUCK|lithely after the ironic +29797|1803|33|2|49|83535.20|0.00|0.08|R|F|1993-09-09|1993-09-20|1993-09-17|NONE|MAIL|yly thin deposits; regular theodol +29797|1347|62|3|11|13731.74|0.06|0.07|R|F|1993-08-17|1993-08-14|1993-09-02|NONE|TRUCK|could have to cajole fluf +29797|284|39|4|25|29607.00|0.04|0.07|R|F|1993-08-18|1993-08-02|1993-09-12|TAKE BACK RETURN|MAIL|e slyly bold, even packages. ironic theodo +29798|993|94|1|2|3787.98|0.10|0.04|N|O|1996-02-11|1996-04-20|1996-03-10|DELIVER IN PERSON|REG AIR|ss pinto beans alongside +29798|238|66|2|46|52358.58|0.07|0.03|N|O|1996-04-14|1996-03-20|1996-04-16|NONE|FOB|lithely express pinto beans +29798|1587|68|3|36|53588.88|0.02|0.07|N|O|1996-03-31|1996-04-08|1996-04-26|COLLECT COD|TRUCK|ar pinto beans. dependencies +29798|1130|67|4|42|43307.46|0.00|0.04|N|O|1996-04-15|1996-03-04|1996-04-28|TAKE BACK RETURN|TRUCK|onic warhorses. unus +29798|1739|82|5|39|63988.47|0.10|0.06|N|O|1996-03-22|1996-04-26|1996-04-13|DELIVER IN PERSON|FOB|sits. regular, final depo +29799|429|88|1|16|21270.72|0.07|0.03|R|F|1994-02-24|1994-04-24|1994-03-24|NONE|MAIL|y bold pint +29799|1235|36|2|25|28405.75|0.10|0.01|A|F|1994-03-13|1994-03-16|1994-04-12|NONE|MAIL| foxes are accordin +29799|875|9|3|50|88793.50|0.01|0.04|A|F|1994-05-25|1994-05-01|1994-06-06|NONE|REG AIR|olphins. ironic, special platelet +29799|190|43|4|32|34886.08|0.00|0.02|R|F|1994-04-30|1994-03-15|1994-05-17|NONE|REG AIR|ccounts run furiously regular platelets. n +29799|507|38|5|25|35187.50|0.10|0.05|A|F|1994-02-09|1994-03-09|1994-03-02|COLLECT COD|MAIL| foxes dazzle fluffily across +29799|1356|95|6|19|23889.65|0.08|0.07|A|F|1994-03-31|1994-03-18|1994-04-26|DELIVER IN PERSON|TRUCK|ironic courts along the bli +29824|898|98|1|13|23385.57|0.04|0.07|A|F|1995-01-16|1995-02-28|1995-02-11|TAKE BACK RETURN|REG AIR|ions. packages sleep. final, ironi +29824|1747|90|2|19|31326.06|0.07|0.08|R|F|1995-03-23|1995-03-28|1995-04-14|NONE|FOB| foxes. regular, perma +29825|969|4|1|6|11219.76|0.01|0.06|A|F|1994-07-15|1994-09-09|1994-08-10|NONE|TRUCK|ickly regular accounts. deposits caj +29826|1831|61|1|41|71046.03|0.09|0.01|R|F|1995-01-17|1994-11-19|1995-01-18|COLLECT COD|MAIL| the ironic, bold f +29826|665|28|2|29|45404.14|0.03|0.06|A|F|1995-01-22|1994-11-12|1995-01-23|TAKE BACK RETURN|FOB|es haggle. final accoun +29826|347|32|3|47|58624.98|0.04|0.06|R|F|1994-11-24|1994-10-25|1994-12-03|DELIVER IN PERSON|REG AIR|lly final packages. regular, unusual +29826|47|98|4|36|34093.44|0.06|0.02|R|F|1994-12-06|1994-11-16|1994-12-27|TAKE BACK RETURN|TRUCK|slyly pending pa +29827|1676|59|1|8|12621.36|0.09|0.04|N|O|1995-08-18|1995-08-22|1995-09-13|TAKE BACK RETURN|TRUCK|ld pinto beans haggle bli +29827|599|60|2|23|34490.57|0.09|0.00|N|O|1995-10-14|1995-10-08|1995-11-11|TAKE BACK RETURN|RAIL| hinder across the ironic pearl +29827|1543|44|3|28|40447.12|0.04|0.02|N|O|1995-11-08|1995-09-23|1995-11-13|TAKE BACK RETURN|REG AIR|fully even +29827|1541|62|4|42|60586.68|0.06|0.00|N|O|1995-11-06|1995-09-04|1995-12-05|TAKE BACK RETURN|FOB| carefully blithely regular packages. c +29827|1232|33|5|14|15865.22|0.08|0.01|N|O|1995-09-10|1995-10-11|1995-09-20|DELIVER IN PERSON|TRUCK|p quickly regular instructions. e +29827|1965|10|6|22|41073.12|0.08|0.00|N|O|1995-10-11|1995-08-14|1995-10-22|DELIVER IN PERSON|MAIL|. packages wake about the unusual pack +29828|657|51|1|13|20249.45|0.03|0.06|N|O|1995-09-16|1995-09-29|1995-09-21|TAKE BACK RETURN|AIR|egular instructions +29829|639|71|1|44|67743.72|0.04|0.06|N|O|1997-04-17|1997-05-11|1997-04-23|COLLECT COD|FOB|, ironic deposits promise enticingly aroun +29830|1513|14|1|30|42435.30|0.10|0.02|A|F|1995-04-04|1995-03-13|1995-04-15|DELIVER IN PERSON|RAIL|ias haggle sly +29831|11|37|1|17|15487.17|0.07|0.04|A|F|1992-07-05|1992-05-12|1992-07-24|TAKE BACK RETURN|MAIL|s wake. quickly ironic dependencies h +29831|553|54|2|48|69770.40|0.01|0.05|A|F|1992-04-27|1992-06-28|1992-05-01|TAKE BACK RETURN|SHIP| thinly blithely fi +29831|345|30|3|21|26152.14|0.03|0.04|A|F|1992-06-01|1992-05-10|1992-06-06|COLLECT COD|SHIP|ay furiously along the deposits. reque +29831|1648|49|4|40|61985.60|0.05|0.04|A|F|1992-06-10|1992-04-29|1992-06-26|DELIVER IN PERSON|RAIL|press dinos cajol +29831|1724|67|5|29|47145.88|0.06|0.01|R|F|1992-07-16|1992-05-10|1992-07-27|NONE|REG AIR|sly pending reque +29856|255|56|1|2|2310.50|0.09|0.05|R|F|1992-07-12|1992-08-05|1992-07-22|TAKE BACK RETURN|SHIP|o use. blithely even package +29856|1196|69|2|1|1097.19|0.05|0.03|A|F|1992-08-28|1992-07-17|1992-09-14|TAKE BACK RETURN|REG AIR| express packages. +29856|1528|49|3|47|67187.44|0.01|0.03|R|F|1992-06-22|1992-07-29|1992-07-18|COLLECT COD|SHIP|ts. quickly expres +29856|200|79|4|8|8801.60|0.00|0.00|R|F|1992-08-07|1992-08-17|1992-08-10|COLLECT COD|FOB|he final accounts. fu +29856|1112|49|5|31|31406.41|0.00|0.00|A|F|1992-09-07|1992-08-31|1992-09-24|COLLECT COD|RAIL|, unusual requests. regular, even pin +29856|1647|71|6|23|35618.72|0.05|0.06|A|F|1992-07-13|1992-08-10|1992-08-11|NONE|TRUCK|he furiously e +29857|1041|47|1|37|34855.48|0.06|0.08|A|F|1994-12-27|1995-03-06|1995-01-02|DELIVER IN PERSON|TRUCK|old requests. ironic requ +29857|1704|89|2|39|62622.30|0.09|0.04|R|F|1995-03-16|1995-03-02|1995-04-07|DELIVER IN PERSON|RAIL|efully. furiously pending depo +29858|833|33|1|18|31208.94|0.09|0.07|R|F|1994-04-22|1994-03-11|1994-04-27|TAKE BACK RETURN|REG AIR|egular packa +29859|1|2|1|50|45050.00|0.06|0.05|N|O|1997-11-27|1997-10-02|1997-11-29|TAKE BACK RETURN|RAIL|ess platelets. carefully ironic foxe +29859|708|73|2|26|41826.20|0.09|0.08|N|O|1997-10-28|1997-09-23|1997-10-31|DELIVER IN PERSON|MAIL|ar deposits. final account +29860|744|77|1|32|52631.68|0.10|0.06|R|F|1994-11-24|1994-10-16|1994-12-03|COLLECT COD|SHIP|uests need to haggle carefully expres +29860|1560|1|2|6|8769.36|0.09|0.08|R|F|1994-11-10|1994-11-24|1994-12-06|COLLECT COD|AIR|. unusual, special requests boost blith +29860|479|9|3|40|55178.80|0.00|0.06|R|F|1994-11-01|1994-10-22|1994-11-29|TAKE BACK RETURN|AIR|packages. even foxes h +29861|1561|62|1|13|19013.28|0.00|0.08|R|F|1992-05-26|1992-07-11|1992-05-27|COLLECT COD|FOB|nic, ironic deposits. quickly even d +29861|1840|70|2|19|33094.96|0.02|0.01|A|F|1992-05-12|1992-07-18|1992-05-27|DELIVER IN PERSON|MAIL|ions. furiously ironic +29861|195|48|3|37|40522.03|0.03|0.06|R|F|1992-08-04|1992-07-11|1992-09-03|DELIVER IN PERSON|AIR|g to the bold platelets. blithely pend +29862|1783|26|1|7|11793.46|0.07|0.00|N|O|1995-10-08|1995-09-01|1995-10-09|COLLECT COD|MAIL| even requests. furiously ironic +29862|1503|84|2|11|15449.50|0.06|0.04|N|O|1995-06-28|1995-08-19|1995-07-05|DELIVER IN PERSON|REG AIR|ns nag to the fluffily regular instructi +29862|1350|89|3|36|45048.60|0.02|0.02|N|O|1995-06-30|1995-08-22|1995-07-08|TAKE BACK RETURN|REG AIR|ily beside +29862|102|29|4|15|15031.50|0.08|0.01|N|O|1995-07-25|1995-09-01|1995-08-20|NONE|MAIL|oxes believe about the spec +29862|411|41|5|32|41965.12|0.10|0.08|N|O|1995-07-27|1995-07-30|1995-07-28|DELIVER IN PERSON|FOB|lar courts breach fluffily p +29862|341|26|6|48|59584.32|0.06|0.01|N|O|1995-07-12|1995-08-12|1995-07-20|NONE|RAIL|onic theodolites sleep slyly again +29863|1986|87|1|50|94399.00|0.03|0.03|N|O|1996-12-04|1996-12-13|1996-12-27|TAKE BACK RETURN|TRUCK|s. final accoun +29863|12|88|2|48|43776.48|0.04|0.01|N|O|1996-11-08|1996-12-16|1996-12-05|NONE|SHIP| foxes haggle. slyly i +29863|1328|5|3|4|4917.28|0.08|0.04|N|O|1996-10-30|1996-10-30|1996-11-04|NONE|TRUCK| bold foxes play sly +29863|982|85|4|16|30127.68|0.09|0.01|N|O|1996-11-04|1996-11-05|1996-11-25|COLLECT COD|SHIP|requests dou +29863|1043|14|5|7|6608.28|0.05|0.03|N|O|1996-10-15|1996-11-18|1996-10-19|NONE|REG AIR|y regular dolphins +29888|1130|3|1|50|51556.50|0.09|0.03|A|F|1992-04-20|1992-04-07|1992-04-27|COLLECT COD|REG AIR|ely across t +29888|754|55|2|50|82737.50|0.05|0.06|R|F|1992-04-03|1992-04-15|1992-04-24|COLLECT COD|REG AIR|r deposits. fluffily pending asymptote +29888|1733|76|3|34|55580.82|0.00|0.05|R|F|1992-02-15|1992-03-19|1992-03-14|TAKE BACK RETURN|REG AIR|s engage blit +29888|1989|78|4|10|18909.80|0.00|0.07|A|F|1992-03-02|1992-03-19|1992-03-29|TAKE BACK RETURN|REG AIR| deposits. furiously final requests +29889|1494|73|1|20|27909.80|0.07|0.00|A|F|1994-12-28|1995-01-16|1994-12-29|COLLECT COD|FOB|ven pinto beans are blit +29889|1123|60|2|28|28675.36|0.01|0.02|R|F|1995-03-01|1995-01-12|1995-03-07|NONE|MAIL|. quickly even dep +29890|1901|2|1|44|79327.60|0.02|0.02|R|F|1993-04-10|1993-05-01|1993-05-01|NONE|RAIL| ironic instructions +29890|362|63|2|1|1262.36|0.03|0.00|A|F|1993-06-16|1993-06-03|1993-07-06|DELIVER IN PERSON|AIR|ges haggle fluffily above the instructions. +29890|1511|32|3|4|5650.04|0.05|0.03|A|F|1993-04-27|1993-05-19|1993-05-08|DELIVER IN PERSON|MAIL|nts. quickly r +29891|81|7|1|37|36299.96|0.07|0.05|N|O|1996-08-23|1996-08-12|1996-08-24|COLLECT COD|RAIL|nto beans. quiet requests nag q +29891|1734|35|2|37|60522.01|0.08|0.08|N|O|1996-06-29|1996-07-14|1996-07-06|NONE|FOB|kly. slyly regular packages serve f +29891|1993|38|3|39|73904.61|0.07|0.07|N|O|1996-06-02|1996-07-26|1996-06-19|DELIVER IN PERSON|REG AIR|pecial accounts. furiously regular packa +29892|1708|51|1|50|80485.00|0.04|0.01|A|F|1993-03-10|1993-01-01|1993-03-20|COLLECT COD|FOB|es. pending, final +29892|940|75|2|30|55228.20|0.00|0.08|A|F|1993-01-31|1993-01-13|1993-02-11|NONE|TRUCK|slyly final deposits sleep slyly. thin, ev +29892|1252|64|3|29|33444.25|0.09|0.05|A|F|1993-02-03|1993-01-23|1993-03-01|TAKE BACK RETURN|TRUCK|quests are blithely ironic accou +29892|1149|22|4|2|2100.28|0.01|0.08|R|F|1993-03-11|1993-02-05|1993-04-09|COLLECT COD|REG AIR|ld gifts betw +29892|1788|89|5|32|54072.96|0.10|0.07|A|F|1993-03-23|1993-02-01|1993-03-26|TAKE BACK RETURN|REG AIR|thely. care +29892|1917|62|6|29|52748.39|0.05|0.06|A|F|1993-02-10|1993-01-16|1993-02-24|TAKE BACK RETURN|AIR|heodolites. +29892|589|90|7|4|5958.32|0.04|0.01|A|F|1993-02-20|1993-02-18|1993-03-16|NONE|RAIL|s upon the fluffi +29893|1866|67|1|44|77785.84|0.01|0.02|R|F|1992-07-27|1992-08-22|1992-08-08|NONE|AIR|tructions. blithely final acco +29893|1086|87|2|50|49354.00|0.01|0.03|A|F|1992-09-28|1992-07-25|1992-10-15|TAKE BACK RETURN|SHIP|en accounts wake carefully speci +29893|545|6|3|34|49148.36|0.07|0.04|R|F|1992-09-15|1992-09-05|1992-09-18|DELIVER IN PERSON|TRUCK|ccounts. accounts +29893|299|54|4|29|34779.41|0.10|0.00|A|F|1992-07-18|1992-09-11|1992-08-16|COLLECT COD|AIR|ncies slee +29893|311|12|5|23|27860.13|0.10|0.03|A|F|1992-06-18|1992-09-08|1992-07-02|NONE|TRUCK|hely regular requests above the fluffily +29893|832|99|6|17|29458.11|0.02|0.01|R|F|1992-09-20|1992-08-14|1992-09-28|NONE|MAIL| final accounts. ironic +29894|1158|95|1|13|13768.95|0.00|0.05|A|F|1993-10-21|1993-11-24|1993-11-04|DELIVER IN PERSON|MAIL|s. blithely regular hockey player +29894|1662|45|2|45|70364.70|0.01|0.05|A|F|1994-01-04|1993-10-17|1994-01-13|DELIVER IN PERSON|AIR|arefully regular accounts. q +29894|817|51|3|43|73865.83|0.05|0.03|A|F|1993-11-02|1993-10-10|1993-11-20|NONE|AIR|into beans cajole after the +29894|936|39|4|10|18369.30|0.00|0.07|R|F|1993-09-25|1993-11-24|1993-10-11|COLLECT COD|RAIL|quickly ev +29894|805|72|5|1|1705.80|0.08|0.07|R|F|1993-09-16|1993-11-03|1993-09-17|COLLECT COD|SHIP|l courts haggle. furiously regular th +29894|1498|38|6|50|69974.50|0.09|0.04|A|F|1993-09-26|1993-10-30|1993-09-28|TAKE BACK RETURN|REG AIR|y unusual requests cajole. never bold +29894|1848|35|7|23|40246.32|0.05|0.05|R|F|1993-10-30|1993-11-02|1993-11-25|TAKE BACK RETURN|TRUCK|le slyly under the quickly +29895|1466|84|1|5|6837.30|0.03|0.01|R|F|1993-12-15|1993-11-27|1993-12-25|DELIVER IN PERSON|TRUCK|ously final ideas. slyly regular somas us +29895|1348|63|2|31|38729.54|0.09|0.01|R|F|1993-10-24|1993-12-29|1993-11-11|TAKE BACK RETURN|AIR|fix. slyly final requests above the +29895|244|26|3|3|3432.72|0.03|0.03|A|F|1993-12-17|1993-11-29|1993-12-29|TAKE BACK RETURN|REG AIR|o beans. care +29895|713|10|4|12|19364.52|0.01|0.08|R|F|1993-12-09|1993-12-16|1993-12-10|DELIVER IN PERSON|MAIL|arefully silent deposits. +29895|798|63|5|7|11891.53|0.02|0.05|R|F|1993-10-28|1994-01-02|1993-11-01|DELIVER IN PERSON|MAIL|kly even accounts s +29895|1777|20|6|49|82259.73|0.00|0.05|R|F|1993-12-19|1993-12-29|1994-01-04|DELIVER IN PERSON|AIR|e slyly sile +29920|596|57|1|20|29931.80|0.08|0.07|N|O|1996-02-22|1996-04-11|1996-02-27|TAKE BACK RETURN|REG AIR|osits are fu +29920|343|72|2|47|58436.98|0.07|0.06|N|O|1996-05-17|1996-04-12|1996-05-23|DELIVER IN PERSON|MAIL|iously regular, final requests. s +29920|1524|45|3|21|29935.92|0.07|0.08|N|O|1996-03-25|1996-04-07|1996-04-01|COLLECT COD|FOB|uickly: slowly express packages s +29920|1060|96|4|34|32676.04|0.08|0.02|N|O|1996-03-07|1996-04-26|1996-03-12|DELIVER IN PERSON|TRUCK|uses. slyly bold multipliers no +29921|214|96|1|40|44568.40|0.05|0.02|R|F|1992-05-10|1992-05-06|1992-05-29|COLLECT COD|SHIP|ies along the silent sauternes use fur +29921|1299|74|2|5|6001.45|0.06|0.08|R|F|1992-04-06|1992-04-28|1992-04-16|NONE|AIR|lly even ideas alongside of the deposit +29922|1901|46|1|40|72116.00|0.06|0.07|N|O|1996-04-24|1996-05-16|1996-05-01|NONE|SHIP|iously bold packages are after the specia +29922|481|82|2|1|1381.48|0.08|0.01|N|O|1996-04-16|1996-06-17|1996-05-05|DELIVER IN PERSON|FOB|furiously even pi +29922|898|99|3|10|17988.90|0.08|0.06|N|O|1996-05-27|1996-04-22|1996-06-24|COLLECT COD|TRUCK|t quickly regular deposits. silent, +29922|258|86|4|23|26639.75|0.01|0.00|N|O|1996-04-15|1996-06-05|1996-05-07|NONE|FOB|ly regular pi +29922|36|37|5|6|5616.18|0.06|0.01|N|O|1996-07-11|1996-06-16|1996-07-16|NONE|MAIL|deas are quickly special, re +29922|1221|59|6|20|22444.40|0.10|0.04|N|O|1996-06-05|1996-06-13|1996-06-24|COLLECT COD|SHIP|hy requests x +29922|784|49|7|20|33695.60|0.01|0.07|N|O|1996-06-20|1996-05-05|1996-07-14|NONE|FOB| deposits wak +29923|1336|51|1|50|61866.50|0.05|0.07|A|F|1994-09-15|1994-10-16|1994-10-01|TAKE BACK RETURN|AIR|lites according to +29923|939|8|2|23|42318.39|0.10|0.06|A|F|1994-10-28|1994-10-22|1994-11-13|DELIVER IN PERSON|RAIL|ns. even accounts detect. perm +29923|164|91|3|11|11705.76|0.07|0.03|A|F|1994-10-17|1994-11-13|1994-10-22|TAKE BACK RETURN|SHIP|iously ironic ide +29923|550|11|4|36|52219.80|0.07|0.03|R|F|1994-10-21|1994-12-09|1994-11-05|COLLECT COD|REG AIR|d accounts. final accounts wak +29924|275|57|1|43|50536.61|0.01|0.02|N|O|1997-11-14|1997-09-21|1997-12-02|NONE|FOB| the regular requests. fu +29924|311|96|2|22|26648.82|0.01|0.02|N|O|1997-11-12|1997-09-22|1997-11-24|TAKE BACK RETURN|MAIL|. even excuse +29924|1916|5|3|7|12725.37|0.02|0.07|N|O|1997-11-07|1997-09-28|1997-11-21|TAKE BACK RETURN|RAIL|grate final foxes. blithely iro +29924|1440|41|4|19|25487.36|0.05|0.00|N|O|1997-09-03|1997-09-26|1997-09-06|NONE|TRUCK|l pinto beans. +29924|351|8|5|11|13764.85|0.08|0.08|N|O|1997-10-05|1997-10-02|1997-10-15|TAKE BACK RETURN|FOB|ideas along the final packages +29924|1886|16|6|40|71515.20|0.04|0.01|N|O|1997-11-23|1997-10-24|1997-11-29|DELIVER IN PERSON|AIR|regular courts serve +29925|1940|41|1|33|60784.02|0.06|0.06|N|O|1998-03-23|1998-05-02|1998-04-01|NONE|MAIL| silent requests use ir +29926|1925|14|1|2|3653.84|0.07|0.07|A|F|1992-06-23|1992-06-05|1992-07-07|TAKE BACK RETURN|TRUCK|lar requests wake u +29926|682|76|2|16|25322.88|0.09|0.04|R|F|1992-06-08|1992-05-10|1992-06-23|NONE|AIR|lly furiously +29926|217|99|3|37|41336.77|0.05|0.02|R|F|1992-07-18|1992-05-27|1992-08-03|NONE|MAIL|lyly slyly +29927|449|79|1|32|43182.08|0.06|0.06|A|F|1993-01-06|1993-01-22|1993-01-26|COLLECT COD|REG AIR|lithely regular pinto beans grow careful +29927|1287|25|2|50|59414.00|0.01|0.00|R|F|1993-01-31|1993-02-04|1993-02-10|NONE|REG AIR|al asymptotes. blith +29927|828|95|3|5|8644.10|0.08|0.02|R|F|1992-11-19|1993-01-10|1992-12-11|DELIVER IN PERSON|FOB|cording to the +29927|1577|18|4|23|34007.11|0.05|0.07|R|F|1993-02-21|1992-12-21|1993-03-06|NONE|REG AIR|lithely close reque +29952|1942|87|1|5|9219.70|0.05|0.06|N|O|1996-10-08|1996-11-22|1996-11-05|DELIVER IN PERSON|MAIL| final ideas. f +29952|782|47|2|28|47117.84|0.04|0.01|N|O|1996-12-11|1996-11-05|1996-12-31|DELIVER IN PERSON|RAIL|pending requests u +29952|1074|75|3|29|28277.03|0.06|0.01|N|O|1996-11-13|1996-11-16|1996-12-10|COLLECT COD|MAIL|ses wake according to the carefully +29952|465|53|4|31|42329.26|0.02|0.04|N|O|1996-12-09|1996-10-16|1996-12-23|TAKE BACK RETURN|AIR|usual deposits. carefully ironic the +29953|973|74|1|4|7495.88|0.06|0.04|R|F|1995-05-17|1995-03-19|1995-06-05|COLLECT COD|MAIL|ironic ideas sleep fluffily furi +29953|842|9|2|40|69713.60|0.10|0.08|R|F|1995-05-09|1995-05-02|1995-06-07|TAKE BACK RETURN|RAIL|nag against the fox +29953|935|38|3|23|42226.39|0.06|0.02|A|F|1995-05-20|1995-04-29|1995-05-23|DELIVER IN PERSON|TRUCK|ven requests. unusual, regula +29953|225|7|4|9|10126.98|0.07|0.00|R|F|1995-04-02|1995-04-23|1995-04-08|TAKE BACK RETURN|SHIP|uriously special dependenci +29953|558|89|5|7|10209.85|0.00|0.01|A|F|1995-03-14|1995-04-09|1995-03-25|COLLECT COD|MAIL|eposits are quickly bold accou +29953|33|84|6|16|14928.48|0.03|0.00|R|F|1995-04-16|1995-05-09|1995-05-09|NONE|AIR|egular packag +29953|319|4|7|13|15851.03|0.03|0.06|A|F|1995-03-08|1995-04-18|1995-04-07|NONE|AIR|quickly even +29954|237|92|1|16|18195.68|0.10|0.01|N|O|1996-01-16|1996-03-29|1996-01-25|TAKE BACK RETURN|TRUCK|e furiously. furiously bold depos +29954|120|21|2|5|5100.60|0.04|0.04|N|O|1996-04-19|1996-02-27|1996-05-11|NONE|SHIP|egular dependencies; quickly final dolph +29954|181|8|3|26|28110.68|0.08|0.00|N|O|1996-04-23|1996-02-12|1996-05-20|TAKE BACK RETURN|FOB|nts sleep quickly. ironic plat +29954|658|59|4|49|76373.85|0.00|0.07|N|O|1996-02-20|1996-03-11|1996-02-26|NONE|RAIL|s. quickly eve +29954|1818|19|5|9|15478.29|0.03|0.00|N|O|1996-02-27|1996-02-27|1996-03-27|DELIVER IN PERSON|REG AIR|wake furiously. furiously regul +29954|604|98|6|13|19559.80|0.09|0.06|N|O|1996-03-20|1996-03-26|1996-04-08|NONE|SHIP|was. slyly busy instructions cajole. +29954|1349|50|7|42|52514.28|0.07|0.01|N|O|1996-02-21|1996-02-27|1996-02-26|NONE|MAIL|nding packages. furiously spe +29955|722|23|1|20|32454.40|0.02|0.02|N|O|1996-04-21|1996-05-07|1996-04-24|NONE|MAIL|usly ironic i +29955|71|47|2|24|23305.68|0.08|0.01|N|O|1996-05-31|1996-05-06|1996-06-13|TAKE BACK RETURN|REG AIR|l deposits. dependencies along th +29955|1326|41|3|49|60138.68|0.02|0.00|N|O|1996-04-26|1996-04-24|1996-05-18|COLLECT COD|REG AIR|s are among the +29956|1495|35|1|34|47480.66|0.00|0.02|R|F|1994-11-04|1994-10-12|1994-11-15|COLLECT COD|AIR|ully silent deposi +29956|560|51|2|49|71567.44|0.08|0.03|A|F|1994-10-14|1994-09-23|1994-11-10|DELIVER IN PERSON|REG AIR|ts are fluffily about the pinto beans. +29957|407|66|1|44|57525.60|0.09|0.00|A|F|1993-04-17|1993-04-22|1993-05-05|DELIVER IN PERSON|TRUCK|nstructions. blithely bold request +29957|1822|52|2|50|86191.00|0.02|0.00|R|F|1993-06-01|1993-06-08|1993-06-24|DELIVER IN PERSON|AIR|es after the ca +29957|47|98|3|6|5682.24|0.05|0.02|R|F|1993-04-12|1993-05-23|1993-04-30|NONE|TRUCK|eposits. furiously unusual deposits imp +29957|1544|85|4|37|53484.98|0.01|0.07|R|F|1993-03-29|1993-04-22|1993-03-31|DELIVER IN PERSON|SHIP|nding pinto beans integrate alongside of +29957|1483|84|5|24|33227.52|0.07|0.05|A|F|1993-04-26|1993-06-03|1993-05-23|TAKE BACK RETURN|REG AIR|leep slyly. special, fi +29957|1022|58|6|12|11076.24|0.06|0.05|A|F|1993-07-12|1993-05-10|1993-07-13|DELIVER IN PERSON|TRUCK| cajole carefully iro +29958|423|11|1|10|13234.20|0.06|0.07|R|F|1995-03-10|1995-02-10|1995-03-15|TAKE BACK RETURN|FOB| along the r +29958|847|14|2|42|73409.28|0.02|0.04|R|F|1995-02-13|1995-03-18|1995-02-28|COLLECT COD|AIR|silent instructions. slyly special +29958|620|83|3|3|4561.86|0.10|0.08|R|F|1995-01-13|1995-02-19|1995-01-19|NONE|RAIL|oxes cajole slyly regular hockey players. +29958|1352|53|4|25|31333.75|0.08|0.02|R|F|1995-04-11|1995-04-04|1995-05-02|COLLECT COD|RAIL|ilent dinos haggle fluffily ironic accoun +29958|900|67|5|28|50425.20|0.10|0.04|A|F|1995-05-02|1995-03-31|1995-05-11|DELIVER IN PERSON|TRUCK|pecial waters boost quietly: slyly +29959|1457|97|1|7|9509.15|0.08|0.00|N|O|1996-04-30|1996-05-23|1996-05-12|NONE|AIR|ounts. gifts alongside of the furiou +29959|983|52|2|5|9419.90|0.01|0.00|N|O|1996-03-23|1996-04-19|1996-04-10|DELIVER IN PERSON|TRUCK|ly final requests affi +29959|315|72|3|48|58334.88|0.04|0.04|N|O|1996-06-17|1996-04-29|1996-07-06|DELIVER IN PERSON|FOB|mptotes. ironic, ex +29984|586|47|1|46|68382.68|0.02|0.03|A|F|1994-04-30|1994-05-10|1994-05-07|COLLECT COD|SHIP|attainments. accounts are permanently +29985|1972|61|1|35|65588.95|0.09|0.07|R|F|1992-07-28|1992-09-23|1992-08-01|COLLECT COD|MAIL|ously regular packages boost furiou +29985|1200|1|2|2|2202.40|0.02|0.01|A|F|1992-10-23|1992-08-21|1992-11-06|COLLECT COD|TRUCK|fully special deposits. carefully bold re +29985|1955|44|3|18|33425.10|0.02|0.07|R|F|1992-10-12|1992-08-29|1992-10-24|COLLECT COD|MAIL|o beans above the furiously express req +29986|371|56|1|12|15256.44|0.08|0.06|N|O|1995-09-29|1995-08-08|1995-10-26|TAKE BACK RETURN|AIR|ideas about the furiou +29986|1628|29|2|16|24473.92|0.00|0.05|N|O|1995-10-26|1995-08-03|1995-11-17|TAKE BACK RETURN|RAIL|instructions +29986|885|85|3|45|80364.60|0.07|0.06|N|O|1995-10-09|1995-09-14|1995-11-02|DELIVER IN PERSON|REG AIR|n frets cajole furiously final depe +29987|1075|81|1|20|19521.40|0.00|0.06|N|O|1997-10-02|1997-08-21|1997-10-26|TAKE BACK RETURN|MAIL|deposits. blithely bold decoys ha +29988|250|5|1|44|50611.00|0.03|0.02|A|F|1994-06-15|1994-09-03|1994-07-08|NONE|TRUCK|odolites. unusual, +29989|1074|10|1|28|27301.96|0.05|0.01|R|F|1994-10-08|1994-10-06|1994-10-19|COLLECT COD|AIR|metimes. express, final accoun +29989|1984|73|2|1|1885.98|0.02|0.01|R|F|1994-08-20|1994-09-02|1994-08-28|COLLECT COD|MAIL|s are carefully. packages boost at the re +29990|728|93|1|50|81436.00|0.09|0.00|R|F|1994-01-21|1994-01-05|1994-02-13|NONE|REG AIR| carefully carefully ironic acco +29991|1203|78|1|35|38647.00|0.02|0.05|R|F|1993-02-01|1992-11-06|1993-02-10|NONE|RAIL|ar requests. qu +29991|1375|14|2|39|49778.43|0.03|0.08|R|F|1992-12-14|1992-12-05|1992-12-18|COLLECT COD|AIR| quickly pending +29991|1094|65|3|41|40798.69|0.07|0.06|A|F|1992-12-26|1993-01-01|1992-12-31|TAKE BACK RETURN|MAIL|ress dolphins. +29991|1798|99|4|5|8498.95|0.10|0.05|R|F|1992-12-11|1992-12-23|1993-01-07|NONE|FOB|nder enticingly to the slow p +29991|1796|23|5|15|25466.85|0.08|0.05|R|F|1992-12-14|1992-11-05|1993-01-04|NONE|SHIP| ruthless pains. blithely unusual +30016|736|37|1|49|80199.77|0.09|0.07|R|F|1994-01-14|1994-04-04|1994-01-28|NONE|REG AIR|nts! quickly regular ideas haggle +30016|521|12|2|14|19901.28|0.02|0.05|R|F|1994-01-16|1994-03-28|1994-01-21|DELIVER IN PERSON|FOB| carefully unusual instructions wake furi +30016|293|94|3|23|27445.67|0.00|0.06|R|F|1994-04-20|1994-03-15|1994-05-11|NONE|SHIP|ymptotes b +30016|926|61|4|44|80384.48|0.10|0.00|R|F|1994-03-29|1994-03-23|1994-04-11|NONE|FOB| blithely furiously ironic foxes. slyly exp +30016|1678|79|5|10|15796.70|0.02|0.00|A|F|1994-02-22|1994-03-12|1994-03-15|DELIVER IN PERSON|REG AIR|y final accounts detect blithely +30016|578|79|6|38|56185.66|0.02|0.03|A|F|1994-01-19|1994-03-10|1994-01-25|TAKE BACK RETURN|MAIL| deposits cajole carefully. furio +30017|386|87|1|41|52741.58|0.02|0.04|N|O|1998-04-27|1998-02-07|1998-05-22|NONE|FOB| carefully unusual deposit +30017|510|1|2|28|39494.28|0.08|0.02|N|O|1998-03-13|1998-02-26|1998-04-04|COLLECT COD|TRUCK|nic courts according to the instructio +30017|678|79|3|47|74197.49|0.05|0.03|N|O|1998-02-08|1998-01-29|1998-03-07|DELIVER IN PERSON|AIR|even pinto beans. reg +30017|1661|85|4|42|65631.72|0.02|0.07|N|O|1998-01-12|1998-02-10|1998-02-03|TAKE BACK RETURN|REG AIR|ously express +30017|1072|78|5|4|3892.28|0.09|0.00|N|O|1998-03-02|1998-02-15|1998-03-08|DELIVER IN PERSON|TRUCK|sily pending +30018|13|39|1|19|17347.19|0.07|0.08|N|O|1997-01-28|1997-02-21|1997-02-09|COLLECT COD|AIR|ns. pinto beans +30018|824|58|2|24|41395.68|0.00|0.01|N|O|1997-01-25|1997-02-13|1997-02-22|DELIVER IN PERSON|MAIL|unusual dugouts. regular, pending accounts +30018|1238|76|3|1|1139.23|0.10|0.04|N|O|1997-05-13|1997-03-01|1997-05-29|TAKE BACK RETURN|FOB|, pending ideas are. +30018|33|84|4|3|2799.09|0.01|0.04|N|O|1997-02-22|1997-02-14|1997-03-22|TAKE BACK RETURN|AIR|rding to the platele +30019|918|19|1|28|50929.48|0.05|0.01|N|O|1998-01-01|1997-12-12|1998-01-07|DELIVER IN PERSON|RAIL|g quickly. +30019|391|48|2|24|30993.36|0.01|0.02|N|O|1997-12-21|1998-01-06|1997-12-28|NONE|SHIP|tructions. furiously regular +30019|1773|100|3|7|11723.39|0.04|0.05|N|O|1997-11-19|1998-01-09|1997-12-10|COLLECT COD|TRUCK|fully. even, special instructi +30019|1843|87|4|42|73283.28|0.03|0.07|N|O|1997-11-04|1998-01-19|1997-11-14|COLLECT COD|REG AIR|theodolites. final accou +30019|535|26|5|42|60292.26|0.07|0.04|N|O|1997-12-19|1998-01-03|1997-12-24|COLLECT COD|REG AIR|as. slyly even asymptotes boost abov +30019|583|14|6|34|50441.72|0.00|0.06|N|O|1997-12-16|1998-01-04|1998-01-05|COLLECT COD|RAIL|ter the silent, unusual depen +30019|1388|89|7|49|63179.62|0.03|0.05|N|O|1997-12-17|1997-12-26|1997-12-24|DELIVER IN PERSON|RAIL|refully final +30020|1244|82|1|3|3435.72|0.05|0.02|N|O|1997-10-26|1997-10-25|1997-11-18|NONE|MAIL|eodolites impress blithely. ideas +30020|374|75|2|50|63718.50|0.05|0.04|N|O|1997-08-04|1997-09-12|1997-08-15|COLLECT COD|SHIP|ts. carefully regular deposits sleep p +30020|1678|20|3|2|3159.34|0.09|0.08|N|O|1997-09-24|1997-09-21|1997-10-13|NONE|AIR|uctions. asymptotes g +30020|641|35|4|46|70915.44|0.04|0.00|N|O|1997-08-30|1997-08-28|1997-09-22|DELIVER IN PERSON|TRUCK|, regular instr +30020|1391|6|5|21|27140.19|0.09|0.07|N|O|1997-10-30|1997-09-13|1997-11-04|COLLECT COD|RAIL|unts poach slyly among +30020|754|87|6|4|6619.00|0.09|0.07|N|O|1997-10-16|1997-10-27|1997-11-04|DELIVER IN PERSON|MAIL|ar packages integrate furiously regula +30021|3|4|1|48|43344.00|0.03|0.07|R|F|1993-04-02|1993-04-15|1993-04-09|NONE|SHIP|ndencies haggle among t +30021|1068|39|2|29|28102.74|0.04|0.04|R|F|1993-05-01|1993-04-25|1993-05-25|TAKE BACK RETURN|TRUCK|special requests use. slyly +30022|1782|83|1|12|20205.36|0.08|0.05|N|O|1996-07-28|1996-06-13|1996-07-30|COLLECT COD|MAIL|usly ironic theodolites detect. furiou +30022|1749|50|2|7|11555.18|0.09|0.00|N|O|1996-06-08|1996-06-11|1996-07-04|DELIVER IN PERSON|SHIP|ly ironic deposits boost idly carefully ev +30022|1903|4|3|6|10829.40|0.06|0.00|N|O|1996-05-22|1996-08-02|1996-06-11|TAKE BACK RETURN|REG AIR|refully regular ideas a +30022|603|4|4|43|64654.80|0.07|0.00|N|O|1996-06-10|1996-06-19|1996-06-14|TAKE BACK RETURN|RAIL|ding to the even deposits are carefully +30022|785|18|5|9|15172.02|0.02|0.05|N|O|1996-07-21|1996-07-30|1996-08-16|DELIVER IN PERSON|AIR|l sentiment +30022|14|65|6|3|2742.03|0.07|0.03|N|O|1996-08-11|1996-06-13|1996-08-25|DELIVER IN PERSON|REG AIR|ding, regular accounts. courts hagg +30023|806|40|1|28|47790.40|0.00|0.06|R|F|1994-01-21|1993-12-23|1994-02-15|DELIVER IN PERSON|AIR|, express courts across the +30023|1387|26|2|13|16748.94|0.07|0.01|R|F|1994-01-28|1994-01-12|1994-02-04|DELIVER IN PERSON|MAIL|ly sometime +30023|359|16|3|7|8815.45|0.10|0.05|R|F|1994-02-09|1994-01-13|1994-02-28|NONE|SHIP|ake. furiously regular request +30023|154|7|4|31|32678.65|0.08|0.00|A|F|1993-11-03|1993-11-15|1993-11-20|NONE|FOB|otes wake furiously after the slowly r +30023|477|36|5|21|28926.87|0.04|0.07|A|F|1994-01-10|1994-01-14|1994-01-25|NONE|RAIL|ncies affix. ironic fo +30023|1020|56|6|12|11052.24|0.01|0.07|A|F|1994-01-23|1993-11-28|1994-02-11|COLLECT COD|TRUCK|packages. regular, silent +30048|107|8|1|9|9063.90|0.02|0.08|N|O|1995-08-16|1995-08-23|1995-08-30|COLLECT COD|MAIL| furiously accounts. quickly ironic foxes +30048|7|8|2|35|31745.00|0.05|0.05|N|O|1995-06-30|1995-07-21|1995-07-11|COLLECT COD|TRUCK|s sleep fluffily. quickly +30049|1328|5|1|20|24586.40|0.05|0.04|N|O|1996-05-02|1996-03-23|1996-05-28|DELIVER IN PERSON|MAIL|ronic foxes nag. furiously ironic ideas +30049|1669|93|2|3|4711.98|0.03|0.07|N|O|1996-01-08|1996-02-09|1996-02-04|NONE|TRUCK|ut the final packages pla +30049|371|72|3|39|49583.43|0.02|0.06|N|O|1996-03-20|1996-03-02|1996-04-11|TAKE BACK RETURN|FOB|t packages. carefully silent +30049|318|47|4|36|43859.16|0.04|0.08|N|O|1996-03-03|1996-03-15|1996-03-30|COLLECT COD|TRUCK|ts detect. multipliers boost. even ide +30050|706|3|1|30|48201.00|0.04|0.04|A|F|1993-09-05|1993-08-10|1993-09-19|NONE|RAIL|ar ideas. even instr +30050|912|81|2|8|14503.28|0.07|0.04|R|F|1993-09-11|1993-08-11|1993-10-07|TAKE BACK RETURN|AIR|unts are. unusual deposits snooze carefull +30050|185|86|3|6|6511.08|0.05|0.01|R|F|1993-09-08|1993-08-30|1993-09-24|TAKE BACK RETURN|TRUCK|ously alongside of the carefully +30050|1817|47|4|17|29219.77|0.10|0.02|A|F|1993-09-28|1993-07-28|1993-10-19|NONE|RAIL|egular pains haggl +30050|1321|22|5|39|47670.48|0.08|0.07|A|F|1993-09-17|1993-09-02|1993-10-09|COLLECT COD|REG AIR|yly ironic foxes. ca +30050|1038|44|6|22|20658.66|0.08|0.07|R|F|1993-07-24|1993-08-21|1993-08-14|COLLECT COD|RAIL|cajole. quick +30051|364|21|1|32|40459.52|0.09|0.08|R|F|1992-05-15|1992-04-28|1992-06-13|TAKE BACK RETURN|MAIL|ironic requests are bl +30051|627|59|2|46|70270.52|0.06|0.06|R|F|1992-04-06|1992-05-20|1992-05-03|NONE|FOB|at the blithely pending packages +30052|1014|20|1|1|915.01|0.04|0.04|N|O|1998-04-19|1998-06-03|1998-05-10|COLLECT COD|RAIL|g the blithely special depo +30052|628|29|2|46|70316.52|0.09|0.04|N|O|1998-05-26|1998-05-07|1998-06-10|COLLECT COD|MAIL|o beans. slyly silent ideas hagg +30052|204|59|3|8|8833.60|0.07|0.00|N|O|1998-07-01|1998-05-05|1998-07-04|DELIVER IN PERSON|AIR|luffily regular foxes wak +30052|1038|74|4|24|22536.72|0.00|0.04|N|O|1998-05-15|1998-04-16|1998-05-31|DELIVER IN PERSON|REG AIR|. slyly regular d +30052|605|99|5|25|37640.00|0.06|0.04|N|O|1998-05-21|1998-05-24|1998-06-18|NONE|MAIL|ronic requests +30053|1312|13|1|40|48532.40|0.00|0.02|R|F|1994-05-01|1994-03-17|1994-05-26|DELIVER IN PERSON|MAIL|ptotes sleep slyly. packages use. bus +30053|1270|8|2|21|24596.67|0.05|0.00|A|F|1994-03-29|1994-04-19|1994-03-30|DELIVER IN PERSON|TRUCK|es against the e +30053|434|35|3|22|29357.46|0.09|0.01|A|F|1994-02-11|1994-04-26|1994-03-02|COLLECT COD|REG AIR|nd carefully exp +30053|427|28|4|25|33185.50|0.01|0.06|R|F|1994-03-20|1994-03-25|1994-03-23|DELIVER IN PERSON|FOB|requests are slyly alongside of +30053|596|97|5|49|73332.91|0.02|0.02|A|F|1994-05-19|1994-04-05|1994-06-18|DELIVER IN PERSON|FOB|. fluffily ironic deposits hinder quickly +30053|847|14|6|27|47191.68|0.10|0.08|A|F|1994-05-09|1994-03-11|1994-05-26|COLLECT COD|SHIP|deposits above the express, bold in +30054|1990|23|1|33|62435.67|0.04|0.02|R|F|1992-09-26|1992-11-30|1992-10-26|TAKE BACK RETURN|AIR| ironic instructions serve idly inside +30054|881|15|2|40|71275.20|0.07|0.03|A|F|1992-09-28|1992-10-11|1992-10-24|COLLECT COD|SHIP| are. carefully pendi +30054|384|85|3|30|38531.40|0.06|0.03|A|F|1992-10-14|1992-10-08|1992-11-07|NONE|FOB|ges detect furiously pending +30054|1109|82|4|22|22222.20|0.05|0.00|R|F|1992-10-11|1992-11-21|1992-10-21|NONE|REG AIR|y-- pinto beans sleep +30055|956|59|1|35|64993.25|0.00|0.03|R|F|1993-06-13|1993-07-09|1993-07-03|DELIVER IN PERSON|TRUCK|ons affix carefully fur +30055|1430|70|2|41|54588.63|0.10|0.03|R|F|1993-07-14|1993-06-23|1993-07-20|DELIVER IN PERSON|FOB|tructions haggle caref +30055|135|88|3|29|30018.77|0.06|0.01|R|F|1993-06-16|1993-06-12|1993-06-17|NONE|AIR|riously bold requests. ideas dou +30080|630|93|1|6|9183.78|0.09|0.08|N|O|1997-10-26|1997-09-28|1997-11-14|TAKE BACK RETURN|AIR|ly silent package +30080|374|3|2|33|42054.21|0.07|0.08|N|O|1997-09-08|1997-08-28|1997-10-03|DELIVER IN PERSON|RAIL|final warthogs. slyly regular i +30080|1652|35|3|3|4660.95|0.01|0.06|N|O|1997-09-07|1997-10-22|1997-09-19|TAKE BACK RETURN|SHIP|tes haggle against the slyly expr +30080|554|45|4|22|32000.10|0.01|0.01|N|O|1997-11-18|1997-08-30|1997-12-04|NONE|AIR| sleep regular depe +30080|542|73|5|42|60586.68|0.06|0.06|N|O|1997-09-04|1997-09-01|1997-09-12|COLLECT COD|MAIL| thrash alongside of the fu +30081|1005|6|1|9|8154.00|0.08|0.07|N|O|1996-02-29|1996-03-12|1996-03-13|DELIVER IN PERSON|RAIL| instructions wake carefully a +30081|1366|67|2|16|20277.76|0.05|0.00|N|O|1996-04-14|1996-02-03|1996-04-22|NONE|SHIP| haggle slyly ca +30081|120|99|3|15|15301.80|0.09|0.00|N|O|1995-12-28|1996-01-28|1996-01-15|DELIVER IN PERSON|FOB|p always blithely express accounts? regular +30081|473|61|4|8|10987.76|0.09|0.02|N|O|1996-01-11|1996-02-20|1996-02-03|NONE|FOB|ng the ironic foxes. final, +30082|1407|47|1|21|27476.40|0.02|0.03|N|O|1997-01-20|1997-01-24|1997-02-05|COLLECT COD|RAIL|t the blithely unusual requests. slyly i +30082|951|20|2|12|22223.40|0.03|0.05|N|O|1997-02-25|1997-01-13|1997-03-12|DELIVER IN PERSON|MAIL|ld dolphins after the +30082|747|44|3|44|72500.56|0.02|0.03|N|O|1996-12-20|1997-03-12|1997-01-08|TAKE BACK RETURN|FOB|ckly regular pinto beans nag above th +30082|329|58|4|21|25815.72|0.02|0.03|N|O|1997-01-25|1997-02-24|1997-02-23|NONE|MAIL|g attainments are blithely above th +30082|1166|75|5|47|50156.52|0.08|0.03|N|O|1997-03-28|1997-01-31|1997-04-23|COLLECT COD|SHIP|. final sauternes kind +30083|1545|46|1|34|49182.36|0.10|0.05|A|F|1994-02-09|1994-03-10|1994-03-02|NONE|TRUCK|against the blithely ironic packages +30083|1533|54|2|13|18648.89|0.03|0.05|A|F|1994-01-31|1994-02-15|1994-02-13|TAKE BACK RETURN|MAIL| accounts. blithely r +30083|787|52|3|21|35443.38|0.06|0.03|R|F|1994-01-13|1994-02-12|1994-01-30|TAKE BACK RETURN|RAIL|refully abov +30083|1095|66|4|20|19921.80|0.02|0.05|A|F|1994-02-02|1994-04-05|1994-02-27|DELIVER IN PERSON|AIR| decoys according to the pendin +30084|1642|84|1|38|58658.32|0.05|0.04|N|O|1998-01-31|1997-12-29|1998-03-01|TAKE BACK RETURN|TRUCK|lithely carefully even packages. fluffily f +30084|1164|37|2|30|31954.80|0.00|0.07|N|O|1998-01-12|1997-12-24|1998-01-22|DELIVER IN PERSON|SHIP|ully upon the fluffily express depo +30085|1595|96|1|36|53877.24|0.09|0.07|N|O|1996-09-18|1996-10-05|1996-09-21|NONE|FOB|osits sleep slyly. carefu +30085|1316|31|2|16|19476.96|0.02|0.00|N|O|1996-10-20|1996-08-30|1996-11-06|NONE|TRUCK|quickly bold excuses. final theodolites caj +30085|1114|87|3|39|39589.29|0.03|0.06|N|O|1996-11-11|1996-10-12|1996-12-02|COLLECT COD|SHIP|e ironic, bold requests hag +30085|1897|84|4|17|30581.13|0.00|0.06|N|O|1996-09-15|1996-09-25|1996-09-23|TAKE BACK RETURN|AIR|yly bold pack +30086|1152|61|1|47|49498.05|0.00|0.06|N|O|1996-10-27|1996-08-29|1996-11-08|NONE|TRUCK| furiously careful, final accounts. qu +30086|510|11|2|28|39494.28|0.06|0.03|N|O|1996-07-20|1996-09-15|1996-08-07|TAKE BACK RETURN|REG AIR|ependencie +30086|972|7|3|41|76791.77|0.04|0.08|N|O|1996-10-22|1996-08-05|1996-11-12|DELIVER IN PERSON|TRUCK|hely about the express +30086|293|94|4|22|26252.38|0.00|0.08|N|O|1996-07-03|1996-09-17|1996-07-12|TAKE BACK RETURN|MAIL|boost blit +30086|1439|79|5|10|13404.30|0.04|0.07|N|O|1996-07-05|1996-09-16|1996-07-14|DELIVER IN PERSON|REG AIR|mptotes nag carefully packages. p +30087|702|67|1|41|65710.70|0.10|0.07|R|F|1993-10-17|1993-12-06|1993-11-08|NONE|AIR|ly express foxes. pending, regular +30087|1713|14|2|35|56514.85|0.03|0.04|R|F|1993-10-09|1993-11-17|1993-10-22|DELIVER IN PERSON|AIR|ptotes caj +30087|625|88|3|34|51871.08|0.01|0.00|R|F|1993-10-19|1993-11-27|1993-11-08|COLLECT COD|RAIL|ccounts nag. instru +30112|931|32|1|30|54957.90|0.09|0.05|A|F|1993-04-01|1993-04-02|1993-04-05|TAKE BACK RETURN|TRUCK|dugouts. caref +30112|1337|76|2|12|14859.96|0.00|0.06|A|F|1993-05-06|1993-05-23|1993-05-10|NONE|REG AIR|ithely bold packages sleep! specia +30112|795|92|3|4|6783.16|0.09|0.03|R|F|1993-05-20|1993-04-15|1993-06-09|NONE|REG AIR| regular package +30113|355|84|1|24|30128.40|0.06|0.01|A|F|1992-04-07|1992-05-01|1992-05-07|DELIVER IN PERSON|AIR|ole to the blithely regular accounts. bl +30114|448|78|1|2|2696.88|0.00|0.03|A|F|1993-10-13|1993-09-16|1993-10-31|TAKE BACK RETURN|SHIP| regular instructions. blithe +30114|162|63|2|31|32926.96|0.08|0.08|R|F|1993-10-20|1993-10-24|1993-11-06|NONE|TRUCK|tornis. carefully regular theod +30115|1011|12|1|28|25536.28|0.02|0.04|N|O|1998-01-18|1998-02-13|1998-01-29|TAKE BACK RETURN|MAIL|slyly regular +30115|300|82|2|19|22805.70|0.08|0.02|N|O|1998-04-23|1998-03-11|1998-04-24|DELIVER IN PERSON|RAIL|tions along the furiously regular acco +30116|951|20|1|48|88893.60|0.03|0.05|N|O|1998-05-05|1998-05-18|1998-05-07|COLLECT COD|RAIL|resias. quickly final pac +30116|1137|74|2|34|35296.42|0.03|0.07|N|O|1998-06-23|1998-06-16|1998-07-06|NONE|RAIL|oost after the ir +30117|819|86|1|6|10318.86|0.09|0.02|A|F|1993-09-21|1993-08-12|1993-10-02|NONE|SHIP|s are. blithely unusual +30117|332|89|2|3|3696.99|0.08|0.01|R|F|1993-08-12|1993-08-08|1993-08-29|DELIVER IN PERSON|FOB|ly idly ironic packages. depo +30118|444|45|1|31|41677.64|0.02|0.06|R|F|1993-05-12|1993-04-29|1993-06-06|NONE|FOB|st quickly. slyly final +30118|1192|1|2|50|54659.50|0.07|0.02|A|F|1993-07-10|1993-05-31|1993-07-29|DELIVER IN PERSON|MAIL|final accoun +30118|1320|59|3|30|36639.60|0.01|0.06|R|F|1993-04-15|1993-04-25|1993-04-25|NONE|MAIL|usly silent platelets are +30118|446|76|4|36|48471.84|0.07|0.02|A|F|1993-04-24|1993-05-21|1993-05-20|COLLECT COD|TRUCK|requests d +30119|794|91|1|23|38980.17|0.00|0.03|N|O|1998-08-14|1998-07-27|1998-09-07|NONE|MAIL|o beans. even packages according +30119|1064|65|2|18|17371.08|0.08|0.05|N|O|1998-09-10|1998-08-29|1998-09-29|TAKE BACK RETURN|TRUCK|quests impress unusual p +30119|1534|35|3|22|31581.66|0.01|0.03|N|O|1998-09-21|1998-07-15|1998-10-15|COLLECT COD|MAIL|egular requests-- slyly daring fre +30119|187|66|4|29|31528.22|0.07|0.07|N|O|1998-08-02|1998-09-01|1998-09-01|DELIVER IN PERSON|SHIP|timents are carefully ironic asympto +30119|159|86|5|49|51898.35|0.08|0.07|N|O|1998-09-18|1998-08-19|1998-09-27|COLLECT COD|TRUCK|inal epitaphs haggle +30119|1801|31|6|6|10216.80|0.10|0.08|N|O|1998-09-25|1998-07-19|1998-10-03|DELIVER IN PERSON|REG AIR|tes; carefully eve +30144|1817|4|1|33|56720.73|0.06|0.00|N|O|1995-09-19|1995-10-20|1995-10-12|NONE|RAIL| excuses after the ac +30144|567|28|2|36|52832.16|0.10|0.06|N|O|1995-11-10|1995-09-26|1995-11-30|NONE|SHIP|thely specia +30144|196|23|3|32|35078.08|0.07|0.02|N|O|1995-11-20|1995-10-31|1995-12-17|DELIVER IN PERSON|REG AIR|ing to the ironic attainm +30144|1312|13|4|23|27906.13|0.00|0.01|N|O|1995-10-22|1995-10-25|1995-11-03|DELIVER IN PERSON|AIR|ilent requests wake quickly across the fluf +30145|345|2|1|19|23661.46|0.10|0.08|N|O|1998-09-19|1998-07-28|1998-10-09|NONE|RAIL| to the accounts. blithely special or +30145|473|74|2|43|59059.21|0.10|0.07|N|O|1998-09-24|1998-08-17|1998-10-23|COLLECT COD|SHIP|ests. final wartho +30145|374|59|3|18|22938.66|0.10|0.06|N|O|1998-08-25|1998-08-21|1998-09-20|TAKE BACK RETURN|FOB|ly pending +30145|824|91|4|49|84516.18|0.08|0.03|N|O|1998-08-30|1998-08-02|1998-08-31|NONE|REG AIR|, even deposits among the reques +30146|1730|15|1|14|22844.22|0.08|0.04|N|O|1998-06-04|1998-07-06|1998-06-15|TAKE BACK RETURN|SHIP|theodolites. slyl +30147|941|42|1|17|31312.98|0.03|0.08|A|F|1992-08-08|1992-08-10|1992-08-18|COLLECT COD|RAIL|ular theodolites nag +30147|730|31|2|50|81536.50|0.06|0.02|A|F|1992-08-24|1992-07-31|1992-08-28|TAKE BACK RETURN|REG AIR|its integrate +30148|808|42|1|44|75187.20|0.01|0.01|N|O|1997-07-04|1997-08-11|1997-07-13|DELIVER IN PERSON|MAIL|st quickly unusual packages +30148|190|43|2|2|2180.38|0.08|0.08|N|O|1997-06-23|1997-08-16|1997-07-14|TAKE BACK RETURN|TRUCK|refully regular ideas. fluffily express +30148|1357|72|3|38|47817.30|0.09|0.03|N|O|1997-08-16|1997-08-08|1997-09-14|COLLECT COD|AIR| theodolites hag +30148|686|80|4|4|6346.72|0.06|0.07|N|O|1997-07-28|1997-09-01|1997-08-10|DELIVER IN PERSON|TRUCK|xes detect carefully amon +30148|1294|69|5|8|9562.32|0.05|0.05|N|O|1997-10-06|1997-07-14|1997-10-13|TAKE BACK RETURN|FOB|ing ideas. carefully regu +30148|1907|8|6|11|19897.90|0.07|0.04|N|O|1997-07-03|1997-08-24|1997-07-08|COLLECT COD|FOB|e slowly. blithely expre +30148|1905|50|7|34|61434.60|0.07|0.07|N|O|1997-09-01|1997-08-26|1997-09-11|NONE|MAIL|t according to the slyly even exc +30149|432|33|1|46|61291.78|0.01|0.05|A|F|1994-03-21|1994-03-06|1994-04-13|NONE|AIR|al deposits. qu +30149|1312|89|2|47|57025.57|0.08|0.06|R|F|1994-03-04|1994-01-16|1994-03-30|DELIVER IN PERSON|TRUCK|ages boost slyly. quickly final forge +30149|1758|59|3|41|68049.75|0.03|0.08|R|F|1994-04-06|1994-03-01|1994-05-03|NONE|AIR|olphins. express pinto bea +30149|1844|45|4|8|13966.72|0.02|0.08|A|F|1994-01-11|1994-02-25|1994-01-13|COLLECT COD|RAIL|ely above the regular ideas. bli +30149|576|37|5|16|23625.12|0.04|0.04|A|F|1994-04-06|1994-03-01|1994-04-25|TAKE BACK RETURN|AIR|ress accounts sleep +30150|1614|38|1|23|34859.03|0.02|0.08|R|F|1994-01-15|1994-01-01|1994-01-27|TAKE BACK RETURN|MAIL| sleep carefully above th +30151|803|3|1|24|40891.20|0.01|0.05|R|F|1995-02-23|1995-03-25|1995-03-21|TAKE BACK RETURN|MAIL| ironically bold package +30151|1681|64|2|47|74385.96|0.04|0.00|R|F|1995-02-04|1995-03-22|1995-02-26|TAKE BACK RETURN|SHIP| carefully pending dependencies boost q +30151|187|14|3|30|32615.40|0.05|0.01|R|F|1995-05-13|1995-04-28|1995-05-23|TAKE BACK RETURN|SHIP|ns! furiously bold packages w +30176|856|57|1|47|82571.95|0.04|0.01|A|F|1994-08-04|1994-07-04|1994-08-18|DELIVER IN PERSON|FOB| cajole! quickly ironic depos +30176|1588|9|2|8|11916.64|0.10|0.00|R|F|1994-04-28|1994-06-24|1994-05-17|COLLECT COD|TRUCK|d deposits. slyly special accounts about t +30176|1606|30|3|3|4522.80|0.00|0.02|R|F|1994-05-09|1994-06-08|1994-06-07|NONE|REG AIR| packages use blithely slyly pending requ +30176|1046|52|4|8|7576.32|0.10|0.05|R|F|1994-07-27|1994-07-02|1994-08-07|NONE|AIR|tructions sleep along th +30176|409|10|5|10|13094.00|0.07|0.03|A|F|1994-07-06|1994-06-23|1994-07-31|NONE|FOB|print fluffi +30177|259|41|1|11|12751.75|0.09|0.08|R|F|1992-11-03|1993-01-14|1992-11-30|TAKE BACK RETURN|TRUCK|ly regular requests. accounts detec +30178|1864|8|1|49|86527.14|0.03|0.03|A|F|1992-11-25|1993-01-04|1992-11-30|NONE|MAIL| packages sleep. ev +30179|1027|33|1|18|16704.36|0.10|0.02|N|O|1998-01-17|1998-01-25|1998-02-08|DELIVER IN PERSON|RAIL| bold, thin i +30179|1448|27|2|18|24289.92|0.05|0.05|N|O|1998-02-25|1998-01-20|1998-03-15|COLLECT COD|RAIL|ate. regular instructions at the +30179|922|57|3|29|52864.68|0.10|0.04|N|O|1998-01-12|1997-12-20|1998-01-26|COLLECT COD|FOB|wake. regula +30179|1259|34|4|44|51051.00|0.06|0.07|N|O|1998-02-02|1997-12-07|1998-02-09|NONE|MAIL|. quickly silent pinto beans are blithel +30179|1957|90|5|10|18589.50|0.02|0.03|N|O|1997-12-01|1998-01-09|1997-12-18|DELIVER IN PERSON|RAIL| furiously +30179|829|30|6|14|24217.48|0.07|0.01|N|O|1997-12-09|1998-01-15|1998-01-06|DELIVER IN PERSON|AIR|ers alongs +30179|835|69|7|6|10414.98|0.02|0.07|N|O|1998-01-13|1998-01-11|1998-02-09|DELIVER IN PERSON|SHIP|ns cajole blithely. carefully even i +30180|413|43|1|38|49909.58|0.00|0.08|N|O|1997-02-11|1997-02-09|1997-02-21|DELIVER IN PERSON|REG AIR|ges along t +30180|921|90|2|3|5465.76|0.06|0.03|N|O|1997-02-26|1997-03-24|1997-03-17|COLLECT COD|AIR|ic dependencies sublate expres +30180|865|66|3|33|58273.38|0.09|0.01|N|O|1997-05-02|1997-02-09|1997-05-03|NONE|REG AIR|ully across the furious +30180|1375|90|4|17|21698.29|0.06|0.04|N|O|1997-04-09|1997-03-31|1997-04-27|DELIVER IN PERSON|TRUCK|tes nag. fluffily iron +30180|1101|38|5|9|9018.90|0.01|0.08|N|O|1997-02-15|1997-03-16|1997-03-11|DELIVER IN PERSON|FOB|the accounts! slyly express excuses a +30180|1000|3|6|11|9911.00|0.05|0.02|N|O|1997-01-15|1997-02-20|1997-02-06|DELIVER IN PERSON|RAIL|ithely. pending deposits sleep. pinto beans +30181|259|60|1|35|40573.75|0.04|0.03|N|O|1996-08-25|1996-10-06|1996-08-31|COLLECT COD|TRUCK|uickly express pinto beans. slyly even d +30181|1908|97|2|15|27148.50|0.09|0.00|N|O|1996-10-25|1996-10-11|1996-11-05|NONE|AIR|ges. regular accounts are a +30182|629|61|1|16|24473.92|0.08|0.07|A|F|1995-04-11|1995-04-03|1995-04-24|NONE|RAIL|packages lose packag +30183|410|98|1|30|39312.30|0.05|0.05|N|O|1997-09-23|1997-08-24|1997-10-11|DELIVER IN PERSON|RAIL|bold packages are slyly after the furiously +30183|933|34|2|5|9169.65|0.06|0.03|N|O|1997-07-24|1997-08-28|1997-08-19|COLLECT COD|AIR|ugouts. ironic accounts a +30183|1703|4|3|25|40117.50|0.03|0.03|N|O|1997-07-06|1997-07-13|1997-07-12|NONE|TRUCK|p above the packages. even packages hang fl +30183|1774|75|4|11|18433.47|0.09|0.06|N|O|1997-08-30|1997-07-29|1997-09-09|NONE|REG AIR|ffily evenly unusual packages. +30183|407|8|5|31|40529.40|0.07|0.01|N|O|1997-06-11|1997-07-12|1997-06-21|DELIVER IN PERSON|REG AIR|eposits boost quickl +30183|346|75|6|31|38636.54|0.10|0.02|N|O|1997-08-02|1997-07-17|1997-08-18|COLLECT COD|FOB|final packages wake against the theodo +30208|674|37|1|33|51964.11|0.10|0.05|A|F|1992-10-19|1992-08-27|1992-11-12|NONE|FOB|ular pinto beans. fluffil +30208|985|20|2|43|81097.14|0.05|0.06|R|F|1992-09-10|1992-09-06|1992-09-28|DELIVER IN PERSON|AIR| beans dete +30208|987|90|3|26|49087.48|0.05|0.07|A|F|1992-10-21|1992-08-25|1992-10-28|DELIVER IN PERSON|RAIL|posits are furiously +30208|1254|92|4|50|57762.50|0.06|0.04|A|F|1992-09-11|1992-09-24|1992-09-15|TAKE BACK RETURN|RAIL|olites haggle slyly along the asymptotes. +30208|1098|4|5|4|3996.36|0.08|0.08|A|F|1992-07-23|1992-10-04|1992-07-29|NONE|MAIL|ully final requests nag blithely! +30208|548|39|6|44|63735.76|0.04|0.03|A|F|1992-10-06|1992-09-21|1992-11-04|TAKE BACK RETURN|RAIL|r requests. silent, s +30208|180|33|7|45|48608.10|0.03|0.07|R|F|1992-08-13|1992-09-01|1992-08-27|COLLECT COD|TRUCK|hlessly bold foxe +30209|959|94|1|29|53938.55|0.09|0.01|A|F|1995-01-08|1994-12-16|1995-01-23|COLLECT COD|REG AIR| slyly even theodolites +30209|533|34|2|15|21502.95|0.02|0.02|R|F|1995-01-13|1995-01-28|1995-01-18|DELIVER IN PERSON|REG AIR|ts. furiously regular theodolites aft +30210|1858|45|1|42|73913.70|0.05|0.05|N|O|1998-03-30|1998-05-04|1998-04-11|NONE|TRUCK|sts above the final pin +30210|362|91|2|24|30296.64|0.09|0.01|N|O|1998-05-10|1998-05-19|1998-05-30|COLLECT COD|TRUCK|ly final deposits. regularly reg +30210|471|72|3|23|31543.81|0.01|0.07|N|O|1998-04-17|1998-04-10|1998-05-07|DELIVER IN PERSON|TRUCK|gular deposits +30210|1151|52|4|18|18938.70|0.03|0.05|N|O|1998-03-19|1998-04-06|1998-03-24|DELIVER IN PERSON|TRUCK|s cajole finally bli +30211|327|28|1|22|27001.04|0.01|0.07|A|F|1993-09-05|1993-07-19|1993-09-14|TAKE BACK RETURN|AIR|asymptotes affix aft +30211|1701|44|2|5|8013.50|0.01|0.00|R|F|1993-08-23|1993-09-06|1993-08-27|TAKE BACK RETURN|REG AIR|e slyly bli +30211|1068|39|3|32|31009.92|0.06|0.08|A|F|1993-08-30|1993-08-19|1993-09-23|NONE|AIR|gular, unusual ideas sle +30211|637|38|4|4|6150.52|0.10|0.04|A|F|1993-09-16|1993-07-20|1993-09-25|COLLECT COD|AIR|n deposits haggle through the slyly expre +30211|742|43|5|34|55853.16|0.05|0.01|A|F|1993-09-18|1993-08-03|1993-10-15|DELIVER IN PERSON|AIR|lar packages. carefully ironic packages +30211|760|57|6|46|76394.96|0.05|0.00|R|F|1993-08-05|1993-07-24|1993-08-24|NONE|REG AIR|ly final deposit +30211|642|36|7|32|49364.48|0.05|0.07|A|F|1993-08-15|1993-08-29|1993-08-27|DELIVER IN PERSON|RAIL|ts hang quickly stealthily eve +30212|717|14|1|22|35589.62|0.06|0.03|N|O|1998-01-23|1998-01-28|1998-02-14|DELIVER IN PERSON|MAIL|fully unusual pinto beans d +30212|1357|58|2|34|42783.90|0.10|0.02|N|O|1998-01-09|1998-02-08|1998-01-31|TAKE BACK RETURN|RAIL|usly about the final packages. regular the +30212|367|96|3|38|48159.68|0.04|0.02|N|O|1997-12-29|1998-01-15|1997-12-30|COLLECT COD|MAIL|across the unusual, regular excuses +30212|831|65|4|21|36368.43|0.06|0.04|N|O|1998-02-24|1998-01-13|1998-03-01|TAKE BACK RETURN|RAIL|ies against th +30212|646|78|5|18|27839.52|0.01|0.06|N|O|1997-12-08|1997-12-30|1997-12-21|NONE|FOB| regular deposits +30212|1648|90|6|22|34092.08|0.08|0.04|N|O|1998-03-08|1998-01-21|1998-03-17|NONE|SHIP| sometimes even d +30213|7|83|1|9|8163.00|0.05|0.08|R|F|1993-05-17|1993-06-23|1993-05-23|DELIVER IN PERSON|SHIP|ccounts run quickly into the slyly fi +30214|1591|32|1|2|2985.18|0.08|0.05|A|F|1994-12-09|1994-12-04|1995-01-07|TAKE BACK RETURN|MAIL|uctions. slyly express accounts +30214|1355|70|2|28|35177.80|0.04|0.07|R|F|1994-10-25|1994-11-06|1994-11-19|COLLECT COD|REG AIR|d have to use special pinto bean +30214|749|50|3|43|70938.82|0.03|0.05|A|F|1994-11-30|1994-11-06|1994-12-26|DELIVER IN PERSON|REG AIR| the furiously u +30214|462|21|4|5|6812.30|0.01|0.00|R|F|1994-11-04|1994-12-10|1994-11-05|TAKE BACK RETURN|RAIL|s, regular pinto beans are slyly +30214|915|50|5|10|18159.10|0.10|0.03|R|F|1994-12-02|1994-12-09|1994-12-20|NONE|TRUCK|refully ironic excus +30214|236|91|6|34|38631.82|0.04|0.07|R|F|1995-01-06|1994-11-07|1995-01-24|COLLECT COD|SHIP|heodolites. blithely +30214|1018|19|7|9|8271.09|0.08|0.08|R|F|1994-10-17|1994-11-09|1994-11-08|DELIVER IN PERSON|MAIL|imes bold asy +30215|253|8|1|36|41517.00|0.02|0.07|A|F|1994-06-24|1994-04-26|1994-06-30|COLLECT COD|RAIL|l deposits are +30215|16|67|2|34|31144.34|0.02|0.08|A|F|1994-06-06|1994-04-05|1994-06-12|TAKE BACK RETURN|RAIL|nts according to the ironic +30215|244|26|3|17|19452.08|0.00|0.00|R|F|1994-04-22|1994-04-04|1994-05-11|NONE|TRUCK|ic deposits. dependencies are +30215|1394|71|4|31|40157.09|0.10|0.02|A|F|1994-05-11|1994-04-12|1994-05-23|NONE|AIR| blithely slyly silent accounts. +30215|475|5|5|12|16505.64|0.07|0.00|R|F|1994-03-07|1994-04-06|1994-03-31|NONE|SHIP|foxes along the regular theodoli +30215|1794|37|6|27|45786.33|0.00|0.05|R|F|1994-04-11|1994-04-19|1994-05-11|TAKE BACK RETURN|TRUCK|gle. slyly final +30215|730|27|7|45|73382.85|0.00|0.04|R|F|1994-05-18|1994-04-16|1994-06-05|TAKE BACK RETURN|MAIL|al accounts +30240|1596|97|1|50|74879.50|0.00|0.06|N|O|1998-03-25|1998-06-11|1998-04-09|NONE|AIR|inal packages. slyly +30240|233|15|2|17|19264.91|0.10|0.04|N|O|1998-04-04|1998-04-26|1998-04-07|NONE|REG AIR|horses. packages wake slyly around the bli +30240|1704|47|3|17|27296.90|0.00|0.07|N|O|1998-04-01|1998-06-06|1998-04-25|NONE|FOB|riously bold +30240|1357|96|4|26|32717.10|0.08|0.02|N|O|1998-04-02|1998-04-17|1998-04-11|NONE|REG AIR|efully after +30240|806|40|5|1|1706.80|0.05|0.04|N|O|1998-04-10|1998-04-20|1998-05-06|DELIVER IN PERSON|RAIL|cial theod +30240|1914|15|6|11|19975.01|0.06|0.07|N|O|1998-05-04|1998-05-18|1998-05-05|COLLECT COD|AIR|dolites. always pending +30241|300|55|1|45|54013.50|0.02|0.00|N|O|1997-10-17|1997-10-14|1997-11-13|TAKE BACK RETURN|FOB|fily regular requests use carefully. sil +30241|26|52|2|37|34262.74|0.08|0.00|N|O|1997-09-06|1997-11-05|1997-09-11|NONE|REG AIR|thrash furiously a +30241|619|51|3|46|69902.06|0.09|0.01|N|O|1997-09-26|1997-11-05|1997-10-25|COLLECT COD|FOB|jole above the packages. +30242|850|51|1|46|80539.10|0.00|0.00|N|O|1998-05-16|1998-05-27|1998-06-04|DELIVER IN PERSON|REG AIR| pinto beans. regular account +30242|1498|38|2|14|19592.86|0.03|0.06|N|O|1998-06-15|1998-07-08|1998-06-16|DELIVER IN PERSON|RAIL| platelets affix blithely f +30243|57|83|1|11|10527.55|0.04|0.02|A|F|1993-05-22|1993-08-03|1993-06-03|NONE|SHIP|y daringly final dependen +30243|1146|55|2|26|27225.64|0.03|0.06|R|F|1993-05-19|1993-06-11|1993-05-23|COLLECT COD|REG AIR|ve the furiously express pi +30243|1907|40|3|4|7235.60|0.06|0.04|R|F|1993-08-22|1993-06-20|1993-09-05|TAKE BACK RETURN|MAIL|sts nag against the pending, express de +30243|116|43|4|9|9144.99|0.08|0.04|R|F|1993-07-12|1993-06-28|1993-07-30|NONE|REG AIR|ideas. slyly regular pl +30243|855|89|5|22|38628.70|0.03|0.08|A|F|1993-06-09|1993-07-24|1993-07-05|NONE|TRUCK|gular notornis slee +30243|529|90|6|47|67187.44|0.04|0.07|A|F|1993-05-08|1993-06-08|1993-05-22|DELIVER IN PERSON|TRUCK| wake blithe +30243|1849|50|7|16|28013.44|0.01|0.04|A|F|1993-06-05|1993-07-28|1993-06-08|NONE|MAIL|ronic pinto beans haggle requests. fin +30244|834|34|1|4|6939.32|0.09|0.05|N|O|1996-09-09|1996-10-09|1996-09-21|NONE|FOB|ggle. quickly bold asymptotes sleep +30244|866|66|2|21|37104.06|0.07|0.08|N|O|1996-10-10|1996-10-20|1996-10-16|TAKE BACK RETURN|AIR|atelets. furious +30244|1365|42|3|31|39257.16|0.10|0.08|N|O|1996-08-19|1996-09-03|1996-09-03|NONE|REG AIR|ironic platel +30244|1830|31|4|2|3463.66|0.08|0.03|N|O|1996-09-04|1996-10-18|1996-09-30|TAKE BACK RETURN|SHIP| theodolites. quickly silent +30245|71|97|1|46|44669.22|0.09|0.06|N|O|1997-12-31|1998-01-29|1998-01-02|DELIVER IN PERSON|TRUCK|oost. carefully final foxes h +30245|451|10|2|34|45949.30|0.04|0.05|N|O|1998-03-27|1998-01-16|1998-04-01|NONE|SHIP|deposits hang carefully regular p +30245|583|14|3|36|53408.88|0.04|0.04|N|O|1998-02-20|1998-02-16|1998-02-23|TAKE BACK RETURN|RAIL|usly regular theodolites. +30246|1661|62|1|32|50005.12|0.10|0.08|N|O|1996-12-06|1996-11-30|1996-12-10|COLLECT COD|MAIL|s behind the quickly ironic packages bo +30246|1261|36|2|48|55788.48|0.02|0.02|N|O|1997-02-15|1996-12-05|1997-02-20|TAKE BACK RETURN|RAIL|riously ironic dependencies wak +30247|449|50|1|32|43182.08|0.08|0.00|N|O|1998-08-06|1998-06-17|1998-09-04|NONE|RAIL|cross the fluffily unusual requests are +30247|1985|74|2|21|39626.58|0.08|0.04|N|O|1998-05-16|1998-06-18|1998-06-09|COLLECT COD|RAIL| cajole blithely. express, +30247|772|5|3|13|21746.01|0.03|0.07|N|O|1998-07-17|1998-07-12|1998-08-10|DELIVER IN PERSON|SHIP|ent packages. never bold dependencies +30247|180|81|4|35|37806.30|0.04|0.07|N|O|1998-08-21|1998-07-01|1998-09-20|COLLECT COD|RAIL| blithely even accounts about t +30247|1247|48|5|26|29854.24|0.04|0.06|N|O|1998-05-25|1998-06-23|1998-05-30|TAKE BACK RETURN|MAIL|wake slyly un +30272|1724|25|1|31|50397.32|0.08|0.06|N|O|1996-10-07|1996-08-08|1996-10-15|NONE|RAIL|haggle carefully. inst +30272|400|1|2|2|2600.80|0.02|0.08|N|O|1996-10-22|1996-08-22|1996-11-13|NONE|MAIL|silent dependencies +30273|931|34|1|2|3663.86|0.05|0.03|N|O|1997-03-29|1997-04-19|1997-04-24|DELIVER IN PERSON|RAIL|ely even theodolites among the +30273|1271|83|2|11|12894.97|0.09|0.01|N|O|1997-02-15|1997-02-20|1997-02-16|COLLECT COD|TRUCK|s. sly deposits according to th +30273|1364|79|3|16|20245.76|0.00|0.02|N|O|1997-05-03|1997-04-16|1997-05-19|TAKE BACK RETURN|MAIL|the enticing pinto beans mainta +30273|957|92|4|44|81749.80|0.09|0.02|N|O|1997-04-17|1997-02-20|1997-04-19|DELIVER IN PERSON|REG AIR| will doubt carefully ironic requ +30273|678|10|5|46|72618.82|0.10|0.04|N|O|1997-02-07|1997-04-12|1997-03-07|TAKE BACK RETURN|AIR|re across the unusual courts. f +30274|69|95|1|26|25195.56|0.07|0.08|N|O|1998-01-02|1997-12-14|1998-01-22|TAKE BACK RETURN|MAIL|unts are quickly; slyly +30274|1340|55|2|45|55860.30|0.01|0.02|N|O|1997-11-11|1997-12-22|1997-12-05|DELIVER IN PERSON|MAIL|careful dinos integrate quickly +30274|1758|43|3|16|26556.00|0.05|0.06|N|O|1998-01-03|1997-12-30|1998-01-09|DELIVER IN PERSON|MAIL|onic deposits are carefully alongside o +30274|1640|82|4|30|46249.20|0.01|0.02|N|O|1997-12-19|1997-11-12|1997-12-27|NONE|REG AIR|oze blithely slyly pending excuses. +30274|314|43|5|24|29143.44|0.06|0.02|N|O|1997-12-17|1997-12-05|1998-01-08|COLLECT COD|REG AIR|hless, bold courts-- quickly ironic reques +30275|1004|5|1|11|9955.00|0.06|0.00|N|O|1997-11-10|1997-12-17|1997-12-10|DELIVER IN PERSON|FOB|. even reque +30275|1110|47|2|6|6066.66|0.03|0.04|N|O|1998-01-07|1997-12-18|1998-01-14|DELIVER IN PERSON|SHIP|counts about the blithely ironic accounts +30275|1612|36|3|7|10595.27|0.10|0.02|N|O|1998-01-14|1997-12-07|1998-01-16|TAKE BACK RETURN|REG AIR| bold sentiments above the carefully fin +30275|180|81|4|16|17282.88|0.08|0.08|N|O|1997-11-06|1998-01-01|1997-12-05|TAKE BACK RETURN|REG AIR| theodolites sleep +30275|271|99|5|13|15226.51|0.10|0.08|N|O|1997-11-24|1997-12-26|1997-12-23|COLLECT COD|TRUCK|longside of the even, ironic t +30275|1747|32|6|4|6594.96|0.09|0.00|N|O|1998-02-02|1997-12-24|1998-03-04|NONE|MAIL|ckages alongside of the ideas a +30275|901|36|7|9|16217.10|0.06|0.03|N|O|1998-02-08|1997-12-22|1998-02-20|NONE|AIR|ndencies wake. quickly +30276|1076|12|1|22|21495.54|0.10|0.04|N|O|1995-11-10|1995-11-04|1995-11-17|NONE|RAIL|m the blithel +30276|1884|85|2|3|5357.64|0.04|0.00|N|O|1995-10-24|1995-10-17|1995-10-27|NONE|RAIL|furiously even accounts. fluffily e +30276|1161|98|3|35|37175.60|0.08|0.05|N|O|1995-11-07|1995-10-27|1995-11-13|COLLECT COD|RAIL|ructions. unusual, even depo +30276|1391|68|4|39|50403.21|0.08|0.04|N|O|1995-11-03|1995-09-30|1995-11-30|DELIVER IN PERSON|MAIL|rding to the theodoli +30276|518|49|5|39|55321.89|0.01|0.04|N|O|1995-11-13|1995-10-20|1995-12-08|COLLECT COD|RAIL|s around the fluff +30277|476|35|1|5|6882.35|0.00|0.06|N|O|1998-01-19|1998-03-01|1998-01-26|TAKE BACK RETURN|TRUCK|ing to the accounts. furiously +30277|1954|43|2|11|20415.45|0.08|0.05|N|O|1998-04-23|1998-03-03|1998-05-07|TAKE BACK RETURN|TRUCK|s platelets wake carefully blithely re +30277|1714|57|3|49|79169.79|0.03|0.03|N|O|1998-02-10|1998-03-20|1998-02-21|TAKE BACK RETURN|SHIP|e furiously. even, unusual deposits haggle. +30277|555|86|4|20|29111.00|0.04|0.01|N|O|1998-01-19|1998-03-27|1998-01-29|NONE|RAIL| regular pinto beans. slyly unusu +30277|1164|65|5|17|18107.72|0.02|0.02|N|O|1998-03-10|1998-02-19|1998-03-13|NONE|RAIL|press courts affix even package +30278|1543|64|1|12|17334.48|0.07|0.01|A|F|1994-11-28|1994-12-02|1994-12-11|COLLECT COD|REG AIR|y fluffy foxes boost amon +30278|2|3|2|11|9922.00|0.04|0.00|A|F|1994-11-24|1994-12-09|1994-12-07|TAKE BACK RETURN|MAIL|e furiously ironi +30278|941|42|3|4|7367.76|0.01|0.08|R|F|1994-10-11|1994-12-02|1994-10-25|DELIVER IN PERSON|FOB|al instructions. slyly ironic accounts de +30278|1365|42|4|1|1266.36|0.09|0.06|A|F|1995-01-13|1994-12-18|1995-02-03|COLLECT COD|FOB|arefully final packages ca +30279|1736|37|1|28|45856.44|0.00|0.08|N|O|1996-03-02|1996-01-23|1996-03-08|COLLECT COD|AIR|c deposits. sly +30279|326|83|2|32|39242.24|0.10|0.08|N|O|1995-12-20|1996-02-19|1996-01-10|COLLECT COD|SHIP|. carefully special decoys breach furi +30279|1332|47|3|19|23433.27|0.01|0.05|N|O|1996-02-17|1996-02-19|1996-02-21|TAKE BACK RETURN|SHIP|pecial theodolites. ironic a +30279|988|23|4|12|22667.76|0.10|0.05|N|O|1996-04-04|1996-02-13|1996-04-06|TAKE BACK RETURN|AIR| ironic packages. ironic, pending accounts +30279|897|64|5|48|86298.72|0.03|0.03|N|O|1996-04-04|1996-02-23|1996-04-12|TAKE BACK RETURN|TRUCK| the furiously sly plat +30279|1935|80|6|18|33064.74|0.04|0.03|N|O|1996-04-03|1996-03-07|1996-04-17|COLLECT COD|SHIP|nusual packages +30279|1843|44|7|3|5234.52|0.01|0.03|N|O|1996-01-03|1996-02-22|1996-01-07|TAKE BACK RETURN|REG AIR|g dependencies against the i +30304|1974|63|1|31|58155.07|0.00|0.06|N|O|1995-08-25|1995-09-11|1995-09-11|DELIVER IN PERSON|REG AIR| slyly reg +30304|392|21|2|8|10339.12|0.02|0.03|N|O|1995-07-03|1995-08-16|1995-07-27|DELIVER IN PERSON|REG AIR|ular dolphins. furiously fluffy ex +30304|1338|53|3|9|11153.97|0.01|0.02|N|O|1995-06-30|1995-08-02|1995-07-05|DELIVER IN PERSON|MAIL|ly busily final foxes. ironic pl +30304|1131|32|4|11|11353.43|0.05|0.00|N|O|1995-08-24|1995-08-10|1995-08-27|DELIVER IN PERSON|RAIL|e slyly stealthy foxes. blithely e +30304|1004|10|5|11|9955.00|0.07|0.04|N|O|1995-07-11|1995-09-13|1995-07-20|TAKE BACK RETURN|FOB|foxes sleep quickly. carefully even +30304|1687|29|6|14|22241.52|0.09|0.04|N|O|1995-09-20|1995-08-12|1995-10-02|NONE|FOB|slyly special somas. even, s +30305|1089|90|1|42|41583.36|0.04|0.04|A|F|1992-04-21|1992-05-24|1992-05-09|NONE|FOB| deposits nag slyly u +30305|1876|63|2|31|55113.97|0.01|0.04|R|F|1992-07-27|1992-07-11|1992-08-16|COLLECT COD|RAIL|equests? carefully unusual ideas dete +30305|1615|57|3|27|40948.47|0.10|0.00|R|F|1992-07-01|1992-05-19|1992-07-15|COLLECT COD|FOB|s by the sp +30306|1046|82|1|35|33146.40|0.10|0.03|N|O|1995-08-15|1995-09-03|1995-08-17|TAKE BACK RETURN|AIR|blithely even ideas sublat +30307|407|66|1|5|6537.00|0.06|0.01|A|F|1992-07-20|1992-06-23|1992-08-07|NONE|REG AIR| theodolites! final, regular ideas +30307|365|94|2|32|40491.52|0.08|0.04|A|F|1992-07-08|1992-07-28|1992-07-16|DELIVER IN PERSON|REG AIR|nto beans above the furiously regular accou +30307|757|58|3|23|38128.25|0.09|0.08|R|F|1992-07-11|1992-07-02|1992-08-02|DELIVER IN PERSON|RAIL|en warhorses. carefully express theod +30307|1203|78|4|10|11042.00|0.04|0.07|A|F|1992-06-16|1992-07-28|1992-06-26|NONE|AIR|even requests. blithely express depos +30307|1194|31|5|7|7666.33|0.05|0.01|R|F|1992-06-04|1992-06-30|1992-06-17|TAKE BACK RETURN|TRUCK|s. sly, silent accounts sleep after +30308|865|32|1|24|42380.64|0.06|0.06|A|F|1993-05-09|1993-04-24|1993-05-11|DELIVER IN PERSON|AIR|ccounts engage furio +30308|1277|89|2|10|11782.70|0.01|0.06|R|F|1993-05-21|1993-04-28|1993-06-09|TAKE BACK RETURN|RAIL|foxes. fluffily regular gifts wak +30308|337|38|3|8|9898.64|0.04|0.04|A|F|1993-03-28|1993-05-17|1993-04-21|NONE|REG AIR|ss the furiously express +30309|52|53|1|41|39034.05|0.03|0.05|N|O|1996-12-12|1996-11-11|1996-12-19|NONE|SHIP| snooze. fl +30310|1962|63|1|28|52190.88|0.04|0.03|R|F|1992-07-31|1992-06-30|1992-08-29|COLLECT COD|AIR|ronic asymptotes sleep slyly +30310|1832|33|2|11|19072.13|0.00|0.02|R|F|1992-05-19|1992-06-13|1992-06-04|TAKE BACK RETURN|SHIP|deas use. s +30310|1161|34|3|36|38237.76|0.01|0.03|A|F|1992-06-15|1992-06-17|1992-07-02|COLLECT COD|RAIL|d requests after the slyly pe +30310|926|29|4|6|10961.52|0.05|0.02|A|F|1992-05-31|1992-07-11|1992-06-29|TAKE BACK RETURN|AIR|efully. requests affix alongside of the sil +30311|1037|8|1|6|5628.18|0.10|0.04|R|F|1992-11-21|1992-10-17|1992-12-13|TAKE BACK RETURN|TRUCK|deas haggle +30311|1340|17|2|15|18620.10|0.03|0.03|R|F|1992-09-30|1992-10-01|1992-10-10|TAKE BACK RETURN|RAIL|y furiously silent exc +30311|1170|7|3|14|14996.38|0.10|0.08|R|F|1992-09-20|1992-11-04|1992-09-29|NONE|AIR|structions. ca +30311|633|27|4|19|29138.97|0.09|0.04|A|F|1992-08-30|1992-09-25|1992-09-11|DELIVER IN PERSON|AIR|ual deposits. quickly unusu +30311|1599|80|5|32|48018.88|0.06|0.00|R|F|1992-10-03|1992-09-07|1992-10-12|TAKE BACK RETURN|SHIP|furiously special theodolites. specia +30311|443|73|6|39|52394.16|0.03|0.04|R|F|1992-10-02|1992-10-07|1992-10-14|NONE|MAIL|wake carefully at the furious +30336|1172|45|1|46|49365.82|0.01|0.07|R|F|1993-03-25|1993-04-12|1993-03-31|TAKE BACK RETURN|TRUCK|lphins grow fluffily ironic accoun +30336|998|33|2|37|70262.63|0.02|0.06|R|F|1993-03-03|1993-04-27|1993-03-18|TAKE BACK RETURN|RAIL|d the ironic platelets. caref +30336|1288|26|3|17|20217.76|0.02|0.07|R|F|1993-04-09|1993-03-29|1993-04-16|NONE|RAIL| pinto bea +30336|1637|79|4|17|26156.71|0.06|0.07|A|F|1993-03-29|1993-04-05|1993-04-23|DELIVER IN PERSON|FOB| furiously bold excuses sleep carefu +30337|80|56|1|44|43123.52|0.00|0.02|N|O|1997-06-04|1997-07-24|1997-06-19|NONE|RAIL| deposits hang above the ironic, regular i +30337|1764|7|2|27|44975.52|0.09|0.03|N|O|1997-09-02|1997-08-09|1997-09-30|NONE|AIR|ongside of the slyly quick platelet +30337|1830|60|3|6|10390.98|0.02|0.02|N|O|1997-07-25|1997-07-02|1997-08-24|NONE|SHIP|the furiously regular pinto beans +30337|1316|17|4|6|7303.86|0.00|0.06|N|O|1997-06-01|1997-07-19|1997-06-02|TAKE BACK RETURN|TRUCK|ses doze final ideas. expres +30338|1350|27|1|36|45048.60|0.03|0.02|N|O|1998-04-02|1998-03-08|1998-04-17|COLLECT COD|AIR|lyly even requests. blithely even request +30338|1494|34|2|4|5581.96|0.01|0.08|N|O|1998-02-02|1998-02-13|1998-02-03|NONE|REG AIR|uriously final orbits. carefully pendi +30339|857|24|1|50|87892.50|0.01|0.00|A|F|1993-07-04|1993-07-01|1993-07-24|NONE|RAIL| express, regular pinto beans c +30339|388|89|2|26|33497.88|0.03|0.06|A|F|1993-08-22|1993-06-29|1993-09-11|DELIVER IN PERSON|MAIL|. carefully express packa +30339|879|79|3|27|48056.49|0.04|0.08|A|F|1993-07-16|1993-06-08|1993-08-04|COLLECT COD|RAIL| requests. furiously express depths nag fur +30339|675|7|4|42|66178.14|0.08|0.02|R|F|1993-06-07|1993-06-25|1993-06-16|DELIVER IN PERSON|AIR|e the ironic pinto beans. furiously r +30340|1199|8|1|20|22003.80|0.03|0.00|A|F|1994-12-11|1995-01-23|1994-12-12|COLLECT COD|RAIL|special account +30340|491|92|2|41|57051.09|0.09|0.04|A|F|1995-01-08|1994-12-24|1995-02-04|TAKE BACK RETURN|MAIL|eans. specia +30340|1043|44|3|49|46257.96|0.06|0.02|A|F|1995-02-05|1995-01-29|1995-02-13|COLLECT COD|MAIL|ainments boost quickly above the pendin +30340|1376|53|4|50|63868.50|0.01|0.04|R|F|1995-01-16|1994-12-20|1995-01-30|COLLECT COD|AIR|arefully pending deposits engage along the +30340|1983|28|5|16|30159.68|0.00|0.00|A|F|1995-01-21|1995-01-10|1995-02-12|NONE|SHIP|s. furiously regula +30340|792|25|6|19|32163.01|0.08|0.00|A|F|1995-01-06|1995-01-21|1995-01-23|DELIVER IN PERSON|SHIP|rly. carefully regular +30340|1069|5|7|22|21341.32|0.01|0.01|R|F|1995-01-19|1994-12-11|1995-01-25|NONE|TRUCK|ependencies. quickly bo +30341|41|42|1|32|30113.28|0.00|0.00|R|F|1994-04-11|1994-04-13|1994-05-08|TAKE BACK RETURN|SHIP| even asym +30341|992|61|2|7|13250.93|0.07|0.02|R|F|1994-05-11|1994-03-14|1994-06-08|NONE|MAIL|lyly final fox +30341|1240|41|3|31|35378.44|0.03|0.04|A|F|1994-03-15|1994-04-29|1994-03-19|COLLECT COD|TRUCK|. pending requests along the slyly +30341|1492|71|4|15|20902.35|0.06|0.07|R|F|1994-03-24|1994-03-26|1994-04-21|NONE|AIR| cajole blithely against +30341|1871|58|5|15|26593.05|0.00|0.00|A|F|1994-02-18|1994-04-07|1994-03-13|DELIVER IN PERSON|SHIP|riously even ideas will wake slyly +30341|758|59|6|31|51421.25|0.02|0.00|R|F|1994-04-10|1994-03-07|1994-04-29|NONE|FOB|ffix slyly against the furiously spe +30341|620|83|7|20|30412.40|0.07|0.07|R|F|1994-03-24|1994-03-17|1994-04-03|COLLECT COD|REG AIR|. regular deposits affix. bold +30342|848|48|1|26|45469.84|0.08|0.07|N|O|1998-06-11|1998-05-11|1998-06-13|COLLECT COD|FOB|its. bold somas kindle slyly regul +30342|218|73|2|45|50319.45|0.00|0.05|N|O|1998-02-15|1998-04-20|1998-02-20|COLLECT COD|FOB|ckages are. ironic theodolites haggle care +30342|1476|55|3|16|22039.52|0.02|0.03|N|O|1998-02-20|1998-04-01|1998-02-22|NONE|MAIL|c patterns cajole slyly +30342|881|81|4|17|30291.96|0.09|0.04|N|O|1998-05-03|1998-04-06|1998-05-31|COLLECT COD|AIR|ts are quickly alongside of the blithely +30342|1240|15|5|47|53638.28|0.07|0.00|N|O|1998-05-11|1998-03-18|1998-05-19|TAKE BACK RETURN|AIR|platelets slee +30343|1849|79|1|27|47272.68|0.05|0.00|A|F|1992-07-31|1992-08-03|1992-08-10|NONE|REG AIR|up the final +30343|819|19|2|9|15478.29|0.03|0.01|R|F|1992-06-22|1992-07-10|1992-06-29|COLLECT COD|SHIP|ely ironic plat +30343|469|28|3|43|58886.78|0.10|0.06|A|F|1992-06-09|1992-06-30|1992-07-09|NONE|MAIL|even packag +30343|1450|90|4|13|17568.85|0.09|0.02|R|F|1992-09-04|1992-08-02|1992-09-12|NONE|REG AIR|ges ought to +30343|1658|41|5|22|34312.30|0.07|0.03|R|F|1992-06-16|1992-06-25|1992-06-27|COLLECT COD|MAIL|s wake slyly +30343|781|82|6|43|72316.54|0.04|0.04|A|F|1992-07-05|1992-07-13|1992-07-19|COLLECT COD|RAIL|st quickly ironic pla +30343|1714|99|7|7|11309.97|0.02|0.03|A|F|1992-06-30|1992-08-18|1992-07-07|TAKE BACK RETURN|TRUCK|egular theodo +30368|246|28|1|20|22924.80|0.03|0.01|N|O|1998-01-16|1998-01-24|1998-02-14|DELIVER IN PERSON|FOB|he final deposits +30369|982|17|1|24|45191.52|0.09|0.07|A|F|1995-03-31|1995-06-15|1995-04-28|COLLECT COD|MAIL|dencies. theodolites against th +30369|329|58|2|21|25815.72|0.01|0.03|N|F|1995-06-08|1995-06-09|1995-06-19|NONE|REG AIR|e slowly special packages. u +30369|1078|49|3|18|17623.26|0.10|0.03|R|F|1995-05-21|1995-06-23|1995-06-04|DELIVER IN PERSON|REG AIR|ly bold accounts. blithel +30369|1544|25|4|6|8673.24|0.07|0.02|A|F|1995-04-01|1995-06-20|1995-05-01|DELIVER IN PERSON|TRUCK|s. slyly final accounts alongside of +30369|129|8|5|21|21611.52|0.06|0.03|A|F|1995-04-04|1995-06-21|1995-04-29|COLLECT COD|MAIL|dencies integrate. +30369|753|50|6|34|56227.50|0.06|0.00|A|F|1995-04-17|1995-06-11|1995-05-14|NONE|FOB| regular account +30369|1062|98|7|22|21187.32|0.09|0.06|N|F|1995-06-09|1995-06-10|1995-06-24|COLLECT COD|MAIL| slyly regular platelets. slowly ironic +30370|218|19|1|29|32428.09|0.00|0.06|R|F|1993-04-15|1993-05-18|1993-05-04|NONE|TRUCK|es wake blithely at the furiou +30370|425|84|2|25|33135.50|0.09|0.01|R|F|1993-04-29|1993-05-22|1993-05-18|DELIVER IN PERSON|REG AIR|ironic instructions. quickly ironic deposi +30371|283|84|1|9|10649.52|0.06|0.04|N|O|1997-04-24|1997-02-10|1997-05-12|COLLECT COD|AIR|e boldly pending instructions. furi +30371|797|30|2|12|20373.48|0.10|0.07|N|O|1997-02-10|1997-03-14|1997-03-10|TAKE BACK RETURN|FOB|osits-- furiously pending +30371|1588|69|3|44|65541.52|0.03|0.02|N|O|1997-04-30|1997-02-05|1997-05-04|DELIVER IN PERSON|RAIL|ess deposits eat carefully. final accounts +30371|1186|87|4|4|4348.72|0.07|0.02|N|O|1997-01-23|1997-03-22|1997-02-18|COLLECT COD|RAIL|le carefully ironic, regu +30372|354|55|1|19|23832.65|0.08|0.02|R|F|1993-10-15|1993-10-02|1993-10-31|NONE|SHIP|the carefully sp +30372|1072|78|2|17|16542.19|0.04|0.03|A|F|1993-12-01|1993-11-12|1993-12-10|TAKE BACK RETURN|MAIL| blithely silent requests cajole c +30372|1828|72|3|14|24217.48|0.00|0.00|R|F|1993-09-11|1993-11-02|1993-10-02|NONE|FOB|quests sleep furiously along the +30372|1953|54|4|45|83472.75|0.01|0.08|A|F|1993-12-14|1993-11-08|1994-01-06|TAKE BACK RETURN|RAIL|unusual theodolites +30372|1610|34|5|50|75580.50|0.08|0.04|R|F|1993-10-18|1993-10-12|1993-11-12|TAKE BACK RETURN|AIR|ithe pinto beans. blithely special +30373|1867|68|1|33|58372.38|0.02|0.03|N|O|1996-12-13|1997-01-04|1997-01-05|TAKE BACK RETURN|FOB|es-- ironic packages x-ra +30373|1366|81|2|3|3802.08|0.08|0.02|N|O|1997-01-25|1996-11-17|1997-02-24|TAKE BACK RETURN|SHIP|t quickly according to the furiousl +30373|1604|46|3|36|54201.60|0.06|0.01|N|O|1996-12-10|1997-01-09|1996-12-12|DELIVER IN PERSON|TRUCK|r pains around the +30373|1236|37|4|10|11372.30|0.08|0.01|N|O|1996-11-15|1996-12-12|1996-12-12|TAKE BACK RETURN|AIR| final, final accounts use slyly express re +30373|590|81|5|49|73038.91|0.05|0.01|N|O|1996-10-24|1996-12-12|1996-11-21|COLLECT COD|FOB|ackages. requests sleep fluffil +30373|737|34|6|5|8188.65|0.00|0.06|N|O|1996-11-17|1996-11-21|1996-11-30|TAKE BACK RETURN|RAIL| blithely after the slyly regular dependen +30373|513|74|7|27|38164.77|0.10|0.08|N|O|1996-12-16|1996-11-21|1997-01-07|DELIVER IN PERSON|FOB|e across the carefully ex +30374|483|84|1|1|1383.48|0.09|0.08|R|F|1993-04-08|1993-05-10|1993-04-27|TAKE BACK RETURN|AIR| excuses. silent +30374|151|4|2|38|39943.70|0.05|0.00|R|F|1993-07-05|1993-06-10|1993-07-25|TAKE BACK RETURN|AIR|beans are even +30374|963|98|3|6|11183.76|0.08|0.02|R|F|1993-05-04|1993-04-27|1993-05-30|COLLECT COD|MAIL| hockey players are slyly even dependen +30374|1986|87|4|14|26431.72|0.07|0.00|R|F|1993-05-18|1993-06-07|1993-05-19|COLLECT COD|TRUCK|express foxes haggle carefully. slyly unus +30374|395|96|5|25|32384.75|0.01|0.07|A|F|1993-07-06|1993-06-20|1993-07-23|TAKE BACK RETURN|AIR| quickly final packages. slyl +30374|1494|34|6|15|20932.35|0.06|0.05|R|F|1993-04-03|1993-04-29|1993-04-15|DELIVER IN PERSON|REG AIR|epths boost acros +30374|232|87|7|17|19247.91|0.06|0.06|R|F|1993-03-31|1993-06-07|1993-04-22|TAKE BACK RETURN|FOB|. furiously blithe accounts d +30375|1531|32|1|46|65896.38|0.04|0.07|R|F|1992-07-28|1992-07-22|1992-08-02|NONE|SHIP|ly even deposits nag above the final d +30375|1126|27|2|44|45193.28|0.08|0.03|A|F|1992-05-22|1992-07-19|1992-05-31|COLLECT COD|SHIP|inal deposits would play blithely. slyly +30375|38|89|3|36|33769.08|0.03|0.05|A|F|1992-06-01|1992-07-05|1992-06-29|TAKE BACK RETURN|RAIL|the pending accounts. slyly regula +30400|1000|3|1|44|39644.00|0.01|0.04|N|O|1997-02-24|1997-04-12|1997-03-07|TAKE BACK RETURN|FOB|e slyly. express, regu +30400|1713|98|2|3|4844.13|0.01|0.04|N|O|1997-06-02|1997-05-11|1997-06-23|NONE|REG AIR|ove the slowly special account +30400|773|74|3|14|23432.78|0.05|0.01|N|O|1997-04-23|1997-03-23|1997-05-18|DELIVER IN PERSON|RAIL|onic instructions use slyly above +30400|1905|38|4|19|34331.10|0.10|0.01|N|O|1997-03-10|1997-03-21|1997-04-06|TAKE BACK RETURN|RAIL|ly unusual +30400|58|34|5|45|43112.25|0.02|0.04|N|O|1997-05-03|1997-04-06|1997-05-29|COLLECT COD|REG AIR|sly blithe deposits. final deposits affix +30400|582|13|6|17|25203.86|0.06|0.01|N|O|1997-03-12|1997-03-30|1997-03-22|COLLECT COD|AIR|its. idle packages bo +30401|830|97|1|15|25962.45|0.04|0.07|A|F|1993-02-08|1992-11-20|1993-03-06|DELIVER IN PERSON|MAIL|t accounts. furiously even p +30402|491|21|1|42|58442.58|0.07|0.00|A|F|1994-07-03|1994-08-29|1994-07-05|DELIVER IN PERSON|TRUCK|epths haggle furiously even dependencies. +30402|680|12|2|47|74291.96|0.02|0.07|R|F|1994-09-14|1994-07-20|1994-09-29|COLLECT COD|FOB|is are slyly amon +30402|1433|12|3|40|53377.20|0.08|0.00|A|F|1994-09-17|1994-08-15|1994-10-16|TAKE BACK RETURN|SHIP|ely. ideas detect slyly! bold dinos a +30402|292|93|4|28|33384.12|0.06|0.03|R|F|1994-06-26|1994-08-31|1994-07-08|DELIVER IN PERSON|FOB| requests +30403|693|87|1|49|78090.81|0.02|0.05|A|F|1992-08-16|1992-09-11|1992-09-11|TAKE BACK RETURN|SHIP|arefully ironic foxes. +30403|770|71|2|38|63489.26|0.06|0.02|R|F|1992-08-03|1992-08-29|1992-08-19|COLLECT COD|AIR|e blithely pending requests. slyly +30403|700|1|3|20|32014.00|0.06|0.06|A|F|1992-10-15|1992-08-29|1992-10-28|COLLECT COD|RAIL|rate along the pinto beans. unusual fox +30403|1432|11|4|8|10667.44|0.03|0.04|R|F|1992-07-15|1992-09-25|1992-07-21|TAKE BACK RETURN|REG AIR|y quiet requests da +30404|1244|82|1|29|33211.96|0.10|0.05|A|F|1994-03-17|1994-04-02|1994-04-12|TAKE BACK RETURN|REG AIR|ses boost thinly requests +30405|1978|11|1|7|13159.79|0.10|0.07|A|F|1992-04-30|1992-06-29|1992-05-12|DELIVER IN PERSON|TRUCK|ress forges. unusual theodolites pro +30406|1144|17|1|9|9406.26|0.09|0.04|A|F|1994-08-11|1994-09-05|1994-09-03|TAKE BACK RETURN|AIR|cross the furiously special requests. furi +30406|272|73|2|39|45718.53|0.04|0.05|R|F|1994-08-11|1994-08-08|1994-08-23|NONE|RAIL|blithely even accounts boost +30406|1495|96|3|10|13964.90|0.07|0.01|A|F|1994-10-06|1994-08-20|1994-11-05|NONE|AIR|l courts after the quickly reg +30406|1343|20|4|40|49773.60|0.01|0.07|A|F|1994-08-16|1994-08-23|1994-08-21|DELIVER IN PERSON|MAIL|latelets past the +30406|195|48|5|19|20808.61|0.10|0.00|R|F|1994-09-01|1994-08-30|1994-09-17|DELIVER IN PERSON|TRUCK|ornis. quietly express packag +30406|1017|88|6|1|918.01|0.07|0.02|A|F|1994-08-20|1994-08-31|1994-09-15|DELIVER IN PERSON|MAIL|olites among the even ideas s +30407|569|30|1|6|8817.36|0.00|0.05|A|F|1994-08-01|1994-06-20|1994-08-24|DELIVER IN PERSON|MAIL|s. fluffily regular requests are care +30407|448|36|2|43|57982.92|0.02|0.08|A|F|1994-05-08|1994-06-24|1994-05-14|NONE|AIR|y express deposits are +30407|287|69|3|35|41554.80|0.05|0.03|A|F|1994-07-11|1994-05-18|1994-07-30|DELIVER IN PERSON|TRUCK|ideas maintain quickly even accou +30407|1367|68|4|36|45660.96|0.03|0.07|R|F|1994-08-13|1994-05-28|1994-09-12|DELIVER IN PERSON|REG AIR|e furiously. furious +30432|319|20|1|35|42675.85|0.08|0.07|R|F|1994-03-23|1994-05-13|1994-03-26|NONE|SHIP|ses. quickly even foxes cajole among t +30432|1718|3|2|21|34013.91|0.02|0.04|A|F|1994-04-03|1994-04-05|1994-04-12|NONE|RAIL|iously. express, even pinto beans haggle +30432|1428|46|3|23|30576.66|0.00|0.01|R|F|1994-03-22|1994-05-24|1994-03-31|NONE|REG AIR|y about the silent, b +30432|1060|31|4|39|37481.34|0.04|0.03|R|F|1994-03-12|1994-03-30|1994-04-04|COLLECT COD|SHIP|ar deposits integrate. final, ironic +30433|385|42|1|37|47559.06|0.02|0.01|A|F|1993-07-31|1993-09-07|1993-08-19|COLLECT COD|TRUCK| haggle alongside +30433|1349|50|2|27|33759.18|0.08|0.04|A|F|1993-07-07|1993-07-22|1993-07-24|DELIVER IN PERSON|SHIP|ular accounts are carefully ironic requests +30433|78|29|3|45|44013.15|0.03|0.00|R|F|1993-09-21|1993-08-07|1993-10-09|COLLECT COD|REG AIR|luffy, regular +30433|1056|57|4|37|35410.85|0.04|0.06|R|F|1993-06-12|1993-08-03|1993-06-14|NONE|AIR|s are blithely. blithely eve +30434|213|41|1|37|41188.77|0.07|0.08|N|O|1996-12-02|1996-12-12|1996-12-22|COLLECT COD|FOB|ithely after the fina +30434|1096|32|2|24|23930.16|0.07|0.05|N|O|1996-12-31|1997-01-03|1997-01-10|TAKE BACK RETURN|AIR|ctions. stealthily f +30435|1985|74|1|26|49061.48|0.09|0.02|N|O|1998-06-21|1998-07-29|1998-07-08|DELIVER IN PERSON|FOB|iously regular foxes use +30435|750|83|2|50|82537.50|0.07|0.07|N|O|1998-08-12|1998-08-15|1998-08-16|NONE|MAIL|en requests about the regular, exp +30436|43|94|1|6|5658.24|0.05|0.08|A|F|1992-08-10|1992-09-21|1992-09-01|COLLECT COD|TRUCK|he even packag +30436|498|86|2|34|47548.66|0.06|0.03|A|F|1992-09-15|1992-08-22|1992-10-02|NONE|TRUCK|osits alongside of the carefully r +30436|1313|52|3|17|20643.27|0.06|0.04|R|F|1992-08-31|1992-09-15|1992-09-27|COLLECT COD|SHIP|ate slyly? final, even pinto beans ha +30436|170|97|4|37|39596.29|0.00|0.08|A|F|1992-08-08|1992-08-28|1992-08-26|TAKE BACK RETURN|SHIP|ully along the special, pending deposits. +30436|1147|56|5|33|34588.62|0.02|0.06|R|F|1992-09-12|1992-08-08|1992-09-27|DELIVER IN PERSON|FOB|re blithely. pending accounts use fl +30437|688|82|1|36|57192.48|0.10|0.08|N|O|1996-10-20|1996-10-07|1996-11-16|DELIVER IN PERSON|REG AIR|inal, bold forg +30437|184|37|2|4|4336.72|0.02|0.02|N|O|1996-11-21|1996-09-24|1996-12-14|NONE|TRUCK|es snooze quickly. furiously regular +30437|311|96|3|13|15747.03|0.08|0.01|N|O|1996-11-07|1996-09-21|1996-11-19|COLLECT COD|REG AIR|decoys after the fluffily i +30437|1812|13|4|23|39417.63|0.01|0.07|N|O|1996-11-06|1996-09-17|1996-11-12|COLLECT COD|MAIL|ts. quickly regular deposits boost carefull +30438|1942|43|1|37|68225.78|0.06|0.05|N|O|1997-07-22|1997-07-09|1997-08-03|COLLECT COD|FOB| furiously unusual ideas dazzle +30439|27|78|1|32|29664.64|0.04|0.07|N|F|1995-06-15|1995-06-18|1995-06-28|COLLECT COD|TRUCK|, unusual re +30464|1033|4|1|23|21482.69|0.03|0.03|N|O|1997-10-30|1997-10-26|1997-11-28|NONE|SHIP|regular depe +30464|1241|42|2|16|18275.84|0.06|0.00|N|O|1997-10-14|1997-11-09|1997-10-29|TAKE BACK RETURN|AIR|ly blithel +30464|811|11|3|28|47930.68|0.09|0.05|N|O|1997-09-22|1997-10-10|1997-10-22|TAKE BACK RETURN|AIR|longside of the fur +30464|207|8|4|37|40966.40|0.04|0.08|N|O|1997-11-13|1997-11-13|1997-11-17|DELIVER IN PERSON|FOB|r packages dazzle blithel +30464|394|79|5|13|16827.07|0.06|0.02|N|O|1997-11-28|1997-10-26|1997-12-15|COLLECT COD|AIR| boost enticingly along th +30464|1910|99|6|26|47109.66|0.04|0.05|N|O|1997-11-11|1997-11-13|1997-11-24|DELIVER IN PERSON|MAIL|as impress quickly pending +30465|246|28|1|38|43557.12|0.01|0.07|R|F|1994-06-23|1994-06-06|1994-07-11|NONE|FOB|ove the bo +30466|1875|62|1|5|8884.35|0.09|0.01|N|O|1996-04-05|1996-03-15|1996-05-02|TAKE BACK RETURN|FOB| deposits sleep +30466|371|100|2|21|26698.77|0.07|0.03|N|O|1996-05-12|1996-03-03|1996-05-15|COLLECT COD|TRUCK|ges serve against the blithe +30466|1214|15|3|19|21188.99|0.06|0.02|N|O|1996-04-17|1996-03-07|1996-04-26|TAKE BACK RETURN|AIR|ly final pinto +30466|403|4|4|6|7820.40|0.10|0.08|N|O|1996-05-09|1996-04-05|1996-05-31|TAKE BACK RETURN|AIR|ully around the quickly pending +30466|1919|20|5|9|16388.19|0.00|0.00|N|O|1996-05-16|1996-04-25|1996-05-31|NONE|FOB|es doubt. platelets cajole afte +30466|628|22|6|17|25986.54|0.04|0.02|N|O|1996-02-12|1996-04-13|1996-02-24|TAKE BACK RETURN|SHIP|equests are. attainments wake slowly. ironi +30467|863|64|1|14|24694.04|0.09|0.02|A|F|1994-08-18|1994-11-12|1994-09-03|NONE|TRUCK|uriously ironi +30467|606|38|2|47|70810.20|0.01|0.04|R|F|1994-09-21|1994-10-29|1994-10-21|TAKE BACK RETURN|AIR|lyly bold theodolites use about +30468|835|36|1|15|26037.45|0.09|0.07|R|F|1993-06-14|1993-06-23|1993-07-01|TAKE BACK RETURN|MAIL|s regular platelets. furiously bold pack +30469|1797|82|1|14|23783.06|0.10|0.08|A|F|1993-02-02|1993-02-16|1993-02-16|DELIVER IN PERSON|TRUCK|ly pending instructions use carefully +30469|678|72|2|18|28416.06|0.01|0.02|R|F|1993-02-12|1993-02-14|1993-02-15|TAKE BACK RETURN|REG AIR|ess pinto +30469|1766|67|3|1|1667.76|0.03|0.04|A|F|1993-02-27|1993-03-03|1993-03-07|NONE|FOB| against the even deposits. regula +30469|75|51|4|14|13650.98|0.01|0.05|R|F|1993-02-08|1993-02-01|1993-03-03|DELIVER IN PERSON|TRUCK|ccounts are slyly special +30469|150|3|5|1|1050.15|0.09|0.00|A|F|1993-01-25|1993-02-04|1993-02-18|COLLECT COD|SHIP|ncies doubt s +30470|882|82|1|49|87361.12|0.05|0.00|R|F|1994-03-12|1994-01-31|1994-03-13|TAKE BACK RETURN|MAIL|inst the carefully regular warhorses +30470|1540|21|2|50|72077.00|0.07|0.08|R|F|1994-01-18|1994-03-03|1994-01-30|COLLECT COD|REG AIR|nusual dugouts use ca +30470|689|52|3|5|7948.40|0.02|0.04|R|F|1994-04-05|1994-03-16|1994-05-01|COLLECT COD|MAIL|ccounts. requests engage fluffil +30470|114|41|4|9|9126.99|0.01|0.04|R|F|1994-04-25|1994-03-11|1994-05-05|DELIVER IN PERSON|TRUCK|quickly express tithes across the care +30470|940|75|5|36|66273.84|0.01|0.02|R|F|1994-01-02|1994-02-03|1994-01-13|DELIVER IN PERSON|RAIL|telets wake across the excus +30470|72|73|6|32|31106.24|0.05|0.03|R|F|1994-01-04|1994-03-02|1994-01-30|COLLECT COD|TRUCK| regular multipliers serve quiet +30470|1808|52|7|9|15388.20|0.02|0.01|R|F|1994-04-19|1994-02-19|1994-05-14|COLLECT COD|AIR|to the pending deposits. blithel +30471|1378|79|1|22|28146.14|0.06|0.00|N|O|1998-07-22|1998-06-19|1998-08-10|COLLECT COD|AIR|he furiously ruthless instructions. ironic +30471|815|82|2|29|49758.49|0.10|0.08|N|O|1998-06-30|1998-07-12|1998-07-17|DELIVER IN PERSON|TRUCK|re carefully. careful +30471|615|16|3|10|15156.10|0.08|0.05|N|O|1998-06-10|1998-07-26|1998-06-25|DELIVER IN PERSON|FOB|nt accounts across the final requests wak +30471|1281|56|4|11|13005.08|0.00|0.07|N|O|1998-06-19|1998-08-10|1998-06-29|COLLECT COD|RAIL|ending requests across +30471|706|3|5|26|41774.20|0.05|0.05|N|O|1998-06-14|1998-07-21|1998-07-13|NONE|TRUCK|fix fluffily above the furiously even p +30496|395|96|1|40|51815.60|0.05|0.02|N|O|1998-10-25|1998-08-28|1998-11-05|COLLECT COD|AIR|sly ironic pinto b +30497|1801|2|1|38|64706.40|0.05|0.08|R|F|1995-04-23|1995-04-03|1995-05-13|NONE|TRUCK|es sleep fluffily. slyly +30497|1852|53|2|17|29815.45|0.06|0.06|R|F|1995-02-26|1995-03-28|1995-03-08|COLLECT COD|AIR|e pending a +30497|1914|47|3|41|74452.31|0.07|0.04|A|F|1995-04-04|1995-05-06|1995-04-18|COLLECT COD|TRUCK|fully pending requests are blith +30497|1128|65|4|3|3087.36|0.04|0.03|R|F|1995-03-25|1995-04-16|1995-04-14|DELIVER IN PERSON|RAIL|regular foxes against the fin +30497|976|79|5|42|78832.74|0.05|0.08|A|F|1995-04-05|1995-03-19|1995-04-08|DELIVER IN PERSON|TRUCK|ns doubt blithely final foxes. furiou +30498|1769|96|1|21|35085.96|0.01|0.08|N|O|1998-08-18|1998-07-04|1998-08-23|NONE|TRUCK|ly after the care +30499|805|72|1|24|40939.20|0.03|0.04|R|F|1993-01-28|1993-01-29|1993-02-01|DELIVER IN PERSON|REG AIR|e, even foxes. furiously express acco +30499|112|65|2|42|42508.62|0.10|0.03|A|F|1992-11-26|1993-01-01|1992-12-04|NONE|RAIL|ccounts ac +30499|325|54|3|6|7351.92|0.04|0.01|R|F|1992-11-04|1993-01-01|1992-11-12|DELIVER IN PERSON|AIR|telets. quickly ironic dependencies use. +30499|1741|68|4|41|67352.34|0.07|0.00|A|F|1992-12-28|1993-01-19|1993-01-01|COLLECT COD|MAIL|xcuses wake about the slyly ironic pin +30499|1775|18|5|26|43596.02|0.04|0.05|A|F|1993-02-07|1993-01-01|1993-02-11|DELIVER IN PERSON|FOB|ent deposits after th +30500|748|81|1|3|4946.22|0.03|0.01|N|O|1998-04-12|1998-06-19|1998-04-27|NONE|FOB|yly special instru +30500|761|26|2|12|19941.12|0.10|0.01|N|O|1998-04-08|1998-05-22|1998-04-14|NONE|MAIL| accounts. regular fox +30500|55|31|3|32|30561.60|0.01|0.06|N|O|1998-04-20|1998-06-20|1998-05-03|COLLECT COD|REG AIR|final accounts are quickly against the +30500|526|87|4|47|67046.44|0.03|0.06|N|O|1998-07-19|1998-05-14|1998-08-12|COLLECT COD|TRUCK|was carefully pending package +30500|451|10|5|24|32434.80|0.10|0.01|N|O|1998-07-12|1998-05-31|1998-07-30|DELIVER IN PERSON|SHIP|e quickly silent +30500|1624|25|6|47|71704.14|0.07|0.05|N|O|1998-05-02|1998-05-05|1998-06-01|TAKE BACK RETURN|REG AIR| alongside of the dogged dolphins wake even +30500|1599|100|7|5|7502.95|0.02|0.07|N|O|1998-04-13|1998-06-16|1998-04-29|DELIVER IN PERSON|FOB|riously about the accounts. i +30501|353|38|1|22|27573.70|0.07|0.01|N|O|1997-05-21|1997-05-29|1997-06-05|NONE|SHIP|he blithely even packages. +30502|105|32|1|26|26132.60|0.01|0.02|N|F|1995-06-05|1995-07-12|1995-06-26|NONE|MAIL|y quickly special pinto beans. iron +30503|475|63|1|10|13754.70|0.10|0.07|A|F|1994-06-10|1994-05-12|1994-06-29|COLLECT COD|TRUCK| carefully ironic pinto beans +30528|1312|13|1|44|53385.64|0.04|0.03|A|F|1993-10-08|1993-08-30|1993-10-11|COLLECT COD|FOB|final packages +30529|1146|55|1|39|40838.46|0.04|0.02|A|F|1994-09-04|1994-09-26|1994-09-21|TAKE BACK RETURN|AIR|taphs. accounts cajole upon the even in +30529|1117|54|2|10|10181.10|0.00|0.00|A|F|1994-08-22|1994-10-24|1994-09-05|COLLECT COD|TRUCK| fluffily. pinto beans wake. ac +30529|1430|48|3|35|46600.05|0.05|0.01|R|F|1994-09-29|1994-10-03|1994-10-11|DELIVER IN PERSON|REG AIR|ths solve furiously above +30529|1830|74|4|46|79664.18|0.07|0.05|R|F|1994-10-10|1994-10-01|1994-11-01|DELIVER IN PERSON|MAIL|inal deposits. s +30529|38|64|5|8|7504.24|0.04|0.06|R|F|1994-09-03|1994-10-21|1994-09-05|COLLECT COD|REG AIR| furiously final depen +30530|301|86|1|20|24026.00|0.07|0.08|N|O|1996-11-27|1996-10-16|1996-12-10|DELIVER IN PERSON|RAIL|blithe accounts nag fluffily +30531|1359|98|1|9|11343.15|0.00|0.03|N|O|1997-01-08|1997-01-22|1997-01-09|DELIVER IN PERSON|FOB|ly unusual asymptot +30531|27|3|2|30|27810.60|0.04|0.03|N|O|1997-03-24|1997-01-19|1997-03-30|NONE|SHIP|otes along the blithely regular deposits a +30531|1520|61|3|4|5686.08|0.01|0.05|N|O|1996-12-16|1996-12-31|1996-12-31|DELIVER IN PERSON|MAIL|he even pinto beans. carefully fi +30532|1528|29|1|19|27160.88|0.03|0.02|N|O|1996-03-18|1996-01-05|1996-03-31|TAKE BACK RETURN|FOB|telets wake furiously around the unu +30532|231|59|2|4|4524.92|0.01|0.07|N|O|1996-03-13|1996-02-11|1996-04-05|NONE|RAIL|sleep. ironic, special pinto beans dazzle +30532|1571|72|3|2|2945.14|0.08|0.01|N|O|1996-03-02|1996-02-21|1996-03-26|DELIVER IN PERSON|AIR|h slyly daring requests. stealthily +30532|1662|4|4|1|1563.66|0.05|0.02|N|O|1996-03-03|1996-02-03|1996-03-14|NONE|AIR|fully final theodolites use after the +30532|1322|99|5|7|8563.24|0.06|0.04|N|O|1995-12-26|1996-02-24|1996-01-10|COLLECT COD|SHIP|re blithely pending +30532|639|33|6|18|27713.34|0.08|0.07|N|O|1996-01-16|1996-01-01|1996-01-20|DELIVER IN PERSON|RAIL|uests haggle f +30532|1834|64|7|25|43395.75|0.08|0.08|N|O|1996-01-12|1996-01-09|1996-02-10|NONE|REG AIR|ar deposits cajole enticin +30533|1248|23|1|16|18387.84|0.04|0.01|R|F|1995-01-26|1994-11-27|1995-02-03|TAKE BACK RETURN|RAIL|ly. bravel +30533|1157|58|2|42|44442.30|0.02|0.02|R|F|1995-01-03|1994-11-17|1995-01-06|NONE|FOB|ons. furiously ironic instructio +30533|1954|87|3|27|50110.65|0.06|0.01|R|F|1995-01-15|1994-11-12|1995-02-07|DELIVER IN PERSON|REG AIR|lets alongside of the furiously final re +30533|1049|85|4|30|28501.20|0.09|0.06|A|F|1994-11-12|1994-12-08|1994-12-08|NONE|REG AIR|blithe, unusual deposits +30533|733|66|5|47|76785.31|0.00|0.03|A|F|1994-12-19|1994-11-09|1994-12-28|NONE|SHIP|daringly s +30533|761|58|6|25|41544.00|0.02|0.00|A|F|1995-01-03|1994-11-06|1995-01-30|COLLECT COD|TRUCK|telets. furiously blithe patterns h +30534|851|18|1|37|64818.45|0.04|0.03|A|F|1995-02-24|1995-03-26|1995-03-06|NONE|TRUCK|nusual, final packages sleep +30534|1470|71|2|15|20572.05|0.06|0.04|A|F|1995-06-04|1995-04-15|1995-06-13|COLLECT COD|REG AIR|ithely special accounts cajole about t +30535|1343|58|1|34|42307.56|0.08|0.04|N|O|1996-05-02|1996-03-20|1996-05-25|NONE|AIR|yly ironic package +30535|1116|17|2|27|27461.97|0.01|0.04|N|O|1996-05-05|1996-03-22|1996-06-04|DELIVER IN PERSON|RAIL|ely? daringly quiet deposits haggle +30535|1085|86|3|10|9860.80|0.00|0.05|N|O|1996-03-02|1996-04-12|1996-03-09|NONE|SHIP|kly. final theodoli +30535|332|17|4|31|38202.23|0.06|0.04|N|O|1996-04-18|1996-04-30|1996-05-16|DELIVER IN PERSON|MAIL|ial pinto beans. ironic, final depos +30535|382|39|5|25|32059.50|0.05|0.07|N|O|1996-03-09|1996-04-13|1996-03-18|DELIVER IN PERSON|RAIL|gs haggle furiously ironi +30535|972|75|6|6|11237.82|0.01|0.05|N|O|1996-04-14|1996-04-11|1996-04-18|TAKE BACK RETURN|MAIL|en dinos. quickly regular accounts among +30560|1087|23|1|7|6916.56|0.05|0.05|N|O|1996-11-08|1996-11-23|1996-11-30|NONE|SHIP|yly bold deposits haggle blithely. +30560|934|37|2|34|62387.62|0.00|0.07|N|O|1996-12-29|1996-10-26|1997-01-26|TAKE BACK RETURN|FOB|cial requests. slyly even p +30560|998|33|3|14|26585.86|0.01|0.06|N|O|1996-11-25|1996-11-16|1996-12-21|TAKE BACK RETURN|REG AIR|the carefully even plate +30560|961|96|4|38|70754.48|0.00|0.01|N|O|1996-09-11|1996-10-31|1996-09-29|TAKE BACK RETURN|SHIP|eodolites haggle quickly after the c +30560|1836|23|5|33|57348.39|0.01|0.01|N|O|1996-10-25|1996-11-05|1996-11-19|NONE|FOB|efully regular +30561|1213|25|1|21|23398.41|0.09|0.04|R|F|1994-03-17|1994-03-30|1994-04-12|COLLECT COD|TRUCK|usly fluffil +30561|1086|92|2|40|39483.20|0.08|0.07|R|F|1994-06-01|1994-04-08|1994-06-21|COLLECT COD|REG AIR|uests against the furiously special +30561|848|48|3|30|52465.20|0.03|0.02|R|F|1994-04-23|1994-04-03|1994-05-02|NONE|MAIL|gular platelets. r +30562|721|22|1|2|3243.44|0.04|0.06|A|F|1992-12-05|1992-12-09|1992-12-31|TAKE BACK RETURN|REG AIR|usly silent foxes cajole idly. pen +30562|1214|89|2|10|11152.10|0.08|0.08|A|F|1993-02-16|1992-12-03|1993-03-16|TAKE BACK RETURN|FOB|he deposits. furiously regular braids +30563|772|69|1|15|25091.55|0.05|0.00|N|O|1996-07-09|1996-04-23|1996-07-19|DELIVER IN PERSON|MAIL|l packages. slyly ironic +30563|311|96|2|17|20592.27|0.06|0.06|N|O|1996-04-29|1996-05-29|1996-05-10|NONE|AIR|theodolites haggle. idle instructions acc +30563|1880|67|3|49|87312.12|0.08|0.06|N|O|1996-07-04|1996-06-08|1996-07-18|DELIVER IN PERSON|RAIL|s packages must have to use: carefully iron +30564|1846|76|1|32|55930.88|0.10|0.02|R|F|1994-06-17|1994-04-02|1994-07-11|DELIVER IN PERSON|RAIL|ackages. s +30564|1460|61|2|19|25867.74|0.08|0.07|R|F|1994-02-28|1994-04-09|1994-03-05|TAKE BACK RETURN|SHIP|cajole carefully ac +30564|1655|97|3|27|42029.55|0.07|0.04|A|F|1994-03-30|1994-04-03|1994-04-14|NONE|SHIP|c accounts doze after the do +30564|136|89|4|43|44553.59|0.04|0.02|R|F|1994-03-17|1994-05-21|1994-04-03|TAKE BACK RETURN|RAIL|etimes even depe +30564|47|23|5|7|6629.28|0.01|0.08|A|F|1994-06-12|1994-05-08|1994-06-29|TAKE BACK RETURN|FOB|lyly silent packages. bold +30565|110|89|1|2|2020.22|0.04|0.05|N|O|1995-08-16|1995-10-21|1995-09-05|NONE|FOB|s! quickly unusual foxes +30565|1737|80|2|46|75381.58|0.09|0.02|N|O|1995-11-21|1995-09-24|1995-12-13|TAKE BACK RETURN|SHIP|rges. furiously bold accounts nag under the +30565|1694|95|3|30|47870.70|0.06|0.04|N|O|1995-08-29|1995-10-10|1995-09-18|DELIVER IN PERSON|AIR|ven asymptotes along the pendi +30565|945|14|4|47|86759.18|0.03|0.00|N|O|1995-09-13|1995-09-12|1995-10-07|TAKE BACK RETURN|TRUCK|ickly regular epitaphs. accou +30565|1831|61|5|18|31190.94|0.01|0.04|N|O|1995-09-17|1995-10-08|1995-10-11|NONE|SHIP|carefully silent packages. packages +30565|586|77|6|5|7432.90|0.07|0.06|N|O|1995-11-16|1995-09-10|1995-11-26|NONE|SHIP|out the slyly express deposits. +30566|373|2|1|11|14007.07|0.03|0.00|N|O|1995-09-21|1995-09-03|1995-10-18|NONE|REG AIR|ggle careful +30566|959|62|2|32|59518.40|0.06|0.01|N|O|1995-08-20|1995-09-25|1995-08-26|DELIVER IN PERSON|RAIL| requests sleep carefully even deposits. +30566|1612|36|3|11|16649.71|0.01|0.07|N|O|1995-08-30|1995-09-29|1995-09-06|COLLECT COD|REG AIR|des. ironic instruc +30566|626|58|4|7|10686.34|0.08|0.06|N|O|1995-08-25|1995-09-08|1995-09-23|TAKE BACK RETURN|RAIL| to the slyly +30567|131|84|1|13|13404.69|0.09|0.07|A|F|1994-01-29|1994-03-25|1994-02-15|TAKE BACK RETURN|RAIL|furiously carefully regular instr +30567|1956|57|2|7|13005.65|0.08|0.08|A|F|1994-02-15|1994-04-10|1994-03-08|DELIVER IN PERSON|SHIP|wake regular excuses. furiously bold inst +30567|1896|83|3|46|82702.94|0.07|0.01|A|F|1994-04-09|1994-03-23|1994-05-01|DELIVER IN PERSON|RAIL|ven, permanent instructions +30567|136|63|4|13|13469.69|0.03|0.04|A|F|1994-02-10|1994-04-02|1994-03-01|NONE|RAIL|xes ought to are carefully furiously +30567|196|75|5|28|30693.32|0.05|0.07|A|F|1994-03-28|1994-04-10|1994-04-01|DELIVER IN PERSON|SHIP| deposits +30567|800|1|6|50|85040.00|0.03|0.07|A|F|1994-02-17|1994-04-02|1994-03-10|NONE|TRUCK|avely ironic ideas? bl +30567|1515|96|7|16|22664.16|0.02|0.02|R|F|1994-02-09|1994-03-30|1994-03-07|NONE|TRUCK|ag express depos +30592|452|82|1|45|60860.25|0.05|0.08|N|O|1996-09-30|1996-11-25|1996-10-21|NONE|RAIL|onic, final requests wake +30592|792|89|2|48|81253.92|0.07|0.06|N|O|1996-10-19|1996-12-01|1996-11-04|TAKE BACK RETURN|SHIP|ithely final requests. carefully special +30592|1918|7|3|35|63696.85|0.08|0.00|N|O|1996-11-24|1996-10-24|1996-12-22|NONE|FOB|cial theodolites sleep against the bold, e +30592|1058|64|4|48|46034.40|0.06|0.01|N|O|1997-01-06|1996-10-22|1997-01-17|COLLECT COD|SHIP|ly ironic foxes. bo +30592|1553|34|5|32|46545.60|0.06|0.04|N|O|1996-11-06|1996-11-22|1996-11-18|COLLECT COD|RAIL|uriously silent depths. slyly ironic pinto +30592|234|35|6|40|45369.20|0.06|0.06|N|O|1996-10-25|1996-12-03|1996-11-10|COLLECT COD|MAIL|ly regular requests cajole +30592|77|78|7|12|11724.84|0.04|0.00|N|O|1997-01-06|1996-11-03|1997-01-18|NONE|SHIP|ve, ruthless requests run carefu +30593|1773|74|1|26|43544.02|0.00|0.05|N|O|1995-08-24|1995-10-21|1995-08-30|NONE|RAIL| integrate carefully always special acco +30593|880|81|2|13|23151.44|0.05|0.03|N|O|1995-11-05|1995-09-20|1995-12-04|NONE|TRUCK|ges sleep furiously above the stealthily fi +30593|532|33|3|17|24353.01|0.06|0.08|N|O|1995-09-14|1995-09-02|1995-09-23|NONE|TRUCK|. carefull +30593|1912|13|4|7|12697.37|0.10|0.08|N|O|1995-11-20|1995-08-29|1995-12-18|TAKE BACK RETURN|TRUCK|ly. quickly special deposits breac +30593|1820|21|5|13|22383.66|0.10|0.07|N|O|1995-10-20|1995-09-03|1995-11-09|COLLECT COD|AIR|unts cajole furiously regular excu +30593|1573|94|6|36|53084.52|0.03|0.03|N|O|1995-11-12|1995-10-11|1995-11-19|NONE|SHIP|s integrate! foxes sleep carefully after +30594|1864|65|1|21|37083.06|0.04|0.01|N|O|1997-11-03|1998-01-13|1997-11-25|TAKE BACK RETURN|TRUCK|st furiously ev +30594|1792|77|2|24|40650.96|0.08|0.06|N|O|1997-12-25|1997-12-31|1998-01-17|TAKE BACK RETURN|AIR| regular instructions h +30594|782|15|3|24|40386.72|0.00|0.07|N|O|1998-02-02|1997-11-25|1998-03-01|DELIVER IN PERSON|SHIP|y ironic sheaves wake quickly special ideas +30595|906|41|1|50|90345.00|0.00|0.01|N|O|1996-10-25|1996-11-19|1996-11-15|TAKE BACK RETURN|REG AIR|fully among th +30595|375|4|2|15|19130.55|0.04|0.00|N|O|1997-01-01|1996-11-30|1997-01-16|COLLECT COD|MAIL|to the carefully express ins +30596|998|1|1|34|64565.66|0.08|0.03|N|O|1998-07-18|1998-05-02|1998-07-19|TAKE BACK RETURN|FOB| final packages. bold decoys +30596|820|54|2|22|37858.04|0.00|0.07|N|O|1998-04-30|1998-06-11|1998-05-06|TAKE BACK RETURN|TRUCK|er the theodolites. fluffily +30596|1358|73|3|41|51633.35|0.00|0.05|N|O|1998-06-17|1998-05-28|1998-07-03|NONE|MAIL|ial packages. blithely ironic ins +30596|406|36|4|41|53562.40|0.06|0.02|N|O|1998-04-12|1998-06-10|1998-04-19|COLLECT COD|AIR|affix furiously furiou +30596|1525|6|5|18|25677.36|0.02|0.01|N|O|1998-05-11|1998-06-18|1998-05-27|COLLECT COD|RAIL|final accounts. even accounts nag furi +30597|1110|11|1|46|46511.06|0.07|0.05|A|F|1992-12-02|1992-09-28|1992-12-18|DELIVER IN PERSON|AIR|ls maintain quickly. idea +30597|2|3|2|14|12628.00|0.07|0.04|R|F|1992-11-08|1992-09-13|1992-11-13|DELIVER IN PERSON|MAIL| deposits across the caref +30597|1449|67|3|24|32410.56|0.08|0.01|R|F|1992-08-10|1992-10-05|1992-08-13|DELIVER IN PERSON|MAIL|olites are carefully after t +30597|1962|51|4|18|33551.28|0.01|0.05|R|F|1992-08-13|1992-11-01|1992-08-21|TAKE BACK RETURN|RAIL|fily pendi +30597|99|100|5|49|48955.41|0.05|0.07|A|F|1992-11-29|1992-10-04|1992-12-27|DELIVER IN PERSON|FOB|ions engage afte +30598|38|39|1|45|42211.35|0.04|0.05|R|F|1993-11-15|1993-11-19|1993-12-13|NONE|FOB| haggle fluffily slyly +30598|1819|63|2|7|12045.67|0.03|0.00|R|F|1993-12-01|1993-12-11|1993-12-21|NONE|TRUCK|nt pinto beans. carefully perma +30598|1913|46|3|28|50817.48|0.06|0.03|R|F|1993-12-19|1993-12-16|1994-01-16|DELIVER IN PERSON|AIR|ular courts around the final, dogged depo +30598|1941|30|4|5|9214.70|0.04|0.06|R|F|1994-01-11|1993-12-15|1994-01-25|COLLECT COD|RAIL|yly after the carefu +30598|1619|2|5|14|21288.54|0.05|0.02|A|F|1993-11-25|1993-12-12|1993-12-07|NONE|MAIL|riously by the quickly even +30598|157|36|6|13|13742.95|0.03|0.03|A|F|1993-11-22|1993-12-14|1993-12-15|NONE|AIR| packages. slyly reg +30599|282|64|1|5|5911.40|0.06|0.05|A|F|1992-05-06|1992-03-18|1992-05-08|NONE|RAIL|ely regular de +30599|1998|87|2|23|43699.77|0.01|0.00|A|F|1992-03-08|1992-03-25|1992-03-29|DELIVER IN PERSON|RAIL|above the regular acc +30599|1716|17|3|2|3235.42|0.03|0.05|R|F|1992-05-17|1992-04-10|1992-06-14|DELIVER IN PERSON|REG AIR|express deposi +30624|433|92|1|48|64004.64|0.05|0.02|N|O|1998-08-22|1998-09-04|1998-08-25|DELIVER IN PERSON|RAIL|ests? furiously pendin +30624|1160|61|2|22|23345.52|0.04|0.02|N|O|1998-09-21|1998-09-25|1998-09-26|DELIVER IN PERSON|SHIP|ffily final ideas nag qu +30624|993|62|3|49|92805.51|0.04|0.06|N|O|1998-09-08|1998-10-21|1998-09-28|NONE|TRUCK|ag blithely slyly regular pinto beans. fina +30624|662|94|4|50|78133.00|0.10|0.03|N|O|1998-08-18|1998-09-21|1998-09-09|TAKE BACK RETURN|RAIL|use furiously according t +30624|1484|63|5|14|19396.72|0.06|0.03|N|O|1998-09-28|1998-10-07|1998-10-20|COLLECT COD|SHIP|al sauternes. even ideas detect furiously +30624|1442|60|6|13|17464.72|0.07|0.07|N|O|1998-08-09|1998-08-30|1998-08-26|NONE|AIR| bold requests thrash. e +30625|1105|42|1|20|20122.00|0.06|0.05|R|F|1993-05-09|1993-04-20|1993-05-14|TAKE BACK RETURN|AIR|olphins boost. requests cajole sl +30625|1663|5|2|29|45375.14|0.05|0.08|R|F|1993-04-14|1993-05-02|1993-05-03|DELIVER IN PERSON|MAIL|yly express ideas b +30625|1265|40|3|20|23325.20|0.09|0.04|R|F|1993-05-17|1993-04-29|1993-05-19|NONE|RAIL|heodolites about the e +30625|1677|19|4|32|50517.44|0.08|0.02|A|F|1993-05-09|1993-04-12|1993-05-10|COLLECT COD|FOB|r pinto beans lose furiously si +30625|1424|3|5|2|2650.84|0.09|0.01|A|F|1993-05-15|1993-04-24|1993-06-09|NONE|AIR|he slyly unusual deposits. silent d +30625|209|64|6|26|28839.20|0.05|0.05|A|F|1993-03-18|1993-03-16|1993-03-22|TAKE BACK RETURN|FOB|lar, regular foxes are qui +30625|389|46|7|20|25787.60|0.07|0.02|A|F|1993-03-29|1993-04-20|1993-04-21|TAKE BACK RETURN|FOB|ounts haggle furiously. care +30626|492|80|1|38|52914.62|0.00|0.07|R|F|1995-05-29|1995-06-10|1995-05-30|NONE|TRUCK| ironic ideas. fluffily ironic Tiresias af +30626|1108|81|2|42|42382.20|0.04|0.00|R|F|1995-05-23|1995-06-02|1995-06-11|DELIVER IN PERSON|MAIL|ove the special reque +30626|1643|67|3|26|40160.64|0.01|0.00|R|F|1995-06-04|1995-07-08|1995-06-06|COLLECT COD|SHIP|ts. instruc +30626|639|33|4|41|63124.83|0.04|0.02|N|O|1995-08-17|1995-06-25|1995-08-29|DELIVER IN PERSON|MAIL| furiously furiously +30627|1721|22|1|8|12981.76|0.04|0.08|R|F|1992-08-20|1992-06-09|1992-09-07|NONE|SHIP|unusual, expre +30627|15|91|2|8|7320.08|0.10|0.02|A|F|1992-06-22|1992-07-28|1992-07-09|COLLECT COD|MAIL|lar, final packages. even orb +30627|1011|82|3|36|32832.36|0.06|0.08|A|F|1992-06-07|1992-08-07|1992-06-17|COLLECT COD|RAIL| deposits. furiously even courts boost enti +30627|652|84|4|39|60553.35|0.02|0.02|R|F|1992-06-26|1992-06-18|1992-07-05|TAKE BACK RETURN|REG AIR|s; fluffily bold packages print furiously +30628|536|97|1|25|35913.25|0.08|0.05|R|F|1993-01-21|1993-01-30|1993-01-27|DELIVER IN PERSON|TRUCK|le blithely after the furiousl +30628|1850|80|2|39|68322.15|0.04|0.06|R|F|1993-01-17|1993-03-08|1993-01-29|TAKE BACK RETURN|FOB|excuses haggle slyl +30628|811|45|3|31|53066.11|0.09|0.05|R|F|1993-01-17|1993-03-24|1993-02-16|COLLECT COD|FOB|ously near the express pinto beans. spec +30628|1815|16|4|37|63521.97|0.02|0.00|A|F|1993-02-07|1993-02-03|1993-03-03|NONE|AIR|al, even packages haggle quic +30629|1321|98|1|6|7333.92|0.02|0.07|A|F|1992-02-20|1992-04-15|1992-03-11|NONE|REG AIR| sleep; ironic, +30629|1384|85|2|27|34705.26|0.04|0.05|R|F|1992-04-08|1992-04-18|1992-05-03|COLLECT COD|MAIL|ges affix carefully in plac +30629|1497|76|3|13|18180.37|0.10|0.00|R|F|1992-03-06|1992-03-14|1992-03-18|DELIVER IN PERSON|TRUCK|ly around the slyly even foxes. r +30629|82|8|4|26|25534.08|0.07|0.02|R|F|1992-04-01|1992-04-16|1992-04-15|NONE|SHIP|e furiously above the ex +30629|839|73|5|22|38276.26|0.05|0.04|A|F|1992-02-23|1992-03-10|1992-03-15|COLLECT COD|FOB|uests. final +30629|421|51|6|1|1321.42|0.05|0.03|R|F|1992-04-20|1992-03-23|1992-04-22|COLLECT COD|FOB|e packages. enticingly ironic pains n +30630|787|84|1|41|69198.98|0.00|0.04|N|O|1998-10-19|1998-09-09|1998-10-28|COLLECT COD|RAIL| platelets after the slyly +30630|1501|42|2|8|11220.00|0.10|0.00|N|O|1998-09-01|1998-10-25|1998-09-15|COLLECT COD|SHIP|slyly even requests use. sly +30630|712|9|3|45|72571.95|0.00|0.04|N|O|1998-11-01|1998-09-17|1998-11-26|TAKE BACK RETURN|REG AIR|wake furiously furiously final +30631|1733|60|1|47|76832.31|0.09|0.06|A|F|1993-07-12|1993-07-26|1993-07-30|NONE|MAIL|ithely ironic platelets above the carefully +30631|232|33|2|26|29437.98|0.03|0.01|A|F|1993-08-29|1993-08-18|1993-09-27|COLLECT COD|FOB|eep carefully. carefully regular foxes h +30631|1937|38|3|7|12872.51|0.01|0.02|A|F|1993-07-04|1993-08-17|1993-07-20|TAKE BACK RETURN|TRUCK| ideas. doggedly bold foxes a +30631|1025|96|4|4|3704.08|0.10|0.00|A|F|1993-10-01|1993-08-01|1993-10-14|NONE|REG AIR|gular packages are s +30656|1687|29|1|39|61958.52|0.06|0.06|N|O|1995-06-28|1995-05-27|1995-07-23|NONE|MAIL|ide of the +30656|1714|41|2|22|35545.62|0.04|0.08|A|F|1995-05-15|1995-06-20|1995-05-29|TAKE BACK RETURN|REG AIR|ts sleep. express instructions nag +30656|1550|71|3|46|66771.30|0.08|0.08|N|O|1995-07-26|1995-05-11|1995-08-12|TAKE BACK RETURN|SHIP|ts. dolphins dazzle sl +30656|51|52|4|3|2853.15|0.01|0.04|N|O|1995-07-25|1995-05-13|1995-08-12|NONE|MAIL|regular instructions. +30656|791|24|5|35|59212.65|0.04|0.02|R|F|1995-05-22|1995-06-29|1995-05-24|COLLECT COD|TRUCK|nusual deposits. regular +30656|1392|93|6|34|43975.26|0.04|0.01|N|O|1995-06-28|1995-07-02|1995-07-06|DELIVER IN PERSON|AIR|quests. pinto beans use b +30656|1953|54|7|24|44518.80|0.08|0.03|R|F|1995-06-05|1995-05-07|1995-06-13|TAKE BACK RETURN|MAIL|ecial depths alon +30657|1520|41|1|31|44067.12|0.10|0.05|N|O|1995-07-07|1995-06-26|1995-07-16|DELIVER IN PERSON|RAIL|ng requests haggle furiously +30657|202|3|2|16|17635.20|0.05|0.03|N|O|1995-09-05|1995-07-20|1995-09-17|DELIVER IN PERSON|MAIL|l dolphins-- fluffily pending +30657|1706|33|3|2|3215.40|0.05|0.08|N|F|1995-06-08|1995-07-03|1995-07-08|COLLECT COD|RAIL|dolites cajole quickly blithel +30658|240|22|1|21|23945.04|0.02|0.07|N|F|1995-06-09|1995-05-19|1995-06-23|TAKE BACK RETURN|SHIP|uriously regular p +30658|1742|69|2|8|13149.92|0.01|0.05|N|F|1995-06-07|1995-06-05|1995-07-02|DELIVER IN PERSON|FOB| the ideas. slyly bold requests must are f +30658|53|79|3|24|22873.20|0.02|0.03|N|O|1995-07-01|1995-06-24|1995-07-19|TAKE BACK RETURN|FOB|ts. carefully ironic deposits hag +30658|1699|82|4|24|38416.56|0.07|0.05|R|F|1995-05-08|1995-05-20|1995-06-04|TAKE BACK RETURN|RAIL|ly at the a +30658|1794|37|5|5|8478.95|0.06|0.06|R|F|1995-05-26|1995-06-20|1995-06-01|TAKE BACK RETURN|TRUCK|ans. furiously bold pl +30658|1379|18|6|43|55055.91|0.09|0.08|A|F|1995-05-12|1995-05-07|1995-06-07|NONE|AIR|ts about the +30659|1921|54|1|17|30989.64|0.00|0.03|N|O|1995-10-17|1995-10-24|1995-10-25|DELIVER IN PERSON|REG AIR|to beans wake quickly. quickly regular i +30659|945|48|2|13|23997.22|0.04|0.06|N|O|1995-12-15|1995-11-11|1995-12-21|NONE|SHIP|ckly regular dependenc +30660|490|91|1|30|41714.70|0.09|0.01|R|F|1992-09-15|1992-10-07|1992-10-02|NONE|REG AIR|. quickly ironic d +30660|1779|80|2|22|36976.94|0.03|0.05|A|F|1992-12-24|1992-11-08|1992-12-27|NONE|SHIP|. dolphins run furiou +30660|1186|59|3|1|1087.18|0.08|0.01|R|F|1992-12-11|1992-11-02|1992-12-19|COLLECT COD|FOB|e requests. blithely unusual accounts haggl +30660|1414|32|4|35|46039.35|0.06|0.00|R|F|1992-11-03|1992-10-07|1992-11-29|TAKE BACK RETURN|TRUCK|nts. instru +30660|789|22|5|19|32105.82|0.10|0.06|A|F|1993-01-05|1992-10-22|1993-01-28|COLLECT COD|MAIL|final requests. pac +30660|1172|9|6|21|22536.57|0.01|0.03|R|F|1992-10-21|1992-11-24|1992-11-04|TAKE BACK RETURN|REG AIR|g the slyly express accounts. +30660|1444|23|7|48|64581.12|0.10|0.08|R|F|1992-09-19|1992-10-10|1992-10-15|NONE|MAIL|ickly ironic theodoli +30661|365|94|1|42|53145.12|0.01|0.01|R|F|1994-04-12|1994-06-17|1994-05-05|COLLECT COD|RAIL|furiously +30661|952|87|2|47|87088.65|0.04|0.02|A|F|1994-04-24|1994-05-29|1994-05-08|DELIVER IN PERSON|REG AIR| theodolites cajole quickly. unusual acc +30661|1565|6|3|43|63062.08|0.06|0.03|A|F|1994-05-08|1994-06-10|1994-05-21|NONE|REG AIR| regular deposits wake. ideas across +30662|368|69|1|28|35514.08|0.07|0.06|N|O|1996-04-07|1996-04-10|1996-04-19|NONE|FOB|ckages haggle at the quick +30662|1093|99|2|27|26840.43|0.06|0.06|N|O|1996-03-12|1996-03-25|1996-03-15|DELIVER IN PERSON|FOB|ily. furiously +30662|1102|11|3|32|32099.20|0.01|0.00|N|O|1996-04-11|1996-03-15|1996-04-15|NONE|SHIP|doze carefully regular, ironic pac +30662|1129|38|4|10|10301.20|0.09|0.03|N|O|1996-02-21|1996-03-25|1996-03-03|TAKE BACK RETURN|TRUCK|carefully bold accounts detect eve +30662|1044|45|5|10|9450.40|0.02|0.01|N|O|1996-01-20|1996-03-30|1996-02-06|NONE|REG AIR|gular platelets. regular, even ideas +30662|261|43|6|50|58063.00|0.09|0.06|N|O|1996-01-19|1996-02-22|1996-02-13|TAKE BACK RETURN|SHIP|e carefully regular accounts. a +30663|1065|66|1|34|32846.04|0.09|0.00|N|O|1998-04-30|1998-05-26|1998-05-11|TAKE BACK RETURN|MAIL| special packages haggle +30663|1473|74|2|8|10995.76|0.00|0.04|N|O|1998-08-05|1998-06-08|1998-09-01|NONE|FOB|ly final acco +30663|167|46|3|23|24544.68|0.06|0.06|N|O|1998-07-15|1998-06-09|1998-08-08|NONE|SHIP|ly bold requests. accounts would lose caref +30688|1265|40|1|9|10496.34|0.00|0.02|N|O|1997-01-08|1996-12-18|1997-01-18|TAKE BACK RETURN|RAIL|lets wake fluf +30689|669|63|1|47|73774.02|0.08|0.03|N|O|1997-01-05|1996-12-02|1997-01-07|DELIVER IN PERSON|TRUCK|s. regular accounts haggle. ironic ideas us +30689|1865|52|2|4|7067.44|0.06|0.07|N|O|1996-10-31|1996-11-27|1996-11-21|DELIVER IN PERSON|AIR|players. fluffil +30689|720|17|3|25|40518.00|0.06|0.02|N|O|1996-12-27|1996-12-30|1997-01-19|TAKE BACK RETURN|MAIL| idle, special pains affix platel +30690|724|57|1|44|71487.68|0.05|0.02|R|F|1993-03-22|1993-04-12|1993-04-04|COLLECT COD|AIR|the packages wake careful +30690|1139|12|2|42|43685.46|0.09|0.02|R|F|1993-04-30|1993-05-10|1993-05-01|DELIVER IN PERSON|RAIL|efully even accounts boost quickly furiou +30691|1764|49|1|11|18323.36|0.09|0.06|N|O|1996-09-22|1996-09-18|1996-10-01|TAKE BACK RETURN|FOB|e blithely final +30691|445|4|2|44|59199.36|0.01|0.06|N|O|1996-09-13|1996-09-03|1996-10-03|NONE|MAIL|blithely blithe excuses may haggle fu +30691|842|42|3|4|6971.36|0.02|0.06|N|O|1996-06-28|1996-08-02|1996-07-14|NONE|RAIL|y slyly final deposits. ironic, spe +30692|1673|74|1|46|72434.82|0.02|0.08|N|O|1997-01-13|1996-11-15|1997-02-04|TAKE BACK RETURN|MAIL|ely. slyly +30692|1572|73|2|2|2947.14|0.01|0.05|N|O|1996-10-28|1996-10-31|1996-11-04|COLLECT COD|REG AIR|le final, pending dolphins. quickly fin +30692|1149|86|3|35|36754.90|0.10|0.01|N|O|1996-12-23|1996-11-28|1997-01-04|COLLECT COD|SHIP|ar, final accounts. carefully bold som +30692|443|2|4|38|51050.72|0.10|0.04|N|O|1996-10-06|1996-10-29|1996-11-05|COLLECT COD|FOB|he carefully bu +30692|1639|40|5|17|26190.71|0.07|0.07|N|O|1996-10-25|1996-10-30|1996-11-17|TAKE BACK RETURN|RAIL|fully above the furiously regular sau +30693|257|12|1|37|42818.25|0.01|0.04|N|O|1997-03-15|1997-03-14|1997-03-26|DELIVER IN PERSON|AIR|s. furiously final +30693|1005|41|2|48|43488.00|0.02|0.08|N|O|1997-05-23|1997-03-31|1997-06-13|TAKE BACK RETURN|AIR|kly ironic +30693|585|16|3|20|29711.60|0.07|0.03|N|O|1997-05-06|1997-05-01|1997-06-05|DELIVER IN PERSON|REG AIR| excuses enga +30693|85|86|4|9|8865.72|0.08|0.06|N|O|1997-04-04|1997-04-21|1997-04-30|DELIVER IN PERSON|SHIP|, final depos +30693|1042|78|5|18|16974.72|0.05|0.05|N|O|1997-04-02|1997-03-07|1997-04-17|NONE|REG AIR|heodolites. ironic packages unwind s +30694|6|32|1|8|7248.00|0.08|0.02|A|F|1992-02-21|1992-04-28|1992-03-16|COLLECT COD|FOB|s sleep closely. bravely special deposi +30694|1557|78|2|9|13126.95|0.10|0.07|R|F|1992-06-03|1992-05-03|1992-07-01|COLLECT COD|AIR|unts nag pending, regular ideas. +30695|71|47|1|2|1942.14|0.08|0.07|N|O|1998-04-23|1998-05-03|1998-05-11|TAKE BACK RETURN|TRUCK|alongside of +30695|200|53|2|3|3300.60|0.02|0.08|N|O|1998-05-14|1998-04-08|1998-05-17|DELIVER IN PERSON|RAIL|nal, final requests. slyly re +30695|635|36|3|18|27641.34|0.07|0.00|N|O|1998-06-11|1998-03-29|1998-06-12|DELIVER IN PERSON|AIR|he regular requests ar +30695|1091|27|4|34|33731.06|0.05|0.06|N|O|1998-04-12|1998-04-03|1998-05-09|COLLECT COD|SHIP|ts. furiously special dolphins +30695|78|79|5|47|45969.29|0.05|0.06|N|O|1998-03-10|1998-03-23|1998-04-01|TAKE BACK RETURN|MAIL|thely bold, express requests. blithely +30720|1015|51|1|7|6412.07|0.09|0.02|A|F|1992-10-13|1992-11-30|1992-11-06|TAKE BACK RETURN|AIR|quests. furiously even epi +30720|1487|88|2|9|12496.32|0.02|0.06|A|F|1992-11-23|1992-12-01|1992-12-08|TAKE BACK RETURN|REG AIR|es poach. blithely pending in +30720|834|68|3|46|79802.18|0.01|0.08|A|F|1993-01-20|1992-11-23|1993-02-06|NONE|REG AIR|ainst the slyly final packages ha +30720|664|65|4|36|56327.76|0.08|0.01|R|F|1992-10-16|1992-11-30|1992-10-27|TAKE BACK RETURN|TRUCK|leep blithely sl +30720|565|56|5|14|20517.84|0.07|0.01|A|F|1992-11-07|1992-12-02|1992-12-04|TAKE BACK RETURN|REG AIR|ccounts boost carefully s +30720|928|31|6|17|31091.64|0.09|0.05|R|F|1993-01-22|1992-12-15|1993-01-31|TAKE BACK RETURN|TRUCK| are above the idle f +30721|1553|94|1|21|30545.55|0.05|0.08|N|O|1996-03-17|1996-03-09|1996-04-10|DELIVER IN PERSON|MAIL|leep fluffily ar +30721|837|4|2|7|12164.81|0.04|0.00|N|O|1996-04-29|1996-02-14|1996-04-30|TAKE BACK RETURN|RAIL|-ray blithely acros +30722|1203|41|1|6|6625.20|0.03|0.07|A|F|1993-09-21|1993-08-11|1993-09-29|COLLECT COD|SHIP|packages kindle about th +30722|440|41|2|8|10723.52|0.03|0.01|R|F|1993-08-07|1993-08-27|1993-08-21|COLLECT COD|SHIP|eposits. carefully bold +30722|1036|72|3|22|20614.66|0.06|0.08|A|F|1993-09-30|1993-07-19|1993-10-30|DELIVER IN PERSON|REG AIR| final deposits mold regula +30723|1542|83|1|22|31757.88|0.03|0.02|N|O|1996-08-06|1996-07-21|1996-08-29|COLLECT COD|FOB|olites are carefully fl +30723|977|78|2|11|20657.67|0.05|0.07|N|O|1996-07-21|1996-07-21|1996-08-15|NONE|REG AIR|, regular accounts! daringly ironic idea +30723|134|35|3|16|16546.08|0.04|0.06|N|O|1996-08-06|1996-06-22|1996-08-29|TAKE BACK RETURN|FOB|efully among the +30724|1110|19|1|9|9099.99|0.09|0.04|N|O|1996-03-16|1996-05-02|1996-03-19|DELIVER IN PERSON|SHIP|ding packages affix blith +30724|346|31|2|24|29912.16|0.09|0.04|N|O|1996-05-10|1996-05-11|1996-05-19|COLLECT COD|REG AIR|al accounts nod. furiously +30725|760|25|1|44|73073.44|0.07|0.08|R|F|1995-04-10|1995-03-27|1995-04-11|TAKE BACK RETURN|AIR|yly slyly special packages +30725|1256|94|2|1|1157.25|0.07|0.04|A|F|1995-03-20|1995-03-21|1995-04-16|TAKE BACK RETURN|TRUCK|sly final deposits sleep sly +30725|1032|38|3|48|44785.44|0.06|0.08|R|F|1995-03-04|1995-03-01|1995-03-05|NONE|RAIL|ing packages. requ +30725|1228|29|4|18|20325.96|0.05|0.06|R|F|1995-04-03|1995-03-06|1995-04-22|TAKE BACK RETURN|SHIP|to beans lose final, re +30725|1372|11|5|19|24194.03|0.06|0.08|A|F|1995-04-07|1995-03-21|1995-05-01|NONE|REG AIR|nusual excuses haggle at +30725|314|15|6|47|57072.57|0.02|0.03|A|F|1995-03-27|1995-01-28|1995-04-14|NONE|RAIL|nts engage. final, regular deposits +30726|732|97|1|1|1632.73|0.04|0.00|R|F|1995-03-01|1995-02-18|1995-03-08|TAKE BACK RETURN|SHIP|encies. instructions about the ca +30726|1015|51|2|15|13740.15|0.05|0.06|R|F|1995-02-23|1995-02-18|1995-03-14|COLLECT COD|TRUCK|quests hang carefully at +30726|1314|91|3|44|53473.64|0.09|0.03|A|F|1995-03-21|1995-02-23|1995-03-28|NONE|RAIL|eep slyly final accounts! slyly final +30726|382|83|4|3|3847.14|0.04|0.02|R|F|1995-01-15|1995-02-12|1995-01-17|TAKE BACK RETURN|MAIL|ites. bold asymptotes are. slow, final i +30727|79|80|1|8|7832.56|0.09|0.00|A|F|1992-10-17|1992-09-09|1992-10-31|TAKE BACK RETURN|REG AIR|tes haggle al +30727|283|11|2|33|39048.24|0.08|0.07|R|F|1992-10-11|1992-09-29|1992-11-08|TAKE BACK RETURN|AIR|beside the packages. packages sleep +30727|1033|39|3|31|28954.93|0.09|0.07|R|F|1992-11-04|1992-10-04|1992-11-17|TAKE BACK RETURN|SHIP|counts cajole blithely regu +30727|1943|76|4|45|83022.30|0.04|0.01|A|F|1992-10-22|1992-10-07|1992-10-24|DELIVER IN PERSON|REG AIR|egular packages are quickly bravely i +30727|876|43|5|37|65744.19|0.06|0.03|A|F|1992-08-17|1992-10-23|1992-08-23|COLLECT COD|AIR| run furiously silent requ +30727|288|16|6|22|26142.16|0.04|0.00|A|F|1992-08-30|1992-10-13|1992-09-27|COLLECT COD|AIR|l deposits haggle +30752|723|20|1|31|50335.32|0.09|0.05|N|O|1998-03-07|1997-12-24|1998-03-20|NONE|RAIL|eposits use careful +30752|1653|95|2|12|18655.80|0.10|0.01|N|O|1998-01-02|1997-12-31|1998-01-14|TAKE BACK RETURN|RAIL|d dolphins. requests according to the sl +30752|1518|39|3|34|48263.34|0.04|0.06|N|O|1998-01-26|1998-01-28|1998-01-29|TAKE BACK RETURN|RAIL| furiously b +30753|945|46|1|37|68299.78|0.05|0.08|N|O|1997-09-27|1997-11-26|1997-10-27|NONE|AIR|al ideas use furiously unusual foxes. fluf +30753|847|48|2|41|71661.44|0.05|0.08|N|O|1997-11-10|1997-11-02|1997-12-06|TAKE BACK RETURN|MAIL|onic accounts about the carefu +30754|601|64|1|16|24025.60|0.02|0.02|R|F|1993-11-30|1994-02-02|1993-12-05|TAKE BACK RETURN|SHIP| final foxes cajole quickly along the +30754|572|3|2|38|55957.66|0.03|0.07|A|F|1994-03-06|1994-01-19|1994-03-14|TAKE BACK RETURN|REG AIR|c theodolites hinder pending pinto beans. +30754|532|23|3|44|63031.32|0.07|0.01|R|F|1993-11-30|1994-02-18|1993-12-18|TAKE BACK RETURN|FOB|en accounts about the carefully +30754|546|7|4|28|40503.12|0.08|0.02|A|F|1993-12-28|1994-01-02|1994-01-15|DELIVER IN PERSON|RAIL|ts among the blithely fin +30755|1103|76|1|31|31127.10|0.04|0.01|N|O|1998-02-17|1998-05-02|1998-03-18|NONE|SHIP|lithely ironic, express +30755|936|39|2|28|51434.04|0.03|0.07|N|O|1998-02-25|1998-04-22|1998-03-04|NONE|AIR|en ideas. blithely final deposi +30755|634|97|3|36|55246.68|0.06|0.07|N|O|1998-04-11|1998-04-05|1998-04-23|DELIVER IN PERSON|TRUCK|manently regular instructions boo +30755|1607|49|4|49|73921.40|0.07|0.04|N|O|1998-03-04|1998-05-08|1998-03-22|COLLECT COD|AIR|gular deposits. carefully +30756|992|95|1|16|30287.84|0.09|0.08|N|O|1997-12-16|1997-12-07|1997-12-28|COLLECT COD|TRUCK|y even theodolites are unusual dug +30756|293|21|2|9|10739.61|0.04|0.00|N|O|1997-10-22|1997-11-23|1997-11-10|COLLECT COD|MAIL|counts sleep. sometimes even pa +30756|1328|5|3|20|24586.40|0.08|0.01|N|O|1997-11-08|1997-12-04|1997-11-26|COLLECT COD|FOB| nag. unusual, regular realms c +30756|888|89|4|34|60821.92|0.04|0.02|N|O|1997-11-15|1997-10-26|1997-12-11|TAKE BACK RETURN|SHIP|ent requests. furiously pending a +30756|1363|2|5|5|6321.80|0.10|0.08|N|O|1997-10-21|1997-11-24|1997-11-07|NONE|TRUCK| slyly blithely regular foxes. +30756|1348|49|6|23|28734.82|0.08|0.04|N|O|1998-01-10|1997-12-01|1998-01-16|NONE|REG AIR| wake careful +30757|1522|43|1|10|14235.20|0.03|0.01|A|F|1994-04-10|1994-01-27|1994-04-27|NONE|FOB|ickly express ins +30757|765|98|2|33|54970.08|0.06|0.04|A|F|1994-01-21|1994-02-01|1994-01-27|NONE|AIR| final dep +30757|601|33|3|10|15016.00|0.10|0.02|A|F|1994-01-27|1994-02-02|1994-01-30|TAKE BACK RETURN|TRUCK|doggedly. final, fina +30758|1750|93|1|41|67721.75|0.09|0.05|N|O|1998-08-16|1998-09-09|1998-09-06|TAKE BACK RETURN|REG AIR|ng platelets run slyly furiously pend +30759|408|9|1|15|19626.00|0.05|0.07|A|F|1994-07-31|1994-06-21|1994-08-25|NONE|MAIL|osits thrash slyly regular requests. b +30759|1054|60|2|13|12415.65|0.06|0.03|R|F|1994-06-13|1994-07-16|1994-07-11|DELIVER IN PERSON|MAIL|ckly final deposits. express platele +30759|1762|47|3|7|11646.32|0.05|0.03|R|F|1994-07-06|1994-07-10|1994-07-26|DELIVER IN PERSON|SHIP|counts along the final, r +30784|583|14|1|16|23737.28|0.07|0.00|R|F|1992-08-28|1992-07-23|1992-09-01|COLLECT COD|MAIL|y pinto beans. unu +30784|715|12|2|18|29082.78|0.04|0.00|A|F|1992-06-13|1992-06-20|1992-06-15|DELIVER IN PERSON|MAIL|pinto beans. quickly special requests doze +30784|1676|18|3|25|39441.75|0.10|0.04|R|F|1992-07-26|1992-07-02|1992-08-14|COLLECT COD|RAIL| blithely bold +30784|186|87|4|29|31499.22|0.00|0.07|R|F|1992-07-30|1992-07-13|1992-08-12|NONE|RAIL|ly express ideas boost +30784|38|64|5|5|4690.15|0.07|0.02|A|F|1992-08-22|1992-06-28|1992-09-19|COLLECT COD|FOB|nto beans. daringly even deposi +30784|1821|22|6|22|37902.04|0.08|0.01|R|F|1992-05-12|1992-07-23|1992-05-21|TAKE BACK RETURN|TRUCK|unwind blithely about the slyly final T +30785|22|98|1|36|33192.72|0.09|0.04|R|F|1994-08-10|1994-08-30|1994-09-07|COLLECT COD|REG AIR|y regular foxes wake slyly r +30785|158|37|2|40|42326.00|0.04|0.01|R|F|1994-09-21|1994-09-07|1994-10-08|COLLECT COD|RAIL|ular foxes. fluffily rut +30785|1346|61|3|28|34925.52|0.03|0.02|R|F|1994-07-29|1994-09-17|1994-07-31|NONE|TRUCK|quickly alo +30785|1169|6|4|23|24613.68|0.07|0.06|R|F|1994-08-26|1994-09-15|1994-09-11|TAKE BACK RETURN|MAIL|ans among the slyly express pinto beans ar +30786|477|36|1|12|16529.64|0.04|0.06|R|F|1992-08-18|1992-08-25|1992-09-07|NONE|SHIP|ons kindle. requests nag furiously above t +30786|551|12|2|50|72577.50|0.10|0.07|A|F|1992-10-16|1992-09-05|1992-11-13|NONE|FOB|yly ironic excuse +30786|526|87|3|37|52781.24|0.08|0.02|A|F|1992-07-26|1992-10-15|1992-08-04|DELIVER IN PERSON|FOB|uickly ironic accounts solve car +30786|1198|35|4|20|21983.80|0.04|0.06|A|F|1992-08-07|1992-09-24|1992-08-23|NONE|REG AIR|ic requests. accounts cajol +30786|367|24|5|14|17743.04|0.06|0.05|A|F|1992-09-09|1992-08-30|1992-09-17|COLLECT COD|SHIP|ly blithely enticing ac +30786|163|42|6|15|15947.40|0.08|0.03|A|F|1992-08-14|1992-09-04|1992-08-30|DELIVER IN PERSON|TRUCK|. regular accounts use ide +30786|765|98|7|48|79956.48|0.04|0.03|R|F|1992-08-19|1992-08-25|1992-09-08|COLLECT COD|FOB|accounts hinder acro +30787|1774|59|1|19|31839.63|0.04|0.03|N|O|1995-11-07|1995-11-17|1995-11-15|NONE|AIR|ake among the slyly ironic ideas. +30787|1594|95|2|27|40380.93|0.07|0.03|N|O|1995-10-16|1995-10-29|1995-11-07|NONE|REG AIR|ng excuses wake quickly ironic packag +30788|1148|85|1|27|28326.78|0.00|0.00|R|F|1992-11-20|1993-01-18|1992-12-10|NONE|SHIP|ealms affix furiously with +30788|1119|20|2|43|43864.73|0.02|0.08|R|F|1992-11-09|1992-12-11|1992-11-26|DELIVER IN PERSON|REG AIR|its. fluffily express platelets +30788|1994|83|3|38|72047.62|0.06|0.05|A|F|1992-12-27|1992-12-23|1993-01-21|DELIVER IN PERSON|MAIL|kages after the slyly ironic deposits b +30788|497|56|4|13|18167.37|0.08|0.00|A|F|1992-11-06|1992-12-08|1992-11-09|TAKE BACK RETURN|RAIL|the blithely silent reques +30789|754|55|1|35|57916.25|0.08|0.02|A|F|1994-08-09|1994-09-20|1994-08-20|NONE|MAIL|ly carefully silent packages. pendi +30789|1407|25|2|30|39252.00|0.06|0.08|R|F|1994-10-06|1994-08-22|1994-10-07|DELIVER IN PERSON|RAIL|y. regular, regular warthogs are? +30789|165|44|3|23|24498.68|0.09|0.08|A|F|1994-07-28|1994-08-31|1994-08-11|DELIVER IN PERSON|TRUCK| unusual theodolites. final p +30789|290|18|4|30|35708.70|0.05|0.00|R|F|1994-10-20|1994-08-18|1994-10-30|COLLECT COD|SHIP|ccording to the slow pac +30789|565|56|5|1|1465.56|0.05|0.06|R|F|1994-10-19|1994-09-25|1994-11-12|COLLECT COD|SHIP|ding packages cajole according to the +30789|1304|19|6|16|19284.80|0.07|0.07|A|F|1994-07-03|1994-08-31|1994-07-29|COLLECT COD|AIR|al deposits. specia +30790|1656|80|1|32|49844.80|0.02|0.03|A|F|1993-02-14|1993-03-07|1993-02-28|COLLECT COD|TRUCK|he regular platelets detect +30790|1924|13|2|49|89470.08|0.07|0.07|A|F|1993-03-17|1993-02-26|1993-04-04|NONE|FOB|iously iro +30790|1826|70|3|35|60473.70|0.04|0.08|A|F|1993-01-18|1993-03-07|1993-02-05|NONE|FOB|eep ruthlessly blithely regular dep +30790|1315|92|4|30|36489.30|0.04|0.07|R|F|1992-12-25|1993-02-08|1993-01-20|DELIVER IN PERSON|RAIL|fily after the express foxes! bold, regula +30790|1997|98|5|32|60767.68|0.06|0.06|A|F|1993-03-01|1993-01-11|1993-03-29|DELIVER IN PERSON|TRUCK|ns wake against th +30790|919|22|6|17|30938.47|0.05|0.07|R|F|1993-01-11|1993-03-01|1993-01-16|DELIVER IN PERSON|SHIP|yly deposits. ironic requests p +30790|899|66|7|16|28798.24|0.05|0.00|A|F|1993-01-25|1993-01-13|1993-02-20|DELIVER IN PERSON|REG AIR|eposits. patterns sleep furiously. +30791|1980|69|1|6|11291.88|0.06|0.01|N|O|1997-12-16|1998-01-07|1998-01-14|DELIVER IN PERSON|MAIL|y silent r +30791|1941|74|2|16|29487.04|0.07|0.02|N|O|1997-11-14|1998-01-02|1997-12-07|TAKE BACK RETURN|RAIL|ing dugouts haggle furiously. bo +30791|402|90|3|45|58608.00|0.03|0.05|N|O|1998-02-10|1998-01-08|1998-02-17|DELIVER IN PERSON|RAIL| platelets. furiously unusua +30791|1226|64|4|19|21417.18|0.02|0.02|N|O|1997-11-22|1997-11-18|1997-12-18|TAKE BACK RETURN|MAIL|t quickly alongside of the blithe +30816|457|87|1|17|23076.65|0.01|0.02|N|O|1996-12-17|1997-01-29|1997-01-13|DELIVER IN PERSON|REG AIR|ts print according to the final +30817|1860|90|1|20|35237.20|0.10|0.02|N|O|1996-10-19|1996-11-17|1996-11-08|COLLECT COD|AIR|ously bold, express d +30817|409|39|2|30|39282.00|0.05|0.04|N|O|1996-11-06|1996-10-23|1996-11-22|NONE|MAIL|ss gifts. carefully close instructions +30817|1209|21|3|48|53289.60|0.01|0.08|N|O|1996-11-13|1996-11-15|1996-11-27|COLLECT COD|REG AIR|counts cajole slyly alongs +30818|1294|6|1|47|56178.63|0.10|0.02|N|O|1997-08-21|1997-10-17|1997-09-02|NONE|TRUCK|t furiously carefully pending pint +30818|1682|65|2|29|45926.72|0.00|0.01|N|O|1997-10-16|1997-09-03|1997-11-02|DELIVER IN PERSON|SHIP|ts nag abov +30818|1119|20|3|46|46925.06|0.07|0.03|N|O|1997-08-02|1997-09-12|1997-08-27|NONE|REG AIR|egular dolphins cajole furiously +30818|133|86|4|22|22728.86|0.07|0.03|N|O|1997-09-07|1997-09-14|1997-09-17|NONE|REG AIR|ests cajole. furiously bol +30818|395|80|5|41|53110.99|0.03|0.01|N|O|1997-09-19|1997-10-04|1997-09-30|NONE|RAIL|ic frets. final pinto beans at +30819|559|60|1|3|4378.65|0.07|0.05|A|F|1992-05-08|1992-06-24|1992-05-14|TAKE BACK RETURN|SHIP|furiously: quickly ironic +30819|1103|40|2|3|3012.30|0.00|0.02|A|F|1992-06-26|1992-06-16|1992-07-02|COLLECT COD|MAIL|ly regular pinto beans. busy, regu +30819|990|93|3|1|1890.99|0.05|0.00|R|F|1992-06-16|1992-07-12|1992-07-06|COLLECT COD|TRUCK|eposits haggle idly ironic, express i +30820|502|33|1|2|2805.00|0.10|0.03|R|F|1995-05-30|1995-06-15|1995-05-31|TAKE BACK RETURN|RAIL|dolphins. slyly pending dependencies poach +30820|163|16|2|32|34021.12|0.04|0.01|R|F|1995-05-25|1995-05-20|1995-05-26|COLLECT COD|AIR|ngside of the blithely pending excuses +30820|1446|64|3|18|24253.92|0.05|0.03|N|F|1995-06-03|1995-06-30|1995-06-22|NONE|RAIL|le fluffily slyly ruthless asymptotes +30821|1231|32|1|28|31702.44|0.10|0.01|R|F|1994-03-04|1994-03-16|1994-03-13|COLLECT COD|MAIL|ts above the slyly +30821|39|65|2|46|43195.38|0.06|0.04|A|F|1994-02-07|1994-02-22|1994-02-10|TAKE BACK RETURN|REG AIR|lar deposits wake carefully. blithely ex +30821|861|62|3|1|1761.86|0.05|0.00|R|F|1994-01-27|1994-03-04|1994-02-18|DELIVER IN PERSON|AIR|e quickly bold excuses wake carefully +30821|1703|4|4|18|28884.60|0.06|0.08|A|F|1994-02-05|1994-02-18|1994-02-10|COLLECT COD|AIR|press theodolites. +30821|1366|43|5|30|38020.80|0.02|0.00|R|F|1994-04-11|1994-02-19|1994-04-20|TAKE BACK RETURN|REG AIR| against the +30822|1339|54|1|33|40930.89|0.07|0.03|N|O|1997-01-08|1997-02-22|1997-02-07|NONE|FOB|e the silent deposits. c +30822|1800|85|2|10|17018.00|0.01|0.01|N|O|1997-01-11|1997-02-20|1997-02-09|COLLECT COD|TRUCK|s affix furi +30822|886|87|3|21|37524.48|0.08|0.04|N|O|1997-01-13|1997-01-24|1997-01-29|TAKE BACK RETURN|FOB|azzle quickly around the carefully +30822|272|100|4|50|58613.50|0.07|0.01|N|O|1997-02-27|1997-01-28|1997-03-28|COLLECT COD|AIR|es unwind. carefully pendi +30822|736|33|5|18|29461.14|0.03|0.04|N|O|1996-12-24|1997-02-11|1997-01-08|DELIVER IN PERSON|RAIL|ies kindle according to the +30822|1021|27|6|10|9220.20|0.01|0.02|N|O|1996-12-09|1997-01-16|1996-12-29|NONE|SHIP| regular pinto beans. quietly express r +30823|1647|71|1|35|54202.40|0.10|0.00|N|O|1997-03-24|1997-05-23|1997-04-18|TAKE BACK RETURN|MAIL|s. sheaves bo +30823|918|19|2|18|32740.38|0.00|0.08|N|O|1997-03-16|1997-05-24|1997-03-31|DELIVER IN PERSON|FOB| express requests. even accounts haggle +30823|1611|53|3|49|74117.89|0.00|0.07|N|O|1997-03-19|1997-04-18|1997-04-08|COLLECT COD|MAIL|ges. furiously silent theodolite +30823|1091|97|4|41|40675.69|0.08|0.06|N|O|1997-05-06|1997-04-17|1997-05-28|DELIVER IN PERSON|REG AIR|y slyly regular warhor +30823|1375|52|5|29|37014.73|0.00|0.01|N|O|1997-06-07|1997-05-12|1997-06-21|TAKE BACK RETURN|AIR| the regular packages? permanent +30848|1913|2|1|38|68966.58|0.10|0.03|N|O|1995-06-30|1995-06-15|1995-07-13|NONE|FOB|ts nag furiously. fl +30848|1574|75|2|13|19182.41|0.06|0.03|N|F|1995-06-14|1995-07-16|1995-06-23|NONE|AIR| blithely. quickly special t +30848|1007|43|3|34|30872.00|0.02|0.01|N|O|1995-07-20|1995-06-08|1995-08-07|COLLECT COD|AIR|y. braids nod: ironic accounts a +30848|1365|42|4|4|5065.44|0.06|0.03|R|F|1995-05-30|1995-06-04|1995-06-11|NONE|FOB|furiously ironic somas +30848|881|15|5|30|53456.40|0.09|0.06|N|O|1995-07-11|1995-06-27|1995-08-01|DELIVER IN PERSON|SHIP| instructions cajole carefully unu +30848|32|83|6|3|2796.09|0.09|0.08|N|O|1995-08-03|1995-06-01|1995-08-11|NONE|RAIL|eposits detect s +30849|632|26|1|33|50576.79|0.03|0.00|N|O|1996-04-14|1996-05-25|1996-04-29|NONE|MAIL|uctions. stealthy, regular deposits +30849|1885|86|2|36|64327.68|0.08|0.03|N|O|1996-04-18|1996-05-29|1996-05-09|DELIVER IN PERSON|TRUCK|blithely even instru +30849|432|20|3|29|38640.47|0.09|0.03|N|O|1996-03-19|1996-04-24|1996-03-29|DELIVER IN PERSON|AIR|s about the +30849|858|59|4|6|10553.10|0.02|0.00|N|O|1996-05-04|1996-05-01|1996-05-27|NONE|SHIP|cies boost carefully notornis. +30849|1346|47|5|27|33678.18|0.03|0.08|N|O|1996-03-21|1996-06-08|1996-04-15|NONE|FOB|slyly regular pac +30850|1617|18|1|50|75930.50|0.02|0.05|R|F|1992-07-20|1992-07-20|1992-08-18|DELIVER IN PERSON|MAIL|e regular, eve +30851|421|9|1|9|11892.78|0.04|0.03|R|F|1993-12-02|1993-11-11|1993-12-05|NONE|SHIP|ly alongside of the requests. blithely stea +30852|246|1|1|27|30948.48|0.00|0.02|R|F|1994-07-14|1994-07-04|1994-08-05|COLLECT COD|RAIL|s. furiously even deposits wake blithel +30852|1333|34|2|21|25920.93|0.00|0.04|R|F|1994-05-22|1994-08-09|1994-06-02|COLLECT COD|MAIL|r the regular packag +30852|829|96|3|37|64003.34|0.06|0.07|R|F|1994-09-11|1994-06-19|1994-09-24|TAKE BACK RETURN|RAIL|nding deposits sleep-- +30852|1475|15|4|24|33035.28|0.08|0.02|R|F|1994-05-25|1994-06-17|1994-06-13|DELIVER IN PERSON|REG AIR| blithely ironic requests affix: quickly +30852|1538|19|5|14|20153.42|0.00|0.05|A|F|1994-08-27|1994-07-10|1994-09-02|DELIVER IN PERSON|TRUCK|unusual courts. ironic deposits haggl +30853|375|32|1|36|45913.32|0.00|0.03|N|O|1995-08-27|1995-10-14|1995-09-09|TAKE BACK RETURN|REG AIR|n platelets boost carefully pe +30853|641|73|2|29|44707.56|0.01|0.07|N|O|1995-08-24|1995-10-10|1995-09-18|COLLECT COD|TRUCK|ckages. furiously ironic tithe +30853|125|26|3|42|43055.04|0.03|0.03|N|O|1995-10-25|1995-10-15|1995-10-29|NONE|MAIL| ironic deposits. stealth +30853|1306|21|4|17|20524.10|0.10|0.08|N|O|1995-09-17|1995-10-22|1995-09-28|TAKE BACK RETURN|FOB|ions belie +30853|1091|97|5|47|46628.23|0.02|0.07|N|O|1995-08-18|1995-09-26|1995-09-10|DELIVER IN PERSON|SHIP|furiously regular excuses. careful request +30853|96|72|6|40|39843.60|0.03|0.02|N|O|1995-08-27|1995-09-29|1995-09-26|DELIVER IN PERSON|RAIL| accounts. +30854|1821|65|1|6|10336.92|0.09|0.06|N|O|1997-06-22|1997-04-16|1997-07-21|COLLECT COD|FOB|hins. blithely close f +30854|421|9|2|36|47571.12|0.01|0.03|N|O|1997-04-12|1997-05-10|1997-05-03|TAKE BACK RETURN|AIR|r deposits unwind fur +30854|832|33|3|32|55450.56|0.07|0.08|N|O|1997-06-11|1997-05-10|1997-07-06|COLLECT COD|FOB|ts above the asymptotes integrate bold pac +30854|1279|80|4|3|3540.81|0.10|0.00|N|O|1997-03-20|1997-05-09|1997-04-18|NONE|FOB|ending ideas integrate qu +30854|1756|99|5|30|49732.50|0.07|0.01|N|O|1997-03-17|1997-04-24|1997-04-09|NONE|MAIL|ges affix regularly. furiously +30855|244|72|1|36|41192.64|0.01|0.01|N|O|1997-01-05|1997-01-02|1997-01-25|TAKE BACK RETURN|AIR|about the carefully even dinos eat requ +30855|772|37|2|3|5018.31|0.08|0.03|N|O|1997-02-08|1997-01-31|1997-02-14|TAKE BACK RETURN|MAIL|. ironic deposits are alongsid +30855|1687|88|3|4|6354.72|0.01|0.04|N|O|1997-02-15|1996-12-21|1997-02-17|COLLECT COD|RAIL|gular, even accounts breach blithely am +30855|186|13|4|25|27154.50|0.06|0.02|N|O|1996-12-26|1997-01-19|1997-01-05|DELIVER IN PERSON|FOB|ckages haggle. slyly fi +30855|334|35|5|1|1234.33|0.00|0.04|N|O|1997-01-20|1997-01-30|1997-02-16|NONE|MAIL|packages impress slyly pending foxes. +30855|1671|54|6|26|40889.42|0.01|0.02|N|O|1996-12-07|1997-02-07|1996-12-08|TAKE BACK RETURN|SHIP|heodolites cajole doggedly about +30855|206|61|7|44|48672.80|0.10|0.02|N|O|1996-12-09|1996-12-26|1996-12-31|DELIVER IN PERSON|TRUCK|s above the regular decoys sleep boldly a +30880|1029|35|1|7|6510.14|0.03|0.02|N|O|1997-11-22|1997-12-05|1997-12-02|TAKE BACK RETURN|SHIP|y express asympto +30880|303|32|2|32|38505.60|0.00|0.02|N|O|1997-12-01|1997-12-10|1997-12-28|NONE|TRUCK|nic requests sleep according to the bl +30880|1111|12|3|13|13157.43|0.07|0.00|N|O|1997-11-12|1998-01-01|1997-11-18|COLLECT COD|RAIL| blithely. carefully bol +30881|957|58|1|32|59454.40|0.09|0.08|R|F|1993-07-11|1993-08-21|1993-07-15|DELIVER IN PERSON|RAIL|ress, express dugouts +30881|1368|83|2|11|13962.96|0.09|0.04|A|F|1993-10-09|1993-07-13|1993-10-26|DELIVER IN PERSON|REG AIR|eans along the carefully regular foxes +30881|587|78|3|30|44627.40|0.02|0.00|R|F|1993-10-01|1993-07-26|1993-10-15|TAKE BACK RETURN|MAIL|st the quic +30881|1843|87|4|38|66303.92|0.00|0.01|R|F|1993-08-28|1993-07-16|1993-09-05|DELIVER IN PERSON|REG AIR|ajole quickly according to the wa +30882|1271|9|1|19|22273.13|0.05|0.05|N|O|1996-11-06|1996-12-17|1996-12-04|DELIVER IN PERSON|AIR|ts use slyl +30882|1489|7|2|32|44495.36|0.06|0.03|N|O|1996-11-26|1996-12-18|1996-11-27|NONE|MAIL|cajole after the slyly express instructions +30883|1128|29|1|37|38077.44|0.05|0.05|A|F|1993-10-30|1993-11-20|1993-11-11|NONE|AIR|ly instructions. s +30883|203|85|2|49|54056.80|0.04|0.02|R|F|1993-11-29|1993-10-03|1993-12-23|COLLECT COD|TRUCK| fluffily regular dep +30883|1337|14|3|22|27243.26|0.01|0.00|A|F|1993-11-26|1993-10-12|1993-12-07|NONE|REG AIR|cording to the final acc +30883|252|53|4|33|38024.25|0.06|0.01|R|F|1993-11-26|1993-10-30|1993-12-11|DELIVER IN PERSON|SHIP|s among the de +30883|1298|99|5|20|23985.80|0.07|0.03|A|F|1993-09-08|1993-09-29|1993-09-18|TAKE BACK RETURN|SHIP|fily ironic requests alongside of th +30883|1859|60|6|14|24651.90|0.05|0.01|A|F|1993-09-18|1993-10-06|1993-09-23|TAKE BACK RETURN|AIR|lithely even account +30884|1241|53|1|11|12564.64|0.08|0.08|R|F|1993-11-02|1993-11-12|1993-11-26|DELIVER IN PERSON|AIR|esides the foxes. fl +30884|326|83|2|33|40468.56|0.07|0.01|A|F|1993-10-03|1993-12-15|1993-10-18|DELIVER IN PERSON|FOB|he packages. blithely ironic deposits c +30884|49|100|3|49|46502.96|0.04|0.03|R|F|1993-10-30|1993-11-01|1993-11-27|COLLECT COD|FOB|decoys. blithely furious deposits kindle f +30885|1249|24|1|44|50610.56|0.02|0.01|R|F|1993-07-23|1993-08-08|1993-08-16|NONE|RAIL|lar requests wake slyly +30885|1497|37|2|36|50345.64|0.02|0.03|A|F|1993-07-05|1993-08-07|1993-07-26|NONE|REG AIR|ng the furiously quiet account +30885|1337|52|3|31|38388.23|0.07|0.02|A|F|1993-07-11|1993-08-25|1993-07-17|NONE|AIR| regular accounts boost. fluffily regula +30885|375|32|4|26|33159.62|0.08|0.04|A|F|1993-06-23|1993-09-03|1993-06-30|DELIVER IN PERSON|FOB|ly ironic pinto beans after t +30885|1231|43|5|25|28305.75|0.10|0.06|A|F|1993-07-13|1993-08-28|1993-08-06|NONE|MAIL|ckly carefully unusual r +30886|883|83|1|4|7135.52|0.07|0.03|R|F|1992-07-01|1992-08-09|1992-07-06|DELIVER IN PERSON|REG AIR|ide of the ideas +30886|1299|37|2|37|44410.73|0.04|0.06|A|F|1992-06-09|1992-06-22|1992-07-05|NONE|AIR|requests. ironic +30886|932|67|3|29|53154.97|0.02|0.06|A|F|1992-05-16|1992-06-23|1992-05-21|DELIVER IN PERSON|RAIL|ets. quickly ironic deposits integrate beh +30886|1405|6|4|38|49643.20|0.05|0.03|A|F|1992-06-08|1992-07-02|1992-06-30|COLLECT COD|REG AIR|round the blith +30887|1203|41|1|47|51897.40|0.03|0.06|R|F|1993-08-25|1993-09-20|1993-09-12|TAKE BACK RETURN|MAIL|ending, final dependencies. slyly +30887|639|33|2|42|64664.46|0.02|0.02|A|F|1993-07-11|1993-09-11|1993-07-20|TAKE BACK RETURN|FOB|sly around the +30887|327|56|3|24|29455.68|0.04|0.04|A|F|1993-07-09|1993-09-28|1993-07-26|TAKE BACK RETURN|RAIL| the even, ironic d +30912|810|44|1|4|6843.24|0.09|0.05|R|F|1994-02-10|1994-01-13|1994-02-12|COLLECT COD|TRUCK|tions. slyly bold deposits use. pending no +30912|1123|32|2|22|22530.64|0.07|0.07|R|F|1993-12-08|1994-02-16|1994-01-02|NONE|SHIP|efully regular accounts ar +30912|1967|56|3|9|16820.64|0.03|0.07|R|F|1994-01-13|1994-01-15|1994-02-06|COLLECT COD|TRUCK|yly. bold, bold requests impress. q +30912|1857|1|4|48|84424.80|0.10|0.03|R|F|1994-03-02|1994-02-03|1994-03-23|NONE|FOB|ly sly deposits. even ideas +30913|1146|47|1|32|33508.48|0.00|0.01|A|F|1992-12-10|1992-12-04|1992-12-15|DELIVER IN PERSON|TRUCK|nts wake fluffi +30913|1039|45|2|34|31961.02|0.04|0.06|R|F|1992-09-27|1992-11-13|1992-10-10|COLLECT COD|FOB|ly special foxes. carefully re +30913|778|43|3|45|75544.65|0.01|0.02|A|F|1992-11-15|1992-11-19|1992-12-15|NONE|AIR| blithely ironic accounts. deposits a +30913|1729|14|4|5|8153.60|0.05|0.08|R|F|1993-01-01|1992-11-25|1993-01-16|DELIVER IN PERSON|MAIL|telets affix blithely ironic asymp +30913|1601|84|5|29|43575.40|0.01|0.04|A|F|1992-12-23|1992-11-12|1993-01-13|NONE|FOB| outside the busily final requ +30913|1967|56|6|48|89710.08|0.09|0.06|A|F|1992-12-13|1992-12-16|1992-12-30|NONE|SHIP|s wake quietly final +30913|1050|51|7|9|8559.45|0.05|0.04|R|F|1992-12-18|1992-11-17|1993-01-05|COLLECT COD|RAIL| boldly special foxes haggle daringly furi +30914|896|97|1|50|89844.50|0.06|0.01|N|O|1997-07-17|1997-07-15|1997-08-05|TAKE BACK RETURN|FOB|es. blithely f +30915|1155|64|1|50|52807.50|0.03|0.05|A|F|1994-03-22|1994-02-22|1994-04-13|NONE|FOB|unusual foxes. fina +30915|1032|33|2|21|19593.63|0.05|0.03|R|F|1994-03-14|1994-03-06|1994-03-15|COLLECT COD|SHIP|uctions ca +30915|713|10|3|9|14523.39|0.10|0.08|R|F|1994-01-30|1994-03-03|1994-02-25|COLLECT COD|REG AIR|r the special sentiment +30915|1833|63|4|26|45105.58|0.01|0.02|A|F|1994-03-04|1994-03-26|1994-03-25|DELIVER IN PERSON|SHIP|ions haggle slyly sp +30915|1808|95|5|22|37615.60|0.10|0.08|A|F|1994-01-24|1994-04-04|1994-02-23|TAKE BACK RETURN|MAIL|ously unusual requests +30916|1351|52|1|18|22542.30|0.03|0.02|R|F|1994-10-30|1994-09-18|1994-11-02|DELIVER IN PERSON|RAIL|special deposits haggle careful +30916|1811|12|2|14|23979.34|0.01|0.00|A|F|1994-08-10|1994-09-04|1994-08-11|COLLECT COD|MAIL|ptotes use blithely. accounts are above t +30917|842|43|1|16|27885.44|0.07|0.07|R|F|1993-12-06|1994-01-13|1993-12-23|NONE|AIR|ng the quickly ironic f +30917|1648|72|2|41|63535.24|0.07|0.05|A|F|1994-01-25|1993-12-24|1994-02-04|TAKE BACK RETURN|RAIL| against the +30917|1875|76|3|15|26653.05|0.09|0.06|R|F|1993-11-20|1994-01-09|1993-11-22|COLLECT COD|RAIL|gs. fluffily special deposits are furiousl +30917|1075|46|4|22|21473.54|0.02|0.06|R|F|1993-11-15|1993-12-07|1993-12-06|NONE|TRUCK|lithely pending instruc +30917|398|99|5|27|35056.53|0.06|0.00|R|F|1994-01-09|1994-01-22|1994-01-15|COLLECT COD|RAIL| according to the fur +30918|1833|20|1|5|8674.15|0.09|0.07|N|O|1996-03-03|1996-01-25|1996-03-14|NONE|REG AIR|against the furiousl +30919|1893|37|1|43|77180.27|0.01|0.01|R|F|1992-11-20|1992-12-04|1992-11-24|DELIVER IN PERSON|SHIP|oss the even depende +30919|1233|34|2|31|35161.13|0.08|0.08|R|F|1992-12-04|1992-12-03|1992-12-25|DELIVER IN PERSON|MAIL|ep furiously. slyly express t +30919|178|57|3|46|49595.82|0.03|0.03|A|F|1992-12-03|1992-11-03|1992-12-31|NONE|FOB|evenly ironic accounts. regular ideas use a +30919|1181|90|4|19|20561.42|0.03|0.08|R|F|1993-01-19|1992-11-06|1993-02-03|NONE|SHIP|uickly regular ideas cajole after the +30944|45|96|1|47|44416.88|0.02|0.02|N|O|1995-09-27|1995-08-03|1995-10-11|COLLECT COD|FOB|k platelets nag. slyly regular instructio +30944|434|35|2|16|21350.88|0.08|0.03|N|O|1995-10-01|1995-09-03|1995-10-25|TAKE BACK RETURN|AIR|egular theodolites. express packages sle +30944|1964|65|3|15|27989.40|0.03|0.06|N|O|1995-09-17|1995-08-14|1995-09-24|TAKE BACK RETURN|REG AIR|ts after the slyly pending packages cajol +30944|732|33|4|3|4898.19|0.08|0.00|N|O|1995-07-07|1995-08-30|1995-07-11|NONE|AIR|theodolites. furiously iro +30944|1480|81|5|48|66311.04|0.07|0.03|N|O|1995-10-04|1995-07-31|1995-10-25|NONE|TRUCK|p regular dependencies. fluffily regular +30944|817|18|6|17|29202.77|0.09|0.05|N|O|1995-07-21|1995-08-29|1995-07-31|NONE|TRUCK|ons affix above the fluf +30944|759|24|7|5|8298.75|0.00|0.03|N|O|1995-09-27|1995-08-20|1995-10-20|TAKE BACK RETURN|AIR|ily final accounts. even, final epitaphs +30945|881|82|1|35|62365.80|0.05|0.05|R|F|1994-10-23|1994-11-12|1994-11-08|NONE|AIR|e fluffily pending dependencies. exp +30945|451|10|2|38|51355.10|0.07|0.07|A|F|1994-10-03|1994-10-21|1994-10-04|NONE|REG AIR|haggle carefully. quickly ironic acco +30945|1057|63|3|8|7664.40|0.09|0.06|A|F|1994-10-27|1994-10-21|1994-11-12|DELIVER IN PERSON|SHIP| final req +30946|1531|52|1|22|31515.66|0.02|0.07|A|F|1994-08-08|1994-06-24|1994-09-02|DELIVER IN PERSON|FOB|l ideas. always ir +30947|1868|55|1|44|77873.84|0.09|0.02|A|F|1993-09-26|1993-08-29|1993-10-26|COLLECT COD|AIR|ly across the r +30947|592|53|2|20|29851.80|0.03|0.04|R|F|1993-08-25|1993-09-05|1993-08-30|TAKE BACK RETURN|REG AIR| theodolites run sl +30947|1823|24|3|2|3449.64|0.06|0.06|A|F|1993-08-19|1993-09-04|1993-09-08|TAKE BACK RETURN|AIR|ng the quickly i +30947|1767|52|4|20|33375.20|0.01|0.05|A|F|1993-08-28|1993-08-16|1993-09-11|COLLECT COD|TRUCK|uickly among the bold instructions. flu +30947|1531|32|5|11|15757.83|0.06|0.00|A|F|1993-09-22|1993-08-25|1993-10-18|NONE|FOB|ily final ideas: bravely regula +30948|488|76|1|10|13884.80|0.03|0.05|N|O|1996-12-08|1996-11-13|1996-12-15|COLLECT COD|AIR|fy packages nag blith +30949|997|66|1|42|79715.58|0.03|0.08|A|F|1992-04-27|1992-03-09|1992-05-19|DELIVER IN PERSON|SHIP|ffily accor +30949|1488|6|2|44|61137.12|0.01|0.06|A|F|1992-05-29|1992-04-05|1992-06-14|NONE|SHIP|ounts! regular, regular foxes cajole. ev +30949|507|8|3|10|14075.00|0.06|0.00|A|F|1992-02-15|1992-04-24|1992-02-16|COLLECT COD|SHIP|haggle. carefully daring +30950|1797|98|1|43|73047.97|0.10|0.04|N|O|1996-01-17|1996-01-16|1996-02-04|COLLECT COD|REG AIR| unusual depo +30950|639|2|2|8|12317.04|0.01|0.04|N|O|1996-02-28|1996-02-06|1996-03-28|NONE|SHIP|s. blithely ironic deposits sleep slyly re +30950|84|85|3|7|6888.56|0.02|0.03|N|O|1996-03-14|1996-01-14|1996-03-29|TAKE BACK RETURN|AIR|, regular pinto beans af +30951|1887|17|1|35|62610.80|0.05|0.02|N|O|1996-09-04|1996-09-03|1996-09-06|DELIVER IN PERSON|TRUCK|gle fluffily express theodolit +30976|872|73|1|2|3545.74|0.00|0.05|A|F|1993-01-05|1993-01-01|1993-01-21|TAKE BACK RETURN|MAIL|oost. final pinto beans s +30976|1873|3|2|32|56795.84|0.01|0.06|A|F|1992-12-31|1992-12-18|1993-01-03|TAKE BACK RETURN|TRUCK|nal excuses above the in +30977|1040|11|1|23|21643.92|0.05|0.06|N|O|1996-09-14|1996-09-13|1996-09-25|DELIVER IN PERSON|RAIL|. requests wa +30977|1960|5|2|33|61444.68|0.08|0.02|N|O|1996-07-12|1996-09-02|1996-08-05|COLLECT COD|FOB|e furiously regular packages. slyly ironic +30977|1545|66|3|39|56415.06|0.07|0.07|N|O|1996-06-30|1996-08-22|1996-07-04|COLLECT COD|SHIP|ze according to the thinly regu +30978|662|94|1|3|4687.98|0.04|0.06|N|O|1996-09-27|1996-09-11|1996-10-11|TAKE BACK RETURN|MAIL|e blithely according +30978|1963|64|2|26|48488.96|0.00|0.06|N|O|1996-10-04|1996-08-18|1996-10-27|COLLECT COD|TRUCK|nic packages run slyly slyly expr +30978|667|99|3|4|6270.64|0.08|0.01|N|O|1996-07-11|1996-08-20|1996-07-24|COLLECT COD|FOB| the careful +30979|2000|45|1|23|20746.00|0.03|0.00|A|F|1994-06-14|1994-05-07|1994-07-01|DELIVER IN PERSON|TRUCK|above the bold platelets are furiously fin +30979|1400|77|2|28|36439.20|0.03|0.00|R|F|1994-03-29|1994-05-02|1994-04-11|TAKE BACK RETURN|SHIP|the slyly quick deposits haggle caref +30980|46|72|1|14|13244.56|0.00|0.01|N|O|1995-10-21|1995-11-05|1995-11-07|DELIVER IN PERSON|MAIL|s boost. final, +30980|1027|28|2|44|40832.88|0.02|0.04|N|O|1995-11-18|1995-11-11|1995-12-03|DELIVER IN PERSON|MAIL|ccounts. even requests sle +30980|1270|71|3|8|9370.16|0.05|0.06|N|O|1995-09-01|1995-10-17|1995-09-03|NONE|AIR|ual foxes. fluffily express foxes detect +30981|1684|85|1|45|71355.60|0.10|0.08|R|F|1995-03-09|1995-05-05|1995-03-28|COLLECT COD|REG AIR|y special courts. furiously +30981|1968|57|2|17|31789.32|0.10|0.06|A|F|1995-02-23|1995-05-07|1995-03-11|TAKE BACK RETURN|TRUCK|counts hinder slyly. accounts according to +30981|1514|55|3|21|29725.71|0.06|0.01|R|F|1995-04-28|1995-05-01|1995-05-16|COLLECT COD|REG AIR|tes. furiously ironic courts cajole b +30981|285|40|4|45|53337.60|0.04|0.07|R|F|1995-06-04|1995-04-21|1995-06-09|DELIVER IN PERSON|MAIL|ar, unusual packages a +30981|822|23|5|15|25842.30|0.03|0.07|A|F|1995-03-05|1995-04-05|1995-04-04|TAKE BACK RETURN|FOB|special deposits w +30981|1079|15|6|48|47043.36|0.02|0.06|A|F|1995-04-24|1995-04-29|1995-05-24|COLLECT COD|SHIP|e. slyly express +30982|1725|68|1|47|76455.84|0.06|0.06|N|O|1997-04-17|1997-04-15|1997-04-24|COLLECT COD|MAIL|ds across the carefully special +30983|740|41|1|23|37737.02|0.06|0.03|N|O|1998-04-18|1998-06-01|1998-05-12|COLLECT COD|TRUCK|ons about the blithely unu +30983|1595|36|2|38|56870.42|0.01|0.08|N|O|1998-06-19|1998-06-19|1998-07-09|COLLECT COD|RAIL|ithely quiet sauternes +30983|1341|42|3|50|62117.00|0.10|0.04|N|O|1998-07-10|1998-05-30|1998-07-18|TAKE BACK RETURN|TRUCK|riously special accounts. blithely +30983|1569|10|4|13|19117.28|0.05|0.04|N|O|1998-04-10|1998-04-22|1998-05-07|NONE|SHIP|al ideas cajole ironic, final in +30983|1700|83|5|50|80085.00|0.08|0.04|N|O|1998-05-30|1998-04-25|1998-06-15|COLLECT COD|TRUCK|n pinto beans about the special, even pa +31008|1403|43|1|37|48262.80|0.04|0.08|N|O|1998-03-30|1998-03-25|1998-04-10|DELIVER IN PERSON|RAIL|g deposits. slyly +31008|45|96|2|50|47252.00|0.04|0.03|N|O|1998-03-25|1998-03-18|1998-03-27|COLLECT COD|TRUCK| accounts sleep quick +31008|1867|54|3|24|42452.64|0.07|0.07|N|O|1998-01-28|1998-02-14|1998-02-12|NONE|FOB|ecial theod +31009|1361|62|1|29|36608.44|0.01|0.00|N|O|1997-08-09|1997-07-04|1997-08-23|NONE|RAIL| around the carefully regular packages ha +31009|873|74|2|16|28381.92|0.08|0.06|N|O|1997-08-20|1997-08-13|1997-09-15|COLLECT COD|FOB|of the quickly regular requests. special +31009|1360|37|3|34|42886.24|0.09|0.08|N|O|1997-07-12|1997-07-31|1997-07-27|NONE|MAIL|efully. quickly even r +31009|1746|47|4|25|41193.50|0.01|0.07|N|O|1997-08-17|1997-08-04|1997-09-09|TAKE BACK RETURN|AIR|s above the ideas wake despite the slyly i +31010|537|38|1|9|12937.77|0.09|0.06|N|O|1997-02-09|1997-02-22|1997-03-08|TAKE BACK RETURN|FOB|gular theodolites. ironic r +31010|902|71|2|25|45072.50|0.09|0.01|N|O|1997-04-26|1997-04-04|1997-05-08|COLLECT COD|SHIP|pending packages haggle fluffi +31010|1974|19|3|3|5627.91|0.02|0.01|N|O|1997-05-02|1997-04-16|1997-05-16|COLLECT COD|RAIL| slyly regular req +31011|1072|8|1|19|18488.33|0.01|0.03|A|F|1994-11-28|1995-02-12|1994-12-20|TAKE BACK RETURN|TRUCK| serve sometimes blithely final rea +31011|1406|24|2|24|31377.60|0.01|0.05|A|F|1995-02-01|1995-01-22|1995-02-05|COLLECT COD|AIR|nic accounts. furiously silent ti +31012|1193|66|1|34|37202.46|0.10|0.05|N|O|1997-09-06|1997-08-29|1997-09-12|DELIVER IN PERSON|REG AIR|silent instructions cajole +31012|781|46|2|17|28590.26|0.08|0.00|N|O|1997-10-06|1997-09-05|1997-10-17|NONE|RAIL|eodolites. +31012|88|14|3|14|13833.12|0.03|0.04|N|O|1997-08-08|1997-10-02|1997-08-28|TAKE BACK RETURN|RAIL|refully idle packages +31012|650|13|4|32|49620.80|0.10|0.08|N|O|1997-07-23|1997-09-28|1997-08-02|DELIVER IN PERSON|AIR|sly even ideas. furiously close package +31013|524|85|1|32|45584.64|0.00|0.01|N|O|1996-12-17|1996-11-17|1996-12-20|NONE|RAIL| after the busily final +31013|353|38|2|4|5013.40|0.05|0.07|N|O|1997-02-08|1996-12-21|1997-03-05|NONE|REG AIR|pending request +31013|26|52|3|45|41670.90|0.04|0.02|N|O|1996-11-25|1996-11-28|1996-12-03|COLLECT COD|RAIL|s haggle final packages. furi +31013|668|100|4|38|59609.08|0.01|0.06|N|O|1996-11-09|1996-12-09|1996-11-16|DELIVER IN PERSON|REG AIR|across the slyly even accou +31013|176|3|5|5|5380.85|0.01|0.03|N|O|1997-01-08|1996-11-25|1997-01-31|DELIVER IN PERSON|REG AIR|deas nag according to the u +31014|1400|39|1|39|50754.60|0.05|0.03|N|O|1998-04-17|1998-04-05|1998-05-14|COLLECT COD|FOB|al platelets caj +31014|1433|51|2|35|46705.05|0.04|0.03|N|O|1998-03-02|1998-02-14|1998-03-04|COLLECT COD|REG AIR|deas. silent theodolites detect. fluffil +31014|1641|83|3|33|50907.12|0.01|0.01|N|O|1998-03-09|1998-02-15|1998-04-02|NONE|REG AIR|se furiously bravely ironic packages? caref +31014|1283|95|4|34|40265.52|0.10|0.02|N|O|1998-01-17|1998-03-07|1998-02-12|TAKE BACK RETURN|MAIL|bold instructions are blithely. slyly bol +31014|1124|33|5|16|16401.92|0.05|0.03|N|O|1998-04-17|1998-04-06|1998-04-29|NONE|TRUCK|ake fluffily against the blithe +31015|1452|70|1|23|31129.35|0.01|0.05|R|F|1993-03-27|1993-04-05|1993-04-05|COLLECT COD|MAIL| deposits wake quickly. ironi +31015|1499|78|2|4|5601.96|0.05|0.04|R|F|1993-03-18|1993-03-20|1993-04-01|DELIVER IN PERSON|SHIP| nag blithely. +31015|1270|71|3|7|8198.89|0.00|0.08|R|F|1993-04-18|1993-03-13|1993-05-15|NONE|MAIL|ckages use slyly regular d +31015|1562|3|4|4|5854.24|0.02|0.05|R|F|1993-04-06|1993-03-14|1993-04-22|NONE|TRUCK|uffily regular asymptotes cajole sl +31015|1418|97|5|12|15832.92|0.04|0.07|A|F|1993-05-08|1993-03-05|1993-05-25|COLLECT COD|MAIL|against the furiously special dependencies +31015|672|73|6|7|11008.69|0.08|0.02|R|F|1993-02-09|1993-04-11|1993-02-24|NONE|AIR| furiously e +31040|454|42|1|4|5417.80|0.02|0.03|A|F|1993-12-28|1993-11-20|1994-01-06|TAKE BACK RETURN|FOB|e furiously at the slyly ent +31040|676|39|2|41|64643.47|0.04|0.06|R|F|1993-10-26|1993-10-24|1993-11-09|DELIVER IN PERSON|REG AIR|ffily even requests. f +31040|813|47|3|41|70266.21|0.07|0.00|R|F|1993-09-17|1993-11-07|1993-10-08|TAKE BACK RETURN|TRUCK|refully special instructions. slyly speci +31040|1400|1|4|29|37740.60|0.01|0.02|A|F|1993-12-26|1993-11-26|1994-01-06|DELIVER IN PERSON|SHIP|. even, regular attainments above the +31040|1250|88|5|27|31083.75|0.03|0.00|A|F|1993-12-17|1993-11-09|1994-01-08|TAKE BACK RETURN|TRUCK|ss foxes. bravely bold instructions sleep +31040|1736|37|6|31|50769.63|0.02|0.07|A|F|1993-09-29|1993-11-11|1993-10-19|NONE|AIR| requests wake furiously +31041|1850|94|1|46|80585.10|0.00|0.08|N|O|1998-01-01|1998-01-26|1998-01-14|COLLECT COD|TRUCK|ular instructions cajole blithely. deposits +31042|1709|36|1|36|57985.20|0.08|0.03|R|F|1993-02-13|1993-01-13|1993-03-09|DELIVER IN PERSON|TRUCK|unts grow furiously furiously unusual packa +31042|1583|64|2|43|63836.94|0.10|0.00|R|F|1992-12-02|1993-02-03|1992-12-30|DELIVER IN PERSON|RAIL|s. carefully regular d +31042|656|19|3|14|21793.10|0.04|0.08|A|F|1992-12-26|1993-01-31|1992-12-27|NONE|FOB|st regular deposits. caref +31043|1621|45|1|12|18271.44|0.01|0.05|R|F|1994-10-07|1994-09-22|1994-10-23|NONE|AIR|ly even sheaves a +31043|304|61|2|49|59010.70|0.05|0.05|A|F|1994-08-15|1994-09-24|1994-08-27|TAKE BACK RETURN|REG AIR|ding instructions wake blithely pending p +31044|328|57|1|47|57731.04|0.08|0.00|A|F|1993-02-21|1993-02-11|1993-02-26|NONE|FOB|y furiously pending sheave +31045|1008|9|1|33|29997.00|0.02|0.08|N|O|1996-04-02|1996-05-05|1996-04-06|DELIVER IN PERSON|TRUCK|unts along the unusual, busy instr +31045|1458|59|2|23|31267.35|0.03|0.08|N|O|1996-04-28|1996-04-09|1996-05-10|NONE|REG AIR| silently final ideas i +31045|672|35|3|11|17299.37|0.09|0.00|N|O|1996-04-10|1996-04-28|1996-05-08|COLLECT COD|FOB| theodolites. carefully ironic d +31045|1044|50|4|20|18900.80|0.05|0.08|N|O|1996-04-23|1996-05-10|1996-05-04|DELIVER IN PERSON|TRUCK|dly furiously ironic deposits. eve +31046|1444|62|1|50|67272.00|0.06|0.07|A|F|1995-05-16|1995-03-14|1995-05-19|NONE|FOB|st among the furiously bold gifts +31046|344|73|2|25|31108.50|0.02|0.00|A|F|1995-05-07|1995-04-17|1995-05-22|NONE|SHIP|nal deposits are idl +31046|858|25|3|14|24623.90|0.09|0.04|R|F|1995-06-07|1995-05-09|1995-06-14|COLLECT COD|REG AIR| express instructions +31046|1742|69|4|9|14793.66|0.02|0.02|R|F|1995-03-02|1995-04-05|1995-03-16|NONE|FOB|permanently ironic requests sleep some +31046|228|29|5|23|25949.06|0.00|0.01|R|F|1995-02-19|1995-04-06|1995-03-04|TAKE BACK RETURN|FOB|fully bold deposits boost after th +31046|560|21|6|32|46737.92|0.02|0.06|R|F|1995-04-17|1995-04-05|1995-05-04|TAKE BACK RETURN|RAIL|ns wake against the blithely pending a +31046|1611|35|7|23|34790.03|0.05|0.07|A|F|1995-05-06|1995-04-02|1995-05-30|DELIVER IN PERSON|REG AIR|s. final, slow the +31047|334|19|1|45|55544.85|0.01|0.08|N|O|1997-08-10|1997-07-22|1997-09-04|TAKE BACK RETURN|AIR| accounts. final dependencies +31047|1997|98|2|8|15191.92|0.05|0.00|N|O|1997-07-18|1997-08-04|1997-07-30|COLLECT COD|SHIP|olites. regular packages among the silent +31047|1763|90|3|17|28300.92|0.03|0.00|N|O|1997-07-18|1997-08-02|1997-07-29|DELIVER IN PERSON|RAIL|al deposits. fluffy ideas promise careful +31047|1953|98|4|50|92747.50|0.10|0.04|N|O|1997-09-08|1997-06-23|1997-10-03|DELIVER IN PERSON|RAIL|urts sleep slyly since the furious +31047|957|26|5|20|37159.00|0.04|0.07|N|O|1997-08-04|1997-08-02|1997-08-23|COLLECT COD|TRUCK| nag blithely according to the de +31047|1665|7|6|25|39166.50|0.04|0.08|N|O|1997-06-09|1997-07-31|1997-06-24|NONE|AIR|ronic asymptote +31072|935|4|1|28|51406.04|0.10|0.02|A|F|1993-12-30|1994-01-18|1994-01-17|TAKE BACK RETURN|RAIL|uriously thin pinto beans. blithely +31073|1925|26|1|42|76730.64|0.02|0.01|A|F|1993-08-23|1993-10-23|1993-09-01|TAKE BACK RETURN|REG AIR|the furiously re +31073|1380|19|2|32|41004.16|0.03|0.08|A|F|1993-09-04|1993-09-10|1993-09-18|DELIVER IN PERSON|FOB|thely pending deposits after +31073|488|89|3|13|18050.24|0.06|0.06|A|F|1993-08-24|1993-09-04|1993-09-17|TAKE BACK RETURN|MAIL|s above the furious +31073|1552|73|4|37|53781.35|0.06|0.03|A|F|1993-10-07|1993-08-25|1993-10-13|NONE|AIR|arls. final gifts along the fur +31073|1421|39|5|25|33060.50|0.07|0.07|R|F|1993-09-17|1993-10-22|1993-10-14|COLLECT COD|REG AIR|tealthy dependencies. +31074|667|99|1|38|59571.08|0.04|0.00|N|O|1997-08-20|1997-05-24|1997-09-15|COLLECT COD|RAIL| the requests sl +31074|1952|85|2|3|5561.85|0.02|0.04|N|O|1997-06-30|1997-06-12|1997-07-13|TAKE BACK RETURN|FOB|uffily ironic +31074|1788|15|3|44|74350.32|0.04|0.08|N|O|1997-08-17|1997-05-24|1997-08-21|NONE|RAIL|refully ironic deposits wake. even a +31074|576|67|4|14|20671.98|0.04|0.04|N|O|1997-07-07|1997-07-06|1997-07-22|DELIVER IN PERSON|MAIL|s; slyly regular dep +31074|388|73|5|41|52823.58|0.08|0.04|N|O|1997-06-14|1997-05-29|1997-07-12|NONE|SHIP|n foxes haggle slyly special pearl +31075|629|23|1|32|48947.84|0.00|0.02|N|O|1995-09-19|1995-11-06|1995-10-12|COLLECT COD|RAIL|he slyly silent foxes. blithely +31075|531|92|2|26|37219.78|0.01|0.06|N|O|1995-11-17|1995-11-23|1995-12-04|TAKE BACK RETURN|AIR|ly pending accounts. quickly final +31076|1131|32|1|1|1032.13|0.10|0.03|R|F|1992-07-25|1992-09-30|1992-07-28|NONE|TRUCK|ouches. ironic warhorses m +31076|951|54|2|11|20371.45|0.00|0.05|R|F|1992-07-31|1992-10-16|1992-08-20|COLLECT COD|REG AIR|ly bold deposits sleep ab +31077|1106|43|1|1|1007.10|0.08|0.08|A|F|1994-01-24|1994-01-17|1994-02-21|COLLECT COD|FOB|inst the packa +31077|958|27|2|15|27884.25|0.10|0.08|A|F|1993-11-01|1994-01-10|1993-11-24|COLLECT COD|AIR|furiously! deposits nag +31078|173|74|1|27|28975.59|0.10|0.01|R|F|1994-05-14|1994-05-12|1994-06-07|DELIVER IN PERSON|MAIL|ctions use. special, regular requests pri +31078|1928|17|2|45|82346.40|0.04|0.06|A|F|1994-03-11|1994-05-07|1994-03-12|COLLECT COD|TRUCK|tions use from the slyly exp +31079|1308|23|1|2|2418.60|0.00|0.03|N|O|1995-09-15|1995-10-30|1995-09-25|DELIVER IN PERSON|MAIL|yly pending requests. slyly special pint +31104|184|63|1|32|34693.76|0.10|0.04|N|O|1997-05-22|1997-04-29|1997-06-15|DELIVER IN PERSON|MAIL|furiously. furiously enticing +31105|121|22|1|24|24506.88|0.00|0.03|N|O|1996-06-18|1996-08-14|1996-07-13|DELIVER IN PERSON|MAIL|sts sleep furiously +31105|118|45|2|30|30543.30|0.02|0.01|N|O|1996-09-09|1996-08-24|1996-10-07|NONE|MAIL|side of the slyly even ac +31105|1633|34|3|38|58315.94|0.04|0.05|N|O|1996-09-28|1996-09-09|1996-10-13|DELIVER IN PERSON|AIR|ithely sly pac +31105|716|13|4|3|4850.13|0.09|0.07|N|O|1996-10-04|1996-09-05|1996-10-06|COLLECT COD|RAIL|eas was packages. furiously ironic re +31105|800|33|5|44|74835.20|0.05|0.03|N|O|1996-10-13|1996-09-01|1996-11-12|TAKE BACK RETURN|RAIL|eep. silent packages wake b +31106|1375|52|1|20|25527.40|0.05|0.05|A|F|1992-04-25|1992-03-20|1992-05-24|TAKE BACK RETURN|AIR|yers wake fluffily special pinto beans; b +31106|1492|10|2|50|69674.50|0.07|0.03|R|F|1992-03-29|1992-04-01|1992-04-18|TAKE BACK RETURN|AIR|l dinos above the slyly +31106|1595|36|3|9|13469.31|0.09|0.03|A|F|1992-02-28|1992-04-30|1992-03-12|COLLECT COD|FOB|refully bold accounts. furi +31106|1027|33|4|15|13920.30|0.08|0.06|A|F|1992-02-27|1992-03-19|1992-03-17|DELIVER IN PERSON|MAIL|longside of the instructions. even, +31106|1645|87|5|28|43305.92|0.06|0.00|R|F|1992-02-27|1992-03-26|1992-03-17|TAKE BACK RETURN|AIR| foxes integrate carefully quickly bold de +31106|1804|34|6|48|81878.40|0.06|0.01|A|F|1992-06-17|1992-04-24|1992-06-18|COLLECT COD|AIR|omas. regular courts ab +31106|1778|21|7|21|35275.17|0.00|0.01|R|F|1992-03-05|1992-05-09|1992-03-12|DELIVER IN PERSON|REG AIR| slyly express deposits haggle. pending +31107|1477|56|1|24|33083.28|0.02|0.08|A|F|1993-10-08|1993-09-22|1993-10-23|DELIVER IN PERSON|RAIL|carefully even accounts. blithel +31107|1238|76|2|33|37594.59|0.09|0.03|A|F|1993-10-10|1993-09-05|1993-11-04|TAKE BACK RETURN|REG AIR|s boost bl +31108|1386|25|1|50|64369.00|0.04|0.05|A|F|1994-11-27|1994-10-22|1994-11-30|DELIVER IN PERSON|AIR| slyly enticing +31108|1660|84|2|9|14054.94|0.04|0.08|R|F|1994-10-19|1994-10-31|1994-11-07|TAKE BACK RETURN|TRUCK| silent deposits boost thinly requests +31108|131|84|3|22|22684.86|0.08|0.04|R|F|1994-11-20|1994-09-28|1994-11-28|COLLECT COD|RAIL|lly bold acco +31108|1839|69|4|12|20889.96|0.05|0.00|A|F|1994-11-15|1994-09-28|1994-11-24|COLLECT COD|MAIL|riously de +31109|726|59|1|5|8133.60|0.02|0.07|N|O|1996-02-27|1996-01-02|1996-03-14|NONE|FOB| packages cajole above the quietly +31109|911|12|2|14|25366.74|0.08|0.02|N|O|1995-11-23|1995-12-20|1995-12-14|NONE|TRUCK|l, permanent platelets would +31109|819|19|3|34|58473.54|0.09|0.07|N|O|1996-01-12|1995-12-31|1996-01-14|DELIVER IN PERSON|AIR|xcuses. slyly express packages nag. c +31109|723|56|4|44|71443.68|0.07|0.04|N|O|1995-12-23|1995-12-04|1996-01-03|NONE|MAIL|le slyly along the sly, blithe de +31110|1329|6|1|26|31988.32|0.00|0.02|N|O|1997-03-30|1997-02-22|1997-04-27|NONE|RAIL|are along the foxes. special excuses +31110|81|82|2|11|10791.88|0.03|0.07|N|O|1997-03-08|1997-02-08|1997-04-06|TAKE BACK RETURN|TRUCK|ar accounts mold furiously: re +31110|1252|27|3|19|21911.75|0.00|0.04|N|O|1997-03-21|1997-03-01|1997-04-03|DELIVER IN PERSON|MAIL|nding foxes. slyly express request +31110|1601|84|4|35|52591.00|0.01|0.02|N|O|1997-02-24|1997-02-25|1997-02-28|COLLECT COD|AIR|inal ideas cajole careful +31111|1303|42|1|29|34924.70|0.09|0.06|A|F|1994-11-18|1994-10-11|1994-12-12|COLLECT COD|REG AIR|y express theodolites run. regular, even +31111|1125|62|2|15|15391.80|0.01|0.04|R|F|1994-10-12|1994-10-15|1994-10-18|NONE|FOB|c, ironic deposits. furiou +31111|1037|8|3|32|30016.96|0.08|0.06|A|F|1994-11-17|1994-11-11|1994-11-18|NONE|FOB|ly according to the blithely bol +31111|1754|55|4|35|57951.25|0.06|0.03|A|F|1994-10-27|1994-10-25|1994-11-22|NONE|MAIL|packages. slyly regular asymptote +31111|1975|20|5|13|24400.61|0.09|0.06|R|F|1994-08-26|1994-10-10|1994-09-05|NONE|MAIL|gle. furiou +31111|1511|92|6|41|57912.91|0.08|0.04|A|F|1994-10-20|1994-10-27|1994-11-07|DELIVER IN PERSON|FOB|ts haggle ruthlessly. sly +31136|141|42|1|2|2082.28|0.07|0.05|N|O|1996-07-09|1996-06-04|1996-07-19|TAKE BACK RETURN|AIR|aggle boldly even pin +31136|321|78|2|6|7327.92|0.01|0.01|N|O|1996-06-22|1996-06-27|1996-07-07|DELIVER IN PERSON|FOB|s. careful +31137|565|26|1|35|51294.60|0.09|0.03|N|O|1997-03-06|1997-03-13|1997-03-11|COLLECT COD|AIR|tes nag around the thinly ex +31137|558|59|2|32|46673.60|0.09|0.05|N|O|1997-04-23|1997-03-29|1997-05-14|NONE|AIR|s attainments lose furiously final hock +31137|67|93|3|32|30945.92|0.07|0.06|N|O|1997-03-04|1997-03-15|1997-03-24|COLLECT COD|AIR|quests wake quickly +31137|518|79|4|4|5674.04|0.01|0.07|N|O|1997-04-28|1997-02-26|1997-05-14|TAKE BACK RETURN|FOB|s wake furiously carefully sile +31137|369|70|5|40|50774.40|0.10|0.00|N|O|1997-03-14|1997-04-22|1997-03-29|NONE|FOB|ourts eat furiously spec +31138|706|3|1|17|27313.90|0.01|0.03|R|F|1994-05-14|1994-03-27|1994-06-06|COLLECT COD|SHIP|press depende +31138|1114|23|2|3|3045.33|0.08|0.00|A|F|1994-04-23|1994-04-12|1994-05-03|NONE|MAIL| above the sly +31139|1999|88|1|9|17108.91|0.07|0.04|R|F|1994-03-04|1994-03-17|1994-03-12|TAKE BACK RETURN|RAIL|beans detect quickly against the b +31139|1265|40|2|11|12828.86|0.03|0.00|R|F|1994-01-26|1994-03-09|1994-02-21|COLLECT COD|AIR|ly finally final accounts. final +31139|51|27|3|30|28531.50|0.04|0.02|A|F|1994-04-06|1994-03-14|1994-05-04|COLLECT COD|RAIL|ickly ironic packages. slyl +31139|1345|84|4|15|18695.10|0.06|0.00|A|F|1994-02-23|1994-01-31|1994-02-25|COLLECT COD|FOB|e. pending, u +31139|401|31|5|37|48151.80|0.03|0.08|R|F|1994-01-08|1994-03-18|1994-02-02|COLLECT COD|MAIL|y express frays. ironic ideas haggl +31139|1057|28|6|38|36405.90|0.09|0.05|A|F|1994-01-17|1994-02-17|1994-01-24|NONE|MAIL|egular packages integrate. blithely unusu +31140|513|74|1|30|42405.30|0.05|0.06|A|F|1995-03-20|1995-04-04|1995-04-11|DELIVER IN PERSON|MAIL| accounts nag thin deposits. carefully +31141|93|69|1|41|40716.69|0.06|0.02|A|F|1992-09-17|1992-09-01|1992-10-14|DELIVER IN PERSON|MAIL|r ideas. slyly even req +31141|788|21|2|48|81061.44|0.02|0.06|R|F|1992-10-19|1992-08-13|1992-11-17|TAKE BACK RETURN|RAIL|ess accounts above the final instructions u +31141|1110|19|3|32|32355.52|0.06|0.07|R|F|1992-10-19|1992-08-25|1992-11-18|TAKE BACK RETURN|AIR|cies. furiously regular depos +31142|1766|9|1|32|53368.32|0.00|0.07|N|O|1997-03-07|1997-03-06|1997-04-03|NONE|FOB|ly express packages +31142|1555|36|2|44|64088.20|0.09|0.05|N|O|1997-04-28|1997-03-22|1997-05-18|NONE|SHIP|ounts cajole across the regular dep +31142|1699|41|3|2|3201.38|0.02|0.03|N|O|1997-01-31|1997-04-06|1997-02-26|DELIVER IN PERSON|REG AIR|onically regular +31143|712|45|1|9|14514.39|0.01|0.01|N|O|1996-12-26|1997-01-12|1997-01-04|DELIVER IN PERSON|MAIL|al packages. regul +31168|185|38|1|31|33640.58|0.04|0.00|R|F|1992-05-01|1992-04-10|1992-05-19|COLLECT COD|SHIP|efully ironic accounts. fu +31168|1952|41|2|16|29663.20|0.08|0.01|A|F|1992-04-10|1992-05-08|1992-04-27|NONE|FOB|s lose furiously requests. furious +31168|563|64|3|28|40979.68|0.02|0.06|R|F|1992-04-06|1992-05-04|1992-05-03|COLLECT COD|MAIL|ly against the care +31168|85|86|4|43|42358.44|0.05|0.05|A|F|1992-03-14|1992-04-19|1992-03-24|NONE|AIR|ress, permanent accounts +31169|563|24|1|47|68787.32|0.00|0.05|N|O|1995-08-20|1995-08-10|1995-08-25|TAKE BACK RETURN|RAIL|ully deposits. furiously even +31169|58|59|2|49|46944.45|0.01|0.05|N|O|1995-10-02|1995-07-24|1995-10-05|COLLECT COD|TRUCK| warthogs cajole quickly after the +31169|1303|80|3|15|18064.50|0.00|0.02|N|O|1995-09-21|1995-08-01|1995-10-02|NONE|RAIL|ic packages cajole carefully +31169|476|35|4|47|64694.09|0.07|0.05|N|O|1995-06-28|1995-07-10|1995-07-07|DELIVER IN PERSON|AIR| nag blithely across the express, f +31169|643|75|5|49|75638.36|0.00|0.01|N|O|1995-06-19|1995-08-27|1995-06-24|TAKE BACK RETURN|TRUCK|ly special foxes are +31169|237|92|6|28|31842.44|0.00|0.08|N|F|1995-06-13|1995-08-11|1995-07-08|TAKE BACK RETURN|TRUCK| platelets. blit +31170|34|10|1|30|28020.90|0.01|0.07|A|F|1992-05-21|1992-04-26|1992-05-30|NONE|TRUCK|uriously. furiously unusu +31170|1328|43|2|6|7375.92|0.05|0.04|A|F|1992-02-26|1992-04-17|1992-03-20|DELIVER IN PERSON|TRUCK|oxes cajole +31170|15|66|3|43|39345.43|0.05|0.06|A|F|1992-03-22|1992-03-10|1992-04-16|COLLECT COD|FOB|s whithout the pend +31170|110|63|4|6|6060.66|0.09|0.06|A|F|1992-05-11|1992-04-13|1992-05-26|DELIVER IN PERSON|FOB|lar packages. blithely fi +31170|821|88|5|12|20661.84|0.00|0.02|R|F|1992-05-27|1992-02-28|1992-06-22|NONE|SHIP|tes accord +31171|1502|23|1|29|40701.50|0.00|0.06|A|F|1994-07-01|1994-06-04|1994-07-22|TAKE BACK RETURN|AIR|even requests. theodolites unwind furious +31171|844|45|2|6|10469.04|0.10|0.07|R|F|1994-04-29|1994-06-03|1994-05-29|DELIVER IN PERSON|TRUCK|fy asymptotes unwind after the car +31171|1008|44|3|15|13635.00|0.05|0.01|R|F|1994-05-13|1994-06-01|1994-05-29|TAKE BACK RETURN|FOB|ld accounts detect qu +31171|775|40|4|9|15081.93|0.02|0.00|A|F|1994-04-29|1994-05-10|1994-05-28|TAKE BACK RETURN|MAIL|y ironic theodolites. blithely fina +31171|389|90|5|17|21919.46|0.06|0.07|A|F|1994-07-04|1994-05-17|1994-07-11|TAKE BACK RETURN|FOB|regular, bold +31172|1866|96|1|11|19446.46|0.04|0.04|N|O|1997-11-03|1997-12-03|1997-11-25|NONE|MAIL|excuses. even requests +31172|518|9|2|12|17022.12|0.06|0.02|N|O|1998-01-21|1997-12-22|1998-01-22|COLLECT COD|TRUCK| the slyly even p +31172|1377|92|3|16|20453.92|0.07|0.08|N|O|1998-02-02|1997-12-05|1998-03-02|TAKE BACK RETURN|RAIL|ely even, regular theodo +31172|1617|59|4|1|1518.61|0.06|0.06|N|O|1998-02-06|1998-01-15|1998-02-21|TAKE BACK RETURN|MAIL|fily even pinto beans. blith +31172|1048|19|5|31|29420.24|0.08|0.06|N|O|1997-12-31|1997-11-18|1998-01-03|COLLECT COD|REG AIR|aids affix. quickly ironic accounts n +31172|1555|96|6|13|18935.15|0.06|0.02|N|O|1998-02-06|1997-12-31|1998-02-21|COLLECT COD|FOB|ke above t +31173|1743|44|1|36|59210.64|0.09|0.05|A|F|1992-11-04|1992-11-06|1992-12-04|TAKE BACK RETURN|AIR|onic foxes. silent, regular ideas are. sl +31173|1571|92|2|11|16198.27|0.04|0.00|R|F|1992-09-10|1992-10-17|1992-09-15|DELIVER IN PERSON|MAIL|even packages hang slyly r +31173|1367|82|3|29|36782.44|0.08|0.08|A|F|1992-12-04|1992-11-01|1992-12-11|TAKE BACK RETURN|SHIP|as sleep carefully-- bli +31173|975|76|4|27|50651.19|0.01|0.04|R|F|1992-10-09|1992-11-07|1992-10-20|TAKE BACK RETURN|TRUCK|aggle against +31173|447|48|5|15|20211.60|0.01|0.00|A|F|1992-11-09|1992-10-12|1992-11-24|TAKE BACK RETURN|FOB| silent pinto beans nag slyly alon +31173|54|80|6|3|2862.15|0.08|0.06|A|F|1992-10-24|1992-09-18|1992-11-11|DELIVER IN PERSON|TRUCK| quickly thinly ironic pa +31173|863|63|7|20|35277.20|0.00|0.04|A|F|1992-09-28|1992-11-08|1992-10-10|COLLECT COD|MAIL|ng accounts +31174|78|4|1|25|24451.75|0.06|0.00|A|F|1994-03-28|1994-05-28|1994-04-11|COLLECT COD|SHIP|nic requests? carefully bold pinto be +31174|1788|89|2|27|45624.06|0.09|0.05|R|F|1994-05-27|1994-05-12|1994-06-25|COLLECT COD|MAIL| slyly against the regular, p +31174|1762|89|3|42|69877.92|0.09|0.01|A|F|1994-06-23|1994-06-18|1994-07-04|DELIVER IN PERSON|RAIL| carefully ironic instructions abov +31174|1079|15|4|6|5880.42|0.08|0.01|R|F|1994-06-03|1994-05-08|1994-06-10|DELIVER IN PERSON|FOB|ironic, fi +31174|1587|28|5|34|50611.72|0.07|0.01|R|F|1994-07-04|1994-05-27|1994-07-24|TAKE BACK RETURN|TRUCK| fluffily above +31174|1697|98|6|5|7993.45|0.08|0.01|A|F|1994-05-30|1994-05-22|1994-06-04|NONE|MAIL|ilent, regular theodolites. carefully bol +31175|1580|1|1|7|10371.06|0.05|0.02|R|F|1994-10-02|1994-11-17|1994-10-30|DELIVER IN PERSON|REG AIR|nic instructions are carefully f +31175|1799|42|2|47|79937.13|0.07|0.04|R|F|1994-11-14|1994-11-14|1994-11-20|TAKE BACK RETURN|REG AIR|lly ruthless platelets will have t +31175|1083|84|3|15|14761.20|0.01|0.06|R|F|1994-12-27|1994-11-19|1995-01-05|DELIVER IN PERSON|RAIL|ns across the regular f +31175|292|74|4|25|29807.25|0.04|0.04|R|F|1995-01-20|1994-11-13|1995-02-17|COLLECT COD|REG AIR|ackages wake about the s +31200|233|34|1|26|29463.98|0.01|0.08|N|O|1996-12-29|1996-11-02|1997-01-04|COLLECT COD|TRUCK|ans. blithely bold deposits sleep +31200|273|1|2|23|26985.21|0.01|0.05|N|O|1996-11-02|1996-11-09|1996-11-07|NONE|TRUCK|uctions. furiously pending deposits +31200|227|82|3|2|2254.44|0.00|0.08|N|O|1996-12-23|1996-10-12|1997-01-01|DELIVER IN PERSON|AIR|pendencies haggle +31200|672|4|4|38|59761.46|0.06|0.05|N|O|1996-10-12|1996-11-16|1996-11-10|DELIVER IN PERSON|REG AIR|ccounts. quickly pending e +31200|1933|22|5|1|1834.93|0.02|0.00|N|O|1996-11-18|1996-10-14|1996-11-27|DELIVER IN PERSON|MAIL|furiously i +31200|1853|40|6|16|28077.60|0.09|0.01|N|O|1996-11-25|1996-10-10|1996-12-10|TAKE BACK RETURN|TRUCK|egular decoys sleep. request +31200|713|46|7|14|22591.94|0.08|0.04|N|O|1996-11-08|1996-10-27|1996-11-12|COLLECT COD|REG AIR| ironic packages. slyly regular dependen +31201|1441|81|1|5|6712.20|0.07|0.06|N|O|1997-12-21|1997-12-29|1997-12-29|TAKE BACK RETURN|TRUCK|refully carefully +31202|918|19|1|29|52748.39|0.10|0.06|A|F|1993-05-20|1993-03-05|1993-05-25|TAKE BACK RETURN|REG AIR|ic ideas haggle carefully about the id +31203|78|29|1|36|35210.52|0.09|0.00|N|O|1997-10-26|1997-12-05|1997-11-16|COLLECT COD|REG AIR|ought to affi +31203|514|5|2|22|31119.22|0.01|0.08|N|O|1997-12-10|1997-12-15|1997-12-24|COLLECT COD|AIR|carefully bold ide +31204|524|85|1|48|68376.96|0.07|0.07|R|F|1993-11-08|1993-11-18|1993-11-11|COLLECT COD|REG AIR|haggle along the careful +31204|361|90|2|23|29011.28|0.09|0.04|A|F|1993-10-22|1993-10-03|1993-11-11|NONE|FOB|sly express packages cajole slyly a +31204|1469|70|3|9|12334.14|0.04|0.00|A|F|1993-09-24|1993-10-24|1993-10-07|TAKE BACK RETURN|RAIL|heodolites shall eat furiousl +31204|1842|43|4|35|61034.40|0.04|0.05|R|F|1993-08-25|1993-11-03|1993-09-14|COLLECT COD|REG AIR| deposits: blithely +31204|636|37|5|37|56855.31|0.00|0.06|R|F|1993-10-22|1993-10-13|1993-11-02|TAKE BACK RETURN|REG AIR|se sometimes against the regular attainme +31204|771|68|6|28|46809.56|0.00|0.04|A|F|1993-09-01|1993-09-28|1993-09-17|NONE|SHIP|ake slyly above the unusual +31205|1445|85|1|15|20196.60|0.08|0.03|N|O|1996-09-05|1996-10-19|1996-09-27|DELIVER IN PERSON|FOB| sleep-- express, final packages use +31205|1491|9|2|41|57092.09|0.04|0.08|N|O|1996-08-14|1996-09-22|1996-09-03|DELIVER IN PERSON|MAIL|ag. bold deposits haggle quickly +31205|561|92|3|17|24846.52|0.04|0.08|N|O|1996-08-07|1996-09-13|1996-08-13|COLLECT COD|RAIL|ly carefully bold ideas. furiously iron +31205|993|28|4|15|28409.85|0.09|0.00|N|O|1996-07-31|1996-09-01|1996-08-29|NONE|SHIP|s sleep across the bold accounts. +31205|1254|66|5|11|12707.75|0.00|0.01|N|O|1996-10-19|1996-10-25|1996-10-24|COLLECT COD|SHIP|ents maint +31205|1303|42|6|26|31311.80|0.10|0.08|N|O|1996-11-20|1996-09-22|1996-12-13|DELIVER IN PERSON|TRUCK| blithely pinto bean +31205|1466|6|7|7|9572.22|0.04|0.04|N|O|1996-11-16|1996-09-28|1996-11-30|COLLECT COD|FOB|ld requests. qu +31206|1169|70|1|43|46016.88|0.08|0.04|R|F|1993-04-30|1993-03-31|1993-05-02|DELIVER IN PERSON|REG AIR| orbits sleep abo +31206|922|91|2|37|67448.04|0.04|0.04|A|F|1993-05-07|1993-04-16|1993-06-02|COLLECT COD|RAIL|luffily blithely furious packages. +31207|1276|88|1|19|22368.13|0.10|0.01|A|F|1994-08-04|1994-08-03|1994-08-06|NONE|MAIL| the carefully regul +31207|581|42|2|18|26668.44|0.08|0.06|A|F|1994-08-08|1994-08-10|1994-08-24|TAKE BACK RETURN|FOB|ly quiet packages. final, regular +31232|203|31|1|19|20960.80|0.08|0.06|R|F|1992-11-26|1992-10-20|1992-12-10|DELIVER IN PERSON|MAIL|sits are blithely. furiously special reques +31232|1633|75|2|37|56781.31|0.06|0.07|A|F|1992-09-15|1992-09-30|1992-09-17|TAKE BACK RETURN|AIR|jole across the pending deposi +31232|1642|43|3|13|20067.32|0.04|0.07|R|F|1992-10-03|1992-10-05|1992-10-07|TAKE BACK RETURN|REG AIR|the carefully regular deposit +31232|1403|21|4|17|22174.80|0.08|0.07|A|F|1992-11-07|1992-11-26|1992-11-30|COLLECT COD|REG AIR|ts after the silent, ruthless deposits ca +31233|494|95|1|15|20917.35|0.03|0.06|N|O|1995-11-03|1995-11-06|1995-11-25|TAKE BACK RETURN|AIR|y ironic requests. reque +31233|290|18|2|33|39279.57|0.01|0.08|N|O|1995-11-30|1995-12-24|1995-12-16|DELIVER IN PERSON|SHIP|ts sublate regular, fluffy pa +31233|1732|75|3|35|57180.55|0.01|0.03|N|O|1995-11-11|1995-12-09|1995-12-07|NONE|MAIL|dle quickly about the fluffi +31233|1430|31|4|4|5325.72|0.10|0.01|N|O|1995-12-20|1995-12-09|1996-01-12|DELIVER IN PERSON|SHIP|ily regular foxes +31233|145|72|5|33|34489.62|0.07|0.01|N|O|1996-01-07|1995-12-02|1996-01-31|NONE|SHIP|ly express warhorse +31233|811|78|6|25|42795.25|0.03|0.03|N|O|1995-09-29|1995-11-26|1995-10-06|NONE|FOB|ully bold depos +31234|1706|49|1|35|56269.50|0.09|0.04|A|F|1995-02-20|1995-03-11|1995-03-13|NONE|REG AIR|ccounts nag furiously +31235|968|71|1|44|82234.24|0.07|0.04|N|O|1996-08-30|1996-09-22|1996-09-20|DELIVER IN PERSON|TRUCK|ly final deposits. fluffily +31235|411|99|2|1|1311.41|0.07|0.02|N|O|1996-11-24|1996-09-16|1996-12-10|DELIVER IN PERSON|REG AIR|he slyly close requests. carefully final +31235|281|82|3|22|25988.16|0.09|0.00|N|O|1996-10-19|1996-09-07|1996-11-12|COLLECT COD|RAIL|ly pending do +31235|1397|36|4|41|53233.99|0.02|0.01|N|O|1996-10-25|1996-10-19|1996-10-27|DELIVER IN PERSON|MAIL|r requests. bold, reg +31236|932|1|1|44|80648.92|0.06|0.00|N|O|1996-08-23|1996-09-13|1996-09-17|TAKE BACK RETURN|MAIL| furiously blithely regular r +31236|1742|43|2|33|54243.42|0.02|0.01|N|O|1996-10-02|1996-08-29|1996-10-08|COLLECT COD|RAIL|d the furiously express pack +31236|1095|66|3|7|6972.63|0.08|0.05|N|O|1996-07-08|1996-09-16|1996-07-23|COLLECT COD|REG AIR|y, final sentiments cajole slyly re +31236|1242|43|4|8|9145.92|0.02|0.05|N|O|1996-10-08|1996-09-15|1996-10-30|NONE|MAIL| express instructions kindle +31237|462|21|1|38|51773.48|0.05|0.02|N|O|1995-11-11|1995-09-26|1995-11-21|DELIVER IN PERSON|MAIL|arefully regular +31237|350|51|2|12|15004.20|0.01|0.03|N|O|1995-09-24|1995-09-15|1995-10-16|COLLECT COD|MAIL| sleep along the sl +31237|900|67|3|36|64832.40|0.01|0.02|N|O|1995-09-03|1995-10-02|1995-09-05|TAKE BACK RETURN|SHIP|he final foxes. blith +31237|720|17|4|16|25931.52|0.09|0.07|N|O|1995-11-18|1995-09-16|1995-12-18|DELIVER IN PERSON|TRUCK|uickly accor +31237|1003|4|5|19|17176.00|0.10|0.00|N|O|1995-10-02|1995-09-30|1995-10-20|COLLECT COD|TRUCK|ts haggle +31238|742|7|1|15|24641.10|0.02|0.00|A|F|1993-09-07|1993-09-24|1993-10-07|DELIVER IN PERSON|REG AIR|e furiously blithely silent th +31238|248|30|2|24|27557.76|0.03|0.01|R|F|1993-10-05|1993-09-28|1993-10-09|COLLECT COD|SHIP|ically blithe requests are furiously +31238|714|15|3|16|25835.36|0.05|0.06|A|F|1993-12-10|1993-10-05|1993-12-19|DELIVER IN PERSON|AIR|onic ideas wake slyly silent, +31238|1064|70|4|38|36672.28|0.10|0.05|A|F|1993-10-20|1993-11-14|1993-10-30|TAKE BACK RETURN|TRUCK|nal, unusual packag +31238|401|31|5|37|48151.80|0.01|0.05|R|F|1993-08-24|1993-09-22|1993-09-11|TAKE BACK RETURN|MAIL| slyly silent requests. final r +31238|108|9|6|3|3024.30|0.03|0.02|R|F|1993-10-18|1993-10-11|1993-11-09|TAKE BACK RETURN|MAIL|s. regular, unusual exc +31238|214|42|7|32|35654.72|0.10|0.07|R|F|1993-10-07|1993-11-09|1993-11-06|DELIVER IN PERSON|TRUCK|ts are fluffily +31239|1946|91|1|23|42502.62|0.06|0.02|A|F|1993-09-26|1993-10-14|1993-10-10|NONE|MAIL| along the reg +31239|676|39|2|27|42570.09|0.01|0.08|R|F|1993-10-11|1993-11-24|1993-10-20|COLLECT COD|FOB| deposits hinder special excuses. specia +31239|1266|4|3|7|8170.82|0.04|0.05|R|F|1993-12-20|1993-11-21|1993-12-25|COLLECT COD|RAIL|al requests. bold de +31239|1739|24|4|8|13125.84|0.06|0.08|R|F|1993-11-10|1993-10-12|1993-12-04|TAKE BACK RETURN|TRUCK|urts use regular depe +31239|1716|17|5|15|24265.65|0.03|0.03|R|F|1993-10-05|1993-10-13|1993-10-16|COLLECT COD|AIR|g the slyly stealth +31239|985|54|6|19|35833.62|0.06|0.00|A|F|1993-11-21|1993-10-18|1993-11-26|DELIVER IN PERSON|MAIL|ter the blithe +31239|1742|27|7|17|27943.58|0.01|0.01|A|F|1993-12-09|1993-10-24|1993-12-12|NONE|AIR|e furiously ir +31264|1665|89|1|3|4699.98|0.07|0.08|N|O|1997-09-26|1997-08-28|1997-10-09|COLLECT COD|TRUCK|leep furiously carefully ev +31264|531|92|2|27|38651.31|0.00|0.05|N|O|1997-08-09|1997-08-10|1997-08-22|DELIVER IN PERSON|FOB|s along the quickly regula +31265|299|100|1|48|57565.92|0.03|0.01|N|O|1996-11-13|1997-01-11|1996-12-06|COLLECT COD|AIR|its. blithely regular +31265|258|13|2|34|39380.50|0.04|0.06|N|O|1996-12-15|1996-12-19|1996-12-16|COLLECT COD|TRUCK|as cajole c +31265|1919|64|3|41|74657.31|0.00|0.04|N|O|1996-11-30|1997-01-25|1996-12-11|COLLECT COD|FOB| requests are blithely. slyly express id +31265|1014|20|4|34|31110.34|0.03|0.04|N|O|1996-12-05|1996-12-31|1996-12-06|COLLECT COD|FOB|ing, final accounts. special accounts hag +31265|495|96|5|11|15350.39|0.00|0.03|N|O|1996-10-30|1997-01-04|1996-11-29|COLLECT COD|RAIL|cording to the ironic accoun +31265|328|57|6|10|12283.20|0.03|0.02|N|O|1996-11-17|1996-12-15|1996-11-29|DELIVER IN PERSON|SHIP|ges. pending accounts hang furiou +31265|241|42|7|25|28531.00|0.05|0.01|N|O|1997-02-19|1996-12-26|1997-02-27|TAKE BACK RETURN|SHIP|ironic dolphins cajole blith +31266|313|42|1|18|21839.58|0.00|0.01|R|F|1992-12-08|1992-12-13|1992-12-18|DELIVER IN PERSON|MAIL| silent braids haggle quickly unusual +31266|631|25|2|30|45948.90|0.04|0.00|R|F|1992-10-27|1992-12-29|1992-11-07|NONE|SHIP| use furiously regular ideas. st +31266|1014|20|3|34|31110.34|0.00|0.03|A|F|1992-12-21|1992-12-06|1993-01-11|DELIVER IN PERSON|RAIL|ckages integrate carefully even plat +31267|529|20|1|8|11436.16|0.06|0.01|N|O|1997-03-06|1997-03-12|1997-03-17|DELIVER IN PERSON|SHIP|ously dogg +31267|111|12|2|12|12133.32|0.10|0.08|N|O|1997-02-12|1997-04-06|1997-02-25|DELIVER IN PERSON|RAIL|express theodolites use about the +31267|1812|99|3|16|27420.96|0.01|0.02|N|O|1997-04-13|1997-02-25|1997-04-28|TAKE BACK RETURN|TRUCK| the furiously pending excu +31268|382|83|1|21|26929.98|0.04|0.03|N|O|1995-07-22|1995-09-29|1995-08-07|NONE|RAIL|uests are +31268|649|50|2|28|43389.92|0.10|0.05|N|O|1995-08-16|1995-09-17|1995-09-09|DELIVER IN PERSON|REG AIR|ular epitaphs boost +31269|528|29|1|47|67140.44|0.00|0.02|R|F|1992-07-10|1992-06-07|1992-07-28|TAKE BACK RETURN|AIR|arefully regular realms. ironic +31270|1214|52|1|24|26765.04|0.01|0.07|A|F|1993-03-01|1993-02-08|1993-03-03|COLLECT COD|TRUCK|ependencies boost furiously. +31270|22|23|2|38|35036.76|0.00|0.04|A|F|1992-12-27|1993-01-15|1993-01-12|TAKE BACK RETURN|FOB|encies. special, regular packages across t +31270|403|91|3|46|59956.40|0.08|0.08|A|F|1992-12-22|1993-01-04|1993-01-18|NONE|FOB|ding to the carefully +31270|926|95|4|27|49326.84|0.04|0.06|R|F|1993-02-04|1993-02-12|1993-02-15|TAKE BACK RETURN|RAIL|ial deposits ca +31270|1722|49|5|33|53582.76|0.02|0.06|R|F|1993-02-11|1992-12-26|1993-03-05|DELIVER IN PERSON|RAIL|ly slyly re +31270|1732|17|6|29|47378.17|0.05|0.05|A|F|1993-02-26|1993-02-16|1993-03-22|COLLECT COD|SHIP|e after the carefull +31270|1451|91|7|14|18934.30|0.03|0.06|R|F|1992-12-29|1993-01-09|1993-01-20|COLLECT COD|FOB|al ideas use sl +31271|1113|22|1|16|16225.76|0.00|0.02|N|O|1995-06-26|1995-07-19|1995-06-27|TAKE BACK RETURN|MAIL|ep. final re +31271|1941|86|2|14|25801.16|0.05|0.00|N|O|1995-06-27|1995-05-25|1995-07-12|NONE|MAIL|alongside of the ironic deposits! +31271|855|56|3|8|14046.80|0.03|0.08|N|O|1995-07-13|1995-07-01|1995-08-09|COLLECT COD|FOB|timents solve quickly. packag +31271|1279|80|4|12|14163.24|0.10|0.01|A|F|1995-05-28|1995-06-26|1995-06-13|NONE|FOB|ing deposits along the carefully expre +31271|1876|20|5|16|28445.92|0.05|0.05|A|F|1995-06-08|1995-05-22|1995-06-09|DELIVER IN PERSON|SHIP|es. doggedly ironic accounts are above t +31296|1986|87|1|47|88735.06|0.00|0.03|A|F|1994-01-22|1994-01-27|1994-02-02|TAKE BACK RETURN|MAIL|the quickly regular i +31296|1276|77|2|43|50622.61|0.08|0.06|R|F|1993-12-29|1994-01-17|1994-01-09|COLLECT COD|REG AIR|s! furiously express as +31296|1274|86|3|34|39959.18|0.03|0.07|A|F|1993-12-16|1994-01-06|1994-01-05|NONE|TRUCK|ts above the bold +31297|1789|74|1|13|21980.14|0.08|0.06|R|F|1992-08-28|1992-09-20|1992-09-26|DELIVER IN PERSON|RAIL| final instructions use above the fluffily +31297|216|44|2|26|29021.46|0.06|0.07|A|F|1992-11-09|1992-11-06|1992-11-30|COLLECT COD|RAIL|lent foxes +31297|1307|46|3|26|31415.80|0.06|0.02|A|F|1992-11-01|1992-10-26|1992-11-21|DELIVER IN PERSON|MAIL|yly ironic notornis. furiously ironic asy +31297|1525|66|4|34|48501.68|0.01|0.08|R|F|1992-10-18|1992-09-27|1992-10-31|DELIVER IN PERSON|SHIP|nic deposits haggle upon the furiou +31297|941|42|5|47|86571.18|0.05|0.08|R|F|1992-09-01|1992-11-06|1992-09-03|NONE|TRUCK|ealms boost slyly pinto beans. regularl +31297|1715|100|6|11|17783.81|0.08|0.07|R|F|1992-10-23|1992-11-09|1992-11-05|NONE|AIR|efully express platelets above the s +31297|1995|96|7|44|83467.56|0.02|0.08|R|F|1992-10-11|1992-11-13|1992-11-08|TAKE BACK RETURN|REG AIR|le furiously blithely even asymp +31298|1061|62|1|41|39444.46|0.09|0.07|N|O|1997-02-26|1996-12-20|1997-03-06|TAKE BACK RETURN|SHIP|es affix silently. regular, enticin +31298|541|42|2|20|28830.80|0.05|0.01|N|O|1996-12-05|1996-12-06|1996-12-26|COLLECT COD|REG AIR|ess, regula +31298|286|41|3|30|35588.40|0.02|0.01|N|O|1997-01-07|1996-12-04|1997-01-13|TAKE BACK RETURN|MAIL|y even requests? carefully unusual package +31299|1318|19|1|10|12193.10|0.03|0.06|N|O|1997-01-18|1997-02-20|1997-02-07|COLLECT COD|AIR| the specia +31299|224|52|2|3|3372.66|0.07|0.03|N|O|1997-04-18|1997-02-15|1997-04-21|TAKE BACK RETURN|SHIP|ions. final, pending dependencies nag alon +31300|190|91|1|27|29435.13|0.10|0.00|N|O|1997-07-17|1997-05-28|1997-07-23|NONE|TRUCK|ep. quickly bold +31300|644|38|2|15|23169.60|0.08|0.02|N|O|1997-08-02|1997-05-12|1997-08-15|COLLECT COD|SHIP|nly about the s +31301|333|90|1|30|36999.90|0.04|0.03|A|F|1994-02-03|1993-11-26|1994-03-02|COLLECT COD|REG AIR|deposits ac +31301|1012|18|2|46|41998.46|0.03|0.00|R|F|1993-12-12|1993-12-29|1994-01-05|NONE|REG AIR|se quietly furiously even account +31301|410|69|3|20|26208.20|0.08|0.08|R|F|1994-01-12|1993-12-16|1994-01-16|COLLECT COD|MAIL|s after the furiou +31301|1200|37|4|2|2202.40|0.05|0.01|A|F|1993-11-04|1994-01-16|1993-12-04|TAKE BACK RETURN|TRUCK|lent foxes. even deposits dazzle b +31302|773|74|1|41|68624.57|0.04|0.06|A|F|1992-11-07|1992-09-25|1992-11-15|NONE|REG AIR|kages are slyly ironic excuses. slyly pend +31302|1953|42|2|15|27824.25|0.06|0.07|R|F|1992-08-10|1992-09-18|1992-08-20|DELIVER IN PERSON|MAIL|express, even deposits haggle +31302|467|68|3|36|49228.56|0.05|0.06|A|F|1992-09-22|1992-09-24|1992-10-15|TAKE BACK RETURN|RAIL|s are slyly +31302|1932|33|4|9|16505.37|0.00|0.07|A|F|1992-10-09|1992-10-28|1992-10-27|COLLECT COD|AIR|the carefully fluffy deposits. +31302|1932|65|5|25|45848.25|0.00|0.02|R|F|1992-12-01|1992-09-12|1992-12-08|NONE|MAIL| platelets haggle slyly. f +31302|576|37|6|21|31007.97|0.07|0.05|R|F|1992-09-12|1992-09-01|1992-09-24|TAKE BACK RETURN|FOB|y express ideas nag permanen +31302|944|47|7|48|88557.12|0.04|0.04|A|F|1992-11-17|1992-10-26|1992-12-02|NONE|REG AIR|pendencies play about the b +31303|295|77|1|14|16734.06|0.06|0.08|A|F|1995-06-01|1995-05-23|1995-06-10|TAKE BACK RETURN|RAIL| the fluffily special foxes. foxe +31303|847|81|2|45|78652.80|0.09|0.02|N|O|1995-07-17|1995-04-21|1995-08-06|TAKE BACK RETURN|AIR|l requests. final, even packages wake sl +31303|1894|24|3|11|19754.79|0.06|0.00|R|F|1995-05-12|1995-05-23|1995-06-10|TAKE BACK RETURN|REG AIR|ending theodolites. u +31303|700|1|4|45|72031.50|0.06|0.03|N|F|1995-05-21|1995-06-01|1995-06-18|NONE|REG AIR|e according to the express instructio +31328|1476|16|1|36|49588.92|0.00|0.03|N|O|1998-07-18|1998-07-12|1998-08-13|TAKE BACK RETURN|RAIL|ke carefully rea +31328|1831|75|2|18|31190.94|0.00|0.00|N|O|1998-07-24|1998-05-26|1998-08-05|TAKE BACK RETURN|TRUCK| silent instructions. furiously bold accoun +31328|1303|80|3|24|28903.20|0.00|0.08|N|O|1998-06-15|1998-07-01|1998-07-12|DELIVER IN PERSON|SHIP| wake carefully behind the evenly +31328|619|82|4|35|53186.35|0.01|0.02|N|O|1998-05-22|1998-06-02|1998-05-24|NONE|AIR|. ironic ideas wake blithely +31328|1566|67|5|22|32286.32|0.09|0.04|N|O|1998-08-11|1998-06-28|1998-08-24|NONE|RAIL|y even foxes. pending deposits ha +31328|386|87|6|4|5145.52|0.00|0.08|N|O|1998-06-29|1998-05-27|1998-07-28|NONE|AIR|quickly final packages. express pack +31328|1639|63|7|41|63165.83|0.05|0.02|N|O|1998-06-01|1998-06-13|1998-06-11|DELIVER IN PERSON|MAIL|refully ironic deposits about the +31329|72|48|1|33|32078.31|0.07|0.01|N|O|1998-10-05|1998-07-24|1998-11-02|COLLECT COD|RAIL|latelets. slyly furio +31329|1699|100|2|29|46420.01|0.08|0.03|N|O|1998-10-02|1998-08-05|1998-10-26|COLLECT COD|TRUCK|sits are furiou +31329|774|71|3|48|80388.96|0.01|0.04|N|O|1998-06-20|1998-08-27|1998-07-12|DELIVER IN PERSON|RAIL|es. fluffily special requests +31329|814|15|4|2|3429.62|0.03|0.03|N|O|1998-08-14|1998-09-06|1998-09-01|TAKE BACK RETURN|AIR|efully regular +31330|1007|78|1|30|27240.00|0.10|0.03|A|F|1993-07-08|1993-07-06|1993-07-23|NONE|TRUCK|gainst the fluffily final +31330|1977|22|2|38|71400.86|0.06|0.08|A|F|1993-06-04|1993-07-03|1993-06-20|DELIVER IN PERSON|AIR|r, regular packages. special, bold ac +31330|844|45|3|18|31407.12|0.09|0.04|R|F|1993-06-26|1993-08-28|1993-06-28|TAKE BACK RETURN|FOB|the quickly +31330|1109|46|4|38|38383.80|0.02|0.03|R|F|1993-06-22|1993-07-05|1993-06-23|DELIVER IN PERSON|FOB|ual requests. furiously regular attai +31330|78|79|5|19|18583.33|0.03|0.02|A|F|1993-09-13|1993-07-27|1993-09-26|NONE|MAIL|onic instructions a +31330|304|61|6|47|56602.10|0.09|0.00|R|F|1993-08-30|1993-07-29|1993-08-31|DELIVER IN PERSON|REG AIR| are final pinto beans. pending ac +31330|1329|68|7|11|13533.52|0.00|0.07|R|F|1993-09-07|1993-07-08|1993-09-21|DELIVER IN PERSON|MAIL|ully bold dinos nag furiously ironic +31331|1270|8|1|39|45679.53|0.02|0.01|N|O|1998-07-28|1998-09-15|1998-08-07|TAKE BACK RETURN|REG AIR|ly silent deposits. ironic, re +31331|331|88|2|13|16007.29|0.06|0.07|N|O|1998-08-24|1998-08-10|1998-09-02|TAKE BACK RETURN|MAIL|xes kindle final requests. furiously pend +31331|1665|7|3|24|37599.84|0.03|0.02|N|O|1998-10-11|1998-08-13|1998-11-05|DELIVER IN PERSON|REG AIR|dependencies. furiously r +31331|165|66|4|8|8521.28|0.03|0.05|N|O|1998-07-15|1998-09-03|1998-08-11|DELIVER IN PERSON|SHIP|und the furiously ironic accounts. furiousl +31331|1518|99|5|8|11356.08|0.06|0.04|N|O|1998-08-09|1998-09-11|1998-08-27|COLLECT COD|REG AIR| quickly fluffy dependencies-- ev +31331|1357|34|6|3|3775.05|0.05|0.07|N|O|1998-07-31|1998-08-29|1998-08-06|TAKE BACK RETURN|SHIP| silently dogged acc +31331|1860|47|7|31|54617.66|0.05|0.03|N|O|1998-07-29|1998-08-29|1998-08-04|COLLECT COD|TRUCK|, even deposits against the ironic +31332|945|48|1|12|22151.28|0.05|0.05|N|O|1998-09-15|1998-08-28|1998-10-13|COLLECT COD|FOB|uctions sleep slyly: furio +31332|1085|56|2|16|15777.28|0.03|0.06|N|O|1998-07-04|1998-07-17|1998-07-24|COLLECT COD|REG AIR|tes integrate +31333|1630|54|1|34|52075.42|0.09|0.01|R|F|1994-11-29|1994-12-19|1994-12-07|TAKE BACK RETURN|RAIL|packages thrash n +31333|927|96|2|11|20107.12|0.07|0.07|A|F|1994-12-13|1995-01-07|1995-01-10|TAKE BACK RETURN|SHIP|y special deposits boo +31333|1807|94|3|27|46137.60|0.06|0.00|A|F|1995-02-02|1994-12-22|1995-02-05|COLLECT COD|FOB|ely even theodolites wake blithely along +31333|166|67|4|4|4264.64|0.07|0.07|A|F|1994-10-26|1994-12-14|1994-11-17|NONE|RAIL|s wake furiously fin +31333|1352|53|5|37|46373.95|0.02|0.02|R|F|1994-10-22|1994-12-04|1994-11-14|NONE|AIR|sleep quickly. regular instruc +31333|822|23|6|21|36179.22|0.04|0.01|A|F|1994-11-29|1994-12-10|1994-12-29|COLLECT COD|TRUCK|accounts about the +31334|1711|96|1|7|11288.97|0.08|0.04|N|O|1996-12-29|1997-01-21|1997-01-09|TAKE BACK RETURN|TRUCK|nusual excuses +31335|160|87|1|43|45586.88|0.03|0.00|N|O|1996-01-19|1996-04-01|1996-02-06|TAKE BACK RETURN|MAIL|unusual pinto beans. ironic, final +31335|1277|15|2|19|22387.13|0.10|0.05|N|O|1996-01-26|1996-03-01|1996-02-25|DELIVER IN PERSON|SHIP| carefully even accounts. pending, entici +31360|342|71|1|33|40997.22|0.03|0.03|N|O|1998-01-13|1998-01-28|1998-02-12|COLLECT COD|REG AIR|he bold foxes. fluffily enticing d +31360|1992|81|2|7|13257.93|0.09|0.05|N|O|1998-02-18|1998-01-19|1998-02-22|TAKE BACK RETURN|TRUCK|lyly regular foxes d +31360|1267|5|3|19|22196.94|0.09|0.01|N|O|1998-03-10|1998-01-26|1998-03-25|DELIVER IN PERSON|TRUCK|al foxes snooze across the asymptotes +31360|1811|55|4|3|5138.43|0.04|0.01|N|O|1998-01-02|1998-01-30|1998-01-24|TAKE BACK RETURN|REG AIR| ironic requests. fu +31360|1940|41|5|26|47890.44|0.04|0.02|N|O|1997-12-09|1998-02-18|1997-12-19|COLLECT COD|RAIL| the blithely pendin +31360|486|16|6|15|20797.20|0.09|0.07|N|O|1998-01-06|1998-01-09|1998-01-18|COLLECT COD|RAIL|sits. slyly final pinto beans are quickly +31360|620|83|7|2|3041.24|0.04|0.06|N|O|1997-12-04|1998-02-08|1997-12-21|DELIVER IN PERSON|FOB|ckages sleep blithely alo +31361|1781|8|1|11|18510.58|0.01|0.06|N|O|1997-08-09|1997-11-01|1997-08-27|DELIVER IN PERSON|REG AIR| blithely after th +31361|394|79|2|50|64719.50|0.03|0.08|N|O|1997-09-13|1997-10-31|1997-10-01|COLLECT COD|SHIP|ing, ironic somas. quickly regular account +31362|1880|67|1|1|1781.88|0.07|0.03|N|O|1995-10-23|1995-11-28|1995-11-05|COLLECT COD|REG AIR|ffily furiously pending packages? quic +31362|1341|42|2|41|50935.94|0.07|0.06|N|O|1996-02-12|1995-11-20|1996-02-27|COLLECT COD|AIR|furiously against +31363|1014|85|1|2|1830.02|0.04|0.05|R|F|1994-06-25|1994-06-28|1994-07-05|NONE|RAIL|ously regular theodolites bo +31363|1518|39|2|35|49682.85|0.02|0.04|A|F|1994-05-31|1994-06-19|1994-06-07|DELIVER IN PERSON|FOB|ely ruthlessly regular instructions. bli +31364|760|25|1|29|48162.04|0.10|0.03|R|F|1994-06-02|1994-07-09|1994-06-08|NONE|RAIL|notornis integrate ruthlessly. pack +31364|911|80|2|37|67040.67|0.06|0.05|R|F|1994-07-10|1994-07-19|1994-07-19|DELIVER IN PERSON|FOB| furiously final requests. express, ironi +31364|1918|63|3|41|74616.31|0.06|0.03|A|F|1994-08-26|1994-07-25|1994-09-04|DELIVER IN PERSON|FOB| blithely alongside of the patterns. sl +31364|1098|34|4|34|33969.06|0.03|0.07|R|F|1994-05-23|1994-07-08|1994-06-11|DELIVER IN PERSON|RAIL|pinto beans are brave +31364|1338|53|5|5|6196.65|0.05|0.03|R|F|1994-08-17|1994-06-29|1994-09-06|TAKE BACK RETURN|AIR|pending instructions. i +31364|1509|10|6|33|46546.50|0.04|0.02|A|F|1994-05-16|1994-07-12|1994-05-21|TAKE BACK RETURN|MAIL| deposits doubt above the final packag +31365|1786|87|1|41|69198.98|0.03|0.02|N|O|1995-08-30|1995-08-25|1995-09-26|DELIVER IN PERSON|SHIP|ounts. regular, ir +31365|942|45|2|24|44230.56|0.05|0.05|N|O|1995-07-21|1995-07-04|1995-08-12|NONE|MAIL|lithely even p +31365|956|57|3|48|89133.60|0.02|0.01|N|O|1995-08-06|1995-07-01|1995-08-31|COLLECT COD|REG AIR|requests cajole around the depos +31365|1559|100|4|35|51119.25|0.00|0.07|N|F|1995-06-17|1995-07-04|1995-07-14|NONE|REG AIR|its use bravely fluffil +31366|1843|44|1|6|10469.04|0.04|0.08|A|F|1993-11-16|1993-11-20|1993-11-24|COLLECT COD|RAIL|? ironic frets use +31366|1242|43|2|12|13718.88|0.04|0.04|A|F|1993-11-17|1993-11-29|1993-12-06|DELIVER IN PERSON|SHIP|iously. slyly pending accounts cajole +31366|439|98|3|50|66971.50|0.05|0.07|A|F|1993-11-03|1993-11-04|1993-11-22|DELIVER IN PERSON|SHIP|latelets use after the quickly ironic p +31367|1643|26|1|48|74142.72|0.05|0.00|N|O|1996-12-31|1996-12-08|1997-01-19|DELIVER IN PERSON|REG AIR|tructions detec +31367|1742|43|2|32|52599.68|0.09|0.07|N|O|1996-11-14|1996-11-24|1996-12-01|COLLECT COD|TRUCK|s wake blithely +31392|1083|54|1|3|2952.24|0.05|0.02|A|F|1993-05-17|1993-08-01|1993-06-14|TAKE BACK RETURN|FOB|es against the carefully express asym +31392|860|94|2|36|63390.96|0.06|0.05|A|F|1993-06-25|1993-07-02|1993-07-13|COLLECT COD|FOB|ages integrate against the i +31392|797|98|3|11|18675.69|0.06|0.03|A|F|1993-07-31|1993-07-22|1993-08-17|NONE|RAIL|ronic instructions. slyly pending instruc +31392|1521|2|4|46|65435.92|0.02|0.02|R|F|1993-06-29|1993-06-15|1993-07-05|DELIVER IN PERSON|REG AIR| regular accounts. slyly unu +31392|459|60|5|27|36705.15|0.06|0.08|A|F|1993-08-12|1993-07-14|1993-08-23|COLLECT COD|SHIP|ular theod +31393|1181|18|1|7|7575.26|0.00|0.07|A|F|1992-08-12|1992-06-19|1992-08-26|COLLECT COD|FOB|, unusual i +31393|1454|55|2|30|40663.50|0.01|0.01|A|F|1992-07-20|1992-08-07|1992-08-18|DELIVER IN PERSON|AIR|cording to the ironic accounts; fluff +31393|720|53|3|13|21069.36|0.05|0.04|R|F|1992-05-14|1992-08-04|1992-06-05|DELIVER IN PERSON|MAIL| final requests above +31393|1916|5|4|4|7271.64|0.02|0.06|A|F|1992-08-26|1992-07-20|1992-08-30|DELIVER IN PERSON|RAIL|inal packages haggle slyl +31393|1420|60|5|47|62106.74|0.00|0.07|R|F|1992-06-11|1992-07-25|1992-06-20|TAKE BACK RETURN|MAIL|ly final theodoli +31393|20|96|6|2|1840.04|0.10|0.04|A|F|1992-09-04|1992-07-08|1992-09-29|DELIVER IN PERSON|AIR| quickly regular accounts kindle +31394|720|53|1|21|34035.12|0.09|0.03|N|O|1997-04-15|1997-05-20|1997-05-04|TAKE BACK RETURN|RAIL|ronic packages haggle +31394|65|41|2|50|48253.00|0.02|0.05|N|O|1997-04-19|1997-04-25|1997-05-18|NONE|REG AIR|r deposits affix carefully alon +31395|172|73|1|35|37525.95|0.03|0.04|R|F|1992-10-01|1992-10-25|1992-10-31|NONE|AIR|ic platelets cajole about the quic +31395|123|76|2|20|20462.40|0.02|0.08|R|F|1992-10-24|1992-10-29|1992-11-15|COLLECT COD|MAIL| pinto beans: blithely final somas accordi +31396|552|13|1|11|15978.05|0.10|0.00|N|O|1996-03-22|1996-02-21|1996-03-31|COLLECT COD|REG AIR|s. quickly ironic +31396|1498|77|2|30|41984.70|0.01|0.04|N|O|1996-03-02|1996-03-12|1996-03-10|TAKE BACK RETURN|RAIL|quickly bold pinto beans slee +31396|1766|9|3|35|58371.60|0.08|0.02|N|O|1996-03-15|1996-02-20|1996-03-28|TAKE BACK RETURN|AIR| around the warhorses. pending +31396|633|27|4|3|4600.89|0.01|0.00|N|O|1996-01-06|1996-02-26|1996-01-07|COLLECT COD|RAIL|along the blithely regular requests. caref +31396|170|23|5|1|1070.17|0.09|0.01|N|O|1996-01-09|1996-02-25|1996-01-17|DELIVER IN PERSON|RAIL|ic ideas use quickly. entici +31397|1575|56|1|8|11812.56|0.01|0.07|N|O|1997-01-30|1997-04-11|1997-02-12|DELIVER IN PERSON|REG AIR|. dependencies +31397|1167|4|2|12|12817.92|0.04|0.07|N|O|1997-04-19|1997-03-15|1997-04-24|NONE|FOB|grate after the special +31398|46|22|1|28|26489.12|0.01|0.02|N|O|1998-03-03|1998-04-13|1998-04-02|TAKE BACK RETURN|SHIP|lyly final theodolites wa +31398|120|73|2|40|40804.80|0.09|0.08|N|O|1998-02-21|1998-04-28|1998-03-14|TAKE BACK RETURN|RAIL|deposits according to the special accounts +31398|1270|71|3|6|7027.62|0.07|0.01|N|O|1998-05-08|1998-03-19|1998-05-27|NONE|REG AIR|arefully special warhorse +31398|392|93|4|44|56865.16|0.08|0.06|N|O|1998-03-06|1998-03-06|1998-04-01|DELIVER IN PERSON|TRUCK|g packages +31398|867|1|5|8|14142.88|0.04|0.03|N|O|1998-05-29|1998-04-17|1998-06-10|TAKE BACK RETURN|MAIL|x along the +31398|778|79|6|13|21824.01|0.00|0.07|N|O|1998-05-27|1998-03-28|1998-06-20|COLLECT COD|SHIP|s requests cajole slyly iro +31399|235|36|1|38|43138.74|0.06|0.02|N|O|1995-12-08|1995-12-31|1995-12-23|TAKE BACK RETURN|AIR| enticing platelets nag at t +31399|1068|69|2|45|43607.70|0.00|0.01|N|O|1996-02-04|1996-01-26|1996-02-13|TAKE BACK RETURN|MAIL| packages? slyly unusual acco +31399|1186|95|3|27|29353.86|0.01|0.02|N|O|1996-01-02|1996-01-11|1996-01-06|COLLECT COD|FOB|haggle slyly. blithely pending pa +31399|1750|51|4|25|41293.75|0.10|0.08|N|O|1996-02-24|1995-12-19|1996-03-15|COLLECT COD|AIR|c accounts. slow, regular accounts caj +31399|464|52|5|42|57307.32|0.07|0.07|N|O|1996-02-17|1995-12-09|1996-03-12|COLLECT COD|AIR|inal packages are carefully. f +31399|1992|93|6|42|79547.58|0.01|0.00|N|O|1996-01-08|1995-12-18|1996-01-22|DELIVER IN PERSON|AIR|usly final accounts. slyly +31399|542|3|7|11|15867.94|0.09|0.04|N|O|1996-02-19|1996-01-28|1996-03-01|DELIVER IN PERSON|TRUCK|lly slyly ir +31424|65|66|1|38|36672.28|0.09|0.01|N|O|1996-10-08|1996-11-08|1996-10-19|COLLECT COD|FOB|sts cajole blithely bold theo +31424|600|91|2|9|13505.40|0.03|0.00|N|O|1996-11-02|1996-12-04|1996-11-26|COLLECT COD|MAIL| carefully besides the quickly +31424|1713|40|3|47|75891.37|0.01|0.05|N|O|1996-10-09|1996-11-01|1996-10-18|TAKE BACK RETURN|SHIP| deposits c +31424|1670|53|4|19|29861.73|0.00|0.07|N|O|1996-10-20|1996-11-09|1996-11-10|TAKE BACK RETURN|AIR|ajole after the ironic packages. sly +31424|548|39|5|39|56493.06|0.02|0.02|N|O|1996-09-11|1996-11-20|1996-09-17|TAKE BACK RETURN|MAIL|packages boost slyly slyly entici +31424|111|90|6|3|3033.33|0.03|0.04|N|O|1996-11-26|1996-12-01|1996-12-23|NONE|SHIP|osits wake blithely. furio +31424|1936|25|7|31|56975.83|0.07|0.02|N|O|1996-12-02|1996-11-16|1996-12-04|TAKE BACK RETURN|REG AIR|ccounts. finally ev +31425|304|89|1|21|25290.30|0.09|0.02|N|O|1997-02-09|1996-11-19|1997-02-24|TAKE BACK RETURN|RAIL|thely ironic packag +31425|1349|64|2|26|32508.84|0.03|0.05|N|O|1996-10-17|1996-11-19|1996-10-27|COLLECT COD|REG AIR|quests above the express, bold platelets w +31425|1325|2|3|10|12263.20|0.10|0.00|N|O|1997-01-26|1996-12-13|1997-01-28|DELIVER IN PERSON|TRUCK|e slyly. regular, unusual platelets th +31425|1219|94|4|10|11202.10|0.07|0.03|N|O|1996-12-19|1996-11-19|1996-12-21|TAKE BACK RETURN|TRUCK|uriously final accounts are. re +31425|239|67|5|26|29619.98|0.09|0.02|N|O|1996-11-19|1996-12-23|1996-12-04|DELIVER IN PERSON|AIR|along the even deposits caj +31425|1092|98|6|35|34758.15|0.06|0.07|N|O|1997-02-04|1996-11-13|1997-03-06|DELIVER IN PERSON|AIR|press, express packages slee +31426|1787|14|1|9|15199.02|0.07|0.00|A|F|1994-11-24|1994-09-11|1994-12-06|COLLECT COD|TRUCK|ans are qu +31426|207|8|2|35|38752.00|0.02|0.06|R|F|1994-11-10|1994-11-02|1994-11-16|COLLECT COD|TRUCK|eposits. furiously busy theodolite +31426|502|93|3|32|44880.00|0.09|0.03|R|F|1994-10-09|1994-09-21|1994-10-24|TAKE BACK RETURN|TRUCK|ending dolphins wake fu +31426|1191|28|4|38|41503.22|0.04|0.04|A|F|1994-10-07|1994-09-23|1994-11-05|TAKE BACK RETURN|AIR|ions haggle above the carefully +31426|703|36|5|39|62544.30|0.01|0.06|R|F|1994-08-13|1994-09-30|1994-08-21|COLLECT COD|FOB|thely along the bl +31426|1163|36|6|48|51079.68|0.01|0.01|R|F|1994-09-26|1994-10-26|1994-09-28|NONE|REG AIR|quickly regular pac +31427|452|40|1|7|9467.15|0.06|0.03|R|F|1994-05-30|1994-08-22|1994-06-28|TAKE BACK RETURN|REG AIR|oost pinto beans. ironic accounts +31427|750|15|2|44|72633.00|0.00|0.00|R|F|1994-09-11|1994-07-19|1994-10-07|DELIVER IN PERSON|RAIL|packages. requests boost furiously +31427|1307|8|3|16|19332.80|0.01|0.07|R|F|1994-08-02|1994-07-25|1994-08-13|COLLECT COD|RAIL|reful accounts in +31428|1701|44|1|14|22437.80|0.05|0.08|N|O|1997-05-05|1997-05-29|1997-05-11|DELIVER IN PERSON|RAIL|ress deposits haggle carefull +31428|816|50|2|6|10300.86|0.07|0.03|N|O|1997-07-02|1997-04-28|1997-07-12|TAKE BACK RETURN|FOB|uriously furiously special instructio +31429|1870|100|1|5|8859.35|0.07|0.00|N|O|1995-12-21|1995-12-22|1996-01-01|NONE|AIR|pecial depos +31429|899|99|2|9|16199.01|0.02|0.01|N|O|1995-11-30|1995-12-03|1995-12-17|TAKE BACK RETURN|TRUCK|closely ironic deposits a +31429|107|34|3|6|6042.60|0.09|0.00|N|O|1995-12-15|1995-12-10|1996-01-10|DELIVER IN PERSON|SHIP| ironic accounts. fluffily bold t +31430|517|18|1|12|17010.12|0.08|0.07|R|F|1992-05-18|1992-07-23|1992-05-21|TAKE BACK RETURN|RAIL|deposits s +31431|903|72|1|48|86587.20|0.01|0.00|N|O|1996-06-23|1996-07-09|1996-07-04|COLLECT COD|SHIP| are blithely even requests; s +31431|563|24|2|29|42443.24|0.04|0.03|N|O|1996-08-29|1996-06-25|1996-08-30|NONE|FOB|s. slyly final frays sleep careful +31431|1978|11|3|11|20679.67|0.10|0.03|N|O|1996-05-27|1996-08-05|1996-05-28|NONE|TRUCK|o beans se +31431|1700|42|4|6|9610.20|0.00|0.04|N|O|1996-06-12|1996-06-08|1996-06-20|COLLECT COD|REG AIR|gular requests nag along the quickl +31431|791|24|5|30|50753.70|0.02|0.04|N|O|1996-09-02|1996-06-29|1996-09-23|NONE|AIR|across the final, regular multipliers. +31431|694|26|6|22|35083.18|0.03|0.04|N|O|1996-07-17|1996-06-27|1996-08-11|TAKE BACK RETURN|REG AIR|ously across the fluf +31456|1577|78|1|4|5914.28|0.00|0.07|A|F|1993-01-17|1993-02-02|1993-02-02|NONE|TRUCK| deposits ca +31456|1824|54|2|34|58677.88|0.08|0.07|A|F|1992-12-27|1993-01-04|1993-01-07|TAKE BACK RETURN|RAIL|y express theodolites are furiously. +31456|191|44|3|19|20732.61|0.07|0.00|A|F|1992-12-22|1992-12-29|1993-01-08|COLLECT COD|SHIP|to beans are blithely slyly regular gro +31457|1097|3|1|8|7984.72|0.03|0.04|N|O|1996-03-16|1996-03-22|1996-03-18|TAKE BACK RETURN|FOB|kly final requests after the g +31457|983|52|2|45|84779.10|0.00|0.08|N|O|1996-04-02|1996-02-19|1996-04-15|NONE|SHIP|ly unusual attainments haggle carefully ca +31458|1044|15|1|13|12285.52|0.03|0.06|N|O|1998-06-20|1998-05-29|1998-06-26|COLLECT COD|TRUCK|ly final packages-- carefully final +31458|1693|94|2|2|3189.38|0.03|0.03|N|O|1998-07-16|1998-05-14|1998-08-07|NONE|AIR|ckages. quickly express +31458|1786|87|3|26|43882.28|0.02|0.03|N|O|1998-07-11|1998-05-21|1998-08-10|TAKE BACK RETURN|SHIP|ly pending deposits sleep furiously final +31459|1210|11|1|34|37781.14|0.09|0.02|N|O|1998-02-02|1998-02-16|1998-02-28|NONE|FOB|fully special requests according to +31459|564|25|2|31|45401.36|0.05|0.05|N|O|1998-02-05|1998-02-23|1998-02-10|COLLECT COD|RAIL|r foxes are slyl +31459|327|12|3|46|56456.72|0.03|0.02|N|O|1998-02-03|1998-03-09|1998-03-05|TAKE BACK RETURN|REG AIR| regular requests haggle quickly quickly +31459|1613|55|4|27|40894.47|0.04|0.01|N|O|1998-02-04|1998-01-11|1998-02-23|DELIVER IN PERSON|AIR| quickly final packages. blithely regular +31459|1287|62|5|39|46342.92|0.02|0.02|N|O|1998-01-27|1998-02-21|1998-02-07|DELIVER IN PERSON|AIR|aggle slowly sometimes fina +31459|985|54|6|18|33947.64|0.07|0.03|N|O|1998-03-05|1998-02-12|1998-03-12|COLLECT COD|MAIL|ing packages haggle slyly final noto +31460|442|43|1|39|52355.16|0.01|0.08|R|F|1992-11-01|1992-10-02|1992-11-19|COLLECT COD|REG AIR| alongside of the slyly regular dep +31461|381|82|1|7|8969.66|0.06|0.03|N|O|1995-10-02|1995-09-10|1995-10-28|DELIVER IN PERSON|MAIL|e furiously i +31461|1983|28|2|32|60319.36|0.06|0.07|N|O|1995-07-27|1995-08-27|1995-08-13|DELIVER IN PERSON|SHIP|ck ideas. slyly ironic account +31461|497|56|3|5|6987.45|0.02|0.06|N|O|1995-08-17|1995-09-11|1995-08-29|NONE|MAIL|ld use quickly afte +31461|988|23|4|13|24556.74|0.03|0.01|N|O|1995-09-28|1995-08-27|1995-10-03|COLLECT COD|REG AIR|ests. slyly sly courts wake. d +31461|1935|68|5|20|36738.60|0.02|0.05|N|O|1995-09-03|1995-09-07|1995-09-04|NONE|AIR|ular requests nag blit +31462|210|38|1|29|32196.09|0.07|0.06|R|F|1993-09-09|1993-08-29|1993-09-18|TAKE BACK RETURN|SHIP|ins doubt blithely furiously e +31462|223|24|2|15|16848.30|0.05|0.01|R|F|1993-07-21|1993-09-12|1993-08-05|DELIVER IN PERSON|REG AIR|ing foxes. bold accounts nag carefully +31462|1235|73|3|23|26133.29|0.02|0.06|R|F|1993-10-23|1993-08-19|1993-10-29|TAKE BACK RETURN|RAIL| ideas cajole along the pinto b +31463|1499|39|1|45|63022.05|0.02|0.04|N|O|1997-02-16|1996-12-31|1997-03-06|NONE|FOB| packages +31488|1621|63|1|29|44155.98|0.03|0.02|N|O|1996-01-26|1996-01-23|1996-01-30|TAKE BACK RETURN|REG AIR|y ironic packages above the reque +31488|1952|85|2|37|68596.15|0.03|0.05|N|O|1996-03-01|1996-01-17|1996-03-11|NONE|RAIL|uthlessly spe +31488|1855|56|3|42|73787.70|0.10|0.08|N|O|1996-01-04|1996-02-08|1996-01-26|TAKE BACK RETURN|REG AIR|blithely above the furiously unusu +31489|1625|49|1|6|9159.72|0.10|0.04|R|F|1993-01-25|1993-03-06|1993-02-09|TAKE BACK RETURN|MAIL|riously even depths serve carefully above t +31489|1601|84|2|10|15026.00|0.05|0.04|R|F|1993-01-03|1993-02-05|1993-01-09|TAKE BACK RETURN|SHIP|al accounts +31489|1183|84|3|39|42283.02|0.04|0.06|R|F|1993-01-03|1993-02-19|1993-01-24|DELIVER IN PERSON|RAIL|nstruction +31489|314|15|4|11|13357.41|0.03|0.07|R|F|1992-12-25|1993-02-10|1993-01-09|TAKE BACK RETURN|MAIL|es. bold, special accounts cajole carefu +31489|1632|56|5|39|59811.57|0.04|0.03|A|F|1993-02-27|1993-02-09|1993-03-21|TAKE BACK RETURN|FOB| ideas-- frets serve. +31489|1791|76|6|6|10156.74|0.10|0.06|A|F|1992-12-09|1993-03-06|1992-12-24|NONE|TRUCK| the special attainments. bo +31490|1863|7|1|11|19413.46|0.08|0.08|N|O|1996-07-22|1996-05-27|1996-07-23|DELIVER IN PERSON|MAIL|lly regular foxes. ideas +31490|253|81|2|36|41517.00|0.04|0.02|N|O|1996-08-03|1996-06-01|1996-08-23|COLLECT COD|RAIL|sts. regular +31490|916|85|3|22|39972.02|0.09|0.06|N|O|1996-07-20|1996-07-19|1996-07-29|NONE|TRUCK|y-- special packages affix regular co +31490|1223|24|4|42|47217.24|0.02|0.06|N|O|1996-07-25|1996-07-03|1996-08-04|DELIVER IN PERSON|SHIP|yly: waters nag +31490|253|54|5|19|21911.75|0.01|0.04|N|O|1996-05-22|1996-06-30|1996-06-11|COLLECT COD|FOB|d have to use furi +31490|620|21|6|27|41056.74|0.05|0.00|N|O|1996-06-06|1996-05-29|1996-06-27|COLLECT COD|AIR|aids nag blithely furiously +31491|604|36|1|14|21064.40|0.07|0.06|N|O|1998-05-29|1998-08-05|1998-06-10|NONE|RAIL|ts. furiousl +31491|1536|77|2|47|67563.91|0.00|0.04|N|O|1998-08-30|1998-06-22|1998-09-25|COLLECT COD|REG AIR|out the fur +31492|1930|75|1|32|58621.76|0.08|0.07|A|F|1993-12-25|1993-12-30|1994-01-22|DELIVER IN PERSON|TRUCK|ely unusual asymptotes. slyly +31492|1799|42|2|50|85039.50|0.03|0.03|R|F|1993-11-23|1993-12-01|1993-12-18|DELIVER IN PERSON|REG AIR|above the quickly final f +31492|393|78|3|31|40095.09|0.05|0.00|A|F|1993-12-04|1993-12-17|1993-12-26|COLLECT COD|SHIP|. packages x-ray; fluffily eve +31492|1844|88|4|20|34916.80|0.09|0.06|A|F|1993-12-26|1993-12-01|1994-01-20|DELIVER IN PERSON|FOB|sly about the carefully regular ide +31492|1674|98|5|22|34664.74|0.00|0.04|A|F|1994-01-15|1993-11-17|1994-01-26|DELIVER IN PERSON|REG AIR| accounts. furiously even pinto beans +31492|444|74|6|19|25544.36|0.05|0.02|A|F|1994-01-17|1994-01-09|1994-02-06|NONE|FOB|ns. express +31493|1352|67|1|22|27573.70|0.07|0.00|A|F|1994-12-03|1994-11-29|1994-12-18|DELIVER IN PERSON|AIR|the regular, careful inst +31494|1334|73|1|3|3705.99|0.04|0.08|N|O|1998-06-10|1998-05-20|1998-07-09|DELIVER IN PERSON|SHIP|tructions detect blithely +31494|1613|14|2|27|40894.47|0.03|0.06|N|O|1998-07-30|1998-06-03|1998-08-06|COLLECT COD|SHIP|ole blithely even instructions. accounts +31494|157|36|3|33|34885.95|0.10|0.00|N|O|1998-05-31|1998-05-18|1998-06-28|COLLECT COD|FOB|yly ironic foxes wake furious +31494|1471|72|4|24|32939.28|0.10|0.08|N|O|1998-06-02|1998-06-14|1998-06-14|NONE|AIR|ckages accor +31494|471|59|5|39|53487.33|0.00|0.03|N|O|1998-07-13|1998-07-01|1998-07-24|DELIVER IN PERSON|FOB|. carefully final epita +31494|1649|91|6|17|26360.88|0.07|0.05|N|O|1998-06-11|1998-05-20|1998-06-18|COLLECT COD|TRUCK|uriously silent theodolites a +31495|168|21|1|12|12817.92|0.09|0.00|A|F|1993-10-26|1993-11-03|1993-11-18|COLLECT COD|SHIP| carefully +31495|1907|8|2|36|65120.40|0.01|0.01|A|F|1993-08-13|1993-10-30|1993-09-12|DELIVER IN PERSON|SHIP|quests cajole alongside of the sly +31495|972|73|3|10|18729.70|0.09|0.05|A|F|1993-09-25|1993-09-09|1993-10-24|NONE|AIR|l dependencies above +31495|34|10|4|40|37361.20|0.08|0.06|A|F|1993-11-05|1993-10-29|1993-11-16|COLLECT COD|FOB| blithely final packages. furiously fin +31520|1730|15|1|6|9790.38|0.00|0.00|N|O|1996-03-15|1996-02-03|1996-03-24|TAKE BACK RETURN|MAIL|uctions hinder slyly. blith +31520|967|36|2|48|89662.08|0.01|0.01|N|O|1996-03-14|1996-01-21|1996-04-03|TAKE BACK RETURN|RAIL|lithely around the blit +31520|1473|52|3|31|42608.57|0.03|0.06|N|O|1995-12-21|1996-01-02|1995-12-25|NONE|FOB|the carefully regular request +31520|1293|31|4|39|46577.31|0.10|0.05|N|O|1996-02-02|1996-01-07|1996-02-13|NONE|REG AIR|ntil the careful +31520|385|86|5|37|47559.06|0.07|0.02|N|O|1996-03-19|1996-02-04|1996-04-06|TAKE BACK RETURN|TRUCK|ly regular deposits. +31521|433|21|1|34|45336.62|0.10|0.05|A|F|1992-09-03|1992-07-06|1992-09-12|TAKE BACK RETURN|REG AIR|refully bold ideas may use furi +31521|1484|2|2|39|54033.72|0.02|0.02|R|F|1992-09-15|1992-08-19|1992-09-17|DELIVER IN PERSON|MAIL|ckages affix regular, pending theodolit +31521|1006|7|3|16|14512.00|0.00|0.05|A|F|1992-07-03|1992-08-23|1992-07-12|DELIVER IN PERSON|SHIP|somas. slyly bold excuses haggle. q +31521|1415|94|4|26|34226.66|0.01|0.08|R|F|1992-07-18|1992-07-08|1992-07-26|NONE|TRUCK|mptotes af +31521|260|88|5|47|54532.22|0.10|0.05|A|F|1992-08-03|1992-06-26|1992-08-23|DELIVER IN PERSON|MAIL|old frays integrate. even, clos +31521|283|84|6|20|23665.60|0.04|0.02|A|F|1992-07-21|1992-08-08|1992-08-07|COLLECT COD|REG AIR|uick asymptotes c +31522|1194|3|1|42|45997.98|0.08|0.04|A|F|1993-06-19|1993-08-03|1993-06-30|NONE|SHIP|to boost gifts. carefully e +31522|30|56|2|42|39061.26|0.06|0.03|A|F|1993-08-10|1993-07-03|1993-09-02|TAKE BACK RETURN|REG AIR|ans. blithely ironic deposi +31522|771|4|3|48|80244.96|0.04|0.08|R|F|1993-07-11|1993-07-19|1993-07-20|NONE|FOB|ly regular +31522|1825|55|4|8|13814.56|0.01|0.00|A|F|1993-07-08|1993-06-25|1993-07-13|COLLECT COD|AIR|o the furiously +31522|1631|32|5|22|33717.86|0.07|0.05|A|F|1993-07-15|1993-07-06|1993-07-30|DELIVER IN PERSON|REG AIR|players. packages nag furiously after +31522|1230|31|6|49|55430.27|0.06|0.01|R|F|1993-05-27|1993-07-14|1993-06-26|TAKE BACK RETURN|FOB|hely across the ruthles +31523|974|77|1|41|76873.77|0.03|0.04|R|F|1992-04-12|1992-04-28|1992-04-18|DELIVER IN PERSON|TRUCK|eep alongside of the unusual reque +31523|261|89|2|26|30192.76|0.00|0.05|R|F|1992-05-25|1992-05-02|1992-05-30|TAKE BACK RETURN|FOB|iously alongside of the +31524|793|58|1|42|71139.18|0.08|0.02|N|O|1995-08-27|1995-08-06|1995-09-21|COLLECT COD|REG AIR|sts maintain c +31524|1231|6|2|37|41892.51|0.08|0.00|N|O|1995-10-15|1995-09-22|1995-11-05|NONE|REG AIR|ual dependencies nag. regular +31524|1501|42|3|45|63112.50|0.01|0.03|N|O|1995-08-19|1995-09-06|1995-09-18|TAKE BACK RETURN|FOB| express deposits cajole above the requests +31525|897|98|1|5|8989.45|0.00|0.03|R|F|1992-05-25|1992-03-19|1992-06-18|NONE|MAIL|ully final dolphins? carefully fluffy d +31526|1181|90|1|44|47615.92|0.04|0.02|N|O|1995-10-25|1995-12-06|1995-11-24|NONE|MAIL|usly express dolphi +31526|1368|45|2|5|6346.80|0.01|0.00|N|O|1996-01-19|1995-12-31|1996-02-02|COLLECT COD|RAIL|. instructions caj +31526|286|68|3|2|2372.56|0.10|0.04|N|O|1996-02-14|1995-12-26|1996-02-27|TAKE BACK RETURN|SHIP|n courts. sly, final pint +31526|1198|71|4|40|43967.60|0.03|0.00|N|O|1995-11-14|1995-11-25|1995-12-08|DELIVER IN PERSON|SHIP|y against the blithely slow the +31526|310|39|5|6|7261.86|0.06|0.08|N|O|1996-01-31|1995-11-15|1996-02-20|TAKE BACK RETURN|FOB|pending dependencies cajole blithely. +31526|247|2|6|28|32122.72|0.04|0.03|N|O|1995-11-27|1995-12-10|1995-12-02|TAKE BACK RETURN|SHIP|y ironic pint +31526|1013|19|7|23|21022.23|0.06|0.00|N|O|1995-12-12|1995-11-17|1995-12-27|COLLECT COD|FOB|totes. slyly regular requests +31527|1481|82|1|34|47004.32|0.03|0.06|A|F|1994-10-16|1994-08-30|1994-11-10|COLLECT COD|MAIL|ges between the fluffily busy th +31527|432|62|2|8|10659.44|0.05|0.06|R|F|1994-10-21|1994-08-20|1994-11-17|TAKE BACK RETURN|REG AIR|gular ideas w +31527|938|39|3|23|42295.39|0.08|0.05|R|F|1994-07-12|1994-10-01|1994-07-28|TAKE BACK RETURN|TRUCK|s even sauternes cajole. unusual, final acc +31527|286|41|4|24|28470.72|0.10|0.05|R|F|1994-07-11|1994-08-30|1994-07-28|COLLECT COD|SHIP| accounts affix slyly +31552|781|78|1|14|23544.92|0.04|0.04|A|F|1993-01-09|1992-12-29|1993-01-19|TAKE BACK RETURN|MAIL| blithely across the final courts. pen +31552|166|45|2|8|8529.28|0.01|0.00|A|F|1993-03-09|1992-12-23|1993-03-14|COLLECT COD|MAIL| beans integrate fu +31552|585|16|3|6|8913.48|0.06|0.00|R|F|1992-12-16|1992-12-18|1993-01-07|DELIVER IN PERSON|MAIL|y ironic excuses use. blithely eve +31552|797|62|4|28|47538.12|0.05|0.05|R|F|1993-02-16|1993-01-12|1993-02-22|DELIVER IN PERSON|RAIL|ake furiously blithely pe +31552|866|67|5|38|67140.68|0.09|0.02|R|F|1992-12-02|1993-01-24|1992-12-27|TAKE BACK RETURN|SHIP|. ideas haggle carefully. +31552|426|14|6|23|30507.66|0.08|0.04|A|F|1992-11-14|1993-01-03|1992-12-13|DELIVER IN PERSON|TRUCK|ar, pending d +31552|575|36|7|12|17706.84|0.09|0.08|R|F|1993-01-09|1993-01-17|1993-02-07|COLLECT COD|AIR|ns boost about the f +31553|747|48|1|15|24716.10|0.09|0.02|A|F|1994-04-06|1994-02-20|1994-04-08|TAKE BACK RETURN|SHIP|he slyly final deposi +31553|1765|66|2|50|83338.00|0.04|0.05|A|F|1994-03-08|1994-03-08|1994-03-24|TAKE BACK RETURN|SHIP|slyly unusual deposits. carefully u +31553|4|80|3|38|34352.00|0.02|0.02|R|F|1994-02-13|1994-03-11|1994-03-03|NONE|FOB|thely even, final deposits. unusual +31553|878|78|4|18|32019.66|0.10|0.05|R|F|1994-04-24|1994-03-25|1994-04-26|NONE|AIR|was blithely carefully special attainme +31554|1457|36|1|50|67922.50|0.03|0.00|N|O|1996-03-05|1996-05-04|1996-03-17|COLLECT COD|RAIL|tructions cajole. slyly final in +31554|1810|97|2|2|3423.62|0.08|0.07|N|O|1996-05-03|1996-04-09|1996-05-05|NONE|RAIL|ions. regu +31554|417|5|3|44|57966.04|0.09|0.01|N|O|1996-06-24|1996-05-04|1996-07-19|DELIVER IN PERSON|TRUCK|pecial theodolites. regular, ironic +31554|941|76|4|12|22103.28|0.04|0.08|N|O|1996-03-21|1996-05-22|1996-03-31|TAKE BACK RETURN|SHIP|sts nag about the regular dolphins. +31554|1446|25|5|46|61982.24|0.09|0.04|N|O|1996-05-01|1996-05-04|1996-05-24|TAKE BACK RETURN|AIR|nic requests. blithely express T +31555|871|71|1|35|62015.45|0.07|0.04|R|F|1992-04-17|1992-03-12|1992-05-02|NONE|FOB|l requests wake blithely against the slyly +31555|1800|1|2|18|30632.40|0.01|0.02|A|F|1992-01-11|1992-03-30|1992-01-26|DELIVER IN PERSON|AIR|g the fluffily even pinto bean +31555|1032|68|3|16|14928.48|0.07|0.05|R|F|1992-03-19|1992-02-13|1992-04-07|DELIVER IN PERSON|FOB|lyly about the quickl +31556|908|11|1|40|72356.00|0.01|0.07|N|O|1995-08-01|1995-09-10|1995-08-09|DELIVER IN PERSON|MAIL|leep. ironic theodolites across the bli +31556|1669|52|2|30|47119.80|0.08|0.01|N|O|1995-11-11|1995-10-16|1995-12-10|TAKE BACK RETURN|AIR|e quickly r +31556|355|84|3|14|17574.90|0.01|0.00|N|O|1995-08-29|1995-09-03|1995-09-20|DELIVER IN PERSON|REG AIR|quickly. slyly bold acc +31557|1287|88|1|19|22577.32|0.00|0.02|N|O|1997-08-10|1997-06-23|1997-08-31|DELIVER IN PERSON|TRUCK|ests. carefully pending in +31557|1009|80|2|14|12740.00|0.06|0.00|N|O|1997-08-22|1997-07-13|1997-09-05|NONE|MAIL|: quickly unusual pinto beans boost careful +31557|11|37|3|21|19131.21|0.08|0.08|N|O|1997-09-09|1997-07-23|1997-09-11|TAKE BACK RETURN|FOB|uffy, ironic pinto beans. ideas are req +31557|973|42|4|15|28109.55|0.00|0.06|N|O|1997-06-15|1997-08-14|1997-06-30|COLLECT COD|AIR|into beans. bli +31557|286|14|5|8|9490.24|0.01|0.04|N|O|1997-06-11|1997-08-02|1997-07-11|NONE|RAIL| quick deposits snooze fluffi +31557|579|80|6|38|56223.66|0.09|0.07|N|O|1997-05-28|1997-06-20|1997-06-09|COLLECT COD|FOB|iously silent deposits hagg +31558|1639|63|1|3|4621.89|0.04|0.05|N|O|1995-08-06|1995-10-20|1995-08-29|COLLECT COD|FOB| instructions along the fluffily pending +31558|1175|84|2|19|20447.23|0.05|0.06|N|O|1995-10-30|1995-08-23|1995-10-31|TAKE BACK RETURN|RAIL| asymptotes nag c +31558|1170|71|3|50|53558.50|0.02|0.01|N|O|1995-08-16|1995-09-23|1995-09-06|DELIVER IN PERSON|REG AIR|ost slyly. final accounts haggl +31558|60|36|4|4|3840.24|0.00|0.01|N|O|1995-11-10|1995-09-09|1995-12-07|COLLECT COD|SHIP|alongside of the specia +31558|1245|20|5|10|11462.40|0.03|0.01|N|O|1995-09-18|1995-10-05|1995-09-20|COLLECT COD|FOB|ccounts cajole +31559|986|21|1|3|5660.94|0.08|0.08|N|O|1998-02-17|1998-01-05|1998-03-14|NONE|FOB|ely ironic dolphins. pe +31559|1712|13|2|24|38729.04|0.10|0.02|N|O|1998-01-19|1997-12-17|1998-02-01|NONE|FOB|hely regular requests use quickly re +31559|1830|17|3|38|65809.54|0.07|0.01|N|O|1998-01-15|1997-12-27|1998-01-16|TAKE BACK RETURN|RAIL|sits use slyly. bold deposits are +31559|1190|63|4|29|31644.51|0.09|0.07|N|O|1998-03-04|1997-12-19|1998-03-30|NONE|SHIP|foxes boost blithe +31584|1788|73|1|27|45624.06|0.05|0.05|N|O|1997-04-02|1997-01-06|1997-04-12|NONE|REG AIR| beans. quickl +31584|670|33|2|49|76962.83|0.09|0.06|N|O|1997-01-01|1997-01-10|1997-01-02|DELIVER IN PERSON|REG AIR|ns cajole quickly above the unusual reque +31584|1269|7|3|5|5851.30|0.10|0.00|N|O|1997-01-23|1997-01-07|1997-02-04|COLLECT COD|SHIP|jole quickly express deposits +31585|349|6|1|9|11244.06|0.10|0.04|N|O|1996-06-19|1996-07-06|1996-06-28|TAKE BACK RETURN|MAIL|aggle furiously +31585|854|88|2|43|75458.55|0.07|0.06|N|O|1996-09-09|1996-07-29|1996-09-19|DELIVER IN PERSON|TRUCK| furiously even asym +31585|765|66|3|9|14991.84|0.09|0.05|N|O|1996-06-12|1996-08-11|1996-06-24|NONE|TRUCK| instructions are bravely. sly +31585|1254|66|4|11|12707.75|0.07|0.05|N|O|1996-06-14|1996-08-18|1996-06-29|NONE|MAIL|s are blithely +31586|1614|38|1|32|48499.52|0.10|0.04|A|F|1992-05-27|1992-06-16|1992-06-22|COLLECT COD|TRUCK|ges. express, special decoys haggle carefu +31586|735|36|2|16|26171.68|0.01|0.08|A|F|1992-06-09|1992-05-11|1992-06-17|NONE|TRUCK|ully across the blith +31586|950|85|3|49|90696.55|0.01|0.08|A|F|1992-07-18|1992-06-18|1992-07-20|COLLECT COD|MAIL|lites haggle blithel +31586|1604|28|4|14|21078.40|0.09|0.05|R|F|1992-04-24|1992-04-28|1992-05-21|COLLECT COD|FOB|refully against the slyly bol +31586|1200|37|5|29|31934.80|0.04|0.07|A|F|1992-06-19|1992-05-23|1992-07-08|DELIVER IN PERSON|REG AIR|regular theodolites +31586|1466|67|6|22|30084.12|0.00|0.03|A|F|1992-05-05|1992-05-06|1992-06-03|TAKE BACK RETURN|TRUCK| blithely pending packages nag carefull +31586|603|35|7|21|31575.60|0.02|0.08|A|F|1992-06-22|1992-05-14|1992-07-10|DELIVER IN PERSON|SHIP|yly ironic ideas haggle fluffily; pa +31587|325|10|1|23|28182.36|0.07|0.08|N|O|1998-03-17|1998-05-08|1998-03-19|COLLECT COD|MAIL|ar foxes l +31587|1452|92|2|37|50077.65|0.00|0.05|N|O|1998-06-08|1998-05-02|1998-06-20|NONE|RAIL|e pending, silent pinto beans. furiously bo +31587|204|5|3|11|12146.20|0.06|0.06|N|O|1998-03-01|1998-04-03|1998-03-12|DELIVER IN PERSON|SHIP|le fluffily furiously regular +31588|329|30|1|24|29503.68|0.06|0.00|A|F|1993-12-10|1993-12-27|1993-12-24|TAKE BACK RETURN|RAIL|to the regular g +31589|1798|99|1|29|49293.91|0.10|0.00|N|O|1996-11-22|1996-12-03|1996-11-24|TAKE BACK RETURN|AIR| poach carefully regular +31589|8|34|2|20|18160.00|0.06|0.01|N|O|1996-12-21|1996-11-16|1997-01-08|DELIVER IN PERSON|TRUCK|totes haggle regular, special re +31590|65|16|1|40|38602.40|0.09|0.02|A|F|1993-08-25|1993-08-23|1993-09-07|DELIVER IN PERSON|REG AIR|ully regular pinto beans along +31590|463|22|2|22|29996.12|0.00|0.02|R|F|1993-07-08|1993-08-26|1993-07-30|DELIVER IN PERSON|TRUCK|n foxes nag qui +31590|1206|81|3|47|52038.40|0.05|0.02|R|F|1993-07-16|1993-08-10|1993-07-20|TAKE BACK RETURN|TRUCK|es. quickly ironic ideas alongside of th +31591|1366|43|1|21|26614.56|0.10|0.08|N|O|1998-01-27|1998-03-03|1998-02-17|NONE|RAIL|ses. blithely bold accounts aff +31591|1680|22|2|26|41123.68|0.08|0.08|N|O|1998-01-05|1998-01-15|1998-01-24|NONE|MAIL|nstructions wake above the ironic reque +31591|1473|74|3|21|28863.87|0.06|0.06|N|O|1998-04-08|1998-03-10|1998-04-25|TAKE BACK RETURN|REG AIR|egular courts are slyl +31591|1379|94|4|39|49934.43|0.09|0.04|N|O|1998-02-15|1998-01-29|1998-02-18|COLLECT COD|AIR|nstruction +31591|1944|77|5|12|22151.28|0.10|0.00|N|O|1998-03-07|1998-01-27|1998-03-24|DELIVER IN PERSON|AIR|according to the carefully bold foxes. +31591|947|16|6|13|24023.22|0.09|0.05|N|O|1998-01-24|1998-01-17|1998-02-08|DELIVER IN PERSON|TRUCK|packages. p +31591|1615|57|7|29|43981.69|0.06|0.03|N|O|1998-02-28|1998-02-24|1998-03-25|DELIVER IN PERSON|REG AIR|the furiously blith +31616|1591|12|1|45|67166.55|0.07|0.06|A|F|1993-10-28|1993-10-01|1993-11-21|COLLECT COD|AIR|kly slyly ironic dolphins. even, final +31616|1349|88|2|39|48763.26|0.05|0.02|A|F|1993-11-17|1993-09-30|1993-12-14|COLLECT COD|AIR|carefully re +31616|514|5|3|31|43849.81|0.05|0.00|R|F|1993-09-17|1993-11-26|1993-10-17|DELIVER IN PERSON|AIR|ut the furiously final ideas. +31616|1708|93|4|46|74046.20|0.10|0.02|A|F|1993-11-18|1993-11-22|1993-11-20|NONE|TRUCK|regular package +31616|1580|81|5|9|13334.22|0.09|0.07|R|F|1993-12-14|1993-10-23|1994-01-12|TAKE BACK RETURN|REG AIR|ng the ironically ironic +31617|880|47|1|23|40960.24|0.05|0.04|N|F|1995-06-14|1995-07-11|1995-07-04|COLLECT COD|REG AIR|the quickly final deposits. care +31618|1908|9|1|4|7239.60|0.04|0.03|N|O|1995-09-23|1995-09-30|1995-10-09|COLLECT COD|RAIL| slyly ironic deposits according to th +31618|1044|15|2|10|9450.40|0.06|0.01|N|O|1995-10-21|1995-09-30|1995-11-14|COLLECT COD|TRUCK|es alongside of the idle p +31618|1725|52|3|22|35787.84|0.04|0.05|N|O|1995-10-18|1995-09-12|1995-11-09|DELIVER IN PERSON|RAIL| upon the carefully special deposits. fu +31618|527|88|4|44|62810.88|0.01|0.06|N|O|1995-08-12|1995-09-18|1995-08-19|COLLECT COD|SHIP|haggle. carefully f +31618|400|85|5|10|13004.00|0.02|0.02|N|O|1995-07-19|1995-08-22|1995-07-30|COLLECT COD|AIR|usual instructions-- deposits serve +31618|533|24|6|29|41572.37|0.06|0.05|N|O|1995-08-10|1995-10-06|1995-08-22|COLLECT COD|TRUCK|ests along the s +31618|1325|64|7|46|56410.72|0.09|0.07|N|O|1995-09-19|1995-08-20|1995-10-07|COLLECT COD|FOB| excuses solve qui +31619|236|91|1|14|15907.22|0.03|0.06|R|F|1994-09-29|1994-10-25|1994-10-17|COLLECT COD|REG AIR|er bravely about the instructi +31619|196|97|2|43|47136.17|0.05|0.07|A|F|1994-09-29|1994-11-03|1994-10-16|DELIVER IN PERSON|SHIP|ag according to the silent requests. sl +31619|748|45|3|18|29677.32|0.03|0.04|R|F|1994-11-23|1994-11-18|1994-12-03|DELIVER IN PERSON|RAIL|enly ironic ac +31620|122|1|1|26|26575.12|0.05|0.01|N|O|1995-12-05|1995-10-23|1996-01-04|TAKE BACK RETURN|RAIL|t the special, expre +31620|1168|5|2|34|36351.44|0.04|0.06|N|O|1995-10-04|1995-11-09|1995-10-19|NONE|FOB|y across the f +31620|1092|93|3|7|6951.63|0.08|0.04|N|O|1995-09-29|1995-11-03|1995-10-11|NONE|AIR| deposits. tithes besides the slyly iron +31621|1323|100|1|29|35505.28|0.05|0.06|N|O|1997-08-30|1997-10-23|1997-09-29|DELIVER IN PERSON|REG AIR|es after the quic +31621|1349|26|2|18|22506.12|0.02|0.03|N|O|1997-09-29|1997-10-13|1997-10-09|NONE|SHIP|furiously quick pack +31622|868|69|1|4|7075.44|0.10|0.03|A|F|1992-05-14|1992-04-04|1992-05-26|COLLECT COD|AIR|cording to the blithely unusu +31622|1493|33|2|5|6972.45|0.04|0.06|A|F|1992-05-27|1992-04-25|1992-05-28|NONE|RAIL|lyly. careful +31622|1236|48|3|20|22744.60|0.05|0.06|R|F|1992-06-22|1992-04-09|1992-07-17|NONE|FOB|ts. carefully +31622|470|71|4|31|42484.57|0.04|0.03|A|F|1992-03-21|1992-05-21|1992-04-17|DELIVER IN PERSON|MAIL| furiously against the slyly even +31623|458|17|1|33|44828.85|0.07|0.04|N|O|1997-07-21|1997-09-08|1997-07-28|DELIVER IN PERSON|RAIL|lly busy pinto +31623|1913|14|2|25|45372.75|0.08|0.01|N|O|1997-08-08|1997-08-18|1997-08-31|TAKE BACK RETURN|FOB|fully: quickly slow requests alongside +31623|94|95|3|18|17893.62|0.05|0.03|N|O|1997-06-21|1997-07-25|1997-06-27|TAKE BACK RETURN|FOB|y unusual r +31623|219|20|4|28|31337.88|0.03|0.02|N|O|1997-10-06|1997-08-05|1997-10-26|NONE|RAIL|counts above the final +31623|361|90|5|2|2522.72|0.03|0.03|N|O|1997-06-22|1997-08-14|1997-07-01|COLLECT COD|RAIL|above the regul +31623|17|68|6|31|28427.31|0.10|0.05|N|O|1997-09-29|1997-09-03|1997-10-18|NONE|MAIL|bold pinto beans past the carefully i +31648|610|42|1|22|33233.42|0.09|0.01|N|O|1995-11-25|1995-10-18|1995-11-26|NONE|REG AIR|usly special ac +31648|935|4|2|38|69765.34|0.05|0.02|N|O|1995-11-08|1995-11-15|1995-11-16|NONE|TRUCK|haggle about th +31648|1161|70|3|22|23367.52|0.04|0.01|N|O|1995-08-25|1995-10-24|1995-09-12|DELIVER IN PERSON|REG AIR|across the final ideas sleep alongsi +31648|395|96|4|39|50520.21|0.10|0.03|N|O|1995-09-30|1995-10-31|1995-10-26|COLLECT COD|AIR|s. requests sleep fluffily packages. f +31648|940|41|5|48|88365.12|0.06|0.05|N|O|1995-12-20|1995-10-20|1995-12-23|NONE|AIR| accounts boost blithely against the carefu +31648|593|84|6|6|8961.54|0.10|0.08|N|O|1995-09-05|1995-10-31|1995-09-06|NONE|TRUCK|efully ironic pinto beans. qu +31648|1315|92|7|49|59599.19|0.08|0.02|N|O|1995-11-28|1995-10-04|1995-12-28|TAKE BACK RETURN|TRUCK|g to the regular asymptotes. blithely ir +31649|144|97|1|20|20882.80|0.03|0.08|N|O|1998-03-19|1998-05-07|1998-04-12|NONE|RAIL|ular deposits. express, regular re +31649|1072|78|2|36|35030.52|0.10|0.01|N|O|1998-06-03|1998-05-19|1998-06-11|COLLECT COD|RAIL|etect slyly expr +31649|1595|76|3|7|10476.13|0.08|0.04|N|O|1998-03-07|1998-04-24|1998-03-19|NONE|SHIP|olites sleep gifts. q +31649|1354|69|4|16|20085.60|0.09|0.05|N|O|1998-03-20|1998-04-13|1998-03-28|COLLECT COD|SHIP|uests nag. furiously even deposits inte +31649|1962|63|5|2|3727.92|0.03|0.03|N|O|1998-05-06|1998-04-30|1998-05-27|TAKE BACK RETURN|TRUCK|thely silent deposits cajole f +31649|1104|41|6|28|28142.80|0.00|0.02|N|O|1998-03-26|1998-05-01|1998-04-05|COLLECT COD|AIR|es. slowly idle acc +31649|1142|79|7|41|42768.74|0.06|0.06|N|O|1998-03-16|1998-04-01|1998-03-21|DELIVER IN PERSON|REG AIR| detect pending, +31650|1362|1|1|40|50534.40|0.05|0.02|A|F|1993-09-17|1993-10-23|1993-10-06|DELIVER IN PERSON|SHIP| the final ideas. special +31650|34|35|2|13|12142.39|0.05|0.07|R|F|1993-12-09|1993-10-14|1993-12-29|COLLECT COD|REG AIR|counts engage. requ +31650|550|11|3|12|17406.60|0.09|0.01|A|F|1993-09-28|1993-10-28|1993-10-14|NONE|AIR|he furiously u +31650|1955|88|4|6|11141.70|0.08|0.07|A|F|1993-09-12|1993-11-09|1993-09-26|COLLECT COD|SHIP|ly fluffily busy dependencies; q +31650|150|29|5|2|2100.30|0.09|0.07|A|F|1993-08-30|1993-09-25|1993-09-05|COLLECT COD|RAIL|und the fina +31650|1054|90|6|6|5730.30|0.10|0.05|R|F|1993-08-15|1993-10-22|1993-09-06|NONE|SHIP|. even requests ab +31650|652|15|7|42|65211.30|0.02|0.08|A|F|1993-10-16|1993-10-15|1993-10-31|DELIVER IN PERSON|FOB|lly carefully pending depende +31651|1766|67|1|5|8338.80|0.03|0.04|N|O|1997-10-11|1997-11-19|1997-10-14|COLLECT COD|SHIP|lites sleep care +31651|1777|20|2|34|57078.18|0.10|0.08|N|O|1997-10-15|1997-11-04|1997-10-17|NONE|REG AIR|ly. slyly regu +31651|155|8|3|19|20047.85|0.06|0.03|N|O|1997-12-03|1997-10-19|1997-12-18|COLLECT COD|RAIL|c Tiresias. quickly regula +31651|1748|33|4|10|16497.40|0.09|0.05|N|O|1998-01-01|1997-11-22|1998-01-20|NONE|TRUCK|ts. quickly expres +31651|1936|81|5|32|58813.76|0.10|0.06|N|O|1997-11-30|1997-11-07|1997-12-04|DELIVER IN PERSON|AIR| are blithely express ideas. care +31652|834|35|1|19|32961.77|0.00|0.04|R|F|1994-11-18|1994-11-24|1994-12-18|NONE|MAIL|n asymptotes det +31652|1961|94|2|31|57751.76|0.01|0.03|R|F|1994-11-03|1994-12-13|1994-11-20|NONE|AIR|ts. deposits use. slyly +31652|1118|55|3|49|49936.39|0.04|0.02|R|F|1994-12-17|1994-12-13|1994-12-31|COLLECT COD|TRUCK|ffily bold requests boost carefu +31652|1488|89|4|12|16673.76|0.01|0.04|R|F|1994-12-04|1994-11-25|1995-01-03|DELIVER IN PERSON|FOB|r patterns cajole carefully across the furi +31653|1886|73|1|46|82242.48|0.09|0.01|A|F|1993-09-11|1993-07-27|1993-09-26|NONE|SHIP|lithely fi +31653|217|99|2|15|16758.15|0.06|0.00|R|F|1993-09-18|1993-07-13|1993-10-18|TAKE BACK RETURN|REG AIR|. fluffily express deposits above the +31653|95|21|3|12|11941.08|0.08|0.08|R|F|1993-07-08|1993-09-03|1993-07-30|NONE|REG AIR| the accounts. slyl +31653|341|98|4|33|40964.22|0.01|0.04|R|F|1993-08-12|1993-07-14|1993-08-24|DELIVER IN PERSON|MAIL|lent instruction +31653|1294|69|5|6|7171.74|0.02|0.00|R|F|1993-06-07|1993-07-10|1993-06-17|COLLECT COD|RAIL|ost furious +31654|1595|96|1|23|34421.57|0.04|0.07|N|O|1996-10-10|1996-11-03|1996-10-28|DELIVER IN PERSON|RAIL|accounts sleep daringly. i +31654|912|15|2|33|59826.03|0.08|0.07|N|O|1996-11-20|1996-10-21|1996-11-23|DELIVER IN PERSON|SHIP|ng the thinly final instructions. car +31654|55|31|3|18|17190.90|0.02|0.02|N|O|1996-12-25|1996-11-05|1997-01-12|NONE|SHIP|furiously final requests sleep slyly +31654|331|32|4|1|1231.33|0.08|0.08|N|O|1997-01-13|1996-10-16|1997-01-31|DELIVER IN PERSON|SHIP|es lose slyly. +31654|1372|73|5|5|6366.85|0.01|0.04|N|O|1996-10-22|1996-11-05|1996-11-21|DELIVER IN PERSON|MAIL| deposits detect along +31654|1396|35|6|1|1297.39|0.06|0.07|N|O|1996-09-16|1996-11-01|1996-10-03|DELIVER IN PERSON|SHIP|posits aff +31654|330|87|7|16|19685.28|0.07|0.08|N|O|1996-11-09|1996-11-09|1996-11-19|DELIVER IN PERSON|MAIL|otornis. even deposits affix. +31655|801|2|1|35|59563.00|0.09|0.08|R|F|1993-03-26|1993-04-29|1993-04-19|NONE|SHIP|lyly quickly special foxes. +31655|98|99|2|39|38925.51|0.06|0.08|R|F|1993-06-01|1993-04-30|1993-06-13|TAKE BACK RETURN|TRUCK|yly blithe pains integrate. blithely +31655|1329|68|3|32|39370.24|0.03|0.06|R|F|1993-05-15|1993-05-20|1993-06-02|COLLECT COD|MAIL| deposits boost furiously. slyly fluffy de +31655|1962|51|4|46|85742.16|0.09|0.06|A|F|1993-03-15|1993-05-02|1993-04-06|DELIVER IN PERSON|AIR|eep! carefully regul +31655|97|48|5|11|10967.99|0.06|0.08|A|F|1993-04-11|1993-05-25|1993-05-07|TAKE BACK RETURN|TRUCK|e. even, ironic accou +31655|1829|73|6|43|74425.26|0.08|0.00|R|F|1993-04-07|1993-05-27|1993-04-30|DELIVER IN PERSON|TRUCK| the theodolites wake slyly along t +31680|3|54|1|42|37926.00|0.09|0.07|N|O|1998-06-03|1998-06-03|1998-06-27|NONE|AIR|usly even theodolite +31681|197|24|1|1|1097.19|0.00|0.05|R|F|1993-01-04|1992-12-10|1993-01-23|NONE|SHIP|ly final packages affix-- furiously +31681|192|45|2|26|28396.94|0.03|0.02|R|F|1993-01-12|1992-12-30|1993-02-04|TAKE BACK RETURN|MAIL|press accounts. slyly fin +31682|1857|58|1|15|26382.75|0.06|0.00|R|F|1993-04-29|1993-05-29|1993-05-05|COLLECT COD|FOB|l ideas cajole into the final ide +31682|1010|16|2|26|23686.26|0.05|0.00|A|F|1993-05-07|1993-06-04|1993-05-08|TAKE BACK RETURN|REG AIR|usly accordi +31682|484|85|3|29|40149.92|0.06|0.02|R|F|1993-06-11|1993-05-13|1993-07-09|TAKE BACK RETURN|RAIL| special foxes around the quickly +31683|1973|74|1|24|44999.28|0.08|0.05|N|O|1997-07-27|1997-06-08|1997-08-09|NONE|SHIP|nto beans detect furiously al +31683|1850|37|2|32|56059.20|0.05|0.03|N|O|1997-06-15|1997-05-22|1997-06-16|COLLECT COD|AIR|its. slyly ironic acco +31683|821|88|3|4|6887.28|0.03|0.08|N|O|1997-07-02|1997-07-02|1997-07-12|TAKE BACK RETURN|AIR|ular, final foxes nag carefully across the +31683|1727|12|4|20|32574.40|0.08|0.00|N|O|1997-07-28|1997-07-06|1997-08-13|DELIVER IN PERSON|SHIP|rts serve q +31684|1274|49|1|50|58763.50|0.08|0.07|A|F|1992-09-18|1992-11-24|1992-10-05|TAKE BACK RETURN|RAIL|accounts detect furiou +31684|1982|15|2|16|30143.68|0.05|0.05|R|F|1992-10-01|1992-11-23|1992-10-12|DELIVER IN PERSON|AIR|ach after the regular request +31684|1808|52|3|29|49584.20|0.10|0.07|A|F|1993-01-07|1992-11-19|1993-01-24|NONE|MAIL|ording to the accounts? quickly un +31684|1705|90|4|19|30527.30|0.06|0.08|R|F|1992-11-15|1992-11-08|1992-12-03|DELIVER IN PERSON|TRUCK|odolites hagg +31684|1465|66|5|38|51925.48|0.00|0.06|A|F|1992-10-11|1992-11-13|1992-10-24|COLLECT COD|REG AIR|ckly special foxes. pending +31684|1093|99|6|1|994.09|0.01|0.02|R|F|1992-10-02|1992-10-18|1992-10-14|DELIVER IN PERSON|REG AIR|to beans are against +31684|254|82|7|20|23085.00|0.09|0.04|A|F|1992-09-25|1992-11-20|1992-09-30|NONE|AIR|y regular p +31685|1476|16|1|39|53721.33|0.06|0.07|A|F|1994-08-30|1994-08-28|1994-09-20|COLLECT COD|RAIL|sts. furiously final requests cajole bes +31685|631|32|2|13|19911.19|0.07|0.05|R|F|1994-10-16|1994-08-09|1994-11-05|COLLECT COD|RAIL|y final theodolites belie +31686|1969|14|1|15|28064.40|0.00|0.04|N|O|1996-09-11|1996-08-18|1996-09-20|COLLECT COD|RAIL|al requests play furiously across th +31686|510|41|2|48|67704.48|0.01|0.01|N|O|1996-07-28|1996-08-26|1996-08-08|DELIVER IN PERSON|REG AIR| the deposits. final requests affi +31686|1388|89|3|10|12893.80|0.08|0.06|N|O|1996-07-22|1996-09-05|1996-08-11|TAKE BACK RETURN|MAIL| instructions mold blithely. fur +31686|1397|12|4|7|9088.73|0.02|0.02|N|O|1996-08-04|1996-07-19|1996-08-28|COLLECT COD|RAIL|al, unusual deposits sle +31686|597|98|5|21|31449.39|0.01|0.04|N|O|1996-09-21|1996-07-28|1996-09-27|NONE|TRUCK|aggle slyly +31687|1512|93|1|22|31097.22|0.10|0.06|N|O|1995-08-27|1995-07-11|1995-08-30|NONE|SHIP|y deposits. +31687|1849|93|2|7|12255.88|0.01|0.01|N|F|1995-06-16|1995-07-08|1995-07-02|DELIVER IN PERSON|RAIL|jole. even +31687|1438|56|3|43|57595.49|0.10|0.01|N|O|1995-08-16|1995-07-31|1995-08-19|TAKE BACK RETURN|REG AIR|d blithely +31712|1466|67|1|9|12307.14|0.03|0.01|N|O|1997-04-04|1997-05-24|1997-04-12|COLLECT COD|REG AIR|ts. fluffily ironic pearls wake slyly +31713|1087|88|1|3|2964.24|0.04|0.04|N|O|1998-05-31|1998-04-05|1998-06-02|COLLECT COD|RAIL|ending instructions use. blith +31713|1247|48|2|19|21816.56|0.03|0.06|N|O|1998-02-13|1998-04-07|1998-03-08|DELIVER IN PERSON|MAIL|egular theodolites detect bold foxes. r +31713|1628|11|3|13|19885.06|0.05|0.05|N|O|1998-05-05|1998-04-19|1998-05-29|DELIVER IN PERSON|MAIL|ording to the fu +31713|1901|90|4|25|45072.50|0.10|0.08|N|O|1998-05-19|1998-03-11|1998-05-23|TAKE BACK RETURN|TRUCK|ans. blithely special acco +31713|360|89|5|13|16384.68|0.08|0.04|N|O|1998-02-25|1998-04-13|1998-03-15|DELIVER IN PERSON|SHIP|y express pinto beans. sly +31714|418|77|1|21|27686.61|0.09|0.01|N|O|1997-11-30|1997-10-22|1997-12-18|DELIVER IN PERSON|RAIL|ts wake according to +31714|1521|62|2|36|51210.72|0.05|0.01|N|O|1997-12-12|1997-10-06|1997-12-25|TAKE BACK RETURN|TRUCK|ongside of the furiously regular asymptote +31714|1213|14|3|28|31197.88|0.02|0.03|N|O|1997-08-24|1997-10-15|1997-09-16|TAKE BACK RETURN|REG AIR|hely ironi +31714|1643|85|4|24|37071.36|0.00|0.03|N|O|1997-12-04|1997-10-14|1997-12-26|DELIVER IN PERSON|SHIP|arefully blithely ironic ideas. +31714|1733|60|5|13|21251.49|0.08|0.02|N|O|1997-12-07|1997-10-29|1997-12-11|DELIVER IN PERSON|FOB|c pinto beans. regul +31714|1599|20|6|49|73528.91|0.01|0.01|N|O|1997-10-08|1997-09-21|1997-11-05|TAKE BACK RETURN|FOB|s requests at the furiously regu +31714|876|43|7|43|76405.41|0.00|0.08|N|O|1997-09-03|1997-11-11|1997-09-22|DELIVER IN PERSON|REG AIR|thely above the furiously final d +31715|1555|96|1|24|34957.20|0.00|0.03|A|F|1994-04-01|1994-04-07|1994-04-24|DELIVER IN PERSON|MAIL|re furiously slyly unus +31715|1236|11|2|12|13646.76|0.00|0.05|R|F|1994-05-05|1994-03-22|1994-05-06|COLLECT COD|MAIL|y express braids haggle blit +31715|889|90|3|27|48326.76|0.10|0.01|R|F|1994-03-18|1994-04-05|1994-04-12|TAKE BACK RETURN|MAIL|. regular deposits above the special +31715|790|55|4|14|23671.06|0.02|0.08|A|F|1994-01-28|1994-02-21|1994-02-24|DELIVER IN PERSON|FOB|usual asymptotes detect blithely +31715|1517|98|5|7|9929.57|0.06|0.00|A|F|1994-05-06|1994-04-04|1994-05-25|NONE|FOB|regular pinto beans above the furiou +31715|200|53|6|34|37406.80|0.06|0.03|A|F|1994-04-19|1994-03-05|1994-04-25|NONE|FOB| sleep carefully fluffy accounts. slyly +31715|144|23|7|46|48030.44|0.01|0.07|A|F|1994-03-27|1994-04-05|1994-03-30|TAKE BACK RETURN|AIR|hely. even, final instru +31716|1177|50|1|31|33423.27|0.00|0.07|N|O|1996-12-08|1997-01-08|1997-01-06|NONE|REG AIR|al package +31716|1333|72|2|30|37029.90|0.05|0.08|N|O|1997-01-09|1996-12-24|1997-02-02|DELIVER IN PERSON|RAIL|lyly regular +31717|1129|2|1|25|25753.00|0.09|0.06|N|O|1997-11-17|1997-12-07|1997-11-28|NONE|FOB|nd the blit +31717|498|99|2|49|68526.01|0.07|0.02|N|O|1998-02-27|1998-01-14|1998-03-06|DELIVER IN PERSON|TRUCK| slyly special requests are sly +31718|474|62|1|24|32987.28|0.07|0.04|A|F|1994-03-12|1994-01-29|1994-04-11|DELIVER IN PERSON|MAIL|riously regular courts affix f +31718|1969|70|2|26|48644.96|0.09|0.04|A|F|1994-03-17|1994-01-02|1994-04-10|NONE|RAIL| instruction +31718|32|58|3|6|5592.18|0.00|0.02|R|F|1994-02-11|1994-01-25|1994-02-22|DELIVER IN PERSON|RAIL| requests thrash after the +31719|754|51|1|49|81082.75|0.02|0.00|N|O|1997-03-28|1997-05-05|1997-04-19|COLLECT COD|SHIP|furiously express instru +31719|1911|56|2|35|63451.85|0.10|0.01|N|O|1997-06-12|1997-04-25|1997-07-10|COLLECT COD|REG AIR|totes eat qui +31719|720|17|3|32|51863.04|0.02|0.03|N|O|1997-06-19|1997-05-24|1997-06-25|TAKE BACK RETURN|TRUCK|s sleep unusual theodolites. blithely regul +31719|907|8|4|30|54237.00|0.01|0.04|N|O|1997-06-07|1997-04-12|1997-06-15|NONE|REG AIR| doubt evenly entici +31719|734|99|5|26|42502.98|0.08|0.05|N|O|1997-06-24|1997-05-07|1997-07-23|NONE|REG AIR|uriously unusual theodolites. thin, +31719|357|42|6|10|12573.50|0.05|0.04|N|O|1997-04-13|1997-04-22|1997-04-28|DELIVER IN PERSON|FOB|patterns. fluff +31744|1502|43|1|32|44912.00|0.07|0.06|A|F|1992-12-21|1992-10-15|1992-12-29|COLLECT COD|REG AIR|o the ironic depos +31744|1340|79|2|25|31033.50|0.10|0.03|R|F|1992-11-27|1992-12-07|1992-11-28|COLLECT COD|AIR| ironically slyly ironic packages. sly +31744|691|92|3|7|11141.83|0.10|0.08|R|F|1992-10-28|1992-10-19|1992-11-12|TAKE BACK RETURN|REG AIR| ironic accounts. ironic pinto b +31744|1731|74|4|26|42450.98|0.02|0.06|A|F|1992-11-19|1992-12-01|1992-12-14|DELIVER IN PERSON|MAIL|idle dependencies. furiously regular requ +31744|428|16|5|49|65092.58|0.05|0.06|R|F|1992-12-23|1992-11-05|1993-01-09|TAKE BACK RETURN|FOB| pinto beans are quickly carefully r +31744|1004|75|6|31|28055.00|0.05|0.00|A|F|1992-09-28|1992-12-07|1992-10-07|DELIVER IN PERSON|RAIL|nal ideas. slyly special asymptotes +31744|719|84|7|19|30774.49|0.01|0.02|A|F|1992-10-05|1992-10-20|1992-10-26|NONE|FOB|the even, +31745|893|60|1|38|68167.82|0.08|0.05|A|F|1994-01-22|1993-12-19|1994-02-20|COLLECT COD|MAIL|hely special packages integrate bli +31745|686|87|2|26|41253.68|0.05|0.04|R|F|1993-10-31|1994-01-11|1993-11-11|TAKE BACK RETURN|AIR|ironic, final requests cajole fox +31746|284|12|1|6|7105.68|0.08|0.06|N|O|1997-08-08|1997-07-15|1997-09-01|DELIVER IN PERSON|MAIL| special platelets. special pa +31746|1714|99|2|20|32314.20|0.02|0.01|N|O|1997-07-10|1997-07-19|1997-07-21|DELIVER IN PERSON|SHIP|the busy foxes nag after the carefully fi +31746|171|72|3|39|41775.63|0.07|0.01|N|O|1997-07-18|1997-08-01|1997-08-10|DELIVER IN PERSON|TRUCK|e even requests. b +31746|1090|91|4|31|30723.79|0.05|0.05|N|O|1997-07-29|1997-08-03|1997-08-09|NONE|MAIL| pinto beans. caref +31747|1552|93|1|50|72677.50|0.07|0.06|R|F|1995-05-05|1995-04-22|1995-05-24|COLLECT COD|AIR|requests. accounts detect blithe +31747|516|17|2|49|69408.99|0.05|0.07|R|F|1995-05-27|1995-04-09|1995-06-01|DELIVER IN PERSON|AIR|s along the exp +31747|1337|38|3|21|26004.93|0.05|0.03|R|F|1995-04-22|1995-03-20|1995-05-01|TAKE BACK RETURN|REG AIR|. blithely final pinto b +31748|1299|74|1|36|43210.44|0.06|0.07|N|O|1996-12-16|1996-09-25|1997-01-15|COLLECT COD|RAIL|ckages use blithely. instructions aft +31748|764|61|2|27|44948.52|0.10|0.07|N|O|1996-10-28|1996-11-11|1996-11-18|COLLECT COD|MAIL|old requests are blithely accor +31748|176|55|3|17|18294.89|0.06|0.07|N|O|1996-11-02|1996-10-19|1996-11-06|TAKE BACK RETURN|TRUCK|egular, regular deposits integrate +31748|782|47|4|27|45435.06|0.03|0.01|N|O|1996-12-06|1996-10-05|1997-01-01|TAKE BACK RETURN|TRUCK|tructions. carefully regular instr +31748|280|35|5|37|43670.36|0.04|0.07|N|O|1996-09-24|1996-10-17|1996-10-20|TAKE BACK RETURN|REG AIR|eas cajole. fluffily permanent foxes sle +31748|1544|25|6|14|20237.56|0.00|0.08|N|O|1996-09-12|1996-11-19|1996-10-11|NONE|TRUCK|. unusual, regular ideas wake. quickly +31749|1398|99|1|24|31185.36|0.07|0.06|N|O|1995-08-31|1995-09-01|1995-09-13|COLLECT COD|AIR|ver about the slyly final requests. +31749|1646|70|2|1|1547.64|0.01|0.05|N|O|1995-08-26|1995-08-28|1995-09-09|TAKE BACK RETURN|REG AIR|nic pinto beans. carefully unu +31749|1767|94|3|21|35043.96|0.04|0.08|N|O|1995-08-04|1995-07-13|1995-09-01|COLLECT COD|AIR|lithe excuses across the quickly iron +31749|1382|83|4|5|6416.90|0.09|0.07|N|O|1995-09-10|1995-07-10|1995-09-15|DELIVER IN PERSON|TRUCK|ely. blithely final warthogs hag +31749|1052|53|5|4|3812.20|0.05|0.04|N|O|1995-09-20|1995-07-07|1995-10-01|COLLECT COD|RAIL|accounts sleep furiousl +31749|856|56|6|28|49191.80|0.04|0.04|N|O|1995-07-11|1995-07-12|1995-07-20|TAKE BACK RETURN|AIR| beans are ironically i +31749|170|71|7|26|27824.42|0.03|0.08|N|O|1995-07-05|1995-08-16|1995-07-27|DELIVER IN PERSON|AIR|even pinto beans. blithely final requ +31750|1266|41|1|45|52526.70|0.09|0.06|N|O|1997-04-24|1997-02-15|1997-05-16|COLLECT COD|TRUCK|ously carefully silent reques +31750|955|90|2|35|64958.25|0.00|0.06|N|O|1997-02-15|1997-03-14|1997-02-18|NONE|SHIP|lly ironic accounts. carefully special requ +31751|725|58|1|10|16257.20|0.02|0.04|N|O|1995-07-23|1995-07-04|1995-08-11|NONE|REG AIR| furiously enticing instructions. carefu +31751|1266|67|2|6|7003.56|0.04|0.07|N|O|1995-08-13|1995-07-05|1995-09-06|COLLECT COD|RAIL| furiously regula +31751|1640|64|3|25|38541.00|0.01|0.03|N|O|1995-07-27|1995-07-04|1995-08-16|DELIVER IN PERSON|FOB|. ironic, bold accounts s +31751|1475|76|4|20|27529.40|0.08|0.03|R|F|1995-06-04|1995-07-29|1995-06-07|COLLECT COD|AIR|he always ironic asymptotes. furiously do +31751|1892|79|5|35|62786.15|0.07|0.03|N|O|1995-07-01|1995-08-05|1995-07-05|NONE|AIR|hely ironic requests. evenly bold +31751|702|99|6|8|12821.60|0.05|0.00|N|O|1995-08-09|1995-08-15|1995-08-24|TAKE BACK RETURN|RAIL|totes. final pinto beans s +31751|943|12|7|9|16595.46|0.06|0.08|N|O|1995-09-09|1995-08-19|1995-09-20|COLLECT COD|SHIP|e express, even +31776|892|92|1|42|75301.38|0.04|0.01|N|O|1997-05-26|1997-06-02|1997-06-13|DELIVER IN PERSON|RAIL|nding theodolites haggle above the +31776|407|37|2|7|9151.80|0.08|0.03|N|O|1997-06-17|1997-06-25|1997-06-19|TAKE BACK RETURN|TRUCK| wake furiously +31776|1261|36|3|38|44165.88|0.00|0.03|N|O|1997-08-06|1997-05-30|1997-08-24|TAKE BACK RETURN|TRUCK|ackages are. ideas mold slyly. furiously +31776|1086|57|4|25|24677.00|0.09|0.01|N|O|1997-08-06|1997-07-20|1997-09-03|NONE|SHIP|fily special requests. carefully final ide +31776|987|90|5|11|20767.78|0.06|0.02|N|O|1997-07-09|1997-06-28|1997-08-01|NONE|SHIP|quests. ruthlessly special asymptotes ac +31776|533|64|6|31|44439.43|0.06|0.07|N|O|1997-07-18|1997-06-25|1997-07-26|NONE|MAIL|atelets. stealthy pinto beans wake car +31777|907|8|1|35|63276.50|0.09|0.05|N|O|1995-11-25|1995-12-03|1995-12-17|DELIVER IN PERSON|AIR|nts are fu +31777|703|68|2|1|1603.70|0.01|0.01|N|O|1995-11-02|1995-12-14|1995-11-23|COLLECT COD|SHIP|nstead of the fin +31777|1644|45|3|25|38641.00|0.02|0.02|N|O|1995-12-22|1996-01-12|1996-01-08|COLLECT COD|REG AIR| warhorses cajole blithely regular +31777|1847|91|4|3|5246.52|0.09|0.00|N|O|1995-11-23|1995-12-30|1995-12-20|COLLECT COD|FOB|furiously bold somas are +31778|80|56|1|22|21561.76|0.05|0.07|N|O|1998-02-12|1998-03-01|1998-02-15|NONE|RAIL|lites cajole; blit +31778|214|69|2|43|47911.03|0.09|0.00|N|O|1998-02-14|1998-02-02|1998-02-17|TAKE BACK RETURN|FOB|ronically stealth +31779|79|55|1|44|43079.08|0.00|0.08|A|F|1994-01-06|1993-11-16|1994-01-11|DELIVER IN PERSON|SHIP|ptotes nag careful +31779|459|18|2|17|23110.65|0.01|0.07|R|F|1993-11-04|1993-11-15|1993-11-28|NONE|RAIL|y. unusual sauternes impress blithe +31780|693|56|1|17|27092.73|0.00|0.00|R|F|1993-04-01|1993-03-05|1993-04-03|NONE|MAIL| final theodolites. foxes ac +31780|157|10|2|9|9514.35|0.01|0.01|R|F|1993-03-13|1993-03-16|1993-04-09|DELIVER IN PERSON|SHIP| the ironic, regular deposits. furiously pe +31780|1415|94|3|13|17113.33|0.03|0.02|R|F|1993-03-10|1993-04-08|1993-03-22|COLLECT COD|MAIL|structions. special accounts detect +31780|124|3|4|46|47109.52|0.02|0.08|A|F|1993-04-22|1993-03-02|1993-05-11|DELIVER IN PERSON|FOB|aggle blithely against the furiou +31780|1243|55|5|29|33182.96|0.07|0.05|A|F|1993-04-06|1993-04-09|1993-04-11|COLLECT COD|RAIL|he requests detect deposits: de +31781|1708|51|1|5|8048.50|0.01|0.00|A|F|1994-05-14|1994-03-19|1994-06-02|COLLECT COD|REG AIR| pinto beans are carefully alongside o +31781|1292|67|2|28|33412.12|0.01|0.05|R|F|1994-03-29|1994-02-18|1994-04-02|COLLECT COD|REG AIR|ests wake carefully. t +31781|1850|37|3|7|12262.95|0.10|0.03|A|F|1994-02-01|1994-04-15|1994-02-12|NONE|REG AIR|al platelets. ironic accou +31781|433|92|4|13|17334.59|0.00|0.04|A|F|1994-04-21|1994-03-18|1994-05-11|NONE|TRUCK|sly express accounts wake acc +31781|1913|58|5|46|83485.86|0.01|0.00|R|F|1994-04-14|1994-03-16|1994-05-12|DELIVER IN PERSON|TRUCK|ons above the ironic requests haggle f +31781|1654|78|6|35|54447.75|0.09|0.08|A|F|1994-02-20|1994-04-01|1994-03-10|COLLECT COD|MAIL|xes sleep quickly bold packages. +31781|1437|38|7|32|42829.76|0.07|0.04|R|F|1994-05-03|1994-03-15|1994-05-04|TAKE BACK RETURN|SHIP|iously final deposits +31782|990|91|1|3|5672.97|0.06|0.08|R|F|1993-01-09|1992-12-04|1993-02-02|NONE|REG AIR|ages. deposits sleep. blithely ironic instr +31782|71|47|2|14|13594.98|0.03|0.03|R|F|1992-12-18|1992-11-29|1993-01-14|COLLECT COD|MAIL|onic ideas. bold foxes are quickly slyl +31782|1991|92|3|5|9464.95|0.00|0.04|A|F|1992-12-26|1992-11-22|1993-01-02|DELIVER IN PERSON|MAIL|ingly regular g +31782|738|35|4|12|19664.76|0.03|0.08|R|F|1992-12-18|1993-01-12|1993-01-13|NONE|RAIL|ly special theodolites. accounts are fur +31782|833|34|5|2|3467.66|0.06|0.07|R|F|1992-12-08|1993-01-09|1992-12-21|NONE|FOB|he requests? final excuses sleep. caref +31782|1541|22|6|12|17310.48|0.10|0.02|A|F|1992-12-13|1993-01-02|1992-12-19|NONE|AIR|es. blithely re +31783|1365|42|1|2|2532.72|0.05|0.01|N|O|1996-08-01|1996-05-30|1996-08-13|COLLECT COD|RAIL|leep furiously even asymptotes. furiously i +31808|692|86|1|31|49373.39|0.05|0.00|R|F|1993-11-18|1993-12-01|1993-12-11|DELIVER IN PERSON|MAIL|ffily special foxes. ir +31808|1338|15|2|34|42137.22|0.00|0.05|R|F|1993-11-08|1993-10-31|1993-11-19|TAKE BACK RETURN|REG AIR|g deposits wake furiously careful deposit +31808|1114|51|3|27|27407.97|0.05|0.01|A|F|1993-10-10|1993-11-06|1993-11-07|DELIVER IN PERSON|SHIP|e permanently ironic acc +31808|886|86|4|35|62540.80|0.09|0.08|R|F|1993-10-10|1993-11-15|1993-11-02|TAKE BACK RETURN|AIR|the slyly fina +31809|283|38|1|15|17749.20|0.03|0.04|R|F|1993-08-26|1993-10-08|1993-09-11|NONE|MAIL|al ideas cajole about the regular deposi +31809|423|24|2|37|48966.54|0.06|0.00|R|F|1993-11-04|1993-09-08|1993-11-16|TAKE BACK RETURN|REG AIR|t accounts. furiously ir +31809|503|4|3|7|9824.50|0.00|0.05|A|F|1993-11-02|1993-09-12|1993-11-24|DELIVER IN PERSON|RAIL|express accounts. fluffily regular depe +31809|185|38|4|2|2170.36|0.04|0.01|A|F|1993-09-29|1993-09-12|1993-10-17|NONE|TRUCK| the final, ironic packa +31810|1056|57|1|31|29668.55|0.10|0.06|R|F|1994-06-18|1994-06-28|1994-07-04|TAKE BACK RETURN|AIR|t the furiously +31810|1192|1|2|47|51379.93|0.05|0.02|A|F|1994-06-02|1994-07-22|1994-06-28|NONE|MAIL|ckly furiously even r +31811|906|75|1|10|18069.00|0.03|0.07|N|O|1998-07-11|1998-06-08|1998-08-04|COLLECT COD|RAIL|ly bold excuses sleep. blithely bold dolph +31811|1259|60|2|2|2320.50|0.05|0.05|N|O|1998-07-25|1998-05-15|1998-08-19|TAKE BACK RETURN|SHIP|nic, final accounts are slyly. blithely fl +31812|1643|67|1|4|6178.56|0.08|0.06|N|O|1995-10-27|1995-10-10|1995-11-22|DELIVER IN PERSON|RAIL| against the furiously +31812|174|75|2|49|52634.33|0.09|0.01|N|O|1995-09-24|1995-09-12|1995-10-19|COLLECT COD|FOB|accounts sleep furiousl +31812|812|13|3|1|1712.81|0.07|0.02|N|O|1995-09-17|1995-09-26|1995-10-05|COLLECT COD|RAIL| ironic, ironic sentiments affix +31812|1956|57|4|7|13005.65|0.07|0.05|N|O|1995-11-19|1995-10-01|1995-12-11|DELIVER IN PERSON|FOB|quickly pending depos +31812|1463|64|5|24|32747.04|0.10|0.03|N|O|1995-09-04|1995-10-14|1995-09-11|COLLECT COD|REG AIR|deposits haggle furio +31812|1976|9|6|33|61973.01|0.03|0.03|N|O|1995-08-20|1995-10-01|1995-09-07|COLLECT COD|MAIL|slyly unusual pinto beans cajole furi +31813|358|43|1|27|33975.45|0.07|0.02|N|O|1997-05-18|1997-07-28|1997-06-07|DELIVER IN PERSON|AIR|ng the final theodolites. blithe +31813|1365|66|2|11|13929.96|0.05|0.06|N|O|1997-08-01|1997-07-24|1997-08-20|NONE|TRUCK|, close acco +31813|714|11|3|43|69432.53|0.08|0.06|N|O|1997-06-04|1997-08-09|1997-06-11|NONE|RAIL|es cajole alongside +31814|1453|54|1|22|29797.90|0.09|0.07|N|O|1997-09-03|1997-10-29|1997-09-20|DELIVER IN PERSON|AIR|final, pending foxes solve carefully specia +31814|178|31|2|34|36657.78|0.02|0.06|N|O|1997-09-26|1997-10-11|1997-10-14|TAKE BACK RETURN|REG AIR|g deposits haggle +31814|1058|29|3|16|15344.80|0.04|0.06|N|O|1997-10-31|1997-09-16|1997-11-11|COLLECT COD|MAIL|he requests cajol +31814|407|66|4|8|10459.20|0.04|0.04|N|O|1997-10-22|1997-09-09|1997-11-14|COLLECT COD|REG AIR|hin the slyly +31815|1135|8|1|34|35228.42|0.10|0.05|N|O|1996-11-09|1996-10-30|1996-12-03|COLLECT COD|REG AIR|accounts thrash quickly re +31815|1390|5|2|27|34867.53|0.08|0.08|N|O|1996-10-09|1996-10-22|1996-10-29|TAKE BACK RETURN|AIR|ges. idle reque +31815|817|18|3|8|13742.48|0.05|0.05|N|O|1996-11-19|1996-10-19|1996-12-13|TAKE BACK RETURN|FOB|t carefully by the +31815|1717|60|4|16|25899.36|0.06|0.03|N|O|1996-09-12|1996-08-31|1996-09-17|NONE|TRUCK|long the thi +31840|1682|65|1|44|69681.92|0.07|0.08|A|F|1993-05-08|1993-07-10|1993-05-18|COLLECT COD|SHIP|etimes ironic theodolites haggle alongs +31840|978|79|2|12|22547.64|0.06|0.00|A|F|1993-04-26|1993-06-19|1993-05-08|TAKE BACK RETURN|RAIL|of the regula +31840|1784|11|3|23|38772.94|0.02|0.02|A|F|1993-05-24|1993-05-19|1993-06-03|NONE|TRUCK|blithely silent deposits print furiously +31841|1650|33|1|11|17068.15|0.03|0.05|N|O|1996-09-23|1996-08-11|1996-10-08|NONE|MAIL|the carefully caref +31841|1401|19|2|19|24745.60|0.04|0.06|N|O|1996-08-06|1996-08-29|1996-08-12|NONE|MAIL| enticingly. bravely unusual deposits boos +31841|1958|91|3|4|7439.80|0.00|0.08|N|O|1996-08-18|1996-08-01|1996-09-03|DELIVER IN PERSON|TRUCK|ously. quickly regular ideas cajole bol +31842|293|21|1|9|10739.61|0.09|0.02|A|F|1993-08-17|1993-09-22|1993-09-14|COLLECT COD|REG AIR| the slyly ironic depend +31842|340|41|2|49|60776.66|0.02|0.08|R|F|1993-11-14|1993-10-09|1993-11-29|COLLECT COD|AIR| carefully blithely regular packages. pendi +31842|357|42|3|42|52808.70|0.06|0.05|R|F|1993-11-14|1993-08-17|1993-12-10|DELIVER IN PERSON|REG AIR|after the carefully special depo +31842|1939|72|4|6|11045.58|0.04|0.03|A|F|1993-08-16|1993-09-22|1993-08-25|NONE|SHIP|quests use c +31843|1888|32|1|25|44747.00|0.02|0.00|N|F|1995-06-13|1995-08-04|1995-06-28|NONE|RAIL|osits. even pinto beans sleep. blithel +31843|847|14|2|6|10487.04|0.10|0.05|N|O|1995-08-12|1995-08-16|1995-08-24|TAKE BACK RETURN|FOB|kages wake slyly regular d +31844|1011|82|1|8|7296.08|0.05|0.07|N|O|1995-07-06|1995-09-20|1995-07-11|DELIVER IN PERSON|REG AIR|lyly ironic shea +31844|1657|99|2|23|35848.95|0.04|0.02|N|O|1995-10-11|1995-08-30|1995-10-13|NONE|FOB|he regular, even requests +31845|144|45|1|5|5220.70|0.05|0.08|A|F|1992-12-21|1992-12-05|1992-12-27|DELIVER IN PERSON|MAIL| theodolit +31845|1816|3|2|15|25767.15|0.10|0.01|R|F|1993-01-30|1992-11-25|1993-02-15|DELIVER IN PERSON|MAIL|he dependencies +31845|557|18|3|10|14575.50|0.01|0.00|A|F|1993-02-20|1992-11-24|1993-03-05|TAKE BACK RETURN|MAIL|its boost unusual ideas. ironic accoun +31845|1001|72|4|9|8118.00|0.01|0.08|R|F|1992-11-05|1993-01-11|1992-12-01|TAKE BACK RETURN|RAIL|ost furiously. bol +31845|1078|79|5|4|3916.28|0.09|0.04|A|F|1992-11-17|1992-11-24|1992-11-28|TAKE BACK RETURN|MAIL|ccounts after the carefully final d +31846|806|6|1|22|37549.60|0.10|0.05|N|O|1995-09-23|1995-09-22|1995-10-17|NONE|RAIL| the furio +31846|1859|89|2|6|10565.10|0.00|0.04|N|O|1995-08-18|1995-10-08|1995-08-25|COLLECT COD|REG AIR|tructions. blithely final +31847|78|54|1|36|35210.52|0.08|0.04|R|F|1995-04-16|1995-02-23|1995-05-13|COLLECT COD|AIR|ccounts about the carefully regular +31847|751|48|2|28|46249.00|0.06|0.08|A|F|1995-02-05|1995-01-31|1995-02-27|NONE|MAIL|ep slyly furiously final accounts. pendi +31847|1230|31|3|30|33936.90|0.00|0.07|A|F|1995-02-16|1995-02-21|1995-02-24|NONE|TRUCK|ounts. stealthily even pinto +31847|1478|79|4|8|11035.76|0.04|0.05|R|F|1995-03-24|1995-01-22|1995-04-13|COLLECT COD|AIR|ons cajole furiously across the blithely re +31847|873|73|5|47|83371.89|0.10|0.02|R|F|1995-02-24|1995-01-25|1995-03-10|NONE|REG AIR|ly even instructions play quick +31847|684|85|6|14|22185.52|0.03|0.01|A|F|1995-02-24|1995-01-20|1995-03-05|NONE|FOB|ans. carefully regula +31847|1645|28|7|30|46399.20|0.04|0.04|A|F|1995-04-04|1995-01-29|1995-05-03|NONE|MAIL|ironic excuses. fluffily ironic acco +31872|553|14|1|23|33431.65|0.05|0.00|R|F|1993-10-05|1993-11-21|1993-10-16|TAKE BACK RETURN|FOB|ly blithely pending pinto beans +31872|1136|9|2|1|1037.13|0.10|0.04|R|F|1993-10-02|1993-10-15|1993-10-17|COLLECT COD|REG AIR|ctions. carefully final +31872|1874|61|3|32|56827.84|0.05|0.04|R|F|1993-12-22|1993-10-08|1993-12-31|NONE|MAIL|quickly regular excuses. express di +31872|410|11|4|32|41933.12|0.09|0.02|A|F|1993-10-28|1993-11-22|1993-10-30|NONE|AIR| ironic requests. fluffily bol +31872|998|33|5|17|32282.83|0.09|0.06|A|F|1993-09-30|1993-10-12|1993-10-22|COLLECT COD|FOB|ar packages sleep ironic, regula +31872|151|4|6|24|25227.60|0.04|0.06|A|F|1993-10-30|1993-10-29|1993-11-15|NONE|MAIL|yly express, sp +31873|617|11|1|29|44010.69|0.00|0.04|R|F|1994-11-29|1995-02-06|1994-12-28|DELIVER IN PERSON|AIR|ld ideas eat +31873|987|22|2|24|45311.52|0.02|0.04|R|F|1994-12-10|1994-12-28|1994-12-23|COLLECT COD|MAIL|s. fluffily final deposits are. +31873|1908|53|3|32|57916.80|0.03|0.04|R|F|1995-01-25|1995-01-04|1995-01-27|NONE|TRUCK| accounts. regular ins +31873|674|37|4|46|72434.82|0.05|0.08|A|F|1994-12-25|1995-01-29|1994-12-27|COLLECT COD|RAIL|ructions sleep slyly ironic requests. +31873|774|75|5|18|30145.86|0.01|0.06|R|F|1994-12-13|1995-01-15|1995-01-03|DELIVER IN PERSON|SHIP|sits across the ironic foxes in +31873|355|12|6|38|47703.30|0.08|0.04|R|F|1995-03-03|1994-12-13|1995-03-24|TAKE BACK RETURN|FOB|ake slyly al +31874|330|15|1|19|23376.27|0.00|0.02|R|F|1992-12-09|1992-11-13|1992-12-31|DELIVER IN PERSON|REG AIR|posits are quickly f +31874|510|41|2|21|29620.71|0.06|0.06|R|F|1992-12-28|1992-12-11|1993-01-14|COLLECT COD|RAIL|quests try to a +31875|794|59|1|3|5084.37|0.09|0.01|A|F|1992-11-02|1992-09-24|1992-11-06|DELIVER IN PERSON|SHIP|tes engage along the ideas! never daring ep +31875|1439|79|2|17|22787.31|0.03|0.08|R|F|1992-10-11|1992-10-10|1992-11-02|DELIVER IN PERSON|TRUCK| regular, regular ide +31875|1696|20|3|43|68700.67|0.02|0.02|A|F|1992-11-06|1992-09-02|1992-11-17|DELIVER IN PERSON|MAIL|nally bold deposits was slyly. +31875|817|17|4|38|65276.78|0.03|0.05|R|F|1992-10-19|1992-08-18|1992-10-27|COLLECT COD|SHIP|xpress asymptotes af +31876|122|23|1|29|29641.48|0.08|0.02|N|O|1995-07-14|1995-07-13|1995-07-15|DELIVER IN PERSON|MAIL|ous platelets boo +31876|1121|22|2|50|51106.00|0.03|0.02|A|F|1995-06-07|1995-07-21|1995-06-10|TAKE BACK RETURN|MAIL|ely regular asymptotes! blithely +31876|470|29|3|32|43855.04|0.09|0.01|N|O|1995-08-20|1995-06-07|1995-08-26|NONE|MAIL|ding packages. pendin +31876|1316|93|4|6|7303.86|0.03|0.08|R|F|1995-05-22|1995-06-21|1995-06-05|NONE|MAIL|ronic requests along the express accoun +31876|336|21|5|47|58107.51|0.09|0.05|N|O|1995-08-25|1995-07-16|1995-09-01|DELIVER IN PERSON|AIR|ns. blithel +31877|1364|41|1|47|59471.92|0.09|0.06|A|F|1994-07-19|1994-09-21|1994-07-26|COLLECT COD|SHIP|s believe quickly. +31877|495|25|2|36|50237.64|0.10|0.07|A|F|1994-08-09|1994-09-14|1994-09-01|NONE|RAIL|s. carefully final ideas are ag +31877|123|50|3|20|20462.40|0.04|0.00|A|F|1994-07-07|1994-09-22|1994-07-27|COLLECT COD|TRUCK| attainments. fluffil +31877|835|36|4|37|64225.71|0.00|0.01|R|F|1994-08-06|1994-09-12|1994-08-22|COLLECT COD|TRUCK|es use blithely among the furiously ir +31878|346|75|1|5|6231.70|0.08|0.06|N|O|1996-04-18|1996-03-05|1996-04-29|TAKE BACK RETURN|TRUCK|lar, final foxes. quickly special package +31878|306|63|2|40|48252.00|0.02|0.01|N|O|1996-02-12|1996-03-11|1996-03-02|COLLECT COD|TRUCK|al deposits are along the unusual patter +31878|144|45|3|1|1044.14|0.04|0.07|N|O|1996-02-08|1996-01-22|1996-03-03|NONE|MAIL| final foxes ag +31878|1349|50|4|44|55014.96|0.00|0.02|N|O|1996-02-03|1996-02-18|1996-02-07|DELIVER IN PERSON|MAIL| requests. blithely final pinto bea +31878|166|93|5|37|39447.92|0.06|0.05|N|O|1996-01-18|1996-02-18|1996-02-06|COLLECT COD|SHIP|nal requests cajole blithely. reques +31878|29|80|6|7|6503.14|0.04|0.05|N|O|1996-02-10|1996-03-06|1996-03-07|DELIVER IN PERSON|RAIL|even accounts. requests wake slyl +31878|1557|98|7|20|29171.00|0.07|0.00|N|O|1996-04-04|1996-02-13|1996-04-24|TAKE BACK RETURN|AIR|counts wake quickly +31879|1455|34|1|25|33911.25|0.06|0.08|R|F|1993-10-24|1993-09-30|1993-11-17|DELIVER IN PERSON|RAIL| pinto bean +31879|1864|94|2|6|10595.16|0.07|0.08|R|F|1993-10-06|1993-09-09|1993-10-23|TAKE BACK RETURN|REG AIR|ackages boost theodolites. fur +31879|551|82|3|41|59513.55|0.10|0.03|A|F|1993-08-27|1993-09-30|1993-09-25|COLLECT COD|FOB| packages haggle quickly. furiously bold ac +31904|65|66|1|25|24126.50|0.07|0.04|N|O|1997-05-18|1997-06-21|1997-06-10|DELIVER IN PERSON|TRUCK|gular foxes. carefully furi +31904|1214|52|2|41|45723.61|0.01|0.00|N|O|1997-07-31|1997-05-13|1997-08-21|COLLECT COD|AIR|impress careful +31904|1325|40|3|4|4905.28|0.04|0.03|N|O|1997-06-06|1997-06-11|1997-06-27|COLLECT COD|RAIL|ing ideas after the final pinto b +31904|598|89|4|11|16484.49|0.10|0.05|N|O|1997-05-05|1997-06-01|1997-05-15|COLLECT COD|RAIL|silent requests. dependen +31905|553|84|1|22|31978.10|0.00|0.07|N|O|1998-07-31|1998-06-02|1998-08-03|DELIVER IN PERSON|AIR|cingly around the quickly +31906|1144|45|1|34|35534.76|0.07|0.04|N|O|1997-09-13|1997-10-07|1997-10-05|NONE|TRUCK|ole. slyly regu +31906|90|41|2|33|32672.97|0.02|0.06|N|O|1997-08-10|1997-08-16|1997-08-12|NONE|FOB|ly beside the speci +31907|421|9|1|32|42285.44|0.01|0.02|R|F|1993-06-10|1993-08-03|1993-06-28|COLLECT COD|RAIL|. bold, regular foxes wake slyl +31907|1419|98|2|37|48855.17|0.03|0.01|A|F|1993-09-02|1993-07-19|1993-09-28|NONE|TRUCK|ular ideas use slyly furiously silent r +31907|550|51|3|21|30461.55|0.06|0.08|A|F|1993-07-08|1993-07-31|1993-07-19|DELIVER IN PERSON|REG AIR|age blithely. blithely ironic req +31907|1573|54|4|50|73728.50|0.00|0.05|R|F|1993-07-14|1993-07-27|1993-07-25|NONE|REG AIR|nag carefully after the fluffily expr +31907|694|26|5|12|19136.28|0.09|0.08|A|F|1993-06-28|1993-07-15|1993-07-23|COLLECT COD|FOB| regular packages boost. courts use +31908|1877|78|1|5|8894.35|0.07|0.07|N|O|1998-03-07|1998-02-24|1998-03-23|TAKE BACK RETURN|MAIL|ounts. even de +31908|109|36|2|27|27245.70|0.03|0.03|N|O|1998-01-29|1998-04-03|1998-02-26|COLLECT COD|RAIL|y regular dependencies. slyly final courts +31908|694|26|3|16|25515.04|0.03|0.03|N|O|1998-03-10|1998-02-12|1998-03-26|DELIVER IN PERSON|AIR|hely final packages. ir +31909|521|82|1|26|36959.52|0.03|0.04|A|F|1993-08-13|1993-07-11|1993-08-15|NONE|AIR|y bold accounts. quickly final dep +31909|34|60|2|48|44833.44|0.10|0.04|R|F|1993-07-30|1993-08-08|1993-08-24|NONE|FOB|sual accounts. slyly unus +31910|994|29|1|47|89064.53|0.08|0.01|R|F|1995-02-04|1994-12-05|1995-02-10|DELIVER IN PERSON|MAIL|uts along the pinto beans +31910|1727|12|2|24|39089.28|0.02|0.06|R|F|1994-11-10|1995-01-04|1994-12-05|TAKE BACK RETURN|SHIP|posits sleep +31910|1805|49|3|40|68272.00|0.03|0.02|A|F|1994-11-01|1994-12-31|1994-11-02|TAKE BACK RETURN|REG AIR|n deposits cajole fluffily agai +31910|194|47|4|28|30637.32|0.05|0.07|A|F|1994-12-06|1994-12-23|1995-01-02|DELIVER IN PERSON|MAIL|y furious theod +31910|1091|27|5|49|48612.41|0.09|0.03|R|F|1995-02-12|1995-01-27|1995-03-08|NONE|RAIL| deposits. pending, special +31910|204|5|6|33|36438.60|0.01|0.03|A|F|1994-12-29|1994-12-28|1995-01-13|NONE|REG AIR|its wake carefully furiously regular req +31910|896|96|7|8|14375.12|0.09|0.00|A|F|1995-02-28|1994-12-10|1995-03-23|COLLECT COD|MAIL|asymptotes mold against the platelets. +31911|272|100|1|3|3516.81|0.02|0.04|R|F|1993-10-02|1993-11-07|1993-10-09|COLLECT COD|TRUCK|unusual pinto beans. blithely +31936|1728|71|1|43|70077.96|0.08|0.06|N|O|1996-04-13|1996-02-22|1996-05-13|NONE|TRUCK|jole blithely +31936|1655|97|2|39|60709.35|0.08|0.08|N|O|1996-01-03|1996-01-21|1996-01-04|NONE|REG AIR|refully close theodolites cajole s +31936|1847|91|3|37|64707.08|0.03|0.00|N|O|1996-01-31|1996-02-29|1996-02-09|TAKE BACK RETURN|SHIP|hely pending instructions. slyly idl +31936|1795|22|4|9|15271.11|0.10|0.00|N|O|1996-03-08|1996-01-17|1996-03-22|NONE|REG AIR|sts cajole blith +31936|1485|64|5|38|52686.24|0.07|0.06|N|O|1996-02-17|1996-02-19|1996-03-11|DELIVER IN PERSON|RAIL| requests: slyly special +31936|986|21|6|41|77366.18|0.03|0.00|N|O|1996-04-17|1996-02-27|1996-05-05|COLLECT COD|TRUCK|ickly regular deposits. blithely regu +31936|181|34|7|11|11892.98|0.05|0.03|N|O|1996-04-09|1996-02-13|1996-04-21|TAKE BACK RETURN|MAIL|e ironic excuses boost blith +31937|1755|40|1|1|1656.75|0.04|0.01|N|O|1998-05-14|1998-04-27|1998-05-19|NONE|MAIL|rash quickly within +31938|1166|3|1|47|50156.52|0.02|0.07|N|O|1995-08-05|1995-10-21|1995-08-08|TAKE BACK RETURN|REG AIR|uests eat above the quickly even pi +31938|1188|89|2|6|6535.08|0.03|0.00|N|O|1995-11-24|1995-10-08|1995-12-15|NONE|MAIL|carefully u +31938|798|63|3|24|40770.96|0.00|0.00|N|O|1995-11-15|1995-08-27|1995-11-21|NONE|RAIL| the sheaves boost carefully across +31938|1335|74|4|26|32144.58|0.08|0.02|N|O|1995-10-14|1995-09-30|1995-11-09|NONE|FOB|unusual accounts +31938|439|27|5|29|38843.47|0.07|0.05|N|O|1995-11-09|1995-10-19|1995-11-14|COLLECT COD|MAIL|uses print qui +31938|224|25|6|2|2248.44|0.08|0.08|N|O|1995-08-31|1995-09-01|1995-09-24|COLLECT COD|TRUCK|es wake careful +31939|1081|52|1|36|35354.88|0.09|0.07|N|O|1995-08-19|1995-08-02|1995-08-26|TAKE BACK RETURN|RAIL|al pinto beans integrate quickly along +31939|1355|94|2|42|52766.70|0.01|0.08|N|O|1995-09-24|1995-07-27|1995-10-21|TAKE BACK RETURN|FOB|ackages. blit +31940|1167|4|1|22|23499.52|0.09|0.00|A|F|1992-09-09|1992-08-24|1992-09-15|TAKE BACK RETURN|RAIL|regular accounts haggle fluffi +31941|448|49|1|12|16181.28|0.10|0.06|A|F|1994-06-06|1994-05-29|1994-07-01|COLLECT COD|SHIP| of the ir +31941|1346|61|2|24|29936.16|0.08|0.00|R|F|1994-05-18|1994-06-10|1994-05-23|COLLECT COD|MAIL| even deposits? ironic accounts +31941|1577|78|3|33|48792.81|0.09|0.01|R|F|1994-07-10|1994-04-28|1994-07-21|TAKE BACK RETURN|RAIL|tect slyly until t +31941|762|95|4|32|53208.32|0.01|0.05|R|F|1994-04-08|1994-06-12|1994-04-20|NONE|REG AIR|efully regular packages thrash careful +31941|894|28|5|1|1794.89|0.10|0.05|A|F|1994-05-30|1994-04-28|1994-06-26|COLLECT COD|RAIL|ing instructions h +31941|1289|64|6|3|3570.84|0.00|0.02|A|F|1994-04-29|1994-05-14|1994-05-26|COLLECT COD|SHIP| above the +31942|1331|70|1|6|7393.98|0.00|0.04|N|O|1997-02-14|1997-01-17|1997-03-05|DELIVER IN PERSON|AIR|und the asymptotes. gifts sl +31942|1320|59|2|41|50074.12|0.06|0.04|N|O|1996-12-31|1997-02-10|1997-01-02|NONE|REG AIR| warthogs. never +31942|1066|37|3|26|25143.56|0.08|0.05|N|O|1996-12-28|1996-12-29|1997-01-02|DELIVER IN PERSON|AIR|ss the unusual, even instr +31943|58|9|1|15|14370.75|0.04|0.06|N|O|1995-06-27|1995-04-22|1995-07-07|TAKE BACK RETURN|AIR|ly unusual instructio +31968|621|84|1|32|48691.84|0.02|0.07|N|O|1998-09-20|1998-07-26|1998-09-30|TAKE BACK RETURN|TRUCK|se blithely quickly regular foxes. qu +31968|1911|100|2|22|39884.02|0.09|0.01|N|O|1998-08-05|1998-08-21|1998-08-21|NONE|SHIP|e against t +31968|495|96|3|19|26514.31|0.05|0.04|N|O|1998-07-19|1998-08-08|1998-08-03|DELIVER IN PERSON|FOB|uctions sleep ironic, unusual i +31968|1091|62|4|6|5952.54|0.00|0.03|N|O|1998-08-18|1998-08-02|1998-09-06|DELIVER IN PERSON|AIR| pending dependencies a +31969|922|57|1|28|51041.76|0.07|0.04|N|O|1998-07-17|1998-07-24|1998-08-09|COLLECT COD|FOB| bold requests wak +31969|54|5|2|2|1908.10|0.01|0.01|N|O|1998-08-12|1998-07-03|1998-08-24|TAKE BACK RETURN|TRUCK| ironic requests nag. furi +31969|469|57|3|13|17802.98|0.00|0.03|N|O|1998-05-28|1998-07-12|1998-06-15|DELIVER IN PERSON|RAIL|s. furiously ironic Tiresi +31969|1090|96|4|39|38652.51|0.07|0.06|N|O|1998-09-22|1998-08-09|1998-10-19|NONE|RAIL| slyly throughout the blithely bold +31970|1344|21|1|45|56040.30|0.05|0.04|A|F|1993-03-24|1993-01-26|1993-04-23|TAKE BACK RETURN|TRUCK|deas are never along the blithel +31970|185|86|2|15|16277.70|0.04|0.00|A|F|1993-01-28|1993-02-19|1993-02-01|COLLECT COD|AIR| bold, special sheaves along +31970|75|51|3|32|31202.24|0.10|0.06|A|F|1993-03-09|1993-01-27|1993-04-08|TAKE BACK RETURN|MAIL|use furiously special packages +31971|1500|1|1|39|54658.50|0.00|0.04|N|O|1998-07-14|1998-07-04|1998-07-24|NONE|SHIP|ckly ironic packages. furiously entici +31971|313|98|2|45|54598.95|0.04|0.07|N|O|1998-07-31|1998-07-23|1998-08-25|DELIVER IN PERSON|REG AIR|ess, bold requests above the iro +31971|468|98|3|3|4105.38|0.06|0.05|N|O|1998-06-14|1998-08-05|1998-06-16|COLLECT COD|MAIL|lyly quiet pa +31972|90|91|1|6|5940.54|0.08|0.04|N|O|1998-08-31|1998-10-03|1998-09-14|TAKE BACK RETURN|FOB|. blithely regular pinto bean +31973|1935|80|1|7|12858.51|0.01|0.06|N|O|1995-07-31|1995-06-22|1995-08-12|NONE|AIR|t deposits na +31973|632|26|2|18|27587.34|0.10|0.08|N|O|1995-08-06|1995-07-24|1995-09-05|TAKE BACK RETURN|REG AIR|ainst the slyly final +31973|190|17|3|11|11992.09|0.04|0.03|R|F|1995-05-15|1995-07-02|1995-06-14|COLLECT COD|MAIL|r pinto beans. regular, +31973|301|30|4|6|7207.80|0.02|0.07|N|O|1995-07-16|1995-06-19|1995-08-15|COLLECT COD|MAIL|ss, even accounts are furiously +31973|1376|15|5|32|40875.84|0.05|0.00|N|O|1995-09-09|1995-08-06|1995-09-29|NONE|REG AIR|of the foxes. fluffily permanent packa +31973|1363|2|6|14|17701.04|0.04|0.00|N|O|1995-08-18|1995-07-21|1995-08-27|COLLECT COD|RAIL| regular foxes affi +31974|1078|14|1|15|14686.05|0.02|0.03|N|O|1998-04-11|1998-05-29|1998-04-25|TAKE BACK RETURN|FOB|sits. regular realms agai +31974|1604|5|2|26|39145.60|0.10|0.04|N|O|1998-06-06|1998-06-24|1998-06-24|DELIVER IN PERSON|MAIL|sleep fluffily silent accounts. quickly exp +31974|1718|19|3|2|3239.42|0.03|0.06|N|O|1998-07-12|1998-06-24|1998-07-16|COLLECT COD|SHIP|. slyly exp +31974|348|49|4|26|32456.84|0.02|0.05|N|O|1998-06-29|1998-06-07|1998-07-08|COLLECT COD|FOB| the accounts. slyly regular idea +31974|1469|9|5|50|68523.00|0.03|0.06|N|O|1998-05-09|1998-06-02|1998-06-07|TAKE BACK RETURN|MAIL|riously silent multipliers. blithely si +31974|1974|7|6|30|56279.10|0.03|0.08|N|O|1998-07-12|1998-05-07|1998-07-25|NONE|TRUCK|nly unusual theo +31974|566|57|7|42|61595.52|0.09|0.08|N|O|1998-06-04|1998-05-22|1998-06-26|DELIVER IN PERSON|TRUCK|arefully final packages. blithely ironic +31975|1781|66|1|49|82456.22|0.05|0.05|A|F|1993-04-14|1993-02-27|1993-04-24|TAKE BACK RETURN|RAIL|y across t +32000|109|88|1|17|17154.70|0.02|0.02|R|F|1992-12-04|1992-12-05|1992-12-15|COLLECT COD|FOB|ress instructions boost blithely pendi +32000|1520|41|2|30|42645.60|0.02|0.03|A|F|1992-09-23|1992-11-28|1992-10-07|NONE|AIR|thely thin deposits are about the final, +32000|481|69|3|45|62166.60|0.04|0.02|A|F|1992-09-29|1992-10-23|1992-10-08|NONE|SHIP| blithely final asymptotes. f +32000|1494|95|4|21|29305.29|0.05|0.02|A|F|1993-01-11|1992-11-11|1993-01-12|DELIVER IN PERSON|FOB|blithely slow deposits. fluffily bold pl +32001|1786|71|1|32|54008.96|0.03|0.02|N|O|1995-12-14|1996-01-03|1996-01-08|DELIVER IN PERSON|TRUCK|ndencies play fl +32001|752|17|2|48|79332.00|0.00|0.06|N|O|1996-02-16|1995-12-18|1996-03-01|COLLECT COD|FOB|dolites haggl +32001|1960|5|3|12|22343.52|0.04|0.06|N|O|1995-12-30|1995-12-12|1996-01-05|TAKE BACK RETURN|MAIL|ites? carefully exp +32001|1339|40|4|22|27287.26|0.03|0.03|N|O|1996-01-21|1995-12-31|1996-02-16|COLLECT COD|RAIL|onic pinto bean +32001|1253|65|5|35|40398.75|0.05|0.01|N|O|1996-02-03|1996-01-16|1996-03-02|TAKE BACK RETURN|TRUCK|ve the furiously pending grouches. bold +32002|1520|41|1|28|39802.56|0.00|0.02|R|F|1993-09-12|1993-09-19|1993-09-21|TAKE BACK RETURN|SHIP|usly final frays. +32002|1237|49|2|47|53496.81|0.04|0.05|A|F|1993-11-04|1993-09-16|1993-11-20|COLLECT COD|AIR|pendencies across the fluffily si +32002|304|89|3|15|18064.50|0.00|0.04|R|F|1993-08-14|1993-08-29|1993-09-01|TAKE BACK RETURN|FOB|finally final theodolites. fluf +32002|1614|38|4|24|36374.64|0.06|0.00|R|F|1993-07-29|1993-09-11|1993-08-18|DELIVER IN PERSON|SHIP|deposits doubt slyly slyly bold acco +32003|1831|75|1|2|3465.66|0.05|0.05|N|O|1996-04-29|1996-06-18|1996-05-09|DELIVER IN PERSON|FOB| platelets haggle quickly +32003|1985|74|2|23|43400.54|0.09|0.08|N|O|1996-05-10|1996-05-27|1996-05-15|NONE|REG AIR|luffily pending grouc +32003|965|68|3|28|52246.88|0.06|0.00|N|O|1996-05-09|1996-05-30|1996-05-16|COLLECT COD|REG AIR|tructions c +32003|511|72|4|40|56460.40|0.01|0.06|N|O|1996-07-07|1996-05-30|1996-07-08|NONE|RAIL|thely final theodolites are request +32003|986|55|5|11|20756.78|0.10|0.06|N|O|1996-05-28|1996-06-09|1996-06-26|DELIVER IN PERSON|REG AIR|ans nag ruthl +32004|1628|29|1|14|21414.68|0.03|0.04|N|O|1996-10-29|1996-09-03|1996-11-07|NONE|RAIL|xes integrate flu +32004|354|39|2|1|1254.35|0.07|0.05|N|O|1996-10-19|1996-08-04|1996-10-23|TAKE BACK RETURN|TRUCK| furiously final packages +32004|1365|42|3|23|29126.28|0.07|0.05|N|O|1996-10-16|1996-09-10|1996-10-26|TAKE BACK RETURN|FOB|es. quickly regular +32004|144|23|4|5|5220.70|0.04|0.00|N|O|1996-07-09|1996-08-13|1996-07-16|TAKE BACK RETURN|TRUCK|g pinto beans slee +32004|1477|56|5|26|35840.22|0.01|0.08|N|O|1996-10-29|1996-09-23|1996-11-07|DELIVER IN PERSON|FOB|dencies boost sly +32005|25|76|1|48|44400.96|0.05|0.06|N|O|1997-08-07|1997-07-01|1997-08-30|TAKE BACK RETURN|TRUCK| slyly along the furiously express +32005|73|49|2|44|42815.08|0.01|0.08|N|O|1997-06-28|1997-08-21|1997-07-04|DELIVER IN PERSON|MAIL|ess gifts believe blithely about the iro +32005|1761|88|3|44|73161.44|0.09|0.02|N|O|1997-07-01|1997-08-20|1997-07-13|DELIVER IN PERSON|FOB| blithely regular instructions: flu +32005|820|20|4|5|8604.10|0.01|0.01|N|O|1997-07-08|1997-08-26|1997-08-03|TAKE BACK RETURN|MAIL|press instructions. qui +32005|412|42|5|8|10499.28|0.06|0.03|N|O|1997-06-06|1997-08-24|1997-07-02|TAKE BACK RETURN|RAIL|ular instructions. brave, reg +32006|1792|93|1|14|23713.06|0.08|0.00|N|O|1997-02-11|1997-01-21|1997-02-26|NONE|RAIL|ithely fin +32006|397|82|2|42|54490.38|0.02|0.01|N|O|1997-01-14|1997-01-23|1997-01-25|DELIVER IN PERSON|REG AIR|at the ironic requ +32006|670|33|3|2|3141.34|0.00|0.04|N|O|1997-02-26|1997-01-08|1997-03-15|NONE|SHIP| boost fluffily ironic pinto bea +32007|1215|90|1|34|37951.14|0.03|0.00|A|F|1995-03-27|1995-03-18|1995-04-12|COLLECT COD|FOB|lly. always pend +32007|162|63|2|27|28678.32|0.01|0.04|N|F|1995-05-23|1995-04-20|1995-06-21|NONE|FOB|ng pinto beans. slyly +32032|1457|75|1|3|4075.35|0.07|0.05|R|F|1992-06-18|1992-05-31|1992-07-09|DELIVER IN PERSON|FOB| deposits haggle quickly foxes. ironic +32032|404|92|2|2|2608.80|0.03|0.04|A|F|1992-08-13|1992-05-25|1992-08-23|NONE|REG AIR| about the blithel +32032|800|1|3|20|34016.00|0.10|0.04|A|F|1992-05-27|1992-06-01|1992-06-20|DELIVER IN PERSON|FOB| furiously final pinto bea +32033|682|14|1|3|4748.04|0.05|0.05|N|O|1996-06-11|1996-06-04|1996-07-08|COLLECT COD|RAIL|hely final requests wake final deposit +32034|1159|68|1|20|21203.00|0.05|0.08|N|O|1995-07-08|1995-07-31|1995-07-16|TAKE BACK RETURN|FOB|ccounts grow across the c +32034|1752|53|2|34|56227.50|0.04|0.03|N|F|1995-06-05|1995-08-14|1995-06-20|COLLECT COD|RAIL|ngage slyly. un +32035|1936|37|1|42|77193.06|0.08|0.02|N|O|1997-05-08|1997-05-28|1997-05-30|TAKE BACK RETURN|RAIL|nic pinto beans. slyly bold depende +32036|1895|82|1|19|34140.91|0.10|0.02|N|O|1996-01-27|1995-12-22|1996-02-22|DELIVER IN PERSON|RAIL|lithely ironic accounts near the fluffily e +32036|1429|30|2|26|34590.92|0.09|0.07|N|O|1995-10-07|1995-11-21|1995-10-18|DELIVER IN PERSON|RAIL|ts sleep along the ironic deposits. +32036|515|46|3|13|18401.63|0.05|0.05|N|O|1995-10-28|1995-11-30|1995-10-29|DELIVER IN PERSON|AIR|at furiously daring forges. deposits +32036|951|86|4|3|5555.85|0.06|0.06|N|O|1995-11-10|1995-11-16|1995-11-27|DELIVER IN PERSON|TRUCK|ckages wak +32036|425|13|5|31|41088.02|0.06|0.00|N|O|1995-10-24|1995-12-29|1995-11-08|DELIVER IN PERSON|FOB|arefully r +32036|1140|77|6|5|5205.70|0.04|0.02|N|O|1996-01-02|1995-11-07|1996-01-30|COLLECT COD|AIR|its. daringly express sa +32036|897|97|7|14|25170.46|0.00|0.06|N|O|1995-12-02|1995-11-14|1995-12-14|DELIVER IN PERSON|RAIL|lar pinto beans +32037|1061|32|1|48|46178.88|0.10|0.04|R|F|1994-02-25|1994-03-31|1994-03-05|COLLECT COD|RAIL|are fluffily quickly final theodolit +32037|587|88|2|16|23801.28|0.00|0.06|A|F|1994-05-15|1994-04-26|1994-06-05|DELIVER IN PERSON|AIR|ts wake furiously fina +32037|936|5|3|30|55107.90|0.05|0.05|A|F|1994-06-11|1994-04-02|1994-07-05|COLLECT COD|MAIL|onic requests sleep slyly. ironic, final ac +32037|1288|89|4|11|13082.08|0.09|0.04|R|F|1994-05-19|1994-05-13|1994-05-27|NONE|MAIL| carefully pend +32037|854|88|5|28|49135.80|0.00|0.01|A|F|1994-04-18|1994-05-16|1994-05-05|COLLECT COD|MAIL|al packages sleep blithely a +32037|1674|75|6|40|63026.80|0.05|0.05|R|F|1994-03-24|1994-03-26|1994-04-08|TAKE BACK RETURN|REG AIR|ironic theodolites boost slyly. furiousl +32037|344|45|7|27|33597.18|0.00|0.00|R|F|1994-04-24|1994-04-30|1994-05-03|NONE|MAIL|ole. pinto beans nag slyly. +32038|955|56|1|37|68670.15|0.10|0.07|A|F|1994-09-13|1994-07-30|1994-10-10|TAKE BACK RETURN|AIR|iously blithe accounts boost +32038|1150|23|2|25|26278.75|0.08|0.06|A|F|1994-07-20|1994-07-28|1994-08-19|DELIVER IN PERSON|MAIL|oxes cajole about the even foxes. p +32038|1177|78|3|38|40970.46|0.06|0.07|R|F|1994-09-12|1994-09-11|1994-09-15|DELIVER IN PERSON|RAIL|the packages. +32038|36|37|4|37|34633.11|0.08|0.05|A|F|1994-10-14|1994-09-05|1994-10-15|NONE|SHIP|onic requests. furiously bold pack +32038|1648|49|5|8|12397.12|0.10|0.02|R|F|1994-10-04|1994-08-17|1994-10-18|NONE|REG AIR|ost fluffily regular somas. +32038|1305|20|6|40|48252.00|0.07|0.03|R|F|1994-08-12|1994-07-18|1994-09-06|NONE|RAIL|onic packages haggle s +32039|255|83|1|5|5776.25|0.00|0.08|N|O|1998-03-12|1998-03-28|1998-03-29|COLLECT COD|SHIP| packages slee +32039|762|63|2|36|59859.36|0.07|0.06|N|O|1998-02-14|1998-04-11|1998-03-13|COLLECT COD|SHIP|ly regular +32064|511|12|1|33|46579.83|0.01|0.01|R|F|1993-12-26|1994-01-25|1994-01-22|TAKE BACK RETURN|RAIL|e carefully specia +32064|13|64|2|23|20999.23|0.05|0.07|A|F|1994-04-18|1994-01-29|1994-04-29|NONE|TRUCK|luffily pending packages sleep f +32065|1878|8|1|21|37377.27|0.05|0.06|N|O|1996-03-14|1996-01-14|1996-04-11|COLLECT COD|MAIL|y unusual th +32065|764|65|2|49|81573.24|0.03|0.03|N|O|1996-02-24|1996-02-28|1996-03-06|NONE|MAIL|ithely ironic theodolites. carefu +32065|442|30|3|48|64437.12|0.01|0.01|N|O|1996-03-06|1996-02-11|1996-03-30|COLLECT COD|FOB|ld packages play slyly +32065|1533|14|4|49|70291.97|0.07|0.07|N|O|1996-02-12|1996-02-02|1996-03-09|COLLECT COD|MAIL|leep perman +32065|1876|20|5|43|76448.41|0.07|0.04|N|O|1996-01-23|1996-01-02|1996-02-02|DELIVER IN PERSON|FOB|yly close packages alongside of the blithel +32065|1938|39|6|9|16559.37|0.04|0.02|N|O|1996-01-15|1996-03-01|1996-01-21|NONE|AIR|ic, ironic deposits would sleep fluffily ev +32066|1239|40|1|42|47889.66|0.05|0.05|N|O|1998-07-26|1998-08-25|1998-07-31|COLLECT COD|AIR|y ironic hoc +32066|535|66|2|36|51679.08|0.06|0.06|N|O|1998-10-26|1998-08-25|1998-10-28|DELIVER IN PERSON|AIR|tes. carefully regular requests aga +32066|1858|88|3|22|38716.70|0.01|0.07|N|O|1998-10-03|1998-09-21|1998-10-21|COLLECT COD|FOB|fully against +32066|1829|16|4|48|83079.36|0.00|0.06|N|O|1998-09-16|1998-09-12|1998-09-28|COLLECT COD|TRUCK|sly regular packages wake a +32066|364|65|5|26|32873.36|0.00|0.05|N|O|1998-11-07|1998-08-22|1998-12-07|COLLECT COD|SHIP|silent requests breach furious +32066|903|6|6|15|27058.50|0.02|0.08|N|O|1998-10-22|1998-10-02|1998-11-19|DELIVER IN PERSON|SHIP| accounts. furiously silent deposits x- +32067|246|1|1|27|30948.48|0.10|0.05|R|F|1992-05-25|1992-06-02|1992-06-02|TAKE BACK RETURN|AIR|ithely bold pinto beans are +32067|1228|40|2|36|40651.92|0.05|0.04|A|F|1992-06-10|1992-06-09|1992-07-09|NONE|AIR|nic requests according to the regular, +32067|862|96|3|47|82854.42|0.08|0.00|A|F|1992-03-28|1992-05-04|1992-04-11|NONE|RAIL|ickly silent account +32067|1607|8|4|8|12068.80|0.03|0.08|R|F|1992-06-09|1992-05-21|1992-06-29|DELIVER IN PERSON|MAIL| pinto beans are deposits. furiously th +32067|928|29|5|17|31091.64|0.10|0.06|A|F|1992-05-05|1992-05-24|1992-05-09|TAKE BACK RETURN|SHIP|even accounts sleep slyly: even d +32067|210|38|6|17|18873.57|0.08|0.02|A|F|1992-05-05|1992-04-24|1992-05-07|COLLECT COD|RAIL|xes are carefully. enti +32067|368|97|7|9|11415.24|0.05|0.07|A|F|1992-06-30|1992-04-15|1992-07-15|DELIVER IN PERSON|REG AIR|along the packages w +32068|1293|94|1|14|16720.06|0.07|0.00|R|F|1992-07-10|1992-09-07|1992-07-14|TAKE BACK RETURN|TRUCK|n after the slyly bol +32069|1334|11|1|13|16059.29|0.10|0.03|N|O|1996-01-01|1996-01-24|1996-01-27|NONE|MAIL|instructions +32069|1429|47|2|42|55877.64|0.00|0.00|N|O|1996-02-09|1996-02-14|1996-02-19|COLLECT COD|SHIP|s accounts. a +32069|1276|88|3|41|48268.07|0.07|0.01|N|O|1995-11-26|1996-01-20|1995-12-20|DELIVER IN PERSON|FOB|fter the even foxes. pinto beans slee +32069|700|32|4|28|44819.60|0.05|0.02|N|O|1996-01-19|1996-01-16|1996-02-16|TAKE BACK RETURN|MAIL|s platelets wake across the blithely regula +32069|124|3|5|24|24578.88|0.03|0.05|N|O|1996-01-01|1996-01-29|1996-01-10|NONE|AIR|express, special theodolites. carefully +32069|1459|77|6|20|27209.00|0.00|0.02|N|O|1996-01-25|1996-02-18|1996-02-11|COLLECT COD|REG AIR|lar excuses sleep alongside of t +32070|764|65|1|49|81573.24|0.04|0.03|A|F|1994-09-11|1994-08-19|1994-09-29|TAKE BACK RETURN|SHIP|final dependencies are +32070|1873|60|2|11|19523.57|0.07|0.00|R|F|1994-11-08|1994-09-24|1994-11-20|COLLECT COD|MAIL| cajole slyly around the carefu +32070|726|91|3|29|47174.88|0.09|0.05|R|F|1994-08-01|1994-08-25|1994-08-10|COLLECT COD|RAIL|dolites: blithely pending somas alo +32070|1711|38|4|16|25803.36|0.02|0.03|R|F|1994-10-24|1994-09-14|1994-11-18|TAKE BACK RETURN|MAIL|al instructions cajole. bli +32071|638|1|1|28|43081.64|0.03|0.07|N|O|1997-12-19|1997-11-17|1998-01-12|NONE|TRUCK|ongside of the slyly iro +32071|338|23|2|37|45818.21|0.08|0.04|N|O|1997-12-09|1997-10-21|1997-12-16|NONE|TRUCK|ounts-- pinto beans across th +32071|488|18|3|21|29158.08|0.04|0.06|N|O|1997-10-03|1997-10-30|1997-10-31|COLLECT COD|SHIP|ests haggle bli +32071|218|73|4|25|27955.25|0.06|0.04|N|O|1997-12-24|1997-11-20|1998-01-22|NONE|FOB|use above the +32071|1537|78|5|45|64733.85|0.04|0.07|N|O|1997-11-02|1997-10-17|1997-11-04|DELIVER IN PERSON|MAIL|. quietly r +32071|774|75|6|31|51917.87|0.10|0.07|N|O|1997-09-03|1997-11-16|1997-09-29|TAKE BACK RETURN|REG AIR|ss accounts +32071|1854|55|7|18|31605.30|0.02|0.02|N|O|1997-09-07|1997-11-27|1997-09-25|NONE|MAIL| ironic packages. bl +32096|137|38|1|25|25928.25|0.03|0.00|A|F|1994-11-03|1994-10-18|1994-11-14|NONE|RAIL|y special requests +32096|1384|61|2|14|17995.32|0.00|0.05|R|F|1994-11-19|1994-09-09|1994-12-19|COLLECT COD|RAIL|ntil the ironic, +32097|663|95|1|20|31273.20|0.09|0.05|N|O|1997-08-14|1997-06-18|1997-09-04|COLLECT COD|RAIL|ic deposits boost quick +32097|1155|56|2|25|26403.75|0.04|0.04|N|O|1997-06-18|1997-06-16|1997-06-19|COLLECT COD|RAIL|p blithely-- never regular dependencies +32097|1597|38|3|40|59943.60|0.10|0.02|N|O|1997-04-28|1997-06-13|1997-05-26|COLLECT COD|TRUCK|y. ironic pains are carefully at the slyly +32097|1193|94|4|35|38296.65|0.01|0.00|N|O|1997-05-08|1997-06-23|1997-05-30|COLLECT COD|RAIL|times special accounts. quickly special pin +32097|915|16|5|26|47213.66|0.01|0.04|N|O|1997-05-14|1997-05-28|1997-06-06|DELIVER IN PERSON|MAIL|omise among the requests +32097|1457|75|6|19|25810.55|0.00|0.06|N|O|1997-06-03|1997-06-02|1997-06-13|DELIVER IN PERSON|TRUCK|e bold foxes haggle furiously c +32097|1740|67|7|34|55819.16|0.09|0.07|N|O|1997-06-01|1997-07-12|1997-06-18|NONE|RAIL|nts affix blithe +32098|624|25|1|15|22869.30|0.02|0.00|A|F|1993-07-21|1993-09-11|1993-08-12|DELIVER IN PERSON|SHIP|carefully pending p +32098|677|40|2|6|9466.02|0.03|0.00|R|F|1993-08-07|1993-09-19|1993-08-23|NONE|AIR| requests haggle. carefully sile +32099|238|39|1|10|11382.30|0.02|0.08|A|F|1993-07-04|1993-08-01|1993-08-02|DELIVER IN PERSON|TRUCK|across the blithely regular depo +32099|373|30|2|49|62395.13|0.08|0.05|A|F|1993-06-10|1993-07-13|1993-06-21|COLLECT COD|TRUCK|ix furiously after the unusual +32100|1677|60|1|6|9472.02|0.06|0.07|R|F|1992-06-13|1992-07-13|1992-07-04|NONE|SHIP|ent requests +32100|153|32|2|7|7372.05|0.07|0.08|A|F|1992-09-09|1992-08-05|1992-10-07|NONE|TRUCK|accounts eat quic +32100|1452|70|3|25|33836.25|0.00|0.01|R|F|1992-08-24|1992-07-25|1992-09-21|TAKE BACK RETURN|FOB|t the blithely unusual +32100|299|81|4|15|17989.35|0.01|0.08|A|F|1992-09-18|1992-08-10|1992-10-16|COLLECT COD|MAIL| quickly daring reques +32101|1076|47|1|35|34197.45|0.10|0.02|R|F|1995-03-22|1995-02-28|1995-04-05|TAKE BACK RETURN|TRUCK| the fluffily bo +32101|558|19|2|15|21878.25|0.02|0.02|R|F|1995-04-08|1995-01-28|1995-04-18|TAKE BACK RETURN|AIR|ual requests abou +32101|16|92|3|41|37556.41|0.02|0.02|R|F|1995-01-05|1995-03-16|1995-02-04|NONE|FOB|sual, silent requests above the regular d +32101|505|96|4|20|28110.00|0.09|0.01|R|F|1995-03-29|1995-02-25|1995-04-01|COLLECT COD|AIR|lar, slow deposits sleep: fluffily ironic +32101|1723|50|5|39|63364.08|0.09|0.06|A|F|1995-03-16|1995-02-04|1995-04-01|NONE|SHIP|furiously final depos +32102|2000|89|1|28|25256.00|0.04|0.04|A|F|1993-01-11|1993-02-11|1993-02-03|COLLECT COD|SHIP|ously unusual requests. asymptotes ab +32102|232|14|2|4|4528.92|0.04|0.06|A|F|1993-01-08|1993-02-18|1993-01-14|NONE|FOB|l deposits eat. furiously ironic depo +32102|451|39|3|46|62166.70|0.09|0.06|R|F|1993-01-23|1993-02-08|1993-02-12|COLLECT COD|SHIP|ly regular instructions sleep ruthles +32102|1948|37|4|14|25899.16|0.09|0.08|A|F|1993-02-12|1993-02-08|1993-03-05|DELIVER IN PERSON|FOB| special instructions. furiously f +32103|1265|66|1|41|47816.66|0.08|0.07|R|F|1993-10-23|1993-09-24|1993-10-28|DELIVER IN PERSON|MAIL|ly even packages. express +32103|1777|4|2|16|26860.32|0.01|0.02|A|F|1993-08-13|1993-10-03|1993-08-20|COLLECT COD|TRUCK|s. slow excuses wake q +32103|1912|13|3|23|41719.93|0.08|0.08|A|F|1993-11-10|1993-09-03|1993-11-11|TAKE BACK RETURN|SHIP|int blithely a +32128|976|45|1|46|86340.62|0.02|0.04|A|F|1995-04-10|1995-03-27|1995-04-14|TAKE BACK RETURN|REG AIR|out the slyly ironic packages? +32128|1368|83|2|10|12693.60|0.04|0.08|R|F|1995-05-23|1995-03-29|1995-05-26|TAKE BACK RETURN|MAIL|ly regular deposits accordin +32129|1824|54|1|35|60403.70|0.06|0.00|N|O|1995-10-22|1995-09-30|1995-11-13|TAKE BACK RETURN|TRUCK|its. furiously ironic dolphins about the c +32129|1951|96|2|42|77823.90|0.05|0.03|N|O|1995-09-20|1995-08-13|1995-10-13|TAKE BACK RETURN|AIR|ily ironic pains. regular dolphins +32129|323|8|3|37|45262.84|0.03|0.01|N|O|1995-08-29|1995-09-19|1995-09-24|TAKE BACK RETURN|SHIP|ously final instructi +32129|1941|86|4|42|77403.48|0.01|0.02|N|O|1995-08-14|1995-09-25|1995-09-11|NONE|RAIL|o beans integrate furiously about the +32129|1104|5|5|33|33168.30|0.02|0.08|N|O|1995-08-11|1995-09-18|1995-09-06|COLLECT COD|AIR| the blith +32129|1363|40|6|21|26551.56|0.03|0.04|N|O|1995-09-02|1995-08-15|1995-10-02|COLLECT COD|FOB|ld, even instructions. quickly exp +32129|1434|13|7|48|64100.64|0.08|0.06|N|O|1995-09-11|1995-08-18|1995-09-18|DELIVER IN PERSON|FOB|y ironic theodolites. close requests sleep +32130|1557|58|1|40|58342.00|0.02|0.02|R|F|1993-12-06|1993-11-14|1993-12-25|DELIVER IN PERSON|REG AIR|efully ironic p +32130|1654|55|2|34|52892.10|0.10|0.07|R|F|1993-11-29|1993-11-03|1993-12-07|DELIVER IN PERSON|FOB|ifts cajole +32131|796|97|1|11|18664.69|0.02|0.00|R|F|1994-04-16|1994-03-06|1994-05-05|NONE|AIR|ly regular packa +32131|1969|58|2|25|46774.00|0.03|0.08|R|F|1994-03-12|1994-01-30|1994-03-18|TAKE BACK RETURN|FOB| integrate a +32131|408|67|3|6|7850.40|0.10|0.00|A|F|1994-04-11|1994-02-22|1994-05-02|TAKE BACK RETURN|TRUCK| the ironic, bold pinto bea +32131|249|31|4|41|47118.84|0.04|0.08|A|F|1994-04-20|1994-03-21|1994-05-15|COLLECT COD|RAIL|long the furiously special fo +32131|1643|44|5|4|6178.56|0.05|0.03|A|F|1994-04-11|1994-03-11|1994-04-27|TAKE BACK RETURN|FOB| quickly ironic pin +32132|317|46|1|49|59648.19|0.04|0.00|N|O|1996-04-21|1996-05-05|1996-05-09|COLLECT COD|MAIL|nal deposits serve. quickly +32132|1455|95|2|44|59683.80|0.08|0.07|N|O|1996-07-16|1996-04-29|1996-07-23|TAKE BACK RETURN|TRUCK|nstructions are +32133|1788|31|1|46|77729.88|0.02|0.08|N|O|1997-10-06|1997-09-01|1997-10-15|DELIVER IN PERSON|TRUCK|ly even sentiments wake flu +32133|926|61|2|24|43846.08|0.05|0.07|N|O|1997-10-21|1997-09-22|1997-11-07|NONE|TRUCK|uriously even ideas will wa +32133|501|32|3|31|43446.50|0.10|0.00|N|O|1997-10-10|1997-08-13|1997-11-06|TAKE BACK RETURN|FOB|y express pinto beans. quickly express theo +32133|512|3|4|10|14125.10|0.04|0.02|N|O|1997-07-08|1997-08-18|1997-07-09|DELIVER IN PERSON|AIR|ccounts. regularly close deposits +32134|119|98|1|14|14267.54|0.10|0.06|N|O|1996-03-06|1996-03-18|1996-04-05|NONE|MAIL| deposits along the special ideas u +32134|96|72|2|24|23906.16|0.07|0.06|N|O|1996-04-18|1996-03-13|1996-05-08|COLLECT COD|FOB|s use. even accounts use f +32134|136|37|3|19|19686.47|0.10|0.02|N|O|1996-03-30|1996-04-25|1996-04-18|DELIVER IN PERSON|SHIP|ual deposits haggle +32134|1752|95|4|41|67803.75|0.08|0.03|N|O|1996-02-19|1996-04-06|1996-03-14|DELIVER IN PERSON|TRUCK|ar, regular pack +32134|1308|47|5|27|32651.10|0.07|0.06|N|O|1996-03-16|1996-04-23|1996-03-22|TAKE BACK RETURN|SHIP|inal instruction +32135|1159|96|1|48|50887.20|0.10|0.06|R|F|1994-01-23|1994-01-08|1994-01-31|TAKE BACK RETURN|AIR|ts! final foxes promise at the +32135|535|36|2|45|64598.85|0.00|0.08|R|F|1994-03-11|1994-02-18|1994-03-28|DELIVER IN PERSON|SHIP| express accounts c +32135|37|63|3|28|26236.84|0.02|0.00|A|F|1994-03-15|1994-01-09|1994-04-10|TAKE BACK RETURN|TRUCK|he furiously pending foxes c +32135|323|24|4|25|30583.00|0.05|0.01|R|F|1994-02-10|1993-12-30|1994-02-28|NONE|REG AIR|eposits across the sile +32135|1162|99|5|13|13821.08|0.08|0.06|R|F|1994-02-13|1994-01-05|1994-03-08|DELIVER IN PERSON|SHIP|packages; i +32135|660|54|6|13|20288.58|0.07|0.00|A|F|1994-03-06|1994-02-04|1994-03-25|NONE|MAIL|ckly regular accounts wake slyly f +32160|641|73|1|34|52415.76|0.08|0.05|N|O|1996-04-27|1996-04-23|1996-04-29|NONE|MAIL|ideas engage past the deposits. expres +32160|1523|4|2|12|17094.24|0.03|0.03|N|O|1996-03-22|1996-05-23|1996-04-20|DELIVER IN PERSON|RAIL|ajole. furious +32160|1410|50|3|36|47210.76|0.01|0.00|N|O|1996-04-18|1996-04-23|1996-04-28|DELIVER IN PERSON|REG AIR|ar packages alongside of the express, fin +32160|680|43|4|31|49001.08|0.09|0.01|N|O|1996-05-22|1996-04-23|1996-06-07|COLLECT COD|RAIL|eodolites. furiously ironic asymptot +32160|281|36|5|17|20081.76|0.00|0.06|N|O|1996-06-29|1996-05-21|1996-07-04|TAKE BACK RETURN|RAIL|special packages +32160|154|7|6|5|5270.75|0.06|0.05|N|O|1996-07-02|1996-05-14|1996-07-08|TAKE BACK RETURN|FOB| theodolites ser +32161|1097|98|1|14|13973.26|0.01|0.07|N|O|1996-12-15|1996-11-14|1996-12-23|TAKE BACK RETURN|FOB|e up the daring packages. +32162|1758|43|1|48|79668.00|0.06|0.01|N|O|1997-11-21|1997-12-25|1997-11-29|TAKE BACK RETURN|REG AIR| furiously regu +32162|1115|88|2|43|43692.73|0.05|0.05|N|O|1997-11-23|1997-12-25|1997-12-01|NONE|AIR|efully unusual p +32163|935|4|1|20|36718.60|0.03|0.02|A|F|1993-05-07|1993-06-13|1993-05-09|TAKE BACK RETURN|MAIL|ding packages impress slyl +32163|1138|47|2|4|4156.52|0.05|0.00|A|F|1993-05-13|1993-06-29|1993-06-07|NONE|MAIL|ithely express fo +32164|1163|100|1|40|42566.40|0.06|0.05|A|F|1993-04-23|1993-03-24|1993-05-02|TAKE BACK RETURN|MAIL| furiously a +32164|1425|26|2|15|19896.30|0.10|0.00|R|F|1993-02-06|1993-03-23|1993-02-19|DELIVER IN PERSON|SHIP|tes sleep carefully +32164|847|14|3|19|33208.96|0.08|0.07|A|F|1993-03-06|1993-03-05|1993-03-21|COLLECT COD|SHIP|hely final dep +32164|1539|40|4|22|31691.66|0.05|0.03|R|F|1993-05-21|1993-03-19|1993-05-23|DELIVER IN PERSON|TRUCK|carefully express ideas. depen +32164|301|58|5|43|51655.90|0.07|0.06|A|F|1993-04-15|1993-04-27|1993-05-06|TAKE BACK RETURN|TRUCK| sly asymptotes after the reque +32164|648|11|6|38|58848.32|0.02|0.00|R|F|1993-05-07|1993-04-29|1993-05-22|COLLECT COD|RAIL|ly express dependencies! q +32164|358|59|7|3|3775.05|0.01|0.03|A|F|1993-03-20|1993-03-27|1993-04-16|DELIVER IN PERSON|MAIL|inst the furiously permane +32165|1372|49|1|48|61121.76|0.04|0.03|A|F|1992-11-18|1992-12-15|1992-11-28|TAKE BACK RETURN|RAIL|l, special dependencies. always bold theod +32165|1063|99|2|30|28921.80|0.09|0.05|A|F|1993-01-07|1993-01-11|1993-01-20|COLLECT COD|SHIP|s. instructions +32165|804|71|3|20|34096.00|0.05|0.02|R|F|1993-01-26|1992-12-12|1993-02-20|DELIVER IN PERSON|RAIL|uests. even theodolites kindle furiously +32166|1116|89|1|23|23393.53|0.10|0.05|A|F|1994-06-28|1994-08-15|1994-07-17|COLLECT COD|REG AIR|use blithely to the final deposits. +32166|1004|75|2|49|44345.00|0.06|0.07|A|F|1994-09-04|1994-07-22|1994-09-22|DELIVER IN PERSON|FOB|counts. final, regular instructi +32166|1651|93|3|39|60553.35|0.07|0.02|R|F|1994-09-22|1994-08-16|1994-10-13|NONE|RAIL| carefully final warh +32166|1069|75|4|1|970.06|0.08|0.08|A|F|1994-06-25|1994-06-29|1994-07-17|NONE|REG AIR|y among the fl +32166|454|84|5|7|9481.15|0.01|0.01|A|F|1994-06-18|1994-07-26|1994-07-15|TAKE BACK RETURN|SHIP|t theodolites detect +32166|1382|21|6|45|57752.10|0.08|0.02|A|F|1994-09-13|1994-08-01|1994-10-03|TAKE BACK RETURN|AIR|ntegrate across the final, sile +32167|1716|17|1|30|48531.30|0.03|0.01|N|O|1997-01-07|1997-02-16|1997-01-28|COLLECT COD|SHIP|uests must +32167|1187|60|2|34|36998.12|0.00|0.08|N|O|1997-03-24|1997-02-25|1997-04-13|DELIVER IN PERSON|SHIP|xpress ideas haggle unusual depende +32167|698|99|3|8|12789.52|0.10|0.06|N|O|1997-03-09|1997-01-17|1997-03-18|DELIVER IN PERSON|MAIL|ns engage quickly regular packages. bl +32167|1414|54|4|7|9207.87|0.02|0.08|N|O|1997-02-13|1997-01-15|1997-02-23|COLLECT COD|SHIP|r pinto beans sle +32167|1645|28|5|9|13919.76|0.05|0.00|N|O|1996-12-24|1997-01-14|1997-01-06|DELIVER IN PERSON|RAIL|ts serve furiously slowly expr +32167|1166|75|6|29|30947.64|0.09|0.06|N|O|1997-01-06|1997-02-04|1997-01-13|TAKE BACK RETURN|FOB|s the furiously ironic ac +32167|636|68|7|12|18439.56|0.10|0.00|N|O|1997-02-27|1997-01-12|1997-03-22|DELIVER IN PERSON|SHIP|counts wake across the slyl +32192|509|40|1|2|2819.00|0.07|0.07|R|F|1992-03-26|1992-05-15|1992-04-20|COLLECT COD|MAIL|nusual requests haggle ca +32192|1444|23|2|11|14799.84|0.00|0.03|R|F|1992-05-17|1992-05-10|1992-06-06|NONE|TRUCK| atop the ca +32192|1109|46|3|16|16161.60|0.04|0.04|A|F|1992-04-17|1992-05-14|1992-04-23|NONE|AIR|nic deposits are sl +32192|1726|53|4|5|8138.60|0.10|0.02|R|F|1992-06-09|1992-05-17|1992-07-03|NONE|TRUCK|ests along the unusual packages wake furiou +32192|1633|34|5|16|24554.08|0.07|0.04|R|F|1992-03-07|1992-05-04|1992-03-09|TAKE BACK RETURN|RAIL|ckages-- furiously ironic accounts accor +32192|1805|49|6|45|76806.00|0.10|0.07|R|F|1992-05-16|1992-03-21|1992-05-17|DELIVER IN PERSON|FOB|regular packages cajol +32192|1310|25|7|42|50875.02|0.04|0.02|R|F|1992-05-08|1992-03-22|1992-05-15|DELIVER IN PERSON|FOB|eans are furiously. re +32193|1264|39|1|6|6991.56|0.08|0.08|A|F|1993-12-06|1993-12-25|1993-12-27|COLLECT COD|MAIL|ntegrate slyly even depo +32193|897|98|2|10|17978.90|0.08|0.06|R|F|1993-12-03|1993-12-24|1994-01-02|NONE|TRUCK|ly express waters beli +32193|48|49|3|5|4740.20|0.06|0.02|R|F|1993-12-10|1993-12-22|1993-12-22|TAKE BACK RETURN|SHIP|blithely against the blithel +32194|1791|34|1|22|37241.38|0.07|0.02|N|O|1997-11-06|1997-11-02|1997-11-24|TAKE BACK RETURN|SHIP|lets. bold, pending requests wake quic +32194|1263|38|2|11|12806.86|0.09|0.07|N|O|1997-11-17|1997-10-29|1997-12-04|DELIVER IN PERSON|RAIL|ording to the carefully final p +32194|1364|41|3|45|56941.20|0.08|0.06|N|O|1997-09-03|1997-10-31|1997-09-23|TAKE BACK RETURN|MAIL|ndencies across the final, pending ins +32194|736|33|4|6|9820.38|0.01|0.03|N|O|1997-12-24|1997-10-04|1998-01-15|DELIVER IN PERSON|FOB|bout the carefully special accounts +32194|653|54|5|36|55931.40|0.03|0.07|N|O|1997-10-18|1997-11-19|1997-10-29|TAKE BACK RETURN|AIR|ependencies wake slyly carefully unusua +32195|1511|52|1|31|43787.81|0.00|0.05|R|F|1994-12-11|1995-02-02|1994-12-16|TAKE BACK RETURN|RAIL| even pinto beans. carefully regul +32195|247|75|2|46|52773.04|0.10|0.03|R|F|1994-12-08|1995-02-11|1995-01-02|TAKE BACK RETURN|AIR|ar requests. furiously +32195|1102|75|3|32|32099.20|0.01|0.03|R|F|1994-12-20|1995-01-06|1995-01-02|TAKE BACK RETURN|RAIL|uests? ironic deposits +32196|1713|56|1|28|45211.88|0.04|0.07|N|O|1997-02-24|1997-03-17|1997-02-27|NONE|RAIL|symptotes. slow +32196|175|2|2|29|31179.93|0.10|0.03|N|O|1997-03-09|1997-03-17|1997-03-20|NONE|AIR|ial packages. final deposit +32197|228|83|1|9|10153.98|0.04|0.00|N|O|1996-06-02|1996-05-13|1996-06-29|COLLECT COD|TRUCK|xcuses are +32197|464|65|2|26|35475.96|0.06|0.02|N|O|1996-04-21|1996-04-23|1996-05-13|TAKE BACK RETURN|REG AIR|wake quickly accounts. +32197|999|100|3|8|15199.92|0.09|0.05|N|O|1996-03-21|1996-05-14|1996-04-10|TAKE BACK RETURN|TRUCK|cial accounts affix furiously +32197|1712|55|4|40|64548.40|0.02|0.03|N|O|1996-06-22|1996-04-09|1996-07-08|DELIVER IN PERSON|SHIP| wake always. blithely e +32198|601|33|1|44|66070.40|0.06|0.04|N|O|1996-01-06|1995-12-15|1996-01-31|NONE|FOB|egular, ironic instructions; quick +32198|1956|45|2|37|68744.15|0.07|0.00|N|O|1995-12-23|1996-01-31|1995-12-29|TAKE BACK RETURN|SHIP|dencies are slyly. fl +32198|1709|10|3|14|22549.80|0.00|0.08|N|O|1996-02-18|1996-01-30|1996-02-19|COLLECT COD|RAIL|the furiously ironic accoun +32198|624|56|4|30|45738.60|0.03|0.03|N|O|1996-01-17|1996-01-02|1996-02-02|NONE|REG AIR|uickly among the fluffily regula +32199|1757|84|1|17|28198.75|0.09|0.02|R|F|1994-09-18|1994-08-24|1994-10-06|COLLECT COD|RAIL|carefully silent accounts sleep +32199|1413|53|2|13|17087.33|0.04|0.07|R|F|1994-10-20|1994-09-25|1994-10-27|TAKE BACK RETURN|MAIL|against th +32199|831|65|3|34|58882.22|0.06|0.00|R|F|1994-08-01|1994-08-15|1994-08-08|COLLECT COD|MAIL|l, even deposits sleep accord +32199|678|10|4|10|15786.70|0.06|0.08|R|F|1994-08-27|1994-09-07|1994-09-24|DELIVER IN PERSON|RAIL|counts hinder carefully thr +32224|232|33|1|4|4528.92|0.04|0.07|N|O|1996-07-09|1996-07-07|1996-07-15|TAKE BACK RETURN|MAIL|nic deposits nag furiously +32224|239|94|2|29|33037.67|0.04|0.03|N|O|1996-08-05|1996-08-08|1996-08-23|NONE|SHIP|ideas nag slyl +32224|1870|100|3|35|62015.45|0.00|0.02|N|O|1996-09-05|1996-08-08|1996-09-08|DELIVER IN PERSON|TRUCK|l dependencies cajole furiously +32225|525|26|1|14|19957.28|0.03|0.01|N|O|1997-10-01|1997-11-15|1997-10-27|NONE|FOB|s kindle after t +32226|1647|48|1|14|21680.96|0.00|0.05|N|O|1997-01-24|1997-03-09|1997-02-14|TAKE BACK RETURN|MAIL|ideas maintain +32226|1351|52|2|43|53851.05|0.02|0.06|N|O|1997-02-10|1997-02-02|1997-02-16|NONE|TRUCK|by the sly +32226|193|94|3|17|18584.23|0.03|0.07|N|O|1997-01-10|1997-02-07|1997-01-12|COLLECT COD|MAIL|gle. final pinto beans haggle blithely +32226|1422|1|4|46|60877.32|0.01|0.02|N|O|1997-02-04|1997-02-14|1997-02-18|TAKE BACK RETURN|REG AIR|bout the quickly regular braids. ironi +32226|1014|20|5|23|21045.23|0.08|0.07|N|O|1997-01-22|1997-03-05|1997-02-18|DELIVER IN PERSON|RAIL|inal realms use carefully careful +32226|667|30|6|29|45462.14|0.00|0.06|N|O|1997-01-25|1997-01-31|1997-02-21|NONE|RAIL|s affix fluffily. slyly regular requests +32227|1648|72|1|37|57336.68|0.06|0.02|N|O|1996-01-11|1996-03-10|1996-01-29|NONE|SHIP|arefully. furiously special +32227|1954|87|2|13|24127.35|0.01|0.05|N|O|1996-04-14|1996-03-18|1996-04-17|NONE|MAIL|gainst the furious r +32227|35|61|3|42|39271.26|0.08|0.01|N|O|1996-05-03|1996-02-08|1996-05-17|DELIVER IN PERSON|AIR|uffily alongside of the unusual, final acco +32227|1620|62|4|39|59343.18|0.07|0.01|N|O|1996-04-15|1996-02-11|1996-04-20|DELIVER IN PERSON|RAIL|ular accounts do nag. furiou +32227|907|8|5|35|63276.50|0.08|0.02|N|O|1996-04-21|1996-03-02|1996-04-27|COLLECT COD|RAIL|ill have to ca +32227|1478|96|6|46|63455.62|0.08|0.07|N|O|1996-04-07|1996-03-09|1996-05-07|COLLECT COD|REG AIR|nding accounts. +32227|909|10|7|25|45247.50|0.08|0.00|N|O|1996-02-23|1996-02-20|1996-02-29|NONE|RAIL|requests. furiousl +32228|661|93|1|5|7808.30|0.04|0.05|A|F|1993-11-24|1994-01-07|1993-12-10|NONE|FOB|- packages use until the even foxes. quickl +32228|1711|96|2|7|11288.97|0.02|0.04|A|F|1994-02-18|1993-12-22|1994-03-19|NONE|FOB|nts. regular, final ideas abo +32228|1582|3|3|10|14835.80|0.10|0.08|R|F|1993-12-26|1993-12-16|1994-01-06|TAKE BACK RETURN|TRUCK|xcuses around th +32228|345|74|4|11|13698.74|0.04|0.08|A|F|1993-12-26|1994-01-06|1994-01-13|NONE|REG AIR|ironic ideas wake. ev +32228|816|50|5|23|39486.63|0.01|0.02|R|F|1994-02-25|1993-12-09|1994-03-03|TAKE BACK RETURN|MAIL|cial packages. caref +32228|1602|44|6|42|63151.20|0.10|0.05|A|F|1993-12-19|1993-12-13|1994-01-18|TAKE BACK RETURN|FOB|ckly about the flu +32229|352|37|1|47|58860.45|0.06|0.08|A|F|1993-09-30|1993-11-20|1993-10-02|DELIVER IN PERSON|SHIP|ans use slyly special accounts. finally exp +32229|1865|95|2|25|44171.50|0.04|0.04|A|F|1993-09-04|1993-10-08|1993-10-02|TAKE BACK RETURN|SHIP|phins doubt furiously against the spec +32229|1928|29|3|37|67707.04|0.07|0.06|R|F|1993-10-27|1993-11-13|1993-11-23|NONE|FOB|nusual depths wa +32229|703|100|4|25|40092.50|0.08|0.05|A|F|1993-11-24|1993-11-28|1993-12-11|COLLECT COD|TRUCK|lms are carefully along +32229|1841|71|5|11|19171.24|0.06|0.06|R|F|1993-09-02|1993-10-09|1993-09-11|DELIVER IN PERSON|TRUCK|ironic ins +32229|165|18|6|2|2130.32|0.09|0.07|R|F|1993-11-16|1993-11-27|1993-11-22|TAKE BACK RETURN|AIR|er slyly special deposits: regular, r +32230|108|61|1|34|34275.40|0.04|0.01|R|F|1992-10-13|1992-10-01|1992-11-10|NONE|MAIL| after the pend +32230|1738|23|2|19|31154.87|0.10|0.01|R|F|1992-11-13|1992-11-14|1992-12-13|COLLECT COD|FOB|arefully final gifts +32230|46|47|3|16|15136.64|0.05|0.04|A|F|1992-09-01|1992-10-10|1992-09-17|COLLECT COD|RAIL|gle careful +32230|1848|78|4|4|6999.36|0.10|0.06|A|F|1992-12-04|1992-10-27|1992-12-25|DELIVER IN PERSON|SHIP| slyly quic +32231|1641|83|1|34|52449.76|0.02|0.00|A|F|1993-01-21|1992-12-16|1993-02-12|COLLECT COD|REG AIR|ounts nag carefully special deposits +32231|1766|51|2|39|65042.64|0.02|0.06|R|F|1993-02-21|1993-01-11|1993-03-06|NONE|AIR|kages cajole idly regular packages; unusual +32231|188|67|3|43|46791.74|0.01|0.03|A|F|1993-01-29|1992-12-19|1993-02-13|TAKE BACK RETURN|RAIL| integrate slyly. furiously ironic depos +32231|1381|58|4|13|16670.94|0.02|0.02|A|F|1993-01-28|1993-01-19|1993-02-14|NONE|TRUCK|ular, ironic accounts. slyly final +32231|504|65|5|41|57584.50|0.06|0.06|R|F|1992-12-02|1992-12-28|1992-12-09|DELIVER IN PERSON|FOB|ecial deposits. regular pack +32231|127|80|6|39|40057.68|0.02|0.03|R|F|1992-12-24|1992-12-16|1993-01-19|NONE|REG AIR|unusual request +32231|1903|4|7|43|77610.70|0.07|0.00|R|F|1992-12-15|1993-01-19|1993-01-08|DELIVER IN PERSON|MAIL|: regularly express accounts sleep quickly +32256|584|75|1|24|35629.92|0.10|0.08|N|O|1998-08-24|1998-08-03|1998-09-06|NONE|REG AIR|al, ironic instructions n +32256|1792|35|2|14|23713.06|0.07|0.03|N|O|1998-07-07|1998-08-12|1998-08-02|COLLECT COD|FOB|oost furiously abo +32256|1237|12|3|20|22764.60|0.04|0.07|N|O|1998-06-10|1998-07-16|1998-07-08|NONE|TRUCK|old asymptotes wake. carefully bold r +32257|552|83|1|35|50839.25|0.07|0.07|N|O|1998-01-03|1997-11-07|1998-01-24|COLLECT COD|RAIL|ckly ironic accounts. +32257|238|66|2|43|48943.89|0.00|0.00|N|O|1998-01-31|1997-12-24|1998-02-12|DELIVER IN PERSON|MAIL|ong the quickly regular deposits. slyly +32258|748|49|1|37|61003.38|0.09|0.08|N|O|1997-03-16|1997-04-01|1997-04-02|DELIVER IN PERSON|AIR|into beans mold furiously. +32259|1121|58|1|18|18398.16|0.10|0.08|N|O|1996-02-07|1996-03-28|1996-02-09|COLLECT COD|RAIL|its wake carefully after the quickly silent +32259|446|34|2|39|52511.16|0.00|0.07|N|O|1996-02-04|1996-03-18|1996-03-03|NONE|SHIP| according to the +32259|1384|23|3|31|39846.78|0.04|0.03|N|O|1996-04-22|1996-03-14|1996-05-12|DELIVER IN PERSON|REG AIR|y pinto beans thrash; fi +32259|1862|6|4|13|22930.18|0.07|0.04|N|O|1996-02-10|1996-03-09|1996-02-24|DELIVER IN PERSON|RAIL|se fluffil +32259|1239|77|5|47|53590.81|0.03|0.04|N|O|1996-03-08|1996-03-31|1996-03-25|NONE|MAIL|ross the even, i +32260|1088|59|1|36|35606.88|0.05|0.04|N|O|1997-05-01|1997-03-24|1997-05-10|COLLECT COD|TRUCK| ideas. furiously even fox +32260|755|20|2|35|57951.25|0.04|0.08|N|O|1997-03-30|1997-04-07|1997-04-07|DELIVER IN PERSON|FOB|as sleep furiously. ironic deposits +32260|1800|1|3|9|15316.20|0.05|0.01|N|O|1997-03-10|1997-05-21|1997-03-16|NONE|RAIL|nal packages. ironic +32260|1930|19|4|43|78772.99|0.01|0.08|N|O|1997-03-30|1997-04-21|1997-04-02|COLLECT COD|AIR|g the bold, even f +32260|1390|67|5|11|14205.29|0.01|0.07|N|O|1997-05-03|1997-03-27|1997-05-29|TAKE BACK RETURN|MAIL| slyly bold foxes. stealthy ideas +32260|1886|87|6|24|42909.12|0.01|0.07|N|O|1997-04-16|1997-03-30|1997-04-22|DELIVER IN PERSON|SHIP|ular packages among the ideas use qui +32261|1261|99|1|47|54626.22|0.08|0.00|R|F|1993-03-17|1993-03-17|1993-04-03|COLLECT COD|RAIL|yly slyly express warthogs. +32261|795|96|2|11|18653.69|0.04|0.05|R|F|1993-03-06|1993-03-27|1993-04-05|DELIVER IN PERSON|RAIL|y regular theodolites after the +32262|1427|6|1|26|34538.92|0.05|0.04|N|O|1998-06-04|1998-06-27|1998-06-17|DELIVER IN PERSON|RAIL|press accounts. slyl +32262|1559|100|2|19|27750.45|0.02|0.00|N|O|1998-07-15|1998-08-02|1998-08-09|NONE|REG AIR|hely regula +32262|1056|57|3|35|33496.75|0.06|0.05|N|O|1998-09-07|1998-06-30|1998-09-27|COLLECT COD|AIR|r somas cajole fluffily regul +32262|1754|55|4|48|79476.00|0.01|0.04|N|O|1998-08-07|1998-07-04|1998-08-23|DELIVER IN PERSON|FOB|eposits against the even foxes sleep fl +32262|232|60|5|42|47553.66|0.01|0.03|N|O|1998-05-18|1998-06-18|1998-05-21|DELIVER IN PERSON|SHIP| requests haggle furiously. slyly +32262|1976|65|6|26|48827.22|0.02|0.06|N|O|1998-09-12|1998-07-20|1998-10-08|DELIVER IN PERSON|AIR|ajole blithely about the ca +32262|771|4|7|21|35107.17|0.10|0.01|N|O|1998-08-26|1998-07-10|1998-09-10|TAKE BACK RETURN|SHIP|special accounts. blithely pending +32263|765|30|1|37|61633.12|0.10|0.03|N|O|1996-11-22|1996-11-06|1996-11-26|NONE|MAIL| regular theodolites. slyly +32263|1443|22|2|17|22855.48|0.02|0.01|N|O|1996-12-07|1996-11-03|1996-12-09|COLLECT COD|RAIL|lites. ruthless, unusual ideas +32263|17|18|3|13|11921.13|0.00|0.05|N|O|1996-10-31|1996-11-14|1996-11-28|TAKE BACK RETURN|FOB|es. quickly final dependencies sleep +32263|1273|11|4|1|1174.27|0.00|0.04|N|O|1996-12-15|1996-10-16|1997-01-12|NONE|TRUCK|counts affix fur +32288|1178|51|1|28|30216.76|0.02|0.06|N|O|1996-06-19|1996-04-25|1996-07-18|DELIVER IN PERSON|RAIL|y special ideas. even pinto beans thrash af +32288|251|6|2|28|32235.00|0.04|0.05|N|O|1996-03-22|1996-05-21|1996-04-09|DELIVER IN PERSON|RAIL|fully about the requests. special the +32288|1977|10|3|39|73279.83|0.04|0.08|N|O|1996-06-10|1996-05-15|1996-07-05|DELIVER IN PERSON|AIR|lithely abo +32288|264|65|4|10|11642.60|0.04|0.07|N|O|1996-04-15|1996-05-19|1996-04-17|NONE|RAIL| special packages wake above the +32288|1398|75|5|47|61071.33|0.04|0.03|N|O|1996-04-10|1996-05-17|1996-05-06|NONE|MAIL|ily bold packages. silent, final a +32288|1347|86|6|29|36201.86|0.08|0.04|N|O|1996-06-11|1996-05-25|1996-06-23|DELIVER IN PERSON|FOB| accounts cajole blithely carefully pen +32289|1947|80|1|14|25885.16|0.01|0.07|N|O|1998-04-13|1998-05-05|1998-04-14|TAKE BACK RETURN|REG AIR|gainst the final, +32290|1351|52|1|42|52598.70|0.06|0.08|N|O|1997-04-27|1997-05-10|1997-05-18|COLLECT COD|TRUCK|osits. slyly bold dolphins nag. carefull +32290|520|51|2|50|71026.00|0.00|0.03|N|O|1997-06-26|1997-05-25|1997-07-07|NONE|MAIL|ole never slyly e +32291|360|61|1|8|10082.88|0.03|0.05|A|F|1995-02-20|1995-02-03|1995-02-26|DELIVER IN PERSON|AIR|ts integrate quickly. carefu +32291|1351|66|2|49|61365.15|0.09|0.01|R|F|1995-01-16|1995-01-24|1995-02-10|NONE|FOB|ronic accounts are. +32291|1419|37|3|32|42253.12|0.10|0.01|A|F|1995-01-10|1995-01-27|1995-01-27|COLLECT COD|RAIL| pending deposits. carefully regul +32291|782|47|4|13|21876.14|0.01|0.00|R|F|1994-12-07|1995-01-26|1994-12-13|COLLECT COD|FOB|heodolites. even, even deposits nag furiou +32291|163|64|5|18|19136.88|0.06|0.05|R|F|1994-12-15|1995-01-01|1994-12-31|TAKE BACK RETURN|MAIL|eas use furiously. ca +32291|1564|5|6|5|7327.80|0.00|0.03|A|F|1994-11-09|1994-12-17|1994-11-23|TAKE BACK RETURN|REG AIR| theodolite +32291|1548|49|7|14|20293.56|0.07|0.06|A|F|1995-02-05|1995-01-19|1995-02-06|TAKE BACK RETURN|SHIP|even asymptotes +32292|662|25|1|43|67194.38|0.07|0.07|R|F|1992-04-30|1992-04-16|1992-05-17|NONE|REG AIR|ld dolphins. bold platelets +32292|1309|48|2|11|13313.30|0.04|0.03|R|F|1992-06-12|1992-04-17|1992-07-05|TAKE BACK RETURN|REG AIR|lar accounts. fluf +32292|1411|29|3|40|52496.40|0.04|0.06|A|F|1992-05-21|1992-04-17|1992-06-19|COLLECT COD|SHIP|ages across the fluffily unusual dep +32292|1373|12|4|44|56072.28|0.01|0.02|A|F|1992-03-14|1992-04-05|1992-03-21|NONE|AIR| ironic packages. f +32292|1553|54|5|48|69818.40|0.02|0.06|R|F|1992-04-25|1992-03-20|1992-05-16|NONE|REG AIR|ecial excuses. fi +32293|464|65|1|31|42298.26|0.03|0.00|N|O|1996-02-09|1996-02-03|1996-03-04|NONE|RAIL|. slyly final deposits again +32293|1895|82|2|44|79063.16|0.02|0.00|N|O|1996-01-04|1996-01-13|1996-01-06|COLLECT COD|FOB|ronic, even +32293|1071|72|3|28|27217.96|0.03|0.02|N|O|1996-02-07|1996-01-25|1996-03-04|DELIVER IN PERSON|MAIL|lyly alongside o +32293|125|26|4|46|47155.52|0.01|0.08|N|O|1996-01-06|1996-01-23|1996-01-26|NONE|RAIL| ironic ideas. bravely final pack +32293|1736|21|5|12|19652.76|0.02|0.00|N|O|1996-01-25|1996-01-27|1996-02-12|NONE|SHIP|the quickly brave pinto bea +32293|899|100|6|21|37797.69|0.04|0.07|N|O|1995-12-06|1996-02-06|1995-12-16|TAKE BACK RETURN|SHIP|gular ideas are. ca +32293|354|39|7|18|22578.30|0.08|0.03|N|O|1996-02-24|1995-12-20|1996-03-06|TAKE BACK RETURN|MAIL|yly. carefully pending pack +32294|1063|69|1|22|21209.32|0.05|0.07|N|O|1996-03-07|1996-04-22|1996-03-08|COLLECT COD|REG AIR|s. even accounts against the requests ca +32294|1929|62|2|38|69574.96|0.09|0.08|N|O|1996-05-18|1996-03-23|1996-05-19|TAKE BACK RETURN|REG AIR| packages across the theodolites are c +32295|1414|93|1|43|56562.63|0.09|0.04|A|F|1994-04-11|1994-03-21|1994-04-18|DELIVER IN PERSON|REG AIR|posits are quickly. quickly regular reque +32295|1416|56|2|22|28983.02|0.05|0.08|A|F|1994-02-16|1994-03-28|1994-02-20|TAKE BACK RETURN|MAIL|ilently. carefully regular +32320|1579|60|1|27|39975.39|0.07|0.06|N|O|1997-05-13|1997-04-19|1997-06-03|TAKE BACK RETURN|SHIP|about the carefully regular re +32320|256|57|2|13|15031.25|0.09|0.06|N|O|1997-06-21|1997-05-05|1997-07-12|DELIVER IN PERSON|SHIP|ges cajole fluffily furiou +32320|747|44|3|27|44488.98|0.05|0.00|N|O|1997-04-16|1997-04-18|1997-05-06|COLLECT COD|AIR|fully even asympt +32320|1027|98|4|5|4640.10|0.03|0.03|N|O|1997-04-10|1997-05-28|1997-04-30|COLLECT COD|MAIL|cross the carefully ironic accounts +32320|793|94|5|16|27100.64|0.09|0.07|N|O|1997-04-29|1997-05-06|1997-05-26|DELIVER IN PERSON|AIR|ly special packages +32321|899|99|1|48|86394.72|0.02|0.02|N|O|1997-01-10|1997-02-06|1997-02-02|NONE|REG AIR| cajole at the sl +32321|345|74|2|47|58530.98|0.00|0.07|N|O|1997-03-21|1997-01-17|1997-04-11|DELIVER IN PERSON|SHIP|y quick th +32321|1887|31|3|47|84077.36|0.05|0.05|N|O|1997-01-09|1997-03-09|1997-02-03|DELIVER IN PERSON|TRUCK| pending pattern +32321|1722|7|4|2|3247.44|0.10|0.07|N|O|1997-02-07|1997-01-22|1997-02-13|NONE|SHIP|theodolites. even, silent deposits s +32321|295|23|5|15|17929.35|0.03|0.03|N|O|1997-03-22|1997-03-11|1997-04-21|COLLECT COD|REG AIR|luffy requests! furiously stealthy ideas +32321|1062|98|6|37|35633.22|0.06|0.07|N|O|1997-03-08|1997-01-22|1997-03-30|DELIVER IN PERSON|TRUCK|theodolites. fluffily pe +32321|1627|69|7|50|76431.00|0.03|0.08|N|O|1997-01-11|1997-03-14|1997-02-10|NONE|RAIL|efully accounts. slyly regular f +32322|1379|18|1|27|34569.99|0.00|0.00|N|O|1997-10-12|1997-09-27|1997-10-24|TAKE BACK RETURN|RAIL|carefully regular ideas cajole slyly across +32322|489|90|2|48|66695.04|0.08|0.08|N|O|1997-10-17|1997-09-09|1997-11-14|NONE|REG AIR|slyly express f +32323|501|92|1|41|57461.50|0.00|0.03|A|F|1993-08-27|1993-10-14|1993-09-20|NONE|RAIL|endencies boost carefully ab +32323|314|15|2|33|40072.23|0.08|0.03|A|F|1993-08-13|1993-10-09|1993-08-31|COLLECT COD|RAIL|ts against the careful asymptotes sle +32323|636|30|3|25|38415.75|0.07|0.06|R|F|1993-09-22|1993-09-09|1993-10-06|DELIVER IN PERSON|MAIL|lar platelets. blithely sile +32323|346|3|4|22|27419.48|0.02|0.03|A|F|1993-08-28|1993-09-10|1993-09-18|COLLECT COD|SHIP|y against the slyly pendi +32323|828|29|5|19|32847.58|0.04|0.07|A|F|1993-08-31|1993-08-26|1993-09-16|COLLECT COD|TRUCK| packages! slyly iro +32323|288|16|6|8|9506.24|0.07|0.04|R|F|1993-08-24|1993-10-19|1993-09-05|NONE|FOB|regular packages sleep slyly at the +32323|311|40|7|30|36339.30|0.07|0.04|A|F|1993-09-15|1993-09-21|1993-10-10|COLLECT COD|TRUCK|he regular, unusual packages. even depe +32324|1601|43|1|31|46580.60|0.09|0.08|N|O|1996-11-22|1997-01-18|1996-12-09|DELIVER IN PERSON|TRUCK|gainst the regular, sp +32324|914|49|2|8|14519.28|0.00|0.07|N|O|1997-02-15|1997-02-17|1997-02-26|COLLECT COD|TRUCK|eep carefully alongside of the +32324|1563|84|3|39|57117.84|0.07|0.02|N|O|1997-02-05|1997-01-23|1997-03-02|NONE|FOB|s are slyly. c +32324|981|84|4|32|60223.36|0.05|0.02|N|O|1996-12-13|1997-02-07|1996-12-30|NONE|MAIL| theodolites according to the final depos +32324|1358|97|5|34|42817.90|0.00|0.03|N|O|1996-12-12|1997-02-02|1997-01-10|DELIVER IN PERSON|REG AIR|ing accoun +32324|624|18|6|39|59460.18|0.06|0.04|N|O|1996-11-28|1996-12-20|1996-12-11|COLLECT COD|MAIL|ts alongside of the furiously ironic pack +32324|1026|32|7|28|25956.56|0.00|0.06|N|O|1997-01-01|1997-01-31|1997-01-04|TAKE BACK RETURN|AIR|. carefully regular packages haggle +32325|607|70|1|25|37690.00|0.06|0.01|A|F|1993-01-07|1993-01-25|1993-01-10|COLLECT COD|MAIL|s along the furiously iro +32325|1668|51|2|12|18835.92|0.06|0.07|A|F|1992-12-08|1993-01-01|1993-01-04|NONE|REG AIR|riously pending do +32325|816|16|3|35|60088.35|0.04|0.08|R|F|1992-11-13|1992-12-30|1992-11-28|DELIVER IN PERSON|FOB|furiously special dinos +32325|742|75|4|29|47639.46|0.00|0.07|R|F|1992-11-26|1993-01-09|1992-12-04|TAKE BACK RETURN|RAIL|uld have to detect. carefully e +32325|1863|50|5|28|49416.08|0.08|0.02|A|F|1993-01-11|1993-01-24|1993-02-02|NONE|AIR|ular deposits; carefully exp +32326|44|45|1|13|12272.52|0.00|0.02|A|F|1993-11-21|1994-01-18|1993-12-07|TAKE BACK RETURN|RAIL|. ruthless platelets ha +32327|90|91|1|4|3960.36|0.06|0.07|R|F|1992-10-25|1992-10-23|1992-10-26|DELIVER IN PERSON|FOB|ckages. carefully regular instructions boos +32327|380|9|2|10|12803.80|0.03|0.04|A|F|1992-11-12|1992-10-31|1992-11-16|DELIVER IN PERSON|SHIP|its maintain around the ca +32327|1846|33|3|30|52435.20|0.03|0.01|R|F|1992-11-02|1992-09-20|1992-11-10|COLLECT COD|REG AIR| sleep above the even instruct +32327|221|3|4|3|3363.66|0.04|0.00|A|F|1992-12-07|1992-09-14|1992-12-14|TAKE BACK RETURN|MAIL|pades. deposits wa +32327|1277|15|5|28|32991.56|0.01|0.05|R|F|1992-08-20|1992-09-20|1992-09-02|COLLECT COD|AIR| deposits cajole. pending courts snooz +32327|1145|46|6|49|51260.86|0.03|0.02|R|F|1992-10-28|1992-09-18|1992-11-18|TAKE BACK RETURN|MAIL| deposits. somet +32327|1971|72|7|37|69299.89|0.05|0.02|A|F|1992-08-10|1992-10-12|1992-09-03|COLLECT COD|REG AIR|inal, idle requests sleep slyly acros +32352|399|100|1|16|20790.24|0.08|0.04|N|O|1997-11-28|1997-11-11|1997-12-18|NONE|FOB|ld foxes haggle carefu +32352|1608|50|2|24|36230.40|0.02|0.07|N|O|1997-11-06|1997-10-26|1997-11-11|TAKE BACK RETURN|SHIP| according to t +32352|1536|17|3|6|8625.18|0.10|0.07|N|O|1997-10-16|1997-11-09|1997-11-07|COLLECT COD|SHIP|press excuses cajole silently +32352|1086|57|4|48|47379.84|0.02|0.00|N|O|1997-11-21|1997-10-09|1997-12-15|COLLECT COD|FOB|pendencies. +32353|1392|7|1|34|43975.26|0.00|0.00|N|O|1998-06-04|1998-08-20|1998-06-14|COLLECT COD|TRUCK|ular dolphins against t +32353|1208|20|2|23|25511.60|0.04|0.06|N|O|1998-09-24|1998-08-20|1998-10-06|TAKE BACK RETURN|MAIL|uickly furiously final patt +32353|571|2|3|34|50033.38|0.07|0.08|N|O|1998-09-08|1998-07-02|1998-09-28|COLLECT COD|REG AIR|g the care +32353|378|35|4|19|24289.03|0.08|0.00|N|O|1998-08-12|1998-07-11|1998-08-25|COLLECT COD|AIR| slyly special requests +32353|180|33|5|26|28084.68|0.10|0.00|N|O|1998-07-19|1998-08-22|1998-08-15|COLLECT COD|REG AIR|low account +32353|1544|65|6|7|10118.78|0.07|0.07|N|O|1998-07-29|1998-08-05|1998-08-03|TAKE BACK RETURN|FOB|ld, slow asympt +32353|184|37|7|21|22767.78|0.05|0.06|N|O|1998-06-13|1998-08-07|1998-06-16|NONE|REG AIR|ccounts wake pendi +32354|1102|3|1|47|47145.70|0.05|0.06|N|O|1996-05-25|1996-04-23|1996-06-10|NONE|FOB|integrate carefully after the special +32354|42|18|2|28|26377.12|0.04|0.07|N|O|1996-04-03|1996-05-12|1996-04-19|COLLECT COD|MAIL| ideas alongside of the slyly pendin +32354|1577|98|3|4|5914.28|0.09|0.06|N|O|1996-06-27|1996-05-16|1996-07-11|TAKE BACK RETURN|SHIP| accounts haggle alongside of the +32354|1233|34|4|13|14744.99|0.08|0.04|N|O|1996-04-19|1996-04-24|1996-05-09|NONE|RAIL|telets. finally ruthless ideas dazzle car +32354|1225|26|5|8|9009.76|0.03|0.08|N|O|1996-07-07|1996-04-14|1996-07-16|COLLECT COD|AIR|ly unusual escapades a +32355|167|68|1|33|35216.28|0.01|0.05|A|F|1994-07-16|1994-07-12|1994-08-12|NONE|AIR|affix carefully regular accounts. r +32355|714|79|2|21|33908.91|0.08|0.07|A|F|1994-08-05|1994-06-25|1994-08-17|TAKE BACK RETURN|FOB| requests against the unusual, +32355|1462|41|3|3|4090.38|0.02|0.08|A|F|1994-08-30|1994-06-27|1994-09-01|TAKE BACK RETURN|FOB|cial requests! boldly pen +32355|1614|56|4|30|45468.30|0.00|0.01|A|F|1994-08-06|1994-07-14|1994-09-05|COLLECT COD|MAIL|pending accounts cajole blithely al +32355|412|13|5|37|48559.17|0.10|0.04|R|F|1994-09-04|1994-07-16|1994-09-15|TAKE BACK RETURN|AIR|e according to the furiously regul +32355|1961|94|6|35|65203.60|0.02|0.05|A|F|1994-09-02|1994-08-07|1994-09-05|DELIVER IN PERSON|FOB|s sleep fluffily. carefully special dolph +32356|51|52|1|18|17118.90|0.08|0.07|A|F|1992-12-13|1992-11-11|1992-12-27|COLLECT COD|RAIL|s use never after the pending foxes. s +32356|1021|92|2|17|15674.34|0.10|0.06|A|F|1993-01-10|1992-11-12|1993-02-07|TAKE BACK RETURN|TRUCK|e furiously final accounts. +32356|1928|29|3|46|84176.32|0.02|0.07|R|F|1992-12-15|1992-11-24|1992-12-19|NONE|SHIP|sly special ideas +32356|1555|96|4|44|64088.20|0.04|0.05|A|F|1993-01-21|1992-11-23|1993-02-10|COLLECT COD|RAIL|eans. quickly ironic th +32356|867|1|5|6|10607.16|0.07|0.04|R|F|1993-02-09|1993-01-05|1993-02-26|NONE|AIR|old realms cajo +32356|1440|80|6|3|4024.32|0.03|0.04|A|F|1992-12-12|1992-11-19|1993-01-01|TAKE BACK RETURN|TRUCK|ges wake quickly blithely +32356|871|38|7|24|42524.88|0.06|0.06|R|F|1993-01-08|1992-12-15|1993-01-26|NONE|AIR|requests are sly +32357|1501|22|1|6|8415.00|0.08|0.03|N|O|1996-03-24|1996-04-04|1996-04-22|DELIVER IN PERSON|REG AIR|s alongside of the requests doze f +32357|1550|31|2|11|15967.05|0.04|0.04|N|O|1996-03-19|1996-03-18|1996-04-14|COLLECT COD|SHIP|ct quickly bold ide +32357|677|40|3|4|6310.68|0.06|0.01|N|O|1996-02-23|1996-03-17|1996-03-13|NONE|RAIL|ously even accounts. enticin +32357|971|74|4|46|86110.62|0.06|0.08|N|O|1996-02-09|1996-04-03|1996-03-02|TAKE BACK RETURN|FOB|egular accounts ca +32357|1953|54|5|2|3709.90|0.09|0.02|N|O|1996-04-16|1996-04-11|1996-04-23|DELIVER IN PERSON|MAIL|uctions cajole qui +32358|192|71|1|8|8737.52|0.04|0.00|A|F|1994-09-16|1994-08-04|1994-09-19|NONE|RAIL|de of the regular, express hoc +32358|404|92|2|46|60002.40|0.04|0.01|R|F|1994-08-27|1994-08-14|1994-09-05|COLLECT COD|RAIL|e against the fluf +32358|737|34|3|33|54045.09|0.06|0.00|A|F|1994-06-26|1994-08-13|1994-07-15|TAKE BACK RETURN|RAIL|structions wake blithely around t +32358|1357|72|4|45|56625.75|0.05|0.08|A|F|1994-07-11|1994-08-11|1994-07-31|NONE|MAIL|arefully bold decoys poach furiously a +32358|1334|35|5|31|38295.23|0.08|0.00|A|F|1994-09-10|1994-07-17|1994-09-25|COLLECT COD|RAIL|t the carefully even +32358|33|59|6|38|35455.14|0.07|0.07|A|F|1994-08-01|1994-07-30|1994-08-20|DELIVER IN PERSON|REG AIR|unts are care +32359|913|14|1|37|67114.67|0.01|0.08|N|O|1997-03-02|1997-01-28|1997-03-28|COLLECT COD|AIR|elets. pending, regular grouches p +32359|652|46|2|9|13973.85|0.09|0.04|N|O|1997-02-25|1997-02-01|1997-03-16|DELIVER IN PERSON|FOB|lly ironic depo +32359|1913|2|3|44|79856.04|0.00|0.05|N|O|1997-03-28|1997-03-04|1997-04-09|TAKE BACK RETURN|REG AIR|c packages sleep furiously +32384|1929|30|1|5|9154.60|0.00|0.03|N|O|1998-06-07|1998-06-24|1998-07-01|COLLECT COD|RAIL|nal deposits. slyly slow excuses boost +32384|1822|66|2|36|62057.52|0.03|0.08|N|O|1998-05-25|1998-06-30|1998-06-01|COLLECT COD|FOB|. slyly ironic dolphins across t +32384|604|5|3|44|66202.40|0.07|0.00|N|O|1998-08-05|1998-06-01|1998-08-22|TAKE BACK RETURN|SHIP|t deposits use qui +32384|1517|18|4|7|9929.57|0.10|0.04|N|O|1998-06-01|1998-07-06|1998-06-14|NONE|FOB|eposits. regular ideas haggle blithe +32384|404|63|5|8|10435.20|0.04|0.04|N|O|1998-05-06|1998-07-19|1998-05-21|NONE|TRUCK| accounts nag across the blithely unusual +32384|633|65|6|15|23004.45|0.05|0.06|N|O|1998-05-07|1998-07-04|1998-05-10|COLLECT COD|REG AIR|ns dazzle blithely. special inst +32385|1177|50|1|7|7547.19|0.08|0.06|N|O|1996-10-29|1996-09-16|1996-11-05|COLLECT COD|SHIP|nts use carefully carefully ironic req +32385|397|54|2|43|55787.77|0.03|0.01|N|O|1996-11-16|1996-10-13|1996-12-03|DELIVER IN PERSON|TRUCK|asymptotes +32385|1347|24|3|7|8738.38|0.03|0.08|N|O|1996-12-05|1996-10-27|1996-12-23|COLLECT COD|TRUCK| regular instructions will wake +32385|865|66|4|33|58273.38|0.04|0.00|N|O|1996-10-29|1996-11-02|1996-11-13|NONE|AIR|nticingly ironic deposits use furiously +32385|686|87|5|49|77747.32|0.10|0.04|N|O|1996-09-06|1996-10-24|1996-09-18|DELIVER IN PERSON|AIR|lites are around th +32385|1580|1|6|41|60744.78|0.01|0.08|N|O|1996-08-31|1996-10-11|1996-09-02|DELIVER IN PERSON|AIR|s are slyly unusual packages. dep +32385|903|38|7|8|14431.20|0.00|0.03|N|O|1996-09-15|1996-10-24|1996-10-14|TAKE BACK RETURN|TRUCK|into beans. slyly final pint +32386|1252|64|1|7|8072.75|0.02|0.07|A|F|1992-08-05|1992-06-26|1992-08-06|NONE|REG AIR|carefully ironic, regular request +32386|1781|82|2|33|55531.74|0.09|0.07|A|F|1992-08-13|1992-07-05|1992-08-17|TAKE BACK RETURN|MAIL|slyly ironic do +32387|133|60|1|11|11364.43|0.09|0.04|N|O|1998-04-12|1998-03-05|1998-05-08|DELIVER IN PERSON|RAIL|ar ideas. furi +32388|1276|88|1|4|4709.08|0.06|0.03|N|O|1996-06-26|1996-05-29|1996-07-10|COLLECT COD|RAIL|final asymptotes +32388|1509|50|2|9|12694.50|0.06|0.00|N|O|1996-05-20|1996-05-04|1996-05-26|NONE|REG AIR|egular deposits cajole furiousl +32388|1360|99|3|30|37840.80|0.02|0.07|N|O|1996-05-17|1996-06-02|1996-05-18|DELIVER IN PERSON|SHIP| ironic sentiments cajole +32388|1728|13|4|17|27705.24|0.07|0.01|N|O|1996-07-10|1996-05-22|1996-08-09|DELIVER IN PERSON|AIR|ar theodolites print a +32388|1021|27|5|19|17518.38|0.08|0.08|N|O|1996-06-23|1996-05-21|1996-07-22|NONE|SHIP| according to the ironic accounts. +32389|1949|38|1|47|86994.18|0.08|0.06|A|F|1993-12-03|1994-01-12|1993-12-04|NONE|TRUCK|s wake carefully a +32389|1641|65|2|34|52449.76|0.06|0.03|R|F|1993-12-13|1993-12-26|1994-01-09|COLLECT COD|REG AIR|fily according to the +32389|113|14|3|44|44576.84|0.08|0.04|A|F|1993-12-20|1994-01-04|1993-12-22|NONE|MAIL|yly regular deposits cajole carefully quick +32389|104|57|4|19|19077.90|0.06|0.01|A|F|1993-11-23|1994-01-22|1993-12-08|TAKE BACK RETURN|AIR|re furiously furiously ironic ideas +32389|214|96|5|31|34540.51|0.10|0.08|A|F|1993-12-09|1994-01-13|1994-01-01|COLLECT COD|REG AIR|ording to the regular instruction +32389|1300|75|6|29|34837.70|0.05|0.02|R|F|1994-01-19|1994-01-05|1994-02-17|NONE|FOB|eas. fluffily sp +32389|628|29|7|33|50444.46|0.02|0.08|A|F|1993-11-24|1994-01-11|1993-12-02|DELIVER IN PERSON|SHIP| ideas. carefully even d +32390|1805|92|1|9|15361.20|0.10|0.01|N|O|1996-09-17|1996-11-19|1996-09-18|TAKE BACK RETURN|MAIL| express instruction +32391|1026|27|1|36|33372.72|0.04|0.00|R|F|1993-06-04|1993-08-24|1993-06-26|DELIVER IN PERSON|FOB|alongside of the quickly even pa +32391|1647|89|2|2|3097.28|0.05|0.07|A|F|1993-09-18|1993-07-10|1993-10-06|NONE|AIR|s. carefully ironi +32391|1361|62|3|47|59330.92|0.07|0.00|A|F|1993-07-05|1993-07-02|1993-07-28|DELIVER IN PERSON|RAIL|furiously even platelets ca +32391|589|80|4|26|38729.08|0.09|0.08|R|F|1993-06-11|1993-08-08|1993-06-15|COLLECT COD|RAIL|the slyly bold ac +32416|1258|96|1|23|26662.75|0.04|0.06|N|O|1998-03-03|1998-01-24|1998-03-21|COLLECT COD|FOB|ccounts. quickly eve +32416|1822|52|2|23|39647.86|0.06|0.07|N|O|1998-03-24|1998-03-09|1998-04-10|COLLECT COD|SHIP| slyly regular +32416|1292|4|3|15|17899.35|0.02|0.08|N|O|1998-03-19|1998-03-03|1998-04-17|TAKE BACK RETURN|FOB|express accounts. bl +32416|836|36|4|28|48631.24|0.03|0.03|N|O|1998-03-24|1998-03-20|1998-04-03|DELIVER IN PERSON|TRUCK|us requests wake around the exc +32416|997|32|5|50|94899.50|0.04|0.04|N|O|1998-02-18|1998-02-24|1998-03-17|NONE|MAIL|tions. carefully final deposits boo +32417|1369|84|1|42|53355.12|0.05|0.02|A|F|1993-04-20|1993-06-17|1993-05-08|COLLECT COD|SHIP|ggle after the qu +32418|108|87|1|27|27218.70|0.05|0.06|A|F|1994-01-24|1994-02-26|1994-02-09|NONE|SHIP|s packages sleep fl +32418|1772|15|2|20|33475.40|0.04|0.08|R|F|1994-02-12|1994-02-28|1994-03-09|DELIVER IN PERSON|REG AIR|ndencies. slyly special req +32418|1183|20|3|17|18431.06|0.04|0.06|R|F|1994-01-12|1994-03-29|1994-02-02|COLLECT COD|AIR|s nag. theodolites haggle after the bo +32418|686|18|4|5|7933.40|0.10|0.06|R|F|1994-04-03|1994-02-11|1994-05-01|DELIVER IN PERSON|SHIP|fily along the fluffily busy pinto be +32419|1909|54|1|14|25352.60|0.08|0.03|N|O|1997-05-18|1997-06-30|1997-06-02|DELIVER IN PERSON|AIR|eodolites. packages +32419|1397|12|2|30|38951.70|0.04|0.04|N|O|1997-05-20|1997-06-24|1997-05-22|COLLECT COD|TRUCK|kages sleep bli +32419|1693|35|3|25|39867.25|0.03|0.00|N|O|1997-08-04|1997-07-13|1997-08-11|TAKE BACK RETURN|SHIP|ions use blithe +32419|1818|62|4|2|3439.62|0.00|0.04|N|O|1997-05-13|1997-06-24|1997-06-11|DELIVER IN PERSON|REG AIR|s. blithely unusual gifts mold carefully +32419|1670|12|5|33|51865.11|0.07|0.07|N|O|1997-07-23|1997-06-04|1997-07-30|DELIVER IN PERSON|REG AIR|counts nag slyly alongside of t +32420|696|90|1|19|30337.11|0.09|0.03|R|F|1994-09-12|1994-09-06|1994-10-06|COLLECT COD|SHIP|sits poach ironically. slyly final excuses +32420|1923|24|2|11|20074.12|0.06|0.08|A|F|1994-09-24|1994-10-28|1994-10-14|TAKE BACK RETURN|FOB|tegrate. even, ironic id +32420|1195|32|3|49|53713.31|0.04|0.08|R|F|1994-08-28|1994-09-16|1994-09-07|TAKE BACK RETURN|SHIP|deposits unwind slyly. regular dependencies +32420|1794|79|4|45|76310.55|0.01|0.01|A|F|1994-11-13|1994-09-25|1994-12-05|NONE|REG AIR| fluffily according to the furiously p +32420|532|93|5|48|68761.44|0.04|0.06|R|F|1994-09-04|1994-09-23|1994-10-03|TAKE BACK RETURN|SHIP|tions sleep quickly ironic packages. pe +32420|758|91|6|40|66350.00|0.03|0.02|R|F|1994-08-14|1994-10-23|1994-08-30|NONE|MAIL|ependencies. blithely final instruc +32421|1276|88|1|25|29431.75|0.04|0.02|N|O|1996-03-23|1996-02-05|1996-04-14|COLLECT COD|RAIL|nst the slyly +32421|205|87|2|9|9946.80|0.03|0.01|N|O|1996-04-01|1996-03-01|1996-04-05|NONE|RAIL|olphins wake blithely. ev +32421|682|14|3|41|64889.88|0.03|0.08|N|O|1996-03-01|1996-03-01|1996-03-20|NONE|AIR|bold asymptotes. ironic instruc +32422|64|90|1|24|23137.44|0.00|0.01|N|O|1996-01-21|1996-03-15|1996-01-22|COLLECT COD|TRUCK| quickly bold pinto beans daz +32422|900|1|2|40|72036.00|0.01|0.03|N|O|1996-04-01|1996-01-19|1996-04-10|TAKE BACK RETURN|TRUCK|usual asymptotes a +32422|1135|36|3|16|16578.08|0.04|0.02|N|O|1996-02-01|1996-01-17|1996-02-06|DELIVER IN PERSON|FOB|slyly even gro +32422|1498|77|4|39|54580.11|0.05|0.03|N|O|1996-03-13|1996-03-12|1996-04-09|DELIVER IN PERSON|REG AIR|nic theodolites. regular platelets throug +32423|1189|98|1|17|18533.06|0.08|0.05|N|O|1997-12-26|1998-02-17|1997-12-28|DELIVER IN PERSON|REG AIR| among the furiously unusual pat +32423|1639|40|2|16|24650.08|0.04|0.07|N|O|1998-03-28|1998-03-20|1998-04-22|COLLECT COD|FOB|yly special requests. packag +32423|300|1|3|5|6001.50|0.09|0.04|N|O|1998-03-28|1998-03-06|1998-04-15|NONE|RAIL|furiously express ide +32423|197|24|4|46|50470.74|0.02|0.05|N|O|1998-01-03|1998-03-08|1998-02-02|TAKE BACK RETURN|REG AIR|ggle slyly p +32448|1322|99|1|42|51379.44|0.07|0.08|N|O|1998-07-20|1998-08-08|1998-07-30|TAKE BACK RETURN|REG AIR|ggedly fin +32448|547|8|2|17|24608.18|0.10|0.03|N|O|1998-07-17|1998-08-31|1998-08-02|NONE|RAIL|platelets maintain. bold, quick requests a +32449|1368|69|1|8|10154.88|0.02|0.02|A|F|1993-02-13|1993-02-07|1993-03-15|COLLECT COD|FOB| beans boost quickly ironic, final packag +32449|1693|94|2|34|54219.46|0.10|0.00|R|F|1993-01-03|1993-03-04|1993-01-29|COLLECT COD|MAIL|e furiously unusual sentiment +32449|1683|7|3|17|26939.56|0.01|0.06|A|F|1993-02-18|1993-01-14|1993-03-11|COLLECT COD|REG AIR|s regular hockey players. reg +32449|897|97|4|45|80905.05|0.10|0.07|A|F|1993-04-02|1993-03-06|1993-04-05|DELIVER IN PERSON|REG AIR|ly silent dependencies af +32449|1094|100|5|2|1990.18|0.01|0.02|A|F|1993-03-31|1993-02-08|1993-04-27|TAKE BACK RETURN|REG AIR|wly. special, re +32449|9|10|6|3|2727.00|0.07|0.06|R|F|1993-02-08|1993-01-24|1993-02-28|COLLECT COD|MAIL|sits. quickly regular dep +32450|401|2|1|45|58563.00|0.05|0.00|N|O|1996-03-03|1996-02-08|1996-03-10|DELIVER IN PERSON|FOB|y. theodolites +32450|17|43|2|45|41265.45|0.00|0.05|N|O|1996-04-05|1996-02-16|1996-04-21|TAKE BACK RETURN|FOB|e express requests. carefully +32450|680|43|3|26|41097.68|0.02|0.03|N|O|1996-02-25|1996-02-13|1996-03-10|TAKE BACK RETURN|REG AIR| the furiously regular excuses. +32451|504|5|1|36|50562.00|0.05|0.05|A|F|1994-07-06|1994-06-22|1994-07-30|DELIVER IN PERSON|RAIL|ding ideas. foxes doze. bol +32451|684|16|2|13|20600.84|0.04|0.01|R|F|1994-03-29|1994-05-27|1994-04-14|DELIVER IN PERSON|AIR|he furiously bold requests. final +32451|18|94|3|39|35802.39|0.08|0.06|A|F|1994-05-21|1994-05-18|1994-06-10|TAKE BACK RETURN|SHIP|r epitaphs +32451|120|21|4|35|35704.20|0.00|0.00|R|F|1994-05-21|1994-05-28|1994-05-24|TAKE BACK RETURN|REG AIR|ic packages. furiously express attai +32451|1550|91|5|1|1451.55|0.01|0.05|R|F|1994-06-09|1994-05-22|1994-06-24|TAKE BACK RETURN|AIR|t furiously above the closely +32451|1876|20|6|5|8889.35|0.02|0.04|A|F|1994-04-30|1994-05-25|1994-05-03|NONE|FOB|t. ironic asymptotes nag unusual deposits +32451|1720|63|7|14|22704.08|0.03|0.01|A|F|1994-06-30|1994-06-08|1994-07-30|NONE|AIR|hy deposits are +32452|1396|11|1|44|57085.16|0.06|0.03|N|O|1995-10-04|1995-10-10|1995-10-22|COLLECT COD|AIR|o beans are furiou +32452|322|7|2|12|14667.84|0.04|0.03|N|O|1995-08-09|1995-09-14|1995-08-10|DELIVER IN PERSON|TRUCK| fluffily special accounts nag accordi +32452|1922|11|3|8|14591.36|0.09|0.05|N|O|1995-08-12|1995-10-16|1995-09-04|COLLECT COD|AIR|cajole carefully even, regular instructions +32452|1353|30|4|50|62717.50|0.06|0.02|N|O|1995-11-17|1995-08-27|1995-12-16|DELIVER IN PERSON|REG AIR|eposits boost. blithely even i +32453|1682|24|1|40|63347.20|0.01|0.00|N|O|1997-10-16|1997-08-11|1997-11-11|COLLECT COD|SHIP|ithely iron +32453|609|72|2|34|51326.40|0.00|0.08|N|O|1997-09-14|1997-08-05|1997-09-29|NONE|AIR|ecial ideas use carefully +32453|1594|15|3|14|20938.26|0.04|0.07|N|O|1997-10-02|1997-09-09|1997-10-15|DELIVER IN PERSON|AIR|t carefully furious +32453|1594|35|4|30|44867.70|0.08|0.04|N|O|1997-08-18|1997-08-12|1997-09-01|TAKE BACK RETURN|REG AIR| pinto beans. unusual deposits abov +32453|1301|40|5|3|3606.90|0.02|0.01|N|O|1997-09-03|1997-09-13|1997-09-20|NONE|AIR|nal, silent requests. blithely permane +32453|1455|56|6|6|8138.70|0.08|0.08|N|O|1997-07-29|1997-09-03|1997-08-21|TAKE BACK RETURN|FOB|, even theodolites are +32453|1048|84|7|2|1898.08|0.05|0.07|N|O|1997-08-26|1997-08-05|1997-08-31|COLLECT COD|MAIL|ing warhorses hinder +32454|624|25|1|29|44213.98|0.06|0.07|A|F|1995-05-01|1995-05-01|1995-05-22|TAKE BACK RETURN|SHIP|s serve blithely. fluff +32454|449|79|2|12|16193.28|0.10|0.03|N|F|1995-05-21|1995-06-04|1995-06-18|TAKE BACK RETURN|RAIL|ely ironic packa +32454|1715|58|3|37|59818.27|0.07|0.04|A|F|1995-04-23|1995-05-31|1995-05-05|NONE|REG AIR|ress, regul +32455|892|92|1|34|60958.26|0.01|0.03|R|F|1993-09-25|1993-11-17|1993-10-16|TAKE BACK RETURN|RAIL|cajole car +32455|1400|1|2|12|15616.80|0.01|0.07|R|F|1993-10-22|1993-10-24|1993-11-15|DELIVER IN PERSON|REG AIR|sly ironic requests are. carefully expres +32455|1527|8|3|27|38570.04|0.06|0.01|R|F|1994-01-07|1993-12-19|1994-01-26|COLLECT COD|REG AIR|ly regular requests across the final, regu +32455|1416|56|4|5|6587.05|0.05|0.06|R|F|1993-12-02|1993-11-01|1993-12-20|NONE|SHIP|usy accounts. quickly final reques +32455|778|75|5|7|11751.39|0.00|0.05|R|F|1993-11-06|1993-11-17|1993-11-12|NONE|TRUCK|ole blithely. ironic foxes are about the ca +32480|501|32|1|49|68673.50|0.02|0.04|N|O|1997-06-04|1997-05-02|1997-06-14|NONE|REG AIR|nusual deposits. fluffily final pains +32480|685|79|2|33|52327.44|0.05|0.05|N|O|1997-06-27|1997-05-30|1997-07-07|TAKE BACK RETURN|MAIL|ld packages acr +32481|1916|5|1|20|36358.20|0.04|0.03|N|O|1995-12-31|1995-12-16|1996-01-17|DELIVER IN PERSON|REG AIR| sublate alongside of the quickly ironic +32481|20|96|2|6|5520.12|0.07|0.04|N|O|1996-01-22|1995-11-16|1996-02-15|COLLECT COD|MAIL|nic accounts haggle against +32482|150|3|1|44|46206.60|0.09|0.03|N|O|1997-02-28|1997-01-31|1997-03-13|DELIVER IN PERSON|RAIL|as. carefully pending ideas +32482|1932|77|2|46|84360.78|0.06|0.06|N|O|1996-12-28|1997-02-05|1997-01-14|DELIVER IN PERSON|RAIL| bold asym +32482|596|97|3|21|31428.39|0.01|0.00|N|O|1997-02-22|1997-02-03|1997-03-01|DELIVER IN PERSON|AIR|uests. blithely ironic plate +32482|404|92|4|34|44349.60|0.02|0.06|N|O|1997-01-09|1997-02-07|1997-01-16|NONE|AIR|regular, ironic platele +32482|495|25|5|26|36282.74|0.06|0.06|N|O|1997-02-21|1997-01-14|1997-03-12|NONE|REG AIR|xes wake slyly. b +32482|894|95|6|16|28718.24|0.08|0.01|N|O|1996-12-23|1997-01-21|1997-01-17|COLLECT COD|MAIL|fully final pinto beans sleep slyly against +32483|685|86|1|6|9514.08|0.08|0.03|R|F|1994-11-06|1994-10-18|1994-11-13|TAKE BACK RETURN|FOB|ests are quickly final foxes. re +32483|1731|58|2|18|29389.14|0.01|0.08|A|F|1994-11-10|1994-09-19|1994-12-06|TAKE BACK RETURN|AIR|gular dependencies alongsi +32483|1843|30|3|14|24427.76|0.00|0.06|A|F|1994-11-12|1994-09-22|1994-12-02|COLLECT COD|FOB|ly. slyly ironic deposits believe permane +32483|662|56|4|13|20314.58|0.08|0.08|R|F|1994-09-07|1994-09-13|1994-10-02|TAKE BACK RETURN|TRUCK|y regular accounts. quickly unusual acc +32483|1885|86|5|25|44672.00|0.01|0.07|R|F|1994-10-16|1994-10-08|1994-10-26|DELIVER IN PERSON|SHIP|y deposits. sly, fina +32483|1277|89|6|29|34169.83|0.07|0.02|A|F|1994-08-09|1994-10-04|1994-08-17|TAKE BACK RETURN|TRUCK|ag carefully platelets. +32484|1616|40|1|21|31869.81|0.02|0.04|N|F|1995-05-29|1995-03-29|1995-06-22|TAKE BACK RETURN|REG AIR|deposits boo +32484|606|7|2|34|51224.40|0.00|0.05|R|F|1995-03-09|1995-04-17|1995-03-26|NONE|SHIP|ely. unusual, special requests +32484|440|41|3|19|25468.36|0.05|0.07|R|F|1995-04-04|1995-03-19|1995-04-27|TAKE BACK RETURN|MAIL|ording to the q +32485|1654|55|1|4|6222.60|0.00|0.00|R|F|1993-08-18|1993-09-10|1993-09-10|COLLECT COD|REG AIR|ng the final, pending instructions: final +32485|750|83|2|17|28062.75|0.05|0.02|R|F|1993-08-05|1993-08-18|1993-08-27|NONE|RAIL| wake according to the +32485|1094|30|3|37|36818.33|0.01|0.06|R|F|1993-10-20|1993-09-09|1993-10-31|NONE|FOB|ular requests wake carefully above the bol +32485|1225|37|4|16|18019.52|0.05|0.02|A|F|1993-08-19|1993-08-18|1993-09-15|DELIVER IN PERSON|REG AIR|ests after the quiet excuses cajole arou +32485|171|72|5|9|9640.53|0.06|0.03|R|F|1993-09-08|1993-09-09|1993-09-24|COLLECT COD|AIR|ng to the fur +32485|1651|34|6|17|26395.05|0.08|0.06|A|F|1993-07-10|1993-08-03|1993-07-28|TAKE BACK RETURN|FOB| ironic pinto +32486|869|70|1|30|53095.80|0.09|0.06|R|F|1994-11-23|1995-01-26|1994-12-03|DELIVER IN PERSON|FOB|ions cajole furiously. fluffily final asym +32486|741|6|2|4|6566.96|0.09|0.08|A|F|1994-11-20|1994-12-31|1994-12-18|TAKE BACK RETURN|FOB|ic pinto beans? fluffily iro +32486|23|49|3|35|32305.70|0.06|0.05|A|F|1994-12-19|1995-01-27|1994-12-29|TAKE BACK RETURN|TRUCK|fluffily. carefully bold +32486|207|35|4|17|18822.40|0.02|0.06|R|F|1994-11-26|1994-12-20|1994-12-10|COLLECT COD|FOB|y ironic accounts. carefu +32486|1020|56|5|19|17499.38|0.00|0.06|A|F|1994-12-22|1995-01-16|1995-01-03|TAKE BACK RETURN|MAIL|hless packages. furiously exp +32486|1554|75|6|6|8733.30|0.05|0.04|R|F|1994-11-23|1995-01-16|1994-12-08|DELIVER IN PERSON|FOB|pecial dependencies. silent, r +32487|282|37|1|29|34286.12|0.09|0.07|N|O|1996-05-29|1996-06-10|1996-06-24|NONE|TRUCK|bold pinto beans +32487|1104|5|2|21|21107.10|0.01|0.05|N|O|1996-07-10|1996-06-12|1996-07-18|TAKE BACK RETURN|SHIP| unusual deposit +32487|1368|83|3|36|45696.96|0.06|0.05|N|O|1996-05-30|1996-05-19|1996-06-20|DELIVER IN PERSON|SHIP|ng the blithely even requests. unusual dep +32487|1476|94|4|6|8264.82|0.08|0.00|N|O|1996-04-22|1996-05-12|1996-04-25|NONE|TRUCK| packages boost. quickly bold ideas are q +32487|1648|90|5|22|34092.08|0.10|0.08|N|O|1996-06-17|1996-04-27|1996-06-25|COLLECT COD|TRUCK|ording to the acc +32487|1363|2|6|6|7586.16|0.01|0.02|N|O|1996-06-29|1996-06-12|1996-07-29|COLLECT COD|SHIP| slyly bold packa +32512|947|50|1|3|5543.82|0.00|0.00|N|O|1997-09-11|1997-10-30|1997-09-20|COLLECT COD|REG AIR|ntain among the s +32513|736|37|1|13|21277.49|0.03|0.04|A|F|1992-02-29|1992-04-27|1992-03-15|COLLECT COD|REG AIR|p above the final, regular dugo +32513|335|92|2|37|45707.21|0.02|0.06|A|F|1992-04-20|1992-04-18|1992-05-02|COLLECT COD|REG AIR|eas haggle. carefully regular +32513|1218|93|3|12|13430.52|0.08|0.05|R|F|1992-05-09|1992-05-03|1992-05-18|DELIVER IN PERSON|RAIL|dolites. carefully pending ideas sol +32513|1255|67|4|11|12718.75|0.02|0.08|A|F|1992-05-25|1992-03-15|1992-06-03|TAKE BACK RETURN|MAIL|ests are final requests. blith +32513|1068|74|5|24|23257.44|0.01|0.00|R|F|1992-04-22|1992-03-14|1992-04-24|TAKE BACK RETURN|MAIL|uffily even instructions boost carefu +32514|700|94|1|46|73632.20|0.05|0.08|A|F|1993-01-01|1992-12-24|1993-01-11|COLLECT COD|FOB|eans print quickly. packages p +32514|42|93|2|8|7536.32|0.07|0.02|A|F|1992-11-23|1992-11-11|1992-12-19|TAKE BACK RETURN|RAIL|ccording to +32515|648|49|1|44|68140.16|0.08|0.08|N|O|1996-09-10|1996-09-30|1996-09-27|NONE|REG AIR| courts ar +32515|682|45|2|12|18992.16|0.09|0.05|N|O|1996-09-04|1996-10-31|1996-09-13|TAKE BACK RETURN|REG AIR|aggle carefully blithely ironic asymp +32515|621|84|3|43|65429.66|0.07|0.05|N|O|1996-11-17|1996-09-28|1996-12-05|TAKE BACK RETURN|AIR| across the deposits wak +32515|866|33|4|1|1766.86|0.06|0.02|N|O|1996-12-13|1996-11-01|1996-12-20|DELIVER IN PERSON|RAIL|nic packages cajole furi +32515|1728|13|5|37|60299.64|0.07|0.06|N|O|1996-12-18|1996-10-18|1997-01-05|TAKE BACK RETURN|SHIP|ages hang slyly after the fi +32515|89|65|6|44|43519.52|0.08|0.06|N|O|1996-12-17|1996-10-14|1996-12-19|COLLECT COD|SHIP|refully final platele +32516|287|88|1|26|30869.28|0.06|0.00|A|F|1993-10-29|1994-01-22|1993-11-04|TAKE BACK RETURN|RAIL|ons. fluffily unusual Tiresi +32516|45|21|2|48|45361.92|0.08|0.07|R|F|1993-11-26|1994-01-12|1993-12-25|NONE|MAIL|cial asymptotes are. blith +32516|866|67|3|22|38870.92|0.00|0.02|R|F|1994-01-18|1994-01-18|1994-01-24|COLLECT COD|REG AIR|furiously even theod +32516|533|34|4|9|12901.77|0.07|0.03|A|F|1994-01-14|1993-12-11|1994-02-05|NONE|MAIL|theodolites +32517|1437|38|1|2|2676.86|0.08|0.06|A|F|1992-08-11|1992-07-17|1992-08-12|NONE|TRUCK|nal, silent +32517|1062|63|2|40|38522.40|0.07|0.01|R|F|1992-09-08|1992-07-15|1992-09-22|DELIVER IN PERSON|SHIP|hs boost b +32518|170|49|1|44|47087.48|0.07|0.06|N|O|1997-03-18|1997-03-09|1997-04-01|COLLECT COD|RAIL| theodolites detect slyl +32519|352|9|1|11|13775.85|0.04|0.07|A|F|1993-10-27|1993-12-15|1993-11-10|NONE|RAIL|ove the fluffi +32519|783|80|2|25|42094.50|0.02|0.05|A|F|1994-01-17|1993-12-09|1994-02-02|TAKE BACK RETURN|FOB|y blithely regular +32519|1675|17|3|50|78833.50|0.09|0.01|A|F|1993-11-18|1993-12-17|1993-11-29|TAKE BACK RETURN|REG AIR| thinly even i +32519|1825|26|4|38|65619.16|0.09|0.06|A|F|1994-01-28|1993-12-04|1994-02-04|COLLECT COD|REG AIR|ial theodolit +32519|1914|59|5|9|16343.19|0.06|0.08|A|F|1993-11-19|1993-12-08|1993-11-20|COLLECT COD|RAIL|c, regular instructions nod evenly enti +32519|1636|78|6|20|30752.60|0.06|0.02|A|F|1994-01-05|1993-12-27|1994-01-17|TAKE BACK RETURN|TRUCK|instructions haggle special +32519|1848|49|7|16|27997.44|0.03|0.06|R|F|1993-12-25|1993-12-23|1994-01-03|COLLECT COD|TRUCK|e express ideas. furiously even accounts +32544|1763|48|1|45|74914.20|0.00|0.08|N|O|1996-05-12|1996-04-15|1996-05-19|TAKE BACK RETURN|MAIL| deposits. unusual foxes dou +32544|1125|26|2|15|15391.80|0.06|0.00|N|O|1996-03-22|1996-05-06|1996-04-21|DELIVER IN PERSON|REG AIR|r dependen +32545|229|84|1|22|24842.84|0.06|0.00|N|O|1996-01-25|1996-01-01|1996-02-22|DELIVER IN PERSON|TRUCK|ctions. even excus +32546|1264|65|1|18|20974.68|0.05|0.05|N|O|1995-07-10|1995-06-02|1995-07-29|TAKE BACK RETURN|REG AIR|ng the blithely unusual instruc +32546|84|60|2|4|3936.32|0.07|0.08|N|O|1995-07-10|1995-04-20|1995-07-28|DELIVER IN PERSON|SHIP|ular accounts. blithely ir +32546|1728|71|3|48|78226.56|0.06|0.00|N|O|1995-07-05|1995-04-19|1995-07-13|DELIVER IN PERSON|SHIP|y even accounts. furiously regular du +32546|420|8|4|34|44894.28|0.05|0.02|N|O|1995-06-20|1995-06-14|1995-07-16|DELIVER IN PERSON|FOB|y regular packages +32546|791|92|5|1|1691.79|0.06|0.05|N|F|1995-06-12|1995-05-22|1995-06-20|NONE|TRUCK| slyly even epitaphs +32547|575|76|1|6|8853.42|0.10|0.01|N|O|1997-05-11|1997-05-09|1997-06-02|COLLECT COD|SHIP|t express, permanent deposits. ironic, re +32547|1113|14|2|4|4056.44|0.10|0.00|N|O|1997-06-13|1997-04-26|1997-06-27|DELIVER IN PERSON|RAIL|thely express braids across the furiou +32548|562|93|1|12|17550.72|0.00|0.06|N|O|1997-05-23|1997-04-24|1997-05-29|NONE|REG AIR|ithely deposit +32548|732|97|2|22|35920.06|0.00|0.05|N|O|1997-05-30|1997-03-26|1997-06-27|NONE|REG AIR|rhorses are final packages. pendi +32548|1255|93|3|37|42781.25|0.10|0.03|N|O|1997-03-02|1997-04-27|1997-03-29|COLLECT COD|RAIL|slyly special deposits +32548|1007|8|4|9|8172.00|0.06|0.03|N|O|1997-05-31|1997-04-14|1997-06-08|DELIVER IN PERSON|SHIP|onic foxes must have to cajole ab +32548|1692|75|5|1|1593.69|0.10|0.06|N|O|1997-03-02|1997-03-31|1997-03-30|TAKE BACK RETURN|SHIP|ts sleep ironic gifts. pending, silen +32548|656|19|6|27|42029.55|0.05|0.07|N|O|1997-03-05|1997-05-08|1997-03-07|NONE|FOB|ully express foxes thrash carefully fin +32549|693|25|1|9|14343.21|0.04|0.03|N|O|1996-08-10|1996-06-27|1996-09-02|DELIVER IN PERSON|RAIL| blithely regular packages about the care +32549|813|13|2|35|59983.35|0.02|0.06|N|O|1996-05-01|1996-06-07|1996-05-07|NONE|MAIL|usly among the furiousl +32549|1511|32|3|23|32487.73|0.06|0.01|N|O|1996-06-01|1996-06-20|1996-06-08|DELIVER IN PERSON|SHIP|slyly special ideas. +32549|1816|3|4|34|58405.54|0.05|0.04|N|O|1996-05-30|1996-06-21|1996-06-12|NONE|TRUCK| special hockey players cajole +32549|267|68|5|18|21010.68|0.02|0.04|N|O|1996-05-15|1996-06-22|1996-06-08|COLLECT COD|FOB|warthogs must are slyly against the slyly +32549|1773|16|6|39|65316.03|0.10|0.08|N|O|1996-07-30|1996-05-28|1996-08-17|COLLECT COD|FOB|tterns cajole f +32549|1487|88|7|11|15273.28|0.09|0.04|N|O|1996-05-05|1996-06-22|1996-05-10|NONE|FOB|. slyly express requests nag quick +32550|1068|69|1|10|9690.60|0.03|0.06|A|F|1992-09-18|1992-10-23|1992-09-22|COLLECT COD|AIR| theodolites. e +32550|1676|18|2|6|9466.02|0.08|0.01|A|F|1992-07-31|1992-09-04|1992-08-06|DELIVER IN PERSON|FOB|c packages. +32551|1380|57|1|31|39722.78|0.10|0.08|N|O|1996-05-25|1996-06-14|1996-06-08|TAKE BACK RETURN|REG AIR|kages nod upon th +32576|877|44|1|43|76448.41|0.03|0.07|N|O|1996-12-15|1996-11-19|1996-12-20|DELIVER IN PERSON|AIR|ely. special, unusua +32577|693|25|1|49|78090.81|0.02|0.03|R|F|1993-09-18|1993-09-24|1993-09-23|NONE|TRUCK|y among the carefully special r +32577|571|32|2|40|58862.80|0.00|0.03|A|F|1993-09-23|1993-09-30|1993-10-21|NONE|REG AIR|e furious dependencies. ir +32577|1510|11|3|29|40933.79|0.08|0.05|A|F|1993-11-15|1993-10-10|1993-12-11|NONE|RAIL|s cajole. quickly p +32577|1384|99|4|14|17995.32|0.00|0.04|R|F|1993-09-15|1993-11-19|1993-10-10|NONE|REG AIR| about the regular requests. special acco +32578|926|27|1|34|62115.28|0.03|0.05|R|F|1995-05-17|1995-03-30|1995-06-06|NONE|MAIL|etect blithely accord +32579|1513|34|1|48|67896.48|0.00|0.01|N|O|1995-11-20|1995-12-13|1995-12-09|COLLECT COD|TRUCK|ending packages are. blit +32580|1884|14|1|28|50004.64|0.06|0.03|N|O|1995-10-25|1995-11-01|1995-11-17|COLLECT COD|MAIL|y final foxes. carefully +32580|109|36|2|14|14127.40|0.01|0.00|N|O|1995-12-12|1995-10-31|1996-01-07|NONE|FOB|usily bold accounts. ironic, bold waters s +32580|602|34|3|28|42072.80|0.09|0.02|N|O|1995-11-16|1995-11-16|1995-11-29|DELIVER IN PERSON|AIR|lites. carefully flu +32580|1517|98|4|7|9929.57|0.01|0.06|N|O|1995-12-21|1995-11-06|1995-12-31|DELIVER IN PERSON|FOB| ironic deposits. ideas wake +32580|940|43|5|49|90206.06|0.02|0.05|N|O|1995-09-19|1995-11-03|1995-10-08|TAKE BACK RETURN|MAIL|carefully +32580|604|5|6|3|4513.80|0.05|0.05|N|O|1996-01-12|1995-11-12|1996-01-27|DELIVER IN PERSON|RAIL| across the sly +32580|802|69|7|17|28947.60|0.00|0.01|N|O|1995-12-24|1995-11-02|1995-12-27|COLLECT COD|MAIL|ts about the silen +32581|455|56|1|41|55573.45|0.06|0.06|N|O|1997-03-15|1997-04-04|1997-04-12|NONE|AIR| silent deposits. blithely pendi +32581|1363|78|2|37|46781.32|0.08|0.00|N|O|1997-05-02|1997-04-07|1997-05-29|COLLECT COD|AIR|ending packages +32581|110|89|3|8|8080.88|0.10|0.07|N|O|1997-03-18|1997-04-03|1997-04-03|NONE|FOB|. unusual courts sleep about th +32582|241|69|1|16|18259.84|0.09|0.08|A|F|1994-09-10|1994-09-19|1994-09-26|NONE|REG AIR|ironic accounts. ironic, regular +32582|453|54|2|42|56844.90|0.07|0.06|R|F|1994-07-29|1994-09-16|1994-08-19|COLLECT COD|AIR|ar packages boost about +32582|1094|30|3|21|20896.89|0.07|0.00|R|F|1994-08-19|1994-08-05|1994-09-05|COLLECT COD|RAIL|l ideas wake careful +32582|1768|95|4|36|60111.36|0.00|0.05|R|F|1994-09-15|1994-08-06|1994-10-07|TAKE BACK RETURN|REG AIR|nic packages sleep bl +32582|323|8|5|3|3669.96|0.09|0.03|R|F|1994-08-28|1994-09-07|1994-09-01|TAKE BACK RETURN|AIR|arefully pending e +32582|1555|76|6|43|62631.65|0.01|0.03|A|F|1994-09-05|1994-08-17|1994-09-23|TAKE BACK RETURN|RAIL|ly even excuses +32583|1320|59|1|28|34196.96|0.10|0.07|N|O|1996-02-29|1996-03-25|1996-03-26|DELIVER IN PERSON|SHIP|press pinto beans. bold package +32583|1777|78|2|11|18466.47|0.03|0.02|N|O|1996-04-07|1996-04-26|1996-05-01|COLLECT COD|MAIL| use? blithely regular requests are quick +32583|795|96|3|40|67831.60|0.10|0.00|N|O|1996-05-04|1996-05-03|1996-05-10|TAKE BACK RETURN|SHIP|s haggle fluffily. fluffily final pinto be +32583|1866|53|4|35|61875.10|0.10|0.04|N|O|1996-03-17|1996-03-28|1996-04-14|NONE|REG AIR|y against the slyly slow asymptotes. +32583|952|87|5|16|29647.20|0.07|0.04|N|O|1996-04-18|1996-04-16|1996-05-09|DELIVER IN PERSON|MAIL| regular pe +32583|533|94|6|33|47306.49|0.07|0.05|N|O|1996-05-18|1996-05-11|1996-06-11|NONE|RAIL|sly unusual ideas believe furiousl +32608|477|65|1|21|28926.87|0.00|0.02|A|F|1992-05-26|1992-08-14|1992-05-27|NONE|MAIL|according to the pending, unusual requests +32608|646|47|2|48|74238.72|0.10|0.06|R|F|1992-06-22|1992-08-11|1992-07-03|NONE|SHIP|nts boost acro +32608|1299|37|3|24|28806.96|0.01|0.06|A|F|1992-07-25|1992-07-08|1992-07-30|TAKE BACK RETURN|AIR|into beans according to the instruc +32608|1406|24|4|34|44451.60|0.02|0.04|A|F|1992-08-16|1992-07-25|1992-08-27|DELIVER IN PERSON|SHIP|lithely. final ideas wake carefully ev +32608|1489|7|5|46|63962.08|0.06|0.01|R|F|1992-06-28|1992-08-12|1992-07-18|COLLECT COD|AIR|t furiously regular packages. furious +32608|1986|19|6|7|13215.86|0.06|0.08|R|F|1992-07-05|1992-08-15|1992-07-22|TAKE BACK RETURN|FOB|inal, permanent platelets impr +32609|795|96|1|30|50873.70|0.08|0.00|N|O|1996-08-10|1996-07-16|1996-08-28|TAKE BACK RETURN|RAIL|s integrate across the f +32609|946|47|2|21|38785.74|0.08|0.08|N|O|1996-06-11|1996-06-16|1996-07-03|TAKE BACK RETURN|MAIL|frets are furiously slyly reg +32610|27|28|1|47|43569.94|0.03|0.06|A|F|1992-11-25|1992-09-23|1992-11-30|NONE|AIR|ges boost against the blithely final idea +32610|1591|32|2|43|64181.37|0.03|0.06|R|F|1992-12-05|1992-10-26|1993-01-03|DELIVER IN PERSON|AIR|ts. ironically final ideas are blit +32610|954|89|3|30|55648.50|0.05|0.07|R|F|1992-11-13|1992-11-03|1992-12-08|TAKE BACK RETURN|MAIL|fully alongside of the carefully regular +32610|918|53|4|23|41834.93|0.00|0.05|A|F|1992-11-22|1992-09-26|1992-12-19|DELIVER IN PERSON|AIR|ake carefully according to +32610|1342|19|5|10|12433.40|0.02|0.07|A|F|1992-09-03|1992-10-14|1992-10-03|DELIVER IN PERSON|MAIL|hely ironic packages sleep caref +32610|565|26|6|32|46897.92|0.05|0.06|A|F|1992-12-17|1992-10-10|1993-01-04|TAKE BACK RETURN|AIR|s, ironic accounts engage. furiously +32610|828|28|7|34|58779.88|0.05|0.04|A|F|1992-10-26|1992-09-25|1992-11-19|NONE|AIR| blithely pending pi +32611|700|63|1|42|67229.40|0.06|0.01|R|F|1994-10-05|1994-11-16|1994-10-11|DELIVER IN PERSON|REG AIR|ly even excuses nag slyly ironic, +32611|1256|68|2|28|32403.00|0.06|0.00|R|F|1994-11-24|1994-10-15|1994-12-10|COLLECT COD|AIR|sits boost slyly after the ironical +32611|1874|4|3|7|12431.09|0.08|0.06|R|F|1994-10-09|1994-11-24|1994-11-04|DELIVER IN PERSON|SHIP|ges sleep across the even dependencies +32611|313|70|4|30|36399.30|0.10|0.08|A|F|1994-11-04|1994-11-02|1994-11-05|COLLECT COD|RAIL|ctions. carefully final reques +32611|671|34|5|37|58151.79|0.09|0.03|A|F|1994-10-26|1994-11-02|1994-11-07|DELIVER IN PERSON|MAIL|as. express ex +32611|522|23|6|13|18492.76|0.01|0.03|A|F|1994-10-17|1994-10-16|1994-11-16|COLLECT COD|TRUCK|ic requests. unusual, silent ac +32611|296|97|7|13|15551.77|0.09|0.08|R|F|1994-08-29|1994-11-15|1994-09-01|NONE|TRUCK|. boldly bold deposits us +32612|527|18|1|23|32832.96|0.08|0.03|A|F|1993-03-27|1993-03-22|1993-04-08|COLLECT COD|RAIL|ilent deposits nag quickly fluffily regular +32613|935|38|1|48|88124.64|0.01|0.04|N|O|1996-03-16|1996-03-12|1996-04-01|DELIVER IN PERSON|RAIL|ackages serve blithely ideas. f +32613|549|80|2|22|31889.88|0.09|0.01|N|O|1996-03-22|1996-01-25|1996-04-14|COLLECT COD|FOB|nts. permanently pending ideas slee +32613|1788|89|3|37|62521.86|0.01|0.06|N|O|1996-04-05|1996-02-25|1996-05-04|COLLECT COD|AIR|usly final packages. silent deposits b +32613|928|29|4|33|60354.36|0.02|0.07|N|O|1996-03-29|1996-01-24|1996-04-15|DELIVER IN PERSON|TRUCK|olites agains +32613|1649|91|5|30|46519.20|0.03|0.04|N|O|1996-02-28|1996-02-17|1996-03-23|NONE|MAIL|ages. fluffily regular packages c +32613|924|25|6|35|63872.20|0.07|0.08|N|O|1996-03-08|1996-02-19|1996-04-07|COLLECT COD|REG AIR|ding to the accounts. c +32614|216|98|1|11|12278.31|0.01|0.06|N|O|1996-09-08|1996-11-02|1996-10-02|NONE|SHIP|ages sleep +32614|1342|57|2|48|59680.32|0.00|0.07|N|O|1996-08-20|1996-10-03|1996-09-03|NONE|REG AIR|ges. regular deposi +32614|1975|8|3|13|24400.61|0.05|0.08|N|O|1996-09-12|1996-11-12|1996-09-26|COLLECT COD|SHIP|e quickly final foxes; regul +32614|1170|43|4|44|47131.48|0.01|0.01|N|O|1996-12-01|1996-11-06|1996-12-05|DELIVER IN PERSON|AIR|old warthogs use blithely. +32614|1319|20|5|9|10982.79|0.04|0.02|N|O|1996-11-08|1996-09-27|1996-11-26|NONE|TRUCK|yly final pinto beans sleep above the fluff +32614|1295|7|6|28|33496.12|0.03|0.03|N|O|1996-12-08|1996-10-09|1996-12-12|NONE|MAIL|p furiously carefully special asympt +32615|1955|88|1|17|31568.15|0.09|0.03|A|F|1992-02-01|1992-02-29|1992-02-26|TAKE BACK RETURN|TRUCK|tes. carefully unusual +32640|1281|82|1|25|29557.00|0.00|0.02|R|F|1992-11-02|1992-10-28|1992-11-08|TAKE BACK RETURN|MAIL| haggle blithely requests. slyly +32640|1194|31|2|2|2190.38|0.01|0.00|A|F|1992-12-26|1992-11-19|1992-12-29|COLLECT COD|REG AIR|he final excuses hang fluffily along +32640|1847|91|3|21|36725.64|0.01|0.05|R|F|1992-10-27|1992-10-18|1992-11-18|DELIVER IN PERSON|TRUCK|ly furiously regular platelets. foxes above +32640|590|21|4|46|68567.14|0.07|0.05|R|F|1992-10-14|1992-11-18|1992-11-10|TAKE BACK RETURN|FOB|ests wake. carefully unu +32640|1832|33|5|31|53748.73|0.09|0.00|R|F|1992-10-09|1992-10-21|1992-10-30|COLLECT COD|MAIL|ake slyly. regular, bold a +32640|1150|59|6|17|17869.55|0.07|0.03|R|F|1992-09-27|1992-12-11|1992-10-14|COLLECT COD|FOB| dolphins haggle. final, final somas nag +32640|1515|96|7|37|52410.87|0.00|0.06|R|F|1992-11-26|1992-11-11|1992-11-28|DELIVER IN PERSON|TRUCK| carefully express foxes about th +32641|941|44|1|38|69993.72|0.02|0.05|R|F|1993-06-20|1993-04-22|1993-07-02|DELIVER IN PERSON|SHIP|nal theodolites. slyly unusual pa +32641|1080|51|2|23|22564.84|0.10|0.04|A|F|1993-03-29|1993-06-13|1993-04-09|TAKE BACK RETURN|REG AIR|ve the slyly ironic +32641|1885|15|3|21|37524.48|0.07|0.03|R|F|1993-04-24|1993-04-22|1993-05-01|NONE|REG AIR|l requests are slyly after the +32641|593|24|4|11|16429.49|0.01|0.04|R|F|1993-06-22|1993-05-26|1993-07-05|DELIVER IN PERSON|TRUCK|ly against the quickly regular request +32641|1399|76|5|34|44213.26|0.09|0.01|R|F|1993-05-18|1993-05-09|1993-05-31|DELIVER IN PERSON|REG AIR|ges. pending, express +32641|1589|90|6|27|40245.66|0.02|0.04|A|F|1993-07-10|1993-05-26|1993-08-01|DELIVER IN PERSON|MAIL|ts wake quickly blithely iro +32641|799|96|7|12|20397.48|0.08|0.05|A|F|1993-03-28|1993-05-05|1993-04-24|DELIVER IN PERSON|REG AIR|final, final requ +32642|704|69|1|17|27279.90|0.05|0.02|A|F|1992-06-28|1992-06-07|1992-07-26|NONE|RAIL|nusual platelets use carefull +32643|1106|79|1|20|20142.00|0.06|0.07|N|O|1997-09-20|1997-08-25|1997-09-28|DELIVER IN PERSON|REG AIR|kly pending accounts +32643|516|17|2|18|25497.18|0.04|0.04|N|O|1997-08-27|1997-09-04|1997-09-17|NONE|SHIP| deposits c +32644|1516|17|1|27|38272.77|0.08|0.00|N|O|1997-07-29|1997-06-08|1997-08-28|COLLECT COD|RAIL|its: furiously special packages sublate q +32644|1462|63|2|22|29996.12|0.03|0.08|N|O|1997-06-26|1997-06-27|1997-06-27|DELIVER IN PERSON|RAIL|y ironic pinto beans use ag +32645|1925|14|1|7|12788.44|0.07|0.06|N|O|1997-09-07|1997-06-26|1997-09-15|NONE|AIR|ost slyly. quickly slow ac +32645|893|60|2|41|73549.49|0.00|0.06|N|O|1997-06-16|1997-06-30|1997-06-21|TAKE BACK RETURN|MAIL|sual excuses do +32646|1820|50|1|43|74038.26|0.02|0.06|N|O|1997-07-20|1997-08-09|1997-07-24|COLLECT COD|AIR|permanent foxes nag blithely regular, b +32646|1649|73|2|6|9303.84|0.03|0.01|N|O|1997-06-13|1997-07-08|1997-07-01|DELIVER IN PERSON|TRUCK|fily. quickly thin excuses +32646|1222|34|3|11|12355.42|0.05|0.07|N|O|1997-05-18|1997-08-07|1997-06-02|DELIVER IN PERSON|REG AIR|yly special foxes. +32647|247|2|1|6|6883.44|0.08|0.02|N|O|1995-12-13|1996-02-13|1995-12-28|TAKE BACK RETURN|FOB|he accounts w +32647|1579|100|2|40|59222.80|0.10|0.08|N|O|1996-01-19|1996-01-25|1996-02-06|NONE|FOB|ages. carefully unu +32647|300|55|3|9|10802.70|0.08|0.00|N|O|1996-02-27|1996-01-16|1996-03-02|COLLECT COD|MAIL|uffily ironic requests +32647|1365|80|4|30|37990.80|0.09|0.03|N|O|1996-02-19|1996-02-05|1996-02-29|COLLECT COD|SHIP|refully regular +32647|1501|22|5|17|23842.50|0.01|0.03|N|O|1995-12-15|1995-12-29|1995-12-26|TAKE BACK RETURN|FOB|ptotes sleep. re +32647|1239|51|6|18|20524.14|0.07|0.00|N|O|1995-11-27|1996-01-26|1995-12-07|TAKE BACK RETURN|TRUCK|nic accounts. fluffily iron +32672|662|25|1|39|60943.74|0.00|0.08|A|F|1994-07-27|1994-08-12|1994-08-05|DELIVER IN PERSON|SHIP|to beans s +32672|1677|19|2|4|6314.68|0.05|0.05|A|F|1994-07-02|1994-08-12|1994-07-05|TAKE BACK RETURN|FOB|n the slyly regular deposits affix fu +32672|1636|60|3|41|63042.83|0.04|0.00|A|F|1994-09-03|1994-07-21|1994-09-28|TAKE BACK RETURN|SHIP|eas. furiously ironic requests serve slyl +32673|1397|74|1|22|28564.58|0.00|0.02|N|O|1996-11-11|1996-11-24|1996-12-10|NONE|RAIL| beans believe. accounts haggle ca +32674|362|19|1|20|25247.20|0.09|0.04|N|O|1997-10-10|1997-12-01|1997-10-22|NONE|TRUCK|lly regular hockey players wake around t +32674|167|94|2|25|26679.00|0.03|0.03|N|O|1998-01-06|1997-11-17|1998-01-28|NONE|MAIL|cial asymptotes af +32675|51|52|1|6|5706.30|0.07|0.04|A|F|1994-11-11|1994-12-21|1994-11-28|COLLECT COD|SHIP|platelets. carefully ironic ideas nag b +32675|142|21|2|21|21884.94|0.04|0.01|R|F|1995-02-24|1994-12-28|1995-03-20|TAKE BACK RETURN|SHIP|r dependencies cajole. final, even forge +32675|1572|53|3|25|36839.25|0.06|0.08|A|F|1994-11-10|1995-01-16|1994-11-11|TAKE BACK RETURN|TRUCK|pinto beans boost according to +32675|115|94|4|3|3045.33|0.06|0.00|R|F|1994-11-19|1994-12-08|1994-12-16|TAKE BACK RETURN|FOB|thely. fluffily special excuses must h +32675|1781|8|5|32|53848.96|0.10|0.04|A|F|1995-02-27|1995-01-18|1995-03-06|TAKE BACK RETURN|SHIP|inal packages are per +32676|1690|91|1|1|1591.69|0.07|0.04|R|F|1994-02-08|1994-04-19|1994-02-12|NONE|SHIP|less deposits. carefully enticing theo +32676|1089|25|2|29|28712.32|0.06|0.02|R|F|1994-03-02|1994-03-14|1994-03-19|NONE|RAIL|egular theodolites. express, unusual acc +32676|450|80|3|49|66172.05|0.08|0.06|R|F|1994-02-09|1994-03-24|1994-02-10|TAKE BACK RETURN|RAIL|the furiously even fox +32676|232|60|4|7|7925.61|0.10|0.07|R|F|1994-03-01|1994-03-20|1994-03-28|DELIVER IN PERSON|REG AIR|to the quickly slow requests cajole blithe +32676|1040|11|5|35|32936.40|0.03|0.03|A|F|1994-02-10|1994-03-20|1994-03-09|TAKE BACK RETURN|RAIL|to beans against the bold theodolites +32676|398|27|6|2|2596.78|0.00|0.00|R|F|1994-04-10|1994-03-31|1994-04-12|TAKE BACK RETURN|FOB|oxes sleep sly +32677|888|88|1|1|1788.88|0.05|0.02|N|O|1996-06-16|1996-05-12|1996-06-24|DELIVER IN PERSON|RAIL|ven foxes. carefully regular de +32678|45|21|1|30|28351.20|0.10|0.01|N|O|1995-12-22|1996-02-19|1995-12-29|DELIVER IN PERSON|AIR|usily pending requests are furiously al +32678|286|87|2|8|9490.24|0.03|0.04|N|O|1996-04-02|1996-01-24|1996-04-23|NONE|REG AIR|structions. frays use. final a +32678|708|9|3|33|53087.10|0.10|0.05|N|O|1996-03-25|1996-02-04|1996-04-15|TAKE BACK RETURN|FOB|ully special instruct +32679|1325|64|1|47|57637.04|0.04|0.01|N|O|1998-03-23|1998-03-09|1998-04-20|TAKE BACK RETURN|RAIL|s. carefully blithe packages s +32679|1575|56|2|37|54633.09|0.00|0.06|N|O|1998-02-23|1998-02-04|1998-03-25|COLLECT COD|SHIP|ever regular theodolites. doggedly reg +32704|1780|7|1|47|79043.66|0.00|0.00|N|O|1998-03-23|1998-03-15|1998-04-13|TAKE BACK RETURN|AIR|requests nag carefully special orbits. +32704|851|52|2|29|50803.65|0.03|0.06|N|O|1998-03-23|1998-03-22|1998-04-21|TAKE BACK RETURN|REG AIR|heodolites use slyly a +32705|580|81|1|3|4441.74|0.10|0.06|R|F|1994-07-03|1994-05-21|1994-08-02|DELIVER IN PERSON|TRUCK|g the special deposits. asymptote +32705|1541|62|2|3|4327.62|0.05|0.05|A|F|1994-07-07|1994-05-01|1994-07-22|COLLECT COD|REG AIR|ithely blithe foxes cajole slyly. furiousl +32705|1610|34|3|20|30232.20|0.08|0.08|A|F|1994-04-01|1994-05-26|1994-04-08|TAKE BACK RETURN|MAIL|ly regular foxes cajole care +32705|923|58|4|12|21887.04|0.05|0.05|A|F|1994-04-19|1994-05-07|1994-05-14|COLLECT COD|REG AIR|oxes. carefully idle th +32706|858|58|1|35|61559.75|0.02|0.04|R|F|1994-09-30|1994-09-27|1994-10-24|TAKE BACK RETURN|RAIL|as. pending platelets alongside of +32707|863|97|1|3|5291.58|0.01|0.02|A|F|1994-06-24|1994-06-01|1994-07-16|NONE|SHIP|cuses sleep fu +32707|24|50|2|7|6468.14|0.10|0.00|R|F|1994-06-08|1994-05-22|1994-06-23|NONE|REG AIR|quickly. regular platelets wake blit +32707|1987|88|3|32|60447.36|0.07|0.03|R|F|1994-06-19|1994-07-09|1994-07-04|TAKE BACK RETURN|FOB|ly ironic pinto be +32708|130|57|1|37|38114.81|0.00|0.01|N|O|1996-04-22|1996-02-07|1996-05-20|NONE|TRUCK|deas haggle carefully eve +32708|1284|22|2|39|46225.92|0.08|0.03|N|O|1996-03-20|1996-03-18|1996-04-04|TAKE BACK RETURN|SHIP|ronic theodolite +32708|1118|27|3|32|32611.52|0.02|0.06|N|O|1996-02-10|1996-03-18|1996-03-05|DELIVER IN PERSON|RAIL|odolites? never final requests boost bli +32709|824|24|1|48|82791.36|0.00|0.06|N|O|1996-06-05|1996-04-17|1996-06-11|NONE|REG AIR|ests. furiousl +32709|243|44|2|27|30867.48|0.03|0.03|N|O|1996-05-26|1996-03-29|1996-06-05|NONE|FOB| busily fina +32709|141|42|3|18|18740.52|0.10|0.01|N|O|1996-02-07|1996-04-22|1996-03-06|TAKE BACK RETURN|MAIL|deposits. regular packages solve packages: +32709|632|33|4|24|36783.12|0.09|0.02|N|O|1996-02-17|1996-03-24|1996-02-25|TAKE BACK RETURN|RAIL|ckages! closely +32709|1327|66|5|29|35621.28|0.03|0.02|N|O|1996-04-21|1996-04-17|1996-05-17|DELIVER IN PERSON|RAIL| final deposi +32709|1762|63|6|49|81524.24|0.01|0.05|N|O|1996-05-20|1996-03-30|1996-06-10|NONE|AIR|fully furious +32710|1393|8|1|45|58247.55|0.05|0.03|A|F|1995-01-18|1995-01-11|1995-02-06|TAKE BACK RETURN|SHIP|oost quickly +32710|1565|86|2|19|27864.64|0.00|0.03|A|F|1995-01-25|1995-01-19|1995-02-09|TAKE BACK RETURN|MAIL|sual request +32710|16|92|3|31|28396.31|0.08|0.08|R|F|1995-02-09|1995-01-28|1995-02-12|DELIVER IN PERSON|TRUCK|x. slyly regular foxes h +32711|1934|23|1|41|75273.13|0.00|0.01|N|O|1996-02-09|1996-04-19|1996-03-10|DELIVER IN PERSON|TRUCK|lly special d +32711|194|21|2|13|14224.47|0.00|0.00|N|O|1996-02-28|1996-03-30|1996-03-06|DELIVER IN PERSON|REG AIR| wake carefully against the br +32711|1621|45|3|17|25884.54|0.02|0.08|N|O|1996-04-02|1996-05-03|1996-04-07|COLLECT COD|TRUCK| even deposits according to the fur +32711|1620|62|4|18|27389.16|0.03|0.00|N|O|1996-05-04|1996-04-12|1996-06-03|DELIVER IN PERSON|REG AIR|nt dependencies solve +32711|969|70|5|15|28049.40|0.01|0.04|N|O|1996-02-24|1996-04-18|1996-03-15|TAKE BACK RETURN|AIR|ns. always final courts nag carefu +32711|1596|37|6|6|8985.54|0.08|0.02|N|O|1996-02-17|1996-03-08|1996-03-06|TAKE BACK RETURN|TRUCK|around the en +32711|747|12|7|36|59318.64|0.01|0.04|N|O|1996-02-24|1996-04-12|1996-03-01|TAKE BACK RETURN|SHIP|lly. busy deposits should have to wake bli +32736|1384|99|1|9|11568.42|0.02|0.00|N|O|1998-04-25|1998-03-30|1998-05-13|TAKE BACK RETURN|SHIP|ly final r +32736|951|54|2|3|5555.85|0.10|0.01|N|O|1998-05-06|1998-03-22|1998-05-10|COLLECT COD|MAIL|out the bravely regul +32736|1616|99|3|45|68292.45|0.01|0.00|N|O|1998-03-21|1998-05-11|1998-03-28|COLLECT COD|SHIP|s are. blithely final asymptotes shall +32736|729|62|4|18|29334.96|0.10|0.02|N|O|1998-05-29|1998-03-30|1998-06-16|NONE|FOB|carefully +32737|1993|38|1|23|43584.77|0.05|0.03|R|F|1994-11-22|1995-01-27|1994-12-08|NONE|TRUCK|lithely unusual attainments haggle qu +32737|1632|33|2|15|23004.45|0.09|0.04|A|F|1994-11-08|1995-01-16|1994-11-11|DELIVER IN PERSON|MAIL|. final foxes dazz +32737|1038|44|3|21|19719.63|0.06|0.02|A|F|1994-11-12|1994-12-17|1994-11-14|COLLECT COD|TRUCK|ounts haggle express, bol +32737|1983|72|4|5|9424.90|0.00|0.08|A|F|1995-02-05|1994-12-02|1995-03-06|TAKE BACK RETURN|RAIL|uffily final +32737|796|97|5|18|30542.22|0.01|0.02|A|F|1995-01-31|1995-01-12|1995-02-09|COLLECT COD|REG AIR|ing, pending decoys. regular, ironic depos +32737|1697|98|6|10|15986.90|0.01|0.07|A|F|1994-12-28|1994-12-09|1994-12-31|DELIVER IN PERSON|REG AIR|e bold accounts sleep under the quic +32737|1635|18|7|47|72221.61|0.07|0.07|A|F|1994-12-21|1995-01-10|1995-01-15|NONE|TRUCK| packages use alongside of the p +32738|1061|32|1|12|11544.72|0.03|0.03|N|O|1998-05-30|1998-04-29|1998-06-01|DELIVER IN PERSON|FOB| brave excuses sleep blithely +32739|1745|88|1|29|47755.46|0.08|0.03|N|O|1996-11-16|1996-11-25|1996-12-03|DELIVER IN PERSON|TRUCK|ideas haggle blithely according to the qu +32740|1088|59|1|36|35606.88|0.00|0.08|R|F|1993-01-25|1993-01-06|1993-01-30|NONE|MAIL|ng to the q +32741|182|83|1|50|54109.00|0.02|0.08|A|F|1994-03-09|1994-03-27|1994-03-29|COLLECT COD|REG AIR|ing packages haggle. caref +32741|650|13|2|8|12405.20|0.03|0.07|A|F|1994-02-23|1994-04-12|1994-03-08|DELIVER IN PERSON|RAIL|accounts. doggedly even depend +32741|1690|32|3|5|7958.45|0.05|0.03|A|F|1994-06-05|1994-04-05|1994-06-11|COLLECT COD|FOB|oss the stealthily +32741|577|38|4|36|53192.52|0.09|0.08|A|F|1994-04-12|1994-05-12|1994-05-02|COLLECT COD|MAIL|uickly bold foxes solve silently. regul +32741|776|41|5|48|80484.96|0.02|0.06|R|F|1994-02-27|1994-05-12|1994-03-18|NONE|SHIP|gainst the regular theodolites +32741|841|8|6|17|29611.28|0.06|0.04|R|F|1994-03-15|1994-05-09|1994-04-03|TAKE BACK RETURN|SHIP|ar asymptotes. ironic pinto beans n +32741|554|55|7|38|55272.90|0.00|0.01|R|F|1994-04-02|1994-04-08|1994-04-25|NONE|FOB|efully unusual instructions. furiously fi +32742|651|52|1|6|9309.90|0.08|0.01|N|O|1998-05-30|1998-07-13|1998-06-22|NONE|RAIL| blithely fluffy requests a +32742|1831|18|2|19|32923.77|0.08|0.03|N|O|1998-08-05|1998-06-25|1998-08-19|TAKE BACK RETURN|RAIL|y even inst +32742|1630|72|3|42|64328.46|0.03|0.04|N|O|1998-07-08|1998-06-19|1998-07-10|NONE|TRUCK|unusual foxes h +32742|1844|74|4|11|19204.24|0.04|0.03|N|O|1998-09-02|1998-07-30|1998-09-09|DELIVER IN PERSON|AIR| carefully among the permanent, +32743|1295|70|1|19|22729.51|0.01|0.05|A|F|1993-08-15|1993-06-22|1993-08-30|COLLECT COD|TRUCK|gular, regular foxes nag +32743|1085|21|2|46|45359.68|0.03|0.01|R|F|1993-05-18|1993-06-28|1993-06-10|COLLECT COD|MAIL| quickly unusual depo +32743|1162|35|3|26|27642.16|0.05|0.06|A|F|1993-05-13|1993-07-15|1993-05-22|DELIVER IN PERSON|AIR|to beans nag furiously. furiou +32768|1732|75|1|35|57180.55|0.06|0.08|N|O|1997-11-20|1997-10-11|1997-12-16|DELIVER IN PERSON|TRUCK|e blithely special deposits; iro +32768|1804|34|2|29|49468.20|0.07|0.07|N|O|1997-10-26|1997-10-06|1997-11-18|TAKE BACK RETURN|AIR|s are packages. blithely regular asymp +32768|1198|71|3|25|27479.75|0.00|0.06|N|O|1997-08-06|1997-10-17|1997-08-15|COLLECT COD|FOB|efully slow foxes. slyly regular deposits +32768|1554|35|4|50|72777.50|0.08|0.07|N|O|1997-12-02|1997-09-20|1997-12-03|COLLECT COD|FOB|hely express dug +32768|1754|81|5|4|6623.00|0.08|0.06|N|O|1997-08-16|1997-10-14|1997-09-08|TAKE BACK RETURN|MAIL| theodolites are quietl +32769|667|68|1|17|26650.22|0.07|0.07|N|O|1997-01-25|1997-04-01|1997-02-10|COLLECT COD|TRUCK| bold patterns are carefully bold, e +32769|1769|70|2|42|70171.92|0.07|0.03|N|O|1997-02-25|1997-04-04|1997-03-01|COLLECT COD|SHIP| ironic inst +32770|1107|16|1|19|19153.90|0.09|0.01|N|O|1996-02-21|1996-04-06|1996-03-20|NONE|AIR|y whithout the carefully express foxes. +32770|1652|53|2|11|17090.15|0.10|0.02|N|O|1996-05-15|1996-04-27|1996-05-30|TAKE BACK RETURN|FOB| fluffily even deposits sleep idly quick +32770|1077|83|3|50|48903.50|0.02|0.07|N|O|1996-05-04|1996-03-16|1996-05-25|TAKE BACK RETURN|AIR|warhorses. even +32770|1298|10|4|24|28782.96|0.10|0.02|N|O|1996-05-17|1996-04-12|1996-05-31|NONE|FOB|ins. daringly unu +32770|885|85|5|44|78578.72|0.05|0.01|N|O|1996-03-11|1996-03-01|1996-03-13|COLLECT COD|RAIL|ments. furiously regular a +32770|831|98|6|23|39832.09|0.00|0.00|N|O|1996-02-03|1996-04-16|1996-02-05|NONE|RAIL|ix furiously carefu +32771|1423|24|1|34|45030.28|0.04|0.00|N|O|1997-04-22|1997-04-03|1997-04-29|NONE|FOB| packages. quickly +32771|460|19|2|23|31290.58|0.10|0.00|N|O|1997-03-05|1997-04-05|1997-03-17|COLLECT COD|MAIL|fully alongside of the carefully +32771|1012|13|3|49|44737.49|0.01|0.07|N|O|1997-04-20|1997-02-24|1997-04-27|COLLECT COD|REG AIR|lly after the +32771|1242|17|4|30|34297.20|0.05|0.02|N|O|1997-02-21|1997-04-12|1997-03-11|NONE|MAIL|ns use blithely above the blithely blith +32771|1233|45|5|34|38563.82|0.01|0.03|N|O|1997-01-17|1997-04-04|1997-02-09|TAKE BACK RETURN|SHIP|ly regular ideas are furiously. c +32772|1509|90|1|14|19747.00|0.03|0.01|N|O|1998-01-20|1997-12-25|1998-01-24|COLLECT COD|RAIL|e furiously ironic foxes. blithely even not +32772|329|86|2|32|39338.24|0.10|0.08|N|O|1997-10-27|1997-12-10|1997-11-05|COLLECT COD|FOB|quickly accordin +32772|905|6|3|15|27088.50|0.08|0.02|N|O|1998-01-09|1997-12-03|1998-01-19|DELIVER IN PERSON|SHIP|xes sleep. thinly bold +32772|1151|52|4|34|35773.10|0.01|0.07|N|O|1997-11-29|1997-11-29|1997-12-21|DELIVER IN PERSON|MAIL|y asymptotes. doggedly express depos +32772|1838|39|5|25|43495.75|0.02|0.03|N|O|1997-11-04|1998-01-11|1997-11-28|DELIVER IN PERSON|FOB|furiously ironic r +32772|950|51|6|16|29615.20|0.10|0.08|N|O|1997-12-28|1997-12-31|1998-01-17|COLLECT COD|AIR|posits around +32773|1799|42|1|14|23811.06|0.09|0.07|N|O|1998-09-12|1998-07-16|1998-10-03|TAKE BACK RETURN|FOB|nding requests. slyly regular dol +32773|1693|17|2|4|6378.76|0.04|0.06|N|O|1998-08-31|1998-08-11|1998-09-04|NONE|FOB|regular instructi +32773|1567|8|3|46|67553.76|0.03|0.01|N|O|1998-08-21|1998-07-31|1998-09-15|TAKE BACK RETURN|FOB|packages above the furiously +32773|775|72|4|18|30163.86|0.08|0.03|N|O|1998-09-05|1998-08-30|1998-09-06|COLLECT COD|RAIL|ully. unusual requests affix furiously abou +32773|1923|56|5|47|85771.24|0.04|0.06|N|O|1998-07-08|1998-07-30|1998-07-12|TAKE BACK RETURN|RAIL|final packages use. blithely +32773|465|95|6|48|65542.08|0.07|0.01|N|O|1998-06-09|1998-08-23|1998-06-29|COLLECT COD|FOB|s are carefully quickly qu +32773|1511|52|7|49|69212.99|0.08|0.06|N|O|1998-06-21|1998-07-25|1998-07-05|NONE|REG AIR|inder slyly after the blith +32774|401|60|1|7|9109.80|0.06|0.00|A|F|1993-09-28|1993-09-03|1993-10-01|NONE|MAIL|posits are furi +32774|925|28|2|25|45648.00|0.04|0.07|R|F|1993-06-20|1993-08-01|1993-06-28|COLLECT COD|TRUCK| ideas. special dolphin +32775|931|32|1|15|27478.95|0.09|0.04|N|O|1997-01-20|1997-02-13|1997-02-04|NONE|FOB|xes. carefully re +32775|63|14|2|2|1926.12|0.08|0.01|N|O|1997-03-03|1997-02-04|1997-04-02|TAKE BACK RETURN|REG AIR|during the quickly even requests. regul +32775|221|22|3|41|45970.02|0.04|0.06|N|O|1997-03-02|1997-03-25|1997-03-10|DELIVER IN PERSON|AIR|es wake brave +32775|283|84|4|5|5916.40|0.10|0.04|N|O|1997-03-09|1997-03-18|1997-04-01|COLLECT COD|AIR|ial requests +32775|375|32|5|50|63768.50|0.10|0.04|N|O|1997-03-19|1997-03-04|1997-03-23|TAKE BACK RETURN|MAIL|sly bold accounts +32800|1809|10|1|17|29083.60|0.01|0.06|R|F|1994-03-14|1994-04-19|1994-04-04|NONE|AIR|ng the ironic courts. platele +32800|1954|55|2|6|11135.70|0.06|0.06|A|F|1994-02-23|1994-04-17|1994-02-24|TAKE BACK RETURN|REG AIR|onic, unusual requests +32800|1032|3|3|13|12129.39|0.00|0.05|A|F|1994-02-04|1994-04-16|1994-02-08|NONE|REG AIR|hely along th +32800|1997|86|4|44|83555.56|0.03|0.03|R|F|1994-02-26|1994-04-04|1994-03-23|TAKE BACK RETURN|RAIL|cies. slyl +32800|1466|84|5|9|12307.14|0.05|0.02|A|F|1994-02-12|1994-03-20|1994-02-27|TAKE BACK RETURN|FOB|to beans. foxes sleep slyly. slyly +32800|652|46|6|25|38816.25|0.10|0.00|R|F|1994-01-26|1994-04-07|1994-02-19|TAKE BACK RETURN|AIR| ideas affix +32801|1931|76|1|39|71484.27|0.01|0.00|N|O|1997-07-22|1997-06-10|1997-07-23|TAKE BACK RETURN|SHIP|he final, da +32801|142|21|2|26|27095.64|0.07|0.01|N|O|1997-05-12|1997-06-03|1997-05-24|NONE|REG AIR|e carefully furiou +32801|1231|32|3|12|13586.76|0.00|0.01|N|O|1997-06-02|1997-06-02|1997-06-13|COLLECT COD|SHIP|ual asymptotes nag carefu +32801|703|36|4|12|19244.40|0.00|0.06|N|O|1997-06-15|1997-07-24|1997-07-13|DELIVER IN PERSON|TRUCK|refully unusual requests boost qu +32801|1481|99|5|12|16589.76|0.02|0.06|N|O|1997-06-28|1997-07-20|1997-07-25|NONE|AIR|posits are fu +32802|648|49|1|38|58848.32|0.00|0.07|N|O|1998-08-01|1998-06-03|1998-08-16|NONE|REG AIR|ly across the sp +32802|1800|43|2|20|34036.00|0.01|0.06|N|O|1998-08-07|1998-07-07|1998-08-17|NONE|RAIL| use beside the furiously special accoun +32803|820|21|1|49|84320.18|0.00|0.04|N|O|1996-02-06|1996-02-29|1996-02-16|DELIVER IN PERSON|RAIL|quests. slyly bold brai +32803|1300|75|2|13|15616.90|0.00|0.00|N|O|1996-03-05|1996-03-15|1996-03-26|NONE|TRUCK|ly regular dugouts along the permanentl +32804|594|95|1|11|16440.49|0.03|0.08|A|F|1992-10-01|1992-12-06|1992-10-18|DELIVER IN PERSON|AIR|cial requests grow slyly behind th +32804|517|8|2|22|31185.22|0.09|0.00|R|F|1992-11-16|1992-10-18|1992-12-11|NONE|TRUCK| affix quickly across the +32804|158|85|3|6|6348.90|0.05|0.05|R|F|1992-09-20|1992-11-10|1992-10-20|COLLECT COD|FOB|ges sleep across the spec +32804|1488|6|4|40|55579.20|0.03|0.01|A|F|1992-10-18|1992-10-20|1992-11-11|DELIVER IN PERSON|RAIL|structions. furiously bold asympt +32804|792|57|5|19|32163.01|0.03|0.01|R|F|1992-12-07|1992-11-14|1993-01-06|COLLECT COD|TRUCK| furiously express ideas +32805|1234|46|1|19|21569.37|0.07|0.01|A|F|1992-06-21|1992-07-04|1992-07-07|NONE|FOB|pitaphs about the +32805|952|21|2|26|48176.70|0.00|0.04|R|F|1992-08-07|1992-07-28|1992-09-01|DELIVER IN PERSON|FOB|the final foxes wake carefully +32805|341|70|3|20|24826.80|0.10|0.08|A|F|1992-08-08|1992-07-14|1992-08-30|DELIVER IN PERSON|FOB|ly ironic theodolites. fi +32805|50|51|4|5|4750.25|0.05|0.07|R|F|1992-07-19|1992-07-29|1992-08-13|DELIVER IN PERSON|MAIL|. slyly regular pinto beans sleep un +32805|539|70|5|3|4318.59|0.00|0.03|R|F|1992-07-28|1992-07-08|1992-08-22|DELIVER IN PERSON|FOB|press requests nag fluffily caref +32806|1317|56|1|1|1218.31|0.08|0.04|N|O|1995-07-07|1995-08-26|1995-08-03|NONE|REG AIR|refully special the +32806|1232|70|2|41|46462.43|0.08|0.07|N|O|1995-10-06|1995-08-18|1995-10-29|COLLECT COD|RAIL| the unusual +32806|1556|57|3|49|71419.95|0.00|0.04|N|O|1995-08-09|1995-09-18|1995-09-08|COLLECT COD|RAIL|accounts. deposits sleep caref +32806|1664|65|4|6|9393.96|0.03|0.01|N|O|1995-08-14|1995-09-18|1995-08-20|NONE|SHIP|al, bold dependencies ab +32806|9|10|5|22|19998.00|0.03|0.06|N|O|1995-10-01|1995-08-03|1995-10-12|TAKE BACK RETURN|RAIL|hely unusual dolphins. pinto +32806|1685|68|6|23|36493.64|0.01|0.01|N|O|1995-09-11|1995-07-25|1995-09-20|COLLECT COD|TRUCK| pinto beans haggle fluffi +32807|1690|73|1|35|55709.15|0.09|0.00|A|F|1994-05-15|1994-03-19|1994-05-30|DELIVER IN PERSON|REG AIR|s integrate +32807|1393|32|2|37|47892.43|0.08|0.07|R|F|1994-04-29|1994-03-16|1994-05-15|TAKE BACK RETURN|FOB|ly ironic foxes across the ironic sentim +32807|120|47|3|18|18362.16|0.01|0.04|R|F|1994-02-04|1994-04-15|1994-02-23|DELIVER IN PERSON|AIR|ages at the regular, spec +32807|701|2|4|11|17618.70|0.10|0.03|R|F|1994-04-19|1994-04-12|1994-04-25|COLLECT COD|RAIL|ng to the unusual platele +32807|508|69|5|33|46480.50|0.02|0.00|R|F|1994-04-16|1994-04-21|1994-05-12|NONE|FOB|le quickly. pending instructions wa +32832|1744|87|1|45|74058.30|0.01|0.06|N|O|1998-04-16|1998-03-22|1998-05-06|TAKE BACK RETURN|TRUCK| final sentiments? blithely regular requ +32832|1870|14|2|18|31893.66|0.10|0.07|N|O|1998-02-01|1998-02-07|1998-02-08|COLLECT COD|FOB|enticing theodolites. care +32832|1264|39|3|46|53601.96|0.09|0.07|N|O|1998-03-24|1998-03-04|1998-03-31|NONE|MAIL|ss the slyly even depths hang +32832|250|32|4|18|20704.50|0.05|0.08|N|O|1998-02-28|1998-02-06|1998-03-03|DELIVER IN PERSON|MAIL|o the regular, regular excuses +32832|47|98|5|41|38828.64|0.06|0.05|N|O|1998-01-06|1998-02-09|1998-02-02|NONE|FOB|packages haggle fluffily against +32833|787|20|1|38|64135.64|0.10|0.03|N|O|1997-10-31|1997-11-05|1997-11-20|TAKE BACK RETURN|RAIL| maintain furiously +32833|1048|54|2|18|17082.72|0.09|0.03|N|O|1997-11-07|1997-11-06|1997-12-03|TAKE BACK RETURN|RAIL|he blithely +32833|1423|41|3|17|22515.14|0.10|0.00|N|O|1997-09-23|1997-10-04|1997-09-29|NONE|AIR|ounts believe slyly. even reques +32833|835|35|4|18|31244.94|0.03|0.03|N|O|1997-10-26|1997-11-03|1997-11-25|TAKE BACK RETURN|FOB|al warthogs. blithely ironic requests h +32833|1869|13|5|2|3541.72|0.09|0.06|N|O|1997-11-15|1997-10-11|1997-11-22|DELIVER IN PERSON|REG AIR|es. furiously unusual deposits +32833|1565|6|6|2|2933.12|0.09|0.06|N|O|1997-09-12|1997-09-29|1997-09-26|DELIVER IN PERSON|RAIL|theodolites are carefully. care +32833|642|5|7|12|18511.68|0.03|0.02|N|O|1997-08-30|1997-10-30|1997-09-10|DELIVER IN PERSON|REG AIR|, ironic instruc +32834|1721|22|1|35|56795.20|0.04|0.03|A|F|1993-10-20|1993-10-22|1993-11-02|NONE|SHIP|ages. blithely express deposits cajole ac +32835|277|32|1|15|17659.05|0.04|0.03|A|F|1992-08-21|1992-08-20|1992-08-24|DELIVER IN PERSON|REG AIR|theodolites are! fu +32835|964|33|2|7|13054.72|0.04|0.05|A|F|1992-09-02|1992-09-20|1992-09-28|COLLECT COD|MAIL|efully accounts. furiously quiet +32835|199|52|3|33|36273.27|0.09|0.05|A|F|1992-09-10|1992-08-13|1992-10-09|DELIVER IN PERSON|FOB|ts sleep quickly regular requ +32835|1484|85|4|39|54033.72|0.00|0.04|R|F|1992-08-09|1992-08-31|1992-09-05|DELIVER IN PERSON|FOB|ously across the si +32835|893|27|5|50|89694.50|0.09|0.00|R|F|1992-08-19|1992-10-06|1992-09-16|NONE|TRUCK|e blithely ironic dependencies affix e +32836|398|83|1|47|61024.33|0.07|0.03|N|O|1996-08-18|1996-11-03|1996-08-29|TAKE BACK RETURN|REG AIR|regular instructions mus +32836|711|76|2|44|70915.24|0.04|0.06|N|O|1996-12-03|1996-10-04|1996-12-14|DELIVER IN PERSON|RAIL|he ironic deposits-- regular acco +32837|1072|8|1|50|48653.50|0.04|0.07|R|F|1994-06-30|1994-07-17|1994-07-30|TAKE BACK RETURN|REG AIR|e regular, express asymptotes haggle carefu +32838|1817|4|1|14|24063.34|0.09|0.06|N|O|1995-07-22|1995-07-20|1995-08-05|TAKE BACK RETURN|TRUCK|ely regular deposits. fur +32838|779|12|2|20|33595.40|0.04|0.00|R|F|1995-05-24|1995-07-27|1995-05-29|DELIVER IN PERSON|SHIP| blithely around the sly +32838|404|5|3|11|14348.40|0.10|0.05|N|O|1995-06-29|1995-07-17|1995-07-02|NONE|RAIL|ve the instructions sleep +32839|782|47|1|46|77407.88|0.01|0.06|N|O|1997-03-12|1997-01-24|1997-04-01|DELIVER IN PERSON|REG AIR|g excuses detect carefully spec +32839|1758|1|2|39|64730.25|0.08|0.06|N|O|1997-01-09|1997-02-23|1997-01-29|COLLECT COD|TRUCK|. slyly special foxes wake. qu +32839|1546|27|3|13|18818.02|0.10|0.05|N|O|1997-02-02|1997-02-12|1997-02-11|DELIVER IN PERSON|FOB|lites boost. carefully even d +32839|266|67|4|22|25657.72|0.06|0.00|N|O|1996-12-13|1997-02-28|1996-12-29|DELIVER IN PERSON|REG AIR|e furiously after the packa +32839|1634|17|5|45|69103.35|0.07|0.07|N|O|1997-03-09|1997-01-10|1997-03-11|NONE|RAIL|e the slyly even instructions. quic +32839|1420|60|6|3|3964.26|0.07|0.04|N|O|1997-01-24|1997-02-05|1997-02-20|COLLECT COD|REG AIR|counts boost blit +32839|1600|41|7|25|37540.00|0.09|0.01|N|O|1997-02-12|1997-02-09|1997-03-14|NONE|MAIL|gular theodolites. care +32864|1843|30|1|38|66303.92|0.05|0.07|N|O|1997-10-24|1997-12-21|1997-11-13|TAKE BACK RETURN|RAIL|ven dependencies haggle a +32864|532|63|2|16|22920.48|0.10|0.07|N|O|1997-12-04|1997-12-30|1997-12-09|DELIVER IN PERSON|TRUCK|orses are. furiously pending theodol +32864|1211|12|3|46|51161.66|0.06|0.02|N|O|1998-01-20|1997-12-09|1998-02-02|NONE|REG AIR|ut the carefully unusual platelets. unus +32864|1344|83|4|37|46077.58|0.02|0.06|N|O|1997-12-06|1997-11-16|1998-01-03|NONE|FOB|otes integ +32865|1022|58|1|7|6461.14|0.05|0.01|A|F|1994-09-27|1994-11-09|1994-09-29|TAKE BACK RETURN|MAIL|lets. forges after the care +32865|1827|57|2|9|15559.38|0.08|0.06|A|F|1994-09-10|1994-11-09|1994-09-28|DELIVER IN PERSON|MAIL|slyly silent acco +32865|27|28|3|15|13905.30|0.00|0.04|R|F|1994-11-08|1994-10-14|1994-11-22|DELIVER IN PERSON|MAIL|ecial foxes boost. requests kindle. +32866|95|21|1|34|33833.06|0.03|0.08|N|O|1998-03-26|1998-04-07|1998-04-04|DELIVER IN PERSON|REG AIR|lyly express requests. even +32866|782|15|2|20|33655.60|0.04|0.04|N|O|1998-04-29|1998-04-20|1998-05-07|DELIVER IN PERSON|FOB|etect blithely blithely bold accounts +32867|83|59|1|12|11796.96|0.08|0.04|N|O|1998-02-10|1998-02-18|1998-03-06|TAKE BACK RETURN|AIR|accounts. ironic accounts i +32868|1377|54|1|42|53691.54|0.10|0.06|R|F|1994-03-09|1994-03-17|1994-04-07|NONE|MAIL|ns doze quickly. dinos integrate carefull +32869|1924|25|1|10|18259.20|0.02|0.04|R|F|1994-07-23|1994-05-12|1994-08-02|DELIVER IN PERSON|AIR|hily special pa +32869|1696|97|2|21|33551.49|0.02|0.07|A|F|1994-07-23|1994-06-18|1994-08-17|DELIVER IN PERSON|AIR|the regular accounts. qui +32869|1394|71|3|30|38861.70|0.05|0.07|R|F|1994-07-05|1994-06-25|1994-07-20|COLLECT COD|RAIL|ites nod closely. slyly special +32869|173|26|4|12|12878.04|0.04|0.02|A|F|1994-04-08|1994-06-02|1994-04-17|DELIVER IN PERSON|REG AIR|refully regular +32869|872|73|5|47|83324.89|0.01|0.00|A|F|1994-04-09|1994-05-06|1994-04-13|DELIVER IN PERSON|TRUCK|e of the regula +32869|1222|34|6|27|30326.94|0.03|0.00|A|F|1994-07-25|1994-05-11|1994-07-29|DELIVER IN PERSON|TRUCK|d, ironic packages above the even dep +32870|621|53|1|49|74559.38|0.07|0.00|N|O|1997-03-04|1997-04-14|1997-03-16|COLLECT COD|FOB|platelets are slyly silent, even foxes. ir +32870|1043|79|2|13|12272.52|0.02|0.01|N|O|1997-03-25|1997-04-01|1997-04-17|COLLECT COD|RAIL|. carefully even accoun +32870|1750|93|3|26|42945.50|0.04|0.06|N|O|1997-03-09|1997-05-22|1997-03-20|DELIVER IN PERSON|MAIL|al requests play quickly fluffily ev +32870|1669|52|4|10|15706.60|0.09|0.00|N|O|1997-04-24|1997-04-08|1997-04-27|TAKE BACK RETURN|SHIP|equests. even dependencies b +32870|748|13|5|20|32974.80|0.07|0.06|N|O|1997-04-08|1997-05-22|1997-04-18|COLLECT COD|AIR|uick asymptotes dazzle after the car +32871|184|85|1|34|36862.12|0.01|0.01|R|F|1992-11-11|1992-12-03|1992-11-13|DELIVER IN PERSON|FOB|slyly ironic foxes. unusua +32871|421|51|2|9|11892.78|0.07|0.07|R|F|1992-11-03|1992-12-24|1992-11-13|TAKE BACK RETURN|SHIP|. packages wake fu +32871|1300|12|3|20|24026.00|0.07|0.03|R|F|1992-12-15|1993-01-14|1993-01-12|COLLECT COD|AIR|requests. carefully even packages thras +32871|1283|84|4|40|47371.20|0.05|0.06|A|F|1992-10-28|1992-12-16|1992-11-12|COLLECT COD|SHIP|es. carefully +32871|1036|7|5|12|11244.36|0.01|0.05|A|F|1993-01-23|1993-01-05|1993-02-14|TAKE BACK RETURN|FOB|egular packages haggle blit +32896|1859|89|1|38|66912.30|0.00|0.03|N|O|1997-04-15|1997-06-03|1997-05-14|COLLECT COD|RAIL|ites. slyly sl +32896|1976|77|2|23|43193.31|0.01|0.05|N|O|1997-04-18|1997-06-21|1997-04-26|DELIVER IN PERSON|AIR|gular, pending accounts nag ca +32896|634|97|3|39|59850.57|0.09|0.04|N|O|1997-04-12|1997-06-17|1997-04-22|COLLECT COD|REG AIR|ctions haggle carefully quickly f +32896|631|25|4|17|26037.71|0.03|0.07|N|O|1997-05-08|1997-05-09|1997-06-01|NONE|TRUCK|the even, p +32896|1938|39|5|13|23919.09|0.03|0.07|N|O|1997-04-26|1997-05-26|1997-05-18|DELIVER IN PERSON|FOB|t the ideas. dogged, ironic packages ab +32897|886|86|1|29|51819.52|0.08|0.02|N|O|1996-03-12|1996-03-13|1996-03-29|COLLECT COD|RAIL|are according to the quickly thin d +32897|950|53|2|36|66634.20|0.03|0.05|N|O|1996-02-19|1996-03-22|1996-03-01|TAKE BACK RETURN|MAIL|final packag +32897|210|38|3|19|21093.99|0.10|0.06|N|O|1996-04-03|1996-03-17|1996-04-15|TAKE BACK RETURN|TRUCK|ce of the blithely final dep +32897|888|22|4|23|41144.24|0.08|0.00|N|O|1996-02-14|1996-04-06|1996-03-07|DELIVER IN PERSON|FOB|y quickly even dependencies. regular p +32897|280|35|5|43|50752.04|0.05|0.04|N|O|1996-04-06|1996-03-04|1996-04-26|DELIVER IN PERSON|TRUCK| ironic asymptotes haggle blith +32898|856|90|1|49|86085.65|0.02|0.04|R|F|1994-09-24|1994-09-25|1994-10-10|COLLECT COD|AIR|nts. caref +32898|158|85|2|22|23279.30|0.00|0.01|R|F|1994-09-22|1994-11-02|1994-10-12|DELIVER IN PERSON|SHIP|g to the reg +32899|1511|92|1|32|45200.32|0.04|0.07|R|F|1994-07-29|1994-06-16|1994-08-23|COLLECT COD|MAIL|platelets cajole slyly among the quickly f +32899|1468|86|2|34|46561.64|0.06|0.06|R|F|1994-05-02|1994-06-04|1994-05-19|COLLECT COD|SHIP|s. fluffily stealthy packages boost car +32900|139|18|1|20|20782.60|0.08|0.06|N|O|1997-06-30|1997-08-25|1997-07-04|NONE|MAIL| accounts. i +32900|1119|56|2|9|9180.99|0.10|0.08|N|O|1997-08-22|1997-08-04|1997-08-24|TAKE BACK RETURN|RAIL|endencies. carefully unusual re +32901|367|68|1|47|59565.92|0.00|0.04|R|F|1995-04-28|1995-02-14|1995-05-24|DELIVER IN PERSON|AIR|ooze slyly. even package +32901|38|39|2|22|20636.66|0.02|0.01|R|F|1995-05-02|1995-03-22|1995-05-12|TAKE BACK RETURN|SHIP|g the carefully regular d +32901|166|19|3|43|45844.88|0.08|0.02|R|F|1995-03-14|1995-03-07|1995-03-27|COLLECT COD|MAIL| to sleep slyly along +32901|764|65|4|3|4994.28|0.10|0.01|A|F|1995-02-06|1995-04-01|1995-03-07|TAKE BACK RETURN|MAIL|cajole about t +32901|496|97|5|37|51670.13|0.07|0.02|A|F|1995-02-18|1995-04-04|1995-02-22|NONE|AIR|lar packages boost quickly blithely even +32901|455|43|6|44|59639.80|0.03|0.07|R|F|1995-01-24|1995-04-01|1995-02-06|TAKE BACK RETURN|MAIL| blithely around +32901|126|53|7|40|41044.80|0.06|0.05|A|F|1995-01-29|1995-02-11|1995-02-08|NONE|FOB|less packages. furiously regular ex +32902|1368|7|1|23|29195.28|0.06|0.00|R|F|1992-05-29|1992-04-21|1992-06-01|COLLECT COD|AIR|ily against the regular +32902|1612|95|2|44|66598.84|0.01|0.07|R|F|1992-07-02|1992-05-18|1992-07-24|DELIVER IN PERSON|SHIP|its haggle among the pendi +32902|1550|31|3|12|17418.60|0.04|0.02|A|F|1992-04-28|1992-04-15|1992-05-12|COLLECT COD|RAIL| quickly. pending +32902|88|89|4|38|37547.04|0.02|0.03|R|F|1992-06-01|1992-04-08|1992-06-04|NONE|MAIL|gle. carefully pending instruction +32902|1148|85|5|21|22031.94|0.03|0.02|R|F|1992-03-28|1992-04-03|1992-04-20|DELIVER IN PERSON|RAIL|lar instructions use quickly a +32903|201|83|1|36|39643.20|0.05|0.05|R|F|1992-11-12|1992-09-22|1992-12-03|DELIVER IN PERSON|MAIL|ggle furiously. careful re +32903|181|82|2|48|51896.64|0.10|0.04|R|F|1992-08-02|1992-09-12|1992-09-01|NONE|MAIL|nal deposits. furiously special foxes b +32903|1100|71|3|22|22024.20|0.05|0.07|R|F|1992-11-03|1992-09-26|1992-11-29|NONE|RAIL|, express deposits integrate furiousl +32903|777|10|4|39|65433.03|0.05|0.08|R|F|1992-10-04|1992-09-15|1992-10-22|COLLECT COD|FOB| ironic requests affi +32903|1831|18|5|30|51984.90|0.01|0.01|R|F|1992-08-22|1992-10-03|1992-08-30|COLLECT COD|REG AIR|fully final accounts. furiously bold +32903|1488|67|6|10|13894.80|0.03|0.01|R|F|1992-11-21|1992-10-08|1992-12-05|NONE|TRUCK|alongside of the instructions. +32928|864|98|1|36|63534.96|0.02|0.03|N|O|1995-08-03|1995-06-21|1995-08-18|TAKE BACK RETURN|RAIL|s throughout the accounts are about the car +32928|552|83|2|43|62459.65|0.08|0.00|N|O|1995-07-28|1995-06-30|1995-08-04|DELIVER IN PERSON|MAIL|e slyly special ideas. even, even +32928|905|40|3|30|54177.00|0.07|0.08|N|O|1995-07-15|1995-07-16|1995-07-27|DELIVER IN PERSON|SHIP| accounts. regular foxes are again +32928|796|61|4|35|59387.65|0.04|0.06|N|F|1995-05-27|1995-07-26|1995-06-19|TAKE BACK RETURN|RAIL|uickly after the final packages +32928|742|7|5|46|75566.04|0.10|0.02|N|F|1995-06-11|1995-08-02|1995-06-24|COLLECT COD|REG AIR|uthless accounts. carefull +32929|1749|76|1|47|77584.78|0.10|0.05|N|O|1995-07-28|1995-06-28|1995-08-16|COLLECT COD|AIR|ly thin requests. ideas nag car +32929|1037|8|2|22|20636.66|0.05|0.02|N|O|1995-07-30|1995-07-06|1995-08-15|DELIVER IN PERSON|SHIP|ve the carefully regular accoun +32929|556|87|3|20|29131.00|0.01|0.06|N|O|1995-08-04|1995-07-01|1995-08-29|COLLECT COD|RAIL|e quickly silent instruction +32929|1568|9|4|15|22043.40|0.06|0.08|N|O|1995-07-08|1995-06-23|1995-07-19|NONE|FOB|onic reque +32929|493|94|5|39|54346.11|0.10|0.07|R|F|1995-05-13|1995-07-07|1995-05-28|TAKE BACK RETURN|RAIL|egular deposits c +32929|39|90|6|40|37561.20|0.08|0.08|N|O|1995-07-10|1995-06-26|1995-07-22|COLLECT COD|MAIL|thely unusu +32930|1734|35|1|14|22900.22|0.03|0.06|N|O|1996-06-26|1996-05-31|1996-07-09|DELIVER IN PERSON|TRUCK|ts-- special package +32930|1977|22|2|6|11273.82|0.01|0.08|N|O|1996-05-08|1996-06-06|1996-05-24|TAKE BACK RETURN|AIR|rate ironic platelets? final dep +32930|1039|45|3|46|43241.38|0.00|0.02|N|O|1996-05-03|1996-07-20|1996-06-01|TAKE BACK RETURN|MAIL|ld ideas across the final deposits +32930|358|15|4|14|17616.90|0.07|0.01|N|O|1996-07-08|1996-07-06|1996-08-03|NONE|AIR|iments nag against the ironically special +32930|1142|15|5|3|3129.42|0.03|0.02|N|O|1996-08-16|1996-07-08|1996-08-19|NONE|RAIL|ong the regular, regular +32931|857|91|1|25|43946.25|0.00|0.08|A|F|1993-05-24|1993-05-17|1993-06-04|NONE|REG AIR|y even platelets use according to th +32931|230|31|2|17|19213.91|0.00|0.08|R|F|1993-06-08|1993-04-18|1993-07-06|DELIVER IN PERSON|FOB| unusual ideas impress care +32931|966|69|3|11|20536.56|0.00|0.08|R|F|1993-05-08|1993-04-21|1993-05-09|NONE|TRUCK|s sleep fluffily according to th +32931|498|99|4|32|44751.68|0.01|0.07|A|F|1993-03-16|1993-05-06|1993-03-30|NONE|TRUCK|regular, special foxes sleep accoun +32931|1365|66|5|11|13929.96|0.00|0.08|R|F|1993-05-05|1993-04-17|1993-05-09|COLLECT COD|REG AIR|posits. furious, final requests +32931|1835|22|6|4|6947.32|0.09|0.06|R|F|1993-03-02|1993-03-22|1993-03-22|TAKE BACK RETURN|TRUCK|ly quick requests use at the +32931|628|60|7|5|7643.10|0.03|0.05|A|F|1993-03-29|1993-04-27|1993-04-26|COLLECT COD|FOB|eas. carefully ironic plat +32932|699|62|1|29|46391.01|0.05|0.06|A|F|1993-03-12|1993-02-24|1993-03-24|TAKE BACK RETURN|AIR|uests nag b +32932|67|68|2|47|45451.82|0.09|0.00|A|F|1993-01-29|1993-04-07|1993-02-27|NONE|SHIP|ckly express deposits. furiously bold +32932|1440|41|3|13|17438.72|0.03|0.01|R|F|1993-02-01|1993-03-20|1993-02-27|DELIVER IN PERSON|RAIL|luffily fluffy packages detect fur +32932|3|54|4|11|9933.00|0.07|0.04|A|F|1993-04-30|1993-03-26|1993-05-12|TAKE BACK RETURN|MAIL|ly: blithely bold pinto beans +32932|534|65|5|19|27256.07|0.04|0.02|R|F|1993-03-07|1993-02-24|1993-03-13|DELIVER IN PERSON|SHIP|ts are slyly-- carefully +32933|189|42|1|19|20694.42|0.05|0.08|N|O|1996-09-19|1996-09-04|1996-10-01|COLLECT COD|TRUCK|quests. furiously e +32934|1907|40|1|45|81400.50|0.00|0.08|N|O|1998-03-18|1998-04-11|1998-03-24|COLLECT COD|FOB|re blithely sl +32935|1785|86|1|23|38795.94|0.04|0.02|A|F|1994-04-04|1994-02-17|1994-04-05|DELIVER IN PERSON|TRUCK|re furiously across the unusual de +32935|555|16|2|42|61133.10|0.08|0.03|R|F|1994-05-16|1994-04-03|1994-05-23|COLLECT COD|TRUCK|es. blithely regular +32960|635|29|1|43|66032.09|0.00|0.03|A|F|1994-06-06|1994-03-27|1994-07-04|DELIVER IN PERSON|FOB|riously. pending instru +32960|1616|17|2|38|57669.18|0.07|0.07|R|F|1994-05-09|1994-04-10|1994-05-17|COLLECT COD|SHIP|ecial foxes. packag +32960|1563|4|3|46|67369.76|0.03|0.07|A|F|1994-04-15|1994-04-01|1994-05-05|TAKE BACK RETURN|SHIP| furiously ironic th +32961|1119|92|1|20|20402.20|0.07|0.03|R|F|1993-07-04|1993-05-13|1993-07-09|NONE|SHIP|pendencies. regular theodolites use. inst +32961|88|89|2|47|46439.76|0.04|0.04|A|F|1993-03-19|1993-06-15|1993-04-05|DELIVER IN PERSON|RAIL|uriously even dugouts among the deposits +32961|319|76|3|8|9754.48|0.02|0.07|A|F|1993-07-07|1993-04-23|1993-07-09|COLLECT COD|FOB|refully-- busily pending deposi +32962|1002|38|1|27|24381.00|0.09|0.03|N|O|1995-06-27|1995-06-23|1995-07-02|TAKE BACK RETURN|FOB|ly regular ideas over the carefu +32962|965|34|2|10|18659.60|0.00|0.01|N|O|1995-06-24|1995-07-02|1995-07-06|NONE|FOB| accounts cajole unusual, final theodol +32963|98|49|1|12|11977.08|0.03|0.01|N|O|1997-07-20|1997-06-06|1997-08-15|TAKE BACK RETURN|SHIP|y ironic deposits u +32963|296|78|2|1|1196.29|0.04|0.04|N|O|1997-04-14|1997-06-08|1997-05-12|NONE|AIR| busily express pinto beans print +32963|1123|32|3|24|24578.88|0.02|0.08|N|O|1997-06-01|1997-06-03|1997-06-15|TAKE BACK RETURN|REG AIR| alongside +32963|366|23|4|14|17729.04|0.02|0.01|N|O|1997-05-16|1997-05-12|1997-06-07|COLLECT COD|RAIL|age furiously. +32964|1423|63|1|34|45030.28|0.04|0.08|N|O|1996-11-29|1996-09-25|1996-12-11|COLLECT COD|SHIP|es: blithe +32964|1939|28|2|17|31295.81|0.04|0.03|N|O|1996-09-08|1996-10-18|1996-09-25|COLLECT COD|SHIP| the furiously +32965|462|63|1|47|64035.62|0.03|0.04|A|F|1995-03-22|1995-04-01|1995-03-30|COLLECT COD|AIR|thely ironic pinto beans above +32965|1491|92|2|32|44559.68|0.05|0.03|A|F|1995-05-02|1995-04-29|1995-05-04|COLLECT COD|MAIL|hes. blithely +32965|1002|8|3|48|43344.00|0.09|0.01|N|F|1995-05-28|1995-04-14|1995-06-23|TAKE BACK RETURN|FOB|. furiously bo +32965|1313|90|4|8|9714.48|0.01|0.01|N|F|1995-06-09|1995-04-19|1995-06-18|DELIVER IN PERSON|MAIL|ial theodol +32965|1711|96|5|20|32254.20|0.09|0.01|R|F|1995-03-22|1995-03-29|1995-03-31|COLLECT COD|RAIL|nic asymptotes are across the +32965|1121|58|6|23|23508.76|0.04|0.02|N|F|1995-05-28|1995-04-12|1995-06-23|COLLECT COD|TRUCK|ole against the care +32965|484|72|7|43|59532.64|0.02|0.07|N|O|1995-06-21|1995-04-06|1995-07-08|DELIVER IN PERSON|FOB|ly above the even, +32966|670|33|1|17|26701.39|0.01|0.00|A|F|1992-05-25|1992-04-14|1992-06-04|TAKE BACK RETURN|AIR|counts. carefully express +32966|1455|56|2|50|67822.50|0.10|0.01|A|F|1992-05-01|1992-03-20|1992-05-27|DELIVER IN PERSON|MAIL|ious accounts hinder. +32966|888|22|3|42|75132.96|0.05|0.03|R|F|1992-04-17|1992-04-13|1992-04-26|TAKE BACK RETURN|TRUCK| fluffily bold +32966|1370|85|4|46|58483.02|0.03|0.08|A|F|1992-04-07|1992-04-12|1992-04-25|COLLECT COD|AIR|hely bold accounts? quickly fi +32966|14|65|5|42|38388.42|0.04|0.02|A|F|1992-02-20|1992-03-18|1992-02-23|COLLECT COD|AIR|ringly express reque +32967|634|28|1|37|56781.31|0.08|0.01|N|O|1998-04-16|1998-05-17|1998-05-13|NONE|AIR|o beans cajole bold ideas. reques +32967|590|81|2|29|43227.11|0.05|0.04|N|O|1998-03-24|1998-05-26|1998-04-12|TAKE BACK RETURN|SHIP|uriously quick +32967|1336|13|3|5|6186.65|0.03|0.07|N|O|1998-07-15|1998-05-03|1998-07-30|NONE|AIR|es nag carefully special accounts. pendi +32967|1588|69|4|34|50645.72|0.09|0.02|N|O|1998-06-13|1998-04-24|1998-06-26|TAKE BACK RETURN|FOB|ic, express fox +32967|574|35|5|46|67830.22|0.03|0.05|N|O|1998-05-11|1998-05-10|1998-05-15|COLLECT COD|SHIP|ests alongside of the even packages sleep +32992|169|48|1|34|36351.44|0.06|0.02|N|O|1996-09-23|1996-08-28|1996-10-14|NONE|MAIL|g, quiet instructions. regular ideas d +32992|1198|99|2|12|13190.28|0.09|0.01|N|O|1996-08-04|1996-07-19|1996-09-01|DELIVER IN PERSON|RAIL|ly after t +32992|1280|81|3|30|35438.40|0.03|0.07|N|O|1996-07-31|1996-07-25|1996-08-09|NONE|REG AIR|ts cajole slyly along the packag +32992|1710|11|4|26|41904.46|0.02|0.04|N|O|1996-09-29|1996-07-19|1996-10-17|NONE|MAIL|riously across the b +32992|375|60|5|42|53565.54|0.05|0.03|N|O|1996-06-19|1996-08-10|1996-07-01|COLLECT COD|FOB|iously after the fluffily sp +32992|559|90|6|33|48165.15|0.07|0.05|N|O|1996-06-14|1996-08-16|1996-06-24|DELIVER IN PERSON|TRUCK| quickly pending instructions wa +32992|496|26|7|21|29326.29|0.08|0.06|N|O|1996-08-30|1996-08-25|1996-09-16|TAKE BACK RETURN|SHIP|cial orbits. unusual ideas +32993|919|20|1|5|9099.55|0.09|0.03|R|F|1992-06-29|1992-06-20|1992-07-25|TAKE BACK RETURN|FOB|ely final reque +32993|1924|69|2|42|76688.64|0.00|0.05|A|F|1992-05-12|1992-06-12|1992-05-13|TAKE BACK RETURN|REG AIR| pinto bea +32993|1579|80|3|3|4441.71|0.00|0.02|R|F|1992-07-09|1992-05-23|1992-07-26|TAKE BACK RETURN|AIR|ress package +32993|410|98|4|23|30139.43|0.01|0.01|R|F|1992-07-07|1992-06-27|1992-07-22|NONE|MAIL|inal instructions +32994|1217|92|1|23|25718.83|0.10|0.04|R|F|1992-09-25|1992-12-11|1992-10-03|TAKE BACK RETURN|SHIP|to beans boost furiously. bold depende +32994|876|76|2|20|35537.40|0.07|0.00|R|F|1992-11-08|1992-11-12|1992-12-03|TAKE BACK RETURN|RAIL|tes are fluffily abo +32994|1676|18|3|19|29975.73|0.01|0.03|R|F|1992-12-07|1992-11-17|1992-12-13|COLLECT COD|SHIP| along the furiously unusua +32994|1206|81|4|29|32108.80|0.07|0.08|R|F|1992-12-22|1992-10-31|1993-01-01|DELIVER IN PERSON|AIR|re daringly special, even orbits +32995|1314|15|1|36|43751.16|0.00|0.08|N|O|1998-05-08|1998-03-30|1998-05-09|DELIVER IN PERSON|TRUCK|y regular depths. blithely regular T +32995|1357|72|2|35|44042.25|0.09|0.03|N|O|1998-04-28|1998-04-06|1998-05-02|COLLECT COD|REG AIR|express frays sleep final packages +32995|294|95|3|49|58520.21|0.08|0.04|N|O|1998-03-27|1998-04-24|1998-04-20|NONE|AIR| packages wake. furiously +32995|176|3|4|35|37665.95|0.01|0.07|N|O|1998-03-12|1998-04-17|1998-03-22|COLLECT COD|MAIL|ual packages are regularly against the +32995|554|85|5|36|52363.80|0.04|0.02|N|O|1998-04-06|1998-04-12|1998-04-29|COLLECT COD|FOB|the daring requests sleep carefully above +32995|1127|28|6|24|24674.88|0.04|0.01|N|O|1998-02-26|1998-04-02|1998-03-25|NONE|MAIL| depths. express packages print sly +32995|1708|93|7|9|14487.30|0.01|0.07|N|O|1998-05-03|1998-03-19|1998-05-24|DELIVER IN PERSON|TRUCK|according to the dependencies. p +32996|1858|2|1|13|22878.05|0.07|0.02|R|F|1994-01-06|1994-01-31|1994-01-22|COLLECT COD|REG AIR|s. regular packages +32996|1617|100|2|18|27334.98|0.10|0.04|R|F|1994-03-15|1994-01-31|1994-03-23|TAKE BACK RETURN|MAIL|thrash regular packages. slyly final +32996|32|83|3|25|23300.75|0.09|0.05|A|F|1994-02-15|1994-01-20|1994-02-26|TAKE BACK RETURN|MAIL|ithely. quickly ironic packages sleep +32996|425|26|4|28|37111.76|0.07|0.00|A|F|1994-03-08|1994-03-17|1994-03-21|TAKE BACK RETURN|REG AIR|side of the furious +32996|1956|1|5|17|31585.15|0.08|0.07|A|F|1994-03-07|1994-01-31|1994-03-28|COLLECT COD|AIR|e doggedly ironic packages. caref +32996|1693|76|6|4|6378.76|0.06|0.08|R|F|1994-01-06|1994-01-28|1994-01-27|NONE|RAIL|yly unusual accounts. pend +32996|8|34|7|28|25424.00|0.04|0.07|A|F|1994-03-28|1994-03-05|1994-04-15|COLLECT COD|TRUCK|packages. furiously pendin +32997|1268|80|1|26|30400.76|0.01|0.05|N|O|1997-12-14|1997-11-03|1998-01-08|COLLECT COD|MAIL|grate ironically blithely unusual deposits. +32998|1560|61|1|48|70154.88|0.07|0.02|A|F|1994-01-15|1993-12-01|1994-01-27|NONE|REG AIR|blithely again +32998|167|46|2|3|3201.48|0.02|0.00|R|F|1993-11-20|1993-12-21|1993-12-07|COLLECT COD|MAIL|nic dolphins cajole even, regular the +32998|21|72|3|13|11973.26|0.04|0.00|A|F|1993-10-06|1993-10-31|1993-10-30|TAKE BACK RETURN|FOB|aintain against the reg +32999|153|6|1|33|34753.95|0.02|0.08|A|F|1994-07-04|1994-06-15|1994-07-24|DELIVER IN PERSON|REG AIR| furiously slyly perman +32999|1078|14|2|45|44058.15|0.01|0.07|A|F|1994-04-28|1994-07-02|1994-05-20|NONE|FOB|ng deposits. carefully even foxes +32999|1829|59|3|34|58847.88|0.08|0.06|A|F|1994-07-13|1994-05-28|1994-07-30|TAKE BACK RETURN|FOB|odolites detect furiously close, bold pla +32999|431|90|4|4|5325.72|0.08|0.07|R|F|1994-05-29|1994-05-17|1994-05-30|TAKE BACK RETURN|MAIL|carefully final +32999|1288|63|5|15|17839.20|0.00|0.06|A|F|1994-07-13|1994-06-09|1994-08-06|DELIVER IN PERSON|RAIL|busy pinto beans haggle fluffily +33024|1322|61|1|50|61166.00|0.00|0.06|A|F|1992-09-04|1992-06-21|1992-09-29|DELIVER IN PERSON|REG AIR|ut the blithely slow foxes? regular acco +33024|526|87|2|21|29956.92|0.00|0.02|R|F|1992-07-27|1992-07-29|1992-07-31|NONE|AIR|the furiously regular waters wake furi +33024|1744|45|3|20|32914.80|0.01|0.00|A|F|1992-05-22|1992-07-24|1992-06-10|DELIVER IN PERSON|FOB|its. stealthy dolphins cajole cl +33024|1863|50|4|13|22943.18|0.08|0.08|R|F|1992-05-28|1992-06-17|1992-06-21|DELIVER IN PERSON|SHIP|nally bold excuses are blithely. per +33025|1879|9|1|11|19589.57|0.10|0.01|A|F|1994-05-24|1994-03-06|1994-06-20|TAKE BACK RETURN|FOB|s sleep furiously blithely pendi +33025|743|76|2|15|24656.10|0.10|0.04|A|F|1994-04-18|1994-03-25|1994-05-06|COLLECT COD|TRUCK|lly silent theodolites. carefully e +33025|510|11|3|6|8463.06|0.01|0.00|A|F|1994-03-02|1994-04-05|1994-03-25|COLLECT COD|MAIL|ackages haggle furiously. even packages +33025|1233|71|4|47|53308.81|0.05|0.08|R|F|1994-03-20|1994-04-12|1994-04-19|NONE|AIR|lyly final deposits nag fu +33025|1535|36|5|3|4309.59|0.02|0.08|A|F|1994-05-24|1994-03-07|1994-06-07|TAKE BACK RETURN|MAIL|. blithely ironic accounts wa +33025|642|74|6|42|64790.88|0.09|0.00|A|F|1994-04-10|1994-04-21|1994-04-25|COLLECT COD|FOB|ts. bold deposits nag furiou +33025|1139|76|7|36|37444.68|0.10|0.04|A|F|1994-02-08|1994-03-05|1994-03-01|COLLECT COD|MAIL|about the enticingly final requests. quick +33026|866|66|1|14|24736.04|0.02|0.07|N|O|1995-11-09|1996-01-22|1995-11-14|TAKE BACK RETURN|RAIL|e blithely. regular asympto +33026|643|75|2|21|32416.44|0.07|0.06|N|O|1996-02-10|1995-12-28|1996-03-10|COLLECT COD|SHIP| about the furiously fina +33027|60|36|1|8|7680.48|0.03|0.07|N|O|1997-08-11|1997-06-30|1997-09-04|TAKE BACK RETURN|REG AIR| along the carefully final pinto beans. +33027|842|42|2|5|8714.20|0.05|0.07|N|O|1997-08-12|1997-07-03|1997-09-06|NONE|MAIL|ding dinos bo +33027|1410|11|3|10|13114.10|0.05|0.04|N|O|1997-06-25|1997-06-03|1997-06-30|COLLECT COD|REG AIR|nding ideas about the qu +33027|889|90|4|32|57276.16|0.04|0.03|N|O|1997-08-19|1997-07-20|1997-08-25|TAKE BACK RETURN|RAIL|us accounts are fluffily acr +33027|746|47|5|31|51048.94|0.05|0.04|N|O|1997-07-22|1997-06-30|1997-08-02|NONE|TRUCK|s. deposits about the final, regula +33027|1416|17|6|13|17126.33|0.04|0.06|N|O|1997-07-23|1997-06-17|1997-08-09|COLLECT COD|TRUCK|tions. furiously ironic p +33028|1786|71|1|3|5063.34|0.03|0.07|N|O|1997-01-04|1996-12-11|1997-01-06|TAKE BACK RETURN|FOB|ckages cajole slyl +33028|214|96|2|49|54596.29|0.08|0.01|N|O|1996-12-09|1996-12-16|1997-01-03|TAKE BACK RETURN|RAIL|ts are furiously around +33028|246|74|3|34|38972.16|0.04|0.05|N|O|1996-12-26|1996-11-19|1997-01-12|NONE|MAIL|ss the regular accounts. pendin +33028|1283|95|4|20|23685.60|0.09|0.02|N|O|1996-10-29|1996-11-04|1996-11-14|TAKE BACK RETURN|FOB| against the quick req +33028|568|99|5|47|69022.32|0.09|0.06|N|O|1996-12-20|1996-11-06|1997-01-06|COLLECT COD|AIR|arefully speci +33029|299|100|1|6|7195.74|0.01|0.03|R|F|1992-08-08|1992-08-05|1992-08-28|DELIVER IN PERSON|FOB|mong the ironical +33029|612|75|2|38|57479.18|0.04|0.03|R|F|1992-06-09|1992-07-29|1992-07-08|NONE|TRUCK|instructions +33029|1379|18|3|32|40971.84|0.09|0.00|R|F|1992-08-31|1992-08-07|1992-09-28|COLLECT COD|FOB|iresias? brave, ironic requ +33029|1718|61|4|25|40492.75|0.09|0.04|A|F|1992-06-18|1992-07-21|1992-07-17|NONE|REG AIR|regular pinto beans nag carefully even, exp +33030|368|69|1|30|38050.80|0.05|0.06|N|O|1997-01-02|1997-01-25|1997-01-18|TAKE BACK RETURN|REG AIR|sts cajole quickl +33030|73|24|2|30|29192.10|0.05|0.05|N|O|1996-12-20|1997-03-06|1997-01-14|COLLECT COD|RAIL|le packages. slyly ironic dolphins breach +33030|318|3|3|43|52387.33|0.00|0.06|N|O|1997-01-31|1997-01-17|1997-02-28|COLLECT COD|TRUCK| pending, final depos +33030|1359|60|4|15|18905.25|0.05|0.00|N|O|1997-03-27|1997-01-15|1997-04-07|COLLECT COD|TRUCK|al, regular accounts. silent theodolit +33031|581|12|1|27|40002.66|0.08|0.03|R|F|1992-09-15|1992-11-20|1992-10-10|DELIVER IN PERSON|FOB|of the blithely final requests. foxes among +33031|547|78|2|12|17370.48|0.05|0.01|R|F|1992-11-12|1992-11-21|1992-11-21|DELIVER IN PERSON|AIR|s quickly pending deposits. special +33031|1284|85|3|34|40299.52|0.03|0.04|A|F|1992-10-01|1992-11-16|1992-10-04|COLLECT COD|AIR|y regular deposits +33031|177|4|4|22|23697.74|0.02|0.05|R|F|1992-12-12|1992-11-16|1992-12-13|NONE|RAIL|ove the final requests. fluff +33031|375|76|5|19|24232.03|0.07|0.07|A|F|1992-09-24|1992-10-23|1992-10-09|NONE|FOB|ins. regular excuses sleep +33056|1348|25|1|41|51222.94|0.03|0.07|N|O|1998-09-03|1998-08-27|1998-09-28|DELIVER IN PERSON|TRUCK|s snooze quickly against the s +33056|990|25|2|49|92658.51|0.03|0.03|N|O|1998-09-14|1998-08-02|1998-10-09|TAKE BACK RETURN|RAIL|posits across the unusual instructions wa +33056|236|37|3|2|2272.46|0.03|0.01|N|O|1998-09-19|1998-07-23|1998-10-13|COLLECT COD|MAIL| after the even, final requests. even ideas +33057|1738|39|1|32|52471.36|0.06|0.03|N|O|1998-10-02|1998-08-30|1998-10-11|NONE|FOB|ag blithely even foxes. slyly +33057|941|76|2|22|40522.68|0.04|0.07|N|O|1998-09-22|1998-10-12|1998-09-29|TAKE BACK RETURN|REG AIR|e quietly unusual theodolites. care +33057|706|7|3|2|3213.40|0.02|0.05|N|O|1998-11-10|1998-10-12|1998-11-21|COLLECT COD|AIR|y ironic ideas. carefully bold +33057|290|45|4|34|40469.86|0.04|0.03|N|O|1998-09-09|1998-09-01|1998-09-25|TAKE BACK RETURN|MAIL| mold blithely quie +33058|839|6|1|3|5219.49|0.10|0.06|R|F|1992-12-25|1992-11-24|1993-01-13|DELIVER IN PERSON|TRUCK|nding deposits haggle furiously regular, fi +33058|99|25|2|8|7992.72|0.00|0.05|A|F|1992-11-24|1992-12-20|1992-11-25|DELIVER IN PERSON|REG AIR|equests doubt fl +33058|2|78|3|8|7216.00|0.03|0.04|A|F|1993-01-24|1992-11-07|1993-02-07|TAKE BACK RETURN|AIR|ic instructions. final acco +33059|1855|85|1|48|84328.80|0.09|0.07|R|F|1993-03-17|1993-05-01|1993-03-26|DELIVER IN PERSON|SHIP|iously express accounts detect +33060|1143|80|1|32|33412.48|0.00|0.03|A|F|1993-02-28|1993-04-16|1993-03-09|COLLECT COD|AIR| ironic reques +33060|1428|46|2|14|18611.88|0.08|0.06|R|F|1993-06-05|1993-05-20|1993-06-11|COLLECT COD|TRUCK|according to the final instructions. fu +33060|1766|67|3|34|56703.84|0.01|0.00|A|F|1993-04-27|1993-04-12|1993-05-11|TAKE BACK RETURN|SHIP|inal instructions. even plat +33060|53|4|4|41|39075.05|0.02|0.05|R|F|1993-05-21|1993-04-16|1993-05-23|NONE|TRUCK|pliers. foxes abov +33060|1185|86|5|38|41274.84|0.06|0.00|R|F|1993-06-10|1993-04-18|1993-06-24|TAKE BACK RETURN|AIR| regular foxes integrate regularly ironic +33060|355|56|6|28|35149.80|0.08|0.06|R|F|1993-04-26|1993-04-20|1993-05-26|COLLECT COD|REG AIR|counts. bold theodolites believe furi +33060|1815|2|7|18|30902.58|0.05|0.02|A|F|1993-04-12|1993-05-05|1993-05-10|NONE|REG AIR|ress slyly about th +33061|818|19|1|25|42970.25|0.03|0.02|N|O|1995-11-04|1995-09-15|1995-11-11|COLLECT COD|TRUCK|uctions mold slyly qu +33061|1349|64|2|25|31258.50|0.03|0.08|N|O|1995-10-19|1995-10-11|1995-10-30|DELIVER IN PERSON|AIR|accounts cajole bl +33061|67|68|3|26|25143.56|0.05|0.01|N|O|1995-09-10|1995-09-05|1995-09-17|TAKE BACK RETURN|MAIL|gular package +33061|1325|40|4|34|41694.88|0.08|0.04|N|O|1995-08-02|1995-09-26|1995-08-16|COLLECT COD|RAIL|hely special instructions detect quickly +33062|1042|48|1|12|11316.48|0.07|0.00|N|O|1996-02-11|1996-04-09|1996-03-01|DELIVER IN PERSON|AIR|he slyly special hockey players. fu +33062|669|1|2|31|48659.46|0.10|0.08|N|O|1996-03-31|1996-03-22|1996-04-28|NONE|TRUCK|de the instructions. bold, +33062|1940|85|3|16|29471.04|0.05|0.06|N|O|1996-01-30|1996-03-04|1996-02-18|COLLECT COD|AIR| regular accounts. express, re +33062|1609|92|4|28|42296.80|0.02|0.05|N|O|1996-05-06|1996-03-04|1996-05-10|TAKE BACK RETURN|FOB|s wake. bl +33062|327|56|5|5|6136.60|0.01|0.06|N|O|1996-03-26|1996-03-18|1996-04-07|DELIVER IN PERSON|RAIL|lithely packages; regular platelets +33062|1978|79|6|3|5639.91|0.03|0.08|N|O|1996-05-09|1996-03-30|1996-06-06|NONE|REG AIR|nts. furio +33062|35|36|7|27|25245.81|0.06|0.06|N|O|1996-04-02|1996-03-03|1996-04-16|TAKE BACK RETURN|SHIP|quickly eve +33063|662|63|1|41|64069.06|0.06|0.02|N|O|1997-09-18|1997-10-15|1997-09-26|COLLECT COD|MAIL|heodolites haggle. carefully regula +33063|1934|79|2|46|84452.78|0.05|0.00|N|O|1997-12-18|1997-10-26|1998-01-11|DELIVER IN PERSON|MAIL|ake slyly alongside of the ironically reg +33063|361|90|3|13|16397.68|0.01|0.02|N|O|1997-11-26|1997-11-22|1997-12-19|DELIVER IN PERSON|MAIL|ously bold courts wake quickly against th +33088|1662|86|1|17|26582.22|0.05|0.01|R|F|1995-04-24|1995-02-10|1995-04-29|COLLECT COD|TRUCK|ly regular ideas solve around the caref +33088|1008|14|2|23|20907.00|0.10|0.02|R|F|1995-02-26|1995-02-28|1995-03-07|NONE|RAIL|onic, express pinto beans. silent, iro +33088|1590|31|3|44|65629.96|0.03|0.00|A|F|1995-03-14|1995-03-19|1995-03-25|TAKE BACK RETURN|AIR|onic deposits. quickly special packages +33088|535|26|4|45|64598.85|0.10|0.06|A|F|1995-04-18|1995-02-20|1995-04-26|DELIVER IN PERSON|MAIL|riously final accounts affi +33089|834|35|1|31|53779.73|0.03|0.00|R|F|1993-07-20|1993-08-14|1993-08-18|COLLECT COD|RAIL|inal requests. account +33089|851|52|2|34|59562.90|0.01|0.06|A|F|1993-09-13|1993-07-12|1993-09-28|NONE|FOB| the furiously even depths. +33089|920|55|3|5|9104.60|0.05|0.07|A|F|1993-06-20|1993-08-18|1993-06-28|DELIVER IN PERSON|MAIL|l foxes. fluffily e +33089|1731|16|4|18|29389.14|0.05|0.03|R|F|1993-09-23|1993-07-11|1993-10-16|DELIVER IN PERSON|MAIL| theodolites cajole. e +33089|535|36|5|8|11484.24|0.04|0.08|R|F|1993-08-07|1993-07-25|1993-08-29|TAKE BACK RETURN|REG AIR|posits. bold +33090|922|57|1|5|9114.60|0.05|0.05|A|F|1994-11-14|1994-11-02|1994-12-02|NONE|MAIL| ironically final courts are +33090|299|81|2|41|49170.89|0.04|0.02|A|F|1994-12-04|1994-09-30|1994-12-13|DELIVER IN PERSON|SHIP|blithely alongside of the carefully si +33090|1576|77|3|49|72400.93|0.01|0.08|A|F|1994-09-20|1994-09-18|1994-09-28|COLLECT COD|FOB|sleep. pending, special accounts slee +33090|1954|43|4|4|7423.80|0.00|0.06|R|F|1994-09-03|1994-09-06|1994-09-09|NONE|FOB|ets sublate quickly carefully +33090|1902|3|5|17|30666.30|0.07|0.04|A|F|1994-08-10|1994-09-26|1994-08-11|DELIVER IN PERSON|MAIL|ing to the final, unusual foxes. bl +33090|441|100|6|19|25487.36|0.07|0.08|A|F|1994-08-09|1994-09-17|1994-08-27|TAKE BACK RETURN|RAIL| deposits. ironic, regular pinto beans a +33090|1906|51|7|42|75931.80|0.09|0.04|R|F|1994-09-30|1994-11-01|1994-10-10|DELIVER IN PERSON|TRUCK|usly final requests according to t +33091|1208|9|1|47|52132.40|0.00|0.08|R|F|1995-04-09|1995-04-14|1995-04-30|COLLECT COD|TRUCK|nts: ironic, ironic request +33092|1827|57|1|30|51864.60|0.06|0.08|N|O|1997-05-16|1997-06-14|1997-06-05|DELIVER IN PERSON|MAIL|en dependencies nag abov +33092|175|54|2|31|33330.27|0.03|0.08|N|O|1997-06-20|1997-05-13|1997-06-28|DELIVER IN PERSON|FOB|. slyly ironic platelets are sly +33092|598|99|3|45|67436.55|0.07|0.04|N|O|1997-07-05|1997-06-10|1997-07-06|DELIVER IN PERSON|REG AIR|yly even ideas. pending requests alon +33092|1916|5|4|22|39994.02|0.07|0.04|N|O|1997-04-10|1997-06-22|1997-04-15|TAKE BACK RETURN|SHIP|tegrate carefully along the carefu +33092|1836|66|5|2|3475.66|0.07|0.02|N|O|1997-04-27|1997-05-11|1997-05-25|DELIVER IN PERSON|AIR| even Tiresias. bra +33093|964|99|1|30|55948.80|0.09|0.02|N|O|1997-06-21|1997-07-01|1997-07-12|TAKE BACK RETURN|TRUCK|ly final deposits. accounts against +33093|721|86|2|15|24325.80|0.03|0.04|N|O|1997-07-19|1997-07-10|1997-08-05|TAKE BACK RETURN|RAIL|carefully bold requests haggle slyly alon +33093|205|33|3|22|24314.40|0.10|0.02|N|O|1997-07-11|1997-07-28|1997-07-16|NONE|REG AIR|ronic instructions integrate blithely +33093|1227|2|4|21|23692.62|0.08|0.00|N|O|1997-06-28|1997-07-22|1997-07-11|TAKE BACK RETURN|FOB|long the carefully pending deposits. +33093|1147|20|5|1|1048.14|0.09|0.02|N|O|1997-07-31|1997-06-20|1997-08-04|NONE|AIR|xpress packages. accounts cajo +33093|1040|11|6|20|18820.80|0.01|0.08|N|O|1997-07-05|1997-07-06|1997-07-10|DELIVER IN PERSON|SHIP|onic deposits. silent, pending pa +33094|1489|68|1|34|47276.32|0.05|0.05|R|F|1992-09-06|1992-10-02|1992-09-16|COLLECT COD|MAIL|g fluffily after the fluffily stealthy ac +33095|620|21|1|39|59304.18|0.08|0.05|A|F|1994-04-09|1994-04-02|1994-05-09|DELIVER IN PERSON|SHIP|pinto beans are across the even idea +33095|472|2|2|26|35684.22|0.08|0.03|R|F|1994-03-03|1994-03-24|1994-03-17|TAKE BACK RETURN|FOB|structions. express, ironic pinto beans u +33095|113|92|3|50|50655.50|0.05|0.03|A|F|1994-04-16|1994-05-04|1994-04-21|COLLECT COD|SHIP|unts. final deposits x-ray blithely acr +33095|1634|76|4|46|70638.98|0.00|0.04|A|F|1994-03-28|1994-05-03|1994-04-06|NONE|FOB|y. even, special theo +33095|396|25|5|20|25927.80|0.05|0.04|A|F|1994-06-08|1994-04-14|1994-06-21|COLLECT COD|AIR|arefully regula +33120|1038|39|1|16|15024.48|0.09|0.06|R|F|1994-05-13|1994-03-14|1994-06-09|NONE|FOB|ses. stealthily silent asymptotes affix f +33121|1392|93|1|5|6466.95|0.08|0.04|N|O|1998-04-04|1998-04-13|1998-04-08|NONE|FOB|into beans lose blithely unusual accounts. +33121|579|80|2|26|38468.82|0.03|0.01|N|O|1998-04-18|1998-05-04|1998-04-20|COLLECT COD|FOB|according to the furiously re +33121|1801|88|3|46|78328.80|0.02|0.04|N|O|1998-05-30|1998-03-23|1998-06-18|DELIVER IN PERSON|MAIL|hins. ironic packages use. +33121|1159|60|4|23|24383.45|0.10|0.06|N|O|1998-06-04|1998-05-10|1998-06-27|DELIVER IN PERSON|TRUCK|bold platele +33121|601|95|5|9|13514.40|0.01|0.00|N|O|1998-06-07|1998-03-31|1998-06-28|TAKE BACK RETURN|SHIP|encies use carefully. unusual package +33121|628|91|6|45|68787.90|0.09|0.01|N|O|1998-06-02|1998-04-08|1998-06-15|TAKE BACK RETURN|SHIP|depths use fluffily. quickl +33122|218|19|1|13|14536.73|0.06|0.06|A|F|1993-09-26|1993-08-08|1993-10-21|COLLECT COD|TRUCK|ly special requests ha +33122|269|70|2|49|57293.74|0.10|0.08|R|F|1993-07-18|1993-08-31|1993-08-01|TAKE BACK RETURN|RAIL|anently special deposits. pending pa +33122|162|15|3|1|1062.16|0.07|0.07|A|F|1993-09-07|1993-09-04|1993-10-05|NONE|SHIP|ounts! pinto beans +33122|481|40|4|33|45588.84|0.08|0.00|A|F|1993-08-12|1993-08-11|1993-08-31|DELIVER IN PERSON|SHIP|e above the +33123|1520|21|1|17|24165.84|0.06|0.07|A|F|1994-01-11|1994-01-14|1994-02-03|COLLECT COD|AIR|ans. furiously re +33123|602|65|2|49|73627.40|0.07|0.06|A|F|1994-02-09|1994-01-21|1994-03-10|COLLECT COD|RAIL|ound the slyly unusual fo +33123|339|24|3|31|38419.23|0.02|0.08|R|F|1993-12-16|1994-02-09|1993-12-17|COLLECT COD|SHIP|hinder quickly about the slyly ironi +33124|596|87|1|44|65849.96|0.04|0.01|N|O|1995-11-05|1995-11-27|1995-11-08|NONE|TRUCK| pinto beans alongside of t +33124|1160|61|2|32|33957.12|0.10|0.04|N|O|1996-01-11|1995-11-02|1996-02-08|NONE|FOB|sly bold reques +33125|832|66|1|12|20793.96|0.10|0.02|N|O|1997-05-23|1997-04-01|1997-06-14|TAKE BACK RETURN|FOB|old ideas boost fl +33125|1263|1|2|36|41913.36|0.07|0.08|N|O|1997-03-13|1997-04-21|1997-03-16|DELIVER IN PERSON|TRUCK|thely even instruction +33125|842|9|3|11|19171.24|0.03|0.03|N|O|1997-04-16|1997-04-28|1997-05-11|NONE|FOB|e-- slyly bold accounts above the pint +33125|1407|47|4|1|1308.40|0.08|0.04|N|O|1997-04-19|1997-05-11|1997-05-17|NONE|REG AIR|ent packages wake quickly. unusual accoun +33125|689|90|5|4|6358.72|0.04|0.04|N|O|1997-05-31|1997-05-20|1997-06-19|DELIVER IN PERSON|MAIL|ly regular excuses thrash alongs +33125|761|62|6|37|61485.12|0.09|0.00|N|O|1997-05-05|1997-05-13|1997-05-13|NONE|MAIL| even theodolites. final requests snooze +33125|1147|20|7|17|17818.38|0.10|0.02|N|O|1997-05-01|1997-04-05|1997-05-18|NONE|RAIL| express, special +33126|1363|78|1|14|17701.04|0.01|0.02|N|O|1995-11-22|1996-01-20|1995-12-19|TAKE BACK RETURN|MAIL|ccounts boost blithely. furiously silen +33126|1358|35|2|2|2518.70|0.04|0.02|N|O|1996-02-18|1995-12-21|1996-03-12|NONE|TRUCK|t pinto beans. slyly fin +33126|604|5|3|37|55670.20|0.10|0.04|N|O|1995-11-19|1995-12-17|1995-11-23|COLLECT COD|RAIL|its. carefully iron +33126|163|64|4|33|35084.28|0.10|0.00|N|O|1996-02-29|1996-01-11|1996-03-22|TAKE BACK RETURN|FOB|etect. final instructions nag accor +33126|686|80|5|1|1586.68|0.08|0.00|N|O|1995-12-04|1995-12-14|1995-12-20|NONE|MAIL|riously after +33127|855|89|1|10|17558.50|0.04|0.01|R|F|1993-10-22|1993-11-25|1993-10-24|COLLECT COD|RAIL|s. regular requests do are blithely af +33152|41|67|1|40|37641.60|0.01|0.05|R|F|1993-12-19|1994-01-07|1994-01-18|TAKE BACK RETURN|FOB|lly excuses. regular, even courts al +33152|488|47|2|43|59704.64|0.07|0.07|R|F|1994-02-27|1994-01-31|1994-03-22|NONE|FOB|pinto beans boost furiously again +33153|1245|83|1|12|13754.88|0.07|0.03|N|O|1997-07-17|1997-08-25|1997-08-08|NONE|RAIL|ole blithely blithely regular deposits +33153|1201|39|2|35|38577.00|0.09|0.03|N|O|1997-07-13|1997-08-08|1997-07-24|COLLECT COD|TRUCK|old excuses wake furiously after +33153|677|78|3|16|25242.72|0.09|0.02|N|O|1997-06-29|1997-08-02|1997-07-15|DELIVER IN PERSON|FOB|. final instructions slee +33153|1785|86|4|15|25301.70|0.08|0.04|N|O|1997-08-20|1997-07-11|1997-08-30|COLLECT COD|REG AIR|al, even fox +33153|580|81|5|5|7402.90|0.05|0.05|N|O|1997-09-22|1997-09-02|1997-10-09|COLLECT COD|FOB|lets-- unusual, pe +33153|601|33|6|15|22524.00|0.00|0.03|N|O|1997-07-15|1997-08-23|1997-07-29|DELIVER IN PERSON|SHIP|ructions after the fi +33153|1003|9|7|7|6328.00|0.10|0.05|N|O|1997-06-27|1997-07-12|1997-07-10|TAKE BACK RETURN|FOB|ntegrate. furiously even ideas along the s +33154|926|95|1|17|31057.64|0.08|0.06|A|F|1993-08-11|1993-09-08|1993-08-31|TAKE BACK RETURN|FOB|al foxes thrash carefully aft +33155|519|80|1|21|29809.71|0.00|0.04|N|O|1996-12-12|1996-12-17|1997-01-02|TAKE BACK RETURN|RAIL|ly. furiously pending requests caj +33155|795|96|2|45|76310.55|0.08|0.05|N|O|1997-01-31|1996-11-18|1997-02-01|NONE|REG AIR|packages. carefully express accounts br +33156|1373|12|1|44|56072.28|0.07|0.02|R|F|1993-01-09|1993-01-09|1993-01-15|DELIVER IN PERSON|TRUCK|arefully busily regular foxes. final +33156|275|30|2|48|56412.96|0.04|0.04|A|F|1993-01-03|1993-01-23|1993-01-19|COLLECT COD|FOB|ages haggle regular deposi +33156|1256|68|3|48|55548.00|0.00|0.00|R|F|1993-02-10|1992-12-30|1993-02-25|COLLECT COD|REG AIR| the carefully regu +33157|932|33|1|36|65985.48|0.08|0.08|N|O|1996-09-08|1996-08-22|1996-09-09|COLLECT COD|AIR|reach across t +33157|583|74|2|32|47474.56|0.10|0.06|N|O|1996-07-24|1996-08-15|1996-08-19|NONE|AIR|ake furiously q +33157|1579|80|3|29|42936.53|0.00|0.07|N|O|1996-07-15|1996-09-23|1996-08-07|TAKE BACK RETURN|MAIL|e alongside of +33157|468|27|4|48|65686.08|0.05|0.07|N|O|1996-11-08|1996-08-31|1996-11-28|DELIVER IN PERSON|TRUCK|requests. quickly e +33157|800|97|5|18|30614.40|0.05|0.01|N|O|1996-09-09|1996-08-27|1996-09-28|NONE|RAIL|dolites. carefully unusual braids hagg +33157|478|79|6|24|33083.28|0.00|0.03|N|O|1996-11-03|1996-09-16|1996-11-21|DELIVER IN PERSON|TRUCK|ly about the f +33157|186|87|7|4|4344.72|0.02|0.06|N|O|1996-10-27|1996-08-11|1996-11-18|NONE|TRUCK|es. special, even accounts wake sometimes +33158|1277|89|1|41|48309.07|0.01|0.04|N|O|1998-03-14|1998-04-04|1998-04-05|TAKE BACK RETURN|RAIL|c accounts doze furiously bold theodolit +33159|1831|32|1|28|48519.24|0.02|0.07|R|F|1992-08-03|1992-07-22|1992-08-17|TAKE BACK RETURN|FOB|ronic requests wake finally pendi +33159|1379|18|2|21|26887.77|0.09|0.07|A|F|1992-05-30|1992-06-08|1992-06-11|TAKE BACK RETURN|RAIL|lyly final ideas wake +33184|130|31|1|30|30903.90|0.09|0.08|A|F|1992-03-10|1992-03-23|1992-04-02|NONE|TRUCK|ajole aroun +33184|1054|55|2|22|21011.10|0.10|0.01|R|F|1992-03-09|1992-04-26|1992-03-20|DELIVER IN PERSON|RAIL|lithely regular +33184|36|12|3|4|3744.12|0.03|0.04|R|F|1992-04-10|1992-03-27|1992-05-05|COLLECT COD|REG AIR| evenly final depo +33184|240|68|4|7|7981.68|0.01|0.04|R|F|1992-04-06|1992-03-28|1992-04-23|COLLECT COD|REG AIR|inal ideas wake carefull +33185|1997|86|1|20|37979.80|0.09|0.01|N|O|1996-10-23|1996-12-10|1996-11-02|NONE|SHIP|le slyly at the fluffily regula +33185|467|97|2|35|47861.10|0.02|0.07|N|O|1996-10-25|1996-11-29|1996-11-01|COLLECT COD|RAIL|d deposits affix. blithely unusual i +33186|1336|37|1|35|43306.55|0.05|0.01|R|F|1992-11-10|1992-11-14|1992-12-09|DELIVER IN PERSON|SHIP|alms lose furiously al +33186|1621|4|2|32|48723.84|0.00|0.02|R|F|1992-09-20|1992-10-20|1992-09-24|NONE|FOB|ely about the regular, thin deposits. +33186|186|39|3|49|53222.82|0.09|0.03|R|F|1992-12-03|1992-11-13|1992-12-24|DELIVER IN PERSON|TRUCK| ironic notorn +33186|1976|21|4|18|33803.46|0.10|0.00|A|F|1992-10-17|1992-11-23|1992-11-10|DELIVER IN PERSON|REG AIR|ake blithely. careful +33186|1227|39|5|28|31590.16|0.07|0.06|R|F|1992-10-06|1992-10-26|1992-10-11|TAKE BACK RETURN|MAIL|thely express dolphins. ev +33187|1294|69|1|14|16734.06|0.05|0.01|R|F|1994-10-29|1995-01-11|1994-11-02|NONE|RAIL|he bold requests boost slyly fluffily expre +33187|508|99|2|45|63382.50|0.09|0.05|A|F|1995-01-21|1994-12-12|1995-02-14|NONE|AIR|ents haggle along the blithe +33187|761|58|3|17|28249.92|0.07|0.06|R|F|1994-12-23|1995-01-11|1995-01-20|COLLECT COD|TRUCK|s. blithely regular accounts at the re +33187|621|84|4|16|24345.92|0.00|0.02|A|F|1994-12-20|1994-12-27|1994-12-30|TAKE BACK RETURN|RAIL|ost after the slyly even ideas. final, +33187|1048|19|5|30|28471.20|0.00|0.02|A|F|1995-01-28|1995-01-14|1995-02-25|DELIVER IN PERSON|MAIL|silent dep +33187|568|69|6|4|5874.24|0.00|0.05|A|F|1994-12-22|1995-01-04|1995-01-11|DELIVER IN PERSON|FOB|e hockey players +33188|600|91|1|2|3001.20|0.01|0.05|N|O|1995-09-21|1995-11-09|1995-10-08|DELIVER IN PERSON|SHIP|usual, regular +33189|1001|72|1|38|34276.00|0.03|0.00|A|F|1994-12-28|1995-01-11|1995-01-10|DELIVER IN PERSON|TRUCK|quickly express foxes are bli +33189|1032|68|2|31|28923.93|0.10|0.03|A|F|1994-12-04|1995-02-08|1994-12-08|DELIVER IN PERSON|REG AIR|gular deposits cajole express, +33189|1495|74|3|8|11171.92|0.02|0.05|A|F|1995-02-13|1995-02-08|1995-03-08|NONE|RAIL|xes sublate carefully sly +33189|49|50|4|13|12337.52|0.05|0.03|A|F|1995-01-05|1995-02-04|1995-01-09|COLLECT COD|RAIL|quests boost about the furiously pendi +33189|1198|71|5|22|24182.18|0.07|0.03|R|F|1995-03-03|1995-01-12|1995-03-08|TAKE BACK RETURN|REG AIR|un quickly blithely silen +33189|1979|24|6|46|86524.62|0.07|0.06|R|F|1994-12-20|1995-01-30|1995-01-07|TAKE BACK RETURN|RAIL| cajole above th +33190|434|93|1|4|5337.72|0.05|0.05|N|O|1998-01-13|1997-12-13|1998-01-24|NONE|REG AIR|ously pending forges sleep quic +33190|588|79|2|47|69963.26|0.02|0.07|N|O|1997-11-18|1997-12-01|1997-12-09|DELIVER IN PERSON|AIR|re furiously along the silent, final +33190|1564|5|3|39|57156.84|0.10|0.01|N|O|1997-12-28|1997-12-18|1998-01-27|COLLECT COD|MAIL| final, pending packages cajo +33191|441|71|1|47|63047.68|0.08|0.08|N|O|1997-03-25|1997-03-22|1997-03-28|DELIVER IN PERSON|RAIL| slyly alo +33191|526|27|2|6|8559.12|0.07|0.03|N|O|1997-04-06|1997-04-04|1997-04-13|DELIVER IN PERSON|RAIL|the quickly unusual +33191|66|17|3|20|19321.20|0.07|0.06|N|O|1997-06-01|1997-05-03|1997-06-17|TAKE BACK RETURN|AIR|regular dependenc +33191|745|78|4|32|52663.68|0.10|0.08|N|O|1997-06-18|1997-05-18|1997-07-08|TAKE BACK RETURN|REG AIR|xcuses sleep slyly unusual foxes. +33191|1102|3|5|32|32099.20|0.01|0.02|N|O|1997-05-04|1997-04-11|1997-05-30|NONE|AIR|s. furiously regular deposits are always. +33191|1071|7|6|38|36938.66|0.07|0.02|N|O|1997-06-11|1997-04-04|1997-06-22|DELIVER IN PERSON|SHIP|eposits nod +33191|1649|50|7|8|12405.12|0.10|0.03|N|O|1997-05-30|1997-05-01|1997-05-31|NONE|RAIL|sits nag ac +33216|857|57|1|11|19336.35|0.01|0.00|N|O|1996-06-24|1996-07-27|1996-07-12|TAKE BACK RETURN|SHIP|ter the expr +33216|1857|87|2|15|26382.75|0.05|0.07|N|O|1996-08-14|1996-08-15|1996-08-31|DELIVER IN PERSON|FOB|s above the +33216|990|93|3|4|7563.96|0.06|0.07|N|O|1996-08-16|1996-07-19|1996-09-05|DELIVER IN PERSON|MAIL|ions haggle after the slyl +33216|1383|22|4|14|17981.32|0.10|0.00|N|O|1996-06-22|1996-09-06|1996-07-11|COLLECT COD|MAIL| sleep blithely final a +33216|1157|30|5|29|30686.35|0.05|0.00|N|O|1996-08-01|1996-08-04|1996-08-06|NONE|SHIP|inal, regular ac +33217|1270|45|1|22|25767.94|0.03|0.04|R|F|1994-03-20|1994-04-16|1994-04-07|COLLECT COD|TRUCK|foxes sleep blithely around the +33217|495|54|2|49|68379.01|0.00|0.05|A|F|1994-06-18|1994-05-31|1994-06-27|DELIVER IN PERSON|RAIL|ze. expres +33217|1721|48|3|34|55172.48|0.03|0.02|R|F|1994-04-29|1994-05-10|1994-05-03|NONE|AIR| slyly bold theodolites wake qui +33217|1948|93|4|18|33298.92|0.01|0.05|A|F|1994-06-15|1994-04-28|1994-07-14|NONE|SHIP|. furiously ironic asymptotes +33217|1152|61|5|37|38966.55|0.07|0.01|A|F|1994-05-31|1994-05-10|1994-06-27|COLLECT COD|REG AIR|ole. ironic dolphins haggle fluffi +33217|760|25|6|10|16607.60|0.06|0.06|A|F|1994-06-08|1994-04-13|1994-07-07|NONE|FOB|ecial deposits alongside of the accounts na +33218|1420|60|1|27|35678.34|0.05|0.00|R|F|1993-03-24|1993-02-14|1993-04-18|NONE|SHIP|ly against the fluffily unusual +33218|1129|66|2|19|19572.28|0.05|0.01|R|F|1993-03-17|1993-03-20|1993-03-25|DELIVER IN PERSON|FOB|ously regular pinto beans. +33218|587|78|3|13|19338.54|0.04|0.01|A|F|1993-02-16|1993-03-21|1993-02-28|COLLECT COD|SHIP|t carefully platelets. fluffily +33218|1630|13|4|45|68923.35|0.08|0.01|A|F|1993-01-27|1993-03-26|1993-02-11|NONE|RAIL|slyly carefully express accou +33218|902|3|5|5|9014.50|0.07|0.06|A|F|1993-03-10|1993-02-27|1993-04-02|NONE|MAIL|ously special packages x-ray fluffily bli +33218|1799|84|6|47|79937.13|0.00|0.01|A|F|1993-01-24|1993-04-03|1993-02-16|TAKE BACK RETURN|RAIL|luffily. final platelets sleep above the +33218|1760|3|7|18|29911.68|0.04|0.06|R|F|1993-02-21|1993-02-25|1993-02-25|NONE|MAIL|lar packages. b +33219|1356|71|1|11|13830.85|0.03|0.02|N|O|1996-02-17|1996-02-03|1996-03-09|DELIVER IN PERSON|FOB|requests a +33219|1001|72|2|9|8118.00|0.08|0.05|N|O|1996-03-28|1996-01-16|1996-04-13|COLLECT COD|REG AIR|xes wake carefully pending foxe +33219|1937|26|3|31|57006.83|0.08|0.07|N|O|1995-12-20|1996-01-15|1995-12-22|DELIVER IN PERSON|FOB|ly. slyly bold fo +33219|608|2|4|16|24137.60|0.03|0.00|N|O|1996-02-27|1996-01-25|1996-03-22|NONE|RAIL|aggle slyly around the exp +33219|1738|39|5|46|75427.58|0.06|0.03|N|O|1996-01-22|1996-01-16|1996-01-27|COLLECT COD|MAIL|yly carefully final exc +33219|1781|8|6|25|42069.50|0.05|0.05|N|O|1996-01-21|1996-02-15|1996-01-28|COLLECT COD|SHIP|final platelets around the slyly final exc +33220|518|49|1|34|48229.34|0.08|0.07|A|F|1994-07-16|1994-07-15|1994-08-12|DELIVER IN PERSON|MAIL|ravely even +33220|319|4|2|49|59746.19|0.05|0.02|R|F|1994-05-25|1994-06-16|1994-06-14|COLLECT COD|FOB|the slyly even requests. sl +33220|1787|30|3|42|70928.76|0.00|0.07|A|F|1994-04-17|1994-06-07|1994-04-26|COLLECT COD|MAIL|rding to the carefully even requ +33220|1715|100|4|1|1616.71|0.09|0.08|A|F|1994-05-15|1994-05-28|1994-06-01|TAKE BACK RETURN|RAIL|nce the fluffily final courts +33221|1260|98|1|4|4645.04|0.00|0.07|N|O|1997-09-17|1997-11-01|1997-09-23|COLLECT COD|TRUCK|o the blithely regular pinto beans na +33222|411|70|1|14|18359.74|0.00|0.08|A|F|1992-09-25|1992-08-28|1992-10-10|DELIVER IN PERSON|REG AIR|s asymptotes. fluffily special hockey playe +33222|1118|27|2|39|39745.29|0.08|0.00|A|F|1992-08-12|1992-08-28|1992-08-31|TAKE BACK RETURN|SHIP| was above the furiously +33222|603|66|3|3|4510.80|0.06|0.00|R|F|1992-08-26|1992-08-04|1992-09-14|DELIVER IN PERSON|TRUCK|e blithely final warthogs. regula +33222|1281|82|4|24|28374.72|0.00|0.04|A|F|1992-10-18|1992-09-12|1992-11-03|DELIVER IN PERSON|MAIL|lyly along the regular accounts. sil +33222|286|87|5|20|23725.60|0.10|0.00|A|F|1992-08-11|1992-08-20|1992-08-16|TAKE BACK RETURN|FOB|ent pinto beans on the careful +33222|1280|81|6|35|41344.80|0.05|0.00|R|F|1992-09-27|1992-08-16|1992-10-12|NONE|MAIL|against the deposits. slyly final de +33223|1939|40|1|16|29454.88|0.07|0.00|N|O|1996-10-21|1996-10-24|1996-11-09|NONE|RAIL|ly about the enti +33248|783|16|1|5|8418.90|0.04|0.05|N|O|1997-03-21|1997-05-12|1997-04-17|DELIVER IN PERSON|SHIP|against the +33248|1725|26|2|50|81336.00|0.08|0.06|N|O|1997-03-15|1997-05-10|1997-04-08|TAKE BACK RETURN|SHIP|ing asymptotes use at the +33248|206|61|3|47|51991.40|0.09|0.06|N|O|1997-05-13|1997-03-16|1997-05-27|COLLECT COD|MAIL|quickly pending deposits after the packa +33248|1043|14|4|39|36817.56|0.05|0.06|N|O|1997-06-02|1997-04-24|1997-06-06|DELIVER IN PERSON|TRUCK|rmanent realms mold blithely. furi +33248|1122|23|5|5|5115.60|0.10|0.04|N|O|1997-05-23|1997-05-05|1997-06-16|NONE|MAIL|ular pinto beans. regular platelets +33248|1959|92|6|42|78159.90|0.02|0.02|N|O|1997-05-11|1997-04-13|1997-05-27|NONE|AIR|. theodolites along the slyly even +33248|250|32|7|28|32207.00|0.02|0.00|N|O|1997-04-14|1997-05-09|1997-05-03|COLLECT COD|MAIL|uriously bold requests. enticing, bol +33249|575|36|1|17|25084.69|0.06|0.05|R|F|1992-11-26|1992-11-28|1992-12-02|DELIVER IN PERSON|AIR| requests integrate. busily +33249|1888|18|2|14|25058.32|0.00|0.02|A|F|1992-12-31|1992-11-29|1993-01-09|NONE|SHIP|s cajole furiously according t +33249|1283|95|3|26|30791.28|0.04|0.08|A|F|1992-10-06|1992-12-10|1992-10-18|NONE|TRUCK|quests against the cl +33249|141|20|4|39|40604.46|0.09|0.08|A|F|1993-01-16|1992-11-28|1993-02-08|TAKE BACK RETURN|AIR|s? quickly final dependencies +33249|1349|88|5|32|40010.88|0.02|0.03|A|F|1992-10-07|1992-11-04|1992-10-26|DELIVER IN PERSON|FOB|y carefully pending dep +33250|1798|25|1|8|13598.32|0.01|0.07|A|F|1994-09-23|1994-08-26|1994-10-08|NONE|RAIL| bold dependencies cajole +33250|330|31|2|25|30758.25|0.02|0.06|A|F|1994-09-07|1994-08-26|1994-09-21|DELIVER IN PERSON|REG AIR|final requests. ideas haggle a +33250|1292|67|3|26|31025.54|0.00|0.06|R|F|1994-09-28|1994-08-17|1994-10-27|TAKE BACK RETURN|FOB|ies wake af +33250|1961|50|4|23|42848.08|0.02|0.08|A|F|1994-10-08|1994-09-03|1994-10-22|NONE|TRUCK| according to the quickly final reques +33250|1316|93|5|15|18259.65|0.05|0.00|R|F|1994-08-19|1994-09-09|1994-09-09|DELIVER IN PERSON|MAIL| have to wake at the furiously ironic acc +33250|878|12|6|11|19567.57|0.07|0.03|R|F|1994-07-31|1994-08-02|1994-08-29|COLLECT COD|MAIL|ong the furio +33251|1951|40|1|7|12970.65|0.07|0.05|R|F|1994-07-27|1994-08-25|1994-08-20|TAKE BACK RETURN|FOB|ke boldly clos +33252|9|85|1|43|39087.00|0.09|0.07|A|F|1992-06-05|1992-06-20|1992-06-24|DELIVER IN PERSON|MAIL|sly regular requests. bold pinto bean +33252|1626|50|2|42|64160.04|0.10|0.03|R|F|1992-04-19|1992-05-30|1992-04-20|TAKE BACK RETURN|TRUCK|its. ironic foxes promise carefully bol +33252|636|30|3|37|56855.31|0.03|0.07|A|F|1992-07-05|1992-06-14|1992-07-08|TAKE BACK RETURN|AIR|lyly ironic dugouts +33252|1176|77|4|32|34469.44|0.01|0.07|A|F|1992-04-23|1992-04-30|1992-05-17|DELIVER IN PERSON|SHIP|l instructions haggle blithely. bold plate +33252|724|21|5|49|79611.28|0.05|0.08|A|F|1992-03-31|1992-05-08|1992-04-20|DELIVER IN PERSON|REG AIR|unts wake carefully against the p +33252|501|62|6|43|60264.50|0.09|0.02|A|F|1992-06-20|1992-05-22|1992-07-16|TAKE BACK RETURN|FOB|thy, even accounts. never special package +33252|173|74|7|15|16097.55|0.04|0.06|A|F|1992-07-17|1992-05-27|1992-08-03|NONE|RAIL|y pending accoun +33253|1139|12|1|3|3120.39|0.05|0.04|N|O|1996-02-09|1996-02-02|1996-02-22|TAKE BACK RETURN|TRUCK|efully according to +33253|46|97|2|34|32165.36|0.02|0.08|N|O|1996-03-05|1996-02-16|1996-03-28|TAKE BACK RETURN|TRUCK|ests. fluffily re +33253|903|4|3|17|30666.30|0.04|0.00|N|O|1996-02-04|1996-02-08|1996-02-16|DELIVER IN PERSON|REG AIR|se furious +33254|1646|29|1|27|41786.28|0.10|0.08|N|O|1995-11-16|1995-12-09|1995-11-19|TAKE BACK RETURN|RAIL|regular instru +33254|1430|9|2|38|50594.34|0.09|0.05|N|O|1995-11-06|1995-12-11|1995-11-23|TAKE BACK RETURN|TRUCK|s packages run carefully blithely fin +33254|848|15|3|14|24483.76|0.02|0.04|N|O|1995-12-04|1996-01-09|1995-12-27|TAKE BACK RETURN|FOB|its. carefully +33255|1678|20|1|40|63186.80|0.06|0.03|R|F|1993-09-04|1993-08-06|1993-09-29|TAKE BACK RETURN|REG AIR|ake fluffily final theod +33255|1882|69|2|31|55300.28|0.10|0.04|R|F|1993-08-15|1993-09-17|1993-09-06|COLLECT COD|REG AIR|ilent, special sheaves integrate. blith +33255|802|69|3|27|45975.60|0.00|0.02|R|F|1993-08-23|1993-08-23|1993-09-19|COLLECT COD|SHIP|es? fluffily regular sentiments acro +33255|818|85|4|9|15469.29|0.04|0.06|R|F|1993-09-27|1993-09-01|1993-10-05|COLLECT COD|MAIL|s. slyly u +33255|1588|29|5|12|17874.96|0.08|0.01|R|F|1993-07-15|1993-07-27|1993-07-24|COLLECT COD|REG AIR|ounts! slyly ironic accounts boost car +33255|220|21|6|24|26885.28|0.05|0.06|R|F|1993-07-10|1993-08-29|1993-07-30|TAKE BACK RETURN|SHIP| the slyly even packages. express, re +33280|180|81|1|27|29164.86|0.01|0.08|N|O|1998-07-12|1998-06-03|1998-07-14|DELIVER IN PERSON|AIR|blithely pending accounts use dog +33280|1671|72|2|12|18872.04|0.00|0.05|N|O|1998-06-26|1998-06-20|1998-07-17|TAKE BACK RETURN|MAIL|ze always. furiousl +33280|1340|79|3|48|59584.32|0.06|0.02|N|O|1998-04-01|1998-06-19|1998-04-15|TAKE BACK RETURN|FOB|ptotes. quick, even +33280|921|22|4|12|21863.04|0.05|0.06|N|O|1998-06-28|1998-05-13|1998-07-21|COLLECT COD|RAIL|final braids nag blithely blithel +33280|197|98|5|5|5485.95|0.00|0.07|N|O|1998-06-19|1998-05-25|1998-06-22|COLLECT COD|AIR| bold platelets are quickly along t +33280|365|66|6|32|40491.52|0.05|0.05|N|O|1998-06-07|1998-05-27|1998-06-11|COLLECT COD|SHIP|lly with the unusual p +33280|1659|60|7|8|12485.20|0.06|0.08|N|O|1998-04-11|1998-05-18|1998-04-19|COLLECT COD|TRUCK|y silent ideas us +33281|137|64|1|8|8297.04|0.03|0.06|A|F|1992-11-29|1992-12-14|1992-12-14|NONE|TRUCK|es hang slyly against the c +33281|1498|99|2|48|67175.52|0.07|0.04|A|F|1993-02-01|1992-11-29|1993-02-16|TAKE BACK RETURN|AIR|tes. theodolites haggle careful +33282|1094|65|1|46|45774.14|0.03|0.02|N|O|1998-10-02|1998-07-24|1998-10-17|NONE|FOB|even Tires +33282|1540|61|2|30|43246.20|0.00|0.05|N|O|1998-08-13|1998-09-11|1998-09-03|NONE|MAIL|its. quickly bold deposits across the +33282|1191|64|3|25|27304.75|0.00|0.04|N|O|1998-08-08|1998-08-15|1998-08-31|COLLECT COD|AIR| accounts nag slyly even requests. pac +33283|283|38|1|42|49697.76|0.04|0.05|R|F|1993-04-21|1993-05-26|1993-04-29|TAKE BACK RETURN|SHIP|eposits. slyly final excuse +33283|1699|23|2|30|48020.70|0.08|0.04|A|F|1993-04-28|1993-05-14|1993-05-10|DELIVER IN PERSON|AIR|ages nag furiously qu +33283|1559|60|3|44|64264.20|0.02|0.04|R|F|1993-07-06|1993-05-21|1993-07-08|TAKE BACK RETURN|RAIL|express depen +33283|1610|34|4|47|71045.67|0.05|0.06|R|F|1993-06-23|1993-05-20|1993-07-16|DELIVER IN PERSON|FOB|instructions cajole according to th +33283|787|84|5|38|64135.64|0.10|0.06|A|F|1993-06-14|1993-04-22|1993-07-06|NONE|RAIL|packages boost. slyly even re +33284|1232|44|1|15|16998.45|0.00|0.01|A|F|1992-04-06|1992-05-16|1992-04-15|NONE|REG AIR|ular foxes? blithely unu +33284|10|36|2|1|910.01|0.09|0.05|R|F|1992-05-01|1992-05-01|1992-05-25|NONE|RAIL|press packages +33284|1543|44|3|2|2889.08|0.05|0.03|A|F|1992-05-19|1992-06-07|1992-05-26|COLLECT COD|SHIP|ets across the quick +33284|135|88|4|38|39334.94|0.10|0.06|R|F|1992-04-22|1992-05-15|1992-05-09|DELIVER IN PERSON|RAIL|ronic, ironic instructions sleep bli +33284|1948|49|5|24|44398.56|0.03|0.00|R|F|1992-04-15|1992-05-07|1992-04-19|COLLECT COD|REG AIR|maintain carefully even requests; even +33285|1935|24|1|29|53270.97|0.01|0.02|R|F|1992-04-25|1992-04-16|1992-05-13|DELIVER IN PERSON|FOB|tes. regular accoun +33285|1891|35|2|10|17928.90|0.01|0.05|R|F|1992-03-23|1992-03-09|1992-04-03|TAKE BACK RETURN|FOB|ic accounts across the idle theod +33285|1473|74|3|44|60476.68|0.08|0.08|R|F|1992-04-18|1992-02-23|1992-04-23|DELIVER IN PERSON|RAIL| slyly ironic theodolite +33285|312|69|4|33|40006.23|0.00|0.03|R|F|1992-02-02|1992-03-25|1992-02-29|NONE|RAIL|s boost blithely ironic theodolite +33285|1622|64|5|48|73133.76|0.09|0.04|A|F|1992-03-23|1992-04-09|1992-04-19|DELIVER IN PERSON|MAIL|t blithely: carefu +33286|80|6|1|14|13721.12|0.02|0.01|N|O|1997-12-03|1998-02-21|1997-12-08|COLLECT COD|TRUCK|e instructions. blithely final instruc +33286|1441|59|2|40|53697.60|0.00|0.00|N|O|1998-01-25|1998-02-12|1998-02-22|NONE|REG AIR|ges sleep c +33286|1307|84|3|15|18124.50|0.01|0.04|N|O|1998-03-08|1998-01-02|1998-04-03|NONE|RAIL|g to the bold asymptotes. blith +33286|992|95|4|49|92756.51|0.01|0.00|N|O|1997-12-25|1998-02-05|1997-12-29|COLLECT COD|REG AIR|carefully express pinto bean +33286|666|60|5|20|31333.20|0.08|0.06|N|O|1998-01-04|1998-01-07|1998-01-16|NONE|REG AIR|ironic accounts about the slyly f +33286|796|97|6|41|69568.39|0.04|0.08|N|O|1997-12-08|1998-02-07|1997-12-15|COLLECT COD|FOB| pains are; permanent, special atta +33286|1888|18|7|9|16108.92|0.10|0.04|N|O|1998-01-11|1998-02-14|1998-01-12|TAKE BACK RETURN|AIR|lly against the regular packag +33287|1331|70|1|6|7393.98|0.07|0.02|N|O|1995-07-21|1995-06-08|1995-07-31|NONE|FOB|nusual requests. slyly even ac +33312|1929|30|1|27|49434.84|0.09|0.07|N|O|1996-10-21|1996-08-15|1996-11-07|TAKE BACK RETURN|RAIL|der carefully around the ironic ideas +33312|183|10|2|17|18414.06|0.01|0.03|N|O|1996-07-18|1996-09-16|1996-08-02|COLLECT COD|SHIP|ily regular requests. blithely r +33312|1643|26|3|34|52517.76|0.03|0.02|N|O|1996-09-12|1996-07-30|1996-09-24|TAKE BACK RETURN|MAIL|even packages +33312|1807|8|4|36|61516.80|0.03|0.08|N|O|1996-08-14|1996-09-21|1996-08-21|NONE|AIR|y ironic escapades haggle blithely af +33313|411|41|1|38|49833.58|0.02|0.05|N|O|1997-01-11|1997-04-07|1997-01-18|COLLECT COD|RAIL|ironic excuses. packages detect slyly. acco +33313|1556|37|2|33|48099.15|0.10|0.04|N|O|1997-01-12|1997-02-21|1997-01-17|DELIVER IN PERSON|SHIP|ckages cajole blithely ironic +33313|114|15|3|22|22310.42|0.01|0.05|N|O|1997-04-08|1997-02-21|1997-04-28|NONE|MAIL|ep furiously finally final deposits. foxes +33313|1650|74|4|5|7758.25|0.05|0.05|N|O|1997-04-23|1997-03-28|1997-04-28|NONE|TRUCK|rding to the pen +33313|419|49|5|33|43540.53|0.03|0.00|N|O|1997-04-28|1997-04-04|1997-04-30|DELIVER IN PERSON|FOB|f the quickly silent braids. pint +33313|1947|80|6|50|92447.00|0.00|0.01|N|O|1997-02-24|1997-03-17|1997-03-16|TAKE BACK RETURN|SHIP|sly careful pe +33314|129|8|1|25|25728.00|0.02|0.06|N|O|1997-05-25|1997-07-14|1997-06-18|TAKE BACK RETURN|REG AIR| even packages. slyly +33314|1343|20|2|26|32352.84|0.06|0.01|N|O|1997-07-23|1997-07-12|1997-07-30|NONE|REG AIR|quests after the slyly silent pint +33314|1943|44|3|16|29519.04|0.09|0.00|N|O|1997-07-11|1997-06-15|1997-08-08|COLLECT COD|FOB|olphins; packages affix busily after +33314|889|89|4|39|69805.32|0.10|0.08|N|O|1997-05-20|1997-06-10|1997-06-02|DELIVER IN PERSON|RAIL|use carefully slyly regular deposits +33314|1224|25|5|26|29255.72|0.06|0.07|N|O|1997-06-04|1997-05-22|1997-06-29|DELIVER IN PERSON|MAIL|ly pending +33314|457|58|6|29|39366.05|0.07|0.06|N|O|1997-08-09|1997-06-07|1997-08-28|NONE|FOB|ges nag packages: +33314|2000|89|7|48|43296.00|0.07|0.08|N|O|1997-08-12|1997-07-06|1997-09-06|NONE|MAIL|ong the carefully special depos +33315|1910|43|1|40|72476.40|0.05|0.05|N|O|1997-10-03|1997-09-15|1997-11-01|TAKE BACK RETURN|SHIP|ts. carefully regular p +33315|1994|83|2|24|45503.76|0.04|0.04|N|O|1997-08-11|1997-09-24|1997-08-28|COLLECT COD|SHIP|gly ironic, ruthles +33315|308|65|3|31|37457.30|0.01|0.04|N|O|1997-10-16|1997-10-04|1997-11-15|DELIVER IN PERSON|AIR| blithely regular theodolites. de +33315|1633|75|4|3|4603.89|0.10|0.08|N|O|1997-09-07|1997-09-17|1997-09-23|TAKE BACK RETURN|SHIP|nto beans. ideas affi +33315|806|40|5|36|61444.80|0.02|0.08|N|O|1997-11-25|1997-10-26|1997-12-05|DELIVER IN PERSON|FOB|eas. slyly unusual packages use +33315|1564|85|6|20|29311.20|0.08|0.05|N|O|1997-11-12|1997-10-20|1997-12-08|NONE|AIR| dependencies-- special +33315|289|44|7|38|45192.64|0.02|0.06|N|O|1997-08-20|1997-10-17|1997-09-12|NONE|REG AIR|lar, even reque +33316|1877|78|1|4|7115.48|0.03|0.05|N|O|1998-05-05|1998-05-25|1998-05-15|COLLECT COD|RAIL|beans. regular, furious deposits are sl +33316|572|33|2|44|64793.08|0.02|0.05|N|O|1998-06-16|1998-05-10|1998-06-30|TAKE BACK RETURN|TRUCK|lets are quickly +33317|291|46|1|21|25017.09|0.08|0.02|A|F|1994-05-19|1994-07-18|1994-06-09|TAKE BACK RETURN|MAIL|ously ironic pinto beans affix. unusual acc +33317|19|70|2|38|34922.38|0.08|0.03|A|F|1994-06-07|1994-06-17|1994-06-25|COLLECT COD|REG AIR| special instructions. deposits above the +33317|658|59|3|6|9351.90|0.02|0.07|A|F|1994-06-05|1994-07-23|1994-06-21|TAKE BACK RETURN|RAIL|nusual deposits haggle carefully. r +33317|1800|27|4|5|8509.00|0.04|0.02|A|F|1994-08-17|1994-06-27|1994-09-02|NONE|FOB| use final, even req +33317|913|48|5|16|29022.56|0.06|0.03|A|F|1994-06-05|1994-06-24|1994-06-14|NONE|MAIL|e requests! slyly bold packa +33317|305|6|6|29|34953.70|0.01|0.07|R|F|1994-07-27|1994-07-04|1994-07-30|TAKE BACK RETURN|RAIL|uctions. slyly even foxes nag slyly aroun +33317|662|25|7|41|64069.06|0.02|0.01|R|F|1994-06-19|1994-07-29|1994-06-29|DELIVER IN PERSON|REG AIR|y dogged frets! +33318|1635|59|1|50|76831.50|0.06|0.06|N|O|1997-06-21|1997-07-17|1997-07-16|TAKE BACK RETURN|REG AIR| pending deposits. even foxes after t +33319|1740|67|1|5|8208.70|0.06|0.06|A|F|1994-05-23|1994-06-25|1994-05-25|COLLECT COD|RAIL|eans wake furious +33319|590|21|2|45|67076.55|0.00|0.01|A|F|1994-07-09|1994-06-25|1994-08-04|COLLECT COD|TRUCK|g dependencies +33319|1486|4|3|16|22199.68|0.04|0.06|A|F|1994-07-18|1994-05-06|1994-08-04|TAKE BACK RETURN|TRUCK|y pending courts. requests sleep quic +33319|1380|19|4|29|37160.02|0.08|0.06|R|F|1994-07-01|1994-06-18|1994-07-22|TAKE BACK RETURN|SHIP|ly bravely ironic theodolites. unusual +33319|281|36|5|10|11812.80|0.00|0.04|A|F|1994-06-06|1994-05-24|1994-06-22|NONE|REG AIR|lly final in +33319|134|13|6|36|37228.68|0.08|0.03|R|F|1994-06-22|1994-06-23|1994-06-24|DELIVER IN PERSON|RAIL|ke dependencies. ironic packages ab +33319|1057|58|7|24|22993.20|0.08|0.05|R|F|1994-07-18|1994-05-17|1994-08-14|COLLECT COD|MAIL| to sleep above the thin asymptotes. car +33344|1982|83|1|1|1883.98|0.03|0.07|R|F|1994-04-12|1994-04-25|1994-05-10|COLLECT COD|RAIL|egular deposits wake silent packages. +33345|1962|95|1|20|37279.20|0.03|0.03|N|O|1996-07-30|1996-07-04|1996-08-04|NONE|MAIL|fluffily ironic asymptotes. +33345|1150|59|2|27|28381.05|0.03|0.04|N|O|1996-08-01|1996-06-29|1996-08-31|TAKE BACK RETURN|RAIL|efully around the carefully bold instr +33345|86|62|3|44|43387.52|0.00|0.04|N|O|1996-06-03|1996-05-31|1996-06-08|NONE|TRUCK|ts against the +33345|1456|74|4|31|42080.95|0.01|0.05|N|O|1996-07-25|1996-06-04|1996-08-06|COLLECT COD|FOB|ions engage carefully +33345|1104|5|5|18|18091.80|0.06|0.02|N|O|1996-08-06|1996-07-10|1996-08-13|DELIVER IN PERSON|AIR|kly final requests. fluffily special war +33345|957|92|6|23|42732.85|0.01|0.02|N|O|1996-05-15|1996-06-30|1996-05-25|DELIVER IN PERSON|FOB|p blithely. furiously regular deposits boos +33346|1641|24|1|35|53992.40|0.05|0.01|N|O|1995-10-26|1995-10-16|1995-11-22|DELIVER IN PERSON|SHIP|gular accounts may cajole furiously alongsi +33347|234|35|1|5|5671.15|0.07|0.05|R|F|1992-10-13|1992-10-28|1992-10-25|NONE|FOB|es above the blithely pending deposits +33347|211|93|2|33|36669.93|0.04|0.07|R|F|1992-09-20|1992-11-22|1992-10-07|NONE|MAIL|ts. bold, pending packages +33347|698|99|3|7|11190.83|0.02|0.01|R|F|1992-09-28|1992-10-26|1992-10-25|TAKE BACK RETURN|REG AIR|al packages. bold +33347|1147|84|4|37|38781.18|0.05|0.05|A|F|1992-10-03|1992-10-25|1992-10-20|DELIVER IN PERSON|SHIP|es sleep slyly. fluffily regula +33347|1350|51|5|5|6256.75|0.01|0.07|R|F|1992-09-10|1992-10-24|1992-09-18|NONE|AIR| final pinto beans wake acco +33348|1664|6|1|42|65757.72|0.09|0.05|R|F|1995-02-14|1995-01-16|1995-03-08|COLLECT COD|MAIL|n realms integrate slyly furiously iro +33349|134|35|1|12|12409.56|0.04|0.06|N|O|1997-03-20|1997-03-20|1997-04-16|DELIVER IN PERSON|SHIP|riously. never unus +33349|864|64|2|42|74124.12|0.09|0.02|N|O|1997-01-20|1997-03-22|1997-01-23|COLLECT COD|FOB|old theodolites. fluffi +33349|897|64|3|10|17978.90|0.01|0.01|N|O|1997-01-19|1997-02-16|1997-01-20|NONE|REG AIR|he even packages. +33349|1534|15|4|17|24404.01|0.05|0.03|N|O|1997-04-22|1997-03-27|1997-04-26|DELIVER IN PERSON|FOB|ully. blith +33350|468|98|1|11|15053.06|0.03|0.06|R|F|1994-08-15|1994-09-13|1994-09-03|COLLECT COD|AIR|ly. sly accounts use enticingly ironic, +33350|18|44|2|43|39474.43|0.09|0.04|A|F|1994-09-24|1994-10-06|1994-09-25|NONE|TRUCK|lly regular account +33350|826|27|3|8|13814.56|0.02|0.03|A|F|1994-07-24|1994-09-21|1994-08-05|NONE|REG AIR|pending platelets haggle blithel +33350|344|73|4|41|51017.94|0.03|0.01|A|F|1994-09-17|1994-10-17|1994-10-09|TAKE BACK RETURN|MAIL|usly even attainme +33350|658|90|5|28|43642.20|0.02|0.01|A|F|1994-08-10|1994-10-09|1994-09-03|DELIVER IN PERSON|REG AIR|ly ironic accounts. ironic, final asymptot +33350|1706|7|6|32|51446.40|0.03|0.04|R|F|1994-10-03|1994-10-20|1994-10-25|TAKE BACK RETURN|RAIL|nic patterns. slyly even dependencies +33350|213|41|7|14|15584.94|0.09|0.02|A|F|1994-11-01|1994-09-03|1994-11-03|NONE|REG AIR|osits. ironic deposits haggle. sly +33351|1455|73|1|50|67822.50|0.10|0.00|N|O|1997-06-26|1997-06-02|1997-07-01|COLLECT COD|AIR| packages wake carefully +33351|1694|18|2|13|20743.97|0.00|0.03|N|O|1997-08-15|1997-06-06|1997-08-17|NONE|MAIL|ong the sl +33351|960|95|3|3|5582.88|0.10|0.02|N|O|1997-06-19|1997-07-12|1997-06-26|COLLECT COD|TRUCK|s the blithely final excuses boost +33351|1005|11|4|49|44394.00|0.00|0.07|N|O|1997-07-19|1997-06-13|1997-08-05|DELIVER IN PERSON|FOB|final, regular requests. +33376|827|61|1|7|12094.74|0.06|0.04|N|O|1996-12-29|1996-12-28|1997-01-04|COLLECT COD|SHIP|ing to the furiously regular depo +33376|1126|63|2|21|21569.52|0.08|0.08|N|O|1997-01-11|1996-12-15|1997-01-28|DELIVER IN PERSON|RAIL|y even packages. slyly special dep +33377|818|85|1|33|56720.73|0.01|0.05|N|O|1995-11-23|1995-10-05|1995-12-05|NONE|RAIL|egular packages affix car +33377|1268|80|2|37|43262.62|0.04|0.08|N|O|1995-10-05|1995-09-20|1995-10-09|DELIVER IN PERSON|RAIL|ts integrate ideas. ex +33377|1034|5|3|29|27115.87|0.02|0.05|N|O|1995-10-18|1995-09-16|1995-10-23|DELIVER IN PERSON|AIR|y at the ironic, ironic packages. fluffily +33377|336|21|4|40|49453.20|0.02|0.02|N|O|1995-10-02|1995-09-03|1995-10-30|NONE|REG AIR|y ironic platelets. sl +33377|1002|3|5|49|44247.00|0.02|0.06|N|O|1995-09-27|1995-10-19|1995-10-01|TAKE BACK RETURN|RAIL|ess pinto beans. final deposits sleep. unus +33378|1857|1|1|36|63318.60|0.04|0.01|R|F|1992-06-28|1992-05-28|1992-07-28|TAKE BACK RETURN|FOB|dencies. blithely even +33378|1826|13|2|50|86391.00|0.05|0.08|R|F|1992-06-21|1992-06-15|1992-07-07|TAKE BACK RETURN|AIR|osits alongside of t +33378|1277|89|3|49|57735.23|0.10|0.03|A|F|1992-05-10|1992-07-25|1992-05-21|COLLECT COD|RAIL|ily ruthless instructions detect f +33378|1379|94|4|23|29448.51|0.01|0.08|R|F|1992-07-23|1992-07-13|1992-07-30|DELIVER IN PERSON|SHIP|ong the furiously final foxes +33378|964|67|5|4|7459.84|0.10|0.07|A|F|1992-08-21|1992-07-04|1992-09-05|DELIVER IN PERSON|SHIP|ests sleep slyly along the ironic acc +33378|1231|69|6|37|41892.51|0.08|0.04|R|F|1992-08-10|1992-06-04|1992-09-05|DELIVER IN PERSON|SHIP|ies do cajole +33378|1537|18|7|47|67610.91|0.09|0.08|R|F|1992-05-20|1992-07-17|1992-05-28|NONE|FOB|mptotes wake furiously ironi +33379|1545|26|1|16|23144.64|0.05|0.04|N|O|1998-01-24|1998-02-04|1998-02-04|DELIVER IN PERSON|REG AIR|sits haggle slyly quickly +33380|618|12|1|35|53151.35|0.03|0.08|N|O|1997-01-14|1997-02-04|1997-02-05|COLLECT COD|REG AIR|equests mold slyly i +33380|300|82|2|30|36009.00|0.03|0.03|N|O|1997-02-22|1997-01-09|1997-03-06|NONE|AIR|re fluffily along the furi +33380|957|26|3|50|92897.50|0.08|0.01|N|O|1996-11-20|1997-01-01|1996-11-27|COLLECT COD|REG AIR|oxes are across the regul +33381|1756|83|1|20|33155.00|0.04|0.01|N|O|1998-09-01|1998-10-16|1998-09-22|DELIVER IN PERSON|TRUCK|iously final packages ought t +33381|1345|46|2|26|32404.84|0.00|0.00|N|O|1998-11-02|1998-09-05|1998-11-19|NONE|RAIL|s nag among the +33381|341|26|3|46|57101.64|0.04|0.06|N|O|1998-07-23|1998-09-09|1998-08-08|TAKE BACK RETURN|SHIP|into beans s +33382|1064|35|1|46|44392.76|0.07|0.00|N|O|1997-06-13|1997-07-11|1997-06-20|TAKE BACK RETURN|AIR|y. even requests wake above +33383|811|45|1|16|27388.96|0.01|0.07|N|O|1996-12-22|1997-01-09|1997-01-15|TAKE BACK RETURN|MAIL|ic, special theodolites kindle under the +33383|392|21|2|22|28432.58|0.03|0.02|N|O|1997-01-31|1997-01-10|1997-03-02|TAKE BACK RETURN|FOB|ainst the slyly express +33383|255|56|3|23|26570.75|0.07|0.05|N|O|1997-01-26|1997-02-08|1997-02-12|NONE|TRUCK|ctions after the +33408|433|92|1|21|28002.03|0.04|0.06|N|O|1997-02-08|1997-01-26|1997-03-08|TAKE BACK RETURN|TRUCK|s; even accounts across +33408|533|64|2|24|34404.72|0.04|0.03|N|O|1997-01-17|1997-01-26|1997-02-01|TAKE BACK RETURN|RAIL|ond the fluffily pending accounts. sau +33408|787|20|3|8|13502.24|0.02|0.06|N|O|1997-01-21|1997-03-06|1997-02-12|NONE|TRUCK| the carefully silent foxe +33409|1774|17|1|18|30163.86|0.03|0.02|R|F|1992-05-19|1992-05-17|1992-06-14|DELIVER IN PERSON|MAIL| the blithely pen +33410|113|40|1|20|20262.20|0.02|0.08|A|F|1992-04-28|1992-03-20|1992-05-26|COLLECT COD|FOB|ourts cajole. furiously final +33410|1407|86|2|36|47102.40|0.03|0.08|A|F|1992-02-01|1992-04-02|1992-02-12|DELIVER IN PERSON|AIR|ove the blithely +33410|1430|9|3|28|37280.04|0.10|0.08|R|F|1992-04-24|1992-02-27|1992-05-24|TAKE BACK RETURN|RAIL| pending accoun +33411|387|44|1|7|9011.66|0.00|0.07|N|O|1998-02-02|1998-04-02|1998-02-03|DELIVER IN PERSON|AIR|aring ideas. accounts haggle blithely. qu +33411|568|69|2|40|58742.40|0.02|0.07|N|O|1998-01-17|1998-03-01|1998-02-08|DELIVER IN PERSON|TRUCK|lly special dependencies. +33411|1281|56|3|33|39015.24|0.00|0.00|N|O|1998-02-25|1998-03-16|1998-03-03|NONE|REG AIR|ing to the accounts. furiously bold de +33411|1549|90|4|48|69625.92|0.08|0.05|N|O|1998-02-01|1998-04-06|1998-03-01|COLLECT COD|REG AIR|hin accounts c +33411|240|22|5|39|44469.36|0.07|0.01|N|O|1998-04-04|1998-03-27|1998-04-19|TAKE BACK RETURN|AIR|y slyly final +33412|1215|53|1|46|51345.66|0.06|0.08|N|O|1997-03-19|1997-02-20|1997-04-14|DELIVER IN PERSON|FOB| regular packages. carefully regula +33412|1873|60|2|10|17748.70|0.01|0.06|N|O|1997-04-20|1997-03-03|1997-05-04|TAKE BACK RETURN|TRUCK|uickly special packages nag evenly regu +33413|1283|21|1|4|4737.12|0.00|0.07|N|O|1996-09-07|1996-07-25|1996-09-11|COLLECT COD|FOB|- always s +33413|1905|94|2|39|70469.10|0.02|0.06|N|O|1996-07-15|1996-08-26|1996-07-30|NONE|AIR|aggle blithely above the p +33413|36|37|3|5|4680.15|0.09|0.05|N|O|1996-07-06|1996-09-18|1996-07-18|NONE|RAIL|es. special de +33413|727|28|4|16|26043.52|0.01|0.03|N|O|1996-07-02|1996-07-23|1996-07-18|DELIVER IN PERSON|MAIL|rthogs cajole carefully. +33414|617|18|1|2|3035.22|0.05|0.06|R|F|1992-02-20|1992-03-15|1992-03-07|COLLECT COD|TRUCK|odolites boost quickly accounts +33414|890|90|2|23|41190.47|0.02|0.00|A|F|1992-04-14|1992-04-26|1992-05-10|DELIVER IN PERSON|SHIP|ronic pinto beans slee +33414|174|1|3|41|44040.97|0.05|0.01|A|F|1992-05-02|1992-03-15|1992-05-03|TAKE BACK RETURN|RAIL|ecial deposits. bold, ir +33414|1632|56|4|27|41408.01|0.05|0.05|R|F|1992-03-29|1992-03-28|1992-04-04|TAKE BACK RETURN|MAIL|e even, unusual +33415|1852|39|1|19|33323.15|0.05|0.02|A|F|1993-04-13|1993-04-12|1993-05-12|COLLECT COD|REG AIR|regular accounts engage according to +33415|228|83|2|24|27077.28|0.07|0.06|R|F|1993-05-11|1993-03-30|1993-05-30|DELIVER IN PERSON|AIR|es detect busily ironic depend +33440|1871|15|1|2|3545.74|0.01|0.06|N|O|1998-06-30|1998-07-24|1998-07-24|TAKE BACK RETURN|AIR|silent accounts around the +33440|170|97|2|48|51368.16|0.04|0.00|N|O|1998-07-15|1998-07-07|1998-07-28|NONE|SHIP|y unusual deposits cajole furiously amo +33440|1064|35|3|40|38602.40|0.07|0.06|N|O|1998-06-24|1998-06-12|1998-07-03|COLLECT COD|REG AIR|ly across the unusu +33440|510|1|4|37|52188.87|0.04|0.04|N|O|1998-08-07|1998-06-23|1998-09-03|COLLECT COD|MAIL| special, unusual requests ca +33440|1472|90|5|30|41204.10|0.01|0.02|N|O|1998-05-22|1998-07-02|1998-05-24|NONE|REG AIR|t the pinto beans nag furiously brave foxe +33441|1833|34|1|37|64188.71|0.01|0.03|N|O|1997-06-03|1997-04-23|1997-06-12|DELIVER IN PERSON|MAIL|fluffily accord +33441|1544|45|2|15|21683.10|0.06|0.06|N|O|1997-06-24|1997-04-23|1997-07-09|DELIVER IN PERSON|AIR|al packages ought to cajole unusua +33442|962|31|1|16|29807.36|0.03|0.07|N|O|1996-07-11|1996-08-29|1996-07-27|COLLECT COD|TRUCK|ly final sauternes. platelets cajole. +33442|201|56|2|25|27530.00|0.04|0.04|N|O|1996-07-28|1996-08-28|1996-08-24|TAKE BACK RETURN|RAIL| silent dolphins. bli +33442|381|82|3|47|60224.86|0.09|0.02|N|O|1996-08-17|1996-09-13|1996-08-22|DELIVER IN PERSON|MAIL|y along the furiously regu +33442|1317|32|4|11|13401.41|0.10|0.00|N|O|1996-07-15|1996-10-05|1996-08-09|NONE|RAIL|otes run blithely among t +33442|815|16|5|36|61769.16|0.08|0.07|N|O|1996-10-10|1996-09-26|1996-10-21|COLLECT COD|FOB|arefully ironic dolphin +33442|1572|73|6|29|42733.53|0.02|0.06|N|O|1996-07-27|1996-10-05|1996-08-08|DELIVER IN PERSON|MAIL|into beans haggle slowly even accounts +33442|587|78|7|7|10413.06|0.10|0.01|N|O|1996-10-10|1996-09-24|1996-11-01|NONE|REG AIR|posits through the final foxes sleep +33443|1472|90|1|45|61806.15|0.07|0.08|R|F|1992-08-17|1992-07-17|1992-09-15|NONE|TRUCK|unts haggle carefull +33444|231|32|1|45|50905.35|0.03|0.05|A|F|1992-11-21|1992-11-15|1992-11-24|COLLECT COD|FOB|are final, sly p +33444|320|49|2|12|14643.84|0.03|0.04|R|F|1993-01-09|1992-11-13|1993-01-27|NONE|RAIL|uses. even, specia +33444|738|35|3|16|26219.68|0.09|0.08|A|F|1992-11-29|1992-12-07|1992-12-21|NONE|FOB| slyly special requests wake +33444|1300|12|4|38|45649.40|0.08|0.08|A|F|1992-12-10|1992-12-20|1992-12-24|TAKE BACK RETURN|RAIL|ully ironic requests cajole fu +33444|1298|36|5|25|29982.25|0.01|0.01|R|F|1992-11-13|1992-12-04|1992-12-07|COLLECT COD|TRUCK|ests cajole enticingly express p +33445|1242|17|1|44|50302.56|0.09|0.08|R|F|1992-08-29|1992-10-19|1992-09-15|TAKE BACK RETURN|AIR|osits. blithe +33445|1430|48|2|49|65240.07|0.01|0.04|A|F|1992-08-17|1992-09-28|1992-08-26|COLLECT COD|SHIP|g to the ironic, bold packages. qu +33445|487|17|3|14|19424.72|0.07|0.03|A|F|1992-11-09|1992-10-13|1992-12-03|TAKE BACK RETURN|AIR|thely. ideas haggle carefully aft +33445|423|11|4|25|33085.50|0.09|0.03|A|F|1992-09-01|1992-09-09|1992-09-08|COLLECT COD|TRUCK|the pending instructions sno +33445|1327|66|5|42|51589.44|0.00|0.03|R|F|1992-10-09|1992-09-03|1992-11-03|TAKE BACK RETURN|TRUCK|uests eat regular +33445|194|95|6|29|31731.51|0.02|0.05|R|F|1992-11-26|1992-09-03|1992-12-25|COLLECT COD|SHIP|uriously even foxes +33446|864|31|1|22|38826.92|0.02|0.07|A|F|1993-11-10|1993-10-03|1993-12-04|COLLECT COD|FOB|out the special, regular foxes +33446|1944|89|2|42|77529.48|0.10|0.04|R|F|1993-09-22|1993-10-20|1993-10-20|COLLECT COD|TRUCK|the final reques +33446|1937|82|3|30|55167.90|0.00|0.06|A|F|1993-09-26|1993-09-02|1993-10-12|DELIVER IN PERSON|SHIP|ntegrate furiously above the quic +33447|130|57|1|29|29873.77|0.07|0.08|N|O|1998-01-04|1998-01-27|1998-01-30|NONE|TRUCK|egular requests. finally ironic dolph +33447|1370|9|2|24|30512.88|0.10|0.04|N|O|1997-11-10|1997-12-09|1997-11-27|TAKE BACK RETURN|FOB| blithely above the furiously ironi +33447|1028|34|3|44|40876.88|0.04|0.04|N|O|1998-01-04|1998-01-21|1998-01-25|TAKE BACK RETURN|MAIL|the fluffily ironic packages. sly pack +33472|578|79|1|32|47314.24|0.07|0.00|N|O|1996-05-29|1996-05-20|1996-06-22|COLLECT COD|TRUCK|elets. quick +33472|1887|88|2|7|12522.16|0.10|0.07|N|O|1996-08-02|1996-05-30|1996-08-28|COLLECT COD|MAIL| deposits; fox +33472|449|50|3|17|22940.48|0.02|0.04|N|O|1996-04-30|1996-05-13|1996-05-08|TAKE BACK RETURN|REG AIR| above the slyly ironic pac +33472|1826|13|4|34|58745.88|0.04|0.00|N|O|1996-06-28|1996-05-31|1996-07-02|DELIVER IN PERSON|AIR|usual accounts. final ideas boost furious +33472|1721|64|5|3|4868.16|0.04|0.05|N|O|1996-06-22|1996-05-25|1996-07-02|COLLECT COD|TRUCK| regular, +33472|776|73|6|1|1676.77|0.07|0.03|N|O|1996-05-18|1996-05-29|1996-05-29|NONE|MAIL|express pin +33473|1656|39|1|35|54517.75|0.00|0.05|R|F|1995-01-23|1995-03-17|1995-01-29|DELIVER IN PERSON|AIR|s around the blithely +33474|204|59|1|23|25396.60|0.02|0.07|A|F|1994-12-03|1994-10-02|1994-12-06|TAKE BACK RETURN|REG AIR|r theodolites cajole. sheaves wake +33474|282|64|2|23|27192.44|0.03|0.07|A|F|1994-11-10|1994-10-10|1994-12-02|DELIVER IN PERSON|SHIP|g the express packages. quickly final +33474|1674|98|3|12|18908.04|0.07|0.02|A|F|1994-12-02|1994-10-14|1994-12-03|TAKE BACK RETURN|RAIL|d platelets +33475|901|2|1|21|37839.90|0.07|0.08|N|O|1996-08-15|1996-07-03|1996-08-16|TAKE BACK RETURN|AIR| regular instructions print after the ruthl +33475|1414|32|2|46|60508.86|0.09|0.01|N|O|1996-08-20|1996-06-27|1996-08-23|COLLECT COD|REG AIR|yly bold requests around the ins +33475|1470|71|3|40|54858.80|0.01|0.02|N|O|1996-06-24|1996-07-07|1996-06-25|TAKE BACK RETURN|SHIP|packages haggle c +33475|1752|95|4|32|52920.00|0.04|0.00|N|O|1996-06-03|1996-07-22|1996-06-19|COLLECT COD|TRUCK|ic dependencies use quickly above the care +33475|623|86|5|27|41137.74|0.01|0.08|N|O|1996-08-22|1996-07-01|1996-09-04|COLLECT COD|RAIL| foxes are abov +33475|1521|2|6|27|38408.04|0.01|0.06|N|O|1996-06-27|1996-06-16|1996-07-26|COLLECT COD|MAIL|ithely in place of the fin +33476|1024|30|1|36|33300.72|0.02|0.04|A|F|1995-02-02|1995-03-21|1995-02-28|COLLECT COD|FOB|lar foxes sleep quie +33476|999|2|2|27|51299.73|0.01|0.07|R|F|1995-01-30|1995-02-24|1995-02-13|DELIVER IN PERSON|RAIL|slyly ironic a +33476|900|67|3|37|66633.30|0.03|0.07|A|F|1995-01-10|1995-03-20|1995-01-27|DELIVER IN PERSON|AIR|blithely even instructions haggle. expr +33476|799|96|4|41|69691.39|0.01|0.03|A|F|1995-03-08|1995-02-25|1995-03-25|TAKE BACK RETURN|FOB|nag idly according to the fi +33477|1189|26|1|3|3270.54|0.06|0.02|R|F|1993-02-09|1992-12-24|1993-03-06|NONE|MAIL|d carefully according t +33477|454|13|2|25|33861.25|0.05|0.06|R|F|1992-12-03|1992-11-30|1992-12-04|COLLECT COD|AIR|he quickly regular foxes. sl +33477|978|13|3|7|13152.79|0.09|0.01|R|F|1992-10-27|1992-12-10|1992-11-26|COLLECT COD|REG AIR|ing ideas are fluffily +33477|1703|88|4|18|28884.60|0.09|0.03|A|F|1992-11-06|1993-01-03|1992-11-16|NONE|REG AIR|s wake. furiously +33477|1057|93|5|17|16286.85|0.10|0.02|A|F|1993-01-22|1993-01-03|1993-01-23|DELIVER IN PERSON|SHIP|y carefully +33477|1394|71|6|4|5181.56|0.05|0.04|R|F|1993-01-17|1993-01-08|1993-02-12|COLLECT COD|RAIL|uickly unusual deposits. final, silent d +33477|153|80|7|12|12637.80|0.00|0.02|R|F|1993-02-04|1992-12-14|1993-02-27|NONE|AIR|ructions. quickly re +33478|110|37|1|6|6060.66|0.01|0.06|R|F|1993-08-05|1993-08-02|1993-08-18|TAKE BACK RETURN|REG AIR|s wake after the slyly expre +33478|1698|22|2|41|65587.29|0.06|0.00|R|F|1993-09-08|1993-07-18|1993-10-07|TAKE BACK RETURN|REG AIR| requests. pinto beans haggle blithel +33478|1606|30|3|43|64826.80|0.01|0.08|A|F|1993-10-11|1993-07-24|1993-10-20|DELIVER IN PERSON|SHIP|jole among the express deposits. fin +33479|822|22|1|24|41347.68|0.09|0.02|R|F|1992-11-12|1992-10-27|1992-11-28|NONE|AIR|y express i +33479|360|17|2|5|6301.80|0.09|0.05|A|F|1992-11-10|1992-11-04|1992-11-22|COLLECT COD|AIR|ly silent pearls. even instructions enga +33479|1836|37|3|13|22591.79|0.06|0.04|R|F|1992-09-20|1992-10-23|1992-10-11|COLLECT COD|MAIL|the fluffily pending pinto be +33479|1421|100|4|45|59508.90|0.04|0.07|R|F|1992-12-30|1992-11-07|1993-01-03|DELIVER IN PERSON|FOB|ly ironic dependencies wake. packages boos +33479|1172|73|5|28|30048.76|0.03|0.08|A|F|1992-12-25|1992-11-04|1993-01-01|DELIVER IN PERSON|REG AIR|lar dolphins sleep. reg +33479|986|87|6|39|73592.22|0.08|0.00|A|F|1992-12-28|1992-12-09|1992-12-31|NONE|REG AIR|nt fluffily alongside of the carefu +33479|1449|50|7|18|24307.92|0.09|0.02|R|F|1992-11-07|1992-11-11|1992-11-22|TAKE BACK RETURN|FOB|ly: theodolites haggle quickly. furiously e +33504|123|2|1|2|2046.24|0.01|0.07|N|O|1998-07-18|1998-07-17|1998-08-13|TAKE BACK RETURN|RAIL|s. courts against the sl +33504|325|26|2|9|11027.88|0.09|0.00|N|O|1998-08-05|1998-07-29|1998-08-19|DELIVER IN PERSON|SHIP|sly along th +33505|528|29|1|41|58569.32|0.08|0.08|R|F|1994-01-22|1993-11-12|1994-02-01|COLLECT COD|AIR|lly regular accounts are according +33505|1808|9|2|12|20517.60|0.10|0.03|A|F|1993-10-21|1993-12-20|1993-10-27|COLLECT COD|FOB|usual deposits. spe +33505|495|54|3|39|54424.11|0.05|0.04|A|F|1993-12-22|1993-11-29|1993-12-23|NONE|SHIP|ronic grouches sleep a +33505|1701|44|4|15|24040.50|0.00|0.05|A|F|1993-11-19|1993-11-10|1993-12-10|TAKE BACK RETURN|FOB|ose dolphins. rea +33505|1028|34|5|33|30657.66|0.04|0.02|R|F|1993-12-13|1993-11-24|1994-01-05|DELIVER IN PERSON|REG AIR|se quickly fluffily even package +33505|207|35|6|14|15500.80|0.06|0.08|R|F|1993-10-18|1993-11-06|1993-11-01|DELIVER IN PERSON|TRUCK| to the silent asymptotes. bold +33506|1694|18|1|32|51062.08|0.02|0.06|N|O|1997-11-27|1997-12-26|1997-12-12|COLLECT COD|FOB|round the quickly regular req +33506|582|13|2|21|31134.18|0.01|0.03|N|O|1998-02-11|1998-01-31|1998-02-18|NONE|RAIL|uffily unusual theodo +33506|1822|52|3|39|67228.98|0.00|0.04|N|O|1997-12-08|1998-02-12|1997-12-16|COLLECT COD|REG AIR|ly even pinto beans doub +33506|213|41|4|43|47868.03|0.01|0.08|N|O|1998-01-05|1998-01-16|1998-01-29|NONE|FOB|fully silent deposits cajole besides the fu +33506|1214|26|5|18|20073.78|0.10|0.00|N|O|1998-03-02|1998-01-27|1998-03-15|DELIVER IN PERSON|MAIL|ges wake above the requests. clos +33506|1167|4|6|17|18158.72|0.02|0.06|N|O|1998-03-13|1998-02-13|1998-03-21|NONE|FOB|longside of the idle pinto +33506|1506|7|7|37|52077.50|0.00|0.06|N|O|1997-11-24|1998-01-07|1997-12-23|NONE|MAIL|are daringly +33507|269|51|1|26|30400.76|0.06|0.01|R|F|1992-04-28|1992-05-08|1992-05-12|TAKE BACK RETURN|RAIL|lites. pending pinto beans boost slyly. +33507|1741|42|2|47|77208.78|0.02|0.02|A|F|1992-06-07|1992-04-05|1992-06-23|NONE|TRUCK|ously final deposits sleep +33507|1171|8|3|29|31092.93|0.00|0.05|A|F|1992-03-26|1992-05-14|1992-03-30|NONE|SHIP|carefully even idea +33508|1249|24|1|38|43709.12|0.08|0.08|N|O|1996-03-13|1996-03-01|1996-03-22|NONE|FOB|boost fluffily? expr +33509|1452|31|1|45|60905.25|0.06|0.00|A|F|1993-01-27|1993-01-18|1993-02-16|COLLECT COD|FOB|s are fluffily fluffily re +33510|1643|44|1|42|64874.88|0.04|0.05|N|O|1996-01-27|1996-01-28|1996-02-26|NONE|AIR| carefully silent deposits cajole a +33510|131|10|2|25|25778.25|0.01|0.07|N|O|1996-04-02|1996-02-10|1996-04-22|COLLECT COD|TRUCK|deas detect carefully after the ironic, re +33510|1015|51|3|39|35724.39|0.08|0.08|N|O|1996-03-08|1996-01-27|1996-03-13|COLLECT COD|MAIL| furiously. furiously ironic pac +33510|683|46|4|37|58596.16|0.02|0.08|N|O|1996-03-31|1996-03-01|1996-04-18|TAKE BACK RETURN|RAIL|counts. furiously regular packages among th +33510|674|37|5|29|45665.43|0.01|0.01|N|O|1995-12-17|1996-02-23|1996-01-02|TAKE BACK RETURN|TRUCK|le unusual, unusual +33510|32|8|6|6|5592.18|0.10|0.02|N|O|1996-01-20|1996-02-13|1996-02-04|DELIVER IN PERSON|MAIL|ly pending accounts. blithely final dep +33511|1822|9|1|10|17238.20|0.00|0.04|N|O|1998-04-30|1998-04-13|1998-05-26|DELIVER IN PERSON|RAIL|to beans among the quickly special pi +33511|1039|75|2|16|15040.48|0.07|0.07|N|O|1998-05-09|1998-03-29|1998-05-31|TAKE BACK RETURN|SHIP|he quickly final accounts. asymptotes wak +33511|1049|20|3|50|47502.00|0.07|0.06|N|O|1998-03-03|1998-04-12|1998-03-28|TAKE BACK RETURN|MAIL|nusual pinto beans cajole furiou +33511|1910|55|4|42|76100.22|0.01|0.05|N|O|1998-04-25|1998-04-05|1998-05-23|DELIVER IN PERSON|SHIP| final theodolites. fluffil +33511|1084|85|5|38|37433.04|0.06|0.03|N|O|1998-06-06|1998-04-04|1998-06-25|DELIVER IN PERSON|FOB|ipliers. realms thr +33511|492|80|6|5|6962.45|0.07|0.04|N|O|1998-04-10|1998-03-31|1998-05-02|COLLECT COD|TRUCK|hins; furiously pending id +33536|1837|24|1|1|1738.83|0.09|0.07|N|O|1996-07-14|1996-06-21|1996-07-26|TAKE BACK RETURN|MAIL|e slyly: doggedly +33536|601|33|2|24|36038.40|0.04|0.05|N|O|1996-07-20|1996-07-03|1996-08-19|NONE|MAIL|-- furiously regular instructions kindl +33536|1400|1|3|10|13014.00|0.07|0.06|N|O|1996-08-04|1996-08-19|1996-08-31|DELIVER IN PERSON|MAIL|posits are until the regu +33536|1645|28|4|30|46399.20|0.10|0.00|N|O|1996-07-19|1996-07-06|1996-08-10|NONE|TRUCK|the fluffily regul +33537|155|82|1|5|5275.75|0.05|0.05|R|F|1993-10-13|1993-10-16|1993-10-29|COLLECT COD|TRUCK| deposits. f +33537|731|64|2|14|22844.22|0.04|0.01|R|F|1993-11-04|1993-11-02|1993-11-26|COLLECT COD|AIR|quickly express warhorse +33537|1544|85|3|39|56376.06|0.04|0.06|A|F|1993-10-30|1993-10-31|1993-11-03|COLLECT COD|AIR|de of the boldly ironic +33537|708|73|4|11|17695.70|0.02|0.06|R|F|1993-08-16|1993-09-16|1993-08-17|NONE|AIR|es sleep blithely according to the final p +33537|1855|42|5|9|15811.65|0.08|0.00|R|F|1993-11-22|1993-09-24|1993-12-17|COLLECT COD|SHIP|ole. quickly regular deposits are regul +33537|1753|80|6|4|6619.00|0.04|0.08|A|F|1993-08-24|1993-09-26|1993-09-13|TAKE BACK RETURN|FOB|r platelets run slyly alo +33538|1769|70|1|10|16707.60|0.10|0.02|N|O|1996-08-28|1996-10-17|1996-08-29|NONE|AIR|ly furiously special as +33538|1923|68|2|2|3649.84|0.02|0.05|N|O|1996-11-29|1996-11-09|1996-12-20|DELIVER IN PERSON|REG AIR|onic accounts h +33539|1830|60|1|23|39832.09|0.03|0.01|N|O|1996-06-21|1996-05-23|1996-07-17|COLLECT COD|SHIP|ely stealthy somas cajole. +33539|122|23|2|42|42929.04|0.09|0.08|N|O|1996-04-12|1996-05-20|1996-05-01|COLLECT COD|AIR|slyly silent foxes around the +33540|473|74|1|28|38457.16|0.01|0.03|N|O|1995-10-06|1995-07-19|1995-11-04|NONE|REG AIR|ular requests are ironi +33540|213|14|2|2|2226.42|0.03|0.02|N|O|1995-09-08|1995-07-24|1995-09-27|COLLECT COD|AIR|ages. even +33540|75|51|3|1|975.07|0.07|0.01|N|F|1995-06-10|1995-08-30|1995-06-29|TAKE BACK RETURN|RAIL|ash. bold, bold requests +33540|1538|59|4|26|37427.78|0.08|0.06|N|O|1995-07-27|1995-07-20|1995-07-28|COLLECT COD|RAIL|ependencies pro +33540|1251|52|5|45|51851.25|0.07|0.06|N|O|1995-07-29|1995-08-17|1995-08-16|TAKE BACK RETURN|TRUCK|eposits affix. furiously final platelets +33540|493|81|6|35|48772.15|0.06|0.05|N|O|1995-06-21|1995-08-08|1995-06-24|COLLECT COD|FOB|y. blithely stealthy +33540|269|51|7|9|10523.34|0.09|0.03|N|O|1995-06-18|1995-08-29|1995-07-02|DELIVER IN PERSON|REG AIR|encies wake fu +33541|887|21|1|42|75090.96|0.01|0.03|A|F|1992-09-03|1992-09-06|1992-09-29|NONE|RAIL|ly bold accounts. +33541|179|58|2|25|26979.25|0.02|0.06|A|F|1992-09-25|1992-08-28|1992-10-20|COLLECT COD|FOB|lar deposits can wake furious +33541|882|83|3|34|60617.92|0.02|0.04|R|F|1992-08-02|1992-07-29|1992-08-20|DELIVER IN PERSON|SHIP|ly ironic a +33541|1257|32|4|25|28956.25|0.01|0.00|A|F|1992-08-28|1992-09-06|1992-09-24|DELIVER IN PERSON|TRUCK|g, ironic asymptotes. carefully bold fo +33541|1259|34|5|32|37128.00|0.04|0.08|R|F|1992-07-20|1992-08-15|1992-08-12|COLLECT COD|RAIL|blithely ex +33541|1538|59|6|4|5758.12|0.09|0.05|A|F|1992-06-28|1992-08-08|1992-07-22|NONE|SHIP|ess instructions. package +33542|813|13|1|39|66838.59|0.04|0.02|N|O|1996-03-19|1996-03-12|1996-03-22|TAKE BACK RETURN|AIR|eans past the furious +33542|556|87|2|15|21848.25|0.02|0.07|N|O|1996-01-06|1996-03-08|1996-01-19|DELIVER IN PERSON|SHIP|nic instructions arou +33542|925|60|3|42|76688.64|0.05|0.08|N|O|1996-01-21|1996-02-11|1996-02-19|COLLECT COD|AIR|ly beside the final, fluffy requests. ir +33542|1285|60|4|24|28470.72|0.05|0.05|N|O|1996-03-12|1996-02-13|1996-04-11|DELIVER IN PERSON|MAIL|unts. slyly ironic deposits use carefully. +33542|516|77|5|50|70825.50|0.05|0.00|N|O|1995-12-25|1996-02-06|1996-01-11|TAKE BACK RETURN|MAIL| theodolites! fluf +33543|1946|79|1|4|7391.76|0.05|0.00|N|O|1998-04-03|1998-05-14|1998-04-13|TAKE BACK RETURN|RAIL|ly about t +33543|1512|33|2|31|43818.81|0.07|0.03|N|O|1998-04-09|1998-05-19|1998-04-14|NONE|RAIL|ounts. busily iro +33543|1144|17|3|41|42850.74|0.06|0.02|N|O|1998-05-09|1998-04-22|1998-06-01|TAKE BACK RETURN|RAIL|bold pinto beans. blithely iro +33543|36|12|4|12|11232.36|0.08|0.01|N|O|1998-05-27|1998-04-28|1998-06-10|DELIVER IN PERSON|SHIP|fily regular asymptotes detect. i +33568|1835|36|1|42|72946.86|0.02|0.01|A|F|1992-10-29|1992-10-19|1992-11-07|COLLECT COD|RAIL| to the fur +33568|1860|61|2|46|81045.56|0.04|0.07|R|F|1992-10-10|1992-09-17|1992-10-21|TAKE BACK RETURN|FOB|inments cajole +33568|876|43|3|8|14214.96|0.06|0.07|R|F|1992-10-27|1992-09-20|1992-11-13|TAKE BACK RETURN|MAIL|counts along +33569|1706|7|1|13|20900.10|0.00|0.05|R|F|1994-11-25|1994-10-24|1994-12-12|NONE|MAIL| wake slyly pending pains. carefully +33569|1301|16|2|9|10820.70|0.04|0.00|R|F|1994-09-06|1994-10-09|1994-09-07|DELIVER IN PERSON|SHIP|packages use. slyly permanent th +33569|1239|40|3|20|22804.60|0.03|0.08|A|F|1994-10-24|1994-11-27|1994-10-26|COLLECT COD|MAIL| furiously bold dolphins. accounts hind +33569|1093|94|4|50|49704.50|0.10|0.00|A|F|1994-09-19|1994-10-20|1994-10-08|NONE|REG AIR|lphins. slyly special pinto beans +33570|646|40|1|12|18559.68|0.08|0.05|R|F|1992-12-30|1993-03-15|1993-01-17|DELIVER IN PERSON|REG AIR|fully against the slyly pending pla +33570|1012|13|2|16|14608.16|0.01|0.01|R|F|1993-03-06|1993-03-17|1993-03-31|NONE|MAIL|e even depo +33570|74|100|3|15|14611.05|0.06|0.05|A|F|1993-01-12|1993-03-03|1993-01-24|TAKE BACK RETURN|SHIP|ites. carefully express +33570|454|42|4|22|29797.90|0.04|0.05|R|F|1993-03-14|1993-02-17|1993-04-12|NONE|RAIL| fluffily e +33570|164|43|5|39|41502.24|0.04|0.07|R|F|1993-04-11|1993-02-09|1993-05-07|TAKE BACK RETURN|TRUCK|ages. final, pending deposits poach sly +33570|762|59|6|47|78149.72|0.09|0.01|R|F|1993-01-16|1993-01-22|1993-02-12|COLLECT COD|SHIP|of the fina +33570|1159|60|7|2|2120.30|0.05|0.07|R|F|1993-03-25|1993-02-25|1993-03-27|TAKE BACK RETURN|RAIL|fily bold requests wake. slyly +33571|61|37|1|18|17299.08|0.04|0.07|N|O|1995-11-20|1996-01-04|1995-12-15|NONE|MAIL|ptotes affix regularly. s +33572|1376|77|1|12|15328.44|0.01|0.06|R|F|1992-10-09|1992-08-23|1992-11-06|TAKE BACK RETURN|SHIP|t the slyly unusual ide +33572|1253|91|2|39|45015.75|0.04|0.05|A|F|1992-07-07|1992-08-28|1992-07-20|COLLECT COD|AIR|longside of the even, special ideas sl +33572|792|89|3|21|35548.59|0.05|0.07|R|F|1992-07-27|1992-08-04|1992-08-06|COLLECT COD|REG AIR|apades. unusual, unusual accounts +33572|476|6|4|38|52305.86|0.09|0.02|R|F|1992-08-19|1992-09-10|1992-08-30|TAKE BACK RETURN|RAIL|tes. even accou +33572|1040|76|5|29|27290.16|0.00|0.01|A|F|1992-10-30|1992-08-21|1992-11-29|COLLECT COD|TRUCK|al theodolites haggle slyly. blithely pen +33572|1251|63|6|20|23045.00|0.07|0.00|R|F|1992-08-12|1992-09-12|1992-08-27|COLLECT COD|AIR|he final, unusual accounts. requests do +33572|1312|27|7|23|27906.13|0.09|0.07|R|F|1992-08-01|1992-09-23|1992-08-25|TAKE BACK RETURN|RAIL|ly special esc +33573|532|63|1|26|37245.78|0.01|0.04|A|F|1993-12-07|1993-11-21|1993-12-09|COLLECT COD|REG AIR|ockey players doubt furiously. ironi +33573|1600|81|2|11|16517.60|0.02|0.08|A|F|1993-10-09|1993-12-22|1993-10-15|DELIVER IN PERSON|FOB|carefully regular packages. quickly even p +33573|461|20|3|41|55819.86|0.07|0.01|R|F|1993-12-09|1993-11-11|1993-12-19|TAKE BACK RETURN|SHIP|eposits cajole closely careful +33573|1633|16|4|18|27623.34|0.08|0.00|R|F|1993-12-20|1993-12-05|1994-01-06|TAKE BACK RETURN|FOB|beans cajole ironic, +33573|505|66|5|29|40759.50|0.00|0.08|R|F|1993-10-23|1994-01-02|1993-10-29|COLLECT COD|SHIP|sly bold dinos sleep between the +33574|1489|90|1|1|1390.48|0.05|0.08|N|O|1996-11-22|1996-10-26|1996-12-16|TAKE BACK RETURN|REG AIR|unusual asymptotes. slyly re +33574|1002|73|2|49|44247.00|0.05|0.07|N|O|1996-10-19|1996-11-10|1996-11-16|TAKE BACK RETURN|REG AIR|xcuses. blithely even +33574|1928|61|3|26|47577.92|0.07|0.07|N|O|1996-11-02|1996-10-11|1996-11-28|TAKE BACK RETURN|FOB|y around the b +33574|189|68|4|29|31586.22|0.05|0.02|N|O|1996-11-16|1996-09-22|1996-12-01|DELIVER IN PERSON|TRUCK|ers sleep according to the blithely reg +33574|924|25|5|33|60222.36|0.00|0.08|N|O|1996-12-17|1996-09-25|1997-01-01|TAKE BACK RETURN|TRUCK|ns. furiously ironic deposits are quickly. +33575|339|24|1|43|53291.19|0.04|0.07|R|F|1993-08-13|1993-08-04|1993-08-22|DELIVER IN PERSON|AIR|lithely final theodolites. furio +33600|1532|53|1|42|60208.26|0.05|0.03|A|F|1994-01-19|1993-12-28|1994-02-11|DELIVER IN PERSON|REG AIR|usly ironic theodolites integrate sly +33600|272|100|2|32|37512.64|0.05|0.08|R|F|1993-12-27|1993-12-16|1994-01-05|TAKE BACK RETURN|AIR| close accounts caj +33601|932|1|1|12|21995.16|0.01|0.01|N|O|1996-02-18|1996-02-29|1996-03-10|NONE|TRUCK|ns haggle +33601|1395|96|2|5|6481.95|0.07|0.05|N|O|1996-01-24|1996-03-04|1996-01-31|NONE|RAIL|osits. regular, +33601|1239|77|3|45|51310.35|0.08|0.08|N|O|1996-01-23|1996-03-15|1996-02-06|DELIVER IN PERSON|RAIL|blithely. packag +33602|217|99|1|2|2234.42|0.03|0.02|N|O|1998-09-30|1998-08-10|1998-10-29|TAKE BACK RETURN|SHIP|al packages. boldly regular accou +33602|1868|12|2|44|77873.84|0.05|0.05|N|O|1998-07-09|1998-09-03|1998-08-05|NONE|SHIP|arefully bold requests boost fur +33603|1297|98|1|29|34750.41|0.09|0.03|R|F|1992-04-16|1992-04-14|1992-05-14|DELIVER IN PERSON|REG AIR|ld excuses above the speci +33603|424|83|2|4|5297.68|0.05|0.00|A|F|1992-05-24|1992-04-26|1992-06-01|NONE|RAIL|ages. slowly final inst +33604|228|10|1|40|45128.80|0.06|0.00|N|O|1995-12-13|1995-10-28|1995-12-23|DELIVER IN PERSON|MAIL|e silent, special deposits. fluffily f +33604|430|31|2|24|31930.32|0.03|0.03|N|O|1995-09-02|1995-11-07|1995-09-08|DELIVER IN PERSON|SHIP|usly special acc +33604|1469|70|3|12|16445.52|0.09|0.08|N|O|1995-12-02|1995-10-17|1995-12-31|COLLECT COD|FOB|. slyly final +33605|1955|100|1|22|40852.90|0.09|0.03|R|F|1992-06-03|1992-05-23|1992-07-01|NONE|TRUCK|mptotes wake! slyly bold r +33605|121|48|2|19|19401.28|0.05|0.08|R|F|1992-06-10|1992-06-16|1992-06-11|COLLECT COD|MAIL|eposits haggle quickly. fin +33605|1049|85|3|3|2850.12|0.09|0.00|A|F|1992-07-30|1992-05-08|1992-08-28|COLLECT COD|REG AIR|ironic packages wake quick +33605|1356|71|4|26|32691.10|0.09|0.02|A|F|1992-04-25|1992-06-21|1992-05-09|NONE|RAIL|pending foxes around the permanent +33605|174|75|5|18|19335.06|0.08|0.06|A|F|1992-07-08|1992-06-24|1992-08-02|COLLECT COD|AIR|ccounts nag blithely. express instructio +33605|1211|12|6|10|11122.10|0.00|0.04|R|F|1992-04-15|1992-05-04|1992-04-21|DELIVER IN PERSON|SHIP|quickly pending p +33606|1213|14|1|27|30083.67|0.04|0.06|R|F|1992-03-21|1992-04-13|1992-03-24|TAKE BACK RETURN|AIR|old excuses haggle eve +33607|1226|64|1|26|29307.72|0.09|0.01|N|O|1996-03-28|1996-05-04|1996-04-25|NONE|SHIP|al, unusual theodo +33607|1466|84|2|21|28716.66|0.03|0.04|N|O|1996-06-19|1996-06-14|1996-07-07|DELIVER IN PERSON|RAIL|ost. furiously final foxes maintai +33607|302|31|3|6|7213.80|0.00|0.02|N|O|1996-04-21|1996-05-19|1996-05-18|COLLECT COD|REG AIR|nding accounts. unusual platelets wake. +33607|348|33|4|20|24966.80|0.09|0.02|N|O|1996-04-03|1996-04-27|1996-04-16|NONE|RAIL|eside the carefully regular accou +33607|1326|65|5|8|9818.56|0.08|0.01|N|O|1996-04-21|1996-06-13|1996-05-12|NONE|FOB| blithely unusual warhorses. regular Tires +33607|1745|30|6|38|62576.12|0.00|0.04|N|O|1996-06-14|1996-06-18|1996-07-02|TAKE BACK RETURN|TRUCK| regular pa +33632|1468|69|1|50|68473.00|0.00|0.08|R|F|1993-05-09|1993-04-28|1993-05-11|NONE|FOB|packages nag carefully. express pack +33633|291|46|1|7|8339.03|0.00|0.03|N|O|1996-09-25|1996-10-25|1996-10-18|NONE|FOB| excuses use carefully. idly regular acco +33633|15|41|2|43|39345.43|0.02|0.07|N|O|1996-09-06|1996-11-07|1996-09-21|NONE|SHIP|nto beans are slyly since the +33633|1979|24|3|6|11285.82|0.02|0.03|N|O|1996-11-01|1996-10-30|1996-11-03|TAKE BACK RETURN|RAIL|ully ironic accounts. pi +33633|1040|76|4|10|9410.40|0.01|0.00|N|O|1996-10-11|1996-10-02|1996-10-16|DELIVER IN PERSON|AIR|es are care +33633|1046|52|5|45|42616.80|0.05|0.04|N|O|1996-12-08|1996-10-25|1997-01-07|COLLECT COD|AIR|riously pending accounts among the +33633|397|54|6|14|18163.46|0.04|0.04|N|O|1996-10-21|1996-11-10|1996-11-01|NONE|TRUCK|quests are blithely? quickly bol +33633|1236|37|7|25|28430.75|0.07|0.04|N|O|1996-12-17|1996-11-18|1997-01-04|DELIVER IN PERSON|FOB|s boost fur +33634|1098|69|1|8|7992.72|0.08|0.03|A|F|1993-12-05|1993-10-15|1993-12-23|NONE|TRUCK|yly ironic courts. furiously regul +33635|1640|82|1|39|60123.96|0.05|0.01|A|F|1994-08-17|1994-09-01|1994-08-23|COLLECT COD|MAIL|final packages detect furiously. s +33635|1500|79|2|45|63067.50|0.09|0.08|R|F|1994-08-15|1994-09-05|1994-09-04|DELIVER IN PERSON|TRUCK|hely pending accounts wake carefully ironic +33635|372|73|3|29|36898.73|0.03|0.01|R|F|1994-07-22|1994-09-12|1994-07-25|DELIVER IN PERSON|SHIP|s sleep carefully around the furio +33635|798|63|4|39|66252.81|0.00|0.01|A|F|1994-08-17|1994-08-15|1994-08-18|NONE|RAIL|ites haggle furiously ironic depe +33635|532|93|5|36|51571.08|0.00|0.08|A|F|1994-10-01|1994-09-01|1994-10-10|COLLECT COD|TRUCK| to the blithely regular accounts. fina +33635|827|61|6|30|51834.60|0.03|0.01|A|F|1994-09-13|1994-09-03|1994-09-22|DELIVER IN PERSON|RAIL|latelets cajole +33635|1215|27|7|20|22324.20|0.03|0.01|R|F|1994-09-13|1994-08-24|1994-10-04|DELIVER IN PERSON|MAIL|e blithely ironic asympto +33636|1964|53|1|29|54112.84|0.10|0.05|N|O|1998-03-10|1998-05-17|1998-03-18|DELIVER IN PERSON|AIR|yly around the multipliers. expres +33636|747|44|2|3|4943.22|0.04|0.00|N|O|1998-06-17|1998-03-28|1998-07-03|TAKE BACK RETURN|SHIP|lent requests boost blithely. furiously +33636|1294|6|3|16|19124.64|0.04|0.03|N|O|1998-04-16|1998-04-21|1998-05-10|DELIVER IN PERSON|AIR|leep. slyly ev +33636|1804|48|4|19|32410.20|0.06|0.02|N|O|1998-04-23|1998-04-08|1998-04-30|TAKE BACK RETURN|RAIL|unts sleep furiously alongside o +33637|1264|2|1|49|57097.74|0.05|0.00|R|F|1992-12-24|1993-02-15|1993-01-03|DELIVER IN PERSON|TRUCK|iously even platelets. quickly special dolp +33637|445|75|2|31|41708.64|0.03|0.08|A|F|1993-02-11|1993-01-06|1993-02-12|COLLECT COD|TRUCK| final platelets wake slyly +33637|764|29|3|25|41619.00|0.09|0.01|A|F|1993-01-24|1993-01-26|1993-02-09|COLLECT COD|REG AIR|ut the carefully final idea +33638|284|66|1|20|23685.60|0.00|0.00|R|F|1994-02-10|1994-04-15|1994-03-06|TAKE BACK RETURN|REG AIR|s haggle about the carefully express +33639|95|96|1|42|41793.78|0.08|0.08|N|O|1996-01-18|1996-01-18|1996-01-29|COLLECT COD|AIR|st across the regul +33639|1842|43|2|14|24413.76|0.05|0.03|N|O|1995-12-05|1995-12-24|1995-12-12|NONE|FOB|sual instruction +33639|1925|70|3|33|60288.36|0.08|0.03|N|O|1996-01-24|1996-01-23|1996-02-18|TAKE BACK RETURN|REG AIR|special pinto b +33639|281|36|4|1|1181.28|0.10|0.07|N|O|1995-12-09|1996-01-14|1996-01-01|TAKE BACK RETURN|AIR|structions. bold, ironic realms sleep fur +33639|1213|25|5|5|5571.05|0.08|0.07|N|O|1996-02-24|1996-01-09|1996-03-22|TAKE BACK RETURN|REG AIR|. regular requests haggle quickly final, +33639|1269|70|6|11|12872.86|0.10|0.07|N|O|1995-12-17|1995-12-20|1996-01-02|TAKE BACK RETURN|SHIP|cajole according to the si +33664|530|61|1|15|21457.95|0.08|0.02|R|F|1992-11-21|1992-12-16|1992-12-21|COLLECT COD|REG AIR|s: regular ac +33665|1228|66|1|13|14679.86|0.08|0.03|N|F|1995-06-08|1995-07-05|1995-06-21|COLLECT COD|FOB| theodolites. iron +33665|1400|39|2|46|59864.40|0.01|0.02|N|O|1995-08-02|1995-08-18|1995-08-30|TAKE BACK RETURN|AIR|ly ruthless packages abo +33665|1425|65|3|42|55709.64|0.01|0.08|N|O|1995-08-12|1995-07-25|1995-09-11|NONE|RAIL|accounts. bold, final asymptote +33665|1073|74|4|5|4870.35|0.04|0.05|N|O|1995-08-25|1995-07-15|1995-09-24|COLLECT COD|RAIL|blithely silent pinto beans thrash amon +33666|1882|12|1|36|64219.68|0.09|0.04|R|F|1992-08-30|1992-09-19|1992-09-25|COLLECT COD|FOB|y final idea +33666|1138|39|2|19|19743.47|0.00|0.07|A|F|1992-09-13|1992-09-29|1992-09-29|NONE|SHIP| final deposits. fluffily permanen +33666|781|82|3|20|33635.60|0.04|0.03|R|F|1992-10-23|1992-08-23|1992-10-26|TAKE BACK RETURN|RAIL|sts cajole ironic dependencies. id +33666|1094|95|4|25|24877.25|0.05|0.06|R|F|1992-10-20|1992-08-31|1992-10-26|DELIVER IN PERSON|RAIL|y permanent ideas; caref +33666|434|22|5|17|22685.31|0.02|0.01|R|F|1992-08-06|1992-09-09|1992-08-21|DELIVER IN PERSON|FOB|c deposits. carefully regular ins +33667|1445|46|1|8|10771.52|0.07|0.05|N|O|1997-08-16|1997-11-02|1997-08-21|TAKE BACK RETURN|MAIL| instructions sleep blithely +33667|43|69|2|43|40550.72|0.00|0.08|N|O|1997-10-06|1997-09-26|1997-10-30|COLLECT COD|RAIL|ithely spec +33668|1600|81|1|26|39041.60|0.05|0.07|N|O|1997-06-12|1997-06-02|1997-06-28|COLLECT COD|SHIP|affix. blithely unusual accounts cajole +33668|1521|62|2|6|8535.12|0.08|0.08|N|O|1997-08-24|1997-06-07|1997-08-30|NONE|AIR|beans haggle bold, even theodolites. never +33668|1216|91|3|2|2234.42|0.04|0.08|N|O|1997-06-08|1997-07-19|1997-06-23|DELIVER IN PERSON|FOB|posits. busy, pending accou +33669|1477|95|1|47|64788.09|0.08|0.07|N|O|1997-03-10|1997-02-01|1997-04-09|DELIVER IN PERSON|AIR|counts wake blithely ac +33669|227|55|2|47|52979.34|0.07|0.02|N|O|1996-12-21|1996-12-27|1997-01-03|TAKE BACK RETURN|TRUCK|y unusual +33669|963|64|3|39|72694.44|0.10|0.08|N|O|1996-12-07|1997-01-05|1996-12-21|COLLECT COD|FOB|und the pinto beans! dolphins w +33669|685|86|4|31|49156.08|0.04|0.06|N|O|1996-12-29|1997-02-06|1997-01-20|DELIVER IN PERSON|TRUCK|ithely final theodo +33670|1216|17|1|38|42453.98|0.02|0.02|R|F|1992-07-15|1992-06-17|1992-08-11|NONE|SHIP|lets sleep blithely about the regular +33670|1632|74|2|18|27605.34|0.10|0.07|R|F|1992-07-23|1992-06-03|1992-08-05|DELIVER IN PERSON|REG AIR|e after the quickly fin +33670|626|20|3|47|71751.14|0.00|0.01|R|F|1992-05-27|1992-06-17|1992-06-20|NONE|MAIL|lyly ironic idea +33670|1422|23|4|17|22498.14|0.01|0.08|R|F|1992-08-19|1992-06-13|1992-08-28|NONE|REG AIR| ideas. slyly express p +33670|48|99|5|41|38869.64|0.10|0.02|R|F|1992-08-10|1992-06-28|1992-09-02|COLLECT COD|SHIP| fluffily pending accounts. furiously sile +33671|1252|64|1|32|36904.00|0.06|0.08|N|O|1996-07-04|1996-08-04|1996-07-27|COLLECT COD|TRUCK| across the final requests doubt +33671|1222|23|2|17|19094.74|0.05|0.05|N|O|1996-06-30|1996-07-18|1996-07-11|TAKE BACK RETURN|RAIL|ect. slyly +33671|1013|19|3|3|2742.03|0.08|0.02|N|O|1996-07-17|1996-08-31|1996-08-11|COLLECT COD|REG AIR|oxes haggle flu +33671|233|61|4|10|11332.30|0.04|0.07|N|O|1996-07-05|1996-08-04|1996-08-04|NONE|MAIL|t the blithe +33696|642|43|1|47|72504.08|0.03|0.01|A|F|1994-05-23|1994-06-10|1994-06-14|NONE|SHIP|sts. fluffily ev +33696|848|49|2|7|12241.88|0.04|0.03|A|F|1994-05-09|1994-06-30|1994-06-07|DELIVER IN PERSON|REG AIR|e the slyly regular accounts use about +33696|180|33|3|4|4320.72|0.07|0.05|R|F|1994-08-11|1994-06-22|1994-09-03|COLLECT COD|SHIP|onic ideas abou +33696|1591|92|4|18|26866.62|0.07|0.08|R|F|1994-06-25|1994-07-10|1994-06-30|COLLECT COD|FOB|usly final foxes boost furiously aroun +33696|434|22|5|24|32026.32|0.09|0.00|R|F|1994-07-21|1994-08-06|1994-08-14|COLLECT COD|AIR|aggle carefully against the furiously u +33697|576|37|1|41|60539.37|0.01|0.07|N|O|1998-07-07|1998-09-08|1998-07-31|NONE|FOB|ss accounts haggle. ironic +33698|755|88|1|29|48016.75|0.03|0.00|N|O|1995-08-13|1995-07-09|1995-09-12|DELIVER IN PERSON|REG AIR|al instructions wake carefully. quickly +33699|632|26|1|24|36783.12|0.10|0.02|A|F|1994-09-06|1994-09-25|1994-09-07|DELIVER IN PERSON|FOB|s detect silent deposits. careful +33699|12|38|2|24|21888.24|0.01|0.04|R|F|1994-10-22|1994-10-15|1994-11-06|COLLECT COD|FOB|regular accounts. slyly unusual packa +33699|415|16|3|45|59193.45|0.05|0.03|A|F|1994-10-15|1994-09-24|1994-11-14|NONE|AIR| deposits ca +33699|617|49|4|2|3035.22|0.09|0.04|R|F|1994-11-10|1994-08-26|1994-12-03|TAKE BACK RETURN|FOB|ches are against the carefully even ideas. +33699|742|39|5|11|18070.14|0.08|0.07|A|F|1994-08-01|1994-09-10|1994-08-09|DELIVER IN PERSON|TRUCK| the special ideas. bold, regular ac +33700|521|82|1|22|31273.44|0.01|0.02|A|F|1995-05-16|1995-05-17|1995-05-21|TAKE BACK RETURN|RAIL|y unusual packages haggle against the +33700|747|44|2|5|8238.70|0.10|0.00|N|O|1995-07-12|1995-05-17|1995-07-26|DELIVER IN PERSON|REG AIR|althily sile +33700|286|68|3|48|56941.44|0.03|0.08|N|O|1995-07-15|1995-05-31|1995-07-26|COLLECT COD|MAIL|ding pinto bea +33701|192|71|1|1|1092.19|0.01|0.07|A|F|1995-01-02|1994-12-26|1995-01-03|NONE|SHIP|inal hockey players. furiously ev +33701|1383|84|2|46|59081.48|0.02|0.03|A|F|1995-01-26|1994-12-30|1995-02-09|NONE|RAIL|e quickly slyly ironic dependencies. final, +33701|1835|79|3|7|12157.81|0.00|0.01|R|F|1994-11-29|1994-12-27|1994-12-14|NONE|TRUCK|ajole. furiously unusual theodo +33701|147|74|4|42|43979.88|0.02|0.00|A|F|1994-10-24|1994-11-30|1994-11-13|TAKE BACK RETURN|RAIL|lly express sauternes cajole. furi +33701|1797|98|5|25|42469.75|0.09|0.06|R|F|1994-11-06|1994-11-20|1994-11-26|TAKE BACK RETURN|SHIP|hinly express ideas +33702|1221|22|1|3|3366.66|0.10|0.02|A|F|1992-10-22|1992-10-12|1992-10-23|TAKE BACK RETURN|TRUCK|ans integrate along the +33702|82|58|2|33|32408.64|0.05|0.05|R|F|1992-09-15|1992-11-08|1992-09-30|NONE|AIR|ise. slyly even pi +33702|707|72|3|14|22507.80|0.04|0.07|R|F|1992-12-18|1992-10-13|1993-01-09|TAKE BACK RETURN|REG AIR|nts haggle blithely furiously even dinos +33702|1718|3|4|46|74506.66|0.02|0.07|R|F|1992-10-14|1992-10-28|1992-10-19|COLLECT COD|FOB| quickly. quickly express deposi +33702|1801|45|5|7|11919.60|0.09|0.01|A|F|1992-09-27|1992-11-08|1992-09-30|TAKE BACK RETURN|AIR|ing to the quickly furious packages? +33702|1574|15|6|47|69351.79|0.00|0.03|R|F|1992-12-03|1992-11-21|1992-12-22|COLLECT COD|FOB|uests use quickly ca +33702|1441|42|7|19|25506.36|0.01|0.08|A|F|1992-12-10|1992-11-16|1992-12-16|NONE|REG AIR|n theodolites +33703|748|13|1|6|9892.44|0.00|0.07|A|F|1993-03-29|1993-04-01|1993-04-19|COLLECT COD|FOB|s. quickly fina +33703|1096|67|2|27|26921.43|0.09|0.07|R|F|1993-04-11|1993-03-12|1993-04-22|DELIVER IN PERSON|SHIP|t the express, +33703|1032|38|3|35|32656.05|0.03|0.05|R|F|1993-02-27|1993-04-09|1993-03-18|COLLECT COD|MAIL| against t +33703|1143|44|4|16|16706.24|0.08|0.06|A|F|1993-05-28|1993-04-20|1993-06-21|NONE|FOB|kages. accounts nag blithely agains +33703|827|28|5|10|17278.20|0.00|0.06|A|F|1993-05-27|1993-03-25|1993-06-26|COLLECT COD|MAIL|lithely bold +33703|358|59|6|11|13841.85|0.03|0.06|A|F|1993-06-01|1993-04-19|1993-06-26|NONE|SHIP|cies; furiously pending packages +33728|1416|56|1|32|42157.12|0.00|0.04|N|O|1996-10-02|1996-10-26|1996-10-17|COLLECT COD|REG AIR|ithely ironic instructions. regular, ironic +33729|1993|26|1|7|13264.93|0.10|0.07|A|F|1993-01-19|1992-10-23|1993-02-06|TAKE BACK RETURN|TRUCK|nding platelets. carefully pending packag +33729|1870|57|2|47|83277.89|0.04|0.03|A|F|1992-10-29|1992-11-29|1992-11-17|DELIVER IN PERSON|SHIP| permanently pending platele +33729|344|29|3|39|48529.26|0.03|0.01|A|F|1992-11-13|1992-11-10|1992-12-03|DELIVER IN PERSON|FOB| regular ac +33729|1257|32|4|15|17373.75|0.01|0.06|R|F|1992-10-31|1992-10-24|1992-11-20|DELIVER IN PERSON|AIR|equests play fluffily against t +33729|1098|4|5|28|27974.52|0.05|0.07|A|F|1992-12-19|1992-12-13|1993-01-01|COLLECT COD|AIR|ests among the slyly regular foxes are e +33730|1165|2|1|32|34117.12|0.08|0.04|N|O|1997-12-05|1997-11-23|1997-12-08|TAKE BACK RETURN|MAIL|efully even warho +33731|1040|46|1|12|11292.48|0.03|0.00|A|F|1992-11-17|1992-11-30|1992-12-07|TAKE BACK RETURN|MAIL|ess packages haggle quickly b +33731|1368|69|2|46|58390.56|0.10|0.04|A|F|1993-01-04|1992-11-23|1993-01-26|NONE|MAIL|xes. slyly +33731|474|62|3|29|39859.63|0.03|0.07|A|F|1993-01-04|1992-12-08|1993-01-18|NONE|FOB|. enticingly busy p +33731|1043|79|4|7|6608.28|0.08|0.07|R|F|1992-11-07|1992-11-18|1992-11-28|COLLECT COD|RAIL|g the bold accounts: final requests are a +33731|1543|44|5|26|37558.04|0.05|0.05|R|F|1992-10-31|1992-11-17|1992-11-23|DELIVER IN PERSON|TRUCK|s nag slyly; packages boost car +33731|1734|35|6|43|70336.39|0.00|0.08|R|F|1992-11-08|1992-12-31|1992-11-10|NONE|AIR|c pinto beans +33732|1175|48|1|31|33361.27|0.08|0.08|R|F|1994-12-12|1994-11-08|1994-12-26|COLLECT COD|RAIL|ously final foxes. stealt +33732|474|4|2|38|52229.86|0.05|0.03|R|F|1994-09-01|1994-11-15|1994-09-30|NONE|RAIL|sts cajole carefully abo +33733|361|46|1|37|46670.32|0.09|0.05|A|F|1993-08-25|1993-10-06|1993-09-19|NONE|RAIL|c accounts af +33734|1165|38|1|18|19190.88|0.09|0.06|N|O|1996-01-01|1996-01-07|1996-01-13|DELIVER IN PERSON|AIR|ges along the quickly regular excuses boo +33734|1742|43|2|17|27943.58|0.07|0.05|N|O|1995-12-14|1995-11-30|1996-01-09|NONE|SHIP|ntegrate unusual +33734|1639|81|3|15|23109.45|0.08|0.03|N|O|1996-02-05|1995-12-01|1996-02-23|DELIVER IN PERSON|RAIL|t the quickly regular platelets. bol +33734|649|81|4|45|69733.80|0.02|0.05|N|O|1996-02-12|1995-12-26|1996-03-04|COLLECT COD|MAIL|o beans. carefully final deposits at th +33734|1904|49|5|18|32506.20|0.04|0.03|N|O|1995-10-28|1995-11-19|1995-11-13|TAKE BACK RETURN|FOB|er the blithely regular deposits. sly +33734|1622|46|6|2|3047.24|0.07|0.06|N|O|1995-11-11|1996-01-06|1995-12-08|DELIVER IN PERSON|RAIL|sual deposits inte +33734|1791|92|7|23|38934.17|0.07|0.00|N|O|1996-01-11|1996-01-12|1996-01-17|NONE|MAIL|ing to the permanently final dolphins +33735|1377|54|1|20|25567.40|0.07|0.02|N|O|1996-09-30|1996-09-17|1996-10-16|TAKE BACK RETURN|SHIP|sly at the theodolit +33735|1876|6|2|21|37335.27|0.02|0.01|N|O|1996-08-15|1996-09-24|1996-08-31|NONE|FOB|r the carefully final p +33735|581|72|3|46|68152.68|0.07|0.08|N|O|1996-08-05|1996-10-03|1996-08-10|COLLECT COD|FOB|after the furiously ironic instructio +33735|490|49|4|28|38933.72|0.10|0.06|N|O|1996-08-31|1996-10-02|1996-09-20|COLLECT COD|REG AIR|posits are blithely. regula +33760|1697|80|1|32|51158.08|0.06|0.01|R|F|1992-08-10|1992-09-24|1992-09-01|COLLECT COD|RAIL|unts. furiously unusua +33761|1477|56|1|38|52381.86|0.09|0.05|A|F|1992-09-30|1992-10-20|1992-10-23|NONE|FOB|nding cour +33761|1697|80|2|45|71941.05|0.08|0.00|A|F|1992-09-03|1992-09-06|1992-09-11|TAKE BACK RETURN|RAIL| ideas use quickly +33761|1129|2|3|23|23692.76|0.10|0.02|A|F|1992-12-01|1992-10-10|1992-12-26|TAKE BACK RETURN|REG AIR|slyly regular theod +33761|661|62|4|27|42164.82|0.01|0.07|A|F|1992-09-19|1992-10-16|1992-09-28|NONE|TRUCK|beans haggle. bli +33761|1610|93|5|38|57441.18|0.04|0.00|A|F|1992-11-10|1992-09-27|1992-11-23|TAKE BACK RETURN|SHIP|ed foxes. regularly regula +33761|1736|21|6|3|4913.19|0.09|0.00|R|F|1992-08-07|1992-09-06|1992-08-27|COLLECT COD|SHIP|nic theodolites above the slyly fin +33761|1074|80|7|48|46803.36|0.03|0.03|A|F|1992-11-18|1992-09-14|1992-11-22|DELIVER IN PERSON|REG AIR|ecial accounts cajol +33762|354|39|1|20|25087.00|0.10|0.07|N|O|1996-01-22|1996-04-07|1996-02-18|NONE|AIR| special excus +33762|107|34|2|16|16113.60|0.05|0.06|N|O|1996-04-25|1996-03-15|1996-05-08|COLLECT COD|TRUCK|ns integrate carefully even reques +33762|297|98|3|34|40707.86|0.00|0.00|N|O|1996-02-26|1996-03-18|1996-03-26|NONE|TRUCK|n requests are slyly quiet excuses. +33762|1036|7|4|41|38418.23|0.10|0.02|N|O|1996-02-19|1996-03-04|1996-03-03|DELIVER IN PERSON|TRUCK|iously ironic theodolites except the ca +33762|1916|17|5|8|14543.28|0.07|0.06|N|O|1996-05-02|1996-02-22|1996-05-21|NONE|REG AIR|ly unusual t +33763|1174|47|1|23|24728.91|0.06|0.02|R|F|1993-09-25|1993-12-17|1993-10-12|NONE|RAIL|ffix slyly among t +33764|1828|29|1|46|79571.72|0.00|0.03|R|F|1995-04-07|1995-05-08|1995-04-12|TAKE BACK RETURN|RAIL|the platelets. blithely final ideas haggle +33764|1732|17|2|26|42476.98|0.06|0.00|A|F|1995-04-03|1995-04-03|1995-05-01|COLLECT COD|MAIL|kages. fluf +33764|48|74|3|36|34129.44|0.08|0.02|A|F|1995-05-06|1995-04-15|1995-05-13|COLLECT COD|TRUCK|thely even asymptot +33764|1861|62|4|48|84617.28|0.01|0.07|A|F|1995-02-21|1995-04-20|1995-03-09|DELIVER IN PERSON|MAIL|ding foxes sleep alon +33764|884|84|5|4|7139.52|0.09|0.05|R|F|1995-03-04|1995-05-07|1995-03-07|DELIVER IN PERSON|SHIP|beans. busily +33764|1052|58|6|11|10483.55|0.10|0.06|R|F|1995-04-03|1995-04-16|1995-04-14|TAKE BACK RETURN|AIR|gular deposits. +33765|1618|19|1|43|65343.23|0.01|0.07|N|O|1997-05-25|1997-07-19|1997-06-12|DELIVER IN PERSON|REG AIR| pinto beans use across the i +33765|1989|22|2|28|52947.44|0.09|0.03|N|O|1997-07-05|1997-07-07|1997-07-21|COLLECT COD|TRUCK|s sleep bl +33765|1560|81|3|1|1461.56|0.03|0.06|N|O|1997-05-21|1997-06-23|1997-06-04|TAKE BACK RETURN|RAIL|age furiously regular ideas. carefully f +33765|1423|63|4|48|63572.16|0.05|0.00|N|O|1997-06-01|1997-06-20|1997-06-14|DELIVER IN PERSON|TRUCK| beans; quickly special deposits de +33766|1994|27|1|40|75839.60|0.01|0.05|N|O|1998-10-06|1998-08-01|1998-10-21|DELIVER IN PERSON|MAIL|ackages sle +33766|1411|51|2|25|32810.25|0.02|0.06|N|O|1998-10-12|1998-08-17|1998-11-01|DELIVER IN PERSON|FOB|c requests haggle furiously. carefully bli +33767|1860|47|1|25|44046.50|0.07|0.03|R|F|1994-07-12|1994-07-05|1994-08-04|DELIVER IN PERSON|FOB|pending accounts +33792|532|63|1|29|41543.37|0.00|0.02|N|O|1997-05-04|1997-06-01|1997-05-24|TAKE BACK RETURN|REG AIR|thely above the quickly ironic instructi +33792|1241|16|2|5|5711.20|0.04|0.07|N|O|1997-04-15|1997-06-21|1997-05-14|NONE|TRUCK|inst the slyly pe +33792|1349|64|3|16|20005.44|0.10|0.06|N|O|1997-05-25|1997-06-08|1997-06-10|NONE|REG AIR|al instructions across the unusual +33792|1040|46|4|5|4705.20|0.06|0.08|N|O|1997-05-26|1997-06-17|1997-06-09|TAKE BACK RETURN|SHIP|arefully above the s +33792|58|59|5|2|1916.10|0.09|0.06|N|O|1997-05-29|1997-05-15|1997-06-03|TAKE BACK RETURN|SHIP|es are slyly accounts. express, ironic +33792|795|60|6|4|6783.16|0.07|0.00|N|O|1997-06-11|1997-05-14|1997-07-06|TAKE BACK RETURN|REG AIR|lly final packages. furiously unus +33793|1741|42|1|5|8213.70|0.05|0.05|R|F|1992-08-20|1992-09-07|1992-08-24|TAKE BACK RETURN|MAIL|nts haggle quickly. unusua +33793|193|72|2|13|14211.47|0.09|0.00|R|F|1992-10-13|1992-08-17|1992-11-11|TAKE BACK RETURN|SHIP|e ironic deposits. bl +33793|1319|58|3|42|51253.02|0.00|0.08|R|F|1992-08-08|1992-09-09|1992-08-24|NONE|AIR|nic escapades. carefully regul +33793|1564|5|4|6|8793.36|0.01|0.02|A|F|1992-09-19|1992-08-06|1992-10-13|NONE|AIR|stealthy packages. ironic, bold pin +33793|1218|93|5|36|40291.56|0.09|0.01|R|F|1992-09-05|1992-08-06|1992-10-04|COLLECT COD|FOB| the blithely bol +33794|654|48|1|23|35756.95|0.06|0.04|A|F|1995-05-13|1995-03-29|1995-05-15|TAKE BACK RETURN|SHIP|stealthy foxes w +33794|144|23|2|14|14617.96|0.00|0.08|N|F|1995-06-12|1995-04-15|1995-06-25|COLLECT COD|SHIP| asymptotes boost slyly final depen +33794|703|68|3|48|76977.60|0.08|0.05|A|F|1995-03-01|1995-04-16|1995-03-08|DELIVER IN PERSON|REG AIR|ecial accounts are blithely even, final dep +33794|619|51|4|47|71421.67|0.01|0.06|A|F|1995-02-27|1995-05-14|1995-03-26|COLLECT COD|AIR|rding to the blithely pending dep +33794|1126|35|5|20|20542.40|0.05|0.04|R|F|1995-05-21|1995-05-02|1995-06-16|COLLECT COD|MAIL| regular, silent d +33794|1541|42|6|2|2885.08|0.10|0.06|A|F|1995-03-29|1995-04-30|1995-04-24|COLLECT COD|SHIP|s around the +33794|569|100|7|32|47025.92|0.01|0.07|A|F|1995-04-26|1995-04-05|1995-05-02|NONE|REG AIR|egular reque +33795|1120|93|1|22|22464.64|0.02|0.01|N|O|1996-10-20|1996-10-29|1996-11-04|TAKE BACK RETURN|REG AIR|ly final packages a +33795|755|52|2|4|6623.00|0.06|0.02|N|O|1996-11-06|1996-11-23|1996-11-23|NONE|RAIL|encies. deposits according to the fur +33795|1735|20|3|45|73652.85|0.05|0.02|N|O|1996-12-09|1996-11-17|1996-12-23|DELIVER IN PERSON|RAIL|eposits. furiously quiet re +33795|1193|30|4|6|6565.14|0.08|0.01|N|O|1996-12-27|1996-11-05|1997-01-24|NONE|SHIP| cajole above the regular, +33795|736|69|5|39|63832.47|0.05|0.02|N|O|1996-09-22|1996-11-19|1996-10-06|TAKE BACK RETURN|FOB|eep. blithely bold instructions wake +33795|560|91|6|44|64264.64|0.00|0.04|N|O|1997-01-08|1996-10-19|1997-01-15|NONE|MAIL| of the furiously unusu +33795|36|87|7|21|19656.63|0.10|0.06|N|O|1996-11-10|1996-10-23|1996-12-07|DELIVER IN PERSON|MAIL|s use across the foxes; sometimes even p +33796|284|12|1|36|42634.08|0.01|0.08|N|O|1997-12-12|1997-10-17|1997-12-21|TAKE BACK RETURN|FOB|e slyly. carefully final foxes try to use p +33796|1169|78|2|7|7491.12|0.08|0.04|N|O|1997-10-16|1997-11-06|1997-10-20|COLLECT COD|FOB|kly regular +33796|431|19|3|37|49262.91|0.08|0.00|N|O|1997-08-30|1997-10-17|1997-09-25|COLLECT COD|TRUCK|sits use regular, regular pinto b +33796|932|33|4|15|27493.95|0.04|0.06|N|O|1997-10-12|1997-10-24|1997-10-21|TAKE BACK RETURN|SHIP|refully bold forges! +33796|197|24|5|19|20846.61|0.02|0.04|N|O|1997-12-07|1997-11-15|1997-12-28|TAKE BACK RETURN|RAIL|ackages about +33796|468|56|6|42|57475.32|0.09|0.08|N|O|1997-10-14|1997-11-05|1997-11-02|COLLECT COD|TRUCK|riously against the pint +33796|782|15|7|6|10096.68|0.06|0.06|N|O|1997-12-27|1997-10-30|1998-01-01|DELIVER IN PERSON|FOB| asymptotes are furiously across the blith +33797|1085|86|1|1|986.08|0.01|0.05|R|F|1994-04-06|1994-03-16|1994-04-24|COLLECT COD|MAIL| deposits. slyly unusual packages cajole fu +33797|1077|13|2|12|11736.84|0.03|0.01|A|F|1994-03-29|1994-03-31|1994-04-05|COLLECT COD|RAIL|t among the silent foxes. blithely caref +33797|780|45|3|34|57146.52|0.00|0.08|A|F|1994-01-14|1994-02-12|1994-02-10|TAKE BACK RETURN|TRUCK|tain carefully +33797|599|30|4|38|56984.42|0.10|0.06|R|F|1994-02-15|1994-03-26|1994-02-27|DELIVER IN PERSON|REG AIR|quickly along the e +33797|1836|66|5|36|62561.88|0.01|0.07|R|F|1994-03-07|1994-02-17|1994-04-01|NONE|SHIP|ymptotes. slyly ev +33797|528|29|6|47|67140.44|0.09|0.05|A|F|1994-03-08|1994-03-26|1994-03-15|NONE|RAIL|y above the blithely sil +33798|1645|87|1|41|63412.24|0.05|0.03|N|O|1997-01-12|1997-02-05|1997-01-30|NONE|TRUCK|lyly. quickly special +33798|882|16|2|12|21394.56|0.09|0.05|N|O|1997-01-18|1997-02-13|1997-02-05|COLLECT COD|SHIP|sits about the slyly ev +33798|854|88|3|40|70194.00|0.06|0.03|N|O|1996-11-25|1997-02-09|1996-11-30|COLLECT COD|REG AIR|ross the fluffily regular epitaphs use +33798|1849|50|4|32|56026.88|0.07|0.05|N|O|1997-02-18|1997-01-20|1997-03-11|DELIVER IN PERSON|MAIL|lithely. quickly +33798|1824|54|5|44|75936.08|0.01|0.01|N|O|1996-11-26|1997-01-21|1996-11-27|DELIVER IN PERSON|TRUCK|idle packages sleep. blithely pend +33798|1652|53|6|46|71467.90|0.09|0.01|N|O|1997-01-23|1997-02-11|1997-02-05|NONE|FOB|foxes wake. quickly regular foxes nag. +33799|113|92|1|46|46603.06|0.07|0.08|N|O|1997-06-01|1997-05-02|1997-06-17|TAKE BACK RETURN|REG AIR|ependencies haggle darin +33799|1985|74|2|21|39626.58|0.00|0.08|N|O|1997-06-12|1997-04-17|1997-07-10|DELIVER IN PERSON|FOB|bold pinto beans. bold, +33799|1419|98|3|14|18485.74|0.09|0.05|N|O|1997-06-11|1997-04-19|1997-06-27|NONE|AIR|packages ha +33824|936|5|1|38|69803.34|0.10|0.02|R|F|1995-03-10|1995-05-16|1995-04-09|DELIVER IN PERSON|TRUCK|deposits. fluffily qu +33824|1515|56|2|21|29746.71|0.02|0.02|R|F|1995-04-02|1995-04-10|1995-04-18|DELIVER IN PERSON|TRUCK|ove the blithely fina +33824|1145|54|3|4|4184.56|0.01|0.04|R|F|1995-05-23|1995-05-24|1995-05-30|COLLECT COD|REG AIR|al platelets nag never perman +33824|1617|59|4|39|59225.79|0.01|0.00|A|F|1995-03-15|1995-04-15|1995-03-27|TAKE BACK RETURN|FOB| carefully final, iron +33825|966|69|1|40|74678.40|0.05|0.08|N|O|1998-07-13|1998-06-15|1998-08-05|NONE|FOB|e the unusual theo +33825|583|74|2|18|26704.44|0.06|0.04|N|O|1998-08-08|1998-06-17|1998-08-16|COLLECT COD|FOB|iously abov +33825|1130|39|3|3|3093.39|0.01|0.01|N|O|1998-06-23|1998-07-03|1998-07-17|TAKE BACK RETURN|MAIL|ckages cajole blithely +33825|507|98|4|49|68967.50|0.00|0.05|N|O|1998-06-18|1998-05-17|1998-07-07|NONE|AIR| pinto beans haggle carefully a +33825|1057|63|5|11|10538.55|0.02|0.05|N|O|1998-05-08|1998-06-22|1998-06-07|TAKE BACK RETURN|RAIL|ss the carefully bold requests. b +33825|1371|10|6|13|16540.81|0.09|0.04|N|O|1998-05-22|1998-07-06|1998-06-17|DELIVER IN PERSON|RAIL|oost furiously a +33826|651|14|1|15|23274.75|0.09|0.08|R|F|1994-03-05|1994-02-19|1994-03-12|COLLECT COD|FOB| deposits. accounts after the fi +33826|34|10|2|31|28954.93|0.03|0.00|R|F|1994-04-04|1994-02-21|1994-04-24|COLLECT COD|RAIL|leep along the regular, regular +33826|1238|50|3|1|1139.23|0.08|0.02|A|F|1994-04-13|1994-03-17|1994-05-07|COLLECT COD|TRUCK|gside of the express accounts. deposits +33826|1714|15|4|45|72706.95|0.02|0.03|R|F|1994-03-17|1994-02-28|1994-03-20|TAKE BACK RETURN|SHIP|ully alongside of the slyly final +33826|175|76|5|14|15052.38|0.02|0.01|R|F|1994-03-25|1994-01-26|1994-03-27|COLLECT COD|AIR| quiet foxes. unusual pint +33826|351|80|6|47|58813.45|0.02|0.03|A|F|1994-02-08|1994-03-09|1994-02-16|DELIVER IN PERSON|SHIP| cajole. unusual, special packages hang +33827|481|82|1|6|8288.88|0.02|0.06|R|F|1994-03-17|1994-03-14|1994-03-25|COLLECT COD|MAIL| bold requ +33828|1600|41|1|30|45048.00|0.05|0.07|N|O|1996-10-23|1996-09-13|1996-11-19|TAKE BACK RETURN|TRUCK|accounts promise blithely ins +33829|1382|59|1|39|50051.82|0.00|0.00|N|O|1998-01-21|1998-01-06|1998-01-30|DELIVER IN PERSON|AIR|s are. blithely even pinto beans kind +33829|591|22|2|10|14915.90|0.09|0.03|N|O|1997-11-23|1998-01-16|1997-12-01|COLLECT COD|FOB|ily regular accounts cajole furiously +33829|1074|10|3|3|2925.21|0.05|0.04|N|O|1998-01-25|1997-12-31|1998-02-10|NONE|SHIP|braids wake furiously furiously pending +33829|1411|29|4|11|14436.51|0.06|0.01|N|O|1998-02-08|1997-12-30|1998-02-23|TAKE BACK RETURN|RAIL|al, regular deposits haggle +33830|913|82|1|38|68928.58|0.00|0.03|N|O|1995-07-31|1995-07-16|1995-08-04|DELIVER IN PERSON|FOB|iously. furiously regular r +33830|994|97|2|2|3789.98|0.06|0.00|N|O|1995-08-25|1995-06-21|1995-09-10|DELIVER IN PERSON|TRUCK|es sleep! r +33830|1883|27|3|22|39267.36|0.08|0.07|R|F|1995-05-29|1995-06-12|1995-06-03|COLLECT COD|TRUCK|ges. furiously regular deposits mold +33830|814|81|4|18|30866.58|0.00|0.05|N|F|1995-06-12|1995-07-24|1995-06-25|COLLECT COD|AIR|posits about t +33830|1034|70|5|7|6545.21|0.08|0.02|N|O|1995-08-26|1995-07-25|1995-09-17|NONE|MAIL|ronic multipliers im +33830|1545|46|6|19|27484.26|0.05|0.08|N|O|1995-07-07|1995-07-11|1995-07-26|DELIVER IN PERSON|RAIL|ound the blithely express accounts. slyl +33831|1444|45|1|16|21527.04|0.06|0.06|N|O|1998-08-04|1998-08-20|1998-08-07|NONE|SHIP|en deposits: excuses nag fu +33831|1227|28|2|37|41744.14|0.03|0.08|N|O|1998-07-17|1998-08-19|1998-07-28|NONE|REG AIR|odolites. furiously even requests are fur +33856|74|100|1|46|44807.22|0.07|0.05|N|O|1996-07-05|1996-07-21|1996-08-04|COLLECT COD|RAIL|uests. always reg +33856|1902|35|2|17|30666.30|0.07|0.01|N|O|1996-07-29|1996-07-31|1996-08-18|NONE|RAIL|ays among the bl +33856|199|78|3|21|23082.99|0.03|0.04|N|O|1996-09-07|1996-07-14|1996-09-11|DELIVER IN PERSON|REG AIR|. slyly express asymptotes wake fl +33856|390|75|4|17|21936.63|0.00|0.07|N|O|1996-06-05|1996-07-07|1996-07-05|TAKE BACK RETURN|MAIL|s sleep final reques +33856|291|19|5|19|22634.51|0.03|0.07|N|O|1996-09-20|1996-07-13|1996-10-08|TAKE BACK RETURN|RAIL|cial deposits integrat +33856|1689|90|6|49|77943.32|0.02|0.08|N|O|1996-06-02|1996-08-05|1996-06-06|TAKE BACK RETURN|TRUCK|usly regular reques +33856|980|83|7|31|58310.38|0.07|0.05|N|O|1996-07-28|1996-08-04|1996-08-20|DELIVER IN PERSON|FOB|ously even foxes on the quickly f +33857|1397|12|1|39|50637.21|0.08|0.08|R|F|1993-06-26|1993-07-02|1993-07-18|COLLECT COD|REG AIR|fix on the furiously final d +33857|430|60|2|4|5321.72|0.05|0.03|R|F|1993-08-05|1993-06-02|1993-08-23|COLLECT COD|RAIL|ts are regula +33857|1375|76|3|46|58713.02|0.04|0.00|R|F|1993-07-26|1993-07-07|1993-07-27|COLLECT COD|SHIP|nusual deposits. final, regular instr +33857|1487|27|4|13|18050.24|0.08|0.07|A|F|1993-08-26|1993-07-15|1993-09-02|NONE|RAIL|press ideas +33857|298|80|5|1|1198.29|0.03|0.07|A|F|1993-05-10|1993-07-07|1993-06-06|DELIVER IN PERSON|SHIP|final inst +33857|1388|3|6|30|38681.40|0.04|0.01|R|F|1993-08-28|1993-06-29|1993-09-08|NONE|REG AIR|final deposits +33858|1510|31|1|19|26818.69|0.07|0.06|N|F|1995-06-14|1995-08-02|1995-06-22|NONE|RAIL|y even pinto beans sleep iron +33859|1262|100|1|14|16285.64|0.07|0.02|N|O|1996-04-10|1996-03-03|1996-04-24|NONE|AIR| above the decoys. b +33859|966|67|2|23|42940.08|0.08|0.03|N|O|1996-03-24|1996-04-15|1996-04-04|TAKE BACK RETURN|MAIL| pinto beans. blithely regu +33860|55|6|1|26|24831.30|0.01|0.07|N|O|1996-01-13|1996-03-13|1996-02-08|DELIVER IN PERSON|RAIL| regular requests. closely fina +33860|1479|80|2|5|6902.35|0.08|0.08|N|O|1996-02-28|1996-03-11|1996-03-17|COLLECT COD|AIR| fluffily ironic, bold account +33860|644|45|3|20|30892.80|0.07|0.08|N|O|1996-01-20|1996-03-12|1996-02-01|COLLECT COD|MAIL|dolites wake blit +33861|1177|14|1|33|35579.61|0.01|0.05|N|O|1996-05-07|1996-05-24|1996-05-18|COLLECT COD|SHIP|oxes sleep fur +33861|1495|74|2|31|43291.19|0.01|0.03|N|O|1996-07-14|1996-05-04|1996-08-09|COLLECT COD|SHIP|ular depos +33861|752|49|3|33|54540.75|0.00|0.07|N|O|1996-03-25|1996-04-28|1996-04-24|DELIVER IN PERSON|RAIL|ly special pearls. accounts sleep bli +33861|886|86|4|39|69688.32|0.02|0.03|N|O|1996-07-15|1996-04-27|1996-08-12|TAKE BACK RETURN|SHIP| even platelets eat carefully around the +33862|1382|97|1|28|35934.64|0.06|0.08|R|F|1993-09-14|1993-08-27|1993-10-13|TAKE BACK RETURN|MAIL| special multipliers sleep sly +33863|90|66|1|36|35643.24|0.00|0.07|R|F|1993-04-13|1993-04-29|1993-04-25|DELIVER IN PERSON|AIR|ely pending c +33863|1500|1|2|27|37840.50|0.03|0.01|A|F|1993-05-27|1993-04-28|1993-06-26|NONE|TRUCK|ckages nag across the +33863|932|33|3|11|20162.23|0.09|0.01|A|F|1993-06-29|1993-04-08|1993-07-24|TAKE BACK RETURN|RAIL|o beans. carefully bold acc +33863|1500|40|4|40|56060.00|0.03|0.04|A|F|1993-04-23|1993-05-02|1993-05-04|DELIVER IN PERSON|FOB| even ideas haggle after the depende +33888|1541|62|1|38|54816.52|0.09|0.01|A|F|1994-09-08|1994-10-07|1994-10-02|TAKE BACK RETURN|FOB|ermanent th +33888|798|99|2|12|20385.48|0.05|0.05|R|F|1994-09-05|1994-11-06|1994-09-16|DELIVER IN PERSON|REG AIR|uses. slyly +33888|1545|26|3|12|17358.48|0.04|0.01|R|F|1994-10-05|1994-10-13|1994-10-06|NONE|FOB|carefully regular requests +33888|1592|33|4|28|41820.52|0.08|0.07|A|F|1994-10-21|1994-11-18|1994-11-10|TAKE BACK RETURN|TRUCK|s haggle carefully. sly +33888|440|28|5|33|44234.52|0.01|0.07|R|F|1994-09-10|1994-11-08|1994-09-26|COLLECT COD|REG AIR| instructions cajol +33889|1814|44|1|14|24021.34|0.03|0.01|A|F|1993-12-13|1993-12-11|1993-12-25|NONE|FOB|requests. ironic p +33889|992|95|2|16|30287.84|0.02|0.04|R|F|1993-12-17|1993-12-21|1994-01-08|DELIVER IN PERSON|REG AIR| sauternes wak +33889|1897|27|3|32|57564.48|0.01|0.05|R|F|1993-12-25|1994-01-18|1994-01-17|NONE|MAIL|ve the furiously r +33889|495|83|4|8|11163.92|0.00|0.08|A|F|1994-01-29|1994-01-08|1994-01-30|DELIVER IN PERSON|FOB|es are. blithe +33889|1945|90|5|27|49867.38|0.09|0.00|R|F|1994-02-11|1994-01-16|1994-03-04|DELIVER IN PERSON|SHIP|ong the boldly final request +33889|1181|18|6|6|6493.08|0.05|0.00|R|F|1994-03-07|1993-12-25|1994-03-28|TAKE BACK RETURN|TRUCK|ate express, fluffy p +33889|439|40|7|11|14733.73|0.06|0.08|A|F|1994-01-08|1994-01-06|1994-01-17|NONE|TRUCK|l instructions haggle slyly regular deposi +33890|53|79|1|38|36215.90|0.00|0.08|N|O|1996-12-10|1996-10-30|1997-01-08|NONE|MAIL|. blithely bold deposits against th +33891|382|39|1|33|42318.54|0.00|0.02|A|F|1993-04-22|1993-06-29|1993-04-26|DELIVER IN PERSON|SHIP|ffix against the regular deposits. f +33891|651|83|2|22|34136.30|0.01|0.01|R|F|1993-06-29|1993-06-02|1993-06-30|DELIVER IN PERSON|TRUCK|ic packages. carefully un +33891|1262|74|3|12|13959.12|0.09|0.03|A|F|1993-07-19|1993-06-16|1993-08-08|DELIVER IN PERSON|FOB|as. quickly final ideas are regular package +33891|1419|98|4|49|64700.09|0.06|0.06|A|F|1993-07-16|1993-05-15|1993-07-23|TAKE BACK RETURN|AIR| blithe package +33891|775|8|5|15|25136.55|0.00|0.00|A|F|1993-04-12|1993-06-22|1993-05-06|COLLECT COD|MAIL|y pending foxes play furious +33891|347|32|6|49|61119.66|0.04|0.03|R|F|1993-07-06|1993-06-16|1993-07-16|NONE|MAIL|ld courts mold quickly carefully si +33892|1248|86|1|10|11492.40|0.04|0.00|N|O|1995-08-16|1995-06-30|1995-08-19|DELIVER IN PERSON|FOB|ests. ironic, regular reques +33893|340|97|1|39|48373.26|0.08|0.01|R|F|1992-11-08|1992-11-10|1992-11-19|TAKE BACK RETURN|SHIP| slyly above the s +33893|1766|93|2|14|23348.64|0.00|0.08|A|F|1992-11-14|1992-11-20|1992-12-10|NONE|AIR|equests sleep carefully slyly regu +33893|633|34|3|14|21470.82|0.06|0.02|R|F|1992-12-16|1992-11-11|1992-12-19|TAKE BACK RETURN|MAIL|arefully ironic ideas. carefully regular +33893|1958|3|4|18|33479.10|0.02|0.00|R|F|1992-10-28|1992-11-24|1992-11-26|TAKE BACK RETURN|REG AIR|kages. express accounts ac +33893|380|37|5|39|49934.82|0.02|0.03|R|F|1992-09-22|1992-11-23|1992-10-21|TAKE BACK RETURN|AIR|usly unusual excuses will sleep. ca +33893|616|10|6|36|54597.96|0.08|0.04|R|F|1992-11-08|1992-12-13|1992-12-06|NONE|TRUCK|tes according to the carefully ironic pac +33894|801|1|1|22|37439.60|0.09|0.01|R|F|1993-06-23|1993-09-02|1993-07-01|NONE|TRUCK|ecial deposits cajole abo +33894|327|84|2|2|2454.64|0.01|0.03|A|F|1993-08-24|1993-07-30|1993-09-23|DELIVER IN PERSON|FOB|t quickly blithely regular pac +33894|1852|39|3|19|33323.15|0.01|0.08|R|F|1993-07-19|1993-08-31|1993-08-04|DELIVER IN PERSON|REG AIR|e furiously slyly +33894|1804|48|4|48|81878.40|0.07|0.01|R|F|1993-09-01|1993-08-16|1993-10-01|COLLECT COD|FOB| use. carefully ironic instr +33894|135|88|5|4|4140.52|0.10|0.04|R|F|1993-09-22|1993-07-16|1993-09-26|NONE|TRUCK|are fluffily. pa +33894|773|38|6|6|10042.62|0.09|0.05|R|F|1993-09-15|1993-08-23|1993-10-04|DELIVER IN PERSON|RAIL|sts impress furious +33894|901|4|7|26|46849.40|0.04|0.05|R|F|1993-07-02|1993-07-31|1993-07-14|TAKE BACK RETURN|FOB|eposits. express pinto beans cajole quic +33895|682|45|1|31|49063.08|0.07|0.06|N|O|1996-04-29|1996-04-28|1996-05-03|COLLECT COD|RAIL|efully even frays haggle slyly furiousl +33895|791|92|2|4|6767.16|0.09|0.06|N|O|1996-03-26|1996-04-29|1996-04-11|DELIVER IN PERSON|FOB|e. slyly bold accounts c +33920|10|86|1|24|21840.24|0.05|0.07|R|F|1994-07-15|1994-09-18|1994-08-02|COLLECT COD|MAIL|e express excuses. +33920|1555|36|2|33|48066.15|0.01|0.01|A|F|1994-10-27|1994-09-28|1994-11-02|COLLECT COD|SHIP|s packages sleep. fluffily final theodolite +33921|646|9|1|4|6186.56|0.02|0.04|A|F|1993-05-28|1993-05-31|1993-06-22|NONE|TRUCK|slyly special packages serve furio +33921|485|86|2|7|9698.36|0.09|0.05|A|F|1993-04-12|1993-05-31|1993-04-23|DELIVER IN PERSON|SHIP| accounts haggle slyly to the specia +33921|1974|63|3|28|52527.16|0.03|0.05|R|F|1993-07-13|1993-05-12|1993-07-22|COLLECT COD|SHIP|y even accounts. carefully even requests +33921|1400|77|4|28|36439.20|0.10|0.08|R|F|1993-05-18|1993-06-26|1993-06-01|DELIVER IN PERSON|MAIL|lly final ideas. carefully exp +33921|165|18|5|37|39410.92|0.09|0.00|A|F|1993-06-24|1993-05-01|1993-07-10|TAKE BACK RETURN|TRUCK|r instructions cajole +33922|1438|17|1|25|33485.75|0.04|0.05|A|F|1993-05-02|1993-04-27|1993-05-10|COLLECT COD|SHIP|slyly special ideas. express +33922|1713|56|2|14|22605.94|0.03|0.05|A|F|1993-05-10|1993-04-17|1993-06-01|DELIVER IN PERSON|MAIL|ies: pending packages across the car +33922|1661|62|3|11|17189.26|0.00|0.05|R|F|1993-05-07|1993-04-02|1993-06-06|NONE|FOB| accounts. blithely regular packages nag +33922|75|26|4|7|6825.49|0.06|0.03|R|F|1993-05-18|1993-04-23|1993-06-11|TAKE BACK RETURN|FOB|pending accounts detect f +33922|374|75|5|35|44602.95|0.05|0.06|A|F|1993-06-20|1993-05-15|1993-06-25|COLLECT COD|FOB|lyly at the slyly regular dep +33922|545|36|6|18|26019.72|0.09|0.00|R|F|1993-06-29|1993-04-21|1993-07-02|DELIVER IN PERSON|TRUCK|special ideas sleep careful +33923|1076|77|1|29|28335.03|0.09|0.02|A|F|1994-03-13|1994-04-07|1994-03-29|NONE|FOB|ongside of the foxes. regular, bold +33923|1734|77|2|28|45800.44|0.09|0.00|R|F|1994-04-05|1994-04-03|1994-04-21|NONE|TRUCK|uests wake slyly throughout the ironic t +33924|1677|78|1|9|14208.03|0.07|0.02|R|F|1992-12-04|1993-01-08|1992-12-14|NONE|MAIL|gular excuses after the slyly re +33924|1306|21|2|42|50706.60|0.02|0.02|R|F|1992-10-31|1992-11-19|1992-11-15|NONE|FOB|c pinto beans +33924|398|83|3|47|61024.33|0.01|0.00|A|F|1992-12-28|1993-01-17|1993-01-16|COLLECT COD|REG AIR|refully furiously busy +33924|1858|88|4|3|5279.55|0.07|0.07|A|F|1993-01-01|1992-11-26|1993-01-30|DELIVER IN PERSON|SHIP|le furiously around the careful +33924|1782|25|5|10|16837.80|0.06|0.08|R|F|1993-02-03|1992-11-28|1993-02-23|COLLECT COD|TRUCK|nal instructions? fin +33924|1866|10|6|23|40660.78|0.01|0.07|R|F|1992-12-08|1993-01-04|1992-12-13|COLLECT COD|RAIL|egular deposits. slyly regular +33925|624|25|1|44|67083.28|0.08|0.07|A|F|1995-06-01|1995-07-28|1995-06-11|TAKE BACK RETURN|MAIL|nto beans cajole slyly. blithely special co +33926|1098|99|1|16|15985.44|0.04|0.00|N|O|1996-10-26|1996-11-14|1996-11-07|COLLECT COD|AIR|ing to the final, regular requests. +33926|824|24|2|32|55194.24|0.04|0.04|N|O|1996-10-07|1996-10-13|1996-10-20|DELIVER IN PERSON|FOB|counts. ironic pinto +33927|150|29|1|46|48306.90|0.04|0.00|N|O|1997-04-25|1997-05-02|1997-05-05|COLLECT COD|REG AIR|osits boost slyly foxes. iron +33927|670|71|2|41|64397.47|0.02|0.05|N|O|1997-04-06|1997-05-16|1997-04-16|TAKE BACK RETURN|FOB| carefully ironic accounts sleep. furiousl +33927|441|29|3|47|63047.68|0.10|0.00|N|O|1997-05-10|1997-05-17|1997-06-03|DELIVER IN PERSON|SHIP|e quietly even +33927|1314|91|4|2|2430.62|0.09|0.06|N|O|1997-04-02|1997-06-19|1997-04-25|NONE|AIR|ly. ironic pinto beans detect. d +33927|1177|78|5|34|36657.78|0.05|0.07|N|O|1997-05-26|1997-05-15|1997-06-10|DELIVER IN PERSON|RAIL|nding deposits integrate always alon +33927|1749|92|6|11|18158.14|0.03|0.02|N|O|1997-05-22|1997-04-27|1997-06-21|TAKE BACK RETURN|RAIL|he furiously f +33927|211|12|7|19|21112.99|0.08|0.01|N|O|1997-07-16|1997-05-11|1997-07-19|DELIVER IN PERSON|FOB|ithely slow packages +33952|999|100|1|22|41799.78|0.03|0.02|N|O|1996-06-11|1996-05-22|1996-07-08|TAKE BACK RETURN|FOB|eas. fluffily +33952|1381|58|2|32|41036.16|0.08|0.05|N|O|1996-05-28|1996-04-27|1996-05-31|COLLECT COD|RAIL| carefully regular requests. even +33953|523|24|1|2|2847.04|0.02|0.06|A|F|1992-09-01|1992-09-01|1992-09-25|NONE|FOB|ithes. blithely final +33953|483|42|2|3|4150.44|0.08|0.06|A|F|1992-07-21|1992-08-29|1992-07-29|NONE|RAIL|ndencies. quickly even ideas wake acc +33953|1709|10|3|36|57985.20|0.06|0.08|A|F|1992-07-17|1992-07-25|1992-07-25|COLLECT COD|REG AIR|eposits. slyly even pinto bea +33953|1854|84|4|17|29849.45|0.09|0.01|A|F|1992-09-14|1992-09-16|1992-09-21|NONE|SHIP|egular packag +33953|587|78|5|39|58015.62|0.02|0.01|A|F|1992-09-08|1992-09-03|1992-10-02|NONE|REG AIR|ly even deposits cajole fu +33953|1124|61|6|37|37929.44|0.01|0.06|R|F|1992-08-22|1992-08-31|1992-09-18|TAKE BACK RETURN|FOB|ng realms sleep +33954|80|56|1|36|35282.88|0.02|0.04|N|O|1998-02-22|1998-04-18|1998-02-28|TAKE BACK RETURN|AIR|lyly ironi +33954|1615|98|2|16|24265.76|0.06|0.02|N|O|1998-05-25|1998-03-22|1998-06-09|COLLECT COD|SHIP| furiously ironic accounts are sl +33955|1824|68|1|34|58677.88|0.06|0.03|N|O|1996-06-25|1996-06-13|1996-07-14|NONE|MAIL|ructions nag carefully. quickly regular id +33955|812|13|2|29|49671.49|0.03|0.08|N|O|1996-04-17|1996-06-13|1996-05-11|NONE|MAIL|taphs along the +33955|697|60|3|9|14379.21|0.01|0.01|N|O|1996-04-30|1996-06-13|1996-05-07|NONE|REG AIR|odolites haggle furiously-- special +33955|669|70|4|13|20405.58|0.03|0.04|N|O|1996-05-16|1996-05-25|1996-05-20|COLLECT COD|FOB|ts haggle. carefully express requ +33955|1171|80|5|45|48247.65|0.02|0.04|N|O|1996-08-05|1996-07-02|1996-08-15|NONE|AIR|ns? regular +33955|1606|48|6|45|67842.00|0.09|0.03|N|O|1996-06-15|1996-06-09|1996-06-18|DELIVER IN PERSON|MAIL| fluffily express frays. slyly express a +33956|411|99|1|14|18359.74|0.01|0.07|A|F|1992-02-19|1992-03-23|1992-03-16|DELIVER IN PERSON|SHIP|latelets-- carefully regular theo +33956|1091|27|2|5|4960.45|0.08|0.02|A|F|1992-01-25|1992-03-18|1992-02-05|TAKE BACK RETURN|FOB|ously slyly final packages. packages hagg +33956|766|67|3|48|80004.48|0.01|0.07|A|F|1992-04-11|1992-02-21|1992-04-23|COLLECT COD|TRUCK|ke above the plate +33956|593|94|4|47|70198.73|0.01|0.08|A|F|1992-05-09|1992-04-14|1992-06-07|COLLECT COD|AIR|usual packag +33957|1875|76|1|26|46198.62|0.00|0.04|N|O|1998-06-20|1998-08-23|1998-07-02|DELIVER IN PERSON|TRUCK|the furiously bold accounts sleep fluff +33957|794|91|2|17|28811.43|0.03|0.04|N|O|1998-08-25|1998-07-30|1998-08-28|COLLECT COD|SHIP| final excuses. slyly ironic accounts +33957|1383|22|3|40|51375.20|0.02|0.06|N|O|1998-08-05|1998-07-25|1998-08-11|DELIVER IN PERSON|RAIL|ep furiously acros +33957|1068|4|4|34|32948.04|0.09|0.02|N|O|1998-08-11|1998-07-27|1998-09-02|DELIVER IN PERSON|AIR|uriously dogged acc +33957|1992|37|5|23|43561.77|0.02|0.03|N|O|1998-09-25|1998-08-29|1998-10-06|NONE|SHIP|ly even dinos. ironic, final p +33957|979|82|6|9|16919.73|0.08|0.04|N|O|1998-08-14|1998-07-29|1998-09-08|COLLECT COD|TRUCK|eep furiously. even deposi +33958|1344|59|1|16|19925.44|0.07|0.01|R|F|1995-04-15|1995-03-08|1995-05-02|DELIVER IN PERSON|REG AIR|l accounts +33958|1944|33|2|2|3691.88|0.06|0.06|R|F|1995-02-14|1995-04-17|1995-02-15|DELIVER IN PERSON|MAIL|ependencies nag furiously blithely b +33958|727|28|3|13|21160.36|0.05|0.03|R|F|1995-04-17|1995-05-03|1995-05-02|COLLECT COD|SHIP|ndencies sleep fluffily after the un +33959|1406|7|1|3|3922.20|0.07|0.01|R|F|1994-09-15|1994-10-13|1994-10-03|COLLECT COD|AIR|ual deposits. carefully u +33959|467|26|2|48|65638.08|0.00|0.08|R|F|1994-09-07|1994-10-24|1994-09-11|DELIVER IN PERSON|FOB|hely express pac +33959|1966|55|3|8|14943.68|0.05|0.05|A|F|1994-10-16|1994-09-04|1994-11-03|COLLECT COD|REG AIR|ironic, ironic foxes after the +33959|1063|69|4|11|10604.66|0.01|0.06|A|F|1994-09-16|1994-10-08|1994-10-10|DELIVER IN PERSON|REG AIR|ect blithely slyly unusual c +33984|1351|66|1|49|61365.15|0.03|0.01|N|O|1997-07-18|1997-08-14|1997-07-29|DELIVER IN PERSON|AIR|ld theodolites. acc +33985|1788|73|1|10|16897.80|0.05|0.04|A|F|1993-09-19|1993-09-07|1993-09-22|NONE|RAIL|ajole at the quickly pe +33985|1060|66|2|26|24987.56|0.01|0.06|R|F|1993-08-28|1993-09-06|1993-09-12|TAKE BACK RETURN|REG AIR|ully according to th +33985|384|85|3|38|48806.44|0.04|0.03|A|F|1993-07-18|1993-08-28|1993-08-14|NONE|REG AIR|he accounts. pending t +33986|1587|28|1|1|1488.58|0.08|0.07|R|F|1994-05-16|1994-03-15|1994-05-17|NONE|AIR|y against the +33986|1423|24|2|48|63572.16|0.08|0.06|A|F|1994-05-08|1994-03-16|1994-05-12|DELIVER IN PERSON|REG AIR|ven asymptotes. slyly final sauterne +33986|1170|43|3|50|53558.50|0.03|0.05|A|F|1994-02-21|1994-03-18|1994-02-24|COLLECT COD|MAIL|kages. furiously regular r +33987|1798|41|1|41|69691.39|0.05|0.08|N|O|1995-12-20|1996-01-03|1996-01-15|DELIVER IN PERSON|MAIL|jole regularly furiou +33987|1705|48|2|3|4820.10|0.01|0.05|N|O|1995-12-26|1995-11-27|1995-12-30|COLLECT COD|REG AIR|ages solve carefully regular, +33987|1270|82|3|41|48022.07|0.01|0.05|N|O|1996-01-13|1996-01-14|1996-02-11|COLLECT COD|TRUCK|n instructions promis +33987|1941|74|4|22|40544.68|0.04|0.07|N|O|1995-12-14|1995-12-25|1996-01-13|NONE|RAIL|ven requests hang carefull +33987|196|23|5|15|16442.85|0.04|0.03|N|O|1996-01-05|1995-12-08|1996-01-24|COLLECT COD|SHIP| requests wake blithely. s +33988|872|72|1|9|15955.83|0.07|0.00|A|F|1994-04-06|1994-03-19|1994-04-22|NONE|REG AIR|excuses integrate idly idle deposits +33989|565|56|1|48|70346.88|0.01|0.02|R|F|1993-05-26|1993-03-26|1993-06-05|TAKE BACK RETURN|RAIL|g to the ironic deposits. special accou +33990|261|43|1|50|58063.00|0.05|0.01|A|F|1993-04-24|1993-03-10|1993-04-30|COLLECT COD|AIR|es boost. furiously +33991|992|61|1|4|7571.96|0.01|0.00|N|O|1998-08-15|1998-09-11|1998-08-24|COLLECT COD|MAIL|t the furiously unusual deposits. furio +33991|59|85|2|11|10549.55|0.09|0.03|N|O|1998-09-12|1998-09-29|1998-09-30|TAKE BACK RETURN|FOB|ic packages sleep furiously across +34016|1899|100|1|2|3601.78|0.04|0.02|N|O|1996-12-28|1997-02-07|1997-01-10|DELIVER IN PERSON|SHIP|e daringly express, exp +34016|1977|22|2|24|45095.28|0.06|0.02|N|O|1996-12-12|1997-02-13|1997-01-03|TAKE BACK RETURN|FOB|he quickly pending re +34016|1912|45|3|31|56231.21|0.10|0.05|N|O|1997-03-11|1997-03-09|1997-03-27|DELIVER IN PERSON|MAIL|rding to the furiously iro +34016|749|82|4|1|1649.74|0.05|0.05|N|O|1997-03-25|1997-01-14|1997-04-09|COLLECT COD|AIR|inal accounts +34016|1305|6|5|35|42220.50|0.01|0.05|N|O|1997-01-13|1997-02-14|1997-02-09|DELIVER IN PERSON|REG AIR|ongside of the regular, regular escapades n +34016|397|54|6|23|29839.97|0.09|0.08|N|O|1997-03-04|1997-02-15|1997-03-27|NONE|REG AIR|ress accounts. regular d +34016|1703|30|7|40|64188.00|0.08|0.02|N|O|1997-01-18|1997-02-16|1997-02-14|TAKE BACK RETURN|TRUCK|nto beans according to the unu +34017|224|6|1|7|7869.54|0.04|0.01|A|F|1994-03-26|1994-06-03|1994-04-18|DELIVER IN PERSON|MAIL| quickly unusual re +34017|1811|12|2|43|73650.83|0.04|0.04|R|F|1994-06-27|1994-05-03|1994-07-03|DELIVER IN PERSON|SHIP|dolites above the finally entic +34017|1153|90|3|33|34786.95|0.01|0.06|A|F|1994-07-07|1994-06-04|1994-07-14|TAKE BACK RETURN|REG AIR|ully according to the unusual acc +34017|225|26|4|33|37132.26|0.10|0.07|R|F|1994-05-06|1994-05-19|1994-05-16|COLLECT COD|REG AIR|ed excuses ha +34018|381|38|1|45|57662.10|0.00|0.01|N|O|1998-01-09|1997-11-15|1998-02-08|TAKE BACK RETURN|AIR|xpress deposits. unusual deposit +34019|581|72|1|19|28150.02|0.08|0.01|N|O|1998-05-03|1998-06-06|1998-06-01|DELIVER IN PERSON|MAIL| ideas-- quickly final package +34019|988|57|2|35|66114.30|0.10|0.06|N|O|1998-07-05|1998-05-17|1998-07-23|DELIVER IN PERSON|MAIL|posits integrate b +34020|1750|35|1|32|52856.00|0.03|0.02|R|F|1993-04-06|1993-03-27|1993-05-03|TAKE BACK RETURN|REG AIR|carefully ironic packages. carefully ev +34020|1644|27|2|34|52551.76|0.07|0.07|R|F|1993-03-30|1993-04-16|1993-04-23|NONE|FOB|deposits. un +34020|157|36|3|4|4228.60|0.04|0.00|R|F|1993-04-27|1993-04-15|1993-04-28|NONE|RAIL|y express packages cajole quickly ac +34020|319|76|4|34|41456.54|0.02|0.06|A|F|1993-05-15|1993-04-04|1993-06-05|NONE|TRUCK|slyly across the special asymptotes. pla +34020|1265|40|5|11|12828.86|0.03|0.00|R|F|1993-03-29|1993-04-14|1993-04-03|NONE|FOB|packages about the ironic theodoli +34021|1617|41|1|16|24297.76|0.07|0.05|N|O|1996-09-15|1996-09-23|1996-10-10|TAKE BACK RETURN|SHIP|ages. slyly final pin +34022|106|33|1|27|27164.70|0.00|0.02|A|F|1992-12-17|1993-01-13|1993-01-08|NONE|SHIP| furiously pending dependencies +34022|811|12|2|36|61625.16|0.01|0.01|R|F|1992-12-27|1992-12-20|1992-12-28|TAKE BACK RETURN|SHIP|anent packages +34022|1288|63|3|30|35678.40|0.01|0.04|A|F|1992-12-01|1993-01-12|1992-12-20|NONE|REG AIR|s cajole blithe +34022|1024|25|4|49|45325.98|0.06|0.06|R|F|1993-02-19|1993-01-15|1993-03-15|NONE|TRUCK| slyly special theodolites ou +34022|1229|41|5|4|4520.88|0.06|0.03|A|F|1993-01-08|1992-12-22|1993-01-12|COLLECT COD|SHIP| are acros +34023|851|52|1|31|54307.35|0.05|0.08|R|F|1993-10-16|1993-09-15|1993-10-31|COLLECT COD|SHIP|liers. slyly final deposi +34023|1911|44|2|9|16316.19|0.08|0.00|R|F|1993-08-16|1993-11-06|1993-08-26|TAKE BACK RETURN|AIR|ggle furiously. instruc +34023|1090|61|3|50|49554.50|0.01|0.03|A|F|1993-11-26|1993-11-09|1993-12-19|NONE|MAIL|oss the fluffily regular +34023|955|90|4|40|74238.00|0.02|0.03|R|F|1993-08-31|1993-09-16|1993-09-14|COLLECT COD|AIR|egular dep +34048|1924|69|1|47|85818.24|0.01|0.04|N|O|1995-06-22|1995-05-14|1995-07-21|TAKE BACK RETURN|TRUCK|usly ironic +34048|1005|6|2|1|906.00|0.00|0.01|N|F|1995-05-21|1995-06-12|1995-06-20|COLLECT COD|RAIL|even deposits. carefull +34048|1593|74|3|41|61278.19|0.02|0.07|N|F|1995-06-16|1995-05-07|1995-07-15|NONE|FOB|uriously unusual frays sleep +34048|704|69|4|24|38512.80|0.00|0.05|N|O|1995-06-20|1995-05-16|1995-07-15|DELIVER IN PERSON|MAIL| use carefully? regular requests haggl +34048|1204|16|5|43|47523.60|0.00|0.02|R|F|1995-04-29|1995-06-17|1995-05-09|DELIVER IN PERSON|TRUCK|p carefully thinly regular dugouts. bli +34048|1851|38|6|46|80631.10|0.04|0.02|N|O|1995-07-27|1995-05-23|1995-08-06|COLLECT COD|SHIP|eposits. qui +34049|192|45|1|10|10921.90|0.08|0.00|R|F|1995-02-10|1995-03-09|1995-02-19|NONE|SHIP|uests around the fu +34049|624|87|2|28|42689.36|0.03|0.08|R|F|1995-02-23|1995-03-21|1995-03-03|COLLECT COD|TRUCK|e blithely blithely expre +34050|1709|36|1|17|27381.90|0.10|0.00|A|F|1993-04-21|1993-05-15|1993-05-05|DELIVER IN PERSON|RAIL|nal ideas cajole. q +34051|1426|44|1|42|55751.64|0.08|0.08|N|O|1996-06-12|1996-04-13|1996-07-03|DELIVER IN PERSON|TRUCK|e quickly regular pint +34051|118|97|2|43|43778.73|0.02|0.00|N|O|1996-03-11|1996-04-25|1996-03-17|TAKE BACK RETURN|FOB|ts sleep ent +34051|351|8|3|43|53808.05|0.04|0.03|N|O|1996-05-29|1996-05-11|1996-06-04|TAKE BACK RETURN|SHIP|, unusual requ +34051|842|42|4|30|52285.20|0.10|0.01|N|O|1996-04-29|1996-05-23|1996-05-12|TAKE BACK RETURN|AIR|s grow toward +34051|1455|56|5|15|20346.75|0.00|0.06|N|O|1996-05-09|1996-04-13|1996-05-13|NONE|FOB|eposits. silent, pending accounts are slyl +34051|454|55|6|39|52823.55|0.07|0.07|N|O|1996-06-19|1996-05-06|1996-06-29|COLLECT COD|REG AIR|gular asymptote +34051|766|31|7|4|6667.04|0.04|0.03|N|O|1996-03-28|1996-04-28|1996-04-01|TAKE BACK RETURN|FOB|c platelets thrash fluffil +34052|1492|71|1|32|44591.68|0.01|0.01|N|O|1996-09-03|1996-09-13|1996-09-29|DELIVER IN PERSON|RAIL| boldly unus +34052|185|38|2|10|10851.80|0.10|0.07|N|O|1996-10-20|1996-09-24|1996-11-14|TAKE BACK RETURN|REG AIR|refully unusual theodolites. si +34052|422|10|3|4|5289.68|0.07|0.00|N|O|1996-07-09|1996-08-11|1996-07-12|DELIVER IN PERSON|MAIL|usly pearls. carefully ironic instruc +34052|1515|96|4|37|52410.87|0.05|0.06|N|O|1996-09-06|1996-08-17|1996-09-19|COLLECT COD|FOB|ncies subl +34052|848|49|5|6|10493.04|0.03|0.07|N|O|1996-08-30|1996-08-11|1996-09-24|DELIVER IN PERSON|FOB|tructions bo +34053|258|13|1|6|6949.50|0.06|0.03|N|O|1998-01-07|1997-11-26|1998-01-30|NONE|FOB|ake furiously. +34053|770|3|2|31|51793.87|0.06|0.01|N|O|1997-11-21|1997-11-16|1997-12-19|DELIVER IN PERSON|FOB|y final theodolites detect about the +34053|1152|61|3|11|11584.65|0.04|0.04|N|O|1998-01-08|1997-11-24|1998-01-31|NONE|MAIL|jole blith +34053|294|49|4|43|51354.47|0.09|0.05|N|O|1998-01-04|1997-12-12|1998-01-16|COLLECT COD|TRUCK|lar packages cajole slyly quickly ruthle +34053|703|68|5|21|33677.70|0.06|0.02|N|O|1997-09-27|1997-10-27|1997-09-29|COLLECT COD|SHIP| asymptotes haggle blithely about the fin +34053|933|2|6|19|34844.67|0.01|0.06|N|O|1998-01-02|1997-12-06|1998-01-28|COLLECT COD|RAIL|the slyly silent requests cajole +34054|1077|78|1|19|18583.33|0.04|0.05|N|O|1997-07-10|1997-08-07|1997-07-28|NONE|TRUCK|furiously unusual ac +34054|15|16|2|28|25620.28|0.04|0.05|N|O|1997-06-25|1997-07-10|1997-07-25|COLLECT COD|AIR|courts! carefully regular instructions i +34054|491|50|3|42|58442.58|0.03|0.02|N|O|1997-07-05|1997-07-11|1997-08-03|NONE|FOB|l deposits lose carefully re +34054|730|63|4|12|19568.76|0.06|0.06|N|O|1997-08-30|1997-07-07|1997-09-19|COLLECT COD|RAIL|quick theodolites sleep blithely +34054|362|19|5|25|31559.00|0.02|0.05|N|O|1997-06-08|1997-07-05|1997-06-28|TAKE BACK RETURN|REG AIR|iously final foxes. quickly +34054|635|36|6|10|15356.30|0.10|0.00|N|O|1997-08-06|1997-06-23|1997-08-25|TAKE BACK RETURN|TRUCK|the carefully express theodoli +34055|645|77|1|5|7728.20|0.03|0.06|A|F|1995-02-17|1995-02-06|1995-03-09|NONE|MAIL|efully furiously regular sentime +34055|486|45|2|43|59618.64|0.08|0.08|A|F|1994-12-22|1995-02-25|1995-01-04|NONE|AIR|ress, even reque +34055|339|40|3|26|32222.58|0.01|0.07|A|F|1994-12-31|1995-02-05|1995-01-25|COLLECT COD|MAIL|ions are quickly unusual accounts. blith +34080|682|76|1|45|71220.60|0.07|0.03|N|O|1996-08-18|1996-09-08|1996-08-30|COLLECT COD|FOB| fluffily final +34080|465|24|2|49|66907.54|0.05|0.06|N|O|1996-10-04|1996-10-09|1996-10-11|NONE|RAIL|es are quickly against +34080|319|20|3|26|31702.06|0.03|0.04|N|O|1996-10-24|1996-10-10|1996-10-27|NONE|FOB| after the quickly iron +34080|1801|45|4|49|83437.20|0.03|0.05|N|O|1996-08-07|1996-08-22|1996-08-11|COLLECT COD|FOB|its. platelets nag +34080|1764|65|5|44|73293.44|0.03|0.00|N|O|1996-10-25|1996-09-14|1996-11-20|TAKE BACK RETURN|SHIP|. fluffily cl +34080|1309|48|6|28|33888.40|0.10|0.04|N|O|1996-10-31|1996-09-24|1996-11-18|NONE|REG AIR|s sleep along the ironic dep +34080|110|63|7|3|3030.33|0.00|0.08|N|O|1996-09-30|1996-09-29|1996-10-23|COLLECT COD|TRUCK|ss packages haggle. final depende +34081|658|59|1|37|57670.05|0.00|0.01|A|F|1994-06-20|1994-06-03|1994-07-10|TAKE BACK RETURN|TRUCK|thin frets sleep after the fluffil +34081|1295|70|2|42|50244.18|0.08|0.05|A|F|1994-07-02|1994-07-04|1994-07-04|DELIVER IN PERSON|TRUCK|yly. slyly fluffy p +34081|342|71|3|12|14908.08|0.02|0.03|A|F|1994-05-31|1994-06-25|1994-06-24|DELIVER IN PERSON|AIR|ke carefully iro +34081|1355|70|4|44|55279.40|0.02|0.04|A|F|1994-07-12|1994-07-04|1994-07-15|TAKE BACK RETURN|AIR|h the slyly special instructions. c +34081|40|41|5|50|47002.00|0.08|0.02|A|F|1994-05-12|1994-06-14|1994-05-16|TAKE BACK RETURN|SHIP|ect. requests cajole. dep +34081|780|77|6|28|47061.84|0.01|0.06|A|F|1994-06-01|1994-07-10|1994-06-23|COLLECT COD|REG AIR| final, special accounts alon +34082|726|59|1|24|39041.28|0.05|0.01|N|O|1996-02-08|1995-12-18|1996-03-07|NONE|FOB| to use even asy +34082|1270|8|2|48|56220.96|0.01|0.00|N|O|1995-12-28|1995-12-11|1996-01-13|COLLECT COD|TRUCK|its. fluffily pen +34082|185|12|3|24|26044.32|0.01|0.04|N|O|1995-12-19|1995-12-16|1996-01-05|NONE|FOB|thlessly regula +34082|1579|60|4|1|1480.57|0.02|0.07|N|O|1996-01-30|1995-12-22|1996-02-17|DELIVER IN PERSON|TRUCK|ronic accou +34082|1678|79|5|17|26854.39|0.06|0.01|N|O|1996-01-22|1995-12-25|1996-02-04|DELIVER IN PERSON|MAIL|nal requests. +34082|13|39|6|34|31042.34|0.02|0.03|N|O|1995-12-25|1996-01-17|1996-01-08|DELIVER IN PERSON|REG AIR|ests use even ideas: +34083|519|20|1|8|11356.08|0.04|0.02|R|F|1992-05-13|1992-03-14|1992-05-23|COLLECT COD|REG AIR|ss packages use +34083|1451|69|2|31|41925.95|0.04|0.08|A|F|1992-06-02|1992-04-29|1992-06-13|TAKE BACK RETURN|REG AIR|ckages. quickly regular frays above t +34083|120|21|3|46|46925.52|0.06|0.06|R|F|1992-05-30|1992-04-07|1992-06-27|DELIVER IN PERSON|AIR|y final instructions are. ideas wake. t +34083|1105|78|4|21|21128.10|0.01|0.01|A|F|1992-05-29|1992-03-16|1992-06-20|TAKE BACK RETURN|RAIL|ironic depo +34083|1420|21|5|8|10571.36|0.09|0.03|R|F|1992-04-02|1992-04-21|1992-04-18|TAKE BACK RETURN|TRUCK|inal depos +34083|1860|90|6|42|73998.12|0.00|0.01|R|F|1992-03-18|1992-04-03|1992-03-24|COLLECT COD|REG AIR|deas cajole c +34084|1329|30|1|35|43061.20|0.09|0.06|N|O|1997-03-28|1997-04-27|1997-04-22|TAKE BACK RETURN|RAIL|ial instructions ar +34084|1000|35|2|4|3604.00|0.03|0.03|N|O|1997-06-03|1997-04-28|1997-06-22|DELIVER IN PERSON|MAIL|nts wake bli +34084|451|10|3|39|52706.55|0.02|0.00|N|O|1997-03-27|1997-05-14|1997-04-14|NONE|SHIP|ide of the +34084|628|60|4|26|39744.12|0.03|0.00|N|O|1997-03-15|1997-05-01|1997-04-11|NONE|TRUCK|uriously. regular +34085|1041|47|1|12|11304.48|0.02|0.04|R|F|1993-09-29|1993-08-27|1993-10-24|COLLECT COD|REG AIR|nstructions. quickly final +34086|1763|90|1|26|43283.76|0.00|0.04|A|F|1992-07-31|1992-07-15|1992-08-18|NONE|SHIP| even sentiments detect car +34087|611|5|1|8|12092.88|0.07|0.03|A|F|1994-11-13|1994-08-25|1994-11-23|NONE|RAIL|onic deposits. regular, regular instructio +34087|1465|5|2|6|8198.76|0.00|0.08|R|F|1994-10-03|1994-09-07|1994-10-19|NONE|SHIP|es nag quickly blithely s +34112|297|79|1|34|40707.86|0.03|0.06|N|O|1995-10-21|1995-11-28|1995-11-12|COLLECT COD|AIR|yly around the slyly even accounts. +34112|957|26|2|19|35301.05|0.01|0.04|N|O|1995-09-13|1995-10-03|1995-10-08|COLLECT COD|MAIL|rding to the s +34112|507|38|3|42|59115.00|0.09|0.06|N|O|1995-09-23|1995-10-05|1995-10-22|COLLECT COD|REG AIR|l deposits haggle according to the fu +34112|1779|6|4|14|23530.78|0.00|0.00|N|O|1995-12-24|1995-10-18|1996-01-03|NONE|FOB|ular asympto +34113|1414|32|1|8|10523.28|0.02|0.06|N|O|1998-04-13|1998-05-14|1998-04-29|DELIVER IN PERSON|AIR|ans nag special accounts. blithely ir +34113|805|39|2|13|22175.40|0.09|0.00|N|O|1998-04-10|1998-04-06|1998-05-06|TAKE BACK RETURN|REG AIR|ular packages wake across the quickly +34113|1738|81|3|48|78707.04|0.04|0.08|N|O|1998-03-06|1998-03-31|1998-03-12|COLLECT COD|TRUCK|! deposits along the reque +34113|1966|11|4|4|7471.84|0.05|0.06|N|O|1998-05-30|1998-04-21|1998-06-15|DELIVER IN PERSON|MAIL|accounts. ironic ideas wake pending, silent +34113|283|84|5|32|37864.96|0.10|0.02|N|O|1998-03-02|1998-04-12|1998-03-10|TAKE BACK RETURN|FOB|ully specia +34113|158|11|6|39|41267.85|0.00|0.06|N|O|1998-03-21|1998-04-07|1998-03-24|COLLECT COD|MAIL|ackages haggle q +34113|1737|80|7|9|14748.57|0.06|0.07|N|O|1998-04-21|1998-05-26|1998-05-04|COLLECT COD|SHIP|es wake alo +34114|191|44|1|32|34918.08|0.00|0.04|R|F|1994-05-31|1994-06-25|1994-06-17|NONE|SHIP|special requests +34114|1392|31|2|35|45268.65|0.09|0.07|R|F|1994-09-05|1994-07-05|1994-10-03|DELIVER IN PERSON|MAIL|nt slyly express, regular +34114|1265|40|3|15|17493.90|0.10|0.08|R|F|1994-05-19|1994-07-26|1994-05-27|DELIVER IN PERSON|AIR|ts haggle. unusual dep +34115|188|41|1|15|16322.70|0.04|0.02|A|F|1994-06-14|1994-08-05|1994-06-17|DELIVER IN PERSON|AIR|uses wake regular requests. fluffily exp +34115|937|72|2|42|77193.06|0.10|0.02|R|F|1994-07-31|1994-06-22|1994-08-14|COLLECT COD|REG AIR|ound the quickly special package +34115|153|54|3|33|34753.95|0.06|0.00|R|F|1994-08-07|1994-08-06|1994-08-22|TAKE BACK RETURN|FOB| bold foxes. final, unusual foxes play fluf +34115|1475|76|4|32|44047.04|0.04|0.08|R|F|1994-06-04|1994-07-27|1994-06-28|NONE|FOB|nusual dep +34115|161|88|5|25|26529.00|0.06|0.03|A|F|1994-07-26|1994-08-15|1994-07-27|NONE|RAIL|usual dependencies across +34115|1934|79|6|30|55077.90|0.01|0.03|A|F|1994-06-02|1994-08-05|1994-06-11|COLLECT COD|SHIP|lly express deposits. unusual excus +34115|534|95|7|40|57381.20|0.08|0.08|R|F|1994-06-25|1994-07-22|1994-06-28|DELIVER IN PERSON|REG AIR|sly ironic platelets. re +34116|1366|5|1|6|7604.16|0.09|0.01|R|F|1993-08-06|1993-05-31|1993-08-24|TAKE BACK RETURN|MAIL|g carefully. quickly +34116|279|7|2|7|8254.89|0.00|0.01|A|F|1993-04-26|1993-06-26|1993-05-16|DELIVER IN PERSON|REG AIR|usly. blithely busy deposits sleep +34116|1118|91|3|25|25477.75|0.05|0.00|R|F|1993-07-13|1993-07-19|1993-08-01|DELIVER IN PERSON|TRUCK|nic foxes. pending pinto beans ac +34116|983|86|4|49|92315.02|0.01|0.02|A|F|1993-06-01|1993-07-15|1993-06-29|COLLECT COD|MAIL|the furious +34117|1620|21|1|35|53256.70|0.05|0.06|R|F|1992-02-13|1992-04-06|1992-02-26|DELIVER IN PERSON|FOB| across the regular platelets haggl +34117|1945|90|2|49|90500.06|0.09|0.08|R|F|1992-03-10|1992-04-28|1992-03-19|TAKE BACK RETURN|REG AIR|cuses. fluffily regular +34117|621|22|3|27|41083.74|0.09|0.07|R|F|1992-04-22|1992-04-05|1992-05-03|TAKE BACK RETURN|FOB| instructions detect silently across the ca +34117|242|24|4|27|30840.48|0.00|0.07|R|F|1992-04-19|1992-03-17|1992-05-13|COLLECT COD|FOB|ld waters abo +34117|1973|6|5|42|78748.74|0.02|0.00|A|F|1992-04-17|1992-03-20|1992-04-23|COLLECT COD|SHIP| escapades +34118|1286|24|1|13|15434.64|0.10|0.01|N|O|1997-07-28|1997-09-28|1997-08-18|TAKE BACK RETURN|RAIL|sly above the regu +34118|1783|68|2|1|1684.78|0.08|0.00|N|O|1997-10-25|1997-09-13|1997-11-03|NONE|SHIP|y affix slyly. even grouches boost about t +34118|784|17|3|4|6739.12|0.09|0.04|N|O|1997-11-04|1997-09-06|1997-12-01|NONE|AIR|ly special courts. +34119|1194|95|1|30|32855.70|0.10|0.00|N|O|1997-10-31|1998-01-07|1997-11-17|NONE|RAIL|es according to the carefu +34119|1569|50|2|14|20587.84|0.01|0.00|N|O|1997-10-21|1997-11-25|1997-10-24|TAKE BACK RETURN|REG AIR|accounts use according to the packag +34119|371|100|3|46|58483.02|0.05|0.03|N|O|1997-12-07|1998-01-02|1997-12-26|NONE|TRUCK|hely along the +34119|1305|20|4|33|39807.90|0.09|0.06|N|O|1997-12-08|1997-12-28|1997-12-14|NONE|TRUCK|. carefully express id +34144|480|68|1|31|42794.88|0.08|0.05|R|F|1994-08-19|1994-08-26|1994-09-02|COLLECT COD|AIR|he pending w +34144|1016|22|2|3|2751.03|0.08|0.08|R|F|1994-07-14|1994-07-25|1994-07-20|TAKE BACK RETURN|FOB| fluffily. carefully fina +34144|358|59|3|26|32717.10|0.01|0.08|R|F|1994-09-10|1994-07-13|1994-09-22|COLLECT COD|SHIP|nic deposits along the blithely unusual +34145|781|82|1|45|75680.10|0.07|0.05|A|F|1992-02-12|1992-02-12|1992-02-16|TAKE BACK RETURN|AIR|nstructions about the final d +34145|230|31|2|14|15823.22|0.06|0.00|R|F|1992-02-12|1992-02-06|1992-03-05|DELIVER IN PERSON|SHIP|ual asymptotes. ironic foxes s +34146|1686|87|1|46|73033.28|0.01|0.03|N|O|1998-07-08|1998-08-23|1998-07-25|COLLECT COD|SHIP|uses. pending, pending theodo +34147|563|64|1|30|43906.80|0.03|0.02|N|O|1997-02-12|1996-12-17|1997-02-23|COLLECT COD|REG AIR|al instructions +34148|1322|23|1|23|28136.36|0.01|0.05|A|F|1992-09-07|1992-11-17|1992-09-12|DELIVER IN PERSON|SHIP|olites sleep slyly pending +34148|1506|47|2|39|54892.50|0.08|0.03|R|F|1992-09-26|1992-11-09|1992-09-30|TAKE BACK RETURN|MAIL|ronically realms. blithely fina +34148|263|18|3|29|33734.54|0.04|0.05|A|F|1992-11-26|1992-09-28|1992-11-29|COLLECT COD|AIR|asymptotes wake dependencies. unusual +34148|1826|56|4|37|63929.34|0.00|0.07|R|F|1992-11-22|1992-10-27|1992-11-29|NONE|AIR|s are! busy, regular foxes alongside of +34148|243|44|5|9|10289.16|0.08|0.05|A|F|1992-11-13|1992-10-21|1992-11-22|COLLECT COD|FOB|ress ideas. slyly re +34148|518|79|6|41|58158.91|0.06|0.08|A|F|1992-09-07|1992-09-23|1992-09-24|NONE|AIR|sual requests +34148|224|79|7|9|10117.98|0.10|0.03|A|F|1992-10-05|1992-10-01|1992-10-23|TAKE BACK RETURN|SHIP|l accounts. carefully even idea +34149|789|54|1|40|67591.20|0.04|0.07|N|O|1997-11-26|1997-10-13|1997-12-23|TAKE BACK RETURN|RAIL|side of the pending deposits. regular gr +34149|1402|81|2|25|32585.00|0.07|0.06|N|O|1997-11-12|1997-10-23|1997-11-19|COLLECT COD|RAIL|sts cajole. boldly regular +34149|946|49|3|22|40632.68|0.10|0.02|N|O|1997-09-28|1997-11-22|1997-10-14|NONE|TRUCK|cial ideas. blithely even accounts after t +34149|830|31|4|23|39809.09|0.07|0.02|N|O|1997-12-26|1997-11-26|1998-01-21|NONE|SHIP|ly after the carefully ir +34149|225|53|5|8|9001.76|0.03|0.04|N|O|1997-10-31|1997-10-16|1997-11-13|TAKE BACK RETURN|AIR|ans haggle furiously despite the package +34149|1853|83|6|16|28077.60|0.05|0.04|N|O|1997-11-10|1997-11-23|1997-11-28|DELIVER IN PERSON|TRUCK|gular accounts x-ray furious +34150|195|48|1|41|44902.79|0.00|0.04|A|F|1993-04-06|1993-03-25|1993-05-05|TAKE BACK RETURN|MAIL| accounts. i +34150|1800|27|2|12|20421.60|0.04|0.00|R|F|1993-04-27|1993-05-08|1993-05-16|DELIVER IN PERSON|REG AIR| dependencies +34150|1217|29|3|22|24600.62|0.02|0.04|R|F|1993-04-11|1993-04-21|1993-04-20|DELIVER IN PERSON|SHIP|sual platelets around the fur +34151|686|80|1|12|19040.16|0.05|0.02|N|O|1995-10-03|1995-10-12|1995-10-17|TAKE BACK RETURN|RAIL|fluffily ir +34151|1564|5|2|30|43966.80|0.07|0.04|N|O|1995-10-13|1995-12-01|1995-11-10|COLLECT COD|RAIL|fter the ironic foxes. quickl +34151|1092|63|3|10|9930.90|0.03|0.04|N|O|1995-09-14|1995-10-10|1995-10-07|TAKE BACK RETURN|SHIP| furiously bol +34151|839|39|4|23|40016.09|0.00|0.02|N|O|1995-10-10|1995-10-27|1995-10-12|NONE|AIR|ly according to the ironic asymptotes +34151|1970|59|5|36|67390.92|0.02|0.03|N|O|1995-10-15|1995-10-20|1995-10-16|COLLECT COD|RAIL|lar accounts. quic +34151|212|40|6|34|37815.14|0.05|0.04|N|O|1995-10-24|1995-10-31|1995-11-10|DELIVER IN PERSON|MAIL|leep quickly. fluffily b +34151|400|1|7|42|54616.80|0.00|0.00|N|O|1995-10-28|1995-10-28|1995-11-14|DELIVER IN PERSON|TRUCK|ly silent packages. slyly ironic +34176|1380|95|1|46|58943.48|0.05|0.06|A|F|1994-04-17|1994-05-15|1994-05-17|DELIVER IN PERSON|MAIL| the express, ironic packages are furio +34177|995|98|1|19|36023.81|0.03|0.04|R|F|1994-10-06|1994-10-25|1994-10-28|TAKE BACK RETURN|FOB|have to wake furiously slyly special e +34177|1387|2|2|50|64419.00|0.07|0.03|A|F|1994-12-10|1994-10-15|1995-01-04|TAKE BACK RETURN|REG AIR|olites sleep after the +34177|532|63|3|22|31515.66|0.06|0.01|R|F|1994-11-22|1994-10-30|1994-12-09|TAKE BACK RETURN|MAIL|ites sleep. iro +34177|816|16|4|37|63521.97|0.00|0.06|R|F|1994-08-23|1994-11-03|1994-09-06|TAKE BACK RETURN|TRUCK|deas? express instru +34177|1836|23|5|22|38232.26|0.00|0.02|A|F|1994-12-04|1994-10-25|1994-12-30|TAKE BACK RETURN|MAIL|ealthily regular depo +34177|725|90|6|7|11380.04|0.02|0.07|R|F|1994-09-09|1994-11-07|1994-09-17|NONE|FOB| nag blithely. furiously regular pains +34178|1019|90|1|15|13800.15|0.01|0.03|N|O|1996-01-26|1995-12-09|1996-02-21|COLLECT COD|TRUCK|ss packages wake quickly +34178|783|16|2|23|38726.94|0.04|0.05|N|O|1995-12-06|1995-12-28|1995-12-15|NONE|MAIL|xes integrate above the instruc +34178|1254|55|3|16|18484.00|0.04|0.00|N|O|1996-03-05|1995-12-18|1996-03-30|DELIVER IN PERSON|FOB|aggle carefully. blithe deposits are fin +34178|1580|21|4|37|54818.46|0.02|0.01|N|O|1996-01-18|1995-12-28|1996-02-06|COLLECT COD|TRUCK|accounts haggle blithely ironic +34179|835|69|1|18|31244.94|0.04|0.03|N|O|1995-12-13|1995-12-29|1996-01-06|DELIVER IN PERSON|MAIL|es hang slyly among the slyly eve +34179|325|10|2|35|42886.20|0.00|0.08|N|O|1995-11-16|1995-12-12|1995-12-11|DELIVER IN PERSON|REG AIR|eep alongside of the dolphins-- carefully +34179|1004|5|3|32|28960.00|0.03|0.00|N|O|1996-02-13|1996-01-28|1996-02-26|TAKE BACK RETURN|FOB|-ray fluffily according +34179|392|77|4|10|12923.90|0.01|0.02|N|O|1995-12-21|1995-12-31|1996-01-15|TAKE BACK RETURN|FOB|ven pinto beans. ca +34180|1450|51|1|50|67572.50|0.02|0.08|N|O|1995-12-06|1995-11-20|1995-12-24|TAKE BACK RETURN|RAIL|ully according to +34180|966|1|2|47|87747.12|0.10|0.01|N|O|1995-10-24|1995-11-24|1995-10-26|NONE|MAIL| ideas wake slyly carefully bold request +34180|1481|82|3|36|49769.28|0.08|0.03|N|O|1995-12-25|1995-11-23|1996-01-11|COLLECT COD|AIR|le blithely beneat +34180|974|75|4|17|31874.49|0.05|0.08|N|O|1995-11-10|1995-11-17|1995-11-14|NONE|REG AIR|ly final packages haggle. asymptotes int +34180|1895|96|5|38|68281.82|0.08|0.05|N|O|1995-10-29|1995-11-25|1995-11-21|COLLECT COD|SHIP|quests. pinto beans nag slyly perma +34181|1873|17|1|13|23073.31|0.00|0.08|N|O|1998-02-07|1998-02-03|1998-02-21|DELIVER IN PERSON|RAIL|he blithely pend +34181|90|41|2|24|23762.16|0.10|0.01|N|O|1998-02-25|1998-02-05|1998-03-10|TAKE BACK RETURN|REG AIR|blithely final fo +34181|437|25|3|1|1337.43|0.08|0.05|N|O|1998-01-07|1998-01-22|1998-01-11|TAKE BACK RETURN|SHIP|regular ideas hind +34182|1759|2|1|25|41518.75|0.09|0.07|R|F|1992-11-24|1993-01-13|1992-11-26|DELIVER IN PERSON|MAIL|its. blithely bold deposits s +34182|7|8|2|47|42629.00|0.02|0.05|R|F|1992-10-19|1992-11-17|1992-11-09|DELIVER IN PERSON|TRUCK| final pinto beans. +34183|626|27|1|15|22899.30|0.05|0.05|R|F|1994-06-29|1994-07-27|1994-07-14|DELIVER IN PERSON|TRUCK|ic accounts. blithely +34208|725|58|1|13|21134.36|0.01|0.07|R|F|1994-10-02|1994-10-02|1994-10-10|TAKE BACK RETURN|REG AIR|mptotes about the furi +34208|921|56|2|38|69232.96|0.03|0.05|A|F|1994-12-09|1994-09-18|1994-12-30|COLLECT COD|RAIL|ronic requests use carefully express requ +34209|1517|38|1|37|52484.87|0.05|0.08|A|F|1993-10-11|1993-09-29|1993-10-28|TAKE BACK RETURN|MAIL|s along the quickly +34209|1993|94|2|25|47374.75|0.03|0.01|R|F|1993-09-22|1993-11-18|1993-10-17|DELIVER IN PERSON|REG AIR|uickly silent deposi +34209|1841|28|3|3|5228.52|0.06|0.03|R|F|1993-11-07|1993-10-28|1993-11-15|DELIVER IN PERSON|TRUCK| furiously ironic acco +34209|558|89|4|34|49590.70|0.08|0.04|A|F|1993-11-22|1993-11-05|1993-12-17|DELIVER IN PERSON|TRUCK|re blithely! ironic pla +34209|1390|67|5|50|64569.50|0.07|0.07|A|F|1993-12-01|1993-11-13|1993-12-13|DELIVER IN PERSON|REG AIR|onic foxes. braids integrate carefull +34209|630|62|6|41|62755.83|0.00|0.05|R|F|1993-11-21|1993-10-20|1993-11-22|COLLECT COD|RAIL|ys. furiously ironic reque +34210|697|98|1|49|78286.81|0.08|0.04|N|O|1997-07-26|1997-08-21|1997-08-10|TAKE BACK RETURN|AIR|ar, regular requests. blithe +34210|787|52|2|12|20253.36|0.05|0.07|N|O|1997-09-11|1997-09-01|1997-10-09|NONE|MAIL|s. carefull +34210|945|80|3|29|53532.26|0.07|0.05|N|O|1997-09-15|1997-08-24|1997-10-10|NONE|TRUCK|le quickly. carefully +34210|1140|41|4|46|47892.44|0.10|0.02|N|O|1997-07-19|1997-07-31|1997-07-24|COLLECT COD|AIR|ackages integr +34210|769|34|5|33|55102.08|0.01|0.05|N|O|1997-06-22|1997-07-31|1997-07-08|NONE|SHIP|ss accounts cajole busil +34210|1438|17|6|41|54916.63|0.01|0.01|N|O|1997-08-21|1997-08-24|1997-09-12|TAKE BACK RETURN|SHIP|uests haggle furiou +34211|172|99|1|39|41814.63|0.01|0.03|R|F|1992-04-30|1992-03-17|1992-05-04|NONE|SHIP| affix slyly packages. +34211|1611|35|2|22|33277.42|0.07|0.08|R|F|1992-03-07|1992-05-05|1992-03-23|DELIVER IN PERSON|FOB|etect carefully abov +34211|1039|45|3|45|42301.35|0.02|0.02|R|F|1992-04-30|1992-04-08|1992-05-05|TAKE BACK RETURN|AIR| deposits cajole furi +34212|27|3|1|35|32445.70|0.08|0.02|N|O|1996-06-02|1996-05-11|1996-06-26|DELIVER IN PERSON|FOB| across the busy foxes sleep through the br +34212|7|33|2|33|29931.00|0.10|0.05|N|O|1996-06-17|1996-05-20|1996-07-08|TAKE BACK RETURN|TRUCK|quickly regular foxes sleep. unusua +34212|1940|73|3|3|5525.82|0.09|0.01|N|O|1996-06-17|1996-06-08|1996-06-25|COLLECT COD|RAIL|uiet deposits bo +34212|163|64|4|1|1063.16|0.03|0.04|N|O|1996-04-11|1996-05-11|1996-04-30|NONE|SHIP|ve around the quickly final asymptotes. f +34212|131|58|5|34|35058.42|0.01|0.03|N|O|1996-07-03|1996-06-27|1996-07-20|TAKE BACK RETURN|FOB|special accounts. carefully regular +34212|1882|26|6|2|3567.76|0.06|0.05|N|O|1996-05-31|1996-05-23|1996-06-14|DELIVER IN PERSON|FOB|hely bold cour +34212|1200|9|7|3|3303.60|0.07|0.00|N|O|1996-04-26|1996-05-20|1996-05-16|NONE|FOB|ithely regular +34213|1008|44|1|50|45450.00|0.05|0.07|N|O|1997-07-22|1997-06-24|1997-08-21|COLLECT COD|REG AIR| wake furiously final theodoli +34213|4|5|2|36|32544.00|0.03|0.01|N|O|1997-05-19|1997-08-09|1997-05-29|TAKE BACK RETURN|AIR|ven packages ha +34213|339|68|3|3|3717.99|0.10|0.02|N|O|1997-08-19|1997-08-01|1997-08-20|NONE|AIR|ully ruthless deposits +34213|1371|72|4|26|33081.62|0.03|0.04|N|O|1997-07-25|1997-07-29|1997-08-04|DELIVER IN PERSON|REG AIR|ests cajole +34213|1867|11|5|15|26532.90|0.08|0.03|N|O|1997-06-26|1997-06-22|1997-07-02|COLLECT COD|SHIP| regular, quick realms nod carefully +34214|19|20|1|20|18380.20|0.03|0.06|N|O|1998-06-16|1998-07-24|1998-07-01|TAKE BACK RETURN|TRUCK| requests boost; regular pearls int +34214|554|85|2|37|53818.35|0.05|0.07|N|O|1998-07-10|1998-07-12|1998-07-15|NONE|FOB| ironic platelets haggle blithely. spe +34214|1593|14|3|50|74729.50|0.08|0.02|N|O|1998-05-25|1998-06-13|1998-06-11|COLLECT COD|FOB|ing courts wake b +34215|1570|91|1|22|32374.54|0.05|0.00|A|F|1995-05-24|1995-07-02|1995-05-25|NONE|MAIL|bout the carefully ironic requests +34215|876|10|2|44|78182.28|0.09|0.03|N|F|1995-06-06|1995-07-01|1995-06-23|TAKE BACK RETURN|FOB|print blithely. foxes integrate +34215|1226|1|3|28|31562.16|0.04|0.02|A|F|1995-06-10|1995-06-22|1995-06-16|TAKE BACK RETURN|AIR| the pending, s +34215|208|36|4|42|46544.40|0.08|0.05|N|O|1995-07-26|1995-06-25|1995-08-02|NONE|FOB| fluffily quiet braids. express re +34240|53|79|1|45|42887.25|0.01|0.01|N|O|1997-09-29|1997-10-31|1997-10-26|DELIVER IN PERSON|FOB|the slyly ironic +34240|430|60|2|38|50556.34|0.05|0.01|N|O|1997-12-22|1997-12-10|1998-01-05|TAKE BACK RETURN|AIR| quick deposits los +34240|153|80|3|6|6318.90|0.07|0.06|N|O|1997-12-07|1997-12-09|1998-01-06|COLLECT COD|TRUCK|nal deposits. fin +34240|1443|22|4|36|48399.84|0.09|0.05|N|O|1997-12-27|1997-11-30|1998-01-13|TAKE BACK RETURN|AIR| deposits are quickly ironic dolp +34240|577|8|5|16|23641.12|0.03|0.00|N|O|1997-12-23|1997-11-19|1998-01-02|TAKE BACK RETURN|AIR|requests. slyly express packages haggle sl +34241|357|14|1|36|45264.60|0.09|0.08|R|F|1992-10-12|1992-11-23|1992-11-01|DELIVER IN PERSON|MAIL|y even, ironi +34241|317|18|2|33|40171.23|0.09|0.08|R|F|1992-10-31|1992-12-13|1992-11-08|NONE|FOB|equests in +34241|1262|100|3|15|17448.90|0.00|0.00|R|F|1992-10-29|1992-11-09|1992-11-20|COLLECT COD|AIR|ld ideas. r +34242|1111|20|1|40|40484.40|0.00|0.00|N|O|1998-09-22|1998-09-19|1998-10-04|NONE|MAIL|the carefully regular instructions. pe +34242|289|17|2|34|40435.52|0.00|0.04|N|O|1998-09-01|1998-07-23|1998-09-03|TAKE BACK RETURN|FOB|longside of the b +34242|724|21|3|49|79611.28|0.01|0.01|N|O|1998-07-14|1998-08-01|1998-07-15|DELIVER IN PERSON|MAIL|packages use. pending, ironic excuses hagg +34243|1709|36|1|14|22549.80|0.10|0.04|R|F|1995-02-16|1995-04-03|1995-03-01|COLLECT COD|AIR|nic packages +34243|1994|95|2|34|64463.66|0.04|0.03|A|F|1995-04-14|1995-05-11|1995-04-20|NONE|REG AIR|eposits pr +34243|1836|23|3|37|64299.71|0.00|0.04|A|F|1995-04-26|1995-04-13|1995-05-24|TAKE BACK RETURN|RAIL|l asymptotes use. +34243|310|39|4|15|18154.65|0.10|0.08|R|F|1995-02-26|1995-03-26|1995-03-15|DELIVER IN PERSON|AIR|atelets haggle furiously along +34243|813|13|5|44|75407.64|0.10|0.08|R|F|1995-04-30|1995-05-13|1995-05-25|NONE|RAIL|ously furiously +34243|1706|91|6|14|22507.80|0.10|0.07|R|F|1995-03-19|1995-03-26|1995-04-13|DELIVER IN PERSON|REG AIR| accounts sublate slyly. blithely r +34244|219|47|1|20|22384.20|0.08|0.01|A|F|1993-10-20|1993-12-17|1993-10-29|COLLECT COD|REG AIR|pecial, final deposits aft +34244|337|94|2|34|42069.22|0.10|0.03|R|F|1993-11-01|1993-11-23|1993-11-21|NONE|REG AIR| according to the slyly +34244|782|83|3|26|43752.28|0.06|0.04|A|F|1993-11-11|1993-10-31|1993-12-01|DELIVER IN PERSON|REG AIR|ven epitaphs. even accounts dazzle caref +34244|276|77|4|24|28230.48|0.06|0.01|A|F|1993-12-27|1993-11-26|1994-01-13|TAKE BACK RETURN|RAIL|nts according to the slyly dogged pin +34245|73|99|1|33|32111.31|0.07|0.07|A|F|1993-04-13|1993-04-07|1993-04-22|DELIVER IN PERSON|AIR|es are carefully blithely +34245|824|25|2|5|8624.10|0.02|0.00|A|F|1993-06-07|1993-04-25|1993-06-28|COLLECT COD|TRUCK|are carefully blithely pending ex +34245|1610|52|3|35|52906.35|0.01|0.02|A|F|1993-04-09|1993-03-29|1993-05-02|NONE|RAIL|final asymptotes +34245|515|46|4|15|21232.65|0.09|0.03|R|F|1993-06-07|1993-03-20|1993-07-04|COLLECT COD|REG AIR|ar packages: bold, unusua +34246|644|38|1|19|29348.16|0.05|0.00|R|F|1993-11-30|1993-11-12|1993-12-08|NONE|RAIL|heodolites. regular, express packag +34246|1326|27|2|40|49092.80|0.09|0.07|R|F|1993-12-08|1993-12-01|1993-12-24|NONE|TRUCK|, express accounts. carefully f +34246|889|89|3|43|76964.84|0.04|0.01|R|F|1994-01-04|1993-12-17|1994-01-14|DELIVER IN PERSON|RAIL|nic packages. furiously sly epitaph +34246|98|24|4|24|23954.16|0.02|0.00|A|F|1993-12-19|1993-11-26|1994-01-06|DELIVER IN PERSON|MAIL|ironic requests will have to wake alongsi +34246|248|3|5|4|4592.96|0.07|0.02|R|F|1993-12-26|1993-11-19|1994-01-25|DELIVER IN PERSON|REG AIR|usly regular theodo +34246|1310|25|6|24|29071.44|0.08|0.03|R|F|1994-01-12|1993-11-18|1994-02-08|COLLECT COD|TRUCK|nent instru +34247|1162|71|1|13|13821.08|0.00|0.04|R|F|1994-05-19|1994-05-06|1994-06-05|DELIVER IN PERSON|TRUCK| detect slyly pending deposits +34272|1810|97|1|24|41083.44|0.10|0.03|N|O|1997-05-13|1997-05-24|1997-05-29|COLLECT COD|FOB|re blithely into the slyly permanent +34272|1063|99|2|24|23137.44|0.04|0.05|N|O|1997-05-07|1997-06-05|1997-05-16|TAKE BACK RETURN|SHIP|ly even foxes wake sl +34273|1002|38|1|50|45150.00|0.04|0.04|N|O|1996-10-04|1996-10-18|1996-10-10|DELIVER IN PERSON|SHIP|he furiously pending package +34273|266|67|2|40|46650.40|0.06|0.07|N|O|1996-11-24|1996-10-29|1996-12-01|DELIVER IN PERSON|SHIP|equests. b +34273|1480|59|3|1|1381.48|0.03|0.07|N|O|1996-08-20|1996-10-20|1996-09-03|DELIVER IN PERSON|MAIL|ironic platelets. fur +34273|865|99|4|10|17658.60|0.02|0.01|N|O|1996-08-19|1996-10-18|1996-09-11|NONE|AIR|equests cajole care +34273|360|89|5|29|36550.44|0.08|0.00|N|O|1996-11-23|1996-09-16|1996-12-04|NONE|SHIP| unusual accounts. blit +34273|790|23|6|3|5072.37|0.03|0.06|N|O|1996-10-26|1996-11-03|1996-11-06|NONE|TRUCK|st the packages haggle among the +34274|294|22|1|36|42994.44|0.01|0.01|A|F|1993-04-24|1993-05-08|1993-05-01|DELIVER IN PERSON|SHIP|s. pinto beans grow blithely. as +34274|1783|26|2|41|69075.98|0.03|0.00|A|F|1993-04-05|1993-04-14|1993-04-28|NONE|RAIL|y even acco +34274|685|86|3|16|25370.88|0.02|0.03|R|F|1993-03-18|1993-04-17|1993-04-10|NONE|MAIL|eodolites cou +34275|1040|46|1|30|28231.20|0.00|0.01|A|F|1994-09-20|1994-08-17|1994-10-14|COLLECT COD|RAIL|lent somas affix from the in +34275|667|61|2|20|31353.20|0.07|0.08|A|F|1994-08-29|1994-09-24|1994-09-03|DELIVER IN PERSON|MAIL|s packages boost bl +34275|935|36|3|14|25703.02|0.08|0.07|R|F|1994-10-22|1994-09-09|1994-11-02|NONE|MAIL|blithely ironic requests. hockey playe +34276|1191|28|1|2|2184.38|0.06|0.01|A|F|1992-04-21|1992-04-23|1992-05-08|COLLECT COD|MAIL|unusual, final reques +34276|365|22|2|46|58206.56|0.00|0.04|A|F|1992-03-17|1992-04-27|1992-04-05|TAKE BACK RETURN|FOB|deposits cajole pending instructi +34277|686|87|1|47|74573.96|0.04|0.07|N|O|1997-12-16|1997-11-09|1998-01-07|DELIVER IN PERSON|TRUCK|regular notor +34277|1168|5|2|25|26729.00|0.06|0.01|N|O|1997-12-16|1997-10-04|1997-12-17|NONE|MAIL|o the slyly final deposits. carefull +34278|835|35|1|7|12150.81|0.06|0.05|N|O|1997-06-09|1997-04-27|1997-06-24|NONE|REG AIR| instructio +34278|1253|54|2|50|57712.50|0.10|0.02|N|O|1997-04-28|1997-05-11|1997-05-04|COLLECT COD|RAIL|ggle furiously platelets. carefully re +34278|1836|37|3|14|24329.62|0.09|0.05|N|O|1997-05-05|1997-05-01|1997-05-19|DELIVER IN PERSON|REG AIR|ecial requests d +34278|1864|8|4|16|28253.76|0.07|0.06|N|O|1997-04-21|1997-04-14|1997-04-23|TAKE BACK RETURN|AIR| express ideas wak +34278|376|61|5|19|24251.03|0.05|0.05|N|O|1997-05-18|1997-05-07|1997-05-25|COLLECT COD|FOB|s. slyly specia +34279|333|18|1|15|18499.95|0.08|0.08|A|F|1992-05-08|1992-06-06|1992-05-21|NONE|SHIP| the bold, bold packages. ca +34279|566|67|2|40|58662.40|0.04|0.06|A|F|1992-04-16|1992-05-25|1992-04-19|TAKE BACK RETURN|FOB|ckly unusual +34279|1184|21|3|43|46662.74|0.00|0.05|A|F|1992-07-10|1992-05-12|1992-08-07|DELIVER IN PERSON|FOB|s. closely regular requests +34279|1305|44|4|18|21713.40|0.05|0.01|R|F|1992-05-04|1992-05-10|1992-05-07|NONE|TRUCK|ependencies are slyly. quick foxes w +34279|1390|91|5|30|38741.70|0.00|0.05|A|F|1992-06-05|1992-05-12|1992-06-30|COLLECT COD|FOB|s. quickly +34279|1661|85|6|27|42191.82|0.08|0.07|A|F|1992-05-13|1992-05-19|1992-05-26|NONE|TRUCK|o beans. pinto be +34304|892|93|1|8|14343.12|0.00|0.02|R|F|1994-05-12|1994-06-03|1994-05-22|COLLECT COD|TRUCK|riously. carefully regular packag +34305|1625|8|1|33|50378.46|0.09|0.06|A|F|1993-05-17|1993-03-28|1993-06-04|NONE|AIR|to beans sha +34305|1258|96|2|35|40573.75|0.02|0.07|A|F|1993-06-08|1993-04-22|1993-07-08|COLLECT COD|AIR|mas above the pinto beans +34305|1758|1|3|34|56431.50|0.07|0.02|R|F|1993-03-17|1993-04-03|1993-03-28|DELIVER IN PERSON|MAIL|egular Tiresias +34306|1841|28|1|28|48799.52|0.06|0.07|N|O|1997-04-09|1997-04-01|1997-04-25|NONE|AIR|ke slyly pending, ironic request +34306|1157|58|2|20|21163.00|0.08|0.02|N|O|1997-01-28|1997-04-10|1997-02-02|TAKE BACK RETURN|RAIL| requests. slyly even dependencies eat abov +34306|285|13|3|45|53337.60|0.01|0.06|N|O|1997-03-14|1997-04-18|1997-04-08|DELIVER IN PERSON|TRUCK|s requests cajole blithe +34306|699|93|4|48|76785.12|0.05|0.02|N|O|1997-02-08|1997-03-14|1997-02-12|NONE|MAIL|the slyly regular asymptotes w +34306|1387|64|5|26|33497.88|0.08|0.00|N|O|1997-05-27|1997-03-06|1997-05-28|NONE|AIR|sts nag ironic, pending attainments. r +34306|1903|48|6|13|23463.70|0.00|0.04|N|O|1997-04-27|1997-04-04|1997-05-23|DELIVER IN PERSON|MAIL|ly ironic ideas +34307|1300|12|1|25|30032.50|0.04|0.07|A|F|1993-05-02|1993-04-29|1993-05-19|COLLECT COD|RAIL|lets cajole slyly f +34307|851|85|2|22|38540.70|0.01|0.06|A|F|1993-04-19|1993-05-23|1993-04-26|COLLECT COD|SHIP|sits. ironic, final attain +34308|147|26|1|34|35602.76|0.05|0.06|A|F|1994-02-20|1994-02-20|1994-03-10|COLLECT COD|FOB|latelets. quickly bold instructions ar +34308|730|31|2|22|35876.06|0.04|0.04|A|F|1994-02-22|1994-03-11|1994-03-14|COLLECT COD|TRUCK|quickly carefully express pinto beans. +34308|211|93|3|19|21112.99|0.03|0.05|R|F|1994-02-26|1994-01-23|1994-03-20|NONE|REG AIR|beans among the bold packages i +34309|106|59|1|35|35213.50|0.06|0.04|R|F|1992-11-21|1992-11-08|1992-12-18|NONE|FOB|efully. deposits are slyly close theod +34310|1690|73|1|9|14325.21|0.04|0.03|N|O|1996-05-28|1996-06-04|1996-06-09|TAKE BACK RETURN|RAIL|e instructions. unusual ideas a +34310|1662|4|2|27|42218.82|0.02|0.03|N|O|1996-05-10|1996-05-11|1996-05-11|COLLECT COD|AIR|cajole furiously fluffily silen +34311|630|93|1|20|30612.60|0.10|0.08|R|F|1994-12-31|1994-10-14|1995-01-16|COLLECT COD|TRUCK|lly final packages sleep fluffily final +34311|1549|70|2|37|53669.98|0.09|0.00|R|F|1994-12-27|1994-10-26|1995-01-24|TAKE BACK RETURN|MAIL|blithely pending hockey player +34311|393|94|3|23|29747.97|0.08|0.05|R|F|1994-10-24|1994-11-11|1994-11-07|COLLECT COD|MAIL|nusual platelet +34311|710|75|4|6|9664.26|0.10|0.07|A|F|1994-11-07|1994-11-09|1994-11-21|DELIVER IN PERSON|AIR|lar requests. blithely ironic waters na +34311|216|71|5|43|47997.03|0.07|0.05|R|F|1994-10-27|1994-12-02|1994-11-23|DELIVER IN PERSON|SHIP|unts eat furi +34311|833|33|6|29|50281.07|0.09|0.00|A|F|1994-10-16|1994-10-19|1994-11-15|TAKE BACK RETURN|FOB|ructions. regular pinto beans wake ca +34336|969|72|1|33|61708.68|0.04|0.01|N|O|1997-09-24|1997-09-16|1997-10-05|COLLECT COD|RAIL|egular foxes detect bold waters. flu +34336|1879|80|2|33|58768.71|0.06|0.07|N|O|1997-10-05|1997-09-26|1997-10-27|TAKE BACK RETURN|REG AIR| asymptotes cajole above the fluffily ir +34336|383|40|3|20|25667.60|0.09|0.02|N|O|1997-10-08|1997-09-09|1997-10-28|NONE|MAIL|fully platelets. slyly sile +34336|447|35|4|39|52550.16|0.05|0.08|N|O|1997-09-15|1997-09-22|1997-09-18|NONE|FOB|ckly special excuses dete +34337|1251|63|1|15|17283.75|0.02|0.08|A|F|1993-07-22|1993-07-15|1993-08-08|NONE|REG AIR|blithely careful packages. slowly regul +34337|1691|92|2|5|7963.45|0.01|0.02|A|F|1993-06-03|1993-06-14|1993-06-13|COLLECT COD|RAIL|lar instructions cajo +34337|1281|56|3|28|33103.84|0.00|0.05|A|F|1993-07-16|1993-06-25|1993-08-13|COLLECT COD|TRUCK|ing to the thinly express foxes. +34338|142|43|1|1|1042.14|0.10|0.07|A|F|1993-10-01|1993-08-14|1993-10-26|COLLECT COD|SHIP|egular instructi +34339|1235|47|1|38|43176.74|0.03|0.01|A|F|1992-06-15|1992-06-29|1992-06-18|NONE|REG AIR|foxes. regular +34339|910|45|2|43|77869.13|0.00|0.03|R|F|1992-05-15|1992-07-30|1992-06-01|TAKE BACK RETURN|SHIP|ake. ironic +34339|385|86|3|46|59127.48|0.09|0.01|R|F|1992-08-16|1992-07-31|1992-09-12|NONE|RAIL|s cajole furiously. warhorses bel +34339|474|4|4|27|37110.69|0.03|0.04|R|F|1992-08-11|1992-07-22|1992-08-29|COLLECT COD|RAIL|nis integrate. silent platelets hag +34339|489|48|5|17|23621.16|0.10|0.06|R|F|1992-08-26|1992-07-16|1992-08-27|NONE|MAIL| carefully deposits; slyly regular accou +34339|1251|26|6|22|25349.50|0.10|0.01|A|F|1992-07-27|1992-08-10|1992-08-07|DELIVER IN PERSON|REG AIR|inal sheaves wake blithely beside the eve +34340|1719|4|1|30|48621.30|0.07|0.04|N|O|1997-08-12|1997-06-23|1997-08-15|TAKE BACK RETURN|FOB|efully dolp +34341|197|24|1|7|7680.33|0.02|0.03|N|O|1996-12-19|1997-02-07|1997-01-14|DELIVER IN PERSON|REG AIR|kly special +34341|542|3|2|24|34620.96|0.03|0.02|N|O|1996-12-08|1997-01-29|1996-12-21|NONE|MAIL|ven deposits are finally. fur +34341|920|55|3|44|80120.48|0.10|0.05|N|O|1996-12-01|1996-12-23|1996-12-18|DELIVER IN PERSON|MAIL|y unusual accounts boos +34341|1341|56|4|37|45966.58|0.06|0.02|N|O|1997-01-07|1997-01-10|1997-01-30|TAKE BACK RETURN|REG AIR|fluffily amo +34341|1931|32|5|25|45823.25|0.01|0.08|N|O|1997-01-30|1996-12-31|1997-02-15|TAKE BACK RETURN|RAIL|ong the regular platelets; slyly even +34341|1915|4|6|46|83577.86|0.07|0.07|N|O|1997-03-18|1997-01-23|1997-04-09|NONE|RAIL|y special requests wake against the fur +34341|283|38|7|42|49697.76|0.05|0.03|N|O|1996-12-01|1997-01-11|1996-12-29|DELIVER IN PERSON|FOB|r ideas. qu +34342|473|61|1|11|15108.17|0.05|0.02|N|O|1998-02-16|1998-03-27|1998-03-12|TAKE BACK RETURN|REG AIR|s. fluffily regular requests about +34342|123|50|2|3|3069.36|0.01|0.07|N|O|1998-04-22|1998-03-24|1998-05-21|NONE|TRUCK|eep after the final, +34342|1647|89|3|29|44910.56|0.10|0.05|N|O|1998-06-01|1998-03-24|1998-06-15|TAKE BACK RETURN|FOB| blithe instructions +34343|1741|84|1|29|47639.46|0.09|0.02|N|O|1998-05-14|1998-06-28|1998-05-15|TAKE BACK RETURN|FOB|ies haggle blithely. deposi +34343|202|3|2|32|35270.40|0.10|0.05|N|O|1998-05-17|1998-07-09|1998-05-29|TAKE BACK RETURN|MAIL| unusual sentiment +34343|1605|6|3|22|33145.20|0.00|0.02|N|O|1998-05-23|1998-06-22|1998-06-20|NONE|MAIL|c dependencies ab +34343|131|10|4|50|51556.50|0.08|0.08|N|O|1998-05-09|1998-06-09|1998-05-17|COLLECT COD|MAIL| slyly final accounts +34343|1689|31|5|13|20678.84|0.10|0.02|N|O|1998-06-25|1998-06-21|1998-07-03|COLLECT COD|MAIL|s wake slyly regular +34343|619|82|6|47|71421.67|0.07|0.01|N|O|1998-07-16|1998-06-07|1998-07-30|DELIVER IN PERSON|FOB|y regular dolphins sublate ca +34343|1990|35|7|35|66219.65|0.01|0.06|N|O|1998-07-01|1998-05-29|1998-07-21|COLLECT COD|RAIL| bold packages. express packag +34368|948|51|1|13|24036.22|0.09|0.07|A|F|1995-03-20|1995-03-26|1995-03-22|DELIVER IN PERSON|FOB|even accounts hinder blithely +34368|1488|67|2|43|59747.64|0.00|0.04|R|F|1995-02-18|1995-04-02|1995-03-02|TAKE BACK RETURN|SHIP|ate slyly. slyly final instr +34369|1617|41|1|42|63781.62|0.01|0.06|N|O|1998-01-07|1998-01-10|1998-01-20|COLLECT COD|AIR|quests hinder besides +34369|1388|3|2|8|10315.04|0.09|0.00|N|O|1997-11-30|1997-12-24|1997-12-08|DELIVER IN PERSON|REG AIR|fully ironic a +34369|1372|73|3|12|15280.44|0.01|0.02|N|O|1997-12-18|1997-12-05|1998-01-08|TAKE BACK RETURN|TRUCK|the special, silent dependencies use b +34370|619|82|1|26|39509.86|0.01|0.04|N|O|1998-02-26|1998-01-26|1998-02-27|TAKE BACK RETURN|RAIL|ccounts de +34370|592|23|2|48|71644.32|0.03|0.04|N|O|1998-02-09|1997-12-23|1998-03-04|COLLECT COD|SHIP|counts nag afte +34370|1881|82|3|45|80229.60|0.08|0.00|N|O|1998-02-02|1998-01-11|1998-02-27|TAKE BACK RETURN|AIR|riously ex +34370|19|95|4|12|11028.12|0.10|0.02|N|O|1998-03-08|1997-12-24|1998-03-23|COLLECT COD|RAIL|onic packages? requests sleep al +34370|1033|34|5|14|13076.42|0.08|0.08|N|O|1998-02-03|1998-02-12|1998-02-19|TAKE BACK RETURN|REG AIR|onic deposits nag furiously about the +34370|1671|54|6|18|28308.06|0.01|0.05|N|O|1997-12-31|1997-12-27|1998-01-11|DELIVER IN PERSON|MAIL|e carefully regular instr +34371|1595|16|1|6|8979.54|0.00|0.06|A|F|1993-07-01|1993-05-22|1993-07-23|COLLECT COD|TRUCK|gle daringly. bold, unusual foxes cajole +34371|1222|23|2|41|46052.02|0.01|0.07|R|F|1993-07-23|1993-05-12|1993-08-09|NONE|SHIP| according to the final, +34371|1804|48|3|14|23881.20|0.00|0.03|A|F|1993-04-30|1993-06-21|1993-05-28|NONE|REG AIR|es could have to sle +34372|1291|3|1|23|27422.67|0.02|0.00|A|F|1992-12-04|1992-11-23|1992-12-23|COLLECT COD|TRUCK|s across the ex +34372|1645|87|2|16|24746.24|0.02|0.03|R|F|1992-11-03|1992-11-27|1992-11-29|DELIVER IN PERSON|REG AIR|ests haggle slyly. re +34373|1956|57|1|28|52022.60|0.06|0.08|R|F|1993-01-23|1993-02-21|1993-01-27|TAKE BACK RETURN|TRUCK|nal foxes l +34373|724|25|2|33|53615.76|0.00|0.00|A|F|1993-03-19|1993-02-05|1993-04-05|TAKE BACK RETURN|SHIP|y pending requests above the +34373|672|66|3|35|55043.45|0.06|0.05|A|F|1993-02-19|1993-01-14|1993-03-13|COLLECT COD|RAIL|lly silent deposits cajole slyly along t +34373|1716|59|4|24|38825.04|0.05|0.03|R|F|1993-03-24|1993-01-25|1993-04-16|TAKE BACK RETURN|SHIP|eposits nag. even pinto bean +34374|968|69|1|14|26165.44|0.06|0.05|R|F|1994-08-18|1994-08-18|1994-08-22|TAKE BACK RETURN|TRUCK|nal requests use blithely. fluffi +34375|111|12|1|47|47522.17|0.07|0.05|A|F|1994-02-18|1994-02-07|1994-03-17|NONE|RAIL| accounts wake: blithely ironic account +34375|1092|28|2|25|24827.25|0.04|0.06|A|F|1994-04-29|1994-03-09|1994-05-13|DELIVER IN PERSON|REG AIR|y regular accounts are quickly acr +34375|219|1|3|26|29099.46|0.07|0.07|A|F|1994-01-24|1994-02-24|1994-02-10|TAKE BACK RETURN|RAIL| to the regular instructions +34375|1401|2|4|44|57305.60|0.00|0.08|R|F|1994-01-15|1994-03-23|1994-02-05|DELIVER IN PERSON|TRUCK|ly according to +34375|1969|14|5|3|5612.88|0.02|0.07|R|F|1994-02-10|1994-03-31|1994-02-14|TAKE BACK RETURN|RAIL|sleep blithely deposits. deposits +34375|848|49|6|6|10493.04|0.05|0.06|R|F|1994-04-24|1994-03-06|1994-04-30|DELIVER IN PERSON|AIR| bold platelets use slyly quickly even +34375|1288|100|7|22|26164.16|0.06|0.08|R|F|1994-05-06|1994-03-10|1994-05-08|DELIVER IN PERSON|TRUCK|atelets sleep blithely +34400|1849|36|1|15|26262.60|0.00|0.02|R|F|1993-04-18|1993-03-06|1993-04-22|DELIVER IN PERSON|REG AIR|pendencies are. special, final asymptotes +34400|1144|81|2|30|31354.20|0.05|0.08|A|F|1993-02-24|1993-02-20|1993-03-20|TAKE BACK RETURN|REG AIR|s carefully blithely e +34400|1401|19|3|48|62515.20|0.09|0.08|A|F|1993-03-12|1993-03-15|1993-03-20|COLLECT COD|MAIL|ost after the pending multiplier +34400|411|99|4|10|13114.10|0.01|0.01|A|F|1993-03-19|1993-02-01|1993-04-02|COLLECT COD|RAIL|ding to th +34401|3|29|1|50|45150.00|0.08|0.08|N|O|1996-05-20|1996-04-28|1996-06-17|COLLECT COD|RAIL|ular dependencies. slyly bold a +34401|1285|97|2|46|54568.88|0.08|0.05|N|O|1996-03-15|1996-04-27|1996-04-13|DELIVER IN PERSON|REG AIR|blithely special packages. fluffily reg +34401|1088|89|3|6|5934.48|0.07|0.08|N|O|1996-06-11|1996-05-03|1996-06-16|DELIVER IN PERSON|AIR|lly among the slyly regular foxes. pending +34401|1624|7|4|37|56447.94|0.00|0.02|N|O|1996-03-08|1996-04-10|1996-03-31|TAKE BACK RETURN|RAIL|egular account +34402|5|6|1|34|30770.00|0.03|0.00|R|F|1993-08-05|1993-06-14|1993-08-08|DELIVER IN PERSON|TRUCK|e quickly pending pinto beans use blithe +34402|146|73|2|4|4184.56|0.02|0.00|R|F|1993-06-03|1993-07-15|1993-07-03|NONE|AIR|out the ironic +34402|986|21|3|40|75479.20|0.05|0.06|R|F|1993-07-10|1993-06-06|1993-08-03|NONE|TRUCK|ckages. pinto beans ar +34402|388|73|4|33|42516.54|0.10|0.07|R|F|1993-08-13|1993-06-21|1993-08-14|TAKE BACK RETURN|MAIL|sits sleep regular, regular accounts. sl +34402|736|69|5|5|8183.65|0.02|0.04|R|F|1993-08-12|1993-07-12|1993-08-25|NONE|AIR|fully express pla +34402|1470|88|6|39|53487.33|0.07|0.01|A|F|1993-08-03|1993-07-24|1993-08-18|COLLECT COD|AIR|ests-- blithely silent pains use +34403|912|15|1|21|38071.11|0.06|0.00|N|O|1996-10-11|1996-09-23|1996-10-20|TAKE BACK RETURN|MAIL|nically ironic +34403|1898|99|2|9|16199.01|0.03|0.00|N|O|1996-08-09|1996-10-29|1996-09-04|TAKE BACK RETURN|REG AIR|nic excuses. unusual asymptotes bel +34404|1140|49|1|32|33316.48|0.09|0.08|A|F|1993-03-02|1993-05-17|1993-03-10|DELIVER IN PERSON|SHIP|uffily. quietly regular platelets wake car +34405|228|56|1|46|51898.12|0.04|0.05|A|F|1992-07-01|1992-04-05|1992-07-17|NONE|AIR|. regular, even theodolites engage furiousl +34405|1140|41|2|35|36439.90|0.00|0.06|A|F|1992-06-19|1992-04-06|1992-06-25|TAKE BACK RETURN|MAIL|cross the slyly regular requests print +34406|744|45|1|5|8223.70|0.06|0.03|A|F|1992-10-10|1992-11-23|1992-10-16|TAKE BACK RETURN|SHIP|ain slyly furiou +34406|630|62|2|32|48980.16|0.02|0.00|A|F|1993-01-27|1992-12-13|1993-02-16|NONE|MAIL|ifts wake bravely quiet, even +34406|395|80|3|3|3886.17|0.04|0.06|A|F|1992-12-24|1992-11-05|1993-01-02|DELIVER IN PERSON|TRUCK|courts detect furiously a +34406|1101|38|4|35|35073.50|0.05|0.06|R|F|1992-10-02|1992-11-12|1992-10-25|NONE|RAIL|ffily alongside of the carefull +34406|623|86|5|34|51803.08|0.06|0.06|R|F|1992-11-19|1992-12-01|1992-11-30|TAKE BACK RETURN|REG AIR|inal dependencies-- quickly furious +34406|461|49|6|43|58542.78|0.06|0.00|R|F|1993-01-01|1992-11-29|1993-01-21|NONE|AIR|uctions. daringly iro +34406|841|8|7|13|22643.92|0.06|0.00|R|F|1993-01-22|1992-12-05|1993-01-28|TAKE BACK RETURN|SHIP|de of the qu +34407|70|21|1|49|47533.43|0.08|0.05|A|F|1993-10-11|1993-10-27|1993-10-17|DELIVER IN PERSON|SHIP|carefully. blithely final realms above t +34407|304|89|2|3|3612.90|0.09|0.08|A|F|1993-08-19|1993-10-28|1993-09-18|NONE|AIR|ily silent accounts integrate. blithe +34407|440|28|3|46|61660.24|0.01|0.08|R|F|1993-11-09|1993-09-07|1993-11-15|TAKE BACK RETURN|FOB|he bold, even accounts. carefully f +34432|1498|77|1|41|57379.09|0.10|0.08|R|F|1994-05-10|1994-06-24|1994-05-29|NONE|SHIP| accounts cajole along the regular, even +34432|358|87|2|17|21391.95|0.01|0.06|A|F|1994-04-20|1994-07-06|1994-05-19|TAKE BACK RETURN|RAIL|l pinto beans. quickly regular packages +34432|680|43|3|17|26871.56|0.05|0.06|A|F|1994-06-29|1994-06-22|1994-07-10|COLLECT COD|AIR|ove the carefully even courts. reg +34432|1753|80|4|44|72809.00|0.00|0.07|R|F|1994-05-31|1994-06-26|1994-06-12|COLLECT COD|FOB|thin the slyly unusual idea +34432|406|65|5|5|6532.00|0.10|0.06|R|F|1994-04-28|1994-06-14|1994-05-10|TAKE BACK RETURN|MAIL|ns sleep fluffily slyly pe +34432|590|91|6|3|4471.77|0.07|0.08|R|F|1994-04-20|1994-06-08|1994-04-28|TAKE BACK RETURN|REG AIR| requests detect. special packages inte +34433|235|90|1|26|29515.98|0.08|0.06|A|F|1995-04-07|1995-02-24|1995-05-03|COLLECT COD|RAIL|xes are slyly alongside of the fluff +34433|706|3|2|39|62661.30|0.00|0.06|R|F|1995-04-24|1995-03-31|1995-05-13|COLLECT COD|RAIL| fluffily +34434|665|97|1|25|39141.50|0.03|0.00|N|O|1995-08-26|1995-07-07|1995-09-07|TAKE BACK RETURN|RAIL|iously regular pinto beans +34434|1259|60|2|11|12762.75|0.10|0.02|N|O|1995-07-16|1995-06-23|1995-07-28|NONE|REG AIR|luffily fluffy excuses. even accounts acro +34434|776|41|3|11|18444.47|0.00|0.03|N|O|1995-07-24|1995-06-15|1995-08-17|COLLECT COD|SHIP|fily regular dolphins l +34434|284|12|4|7|8289.96|0.06|0.05|N|O|1995-08-25|1995-07-14|1995-09-21|NONE|AIR|y express theodolites. fur +34434|515|16|5|48|67944.48|0.06|0.08|N|O|1995-08-03|1995-07-19|1995-08-16|DELIVER IN PERSON|RAIL| sleep. slyly bold deposits +34434|1048|84|6|48|45553.92|0.09|0.01|N|O|1995-06-20|1995-06-29|1995-07-19|COLLECT COD|REG AIR|ecial ideas wake c +34434|1369|8|7|19|24136.84|0.01|0.04|N|F|1995-05-31|1995-06-24|1995-06-27|NONE|MAIL|s haggle fluffily among the stealthily p +34435|1649|91|1|5|7753.20|0.07|0.08|A|F|1994-09-20|1994-09-26|1994-10-01|COLLECT COD|TRUCK|detect ruthlessly? unusual +34435|1226|27|2|10|11272.20|0.00|0.00|A|F|1994-08-12|1994-09-17|1994-08-29|NONE|TRUCK|express packages are furiously final accoun +34435|1537|38|3|18|25893.54|0.04|0.07|A|F|1994-08-14|1994-10-01|1994-09-08|NONE|RAIL|nal realms cajole blithe +34436|1948|49|1|38|70297.72|0.08|0.05|N|O|1998-03-19|1998-04-05|1998-04-18|COLLECT COD|TRUCK|s alongside of the slyly final foxe +34436|1952|85|2|1|1853.95|0.05|0.03|N|O|1998-04-09|1998-04-22|1998-04-29|NONE|REG AIR| furiously +34436|1241|53|3|29|33124.96|0.09|0.06|N|O|1998-05-24|1998-03-20|1998-06-21|COLLECT COD|AIR|grate carefully alongside of the slowly +34437|1585|86|1|7|10406.06|0.08|0.02|N|F|1995-06-13|1995-05-01|1995-06-27|TAKE BACK RETURN|FOB|to beans. pendi +34437|1329|6|2|1|1230.32|0.01|0.05|R|F|1995-03-26|1995-03-26|1995-04-21|TAKE BACK RETURN|TRUCK|. dolphins grow fluffily regular deposi +34437|450|80|3|38|51317.10|0.02|0.08|R|F|1995-05-02|1995-04-06|1995-05-15|DELIVER IN PERSON|TRUCK|ges integrate carefully. silent deposits sn +34438|1567|8|1|15|22028.40|0.01|0.06|R|F|1993-12-28|1994-02-01|1994-01-12|DELIVER IN PERSON|AIR|sly regular requests ar +34438|503|4|2|38|53333.00|0.09|0.07|R|F|1994-03-23|1994-01-11|1994-03-28|TAKE BACK RETURN|MAIL| blithely about the carefully ironi +34439|897|97|1|43|77309.27|0.10|0.07|R|F|1995-01-04|1995-01-06|1995-01-27|TAKE BACK RETURN|REG AIR|ckly final th +34439|44|70|2|34|32097.36|0.07|0.07|A|F|1994-12-05|1994-12-01|1994-12-13|COLLECT COD|RAIL|ly bold packages sle +34439|1673|15|3|27|42516.09|0.00|0.05|R|F|1994-11-27|1994-11-16|1994-12-12|TAKE BACK RETURN|TRUCK| among the pending pinto beans wake quic +34464|1432|72|1|22|29335.46|0.10|0.05|N|O|1997-08-17|1997-07-16|1997-08-21|DELIVER IN PERSON|MAIL|multipliers sleep above the theodolites. f +34464|1597|18|2|43|64439.37|0.05|0.04|N|O|1997-09-16|1997-08-01|1997-09-23|COLLECT COD|TRUCK|tect. blithely reg +34465|51|77|1|32|30433.60|0.04|0.01|N|O|1997-03-26|1997-03-02|1997-04-21|TAKE BACK RETURN|SHIP|ily regular deposits are blithely specia +34465|788|85|2|8|13510.24|0.07|0.02|N|O|1997-03-27|1997-02-21|1997-04-25|TAKE BACK RETURN|AIR|the regular +34465|470|71|3|17|23297.99|0.10|0.06|N|O|1997-05-01|1997-04-02|1997-05-24|DELIVER IN PERSON|TRUCK|as haggle furiou +34466|1518|39|1|5|7097.55|0.03|0.00|N|O|1998-03-01|1998-02-21|1998-03-22|DELIVER IN PERSON|MAIL|e along the carefu +34466|859|59|2|7|12318.95|0.08|0.07|N|O|1998-05-19|1998-02-21|1998-06-18|NONE|RAIL|ts. dugouts nod quickly aft +34466|1264|39|3|41|47775.66|0.01|0.05|N|O|1998-03-09|1998-03-23|1998-03-21|NONE|TRUCK|g, ironic requests. platelets are qui +34466|930|31|4|10|18309.30|0.05|0.05|N|O|1998-02-01|1998-04-21|1998-02-08|TAKE BACK RETURN|FOB|lyly special esc +34466|342|99|5|40|49693.60|0.05|0.00|N|O|1998-02-26|1998-03-14|1998-03-08|TAKE BACK RETURN|RAIL|pending, unusual excuses. bold, speci +34466|1492|10|6|5|6967.45|0.01|0.02|N|O|1998-04-20|1998-03-22|1998-05-17|COLLECT COD|FOB| deposits detect. final, even deposit +34467|536|37|1|45|64643.85|0.00|0.03|A|F|1995-01-31|1995-01-22|1995-02-01|DELIVER IN PERSON|REG AIR|totes nag flu +34467|724|89|2|27|43867.44|0.02|0.03|A|F|1994-12-22|1994-12-20|1994-12-28|TAKE BACK RETURN|REG AIR|odolites are along the +34467|1810|54|3|40|68472.40|0.01|0.01|R|F|1995-01-26|1994-12-16|1995-01-31|COLLECT COD|AIR| among the furiously +34468|1015|21|1|38|34808.38|0.00|0.04|N|O|1996-11-16|1996-12-14|1996-11-17|DELIVER IN PERSON|TRUCK|packages are fluffily above the +34469|1053|59|1|50|47702.50|0.10|0.01|N|O|1997-12-10|1997-12-03|1997-12-12|COLLECT COD|RAIL|iously final requests are furiously. quic +34469|1483|1|2|42|58148.16|0.08|0.07|N|O|1998-01-10|1997-12-13|1998-02-01|NONE|MAIL|heodolites haggle among the furiou +34469|924|27|3|43|78471.56|0.10|0.03|N|O|1998-02-04|1998-01-18|1998-02-09|NONE|FOB|ites use a +34469|624|18|4|30|45738.60|0.00|0.04|N|O|1997-10-28|1997-11-23|1997-11-13|COLLECT COD|RAIL|ironically ironi +34470|969|38|1|22|41139.12|0.09|0.02|A|F|1992-05-08|1992-03-26|1992-05-17|DELIVER IN PERSON|RAIL|s Tiresias cajo +34470|1554|55|2|28|40755.40|0.10|0.05|R|F|1992-04-25|1992-04-11|1992-05-14|COLLECT COD|TRUCK|o the ideas. blithely reg +34470|1388|27|3|15|19340.70|0.04|0.06|R|F|1992-02-14|1992-03-20|1992-02-22|TAKE BACK RETURN|REG AIR|ts sleep quickly among the re +34470|1378|17|4|36|46057.32|0.07|0.07|R|F|1992-03-07|1992-03-31|1992-03-26|DELIVER IN PERSON|MAIL|. carefully regular dolphins +34471|875|9|1|9|15982.83|0.07|0.02|N|O|1996-12-27|1996-12-01|1997-01-05|COLLECT COD|RAIL| regular realms wake carefully. s +34471|1138|75|2|7|7273.91|0.04|0.02|N|O|1996-12-21|1996-10-19|1997-01-01|TAKE BACK RETURN|FOB|xcuses sleep blithely after the furio +34471|1809|96|3|40|68432.00|0.00|0.07|N|O|1997-01-06|1996-10-28|1997-01-28|TAKE BACK RETURN|REG AIR|toward the finall +34471|1093|64|4|1|994.09|0.08|0.02|N|O|1996-12-12|1996-10-24|1996-12-25|COLLECT COD|AIR|t requests sleep furious +34496|819|53|1|14|24077.34|0.02|0.02|R|F|1993-05-19|1993-08-04|1993-06-04|DELIVER IN PERSON|TRUCK|ake furiously. packages +34497|1186|23|1|44|47835.92|0.05|0.07|R|F|1994-05-28|1994-04-12|1994-06-16|NONE|AIR|s. quickly silent deposits eng +34497|624|56|2|16|24393.92|0.04|0.05|R|F|1994-07-08|1994-06-08|1994-07-11|COLLECT COD|MAIL|eodolites. +34498|1870|57|1|42|74418.54|0.03|0.07|A|F|1994-04-14|1994-04-27|1994-05-10|DELIVER IN PERSON|RAIL|packages. fluffily final foxes after the +34498|258|86|2|30|34747.50|0.10|0.01|A|F|1994-04-20|1994-03-25|1994-05-17|NONE|AIR|y according +34498|278|79|3|37|43595.99|0.05|0.00|A|F|1994-03-18|1994-04-14|1994-03-25|TAKE BACK RETURN|FOB| regular packages. regular, busy p +34498|449|37|4|13|17542.72|0.03|0.07|A|F|1994-06-12|1994-03-23|1994-06-26|DELIVER IN PERSON|SHIP|ress packages grow unusual asympto +34498|607|70|5|10|15076.00|0.03|0.08|A|F|1994-06-13|1994-03-31|1994-06-24|TAKE BACK RETURN|AIR|ss accounts. +34498|1237|12|6|16|18211.68|0.06|0.04|A|F|1994-04-05|1994-04-28|1994-05-03|COLLECT COD|AIR|have to are carefully special request +34498|270|98|7|2|2340.54|0.09|0.04|A|F|1994-03-08|1994-04-12|1994-03-19|TAKE BACK RETURN|REG AIR|of the blithe +34499|1180|17|1|40|43247.20|0.02|0.05|A|F|1993-10-18|1993-09-04|1993-10-30|NONE|RAIL|ts wake fluffily carefully ironic pack +34499|1290|91|2|40|47651.60|0.08|0.05|R|F|1993-09-14|1993-09-29|1993-10-13|DELIVER IN PERSON|RAIL|ix blithely ironic +34499|1206|81|3|50|55360.00|0.04|0.08|R|F|1993-08-20|1993-09-20|1993-09-09|COLLECT COD|AIR|ess excuses. doggedly unus +34499|1489|29|4|27|37542.96|0.02|0.00|R|F|1993-10-28|1993-08-26|1993-11-20|TAKE BACK RETURN|AIR| furiously of the fu +34499|72|73|5|16|15553.12|0.02|0.01|R|F|1993-10-28|1993-10-06|1993-11-02|COLLECT COD|TRUCK|o beans across the special requests hang +34499|551|12|6|20|29031.00|0.09|0.05|R|F|1993-10-23|1993-09-03|1993-11-14|TAKE BACK RETURN|SHIP|ever ironic pin +34500|413|72|1|50|65670.50|0.08|0.06|N|O|1998-05-04|1998-05-03|1998-05-21|COLLECT COD|SHIP|asymptotes cajole furiously +34500|1182|91|2|22|23829.96|0.01|0.02|N|O|1998-07-03|1998-05-15|1998-07-22|DELIVER IN PERSON|FOB|ial requests. fl +34500|753|18|3|30|49612.50|0.04|0.08|N|O|1998-04-18|1998-06-13|1998-05-11|TAKE BACK RETURN|SHIP|he blithely stealthy pearls wake +34500|1206|44|4|25|27680.00|0.00|0.06|N|O|1998-07-27|1998-07-02|1998-08-18|NONE|MAIL|p blithely +34501|637|100|1|20|30752.60|0.06|0.01|A|F|1994-03-13|1994-02-17|1994-03-15|COLLECT COD|MAIL|ve to print doggedly even dependencies +34501|1447|26|2|13|17529.72|0.07|0.07|A|F|1994-01-18|1994-02-10|1994-01-27|TAKE BACK RETURN|SHIP|y even pinto +34501|1003|4|3|22|19888.00|0.02|0.05|R|F|1994-02-27|1994-01-24|1994-03-29|COLLECT COD|SHIP|nst the quickl +34501|1699|23|4|14|22409.66|0.04|0.06|R|F|1994-03-06|1994-03-08|1994-03-22|NONE|SHIP|ironic deposits among th +34502|1505|86|1|20|28130.00|0.02|0.05|N|O|1997-12-12|1997-11-30|1998-01-06|DELIVER IN PERSON|REG AIR| according +34502|1975|76|2|19|35662.43|0.07|0.08|N|O|1997-11-06|1997-12-14|1997-12-02|TAKE BACK RETURN|MAIL|y pending deposits cajole. slyly even excus +34502|1835|36|3|13|22578.79|0.04|0.05|N|O|1998-01-05|1997-11-18|1998-01-09|COLLECT COD|RAIL|regular dolphins cajole ironic p +34502|1638|80|4|32|49268.16|0.07|0.04|N|O|1998-01-03|1997-12-24|1998-01-29|NONE|RAIL|s the slyly ironic platelets. furious +34503|442|1|1|50|67122.00|0.07|0.07|N|O|1997-02-05|1997-03-08|1997-02-24|DELIVER IN PERSON|FOB|ular ideas wake furiously. i +34503|1185|86|2|38|41274.84|0.00|0.05|N|O|1997-02-24|1997-02-17|1997-03-10|TAKE BACK RETURN|AIR|packages are furiously-- regularly bold +34528|44|20|1|11|10384.44|0.03|0.04|N|O|1998-02-08|1998-01-23|1998-02-16|NONE|REG AIR|lithely unusual +34528|74|50|2|32|31170.24|0.03|0.07|N|O|1997-12-05|1998-01-28|1997-12-16|NONE|FOB|al packages. blithely final platelets +34528|380|37|3|45|57617.10|0.00|0.06|N|O|1998-01-06|1998-01-10|1998-01-25|COLLECT COD|AIR|es against +34529|1256|68|1|43|49761.75|0.01|0.06|N|O|1998-02-16|1998-03-21|1998-02-23|NONE|SHIP|the regularly special sauternes. +34529|241|69|2|32|36519.68|0.09|0.08|N|O|1998-04-06|1998-03-13|1998-04-09|COLLECT COD|RAIL| instructions haggle across the +34529|764|29|3|13|21641.88|0.09|0.02|N|O|1998-03-07|1998-03-09|1998-03-15|TAKE BACK RETURN|MAIL|even ideas boost furious +34530|1032|3|1|28|26124.84|0.05|0.06|A|F|1993-12-29|1993-10-23|1994-01-20|DELIVER IN PERSON|FOB|. stealthy request +34530|482|12|2|38|52534.24|0.01|0.07|R|F|1993-11-06|1993-09-30|1993-11-20|DELIVER IN PERSON|AIR|furiously above the quickly express acco +34530|242|97|3|16|18275.84|0.07|0.01|A|F|1993-11-24|1993-11-20|1993-12-02|NONE|TRUCK|fully close requests. iron +34530|60|36|4|16|15360.96|0.05|0.00|R|F|1993-10-30|1993-11-06|1993-11-16|DELIVER IN PERSON|SHIP|d the furiously bold req +34530|1539|60|5|33|47537.49|0.04|0.02|R|F|1993-09-25|1993-11-29|1993-10-04|COLLECT COD|SHIP|t carefully. +34530|1621|4|6|39|59382.18|0.06|0.02|A|F|1993-09-08|1993-11-29|1993-09-18|TAKE BACK RETURN|AIR|le after the slyly sil +34531|1398|75|1|17|22089.63|0.06|0.06|N|O|1998-03-28|1998-04-12|1998-04-19|TAKE BACK RETURN|TRUCK|ully silent, unusual foxes. +34531|428|87|2|48|63764.16|0.09|0.01|N|O|1998-03-14|1998-04-04|1998-04-12|DELIVER IN PERSON|AIR|ic pinto bea +34532|1896|26|1|4|7191.56|0.08|0.00|R|F|1993-02-02|1993-02-16|1993-02-28|COLLECT COD|TRUCK|ly bold depos +34532|408|9|2|30|39252.00|0.10|0.06|R|F|1993-03-27|1993-01-17|1993-04-03|NONE|REG AIR|ily. sometimes express +34532|91|92|3|23|22795.07|0.06|0.05|R|F|1993-01-18|1993-01-26|1993-02-01|DELIVER IN PERSON|RAIL| the ironic deposits. carefu +34532|1698|40|4|10|15996.90|0.00|0.05|R|F|1993-02-26|1993-01-16|1993-03-14|COLLECT COD|FOB|onic account +34532|1085|21|5|14|13805.12|0.04|0.02|A|F|1993-01-18|1993-01-31|1993-01-27|NONE|TRUCK| quickly expr +34532|611|5|6|39|58952.79|0.01|0.00|R|F|1993-01-15|1993-02-22|1993-02-02|COLLECT COD|REG AIR|ffily final packages. blithely fluff +34533|95|46|1|11|10945.99|0.08|0.08|N|O|1996-07-28|1996-06-12|1996-08-26|DELIVER IN PERSON|RAIL|pending, express accounts +34533|231|13|2|18|20362.14|0.09|0.06|N|O|1996-05-31|1996-06-15|1996-06-26|NONE|SHIP| deposits are in +34533|162|63|3|27|28678.32|0.03|0.07|N|O|1996-07-20|1996-07-13|1996-08-18|NONE|TRUCK|pecial requests hinder +34533|1307|8|4|42|50748.60|0.07|0.06|N|O|1996-05-21|1996-06-24|1996-06-19|COLLECT COD|RAIL|ts are quietly along the requ +34533|471|1|5|48|65830.56|0.03|0.03|N|O|1996-05-24|1996-06-29|1996-06-18|COLLECT COD|REG AIR|refully dogged +34534|1334|11|1|39|48177.87|0.09|0.00|N|O|1998-04-11|1998-02-08|1998-05-02|NONE|SHIP|y regular foxes. carefully fina +34534|94|70|2|34|33799.06|0.10|0.08|N|O|1998-03-05|1998-01-27|1998-03-31|DELIVER IN PERSON|TRUCK|lar accounts boost fluffily bo +34535|1095|96|1|7|6972.63|0.02|0.03|R|F|1993-08-15|1993-10-25|1993-08-16|NONE|SHIP|ts. busy pinto beans must +34535|1885|29|2|23|41098.24|0.05|0.00|A|F|1993-11-17|1993-09-14|1993-11-30|DELIVER IN PERSON|AIR|ly regular deposits wake according +34535|1057|58|3|47|45028.35|0.03|0.05|R|F|1993-09-09|1993-09-21|1993-09-23|DELIVER IN PERSON|FOB|. slyly even foxe +34535|458|88|4|2|2716.90|0.08|0.01|A|F|1993-10-20|1993-09-13|1993-10-31|DELIVER IN PERSON|SHIP|lly fluffy foxes unwind about the +34535|24|75|5|22|20328.44|0.06|0.03|R|F|1993-09-12|1993-10-30|1993-09-29|COLLECT COD|TRUCK|to beans poach furio +34535|1943|32|6|15|27674.10|0.07|0.01|R|F|1993-11-24|1993-10-19|1993-12-01|DELIVER IN PERSON|FOB|ckly unusual orbits haggle blithely a +34535|1166|75|7|33|35216.28|0.02|0.01|R|F|1993-08-25|1993-09-14|1993-09-12|DELIVER IN PERSON|TRUCK|kly bold asymptotes was always. +34560|1801|45|1|29|49381.20|0.02|0.07|R|F|1992-12-11|1992-12-31|1993-01-10|NONE|AIR|accounts haggle slyly. regu +34560|1399|100|2|36|46814.04|0.07|0.03|R|F|1993-01-18|1993-01-18|1993-01-27|NONE|RAIL|hely across the regular +34560|199|26|3|5|5495.95|0.01|0.08|A|F|1993-01-13|1992-12-26|1993-01-29|NONE|RAIL|ress platelets across the fluffily bold +34560|1099|35|4|36|36003.24|0.04|0.06|R|F|1993-01-18|1992-12-22|1993-02-01|COLLECT COD|AIR|e blithely-- +34561|796|29|1|42|71265.18|0.09|0.06|R|F|1994-09-19|1994-08-04|1994-10-03|TAKE BACK RETURN|SHIP|furiously regular +34562|466|54|1|19|25962.74|0.07|0.04|R|F|1993-11-11|1993-10-03|1993-11-28|NONE|RAIL|ts affix flu +34562|1553|94|2|34|49454.70|0.08|0.07|R|F|1993-09-10|1993-10-04|1993-09-12|COLLECT COD|TRUCK|he quickly regular pinto beans. caref +34562|984|19|3|40|75399.20|0.08|0.00|R|F|1993-10-18|1993-11-06|1993-10-22|COLLECT COD|FOB| haggle slyly final dep +34562|1813|43|4|29|49729.49|0.08|0.00|R|F|1993-11-13|1993-10-10|1993-12-06|NONE|FOB|leep. fluffily ironic deposits are slyly +34562|1429|30|5|18|23947.56|0.05|0.01|A|F|1993-10-28|1993-11-19|1993-11-17|DELIVER IN PERSON|MAIL|kly pending instruction +34563|696|28|1|43|68657.67|0.03|0.02|A|F|1992-06-15|1992-05-20|1992-06-30|NONE|RAIL|xpress ideas sleep fu +34563|1003|39|2|40|36160.00|0.10|0.04|R|F|1992-06-13|1992-04-12|1992-07-05|NONE|REG AIR| above the unusual accounts. careful +34563|1534|35|3|2|2871.06|0.02|0.03|A|F|1992-06-21|1992-04-17|1992-06-22|COLLECT COD|MAIL|ackages about the finally pendin +34563|326|11|4|38|46600.16|0.08|0.03|A|F|1992-05-06|1992-05-18|1992-05-28|TAKE BACK RETURN|RAIL|ets. pending platelets +34563|1183|92|5|40|43367.20|0.00|0.06|R|F|1992-06-30|1992-05-07|1992-07-07|NONE|AIR|haggle unusual theodolites! un +34564|590|51|1|6|8943.54|0.05|0.06|N|O|1998-02-18|1998-02-09|1998-03-17|NONE|AIR|ckages. carefully final foxes detect sl +34564|1250|62|2|35|40293.75|0.00|0.02|N|O|1997-11-19|1998-01-18|1997-11-20|DELIVER IN PERSON|SHIP|pendencies. furiously re +34564|48|24|3|31|29389.24|0.05|0.01|N|O|1998-02-22|1997-12-13|1998-03-08|NONE|FOB|blithely express packages. sometimes even i +34564|478|8|4|37|51003.39|0.02|0.04|N|O|1997-11-22|1998-01-10|1997-12-16|COLLECT COD|MAIL|y blithely bold dinos. b +34564|972|75|5|45|84283.65|0.07|0.02|N|O|1998-01-22|1998-01-19|1998-02-11|COLLECT COD|RAIL|r, even ideas e +34565|994|97|1|25|47374.75|0.02|0.00|R|F|1994-07-21|1994-08-18|1994-08-17|DELIVER IN PERSON|SHIP|cajole blithely even +34565|582|83|2|43|63750.94|0.09|0.07|R|F|1994-10-06|1994-09-16|1994-10-18|COLLECT COD|FOB|ual excuses +34565|590|91|3|28|41736.52|0.04|0.07|R|F|1994-09-04|1994-08-26|1994-09-23|DELIVER IN PERSON|RAIL| even accounts at the +34565|85|36|4|33|32507.64|0.10|0.05|R|F|1994-11-10|1994-09-06|1994-11-26|DELIVER IN PERSON|AIR|ep blithely requests. requests play. f +34565|429|88|5|48|63812.16|0.08|0.03|R|F|1994-09-09|1994-08-24|1994-10-02|TAKE BACK RETURN|SHIP|luffily ironic packages haggle fl +34566|1294|69|1|45|53788.05|0.02|0.04|N|O|1996-01-07|1995-12-14|1996-01-17|NONE|SHIP|nic deposits boost among the fu +34566|798|63|2|5|8493.95|0.06|0.04|N|O|1996-02-14|1996-01-06|1996-02-23|COLLECT COD|MAIL|ding dolphins. unusua +34566|246|47|3|23|26363.52|0.04|0.08|N|O|1996-02-11|1995-12-27|1996-03-06|NONE|FOB|final accounts. blithely ir +34566|1048|49|4|21|19929.84|0.09|0.05|N|O|1995-12-10|1996-01-25|1995-12-29|COLLECT COD|RAIL|wake carefully along the +34566|482|70|5|12|16589.76|0.00|0.04|N|O|1995-12-06|1996-01-22|1995-12-20|COLLECT COD|FOB|d the unusual, unusual ac +34567|255|37|1|1|1155.25|0.06|0.06|A|F|1994-07-28|1994-05-27|1994-08-16|DELIVER IN PERSON|RAIL| regular, final dep +34567|1052|58|2|40|38122.00|0.05|0.07|A|F|1994-05-14|1994-06-20|1994-06-03|NONE|SHIP|thely bold orbits cajole. requests haggle +34567|402|32|3|2|2604.80|0.10|0.04|A|F|1994-07-06|1994-07-02|1994-08-05|NONE|MAIL|the unusual accou +34567|1020|91|4|46|42366.92|0.01|0.02|R|F|1994-06-03|1994-07-25|1994-06-26|COLLECT COD|MAIL|the enticingly regular pinto beans. +34567|547|8|5|7|10132.78|0.09|0.04|A|F|1994-08-23|1994-06-25|1994-09-02|NONE|FOB|sits cajole carefully regular, u +34567|1579|20|6|47|69586.79|0.07|0.01|A|F|1994-07-25|1994-07-23|1994-08-02|NONE|SHIP|yly even deposits hinder furiously +34567|1351|66|7|23|28804.05|0.07|0.05|A|F|1994-06-15|1994-05-29|1994-07-04|COLLECT COD|FOB|lar platelets +34592|1625|26|1|33|50378.46|0.04|0.05|A|F|1995-04-24|1995-04-03|1995-04-28|COLLECT COD|FOB|blithely slyly unusual +34593|636|30|1|3|4609.89|0.00|0.00|N|O|1996-11-28|1996-12-11|1996-12-16|COLLECT COD|MAIL|long the even deposits. +34593|933|34|2|29|53183.97|0.09|0.05|N|O|1997-02-21|1997-01-07|1997-03-11|TAKE BACK RETURN|AIR|ckly regula +34593|105|32|3|3|3015.30|0.10|0.03|N|O|1996-11-26|1996-12-20|1996-12-13|COLLECT COD|REG AIR| carefully even accounts boost fluffi +34593|781|46|4|38|63907.64|0.04|0.07|N|O|1997-03-01|1997-01-22|1997-03-22|TAKE BACK RETURN|REG AIR|efully despite the slyly sil +34593|1688|71|5|38|60407.84|0.10|0.07|N|O|1997-01-24|1996-12-06|1997-02-03|NONE|AIR|against the quickly even request +34593|1617|18|6|25|37965.25|0.09|0.02|N|O|1996-12-03|1997-01-08|1996-12-12|COLLECT COD|AIR| the furiously unusual instructions! re +34594|896|63|1|5|8984.45|0.05|0.01|A|F|1992-11-27|1993-01-20|1992-11-28|COLLECT COD|RAIL|s snooze ironic pinto b +34595|1389|66|1|22|28388.36|0.05|0.08|A|F|1992-08-09|1992-09-04|1992-08-23|NONE|RAIL| accounts serve qu +34595|31|7|2|7|6517.21|0.10|0.06|A|F|1992-11-11|1992-10-13|1992-12-07|DELIVER IN PERSON|REG AIR|ts wake fluffily ideas. thin +34595|1526|67|3|10|14275.20|0.09|0.07|A|F|1992-11-13|1992-09-29|1992-11-24|TAKE BACK RETURN|REG AIR|ickly regular requests boost after the regu +34595|1373|50|4|43|54797.91|0.01|0.04|R|F|1992-10-19|1992-09-29|1992-11-12|COLLECT COD|SHIP|deposits integrate. somas alon +34595|1001|37|5|4|3608.00|0.05|0.07|R|F|1992-09-05|1992-09-23|1992-09-08|COLLECT COD|SHIP|quests sleep slyly. accounts since +34595|860|61|6|44|77477.84|0.04|0.00|A|F|1992-10-17|1992-08-23|1992-10-26|COLLECT COD|REG AIR|eep-- blithely pending deposits haggle +34595|308|37|7|44|53165.20|0.01|0.07|R|F|1992-08-31|1992-10-07|1992-09-03|COLLECT COD|AIR|express ideas. slyly unusual packages +34596|77|3|1|12|11724.84|0.04|0.04|N|O|1995-12-16|1995-11-28|1996-01-09|TAKE BACK RETURN|SHIP|thely about the slyly bold p +34596|358|43|2|12|15100.20|0.07|0.06|N|O|1995-11-29|1995-11-19|1995-12-06|TAKE BACK RETURN|TRUCK|leep carefully? blithely ev +34596|24|100|3|32|29568.64|0.10|0.04|N|O|1995-12-10|1995-10-29|1995-12-14|NONE|MAIL| regular deposits unwind blith +34596|132|33|4|24|24771.12|0.08|0.01|N|O|1995-12-19|1995-11-22|1995-12-31|NONE|AIR| unusual, regular ide +34596|570|71|5|33|48528.81|0.05|0.00|N|O|1995-09-15|1995-11-09|1995-10-08|COLLECT COD|FOB| requests across the unusual courts +34596|1603|86|6|30|45138.00|0.06|0.01|N|O|1995-10-09|1995-10-19|1995-10-28|COLLECT COD|RAIL| special requests cajole carefully +34597|1084|85|1|3|2955.24|0.09|0.02|A|F|1993-12-31|1994-02-08|1994-01-26|COLLECT COD|SHIP| special th +34597|269|51|2|17|19877.42|0.08|0.03|R|F|1994-03-24|1994-01-30|1994-04-01|COLLECT COD|AIR|carefully. final a +34597|898|65|3|11|19787.79|0.08|0.08|A|F|1994-03-09|1994-03-01|1994-03-26|NONE|SHIP|furiously pending reque +34597|1702|3|4|15|24055.50|0.04|0.08|R|F|1994-01-22|1994-01-27|1994-01-23|COLLECT COD|RAIL|ly unusual dinos sleep furiously furiousl +34597|1617|59|5|3|4555.83|0.09|0.08|A|F|1993-12-28|1994-03-02|1994-01-12|COLLECT COD|REG AIR|s. carefully ironic gifts sleep expre +34597|194|21|6|7|7659.33|0.03|0.04|A|F|1994-01-13|1994-03-11|1994-02-08|DELIVER IN PERSON|REG AIR|to beans haggle blithely after the furio +34598|1702|87|1|12|19244.40|0.04|0.01|N|O|1997-07-19|1997-08-14|1997-08-02|DELIVER IN PERSON|RAIL|en packages +34598|1446|47|2|4|5389.76|0.01|0.03|N|O|1997-08-18|1997-07-09|1997-09-14|TAKE BACK RETURN|SHIP| ideas could have to gro +34598|1646|88|3|18|27857.52|0.04|0.00|N|O|1997-07-18|1997-08-23|1997-08-16|COLLECT COD|FOB|ual, pendi +34599|1993|38|1|2|3789.98|0.00|0.03|R|F|1993-04-02|1993-04-22|1993-04-05|TAKE BACK RETURN|MAIL|ash ironic foxes. blithely special depo +34599|510|71|2|43|60651.93|0.05|0.04|A|F|1993-03-22|1993-05-29|1993-04-19|COLLECT COD|MAIL|lyly quick requests according +34599|1723|50|3|30|48741.60|0.09|0.00|R|F|1993-05-27|1993-05-30|1993-06-04|TAKE BACK RETURN|SHIP|platelets. +34599|498|57|4|13|18180.37|0.09|0.02|R|F|1993-04-27|1993-04-21|1993-05-13|DELIVER IN PERSON|TRUCK|es wake blith +34599|1330|31|5|8|9850.64|0.09|0.00|A|F|1993-06-21|1993-05-27|1993-07-18|DELIVER IN PERSON|FOB|counts. slyly f +34599|659|22|6|41|63945.65|0.01|0.05|A|F|1993-05-06|1993-05-14|1993-06-04|COLLECT COD|AIR|ajole furiously against the slyly even pa +34624|1732|33|1|49|80052.77|0.09|0.02|R|F|1992-09-24|1992-12-18|1992-09-30|DELIVER IN PERSON|AIR|t the ironic dep +34625|1152|61|1|30|31594.50|0.08|0.06|N|O|1997-07-12|1997-07-03|1997-07-13|TAKE BACK RETURN|MAIL|slyly blithely even dolphins. acco +34625|1989|34|2|30|56729.40|0.01|0.08|N|O|1997-07-22|1997-07-23|1997-08-04|DELIVER IN PERSON|REG AIR|sly. slyly special deposits hang carefully. +34625|1785|86|3|10|16867.80|0.04|0.00|N|O|1997-06-28|1997-08-05|1997-07-11|TAKE BACK RETURN|AIR|are. requests integrate ruthlessly final +34625|944|13|4|17|31363.98|0.03|0.07|N|O|1997-07-11|1997-08-04|1997-07-30|TAKE BACK RETURN|SHIP|ctions. al +34626|552|13|1|15|21788.25|0.04|0.05|R|F|1992-11-23|1992-12-07|1992-12-08|TAKE BACK RETURN|FOB|e quickly idle theodolites. quickly ir +34626|843|77|2|42|73241.28|0.10|0.05|R|F|1993-02-08|1992-12-21|1993-03-05|COLLECT COD|SHIP|s. slyly final instructions sleep +34626|1610|52|3|3|4534.83|0.01|0.01|A|F|1993-01-06|1992-12-07|1993-01-16|NONE|TRUCK|uriously regular +34626|53|4|4|31|29544.55|0.06|0.07|A|F|1993-02-02|1992-12-30|1993-03-02|TAKE BACK RETURN|MAIL|ess requests. fluffily silent packages +34626|1920|9|5|43|78342.56|0.10|0.01|A|F|1992-12-28|1992-11-16|1993-01-14|NONE|RAIL|bout the slyly express foxes cajole blit +34626|86|12|6|11|10846.88|0.04|0.00|A|F|1992-10-31|1992-12-09|1992-11-22|DELIVER IN PERSON|REG AIR|l dinos haggle bl +34626|332|33|7|20|24646.60|0.05|0.08|A|F|1993-01-16|1992-12-05|1993-02-02|TAKE BACK RETURN|RAIL|final sheaves haggle. bli +34627|1675|58|1|35|55183.45|0.07|0.03|R|F|1992-11-28|1992-12-17|1992-12-15|NONE|FOB|ptotes. quickly +34627|1078|79|2|15|14686.05|0.02|0.03|R|F|1992-12-06|1992-11-27|1992-12-07|COLLECT COD|REG AIR|s. fluffily regular instructions sleep furi +34627|1333|48|3|50|61716.50|0.07|0.00|A|F|1993-01-08|1992-12-16|1993-02-02|COLLECT COD|MAIL|ously unusual +34628|1977|10|1|44|82674.68|0.10|0.06|R|F|1993-07-01|1993-07-14|1993-07-05|COLLECT COD|MAIL| even deposits according to the cl +34629|1036|37|1|31|29047.93|0.07|0.04|N|O|1997-09-28|1997-10-01|1997-10-02|TAKE BACK RETURN|FOB|lithely silent ideas +34630|938|41|1|46|84590.78|0.07|0.07|N|O|1996-03-03|1996-01-07|1996-03-07|DELIVER IN PERSON|FOB|. unusual, even asymptotes cajo +34630|124|51|2|47|48133.64|0.08|0.03|N|O|1996-01-16|1996-01-10|1996-01-27|TAKE BACK RETURN|FOB|uietly after the boldly regula +34630|1755|82|3|3|4970.25|0.03|0.07|N|O|1995-12-04|1996-01-15|1995-12-13|DELIVER IN PERSON|RAIL|omas cajole furiou +34630|568|69|4|37|54336.72|0.03|0.04|N|O|1995-12-13|1995-12-30|1995-12-23|COLLECT COD|MAIL|xcuses use. quickly un +34631|1845|89|1|48|83848.32|0.03|0.00|R|F|1994-12-14|1995-01-18|1995-01-07|COLLECT COD|MAIL|ts sleep slyly. care +34631|208|63|2|31|34354.20|0.03|0.05|R|F|1994-11-15|1994-12-09|1994-11-30|NONE|SHIP|ffily unusual deposits detect furiously fi +34631|1314|15|3|13|15799.03|0.07|0.05|A|F|1995-01-08|1994-12-08|1995-01-24|DELIVER IN PERSON|RAIL|thely even platelets haggle +34631|332|89|4|6|7393.98|0.04|0.01|A|F|1994-11-24|1995-01-14|1994-12-04|TAKE BACK RETURN|AIR|riously eve +34631|305|34|5|9|10847.70|0.08|0.05|R|F|1994-11-02|1994-11-28|1994-11-23|COLLECT COD|TRUCK|f the blith +34656|218|46|1|25|27955.25|0.02|0.02|N|O|1995-09-15|1995-09-01|1995-10-05|NONE|TRUCK|s boost. careful +34657|573|34|1|4|5894.28|0.00|0.06|R|F|1993-05-31|1993-08-01|1993-06-21|NONE|RAIL|dly. pending, silent pinto beans +34657|166|45|2|31|33050.96|0.06|0.01|R|F|1993-07-07|1993-06-25|1993-08-01|DELIVER IN PERSON|SHIP| even packages wake. deposits cajole +34657|1113|14|3|6|6084.66|0.05|0.00|A|F|1993-07-16|1993-06-06|1993-07-23|TAKE BACK RETURN|MAIL|ly unusual pinto beans. final, silent req +34658|366|95|1|46|58252.56|0.02|0.05|R|F|1993-12-19|1993-12-30|1993-12-24|DELIVER IN PERSON|TRUCK|efully bold +34658|1598|19|2|22|32990.98|0.02|0.00|A|F|1993-12-04|1994-01-08|1993-12-28|COLLECT COD|TRUCK|equests above the +34658|941|44|3|28|51574.32|0.04|0.00|R|F|1993-11-26|1994-01-11|1993-11-28|NONE|RAIL|uickly after the even, bold accounts. fl +34658|269|97|4|37|43262.62|0.08|0.06|R|F|1994-02-17|1994-01-31|1994-03-16|TAKE BACK RETURN|MAIL|ss pinto beans. platelets along +34659|1823|53|1|12|20697.84|0.09|0.00|R|F|1992-11-27|1993-01-18|1992-11-28|NONE|FOB|odolites sleep against the sometimes iro +34659|1819|6|2|14|24091.34|0.08|0.05|A|F|1993-02-15|1992-12-24|1993-03-01|DELIVER IN PERSON|RAIL|ickly unusual d +34659|954|55|3|19|35244.05|0.10|0.06|R|F|1992-11-28|1992-12-25|1992-12-15|NONE|REG AIR|y special deposits. caref +34659|1668|51|4|32|50229.12|0.01|0.05|R|F|1993-03-19|1993-01-04|1993-04-17|TAKE BACK RETURN|REG AIR| boost according to the even ideas. unu +34659|1753|80|5|25|41368.75|0.06|0.05|R|F|1993-02-27|1993-02-05|1993-03-07|COLLECT COD|MAIL|yly silent foxe +34659|126|79|6|13|13339.56|0.01|0.07|R|F|1993-03-21|1992-12-22|1993-04-15|DELIVER IN PERSON|REG AIR|phins alongside of the pe +34659|1988|21|7|19|35909.62|0.07|0.06|A|F|1993-03-18|1993-02-09|1993-03-23|DELIVER IN PERSON|REG AIR| carefully regular packages +34660|302|31|1|5|6011.50|0.07|0.01|N|O|1995-12-05|1995-11-28|1995-12-18|DELIVER IN PERSON|AIR|sits. fluffil +34660|1098|69|2|34|33969.06|0.05|0.01|N|O|1995-11-08|1995-11-23|1995-11-16|DELIVER IN PERSON|AIR|e blithely whithout the blithely even d +34660|1112|49|3|49|49642.39|0.08|0.01|N|O|1995-09-08|1995-10-17|1995-09-17|NONE|MAIL|cial deposits h +34660|1750|51|4|18|29731.50|0.03|0.04|N|O|1995-11-29|1995-11-19|1995-12-05|TAKE BACK RETURN|TRUCK|pinto beans haggle final theodolites. unusu +34660|1083|19|5|38|37395.04|0.08|0.08|N|O|1995-12-10|1995-10-04|1995-12-26|DELIVER IN PERSON|TRUCK|yly. daring, ironic frays across +34660|1639|22|6|42|64706.46|0.05|0.03|N|O|1995-12-10|1995-10-21|1995-12-14|NONE|FOB| cajole accoun +34660|886|87|7|23|41098.24|0.00|0.02|N|O|1995-11-07|1995-10-05|1995-12-06|DELIVER IN PERSON|RAIL|s sleep acc +34661|1166|39|1|8|8537.28|0.04|0.06|A|F|1993-02-16|1993-02-28|1993-03-18|COLLECT COD|REG AIR|fully blithely silent deposits. deposits +34661|1287|99|2|14|16635.92|0.01|0.02|R|F|1993-02-23|1993-04-12|1993-03-16|TAKE BACK RETURN|REG AIR|the accounts. +34661|1281|19|3|3|3546.84|0.04|0.06|A|F|1993-04-05|1993-03-31|1993-05-04|TAKE BACK RETURN|RAIL|nal excuses. ironic depo +34662|808|42|1|31|52972.80|0.08|0.07|A|F|1992-03-21|1992-02-16|1992-04-04|COLLECT COD|REG AIR|uickly final theo +34662|116|69|2|43|43692.73|0.07|0.07|R|F|1992-03-12|1992-02-25|1992-03-26|COLLECT COD|AIR| regular requests. regular, fi +34662|1202|3|3|42|46334.40|0.08|0.06|A|F|1992-04-13|1992-04-05|1992-04-16|DELIVER IN PERSON|AIR| the furiously silent excuses must hav +34662|914|83|4|24|43557.84|0.07|0.04|A|F|1992-02-15|1992-03-01|1992-03-01|DELIVER IN PERSON|REG AIR|eposits kind +34662|1389|66|5|14|18065.32|0.06|0.08|R|F|1992-02-12|1992-03-31|1992-03-01|DELIVER IN PERSON|REG AIR|ntegrate furiously dogged requests! n +34662|1381|58|6|40|51295.20|0.03|0.00|R|F|1992-05-05|1992-04-10|1992-05-10|COLLECT COD|AIR|ckly regular +34663|15|16|1|10|9150.10|0.03|0.06|N|O|1995-10-18|1995-08-07|1995-10-20|TAKE BACK RETURN|TRUCK|ans. quickly silent deposits main +34663|1788|89|2|5|8448.90|0.09|0.01|N|O|1995-10-15|1995-09-22|1995-10-24|NONE|TRUCK|telets integrate +34663|1524|25|3|20|28510.40|0.04|0.00|N|O|1995-10-14|1995-09-13|1995-10-20|COLLECT COD|SHIP|s are slyly among +34663|543|4|4|25|36088.50|0.04|0.05|N|O|1995-08-23|1995-09-25|1995-09-10|DELIVER IN PERSON|TRUCK|ep quickly slyly ironic ac +34663|1938|83|5|40|73597.20|0.05|0.01|N|O|1995-10-03|1995-08-22|1995-10-16|TAKE BACK RETURN|SHIP|lly according to the +34663|553|14|6|18|26163.90|0.08|0.00|N|O|1995-09-19|1995-08-08|1995-10-13|COLLECT COD|RAIL|e alongside of the regular, fin +34688|1586|7|1|12|17850.96|0.00|0.02|R|F|1992-10-07|1992-08-13|1992-10-18|DELIVER IN PERSON|SHIP|n gifts boost slyly final requests. slyl +34688|1573|74|2|33|48660.81|0.07|0.02|R|F|1992-09-30|1992-09-04|1992-10-07|DELIVER IN PERSON|AIR|olites are fluffily +34688|1725|52|3|11|17893.92|0.09|0.04|A|F|1992-09-15|1992-08-18|1992-09-28|DELIVER IN PERSON|REG AIR|haggle furiously ironic, pen +34688|1792|77|4|44|74526.76|0.09|0.05|R|F|1992-07-22|1992-10-07|1992-08-07|COLLECT COD|AIR|ious dolphins are slyly +34689|324|53|1|15|18364.80|0.02|0.08|R|F|1995-03-05|1994-12-25|1995-03-22|COLLECT COD|REG AIR|ily silent dependencies eat flu +34689|1760|87|2|31|51514.56|0.06|0.07|A|F|1995-01-20|1995-01-30|1995-02-10|DELIVER IN PERSON|SHIP|ng the quick +34690|495|83|1|16|22327.84|0.09|0.07|R|F|1993-10-24|1993-09-15|1993-11-21|NONE|TRUCK|e carefully am +34691|1139|76|1|22|22882.86|0.08|0.04|A|F|1994-04-13|1994-03-22|1994-04-17|COLLECT COD|TRUCK| quickly final packages agai +34691|1533|34|2|3|4303.59|0.10|0.01|A|F|1994-02-22|1994-02-14|1994-03-20|COLLECT COD|MAIL|he express requests. deposits are blithely +34691|205|33|3|13|14367.60|0.00|0.05|R|F|1994-04-11|1994-03-06|1994-04-21|COLLECT COD|REG AIR|ts. express dependencies sleep ironic dep +34691|1891|35|4|47|84265.83|0.04|0.05|A|F|1994-01-31|1994-03-23|1994-02-27|NONE|MAIL|. slyly ironic p +34691|1235|36|5|45|51130.35|0.08|0.02|A|F|1994-01-22|1994-03-08|1994-01-30|DELIVER IN PERSON|MAIL|packages maintain quickly. slyl +34691|1528|69|6|3|4288.56|0.10|0.03|R|F|1994-04-29|1994-02-21|1994-05-03|COLLECT COD|MAIL|ly special courts haggle according to +34691|387|72|7|21|27034.98|0.08|0.00|A|F|1994-04-08|1994-03-27|1994-04-16|TAKE BACK RETURN|FOB|olites. carefully even accounts will integ +34692|1068|69|1|27|26164.62|0.09|0.05|A|F|1993-08-01|1993-06-26|1993-08-04|NONE|AIR|theodolites about the requests detec +34692|1237|49|2|44|50082.12|0.09|0.00|R|F|1993-09-01|1993-08-02|1993-09-22|TAKE BACK RETURN|AIR| somas caj +34692|1440|19|3|48|64389.12|0.01|0.05|A|F|1993-06-10|1993-07-14|1993-06-15|DELIVER IN PERSON|AIR| ironic accounts dazzle +34692|1|27|4|3|2703.00|0.08|0.06|R|F|1993-08-12|1993-07-23|1993-08-15|NONE|RAIL|lly ironic deposits. even deposits wa +34692|1779|6|5|15|25211.55|0.00|0.02|R|F|1993-05-24|1993-07-30|1993-06-18|DELIVER IN PERSON|FOB|ld requests are blithel +34693|1672|14|1|11|17310.37|0.09|0.04|N|O|1997-02-13|1997-04-09|1997-02-26|COLLECT COD|MAIL|ccounts haggle. carefully express r +34693|1600|41|2|14|21022.40|0.01|0.01|N|O|1997-03-13|1997-04-14|1997-04-04|TAKE BACK RETURN|AIR| deposits. s +34693|796|97|3|29|49206.91|0.04|0.08|N|O|1997-05-13|1997-04-22|1997-05-21|TAKE BACK RETURN|RAIL|ng theodolites. furiously darin +34693|677|71|4|40|63106.80|0.07|0.03|N|O|1997-03-01|1997-04-06|1997-03-24|TAKE BACK RETURN|FOB|nt packages cajole care +34693|1804|48|5|21|35821.80|0.07|0.01|N|O|1997-03-08|1997-04-14|1997-03-19|COLLECT COD|REG AIR|cross the ironic accounts. special +34694|1421|39|1|5|6612.10|0.08|0.02|N|O|1995-08-17|1995-07-24|1995-09-04|DELIVER IN PERSON|AIR|quickly final requests affix furiously +34694|1109|82|2|36|36363.60|0.10|0.00|N|O|1995-08-06|1995-06-26|1995-08-26|TAKE BACK RETURN|AIR|ans along +34694|452|82|3|24|32458.80|0.08|0.07|R|F|1995-05-09|1995-07-10|1995-05-26|TAKE BACK RETURN|SHIP|y unusual acc +34694|1826|70|4|32|55290.24|0.00|0.03|N|O|1995-07-05|1995-06-01|1995-07-13|NONE|AIR|ly. regular foxes haggle near the r +34694|1189|26|5|13|14172.34|0.02|0.01|A|F|1995-05-12|1995-07-05|1995-05-19|NONE|REG AIR|ns sleep blithely final instructions. bol +34694|498|99|6|10|13984.90|0.07|0.01|A|F|1995-06-05|1995-06-11|1995-06-08|COLLECT COD|TRUCK|ckages. foxes are +34695|1706|91|1|47|75561.90|0.09|0.08|N|O|1997-08-19|1997-08-01|1997-09-02|TAKE BACK RETURN|MAIL|ly. unusual depende +34695|1777|20|2|23|38611.71|0.05|0.05|N|O|1997-05-14|1997-06-06|1997-06-04|DELIVER IN PERSON|REG AIR|hin requests. regu +34720|1581|62|1|20|29651.60|0.06|0.02|N|O|1997-02-23|1997-04-23|1997-02-28|TAKE BACK RETURN|RAIL|ording to the +34721|469|99|1|25|34236.50|0.03|0.03|A|F|1993-11-10|1993-12-02|1993-11-24|TAKE BACK RETURN|TRUCK|ackages. slyly express +34721|417|5|2|21|27665.61|0.02|0.05|A|F|1993-11-21|1993-12-05|1993-12-11|TAKE BACK RETURN|RAIL|uctions. blithely silent dependencies +34721|115|94|3|7|7105.77|0.08|0.03|R|F|1993-11-12|1994-01-22|1993-11-22|COLLECT COD|SHIP|nic, regular multiplier +34721|580|41|4|28|41456.24|0.00|0.03|R|F|1994-02-18|1994-01-30|1994-02-25|TAKE BACK RETURN|REG AIR|ges boost. final, unusual theodolit +34721|1701|28|5|18|28848.60|0.03|0.02|A|F|1993-12-31|1994-01-13|1994-01-30|DELIVER IN PERSON|AIR|s haggle furiously. silent +34722|906|41|1|1|1806.90|0.04|0.00|N|O|1997-04-18|1997-04-07|1997-05-18|TAKE BACK RETURN|FOB|telets haggle blithel +34722|1096|97|2|35|34898.15|0.08|0.08|N|O|1997-04-25|1997-05-22|1997-05-01|TAKE BACK RETURN|RAIL| blithely. furiously final +34722|975|78|3|48|90046.56|0.00|0.03|N|O|1997-06-10|1997-04-03|1997-06-19|DELIVER IN PERSON|MAIL|ual foxes integrate along the bo +34722|1890|91|4|39|69883.71|0.10|0.08|N|O|1997-05-22|1997-05-18|1997-06-15|COLLECT COD|TRUCK| slyly regular requests. quickly +34722|38|89|5|48|45025.44|0.06|0.02|N|O|1997-07-03|1997-04-22|1997-07-28|TAKE BACK RETURN|RAIL|oost about the even, u +34722|742|7|6|35|57495.90|0.05|0.04|N|O|1997-03-15|1997-05-03|1997-04-01|NONE|TRUCK|uctions. regula +34722|354|39|7|10|12543.50|0.00|0.03|N|O|1997-05-17|1997-05-05|1997-06-11|DELIVER IN PERSON|TRUCK|ely regular requests. unusual pinto +34723|629|30|1|24|36710.88|0.08|0.02|A|F|1993-02-14|1993-01-30|1993-03-07|COLLECT COD|SHIP|heaves. carefu +34723|992|95|2|12|22715.88|0.06|0.08|R|F|1992-12-16|1993-01-20|1993-01-08|COLLECT COD|TRUCK|he pending, even pinto beans wake fu +34723|1314|15|3|22|26736.82|0.09|0.01|A|F|1992-12-29|1993-03-04|1992-12-30|TAKE BACK RETURN|TRUCK|s haggle furiously pending courts +34723|1703|46|4|45|72211.50|0.04|0.00|R|F|1993-03-12|1993-01-31|1993-03-21|DELIVER IN PERSON|RAIL|old gifts. blithely bo +34723|1076|82|5|40|39082.80|0.01|0.06|A|F|1993-01-16|1993-01-28|1993-01-23|NONE|TRUCK|, pending instructions? pinto +34724|1276|14|1|3|3531.81|0.10|0.06|A|F|1995-02-21|1995-02-22|1995-02-22|COLLECT COD|AIR|e blithely slow requests snooze afte +34724|1026|97|2|44|40788.88|0.00|0.00|A|F|1995-03-17|1995-02-25|1995-03-25|COLLECT COD|REG AIR|lar platelets ha +34724|619|13|3|8|12156.88|0.09|0.05|A|F|1995-01-03|1995-02-15|1995-01-20|DELIVER IN PERSON|RAIL|hely regular packag +34725|1545|46|1|44|63647.76|0.01|0.07|N|O|1995-08-28|1995-09-17|1995-09-11|DELIVER IN PERSON|AIR|g furiously besides the re +34725|793|94|2|4|6775.16|0.10|0.04|N|O|1995-10-21|1995-10-01|1995-11-07|COLLECT COD|RAIL|y ironic theodolites. +34725|2000|1|3|46|41492.00|0.07|0.07|N|O|1995-11-21|1995-08-31|1995-12-20|COLLECT COD|AIR|as. theodolite +34725|968|3|4|35|65413.60|0.08|0.05|N|O|1995-09-11|1995-09-23|1995-10-05|NONE|REG AIR|nding reque +34725|360|89|5|20|25207.20|0.09|0.01|N|O|1995-08-20|1995-10-08|1995-09-10|COLLECT COD|RAIL|egular pinto b +34725|1913|14|6|37|67151.67|0.04|0.05|N|O|1995-08-16|1995-10-26|1995-09-10|COLLECT COD|TRUCK|ly silent reque +34725|973|74|7|28|52471.16|0.04|0.06|N|O|1995-10-04|1995-09-30|1995-10-15|NONE|AIR|quests detect requests. +34726|1453|93|1|6|8126.70|0.03|0.03|N|O|1997-02-23|1997-01-28|1997-03-25|COLLECT COD|FOB|pendencies. do +34726|499|29|2|8|11195.92|0.05|0.07|N|O|1997-01-15|1997-01-05|1997-02-03|DELIVER IN PERSON|TRUCK|p. express accounts doze +34726|1441|42|3|9|12081.96|0.00|0.07|N|O|1996-11-14|1996-12-19|1996-11-19|TAKE BACK RETURN|REG AIR|ic orbits nag qui +34727|1739|24|1|29|47581.17|0.00|0.01|R|F|1995-05-26|1995-04-19|1995-05-29|TAKE BACK RETURN|FOB|y regular packages. unusual pla +34727|1226|38|2|14|15781.08|0.10|0.06|A|F|1995-04-17|1995-05-19|1995-04-20|DELIVER IN PERSON|SHIP| furiously +34727|963|98|3|22|41007.12|0.08|0.05|A|F|1995-03-22|1995-04-18|1995-04-14|TAKE BACK RETURN|FOB|ounts are quick +34752|939|40|1|15|27598.95|0.10|0.02|N|O|1995-09-16|1995-08-19|1995-10-09|TAKE BACK RETURN|SHIP|fter the blithely regular epitaphs. furious +34753|1443|22|1|39|52433.16|0.01|0.08|R|F|1993-04-09|1993-04-13|1993-04-26|NONE|AIR|bold requests boost slowly across the +34753|783|80|2|22|37043.16|0.02|0.07|R|F|1993-01-21|1993-03-31|1993-01-22|TAKE BACK RETURN|RAIL|oxes about the blithely fi +34753|1802|46|3|36|61336.80|0.10|0.07|R|F|1993-04-06|1993-02-27|1993-04-30|TAKE BACK RETURN|SHIP|es are sly +34753|398|99|4|30|38951.70|0.03|0.05|R|F|1993-01-24|1993-03-09|1993-02-13|COLLECT COD|TRUCK|ses play carefully against th +34754|1024|30|1|2|1850.04|0.09|0.05|A|F|1992-08-12|1992-07-15|1992-08-31|COLLECT COD|MAIL|aggle fluffily. instructio +34754|1457|58|2|1|1358.45|0.10|0.04|A|F|1992-07-14|1992-07-11|1992-08-03|TAKE BACK RETURN|TRUCK|ly. blithely final +34754|1015|21|3|2|1832.02|0.01|0.06|R|F|1992-08-01|1992-08-15|1992-08-25|DELIVER IN PERSON|RAIL|nts use. fluffily unusual deposits affix u +34755|3|54|1|43|38829.00|0.02|0.08|N|O|1997-06-01|1997-04-11|1997-06-29|DELIVER IN PERSON|TRUCK|posits. carefully enticing theodolites +34755|1926|71|2|6|10967.52|0.10|0.03|N|O|1997-04-11|1997-04-26|1997-05-09|COLLECT COD|MAIL|fluffily bold i +34755|1748|49|3|16|26395.84|0.00|0.00|N|O|1997-03-07|1997-03-28|1997-03-12|TAKE BACK RETURN|RAIL|slyly regular platelets. idly final sheav +34755|707|8|4|37|59484.90|0.01|0.08|N|O|1997-05-25|1997-05-22|1997-06-10|TAKE BACK RETURN|AIR|ffily ironic idea +34755|279|34|5|2|2358.54|0.02|0.01|N|O|1997-05-04|1997-05-24|1997-05-24|NONE|AIR| packages sleep enticing +34755|1193|94|6|13|14224.47|0.08|0.00|N|O|1997-04-27|1997-05-17|1997-05-17|DELIVER IN PERSON|RAIL|sentiments. slowly bold plat +34756|36|62|1|24|22464.72|0.03|0.04|N|O|1998-04-15|1998-05-09|1998-05-07|NONE|REG AIR|usly. express, f +34756|550|41|2|46|66725.30|0.04|0.01|N|O|1998-06-18|1998-06-02|1998-06-24|NONE|FOB|. blithely unusual pinto +34756|37|38|3|41|38418.23|0.10|0.01|N|O|1998-06-05|1998-05-17|1998-06-12|DELIVER IN PERSON|FOB|ding, final accounts haggl +34756|1941|74|4|24|44230.56|0.06|0.04|N|O|1998-06-13|1998-05-14|1998-06-28|NONE|SHIP|eat evenly according to the +34756|254|55|5|15|17313.75|0.08|0.06|N|O|1998-05-13|1998-05-30|1998-06-04|NONE|AIR|ithely; bold, final accounts are. care +34756|1941|86|6|29|53445.26|0.10|0.04|N|O|1998-05-29|1998-06-04|1998-06-22|DELIVER IN PERSON|AIR|e furiously. pains sleep slyly am +34757|1500|1|1|6|8409.00|0.10|0.07|A|F|1992-06-04|1992-07-26|1992-06-06|DELIVER IN PERSON|REG AIR| unusual courts sleep quietly blithely +34757|1241|79|2|3|3426.72|0.10|0.04|R|F|1992-06-11|1992-08-04|1992-07-08|COLLECT COD|SHIP|sly bold instructio +34757|1867|54|3|12|21226.32|0.00|0.00|A|F|1992-06-04|1992-08-09|1992-06-23|TAKE BACK RETURN|REG AIR|sly? accounts sleep carefully after the f +34758|1774|75|1|23|38542.71|0.05|0.04|N|O|1995-08-03|1995-07-16|1995-08-07|TAKE BACK RETURN|SHIP| accounts boost sly +34758|1888|32|2|19|34007.72|0.04|0.00|A|F|1995-05-23|1995-07-06|1995-06-14|COLLECT COD|FOB|counts nag. d +34758|659|53|3|4|6238.60|0.07|0.01|N|O|1995-08-10|1995-06-11|1995-09-07|COLLECT COD|RAIL|yly against the slyly express theodoli +34758|1476|77|4|34|46833.98|0.03|0.06|N|O|1995-08-17|1995-06-24|1995-09-13|COLLECT COD|TRUCK|l gifts are slyly fluffily final deposits +34758|802|2|5|48|81734.40|0.04|0.00|N|O|1995-08-13|1995-06-30|1995-08-14|DELIVER IN PERSON|SHIP|are regular accounts. caref +34758|847|81|6|12|20974.08|0.09|0.06|A|F|1995-05-17|1995-07-06|1995-05-27|TAKE BACK RETURN|REG AIR|alongside of the regular platelets +34758|1470|88|7|38|52115.86|0.01|0.08|A|F|1995-05-16|1995-06-02|1995-05-27|COLLECT COD|TRUCK|thely regular pac +34759|927|30|1|46|84084.32|0.10|0.05|N|O|1998-01-29|1998-01-03|1998-02-22|DELIVER IN PERSON|SHIP|ng to the ironic +34759|334|91|2|29|35795.57|0.01|0.05|N|O|1998-01-24|1997-12-30|1998-01-31|TAKE BACK RETURN|REG AIR|nic, speci +34759|1115|16|3|41|41660.51|0.03|0.04|N|O|1997-12-04|1998-02-11|1997-12-21|COLLECT COD|TRUCK|t fluffily. blithely +34759|1356|71|4|10|12573.50|0.00|0.00|N|O|1997-12-27|1998-01-04|1998-01-21|TAKE BACK RETURN|REG AIR|t furiously ideas. enticingly unusual pinto +34759|1819|20|5|4|6883.24|0.01|0.06|N|O|1998-01-10|1998-01-23|1998-02-03|NONE|RAIL|nts. ironi +34784|1140|41|1|38|39563.32|0.09|0.06|R|F|1994-05-31|1994-04-11|1994-06-14|DELIVER IN PERSON|RAIL|ke final, even accounts: furiously +34784|482|70|2|43|59446.64|0.00|0.08|A|F|1994-03-18|1994-03-31|1994-04-10|NONE|SHIP|xes hang closely a +34784|474|4|3|28|38485.16|0.07|0.02|R|F|1994-06-05|1994-03-15|1994-06-25|TAKE BACK RETURN|MAIL|fully outside the carefully special ideas. +34784|1201|13|4|23|25350.60|0.09|0.04|A|F|1994-02-26|1994-03-13|1994-03-21|COLLECT COD|FOB|ests use furiously above the +34784|606|7|5|42|63277.20|0.05|0.08|A|F|1994-04-05|1994-05-03|1994-04-24|NONE|AIR|lose blithel +34785|1073|9|1|4|3896.28|0.02|0.04|A|F|1993-02-03|1993-04-06|1993-02-10|COLLECT COD|SHIP| after the requests aff +34786|571|72|1|7|10300.99|0.02|0.05|N|O|1996-09-18|1996-09-25|1996-09-27|TAKE BACK RETURN|SHIP|c requests o +34787|161|88|1|19|20162.04|0.00|0.02|A|F|1993-03-27|1993-04-10|1993-04-26|TAKE BACK RETURN|REG AIR|. slyly regu +34787|1955|88|2|11|20426.45|0.01|0.08|A|F|1993-05-12|1993-04-15|1993-06-09|NONE|RAIL| ironic instruct +34787|856|56|3|13|22839.05|0.06|0.04|A|F|1993-06-21|1993-05-23|1993-06-23|TAKE BACK RETURN|RAIL| special pinto beans. final +34787|1458|76|4|23|31267.35|0.01|0.06|R|F|1993-06-12|1993-03-31|1993-06-21|NONE|TRUCK|carefully pending packages wake quic +34787|1232|7|5|5|5666.15|0.02|0.08|R|F|1993-05-14|1993-03-31|1993-06-03|TAKE BACK RETURN|REG AIR|nic deposits breach furiously accounts. +34787|440|28|6|46|61660.24|0.05|0.00|A|F|1993-03-25|1993-05-15|1993-04-19|NONE|TRUCK|ly slyly regular theodolites. fluffily regu +34788|1339|54|1|50|62016.50|0.06|0.02|R|F|1995-01-09|1995-01-11|1995-01-31|DELIVER IN PERSON|SHIP|equests are ac +34788|1567|68|2|23|33776.88|0.07|0.02|R|F|1994-12-27|1995-01-26|1995-01-03|COLLECT COD|MAIL|ss orbits; furiously special theodo +34788|1745|46|3|38|62576.12|0.07|0.05|R|F|1995-02-13|1994-12-12|1995-03-01|NONE|MAIL| carefully final, regular de +34789|1247|48|1|18|20668.32|0.03|0.01|N|O|1996-12-19|1997-01-07|1996-12-24|TAKE BACK RETURN|TRUCK|y even deposits. slyly s +34789|1961|94|2|38|70792.48|0.03|0.03|N|O|1997-02-09|1996-12-05|1997-02-10|NONE|REG AIR|nic requests sleep slyly. carefully +34789|1785|86|3|17|28675.26|0.07|0.02|N|O|1996-12-12|1996-12-18|1996-12-19|NONE|FOB|regular decoys wake sometimes. +34789|1896|26|4|9|16181.01|0.01|0.03|N|O|1997-02-07|1997-01-05|1997-02-18|DELIVER IN PERSON|MAIL|f the platelets run sl +34789|1178|15|5|13|14029.21|0.10|0.07|N|O|1996-12-13|1996-12-01|1996-12-23|COLLECT COD|FOB|es? accounts haggle fluffily. +34789|903|4|6|6|10823.40|0.00|0.00|N|O|1996-12-12|1996-12-21|1997-01-11|NONE|FOB| deposits a +34789|739|40|7|48|78707.04|0.03|0.06|N|O|1996-10-28|1996-12-22|1996-11-01|NONE|AIR|kages believe foxes. slyly expres +34790|1318|33|1|48|58526.88|0.04|0.01|N|O|1998-04-13|1998-01-29|1998-05-11|DELIVER IN PERSON|RAIL|ular accounts around the +34790|1882|69|2|31|55300.28|0.06|0.03|N|O|1998-03-25|1998-01-20|1998-04-09|DELIVER IN PERSON|MAIL|nal theodolites. slyly regular fo +34790|644|38|3|40|61785.60|0.02|0.03|N|O|1998-02-27|1998-02-15|1998-03-03|DELIVER IN PERSON|SHIP|ely regular instructions wake +34790|401|2|4|2|2602.80|0.10|0.00|N|O|1998-02-13|1998-03-04|1998-03-04|TAKE BACK RETURN|RAIL|al requests solve +34790|1398|99|5|3|3898.17|0.05|0.07|N|O|1998-02-13|1998-02-05|1998-03-04|TAKE BACK RETURN|RAIL|posits after the furiou +34790|412|13|6|4|5249.64|0.01|0.08|N|O|1998-03-14|1998-01-12|1998-03-20|DELIVER IN PERSON|REG AIR|cajole alongside of the b +34790|1329|68|7|37|45521.84|0.03|0.04|N|O|1998-04-11|1998-02-19|1998-04-30|DELIVER IN PERSON|AIR|losely. quickly final ac +34791|1375|90|1|21|26803.77|0.10|0.07|A|F|1995-05-18|1995-07-31|1995-06-17|TAKE BACK RETURN|REG AIR|ly ironic ideas haggle abo +34791|1191|64|2|30|32765.70|0.00|0.08|N|O|1995-07-04|1995-06-13|1995-07-18|NONE|SHIP|ar accounts haggle furiously ca +34791|1038|39|3|16|15024.48|0.01|0.05|N|F|1995-06-14|1995-08-04|1995-07-02|TAKE BACK RETURN|TRUCK|ts doubt among the f +34791|547|38|4|38|55006.52|0.08|0.02|N|O|1995-08-18|1995-07-01|1995-09-04|NONE|REG AIR|beans haggle furiously e +34791|1111|12|5|41|41496.51|0.06|0.06|N|O|1995-08-24|1995-06-18|1995-09-04|DELIVER IN PERSON|SHIP|es cajole quickly furiousl +34791|273|1|6|15|17599.05|0.06|0.06|N|O|1995-08-13|1995-06-22|1995-08-29|NONE|RAIL| packages use express a +34791|1699|100|7|8|12805.52|0.00|0.05|N|O|1995-07-26|1995-06-09|1995-08-18|TAKE BACK RETURN|SHIP|. quickly ironic foxes lose bli +34816|293|75|1|23|27445.67|0.04|0.05|R|F|1994-02-14|1993-12-24|1994-03-07|DELIVER IN PERSON|FOB|h furiously alongside of the sl +34816|1915|48|2|18|32704.38|0.09|0.05|A|F|1994-01-19|1994-01-07|1994-02-10|TAKE BACK RETURN|SHIP|uickly regular deposits wak +34816|165|92|3|35|37280.60|0.04|0.03|R|F|1993-12-09|1993-12-20|1993-12-31|TAKE BACK RETURN|FOB|doggedly. fu +34816|737|2|4|6|9826.38|0.03|0.05|A|F|1994-02-03|1993-12-09|1994-02-23|DELIVER IN PERSON|MAIL|. bold, fina +34816|406|94|5|10|13064.00|0.09|0.07|A|F|1994-01-18|1993-12-21|1994-02-13|COLLECT COD|AIR|ndencies. fluffy, express dep +34817|1820|21|1|3|5165.46|0.08|0.06|R|F|1994-04-17|1994-06-22|1994-05-14|DELIVER IN PERSON|RAIL|. slyly even ideas +34817|1094|30|2|10|9950.90|0.01|0.03|R|F|1994-06-02|1994-07-10|1994-06-23|DELIVER IN PERSON|REG AIR|ove the carefully pending r +34818|422|81|1|35|46284.70|0.02|0.07|N|O|1996-03-13|1996-04-24|1996-03-24|TAKE BACK RETURN|FOB|s ought to x-ray carefully car +34818|827|28|2|30|51834.60|0.09|0.08|N|O|1996-04-24|1996-04-30|1996-05-06|DELIVER IN PERSON|REG AIR| furiously pending requests. +34818|1291|29|3|22|26230.38|0.03|0.04|N|O|1996-06-20|1996-05-06|1996-06-30|COLLECT COD|REG AIR|unusual dolphins are quickly about +34818|1706|33|4|34|54661.80|0.07|0.04|N|O|1996-04-27|1996-03-23|1996-05-10|NONE|AIR|l accounts about the bol +34818|772|37|5|23|38473.71|0.01|0.04|N|O|1996-06-04|1996-05-10|1996-06-20|NONE|TRUCK|counts are along the furious +34818|870|4|6|5|8854.35|0.08|0.00|N|O|1996-03-23|1996-05-10|1996-04-21|COLLECT COD|RAIL|fully pending accounts hinder pendin +34818|1507|8|7|4|5634.00|0.07|0.02|N|O|1996-03-30|1996-04-07|1996-04-12|TAKE BACK RETURN|REG AIR|the finally r +34819|891|91|1|8|14335.12|0.02|0.08|N|O|1998-01-14|1998-02-26|1998-01-16|NONE|TRUCK| dolphins sleep sly +34819|1217|92|2|3|3354.63|0.00|0.04|N|O|1998-01-16|1998-02-28|1998-01-23|COLLECT COD|RAIL|e regular, unusual +34819|915|50|3|12|21790.92|0.02|0.03|N|O|1998-02-11|1998-01-17|1998-03-08|DELIVER IN PERSON|TRUCK|y express accounts snooze along +34819|122|49|4|10|10221.20|0.03|0.05|N|O|1998-03-17|1998-01-27|1998-03-21|DELIVER IN PERSON|RAIL|uriously even ideas. furiously +34820|241|42|1|20|22824.80|0.08|0.08|A|F|1993-09-09|1993-08-06|1993-09-11|TAKE BACK RETURN|TRUCK|gular requests sleep slyly after +34820|1338|53|2|5|6196.65|0.08|0.00|A|F|1993-06-15|1993-08-05|1993-06-20|TAKE BACK RETURN|SHIP|es use carefully blithely even dolphins. +34821|1581|82|1|12|17790.96|0.05|0.00|A|F|1993-08-24|1993-10-16|1993-09-23|DELIVER IN PERSON|MAIL|press sentiments. carefully reg +34821|400|57|2|47|61118.80|0.02|0.05|A|F|1993-08-28|1993-10-22|1993-09-04|DELIVER IN PERSON|MAIL|to the furiously ironi +34821|1885|29|3|17|30376.96|0.00|0.05|R|F|1993-10-08|1993-10-29|1993-10-20|TAKE BACK RETURN|MAIL|ely pending waters nag slyly upon the bl +34821|741|74|4|47|77161.78|0.01|0.05|A|F|1993-10-06|1993-10-15|1993-10-10|TAKE BACK RETURN|RAIL|t the quickly special foxes +34821|566|67|5|19|27864.64|0.01|0.00|R|F|1993-12-05|1993-10-12|1993-12-26|COLLECT COD|FOB|quickly along t +34821|923|58|6|49|89372.08|0.05|0.00|A|F|1993-09-07|1993-10-08|1993-09-12|TAKE BACK RETURN|REG AIR|its nag slyly. slyly special requ +34822|569|30|1|46|67599.76|0.04|0.07|A|F|1992-08-02|1992-09-24|1992-08-22|COLLECT COD|SHIP|ly express requests. regular acco +34822|224|6|2|31|34850.82|0.08|0.03|R|F|1992-08-01|1992-10-02|1992-08-09|COLLECT COD|SHIP|ructions. blithel +34822|1834|21|3|6|10414.98|0.07|0.00|R|F|1992-08-18|1992-08-11|1992-09-09|NONE|TRUCK|gular accounts wake +34822|1773|16|4|49|82063.73|0.01|0.08|A|F|1992-08-29|1992-08-22|1992-08-30|DELIVER IN PERSON|FOB| special packages unwind final gifts. q +34822|189|68|5|42|45745.56|0.02|0.00|R|F|1992-10-30|1992-09-28|1992-11-02|TAKE BACK RETURN|REG AIR|ts haggle furiously final foxes. boldl +34823|344|1|1|29|36085.86|0.00|0.06|A|F|1993-12-06|1993-11-17|1993-12-17|TAKE BACK RETURN|RAIL|e always final deposits. permanent, ruthle +34823|364|21|2|33|41723.88|0.09|0.08|R|F|1994-01-23|1993-11-21|1994-02-10|TAKE BACK RETURN|RAIL|ronically f +34823|1847|48|3|10|17488.40|0.09|0.08|A|F|1993-11-07|1993-12-24|1993-11-08|COLLECT COD|MAIL|haggle furiously. blithely even +34848|418|6|1|44|58010.04|0.02|0.01|N|O|1997-02-24|1997-04-17|1997-03-14|TAKE BACK RETURN|REG AIR|nt stealth +34848|1042|13|2|45|42436.80|0.06|0.07|N|O|1997-03-24|1997-03-26|1997-03-29|DELIVER IN PERSON|RAIL|y slow requests breach quiet, +34848|1247|85|3|39|44781.36|0.03|0.07|N|O|1997-05-18|1997-05-04|1997-06-05|NONE|RAIL|ong the ironic, regular sauter +34848|1787|30|4|9|15199.02|0.06|0.08|N|O|1997-03-20|1997-04-15|1997-04-12|DELIVER IN PERSON|TRUCK|ffily brave packages cajo +34848|1634|76|5|29|44533.27|0.09|0.04|N|O|1997-03-04|1997-04-21|1997-03-19|COLLECT COD|FOB|r dependencies use blithe +34848|516|77|6|35|49577.85|0.02|0.00|N|O|1997-03-20|1997-05-11|1997-03-21|DELIVER IN PERSON|RAIL|c accounts. accounts ca +34849|1588|69|1|15|22343.70|0.04|0.00|A|F|1994-01-13|1993-12-23|1994-02-01|DELIVER IN PERSON|MAIL|arly against the carefull +34849|750|15|2|49|80886.75|0.03|0.04|R|F|1993-10-31|1993-11-20|1993-11-27|DELIVER IN PERSON|REG AIR|arefully regular pinto bean +34849|1573|94|3|36|53084.52|0.03|0.04|A|F|1993-12-17|1993-12-28|1993-12-30|DELIVER IN PERSON|RAIL|about the carefully enticing request +34849|1563|84|4|32|46865.92|0.07|0.08|A|F|1994-01-21|1993-12-17|1994-02-16|TAKE BACK RETURN|RAIL|inal ideas. +34849|202|3|5|50|55110.00|0.09|0.00|A|F|1994-01-15|1993-12-13|1994-02-07|COLLECT COD|AIR|ithely bold deposits c +34849|1148|57|6|7|7343.98|0.01|0.06|A|F|1993-12-07|1993-12-01|1993-12-20|NONE|RAIL|es. fluffily ironic requests +34849|1373|50|7|47|59895.39|0.09|0.04|A|F|1994-02-03|1994-01-07|1994-02-13|DELIVER IN PERSON|FOB| deposits. slyly even asymptotes am +34850|1809|39|1|31|53034.80|0.03|0.08|A|F|1993-08-27|1993-10-15|1993-09-19|TAKE BACK RETURN|FOB|lar dependencies. furiously silent +34850|1978|79|2|13|24439.61|0.08|0.08|R|F|1993-10-14|1993-11-04|1993-10-18|DELIVER IN PERSON|RAIL|oxes sleep care +34851|857|58|1|20|35157.00|0.00|0.05|A|F|1992-12-17|1992-12-17|1992-12-26|COLLECT COD|AIR|dle carefully furiously +34851|467|97|2|22|30084.12|0.04|0.03|A|F|1993-02-03|1992-12-08|1993-02-07|COLLECT COD|MAIL|c requests. blithely regular platelets ca +34852|279|7|1|25|29481.75|0.08|0.08|A|F|1992-09-20|1992-11-26|1992-10-08|NONE|TRUCK|egular excuses haggle blith +34852|1155|92|2|50|52807.50|0.10|0.01|A|F|1992-10-14|1992-11-22|1992-10-30|COLLECT COD|MAIL|ress deposits dazzle regul +34852|48|49|3|16|15168.64|0.09|0.01|R|F|1992-09-07|1992-11-29|1992-09-12|TAKE BACK RETURN|RAIL| the bravely pending instructions. carefu +34852|647|48|4|16|24762.24|0.07|0.02|A|F|1992-12-17|1992-12-01|1993-01-02|TAKE BACK RETURN|REG AIR| deposits again +34853|1699|23|1|15|24010.35|0.07|0.07|N|O|1996-01-23|1995-11-24|1996-02-03|COLLECT COD|RAIL|g the instructions cajo +34853|602|34|2|22|33057.20|0.10|0.01|N|O|1995-12-19|1995-12-13|1996-01-07|NONE|AIR|ing to the silen +34853|1905|50|3|40|72276.00|0.06|0.01|N|O|1995-11-10|1995-12-14|1995-11-17|NONE|SHIP|ns sleep s +34853|570|71|4|30|44117.10|0.07|0.06|N|O|1995-11-07|1995-11-11|1995-11-24|COLLECT COD|MAIL|ts wake evenly ev +34853|1284|22|5|34|40299.52|0.01|0.06|N|O|1995-10-27|1995-12-26|1995-11-25|TAKE BACK RETURN|SHIP|ns use according to the ironic packages. b +34854|1087|58|1|45|44463.60|0.08|0.08|R|F|1995-03-15|1995-02-10|1995-03-22|COLLECT COD|MAIL|requests use pen +34854|405|93|2|7|9137.80|0.07|0.04|A|F|1995-01-17|1995-01-25|1995-02-04|NONE|REG AIR|tructions. pending reques +34854|225|53|3|19|21379.18|0.05|0.04|A|F|1994-12-07|1994-12-17|1994-12-29|TAKE BACK RETURN|FOB|s: slyly ironic pinto beans +34855|1658|41|1|13|20275.45|0.02|0.03|R|F|1994-03-31|1994-05-07|1994-04-29|COLLECT COD|TRUCK|odolites. blithely ironic c +34855|109|36|2|18|18163.80|0.02|0.08|A|F|1994-04-17|1994-06-23|1994-05-07|DELIVER IN PERSON|FOB|ng the instructions. regu +34855|1642|43|3|46|71007.44|0.05|0.00|R|F|1994-04-13|1994-05-27|1994-04-25|TAKE BACK RETURN|REG AIR|tithes are evenly ag +34855|1637|38|4|4|6154.52|0.02|0.06|A|F|1994-06-02|1994-05-01|1994-06-18|DELIVER IN PERSON|SHIP|ages. ironically even deposits alo +34880|286|14|1|14|16607.92|0.07|0.00|R|F|1994-09-29|1994-10-29|1994-10-04|NONE|RAIL|accounts cajole e +34880|1463|64|2|27|36840.42|0.02|0.08|R|F|1994-09-27|1994-11-09|1994-10-16|COLLECT COD|AIR|rts. furiously b +34880|132|33|3|3|3096.39|0.08|0.02|R|F|1994-09-30|1994-12-09|1994-10-16|NONE|SHIP|uietly bold pinto beans haggle after the +34880|387|16|4|34|43770.92|0.07|0.07|A|F|1995-01-07|1994-11-11|1995-01-15|COLLECT COD|MAIL|thely ironic accounts. furiously u +34881|1508|29|1|36|50742.00|0.00|0.06|A|F|1995-05-02|1995-04-22|1995-05-04|COLLECT COD|TRUCK|y enticingly unusual theodolite +34881|1402|81|2|12|15640.80|0.02|0.01|A|F|1995-02-28|1995-03-18|1995-03-19|NONE|AIR|uests according to the slyly sly reque +34881|825|26|3|42|72484.44|0.07|0.01|A|F|1995-02-10|1995-04-07|1995-03-10|NONE|MAIL| play carefully i +34881|1215|53|4|32|35718.72|0.05|0.03|A|F|1995-04-26|1995-05-08|1995-05-04|TAKE BACK RETURN|RAIL|l packages. fluffily special id +34881|1058|29|5|43|41239.15|0.09|0.03|R|F|1995-04-01|1995-03-13|1995-04-29|NONE|RAIL|y regular pinto beans. slyly unus +34881|472|60|6|38|52153.86|0.03|0.02|A|F|1995-04-16|1995-03-28|1995-04-21|DELIVER IN PERSON|REG AIR|nt excuses aft +34882|589|20|1|43|64051.94|0.05|0.04|R|F|1994-08-31|1994-09-20|1994-09-24|TAKE BACK RETURN|FOB|ss across the bold depos +34882|978|81|2|45|84553.65|0.00|0.04|R|F|1994-10-21|1994-10-07|1994-11-03|DELIVER IN PERSON|SHIP|ly unusual tithes. permanently unusual inst +34882|1538|39|3|34|48944.02|0.03|0.02|R|F|1994-11-10|1994-08-29|1994-11-20|COLLECT COD|SHIP|e the quickly ironic packages was fl +34883|679|42|1|13|20535.71|0.07|0.00|A|F|1995-02-25|1995-01-15|1995-03-22|DELIVER IN PERSON|AIR| deposits. regular packages s +34883|1216|91|2|1|1117.21|0.03|0.01|R|F|1995-03-06|1994-12-23|1995-03-20|TAKE BACK RETURN|MAIL|l asymptotes. furiously regular +34883|420|79|3|33|43573.86|0.06|0.05|A|F|1995-01-27|1995-01-27|1995-02-18|COLLECT COD|SHIP|long the sometimes ironic dinos. final foxe +34883|183|10|4|44|47659.92|0.10|0.07|A|F|1995-01-09|1995-01-10|1995-01-12|NONE|RAIL|onic instructions. furiously even dep +34883|533|94|5|25|35838.25|0.05|0.04|R|F|1994-11-16|1994-12-21|1994-12-10|NONE|MAIL|ntly daring theod +34883|1853|97|6|21|36851.85|0.09|0.07|A|F|1995-01-27|1995-01-08|1995-02-04|TAKE BACK RETURN|FOB| use quickly +34884|186|87|1|1|1086.18|0.08|0.07|N|O|1997-01-05|1997-01-10|1997-01-15|COLLECT COD|MAIL|cies wake along the fluffily bold packages. +34884|1267|68|2|12|14019.12|0.10|0.01|N|O|1997-01-08|1997-02-15|1997-01-30|COLLECT COD|FOB|the final foxes. fluffily special sauternes +34884|1501|42|3|42|58905.00|0.09|0.08|N|O|1997-03-20|1997-01-20|1997-03-28|DELIVER IN PERSON|TRUCK|ts are blithel +34884|1383|84|4|13|16696.94|0.00|0.04|N|O|1997-04-01|1997-03-05|1997-04-21|DELIVER IN PERSON|TRUCK|accounts above the fur +34884|1959|4|5|15|27914.25|0.03|0.05|N|O|1997-01-13|1997-02-03|1997-01-27|TAKE BACK RETURN|SHIP|ckages wake car +34884|289|17|6|3|3567.84|0.01|0.01|N|O|1997-01-31|1997-03-05|1997-02-06|TAKE BACK RETURN|REG AIR|lyly. blithely regular accounts h +34885|1488|89|1|14|19452.72|0.00|0.01|N|O|1997-06-18|1997-07-14|1997-06-22|COLLECT COD|TRUCK|y. fluffily even +34885|477|65|2|10|13774.70|0.02|0.06|N|O|1997-08-30|1997-07-22|1997-09-01|DELIVER IN PERSON|FOB| instructions +34885|538|69|3|9|12946.77|0.02|0.01|N|O|1997-07-11|1997-07-14|1997-07-31|NONE|FOB|ithely. furiously ironic dep +34886|977|12|1|26|48827.22|0.09|0.07|N|O|1998-06-24|1998-08-04|1998-07-21|TAKE BACK RETURN|FOB|ular account +34887|638|1|1|2|3077.26|0.08|0.07|N|O|1998-01-31|1998-04-04|1998-02-26|COLLECT COD|MAIL|y bold accounts n +34912|8|9|1|31|28148.00|0.00|0.00|A|F|1992-04-06|1992-03-31|1992-04-16|DELIVER IN PERSON|REG AIR|usly regular +34913|1061|67|1|45|43292.70|0.06|0.02|N|O|1996-02-01|1996-01-07|1996-02-06|COLLECT COD|TRUCK|s boost carefully regular, pending pa +34913|1484|63|2|21|29095.08|0.06|0.06|N|O|1996-01-05|1996-02-20|1996-01-26|TAKE BACK RETURN|MAIL|ets sleep careful +34914|299|27|1|14|16790.06|0.08|0.02|N|O|1997-11-22|1997-11-30|1997-12-10|NONE|MAIL| the boldly final courts. fu +34914|1241|16|2|48|54827.52|0.09|0.04|N|O|1997-09-29|1997-12-07|1997-10-29|TAKE BACK RETURN|RAIL| at the furiously regular a +34914|425|26|3|19|25182.98|0.10|0.04|N|O|1997-11-10|1997-11-23|1997-11-18|DELIVER IN PERSON|RAIL|g pinto beans promise furiously re +34914|680|74|4|37|58485.16|0.04|0.01|N|O|1997-11-05|1997-12-01|1997-11-26|TAKE BACK RETURN|SHIP|e above the quickly final foxes. ideas int +34914|1331|46|5|42|51757.86|0.02|0.07|N|O|1997-11-25|1997-11-05|1997-12-09|DELIVER IN PERSON|REG AIR|ages are packages. quickly unusual foxes +34915|1524|45|1|46|65573.92|0.10|0.07|A|F|1994-12-25|1994-11-02|1995-01-11|TAKE BACK RETURN|FOB|nto beans are after the +34916|367|52|1|31|39288.16|0.04|0.08|R|F|1993-11-07|1993-09-29|1993-11-08|COLLECT COD|SHIP| bold packages. furiously special packa +34917|1924|13|1|31|56603.52|0.05|0.01|N|O|1995-12-25|1995-12-28|1996-01-17|COLLECT COD|RAIL|s wake carefully. even accounts s +34918|914|49|1|10|18149.10|0.06|0.03|R|F|1995-02-05|1995-01-10|1995-02-19|DELIVER IN PERSON|MAIL|ffy escapades wake according to the bold pa +34918|1890|91|2|25|44797.25|0.02|0.05|R|F|1994-12-09|1995-01-19|1994-12-16|DELIVER IN PERSON|MAIL|he quickly bold packages; un +34918|1248|86|3|32|36775.68|0.05|0.04|A|F|1995-01-05|1995-01-10|1995-01-17|NONE|SHIP|wake slyly. eve +34918|309|10|4|26|31441.80|0.08|0.01|R|F|1995-01-14|1995-01-12|1995-01-17|COLLECT COD|AIR|boost final asymptote +34918|1591|92|5|29|43285.11|0.07|0.02|R|F|1995-02-22|1995-01-04|1995-03-20|TAKE BACK RETURN|MAIL|the fluffily brave p +34918|609|10|6|35|52836.00|0.02|0.05|R|F|1994-12-30|1994-12-01|1995-01-09|NONE|MAIL|into beans. unusual instructions serve fur +34918|669|63|7|24|37671.84|0.01|0.05|R|F|1995-01-03|1994-12-19|1995-01-12|NONE|FOB|integrate carefully carefully +34919|1678|2|1|49|77403.83|0.09|0.05|N|O|1996-11-21|1996-10-12|1996-11-30|TAKE BACK RETURN|AIR|orbits: requ +34919|580|71|2|30|44417.40|0.07|0.06|N|O|1996-10-27|1996-10-16|1996-11-05|COLLECT COD|SHIP|ronic ideas. unusual, final packag +34919|1878|22|3|13|23138.31|0.01|0.03|N|O|1996-09-28|1996-09-20|1996-10-05|COLLECT COD|AIR|hely express requ +34944|459|89|1|45|61175.25|0.02|0.01|N|O|1998-05-13|1998-04-28|1998-05-18|TAKE BACK RETURN|REG AIR|ding accounts. regular, pending +34945|1144|53|1|40|41805.60|0.06|0.08|N|O|1998-07-25|1998-05-30|1998-08-02|NONE|SHIP|e the carefully special deposits +34945|1723|8|2|45|73112.40|0.00|0.02|N|O|1998-07-30|1998-05-14|1998-08-07|NONE|RAIL|ely unusual courts wake fluffily acco +34945|8|9|3|40|36320.00|0.03|0.06|N|O|1998-04-26|1998-05-29|1998-04-27|TAKE BACK RETURN|TRUCK|ar, silent Tiresias +34945|1274|49|4|38|44660.26|0.03|0.01|N|O|1998-07-04|1998-05-10|1998-07-15|TAKE BACK RETURN|TRUCK|dependencies. regular req +34945|1946|47|5|1|1847.94|0.07|0.07|N|O|1998-05-03|1998-05-31|1998-06-02|DELIVER IN PERSON|REG AIR|ans print fluffily bold +34945|34|35|6|28|26152.84|0.07|0.03|N|O|1998-07-23|1998-06-20|1998-08-16|DELIVER IN PERSON|AIR|ding braids. furio +34946|510|41|1|21|29620.71|0.06|0.04|N|O|1998-07-18|1998-06-23|1998-08-16|DELIVER IN PERSON|TRUCK|l somas sleep ironic pack +34946|94|70|2|19|18887.71|0.04|0.04|N|O|1998-08-02|1998-07-18|1998-08-14|TAKE BACK RETURN|RAIL|o beans nag furiously slyly un +34947|149|76|1|1|1049.14|0.01|0.07|N|O|1996-10-27|1996-09-26|1996-11-23|NONE|SHIP|ly silent reque +34947|677|78|2|50|78883.50|0.04|0.07|N|O|1996-10-24|1996-10-01|1996-11-14|NONE|AIR| the packages. even platel +34947|1957|58|3|39|72499.05|0.03|0.01|N|O|1996-09-01|1996-08-10|1996-09-19|TAKE BACK RETURN|FOB|fluffily fin +34947|1201|13|4|29|31963.80|0.10|0.01|N|O|1996-10-23|1996-08-31|1996-10-25|NONE|REG AIR|ld waters boost +34947|452|40|5|10|13524.50|0.09|0.02|N|O|1996-10-24|1996-10-02|1996-11-14|NONE|FOB|ully ironic asymptotes. +34947|57|33|6|46|44024.30|0.06|0.07|N|O|1996-08-06|1996-09-30|1996-08-15|NONE|REG AIR|ns cajole sometimes. slyly regula +34947|1002|3|7|35|31605.00|0.05|0.01|N|O|1996-08-20|1996-09-27|1996-08-24|NONE|FOB|ts wake carefully furious accounts. special +34948|658|21|1|31|48318.15|0.07|0.07|R|F|1993-02-13|1993-04-06|1993-03-11|COLLECT COD|REG AIR|ly regular grouches +34948|347|76|2|4|4989.36|0.10|0.01|R|F|1993-03-10|1993-03-21|1993-03-22|DELIVER IN PERSON|TRUCK|ffily ironic mul +34948|58|9|3|35|33531.75|0.00|0.07|R|F|1993-03-20|1993-04-06|1993-04-14|NONE|SHIP|y unusual instruc +34948|830|30|4|11|19039.13|0.08|0.03|A|F|1993-03-07|1993-02-20|1993-03-19|DELIVER IN PERSON|AIR| the accoun +34949|1019|90|1|49|45080.49|0.05|0.08|R|F|1994-03-05|1994-01-26|1994-03-24|COLLECT COD|REG AIR|an use blithely ins +34949|931|32|2|27|49462.11|0.05|0.06|A|F|1993-12-30|1994-02-18|1994-01-16|TAKE BACK RETURN|SHIP|express instruc +34950|1205|43|1|29|32079.80|0.03|0.07|N|O|1996-11-15|1996-12-06|1996-11-27|TAKE BACK RETURN|SHIP|uests cajole furiou +34950|453|54|2|41|55491.45|0.01|0.01|N|O|1996-10-06|1996-10-31|1996-10-18|COLLECT COD|MAIL|blithely final waters! carefull +34950|57|8|3|13|12441.65|0.06|0.07|N|O|1996-12-11|1996-11-10|1997-01-01|TAKE BACK RETURN|REG AIR|s: ironic asymptotes are fu +34950|1132|69|4|36|37192.68|0.10|0.07|N|O|1996-10-01|1996-11-22|1996-10-25|TAKE BACK RETURN|FOB| of the ir +34950|1514|95|5|39|55204.89|0.01|0.02|N|O|1996-11-19|1996-11-30|1996-12-14|COLLECT COD|FOB|out the carefu +34951|363|20|1|50|63168.00|0.06|0.04|N|O|1996-06-09|1996-07-29|1996-06-24|DELIVER IN PERSON|AIR|y unusual depos +34951|1719|62|2|32|51862.72|0.05|0.02|N|O|1996-09-18|1996-07-29|1996-09-23|NONE|REG AIR| even foxes: furi +34951|950|53|3|29|53677.55|0.01|0.08|N|O|1996-06-06|1996-07-08|1996-07-05|TAKE BACK RETURN|RAIL|nto beans kindle carefully among th +34976|1768|11|1|29|48423.04|0.04|0.08|R|F|1992-12-14|1993-02-09|1993-01-07|DELIVER IN PERSON|RAIL|less instructions wake. r +34976|838|39|2|15|26082.45|0.00|0.05|R|F|1992-11-27|1993-01-17|1992-12-25|COLLECT COD|REG AIR|he slyly special reques +34976|1179|88|3|27|29164.59|0.02|0.03|A|F|1993-01-16|1993-01-11|1993-02-07|NONE|MAIL|even deposits was. regula +34976|1570|51|4|23|33846.11|0.09|0.05|R|F|1993-01-11|1993-01-12|1993-01-18|TAKE BACK RETURN|REG AIR|y regular pinto beans. packages wake ins +34976|747|80|5|6|9886.44|0.02|0.06|R|F|1993-02-11|1993-01-05|1993-03-12|TAKE BACK RETURN|MAIL|y silent deposits boost about the silen +34976|1065|71|6|45|43472.70|0.08|0.05|A|F|1993-01-17|1993-02-04|1993-01-27|DELIVER IN PERSON|AIR|s haggle dependen +34976|1474|75|7|49|67398.03|0.02|0.04|A|F|1993-02-14|1993-01-22|1993-03-13|COLLECT COD|SHIP|lar platelets wake against th +34977|1717|44|1|21|33992.91|0.05|0.00|R|F|1994-01-17|1993-11-23|1994-02-03|DELIVER IN PERSON|RAIL|deposits sleep blithe +34977|1292|30|2|24|28638.96|0.03|0.03|A|F|1994-01-19|1993-12-18|1994-01-30|NONE|FOB|ickly bold +34977|1912|1|3|39|70742.49|0.02|0.08|A|F|1993-12-28|1993-11-26|1994-01-16|COLLECT COD|SHIP|ole blithely. +34978|1919|64|1|30|54627.30|0.09|0.03|A|F|1995-03-12|1995-04-19|1995-03-20|DELIVER IN PERSON|MAIL| packages. pending theodolites +34978|1292|67|2|42|50118.18|0.01|0.03|R|F|1995-05-16|1995-03-31|1995-05-31|COLLECT COD|AIR|ly regular foxe +34978|1909|98|3|7|12676.30|0.00|0.00|A|F|1995-03-17|1995-04-05|1995-04-01|TAKE BACK RETURN|MAIL|ironic accounts boost furiousl +34978|396|97|4|48|62226.72|0.01|0.01|A|F|1995-03-04|1995-05-05|1995-04-03|COLLECT COD|FOB|gle furiously above the furiously sile +34978|1848|49|5|37|64744.08|0.01|0.06|A|F|1995-04-15|1995-04-26|1995-05-13|NONE|MAIL|y blithely bold pinto beans. furious +34978|1902|35|6|34|61332.60|0.06|0.03|A|F|1995-03-04|1995-05-03|1995-03-15|COLLECT COD|FOB|to the quiet acc +34978|1597|98|7|16|23977.44|0.00|0.03|A|F|1995-04-06|1995-04-23|1995-05-02|DELIVER IN PERSON|MAIL| blithely special du +34979|452|11|1|48|64917.60|0.05|0.08|A|F|1994-01-21|1993-10-30|1994-01-28|COLLECT COD|REG AIR|dle fluffily across the iron +34979|781|82|2|44|73998.32|0.01|0.06|R|F|1993-12-27|1993-11-13|1994-01-22|NONE|FOB|nal pinto be +34980|151|78|1|15|15767.25|0.05|0.06|A|F|1993-08-13|1993-10-25|1993-08-21|TAKE BACK RETURN|MAIL|s requests sleep above the deposits. sly +34980|1707|34|2|6|9652.20|0.08|0.00|A|F|1993-11-09|1993-10-08|1993-11-20|COLLECT COD|SHIP|fter the b +34980|615|47|3|27|40921.47|0.09|0.08|R|F|1993-11-23|1993-10-09|1993-12-21|DELIVER IN PERSON|TRUCK| ironic ideas. dependencies mold b +34980|1274|75|4|3|3525.81|0.04|0.05|A|F|1993-08-11|1993-10-25|1993-08-17|NONE|FOB| requests. ironic ideas print furiously +34980|1701|2|5|45|72121.50|0.10|0.01|R|F|1993-11-01|1993-10-24|1993-12-01|DELIVER IN PERSON|AIR|symptotes grow never silently +34980|1338|15|6|9|11153.97|0.07|0.01|R|F|1993-11-17|1993-09-18|1993-12-07|TAKE BACK RETURN|AIR|tructions. ironic ideas t +34981|1008|79|1|49|44541.00|0.00|0.02|N|O|1996-06-10|1996-07-02|1996-06-16|COLLECT COD|MAIL| regular accounts amon +34981|1683|66|2|32|50709.76|0.10|0.07|N|O|1996-04-09|1996-07-02|1996-04-26|DELIVER IN PERSON|FOB|even theodolites boost carefully i +34981|1182|55|3|16|17330.88|0.06|0.08|N|O|1996-04-29|1996-06-24|1996-05-29|DELIVER IN PERSON|MAIL|egular theodolites about the final accoun +34981|480|39|4|49|67643.52|0.08|0.01|N|O|1996-04-16|1996-06-16|1996-05-01|COLLECT COD|AIR|ke about the special foxes. carefully fin +34981|30|6|5|11|10230.33|0.00|0.06|N|O|1996-05-13|1996-06-27|1996-06-12|NONE|AIR|egular somas! even requests boost +34981|410|69|6|2|2620.82|0.05|0.03|N|O|1996-05-03|1996-06-09|1996-05-18|NONE|AIR| regular pains around the carefu +34981|221|22|7|29|32515.38|0.06|0.04|N|O|1996-06-12|1996-05-12|1996-06-19|NONE|AIR|oubt blith +34982|912|15|1|36|65264.76|0.10|0.08|R|F|1992-09-10|1992-11-07|1992-10-01|COLLECT COD|AIR|deposits. pac +34983|217|18|1|47|52508.87|0.03|0.03|N|O|1997-07-18|1997-05-23|1997-08-09|NONE|FOB|lly ironic deposits. fluffily final pi +35008|508|99|1|48|67608.00|0.10|0.04|A|F|1992-08-01|1992-06-16|1992-08-03|COLLECT COD|TRUCK|s use furiously a +35008|1251|63|2|26|29958.50|0.03|0.02|R|F|1992-07-18|1992-07-26|1992-07-30|DELIVER IN PERSON|FOB|ly even theodolites. final pa +35008|1616|40|3|47|71327.67|0.08|0.02|A|F|1992-05-10|1992-07-03|1992-05-25|COLLECT COD|FOB|gle slyly carefu +35008|467|97|4|48|65638.08|0.05|0.00|R|F|1992-07-17|1992-07-03|1992-08-14|DELIVER IN PERSON|MAIL|dependencies. quickly silent +35008|1273|48|5|36|42273.72|0.04|0.04|A|F|1992-06-30|1992-06-25|1992-07-14|TAKE BACK RETURN|AIR|ites after the furiously final +35009|776|9|1|14|23474.78|0.09|0.08|N|O|1998-04-03|1998-05-31|1998-04-21|COLLECT COD|RAIL|s. never special deposits cajole ab +35009|349|50|2|44|54970.96|0.00|0.03|N|O|1998-06-05|1998-06-02|1998-07-05|TAKE BACK RETURN|TRUCK| around the packages doze alongs +35009|1341|56|3|33|40997.22|0.00|0.08|N|O|1998-06-04|1998-06-03|1998-06-30|DELIVER IN PERSON|RAIL|cajole quickly according to the blithely +35009|276|77|4|12|14115.24|0.00|0.08|N|O|1998-05-03|1998-05-09|1998-05-08|TAKE BACK RETURN|TRUCK|ze carefully regu +35009|982|83|5|48|90383.04|0.00|0.03|N|O|1998-07-07|1998-05-21|1998-07-12|NONE|MAIL|ges along the ideas wake expr +35010|136|15|1|11|11397.43|0.07|0.04|N|O|1998-03-08|1998-02-22|1998-03-23|COLLECT COD|RAIL|as unwind blithely abou +35011|164|17|1|5|5320.80|0.00|0.06|R|F|1992-12-28|1993-03-06|1993-01-13|COLLECT COD|TRUCK|thely fina +35011|649|43|2|25|38741.00|0.08|0.07|A|F|1992-12-22|1993-02-05|1993-01-15|NONE|REG AIR| pending requests cajole furiously. caref +35012|939|42|1|42|77277.06|0.06|0.06|R|F|1992-08-03|1992-08-09|1992-08-30|COLLECT COD|REG AIR|ges haggle carefully. ironic +35012|494|95|2|14|19522.86|0.07|0.07|A|F|1992-07-25|1992-07-18|1992-08-20|DELIVER IN PERSON|RAIL|hinly special deposits. reg +35012|1812|42|3|31|53128.11|0.10|0.02|A|F|1992-08-05|1992-07-18|1992-08-09|TAKE BACK RETURN|MAIL|ess accounts. slyly final requests +35012|1235|10|4|18|20452.14|0.04|0.05|A|F|1992-07-23|1992-07-31|1992-07-25|TAKE BACK RETURN|MAIL|nto beans. special asymptotes boost furi +35012|386|87|5|21|27013.98|0.03|0.03|A|F|1992-07-10|1992-08-09|1992-08-06|DELIVER IN PERSON|AIR|ress requests. close pinto b +35013|441|100|1|34|45608.96|0.10|0.07|N|O|1998-01-06|1998-01-06|1998-01-24|DELIVER IN PERSON|MAIL| regular accounts solve +35013|227|9|2|42|47343.24|0.03|0.00|N|O|1997-11-21|1997-12-15|1997-12-06|COLLECT COD|REG AIR|, special deposits wake quickly alo +35013|1976|65|3|43|80752.71|0.10|0.04|N|O|1997-12-10|1998-01-21|1997-12-16|COLLECT COD|SHIP|icingly regular packages eat alongside of +35013|1215|90|4|11|12278.31|0.00|0.03|N|O|1998-01-03|1998-01-14|1998-01-10|TAKE BACK RETURN|REG AIR|sts are carefully. boldly unu +35013|577|8|5|45|66490.65|0.09|0.00|N|O|1998-02-09|1998-02-01|1998-02-20|NONE|TRUCK|uriously alongside of th +35013|840|40|6|35|60929.40|0.00|0.01|N|O|1997-12-15|1997-12-31|1997-12-21|DELIVER IN PERSON|MAIL|g blithely. excuses wake against +35013|1635|77|7|6|9219.78|0.02|0.03|N|O|1997-11-25|1997-12-24|1997-11-30|NONE|FOB|ilent asymptotes. fu +35014|1522|63|1|26|37011.52|0.04|0.03|R|F|1994-12-24|1994-12-05|1995-01-09|DELIVER IN PERSON|TRUCK|y express pint +35015|105|6|1|5|5025.50|0.02|0.02|N|O|1998-01-16|1998-02-09|1998-02-04|DELIVER IN PERSON|MAIL|kages boost blithely accordi +35015|388|89|2|7|9018.66|0.01|0.06|N|O|1998-03-22|1998-01-11|1998-04-07|COLLECT COD|SHIP|carefully regular platelets. bold p +35015|1864|94|3|27|47678.22|0.05|0.02|N|O|1997-11-28|1998-01-24|1997-12-26|TAKE BACK RETURN|SHIP|according to the pinto beans. sl +35040|438|39|1|47|62906.21|0.06|0.02|A|F|1992-07-24|1992-05-28|1992-08-08|NONE|FOB|eodolites in +35040|1489|29|2|21|29200.08|0.01|0.03|R|F|1992-07-06|1992-07-01|1992-07-21|COLLECT COD|TRUCK|ross the even a +35040|441|29|3|38|50974.72|0.07|0.08|R|F|1992-06-22|1992-06-04|1992-07-20|DELIVER IN PERSON|AIR|ending depend +35040|580|41|4|15|22208.70|0.09|0.08|R|F|1992-06-12|1992-07-15|1992-06-20|DELIVER IN PERSON|FOB| foxes cajole. carefully s +35041|687|19|1|50|79384.00|0.09|0.08|A|F|1994-07-12|1994-06-23|1994-08-10|COLLECT COD|TRUCK|he deposits; furiously f +35041|467|55|2|7|9572.22|0.08|0.07|R|F|1994-05-31|1994-07-06|1994-06-17|TAKE BACK RETURN|FOB|. carefully final instructions doub +35041|1200|9|3|45|49554.00|0.04|0.04|R|F|1994-05-10|1994-06-03|1994-05-24|DELIVER IN PERSON|RAIL|theodolites detect carefully special +35041|731|28|4|8|13053.84|0.10|0.07|A|F|1994-07-11|1994-06-12|1994-07-16|COLLECT COD|AIR|ites wake. pending, fin +35042|149|2|1|10|10491.40|0.10|0.08|R|F|1994-01-01|1994-03-01|1994-01-22|NONE|RAIL|es. special, bold asymptotes +35042|211|93|2|27|30002.67|0.09|0.00|A|F|1994-03-22|1994-02-18|1994-03-26|TAKE BACK RETURN|AIR|ounts wake: quickly unusual ideas haggle qu +35043|1390|91|1|28|36158.92|0.10|0.06|R|F|1993-09-08|1993-09-27|1993-09-26|NONE|SHIP|al foxes. express, final ideas cajole car +35043|598|59|2|36|53949.24|0.05|0.04|A|F|1993-08-31|1993-09-08|1993-09-19|COLLECT COD|RAIL|nding, ironic platelet +35043|535|36|3|15|21532.95|0.02|0.00|A|F|1993-09-30|1993-09-23|1993-10-16|DELIVER IN PERSON|MAIL|latelets doze b +35043|697|98|4|12|19172.28|0.10|0.05|A|F|1993-10-24|1993-10-02|1993-11-08|COLLECT COD|AIR|r requests haggle final pains. sl +35044|1672|55|1|9|14163.03|0.07|0.04|N|O|1997-08-18|1997-07-07|1997-08-27|COLLECT COD|RAIL|s. packages boost between +35044|1117|54|2|2|2036.22|0.05|0.04|N|O|1997-08-05|1997-06-11|1997-08-28|NONE|TRUCK| braids boost after the furiously silent +35044|1612|95|3|1|1513.61|0.10|0.03|N|O|1997-05-22|1997-06-26|1997-06-11|NONE|TRUCK| blithely final theodolites haggle re +35044|96|72|4|7|6972.63|0.04|0.05|N|O|1997-05-10|1997-07-28|1997-05-11|DELIVER IN PERSON|AIR|eas! quickly ironic requests use up +35044|94|95|5|37|36781.33|0.04|0.00|N|O|1997-05-25|1997-06-09|1997-06-21|DELIVER IN PERSON|REG AIR|ending requests. blithely express ins +35045|1374|75|1|44|56116.28|0.03|0.02|A|F|1992-06-04|1992-06-06|1992-06-29|DELIVER IN PERSON|TRUCK|. fluffily +35045|1570|91|2|49|72106.93|0.00|0.07|A|F|1992-04-13|1992-06-08|1992-05-06|DELIVER IN PERSON|REG AIR|ly carefully pending accounts. car +35045|545|76|3|10|14455.40|0.09|0.02|A|F|1992-07-28|1992-06-24|1992-08-13|NONE|TRUCK|uriously regul +35046|1361|62|1|33|41657.88|0.03|0.03|A|F|1993-07-26|1993-09-24|1993-08-01|COLLECT COD|REG AIR| accounts. idly special deposits x-ra +35046|899|66|2|11|19798.79|0.09|0.07|A|F|1993-11-03|1993-10-14|1993-11-10|DELIVER IN PERSON|TRUCK|ld packages cajole +35046|1257|32|3|11|12740.75|0.07|0.04|A|F|1993-08-04|1993-10-05|1993-08-05|NONE|REG AIR|gularly. furiousl +35046|1323|100|4|36|44075.52|0.04|0.00|A|F|1993-08-14|1993-10-02|1993-09-01|TAKE BACK RETURN|TRUCK| regular requests through the +35046|566|97|5|49|71861.44|0.07|0.00|R|F|1993-07-26|1993-10-05|1993-08-15|NONE|TRUCK|eans. carefully ironic ideas abou +35046|438|97|6|42|56214.06|0.05|0.01|A|F|1993-09-18|1993-10-16|1993-10-12|COLLECT COD|AIR|tes about the accounts are fluffily +35046|397|26|7|35|45408.65|0.01|0.02|R|F|1993-11-08|1993-10-09|1993-11-19|TAKE BACK RETURN|TRUCK|fily express dependencies are blithely ac +35047|1139|12|1|17|17682.21|0.09|0.08|A|F|1993-09-12|1993-08-17|1993-09-27|TAKE BACK RETURN|MAIL| quickly pending acc +35047|1066|67|2|50|48353.00|0.05|0.06|A|F|1993-09-17|1993-08-12|1993-10-04|TAKE BACK RETURN|AIR|ironic asymptotes in +35047|962|65|3|20|37259.20|0.00|0.02|R|F|1993-10-01|1993-07-31|1993-10-29|COLLECT COD|AIR|y even asy +35047|1396|73|4|49|63572.11|0.07|0.00|R|F|1993-09-30|1993-09-04|1993-10-12|TAKE BACK RETURN|TRUCK| regular deposits wake fluffily +35047|1574|95|5|46|67876.22|0.06|0.04|R|F|1993-08-14|1993-07-17|1993-08-17|DELIVER IN PERSON|AIR|he furiously ironic i +35047|120|73|6|34|34684.08|0.09|0.02|R|F|1993-08-21|1993-08-01|1993-09-06|TAKE BACK RETURN|FOB|usly deposits. regula +35047|1360|99|7|2|2522.72|0.02|0.04|A|F|1993-09-05|1993-08-17|1993-09-19|COLLECT COD|TRUCK|platelets. bold, thin dep +35072|189|16|1|14|15248.52|0.06|0.03|N|O|1995-12-25|1996-03-10|1996-01-01|NONE|MAIL|al requests. even, regular instruction +35072|1972|61|2|10|18739.70|0.04|0.08|N|O|1996-03-05|1996-03-19|1996-03-26|COLLECT COD|TRUCK| unusual acc +35072|1769|54|3|33|55135.08|0.00|0.03|N|O|1996-04-07|1996-02-09|1996-04-12|DELIVER IN PERSON|RAIL|ickly accord +35072|1034|5|4|32|29920.96|0.03|0.00|N|O|1996-04-22|1996-03-02|1996-05-21|TAKE BACK RETURN|FOB|uffily pending platelets. final +35072|328|29|5|17|20881.44|0.03|0.02|N|O|1996-04-03|1996-02-05|1996-04-15|DELIVER IN PERSON|AIR|quests are carefully. carefully +35073|49|75|1|15|14235.60|0.10|0.00|N|O|1997-11-29|1997-10-09|1997-12-10|COLLECT COD|TRUCK|accounts haggle. slyly express +35073|1913|2|2|16|29038.56|0.08|0.03|N|O|1997-11-09|1997-11-01|1997-11-10|DELIVER IN PERSON|FOB|usly regular packages sublate blit +35073|44|95|3|50|47202.00|0.01|0.08|N|O|1997-09-14|1997-09-21|1997-09-16|NONE|REG AIR|ctions. courts sleep. +35073|1293|31|4|45|53743.05|0.05|0.04|N|O|1997-12-02|1997-09-24|1998-01-01|DELIVER IN PERSON|SHIP|its. furiously regular instructi +35073|1710|53|5|18|29010.78|0.10|0.03|N|O|1997-09-18|1997-10-28|1997-09-24|COLLECT COD|FOB|c accounts affix carefully among the quick +35074|96|22|1|15|14941.35|0.02|0.06|N|O|1996-12-01|1996-12-10|1996-12-04|DELIVER IN PERSON|MAIL|ccounts. regular, final +35075|1378|79|1|41|52454.17|0.02|0.05|A|F|1993-03-17|1993-03-21|1993-03-20|DELIVER IN PERSON|REG AIR| wake above the carefull +35075|1008|14|2|44|39996.00|0.02|0.01|R|F|1993-02-23|1993-03-31|1993-03-01|DELIVER IN PERSON|MAIL| quickly quick +35075|1652|76|3|28|43502.20|0.09|0.07|R|F|1993-01-22|1993-03-31|1993-01-28|DELIVER IN PERSON|TRUCK|tes. carefully special +35075|64|15|4|30|28921.80|0.01|0.01|R|F|1993-04-19|1993-03-06|1993-04-24|DELIVER IN PERSON|SHIP|express ideas sleep +35075|1604|28|5|2|3011.20|0.03|0.04|A|F|1993-03-10|1993-04-02|1993-04-07|DELIVER IN PERSON|MAIL|uffy foxes cajole furi +35076|985|88|1|31|58465.38|0.06|0.07|N|O|1998-05-27|1998-06-10|1998-06-12|COLLECT COD|FOB|ch carefully around the d +35076|1805|49|2|26|44376.80|0.02|0.02|N|O|1998-03-19|1998-04-24|1998-03-21|NONE|FOB|ously final ideas are fluffily regu +35076|953|22|3|4|7415.80|0.01|0.07|N|O|1998-07-13|1998-04-27|1998-08-07|TAKE BACK RETURN|MAIL|sts against the carefully +35076|1854|98|4|39|68478.15|0.02|0.05|N|O|1998-04-04|1998-05-20|1998-04-25|COLLECT COD|SHIP|its sleep caref +35076|1487|88|5|6|8330.88|0.03|0.05|N|O|1998-07-05|1998-05-11|1998-07-21|DELIVER IN PERSON|FOB|sual frays. packages wake carefully +35077|695|89|1|50|79784.50|0.04|0.00|N|O|1995-11-07|1995-12-23|1995-11-10|DELIVER IN PERSON|SHIP|e. final hockey players shall have to +35077|750|83|2|24|39618.00|0.04|0.04|N|O|1995-10-26|1995-12-26|1995-10-29|DELIVER IN PERSON|AIR|heodolites poach always across the car +35077|1618|1|3|23|34951.03|0.01|0.00|N|O|1995-11-16|1995-12-12|1995-12-14|DELIVER IN PERSON|MAIL|cajole slyly against the sly +35078|1148|21|1|44|46162.16|0.08|0.01|N|O|1996-08-22|1996-10-03|1996-09-20|COLLECT COD|SHIP|cajole. regu +35078|1212|24|2|34|37849.14|0.05|0.02|N|O|1996-10-16|1996-09-10|1996-11-05|DELIVER IN PERSON|TRUCK|s eat. carefully ironic depe +35078|821|55|3|38|65429.16|0.01|0.06|N|O|1996-09-23|1996-10-28|1996-10-12|TAKE BACK RETURN|TRUCK|y evenly across the slyly bold instruc +35078|509|70|4|4|5638.00|0.06|0.04|N|O|1996-11-10|1996-11-03|1996-12-06|COLLECT COD|REG AIR|pliers. pending packages dazzle +35078|1342|57|5|41|50976.94|0.03|0.05|N|O|1996-09-07|1996-10-22|1996-09-09|COLLECT COD|MAIL|the blithely unusual foxes hinder +35079|985|54|1|32|60351.36|0.09|0.07|A|F|1993-09-14|1993-09-26|1993-10-05|COLLECT COD|FOB|ts wake ruthlessly. regular, even request +35079|816|50|2|36|61805.16|0.04|0.06|R|F|1993-11-16|1993-09-29|1993-12-01|TAKE BACK RETURN|FOB|carefully i +35079|697|91|3|26|41539.94|0.07|0.01|A|F|1993-10-31|1993-10-31|1993-11-23|NONE|MAIL|sts. carefully final packages +35079|1356|95|4|14|17602.90|0.06|0.00|R|F|1993-12-07|1993-10-16|1993-12-14|COLLECT COD|MAIL|even packages detect +35079|1200|1|5|17|18720.40|0.06|0.03|A|F|1993-11-01|1993-10-26|1993-11-20|NONE|SHIP|ts. pending, regular +35079|699|62|6|11|17596.59|0.06|0.02|A|F|1993-10-10|1993-09-17|1993-10-19|TAKE BACK RETURN|SHIP|final, silent accounts haggle carefully amo +35104|1888|89|1|39|69805.32|0.07|0.01|A|F|1992-05-12|1992-06-15|1992-06-04|DELIVER IN PERSON|MAIL|s are furiously +35104|300|82|2|48|57614.40|0.04|0.00|R|F|1992-08-13|1992-05-31|1992-08-15|DELIVER IN PERSON|TRUCK|mptotes use above the carefully +35104|1248|60|3|38|43671.12|0.06|0.03|R|F|1992-05-03|1992-06-13|1992-05-10|DELIVER IN PERSON|TRUCK|le quickly blithe +35104|1173|82|4|16|17186.72|0.10|0.05|A|F|1992-08-22|1992-07-02|1992-09-10|TAKE BACK RETURN|REG AIR| requests according +35104|1343|82|5|29|36085.86|0.01|0.00|R|F|1992-08-19|1992-07-16|1992-08-26|NONE|AIR|cial frays lose ironically. furiousl +35104|529|20|6|4|5718.08|0.05|0.06|A|F|1992-07-13|1992-06-18|1992-08-04|DELIVER IN PERSON|FOB| of the enticingly fin +35104|49|25|7|42|39859.68|0.08|0.01|A|F|1992-08-01|1992-06-12|1992-08-26|TAKE BACK RETURN|SHIP|ages after the slyly fin +35105|1868|69|1|2|3539.72|0.06|0.04|A|F|1994-01-20|1994-02-02|1994-02-04|DELIVER IN PERSON|REG AIR|en ideas sleep carefully quickly +35105|1186|23|2|24|26092.32|0.07|0.02|A|F|1993-12-17|1994-01-18|1993-12-30|TAKE BACK RETURN|AIR|, pending accounts after the asymptotes +35106|1860|47|1|14|24666.04|0.02|0.08|N|O|1995-09-09|1995-09-07|1995-09-10|DELIVER IN PERSON|RAIL| across the final pi +35106|761|58|2|10|16617.60|0.06|0.03|N|O|1995-10-08|1995-08-27|1995-11-05|DELIVER IN PERSON|MAIL|ole furiously foxes. ironically fina +35106|147|48|3|33|34555.62|0.04|0.01|N|O|1995-08-10|1995-08-20|1995-08-30|DELIVER IN PERSON|MAIL|uests affix carefully. slyl +35106|606|69|4|2|3013.20|0.06|0.03|N|O|1995-10-18|1995-08-10|1995-11-04|DELIVER IN PERSON|AIR|ular pinto beans +35107|207|35|1|47|52038.40|0.06|0.08|A|F|1995-01-01|1994-11-03|1995-01-28|DELIVER IN PERSON|MAIL| regular request +35107|1236|48|2|27|30705.21|0.08|0.07|A|F|1994-12-21|1994-11-25|1994-12-23|TAKE BACK RETURN|RAIL|l theodolites. even platelets accord +35107|98|99|3|8|7984.72|0.06|0.05|A|F|1995-01-09|1994-10-21|1995-01-26|DELIVER IN PERSON|AIR|nts are slyl +35107|1444|45|4|32|43054.08|0.01|0.08|R|F|1994-12-25|1994-10-20|1995-01-07|TAKE BACK RETURN|AIR|s nag carefully? carefully bold the +35107|1222|97|5|17|19094.74|0.06|0.04|R|F|1994-10-06|1994-10-17|1994-10-26|DELIVER IN PERSON|TRUCK|. unusual accounts thrash blithely among t +35108|235|90|1|32|36327.36|0.07|0.03|R|F|1994-08-05|1994-07-18|1994-08-26|DELIVER IN PERSON|MAIL|ular, special pearls +35108|770|3|2|21|35086.17|0.06|0.01|A|F|1994-06-21|1994-08-15|1994-07-19|TAKE BACK RETURN|MAIL|ly slyly regular req +35108|439|27|3|37|49558.91|0.04|0.00|R|F|1994-09-09|1994-08-12|1994-09-15|NONE|RAIL|e slyly bold, special ac +35108|1053|54|4|32|30529.60|0.06|0.00|A|F|1994-06-03|1994-08-02|1994-06-08|COLLECT COD|TRUCK|le carefully furiously special instruc +35109|536|97|1|8|11492.24|0.04|0.03|N|O|1998-05-12|1998-05-09|1998-05-30|TAKE BACK RETURN|AIR|yly final deposits. blithel +35109|1561|42|2|47|68740.32|0.01|0.06|N|O|1998-06-07|1998-03-21|1998-06-28|DELIVER IN PERSON|REG AIR|ole furiously final requests. slyly +35109|217|99|3|13|14523.73|0.02|0.01|N|O|1998-04-29|1998-05-03|1998-05-17|COLLECT COD|RAIL| requests. silently pendin +35109|1438|78|4|19|25449.17|0.06|0.02|N|O|1998-03-07|1998-03-20|1998-03-24|DELIVER IN PERSON|RAIL|quickly about +35110|276|58|1|7|8233.89|0.09|0.04|N|O|1995-12-25|1995-12-21|1996-01-22|NONE|FOB|ter the regular, spe +35110|1178|15|2|20|21583.40|0.01|0.03|N|O|1995-11-26|1995-12-05|1995-12-11|COLLECT COD|FOB|pinto beans. even requests dazzle al +35110|1035|6|3|37|34633.11|0.01|0.03|N|O|1996-02-05|1996-01-10|1996-02-28|COLLECT COD|AIR|uriously express asymptotes. qu +35110|320|21|4|43|52473.76|0.05|0.01|N|O|1995-10-23|1996-01-05|1995-11-04|NONE|REG AIR|hely ironic +35111|1551|72|1|6|8715.30|0.06|0.06|R|F|1993-08-27|1993-07-30|1993-09-12|COLLECT COD|REG AIR|ccounts against the +35111|1684|8|2|5|7928.40|0.07|0.00|A|F|1993-08-06|1993-07-14|1993-08-30|COLLECT COD|RAIL|deposits according to the regul +35111|356|85|3|10|12563.50|0.01|0.05|A|F|1993-07-11|1993-07-26|1993-07-18|COLLECT COD|RAIL|ions against the the +35111|1231|6|4|4|4528.92|0.04|0.08|R|F|1993-06-17|1993-07-11|1993-06-20|DELIVER IN PERSON|AIR|ideas. ironic, un +35111|1436|54|5|25|33435.75|0.08|0.02|A|F|1993-09-18|1993-07-19|1993-10-06|NONE|REG AIR|posits sleep fu +35136|445|75|1|40|53817.60|0.07|0.01|R|F|1995-01-16|1994-11-29|1995-02-08|DELIVER IN PERSON|TRUCK|lly ruthless requests. express, pen +35136|1190|99|2|21|22914.99|0.10|0.02|R|F|1994-12-30|1994-12-04|1995-01-20|COLLECT COD|SHIP|s. packages cajole qui +35136|1117|90|3|47|47851.17|0.01|0.07|R|F|1995-01-11|1994-12-12|1995-01-16|DELIVER IN PERSON|RAIL|l accounts affix ruthlessly. +35136|124|25|4|34|34820.08|0.02|0.01|A|F|1995-02-06|1994-11-20|1995-02-13|COLLECT COD|SHIP|quickly ironic plate +35137|1316|55|1|4|4869.24|0.09|0.03|R|F|1993-11-16|1993-08-21|1993-12-06|COLLECT COD|TRUCK|efully dogged instructions. unusual, s +35137|1214|26|2|9|10036.89|0.01|0.06|A|F|1993-10-05|1993-09-16|1993-10-10|DELIVER IN PERSON|SHIP|ter the carefully +35137|1739|24|3|21|34455.33|0.05|0.07|R|F|1993-09-14|1993-08-21|1993-10-11|TAKE BACK RETURN|REG AIR|ly. furiously s +35137|338|39|4|2|2476.66|0.09|0.03|R|F|1993-11-12|1993-09-02|1993-11-15|TAKE BACK RETURN|REG AIR|deas are slyly. even, +35137|255|37|5|26|30036.50|0.01|0.03|A|F|1993-11-13|1993-09-03|1993-11-14|NONE|FOB|sleep according to the furiously +35137|290|45|6|42|49992.18|0.08|0.03|A|F|1993-10-24|1993-08-23|1993-11-03|COLLECT COD|SHIP|its: blithely regular asymptotes might +35138|1123|24|1|38|38916.56|0.06|0.06|N|O|1997-07-16|1997-08-13|1997-07-24|COLLECT COD|AIR|usual ideas cajole after +35139|1723|24|1|27|43867.44|0.03|0.05|R|F|1993-01-21|1993-03-04|1993-02-05|DELIVER IN PERSON|MAIL|s use against the special ideas. furio +35139|700|32|2|28|44819.60|0.02|0.01|R|F|1993-03-20|1993-03-23|1993-04-14|TAKE BACK RETURN|FOB|ake slyly ironic i +35139|1579|20|3|37|54781.09|0.04|0.01|A|F|1993-05-16|1993-04-07|1993-05-29|NONE|TRUCK|counts. bold pinto beans nag blithely; +35139|1364|41|4|10|12653.60|0.01|0.01|R|F|1993-02-28|1993-03-25|1993-03-25|COLLECT COD|TRUCK|thely ironi +35139|1500|79|5|48|67272.00|0.08|0.04|A|F|1993-05-16|1993-03-17|1993-06-04|COLLECT COD|TRUCK|riously. iron +35139|437|96|6|2|2674.86|0.10|0.00|A|F|1993-05-03|1993-03-06|1993-05-13|DELIVER IN PERSON|FOB|nal dependenci +35139|923|26|7|33|60189.36|0.09|0.05|A|F|1993-05-19|1993-03-11|1993-06-10|TAKE BACK RETURN|AIR|nt pinto beans about the care +35140|982|83|1|30|56489.40|0.01|0.00|N|O|1998-02-24|1997-12-12|1998-03-12|NONE|REG AIR|n packages: blithel +35140|574|5|2|49|72253.93|0.06|0.04|N|O|1997-11-22|1998-01-18|1997-12-05|NONE|REG AIR|nal accounts eat fur +35140|1729|30|3|35|57075.20|0.00|0.04|N|O|1997-12-05|1998-01-05|1997-12-14|NONE|MAIL|ole blithely +35140|1050|21|4|13|12363.65|0.02|0.00|N|O|1998-01-25|1997-12-31|1998-02-07|COLLECT COD|FOB| packages are sly +35140|1837|24|5|3|5216.49|0.07|0.01|N|O|1998-01-14|1998-01-24|1998-02-09|TAKE BACK RETURN|RAIL|lyly regular +35141|462|50|1|26|35423.96|0.04|0.02|A|F|1993-09-20|1993-10-25|1993-10-16|TAKE BACK RETURN|RAIL| sublate quickly carefully ru +35141|1013|19|2|38|34732.38|0.09|0.04|R|F|1993-09-17|1993-11-08|1993-09-27|DELIVER IN PERSON|FOB|y regular asym +35141|1447|65|3|18|24271.92|0.01|0.07|A|F|1993-12-04|1993-12-07|1994-01-01|COLLECT COD|RAIL|eposits. blith +35141|1139|76|4|25|26003.25|0.01|0.04|R|F|1993-11-28|1993-10-21|1993-12-22|NONE|TRUCK|gage on the instructions. instruction +35141|1661|85|5|47|73445.02|0.10|0.04|A|F|1993-11-12|1993-10-27|1993-11-30|TAKE BACK RETURN|SHIP|egular foxes a +35141|1092|28|6|7|6951.63|0.03|0.08|A|F|1993-11-05|1993-11-12|1993-11-06|TAKE BACK RETURN|REG AIR|uests boost. +35142|1487|5|1|44|61093.12|0.00|0.02|R|F|1993-07-31|1993-07-08|1993-08-14|DELIVER IN PERSON|RAIL|lyly careful deposits inside the q +35142|25|51|2|17|15725.34|0.07|0.01|A|F|1993-06-29|1993-07-22|1993-07-15|DELIVER IN PERSON|FOB|ly ironic t +35142|320|49|3|25|30508.00|0.08|0.07|A|F|1993-08-14|1993-05-29|1993-08-25|TAKE BACK RETURN|SHIP|sits. tithes along the q +35142|1937|38|4|9|16550.37|0.03|0.07|A|F|1993-07-13|1993-06-27|1993-08-08|DELIVER IN PERSON|MAIL|spite the unusual package +35143|1124|61|1|22|22552.64|0.10|0.05|N|O|1995-12-16|1995-11-19|1995-12-20|NONE|REG AIR| ironic dolphins. i +35143|291|19|2|7|8339.03|0.04|0.06|N|O|1995-11-11|1995-12-24|1995-11-30|COLLECT COD|REG AIR|instructions. fin +35168|540|71|1|6|8643.24|0.06|0.06|N|O|1998-09-04|1998-09-29|1998-09-24|TAKE BACK RETURN|MAIL|to beans play fluffily s +35168|1510|31|2|15|21172.65|0.06|0.00|N|O|1998-09-20|1998-10-11|1998-10-13|DELIVER IN PERSON|AIR|ing instructions. quickly reg +35168|1614|97|3|45|68202.45|0.04|0.02|N|O|1998-10-17|1998-09-14|1998-11-16|DELIVER IN PERSON|AIR| pending deposits +35169|120|47|1|19|19382.28|0.06|0.04|N|O|1996-09-15|1996-08-04|1996-09-28|COLLECT COD|RAIL|ke blithely deposits. regular theodolites +35169|1626|68|2|27|41245.74|0.04|0.05|N|O|1996-06-07|1996-08-11|1996-06-10|DELIVER IN PERSON|RAIL|t the furiously regular deposit +35169|1764|91|3|5|8328.80|0.03|0.03|N|O|1996-09-30|1996-07-23|1996-10-21|COLLECT COD|REG AIR|ructions. quickly ironic deposits cajole +35169|934|3|4|29|53212.97|0.08|0.08|N|O|1996-07-16|1996-08-14|1996-08-15|COLLECT COD|TRUCK|riously accounts. carefully silent r +35170|629|23|1|48|73421.76|0.05|0.04|R|F|1994-07-04|1994-08-15|1994-07-08|DELIVER IN PERSON|SHIP| special packages. accounts serve caref +35170|532|63|2|7|10027.71|0.03|0.00|A|F|1994-10-04|1994-09-04|1994-10-25|TAKE BACK RETURN|MAIL|aggle blithely regular instr +35171|1790|75|1|1|1691.79|0.08|0.04|N|O|1997-04-16|1997-03-29|1997-05-03|TAKE BACK RETURN|MAIL|ress excuses. furiously +35171|455|14|2|15|20331.75|0.00|0.07|N|O|1997-01-19|1997-03-11|1997-01-28|COLLECT COD|FOB|requests. furiously +35171|319|20|3|23|28044.13|0.07|0.04|N|O|1997-01-25|1997-03-23|1997-02-24|NONE|REG AIR|platelets sleep furiously carefully +35171|557|88|4|20|29151.00|0.06|0.05|N|O|1997-02-16|1997-02-04|1997-03-09|NONE|SHIP|cajole furiously alon +35171|1141|42|5|40|41685.60|0.01|0.06|N|O|1997-01-31|1997-03-06|1997-02-04|COLLECT COD|FOB|ependencies +35171|723|88|6|42|68196.24|0.05|0.08|N|O|1997-04-03|1997-02-05|1997-04-25|DELIVER IN PERSON|AIR|instructions ou +35171|953|54|7|8|14831.60|0.03|0.05|N|O|1997-02-28|1997-03-28|1997-03-18|TAKE BACK RETURN|AIR|ts. furiously even pinto beans integrate ca +35172|1590|11|1|2|2983.18|0.00|0.03|A|F|1994-11-20|1994-11-02|1994-11-30|TAKE BACK RETURN|MAIL|ly final accounts. +35173|18|94|1|40|36720.40|0.03|0.02|A|F|1992-04-07|1992-04-28|1992-05-07|DELIVER IN PERSON|FOB|rnes. unusual requests detect slyly. +35173|1543|44|2|28|40447.12|0.01|0.01|R|F|1992-07-01|1992-05-14|1992-07-22|COLLECT COD|REG AIR| blithely final instructio +35173|939|42|3|18|33118.74|0.01|0.02|R|F|1992-06-28|1992-05-25|1992-07-03|NONE|AIR|s serve about the final, fi +35173|20|46|4|30|27600.60|0.06|0.03|R|F|1992-04-05|1992-05-03|1992-04-12|NONE|RAIL|eas. even, regular warhorses c +35173|1998|31|5|40|75999.60|0.01|0.01|A|F|1992-05-30|1992-05-31|1992-05-31|NONE|SHIP|eas sleep carefully +35173|1116|89|6|2|2034.22|0.07|0.00|A|F|1992-03-21|1992-06-09|1992-04-15|COLLECT COD|REG AIR| regular foxes. fluffily re +35173|320|21|7|25|30508.00|0.07|0.03|A|F|1992-05-05|1992-06-02|1992-05-17|DELIVER IN PERSON|FOB|hely above the furiousl +35174|463|64|1|5|6817.30|0.05|0.05|N|O|1998-05-19|1998-02-24|1998-06-01|DELIVER IN PERSON|FOB|ironic requests. fluffily even packages +35174|1204|16|2|10|11052.00|0.09|0.01|N|O|1998-03-22|1998-03-01|1998-03-30|TAKE BACK RETURN|FOB|ickly silent ideas. regular pint +35175|489|77|1|13|18063.24|0.01|0.06|N|O|1997-12-09|1998-01-11|1998-01-01|NONE|RAIL|l foxes. ev +35175|610|73|2|42|63445.62|0.10|0.00|N|O|1998-01-27|1998-01-25|1998-02-09|DELIVER IN PERSON|AIR| ideas against the blithely bold +35175|116|17|3|5|5080.55|0.10|0.03|N|O|1997-11-20|1998-02-08|1997-12-18|TAKE BACK RETURN|FOB|tes are blithely blithely unusua +35200|1877|64|1|9|16009.83|0.06|0.02|A|F|1994-04-23|1994-04-21|1994-05-06|COLLECT COD|AIR| accounts are quick +35200|236|91|2|49|55675.27|0.10|0.07|A|F|1994-03-26|1994-03-29|1994-04-14|NONE|MAIL|the special, even asymptotes. +35200|180|33|3|39|42127.02|0.10|0.00|A|F|1994-04-27|1994-04-13|1994-05-07|COLLECT COD|AIR|regular deposits +35200|1837|81|4|45|78247.35|0.07|0.02|A|F|1994-02-15|1994-03-14|1994-02-18|COLLECT COD|REG AIR|luffily final theodolites cajole carefull +35200|1818|62|5|35|60193.35|0.03|0.07|A|F|1994-05-01|1994-03-09|1994-05-19|COLLECT COD|REG AIR|dencies across the regular dependenci +35200|756|57|6|12|19881.00|0.02|0.08|R|F|1994-05-27|1994-04-23|1994-05-30|NONE|RAIL| final ideas +35201|1193|66|1|40|43767.60|0.04|0.01|A|F|1993-06-06|1993-07-26|1993-06-10|TAKE BACK RETURN|TRUCK|sits. even, final requests s +35201|1602|85|2|48|72172.80|0.06|0.06|A|F|1993-09-16|1993-08-13|1993-09-24|COLLECT COD|RAIL|fully bold pack +35201|326|83|3|19|23300.08|0.04|0.05|A|F|1993-06-10|1993-08-02|1993-06-25|NONE|MAIL|atterns. carefully +35201|1716|43|4|8|12941.68|0.00|0.05|R|F|1993-07-15|1993-08-03|1993-07-27|DELIVER IN PERSON|SHIP| instructions. blit +35201|974|77|5|37|69373.89|0.10|0.07|R|F|1993-06-11|1993-08-07|1993-07-08|NONE|FOB|nic foxes sleep carefully. slyly +35201|1653|54|6|35|54412.75|0.03|0.07|A|F|1993-09-28|1993-07-19|1993-10-20|NONE|MAIL|cial requests. un +35201|807|41|7|28|47818.40|0.07|0.05|A|F|1993-09-30|1993-07-06|1993-10-12|NONE|FOB|sly requests. regular deposits use +35202|1808|52|1|24|41035.20|0.05|0.07|N|O|1997-09-07|1997-08-12|1997-09-18|COLLECT COD|SHIP|posits haggle furiously silent pinto +35202|50|26|2|6|5700.30|0.06|0.05|N|O|1997-08-05|1997-09-28|1997-08-23|NONE|MAIL|sits play pinto beans. furiously i +35202|44|45|3|7|6608.28|0.01|0.03|N|O|1997-09-06|1997-08-21|1997-09-14|COLLECT COD|REG AIR|cajole slyly. requests abou +35202|951|52|4|9|16667.55|0.10|0.07|N|O|1997-09-05|1997-08-23|1997-09-08|DELIVER IN PERSON|AIR| requests maintain accordi +35202|7|33|5|10|9070.00|0.08|0.03|N|O|1997-07-08|1997-08-17|1997-07-24|TAKE BACK RETURN|RAIL|silent deposits are blithely f +35202|1596|17|6|45|67391.55|0.09|0.01|N|O|1997-08-17|1997-08-24|1997-09-07|COLLECT COD|RAIL|ccounts unwind. express pin +35202|1661|85|7|30|46879.80|0.00|0.02|N|O|1997-07-06|1997-10-02|1997-08-05|DELIVER IN PERSON|TRUCK|rts wake fluffily! silent, pending re +35203|615|16|1|24|36374.64|0.04|0.08|N|O|1997-06-26|1997-07-02|1997-07-07|COLLECT COD|SHIP|ites poach care +35203|127|54|2|18|18488.16|0.05|0.05|N|O|1997-06-03|1997-06-29|1997-07-02|NONE|SHIP|s affix furiously across the slyly regular +35204|1758|1|1|18|29875.50|0.10|0.04|N|O|1997-09-18|1997-10-28|1997-10-12|COLLECT COD|SHIP|s haggle across the r +35205|503|34|1|17|23859.50|0.08|0.05|N|O|1997-07-14|1997-09-04|1997-08-06|TAKE BACK RETURN|SHIP|uests unwind after the bold fox +35205|782|47|2|18|30290.04|0.00|0.05|N|O|1997-08-08|1997-09-28|1997-09-05|TAKE BACK RETURN|TRUCK|egular accounts. slyly specia +35205|1914|47|3|23|41765.93|0.00|0.08|N|O|1997-10-14|1997-09-24|1997-10-18|TAKE BACK RETURN|MAIL|y above the furiously un +35205|384|85|4|47|60365.86|0.07|0.00|N|O|1997-07-16|1997-09-13|1997-07-20|DELIVER IN PERSON|TRUCK| regular instructions integ +35205|1453|32|5|21|28443.45|0.02|0.00|N|O|1997-10-22|1997-08-19|1997-11-16|COLLECT COD|TRUCK|y final accounts +35205|218|73|6|10|11182.10|0.08|0.01|N|O|1997-09-06|1997-09-21|1997-09-23|COLLECT COD|MAIL|ronic packages. r +35206|942|77|1|45|82932.30|0.06|0.08|N|O|1996-11-17|1996-10-18|1996-12-11|NONE|REG AIR|ounts haggle furiously unusu +35206|1280|18|2|41|48432.48|0.02|0.00|N|O|1996-09-01|1996-09-28|1996-10-01|NONE|RAIL| final platelets. regular requests acc +35206|1851|38|3|47|82383.95|0.02|0.01|N|O|1996-08-17|1996-10-17|1996-09-02|NONE|SHIP|pendencies are slyly evenly final pa +35206|61|62|4|12|11532.72|0.01|0.07|N|O|1996-10-12|1996-09-01|1996-10-18|COLLECT COD|FOB|y special accounts. +35206|131|58|5|38|39182.94|0.08|0.08|N|O|1996-09-27|1996-09-15|1996-10-07|DELIVER IN PERSON|AIR|nts print blithely carefully final a +35207|1406|46|1|28|36607.20|0.03|0.02|N|O|1996-07-26|1996-07-23|1996-08-13|NONE|FOB|y; blithely silent packages are fluffil +35207|610|73|2|37|55892.57|0.00|0.04|N|O|1996-07-16|1996-07-13|1996-08-06|TAKE BACK RETURN|TRUCK|ttainments serve: even de +35207|366|95|3|50|63318.00|0.05|0.00|N|O|1996-07-10|1996-07-07|1996-07-19|NONE|FOB|lar deposits ar +35207|763|64|4|9|14973.84|0.01|0.03|N|O|1996-06-12|1996-07-14|1996-06-19|TAKE BACK RETURN|AIR|ackages haggle. blithely fin +35232|347|48|1|4|4989.36|0.04|0.08|N|O|1996-08-30|1996-08-25|1996-09-17|NONE|REG AIR| the carefully r +35232|329|86|2|2|2458.64|0.10|0.00|N|O|1996-08-11|1996-08-10|1996-09-06|NONE|TRUCK|al pinto beans are fluffily along +35232|1882|83|3|40|71355.20|0.10|0.05|N|O|1996-07-11|1996-09-20|1996-07-25|COLLECT COD|RAIL|ainst the f +35232|41|67|4|20|18820.80|0.04|0.05|N|O|1996-08-29|1996-09-10|1996-09-10|COLLECT COD|REG AIR|rate carefully never ironic ideas. furiou +35232|920|55|5|25|45523.00|0.07|0.00|N|O|1996-07-16|1996-08-18|1996-08-11|TAKE BACK RETURN|TRUCK|s use stealthily by the slyly pending +35232|1717|44|6|11|17805.81|0.09|0.01|N|O|1996-10-08|1996-08-10|1996-11-04|TAKE BACK RETURN|RAIL|e across the even ideas. fluf +35232|769|2|7|38|63450.88|0.04|0.05|N|O|1996-09-11|1996-09-18|1996-10-01|TAKE BACK RETURN|RAIL|es. final, sp +35233|858|92|1|40|70354.00|0.04|0.01|R|F|1993-10-16|1993-11-25|1993-10-29|DELIVER IN PERSON|TRUCK| pinto beans are bl +35233|1117|18|2|8|8144.88|0.07|0.01|A|F|1994-01-04|1993-12-21|1994-01-11|TAKE BACK RETURN|RAIL|enticing waters print fluffily +35233|1696|79|3|31|49528.39|0.02|0.05|R|F|1993-10-24|1993-12-20|1993-11-17|TAKE BACK RETURN|FOB|y slow, regular ideas. ironi +35234|475|34|1|13|17881.11|0.01|0.06|N|O|1997-08-03|1997-08-07|1997-08-22|DELIVER IN PERSON|TRUCK|al pinto beans doze. +35235|519|20|1|41|58199.91|0.04|0.00|N|O|1998-01-01|1997-12-11|1998-01-12|DELIVER IN PERSON|TRUCK|heodolites. regular theodoli +35235|1410|28|2|50|65570.50|0.03|0.06|N|O|1998-01-22|1997-12-13|1998-02-06|NONE|FOB|ges. regular packages haggle fluffily a +35235|1109|18|3|42|42424.20|0.07|0.06|N|O|1998-01-13|1997-12-19|1998-01-14|DELIVER IN PERSON|REG AIR| slyly dogged packag +35235|1319|58|4|28|34168.68|0.02|0.08|N|O|1998-01-22|1997-12-13|1998-02-20|NONE|REG AIR|cies nag carefully. slyly pending id +35235|1259|71|5|41|47570.25|0.09|0.02|N|O|1998-02-02|1997-11-28|1998-02-10|COLLECT COD|REG AIR| ironic packages dazzle express asymptot +35236|30|81|1|31|28830.93|0.03|0.07|N|O|1997-09-22|1997-09-01|1997-10-16|NONE|MAIL|eans. slyly final ideas after +35237|1871|1|1|23|40776.01|0.09|0.02|A|F|1993-03-07|1993-03-19|1993-03-14|NONE|FOB|e furiously regular deposits sleep f +35237|1094|30|2|20|19901.80|0.07|0.06|A|F|1993-04-10|1993-02-22|1993-04-29|TAKE BACK RETURN|MAIL|out the slyly pending platelets. final requ +35237|1100|36|3|47|47051.70|0.07|0.05|R|F|1993-04-08|1993-04-02|1993-04-11|NONE|MAIL|ainst the f +35237|127|28|4|7|7189.84|0.10|0.08|R|F|1993-04-16|1993-02-09|1993-05-14|COLLECT COD|SHIP|unts. carefully ironi +35237|1821|22|5|30|51684.60|0.07|0.06|R|F|1993-01-16|1993-03-21|1993-02-03|DELIVER IN PERSON|SHIP|telets wake. blithely expres +35238|550|51|1|29|42065.95|0.09|0.05|N|O|1995-08-05|1995-06-19|1995-08-22|DELIVER IN PERSON|RAIL|ross the fluffily even attainments. +35238|782|83|2|28|47117.84|0.04|0.07|N|F|1995-06-12|1995-07-17|1995-07-03|COLLECT COD|MAIL|furiously pending +35238|1127|36|3|35|35984.20|0.05|0.05|N|O|1995-06-18|1995-07-21|1995-07-10|DELIVER IN PERSON|AIR|s are silently. carefully sly ideas wak +35238|415|16|4|16|21046.56|0.03|0.05|N|O|1995-07-01|1995-06-02|1995-07-15|DELIVER IN PERSON|REG AIR|ts. idle asymptotes against +35238|186|87|5|6|6517.08|0.07|0.04|N|O|1995-07-08|1995-07-09|1995-07-31|TAKE BACK RETURN|TRUCK| deposits. blithely ironic rea +35238|1384|61|6|8|10283.04|0.02|0.00|N|O|1995-08-27|1995-06-05|1995-09-20|COLLECT COD|TRUCK| ironic deposit +35239|171|24|1|30|32135.10|0.01|0.06|N|O|1996-02-01|1996-01-03|1996-02-26|DELIVER IN PERSON|TRUCK|eas. regular +35239|1861|91|2|38|66988.68|0.06|0.01|N|O|1995-11-23|1996-01-18|1995-12-16|COLLECT COD|FOB| express foxes. e +35239|93|94|3|22|21847.98|0.02|0.02|N|O|1995-11-22|1996-01-20|1995-12-14|COLLECT COD|MAIL|y bold sentiment +35239|924|59|4|10|18249.20|0.08|0.08|N|O|1996-02-08|1996-01-11|1996-02-29|DELIVER IN PERSON|REG AIR|ual pearls wake across th +35264|1360|75|1|14|17659.04|0.01|0.05|A|F|1995-04-17|1995-05-15|1995-05-13|TAKE BACK RETURN|MAIL|lyly furious instr +35265|1504|85|1|45|63247.50|0.07|0.02|A|F|1994-01-24|1994-01-18|1994-01-27|DELIVER IN PERSON|FOB|y carefully unusual i +35265|1998|31|2|49|93099.51|0.02|0.06|A|F|1994-03-07|1994-02-09|1994-03-30|NONE|SHIP|ests. carefully ev +35265|1466|67|3|37|50596.02|0.08|0.05|R|F|1994-02-10|1994-02-21|1994-03-05|DELIVER IN PERSON|RAIL|ng to the regular instructions haggle fur +35265|956|57|4|22|40852.90|0.10|0.03|R|F|1994-03-22|1994-02-02|1994-03-24|COLLECT COD|RAIL|ar platelets. ironic somas cajol +35265|1218|56|5|6|6715.26|0.10|0.00|R|F|1994-02-15|1994-01-17|1994-03-16|COLLECT COD|FOB|heodolites. pending, special ideas sleep +35266|1490|30|1|35|48702.15|0.02|0.06|A|F|1995-01-12|1995-02-22|1995-01-20|DELIVER IN PERSON|REG AIR| furiously about the furi +35266|108|87|2|14|14113.40|0.06|0.08|R|F|1995-05-12|1995-03-24|1995-05-19|TAKE BACK RETURN|REG AIR|ke. ironically pending requests c +35266|753|50|3|20|33075.00|0.05|0.04|R|F|1995-04-03|1995-02-26|1995-04-12|NONE|RAIL| bold pains grow fu +35266|611|5|4|44|66510.84|0.06|0.00|R|F|1995-03-27|1995-03-12|1995-04-25|COLLECT COD|MAIL|ial Tiresia +35266|788|53|5|29|48974.62|0.05|0.08|A|F|1995-01-18|1995-04-09|1995-01-22|COLLECT COD|MAIL|ngly regular c +35266|444|3|6|4|5377.76|0.02|0.00|A|F|1995-04-06|1995-04-04|1995-05-01|TAKE BACK RETURN|RAIL| blithely ironic asymptotes wake +35266|1979|68|7|24|45143.28|0.10|0.03|R|F|1995-04-20|1995-04-04|1995-05-17|NONE|MAIL| the regular d +35267|861|61|1|25|44046.50|0.01|0.07|N|O|1997-09-22|1997-07-26|1997-10-08|COLLECT COD|MAIL|ealthy foxes. special, regula +35267|1632|33|2|4|6134.52|0.05|0.00|N|O|1997-06-08|1997-06-30|1997-07-07|NONE|TRUCK|ully silent accounts. furiously f +35267|920|23|3|32|58269.44|0.00|0.06|N|O|1997-07-05|1997-06-29|1997-07-26|COLLECT COD|REG AIR| among the final +35267|1509|90|4|5|7052.50|0.06|0.07|N|O|1997-08-12|1997-07-11|1997-08-30|DELIVER IN PERSON|TRUCK|refully regular pinto beans. even +35267|13|64|5|22|20086.22|0.03|0.03|N|O|1997-07-10|1997-08-06|1997-07-12|COLLECT COD|RAIL| unusual accounts; express pinto +35268|75|51|1|2|1950.14|0.10|0.07|N|O|1998-02-06|1998-02-28|1998-02-15|DELIVER IN PERSON|RAIL| express dep +35269|1580|21|1|32|47410.56|0.04|0.03|R|F|1994-08-02|1994-08-02|1994-08-14|NONE|AIR|deposits wake above the ideas. p +35270|51|27|1|31|29482.55|0.09|0.05|A|F|1995-01-10|1995-01-21|1995-02-01|TAKE BACK RETURN|SHIP| furiously unu +35271|53|29|1|1|953.05|0.10|0.02|A|F|1993-08-10|1993-09-07|1993-08-25|DELIVER IN PERSON|REG AIR|ding pinto beans nag final +35296|1237|38|1|28|31870.44|0.05|0.07|A|F|1995-04-29|1995-04-26|1995-05-07|NONE|MAIL| bravely regular +35296|964|65|2|4|7459.84|0.04|0.01|R|F|1995-04-15|1995-05-29|1995-05-02|TAKE BACK RETURN|REG AIR|ions wake slyly. regular pinto +35296|1039|10|3|13|12220.39|0.06|0.01|R|F|1995-04-19|1995-05-02|1995-04-23|DELIVER IN PERSON|FOB| boost across the express, si +35296|1248|23|4|24|27581.76|0.00|0.00|R|F|1995-04-21|1995-05-08|1995-05-10|NONE|AIR| poach slyly atop the slyly bold ac +35297|128|55|1|48|49349.76|0.03|0.01|A|F|1993-02-28|1993-02-17|1993-03-07|NONE|SHIP|refully final platelets. slyly regul +35297|1334|11|2|12|14823.96|0.10|0.08|A|F|1993-02-21|1993-03-07|1993-03-17|NONE|FOB|pendencies haggle slyly about the +35297|1273|11|3|20|23485.40|0.10|0.00|A|F|1993-01-12|1993-02-12|1993-01-17|COLLECT COD|MAIL|ully regular asymptotes. fluffily regul +35298|990|91|1|40|75639.60|0.03|0.08|A|F|1993-01-26|1992-12-30|1993-02-14|TAKE BACK RETURN|FOB|ngage alon +35298|502|33|2|4|5610.00|0.07|0.06|A|F|1992-10-26|1992-12-24|1992-11-06|NONE|MAIL|ges use furiously. slyly pendin +35299|646|47|1|21|32479.44|0.09|0.03|A|F|1992-10-03|1992-09-24|1992-10-24|DELIVER IN PERSON|MAIL|as behind the slyly +35299|822|89|2|33|56853.06|0.01|0.03|R|F|1992-09-16|1992-09-18|1992-10-05|NONE|RAIL|old ideas. ironic asymptotes wake slyly s +35299|1085|91|3|13|12819.04|0.00|0.03|A|F|1992-11-05|1992-09-11|1992-11-11|TAKE BACK RETURN|REG AIR|sly unusual dinos. bli +35299|1791|34|4|40|67711.60|0.07|0.03|R|F|1992-09-30|1992-09-23|1992-10-15|NONE|AIR|deposits sublate according to the careful +35299|941|10|5|34|62625.96|0.05|0.06|R|F|1992-09-18|1992-10-30|1992-10-11|COLLECT COD|REG AIR|doze quickly pending, ir +35300|1689|13|1|6|9544.08|0.03|0.08|A|F|1993-03-29|1993-05-13|1993-04-05|DELIVER IN PERSON|RAIL|he carefully bold instructions affix blithe +35300|1911|12|2|49|88832.59|0.04|0.02|A|F|1993-03-20|1993-04-28|1993-04-08|NONE|AIR|coys hinder carefully iro +35300|1766|67|3|30|50032.80|0.10|0.00|A|F|1993-05-26|1993-04-17|1993-06-15|NONE|TRUCK|ress carefully accord +35300|1334|11|4|37|45707.21|0.03|0.03|R|F|1993-03-20|1993-04-27|1993-04-07|TAKE BACK RETURN|MAIL|al deposits al +35300|1411|29|5|41|53808.81|0.01|0.06|A|F|1993-05-25|1993-05-14|1993-05-26|DELIVER IN PERSON|SHIP|unts. pending, special +35301|281|63|1|18|21263.04|0.09|0.00|A|F|1993-04-06|1993-03-07|1993-04-15|NONE|SHIP| regular theodolites. ironic, even +35301|1883|27|2|36|64255.68|0.01|0.02|R|F|1993-03-09|1993-01-28|1993-04-06|DELIVER IN PERSON|AIR|final asymptotes: bold, final foxes +35301|1962|7|3|26|48462.96|0.05|0.08|A|F|1993-02-01|1993-02-15|1993-02-15|TAKE BACK RETURN|MAIL|equests across the bold ide +35302|1288|26|1|44|52328.32|0.07|0.05|R|F|1993-09-02|1993-07-18|1993-09-29|COLLECT COD|REG AIR|gged deposits hang fluffil +35302|1408|48|2|28|36663.20|0.09|0.04|A|F|1993-07-10|1993-08-08|1993-08-08|DELIVER IN PERSON|FOB|yly ironic requests. regular, +35302|1338|77|3|38|47094.54|0.10|0.07|A|F|1993-09-09|1993-09-02|1993-10-04|DELIVER IN PERSON|TRUCK|ly regular deposits. silent deposit +35302|1735|20|4|43|70379.39|0.00|0.02|A|F|1993-09-12|1993-08-18|1993-09-28|TAKE BACK RETURN|TRUCK|ts after the even requests haggle a +35302|137|16|5|2|2074.26|0.06|0.02|A|F|1993-09-07|1993-07-14|1993-09-12|NONE|FOB|leep. blithely even foxes boo +35302|267|95|6|5|5836.30|0.02|0.08|A|F|1993-08-06|1993-08-29|1993-08-09|COLLECT COD|FOB| use carefu +35302|802|36|7|24|40867.20|0.00|0.03|A|F|1993-08-18|1993-07-13|1993-08-28|COLLECT COD|SHIP|fily about the carefully final +35303|1077|13|1|23|22495.61|0.08|0.04|N|O|1998-03-28|1998-05-24|1998-04-24|DELIVER IN PERSON|FOB|haggle! quickly bold foxes boost. fluffi +35303|1343|82|2|39|48529.26|0.05|0.02|N|O|1998-04-03|1998-04-14|1998-04-29|DELIVER IN PERSON|REG AIR|tructions wake +35328|1308|9|1|14|16930.20|0.00|0.00|R|F|1993-07-20|1993-09-16|1993-08-01|TAKE BACK RETURN|TRUCK|ts; quickly regular accoun +35328|1284|22|2|43|50967.04|0.01|0.07|R|F|1993-10-20|1993-09-16|1993-11-07|TAKE BACK RETURN|TRUCK|ly regular accounts. special re +35328|721|22|3|44|71355.68|0.04|0.01|R|F|1993-08-07|1993-09-25|1993-08-15|NONE|AIR|l packages detect slyly reg +35328|565|96|4|24|35173.44|0.08|0.05|A|F|1993-10-12|1993-08-26|1993-10-30|COLLECT COD|RAIL|g to the bold +35329|1164|65|1|19|20238.04|0.03|0.01|N|O|1997-06-05|1997-06-12|1997-06-16|COLLECT COD|SHIP|regular packages. quickly pending a +35330|919|54|1|45|81895.95|0.02|0.04|A|F|1994-07-02|1994-05-11|1994-07-12|NONE|MAIL|ely regular foxes caj +35330|1127|64|2|10|10281.20|0.05|0.08|R|F|1994-07-16|1994-05-31|1994-07-30|TAKE BACK RETURN|FOB|olites cajole. unusual packages hag +35331|843|44|1|49|85448.16|0.02|0.02|N|O|1997-05-25|1997-07-05|1997-05-28|NONE|AIR|to beans. pinto beans toward +35332|62|88|1|26|25013.56|0.03|0.03|N|O|1997-07-17|1997-08-06|1997-08-12|NONE|MAIL|counts. slyly regular pains us +35333|490|78|1|37|51448.13|0.01|0.03|N|O|1997-03-09|1997-02-13|1997-04-01|DELIVER IN PERSON|FOB|riously pending deposits wa +35333|789|90|2|48|81109.44|0.06|0.01|N|O|1997-03-23|1997-02-09|1997-04-08|COLLECT COD|MAIL| beans are +35334|409|39|1|35|45829.00|0.08|0.00|N|O|1996-10-01|1996-10-11|1996-10-23|TAKE BACK RETURN|MAIL|s. blithely ironic accounts use carefull +35334|474|75|2|16|21991.52|0.06|0.04|N|O|1996-11-15|1996-10-05|1996-11-28|TAKE BACK RETURN|FOB|ously even reques +35335|280|62|1|11|12983.08|0.10|0.01|N|O|1997-03-22|1997-03-20|1997-04-03|TAKE BACK RETURN|FOB|ntiments haggle fluffily above the fu +35335|372|29|2|42|53439.54|0.10|0.05|N|O|1997-04-21|1997-03-27|1997-04-30|DELIVER IN PERSON|TRUCK|might boost slyly +35335|1150|87|3|36|37841.40|0.04|0.06|N|O|1997-05-05|1997-04-15|1997-05-29|COLLECT COD|REG AIR|integrate slyly pinto beans. even +35335|506|67|4|29|40788.50|0.01|0.06|N|O|1997-04-11|1997-03-17|1997-04-28|DELIVER IN PERSON|SHIP| ironically ironic +35335|1266|4|5|24|28014.24|0.03|0.01|N|O|1997-05-08|1997-05-11|1997-06-04|NONE|TRUCK|ter the caref +35360|95|71|1|28|27862.52|0.07|0.08|N|O|1995-07-21|1995-05-29|1995-08-20|TAKE BACK RETURN|FOB|he slyly unusual reque +35360|604|98|2|22|33101.20|0.07|0.04|N|O|1995-07-24|1995-06-12|1995-08-20|NONE|FOB|arefully ir +35360|343|28|3|45|55950.30|0.07|0.01|N|O|1995-08-09|1995-07-15|1995-08-30|NONE|FOB|mptotes affix fluffily above the sly, reg +35360|908|43|4|34|61502.60|0.09|0.04|N|F|1995-06-17|1995-06-23|1995-07-08|NONE|RAIL| sleep silently +35360|1895|39|5|34|61094.26|0.08|0.05|N|O|1995-07-13|1995-06-07|1995-07-22|TAKE BACK RETURN|RAIL|, final pinto beans affix again +35360|678|41|6|24|37888.08|0.00|0.03|N|O|1995-07-28|1995-05-30|1995-08-01|COLLECT COD|FOB|tegrate. silent packages believe. blithely +35360|475|5|7|25|34386.75|0.04|0.08|N|O|1995-07-09|1995-07-06|1995-07-26|NONE|SHIP|ng to the final, express excuses sleep care +35361|1566|47|1|50|73378.00|0.07|0.07|A|F|1994-07-28|1994-06-06|1994-08-16|TAKE BACK RETURN|RAIL| carefully final courts nag ca +35361|663|26|2|1|1563.66|0.09|0.01|A|F|1994-05-24|1994-06-02|1994-06-03|TAKE BACK RETURN|MAIL|lites boost furiously. silent instructions +35361|638|1|3|33|50774.79|0.04|0.01|A|F|1994-05-08|1994-06-13|1994-06-04|COLLECT COD|TRUCK|t theodolites wake doggedly among +35361|356|85|4|47|59048.45|0.00|0.04|A|F|1994-07-21|1994-06-25|1994-07-31|TAKE BACK RETURN|TRUCK|kages cajole carefully even excuses. +35361|1094|100|5|6|5970.54|0.02|0.05|A|F|1994-07-11|1994-07-05|1994-08-06|NONE|AIR|ests after the c +35362|1959|48|1|33|61411.35|0.00|0.07|N|O|1995-08-09|1995-09-25|1995-08-24|COLLECT COD|TRUCK|. fluffily u +35362|21|22|2|28|25788.56|0.03|0.07|N|O|1995-09-30|1995-09-25|1995-10-14|NONE|SHIP|ously deposits. furiously special +35363|1577|58|1|3|4435.71|0.05|0.07|N|O|1997-03-15|1997-01-24|1997-03-16|DELIVER IN PERSON|AIR|ites mold slyly. fluffily +35364|974|75|1|34|63748.98|0.07|0.05|A|F|1994-12-22|1995-02-01|1995-01-03|COLLECT COD|MAIL|he blithely final frets. e +35364|422|10|2|25|33060.50|0.00|0.08|R|F|1995-01-04|1995-02-22|1995-01-05|DELIVER IN PERSON|TRUCK|ithely special pinto beans after the i +35364|408|96|3|14|18317.60|0.06|0.00|R|F|1994-12-14|1995-01-27|1994-12-31|TAKE BACK RETURN|RAIL|osits wake fluffily above the bold, +35364|1382|83|4|32|41068.16|0.05|0.05|A|F|1995-01-16|1995-02-28|1995-01-29|COLLECT COD|FOB| even theodolites. slyly even excuses sl +35364|1034|35|5|13|12155.39|0.00|0.07|A|F|1995-03-09|1995-02-21|1995-04-08|NONE|RAIL|accounts. ironic instructions use sly +35364|513|74|6|44|62194.44|0.00|0.05|A|F|1995-01-31|1995-02-17|1995-02-17|DELIVER IN PERSON|REG AIR| careful foxes after the +35364|123|76|7|13|13300.56|0.09|0.01|A|F|1995-03-29|1995-01-17|1995-04-26|TAKE BACK RETURN|FOB|hely bold requ +35365|595|96|1|1|1495.59|0.08|0.01|N|O|1997-08-20|1997-08-11|1997-09-02|TAKE BACK RETURN|FOB|into beans sleep. slyly unus +35365|836|37|2|32|55578.56|0.01|0.00|N|O|1997-07-07|1997-09-04|1997-07-24|DELIVER IN PERSON|TRUCK|grow. carefully regul +35365|1987|88|3|29|54780.42|0.02|0.08|N|O|1997-09-12|1997-09-06|1997-10-03|NONE|AIR|nly silent packages cajole. slyly +35366|115|94|1|27|27407.97|0.03|0.07|N|O|1995-07-20|1995-10-05|1995-08-13|DELIVER IN PERSON|AIR|s haggle furiously after th +35366|1587|28|2|44|65497.52|0.06|0.02|N|O|1995-09-21|1995-08-15|1995-09-24|DELIVER IN PERSON|REG AIR|ly express id +35366|1705|90|3|45|72301.50|0.01|0.01|N|O|1995-10-10|1995-08-13|1995-11-02|DELIVER IN PERSON|REG AIR|n asymptotes towar +35366|1012|48|4|8|7304.08|0.07|0.07|N|O|1995-10-29|1995-09-26|1995-11-15|COLLECT COD|MAIL|ven accounts. f +35366|1457|97|5|40|54338.00|0.03|0.02|N|O|1995-07-18|1995-08-12|1995-08-13|TAKE BACK RETURN|SHIP|kly regular pinto beans detect accordi +35366|731|96|6|24|39161.52|0.05|0.07|N|O|1995-11-02|1995-09-07|1995-11-25|DELIVER IN PERSON|SHIP|refully alongside o +35367|1702|29|1|49|78581.30|0.10|0.07|N|O|1996-05-14|1996-05-18|1996-06-02|TAKE BACK RETURN|REG AIR|riously final deposits. regular epi +35367|1656|39|2|45|70094.25|0.09|0.05|N|O|1996-07-27|1996-05-11|1996-08-21|COLLECT COD|REG AIR| stealthy packages +35392|1902|91|1|10|18039.00|0.02|0.06|R|F|1992-06-13|1992-04-09|1992-07-12|NONE|SHIP|even pinto beans. carefully +35392|370|55|2|27|34299.99|0.08|0.05|A|F|1992-03-20|1992-04-24|1992-04-12|NONE|FOB|ns sleep until the ironica +35393|1458|37|1|15|20391.75|0.01|0.07|N|F|1995-06-11|1995-05-22|1995-06-24|COLLECT COD|TRUCK|ithely regular platelets haggle carefully +35394|1771|14|1|10|16727.70|0.04|0.06|N|O|1997-08-07|1997-07-07|1997-09-04|COLLECT COD|MAIL|. slyly ironic sauternes nag slyly +35394|334|91|2|27|33326.91|0.10|0.02|N|O|1997-07-16|1997-07-08|1997-07-27|DELIVER IN PERSON|REG AIR| quickly ironic deposits. bl +35394|41|17|3|10|9410.40|0.09|0.05|N|O|1997-07-24|1997-07-17|1997-08-23|TAKE BACK RETURN|RAIL|ng the unusual +35395|1646|29|1|16|24762.24|0.09|0.01|A|F|1994-05-10|1994-05-21|1994-05-18|DELIVER IN PERSON|FOB|c accounts. blithely even instru +35395|1665|89|2|31|48566.46|0.01|0.06|A|F|1994-05-18|1994-05-22|1994-06-07|COLLECT COD|TRUCK|ly slyly u +35395|747|80|3|3|4943.22|0.02|0.01|A|F|1994-06-01|1994-04-26|1994-06-06|TAKE BACK RETURN|SHIP|es are slyly. unusual pinto beans cajole q +35396|257|85|1|12|13887.00|0.01|0.01|N|O|1996-05-08|1996-04-11|1996-05-31|DELIVER IN PERSON|SHIP|usly regular depe +35396|435|65|2|44|58758.92|0.01|0.05|N|O|1996-06-28|1996-04-04|1996-07-08|COLLECT COD|TRUCK|uickly after the flu +35396|1617|18|3|4|6074.44|0.06|0.04|N|O|1996-04-23|1996-05-29|1996-05-20|NONE|MAIL|gular theod +35396|806|6|4|47|80219.60|0.01|0.04|N|O|1996-06-14|1996-04-30|1996-07-13|NONE|RAIL|lly ironic packages alo +35396|989|90|5|5|9449.90|0.00|0.07|N|O|1996-04-13|1996-05-11|1996-04-18|NONE|MAIL|osits. furiously e +35397|66|42|1|4|3864.24|0.07|0.00|N|O|1998-06-14|1998-06-21|1998-06-16|TAKE BACK RETURN|SHIP|r the carefully special instructi +35397|815|82|2|37|63484.97|0.04|0.03|N|O|1998-07-28|1998-06-27|1998-08-27|NONE|AIR|ent accounts. packages shall integra +35397|1557|98|3|15|21878.25|0.03|0.03|N|O|1998-09-08|1998-06-23|1998-10-08|DELIVER IN PERSON|MAIL|ording to the silent m +35398|453|12|1|36|48724.20|0.03|0.07|N|O|1997-01-19|1997-02-11|1997-01-27|DELIVER IN PERSON|TRUCK| pending deposits. furiously specia +35398|1555|56|2|35|50979.25|0.07|0.03|N|O|1996-12-19|1997-03-04|1997-01-17|TAKE BACK RETURN|MAIL| accounts use accordi +35398|583|84|3|17|25220.86|0.01|0.04|N|O|1996-12-24|1997-02-13|1997-01-08|COLLECT COD|TRUCK|r requests. blithely ironic accounts boost +35398|1100|36|4|27|27029.70|0.03|0.04|N|O|1997-01-22|1997-03-04|1997-02-05|NONE|REG AIR|kly final deposits wake furiou +35398|1338|39|5|27|33461.91|0.02|0.04|N|O|1997-01-04|1997-01-28|1997-02-03|COLLECT COD|RAIL|thely bold platelets. carefully i +35399|1479|58|1|8|11043.76|0.02|0.03|A|F|1995-05-06|1995-03-13|1995-05-13|COLLECT COD|FOB| quickly. theodolites wake about t +35399|1503|24|2|21|29494.50|0.02|0.01|A|F|1995-03-31|1995-04-21|1995-04-20|DELIVER IN PERSON|RAIL|ously ironic theodo +35399|1042|78|3|17|16031.68|0.02|0.08|R|F|1995-02-22|1995-03-31|1995-03-23|DELIVER IN PERSON|RAIL|ckages. slyly +35424|1889|19|1|43|77007.84|0.05|0.06|N|O|1996-01-06|1996-03-25|1996-01-20|DELIVER IN PERSON|REG AIR|blithely even de +35424|1292|93|2|46|54891.34|0.06|0.08|N|O|1996-03-26|1996-03-15|1996-04-22|COLLECT COD|SHIP| pinto beans use fu +35424|797|98|3|36|61120.44|0.06|0.08|N|O|1996-02-15|1996-03-08|1996-02-28|DELIVER IN PERSON|RAIL|efully iro +35424|800|65|4|36|61228.80|0.01|0.06|N|O|1996-03-18|1996-02-15|1996-04-15|DELIVER IN PERSON|MAIL|se quickly +35424|1518|99|5|17|24131.67|0.07|0.03|N|O|1996-01-14|1996-02-21|1996-01-26|TAKE BACK RETURN|RAIL|lites. unus +35424|740|5|6|34|55785.16|0.01|0.02|N|O|1996-01-17|1996-02-11|1996-01-23|DELIVER IN PERSON|AIR|ake above the close theodolites. bol +35424|533|34|7|41|58774.73|0.00|0.00|N|O|1996-01-15|1996-03-20|1996-01-18|DELIVER IN PERSON|MAIL| the quickly f +35425|1073|9|1|44|42859.08|0.00|0.01|A|F|1993-05-30|1993-05-24|1993-06-16|NONE|TRUCK|ructions should have to boost bli +35425|323|52|2|31|37922.92|0.00|0.00|A|F|1993-06-30|1993-06-27|1993-07-06|NONE|RAIL|g requests. ironic c +35425|355|40|3|20|25107.00|0.07|0.03|A|F|1993-06-01|1993-05-11|1993-06-13|COLLECT COD|RAIL| idly regula +35425|616|10|4|7|10616.27|0.01|0.03|R|F|1993-06-23|1993-06-19|1993-06-25|COLLECT COD|AIR|s shall have to serve bold excuses. expre +35425|576|37|5|44|64969.08|0.04|0.03|A|F|1993-06-17|1993-06-19|1993-07-08|NONE|SHIP|according to the ironic +35425|19|95|6|26|23894.26|0.02|0.03|R|F|1993-04-04|1993-06-26|1993-04-23|TAKE BACK RETURN|REG AIR|odolites sleep. caref +35425|956|91|7|2|3713.90|0.04|0.08|A|F|1993-04-26|1993-05-02|1993-05-11|TAKE BACK RETURN|TRUCK|lly even depos +35426|1906|39|1|2|3615.80|0.05|0.05|A|F|1994-01-25|1993-11-15|1994-02-18|TAKE BACK RETURN|REG AIR|he regular +35426|1249|61|2|48|55211.52|0.06|0.00|R|F|1994-01-21|1993-12-20|1994-02-18|DELIVER IN PERSON|SHIP|s haggle above the +35426|263|91|3|44|51183.44|0.04|0.02|A|F|1993-12-05|1993-11-30|1994-01-03|NONE|FOB|foxes. pending, special deposits boost qui +35427|1942|43|1|8|14751.52|0.05|0.05|N|O|1996-04-16|1996-04-22|1996-04-28|COLLECT COD|AIR| furiously even notornis de +35427|818|52|2|6|10312.86|0.09|0.05|N|O|1996-06-15|1996-05-14|1996-07-02|COLLECT COD|TRUCK| requests. even, e +35427|41|42|3|5|4705.20|0.05|0.07|N|O|1996-05-23|1996-05-19|1996-05-24|TAKE BACK RETURN|REG AIR|ully across the quickly +35427|1586|7|4|24|35701.92|0.08|0.08|N|O|1996-03-07|1996-05-04|1996-03-27|DELIVER IN PERSON|SHIP|tes; dogged +35428|201|29|1|33|36339.60|0.03|0.08|A|F|1992-06-14|1992-07-08|1992-06-16|COLLECT COD|MAIL| theodolites cajole quick +35428|351|52|2|19|23775.65|0.02|0.03|R|F|1992-06-13|1992-08-10|1992-06-28|COLLECT COD|SHIP|quests sleep about the deposits. blit +35428|456|57|3|42|56970.90|0.06|0.00|R|F|1992-09-01|1992-07-30|1992-09-22|DELIVER IN PERSON|SHIP|es sleep. furiously bold fo +35429|1343|82|1|8|9954.72|0.00|0.00|N|O|1997-01-14|1997-01-09|1997-02-12|DELIVER IN PERSON|REG AIR|ructions. slyly even dep +35429|1252|90|2|43|49589.75|0.08|0.05|N|O|1997-01-15|1997-01-04|1997-02-05|DELIVER IN PERSON|AIR|r requests sl +35430|206|7|1|30|33186.00|0.02|0.01|A|F|1993-07-21|1993-05-14|1993-08-18|COLLECT COD|MAIL|s sleep daringly furiously e +35430|432|91|2|27|35975.61|0.10|0.05|A|F|1993-03-27|1993-05-01|1993-04-16|NONE|RAIL|s. slyly final dolphins wa +35430|1957|2|3|31|57627.45|0.10|0.01|R|F|1993-03-27|1993-04-25|1993-04-08|TAKE BACK RETURN|MAIL|oss the accounts. enticing foxes nag slyl +35430|193|46|4|31|33888.89|0.10|0.01|A|F|1993-07-04|1993-06-02|1993-07-25|COLLECT COD|FOB|accounts. unusual packa +35430|286|68|5|43|51010.04|0.05|0.06|R|F|1993-07-14|1993-05-01|1993-08-04|COLLECT COD|REG AIR|s. deposits along the unus +35430|678|41|6|12|18944.04|0.04|0.01|A|F|1993-05-22|1993-05-30|1993-06-02|COLLECT COD|MAIL|ts are carefully pinto beans. +35431|757|54|1|43|71283.25|0.10|0.08|A|F|1995-03-08|1995-01-28|1995-04-04|NONE|REG AIR|dencies. enticing p +35431|1117|18|2|29|29525.19|0.00|0.08|A|F|1995-02-26|1995-02-14|1995-03-03|DELIVER IN PERSON|TRUCK|ously unusual +35431|186|87|3|21|22809.78|0.10|0.07|A|F|1994-12-25|1995-01-20|1995-01-10|TAKE BACK RETURN|REG AIR|ests. furiously pe +35456|549|50|1|34|49284.36|0.03|0.06|A|F|1993-02-01|1992-12-29|1993-02-24|DELIVER IN PERSON|TRUCK|ly. unusual, regular dependencies integrat +35456|1394|33|2|28|36270.92|0.03|0.07|A|F|1992-12-13|1993-01-22|1993-01-11|DELIVER IN PERSON|AIR|sts cajole blit +35456|143|70|3|44|45898.16|0.09|0.06|R|F|1993-01-12|1992-12-24|1993-02-05|COLLECT COD|FOB|integrate. accounts are evenly furiously +35456|417|76|4|15|19761.15|0.02|0.03|A|F|1992-11-20|1992-12-27|1992-11-29|COLLECT COD|MAIL|d requests eat about the fluffily regula +35456|1718|45|5|38|61548.98|0.01|0.03|A|F|1992-11-24|1992-12-14|1992-11-29|NONE|REG AIR|t the multipliers. i +35456|1500|1|6|24|33636.00|0.05|0.07|R|F|1992-12-02|1993-01-23|1992-12-28|TAKE BACK RETURN|REG AIR|ending, regu +35457|1108|45|1|44|44400.40|0.09|0.02|R|F|1995-01-23|1995-01-25|1995-02-10|DELIVER IN PERSON|SHIP|re after the +35457|444|32|2|37|49744.28|0.07|0.04|R|F|1995-01-03|1995-03-08|1995-01-11|TAKE BACK RETURN|SHIP|ng the fluffily fin +35457|1259|60|3|15|17403.75|0.10|0.00|A|F|1995-02-28|1995-01-13|1995-03-30|DELIVER IN PERSON|TRUCK|nic deposits. quick warthogs doub +35457|1429|47|4|30|39912.60|0.03|0.05|R|F|1995-01-16|1995-02-05|1995-02-13|COLLECT COD|REG AIR|cording to the dependencie +35457|1616|99|5|45|68292.45|0.00|0.00|A|F|1995-02-18|1995-01-25|1995-03-12|TAKE BACK RETURN|RAIL|gular theodolites after the furiously si +35457|201|29|6|31|34137.20|0.08|0.00|R|F|1994-12-09|1995-03-06|1995-01-03|DELIVER IN PERSON|REG AIR|as blithely +35458|286|41|1|39|46264.92|0.00|0.04|N|O|1996-12-10|1997-01-09|1997-01-07|DELIVER IN PERSON|RAIL|al packages sleep furiously quickly +35459|509|10|1|14|19733.00|0.04|0.04|N|O|1997-05-27|1997-06-30|1997-06-01|NONE|RAIL| accounts engage furiously regu +35459|199|26|2|6|6595.14|0.00|0.07|N|O|1997-06-25|1997-05-26|1997-07-12|DELIVER IN PERSON|FOB|pinto beans +35459|696|28|3|50|79834.50|0.00|0.06|N|O|1997-05-29|1997-05-29|1997-05-30|NONE|SHIP|lar requests ar +35460|1892|93|1|36|64580.04|0.02|0.07|R|F|1994-02-15|1994-02-02|1994-03-02|DELIVER IN PERSON|TRUCK|lithely. accounts about t +35460|1894|95|2|36|64652.04|0.10|0.00|A|F|1994-03-28|1994-01-26|1994-03-29|TAKE BACK RETURN|REG AIR|y silent instructions. iron +35460|1707|8|3|35|56304.50|0.02|0.02|R|F|1994-03-01|1994-02-18|1994-03-24|COLLECT COD|SHIP|ironic platelets c +35460|1742|85|4|25|41093.50|0.02|0.00|R|F|1993-12-10|1994-02-24|1993-12-21|TAKE BACK RETURN|RAIL|eans sleep always. slyly silent excuses ar +35460|731|28|5|38|62005.74|0.08|0.08|A|F|1994-03-25|1994-02-09|1994-04-15|NONE|MAIL| final deposits haggle; sly +35460|792|25|6|36|60940.44|0.03|0.04|R|F|1994-02-07|1994-01-29|1994-02-27|NONE|REG AIR|bout the carefully final requests are accor +35460|709|6|7|36|57949.20|0.02|0.06|R|F|1994-02-22|1994-01-08|1994-03-08|DELIVER IN PERSON|AIR|ironic packages according to t +35461|42|18|1|39|36739.56|0.03|0.07|R|F|1994-06-06|1994-07-22|1994-06-22|TAKE BACK RETURN|REG AIR|eodolites boost carefu +35461|923|58|2|24|43774.08|0.08|0.07|A|F|1994-08-11|1994-07-27|1994-09-02|NONE|FOB|fluffily accord +35461|988|57|3|20|37779.60|0.05|0.08|A|F|1994-08-18|1994-08-29|1994-09-06|COLLECT COD|RAIL|. silently express asymptotes cajole quic +35461|889|56|4|36|64435.68|0.01|0.05|R|F|1994-07-01|1994-07-21|1994-07-22|NONE|FOB|s packages wake slyly alongside of +35462|42|68|1|43|40507.72|0.06|0.03|N|O|1998-07-06|1998-08-24|1998-07-26|TAKE BACK RETURN|REG AIR|xpress accounts. carefully express +35462|958|93|2|25|46473.75|0.05|0.07|N|O|1998-09-12|1998-08-12|1998-09-26|COLLECT COD|REG AIR|iously bold req +35462|1041|77|3|47|44275.88|0.03|0.04|N|O|1998-10-02|1998-08-22|1998-10-29|DELIVER IN PERSON|AIR|ctions. regular, ironic frets h +35462|951|20|4|45|83337.75|0.07|0.07|N|O|1998-06-27|1998-08-13|1998-06-30|DELIVER IN PERSON|TRUCK|yly. account +35462|1595|36|5|32|47890.88|0.09|0.05|N|O|1998-07-25|1998-08-04|1998-08-13|DELIVER IN PERSON|FOB| fluffily bold accounts. carefull +35463|452|82|1|15|20286.75|0.09|0.04|N|O|1996-08-31|1996-08-01|1996-09-07|COLLECT COD|FOB|ly regular asymptotes. slyl +35463|1102|3|2|15|15046.50|0.04|0.02|N|O|1996-07-15|1996-08-01|1996-08-06|DELIVER IN PERSON|SHIP| the fluffily brave ideas. sl +35463|45|21|3|23|21735.92|0.09|0.00|N|O|1996-09-14|1996-08-12|1996-10-04|TAKE BACK RETURN|REG AIR|ng the slyly even accounts. care +35463|994|63|4|13|24634.87|0.08|0.07|N|O|1996-09-05|1996-08-25|1996-10-01|NONE|REG AIR|g realms. accounts boost blithely among t +35488|1762|63|1|28|46585.28|0.08|0.06|N|O|1995-10-28|1995-10-01|1995-11-27|DELIVER IN PERSON|SHIP|the blithely regular packages. blith +35488|1444|84|2|12|16145.28|0.04|0.03|N|O|1995-09-30|1995-10-24|1995-10-23|NONE|AIR|jole quickly along th +35488|794|59|3|48|81349.92|0.05|0.08|N|O|1995-11-10|1995-10-31|1995-12-05|TAKE BACK RETURN|TRUCK|nusual, brave pinto beans wake slyly s +35488|123|76|4|47|48086.64|0.00|0.03|N|O|1995-08-28|1995-10-21|1995-09-06|COLLECT COD|SHIP|dogged packages are. sil +35488|35|61|5|28|26180.84|0.00|0.02|N|O|1995-09-29|1995-10-12|1995-10-26|TAKE BACK RETURN|REG AIR|y regular +35488|1732|33|6|50|81686.50|0.09|0.02|N|O|1995-11-09|1995-11-02|1995-11-14|NONE|SHIP|ffily special, pending foxes-- fluffily reg +35489|167|68|1|3|3201.48|0.06|0.08|N|O|1998-07-02|1998-08-21|1998-07-20|NONE|REG AIR|ns. blithely regular asymptotes wake. +35489|1158|31|2|6|6354.90|0.08|0.06|N|O|1998-07-27|1998-08-04|1998-08-25|DELIVER IN PERSON|TRUCK|wake. fluffily final accou +35489|1481|21|3|9|12442.32|0.03|0.05|N|O|1998-07-06|1998-08-01|1998-07-10|NONE|AIR|instructions. regul +35489|208|63|4|6|6649.20|0.05|0.06|N|O|1998-08-18|1998-09-17|1998-09-07|NONE|FOB|le furiously. caref +35489|862|96|5|37|65225.82|0.01|0.01|N|O|1998-08-14|1998-09-07|1998-08-16|NONE|MAIL|ular deposits. bold depen +35489|1543|64|6|25|36113.50|0.10|0.06|N|O|1998-08-19|1998-07-22|1998-09-07|COLLECT COD|REG AIR|tes. blithely reg +35489|1158|59|7|24|25419.60|0.03|0.00|N|O|1998-07-21|1998-07-23|1998-08-18|COLLECT COD|RAIL|he doggedly ironic ide +35490|1538|19|1|35|50383.55|0.04|0.03|A|F|1994-02-23|1994-01-07|1994-03-12|DELIVER IN PERSON|TRUCK|lar requests wake carefully express asympto +35490|1287|62|2|36|42778.08|0.08|0.07|R|F|1994-03-04|1994-01-11|1994-03-05|TAKE BACK RETURN|SHIP|efully even dinos. reques +35490|305|62|3|22|26516.60|0.10|0.03|R|F|1994-03-14|1994-01-16|1994-03-31|DELIVER IN PERSON|AIR| furiously ironic +35490|1829|59|4|42|72694.44|0.00|0.00|A|F|1994-02-15|1994-02-09|1994-03-11|NONE|FOB|y silent pinto beans. speci +35490|332|89|5|41|50525.53|0.09|0.02|R|F|1994-03-05|1994-01-14|1994-03-19|NONE|RAIL|ular accounts cajole regular +35491|1780|23|1|5|8408.90|0.06|0.07|N|O|1996-10-13|1996-10-09|1996-11-11|DELIVER IN PERSON|TRUCK|uffily even accounts? ironic, regul +35492|934|35|1|13|23854.09|0.05|0.03|R|F|1992-05-26|1992-05-06|1992-05-30|TAKE BACK RETURN|REG AIR| final excuses +35492|301|30|2|28|33636.40|0.02|0.05|R|F|1992-05-30|1992-04-23|1992-06-02|DELIVER IN PERSON|SHIP|le carefully above the qui +35492|693|25|3|50|79684.50|0.10|0.02|R|F|1992-06-02|1992-03-26|1992-06-24|NONE|SHIP|es nag slyly against the f +35492|1242|54|4|10|11432.40|0.06|0.03|A|F|1992-05-18|1992-04-16|1992-06-12|COLLECT COD|AIR|quests cajole blithely along the final pint +35492|1050|51|5|31|29482.55|0.05|0.03|R|F|1992-02-26|1992-04-29|1992-03-26|NONE|TRUCK|ross the carefully i +35492|1887|74|6|28|50088.64|0.03|0.05|A|F|1992-04-07|1992-03-19|1992-04-15|COLLECT COD|REG AIR|yly unusua +35493|1772|57|1|14|23432.78|0.04|0.05|A|F|1994-07-31|1994-06-16|1994-08-12|TAKE BACK RETURN|SHIP|excuses integ +35494|1480|81|1|37|51114.76|0.03|0.07|R|F|1995-02-28|1995-04-23|1995-03-14|NONE|RAIL| even instructions h +35494|1465|44|2|7|9565.22|0.02|0.06|R|F|1995-02-23|1995-03-29|1995-03-02|TAKE BACK RETURN|SHIP|ly ironic foxes haggle blithel +35494|1670|71|3|29|45578.43|0.01|0.05|N|F|1995-05-29|1995-05-06|1995-06-20|TAKE BACK RETURN|SHIP|jole after the even +35494|643|75|4|34|52483.76|0.02|0.07|R|F|1995-03-01|1995-05-01|1995-03-21|DELIVER IN PERSON|TRUCK|osits are quickly pending ideas. slyly +35495|1627|10|1|11|16814.82|0.05|0.08|N|O|1997-07-23|1997-09-10|1997-07-29|NONE|RAIL|tions. enticingly ironic dependencies ar +35495|280|81|2|26|30687.28|0.07|0.05|N|O|1997-07-27|1997-09-18|1997-08-15|DELIVER IN PERSON|RAIL|o beans-- slyly bold req +35495|1883|70|3|28|49976.64|0.09|0.02|N|O|1997-08-14|1997-08-25|1997-08-30|NONE|SHIP|wake quickly carefully pend +35520|883|84|1|19|33893.72|0.03|0.01|N|O|1998-06-19|1998-03-31|1998-07-18|COLLECT COD|SHIP|ly even excuses h +35521|651|83|1|50|77582.50|0.00|0.07|N|O|1996-05-20|1996-06-08|1996-06-17|TAKE BACK RETURN|RAIL|usly final ideas dazzle fluffily ironic ac +35521|1453|93|2|8|10835.60|0.05|0.04|N|O|1996-06-12|1996-05-03|1996-07-03|NONE|SHIP|lar requests across the slyly unusual +35521|297|98|3|22|26340.38|0.06|0.01|N|O|1996-05-03|1996-05-15|1996-05-26|TAKE BACK RETURN|FOB| quickly regula +35521|1082|88|4|45|44238.60|0.02|0.06|N|O|1996-07-14|1996-06-07|1996-08-03|DELIVER IN PERSON|MAIL|ross the quickly unusual d +35522|1749|50|1|37|61077.38|0.08|0.02|A|F|1993-11-07|1993-11-27|1993-11-13|DELIVER IN PERSON|REG AIR|hins. special packages wake sometimes. flu +35522|1559|60|2|11|16066.05|0.05|0.00|R|F|1993-12-01|1993-12-25|1993-12-26|DELIVER IN PERSON|SHIP|ly unusual requests integrate c +35523|1925|70|1|45|82211.40|0.05|0.00|N|O|1996-09-07|1996-08-15|1996-09-15|NONE|SHIP|nt requests use slyly final request +35524|484|43|1|1|1384.48|0.09|0.08|N|O|1997-08-16|1997-08-19|1997-08-19|DELIVER IN PERSON|AIR|excuses. courts cajole +35524|149|28|2|1|1049.14|0.00|0.00|N|O|1997-08-18|1997-09-26|1997-09-06|COLLECT COD|SHIP|eodolites. furiously even +35525|425|26|1|41|54342.22|0.07|0.00|N|O|1996-02-18|1995-12-25|1996-03-02|DELIVER IN PERSON|REG AIR|, ironic foxes nag outside the caref +35525|594|85|2|4|5978.36|0.04|0.01|N|O|1996-03-02|1996-01-17|1996-03-21|TAKE BACK RETURN|SHIP|ounts. ironically +35525|1788|15|3|44|74350.32|0.01|0.01|N|O|1996-01-11|1996-01-31|1996-02-04|NONE|FOB|s are furiously even water +35525|487|17|4|39|54111.72|0.00|0.02|N|O|1996-02-12|1996-01-29|1996-02-28|DELIVER IN PERSON|TRUCK|counts. pendi +35526|1949|50|1|16|29615.04|0.10|0.06|N|O|1996-09-30|1996-09-09|1996-10-06|COLLECT COD|FOB|ajole quickly pending, even +35526|234|16|2|29|32892.67|0.02|0.02|N|O|1996-10-03|1996-10-01|1996-10-17|COLLECT COD|AIR|g the bold accounts. theodolites are +35527|1076|77|1|27|26380.89|0.06|0.05|R|F|1993-07-18|1993-06-17|1993-08-06|NONE|AIR|busy, regular patterns dou +35527|2000|89|2|2|1804.00|0.02|0.03|A|F|1993-08-03|1993-07-10|1993-09-02|NONE|FOB| even deposits; +35552|1410|50|1|3|3934.23|0.03|0.08|N|O|1997-06-23|1997-06-12|1997-07-13|TAKE BACK RETURN|TRUCK|y regular dep +35552|843|43|2|24|41852.16|0.03|0.01|N|O|1997-04-26|1997-05-09|1997-05-11|NONE|TRUCK|even requests wake blith +35552|1351|28|3|25|31308.75|0.10|0.00|N|O|1997-06-17|1997-05-27|1997-06-21|COLLECT COD|MAIL|. pending, regular packages boost furiously +35552|640|34|4|24|36975.36|0.03|0.00|N|O|1997-04-13|1997-06-27|1997-05-04|DELIVER IN PERSON|AIR|according to the quickly idle deposits +35552|1000|1|5|3|2703.00|0.00|0.03|N|O|1997-05-23|1997-06-17|1997-06-02|TAKE BACK RETURN|RAIL|tornis. blithely unusual platelets +35553|1363|2|1|10|12643.60|0.06|0.08|R|F|1993-06-25|1993-05-04|1993-07-03|DELIVER IN PERSON|RAIL|ithely regular dolphins p +35554|313|42|1|46|55812.26|0.09|0.01|R|F|1992-12-18|1992-11-19|1993-01-16|NONE|TRUCK|ut the carefully +35554|1886|16|2|30|53636.40|0.03|0.00|R|F|1992-09-30|1992-11-14|1992-10-14|DELIVER IN PERSON|MAIL|eep blithely abov +35555|433|92|1|9|12000.87|0.10|0.08|N|O|1995-06-29|1995-04-08|1995-07-21|NONE|RAIL|bout the carefully bold brai +35555|922|91|2|17|30989.64|0.09|0.05|A|F|1995-04-13|1995-05-22|1995-04-22|NONE|AIR|special ideas wake carefully a +35555|127|28|3|30|30813.60|0.03|0.01|R|F|1995-03-16|1995-05-01|1995-04-13|NONE|AIR|es. pinto beans wake bold +35555|1938|27|4|38|69917.34|0.08|0.05|R|F|1995-03-26|1995-04-10|1995-04-16|TAKE BACK RETURN|RAIL|ven deposits according to the carefully +35556|19|70|1|25|22975.25|0.00|0.03|N|O|1997-07-24|1997-06-17|1997-08-19|COLLECT COD|REG AIR|kages behind the slyly iron +35556|853|87|2|17|29815.45|0.04|0.06|N|O|1997-06-01|1997-06-30|1997-06-02|NONE|REG AIR| theodolites. requests haggle slyly f +35556|919|22|3|31|56417.21|0.04|0.04|N|O|1997-05-18|1997-06-29|1997-06-08|NONE|REG AIR| express, perman +35556|1122|95|4|41|41947.92|0.02|0.08|N|O|1997-07-24|1997-06-03|1997-08-23|NONE|MAIL|gular platelets nag brav +35556|1206|44|5|35|38752.00|0.10|0.08|N|O|1997-05-06|1997-07-01|1997-05-18|TAKE BACK RETURN|REG AIR|ggle furiously blithe deposit +35556|143|96|6|33|34423.62|0.02|0.00|N|O|1997-07-07|1997-06-02|1997-07-31|TAKE BACK RETURN|TRUCK|e furiously close ex +35556|1690|32|7|48|76401.12|0.07|0.02|N|O|1997-05-04|1997-05-30|1997-05-27|NONE|REG AIR|dencies haggle +35557|1876|63|1|3|5333.61|0.04|0.03|R|F|1994-03-11|1994-04-05|1994-04-08|DELIVER IN PERSON|MAIL|across the blithely exp +35557|264|46|2|49|57048.74|0.07|0.01|R|F|1994-04-08|1994-04-19|1994-05-01|NONE|REG AIR| slyly. deposits cajole car +35557|1060|96|3|48|46130.88|0.07|0.01|A|F|1994-06-10|1994-05-06|1994-06-19|NONE|TRUCK|ecial excuses +35557|138|17|4|28|29067.64|0.05|0.00|R|F|1994-04-25|1994-04-10|1994-05-12|TAKE BACK RETURN|SHIP|about the slyly ironic accounts. quiet +35557|287|88|5|22|26120.16|0.00|0.02|A|F|1994-04-26|1994-04-25|1994-05-04|COLLECT COD|SHIP|y quiet accounts wake idly blithely speci +35558|1181|90|1|49|53026.82|0.02|0.04|A|F|1994-12-21|1994-11-28|1994-12-29|DELIVER IN PERSON|FOB|yly. blithely special packages cajole qui +35558|1211|23|2|28|31141.88|0.00|0.01|R|F|1994-12-19|1994-10-21|1995-01-06|NONE|MAIL|zzle furiously regular, si +35558|671|34|3|28|44006.76|0.07|0.02|R|F|1995-01-03|1994-10-28|1995-01-23|COLLECT COD|MAIL|n foxes haggle about the e +35559|1738|81|1|28|45912.44|0.01|0.05|N|O|1998-06-19|1998-05-12|1998-07-07|COLLECT COD|AIR|c deposits haggle. unusua +35584|116|95|1|1|1016.11|0.06|0.08|N|O|1995-07-04|1995-07-19|1995-07-06|COLLECT COD|TRUCK|althily. slyly even accounts +35584|1033|4|2|20|18680.60|0.10|0.02|N|O|1995-07-23|1995-06-27|1995-07-28|COLLECT COD|FOB|nal deposits could are among t +35584|684|47|3|43|68141.24|0.00|0.04|R|F|1995-05-16|1995-07-21|1995-05-20|COLLECT COD|MAIL|ily quickly fin +35585|957|58|1|24|44590.80|0.01|0.02|N|O|1997-10-20|1997-09-08|1997-11-11|COLLECT COD|AIR|ress dolphins believe. bli +35585|1061|32|2|27|25975.62|0.01|0.04|N|O|1997-10-09|1997-08-11|1997-10-20|TAKE BACK RETURN|FOB| carefully regular ideas run. quickly iro +35585|100|26|3|1|1000.10|0.02|0.06|N|O|1997-08-03|1997-09-09|1997-08-05|NONE|FOB|sual instructions are. furiously even pinto +35585|37|13|4|27|25299.81|0.07|0.05|N|O|1997-09-04|1997-08-31|1997-09-28|TAKE BACK RETURN|RAIL|c deposits. reg +35585|1355|56|5|5|6281.75|0.01|0.00|N|O|1997-08-03|1997-08-08|1997-08-08|NONE|RAIL| blithely blithe +35586|1419|98|1|7|9242.87|0.09|0.08|N|O|1996-11-23|1996-12-28|1996-12-05|NONE|REG AIR|uses according t +35586|253|81|2|25|28831.25|0.07|0.05|N|O|1996-12-20|1997-01-18|1997-01-15|TAKE BACK RETURN|MAIL|ly silent epitaphs +35586|133|86|3|2|2066.26|0.03|0.08|N|O|1996-10-30|1997-01-21|1996-11-24|NONE|REG AIR| integrate above the boldly +35586|1831|75|4|31|53717.73|0.00|0.00|N|O|1996-11-22|1996-11-29|1996-12-10|DELIVER IN PERSON|AIR|ely even requests +35586|1821|51|5|36|62021.52|0.05|0.02|N|O|1996-11-13|1996-12-31|1996-12-04|DELIVER IN PERSON|REG AIR|eas should impress a +35586|757|54|6|32|53048.00|0.10|0.05|N|O|1997-02-03|1996-12-17|1997-02-25|NONE|TRUCK|haggle busily carefull +35586|389|46|7|50|64469.00|0.04|0.02|N|O|1996-12-04|1996-12-02|1996-12-06|DELIVER IN PERSON|MAIL| the ironic theodolites. bold reque +35587|1777|78|1|45|75544.65|0.06|0.07|N|O|1996-02-22|1996-02-01|1996-02-26|NONE|FOB|ets. fluffily final pinto beans g +35587|1226|38|2|20|22544.40|0.05|0.04|N|O|1995-12-12|1996-01-03|1995-12-20|TAKE BACK RETURN|TRUCK|packages haggle. regu +35587|1528|49|3|46|65757.92|0.02|0.07|N|O|1995-11-13|1996-02-06|1995-11-20|TAKE BACK RETURN|RAIL|ic, bold dependencies sleep +35587|1140|49|4|29|30193.06|0.07|0.08|N|O|1996-02-03|1995-12-24|1996-02-10|TAKE BACK RETURN|RAIL|sleep. unusual packages engage blithely +35587|1463|42|5|9|12280.14|0.02|0.01|N|O|1996-01-18|1996-01-03|1996-02-10|DELIVER IN PERSON|TRUCK| requests wak +35588|235|17|1|9|10217.07|0.07|0.04|A|F|1993-08-01|1993-08-05|1993-08-10|DELIVER IN PERSON|SHIP|refully final instructions. slyly regu +35588|665|28|2|29|45404.14|0.05|0.03|R|F|1993-07-20|1993-07-31|1993-07-22|COLLECT COD|FOB|arefully quickly express pac +35588|1798|83|3|19|32296.01|0.05|0.07|A|F|1993-07-17|1993-09-10|1993-08-14|NONE|FOB|ar requests nag slyly slyly iron +35588|1109|10|4|41|41414.10|0.08|0.03|A|F|1993-08-15|1993-08-16|1993-08-20|DELIVER IN PERSON|RAIL|ages cajole furiously above the furiou +35589|854|54|1|45|78968.25|0.00|0.03|A|F|1994-02-03|1994-02-14|1994-02-16|NONE|REG AIR|counts are blithely quick +35589|734|31|2|12|19616.76|0.04|0.04|A|F|1994-01-12|1994-03-18|1994-02-08|DELIVER IN PERSON|FOB|gular requests cajole quick +35589|225|80|3|29|32631.38|0.01|0.02|R|F|1994-01-31|1994-02-20|1994-02-08|DELIVER IN PERSON|FOB|ide of the bravely even accounts. +35589|574|75|4|27|39813.39|0.09|0.06|A|F|1994-04-18|1994-03-07|1994-04-20|DELIVER IN PERSON|FOB|nwind. blithely pending +35589|325|54|5|13|15929.16|0.10|0.06|R|F|1994-03-30|1994-03-03|1994-04-02|DELIVER IN PERSON|TRUCK|quick requests print carefully among +35589|1672|96|6|20|31473.40|0.08|0.02|R|F|1994-04-07|1994-03-24|1994-04-23|TAKE BACK RETURN|REG AIR| regular deposits. furiously even packa +35590|1502|3|1|28|39298.00|0.07|0.05|A|F|1993-01-05|1993-01-04|1993-02-02|TAKE BACK RETURN|REG AIR|ven accounts ha +35590|1002|73|2|19|17157.00|0.06|0.01|R|F|1993-02-04|1993-01-31|1993-02-11|COLLECT COD|SHIP|hely. bold, regular packages w +35590|693|94|3|3|4781.07|0.02|0.04|R|F|1992-12-18|1993-02-01|1993-01-17|DELIVER IN PERSON|SHIP| theodolites. frets cajole fluffi +35590|1865|52|4|44|77741.84|0.10|0.07|A|F|1993-02-02|1993-02-06|1993-02-24|DELIVER IN PERSON|SHIP| slyly unusual foxes abov +35590|1848|49|5|18|31497.12|0.02|0.05|R|F|1992-12-31|1993-01-26|1993-01-27|TAKE BACK RETURN|REG AIR|ly. furiously even requests ar +35590|1153|54|6|5|5270.75|0.07|0.07|A|F|1993-01-20|1993-01-30|1993-01-27|COLLECT COD|REG AIR|e furiously slyly pending packages. re +35590|1488|89|7|45|62526.60|0.05|0.00|A|F|1992-12-14|1993-01-19|1992-12-28|DELIVER IN PERSON|FOB|e furiously regu +35591|456|57|1|8|10851.60|0.07|0.01|N|O|1997-02-05|1997-02-23|1997-02-10|NONE|MAIL|at slyly. fluf +35591|365|22|2|44|55675.84|0.01|0.07|N|O|1997-01-07|1997-03-18|1997-01-28|TAKE BACK RETURN|MAIL|stealthily along the boldly iron +35591|1650|92|3|21|32584.65|0.00|0.01|N|O|1997-01-25|1997-02-25|1997-01-30|COLLECT COD|TRUCK|ng the fluffily enticin +35591|117|44|4|24|24410.64|0.06|0.00|N|O|1997-01-17|1997-03-18|1997-01-18|COLLECT COD|MAIL|posits. express depo +35591|544|5|5|20|28890.80|0.01|0.07|N|O|1997-01-13|1997-02-26|1997-02-02|NONE|AIR|l accounts are +35591|960|61|6|2|3721.92|0.10|0.08|N|O|1997-03-17|1997-01-31|1997-03-23|COLLECT COD|REG AIR| ironic theodolites caj +35591|440|28|7|10|13404.40|0.00|0.08|N|O|1997-02-16|1997-03-06|1997-03-15|DELIVER IN PERSON|MAIL|uests use according to the eve +35616|1064|65|1|21|20266.26|0.07|0.00|R|F|1993-02-11|1993-02-09|1993-02-16|DELIVER IN PERSON|FOB|e for the packages. fluf +35617|1298|99|1|9|10793.61|0.08|0.01|R|F|1995-04-08|1995-04-04|1995-04-15|TAKE BACK RETURN|FOB| requests accord +35618|1064|35|1|18|17371.08|0.00|0.04|N|O|1996-06-05|1996-05-24|1996-07-03|DELIVER IN PERSON|REG AIR|nst the furiously even instruc +35618|815|49|2|6|10294.86|0.02|0.07|N|O|1996-04-30|1996-04-08|1996-05-28|NONE|SHIP|s haggle foxes. furiously silent de +35618|1741|26|3|35|57495.90|0.10|0.03|N|O|1996-05-17|1996-04-26|1996-06-08|DELIVER IN PERSON|REG AIR|. bold, regular platelets are +35618|1442|60|4|31|41646.64|0.04|0.03|N|O|1996-06-12|1996-04-17|1996-07-01|COLLECT COD|SHIP|c dolphins play ev +35618|1621|4|5|30|45678.60|0.02|0.07|N|O|1996-04-06|1996-05-11|1996-04-27|COLLECT COD|FOB|ending instructions +35619|1110|83|1|17|17188.87|0.06|0.01|N|O|1996-08-03|1996-07-04|1996-08-19|NONE|RAIL|sly final r +35619|73|99|2|25|24326.75|0.00|0.00|N|O|1996-07-04|1996-06-11|1996-07-15|TAKE BACK RETURN|FOB|ily express requests are sometimes silen +35619|903|72|3|22|39685.80|0.10|0.02|N|O|1996-08-07|1996-07-12|1996-08-15|TAKE BACK RETURN|MAIL|cial, slow instruc +35619|310|95|4|24|29047.44|0.02|0.07|N|O|1996-05-20|1996-08-06|1996-05-27|COLLECT COD|REG AIR|s. accounts use. slyly final theodolites na +35619|800|33|5|22|37417.60|0.02|0.02|N|O|1996-08-10|1996-06-29|1996-09-08|NONE|RAIL|s. blithely bold packa +35619|1125|34|6|29|29757.48|0.04|0.03|N|O|1996-08-03|1996-07-17|1996-08-13|DELIVER IN PERSON|RAIL|asymptotes affi +35620|1288|26|1|27|32110.56|0.02|0.01|N|O|1996-08-19|1996-10-17|1996-09-11|DELIVER IN PERSON|MAIL|nt dependencies sleep neve +35620|1788|89|2|38|64211.64|0.08|0.01|N|O|1996-11-28|1996-09-09|1996-12-03|NONE|REG AIR|express deposits. furiously final accou +35620|1152|53|3|25|26328.75|0.05|0.03|N|O|1996-10-16|1996-09-16|1996-11-08|COLLECT COD|REG AIR| slyly along the furiously care +35620|1373|74|4|3|3823.11|0.08|0.05|N|O|1996-11-10|1996-09-24|1996-11-14|NONE|RAIL|ly regular platele +35621|1354|55|1|48|60256.80|0.03|0.01|R|F|1995-03-13|1995-02-15|1995-03-17|NONE|RAIL|ending theodolites. +35621|1584|5|2|49|72793.42|0.10|0.00|R|F|1995-04-08|1995-01-23|1995-04-18|NONE|REG AIR|fully according to the furiously bold asy +35622|1599|40|1|35|52520.65|0.08|0.08|N|O|1998-09-11|1998-08-27|1998-10-07|DELIVER IN PERSON|AIR|equests. slyly ironic instruction +35622|920|55|2|11|20030.12|0.02|0.02|N|O|1998-06-16|1998-07-31|1998-07-10|NONE|RAIL|final packages solve. unusual, bold asympt +35623|1090|26|1|42|41625.78|0.01|0.03|N|O|1996-03-31|1996-04-01|1996-04-16|NONE|AIR|uickly against the pending theodol +35623|1186|87|2|28|30441.04|0.09|0.07|N|O|1996-04-16|1996-05-27|1996-04-29|COLLECT COD|SHIP|usual courts +35623|527|28|3|10|14275.20|0.02|0.01|N|O|1996-06-13|1996-04-13|1996-07-09|TAKE BACK RETURN|REG AIR|along the slyly ironic a +35623|1104|5|4|25|25127.50|0.01|0.08|N|O|1996-06-01|1996-04-22|1996-06-23|COLLECT COD|RAIL|lly special accounts use after t +35648|582|13|1|18|26686.44|0.01|0.08|N|O|1998-04-30|1998-02-18|1998-05-02|DELIVER IN PERSON|SHIP|ss ideas haggle. furiou +35648|1115|88|2|25|25402.75|0.02|0.06|N|O|1998-02-08|1998-03-16|1998-02-26|TAKE BACK RETURN|AIR|dependencies. carefully even dep +35648|1450|90|3|30|40543.50|0.10|0.02|N|O|1998-04-19|1998-04-13|1998-05-18|COLLECT COD|RAIL|gainst the ironic requests. quickly pen +35649|350|35|1|35|43762.25|0.06|0.08|N|O|1995-11-18|1995-11-27|1995-12-08|COLLECT COD|AIR|to beans wake furiously about the slyl +35649|361|62|2|6|7568.16|0.06|0.07|N|O|1995-12-18|1995-11-20|1995-12-31|COLLECT COD|FOB|ely ironic deposits. carefully spe +35649|714|79|3|11|17761.81|0.05|0.06|N|O|1996-01-27|1995-12-10|1996-02-01|NONE|RAIL|heodolites are furiously eve +35649|1752|95|4|35|57881.25|0.00|0.01|N|O|1996-02-02|1995-11-29|1996-03-02|TAKE BACK RETURN|TRUCK|. blithely final notorni +35649|1029|30|5|3|2790.06|0.09|0.07|N|O|1995-11-06|1995-11-27|1995-11-14|TAKE BACK RETURN|MAIL|sly ironic accounts play careful +35649|1173|10|6|5|5370.85|0.01|0.04|N|O|1995-10-20|1995-12-18|1995-11-15|TAKE BACK RETURN|FOB|fily ironic, special orbits. dep +35650|497|85|1|31|43322.19|0.07|0.04|N|O|1996-11-11|1996-10-28|1996-12-10|COLLECT COD|TRUCK|s. carefully regular packages accor +35650|1504|85|2|6|8433.00|0.07|0.07|N|O|1996-11-27|1996-10-30|1996-12-06|NONE|RAIL|nstructions: regular depen +35650|107|8|3|22|22156.20|0.10|0.08|N|O|1996-12-13|1996-11-08|1996-12-22|COLLECT COD|FOB|eposits. blithely bold mult +35650|583|44|4|14|20770.12|0.09|0.02|N|O|1996-09-30|1996-10-04|1996-10-01|DELIVER IN PERSON|TRUCK|ual pinto beans are. furiously silent instr +35650|1747|48|5|2|3297.48|0.06|0.03|N|O|1996-11-03|1996-10-08|1996-11-16|DELIVER IN PERSON|FOB|ts wake fluffily. final acc +35650|271|26|6|36|42165.72|0.06|0.04|N|O|1996-10-20|1996-11-14|1996-11-06|NONE|RAIL|ly final accounts. regular excuses do +35650|1786|13|7|31|52321.18|0.06|0.04|N|O|1996-09-25|1996-10-10|1996-10-21|COLLECT COD|REG AIR| express r +35651|381|66|1|49|62787.62|0.02|0.02|N|O|1998-09-19|1998-07-14|1998-09-20|NONE|MAIL|. dogged, idle +35651|1332|9|2|37|45633.21|0.08|0.02|N|O|1998-08-22|1998-08-06|1998-09-19|COLLECT COD|REG AIR| even instructions. quickly express ins +35651|1158|59|3|26|27537.90|0.05|0.00|N|O|1998-10-07|1998-08-23|1998-10-31|TAKE BACK RETURN|MAIL|s the quick +35651|154|33|4|45|47436.75|0.00|0.08|N|O|1998-07-07|1998-08-18|1998-08-02|TAKE BACK RETURN|AIR| of the busily final f +35651|518|9|5|6|8511.06|0.05|0.00|N|O|1998-09-02|1998-08-16|1998-09-29|NONE|TRUCK|arefully. final instruc +35651|1336|75|6|34|42069.22|0.04|0.08|N|O|1998-07-05|1998-07-24|1998-07-07|COLLECT COD|MAIL|e at the ironic, unusual theodolites. +35651|1700|83|7|38|60864.60|0.02|0.07|N|O|1998-08-09|1998-09-01|1998-08-15|TAKE BACK RETURN|MAIL|nt theodolites use along the car +35652|407|8|1|41|53603.40|0.07|0.07|A|F|1993-12-26|1993-10-29|1993-12-28|COLLECT COD|REG AIR|uickly regular pinto beans +35652|1013|84|2|49|44786.49|0.00|0.06|R|F|1993-09-29|1993-12-08|1993-10-13|NONE|TRUCK|egular accounts. careful +35652|1040|76|3|34|31995.36|0.00|0.06|A|F|1993-11-10|1993-11-08|1993-11-18|DELIVER IN PERSON|MAIL|ach. blithely ironic theodolites +35652|1954|99|4|20|37119.00|0.05|0.04|R|F|1993-11-29|1993-12-21|1993-12-01|DELIVER IN PERSON|FOB|ve the blithely +35652|1060|61|5|26|24987.56|0.07|0.02|A|F|1993-10-30|1993-12-05|1993-11-03|TAKE BACK RETURN|REG AIR|r theodolites. platele +35652|889|90|6|16|28638.08|0.10|0.06|R|F|1994-01-18|1993-11-15|1994-02-03|TAKE BACK RETURN|RAIL|lar accounts. slyly special req +35652|1182|55|7|44|47659.92|0.09|0.07|A|F|1993-10-24|1993-10-26|1993-11-20|TAKE BACK RETURN|REG AIR|carefully ironic requests +35653|10|11|1|20|18200.20|0.07|0.01|N|O|1996-10-01|1996-08-18|1996-10-06|COLLECT COD|AIR|. slyly express instruc +35653|235|17|2|17|19298.91|0.02|0.06|N|O|1996-06-20|1996-08-18|1996-07-01|DELIVER IN PERSON|RAIL|ely special re +35654|701|66|1|22|35237.40|0.01|0.03|N|O|1995-12-08|1995-10-18|1995-12-09|COLLECT COD|MAIL|structions sleep f +35654|1050|56|2|2|1902.10|0.04|0.05|N|O|1995-12-17|1995-10-13|1995-12-26|TAKE BACK RETURN|SHIP|structions nod. c +35654|1315|92|3|29|35272.99|0.07|0.08|N|O|1995-10-12|1995-11-22|1995-10-25|COLLECT COD|TRUCK|ding to the dogged requests must boost ca +35655|536|27|1|9|12928.77|0.05|0.08|N|O|1998-11-03|1998-08-31|1998-11-18|NONE|FOB|uriously against +35680|751|84|1|29|47900.75|0.10|0.05|N|O|1996-05-25|1996-04-16|1996-06-09|DELIVER IN PERSON|AIR|ckages are carefully +35680|867|34|2|8|14142.88|0.04|0.05|N|O|1996-03-23|1996-05-01|1996-04-08|DELIVER IN PERSON|AIR|longside of the ironic, unusual plat +35681|1504|45|1|30|42165.00|0.07|0.03|N|O|1997-10-15|1997-10-26|1997-10-26|NONE|RAIL|al requests. doggedly +35681|209|37|2|33|36603.60|0.05|0.07|N|O|1997-12-16|1997-10-28|1998-01-15|TAKE BACK RETURN|RAIL|de of the regularly even realms. +35682|1376|77|1|43|54926.91|0.00|0.03|A|F|1994-07-27|1994-10-01|1994-08-12|NONE|SHIP|boldly against the carefully unu +35682|481|69|2|9|12433.32|0.07|0.04|A|F|1994-08-09|1994-08-29|1994-09-08|DELIVER IN PERSON|RAIL|nal deposits snooze carefully. reg +35682|1391|68|3|12|15508.68|0.09|0.05|R|F|1994-10-09|1994-09-02|1994-10-21|TAKE BACK RETURN|MAIL|ccording to the slyly regular accounts. flu +35682|777|78|4|21|35233.17|0.01|0.07|R|F|1994-07-27|1994-09-10|1994-07-28|NONE|MAIL| wake slyly. ruthlessly bold t +35682|246|28|5|12|13754.88|0.10|0.03|R|F|1994-09-01|1994-08-29|1994-09-02|NONE|TRUCK|uickly. quickly pen +35682|1229|30|6|44|49729.68|0.04|0.07|R|F|1994-09-12|1994-08-27|1994-10-09|TAKE BACK RETURN|SHIP|lent foxes. bold foxes detect. care +35682|574|5|7|41|60457.37|0.10|0.01|R|F|1994-11-03|1994-09-17|1994-11-26|TAKE BACK RETURN|FOB|es around the ironic platelets +35683|40|16|1|45|42301.80|0.00|0.05|N|O|1997-11-23|1997-11-07|1997-12-22|DELIVER IN PERSON|MAIL|aggle regular instructions. unusua +35683|131|84|2|7|7217.91|0.04|0.06|N|O|1997-12-21|1997-12-05|1998-01-09|COLLECT COD|FOB|ag around the dependencies. fur +35683|812|12|3|32|54809.92|0.02|0.07|N|O|1997-10-18|1997-10-29|1997-11-02|DELIVER IN PERSON|TRUCK|nts. regular, bold requests +35683|723|24|4|8|12989.76|0.08|0.05|N|O|1998-01-14|1997-11-28|1998-01-27|TAKE BACK RETURN|FOB|, regular accounts. slyly final a +35684|229|11|1|22|24842.84|0.07|0.00|N|O|1995-10-18|1995-10-27|1995-11-12|TAKE BACK RETURN|REG AIR|otes cajole furiously ev +35684|87|38|2|40|39483.20|0.02|0.00|N|O|1995-11-03|1995-10-12|1995-11-18|DELIVER IN PERSON|SHIP|y. quickly final ideas +35684|1403|43|3|27|35218.80|0.00|0.08|N|O|1995-10-29|1995-10-02|1995-11-17|DELIVER IN PERSON|MAIL|gular excuses wak +35684|149|76|4|35|36719.90|0.02|0.00|N|O|1995-09-03|1995-10-11|1995-09-25|TAKE BACK RETURN|RAIL|latelets? express deposit +35685|139|18|1|41|42604.33|0.01|0.05|R|F|1994-11-30|1995-01-01|1994-12-14|DELIVER IN PERSON|TRUCK|ly quiet asymptotes nag agains +35686|1548|69|1|1|1449.54|0.08|0.01|A|F|1994-01-24|1993-12-08|1994-02-20|DELIVER IN PERSON|FOB| instructions. final +35686|262|90|2|36|41841.36|0.01|0.07|R|F|1994-01-29|1993-11-13|1994-02-06|COLLECT COD|SHIP|s whithout the blithely i +35686|796|97|3|47|79749.13|0.01|0.01|R|F|1994-01-23|1993-11-21|1994-02-19|TAKE BACK RETURN|AIR|sits cajole furiousl +35687|1409|10|1|16|20966.40|0.04|0.01|N|O|1996-01-29|1995-12-29|1996-02-06|DELIVER IN PERSON|RAIL|ts detect furiously. pe +35687|1837|24|2|46|79986.18|0.07|0.05|N|O|1995-11-22|1996-01-24|1995-12-09|DELIVER IN PERSON|RAIL|ies use fluffily +35687|1718|3|3|11|17816.81|0.08|0.08|N|O|1995-12-18|1996-01-09|1996-01-02|DELIVER IN PERSON|FOB|n requests. pending, +35687|1776|77|4|39|65433.03|0.10|0.08|N|O|1996-02-23|1996-01-14|1996-03-07|NONE|RAIL|ep blithely. dolphins +35712|107|60|1|43|43305.30|0.10|0.06|R|F|1993-01-10|1992-12-12|1993-02-07|NONE|RAIL|yly special excuse +35712|1757|100|2|6|9952.50|0.04|0.04|A|F|1993-01-21|1993-01-17|1993-01-22|TAKE BACK RETURN|SHIP|ts haggle sly +35712|1889|90|3|35|62680.80|0.07|0.08|A|F|1992-11-18|1992-12-25|1992-12-01|COLLECT COD|TRUCK|osits wake always even deposi +35712|47|23|4|39|36934.56|0.02|0.05|A|F|1992-12-07|1993-01-09|1993-01-04|DELIVER IN PERSON|REG AIR|press ideas above the furious +35712|1471|72|5|46|63133.62|0.10|0.04|R|F|1992-12-05|1992-12-21|1992-12-13|COLLECT COD|FOB|ckly unusual foxes are bli +35713|1662|45|1|9|14072.94|0.06|0.02|R|F|1992-12-15|1993-01-05|1993-01-12|DELIVER IN PERSON|MAIL|counts. pinto beans a +35714|718|19|1|8|12949.68|0.06|0.07|N|O|1997-05-18|1997-06-09|1997-05-22|TAKE BACK RETURN|TRUCK|r ideas sleep. furiously +35714|985|20|2|47|88641.06|0.00|0.08|N|O|1997-07-23|1997-05-27|1997-08-14|COLLECT COD|REG AIR|onic instructions sleep. carefully +35714|1970|15|3|6|11231.82|0.07|0.02|N|O|1997-05-15|1997-05-26|1997-06-01|DELIVER IN PERSON|SHIP| requests are pending warthogs. e +35714|612|75|4|5|7563.05|0.08|0.02|N|O|1997-07-19|1997-05-07|1997-08-18|COLLECT COD|RAIL|ptotes haggle fu +35714|1880|81|5|7|12473.16|0.10|0.06|N|O|1997-07-09|1997-05-05|1997-07-31|NONE|RAIL|. deposits affix alongside of the +35714|824|91|6|22|37946.04|0.06|0.05|N|O|1997-06-29|1997-05-29|1997-07-01|DELIVER IN PERSON|TRUCK|atelets. un +35714|303|4|7|5|6016.50|0.08|0.00|N|O|1997-05-11|1997-06-08|1997-05-20|COLLECT COD|TRUCK|nal, express foxes thrash +35715|598|29|1|27|40461.93|0.10|0.00|A|F|1993-04-11|1993-03-27|1993-04-20|DELIVER IN PERSON|REG AIR|hely final accounts. deposits gro +35715|1267|5|2|6|7009.56|0.09|0.05|A|F|1993-04-22|1993-04-12|1993-05-20|TAKE BACK RETURN|FOB|olphins at the unusual accounts a +35715|926|61|3|2|3653.84|0.10|0.05|R|F|1993-03-15|1993-05-08|1993-03-19|NONE|REG AIR|ound the unu +35715|883|17|4|46|82058.48|0.10|0.06|A|F|1993-05-22|1993-03-22|1993-06-01|DELIVER IN PERSON|REG AIR|accounts cajole furious +35715|1277|89|5|32|37704.64|0.00|0.02|R|F|1993-03-31|1993-05-05|1993-04-16|TAKE BACK RETURN|TRUCK|le furiously. furiously r +35716|543|4|1|27|38975.58|0.00|0.07|N|O|1996-04-30|1996-04-27|1996-05-26|NONE|TRUCK|eas are fluffily +35717|771|36|1|27|45137.79|0.03|0.07|N|O|1998-07-18|1998-07-05|1998-08-03|COLLECT COD|RAIL|lets boost +35718|1460|78|1|43|58542.78|0.09|0.05|N|O|1998-01-28|1997-12-20|1998-02-16|COLLECT COD|AIR| platelets. blithely bold accounts c +35718|806|40|2|26|44376.80|0.10|0.04|N|O|1998-02-05|1998-01-29|1998-02-20|COLLECT COD|TRUCK|ckly special, final packages. quic +35718|1582|3|3|11|16319.38|0.08|0.03|N|O|1998-03-17|1998-02-16|1998-04-03|NONE|MAIL|o affix carefully +35718|1517|18|4|1|1418.51|0.06|0.07|N|O|1997-12-22|1998-01-26|1998-01-11|NONE|REG AIR|sits integrate +35718|889|56|5|48|85914.24|0.06|0.08|N|O|1997-11-19|1998-02-15|1997-12-13|DELIVER IN PERSON|FOB| the express, bold foxes. instructions sle +35718|185|64|6|32|34725.76|0.07|0.06|N|O|1998-01-25|1997-12-20|1998-02-17|NONE|RAIL| final packages about the e +35718|739|36|7|49|80346.77|0.10|0.08|N|O|1997-12-12|1998-02-03|1998-01-06|TAKE BACK RETURN|REG AIR| carefully carefully ent +35719|1461|62|1|34|46323.64|0.07|0.03|N|O|1997-04-11|1997-05-02|1997-05-03|NONE|AIR|ly regular requests are-- never ironic ex +35719|808|75|2|6|10252.80|0.00|0.03|N|O|1997-02-25|1997-04-25|1997-03-21|TAKE BACK RETURN|AIR|final sheaves nag do +35719|486|45|3|13|18024.24|0.01|0.01|N|O|1997-02-15|1997-05-01|1997-02-27|NONE|SHIP|olites. blith +35744|805|6|1|7|11940.60|0.05|0.07|R|F|1994-04-08|1994-06-09|1994-04-17|DELIVER IN PERSON|SHIP| wake furiously. tith +35744|438|26|2|20|26768.60|0.08|0.01|A|F|1994-05-08|1994-05-14|1994-05-17|COLLECT COD|FOB|ackages haggle; blithely regular pinto bea +35744|1099|5|3|43|43003.87|0.02|0.07|A|F|1994-07-15|1994-04-28|1994-08-10|NONE|AIR|ges haggle quickly. fluf +35744|807|74|4|25|42695.00|0.00|0.04|A|F|1994-04-25|1994-05-06|1994-05-22|DELIVER IN PERSON|TRUCK|uriously final packages. blithely +35745|542|43|1|46|66356.84|0.09|0.08|N|O|1996-01-20|1995-12-26|1996-02-17|TAKE BACK RETURN|RAIL|t alongside of the requests. carefully ev +35745|388|73|2|5|6441.90|0.00|0.08|N|O|1995-11-09|1995-11-22|1995-11-24|TAKE BACK RETURN|MAIL|und the slyly ironic Tiresi +35745|315|72|3|20|24306.20|0.02|0.08|N|O|1995-11-11|1995-12-10|1995-12-09|DELIVER IN PERSON|FOB|final platelets wake above the quic +35745|1412|13|4|22|28895.02|0.02|0.07|N|O|1996-01-21|1995-11-18|1996-01-23|COLLECT COD|FOB|ng the pending instructions +35745|564|25|5|9|13181.04|0.04|0.03|N|O|1995-10-26|1995-12-23|1995-11-22|DELIVER IN PERSON|TRUCK|ar theodolites nag +35746|1470|71|1|50|68573.50|0.01|0.04|A|F|1994-04-26|1994-04-28|1994-05-21|DELIVER IN PERSON|SHIP|xes. carefully ironic reque +35746|211|66|2|33|36669.93|0.07|0.07|A|F|1994-06-08|1994-03-11|1994-06-26|NONE|RAIL|elets. slyly regular pack +35747|176|55|1|49|52732.33|0.02|0.05|N|O|1997-12-05|1997-10-25|1998-01-04|NONE|SHIP|nding pinto bean +35747|1579|60|2|13|19247.41|0.08|0.00|N|O|1997-09-11|1997-10-10|1997-09-30|COLLECT COD|TRUCK|ithely. pending asympto +35747|1119|20|3|16|16321.76|0.10|0.06|N|O|1997-11-28|1997-10-28|1997-11-29|TAKE BACK RETURN|REG AIR|nding deposits wake slyly speci +35748|338|67|1|23|28481.59|0.08|0.01|N|O|1996-11-26|1997-01-02|1996-12-04|TAKE BACK RETURN|AIR|nal requests. regular dolphins wake. accoun +35748|1137|38|2|22|22838.86|0.03|0.05|N|O|1996-12-24|1996-11-10|1996-12-28|COLLECT COD|TRUCK|s nag carefully regular, regular de +35748|67|43|3|35|33847.10|0.05|0.02|N|O|1996-11-18|1996-11-21|1996-11-30|COLLECT COD|REG AIR| regular re +35748|1532|73|4|48|68809.44|0.05|0.00|N|O|1997-01-12|1996-12-16|1997-01-15|DELIVER IN PERSON|TRUCK|efully quiet i +35748|554|55|5|22|32000.10|0.02|0.08|N|O|1997-01-04|1996-12-09|1997-01-18|DELIVER IN PERSON|RAIL|pinto beans! furiously express reque +35749|17|68|1|45|41265.45|0.10|0.02|N|O|1996-04-06|1996-05-17|1996-04-28|COLLECT COD|MAIL|eodolites a +35750|1119|20|1|44|44884.84|0.02|0.05|R|F|1993-12-03|1993-12-01|1993-12-26|DELIVER IN PERSON|RAIL|osits haggle quickly +35750|560|91|2|14|20447.84|0.02|0.05|A|F|1993-11-23|1993-11-14|1993-11-29|TAKE BACK RETURN|AIR|final deposits across the pending depos +35750|1002|73|3|2|1806.00|0.05|0.00|R|F|1993-12-08|1993-11-06|1993-12-20|COLLECT COD|AIR|uffily special deposits nag slyly. accounts +35750|783|84|4|10|16837.80|0.09|0.00|R|F|1994-01-06|1993-12-09|1994-02-05|TAKE BACK RETURN|SHIP|boost bold dependencies. blithely express r +35750|68|69|5|1|968.06|0.02|0.07|A|F|1993-12-16|1993-11-06|1993-12-27|DELIVER IN PERSON|TRUCK|t ideas against the ca +35751|1643|44|1|22|33982.08|0.06|0.05|N|O|1997-06-12|1997-04-26|1997-07-11|TAKE BACK RETURN|RAIL|efully along the regul +35751|1467|85|2|43|58843.78|0.05|0.08|N|O|1997-06-13|1997-05-01|1997-06-19|COLLECT COD|TRUCK|rnes boost. decoys against the car +35751|1127|64|3|29|29815.48|0.02|0.01|N|O|1997-07-03|1997-05-25|1997-07-11|COLLECT COD|RAIL|cial, silent pinto beans. e +35751|716|13|4|50|80835.50|0.04|0.02|N|O|1997-05-08|1997-04-27|1997-05-19|DELIVER IN PERSON|FOB|uriously pending platelets. blithely unusu +35751|1830|74|5|19|32904.77|0.03|0.04|N|O|1997-04-21|1997-05-30|1997-04-29|NONE|AIR|bove the furiously final depo +35751|742|43|6|22|36140.28|0.05|0.01|N|O|1997-07-12|1997-05-08|1997-07-28|DELIVER IN PERSON|AIR|bold requests are furiously. furiously +35776|874|75|1|7|12424.09|0.10|0.02|R|F|1994-04-08|1994-04-08|1994-04-26|COLLECT COD|AIR|nto beans. ironic deposits wake +35776|1971|60|2|11|20602.67|0.02|0.08|R|F|1994-02-07|1994-03-07|1994-02-25|DELIVER IN PERSON|AIR| to the special dolphins +35776|939|42|3|45|82796.85|0.04|0.04|A|F|1994-04-12|1994-03-08|1994-04-16|DELIVER IN PERSON|AIR| ironic pinto +35776|1718|19|4|35|56689.85|0.03|0.07|A|F|1994-04-29|1994-03-17|1994-05-21|TAKE BACK RETURN|FOB|s integrate +35776|877|11|5|26|46224.62|0.09|0.04|A|F|1994-05-15|1994-03-09|1994-06-12|COLLECT COD|MAIL|ickly pending foxes sl +35776|1088|59|6|38|37585.04|0.09|0.06|R|F|1994-04-02|1994-04-28|1994-04-20|DELIVER IN PERSON|FOB|ously slyly ironic ideas! bl +35777|562|23|1|29|42414.24|0.03|0.01|R|F|1993-11-26|1993-10-23|1993-12-24|NONE|TRUCK|le about the sometimes regular deposits. +35777|450|38|2|5|6752.25|0.00|0.04|A|F|1993-10-22|1993-10-19|1993-10-25|NONE|AIR|ges. pending theodolites haggle pending, +35777|1464|82|3|47|64176.62|0.05|0.00|A|F|1993-09-27|1993-10-14|1993-10-07|TAKE BACK RETURN|AIR|doubt after the blithely even requ +35777|1034|40|4|32|29920.96|0.09|0.00|A|F|1993-10-25|1993-12-01|1993-11-22|NONE|RAIL|ding requests. blithely bold depos +35778|999|100|1|5|9499.95|0.01|0.06|N|O|1995-11-18|1995-12-08|1995-11-29|COLLECT COD|SHIP|nal platelets. qui +35778|1032|68|2|43|40120.29|0.00|0.01|N|O|1996-01-09|1995-12-11|1996-01-21|DELIVER IN PERSON|REG AIR|s sleep furiously. furiously u +35778|1892|93|3|27|48435.03|0.02|0.03|N|O|1995-09-27|1995-12-05|1995-10-10|NONE|FOB|depths sleep bl +35779|1160|33|1|33|35018.28|0.09|0.00|R|F|1993-08-22|1993-08-25|1993-09-03|DELIVER IN PERSON|RAIL|ss accounts! always i +35780|549|80|1|14|20293.56|0.02|0.06|R|F|1995-04-18|1995-03-24|1995-04-28|NONE|RAIL|rts. blithely dogged pains sleep quickly +35780|1448|49|2|16|21591.04|0.05|0.01|R|F|1995-02-08|1995-03-07|1995-02-28|COLLECT COD|REG AIR|y special theodolites. slyly ironi +35780|391|92|3|22|28410.58|0.00|0.04|R|F|1995-02-07|1995-03-09|1995-02-25|NONE|AIR|equests boost alon +35780|1881|68|4|3|5348.64|0.03|0.06|R|F|1995-03-05|1995-02-22|1995-03-27|DELIVER IN PERSON|REG AIR|s. furiously special soma +35781|884|85|1|27|48191.76|0.02|0.07|A|F|1993-06-11|1993-06-23|1993-07-04|COLLECT COD|SHIP| final theodolites. furious, +35781|579|10|2|24|35509.68|0.09|0.04|R|F|1993-09-12|1993-07-10|1993-10-01|NONE|RAIL|pending accounts afte +35781|717|82|3|47|76032.37|0.09|0.02|R|F|1993-05-18|1993-06-30|1993-06-03|NONE|FOB|ar requests. platelet +35781|1531|32|4|21|30083.13|0.07|0.03|A|F|1993-08-13|1993-08-10|1993-09-06|COLLECT COD|REG AIR|e even packages. caref +35781|1514|15|5|38|53789.38|0.06|0.02|A|F|1993-07-22|1993-08-05|1993-08-15|DELIVER IN PERSON|RAIL|egular pinto beans are ca +35781|1232|33|6|38|43062.74|0.03|0.05|A|F|1993-08-21|1993-07-16|1993-09-17|COLLECT COD|RAIL|fluffily bold pains cajole quickly boldly +35782|1879|23|1|39|69453.93|0.04|0.00|N|O|1995-11-27|1995-10-22|1995-12-02|TAKE BACK RETURN|AIR|ches sleep. carefully even pl +35782|981|84|2|38|71515.24|0.02|0.02|N|O|1995-09-06|1995-10-07|1995-09-08|DELIVER IN PERSON|REG AIR|te about the furiously ironic theodo +35782|837|37|3|24|41707.92|0.10|0.06|N|O|1995-08-17|1995-10-28|1995-09-16|NONE|FOB|leep across the ca +35783|1587|8|1|29|43168.82|0.10|0.00|N|O|1997-08-29|1997-08-10|1997-08-30|DELIVER IN PERSON|RAIL|l dolphins caj +35783|277|32|2|16|18836.32|0.09|0.06|N|O|1997-07-06|1997-08-24|1997-07-31|TAKE BACK RETURN|RAIL| furiously +35783|133|60|3|4|4132.52|0.10|0.08|N|O|1997-10-04|1997-08-06|1997-10-11|NONE|REG AIR|quickly accounts. instructions are slyl +35783|538|39|4|29|41717.37|0.05|0.04|N|O|1997-09-28|1997-09-15|1997-10-28|NONE|REG AIR|fluffily sly courts use furiou +35783|1097|3|5|19|18963.71|0.09|0.04|N|O|1997-10-02|1997-09-11|1997-10-24|NONE|SHIP|ess theodolites play along the slyly final +35808|1467|46|1|11|15053.06|0.05|0.01|N|O|1997-11-07|1997-12-20|1997-11-12|NONE|FOB|ges sleep +35808|717|50|2|47|76032.37|0.08|0.05|N|O|1998-01-15|1998-01-01|1998-01-28|COLLECT COD|AIR|rding to the carefully +35808|653|16|3|31|48163.15|0.03|0.00|N|O|1998-01-17|1997-12-30|1998-01-31|NONE|REG AIR|arefully pending instructions. q +35808|1884|85|4|28|50004.64|0.10|0.00|N|O|1998-01-10|1997-12-18|1998-01-15|COLLECT COD|FOB|n ideas. carefully ironic pinto beans wa +35809|369|98|1|30|38080.80|0.09|0.08|A|F|1993-10-29|1993-10-04|1993-11-10|DELIVER IN PERSON|TRUCK|ly express deposits boost slyl +35810|1283|95|1|19|22501.32|0.01|0.03|N|O|1997-02-28|1997-04-19|1997-03-17|TAKE BACK RETURN|SHIP|y along the bold asymptotes. +35810|1985|74|2|6|11321.88|0.01|0.06|N|O|1997-03-30|1997-02-26|1997-04-01|COLLECT COD|FOB|riously ironic deposits sle +35810|1988|21|3|17|32129.66|0.06|0.00|N|O|1997-03-29|1997-04-08|1997-04-06|COLLECT COD|SHIP|ular accounts. acco +35810|395|52|4|5|6476.95|0.04|0.01|N|O|1997-02-03|1997-03-06|1997-03-03|NONE|TRUCK|nments boost slyly around +35810|512|13|5|40|56500.40|0.09|0.00|N|O|1997-03-27|1997-02-27|1997-04-24|NONE|RAIL| deposits should have to sleep. asymptote +35811|91|67|1|23|22795.07|0.07|0.04|A|F|1992-01-16|1992-03-14|1992-02-13|TAKE BACK RETURN|REG AIR|e accounts; e +35811|333|18|2|20|24666.60|0.02|0.01|R|F|1992-02-24|1992-04-01|1992-02-25|TAKE BACK RETURN|RAIL|ole slyly carefully unusual deposits. ca +35811|122|23|3|34|34752.08|0.08|0.08|R|F|1992-03-24|1992-02-08|1992-04-02|COLLECT COD|RAIL|deposits! quickly special ideas +35811|1315|30|4|45|54733.95|0.06|0.01|A|F|1992-01-11|1992-02-20|1992-02-06|COLLECT COD|TRUCK|ts wake furiously after the regular, final +35811|883|17|5|1|1783.88|0.03|0.00|R|F|1992-03-23|1992-03-26|1992-03-25|DELIVER IN PERSON|MAIL|ickly pending foxes poach quickly behind +35811|71|47|6|50|48553.50|0.03|0.08|R|F|1992-04-02|1992-03-21|1992-04-17|DELIVER IN PERSON|REG AIR| wake. slyly ironic accounts during the +35812|1900|1|1|34|61264.60|0.10|0.07|A|F|1993-03-23|1993-03-15|1993-03-26|NONE|TRUCK|ly ironic requests +35812|95|21|2|27|26867.43|0.06|0.02|R|F|1993-05-10|1993-03-10|1993-05-22|DELIVER IN PERSON|FOB|nts cajole quickly across the careful +35812|342|71|3|18|22362.12|0.08|0.01|R|F|1993-04-28|1993-04-18|1993-04-30|TAKE BACK RETURN|REG AIR|ss, express +35812|160|39|4|7|7421.12|0.05|0.03|A|F|1993-02-24|1993-04-15|1993-03-01|COLLECT COD|REG AIR|ackages haggle finally fre +35812|898|65|5|31|55765.59|0.05|0.02|A|F|1993-04-02|1993-04-01|1993-04-22|COLLECT COD|REG AIR| express accounts. stealthily unusual pac +35812|25|26|6|6|5550.12|0.04|0.03|R|F|1993-01-27|1993-02-25|1993-02-04|TAKE BACK RETURN|AIR|uickly final request +35812|1655|97|7|25|38916.25|0.09|0.06|A|F|1993-03-30|1993-03-21|1993-04-17|NONE|FOB|eodolites. furiously final ideas use +35813|1003|74|1|23|20792.00|0.04|0.00|R|F|1994-07-05|1994-07-04|1994-07-13|COLLECT COD|TRUCK|use express, silent pinto bean +35813|1134|43|2|26|26913.38|0.04|0.02|A|F|1994-07-10|1994-07-21|1994-07-21|TAKE BACK RETURN|FOB|sual forges +35813|875|76|3|6|10655.22|0.06|0.07|R|F|1994-08-06|1994-06-01|1994-09-02|NONE|SHIP|ructions. theodolites sleep slyly. +35813|1015|21|4|26|23816.26|0.02|0.02|R|F|1994-07-08|1994-06-11|1994-08-07|COLLECT COD|MAIL|eodolites wake car +35813|989|24|5|35|66149.30|0.07|0.01|A|F|1994-05-26|1994-07-03|1994-06-02|NONE|RAIL|efully regular accounts engage iro +35813|17|68|6|37|33929.37|0.01|0.01|A|F|1994-05-31|1994-07-07|1994-06-28|NONE|TRUCK|er the packages. furiously pending +35813|647|10|7|15|23214.60|0.02|0.04|R|F|1994-08-12|1994-07-09|1994-09-10|TAKE BACK RETURN|AIR|ites. blithely regular deposits c +35814|1555|96|1|4|5826.20|0.09|0.02|A|F|1992-05-23|1992-05-19|1992-06-15|TAKE BACK RETURN|RAIL|lyly. carefully unusual pla +35814|907|10|2|34|61468.60|0.04|0.03|R|F|1992-06-04|1992-05-03|1992-06-05|NONE|MAIL| kindle even ideas. fu +35814|229|84|3|14|15809.08|0.10|0.01|R|F|1992-04-01|1992-05-26|1992-04-29|TAKE BACK RETURN|MAIL| slyly silent reque +35814|1126|63|4|23|23623.76|0.06|0.04|A|F|1992-04-16|1992-05-10|1992-05-12|COLLECT COD|TRUCK|lyly final ideas. unusual, +35814|376|77|5|50|63818.50|0.05|0.07|A|F|1992-06-12|1992-06-16|1992-07-05|COLLECT COD|AIR| to the ex +35814|646|47|6|49|75785.36|0.07|0.05|R|F|1992-06-05|1992-06-23|1992-06-07|COLLECT COD|AIR|its are furiously alongside +35815|310|95|1|23|27837.13|0.09|0.08|A|F|1993-02-04|1993-01-06|1993-03-04|DELIVER IN PERSON|FOB| hinder carefully. foxes wake clos +35815|529|60|2|10|14295.20|0.03|0.06|R|F|1993-01-25|1993-01-25|1993-02-01|TAKE BACK RETURN|SHIP|hinder carefully pendi +35815|1762|63|3|46|76532.96|0.02|0.02|A|F|1993-01-26|1992-12-11|1993-02-17|DELIVER IN PERSON|REG AIR|usual deposits! bold requests haggle f +35840|712|13|1|7|11288.97|0.08|0.02|R|F|1993-08-19|1993-07-22|1993-09-05|DELIVER IN PERSON|AIR|counts according to the quickly e +35840|1592|73|2|50|74679.50|0.05|0.04|A|F|1993-08-21|1993-08-13|1993-09-05|TAKE BACK RETURN|SHIP|sly dogged theodolites. f +35840|1395|96|3|12|15556.68|0.00|0.01|R|F|1993-06-07|1993-07-06|1993-06-10|TAKE BACK RETURN|MAIL|ar packages grow blithely after the slyl +35841|226|54|1|50|56311.00|0.08|0.02|N|O|1995-07-19|1995-07-16|1995-08-15|COLLECT COD|RAIL|al requests. carefully +35841|582|43|2|43|63750.94|0.02|0.04|N|O|1995-08-14|1995-06-10|1995-08-23|COLLECT COD|MAIL|efully. busy accounts x-ray blithely abov +35841|938|7|3|32|58845.76|0.00|0.01|N|O|1995-09-01|1995-07-15|1995-09-21|TAKE BACK RETURN|SHIP|de of the special accou +35841|1514|35|4|27|38218.77|0.00|0.03|N|O|1995-08-24|1995-08-04|1995-09-20|NONE|MAIL|ent deposits hagg +35841|765|66|5|11|18323.36|0.03|0.08|N|O|1995-09-01|1995-08-02|1995-09-27|TAKE BACK RETURN|SHIP|ly pending instructions was. carefu +35842|121|48|1|23|23485.76|0.08|0.03|R|F|1992-06-06|1992-08-10|1992-06-20|NONE|REG AIR|refully final requests. sl +35842|480|10|2|44|60741.12|0.09|0.04|R|F|1992-08-08|1992-07-21|1992-08-28|COLLECT COD|MAIL|, final deposits. slyly idle asympt +35842|1741|42|3|25|41068.50|0.09|0.02|A|F|1992-08-16|1992-08-02|1992-09-14|NONE|MAIL|tions use carefully alongside o +35843|965|66|1|46|85834.16|0.04|0.00|N|O|1997-12-30|1998-01-21|1998-01-26|DELIVER IN PERSON|SHIP|, pending instructions boost fluffily +35843|528|89|2|16|22856.32|0.05|0.05|N|O|1997-12-12|1998-01-03|1997-12-22|TAKE BACK RETURN|RAIL|. ironic realms across the +35843|1015|16|3|32|29312.32|0.09|0.07|N|O|1998-03-11|1997-12-25|1998-04-07|DELIVER IN PERSON|MAIL| blithely final instructions are s +35844|684|85|1|41|64971.88|0.09|0.03|A|F|1995-03-30|1995-01-17|1995-04-01|DELIVER IN PERSON|RAIL|about the blithe +35844|411|70|2|19|24916.79|0.01|0.04|A|F|1995-01-25|1995-02-11|1995-02-09|DELIVER IN PERSON|RAIL|ter the even accounts. accounts h +35845|594|55|1|47|70245.73|0.02|0.06|R|F|1995-01-12|1995-03-16|1995-01-17|NONE|FOB|furiously regular deposits promise regu +35845|174|27|2|25|26854.25|0.05|0.04|A|F|1995-05-08|1995-02-12|1995-05-19|NONE|RAIL| special, ironic instructions hang qu +35846|1910|11|1|9|16307.19|0.01|0.02|A|F|1992-04-28|1992-03-23|1992-05-18|DELIVER IN PERSON|MAIL| furiously quickly silent excuses. epitaphs +35846|855|22|2|30|52675.50|0.10|0.01|R|F|1992-05-19|1992-03-30|1992-06-01|TAKE BACK RETURN|RAIL|nently blithely furious excuse +35847|682|83|1|38|60141.84|0.07|0.01|R|F|1994-03-26|1994-04-08|1994-04-19|DELIVER IN PERSON|RAIL|t instructions. carefully regular +35847|853|53|2|17|29815.45|0.10|0.00|R|F|1994-05-28|1994-04-13|1994-06-07|NONE|REG AIR|ic deposits wake blithely around the iro +35847|774|7|3|43|72015.11|0.07|0.03|A|F|1994-03-15|1994-03-07|1994-03-25|DELIVER IN PERSON|RAIL|furiously. +35847|728|25|4|15|24430.80|0.07|0.03|A|F|1994-05-11|1994-03-30|1994-05-18|DELIVER IN PERSON|TRUCK|posits wake stealthily even i +35847|1126|99|5|48|49301.76|0.07|0.06|R|F|1994-03-21|1994-03-28|1994-04-20|NONE|RAIL|t theodolites. enticing, unusual account +35847|1928|17|6|27|49407.84|0.10|0.03|R|F|1994-05-17|1994-03-29|1994-05-28|TAKE BACK RETURN|RAIL|ic, ironic dep +35872|242|43|1|11|12564.64|0.00|0.02|A|F|1995-01-19|1995-03-15|1995-02-11|DELIVER IN PERSON|SHIP|ag according to the fluffily re +35872|740|5|2|31|50862.94|0.02|0.07|R|F|1995-03-28|1995-02-03|1995-04-11|TAKE BACK RETURN|AIR|riously ironic +35872|1900|30|3|3|5405.70|0.00|0.01|A|F|1995-04-10|1995-02-06|1995-05-03|COLLECT COD|SHIP|l asymptotes. carefully regular +35872|963|98|4|21|39143.16|0.09|0.03|R|F|1995-01-05|1995-02-01|1995-01-20|DELIVER IN PERSON|AIR| special foxes are ca +35872|909|12|5|2|3619.80|0.10|0.02|R|F|1995-04-05|1995-02-10|1995-04-06|COLLECT COD|RAIL|ckages. theodolites boos +35872|1252|53|6|12|13839.00|0.06|0.04|A|F|1995-01-31|1995-02-27|1995-02-13|NONE|REG AIR|ons use furiously platelets. final +35872|1968|13|7|9|16829.64|0.04|0.05|R|F|1994-12-21|1995-03-17|1995-01-16|NONE|TRUCK|ackages nag slyly. carefull +35873|1817|18|1|49|84221.69|0.08|0.05|N|O|1996-02-21|1996-01-31|1996-03-13|NONE|MAIL|olites sublate after the bold packages. fur +35874|611|12|1|17|25697.37|0.09|0.00|N|O|1997-02-28|1997-02-06|1997-03-18|COLLECT COD|TRUCK|uriously. quickly even instru +35874|1104|77|2|44|44224.40|0.06|0.07|N|O|1997-03-13|1997-02-17|1997-04-08|COLLECT COD|RAIL|furiously regular excuses wake above the ev +35874|98|99|3|23|22956.07|0.02|0.06|N|O|1997-01-22|1997-02-02|1997-02-19|NONE|TRUCK|theodolites. slyly close ideas cajo +35874|744|9|4|42|69079.08|0.01|0.00|N|O|1997-01-10|1997-02-10|1997-01-26|DELIVER IN PERSON|MAIL|refully final +35874|733|66|5|35|57180.55|0.08|0.02|N|O|1997-02-28|1997-02-19|1997-03-16|TAKE BACK RETURN|FOB|lites. furiously re +35874|1315|54|6|22|26758.82|0.03|0.06|N|O|1997-03-16|1997-01-25|1997-03-23|NONE|AIR|e ironic, final accounts. +35874|1427|28|7|38|50479.96|0.03|0.08|N|O|1997-03-15|1997-01-20|1997-03-24|COLLECT COD|MAIL| packages sleep even +35875|512|73|1|25|35312.75|0.01|0.02|N|O|1995-09-10|1995-08-04|1995-09-29|DELIVER IN PERSON|SHIP|s haggle slyly regular escapades. slyly iro +35875|1066|72|2|49|47385.94|0.08|0.08|N|O|1995-07-23|1995-09-07|1995-08-03|NONE|TRUCK|cording to the sl +35875|408|67|3|7|9158.80|0.04|0.08|N|O|1995-08-01|1995-07-15|1995-08-05|DELIVER IN PERSON|FOB|s are among the furiously ironic packages. +35875|1969|70|4|14|26193.44|0.09|0.02|N|O|1995-08-22|1995-08-10|1995-09-11|NONE|REG AIR| pinto beans are quickly +35875|520|81|5|34|48297.68|0.04|0.07|N|O|1995-06-20|1995-07-24|1995-07-08|NONE|FOB|lar requests wake carefully. regular +35875|1658|59|6|21|32752.65|0.04|0.08|N|O|1995-09-19|1995-09-13|1995-09-23|DELIVER IN PERSON|REG AIR|riously after the even +35875|1158|95|7|41|43425.15|0.09|0.08|N|O|1995-09-23|1995-07-31|1995-09-24|TAKE BACK RETURN|RAIL|ans detect fluffily slyly express account +35876|1636|19|1|20|30752.60|0.03|0.01|N|O|1998-06-17|1998-04-14|1998-06-21|DELIVER IN PERSON|SHIP|carefully ironic d +35876|1493|11|2|33|46018.17|0.09|0.00|N|O|1998-05-10|1998-04-29|1998-05-21|NONE|REG AIR|quests haggle furiously +35876|1447|48|3|32|43150.08|0.01|0.07|N|O|1998-05-26|1998-04-30|1998-06-25|NONE|FOB|uests. always regula +35876|1204|79|4|30|33156.00|0.01|0.01|N|O|1998-07-01|1998-05-07|1998-07-14|TAKE BACK RETURN|RAIL| are after the furiously express +35876|325|82|5|42|51463.44|0.10|0.07|N|O|1998-05-24|1998-05-22|1998-06-17|NONE|REG AIR|slyly pending courts wake at the regular, +35877|401|60|1|30|39042.00|0.03|0.02|A|F|1993-06-25|1993-07-18|1993-07-14|DELIVER IN PERSON|TRUCK|ecial accounts shall have to +35877|260|88|2|5|5801.30|0.08|0.08|R|F|1993-07-14|1993-07-03|1993-07-25|NONE|TRUCK|f the silent, +35877|1774|1|3|5|8378.85|0.09|0.08|A|F|1993-09-01|1993-07-07|1993-09-04|DELIVER IN PERSON|TRUCK|ar, regular accounts +35877|1520|1|4|20|28430.40|0.02|0.02|R|F|1993-06-13|1993-08-24|1993-07-04|NONE|SHIP|ests nag carefully. regular dependenc +35877|424|54|5|24|31786.08|0.05|0.00|A|F|1993-06-05|1993-08-18|1993-07-02|NONE|RAIL|ding to the carefully regular packag +35877|1126|63|6|17|17461.04|0.09|0.05|A|F|1993-09-12|1993-08-15|1993-10-09|COLLECT COD|REG AIR| impress according to the fluffily spe +35877|196|23|7|46|50424.74|0.01|0.03|A|F|1993-06-21|1993-08-07|1993-06-28|COLLECT COD|SHIP| the carefully ironic packages. silen +35878|535|66|1|48|68905.44|0.08|0.01|R|F|1993-11-26|1993-10-05|1993-12-18|COLLECT COD|TRUCK|sy pinto beans boost accounts. idle depo +35878|1547|68|2|6|8691.24|0.01|0.02|R|F|1993-11-11|1993-09-25|1993-12-02|TAKE BACK RETURN|MAIL| the furiously unusual reques +35878|241|23|3|24|27389.76|0.09|0.07|R|F|1993-08-29|1993-11-03|1993-09-22|COLLECT COD|REG AIR|ng to the requests sleep across the slyl +35878|865|99|4|8|14126.88|0.10|0.02|A|F|1993-08-28|1993-11-06|1993-08-30|TAKE BACK RETURN|FOB|xpress packages are quietly special +35878|939|40|5|18|33118.74|0.10|0.08|A|F|1993-10-23|1993-10-05|1993-11-03|TAKE BACK RETURN|SHIP|s. requests thrash. un +35879|1403|43|1|32|41740.80|0.06|0.07|N|O|1996-07-15|1996-07-06|1996-08-03|TAKE BACK RETURN|REG AIR|eep furiously +35879|959|60|2|26|48358.70|0.04|0.02|N|O|1996-08-12|1996-07-05|1996-09-02|DELIVER IN PERSON|SHIP|ound the special depe +35879|143|96|3|9|9388.26|0.04|0.04|N|O|1996-08-15|1996-05-28|1996-09-03|NONE|RAIL|ular deposits. bold, +35879|1427|6|4|10|13284.20|0.07|0.04|N|O|1996-07-17|1996-06-23|1996-07-25|DELIVER IN PERSON|MAIL|ar excuses are +35904|873|7|1|15|26608.05|0.07|0.03|N|O|1997-08-28|1997-08-31|1997-09-08|COLLECT COD|AIR|dolites accor +35904|225|80|2|32|36007.04|0.05|0.05|N|O|1997-10-24|1997-09-11|1997-11-10|COLLECT COD|MAIL|sleep slyly above the ca +35905|1415|94|1|14|18429.74|0.00|0.08|R|F|1992-05-04|1992-05-09|1992-06-01|NONE|RAIL|alongside of the instruc +35905|1629|12|2|40|61224.80|0.10|0.07|A|F|1992-05-29|1992-03-25|1992-06-04|NONE|MAIL|uctions use. +35905|1564|5|3|33|48363.48|0.00|0.03|A|F|1992-05-12|1992-04-13|1992-06-09|TAKE BACK RETURN|RAIL|ckages. special requests wake s +35905|1113|86|4|33|33465.63|0.02|0.07|R|F|1992-03-22|1992-04-02|1992-04-03|DELIVER IN PERSON|RAIL| nod caref +35905|993|62|5|16|30303.84|0.01|0.07|R|F|1992-04-16|1992-05-15|1992-04-17|TAKE BACK RETURN|MAIL|are slyly sl +35906|626|20|1|44|67171.28|0.07|0.00|N|O|1997-03-23|1997-04-22|1997-04-08|NONE|FOB|rts. packages are slyly. b +35906|250|51|2|8|9202.00|0.04|0.00|N|O|1997-05-28|1997-04-21|1997-06-24|TAKE BACK RETURN|SHIP|aves after the idle de +35906|1691|74|3|37|58929.53|0.06|0.08|N|O|1997-04-03|1997-06-01|1997-04-23|DELIVER IN PERSON|MAIL|its haggle carefully. +35906|321|50|4|27|32975.64|0.06|0.02|N|O|1997-06-12|1997-05-29|1997-07-02|NONE|SHIP|riously careful foxes eat furiously. b +35906|1386|63|5|33|42483.54|0.04|0.06|N|O|1997-04-23|1997-06-11|1997-05-21|NONE|SHIP|eposits. ironic dep +35906|48|49|6|4|3792.16|0.09|0.00|N|O|1997-07-05|1997-05-28|1997-07-16|NONE|SHIP| slyly regular accounts are slyly +35907|432|91|1|16|21318.88|0.05|0.01|N|O|1998-04-25|1998-07-03|1998-05-01|DELIVER IN PERSON|FOB|e regular, final theodolit +35907|1024|25|2|43|39775.86|0.06|0.03|N|O|1998-05-12|1998-07-11|1998-05-29|COLLECT COD|TRUCK|e slyly ironic requests. slyly express dep +35907|1418|36|3|20|26388.20|0.07|0.01|N|O|1998-05-04|1998-05-15|1998-05-15|NONE|RAIL|uriously r +35907|847|81|4|14|24469.76|0.03|0.01|N|O|1998-06-09|1998-06-22|1998-06-14|DELIVER IN PERSON|MAIL|s. quickly final foxes wake. blithely s +35907|878|79|5|24|42692.88|0.06|0.06|N|O|1998-05-14|1998-05-14|1998-05-24|TAKE BACK RETURN|RAIL|oxes. final deposits haggle carefully. bo +35908|290|45|1|6|7141.74|0.09|0.00|R|F|1994-01-18|1994-02-07|1994-02-13|DELIVER IN PERSON|AIR|e courts sleep across +35908|953|54|2|2|3707.90|0.07|0.03|A|F|1994-04-06|1994-02-17|1994-04-08|DELIVER IN PERSON|MAIL|use instructions +35908|130|83|3|37|38114.81|0.00|0.01|A|F|1994-03-05|1994-02-01|1994-03-27|DELIVER IN PERSON|SHIP|ests boost furiously. ca +35908|1443|22|4|37|49744.28|0.01|0.04|R|F|1994-01-25|1994-02-17|1994-01-27|DELIVER IN PERSON|SHIP|s. quickly final packages wake slyl +35908|1436|76|5|30|40122.90|0.02|0.07|R|F|1993-12-24|1994-02-27|1994-01-07|TAKE BACK RETURN|REG AIR|ecial pinto beans sleep slyly accordin +35909|1548|49|1|18|26091.72|0.09|0.04|N|O|1997-01-30|1996-12-31|1997-01-31|TAKE BACK RETURN|SHIP|gular, express asympto +35909|1645|46|2|35|54132.40|0.03|0.07|N|O|1997-01-31|1996-11-11|1997-02-09|COLLECT COD|MAIL|ainst the enticingly ironic deposits. +35909|1058|59|3|40|38362.00|0.06|0.05|N|O|1996-11-28|1996-11-14|1996-12-05|TAKE BACK RETURN|FOB|usly. quickly bold forges about +35909|394|79|4|3|3883.17|0.06|0.01|N|O|1996-11-19|1996-12-15|1996-12-19|DELIVER IN PERSON|FOB|y. multipliers above +35909|961|64|5|49|91236.04|0.02|0.02|N|O|1996-11-02|1996-12-05|1996-11-12|COLLECT COD|SHIP|rding to the even theodolites. bold +35909|1907|40|6|22|39795.80|0.00|0.05|N|O|1996-11-18|1996-12-31|1996-11-22|TAKE BACK RETURN|TRUCK|he fluffily ironic deposits +35910|1921|66|1|11|20052.12|0.00|0.04|R|F|1993-12-23|1994-01-21|1993-12-25|TAKE BACK RETURN|AIR|t against the carefull +35910|1800|43|2|32|54457.60|0.00|0.07|A|F|1994-02-05|1994-02-14|1994-03-06|COLLECT COD|REG AIR|equests. ideas eng +35910|416|75|3|15|19746.15|0.06|0.02|A|F|1993-12-24|1994-02-17|1994-01-02|NONE|MAIL|, final dependenci +35910|1240|41|4|21|23966.04|0.05|0.05|R|F|1994-03-18|1994-01-31|1994-03-29|DELIVER IN PERSON|TRUCK|lyly quickly ironic requests. +35910|1058|29|5|38|36443.90|0.09|0.08|A|F|1994-01-06|1994-01-03|1994-01-22|DELIVER IN PERSON|TRUCK|ons. ironic requests affix! furiously u +35910|1460|100|6|47|63988.62|0.05|0.01|A|F|1994-03-13|1994-02-19|1994-03-21|COLLECT COD|FOB|y final foxes wake carefully sp +35910|1673|97|7|11|17321.37|0.06|0.07|R|F|1994-01-27|1994-01-06|1994-02-20|NONE|SHIP|ress theodolites +35911|150|51|1|13|13651.95|0.05|0.07|N|O|1997-02-21|1997-04-12|1997-03-05|TAKE BACK RETURN|AIR|ously even packa +35936|983|52|1|29|54635.42|0.06|0.04|R|F|1994-03-22|1994-04-01|1994-04-11|COLLECT COD|TRUCK|hy accounts haggle. unusual foxes +35936|849|50|2|28|48995.52|0.01|0.07|A|F|1994-04-25|1994-03-13|1994-05-25|COLLECT COD|MAIL|ly furiously +35936|1961|94|3|30|55888.80|0.03|0.04|R|F|1994-04-25|1994-03-06|1994-05-18|COLLECT COD|TRUCK|ic packages. bold pinto +35936|1056|92|4|40|38282.00|0.05|0.03|A|F|1994-05-21|1994-03-23|1994-06-02|NONE|REG AIR|sly ironic p +35936|1116|89|5|37|37633.07|0.06|0.08|R|F|1994-03-22|1994-04-02|1994-04-11|TAKE BACK RETURN|MAIL| the quick, furious pinto beans. s +35936|1709|52|6|34|54763.80|0.08|0.02|A|F|1994-05-01|1994-03-02|1994-05-12|NONE|RAIL|y even instructions. daring, even reque +35936|296|78|7|39|46655.31|0.06|0.00|R|F|1994-02-28|1994-03-02|1994-03-23|TAKE BACK RETURN|SHIP|ding to the furiously special +35937|560|21|1|36|52580.16|0.01|0.05|N|O|1996-09-07|1996-09-02|1996-09-25|NONE|SHIP|slyly iron +35937|989|58|2|34|64259.32|0.05|0.03|N|O|1996-09-06|1996-09-06|1996-09-19|NONE|TRUCK|lithely re +35937|392|49|3|23|29724.97|0.07|0.00|N|O|1996-09-24|1996-09-07|1996-10-01|DELIVER IN PERSON|REG AIR| the blithely bold accounts lose +35937|356|85|4|20|25127.00|0.10|0.06|N|O|1996-09-25|1996-08-05|1996-10-16|DELIVER IN PERSON|SHIP|arefully final foxes are +35937|521|12|5|2|2843.04|0.06|0.05|N|O|1996-06-18|1996-08-09|1996-06-27|DELIVER IN PERSON|TRUCK| slyly expre +35937|775|72|6|48|80436.96|0.09|0.05|N|O|1996-07-20|1996-08-09|1996-08-17|COLLECT COD|MAIL|dolites mold entici +35937|532|23|7|42|60166.26|0.09|0.01|N|O|1996-08-11|1996-07-21|1996-09-08|COLLECT COD|FOB|ly above the deposits. accou +35938|1664|65|1|28|43838.48|0.06|0.05|A|F|1993-02-01|1993-01-17|1993-02-22|DELIVER IN PERSON|REG AIR|e special courts-- carefully ir +35938|1765|8|2|36|60003.36|0.02|0.05|A|F|1992-12-24|1993-02-01|1993-01-09|NONE|MAIL|lyly final requests sleep care +35938|1290|91|3|16|19060.64|0.03|0.07|A|F|1993-02-28|1993-01-04|1993-03-26|COLLECT COD|REG AIR|gular accounts. even dolphin +35938|1297|35|4|8|9586.32|0.03|0.07|R|F|1992-12-03|1993-02-03|1992-12-16|TAKE BACK RETURN|MAIL| deposits are final, even +35938|614|77|5|26|39379.86|0.04|0.00|A|F|1993-03-07|1992-12-20|1993-03-10|DELIVER IN PERSON|REG AIR|ites. furiously +35938|492|51|6|3|4177.47|0.03|0.06|A|F|1993-02-18|1992-12-22|1993-03-10|DELIVER IN PERSON|TRUCK|uests. bold deposits alongsid +35938|1437|38|7|29|38814.47|0.07|0.06|R|F|1993-03-13|1993-02-07|1993-03-14|COLLECT COD|SHIP|ly special foxes cajole carefu +35939|1701|86|1|14|22437.80|0.00|0.02|N|O|1996-08-18|1996-09-14|1996-08-22|NONE|MAIL|e slyly pending pin +35940|370|27|1|48|60977.76|0.05|0.04|R|F|1993-09-02|1993-08-09|1993-09-27|COLLECT COD|SHIP|ag ironic platelets. blithely regular pa +35940|1052|88|2|28|26685.40|0.02|0.06|R|F|1993-09-03|1993-06-30|1993-09-14|COLLECT COD|REG AIR| bold requests affix c +35940|1676|59|3|11|17354.37|0.06|0.08|A|F|1993-07-12|1993-07-12|1993-08-04|TAKE BACK RETURN|RAIL| after the per +35940|269|24|4|26|30400.76|0.01|0.01|R|F|1993-07-22|1993-08-14|1993-08-19|NONE|REG AIR|s sleep. requests +35940|291|19|5|12|14295.48|0.03|0.01|R|F|1993-08-10|1993-06-29|1993-08-31|NONE|MAIL|y special deposits dete +35940|1054|55|6|50|47752.50|0.10|0.03|R|F|1993-07-23|1993-07-05|1993-08-19|COLLECT COD|MAIL|dugouts. pending, bold packages along t +35941|357|42|1|10|12573.50|0.10|0.02|N|O|1996-09-29|1996-11-05|1996-10-19|DELIVER IN PERSON|REG AIR| ironic attainments affix daringly daring +35942|922|57|1|22|40104.24|0.09|0.01|N|O|1997-09-19|1997-10-31|1997-09-22|TAKE BACK RETURN|MAIL|ounts. blithely regular requests alon +35942|1406|24|2|44|57525.60|0.04|0.06|N|O|1997-09-26|1997-12-13|1997-10-13|NONE|FOB|he blithely +35942|772|73|3|7|11709.39|0.06|0.03|N|O|1997-10-31|1997-11-18|1997-11-26|COLLECT COD|RAIL|old foxes wake furiously expr +35942|1369|70|4|38|48273.68|0.08|0.07|N|O|1997-12-07|1997-12-12|1997-12-14|NONE|TRUCK| dolphins nag furiously +35942|566|67|5|4|5866.24|0.07|0.05|N|O|1997-10-28|1997-12-03|1997-11-13|NONE|FOB| unusual deposits are regularly. bold, +35942|466|96|6|5|6832.30|0.09|0.05|N|O|1997-10-29|1997-11-12|1997-11-03|TAKE BACK RETURN|AIR|. fluffily express deposi +35942|1426|66|7|9|11946.78|0.05|0.06|N|O|1997-12-16|1997-10-28|1998-01-05|DELIVER IN PERSON|AIR| cajole. depende +35943|1203|78|1|13|14354.60|0.10|0.00|N|O|1998-02-07|1998-01-29|1998-03-06|NONE|RAIL|nal requests. furiously fi +35943|1967|100|2|39|72889.44|0.06|0.06|N|O|1998-02-26|1998-01-30|1998-03-21|COLLECT COD|REG AIR|. silent, unusual accounts +35943|106|59|3|4|4024.40|0.10|0.08|N|O|1998-01-18|1998-01-23|1998-02-09|COLLECT COD|SHIP| after the fluffil +35943|1261|99|4|46|53463.96|0.06|0.00|N|O|1998-03-25|1998-01-17|1998-03-29|DELIVER IN PERSON|TRUCK|accounts? care +35943|1151|52|5|24|25251.60|0.01|0.02|N|O|1998-03-20|1998-02-20|1998-04-17|NONE|TRUCK|ss accounts boost quickly bold accounts. c +35943|170|97|6|24|25684.08|0.01|0.04|N|O|1998-02-13|1998-01-15|1998-03-13|COLLECT COD|TRUCK|nently acros +35943|1702|87|7|29|46507.30|0.00|0.07|N|O|1998-03-17|1998-02-14|1998-04-01|NONE|RAIL|onic instruc +35968|307|92|1|41|49499.30|0.00|0.08|A|F|1992-04-04|1992-05-27|1992-04-07|TAKE BACK RETURN|TRUCK|bold requests haggle quick +35968|727|60|2|3|4883.16|0.06|0.04|R|F|1992-07-02|1992-05-10|1992-08-01|DELIVER IN PERSON|MAIL|eep after the furiously pendi +35968|1757|58|3|20|33175.00|0.05|0.07|A|F|1992-03-20|1992-05-30|1992-04-02|COLLECT COD|RAIL|tions. fluffily even theodoli +35968|1338|77|4|38|47094.54|0.05|0.02|A|F|1992-06-13|1992-05-12|1992-06-15|NONE|REG AIR| platelets wake +35968|75|26|5|38|37052.66|0.08|0.00|R|F|1992-05-30|1992-05-10|1992-06-22|DELIVER IN PERSON|SHIP|ake enticingly arou +35968|1542|43|6|35|50523.90|0.00|0.08|R|F|1992-03-08|1992-04-22|1992-04-02|COLLECT COD|SHIP|l, express accounts promise. furiously e +35968|1483|1|7|18|24920.64|0.05|0.06|A|F|1992-05-19|1992-04-29|1992-05-21|TAKE BACK RETURN|AIR| accounts sleep furiously regular +35969|737|70|1|5|8188.65|0.00|0.05|N|O|1997-12-24|1997-10-05|1998-01-12|COLLECT COD|RAIL| fluffily regular packages? ironi +35969|741|38|2|20|32834.80|0.08|0.01|N|O|1997-09-22|1997-11-21|1997-10-12|COLLECT COD|TRUCK|azzle blithely quickly special depo +35969|831|32|3|10|17318.30|0.06|0.08|N|O|1997-12-07|1997-11-01|1998-01-01|NONE|FOB|ending dolphins. final, silent de +35969|1528|29|4|33|47174.16|0.02|0.06|N|O|1997-11-22|1997-09-30|1997-11-24|DELIVER IN PERSON|REG AIR|y. instructions haggle carefully. care +35969|1351|90|5|18|22542.30|0.03|0.07|N|O|1997-11-08|1997-11-13|1997-11-14|NONE|AIR| special, bold depende +35969|973|76|6|4|7495.88|0.03|0.07|N|O|1997-12-24|1997-11-05|1998-01-08|TAKE BACK RETURN|REG AIR| close instructions wake +35970|1674|75|1|30|47270.10|0.07|0.02|N|O|1997-07-28|1997-07-08|1997-08-12|NONE|REG AIR|ithely pending asympt +35970|397|82|2|48|62274.72|0.01|0.01|N|O|1997-05-16|1997-06-06|1997-06-11|COLLECT COD|RAIL|arefully express, even packages. quickly ir +35970|988|23|3|44|83115.12|0.05|0.00|N|O|1997-06-16|1997-05-25|1997-07-16|TAKE BACK RETURN|AIR|unts. foxes around the blithely express d +35970|1350|51|4|35|43797.25|0.05|0.02|N|O|1997-06-01|1997-07-16|1997-06-30|NONE|TRUCK|ic packages. deposits affix furiously +35971|248|76|1|42|48226.08|0.03|0.01|N|O|1997-03-02|1997-04-03|1997-03-19|TAKE BACK RETURN|TRUCK|g to the silent, +35971|1902|91|2|15|27058.50|0.02|0.01|N|O|1997-03-17|1997-02-07|1997-04-02|TAKE BACK RETURN|TRUCK|arefully ironic packages cajole. +35971|1857|87|3|21|36935.85|0.01|0.06|N|O|1997-03-03|1997-03-03|1997-03-20|COLLECT COD|MAIL|riously ironic instructions boost a +35971|1944|89|4|6|11075.64|0.02|0.05|N|O|1997-03-04|1997-02-23|1997-03-25|COLLECT COD|FOB|as. regular, +35971|1735|62|5|30|49101.90|0.01|0.03|N|O|1997-04-04|1997-03-28|1997-04-27|DELIVER IN PERSON|AIR|ly final foxes breach carefully ac +35972|931|34|1|21|38470.53|0.01|0.03|R|F|1994-03-24|1994-03-25|1994-03-27|NONE|TRUCK| carefully busy the +35973|815|49|1|19|32600.39|0.09|0.06|N|O|1997-11-11|1997-10-18|1997-11-25|NONE|MAIL|en packages among th +35973|800|1|2|38|64630.40|0.02|0.01|N|O|1997-10-14|1997-11-26|1997-10-19|DELIVER IN PERSON|AIR| pending pinto be +35973|916|19|3|14|25436.74|0.05|0.06|N|O|1997-09-23|1997-10-12|1997-09-27|COLLECT COD|SHIP|xcuses cajole doggedly. slyly st +35973|705|38|4|24|38536.80|0.08|0.00|N|O|1997-10-24|1997-10-08|1997-11-03|TAKE BACK RETURN|TRUCK|al theodolites. blithely final instruc +35973|1608|9|5|41|61893.60|0.03|0.08|N|O|1997-10-15|1997-10-08|1997-11-02|DELIVER IN PERSON|REG AIR|e slyly final deposits. slyly iro +35973|1274|12|6|10|11752.70|0.04|0.05|N|O|1997-12-04|1997-11-13|1997-12-28|NONE|REG AIR|e across the fluffily bold account +35974|1993|94|1|9|17054.91|0.00|0.03|N|O|1998-07-06|1998-07-31|1998-07-21|TAKE BACK RETURN|RAIL|lly along the blithely ironic instructio +35974|356|41|2|30|37690.50|0.02|0.06|N|O|1998-07-19|1998-09-03|1998-07-27|NONE|AIR|onic ideas are furiously above the u +35974|1862|6|3|26|45860.36|0.09|0.06|N|O|1998-07-16|1998-07-17|1998-08-12|TAKE BACK RETURN|AIR|y. blithely express accounts cajole quick +35974|542|3|4|34|49046.36|0.05|0.07|N|O|1998-07-16|1998-07-15|1998-08-10|TAKE BACK RETURN|FOB|eodolites. packa +35974|1437|77|5|41|54875.63|0.02|0.05|N|O|1998-09-26|1998-08-03|1998-10-09|DELIVER IN PERSON|RAIL|ously ironic ideas. regular r +35975|1253|91|1|1|1154.25|0.01|0.01|N|O|1997-09-10|1997-09-01|1997-09-27|COLLECT COD|AIR|ously. blithely unusual deposits wake care +35975|1567|68|2|5|7342.80|0.03|0.04|N|O|1997-10-31|1997-09-21|1997-11-16|COLLECT COD|MAIL|y special courts. qu +35975|578|39|3|6|8871.42|0.00|0.02|N|O|1997-10-25|1997-10-01|1997-11-09|COLLECT COD|FOB| the furiously +35975|1453|54|4|37|50114.65|0.00|0.01|N|O|1997-07-31|1997-09-14|1997-08-23|DELIVER IN PERSON|AIR| regular platelets against the some +35975|1630|31|5|4|6126.52|0.08|0.04|N|O|1997-07-27|1997-10-09|1997-07-30|DELIVER IN PERSON|RAIL|s. platelets haggle. slyly stealthy theod +36000|80|56|1|15|14701.20|0.01|0.06|A|F|1992-04-08|1992-04-21|1992-04-11|TAKE BACK RETURN|REG AIR|posits nag accord +36001|1551|72|1|30|43576.50|0.04|0.05|A|F|1995-04-06|1995-05-20|1995-04-15|COLLECT COD|FOB|nic pinto beans +36001|499|58|2|48|67175.52|0.02|0.02|N|F|1995-06-02|1995-05-08|1995-06-19|TAKE BACK RETURN|REG AIR|ress requests sleep slyly! quickly even d +36001|277|78|3|25|29431.75|0.01|0.08|N|F|1995-06-08|1995-06-02|1995-07-01|TAKE BACK RETURN|AIR|gside of the i +36001|1343|82|4|3|3733.02|0.06|0.08|R|F|1995-05-01|1995-05-12|1995-05-08|DELIVER IN PERSON|AIR|usly regular platelets +36001|1304|81|5|11|13258.30|0.02|0.01|A|F|1995-04-15|1995-06-16|1995-04-30|TAKE BACK RETURN|RAIL|iously daringly fina +36001|1976|77|6|21|39437.37|0.02|0.06|R|F|1995-05-04|1995-06-04|1995-05-24|DELIVER IN PERSON|MAIL|r packages. silent, ca +36001|526|27|7|37|52781.24|0.00|0.01|N|O|1995-07-27|1995-05-14|1995-08-24|TAKE BACK RETURN|TRUCK|s. stealthily regular ideas across the acc +36002|1534|15|1|31|44501.43|0.00|0.02|R|F|1993-06-15|1993-06-16|1993-06-17|TAKE BACK RETURN|AIR| pending excu +36002|1582|23|2|12|17802.96|0.10|0.04|A|F|1993-07-29|1993-07-01|1993-08-05|NONE|AIR|ending deposits integra +36002|234|16|3|18|20416.14|0.05|0.05|A|F|1993-06-10|1993-06-24|1993-06-23|COLLECT COD|RAIL|: even ideas are about the furiously u +36002|178|31|4|6|6469.02|0.00|0.00|R|F|1993-05-29|1993-07-10|1993-06-18|DELIVER IN PERSON|AIR|after the quickly regular deposits. ironi +36003|1059|65|1|25|24001.25|0.00|0.07|R|F|1993-11-13|1993-12-26|1993-11-14|COLLECT COD|TRUCK|thin foxes b +36003|1435|53|2|19|25392.17|0.00|0.02|A|F|1993-12-22|1994-01-01|1994-01-14|DELIVER IN PERSON|FOB|egular theodolites +36004|987|56|1|34|64191.32|0.05|0.01|N|O|1998-05-28|1998-08-01|1998-06-09|NONE|MAIL| ironic pinto beans. accounts are s +36004|1844|31|2|26|45391.84|0.06|0.05|N|O|1998-07-19|1998-08-05|1998-08-11|TAKE BACK RETURN|MAIL| requests inte +36004|1617|18|3|6|9111.66|0.05|0.00|N|O|1998-08-24|1998-07-11|1998-09-03|NONE|RAIL| requests are quickly. final pack +36005|676|70|1|49|77256.83|0.03|0.06|R|F|1993-11-29|1993-11-21|1993-12-20|TAKE BACK RETURN|FOB|ges sleep slyly +36005|1095|1|2|37|36855.33|0.06|0.01|R|F|1993-12-26|1993-11-17|1993-12-31|DELIVER IN PERSON|REG AIR|s. quickly +36005|1163|72|3|11|11705.76|0.07|0.08|R|F|1993-12-31|1993-12-06|1994-01-12|DELIVER IN PERSON|REG AIR|warhorses. qui +36005|1475|54|4|18|24776.46|0.01|0.06|A|F|1993-10-14|1993-10-29|1993-10-15|COLLECT COD|MAIL|regular platelets are quickl +36006|582|13|1|24|35581.92|0.07|0.00|N|O|1995-12-05|1995-12-24|1995-12-16|DELIVER IN PERSON|TRUCK|final deposits boost +36006|465|53|2|8|10923.68|0.07|0.06|N|O|1996-02-08|1996-01-11|1996-02-28|DELIVER IN PERSON|AIR| haggle. blithely +36006|147|48|3|37|38744.18|0.01|0.01|N|O|1995-12-07|1996-01-07|1995-12-26|NONE|MAIL|ainst the ironic requests. carefully +36006|689|83|4|47|74714.96|0.07|0.03|N|O|1995-12-03|1995-11-25|1995-12-12|COLLECT COD|FOB|. regular th +36006|1315|30|5|50|60815.50|0.03|0.02|N|O|1995-12-04|1996-01-07|1995-12-26|DELIVER IN PERSON|MAIL|r the furiously quick accounts nag acro +36006|1065|71|6|38|36710.28|0.07|0.06|N|O|1996-01-24|1995-12-04|1996-02-21|NONE|FOB|o beans. blithely bold packages +36006|607|8|7|28|42212.80|0.05|0.06|N|O|1995-12-15|1995-12-09|1996-01-03|TAKE BACK RETURN|REG AIR|ght to detect quickly furiously +36007|309|94|1|48|58046.40|0.05|0.06|N|O|1997-08-04|1997-06-21|1997-08-10|DELIVER IN PERSON|FOB|accounts wake furiou +36032|97|48|1|37|36892.33|0.01|0.01|N|O|1997-11-13|1997-10-14|1997-12-06|NONE|MAIL|r theodolites alo +36033|1446|86|1|4|5389.76|0.09|0.01|A|F|1995-03-11|1995-02-25|1995-03-19|DELIVER IN PERSON|AIR|lyly fluffy instructions nag furio +36033|1698|99|2|24|38392.56|0.08|0.04|R|F|1995-04-17|1995-02-14|1995-05-15|NONE|FOB|e the special pa +36033|112|91|3|15|15181.65|0.04|0.01|R|F|1994-12-29|1995-03-08|1995-01-18|COLLECT COD|MAIL|refully ironi +36033|314|15|4|18|21857.58|0.00|0.04|A|F|1995-03-07|1995-01-21|1995-03-29|NONE|MAIL|eas wake furiously. packages w +36033|872|39|5|25|44321.75|0.00|0.01|R|F|1995-03-08|1995-02-15|1995-03-31|COLLECT COD|SHIP|e of the slyly ironic foxes use quic +36034|176|3|1|19|20447.23|0.01|0.01|R|F|1992-10-20|1992-11-27|1992-11-16|COLLECT COD|TRUCK| express re +36034|972|7|2|9|16856.73|0.09|0.00|R|F|1992-11-22|1993-01-10|1992-11-27|COLLECT COD|AIR|usual accou +36034|1888|75|3|9|16108.92|0.00|0.03|R|F|1993-02-05|1993-01-04|1993-02-24|DELIVER IN PERSON|FOB|y furiously ev +36034|377|6|4|1|1277.37|0.03|0.08|R|F|1993-01-25|1993-01-10|1993-02-18|NONE|SHIP|onic accounts will have to are b +36035|1726|11|1|22|35809.84|0.07|0.08|N|O|1997-03-01|1997-01-15|1997-03-29|COLLECT COD|AIR|oxes wake slyly iron +36035|1371|72|2|42|53439.54|0.03|0.03|N|O|1997-02-12|1997-01-29|1997-02-16|DELIVER IN PERSON|SHIP|carefully special pa +36036|763|64|1|44|73205.44|0.06|0.00|R|F|1993-05-19|1993-05-14|1993-05-21|NONE|REG AIR|atelets according t +36036|1143|52|2|49|51162.86|0.07|0.07|R|F|1993-04-12|1993-07-05|1993-04-23|DELIVER IN PERSON|SHIP|ar requests. blithely bold accoun +36036|1207|8|3|41|45436.20|0.02|0.04|A|F|1993-06-27|1993-05-21|1993-07-19|COLLECT COD|REG AIR|efully reg +36036|1348|87|4|22|27485.48|0.07|0.07|R|F|1993-05-15|1993-06-01|1993-06-14|NONE|FOB|lar accounts are at the fluffily final exc +36036|347|4|5|49|61119.66|0.10|0.08|R|F|1993-07-13|1993-06-14|1993-07-18|DELIVER IN PERSON|RAIL|g to the slyly silent orbits. spec +36037|752|49|1|24|39666.00|0.10|0.02|A|F|1994-07-09|1994-06-07|1994-07-21|COLLECT COD|AIR|n among the slyly silen +36037|884|84|2|18|32127.84|0.02|0.04|A|F|1994-08-26|1994-07-06|1994-09-19|NONE|FOB|special deposits sleep carefully +36037|1191|28|3|4|4368.76|0.06|0.07|R|F|1994-05-17|1994-07-15|1994-06-13|TAKE BACK RETURN|MAIL|mptotes haggle according to the close +36038|1981|14|1|31|58372.38|0.08|0.07|A|F|1992-11-15|1992-10-07|1992-11-22|NONE|RAIL|ts cajole. fluffily fina +36038|1803|90|2|42|71601.60|0.07|0.08|R|F|1992-10-01|1992-10-09|1992-10-30|DELIVER IN PERSON|REG AIR|special depende +36038|1137|10|3|3|3114.39|0.09|0.04|A|F|1992-10-05|1992-09-24|1992-11-03|DELIVER IN PERSON|RAIL|ructions grow +36039|1897|84|1|5|8994.45|0.08|0.03|N|O|1996-05-26|1996-05-07|1996-06-20|DELIVER IN PERSON|RAIL|y along the carefully regular theodolites +36039|1887|74|2|12|21466.56|0.06|0.04|N|O|1996-05-17|1996-05-19|1996-06-09|NONE|AIR|oost among the pending theodolites. quickl +36039|153|32|3|8|8425.20|0.08|0.05|N|O|1996-06-01|1996-06-25|1996-06-12|TAKE BACK RETURN|MAIL|sts against the req +36039|341|98|4|27|33516.18|0.09|0.01|N|O|1996-07-10|1996-05-30|1996-08-08|NONE|TRUCK|iously pend +36039|1185|22|5|45|48878.10|0.02|0.02|N|O|1996-04-26|1996-06-18|1996-05-16|DELIVER IN PERSON|SHIP|s nag furiously? blithely bold depende +36064|1650|51|1|4|6206.60|0.02|0.07|N|O|1997-12-18|1997-12-16|1998-01-12|DELIVER IN PERSON|SHIP| accounts. deposits wake quick +36064|55|81|2|20|19101.00|0.01|0.00|N|O|1997-12-29|1998-01-16|1998-01-23|TAKE BACK RETURN|SHIP|dencies nod about the slyly ironic reque +36064|1452|53|3|32|43310.40|0.00|0.08|N|O|1997-10-25|1997-12-26|1997-11-12|TAKE BACK RETURN|AIR| the unusual requests cajole +36064|1584|85|4|18|26740.44|0.03|0.06|N|O|1997-11-01|1997-12-10|1997-11-23|DELIVER IN PERSON|SHIP|fully unusual foxes use. slyly spe +36064|487|46|5|12|16649.76|0.10|0.02|N|O|1997-11-17|1997-12-29|1997-12-04|DELIVER IN PERSON|MAIL| ironic theodolites doubt slyly slyly bold +36064|1729|72|6|31|50552.32|0.05|0.00|N|O|1997-11-25|1998-01-05|1997-12-23|NONE|AIR|ss platelets. furio +36065|391|92|1|10|12913.90|0.04|0.02|R|F|1993-05-06|1993-03-22|1993-05-14|TAKE BACK RETURN|MAIL|ernes doubt. blithely +36065|1218|30|2|12|13430.52|0.10|0.03|A|F|1993-02-21|1993-05-13|1993-02-24|TAKE BACK RETURN|MAIL|ress somas. furiously final requests +36065|648|49|3|11|17035.04|0.00|0.08|R|F|1993-04-03|1993-05-05|1993-04-30|NONE|FOB|e alongside of the platelets? quickly e +36065|734|67|4|28|45772.44|0.00|0.04|A|F|1993-04-05|1993-04-09|1993-04-06|DELIVER IN PERSON|FOB|es use blithely alo +36065|834|34|5|47|81537.01|0.07|0.01|A|F|1993-06-16|1993-05-08|1993-07-06|DELIVER IN PERSON|RAIL|, ironic deposits cajole inside +36065|851|85|6|40|70074.00|0.06|0.04|R|F|1993-04-14|1993-05-10|1993-04-21|TAKE BACK RETURN|AIR|lly pending foxes. platel +36066|1130|31|1|2|2062.26|0.09|0.06|N|O|1997-11-16|1997-11-23|1997-11-22|COLLECT COD|SHIP|wake fluffily. bravely final f +36066|1080|81|2|22|21583.76|0.07|0.00|N|O|1997-11-19|1997-11-02|1997-11-21|DELIVER IN PERSON|REG AIR|hely bold ideas after the final, special de +36066|1122|23|3|27|27624.24|0.08|0.04|N|O|1997-09-11|1997-10-20|1997-09-28|COLLECT COD|REG AIR| accounts. furiously express t +36066|242|24|4|37|42262.88|0.04|0.06|N|O|1997-12-27|1997-11-05|1998-01-09|TAKE BACK RETURN|MAIL|phins haggle f +36066|336|37|5|46|56871.18|0.07|0.00|N|O|1997-09-12|1997-10-06|1997-09-26|TAKE BACK RETURN|FOB|pecial epitaphs eat boldly besides +36066|1438|78|6|24|32146.32|0.07|0.04|N|O|1997-12-28|1997-11-05|1998-01-27|NONE|TRUCK|e of the furiously unusual packages in +36066|1676|100|7|43|67839.81|0.08|0.02|N|O|1997-11-05|1997-11-19|1997-11-24|COLLECT COD|MAIL|c, final packages haggle slyly quickly s +36067|1348|63|1|34|42477.56|0.10|0.07|A|F|1994-07-31|1994-08-19|1994-08-27|COLLECT COD|FOB|he slyly pending ideas. depos +36067|1139|40|2|21|21842.73|0.00|0.01|R|F|1994-07-22|1994-08-18|1994-07-24|COLLECT COD|REG AIR| the pinto beans. pendi +36068|1628|11|1|2|3059.24|0.02|0.06|R|F|1994-02-24|1994-05-06|1994-03-18|COLLECT COD|MAIL|ould have to was. blithel +36068|1819|20|2|47|80878.07|0.08|0.03|A|F|1994-03-08|1994-04-16|1994-03-27|DELIVER IN PERSON|TRUCK|he regular, regular sautern +36068|1068|39|3|3|2907.18|0.06|0.05|R|F|1994-06-06|1994-03-12|1994-06-08|NONE|FOB|luffily across the ironic pinto be +36068|1096|2|4|8|7976.72|0.09|0.07|R|F|1994-04-28|1994-04-25|1994-05-01|COLLECT COD|SHIP|idle excuses above the regular requests +36068|1294|69|5|46|54983.34|0.03|0.06|R|F|1994-05-29|1994-03-20|1994-06-27|NONE|TRUCK|into beans nag among the deposits. fur +36069|81|82|1|5|4905.40|0.09|0.06|A|F|1995-02-13|1995-01-27|1995-02-14|DELIVER IN PERSON|AIR|le blithely pending pinto +36069|1529|50|2|11|15735.72|0.10|0.07|A|F|1995-02-01|1995-02-04|1995-02-04|NONE|MAIL| fluffily regular fo +36069|1497|98|3|5|6992.45|0.04|0.02|A|F|1994-12-10|1995-02-18|1995-01-08|COLLECT COD|SHIP|nal pinto beans: e +36069|1345|84|4|3|3739.02|0.04|0.06|A|F|1994-12-17|1995-02-27|1994-12-18|TAKE BACK RETURN|AIR|. ironic dugouts sublate furi +36069|1092|93|5|12|11917.08|0.03|0.01|R|F|1994-12-30|1995-02-09|1995-01-01|NONE|MAIL|s. carefully close excuses accordin +36069|452|82|6|33|44630.85|0.08|0.01|A|F|1995-03-20|1995-01-23|1995-03-25|TAKE BACK RETURN|RAIL| packages wake bli +36069|1791|34|7|11|18620.69|0.08|0.02|A|F|1995-01-26|1995-01-08|1995-02-18|NONE|TRUCK|egular deposits. carefully expres +36070|1437|77|1|30|40152.90|0.08|0.01|N|O|1998-07-08|1998-08-31|1998-07-14|COLLECT COD|MAIL|ckages. fluffily special deposits sleep sly +36070|945|80|2|41|75683.54|0.03|0.07|N|O|1998-07-29|1998-08-29|1998-08-05|DELIVER IN PERSON|SHIP| deposits after the furio +36070|302|87|3|27|32462.10|0.09|0.01|N|O|1998-08-30|1998-07-29|1998-09-23|NONE|AIR|above the slyly pending dependencies. +36070|1348|25|4|42|52472.28|0.02|0.08|N|O|1998-07-17|1998-08-21|1998-08-14|TAKE BACK RETURN|TRUCK|sits boost fluffily outside the final depo +36070|971|72|5|20|37439.40|0.05|0.03|N|O|1998-06-24|1998-08-10|1998-06-26|NONE|REG AIR|he accounts. fluffily +36070|732|65|6|14|22858.22|0.05|0.06|N|O|1998-09-11|1998-08-28|1998-10-04|TAKE BACK RETURN|REG AIR|unts. furi +36071|1953|42|1|28|51938.60|0.09|0.03|R|F|1994-03-14|1994-01-01|1994-03-17|DELIVER IN PERSON|SHIP| affix slyly slyly final inst +36096|1470|49|1|22|30172.34|0.04|0.07|A|F|1993-05-11|1993-04-05|1993-05-15|COLLECT COD|RAIL|its wake. pinto beans eat car +36096|46|22|2|28|26489.12|0.03|0.06|A|F|1993-03-23|1993-03-20|1993-03-29|DELIVER IN PERSON|AIR|ilent accounts. furiously regular deposi +36097|17|68|1|12|11004.12|0.05|0.05|N|O|1998-05-21|1998-04-26|1998-06-18|DELIVER IN PERSON|RAIL| bold, ironic requests nag blithely; fl +36097|576|67|2|12|17718.84|0.10|0.01|N|O|1998-06-14|1998-04-30|1998-07-13|TAKE BACK RETURN|RAIL|ding ideas haggle blithely a +36097|609|10|3|35|52836.00|0.07|0.03|N|O|1998-03-06|1998-05-05|1998-04-05|DELIVER IN PERSON|SHIP|use furiously after the fur +36097|1083|84|4|18|17713.44|0.09|0.06|N|O|1998-05-25|1998-03-28|1998-06-06|DELIVER IN PERSON|SHIP|ular pinto beans nod fu +36098|279|61|1|38|44812.26|0.06|0.02|N|O|1996-03-15|1996-01-20|1996-04-04|COLLECT COD|REG AIR| across the carefully +36099|622|23|1|38|57859.56|0.04|0.05|A|F|1993-12-01|1993-11-10|1993-12-11|DELIVER IN PERSON|MAIL|carefully carefully ironic fo +36099|1610|11|2|1|1511.61|0.06|0.01|R|F|1993-11-28|1993-11-18|1993-12-25|NONE|MAIL|en asymptotes. deposits along the bol +36099|1064|65|3|14|13510.84|0.02|0.00|R|F|1993-10-28|1993-11-01|1993-11-02|NONE|FOB|s. quickly regular accounts dazzl +36099|13|64|4|8|7304.08|0.07|0.08|R|F|1993-10-24|1993-11-04|1993-11-15|TAKE BACK RETURN|MAIL|nusual accounts. furiously ironic requ +36099|281|63|5|41|48432.48|0.00|0.06|R|F|1993-09-20|1993-11-20|1993-10-08|NONE|AIR|dencies. even pinto beans wake quick +36099|706|3|6|1|1606.70|0.01|0.06|R|F|1993-09-23|1993-12-13|1993-10-21|DELIVER IN PERSON|REG AIR|ng to the final accounts play +36100|1385|62|1|18|23154.84|0.10|0.07|R|F|1992-10-18|1992-10-09|1992-11-13|COLLECT COD|MAIL|s after the slyly ironic reque +36101|82|83|1|5|4910.40|0.02|0.08|R|F|1992-11-13|1992-11-19|1992-11-20|COLLECT COD|FOB|regular packages c +36101|1541|62|2|35|50488.90|0.05|0.06|A|F|1992-09-26|1992-11-08|1992-10-19|TAKE BACK RETURN|FOB|e the bravely regular dolphins int +36101|832|32|3|32|55450.56|0.02|0.04|R|F|1992-10-05|1992-10-04|1992-10-24|COLLECT COD|REG AIR|cording to th +36102|238|39|1|11|12520.53|0.07|0.05|R|F|1993-07-02|1993-08-14|1993-07-03|DELIVER IN PERSON|TRUCK|ajole. carefully express ide +36102|1953|54|2|14|25969.30|0.03|0.04|A|F|1993-06-11|1993-07-17|1993-06-13|DELIVER IN PERSON|AIR|uests sleep along the blithely ironic accou +36102|1136|9|3|19|19705.47|0.09|0.05|R|F|1993-06-26|1993-08-15|1993-07-13|NONE|TRUCK|forges. quickly final ideas breach quic +36102|1475|76|4|5|6882.35|0.02|0.03|A|F|1993-07-16|1993-07-04|1993-08-09|DELIVER IN PERSON|REG AIR|xpress requests. final deposits +36102|1482|83|5|31|42887.88|0.05|0.05|R|F|1993-08-17|1993-07-24|1993-09-08|NONE|SHIP|to the bold accounts. regular packages +36102|1279|54|6|32|37768.64|0.10|0.05|A|F|1993-07-19|1993-07-17|1993-07-26|NONE|MAIL|l orbits haggle slyly; slow +36102|1359|36|7|29|36550.15|0.07|0.07|A|F|1993-07-23|1993-08-14|1993-07-27|TAKE BACK RETURN|FOB|ress requests +36103|632|64|1|40|61305.20|0.03|0.02|R|F|1992-07-22|1992-07-25|1992-08-15|NONE|MAIL|ent, regular deposits boost carefully +36103|190|43|2|29|31615.51|0.00|0.04|R|F|1992-05-27|1992-06-16|1992-06-08|DELIVER IN PERSON|TRUCK|pecial pinto beans cajole ironic, +36103|1055|26|3|42|40154.10|0.07|0.04|R|F|1992-05-15|1992-07-21|1992-06-09|TAKE BACK RETURN|FOB|o beans would haggle furiously +36128|602|65|1|4|6010.40|0.06|0.06|N|O|1995-10-09|1995-10-11|1995-10-23|COLLECT COD|FOB|nto beans. +36128|1751|36|2|46|76026.50|0.09|0.07|N|O|1995-11-09|1995-09-20|1995-12-04|TAKE BACK RETURN|REG AIR| packages haggle carefully +36129|880|80|1|31|55207.28|0.05|0.08|N|O|1997-10-24|1997-09-22|1997-11-20|DELIVER IN PERSON|REG AIR|ep furiously instructi +36129|436|66|2|45|60139.35|0.04|0.00|N|O|1997-08-04|1997-08-30|1997-08-26|DELIVER IN PERSON|RAIL|s use across the ironic, final th +36129|752|53|3|15|24791.25|0.08|0.02|N|O|1997-11-03|1997-09-07|1997-11-13|DELIVER IN PERSON|RAIL|sts. slyly ironic deposits +36129|1984|17|4|6|11315.88|0.06|0.03|N|O|1997-11-20|1997-10-01|1997-11-28|COLLECT COD|RAIL|l, express packages. +36130|1242|17|1|23|26294.52|0.00|0.06|A|F|1992-12-26|1992-10-20|1993-01-01|COLLECT COD|SHIP|nst the rut +36130|37|38|2|11|10307.33|0.09|0.05|R|F|1992-10-31|1992-12-05|1992-11-22|DELIVER IN PERSON|REG AIR|ar accounts. platelets ab +36130|609|41|3|28|42268.80|0.01|0.08|A|F|1992-10-26|1992-11-27|1992-11-11|TAKE BACK RETURN|FOB| unusual packages. fr +36130|1930|75|4|25|45798.25|0.06|0.07|R|F|1992-11-01|1992-11-03|1992-11-05|DELIVER IN PERSON|MAIL|ublate. carefully even foxes wake instructi +36130|1329|6|5|7|8612.24|0.03|0.04|A|F|1992-10-05|1992-10-18|1992-11-01|NONE|FOB|s cajole fluffily above the slyly re +36130|129|56|6|37|38077.44|0.10|0.01|R|F|1992-10-30|1992-11-20|1992-10-31|NONE|RAIL|ep bold deposits. slyly +36130|99|100|7|8|7992.72|0.03|0.03|R|F|1992-10-24|1992-12-02|1992-10-29|DELIVER IN PERSON|REG AIR|along the b +36131|1808|38|1|27|46164.60|0.06|0.02|R|F|1994-08-09|1994-07-22|1994-09-06|COLLECT COD|FOB|pecial requests cajole slyly closely fin +36131|1919|20|2|38|69194.58|0.01|0.00|R|F|1994-07-13|1994-07-06|1994-08-08|TAKE BACK RETURN|RAIL| blithely regular deposits. blith +36131|1414|15|3|30|39462.30|0.06|0.08|A|F|1994-05-28|1994-07-05|1994-06-18|COLLECT COD|MAIL|s. requests +36131|1100|1|4|39|39042.90|0.07|0.07|A|F|1994-06-14|1994-08-07|1994-07-09|COLLECT COD|REG AIR|deas wake above th +36131|1647|89|5|38|58848.32|0.06|0.03|R|F|1994-06-27|1994-07-16|1994-07-22|NONE|REG AIR|ar deposits haggle express i +36132|1133|42|1|48|49638.24|0.05|0.08|A|F|1992-05-27|1992-06-25|1992-06-06|COLLECT COD|RAIL|ronic requests integrate blithely e +36132|314|43|2|48|58286.88|0.01|0.06|A|F|1992-05-23|1992-06-05|1992-06-18|COLLECT COD|RAIL|ar instructions haggle furiousl +36133|1994|95|1|12|22751.88|0.10|0.07|N|O|1995-10-09|1995-11-12|1995-10-22|TAKE BACK RETURN|AIR|ncies after the escapades wake blithely +36133|1571|72|2|15|22088.55|0.04|0.03|N|O|1995-11-03|1995-11-04|1995-11-30|NONE|AIR|ending requests aff +36133|570|61|3|39|57352.23|0.03|0.06|N|O|1995-12-13|1995-10-15|1996-01-07|DELIVER IN PERSON|RAIL|gainst the never regular f +36134|1691|92|1|26|41409.94|0.06|0.07|A|F|1993-12-29|1994-02-13|1994-01-01|DELIVER IN PERSON|REG AIR|s haggle carefully boldly +36135|575|66|1|9|13280.13|0.02|0.01|N|O|1995-07-14|1995-07-08|1995-07-27|COLLECT COD|AIR| even theodolites sleep quic +36135|1227|65|2|30|33846.60|0.10|0.01|N|O|1995-07-02|1995-08-16|1995-07-11|DELIVER IN PERSON|TRUCK|y excuses against the +36135|223|5|3|49|55037.78|0.10|0.02|N|O|1995-08-03|1995-08-02|1995-08-08|DELIVER IN PERSON|SHIP|ndencies about the even fo +36135|1578|59|4|31|45866.67|0.02|0.01|N|O|1995-09-20|1995-07-13|1995-10-09|NONE|FOB|ackages wake slyly after the unusual p +36135|485|44|5|25|34637.00|0.08|0.00|N|F|1995-06-15|1995-07-15|1995-06-26|TAKE BACK RETURN|REG AIR|t accounts along the furiously bo +36135|611|74|6|9|13604.49|0.03|0.08|N|O|1995-08-09|1995-08-15|1995-08-24|COLLECT COD|MAIL|lithely of the fluffily final som +36135|1299|74|7|4|4801.16|0.02|0.01|N|O|1995-08-04|1995-08-10|1995-08-10|NONE|FOB| special pinto beans wake unusual reque +36160|698|61|1|20|31973.80|0.10|0.06|A|F|1993-01-03|1993-01-10|1993-01-22|COLLECT COD|RAIL|eans. quickly regular r +36160|197|76|2|36|39498.84|0.07|0.08|A|F|1992-12-11|1993-02-11|1993-01-01|TAKE BACK RETURN|AIR|odolites around the +36161|954|57|1|26|48228.70|0.09|0.06|A|F|1993-03-10|1993-03-20|1993-03-16|TAKE BACK RETURN|REG AIR|p blithely about the iro +36161|1142|79|2|4|4172.56|0.00|0.02|A|F|1993-04-13|1993-04-01|1993-05-01|DELIVER IN PERSON|FOB|carefully across the furiously unusual +36161|1494|95|3|44|61401.56|0.07|0.05|A|F|1993-05-18|1993-03-04|1993-06-07|NONE|REG AIR|es. quickly ironi +36161|1650|51|4|31|48101.15|0.05|0.06|A|F|1993-03-16|1993-03-08|1993-03-18|TAKE BACK RETURN|RAIL|nstructions around the blithely idle +36161|410|11|5|5|6552.05|0.07|0.02|R|F|1993-03-18|1993-03-07|1993-04-14|TAKE BACK RETURN|MAIL|kages; slyly unusual requests accordi +36161|472|31|6|7|9607.29|0.07|0.06|R|F|1993-03-13|1993-03-29|1993-03-27|TAKE BACK RETURN|AIR|nto beans wake. pending +36161|856|57|7|40|70274.00|0.04|0.03|R|F|1993-03-30|1993-04-02|1993-04-05|COLLECT COD|TRUCK|e blithely flu +36162|1147|56|1|7|7336.98|0.07|0.01|N|O|1998-05-29|1998-06-23|1998-06-04|DELIVER IN PERSON|REG AIR|gular pinto +36162|1122|59|2|50|51156.00|0.02|0.02|N|O|1998-06-19|1998-08-15|1998-07-05|TAKE BACK RETURN|RAIL|uses use. silent +36163|1464|82|1|22|30040.12|0.03|0.05|R|F|1992-12-18|1992-12-12|1993-01-17|COLLECT COD|REG AIR|ss instructions detect along +36164|193|46|1|38|41541.22|0.07|0.04|N|O|1996-03-09|1996-05-15|1996-03-26|TAKE BACK RETURN|REG AIR|are carefully blithely regular theodoli +36164|235|90|2|38|43138.74|0.04|0.01|N|O|1996-03-04|1996-04-10|1996-03-18|TAKE BACK RETURN|TRUCK|ngside of the final, express pa +36165|1813|14|1|16|27436.96|0.00|0.02|N|O|1996-09-28|1996-11-11|1996-10-24|COLLECT COD|MAIL| across the furiously silent theodoli +36166|790|91|1|14|23671.06|0.10|0.00|N|O|1998-07-03|1998-08-29|1998-07-18|DELIVER IN PERSON|FOB| braids. b +36166|995|64|2|46|87215.54|0.08|0.06|N|O|1998-10-08|1998-08-18|1998-10-28|NONE|AIR|pending dependencies enga +36167|1015|21|1|30|27480.30|0.00|0.07|N|O|1997-06-02|1997-06-11|1997-06-18|NONE|FOB|blithely regular foxes +36167|994|97|2|22|41689.78|0.07|0.03|N|O|1997-05-28|1997-06-09|1997-06-06|DELIVER IN PERSON|TRUCK|refully pending instructions. even +36192|543|74|1|42|60628.68|0.03|0.04|N|O|1996-05-05|1996-06-24|1996-05-13|NONE|SHIP| foxes. sl +36192|377|6|2|21|26824.77|0.01|0.08|N|O|1996-06-23|1996-06-22|1996-07-18|NONE|REG AIR|y ironic ideas; unusual, iron +36192|285|67|3|38|45040.64|0.04|0.01|N|O|1996-06-21|1996-06-25|1996-07-14|TAKE BACK RETURN|FOB|o beans. blithely regular packages hag +36193|842|76|1|14|24399.76|0.01|0.08|N|O|1995-09-01|1995-09-06|1995-09-03|NONE|TRUCK|ithe accounts. even foxes ca +36193|1317|32|2|29|35330.99|0.03|0.00|N|O|1995-10-28|1995-08-29|1995-10-31|DELIVER IN PERSON|MAIL|ress packages alongside of the sly +36193|131|84|3|21|21653.73|0.06|0.08|N|O|1995-11-20|1995-09-18|1995-11-28|DELIVER IN PERSON|REG AIR|y regular theodolites. ca +36193|1990|35|4|32|60543.68|0.05|0.01|N|O|1995-10-21|1995-09-10|1995-11-12|DELIVER IN PERSON|SHIP|uriously silent requests against the +36193|1065|71|5|18|17389.08|0.08|0.01|N|O|1995-10-25|1995-10-20|1995-11-24|COLLECT COD|REG AIR|y regular excuses. furiously unus +36193|1705|90|6|15|24100.50|0.07|0.03|N|O|1995-10-04|1995-10-20|1995-10-19|TAKE BACK RETURN|TRUCK|uickly-- blithely regular theodolites +36194|1451|52|1|29|39221.05|0.05|0.01|N|O|1998-01-04|1998-01-16|1998-01-25|NONE|REG AIR|e carefully across the quickly +36194|1659|83|2|25|39016.25|0.09|0.04|N|O|1998-01-16|1998-02-04|1998-02-04|TAKE BACK RETURN|TRUCK|es poach q +36194|201|2|3|35|38542.00|0.00|0.08|N|O|1998-03-28|1998-02-17|1998-04-08|NONE|REG AIR|express packages cajole slyly slyly even +36194|478|37|4|38|52381.86|0.09|0.00|N|O|1997-12-23|1998-02-28|1997-12-25|TAKE BACK RETURN|TRUCK|osits grow fluffily quic +36194|490|49|5|27|37543.23|0.00|0.08|N|O|1998-01-12|1998-03-07|1998-01-21|DELIVER IN PERSON|SHIP|ending instructions. blithely final accou +36194|410|69|6|11|14414.51|0.09|0.00|N|O|1998-01-07|1998-01-30|1998-02-03|DELIVER IN PERSON|MAIL|s breach. dog +36195|1425|65|1|35|46424.70|0.01|0.07|N|O|1997-08-06|1997-07-25|1997-08-31|DELIVER IN PERSON|TRUCK|lly furiously +36195|69|45|2|8|7752.48|0.02|0.05|N|O|1997-08-29|1997-08-20|1997-09-08|TAKE BACK RETURN|TRUCK|o the furiously pending dolphins. inst +36195|411|41|3|31|40653.71|0.00|0.07|N|O|1997-08-09|1997-07-09|1997-08-30|TAKE BACK RETURN|MAIL|ly bold requests +36195|371|56|4|6|7628.22|0.02|0.01|N|O|1997-06-11|1997-07-17|1997-07-03|COLLECT COD|AIR|thely. slyly pending platelets acco +36195|1461|62|5|19|25886.74|0.10|0.07|N|O|1997-07-03|1997-09-01|1997-07-30|NONE|AIR|lites use furiously above +36195|1675|99|6|21|33110.07|0.05|0.04|N|O|1997-10-05|1997-07-22|1997-10-06|TAKE BACK RETURN|MAIL|nal accounts. bold deposits are. i +36196|82|58|1|8|7856.64|0.08|0.05|N|O|1995-12-03|1995-10-16|1995-12-13|COLLECT COD|FOB|e regular, final accou +36196|1497|15|2|25|34962.25|0.00|0.03|N|O|1995-10-15|1995-09-17|1995-11-02|COLLECT COD|RAIL|s boost blithely pending packages. depende +36196|1567|48|3|13|19091.28|0.05|0.03|N|O|1995-11-10|1995-10-08|1995-11-21|COLLECT COD|TRUCK|deposits ca +36196|518|9|4|43|60995.93|0.05|0.05|N|O|1995-10-04|1995-09-16|1995-10-21|TAKE BACK RETURN|FOB|accounts. sheaves +36196|57|58|5|17|16269.85|0.10|0.01|N|O|1995-08-19|1995-10-15|1995-09-11|DELIVER IN PERSON|RAIL|riously unusual theodolites nag q +36197|740|37|1|45|73833.30|0.03|0.01|R|F|1995-03-17|1995-03-03|1995-03-26|DELIVER IN PERSON|FOB|tain carefully re +36197|1155|92|2|29|30628.35|0.06|0.00|R|F|1995-05-11|1995-03-18|1995-05-20|NONE|FOB|e carefully final decoys. express asympto +36197|936|5|3|40|73477.20|0.07|0.04|R|F|1995-03-31|1995-03-25|1995-04-22|COLLECT COD|FOB|totes. slowl +36197|1457|75|4|47|63847.15|0.10|0.02|A|F|1995-04-28|1995-03-06|1995-04-30|DELIVER IN PERSON|MAIL|lithely even requests cajole after +36198|1900|30|1|32|57660.80|0.02|0.07|N|O|1995-09-14|1995-09-05|1995-10-12|DELIVER IN PERSON|REG AIR|ular requests around the +36198|700|32|2|31|49621.70|0.03|0.05|N|O|1995-10-22|1995-09-01|1995-11-01|TAKE BACK RETURN|TRUCK| furiously. special deposits grow furiousl +36199|1834|35|1|29|50339.07|0.10|0.02|N|O|1996-02-26|1996-04-02|1996-03-06|COLLECT COD|RAIL|sts solve quick +36199|1450|90|2|40|54058.00|0.06|0.00|N|O|1996-04-12|1996-05-14|1996-05-05|COLLECT COD|TRUCK|ronic ideas. packages sleep blithely afte +36199|563|24|3|36|52688.16|0.02|0.04|N|O|1996-05-15|1996-04-12|1996-05-31|NONE|FOB|equests cajole after the blithely final +36224|187|14|1|13|14133.34|0.06|0.00|A|F|1994-05-12|1994-07-29|1994-05-29|DELIVER IN PERSON|FOB|uests nag furiously deposi +36224|1813|100|2|28|48014.68|0.08|0.00|R|F|1994-08-25|1994-07-08|1994-08-27|TAKE BACK RETURN|SHIP|heodolites haggle slyly. slyly special depo +36224|1232|33|3|48|54395.04|0.01|0.07|A|F|1994-07-18|1994-06-16|1994-07-22|TAKE BACK RETURN|REG AIR|unusual packages impress: daringly fin +36225|481|82|1|29|40062.92|0.10|0.05|N|O|1997-10-06|1997-07-11|1997-11-02|COLLECT COD|TRUCK|boost furiously quickly pending packages. +36225|180|7|2|22|23763.96|0.08|0.03|N|O|1997-08-02|1997-08-23|1997-08-09|TAKE BACK RETURN|TRUCK|le quickly express instructions. slyly f +36225|1190|91|3|33|36009.27|0.02|0.08|N|O|1997-09-11|1997-08-30|1997-10-01|DELIVER IN PERSON|SHIP|lithely bold instructions +36226|571|2|1|31|45618.67|0.00|0.05|N|O|1997-04-19|1997-02-07|1997-05-19|TAKE BACK RETURN|MAIL|ic deposits. regular foxes are up the foxe +36226|838|39|2|45|78247.35|0.02|0.04|N|O|1997-03-04|1997-02-19|1997-03-26|TAKE BACK RETURN|MAIL|ding frays wake ironic, reg +36226|1635|18|3|7|10756.41|0.06|0.07|N|O|1997-03-02|1997-02-26|1997-03-21|DELIVER IN PERSON|REG AIR|lyly carefully ironic requests? slyly bold +36226|274|2|4|46|54016.42|0.06|0.01|N|O|1997-03-12|1997-02-11|1997-04-02|NONE|RAIL|ickly above the blithely bold accou +36226|886|53|5|40|71475.20|0.07|0.03|N|O|1997-01-02|1997-03-27|1997-01-04|DELIVER IN PERSON|MAIL| packages. carefully ir +36227|1772|99|1|48|80340.96|0.10|0.05|N|O|1996-06-11|1996-05-22|1996-06-25|NONE|MAIL|ncies could haggle accordi +36227|1057|58|2|48|45986.40|0.07|0.05|N|O|1996-05-15|1996-05-20|1996-05-30|DELIVER IN PERSON|AIR|heodolites haggle. pi +36227|1695|96|3|31|49497.39|0.06|0.07|N|O|1996-06-25|1996-06-14|1996-07-06|COLLECT COD|FOB|across the regular, expres +36227|583|44|4|32|47474.56|0.02|0.06|N|O|1996-05-03|1996-04-29|1996-05-09|TAKE BACK RETURN|FOB|y. dogged dependencies sleep car +36228|1153|54|1|11|11595.65|0.10|0.02|N|O|1998-02-25|1998-02-04|1998-03-19|DELIVER IN PERSON|FOB|, express exc +36228|465|53|2|16|21847.36|0.01|0.08|N|O|1998-01-24|1998-02-15|1998-01-27|TAKE BACK RETURN|SHIP|etly final deposits. iron +36228|667|68|3|13|20379.58|0.01|0.06|N|O|1997-12-28|1998-02-25|1998-01-11|NONE|SHIP|ough the unusual th +36228|1680|4|4|21|33215.28|0.02|0.04|N|O|1998-03-23|1998-02-13|1998-04-09|COLLECT COD|AIR| nag at the regular warhorses; bli +36229|1082|83|1|19|18678.52|0.06|0.01|A|F|1992-11-28|1992-12-19|1992-12-13|NONE|FOB|uctions. furious, final pains are idea +36229|1748|49|2|36|59390.64|0.04|0.00|R|F|1992-11-05|1992-12-10|1992-12-05|COLLECT COD|REG AIR|the slyly regular packages. carefu +36229|1661|62|3|42|65631.72|0.04|0.06|A|F|1992-12-18|1992-11-29|1992-12-31|DELIVER IN PERSON|FOB| foxes solve bli +36229|821|21|4|15|25827.30|0.08|0.06|R|F|1993-01-05|1992-12-08|1993-01-21|NONE|FOB|lyly unusual requests. final d +36229|664|65|5|10|15646.60|0.03|0.05|A|F|1992-09-26|1992-11-11|1992-10-21|DELIVER IN PERSON|REG AIR|y brave courts. slyly pending pinto beans a +36229|1917|50|6|42|76394.22|0.01|0.03|R|F|1992-10-12|1992-12-03|1992-10-28|COLLECT COD|MAIL|ccording to +36229|1574|95|7|31|45742.67|0.09|0.00|R|F|1992-12-05|1992-11-16|1992-12-31|DELIVER IN PERSON|RAIL|ffily even deposits coul +36230|689|83|1|37|58818.16|0.01|0.06|R|F|1994-07-30|1994-07-17|1994-08-04|COLLECT COD|REG AIR| beans. ironic, ironi +36230|1124|61|2|4|4100.48|0.01|0.05|R|F|1994-08-17|1994-08-25|1994-09-06|DELIVER IN PERSON|SHIP|furious theodolites are blithely ex +36230|1559|80|3|27|39434.85|0.00|0.04|R|F|1994-06-29|1994-08-13|1994-07-03|COLLECT COD|RAIL|e slyly. quickly expr +36230|1762|5|4|33|54904.08|0.03|0.07|R|F|1994-06-14|1994-08-08|1994-06-30|NONE|MAIL|he ruthlessly re +36230|998|1|5|34|64565.66|0.07|0.04|R|F|1994-07-29|1994-09-04|1994-08-18|COLLECT COD|TRUCK|thely regular theodolites. platelets cajol +36230|104|57|6|8|8032.80|0.06|0.04|R|F|1994-06-23|1994-07-29|1994-07-09|DELIVER IN PERSON|REG AIR|olites. quickly express deposits are. +36230|499|100|7|38|53180.62|0.05|0.07|A|F|1994-08-06|1994-08-11|1994-08-27|DELIVER IN PERSON|RAIL|iet, final +36231|1060|31|1|41|39403.46|0.04|0.05|A|F|1992-12-16|1993-02-18|1993-01-09|TAKE BACK RETURN|MAIL|blithely final deposits nag across the +36231|1334|11|2|7|8647.31|0.01|0.08|A|F|1993-01-15|1993-01-22|1993-01-25|COLLECT COD|RAIL|lar requests. slyly regular accounts use +36231|1708|9|3|30|48291.00|0.10|0.06|R|F|1993-03-26|1993-02-09|1993-04-07|NONE|SHIP|ide of the slyly special instructions +36256|1156|93|1|7|7400.05|0.03|0.00|N|O|1996-12-24|1997-02-10|1997-01-10|DELIVER IN PERSON|SHIP|old packages. even, bold instructions +36256|517|48|2|40|56700.40|0.02|0.03|N|O|1997-02-22|1997-03-20|1997-03-21|NONE|AIR| do cajole final accounts. reg +36256|522|53|3|24|34140.48|0.06|0.04|N|O|1996-12-28|1997-03-18|1996-12-29|TAKE BACK RETURN|FOB|inal packages bo +36256|733|34|4|47|76785.31|0.10|0.04|N|O|1996-12-27|1997-02-20|1997-01-25|TAKE BACK RETURN|FOB|final ideas. unusual, final gifts hag +36256|215|16|5|27|30110.67|0.04|0.01|N|O|1997-01-19|1997-02-06|1997-02-12|DELIVER IN PERSON|SHIP|inal instru +36256|1163|64|6|2|2128.32|0.06|0.00|N|O|1996-12-30|1997-01-28|1997-01-24|NONE|SHIP|wake quickly according to the deposits +36256|764|97|7|37|61596.12|0.07|0.01|N|O|1997-01-23|1997-03-01|1997-01-26|TAKE BACK RETURN|TRUCK|y. furiously final courts slee +36257|78|29|1|43|42057.01|0.09|0.06|A|F|1992-03-07|1992-05-26|1992-03-26|COLLECT COD|AIR|ts. sly deposits +36257|645|8|2|20|30912.80|0.00|0.06|A|F|1992-06-15|1992-05-10|1992-06-28|DELIVER IN PERSON|SHIP|en foxes. regular ideas nag. care +36257|396|25|3|19|24631.41|0.10|0.06|A|F|1992-03-03|1992-04-25|1992-03-20|DELIVER IN PERSON|MAIL| haggle bravely regular dolphins. fi +36258|1967|56|1|42|78496.32|0.00|0.00|A|F|1995-03-24|1995-03-27|1995-04-19|TAKE BACK RETURN|RAIL|ages. ironic excuses after the furiously +36258|1453|93|2|2|2708.90|0.04|0.08|A|F|1995-04-07|1995-04-27|1995-04-18|NONE|AIR|t, unusual waters. blithely re +36258|1384|85|3|41|52700.58|0.00|0.08|A|F|1995-02-18|1995-03-12|1995-02-24|DELIVER IN PERSON|SHIP|ent packages across the theodolites boost +36259|1180|89|1|21|22704.78|0.05|0.05|N|O|1996-12-12|1996-12-21|1996-12-23|NONE|SHIP| ironic dependencies wake furiously +36260|433|21|1|46|61337.78|0.10|0.00|N|O|1997-12-14|1997-11-13|1998-01-06|DELIVER IN PERSON|TRUCK|ly regular dependencies haggle furi +36260|945|80|2|29|53532.26|0.02|0.02|N|O|1997-12-26|1997-10-18|1998-01-06|TAKE BACK RETURN|TRUCK|s cajole furiousl +36260|594|55|3|11|16440.49|0.06|0.00|N|O|1997-11-13|1997-11-27|1997-11-29|TAKE BACK RETURN|MAIL|osits. fluffily +36261|1988|89|1|42|79379.16|0.01|0.00|N|O|1996-06-22|1996-07-01|1996-07-01|NONE|RAIL| deposits up +36261|1412|52|2|10|13134.10|0.00|0.00|N|O|1996-08-13|1996-06-29|1996-08-31|COLLECT COD|TRUCK|. quickly ironic requests sleep furi +36261|1185|86|3|38|41274.84|0.03|0.03|N|O|1996-06-08|1996-07-10|1996-06-17|DELIVER IN PERSON|FOB|ily. instruc +36261|1222|23|4|26|29203.72|0.04|0.01|N|O|1996-07-12|1996-07-31|1996-07-25|DELIVER IN PERSON|TRUCK|ole furiously above the +36261|700|94|5|34|54423.80|0.03|0.01|N|O|1996-06-14|1996-07-31|1996-07-01|COLLECT COD|REG AIR|und the ideas affix blithely furiously bol +36261|1162|35|6|1|1063.16|0.09|0.02|N|O|1996-06-18|1996-06-23|1996-07-08|NONE|AIR|osits? silent deposits sleep thinly after +36261|277|32|7|44|51799.88|0.02|0.08|N|O|1996-07-05|1996-06-19|1996-07-13|COLLECT COD|SHIP|s integrate fluffily. +36262|1147|20|1|48|50310.72|0.10|0.08|A|F|1993-09-07|1993-09-05|1993-10-06|DELIVER IN PERSON|MAIL|nts. quickly silent c +36262|152|79|2|1|1052.15|0.00|0.01|R|F|1993-09-12|1993-09-10|1993-10-11|DELIVER IN PERSON|FOB|s must have to wake. furiously silent de +36262|798|99|3|36|61156.44|0.04|0.08|A|F|1993-10-08|1993-10-21|1993-11-06|COLLECT COD|AIR|s detect quickly carefully pending accoun +36262|1803|90|4|13|22162.40|0.07|0.01|R|F|1993-10-18|1993-10-01|1993-11-01|TAKE BACK RETURN|RAIL|ve the regular, iro +36262|1039|40|5|8|7520.24|0.09|0.08|R|F|1993-11-07|1993-09-17|1993-11-08|TAKE BACK RETURN|RAIL|ckly blithely final ideas. slyly pe +36262|1784|27|6|21|35401.38|0.04|0.01|A|F|1993-10-25|1993-09-24|1993-11-09|NONE|RAIL|es according to +36263|1770|97|1|6|10030.62|0.04|0.05|N|O|1998-01-30|1998-04-23|1998-02-10|COLLECT COD|RAIL|posits integrate furiously ironic, ironic +36263|1069|40|2|35|33952.10|0.05|0.04|N|O|1998-05-14|1998-03-28|1998-05-22|DELIVER IN PERSON|FOB|efully. silent, c +36263|1873|74|3|47|83418.89|0.08|0.01|N|O|1998-05-06|1998-04-03|1998-05-17|NONE|AIR|uests integrate +36263|831|32|4|40|69273.20|0.06|0.03|N|O|1998-03-13|1998-03-16|1998-03-21|TAKE BACK RETURN|AIR|oost after the c +36263|311|68|5|34|41184.54|0.09|0.01|N|O|1998-03-31|1998-04-24|1998-04-25|DELIVER IN PERSON|TRUCK|ng the dugouts. quickly final depos +36263|481|40|6|28|38681.44|0.00|0.04|N|O|1998-03-29|1998-03-21|1998-04-19|NONE|SHIP|ng the accounts boost at the pen +36288|1849|93|1|46|80538.64|0.05|0.03|A|F|1993-01-28|1993-04-18|1993-02-17|TAKE BACK RETURN|TRUCK| wake. slyly unusual pi +36289|1205|43|1|47|51991.40|0.06|0.02|R|F|1994-06-04|1994-06-29|1994-06-13|NONE|REG AIR|ironic asymptotes sleep! theodolites about +36289|1110|83|2|2|2022.22|0.00|0.05|A|F|1994-08-31|1994-08-17|1994-09-08|COLLECT COD|SHIP|nic instructions breach foxes. c +36289|1935|80|3|50|91846.50|0.00|0.02|A|F|1994-07-15|1994-07-23|1994-07-28|COLLECT COD|REG AIR|e furiously regular +36289|922|23|4|49|89323.08|0.06|0.04|R|F|1994-06-21|1994-08-20|1994-07-12|COLLECT COD|SHIP|accounts int +36290|944|79|1|4|7379.76|0.09|0.08|R|F|1993-10-24|1993-12-07|1993-11-10|NONE|SHIP|quests wake ideas. +36290|1161|34|2|14|14870.24|0.06|0.05|A|F|1993-11-14|1993-12-01|1993-11-18|COLLECT COD|TRUCK|ess instructions. slyly unusual excuses in +36291|935|38|1|27|49570.11|0.10|0.04|N|O|1997-10-03|1997-08-09|1997-10-12|TAKE BACK RETURN|TRUCK|ular, regu +36291|1687|88|2|4|6354.72|0.04|0.07|N|O|1997-07-14|1997-07-21|1997-07-17|COLLECT COD|REG AIR|ithely. express, +36291|448|36|3|22|29665.68|0.06|0.04|N|O|1997-10-16|1997-08-17|1997-11-04|NONE|AIR| to the fluffily ironic foxes. i +36291|219|74|4|22|24622.62|0.08|0.00|N|O|1997-07-15|1997-08-21|1997-07-27|NONE|AIR|ounts; special pinto beans +36292|1056|92|1|46|44024.30|0.02|0.02|R|F|1993-04-21|1993-04-26|1993-04-27|DELIVER IN PERSON|RAIL| sleep after the quickly silen +36292|165|66|2|15|15977.40|0.04|0.02|A|F|1993-03-26|1993-03-27|1993-03-28|COLLECT COD|SHIP|oost unusual requests. regular ideas sle +36292|1972|61|3|32|59967.04|0.07|0.02|R|F|1993-06-06|1993-03-23|1993-06-12|TAKE BACK RETURN|SHIP|dolites cajole. never busy cou +36292|1931|32|4|7|12830.51|0.10|0.03|A|F|1993-05-27|1993-05-02|1993-06-11|TAKE BACK RETURN|AIR|long the ironic packages. +36292|1207|45|5|35|38787.00|0.02|0.07|A|F|1993-03-06|1993-04-13|1993-03-31|DELIVER IN PERSON|FOB| quickly. even deposits integrate. iro +36292|88|89|6|38|37547.04|0.04|0.02|A|F|1993-05-21|1993-04-07|1993-05-25|TAKE BACK RETURN|MAIL|ully regular accounts cajole slyly. qui +36293|87|63|1|44|43431.52|0.04|0.02|A|F|1994-01-14|1994-02-16|1994-01-19|COLLECT COD|AIR|pecial accounts cajole +36293|61|62|2|46|44208.76|0.09|0.05|A|F|1994-01-11|1994-02-20|1994-01-24|TAKE BACK RETURN|TRUCK|t boldly slyly special i +36293|1739|40|3|16|26251.68|0.10|0.05|R|F|1994-03-29|1994-03-22|1994-04-22|NONE|SHIP|regular escapades. pendin +36293|1317|56|4|5|6091.55|0.06|0.03|A|F|1994-04-17|1994-03-26|1994-04-21|COLLECT COD|REG AIR|efully ironic deposits. slyly unusual r +36293|450|51|5|5|6752.25|0.04|0.06|R|F|1994-01-27|1994-03-17|1994-01-29|TAKE BACK RETURN|FOB| ironic accounts. +36293|1207|82|6|5|5541.00|0.08|0.08|R|F|1994-02-27|1994-03-08|1994-03-19|COLLECT COD|MAIL|ake furiously. blithely ruthless +36294|1368|83|1|1|1269.36|0.08|0.08|A|F|1992-12-01|1992-10-10|1992-12-05|DELIVER IN PERSON|MAIL|odolites wake after the f +36294|1366|5|2|9|11406.24|0.08|0.07|A|F|1992-11-15|1992-11-02|1992-11-18|DELIVER IN PERSON|FOB|cies wake abo +36294|1790|33|3|8|13534.32|0.07|0.05|R|F|1992-10-30|1992-10-09|1992-11-06|NONE|RAIL|ly quickly +36295|1188|97|1|25|27229.50|0.10|0.08|R|F|1993-11-02|1993-10-30|1993-11-26|TAKE BACK RETURN|RAIL|depths acros +36295|544|75|2|33|47669.82|0.09|0.00|R|F|1993-12-22|1993-11-17|1994-01-17|NONE|RAIL|olites across the furiously pending ex +36295|1910|55|3|6|10871.46|0.00|0.02|A|F|1993-09-21|1993-11-22|1993-10-07|COLLECT COD|RAIL| platelets nag slyly even deposit +36295|1159|68|4|39|41345.85|0.09|0.03|A|F|1993-10-12|1993-10-18|1993-10-30|COLLECT COD|TRUCK| beans. furiously unusual +36295|1400|1|5|12|15616.80|0.08|0.02|R|F|1993-11-23|1993-10-21|1993-12-01|COLLECT COD|SHIP|ackages haggle +36295|1892|22|6|7|12557.23|0.05|0.04|A|F|1993-11-12|1993-11-16|1993-12-05|NONE|TRUCK|ironic theodolit +36320|1438|39|1|44|58934.92|0.05|0.05|R|F|1994-09-12|1994-11-03|1994-10-06|NONE|REG AIR|ending patterns. bold deposits pla +36320|71|47|2|12|11652.84|0.06|0.03|A|F|1994-08-11|1994-10-11|1994-08-12|NONE|MAIL|ven instruct +36320|437|25|3|6|8024.58|0.06|0.08|R|F|1994-08-14|1994-10-03|1994-08-22|TAKE BACK RETURN|REG AIR|even accounts boost fluffily slyl +36321|359|16|1|18|22668.30|0.00|0.00|N|O|1995-11-16|1995-12-03|1995-11-17|TAKE BACK RETURN|TRUCK|deposits nag slyly unusual pint +36321|1121|94|2|40|40884.80|0.03|0.00|N|O|1995-09-28|1995-11-27|1995-10-18|COLLECT COD|SHIP|ges. blith +36322|1294|6|1|27|32272.83|0.09|0.05|N|O|1996-07-24|1996-07-12|1996-08-06|COLLECT COD|MAIL|ly regular ideas. car +36322|1262|63|2|18|20938.68|0.06|0.08|N|O|1996-07-13|1996-06-15|1996-07-14|DELIVER IN PERSON|MAIL|usly final +36322|459|47|3|47|63894.15|0.03|0.01|N|O|1996-05-25|1996-06-19|1996-06-02|COLLECT COD|SHIP|into beans. fluffily pending packages slee +36323|830|64|1|33|57117.39|0.05|0.00|A|F|1994-01-13|1994-01-15|1994-02-07|TAKE BACK RETURN|RAIL|counts cajole carefully pending excuses. +36324|550|41|1|26|37714.30|0.06|0.03|A|F|1992-05-31|1992-07-31|1992-06-15|TAKE BACK RETURN|AIR| special ideas use +36324|1422|1|2|13|17204.46|0.00|0.08|A|F|1992-08-06|1992-07-18|1992-08-09|TAKE BACK RETURN|RAIL|bold pinto beans are slyly. slyly spe +36324|1080|51|3|7|6867.56|0.09|0.07|A|F|1992-08-15|1992-07-06|1992-08-22|TAKE BACK RETURN|RAIL| furiously +36324|925|60|4|6|10955.52|0.04|0.01|R|F|1992-08-20|1992-07-19|1992-08-31|NONE|REG AIR|egular gifts +36324|488|76|5|26|36100.48|0.04|0.04|A|F|1992-07-25|1992-06-27|1992-08-01|DELIVER IN PERSON|TRUCK|ts. ironic p +36324|1795|80|6|16|27148.64|0.03|0.06|R|F|1992-06-07|1992-08-07|1992-06-25|DELIVER IN PERSON|RAIL|nd the final, regular accounts. regu +36325|186|13|1|16|17378.88|0.03|0.03|N|O|1997-04-17|1997-02-15|1997-05-09|TAKE BACK RETURN|TRUCK|ly final accounts about the final, eve +36325|1897|27|2|10|17988.90|0.05|0.01|N|O|1997-01-23|1997-03-26|1997-02-07|DELIVER IN PERSON|REG AIR|nt instructions haggle slyl +36325|1403|4|3|33|43045.20|0.06|0.03|N|O|1997-01-14|1997-03-09|1997-01-26|TAKE BACK RETURN|RAIL|usly bold deposits doubt against the car +36326|247|2|1|3|3441.72|0.00|0.03|R|F|1993-08-31|1993-09-11|1993-09-19|DELIVER IN PERSON|MAIL|ly ironic packages-- even, bold d +36327|283|84|1|42|49697.76|0.07|0.04|A|F|1995-02-26|1995-01-13|1995-03-06|NONE|FOB|leep except +36327|196|75|2|20|21923.80|0.02|0.04|A|F|1995-02-15|1995-01-14|1995-02-24|NONE|RAIL|ove the even accounts haggle s +36327|747|48|3|12|19772.88|0.01|0.08|R|F|1995-01-25|1995-01-25|1995-02-14|COLLECT COD|AIR|s nag blithely silent accounts. furio +36327|922|57|4|24|43750.08|0.02|0.02|A|F|1995-02-10|1995-01-02|1995-03-02|COLLECT COD|FOB|pecial foxes cajole blith +36352|1209|21|1|10|11102.00|0.10|0.07|A|F|1995-04-26|1995-05-30|1995-05-20|DELIVER IN PERSON|AIR| unusual platel +36352|1416|17|2|3|3952.23|0.10|0.02|N|F|1995-06-10|1995-05-05|1995-07-01|DELIVER IN PERSON|SHIP|ironic requests. closely final requests caj +36352|1036|7|3|21|19677.63|0.05|0.03|R|F|1995-05-06|1995-05-29|1995-05-10|DELIVER IN PERSON|RAIL|e special platelets. blithely re +36352|926|61|4|24|43846.08|0.10|0.04|R|F|1995-06-06|1995-05-19|1995-06-17|TAKE BACK RETURN|AIR|ealms. furiously regula +36353|112|91|1|31|31375.41|0.02|0.01|N|O|1996-11-04|1996-09-18|1996-11-08|TAKE BACK RETURN|REG AIR|lly even packages wa +36353|1651|75|2|36|55895.40|0.02|0.08|N|O|1996-09-22|1996-09-15|1996-10-20|NONE|AIR|he carefully bold platelets +36353|1818|5|3|12|20637.72|0.00|0.03|N|O|1996-11-25|1996-10-18|1996-12-10|COLLECT COD|REG AIR|y ironic acc +36353|1809|53|4|42|71853.60|0.03|0.07|N|O|1996-08-13|1996-09-29|1996-08-27|DELIVER IN PERSON|TRUCK|le closely along the quickly s +36353|1677|1|5|9|14208.03|0.02|0.08|N|O|1996-10-07|1996-11-07|1996-10-27|DELIVER IN PERSON|FOB|nal excuses +36354|259|87|1|8|9274.00|0.04|0.07|R|F|1992-06-15|1992-07-12|1992-07-05|NONE|FOB|n deposits detect furi +36354|1478|57|2|42|57937.74|0.00|0.02|A|F|1992-07-15|1992-07-23|1992-07-31|TAKE BACK RETURN|RAIL|ave to slee +36354|1116|17|3|24|24410.64|0.05|0.08|R|F|1992-09-06|1992-08-01|1992-10-03|DELIVER IN PERSON|TRUCK|ss the packa +36354|1681|23|4|46|72803.28|0.02|0.03|A|F|1992-06-15|1992-08-17|1992-07-01|TAKE BACK RETURN|TRUCK|sts about the furiously close accounts +36354|624|56|5|19|28967.78|0.00|0.00|A|F|1992-08-17|1992-07-16|1992-09-10|TAKE BACK RETURN|RAIL|s. furiously express accounts detect unus +36355|711|12|1|47|75750.37|0.05|0.04|A|F|1994-12-22|1995-03-02|1995-01-20|DELIVER IN PERSON|REG AIR|yly bold ideas. ideas alongside of th +36355|1016|22|2|25|22925.25|0.05|0.05|A|F|1995-03-30|1995-02-04|1995-04-24|TAKE BACK RETURN|RAIL|final attain +36355|648|42|3|13|20132.32|0.08|0.04|A|F|1995-03-15|1995-01-17|1995-03-30|COLLECT COD|AIR|ss instructions. bold package +36355|1625|8|4|46|70224.52|0.08|0.04|A|F|1994-12-07|1995-02-19|1994-12-25|NONE|AIR|olphins mold after the fluffily ironic +36355|541|32|5|8|11532.32|0.07|0.01|R|F|1994-12-26|1995-02-02|1994-12-28|DELIVER IN PERSON|MAIL| special deposits ca +36355|1781|66|6|16|26924.48|0.03|0.01|A|F|1994-12-17|1995-01-20|1995-01-16|COLLECT COD|SHIP|gular deposits. carefully ir +36355|1062|68|7|27|26002.62|0.00|0.07|A|F|1995-01-07|1995-02-19|1995-02-05|COLLECT COD|REG AIR|efully furiously regular +36356|1355|94|1|9|11307.15|0.09|0.02|N|O|1996-03-04|1996-01-25|1996-03-07|DELIVER IN PERSON|TRUCK|ges. slyly final deposits +36356|454|42|2|8|10835.60|0.04|0.00|N|O|1996-01-22|1996-03-12|1996-02-05|TAKE BACK RETURN|MAIL|uickly. fluffily silent ideas x-r +36356|1436|76|3|12|16049.16|0.04|0.01|N|O|1996-01-23|1996-02-29|1996-02-05|COLLECT COD|SHIP|thely fluffily final requests. +36356|1836|66|4|5|8689.15|0.06|0.00|N|O|1996-02-21|1996-02-06|1996-03-09|TAKE BACK RETURN|FOB|iously regular asymp +36356|28|29|5|4|3712.08|0.09|0.06|N|O|1996-03-23|1996-02-26|1996-04-19|DELIVER IN PERSON|SHIP| final accounts. final platele +36356|1186|59|6|21|22830.78|0.08|0.04|N|O|1996-04-18|1996-03-13|1996-05-09|TAKE BACK RETURN|AIR|inst the final theodolites +36356|1420|38|7|39|51535.38|0.10|0.04|N|O|1996-02-26|1996-03-12|1996-03-23|TAKE BACK RETURN|FOB|bout the furiously +36357|270|25|1|1|1170.27|0.01|0.05|A|F|1992-04-27|1992-04-02|1992-04-30|NONE|FOB|ickly busy +36357|1817|61|2|9|15469.29|0.10|0.00|A|F|1992-05-09|1992-03-18|1992-05-31|NONE|MAIL|s promise across the slyly even +36357|672|66|3|8|12581.36|0.09|0.07|R|F|1992-03-07|1992-03-08|1992-03-10|TAKE BACK RETURN|REG AIR|ely bold depo +36357|1557|38|4|19|27712.45|0.00|0.08|A|F|1992-04-11|1992-02-25|1992-04-17|COLLECT COD|MAIL| special pinto be +36357|124|3|5|46|47109.52|0.10|0.02|R|F|1992-05-10|1992-02-21|1992-05-12|DELIVER IN PERSON|RAIL|ests! regular somas detect. asymptotes s +36357|839|73|6|12|20877.96|0.02|0.02|A|F|1992-01-19|1992-03-31|1992-02-06|COLLECT COD|SHIP|its. fluffily ironic acco +36357|1978|67|7|41|77078.77|0.00|0.08|R|F|1992-05-11|1992-02-20|1992-05-22|TAKE BACK RETURN|TRUCK| are: ironic requests cajol +36358|1274|12|1|42|49361.34|0.10|0.03|R|F|1994-06-14|1994-07-01|1994-07-06|COLLECT COD|FOB|yly alongside of the fluffily +36358|1741|42|2|38|62424.12|0.07|0.06|R|F|1994-07-26|1994-08-08|1994-08-06|NONE|TRUCK|. blithely fi +36358|1294|69|3|14|16734.06|0.09|0.06|A|F|1994-05-31|1994-07-13|1994-06-30|DELIVER IN PERSON|MAIL| above the f +36358|1602|26|4|25|37590.00|0.05|0.00|R|F|1994-08-22|1994-06-18|1994-09-15|COLLECT COD|SHIP|ly ironic requests nag regular, spe +36358|1338|39|5|28|34701.24|0.09|0.08|R|F|1994-06-17|1994-07-25|1994-07-03|DELIVER IN PERSON|SHIP|ly despite t +36358|119|20|6|14|14267.54|0.01|0.08|A|F|1994-05-25|1994-06-21|1994-06-08|COLLECT COD|FOB|ts. silent, bold +36358|1273|48|7|2|2348.54|0.10|0.02|R|F|1994-05-19|1994-06-16|1994-05-22|NONE|TRUCK|press pinto beans. slyly special pinto +36359|1600|21|1|40|60064.00|0.01|0.07|N|O|1996-02-16|1995-12-25|1996-03-12|NONE|RAIL|sits. evenly special acco +36359|1696|20|2|42|67102.98|0.04|0.04|N|O|1995-12-05|1996-02-20|1995-12-19|NONE|AIR|ly unusual dolphins believe. br +36384|673|5|1|34|53504.78|0.09|0.03|N|O|1997-03-19|1997-02-12|1997-04-12|TAKE BACK RETURN|REG AIR|y pending packages. quickly f +36384|975|78|2|4|7503.88|0.00|0.03|N|O|1997-04-03|1997-02-22|1997-04-27|NONE|FOB| cajole quickly about the bold, expr +36384|1041|42|3|31|29203.24|0.08|0.07|N|O|1997-03-29|1997-03-29|1997-04-26|DELIVER IN PERSON|AIR|egular foxes. furiously express pinto +36384|302|87|4|19|22843.70|0.04|0.07|N|O|1997-03-14|1997-03-18|1997-04-03|DELIVER IN PERSON|MAIL|longside of the quickly re +36384|903|38|5|32|57724.80|0.06|0.06|N|O|1997-04-11|1997-02-16|1997-05-04|DELIVER IN PERSON|RAIL|usly final requests ha +36385|999|34|1|6|11399.94|0.08|0.05|N|O|1997-01-08|1996-12-20|1997-01-11|COLLECT COD|FOB|s wake quickly along the dependencies. +36385|378|35|2|18|23010.66|0.07|0.07|N|O|1996-12-01|1996-11-16|1996-12-22|COLLECT COD|TRUCK|lithely special theodolites? +36386|1523|64|1|5|7122.60|0.06|0.02|A|F|1994-04-09|1994-05-17|1994-04-21|COLLECT COD|MAIL| final dugouts sleep. +36387|740|5|1|35|57425.90|0.02|0.02|N|O|1996-02-17|1996-02-02|1996-03-06|COLLECT COD|SHIP| special dependencies? perman +36387|1798|41|2|49|83289.71|0.02|0.06|N|O|1996-01-22|1995-12-26|1996-02-08|COLLECT COD|TRUCK|bold ideas sleep fluffily regul +36387|534|95|3|37|53077.61|0.10|0.01|N|O|1995-11-15|1996-02-01|1995-11-21|TAKE BACK RETURN|MAIL|ideas. quickly pending requests wa +36387|773|74|4|1|1673.77|0.03|0.07|N|O|1995-11-22|1995-12-29|1995-12-14|TAKE BACK RETURN|REG AIR|y bravely p +36387|1852|39|5|4|7015.40|0.07|0.00|N|O|1995-12-14|1996-01-26|1995-12-20|DELIVER IN PERSON|FOB| the pending, regular requests. +36387|584|45|6|50|74229.00|0.01|0.05|N|O|1996-01-03|1996-01-07|1996-01-25|DELIVER IN PERSON|SHIP|iet deposits hag +36388|281|82|1|21|24806.88|0.05|0.04|N|O|1996-08-25|1996-08-23|1996-09-22|COLLECT COD|REG AIR|unusual deposits haggle furi +36388|454|13|2|33|44696.85|0.10|0.00|N|O|1996-08-21|1996-08-26|1996-09-19|COLLECT COD|MAIL|pinto beans are slyly +36388|1498|99|3|19|26590.31|0.06|0.07|N|O|1996-09-01|1996-08-11|1996-09-03|TAKE BACK RETURN|TRUCK|tithes sleep furiously a +36388|170|23|4|18|19263.06|0.03|0.06|N|O|1996-09-17|1996-07-08|1996-09-29|TAKE BACK RETURN|MAIL|d, unusual frets haggle idly after t +36389|28|79|1|1|928.02|0.10|0.07|N|O|1997-04-01|1997-05-11|1997-04-15|NONE|RAIL|xpress req +36389|555|56|2|15|21833.25|0.06|0.08|N|O|1997-05-17|1997-04-28|1997-06-08|TAKE BACK RETURN|SHIP|blithely final accounts s +36389|387|44|3|33|42483.54|0.02|0.06|N|O|1997-03-13|1997-04-04|1997-03-16|TAKE BACK RETURN|RAIL|telets detect +36390|667|99|1|32|50165.12|0.01|0.01|A|F|1992-11-27|1992-12-28|1992-12-21|TAKE BACK RETURN|AIR|ctions. quickly u +36390|872|72|2|34|60277.58|0.03|0.04|A|F|1992-11-30|1992-11-18|1992-12-28|DELIVER IN PERSON|SHIP|ar accounts are +36390|1833|63|3|50|86741.50|0.07|0.01|R|F|1993-01-08|1992-11-20|1993-01-22|TAKE BACK RETURN|REG AIR|counts wake. express, ironic requests sl +36390|1570|11|4|19|27959.83|0.04|0.02|A|F|1992-12-01|1992-12-24|1992-12-08|DELIVER IN PERSON|MAIL|ts. furiously expr +36390|1744|45|5|19|31269.06|0.09|0.02|R|F|1992-12-25|1993-01-08|1992-12-27|TAKE BACK RETURN|TRUCK|y even excu +36391|1041|77|1|28|26377.12|0.03|0.02|N|O|1997-10-31|1997-10-12|1997-11-13|TAKE BACK RETURN|SHIP|ar pinto beans +36416|906|9|1|39|70469.10|0.00|0.08|R|F|1995-01-01|1995-01-04|1995-01-18|COLLECT COD|AIR|le carefully pending excuses. carefully iro +36416|901|2|2|10|18019.00|0.09|0.02|A|F|1995-03-11|1995-02-01|1995-03-24|COLLECT COD|TRUCK|ly carefully bold excuses. quickly final p +36416|895|62|3|38|68243.82|0.03|0.05|R|F|1995-01-26|1995-02-23|1995-02-08|NONE|MAIL|theodolites! ironic, s +36416|784|49|4|30|50543.40|0.04|0.06|A|F|1995-02-07|1995-02-03|1995-02-24|NONE|FOB|ely bold deposits wake blith +36416|897|98|5|10|17978.90|0.06|0.01|A|F|1995-03-27|1995-02-13|1995-04-10|DELIVER IN PERSON|FOB|ructions use final, regular packages? caref +36417|936|71|1|35|64292.55|0.03|0.04|N|O|1996-05-06|1996-06-19|1996-05-26|DELIVER IN PERSON|SHIP|regular asymptotes after th +36417|1188|89|2|27|29407.86|0.03|0.06|N|O|1996-08-27|1996-07-15|1996-09-18|TAKE BACK RETURN|MAIL|nding dependencies wake caref +36418|223|51|1|9|10108.98|0.07|0.01|A|F|1992-04-29|1992-03-17|1992-05-03|DELIVER IN PERSON|RAIL|ent epitaphs haggle furiously unusual fo +36418|1511|12|2|45|63562.95|0.09|0.03|A|F|1992-03-09|1992-04-20|1992-04-05|DELIVER IN PERSON|SHIP|y final foxes should detect furiously +36418|1906|39|3|14|25310.60|0.02|0.08|R|F|1992-03-20|1992-03-27|1992-03-26|TAKE BACK RETURN|AIR|en accounts +36418|1443|22|4|3|4033.32|0.07|0.08|R|F|1992-02-19|1992-04-08|1992-03-17|DELIVER IN PERSON|FOB|odolites! pending requests around the exp +36419|1640|82|1|14|21582.96|0.05|0.02|N|O|1998-07-08|1998-06-13|1998-07-27|TAKE BACK RETURN|MAIL|e final dependencies. qui +36420|948|17|1|44|81353.36|0.00|0.08|N|O|1997-07-28|1997-09-01|1997-08-07|DELIVER IN PERSON|MAIL|blithely pendin +36420|1619|43|2|41|62345.01|0.01|0.02|N|O|1997-07-26|1997-09-20|1997-08-03|COLLECT COD|FOB|ual warthogs. quickly expres +36420|1588|9|3|26|38729.08|0.10|0.03|N|O|1997-11-14|1997-08-31|1997-12-01|NONE|REG AIR|r deposits sleep acc +36421|884|84|1|26|46406.88|0.00|0.01|N|O|1996-05-07|1996-06-18|1996-06-02|DELIVER IN PERSON|FOB|s-- carefully silent pinto bea +36421|224|79|2|14|15739.08|0.02|0.07|N|O|1996-06-26|1996-07-05|1996-07-10|TAKE BACK RETURN|REG AIR| ideas haggle against the final pack +36421|467|68|3|4|5469.84|0.07|0.06|N|O|1996-06-22|1996-06-15|1996-07-01|DELIVER IN PERSON|TRUCK|haggle. blithely specia +36421|293|75|4|10|11932.90|0.03|0.05|N|O|1996-06-19|1996-07-05|1996-07-01|DELIVER IN PERSON|AIR|pinto bean +36421|712|9|5|35|56444.85|0.02|0.04|N|O|1996-06-12|1996-06-27|1996-07-04|NONE|AIR|y special deposits after the r +36421|1929|18|6|44|80560.48|0.03|0.08|N|O|1996-08-02|1996-05-19|1996-08-13|COLLECT COD|RAIL| final excuses. express, final platelets +36421|1501|22|7|42|58905.00|0.07|0.05|N|O|1996-07-27|1996-06-09|1996-08-01|DELIVER IN PERSON|RAIL|symptotes +36422|1542|83|1|27|38975.58|0.01|0.07|N|O|1997-05-02|1997-05-01|1997-05-25|TAKE BACK RETURN|TRUCK|into beans. blithely regular reque +36422|1466|67|2|37|50596.02|0.04|0.01|N|O|1997-06-03|1997-04-07|1997-06-17|COLLECT COD|SHIP|g deposits are about the as +36422|1458|76|3|42|57096.90|0.07|0.07|N|O|1997-05-18|1997-05-09|1997-05-28|NONE|MAIL|ly. regular packages sleep. +36422|907|8|4|14|25310.60|0.00|0.02|N|O|1997-06-27|1997-05-12|1997-07-23|DELIVER IN PERSON|SHIP|eposits. even, regular packages snoo +36422|1840|27|5|31|53997.04|0.09|0.04|N|O|1997-03-29|1997-05-25|1997-04-19|DELIVER IN PERSON|REG AIR| the quickly stea +36422|171|24|6|9|9640.53|0.06|0.05|N|O|1997-06-10|1997-05-14|1997-06-30|TAKE BACK RETURN|REG AIR|ajole. fluff +36422|482|70|7|27|37326.96|0.06|0.04|N|O|1997-06-18|1997-05-14|1997-07-15|NONE|AIR|kages. blithely final excuses +36423|1328|29|1|31|38108.92|0.03|0.07|N|O|1995-08-18|1995-06-07|1995-09-07|COLLECT COD|REG AIR|gside of the blithely special deposi +36448|1996|29|1|42|79715.58|0.08|0.08|A|F|1993-09-28|1993-10-19|1993-10-12|NONE|AIR|ructions cajole furiously a +36448|255|10|2|12|13863.00|0.00|0.03|R|F|1993-11-20|1993-10-26|1993-11-28|DELIVER IN PERSON|AIR|ckly. regular platelets cajole +36448|1987|76|3|47|88782.06|0.04|0.06|R|F|1993-11-10|1993-10-25|1993-12-09|TAKE BACK RETURN|SHIP|l platelets. ac +36448|534|65|4|5|7172.65|0.06|0.04|A|F|1993-10-26|1993-11-16|1993-11-19|DELIVER IN PERSON|REG AIR|deposits are +36448|170|97|5|2|2140.34|0.01|0.08|R|F|1993-10-27|1993-11-14|1993-11-13|COLLECT COD|TRUCK|usly regular accounts. f +36448|922|57|6|17|30989.64|0.02|0.05|A|F|1993-12-03|1993-12-04|1993-12-17|DELIVER IN PERSON|REG AIR|uriously regular packages. furio +36448|1099|70|7|24|24002.16|0.04|0.00|A|F|1993-10-18|1993-11-05|1993-11-08|COLLECT COD|REG AIR| packages are quickly. bold dependenc +36449|1236|37|1|45|51175.35|0.08|0.02|R|F|1993-11-05|1993-11-09|1993-11-20|TAKE BACK RETURN|AIR|e quickly regul +36449|92|43|2|1|992.09|0.10|0.04|A|F|1993-12-02|1993-10-06|1993-12-16|TAKE BACK RETURN|TRUCK|as. accounts boost blithely within the c +36449|439|69|3|50|66971.50|0.06|0.05|A|F|1993-10-13|1993-10-24|1993-10-27|DELIVER IN PERSON|SHIP|ongside of the carefully iron +36449|1723|50|4|13|21121.36|0.01|0.01|A|F|1993-12-28|1993-10-19|1993-12-30|NONE|AIR|packages. eve +36449|1684|8|5|45|71355.60|0.07|0.02|A|F|1993-09-22|1993-10-25|1993-09-29|DELIVER IN PERSON|REG AIR|. even excuses sleep above the +36449|1400|77|6|1|1301.40|0.01|0.06|A|F|1993-11-06|1993-11-16|1993-11-23|TAKE BACK RETURN|AIR|wake never furiously even deposits +36450|1242|43|1|5|5716.20|0.07|0.02|N|O|1998-01-21|1998-02-06|1998-02-15|TAKE BACK RETURN|FOB|ual requests. pending, regula +36450|1939|40|2|20|36818.60|0.00|0.08|N|O|1998-03-03|1998-02-06|1998-03-11|COLLECT COD|REG AIR|r packages. regular, +36450|593|54|3|46|68705.14|0.10|0.04|N|O|1997-12-09|1998-01-06|1998-01-01|TAKE BACK RETURN|FOB|nal requests. accounts use carefully a +36450|941|44|4|4|7367.76|0.00|0.06|N|O|1997-12-27|1998-02-18|1998-01-14|DELIVER IN PERSON|AIR| foxes affix blithe +36450|717|82|5|6|9706.26|0.09|0.06|N|O|1998-02-07|1998-01-19|1998-03-01|NONE|TRUCK| the dolphin +36450|53|29|6|40|38122.00|0.08|0.07|N|O|1998-01-21|1998-02-13|1998-02-01|DELIVER IN PERSON|SHIP|ffily even platele +36451|1453|71|1|19|25734.55|0.03|0.06|A|F|1992-10-20|1992-10-29|1992-11-18|TAKE BACK RETURN|REG AIR| slyly regular deposits above the blithely +36451|1849|36|2|8|14006.72|0.05|0.08|A|F|1992-10-07|1992-10-07|1992-10-20|COLLECT COD|REG AIR|carefully. for +36451|1593|14|3|49|73234.91|0.01|0.00|A|F|1992-12-01|1992-11-30|1992-12-23|NONE|MAIL| even reques +36452|1106|15|1|48|48340.80|0.01|0.03|A|F|1994-05-04|1994-06-07|1994-05-16|TAKE BACK RETURN|TRUCK| the fluffily slow accou +36452|1325|64|2|50|61316.00|0.00|0.03|R|F|1994-07-05|1994-05-13|1994-07-27|NONE|REG AIR|uses wake blithely. furi +36452|1251|26|3|29|33415.25|0.10|0.06|A|F|1994-05-06|1994-06-12|1994-05-09|NONE|AIR|cial accounts wake across the asymptotes +36452|1068|69|4|17|16474.02|0.02|0.03|A|F|1994-05-26|1994-05-25|1994-06-01|DELIVER IN PERSON|TRUCK| blithely slow deposits. +36453|975|10|1|46|86294.62|0.01|0.01|N|O|1996-07-17|1996-06-20|1996-07-18|NONE|SHIP| the quickly even t +36453|1083|54|2|17|16729.36|0.10|0.05|N|O|1996-07-04|1996-08-14|1996-07-05|DELIVER IN PERSON|AIR|ding accounts are +36453|729|26|3|14|22816.08|0.03|0.06|N|O|1996-08-13|1996-08-09|1996-08-25|COLLECT COD|FOB|arefully spe +36454|476|64|1|22|30282.34|0.09|0.04|A|F|1995-03-05|1995-04-07|1995-03-09|DELIVER IN PERSON|REG AIR| slyly bold theodolites are blithely a +36454|866|100|2|12|21202.32|0.09|0.00|A|F|1995-03-16|1995-04-26|1995-04-01|COLLECT COD|RAIL|totes wake carefully +36454|655|18|3|8|12445.20|0.03|0.04|R|F|1995-02-21|1995-03-31|1995-03-17|DELIVER IN PERSON|MAIL|e sauternes. regular, +36454|1108|45|4|21|21191.10|0.00|0.07|N|F|1995-06-10|1995-03-30|1995-07-04|DELIVER IN PERSON|RAIL| final deposits will have to a +36454|656|57|5|38|59152.70|0.06|0.07|A|F|1995-03-15|1995-05-02|1995-03-24|COLLECT COD|TRUCK|iously even asymptotes after the careful +36454|1651|93|6|20|31053.00|0.10|0.07|R|F|1995-02-25|1995-04-04|1995-02-26|NONE|SHIP|ermanently regular fox +36455|523|54|1|44|62634.88|0.07|0.07|R|F|1994-04-02|1994-04-07|1994-04-14|COLLECT COD|FOB|he blithely regular accounts. specia +36455|1815|16|2|32|54937.92|0.06|0.02|R|F|1994-04-16|1994-04-05|1994-05-03|NONE|MAIL|theodolites are carefully final foxe +36455|1048|49|3|49|46502.96|0.04|0.04|A|F|1994-03-25|1994-04-30|1994-04-04|NONE|REG AIR|usly regular dependencies. enticingly speci +36480|1595|16|1|21|31428.39|0.07|0.05|A|F|1993-08-29|1993-11-06|1993-09-27|DELIVER IN PERSON|TRUCK|inal deposits haggle +36480|928|29|2|26|47551.92|0.10|0.00|A|F|1993-11-26|1993-11-14|1993-12-19|DELIVER IN PERSON|AIR|pending pinto beans. unusual accounts +36480|583|84|3|33|48958.14|0.07|0.08|A|F|1993-12-11|1993-11-07|1994-01-04|DELIVER IN PERSON|FOB|lly regular accounts slee +36480|1918|51|4|19|34578.29|0.01|0.02|R|F|1993-10-31|1993-11-19|1993-11-03|TAKE BACK RETURN|MAIL|osits are slyly. fluffily quic +36480|1782|9|5|23|38726.94|0.04|0.04|R|F|1993-09-24|1993-11-06|1993-10-15|COLLECT COD|REG AIR| regular accounts. blithely silent req +36480|159|86|6|38|40247.70|0.03|0.01|A|F|1993-09-23|1993-10-19|1993-10-03|COLLECT COD|RAIL|r the slyly express accounts nag at t +36481|1594|15|1|35|52345.65|0.04|0.08|N|O|1998-09-25|1998-09-20|1998-10-16|COLLECT COD|RAIL|even instructions. regular depths are a +36481|1534|75|2|44|63163.32|0.06|0.02|N|O|1998-11-03|1998-09-27|1998-11-27|NONE|RAIL|riously regular packages. ironic depe +36482|572|33|1|27|39759.39|0.05|0.04|N|O|1995-09-24|1995-08-24|1995-10-20|NONE|MAIL| requests? blithely ironic +36482|297|25|2|19|22748.51|0.05|0.05|N|O|1995-09-27|1995-08-18|1995-10-11|COLLECT COD|TRUCK|into beans. slyly +36482|526|57|3|13|18544.76|0.08|0.05|N|O|1995-08-02|1995-09-17|1995-08-18|NONE|MAIL| even accounts. packages across th +36482|283|84|4|14|16565.92|0.07|0.00|N|O|1995-10-08|1995-08-06|1995-10-22|NONE|TRUCK|ular, regu +36482|1736|21|5|10|16377.30|0.01|0.04|N|O|1995-08-05|1995-09-19|1995-08-28|TAKE BACK RETURN|FOB|t carefully care +36482|1840|84|6|6|10451.04|0.10|0.06|N|O|1995-08-10|1995-09-17|1995-08-22|TAKE BACK RETURN|SHIP|ges was furiously carefully unusual theodo +36483|1002|73|1|25|22575.00|0.04|0.00|N|O|1996-12-07|1996-12-04|1996-12-08|NONE|REG AIR|ove the ca +36483|352|53|2|25|31308.75|0.08|0.07|N|O|1997-03-04|1997-01-11|1997-03-07|COLLECT COD|TRUCK| accounts. carefully regul +36483|684|16|3|50|79234.00|0.01|0.01|N|O|1996-12-06|1997-01-06|1996-12-28|COLLECT COD|RAIL|cording to the quickly ironic dependen +36483|1209|47|4|41|45518.20|0.09|0.05|N|O|1996-11-21|1997-01-25|1996-12-08|COLLECT COD|REG AIR|he ironic theodolites sleep furiously unusu +36483|628|60|5|43|65730.66|0.06|0.04|N|O|1996-12-08|1997-01-09|1996-12-30|COLLECT COD|MAIL|s. quickly unusual theodol +36483|446|76|6|42|56550.48|0.07|0.04|N|O|1997-01-02|1996-12-08|1997-01-31|NONE|REG AIR|hely even pla +36483|269|51|7|31|36247.06|0.07|0.06|N|O|1996-11-14|1997-01-21|1996-12-12|COLLECT COD|SHIP|ly final pinto beans. ironic accounts w +36484|1411|29|1|29|38059.89|0.01|0.06|A|F|1992-03-14|1992-04-11|1992-03-17|COLLECT COD|MAIL|s wake carefully final +36484|637|100|2|32|49204.16|0.03|0.07|A|F|1992-02-27|1992-04-16|1992-03-19|TAKE BACK RETURN|TRUCK|olites integrate slyly among the ideas +36484|1232|44|3|7|7932.61|0.02|0.08|R|F|1992-03-18|1992-03-25|1992-03-21|NONE|REG AIR|regular deposits thrash +36484|1026|62|4|29|26883.58|0.06|0.07|R|F|1992-05-26|1992-03-07|1992-06-12|DELIVER IN PERSON|MAIL| blithely ironic accounts wake blit +36484|1535|36|5|42|60334.26|0.10|0.02|R|F|1992-04-17|1992-04-07|1992-04-30|TAKE BACK RETURN|REG AIR|s boost abo +36484|215|70|6|19|21188.99|0.00|0.08|A|F|1992-02-11|1992-04-28|1992-03-02|COLLECT COD|FOB|ng dolphins. slyly pen +36485|1212|24|1|41|45641.61|0.10|0.00|R|F|1992-08-27|1992-07-06|1992-08-29|COLLECT COD|TRUCK|ckages. slyly fina +36485|1824|11|2|42|72484.44|0.02|0.07|R|F|1992-08-13|1992-08-16|1992-08-30|TAKE BACK RETURN|FOB|efully among the bold packages. +36485|1578|99|3|47|69539.79|0.09|0.07|A|F|1992-07-08|1992-07-15|1992-07-25|NONE|AIR|y special packages again +36485|1603|4|4|37|55670.20|0.03|0.03|A|F|1992-09-12|1992-08-05|1992-09-27|COLLECT COD|MAIL|rve carefully +36485|1967|68|5|32|59806.72|0.06|0.03|A|F|1992-06-25|1992-08-27|1992-06-27|NONE|REG AIR|r gifts ha +36485|1237|49|6|50|56911.50|0.05|0.08|R|F|1992-07-06|1992-08-31|1992-07-08|NONE|FOB|olites do caj +36486|1140|77|1|8|8329.12|0.02|0.03|N|O|1997-04-06|1997-01-30|1997-04-19|COLLECT COD|RAIL|ze during the carefull +36486|682|14|2|2|3165.36|0.09|0.07|N|O|1997-03-04|1997-01-31|1997-03-28|NONE|AIR|e the accounts are slyly unusua +36486|1588|29|3|39|58093.62|0.06|0.03|N|O|1997-02-17|1997-01-18|1997-03-05|NONE|REG AIR| regular packages wake blithely fina +36486|844|44|4|39|68048.76|0.03|0.01|N|O|1997-01-03|1997-01-17|1997-01-06|DELIVER IN PERSON|MAIL|nts boost finally quickly unusual +36486|280|8|5|47|55473.16|0.01|0.03|N|O|1997-01-23|1997-02-22|1997-02-20|DELIVER IN PERSON|FOB|e. slyly bold account +36486|1497|76|6|18|25172.82|0.03|0.05|N|O|1997-01-12|1997-01-19|1997-01-17|COLLECT COD|FOB|posits haggle final deposits. furiou +36486|1174|75|7|4|4300.68|0.02|0.02|N|O|1996-12-13|1997-01-15|1996-12-27|DELIVER IN PERSON|SHIP|ording to the unusual packages. quickly ir +36487|1073|74|1|21|20455.47|0.01|0.03|N|O|1997-09-03|1997-06-18|1997-09-12|TAKE BACK RETURN|FOB|efully even attainments +36487|1084|85|2|13|12806.04|0.09|0.05|N|O|1997-08-16|1997-06-22|1997-08-24|TAKE BACK RETURN|MAIL| mold furiously. fluffily unusu +36487|887|54|3|31|55424.28|0.01|0.01|N|O|1997-05-27|1997-07-09|1997-06-20|DELIVER IN PERSON|RAIL|t foxes. furiously expres +36487|174|53|4|9|9667.53|0.01|0.06|N|O|1997-09-01|1997-07-01|1997-09-19|DELIVER IN PERSON|RAIL| attainments. expre +36487|343|100|5|26|32326.84|0.04|0.06|N|O|1997-06-06|1997-07-03|1997-06-20|COLLECT COD|SHIP|platelets against the +36487|301|58|6|30|36039.00|0.08|0.06|N|O|1997-05-28|1997-07-17|1997-06-06|COLLECT COD|RAIL|ly final depos +36512|1247|85|1|33|37891.92|0.09|0.00|R|F|1992-05-04|1992-05-26|1992-05-29|DELIVER IN PERSON|AIR| beans use. slyly ironic foxes use finally +36512|721|22|2|11|17838.92|0.10|0.04|A|F|1992-05-28|1992-05-09|1992-06-07|NONE|RAIL| blithely. +36512|35|36|3|23|21505.69|0.01|0.06|R|F|1992-05-09|1992-06-25|1992-05-17|NONE|AIR|above the ironic, f +36512|325|82|4|49|60040.68|0.05|0.00|R|F|1992-06-24|1992-05-30|1992-07-10|NONE|REG AIR|regular pinto beans. regular +36512|814|48|5|50|85740.50|0.01|0.00|R|F|1992-04-17|1992-06-22|1992-05-04|TAKE BACK RETURN|MAIL|wake furiously expr +36512|1193|94|6|46|50332.74|0.01|0.01|R|F|1992-05-30|1992-06-01|1992-06-06|COLLECT COD|MAIL|sts. furiously final asymptotes wake fl +36512|1790|91|7|26|43986.54|0.01|0.05|A|F|1992-07-23|1992-06-25|1992-08-03|COLLECT COD|FOB|tegrate furiously. carefully final ideas h +36513|982|83|1|5|9414.90|0.10|0.06|N|O|1996-02-01|1996-03-16|1996-02-23|COLLECT COD|TRUCK|carefully final theodolites. slow +36513|83|84|2|49|48170.92|0.05|0.06|N|O|1996-04-08|1996-02-11|1996-04-10|NONE|TRUCK|hes. slyly express packages wake blit +36513|269|51|3|31|36247.06|0.05|0.07|N|O|1996-02-24|1996-03-24|1996-03-04|TAKE BACK RETURN|FOB|ress pinto beans haggle according to t +36513|1088|24|4|36|35606.88|0.06|0.03|N|O|1996-01-25|1996-02-29|1996-02-07|DELIVER IN PERSON|MAIL|pinto beans according to the qu +36513|1823|67|5|39|67267.98|0.07|0.05|N|O|1996-01-19|1996-03-03|1996-01-24|TAKE BACK RETURN|REG AIR|ns are accordin +36513|1240|52|6|44|50214.56|0.01|0.02|N|O|1996-03-04|1996-03-19|1996-03-26|TAKE BACK RETURN|FOB|nal foxes kindle carefully! carefully re +36514|1253|54|1|19|21930.75|0.02|0.02|A|F|1994-09-14|1994-06-29|1994-10-11|COLLECT COD|AIR|mpress slyly carefully silent +36514|1764|65|2|36|59967.36|0.00|0.03|A|F|1994-09-07|1994-06-22|1994-09-27|TAKE BACK RETURN|MAIL|totes sleep furiously after the +36514|1415|55|3|23|30277.43|0.07|0.07|R|F|1994-08-31|1994-08-09|1994-09-23|TAKE BACK RETURN|FOB|al pinto beans are blithely furiou +36515|1953|86|1|9|16694.55|0.05|0.02|N|O|1997-07-12|1997-08-16|1997-07-25|COLLECT COD|MAIL|ackages. blithely final acco +36515|1825|12|2|31|53531.42|0.02|0.00|N|O|1997-09-09|1997-07-04|1997-10-08|NONE|TRUCK|thely final re +36515|626|89|3|46|70224.52|0.09|0.03|N|O|1997-07-24|1997-08-10|1997-08-14|COLLECT COD|SHIP|ronic packages. quickly +36515|1404|44|4|7|9137.80|0.02|0.03|N|O|1997-09-14|1997-07-06|1997-09-21|COLLECT COD|AIR|l foxes. furiously ironic requests hagg +36515|1160|97|5|34|36079.44|0.07|0.05|N|O|1997-08-28|1997-07-23|1997-09-15|DELIVER IN PERSON|FOB| slyly. blithely ironic dolphins use +36515|737|70|6|40|65509.20|0.01|0.05|N|O|1997-09-18|1997-07-17|1997-09-19|COLLECT COD|RAIL| accounts! ir +36515|314|43|7|46|55858.26|0.02|0.03|N|O|1997-09-13|1997-07-30|1997-09-15|DELIVER IN PERSON|REG AIR| sleep carefully after the s +36516|1895|25|1|10|17968.90|0.08|0.00|N|O|1995-10-10|1995-08-26|1995-10-31|COLLECT COD|SHIP|ggle along the slyly ironic reque +36516|1467|68|2|40|54738.40|0.08|0.06|N|O|1995-08-18|1995-09-21|1995-08-31|TAKE BACK RETURN|AIR|efully regular +36516|844|11|3|41|71538.44|0.04|0.08|N|O|1995-08-07|1995-09-02|1995-08-14|COLLECT COD|SHIP|efully regular sauternes s +36517|498|57|1|27|37759.23|0.02|0.06|R|F|1993-05-13|1993-04-08|1993-05-17|COLLECT COD|AIR|ly special theodoli +36517|1706|33|2|31|49838.70|0.08|0.05|R|F|1993-04-04|1993-04-10|1993-04-06|DELIVER IN PERSON|FOB|ar, ironic ideas haggle slyly. fu +36517|125|26|3|42|43055.04|0.00|0.00|R|F|1993-05-15|1993-05-11|1993-05-25|DELIVER IN PERSON|SHIP|en deposits cajole. ironic excuses are busi +36517|336|93|4|24|29671.92|0.09|0.06|A|F|1993-06-30|1993-04-18|1993-07-12|DELIVER IN PERSON|FOB|ronic, ironic packages cajole +36517|596|87|5|43|64353.37|0.02|0.00|A|F|1993-06-02|1993-04-02|1993-06-12|COLLECT COD|REG AIR|deas solve alongs +36517|717|50|6|12|19412.52|0.08|0.05|R|F|1993-04-03|1993-04-09|1993-05-03|COLLECT COD|RAIL|uriously final deposits across t +36518|625|19|1|22|33563.64|0.04|0.03|N|O|1997-09-17|1997-09-23|1997-09-23|NONE|SHIP| requests. furiously ir +36519|848|49|1|32|55962.88|0.10|0.05|A|F|1993-08-26|1993-08-22|1993-09-14|COLLECT COD|AIR|gage above the slyly ironic theodolites +36544|90|41|1|23|22772.07|0.03|0.06|N|O|1997-10-24|1997-09-24|1997-11-10|TAKE BACK RETURN|REG AIR|he slyly ironic deposits. +36544|1482|61|2|30|41504.40|0.06|0.08|N|O|1997-10-26|1997-10-13|1997-11-08|TAKE BACK RETURN|MAIL|ously even +36545|1183|20|1|26|28188.68|0.10|0.01|N|O|1997-12-07|1998-01-03|1997-12-09|COLLECT COD|AIR|quickly express instructions. fluffily fi +36545|1662|63|2|30|46909.80|0.04|0.06|N|O|1997-11-30|1997-12-23|1997-12-10|COLLECT COD|MAIL|om the fur +36545|46|22|3|29|27435.16|0.06|0.06|N|O|1997-11-03|1997-12-13|1997-11-28|DELIVER IN PERSON|MAIL|ccounts. final pa +36545|252|7|4|25|28806.25|0.04|0.03|N|O|1997-12-20|1998-01-09|1998-01-07|COLLECT COD|AIR|fily express account +36545|928|97|5|24|43894.08|0.00|0.04|N|O|1997-11-09|1997-12-12|1997-11-18|COLLECT COD|REG AIR| furiously pending wart +36545|641|35|6|13|20041.32|0.10|0.06|N|O|1998-01-24|1998-01-06|1998-01-29|DELIVER IN PERSON|RAIL| furiously final accounts are. ironic, spec +36546|1620|62|1|15|22824.30|0.07|0.08|N|O|1996-06-02|1996-05-20|1996-06-23|COLLECT COD|TRUCK|ackages haggle. s +36546|1523|64|2|19|27065.88|0.04|0.01|N|O|1996-07-12|1996-05-08|1996-07-29|TAKE BACK RETURN|MAIL| requests cajole quickly af +36546|1939|40|3|35|64432.55|0.00|0.07|N|O|1996-06-25|1996-06-06|1996-07-03|TAKE BACK RETURN|REG AIR| haggle slowly agai +36546|1906|7|4|25|45197.50|0.04|0.06|N|O|1996-05-22|1996-06-22|1996-06-10|NONE|FOB|. furiously bold idea +36546|675|76|5|11|17332.37|0.02|0.02|N|O|1996-04-30|1996-05-27|1996-05-11|DELIVER IN PERSON|AIR|ggle furiously regular foxes. courts +36546|1697|80|6|32|51158.08|0.03|0.04|N|O|1996-07-05|1996-05-23|1996-07-18|TAKE BACK RETURN|AIR|ter the quickl +36546|834|35|7|39|67658.37|0.09|0.04|N|O|1996-06-29|1996-05-01|1996-07-13|TAKE BACK RETURN|SHIP|ackages across the furiously regular depo +36547|1072|78|1|39|37949.73|0.06|0.03|A|F|1994-12-29|1995-02-04|1995-01-06|COLLECT COD|TRUCK|e the express accounts boo +36547|511|42|2|21|29641.71|0.06|0.05|R|F|1995-02-15|1995-02-09|1995-02-17|COLLECT COD|AIR|eans are furiously even +36547|1905|6|3|25|45172.50|0.00|0.06|A|F|1995-02-13|1995-01-13|1995-03-01|DELIVER IN PERSON|REG AIR|uriously regular dolphins. busily even +36547|897|31|4|20|35957.80|0.09|0.04|R|F|1994-12-14|1995-01-18|1994-12-20|TAKE BACK RETURN|RAIL|s haggle carefully blithely even pint +36548|1195|68|1|43|47136.17|0.09|0.02|R|F|1993-11-18|1993-12-22|1993-12-14|TAKE BACK RETURN|REG AIR|pinto beans use theodolites +36548|1300|38|2|24|28831.20|0.07|0.08|R|F|1993-12-12|1993-11-30|1993-12-25|TAKE BACK RETURN|AIR|ending theodolites x-ray f +36549|1406|24|1|44|57525.60|0.10|0.05|N|O|1996-08-31|1996-06-20|1996-09-28|COLLECT COD|SHIP|es are furiously about th +36549|235|17|2|19|21569.37|0.03|0.00|N|O|1996-09-13|1996-07-19|1996-09-18|NONE|FOB|ecial, silent f +36550|170|71|1|39|41736.63|0.06|0.06|A|F|1994-06-11|1994-04-19|1994-06-23|DELIVER IN PERSON|TRUCK|refully express ideas. +36550|1261|99|2|27|31381.02|0.01|0.01|R|F|1994-03-11|1994-05-14|1994-03-18|DELIVER IN PERSON|TRUCK|ickly express foxes haggle flu +36551|1814|58|1|16|27452.96|0.03|0.01|A|F|1992-09-10|1992-07-10|1992-10-05|NONE|AIR|blate carefully after the idle packages. fu +36576|1215|53|1|50|55810.50|0.01|0.03|A|F|1993-04-25|1993-05-23|1993-05-24|TAKE BACK RETURN|FOB|refully above the fi +36576|25|51|2|22|20350.44|0.00|0.00|R|F|1993-04-05|1993-05-04|1993-04-19|COLLECT COD|RAIL|uriously ironic +36576|1696|97|3|40|63907.60|0.06|0.04|R|F|1993-04-21|1993-04-27|1993-04-27|NONE|AIR|n pinto bea +36577|133|86|1|34|35126.42|0.05|0.01|N|O|1998-10-15|1998-09-14|1998-11-07|NONE|REG AIR|ackages according to the regular deposits +36577|1049|20|2|14|13300.56|0.01|0.08|N|O|1998-09-25|1998-07-22|1998-10-05|TAKE BACK RETURN|MAIL|furiously p +36577|1662|63|3|33|51600.78|0.09|0.07|N|O|1998-09-10|1998-09-08|1998-10-03|NONE|FOB|cial asymptotes. slyly fi +36577|800|1|4|27|45921.60|0.04|0.03|N|O|1998-06-29|1998-09-13|1998-07-01|COLLECT COD|AIR|ing to the q +36577|1531|72|5|6|8595.18|0.07|0.03|N|O|1998-08-12|1998-07-26|1998-09-09|DELIVER IN PERSON|TRUCK|its across the slyly regular pinto beans +36577|1400|39|6|37|48151.80|0.07|0.00|N|O|1998-07-30|1998-07-23|1998-08-22|COLLECT COD|TRUCK|y. instruc +36578|1143|44|1|26|27147.64|0.03|0.06|N|O|1998-09-13|1998-09-29|1998-10-12|NONE|RAIL|nts. blithely ironic frets against t +36579|865|32|1|38|67102.68|0.09|0.05|N|O|1998-09-13|1998-07-20|1998-09-23|DELIVER IN PERSON|TRUCK|its! special ideas kindle blithely furiousl +36579|1743|44|2|8|13157.92|0.04|0.04|N|O|1998-06-06|1998-07-09|1998-06-20|COLLECT COD|FOB| the blithely bold ac +36579|1457|36|3|47|63847.15|0.10|0.05|N|O|1998-09-04|1998-08-21|1998-09-24|NONE|AIR|ironic asymptotes. furiously regular ins +36579|1365|4|4|4|5065.44|0.04|0.08|N|O|1998-07-08|1998-08-01|1998-07-28|NONE|AIR|ending pinto beans are slyly +36579|227|82|5|44|49597.68|0.08|0.05|N|O|1998-05-30|1998-07-16|1998-06-04|COLLECT COD|MAIL|kly alongside of t +36580|1495|74|1|12|16757.88|0.04|0.04|N|O|1997-08-22|1997-09-07|1997-09-18|COLLECT COD|SHIP|rbits. furio +36580|1719|46|2|48|77794.08|0.05|0.01|N|O|1997-09-20|1997-09-09|1997-10-02|DELIVER IN PERSON|SHIP|usly even instructions. ca +36580|1866|96|3|37|65410.82|0.06|0.07|N|O|1997-10-23|1997-09-03|1997-11-10|TAKE BACK RETURN|REG AIR|t permanently. qu +36580|576|37|4|38|56109.66|0.05|0.07|N|O|1997-08-06|1997-09-13|1997-08-08|NONE|SHIP|lar, unusual packages. sly +36581|1966|99|1|49|91530.04|0.01|0.00|N|O|1996-11-16|1996-10-12|1996-12-04|DELIVER IN PERSON|FOB|ounts. pending requests in +36581|1565|86|2|17|24931.52|0.03|0.01|N|O|1996-11-21|1996-11-10|1996-12-12|DELIVER IN PERSON|RAIL|ions. final theodolites integrate blith +36581|42|43|3|48|45217.92|0.10|0.03|N|O|1996-11-06|1996-11-22|1996-11-12|DELIVER IN PERSON|AIR|old theodolites doubt. fl +36581|332|61|4|17|20949.61|0.00|0.03|N|O|1996-12-09|1996-10-23|1997-01-07|NONE|AIR|leep furiously. special asymptotes +36582|1456|35|1|46|62442.70|0.07|0.06|R|F|1992-02-26|1992-02-17|1992-03-15|TAKE BACK RETURN|SHIP|e about the furiously final acco +36582|636|99|2|3|4609.89|0.01|0.06|R|F|1992-02-24|1992-03-20|1992-03-25|DELIVER IN PERSON|SHIP|thely ironic dependencies: care +36582|103|4|3|29|29089.90|0.04|0.08|R|F|1992-02-29|1992-03-23|1992-03-23|TAKE BACK RETURN|RAIL|t requests alo +36582|801|68|4|45|76581.00|0.06|0.07|R|F|1992-01-31|1992-02-16|1992-02-26|COLLECT COD|REG AIR|ts haggle slyly sly +36582|273|55|5|23|26985.21|0.09|0.06|R|F|1992-04-04|1992-02-10|1992-04-06|NONE|TRUCK|posits nag carefully +36583|1671|95|1|41|64479.47|0.10|0.06|N|O|1997-08-21|1997-06-10|1997-09-06|COLLECT COD|AIR|s use bold, regular requests. +36583|789|54|2|4|6759.12|0.03|0.08|N|O|1997-05-04|1997-07-07|1997-05-15|NONE|TRUCK|usly final packages. slyly pending acc +36583|736|1|3|46|75289.58|0.09|0.04|N|O|1997-06-17|1997-06-22|1997-06-21|TAKE BACK RETURN|AIR|equests are s +36583|396|25|4|25|32409.75|0.03|0.07|N|O|1997-07-30|1997-06-09|1997-08-13|TAKE BACK RETURN|TRUCK|y against the blithely stealthy grouches. +36583|373|30|5|49|62395.13|0.02|0.08|N|O|1997-06-04|1997-07-17|1997-06-29|DELIVER IN PERSON|REG AIR|uriously blithely unusual instructi +36608|975|10|1|6|11255.82|0.09|0.05|N|O|1995-10-21|1995-11-08|1995-11-15|NONE|TRUCK|ar foxes-- excuses along the +36608|1168|77|2|20|21383.20|0.03|0.02|N|O|1995-12-11|1995-11-23|1995-12-29|DELIVER IN PERSON|TRUCK| regular, quick courts +36608|1201|76|3|12|13226.40|0.10|0.01|N|O|1995-11-20|1995-10-30|1995-12-02|TAKE BACK RETURN|MAIL|ideas sleep. pending, blith +36608|1886|87|4|34|60787.92|0.09|0.03|N|O|1995-10-25|1995-11-26|1995-11-21|COLLECT COD|FOB|tions cajol +36608|1143|80|5|1|1044.14|0.03|0.02|N|O|1996-01-27|1995-11-27|1996-02-20|NONE|FOB|nts cajole regular packages. blithely even +36608|1228|40|6|6|6775.32|0.02|0.05|N|O|1995-11-30|1995-12-18|1995-12-26|NONE|REG AIR| detect slyly after the final pa +36608|1204|42|7|48|53049.60|0.03|0.01|N|O|1995-12-01|1995-12-11|1995-12-30|NONE|REG AIR|ly pending ideas abo +36609|1424|25|1|32|42413.44|0.05|0.02|A|F|1994-06-09|1994-06-18|1994-07-01|NONE|FOB|es cajole. caref +36609|946|47|2|42|77571.48|0.02|0.07|R|F|1994-05-30|1994-06-30|1994-06-20|NONE|FOB|theodolites. quickly +36609|513|74|3|30|42405.30|0.10|0.05|A|F|1994-07-02|1994-07-10|1994-07-06|COLLECT COD|AIR|lyly ironic deposits boost carefully? quick +36609|903|72|4|47|84783.30|0.00|0.08|A|F|1994-06-12|1994-07-06|1994-06-21|COLLECT COD|SHIP|quests affix carefully against the ev +36609|738|71|5|34|55716.82|0.08|0.05|A|F|1994-07-29|1994-07-12|1994-08-20|COLLECT COD|AIR|idly. furiously pending deposi +36610|794|27|1|18|30506.22|0.05|0.02|N|O|1995-12-28|1995-11-16|1996-01-25|TAKE BACK RETURN|TRUCK|y blithe requests. bold, regular pac +36610|1499|17|2|33|46216.17|0.01|0.07|N|O|1995-12-12|1995-12-13|1995-12-13|DELIVER IN PERSON|MAIL| ironic asymptotes hang +36610|968|3|3|42|78496.32|0.05|0.06|N|O|1996-02-01|1995-12-17|1996-03-02|DELIVER IN PERSON|RAIL| pinto beans sleep car +36611|453|83|1|9|12181.05|0.02|0.04|N|O|1997-11-10|1997-12-19|1997-11-23|COLLECT COD|FOB|s? furiously unusual deposits affix. slyl +36611|1030|66|2|26|24206.78|0.06|0.04|N|O|1997-11-29|1997-12-31|1997-12-22|COLLECT COD|MAIL|hely. ironic, even pearls use +36611|1|2|3|13|11713.00|0.05|0.01|N|O|1998-02-18|1997-12-19|1998-03-02|NONE|RAIL|equests. carefully regular i +36611|225|53|4|38|42758.36|0.00|0.04|N|O|1997-12-18|1998-01-25|1998-01-05|COLLECT COD|RAIL|y along the silently regular +36611|1617|18|5|4|6074.44|0.03|0.00|N|O|1998-02-10|1997-12-22|1998-02-12|TAKE BACK RETURN|RAIL|ffily regular package +36612|882|49|1|48|85578.24|0.06|0.06|R|F|1992-05-04|1992-05-11|1992-05-26|DELIVER IN PERSON|TRUCK|s wake carefully silent courts. +36612|1812|13|2|33|56555.73|0.10|0.02|A|F|1992-05-02|1992-05-04|1992-05-19|DELIVER IN PERSON|REG AIR|press pinto beans. +36613|325|54|1|13|15929.16|0.01|0.05|N|O|1996-02-19|1996-04-07|1996-03-10|NONE|TRUCK|ular accounts doze regular requests. +36613|1631|32|2|5|7663.15|0.00|0.02|N|O|1996-04-08|1996-03-14|1996-04-23|COLLECT COD|TRUCK|theodolites. +36614|1542|83|1|8|11548.32|0.10|0.02|A|F|1992-07-07|1992-07-21|1992-08-05|COLLECT COD|RAIL|around the foxes. blithely re +36614|559|90|2|7|10216.85|0.07|0.01|R|F|1992-06-02|1992-08-11|1992-06-10|DELIVER IN PERSON|FOB|aters haggle. carefully fin +36614|720|85|3|6|9724.32|0.03|0.01|A|F|1992-06-26|1992-07-28|1992-07-02|COLLECT COD|SHIP|s after the slyly special pa +36615|1761|46|1|24|39906.24|0.03|0.05|R|F|1993-12-04|1994-01-14|1993-12-30|COLLECT COD|REG AIR|somas haggle blithely. enticingly regular d +36640|1719|46|1|45|72931.95|0.02|0.01|N|O|1996-01-28|1995-12-19|1996-02-03|NONE|FOB|lly final deposi +36640|476|77|2|48|66070.56|0.03|0.05|N|O|1995-12-27|1996-01-29|1996-01-26|COLLECT COD|RAIL|thrash about the +36640|1494|73|3|37|51633.13|0.01|0.03|N|O|1995-11-24|1996-01-13|1995-12-10|COLLECT COD|AIR|ess instructions wake slyly alon +36640|1951|52|4|15|27794.25|0.01|0.03|N|O|1995-12-16|1995-12-21|1995-12-19|COLLECT COD|TRUCK|are blithely care +36641|1498|99|1|15|20992.35|0.02|0.08|N|O|1998-01-06|1998-01-03|1998-01-17|COLLECT COD|AIR| express packages. even, ironic realms +36641|1317|94|2|32|38985.92|0.03|0.07|N|O|1997-12-02|1998-01-27|1997-12-24|DELIVER IN PERSON|REG AIR| slyly express pinto beans. de +36641|1983|84|3|1|1884.98|0.05|0.08|N|O|1998-02-15|1998-02-08|1998-03-12|DELIVER IN PERSON|REG AIR|lent, ironic account +36641|591|22|4|50|74579.50|0.04|0.04|N|O|1998-02-28|1997-12-25|1998-03-15|NONE|TRUCK|ronic dugouts according to t +36641|70|96|5|3|2910.21|0.00|0.07|N|O|1997-12-10|1998-02-11|1997-12-26|COLLECT COD|SHIP|ironically. slyly regul +36642|1782|25|1|37|62299.86|0.07|0.08|N|O|1997-01-01|1996-10-25|1997-01-15|COLLECT COD|FOB|uickly final dependencies against the b +36643|1987|88|1|28|52891.44|0.03|0.01|R|F|1994-05-30|1994-04-23|1994-06-20|DELIVER IN PERSON|AIR|en, express packages boost fur +36643|856|56|2|10|17568.50|0.00|0.03|A|F|1994-06-24|1994-04-23|1994-07-19|DELIVER IN PERSON|RAIL|yly fluffily pending ac +36643|845|46|3|22|38408.48|0.00|0.00|R|F|1994-02-27|1994-05-03|1994-03-16|DELIVER IN PERSON|REG AIR|fully even deposits wake blithely fluf +36643|1991|92|4|50|94649.50|0.10|0.06|A|F|1994-04-19|1994-04-18|1994-05-17|COLLECT COD|FOB|eodolites use over t +36644|1572|53|1|17|25050.69|0.02|0.08|A|F|1992-09-05|1992-06-19|1992-09-13|TAKE BACK RETURN|MAIL|egular hockey play +36644|145|46|2|50|52257.00|0.00|0.06|R|F|1992-09-11|1992-07-23|1992-10-10|COLLECT COD|REG AIR|g slyly blithely even reques +36644|1862|92|3|42|74082.12|0.07|0.04|A|F|1992-07-07|1992-06-29|1992-07-23|DELIVER IN PERSON|MAIL|foxes. ironically bold accounts are blithel +36644|1057|28|4|34|32573.70|0.01|0.08|A|F|1992-09-02|1992-06-19|1992-09-06|NONE|AIR|nding deposits slee +36644|680|43|5|18|28452.24|0.09|0.06|A|F|1992-08-07|1992-08-09|1992-08-25|COLLECT COD|SHIP|ole theodolites. fluffily dogged requests +36644|915|16|6|22|39950.02|0.08|0.08|A|F|1992-07-09|1992-08-05|1992-07-23|NONE|RAIL|ctions serve f +36645|682|83|1|24|37984.32|0.01|0.05|N|O|1996-08-23|1996-07-16|1996-09-11|NONE|SHIP|nts detect accordin +36645|32|8|2|10|9320.30|0.00|0.06|N|O|1996-05-04|1996-06-04|1996-05-14|TAKE BACK RETURN|RAIL|lyly pending packages boost. blit +36645|1405|45|3|10|13064.00|0.09|0.06|N|O|1996-05-20|1996-07-26|1996-05-27|DELIVER IN PERSON|SHIP|uriously even platelets +36645|1111|84|4|25|25302.75|0.10|0.05|N|O|1996-07-03|1996-07-28|1996-07-06|TAKE BACK RETURN|TRUCK|uriously bold notorn +36645|1916|61|5|46|83623.86|0.05|0.02|N|O|1996-05-16|1996-06-17|1996-05-23|COLLECT COD|AIR|pendencies. blithely bold d +36645|873|7|6|26|46120.62|0.02|0.08|N|O|1996-06-02|1996-06-27|1996-06-24|TAKE BACK RETURN|TRUCK|ding deposits +36646|461|20|1|27|36759.42|0.07|0.01|R|F|1993-06-27|1993-08-10|1993-07-18|NONE|AIR|oss the quickly +36646|1994|95|2|14|26543.86|0.05|0.03|R|F|1993-08-04|1993-07-20|1993-08-24|TAKE BACK RETURN|TRUCK|iously alongside of the furio +36646|1900|1|3|44|79283.60|0.00|0.05|R|F|1993-08-18|1993-08-23|1993-09-09|TAKE BACK RETURN|MAIL|hely regula +36646|1237|12|4|18|20488.14|0.02|0.04|R|F|1993-06-18|1993-09-06|1993-06-28|NONE|FOB|l pinto beans. +36647|1553|34|1|29|42181.95|0.05|0.06|A|F|1994-07-10|1994-08-30|1994-07-31|COLLECT COD|FOB|lyly ironic requests cajole. bl +36647|786|19|2|48|80965.44|0.09|0.01|R|F|1994-08-20|1994-08-14|1994-09-19|DELIVER IN PERSON|SHIP|deposits. sl +36647|465|95|3|19|25943.74|0.09|0.03|R|F|1994-10-28|1994-08-09|1994-11-13|NONE|MAIL|gedly even p +36647|1487|66|4|12|16661.76|0.03|0.05|R|F|1994-09-16|1994-08-03|1994-10-12|NONE|AIR|accounts should detect slyly blithely +36647|944|45|5|16|29519.04|0.08|0.05|A|F|1994-10-21|1994-09-19|1994-11-14|TAKE BACK RETURN|TRUCK| regular, special accounts. deposits above +36647|716|17|6|4|6466.84|0.10|0.07|R|F|1994-10-19|1994-08-19|1994-10-30|COLLECT COD|SHIP|s are fluffily. depend +36647|1488|6|7|4|5557.92|0.08|0.02|A|F|1994-10-17|1994-08-22|1994-10-28|DELIVER IN PERSON|RAIL|ously regular packages nag +36672|722|55|1|7|11359.04|0.05|0.05|N|O|1997-11-20|1997-09-13|1997-12-20|DELIVER IN PERSON|TRUCK|ly final dependencies +36672|1347|62|2|20|24966.80|0.00|0.02|N|O|1997-09-28|1997-10-01|1997-10-28|NONE|FOB|ly final attainments. blithe theodolites us +36672|499|100|3|24|33587.76|0.09|0.03|N|O|1997-11-12|1997-10-19|1997-12-12|NONE|RAIL|. ironically express de +36672|1225|37|4|44|49553.68|0.00|0.01|N|O|1997-10-31|1997-09-25|1997-11-21|TAKE BACK RETURN|REG AIR|ithely thin d +36672|1365|42|5|30|37990.80|0.03|0.04|N|O|1997-09-10|1997-10-18|1997-10-10|TAKE BACK RETURN|RAIL|luffily final packages sl +36672|317|46|6|21|25563.51|0.04|0.00|N|O|1997-08-24|1997-10-21|1997-09-05|DELIVER IN PERSON|TRUCK| the furiously regular pinto +36673|879|80|1|45|80094.15|0.03|0.06|R|F|1993-12-27|1993-11-18|1994-01-09|NONE|SHIP|y according to the ironic, regular deposi +36673|1021|57|2|33|30426.66|0.00|0.01|A|F|1994-01-08|1993-10-17|1994-01-20|NONE|FOB|ual packages cajole asym +36673|1195|96|3|37|40559.03|0.07|0.06|R|F|1993-11-16|1993-11-11|1993-11-30|COLLECT COD|REG AIR|. packages sleep blit +36673|1216|54|4|39|43571.19|0.06|0.00|R|F|1993-12-07|1993-12-10|1993-12-08|DELIVER IN PERSON|FOB|xpress asymptotes detect even, b +36673|1775|60|5|45|75454.65|0.03|0.07|A|F|1993-10-28|1993-10-19|1993-11-08|TAKE BACK RETURN|AIR|s. regular p +36673|186|13|6|44|47791.92|0.05|0.01|R|F|1993-10-07|1993-11-09|1993-10-31|TAKE BACK RETURN|FOB|ly instructions. furious +36673|1358|73|7|36|45336.60|0.00|0.02|R|F|1993-09-18|1993-11-20|1993-09-28|DELIVER IN PERSON|SHIP|e carefully +36674|699|100|1|44|70386.36|0.00|0.06|N|O|1996-12-21|1996-10-18|1996-12-23|COLLECT COD|TRUCK| special instructions are quic +36674|43|19|2|5|4715.20|0.03|0.03|N|O|1996-09-03|1996-10-25|1996-09-30|NONE|REG AIR|ages affix blithely ruthle +36675|1690|14|1|30|47750.70|0.07|0.04|N|O|1995-07-22|1995-09-21|1995-08-05|TAKE BACK RETURN|REG AIR|ly regular packages serve fur +36675|324|53|2|5|6121.60|0.10|0.08|N|O|1995-08-30|1995-08-23|1995-09-02|TAKE BACK RETURN|MAIL|ecial asym +36675|1975|64|3|46|86340.62|0.10|0.02|N|O|1995-08-15|1995-09-30|1995-09-04|TAKE BACK RETURN|RAIL|phins are carefully regular +36675|1525|46|4|24|34236.48|0.01|0.05|N|O|1995-09-15|1995-09-21|1995-09-26|TAKE BACK RETURN|REG AIR|uickly along the bold dependencies. slyl +36676|1804|48|1|44|75055.20|0.06|0.04|N|O|1995-10-28|1995-09-25|1995-11-19|COLLECT COD|TRUCK|ans boost slyly-- blithely fin +36676|1667|68|2|21|32941.86|0.08|0.01|N|O|1995-09-02|1995-09-30|1995-09-22|DELIVER IN PERSON|REG AIR|ic packages are above the carefully +36676|1061|32|3|20|19241.20|0.10|0.04|N|O|1995-10-02|1995-10-03|1995-10-16|TAKE BACK RETURN|AIR|regular requests +36676|1288|26|4|1|1189.28|0.00|0.02|N|O|1995-11-04|1995-11-14|1995-12-02|NONE|RAIL|y bold, regular platelets-- quickly express +36676|570|1|5|15|22058.55|0.09|0.06|N|O|1995-12-20|1995-10-17|1995-12-23|COLLECT COD|SHIP|y unusual pearls. pinto +36676|779|12|6|11|18477.47|0.04|0.00|N|O|1995-09-11|1995-11-09|1995-10-02|NONE|FOB|longside of the furiously silen +36676|1631|73|7|1|1532.63|0.04|0.04|N|O|1995-12-14|1995-10-12|1995-12-26|TAKE BACK RETURN|AIR| regular requests at +36677|120|73|1|17|17342.04|0.04|0.03|A|F|1995-03-27|1995-02-25|1995-03-28|NONE|SHIP|. special deposits above the regular +36677|369|54|2|31|39350.16|0.03|0.05|R|F|1995-04-15|1995-02-18|1995-05-01|NONE|AIR|ounts breach across the even accounts +36677|1039|75|3|3|2820.09|0.03|0.04|R|F|1995-03-09|1995-02-13|1995-04-08|DELIVER IN PERSON|RAIL|around the regular courts cajole +36677|1323|62|4|4|4897.28|0.07|0.01|A|F|1995-04-16|1995-02-04|1995-04-27|COLLECT COD|RAIL|the ironic, f +36678|953|88|1|17|31517.15|0.01|0.07|R|F|1994-05-18|1994-02-23|1994-06-15|TAKE BACK RETURN|AIR|across the silent requests. +36678|1363|40|2|34|42988.24|0.07|0.03|A|F|1994-04-15|1994-03-17|1994-04-27|TAKE BACK RETURN|SHIP|ar deposits. special pinto beans g +36678|755|20|3|32|52984.00|0.09|0.06|A|F|1994-02-10|1994-04-06|1994-03-09|NONE|MAIL|ajole among the blith +36678|39|90|4|37|34744.11|0.06|0.07|A|F|1994-05-12|1994-03-28|1994-05-25|DELIVER IN PERSON|RAIL|ests are blithely regular frets. pendin +36678|1705|6|5|48|77121.60|0.10|0.05|A|F|1994-02-10|1994-04-13|1994-02-14|NONE|TRUCK|ly regular accounts. carefully eve +36678|190|91|6|44|47968.36|0.09|0.06|R|F|1994-03-10|1994-03-25|1994-03-15|COLLECT COD|AIR|ts are carefully agai +36678|1339|78|7|18|22325.94|0.01|0.03|R|F|1994-02-03|1994-03-27|1994-02-05|COLLECT COD|TRUCK|tructions nag furiously f +36679|152|5|1|48|50503.20|0.05|0.00|N|O|1995-12-11|1995-11-01|1996-01-04|NONE|FOB|ourts wake carefully along the b +36679|1503|44|2|3|4213.50|0.03|0.06|N|O|1995-12-15|1995-10-30|1995-12-20|COLLECT COD|FOB|y ironic theodolites. blithely regula +36679|1174|11|3|47|50532.99|0.00|0.01|N|O|1995-12-10|1995-10-26|1995-12-16|TAKE BACK RETURN|RAIL|s the even packages. careful +36704|1816|60|1|26|44663.06|0.01|0.01|N|O|1995-08-29|1995-08-25|1995-09-06|DELIVER IN PERSON|FOB|the regular packages. f +36704|1845|89|2|34|59392.56|0.05|0.06|N|O|1995-09-26|1995-08-26|1995-09-30|DELIVER IN PERSON|TRUCK|ely quickly bold theodolites +36704|628|60|3|45|68787.90|0.09|0.02|N|O|1995-09-25|1995-09-09|1995-10-01|DELIVER IN PERSON|MAIL| pending, ironic sheaves wake alon +36704|238|39|4|19|21626.37|0.03|0.00|N|O|1995-07-14|1995-08-05|1995-08-02|NONE|SHIP|o the fluffily even packages-- theodoli +36704|1642|84|5|8|12349.12|0.02|0.00|N|O|1995-09-03|1995-08-21|1995-09-23|COLLECT COD|TRUCK|ular platelets. +36704|1745|46|6|19|31288.06|0.06|0.01|N|O|1995-10-02|1995-09-09|1995-10-27|DELIVER IN PERSON|AIR|o the carefully ironic excuses nag flu +36704|1213|25|7|33|36768.93|0.01|0.02|N|O|1995-08-31|1995-07-18|1995-09-04|TAKE BACK RETURN|RAIL|lyly after t +36705|286|14|1|47|55755.16|0.01|0.03|R|F|1994-07-09|1994-08-13|1994-07-12|NONE|TRUCK|nto beans among th +36705|941|76|2|29|53416.26|0.02|0.04|R|F|1994-07-28|1994-09-09|1994-08-16|TAKE BACK RETURN|TRUCK|y regular deposits detect eve +36705|1122|31|3|38|38878.56|0.04|0.01|A|F|1994-10-11|1994-07-29|1994-11-03|COLLECT COD|MAIL|express packages sleep carefully. +36705|959|60|4|25|46498.75|0.02|0.07|R|F|1994-08-27|1994-08-12|1994-09-04|TAKE BACK RETURN|MAIL|ly regular idea +36706|4|30|1|38|34352.00|0.03|0.07|A|F|1994-05-22|1994-07-01|1994-05-23|COLLECT COD|MAIL|ly unusual accounts haggle along th +36706|623|55|2|49|74657.38|0.01|0.02|R|F|1994-05-20|1994-06-08|1994-05-28|TAKE BACK RETURN|AIR|o the special deposi +36706|500|59|3|5|7002.50|0.08|0.04|A|F|1994-06-29|1994-07-09|1994-07-05|NONE|FOB|blithely ironic plate +36706|1934|67|4|32|58749.76|0.09|0.03|R|F|1994-05-04|1994-06-13|1994-05-11|TAKE BACK RETURN|AIR|unusual ac +36706|1817|61|5|1|1718.81|0.05|0.03|A|F|1994-06-27|1994-06-14|1994-07-14|DELIVER IN PERSON|SHIP|ep slowly pending, permanent ideas. q +36707|305|62|1|11|13258.30|0.07|0.02|A|F|1995-03-14|1995-02-22|1995-03-27|NONE|TRUCK|quests sleep slyly thinly ironic foxes. +36707|577|38|2|37|54670.09|0.01|0.02|A|F|1994-12-18|1995-02-09|1995-01-16|COLLECT COD|FOB|, express foxes. special do +36707|409|97|3|9|11784.60|0.08|0.04|A|F|1995-03-30|1995-02-15|1995-04-19|TAKE BACK RETURN|MAIL|gle slyly pinto beans. quick +36707|1744|45|4|18|29623.32|0.02|0.04|R|F|1994-12-24|1995-02-26|1995-01-17|COLLECT COD|FOB|eposits kindl +36708|1149|22|1|22|23103.08|0.01|0.03|N|O|1995-12-05|1995-12-07|1995-12-12|NONE|SHIP|tions-- theodolites wake carefully. +36708|83|9|2|28|27526.24|0.01|0.08|N|O|1995-10-12|1995-11-12|1995-11-07|DELIVER IN PERSON|FOB|furiously regular packages. carefully un +36708|619|20|3|17|25833.37|0.10|0.07|N|O|1995-10-06|1995-11-13|1995-10-19|COLLECT COD|RAIL|carefully special packages promise +36709|1135|72|1|47|48698.11|0.08|0.01|R|F|1992-09-23|1992-10-14|1992-09-26|NONE|MAIL|ously alongside of the silently i +36709|1356|95|2|1|1257.35|0.03|0.04|R|F|1992-10-19|1992-11-17|1992-10-31|COLLECT COD|MAIL|ully special decoys are furiously even +36709|1848|49|3|30|52495.20|0.04|0.01|A|F|1992-09-16|1992-11-07|1992-09-25|DELIVER IN PERSON|RAIL|yly final accounts cajol +36709|1958|91|4|27|50218.65|0.08|0.06|A|F|1992-11-03|1992-10-02|1992-11-19|DELIVER IN PERSON|SHIP|furiously regu +36709|1503|24|5|43|60393.50|0.07|0.00|R|F|1992-10-26|1992-09-24|1992-11-21|DELIVER IN PERSON|RAIL|ts wake quickly against the quickly f +36709|1427|6|6|18|23911.56|0.00|0.04|R|F|1992-11-04|1992-10-03|1992-11-30|COLLECT COD|TRUCK| furious, regu +36709|1607|31|7|50|75430.00|0.10|0.02|A|F|1992-10-17|1992-10-15|1992-10-19|COLLECT COD|AIR|carefully dogged asym +36710|508|39|1|44|61974.00|0.07|0.00|N|O|1997-04-21|1997-05-11|1997-05-19|TAKE BACK RETURN|RAIL|even instructions sl +36710|1899|86|2|3|5402.67|0.07|0.01|N|O|1997-05-09|1997-05-25|1997-05-22|NONE|AIR|furiously sp +36710|1262|63|3|35|40714.10|0.03|0.03|N|O|1997-06-03|1997-06-01|1997-06-13|NONE|SHIP|ding to the carefully r +36710|1431|10|4|15|19986.45|0.07|0.05|N|O|1997-04-01|1997-05-17|1997-04-25|TAKE BACK RETURN|AIR|cies wake furiously blithely ironic escap +36710|662|25|5|36|56255.76|0.04|0.00|N|O|1997-06-15|1997-05-05|1997-07-07|COLLECT COD|MAIL|requests. even, pending pack +36711|753|50|1|46|76072.50|0.03|0.01|N|O|1998-01-11|1998-02-17|1998-01-15|DELIVER IN PERSON|TRUCK|ironic waters sleep carefully. ideas h +36711|1340|79|2|8|9930.72|0.08|0.02|N|O|1998-01-07|1998-01-02|1998-01-29|DELIVER IN PERSON|REG AIR|s the accounts. quickl +36711|63|14|3|6|5778.36|0.01|0.02|N|O|1998-03-01|1998-01-21|1998-03-12|DELIVER IN PERSON|FOB|atterns poach furiously pending packa +36711|676|70|4|3|4730.01|0.01|0.04|N|O|1998-03-12|1998-02-25|1998-04-11|TAKE BACK RETURN|FOB|counts. iron +36711|216|71|5|8|8929.68|0.10|0.00|N|O|1998-02-03|1998-02-27|1998-02-07|DELIVER IN PERSON|REG AIR|the blithely express ideas. furiously expr +36711|1770|55|6|39|65199.03|0.00|0.06|N|O|1998-01-10|1998-01-09|1998-01-27|TAKE BACK RETURN|REG AIR|ic dependencies of the slyly unus +36711|1916|17|7|25|45447.75|0.07|0.00|N|O|1998-01-19|1998-02-23|1998-01-31|NONE|RAIL|. carefully ironic deposits +36736|1739|66|1|19|31173.87|0.01|0.01|R|F|1995-05-30|1995-06-23|1995-06-05|NONE|SHIP|l ideas cajole blithely accordi +36736|879|79|2|47|83653.89|0.02|0.01|N|O|1995-07-22|1995-06-17|1995-08-21|DELIVER IN PERSON|AIR|s. unusual accounts mold slyly along +36736|1563|44|3|29|42472.24|0.08|0.03|N|O|1995-08-22|1995-07-16|1995-09-08|NONE|REG AIR|luffily regular deposits use. furiously ev +36736|1274|75|4|46|54062.42|0.04|0.03|N|O|1995-06-18|1995-06-16|1995-07-02|NONE|RAIL|nts wake-- furiously regu +36736|1762|5|5|29|48249.04|0.03|0.06|N|O|1995-08-07|1995-07-08|1995-08-10|DELIVER IN PERSON|MAIL|to beans haggle quickly. final platelets bo +36736|312|41|6|15|18184.65|0.01|0.06|N|O|1995-08-02|1995-06-07|1995-08-06|COLLECT COD|AIR|nts haggle blithely slyly bold accounts. c +36737|313|14|1|35|42465.85|0.09|0.01|R|F|1993-06-18|1993-05-16|1993-07-14|COLLECT COD|RAIL|ely against the busy deposits. slyly +36737|200|27|2|8|8801.60|0.03|0.08|R|F|1993-04-13|1993-05-09|1993-04-22|TAKE BACK RETURN|TRUCK|es sleep over the +36737|895|96|3|18|32326.02|0.05|0.07|R|F|1993-05-25|1993-06-01|1993-06-01|NONE|FOB|ges haggle care +36737|811|45|4|19|32524.39|0.09|0.08|A|F|1993-03-31|1993-04-17|1993-04-15|NONE|RAIL|ut the regular reques +36737|120|21|5|9|9181.08|0.02|0.00|R|F|1993-07-06|1993-05-31|1993-07-27|TAKE BACK RETURN|FOB|rhorses use-- even foxes ar +36737|1142|51|6|16|16690.24|0.00|0.01|A|F|1993-03-23|1993-04-21|1993-03-31|NONE|FOB|equests sleep b +36738|1119|28|1|9|9180.99|0.08|0.00|N|O|1996-07-25|1996-08-26|1996-08-24|DELIVER IN PERSON|FOB| blithely across the quickly final excuses +36738|1593|34|2|33|49321.47|0.06|0.05|N|O|1996-08-24|1996-09-19|1996-09-22|TAKE BACK RETURN|MAIL|ully final requests detect +36738|760|57|3|20|33215.20|0.02|0.02|N|O|1996-10-09|1996-09-22|1996-10-28|DELIVER IN PERSON|REG AIR|counts are about the foxes. idle de +36738|311|68|4|31|37550.61|0.02|0.00|N|O|1996-08-17|1996-08-18|1996-08-23|COLLECT COD|MAIL|ly. close deposits wake unusual package +36738|1042|48|5|18|16974.72|0.01|0.02|N|O|1996-08-09|1996-08-28|1996-09-03|NONE|REG AIR|ieve among the quickl +36738|1528|29|6|36|51462.72|0.09|0.08|N|O|1996-10-05|1996-09-04|1996-11-01|DELIVER IN PERSON|FOB|ar foxes sleep slyly. furiously unusu +36739|1410|11|1|41|53767.81|0.07|0.06|A|F|1994-10-10|1995-01-01|1994-10-13|COLLECT COD|RAIL|uickly even packages. slyly regular +36739|830|30|2|14|24231.62|0.07|0.06|A|F|1995-01-14|1995-01-02|1995-02-09|TAKE BACK RETURN|REG AIR|s x-ray above the ironic p +36739|735|32|3|23|37621.79|0.04|0.03|R|F|1994-12-26|1994-12-05|1995-01-20|TAKE BACK RETURN|FOB|l excuses. blithely spec +36739|824|91|4|31|53469.42|0.06|0.04|A|F|1994-10-12|1995-01-02|1994-10-29|DELIVER IN PERSON|MAIL|hinder requests. even, express +36739|723|56|5|11|17860.92|0.01|0.03|A|F|1994-10-14|1995-01-05|1994-11-02|COLLECT COD|MAIL|ithely spec +36739|653|54|6|6|9321.90|0.04|0.07|A|F|1994-11-21|1994-12-24|1994-12-01|COLLECT COD|TRUCK|s accounts cajole pending, final tithe +36740|1175|12|1|17|18294.89|0.05|0.08|N|O|1997-01-20|1997-02-20|1997-02-03|DELIVER IN PERSON|REG AIR| silent deposits +36740|107|34|2|34|34241.40|0.06|0.02|N|O|1997-04-19|1997-03-27|1997-04-28|DELIVER IN PERSON|REG AIR| packages. daring, ex +36740|189|42|3|31|33764.58|0.08|0.08|N|O|1997-01-31|1997-03-05|1997-02-14|NONE|REG AIR|. express, regular pearls sleep r +36740|230|85|4|44|49730.12|0.06|0.08|N|O|1997-04-21|1997-03-22|1997-05-07|COLLECT COD|REG AIR|slyly even packages. regula +36740|1939|28|5|46|84682.78|0.09|0.08|N|O|1997-03-29|1997-03-12|1997-04-03|DELIVER IN PERSON|SHIP|leep around the express, unusu +36740|230|85|6|15|16953.45|0.02|0.08|N|O|1997-04-23|1997-03-08|1997-04-30|TAKE BACK RETURN|TRUCK| the stealthily regular accou +36741|854|54|1|9|15793.65|0.02|0.05|A|F|1994-03-29|1994-02-06|1994-04-22|DELIVER IN PERSON|SHIP|ully bold accounts +36741|1032|68|2|36|33589.08|0.07|0.03|A|F|1994-01-14|1994-01-21|1994-01-18|TAKE BACK RETURN|FOB|e slyly final frets-- slyly regular +36741|169|96|3|18|19244.88|0.02|0.04|R|F|1994-03-21|1994-03-17|1994-04-04|DELIVER IN PERSON|SHIP|ts. blithely special packages wake +36741|505|66|4|8|11244.00|0.00|0.06|A|F|1994-04-05|1994-01-26|1994-04-30|DELIVER IN PERSON|MAIL|uffy dependencies. regular, unusual frets i +36741|861|62|5|14|24666.04|0.08|0.04|R|F|1994-01-20|1994-01-20|1994-01-26|COLLECT COD|FOB|ual requests. final de +36741|1424|64|6|27|35786.34|0.05|0.05|R|F|1994-04-02|1994-03-17|1994-04-24|COLLECT COD|SHIP|ly pinto beans. even ideas boost fur +36741|104|57|7|13|13053.30|0.01|0.06|A|F|1994-01-24|1994-01-25|1994-02-14|NONE|FOB|yly bold theodolites h +36742|572|63|1|28|41231.96|0.10|0.03|N|O|1998-01-31|1998-02-22|1998-02-08|NONE|FOB|ccording to the bol +36742|1506|87|2|14|19705.00|0.03|0.03|N|O|1998-02-23|1998-03-17|1998-03-02|COLLECT COD|REG AIR|lyly final requests. +36742|1247|59|3|18|20668.32|0.09|0.05|N|O|1998-02-14|1998-03-13|1998-03-13|COLLECT COD|SHIP|eodolites use slowly final accounts. +36743|1205|17|1|47|51991.40|0.09|0.04|A|F|1992-12-06|1992-11-15|1992-12-18|NONE|FOB|ular accounts. ir +36743|1462|80|2|47|64082.62|0.03|0.01|R|F|1992-10-24|1992-11-02|1992-10-25|TAKE BACK RETURN|SHIP|are blithel +36768|508|39|1|26|36621.00|0.02|0.04|N|O|1998-05-14|1998-06-30|1998-05-31|NONE|RAIL|uriously. regular foxes sleep bl +36768|739|40|2|4|6558.92|0.07|0.08|N|O|1998-07-14|1998-05-20|1998-07-31|NONE|MAIL|usly. carefully fin +36768|1615|98|3|21|31848.81|0.09|0.02|N|O|1998-04-28|1998-05-30|1998-05-16|COLLECT COD|REG AIR|ven Tiresias cajole. regular p +36768|984|53|4|4|7539.92|0.07|0.01|N|O|1998-05-02|1998-07-03|1998-05-15|COLLECT COD|RAIL|lphins cajole a +36769|183|10|1|41|44410.38|0.05|0.01|R|F|1994-05-09|1994-04-01|1994-06-08|COLLECT COD|TRUCK|pecial courts; bold, final f +36769|149|76|2|23|24130.22|0.06|0.08|A|F|1994-04-28|1994-04-06|1994-05-21|COLLECT COD|REG AIR|c requests. pending, regular foxes thr +36770|494|82|1|4|5577.96|0.03|0.02|N|O|1996-09-11|1996-11-10|1996-09-29|TAKE BACK RETURN|SHIP|s sleep. furious +36770|1668|69|2|47|73774.02|0.10|0.03|N|O|1996-12-24|1996-10-27|1997-01-18|DELIVER IN PERSON|AIR|he slyly final realms. ironic warhorse +36771|1381|96|1|33|42318.54|0.06|0.05|N|O|1996-02-01|1996-01-12|1996-02-03|NONE|MAIL|pinto beans wake. even, regular pack +36771|441|100|2|12|16097.28|0.08|0.04|N|O|1996-02-14|1995-12-13|1996-02-25|DELIVER IN PERSON|TRUCK|nly regular sauternes. even, unusu +36771|779|80|3|34|57112.18|0.10|0.06|N|O|1995-11-22|1995-12-17|1995-11-24|COLLECT COD|MAIL|. carefully iro +36771|572|63|4|18|26506.26|0.08|0.07|N|O|1996-01-31|1996-01-15|1996-02-02|COLLECT COD|AIR|uctions are slyly blithely express +36772|879|13|1|34|60515.58|0.05|0.00|A|F|1993-09-07|1993-08-14|1993-09-08|NONE|RAIL| ideas boost. deposits us +36772|829|30|2|4|6919.28|0.08|0.07|A|F|1993-05-21|1993-07-26|1993-06-04|COLLECT COD|RAIL|quests sleep carefull +36772|301|30|3|44|52857.20|0.10|0.03|A|F|1993-08-01|1993-07-17|1993-08-10|DELIVER IN PERSON|FOB|et excuses cajole +36772|1048|54|4|46|43655.84|0.07|0.07|R|F|1993-06-19|1993-07-18|1993-06-27|NONE|SHIP| blithely +36772|1023|29|5|3|2772.06|0.00|0.00|R|F|1993-07-05|1993-07-18|1993-08-04|COLLECT COD|SHIP|lyly slow accounts cajole +36772|1580|81|6|10|14815.80|0.00|0.01|A|F|1993-08-30|1993-07-30|1993-08-31|COLLECT COD|TRUCK|ests are carefully alongside of the reg +36772|938|41|7|33|60684.69|0.00|0.04|A|F|1993-06-28|1993-06-24|1993-07-06|NONE|FOB|about the final instructions wake furio +36773|848|49|1|23|40223.32|0.10|0.00|A|F|1993-12-22|1993-11-02|1994-01-14|NONE|AIR|y bold accounts h +36773|78|79|2|37|36188.59|0.07|0.06|R|F|1993-10-27|1993-11-23|1993-11-26|COLLECT COD|MAIL|oost slyly agai +36773|1688|89|3|35|55638.80|0.07|0.05|R|F|1993-12-07|1993-11-07|1993-12-16|TAKE BACK RETURN|RAIL|as. fluffi +36773|1321|98|4|20|24446.40|0.07|0.00|A|F|1993-10-03|1993-12-11|1993-10-08|COLLECT COD|TRUCK| ironic platelets +36774|1868|98|1|7|12389.02|0.05|0.04|N|O|1996-10-07|1996-11-12|1996-10-10|TAKE BACK RETURN|TRUCK|n requests nag theodolites. bl +36774|1986|31|2|36|67967.28|0.06|0.01|N|O|1996-11-26|1996-10-08|1996-12-25|COLLECT COD|REG AIR|lphins. slyly unu +36775|23|74|1|23|21229.46|0.01|0.03|N|O|1996-11-20|1997-02-08|1996-11-21|DELIVER IN PERSON|FOB|phins. fluffily ir +36775|1638|39|2|5|7698.15|0.02|0.07|N|O|1997-02-22|1997-02-05|1997-03-02|NONE|FOB|dencies after the reg +36800|1284|59|1|40|47411.20|0.03|0.08|R|F|1993-10-03|1993-12-05|1993-10-29|TAKE BACK RETURN|TRUCK|aggle furiously ideas-- pending, regular p +36800|1627|69|2|32|48915.84|0.06|0.08|A|F|1993-11-20|1993-10-30|1993-12-07|DELIVER IN PERSON|AIR|lithely regular packages. c +36800|837|38|3|37|64299.71|0.03|0.05|A|F|1993-12-14|1993-11-02|1994-01-11|NONE|MAIL| alongside of the furiou +36801|911|14|1|1|1811.91|0.03|0.05|N|O|1996-10-27|1996-10-04|1996-11-26|DELIVER IN PERSON|REG AIR| above the slyly unusual r +36801|1397|12|2|8|10387.12|0.06|0.04|N|O|1996-11-04|1996-10-11|1996-11-17|COLLECT COD|AIR|ffily across the even, ironic re +36801|307|8|3|43|51913.90|0.01|0.08|N|O|1996-09-06|1996-10-19|1996-09-24|COLLECT COD|AIR|c foxes haggle permanently blithe +36801|866|67|4|22|38870.92|0.03|0.07|N|O|1996-10-11|1996-11-08|1996-10-18|NONE|AIR| accounts are +36801|169|96|5|17|18175.72|0.02|0.04|N|O|1996-10-24|1996-09-21|1996-11-20|DELIVER IN PERSON|MAIL|to beans. carefully idle deposits u +36801|1806|50|6|31|52941.80|0.04|0.04|N|O|1996-08-20|1996-10-26|1996-09-02|NONE|MAIL|breach fluffily f +36801|1107|16|7|21|21170.10|0.01|0.06|N|O|1996-09-18|1996-10-21|1996-10-10|TAKE BACK RETURN|SHIP| final platelets along the express depend +36802|974|43|1|2|3749.94|0.02|0.08|N|O|1997-06-17|1997-06-11|1997-06-19|TAKE BACK RETURN|FOB|nal pinto beans kindle along the +36802|275|3|2|39|45835.53|0.01|0.04|N|O|1997-08-09|1997-06-05|1997-08-20|COLLECT COD|AIR|quickly along the carefully expres +36802|52|53|3|48|45698.40|0.04|0.04|N|O|1997-07-11|1997-06-01|1997-07-31|COLLECT COD|SHIP| quickly careful depos +36802|1182|19|4|31|33578.58|0.08|0.03|N|O|1997-05-02|1997-06-10|1997-05-18|COLLECT COD|AIR|oss the quiet, reg +36802|288|16|5|1|1188.28|0.09|0.02|N|O|1997-04-30|1997-06-11|1997-05-01|DELIVER IN PERSON|TRUCK|e ironic requests. quickly +36802|486|45|6|38|52686.24|0.07|0.06|N|O|1997-04-17|1997-05-31|1997-05-08|DELIVER IN PERSON|RAIL|eposits across the quickly even ac +36802|630|24|7|20|30612.60|0.01|0.08|N|O|1997-07-06|1997-05-30|1997-07-13|DELIVER IN PERSON|RAIL|sits are. furi +36803|1401|2|1|43|56003.20|0.02|0.01|R|F|1992-08-20|1992-10-02|1992-09-17|DELIVER IN PERSON|SHIP|s may sleep fluffily blithely f +36803|544|45|2|44|63559.76|0.05|0.03|R|F|1992-10-19|1992-09-19|1992-10-29|NONE|SHIP|instructions +36803|625|19|3|48|73229.76|0.08|0.00|A|F|1992-10-27|1992-10-06|1992-11-03|TAKE BACK RETURN|AIR|to the fluffily reg +36803|1710|53|4|13|20952.23|0.03|0.05|A|F|1992-10-19|1992-09-15|1992-10-22|DELIVER IN PERSON|SHIP| blithely sl +36803|1625|67|5|40|61064.80|0.01|0.03|R|F|1992-08-14|1992-10-19|1992-09-12|DELIVER IN PERSON|RAIL| sleep along the furiously regular accounts +36803|352|37|6|47|58860.45|0.05|0.04|R|F|1992-08-31|1992-10-02|1992-09-30|NONE|REG AIR|iously regul +36803|1559|60|7|31|45277.05|0.00|0.01|R|F|1992-09-25|1992-10-09|1992-10-21|NONE|SHIP|side of the requests. +36804|1450|90|1|44|59463.80|0.07|0.02|A|F|1994-10-04|1994-09-25|1994-11-03|NONE|RAIL|o the carefully even foxes. +36804|146|47|2|42|43937.88|0.04|0.00|A|F|1994-09-09|1994-08-18|1994-10-02|TAKE BACK RETURN|MAIL|. slyly quiet foxes are furiously regular +36804|688|89|3|29|46071.72|0.06|0.06|R|F|1994-07-09|1994-08-02|1994-07-13|DELIVER IN PERSON|REG AIR|ainst the blithely special +36804|728|25|4|12|19544.64|0.00|0.08|A|F|1994-07-23|1994-09-18|1994-08-15|NONE|MAIL|usual excuses daz +36804|917|20|5|49|89077.59|0.01|0.02|A|F|1994-09-26|1994-09-12|1994-10-15|COLLECT COD|MAIL|regular request +36805|1344|59|1|12|14944.08|0.09|0.04|A|F|1993-12-16|1994-02-06|1994-01-03|COLLECT COD|FOB|ackages integra +36805|29|80|2|1|929.02|0.02|0.02|A|F|1994-01-24|1994-03-02|1994-02-14|COLLECT COD|TRUCK|gainst the accounts. bli +36805|1009|15|3|14|12740.00|0.07|0.05|R|F|1994-03-13|1994-02-04|1994-04-05|COLLECT COD|REG AIR|ructions. slyly even plat +36805|793|58|4|13|22019.27|0.09|0.04|R|F|1994-02-07|1994-03-10|1994-03-01|DELIVER IN PERSON|REG AIR|posits are blithely blithely final package +36805|1871|15|5|2|3545.74|0.03|0.01|R|F|1994-03-14|1994-02-17|1994-03-19|COLLECT COD|SHIP| final pinto beans. blith +36806|1253|54|1|8|9234.00|0.03|0.07|N|O|1998-09-09|1998-08-02|1998-09-16|TAKE BACK RETURN|AIR|nd carefully blithely even a +36806|1675|58|2|21|33110.07|0.09|0.01|N|O|1998-08-23|1998-08-23|1998-09-08|COLLECT COD|SHIP|pending requests +36806|1679|80|3|38|60065.46|0.01|0.03|N|O|1998-06-26|1998-07-31|1998-07-24|DELIVER IN PERSON|TRUCK|express asym +36806|1910|43|4|31|56169.21|0.03|0.02|N|O|1998-08-06|1998-09-07|1998-08-08|COLLECT COD|TRUCK|egular patterns haggle furiously carefull +36807|1942|87|1|23|42410.62|0.01|0.02|A|F|1994-07-05|1994-04-30|1994-07-08|NONE|FOB|ent account +36807|1028|29|2|3|2787.06|0.06|0.02|R|F|1994-04-26|1994-05-01|1994-05-20|DELIVER IN PERSON|MAIL| requests across the carefu +36807|1263|64|3|44|51227.44|0.04|0.05|A|F|1994-04-11|1994-06-02|1994-04-24|NONE|TRUCK|unts. carefully close excuses breach silent +36807|1058|64|4|48|46034.40|0.09|0.08|R|F|1994-05-31|1994-05-27|1994-06-17|TAKE BACK RETURN|MAIL|ep blithely according +36832|1649|50|1|28|43417.92|0.06|0.03|A|F|1992-07-07|1992-07-16|1992-07-08|DELIVER IN PERSON|REG AIR|mong the fluffil +36832|723|20|2|40|64948.80|0.02|0.03|R|F|1992-09-17|1992-07-31|1992-09-21|DELIVER IN PERSON|AIR|arefully around the requests. ironicall +36832|700|32|3|43|68830.10|0.04|0.06|R|F|1992-06-13|1992-08-28|1992-06-19|DELIVER IN PERSON|FOB|ly ironic in +36832|653|85|4|41|63699.65|0.02|0.06|A|F|1992-08-27|1992-08-24|1992-09-09|TAKE BACK RETURN|REG AIR|dependencies. carefully regular reque +36833|1603|86|1|43|64697.80|0.08|0.05|A|F|1992-08-30|1992-09-07|1992-09-29|TAKE BACK RETURN|SHIP|le fluffily past the bol +36833|327|28|2|23|28228.36|0.02|0.03|R|F|1992-09-28|1992-09-26|1992-10-17|TAKE BACK RETURN|FOB|r depths boost. qu +36833|1424|42|3|38|50365.96|0.00|0.05|R|F|1992-11-08|1992-09-02|1992-11-12|DELIVER IN PERSON|FOB| should sleep blithely according to t +36834|1177|78|1|43|46361.31|0.09|0.04|R|F|1995-02-24|1995-03-24|1995-03-14|TAKE BACK RETURN|FOB|ic instructions haggle carefully slyly iro +36834|1357|72|2|47|59142.45|0.06|0.02|A|F|1995-03-20|1995-02-16|1995-03-27|TAKE BACK RETURN|FOB|nal accounts cajole fluffily even +36835|543|74|1|20|28870.80|0.05|0.03|A|F|1994-12-08|1995-01-08|1994-12-20|TAKE BACK RETURN|TRUCK| after the dependencies +36835|391|48|2|50|64569.50|0.06|0.07|R|F|1995-01-29|1995-01-06|1995-02-05|TAKE BACK RETURN|RAIL|ironic pinto beans wake qu +36835|1510|31|3|5|7057.55|0.07|0.07|A|F|1995-01-12|1994-12-17|1995-01-21|DELIVER IN PERSON|MAIL|nto beans. blithely special e +36835|719|20|4|47|76126.37|0.02|0.03|R|F|1995-01-15|1994-11-27|1995-01-28|NONE|MAIL|s. regular +36835|1718|61|5|18|29154.78|0.04|0.03|R|F|1994-11-15|1995-01-12|1994-11-23|DELIVER IN PERSON|RAIL| pending packages boost against the final +36835|668|31|6|39|61177.74|0.06|0.00|R|F|1994-12-23|1994-11-30|1995-01-19|NONE|RAIL| blithely ironic accounts bo +36835|1647|71|7|1|1548.64|0.05|0.00|R|F|1995-01-07|1994-11-23|1995-01-14|COLLECT COD|FOB|longside of the ironic orbits: furiously +36836|242|70|1|28|31982.72|0.01|0.04|A|F|1993-03-20|1993-04-19|1993-04-02|COLLECT COD|RAIL|regular excuses promise quietly. pendin +36836|1168|5|2|28|29936.48|0.01|0.07|A|F|1993-06-17|1993-04-15|1993-06-24|TAKE BACK RETURN|REG AIR|efully unusual accounts wake fi +36836|133|60|3|17|17563.21|0.09|0.07|R|F|1993-04-28|1993-04-22|1993-05-01|TAKE BACK RETURN|REG AIR|integrate blithely. carefully re +36836|1200|37|4|2|2202.40|0.00|0.03|A|F|1993-04-26|1993-04-28|1993-04-28|NONE|FOB|g excuses are fluffily slyly fl +36836|1428|68|5|23|30576.66|0.05|0.03|A|F|1993-03-31|1993-05-24|1993-04-17|TAKE BACK RETURN|MAIL|according to the furiously ironic theodo +36837|774|75|1|19|31820.63|0.08|0.07|N|O|1997-08-13|1997-09-03|1997-08-28|COLLECT COD|AIR|l deposits run furiously. special, re +36837|1038|9|2|29|27231.87|0.07|0.03|N|O|1997-10-05|1997-09-14|1997-11-02|NONE|MAIL| slyly across the slyly final acco +36837|1665|48|3|46|72066.36|0.10|0.07|N|O|1997-09-16|1997-09-12|1997-10-15|NONE|SHIP|lithely express orbits. express plate +36837|1547|68|4|24|34764.96|0.07|0.06|N|O|1997-10-12|1997-08-27|1997-10-21|DELIVER IN PERSON|MAIL|g against the slyly special instructions. b +36837|4|30|5|41|37064.00|0.08|0.00|N|O|1997-10-10|1997-09-07|1997-10-30|NONE|AIR|nding, special foxes affix after +36837|788|89|6|35|59107.30|0.05|0.04|N|O|1997-09-05|1997-08-02|1997-09-25|NONE|TRUCK|efully express requests alongs +36837|1158|67|7|22|23301.30|0.04|0.08|N|O|1997-09-30|1997-09-16|1997-10-13|DELIVER IN PERSON|SHIP|uietly blithely ironic tithes. +36838|673|67|1|41|64520.47|0.02|0.08|A|F|1994-04-11|1994-06-29|1994-05-05|DELIVER IN PERSON|MAIL|uses are pending requests. somet +36838|583|44|2|50|74179.00|0.03|0.05|R|F|1994-05-07|1994-06-14|1994-05-10|COLLECT COD|MAIL|ns use blithel +36838|1920|9|3|6|10931.52|0.08|0.02|R|F|1994-06-01|1994-06-05|1994-07-01|TAKE BACK RETURN|AIR|express excus +36838|1256|57|4|47|54390.75|0.02|0.08|R|F|1994-07-23|1994-06-13|1994-07-26|NONE|RAIL|jole stealthily along the +36838|664|27|5|18|28163.88|0.01|0.04|R|F|1994-05-02|1994-06-20|1994-05-18|TAKE BACK RETURN|RAIL|s packages after the brave i +36838|549|10|6|25|36238.50|0.04|0.02|A|F|1994-07-10|1994-05-29|1994-07-14|NONE|RAIL|equests agai +36838|1488|28|7|40|55579.20|0.08|0.06|A|F|1994-07-13|1994-06-19|1994-07-31|NONE|RAIL|sts sleep furiously. blithe +36839|156|83|1|37|39077.55|0.07|0.07|N|O|1997-03-11|1997-02-09|1997-03-26|TAKE BACK RETURN|REG AIR|l foxes haggle blithely. final th +36839|1840|84|2|46|80124.64|0.03|0.01|N|O|1996-12-19|1997-01-27|1997-01-10|COLLECT COD|TRUCK|ajole blithely +36864|1374|75|1|35|44637.95|0.04|0.04|R|F|1992-11-10|1992-09-21|1992-12-05|COLLECT COD|TRUCK|hely sly platelets according to th +36864|1998|99|2|43|81699.57|0.07|0.05|R|F|1992-08-31|1992-08-30|1992-09-30|DELIVER IN PERSON|MAIL|sheaves haggle slyly about the +36864|562|93|3|46|67277.76|0.02|0.02|A|F|1992-10-03|1992-10-08|1992-10-29|DELIVER IN PERSON|REG AIR|aggle. ironic, even sentiments +36864|1264|39|4|17|19809.42|0.01|0.06|A|F|1992-08-30|1992-09-01|1992-09-14|DELIVER IN PERSON|REG AIR| across the pin +36864|1584|85|5|20|29711.60|0.01|0.01|A|F|1992-08-11|1992-08-30|1992-08-18|NONE|SHIP| deposits wake slyly foxes. pending +36864|140|41|6|1|1040.14|0.09|0.00|R|F|1992-09-07|1992-10-27|1992-09-08|TAKE BACK RETURN|FOB| about the +36865|586|47|1|40|59463.20|0.10|0.01|N|O|1997-09-15|1997-10-19|1997-09-16|TAKE BACK RETURN|AIR|eas cajole car +36865|547|78|2|36|52111.44|0.05|0.08|N|O|1997-12-06|1997-10-25|1997-12-14|NONE|TRUCK|kly ironic +36865|462|92|3|2|2724.92|0.01|0.03|N|O|1997-12-20|1997-11-22|1998-01-17|TAKE BACK RETURN|SHIP|tes across the fluffy, sile +36866|1739|24|1|8|13125.84|0.00|0.06|R|F|1993-07-10|1993-05-31|1993-08-04|NONE|REG AIR| the ironic deposits. excuses among th +36866|467|68|2|44|60168.24|0.03|0.01|R|F|1993-06-19|1993-05-01|1993-07-05|DELIVER IN PERSON|MAIL|ly pending, re +36866|701|34|3|45|72076.50|0.05|0.07|A|F|1993-05-28|1993-06-09|1993-06-18|TAKE BACK RETURN|RAIL| orbits de +36866|18|69|4|30|27540.30|0.10|0.05|A|F|1993-05-10|1993-06-23|1993-05-22|NONE|SHIP| accounts affix dog +36867|399|28|1|27|35083.53|0.05|0.03|R|F|1994-11-22|1994-11-25|1994-11-27|DELIVER IN PERSON|AIR|cies cajole blithely. final, dar +36867|1159|68|2|15|15902.25|0.10|0.05|A|F|1994-09-14|1994-10-20|1994-10-07|TAKE BACK RETURN|AIR| blithely pending requ +36867|224|79|3|37|41596.14|0.01|0.02|R|F|1994-10-07|1994-11-28|1994-11-01|TAKE BACK RETURN|REG AIR|ar courts. final pinto beans cajole fu +36867|954|55|4|31|57503.45|0.04|0.06|R|F|1994-10-30|1994-10-24|1994-11-19|TAKE BACK RETURN|FOB|the daring, pending somas. +36867|1655|38|5|48|74719.20|0.10|0.06|R|F|1994-09-27|1994-10-17|1994-10-23|DELIVER IN PERSON|FOB|kages mold alongside of t +36867|677|78|6|10|15776.70|0.03|0.00|A|F|1994-09-08|1994-12-04|1994-09-21|TAKE BACK RETURN|TRUCK|across the slyly special theodolites are a +36867|851|52|7|18|31533.30|0.07|0.02|R|F|1994-11-10|1994-12-02|1994-11-12|COLLECT COD|MAIL|odolites affix carefully across the furio +36868|407|95|1|20|26148.00|0.04|0.03|N|O|1997-10-06|1997-07-30|1997-11-05|TAKE BACK RETURN|MAIL|ular dolphins doubt ca +36868|998|67|2|5|9494.95|0.00|0.06|N|O|1997-10-03|1997-08-29|1997-10-10|COLLECT COD|SHIP|are daringly. pi +36869|85|61|1|28|27582.24|0.08|0.04|A|F|1993-09-26|1993-10-21|1993-10-14|TAKE BACK RETURN|SHIP|ronic asym +36869|1733|60|2|31|50676.63|0.07|0.08|A|F|1993-11-23|1993-11-29|1993-12-05|COLLECT COD|TRUCK|ully final ideas? pending depths cajole bl +36869|27|3|3|47|43569.94|0.00|0.05|A|F|1993-10-06|1993-12-06|1993-11-03|DELIVER IN PERSON|FOB|luffily regular ideas +36869|1717|18|4|29|46942.59|0.03|0.06|R|F|1993-09-23|1993-10-21|1993-10-09|NONE|MAIL|yly regular accou +36870|1147|48|1|48|50310.72|0.02|0.07|N|O|1996-10-24|1996-10-22|1996-11-16|DELIVER IN PERSON|REG AIR|hely slyly fi +36870|586|87|2|33|49057.14|0.00|0.04|N|O|1996-08-12|1996-09-26|1996-08-28|NONE|MAIL|onic ideas. care +36870|280|81|3|29|34228.12|0.08|0.06|N|O|1996-09-10|1996-09-06|1996-09-20|NONE|TRUCK|s the accounts. express dependenc +36871|768|69|1|18|30037.68|0.00|0.04|N|O|1998-04-19|1998-06-06|1998-04-24|NONE|REG AIR|bold theodolites-- carefully ironic ide +36871|776|41|2|28|46949.56|0.10|0.06|N|O|1998-04-15|1998-05-28|1998-04-29|COLLECT COD|FOB|lly ironic instruc +36871|573|64|3|18|26524.26|0.00|0.01|N|O|1998-06-08|1998-06-19|1998-07-06|DELIVER IN PERSON|SHIP| blithely ex +36871|1676|100|4|17|26820.39|0.05|0.06|N|O|1998-05-25|1998-05-11|1998-06-10|TAKE BACK RETURN|MAIL|packages nag carefully bold deposits. +36871|838|39|5|38|66075.54|0.03|0.03|N|O|1998-04-22|1998-05-28|1998-05-15|COLLECT COD|SHIP|ally ironic excuses are f +36871|23|49|6|50|46151.00|0.08|0.06|N|O|1998-06-06|1998-06-08|1998-06-10|DELIVER IN PERSON|MAIL|lly evenly regular waters. qui +36871|1284|22|7|16|18964.48|0.00|0.04|N|O|1998-04-24|1998-06-08|1998-05-10|DELIVER IN PERSON|SHIP|y ironic packages run +36896|993|28|1|35|66289.65|0.04|0.04|R|F|1995-02-09|1995-01-03|1995-02-23|NONE|SHIP|usly. never bold notornis nag carefu +36896|4|80|2|7|6328.00|0.08|0.00|R|F|1994-11-10|1994-12-30|1994-11-23|TAKE BACK RETURN|AIR|s are inside the even, bold accounts. ca +36896|721|86|3|10|16217.20|0.07|0.00|A|F|1995-02-18|1995-01-14|1995-03-04|TAKE BACK RETURN|MAIL|r accounts. s +36896|1870|100|4|27|47840.49|0.04|0.03|R|F|1995-02-18|1995-01-07|1995-03-11|COLLECT COD|AIR|ckly. ironic packages against the a +36896|1885|15|5|31|55393.28|0.04|0.03|A|F|1995-02-14|1994-12-30|1995-02-20|NONE|MAIL|ietly even accounts. +36896|1504|5|6|41|57625.50|0.07|0.01|R|F|1994-11-24|1994-12-10|1994-12-16|DELIVER IN PERSON|TRUCK|ect blithely. even re +36897|1200|9|1|13|14315.60|0.01|0.03|N|O|1996-02-07|1996-01-13|1996-02-10|NONE|TRUCK|riously regular accounts. +36897|839|40|2|42|73072.86|0.05|0.03|N|O|1996-01-10|1996-01-31|1996-01-26|TAKE BACK RETURN|FOB|oxes wake regular, ironic +36897|1882|12|3|6|10703.28|0.02|0.06|N|O|1996-01-14|1996-03-08|1996-01-26|COLLECT COD|FOB|the quickly unusual +36897|817|51|4|19|32638.39|0.04|0.05|N|O|1996-03-23|1996-01-13|1996-03-25|NONE|SHIP|among the sometimes unusual foxes. pl +36897|848|48|5|23|40223.32|0.00|0.08|N|O|1996-01-17|1996-01-21|1996-01-24|TAKE BACK RETURN|AIR|fully even ins +36897|311|12|6|17|20592.27|0.06|0.06|N|O|1996-02-02|1996-02-13|1996-02-27|NONE|SHIP| was after the +36898|1473|13|1|36|49480.92|0.01|0.05|R|F|1992-09-28|1992-08-11|1992-10-24|TAKE BACK RETURN|REG AIR|ly pending dugouts. slyl +36898|402|3|2|41|53398.40|0.09|0.01|A|F|1992-09-07|1992-10-04|1992-09-14|TAKE BACK RETURN|TRUCK|unts according to +36898|1334|35|3|21|25941.93|0.02|0.06|R|F|1992-10-02|1992-09-18|1992-10-30|TAKE BACK RETURN|AIR|t pending, even pinto beans. quickly expr +36898|1710|11|4|22|35457.62|0.00|0.00|R|F|1992-10-22|1992-09-06|1992-10-31|DELIVER IN PERSON|FOB| the daringly regular pinto b +36899|1164|65|1|22|23433.52|0.09|0.05|N|O|1995-07-04|1995-06-20|1995-07-24|COLLECT COD|FOB|its affix. blithely even req +36900|874|75|1|33|58570.71|0.03|0.05|N|O|1997-10-31|1997-10-02|1997-11-14|NONE|MAIL|long the furiously unusual package +36900|1432|72|2|5|6667.15|0.03|0.03|N|O|1997-10-15|1997-09-28|1997-10-30|DELIVER IN PERSON|FOB|apades use furiously. regular fo +36900|1383|60|3|37|47522.06|0.04|0.00|N|O|1997-08-24|1997-08-27|1997-08-30|NONE|RAIL|special warhorses are flu +36900|1557|38|4|45|65634.75|0.08|0.03|N|O|1997-08-16|1997-09-29|1997-09-10|COLLECT COD|MAIL|sits cajole blithely caref +36901|1304|19|1|45|54238.50|0.03|0.02|A|F|1992-10-31|1992-11-19|1992-11-25|DELIVER IN PERSON|RAIL|lyly across the final requests. slyly fi +36901|743|44|2|12|19724.88|0.03|0.05|A|F|1992-10-27|1992-11-15|1992-10-28|NONE|TRUCK|l theodolites +36901|1049|50|3|13|12350.52|0.03|0.07|A|F|1992-10-04|1992-10-19|1992-10-08|NONE|MAIL|efully pending theodolites. final tithes +36901|1952|53|4|5|9269.75|0.03|0.05|A|F|1992-09-26|1992-12-06|1992-10-04|NONE|REG AIR|against the carefully unusual theodolites s +36901|979|48|5|8|15039.76|0.09|0.03|A|F|1993-01-07|1992-10-14|1993-01-08|DELIVER IN PERSON|REG AIR| nag blith +36902|1443|83|1|15|20166.60|0.01|0.06|N|O|1998-01-13|1997-11-07|1998-01-25|COLLECT COD|REG AIR|gular attainments nag carefully al +36902|1880|67|2|6|10691.28|0.06|0.06|N|O|1997-11-05|1997-12-13|1997-11-28|COLLECT COD|FOB|nal asympt +36902|183|36|3|17|18414.06|0.08|0.03|N|O|1997-10-10|1997-12-29|1997-11-04|DELIVER IN PERSON|MAIL|usly ruthless requests. quickly final id +36902|122|23|4|30|30663.60|0.00|0.06|N|O|1998-01-22|1997-12-15|1998-02-17|NONE|TRUCK|packages across the deposits use blithel +36902|1473|74|5|37|50855.39|0.06|0.00|N|O|1997-11-07|1997-12-06|1997-11-22|TAKE BACK RETURN|MAIL|accounts nag quickly along the blithely f +36902|1674|16|6|38|59875.46|0.07|0.05|N|O|1997-12-03|1997-11-05|1997-12-19|NONE|AIR|ts: ruthlessly regular +36903|734|35|1|15|24520.95|0.09|0.07|N|O|1996-07-22|1996-08-21|1996-07-30|COLLECT COD|RAIL|es. regular e +36903|1973|18|2|38|71248.86|0.00|0.08|N|O|1996-06-22|1996-07-27|1996-07-05|TAKE BACK RETURN|MAIL|s. furiously ironic ideas use carefull +36903|1720|21|3|19|30812.68|0.01|0.07|N|O|1996-09-29|1996-08-29|1996-10-12|TAKE BACK RETURN|AIR|he special theodolites. bold pi +36903|796|97|4|48|81445.92|0.07|0.08|N|O|1996-06-20|1996-07-13|1996-06-28|DELIVER IN PERSON|TRUCK|ost. ironic requests boost slyly ag +36903|1814|15|5|14|24021.34|0.07|0.06|N|O|1996-07-15|1996-07-08|1996-07-26|NONE|MAIL|s solve. final deposits about the fluffily +36903|834|35|6|40|69393.20|0.03|0.01|N|O|1996-08-20|1996-07-22|1996-08-25|DELIVER IN PERSON|REG AIR|ng dependencies. bl +36903|979|80|7|5|9399.85|0.08|0.02|N|O|1996-07-04|1996-07-31|1996-08-03|DELIVER IN PERSON|SHIP|y final dolphins run +36928|866|33|1|17|30036.62|0.05|0.08|N|O|1998-01-13|1998-02-10|1998-01-26|NONE|RAIL|ts wake furiously along th +36929|1999|32|1|22|41821.78|0.01|0.04|R|F|1992-07-03|1992-07-30|1992-08-01|TAKE BACK RETURN|SHIP|s across the slyly ironic +36929|594|85|2|6|8967.54|0.08|0.05|A|F|1992-08-16|1992-07-08|1992-08-22|TAKE BACK RETURN|FOB|ong the platelets. blithely regular foxes s +36930|407|8|1|25|32685.00|0.06|0.02|N|O|1995-11-26|1995-11-14|1995-12-11|TAKE BACK RETURN|REG AIR|ses. carefully brave pinto beans hag +36930|739|4|2|43|70508.39|0.04|0.05|N|O|1995-12-10|1995-12-14|1995-12-12|TAKE BACK RETURN|RAIL|icing deposits. sly +36930|289|44|3|36|42814.08|0.03|0.08|N|O|1995-10-26|1995-12-11|1995-10-30|COLLECT COD|MAIL|lar, regular deposits +36930|720|53|4|37|59966.64|0.06|0.01|N|O|1995-12-11|1995-10-31|1995-12-23|DELIVER IN PERSON|FOB| the unusual accounts. furi +36930|1569|50|5|37|54410.72|0.00|0.02|N|O|1995-12-01|1995-12-07|1995-12-19|DELIVER IN PERSON|RAIL|thrash unusu +36931|229|57|1|20|22584.40|0.01|0.02|A|F|1995-05-18|1995-04-19|1995-06-07|DELIVER IN PERSON|REG AIR|gular requests. unusual req +36931|253|8|2|18|20758.50|0.08|0.03|A|F|1995-02-24|1995-03-12|1995-03-05|COLLECT COD|MAIL|leep slyly. frays wake sly +36931|1025|26|3|17|15742.34|0.03|0.04|A|F|1995-04-27|1995-03-07|1995-05-25|COLLECT COD|MAIL|accounts wa +36932|379|80|1|38|48616.06|0.07|0.00|A|F|1994-08-02|1994-09-14|1994-08-16|COLLECT COD|AIR|s wake careful +36932|1441|81|2|13|17451.72|0.04|0.03|A|F|1994-07-18|1994-08-17|1994-08-14|DELIVER IN PERSON|TRUCK|fully quickly express as +36932|399|100|3|36|46778.04|0.02|0.05|R|F|1994-08-31|1994-08-18|1994-09-29|NONE|FOB|. slyly even frays haggle careful +36932|1233|45|4|31|35161.13|0.00|0.01|R|F|1994-08-25|1994-09-01|1994-08-31|DELIVER IN PERSON|FOB|ular ideas. blithely unusu +36932|885|19|5|14|25002.32|0.01|0.01|R|F|1994-08-31|1994-10-04|1994-09-04|NONE|TRUCK|ctions. carefully +36932|1249|24|6|50|57512.00|0.10|0.06|R|F|1994-10-16|1994-10-03|1994-11-11|DELIVER IN PERSON|RAIL|sly bold, regular packages. ideas above th +36933|228|10|1|7|7897.54|0.03|0.06|N|O|1995-08-16|1995-08-31|1995-08-28|COLLECT COD|AIR|ng pinto beans according to the theodol +36933|715|48|2|27|43624.17|0.05|0.00|N|O|1995-09-02|1995-09-17|1995-09-04|NONE|SHIP|ons! blithely fi +36933|1707|34|3|27|43434.90|0.10|0.04|N|O|1995-07-20|1995-08-19|1995-07-26|NONE|REG AIR|about the blithely special account +36933|1644|86|4|14|21638.96|0.08|0.07|N|O|1995-07-20|1995-10-01|1995-08-10|NONE|FOB|xpress foxes use. pending instructio +36933|765|98|5|24|39978.24|0.05|0.03|N|O|1995-09-23|1995-08-30|1995-10-19|COLLECT COD|TRUCK|s. finally unusual requests boost blithely +36934|473|61|1|10|13734.70|0.02|0.07|R|F|1995-02-17|1995-01-25|1995-03-16|DELIVER IN PERSON|FOB|y pending deposit +36934|155|8|2|8|8441.20|0.09|0.00|A|F|1995-01-03|1995-01-26|1995-01-28|COLLECT COD|RAIL|xpress, fluffy instructions. furiously bo +36934|796|29|3|11|18664.69|0.02|0.04|R|F|1995-02-02|1995-02-13|1995-02-09|COLLECT COD|MAIL|areful pint +36934|47|48|4|19|17993.76|0.06|0.08|R|F|1995-04-21|1995-03-11|1995-05-20|COLLECT COD|SHIP|nal requests x-ray carefully. pendin +36934|416|4|5|39|51339.99|0.04|0.08|A|F|1995-01-19|1995-01-30|1995-02-16|NONE|MAIL|iously even +36935|1707|92|1|11|17695.70|0.10|0.05|N|O|1995-11-14|1995-12-20|1995-12-01|NONE|TRUCK|es above the bold, regular frets dou +36960|550|11|1|12|17406.60|0.08|0.02|A|F|1995-04-26|1995-06-04|1995-05-13|COLLECT COD|SHIP|deposits integrate. final, bold instru +36961|1426|44|1|25|33185.50|0.00|0.07|N|O|1996-11-10|1996-11-20|1996-12-06|TAKE BACK RETURN|RAIL|permanently +36961|576|77|2|19|28054.83|0.10|0.01|N|O|1996-10-30|1996-10-21|1996-11-05|DELIVER IN PERSON|FOB|gular, express requ +36961|1660|2|3|4|6246.64|0.10|0.06|N|O|1996-11-30|1996-11-23|1996-12-20|DELIVER IN PERSON|REG AIR|al instructions pla +36961|855|55|4|49|86036.65|0.07|0.03|N|O|1996-12-15|1996-10-23|1996-12-19|TAKE BACK RETURN|TRUCK|hely final requests haggle. slyly ir +36961|1849|93|5|27|47272.68|0.05|0.00|N|O|1996-11-19|1996-11-11|1996-12-15|COLLECT COD|REG AIR|ly unusual deposi +36961|1820|7|6|30|51654.60|0.09|0.01|N|O|1996-12-28|1996-10-22|1997-01-10|TAKE BACK RETURN|FOB|yly beside the even accounts. furio +36962|1144|53|1|44|45986.16|0.00|0.04|A|F|1994-01-08|1994-03-01|1994-01-25|DELIVER IN PERSON|REG AIR|e ironic requests. fluffily iro +36963|1894|38|1|44|79019.16|0.02|0.07|N|O|1997-04-29|1997-05-02|1997-05-16|COLLECT COD|RAIL| pending packages. special t +36963|632|26|2|39|59772.57|0.01|0.05|N|O|1997-03-21|1997-05-02|1997-04-07|COLLECT COD|REG AIR| sly deposits across the fur +36963|399|84|3|10|12993.90|0.08|0.00|N|O|1997-03-22|1997-04-21|1997-03-26|COLLECT COD|MAIL|gular theod +36964|829|96|1|35|60543.70|0.09|0.03|N|O|1998-05-15|1998-05-27|1998-06-10|COLLECT COD|REG AIR|ickly pending accounts cajole carefully +36964|1748|75|2|3|4949.22|0.06|0.07|N|O|1998-06-15|1998-05-09|1998-06-25|TAKE BACK RETURN|RAIL|. quickly ironic deposits at +36964|315|100|3|18|21875.58|0.01|0.03|N|O|1998-05-13|1998-05-18|1998-06-07|COLLECT COD|SHIP|telets lose. furiously silent plate +36964|1190|91|4|30|32735.70|0.10|0.07|N|O|1998-05-08|1998-05-06|1998-06-05|COLLECT COD|FOB|ly above th +36964|1997|42|5|21|39878.79|0.04|0.06|N|O|1998-05-20|1998-05-30|1998-06-17|DELIVER IN PERSON|AIR| theodolites are quickly. +36964|1986|19|6|42|79295.16|0.10|0.08|N|O|1998-03-13|1998-04-18|1998-03-28|TAKE BACK RETURN|SHIP| packages are about the fu +36964|1179|88|7|29|31324.93|0.03|0.02|N|O|1998-05-28|1998-04-16|1998-06-05|TAKE BACK RETURN|SHIP|al packages. unusual, unusual esc +36965|1159|96|1|37|39225.55|0.10|0.05|A|F|1994-06-08|1994-07-13|1994-06-28|COLLECT COD|MAIL|press, ironic ideas. bold cou +36965|953|56|2|27|50056.65|0.08|0.06|R|F|1994-07-11|1994-07-01|1994-07-13|TAKE BACK RETURN|FOB|fily special dep +36966|1324|63|1|33|40435.56|0.05|0.03|R|F|1995-04-26|1995-04-19|1995-05-17|TAKE BACK RETURN|MAIL|s. furiously special deposits wake. ev +36966|1882|26|2|44|78490.72|0.02|0.00|A|F|1995-06-01|1995-06-13|1995-06-11|COLLECT COD|SHIP|unusual dolphins! slyly final f +36966|510|11|3|13|18336.63|0.00|0.01|R|F|1995-05-25|1995-05-12|1995-06-03|COLLECT COD|AIR|s wake fluffily pla +36967|898|98|1|17|30581.13|0.04|0.03|N|O|1997-03-09|1997-02-20|1997-03-12|NONE|FOB|deposits cajole above the b +36967|1347|24|2|42|52430.28|0.02|0.01|N|O|1997-04-05|1997-02-28|1997-04-10|TAKE BACK RETURN|TRUCK|e furiously. +36967|280|81|3|40|47211.20|0.08|0.00|N|O|1997-03-17|1997-03-03|1997-04-05|NONE|AIR|efully special req +36992|1648|90|1|33|51138.12|0.09|0.08|A|F|1994-12-28|1995-01-16|1995-01-26|NONE|REG AIR|uickly sly +36992|999|68|2|2|3799.98|0.04|0.00|A|F|1995-02-05|1995-03-03|1995-02-23|NONE|REG AIR|latelets. evenly express dugou +36992|567|68|3|23|33753.88|0.02|0.04|A|F|1995-02-14|1995-02-06|1995-02-25|NONE|FOB|capades integrate furiously. slow request +36992|1267|42|4|11|12850.86|0.06|0.04|R|F|1995-01-21|1995-01-29|1995-02-07|DELIVER IN PERSON|FOB|lly pending asymptotes sleep fluffily un +36992|1418|97|5|34|44859.94|0.08|0.03|A|F|1995-02-12|1995-02-11|1995-02-27|DELIVER IN PERSON|AIR|furiously. iron +36992|819|86|6|8|13758.48|0.03|0.07|A|F|1995-04-08|1995-02-16|1995-04-29|COLLECT COD|MAIL|furiously slyly re +36992|1031|32|7|47|43805.41|0.08|0.07|A|F|1995-03-03|1995-02-01|1995-03-09|DELIVER IN PERSON|MAIL|arefully express accounts. foxes haggle f +36993|1680|4|1|20|31633.60|0.10|0.08|N|O|1996-03-22|1996-03-04|1996-04-06|TAKE BACK RETURN|RAIL|y ironic deposits insi +36993|1524|25|2|20|28510.40|0.07|0.05|N|O|1996-02-09|1996-02-13|1996-02-21|DELIVER IN PERSON|FOB|dle blithely. fluffily pending accounts +36993|83|59|3|35|34407.80|0.07|0.07|N|O|1996-04-21|1996-03-29|1996-04-24|TAKE BACK RETURN|FOB|uctions use along the quickly even depend +36994|1988|33|1|2|3779.96|0.05|0.07|N|O|1995-08-23|1995-08-01|1995-09-09|DELIVER IN PERSON|FOB|er quickly regular accounts. carefully sil +36994|128|81|2|44|45237.28|0.10|0.06|N|O|1995-07-28|1995-08-11|1995-08-11|DELIVER IN PERSON|AIR|ide the fluffily even theodolites wake +36994|1083|54|3|12|11808.96|0.00|0.05|N|O|1995-09-21|1995-07-29|1995-10-14|DELIVER IN PERSON|MAIL|arefully busy dependencies +36994|1262|63|4|46|53509.96|0.08|0.01|N|O|1995-07-11|1995-07-26|1995-07-31|TAKE BACK RETURN|FOB| nag carefully +36994|1950|39|5|44|81485.80|0.02|0.08|N|O|1995-06-29|1995-08-29|1995-07-26|TAKE BACK RETURN|MAIL|kly regular accounts +36994|1281|82|6|14|16551.92|0.08|0.05|N|O|1995-08-13|1995-08-30|1995-09-02|TAKE BACK RETURN|RAIL|ages cajole. caref +36994|1400|39|7|36|46850.40|0.08|0.02|N|O|1995-08-08|1995-07-28|1995-08-29|TAKE BACK RETURN|AIR|ely regular platelets across the furiously +36995|552|43|1|50|72627.50|0.05|0.05|R|F|1994-03-31|1994-01-26|1994-04-28|COLLECT COD|MAIL|carefully after the braids. silent i +36995|825|25|2|5|8629.10|0.06|0.04|R|F|1994-01-18|1994-03-07|1994-02-01|DELIVER IN PERSON|FOB| slyly alongside of the furiously b +36996|1160|97|1|9|9550.44|0.07|0.01|N|O|1996-01-09|1995-11-28|1996-01-21|DELIVER IN PERSON|SHIP|ackages. ir +36997|949|52|1|50|92497.00|0.07|0.03|R|F|1994-02-09|1994-02-12|1994-02-24|COLLECT COD|AIR|nding sheaves sleep alongsi +36997|1482|100|2|16|22135.68|0.03|0.06|A|F|1994-03-07|1994-03-03|1994-03-28|COLLECT COD|RAIL|uriously bold depo +36998|350|79|1|47|58766.45|0.10|0.06|A|F|1993-01-18|1992-12-20|1993-02-13|COLLECT COD|TRUCK|tructions wake furiously blithely speci +36998|40|91|2|37|34781.48|0.04|0.01|R|F|1992-12-29|1992-11-06|1993-01-25|COLLECT COD|RAIL|riously bold dependencies wa +36998|1193|94|3|30|32825.70|0.02|0.04|A|F|1992-12-22|1992-12-24|1993-01-15|TAKE BACK RETURN|MAIL|y special dinos. packages +36998|243|71|4|13|14862.12|0.07|0.07|R|F|1993-01-24|1992-12-01|1993-02-04|COLLECT COD|MAIL|ss requests bo +36999|68|69|1|13|12584.78|0.03|0.07|R|F|1994-12-22|1995-02-08|1995-01-07|TAKE BACK RETURN|FOB|ts print fluffily bold, regul +36999|969|38|2|46|86018.16|0.00|0.05|A|F|1994-12-21|1995-03-07|1994-12-28|NONE|MAIL|he slyly special accounts. regular, +36999|1859|46|3|32|56347.20|0.06|0.02|R|F|1995-03-18|1995-01-13|1995-04-13|NONE|FOB| across the even sheaves wake bl +36999|394|95|4|37|47892.43|0.03|0.03|R|F|1995-02-20|1995-03-08|1995-03-16|COLLECT COD|REG AIR|ongside of the slyly e +37024|1749|34|1|25|41268.50|0.00|0.01|A|F|1992-08-27|1992-10-02|1992-09-17|COLLECT COD|TRUCK|latelets. carefully even packages +37024|1587|28|2|41|61031.78|0.03|0.08|A|F|1992-10-13|1992-08-18|1992-11-01|COLLECT COD|REG AIR|its sleep furiously gifts. r +37024|1440|19|3|8|10731.52|0.06|0.01|A|F|1992-09-24|1992-09-08|1992-10-14|TAKE BACK RETURN|RAIL|ng packages play fluffily quickly silent +37024|211|39|4|43|47782.03|0.02|0.06|A|F|1992-07-31|1992-08-17|1992-08-15|TAKE BACK RETURN|AIR|e silent requests affix among the slyly unu +37025|1288|100|1|20|23785.60|0.05|0.00|A|F|1995-01-25|1995-02-05|1995-02-23|COLLECT COD|TRUCK| requests. final, regula +37025|1982|27|2|23|43331.54|0.05|0.02|A|F|1994-12-06|1995-01-13|1994-12-26|TAKE BACK RETURN|MAIL|g, regular dolph +37025|973|76|3|23|43101.31|0.03|0.07|A|F|1995-01-20|1995-01-31|1995-01-26|NONE|RAIL|ccounts use. bold platelets are furiou +37025|423|82|4|27|35732.34|0.01|0.00|A|F|1994-11-28|1995-02-08|1994-12-08|NONE|REG AIR|s. slyly express courts nod slyly. +37025|1448|27|5|22|29687.68|0.00|0.02|R|F|1994-11-23|1995-01-18|1994-12-10|NONE|RAIL|theodolites wake closely. fur +37025|894|61|6|45|80770.05|0.05|0.01|A|F|1995-02-22|1995-01-17|1995-03-10|TAKE BACK RETURN|TRUCK|s. furiously sp +37025|1495|74|7|49|68428.01|0.10|0.03|A|F|1994-11-22|1994-12-31|1994-12-15|COLLECT COD|REG AIR|iously unusu +37026|1099|35|1|42|42003.78|0.06|0.01|N|O|1997-05-17|1997-05-12|1997-05-20|COLLECT COD|REG AIR|- deposits about t +37026|118|97|2|2|2036.22|0.06|0.06|N|O|1997-06-24|1997-06-17|1997-06-28|COLLECT COD|SHIP|ithely on the regular foxes. +37026|717|18|3|7|11323.97|0.09|0.02|N|O|1997-04-23|1997-05-18|1997-05-20|COLLECT COD|TRUCK| haggle fluf +37026|2|28|4|46|41492.00|0.03|0.00|N|O|1997-06-11|1997-05-13|1997-06-19|COLLECT COD|AIR|low requests print silently accounts. some +37026|751|16|5|42|69373.50|0.07|0.01|N|O|1997-05-18|1997-05-13|1997-05-20|TAKE BACK RETURN|REG AIR|l theodolites cajole furious +37026|1634|58|6|2|3071.26|0.05|0.03|N|O|1997-04-12|1997-06-14|1997-04-18|DELIVER IN PERSON|FOB|y even courts use against +37027|317|18|1|8|9738.48|0.10|0.01|N|O|1998-03-08|1998-05-27|1998-03-09|TAKE BACK RETURN|TRUCK|ial foxes-- ironic, special escapades +37027|287|15|2|24|28494.72|0.06|0.05|N|O|1998-04-17|1998-04-22|1998-05-17|NONE|REG AIR|unusual deposits affix +37027|1624|7|3|11|16781.82|0.10|0.03|N|O|1998-05-30|1998-04-18|1998-06-27|TAKE BACK RETURN|REG AIR|ending platelets. regular +37027|311|12|4|4|4845.24|0.08|0.04|N|O|1998-03-22|1998-04-14|1998-04-07|COLLECT COD|AIR|ge above the bold pa +37027|887|87|5|44|78666.72|0.09|0.07|N|O|1998-03-25|1998-04-28|1998-04-02|DELIVER IN PERSON|FOB|uickly unusual foxes across the evenl +37027|398|99|6|44|57129.16|0.07|0.07|N|O|1998-05-13|1998-04-06|1998-05-23|TAKE BACK RETURN|SHIP|lly regular p +37028|567|98|1|10|14675.60|0.10|0.06|N|O|1998-07-19|1998-06-26|1998-07-28|DELIVER IN PERSON|SHIP|mpress furiously. reg +37028|1083|54|2|19|18697.52|0.05|0.01|N|O|1998-08-21|1998-07-17|1998-08-27|TAKE BACK RETURN|SHIP|ironic asymptotes after the sly +37028|230|58|3|6|6781.38|0.05|0.07|N|O|1998-06-03|1998-08-02|1998-06-24|DELIVER IN PERSON|REG AIR|. carefully ironic +37029|370|71|1|40|50814.80|0.01|0.00|N|O|1997-11-18|1997-11-26|1997-12-09|NONE|AIR|e quickly pending instructions. ac +37029|1161|70|2|46|48859.36|0.02|0.07|N|O|1997-09-28|1997-12-09|1997-10-05|TAKE BACK RETURN|SHIP|hely bold excuses integrat +37029|501|2|3|37|51855.50|0.01|0.00|N|O|1997-12-06|1997-11-06|1997-12-25|COLLECT COD|MAIL|y ironic accounts against the ir +37030|1048|19|1|3|2847.12|0.10|0.08|N|O|1995-10-10|1995-10-12|1995-11-04|COLLECT COD|MAIL|ckly close pac +37031|1851|95|1|7|12269.95|0.08|0.07|N|O|1995-09-04|1995-10-12|1995-09-14|TAKE BACK RETURN|RAIL|uickly even foxes above the cl +37031|1283|95|2|32|37896.96|0.01|0.06|N|O|1995-08-19|1995-10-16|1995-09-12|NONE|TRUCK|rding to the bl +37056|1820|7|1|47|80925.54|0.06|0.02|A|F|1993-10-15|1993-09-23|1993-10-31|DELIVER IN PERSON|RAIL|arefully pending requests whithout the reg +37056|116|17|2|30|30483.30|0.06|0.02|R|F|1993-11-05|1993-10-23|1993-11-19|NONE|SHIP|encies amon +37056|1923|68|3|1|1824.92|0.07|0.04|R|F|1993-11-20|1993-10-24|1993-12-01|TAKE BACK RETURN|REG AIR|usly. unusual, express id +37057|58|9|1|41|39280.05|0.06|0.00|N|O|1998-01-23|1998-04-10|1998-02-22|COLLECT COD|SHIP|cuses sleep +37057|940|75|2|18|33136.92|0.04|0.04|N|O|1998-04-17|1998-02-24|1998-05-06|DELIVER IN PERSON|REG AIR|final requests doubt carefully deposits. c +37057|1427|6|3|46|61107.32|0.05|0.01|N|O|1998-03-20|1998-03-16|1998-03-24|DELIVER IN PERSON|FOB|ly bold reque +37057|1576|57|4|16|23641.12|0.03|0.00|N|O|1998-04-30|1998-03-26|1998-05-25|TAKE BACK RETURN|MAIL|ly even foxes. even theodol +37057|439|40|5|47|62953.21|0.09|0.02|N|O|1998-03-06|1998-04-05|1998-03-17|NONE|AIR|e pinto bean +37057|85|86|6|35|34477.80|0.08|0.03|N|O|1998-05-01|1998-03-30|1998-05-17|TAKE BACK RETURN|TRUCK|theodolites wake carefully around the +37058|64|65|1|48|46274.88|0.09|0.02|N|O|1996-04-16|1996-03-04|1996-04-30|DELIVER IN PERSON|FOB|nic theodolites play carefully +37058|481|11|2|6|8288.88|0.00|0.01|N|O|1996-05-15|1996-04-06|1996-05-27|DELIVER IN PERSON|REG AIR|. quickly even accounts boost. regular, +37058|263|91|3|28|32571.28|0.06|0.06|N|O|1996-04-28|1996-03-15|1996-05-28|COLLECT COD|REG AIR| lose blithely. sly +37058|945|46|4|21|38764.74|0.05|0.08|N|O|1996-06-01|1996-04-17|1996-06-11|NONE|REG AIR|heodolites boost furiously expr +37058|470|71|5|5|6852.35|0.10|0.01|N|O|1996-03-06|1996-04-14|1996-03-25|DELIVER IN PERSON|MAIL|t accounts. slyly bold dep +37059|630|93|1|14|21428.82|0.09|0.05|N|O|1998-02-08|1998-03-09|1998-02-28|DELIVER IN PERSON|REG AIR|ular packages haggle slyly. +37059|651|52|2|39|60514.35|0.00|0.08|N|O|1997-12-28|1998-01-14|1998-01-14|TAKE BACK RETURN|MAIL|frays sleep. slyly silent accounts are bli +37059|1237|49|3|50|56911.50|0.09|0.04|N|O|1998-02-05|1998-01-23|1998-03-01|DELIVER IN PERSON|REG AIR|fily close accoun +37060|862|96|1|38|66988.68|0.01|0.02|N|O|1996-06-22|1996-05-14|1996-06-29|COLLECT COD|REG AIR|uriously b +37060|672|4|2|20|31453.40|0.06|0.06|N|O|1996-03-25|1996-06-03|1996-04-23|COLLECT COD|TRUCK|ously unusual accounts boost slyly ab +37060|416|46|3|44|57922.04|0.01|0.05|N|O|1996-04-26|1996-04-15|1996-05-17|DELIVER IN PERSON|AIR| packages. pending foxes boost b +37060|45|46|4|1|945.04|0.00|0.06|N|O|1996-06-04|1996-05-12|1996-07-03|DELIVER IN PERSON|TRUCK|riously special tithes. ideas cajole. blit +37060|848|82|5|21|36725.64|0.08|0.04|N|O|1996-06-25|1996-06-04|1996-07-08|NONE|REG AIR|e even the +37060|326|55|6|46|56410.72|0.04|0.00|N|O|1996-07-07|1996-05-14|1996-07-21|TAKE BACK RETURN|TRUCK|packages. doggedly pending ideas about the +37060|486|87|7|9|12478.32|0.02|0.08|N|O|1996-04-17|1996-06-09|1996-05-09|COLLECT COD|REG AIR|eas. blithely brave depths boo +37061|362|63|1|39|49232.04|0.02|0.01|N|O|1996-08-01|1996-09-16|1996-08-24|TAKE BACK RETURN|REG AIR|ackages sleep at the blithely unus +37061|473|61|2|4|5493.88|0.09|0.07|N|O|1996-07-18|1996-09-15|1996-08-10|TAKE BACK RETURN|SHIP|es affix finally alongside o +37061|1972|61|3|42|78706.74|0.03|0.01|N|O|1996-10-15|1996-08-26|1996-10-31|NONE|AIR|y furiously ironic instructions. sly +37061|1719|20|4|31|50242.01|0.03|0.00|N|O|1996-09-11|1996-09-03|1996-09-28|DELIVER IN PERSON|FOB|ges cajole furiously alongside of +37061|856|56|5|19|33380.15|0.10|0.02|N|O|1996-10-10|1996-07-21|1996-10-26|COLLECT COD|REG AIR|above the final, bold pin +37061|703|36|6|47|75373.90|0.10|0.03|N|O|1996-09-15|1996-07-22|1996-10-04|NONE|MAIL|nding excuses. pending Ti +37062|222|77|1|40|44888.80|0.05|0.02|A|F|1994-01-19|1994-02-01|1994-01-25|DELIVER IN PERSON|RAIL|aggle carefu +37062|353|82|2|42|52640.70|0.08|0.02|A|F|1994-02-26|1994-02-03|1994-03-15|TAKE BACK RETURN|AIR|ing, special requests sleep never arou +37063|1310|87|1|6|7267.86|0.00|0.05|A|F|1993-01-03|1993-03-10|1993-01-09|COLLECT COD|TRUCK| accounts: sil +37063|1033|34|2|7|6538.21|0.10|0.06|R|F|1993-02-20|1993-02-13|1993-02-26|TAKE BACK RETURN|REG AIR|lyly even id +37063|272|100|3|12|14067.24|0.06|0.02|R|F|1993-03-24|1993-01-15|1993-04-05|DELIVER IN PERSON|REG AIR|gainst the final, ironic deposits. caref +37063|1162|71|4|9|9568.44|0.10|0.02|R|F|1993-01-16|1993-01-21|1993-02-06|NONE|SHIP|ests according to +37063|794|59|5|23|38980.17|0.08|0.01|A|F|1992-12-20|1993-02-28|1992-12-23|COLLECT COD|RAIL|ly ironic platelets. fluffil +37088|1861|48|1|36|63462.96|0.05|0.05|N|O|1997-12-18|1997-11-15|1997-12-31|COLLECT COD|RAIL|deposits use fluffily accordin +37088|1589|10|2|25|37264.50|0.09|0.07|N|O|1997-11-27|1997-11-11|1997-12-01|DELIVER IN PERSON|REG AIR|ses detect slyly alon +37088|426|14|3|9|11937.78|0.05|0.06|N|O|1997-12-09|1997-11-27|1997-12-29|DELIVER IN PERSON|SHIP|g the boldl +37088|2000|33|4|18|16236.00|0.02|0.00|N|O|1997-11-23|1997-10-21|1997-12-13|DELIVER IN PERSON|FOB|sits. blithe +37089|1694|95|1|6|9574.14|0.04|0.06|N|O|1997-08-24|1997-06-30|1997-09-03|NONE|FOB|are. speci +37089|737|38|2|34|55682.82|0.01|0.08|N|O|1997-08-27|1997-06-14|1997-09-05|COLLECT COD|FOB|der slyly slyly ironic fo +37090|1420|60|1|34|44928.28|0.06|0.01|N|O|1998-04-12|1998-06-12|1998-04-22|NONE|TRUCK|o beans haggle carefully. pending pinto b +37091|28|54|1|18|16704.36|0.08|0.02|R|F|1994-02-01|1994-01-21|1994-02-03|NONE|AIR|e special, expr +37091|754|51|2|28|46333.00|0.09|0.01|R|F|1994-01-12|1993-12-31|1994-01-21|DELIVER IN PERSON|REG AIR|ackages. carefu +37091|1827|28|3|43|74339.26|0.09|0.03|R|F|1994-02-20|1994-02-24|1994-03-12|TAKE BACK RETURN|MAIL|lyly final +37092|625|26|1|50|76281.00|0.10|0.01|N|O|1996-10-20|1996-10-01|1996-10-29|DELIVER IN PERSON|RAIL| furiously. sly requests +37092|717|18|2|25|40442.75|0.04|0.06|N|O|1996-10-03|1996-09-26|1996-10-13|COLLECT COD|REG AIR| realms; furiously si +37092|1055|91|3|42|40154.10|0.00|0.00|N|O|1996-09-12|1996-09-19|1996-09-15|COLLECT COD|MAIL|idly carefully ironic deposits. s +37092|530|21|4|13|18596.89|0.01|0.08|N|O|1996-11-14|1996-09-16|1996-11-21|DELIVER IN PERSON|RAIL|slyly regular multipliers. even a +37092|1218|19|5|26|29099.46|0.08|0.03|N|O|1996-09-18|1996-09-09|1996-10-11|DELIVER IN PERSON|MAIL|s. pending, iro +37092|172|51|6|6|6433.02|0.10|0.04|N|O|1996-09-02|1996-10-29|1996-09-20|TAKE BACK RETURN|MAIL| carefully unusual +37093|866|100|1|43|75974.98|0.10|0.08|A|F|1994-02-17|1994-01-22|1994-02-24|COLLECT COD|TRUCK|ests wake quickly carefully final +37093|536|27|2|13|18674.89|0.00|0.02|A|F|1994-03-25|1994-02-15|1994-04-22|DELIVER IN PERSON|RAIL| pending deposits at the unu +37094|851|18|1|5|8759.25|0.09|0.01|N|O|1997-06-06|1997-04-20|1997-06-27|DELIVER IN PERSON|FOB| pains sleep patterns. furiously final f +37094|1216|91|2|5|5586.05|0.06|0.06|N|O|1997-06-13|1997-05-06|1997-07-09|TAKE BACK RETURN|TRUCK|uickly express asymp +37094|1530|31|3|12|17178.36|0.08|0.05|N|O|1997-03-29|1997-04-05|1997-04-25|COLLECT COD|MAIL|arefully according to the finally +37094|222|77|4|43|48255.46|0.01|0.02|N|O|1997-04-22|1997-04-18|1997-05-16|DELIVER IN PERSON|FOB| integrate. carefully final dependencie +37095|1447|87|1|46|62028.24|0.04|0.05|R|F|1994-04-30|1994-05-17|1994-05-12|TAKE BACK RETURN|SHIP|he dugouts. carefully unusual deposits hagg +37095|889|90|2|4|7159.52|0.01|0.06|R|F|1994-03-20|1994-04-30|1994-03-23|DELIVER IN PERSON|RAIL|g: deposits use against +37095|924|59|3|20|36498.40|0.10|0.08|A|F|1994-06-15|1994-05-19|1994-07-02|TAKE BACK RETURN|RAIL|egular ideas are carefully final di +37095|1412|52|4|46|60416.86|0.08|0.07|A|F|1994-04-30|1994-04-28|1994-05-26|COLLECT COD|FOB|heodolites cajole across +37095|1432|72|5|12|16001.16|0.04|0.03|R|F|1994-05-12|1994-05-19|1994-05-20|NONE|FOB|ecial requests sleep blithel +37095|1050|86|6|43|40895.15|0.00|0.03|A|F|1994-06-08|1994-05-22|1994-06-18|DELIVER IN PERSON|MAIL|ackages eat slyly. f +37095|776|77|7|48|80484.96|0.00|0.04|R|F|1994-04-23|1994-06-02|1994-05-13|NONE|REG AIR|tions. carefully regular ideas sleep +37120|491|92|1|17|23655.33|0.04|0.07|N|O|1996-10-02|1996-09-14|1996-10-12|TAKE BACK RETURN|MAIL| special courts. bold foxes use regular r +37120|1347|86|2|37|46188.58|0.09|0.00|N|O|1996-07-21|1996-08-19|1996-08-02|DELIVER IN PERSON|MAIL|er furiously slyly quiet +37120|791|88|3|36|60904.44|0.05|0.06|N|O|1996-10-06|1996-08-13|1996-10-21|NONE|REG AIR|egular theodolites cajole doggedly final +37120|1309|24|4|5|6051.50|0.01|0.08|N|O|1996-07-05|1996-09-05|1996-07-08|COLLECT COD|RAIL| quickly bold requests. foxes cajo +37120|109|88|5|38|38345.80|0.04|0.01|N|O|1996-09-25|1996-07-31|1996-10-05|DELIVER IN PERSON|SHIP|r pinto beans wake fluf +37121|684|47|1|11|17431.48|0.08|0.07|N|O|1995-06-24|1995-04-29|1995-06-26|NONE|FOB| boost slyly. fluffily ironic a +37122|257|39|1|9|10415.25|0.10|0.02|N|O|1996-07-05|1996-08-27|1996-08-01|TAKE BACK RETURN|MAIL|lphins. furiously final theodolit +37122|413|14|2|12|15760.92|0.03|0.01|N|O|1996-08-27|1996-08-14|1996-08-30|NONE|REG AIR| beans. theodolites are through the sl +37123|590|51|1|39|58133.01|0.06|0.00|R|F|1992-04-09|1992-05-08|1992-04-29|COLLECT COD|TRUCK|sits breach across the p +37123|1099|70|2|20|20001.80|0.00|0.07|A|F|1992-03-06|1992-03-27|1992-03-07|DELIVER IN PERSON|REG AIR| are blithely blithely express forges. +37123|2|28|3|45|40590.00|0.03|0.01|A|F|1992-03-17|1992-04-03|1992-04-05|DELIVER IN PERSON|TRUCK|sits boost quickly accordi +37123|982|17|4|2|3765.96|0.10|0.04|R|F|1992-05-12|1992-05-11|1992-05-25|NONE|FOB|ing deposits against the blithe +37123|1340|41|5|4|4965.36|0.08|0.04|R|F|1992-06-13|1992-04-16|1992-07-08|NONE|AIR|efully even theodolites +37123|1057|58|6|8|7664.40|0.04|0.06|A|F|1992-06-16|1992-04-09|1992-06-24|DELIVER IN PERSON|MAIL|posits haggle. +37124|399|56|1|11|14293.29|0.10|0.01|A|F|1992-05-09|1992-05-14|1992-05-13|NONE|AIR|l forges maintain quickly against +37124|476|64|2|32|44047.04|0.10|0.00|R|F|1992-07-23|1992-06-16|1992-08-07|NONE|REG AIR|s. even, even pinto beans a +37124|129|8|3|14|14407.68|0.03|0.00|R|F|1992-06-17|1992-05-19|1992-07-07|COLLECT COD|MAIL|egular deposi +37124|170|49|4|14|14982.38|0.06|0.00|A|F|1992-07-22|1992-06-08|1992-08-03|NONE|AIR|use excuses. unusual, fin +37124|1363|64|5|18|22758.48|0.02|0.03|R|F|1992-05-13|1992-05-14|1992-05-20|COLLECT COD|MAIL|tes cajole carefully towar +37124|1374|75|6|15|19130.55|0.08|0.00|A|F|1992-07-12|1992-06-08|1992-08-03|NONE|RAIL| express accounts: quickly regula +37125|117|44|1|7|7119.77|0.00|0.02|R|F|1993-04-24|1993-02-18|1993-05-19|DELIVER IN PERSON|TRUCK|lly ironic asymptotes sleep furiously. re +37125|1995|84|2|26|49321.74|0.08|0.08|A|F|1993-03-20|1993-03-04|1993-04-10|NONE|FOB|special ideas +37125|1369|84|3|25|31759.00|0.09|0.05|R|F|1993-04-18|1993-04-11|1993-05-03|DELIVER IN PERSON|FOB|osits wake. quickly ironic p +37125|281|63|4|22|25988.16|0.01|0.03|A|F|1993-04-20|1993-04-08|1993-05-07|DELIVER IN PERSON|FOB|sly ironic +37126|1397|36|1|24|31161.36|0.07|0.05|N|O|1998-08-24|1998-08-11|1998-09-04|NONE|REG AIR|ost quickly. deposits nod bl +37126|1879|66|2|19|33836.53|0.06|0.00|N|O|1998-08-19|1998-08-30|1998-09-05|DELIVER IN PERSON|MAIL|sits-- eve +37126|170|23|3|30|32105.10|0.05|0.01|N|O|1998-10-11|1998-08-26|1998-11-03|NONE|REG AIR| packages alongsid +37126|1491|31|4|20|27849.80|0.08|0.03|N|O|1998-08-01|1998-09-12|1998-08-05|NONE|MAIL|ackages. fluffily ironi +37126|140|93|5|50|52007.00|0.04|0.07|N|O|1998-10-09|1998-09-19|1998-10-27|NONE|REG AIR|l courts use. slyly final ideas boost. +37127|370|27|1|33|41922.21|0.06|0.06|R|F|1993-10-30|1993-12-28|1993-11-21|COLLECT COD|TRUCK|ns cajole. carefully special +37127|6|32|2|35|31710.00|0.06|0.04|A|F|1993-10-20|1993-12-17|1993-11-16|COLLECT COD|SHIP| to the ideas; ironic, regular acc +37127|1517|58|3|27|38299.77|0.06|0.07|A|F|1993-11-14|1993-11-14|1993-12-02|DELIVER IN PERSON|TRUCK|usly. carefu +37127|1370|85|4|48|61025.76|0.05|0.01|A|F|1993-10-25|1993-12-22|1993-11-17|TAKE BACK RETURN|RAIL|, ironic pinto beans amon +37127|320|77|5|1|1220.32|0.07|0.00|A|F|1994-02-01|1993-11-03|1994-02-18|COLLECT COD|TRUCK|xes haggle slyly against +37127|322|51|6|31|37891.92|0.04|0.00|A|F|1993-11-02|1993-12-18|1993-11-14|COLLECT COD|FOB|ffily foxes. furiously special +37127|1625|8|7|49|74804.38|0.07|0.03|R|F|1993-12-06|1993-11-23|1993-12-12|COLLECT COD|REG AIR|against the ideas are furio +37152|1035|6|1|45|42121.35|0.06|0.03|A|F|1995-05-26|1995-07-10|1995-06-01|DELIVER IN PERSON|SHIP| boost carefully across the carefully qu +37152|1632|15|2|19|29138.97|0.06|0.04|N|O|1995-09-09|1995-06-28|1995-09-23|TAKE BACK RETURN|SHIP|he carefully silent escapades. furiou +37152|753|18|3|39|64496.25|0.01|0.08|N|O|1995-08-26|1995-08-11|1995-09-04|TAKE BACK RETURN|FOB|y. quickly ironic pinto beans w +37153|653|54|1|32|49716.80|0.01|0.03|N|O|1996-08-30|1996-08-18|1996-09-09|TAKE BACK RETURN|TRUCK| fluffily final deposits. carefu +37153|1979|68|2|45|84643.65|0.05|0.05|N|O|1996-11-08|1996-09-09|1996-11-10|TAKE BACK RETURN|TRUCK|ests are carefully theodolites. regular +37153|638|39|3|14|21540.82|0.04|0.08|N|O|1996-09-05|1996-08-29|1996-10-04|NONE|TRUCK|oss the blithely final request +37153|875|75|4|25|44396.75|0.09|0.02|N|O|1996-08-05|1996-09-26|1996-08-23|DELIVER IN PERSON|MAIL|ial, ironic packages +37154|815|16|1|14|24021.34|0.01|0.01|N|O|1996-06-08|1996-07-06|1996-06-16|NONE|TRUCK|ve the furiously f +37155|1163|64|1|35|37245.60|0.09|0.08|N|O|1997-04-20|1997-06-12|1997-05-06|COLLECT COD|REG AIR|ly along the evenly regular pains. flu +37155|1328|67|2|18|22127.76|0.03|0.08|N|O|1997-06-22|1997-06-11|1997-06-28|COLLECT COD|RAIL|eodolites. furiously bold theodolit +37156|1737|64|1|3|4916.19|0.05|0.05|A|F|1992-12-09|1992-11-19|1993-01-04|COLLECT COD|AIR|ns about the unusual accoun +37156|1067|68|2|25|24201.50|0.00|0.07|R|F|1992-11-22|1992-12-11|1992-11-30|NONE|AIR|of the express reques +37157|215|97|1|38|42377.98|0.01|0.03|R|F|1993-05-20|1993-04-05|1993-05-21|NONE|MAIL|snooze never against th +37157|1759|60|2|27|44840.25|0.06|0.08|A|F|1993-04-12|1993-04-10|1993-05-06|DELIVER IN PERSON|SHIP|inal requests affix quickly! regular f +37157|191|92|3|48|52377.12|0.06|0.08|R|F|1993-06-16|1993-03-29|1993-07-14|COLLECT COD|FOB|slyly ironic packages sleep around t +37157|790|91|4|6|10144.74|0.05|0.02|R|F|1993-05-19|1993-03-28|1993-05-31|COLLECT COD|TRUCK|uthlessly ironic account +37158|385|14|1|20|25707.60|0.03|0.01|A|F|1993-01-16|1992-12-12|1993-02-02|NONE|TRUCK|s nod furiously according to the instructi +37158|1085|56|2|24|23665.92|0.02|0.04|A|F|1992-12-24|1992-11-13|1993-01-02|TAKE BACK RETURN|AIR|s-- bold dep +37158|1853|40|3|43|75458.55|0.09|0.06|A|F|1992-10-17|1992-12-16|1992-11-02|COLLECT COD|AIR|t, regular theodolites. blithely bold d +37158|419|20|4|50|65970.50|0.09|0.03|R|F|1992-10-18|1992-11-19|1992-11-09|DELIVER IN PERSON|RAIL|requests use carefully about the sly +37158|98|74|5|6|5988.54|0.00|0.02|A|F|1992-11-25|1992-12-01|1992-12-18|DELIVER IN PERSON|SHIP|sly blithely regular multipliers. ironic r +37158|87|13|6|50|49354.00|0.00|0.03|R|F|1992-12-06|1992-11-18|1992-12-29|NONE|REG AIR|onic foxes wake. slyly furious i +37159|1991|80|1|32|60575.68|0.05|0.07|A|F|1993-05-11|1993-06-11|1993-05-31|DELIVER IN PERSON|RAIL|y unusual instructions slee +37159|556|17|2|23|33500.65|0.10|0.04|R|F|1993-08-10|1993-07-08|1993-08-30|DELIVER IN PERSON|RAIL|nusual asympt +37159|139|40|3|23|23899.99|0.10|0.08|A|F|1993-05-03|1993-06-03|1993-05-18|TAKE BACK RETURN|REG AIR|uests above the slyly even dugouts b +37159|286|87|4|7|8303.96|0.10|0.05|R|F|1993-07-30|1993-07-26|1993-08-04|COLLECT COD|SHIP|lar requests sleep carefully ca +37159|1804|5|5|44|75055.20|0.09|0.01|A|F|1993-05-08|1993-06-17|1993-05-18|TAKE BACK RETURN|MAIL|ly pending in +37159|1813|100|6|18|30866.58|0.05|0.04|A|F|1993-05-31|1993-06-22|1993-06-20|NONE|SHIP|ly ironic +37159|466|54|7|42|57391.32|0.01|0.04|R|F|1993-08-23|1993-07-09|1993-09-07|DELIVER IN PERSON|TRUCK|re carefully +37184|1432|33|1|2|2666.86|0.09|0.06|R|F|1995-05-01|1995-05-11|1995-05-10|TAKE BACK RETURN|TRUCK|al, unusual accounts are slyly amo +37184|823|57|2|19|32752.58|0.09|0.02|N|O|1995-06-24|1995-04-22|1995-07-16|NONE|REG AIR|e of the quietly unusual packages. carefu +37185|272|73|1|36|42201.72|0.07|0.07|R|F|1993-02-03|1992-12-12|1993-02-17|TAKE BACK RETURN|MAIL|lly unusual deposits. +37185|1938|39|2|37|68077.41|0.05|0.04|A|F|1992-11-13|1993-01-28|1992-11-22|TAKE BACK RETURN|AIR|ithely according to the fluffily bold reque +37185|1232|33|3|28|31730.44|0.00|0.04|R|F|1992-11-22|1992-12-05|1992-11-25|TAKE BACK RETURN|SHIP|furiously final theodolites. fu +37185|1997|42|4|15|28484.85|0.06|0.03|A|F|1992-11-05|1992-12-31|1992-11-27|NONE|FOB|ent packages dete +37185|912|47|5|43|77955.13|0.03|0.08|R|F|1993-01-29|1993-01-08|1993-02-13|TAKE BACK RETURN|REG AIR|furiously pe +37185|803|4|6|2|3407.60|0.08|0.03|A|F|1993-01-25|1992-12-31|1993-02-15|COLLECT COD|MAIL|s nag carefully even ideas. carefu +37186|272|54|1|5|5861.35|0.07|0.05|N|O|1996-07-27|1996-07-27|1996-08-04|COLLECT COD|RAIL| slyly. pinto beans wake blithely f +37186|127|54|2|48|49301.76|0.01|0.05|N|O|1996-09-07|1996-07-26|1996-09-26|NONE|MAIL|ss pearls. regular packages +37186|1968|13|3|26|48618.96|0.07|0.08|N|O|1996-08-18|1996-07-02|1996-08-21|NONE|REG AIR|are. final dolphins after the care +37186|1688|30|4|18|28614.24|0.06|0.06|N|O|1996-09-01|1996-07-20|1996-09-17|DELIVER IN PERSON|REG AIR|y final requests. quickly ironi +37187|25|1|1|50|46251.00|0.01|0.04|N|O|1995-09-21|1995-08-30|1995-09-24|NONE|RAIL|o beans haggle ruthles +37188|1110|19|1|42|42466.62|0.09|0.03|R|F|1992-04-05|1992-05-03|1992-04-17|COLLECT COD|AIR|sts above th +37188|542|43|2|19|27408.26|0.00|0.03|R|F|1992-04-23|1992-04-17|1992-05-05|COLLECT COD|FOB|sts. unusual accounts cajole about th +37188|717|14|3|44|71179.24|0.05|0.01|R|F|1992-03-06|1992-05-03|1992-03-13|TAKE BACK RETURN|TRUCK|uctions wake around the even, ironic pint +37189|1670|53|1|38|59723.46|0.03|0.06|A|F|1992-07-10|1992-08-17|1992-07-22|COLLECT COD|SHIP|bold ideas was above the even +37189|184|37|2|27|29272.86|0.05|0.06|R|F|1992-09-28|1992-08-07|1992-10-04|DELIVER IN PERSON|AIR|ld theodolites are f +37190|1960|49|1|44|81926.24|0.07|0.01|N|O|1996-10-24|1996-09-21|1996-11-21|COLLECT COD|SHIP|unts. furiously +37190|71|47|2|17|16508.19|0.00|0.03|N|O|1996-10-17|1996-09-03|1996-10-20|TAKE BACK RETURN|REG AIR|lent, special dependencies sleep +37190|1485|86|3|38|52686.24|0.08|0.01|N|O|1996-08-26|1996-08-26|1996-08-30|TAKE BACK RETURN|REG AIR|s wake around +37190|1520|61|4|23|32694.96|0.07|0.08|N|O|1996-09-02|1996-08-05|1996-09-11|TAKE BACK RETURN|REG AIR|lar packages nag. carefully +37191|1256|57|1|8|9258.00|0.10|0.08|R|F|1993-06-18|1993-04-28|1993-07-06|COLLECT COD|REG AIR|ut the ironically final instructio +37191|765|62|2|8|13326.08|0.07|0.08|R|F|1993-06-12|1993-06-11|1993-07-01|NONE|RAIL| express theodolites. fina +37191|1754|81|3|38|62918.50|0.08|0.02|R|F|1993-06-09|1993-05-19|1993-06-15|COLLECT COD|FOB|ggle slyly silen +37191|397|54|4|42|54490.38|0.03|0.00|A|F|1993-04-06|1993-04-12|1993-04-13|TAKE BACK RETURN|AIR|ccounts sleep carefully after the c +37216|1509|30|1|44|62062.00|0.00|0.07|A|F|1994-02-03|1994-02-16|1994-02-21|NONE|AIR| the slyly even requests. regular pin +37216|1987|76|2|28|52891.44|0.05|0.05|R|F|1994-01-15|1994-02-08|1994-01-29|COLLECT COD|REG AIR|gular requests dazzle +37216|954|57|3|40|74198.00|0.05|0.04|A|F|1994-01-24|1994-02-19|1994-02-15|DELIVER IN PERSON|SHIP|leep slyly. +37216|478|66|4|45|62031.15|0.00|0.07|A|F|1994-03-21|1994-01-15|1994-03-30|TAKE BACK RETURN|MAIL|eep bold packages. furiously unusual +37216|1454|94|5|23|31175.35|0.08|0.08|A|F|1993-12-28|1994-02-11|1994-01-19|TAKE BACK RETURN|REG AIR|ously pending instructions. carefully unusu +37216|1818|19|6|38|65352.78|0.05|0.07|A|F|1994-03-21|1994-02-14|1994-03-23|DELIVER IN PERSON|AIR|ng the carefully spec +37216|972|73|7|20|37459.40|0.03|0.08|R|F|1994-03-31|1994-01-28|1994-04-13|COLLECT COD|MAIL|deposits. furiously +37217|1866|53|1|27|47732.22|0.09|0.05|N|O|1997-12-02|1997-10-20|1997-12-19|DELIVER IN PERSON|AIR|egrate. blithel +37218|598|99|1|25|37464.75|0.04|0.03|R|F|1994-03-17|1994-02-28|1994-03-21|COLLECT COD|AIR|s haggle slyly carefully even pack +37218|5|6|2|36|32580.00|0.03|0.06|R|F|1994-01-03|1994-02-18|1994-01-11|DELIVER IN PERSON|FOB|d the express +37218|1389|66|3|4|5161.52|0.07|0.00|A|F|1993-12-31|1994-02-05|1994-01-18|DELIVER IN PERSON|SHIP|ound the furious +37218|1555|36|4|23|33500.65|0.02|0.03|R|F|1994-03-29|1994-01-23|1994-04-16|COLLECT COD|REG AIR| blithely ironic package +37219|1343|58|1|17|21153.78|0.02|0.04|N|O|1996-07-16|1996-06-07|1996-07-29|NONE|SHIP| above the furiousl +37219|1544|45|2|31|44811.74|0.04|0.05|N|O|1996-05-28|1996-06-07|1996-05-30|DELIVER IN PERSON|TRUCK|ross the blithely ironic theodolites. s +37219|1093|29|3|10|9940.90|0.04|0.06|N|O|1996-07-22|1996-06-19|1996-07-24|COLLECT COD|REG AIR|regular excuses: slyly +37219|465|95|4|50|68273.00|0.03|0.08|N|O|1996-07-09|1996-07-13|1996-07-10|NONE|AIR|ts maintai +37219|473|3|5|39|53565.33|0.08|0.05|N|O|1996-08-16|1996-06-03|1996-08-28|NONE|AIR|enly alongside of the carefully fin +37219|1527|68|6|50|71426.00|0.07|0.07|N|O|1996-06-08|1996-06-02|1996-07-05|NONE|MAIL|oys cajole +37219|1371|48|7|11|13996.07|0.09|0.00|N|O|1996-06-07|1996-07-01|1996-06-24|NONE|AIR|tes! blithely unusual theodolites br +37220|1660|2|1|1|1561.66|0.02|0.01|N|O|1996-12-04|1997-01-22|1996-12-11|NONE|MAIL|refully regular package +37220|1784|85|2|42|70802.76|0.06|0.03|N|O|1997-03-05|1997-01-07|1997-04-04|TAKE BACK RETURN|FOB|ons. slyly express packag +37220|1102|11|3|23|23071.30|0.00|0.08|N|O|1996-12-26|1997-02-21|1996-12-30|NONE|FOB|s. accounts nod regular theodoli +37220|162|63|4|18|19118.88|0.01|0.00|N|O|1997-01-19|1997-01-24|1997-01-27|DELIVER IN PERSON|RAIL|ffix furiously +37220|628|60|5|32|48915.84|0.03|0.06|N|O|1996-12-27|1997-02-01|1997-01-01|NONE|SHIP|final accounts sleep. +37220|443|44|6|44|59111.36|0.06|0.05|N|O|1997-03-31|1997-01-03|1997-04-10|NONE|REG AIR|ending ideas. +37221|86|87|1|5|4930.40|0.07|0.05|N|O|1998-01-25|1997-12-29|1998-02-05|TAKE BACK RETURN|MAIL|uickly about the instructi +37222|584|45|1|38|56414.04|0.05|0.07|N|O|1996-06-05|1996-06-18|1996-06-21|COLLECT COD|SHIP|across the regularly regular pearl +37222|985|20|2|23|43377.54|0.10|0.02|N|O|1996-05-27|1996-07-11|1996-06-02|NONE|SHIP|usual packages. regular theod +37222|1770|97|3|42|70214.34|0.05|0.01|N|O|1996-05-30|1996-07-12|1996-05-31|COLLECT COD|RAIL|elets sleep carefully. fluffily even hoc +37222|1261|99|4|18|20920.68|0.06|0.03|N|O|1996-08-12|1996-06-16|1996-09-07|TAKE BACK RETURN|AIR|e furiously ironic packag +37223|373|30|1|35|44567.95|0.05|0.02|N|O|1996-01-17|1996-01-24|1996-01-26|TAKE BACK RETURN|REG AIR| carefully silent account +37223|905|40|2|15|27088.50|0.05|0.02|N|O|1996-01-12|1996-01-29|1996-01-20|COLLECT COD|AIR|tructions +37223|435|36|3|1|1335.43|0.10|0.05|N|O|1995-12-15|1996-01-06|1996-01-13|NONE|RAIL|ke stealthy depo +37223|114|15|4|15|15211.65|0.06|0.02|N|O|1996-01-23|1995-12-16|1996-02-17|NONE|TRUCK|pecial platelets. even theodo +37223|1138|11|5|44|45721.72|0.09|0.04|N|O|1995-12-13|1996-01-25|1996-01-09|NONE|TRUCK|ve the blithely bold accounts. +37223|1084|90|6|38|37433.04|0.09|0.04|N|O|1995-11-16|1996-01-07|1995-11-29|DELIVER IN PERSON|AIR|blithely. even, regular pinto beans h +37248|1136|37|1|25|25928.25|0.09|0.05|N|O|1996-05-15|1996-04-12|1996-06-08|COLLECT COD|TRUCK|oxes haggle slyly regular re +37248|105|58|2|25|25127.50|0.02|0.02|N|O|1996-03-05|1996-05-07|1996-03-08|DELIVER IN PERSON|REG AIR|efully unusual pinto beans ac +37249|560|61|1|6|8763.36|0.03|0.07|N|O|1996-05-03|1996-04-14|1996-05-11|NONE|SHIP|dolites inte +37249|20|46|2|12|11040.24|0.00|0.06|N|O|1996-03-07|1996-04-10|1996-03-24|COLLECT COD|MAIL|are blithely af +37249|1852|39|3|16|28061.60|0.07|0.08|N|O|1996-02-22|1996-03-29|1996-03-08|TAKE BACK RETURN|FOB|e final pac +37249|894|28|4|19|34102.91|0.00|0.04|N|O|1996-04-18|1996-03-11|1996-05-08|COLLECT COD|RAIL|press foxes cajole furiously. furiou +37250|396|53|1|15|19445.85|0.03|0.07|A|F|1993-04-25|1993-04-01|1993-05-23|DELIVER IN PERSON|SHIP| accounts use carefull +37250|1833|34|2|9|15613.47|0.02|0.03|R|F|1993-03-06|1993-04-09|1993-04-03|COLLECT COD|RAIL| believe furiously. asymptotes +37250|1552|93|3|29|42152.95|0.09|0.04|R|F|1993-03-03|1993-04-07|1993-03-14|COLLECT COD|MAIL|inal ideas eat furio +37251|1175|84|1|33|35513.61|0.07|0.02|N|O|1997-01-05|1997-01-03|1997-01-25|DELIVER IN PERSON|MAIL|ts use. quickly bold wat +37251|234|62|2|25|28355.75|0.03|0.06|N|O|1997-01-27|1997-01-05|1997-02-25|DELIVER IN PERSON|REG AIR|ideas sleep fluffily blithely spec +37252|1647|89|1|6|9291.84|0.09|0.05|N|O|1996-03-07|1995-12-22|1996-04-05|TAKE BACK RETURN|RAIL| hang slyly about the carefully express i +37252|399|100|2|21|27287.19|0.08|0.08|N|O|1996-03-05|1996-02-11|1996-03-10|COLLECT COD|REG AIR|ickly busy th +37252|133|34|3|28|28927.64|0.05|0.04|N|O|1996-02-19|1996-01-06|1996-02-24|NONE|AIR|sly. slyly bold packages detect across th +37252|419|49|4|48|63331.68|0.01|0.04|N|O|1996-03-16|1996-02-15|1996-04-07|TAKE BACK RETURN|AIR|uickly along the express, silent p +37252|879|46|5|21|37377.27|0.05|0.00|N|O|1996-02-11|1996-02-11|1996-03-07|TAKE BACK RETURN|REG AIR|l accounts about the blithely regular idea +37252|1821|65|6|12|20673.84|0.08|0.01|N|O|1996-02-14|1996-02-03|1996-02-23|COLLECT COD|TRUCK|ole quickly above +37252|642|43|7|7|10798.48|0.06|0.00|N|O|1995-11-26|1996-01-02|1995-12-18|TAKE BACK RETURN|MAIL|lar dependencies cajole blithely +37253|191|70|1|50|54559.50|0.00|0.08|R|F|1992-12-06|1992-10-21|1992-12-25|NONE|MAIL|rns nag quickly +37253|1792|19|2|17|28794.43|0.01|0.06|R|F|1992-10-25|1992-10-18|1992-11-15|COLLECT COD|TRUCK|ites affix slyly along the fluffily clos +37253|704|69|3|48|77025.60|0.10|0.04|A|F|1992-11-05|1992-10-07|1992-11-06|COLLECT COD|MAIL| requests are express, ironic forg +37253|1433|73|4|13|17347.59|0.03|0.02|A|F|1992-09-21|1992-11-25|1992-10-03|DELIVER IN PERSON|MAIL|quests slee +37253|1861|48|5|31|54648.66|0.05|0.04|R|F|1992-11-17|1992-11-19|1992-12-15|TAKE BACK RETURN|AIR|lets along the final requests sleep s +37253|953|56|6|43|79719.85|0.04|0.00|A|F|1992-09-30|1992-11-13|1992-10-28|NONE|AIR|ajole special pinto beans. fluf +37253|686|49|7|14|22213.52|0.03|0.02|A|F|1992-12-09|1992-11-13|1993-01-02|COLLECT COD|TRUCK|equests. express, pending ideas after +37254|1706|91|1|15|24115.50|0.03|0.08|R|F|1994-09-29|1994-11-18|1994-10-03|COLLECT COD|REG AIR|ons. ironic depths are furiou +37255|567|58|1|30|44026.80|0.03|0.04|A|F|1995-01-11|1994-12-18|1995-01-29|NONE|FOB|s need to sleep. slyly iro +37255|1587|68|2|25|37214.50|0.07|0.00|A|F|1995-02-12|1994-12-16|1995-02-17|COLLECT COD|SHIP|k pinto beans. bold, close ideas can +37280|1420|21|1|34|44928.28|0.05|0.07|N|O|1997-10-24|1997-10-15|1997-10-25|TAKE BACK RETURN|MAIL|. ironically unusual deposits breach quick +37280|673|67|2|2|3147.34|0.09|0.00|N|O|1997-09-30|1997-10-28|1997-10-04|DELIVER IN PERSON|RAIL|ular pinto beans wake furious +37281|913|82|1|20|36278.20|0.10|0.08|R|F|1994-09-30|1994-10-27|1994-10-07|DELIVER IN PERSON|FOB|usly final de +37281|1774|59|2|24|40218.48|0.10|0.07|R|F|1994-12-07|1994-11-10|1994-12-12|TAKE BACK RETURN|MAIL|s. furiously even packages snooze across th +37281|1563|44|3|20|29291.20|0.09|0.01|A|F|1994-09-09|1994-11-06|1994-09-10|NONE|MAIL| theodolites sleep fl +37282|623|86|1|9|13712.58|0.08|0.05|A|F|1994-09-01|1994-10-07|1994-09-11|DELIVER IN PERSON|REG AIR|oze slyly against t +37282|72|73|2|3|2916.21|0.08|0.08|R|F|1994-11-03|1994-09-28|1994-11-25|DELIVER IN PERSON|MAIL|enticing theodolites detec +37282|1692|16|3|38|60560.22|0.10|0.08|R|F|1994-11-11|1994-10-26|1994-12-02|NONE|REG AIR|xpress accounts are carefully b +37282|1921|10|4|45|82031.40|0.04|0.03|R|F|1994-09-18|1994-10-16|1994-10-08|NONE|SHIP|he blithely regul +37282|61|12|5|24|23065.44|0.07|0.05|A|F|1994-08-12|1994-10-06|1994-08-28|DELIVER IN PERSON|AIR|unts. carefully furious +37283|1867|11|1|35|61910.10|0.08|0.05|N|O|1996-12-13|1996-12-14|1996-12-24|NONE|TRUCK|l, final theodolit +37283|592|53|2|2|2985.18|0.01|0.07|N|O|1996-10-15|1996-11-19|1996-10-17|NONE|REG AIR|y dependenci +37283|1582|3|3|30|44507.40|0.05|0.03|N|O|1996-12-27|1996-11-21|1997-01-17|DELIVER IN PERSON|AIR| foxes. carefully special pinto b +37283|147|26|4|15|15707.10|0.02|0.04|N|O|1997-01-06|1996-11-17|1997-01-13|COLLECT COD|RAIL| fluffily. blithe +37283|51|52|5|23|21874.15|0.02|0.06|N|O|1996-11-03|1996-12-09|1996-11-05|NONE|MAIL| instructions-- blithely final req +37283|589|80|6|2|2979.16|0.01|0.00|N|O|1996-12-22|1996-11-20|1997-01-06|COLLECT COD|TRUCK|r asymptot +37283|1473|13|7|44|60476.68|0.06|0.08|N|O|1997-01-09|1996-11-21|1997-02-02|DELIVER IN PERSON|RAIL|l pains wake quickly after t +37284|324|9|1|22|26935.04|0.08|0.05|R|F|1995-05-28|1995-04-27|1995-06-04|COLLECT COD|SHIP|old pinto be +37284|323|52|2|16|19573.12|0.04|0.00|N|O|1995-07-10|1995-05-16|1995-07-22|DELIVER IN PERSON|AIR|ets wake along the even, bold reques +37285|1697|21|1|27|43164.63|0.04|0.05|N|O|1996-07-16|1996-05-17|1996-08-15|TAKE BACK RETURN|TRUCK|aggle carefully accordi +37285|953|88|2|37|68596.15|0.10|0.02|N|O|1996-08-11|1996-05-17|1996-09-09|NONE|REG AIR|lly regula +37286|1263|75|1|38|44241.88|0.03|0.03|N|O|1996-07-12|1996-09-09|1996-08-04|NONE|AIR|ven requests. slyly f +37286|1311|26|2|20|24246.20|0.09|0.08|N|O|1996-10-12|1996-08-29|1996-11-10|COLLECT COD|FOB|es nag slyly unusual r +37286|1722|23|3|19|30850.68|0.00|0.03|N|O|1996-08-29|1996-07-30|1996-09-23|COLLECT COD|FOB|thely unusual deposits may wake s +37286|783|84|4|4|6735.12|0.08|0.01|N|O|1996-09-26|1996-08-04|1996-10-09|NONE|AIR|fluffily across th +37287|674|6|1|18|28344.06|0.10|0.03|R|F|1993-03-02|1993-01-28|1993-03-17|DELIVER IN PERSON|RAIL|ave packages nod evenly. final, ironic +37287|51|77|2|16|15216.80|0.04|0.02|A|F|1993-01-06|1992-12-07|1993-01-15|COLLECT COD|MAIL|uriously alon +37287|1429|30|3|22|29269.24|0.05|0.05|A|F|1993-02-14|1993-01-17|1993-03-12|DELIVER IN PERSON|SHIP| pending pinto bea +37287|1310|49|4|7|8479.17|0.03|0.05|A|F|1993-01-22|1992-12-10|1993-02-17|DELIVER IN PERSON|TRUCK|ong the slyly ironic packages. even +37287|512|3|5|40|56500.40|0.01|0.05|R|F|1992-12-07|1992-12-14|1992-12-24|NONE|FOB|ove the even deposits. regul +37287|157|84|6|31|32771.65|0.00|0.04|R|F|1993-01-22|1992-12-17|1993-02-15|TAKE BACK RETURN|AIR|ges are furiously +37312|420|21|1|10|13204.20|0.10|0.04|N|O|1998-05-13|1998-04-20|1998-05-25|NONE|SHIP| regular deposits among the foxes wake furi +37313|911|12|1|38|68852.58|0.06|0.02|A|F|1992-10-16|1992-09-10|1992-10-30|COLLECT COD|FOB|r foxes. carefully express attainments im +37313|1439|18|2|31|41553.33|0.10|0.08|A|F|1992-07-22|1992-09-27|1992-08-11|NONE|SHIP|ests engage blithely reg +37313|377|34|3|9|11496.33|0.10|0.05|R|F|1992-08-14|1992-08-22|1992-09-02|COLLECT COD|MAIL|ong the slyly even packages haggle tow +37313|1780|7|4|14|23544.92|0.06|0.08|R|F|1992-08-06|1992-08-25|1992-08-26|NONE|REG AIR|uriously regular pinto beans wake slyly +37314|1977|66|1|37|69521.89|0.03|0.01|N|O|1995-06-29|1995-08-01|1995-07-21|COLLECT COD|RAIL|s engage care +37314|436|66|2|41|54793.63|0.00|0.08|N|O|1995-07-31|1995-08-01|1995-08-01|TAKE BACK RETURN|RAIL|deposits among the ruthlessly unus +37314|1587|28|3|47|69963.26|0.06|0.01|N|F|1995-06-16|1995-07-09|1995-07-01|NONE|RAIL|, daring instructions boost +37315|1175|76|1|23|24751.91|0.09|0.01|A|F|1992-09-11|1992-07-20|1992-09-24|NONE|REG AIR|gle enticingly along the eve +37315|554|55|2|14|20363.70|0.01|0.07|R|F|1992-09-29|1992-09-04|1992-10-02|DELIVER IN PERSON|MAIL|packages wake bl +37316|1748|75|1|33|54441.42|0.02|0.03|N|O|1995-12-11|1995-10-12|1996-01-03|COLLECT COD|AIR|tes integra +37316|298|53|2|35|41940.15|0.04|0.02|N|O|1995-12-29|1995-11-19|1996-01-24|NONE|AIR| pending pinto beans sleep furiously. fluff +37317|1610|34|1|10|15116.10|0.01|0.02|R|F|1993-06-24|1993-05-08|1993-07-16|NONE|FOB| the theodolites. carefully regular +37317|23|74|2|9|8307.18|0.09|0.06|R|F|1993-03-29|1993-05-02|1993-04-17|COLLECT COD|FOB|nto beans cajole slyly bli +37318|502|3|1|45|63112.50|0.05|0.06|R|F|1993-08-01|1993-06-26|1993-08-25|DELIVER IN PERSON|TRUCK|to beans. ideas believe. +37318|1401|2|2|18|23443.20|0.04|0.03|A|F|1993-07-19|1993-05-23|1993-07-24|DELIVER IN PERSON|AIR|riously express ideas cajole. daringly +37318|1773|100|3|49|82063.73|0.02|0.02|R|F|1993-07-08|1993-06-15|1993-08-01|DELIVER IN PERSON|REG AIR|ironic accounts boost blithely. final, exp +37318|1889|33|4|45|80589.60|0.03|0.06|R|F|1993-05-03|1993-06-08|1993-05-15|COLLECT COD|RAIL|s would cajole even depo +37319|1641|24|1|24|37023.36|0.02|0.07|A|F|1994-09-06|1994-09-28|1994-09-26|DELIVER IN PERSON|TRUCK|elets integrate blithely quickly expres +37319|1462|63|2|32|43630.72|0.01|0.02|R|F|1994-10-20|1994-10-29|1994-11-01|DELIVER IN PERSON|FOB|es haggle carefully +37319|613|76|3|12|18163.32|0.00|0.01|A|F|1994-11-23|1994-09-08|1994-12-22|DELIVER IN PERSON|REG AIR|ly regular +37319|634|28|4|37|56781.31|0.10|0.00|R|F|1994-12-01|1994-09-27|1994-12-29|NONE|FOB|uests haggle +37319|1609|92|5|11|16616.60|0.05|0.00|R|F|1994-10-25|1994-10-19|1994-11-10|COLLECT COD|RAIL| integrate blithely from the quickly ironic +37319|1195|68|6|6|6577.14|0.08|0.05|A|F|1994-08-15|1994-10-21|1994-08-24|DELIVER IN PERSON|REG AIR|es are above the slyly unu +37319|1357|96|7|18|22650.30|0.03|0.06|R|F|1994-11-28|1994-11-03|1994-12-22|COLLECT COD|MAIL|ages. foxes sleep furiously? pending a +37344|1551|92|1|19|27598.45|0.08|0.05|N|O|1996-05-11|1996-05-26|1996-06-02|NONE|REG AIR|uriously pending +37344|1921|10|2|45|82031.40|0.01|0.05|N|O|1996-04-02|1996-06-01|1996-05-01|NONE|TRUCK|usual platelets haggle s +37344|1951|96|3|28|51882.60|0.08|0.04|N|O|1996-05-25|1996-05-31|1996-05-31|DELIVER IN PERSON|MAIL|s are furiously regular foxes +37344|481|11|4|23|31774.04|0.07|0.00|N|O|1996-06-15|1996-04-25|1996-06-19|COLLECT COD|FOB| against the blithely slow accounts are car +37344|1236|48|5|13|14783.99|0.07|0.04|N|O|1996-04-19|1996-04-12|1996-04-22|COLLECT COD|REG AIR| to the regular, pending pinto beans dete +37344|1584|25|6|12|17826.96|0.10|0.08|N|O|1996-07-02|1996-05-25|1996-07-17|TAKE BACK RETURN|REG AIR|t instructions across the slyly iron +37345|997|32|1|22|41755.78|0.00|0.05|N|O|1998-08-16|1998-08-19|1998-08-28|COLLECT COD|TRUCK|s. furiously silent ideas are blithel +37345|50|1|2|5|4750.25|0.06|0.02|N|O|1998-06-11|1998-06-26|1998-07-05|DELIVER IN PERSON|MAIL|s sleep abo +37345|1190|99|3|22|24006.18|0.04|0.01|N|O|1998-07-03|1998-08-07|1998-07-19|DELIVER IN PERSON|RAIL| quickly after the furiously silent +37346|822|23|1|20|34456.40|0.10|0.02|R|F|1994-04-28|1994-03-28|1994-05-07|NONE|FOB|ly final ac +37347|617|80|1|47|71327.67|0.10|0.04|R|F|1992-05-21|1992-03-26|1992-05-28|DELIVER IN PERSON|TRUCK|asymptotes print carefully special reques +37347|111|64|2|15|15166.65|0.05|0.03|R|F|1992-02-10|1992-03-03|1992-02-21|COLLECT COD|TRUCK|nic deposits boost furiousl +37347|995|30|3|39|73943.61|0.10|0.07|A|F|1992-04-05|1992-04-19|1992-04-09|COLLECT COD|SHIP|leep according to the regular dolphins. bli +37347|536|37|4|10|14365.30|0.04|0.04|R|F|1992-02-29|1992-03-21|1992-03-23|DELIVER IN PERSON|RAIL| carefully final pack +37347|707|8|5|13|20900.10|0.08|0.08|A|F|1992-05-07|1992-03-01|1992-06-05|COLLECT COD|MAIL|nal deposits at the ironic ideas hag +37347|1286|87|6|13|15434.64|0.02|0.01|R|F|1992-01-31|1992-04-02|1992-02-21|DELIVER IN PERSON|TRUCK|regular platelets cajole fur +37348|1606|89|1|30|45228.00|0.08|0.07|R|F|1994-09-21|1994-08-16|1994-10-16|DELIVER IN PERSON|MAIL|ic frets print against the carefully u +37348|435|65|2|48|64100.64|0.01|0.08|A|F|1994-09-23|1994-07-28|1994-10-05|TAKE BACK RETURN|FOB|itaphs along the special, ironic reque +37348|832|99|3|26|45053.58|0.05|0.07|A|F|1994-09-04|1994-08-17|1994-09-11|DELIVER IN PERSON|MAIL| quickly unusual depos +37348|367|24|4|42|53229.12|0.07|0.05|A|F|1994-07-29|1994-07-16|1994-07-30|DELIVER IN PERSON|TRUCK|ding foxes +37348|541|42|5|36|51895.44|0.01|0.01|R|F|1994-09-15|1994-07-20|1994-10-04|TAKE BACK RETURN|TRUCK| slyly regular, ironic platelets. c +37349|46|47|1|33|31219.32|0.06|0.03|A|F|1993-02-19|1993-03-29|1993-03-03|TAKE BACK RETURN|FOB|ickly special request +37349|699|62|2|14|22395.66|0.09|0.05|A|F|1993-04-20|1993-04-25|1993-05-05|TAKE BACK RETURN|SHIP|lets toward the furiously +37349|1960|93|3|8|14895.68|0.00|0.07|R|F|1993-06-13|1993-03-23|1993-07-04|TAKE BACK RETURN|RAIL|ven instructions mold slyly +37349|218|46|4|37|41373.77|0.07|0.04|A|F|1993-03-19|1993-04-01|1993-04-15|DELIVER IN PERSON|MAIL|s packages sleep. instruct +37349|1768|11|5|50|83488.00|0.09|0.08|A|F|1993-05-18|1993-04-03|1993-06-03|DELIVER IN PERSON|RAIL|omas are. c +37349|1481|99|6|19|26267.12|0.02|0.07|R|F|1993-04-21|1993-04-01|1993-05-04|NONE|REG AIR| among the carefully +37350|1672|73|1|26|40915.42|0.09|0.02|R|F|1992-08-12|1992-07-04|1992-09-05|TAKE BACK RETURN|SHIP|uctions affix f +37351|1133|6|1|9|9307.17|0.00|0.02|A|F|1992-10-21|1992-11-21|1992-10-24|COLLECT COD|REG AIR|t the carefully bold ideas. instruction +37376|1119|20|1|23|23462.53|0.09|0.00|A|F|1994-04-24|1994-04-14|1994-05-21|COLLECT COD|RAIL|y unusual requests bo +37376|343|28|2|29|36056.86|0.05|0.07|A|F|1994-02-16|1994-03-29|1994-03-16|DELIVER IN PERSON|FOB|leep carefully b +37376|388|73|3|17|21902.46|0.05|0.02|R|F|1994-02-15|1994-03-16|1994-03-09|NONE|MAIL|ets haggle idly blithely pendi +37376|895|95|4|24|43101.36|0.02|0.06|R|F|1994-02-22|1994-04-28|1994-03-10|NONE|MAIL|as-- blithely express dolp +37376|436|24|5|15|20046.45|0.08|0.01|A|F|1994-03-31|1994-04-14|1994-04-08|COLLECT COD|FOB|lyly regular ideas. bold, final +37377|315|100|1|1|1215.31|0.02|0.03|R|F|1992-05-19|1992-03-25|1992-06-09|NONE|SHIP|y special pains. final requests was accor +37377|265|66|2|28|32627.28|0.04|0.06|R|F|1992-02-04|1992-04-04|1992-02-23|NONE|AIR|ing requests are alo +37377|1210|48|3|49|54449.29|0.00|0.02|A|F|1992-01-29|1992-02-26|1992-02-03|TAKE BACK RETURN|MAIL|to beans across the final, ironic pin +37377|1242|17|4|14|16005.36|0.05|0.04|A|F|1992-04-01|1992-03-26|1992-04-11|NONE|FOB| the quietly bold excuses. blithely regul +37377|567|98|5|39|57234.84|0.05|0.02|R|F|1992-04-11|1992-03-30|1992-04-15|COLLECT COD|FOB|ffily special theodolites. slyly special r +37377|1004|5|6|12|10860.00|0.01|0.07|R|F|1992-02-06|1992-04-01|1992-02-18|NONE|FOB|fter the slyly special ideas. bo +37377|1809|53|7|20|34216.00|0.07|0.08|R|F|1992-05-02|1992-03-05|1992-05-20|DELIVER IN PERSON|AIR| among the ir +37378|487|88|1|43|59661.64|0.02|0.06|N|O|1998-01-14|1998-03-02|1998-01-23|DELIVER IN PERSON|FOB|he fluffily silent instr +37378|1932|33|2|26|47682.18|0.07|0.08|N|O|1998-03-10|1998-02-08|1998-03-11|DELIVER IN PERSON|TRUCK| are slyly of the +37378|1761|4|3|31|51545.56|0.07|0.07|N|O|1998-02-17|1998-01-28|1998-02-21|NONE|REG AIR|o beans. final reque +37378|143|22|4|17|17733.38|0.07|0.08|N|O|1998-02-16|1998-02-24|1998-02-28|NONE|REG AIR|s cajole about the regular d +37379|1975|8|1|23|43170.31|0.08|0.06|N|O|1996-08-07|1996-09-24|1996-09-06|NONE|SHIP|tegrate blithely a +37379|1212|87|2|15|16698.15|0.04|0.00|N|O|1996-08-29|1996-08-10|1996-09-04|DELIVER IN PERSON|MAIL|hely special packages c +37379|685|48|3|14|22199.52|0.05|0.02|N|O|1996-08-08|1996-09-05|1996-09-07|COLLECT COD|REG AIR|s foxes wake quickly. slyly iro +37379|858|59|4|33|58042.05|0.09|0.07|N|O|1996-08-18|1996-08-25|1996-09-07|NONE|MAIL|reful real +37379|777|42|5|10|16777.70|0.07|0.00|N|O|1996-09-13|1996-09-02|1996-09-22|DELIVER IN PERSON|AIR|slyly even requests above the furiously b +37379|1714|57|6|22|35545.62|0.01|0.07|N|O|1996-08-21|1996-09-26|1996-09-04|COLLECT COD|RAIL|l ideas boost after the bli +37380|941|44|1|14|25787.16|0.01|0.06|N|O|1995-06-30|1995-05-28|1995-07-18|DELIVER IN PERSON|SHIP|ackages. slyly enticin +37380|105|84|2|47|47239.70|0.09|0.04|R|F|1995-05-09|1995-06-26|1995-05-15|COLLECT COD|MAIL|uickly eve +37380|257|12|3|26|30088.50|0.06|0.08|A|F|1995-04-10|1995-06-15|1995-05-01|COLLECT COD|TRUCK|olites. carefully special dep +37380|1262|37|4|1|1163.26|0.00|0.03|A|F|1995-05-11|1995-06-12|1995-05-27|NONE|RAIL| blithely even accoun +37380|1998|31|5|2|3799.98|0.03|0.06|N|O|1995-06-25|1995-06-28|1995-07-08|COLLECT COD|AIR| detect never blithel +37380|1478|79|6|23|31727.81|0.04|0.07|R|F|1995-06-06|1995-05-02|1995-06-14|COLLECT COD|RAIL| final excuse +37380|1996|41|7|39|74021.61|0.08|0.01|A|F|1995-05-12|1995-05-03|1995-06-10|COLLECT COD|MAIL|he express foxes. +37381|541|72|1|27|38921.58|0.08|0.02|N|O|1997-03-21|1997-02-09|1997-03-26|NONE|RAIL|s cajole blithely accordin +37381|13|39|2|30|27390.30|0.09|0.02|N|O|1997-05-04|1997-02-13|1997-05-31|TAKE BACK RETURN|SHIP|ccounts. blithely regular d +37381|1325|26|3|21|25752.72|0.03|0.07|N|O|1997-02-10|1997-04-05|1997-02-28|DELIVER IN PERSON|TRUCK|ide of the blithely ironic foxes. +37381|132|85|4|48|49542.24|0.06|0.01|N|O|1997-04-27|1997-03-19|1997-05-11|DELIVER IN PERSON|FOB|s haggle thinly daringly i +37381|157|10|5|7|7400.05|0.09|0.03|N|O|1997-01-24|1997-02-21|1997-01-27|DELIVER IN PERSON|FOB|e furiously ab +37381|1286|24|6|2|2374.56|0.04|0.00|N|O|1997-02-27|1997-02-24|1997-03-20|NONE|RAIL|ep. fluffily express +37382|1995|96|1|2|3793.98|0.08|0.00|R|F|1995-01-18|1995-01-26|1995-02-04|COLLECT COD|TRUCK|nal instruc +37382|76|27|2|40|39042.80|0.05|0.01|A|F|1995-02-21|1995-02-09|1995-03-14|TAKE BACK RETURN|FOB|the slyly even +37382|1541|42|3|36|51931.44|0.01|0.04|R|F|1995-04-01|1995-01-21|1995-04-20|TAKE BACK RETURN|MAIL|es! quickly special dolphins thr +37383|402|90|1|22|28652.80|0.05|0.01|N|O|1995-08-13|1995-09-13|1995-08-16|NONE|FOB|blithely regular +37383|46|97|2|35|33111.40|0.06|0.03|N|O|1995-10-11|1995-09-10|1995-10-12|DELIVER IN PERSON|REG AIR|e slyly regular theodolites. furiously ev +37383|1652|53|3|48|74575.20|0.03|0.06|N|O|1995-10-07|1995-08-16|1995-10-19|DELIVER IN PERSON|RAIL|regular sentiments after +37383|1285|86|4|33|39147.24|0.04|0.02|N|O|1995-09-08|1995-09-09|1995-10-02|TAKE BACK RETURN|RAIL|slyly unusual deposi +37383|19|45|5|17|15623.17|0.02|0.01|N|O|1995-08-24|1995-07-31|1995-09-21|NONE|TRUCK|uffily unusu +37408|1968|57|1|47|87888.12|0.07|0.04|N|O|1998-03-05|1998-05-21|1998-03-26|NONE|TRUCK|y pending excuses haggle carefully +37408|1435|14|2|12|16037.16|0.06|0.07|N|O|1998-03-31|1998-04-25|1998-04-17|TAKE BACK RETURN|SHIP|ilently ironic ideas. furiously +37408|974|77|3|13|24374.61|0.07|0.08|N|O|1998-05-15|1998-04-16|1998-05-23|DELIVER IN PERSON|TRUCK|fully bold packages about the +37408|333|62|4|30|36999.90|0.03|0.04|N|O|1998-03-19|1998-05-03|1998-04-10|COLLECT COD|AIR|dencies. final pa +37409|837|38|1|22|38232.26|0.07|0.05|N|O|1998-06-12|1998-06-30|1998-07-06|DELIVER IN PERSON|SHIP|usly expres +37409|843|77|2|23|40108.32|0.09|0.07|N|O|1998-05-22|1998-07-18|1998-05-27|NONE|TRUCK|ys across the evenly unusual ideas +37409|621|22|3|46|69994.52|0.00|0.08|N|O|1998-05-24|1998-07-20|1998-06-05|DELIVER IN PERSON|SHIP|its x-ray requests. regular deposit +37409|760|57|4|45|74734.20|0.03|0.06|N|O|1998-06-12|1998-07-28|1998-07-06|DELIVER IN PERSON|MAIL|gle. quickly final pinto beans need +37409|1711|54|5|12|19352.52|0.06|0.05|N|O|1998-05-25|1998-06-28|1998-06-20|TAKE BACK RETURN|FOB|nt pinto beans wake slyly b +37409|582|13|6|24|35581.92|0.10|0.04|N|O|1998-05-17|1998-07-14|1998-06-01|DELIVER IN PERSON|RAIL|c Tiresias. furiously bold realms among +37409|215|43|7|37|41262.77|0.05|0.07|N|O|1998-06-04|1998-06-20|1998-06-19|DELIVER IN PERSON|TRUCK|n ideas. packages hag +37410|1907|40|1|10|18089.00|0.10|0.00|R|F|1993-11-17|1993-11-23|1993-12-13|NONE|RAIL| deposits. forges boost +37410|1875|5|2|49|87066.63|0.08|0.08|R|F|1994-01-07|1993-12-07|1994-01-11|NONE|RAIL| excuses cajole final deposi +37410|1897|27|3|45|80950.05|0.03|0.04|A|F|1993-11-07|1993-12-28|1993-12-02|TAKE BACK RETURN|FOB|hithout the fu +37411|947|82|1|41|75765.54|0.01|0.00|N|O|1997-04-20|1997-03-11|1997-05-19|COLLECT COD|REG AIR|ly bold accounts boost quickly +37411|1462|80|2|42|57265.32|0.03|0.04|N|O|1997-01-07|1997-03-06|1997-01-21|TAKE BACK RETURN|AIR|sits: evenly final in +37411|354|83|3|2|2508.70|0.04|0.08|N|O|1997-03-19|1997-03-14|1997-04-02|DELIVER IN PERSON|AIR|aggle fluffily. unusual, +37412|1265|66|1|19|22158.94|0.00|0.03|A|F|1992-08-09|1992-09-05|1992-09-07|NONE|REG AIR|oxes cajole sly +37412|716|49|2|47|75985.37|0.07|0.02|R|F|1992-09-10|1992-10-18|1992-10-09|DELIVER IN PERSON|RAIL|le slyly carefully close packages. pend +37412|108|9|3|44|44356.40|0.09|0.05|R|F|1992-10-24|1992-10-06|1992-11-07|COLLECT COD|SHIP|efully regular foxes. express +37413|540|1|1|22|31691.88|0.07|0.05|N|O|1997-10-07|1997-09-09|1997-10-14|NONE|REG AIR|ly between the careful +37414|1008|9|1|21|19089.00|0.03|0.06|N|O|1995-11-14|1995-11-24|1995-12-09|COLLECT COD|RAIL|s wake slyly about the even pa +37414|1809|39|2|6|10264.80|0.00|0.06|N|O|1995-10-12|1995-12-03|1995-10-18|TAKE BACK RETURN|RAIL|y ironic deposits. quickly ironic instructi +37414|40|91|3|1|940.04|0.06|0.07|N|O|1995-10-09|1995-12-04|1995-10-25|NONE|FOB|le carefull +37414|427|28|4|21|27875.82|0.10|0.04|N|O|1995-12-03|1995-10-28|1995-12-23|NONE|TRUCK|s. instructions above the iron +37414|903|72|5|9|16235.10|0.06|0.01|N|O|1996-01-09|1995-11-02|1996-01-14|COLLECT COD|SHIP|nst the furiousl +37415|1067|38|1|1|968.06|0.02|0.04|N|O|1995-12-06|1996-01-04|1995-12-23|COLLECT COD|SHIP|ding to the brave instructions. slyl +37440|1713|14|1|7|11302.97|0.09|0.05|A|F|1993-09-05|1993-09-07|1993-09-24|DELIVER IN PERSON|REG AIR|even foxes. furiously +37440|833|34|2|32|55482.56|0.06|0.07|R|F|1993-10-13|1993-08-23|1993-10-15|NONE|AIR|rate after the blithely regular pac +37440|84|60|3|25|24602.00|0.06|0.04|R|F|1993-08-18|1993-08-30|1993-09-15|NONE|SHIP|bout the ironic +37441|772|5|1|44|73601.88|0.06|0.06|R|F|1994-06-20|1994-05-07|1994-06-27|NONE|SHIP|ar theodolites! bold accounts s +37441|1571|12|2|30|44177.10|0.03|0.00|R|F|1994-03-15|1994-04-26|1994-04-10|DELIVER IN PERSON|AIR|doubt. carefu +37441|1464|65|3|44|60080.24|0.03|0.01|R|F|1994-06-08|1994-04-19|1994-06-19|NONE|MAIL|ess, final theodo +37441|1901|90|4|44|79327.60|0.07|0.00|A|F|1994-04-28|1994-05-04|1994-05-20|COLLECT COD|MAIL|ronic accounts +37441|457|58|5|6|8144.70|0.04|0.07|R|F|1994-04-07|1994-05-23|1994-04-24|DELIVER IN PERSON|RAIL|ly pending ideas. regular requests +37442|29|80|1|16|14864.32|0.05|0.00|N|O|1997-11-01|1997-11-17|1997-11-12|NONE|MAIL|ly express tithes. thin, expr +37443|220|2|1|22|24644.84|0.09|0.07|A|F|1993-05-28|1993-05-26|1993-06-26|DELIVER IN PERSON|MAIL|uickly against the even +37443|1060|96|2|5|4805.30|0.04|0.04|A|F|1993-06-15|1993-06-27|1993-07-14|COLLECT COD|AIR| ideas are quick +37443|1425|26|3|33|43771.86|0.01|0.07|A|F|1993-05-04|1993-05-24|1993-05-31|DELIVER IN PERSON|SHIP|re; platele +37443|1996|29|4|22|41755.78|0.01|0.07|A|F|1993-05-29|1993-06-29|1993-06-21|NONE|RAIL|slyly carefully ironic accounts. even reque +37444|1615|16|1|47|71280.67|0.05|0.00|R|F|1992-02-28|1992-03-13|1992-03-06|COLLECT COD|TRUCK|olites. enticingly pending theodol +37444|1366|43|2|15|19010.40|0.07|0.00|R|F|1992-04-14|1992-04-10|1992-04-15|TAKE BACK RETURN|FOB|yly express sauternes nod +37445|1084|20|1|12|11820.96|0.07|0.01|R|F|1992-05-23|1992-04-29|1992-06-08|DELIVER IN PERSON|SHIP|ans. deposits use. +37445|1853|40|2|11|19303.35|0.10|0.06|A|F|1992-03-06|1992-04-18|1992-03-17|DELIVER IN PERSON|RAIL|uriously express packages cajole fur +37445|1582|63|3|43|63793.94|0.10|0.04|A|F|1992-04-26|1992-04-28|1992-05-19|COLLECT COD|REG AIR|hely even courts lose according +37445|1790|33|4|16|27068.64|0.00|0.03|A|F|1992-02-26|1992-05-11|1992-03-01|TAKE BACK RETURN|TRUCK|cies. quickly even packages wake sometime +37445|80|56|5|31|30382.48|0.10|0.08|A|F|1992-03-12|1992-03-20|1992-03-27|NONE|AIR|ithely ironic packa +37445|1732|17|6|4|6534.92|0.08|0.07|A|F|1992-04-29|1992-05-15|1992-05-19|NONE|FOB|fully express pinto beans boost furiousl +37446|1635|59|1|40|61465.20|0.04|0.07|A|F|1993-12-27|1994-02-17|1994-01-22|NONE|RAIL|ess pinto bean +37447|369|98|1|37|46966.32|0.01|0.01|A|F|1994-10-19|1994-10-01|1994-11-17|COLLECT COD|FOB|express packages a +37447|1205|17|2|26|28761.20|0.07|0.01|A|F|1994-08-07|1994-09-19|1994-08-18|COLLECT COD|REG AIR|ously final accounts cajole quick +37447|821|22|3|41|70594.62|0.05|0.04|R|F|1994-07-10|1994-09-06|1994-07-15|NONE|TRUCK|sits doubt blithely. acco +37447|403|4|4|15|19551.00|0.05|0.05|R|F|1994-08-16|1994-08-11|1994-08-18|COLLECT COD|REG AIR|egular accounts wake fluff +37447|247|29|5|49|56214.76|0.09|0.05|A|F|1994-09-05|1994-08-21|1994-09-06|TAKE BACK RETURN|MAIL| regular, ironic +37447|762|95|6|28|46557.28|0.05|0.03|R|F|1994-08-18|1994-08-15|1994-09-13|TAKE BACK RETURN|SHIP|capades. carefully even +37472|169|96|1|40|42766.40|0.00|0.03|N|O|1997-05-15|1997-04-04|1997-05-22|TAKE BACK RETURN|AIR|ng to the carefully ironic deposits boo +37472|28|54|2|35|32480.70|0.09|0.06|N|O|1997-03-16|1997-04-11|1997-04-12|DELIVER IN PERSON|TRUCK|xpress packages. depths after th +37472|441|29|3|45|60364.80|0.09|0.00|N|O|1997-04-09|1997-03-27|1997-04-27|DELIVER IN PERSON|RAIL|ructions wake fluffily. ironic deposi +37472|721|54|4|43|69733.96|0.10|0.00|N|O|1997-03-19|1997-03-25|1997-03-30|COLLECT COD|TRUCK|uests. slyly even accounts about t +37472|1725|68|5|35|56935.20|0.02|0.04|N|O|1997-02-13|1997-04-28|1997-03-06|TAKE BACK RETURN|FOB| unusual dolphins. +37473|565|66|1|34|49829.04|0.08|0.03|A|F|1995-01-17|1994-12-15|1995-01-24|COLLECT COD|MAIL|ng the epitaphs believe slyly ac +37473|1674|57|2|47|74056.49|0.03|0.04|R|F|1994-10-25|1994-11-26|1994-11-08|DELIVER IN PERSON|RAIL|iers boost +37473|1114|15|3|50|50755.50|0.01|0.00|A|F|1994-10-20|1994-12-08|1994-10-22|COLLECT COD|AIR| ironic accounts. slyly ironic account +37473|1808|38|4|2|3419.60|0.02|0.02|R|F|1995-01-03|1994-12-22|1995-01-28|NONE|REG AIR|regular ideas +37473|1698|22|5|18|28794.42|0.08|0.03|R|F|1994-11-12|1994-11-12|1994-12-03|COLLECT COD|MAIL| the regular accounts wake caref +37473|61|37|6|28|26909.68|0.00|0.06|R|F|1995-01-01|1994-12-19|1995-01-16|TAKE BACK RETURN|AIR|ar ideas detect about the so +37473|1262|63|7|37|43040.62|0.10|0.08|R|F|1994-11-12|1994-12-23|1994-12-07|NONE|REG AIR|e quickly pending, final dependencies. +37474|4|55|1|28|25312.00|0.05|0.08|R|F|1994-05-30|1994-07-04|1994-06-04|COLLECT COD|MAIL|cial, express theodolites unw +37475|711|8|1|36|58021.56|0.05|0.08|N|O|1995-06-22|1995-06-04|1995-06-28|NONE|FOB|silent excuses integrate furiously +37476|1811|41|1|24|41107.44|0.01|0.00|N|O|1996-09-03|1996-07-25|1996-09-21|NONE|AIR|ldly foxes. fluffily un +37476|1341|18|2|34|42239.56|0.00|0.02|N|O|1996-09-02|1996-07-21|1996-09-25|COLLECT COD|SHIP|. fluffily express requests engage among +37476|1709|10|3|26|41878.20|0.05|0.07|N|O|1996-06-16|1996-08-02|1996-07-08|TAKE BACK RETURN|TRUCK|. theodolites sl +37476|873|40|4|24|42572.88|0.05|0.00|N|O|1996-06-20|1996-09-04|1996-06-28|COLLECT COD|MAIL|lar courts. iro +37477|1585|26|1|25|37164.50|0.09|0.00|N|O|1997-07-22|1997-07-02|1997-08-07|COLLECT COD|TRUCK|ts sleep. carefully +37478|808|9|1|6|10252.80|0.00|0.06|A|F|1993-08-05|1993-07-27|1993-08-16|COLLECT COD|REG AIR|ly regular excuses sleep quickly. exp +37478|975|10|2|1|1875.97|0.05|0.05|R|F|1993-05-20|1993-07-31|1993-06-11|TAKE BACK RETURN|RAIL|ajole carefully final dep +37479|318|19|1|14|17056.34|0.05|0.04|N|O|1998-08-10|1998-06-08|1998-08-25|COLLECT COD|SHIP|arefully bold +37479|1744|71|2|42|69121.08|0.06|0.01|N|O|1998-06-20|1998-06-06|1998-07-16|COLLECT COD|FOB|t forges. slyly +37479|1798|41|3|25|42494.75|0.05|0.08|N|O|1998-07-15|1998-05-16|1998-08-13|TAKE BACK RETURN|SHIP|slyly even in +37479|1617|41|4|11|16704.71|0.03|0.00|N|O|1998-05-21|1998-06-11|1998-06-19|NONE|FOB| carefully bold +37479|120|47|5|5|5100.60|0.05|0.08|N|O|1998-07-27|1998-07-12|1998-08-16|COLLECT COD|RAIL|s, ironic theodolites wake quickly. blithel +37479|1401|80|6|18|23443.20|0.07|0.00|N|O|1998-06-08|1998-07-15|1998-06-11|NONE|AIR|ular theodolites. furiou +37504|1409|10|1|15|19656.00|0.05|0.07|N|O|1996-06-22|1996-05-09|1996-07-02|DELIVER IN PERSON|SHIP|blithely ironic acco +37504|1532|33|2|20|28670.60|0.06|0.05|N|O|1996-04-07|1996-04-10|1996-05-05|TAKE BACK RETURN|MAIL|e carefully ironic dolphins boost furiou +37504|965|34|3|4|7463.84|0.04|0.03|N|O|1996-04-29|1996-05-31|1996-05-19|TAKE BACK RETURN|TRUCK|ses cajole carefully. dinos try to +37504|293|75|4|32|38185.28|0.08|0.02|N|O|1996-06-22|1996-05-29|1996-07-17|COLLECT COD|AIR|nstructions are slyly. ironic +37504|409|39|5|12|15712.80|0.00|0.03|N|O|1996-05-29|1996-05-13|1996-06-27|TAKE BACK RETURN|TRUCK|ideas sleep slyly +37504|1439|79|6|45|60319.35|0.06|0.02|N|O|1996-06-02|1996-05-13|1996-06-23|DELIVER IN PERSON|AIR|its sleep blithely +37505|838|39|1|47|81725.01|0.06|0.06|N|O|1995-07-17|1995-08-07|1995-07-28|COLLECT COD|REG AIR|t deposits sleep sl +37505|15|41|2|38|34770.38|0.06|0.08|N|O|1995-08-19|1995-08-02|1995-08-23|NONE|FOB|uests. quickly iro +37505|1746|89|3|24|39545.76|0.04|0.04|N|O|1995-09-18|1995-08-21|1995-10-13|COLLECT COD|AIR| the blithely bold requests. deposits haggl +37505|1388|27|4|27|34813.26|0.00|0.06|N|F|1995-06-06|1995-08-06|1995-07-01|DELIVER IN PERSON|MAIL|s must run quickly +37505|1354|93|5|4|5021.40|0.10|0.03|N|O|1995-08-03|1995-07-05|1995-08-21|TAKE BACK RETURN|REG AIR| the ironic packages. ironic pinto beans b +37505|1954|43|6|5|9279.75|0.06|0.01|N|O|1995-09-07|1995-08-25|1995-09-29|NONE|REG AIR|s. slyly pend +37506|841|8|1|36|62706.24|0.04|0.08|N|O|1997-07-28|1997-07-01|1997-08-16|DELIVER IN PERSON|TRUCK|l accounts sleep +37506|639|71|2|17|26173.71|0.04|0.04|N|O|1997-05-31|1997-05-26|1997-06-13|COLLECT COD|FOB|sts use blithely. +37506|255|37|3|33|38123.25|0.00|0.01|N|O|1997-05-09|1997-05-24|1997-05-10|NONE|TRUCK|y even ideas. +37506|507|38|4|9|12667.50|0.01|0.07|N|O|1997-05-17|1997-06-27|1997-05-23|DELIVER IN PERSON|FOB|luffily even accounts wake +37506|1337|76|5|3|3714.99|0.08|0.03|N|O|1997-07-03|1997-05-14|1997-07-09|NONE|MAIL| regular packages. idly regular requ +37506|465|95|6|32|43694.72|0.08|0.03|N|O|1997-05-29|1997-05-28|1997-06-16|TAKE BACK RETURN|TRUCK|s run blithely slyly +37507|276|77|1|40|47050.80|0.08|0.06|R|F|1995-04-04|1995-02-21|1995-04-29|COLLECT COD|TRUCK|jole slyly according to the p +37507|849|83|2|19|33246.96|0.05|0.03|A|F|1995-02-18|1995-03-04|1995-03-06|NONE|MAIL|ithely ironic deposits. blithely ex +37507|1136|9|3|37|38373.81|0.00|0.01|A|F|1995-01-26|1995-01-13|1995-02-21|TAKE BACK RETURN|MAIL|ar requests cajole +37507|323|80|4|4|4893.28|0.02|0.01|R|F|1995-01-01|1995-03-09|1995-01-18|DELIVER IN PERSON|TRUCK|ar dolphins cajole above +37508|732|97|1|10|16327.30|0.08|0.02|N|O|1997-10-16|1997-11-09|1997-10-23|COLLECT COD|RAIL|nic requests. slyly special requests sle +37508|242|24|2|25|28556.00|0.01|0.06|N|O|1997-09-29|1997-11-03|1997-10-29|NONE|TRUCK|ole thinly across t +37508|880|80|3|10|17808.80|0.00|0.00|N|O|1998-01-02|1997-10-08|1998-01-26|TAKE BACK RETURN|TRUCK|ts boost. care +37508|728|61|4|5|8143.60|0.07|0.04|N|O|1997-12-05|1997-10-12|1997-12-10|NONE|FOB|ly express packages along the blithely +37508|1216|28|5|39|43571.19|0.01|0.00|N|O|1997-10-25|1997-10-19|1997-10-27|NONE|FOB| blithely final accounts about th +37508|153|80|6|20|21063.00|0.05|0.01|N|O|1997-09-23|1997-10-06|1997-10-10|NONE|RAIL|ar theodolites nod b +37508|1270|71|7|32|37480.64|0.01|0.05|N|O|1997-09-18|1997-11-26|1997-10-14|COLLECT COD|TRUCK| of the sometimes regular sauterne +37509|1414|93|1|38|49985.58|0.00|0.06|N|O|1997-12-28|1997-10-15|1998-01-05|TAKE BACK RETURN|REG AIR|kages. slyly final de +37510|670|71|1|19|29842.73|0.00|0.08|R|F|1994-05-27|1994-04-23|1994-06-26|TAKE BACK RETURN|MAIL|r asymptotes sleep carefully. slyly +37510|402|90|2|49|63817.60|0.02|0.06|R|F|1994-06-02|1994-05-11|1994-06-16|DELIVER IN PERSON|RAIL|equests. regularly regular pa +37510|1901|46|3|42|75721.80|0.06|0.06|A|F|1994-05-10|1994-05-04|1994-05-31|COLLECT COD|RAIL|regular packages are after the carefully f +37511|429|17|1|36|47859.12|0.03|0.05|N|O|1996-02-28|1996-01-26|1996-03-16|DELIVER IN PERSON|SHIP|olites are. furiously final fo +37511|1399|76|2|43|55916.77|0.10|0.00|N|O|1996-02-02|1995-12-10|1996-02-09|DELIVER IN PERSON|TRUCK|cial courts +37511|40|41|3|21|19740.84|0.00|0.06|N|O|1996-01-22|1996-01-14|1996-01-28|NONE|RAIL| affix ideas. quickly regular +37536|763|64|1|28|46585.28|0.03|0.03|R|F|1994-09-15|1994-11-25|1994-09-29|DELIVER IN PERSON|SHIP|s wake blithely. r +37536|1262|37|2|45|52346.70|0.00|0.08|A|F|1994-11-04|1994-11-01|1994-12-01|COLLECT COD|MAIL|anent foxes across the ironic, final e +37536|1634|76|3|44|67567.72|0.03|0.06|A|F|1994-09-13|1994-10-15|1994-10-06|TAKE BACK RETURN|SHIP|es against the furiously ironic +37536|1003|9|4|3|2712.00|0.10|0.07|A|F|1995-01-02|1994-10-26|1995-01-04|TAKE BACK RETURN|MAIL|ve carefully even accounts. slyly fi +37536|199|78|5|47|51661.93|0.05|0.00|R|F|1994-10-07|1994-10-11|1994-10-26|DELIVER IN PERSON|TRUCK|osits. furiousl +37536|813|47|6|35|59983.35|0.09|0.03|A|F|1994-12-09|1994-11-22|1994-12-30|DELIVER IN PERSON|FOB|. pending, bold requests use after t +37537|1307|22|1|23|27790.90|0.00|0.00|A|F|1994-01-15|1994-03-03|1994-01-26|DELIVER IN PERSON|SHIP|nusual requests haggle ca +37537|317|74|2|10|12173.10|0.00|0.07|R|F|1994-01-29|1994-03-12|1994-02-26|DELIVER IN PERSON|MAIL|al packages about the ironic foxes cajole a +37537|1323|100|3|7|8570.24|0.02|0.06|A|F|1994-02-14|1994-03-30|1994-02-18|NONE|SHIP|yly at the slyly slow requests. express dep +37537|1658|100|4|30|46789.50|0.07|0.03|R|F|1994-03-15|1994-04-01|1994-03-18|TAKE BACK RETURN|SHIP|as nag regularly even de +37537|637|31|5|42|64580.46|0.06|0.02|A|F|1994-03-29|1994-02-17|1994-04-12|TAKE BACK RETURN|TRUCK|cuses use fluf +37538|1724|51|1|25|40643.00|0.05|0.05|N|O|1997-07-11|1997-09-07|1997-07-15|COLLECT COD|RAIL|efully packages. unusual, bold request +37538|1362|1|2|35|44217.60|0.00|0.07|N|O|1997-10-11|1997-08-08|1997-11-02|DELIVER IN PERSON|SHIP|nic requests should +37538|1422|1|3|15|19851.30|0.05|0.01|N|O|1997-10-15|1997-07-21|1997-11-14|DELIVER IN PERSON|AIR|onic pinto beans. regular deposits hagg +37538|23|99|4|36|33228.72|0.09|0.00|N|O|1997-09-21|1997-08-08|1997-09-22|NONE|SHIP| furiously even foxes. slyly quic +37539|692|93|1|47|74856.43|0.06|0.05|N|O|1997-04-12|1997-03-17|1997-05-04|NONE|RAIL|s against th +37539|1030|66|2|22|20482.66|0.03|0.07|N|O|1997-05-14|1997-04-10|1997-05-18|DELIVER IN PERSON|MAIL|ons. bravely ironic packages are fluffily b +37539|1143|44|3|38|39677.32|0.07|0.04|N|O|1997-05-30|1997-03-09|1997-06-18|NONE|RAIL|le furiously about t +37540|589|50|1|26|38729.08|0.00|0.03|N|O|1997-07-12|1997-07-11|1997-08-05|NONE|SHIP|riously special requests. furiou +37540|1527|68|2|35|49998.20|0.10|0.07|N|O|1997-06-12|1997-06-20|1997-06-16|NONE|RAIL|ending accounts x-ray among the r +37540|337|22|3|6|7423.98|0.04|0.00|N|O|1997-06-29|1997-07-08|1997-07-09|TAKE BACK RETURN|AIR|ully final requests w +37540|25|1|4|18|16650.36|0.01|0.06|N|O|1997-05-14|1997-07-06|1997-05-15|COLLECT COD|RAIL| accounts cajole q +37540|436|24|5|18|24055.74|0.01|0.08|N|O|1997-05-30|1997-08-01|1997-06-01|NONE|FOB|al ideas cajole carefully. fluffily u +37540|1660|61|6|1|1561.66|0.03|0.04|N|O|1997-08-04|1997-07-04|1997-08-23|COLLECT COD|MAIL|hely pinto bea +37541|507|68|1|2|2815.00|0.08|0.01|A|F|1993-05-30|1993-05-19|1993-06-29|COLLECT COD|FOB| according to the slowly stealt +37541|1633|34|2|37|56781.31|0.09|0.06|R|F|1993-03-22|1993-04-07|1993-04-19|TAKE BACK RETURN|RAIL|ic ideas hagg +37541|1098|69|3|30|29972.70|0.04|0.07|R|F|1993-03-03|1993-04-28|1993-03-23|TAKE BACK RETURN|REG AIR|ncies cajole thinly after the carefully +37541|155|82|4|35|36930.25|0.01|0.01|R|F|1993-05-20|1993-05-14|1993-06-15|TAKE BACK RETURN|MAIL|s haggle furiously. +37541|29|80|5|9|8361.18|0.05|0.02|A|F|1993-05-22|1993-04-03|1993-06-08|NONE|SHIP|uffily furiously unusual asymptote +37542|1691|74|1|45|71671.05|0.01|0.06|R|F|1994-10-24|1994-08-22|1994-11-09|TAKE BACK RETURN|AIR| dazzle furi +37542|927|30|2|45|82256.40|0.09|0.06|A|F|1994-08-26|1994-08-23|1994-09-02|NONE|MAIL|sly special deposits affix fluffily accord +37542|1485|86|3|29|40207.92|0.01|0.08|R|F|1994-10-11|1994-10-15|1994-11-08|TAKE BACK RETURN|TRUCK|l accounts integrate packages. +37542|954|57|4|3|5564.85|0.07|0.08|R|F|1994-08-29|1994-10-07|1994-09-01|DELIVER IN PERSON|MAIL| patterns. slyly even +37542|1602|44|5|32|48115.20|0.01|0.05|R|F|1994-08-05|1994-09-12|1994-08-16|COLLECT COD|TRUCK|haggle slyly furiously ironic account +37542|1726|11|6|47|76502.84|0.00|0.08|A|F|1994-10-26|1994-09-22|1994-11-20|DELIVER IN PERSON|TRUCK|ve the blithely final instructions! blithel +37543|1255|67|1|34|39312.50|0.01|0.04|A|F|1992-04-27|1992-03-12|1992-05-09|DELIVER IN PERSON|FOB| quickly even, ruthless depo +37543|1244|45|2|17|19469.08|0.10|0.05|R|F|1992-04-11|1992-02-11|1992-04-29|TAKE BACK RETURN|MAIL|ronic excuses. regular, regu +37543|1801|88|3|45|76626.00|0.06|0.01|R|F|1992-03-14|1992-03-02|1992-03-27|COLLECT COD|SHIP| pinto beans. +37543|1169|6|4|23|24613.68|0.04|0.06|A|F|1992-02-07|1992-03-16|1992-02-26|COLLECT COD|SHIP|regular sheaves. blithely regular excuses +37543|237|38|5|10|11372.30|0.05|0.05|A|F|1992-03-09|1992-03-11|1992-04-07|DELIVER IN PERSON|SHIP|deposits. +37568|696|59|1|11|17563.59|0.10|0.01|N|O|1996-10-09|1996-11-05|1996-10-31|TAKE BACK RETURN|SHIP|dolites sleep slyly. blith +37569|1978|79|1|14|26319.58|0.08|0.00|R|F|1994-06-29|1994-08-02|1994-07-09|DELIVER IN PERSON|RAIL|ide the ideas. final requests x-ray agains +37569|1439|79|2|34|45574.62|0.01|0.07|R|F|1994-07-27|1994-07-27|1994-08-19|NONE|REG AIR|s. deposits nag carefully never unu +37569|690|53|3|6|9544.14|0.09|0.06|A|F|1994-07-05|1994-07-18|1994-08-04|DELIVER IN PERSON|TRUCK|riously ex +37569|1701|86|4|29|46478.30|0.04|0.02|A|F|1994-10-08|1994-08-16|1994-10-09|NONE|SHIP| regular requests doubt slyly across th +37569|1327|28|5|8|9826.56|0.00|0.04|A|F|1994-09-23|1994-08-19|1994-10-08|COLLECT COD|RAIL|ly regular tithes x- +37570|783|80|1|17|28624.26|0.09|0.02|N|F|1995-06-01|1995-04-14|1995-06-23|NONE|FOB|lets sublate furiously bo +37570|579|80|2|49|72498.93|0.05|0.00|A|F|1995-05-15|1995-05-05|1995-06-02|TAKE BACK RETURN|FOB|nding excuses. unusual deposits +37571|29|55|1|46|42734.92|0.04|0.01|N|O|1998-06-20|1998-07-21|1998-07-17|TAKE BACK RETURN|RAIL|lly quickly even accounts. platelets a +37571|1923|12|2|45|82121.40|0.06|0.01|N|O|1998-09-10|1998-07-27|1998-10-01|NONE|MAIL|usly. Tire +37571|758|55|3|42|69667.50|0.07|0.03|N|O|1998-09-24|1998-07-18|1998-10-04|DELIVER IN PERSON|RAIL|t the carefully regular requests. +37572|454|55|1|24|32506.80|0.04|0.04|R|F|1993-11-17|1993-09-06|1993-12-10|TAKE BACK RETURN|AIR|egrate after the unusual depende +37572|110|89|2|40|40404.40|0.09|0.08|A|F|1993-11-25|1993-09-07|1993-12-13|TAKE BACK RETURN|RAIL|according to the final, pending accounts. +37572|130|31|3|10|10301.30|0.06|0.07|A|F|1993-09-05|1993-09-11|1993-09-06|COLLECT COD|AIR| requests nag slyly blithely b +37572|168|95|4|14|14954.24|0.09|0.06|A|F|1993-08-25|1993-10-18|1993-09-21|DELIVER IN PERSON|FOB|sual sentiments. carefully bold ideas +37572|891|58|5|18|32254.02|0.10|0.06|A|F|1993-10-19|1993-09-30|1993-10-26|DELIVER IN PERSON|SHIP|lly express ins +37572|866|66|6|28|49472.08|0.07|0.07|A|F|1993-08-05|1993-09-14|1993-08-22|DELIVER IN PERSON|REG AIR|es according to the silent deposits haggle +37573|1590|71|1|12|17899.08|0.09|0.00|N|O|1996-07-12|1996-08-19|1996-07-21|COLLECT COD|REG AIR|t the slyl +37573|1875|76|2|32|56859.84|0.05|0.05|N|O|1996-06-12|1996-07-16|1996-06-14|TAKE BACK RETURN|FOB|e dolphins. requests wak +37573|1568|69|3|42|61721.52|0.03|0.01|N|O|1996-07-13|1996-07-27|1996-07-25|COLLECT COD|RAIL|accounts integrate instr +37573|682|14|4|25|39567.00|0.02|0.03|N|O|1996-08-17|1996-08-20|1996-08-31|COLLECT COD|SHIP|ts affix. quickly even sheaves ab +37573|1596|77|5|50|74879.50|0.03|0.06|N|O|1996-07-24|1996-08-16|1996-08-10|DELIVER IN PERSON|FOB|ckages among the +37573|1010|11|6|19|17309.19|0.05|0.08|N|O|1996-08-12|1996-07-21|1996-08-13|COLLECT COD|REG AIR|oxes breach alon +37574|178|31|1|49|52830.33|0.02|0.02|R|F|1994-10-10|1994-08-05|1994-11-04|DELIVER IN PERSON|RAIL|al pinto beans wake carefully regular req +37575|619|51|1|41|62304.01|0.02|0.01|N|O|1997-08-18|1997-08-22|1997-09-07|NONE|MAIL|eas cajole furiously. pending +37575|1037|73|2|18|16884.54|0.06|0.05|N|O|1997-08-22|1997-07-07|1997-09-06|NONE|SHIP| dependencies. carefully final instruc +37575|1985|30|3|29|54722.42|0.09|0.06|N|O|1997-06-04|1997-08-16|1997-06-13|DELIVER IN PERSON|AIR|es use around the carefully fin +37575|612|6|4|11|16638.71|0.03|0.01|N|O|1997-08-15|1997-08-22|1997-09-14|DELIVER IN PERSON|SHIP|urts across the even, fina +37575|629|61|5|29|44358.98|0.09|0.04|N|O|1997-06-07|1997-08-08|1997-06-24|DELIVER IN PERSON|AIR| foxes. furiously un +37575|876|77|6|35|62190.45|0.02|0.07|N|O|1997-07-26|1997-07-21|1997-08-18|COLLECT COD|TRUCK|according to the express +37575|394|95|7|25|32359.75|0.08|0.02|N|O|1997-06-01|1997-06-29|1997-06-21|COLLECT COD|TRUCK|uffily ironic theodolites. fina +37600|1630|13|1|11|16847.93|0.05|0.01|R|F|1993-04-24|1993-05-06|1993-04-30|TAKE BACK RETURN|AIR|, silent dugouts. carefully +37601|639|40|1|26|40030.38|0.09|0.05|R|F|1992-08-01|1992-08-25|1992-08-20|DELIVER IN PERSON|REG AIR|bove the multip +37602|355|84|1|47|59001.45|0.01|0.07|N|O|1998-11-04|1998-08-29|1998-11-22|COLLECT COD|FOB|unts wake closely. slyly +37602|1480|59|2|23|31774.04|0.09|0.01|N|O|1998-10-18|1998-10-08|1998-11-16|DELIVER IN PERSON|TRUCK|he enticingly e +37602|1974|63|3|37|69410.89|0.09|0.01|N|O|1998-11-14|1998-08-31|1998-11-21|TAKE BACK RETURN|FOB|ely idle decoys use fluf +37602|571|72|4|29|42675.53|0.08|0.04|N|O|1998-10-07|1998-09-13|1998-11-04|COLLECT COD|REG AIR|unusual requests detect. fin +37602|371|72|5|44|55940.28|0.06|0.06|N|O|1998-10-26|1998-09-05|1998-11-01|COLLECT COD|TRUCK|s-- slyly silent ac +37602|775|72|6|41|68706.57|0.02|0.05|N|O|1998-07-29|1998-09-12|1998-08-01|COLLECT COD|SHIP|refully pending deposits k +37603|914|15|1|39|70781.49|0.10|0.05|R|F|1994-02-26|1994-02-02|1994-03-12|DELIVER IN PERSON|AIR|nding packages. final fo +37603|726|59|2|22|35787.84|0.04|0.07|R|F|1993-11-27|1994-01-18|1993-12-10|NONE|RAIL|was dolphins. f +37603|650|51|3|32|49620.80|0.06|0.00|A|F|1994-02-19|1994-01-04|1994-03-06|COLLECT COD|MAIL|olites. slyly u +37603|342|71|4|17|21119.78|0.02|0.02|R|F|1993-12-04|1994-01-23|1993-12-31|NONE|RAIL|ependencies ar +37603|879|13|5|13|23138.31|0.06|0.02|A|F|1994-03-08|1994-02-11|1994-03-25|DELIVER IN PERSON|REG AIR|e fluffily after the quickly regular +37603|1490|91|6|13|18089.37|0.10|0.06|R|F|1994-01-28|1994-01-31|1994-01-30|TAKE BACK RETURN|REG AIR|ust impress blithely. carefully final ins +37603|340|25|7|15|18605.10|0.05|0.02|A|F|1994-02-07|1994-01-17|1994-02-25|TAKE BACK RETURN|REG AIR| among the regular depo +37604|1824|11|1|38|65581.16|0.00|0.02|N|O|1997-08-08|1997-07-06|1997-08-25|COLLECT COD|MAIL|ts after the packages detect against th +37604|422|10|2|11|14546.62|0.10|0.03|N|O|1997-07-09|1997-07-16|1997-07-13|TAKE BACK RETURN|REG AIR| platelets sleep quickly abo +37604|137|64|3|35|36299.55|0.06|0.04|N|O|1997-08-24|1997-08-11|1997-09-12|DELIVER IN PERSON|REG AIR|usly regular +37604|597|28|4|11|16473.49|0.03|0.02|N|O|1997-07-24|1997-08-02|1997-08-17|DELIVER IN PERSON|REG AIR| packages. blithe +37605|1318|33|1|14|17070.34|0.06|0.07|A|F|1992-04-07|1992-05-17|1992-04-14|TAKE BACK RETURN|REG AIR|the special, pending accounts. c +37605|1628|52|2|3|4588.86|0.03|0.07|A|F|1992-05-18|1992-05-02|1992-05-23|NONE|RAIL|l deposits. carefully express instructions +37605|379|8|3|50|63968.50|0.01|0.04|R|F|1992-04-13|1992-05-15|1992-04-21|TAKE BACK RETURN|MAIL|ajole blithely furiously +37605|1830|31|4|8|13854.64|0.06|0.06|R|F|1992-07-08|1992-05-09|1992-08-02|COLLECT COD|TRUCK|nstructions sleep after the f +37605|724|89|5|42|68238.24|0.05|0.05|R|F|1992-04-20|1992-05-22|1992-05-20|NONE|RAIL|eat carefully blithely pe +37606|1012|83|1|24|21912.24|0.04|0.07|R|F|1993-06-05|1993-04-29|1993-06-09|TAKE BACK RETURN|REG AIR|ons nag slyl +37606|948|17|2|28|51770.32|0.10|0.05|A|F|1993-04-21|1993-03-31|1993-05-13|NONE|FOB|ironic, ironic packages wake b +37606|1805|35|3|37|63151.60|0.00|0.04|A|F|1993-05-06|1993-04-03|1993-06-03|NONE|MAIL|al requests are daringly. ironic fo +37606|1633|34|4|50|76731.50|0.00|0.07|A|F|1993-05-06|1993-05-15|1993-05-31|DELIVER IN PERSON|RAIL| engage ironic, +37606|57|33|5|14|13398.70|0.02|0.04|A|F|1993-04-16|1993-03-26|1993-05-05|DELIVER IN PERSON|MAIL|final theodolit +37606|1407|86|6|1|1308.40|0.04|0.04|R|F|1993-06-01|1993-05-01|1993-06-14|NONE|MAIL|ronic, regular ideas cou +37607|1506|27|1|40|56300.00|0.08|0.08|N|O|1997-09-12|1997-10-31|1997-10-05|TAKE BACK RETURN|MAIL|iously carefully +37607|1301|16|2|12|14427.60|0.06|0.02|N|O|1997-09-25|1997-10-15|1997-10-02|NONE|AIR|. deposits wake quickly. blithe pack +37607|840|41|3|24|41780.16|0.05|0.03|N|O|1997-12-01|1997-10-28|1997-12-10|NONE|RAIL|al sauternes slee +37607|311|96|4|6|7267.86|0.07|0.06|N|O|1997-10-25|1997-10-24|1997-11-03|DELIVER IN PERSON|AIR|ake. blithely careful packages engag +37607|292|74|5|9|10730.61|0.01|0.08|N|O|1997-10-14|1997-11-02|1997-11-08|NONE|MAIL|nic accoun +37607|1929|18|6|40|73236.80|0.06|0.03|N|O|1997-09-08|1997-10-02|1997-10-07|COLLECT COD|REG AIR|ts wake final, regular requests. +37607|600|91|7|50|75030.00|0.02|0.00|N|O|1997-10-13|1997-11-14|1997-11-01|DELIVER IN PERSON|TRUCK|ions cajole slyly. expre +37632|59|10|1|35|33566.75|0.02|0.08|N|O|1996-04-09|1996-03-01|1996-04-16|NONE|RAIL| wake carefully: platelets integrate qu +37632|1066|72|2|24|23209.44|0.01|0.04|N|O|1996-01-28|1996-02-14|1996-02-11|COLLECT COD|SHIP| quickly bold deposits sleep f +37632|215|43|3|30|33456.30|0.00|0.00|N|O|1996-03-27|1996-03-09|1996-04-03|TAKE BACK RETURN|TRUCK| slyly deposits. slyly regular deposi +37632|976|11|4|30|56309.10|0.03|0.07|N|O|1995-12-22|1996-02-13|1996-01-03|COLLECT COD|TRUCK| fluffily regular package +37632|938|39|5|17|31261.81|0.10|0.05|N|O|1995-12-22|1996-01-14|1995-12-23|COLLECT COD|REG AIR| deposits sleep slyly regular notornis. +37633|1929|30|1|15|27463.80|0.05|0.06|N|O|1997-01-13|1997-01-29|1997-01-17|NONE|FOB|fully even instructions acco +37633|1117|90|2|25|25452.75|0.07|0.07|N|O|1997-02-16|1996-12-31|1997-02-28|TAKE BACK RETURN|RAIL|, even ideas after the sl +37634|748|81|1|35|57705.90|0.07|0.06|A|F|1992-09-18|1992-06-22|1992-10-15|DELIVER IN PERSON|RAIL|int blithely abo +37634|240|41|2|31|35347.44|0.08|0.08|A|F|1992-09-08|1992-07-09|1992-10-01|NONE|FOB|ts. slyly final cour +37634|947|16|3|20|36958.80|0.01|0.02|R|F|1992-06-14|1992-08-11|1992-06-21|DELIVER IN PERSON|RAIL|ages haggle quickly theodoli +37635|1424|42|1|5|6627.10|0.03|0.08|N|O|1997-04-18|1997-05-08|1997-04-27|COLLECT COD|REG AIR|sits. furiously even accounts w +37635|1161|70|2|46|48859.36|0.07|0.06|N|O|1997-06-25|1997-04-04|1997-07-24|NONE|TRUCK|e silently alongside o +37636|1593|74|1|18|26902.62|0.02|0.06|N|O|1996-09-30|1996-08-29|1996-10-21|NONE|FOB| boost furiously even packages. r +37636|115|42|2|48|48725.28|0.04|0.03|N|O|1996-11-01|1996-09-20|1996-11-05|NONE|FOB|nusual pack +37636|853|87|3|39|68400.15|0.09|0.03|N|O|1996-10-12|1996-09-28|1996-11-03|NONE|TRUCK|. final platelets sleep. ironic +37637|8|84|1|17|15436.00|0.00|0.01|A|F|1994-06-25|1994-05-27|1994-07-03|TAKE BACK RETURN|SHIP|ng requests haggle fluffily a +37637|1046|17|2|35|33146.40|0.08|0.04|R|F|1994-05-08|1994-04-22|1994-05-21|TAKE BACK RETURN|SHIP|y final instructions. fu +37637|1245|46|3|30|34387.20|0.07|0.03|R|F|1994-04-05|1994-06-09|1994-04-25|COLLECT COD|AIR| pending excuses wake furiously d +37637|1390|5|4|11|14205.29|0.00|0.04|R|F|1994-04-29|1994-04-22|1994-05-02|NONE|SHIP|riously regular asymptotes. fu +37637|1359|60|5|32|40331.20|0.04|0.06|R|F|1994-06-10|1994-04-20|1994-06-12|TAKE BACK RETURN|RAIL|oach across the pending, pending +37637|1735|62|6|21|34371.33|0.05|0.02|A|F|1994-04-24|1994-05-31|1994-05-17|DELIVER IN PERSON|TRUCK|aring deposits hinder slyly arou +37638|393|78|1|4|5173.56|0.02|0.04|R|F|1994-02-06|1994-03-26|1994-02-28|DELIVER IN PERSON|SHIP|quickly quiet req +37638|723|56|2|19|30850.68|0.05|0.01|A|F|1994-03-04|1994-03-19|1994-03-17|TAKE BACK RETURN|TRUCK|quests haggle. carefully ironic in +37638|990|91|3|46|86985.54|0.08|0.03|A|F|1994-05-19|1994-04-19|1994-05-20|TAKE BACK RETURN|TRUCK|nto beans are fur +37639|812|13|1|46|78789.26|0.06|0.08|N|O|1996-04-07|1996-04-30|1996-04-22|TAKE BACK RETURN|RAIL|s the unusual +37639|1958|47|2|22|40918.90|0.02|0.07|N|O|1996-04-21|1996-04-17|1996-04-24|COLLECT COD|FOB|s. ironic sen +37664|285|13|1|39|46225.92|0.09|0.00|R|F|1995-01-30|1994-12-18|1995-02-01|DELIVER IN PERSON|MAIL|o the final, express notornis +37664|1433|51|2|46|61383.78|0.03|0.08|R|F|1995-01-30|1994-12-17|1995-02-04|COLLECT COD|FOB|busy, bold instructions impress idly +37664|789|90|3|46|77729.88|0.01|0.08|R|F|1994-12-22|1994-11-17|1995-01-16|DELIVER IN PERSON|FOB|ely quickly ironic +37664|1816|3|4|21|36074.01|0.08|0.06|A|F|1994-10-12|1994-11-15|1994-11-07|NONE|TRUCK|ainst the blithely final ac +37665|1117|26|1|15|15271.65|0.06|0.05|N|O|1996-11-16|1996-12-18|1996-12-04|TAKE BACK RETURN|MAIL|ts cajole carefully bold packages. the +37665|128|55|2|38|39068.56|0.01|0.05|N|O|1997-01-25|1996-12-24|1997-01-28|DELIVER IN PERSON|MAIL| cajole blithely? even platelets acco +37665|700|1|3|34|54423.80|0.06|0.06|N|O|1996-12-22|1997-01-12|1996-12-28|DELIVER IN PERSON|RAIL|ely about the c +37666|1905|6|1|6|10841.40|0.08|0.05|N|O|1997-06-21|1997-08-12|1997-07-21|COLLECT COD|FOB|e slyly pending reque +37666|1087|88|2|45|44463.60|0.00|0.07|N|O|1997-06-30|1997-07-28|1997-07-15|TAKE BACK RETURN|TRUCK|sleep fluffily about the accounts. unusua +37666|873|7|3|20|35477.40|0.01|0.06|N|O|1997-07-27|1997-07-14|1997-08-20|DELIVER IN PERSON|RAIL|realms. special, ir +37666|1177|50|4|4|4312.68|0.00|0.01|N|O|1997-07-19|1997-08-08|1997-08-01|NONE|TRUCK| slyly regul +37666|586|47|5|23|34191.34|0.07|0.02|N|O|1997-09-24|1997-08-27|1997-10-23|DELIVER IN PERSON|REG AIR|usly regular theodolites will haggle. +37666|1696|20|6|40|63907.60|0.04|0.07|N|O|1997-06-11|1997-08-13|1997-06-21|COLLECT COD|FOB| furiously pending accounts cajole +37667|1271|72|1|11|12894.97|0.05|0.08|N|O|1996-02-01|1996-02-16|1996-02-15|COLLECT COD|AIR|its. slyly bold ideas sleep furious +37667|486|45|2|33|45753.84|0.05|0.00|N|O|1996-01-15|1996-02-04|1996-02-07|TAKE BACK RETURN|REG AIR|ing to the furiousl +37667|1625|26|3|1|1526.62|0.07|0.02|N|O|1996-03-29|1996-01-16|1996-04-11|DELIVER IN PERSON|MAIL|the accounts. caref +37667|653|47|4|41|63699.65|0.05|0.06|N|O|1995-12-21|1996-01-04|1996-01-09|COLLECT COD|MAIL|eodolites haggle furiously ruthlessly bo +37667|1764|7|5|19|31649.44|0.03|0.04|N|O|1996-03-25|1996-01-11|1996-04-21|TAKE BACK RETURN|AIR|egular instructions sleep +37668|227|82|1|43|48470.46|0.01|0.08|R|F|1993-03-13|1993-03-29|1993-04-05|NONE|MAIL|ns wake bold excuses. packages cajo +37668|657|20|2|46|71651.90|0.01|0.01|A|F|1993-04-23|1993-02-21|1993-04-26|DELIVER IN PERSON|SHIP|tside the final theodoli +37668|134|13|3|28|28955.64|0.05|0.04|R|F|1993-03-03|1993-03-14|1993-04-02|NONE|TRUCK|pinto beans. fur +37669|539|40|1|41|59020.73|0.04|0.01|R|F|1994-02-25|1993-12-05|1994-03-15|NONE|FOB|y final ac +37669|958|59|2|32|59486.40|0.05|0.00|R|F|1993-11-14|1994-01-23|1993-11-24|COLLECT COD|RAIL|inal packages nag +37669|897|64|3|12|21574.68|0.10|0.02|A|F|1993-12-24|1993-12-20|1994-01-03|NONE|MAIL|ronic accounts sleep +37669|291|19|4|29|34547.41|0.01|0.05|R|F|1993-11-09|1994-01-23|1993-11-20|DELIVER IN PERSON|SHIP|lent deposits. silent asy +37669|549|50|5|34|49284.36|0.02|0.05|R|F|1994-02-27|1993-12-31|1994-03-20|NONE|RAIL|y ironic deposits +37669|504|35|6|21|29494.50|0.05|0.03|A|F|1993-12-31|1994-01-02|1994-01-08|NONE|AIR|ely final ac +37670|1181|82|1|14|15150.52|0.02|0.02|N|O|1996-01-29|1996-03-15|1996-02-21|COLLECT COD|FOB| express warthogs. +37671|21|47|1|21|19341.42|0.02|0.07|A|F|1993-09-20|1993-09-25|1993-09-23|DELIVER IN PERSON|SHIP|l requests. slyly fina +37696|1140|77|1|16|16658.24|0.06|0.07|R|F|1994-09-02|1994-09-15|1994-09-18|NONE|FOB|ckly after the furiously silent pinto bea +37696|37|63|2|27|25299.81|0.04|0.03|A|F|1994-09-22|1994-08-29|1994-09-30|NONE|SHIP|thely furiously +37696|1603|4|3|2|3009.20|0.00|0.07|R|F|1994-09-29|1994-09-13|1994-10-28|DELIVER IN PERSON|REG AIR|es haggle thinly +37696|1083|54|4|1|984.08|0.05|0.06|R|F|1994-10-13|1994-10-04|1994-10-31|DELIVER IN PERSON|RAIL|r pinto beans. final packages serve blit +37696|15|91|5|28|25620.28|0.02|0.08|R|F|1994-10-05|1994-10-04|1994-10-19|TAKE BACK RETURN|FOB|ress, final p +37697|963|64|1|6|11183.76|0.04|0.08|R|F|1993-01-14|1993-02-15|1993-01-17|DELIVER IN PERSON|FOB|s. carefully unusual acc +37698|1423|41|1|43|56950.06|0.09|0.07|N|O|1996-12-30|1996-12-10|1997-01-11|NONE|RAIL|ests haggle: blithely +37698|527|18|2|1|1427.52|0.10|0.01|N|O|1996-12-27|1996-12-24|1996-12-30|DELIVER IN PERSON|REG AIR|refully careful +37699|1423|24|1|46|60923.32|0.04|0.03|N|O|1995-09-16|1995-11-08|1995-10-14|NONE|SHIP|c ideas alongside of the even ideas +37699|420|21|2|39|51496.38|0.07|0.06|N|O|1995-10-31|1995-11-08|1995-11-24|COLLECT COD|FOB|- silent request +37699|245|73|3|5|5726.20|0.02|0.05|N|O|1995-10-19|1995-11-19|1995-11-09|TAKE BACK RETURN|REG AIR|instructions. blithely final d +37700|1277|78|1|28|32991.56|0.10|0.02|R|F|1995-04-06|1995-02-19|1995-05-06|TAKE BACK RETURN|SHIP| requests? final, regular packages cajole +37700|1331|70|2|17|20949.61|0.00|0.05|A|F|1995-02-10|1995-03-01|1995-03-04|COLLECT COD|TRUCK|to beans nag accord +37700|669|63|3|4|6278.64|0.05|0.04|A|F|1995-01-14|1995-01-31|1995-02-07|TAKE BACK RETURN|MAIL|sts wake carefully ironic frays. fluf +37700|1220|58|4|11|12333.42|0.02|0.05|A|F|1995-01-26|1995-02-11|1995-02-19|COLLECT COD|TRUCK|al instructions are car +37701|881|82|1|45|80184.60|0.05|0.04|N|O|1997-05-27|1997-06-04|1997-06-03|NONE|REG AIR|l excuses haggle slyly +37701|471|1|2|22|30172.34|0.01|0.06|N|O|1997-07-27|1997-05-03|1997-07-30|TAKE BACK RETURN|REG AIR|r excuses. sly +37701|1344|21|3|33|41096.22|0.01|0.03|N|O|1997-07-05|1997-05-30|1997-07-22|DELIVER IN PERSON|RAIL|kages cajole quickly even pinto beans. sl +37702|1195|68|1|6|6577.14|0.04|0.02|N|O|1995-06-25|1995-07-22|1995-07-01|COLLECT COD|SHIP|al requests. final courts ca +37703|1995|96|1|39|73982.61|0.03|0.07|N|O|1995-12-27|1996-01-24|1996-01-24|DELIVER IN PERSON|AIR|he blithely express asymptotes. furiousl +37703|693|25|2|28|44623.32|0.08|0.06|N|O|1996-01-01|1996-02-25|1996-01-16|NONE|REG AIR|onic, unusual excuses boost doggedl +37703|1942|31|3|46|84821.24|0.03|0.00|N|O|1996-04-07|1996-01-28|1996-04-16|NONE|SHIP|ecial packages are. foxes haggl +37703|1318|57|4|18|21947.58|0.10|0.01|N|O|1995-12-27|1996-03-05|1996-01-10|COLLECT COD|AIR|s affix blithely about the carefully +37703|1537|18|5|2|2877.06|0.05|0.07|N|O|1996-02-08|1996-02-02|1996-03-07|COLLECT COD|REG AIR|thely final a +37728|1690|73|1|49|77992.81|0.09|0.01|N|O|1998-08-14|1998-09-27|1998-09-09|COLLECT COD|TRUCK| the special platelets use blit +37728|1294|32|2|33|39444.57|0.07|0.02|N|O|1998-10-12|1998-10-13|1998-10-17|NONE|TRUCK|n requests cajole account +37728|1587|28|3|27|40191.66|0.08|0.00|N|O|1998-10-10|1998-09-05|1998-10-18|TAKE BACK RETURN|FOB|ing packages are ca +37728|1530|11|4|26|37219.78|0.10|0.05|N|O|1998-09-06|1998-10-02|1998-09-07|TAKE BACK RETURN|MAIL|its haggle furiously bold, close +37728|1808|38|5|23|39325.40|0.09|0.01|N|O|1998-08-27|1998-09-08|1998-09-05|TAKE BACK RETURN|FOB|olites! furio +37728|1623|65|6|27|41164.74|0.05|0.08|N|O|1998-08-09|1998-10-25|1998-08-28|COLLECT COD|MAIL|g deposits. furiously express acco +37728|420|8|7|9|11883.78|0.00|0.06|N|O|1998-08-20|1998-09-04|1998-08-25|TAKE BACK RETURN|REG AIR|furiously express deposits. sile +37729|752|53|1|35|57846.25|0.08|0.02|R|F|1994-04-15|1994-02-23|1994-04-27|NONE|RAIL|ound the regular, permanent asymp +37729|624|25|2|34|51837.08|0.02|0.01|A|F|1994-04-29|1994-02-19|1994-05-19|DELIVER IN PERSON|SHIP|e about the regularly pending ideas. bold +37729|434|93|3|17|22685.31|0.02|0.01|R|F|1994-03-08|1994-04-05|1994-03-25|TAKE BACK RETURN|FOB|od above th +37730|377|78|1|34|43430.58|0.02|0.00|A|F|1994-05-10|1994-06-23|1994-05-31|NONE|FOB|s deposits. +37730|1634|58|2|21|32248.23|0.02|0.08|A|F|1994-06-24|1994-07-08|1994-07-12|DELIVER IN PERSON|REG AIR|g packages wake carefully +37730|1883|70|3|41|73180.08|0.01|0.05|A|F|1994-07-11|1994-06-27|1994-07-17|DELIVER IN PERSON|FOB|pending requests boost +37730|1823|10|4|42|72442.44|0.06|0.03|A|F|1994-05-24|1994-07-17|1994-06-02|DELIVER IN PERSON|TRUCK|refully careful d +37731|1709|36|1|27|43488.90|0.08|0.06|R|F|1995-02-06|1995-01-10|1995-02-09|TAKE BACK RETURN|REG AIR| special deposits detect caref +37731|343|28|2|43|53463.62|0.01|0.07|A|F|1995-01-12|1994-12-11|1995-02-01|DELIVER IN PERSON|SHIP| detect against the sl +37731|922|25|3|29|52864.68|0.07|0.00|R|F|1995-02-27|1994-12-25|1995-03-14|NONE|RAIL|ly pending foxes above the care +37731|155|34|4|10|10551.50|0.09|0.07|R|F|1994-11-07|1994-12-29|1994-12-04|DELIVER IN PERSON|AIR|ts. deposits haggle fluffily +37731|244|99|5|29|33182.96|0.03|0.05|R|F|1995-01-14|1995-01-13|1995-01-25|DELIVER IN PERSON|RAIL|ly ironic +37732|1065|1|1|30|28981.80|0.01|0.04|N|O|1996-05-28|1996-07-08|1996-05-30|COLLECT COD|SHIP|l foxes use furiously accounts. blithely u +37732|434|64|2|2|2668.86|0.01|0.02|N|O|1996-08-13|1996-06-22|1996-09-07|TAKE BACK RETURN|REG AIR|t the furio +37733|318|3|1|21|25584.51|0.05|0.01|A|F|1992-06-12|1992-06-25|1992-06-15|TAKE BACK RETURN|TRUCK| realms are slyly. silent accounts are idl +37733|454|13|2|46|62304.70|0.09|0.07|R|F|1992-09-20|1992-07-17|1992-09-30|NONE|REG AIR|uriously al +37733|1477|95|3|31|42732.57|0.05|0.02|A|F|1992-07-13|1992-07-14|1992-07-24|NONE|RAIL|he furiously regular +37734|1421|39|1|48|63476.16|0.06|0.02|A|F|1995-04-16|1995-02-16|1995-04-30|COLLECT COD|SHIP|s haggle above the fluffily even foxes. +37734|1692|93|2|41|65341.29|0.06|0.01|A|F|1995-04-26|1995-03-13|1995-05-11|DELIVER IN PERSON|FOB|lithely. fluffily blithe dependencies +37734|1973|62|3|18|33749.46|0.05|0.04|R|F|1995-01-11|1995-03-23|1995-01-30|COLLECT COD|REG AIR| carefully final +37734|341|70|4|5|6206.70|0.02|0.06|A|F|1995-04-23|1995-03-03|1995-05-20|NONE|AIR|ar, regular +37734|830|31|5|45|77887.35|0.01|0.03|A|F|1995-04-15|1995-02-26|1995-04-26|DELIVER IN PERSON|MAIL|cial packages cajole fluffily at the foxes. +37734|194|95|6|15|16412.85|0.03|0.01|R|F|1995-01-09|1995-02-23|1995-01-12|COLLECT COD|SHIP| regular acco +37735|593|24|1|30|44807.70|0.00|0.01|N|O|1998-10-05|1998-09-26|1998-10-25|TAKE BACK RETURN|RAIL|ietly quickly final de +37760|1968|1|1|11|20569.56|0.04|0.03|R|F|1994-11-16|1994-10-02|1994-11-25|TAKE BACK RETURN|TRUCK|ly silent packages are bold +37760|1387|64|2|24|30921.12|0.07|0.00|A|F|1994-09-03|1994-09-22|1994-09-25|TAKE BACK RETURN|REG AIR|ial excuses about +37760|1947|80|3|13|24036.22|0.10|0.05|R|F|1994-10-12|1994-10-01|1994-10-21|TAKE BACK RETURN|TRUCK|silent, regular acc +37760|103|4|4|49|49151.90|0.08|0.04|A|F|1994-09-01|1994-10-14|1994-09-17|NONE|AIR|y express notornis caj +37760|418|19|5|5|6592.05|0.03|0.05|R|F|1994-11-10|1994-10-06|1994-11-27|DELIVER IN PERSON|FOB|y special foxes cajole car +37760|1010|46|6|25|22775.25|0.07|0.07|A|F|1994-12-14|1994-11-08|1994-12-30|DELIVER IN PERSON|TRUCK|. blithe packages doubt dependencie +37760|15|16|7|35|32025.35|0.05|0.07|A|F|1994-09-24|1994-10-25|1994-10-16|NONE|RAIL|g the blithely final packages sleep furio +37761|44|45|1|22|20768.88|0.08|0.07|N|O|1998-09-08|1998-08-19|1998-09-12|NONE|MAIL|ckages sleep blithely bold dep +37761|1003|74|2|39|35256.00|0.01|0.03|N|O|1998-07-23|1998-09-12|1998-08-07|TAKE BACK RETURN|FOB|uriously bold dependencies +37761|1500|18|3|34|47651.00|0.07|0.01|N|O|1998-07-28|1998-09-13|1998-08-27|DELIVER IN PERSON|TRUCK|dolites. slyly regular reques +37761|1423|24|4|36|47679.12|0.02|0.05|N|O|1998-08-18|1998-09-26|1998-09-05|TAKE BACK RETURN|FOB|nstructions affix blithely. regular +37762|244|99|1|29|33182.96|0.05|0.06|R|F|1992-08-19|1992-07-12|1992-08-22|DELIVER IN PERSON|FOB|yly pending ex +37762|20|71|2|46|42320.92|0.07|0.07|R|F|1992-08-28|1992-08-16|1992-09-24|TAKE BACK RETURN|FOB|nic platelets. special dependencies haggle +37763|1511|32|1|15|21187.65|0.09|0.07|A|F|1992-03-29|1992-05-07|1992-04-28|DELIVER IN PERSON|SHIP|ffily ironic accounts sleep fluf +37763|1386|25|2|45|57932.10|0.08|0.07|A|F|1992-05-07|1992-03-18|1992-05-24|TAKE BACK RETURN|REG AIR|al packages doze fluf +37763|1143|52|3|40|41765.60|0.07|0.05|A|F|1992-06-09|1992-03-22|1992-06-14|NONE|RAIL|accounts. package +37764|68|44|1|40|38722.40|0.10|0.05|N|O|1996-12-01|1996-12-06|1996-12-18|DELIVER IN PERSON|MAIL|ole accounts. regular packages sleep carefu +37764|201|29|2|16|17619.20|0.10|0.03|N|O|1996-12-10|1996-11-26|1997-01-01|DELIVER IN PERSON|MAIL|. theodolites wake fluffily along the qu +37764|699|93|3|32|51190.08|0.08|0.00|N|O|1996-12-17|1997-01-12|1997-01-14|DELIVER IN PERSON|TRUCK|deas boost carefully. iron +37764|189|16|4|19|20694.42|0.00|0.07|N|O|1996-11-08|1996-12-05|1996-11-29|DELIVER IN PERSON|SHIP|ress pinto beans sleep carefully blithely +37764|1248|60|5|22|25283.28|0.10|0.04|N|O|1996-11-27|1997-01-02|1996-12-01|DELIVER IN PERSON|FOB|round the slyly r +37764|1015|86|6|11|10076.11|0.08|0.03|N|O|1996-12-04|1996-11-23|1997-01-01|COLLECT COD|FOB|packages alongside of the fl +37764|140|93|7|40|41605.60|0.04|0.04|N|O|1996-10-30|1996-12-27|1996-11-25|TAKE BACK RETURN|MAIL|ions. deposits cajole? fluffily fin +37765|379|64|1|42|53733.54|0.10|0.07|A|F|1992-12-29|1993-02-12|1993-01-14|TAKE BACK RETURN|FOB|s. carefully ironic reques +37765|631|32|2|33|50543.79|0.08|0.08|R|F|1992-12-04|1993-02-12|1992-12-23|NONE|TRUCK|ions serve furiousl +37765|536|67|3|42|60334.26|0.07|0.05|A|F|1992-12-16|1993-02-02|1993-01-14|DELIVER IN PERSON|AIR|accounts hang fluffily from +37765|426|27|4|20|26528.40|0.06|0.00|A|F|1993-01-20|1993-02-23|1993-02-06|COLLECT COD|RAIL|al theodolites affix. carefully regular pi +37765|860|60|5|45|79238.70|0.09|0.06|A|F|1992-12-27|1993-01-16|1992-12-30|TAKE BACK RETURN|TRUCK|ctions sleep. slyly bold excuses use- +37765|1816|17|6|22|37791.82|0.00|0.00|R|F|1993-03-19|1993-01-21|1993-04-08|DELIVER IN PERSON|AIR| instructions slee +37766|489|19|1|40|55579.20|0.06|0.05|N|O|1997-06-30|1997-07-11|1997-07-13|COLLECT COD|TRUCK|ding packages. slyly regular depend +37766|1615|57|2|33|50048.13|0.10|0.04|N|O|1997-05-22|1997-06-22|1997-06-18|TAKE BACK RETURN|SHIP|alongside of the quic +37766|1308|9|3|38|45953.40|0.10|0.05|N|O|1997-05-25|1997-06-09|1997-06-10|NONE|SHIP|ly regular ideas integrate bold r +37766|777|74|4|8|13422.16|0.09|0.03|N|O|1997-08-08|1997-06-21|1997-08-19|COLLECT COD|FOB|ctions sleep furiously past t +37766|1729|72|5|37|60336.64|0.07|0.01|N|O|1997-05-20|1997-05-29|1997-05-22|NONE|AIR|hely final pinto beans are slyly ironic a +37766|36|12|6|23|21528.69|0.06|0.03|N|O|1997-04-27|1997-06-22|1997-05-12|TAKE BACK RETURN|RAIL|s regular multi +37767|1837|24|1|5|8694.15|0.05|0.08|N|O|1996-12-16|1996-11-09|1996-12-31|DELIVER IN PERSON|REG AIR|inal requests detect blithely carefully r +37767|772|69|2|31|51855.87|0.10|0.02|N|O|1996-10-20|1996-11-05|1996-10-24|NONE|REG AIR|l pinto beans. bl +37767|246|28|3|16|18339.84|0.00|0.03|N|O|1996-11-04|1996-10-29|1996-11-28|TAKE BACK RETURN|AIR|. ironic acco +37767|481|40|4|7|9670.36|0.08|0.07|N|O|1997-01-07|1996-10-12|1997-01-15|COLLECT COD|REG AIR|s wake slyly slyly express requests. car +37767|1419|37|5|26|34330.66|0.05|0.03|N|O|1996-11-01|1996-10-15|1996-11-25|NONE|FOB| wake furiously instead of the asym +37792|1526|7|1|38|54245.76|0.07|0.07|N|O|1996-01-25|1996-02-21|1996-01-26|DELIVER IN PERSON|TRUCK|waters affix +37792|420|50|2|6|7922.52|0.04|0.06|N|O|1996-03-31|1996-03-04|1996-04-11|TAKE BACK RETURN|AIR|ully pending ideas wake. silent +37793|113|14|1|7|7091.77|0.09|0.01|R|F|1994-11-23|1995-01-14|1994-12-19|COLLECT COD|TRUCK|rs. slyly ironic +37793|801|1|2|38|64668.40|0.09|0.07|R|F|1994-11-30|1995-01-08|1994-12-27|NONE|AIR| haggle at the slyly final re +37793|538|99|3|2|2877.06|0.09|0.03|A|F|1995-03-10|1994-12-30|1995-03-15|DELIVER IN PERSON|AIR|ong the quickly ironic instructions. +37794|943|12|1|10|18439.40|0.04|0.04|R|F|1994-05-30|1994-06-05|1994-06-23|COLLECT COD|REG AIR|hely regular deposit +37794|950|85|2|25|46273.75|0.05|0.07|A|F|1994-06-25|1994-05-22|1994-07-20|DELIVER IN PERSON|SHIP|hely furiously pending waters. fluffi +37794|1302|17|3|38|45725.40|0.00|0.04|A|F|1994-06-20|1994-04-26|1994-07-04|COLLECT COD|FOB|t furiously across the carefully express +37794|1227|2|4|45|50769.90|0.06|0.02|R|F|1994-07-09|1994-05-12|1994-08-05|DELIVER IN PERSON|FOB|s! blithely +37795|1040|46|1|3|2823.12|0.05|0.06|A|F|1993-12-16|1994-01-17|1994-01-01|COLLECT COD|MAIL|r, final packa +37795|221|76|2|10|11212.20|0.01|0.06|A|F|1993-11-07|1994-01-07|1993-11-12|NONE|MAIL|ments affix quickly +37795|926|29|3|1|1826.92|0.04|0.02|R|F|1994-01-25|1993-12-29|1994-01-29|DELIVER IN PERSON|SHIP| regular deposits. unusual, busy dependenc +37796|1257|32|1|33|38222.25|0.03|0.04|A|F|1995-02-26|1995-01-04|1995-03-08|TAKE BACK RETURN|TRUCK|eans. blithely ironic +37796|1638|80|2|25|38490.75|0.01|0.03|A|F|1995-01-18|1994-12-11|1995-01-23|COLLECT COD|TRUCK|ts. daringly e +37797|164|65|1|31|32988.96|0.01|0.03|A|F|1992-06-10|1992-04-19|1992-07-08|COLLECT COD|FOB|fily regular accounts aga +37797|1625|8|2|5|7633.10|0.01|0.05|A|F|1992-05-10|1992-03-30|1992-05-31|TAKE BACK RETURN|REG AIR|ntegrate furiously +37797|667|61|3|34|53300.44|0.01|0.06|A|F|1992-06-07|1992-04-04|1992-06-30|DELIVER IN PERSON|TRUCK|egular, unusual +37797|259|41|4|38|44051.50|0.10|0.00|R|F|1992-02-25|1992-05-18|1992-03-02|COLLECT COD|REG AIR|furiously special depth +37798|770|71|1|41|68501.57|0.05|0.04|R|F|1993-01-04|1992-12-25|1993-01-17|DELIVER IN PERSON|SHIP|s wake slyly according to the dependen +37798|69|45|2|6|5814.36|0.07|0.06|R|F|1992-11-30|1993-02-01|1992-12-01|TAKE BACK RETURN|MAIL|lithely. even de +37798|1002|73|3|27|24381.00|0.07|0.04|A|F|1992-12-21|1992-12-09|1992-12-29|DELIVER IN PERSON|SHIP| unusual account +37798|485|73|4|8|11083.84|0.08|0.06|R|F|1992-11-23|1993-01-13|1992-12-20|DELIVER IN PERSON|SHIP|ld dependencies? final +37799|93|69|1|8|7944.72|0.10|0.01|A|F|1994-01-12|1994-01-27|1994-01-21|COLLECT COD|AIR|y pending pinto beans snooze slyly; f +37799|1330|7|2|20|24626.60|0.07|0.04|A|F|1993-11-30|1994-01-26|1993-12-17|DELIVER IN PERSON|RAIL| final asymptote +37799|112|39|3|6|6072.66|0.04|0.01|A|F|1994-01-23|1993-12-26|1994-02-17|COLLECT COD|RAIL|the furiously pending +37799|75|76|4|41|39977.87|0.07|0.05|R|F|1994-01-20|1994-01-13|1994-01-30|TAKE BACK RETURN|SHIP|ar tithes haggl +37799|1825|12|5|12|20721.84|0.00|0.06|R|F|1994-01-25|1994-01-25|1994-02-14|NONE|TRUCK|xcuses nag carefully ruthlessly eve +37824|258|40|1|38|44013.50|0.10|0.02|N|O|1998-05-01|1998-04-09|1998-05-27|DELIVER IN PERSON|REG AIR|capades. carefully even deposit +37824|1734|77|2|14|22900.22|0.08|0.04|N|O|1998-04-23|1998-04-27|1998-05-23|DELIVER IN PERSON|SHIP|cies use. +37825|558|19|1|8|11668.40|0.01|0.01|R|F|1994-10-21|1994-10-01|1994-10-29|DELIVER IN PERSON|REG AIR|. blithely special requests haggle furio +37825|1042|48|2|47|44322.88|0.03|0.04|A|F|1994-11-16|1994-10-04|1994-12-05|TAKE BACK RETURN|SHIP|ly. silent, special packages are. bol +37825|364|21|3|47|59424.92|0.08|0.01|A|F|1994-08-31|1994-09-08|1994-09-30|TAKE BACK RETURN|SHIP|s sublate according to +37825|1129|38|4|50|51506.00|0.00|0.08|A|F|1994-10-13|1994-09-13|1994-10-17|DELIVER IN PERSON|AIR|uests sleep furiously slyly bold plat +37825|221|3|5|2|2242.44|0.02|0.04|A|F|1994-08-08|1994-10-02|1994-09-04|TAKE BACK RETURN|AIR|ecial packages. enticingl +37825|1985|18|6|9|16982.82|0.02|0.03|R|F|1994-10-17|1994-10-13|1994-11-06|TAKE BACK RETURN|FOB|ct slyly slyly silent reque +37825|92|43|7|36|35715.24|0.01|0.03|R|F|1994-08-06|1994-08-30|1994-08-16|NONE|AIR| furiously. pending instr +37826|1435|53|1|8|10691.44|0.07|0.02|N|O|1995-07-29|1995-06-02|1995-08-13|COLLECT COD|FOB|quests. final deposits cajole s +37826|379|8|2|45|57571.65|0.04|0.05|N|O|1995-07-19|1995-07-16|1995-07-26|COLLECT COD|TRUCK|ironic packages. bold forges cajole careful +37826|152|31|3|8|8417.20|0.08|0.04|N|O|1995-07-23|1995-06-03|1995-08-18|NONE|AIR|s. blithely s +37826|223|5|4|31|34819.82|0.08|0.08|R|F|1995-05-24|1995-05-26|1995-06-07|DELIVER IN PERSON|AIR|slyly around th +37826|451|39|5|18|24326.10|0.02|0.04|N|F|1995-06-12|1995-06-04|1995-06-18|TAKE BACK RETURN|MAIL| nag carefully after +37826|1243|81|6|25|28606.00|0.06|0.04|R|F|1995-06-07|1995-07-17|1995-06-13|COLLECT COD|REG AIR|slyly bold accounts. regu +37827|1209|10|1|25|27755.00|0.08|0.08|N|O|1996-08-09|1996-10-14|1996-08-23|NONE|SHIP|ses detect furiously quickly regular r +37827|505|6|2|26|36543.00|0.08|0.08|N|O|1996-10-26|1996-09-25|1996-11-04|NONE|FOB|ular packages hang f +37827|168|69|3|47|50203.52|0.10|0.04|N|O|1996-11-06|1996-10-05|1996-11-16|DELIVER IN PERSON|MAIL|s wake. regular accounts +37827|1731|16|4|8|13061.84|0.10|0.07|N|O|1996-09-06|1996-10-26|1996-10-01|TAKE BACK RETURN|SHIP| use fluffily. ironic packages nod quick +37827|652|46|5|23|35710.95|0.05|0.05|N|O|1996-08-04|1996-10-27|1996-08-25|TAKE BACK RETURN|RAIL|hs. quickly regular excuses along the ev +37827|46|22|6|28|26489.12|0.04|0.02|N|O|1996-11-20|1996-09-24|1996-12-08|NONE|RAIL|ymptotes. ironic accoun +37828|403|4|1|40|52136.00|0.03|0.07|N|O|1995-07-31|1995-06-04|1995-08-25|DELIVER IN PERSON|FOB|s. ironic packages sleep furiously. quic +37828|645|39|2|20|30912.80|0.06|0.01|N|O|1995-08-07|1995-05-26|1995-09-04|NONE|FOB|totes. furiously special accounts wa +37828|1513|54|3|1|1414.51|0.02|0.00|A|F|1995-04-26|1995-06-09|1995-05-10|COLLECT COD|AIR|yly according to the slyly ironic packages +37828|518|19|4|38|53903.38|0.02|0.02|N|O|1995-08-07|1995-06-24|1995-08-22|TAKE BACK RETURN|TRUCK|unts. fluff +37828|68|44|5|15|14520.90|0.08|0.00|N|O|1995-07-17|1995-06-21|1995-07-25|TAKE BACK RETURN|MAIL|the blithely even packages. careful +37828|1053|59|6|35|33391.75|0.01|0.04|N|O|1995-07-08|1995-06-14|1995-07-13|COLLECT COD|REG AIR|ronic excuses are furiously. carefu +37829|428|58|1|1|1328.42|0.03|0.00|A|F|1993-11-20|1993-11-30|1993-12-16|NONE|AIR|nstructions. final, pending dep +37829|371|28|2|12|15256.44|0.03|0.03|R|F|1994-01-02|1993-12-22|1994-01-08|NONE|REG AIR|ideas haggle furiously among the sl +37829|1369|8|3|48|60977.28|0.03|0.00|R|F|1993-10-05|1993-12-21|1993-10-08|DELIVER IN PERSON|SHIP|e the regular +37829|1856|100|4|46|80861.10|0.05|0.05|R|F|1993-11-13|1993-12-18|1993-12-01|NONE|REG AIR|r the special, pending pinto beans! re +37829|293|94|5|50|59664.50|0.07|0.05|A|F|1993-12-03|1993-12-25|1993-12-20|TAKE BACK RETURN|REG AIR|around the slyly regular +37830|791|92|1|21|35527.59|0.01|0.01|A|F|1994-09-09|1994-11-07|1994-10-05|DELIVER IN PERSON|RAIL|usly pending packages use daringly ab +37830|104|83|2|22|22090.20|0.06|0.07|A|F|1994-11-21|1994-11-01|1994-12-16|COLLECT COD|FOB|y express s +37830|820|21|3|18|30974.76|0.08|0.02|R|F|1994-12-14|1994-09-29|1994-12-22|NONE|FOB|kly furiously regular depo +37830|651|14|4|12|18619.80|0.06|0.05|R|F|1994-09-07|1994-09-26|1994-09-09|TAKE BACK RETURN|FOB|posits haggle quickly special, r +37830|100|1|5|22|22002.20|0.01|0.04|R|F|1994-12-14|1994-10-12|1994-12-16|NONE|REG AIR| ideas will have to haggl +37831|1621|22|1|24|36542.88|0.03|0.05|A|F|1992-10-27|1992-09-13|1992-10-30|TAKE BACK RETURN|REG AIR|ckly ironic deposits. carefull +37831|1876|63|2|32|56891.84|0.04|0.03|R|F|1992-11-20|1992-09-19|1992-11-29|DELIVER IN PERSON|REG AIR|ntly ironic epitaphs. sl +37831|1609|10|3|21|31722.60|0.05|0.08|R|F|1992-11-06|1992-10-12|1992-11-28|COLLECT COD|RAIL|riously bl +37831|853|54|4|16|28061.60|0.08|0.05|A|F|1992-07-30|1992-09-26|1992-08-03|NONE|RAIL|dolites. carefully fin +37831|1682|83|5|43|68098.24|0.08|0.06|A|F|1992-09-27|1992-10-11|1992-10-11|NONE|MAIL|e the ironic depende +37831|621|22|6|46|69994.52|0.04|0.08|A|F|1992-10-20|1992-08-29|1992-11-01|NONE|RAIL|regular asy +37831|745|42|7|27|44434.98|0.02|0.08|A|F|1992-08-11|1992-09-30|1992-09-05|COLLECT COD|AIR|egular theodolites cajol +37856|154|81|1|22|23191.30|0.06|0.06|N|O|1998-03-26|1998-04-13|1998-03-28|DELIVER IN PERSON|TRUCK|ts integrate slyly. carefully regula +37857|772|73|1|10|16727.70|0.10|0.04|N|O|1997-06-23|1997-06-21|1997-06-26|NONE|AIR|s. blithely ironic asympt +37857|440|70|2|12|16085.28|0.02|0.01|N|O|1997-05-21|1997-06-09|1997-05-23|DELIVER IN PERSON|RAIL|. carefully regular ideas +37857|1392|69|3|27|34921.53|0.00|0.01|N|O|1997-06-12|1997-07-18|1997-06-23|TAKE BACK RETURN|TRUCK| sleep furiously. blithely pending decoys +37857|1040|41|4|34|31995.36|0.02|0.00|N|O|1997-06-17|1997-06-06|1997-07-11|NONE|SHIP|lites. ironic, special +37857|607|8|5|49|73872.40|0.03|0.05|N|O|1997-07-07|1997-06-02|1997-07-14|COLLECT COD|REG AIR|ular ideas +37857|278|79|6|22|25921.94|0.04|0.06|N|O|1997-08-14|1997-07-05|1997-09-06|NONE|REG AIR|s cajole carefully furiously regul +37857|1236|11|7|34|38665.82|0.01|0.00|N|O|1997-06-15|1997-06-29|1997-07-07|TAKE BACK RETURN|MAIL|nts play final ide +37858|529|20|1|18|25731.36|0.06|0.00|A|F|1993-10-07|1993-07-28|1993-11-02|DELIVER IN PERSON|AIR|ously express pinto beans accord +37859|315|16|1|28|34028.68|0.00|0.07|R|F|1994-04-06|1994-06-06|1994-04-25|COLLECT COD|SHIP|ic instructions haggle +37859|38|64|2|49|45963.47|0.06|0.05|R|F|1994-05-25|1994-04-30|1994-05-28|COLLECT COD|TRUCK|t the fluffily silent pac +37859|1064|65|3|30|28951.80|0.01|0.02|A|F|1994-07-29|1994-06-09|1994-08-12|NONE|MAIL|ts affix slyly-- regular +37859|1778|21|4|26|43674.02|0.02|0.07|R|F|1994-04-18|1994-05-03|1994-05-16|TAKE BACK RETURN|AIR| warhorses. blithely expres +37859|252|34|5|47|54155.75|0.09|0.02|R|F|1994-04-19|1994-06-01|1994-04-29|COLLECT COD|RAIL|al instruc +37859|227|28|6|1|1127.22|0.01|0.06|A|F|1994-06-11|1994-05-10|1994-07-11|NONE|RAIL|ess, final ideas acros +37860|686|80|1|30|47600.40|0.10|0.08|R|F|1993-09-02|1993-10-04|1993-09-28|TAKE BACK RETURN|TRUCK|ual ideas doze. furiously iro +37860|358|59|2|34|42783.90|0.07|0.07|A|F|1993-12-20|1993-10-01|1993-12-21|NONE|MAIL|. regular, regular pinto +37860|707|40|3|3|4823.10|0.03|0.08|R|F|1993-09-28|1993-11-17|1993-10-10|NONE|RAIL|s. express, +37860|785|82|4|45|75860.10|0.03|0.04|A|F|1993-12-03|1993-10-01|1993-12-30|COLLECT COD|SHIP|r packages. pinto beans above th +37861|122|49|1|12|12265.44|0.07|0.08|N|O|1996-03-10|1996-02-20|1996-03-18|DELIVER IN PERSON|FOB|fully even instructions. furiou +37861|1607|31|2|1|1508.60|0.10|0.08|N|O|1996-01-11|1996-01-30|1996-01-25|DELIVER IN PERSON|REG AIR|ckages haggle quickl +37861|251|6|3|20|23025.00|0.10|0.06|N|O|1996-02-06|1996-03-11|1996-02-25|COLLECT COD|AIR| slyly brave +37861|112|91|4|49|49593.39|0.10|0.02|N|O|1996-01-17|1996-03-04|1996-01-31|DELIVER IN PERSON|REG AIR| carefully even requests unwin +37861|1592|93|5|1|1493.59|0.00|0.03|N|O|1996-01-31|1996-02-19|1996-02-25|TAKE BACK RETURN|AIR|accounts haggle blithely a +37861|916|85|6|16|29070.56|0.09|0.05|N|O|1996-04-27|1996-03-27|1996-05-12|TAKE BACK RETURN|RAIL|c packages use slyly along the furi +37862|1546|27|1|16|23160.64|0.05|0.02|R|F|1994-01-15|1994-02-13|1994-02-07|COLLECT COD|REG AIR|slyly even pinto beans. slyly express packa +37862|408|67|2|20|26168.00|0.01|0.03|A|F|1994-01-15|1994-04-10|1994-01-21|COLLECT COD|MAIL|xcuses boost +37862|1568|9|3|14|20573.84|0.09|0.05|R|F|1994-02-24|1994-03-22|1994-03-25|DELIVER IN PERSON|FOB|furiously regular requests nod acros +37862|578|69|4|42|62099.94|0.05|0.02|R|F|1994-03-22|1994-02-12|1994-03-31|COLLECT COD|SHIP| asymptotes after th +37862|1773|16|5|29|48568.33|0.01|0.08|A|F|1994-02-25|1994-04-07|1994-03-22|TAKE BACK RETURN|FOB|y special requests nag carefully careful +37862|165|66|6|26|27694.16|0.02|0.07|R|F|1994-02-09|1994-03-19|1994-03-05|TAKE BACK RETURN|SHIP|ches cajole +37862|659|60|7|24|37431.60|0.09|0.00|R|F|1994-02-13|1994-04-13|1994-02-17|TAKE BACK RETURN|RAIL| the furiously ironic a +37863|1456|74|1|2|2714.90|0.10|0.06|A|F|1995-05-07|1995-05-21|1995-05-20|COLLECT COD|AIR|ically even deposits. quickly silent ideas +37863|1469|48|2|10|13704.60|0.03|0.05|N|F|1995-05-22|1995-05-09|1995-06-19|NONE|AIR|. quickly express +37863|1810|97|3|11|18829.91|0.04|0.05|R|F|1995-04-13|1995-05-23|1995-05-08|NONE|SHIP|e carefully. bold +37863|798|99|4|13|22084.27|0.03|0.01|A|F|1995-03-07|1995-05-12|1995-04-04|COLLECT COD|AIR|lithely slyly final pinto beans. deposits a +37863|1091|92|5|27|26786.43|0.02|0.05|R|F|1995-05-05|1995-04-08|1995-05-29|NONE|AIR|y express foxes a +37863|362|63|6|11|13885.96|0.03|0.02|N|O|1995-06-21|1995-05-25|1995-07-14|TAKE BACK RETURN|REG AIR|le along the carefully ironic i +37888|666|98|1|40|62666.40|0.01|0.02|A|F|1994-12-31|1995-03-08|1995-01-03|TAKE BACK RETURN|RAIL| quick pinto beans haggle +37888|1262|37|2|22|25591.72|0.06|0.02|R|F|1995-04-22|1995-03-15|1995-05-08|DELIVER IN PERSON|FOB|e dependencies. q +37889|546|77|1|19|27484.26|0.03|0.02|N|O|1996-10-19|1996-10-03|1996-11-10|TAKE BACK RETURN|SHIP|ts about the f +37889|1735|36|2|31|50738.63|0.00|0.00|N|O|1996-09-08|1996-10-07|1996-09-19|NONE|AIR| regular theod +37890|1919|20|1|41|74657.31|0.00|0.05|N|O|1996-09-14|1996-09-28|1996-09-27|NONE|SHIP|ully. instructions cajo +37890|1718|19|2|4|6478.84|0.06|0.08|N|O|1996-07-09|1996-10-03|1996-07-16|COLLECT COD|MAIL|thely bold deposits +37890|1140|77|3|18|18740.52|0.09|0.02|N|O|1996-09-01|1996-08-11|1996-09-13|NONE|AIR|silent requests boost quickly above +37890|1410|50|4|49|64259.09|0.08|0.07|N|O|1996-09-25|1996-08-25|1996-10-14|COLLECT COD|AIR|bout the packages +37891|719|84|1|39|63168.69|0.08|0.04|N|O|1995-12-02|1995-11-20|1995-12-27|COLLECT COD|TRUCK|ve the express foxes +37891|1503|4|2|27|37921.50|0.04|0.00|N|O|1995-12-14|1995-12-08|1995-12-17|DELIVER IN PERSON|SHIP|ove the carefully clo +37891|34|35|3|7|6538.21|0.03|0.08|N|O|1995-10-25|1995-12-23|1995-10-27|DELIVER IN PERSON|RAIL|y even deposits after the +37891|787|88|4|32|54008.96|0.02|0.05|N|O|1995-11-12|1995-12-26|1995-11-20|DELIVER IN PERSON|TRUCK|y regular foxes doubt +37891|735|32|5|48|78515.04|0.09|0.02|N|O|1995-12-09|1995-11-27|1996-01-02|NONE|MAIL|ake quickly even dep +37891|875|75|6|40|71034.80|0.01|0.03|N|O|1995-11-23|1995-12-10|1995-12-05|NONE|SHIP|express theodolites. blithely express depo +37892|1946|35|1|16|29567.04|0.01|0.06|R|F|1992-05-14|1992-03-27|1992-05-18|COLLECT COD|RAIL|s. ideas sleep among the furio +37893|1315|16|1|12|14595.72|0.01|0.04|N|O|1996-03-07|1996-01-27|1996-03-10|NONE|REG AIR|s. blithely +37893|1851|38|2|43|75372.55|0.04|0.02|N|O|1995-12-27|1996-02-10|1996-01-22|TAKE BACK RETURN|AIR|ithely furiously special deposits +37894|1509|90|1|7|9873.50|0.04|0.05|N|O|1996-01-19|1996-02-24|1996-01-23|TAKE BACK RETURN|TRUCK|al grouches. carefully regular packages u +37894|593|94|2|14|20910.26|0.04|0.00|N|O|1996-03-18|1996-01-27|1996-03-24|COLLECT COD|RAIL|inments sleep blithely ironic theod +37894|1101|38|3|9|9018.90|0.03|0.00|N|O|1996-01-23|1996-01-28|1996-02-19|COLLECT COD|FOB|ruthless deposi +37895|64|90|1|27|26029.62|0.03|0.02|R|F|1992-07-24|1992-05-01|1992-08-15|COLLECT COD|REG AIR|lithely. unusual epi +37895|1841|71|2|5|8714.20|0.08|0.00|A|F|1992-06-29|1992-06-15|1992-07-27|DELIVER IN PERSON|SHIP|press sly court +37895|624|56|3|31|47263.22|0.03|0.04|A|F|1992-04-07|1992-05-05|1992-05-04|TAKE BACK RETURN|AIR|press requests. slyly i +37920|1772|99|1|10|16737.70|0.06|0.05|A|F|1993-09-20|1993-09-05|1993-10-17|COLLECT COD|TRUCK|e slyly above the furiously ir +37920|1943|32|2|11|20294.34|0.06|0.06|R|F|1993-08-01|1993-08-27|1993-08-17|TAKE BACK RETURN|REG AIR|nusual foxes +37921|1663|46|1|7|10952.62|0.06|0.08|A|F|1995-05-22|1995-07-24|1995-05-23|COLLECT COD|TRUCK|ely final asymptotes. regular +37922|1953|42|1|43|79762.85|0.03|0.03|N|O|1998-07-06|1998-06-01|1998-07-15|COLLECT COD|FOB|l foxes. carefully quiet accounts +37922|536|27|2|39|56024.67|0.07|0.03|N|O|1998-07-05|1998-05-23|1998-07-11|NONE|TRUCK|egular pinto beans. furiously pending packa +37923|1752|37|1|11|18191.25|0.07|0.01|R|F|1993-06-16|1993-05-29|1993-07-12|DELIVER IN PERSON|MAIL|s deposits snooze slyly above the qui +37923|59|10|2|30|28771.50|0.03|0.04|A|F|1993-05-24|1993-05-12|1993-05-27|COLLECT COD|REG AIR|ounts affix furious +37923|1935|36|3|3|5510.79|0.03|0.04|A|F|1993-05-19|1993-06-20|1993-05-22|TAKE BACK RETURN|SHIP|s. deposits use. furious +37923|564|95|4|41|60046.96|0.04|0.06|A|F|1993-06-01|1993-05-19|1993-06-04|COLLECT COD|TRUCK|platelets. +37923|166|93|5|10|10661.60|0.07|0.08|A|F|1993-05-28|1993-06-22|1993-06-20|NONE|SHIP|t blithely blithely silen +37923|1903|36|6|33|59561.70|0.00|0.08|R|F|1993-05-08|1993-05-30|1993-05-09|COLLECT COD|SHIP|ven dependencies. un +37924|1608|9|1|20|30192.00|0.06|0.04|A|F|1994-12-08|1995-01-17|1994-12-18|COLLECT COD|RAIL|e against the +37924|142|21|2|12|12505.68|0.08|0.00|A|F|1994-12-04|1995-01-21|1994-12-26|COLLECT COD|AIR|efully bold req +37924|459|47|3|23|31267.35|0.03|0.03|A|F|1995-01-19|1995-02-17|1995-02-11|DELIVER IN PERSON|TRUCK|st blithely +37924|1239|40|4|29|33066.67|0.05|0.04|R|F|1995-02-26|1995-02-09|1995-03-19|DELIVER IN PERSON|SHIP|s cajole. furiously +37924|1201|39|5|15|16533.00|0.03|0.08|R|F|1994-12-01|1995-01-04|1994-12-06|NONE|RAIL| about the packages cajole careful +37924|408|67|6|19|24859.60|0.09|0.02|R|F|1994-12-11|1995-01-13|1994-12-31|TAKE BACK RETURN|FOB|yly regular packages wake patterns. +37924|286|68|7|22|26098.16|0.05|0.08|A|F|1994-12-18|1995-01-31|1995-01-01|DELIVER IN PERSON|RAIL|l packages across the regu +37925|904|73|1|34|61366.60|0.05|0.02|A|F|1993-12-28|1993-12-06|1993-12-30|NONE|FOB|deposits nag furiou +37925|67|93|2|25|24176.50|0.01|0.06|R|F|1993-10-10|1993-12-11|1993-11-07|DELIVER IN PERSON|TRUCK|ly bold requests wake quic +37925|555|86|3|6|8733.30|0.07|0.05|A|F|1993-11-23|1993-12-11|1993-12-15|DELIVER IN PERSON|MAIL|sts wake daringly among the carefully e +37925|1272|73|4|48|56316.96|0.07|0.07|R|F|1993-11-18|1993-12-02|1993-12-06|DELIVER IN PERSON|RAIL|ironic requests breach +37925|1826|27|5|36|62201.52|0.10|0.04|A|F|1994-01-15|1993-12-16|1994-01-20|COLLECT COD|MAIL|requests wake slyly final, regular reque +37926|1120|93|1|10|10211.20|0.06|0.04|R|F|1994-09-18|1994-10-26|1994-10-01|COLLECT COD|REG AIR|he bold, bold requ +37926|1349|88|2|22|27507.48|0.08|0.05|R|F|1994-09-27|1994-11-20|1994-10-08|NONE|AIR|ogged accounts between the theodolites ha +37927|1281|93|1|43|50838.04|0.06|0.08|A|F|1995-03-07|1995-04-04|1995-03-14|COLLECT COD|MAIL|e furiously after the +37927|496|26|2|37|51670.13|0.04|0.07|R|F|1995-04-13|1995-03-17|1995-05-02|DELIVER IN PERSON|REG AIR|ts cajole. accounts sleep about the pa +37927|1263|38|3|26|30270.76|0.07|0.03|A|F|1995-03-28|1995-03-09|1995-04-08|DELIVER IN PERSON|TRUCK|sual dependencies. furiously +37927|1216|91|4|26|29047.46|0.03|0.02|R|F|1995-02-07|1995-03-30|1995-03-04|TAKE BACK RETURN|FOB|. pending, +37927|919|88|5|49|89175.59|0.00|0.07|A|F|1995-03-02|1995-03-31|1995-03-22|NONE|SHIP|uickly special acc +37952|465|66|1|31|42329.26|0.10|0.02|N|O|1996-10-27|1996-08-17|1996-11-14|COLLECT COD|SHIP|ent packages haggle carefully ironic, even +37952|1829|59|2|7|12115.74|0.02|0.06|N|O|1996-08-17|1996-09-26|1996-08-24|DELIVER IN PERSON|MAIL|posits. ac +37952|319|76|3|3|3657.93|0.07|0.00|N|O|1996-07-06|1996-08-09|1996-07-13|COLLECT COD|AIR|e. quickly regular courts n +37952|729|94|4|42|68448.24|0.02|0.04|N|O|1996-09-27|1996-08-22|1996-10-14|TAKE BACK RETURN|REG AIR|ar courts. furiously unus +37952|1258|59|5|48|55644.00|0.10|0.01|N|O|1996-07-10|1996-09-28|1996-08-03|DELIVER IN PERSON|AIR|ing packages sleep blith +37952|1033|4|6|13|12142.39|0.03|0.02|N|O|1996-09-14|1996-08-08|1996-09-23|TAKE BACK RETURN|TRUCK|lyly ironic +37953|357|58|1|7|8801.45|0.10|0.03|N|O|1997-07-11|1997-05-27|1997-08-09|COLLECT COD|FOB| bold theodolites detect. pending acc +37953|1094|30|2|48|47764.32|0.06|0.06|N|O|1997-05-30|1997-04-20|1997-06-14|TAKE BACK RETURN|TRUCK|luffily dogged depen +37953|749|82|3|2|3299.48|0.00|0.01|N|O|1997-05-17|1997-05-27|1997-06-06|DELIVER IN PERSON|REG AIR|l hockey players. pen +37953|1846|76|4|10|17478.40|0.05|0.00|N|O|1997-03-28|1997-05-06|1997-04-01|DELIVER IN PERSON|SHIP|ously regular foxes. eve +37953|1788|73|5|40|67591.20|0.02|0.00|N|O|1997-05-21|1997-06-10|1997-05-24|NONE|AIR|never even packages wake blit +37953|1703|46|6|4|6418.80|0.09|0.02|N|O|1997-04-13|1997-06-15|1997-04-21|NONE|FOB|oxes. foxes nag slyly according to the +37954|908|11|1|35|63311.50|0.04|0.06|N|O|1997-12-18|1997-12-03|1998-01-11|DELIVER IN PERSON|AIR|y. ironic, unusual +37954|1441|20|2|36|48327.84|0.07|0.01|N|O|1997-11-17|1997-12-22|1997-12-13|NONE|MAIL|s. quiet re +37954|393|50|3|34|43975.26|0.05|0.06|N|O|1997-11-15|1997-12-06|1997-11-29|COLLECT COD|REG AIR| even accounts. careful +37954|1341|42|4|39|48451.26|0.07|0.01|N|O|1997-11-24|1997-12-20|1997-12-14|TAKE BACK RETURN|MAIL|ully according to +37954|558|19|5|44|64176.20|0.08|0.06|N|O|1997-12-12|1997-12-12|1997-12-25|NONE|FOB| regular, unusual accounts. slyly +37955|1258|96|1|32|37096.00|0.02|0.08|N|O|1997-06-12|1997-05-06|1997-07-08|TAKE BACK RETURN|SHIP|structions. slyly even theodolites +37955|657|20|2|21|32710.65|0.03|0.06|N|O|1997-07-06|1997-04-28|1997-07-25|TAKE BACK RETURN|SHIP|furiously careful +37955|983|18|3|3|5651.94|0.06|0.08|N|O|1997-07-12|1997-05-28|1997-08-08|TAKE BACK RETURN|MAIL|s. dependencies hagg +37955|1554|55|4|12|17466.60|0.04|0.03|N|O|1997-05-28|1997-05-06|1997-05-29|NONE|SHIP| ironic theodolites sleep furiously +37955|1401|19|5|16|20838.40|0.00|0.04|N|O|1997-05-24|1997-05-21|1997-06-21|TAKE BACK RETURN|REG AIR|snooze fluffily special deposits +37955|637|69|6|26|39978.38|0.07|0.08|N|O|1997-07-04|1997-05-28|1997-07-12|DELIVER IN PERSON|SHIP|ructions. accounts according to the +37956|1141|42|1|23|23969.22|0.08|0.06|N|O|1997-11-22|1997-08-31|1997-12-06|COLLECT COD|AIR|sual requests cajole against the evenl +37957|845|46|1|47|82054.48|0.08|0.06|R|F|1993-12-03|1994-01-11|1993-12-24|TAKE BACK RETURN|AIR|old ideas sleep. unusual theod +37957|141|94|2|12|12493.68|0.08|0.07|A|F|1994-02-21|1994-02-03|1994-03-07|NONE|FOB|express pinto be +37957|692|55|3|33|52558.77|0.04|0.05|R|F|1994-01-18|1993-12-29|1994-02-02|DELIVER IN PERSON|REG AIR|even deposits. fluffily final deco +37957|1522|63|4|37|52670.24|0.08|0.01|R|F|1994-01-03|1993-12-18|1994-01-04|NONE|MAIL|ncies affix carefully slyly ironic e +37957|886|87|5|8|14295.04|0.09|0.06|R|F|1993-12-07|1993-12-19|1993-12-23|DELIVER IN PERSON|FOB|e slyly after th +37958|1380|19|1|7|8969.66|0.00|0.07|N|O|1998-02-12|1998-01-20|1998-03-12|COLLECT COD|RAIL|hely thin accounts. deposits slee +37958|439|40|2|19|25449.17|0.03|0.06|N|O|1997-11-21|1998-01-09|1997-12-12|NONE|RAIL|olites. quiet +37958|297|52|3|28|33524.12|0.08|0.08|N|O|1997-12-15|1998-01-08|1998-01-13|TAKE BACK RETURN|SHIP|usly regular req +37958|986|21|4|39|73592.22|0.09|0.04|N|O|1998-01-04|1998-01-06|1998-01-18|NONE|AIR|the blithely special ideas. furious +37958|1320|35|5|20|24426.40|0.03|0.08|N|O|1997-11-21|1997-12-25|1997-12-03|TAKE BACK RETURN|SHIP|yly final accounts wak +37959|971|72|1|11|20591.67|0.01|0.03|R|F|1994-01-09|1993-12-23|1994-01-11|NONE|REG AIR|sly bold deposits. quickly idle accoun +37959|1052|58|2|37|35262.85|0.07|0.05|A|F|1993-12-22|1993-11-21|1994-01-11|TAKE BACK RETURN|TRUCK|ly regular ideas use around the furiously +37959|1536|57|3|20|28750.60|0.02|0.05|A|F|1993-11-29|1994-01-06|1993-12-27|NONE|TRUCK|s. slyly silent packages about the +37959|1061|97|4|17|16355.02|0.10|0.08|A|F|1993-12-29|1993-12-25|1994-01-14|NONE|TRUCK|uests cajole slyl +37959|204|5|5|42|46376.40|0.03|0.03|A|F|1994-01-15|1993-12-11|1994-01-30|TAKE BACK RETURN|AIR|ions. pending no +37984|697|29|1|25|39942.25|0.09|0.08|R|F|1993-05-28|1993-07-15|1993-06-07|NONE|REG AIR|ly final foxes nag permanently e +37985|1931|76|1|6|10997.58|0.08|0.03|N|O|1996-12-23|1997-02-20|1997-01-05|DELIVER IN PERSON|REG AIR|nusual accou +37985|1922|11|2|29|52893.68|0.04|0.03|N|O|1996-12-21|1996-12-27|1997-01-07|TAKE BACK RETURN|FOB|osits; carefully r +37985|259|14|3|48|55644.00|0.06|0.03|N|O|1997-03-28|1997-02-21|1997-04-06|TAKE BACK RETURN|SHIP|es affix blithely according t +37986|1469|70|1|21|28779.66|0.02|0.02|R|F|1992-04-08|1992-04-08|1992-04-22|DELIVER IN PERSON|AIR| the slyly regular braids. deposits +37986|1278|90|2|27|31840.29|0.08|0.04|R|F|1992-03-19|1992-04-01|1992-04-15|DELIVER IN PERSON|FOB|the slyly pending tit +37986|844|44|3|21|36641.64|0.08|0.05|A|F|1992-04-19|1992-04-24|1992-05-18|COLLECT COD|REG AIR| slyly bol +37986|1116|17|4|26|26444.86|0.03|0.02|R|F|1992-03-27|1992-04-29|1992-04-24|NONE|MAIL|express foxes. +37987|290|45|1|47|55943.63|0.05|0.07|R|F|1994-08-28|1994-09-20|1994-09-07|TAKE BACK RETURN|SHIP|s. final, busy deposits cajole slyly +37987|131|84|2|41|42276.33|0.07|0.03|A|F|1994-09-21|1994-08-12|1994-10-04|TAKE BACK RETURN|MAIL|pinto beans. stealthily final +37988|1441|81|1|35|46985.40|0.07|0.07|A|F|1995-06-08|1995-05-19|1995-06-13|COLLECT COD|RAIL|ages. furiously express dependencies use. +37989|600|91|1|1|1500.60|0.03|0.07|N|O|1997-03-13|1997-02-03|1997-03-26|TAKE BACK RETURN|AIR|quests cajole carefully. pen +37989|1303|42|2|16|19268.80|0.05|0.08|N|O|1996-11-24|1997-02-07|1996-12-24|COLLECT COD|REG AIR|ss deposits across the pending, express +37990|879|13|1|36|64075.32|0.02|0.03|R|F|1993-06-04|1993-06-13|1993-06-29|NONE|AIR|y ironic packages +37990|1799|42|2|46|78236.34|0.08|0.00|R|F|1993-04-22|1993-06-11|1993-04-23|DELIVER IN PERSON|REG AIR|ly ironic accounts was quic +37990|1728|13|3|37|60299.64|0.04|0.04|R|F|1993-07-15|1993-07-08|1993-07-29|NONE|RAIL|y alongside of the final dependenci +37990|866|67|4|37|65373.82|0.08|0.08|R|F|1993-06-01|1993-06-16|1993-06-08|COLLECT COD|TRUCK|cording to the slyly final excuses. quic +37991|24|100|1|39|36036.78|0.07|0.03|N|F|1995-05-24|1995-04-22|1995-06-19|DELIVER IN PERSON|RAIL|yly express requests. slyly +37991|1813|14|2|2|3429.62|0.03|0.08|A|F|1995-03-21|1995-04-22|1995-04-15|COLLECT COD|RAIL|fluffily silent fox +37991|1036|42|3|21|19677.63|0.08|0.01|A|F|1995-04-20|1995-04-22|1995-05-15|NONE|AIR|tes. even, unusual instructions maintain +38016|771|36|1|43|71886.11|0.08|0.02|N|O|1997-12-19|1997-11-09|1997-12-29|TAKE BACK RETURN|MAIL|s wake along the slyly final dependencies +38016|1542|23|2|39|56298.06|0.09|0.02|N|O|1997-10-23|1997-10-28|1997-10-30|NONE|RAIL| the blithel +38016|1874|61|3|31|55051.97|0.02|0.02|N|O|1997-09-08|1997-10-17|1997-09-15|COLLECT COD|SHIP|express in +38016|152|53|4|44|46294.60|0.09|0.05|N|O|1997-11-29|1997-10-01|1997-12-16|COLLECT COD|FOB|ress against the final +38016|438|39|5|12|16061.16|0.06|0.02|N|O|1997-10-16|1997-11-08|1997-10-24|COLLECT COD|REG AIR|e slyly abo +38016|1873|60|6|9|15973.83|0.08|0.06|N|O|1997-12-23|1997-09-26|1998-01-22|NONE|REG AIR|ular hockey p +38017|1524|65|1|40|57020.80|0.02|0.00|R|F|1993-10-24|1993-08-21|1993-11-09|DELIVER IN PERSON|TRUCK| wake quick +38017|493|94|2|49|68281.01|0.01|0.05|R|F|1993-08-09|1993-10-12|1993-08-26|DELIVER IN PERSON|TRUCK|s above the carefully regular req +38017|112|39|3|33|33399.63|0.05|0.06|R|F|1993-11-13|1993-10-10|1993-12-07|COLLECT COD|AIR| silent, pending requests use blit +38017|604|36|4|17|25578.20|0.02|0.05|R|F|1993-08-12|1993-08-26|1993-09-10|TAKE BACK RETURN|FOB|slyly furi +38017|1764|49|5|9|14991.84|0.01|0.07|A|F|1993-08-08|1993-10-06|1993-08-14|DELIVER IN PERSON|TRUCK|, pending ideas. carefully regular +38017|1473|91|6|25|34361.75|0.03|0.08|A|F|1993-09-20|1993-09-24|1993-10-19|DELIVER IN PERSON|SHIP|slyly ironic do +38018|1520|41|1|17|24165.84|0.06|0.05|R|F|1994-10-04|1994-08-18|1994-10-28|DELIVER IN PERSON|REG AIR| final foxes nag. never regular p +38018|245|46|2|42|48100.08|0.05|0.07|R|F|1994-08-28|1994-08-28|1994-09-14|TAKE BACK RETURN|TRUCK| packages. furiously silent foxe +38018|311|12|3|31|37550.61|0.10|0.08|A|F|1994-09-09|1994-09-20|1994-10-03|TAKE BACK RETURN|FOB|boost furiously: quickly iron +38018|1981|26|4|17|32010.66|0.04|0.04|A|F|1994-09-09|1994-08-18|1994-10-08|COLLECT COD|MAIL|ake carefully regular packages. furious +38019|1462|63|1|32|43630.72|0.10|0.08|N|O|1998-07-31|1998-08-27|1998-08-17|TAKE BACK RETURN|AIR|t inside the carefully even theodolites. ex +38019|994|97|2|7|13264.93|0.00|0.08|N|O|1998-08-16|1998-09-11|1998-08-19|NONE|FOB| unusual accounts boos +38019|1386|87|3|34|43770.92|0.06|0.06|N|O|1998-07-20|1998-09-10|1998-08-05|COLLECT COD|FOB|ons. final, ironic idea +38019|1952|53|4|50|92697.50|0.01|0.04|N|O|1998-07-18|1998-09-11|1998-07-24|DELIVER IN PERSON|SHIP|riously even packa +38020|1170|7|1|7|7498.19|0.08|0.04|N|O|1998-07-21|1998-05-29|1998-08-08|COLLECT COD|FOB|press accounts. silent theo +38021|337|38|1|46|56917.18|0.01|0.01|A|F|1994-05-21|1994-03-05|1994-06-18|COLLECT COD|MAIL|g requests. furiously +38021|95|96|2|36|35823.24|0.02|0.08|A|F|1994-05-13|1994-04-22|1994-06-08|COLLECT COD|MAIL|es play quick +38021|1737|38|3|12|19664.76|0.08|0.02|A|F|1994-02-08|1994-03-11|1994-02-23|NONE|AIR|deposits! carefully express +38021|1734|35|4|4|6542.92|0.02|0.05|R|F|1994-04-26|1994-04-17|1994-05-01|DELIVER IN PERSON|TRUCK| dependencies are carefully furiously +38022|1856|57|1|12|21094.20|0.09|0.00|N|O|1998-06-09|1998-04-21|1998-07-06|TAKE BACK RETURN|SHIP|into beans lose slyly reques +38022|440|70|2|28|37532.32|0.05|0.02|N|O|1998-04-16|1998-04-07|1998-04-27|DELIVER IN PERSON|TRUCK|uriously ironic deposits alon +38022|1526|67|3|42|59955.84|0.06|0.01|N|O|1998-04-03|1998-04-11|1998-04-04|NONE|SHIP|gular depo +38022|1385|100|4|25|32159.50|0.05|0.04|N|O|1998-06-13|1998-05-19|1998-06-20|DELIVER IN PERSON|MAIL|ular dolphins. pending, ironic foxes +38022|520|51|5|24|34092.48|0.05|0.07|N|O|1998-05-06|1998-05-01|1998-05-18|DELIVER IN PERSON|TRUCK|ng the caref +38022|1022|58|6|46|42458.92|0.05|0.04|N|O|1998-06-15|1998-04-25|1998-06-23|NONE|REG AIR|structions. carefully s +38023|1786|13|1|1|1687.78|0.00|0.08|N|O|1996-10-30|1996-09-24|1996-11-14|DELIVER IN PERSON|SHIP|y final accounts integrate +38023|1163|72|2|47|50015.52|0.02|0.00|N|O|1996-08-19|1996-10-06|1996-08-30|TAKE BACK RETURN|SHIP|eposits doubt fur +38023|521|82|3|26|36959.52|0.06|0.03|N|O|1996-10-03|1996-09-14|1996-10-04|DELIVER IN PERSON|TRUCK|. slyly even dolphins are +38023|559|50|4|23|33569.65|0.02|0.05|N|O|1996-09-27|1996-10-16|1996-10-14|COLLECT COD|SHIP|e the fluffily even h +38023|1626|27|5|48|73325.76|0.05|0.06|N|O|1996-10-01|1996-10-24|1996-10-17|COLLECT COD|REG AIR|ecial notornis. +38023|516|47|6|31|43911.81|0.08|0.02|N|O|1996-11-19|1996-10-13|1996-11-30|NONE|TRUCK|the regular, express deposit +38048|1354|93|1|17|21340.95|0.03|0.02|R|F|1993-01-27|1993-03-10|1993-02-15|DELIVER IN PERSON|REG AIR|ons. careful, ironic deposits across the en +38048|154|55|2|42|44274.30|0.10|0.01|A|F|1993-02-15|1993-03-01|1993-03-17|NONE|RAIL|re furiously against the fluffy +38049|1955|100|1|3|5570.85|0.03|0.03|R|F|1992-09-10|1992-08-17|1992-09-29|COLLECT COD|SHIP|n ideas. carefully unusual ideas +38050|1201|2|1|37|40781.40|0.03|0.06|R|F|1994-01-12|1994-01-19|1994-02-09|COLLECT COD|AIR|al excuses. sly, regul +38050|411|99|2|43|56390.63|0.00|0.08|R|F|1993-12-03|1993-12-03|1993-12-31|TAKE BACK RETURN|AIR|at the furiously final a +38050|1829|59|3|11|19039.02|0.08|0.04|A|F|1993-12-25|1993-11-27|1994-01-12|DELIVER IN PERSON|TRUCK|. special, final platelets +38050|193|72|4|30|32795.70|0.04|0.04|R|F|1993-12-26|1993-12-13|1994-01-03|COLLECT COD|RAIL|jole express, ironic frays. unus +38050|263|91|5|1|1163.26|0.03|0.00|A|F|1993-10-29|1994-01-25|1993-11-15|DELIVER IN PERSON|MAIL|nts detect furiously pinto +38051|1863|64|1|40|70594.40|0.08|0.01|N|O|1997-07-16|1997-05-21|1997-07-22|TAKE BACK RETURN|TRUCK|ending req +38051|1456|74|2|39|52940.55|0.09|0.00|N|O|1997-05-04|1997-05-25|1997-05-17|COLLECT COD|REG AIR|ackages. even, eve +38051|1317|94|3|24|29239.44|0.05|0.08|N|O|1997-04-19|1997-05-10|1997-05-13|NONE|FOB|nstructions use blithely ironic ins +38051|557|88|4|5|7287.75|0.06|0.07|N|O|1997-04-26|1997-05-01|1997-05-21|NONE|REG AIR|ess, ironic f +38051|1|52|5|20|18020.00|0.04|0.07|N|O|1997-06-23|1997-06-27|1997-07-02|TAKE BACK RETURN|RAIL|slyly unusual theodolites. even, pen +38052|1085|91|1|16|15777.28|0.05|0.04|A|F|1992-06-14|1992-05-15|1992-07-09|COLLECT COD|REG AIR|inst the asymptotes. theodolite +38052|1677|1|2|10|15786.70|0.00|0.03|R|F|1992-03-09|1992-04-10|1992-03-25|NONE|RAIL|ic foxes use quickly. slyly +38053|212|67|1|28|31141.88|0.09|0.06|N|O|1997-08-05|1997-08-20|1997-08-25|COLLECT COD|AIR|ts haggle slyly special packages. unusu +38054|1940|73|1|2|3683.88|0.01|0.05|A|F|1995-05-14|1995-05-18|1995-05-20|NONE|MAIL|asymptotes according to the quickly ent +38055|1152|25|1|9|9478.35|0.07|0.03|A|F|1994-09-22|1994-10-23|1994-09-30|NONE|AIR|across the even accounts w +38055|1550|71|2|8|11612.40|0.00|0.08|A|F|1994-12-23|1994-10-28|1995-01-11|COLLECT COD|FOB|gular instructio +38055|1345|22|3|9|11217.06|0.09|0.01|R|F|1994-11-11|1994-10-22|1994-12-09|NONE|FOB|longside of the quickly +38055|1528|69|4|33|47174.16|0.08|0.05|A|F|1995-01-01|1994-12-10|1995-01-09|NONE|TRUCK|ts boost after t +38080|1144|53|1|1|1045.14|0.02|0.01|R|F|1995-01-08|1994-11-18|1995-01-30|DELIVER IN PERSON|AIR|ronic requests. blithely unu +38080|1037|8|2|44|41273.32|0.04|0.07|R|F|1994-12-03|1994-10-28|1994-12-19|COLLECT COD|FOB|y final ideas. carefully even ide +38080|1304|19|3|50|60265.00|0.05|0.05|R|F|1994-11-27|1994-11-03|1994-12-26|NONE|AIR|lites wake carefully. quickly bold +38080|1395|10|4|13|16853.07|0.08|0.04|A|F|1994-10-31|1994-11-01|1994-11-17|NONE|FOB|s x-ray during the ironic requests. +38080|479|9|5|49|67594.03|0.06|0.04|A|F|1994-11-27|1994-12-10|1994-12-09|COLLECT COD|AIR|ing ideas wake. slyly even packages are s +38081|250|78|1|11|12652.75|0.09|0.07|N|O|1997-05-11|1997-05-19|1997-05-19|NONE|REG AIR| unusual instructions according to the bl +38081|357|58|2|39|49036.65|0.08|0.03|N|O|1997-04-07|1997-05-24|1997-05-05|DELIVER IN PERSON|TRUCK|ccounts detect carefully. accounts s +38081|1822|9|3|23|39647.86|0.00|0.03|N|O|1997-07-23|1997-06-27|1997-08-20|COLLECT COD|AIR|lyly unusual ide +38081|1490|91|4|12|16697.88|0.09|0.07|N|O|1997-05-06|1997-06-27|1997-05-31|COLLECT COD|MAIL|thily. furiously unusual dependenci +38082|377|34|1|11|14051.07|0.09|0.04|N|O|1997-10-04|1997-09-16|1997-10-22|NONE|SHIP|s around the acc +38082|1311|50|2|8|9698.48|0.10|0.08|N|O|1997-08-28|1997-09-19|1997-09-06|COLLECT COD|REG AIR|ual requests cajole across the f +38082|1705|32|3|39|62661.30|0.05|0.04|N|O|1997-09-11|1997-08-29|1997-09-19|TAKE BACK RETURN|SHIP|xpress requests use afte +38082|500|88|4|43|60221.50|0.00|0.03|N|O|1997-09-20|1997-09-08|1997-10-09|COLLECT COD|AIR|st the final, regular orbit +38082|921|90|5|33|60123.36|0.03|0.05|N|O|1997-07-30|1997-09-09|1997-08-10|COLLECT COD|SHIP|instructio +38083|1429|69|1|5|6652.10|0.07|0.04|N|O|1998-05-10|1998-07-28|1998-05-24|COLLECT COD|FOB|gle fluffily. fluffily +38083|668|62|2|25|39216.50|0.01|0.07|N|O|1998-06-29|1998-07-05|1998-07-23|TAKE BACK RETURN|RAIL|he carefully fin +38083|179|80|3|4|4316.68|0.00|0.04|N|O|1998-08-31|1998-07-01|1998-09-02|NONE|SHIP| to the even packages. carefully +38083|1167|40|4|35|37385.60|0.05|0.04|N|O|1998-06-23|1998-07-15|1998-07-01|NONE|RAIL|uriously ironic fo +38084|322|7|1|1|1222.32|0.01|0.02|A|F|1994-04-08|1994-04-23|1994-04-15|TAKE BACK RETURN|AIR|nt foxes do detect slyly around t +38084|156|57|2|19|20066.85|0.10|0.03|A|F|1994-05-26|1994-05-31|1994-06-13|DELIVER IN PERSON|RAIL|slyly. iron +38084|352|37|3|39|48841.65|0.09|0.07|A|F|1994-06-12|1994-05-21|1994-06-30|COLLECT COD|TRUCK|al ideas cajole across the +38084|291|73|4|2|2382.58|0.02|0.08|A|F|1994-05-24|1994-06-16|1994-06-10|NONE|MAIL|ounts. furious ideas nag sile +38084|44|45|5|20|18880.80|0.08|0.00|A|F|1994-06-23|1994-05-29|1994-07-12|NONE|SHIP|ously bold theodolites. e +38084|1090|61|6|2|1982.18|0.01|0.08|A|F|1994-05-11|1994-06-18|1994-05-25|COLLECT COD|RAIL| slyly accor +38085|548|39|1|29|42007.66|0.05|0.05|N|O|1997-07-28|1997-07-14|1997-08-23|COLLECT COD|TRUCK|ironic deposits +38085|1243|81|2|3|3432.72|0.10|0.03|N|O|1997-07-24|1997-06-23|1997-08-16|TAKE BACK RETURN|MAIL|uickly. blithely ironic dep +38085|757|54|3|11|18235.25|0.07|0.01|N|O|1997-05-27|1997-07-29|1997-06-25|NONE|FOB|as. carefully ironic p +38086|1610|11|1|5|7558.05|0.09|0.03|R|F|1992-04-03|1992-05-20|1992-04-17|COLLECT COD|MAIL|slyly pending pack +38086|824|25|2|20|34496.40|0.01|0.03|A|F|1992-03-22|1992-04-20|1992-04-11|DELIVER IN PERSON|REG AIR|ironic accounts. slyly final platelet +38086|469|28|3|1|1369.46|0.06|0.00|R|F|1992-06-20|1992-03-31|1992-07-11|NONE|REG AIR|iously even packag +38086|1142|15|4|2|2086.28|0.08|0.05|R|F|1992-05-06|1992-04-24|1992-05-16|NONE|AIR|side of the ideas. spe +38086|666|98|5|1|1566.66|0.03|0.03|A|F|1992-04-29|1992-05-05|1992-05-08|COLLECT COD|MAIL|ts nag abov +38086|1906|7|6|31|56044.90|0.07|0.06|A|F|1992-04-14|1992-05-08|1992-04-28|DELIVER IN PERSON|TRUCK|lly enticing foxes. fina +38087|923|26|1|4|7295.68|0.08|0.02|R|F|1994-05-24|1994-05-04|1994-06-05|DELIVER IN PERSON|FOB| fluffy packages. sentiments are +38087|864|65|2|25|44121.50|0.07|0.00|R|F|1994-05-19|1994-04-13|1994-06-04|TAKE BACK RETURN|REG AIR|ully slow deposits sleep fluffily. +38087|1729|30|3|39|63598.08|0.03|0.06|A|F|1994-05-21|1994-03-31|1994-05-24|TAKE BACK RETURN|FOB|press accounts sleep slowly. ironic, expre +38087|1652|35|4|34|52824.10|0.00|0.07|A|F|1994-06-18|1994-03-29|1994-07-06|COLLECT COD|REG AIR|structions hang blit +38087|1565|46|5|3|4399.68|0.09|0.00|A|F|1994-03-17|1994-05-03|1994-04-13|TAKE BACK RETURN|RAIL|express deposits. bold packages afte +38112|377|78|1|50|63868.50|0.00|0.00|N|O|1998-03-30|1998-03-11|1998-04-22|DELIVER IN PERSON|RAIL| carefully e +38112|419|20|2|15|19791.15|0.03|0.05|N|O|1998-05-16|1998-03-08|1998-06-12|TAKE BACK RETURN|REG AIR|lar courts hinder furiously against th +38112|778|11|3|26|43648.02|0.01|0.02|N|O|1998-03-25|1998-02-28|1998-04-09|TAKE BACK RETURN|TRUCK|. furiously iron +38112|917|20|4|37|67262.67|0.09|0.05|N|O|1998-02-10|1998-03-25|1998-02-14|TAKE BACK RETURN|AIR|lly final d +38112|651|45|5|40|62066.00|0.01|0.06|N|O|1998-04-17|1998-04-05|1998-04-24|COLLECT COD|RAIL|iously. regular, s +38112|755|20|6|26|43049.50|0.08|0.02|N|O|1998-05-08|1998-04-12|1998-05-20|COLLECT COD|MAIL|es. furiously pending accounts sub +38113|266|94|1|26|30322.76|0.02|0.08|N|O|1998-02-22|1998-02-16|1998-02-23|COLLECT COD|TRUCK|ccounts. final, regular ac +38113|1513|54|2|43|60823.93|0.07|0.05|N|O|1998-02-28|1998-02-19|1998-03-18|COLLECT COD|FOB|ickly ironic pinto beans at +38113|90|16|3|24|23762.16|0.09|0.07|N|O|1998-04-10|1998-03-04|1998-05-06|TAKE BACK RETURN|RAIL|es. slyly unusual instructi +38113|954|89|4|31|57503.45|0.04|0.00|N|O|1998-02-13|1998-03-17|1998-02-16|COLLECT COD|MAIL|uriously. blithely final de +38113|1135|72|5|25|25903.25|0.02|0.04|N|O|1998-04-12|1998-02-04|1998-04-25|NONE|AIR|slyly express instructions. exp +38113|1909|54|6|29|52516.10|0.00|0.03|N|O|1998-01-05|1998-03-18|1998-01-29|COLLECT COD|REG AIR| mold blithely according t +38114|824|58|1|28|48294.96|0.05|0.03|N|O|1997-10-21|1997-08-27|1997-11-01|COLLECT COD|AIR|of the fluffily regul +38115|1279|80|1|34|40129.18|0.04|0.08|N|O|1998-02-05|1998-01-19|1998-02-17|TAKE BACK RETURN|SHIP| sleep. reg +38115|737|70|2|33|54045.09|0.02|0.02|N|O|1997-12-28|1998-01-06|1997-12-31|COLLECT COD|RAIL|t the furiously regular sheaves. slyly +38115|215|43|3|34|37917.14|0.08|0.02|N|O|1998-01-18|1998-01-19|1998-02-08|NONE|AIR|ges wake furiousl +38115|284|39|4|29|34344.12|0.08|0.01|N|O|1997-11-23|1998-01-25|1997-12-19|TAKE BACK RETURN|REG AIR|out the iro +38115|1077|83|5|42|41078.94|0.04|0.02|N|O|1997-11-21|1998-01-01|1997-12-20|NONE|MAIL|the carefully bold dep +38116|1679|21|1|12|18968.04|0.05|0.08|N|O|1996-04-08|1996-02-03|1996-04-14|NONE|AIR|ns sleep furiously. regular de +38116|1261|62|2|25|29056.50|0.07|0.07|N|O|1995-12-26|1996-02-18|1996-01-21|COLLECT COD|RAIL|sleep fluffi +38116|1488|67|3|49|68084.52|0.00|0.02|N|O|1996-04-03|1996-02-10|1996-04-29|DELIVER IN PERSON|FOB| ironic accoun +38116|1306|45|4|39|47084.70|0.09|0.05|N|O|1996-03-12|1996-02-03|1996-03-17|COLLECT COD|TRUCK|ickly. regular, silen +38117|1595|36|1|13|19455.67|0.05|0.02|R|F|1993-08-15|1993-06-11|1993-09-14|TAKE BACK RETURN|AIR|efully special accounts haggle regular pac +38117|221|3|2|27|30272.94|0.08|0.07|A|F|1993-06-25|1993-06-04|1993-06-27|COLLECT COD|AIR|y special packages boost sl +38117|1516|57|3|13|18427.63|0.09|0.06|A|F|1993-07-03|1993-07-01|1993-07-08|NONE|AIR|ole slyly along +38117|1967|100|4|48|89710.08|0.10|0.02|A|F|1993-07-11|1993-06-29|1993-07-20|NONE|AIR|s after the qui +38118|1975|76|1|50|93848.50|0.06|0.07|N|O|1995-07-30|1995-07-05|1995-08-15|NONE|TRUCK|manently idle requests +38118|514|15|2|4|5658.04|0.04|0.03|N|O|1995-06-30|1995-05-23|1995-07-27|NONE|FOB|ly regular foxe +38119|1273|48|1|44|51667.88|0.08|0.05|R|F|1994-04-14|1994-04-26|1994-05-04|COLLECT COD|MAIL|inal deposit +38119|1398|13|2|49|63670.11|0.07|0.02|R|F|1994-07-18|1994-06-19|1994-08-15|COLLECT COD|FOB|. regular, +38144|599|60|1|46|68981.14|0.05|0.05|N|O|1998-05-22|1998-06-09|1998-06-01|DELIVER IN PERSON|RAIL|s use slyl +38145|907|76|1|5|9039.50|0.04|0.02|A|F|1994-09-24|1994-10-15|1994-10-09|TAKE BACK RETURN|TRUCK| final, quiet frays. silent, regular packa +38145|499|87|2|41|57379.09|0.06|0.03|A|F|1994-11-27|1994-10-15|1994-12-22|DELIVER IN PERSON|MAIL| cajole carefully pending accounts. deposi +38145|635|36|3|20|30712.60|0.07|0.01|R|F|1994-10-26|1994-10-28|1994-11-18|DELIVER IN PERSON|TRUCK|ters doubt. slyly silent instruc +38145|1238|50|4|21|23923.83|0.07|0.07|R|F|1994-12-27|1994-12-03|1995-01-08|TAKE BACK RETURN|RAIL|nal requests. slow, unusual platel +38145|1347|62|5|36|44940.24|0.09|0.08|A|F|1994-10-26|1994-11-11|1994-11-15|TAKE BACK RETURN|RAIL|counts boost quickly around the slyly iro +38146|75|76|1|29|28277.03|0.03|0.00|N|O|1996-03-05|1996-02-23|1996-03-22|DELIVER IN PERSON|FOB|c instructions s +38146|285|40|2|28|33187.84|0.03|0.05|N|O|1995-12-20|1996-01-26|1996-01-11|TAKE BACK RETURN|FOB|n accounts. even instruc +38147|737|38|1|29|47494.17|0.05|0.06|A|F|1992-01-23|1992-02-12|1992-01-29|NONE|AIR|ayers are alongside of the carefu +38147|1001|72|2|50|45100.00|0.08|0.02|R|F|1992-01-14|1992-04-07|1992-01-29|TAKE BACK RETURN|REG AIR|al accounts boost b +38147|1800|43|3|12|20421.60|0.02|0.02|A|F|1992-02-22|1992-03-06|1992-03-11|COLLECT COD|MAIL|. quickly regular deposits haggle +38147|1562|63|4|16|23416.96|0.06|0.06|R|F|1992-02-14|1992-02-24|1992-02-18|TAKE BACK RETURN|MAIL| furiously ironic +38147|1111|12|5|29|29351.19|0.10|0.05|R|F|1992-03-19|1992-03-27|1992-04-03|NONE|AIR|packages detect slyly ab +38148|1485|25|1|23|31889.04|0.00|0.04|N|O|1996-07-18|1996-08-06|1996-07-21|DELIVER IN PERSON|MAIL|ites cajole +38148|1016|87|2|18|16506.18|0.08|0.07|N|O|1996-08-09|1996-09-08|1996-08-24|DELIVER IN PERSON|MAIL|y regular theo +38148|940|41|3|26|47864.44|0.07|0.00|N|O|1996-08-11|1996-08-21|1996-09-05|TAKE BACK RETURN|REG AIR|bout the special, unusual p +38148|279|7|4|17|20047.59|0.06|0.05|N|O|1996-07-09|1996-08-15|1996-07-11|NONE|TRUCK|are even deposits. express, unusual account +38148|1981|26|5|40|75319.20|0.07|0.06|N|O|1996-07-18|1996-07-15|1996-08-01|TAKE BACK RETURN|SHIP|gular dolphins according to the caref +38148|1852|39|6|45|78923.25|0.09|0.04|N|O|1996-06-23|1996-08-24|1996-07-03|NONE|SHIP|sts boost furiously slyly regular packa +38148|1540|81|7|11|15856.94|0.07|0.05|N|O|1996-08-31|1996-07-21|1996-09-12|TAKE BACK RETURN|SHIP|posits kindle carefully. s +38149|554|45|1|15|21818.25|0.02|0.01|N|O|1998-05-21|1998-04-24|1998-06-07|TAKE BACK RETURN|FOB| furiously. furiously regular theo +38150|1011|82|1|21|19152.21|0.08|0.00|N|O|1998-04-15|1998-03-10|1998-05-14|TAKE BACK RETURN|RAIL|efully iro +38150|1590|31|2|24|35798.16|0.00|0.07|N|O|1998-04-12|1998-04-18|1998-04-22|COLLECT COD|TRUCK|ly special dolphins. slyly even pinto +38150|237|92|3|6|6823.38|0.02|0.06|N|O|1998-03-19|1998-04-16|1998-03-25|TAKE BACK RETURN|TRUCK|le above the regular tit +38151|1828|15|1|20|34596.40|0.01|0.01|N|O|1998-01-03|1998-03-19|1998-01-07|NONE|SHIP|ng foxes are care +38151|1645|87|2|30|46399.20|0.07|0.05|N|O|1998-01-17|1998-03-05|1998-02-11|TAKE BACK RETURN|REG AIR|es shall cajole +38176|57|8|1|42|40196.10|0.03|0.06|R|F|1993-11-29|1993-10-03|1993-12-25|TAKE BACK RETURN|REG AIR|ackages use ac +38176|607|1|2|47|70857.20|0.10|0.03|R|F|1993-08-25|1993-11-10|1993-09-20|TAKE BACK RETURN|AIR|ronic, regular theod +38176|1410|28|3|14|18359.74|0.03|0.06|A|F|1993-12-07|1993-10-29|1994-01-06|DELIVER IN PERSON|RAIL|. carefully r +38176|675|38|4|23|36240.41|0.07|0.08|R|F|1993-08-20|1993-10-06|1993-09-10|DELIVER IN PERSON|REG AIR|special packages sho +38177|180|33|1|32|34565.76|0.10|0.05|N|O|1998-10-30|1998-08-31|1998-11-12|TAKE BACK RETURN|REG AIR|quests haggle +38177|981|16|2|18|33875.64|0.10|0.07|N|O|1998-08-28|1998-09-22|1998-09-24|NONE|TRUCK|inal multipliers. accounts ca +38178|1145|18|1|22|23015.08|0.05|0.07|A|F|1992-10-02|1992-10-19|1992-10-15|TAKE BACK RETURN|SHIP|ven packages sleep slyly above the si +38178|92|68|2|47|46628.23|0.06|0.07|R|F|1992-11-03|1992-10-27|1992-11-13|DELIVER IN PERSON|TRUCK|final frays detect furiously ironic reques +38178|243|71|3|41|46872.84|0.04|0.00|A|F|1992-09-21|1992-10-01|1992-10-12|COLLECT COD|AIR|s are accordi +38179|651|14|1|19|29481.35|0.08|0.03|N|O|1997-11-21|1997-12-09|1997-12-06|TAKE BACK RETURN|FOB|ly furiously ironic +38179|944|79|2|42|77487.48|0.07|0.03|N|O|1997-12-02|1998-01-02|1997-12-11|NONE|MAIL|ts above the theodolites sleep f +38180|453|54|1|39|52784.55|0.00|0.00|A|F|1994-11-27|1994-10-30|1994-12-08|DELIVER IN PERSON|FOB|each blithely slyly express accounts. furi +38180|1174|83|2|14|15052.38|0.08|0.04|R|F|1994-12-08|1994-11-18|1994-12-24|TAKE BACK RETURN|SHIP|latelets h +38180|458|46|3|32|43470.40|0.04|0.01|R|F|1994-09-06|1994-11-09|1994-09-16|NONE|REG AIR|ial deposits instead of the b +38180|1767|52|4|27|45056.52|0.02|0.04|R|F|1994-09-18|1994-10-30|1994-09-24|DELIVER IN PERSON|REG AIR|e slyly evenly +38181|1369|46|1|33|41921.88|0.02|0.04|N|O|1997-05-31|1997-06-26|1997-06-25|DELIVER IN PERSON|RAIL|e blithely quickly silent p +38181|1083|54|2|27|26570.16|0.06|0.04|N|O|1997-05-29|1997-07-16|1997-06-23|DELIVER IN PERSON|RAIL|ffix slyly. quickly d +38181|641|42|3|46|70915.44|0.06|0.04|N|O|1997-08-05|1997-07-18|1997-08-30|DELIVER IN PERSON|SHIP|its use ironic, +38181|1247|59|4|3|3444.72|0.10|0.00|N|O|1997-05-17|1997-06-18|1997-06-16|COLLECT COD|FOB|nod furiously blithely regular dependencies +38182|1311|88|1|2|2424.62|0.02|0.04|R|F|1992-07-13|1992-07-30|1992-08-09|COLLECT COD|FOB|dencies promis +38182|1027|63|2|4|3712.08|0.08|0.03|A|F|1992-06-21|1992-07-02|1992-07-14|DELIVER IN PERSON|AIR|sly regular ideas cajole. acc +38182|567|28|3|3|4402.68|0.03|0.04|R|F|1992-06-23|1992-08-06|1992-07-23|DELIVER IN PERSON|REG AIR|. special deposits caj +38182|1123|96|4|44|45061.28|0.01|0.05|R|F|1992-08-27|1992-08-21|1992-09-11|DELIVER IN PERSON|SHIP|refully regular requests. regu +38183|1379|80|1|19|24327.03|0.10|0.04|N|O|1998-02-15|1998-03-31|1998-03-17|DELIVER IN PERSON|FOB|e alongside of the iron +38183|71|72|2|8|7768.56|0.06|0.08|N|O|1998-04-09|1998-03-09|1998-04-27|TAKE BACK RETURN|REG AIR|ckly special theod +38183|715|80|3|34|54934.14|0.06|0.04|N|O|1998-01-29|1998-03-05|1998-02-07|TAKE BACK RETURN|MAIL|al, express foxes haggle +38183|1638|39|4|22|33871.86|0.02|0.08|N|O|1998-02-06|1998-03-30|1998-02-13|DELIVER IN PERSON|SHIP|uctions. even packages thrash. +38183|1325|2|5|33|40468.56|0.02|0.06|N|O|1998-05-11|1998-04-09|1998-05-17|DELIVER IN PERSON|REG AIR|ent foxes cajole blithely a +38183|1479|97|6|22|30370.34|0.09|0.00|N|O|1998-03-13|1998-03-10|1998-03-26|NONE|AIR|ully even instructions. final platel +38183|831|31|7|3|5195.49|0.08|0.01|N|O|1998-05-24|1998-04-02|1998-06-14|DELIVER IN PERSON|RAIL| ironic patterns acc +38208|1157|30|1|1|1058.15|0.03|0.01|N|O|1996-04-24|1996-05-06|1996-05-19|COLLECT COD|AIR|ons haggle +38208|1677|19|2|23|36309.41|0.01|0.05|N|O|1996-06-13|1996-04-25|1996-06-30|COLLECT COD|REG AIR|gular platelets. furiously s +38208|304|61|3|47|56602.10|0.06|0.07|N|O|1996-07-18|1996-05-20|1996-08-08|DELIVER IN PERSON|MAIL|requests haggle. regular accounts affix qui +38208|1120|29|4|24|24506.88|0.09|0.03|N|O|1996-06-21|1996-06-01|1996-07-11|COLLECT COD|TRUCK|eep according to the thin accounts. ironi +38208|536|27|5|15|21547.95|0.02|0.07|N|O|1996-05-13|1996-04-29|1996-06-02|COLLECT COD|MAIL|ests cajole. regular dept +38209|1160|33|1|3|3183.48|0.06|0.01|R|F|1994-10-20|1994-10-09|1994-11-11|TAKE BACK RETURN|SHIP|nes maintain special excuses. slyly caref +38209|1073|79|2|18|17533.26|0.04|0.07|A|F|1994-10-04|1994-11-03|1994-10-28|NONE|MAIL|ideas. fluffily un +38210|1930|75|1|3|5495.79|0.09|0.03|A|F|1994-02-24|1994-02-10|1994-03-19|COLLECT COD|RAIL|ial ideas. carefully final +38210|857|91|2|46|80861.10|0.05|0.01|R|F|1993-12-28|1994-03-03|1994-01-03|NONE|TRUCK|tes. expre +38210|1256|31|3|28|32403.00|0.08|0.02|R|F|1993-12-30|1994-03-02|1994-01-02|TAKE BACK RETURN|FOB|y regular i +38210|314|71|4|39|47358.09|0.08|0.04|R|F|1994-02-12|1994-01-28|1994-03-03|NONE|FOB|ngside of the +38210|807|41|5|37|63188.60|0.02|0.02|A|F|1994-01-31|1994-02-24|1994-02-25|COLLECT COD|TRUCK|odolites promise slyly among the request +38210|1356|33|6|45|56580.75|0.10|0.07|R|F|1994-01-25|1994-03-10|1994-01-26|COLLECT COD|MAIL| regular accounts cajole f +38211|1635|36|1|35|53782.05|0.08|0.00|N|O|1996-08-16|1996-06-20|1996-09-03|NONE|REG AIR|dugouts. regular forges haggle +38211|594|25|2|10|14945.90|0.01|0.01|N|O|1996-08-18|1996-07-24|1996-09-11|TAKE BACK RETURN|MAIL|osits wake furiously above the slyly ironi +38211|468|56|3|50|68423.00|0.01|0.00|N|O|1996-05-27|1996-07-10|1996-06-26|DELIVER IN PERSON|REG AIR|ts haggle. carefully i +38211|754|19|4|38|62880.50|0.09|0.00|N|O|1996-06-03|1996-07-22|1996-06-26|NONE|RAIL|ial platelets above the ideas dazzle sl +38211|880|47|5|46|81920.48|0.01|0.03|N|O|1996-05-17|1996-06-28|1996-06-08|TAKE BACK RETURN|AIR|ly regular instructions +38211|379|8|6|29|37101.73|0.03|0.03|N|O|1996-07-09|1996-06-23|1996-07-29|NONE|SHIP|en pinto beans wake carefully pi +38211|1978|23|7|18|33839.46|0.08|0.01|N|O|1996-05-30|1996-07-10|1996-06-17|NONE|FOB|oggedly slyly regular pinto beans-- sp +38212|1561|2|1|49|71665.44|0.08|0.07|N|F|1995-05-29|1995-05-28|1995-06-20|NONE|REG AIR|iously carefully ironic instruction +38212|1564|65|2|42|61553.52|0.03|0.03|R|F|1995-04-10|1995-05-31|1995-05-10|TAKE BACK RETURN|MAIL|uriously bold dependen +38212|518|9|3|41|58158.91|0.03|0.08|N|O|1995-06-24|1995-06-11|1995-07-22|TAKE BACK RETURN|TRUCK|ans x-ray according to t +38212|1912|1|4|26|47161.66|0.03|0.02|N|F|1995-06-02|1995-06-05|1995-06-18|DELIVER IN PERSON|MAIL|leep stealthily ironic accounts. +38212|799|64|5|11|18697.69|0.04|0.02|N|O|1995-07-29|1995-06-27|1995-08-11|DELIVER IN PERSON|RAIL|y regular requests. final theodolites acc +38212|351|80|6|25|31283.75|0.06|0.08|R|F|1995-04-14|1995-06-20|1995-04-25|DELIVER IN PERSON|FOB|ously pending requests. +38212|1062|63|7|34|32744.04|0.07|0.05|N|O|1995-07-05|1995-05-16|1995-07-29|NONE|FOB|deposits use slyly final instructions. fur +38213|1007|13|1|18|16344.00|0.04|0.04|N|O|1996-11-28|1996-11-21|1996-12-11|NONE|FOB|ily above the sly +38213|1694|36|2|8|12765.52|0.00|0.06|N|O|1996-12-07|1996-11-21|1997-01-03|COLLECT COD|REG AIR|slyly regular +38213|1620|44|3|44|66951.28|0.03|0.07|N|O|1997-01-11|1996-11-21|1997-02-05|COLLECT COD|AIR|ons use carefully. carefully e +38213|1729|56|4|41|66859.52|0.05|0.01|N|O|1996-12-11|1996-11-21|1997-01-10|TAKE BACK RETURN|AIR|blithely even accounts. slyly pending +38213|495|96|5|49|68379.01|0.09|0.05|N|O|1996-12-17|1996-12-01|1996-12-20|TAKE BACK RETURN|SHIP| furiously regular the +38213|378|63|6|21|26845.77|0.00|0.02|N|O|1996-10-31|1996-12-14|1996-11-07|DELIVER IN PERSON|SHIP|ding packages. slyly express accounts c +38214|798|63|1|41|69650.39|0.00|0.08|N|O|1996-10-31|1996-12-05|1996-11-25|TAKE BACK RETURN|MAIL|y pending deposits: even foxes +38214|860|60|2|19|33456.34|0.06|0.07|N|O|1997-02-06|1996-11-24|1997-02-28|DELIVER IN PERSON|REG AIR| carefully throughout the s +38214|1538|59|3|36|51823.08|0.05|0.06|N|O|1996-10-15|1996-11-16|1996-10-23|DELIVER IN PERSON|FOB|sly after the final asymptotes +38215|1456|57|1|13|17646.85|0.07|0.02|A|F|1993-02-25|1993-02-21|1993-03-21|NONE|REG AIR|g ideas boost quickly across the blithe +38215|168|69|2|40|42726.40|0.02|0.04|R|F|1993-03-05|1993-02-11|1993-03-10|COLLECT COD|RAIL|y regular pinto beans wak +38215|36|37|3|24|22464.72|0.09|0.04|A|F|1993-03-10|1993-03-16|1993-03-17|TAKE BACK RETURN|TRUCK|e packages. +38215|531|32|4|37|52966.61|0.09|0.07|A|F|1993-02-26|1993-03-10|1993-03-24|TAKE BACK RETURN|AIR|sits sleep slyly across the blithely regula +38215|1814|15|5|33|56621.73|0.07|0.02|R|F|1993-02-26|1993-03-26|1993-03-03|NONE|RAIL|encies. furiously even foxes +38215|790|87|6|8|13526.32|0.01|0.06|A|F|1993-02-19|1993-02-16|1993-03-04|NONE|MAIL| patterns are ruthlessly after the pend +38240|125|26|1|40|41004.80|0.02|0.01|R|F|1995-03-22|1995-01-21|1995-04-11|TAKE BACK RETURN|REG AIR|nt requests. final, express theodol +38240|152|31|2|41|43138.15|0.09|0.01|R|F|1995-03-28|1995-01-30|1995-04-10|DELIVER IN PERSON|MAIL|e special, ironic accounts cajole fu +38240|177|30|3|3|3231.51|0.02|0.07|R|F|1995-03-02|1995-01-19|1995-03-17|DELIVER IN PERSON|FOB|fily ironic ideas: q +38240|860|60|4|5|8804.30|0.02|0.02|A|F|1995-01-10|1995-01-28|1995-02-07|TAKE BACK RETURN|MAIL|ss the carefully regular requests haggle c +38241|1666|49|1|16|25082.56|0.04|0.07|A|F|1995-01-14|1995-01-22|1995-01-26|COLLECT COD|MAIL|odolites doubt. +38241|856|23|2|38|66760.30|0.07|0.06|A|F|1994-12-31|1995-01-11|1995-01-22|TAKE BACK RETURN|MAIL|ts are quickly deposits. r +38242|1143|52|1|1|1044.14|0.06|0.00|R|F|1992-07-02|1992-06-10|1992-07-31|NONE|SHIP|s haggle bold packages. slyly regul +38242|440|41|2|47|63000.68|0.07|0.02|A|F|1992-05-02|1992-06-08|1992-05-10|TAKE BACK RETURN|TRUCK| x-ray quickly: re +38242|1215|27|3|27|30137.67|0.02|0.06|R|F|1992-05-25|1992-07-13|1992-06-17|DELIVER IN PERSON|FOB|nic, regular accounts haggle s +38242|1721|64|4|38|61663.36|0.08|0.01|R|F|1992-07-27|1992-07-17|1992-08-20|TAKE BACK RETURN|SHIP|bold accounts sleep +38242|1497|98|5|50|69924.50|0.02|0.05|A|F|1992-06-28|1992-07-16|1992-07-06|DELIVER IN PERSON|AIR| slyly ironic foxes. brave dep +38242|462|21|6|29|39511.34|0.05|0.05|R|F|1992-06-21|1992-06-26|1992-07-05|DELIVER IN PERSON|SHIP|packages. fluff +38242|146|73|7|29|30338.06|0.01|0.07|R|F|1992-07-10|1992-05-22|1992-07-17|TAKE BACK RETURN|FOB|ironic courts cajole furiously final the +38243|1536|77|1|23|33063.19|0.07|0.01|A|F|1994-10-19|1994-09-27|1994-10-31|DELIVER IN PERSON|TRUCK|packages are slyly +38243|743|40|2|18|29587.32|0.09|0.04|R|F|1994-12-23|1994-10-30|1995-01-05|TAKE BACK RETURN|FOB|e furiously along +38243|664|27|3|39|61021.74|0.04|0.01|R|F|1994-10-10|1994-11-21|1994-11-03|TAKE BACK RETURN|MAIL|ickly according to the carefully +38243|312|97|4|39|47280.09|0.02|0.04|R|F|1994-11-10|1994-11-17|1994-11-25|DELIVER IN PERSON|MAIL|platelets are sl +38244|1139|12|1|42|43685.46|0.06|0.00|N|O|1997-06-14|1997-08-22|1997-06-15|DELIVER IN PERSON|TRUCK|ccounts are regularly. accounts d +38244|1689|31|2|20|31813.60|0.04|0.06|N|O|1997-08-31|1997-07-30|1997-09-10|COLLECT COD|TRUCK|onic accounts. final waters +38244|891|58|3|18|32254.02|0.10|0.06|N|O|1997-08-01|1997-08-09|1997-08-09|NONE|MAIL|sts. blithely bold epitaphs a +38244|332|61|4|19|23414.27|0.01|0.00|N|O|1997-06-25|1997-08-03|1997-07-15|TAKE BACK RETURN|FOB|ess, ironic foxes. furiously reg +38245|1391|68|1|43|55572.77|0.04|0.04|A|F|1993-06-12|1993-07-20|1993-07-06|NONE|SHIP| dolphins was furiously quickly bold +38246|98|74|1|36|35931.24|0.05|0.08|N|O|1996-09-08|1996-09-25|1996-09-17|COLLECT COD|REG AIR| instructions cajole quic +38246|1253|28|2|7|8079.75|0.00|0.06|N|O|1996-11-15|1996-11-14|1996-12-11|TAKE BACK RETURN|REG AIR| requests run fluffily th +38246|80|31|3|11|10780.88|0.06|0.05|N|O|1996-12-14|1996-11-01|1997-01-06|COLLECT COD|AIR|ckages. unusual, ironic re +38246|1558|59|4|7|10216.85|0.05|0.08|N|O|1996-09-01|1996-10-15|1996-09-19|DELIVER IN PERSON|REG AIR|regular, even dependencies wake qu +38247|1574|75|1|26|38364.82|0.10|0.07|N|O|1997-11-29|1997-11-23|1997-12-29|NONE|REG AIR|xpress excuses. carefully +38247|1435|53|2|7|9355.01|0.05|0.02|N|O|1997-10-02|1997-11-30|1997-10-26|NONE|MAIL|ecial accounts. special w +38272|351|52|1|48|60064.80|0.01|0.07|N|O|1996-02-19|1996-01-09|1996-03-03|COLLECT COD|SHIP|ealthily regular foxes about the blithely +38272|691|85|2|33|52525.77|0.00|0.08|N|O|1996-03-11|1996-02-02|1996-04-01|NONE|SHIP|gular requests nag water +38272|1986|75|3|49|92511.02|0.07|0.05|N|O|1995-12-07|1996-01-27|1995-12-26|COLLECT COD|TRUCK|lites wake. unusual, regular +38273|179|32|1|40|43166.80|0.10|0.08|A|F|1993-04-29|1993-03-26|1993-04-30|NONE|TRUCK|ly regular ideas. slyly final dependencie +38273|1353|92|2|40|50174.00|0.08|0.01|R|F|1993-03-12|1993-04-06|1993-04-09|COLLECT COD|REG AIR|thely ironic +38274|1703|46|1|50|80235.00|0.07|0.07|N|O|1995-08-03|1995-07-26|1995-09-02|NONE|RAIL|, final requests cajole s +38274|164|43|2|44|46823.04|0.09|0.07|N|O|1995-08-20|1995-07-21|1995-08-21|COLLECT COD|AIR|fily final platelets. carefully regular +38274|311|40|3|17|20592.27|0.05|0.04|N|O|1995-08-29|1995-08-04|1995-09-12|COLLECT COD|TRUCK|uickly fluffy asymptotes +38274|1723|24|4|36|58489.92|0.01|0.02|N|O|1995-09-27|1995-08-22|1995-10-26|COLLECT COD|REG AIR| regular accounts. qu +38274|1404|5|5|36|46994.40|0.04|0.07|N|O|1995-06-29|1995-07-28|1995-07-09|TAKE BACK RETURN|AIR|uffily final accounts wake furiously again +38275|507|8|1|18|25335.00|0.01|0.08|N|O|1997-01-19|1997-03-12|1997-01-24|TAKE BACK RETURN|REG AIR|nstructions wake careful +38275|1896|97|2|7|12585.23|0.03|0.00|N|O|1997-04-18|1997-03-06|1997-04-20|COLLECT COD|MAIL|will have +38275|1579|60|3|17|25169.69|0.06|0.04|N|O|1997-03-22|1997-03-20|1997-04-02|NONE|FOB|y carefully even requests. unusual, e +38275|1628|52|4|35|53536.70|0.05|0.08|N|O|1997-01-19|1997-02-21|1997-01-28|COLLECT COD|TRUCK|e carefully express +38275|482|41|5|49|67741.52|0.10|0.05|N|O|1997-02-13|1997-02-03|1997-02-17|DELIVER IN PERSON|AIR| accounts boost furiously acros +38275|1758|43|6|29|48132.75|0.04|0.05|N|O|1997-01-25|1997-02-18|1997-02-04|COLLECT COD|REG AIR|ggle idly. final +38275|1012|18|7|15|13695.15|0.00|0.01|N|O|1997-01-17|1997-02-06|1997-02-08|COLLECT COD|RAIL|ress platelets. quickly final pa +38276|1779|22|1|37|62188.49|0.06|0.02|N|O|1996-05-22|1996-05-13|1996-06-13|DELIVER IN PERSON|SHIP|gainst the blithely silent excuses. +38276|434|93|2|10|13344.30|0.05|0.03|N|O|1996-05-29|1996-06-02|1996-05-30|NONE|FOB|es haggle blithely unusual +38276|474|4|3|36|49480.92|0.02|0.07|N|O|1996-05-16|1996-05-14|1996-05-19|DELIVER IN PERSON|TRUCK|ep fluffily even requests. blithe +38276|1287|99|4|7|8317.96|0.00|0.01|N|O|1996-03-26|1996-06-11|1996-04-19|TAKE BACK RETURN|TRUCK|ly. pinto beans need to thrash aft +38276|615|16|5|45|68202.45|0.06|0.07|N|O|1996-04-06|1996-05-29|1996-04-26|TAKE BACK RETURN|FOB|r, regular +38277|1522|23|1|7|9964.64|0.08|0.06|R|F|1992-03-08|1992-03-29|1992-03-23|TAKE BACK RETURN|RAIL|o beans about the furiously expre +38277|911|14|2|7|12683.37|0.06|0.02|R|F|1992-05-02|1992-04-01|1992-05-09|TAKE BACK RETURN|AIR|ts wake furiously unusual plat +38278|1227|2|1|8|9025.76|0.05|0.05|N|O|1995-11-29|1995-10-03|1995-12-24|DELIVER IN PERSON|REG AIR| after the carefully pending th +38279|1247|59|1|43|49374.32|0.06|0.05|A|F|1992-07-27|1992-05-30|1992-08-05|NONE|MAIL|es unusual t +38279|220|48|2|21|23524.62|0.02|0.00|A|F|1992-07-14|1992-06-12|1992-07-17|DELIVER IN PERSON|AIR|nstructions. ironic, regu +38279|1730|57|3|34|55478.82|0.10|0.05|A|F|1992-05-01|1992-06-16|1992-05-07|TAKE BACK RETURN|RAIL|le slyly. carefully bold accounts +38279|923|92|4|2|3647.84|0.10|0.05|A|F|1992-07-17|1992-06-12|1992-08-04|NONE|MAIL|the even courts. u +38279|991|26|5|30|56759.70|0.06|0.04|R|F|1992-08-26|1992-06-17|1992-08-28|COLLECT COD|FOB|ver ironic theodolites. slyly +38304|1532|73|1|3|4300.59|0.02|0.01|N|O|1995-07-13|1995-05-13|1995-07-19|NONE|AIR|alongside of the carefu +38304|400|29|2|8|10403.20|0.09|0.05|R|F|1995-06-02|1995-05-30|1995-06-10|TAKE BACK RETURN|REG AIR|after the ironi +38304|1268|6|3|1|1169.26|0.01|0.08|R|F|1995-06-04|1995-06-20|1995-06-16|NONE|RAIL|sleep carefully. regula +38304|688|51|4|28|44483.04|0.01|0.02|A|F|1995-05-18|1995-05-03|1995-06-08|NONE|RAIL|gular instructions cajole abov +38305|919|22|1|26|47317.66|0.06|0.03|N|O|1995-08-10|1995-06-29|1995-08-22|NONE|REG AIR|requests. furiously express excuses b +38305|1378|55|2|10|12793.70|0.05|0.03|N|O|1995-07-05|1995-06-30|1995-08-03|TAKE BACK RETURN|FOB|s detect silent accounts. final, even sheav +38305|1953|86|3|11|20404.45|0.03|0.04|N|F|1995-06-13|1995-07-05|1995-07-05|TAKE BACK RETURN|TRUCK|s the unusual attainments. +38305|473|32|4|42|57685.74|0.06|0.04|R|F|1995-05-23|1995-06-16|1995-06-06|COLLECT COD|TRUCK|n carefully packages. ironic reques +38306|1876|63|1|42|74670.54|0.06|0.07|N|O|1996-08-07|1996-10-02|1996-08-24|DELIVER IN PERSON|RAIL|. furiously regular accou +38306|776|73|2|44|73777.88|0.06|0.00|N|O|1996-10-23|1996-08-25|1996-11-02|DELIVER IN PERSON|FOB|carefully ab +38306|500|30|3|6|8403.00|0.07|0.08|N|O|1996-07-20|1996-09-03|1996-08-18|COLLECT COD|SHIP|final pinto beans sleep th +38306|1766|9|4|32|53368.32|0.05|0.08|N|O|1996-08-22|1996-10-05|1996-09-21|TAKE BACK RETURN|FOB|ual deposits are carefully. f +38306|1197|34|5|3|3294.57|0.00|0.00|N|O|1996-08-22|1996-09-23|1996-09-06|NONE|FOB|ttainments. ironic pac +38307|302|3|1|50|60115.00|0.09|0.00|N|O|1998-01-22|1998-03-26|1998-02-02|NONE|REG AIR|ickly regular excuses +38307|655|18|2|40|62226.00|0.02|0.03|N|O|1998-03-25|1998-04-19|1998-04-14|TAKE BACK RETURN|SHIP|about the slyly +38308|1734|77|1|10|16357.30|0.01|0.05|N|O|1996-10-16|1996-11-24|1996-10-27|NONE|TRUCK|ously. carefully +38308|1064|70|2|1|965.06|0.02|0.06|N|O|1996-09-11|1996-11-14|1996-09-29|DELIVER IN PERSON|TRUCK| the blithel +38308|655|18|3|17|26446.05|0.10|0.00|N|O|1996-12-06|1996-10-19|1996-12-17|NONE|REG AIR|es final frets boost blithely. q +38308|1150|51|4|14|14716.10|0.00|0.06|N|O|1996-11-04|1996-09-30|1996-12-04|NONE|TRUCK|instructions lose. regular requests do +38308|1968|69|5|23|43009.08|0.01|0.01|N|O|1996-10-28|1996-10-07|1996-11-20|COLLECT COD|RAIL|. slyly bold packages are blithely caref +38308|763|64|6|43|71541.68|0.09|0.00|N|O|1996-08-29|1996-10-03|1996-09-17|DELIVER IN PERSON|RAIL|long the slyly even p +38308|182|9|7|39|42205.02|0.03|0.02|N|O|1996-10-01|1996-10-24|1996-10-22|COLLECT COD|TRUCK| furiously near the +38309|446|76|1|35|47125.40|0.02|0.04|N|O|1996-07-24|1996-06-26|1996-08-23|NONE|FOB|requests against the blithely expr +38309|1930|75|2|27|49462.11|0.09|0.05|N|O|1996-06-26|1996-07-06|1996-06-29|TAKE BACK RETURN|FOB|n foxes. furiously express requests mol +38309|1251|26|3|42|48394.50|0.08|0.07|N|O|1996-07-17|1996-08-02|1996-08-07|TAKE BACK RETURN|SHIP|ole blithel +38309|839|40|4|23|40016.09|0.10|0.06|N|O|1996-06-15|1996-07-04|1996-07-11|DELIVER IN PERSON|RAIL| bold pinto beans? al +38309|210|11|5|23|25534.83|0.02|0.05|N|O|1996-05-23|1996-06-22|1996-05-24|COLLECT COD|SHIP|haggle slyly carefully regula +38309|894|61|6|28|50256.92|0.02|0.05|N|O|1996-07-23|1996-06-19|1996-07-28|NONE|RAIL|s. furiously ironic excuses nag flu +38309|1174|75|7|2|2150.34|0.04|0.01|N|O|1996-06-12|1996-07-17|1996-06-21|COLLECT COD|SHIP|ully silent frets use quickl +38310|1533|54|1|8|11476.24|0.03|0.06|A|F|1992-07-31|1992-06-18|1992-08-13|TAKE BACK RETURN|SHIP|ly unusual packages. p +38310|526|57|2|6|8559.12|0.10|0.07|A|F|1992-06-09|1992-05-23|1992-06-23|COLLECT COD|TRUCK|lly regular ideas. express foxes nag b +38310|674|68|3|44|69285.48|0.01|0.07|A|F|1992-05-24|1992-06-08|1992-06-09|COLLECT COD|FOB|ainments are express gifts. p +38311|1547|68|1|11|15933.94|0.06|0.01|N|O|1995-07-20|1995-07-15|1995-08-04|TAKE BACK RETURN|FOB|ructions. carefully regular accounts boost +38311|1129|66|2|19|19572.28|0.01|0.04|N|F|1995-05-29|1995-06-26|1995-06-21|NONE|FOB|ar ideas are slyly ironic excuses. slyl +38311|1421|22|3|25|33060.50|0.08|0.01|N|F|1995-06-06|1995-07-18|1995-07-03|NONE|MAIL|bove the slyl +38311|1355|56|4|24|30152.40|0.04|0.00|N|O|1995-08-12|1995-06-13|1995-08-24|DELIVER IN PERSON|SHIP|accounts sleep fluffily. ruthless foxes nag +38311|926|61|5|7|12788.44|0.07|0.06|N|O|1995-06-24|1995-07-08|1995-06-25|COLLECT COD|REG AIR|ing deposits boost furiousl +38311|531|32|6|23|32925.19|0.08|0.05|A|F|1995-05-19|1995-05-24|1995-05-28|COLLECT COD|SHIP|he furiously final deposits. blithe pack +38336|1615|98|1|49|74313.89|0.05|0.00|A|F|1992-12-01|1992-12-18|1992-12-21|DELIVER IN PERSON|FOB|o beans cajole about t +38336|679|80|2|49|77403.83|0.00|0.03|R|F|1993-02-01|1993-01-02|1993-02-24|DELIVER IN PERSON|FOB|nag fluffily. spec +38336|1583|64|3|12|17814.96|0.00|0.08|R|F|1992-12-19|1992-11-16|1992-12-20|COLLECT COD|REG AIR|r. even dependencies wake quickly. exp +38337|928|29|1|30|54867.60|0.03|0.04|R|F|1993-11-12|1994-01-21|1993-12-09|DELIVER IN PERSON|REG AIR|ep slyly against the regular depos +38337|954|55|2|42|77907.90|0.04|0.00|A|F|1994-03-01|1993-12-21|1994-03-30|TAKE BACK RETURN|MAIL|fully regular escapades. f +38337|1453|54|3|34|46051.30|0.08|0.00|A|F|1994-02-07|1993-12-09|1994-03-06|NONE|FOB|uriously fluffily ironic accounts? +38337|1937|82|4|47|86429.71|0.09|0.00|A|F|1993-11-02|1993-12-21|1993-11-09|TAKE BACK RETURN|MAIL|accounts beneath the quickly final inst +38338|844|45|1|10|17448.40|0.03|0.02|N|O|1998-07-15|1998-06-15|1998-07-27|COLLECT COD|REG AIR| blithely pending requests nag slyly a +38338|1197|34|2|22|24160.18|0.09|0.00|N|O|1998-04-29|1998-05-11|1998-04-30|NONE|REG AIR| blithely special dinos sleep blith +38338|255|37|3|21|24260.25|0.10|0.04|N|O|1998-06-20|1998-06-01|1998-07-19|COLLECT COD|AIR|t the bold inst +38338|1715|42|4|25|40417.75|0.02|0.01|N|O|1998-06-30|1998-05-06|1998-07-04|COLLECT COD|AIR|heodolites. +38338|1846|33|5|7|12234.88|0.04|0.00|N|O|1998-05-02|1998-05-25|1998-05-25|NONE|MAIL|furiously ironic accounts +38339|416|46|1|38|50023.58|0.08|0.04|N|O|1996-09-24|1996-10-25|1996-10-07|NONE|RAIL|ns alongside +38339|409|68|2|17|22259.80|0.09|0.02|N|O|1996-12-26|1996-11-05|1997-01-17|COLLECT COD|REG AIR|r, even accounts? blithel +38339|930|65|3|28|51266.04|0.06|0.05|N|O|1996-09-10|1996-11-17|1996-09-18|COLLECT COD|TRUCK|ffily ironic co +38340|1687|29|1|35|55603.80|0.03|0.02|A|F|1994-05-03|1994-04-03|1994-05-16|TAKE BACK RETURN|FOB|thely past the blithely +38340|668|69|2|15|23529.90|0.05|0.03|R|F|1994-03-17|1994-04-06|1994-04-01|COLLECT COD|REG AIR|uests use above the specia +38340|1917|62|3|14|25464.74|0.08|0.08|A|F|1994-02-15|1994-02-24|1994-03-11|DELIVER IN PERSON|AIR|he furiously regular deposits. inst +38341|385|42|1|17|21851.46|0.01|0.03|R|F|1994-09-08|1994-06-21|1994-10-07|TAKE BACK RETURN|FOB| even, ironic accounts cajol +38341|137|16|2|17|17631.21|0.01|0.06|R|F|1994-06-01|1994-07-29|1994-06-15|TAKE BACK RETURN|FOB|s play furiou +38341|896|97|3|8|14375.12|0.06|0.05|A|F|1994-06-03|1994-08-12|1994-06-08|NONE|RAIL|lithely even gifts. regular ideas use +38341|392|21|4|10|12923.90|0.07|0.08|A|F|1994-07-16|1994-07-28|1994-08-13|DELIVER IN PERSON|MAIL|e furiously. regular, silent +38342|109|88|1|17|17154.70|0.04|0.06|N|O|1995-07-10|1995-06-22|1995-08-08|NONE|SHIP|ly ironic deposi +38342|529|60|2|10|14295.20|0.03|0.05|N|O|1995-07-05|1995-07-31|1995-07-28|DELIVER IN PERSON|REG AIR|egular, final excuses. dogged packa +38342|38|39|3|46|43149.38|0.04|0.06|N|O|1995-07-24|1995-07-18|1995-08-15|TAKE BACK RETURN|RAIL|p quickly reg +38342|1890|34|4|50|89594.50|0.03|0.08|N|O|1995-07-02|1995-07-22|1995-07-25|DELIVER IN PERSON|FOB|ternes above the ideas cajole quickly +38343|1203|41|1|50|55210.00|0.10|0.05|N|O|1995-11-25|1995-12-02|1995-12-11|TAKE BACK RETURN|AIR|lyly pending, final inst +38368|1962|51|1|24|44735.04|0.07|0.03|R|F|1994-04-28|1994-04-30|1994-05-11|DELIVER IN PERSON|FOB|es detect regular +38369|309|94|1|14|16930.20|0.03|0.06|A|F|1993-03-11|1993-03-23|1993-03-23|NONE|REG AIR|le blithely ironic theodo +38369|591|22|2|30|44747.70|0.08|0.08|A|F|1993-05-09|1993-03-14|1993-05-28|TAKE BACK RETURN|RAIL|ic packages. furiously thin reques +38369|717|14|3|24|38825.04|0.10|0.08|R|F|1993-03-20|1993-03-01|1993-04-14|COLLECT COD|SHIP|ly ironic pinto +38369|96|47|4|15|14941.35|0.09|0.07|R|F|1993-04-08|1993-03-17|1993-04-29|TAKE BACK RETURN|SHIP|hinder. blithely even deposits +38370|839|39|1|17|29577.11|0.06|0.00|R|F|1995-05-14|1995-05-11|1995-05-25|NONE|FOB|t the quickly special f +38370|1346|23|2|33|41162.22|0.06|0.01|N|F|1995-06-12|1995-06-26|1995-07-02|NONE|MAIL|ly slyly ironic foxes! pen +38370|1319|58|3|44|53693.64|0.04|0.05|N|O|1995-08-02|1995-05-29|1995-08-11|TAKE BACK RETURN|SHIP|about the slyly regular +38370|1175|84|4|29|31208.93|0.03|0.01|A|F|1995-05-09|1995-05-13|1995-05-25|COLLECT COD|TRUCK|s. furiously daring +38370|627|90|5|34|51939.08|0.03|0.06|N|O|1995-07-11|1995-05-16|1995-08-09|NONE|MAIL|lar requests at +38371|292|47|1|45|53653.05|0.04|0.06|A|F|1994-11-10|1994-12-25|1994-11-26|TAKE BACK RETURN|TRUCK|ake slyly even +38372|991|94|1|13|24595.87|0.06|0.08|R|F|1993-05-28|1993-08-12|1993-06-23|DELIVER IN PERSON|FOB|sy accounts h +38372|1739|82|2|47|77114.31|0.02|0.06|R|F|1993-05-20|1993-07-02|1993-05-25|NONE|AIR| carefully sly theodolites across the +38372|316|17|3|8|9730.48|0.04|0.05|R|F|1993-07-03|1993-08-07|1993-07-23|COLLECT COD|AIR| of the furiously even dependencies. sl +38372|500|1|4|18|25209.00|0.02|0.04|R|F|1993-08-25|1993-07-29|1993-09-06|NONE|AIR|n foxes along the bli +38372|792|57|5|6|10156.74|0.04|0.08|A|F|1993-07-30|1993-08-08|1993-08-26|NONE|REG AIR|e special requests. packages eat care +38373|1352|53|1|37|46373.95|0.06|0.07|N|O|1997-12-20|1998-01-02|1998-01-02|NONE|FOB|bold asymptotes! +38373|1164|73|2|9|9586.44|0.07|0.08|N|O|1997-11-20|1997-12-11|1997-12-15|DELIVER IN PERSON|REG AIR|le deposits. packages nag sl +38373|1284|85|3|47|55708.16|0.00|0.04|N|O|1998-01-19|1997-11-10|1998-02-10|NONE|TRUCK|g evenly at +38373|235|90|4|27|30651.21|0.07|0.08|N|O|1997-12-27|1997-12-27|1998-01-14|DELIVER IN PERSON|MAIL|ely across the bus +38373|205|6|5|15|16578.00|0.04|0.04|N|O|1998-01-05|1997-12-20|1998-01-29|TAKE BACK RETURN|REG AIR|ly pending packages on the carefully final +38373|1319|58|6|35|42710.85|0.00|0.05|N|O|1997-11-21|1997-12-12|1997-12-07|COLLECT COD|AIR| the regular theodolites nag blithely care +38374|1298|73|1|2|2398.58|0.00|0.02|A|F|1995-06-02|1995-08-06|1995-06-03|NONE|FOB|the carefully final attai +38374|725|22|2|39|63403.08|0.10|0.04|N|O|1995-07-20|1995-08-10|1995-07-23|TAKE BACK RETURN|REG AIR|ly final, silent pinto beans? +38374|858|25|3|28|49247.80|0.01|0.08|N|O|1995-06-22|1995-07-06|1995-06-30|NONE|SHIP|g instructions integrate carefully fluf +38374|1339|40|4|10|12403.30|0.02|0.08|N|O|1995-07-27|1995-07-02|1995-08-16|DELIVER IN PERSON|REG AIR|ironic accou +38374|1128|37|5|45|46310.40|0.08|0.01|N|O|1995-09-08|1995-07-07|1995-10-01|DELIVER IN PERSON|TRUCK| the blithely ironic foxes wake according t +38374|1013|49|6|36|32904.36|0.06|0.01|N|O|1995-07-28|1995-07-05|1995-08-16|DELIVER IN PERSON|RAIL|ounts haggle regularl +38375|547|8|1|13|18818.02|0.04|0.04|N|O|1996-06-27|1996-06-22|1996-07-01|TAKE BACK RETURN|RAIL|ts. fluffily special pinto bean +38400|371|100|1|7|8899.59|0.09|0.03|A|F|1995-01-16|1995-03-03|1995-01-21|TAKE BACK RETURN|SHIP|gular instructions sleep carefully +38400|1060|66|2|5|4805.30|0.05|0.05|A|F|1994-12-31|1995-01-22|1995-01-11|TAKE BACK RETURN|MAIL|xpress requests sleep. bold, ironic +38400|1096|32|3|30|29912.70|0.07|0.05|A|F|1995-01-23|1995-02-28|1995-02-17|DELIVER IN PERSON|SHIP| quickly final accounts boost slyly. bli +38400|671|65|4|35|55008.45|0.04|0.05|A|F|1995-04-15|1995-03-11|1995-05-13|COLLECT COD|TRUCK|? furiously reg +38400|1631|32|5|12|18391.56|0.02|0.06|A|F|1994-12-24|1995-02-18|1995-01-03|TAKE BACK RETURN|MAIL| against the carefully thin requests. f +38400|846|47|6|37|64633.08|0.05|0.02|A|F|1995-03-26|1995-03-14|1995-04-03|DELIVER IN PERSON|SHIP|kages are slyly about the some +38400|432|20|7|10|13324.30|0.10|0.00|A|F|1995-03-19|1995-01-23|1995-04-10|TAKE BACK RETURN|FOB|posits. carefully regular requests haggl +38401|750|47|1|20|33015.00|0.03|0.01|N|O|1998-10-06|1998-09-02|1998-11-03|TAKE BACK RETURN|SHIP|onic platelets boost about the bravely sp +38401|273|1|2|34|39891.18|0.07|0.00|N|O|1998-10-03|1998-09-23|1998-11-02|TAKE BACK RETURN|FOB|es across the ruthlessly pending pinto +38401|429|88|3|7|9305.94|0.07|0.08|N|O|1998-07-24|1998-09-25|1998-08-06|TAKE BACK RETURN|AIR|rave foxes sleep fluffily. regular, un +38401|232|14|4|6|6793.38|0.01|0.06|N|O|1998-08-19|1998-08-12|1998-09-18|DELIVER IN PERSON|TRUCK|es dazzle fluffily busy deposits. +38402|1509|30|1|7|9873.50|0.00|0.01|N|O|1996-09-13|1996-10-14|1996-09-17|TAKE BACK RETURN|REG AIR|otes-- ironic requests according to the bli +38402|1236|74|2|22|25019.06|0.08|0.03|N|O|1996-11-22|1996-10-30|1996-12-03|COLLECT COD|TRUCK|lyly special accounts. f +38402|1818|19|3|47|80831.07|0.07|0.05|N|O|1996-09-16|1996-10-17|1996-09-19|COLLECT COD|FOB|final packages? even, regul +38402|965|34|4|26|48514.96|0.09|0.04|N|O|1996-12-19|1996-10-13|1996-12-20|NONE|TRUCK|express deposits wake. platele +38402|230|85|5|38|42948.74|0.06|0.02|N|O|1996-12-08|1996-11-03|1996-12-23|TAKE BACK RETURN|REG AIR|ymptotes boost car +38402|1590|11|6|11|16407.49|0.03|0.03|N|O|1996-10-05|1996-11-10|1996-10-24|COLLECT COD|SHIP|uctions. bold plat +38402|823|90|7|13|22409.66|0.01|0.01|N|O|1996-10-13|1996-10-22|1996-11-04|TAKE BACK RETURN|FOB|venly unusual foxes sl +38403|1587|28|1|48|71451.84|0.10|0.05|A|F|1995-05-23|1995-07-06|1995-05-31|TAKE BACK RETURN|TRUCK|of the bold requests. fluffily final r +38403|1122|31|2|16|16369.92|0.09|0.01|A|F|1995-05-26|1995-07-22|1995-06-07|DELIVER IN PERSON|REG AIR|refully since the even, ironic th +38403|1041|42|3|18|16956.72|0.06|0.05|R|F|1995-05-23|1995-07-16|1995-06-10|TAKE BACK RETURN|RAIL|he slyly even epitaphs. silent, regu +38403|1853|54|4|24|42116.40|0.09|0.04|N|O|1995-07-11|1995-07-25|1995-07-26|NONE|SHIP|de of the unusual requests. fin +38404|277|32|1|4|4709.08|0.00|0.07|A|F|1994-04-24|1994-03-29|1994-05-11|COLLECT COD|AIR|, even deposits was carefully. slyly +38405|1245|83|1|48|55019.52|0.00|0.07|R|F|1993-10-11|1993-10-05|1993-10-21|DELIVER IN PERSON|RAIL| doubt quickly carefully bold requests. re +38405|250|5|2|49|56362.25|0.03|0.04|R|F|1993-10-20|1993-10-14|1993-10-22|NONE|FOB|tect carefully fluffily ironic accounts. sl +38405|1105|78|3|17|17103.70|0.06|0.08|A|F|1993-08-19|1993-09-09|1993-08-25|COLLECT COD|FOB|e carefully unusual f +38405|1925|26|4|28|51153.76|0.08|0.00|R|F|1993-10-12|1993-08-31|1993-11-03|COLLECT COD|MAIL|uriously regular deposits sleep. inst +38405|811|11|5|41|70184.21|0.02|0.06|A|F|1993-09-16|1993-10-05|1993-09-21|TAKE BACK RETURN|AIR|l requests. unusual, ev +38405|1491|92|6|45|62662.05|0.03|0.01|R|F|1993-08-06|1993-08-16|1993-08-21|COLLECT COD|RAIL|egular pinto beans +38405|116|17|7|43|43692.73|0.00|0.03|A|F|1993-07-24|1993-09-04|1993-08-12|COLLECT COD|MAIL|cial deposits are quickly among the +38406|1327|4|1|21|25794.72|0.10|0.08|R|F|1993-12-18|1994-01-21|1993-12-19|TAKE BACK RETURN|FOB|nstructions-- furiously even packages b +38406|1928|29|2|8|14639.36|0.06|0.07|R|F|1994-02-08|1994-02-24|1994-03-04|COLLECT COD|RAIL|esias. furiously speci +38406|656|57|3|31|48256.15|0.01|0.07|A|F|1994-01-09|1994-01-16|1994-01-17|DELIVER IN PERSON|MAIL|ly special accounts integrate quickly +38406|1670|12|4|26|40863.42|0.02|0.07|A|F|1993-12-25|1994-01-13|1994-01-14|NONE|SHIP| the furiously ir +38406|1561|82|5|11|16088.16|0.01|0.06|A|F|1994-03-29|1994-02-27|1994-04-07|NONE|AIR|gle. express pinto beans cajol +38406|302|3|6|26|31259.80|0.08|0.07|A|F|1994-02-23|1994-02-16|1994-03-15|TAKE BACK RETURN|TRUCK|ke furiously regular a +38406|1482|22|7|7|9684.36|0.02|0.08|R|F|1993-12-31|1994-01-17|1994-01-07|COLLECT COD|RAIL|its haggle across the carefully +38407|432|91|1|31|41305.33|0.07|0.06|N|O|1997-11-15|1997-12-26|1997-11-26|TAKE BACK RETURN|SHIP|the blithely silent +38407|1680|63|2|9|14235.12|0.10|0.03|N|O|1997-12-03|1997-12-03|1997-12-12|COLLECT COD|MAIL|er the furiously ironic accoun +38407|1755|56|3|7|11597.25|0.09|0.04|N|O|1997-12-15|1997-12-22|1997-12-26|TAKE BACK RETURN|AIR|hely ironic deposits. packages wak +38407|1858|2|4|20|35197.00|0.09|0.04|N|O|1997-12-03|1997-11-21|1997-12-13|NONE|RAIL|pending gifts. final asymptotes +38432|1738|39|1|37|60670.01|0.09|0.06|N|O|1996-11-09|1997-01-13|1996-12-04|TAKE BACK RETURN|REG AIR|ep blithely express packages. fi +38432|375|4|2|7|8927.59|0.05|0.02|N|O|1996-12-18|1997-01-21|1996-12-30|COLLECT COD|TRUCK|arefully silent fox +38432|1490|69|3|30|41744.70|0.00|0.00|N|O|1996-11-19|1996-12-19|1996-12-04|DELIVER IN PERSON|FOB|lly bold ideas haggle slyl +38433|1541|42|1|19|27408.26|0.05|0.04|R|F|1994-05-23|1994-08-04|1994-06-07|DELIVER IN PERSON|FOB|al realms wake carefully across the ir +38433|1601|84|2|18|27046.80|0.03|0.05|R|F|1994-08-01|1994-07-04|1994-08-02|DELIVER IN PERSON|TRUCK|whithout the slyly even deposits. f +38433|1030|31|3|19|17689.57|0.08|0.06|R|F|1994-07-05|1994-08-03|1994-07-23|NONE|REG AIR|kly regula +38433|1029|35|4|2|1860.04|0.08|0.07|A|F|1994-08-24|1994-08-02|1994-09-02|COLLECT COD|TRUCK|sts cajole care +38433|984|53|5|16|30159.68|0.07|0.04|R|F|1994-07-21|1994-07-28|1994-07-30|TAKE BACK RETURN|FOB|al requests. regular theod +38434|1441|20|1|49|65779.56|0.03|0.08|R|F|1994-08-15|1994-06-19|1994-09-14|TAKE BACK RETURN|SHIP|telets run-- slyly pending ide +38434|1505|6|2|50|70325.00|0.05|0.08|A|F|1994-06-17|1994-06-22|1994-07-07|DELIVER IN PERSON|MAIL|y above the even depos +38434|1656|39|3|13|20249.45|0.03|0.07|R|F|1994-05-24|1994-07-25|1994-06-07|TAKE BACK RETURN|TRUCK| final requests cajole. slyly ironic e +38435|1929|62|1|7|12816.44|0.03|0.03|N|O|1997-11-17|1997-12-31|1997-11-26|DELIVER IN PERSON|FOB|jole blithely after the regular package +38436|900|67|1|23|41420.70|0.02|0.06|R|F|1993-01-10|1992-12-09|1993-01-18|TAKE BACK RETURN|TRUCK|ntegrate after the blith +38436|1205|17|2|37|40929.40|0.02|0.08|R|F|1992-10-18|1992-12-03|1992-11-02|DELIVER IN PERSON|FOB|ly brave dolphins sleep across the caref +38436|387|88|3|24|30897.12|0.10|0.05|A|F|1992-12-01|1992-11-06|1992-12-05|TAKE BACK RETURN|RAIL|es. ironic requests wake slyly even packag +38437|1614|97|1|13|19702.93|0.03|0.04|A|F|1992-08-14|1992-07-08|1992-09-07|TAKE BACK RETURN|RAIL|e final accounts! carefully +38437|1529|30|2|18|25749.36|0.08|0.03|R|F|1992-08-23|1992-07-29|1992-09-01|DELIVER IN PERSON|MAIL|regular dolph +38437|945|48|3|5|9229.70|0.04|0.03|R|F|1992-06-21|1992-06-26|1992-06-22|COLLECT COD|AIR| express, bold foxe +38437|974|75|4|41|76873.77|0.10|0.08|R|F|1992-07-05|1992-07-26|1992-07-26|TAKE BACK RETURN|SHIP|ctions use. pending foxe +38438|990|91|1|3|5672.97|0.00|0.00|N|O|1995-08-29|1995-07-19|1995-09-19|DELIVER IN PERSON|MAIL|ach among the blithely bold sauter +38438|24|100|2|40|36960.80|0.01|0.00|N|O|1995-08-14|1995-08-27|1995-08-31|COLLECT COD|SHIP|de of the fluffil +38438|974|77|3|17|31874.49|0.00|0.04|N|O|1995-07-06|1995-08-16|1995-07-24|NONE|RAIL|unts. ironic theodolites +38438|1285|86|4|35|41519.80|0.00|0.05|N|O|1995-08-19|1995-08-21|1995-08-25|COLLECT COD|FOB|are carefully. car +38438|1609|51|5|43|64955.80|0.07|0.06|N|F|1995-06-14|1995-08-11|1995-07-07|COLLECT COD|REG AIR|s thrash carefully again +38439|603|4|1|28|42100.80|0.08|0.05|A|F|1995-03-01|1995-04-13|1995-03-03|DELIVER IN PERSON|AIR|express in +38439|325|26|2|6|7351.92|0.05|0.03|R|F|1995-02-10|1995-02-22|1995-02-15|DELIVER IN PERSON|FOB| ideas alongside of th +38439|1918|7|3|28|50957.48|0.03|0.06|A|F|1995-02-15|1995-03-27|1995-02-18|NONE|REG AIR| requests are car +38464|366|95|1|23|29126.28|0.02|0.01|R|F|1993-12-01|1994-02-06|1993-12-19|TAKE BACK RETURN|RAIL| pinto beans. inst +38464|278|79|2|14|16495.78|0.07|0.03|R|F|1994-02-14|1994-01-31|1994-03-15|DELIVER IN PERSON|AIR|ave to boo +38464|1863|64|3|15|26472.90|0.00|0.02|A|F|1994-01-09|1993-12-21|1994-01-31|COLLECT COD|MAIL| alongside of the bravely pending accoun +38465|726|23|1|34|55308.48|0.09|0.00|R|F|1992-04-03|1992-05-23|1992-04-10|NONE|RAIL|y regular +38465|1763|90|2|2|3329.52|0.08|0.04|A|F|1992-04-04|1992-06-08|1992-04-16|NONE|AIR|yly about the fluffily unusual accounts. f +38466|468|27|1|25|34211.50|0.03|0.06|N|O|1995-12-05|1995-09-28|1995-12-26|COLLECT COD|RAIL|eposits. busy asymptotes a +38466|508|69|2|6|8451.00|0.00|0.00|N|O|1995-11-16|1995-11-03|1995-12-10|NONE|TRUCK| quiet accounts haggle. bold request +38466|603|35|3|26|39093.60|0.05|0.05|N|O|1995-12-07|1995-10-06|1995-12-25|NONE|RAIL|beans: carefully even pinto beans haggl +38466|1622|5|4|17|25901.54|0.01|0.07|N|O|1995-09-15|1995-09-27|1995-09-29|COLLECT COD|RAIL|kages boost. slyly regular +38466|810|44|5|26|44481.06|0.00|0.03|N|O|1995-11-22|1995-11-11|1995-12-14|NONE|FOB|venly final escapades. +38466|1224|36|6|15|16878.30|0.00|0.08|N|O|1995-10-11|1995-10-31|1995-11-08|NONE|RAIL|ts sleep alongside of +38467|1969|70|1|44|82322.24|0.01|0.07|N|O|1996-07-11|1996-07-03|1996-07-17|TAKE BACK RETURN|AIR|yly even accounts. regular, ironic in +38467|357|86|2|27|33948.45|0.03|0.05|N|O|1996-08-27|1996-07-07|1996-09-14|NONE|FOB|haggle after the blithe +38468|1783|68|1|23|38749.94|0.10|0.00|N|O|1995-12-11|1995-12-26|1996-01-01|COLLECT COD|FOB|ke daringly blithely final excuses. doggedl +38468|1337|38|2|6|7429.98|0.04|0.08|N|O|1995-12-03|1995-12-15|1995-12-15|COLLECT COD|TRUCK|unts? courts +38469|824|58|1|50|86241.00|0.05|0.08|N|O|1996-10-05|1996-11-06|1996-11-03|DELIVER IN PERSON|SHIP| was blithely. ironic pinto beans na +38470|1738|39|1|21|34434.33|0.08|0.01|A|F|1993-10-21|1993-08-20|1993-11-03|DELIVER IN PERSON|AIR|ost. ironic frets +38470|642|43|2|8|12341.12|0.06|0.05|R|F|1993-08-19|1993-09-18|1993-09-14|TAKE BACK RETURN|AIR|l theodolites. +38470|1845|46|3|19|33189.96|0.07|0.05|R|F|1993-08-09|1993-08-29|1993-08-16|COLLECT COD|FOB|deposits may boost agai +38470|253|35|4|26|29984.50|0.00|0.06|A|F|1993-10-04|1993-09-10|1993-10-29|COLLECT COD|TRUCK|lly pending deposits. u +38470|1131|32|5|14|14449.82|0.03|0.00|A|F|1993-11-05|1993-09-17|1993-11-20|TAKE BACK RETURN|FOB|sly according to the furiously s +38470|40|66|6|6|5640.24|0.00|0.03|A|F|1993-08-20|1993-10-16|1993-08-29|COLLECT COD|RAIL|eposits wake across the ir +38470|1709|10|7|44|70870.80|0.00|0.08|A|F|1993-08-21|1993-09-25|1993-08-22|NONE|TRUCK|refully blithely +38471|1905|38|1|8|14455.20|0.06|0.06|N|O|1997-06-26|1997-06-22|1997-07-26|NONE|TRUCK|ending, close theodolites. unusual +38471|1401|19|2|24|31257.60|0.01|0.05|N|O|1997-08-12|1997-07-10|1997-09-10|COLLECT COD|FOB|re doggedly am +38471|537|38|3|50|71876.50|0.04|0.07|N|O|1997-05-26|1997-07-12|1997-06-12|TAKE BACK RETURN|TRUCK|. pending accounts grow a +38471|1664|88|4|25|39141.50|0.10|0.00|N|O|1997-07-23|1997-06-08|1997-08-18|DELIVER IN PERSON|MAIL|kages thrash quickly regular pin +38471|1885|29|5|35|62540.80|0.01|0.06|N|O|1997-08-04|1997-07-12|1997-09-01|TAKE BACK RETURN|TRUCK|fully pending deposits sleep ca +38471|1907|52|6|17|30751.30|0.09|0.02|N|O|1997-08-18|1997-06-07|1997-09-06|NONE|FOB| haggle carefully regular instructions: +38471|223|5|7|6|6739.32|0.08|0.05|N|O|1997-08-04|1997-07-28|1997-08-21|DELIVER IN PERSON|FOB| unusual requests. final, special packag +38496|1548|49|1|33|47834.82|0.08|0.05|A|F|1993-05-17|1993-05-06|1993-06-11|COLLECT COD|RAIL| slyly final pinto beans wake about +38496|758|23|2|48|79620.00|0.03|0.06|R|F|1993-04-10|1993-05-06|1993-04-13|DELIVER IN PERSON|MAIL|s special +38496|1224|62|3|31|34881.82|0.02|0.05|R|F|1993-04-26|1993-05-13|1993-05-22|TAKE BACK RETURN|SHIP|s play above the even, +38496|1357|72|4|18|22650.30|0.01|0.02|R|F|1993-04-22|1993-05-19|1993-04-24|DELIVER IN PERSON|SHIP| blithely thin theodoli +38496|770|67|5|11|18378.47|0.03|0.05|R|F|1993-06-08|1993-04-04|1993-06-10|TAKE BACK RETURN|FOB|platelets nag fur +38496|590|81|6|6|8943.54|0.07|0.00|A|F|1993-03-25|1993-05-19|1993-03-30|NONE|REG AIR|olites! bold dinos will are e +38496|1463|42|7|29|39569.34|0.02|0.04|R|F|1993-03-27|1993-03-23|1993-04-02|DELIVER IN PERSON|AIR| pinto beans sleep blithely. furiously bold +38497|1882|26|1|24|42813.12|0.10|0.04|R|F|1993-12-21|1993-11-10|1994-01-05|NONE|RAIL|ains. carefully unusual +38497|500|88|2|6|8403.00|0.00|0.07|R|F|1994-01-20|1993-12-13|1994-02-19|NONE|AIR|ons. evenly even deposits are furiously bra +38497|1241|79|3|33|37693.92|0.10|0.06|R|F|1993-12-03|1993-12-11|1993-12-22|NONE|FOB|r realms. regularly ir +38498|1591|12|1|20|29851.80|0.02|0.04|A|F|1992-05-10|1992-07-07|1992-05-26|COLLECT COD|MAIL|y after the final, idle i +38498|641|4|2|30|46249.20|0.04|0.04|R|F|1992-05-03|1992-05-31|1992-05-26|COLLECT COD|REG AIR|ets use according to the +38498|1241|53|3|19|21702.56|0.02|0.00|R|F|1992-08-07|1992-06-20|1992-09-02|COLLECT COD|TRUCK|sts. escapades +38498|151|52|4|21|22074.15|0.02|0.05|R|F|1992-07-01|1992-06-12|1992-07-04|NONE|FOB|wake-- quick +38498|1996|97|5|15|28469.85|0.01|0.00|A|F|1992-08-18|1992-07-06|1992-09-15|DELIVER IN PERSON|FOB|refully across the carefully unu +38499|181|60|1|38|41084.84|0.03|0.00|N|O|1997-12-20|1997-12-23|1998-01-16|COLLECT COD|AIR|. packages nag blithely alongside of +38500|875|76|1|46|81690.02|0.08|0.00|A|F|1992-04-19|1992-05-12|1992-04-28|TAKE BACK RETURN|FOB|n requests nag a +38501|744|41|1|13|21381.62|0.04|0.05|R|F|1994-04-30|1994-07-06|1994-05-05|TAKE BACK RETURN|TRUCK|ly final orbits. depos +38501|180|7|2|39|42127.02|0.09|0.07|R|F|1994-07-21|1994-07-03|1994-07-28|DELIVER IN PERSON|MAIL|ully unusual platelets boost slyly. d +38501|1799|84|3|8|13606.32|0.02|0.00|A|F|1994-07-17|1994-06-22|1994-08-08|DELIVER IN PERSON|RAIL|ove the iron +38502|995|64|1|27|51191.73|0.03|0.00|N|O|1997-10-29|1997-10-26|1997-11-28|TAKE BACK RETURN|TRUCK|furiously pendi +38502|102|81|2|13|13027.30|0.05|0.05|N|O|1997-11-16|1997-11-29|1997-12-01|COLLECT COD|MAIL|. blithely s +38502|766|67|3|39|65003.64|0.01|0.07|N|O|1997-10-22|1997-12-15|1997-10-28|NONE|FOB|inal Tires +38502|1317|94|4|19|23147.89|0.03|0.06|N|O|1997-11-01|1997-11-19|1997-11-25|COLLECT COD|FOB|ts. closely qu +38502|1457|75|5|9|12226.05|0.02|0.02|N|O|1997-12-11|1997-11-01|1997-12-13|TAKE BACK RETURN|RAIL|slyly regular a +38503|689|83|1|42|66766.56|0.04|0.00|R|F|1994-06-26|1994-07-09|1994-06-28|NONE|RAIL|ideas are! express requests a +38503|361|90|2|14|17659.04|0.10|0.07|R|F|1994-08-10|1994-06-16|1994-09-08|NONE|TRUCK|instructions nag slyly +38503|200|27|3|1|1100.20|0.04|0.08|A|F|1994-05-13|1994-07-10|1994-05-30|TAKE BACK RETURN|MAIL|s according to th +38503|736|1|4|24|39281.52|0.04|0.03|A|F|1994-06-30|1994-07-05|1994-07-11|TAKE BACK RETURN|TRUCK|nts must detect blithely alongside of the +38503|971|74|5|6|11231.82|0.06|0.06|A|F|1994-05-27|1994-07-13|1994-06-07|DELIVER IN PERSON|MAIL|e ironically about the furiously ev +38528|350|51|1|24|30008.40|0.09|0.03|N|O|1996-03-12|1996-02-27|1996-04-05|NONE|MAIL|y: final theodolites wake f +38528|1765|92|2|26|43335.76|0.06|0.04|N|O|1996-02-15|1996-02-29|1996-03-09|NONE|RAIL|ngside of the +38528|86|87|3|38|37471.04|0.00|0.07|N|O|1996-01-05|1996-03-12|1996-01-19|NONE|MAIL|ts boost caref +38528|823|90|4|21|36200.22|0.01|0.02|N|O|1996-03-06|1996-02-08|1996-03-15|DELIVER IN PERSON|TRUCK|al theodolites. quickly final asymptot +38528|1922|23|5|28|51069.76|0.04|0.08|N|O|1995-12-29|1996-01-26|1996-01-17|COLLECT COD|AIR| instructions. quick requests breac +38528|591|52|6|47|70104.73|0.01|0.05|N|O|1996-04-04|1996-03-07|1996-05-02|NONE|AIR|l requests haggle blit +38528|256|57|7|35|40468.75|0.02|0.05|N|O|1996-04-09|1996-02-16|1996-04-23|TAKE BACK RETURN|SHIP|ndencies. slyly silent ideas haggle flu +38529|1417|18|1|11|14502.51|0.07|0.06|R|F|1994-04-05|1994-05-02|1994-04-26|NONE|SHIP|he pinto beans. ironic, final theodo +38529|713|78|2|19|30660.49|0.10|0.06|R|F|1994-02-04|1994-03-12|1994-02-06|DELIVER IN PERSON|TRUCK|es hang ruthlessly quickly even packages. +38529|1366|5|3|44|55763.84|0.05|0.05|R|F|1994-02-27|1994-04-13|1994-03-03|COLLECT COD|MAIL|gular foxes cajole. carefull +38529|730|63|4|39|63598.47|0.06|0.04|R|F|1994-03-17|1994-04-26|1994-04-07|COLLECT COD|MAIL|gle according to +38529|319|4|5|47|57307.57|0.03|0.02|R|F|1994-05-13|1994-03-19|1994-05-14|NONE|MAIL|instructions. carefully final foxes wa +38529|1878|22|6|45|80094.15|0.09|0.06|A|F|1994-03-17|1994-04-18|1994-04-05|COLLECT COD|FOB|ven deposits. ironic accou +38530|1934|67|1|49|89960.57|0.05|0.05|N|O|1995-06-23|1995-06-19|1995-07-15|TAKE BACK RETURN|SHIP|ts haggle. unus +38530|742|75|2|48|78851.52|0.07|0.07|A|F|1995-04-29|1995-07-16|1995-05-20|TAKE BACK RETURN|MAIL| foxes. ironic theodolites affix acco +38530|1003|9|3|49|44296.00|0.03|0.07|N|O|1995-08-10|1995-07-14|1995-08-19|DELIVER IN PERSON|SHIP| deposits! quickly final +38530|481|40|4|4|5525.92|0.08|0.01|R|F|1995-05-24|1995-06-11|1995-05-25|DELIVER IN PERSON|AIR|ely ironic accounts use. regular dolphins +38530|1561|82|5|33|48264.48|0.02|0.00|N|O|1995-08-10|1995-07-07|1995-09-02|DELIVER IN PERSON|RAIL|. slyly regular theo +38530|237|38|6|47|53449.81|0.00|0.00|R|F|1995-05-17|1995-06-19|1995-06-04|TAKE BACK RETURN|SHIP|, unusual accounts along the final, even +38530|1452|53|7|40|54138.00|0.00|0.05|N|O|1995-08-05|1995-06-13|1995-08-06|DELIVER IN PERSON|SHIP|ely final deposits sleep carefull +38531|413|43|1|48|63043.68|0.07|0.04|N|O|1995-12-15|1996-02-20|1995-12-25|NONE|FOB|s haggle blithely along the accounts. iron +38531|123|50|2|11|11254.32|0.06|0.04|N|O|1996-02-20|1996-01-29|1996-03-02|DELIVER IN PERSON|REG AIR|venly pending foxes ha +38531|1006|77|3|11|9977.00|0.10|0.05|N|O|1996-01-01|1996-01-09|1996-01-17|TAKE BACK RETURN|TRUCK|le ironic requests. carefu +38531|1362|63|4|29|36637.44|0.03|0.02|N|O|1996-03-05|1996-01-25|1996-03-24|NONE|RAIL|. quiet, final dugouts wak +38531|374|3|5|36|45877.32|0.08|0.04|N|O|1995-12-21|1996-02-27|1996-01-20|NONE|REG AIR|ly unusual requests cajole slyly. slyly +38531|1271|72|6|5|5861.35|0.05|0.00|N|O|1995-12-14|1996-01-18|1996-01-01|NONE|REG AIR|ress waters after the +38532|1971|16|1|21|39332.37|0.04|0.06|A|F|1992-07-22|1992-10-15|1992-08-08|TAKE BACK RETURN|SHIP|lways enticing, specia +38532|1839|83|2|37|64410.71|0.07|0.08|A|F|1992-10-01|1992-09-07|1992-10-30|NONE|AIR|closely silent foxes sleep ca +38532|992|95|3|14|26501.86|0.06|0.07|R|F|1992-10-24|1992-09-25|1992-11-18|NONE|MAIL|ly. furiously final pack +38532|1097|3|4|17|16967.53|0.01|0.03|A|F|1992-08-27|1992-10-12|1992-09-21|DELIVER IN PERSON|AIR|lar tithes. packages ca +38532|1654|78|5|41|63781.65|0.05|0.05|R|F|1992-08-05|1992-08-30|1992-08-18|DELIVER IN PERSON|FOB|ly foxes. even, +38533|244|26|1|7|8009.68|0.01|0.05|N|O|1997-02-22|1997-05-07|1997-03-23|NONE|MAIL|kly even packages accordin +38533|1150|87|2|39|40994.85|0.02|0.06|N|O|1997-06-02|1997-04-13|1997-06-28|COLLECT COD|REG AIR|telets-- bravely i +38533|696|97|3|12|19160.28|0.08|0.00|N|O|1997-03-05|1997-04-17|1997-03-17|NONE|TRUCK|theodolites. carefull +38533|1837|24|4|50|86941.50|0.07|0.04|N|O|1997-04-09|1997-04-08|1997-04-17|TAKE BACK RETURN|FOB|y quickly regular asym +38533|1075|11|5|50|48803.50|0.03|0.06|N|O|1997-05-03|1997-03-23|1997-05-28|NONE|FOB|le carefully alongside of +38534|765|30|1|42|69961.92|0.09|0.06|N|O|1997-04-11|1997-02-23|1997-04-17|NONE|TRUCK|uriously re +38534|1705|90|2|6|9640.20|0.02|0.00|N|O|1997-03-15|1997-02-25|1997-03-19|NONE|RAIL|special packages wake furiousl +38534|1395|96|3|4|5185.56|0.08|0.07|N|O|1997-03-22|1997-03-20|1997-03-23|COLLECT COD|FOB|carefully unusua +38534|416|4|4|49|64504.09|0.03|0.00|N|O|1997-01-02|1997-03-02|1997-01-17|COLLECT COD|REG AIR|ag along the quick dep +38534|617|18|5|38|57669.18|0.10|0.08|N|O|1997-04-02|1997-03-05|1997-04-03|DELIVER IN PERSON|REG AIR|ar asymptotes sleep among the care +38534|1937|82|6|14|25745.02|0.04|0.03|N|O|1997-03-17|1997-02-23|1997-04-11|DELIVER IN PERSON|SHIP|ly pending packages cajole blithely +38534|1556|97|7|4|5830.20|0.08|0.06|N|O|1997-04-22|1997-02-16|1997-05-16|TAKE BACK RETURN|MAIL|ost across the express package +38535|1348|25|1|7|8745.38|0.02|0.06|A|F|1992-08-19|1992-09-23|1992-08-30|NONE|RAIL|ic accounts are blithel +38560|737|2|1|8|13101.84|0.05|0.00|N|O|1996-03-23|1996-03-25|1996-04-04|COLLECT COD|REG AIR|depths haggle. regular requests wake furiou +38560|1433|73|2|23|30691.89|0.01|0.00|N|O|1996-04-17|1996-04-03|1996-05-10|NONE|AIR|ns. furiously express exc +38560|1092|28|3|45|44689.05|0.01|0.04|N|O|1996-05-25|1996-03-30|1996-05-27|COLLECT COD|AIR|ronic accounts a +38560|1574|15|4|2|2951.14|0.09|0.00|N|O|1996-05-11|1996-05-01|1996-05-23|DELIVER IN PERSON|MAIL|packages. slyly pending requests sleep. fi +38560|642|5|5|50|77132.00|0.01|0.07|N|O|1996-04-28|1996-05-02|1996-05-07|COLLECT COD|MAIL|. even, ironic id +38560|8|9|6|32|29056.00|0.00|0.04|N|O|1996-05-21|1996-04-19|1996-05-28|COLLECT COD|MAIL| even packages try to w +38561|1804|5|1|34|57997.20|0.05|0.05|N|O|1995-09-03|1995-11-22|1995-10-03|DELIVER IN PERSON|AIR| dependencies cajole along the s +38561|1756|83|2|38|62994.50|0.06|0.00|N|O|1995-10-18|1995-11-05|1995-10-29|TAKE BACK RETURN|RAIL|at the carefully bold theodolites. so +38562|466|67|1|38|51925.48|0.10|0.05|A|F|1994-02-20|1994-02-09|1994-03-09|DELIVER IN PERSON|FOB|onic requests boost quickly along +38562|329|30|2|22|27045.04|0.09|0.06|R|F|1994-01-26|1994-03-05|1994-02-16|DELIVER IN PERSON|REG AIR|de the express pinto bean +38563|1137|38|1|25|25953.25|0.04|0.00|R|F|1992-10-23|1992-08-10|1992-10-29|COLLECT COD|TRUCK|. slyly bold reque +38563|1471|50|2|48|65878.56|0.01|0.03|R|F|1992-11-03|1992-08-14|1992-11-26|NONE|REG AIR|pecial theodolites above the theod +38563|172|51|3|49|52536.33|0.05|0.06|R|F|1992-08-29|1992-08-12|1992-09-27|TAKE BACK RETURN|TRUCK|ans. slyly silent packages +38564|955|90|1|13|24127.35|0.04|0.03|A|F|1994-12-19|1995-01-17|1995-01-16|DELIVER IN PERSON|MAIL| pending de +38564|265|66|2|15|17478.90|0.02|0.03|R|F|1995-02-27|1994-12-04|1995-03-29|NONE|REG AIR|eas among the express a +38564|1350|51|3|20|25027.00|0.08|0.00|R|F|1994-12-12|1995-01-11|1994-12-17|COLLECT COD|RAIL| the blithely special deposit +38564|1201|76|4|39|42985.80|0.00|0.02|R|F|1995-01-24|1995-01-22|1995-02-14|NONE|TRUCK|y even courts sleep blithely enticing r +38564|1781|8|5|17|28607.26|0.04|0.00|A|F|1995-03-02|1994-12-16|1995-03-16|TAKE BACK RETURN|REG AIR|iously special instructions are carefully +38564|1056|27|6|35|33496.75|0.04|0.05|A|F|1994-12-24|1995-01-21|1994-12-28|NONE|REG AIR|d packages wake! unusual, special +38564|464|65|7|44|60036.24|0.07|0.01|R|F|1994-11-15|1995-01-30|1994-11-20|COLLECT COD|TRUCK|uctions can promise up the unusual +38565|1822|66|1|44|75848.08|0.02|0.02|A|F|1994-04-04|1994-05-11|1994-05-01|DELIVER IN PERSON|RAIL| excuses. +38565|1431|71|2|27|35975.61|0.01|0.05|R|F|1994-07-08|1994-06-03|1994-07-10|NONE|TRUCK|thely regular a +38565|1552|93|3|16|23256.80|0.01|0.01|A|F|1994-07-16|1994-06-07|1994-08-07|NONE|FOB| express accounts. fluffily eve +38565|76|27|4|25|24401.75|0.03|0.02|R|F|1994-05-26|1994-06-18|1994-06-12|NONE|AIR|t the furiously ironic theodolite +38565|441|42|5|33|44267.52|0.00|0.07|R|F|1994-05-22|1994-05-29|1994-06-05|TAKE BACK RETURN|MAIL|nts nag above the depths. exp +38565|157|84|6|24|25371.60|0.00|0.05|R|F|1994-06-13|1994-06-23|1994-07-06|TAKE BACK RETURN|FOB|s nag fluff +38565|1758|59|7|23|38174.25|0.04|0.07|R|F|1994-07-22|1994-05-02|1994-08-12|TAKE BACK RETURN|TRUCK|y final foxes +38566|1917|62|1|1|1818.91|0.05|0.01|N|O|1996-02-18|1996-02-28|1996-03-06|COLLECT COD|FOB|. packages use +38566|23|49|2|6|5538.12|0.09|0.07|N|O|1996-04-30|1996-03-10|1996-05-05|NONE|FOB|. fluffily pendi +38566|1792|19|3|36|60976.44|0.06|0.01|N|O|1996-04-26|1996-02-29|1996-05-05|DELIVER IN PERSON|RAIL|s. regular pinto +38567|684|85|1|39|61802.52|0.06|0.04|N|O|1997-09-12|1997-07-26|1997-09-19|COLLECT COD|TRUCK|y pending ideas nag +38567|244|72|2|16|18307.84|0.10|0.02|N|O|1997-06-25|1997-07-23|1997-06-30|TAKE BACK RETURN|REG AIR|y special accounts sleep furious +38567|1270|71|3|2|2342.54|0.03|0.01|N|O|1997-07-05|1997-06-29|1997-07-15|TAKE BACK RETURN|AIR|ar deposits nag am +38567|1284|59|4|12|14223.36|0.01|0.08|N|O|1997-07-03|1997-06-19|1997-08-01|COLLECT COD|TRUCK|ffix around the ironic +38567|606|69|5|16|24105.60|0.02|0.04|N|O|1997-06-01|1997-06-16|1997-06-22|DELIVER IN PERSON|REG AIR|s are carefully with the b +38567|1967|100|6|14|26165.44|0.05|0.00|N|O|1997-06-15|1997-07-17|1997-06-16|COLLECT COD|AIR|t the carefully regular pinto beans. +38592|1861|5|1|42|74040.12|0.00|0.06|N|O|1997-05-09|1997-04-29|1997-05-12|COLLECT COD|SHIP|ckly slyly bold pinto beans. +38593|492|80|1|15|20887.35|0.07|0.08|N|O|1997-01-28|1997-01-27|1997-02-24|COLLECT COD|SHIP|posits nag slyly ir +38593|1619|2|2|5|7603.05|0.04|0.00|N|O|1997-03-02|1997-02-13|1997-03-03|NONE|RAIL|d deposits hagg +38593|246|1|3|27|30948.48|0.01|0.08|N|O|1997-03-26|1997-02-18|1997-04-18|DELIVER IN PERSON|REG AIR|uffily special requests. furious +38594|1920|65|1|26|47369.92|0.05|0.07|A|F|1995-01-08|1995-02-17|1995-02-04|DELIVER IN PERSON|AIR|ts boost unusual pack +38594|1823|10|2|4|6899.28|0.10|0.02|A|F|1995-01-08|1995-02-07|1995-02-03|TAKE BACK RETURN|RAIL|. unusual acco +38594|63|14|3|40|38522.40|0.08|0.07|R|F|1995-02-23|1995-02-03|1995-02-24|COLLECT COD|RAIL|lithely unusual requests nag excuses. even +38594|483|42|4|50|69174.00|0.02|0.01|A|F|1995-02-05|1995-02-28|1995-03-06|COLLECT COD|REG AIR|telets. fluffily regular deposi +38595|78|29|1|26|25429.82|0.10|0.04|N|O|1996-12-24|1997-03-05|1996-12-30|COLLECT COD|TRUCK|ross the ca +38596|1883|84|1|43|76749.84|0.05|0.02|R|F|1993-04-09|1993-06-25|1993-04-25|TAKE BACK RETURN|AIR|aggle carefully slyly regula +38597|1802|89|1|11|18741.80|0.09|0.06|R|F|1992-04-11|1992-03-12|1992-04-28|DELIVER IN PERSON|AIR|hely regular pinto beans s +38597|672|73|2|8|12581.36|0.04|0.00|A|F|1992-03-11|1992-05-03|1992-04-08|COLLECT COD|REG AIR|y regular dependencies haggle s +38597|713|46|3|20|32274.20|0.06|0.08|R|F|1992-02-11|1992-03-07|1992-03-07|NONE|RAIL|beans are blithely deposi +38597|1641|65|4|23|35480.72|0.03|0.01|R|F|1992-02-26|1992-03-31|1992-03-01|DELIVER IN PERSON|REG AIR|es detect carefully furiously even instru +38597|558|19|5|21|30629.55|0.02|0.05|R|F|1992-04-07|1992-05-05|1992-05-07|NONE|MAIL|ffily ironic theodolites are along the qui +38597|1181|54|6|38|41122.84|0.07|0.03|R|F|1992-04-10|1992-05-02|1992-05-01|TAKE BACK RETURN|SHIP|s are slyly. ironic +38597|1937|26|7|7|12872.51|0.08|0.03|A|F|1992-05-29|1992-03-21|1992-05-31|DELIVER IN PERSON|FOB|es. furiously even foxes boost qu +38598|1425|43|1|19|25201.98|0.09|0.04|A|F|1994-08-29|1994-09-16|1994-09-11|DELIVER IN PERSON|AIR| accounts use. furiously pending +38598|1722|23|2|35|56830.20|0.08|0.04|R|F|1994-11-05|1994-10-28|1994-11-23|NONE|TRUCK|egular requests +38598|1531|12|3|6|8595.18|0.06|0.04|A|F|1994-08-28|1994-10-21|1994-09-12|DELIVER IN PERSON|RAIL|integrate furiously across the pack +38598|1659|42|4|41|63986.65|0.01|0.06|A|F|1994-10-20|1994-10-10|1994-10-31|NONE|RAIL|kages are carefully about +38598|583|44|5|48|71211.84|0.09|0.00|R|F|1994-09-18|1994-10-04|1994-09-27|DELIVER IN PERSON|MAIL|he blithely even packages detect slyly c +38599|1694|36|1|10|15956.90|0.10|0.04|R|F|1995-01-12|1995-01-06|1995-01-17|DELIVER IN PERSON|MAIL|equests. slyly expr +38599|295|23|2|16|19124.64|0.03|0.08|R|F|1995-02-21|1994-12-11|1995-03-12|NONE|FOB|bold foxes according to the +38599|502|33|3|50|70125.00|0.01|0.00|A|F|1995-02-09|1994-12-18|1995-02-24|DELIVER IN PERSON|MAIL| even, ironic tithes sleep blithely afte +38624|1839|40|1|49|85300.67|0.02|0.00|N|O|1998-02-17|1998-04-25|1998-02-26|DELIVER IN PERSON|RAIL|s are blithely according to th +38624|1791|76|2|37|62633.23|0.02|0.02|N|O|1998-05-18|1998-05-02|1998-06-10|NONE|REG AIR|ly pending ideas +38624|1923|12|3|33|60222.36|0.08|0.00|N|O|1998-03-24|1998-04-05|1998-04-02|TAKE BACK RETURN|TRUCK|luffily: pending asymptote +38624|1648|49|4|20|30992.80|0.01|0.03|N|O|1998-05-30|1998-05-17|1998-06-09|DELIVER IN PERSON|SHIP|, regular theodolites affix carefully regu +38625|1745|72|1|44|72456.56|0.02|0.02|A|F|1993-11-27|1993-12-20|1993-12-23|NONE|AIR|ending deposits. slyly regular +38625|506|97|2|1|1406.50|0.07|0.02|R|F|1994-01-13|1994-01-29|1994-01-15|DELIVER IN PERSON|MAIL|ously ironic theodolites. theodolites wak +38625|770|71|3|48|80196.96|0.05|0.00|A|F|1994-03-08|1993-12-22|1994-03-21|DELIVER IN PERSON|SHIP|l are quickly slyly final requests. furi +38625|781|82|4|34|57180.52|0.01|0.04|A|F|1994-03-09|1993-12-27|1994-04-04|NONE|REG AIR|ajole against the even, unusual sentiments. +38625|215|16|5|4|4460.84|0.04|0.08|R|F|1994-01-03|1993-12-22|1994-01-07|COLLECT COD|RAIL|ffily silent deposits. quietly speci +38626|878|12|1|24|42692.88|0.05|0.08|N|O|1997-05-13|1997-06-13|1997-05-28|NONE|REG AIR|uses wake. slyly even a +38626|1573|74|2|25|36864.25|0.04|0.01|N|O|1997-06-30|1997-07-11|1997-07-07|COLLECT COD|FOB|ke silent requests. fu +38626|1212|13|3|34|37849.14|0.03|0.03|N|O|1997-05-25|1997-06-16|1997-06-13|COLLECT COD|RAIL|onic accounts. final req +38626|1636|78|4|18|27677.34|0.07|0.02|N|O|1997-05-13|1997-06-27|1997-05-18|NONE|MAIL|ect furiously slyly ironic d +38626|122|49|5|22|22486.64|0.10|0.07|N|O|1997-05-15|1997-05-31|1997-05-20|TAKE BACK RETURN|MAIL|uriously express +38627|51|2|1|43|40895.15|0.05|0.01|R|F|1994-11-22|1994-12-01|1994-12-17|TAKE BACK RETURN|REG AIR|foxes play furiously; instructions +38628|894|94|1|5|8974.45|0.07|0.02|N|O|1995-11-03|1996-01-24|1995-11-18|DELIVER IN PERSON|TRUCK|ggle regular foxes. fluffily pending grouch +38629|12|13|1|48|43776.48|0.06|0.02|N|O|1997-08-08|1997-07-03|1997-08-15|COLLECT COD|AIR|al pains doubt blithely according t +38629|1333|48|2|11|13577.63|0.02|0.08|N|O|1997-07-08|1997-07-16|1997-07-31|NONE|RAIL|s after the excuses wake sly +38629|1417|57|3|36|47462.76|0.03|0.03|N|O|1997-05-25|1997-07-15|1997-06-23|DELIVER IN PERSON|MAIL|. pending acco +38629|790|91|4|37|62559.23|0.05|0.02|N|O|1997-06-18|1997-07-19|1997-06-19|COLLECT COD|RAIL|ess packages. careful notornis affix across +38629|1847|48|5|2|3497.68|0.07|0.06|N|O|1997-06-07|1997-06-05|1997-06-23|TAKE BACK RETURN|REG AIR|furiously even instructions u +38629|467|55|6|16|21879.36|0.06|0.00|N|O|1997-04-26|1997-05-27|1997-05-21|TAKE BACK RETURN|RAIL|olites hag +38630|501|32|1|20|28030.00|0.09|0.05|A|F|1993-06-09|1993-06-17|1993-06-24|DELIVER IN PERSON|MAIL|deposits. packages wake. furi +38630|783|80|2|35|58932.30|0.06|0.02|R|F|1993-05-29|1993-06-17|1993-06-07|TAKE BACK RETURN|RAIL|er the fluffily ironic +38630|643|75|3|8|12349.12|0.10|0.08|R|F|1993-06-29|1993-06-15|1993-07-21|DELIVER IN PERSON|REG AIR|around the carefully regular theodolites i +38630|1728|55|4|46|74967.12|0.06|0.05|R|F|1993-07-05|1993-07-11|1993-07-18|NONE|SHIP|al, special excuses wake qui +38630|61|87|5|41|39403.46|0.02|0.02|A|F|1993-08-05|1993-07-16|1993-08-15|DELIVER IN PERSON|REG AIR| the enticingl +38630|766|31|6|46|76670.96|0.07|0.03|R|F|1993-06-22|1993-06-10|1993-06-25|NONE|REG AIR|ructions. fina +38630|784|49|7|14|23586.92|0.00|0.02|A|F|1993-08-15|1993-07-04|1993-08-25|NONE|RAIL|usual accounts haggle. +38631|608|2|1|15|22629.00|0.03|0.07|N|O|1997-11-15|1998-02-06|1997-11-17|TAKE BACK RETURN|MAIL| according to +38631|1846|76|2|1|1747.84|0.10|0.06|N|O|1997-12-03|1998-01-14|1997-12-09|DELIVER IN PERSON|TRUCK|e. slyly unusua +38631|363|48|3|46|58114.56|0.08|0.00|N|O|1997-11-14|1998-01-04|1997-11-16|TAKE BACK RETURN|TRUCK|d foxes wake qu +38631|1648|90|4|37|57336.68|0.05|0.08|N|O|1997-12-11|1998-01-11|1998-01-05|NONE|MAIL|, pending accounts. +38631|1569|50|5|34|49999.04|0.00|0.04|N|O|1998-01-09|1998-01-10|1998-01-17|TAKE BACK RETURN|MAIL|on the pending, regu +38631|1092|98|6|9|8937.81|0.10|0.05|N|O|1998-01-30|1998-01-14|1998-02-04|TAKE BACK RETURN|RAIL|uickly slyly final pinto beans +38631|132|59|7|40|41285.20|0.03|0.00|N|O|1997-12-04|1998-01-04|1997-12-17|TAKE BACK RETURN|AIR|rding to the even requests wake blithe +38656|237|19|1|9|10235.07|0.02|0.02|A|F|1992-08-24|1992-10-20|1992-09-03|TAKE BACK RETURN|AIR| across the blithely f +38656|1196|69|2|7|7680.33|0.00|0.08|A|F|1992-11-15|1992-10-12|1992-12-15|DELIVER IN PERSON|FOB|riously along the furiously expres +38656|1511|32|3|42|59325.42|0.09|0.00|R|F|1992-11-09|1992-10-22|1992-11-11|COLLECT COD|TRUCK|excuses. quickly regular courts across +38656|1355|94|4|29|36434.15|0.04|0.08|A|F|1992-10-23|1992-10-11|1992-10-24|DELIVER IN PERSON|TRUCK| mold carefully bey +38656|1154|27|5|12|12661.80|0.08|0.02|A|F|1992-10-25|1992-10-20|1992-11-15|TAKE BACK RETURN|FOB|ld braids are silent, final p +38657|639|71|1|28|43109.64|0.09|0.04|A|F|1993-08-06|1993-07-22|1993-08-27|DELIVER IN PERSON|FOB|l accounts cajole quickly fluffily r +38657|849|50|2|26|45495.84|0.09|0.07|A|F|1993-07-26|1993-08-10|1993-08-18|NONE|TRUCK|ions according to the ironic, +38657|1034|5|3|21|19635.63|0.02|0.04|R|F|1993-07-09|1993-07-05|1993-07-17|DELIVER IN PERSON|TRUCK|ly final packages hag +38658|222|50|1|26|29177.72|0.00|0.08|N|O|1997-07-19|1997-09-23|1997-08-10|COLLECT COD|TRUCK|ackages are furiously-- furiou +38658|1894|24|2|19|34121.91|0.10|0.00|N|O|1997-07-19|1997-08-07|1997-08-15|DELIVER IN PERSON|SHIP| furiously. packages boost slyly. +38658|589|80|3|40|59583.20|0.10|0.02|N|O|1997-09-15|1997-09-21|1997-09-26|DELIVER IN PERSON|MAIL|re slyly after +38659|1898|28|1|27|48597.03|0.09|0.07|R|F|1993-06-14|1993-05-23|1993-06-30|DELIVER IN PERSON|AIR|carefully across the frays. foxes hagg +38659|59|60|2|10|9590.50|0.10|0.07|R|F|1993-07-07|1993-06-16|1993-07-26|NONE|FOB|dly special sauternes-- ironic ideas +38659|504|95|3|5|7022.50|0.03|0.01|A|F|1993-05-16|1993-05-21|1993-06-01|NONE|TRUCK|ully final instructions. careful, expr +38659|715|80|4|22|35545.62|0.05|0.04|A|F|1993-04-17|1993-05-07|1993-04-24|TAKE BACK RETURN|RAIL|uickly furiously ironic instructions. ca +38659|1636|37|5|39|59967.57|0.03|0.08|R|F|1993-06-19|1993-05-13|1993-06-29|DELIVER IN PERSON|FOB| the deposits. +38659|843|77|6|9|15694.56|0.06|0.04|A|F|1993-07-28|1993-06-24|1993-08-04|DELIVER IN PERSON|REG AIR| dependencies sleep slyly; slyly bol +38660|1770|71|1|22|36778.94|0.10|0.00|A|F|1993-04-02|1993-01-29|1993-04-21|NONE|AIR|s doze after the +38660|465|24|2|12|16385.52|0.00|0.00|R|F|1993-02-02|1993-02-15|1993-02-11|TAKE BACK RETURN|SHIP|dependencie +38661|429|17|1|40|53176.80|0.10|0.02|A|F|1992-04-15|1992-04-30|1992-05-04|COLLECT COD|FOB|final ideas +38661|686|80|2|23|36493.64|0.05|0.08|A|F|1992-05-02|1992-03-27|1992-05-07|COLLECT COD|TRUCK|ronic courts wake blithely furiousl +38661|1477|95|3|41|56517.27|0.05|0.04|A|F|1992-06-13|1992-03-27|1992-06-23|COLLECT COD|MAIL|ts kindle. regular, unusual p +38661|1876|6|4|30|53336.10|0.08|0.06|A|F|1992-04-30|1992-05-04|1992-05-09|DELIVER IN PERSON|TRUCK|above the carefully regular ideas. fu +38661|1144|45|5|21|21947.94|0.05|0.00|R|F|1992-04-03|1992-05-03|1992-04-27|TAKE BACK RETURN|FOB|ound the exp +38661|1093|64|6|7|6958.63|0.01|0.00|R|F|1992-05-08|1992-03-15|1992-05-21|COLLECT COD|RAIL|xes with the furiously regular dep +38661|468|98|7|29|39685.34|0.03|0.01|A|F|1992-03-31|1992-04-01|1992-04-20|TAKE BACK RETURN|SHIP|y according to the carefully final pa +38662|1611|35|1|34|51428.74|0.07|0.06|N|O|1996-02-29|1996-02-07|1996-03-28|COLLECT COD|TRUCK|riously unusual accounts. blithely even +38662|1808|95|2|26|44454.80|0.04|0.01|N|O|1995-12-21|1996-02-16|1996-01-01|TAKE BACK RETURN|SHIP|iously iro +38662|822|56|3|32|55130.24|0.02|0.02|N|O|1996-01-11|1996-01-01|1996-02-06|DELIVER IN PERSON|AIR|about the slyly unusua +38663|1298|99|1|41|49170.89|0.03|0.01|N|O|1997-06-02|1997-07-11|1997-06-17|TAKE BACK RETURN|SHIP|ns wake quickly. furiously ir +38663|113|40|2|21|21275.31|0.08|0.02|N|O|1997-05-14|1997-07-07|1997-06-09|NONE|REG AIR|oost furiously regular packages; blit +38688|693|87|1|10|15936.90|0.10|0.07|N|O|1998-09-03|1998-07-26|1998-09-27|TAKE BACK RETURN|FOB|ully bold accounts haggle quickly +38688|920|21|2|29|52806.68|0.00|0.06|N|O|1998-07-31|1998-08-02|1998-08-21|TAKE BACK RETURN|RAIL|uriously. special platel +38688|1243|18|3|31|35471.44|0.09|0.06|N|O|1998-06-26|1998-07-23|1998-07-16|TAKE BACK RETURN|FOB|tes. express, final pinto bean +38688|267|22|4|31|36185.06|0.09|0.03|N|O|1998-08-28|1998-08-31|1998-09-19|TAKE BACK RETURN|REG AIR|yly. regular p +38688|1721|6|5|23|37322.56|0.04|0.05|N|O|1998-09-07|1998-08-21|1998-09-17|TAKE BACK RETURN|REG AIR|re among the +38689|1593|74|1|21|31386.39|0.03|0.03|A|F|1994-08-02|1994-07-20|1994-08-11|NONE|FOB|y across the excu +38689|1537|38|2|40|57541.20|0.09|0.07|A|F|1994-05-19|1994-06-30|1994-05-31|COLLECT COD|AIR|carefully unusual ideas according +38689|194|21|3|26|28448.94|0.07|0.06|R|F|1994-05-30|1994-06-03|1994-06-06|DELIVER IN PERSON|SHIP| sleep across the pending dolphins. even fo +38690|531|32|1|18|25767.54|0.06|0.01|R|F|1992-01-27|1992-04-09|1992-02-06|NONE|SHIP|egrate. spec +38690|1756|83|2|1|1657.75|0.08|0.03|A|F|1992-03-30|1992-03-19|1992-04-05|DELIVER IN PERSON|TRUCK| could have to boost. quickly even accounts +38690|1413|53|3|10|13144.10|0.03|0.03|A|F|1992-02-10|1992-04-11|1992-02-12|TAKE BACK RETURN|RAIL|ck deposits wake slyly slyl +38690|568|59|4|27|39651.12|0.03|0.07|A|F|1992-03-02|1992-04-09|1992-03-23|NONE|AIR|requests cajole quickly among the thinly e +38691|1432|11|1|35|46670.05|0.07|0.05|N|O|1995-06-26|1995-05-08|1995-07-10|TAKE BACK RETURN|FOB| final pinto be +38692|177|56|1|50|53858.50|0.07|0.04|N|O|1996-03-12|1996-03-24|1996-03-25|NONE|MAIL|cross the car +38693|460|48|1|2|2720.92|0.08|0.06|N|O|1995-10-06|1995-08-27|1995-10-20|TAKE BACK RETURN|AIR|latelets. slyly +38694|1325|26|1|11|13489.52|0.02|0.06|N|O|1998-08-26|1998-08-01|1998-09-23|COLLECT COD|FOB|quick requests boost blith +38694|479|9|2|1|1379.47|0.00|0.03|N|O|1998-09-24|1998-09-17|1998-09-29|COLLECT COD|REG AIR|courts. slyly final +38695|127|28|1|2|2054.24|0.08|0.07|N|O|1997-11-02|1997-10-06|1997-11-26|NONE|REG AIR|ily unusual dependencies. final reques +38720|1758|59|1|21|34854.75|0.08|0.05|N|O|1998-05-11|1998-05-28|1998-05-25|DELIVER IN PERSON|AIR|ses under the carefully express excuses b +38720|323|52|2|31|37922.92|0.04|0.00|N|O|1998-04-05|1998-06-04|1998-04-14|TAKE BACK RETURN|RAIL|auternes could haggle evenly s +38720|48|99|3|13|12324.52|0.09|0.03|N|O|1998-04-21|1998-05-23|1998-05-19|DELIVER IN PERSON|RAIL|mes after the carefully special +38720|1749|34|4|40|66029.60|0.01|0.05|N|O|1998-04-07|1998-06-28|1998-04-23|COLLECT COD|SHIP| packages poach +38720|1818|19|5|1|1719.81|0.10|0.01|N|O|1998-07-05|1998-05-24|1998-07-18|TAKE BACK RETURN|REG AIR| mold carefully +38721|182|83|1|16|17314.88|0.04|0.07|A|F|1994-04-21|1994-06-17|1994-04-22|NONE|MAIL|packages. packages are fluffily. express at +38721|96|72|2|9|8964.81|0.05|0.04|R|F|1994-04-29|1994-06-15|1994-04-30|COLLECT COD|AIR| bold deposits wake. +38721|26|27|3|6|5556.12|0.00|0.00|A|F|1994-05-15|1994-05-25|1994-06-11|NONE|TRUCK|ar dependencies do wake up the quickly unus +38721|1187|88|4|20|21763.60|0.09|0.06|A|F|1994-04-19|1994-06-19|1994-05-02|TAKE BACK RETURN|SHIP|wake slyly final accounts. blithe package +38721|1595|76|5|33|49387.47|0.06|0.02|R|F|1994-04-01|1994-04-24|1994-04-12|TAKE BACK RETURN|RAIL|s nag furiously final depo +38721|1724|9|6|38|61777.36|0.02|0.03|R|F|1994-07-24|1994-05-04|1994-08-09|DELIVER IN PERSON|FOB|its cajole blithely furiou +38721|930|33|7|2|3661.86|0.06|0.05|A|F|1994-05-24|1994-05-04|1994-06-09|TAKE BACK RETURN|RAIL|ously ironic asymptotes s +38722|1610|34|1|21|31743.81|0.08|0.02|N|O|1997-07-01|1997-05-09|1997-07-28|TAKE BACK RETURN|TRUCK|structions detect. dogged, even +38722|136|63|2|39|40409.07|0.01|0.03|N|O|1997-04-21|1997-05-12|1997-04-23|DELIVER IN PERSON|RAIL|l platelets. quickly ironic instructions +38722|1368|7|3|28|35542.08|0.08|0.00|N|O|1997-07-05|1997-06-10|1997-07-27|NONE|SHIP|st quickly. unusual +38722|1978|67|4|9|16919.73|0.08|0.03|N|O|1997-03-31|1997-05-15|1997-04-19|NONE|RAIL| final acco +38722|1883|27|5|46|82104.48|0.01|0.07|N|O|1997-03-31|1997-06-09|1997-04-08|DELIVER IN PERSON|AIR| special requ +38722|1035|6|6|37|34633.11|0.04|0.02|N|O|1997-05-09|1997-06-14|1997-05-26|COLLECT COD|REG AIR|xcuses. daring +38723|1382|83|1|22|28234.36|0.02|0.07|A|F|1992-11-05|1992-11-21|1992-11-24|TAKE BACK RETURN|AIR|ts doze carefu +38723|1680|22|2|40|63267.20|0.06|0.02|R|F|1992-12-03|1992-11-20|1992-12-21|COLLECT COD|AIR|evenly blithe requests use furiousl +38723|1211|86|3|10|11122.10|0.08|0.02|R|F|1992-12-31|1992-11-09|1993-01-12|NONE|REG AIR|s; final, reg +38723|1604|46|4|47|70763.20|0.07|0.07|R|F|1992-12-30|1992-12-18|1993-01-05|TAKE BACK RETURN|SHIP|ickly thin req +38723|634|35|5|27|41435.01|0.06|0.03|R|F|1992-11-30|1992-12-20|1992-12-11|TAKE BACK RETURN|TRUCK|jole above +38724|1220|95|1|10|11212.20|0.02|0.01|N|O|1997-10-13|1997-09-28|1997-11-11|DELIVER IN PERSON|REG AIR|kly. furiously +38725|1281|19|1|21|24827.88|0.01|0.01|A|F|1994-11-09|1994-08-27|1994-11-11|NONE|MAIL|nic foxes across the furiously +38725|519|20|2|24|34068.24|0.10|0.08|R|F|1994-11-05|1994-09-08|1994-12-04|NONE|REG AIR|excuses. re +38725|1667|68|3|39|61177.74|0.10|0.03|R|F|1994-11-09|1994-09-03|1994-12-09|DELIVER IN PERSON|REG AIR|lithely. slyly brave instructions wake +38725|1853|40|4|29|50890.65|0.05|0.05|R|F|1994-09-28|1994-10-02|1994-10-17|NONE|AIR|. pending, bold excuses wake regu +38726|93|19|1|18|17875.62|0.07|0.05|R|F|1994-08-05|1994-08-04|1994-08-12|TAKE BACK RETURN|MAIL|egular foxes cajole about the +38726|699|31|2|21|33593.49|0.00|0.03|R|F|1994-08-20|1994-07-18|1994-08-24|TAKE BACK RETURN|SHIP|nic instructions +38726|470|71|3|9|12334.23|0.07|0.07|R|F|1994-05-25|1994-08-10|1994-06-14|DELIVER IN PERSON|REG AIR|t slyly quickly bold p +38726|897|64|4|18|32362.02|0.07|0.03|R|F|1994-07-05|1994-07-06|1994-07-14|DELIVER IN PERSON|AIR|ggedly unusual accounts cajo +38726|1492|93|5|41|57133.09|0.07|0.01|A|F|1994-05-23|1994-06-21|1994-06-03|COLLECT COD|SHIP|jole against the furiously final gifts. f +38726|661|55|6|29|45288.14|0.07|0.00|A|F|1994-07-18|1994-07-10|1994-08-13|TAKE BACK RETURN|RAIL|lar requests cajole carefully. furi +38727|967|70|1|16|29887.36|0.04|0.05|R|F|1993-07-23|1993-07-25|1993-07-24|DELIVER IN PERSON|SHIP|packages. closely even requ +38727|1768|69|2|23|38404.48|0.07|0.08|R|F|1993-09-16|1993-08-17|1993-09-17|COLLECT COD|MAIL|blithely. sly, pending deposits impress. +38727|899|66|3|22|39597.58|0.05|0.05|A|F|1993-06-28|1993-07-16|1993-07-04|COLLECT COD|TRUCK|ounts hinder furiously. even, expres +38727|1817|4|4|40|68752.40|0.08|0.05|R|F|1993-08-04|1993-08-19|1993-09-03|COLLECT COD|RAIL|anently alon +38752|7|8|1|21|19047.00|0.09|0.02|A|F|1994-12-01|1994-12-08|1994-12-09|COLLECT COD|MAIL| among the fur +38752|1783|68|2|17|28641.26|0.08|0.00|R|F|1994-12-07|1994-12-28|1994-12-17|DELIVER IN PERSON|MAIL|l pinto bean +38752|476|77|3|35|48176.45|0.06|0.08|A|F|1994-12-26|1994-11-10|1995-01-23|COLLECT COD|TRUCK|y after the blithel +38752|876|77|4|27|47975.49|0.08|0.05|R|F|1994-12-27|1994-12-16|1995-01-11|NONE|SHIP| accounts was carefully; quickly pending +38752|1981|26|5|35|65904.30|0.02|0.06|A|F|1994-11-09|1994-12-20|1994-11-29|DELIVER IN PERSON|REG AIR|egularly express reques +38753|90|16|1|6|5940.54|0.06|0.08|R|F|1993-12-13|1993-12-03|1994-01-10|TAKE BACK RETURN|MAIL|e past the evenly unusual pl +38753|1343|20|2|12|14932.08|0.01|0.07|A|F|1993-09-29|1993-11-18|1993-10-29|COLLECT COD|REG AIR|e ruthless requests haggle furio +38753|116|95|3|19|19306.09|0.02|0.06|A|F|1993-11-21|1993-10-21|1993-12-18|COLLECT COD|RAIL|al ideas along the final warthogs bo +38753|1386|1|4|17|21885.46|0.02|0.03|A|F|1993-09-25|1993-10-16|1993-10-06|DELIVER IN PERSON|REG AIR|d packages nag. furiously p +38753|1605|29|5|8|12052.80|0.10|0.06|R|F|1993-10-07|1993-10-30|1993-10-18|TAKE BACK RETURN|AIR|ly. bold deposits nag. hockey players hag +38753|1598|19|6|27|40488.93|0.04|0.02|A|F|1993-11-12|1993-11-05|1993-11-28|TAKE BACK RETURN|SHIP|s. unusual, ironic packages wake fur +38754|1832|19|1|13|22539.79|0.09|0.01|N|O|1997-10-22|1997-10-18|1997-11-08|NONE|RAIL| foxes. ironic packages cajole accoun +38754|1479|80|2|45|62121.15|0.10|0.07|N|O|1997-12-20|1997-11-14|1998-01-07|COLLECT COD|AIR|oost along the furiously even th +38754|1269|7|3|42|49150.92|0.06|0.08|N|O|1997-12-12|1997-11-06|1997-12-28|DELIVER IN PERSON|MAIL|sual foxes affix ar +38755|1054|55|1|11|10505.55|0.09|0.01|N|O|1996-04-18|1996-05-30|1996-05-01|DELIVER IN PERSON|MAIL|kly. pending accounts use fluffily +38755|997|98|2|26|49347.74|0.05|0.03|N|O|1996-04-04|1996-06-04|1996-04-09|NONE|FOB|s engage carefully furiously ironic asympt +38755|652|84|3|28|43474.20|0.08|0.02|N|O|1996-05-19|1996-05-20|1996-06-01|NONE|TRUCK|uternes. idly special +38755|1229|30|4|39|44078.58|0.03|0.02|N|O|1996-03-23|1996-04-15|1996-04-11|COLLECT COD|TRUCK|pinto beans sl +38756|783|16|1|9|15154.02|0.04|0.00|R|F|1994-05-23|1994-06-11|1994-06-07|NONE|RAIL|ounts wake regular packages. busy id +38756|1708|9|2|31|49900.70|0.07|0.02|R|F|1994-05-21|1994-07-14|1994-06-06|TAKE BACK RETURN|TRUCK| courts. fluffily ironic ideas nag ac +38756|1254|92|3|16|18484.00|0.07|0.00|A|F|1994-06-26|1994-06-26|1994-07-26|NONE|TRUCK|furiously across +38756|894|95|4|41|73590.49|0.04|0.02|R|F|1994-05-18|1994-07-24|1994-06-15|DELIVER IN PERSON|TRUCK|counts sleep slyly furiously regular +38756|1035|36|5|23|21528.69|0.01|0.01|A|F|1994-06-19|1994-08-04|1994-06-28|NONE|SHIP|fluffily re +38757|1165|74|1|41|43712.56|0.03|0.02|N|O|1998-04-13|1998-05-02|1998-04-22|COLLECT COD|FOB|even somas. furiously pending requests +38757|1036|42|2|24|22488.72|0.05|0.07|N|O|1998-04-16|1998-03-29|1998-05-07|DELIVER IN PERSON|FOB|silent hocke +38757|1780|7|3|22|36999.16|0.05|0.08|N|O|1998-03-14|1998-04-06|1998-03-28|TAKE BACK RETURN|TRUCK|xpress instructions +38757|1590|71|4|36|53697.24|0.08|0.08|N|O|1998-02-20|1998-04-26|1998-03-06|DELIVER IN PERSON|MAIL| pending requests d +38758|1052|53|1|35|33356.75|0.01|0.06|N|O|1995-10-17|1995-11-13|1995-11-07|TAKE BACK RETURN|SHIP|sits wake fluffily +38758|376|61|2|50|63818.50|0.09|0.01|N|O|1995-11-15|1995-12-15|1995-12-09|TAKE BACK RETURN|MAIL| the blithely bold accounts aff +38758|470|58|3|19|26038.93|0.06|0.07|N|O|1996-01-02|1995-11-26|1996-01-09|NONE|MAIL|encies. carefully fluff +38758|785|50|4|38|64059.64|0.07|0.00|N|O|1995-12-21|1995-11-09|1995-12-22|TAKE BACK RETURN|RAIL|osits. packages cajole +38758|1297|9|5|23|27560.67|0.05|0.01|N|O|1995-11-14|1995-11-12|1995-12-14|COLLECT COD|MAIL|ly. blithely brave requests along +38758|1596|17|6|36|53913.24|0.00|0.00|N|O|1995-12-19|1995-11-24|1996-01-03|TAKE BACK RETURN|FOB|nts. accounts caj +38759|818|19|1|7|12031.67|0.10|0.02|N|O|1996-10-11|1996-09-10|1996-10-30|TAKE BACK RETURN|MAIL|s are. special instructions about the fur +38759|21|97|2|28|25788.56|0.00|0.01|N|O|1996-08-29|1996-09-03|1996-09-20|TAKE BACK RETURN|AIR| slyly bold hoc +38759|392|93|3|3|3877.17|0.07|0.06|N|O|1996-08-30|1996-08-21|1996-09-22|TAKE BACK RETURN|MAIL|le carefully idle attainments. boldly +38759|196|75|4|45|49328.55|0.01|0.03|N|O|1996-07-31|1996-09-21|1996-08-01|COLLECT COD|AIR|deas print. dogged ideas affix. carefu +38759|912|81|5|44|79768.04|0.08|0.02|N|O|1996-10-16|1996-09-09|1996-10-31|NONE|FOB| nod ideas. bold, e +38784|297|79|1|25|29932.25|0.06|0.06|R|F|1995-04-26|1995-04-01|1995-04-29|NONE|REG AIR|refully pending deposits run +38785|1625|49|1|12|18319.44|0.03|0.05|N|O|1997-02-16|1997-03-14|1997-03-13|DELIVER IN PERSON|FOB|endencies cajole quickly. +38785|1088|94|2|21|20770.68|0.02|0.00|N|O|1997-05-20|1997-03-08|1997-05-28|NONE|MAIL| ironic dependencies. even foxes detect +38786|1563|64|1|17|24897.52|0.07|0.06|N|O|1995-07-26|1995-09-06|1995-08-24|COLLECT COD|SHIP|ly slyly regular accounts. quickly +38786|200|79|2|31|34106.20|0.01|0.06|N|O|1995-08-18|1995-08-22|1995-08-26|DELIVER IN PERSON|REG AIR|s nag carefully b +38787|203|58|1|42|46334.40|0.02|0.08|N|O|1995-10-18|1995-10-25|1995-11-15|COLLECT COD|AIR|the regular packages: furiously +38787|637|38|2|20|30752.60|0.09|0.07|N|O|1995-08-30|1995-09-29|1995-09-03|DELIVER IN PERSON|MAIL|ake dolphins. accounts haggle blithely +38787|995|96|3|16|30335.84|0.00|0.03|N|O|1995-10-02|1995-09-19|1995-10-16|NONE|REG AIR|s. final, quiet theo +38787|185|38|4|33|35810.94|0.08|0.04|N|O|1995-11-30|1995-11-04|1995-12-24|COLLECT COD|FOB|ts integra +38787|803|70|5|42|71559.60|0.10|0.03|N|O|1995-11-21|1995-09-13|1995-12-13|TAKE BACK RETURN|RAIL|uickly regular accounts. slyly +38788|1120|21|1|45|45950.40|0.08|0.05|N|O|1997-02-16|1997-01-21|1997-02-25|NONE|RAIL|carefully along the express instructi +38788|470|29|2|22|30150.34|0.05|0.00|N|O|1997-02-17|1997-01-04|1997-03-12|COLLECT COD|MAIL|hely bold decoys c +38789|957|26|1|20|37159.00|0.07|0.00|A|F|1993-12-25|1994-01-11|1994-01-13|COLLECT COD|SHIP|inal packages haggle: deposits use slyly. c +38789|1818|62|2|25|42995.25|0.01|0.00|R|F|1994-01-20|1994-01-04|1994-01-31|DELIVER IN PERSON|TRUCK|rding to the fluffily regular r +38789|745|42|3|28|46080.72|0.03|0.00|R|F|1993-12-20|1993-12-20|1993-12-26|NONE|MAIL|ainments around +38789|351|8|4|16|20021.60|0.07|0.05|A|F|1993-12-01|1994-02-07|1993-12-31|NONE|REG AIR|he carefully even theodolit +38789|1849|36|5|41|71784.44|0.05|0.06|A|F|1993-12-21|1993-12-17|1993-12-27|COLLECT COD|TRUCK|ily even foxes. furiously eve +38789|1664|65|6|41|64192.06|0.01|0.05|A|F|1994-03-16|1994-01-01|1994-04-08|TAKE BACK RETURN|RAIL| to the quickly express deposits cajo +38789|1507|48|7|50|70425.00|0.02|0.08|A|F|1993-11-16|1993-12-20|1993-12-07|TAKE BACK RETURN|TRUCK|uctions. carefully pending accou +38790|30|31|1|13|12090.39|0.06|0.07|N|O|1996-04-11|1996-02-13|1996-04-22|TAKE BACK RETURN|REG AIR|lar requests: qui +38790|650|13|2|20|31013.00|0.06|0.01|N|O|1996-04-26|1996-04-10|1996-05-13|COLLECT COD|MAIL|e quickly speci +38790|1934|23|3|10|18359.30|0.05|0.01|N|O|1996-02-01|1996-03-30|1996-02-29|DELIVER IN PERSON|AIR| blithely among the sl +38790|1130|31|4|38|39182.94|0.04|0.03|N|O|1996-04-09|1996-03-18|1996-04-27|TAKE BACK RETURN|MAIL|oxes wake c +38790|1341|42|5|4|4969.36|0.09|0.06|N|O|1996-05-08|1996-03-18|1996-05-21|TAKE BACK RETURN|TRUCK|, final dugouts doubt. bl +38791|269|97|1|44|51447.44|0.07|0.01|R|F|1993-06-15|1993-06-11|1993-06-19|TAKE BACK RETURN|TRUCK|of the quickly unusual pint +38816|1714|41|1|44|71091.24|0.01|0.06|A|F|1993-03-07|1993-03-15|1993-03-29|DELIVER IN PERSON|FOB|e of the carefully regul +38816|481|82|2|14|19340.72|0.01|0.02|A|F|1993-03-25|1993-03-20|1993-04-13|DELIVER IN PERSON|TRUCK|ven ideas detect. sometimes th +38816|1409|49|3|30|39312.00|0.02|0.07|A|F|1993-03-13|1993-02-20|1993-03-25|TAKE BACK RETURN|TRUCK|ic deposits haggl +38816|750|51|4|34|56125.50|0.10|0.06|A|F|1992-12-25|1993-02-25|1993-01-02|DELIVER IN PERSON|TRUCK|unts about the slyly unusual +38816|1709|94|5|2|3221.40|0.07|0.08|R|F|1993-01-22|1993-02-08|1993-02-18|COLLECT COD|FOB|ly unusual id +38817|1131|68|1|23|23738.99|0.05|0.03|R|F|1992-06-07|1992-07-13|1992-07-01|TAKE BACK RETURN|MAIL|e blithely +38817|436|24|2|24|32074.32|0.07|0.07|A|F|1992-08-06|1992-07-27|1992-09-02|COLLECT COD|MAIL| regular accounts. blithely regular excuses +38817|1039|40|3|25|23500.75|0.00|0.01|R|F|1992-07-21|1992-07-30|1992-08-11|DELIVER IN PERSON|AIR|rnes wake alongsid +38817|594|95|4|49|73234.91|0.04|0.08|A|F|1992-06-11|1992-08-05|1992-07-10|TAKE BACK RETURN|REG AIR|ely unusual excuses wake quickly per +38818|91|17|1|47|46581.23|0.04|0.07|R|F|1995-02-27|1995-02-06|1995-02-28|COLLECT COD|AIR|en pattern +38818|584|75|2|26|38599.08|0.10|0.05|R|F|1995-03-02|1995-01-21|1995-03-23|TAKE BACK RETURN|RAIL| deposits. carefully silent +38818|425|84|3|10|13254.20|0.05|0.03|A|F|1995-03-14|1995-01-07|1995-03-20|DELIVER IN PERSON|REG AIR| quickly bold +38818|238|39|4|49|55773.27|0.01|0.06|A|F|1994-12-11|1995-02-07|1994-12-20|DELIVER IN PERSON|SHIP|he final ac +38818|7|83|5|18|16326.00|0.01|0.08|R|F|1995-03-03|1995-02-07|1995-03-18|NONE|TRUCK| regular t +38819|1216|28|1|28|31281.88|0.01|0.00|R|F|1993-02-27|1993-03-13|1993-03-23|TAKE BACK RETURN|SHIP|as must are slyly ironic asymptotes. slyly +38820|1450|68|1|26|35137.70|0.04|0.07|N|O|1998-07-30|1998-09-03|1998-08-18|COLLECT COD|AIR|st blithely along the furious +38821|1304|5|1|25|30132.50|0.06|0.02|A|F|1993-08-06|1993-07-11|1993-08-28|DELIVER IN PERSON|TRUCK|. doggedly bold instructio +38821|1304|5|2|1|1205.30|0.04|0.03|R|F|1993-07-30|1993-07-07|1993-08-07|COLLECT COD|AIR|g, express acc +38821|330|31|3|4|4921.32|0.05|0.01|R|F|1993-08-30|1993-07-11|1993-09-21|TAKE BACK RETURN|REG AIR| according to the iron +38821|1926|71|4|24|43870.08|0.00|0.08|R|F|1993-08-02|1993-08-16|1993-08-05|COLLECT COD|RAIL|ainst the regular warthogs? +38821|230|85|5|8|9041.84|0.09|0.08|R|F|1993-07-15|1993-07-17|1993-07-31|TAKE BACK RETURN|AIR|sleep carefully regular deposits- +38822|271|53|1|25|29281.75|0.08|0.08|R|F|1995-03-14|1995-02-07|1995-03-26|COLLECT COD|MAIL| the final accounts. unusual foxe +38822|480|10|2|45|62121.60|0.02|0.08|A|F|1995-04-21|1995-01-28|1995-04-24|DELIVER IN PERSON|AIR|ct slyly r +38823|382|83|1|39|50012.82|0.08|0.00|N|O|1997-12-16|1998-01-18|1998-01-08|COLLECT COD|TRUCK|en foxes. fluffily pending acco +38823|1716|1|2|30|48531.30|0.07|0.01|N|O|1997-12-11|1998-01-27|1998-01-09|DELIVER IN PERSON|RAIL|ual asymptotes wak +38848|1574|15|1|5|7377.85|0.04|0.08|R|F|1993-03-06|1993-03-17|1993-03-08|NONE|REG AIR|ng the requests +38848|1443|83|2|6|8066.64|0.01|0.08|R|F|1993-01-07|1993-02-14|1993-01-25|DELIVER IN PERSON|REG AIR|requests are blithely final pi +38849|1806|50|1|24|40987.20|0.04|0.08|N|O|1996-08-22|1996-10-10|1996-08-31|NONE|REG AIR|ely regular deposits after the pen +38849|1115|16|2|48|48773.28|0.06|0.07|N|O|1996-10-16|1996-09-15|1996-11-13|COLLECT COD|REG AIR|to beans sublat +38849|1285|97|3|45|53382.60|0.04|0.02|N|O|1996-08-11|1996-09-06|1996-08-19|NONE|SHIP|al dependencies mold about the slyly even d +38849|489|90|4|27|37515.96|0.09|0.01|N|O|1996-10-15|1996-08-21|1996-10-16|DELIVER IN PERSON|TRUCK| regular packages wake furiously among the +38849|1702|29|5|26|41696.20|0.06|0.08|N|O|1996-09-17|1996-10-16|1996-09-19|COLLECT COD|MAIL|en, final pinto +38849|1549|70|6|13|18857.02|0.05|0.06|N|O|1996-09-05|1996-08-29|1996-09-16|NONE|TRUCK|slowly express idea +38849|769|34|7|17|28385.92|0.04|0.07|N|O|1996-08-16|1996-10-16|1996-09-11|NONE|REG AIR|rthogs doze blithel +38850|933|68|1|6|11003.58|0.05|0.00|A|F|1993-06-19|1993-07-12|1993-06-26|COLLECT COD|FOB|iously express theodolites haggle furiously +38850|381|10|2|41|52536.58|0.03|0.03|A|F|1993-07-14|1993-07-10|1993-07-28|NONE|FOB|y bold requests? even re +38850|946|49|3|49|90500.06|0.03|0.01|R|F|1993-07-26|1993-05-31|1993-08-10|DELIVER IN PERSON|FOB|nal packages wake silently unu +38850|1828|29|4|33|57084.06|0.10|0.01|R|F|1993-08-10|1993-06-30|1993-08-22|TAKE BACK RETURN|MAIL|yly. quickly even deposits +38850|1448|27|5|49|66122.56|0.01|0.02|A|F|1993-06-08|1993-05-31|1993-06-16|DELIVER IN PERSON|MAIL|slyly pending, special deposits +38850|380|9|6|6|7682.28|0.01|0.03|A|F|1993-05-18|1993-06-02|1993-06-13|COLLECT COD|MAIL|furiously exc +38850|540|1|7|42|60502.68|0.01|0.02|R|F|1993-06-26|1993-06-29|1993-07-14|TAKE BACK RETURN|AIR|d packages x-ray. final excuses wake +38851|1049|85|1|8|7600.32|0.00|0.03|R|F|1992-06-14|1992-09-09|1992-07-04|COLLECT COD|AIR|ajole quietly +38851|672|35|2|40|62906.80|0.08|0.00|A|F|1992-10-02|1992-09-05|1992-10-26|TAKE BACK RETURN|REG AIR|cuses. blithely regular idea +38852|478|79|1|49|67545.03|0.02|0.02|A|F|1995-01-16|1994-12-10|1995-01-21|DELIVER IN PERSON|SHIP|ithely against +38852|1165|2|2|2|2132.32|0.01|0.05|A|F|1994-11-05|1995-01-02|1994-11-07|DELIVER IN PERSON|TRUCK|uriously even multipliers. quickly +38852|1180|89|3|19|20542.42|0.09|0.02|R|F|1994-11-14|1995-01-09|1994-11-25|COLLECT COD|RAIL|ickly final foxes are a +38852|513|4|4|30|42405.30|0.04|0.04|R|F|1995-01-14|1995-01-08|1995-01-18|TAKE BACK RETURN|AIR|nstructions. carefully final accounts ca +38852|1586|87|5|24|35701.92|0.00|0.06|A|F|1995-02-26|1995-01-09|1995-03-19|NONE|AIR|fluffily regular acc +38852|1369|46|6|38|48273.68|0.07|0.05|R|F|1994-12-14|1995-01-09|1994-12-30|TAKE BACK RETURN|FOB| bold, final warthogs. carefully p +38852|396|81|7|14|18149.46|0.03|0.06|R|F|1994-11-08|1995-01-26|1994-11-24|COLLECT COD|SHIP|he carefully regular +38853|647|48|1|40|61905.60|0.02|0.08|R|F|1992-05-17|1992-05-07|1992-05-27|NONE|AIR|instructions. carefully fi +38853|988|91|2|31|58558.38|0.06|0.08|A|F|1992-05-22|1992-06-05|1992-05-27|TAKE BACK RETURN|AIR|to the bravely final ideas. ironic, unu +38853|529|90|3|1|1429.52|0.03|0.03|A|F|1992-06-17|1992-06-03|1992-07-06|DELIVER IN PERSON|TRUCK|es. bold requests are. quickly regular a +38853|1199|100|4|35|38506.65|0.08|0.01|A|F|1992-04-26|1992-05-02|1992-04-29|NONE|FOB|requests. quic +38853|934|69|5|25|45873.25|0.01|0.08|A|F|1992-04-02|1992-05-02|1992-04-03|NONE|MAIL|xpress, pending asymptotes use. depos +38854|1083|89|1|42|41331.36|0.10|0.03|N|O|1996-05-23|1996-03-31|1996-05-26|TAKE BACK RETURN|MAIL|even packages h +38854|612|44|2|2|3025.22|0.04|0.00|N|O|1996-02-15|1996-03-28|1996-02-29|TAKE BACK RETURN|RAIL|al attainments +38854|1743|44|3|20|32894.80|0.09|0.01|N|O|1996-06-06|1996-03-21|1996-06-17|NONE|AIR|to beans serve regular courts. furiously +38854|526|57|4|35|49928.20|0.05|0.01|N|O|1996-03-04|1996-04-29|1996-03-13|TAKE BACK RETURN|AIR|ve the slyly idle +38854|1110|47|5|48|48533.28|0.01|0.04|N|O|1996-02-26|1996-04-13|1996-03-16|COLLECT COD|TRUCK|e; carefully regular sentimen +38855|48|24|1|12|11376.48|0.06|0.00|N|O|1998-01-26|1998-01-04|1998-02-05|COLLECT COD|FOB|press foxes wake furiously unusua +38855|1451|52|2|46|62212.70|0.02|0.02|N|O|1997-11-28|1997-11-21|1997-12-17|TAKE BACK RETURN|REG AIR|ully above the +38855|1331|8|3|41|50525.53|0.06|0.07|N|O|1997-12-03|1998-01-01|1997-12-28|NONE|FOB|unts sleep slyly furiously pen +38855|1794|79|4|30|50873.70|0.07|0.08|N|O|1998-01-19|1997-11-16|1998-02-14|COLLECT COD|RAIL|cajole about the silent, even theodolites. +38880|166|93|1|25|26654.00|0.00|0.04|N|O|1997-02-14|1997-04-19|1997-03-08|NONE|FOB|ide of the +38880|1100|71|2|30|30033.00|0.08|0.08|N|O|1997-04-05|1997-02-23|1997-04-06|DELIVER IN PERSON|FOB|ully regular ideas cajole slyly: +38880|1084|90|3|41|40388.28|0.05|0.02|N|O|1997-02-20|1997-03-14|1997-03-08|DELIVER IN PERSON|RAIL|ions kindle abo +38880|398|83|4|28|36354.92|0.00|0.08|N|O|1997-03-26|1997-03-29|1997-04-18|TAKE BACK RETURN|TRUCK|fully final platelets mol +38880|210|11|5|39|43298.19|0.02|0.07|N|O|1997-04-10|1997-03-04|1997-04-22|DELIVER IN PERSON|TRUCK|efully final packages a +38881|38|14|1|44|41273.32|0.07|0.05|N|O|1996-04-28|1996-04-14|1996-05-20|TAKE BACK RETURN|AIR|encies detect. carefully express pinto +38881|1977|22|2|1|1878.97|0.06|0.05|N|O|1996-04-19|1996-04-12|1996-05-17|DELIVER IN PERSON|MAIL|lar instructions wake slyly ev +38881|910|79|3|25|45272.75|0.10|0.01|N|O|1996-03-21|1996-03-18|1996-04-13|NONE|TRUCK|jole carefully +38881|486|74|4|12|16637.76|0.05|0.08|N|O|1996-05-22|1996-04-23|1996-06-07|COLLECT COD|REG AIR|ons cajole furiously across th +38881|1502|43|5|48|67368.00|0.03|0.02|N|O|1996-03-28|1996-04-10|1996-04-07|TAKE BACK RETURN|AIR|tructions serve a +38881|1950|83|6|49|90745.55|0.00|0.00|N|O|1996-05-31|1996-05-02|1996-06-06|COLLECT COD|REG AIR|ss the carefully special pinto bea +38881|601|33|7|38|57060.80|0.02|0.02|N|O|1996-06-06|1996-03-15|1996-06-23|NONE|REG AIR|: fluffily regu +38882|1539|80|1|38|54740.14|0.00|0.08|R|F|1995-02-27|1995-02-03|1995-03-11|NONE|TRUCK|n requests poach +38882|650|44|2|49|75981.85|0.03|0.01|A|F|1995-03-10|1995-02-19|1995-03-30|COLLECT COD|TRUCK|he slyly regu +38882|429|30|3|13|17282.46|0.04|0.05|A|F|1995-03-25|1995-02-12|1995-04-10|TAKE BACK RETURN|AIR|es affix slyly furiously f +38882|1897|84|4|10|17988.90|0.08|0.08|R|F|1995-03-08|1995-02-06|1995-04-01|TAKE BACK RETURN|AIR|cuses. regular, special accounts sleep fina +38882|664|58|5|19|29728.54|0.04|0.01|R|F|1995-02-05|1995-01-17|1995-02-21|DELIVER IN PERSON|RAIL| carefully after the furiou +38883|1117|54|1|18|18325.98|0.03|0.07|N|O|1996-11-02|1996-10-19|1996-11-21|DELIVER IN PERSON|SHIP|osits cajole slyly blithely eve +38883|1956|45|2|36|66886.20|0.08|0.04|N|O|1996-09-06|1996-10-10|1996-10-06|TAKE BACK RETURN|FOB|he carefully special d +38883|564|55|3|5|7322.80|0.09|0.04|N|O|1996-10-25|1996-10-17|1996-11-10|TAKE BACK RETURN|AIR|egular packages +38884|696|90|1|30|47900.70|0.06|0.01|A|F|1992-09-05|1992-11-02|1992-09-11|TAKE BACK RETURN|FOB|al theodolites believe +38884|1853|83|2|41|71948.85|0.04|0.06|R|F|1992-09-07|1992-10-22|1992-09-21|TAKE BACK RETURN|REG AIR|uickly final packages. +38884|826|60|3|44|75980.08|0.01|0.07|A|F|1992-12-15|1992-11-03|1993-01-02|NONE|AIR|s until the ironic packages na +38884|158|85|4|5|5290.75|0.08|0.05|R|F|1992-12-11|1992-10-20|1992-12-16|COLLECT COD|SHIP|fully regular deposits. sl +38884|404|34|5|23|30001.20|0.01|0.02|R|F|1992-09-06|1992-09-18|1992-09-13|COLLECT COD|AIR|ost quietly +38885|362|47|1|32|40395.52|0.05|0.01|N|O|1997-11-23|1997-10-23|1997-12-09|TAKE BACK RETURN|REG AIR|ructions shall wake after t +38886|1375|14|1|5|6381.85|0.09|0.02|A|F|1994-08-28|1994-10-15|1994-09-25|TAKE BACK RETURN|REG AIR|gedly final packages boo +38886|109|62|2|45|45409.50|0.05|0.05|A|F|1994-09-01|1994-10-13|1994-09-30|NONE|FOB|the accounts. ironic instructions sle +38886|576|77|3|9|13289.13|0.09|0.00|A|F|1994-10-25|1994-10-10|1994-11-04|DELIVER IN PERSON|REG AIR|pinto beans boost. regu +38886|1898|99|4|26|46797.14|0.08|0.06|R|F|1994-08-26|1994-11-03|1994-09-19|DELIVER IN PERSON|MAIL|regular, bold theodolites. final, ironic ac +38887|1543|24|1|1|1444.54|0.01|0.05|R|F|1995-01-27|1994-12-06|1995-02-08|DELIVER IN PERSON|RAIL|mptotes alongside o +38887|836|37|2|24|41683.92|0.05|0.06|A|F|1995-02-12|1994-12-09|1995-02-14|COLLECT COD|RAIL|even, bold requests haggle blithely. +38887|1750|93|3|7|11562.25|0.09|0.04|R|F|1994-12-26|1995-01-17|1995-01-04|TAKE BACK RETURN|TRUCK|r accounts sleep blithely bold, special ex +38887|165|92|4|47|50062.52|0.03|0.04|A|F|1995-02-03|1994-12-24|1995-02-28|TAKE BACK RETURN|TRUCK|sly pending deposits? carefully close pl +38887|976|11|5|35|65693.95|0.00|0.01|A|F|1995-01-15|1994-12-09|1995-02-06|DELIVER IN PERSON|RAIL| furiously even packages haggle. car +38887|1658|41|6|33|51468.45|0.08|0.05|R|F|1994-12-27|1994-12-09|1995-01-06|DELIVER IN PERSON|AIR|eas. quickly ironic sentiments cajo +38912|1272|10|1|27|31678.29|0.05|0.08|A|F|1993-02-19|1992-11-30|1993-03-09|DELIVER IN PERSON|RAIL|uts promise instructions. fina +38912|1459|60|2|15|20406.75|0.05|0.01|R|F|1992-12-29|1992-11-28|1992-12-31|COLLECT COD|MAIL|dependencies. waters sleep caref +38912|1819|6|3|25|43020.25|0.04|0.06|A|F|1993-02-23|1993-01-08|1993-03-24|COLLECT COD|RAIL|ully final asymptotes. expr +38912|1761|62|4|39|64847.64|0.08|0.08|R|F|1992-12-29|1992-12-10|1993-01-13|DELIVER IN PERSON|SHIP|ckly bold +38912|529|60|5|47|67187.44|0.00|0.08|R|F|1993-02-19|1992-12-24|1993-03-11|TAKE BACK RETURN|FOB|t the carefully regular ideas. regu +38912|1808|9|6|30|51294.00|0.02|0.05|A|F|1993-01-20|1992-12-11|1993-01-24|DELIVER IN PERSON|AIR|s use slyly slyly even instructio +38913|1411|12|1|6|7874.46|0.10|0.06|R|F|1994-09-10|1994-11-06|1994-09-25|NONE|MAIL|nic requests +38913|1846|76|2|1|1747.84|0.08|0.00|A|F|1994-09-14|1994-10-27|1994-09-20|COLLECT COD|FOB|ghout the ironic deposits haggle about +38913|768|1|3|9|15018.84|0.04|0.05|R|F|1994-09-25|1994-10-25|1994-09-27|COLLECT COD|REG AIR|s the fluffily +38914|129|30|1|37|38077.44|0.05|0.06|A|F|1992-09-22|1992-07-21|1992-10-13|TAKE BACK RETURN|RAIL|ctions sleep. even, pending requests bo +38914|1733|76|2|18|29425.14|0.04|0.07|A|F|1992-07-26|1992-08-06|1992-08-09|TAKE BACK RETURN|MAIL|e deposits wake bef +38914|46|22|3|29|27435.16|0.02|0.03|A|F|1992-08-26|1992-07-08|1992-09-25|COLLECT COD|REG AIR|c accounts. regular dep +38915|283|38|1|18|21299.04|0.04|0.03|R|F|1994-11-04|1994-11-29|1994-11-23|TAKE BACK RETURN|REG AIR|lly slyly ironic +38915|1563|84|2|22|32220.32|0.00|0.05|R|F|1994-10-09|1994-11-14|1994-10-26|DELIVER IN PERSON|AIR| express reques +38915|1426|5|3|49|65043.58|0.02|0.03|A|F|1994-11-12|1994-10-18|1994-11-29|DELIVER IN PERSON|TRUCK|onic deposits integrate qu +38915|1633|34|4|19|29157.97|0.10|0.00|R|F|1994-11-03|1994-11-19|1994-11-12|NONE|FOB| cajole furiously +38915|463|64|5|22|29996.12|0.07|0.05|R|F|1994-11-29|1994-10-23|1994-12-24|TAKE BACK RETURN|RAIL|nal accounts: quickly ironic requ +38915|1790|33|6|30|50753.70|0.07|0.00|R|F|1995-01-01|1994-11-27|1995-01-19|NONE|TRUCK|y. silent de +38915|418|6|7|15|19776.15|0.10|0.02|R|F|1994-11-27|1994-10-29|1994-12-20|TAKE BACK RETURN|FOB|ding foxes. regular deposits +38916|1648|90|1|25|38741.00|0.03|0.06|N|O|1997-10-16|1997-09-02|1997-10-31|COLLECT COD|MAIL|olites wak +38916|1270|71|2|4|4685.08|0.08|0.01|N|O|1997-09-26|1997-07-24|1997-10-04|COLLECT COD|MAIL|unts. accounts use slyly. +38916|1233|34|3|30|34026.90|0.10|0.00|N|O|1997-08-24|1997-08-27|1997-09-18|DELIVER IN PERSON|FOB| even deposits are furiously regular ex +38916|264|65|4|11|12806.86|0.09|0.03|N|O|1997-10-17|1997-08-08|1997-10-18|DELIVER IN PERSON|SHIP|l packages. fluffily fi +38916|1127|36|5|16|16449.92|0.00|0.03|N|O|1997-08-03|1997-08-07|1997-08-05|DELIVER IN PERSON|MAIL|atelets eat blithely acr +38916|837|37|6|15|26067.45|0.01|0.02|N|O|1997-10-07|1997-09-17|1997-10-19|NONE|TRUCK|phins-- quickly s +38917|356|85|1|38|47741.30|0.02|0.06|A|F|1994-03-01|1993-12-29|1994-03-20|TAKE BACK RETURN|REG AIR|requests? even requests hinder even +38917|340|25|2|8|9922.72|0.05|0.04|A|F|1993-12-05|1993-12-29|1994-01-02|COLLECT COD|RAIL|usly regular asymptotes use among the +38917|1194|31|3|26|28474.94|0.09|0.04|R|F|1994-01-08|1994-02-02|1994-01-16|DELIVER IN PERSON|RAIL|fully regular instructions. quickly +38917|1329|6|4|43|52903.76|0.06|0.06|A|F|1994-03-10|1994-01-15|1994-03-30|NONE|REG AIR|ts are slyly quickly pending +38917|1872|59|5|27|47894.49|0.05|0.06|A|F|1993-11-27|1994-01-17|1993-12-22|COLLECT COD|FOB|s. carefully ironic packages afte +38917|1536|57|6|25|35938.25|0.01|0.06|A|F|1993-11-29|1994-01-28|1993-12-13|COLLECT COD|AIR|requests. carefully ironic instructions ar +38917|1365|42|7|41|51920.76|0.04|0.03|A|F|1994-01-29|1994-01-31|1994-02-01|DELIVER IN PERSON|MAIL|round the furiously special requests hag +38918|1962|95|1|48|89470.08|0.00|0.01|N|O|1997-06-29|1997-06-14|1997-07-25|COLLECT COD|MAIL|bold accounts. blithely unusual theo +38918|1017|53|2|47|43146.47|0.08|0.04|N|O|1997-07-12|1997-08-07|1997-07-23|NONE|RAIL|ndencies are. dinos +38918|584|75|3|26|38599.08|0.07|0.05|N|O|1997-05-22|1997-06-27|1997-05-31|NONE|MAIL|ake busily carefully r +38918|527|18|4|6|8565.12|0.04|0.01|N|O|1997-07-20|1997-06-12|1997-08-06|DELIVER IN PERSON|TRUCK|ecial requests nag blithely acr +38918|1672|96|5|21|33047.07|0.07|0.07|N|O|1997-06-20|1997-07-20|1997-07-08|COLLECT COD|FOB|ove the furiously regular instr +38918|1123|60|6|25|25603.00|0.10|0.05|N|O|1997-06-11|1997-07-17|1997-06-23|NONE|REG AIR|y over the carefully bold packages. c +38919|1476|16|1|24|33059.28|0.01|0.06|N|O|1996-03-08|1996-02-19|1996-03-15|TAKE BACK RETURN|AIR|s of the slyly final requ +38919|1386|25|2|46|59219.48|0.07|0.08|N|O|1995-12-27|1996-02-04|1996-01-22|TAKE BACK RETURN|FOB|tes detect furiously even theodoli +38944|927|30|1|36|65805.12|0.09|0.08|R|F|1993-06-05|1993-06-17|1993-06-07|TAKE BACK RETURN|AIR|sual packages boost carefully throughou +38944|736|69|2|24|39281.52|0.01|0.00|A|F|1993-08-03|1993-05-23|1993-08-27|COLLECT COD|MAIL|the final, +38944|1263|75|3|32|37256.32|0.05|0.08|R|F|1993-07-23|1993-07-05|1993-08-13|NONE|SHIP|cuses use furiously final dol +38944|437|96|4|9|12036.87|0.09|0.06|A|F|1993-04-27|1993-05-21|1993-05-15|TAKE BACK RETURN|RAIL|alongside of the requests. final deposits a +38944|1645|28|5|26|40212.64|0.08|0.04|A|F|1993-08-12|1993-05-23|1993-08-28|TAKE BACK RETURN|AIR| bold packages nag furiously about the qu +38944|1362|39|6|4|5053.44|0.06|0.07|A|F|1993-04-23|1993-05-30|1993-05-06|DELIVER IN PERSON|REG AIR|tions. furiously bold courts haggle furious +38945|1098|4|1|43|42960.87|0.05|0.07|N|O|1996-01-28|1996-03-18|1996-02-17|COLLECT COD|MAIL|ng accounts are after th +38945|1935|36|2|22|40412.46|0.02|0.07|N|O|1996-01-26|1996-04-15|1996-02-06|COLLECT COD|MAIL|odolites. quickly ruthless +38945|1972|61|3|28|52471.16|0.08|0.08|N|O|1996-05-01|1996-03-05|1996-05-28|NONE|AIR|gle. fluffily ruthless package +38946|1348|87|1|37|46225.58|0.07|0.08|N|O|1996-11-03|1997-01-19|1996-11-11|NONE|FOB| fluffily. even acco +38947|497|85|1|36|50309.64|0.04|0.05|A|F|1995-01-20|1995-01-01|1995-01-26|DELIVER IN PERSON|AIR|. fluffily special depos +38947|1697|39|2|5|7993.45|0.05|0.00|A|F|1994-12-16|1995-02-28|1995-01-11|COLLECT COD|REG AIR|cuses poach slyly acros +38947|1899|100|3|19|34216.91|0.07|0.07|A|F|1994-12-17|1995-01-12|1995-01-02|NONE|RAIL|lithely ironic deposits +38947|1476|55|4|5|6887.35|0.04|0.07|R|F|1995-02-26|1995-01-23|1995-03-14|DELIVER IN PERSON|AIR|g to the bold pinto beans hinder sly +38947|752|85|5|20|33055.00|0.06|0.08|R|F|1995-03-29|1995-01-07|1995-04-22|DELIVER IN PERSON|SHIP|nto beans h +38948|1070|41|1|34|33016.38|0.03|0.01|N|O|1995-08-11|1995-08-10|1995-08-27|COLLECT COD|FOB|t the stealthily final requests wake alo +38948|216|98|2|20|22324.20|0.08|0.05|N|O|1995-06-18|1995-07-26|1995-07-04|TAKE BACK RETURN|RAIL|ndencies hinder. even, final foxes d +38948|1448|88|3|28|37784.32|0.08|0.01|N|O|1995-08-23|1995-07-29|1995-09-01|NONE|AIR|nal deposits caj +38949|1971|60|1|17|31840.49|0.02|0.02|R|F|1992-10-25|1992-11-18|1992-10-28|TAKE BACK RETURN|TRUCK|epitaphs. requests according to t +38949|957|26|2|21|39016.95|0.01|0.08|A|F|1992-11-09|1992-10-07|1992-12-03|NONE|SHIP|ke. fluffily express packages after t +38949|166|45|3|32|34117.12|0.02|0.07|A|F|1992-12-14|1992-11-22|1992-12-29|COLLECT COD|SHIP|s nag pinto beans. regular in +38949|605|6|4|29|43662.40|0.03|0.00|R|F|1992-09-16|1992-10-10|1992-10-05|DELIVER IN PERSON|RAIL|etect quickly foxes. regular, speci +38949|396|25|5|44|57041.16|0.10|0.02|R|F|1992-09-06|1992-10-03|1992-09-28|DELIVER IN PERSON|TRUCK| nag above the even grouches. blithely +38949|1581|62|6|34|50407.72|0.01|0.05|A|F|1992-11-17|1992-10-16|1992-12-01|COLLECT COD|TRUCK|leep regular d +38950|780|77|1|22|36977.16|0.07|0.03|N|O|1995-10-06|1995-08-21|1995-11-04|DELIVER IN PERSON|MAIL|osits haggle slyly. express +38950|1178|51|2|29|31295.93|0.04|0.07|N|O|1995-08-02|1995-09-04|1995-08-21|NONE|SHIP|lithely according to the carefully pendi +38950|374|3|3|16|20389.92|0.05|0.03|N|O|1995-10-24|1995-08-23|1995-11-03|NONE|TRUCK|usly according to the even asymptotes. re +38950|1199|36|4|18|19803.42|0.10|0.07|N|O|1995-09-28|1995-09-16|1995-09-30|COLLECT COD|MAIL|ly express theodolites. furiou +38950|1774|1|5|26|43570.02|0.06|0.06|N|O|1995-07-21|1995-08-04|1995-07-31|COLLECT COD|RAIL|pending deposits. sp +38951|77|3|1|24|23449.68|0.01|0.05|N|O|1997-07-31|1997-05-19|1997-08-10|NONE|REG AIR|ress requests a +38951|668|31|2|36|56471.76|0.00|0.02|N|O|1997-05-22|1997-06-19|1997-06-09|DELIVER IN PERSON|MAIL|ependencies. ironic theodol +38951|939|8|3|23|42318.39|0.04|0.03|N|O|1997-07-29|1997-06-23|1997-08-14|COLLECT COD|AIR|pinto beans. final deposits nag. ca +38951|602|65|4|8|12020.80|0.07|0.04|N|O|1997-04-04|1997-06-13|1997-04-15|DELIVER IN PERSON|SHIP|l ideas sleep +38951|10|61|5|44|40040.44|0.02|0.01|N|O|1997-06-30|1997-06-26|1997-07-28|COLLECT COD|MAIL|kly slow requests! ironically even req +38951|293|75|6|2|2386.58|0.06|0.04|N|O|1997-05-03|1997-05-17|1997-05-29|DELIVER IN PERSON|AIR| furiously regular theodolites across the +38976|1355|56|1|5|6281.75|0.04|0.00|A|F|1994-01-25|1994-02-16|1994-02-20|NONE|MAIL|s. foxes haggle furiously along the bold in +38976|905|8|2|18|32506.20|0.05|0.00|A|F|1994-04-16|1994-03-19|1994-04-22|COLLECT COD|MAIL|ar decoys dazzle boldly +38976|1237|75|3|15|17073.45|0.10|0.05|R|F|1994-03-12|1994-01-25|1994-03-29|DELIVER IN PERSON|SHIP|its cajole requests. fluffily final gifts +38976|1520|1|4|28|39802.56|0.03|0.00|A|F|1994-01-04|1994-02-10|1994-01-19|DELIVER IN PERSON|FOB|ng the quickly unusual packages sleep s +38976|133|60|5|26|26861.38|0.10|0.04|R|F|1994-04-08|1994-02-28|1994-04-15|NONE|TRUCK|coys. ironic dinos m +38976|1470|49|6|42|57601.74|0.05|0.00|A|F|1994-01-06|1994-02-13|1994-01-25|NONE|REG AIR|ake across th +38977|212|94|1|23|25580.83|0.00|0.00|R|F|1993-03-17|1993-03-17|1993-03-24|DELIVER IN PERSON|AIR|quests grow slyly. final +38977|1133|6|2|39|40331.07|0.07|0.00|A|F|1993-06-11|1993-04-10|1993-07-03|TAKE BACK RETURN|FOB|ter the close foxes? pending req +38977|1523|4|3|27|38462.04|0.04|0.08|A|F|1993-04-02|1993-03-20|1993-04-24|NONE|REG AIR|ts. instruc +38977|313|42|4|15|18199.65|0.09|0.00|A|F|1993-03-05|1993-05-14|1993-03-13|TAKE BACK RETURN|REG AIR|ssly pending ideas use deposits. furiously +38977|1669|93|5|43|67538.38|0.04|0.05|A|F|1993-05-15|1993-04-13|1993-05-26|COLLECT COD|SHIP|e furiously bold acc +38977|1445|85|6|35|47125.40|0.09|0.02|A|F|1993-06-07|1993-04-01|1993-07-01|DELIVER IN PERSON|REG AIR|eposits. furiously unusual requ +38978|1130|39|1|35|36089.55|0.01|0.03|A|F|1994-08-25|1994-10-08|1994-09-05|NONE|TRUCK|foxes. fluffily dogge +38979|438|97|1|21|28107.03|0.02|0.01|R|F|1993-05-17|1993-05-23|1993-05-27|NONE|MAIL| final, even +38979|906|41|2|44|79503.60|0.06|0.01|R|F|1993-06-25|1993-03-30|1993-06-29|TAKE BACK RETURN|FOB| above the +38979|1561|82|3|38|55577.28|0.06|0.01|A|F|1993-06-21|1993-05-23|1993-07-05|DELIVER IN PERSON|AIR|furiously perman +38979|427|28|4|3|3982.26|0.01|0.07|R|F|1993-03-20|1993-04-23|1993-04-03|NONE|REG AIR|ly bold requests. blithely pendin +38979|1510|51|5|8|11292.08|0.09|0.06|A|F|1993-04-15|1993-05-22|1993-05-07|NONE|FOB|inal packages cajole carefully carefull +38979|336|65|6|29|35853.57|0.04|0.08|A|F|1993-06-19|1993-05-04|1993-07-18|TAKE BACK RETURN|AIR|ully even accounts. always regular deposits +38980|1392|7|1|31|40095.09|0.02|0.07|A|F|1993-12-30|1994-01-15|1994-01-22|DELIVER IN PERSON|TRUCK|unts hang furiously. blit +38980|257|39|2|10|11572.50|0.09|0.05|A|F|1993-12-23|1993-12-30|1994-01-12|COLLECT COD|MAIL|rding to the fluffily +38980|825|26|3|45|77661.90|0.07|0.01|R|F|1993-11-19|1994-01-03|1993-11-20|COLLECT COD|AIR|t the quick +38980|763|60|4|8|13310.08|0.01|0.04|A|F|1993-12-10|1993-12-17|1993-12-25|COLLECT COD|MAIL|efully among the final +38980|380|65|5|34|43532.92|0.10|0.06|A|F|1994-01-10|1994-01-10|1994-01-27|DELIVER IN PERSON|AIR|ns. slyly regular packages are fluf +38981|182|61|1|7|7575.26|0.00|0.00|R|F|1993-02-21|1993-04-13|1993-03-13|TAKE BACK RETURN|MAIL|sly ironic +38981|785|50|2|5|8428.90|0.06|0.01|A|F|1993-02-01|1993-03-30|1993-02-22|DELIVER IN PERSON|SHIP|. express, ironic courts are about the r +38981|1440|58|3|41|54999.04|0.04|0.08|A|F|1993-05-22|1993-04-19|1993-06-11|COLLECT COD|AIR|-ray. furiously ironic theodolites in +38981|1029|65|4|16|14880.32|0.08|0.06|R|F|1993-03-24|1993-04-09|1993-04-04|NONE|TRUCK|riously ironic excuses sleep. blithely pend +38982|510|11|1|18|25389.18|0.02|0.00|A|F|1994-09-14|1994-08-21|1994-10-07|TAKE BACK RETURN|REG AIR|y enticing depo +38982|1163|36|2|6|6384.96|0.10|0.08|A|F|1994-11-01|1994-10-08|1994-11-13|COLLECT COD|SHIP|ccounts. quic +38982|1885|29|3|17|30376.96|0.05|0.02|R|F|1994-11-13|1994-08-23|1994-12-06|DELIVER IN PERSON|SHIP|y bold dolphins. silent, bold accou +38982|1874|4|4|33|58603.71|0.06|0.07|R|F|1994-09-12|1994-09-01|1994-09-29|TAKE BACK RETURN|MAIL|s sleep furiously about th +38982|1070|41|5|35|33987.45|0.05|0.02|A|F|1994-08-12|1994-09-08|1994-08-24|TAKE BACK RETURN|SHIP|ly blithely +38983|170|23|1|21|22473.57|0.08|0.06|N|O|1997-09-16|1997-08-14|1997-09-21|NONE|REG AIR|arefully carefully bold courts. furiously +38983|1004|40|2|45|40725.00|0.05|0.02|N|O|1997-10-02|1997-08-07|1997-10-11|NONE|AIR|r packages use furiously slyly ironic ins +39008|1913|2|1|40|72596.40|0.07|0.05|N|O|1995-07-30|1995-06-20|1995-08-04|COLLECT COD|RAIL|y final requests boost finally regula +39008|838|72|2|20|34776.60|0.04|0.08|N|O|1995-07-24|1995-07-18|1995-08-19|TAKE BACK RETURN|MAIL|oach ruthlessly alon +39008|645|8|3|44|68008.16|0.08|0.08|N|O|1995-07-08|1995-06-04|1995-07-30|NONE|TRUCK|ely bold requests. regular foxes detec +39009|1539|20|1|6|8643.18|0.06|0.05|N|O|1997-09-09|1997-08-23|1997-10-09|NONE|REG AIR|nal theodolites a +39009|1473|52|2|47|64600.09|0.06|0.04|N|O|1997-07-28|1997-10-03|1997-08-11|COLLECT COD|MAIL| after the ironic, ironic platelets affi +39009|714|79|3|40|64588.40|0.00|0.07|N|O|1997-07-24|1997-09-10|1997-07-30|COLLECT COD|MAIL|sly. unusual, unusual instructions slee +39010|1519|20|1|23|32671.73|0.02|0.07|N|F|1995-06-01|1995-07-24|1995-07-01|COLLECT COD|RAIL|onic packages haggle slyly. br +39010|52|78|2|50|47602.50|0.01|0.07|N|O|1995-07-13|1995-07-05|1995-08-01|COLLECT COD|TRUCK|ong the special packages. q +39010|1436|76|3|21|28086.03|0.08|0.06|N|O|1995-07-02|1995-06-24|1995-07-07|COLLECT COD|AIR|phins. busily +39010|1602|44|4|49|73676.40|0.10|0.04|N|O|1995-08-23|1995-08-12|1995-09-22|DELIVER IN PERSON|FOB| carefully ironic +39011|1738|39|1|9|14757.57|0.05|0.03|R|F|1993-04-18|1993-03-31|1993-05-15|TAKE BACK RETURN|MAIL|y unusual instructions a +39012|1135|36|1|31|32120.03|0.08|0.06|N|O|1996-08-09|1996-06-24|1996-08-20|NONE|TRUCK| unusual ideas cajole +39013|1053|54|1|33|31483.65|0.03|0.00|N|O|1996-03-06|1996-03-14|1996-03-30|COLLECT COD|SHIP|leep. blithely unusual ac +39013|306|63|2|42|50664.60|0.01|0.00|N|O|1996-03-07|1996-03-23|1996-03-13|DELIVER IN PERSON|AIR|lowly pending instructi +39014|961|64|1|49|91236.04|0.02|0.00|N|O|1997-12-08|1997-12-12|1998-01-01|COLLECT COD|TRUCK|ffily regular ide +39014|1250|51|2|40|46050.00|0.03|0.04|N|O|1998-02-25|1998-01-20|1998-03-25|NONE|TRUCK|c instructions. even accounts are. sly +39014|1225|100|3|21|23650.62|0.00|0.01|N|O|1998-02-03|1997-12-13|1998-02-22|DELIVER IN PERSON|TRUCK|into beans across the pending, spe +39015|181|34|1|2|2162.36|0.07|0.06|R|F|1995-03-03|1995-01-25|1995-03-19|COLLECT COD|SHIP| ironic packages against the ironic, regu +39015|711|76|2|11|17728.81|0.10|0.01|R|F|1995-03-14|1995-01-11|1995-04-09|COLLECT COD|MAIL|romise slyly. blithely bo +39015|1673|74|3|16|25194.72|0.08|0.08|R|F|1995-03-05|1995-02-14|1995-03-18|DELIVER IN PERSON|AIR|ep carefully beh +39015|1765|66|4|48|80004.48|0.10|0.04|A|F|1995-01-08|1995-01-22|1995-02-01|DELIVER IN PERSON|FOB|y stealthily even deposits. exp +39015|1039|75|5|22|20680.66|0.05|0.02|A|F|1995-02-18|1995-01-10|1995-03-11|NONE|MAIL|ins. carefully bold packages across th +39015|750|83|6|3|4952.25|0.00|0.00|R|F|1994-12-20|1995-01-11|1994-12-30|TAKE BACK RETURN|TRUCK|es use carefully among the carefully e +39040|1345|22|1|27|33651.18|0.01|0.07|R|F|1994-06-20|1994-07-05|1994-07-14|NONE|AIR|ven deposit +39040|711|44|2|22|35457.62|0.05|0.00|R|F|1994-09-18|1994-08-13|1994-10-01|COLLECT COD|MAIL|ld requests nag stealthily above the ac +39040|1472|90|3|8|10987.76|0.04|0.08|A|F|1994-07-17|1994-07-13|1994-08-01|COLLECT COD|FOB|wake fluffily among the furio +39040|360|89|4|47|59236.92|0.01|0.00|R|F|1994-06-06|1994-08-13|1994-06-07|COLLECT COD|RAIL|ronic accounts cajole fluff +39041|190|69|1|36|39246.84|0.01|0.02|N|O|1995-11-14|1995-12-02|1995-11-16|TAKE BACK RETURN|AIR|arefully express reques +39041|382|67|2|17|21800.46|0.10|0.08|N|O|1995-11-30|1995-12-02|1995-12-24|TAKE BACK RETURN|TRUCK|ts nag along the c +39041|1769|96|3|36|60147.36|0.01|0.06|N|O|1995-12-09|1995-12-02|1995-12-12|TAKE BACK RETURN|RAIL|kages x-ray. furio +39041|1990|23|4|46|87031.54|0.04|0.08|N|O|1995-11-30|1995-12-12|1995-12-30|DELIVER IN PERSON|RAIL|ackages above the asymptotes c +39041|819|53|5|31|53314.11|0.09|0.01|N|O|1996-02-21|1995-12-25|1996-03-18|TAKE BACK RETURN|SHIP|eposits. realms use foxes. car +39041|823|57|6|25|43095.50|0.01|0.01|N|O|1995-12-20|1995-12-24|1996-01-14|TAKE BACK RETURN|SHIP|slyly unusual requests +39042|1310|11|1|15|18169.65|0.00|0.05|A|F|1994-09-12|1994-10-09|1994-10-05|DELIVER IN PERSON|MAIL|ithely ironic tithes sleep alongsid +39042|816|17|2|34|58371.54|0.08|0.01|R|F|1994-12-14|1994-11-01|1995-01-13|DELIVER IN PERSON|SHIP|he quickly ironi +39043|603|97|1|15|22554.00|0.00|0.05|A|F|1994-04-07|1994-03-08|1994-04-27|COLLECT COD|AIR|nts sleep. silent ideas print f +39043|257|58|2|22|25459.50|0.03|0.00|A|F|1994-01-09|1994-01-22|1994-02-04|COLLECT COD|REG AIR|al accounts. regular, pending pin +39043|398|83|3|10|12983.90|0.09|0.08|R|F|1994-04-08|1994-02-06|1994-04-25|DELIVER IN PERSON|RAIL|instructions snooze blithely b +39043|1652|35|4|13|20197.45|0.08|0.08|R|F|1994-04-21|1994-03-02|1994-05-13|COLLECT COD|MAIL|y final dependencies along the plate +39044|829|29|1|40|69192.80|0.09|0.06|R|F|1993-08-28|1993-07-13|1993-09-25|TAKE BACK RETURN|REG AIR|ding depths. +39044|1050|86|2|25|23776.25|0.09|0.00|A|F|1993-05-06|1993-06-18|1993-05-17|COLLECT COD|SHIP|es cajole regular deposits. b +39045|1202|40|1|34|37508.80|0.00|0.06|A|F|1992-11-05|1992-10-17|1992-11-20|NONE|REG AIR|uickly final i +39045|33|84|2|26|24258.78|0.05|0.03|A|F|1992-10-22|1992-11-03|1992-11-09|DELIVER IN PERSON|MAIL|hely. carefully regul +39045|392|93|3|24|31017.36|0.06|0.07|A|F|1992-11-05|1992-11-19|1992-11-06|TAKE BACK RETURN|REG AIR| instructions cajole: quickly even th +39045|52|78|4|13|12376.65|0.07|0.04|A|F|1993-01-06|1992-11-28|1993-01-28|TAKE BACK RETURN|FOB|kly bold packages are slyly about the sly +39045|40|16|5|13|12220.52|0.01|0.03|R|F|1993-01-02|1992-12-07|1993-01-12|COLLECT COD|RAIL|s cajole along the ca +39045|1172|81|6|23|24682.91|0.03|0.06|A|F|1992-12-15|1992-11-20|1992-12-16|DELIVER IN PERSON|RAIL|al theodolites. quickly regu +39046|742|75|1|37|60781.38|0.05|0.02|N|O|1996-01-31|1995-12-24|1996-02-11|DELIVER IN PERSON|AIR|into beans +39046|130|31|2|41|42235.33|0.10|0.02|N|O|1995-12-19|1996-02-02|1996-01-09|TAKE BACK RETURN|REG AIR|iously ironic instructions. ironic, sl +39046|1045|46|3|30|28381.20|0.10|0.04|N|O|1995-11-24|1995-12-25|1995-11-30|TAKE BACK RETURN|RAIL|even ideas wake slyly furious +39047|393|22|1|49|63376.11|0.02|0.00|R|F|1993-04-17|1993-05-07|1993-05-09|NONE|TRUCK|ajole furiously about the quic +39072|1545|26|1|27|39056.58|0.06|0.08|A|F|1994-04-12|1994-05-05|1994-04-27|NONE|MAIL|express deposits? accounts are i +39073|367|68|1|27|34218.72|0.02|0.08|R|F|1994-04-28|1994-04-27|1994-05-03|NONE|REG AIR|daring foxes. carefully even pi +39073|1885|72|2|44|78622.72|0.10|0.07|R|F|1994-01-31|1994-03-01|1994-02-01|COLLECT COD|TRUCK|quickly fluf +39073|190|17|3|22|23984.18|0.08|0.05|A|F|1994-05-10|1994-04-02|1994-05-31|COLLECT COD|TRUCK| silent instructions. regular +39073|997|98|4|35|66429.65|0.00|0.05|A|F|1994-03-05|1994-03-26|1994-04-01|DELIVER IN PERSON|AIR|ully even requests accordi +39074|862|63|1|24|42308.64|0.00|0.06|N|O|1996-07-24|1996-06-06|1996-08-09|TAKE BACK RETURN|TRUCK|longside of the requests cajole slyly abou +39074|750|83|2|50|82537.50|0.09|0.00|N|O|1996-06-15|1996-06-24|1996-07-01|DELIVER IN PERSON|REG AIR|es cajole carefully blithely ironic fox +39074|557|48|3|34|49556.70|0.05|0.08|N|O|1996-06-30|1996-07-10|1996-07-24|DELIVER IN PERSON|MAIL|ct slyly silent +39074|1048|84|4|36|34165.44|0.01|0.04|N|O|1996-06-16|1996-05-15|1996-07-15|NONE|TRUCK|refully blithely express ideas. expr +39074|1202|77|5|16|17651.20|0.02|0.00|N|O|1996-05-29|1996-05-31|1996-06-22|DELIVER IN PERSON|FOB| sleep carefully ironic, fina +39074|838|72|6|9|15649.47|0.09|0.02|N|O|1996-06-14|1996-07-01|1996-07-02|NONE|TRUCK|ress, even realms. carefully final accoun +39075|458|46|1|36|48904.20|0.07|0.07|A|F|1992-05-12|1992-04-11|1992-05-31|TAKE BACK RETURN|REG AIR|use fluffily deposits. ironic, +39075|1950|83|2|9|16667.55|0.06|0.03|R|F|1992-02-28|1992-04-03|1992-03-13|NONE|AIR|as. express ide +39075|692|93|3|13|20704.97|0.09|0.03|A|F|1992-03-12|1992-05-18|1992-03-19|TAKE BACK RETURN|SHIP|olphins doze regular, specia +39075|1267|5|4|37|43225.62|0.00|0.02|R|F|1992-03-25|1992-05-20|1992-04-04|COLLECT COD|REG AIR|pending accounts detect fluffily +39075|434|22|5|30|40032.90|0.09|0.03|R|F|1992-05-29|1992-04-08|1992-06-07|NONE|TRUCK|sly even instructions cajole across the dog +39075|1146|19|6|9|9424.26|0.01|0.05|A|F|1992-03-04|1992-03-28|1992-03-31|NONE|RAIL|o the even attainments? regu +39076|369|26|1|14|17771.04|0.05|0.06|R|F|1995-01-09|1995-02-23|1995-02-03|DELIVER IN PERSON|REG AIR|e bold dependencies. regular, e +39076|1803|4|2|41|69896.80|0.04|0.02|A|F|1995-01-12|1995-01-24|1995-01-21|COLLECT COD|RAIL|ithely fin +39076|435|23|3|6|8012.58|0.04|0.07|A|F|1995-03-23|1995-03-09|1995-04-12|DELIVER IN PERSON|REG AIR|dle excuses integrate furiously bold reques +39076|1339|78|4|3|3720.99|0.00|0.06|A|F|1995-02-06|1995-01-19|1995-03-03|TAKE BACK RETURN|RAIL|leep. regular instructions integr +39076|1512|33|5|2|2827.02|0.10|0.03|R|F|1994-12-30|1995-02-04|1995-01-28|COLLECT COD|REG AIR|olphins. pending warthogs haggle c +39076|1344|59|6|38|47322.92|0.05|0.05|A|F|1995-02-11|1995-02-09|1995-02-15|COLLECT COD|TRUCK|ironic requests. +39076|1058|29|7|4|3836.20|0.05|0.08|R|F|1995-01-18|1995-02-14|1995-01-23|COLLECT COD|SHIP|bold dependencies haggle slyly re +39077|238|93|1|41|46667.43|0.00|0.04|N|O|1998-03-20|1998-03-18|1998-04-04|COLLECT COD|REG AIR|s, regular dependencies serve agains +39077|1733|60|2|47|76832.31|0.03|0.06|N|O|1998-03-16|1998-02-14|1998-03-21|NONE|MAIL| quickly along the +39077|110|89|3|17|17171.87|0.05|0.06|N|O|1998-03-20|1998-03-16|1998-04-10|TAKE BACK RETURN|MAIL|nal, express ideas slee +39077|1257|32|4|32|37064.00|0.03|0.08|N|O|1998-01-03|1998-02-13|1998-01-29|NONE|FOB| even packages nag carefully ironic fo +39077|462|63|5|24|32699.04|0.07|0.03|N|O|1998-03-12|1998-02-08|1998-03-18|NONE|RAIL|nag against the boldly ironic sentiments +39077|1172|81|6|20|21463.40|0.09|0.02|N|O|1998-03-15|1998-02-20|1998-03-26|COLLECT COD|REG AIR|ackages sleep carefully +39078|865|32|1|23|40614.78|0.05|0.07|R|F|1994-07-06|1994-08-11|1994-07-29|DELIVER IN PERSON|SHIP|packages. blithely final theodolites +39078|34|60|2|45|42031.35|0.02|0.06|A|F|1994-08-23|1994-09-10|1994-09-10|DELIVER IN PERSON|TRUCK|y. furiously bold reque +39078|1823|24|3|6|10348.92|0.08|0.06|R|F|1994-10-13|1994-07-30|1994-10-27|DELIVER IN PERSON|SHIP|unusual deposits a +39078|592|93|4|18|26866.62|0.04|0.08|R|F|1994-09-29|1994-08-05|1994-10-09|NONE|MAIL|s. furiously regular ideas doubt carefu +39078|162|89|5|4|4248.64|0.03|0.03|A|F|1994-08-10|1994-07-28|1994-08-26|COLLECT COD|RAIL|leep furiously alongside of the +39078|1931|32|6|9|16496.37|0.01|0.02|R|F|1994-09-05|1994-08-31|1994-10-02|COLLECT COD|FOB|ccounts. regular asymptotes are across +39078|1022|28|7|18|16614.36|0.09|0.08|R|F|1994-08-09|1994-08-09|1994-09-03|TAKE BACK RETURN|REG AIR| final foxes boost furiously expr +39079|1109|82|1|47|47474.70|0.10|0.02|N|O|1996-01-06|1995-10-13|1996-02-02|NONE|AIR|ang fluffily. reques +39079|186|39|2|42|45619.56|0.01|0.04|N|O|1995-11-30|1995-10-14|1995-12-21|COLLECT COD|TRUCK|ly. final, +39079|369|70|3|46|58390.56|0.04|0.02|N|O|1995-12-28|1995-11-24|1996-01-15|TAKE BACK RETURN|TRUCK|sleep. furiously regular sauternes acros +39079|548|39|4|23|33316.42|0.03|0.00|N|O|1995-12-13|1995-12-07|1996-01-03|COLLECT COD|REG AIR|lar, ironic instruction +39104|251|79|1|47|54108.75|0.05|0.06|N|O|1996-02-08|1996-04-09|1996-02-19|TAKE BACK RETURN|REG AIR|nstructions sleep slyly regular +39104|1558|59|2|38|55462.90|0.06|0.05|N|O|1996-04-20|1996-03-26|1996-05-12|TAKE BACK RETURN|AIR|usly bold accounts haggle q +39105|225|26|1|11|12377.42|0.10|0.00|N|O|1996-06-28|1996-08-04|1996-06-29|NONE|AIR|foxes haggle fluffily acro +39105|869|36|2|20|35397.20|0.07|0.08|N|O|1996-07-28|1996-07-17|1996-08-20|COLLECT COD|RAIL|al depende +39106|1452|31|1|36|48724.20|0.02|0.04|N|O|1997-04-07|1997-05-04|1997-04-23|TAKE BACK RETURN|RAIL|ays wake. packages a +39107|945|46|1|13|23997.22|0.07|0.00|N|O|1996-03-15|1996-01-20|1996-03-18|COLLECT COD|REG AIR|daring packages. silent +39107|413|43|2|40|52536.40|0.08|0.00|N|O|1995-12-24|1996-01-09|1996-01-05|COLLECT COD|REG AIR|l deposits mold above the fluffi +39107|459|47|3|22|29907.90|0.03|0.01|N|O|1995-12-28|1996-02-09|1995-12-30|TAKE BACK RETURN|RAIL|he silent requests. blithely iro +39107|1023|94|4|10|9240.20|0.10|0.03|N|O|1996-02-06|1996-01-29|1996-02-12|TAKE BACK RETURN|SHIP|ully over the carefu +39108|1202|3|1|16|17651.20|0.07|0.03|N|O|1997-08-28|1997-07-21|1997-08-30|NONE|TRUCK|uches nag carefully slyly unusual theodol +39108|334|35|2|17|20983.61|0.00|0.06|N|O|1997-08-02|1997-08-15|1997-08-03|NONE|FOB|yly? slyly e +39108|176|77|3|24|25828.08|0.06|0.02|N|O|1997-10-17|1997-08-14|1997-11-06|NONE|AIR| furiously special courts! regular depo +39108|1515|36|4|14|19831.14|0.04|0.08|N|O|1997-07-22|1997-09-14|1997-07-25|DELIVER IN PERSON|REG AIR|l asymptotes. qu +39108|874|8|5|7|12424.09|0.07|0.04|N|O|1997-07-05|1997-09-16|1997-07-10|NONE|TRUCK|ly pending requests sleep furiou +39108|898|65|6|20|35977.80|0.07|0.08|N|O|1997-10-13|1997-08-11|1997-10-22|COLLECT COD|MAIL|the forges +39108|474|4|7|6|8246.82|0.01|0.02|N|O|1997-09-29|1997-07-24|1997-10-18|NONE|FOB|. packages wake fluffily regul +39109|1424|42|1|49|64945.58|0.00|0.03|N|O|1998-10-17|1998-08-07|1998-11-07|DELIVER IN PERSON|REG AIR| thin instructions alongside of +39109|1310|25|2|40|48452.40|0.10|0.07|N|O|1998-08-06|1998-09-07|1998-08-22|TAKE BACK RETURN|TRUCK|uriously close theodolites haggle +39109|716|13|3|13|21017.23|0.10|0.06|N|O|1998-08-10|1998-08-17|1998-08-29|COLLECT COD|RAIL|thely pending packages +39110|1863|50|1|42|74124.12|0.09|0.03|R|F|1993-03-22|1993-04-28|1993-03-24|DELIVER IN PERSON|TRUCK|sleep above the pending p +39110|178|31|2|16|17250.72|0.00|0.00|A|F|1993-03-02|1993-03-12|1993-03-21|NONE|AIR|busily ironic requests. darin +39110|137|90|3|9|9334.17|0.02|0.04|R|F|1993-02-25|1993-04-08|1993-02-28|COLLECT COD|FOB|arefully bold accounts boost at the careful +39110|1487|5|4|15|20827.20|0.09|0.01|A|F|1993-05-03|1993-04-09|1993-05-06|TAKE BACK RETURN|AIR|fully before the carefull +39111|96|97|1|29|28886.61|0.00|0.06|N|O|1995-10-08|1995-10-23|1995-11-05|COLLECT COD|SHIP|s-- unusual requests impress blithel +39111|1247|22|2|8|9185.92|0.04|0.07|N|O|1995-09-14|1995-10-02|1995-10-11|DELIVER IN PERSON|AIR|old, ironic pinto +39111|1114|51|3|3|3045.33|0.04|0.03|N|O|1995-10-31|1995-09-18|1995-11-26|COLLECT COD|RAIL|print according +39111|284|85|4|7|8289.96|0.07|0.05|N|O|1995-10-05|1995-09-09|1995-10-23|DELIVER IN PERSON|RAIL| silent req +39111|1348|25|5|18|22488.12|0.09|0.08|N|O|1995-11-06|1995-09-02|1995-11-12|NONE|TRUCK|ests? even pa +39111|19|70|6|17|15623.17|0.04|0.08|N|O|1995-10-05|1995-09-11|1995-10-11|DELIVER IN PERSON|REG AIR|tes wake. packages hinder +39136|1955|100|1|17|31568.15|0.00|0.06|R|F|1994-09-08|1994-08-31|1994-09-28|DELIVER IN PERSON|REG AIR|ts about the +39136|1898|42|2|15|26998.35|0.00|0.00|A|F|1994-07-05|1994-09-11|1994-07-25|TAKE BACK RETURN|MAIL|ldly. careful +39136|1264|76|3|8|9322.08|0.02|0.06|A|F|1994-10-20|1994-08-16|1994-10-31|DELIVER IN PERSON|SHIP|ns. foxes at the carefully unusual p +39136|991|26|4|16|30271.84|0.04|0.00|A|F|1994-10-18|1994-09-18|1994-11-04|COLLECT COD|SHIP|inal excuses nag slyly regular accounts. qu +39137|1065|36|1|23|22219.38|0.07|0.07|N|O|1998-05-15|1998-05-31|1998-06-09|NONE|REG AIR|ent, final excuses. express pinto beans +39137|1079|85|2|10|9800.70|0.03|0.03|N|O|1998-04-07|1998-05-15|1998-05-05|COLLECT COD|SHIP|y special ideas at the blithely final ide +39137|1452|31|3|24|32482.80|0.00|0.03|N|O|1998-05-13|1998-05-27|1998-06-10|DELIVER IN PERSON|FOB|y final attainments-- fox +39137|1999|32|4|48|91247.52|0.04|0.07|N|O|1998-04-30|1998-06-26|1998-05-05|COLLECT COD|AIR|y. pending packages wake carefully expres +39137|535|66|5|49|70340.97|0.05|0.00|N|O|1998-07-01|1998-05-22|1998-07-16|COLLECT COD|TRUCK|uffily fluffily express theodolites. bold +39138|499|100|1|33|46183.17|0.08|0.01|N|O|1996-03-15|1996-02-16|1996-04-04|NONE|REG AIR|e epitaphs hinder furiously around the quic +39138|1420|60|2|32|42285.44|0.09|0.03|N|O|1996-01-04|1996-02-03|1996-01-18|NONE|RAIL|s. carefully even ideas breach furious +39138|605|6|3|20|30112.00|0.08|0.03|N|O|1996-04-02|1996-03-05|1996-04-12|TAKE BACK RETURN|RAIL|counts sleep blithely +39138|132|11|4|26|26835.38|0.04|0.01|N|O|1996-01-29|1996-02-10|1996-02-10|COLLECT COD|RAIL|quests integrate furiously a +39138|1854|84|5|39|68478.15|0.03|0.07|N|O|1996-03-26|1996-03-17|1996-04-23|NONE|RAIL|sual accounts after the slyly ironic reques +39139|442|72|1|27|36245.88|0.02|0.06|R|F|1993-12-12|1993-12-29|1994-01-05|COLLECT COD|SHIP|. theodolit +39139|1719|62|2|9|14586.39|0.01|0.01|R|F|1993-12-12|1993-12-26|1993-12-20|DELIVER IN PERSON|AIR|silent requests. regular instructi +39139|1008|44|3|37|33633.00|0.07|0.02|A|F|1993-11-17|1993-12-16|1993-11-25|NONE|MAIL|ckly regular package +39139|1043|14|4|36|33985.44|0.03|0.05|R|F|1993-12-03|1994-01-26|1993-12-30|TAKE BACK RETURN|TRUCK|blithely regular dependencies mold +39139|918|53|5|46|83669.86|0.00|0.08|R|F|1994-01-28|1994-01-25|1994-02-05|COLLECT COD|MAIL|inal theodolite +39139|274|29|6|20|23485.40|0.02|0.00|R|F|1994-01-28|1994-01-12|1994-02-25|NONE|REG AIR| even foxes. blithely final +39139|855|56|7|37|64966.45|0.02|0.08|R|F|1994-01-25|1994-01-28|1994-02-11|NONE|MAIL|usly bold req +39140|1936|37|1|30|55137.90|0.00|0.08|R|F|1993-12-04|1993-12-23|1993-12-20|NONE|TRUCK|ess requests cajole furiousl +39140|1915|16|2|18|32704.38|0.08|0.02|A|F|1994-01-07|1993-11-26|1994-01-12|DELIVER IN PERSON|RAIL|fily according to +39140|1062|68|3|50|48153.00|0.02|0.00|A|F|1993-12-27|1993-11-25|1994-01-16|TAKE BACK RETURN|AIR| carefully fluffy deposits. +39140|359|60|4|27|34002.45|0.04|0.08|A|F|1993-10-13|1993-11-28|1993-10-24|DELIVER IN PERSON|REG AIR|asymptotes after the furiously s +39140|264|19|5|5|5821.30|0.08|0.03|A|F|1994-01-16|1993-11-09|1994-01-29|TAKE BACK RETURN|FOB|haggle across the blithely final deposi +39140|1102|75|6|13|13040.30|0.06|0.07|A|F|1993-11-20|1993-11-28|1993-11-24|TAKE BACK RETURN|TRUCK| against the express instructions. req +39141|172|51|1|6|6433.02|0.00|0.05|R|F|1994-06-27|1994-07-18|1994-07-14|NONE|REG AIR|ake above the quickly specia +39141|574|35|2|41|60457.37|0.10|0.05|A|F|1994-05-06|1994-07-24|1994-05-09|DELIVER IN PERSON|RAIL| regular dolphins are bli +39141|1043|79|3|38|35873.52|0.09|0.02|R|F|1994-07-16|1994-07-24|1994-08-11|DELIVER IN PERSON|REG AIR|s. theodolites are +39141|663|64|4|5|7818.30|0.10|0.08|A|F|1994-08-11|1994-07-29|1994-08-13|TAKE BACK RETURN|REG AIR|? special packages kindl +39141|1210|48|5|49|54449.29|0.06|0.03|A|F|1994-07-01|1994-07-23|1994-07-09|DELIVER IN PERSON|RAIL|g the carefully pendi +39141|92|68|6|49|48612.41|0.03|0.08|A|F|1994-08-04|1994-07-03|1994-09-03|DELIVER IN PERSON|SHIP|ckly even deposits. even ide +39141|1362|1|7|36|45480.96|0.04|0.03|R|F|1994-06-15|1994-07-04|1994-07-08|TAKE BACK RETURN|AIR|e carefully. idly bold a +39142|1563|64|1|19|27826.64|0.05|0.03|R|F|1992-12-07|1992-12-21|1992-12-12|COLLECT COD|REG AIR|. special, unusual sentiments +39142|536|97|2|45|64643.85|0.09|0.08|A|F|1993-02-22|1993-01-16|1993-02-27|TAKE BACK RETURN|RAIL|es. slyly even accounts haggle +39142|1961|6|3|49|91285.04|0.07|0.07|A|F|1992-12-20|1993-01-28|1993-01-04|NONE|REG AIR| carefully final accounts alongside of the +39143|1618|19|1|4|6078.44|0.05|0.07|R|F|1992-07-25|1992-05-08|1992-08-16|NONE|MAIL|refully si +39143|1257|69|2|49|56754.25|0.07|0.07|R|F|1992-06-29|1992-06-25|1992-07-29|TAKE BACK RETURN|MAIL| nag excuses. blithely fluffy asymptotes +39143|1971|4|3|11|20602.67|0.09|0.06|R|F|1992-04-29|1992-05-09|1992-05-23|COLLECT COD|SHIP|y even packages sleep furiously acros +39168|1060|96|1|11|10571.66|0.07|0.00|A|F|1992-07-25|1992-07-02|1992-08-23|TAKE BACK RETURN|SHIP|ts. evenly express accounts nag. c +39168|1041|12|2|41|38623.64|0.04|0.05|A|F|1992-05-30|1992-08-04|1992-06-02|COLLECT COD|TRUCK|above the bli +39168|1611|12|3|38|57479.18|0.01|0.03|A|F|1992-06-23|1992-08-09|1992-07-16|TAKE BACK RETURN|FOB| boost slyly furiously even +39168|1033|39|4|3|2802.09|0.06|0.00|A|F|1992-08-17|1992-07-18|1992-08-26|TAKE BACK RETURN|RAIL|; pinto beans doze un +39168|1874|75|5|28|49724.36|0.09|0.05|A|F|1992-07-26|1992-08-03|1992-08-12|COLLECT COD|AIR|into beans cajole. even warthogs da +39168|802|36|6|35|59598.00|0.06|0.05|R|F|1992-08-12|1992-07-04|1992-09-08|TAKE BACK RETURN|SHIP|otes thrash even theodolites. n +39168|14|40|7|36|32904.36|0.00|0.01|A|F|1992-06-13|1992-07-08|1992-07-13|COLLECT COD|REG AIR| blithely br +39169|1107|44|1|10|10081.00|0.06|0.06|N|O|1995-09-16|1995-10-01|1995-10-03|DELIVER IN PERSON|AIR|fully. flu +39169|643|44|2|26|40134.64|0.03|0.02|N|O|1995-09-22|1995-10-07|1995-10-06|NONE|SHIP|ggedly enticing requests affix blithely-- +39169|144|23|3|23|24015.22|0.05|0.01|N|O|1995-09-18|1995-11-08|1995-10-17|DELIVER IN PERSON|SHIP|tes boost slyly +39169|458|46|4|45|61130.25|0.06|0.07|N|O|1995-10-15|1995-10-13|1995-10-26|COLLECT COD|MAIL|nic foxes; +39169|1999|88|5|1|1900.99|0.02|0.02|N|O|1995-10-11|1995-10-03|1995-10-15|TAKE BACK RETURN|RAIL|ts run fluffily. bold pinto beans +39169|350|79|6|14|17504.90|0.04|0.04|N|O|1995-11-12|1995-11-14|1995-12-12|DELIVER IN PERSON|TRUCK| blithely final at +39169|1017|88|7|47|43146.47|0.10|0.06|N|O|1995-10-10|1995-11-17|1995-10-21|TAKE BACK RETURN|REG AIR|ial accounts sleep +39170|998|1|1|49|93050.51|0.01|0.06|A|F|1994-08-11|1994-09-20|1994-09-05|TAKE BACK RETURN|TRUCK|posits wake blithely express deposits. +39170|141|68|2|24|24987.36|0.08|0.05|A|F|1994-11-09|1994-09-30|1994-12-06|COLLECT COD|TRUCK|osits are furiously afte +39171|1042|48|1|46|43379.84|0.06|0.05|N|O|1998-04-28|1998-03-15|1998-05-17|COLLECT COD|TRUCK|ronic, express depo +39171|204|86|2|17|18771.40|0.04|0.03|N|O|1998-01-02|1998-02-12|1998-01-30|COLLECT COD|MAIL|uctions-- bold, unusua +39171|490|91|3|31|43105.19|0.04|0.04|N|O|1998-01-07|1998-02-25|1998-01-18|NONE|SHIP|y foxes. slyly unusual pinto beans nag e +39171|564|25|4|28|41007.68|0.09|0.08|N|O|1998-03-31|1998-02-19|1998-04-05|DELIVER IN PERSON|TRUCK|deposits sleep furiou +39171|1171|44|5|9|9649.53|0.03|0.07|N|O|1997-12-30|1998-01-31|1998-01-06|TAKE BACK RETURN|MAIL|xpress packages. bol +39171|1079|50|6|14|13720.98|0.02|0.04|N|O|1998-04-27|1998-01-27|1998-05-12|NONE|TRUCK|quickly regular foxe +39171|356|41|7|31|38946.85|0.05|0.05|N|O|1998-03-28|1998-03-19|1998-03-31|NONE|FOB|furiously pending requests integra +39172|1459|77|1|5|6802.25|0.04|0.06|A|F|1993-08-12|1993-08-09|1993-09-03|NONE|FOB|ross the furiously final instruct +39172|508|9|2|42|59157.00|0.10|0.02|R|F|1993-10-14|1993-08-08|1993-10-21|COLLECT COD|MAIL|lyly ironic platelets i +39172|1286|98|3|10|11872.80|0.04|0.06|R|F|1993-07-08|1993-07-31|1993-07-15|DELIVER IN PERSON|AIR|e slyly. quickly +39172|319|20|4|47|57307.57|0.05|0.04|R|F|1993-09-05|1993-09-04|1993-09-23|DELIVER IN PERSON|SHIP|ithely. slyly s +39172|549|50|5|42|60880.68|0.05|0.04|R|F|1993-09-01|1993-08-14|1993-09-15|TAKE BACK RETURN|SHIP|pinto beans: blithely iro +39172|646|78|6|15|23199.60|0.05|0.07|A|F|1993-09-09|1993-07-31|1993-10-03|TAKE BACK RETURN|AIR|ording to the slyly final requests wak +39173|1525|66|1|29|41369.08|0.04|0.05|A|F|1994-03-15|1994-03-12|1994-03-30|TAKE BACK RETURN|REG AIR|kly regular +39173|531|22|2|30|42945.90|0.01|0.04|R|F|1994-03-19|1994-02-21|1994-04-17|NONE|FOB| carefully after +39173|923|26|3|43|78428.56|0.10|0.03|A|F|1994-05-05|1994-03-22|1994-05-13|NONE|RAIL|are blithely according to the quick +39173|1523|64|4|46|65527.92|0.09|0.01|A|F|1994-02-16|1994-02-21|1994-03-14|TAKE BACK RETURN|RAIL|nusual pinto beans. even foxes sleep busily +39174|1487|66|1|5|6942.40|0.00|0.05|N|O|1997-10-11|1997-07-20|1997-10-30|TAKE BACK RETURN|AIR|olphins. slyly iron +39174|1563|4|2|44|64440.64|0.05|0.03|N|O|1997-07-30|1997-08-19|1997-08-24|NONE|TRUCK| haggle blithely bold pint +39174|284|66|3|35|41449.80|0.04|0.06|N|O|1997-08-18|1997-07-16|1997-09-14|TAKE BACK RETURN|SHIP|ss the slyly r +39174|916|85|4|50|90845.50|0.04|0.07|N|O|1997-10-12|1997-08-20|1997-10-26|TAKE BACK RETURN|SHIP| outside the slyly +39174|683|77|5|38|60179.84|0.03|0.05|N|O|1997-09-27|1997-08-07|1997-10-20|DELIVER IN PERSON|RAIL|gular instructions boost slyly quickly even +39175|1673|97|1|48|75584.16|0.08|0.08|N|O|1995-10-24|1995-09-23|1995-11-10|COLLECT COD|FOB|ar gifts impress slyly slyly final ideas. +39175|1281|82|2|31|36650.68|0.00|0.00|N|O|1995-10-17|1995-09-08|1995-10-31|COLLECT COD|SHIP|posits across the unusual instructions wa +39175|1636|78|3|3|4612.89|0.04|0.00|N|O|1995-11-07|1995-09-02|1995-11-23|TAKE BACK RETURN|TRUCK|ges. furiously even courts +39175|331|32|4|24|29551.92|0.10|0.05|N|O|1995-08-30|1995-09-22|1995-09-05|COLLECT COD|REG AIR|enticing ideas +39175|1144|81|5|4|4180.56|0.02|0.08|N|O|1995-09-08|1995-09-20|1995-09-09|COLLECT COD|REG AIR|ependencies. pending accounts +39175|534|35|6|47|67422.91|0.09|0.07|N|O|1995-09-08|1995-09-23|1995-09-18|DELIVER IN PERSON|MAIL|lithely regular +39175|1754|81|7|21|34770.75|0.10|0.07|N|O|1995-11-25|1995-09-29|1995-12-23|COLLECT COD|REG AIR| finally final accounts boost a +39200|167|94|1|16|17074.56|0.03|0.03|N|O|1996-06-07|1996-06-21|1996-07-03|TAKE BACK RETURN|RAIL|ular foxes mold br +39200|1042|43|2|14|13202.56|0.10|0.05|N|O|1996-07-24|1996-08-07|1996-08-18|COLLECT COD|TRUCK|oost. even deposits sleep carefully sen +39200|880|47|3|4|7123.52|0.02|0.04|N|O|1996-06-26|1996-08-10|1996-07-21|DELIVER IN PERSON|MAIL|e requests throughout the slyly ironic req +39200|671|34|4|45|70725.15|0.00|0.02|N|O|1996-07-15|1996-06-30|1996-07-23|DELIVER IN PERSON|REG AIR|furiously b +39200|419|49|5|25|32985.25|0.04|0.05|N|O|1996-07-29|1996-07-16|1996-08-17|COLLECT COD|REG AIR| to are above the regular, regular pinto +39201|619|82|1|50|75980.50|0.02|0.01|N|O|1996-03-29|1996-02-15|1996-04-07|TAKE BACK RETURN|AIR|special, final r +39201|585|86|2|21|31197.18|0.08|0.03|N|O|1996-01-14|1996-03-26|1996-01-26|TAKE BACK RETURN|TRUCK|are slyly +39201|1208|46|3|4|4436.80|0.04|0.03|N|O|1996-03-22|1996-03-04|1996-04-21|NONE|RAIL|lar deposits cajole f +39201|1288|63|4|22|26164.16|0.04|0.04|N|O|1996-03-01|1996-02-10|1996-03-26|DELIVER IN PERSON|FOB|final deposits. furiously pending accounts +39201|1132|41|5|41|42358.33|0.03|0.02|N|O|1996-03-04|1996-03-31|1996-03-15|TAKE BACK RETURN|AIR|equests wake blithely. express d +39201|964|65|6|15|27974.40|0.05|0.05|N|O|1996-03-22|1996-03-07|1996-04-10|DELIVER IN PERSON|TRUCK|ar excuses. instructions c +39201|1415|55|7|26|34226.66|0.00|0.00|N|O|1996-04-06|1996-03-09|1996-04-18|TAKE BACK RETURN|FOB|he blithely ironic instru +39202|1629|71|1|19|29081.78|0.03|0.02|N|O|1997-03-23|1997-03-01|1997-04-20|COLLECT COD|RAIL|he regular pac +39202|901|4|2|22|39641.80|0.06|0.01|N|O|1997-01-15|1997-03-05|1997-02-01|NONE|AIR|egular, regular accounts +39203|297|52|1|42|50286.18|0.01|0.05|R|F|1992-04-22|1992-05-18|1992-05-13|COLLECT COD|MAIL|ys. silent theodolites nag carefully. +39204|616|10|1|46|69764.06|0.08|0.06|R|F|1994-09-04|1994-08-30|1994-09-19|NONE|FOB|equests believe s +39204|811|11|2|41|70184.21|0.01|0.02|R|F|1994-10-18|1994-10-08|1994-10-25|NONE|TRUCK| thin warhorses mu +39204|1785|28|3|26|43856.28|0.08|0.08|R|F|1994-09-18|1994-09-09|1994-10-18|TAKE BACK RETURN|AIR|y final packages. blithely fina +39204|1515|96|4|33|46744.83|0.02|0.05|R|F|1994-10-14|1994-10-12|1994-11-11|TAKE BACK RETURN|FOB|lets are slyly. final asymptotes are quick +39204|1154|27|5|21|22158.15|0.07|0.04|A|F|1994-09-16|1994-10-27|1994-09-25|NONE|AIR|its poach ov +39205|1163|64|1|36|38309.76|0.04|0.03|N|O|1995-09-05|1995-08-16|1995-09-12|TAKE BACK RETURN|TRUCK| accounts. blithe deposits across th +39206|127|80|1|19|19515.28|0.10|0.05|R|F|1995-05-29|1995-06-27|1995-06-11|TAKE BACK RETURN|REG AIR| the unusual accounts. quickl +39207|958|27|1|33|61345.35|0.10|0.00|R|F|1994-12-29|1994-10-20|1995-01-27|NONE|TRUCK|ld excuses wake slyly above the acco +39207|497|56|2|9|12577.41|0.03|0.06|R|F|1994-11-06|1994-11-04|1994-12-06|NONE|FOB|l packages after the slyly even pinto bea +39207|1211|86|3|17|18907.57|0.04|0.01|A|F|1994-11-04|1994-11-28|1994-12-04|TAKE BACK RETURN|SHIP|l deposits. ev +39207|965|66|4|42|78370.32|0.01|0.04|R|F|1994-10-07|1994-10-08|1994-10-20|DELIVER IN PERSON|FOB| carefully final packages. blithely id +39207|1119|92|5|2|2040.22|0.03|0.07|R|F|1994-12-24|1994-10-26|1995-01-13|NONE|FOB|platelets across th +39232|13|39|1|29|26477.29|0.00|0.00|N|O|1995-10-14|1995-09-14|1995-11-03|TAKE BACK RETURN|AIR|into beans. accounts bo +39232|184|63|2|16|17346.88|0.04|0.07|N|O|1995-09-22|1995-09-22|1995-10-11|COLLECT COD|TRUCK|regular, unusual pinto b +39232|417|47|3|8|10539.28|0.02|0.07|N|O|1995-07-17|1995-09-03|1995-07-25|NONE|SHIP|ag idly. carefully regular brai +39232|73|24|4|28|27245.96|0.07|0.00|N|O|1995-07-29|1995-09-03|1995-08-02|TAKE BACK RETURN|AIR|special theodo +39232|428|29|5|23|30553.66|0.02|0.00|N|O|1995-10-08|1995-08-24|1995-10-15|COLLECT COD|REG AIR|. quickly express pack +39232|1297|9|6|41|49129.89|0.10|0.07|N|O|1995-09-12|1995-08-14|1995-09-16|NONE|SHIP|cial instructions. special, +39233|1400|1|1|33|42946.20|0.01|0.07|N|O|1996-10-20|1996-11-09|1996-10-23|NONE|TRUCK|requests cajole carefully througho +39233|1405|6|2|18|23515.20|0.10|0.00|N|O|1996-10-17|1996-10-09|1996-11-02|DELIVER IN PERSON|MAIL|ly special +39233|447|35|3|42|56592.48|0.04|0.08|N|O|1996-10-06|1996-10-13|1996-10-08|NONE|AIR|oss the carefully regular theodolites. f +39233|1530|71|4|35|50103.55|0.01|0.00|N|O|1996-11-15|1996-11-02|1996-11-17|COLLECT COD|TRUCK|osits affix blithely. blithe +39233|40|16|5|26|24441.04|0.08|0.04|N|O|1996-10-12|1996-10-07|1996-10-27|TAKE BACK RETURN|AIR|riously iro +39234|1406|46|1|47|61447.80|0.10|0.06|N|O|1997-04-29|1997-04-16|1997-05-15|TAKE BACK RETURN|RAIL|y. carefully regular warhorses acros +39234|1820|50|2|49|84369.18|0.07|0.06|N|O|1997-03-22|1997-05-13|1997-04-14|TAKE BACK RETURN|FOB|lly slyly regular deposits. carefully qui +39234|1103|4|3|32|32131.20|0.01|0.01|N|O|1997-03-24|1997-04-24|1997-04-12|COLLECT COD|AIR|its. fluffi +39234|1485|3|4|28|38821.44|0.06|0.07|N|O|1997-06-21|1997-04-10|1997-07-06|TAKE BACK RETURN|REG AIR|eep alongside of the packages. iro +39234|1817|61|5|17|29219.77|0.08|0.00|N|O|1997-04-29|1997-05-26|1997-05-13|TAKE BACK RETURN|AIR|bove the requ +39234|1066|2|6|19|18374.14|0.05|0.04|N|O|1997-03-11|1997-04-08|1997-03-14|NONE|TRUCK| deposits wake blithely +39235|807|8|1|16|27324.80|0.10|0.00|R|F|1993-10-16|1993-08-24|1993-10-20|NONE|MAIL|s dazzle quickly af +39235|204|59|2|7|7729.40|0.00|0.07|A|F|1993-08-07|1993-09-23|1993-09-03|NONE|AIR|sleep fluffily. final pearls +39235|546|7|3|32|46289.28|0.02|0.05|R|F|1993-08-13|1993-10-03|1993-08-24|TAKE BACK RETURN|MAIL|ag slyly un +39236|1648|90|1|5|7748.20|0.04|0.08|R|F|1993-12-22|1993-10-19|1993-12-29|TAKE BACK RETURN|TRUCK|olites nag carefully abov +39236|381|10|2|7|8969.66|0.05|0.05|R|F|1993-12-20|1993-10-26|1994-01-17|NONE|RAIL|lar ideas alongside of the i +39236|1732|75|3|43|70250.39|0.10|0.04|A|F|1993-10-17|1993-10-29|1993-10-19|COLLECT COD|TRUCK| accounts. bli +39237|1400|15|1|49|63768.60|0.07|0.08|N|O|1997-09-15|1997-09-30|1997-10-12|DELIVER IN PERSON|MAIL|ly furiously regular theo +39237|382|83|2|30|38471.40|0.06|0.00|N|O|1997-11-13|1997-09-23|1997-12-03|COLLECT COD|FOB|efully special platelets slee +39237|1453|32|3|22|29797.90|0.00|0.02|N|O|1997-11-30|1997-09-15|1997-12-29|DELIVER IN PERSON|RAIL| slyly against the regular packag +39237|1645|28|4|47|72692.08|0.05|0.01|N|O|1997-09-14|1997-10-18|1997-09-29|DELIVER IN PERSON|SHIP|es are around +39237|54|5|5|47|44840.35|0.09|0.04|N|O|1997-12-01|1997-10-16|1997-12-24|COLLECT COD|TRUCK|ns cajole according to the depths +39238|937|38|1|11|20217.23|0.09|0.07|R|F|1993-12-27|1993-12-24|1994-01-09|COLLECT COD|TRUCK|ial deposits wake blithely at the furiously +39238|334|35|2|46|56779.18|0.03|0.02|R|F|1993-10-14|1993-10-30|1993-11-11|TAKE BACK RETURN|SHIP|ar ideas slee +39238|1110|11|3|42|42466.62|0.03|0.01|A|F|1993-11-02|1993-11-07|1993-11-11|TAKE BACK RETURN|FOB|s. carefully even foxes wake carefu +39238|696|28|4|25|39917.25|0.01|0.02|A|F|1993-11-14|1993-11-22|1993-11-15|TAKE BACK RETURN|TRUCK|use slyly. e +39238|1967|68|5|12|22427.52|0.08|0.02|A|F|1994-01-12|1993-12-17|1994-01-25|TAKE BACK RETURN|SHIP|r packages boost fluffily special id +39238|780|45|6|21|35296.38|0.09|0.00|A|F|1994-01-21|1993-11-17|1994-01-26|TAKE BACK RETURN|REG AIR|ely regular accoun +39239|203|85|1|18|19857.60|0.03|0.06|N|O|1998-03-02|1998-02-12|1998-03-09|TAKE BACK RETURN|SHIP|are among the quickly express deposits. +39239|349|6|2|45|56220.30|0.06|0.03|N|O|1997-11-29|1998-02-08|1997-12-20|TAKE BACK RETURN|MAIL|ly packages. carefu +39239|513|74|3|14|19789.14|0.03|0.05|N|O|1998-02-08|1998-01-08|1998-02-09|NONE|RAIL|sly slyly express ideas. unusual request +39239|982|83|4|8|15063.84|0.05|0.05|N|O|1997-12-05|1998-02-04|1997-12-19|COLLECT COD|SHIP|he slowly regular theodolites. furious +39239|1660|43|5|34|53096.44|0.08|0.00|N|O|1998-02-23|1998-01-22|1998-03-15|NONE|AIR|e blithely ir +39264|155|56|1|25|26378.75|0.10|0.01|N|O|1997-07-08|1997-07-02|1997-07-21|DELIVER IN PERSON|REG AIR|g to the never unusual +39264|775|72|2|26|43570.02|0.05|0.06|N|O|1997-05-06|1997-05-16|1997-05-08|NONE|MAIL|riously. packages +39264|1795|38|3|42|71265.18|0.03|0.01|N|O|1997-05-15|1997-05-29|1997-05-21|COLLECT COD|MAIL|ronically final pa +39264|1172|73|4|18|19317.06|0.09|0.04|N|O|1997-07-26|1997-06-24|1997-08-16|DELIVER IN PERSON|AIR| furiously. blithely special deposits poach +39264|1345|60|5|22|27419.48|0.10|0.02|N|O|1997-05-18|1997-05-15|1997-05-25|COLLECT COD|REG AIR|. never regular hockey playe +39265|600|31|1|48|72028.80|0.04|0.04|R|F|1993-08-09|1993-07-11|1993-08-18|NONE|SHIP|iously enticing accoun +39265|1736|63|2|21|34392.33|0.03|0.03|R|F|1993-06-15|1993-07-18|1993-06-18|TAKE BACK RETURN|REG AIR|ly above the carefull +39265|600|1|3|34|51020.40|0.02|0.07|R|F|1993-05-17|1993-07-13|1993-06-08|COLLECT COD|SHIP|ole against the carefully ironic platelet +39265|207|35|4|38|42073.60|0.09|0.00|R|F|1993-08-06|1993-07-21|1993-08-26|COLLECT COD|SHIP|symptotes are bold, iron +39265|1219|31|5|35|39207.35|0.08|0.06|A|F|1993-08-10|1993-06-29|1993-08-18|DELIVER IN PERSON|AIR|lar packages. final pinto b +39265|1321|36|6|17|20779.44|0.01|0.04|A|F|1993-07-08|1993-06-09|1993-07-20|NONE|FOB|lar foxes. silent +39265|1050|86|7|7|6657.35|0.07|0.06|R|F|1993-07-07|1993-07-08|1993-07-23|NONE|TRUCK|uses. carefully regul +39266|1166|3|1|13|13873.08|0.06|0.05|A|F|1992-09-26|1992-10-24|1992-09-29|NONE|AIR|. carefully pending dependencies ar +39266|911|80|2|25|45297.75|0.00|0.03|A|F|1992-08-29|1992-11-11|1992-09-20|TAKE BACK RETURN|AIR|quests. requests sleep slyly deposits. +39266|88|89|3|14|13833.12|0.06|0.04|A|F|1992-09-01|1992-10-16|1992-09-05|COLLECT COD|RAIL|ly express foxes sleep carefully. always u +39266|146|25|4|1|1046.14|0.10|0.08|R|F|1992-09-08|1992-10-20|1992-10-07|TAKE BACK RETURN|RAIL| wake quickly acro +39267|955|58|1|30|55678.50|0.07|0.05|R|F|1993-04-19|1993-03-25|1993-05-04|COLLECT COD|SHIP|al packages cajole fur +39267|1390|29|2|10|12913.90|0.10|0.06|A|F|1993-04-19|1993-03-25|1993-05-03|TAKE BACK RETURN|REG AIR|wake above the carefully even +39267|1460|100|3|22|29952.12|0.03|0.06|R|F|1993-05-13|1993-04-03|1993-05-29|NONE|REG AIR|ly even requests. car +39267|1359|60|4|9|11343.15|0.00|0.00|A|F|1993-01-24|1993-03-09|1993-02-12|NONE|TRUCK|ar, regular pinto beans. carefully careful +39267|42|18|5|3|2826.12|0.08|0.08|A|F|1993-02-03|1993-02-23|1993-02-13|TAKE BACK RETURN|AIR|onic instructio +39268|1518|99|1|13|18453.63|0.03|0.06|A|F|1995-05-14|1995-07-06|1995-05-22|NONE|MAIL|ironic excuses aff +39268|395|96|2|5|6476.95|0.04|0.05|N|O|1995-07-11|1995-06-15|1995-07-28|NONE|AIR|t the carefully final foxes. ideas alo +39268|1634|76|3|19|29176.97|0.03|0.03|N|O|1995-07-09|1995-06-29|1995-07-30|DELIVER IN PERSON|REG AIR| special asymptotes +39268|1389|66|4|46|59357.48|0.02|0.06|R|F|1995-05-17|1995-07-19|1995-06-07|NONE|MAIL| deposits. careful ex +39268|1570|11|5|15|22073.55|0.01|0.07|A|F|1995-05-18|1995-06-26|1995-05-21|DELIVER IN PERSON|MAIL|l the quickl +39268|1436|15|6|32|42797.76|0.05|0.06|R|F|1995-05-28|1995-07-07|1995-05-31|DELIVER IN PERSON|RAIL|y final courts ca +39268|1021|92|7|33|30426.66|0.09|0.00|N|O|1995-07-30|1995-07-18|1995-08-19|DELIVER IN PERSON|MAIL|sits haggle quickly s +39269|263|45|1|31|36061.06|0.00|0.06|R|F|1992-12-26|1992-12-28|1993-01-21|NONE|FOB|ully requests. grouc +39269|802|3|2|13|22136.40|0.09|0.01|R|F|1992-11-11|1992-12-02|1992-12-01|DELIVER IN PERSON|AIR|. carefully ironic theodolites sleep s +39269|1670|71|3|9|14145.03|0.09|0.05|A|F|1992-12-29|1992-12-24|1993-01-01|DELIVER IN PERSON|REG AIR|the permanently final depths. dugouts +39269|37|13|4|38|35607.14|0.01|0.08|A|F|1993-02-17|1992-12-31|1993-02-24|NONE|SHIP| fluffily above the accounts. idly pend +39269|1714|15|5|44|71091.24|0.08|0.04|A|F|1992-11-09|1992-12-23|1992-11-30|COLLECT COD|REG AIR|haggle. furiously bold pinto beans ha +39270|535|96|1|23|33017.19|0.00|0.00|R|F|1995-03-20|1995-04-18|1995-03-23|COLLECT COD|RAIL|ckages haggle. final dino +39271|588|79|1|49|72940.42|0.01|0.03|N|O|1998-05-15|1998-06-28|1998-06-10|NONE|RAIL|uests. express, ironic pinto beans +39296|1057|63|1|15|14370.75|0.03|0.02|N|O|1997-11-22|1997-11-23|1997-12-15|DELIVER IN PERSON|MAIL|uriously silent platelets +39296|992|27|2|44|83291.56|0.00|0.06|N|O|1997-09-21|1997-10-02|1997-10-14|NONE|AIR|furiously express instructions. b +39296|1722|23|3|4|6494.88|0.02|0.01|N|O|1997-12-07|1997-10-11|1997-12-29|COLLECT COD|RAIL|ests. slyly pending +39296|610|4|4|30|45318.30|0.01|0.08|N|O|1997-11-18|1997-11-09|1997-12-13|COLLECT COD|SHIP|s. furiousl +39296|1360|75|5|27|34056.72|0.02|0.05|N|O|1997-09-29|1997-10-17|1997-10-19|TAKE BACK RETURN|AIR|ctions. furiously unusual requ +39296|918|19|6|2|3637.82|0.07|0.08|N|O|1997-10-22|1997-10-07|1997-11-14|COLLECT COD|AIR| the packages. stealthy +39297|684|85|1|6|9508.08|0.01|0.08|R|F|1994-03-26|1994-05-14|1994-04-11|TAKE BACK RETURN|MAIL|y special excu +39297|121|22|2|12|12253.44|0.00|0.05|A|F|1994-04-01|1994-05-16|1994-04-21|TAKE BACK RETURN|AIR|es. ironic, bold accounts wake +39297|1341|80|3|17|21119.78|0.01|0.08|R|F|1994-06-20|1994-05-16|1994-07-13|TAKE BACK RETURN|RAIL|e blithely permanent gift +39298|1402|20|1|12|15640.80|0.01|0.00|N|O|1997-01-02|1996-11-12|1997-01-12|NONE|AIR|y pending pack +39298|1521|22|2|7|9957.64|0.05|0.07|N|O|1996-12-29|1996-12-27|1997-01-21|DELIVER IN PERSON|REG AIR|es are; fi +39299|875|76|1|36|63931.32|0.04|0.06|N|O|1998-03-14|1998-02-11|1998-03-31|NONE|REG AIR|, brave requests after +39299|1887|88|2|14|25044.32|0.08|0.05|N|O|1998-01-09|1998-03-01|1998-01-14|DELIVER IN PERSON|REG AIR|ly even pinto beans wa +39299|518|49|3|40|56740.40|0.03|0.04|N|O|1998-03-22|1998-03-31|1998-04-17|COLLECT COD|TRUCK|uctions. bold courts afte +39299|1878|22|4|19|33817.53|0.07|0.05|N|O|1998-05-01|1998-02-02|1998-05-22|COLLECT COD|TRUCK|s. final ideas a +39299|1395|72|5|38|49262.82|0.09|0.07|N|O|1998-04-28|1998-03-12|1998-05-03|NONE|RAIL|e ironic packages. blithely unusual depo +39299|1427|67|6|32|42509.44|0.08|0.05|N|O|1998-02-28|1998-03-05|1998-03-11|TAKE BACK RETURN|FOB|lithely carefully +39300|1157|66|1|32|33860.80|0.10|0.03|R|F|1992-05-08|1992-06-21|1992-06-03|DELIVER IN PERSON|MAIL|s packages. slyl +39300|1176|85|2|18|19389.06|0.04|0.06|R|F|1992-06-24|1992-06-04|1992-07-07|NONE|FOB|r requests detect at the bold, unusua +39300|834|1|3|13|22552.79|0.07|0.07|R|F|1992-08-09|1992-07-16|1992-08-26|COLLECT COD|RAIL|ts. ironic braids detect a +39300|335|36|4|19|23471.27|0.03|0.02|R|F|1992-05-27|1992-06-20|1992-06-04|NONE|REG AIR|ly; furiously even e +39300|1258|70|5|10|11592.50|0.06|0.00|R|F|1992-07-19|1992-05-28|1992-08-07|COLLECT COD|FOB|tions. slyly express requests was blith +39300|1109|82|6|24|24242.40|0.10|0.04|R|F|1992-05-19|1992-07-09|1992-06-02|NONE|REG AIR|pliers along the carefully un +39300|1600|1|7|9|13514.40|0.07|0.07|R|F|1992-05-01|1992-06-12|1992-05-27|DELIVER IN PERSON|MAIL| bold foxes a +39301|1929|74|1|38|69574.96|0.07|0.08|A|F|1994-05-19|1994-04-25|1994-05-21|DELIVER IN PERSON|RAIL|g blithely-- furiousl +39301|300|28|2|4|4801.20|0.09|0.05|A|F|1994-06-09|1994-06-03|1994-06-25|DELIVER IN PERSON|RAIL|sits wake fluffily final accounts. ca +39301|1984|29|3|34|64123.32|0.07|0.08|R|F|1994-03-29|1994-06-12|1994-04-04|NONE|TRUCK|arefully express ins +39301|1934|79|4|17|31210.81|0.03|0.00|R|F|1994-03-28|1994-05-28|1994-04-15|NONE|SHIP|even deposits. regular courts wake +39301|423|24|5|3|3970.26|0.07|0.06|A|F|1994-04-21|1994-05-15|1994-04-28|DELIVER IN PERSON|MAIL|oost alongside of the pending packag +39301|318|3|6|43|52387.33|0.09|0.07|A|F|1994-04-07|1994-06-09|1994-04-20|TAKE BACK RETURN|FOB|eodolites play quick +39301|1218|19|7|43|48126.03|0.08|0.05|R|F|1994-07-07|1994-05-02|1994-07-25|COLLECT COD|SHIP|jole carefully quickly final p +39302|1038|74|1|36|33805.08|0.03|0.05|A|F|1992-06-10|1992-06-25|1992-07-06|COLLECT COD|MAIL|lly. slyly regular deposits haggle ac +39303|1193|30|1|48|52521.12|0.03|0.05|N|O|1998-09-23|1998-08-18|1998-10-23|DELIVER IN PERSON|MAIL|he bold deposits. express, ironic instructi +39303|1646|47|2|26|40238.64|0.10|0.08|N|O|1998-08-14|1998-07-30|1998-09-07|DELIVER IN PERSON|AIR|quickly regular accounts-- blithely exp +39303|1251|63|3|32|36872.00|0.00|0.02|N|O|1998-08-29|1998-08-09|1998-09-28|NONE|AIR|ogged requests. furiously +39328|1516|97|1|49|69457.99|0.07|0.04|N|O|1997-05-26|1997-06-20|1997-06-24|DELIVER IN PERSON|TRUCK| instructions? car +39328|277|78|2|6|7063.62|0.07|0.03|N|O|1997-05-21|1997-07-12|1997-05-27|COLLECT COD|TRUCK|ep. asymptotes nag +39328|710|7|3|45|72481.95|0.09|0.03|N|O|1997-06-06|1997-06-22|1997-06-21|COLLECT COD|SHIP|ajole furiously. regular ideas after the s +39329|1878|22|1|41|72974.67|0.00|0.00|N|O|1996-03-19|1996-03-05|1996-04-07|DELIVER IN PERSON|RAIL|the pending pinto beans use s +39329|78|29|2|46|44991.22|0.09|0.06|N|O|1996-04-07|1996-04-03|1996-05-07|COLLECT COD|AIR|c dolphins-- platelets across the quickly +39329|1691|74|3|29|46188.01|0.04|0.05|N|O|1996-03-05|1996-03-29|1996-03-12|DELIVER IN PERSON|FOB| ironic decoys sleep thinly fluffily pe +39329|1407|8|4|30|39252.00|0.02|0.06|N|O|1996-02-20|1996-03-03|1996-03-12|NONE|FOB|ously final accounts. regular +39329|174|1|5|33|35447.61|0.02|0.04|N|O|1996-03-12|1996-03-17|1996-04-07|DELIVER IN PERSON|TRUCK|tect slyly. furiously even f +39329|1780|23|6|43|72316.54|0.02|0.04|N|O|1996-03-13|1996-03-06|1996-03-28|NONE|FOB|sits hinder along the bold re +39329|1922|55|7|15|27358.80|0.10|0.07|N|O|1996-04-25|1996-03-21|1996-04-27|COLLECT COD|REG AIR|sometimes regular requ +39330|1719|62|1|13|21069.23|0.01|0.07|R|F|1993-08-19|1993-10-15|1993-09-12|COLLECT COD|FOB| carefully final courts serve qui +39330|813|80|2|21|35990.01|0.01|0.06|A|F|1993-11-11|1993-10-11|1993-12-06|TAKE BACK RETURN|REG AIR|y. ironic, express accounts +39330|738|71|3|12|19664.76|0.02|0.02|A|F|1993-10-31|1993-09-18|1993-11-15|COLLECT COD|TRUCK|dolphins wake f +39330|1708|9|4|25|40242.50|0.01|0.01|A|F|1993-08-23|1993-09-09|1993-09-08|NONE|SHIP|, final excuses across +39330|705|6|5|24|38536.80|0.00|0.04|R|F|1993-11-12|1993-08-21|1993-11-16|NONE|REG AIR|refully outside the regul +39331|1837|38|1|1|1738.83|0.02|0.08|N|O|1995-12-18|1995-10-30|1996-01-12|COLLECT COD|MAIL|re carefully. fluffily ironic +39331|346|3|2|1|1246.34|0.00|0.07|N|O|1995-10-29|1995-10-17|1995-11-10|NONE|FOB|y regular courts haggle +39332|332|33|1|7|8626.31|0.01|0.02|N|O|1995-11-18|1995-12-03|1995-12-03|TAKE BACK RETURN|TRUCK|he carefully express notornis. even +39332|1147|48|2|28|29347.92|0.06|0.07|N|O|1995-10-23|1995-12-31|1995-10-28|DELIVER IN PERSON|TRUCK|silent packages. final excuses +39332|994|29|3|11|20844.89|0.00|0.06|N|O|1996-02-06|1995-11-14|1996-02-22|DELIVER IN PERSON|FOB|hely regular packages +39332|268|96|4|24|28038.24|0.04|0.02|N|O|1996-01-07|1995-12-30|1996-01-14|COLLECT COD|RAIL| along the blithely iro +39332|1510|91|5|1|1411.51|0.02|0.07|N|O|1995-12-13|1995-11-21|1996-01-02|COLLECT COD|FOB|rs cajole furiously b +39333|850|17|1|39|68283.15|0.08|0.07|A|F|1993-03-31|1993-05-12|1993-04-03|TAKE BACK RETURN|TRUCK|hin theodol +39333|195|74|2|28|30665.32|0.09|0.02|R|F|1993-05-08|1993-04-04|1993-06-01|DELIVER IN PERSON|RAIL|ular requests nag furiously. +39333|1319|34|3|41|50032.71|0.10|0.03|R|F|1993-06-07|1993-04-23|1993-07-07|DELIVER IN PERSON|TRUCK|ely ironic packages haggle +39333|540|1|4|32|46097.28|0.00|0.01|A|F|1993-03-15|1993-05-04|1993-03-17|DELIVER IN PERSON|MAIL|edly final escapades caj +39333|750|51|5|43|70982.25|0.07|0.01|A|F|1993-05-01|1993-04-01|1993-05-15|DELIVER IN PERSON|MAIL|c, unusual accounts use slyly. careful +39333|1988|77|6|24|45359.52|0.10|0.08|R|F|1993-04-29|1993-05-05|1993-05-04|TAKE BACK RETURN|FOB|r instructions. fluffily +39333|207|89|7|43|47609.60|0.05|0.08|R|F|1993-04-26|1993-03-30|1993-05-05|NONE|MAIL| special, even package +39334|612|13|1|42|63529.62|0.03|0.02|N|O|1997-11-17|1997-11-24|1997-12-04|TAKE BACK RETURN|AIR|ould boost fluffily around the fluffily +39334|1180|53|2|31|33516.58|0.07|0.01|N|O|1997-10-03|1997-11-23|1997-10-23|DELIVER IN PERSON|TRUCK|ch quickly blithely unusual deposi +39334|1045|51|3|49|46355.96|0.10|0.03|N|O|1997-11-11|1997-11-28|1997-11-20|TAKE BACK RETURN|FOB|sits hinder along the ironic packages. car +39335|1291|3|1|21|25038.09|0.06|0.01|R|F|1994-08-08|1994-08-01|1994-08-21|COLLECT COD|SHIP|ng to the slyly pending accounts. senti +39335|967|2|2|12|22415.52|0.02|0.00|A|F|1994-07-04|1994-07-21|1994-07-09|TAKE BACK RETURN|REG AIR|longside of the +39335|1659|42|3|16|24970.40|0.00|0.08|R|F|1994-08-24|1994-08-22|1994-08-26|TAKE BACK RETURN|FOB|totes wake carefully iro +39335|1059|65|4|12|11520.60|0.07|0.04|A|F|1994-09-22|1994-08-20|1994-10-02|TAKE BACK RETURN|MAIL|nding theodolites. fluffy, spe +39335|1175|76|5|15|16142.55|0.06|0.00|R|F|1994-07-23|1994-08-11|1994-08-04|COLLECT COD|AIR|ld, unusual waters. silent pinto bea +39335|1681|64|6|33|52228.44|0.05|0.01|R|F|1994-08-07|1994-08-18|1994-08-11|COLLECT COD|REG AIR|ges cajole furiousl +39335|901|36|7|25|45047.50|0.05|0.05|R|F|1994-08-21|1994-08-08|1994-09-06|COLLECT COD|RAIL|ecial asymptotes. quickly even +39360|492|51|1|32|44559.68|0.03|0.04|A|F|1995-02-25|1995-02-28|1995-03-26|COLLECT COD|AIR| beans. furiousl +39360|927|28|2|47|85912.24|0.07|0.07|R|F|1995-01-28|1995-01-08|1995-02-01|DELIVER IN PERSON|TRUCK| about the idly +39360|1076|47|3|21|20518.47|0.10|0.04|R|F|1995-01-11|1995-01-08|1995-01-27|DELIVER IN PERSON|SHIP|sts are quickl +39360|73|49|4|23|22380.61|0.02|0.00|A|F|1995-03-26|1995-01-13|1995-03-28|COLLECT COD|TRUCK|carefully of the boldly speci +39360|1374|13|5|34|43362.58|0.00|0.07|A|F|1995-01-13|1995-02-01|1995-02-06|NONE|REG AIR|regular orbits. ex +39360|1753|54|6|44|72809.00|0.02|0.00|R|F|1994-12-12|1995-01-05|1994-12-18|NONE|MAIL|uld wake quickly. fluffily stealthy wa +39361|1054|60|1|24|22921.20|0.01|0.05|R|F|1995-02-06|1995-01-23|1995-02-21|TAKE BACK RETURN|SHIP|he furiously fina +39361|1403|21|2|45|58698.00|0.10|0.02|R|F|1995-03-29|1995-01-22|1995-04-05|NONE|RAIL|ully regular accounts. deposits hinder +39361|744|41|3|48|78947.52|0.07|0.02|A|F|1994-12-29|1995-02-06|1995-01-24|COLLECT COD|AIR| accounts since the accounts wake bl +39362|685|48|1|22|34884.96|0.06|0.01|N|O|1998-07-27|1998-09-09|1998-08-02|NONE|REG AIR| regular requ +39363|266|94|1|40|46650.40|0.01|0.07|N|O|1998-03-10|1998-01-25|1998-03-23|DELIVER IN PERSON|FOB|aggle fluffily ironic, iro +39363|954|89|2|38|70488.10|0.10|0.06|N|O|1997-12-25|1997-12-22|1997-12-31|NONE|RAIL|ven deposits integrate carefully even req +39363|761|94|3|10|16617.60|0.07|0.01|N|O|1998-01-18|1998-01-24|1998-01-21|COLLECT COD|RAIL|es use. slyly special pearls +39364|1635|36|1|32|49172.16|0.10|0.07|R|F|1993-01-23|1993-02-08|1993-01-31|COLLECT COD|RAIL| blithely carefully ironi +39364|888|55|2|46|82288.48|0.06|0.01|A|F|1992-11-12|1993-02-06|1992-11-25|TAKE BACK RETURN|AIR|es; quickly ironic depen +39364|1661|62|3|41|64069.06|0.00|0.02|A|F|1993-01-22|1992-12-30|1993-02-05|DELIVER IN PERSON|TRUCK|haggle slyly. quickly special instru +39364|1384|61|4|30|38561.40|0.00|0.00|A|F|1992-12-07|1993-01-30|1992-12-24|TAKE BACK RETURN|SHIP|ide of the furiously express requ +39364|795|60|5|8|13566.32|0.00|0.05|A|F|1992-12-18|1992-12-30|1992-12-21|NONE|MAIL|ts. final, regular theodolites about t +39365|1023|94|1|49|45276.98|0.01|0.05|R|F|1992-08-09|1992-07-16|1992-08-14|COLLECT COD|MAIL|ts along the fluffily final pinto beans c +39365|965|66|2|3|5597.88|0.10|0.06|A|F|1992-06-17|1992-07-07|1992-07-07|NONE|AIR|c pinto beans. quickly enticing deposi +39365|242|43|3|26|29698.24|0.10|0.05|A|F|1992-07-17|1992-06-29|1992-07-21|NONE|REG AIR|ts use furiously quickly even deposi +39365|1617|100|4|12|18223.32|0.03|0.06|A|F|1992-08-08|1992-08-04|1992-08-19|COLLECT COD|REG AIR|xes mold abou +39365|1508|49|5|3|4228.50|0.07|0.01|R|F|1992-07-31|1992-07-15|1992-08-30|COLLECT COD|FOB|the furiously regu +39366|1571|52|1|7|10307.99|0.04|0.08|N|O|1997-10-31|1997-09-21|1997-11-02|NONE|MAIL|riously regular ins +39366|1234|46|2|39|44273.97|0.02|0.06|N|O|1997-08-17|1997-09-04|1997-09-11|TAKE BACK RETURN|MAIL|es. final p +39366|100|26|3|14|14001.40|0.09|0.07|N|O|1997-08-27|1997-09-17|1997-09-14|DELIVER IN PERSON|MAIL| sleep. qui +39366|938|39|4|25|45973.25|0.09|0.02|N|O|1997-11-02|1997-10-10|1997-11-23|DELIVER IN PERSON|TRUCK|theodolites. +39366|334|19|5|12|14811.96|0.08|0.02|N|O|1997-10-08|1997-10-07|1997-11-06|NONE|TRUCK|ecial deposits since the flu +39366|356|41|6|13|16332.55|0.07|0.04|N|O|1997-10-30|1997-09-27|1997-11-22|DELIVER IN PERSON|SHIP|sits. carefully unusual depos +39366|586|17|7|3|4459.74|0.08|0.01|N|O|1997-09-06|1997-09-18|1997-09-16|DELIVER IN PERSON|AIR|uriously bold +39367|1861|62|1|20|35257.20|0.05|0.05|A|F|1994-10-20|1994-11-05|1994-10-21|NONE|SHIP|refully along the enticingly pending dep +39367|288|16|2|16|19012.48|0.09|0.00|A|F|1994-08-09|1994-10-03|1994-08-20|NONE|TRUCK|es lose fluffily a +39367|351|8|3|46|57562.10|0.00|0.04|A|F|1994-09-24|1994-10-03|1994-10-16|COLLECT COD|RAIL|d decoys cajole f +39392|172|25|1|4|4288.68|0.09|0.02|N|O|1997-07-08|1997-09-27|1997-08-07|TAKE BACK RETURN|FOB|en asymptotes breach slyly q +39392|762|95|2|25|41569.00|0.07|0.04|N|O|1997-09-14|1997-08-05|1997-09-29|NONE|RAIL|uests integrate. final, +39392|666|98|3|42|65799.72|0.04|0.01|N|O|1997-07-07|1997-08-26|1997-07-15|TAKE BACK RETURN|RAIL|ep quickly along the final accounts. +39392|1485|64|4|11|15251.28|0.03|0.07|N|O|1997-09-26|1997-09-02|1997-10-21|COLLECT COD|SHIP|nts serve outside the unusua +39392|1730|73|5|11|17949.03|0.02|0.01|N|O|1997-09-23|1997-08-18|1997-10-07|TAKE BACK RETURN|REG AIR|ke slyly. pending the +39392|372|29|6|27|34353.99|0.06|0.05|N|O|1997-09-24|1997-08-24|1997-10-08|TAKE BACK RETURN|TRUCK|pinto beans detect furiously exp +39392|1777|20|7|28|47005.56|0.08|0.05|N|O|1997-07-16|1997-08-18|1997-07-25|NONE|TRUCK|e furiously above the slyly r +39393|1922|67|1|18|32830.56|0.09|0.06|R|F|1994-01-22|1993-12-20|1994-02-18|COLLECT COD|FOB|eposits. carefully unusual pinto +39393|876|77|2|37|65744.19|0.03|0.02|R|F|1994-01-20|1994-01-12|1994-01-23|COLLECT COD|RAIL|courts sleep according to the blithely +39394|1168|41|1|26|27798.16|0.00|0.02|N|O|1996-03-14|1996-05-15|1996-04-12|COLLECT COD|SHIP|yly-- carefully express deposits try +39395|1391|30|1|21|27140.19|0.07|0.04|N|O|1996-12-09|1996-11-03|1997-01-04|NONE|REG AIR|kly bold pinto beans. pending, +39395|773|38|2|24|40170.48|0.03|0.06|N|O|1996-11-18|1996-12-13|1996-12-04|NONE|TRUCK|pinto beans. ironic ideas about the ca +39395|509|100|3|19|26780.50|0.09|0.06|N|O|1996-11-15|1996-12-11|1996-12-13|TAKE BACK RETURN|AIR|lithely pending foxes +39395|1276|14|4|20|23545.40|0.00|0.04|N|O|1996-11-08|1996-12-14|1996-11-20|TAKE BACK RETURN|SHIP|ts. requests ca +39395|752|85|5|36|59499.00|0.10|0.05|N|O|1996-12-28|1996-10-24|1997-01-04|TAKE BACK RETURN|TRUCK|ent packages +39395|850|84|6|30|52525.50|0.10|0.01|N|O|1996-12-21|1996-10-31|1997-01-11|NONE|TRUCK| final, furious hockey players are ca +39395|235|63|7|14|15893.22|0.01|0.08|N|O|1996-12-23|1996-10-29|1997-01-20|DELIVER IN PERSON|AIR|special de +39396|1049|55|1|39|37051.56|0.06|0.04|N|O|1996-03-10|1996-04-19|1996-03-14|DELIVER IN PERSON|AIR|across the even packages. dependencies +39396|1666|90|2|31|48597.46|0.07|0.00|N|O|1996-05-07|1996-03-19|1996-05-28|COLLECT COD|AIR| regular foxes wake blithely +39396|1951|40|3|46|85235.70|0.02|0.08|N|O|1996-05-22|1996-03-28|1996-06-06|COLLECT COD|SHIP|slyly. quick +39397|282|83|1|12|14187.36|0.01|0.00|A|F|1993-11-19|1993-12-03|1993-11-25|DELIVER IN PERSON|FOB|xes. fluffily sly instructions a +39397|757|54|2|20|33155.00|0.09|0.04|A|F|1993-10-21|1993-12-29|1993-11-07|NONE|AIR|ld packages. carefully even deposits +39397|257|85|3|24|27774.00|0.00|0.07|A|F|1993-11-30|1993-12-14|1993-12-01|DELIVER IN PERSON|REG AIR|en warthogs nag carefully. excuses believe +39397|392|49|4|14|18093.46|0.07|0.03|A|F|1993-10-19|1993-12-10|1993-10-25|DELIVER IN PERSON|AIR|slowly car +39397|1738|81|5|3|4919.19|0.06|0.04|A|F|1994-01-18|1994-01-04|1994-02-01|COLLECT COD|RAIL|o beans. special deposits are +39398|1047|48|1|31|29389.24|0.05|0.00|N|O|1998-10-17|1998-09-13|1998-10-31|TAKE BACK RETURN|REG AIR|uests sleep f +39398|1851|81|2|22|38562.70|0.02|0.07|N|O|1998-08-12|1998-10-16|1998-08-31|DELIVER IN PERSON|FOB|sts; furiously regular courts according to +39399|263|91|1|8|9306.08|0.06|0.06|A|F|1993-02-25|1993-01-28|1993-03-14|DELIVER IN PERSON|TRUCK|ts haggle above the blithely regular +39399|739|36|2|36|59030.28|0.09|0.01|A|F|1992-12-29|1993-02-18|1993-01-09|TAKE BACK RETURN|RAIL|. bold foxes abou +39399|721|86|3|15|24325.80|0.05|0.01|A|F|1993-01-21|1993-02-17|1993-02-03|TAKE BACK RETURN|SHIP|ld dependen +39399|158|85|4|2|2116.30|0.02|0.02|A|F|1993-01-06|1993-02-08|1993-01-26|TAKE BACK RETURN|AIR|accounts doze furiously qui +39399|1589|70|5|10|14905.80|0.10|0.08|A|F|1993-02-24|1993-03-18|1993-03-01|COLLECT COD|REG AIR|ts. blithely special t +39399|1832|19|6|21|36410.43|0.01|0.03|A|F|1993-03-03|1993-03-05|1993-03-31|DELIVER IN PERSON|REG AIR|ly ironic deposits. regular, regular packag +39424|357|86|1|31|38977.85|0.05|0.01|N|O|1997-07-13|1997-05-14|1997-08-02|NONE|FOB|fully ironic +39425|1237|49|1|6|6829.38|0.01|0.07|A|F|1992-09-15|1992-09-16|1992-10-11|DELIVER IN PERSON|TRUCK| cajole. accounts atop the carefully f +39425|1741|84|2|38|62424.12|0.08|0.04|R|F|1992-09-15|1992-10-08|1992-09-22|DELIVER IN PERSON|MAIL|al orbits around the +39425|1182|55|3|45|48743.10|0.01|0.06|A|F|1992-10-26|1992-10-24|1992-11-19|DELIVER IN PERSON|TRUCK|ual dinos. regular, ironic +39425|288|70|4|17|20200.76|0.02|0.01|A|F|1992-09-10|1992-10-02|1992-10-01|TAKE BACK RETURN|TRUCK| platelets. regula +39425|663|26|5|48|75055.68|0.05|0.03|R|F|1992-09-16|1992-10-20|1992-10-12|COLLECT COD|AIR|e quickly final sentiments. carefully iro +39425|960|63|6|11|20470.56|0.03|0.02|R|F|1992-11-19|1992-11-06|1992-12-04|DELIVER IN PERSON|TRUCK|r the bold, pending pinto beans. slyly spe +39425|575|36|7|5|7377.85|0.09|0.02|A|F|1992-08-25|1992-10-25|1992-09-19|DELIVER IN PERSON|RAIL|about the fluffily final deposits +39426|398|55|1|34|44145.26|0.01|0.04|A|F|1994-09-20|1994-08-23|1994-10-15|COLLECT COD|RAIL|fix. blithely even ideas affix furiou +39426|48|99|2|42|39817.68|0.02|0.08|R|F|1994-07-24|1994-07-15|1994-08-08|DELIVER IN PERSON|SHIP|notornis. packages are. blit +39426|1456|35|3|8|10859.60|0.08|0.01|A|F|1994-06-14|1994-08-17|1994-07-07|TAKE BACK RETURN|SHIP|accounts. furious +39426|973|42|4|39|73084.83|0.06|0.08|A|F|1994-06-13|1994-06-27|1994-06-30|TAKE BACK RETURN|RAIL|ickly against the slyly reg +39426|434|22|5|23|30691.89|0.04|0.00|R|F|1994-06-24|1994-07-12|1994-07-05|DELIVER IN PERSON|REG AIR| from the accounts. ironic, bold ideas +39427|1041|42|1|46|43333.84|0.07|0.07|A|F|1994-02-11|1994-02-17|1994-03-07|NONE|SHIP|gle. slyly pendi +39427|1207|19|2|45|49869.00|0.08|0.00|A|F|1993-12-28|1994-02-26|1994-01-23|NONE|AIR|pendencies. blithely iro +39427|1670|71|3|50|78583.50|0.02|0.05|A|F|1993-12-18|1994-02-12|1994-01-05|TAKE BACK RETURN|MAIL|ckages. express ideas sleep ab +39427|1289|90|4|33|39279.24|0.06|0.00|R|F|1994-01-17|1994-01-20|1994-02-15|DELIVER IN PERSON|FOB|poach. regular a +39427|1846|76|5|7|12234.88|0.09|0.06|R|F|1994-01-02|1994-03-06|1994-01-26|COLLECT COD|RAIL|to beans doze carefully unusual +39427|1137|46|6|2|2076.26|0.06|0.00|R|F|1994-01-16|1994-03-02|1994-01-17|TAKE BACK RETURN|REG AIR|lyly regular excuses. e +39428|686|18|1|28|44427.04|0.06|0.06|N|O|1997-03-16|1997-03-10|1997-04-02|COLLECT COD|AIR|o beans are quickly ironic platelets. ironi +39428|1943|76|2|38|70107.72|0.10|0.01|N|O|1996-12-26|1997-02-20|1997-01-16|DELIVER IN PERSON|TRUCK|cajole. carefully even dinos +39428|1309|48|3|39|47201.70|0.06|0.06|N|O|1997-04-13|1997-02-18|1997-04-21|COLLECT COD|MAIL|pending foxes sleep. fur +39428|1792|19|4|7|11856.53|0.09|0.06|N|O|1997-01-25|1997-01-31|1997-01-31|NONE|AIR|ronic foxes wake. ruthless, unu +39428|1517|98|5|44|62414.44|0.00|0.01|N|O|1996-12-17|1997-02-14|1996-12-20|COLLECT COD|REG AIR|ic requests. blithely special theo +39428|1794|79|6|2|3391.58|0.02|0.05|N|O|1997-03-02|1997-03-06|1997-03-31|NONE|REG AIR|y regular packages-- final, final pi +39428|996|31|7|2|3793.98|0.02|0.07|N|O|1997-01-04|1997-02-16|1997-01-31|DELIVER IN PERSON|AIR|structions after the furiously pending +39429|1510|31|1|47|66340.97|0.10|0.00|N|O|1998-06-02|1998-07-09|1998-06-22|NONE|MAIL| deposits sleep slyly blithely final +39429|639|71|2|12|18475.56|0.07|0.07|N|O|1998-05-20|1998-07-01|1998-05-23|DELIVER IN PERSON|MAIL|express platelets. final ac +39430|1777|78|1|26|43648.02|0.06|0.01|A|F|1994-09-21|1994-07-31|1994-10-10|DELIVER IN PERSON|MAIL|slyly regular dolphins +39430|1796|81|2|25|42444.75|0.05|0.05|R|F|1994-07-10|1994-08-13|1994-07-30|COLLECT COD|TRUCK| after the +39430|1933|66|3|18|33028.74|0.05|0.02|A|F|1994-07-08|1994-08-31|1994-08-03|COLLECT COD|AIR|carefully even deposits after +39430|399|56|4|28|36382.92|0.10|0.00|R|F|1994-07-01|1994-07-20|1994-07-25|DELIVER IN PERSON|SHIP|refully final dependencies wake quic +39430|1892|79|5|24|43053.36|0.05|0.06|A|F|1994-07-22|1994-08-08|1994-08-10|TAKE BACK RETURN|AIR|eposits. furiously +39430|1271|83|6|6|7033.62|0.03|0.01|A|F|1994-07-25|1994-07-24|1994-07-29|DELIVER IN PERSON|RAIL|egular requests detect slyly slyly +39431|1379|94|1|7|8962.59|0.06|0.00|R|F|1992-09-05|1992-07-19|1992-09-23|TAKE BACK RETURN|FOB|d ironically +39431|1504|25|2|31|43570.50|0.03|0.06|R|F|1992-09-12|1992-07-14|1992-09-26|NONE|SHIP|s the regular, express requests. deposits +39456|1424|42|1|46|60969.32|0.04|0.00|N|O|1998-02-21|1998-05-11|1998-02-28|DELIVER IN PERSON|REG AIR|regular requests c +39456|1952|85|2|34|63034.30|0.01|0.06|N|O|1998-04-07|1998-04-30|1998-04-22|COLLECT COD|RAIL|olites. regularly regular packa +39456|659|91|3|49|76422.85|0.07|0.08|N|O|1998-04-21|1998-05-04|1998-04-30|NONE|SHIP|ully special deposits near the bol +39456|256|57|4|48|55500.00|0.10|0.00|N|O|1998-05-28|1998-05-04|1998-05-29|DELIVER IN PERSON|SHIP|requests. regular packages above the bli +39456|996|31|5|49|92952.51|0.02|0.03|N|O|1998-06-05|1998-05-08|1998-06-13|COLLECT COD|AIR|. special excuses u +39456|1701|2|6|40|64108.00|0.05|0.06|N|O|1998-02-22|1998-04-01|1998-03-20|COLLECT COD|REG AIR|e slyly quickly regula +39457|1983|84|1|41|77284.18|0.06|0.07|N|O|1995-09-29|1995-07-15|1995-10-17|TAKE BACK RETURN|MAIL|ggle. careful +39457|573|74|2|31|45680.67|0.03|0.04|N|O|1995-07-08|1995-07-19|1995-07-13|DELIVER IN PERSON|TRUCK|ts. furiously flu +39457|306|35|3|3|3618.90|0.08|0.07|N|O|1995-08-28|1995-07-07|1995-09-18|TAKE BACK RETURN|RAIL|long the furiously ironic requests wil +39458|475|63|1|44|60520.68|0.02|0.02|N|O|1997-10-04|1997-09-29|1997-10-14|TAKE BACK RETURN|RAIL| express pinto beans +39458|279|34|2|8|9434.16|0.05|0.01|N|O|1997-09-04|1997-10-04|1997-09-28|TAKE BACK RETURN|FOB|s sleep silently ironic +39458|1334|73|3|8|9882.64|0.02|0.04|N|O|1997-10-28|1997-10-22|1997-11-21|COLLECT COD|SHIP|om the slyly +39458|1350|65|4|10|12513.50|0.09|0.02|N|O|1997-11-27|1997-11-09|1997-12-18|DELIVER IN PERSON|TRUCK|beans woul +39458|887|54|5|25|44697.00|0.10|0.08|N|O|1997-11-23|1997-10-28|1997-12-15|COLLECT COD|MAIL|s alongside of the r +39459|1454|72|1|25|33886.25|0.06|0.07|N|O|1997-11-06|1997-11-02|1997-11-20|DELIVER IN PERSON|TRUCK|sual theodolites doze slyly pen +39459|681|75|2|35|55358.80|0.06|0.00|N|O|1997-11-04|1997-11-27|1997-11-25|COLLECT COD|SHIP| carefully even sheaves a +39460|1728|71|1|36|58669.92|0.01|0.00|R|F|1994-08-22|1994-07-13|1994-09-05|COLLECT COD|REG AIR| Tiresias cajol +39460|573|64|2|6|8841.42|0.04|0.08|A|F|1994-07-09|1994-07-18|1994-08-04|DELIVER IN PERSON|REG AIR|ld dependencies boost busily pending foxe +39460|894|61|3|46|82564.94|0.01|0.06|A|F|1994-08-02|1994-07-07|1994-08-15|NONE|RAIL|ts. furiously final requests o +39460|957|60|4|44|81749.80|0.08|0.06|A|F|1994-05-07|1994-07-16|1994-05-22|COLLECT COD|FOB|lar, ironic notor +39460|1094|95|5|12|11941.08|0.10|0.04|A|F|1994-06-09|1994-06-21|1994-06-11|COLLECT COD|AIR|s nag above t +39460|393|78|6|43|55615.77|0.10|0.05|R|F|1994-06-09|1994-07-15|1994-06-19|TAKE BACK RETURN|TRUCK| bold somas h +39461|102|3|1|1|1002.10|0.09|0.08|N|O|1996-08-25|1996-07-17|1996-08-26|NONE|FOB|mptotes. quickly s +39461|210|11|2|2|2220.42|0.05|0.01|N|O|1996-06-02|1996-07-11|1996-07-02|DELIVER IN PERSON|SHIP|sly ironic pinto +39461|1262|37|3|21|24428.46|0.02|0.06|N|O|1996-09-17|1996-08-05|1996-09-18|TAKE BACK RETURN|AIR|uests. eve +39461|338|23|4|8|9906.64|0.08|0.04|N|O|1996-07-22|1996-07-11|1996-08-06|DELIVER IN PERSON|SHIP|es about the blithely pending requests +39461|1340|55|5|24|29792.16|0.08|0.08|N|O|1996-07-18|1996-08-05|1996-08-11|COLLECT COD|RAIL|riously. silent dependenc +39461|569|70|6|10|14695.60|0.00|0.01|N|O|1996-06-13|1996-07-22|1996-07-07|COLLECT COD|RAIL|usual accounts. ironic +39461|1618|60|7|41|62304.01|0.00|0.05|N|O|1996-09-21|1996-07-23|1996-09-30|TAKE BACK RETURN|SHIP|s haggle furiously. pe +39462|1988|21|1|25|47249.50|0.04|0.08|N|O|1996-07-19|1996-06-18|1996-08-01|COLLECT COD|FOB|lyly multiplier +39462|1129|38|2|44|45325.28|0.05|0.03|N|O|1996-05-18|1996-07-11|1996-05-31|DELIVER IN PERSON|REG AIR|packages along t +39462|1713|14|3|33|53285.43|0.06|0.07|N|O|1996-07-29|1996-07-15|1996-08-23|TAKE BACK RETURN|REG AIR|lyly close requests use a +39462|1138|39|4|15|15586.95|0.04|0.07|N|O|1996-08-24|1996-07-21|1996-09-16|DELIVER IN PERSON|TRUCK|ly regular requ +39463|1183|92|1|31|33609.58|0.08|0.07|R|F|1994-12-29|1994-11-20|1995-01-01|TAKE BACK RETURN|SHIP|leep slyly. flu +39463|192|19|2|50|54609.50|0.07|0.01|R|F|1995-01-28|1994-11-26|1995-02-17|DELIVER IN PERSON|RAIL| instructions. blithely pending deposits s +39488|656|88|1|23|35802.95|0.01|0.03|A|F|1994-08-26|1994-09-02|1994-08-29|TAKE BACK RETURN|FOB|ely silent packages sleep furiou +39488|737|70|2|11|18015.03|0.10|0.08|R|F|1994-09-22|1994-09-17|1994-10-07|COLLECT COD|FOB| bold deposits serve quickly +39489|65|91|1|21|20266.26|0.03|0.06|N|O|1998-08-06|1998-10-13|1998-08-15|DELIVER IN PERSON|FOB|sly regular attainments wake slyly. regular +39490|1354|31|1|20|25107.00|0.09|0.03|R|F|1992-12-10|1992-09-27|1992-12-13|NONE|AIR|blithely carefully even platelets. b +39490|1030|1|2|50|46551.50|0.10|0.04|A|F|1992-11-15|1992-09-29|1992-11-23|DELIVER IN PERSON|REG AIR|un. slyly final deposits are dogged +39490|1860|4|3|18|31713.48|0.00|0.03|A|F|1992-11-10|1992-09-24|1992-12-07|DELIVER IN PERSON|REG AIR|c pinto beans. pending pearls among the ca +39490|994|63|4|30|56849.70|0.07|0.03|R|F|1992-09-14|1992-10-14|1992-09-24|COLLECT COD|REG AIR|y ironic deposits. carefully ev +39490|1811|41|5|4|6851.24|0.01|0.00|R|F|1992-12-03|1992-09-19|1992-12-20|COLLECT COD|RAIL|deposits sleep quickly slyly bo +39491|1053|54|1|50|47702.50|0.05|0.00|R|F|1993-08-15|1993-08-28|1993-09-12|DELIVER IN PERSON|RAIL| silent somas. furiously p +39491|1501|2|2|22|30855.00|0.06|0.01|A|F|1993-10-10|1993-09-08|1993-10-21|TAKE BACK RETURN|TRUCK|ent packages. special Tiresias alon +39491|1270|71|3|47|55049.69|0.04|0.04|R|F|1993-07-19|1993-08-11|1993-08-12|TAKE BACK RETURN|SHIP|o beans are fluffily bold +39491|1244|19|4|11|12597.64|0.00|0.03|A|F|1993-07-09|1993-09-28|1993-07-18|TAKE BACK RETURN|SHIP|quests will ha +39492|70|46|1|6|5820.42|0.08|0.01|R|F|1995-05-08|1995-06-17|1995-05-25|COLLECT COD|SHIP|ly ironic deposits. unusual reques +39492|71|72|2|3|2913.21|0.10|0.00|N|O|1995-06-27|1995-06-29|1995-07-26|DELIVER IN PERSON|REG AIR| sleep furiously regular, regular the +39492|1625|26|3|21|32059.02|0.10|0.04|A|F|1995-05-08|1995-06-14|1995-06-02|DELIVER IN PERSON|TRUCK|l deposits boost s +39492|224|6|4|5|5621.10|0.04|0.06|N|F|1995-06-10|1995-06-20|1995-06-19|COLLECT COD|FOB| quiet requests. careful +39492|574|75|5|47|69304.79|0.08|0.04|A|F|1995-04-30|1995-06-15|1995-05-02|TAKE BACK RETURN|MAIL|lar packages aff +39493|711|12|1|34|54798.14|0.02|0.06|N|O|1997-07-17|1997-09-22|1997-08-12|TAKE BACK RETURN|AIR|ely ironic theodolites af +39493|1509|10|2|7|9873.50|0.03|0.03|N|O|1997-08-16|1997-09-11|1997-09-06|NONE|MAIL|ep about the furiously final reques +39493|1523|44|3|30|42735.60|0.05|0.05|N|O|1997-08-08|1997-09-13|1997-08-13|DELIVER IN PERSON|FOB|riously according to the +39493|494|24|4|35|48807.15|0.04|0.02|N|O|1997-10-08|1997-08-29|1997-11-07|NONE|MAIL|y. ironic, final pinto +39494|38|39|1|32|30016.96|0.02|0.03|N|O|1997-01-14|1996-12-11|1997-01-29|TAKE BACK RETURN|SHIP| cajole blithely. slyly regular theodolite +39494|1799|26|2|27|45921.33|0.09|0.03|N|O|1996-10-22|1996-12-12|1996-11-21|DELIVER IN PERSON|REG AIR|r instruction +39494|1775|18|3|37|62040.49|0.03|0.03|N|O|1997-01-03|1996-12-06|1997-01-05|DELIVER IN PERSON|TRUCK|endencies integrate blithely across +39495|1929|74|1|45|82391.40|0.04|0.07|A|F|1994-03-27|1994-03-28|1994-04-23|NONE|SHIP|ifts. ironic, regular requests hang care +39495|48|99|2|47|44557.88|0.08|0.06|A|F|1994-05-30|1994-03-25|1994-06-18|DELIVER IN PERSON|SHIP|y pending tithes. carefully even +39495|1257|58|3|17|19690.25|0.10|0.07|A|F|1994-03-22|1994-03-14|1994-04-17|COLLECT COD|FOB|regular accounts past the re +39495|1977|10|4|9|16910.73|0.04|0.00|R|F|1994-05-15|1994-03-16|1994-05-23|COLLECT COD|FOB|lent, regul +39495|641|42|5|10|15416.40|0.07|0.00|R|F|1994-05-16|1994-04-05|1994-06-05|COLLECT COD|SHIP|luffy pinto beans. furi +39520|484|85|1|29|40149.92|0.06|0.07|N|O|1997-11-19|1997-11-11|1997-11-24|TAKE BACK RETURN|REG AIR|carefully regular d +39520|1514|15|2|22|31141.22|0.05|0.02|N|O|1997-12-23|1997-12-06|1998-01-09|COLLECT COD|MAIL|sits; quickly even deposits na +39520|937|6|3|38|69841.34|0.06|0.01|N|O|1998-01-19|1997-11-18|1998-02-13|TAKE BACK RETURN|TRUCK|y foxes use carefully a +39520|1882|26|4|24|42813.12|0.02|0.04|N|O|1997-11-19|1997-11-27|1997-12-02|DELIVER IN PERSON|MAIL|deas about the carefully final packages +39520|1596|97|5|32|47922.88|0.02|0.06|N|O|1998-01-11|1998-01-01|1998-01-19|NONE|MAIL|ly regular accounts. quickly pending +39520|1596|17|6|1|1497.59|0.02|0.03|N|O|1997-12-02|1997-12-23|1997-12-09|COLLECT COD|REG AIR|nding theodolites. blithely unusual deposi +39520|816|50|7|48|82406.88|0.02|0.02|N|O|1997-11-11|1997-11-22|1997-12-06|COLLECT COD|SHIP|foxes. express, spec +39521|178|79|1|24|25876.08|0.09|0.01|A|F|1994-08-30|1994-09-20|1994-09-18|COLLECT COD|SHIP|nic deposits boost. speci +39521|502|33|2|18|25245.00|0.04|0.05|R|F|1994-10-06|1994-10-11|1994-10-18|DELIVER IN PERSON|RAIL| along the carefully daring requests. fu +39521|83|84|3|25|24577.00|0.04|0.02|A|F|1994-08-19|1994-09-24|1994-08-28|NONE|FOB|packages snooze. +39522|973|76|1|20|37479.40|0.07|0.03|N|O|1998-06-06|1998-08-24|1998-06-26|TAKE BACK RETURN|MAIL| packages. +39522|317|46|2|23|27998.13|0.00|0.00|N|O|1998-07-08|1998-08-25|1998-07-25|COLLECT COD|TRUCK|nstructions mold blithely. carefully d +39522|1196|69|3|3|3291.57|0.04|0.08|N|O|1998-08-11|1998-07-02|1998-08-15|COLLECT COD|REG AIR|s. furious +39523|1611|94|1|23|34790.03|0.06|0.03|N|O|1997-05-06|1997-05-02|1997-05-19|COLLECT COD|MAIL|cross the furiously pending foxes. sl +39523|1395|96|2|30|38891.70|0.05|0.03|N|O|1997-03-08|1997-04-09|1997-03-21|DELIVER IN PERSON|MAIL| furiously bold +39523|1561|82|3|21|30713.76|0.01|0.01|N|O|1997-04-07|1997-05-06|1997-04-17|NONE|AIR|s; even requests haggle slyly qu +39523|538|39|4|32|46032.96|0.08|0.02|N|O|1997-04-06|1997-05-28|1997-05-05|NONE|FOB|al deposits wake fu +39523|1971|4|5|15|28094.55|0.01|0.03|N|O|1997-06-25|1997-04-13|1997-06-26|DELIVER IN PERSON|TRUCK|lar, ironic accounts slee +39523|369|54|6|34|43158.24|0.04|0.05|N|O|1997-03-26|1997-05-17|1997-04-22|NONE|TRUCK|ndencies boo +39523|1850|94|7|44|77081.40|0.01|0.02|N|O|1997-05-17|1997-05-28|1997-06-06|DELIVER IN PERSON|REG AIR|ind the slyly bold acco +39524|299|54|1|48|57565.92|0.00|0.08|N|O|1996-11-26|1996-11-28|1996-12-05|COLLECT COD|REG AIR|kages. even courts after t +39524|1640|64|2|15|23124.60|0.08|0.03|N|O|1996-11-17|1996-11-04|1996-11-26|DELIVER IN PERSON|RAIL|alongside of the asymptotes b +39524|1572|93|3|19|27997.83|0.09|0.08|N|O|1996-11-29|1996-12-15|1996-12-14|TAKE BACK RETURN|AIR|r foxes should ha +39525|1613|55|1|41|62099.01|0.07|0.08|N|O|1995-10-09|1995-08-27|1995-10-26|NONE|FOB|its grow about +39526|707|4|1|25|40192.50|0.07|0.01|N|O|1996-11-10|1996-12-18|1996-11-16|COLLECT COD|AIR|le alongside of the blithely +39526|1319|96|2|22|26846.82|0.05|0.03|N|O|1997-01-04|1996-12-06|1997-01-10|TAKE BACK RETURN|SHIP|hely final theodolites cajole bravely s +39526|461|91|3|47|63988.62|0.02|0.02|N|O|1996-11-07|1996-11-08|1996-11-24|COLLECT COD|FOB|hinder fluffily regular instruc +39526|171|72|4|30|32135.10|0.06|0.05|N|O|1996-12-21|1996-11-25|1997-01-11|NONE|MAIL|eans. bold pack +39527|317|18|1|17|20694.27|0.02|0.01|A|F|1995-05-24|1995-07-08|1995-06-16|NONE|MAIL| x-ray bli +39527|1255|56|2|11|12718.75|0.10|0.02|N|O|1995-07-17|1995-06-02|1995-08-05|DELIVER IN PERSON|TRUCK|osits. fluffily unusual asy +39527|173|52|3|29|31121.93|0.02|0.07|N|O|1995-06-23|1995-07-06|1995-07-04|TAKE BACK RETURN|RAIL|gular pinto beans affix quickly pend +39527|1494|34|4|8|11163.92|0.03|0.08|R|F|1995-05-22|1995-06-10|1995-06-04|TAKE BACK RETURN|SHIP|regular de +39527|942|77|5|30|55288.20|0.01|0.08|R|F|1995-05-02|1995-06-04|1995-05-29|DELIVER IN PERSON|REG AIR|lar theodolites haggle. express ac +39552|1109|18|1|24|24242.40|0.09|0.07|N|O|1998-03-02|1998-03-29|1998-03-14|DELIVER IN PERSON|FOB|olites detect +39553|1013|19|1|11|10054.11|0.10|0.08|N|O|1996-09-24|1996-09-16|1996-10-02|DELIVER IN PERSON|REG AIR|nic, even requests +39553|1203|4|2|47|51897.40|0.04|0.00|N|O|1996-09-03|1996-09-22|1996-09-22|TAKE BACK RETURN|AIR|egular courts. blithely even attainments +39554|584|75|1|2|2969.16|0.01|0.07|N|O|1996-05-22|1996-04-14|1996-06-05|DELIVER IN PERSON|FOB|otes could sleep; sile +39554|523|14|2|39|55517.28|0.02|0.02|N|O|1996-04-13|1996-05-04|1996-05-12|NONE|MAIL|hely-- slyly bold forges +39554|886|20|3|39|69688.32|0.10|0.01|N|O|1996-06-01|1996-04-11|1996-06-07|NONE|FOB|refully express requests. requests +39554|108|35|4|22|22178.20|0.01|0.04|N|O|1996-03-02|1996-04-08|1996-03-08|NONE|AIR| furiously regular packages. expr +39555|924|59|1|14|25548.88|0.10|0.07|R|F|1992-09-26|1992-10-29|1992-10-01|NONE|MAIL|thin notornis. +39555|1055|26|2|26|24857.30|0.03|0.05|R|F|1992-12-11|1992-10-13|1993-01-01|NONE|SHIP| requests cajole slyly am +39555|1223|24|3|50|56211.00|0.07|0.00|R|F|1992-10-05|1992-11-16|1992-10-30|TAKE BACK RETURN|REG AIR| notornis haggle quickly am +39555|265|93|4|36|41949.36|0.08|0.05|R|F|1992-12-24|1992-10-15|1993-01-05|TAKE BACK RETURN|REG AIR|ng the iron +39556|1209|84|1|33|36636.60|0.10|0.04|N|O|1998-05-14|1998-04-13|1998-05-25|TAKE BACK RETURN|TRUCK|osits. blithely ironic escapades i +39556|1068|69|2|41|39731.46|0.07|0.04|N|O|1998-03-06|1998-04-06|1998-03-19|TAKE BACK RETURN|REG AIR|e furiously across t +39556|917|18|3|15|27268.65|0.09|0.08|N|O|1998-03-15|1998-04-01|1998-03-21|COLLECT COD|SHIP|y regular, special packages-- unusual, +39556|1472|12|4|16|21975.52|0.03|0.03|N|O|1998-04-12|1998-04-12|1998-05-01|COLLECT COD|MAIL|sts. ironic, bold asym +39556|1503|24|5|30|42135.00|0.10|0.06|N|O|1998-04-01|1998-04-11|1998-04-17|NONE|TRUCK|are furiously +39556|1154|27|6|20|21103.00|0.09|0.06|N|O|1998-06-19|1998-04-20|1998-07-12|DELIVER IN PERSON|MAIL|gular accounts. slyly pending pint +39556|1451|30|7|25|33811.25|0.05|0.06|N|O|1998-04-12|1998-04-28|1998-04-25|TAKE BACK RETURN|MAIL|uickly final instruction +39557|673|74|1|28|44062.76|0.03|0.00|A|F|1993-12-16|1993-11-22|1993-12-23|NONE|AIR|ts sleep furiousl +39557|554|85|2|48|69818.40|0.10|0.07|R|F|1993-12-21|1994-01-01|1994-01-01|COLLECT COD|TRUCK|ithely special ideas. carefu +39557|1547|88|3|45|65184.30|0.05|0.07|A|F|1993-12-17|1993-12-28|1993-12-26|COLLECT COD|MAIL|st the furiously regular asymptotes. spec +39557|359|88|4|22|27705.70|0.06|0.01|A|F|1993-12-07|1993-11-16|1993-12-29|TAKE BACK RETURN|RAIL|thely final decoys. s +39557|816|16|5|10|17168.10|0.01|0.00|A|F|1993-11-27|1993-12-02|1993-11-29|COLLECT COD|AIR|e carefully according to the carefully even +39557|393|94|6|14|18107.46|0.02|0.08|A|F|1993-12-21|1993-11-24|1993-12-24|DELIVER IN PERSON|RAIL|g the accounts. quickly regular +39558|774|75|1|3|5024.31|0.09|0.00|N|O|1997-04-02|1997-02-13|1997-04-13|COLLECT COD|REG AIR|fully iron +39559|489|77|1|11|15284.28|0.10|0.01|N|O|1996-01-26|1995-12-09|1996-01-29|NONE|TRUCK|e even, express notornis. furious +39584|198|51|1|12|13178.28|0.07|0.01|N|O|1997-09-28|1997-12-04|1997-10-15|NONE|RAIL|lyly. blithely final +39584|258|13|2|44|50963.00|0.10|0.01|N|O|1997-11-06|1997-10-30|1997-11-14|DELIVER IN PERSON|RAIL|unusual foxes sleep final +39584|757|90|3|16|26524.00|0.00|0.08|N|O|1997-10-23|1997-10-30|1997-11-22|COLLECT COD|REG AIR|ng the special, regular pi +39584|847|14|4|15|26217.60|0.09|0.06|N|O|1997-10-11|1997-10-30|1997-11-10|NONE|REG AIR|usly bold asymptotes. requests use flu +39584|1765|66|5|43|71670.68|0.07|0.04|N|O|1997-09-10|1997-11-25|1997-09-18|COLLECT COD|TRUCK| patterns nag. slyly final fo +39584|599|100|6|16|23993.44|0.08|0.05|N|O|1997-11-19|1997-10-20|1997-12-04|COLLECT COD|AIR|fluffily ironic pinto beans nag blith +39584|1331|8|7|27|33272.91|0.00|0.04|N|O|1997-12-18|1997-11-25|1998-01-06|COLLECT COD|MAIL|s. excuses affix ev +39585|1929|74|1|10|18309.20|0.09|0.04|N|O|1996-03-23|1996-03-08|1996-04-04|COLLECT COD|TRUCK| quickly even courts. slyly regular +39585|1622|46|2|9|13712.58|0.04|0.05|N|O|1996-01-05|1996-02-15|1996-01-20|DELIVER IN PERSON|FOB|n requests are enti +39585|663|95|3|37|57855.42|0.05|0.03|N|O|1996-02-29|1996-03-29|1996-03-01|COLLECT COD|MAIL|carefully regular packages +39585|342|43|4|5|6211.70|0.08|0.04|N|O|1996-04-29|1996-03-24|1996-05-27|COLLECT COD|REG AIR|quickly busy ideas sleep. foxes promise +39585|190|43|5|14|15262.66|0.00|0.06|N|O|1996-03-12|1996-03-02|1996-03-16|COLLECT COD|REG AIR| cajole among the reg +39585|688|20|6|32|50837.76|0.09|0.05|N|O|1996-03-04|1996-03-17|1996-03-12|DELIVER IN PERSON|FOB|eans are quickly along the blithel +39585|1993|26|7|14|26529.86|0.07|0.00|N|O|1996-02-09|1996-03-09|1996-02-18|TAKE BACK RETURN|REG AIR|t blithely. requests sleep blithe +39586|285|13|1|35|41484.80|0.05|0.01|N|O|1995-06-21|1995-07-12|1995-07-10|TAKE BACK RETURN|AIR| deposits! dinos caj +39586|1502|23|2|13|18245.50|0.05|0.05|N|F|1995-06-03|1995-07-19|1995-07-03|COLLECT COD|AIR|r packages sleep fluffily fluffily ironic +39586|1748|75|3|27|44542.98|0.01|0.08|N|O|1995-07-05|1995-07-07|1995-07-14|COLLECT COD|SHIP|nusual requests sleep quickly. blit +39586|1056|62|4|39|37324.95|0.10|0.01|N|O|1995-07-10|1995-07-19|1995-07-24|COLLECT COD|MAIL|wake above the +39586|1067|68|5|27|26137.62|0.04|0.03|N|O|1995-09-08|1995-07-19|1995-09-15|COLLECT COD|SHIP|ound the carefully bold +39587|1460|100|1|22|29952.12|0.10|0.05|N|O|1997-05-31|1997-06-29|1997-06-08|COLLECT COD|FOB|the dependencies. furiously final ideas +39587|920|21|2|29|52806.68|0.03|0.05|N|O|1997-05-22|1997-06-29|1997-05-23|TAKE BACK RETURN|RAIL|ctions. caref +39587|1505|6|3|29|40788.50|0.09|0.02|N|O|1997-06-26|1997-06-05|1997-07-14|NONE|SHIP|al requests. dolphins eat f +39587|640|72|4|34|52381.76|0.09|0.08|N|O|1997-07-13|1997-06-09|1997-08-07|TAKE BACK RETURN|SHIP|y ironic accounts. ironic d +39587|1884|28|5|14|25002.32|0.04|0.00|N|O|1997-05-12|1997-05-24|1997-05-20|NONE|RAIL|nts nag among the blith +39587|1128|29|6|50|51456.00|0.06|0.03|N|O|1997-04-28|1997-07-01|1997-05-03|NONE|FOB|ial deposits. furiously iro +39588|1422|62|1|22|29115.24|0.03|0.06|N|O|1998-01-20|1998-03-06|1998-02-12|TAKE BACK RETURN|MAIL|ly close foxes. slyly final +39588|792|93|2|22|37241.38|0.02|0.08|N|O|1998-03-19|1998-01-27|1998-03-23|NONE|REG AIR|lyly ironic instructi +39588|534|95|3|17|24387.01|0.10|0.04|N|O|1998-01-04|1998-02-26|1998-01-31|TAKE BACK RETURN|RAIL|ronic reque +39589|408|96|1|43|56261.20|0.00|0.00|R|F|1994-10-13|1994-10-17|1994-10-26|NONE|MAIL|its detect above t +39589|849|16|2|8|13998.72|0.02|0.01|A|F|1994-11-17|1994-10-25|1994-11-28|NONE|FOB|ly according to the carefully special +39589|1818|19|3|11|18917.91|0.10|0.03|A|F|1994-08-31|1994-09-23|1994-09-02|DELIVER IN PERSON|SHIP|he even requests. furiou +39590|32|8|1|37|34485.11|0.03|0.06|N|O|1995-08-31|1995-07-21|1995-09-20|NONE|AIR|ly silent frets +39590|1421|22|2|2|2644.84|0.08|0.01|N|O|1995-07-22|1995-07-03|1995-08-15|DELIVER IN PERSON|RAIL|oxes should have to haggle +39590|371|56|3|34|43226.58|0.09|0.00|N|O|1995-09-03|1995-08-07|1995-09-10|COLLECT COD|SHIP|osits use ironic ideas-- fluffily pe +39590|131|32|4|15|15466.95|0.09|0.07|N|F|1995-06-05|1995-07-07|1995-06-19|NONE|SHIP|ly final requests cajole furiously spe +39591|57|8|1|13|12441.65|0.10|0.02|N|O|1997-05-30|1997-05-24|1997-06-09|NONE|AIR|s affix slyly after the quickly r +39591|1368|83|2|30|38080.80|0.09|0.04|N|O|1997-05-06|1997-06-06|1997-05-13|DELIVER IN PERSON|AIR|es: blithely even fo +39591|639|40|3|21|32332.23|0.07|0.04|N|O|1997-05-13|1997-04-28|1997-05-25|COLLECT COD|REG AIR| alongside of the slyly s +39616|1227|65|1|45|50769.90|0.03|0.00|N|O|1998-01-16|1998-01-02|1998-01-28|NONE|AIR|counts-- quickly pe +39616|126|5|2|43|44123.16|0.02|0.02|N|O|1998-01-06|1998-01-28|1998-01-18|NONE|AIR|e requests. furiously +39616|956|57|3|47|87276.65|0.00|0.05|N|O|1997-12-27|1998-01-26|1998-01-22|COLLECT COD|REG AIR|thlessly ironic excuse +39616|1495|13|4|11|15361.39|0.04|0.00|N|O|1997-12-04|1998-01-19|1997-12-10|DELIVER IN PERSON|SHIP|g ideas. unusual, daring dep +39616|745|46|5|43|70766.82|0.04|0.05|N|O|1998-01-08|1997-12-24|1998-02-01|DELIVER IN PERSON|SHIP| accounts. furiously bold fret +39617|911|14|1|50|90595.50|0.02|0.06|N|O|1996-03-19|1996-02-17|1996-03-21|TAKE BACK RETURN|MAIL|ecial requests. ca +39617|1577|18|2|33|48792.81|0.02|0.02|N|O|1996-03-04|1996-03-04|1996-03-24|COLLECT COD|SHIP| slyly above the +39617|396|25|3|19|24631.41|0.04|0.07|N|O|1996-02-25|1996-03-12|1996-03-23|TAKE BACK RETURN|TRUCK|use. accounts after +39617|1065|66|4|33|31879.98|0.09|0.02|N|O|1996-01-05|1996-02-22|1996-02-03|TAKE BACK RETURN|AIR|uses mold am +39618|1814|1|1|22|37747.82|0.00|0.08|N|O|1998-06-21|1998-05-21|1998-06-26|TAKE BACK RETURN|MAIL|s above the +39618|1415|33|2|6|7898.46|0.09|0.01|N|O|1998-05-14|1998-04-23|1998-05-15|TAKE BACK RETURN|AIR|ven packages affix. carefully regula +39618|497|85|3|28|39129.72|0.00|0.08|N|O|1998-03-27|1998-04-29|1998-04-13|NONE|RAIL|ounts. special, even depos +39619|1722|23|1|20|32474.40|0.07|0.00|A|F|1992-03-10|1992-03-25|1992-03-22|COLLECT COD|TRUCK|riously unusual ideas. quickly ironic theod +39619|1417|18|2|32|42189.12|0.10|0.01|R|F|1992-01-26|1992-02-07|1992-02-16|COLLECT COD|RAIL|al platelets slee +39619|792|25|3|40|67711.60|0.01|0.07|R|F|1992-03-23|1992-02-26|1992-04-16|COLLECT COD|REG AIR| idle requests. requests +39620|236|64|1|45|51130.35|0.01|0.00|A|F|1994-11-06|1994-11-04|1994-11-30|DELIVER IN PERSON|MAIL|sly ironic ac +39620|1614|56|2|35|53046.35|0.08|0.07|R|F|1994-11-28|1994-11-20|1994-12-19|DELIVER IN PERSON|MAIL|ctions. final requests wake +39620|1680|22|3|48|75920.64|0.01|0.05|A|F|1994-12-24|1994-12-30|1994-12-25|DELIVER IN PERSON|MAIL|ly ironic packages try to +39620|727|28|4|46|74875.12|0.10|0.04|R|F|1994-12-02|1994-11-20|1994-12-31|TAKE BACK RETURN|FOB|are. blithe dolphins believe after the +39620|550|51|5|6|8703.30|0.00|0.05|R|F|1995-01-13|1994-11-22|1995-01-31|COLLECT COD|TRUCK|xcuses. pending pa +39620|1726|69|6|45|73247.40|0.07|0.02|A|F|1995-01-01|1995-01-02|1995-01-28|TAKE BACK RETURN|TRUCK|special excuses affix permanently a +39620|1811|55|7|47|80502.07|0.05|0.00|R|F|1994-11-19|1994-12-17|1994-11-30|DELIVER IN PERSON|TRUCK|eposits according to the quickly ironic +39621|1808|38|1|11|18807.80|0.08|0.01|N|O|1998-10-18|1998-09-23|1998-11-11|TAKE BACK RETURN|FOB| deposits boost blit +39622|296|97|1|47|56225.63|0.00|0.01|N|O|1995-09-20|1995-10-21|1995-09-21|COLLECT COD|RAIL|st between +39623|658|21|1|11|17145.15|0.10|0.05|N|O|1996-07-31|1996-07-06|1996-08-06|TAKE BACK RETURN|AIR|g the blithely even theodol +39623|721|54|2|48|77842.56|0.05|0.00|N|O|1996-06-28|1996-07-21|1996-07-01|TAKE BACK RETURN|FOB|slyly final acco +39623|1374|13|3|27|34434.99|0.09|0.02|N|O|1996-06-30|1996-08-16|1996-07-16|COLLECT COD|FOB|the final requ +39623|1084|85|4|10|9850.80|0.06|0.00|N|O|1996-07-19|1996-07-06|1996-07-20|COLLECT COD|REG AIR|bout the finally quiet excuses. fluffily +39623|229|11|5|3|3387.66|0.04|0.03|N|O|1996-06-11|1996-07-06|1996-06-12|TAKE BACK RETURN|FOB|sly furiously final deposits. +39623|1694|36|6|21|33509.49|0.09|0.00|N|O|1996-08-06|1996-07-24|1996-08-13|COLLECT COD|MAIL|ilent requ +39623|1189|62|7|17|18533.06|0.03|0.03|N|O|1996-09-12|1996-07-28|1996-09-25|DELIVER IN PERSON|SHIP|en theodolites sleep furiously ab +39648|1550|91|1|14|20321.70|0.03|0.06|R|F|1992-03-07|1992-02-29|1992-03-31|NONE|AIR|final accounts are boldly. p +39648|535|36|2|19|27275.07|0.02|0.04|R|F|1992-02-03|1992-03-30|1992-02-21|DELIVER IN PERSON|RAIL|hely about the final dep +39648|61|62|3|4|3844.24|0.05|0.01|R|F|1992-02-26|1992-04-03|1992-03-18|TAKE BACK RETURN|MAIL|ular excuses. ideas among the quickly spe +39648|1155|92|4|49|51751.35|0.08|0.08|R|F|1992-04-15|1992-02-24|1992-05-02|TAKE BACK RETURN|RAIL|ickly above the furi +39649|101|28|1|18|18019.80|0.08|0.02|R|F|1994-12-02|1995-01-16|1994-12-07|NONE|SHIP|l requests nag carefully +39649|814|14|2|12|20577.72|0.04|0.07|A|F|1995-02-05|1994-12-12|1995-02-07|NONE|REG AIR|lets. furiously +39649|525|86|3|35|49893.20|0.02|0.05|A|F|1995-01-18|1995-01-16|1995-01-25|COLLECT COD|SHIP|es cajole ca +39649|1407|86|4|41|53644.40|0.03|0.06|R|F|1994-11-18|1994-12-17|1994-12-11|TAKE BACK RETURN|MAIL|st the never express ideas. accounts haggl +39649|1260|72|5|25|29031.50|0.05|0.07|R|F|1995-01-07|1995-01-05|1995-01-12|DELIVER IN PERSON|TRUCK|pecial instr +39649|1850|51|6|37|64818.45|0.03|0.00|A|F|1994-12-25|1994-12-26|1994-12-26|NONE|FOB|lar deposits maintain carefully. regul +39649|1969|70|7|30|56128.80|0.03|0.06|R|F|1995-01-03|1994-12-08|1995-01-10|DELIVER IN PERSON|SHIP|ithely slyly express pinto +39650|1525|66|1|43|61340.36|0.01|0.05|R|F|1993-08-14|1993-09-18|1993-09-04|NONE|RAIL|refully silent instructions: fl +39650|311|40|2|2|2422.62|0.03|0.01|A|F|1993-10-06|1993-09-06|1993-10-12|NONE|REG AIR|its use. final +39650|1098|34|3|9|8991.81|0.10|0.07|R|F|1993-10-10|1993-10-26|1993-10-28|TAKE BACK RETURN|AIR| slyly ironic requests. carefu +39650|1114|87|4|28|28423.08|0.03|0.08|A|F|1993-10-14|1993-09-24|1993-10-19|COLLECT COD|RAIL|al foxes besides the fluffily +39650|1056|62|5|11|10527.55|0.04|0.08|A|F|1993-11-15|1993-10-23|1993-12-03|DELIVER IN PERSON|SHIP| requests shall have to haggle reques +39651|1685|86|1|8|12693.44|0.00|0.00|N|O|1997-01-07|1996-10-31|1997-01-25|TAKE BACK RETURN|RAIL|ronic theodolites +39651|1278|16|2|22|25943.94|0.07|0.07|N|O|1996-10-01|1996-11-22|1996-10-20|DELIVER IN PERSON|AIR|ut the even, silen +39651|483|13|3|12|16601.76|0.09|0.03|N|O|1996-11-08|1996-11-08|1996-11-29|DELIVER IN PERSON|AIR|edly regular deposits slee +39651|850|84|4|19|33266.15|0.08|0.00|N|O|1996-12-28|1996-11-29|1997-01-20|COLLECT COD|REG AIR|ages haggle quickly except the fi +39652|274|29|1|30|35228.10|0.08|0.08|A|F|1992-05-11|1992-06-28|1992-06-01|DELIVER IN PERSON|AIR|, even accounts sleep. furiously specia +39652|578|9|2|29|42878.53|0.09|0.00|R|F|1992-06-06|1992-06-26|1992-07-05|COLLECT COD|SHIP|egular, unusual dependencies +39652|344|73|3|18|22398.12|0.05|0.04|A|F|1992-08-17|1992-07-08|1992-09-02|TAKE BACK RETURN|SHIP| after the +39652|1926|27|4|34|62149.28|0.08|0.02|A|F|1992-07-17|1992-07-30|1992-08-14|NONE|MAIL|sly pending accounts nag after t +39652|983|18|5|44|82895.12|0.00|0.07|R|F|1992-08-28|1992-07-09|1992-09-25|COLLECT COD|MAIL|ntain furiously after the doggedl +39652|1122|23|6|29|29670.48|0.02|0.04|R|F|1992-08-29|1992-06-17|1992-09-26|NONE|TRUCK| above the s +39653|1019|25|1|21|19320.21|0.02|0.08|N|O|1997-12-23|1997-12-13|1998-01-05|DELIVER IN PERSON|REG AIR|y about the blithely bold deposits. fi +39653|1924|13|2|48|87644.16|0.08|0.00|N|O|1997-11-07|1997-12-14|1997-11-30|TAKE BACK RETURN|RAIL|uickly regul +39653|1149|86|3|28|29403.92|0.08|0.01|N|O|1997-11-15|1997-11-23|1997-12-08|COLLECT COD|REG AIR|ly even pinto beans cajole furi +39654|782|15|1|37|62262.86|0.05|0.04|A|F|1992-10-05|1992-10-31|1992-11-03|COLLECT COD|RAIL|ular theodolites int +39654|1474|92|2|50|68773.50|0.02|0.06|A|F|1992-11-19|1992-11-29|1992-12-07|TAKE BACK RETURN|FOB|ccording to +39655|375|4|1|13|16579.81|0.01|0.00|A|F|1992-06-11|1992-05-07|1992-06-29|DELIVER IN PERSON|FOB|kly platelets. q +39655|1621|4|2|31|47201.22|0.03|0.04|R|F|1992-04-10|1992-06-17|1992-05-07|DELIVER IN PERSON|AIR|leep. pendin +39655|948|17|3|9|16640.46|0.02|0.05|A|F|1992-04-07|1992-06-07|1992-04-19|DELIVER IN PERSON|RAIL| requests. quickly regular deposit +39655|761|62|4|44|73117.44|0.10|0.07|A|F|1992-06-09|1992-05-11|1992-07-07|NONE|FOB|dolites. brave +39655|1047|48|5|24|22752.96|0.10|0.03|A|F|1992-06-05|1992-05-15|1992-06-30|COLLECT COD|FOB|ly unusual pinto beans about the fluffil +39655|1486|4|6|36|49949.28|0.09|0.07|R|F|1992-06-02|1992-06-04|1992-06-06|COLLECT COD|RAIL|ve the pending packages-- flu +39680|958|27|1|8|14871.60|0.06|0.01|R|F|1993-09-05|1993-09-06|1993-09-13|COLLECT COD|SHIP| even packages before the furious +39680|1291|3|2|13|15499.77|0.06|0.06|A|F|1993-09-09|1993-07-25|1993-09-26|NONE|MAIL|mong the carefully bold ide +39680|794|27|3|14|23727.06|0.05|0.03|R|F|1993-09-18|1993-07-25|1993-10-11|COLLECT COD|AIR|lyly even excuses cajole +39681|1895|82|1|23|41328.47|0.09|0.06|N|O|1998-03-10|1998-03-26|1998-03-11|NONE|REG AIR|tealthy theodo +39681|1699|23|2|39|62426.91|0.01|0.00|N|O|1998-04-02|1998-03-21|1998-05-02|TAKE BACK RETURN|TRUCK| unwind. deposits cajole carefully. depos +39681|438|39|3|40|53537.20|0.09|0.05|N|O|1998-05-02|1998-03-01|1998-05-03|COLLECT COD|TRUCK|counts. furi +39681|71|47|4|24|23305.68|0.09|0.04|N|O|1998-03-11|1998-02-19|1998-03-29|DELIVER IN PERSON|FOB|ets boost carefully? platelets use c +39681|317|46|5|14|17042.34|0.08|0.01|N|O|1998-02-25|1998-03-16|1998-02-26|TAKE BACK RETURN|MAIL|dolites cajole express, even +39681|935|36|6|29|53241.97|0.04|0.06|N|O|1998-02-08|1998-03-01|1998-02-12|TAKE BACK RETURN|RAIL|after the quickly unusual asympt +39682|1815|2|1|3|5150.43|0.04|0.00|R|F|1994-02-20|1993-12-22|1994-03-01|NONE|RAIL| instructions. permanently e +39682|573|64|2|7|10314.99|0.00|0.04|R|F|1994-02-01|1994-02-01|1994-02-06|DELIVER IN PERSON|TRUCK| furiously. express, expres +39683|1330|45|1|14|17238.62|0.03|0.02|N|O|1995-11-05|1995-10-08|1995-11-06|COLLECT COD|SHIP|g ideas. bold instructions haggle f +39683|1748|49|2|12|19796.88|0.08|0.00|N|O|1995-11-14|1995-10-09|1995-11-21|DELIVER IN PERSON|FOB|iously ironic s +39683|478|37|3|27|37218.69|0.06|0.08|N|O|1995-11-01|1995-09-24|1995-11-11|NONE|TRUCK|he unusual, +39683|726|27|4|35|56935.20|0.00|0.03|N|O|1995-10-14|1995-09-11|1995-11-10|NONE|REG AIR|rding to the +39683|1498|77|5|24|33587.76|0.09|0.02|N|O|1995-09-08|1995-10-05|1995-09-26|DELIVER IN PERSON|AIR|ackages slee +39683|1371|86|6|40|50894.80|0.09|0.03|N|O|1995-11-12|1995-10-01|1995-12-04|TAKE BACK RETURN|MAIL| the furiously even pa +39683|1264|39|7|35|40784.10|0.10|0.04|N|O|1995-08-20|1995-10-04|1995-09-09|COLLECT COD|MAIL|beans. furiously pending pinto bean +39684|74|25|1|48|46755.36|0.02|0.01|N|O|1997-05-15|1997-06-03|1997-06-14|TAKE BACK RETURN|REG AIR|across the ironic deposit +39684|989|90|2|26|49139.48|0.05|0.05|N|O|1997-07-03|1997-05-25|1997-07-10|COLLECT COD|FOB|nal packages. carefully regular platelets +39684|661|93|3|3|4684.98|0.06|0.03|N|O|1997-04-27|1997-05-20|1997-05-23|NONE|MAIL|rding to the accounts haggle s +39684|1620|3|4|6|9129.72|0.00|0.05|N|O|1997-05-04|1997-06-24|1997-05-12|TAKE BACK RETURN|SHIP|ly above the blithely sil +39684|1252|90|5|29|33444.25|0.00|0.05|N|O|1997-07-19|1997-05-27|1997-07-27|TAKE BACK RETURN|AIR| blithe, regular ideas wake fu +39684|1134|71|6|6|6210.78|0.05|0.08|N|O|1997-04-27|1997-05-08|1997-05-06|TAKE BACK RETURN|RAIL|lyly unusual accounts cajole fluffil +39685|282|83|1|50|59114.00|0.07|0.06|N|O|1996-09-03|1996-09-15|1996-10-03|TAKE BACK RETURN|SHIP|gular, final e +39685|244|45|2|37|42336.88|0.00|0.06|N|O|1996-11-26|1996-09-22|1996-12-24|COLLECT COD|AIR|ymptotes a +39685|1730|31|3|21|34266.33|0.05|0.03|N|O|1996-09-28|1996-10-20|1996-10-24|TAKE BACK RETURN|FOB|al patterns. blithely sly +39686|887|88|1|45|80454.60|0.04|0.05|R|F|1992-07-03|1992-08-19|1992-07-26|DELIVER IN PERSON|SHIP| furiously at th +39686|1357|72|2|21|26425.35|0.09|0.00|A|F|1992-07-11|1992-09-03|1992-08-03|COLLECT COD|MAIL|e. theodolites detect about the slyly +39686|441|29|3|8|10731.52|0.08|0.06|R|F|1992-09-25|1992-08-21|1992-09-29|TAKE BACK RETURN|RAIL| the blithely pending packages sleep carefu +39686|1159|60|4|13|13781.95|0.02|0.06|A|F|1992-09-04|1992-07-12|1992-09-23|TAKE BACK RETURN|TRUCK|ar deposits detect carefully atop the +39686|1765|50|5|26|43335.76|0.08|0.01|A|F|1992-09-29|1992-08-11|1992-09-30|COLLECT COD|SHIP|erns affix carefully upo +39686|884|84|6|25|44622.00|0.04|0.01|R|F|1992-08-08|1992-08-18|1992-08-09|NONE|TRUCK|equests sublate +39686|856|56|7|46|80815.10|0.03|0.04|A|F|1992-08-13|1992-07-31|1992-09-04|TAKE BACK RETURN|TRUCK|the silent +39687|872|6|1|48|85097.76|0.05|0.00|R|F|1993-10-03|1993-09-11|1993-10-23|NONE|MAIL|uickly abov +39687|1949|50|2|13|24062.22|0.00|0.05|A|F|1993-07-20|1993-09-13|1993-08-19|COLLECT COD|AIR|sits wake. regular, e +39712|371|56|1|7|8899.59|0.01|0.08|R|F|1994-02-28|1994-04-29|1994-03-25|COLLECT COD|SHIP|above the carefully special pint +39712|981|84|2|38|71515.24|0.04|0.04|R|F|1994-05-12|1994-05-03|1994-05-15|COLLECT COD|SHIP|ts haggle along t +39713|711|44|1|10|16117.10|0.00|0.01|A|F|1994-03-10|1994-03-16|1994-03-30|TAKE BACK RETURN|FOB|requests. quickly stealthy accoun +39713|1071|72|2|47|45687.29|0.08|0.05|A|F|1994-04-11|1994-04-14|1994-04-16|NONE|FOB|ges haggle furiously inst +39713|1578|19|3|9|13316.13|0.07|0.08|R|F|1994-04-18|1994-03-17|1994-04-19|DELIVER IN PERSON|FOB|ely regular cour +39713|1368|83|4|46|58390.56|0.10|0.06|R|F|1994-01-27|1994-04-17|1994-02-15|DELIVER IN PERSON|FOB|yly. blithely final foxes sleep fluffily b +39713|676|8|5|16|25226.72|0.00|0.07|R|F|1994-02-17|1994-03-25|1994-02-23|COLLECT COD|RAIL|jole slyly about the carefully exp +39714|1336|51|1|8|9898.64|0.05|0.08|A|F|1994-10-25|1994-12-23|1994-11-23|NONE|RAIL|ely regula +39714|652|46|2|32|49684.80|0.05|0.06|R|F|1994-11-29|1994-12-03|1994-12-17|TAKE BACK RETURN|SHIP|lly ironic instructions integrate fluffil +39714|1120|21|3|23|23485.76|0.05|0.08|R|F|1995-01-28|1994-12-04|1995-02-17|NONE|MAIL|cies cajole quickly unusu +39715|116|95|1|48|48773.28|0.04|0.02|N|O|1997-05-06|1997-06-05|1997-05-29|NONE|AIR|lently unusual pac +39716|1575|56|1|27|39867.39|0.00|0.08|N|O|1996-08-25|1996-10-03|1996-09-23|TAKE BACK RETURN|RAIL|deposits haggle blithely along the furi +39716|1850|94|2|5|8759.25|0.08|0.00|N|O|1996-11-04|1996-10-26|1996-11-14|DELIVER IN PERSON|SHIP|pinto beans. furiously silent +39717|473|74|1|45|61806.15|0.04|0.03|A|F|1994-12-07|1995-01-01|1995-01-02|DELIVER IN PERSON|FOB| accounts. slyly slo +39717|929|30|2|31|56727.52|0.10|0.08|R|F|1995-03-07|1995-01-21|1995-03-12|COLLECT COD|AIR|tly unusual fox +39718|1364|41|1|16|20245.76|0.09|0.01|A|F|1995-01-05|1994-12-04|1995-01-19|TAKE BACK RETURN|TRUCK|es are slyly a +39718|689|83|2|47|74714.96|0.09|0.03|R|F|1994-12-24|1994-12-05|1995-01-21|TAKE BACK RETURN|SHIP|e evenly. slyly bold +39718|1293|68|3|27|32245.83|0.10|0.03|A|F|1995-01-11|1994-11-10|1995-01-23|DELIVER IN PERSON|AIR|nt instructions. blithely brave +39718|984|53|4|4|7539.92|0.04|0.08|R|F|1995-01-08|1994-11-08|1995-01-30|TAKE BACK RETURN|FOB|e despite the theodolites. furiously +39719|1025|31|1|1|926.02|0.09|0.07|N|O|1998-01-05|1997-12-28|1998-02-04|COLLECT COD|REG AIR|ions. ironic dep +39719|729|94|2|45|73337.40|0.04|0.01|N|O|1998-03-14|1998-01-18|1998-04-12|DELIVER IN PERSON|FOB| beans. pen +39719|536|97|3|44|63207.32|0.09|0.00|N|O|1998-01-05|1998-01-21|1998-01-30|DELIVER IN PERSON|FOB|ges maintain along the s +39719|248|30|4|1|1148.24|0.03|0.01|N|O|1997-12-06|1998-01-07|1997-12-09|COLLECT COD|SHIP|y even accoun +39719|404|92|5|37|48262.80|0.00|0.01|N|O|1998-03-19|1998-02-13|1998-04-10|DELIVER IN PERSON|SHIP| at the blithely even +39744|1694|36|1|20|31913.80|0.10|0.05|A|F|1994-08-18|1994-08-14|1994-09-03|NONE|RAIL|s. bold foxes sleep around t +39744|1020|26|2|3|2763.06|0.07|0.00|A|F|1994-07-27|1994-10-02|1994-08-23|TAKE BACK RETURN|FOB|osits? bli +39744|1000|35|3|31|27931.00|0.10|0.05|R|F|1994-07-24|1994-09-02|1994-08-18|DELIVER IN PERSON|AIR|le quickly along the fluffil +39745|695|27|1|24|38296.56|0.09|0.08|N|O|1995-08-03|1995-07-13|1995-08-15|COLLECT COD|FOB|ecial, stealthy accounts detect quic +39745|1135|72|2|14|14505.82|0.02|0.08|N|F|1995-05-26|1995-06-23|1995-06-23|NONE|REG AIR|y ironic deposits wake carefully. even, re +39745|912|47|3|17|30819.47|0.02|0.00|A|F|1995-05-15|1995-07-02|1995-05-26|COLLECT COD|SHIP|. pending requests wake quic +39745|1138|75|4|44|45721.72|0.03|0.03|N|O|1995-07-13|1995-07-10|1995-08-07|DELIVER IN PERSON|FOB|the accounts. furiously regular orbits hag +39745|1363|78|5|36|45516.96|0.06|0.00|A|F|1995-05-24|1995-06-28|1995-06-06|TAKE BACK RETURN|RAIL|w under the blithe +39745|653|16|6|13|20197.45|0.01|0.07|N|O|1995-07-25|1995-07-11|1995-08-03|COLLECT COD|SHIP| the regular frets sleep furiousl +39746|1321|98|1|26|31780.32|0.07|0.06|N|O|1997-02-18|1997-01-26|1997-03-01|NONE|TRUCK| blithely regular ideas haggle blithel +39746|1542|63|2|10|14435.40|0.01|0.00|N|O|1997-01-26|1996-12-26|1997-02-18|DELIVER IN PERSON|FOB|the furiousl +39746|351|8|3|10|12513.50|0.06|0.02|N|O|1996-12-14|1997-02-13|1996-12-29|NONE|MAIL|o the pending, regular theodolites caj +39747|684|47|1|18|28524.24|0.09|0.08|N|O|1997-10-03|1997-09-14|1997-10-27|COLLECT COD|SHIP|posits haggle carefully final instructions +39747|103|82|2|11|11034.10|0.00|0.06|N|O|1997-10-28|1997-08-06|1997-11-16|NONE|MAIL|y final instructions detect among the qu +39748|955|24|1|44|81661.80|0.08|0.07|N|O|1995-06-30|1995-07-17|1995-07-24|DELIVER IN PERSON|MAIL|ounts haggle finally according to the regul +39749|1213|51|1|15|16713.15|0.06|0.00|A|F|1993-08-05|1993-09-12|1993-08-12|NONE|MAIL|ackages. platelets +39749|1250|88|2|30|34537.50|0.02|0.05|R|F|1993-07-13|1993-08-26|1993-07-18|TAKE BACK RETURN|FOB|ver final deposi +39749|1864|8|3|43|75931.98|0.05|0.03|R|F|1993-10-03|1993-09-18|1993-10-07|TAKE BACK RETURN|FOB|egular pinto beans eat fluffily among +39749|2000|45|4|36|32472.00|0.06|0.03|A|F|1993-10-15|1993-08-15|1993-10-22|COLLECT COD|FOB|ccounts. reg +39749|1516|57|5|23|32602.73|0.04|0.06|R|F|1993-10-03|1993-09-23|1993-10-26|NONE|SHIP|e blithely final accounts. slyly ironic r +39749|236|37|6|1|1136.23|0.02|0.07|A|F|1993-10-05|1993-09-16|1993-10-06|NONE|TRUCK|uriously regular instructions bo +39749|1947|80|7|40|73957.60|0.06|0.06|R|F|1993-07-23|1993-08-31|1993-08-13|NONE|REG AIR|fter the accounts. bold asymp +39750|1897|41|1|31|55765.59|0.00|0.05|R|F|1994-06-24|1994-05-03|1994-07-02|COLLECT COD|TRUCK| ironic pinto beans nag furiously. f +39751|1322|61|1|40|48932.80|0.10|0.04|A|F|1993-06-09|1993-05-28|1993-06-12|TAKE BACK RETURN|REG AIR| furiously iron +39751|198|25|2|13|14276.47|0.04|0.08|R|F|1993-05-14|1993-04-17|1993-05-21|COLLECT COD|FOB| ideas. regula +39751|390|19|3|18|23227.02|0.07|0.08|A|F|1993-06-13|1993-05-12|1993-07-12|TAKE BACK RETURN|RAIL|uffily regular d +39776|1931|20|1|6|10997.58|0.07|0.07|R|F|1994-07-11|1994-08-23|1994-07-22|COLLECT COD|REG AIR|nal asymptotes cajole alongside of the d +39776|1189|90|2|49|53418.82|0.05|0.05|A|F|1994-09-19|1994-08-16|1994-09-28|NONE|AIR|ep slyly furiously fluffy foxes. pend +39776|1932|77|3|49|89862.57|0.09|0.08|R|F|1994-07-19|1994-08-01|1994-07-22|COLLECT COD|MAIL|es play somas; deposi +39776|549|80|4|26|37688.04|0.06|0.08|R|F|1994-07-29|1994-08-10|1994-08-02|TAKE BACK RETURN|TRUCK|fily bold acco +39777|1038|74|1|30|28170.90|0.09|0.01|N|O|1996-07-09|1996-06-26|1996-07-18|TAKE BACK RETURN|MAIL|lly pending accounts. bold i +39777|484|72|2|25|34612.00|0.05|0.06|N|O|1996-06-22|1996-07-01|1996-07-22|TAKE BACK RETURN|SHIP|uctions boost daringly furiousl +39777|526|57|3|40|57060.80|0.02|0.01|N|O|1996-05-09|1996-06-26|1996-05-11|TAKE BACK RETURN|FOB|ans. blithely express deposits are quic +39777|1011|47|4|24|21888.24|0.05|0.00|N|O|1996-06-07|1996-06-21|1996-06-28|DELIVER IN PERSON|FOB| the slyly special accounts boost c +39777|1986|75|5|42|79295.16|0.08|0.04|N|O|1996-05-03|1996-06-03|1996-05-22|DELIVER IN PERSON|MAIL|ickly bold instructions along the quickl +39777|1776|3|6|49|82210.73|0.08|0.07|N|O|1996-07-28|1996-06-23|1996-08-06|COLLECT COD|RAIL|tterns. blithely ironic instructions +39778|1310|87|1|26|31494.06|0.09|0.02|A|F|1992-10-10|1992-12-09|1992-11-09|COLLECT COD|MAIL|ep pending theodolit +39779|1073|74|1|9|8766.63|0.09|0.00|R|F|1994-04-10|1994-03-20|1994-04-11|NONE|SHIP|hy dugouts use carefully. carefully +39779|1406|24|2|37|48373.80|0.05|0.00|A|F|1994-02-14|1994-04-06|1994-03-04|NONE|AIR|ng the final, pending requests. express +39779|41|67|3|30|28231.20|0.10|0.07|R|F|1994-03-08|1994-04-09|1994-03-10|NONE|MAIL|requests sleep blithely above the silent re +39779|1609|92|4|48|72508.80|0.05|0.06|A|F|1994-05-24|1994-03-18|1994-06-13|COLLECT COD|AIR|packages. theodolites above the fu +39779|1356|71|5|16|20117.60|0.04|0.06|A|F|1994-03-09|1994-04-03|1994-03-25|NONE|RAIL| slyly fluffily express instructions. +39780|207|8|1|14|15500.80|0.01|0.07|A|F|1994-06-11|1994-09-01|1994-07-01|NONE|REG AIR|closely silent foxes. carefully silent pack +39780|615|16|2|46|69718.06|0.02|0.01|A|F|1994-08-05|1994-08-02|1994-09-01|TAKE BACK RETURN|RAIL|ly ironic foxes affix quic +39780|36|62|3|29|27144.87|0.05|0.01|A|F|1994-07-23|1994-08-05|1994-07-28|COLLECT COD|MAIL|osits. bold courts hind +39780|1789|32|4|18|30434.04|0.02|0.00|A|F|1994-09-25|1994-08-30|1994-10-19|TAKE BACK RETURN|SHIP|y according to the +39780|890|90|5|24|42981.36|0.06|0.00|A|F|1994-06-25|1994-07-13|1994-07-19|COLLECT COD|FOB|ironic requests haggle final p +39780|1196|33|6|31|34012.89|0.05|0.05|A|F|1994-09-04|1994-07-29|1994-09-10|NONE|SHIP|old pinto beans. ironic realms sleep b +39780|1066|37|7|20|19341.20|0.09|0.01|A|F|1994-10-01|1994-07-13|1994-10-11|NONE|SHIP|regular courts. quickly fin +39781|602|65|1|8|12020.80|0.09|0.03|N|O|1996-11-19|1996-10-19|1996-11-23|TAKE BACK RETURN|MAIL|s requests! accounts hag +39781|1358|59|2|19|23927.65|0.09|0.04|N|O|1996-11-26|1996-11-12|1996-12-06|NONE|TRUCK|ole slyly final pa +39781|98|74|3|2|1996.18|0.08|0.02|N|O|1996-10-22|1996-10-08|1996-11-08|DELIVER IN PERSON|TRUCK|snooze blithely thin foxe +39781|1379|18|4|39|49934.43|0.08|0.08|N|O|1996-10-03|1996-11-30|1996-10-31|NONE|REG AIR|efully fin +39781|336|21|5|21|25962.93|0.05|0.04|N|O|1996-10-06|1996-11-24|1996-10-21|COLLECT COD|REG AIR|furiously regula +39781|1669|70|6|10|15706.60|0.04|0.04|N|O|1996-11-21|1996-11-09|1996-12-04|NONE|REG AIR|as are slyly furiously silent +39781|329|58|7|42|51631.44|0.01|0.03|N|O|1996-12-05|1996-10-28|1996-12-17|COLLECT COD|FOB|ily furiously ironic re +39782|391|48|1|12|15496.68|0.05|0.05|N|O|1997-07-07|1997-09-06|1997-07-16|DELIVER IN PERSON|FOB|o beans cajol +39782|434|22|2|40|53377.20|0.00|0.01|N|O|1997-09-22|1997-08-21|1997-09-27|NONE|FOB|p the daringly final dependencies? furi +39782|124|77|3|46|47109.52|0.05|0.02|N|O|1997-08-11|1997-08-20|1997-08-15|TAKE BACK RETURN|RAIL|into beans +39783|944|79|1|20|36898.80|0.02|0.03|A|F|1992-10-31|1992-11-10|1992-11-25|TAKE BACK RETURN|RAIL|posits cajole +39783|1794|37|2|25|42394.75|0.09|0.01|R|F|1992-10-21|1992-12-02|1992-11-07|DELIVER IN PERSON|REG AIR|usual somas? slyly pending platelet +39783|1947|48|3|15|27734.10|0.09|0.04|R|F|1992-11-22|1992-11-24|1992-11-30|COLLECT COD|MAIL|re furiously. unusual deposits nod bli +39783|213|14|4|25|27830.25|0.09|0.08|R|F|1992-11-19|1992-10-27|1992-11-28|TAKE BACK RETURN|FOB|unts are blithely after the expr +39783|1050|86|5|13|12363.65|0.04|0.02|A|F|1992-09-27|1992-10-22|1992-10-21|COLLECT COD|AIR|nto beans are. +39808|1555|36|1|12|17478.60|0.09|0.07|R|F|1992-11-22|1992-11-01|1992-12-19|NONE|TRUCK|lithely according to the expre +39808|256|84|2|47|54343.75|0.10|0.00|A|F|1992-10-31|1992-10-16|1992-11-22|COLLECT COD|SHIP| unusual pains. even, pending ideas haggl +39808|665|66|3|21|32878.86|0.09|0.07|R|F|1992-11-23|1992-10-28|1992-12-16|COLLECT COD|MAIL|t carefully according to the qu +39808|188|89|4|43|46791.74|0.10|0.06|R|F|1992-10-22|1992-10-17|1992-10-24|TAKE BACK RETURN|TRUCK| furiously +39808|531|62|5|28|40082.84|0.06|0.07|R|F|1992-09-24|1992-12-01|1992-09-30|DELIVER IN PERSON|REG AIR|scapades wake slyly final, ironic foxes. fu +39808|65|41|6|27|26056.62|0.10|0.01|R|F|1992-10-14|1992-11-04|1992-11-02|NONE|MAIL|bove the accounts haggle blithely f +39808|1410|11|7|23|30162.43|0.03|0.02|A|F|1992-11-14|1992-10-23|1992-11-24|DELIVER IN PERSON|AIR|onic accounts sleep +39809|121|100|1|7|7147.84|0.07|0.03|N|O|1998-05-11|1998-04-19|1998-05-23|COLLECT COD|REG AIR|fully along the sly +39809|407|66|2|30|39222.00|0.10|0.02|N|O|1998-04-21|1998-04-16|1998-05-20|COLLECT COD|MAIL| furiously even platelets +39809|2|28|3|41|36982.00|0.06|0.04|N|O|1998-04-20|1998-05-22|1998-05-01|DELIVER IN PERSON|TRUCK| the slowly regular +39809|989|90|4|9|17009.82|0.00|0.01|N|O|1998-06-07|1998-05-10|1998-07-02|COLLECT COD|AIR|odolites. slyly bold ac +39810|35|61|1|42|39271.26|0.08|0.01|N|O|1998-01-16|1997-12-02|1998-01-29|DELIVER IN PERSON|MAIL|. slyly express pack +39811|1525|26|1|19|27103.88|0.02|0.08|N|O|1997-02-19|1997-03-05|1997-03-08|TAKE BACK RETURN|MAIL|ilent requests are slyly. platelets slee +39812|893|27|1|32|57404.48|0.01|0.06|A|F|1994-07-13|1994-08-12|1994-08-03|COLLECT COD|REG AIR|r asymptotes. enticingly +39812|1698|40|2|29|46391.01|0.05|0.08|A|F|1994-10-18|1994-07-23|1994-11-12|COLLECT COD|RAIL|ithely ironic pinto beans nag +39812|1430|48|3|41|54588.63|0.06|0.04|A|F|1994-08-24|1994-08-03|1994-09-16|TAKE BACK RETURN|REG AIR|s? quickly pending ideas ar +39812|1430|48|4|35|46600.05|0.00|0.01|R|F|1994-10-11|1994-08-07|1994-10-29|COLLECT COD|MAIL|lent requests play furiou +39812|1963|8|5|34|63408.64|0.03|0.08|R|F|1994-09-17|1994-08-06|1994-10-08|TAKE BACK RETURN|AIR|ounts. ironic dependencies wake special +39813|958|93|1|45|83652.75|0.09|0.01|R|F|1992-03-16|1992-03-24|1992-04-13|TAKE BACK RETURN|FOB|ndencies after the pending requests af +39813|1499|78|2|13|18206.37|0.02|0.04|A|F|1992-03-18|1992-03-14|1992-03-26|TAKE BACK RETURN|AIR|efully ironic accounts. fluffily final +39814|831|65|1|1|1731.83|0.06|0.06|R|F|1993-04-18|1993-03-05|1993-05-04|COLLECT COD|SHIP| special deposits. pending, ironic foxe +39814|446|76|2|33|44432.52|0.06|0.02|R|F|1993-04-17|1993-02-25|1993-05-06|TAKE BACK RETURN|AIR|thely. carefully daring orbits hagg +39814|912|15|3|47|85206.77|0.03|0.00|A|F|1993-01-23|1993-03-09|1993-02-08|TAKE BACK RETURN|AIR|s cajole slyly after the ironic requ +39814|1807|94|4|14|23923.20|0.08|0.02|A|F|1993-04-22|1993-04-13|1993-05-13|COLLECT COD|REG AIR|y regular asymptotes. ironic platelets +39814|1737|22|5|35|57355.55|0.05|0.00|R|F|1993-05-06|1993-02-21|1993-05-21|TAKE BACK RETURN|AIR|. ironic packages doze b +39815|1067|3|1|17|16457.02|0.05|0.05|R|F|1994-07-18|1994-07-02|1994-07-26|COLLECT COD|FOB|nic accounts dazzle. slyly pending p +39815|1530|71|2|23|32925.19|0.00|0.04|R|F|1994-07-16|1994-06-16|1994-07-23|TAKE BACK RETURN|RAIL|according to the carefully final asympt +39815|1210|22|3|33|36669.93|0.01|0.03|A|F|1994-08-05|1994-06-17|1994-08-09|DELIVER IN PERSON|RAIL|y unusual requests. carefully ironic +39815|884|51|4|50|89244.00|0.09|0.07|R|F|1994-06-04|1994-05-10|1994-06-19|NONE|RAIL|ix careful +39815|1607|49|5|18|27154.80|0.02|0.04|A|F|1994-05-17|1994-06-26|1994-05-19|TAKE BACK RETURN|RAIL|hinly regula +39840|107|60|1|48|48340.80|0.07|0.01|N|O|1996-03-11|1996-04-08|1996-03-29|TAKE BACK RETURN|SHIP|hy foxes. caref +39840|1366|43|2|8|10138.88|0.02|0.00|N|O|1996-02-12|1996-05-02|1996-03-11|DELIVER IN PERSON|TRUCK|ructions hang +39840|505|6|3|35|49192.50|0.10|0.08|N|O|1996-03-08|1996-03-10|1996-03-11|COLLECT COD|FOB|unusual ide +39840|1017|88|4|19|17442.19|0.01|0.02|N|O|1996-05-08|1996-04-01|1996-05-21|DELIVER IN PERSON|MAIL|quests cajole across the caref +39840|1334|49|5|29|35824.57|0.02|0.06|N|O|1996-05-20|1996-04-01|1996-05-23|COLLECT COD|RAIL| deposits. sometimes even requests +39840|243|98|6|8|9145.92|0.06|0.05|N|O|1996-04-11|1996-04-15|1996-04-19|DELIVER IN PERSON|FOB|ironic requests detect carefully re +39840|420|21|7|9|11883.78|0.02|0.05|N|O|1996-05-03|1996-03-18|1996-05-05|COLLECT COD|FOB|carefully regular requests. re +39841|103|30|1|4|4012.40|0.05|0.05|R|F|1993-04-24|1993-03-04|1993-05-02|NONE|SHIP|pinto beans. p +39841|829|63|2|12|20757.84|0.03|0.04|A|F|1993-03-31|1993-03-04|1993-04-01|NONE|RAIL|nal platelets a +39842|110|11|1|11|11111.21|0.09|0.03|A|F|1994-02-19|1994-02-27|1994-03-11|TAKE BACK RETURN|RAIL|packages across the pending +39842|1543|64|2|16|23112.64|0.10|0.01|A|F|1994-01-19|1994-03-05|1994-02-09|COLLECT COD|AIR|ts cajole carefully blith +39842|1458|98|3|21|28548.45|0.10|0.02|A|F|1994-03-17|1994-01-31|1994-04-16|DELIVER IN PERSON|REG AIR|mptotes. unu +39842|519|50|4|44|62458.44|0.04|0.02|A|F|1994-04-06|1994-02-08|1994-04-07|COLLECT COD|RAIL|r accounts. slyly even excuses kindl +39842|1274|12|5|41|48186.07|0.09|0.08|A|F|1994-04-04|1994-02-16|1994-04-08|COLLECT COD|TRUCK|de of the slyly ironic asymptotes +39843|1141|50|1|35|36474.90|0.09|0.01|A|F|1994-11-05|1994-10-08|1994-11-27|COLLECT COD|SHIP|ckages. even ideas cajole across the +39843|643|37|2|10|15436.40|0.04|0.00|A|F|1994-11-01|1994-10-02|1994-11-13|DELIVER IN PERSON|TRUCK|final deposits was furiou +39843|919|20|3|25|45497.75|0.10|0.08|R|F|1994-12-26|1994-09-30|1995-01-12|TAKE BACK RETURN|RAIL|l ideas. slyly regular sauternes are alon +39843|1314|53|4|50|60765.50|0.02|0.05|A|F|1994-10-10|1994-11-25|1994-10-20|DELIVER IN PERSON|RAIL| special deposit +39844|545|36|1|50|72277.00|0.01|0.04|R|F|1994-12-13|1995-02-27|1995-01-08|COLLECT COD|FOB|t blithely alongside of the express, regul +39844|1619|43|2|6|9123.66|0.03|0.05|A|F|1995-02-17|1995-02-22|1995-03-09|DELIVER IN PERSON|FOB|ly according to the quickly +39844|1988|89|3|34|64259.32|0.06|0.07|R|F|1995-03-14|1995-01-18|1995-03-25|DELIVER IN PERSON|AIR|the furiously si +39844|1306|7|4|42|50706.60|0.07|0.06|R|F|1995-02-06|1995-01-12|1995-02-09|DELIVER IN PERSON|SHIP|eodolites. even, regula +39844|753|18|5|8|13230.00|0.02|0.05|R|F|1994-12-16|1995-02-28|1995-01-04|DELIVER IN PERSON|SHIP|lar instructions wake furiously alon +39844|1930|31|6|31|56789.83|0.02|0.04|A|F|1995-02-19|1995-01-20|1995-03-11|DELIVER IN PERSON|REG AIR|s. regular, furio +39844|1099|100|7|25|25002.25|0.08|0.04|A|F|1995-03-19|1995-01-18|1995-03-31|COLLECT COD|TRUCK|unts. unusual, quiet pinto beans na +39845|195|96|1|33|36141.27|0.08|0.08|R|F|1994-10-12|1994-10-25|1994-10-16|NONE|MAIL|r the ironic excuses wake abo +39845|1452|31|2|37|50077.65|0.03|0.06|R|F|1994-10-07|1994-10-31|1994-10-16|COLLECT COD|SHIP|ending excuse +39845|1592|33|3|22|32858.98|0.07|0.08|A|F|1994-11-08|1994-10-27|1994-12-05|NONE|TRUCK|. unusual, r +39846|575|66|1|37|54596.09|0.08|0.01|R|F|1994-06-17|1994-04-04|1994-07-11|COLLECT COD|FOB|dolites integrate alongside of the +39846|1548|29|2|15|21743.10|0.08|0.08|A|F|1994-05-27|1994-04-21|1994-06-07|TAKE BACK RETURN|AIR|uses against the +39846|492|93|3|50|69624.50|0.08|0.04|A|F|1994-05-29|1994-05-14|1994-06-20|TAKE BACK RETURN|RAIL|s. requests are +39846|112|91|4|18|18217.98|0.06|0.06|R|F|1994-05-11|1994-05-08|1994-05-28|NONE|TRUCK|arefully silent packages. even, final +39847|1897|84|1|1|1798.89|0.10|0.00|A|F|1993-05-15|1993-06-25|1993-05-17|NONE|FOB|ss the regular accounts x-ray blithely a +39847|374|31|2|2|2548.74|0.01|0.08|A|F|1993-06-29|1993-05-10|1993-07-05|TAKE BACK RETURN|REG AIR|ages. even, +39847|580|11|3|37|54781.46|0.09|0.02|A|F|1993-04-12|1993-06-15|1993-04-18|COLLECT COD|TRUCK|into beans are always depo +39847|1294|95|4|22|26296.38|0.09|0.01|A|F|1993-06-18|1993-06-25|1993-07-10|COLLECT COD|REG AIR|lar escapade +39847|1685|27|5|31|49187.08|0.09|0.00|A|F|1993-05-01|1993-06-15|1993-05-03|TAKE BACK RETURN|TRUCK|across the +39847|314|15|6|43|52215.33|0.09|0.06|A|F|1993-05-19|1993-05-13|1993-06-10|DELIVER IN PERSON|FOB|e across the busily final idea +39847|730|31|7|14|22830.22|0.02|0.03|A|F|1993-08-04|1993-06-22|1993-08-09|TAKE BACK RETURN|AIR|carefully after th +39872|1931|64|1|46|84314.78|0.01|0.05|A|F|1993-06-02|1993-05-01|1993-06-25|NONE|SHIP|al accounts at the even, t +39872|1052|58|2|25|23826.25|0.04|0.02|R|F|1993-05-21|1993-05-22|1993-06-13|TAKE BACK RETURN|REG AIR|telets mai +39872|898|32|3|48|86346.72|0.03|0.04|A|F|1993-06-19|1993-04-09|1993-07-04|TAKE BACK RETURN|SHIP|unts. final theodoli +39872|154|81|4|1|1054.15|0.05|0.02|A|F|1993-06-23|1993-05-07|1993-07-15|COLLECT COD|RAIL| slyly final accounts nag care +39873|1913|46|1|30|54447.30|0.04|0.08|R|F|1992-05-14|1992-05-13|1992-05-25|TAKE BACK RETURN|AIR|c courts. blithely regular instructi +39874|976|45|1|26|48801.22|0.10|0.02|N|O|1996-02-28|1996-04-18|1996-03-04|NONE|AIR|lly regular p +39874|538|39|2|10|14385.30|0.00|0.07|N|O|1996-04-26|1996-04-28|1996-05-22|NONE|REG AIR|deposits haggle ex +39874|976|79|3|12|22523.64|0.01|0.06|N|O|1996-06-23|1996-03-30|1996-07-06|COLLECT COD|FOB|s wake blithely. fluffi +39875|1832|62|1|42|72820.86|0.10|0.00|R|F|1993-03-08|1993-03-28|1993-04-02|NONE|SHIP|old packages solve slyly according t +39875|965|68|2|10|18659.60|0.10|0.08|A|F|1993-05-20|1993-04-13|1993-06-08|TAKE BACK RETURN|FOB|packages affix +39875|1233|45|3|24|27221.52|0.10|0.01|A|F|1993-04-21|1993-03-14|1993-04-22|NONE|TRUCK|y silent deposits. silent, even deposits +39876|1798|83|1|3|5099.37|0.00|0.08|R|F|1992-07-02|1992-05-26|1992-07-18|TAKE BACK RETURN|SHIP|reach fluffi +39876|1178|87|2|18|19425.06|0.00|0.08|R|F|1992-06-16|1992-06-27|1992-07-03|COLLECT COD|TRUCK|equests. fluffily special deposits +39876|505|36|3|30|42165.00|0.02|0.03|A|F|1992-06-09|1992-07-06|1992-07-07|NONE|MAIL|usly after the deposits. slyly +39876|942|43|4|2|3685.88|0.02|0.00|A|F|1992-06-30|1992-06-29|1992-07-27|DELIVER IN PERSON|TRUCK|inal foxes use across the bold instructi +39876|1677|78|5|1|1578.67|0.05|0.08|R|F|1992-06-19|1992-06-18|1992-06-29|DELIVER IN PERSON|REG AIR|ymptotes sleep f +39876|218|46|6|12|13418.52|0.09|0.02|A|F|1992-06-13|1992-05-20|1992-06-16|COLLECT COD|SHIP| carefully regula +39877|23|49|1|45|41535.90|0.08|0.05|R|F|1992-10-27|1992-10-14|1992-11-25|NONE|FOB|c accounts. ironic, +39877|1341|18|2|26|32300.84|0.00|0.01|A|F|1992-08-25|1992-11-01|1992-09-18|DELIVER IN PERSON|TRUCK|ies. slyly unusual packages haggle caref +39877|208|90|3|25|27705.00|0.02|0.06|A|F|1992-09-29|1992-10-17|1992-10-21|COLLECT COD|REG AIR|y around the carefully +39877|1386|1|4|8|10299.04|0.04|0.07|A|F|1992-08-24|1992-09-22|1992-09-01|COLLECT COD|FOB|ress requests boost slyly regular gro +39877|1849|93|5|4|7003.36|0.02|0.05|R|F|1992-08-27|1992-10-10|1992-09-14|NONE|MAIL|d foxes-- regu +39877|762|27|6|21|34917.96|0.05|0.00|A|F|1992-10-17|1992-11-06|1992-11-13|TAKE BACK RETURN|AIR|ding pinto beans slee +39878|65|16|1|45|43427.70|0.07|0.07|A|F|1995-04-25|1995-04-19|1995-05-17|DELIVER IN PERSON|AIR|ly regular e +39878|264|92|2|44|51227.44|0.02|0.05|R|F|1995-03-18|1995-04-05|1995-03-30|COLLECT COD|FOB| ironic accounts wake furiously perman +39878|777|10|3|8|13422.16|0.10|0.04|R|F|1995-04-26|1995-04-30|1995-05-26|DELIVER IN PERSON|SHIP|s. deposits boost blithely. slyly ironic +39878|626|58|4|34|51905.08|0.00|0.03|N|O|1995-06-21|1995-05-26|1995-07-01|NONE|RAIL|ages. furiously pending deposits wak +39878|1103|40|5|3|3012.30|0.02|0.04|A|F|1995-03-29|1995-05-08|1995-04-01|DELIVER IN PERSON|SHIP|y quickly special pinto beans-- sl +39878|1101|2|6|35|35073.50|0.10|0.01|R|F|1995-04-23|1995-04-27|1995-05-13|TAKE BACK RETURN|MAIL|ress pinto b +39878|1530|51|7|23|32925.19|0.07|0.07|N|O|1995-06-29|1995-05-28|1995-07-16|COLLECT COD|SHIP|uriously special ideas. furiou +39879|274|75|1|17|19962.59|0.00|0.04|N|O|1997-01-13|1996-12-06|1997-01-21|TAKE BACK RETURN|MAIL| ironic ideas wake blithe +39879|835|2|2|42|72904.86|0.00|0.05|N|O|1997-01-15|1996-11-18|1997-02-14|TAKE BACK RETURN|FOB|ecoys. deposits cajo +39904|180|59|1|20|21603.60|0.06|0.02|A|F|1994-05-28|1994-03-07|1994-06-22|DELIVER IN PERSON|TRUCK|equests ca +39904|1978|67|2|11|20679.67|0.02|0.05|R|F|1994-02-17|1994-03-31|1994-02-27|TAKE BACK RETURN|REG AIR|e requests. carefu +39904|119|20|3|11|11210.21|0.08|0.05|A|F|1994-02-19|1994-04-17|1994-03-03|TAKE BACK RETURN|AIR|refully fin +39905|1417|35|1|25|32960.25|0.01|0.08|N|O|1997-07-02|1997-09-09|1997-07-04|COLLECT COD|RAIL|ic packages. regular requests sleep above +39905|61|62|2|36|34598.16|0.03|0.04|N|O|1997-07-30|1997-08-09|1997-08-22|NONE|TRUCK|eas for the special, bold pinto beans +39905|795|92|3|1|1695.79|0.05|0.04|N|O|1997-08-21|1997-08-22|1997-09-03|NONE|FOB|y enticing pinto beans wake +39905|1829|59|4|39|67501.98|0.02|0.02|N|O|1997-08-05|1997-07-23|1997-08-27|NONE|FOB|s. final pinto beans among the care +39905|598|59|5|1|1498.59|0.09|0.06|N|O|1997-06-26|1997-07-22|1997-07-23|TAKE BACK RETURN|SHIP|lowly express requests sleep a +39905|498|57|6|39|54541.11|0.03|0.00|N|O|1997-08-19|1997-09-05|1997-09-05|TAKE BACK RETURN|FOB|ly according to +39906|1306|21|1|19|22938.70|0.04|0.01|A|F|1994-06-04|1994-06-03|1994-06-22|DELIVER IN PERSON|SHIP|ully unusua +39906|26|2|2|40|37040.80|0.05|0.08|A|F|1994-03-27|1994-06-06|1994-04-06|DELIVER IN PERSON|FOB|egular ideas alongside of the deposits hagg +39907|695|96|1|8|12765.52|0.06|0.01|A|F|1993-12-21|1993-10-19|1994-01-02|COLLECT COD|FOB|e furiously even deposits. +39908|1060|66|1|7|6727.42|0.09|0.02|R|F|1994-07-19|1994-08-05|1994-07-27|COLLECT COD|FOB| cajole furiously furiously bold re +39908|419|78|2|39|51456.99|0.01|0.04|A|F|1994-08-17|1994-06-26|1994-09-11|COLLECT COD|RAIL|ress deposits +39908|1593|94|3|10|14945.90|0.10|0.01|A|F|1994-05-15|1994-06-30|1994-06-04|COLLECT COD|FOB|fully even patterns hagg +39908|1459|38|4|13|17685.85|0.10|0.06|A|F|1994-05-24|1994-06-23|1994-06-16|COLLECT COD|TRUCK| blithely thin deposits. carefu +39908|1336|37|5|25|30933.25|0.03|0.06|A|F|1994-06-14|1994-07-19|1994-06-27|COLLECT COD|TRUCK| instructions sublate slyly. furiously +39908|966|67|6|36|67210.56|0.03|0.06|R|F|1994-09-02|1994-06-16|1994-09-18|COLLECT COD|FOB|ckages. fluffily final hocke +39908|150|77|7|25|26253.75|0.10|0.07|R|F|1994-07-29|1994-07-31|1994-08-11|TAKE BACK RETURN|REG AIR|even packages use s +39909|1410|28|1|22|28851.02|0.09|0.03|A|F|1995-05-08|1995-04-03|1995-05-28|DELIVER IN PERSON|FOB|ar ideas. express packages i +39909|68|44|2|49|47434.94|0.10|0.05|A|F|1995-04-22|1995-05-15|1995-04-30|COLLECT COD|TRUCK| quickly even ideas about the slyly regu +39909|324|53|3|45|55094.40|0.09|0.07|N|O|1995-06-21|1995-04-22|1995-07-04|NONE|FOB|ng to the carefully unusu +39909|1754|81|4|30|49672.50|0.07|0.00|N|O|1995-06-25|1995-04-12|1995-06-29|COLLECT COD|AIR|as cajole. carefully reg +39909|1027|33|5|19|17632.38|0.00|0.03|N|F|1995-06-03|1995-05-02|1995-07-03|COLLECT COD|REG AIR|lent packages. requests are +39909|469|99|6|7|9586.22|0.00|0.00|N|F|1995-06-06|1995-05-07|1995-07-03|COLLECT COD|RAIL|even deposits. fluffily b +39910|88|39|1|50|49404.00|0.10|0.01|A|F|1992-11-03|1992-10-18|1992-11-10|DELIVER IN PERSON|REG AIR|ecial accounts. quickly bol +39910|1107|16|2|50|50405.00|0.09|0.02|R|F|1992-10-16|1992-11-10|1992-10-23|TAKE BACK RETURN|REG AIR|es. instructions use blithely about the reg +39910|1133|42|3|42|43433.46|0.01|0.02|R|F|1992-10-17|1992-11-04|1992-10-25|TAKE BACK RETURN|FOB|accounts. enticing, sile +39910|448|7|4|36|48543.84|0.10|0.02|R|F|1992-09-16|1992-10-08|1992-09-24|COLLECT COD|AIR| furiously pending foxes haggle slyly +39910|1166|3|5|14|14940.24|0.08|0.01|A|F|1992-09-28|1992-09-22|1992-10-09|TAKE BACK RETURN|TRUCK|odolites wake carefully afte +39911|839|6|1|41|71333.03|0.07|0.07|N|O|1996-01-27|1996-03-22|1996-02-09|TAKE BACK RETURN|TRUCK|ts-- blithely bold requests alongside of +39936|1088|24|1|19|18792.52|0.00|0.08|N|O|1998-10-01|1998-08-14|1998-10-17|NONE|MAIL|even deposits. enticing, regul +39936|108|9|2|23|23186.30|0.05|0.05|N|O|1998-09-22|1998-08-17|1998-10-22|TAKE BACK RETURN|REG AIR|sts use blithely slyly +39937|420|8|1|1|1320.42|0.05|0.01|N|O|1995-07-10|1995-08-01|1995-08-08|COLLECT COD|FOB|nic ideas. fluffily ir +39937|804|38|2|41|69896.80|0.03|0.07|N|O|1995-08-30|1995-07-26|1995-09-14|NONE|TRUCK|lly regular packages sleep evenly +39937|1553|94|3|37|53818.35|0.06|0.08|N|F|1995-05-29|1995-07-31|1995-06-24|TAKE BACK RETURN|REG AIR|theodolites cajole carefully c +39937|714|11|4|20|32294.20|0.08|0.06|A|F|1995-06-09|1995-06-23|1995-06-17|NONE|MAIL|gular dependencies nag qui +39937|1100|6|5|50|50055.00|0.10|0.01|R|F|1995-05-25|1995-07-18|1995-05-29|NONE|RAIL|ven deposits. blithel +39937|1776|3|6|27|45299.79|0.04|0.06|A|F|1995-05-26|1995-08-09|1995-06-01|COLLECT COD|SHIP|structions a +39937|811|78|7|35|59913.35|0.06|0.05|N|O|1995-06-26|1995-08-20|1995-07-13|DELIVER IN PERSON|FOB|ages. slyly regular +39938|1411|90|1|30|39372.30|0.05|0.06|R|F|1992-08-03|1992-07-22|1992-08-30|NONE|SHIP|n the bold dinos h +39938|161|62|2|30|31834.80|0.07|0.02|A|F|1992-07-08|1992-08-29|1992-07-29|NONE|RAIL|oxes haggle. sly +39938|1966|67|3|35|65378.60|0.07|0.03|R|F|1992-07-12|1992-08-07|1992-07-27|NONE|FOB|ep carefully furiousl +39938|1474|53|4|10|13754.70|0.06|0.08|R|F|1992-07-20|1992-08-12|1992-08-02|DELIVER IN PERSON|FOB|ly unusual deposits according to t +39939|134|13|1|39|40331.07|0.07|0.02|A|F|1992-09-04|1992-10-07|1992-09-13|DELIVER IN PERSON|FOB|ven ideas wake. +39939|573|4|2|30|44207.10|0.03|0.01|A|F|1992-10-12|1992-10-24|1992-11-11|NONE|AIR| beans are slyly-- blithely ironic req +39939|668|31|3|29|45491.14|0.03|0.06|R|F|1992-08-21|1992-10-08|1992-09-20|TAKE BACK RETURN|FOB|r instructions sleep even, even +39939|1129|66|4|40|41204.80|0.10|0.01|A|F|1992-10-29|1992-08-27|1992-11-16|COLLECT COD|REG AIR| beans along +39939|2000|89|5|24|21648.00|0.06|0.02|R|F|1992-09-15|1992-08-31|1992-09-16|TAKE BACK RETURN|TRUCK|rious theodol +39940|1089|60|1|35|34652.80|0.10|0.06|N|O|1998-01-29|1997-12-13|1998-01-31|DELIVER IN PERSON|AIR|y express deposits. pending, +39940|469|28|2|2|2738.92|0.07|0.08|N|O|1998-01-31|1998-01-04|1998-02-18|COLLECT COD|REG AIR|structions wake against the ideas. furious +39941|249|31|1|6|6895.44|0.04|0.08|A|F|1995-01-29|1994-12-04|1995-02-15|NONE|AIR|o beans wake furiously among the furiously +39942|1716|17|1|22|35589.62|0.09|0.06|A|F|1992-01-25|1992-03-19|1992-01-26|COLLECT COD|RAIL|ly even instructions +39943|214|69|1|46|51253.66|0.01|0.03|A|F|1992-06-17|1992-08-24|1992-07-11|COLLECT COD|RAIL| hinder carefully around the regular, b +39943|1193|94|2|17|18601.23|0.04|0.04|R|F|1992-09-20|1992-07-12|1992-10-03|TAKE BACK RETURN|REG AIR|ound the ironic, ironic deposits. fin +39943|560|91|3|14|20447.84|0.06|0.04|R|F|1992-08-26|1992-08-20|1992-09-19|COLLECT COD|TRUCK|thely according to the carefully regu +39943|12|88|4|29|26448.29|0.01|0.07|A|F|1992-08-02|1992-08-07|1992-08-28|TAKE BACK RETURN|AIR|nding packages. slyly f +39943|961|96|5|33|61444.68|0.07|0.05|R|F|1992-09-25|1992-08-14|1992-09-27|DELIVER IN PERSON|MAIL| slyly. quickly spec +39943|326|11|6|34|41694.88|0.06|0.07|A|F|1992-07-18|1992-08-23|1992-08-05|COLLECT COD|REG AIR| around the ironic deposits +39968|1601|84|1|3|4507.80|0.07|0.00|N|O|1996-05-08|1996-03-27|1996-05-13|TAKE BACK RETURN|RAIL|. carefully f +39968|805|5|2|15|25587.00|0.00|0.08|N|O|1996-05-05|1996-04-02|1996-05-13|DELIVER IN PERSON|TRUCK| the carefully reg +39968|1172|45|3|47|50438.99|0.09|0.07|N|O|1996-04-18|1996-04-04|1996-04-25|COLLECT COD|REG AIR|equests around the fina +39968|1733|76|4|45|73562.85|0.04|0.04|N|O|1996-04-07|1996-02-12|1996-04-25|TAKE BACK RETURN|REG AIR|lyly bold dolphins boost blithely final +39968|1669|70|5|36|56543.76|0.04|0.08|N|O|1996-04-04|1996-02-22|1996-04-16|COLLECT COD|REG AIR|fully express foxes haggle. slyly special r +39968|1356|33|6|13|16345.55|0.01|0.05|N|O|1996-01-10|1996-03-04|1996-01-21|NONE|TRUCK|unts. even dependencies grow r +39969|707|40|1|42|67523.40|0.05|0.07|N|O|1998-04-21|1998-02-04|1998-05-15|COLLECT COD|AIR|s against the bl +39969|1003|39|2|24|21696.00|0.05|0.04|N|O|1998-04-24|1998-01-28|1998-05-20|NONE|REG AIR|ly sometimes ironic accounts. sl +39969|1377|54|3|32|40907.84|0.01|0.07|N|O|1998-02-06|1998-03-19|1998-02-12|TAKE BACK RETURN|AIR| final asymptotes cajole fluffily car +39969|511|12|4|31|43756.81|0.01|0.08|N|O|1998-04-05|1998-03-07|1998-04-28|DELIVER IN PERSON|SHIP|orses are quickly against the +39969|356|57|5|26|32665.10|0.03|0.01|N|O|1998-02-22|1998-02-13|1998-03-15|NONE|TRUCK|ily regular deposits ab +39969|498|57|6|46|64330.54|0.09|0.07|N|O|1998-01-02|1998-02-11|1998-01-15|TAKE BACK RETURN|TRUCK|ggle carefully furiou +39970|1439|18|1|32|42893.76|0.03|0.00|A|F|1994-07-13|1994-09-09|1994-07-29|NONE|REG AIR|counts play furiously. +39970|1754|97|2|10|16557.50|0.00|0.05|R|F|1994-08-03|1994-08-26|1994-08-19|DELIVER IN PERSON|RAIL|lar packages. blithely si +39971|945|14|1|17|31380.98|0.02|0.00|R|F|1994-01-12|1994-02-15|1994-02-03|DELIVER IN PERSON|REG AIR|dencies use carefull +39971|508|99|2|23|32395.50|0.07|0.01|R|F|1994-02-09|1994-04-06|1994-02-23|COLLECT COD|RAIL|s theodolites wake. care +39971|564|55|3|15|21968.40|0.09|0.02|A|F|1994-03-04|1994-03-31|1994-03-07|TAKE BACK RETURN|FOB|pinto beans haggle +39971|712|13|4|31|49994.01|0.04|0.01|A|F|1994-05-09|1994-04-04|1994-05-25|DELIVER IN PERSON|MAIL|s slyly above the carefully +39971|1659|83|5|30|46819.50|0.00|0.05|R|F|1994-02-16|1994-03-30|1994-03-10|NONE|RAIL|ickly silent requests. special theodolit +39971|1577|78|6|15|22178.55|0.03|0.06|R|F|1994-01-31|1994-03-19|1994-02-04|NONE|REG AIR|silently ironic +39971|422|10|7|6|7934.52|0.09|0.00|R|F|1994-02-17|1994-03-14|1994-03-12|NONE|RAIL|dependencies detect about the slyly pe +39972|1574|55|1|3|4426.71|0.02|0.00|A|F|1992-12-04|1992-11-23|1993-01-01|NONE|AIR| the blithely final requests. carefully +39972|1663|87|2|18|28163.88|0.08|0.04|R|F|1992-10-14|1992-11-18|1992-10-18|NONE|TRUCK| platelets along the regular, unusual a +39972|1686|10|3|22|34928.96|0.04|0.06|A|F|1992-10-08|1992-12-19|1992-10-22|DELIVER IN PERSON|FOB|s cajole blithely. +39972|1085|56|4|26|25638.08|0.04|0.08|A|F|1992-11-16|1992-12-17|1992-12-05|TAKE BACK RETURN|AIR|sly final instructions. fina +39972|184|63|5|18|19515.24|0.07|0.07|A|F|1993-01-06|1992-11-21|1993-01-12|COLLECT COD|FOB|ts. unusual deposits according to the +39972|553|44|6|19|27617.45|0.01|0.03|A|F|1992-11-09|1992-12-11|1992-11-14|TAKE BACK RETURN|RAIL| special packages. final, ironic pla +39973|731|96|1|35|57110.55|0.06|0.00|N|O|1997-12-17|1998-01-13|1998-01-15|DELIVER IN PERSON|SHIP| integrate against the regular, si +39973|986|89|2|39|73592.22|0.04|0.03|N|O|1998-01-12|1998-01-05|1998-02-10|TAKE BACK RETURN|MAIL|ag. final, +39973|979|82|3|19|35719.43|0.07|0.02|N|O|1998-02-10|1997-12-23|1998-02-17|TAKE BACK RETURN|FOB|. slyly pending packages wa +39973|892|92|4|40|71715.60|0.06|0.01|N|O|1998-02-27|1998-01-14|1998-02-28|DELIVER IN PERSON|RAIL|ckly. accounts affix thinly among the +39973|126|5|5|32|32835.84|0.04|0.07|N|O|1998-01-26|1998-01-16|1998-02-17|COLLECT COD|SHIP|y quickly ironic instr +39973|1800|85|6|19|32334.20|0.07|0.04|N|O|1997-11-21|1998-01-28|1997-11-29|NONE|SHIP|. carefully express +39974|405|93|1|47|61353.80|0.01|0.03|N|O|1996-05-25|1996-06-16|1996-05-28|NONE|AIR|efully. even, special accounts acro +39974|1922|11|2|47|85724.24|0.02|0.06|N|O|1996-05-19|1996-07-21|1996-05-21|NONE|MAIL|platelets are deposits. pinto +39974|410|98|3|14|18345.74|0.05|0.01|N|O|1996-08-14|1996-07-23|1996-09-11|DELIVER IN PERSON|TRUCK|ly unusual deposits. ca +39974|351|52|4|9|11262.15|0.10|0.06|N|O|1996-06-24|1996-07-09|1996-06-28|DELIVER IN PERSON|TRUCK| wake furiously. final deposits use +39975|719|16|1|10|16197.10|0.03|0.06|N|O|1998-07-22|1998-08-19|1998-08-09|COLLECT COD|TRUCK| bold pinto beans are slyl +39975|74|75|2|22|21429.54|0.08|0.03|N|O|1998-07-14|1998-09-06|1998-07-29|DELIVER IN PERSON|TRUCK|ymptotes. furiously spe +39975|898|99|3|36|64760.04|0.05|0.02|N|O|1998-10-17|1998-08-05|1998-11-15|COLLECT COD|RAIL| alongside of +39975|1913|2|4|29|52632.39|0.02|0.06|N|O|1998-10-26|1998-08-18|1998-10-29|DELIVER IN PERSON|TRUCK|s across the slyly regular din +39975|1169|70|5|38|40666.08|0.06|0.06|N|O|1998-09-09|1998-09-04|1998-10-09|DELIVER IN PERSON|TRUCK|o beans are slyly final id +39975|1388|65|6|3|3868.14|0.00|0.05|N|O|1998-07-04|1998-08-24|1998-07-22|NONE|AIR|e the final, final package +40000|1612|36|1|50|75680.50|0.08|0.01|A|F|1995-02-11|1995-03-29|1995-03-07|NONE|TRUCK| blithely slyly +40000|927|28|2|20|36558.40|0.08|0.07|R|F|1995-03-25|1995-03-27|1995-03-30|DELIVER IN PERSON|TRUCK|quickly bold foxes. silently even theodo +40001|1961|62|1|24|44711.04|0.04|0.02|N|F|1995-05-28|1995-04-25|1995-06-19|NONE|FOB|gular instructions? slyly even pinto beans +40001|647|48|2|32|49524.48|0.01|0.01|A|F|1995-05-05|1995-04-08|1995-06-01|NONE|RAIL|unusual, silent asymptotes. fi +40001|1335|74|3|15|18544.95|0.06|0.07|R|F|1995-04-13|1995-05-16|1995-05-07|TAKE BACK RETURN|SHIP|are after the quickly ironic dependencies. +40002|1567|8|1|33|48462.48|0.06|0.02|A|F|1994-02-26|1994-02-02|1994-03-21|TAKE BACK RETURN|TRUCK|slyly ironic courts us +40003|1256|68|1|4|4629.00|0.04|0.00|A|F|1994-03-16|1994-05-15|1994-03-27|DELIVER IN PERSON|RAIL|nic excuses nag slyly +40003|1023|94|2|50|46201.00|0.05|0.03|R|F|1994-06-29|1994-05-27|1994-07-07|COLLECT COD|FOB|sits are. grouches alo +40003|23|24|3|23|21229.46|0.00|0.05|R|F|1994-03-19|1994-05-22|1994-03-31|COLLECT COD|AIR|across the deposits are careful +40003|126|79|4|30|30783.60|0.02|0.05|A|F|1994-06-12|1994-05-25|1994-06-26|COLLECT COD|REG AIR|yly regular platelets. pending +40003|1873|60|5|48|85193.76|0.05|0.06|R|F|1994-04-20|1994-05-17|1994-05-20|TAKE BACK RETURN|MAIL|lphins. sometimes bold platelets are. pe +40003|107|8|6|18|18127.80|0.06|0.07|A|F|1994-04-20|1994-05-02|1994-05-07|COLLECT COD|FOB|oldly pending theodolites should use above +40003|96|97|7|20|19921.80|0.06|0.02|R|F|1994-05-21|1994-04-13|1994-06-02|COLLECT COD|TRUCK|ans about the silent, pendi +40004|433|34|1|30|40002.90|0.01|0.04|N|O|1997-05-11|1997-05-12|1997-06-06|COLLECT COD|TRUCK|es. silent accounts be +40004|1370|47|2|47|59754.39|0.03|0.06|N|O|1997-06-15|1997-05-14|1997-07-01|COLLECT COD|AIR|ajole alongside of the even reques +40005|854|55|1|23|40361.55|0.05|0.03|R|F|1993-08-19|1993-09-04|1993-09-11|TAKE BACK RETURN|RAIL|te carefully +40005|229|11|2|13|14679.86|0.08|0.03|A|F|1993-09-28|1993-09-26|1993-10-12|COLLECT COD|REG AIR|t pending deposi +40005|814|15|3|5|8574.05|0.05|0.02|R|F|1993-09-17|1993-09-12|1993-09-23|DELIVER IN PERSON|RAIL|totes; slyl +40005|332|17|4|39|48060.87|0.04|0.02|R|F|1993-11-05|1993-08-26|1993-11-30|NONE|FOB|ackages should have to cajole slyly aft +40005|1854|41|5|1|1755.85|0.04|0.02|R|F|1993-11-17|1993-08-27|1993-12-12|NONE|FOB|sits sleep theodolites! quickly +40006|1230|31|1|34|38461.82|0.09|0.04|A|F|1994-09-26|1994-08-23|1994-10-17|COLLECT COD|SHIP| the regular deposits. boldly even +40006|1839|26|2|6|10444.98|0.06|0.03|A|F|1994-10-15|1994-07-22|1994-10-29|NONE|RAIL|e special theodolites. +40007|1692|75|1|30|47810.70|0.07|0.06|R|F|1992-11-24|1992-10-09|1992-12-10|COLLECT COD|SHIP|arefully even pinto beans +40007|1656|80|2|15|23364.75|0.04|0.06|R|F|1992-12-01|1992-10-28|1992-12-29|COLLECT COD|SHIP|counts. enticing pinto beans around +40007|1944|33|3|6|11075.64|0.09|0.04|A|F|1992-09-10|1992-11-21|1992-09-21|TAKE BACK RETURN|RAIL|ccounts integrate thinly. slyly special +40007|188|89|4|47|51144.46|0.10|0.05|A|F|1992-09-06|1992-11-23|1992-09-15|TAKE BACK RETURN|MAIL|ckly? bold +40032|1437|77|1|8|10707.44|0.09|0.06|A|F|1993-02-13|1993-01-10|1993-02-19|NONE|REG AIR|structions cajole slyly +40032|1618|60|2|27|41029.47|0.04|0.03|R|F|1993-01-09|1993-02-06|1993-02-06|COLLECT COD|RAIL|ts. special, +40032|1544|85|3|37|53484.98|0.08|0.00|R|F|1992-12-11|1993-02-01|1993-01-02|TAKE BACK RETURN|MAIL|, regular foxes integrate +40032|1034|70|4|14|13090.42|0.02|0.08|R|F|1993-01-21|1993-02-10|1993-02-19|COLLECT COD|TRUCK|ost slyly! q +40032|306|63|5|34|41014.20|0.05|0.07|A|F|1992-12-10|1993-02-04|1992-12-25|COLLECT COD|RAIL| ideas. regular dependencies may sleep +40032|1710|53|6|49|78973.79|0.07|0.07|R|F|1992-12-08|1993-01-31|1993-01-01|NONE|REG AIR|ole regularly-- +40032|1211|12|7|6|6673.26|0.01|0.01|A|F|1993-02-12|1993-01-27|1993-02-13|TAKE BACK RETURN|MAIL| use always against the express, regular r +40033|250|32|1|15|17253.75|0.02|0.04|A|F|1994-01-28|1994-03-09|1994-02-25|TAKE BACK RETURN|REG AIR|ing requests cajole iro +40034|1660|84|1|36|56219.76|0.04|0.01|A|F|1995-05-25|1995-04-12|1995-06-08|COLLECT COD|REG AIR|e of the carefully bold packages. c +40034|898|65|2|5|8994.45|0.05|0.06|R|F|1995-04-12|1995-04-15|1995-04-17|DELIVER IN PERSON|TRUCK|riously unusual packa +40034|1871|1|3|21|37230.27|0.03|0.03|R|F|1995-03-17|1995-05-10|1995-04-07|TAKE BACK RETURN|REG AIR| ought to sleep blit +40035|1931|76|1|9|16496.37|0.01|0.03|N|O|1996-06-06|1996-05-29|1996-06-07|DELIVER IN PERSON|MAIL|unts. furiously close dependencies sle +40035|812|79|2|44|75363.64|0.05|0.04|N|O|1996-06-28|1996-04-25|1996-07-04|TAKE BACK RETURN|SHIP|uickly unus +40035|1430|31|3|47|62577.21|0.10|0.00|N|O|1996-03-22|1996-06-13|1996-04-20|TAKE BACK RETURN|AIR|ctions haggle afte +40035|948|83|4|15|27734.10|0.03|0.01|N|O|1996-05-24|1996-05-18|1996-06-03|COLLECT COD|AIR|final accoun +40036|1564|65|1|30|43966.80|0.02|0.00|R|F|1993-09-06|1993-08-27|1993-10-03|DELIVER IN PERSON|TRUCK|was. slyly enticing accounts cajole +40036|1782|9|2|48|80821.44|0.10|0.08|R|F|1993-08-22|1993-07-19|1993-09-05|TAKE BACK RETURN|AIR|ep. blithely fin +40036|738|71|3|16|26219.68|0.08|0.06|A|F|1993-07-12|1993-08-02|1993-07-22|TAKE BACK RETURN|MAIL|furiously daringly regul +40036|36|37|4|6|5616.18|0.03|0.07|R|F|1993-07-22|1993-08-22|1993-07-23|DELIVER IN PERSON|FOB|ss the furious +40036|513|44|5|24|33924.24|0.04|0.07|R|F|1993-08-20|1993-07-19|1993-09-11|NONE|RAIL| frets. pending, ironic packages are sl +40037|1212|87|1|40|44528.40|0.06|0.04|R|F|1993-08-15|1993-07-08|1993-08-18|DELIVER IN PERSON|FOB|ress, ironic theodol +40038|117|18|1|19|19325.09|0.03|0.08|N|O|1998-10-20|1998-09-25|1998-11-03|NONE|TRUCK|y. fluffily special requests nag furiousl +40038|1378|17|2|42|53733.54|0.00|0.04|N|O|1998-09-12|1998-09-10|1998-09-18|TAKE BACK RETURN|REG AIR|nt instructions hag +40038|571|32|3|39|57391.23|0.09|0.00|N|O|1998-08-18|1998-10-04|1998-09-13|DELIVER IN PERSON|MAIL| silent reque +40039|483|84|1|35|48421.80|0.04|0.03|R|F|1995-04-10|1995-02-19|1995-04-12|COLLECT COD|MAIL|c, ironic ide +40039|1082|83|2|7|6881.56|0.05|0.08|R|F|1994-12-17|1995-01-29|1994-12-29|NONE|REG AIR|uses breach furiously. r +40064|1449|50|1|3|4051.32|0.09|0.07|N|O|1997-07-25|1997-08-17|1997-08-06|COLLECT COD|AIR|inal theodolites wake. stealthy packa +40064|409|10|2|49|64160.60|0.09|0.08|N|O|1997-08-31|1997-08-18|1997-09-04|TAKE BACK RETURN|RAIL|uriously within the blithely final +40065|1136|73|1|5|5185.65|0.06|0.06|R|F|1992-02-24|1992-05-18|1992-03-06|TAKE BACK RETURN|AIR|ily quick foxes use blithely +40065|822|23|2|17|29287.94|0.05|0.01|R|F|1992-03-26|1992-04-28|1992-03-29|TAKE BACK RETURN|MAIL|uffily. regular acc +40065|1598|39|3|4|5998.36|0.02|0.06|A|F|1992-03-12|1992-03-27|1992-04-07|NONE|MAIL|ounts. ironic accounts solve abou +40065|1396|11|4|34|44111.26|0.10|0.02|A|F|1992-04-29|1992-05-13|1992-05-02|TAKE BACK RETURN|FOB|lar deposits boost sl +40065|193|94|5|11|12025.09|0.07|0.04|A|F|1992-06-07|1992-04-06|1992-06-09|DELIVER IN PERSON|RAIL|ts. fluffily bold foxes +40065|1435|75|6|43|57466.49|0.00|0.08|A|F|1992-04-06|1992-04-29|1992-04-08|DELIVER IN PERSON|MAIL|deas. furiousl +40065|935|70|7|49|89960.57|0.05|0.06|A|F|1992-05-04|1992-03-22|1992-05-06|COLLECT COD|TRUCK| deposits? ironic, final requests inte +40066|381|38|1|13|16657.94|0.00|0.04|N|O|1997-12-17|1997-10-26|1998-01-10|NONE|SHIP|e carefully idle asymptotes. ironic account +40066|1979|68|2|26|48905.22|0.04|0.01|N|O|1997-11-17|1997-11-15|1997-11-22|COLLECT COD|MAIL|refully final asymptotes cajole +40066|1675|99|3|6|9460.02|0.06|0.07|N|O|1997-11-11|1997-10-10|1997-11-18|TAKE BACK RETURN|TRUCK|regular de +40066|1141|42|4|16|16674.24|0.01|0.03|N|O|1997-10-09|1997-10-12|1997-10-27|COLLECT COD|TRUCK|sly platelets are fluffily ideas. reque +40066|941|76|5|3|5525.82|0.08|0.00|N|O|1997-09-22|1997-11-14|1997-10-16|NONE|RAIL|are about the regular deposits. +40066|626|20|6|12|18319.44|0.00|0.00|N|O|1997-09-08|1997-09-22|1997-09-30|TAKE BACK RETURN|TRUCK|around the quick +40067|312|41|1|31|37581.61|0.01|0.04|R|F|1992-06-14|1992-05-15|1992-06-22|TAKE BACK RETURN|SHIP|ickly across the final requests. re +40067|1360|99|2|26|32795.36|0.06|0.03|R|F|1992-05-17|1992-04-09|1992-06-11|TAKE BACK RETURN|MAIL|. slyly ironic fox +40067|152|79|3|44|46294.60|0.03|0.03|R|F|1992-06-01|1992-05-10|1992-06-21|COLLECT COD|REG AIR|efully furiou +40068|1936|37|1|6|11027.58|0.02|0.04|A|F|1993-06-27|1993-05-25|1993-07-09|NONE|RAIL|press accounts ca +40068|1502|3|2|8|11228.00|0.05|0.00|A|F|1993-05-17|1993-06-29|1993-06-09|NONE|AIR|e carefully speci +40068|232|60|3|1|1132.23|0.09|0.03|R|F|1993-07-21|1993-07-02|1993-08-05|TAKE BACK RETURN|SHIP|otes haggle slyly +40068|1016|22|4|20|18340.20|0.05|0.07|A|F|1993-07-24|1993-06-22|1993-08-12|TAKE BACK RETURN|FOB|e regular, regular requ +40068|1950|51|5|37|68522.15|0.09|0.07|A|F|1993-07-27|1993-06-08|1993-08-01|DELIVER IN PERSON|FOB|ages boost? pending accounts cajole carefu +40068|866|66|6|5|8834.30|0.09|0.05|R|F|1993-05-11|1993-05-27|1993-05-29|DELIVER IN PERSON|REG AIR|egular theodolites int +40069|1538|19|1|23|33109.19|0.09|0.08|N|O|1996-10-20|1996-10-05|1996-11-14|COLLECT COD|TRUCK|the carefully ironic gifts cajole blith +40069|1072|43|2|9|8757.63|0.02|0.00|N|O|1996-12-11|1996-10-24|1997-01-02|TAKE BACK RETURN|MAIL|lar foxes. unusual, regular deposits about +40069|655|18|3|3|4666.95|0.08|0.05|N|O|1996-09-06|1996-11-16|1996-09-25|DELIVER IN PERSON|REG AIR|sits can haggle slyly furiously unusual th +40069|1757|84|4|24|39810.00|0.00|0.02|N|O|1996-12-21|1996-10-25|1997-01-18|NONE|SHIP|d foxes. furiously final package +40069|502|3|5|46|64515.00|0.09|0.07|N|O|1996-09-23|1996-10-24|1996-10-14|NONE|AIR| sleep special, e +40070|1434|35|1|41|54752.63|0.08|0.08|N|O|1996-12-21|1996-10-21|1996-12-25|COLLECT COD|AIR|lent pinto beans wak +40071|1934|23|1|19|34882.67|0.06|0.03|N|O|1998-10-06|1998-09-03|1998-10-15|DELIVER IN PERSON|FOB|sleep against the pack +40071|1510|51|2|11|15526.61|0.09|0.01|N|O|1998-07-21|1998-09-06|1998-07-30|NONE|RAIL|ies. quickly ironic instructions use furio +40071|1535|76|3|47|67516.91|0.10|0.01|N|O|1998-09-27|1998-08-02|1998-10-08|DELIVER IN PERSON|FOB|efully regul +40096|1468|86|1|15|20541.90|0.10|0.03|N|O|1996-01-25|1995-12-24|1996-02-01|TAKE BACK RETURN|SHIP|furiously alongsi +40096|425|55|2|30|39762.60|0.02|0.08|N|O|1995-11-27|1996-01-30|1995-12-27|DELIVER IN PERSON|SHIP| among the ironic warhorses haggl +40097|1393|8|1|34|44009.26|0.06|0.02|A|F|1994-01-27|1994-03-06|1994-01-28|NONE|AIR|y ironic, regular deposits. +40097|102|81|2|12|12025.20|0.01|0.02|R|F|1994-04-17|1994-02-10|1994-04-24|DELIVER IN PERSON|FOB|lithely final ac +40097|1013|19|3|16|14624.16|0.03|0.07|R|F|1994-04-01|1994-04-02|1994-04-28|COLLECT COD|FOB|y quiet de +40097|1156|65|4|17|17971.55|0.07|0.03|R|F|1994-04-11|1994-03-16|1994-05-09|NONE|FOB| bold escap +40097|884|84|5|46|82104.48|0.08|0.01|R|F|1994-03-09|1994-03-05|1994-03-27|NONE|SHIP|oost slyly. blithely silent deposits detect +40098|766|99|1|41|68337.16|0.10|0.06|R|F|1992-04-16|1992-03-27|1992-04-19|TAKE BACK RETURN|AIR|al deposits. carefully regular frays doze +40098|1973|18|2|46|86248.62|0.01|0.04|A|F|1992-05-17|1992-04-13|1992-06-12|COLLECT COD|AIR|counts integrate. unus +40098|292|47|3|29|34576.41|0.08|0.05|R|F|1992-04-24|1992-04-23|1992-05-08|COLLECT COD|RAIL|ic theodolites +40098|1847|77|4|4|6995.36|0.02|0.03|A|F|1992-03-06|1992-04-27|1992-04-05|TAKE BACK RETURN|RAIL| blithely furiously ironic deposi +40098|1638|21|5|10|15396.30|0.01|0.05|R|F|1992-04-01|1992-04-14|1992-04-11|NONE|SHIP|ag blithely carefully regular depen +40099|1057|93|1|20|19161.00|0.05|0.00|N|O|1998-09-10|1998-08-04|1998-10-02|COLLECT COD|FOB|ct regularly slyly express accounts. ironic +40099|1544|25|2|21|30356.34|0.04|0.06|N|O|1998-08-21|1998-07-15|1998-09-14|DELIVER IN PERSON|FOB|mong the slyly special foxes. bold +40099|943|78|3|22|40566.68|0.10|0.06|N|O|1998-06-29|1998-07-17|1998-07-03|TAKE BACK RETURN|SHIP|ronic theodolites. accounts affix furious +40099|531|22|4|12|17178.36|0.06|0.01|N|O|1998-08-28|1998-07-12|1998-09-07|DELIVER IN PERSON|AIR|fully ironic +40100|704|37|1|21|33698.70|0.00|0.06|R|F|1992-03-24|1992-03-11|1992-04-01|NONE|RAIL|cording to the special, special +40100|1547|88|2|4|5794.16|0.07|0.07|R|F|1992-03-13|1992-03-23|1992-04-01|NONE|RAIL|ic sauternes across the fluffily bold de +40100|1827|57|3|33|57051.06|0.01|0.00|R|F|1992-04-27|1992-04-02|1992-05-09|DELIVER IN PERSON|TRUCK| boost final instruc +40100|1277|52|4|29|34169.83|0.04|0.03|A|F|1992-03-09|1992-04-29|1992-03-20|NONE|SHIP|ound the carefully regu +40100|1794|21|5|41|69527.39|0.08|0.08|R|F|1992-03-24|1992-04-24|1992-04-17|DELIVER IN PERSON|REG AIR|lar, special foxes wake according +40100|1931|32|6|37|67818.41|0.05|0.01|A|F|1992-02-25|1992-03-16|1992-03-08|TAKE BACK RETURN|FOB|ect slyly carefully reg +40101|1712|13|1|31|50025.01|0.03|0.03|R|F|1994-05-03|1994-04-06|1994-05-09|COLLECT COD|TRUCK|ic packages. +40101|1525|66|2|3|4279.56|0.05|0.06|R|F|1994-02-24|1994-04-11|1994-03-16|TAKE BACK RETURN|TRUCK| carefully pending courts +40102|698|30|1|46|73539.74|0.04|0.01|R|F|1995-02-27|1995-03-26|1995-03-28|COLLECT COD|FOB|riously even pinto beans. bl +40102|414|15|2|34|44689.94|0.07|0.00|A|F|1995-05-26|1995-04-24|1995-06-17|NONE|MAIL|ress deposits. quickly special pac +40103|731|28|1|39|63637.47|0.03|0.00|R|F|1993-11-03|1993-11-02|1993-11-05|DELIVER IN PERSON|FOB|y express p +40128|1487|66|1|14|19438.72|0.01|0.03|A|F|1994-03-31|1994-03-30|1994-04-15|NONE|TRUCK|he carefully unusual +40128|1448|88|2|13|17542.72|0.06|0.00|R|F|1994-02-26|1994-04-03|1994-03-15|TAKE BACK RETURN|TRUCK|run slyly! blithely regular ideas +40128|1392|7|3|21|27161.19|0.09|0.08|R|F|1994-03-09|1994-04-07|1994-04-05|COLLECT COD|RAIL|heodolites. quic +40128|119|46|4|29|29554.19|0.08|0.03|A|F|1994-06-04|1994-05-01|1994-06-11|COLLECT COD|FOB|he ironically express accounts. speci +40128|1981|14|5|10|18829.80|0.10|0.04|R|F|1994-03-28|1994-03-27|1994-04-27|NONE|MAIL|st slyly after t +40128|521|12|6|22|31273.44|0.07|0.08|R|F|1994-04-30|1994-03-30|1994-05-30|NONE|MAIL|ly pending dolphins boost furi +40128|1104|13|7|24|24122.40|0.06|0.04|A|F|1994-05-09|1994-04-11|1994-05-18|TAKE BACK RETURN|FOB| regular requests abou +40129|704|1|1|22|35303.40|0.05|0.01|N|O|1997-08-15|1997-08-21|1997-08-22|DELIVER IN PERSON|TRUCK|g requests. quickly express +40129|830|64|2|14|24231.62|0.10|0.08|N|O|1997-08-21|1997-08-10|1997-09-09|DELIVER IN PERSON|MAIL|s sleep permanently slyly speci +40129|1879|9|3|16|28493.92|0.09|0.03|N|O|1997-07-31|1997-09-03|1997-08-06|COLLECT COD|TRUCK| dependencies promise quickly. eve +40130|765|62|1|16|26652.16|0.06|0.04|N|O|1997-12-06|1997-11-17|1997-12-27|DELIVER IN PERSON|MAIL|pending req +40130|45|46|2|6|5670.24|0.01|0.04|N|O|1997-10-17|1997-11-08|1997-11-04|COLLECT COD|MAIL|lar requests haggle since the +40130|218|100|3|27|30191.67|0.02|0.03|N|O|1997-09-24|1997-11-20|1997-10-12|DELIVER IN PERSON|REG AIR|e even requests. final no +40131|108|35|1|35|35283.50|0.08|0.01|R|F|1992-05-18|1992-07-15|1992-06-07|TAKE BACK RETURN|REG AIR|aintain blithely about the blithely +40132|893|27|1|45|80725.05|0.00|0.05|R|F|1992-03-15|1992-04-17|1992-03-23|NONE|TRUCK|e furiously after the silent d +40132|1980|81|2|43|80925.14|0.06|0.01|A|F|1992-06-18|1992-04-02|1992-06-28|COLLECT COD|RAIL|aggle around the warthogs: ironic, +40132|1064|100|3|29|27986.74|0.06|0.05|A|F|1992-06-03|1992-04-27|1992-06-18|COLLECT COD|TRUCK|ages use fluffily. busily ironic request +40132|391|20|4|21|27119.19|0.04|0.02|R|F|1992-03-06|1992-04-14|1992-03-15|TAKE BACK RETURN|FOB|ely. furiously special excus +40132|1432|50|5|42|56004.06|0.06|0.05|A|F|1992-03-30|1992-05-23|1992-04-10|NONE|REG AIR|ainst the blithely daring deposits ar +40132|1854|41|6|24|42140.40|0.01|0.04|R|F|1992-06-19|1992-04-12|1992-07-10|NONE|TRUCK|ons sleep among the blithely brav +40132|864|31|7|38|67064.68|0.07|0.08|R|F|1992-02-27|1992-03-30|1992-02-28|DELIVER IN PERSON|FOB|ly against the quickly +40133|411|12|1|16|20982.56|0.04|0.01|A|F|1993-10-08|1993-09-30|1993-10-17|COLLECT COD|FOB|deposits. foxes integrate slyly acc +40133|42|93|2|29|27319.16|0.05|0.06|R|F|1993-09-03|1993-09-21|1993-09-05|TAKE BACK RETURN|AIR|blithely silent i +40133|591|52|3|44|65629.96|0.04|0.07|R|F|1993-09-05|1993-09-18|1993-09-23|COLLECT COD|SHIP|regular ideas are excuses. +40134|1195|68|1|5|5480.95|0.00|0.05|N|O|1995-10-24|1995-11-23|1995-11-02|TAKE BACK RETURN|AIR|s! accounts would haggle carefully +40134|1989|22|2|14|26473.72|0.02|0.02|N|O|1996-01-12|1995-12-23|1996-02-10|DELIVER IN PERSON|RAIL|nt accounts. blithely regular accounts slee +40134|657|89|3|4|6230.60|0.02|0.04|N|O|1996-01-15|1995-12-05|1996-02-08|NONE|AIR|thely unusua +40135|1412|52|1|33|43342.53|0.03|0.04|R|F|1994-11-09|1994-10-14|1994-12-05|DELIVER IN PERSON|REG AIR|e blithely unusual requests wake +40135|841|42|2|29|50513.36|0.06|0.06|R|F|1994-10-05|1994-12-02|1994-11-03|TAKE BACK RETURN|RAIL| instructions haggle +40160|1394|9|1|32|41452.48|0.01|0.06|R|F|1994-12-13|1995-01-08|1994-12-24|DELIVER IN PERSON|REG AIR|inal packages affix fluffily along the f +40160|1621|4|2|17|25884.54|0.06|0.06|A|F|1995-01-14|1994-11-16|1995-02-09|TAKE BACK RETURN|TRUCK|ly special theodolites after the dolphins +40160|1363|40|3|48|60689.28|0.10|0.00|R|F|1994-12-30|1994-12-16|1995-01-06|COLLECT COD|SHIP|y according to th +40161|1004|5|1|3|2715.00|0.10|0.08|N|O|1997-10-05|1997-11-04|1997-10-22|NONE|TRUCK|lyly express deposits nag slyly bold packag +40161|1642|25|2|27|41678.28|0.06|0.00|N|O|1997-08-16|1997-10-14|1997-08-24|COLLECT COD|SHIP|hely regular requests. qu +40161|584|45|3|37|54929.46|0.04|0.05|N|O|1997-11-01|1997-10-10|1997-11-04|TAKE BACK RETURN|RAIL|are carefully against +40161|1366|43|4|17|21545.12|0.04|0.05|N|O|1997-11-05|1997-09-19|1997-11-26|DELIVER IN PERSON|AIR|al ideas about the final packages +40161|1382|97|5|18|23100.84|0.07|0.02|N|O|1997-08-15|1997-10-19|1997-08-31|NONE|TRUCK|n, special foxes wake bl +40162|1140|13|1|25|26028.50|0.09|0.00|R|F|1993-03-28|1993-03-26|1993-04-08|COLLECT COD|SHIP|bove the slyly final requests. fluffily i +40162|1686|87|2|6|9526.08|0.02|0.01|R|F|1993-03-19|1993-04-13|1993-04-06|TAKE BACK RETURN|TRUCK|ses. deposits boost quickl +40163|1539|80|1|34|48978.02|0.08|0.07|N|O|1996-10-09|1996-07-29|1996-10-12|COLLECT COD|REG AIR|iously regular requests +40164|1218|56|1|24|26861.04|0.06|0.02|A|F|1993-06-10|1993-06-18|1993-06-23|TAKE BACK RETURN|MAIL|promise. slyly express requests be +40164|769|66|2|35|58441.60|0.03|0.02|R|F|1993-04-17|1993-07-03|1993-05-05|NONE|SHIP|nstructions. +40164|540|41|3|34|48978.36|0.01|0.00|R|F|1993-04-30|1993-06-30|1993-05-07|TAKE BACK RETURN|TRUCK|ly according to the furiously express theod +40164|154|7|4|50|52707.50|0.09|0.03|A|F|1993-06-28|1993-06-15|1993-06-29|TAKE BACK RETURN|RAIL|e blithely ironic asymptote +40164|996|97|5|7|13278.93|0.05|0.00|R|F|1993-05-02|1993-06-08|1993-05-06|COLLECT COD|REG AIR| gifts: regular, final request +40164|660|54|6|34|53062.44|0.08|0.00|R|F|1993-07-09|1993-06-05|1993-08-05|NONE|MAIL|ages affix quickly against the requests- +40164|1093|29|7|49|48710.41|0.04|0.01|A|F|1993-04-27|1993-05-31|1993-05-12|NONE|REG AIR|ffily: carefully pe +40165|724|57|1|49|79611.28|0.03|0.02|N|F|1995-06-07|1995-05-17|1995-06-28|TAKE BACK RETURN|TRUCK|tructions are sl +40165|1353|30|2|11|13797.85|0.08|0.01|N|O|1995-06-29|1995-04-04|1995-07-22|NONE|FOB|. express pinto beans boost blithel +40166|1529|10|1|9|12874.68|0.03|0.07|N|O|1998-07-05|1998-05-03|1998-07-12|COLLECT COD|AIR|lar, ironic foxes. r +40166|1559|40|2|19|27750.45|0.07|0.03|N|O|1998-06-05|1998-04-23|1998-07-05|NONE|FOB|ise furiously pending +40166|1333|10|3|12|14811.96|0.00|0.05|N|O|1998-05-13|1998-04-29|1998-06-12|DELIVER IN PERSON|FOB|unts are carefully across +40166|74|100|4|15|14611.05|0.01|0.01|N|O|1998-05-19|1998-05-31|1998-05-22|TAKE BACK RETURN|MAIL|o beans. accounts +40167|144|45|1|22|22971.08|0.04|0.04|R|F|1992-12-25|1992-11-16|1993-01-13|COLLECT COD|FOB|onic gifts must have to a +40167|1893|37|2|29|52051.81|0.09|0.00|A|F|1992-12-07|1992-12-15|1992-12-25|TAKE BACK RETURN|AIR|counts nag b +40167|505|96|3|8|11244.00|0.02|0.06|A|F|1992-11-11|1992-11-30|1992-11-14|TAKE BACK RETURN|FOB|ess, regular dependencies cajole a +40167|631|25|4|33|50543.79|0.02|0.01|A|F|1992-10-20|1992-12-15|1992-11-19|COLLECT COD|AIR|instructions sleep carefully iro +40167|188|41|5|18|19587.24|0.02|0.03|R|F|1992-12-12|1992-12-06|1993-01-06|DELIVER IN PERSON|FOB| nag blith +40192|1998|43|1|1|1899.99|0.04|0.03|N|O|1998-08-09|1998-09-23|1998-08-18|TAKE BACK RETURN|REG AIR|, ironic frays +40192|480|10|2|47|64882.56|0.10|0.07|N|O|1998-11-05|1998-09-20|1998-11-22|DELIVER IN PERSON|FOB|lly special excuses +40192|909|78|3|7|12669.30|0.05|0.05|N|O|1998-10-09|1998-10-10|1998-10-11|NONE|RAIL|ular pinto beans. bo +40192|1954|99|4|3|5567.85|0.10|0.07|N|O|1998-09-20|1998-10-09|1998-09-28|DELIVER IN PERSON|AIR|out the blithely quiet pinto beans cajole +40192|527|28|5|49|69948.48|0.09|0.07|N|O|1998-07-31|1998-10-02|1998-08-12|COLLECT COD|FOB| ideas. furious, ironic requests us +40192|190|17|6|30|32705.70|0.09|0.03|N|O|1998-10-21|1998-08-30|1998-11-06|NONE|FOB|fully. fur +40192|347|4|7|49|61119.66|0.05|0.02|N|O|1998-11-01|1998-09-01|1998-11-02|NONE|REG AIR|oxes wake theodolites. f +40193|1563|44|1|29|42472.24|0.05|0.08|A|F|1992-09-27|1992-11-06|1992-10-26|DELIVER IN PERSON|RAIL|beans. blithe, thin deposits nag bli +40193|1182|55|2|12|12998.16|0.00|0.02|A|F|1992-11-10|1992-11-04|1992-11-12|DELIVER IN PERSON|RAIL|express instructions. furious +40193|1939|84|3|9|16568.37|0.07|0.02|A|F|1992-12-20|1992-11-10|1993-01-17|TAKE BACK RETURN|MAIL|sts. slyly regular ideas haggl +40193|1688|71|4|27|42921.36|0.05|0.04|A|F|1992-11-26|1992-11-29|1992-12-14|TAKE BACK RETURN|RAIL|pinto beans along the bold ideas h +40193|1880|81|5|14|24946.32|0.08|0.01|A|F|1992-09-24|1992-11-07|1992-10-08|DELIVER IN PERSON|REG AIR| final, final pac +40194|679|80|1|34|53708.78|0.04|0.02|A|F|1993-11-13|1994-01-01|1993-11-15|NONE|REG AIR|thely express dependencies could have t +40194|1590|71|2|11|16407.49|0.05|0.02|R|F|1994-01-19|1993-12-16|1994-02-01|TAKE BACK RETURN|TRUCK|thely even packages detect-- car +40194|129|30|3|13|13378.56|0.07|0.03|R|F|1993-12-31|1993-12-11|1994-01-20|COLLECT COD|RAIL|y unusual packages. blith +40194|1621|63|4|17|25884.54|0.02|0.03|A|F|1994-01-29|1993-12-12|1994-02-22|COLLECT COD|FOB| the furiously final deposits +40194|1382|21|5|49|62885.62|0.07|0.01|A|F|1993-12-07|1994-01-04|1993-12-09|DELIVER IN PERSON|AIR|l asymptotes engage blithely +40194|132|59|6|47|48510.11|0.01|0.03|A|F|1993-12-24|1993-11-30|1993-12-28|NONE|FOB| slyly after the furiou +40194|1030|1|7|28|26068.84|0.04|0.02|A|F|1993-10-08|1993-11-12|1993-10-15|NONE|RAIL|. carefully bold pack +40195|196|49|1|25|27404.75|0.03|0.06|N|O|1997-02-22|1997-03-12|1997-02-25|COLLECT COD|REG AIR| furiously final ideas haggle +40195|333|34|2|50|61666.50|0.09|0.07|N|O|1997-03-02|1997-02-13|1997-03-22|TAKE BACK RETURN|AIR|unusual dependencies +40195|880|14|3|46|81920.48|0.08|0.00|N|O|1997-04-14|1997-03-30|1997-05-14|DELIVER IN PERSON|SHIP|s boost slowly requests. requests must hav +40195|1586|27|4|7|10413.06|0.09|0.07|N|O|1997-03-18|1997-03-05|1997-03-31|COLLECT COD|RAIL|regular packages. blith +40195|1567|88|5|26|38182.56|0.03|0.03|N|O|1997-02-04|1997-02-28|1997-02-11|NONE|FOB|ecial frays. furi +40195|343|28|6|18|22380.12|0.05|0.07|N|O|1997-02-11|1997-03-12|1997-02-17|TAKE BACK RETURN|RAIL|o beans impress +40196|786|87|1|24|40482.72|0.08|0.05|N|O|1997-07-26|1997-05-08|1997-08-14|NONE|AIR|he furiously even packages. furious +40197|91|42|1|44|43607.96|0.09|0.06|A|F|1995-05-28|1995-06-17|1995-06-16|DELIVER IN PERSON|REG AIR|yly even excuses are quickly pending packa +40197|1897|98|2|3|5396.67|0.05|0.04|A|F|1995-04-02|1995-05-21|1995-04-24|NONE|TRUCK|unusual deposits. ironic dolphins wake furi +40197|963|64|3|21|39143.16|0.10|0.05|N|F|1995-05-28|1995-06-22|1995-06-18|TAKE BACK RETURN|REG AIR|e slyly ironic deposits lose quickly +40197|1677|60|4|35|55253.45|0.07|0.08|R|F|1995-04-15|1995-06-07|1995-05-10|COLLECT COD|SHIP|l instructions wake alon +40197|1292|4|5|39|46538.31|0.09|0.02|A|F|1995-05-29|1995-05-26|1995-06-13|NONE|TRUCK| the ironic, special foxes. carefully e +40197|1446|64|6|10|13474.40|0.05|0.01|N|O|1995-07-11|1995-06-13|1995-07-26|DELIVER IN PERSON|RAIL|s accounts since the blithely +40198|434|64|1|23|30691.89|0.04|0.01|N|O|1996-07-20|1996-05-20|1996-07-28|COLLECT COD|REG AIR|nic platelets. furiously regular instructio +40198|193|46|2|34|37168.46|0.02|0.03|N|O|1996-06-24|1996-07-09|1996-07-04|TAKE BACK RETURN|SHIP|fluffily special packages shall have to ar +40198|1369|46|3|26|33029.36|0.05|0.00|N|O|1996-07-27|1996-06-07|1996-08-25|NONE|AIR|ully regular foxes use. the +40198|1070|6|4|10|9710.70|0.04|0.05|N|O|1996-05-21|1996-05-26|1996-06-15|NONE|AIR|es haggle about the fluffily +40198|1341|80|5|49|60874.66|0.04|0.07|N|O|1996-04-20|1996-07-05|1996-05-09|DELIVER IN PERSON|TRUCK| instructions are +40199|1635|18|1|8|12293.04|0.00|0.02|A|F|1993-02-27|1993-01-25|1993-03-20|COLLECT COD|SHIP|hely accounts. cour +40199|143|22|2|41|42768.74|0.07|0.00|R|F|1992-12-16|1993-01-16|1992-12-19|COLLECT COD|REG AIR|quests. blithe +40199|1593|14|3|9|13451.31|0.05|0.07|R|F|1992-11-20|1992-12-21|1992-12-03|DELIVER IN PERSON|RAIL|deas despite the final, unusual foxes hagg +40199|1543|84|4|50|72227.00|0.07|0.01|A|F|1993-01-31|1993-01-01|1993-02-20|TAKE BACK RETURN|FOB|hely final accounts wake against th +40199|369|70|5|23|29195.28|0.10|0.01|A|F|1993-02-26|1993-01-06|1993-03-03|COLLECT COD|MAIL|ngside of the blithely ironic reques +40224|413|43|1|33|43342.53|0.07|0.03|R|F|1994-09-08|1994-09-07|1994-10-01|COLLECT COD|MAIL|o haggle slyly +40224|1559|60|2|28|40895.40|0.05|0.07|A|F|1994-08-14|1994-08-18|1994-08-31|NONE|REG AIR|e of the ironically ironic +40224|266|67|3|47|54814.22|0.06|0.05|A|F|1994-09-27|1994-08-11|1994-10-27|COLLECT COD|FOB| final, ir +40224|1752|95|4|20|33075.00|0.06|0.00|A|F|1994-08-14|1994-08-24|1994-08-23|TAKE BACK RETURN|RAIL|ackages wake quickl +40224|1651|93|5|50|77632.50|0.02|0.07|R|F|1994-09-26|1994-09-09|1994-10-22|DELIVER IN PERSON|SHIP|ngside of +40225|76|52|1|50|48803.50|0.05|0.01|A|F|1995-03-08|1995-02-16|1995-04-06|TAKE BACK RETURN|TRUCK|sly alongside of the slyly ironic fo +40225|407|8|2|16|20918.40|0.08|0.07|R|F|1995-04-10|1995-03-24|1995-05-09|COLLECT COD|SHIP|into beans. quickly ironic deposits i +40225|1470|71|3|50|68573.50|0.09|0.04|A|F|1995-03-18|1995-03-13|1995-04-06|TAKE BACK RETURN|FOB|fluffily according to the slyly bold inst +40225|1129|2|4|44|45325.28|0.01|0.07|R|F|1995-03-15|1995-03-31|1995-03-27|NONE|MAIL|tes; express requests engage bl +40225|1315|30|5|8|9730.48|0.09|0.06|A|F|1995-01-19|1995-03-30|1995-01-20|COLLECT COD|TRUCK| integrate +40226|1988|21|1|20|37799.60|0.08|0.03|A|F|1993-11-13|1993-12-03|1993-11-18|NONE|AIR|s. blithel +40226|814|81|2|38|65162.78|0.08|0.05|A|F|1993-11-13|1993-12-14|1993-11-22|COLLECT COD|MAIL|ns boost slyly evenly +40226|886|53|3|28|50032.64|0.09|0.00|A|F|1994-01-01|1993-11-19|1994-01-27|TAKE BACK RETURN|MAIL|ithely unusual request +40226|1842|43|4|4|6975.36|0.01|0.02|R|F|1994-02-06|1994-01-03|1994-03-01|COLLECT COD|RAIL|ending foxes. blithely regular ideas nag. e +40226|22|23|5|37|34114.74|0.07|0.06|A|F|1994-01-30|1993-11-13|1994-02-15|COLLECT COD|RAIL|courts was slyly around the +40226|1907|96|6|34|61502.60|0.04|0.04|A|F|1994-01-04|1993-12-02|1994-01-06|DELIVER IN PERSON|REG AIR|. express requests after the iro +40227|1549|30|1|46|66724.84|0.03|0.01|N|O|1998-10-18|1998-08-28|1998-10-19|NONE|TRUCK|ent dolphins. asymptot +40227|1236|74|2|41|46626.43|0.04|0.05|N|O|1998-08-31|1998-09-18|1998-09-16|COLLECT COD|FOB|fully pending +40227|1923|24|3|35|63872.20|0.10|0.02|N|O|1998-09-20|1998-09-17|1998-10-18|COLLECT COD|SHIP| slyly furiously final packages. expre +40227|614|8|4|45|68157.45|0.08|0.04|N|O|1998-10-13|1998-10-08|1998-11-07|DELIVER IN PERSON|SHIP|riously regular asymptotes. slyly specia +40228|1816|46|1|32|54969.92|0.10|0.08|N|O|1997-09-10|1997-09-13|1997-10-09|TAKE BACK RETURN|FOB|tructions haggle blithe +40228|1244|19|2|43|49245.32|0.01|0.00|N|O|1997-08-31|1997-10-15|1997-09-05|NONE|MAIL|r ideas promise quickly regular depen +40229|919|54|1|7|12739.37|0.05|0.00|N|O|1997-06-29|1997-07-16|1997-07-06|TAKE BACK RETURN|AIR|long the courts hinder specia +40229|441|100|2|26|34877.44|0.07|0.07|N|O|1997-10-12|1997-08-02|1997-11-07|COLLECT COD|FOB|usual foxes lose. even, ironic account +40229|1045|81|3|11|10406.44|0.03|0.04|N|O|1997-10-04|1997-09-11|1997-10-25|TAKE BACK RETURN|AIR| asymptotes daz +40229|613|76|4|14|21190.54|0.05|0.00|N|O|1997-07-26|1997-08-19|1997-08-20|COLLECT COD|SHIP|cial packages. furiously final ideas h +40229|268|23|5|28|32711.28|0.06|0.01|N|O|1997-07-03|1997-07-19|1997-07-07|DELIVER IN PERSON|FOB| sleep carefully bol +40229|699|93|6|32|51190.08|0.06|0.08|N|O|1997-09-11|1997-08-30|1997-09-17|NONE|FOB|regular, final reques +40230|205|87|1|38|41997.60|0.00|0.03|N|O|1996-06-01|1996-04-21|1996-06-25|TAKE BACK RETURN|MAIL|sts. silent packages against t +40230|1556|37|2|31|45184.05|0.02|0.01|N|O|1996-04-19|1996-03-22|1996-04-30|NONE|TRUCK|ts. bold ideas wake slyly fluffily regul +40230|1937|38|3|8|14711.44|0.05|0.06|N|O|1996-05-24|1996-03-27|1996-06-03|DELIVER IN PERSON|SHIP| around the +40231|1891|92|1|25|44822.25|0.04|0.06|N|O|1997-05-09|1997-05-24|1997-05-29|COLLECT COD|MAIL|lphins are across the pending +40231|915|84|2|21|38134.11|0.02|0.03|N|O|1997-06-13|1997-05-27|1997-07-12|TAKE BACK RETURN|SHIP|al accounts. blithely even instructi +40231|1883|84|3|19|33912.72|0.06|0.07|N|O|1997-05-19|1997-06-11|1997-06-15|DELIVER IN PERSON|REG AIR|ly silent requests against the furiously fi +40231|1817|4|4|31|53283.11|0.09|0.06|N|O|1997-07-23|1997-06-19|1997-08-11|NONE|RAIL|ly special foxes +40256|893|60|1|20|35877.80|0.07|0.05|A|F|1993-11-11|1993-11-14|1993-11-24|TAKE BACK RETURN|FOB|ss the fur +40256|367|68|2|46|58298.56|0.03|0.02|A|F|1993-10-26|1993-12-18|1993-11-17|DELIVER IN PERSON|MAIL|nic instructions. express dep +40256|1623|65|3|10|15246.20|0.06|0.05|A|F|1993-12-29|1994-01-03|1994-01-21|DELIVER IN PERSON|REG AIR|y final packages a +40256|1000|1|4|27|24327.00|0.09|0.07|A|F|1994-01-02|1993-11-22|1994-01-11|NONE|MAIL|usly. quickly +40257|1647|48|1|24|37167.36|0.00|0.08|R|F|1993-10-31|1993-10-21|1993-11-14|TAKE BACK RETURN|MAIL|. slyly unusual foxes so +40258|868|69|1|49|86674.14|0.03|0.00|A|F|1994-06-26|1994-06-19|1994-07-11|COLLECT COD|MAIL|elets about the instructi +40258|337|22|2|37|45781.21|0.08|0.00|R|F|1994-05-06|1994-05-20|1994-06-04|TAKE BACK RETURN|AIR|totes cajole blithely according to the +40258|338|67|3|20|24766.60|0.00|0.02|R|F|1994-04-13|1994-06-24|1994-05-03|NONE|AIR|ly pending ideas wake final requests. +40258|512|43|4|32|45200.32|0.10|0.06|R|F|1994-04-24|1994-06-14|1994-05-01|TAKE BACK RETURN|FOB|es use quickly quickly express sentiment +40258|302|31|5|29|34866.70|0.03|0.02|R|F|1994-04-23|1994-06-02|1994-05-13|DELIVER IN PERSON|RAIL|ounts cajole slyly bold excuses. fluffily i +40258|757|22|6|5|8288.75|0.05|0.03|R|F|1994-04-12|1994-05-10|1994-04-23|NONE|SHIP| idle asymptotes. perman +40259|515|46|1|34|48127.34|0.03|0.03|A|F|1993-10-21|1993-12-26|1993-11-06|COLLECT COD|SHIP|n dependencies use. quickly regular w +40259|779|80|2|24|40314.48|0.10|0.01|R|F|1993-12-05|1993-11-28|1993-12-15|DELIVER IN PERSON|MAIL|kly along the +40259|1905|94|3|50|90345.00|0.07|0.03|R|F|1993-11-04|1993-11-21|1993-11-08|DELIVER IN PERSON|TRUCK|doggedly according to the special +40259|396|81|4|31|40188.09|0.01|0.01|A|F|1993-12-21|1993-12-01|1994-01-09|NONE|MAIL| slyly final foxes. carefully final depo +40260|900|100|1|11|19809.90|0.05|0.03|N|O|1996-07-29|1996-08-14|1996-08-19|COLLECT COD|MAIL|ly express requests us +40260|1388|27|2|28|36102.64|0.01|0.00|N|O|1996-09-29|1996-09-10|1996-10-09|TAKE BACK RETURN|AIR|e express, even theodolites-- regular +40260|1360|75|3|23|29011.28|0.09|0.04|N|O|1996-10-13|1996-08-30|1996-11-09|COLLECT COD|SHIP|requests wake. slyly final acc +40260|1831|18|4|28|48519.24|0.07|0.00|N|O|1996-07-31|1996-09-09|1996-08-09|NONE|AIR|refully regular deposits along th +40260|432|62|5|6|7994.58|0.01|0.02|N|O|1996-10-07|1996-08-21|1996-10-28|NONE|RAIL|lent requests poach f +40260|686|87|6|29|46013.72|0.03|0.04|N|O|1996-07-27|1996-09-14|1996-08-10|DELIVER IN PERSON|SHIP| ironic, regular accounts sleep. quick, s +40261|1593|14|1|45|67256.55|0.06|0.07|R|F|1994-12-23|1994-12-09|1994-12-30|DELIVER IN PERSON|MAIL|luffily blithe accounts use +40261|1963|8|2|33|61543.68|0.00|0.02|R|F|1995-03-06|1995-01-11|1995-04-03|TAKE BACK RETURN|AIR|de of the furiously bold the +40261|1194|67|3|32|35046.08|0.10|0.01|A|F|1995-02-05|1994-12-28|1995-03-02|TAKE BACK RETURN|MAIL|ly blithely even packages. fl +40261|1316|17|4|4|4869.24|0.07|0.03|R|F|1995-01-26|1995-01-13|1995-02-23|TAKE BACK RETURN|RAIL| furiously express platelets. +40261|1317|94|5|29|35330.99|0.08|0.08|A|F|1995-03-03|1995-01-07|1995-04-01|TAKE BACK RETURN|AIR|c packages sleep slyly ironic, ironic +40261|1727|54|6|46|74921.12|0.01|0.04|A|F|1995-01-26|1994-12-10|1995-02-19|NONE|FOB|courts engage. +40261|634|28|7|38|58315.94|0.01|0.02|R|F|1995-01-06|1994-12-22|1995-01-15|COLLECT COD|RAIL|r foxes wak +40262|1564|5|1|31|45432.36|0.10|0.05|A|F|1992-11-01|1992-10-03|1992-11-24|TAKE BACK RETURN|FOB|usly ironic deposits. caref +40262|755|20|2|12|19869.00|0.02|0.08|R|F|1992-11-12|1992-09-26|1992-12-07|TAKE BACK RETURN|REG AIR|inal sheaves run about the +40262|1212|13|3|47|52320.87|0.07|0.08|A|F|1992-08-12|1992-09-13|1992-08-24|COLLECT COD|FOB| foxes wake slyly fluffily final ide +40263|1293|68|1|19|22691.51|0.08|0.06|N|O|1996-11-19|1996-11-02|1996-12-06|TAKE BACK RETURN|SHIP|into beans wake car +40263|1488|28|2|48|66695.04|0.06|0.06|N|O|1997-01-07|1996-11-04|1997-01-31|NONE|REG AIR|s mold. even deposits against the final +40263|1397|36|3|50|64919.50|0.05|0.05|N|O|1996-11-18|1996-11-13|1996-11-19|NONE|REG AIR| special packages; furiously regu +40263|1787|72|4|39|65862.42|0.04|0.04|N|O|1996-10-26|1996-12-07|1996-11-07|COLLECT COD|TRUCK| accounts cajole quickly. +40263|1764|7|5|50|83288.00|0.09|0.04|N|O|1996-09-25|1996-12-20|1996-10-10|NONE|REG AIR| final instructions. +40263|1938|83|6|16|29438.88|0.09|0.01|N|O|1996-10-04|1996-12-03|1996-10-13|NONE|MAIL|the regular accounts. ironic, bold noto +40263|1314|29|7|17|20660.27|0.04|0.08|N|O|1997-01-09|1996-12-13|1997-01-31|COLLECT COD|REG AIR|olites serve furiously re +40288|161|40|1|16|16978.56|0.02|0.07|N|O|1996-06-17|1996-07-02|1996-07-14|COLLECT COD|MAIL|ld accounts wake slyly careful +40289|315|44|1|13|15799.03|0.02|0.00|R|F|1992-12-05|1993-01-20|1992-12-24|NONE|REG AIR|e carefully unusual asy +40289|1821|22|2|42|72358.44|0.04|0.03|A|F|1992-12-28|1993-02-04|1993-01-04|DELIVER IN PERSON|MAIL|ly regular instructions cajole +40289|1997|98|3|46|87353.54|0.02|0.02|R|F|1992-12-31|1993-02-23|1993-01-25|DELIVER IN PERSON|REG AIR|carefully ironic requests are accordin +40289|1107|16|4|49|49396.90|0.03|0.03|A|F|1993-01-20|1993-02-11|1993-02-05|NONE|FOB|sts. permanently ruthless +40289|620|14|5|11|16726.82|0.00|0.01|R|F|1993-01-15|1993-02-01|1993-01-26|TAKE BACK RETURN|MAIL|l requests according to the slyly ev +40289|216|98|6|37|41299.77|0.05|0.01|A|F|1993-03-25|1993-01-11|1993-04-10|DELIVER IN PERSON|TRUCK|deposits. slyly eve +40289|494|53|7|1|1394.49|0.01|0.06|R|F|1993-01-17|1993-01-01|1993-01-18|DELIVER IN PERSON|SHIP|sits. pending, final pac +40290|163|90|1|4|4252.64|0.03|0.04|N|O|1996-08-12|1996-08-31|1996-08-30|COLLECT COD|FOB|gside of the slyly bold ideas. +40290|927|96|2|13|23762.96|0.04|0.01|N|O|1996-10-13|1996-09-26|1996-10-22|DELIVER IN PERSON|SHIP|ully fluffily express depend +40290|1288|26|3|8|9514.24|0.08|0.04|N|O|1996-08-11|1996-10-06|1996-08-26|DELIVER IN PERSON|RAIL|y after th +40291|1985|30|1|5|9434.90|0.04|0.06|R|F|1992-05-17|1992-06-30|1992-06-02|TAKE BACK RETURN|SHIP|t the blithely unusual packages hagg +40291|870|71|2|38|67293.06|0.09|0.01|A|F|1992-05-01|1992-07-02|1992-05-07|TAKE BACK RETURN|REG AIR|onic, bold pinto beans cajole fu +40292|1125|62|1|24|24626.88|0.07|0.01|R|F|1995-05-21|1995-06-17|1995-06-15|NONE|TRUCK|gside of the dogged requests. blithely +40292|1356|33|2|39|49036.65|0.10|0.05|A|F|1995-05-28|1995-05-30|1995-06-14|DELIVER IN PERSON|FOB|al theodolites maintain blithely +40292|508|39|3|31|43663.50|0.09|0.01|R|F|1995-05-22|1995-06-25|1995-06-10|TAKE BACK RETURN|RAIL|s. carefully unusual foxes boost furiously +40293|818|19|1|39|67033.59|0.02|0.03|A|F|1995-02-05|1995-03-08|1995-03-04|COLLECT COD|AIR|equests sleep carefully final theodo +40294|200|27|1|38|41807.60|0.10|0.01|N|O|1996-04-02|1996-05-17|1996-04-04|COLLECT COD|AIR|regular, bold theodolites +40295|1159|96|1|44|46646.60|0.00|0.05|N|O|1998-03-18|1998-02-27|1998-04-07|TAKE BACK RETURN|FOB|ts boost daringly along t +40295|11|87|2|23|20953.23|0.08|0.07|N|O|1998-04-16|1998-02-18|1998-04-27|NONE|MAIL| sleep daringly blithely ev +40295|1830|60|3|39|67541.37|0.09|0.03|N|O|1998-04-23|1998-03-25|1998-05-23|DELIVER IN PERSON|AIR|ely even accounts are. careful +40295|133|86|4|2|2066.26|0.09|0.01|N|O|1998-04-26|1998-04-03|1998-05-10|NONE|AIR|arefully about the pack +40295|1701|44|5|36|57697.20|0.05|0.02|N|O|1998-02-13|1998-02-28|1998-02-27|TAKE BACK RETURN|TRUCK|ly pending reque +40295|1362|1|6|35|44217.60|0.04|0.03|N|O|1998-02-21|1998-03-27|1998-03-18|NONE|SHIP|quickly bold accounts. carefully unusual pa +40320|218|19|1|4|4472.84|0.10|0.05|N|O|1996-12-06|1997-01-12|1996-12-21|DELIVER IN PERSON|SHIP| slyly. ironic theodolites alongside o +40320|1700|24|2|36|57661.20|0.10|0.00|N|O|1997-02-28|1997-02-10|1997-03-25|TAKE BACK RETURN|AIR| foxes after the furiously pending +40320|47|98|3|36|34093.44|0.06|0.02|N|O|1997-01-17|1997-01-16|1997-02-04|DELIVER IN PERSON|AIR|ithely even accounts. carefully final p +40320|1844|88|4|47|82054.48|0.04|0.05|N|O|1997-02-06|1997-01-03|1997-02-20|NONE|MAIL|ss the regular pack +40321|481|82|1|40|55259.20|0.04|0.02|A|F|1993-09-19|1993-09-19|1993-10-05|DELIVER IN PERSON|MAIL|uffily final packages. acc +40321|1942|75|2|17|31346.98|0.02|0.06|A|F|1993-07-31|1993-07-26|1993-08-10|COLLECT COD|FOB|ly pending dependencies. special dolp +40321|324|9|3|14|17140.48|0.02|0.02|R|F|1993-08-24|1993-08-15|1993-09-21|COLLECT COD|MAIL|about the regular packages. blithel +40321|260|88|4|48|55692.48|0.09|0.02|R|F|1993-10-15|1993-07-27|1993-11-07|TAKE BACK RETURN|SHIP|rouches wake +40321|743|8|5|8|13149.92|0.05|0.08|R|F|1993-07-30|1993-08-04|1993-08-24|TAKE BACK RETURN|FOB|ly pending requests. unusual, regular +40321|849|16|6|4|6999.36|0.09|0.07|A|F|1993-10-13|1993-09-05|1993-10-21|TAKE BACK RETURN|REG AIR| regular pinto beans sleep. +40322|1485|25|1|35|48526.80|0.05|0.03|N|O|1995-08-13|1995-09-15|1995-09-04|TAKE BACK RETURN|TRUCK| after the even asymptotes sleep +40323|1156|93|1|13|13742.95|0.03|0.01|N|O|1997-09-16|1997-09-08|1997-09-27|COLLECT COD|MAIL|ously even accounts. stealthily +40323|213|41|2|4|4452.84|0.00|0.06|N|O|1997-09-22|1997-09-28|1997-10-11|NONE|FOB|ly ironic warthogs. furiously unu +40323|1112|85|3|3|3039.33|0.01|0.08|N|O|1997-08-25|1997-10-05|1997-09-12|NONE|RAIL|ckages. car +40323|83|34|4|19|18678.52|0.03|0.04|N|O|1997-11-02|1997-10-07|1997-11-13|DELIVER IN PERSON|REG AIR|ests along the reg +40324|614|8|1|2|3029.22|0.08|0.06|N|O|1996-04-23|1996-03-20|1996-05-04|TAKE BACK RETURN|MAIL|eep special packages. +40324|1661|85|2|35|54693.10|0.02|0.07|N|O|1996-05-18|1996-03-06|1996-05-23|DELIVER IN PERSON|REG AIR|ts. slyly special deposits haggle regular d +40324|327|28|3|6|7363.92|0.02|0.00|N|O|1996-05-21|1996-03-13|1996-06-15|DELIVER IN PERSON|AIR|eans wake +40324|1920|21|4|5|9109.60|0.07|0.03|N|O|1996-03-02|1996-04-07|1996-03-12|TAKE BACK RETURN|RAIL|jole. quietly regular dependen +40325|284|66|1|22|26054.16|0.10|0.01|N|O|1997-11-02|1997-10-07|1997-11-29|DELIVER IN PERSON|TRUCK|longside of the furi +40326|1484|85|1|31|42949.88|0.05|0.08|A|F|1995-03-18|1995-03-27|1995-04-04|TAKE BACK RETURN|TRUCK|furiously re +40327|1229|41|1|24|27125.28|0.04|0.03|N|O|1995-06-27|1995-06-27|1995-07-04|TAKE BACK RETURN|TRUCK|integrate along +40327|895|95|2|27|48489.03|0.03|0.03|N|O|1995-09-01|1995-07-18|1995-09-07|TAKE BACK RETURN|REG AIR|lyly stealthy deposit +40327|1095|31|3|36|35859.24|0.01|0.07|N|O|1995-07-05|1995-08-11|1995-07-24|DELIVER IN PERSON|TRUCK|ay. slyly bold +40327|216|98|4|50|55810.50|0.10|0.06|R|F|1995-06-05|1995-07-03|1995-06-17|COLLECT COD|TRUCK|gside of the final theodolites ca +40352|842|43|1|17|29628.28|0.03|0.02|A|F|1994-06-16|1994-08-26|1994-06-28|NONE|RAIL| quickly regular p +40352|539|100|2|40|57581.20|0.06|0.07|R|F|1994-07-26|1994-07-30|1994-08-18|NONE|REG AIR|y silent theodo +40352|717|14|3|19|30736.49|0.08|0.02|R|F|1994-10-04|1994-08-02|1994-10-14|NONE|RAIL|ar requests wake carefully courts. sly +40353|169|22|1|49|52388.84|0.08|0.07|N|O|1998-05-15|1998-06-14|1998-06-13|TAKE BACK RETURN|RAIL|carefully. ironic reque +40353|157|10|2|18|19028.70|0.02|0.01|N|O|1998-07-24|1998-06-05|1998-07-31|COLLECT COD|AIR|s use carefully along t +40353|374|3|3|19|24213.03|0.03|0.05|N|O|1998-05-03|1998-06-03|1998-05-09|NONE|SHIP|c accounts. even accounts cajole-- express, +40353|1250|51|4|31|35688.75|0.02|0.06|N|O|1998-05-25|1998-06-22|1998-06-07|NONE|MAIL| cajole fluffily. asymptotes +40353|1042|43|5|10|9430.40|0.04|0.04|N|O|1998-06-23|1998-06-27|1998-07-06|COLLECT COD|AIR|inal theodolites c +40354|683|46|1|20|31673.60|0.08|0.08|R|F|1994-02-05|1994-02-23|1994-03-03|TAKE BACK RETURN|REG AIR|he carefully +40354|1916|5|2|14|25450.74|0.04|0.07|A|F|1994-04-09|1994-02-26|1994-04-10|DELIVER IN PERSON|TRUCK|posits. even deposits are fluffi +40354|1476|55|3|8|11019.76|0.00|0.07|R|F|1994-01-18|1994-03-09|1994-01-22|TAKE BACK RETURN|AIR|lly along the thinly regular instructions. +40354|1377|78|4|9|11505.33|0.10|0.07|A|F|1994-03-06|1994-03-12|1994-03-27|DELIVER IN PERSON|MAIL|lites. fluffily even +40354|1896|97|5|16|28766.24|0.02|0.02|A|F|1994-03-23|1994-02-23|1994-04-12|TAKE BACK RETURN|SHIP|nis. fluffily sly pa +40354|656|88|6|38|59152.70|0.03|0.05|R|F|1994-04-03|1994-02-10|1994-04-30|TAKE BACK RETURN|SHIP|egular acco +40354|1877|7|7|33|58702.71|0.00|0.01|R|F|1994-03-01|1994-03-07|1994-03-25|DELIVER IN PERSON|MAIL|nding, unusual pin +40355|1794|21|1|45|76310.55|0.04|0.01|N|O|1996-11-04|1996-12-15|1996-11-14|DELIVER IN PERSON|REG AIR|nding asymptotes are slyly un +40355|783|84|2|12|20205.36|0.08|0.04|N|O|1997-01-21|1996-12-27|1997-02-15|TAKE BACK RETURN|RAIL| haggle slyly ironic +40356|14|15|1|8|7312.08|0.06|0.02|A|F|1995-04-05|1995-02-24|1995-04-18|TAKE BACK RETURN|TRUCK|tegrate. regular theodolit +40356|1002|3|2|35|31605.00|0.04|0.07|A|F|1995-03-19|1995-02-08|1995-04-01|NONE|TRUCK|ar asymptotes nee +40356|363|92|3|49|61904.64|0.08|0.01|R|F|1995-04-01|1995-02-05|1995-04-16|NONE|MAIL|eas across the ideas m +40357|1954|55|1|20|37119.00|0.10|0.01|A|F|1992-10-04|1992-10-09|1992-11-01|NONE|REG AIR|regular, ironic accounts haggle c +40357|1999|88|2|31|58930.69|0.10|0.02|A|F|1992-11-17|1992-09-28|1992-11-22|DELIVER IN PERSON|AIR|s nag slyly re +40357|1649|73|3|8|12405.12|0.07|0.02|R|F|1992-10-14|1992-09-24|1992-10-20|DELIVER IN PERSON|RAIL|final packages nag around t +40357|1925|14|4|15|27403.80|0.04|0.02|A|F|1992-08-17|1992-09-30|1992-09-04|DELIVER IN PERSON|MAIL|s the regular, silent p +40357|454|42|5|35|47405.75|0.05|0.02|A|F|1992-09-13|1992-08-27|1992-09-27|NONE|MAIL|inal instructions. unusual, even +40358|1846|90|1|27|47191.68|0.06|0.08|N|O|1997-08-16|1997-08-08|1997-08-26|NONE|REG AIR|y pinto bea +40358|1463|42|2|12|16373.52|0.10|0.08|N|O|1997-08-19|1997-09-08|1997-08-28|DELIVER IN PERSON|MAIL|der the bli +40359|700|94|1|37|59225.90|0.06|0.00|R|F|1993-05-27|1993-04-11|1993-06-02|DELIVER IN PERSON|RAIL|dependencies wake blit +40359|892|93|2|18|32272.02|0.05|0.00|R|F|1993-03-13|1993-04-19|1993-04-06|DELIVER IN PERSON|AIR|ely even asymptotes. exp +40384|1847|77|1|30|52465.20|0.06|0.07|N|O|1997-06-20|1997-06-01|1997-06-28|NONE|SHIP| beans alongside of the +40385|1050|86|1|5|4755.25|0.01|0.02|R|F|1995-02-10|1994-12-30|1995-02-25|NONE|SHIP|ions. daringly final pack +40385|1054|60|2|16|15280.80|0.08|0.04|R|F|1995-01-07|1994-12-26|1995-01-23|TAKE BACK RETURN|TRUCK|efully along the slyly un +40385|1769|12|3|42|70171.92|0.02|0.08|R|F|1994-11-04|1994-12-06|1994-11-15|TAKE BACK RETURN|REG AIR|blithely. blithel +40385|186|65|4|44|47791.92|0.03|0.00|R|F|1995-02-21|1994-12-29|1995-02-28|COLLECT COD|AIR|longside of the careful +40385|1175|84|5|24|25828.08|0.09|0.04|R|F|1994-11-20|1995-01-21|1994-11-25|COLLECT COD|FOB|s affix final depen +40386|1564|85|1|34|49829.04|0.03|0.06|A|F|1995-05-23|1995-04-07|1995-05-31|DELIVER IN PERSON|REG AIR|ng the blit +40386|1084|90|2|47|46298.76|0.09|0.08|A|F|1995-03-29|1995-04-30|1995-04-16|NONE|AIR|ackages. furiously final +40386|1688|89|3|10|15896.80|0.06|0.08|R|F|1995-05-19|1995-04-02|1995-05-28|TAKE BACK RETURN|REG AIR|ctions. requests according to th +40386|464|23|4|44|60036.24|0.00|0.05|A|F|1995-04-23|1995-05-04|1995-04-26|DELIVER IN PERSON|AIR| across the unusual packages. fl +40386|711|12|5|34|54798.14|0.03|0.04|A|F|1995-02-22|1995-05-06|1995-02-25|COLLECT COD|RAIL|s. express requests +40387|1565|46|1|31|45463.36|0.08|0.03|N|O|1998-04-02|1998-04-22|1998-05-02|NONE|MAIL|ully regular ac +40387|132|59|2|11|11353.43|0.05|0.05|N|O|1998-04-30|1998-04-12|1998-05-11|DELIVER IN PERSON|FOB| to the slyly final accounts. slyl +40387|230|12|3|35|39558.05|0.02|0.01|N|O|1998-03-18|1998-04-11|1998-04-07|TAKE BACK RETURN|REG AIR|ithely even instructions. fluff +40387|7|33|4|50|45350.00|0.08|0.01|N|O|1998-04-14|1998-04-10|1998-04-21|COLLECT COD|AIR|ffix above the qu +40387|1008|9|5|35|31815.00|0.08|0.05|N|O|1998-02-24|1998-05-04|1998-03-09|DELIVER IN PERSON|AIR|e quietly according to the ironic foxe +40387|67|18|6|14|13538.84|0.00|0.06|N|O|1998-04-08|1998-03-29|1998-04-17|DELIVER IN PERSON|RAIL|ions cajole fluffily. final excu +40388|892|93|1|19|34064.91|0.02|0.05|R|F|1992-10-11|1992-10-05|1992-11-03|TAKE BACK RETURN|FOB|ole along the fluffily reg +40388|639|2|2|31|47728.53|0.05|0.07|A|F|1992-10-28|1992-08-25|1992-11-03|COLLECT COD|MAIL|ly unusual requests. ironic requests +40388|400|29|3|25|32510.00|0.03|0.06|A|F|1992-08-17|1992-10-22|1992-09-13|NONE|RAIL| final instructions sleep. f +40388|1579|60|4|16|23689.12|0.03|0.06|R|F|1992-09-28|1992-10-01|1992-10-07|COLLECT COD|AIR|to the specia +40389|1504|25|1|39|54814.50|0.03|0.06|N|O|1998-05-28|1998-07-01|1998-06-26|COLLECT COD|MAIL|s. furiously special deposits are +40389|1676|77|2|22|34708.74|0.07|0.07|N|O|1998-04-28|1998-05-15|1998-05-17|TAKE BACK RETURN|RAIL|final deposits nag quickly even account +40389|1117|26|3|41|41742.51|0.02|0.04|N|O|1998-07-15|1998-06-02|1998-07-23|NONE|SHIP|s. requests among the regular, regular ac +40390|1692|75|1|32|50998.08|0.08|0.03|N|O|1996-11-17|1996-11-16|1996-12-12|COLLECT COD|RAIL|s sleep sauternes. iro +40391|1531|72|1|2|2865.06|0.08|0.05|N|O|1997-12-31|1997-10-30|1998-01-19|TAKE BACK RETURN|FOB|aggle regularly care +40391|1348|25|2|29|36230.86|0.05|0.08|N|O|1997-12-07|1997-11-05|1997-12-17|NONE|SHIP|ilent deposits. +40391|275|76|3|11|12927.97|0.00|0.08|N|O|1997-12-26|1997-11-18|1998-01-24|DELIVER IN PERSON|RAIL|to the fluffily bold dugouts. fluffily r +40391|1064|70|4|6|5790.36|0.01|0.08|N|O|1998-01-16|1997-12-13|1998-02-05|NONE|SHIP| shall have to cajole about the pack +40391|150|51|5|32|33604.80|0.07|0.02|N|O|1997-10-03|1997-11-10|1997-10-04|DELIVER IN PERSON|MAIL|regular accounts. regular, +40391|607|70|6|29|43720.40|0.02|0.06|N|O|1997-11-03|1997-11-17|1997-11-19|COLLECT COD|AIR|y regular foxes wake carefully-- depos +40391|56|7|7|41|39198.05|0.07|0.00|N|O|1997-10-14|1997-11-19|1997-10-22|COLLECT COD|SHIP| regular re +40416|1864|8|1|24|42380.64|0.04|0.02|A|F|1993-05-28|1993-06-25|1993-06-02|COLLECT COD|REG AIR|riously bold de +40416|1374|51|2|15|19130.55|0.00|0.01|R|F|1993-04-22|1993-06-29|1993-04-28|COLLECT COD|MAIL| accounts. even foxes boost +40416|1910|43|3|11|19931.01|0.09|0.07|A|F|1993-04-12|1993-05-10|1993-04-28|NONE|MAIL|bove the carefully ironic warthogs. +40416|882|49|4|45|80229.60|0.04|0.05|A|F|1993-05-05|1993-05-26|1993-05-23|COLLECT COD|REG AIR|al requests. packag +40417|1725|52|1|10|16267.20|0.04|0.00|N|O|1998-05-07|1998-05-30|1998-05-15|DELIVER IN PERSON|SHIP|ess, silent packages across the packages s +40417|966|67|2|18|33605.28|0.08|0.06|N|O|1998-05-10|1998-06-15|1998-05-14|COLLECT COD|SHIP|lithely brave deposits sublate furi +40417|1369|46|3|8|10162.88|0.05|0.06|N|O|1998-05-21|1998-05-16|1998-06-20|COLLECT COD|AIR|ong the slyly final instructions wake sly +40418|148|1|1|46|48214.44|0.00|0.04|N|O|1998-04-08|1998-06-06|1998-04-29|NONE|REG AIR|y sly deposits c +40418|1438|39|2|10|13394.30|0.02|0.04|N|O|1998-07-17|1998-05-13|1998-07-31|COLLECT COD|FOB| the slyly final requests: reg +40419|1637|38|1|46|70776.98|0.09|0.03|N|O|1996-09-09|1996-09-08|1996-10-01|TAKE BACK RETURN|MAIL|s the quickly express warthogs wake acros +40420|1709|10|1|27|43488.90|0.05|0.04|R|F|1995-01-20|1995-02-16|1995-02-12|COLLECT COD|REG AIR| cajole furiou +40420|1494|34|2|4|5581.96|0.10|0.05|R|F|1995-04-22|1995-03-30|1995-05-10|COLLECT COD|AIR| courts wake. tithes +40420|260|88|3|21|24365.46|0.01|0.00|A|F|1995-02-09|1995-03-26|1995-03-09|TAKE BACK RETURN|SHIP| affix across the carefully bold acc +40420|962|97|4|1|1862.96|0.08|0.05|A|F|1995-04-30|1995-03-31|1995-05-15|COLLECT COD|FOB| even ideas wake instructions. depos +40420|1216|17|5|48|53626.08|0.05|0.01|A|F|1995-02-09|1995-03-10|1995-03-05|DELIVER IN PERSON|RAIL|venly unusual accounts. carefully bol +40420|1840|70|6|27|47029.68|0.03|0.05|A|F|1995-04-20|1995-03-21|1995-05-10|COLLECT COD|MAIL|s wake among the even accounts. slyly +40420|1290|2|7|38|45269.02|0.01|0.08|A|F|1995-03-04|1995-03-14|1995-03-31|TAKE BACK RETURN|FOB|ep furiously final accounts. t +40421|1612|54|1|17|25731.37|0.10|0.08|R|F|1992-12-17|1992-12-25|1992-12-20|DELIVER IN PERSON|RAIL|even requests. even p +40421|281|36|2|45|53157.60|0.06|0.05|A|F|1993-01-01|1992-12-23|1993-01-09|NONE|AIR| theodolites de +40422|238|39|1|38|43252.74|0.03|0.00|N|O|1995-09-22|1995-09-09|1995-09-25|TAKE BACK RETURN|MAIL|uests about the slyl +40422|489|19|2|41|56968.68|0.09|0.07|N|O|1995-09-14|1995-10-03|1995-10-03|NONE|TRUCK|ncies are carefully. qu +40423|1055|26|1|22|21033.10|0.10|0.07|N|O|1998-09-24|1998-09-02|1998-10-07|DELIVER IN PERSON|AIR| fluffily against t +40423|1390|67|2|39|50364.21|0.02|0.04|N|O|1998-07-22|1998-09-04|1998-08-11|DELIVER IN PERSON|AIR|ainst the quickly bold accounts are +40423|1491|31|3|12|16709.88|0.09|0.05|N|O|1998-08-13|1998-09-11|1998-08-22|TAKE BACK RETURN|AIR| accounts. ironic pinto beans nag furiously +40423|1383|60|4|10|12843.80|0.07|0.07|N|O|1998-10-29|1998-08-30|1998-11-05|TAKE BACK RETURN|TRUCK|kages haggle along the quickly iro +40423|1365|66|5|2|2532.72|0.05|0.00|N|O|1998-09-25|1998-09-23|1998-10-11|COLLECT COD|SHIP|onic asymptotes detect slyly ca +40423|95|96|6|31|30847.79|0.03|0.02|N|O|1998-10-26|1998-09-01|1998-11-03|TAKE BACK RETURN|REG AIR|fluffily express theodolites sleep s +40423|805|5|7|2|3411.60|0.09|0.01|N|O|1998-09-09|1998-09-24|1998-09-10|NONE|MAIL|uests sleep blithely unu +40448|506|97|1|46|64699.00|0.01|0.02|N|O|1997-12-08|1997-10-25|1998-01-03|COLLECT COD|SHIP| ironic multipli +40448|1614|97|2|30|45468.30|0.09|0.08|N|O|1997-10-14|1997-10-09|1997-11-05|COLLECT COD|REG AIR|he requests. furiously +40448|1394|33|3|1|1295.39|0.04|0.01|N|O|1997-10-15|1997-11-02|1997-10-18|DELIVER IN PERSON|REG AIR|egular instru +40448|1760|45|4|50|83088.00|0.07|0.01|N|O|1997-09-16|1997-10-27|1997-09-27|COLLECT COD|FOB|instructions are quic +40449|1429|47|1|45|59868.90|0.04|0.02|N|O|1998-06-11|1998-06-21|1998-07-02|DELIVER IN PERSON|AIR|yly across the p +40450|1543|44|1|43|62115.22|0.06|0.08|A|F|1992-10-15|1992-09-22|1992-10-30|TAKE BACK RETURN|TRUCK|tegrate carefully furious +40450|718|19|2|40|64748.40|0.07|0.02|A|F|1992-10-19|1992-10-12|1992-10-24|DELIVER IN PERSON|MAIL|ate across the unusual d +40451|249|77|1|22|25283.28|0.04|0.07|N|O|1997-09-25|1997-11-03|1997-10-03|TAKE BACK RETURN|FOB|. slyly pending deposits sleep bli +40451|578|79|2|29|42878.53|0.00|0.03|N|O|1997-11-10|1997-10-09|1997-11-30|NONE|FOB|regular reques +40451|1064|35|3|7|6755.42|0.07|0.01|N|O|1997-09-19|1997-11-20|1997-09-20|COLLECT COD|RAIL| sleep fluffily furiously even account +40451|262|17|4|31|36030.06|0.06|0.04|N|O|1997-11-05|1997-10-06|1997-11-26|NONE|SHIP| platelets. final, express theodoli +40452|1800|43|1|28|47650.40|0.02|0.02|N|O|1997-11-23|1997-12-15|1997-12-23|COLLECT COD|TRUCK|dolites. furiously final pack +40452|1779|80|2|16|26892.32|0.02|0.01|N|O|1997-10-11|1997-11-17|1997-10-26|NONE|AIR|ounts haggle blithely. slyly regular pinto +40452|1598|19|3|23|34490.57|0.00|0.04|N|O|1997-12-20|1997-12-01|1998-01-16|DELIVER IN PERSON|FOB|yly carefully silent instructions. +40452|1769|54|4|13|21719.88|0.06|0.07|N|O|1997-11-14|1997-11-19|1997-11-18|DELIVER IN PERSON|AIR|oss the slyly special courts use +40452|1050|86|5|21|19972.05|0.02|0.04|N|O|1998-01-14|1997-11-29|1998-01-25|COLLECT COD|MAIL|riously ir +40452|1349|88|6|19|23756.46|0.04|0.02|N|O|1997-10-29|1997-10-30|1997-11-06|NONE|SHIP|press accounts cajole. +40452|1644|86|7|9|13910.76|0.06|0.00|N|O|1998-01-08|1997-11-04|1998-02-03|NONE|AIR|ress requests are furiously along the sl +40453|687|50|1|2|3175.36|0.08|0.07|N|O|1996-06-08|1996-04-21|1996-07-07|TAKE BACK RETURN|TRUCK|e slyly along the bold reque +40453|1361|38|2|46|58068.56|0.02|0.06|N|O|1996-06-06|1996-05-16|1996-06-26|TAKE BACK RETURN|RAIL| special, silent theodolites. pinto beans +40453|1062|68|3|49|47189.94|0.09|0.05|N|O|1996-04-13|1996-06-09|1996-05-13|DELIVER IN PERSON|REG AIR|ch pending, pending dolph +40453|445|33|4|24|32290.56|0.06|0.05|N|O|1996-03-18|1996-05-13|1996-04-09|NONE|REG AIR|en requests cajole slyly abo +40453|130|83|5|33|33994.29|0.05|0.03|N|O|1996-06-02|1996-06-09|1996-06-30|TAKE BACK RETURN|REG AIR|, ironic requests. carefully regula +40454|1859|3|1|25|44021.25|0.06|0.00|A|F|1995-04-28|1995-06-27|1995-05-01|COLLECT COD|RAIL|ests use furiousl +40454|732|33|2|10|16327.30|0.05|0.06|R|F|1995-05-08|1995-07-06|1995-05-14|TAKE BACK RETURN|AIR|efully pinto beans. s +40454|582|13|3|39|57820.62|0.06|0.03|A|F|1995-05-03|1995-07-16|1995-05-12|NONE|MAIL| beans after the ideas serve beside the c +40455|1512|13|1|8|11308.08|0.09|0.04|R|F|1995-04-25|1995-02-28|1995-04-28|TAKE BACK RETURN|REG AIR|e slyly ironic accounts +40480|984|19|1|27|50894.46|0.10|0.02|N|O|1996-01-08|1996-02-04|1996-01-11|TAKE BACK RETURN|FOB|special packages was slyly. slyly +40480|906|41|2|37|66855.30|0.05|0.08|N|O|1996-01-17|1996-01-07|1996-02-03|DELIVER IN PERSON|AIR|ecial requests haggle. qui +40480|1248|60|3|30|34477.20|0.10|0.06|N|O|1996-02-09|1996-02-16|1996-03-06|DELIVER IN PERSON|AIR|ttainments +40481|1015|51|1|17|15572.17|0.00|0.05|N|O|1998-03-12|1998-03-14|1998-03-20|DELIVER IN PERSON|RAIL| to grow acco +40481|930|31|2|7|12816.51|0.01|0.04|N|O|1998-04-29|1998-03-29|1998-05-16|NONE|MAIL| furiously after the busy +40481|1791|76|3|19|32163.01|0.00|0.08|N|O|1998-02-15|1998-03-08|1998-02-22|COLLECT COD|RAIL|cuses haggle slyly +40481|82|33|4|22|21605.76|0.06|0.08|N|O|1998-04-22|1998-04-03|1998-05-20|NONE|SHIP| furiously express ideas wake car +40481|71|72|5|42|40784.94|0.04|0.07|N|O|1998-04-20|1998-04-18|1998-05-07|COLLECT COD|TRUCK|express packages; ironic pains nod +40482|44|20|1|46|43425.84|0.08|0.05|N|O|1995-11-02|1996-01-16|1995-11-12|NONE|AIR|he blithely regular deposits sleep +40482|766|31|2|6|10000.56|0.09|0.03|N|O|1996-01-14|1995-12-26|1996-02-04|DELIVER IN PERSON|REG AIR|ng to the t +40483|1035|6|1|50|46801.50|0.00|0.03|A|F|1993-12-12|1994-01-07|1993-12-25|TAKE BACK RETURN|RAIL|tructions! +40483|817|51|2|46|79019.26|0.03|0.05|R|F|1993-11-04|1993-12-12|1993-11-27|TAKE BACK RETURN|REG AIR| above the pendi +40483|1511|12|3|48|67800.48|0.01|0.07|A|F|1993-12-26|1993-12-08|1994-01-19|DELIVER IN PERSON|FOB|lithely regular theodolites wake sl +40483|1764|91|4|7|11660.32|0.00|0.01|R|F|1993-11-10|1993-12-10|1993-11-13|NONE|AIR|sly regular requests are quickly regul +40483|111|38|5|9|9099.99|0.06|0.08|A|F|1993-11-30|1994-01-25|1993-12-24|COLLECT COD|FOB|ests. fluff +40484|1967|68|1|45|84103.20|0.10|0.06|R|F|1993-11-20|1993-09-29|1993-11-30|TAKE BACK RETURN|REG AIR|slyly ironic packages acros +40485|342|99|1|8|9938.72|0.06|0.00|R|F|1995-03-04|1995-03-06|1995-03-20|NONE|MAIL|bits integr +40485|244|26|2|29|33182.96|0.03|0.03|R|F|1995-03-16|1995-03-24|1995-04-14|NONE|AIR|riously final pinto beans nag fur +40485|878|45|3|8|14230.96|0.09|0.02|A|F|1995-03-15|1995-02-23|1995-04-05|TAKE BACK RETURN|MAIL|e. slyly even +40485|1143|16|4|37|38633.18|0.00|0.06|A|F|1995-03-29|1995-03-02|1995-04-10|DELIVER IN PERSON|MAIL|. fluffily bold de +40485|1365|42|5|30|37990.80|0.09|0.01|A|F|1995-03-31|1995-02-20|1995-04-21|TAKE BACK RETURN|MAIL| unusual deposits? slyly regu +40486|718|51|1|4|6474.84|0.10|0.07|N|O|1997-12-30|1998-02-18|1998-01-21|TAKE BACK RETURN|TRUCK| instructions. blithely ironi +40486|1903|36|2|24|43317.60|0.05|0.07|N|O|1998-04-06|1998-01-13|1998-04-12|COLLECT COD|RAIL|s. slyly regular deposits are blithely. b +40486|766|63|3|20|33335.20|0.01|0.00|N|O|1998-01-30|1998-02-20|1998-02-25|COLLECT COD|FOB|he pinto beans. regular +40486|87|38|4|14|13819.12|0.10|0.06|N|O|1998-03-10|1998-02-13|1998-04-03|NONE|REG AIR| are furiously final pinto bea +40487|1927|16|1|42|76814.64|0.10|0.07|N|O|1996-06-17|1996-08-12|1996-07-14|NONE|FOB|asymptotes. express deposits wake +40487|1358|97|2|14|17630.90|0.07|0.05|N|O|1996-06-16|1996-08-12|1996-06-22|COLLECT COD|FOB|c platelets about the furiou +40487|1329|44|3|42|51673.44|0.06|0.02|N|O|1996-08-13|1996-08-24|1996-08-21|NONE|REG AIR|al theodolites cajole boldly slyly ironic d +40487|635|98|4|26|39926.38|0.00|0.00|N|O|1996-08-19|1996-08-26|1996-09-01|DELIVER IN PERSON|AIR|olites. final instructions thrash fluff +40487|1979|24|5|7|13166.79|0.04|0.05|N|O|1996-09-19|1996-08-01|1996-09-22|COLLECT COD|MAIL|ut the furiously regular deposits. blit +40487|286|87|6|22|26098.16|0.01|0.02|N|O|1996-07-14|1996-07-23|1996-07-23|COLLECT COD|AIR| unusual platele +40487|1161|62|7|37|39299.92|0.05|0.07|N|O|1996-09-03|1996-08-04|1996-09-28|NONE|SHIP|cording to the final, ironic foxes. busi +40512|396|97|1|33|42780.87|0.07|0.02|R|F|1993-11-02|1993-12-14|1993-11-14|DELIVER IN PERSON|TRUCK|ress depths. fluffily ironic instructions a +40512|1172|81|2|27|28975.59|0.09|0.08|R|F|1993-11-24|1993-11-30|1993-12-02|NONE|MAIL|lithely at the blithely bold foxes +40512|1373|12|3|28|35682.36|0.08|0.02|R|F|1993-12-15|1993-11-13|1993-12-22|TAKE BACK RETURN|RAIL|ar accounts sleep slyly ironic deposit +40512|1048|54|4|14|13286.56|0.01|0.05|R|F|1993-11-19|1993-11-10|1993-11-21|DELIVER IN PERSON|TRUCK|along the quickly final +40512|1833|20|5|24|41635.92|0.07|0.07|A|F|1993-11-22|1993-10-24|1993-12-02|COLLECT COD|TRUCK|s dazzle furiously along the f +40512|87|13|6|43|42444.44|0.00|0.06|R|F|1993-12-29|1993-11-27|1994-01-09|DELIVER IN PERSON|MAIL| ideas use. regular requests c +40513|656|50|1|17|26463.05|0.04|0.07|N|O|1996-08-15|1996-07-06|1996-09-07|TAKE BACK RETURN|SHIP|express, special ideas. requests un +40513|254|55|2|17|19622.25|0.07|0.01|N|O|1996-07-09|1996-08-14|1996-08-03|NONE|FOB|ts. realms affix furiously fl +40513|58|59|3|28|26825.40|0.09|0.03|N|O|1996-06-04|1996-07-08|1996-06-20|NONE|REG AIR| theodolites +40513|456|86|4|15|20346.75|0.01|0.07|N|O|1996-08-23|1996-07-06|1996-09-08|DELIVER IN PERSON|MAIL|ependencies. ironic deposits are agai +40514|701|98|1|12|19220.40|0.04|0.00|N|O|1998-06-30|1998-05-25|1998-07-22|COLLECT COD|RAIL|sly final accounts poac +40514|239|21|2|37|42151.51|0.07|0.04|N|O|1998-05-19|1998-05-31|1998-06-03|TAKE BACK RETURN|FOB|ites. slyly even pa +40514|763|60|3|1|1663.76|0.06|0.03|N|O|1998-04-17|1998-06-25|1998-04-21|TAKE BACK RETURN|AIR|ealthy foxes. blithe +40514|1097|3|4|36|35931.24|0.08|0.04|N|O|1998-04-22|1998-05-26|1998-05-16|COLLECT COD|REG AIR|ngside of the carefully fin +40514|814|15|5|20|34296.20|0.07|0.01|N|O|1998-04-20|1998-06-13|1998-05-03|TAKE BACK RETURN|MAIL|eas wake furiously. requests +40514|1860|47|6|42|73998.12|0.08|0.06|N|O|1998-05-18|1998-06-25|1998-06-05|TAKE BACK RETURN|MAIL|ng the furiously ironic accounts a +40514|11|12|7|34|30974.34|0.02|0.00|N|O|1998-05-01|1998-05-23|1998-05-12|NONE|FOB|packages. furiously +40515|364|65|1|12|15172.32|0.05|0.02|N|O|1996-05-08|1996-03-26|1996-06-06|COLLECT COD|MAIL| blithely alongside of the furio +40515|1175|76|2|40|43046.80|0.10|0.04|N|O|1996-03-19|1996-03-27|1996-04-15|NONE|AIR|arefully fur +40515|81|7|3|50|49054.00|0.01|0.08|N|O|1996-04-06|1996-04-17|1996-05-01|COLLECT COD|SHIP|arefully pending requests wake +40515|184|63|4|27|29272.86|0.01|0.02|N|O|1996-05-20|1996-04-02|1996-05-31|DELIVER IN PERSON|REG AIR|yly regular requests. carefully d +40515|1989|34|5|30|56729.40|0.09|0.06|N|O|1996-05-06|1996-03-05|1996-05-13|COLLECT COD|SHIP|usly? blithely even requests haggle quic +40516|1507|88|1|35|49297.50|0.06|0.08|N|O|1996-09-19|1996-09-06|1996-10-16|TAKE BACK RETURN|SHIP|instructions c +40516|1075|81|2|1|976.07|0.02|0.05|N|O|1996-07-21|1996-09-16|1996-07-28|TAKE BACK RETURN|RAIL| regular realms. s +40516|1601|84|3|27|40570.20|0.00|0.03|N|O|1996-08-06|1996-09-23|1996-08-15|NONE|MAIL|y bold deposits about the even +40517|25|76|1|46|42550.92|0.06|0.03|N|O|1996-06-15|1996-05-25|1996-07-09|NONE|MAIL| carefully specia +40517|1529|50|2|25|35763.00|0.03|0.05|N|O|1996-08-08|1996-05-10|1996-08-28|COLLECT COD|RAIL|tions. ironic, ironic cour +40518|1185|22|1|6|6517.08|0.02|0.00|R|F|1994-05-20|1994-05-08|1994-05-22|NONE|AIR|le bold pinto beans: slyly ir +40518|1398|37|2|1|1299.39|0.00|0.05|A|F|1994-05-18|1994-06-05|1994-06-15|NONE|AIR|y pending saute +40518|1536|77|3|36|51751.08|0.06|0.03|A|F|1994-03-17|1994-04-28|1994-04-09|NONE|MAIL|. foxes wak +40519|552|43|1|28|40671.40|0.09|0.04|A|F|1994-01-25|1994-02-24|1994-02-12|COLLECT COD|FOB|ut the carefull +40544|1348|63|1|12|14992.08|0.00|0.06|R|F|1994-06-03|1994-05-15|1994-07-03|TAKE BACK RETURN|TRUCK|uffily patterns. ironic packages sleep +40544|370|55|2|37|47003.69|0.00|0.05|R|F|1994-05-26|1994-05-24|1994-05-30|NONE|TRUCK|ly final accounts against the furiously e +40544|268|23|3|25|29206.50|0.06|0.02|A|F|1994-05-29|1994-06-23|1994-06-20|COLLECT COD|REG AIR|ng slyly special idea +40544|540|31|4|36|51859.44|0.10|0.04|A|F|1994-07-21|1994-06-08|1994-08-10|NONE|RAIL|nod slyly. bold excuses sleep slyly abo +40544|672|35|5|5|7863.35|0.03|0.03|A|F|1994-04-19|1994-06-09|1994-04-20|TAKE BACK RETURN|RAIL|pliers. furiously pending re +40544|40|41|6|1|940.04|0.00|0.08|A|F|1994-05-06|1994-05-21|1994-05-26|DELIVER IN PERSON|AIR|riously. slyly regu +40545|483|13|1|39|53955.72|0.07|0.07|N|O|1998-02-12|1998-01-05|1998-02-26|NONE|MAIL|unts. excuses after the quic +40545|1913|14|2|18|32668.38|0.07|0.06|N|O|1997-12-15|1998-01-05|1997-12-22|COLLECT COD|MAIL| mold carefu +40545|721|22|3|29|47029.88|0.05|0.07|N|O|1998-03-30|1998-02-05|1998-04-19|COLLECT COD|SHIP|telets sleep carefully ironic requests. +40546|1158|31|1|36|38129.40|0.05|0.08|A|F|1993-09-23|1993-08-03|1993-10-13|NONE|MAIL|kages sleep +40547|720|17|1|46|74553.12|0.03|0.07|R|F|1994-07-25|1994-08-16|1994-08-18|DELIVER IN PERSON|AIR| excuses. fluffily bold +40547|1573|94|2|27|39813.39|0.10|0.05|R|F|1994-10-26|1994-08-13|1994-11-24|TAKE BACK RETURN|FOB|iously regular foxes. requests cajole f +40548|564|95|1|28|41007.68|0.00|0.00|N|O|1997-08-04|1997-08-23|1997-08-17|COLLECT COD|FOB|ss packages shall have to wake fluffi +40548|549|40|2|31|44935.74|0.09|0.05|N|O|1997-08-02|1997-06-29|1997-08-15|COLLECT COD|AIR|heodolites. blithe, +40548|1987|76|3|5|9444.90|0.08|0.04|N|O|1997-06-12|1997-07-31|1997-06-21|DELIVER IN PERSON|REG AIR|aggle furiousl +40548|847|81|4|30|52435.20|0.05|0.02|N|O|1997-06-16|1997-07-20|1997-07-06|NONE|SHIP|ses. quickly permanent pinto beans dazz +40548|1814|44|5|35|60053.35|0.07|0.07|N|O|1997-06-23|1997-07-24|1997-07-08|DELIVER IN PERSON|TRUCK|he quickly +40548|1382|83|6|5|6416.90|0.08|0.08|N|O|1997-08-26|1997-07-20|1997-09-18|TAKE BACK RETURN|SHIP|nto beans. blit +40548|485|73|7|15|20782.20|0.05|0.08|N|O|1997-08-31|1997-06-25|1997-09-25|COLLECT COD|MAIL|le fluffily bold pinto beans. carefully +40549|316|45|1|47|57166.57|0.10|0.07|N|O|1996-12-02|1996-10-27|1996-12-13|TAKE BACK RETURN|SHIP| carefully against the bold request +40549|26|52|2|12|11112.24|0.09|0.07|N|O|1996-11-18|1996-11-29|1996-12-03|COLLECT COD|SHIP| carefully final requests wake fi +40549|33|84|3|31|28923.93|0.08|0.07|N|O|1996-12-06|1996-10-27|1996-12-12|TAKE BACK RETURN|RAIL|to the furiou +40549|823|90|4|13|22409.66|0.09|0.01|N|O|1996-11-14|1996-11-29|1996-12-03|COLLECT COD|MAIL|idle deposits are. even +40550|1568|49|1|47|69069.32|0.02|0.02|N|O|1996-06-27|1996-07-24|1996-07-23|TAKE BACK RETURN|FOB|deposits besides the regular pinto be +40550|942|77|2|30|55288.20|0.05|0.06|N|O|1996-09-17|1996-08-29|1996-09-20|TAKE BACK RETURN|REG AIR|le pinto beans. express, final deposits bes +40550|1183|84|3|46|49872.28|0.04|0.00|N|O|1996-06-26|1996-07-25|1996-06-30|DELIVER IN PERSON|REG AIR|ts nag quickly. ironic +40550|1686|69|4|32|50805.76|0.00|0.08|N|O|1996-07-14|1996-09-05|1996-08-01|NONE|AIR|st slyly according to the slyly b +40550|428|29|5|7|9298.94|0.07|0.08|N|O|1996-07-30|1996-08-05|1996-08-26|TAKE BACK RETURN|FOB|ly above the special, express depo +40550|1406|24|6|6|7844.40|0.01|0.06|N|O|1996-08-04|1996-07-25|1996-08-18|COLLECT COD|MAIL|efully special requests cajole +40551|1072|8|1|18|17515.26|0.06|0.00|R|F|1993-10-14|1993-11-30|1993-11-08|DELIVER IN PERSON|RAIL|ages. furiously regular frets +40551|1740|41|2|47|77161.78|0.10|0.08|R|F|1993-10-31|1993-11-24|1993-11-12|TAKE BACK RETURN|RAIL|fter the final depths wake +40551|419|49|3|7|9235.87|0.03|0.06|R|F|1993-12-15|1993-12-05|1994-01-07|TAKE BACK RETURN|REG AIR|use boldly +40551|1135|44|4|1|1036.13|0.05|0.06|R|F|1993-09-19|1993-11-24|1993-10-05|DELIVER IN PERSON|RAIL|gle slyly. fluffily un +40576|633|96|1|4|6134.52|0.07|0.07|A|F|1992-09-25|1992-07-27|1992-10-21|NONE|AIR|ss foxes haggle f +40577|657|58|1|1|1557.65|0.08|0.01|N|O|1998-02-03|1998-01-14|1998-02-12|DELIVER IN PERSON|TRUCK|r packages? fur +40577|1563|84|2|32|46865.92|0.08|0.02|N|O|1997-12-14|1998-02-02|1998-01-11|TAKE BACK RETURN|AIR|c asymptotes. even, express asymp +40577|1661|85|3|4|6250.64|0.07|0.07|N|O|1998-03-25|1998-02-19|1998-04-24|DELIVER IN PERSON|AIR|its. requests after the caref +40577|299|81|4|43|51569.47|0.06|0.02|N|O|1998-02-04|1998-03-06|1998-02-23|COLLECT COD|REG AIR|instructions. slyly even accounts ha +40577|320|77|5|20|24406.40|0.07|0.06|N|O|1998-02-24|1998-03-03|1998-03-26|DELIVER IN PERSON|MAIL|aggle. packages could b +40578|1515|56|1|28|39662.28|0.06|0.04|N|O|1997-01-03|1996-12-14|1997-01-28|TAKE BACK RETURN|FOB|ial deposits above the theodolites +40578|1024|25|2|35|32375.70|0.02|0.03|N|O|1996-11-25|1996-11-12|1996-12-05|COLLECT COD|AIR|ly close package +40578|281|63|3|1|1181.28|0.03|0.07|N|O|1996-09-27|1996-11-07|1996-09-30|NONE|REG AIR|deas. pend +40578|600|61|4|32|48019.20|0.02|0.03|N|O|1996-11-03|1996-12-03|1996-11-15|COLLECT COD|TRUCK|l, final deposits was careful +40578|1679|62|5|13|20548.71|0.05|0.02|N|O|1996-10-02|1996-12-12|1996-10-18|TAKE BACK RETURN|RAIL|lyly blithely bold fre +40578|1496|75|6|16|22359.84|0.01|0.01|N|O|1996-10-24|1996-12-02|1996-11-16|DELIVER IN PERSON|FOB|des cajole around the blithely pendin +40578|1590|91|7|35|52205.65|0.06|0.00|N|O|1996-09-20|1996-12-14|1996-09-23|NONE|FOB|slyly silent theodolites print care +40579|735|100|1|29|47436.17|0.04|0.04|N|O|1997-01-22|1996-12-08|1997-02-01|COLLECT COD|RAIL|unts dazzle fluffily about the +40579|1996|97|2|20|37959.80|0.06|0.05|N|O|1996-12-04|1996-12-01|1996-12-17|DELIVER IN PERSON|MAIL|edly among the carefully regular +40579|1623|65|3|18|27443.16|0.03|0.02|N|O|1997-01-15|1997-01-08|1997-01-22|NONE|MAIL| enticing pinto beans slee +40579|1585|66|4|23|34191.34|0.07|0.04|N|O|1997-01-28|1997-01-24|1997-02-13|NONE|FOB|yers boost al +40579|1452|53|5|21|28422.45|0.04|0.05|N|O|1996-12-27|1996-12-12|1996-12-31|NONE|AIR|ithely. slyly final acc +40579|107|60|6|11|11078.10|0.02|0.07|N|O|1997-02-02|1996-12-30|1997-02-15|NONE|TRUCK|y express depen +40580|1838|39|1|46|80032.18|0.06|0.04|N|O|1996-10-17|1996-10-20|1996-10-30|DELIVER IN PERSON|FOB|tions? idly eve +40580|1341|18|2|18|22362.12|0.04|0.08|N|O|1997-01-12|1996-11-27|1997-02-10|NONE|TRUCK|ding courts cajole slyly furiously thin cou +40580|124|25|3|49|50181.88|0.00|0.00|N|O|1996-12-02|1996-11-18|1996-12-22|TAKE BACK RETURN|MAIL| theodolites. special ideas cajole. t +40580|1900|87|4|18|32434.20|0.07|0.02|N|O|1996-10-27|1996-11-27|1996-11-24|COLLECT COD|REG AIR| slyly even dolphins +40581|281|63|1|3|3543.84|0.01|0.00|N|O|1996-05-22|1996-06-21|1996-05-29|COLLECT COD|SHIP|ay carefully about +40581|26|77|2|19|17594.38|0.09|0.03|N|O|1996-05-28|1996-07-18|1996-06-07|NONE|SHIP|around the slyly silent instructions. sl +40581|1290|28|3|43|51225.47|0.07|0.06|N|O|1996-07-26|1996-06-15|1996-08-05|TAKE BACK RETURN|RAIL|ptotes. slyly ironic theodolites dou +40582|603|4|1|22|33079.20|0.09|0.04|N|O|1997-07-19|1997-07-30|1997-07-25|TAKE BACK RETURN|AIR|nt warthogs. carefully ironi +40582|778|11|2|16|26860.32|0.01|0.08|N|O|1997-07-06|1997-08-22|1997-07-23|TAKE BACK RETURN|SHIP|es against t +40582|1645|69|3|20|30932.80|0.10|0.02|N|O|1997-07-31|1997-08-16|1997-08-13|COLLECT COD|TRUCK|above the quickly +40582|1481|82|4|4|5529.92|0.08|0.05|N|O|1997-06-10|1997-07-04|1997-07-10|TAKE BACK RETURN|SHIP|wake blithely. fluff +40582|1454|33|5|13|17620.85|0.03|0.04|N|O|1997-09-22|1997-07-12|1997-10-02|DELIVER IN PERSON|FOB|fily special theodolites: +40582|1675|17|6|14|22073.38|0.04|0.01|N|O|1997-08-06|1997-07-26|1997-08-17|TAKE BACK RETURN|SHIP|s cajole against the slyly +40583|416|75|1|16|21062.56|0.02|0.03|N|O|1998-02-28|1998-05-02|1998-03-01|NONE|REG AIR|ffily acro +40583|366|95|2|19|24060.84|0.07|0.03|N|O|1998-03-31|1998-05-19|1998-04-21|DELIVER IN PERSON|AIR|e slyly dep +40583|892|59|3|33|59165.37|0.10|0.05|N|O|1998-06-21|1998-05-10|1998-06-30|TAKE BACK RETURN|FOB|riously. furious +40583|283|38|4|47|55614.16|0.07|0.07|N|O|1998-04-27|1998-05-12|1998-05-20|TAKE BACK RETURN|SHIP|ironic requests. pending packages m +40583|1427|45|5|30|39852.60|0.06|0.03|N|O|1998-04-28|1998-05-06|1998-05-14|DELIVER IN PERSON|RAIL|lly even asymptotes. furiou +40583|554|45|6|38|55272.90|0.01|0.05|N|O|1998-06-16|1998-04-29|1998-06-22|DELIVER IN PERSON|MAIL|ronic excuses hang finally among the sly +40583|761|62|7|25|41544.00|0.10|0.04|N|O|1998-03-02|1998-04-19|1998-04-01|COLLECT COD|TRUCK|inst the regular accounts. expre +40608|165|92|1|9|9586.44|0.03|0.06|A|F|1992-12-19|1992-10-19|1993-01-08|COLLECT COD|TRUCK|ackages in +40608|563|24|2|13|19026.28|0.06|0.06|R|F|1992-08-30|1992-09-21|1992-09-20|TAKE BACK RETURN|AIR|c deposits nag sly +40608|1449|67|3|25|33761.00|0.06|0.04|A|F|1992-08-21|1992-11-03|1992-09-10|NONE|TRUCK| carefully regu +40608|1666|8|4|38|59571.08|0.01|0.01|R|F|1992-11-02|1992-11-09|1992-11-18|COLLECT COD|FOB|ress instructions integrate b +40609|1138|39|1|47|48839.11|0.06|0.01|R|F|1993-09-15|1993-08-20|1993-10-02|DELIVER IN PERSON|SHIP|. carefully ironic foxes wake blithely aft +40609|1488|6|2|43|59747.64|0.03|0.04|R|F|1993-09-08|1993-07-26|1993-09-26|TAKE BACK RETURN|REG AIR|w excuses. fluffily bold ideas nag always +40610|791|92|1|28|47370.12|0.00|0.04|R|F|1992-06-26|1992-08-05|1992-07-19|COLLECT COD|REG AIR| theodolites wake quickly platelets. +40610|1136|45|2|21|21779.73|0.08|0.01|R|F|1992-06-29|1992-07-13|1992-07-20|COLLECT COD|RAIL|are quickly blithely pending pac +40610|1980|69|3|17|31993.66|0.04|0.06|R|F|1992-08-29|1992-07-29|1992-09-07|DELIVER IN PERSON|REG AIR|sias detect quickly along th +40610|680|12|4|22|34774.96|0.05|0.04|A|F|1992-09-06|1992-08-19|1992-09-21|DELIVER IN PERSON|REG AIR|ress after +40611|1650|92|1|6|9309.90|0.01|0.08|R|F|1992-07-22|1992-05-01|1992-08-20|TAKE BACK RETURN|MAIL|le fluffily. carefully special pa +40611|1398|37|2|36|46778.04|0.03|0.07|A|F|1992-05-07|1992-06-25|1992-05-23|TAKE BACK RETURN|AIR|ously regular ideas use slyly b +40611|110|89|3|33|33333.63|0.04|0.03|A|F|1992-06-16|1992-05-26|1992-07-10|NONE|FOB|y regular id +40611|66|42|4|30|28981.80|0.01|0.04|A|F|1992-05-01|1992-06-20|1992-05-05|DELIVER IN PERSON|RAIL|al theodoli +40612|650|51|1|20|31013.00|0.06|0.06|R|F|1995-05-24|1995-04-01|1995-06-12|TAKE BACK RETURN|FOB|arefully. fluffily ironic deposits wake q +40612|1289|64|2|48|57133.44|0.01|0.04|R|F|1995-05-01|1995-04-22|1995-05-26|NONE|MAIL|riously pending instructions. +40612|159|86|3|10|10591.50|0.09|0.02|A|F|1995-05-12|1995-05-28|1995-06-07|COLLECT COD|TRUCK|posits engage about t +40612|626|89|4|43|65644.66|0.01|0.05|A|F|1995-03-11|1995-05-01|1995-03-26|DELIVER IN PERSON|RAIL|ously even packages sleep q +40612|1112|49|5|18|18235.98|0.05|0.07|N|O|1995-06-22|1995-05-16|1995-07-08|NONE|AIR|he final pinto beans. asym +40612|1954|99|6|12|22271.40|0.04|0.06|N|O|1995-06-24|1995-04-12|1995-07-10|COLLECT COD|RAIL|ages. slyly final requests sle +40612|1810|40|7|27|46218.87|0.07|0.03|R|F|1995-05-05|1995-04-15|1995-05-19|DELIVER IN PERSON|MAIL|fully express packages. carefully regu +40613|1829|73|1|47|81348.54|0.06|0.04|N|O|1997-05-23|1997-06-13|1997-06-16|COLLECT COD|AIR|ites. final, pending theodolites wake flu +40613|748|45|2|34|56057.16|0.05|0.05|N|O|1997-05-07|1997-07-04|1997-05-18|TAKE BACK RETURN|REG AIR|about the ironi +40613|847|48|3|39|68165.76|0.10|0.06|N|O|1997-05-02|1997-06-25|1997-05-17|NONE|MAIL|unts sleep slyly theodolites. +40613|1684|85|4|40|63427.20|0.04|0.01|N|O|1997-07-18|1997-06-04|1997-08-17|DELIVER IN PERSON|SHIP|ual deposits nag. eve +40613|786|87|5|2|3373.56|0.10|0.08|N|O|1997-08-07|1997-07-25|1997-08-15|DELIVER IN PERSON|SHIP|o the quickly bold ideas. quiet +40613|1058|64|6|43|41239.15|0.07|0.04|N|O|1997-08-14|1997-07-21|1997-08-24|NONE|MAIL|he carefully pending excuses affix sly +40613|602|34|7|7|10518.20|0.01|0.02|N|O|1997-06-15|1997-06-15|1997-07-14|TAKE BACK RETURN|TRUCK| to the final dep +40614|25|1|1|18|16650.36|0.07|0.06|N|O|1997-10-23|1997-11-15|1997-11-05|DELIVER IN PERSON|TRUCK|refully final packages wake against the de +40615|832|99|1|25|43320.75|0.09|0.03|R|F|1994-08-16|1994-08-29|1994-09-14|DELIVER IN PERSON|SHIP|thely regular sentiments haggle fu +40615|1205|43|2|17|18805.40|0.05|0.07|A|F|1994-10-26|1994-09-26|1994-11-19|COLLECT COD|FOB|ickly; instructions sleep blithely e +40615|1459|38|3|41|55778.45|0.08|0.01|R|F|1994-08-26|1994-09-20|1994-09-11|DELIVER IN PERSON|SHIP|heodolites. silent, regular platelets +40615|1353|54|4|34|42647.90|0.10|0.04|R|F|1994-08-03|1994-08-08|1994-08-07|TAKE BACK RETURN|TRUCK| ironic ideas must c +40615|1535|76|5|8|11492.24|0.04|0.06|R|F|1994-10-18|1994-09-22|1994-11-16|TAKE BACK RETURN|MAIL|nal requests haggle against the slyly sp +40640|809|43|1|46|78650.80|0.01|0.04|N|O|1998-09-01|1998-06-27|1998-09-02|NONE|MAIL|unusual dependencies. accounts +40640|1353|54|2|42|52682.70|0.04|0.06|N|O|1998-09-02|1998-07-28|1998-09-20|NONE|RAIL|yly furiou +40641|1649|50|1|4|6202.56|0.09|0.01|N|O|1996-01-06|1996-02-20|1996-01-12|DELIVER IN PERSON|RAIL|oost. slyly unusual pinto beans +40641|294|76|2|13|15525.77|0.04|0.03|N|O|1996-03-07|1996-02-12|1996-04-02|TAKE BACK RETURN|SHIP|lar package +40641|489|19|3|21|29179.08|0.07|0.08|N|O|1996-03-03|1995-12-30|1996-03-26|TAKE BACK RETURN|RAIL|ns sleep. blithely +40641|1489|29|4|36|50057.28|0.06|0.05|N|O|1996-03-22|1996-02-05|1996-03-27|COLLECT COD|AIR|ly even deposits. even accounts detect +40642|374|59|1|50|63718.50|0.05|0.05|N|O|1997-08-25|1997-07-20|1997-09-03|TAKE BACK RETURN|REG AIR|earls. ironic packages detect ca +40642|565|26|2|15|21983.40|0.06|0.03|N|O|1997-05-19|1997-06-13|1997-06-15|TAKE BACK RETURN|TRUCK|gside of the blith +40642|329|58|3|10|12293.20|0.03|0.08|N|O|1997-08-23|1997-07-15|1997-09-13|DELIVER IN PERSON|SHIP|? quickly expres +40643|1943|32|1|47|86712.18|0.06|0.08|A|F|1995-06-11|1995-05-26|1995-06-13|COLLECT COD|AIR|slyly unusual asymp +40643|421|9|2|42|55499.64|0.09|0.05|N|F|1995-06-14|1995-07-04|1995-06-18|COLLECT COD|TRUCK| carefully ironic i +40643|1157|58|3|14|14814.10|0.02|0.02|A|F|1995-05-10|1995-06-17|1995-06-08|COLLECT COD|RAIL|always regular pinto beans caj +40643|595|96|4|17|25425.03|0.10|0.07|A|F|1995-04-13|1995-05-26|1995-04-21|NONE|RAIL|y ironic dolphins. deposits +40643|241|96|5|26|29672.24|0.06|0.08|R|F|1995-05-22|1995-05-12|1995-06-14|DELIVER IN PERSON|SHIP|y ironic deposit +40643|395|24|6|25|32384.75|0.06|0.06|N|O|1995-06-24|1995-06-27|1995-07-01|DELIVER IN PERSON|AIR|ounts. requests haggle +40643|1372|73|7|1|1273.37|0.09|0.04|N|F|1995-06-08|1995-06-17|1995-07-03|TAKE BACK RETURN|FOB|ly bold theodolites. furiously +40644|1862|49|1|47|82901.42|0.09|0.02|N|O|1998-06-08|1998-06-18|1998-06-26|NONE|TRUCK|express packages affix always unusual +40644|255|10|2|10|11552.50|0.05|0.06|N|O|1998-07-19|1998-07-11|1998-08-17|TAKE BACK RETURN|FOB|es cajole. furiously pending requests b +40644|1639|63|3|24|36975.12|0.04|0.04|N|O|1998-08-14|1998-06-21|1998-08-27|NONE|AIR|s print quickly bold, +40644|1010|16|4|9|8199.09|0.01|0.01|N|O|1998-05-15|1998-07-02|1998-05-17|COLLECT COD|MAIL|carefully final +40644|1875|5|5|3|5330.61|0.02|0.07|N|O|1998-07-18|1998-05-22|1998-07-30|NONE|TRUCK|nic accounts. final +40644|1943|44|6|48|88557.12|0.07|0.04|N|O|1998-06-16|1998-07-15|1998-06-18|NONE|SHIP|s. carefully fluffy id +40645|321|50|1|16|19541.12|0.01|0.07|A|F|1992-12-18|1993-02-21|1992-12-27|TAKE BACK RETURN|FOB|cuses cajole furiously among the th +40645|31|32|2|30|27930.90|0.08|0.08|A|F|1993-04-02|1993-03-07|1993-04-13|NONE|MAIL|ckey players thrash furiously al +40645|559|90|3|50|72977.50|0.01|0.06|A|F|1993-01-10|1993-02-08|1993-01-30|DELIVER IN PERSON|RAIL|excuses wak +40645|1030|66|4|11|10241.33|0.05|0.06|R|F|1993-03-23|1993-02-11|1993-04-09|DELIVER IN PERSON|MAIL|heodolites sleep ev +40646|46|22|1|11|10406.44|0.10|0.00|A|F|1993-01-15|1993-01-14|1993-01-16|COLLECT COD|FOB|sts; final, special foxes use carefu +40646|1998|99|2|15|28499.85|0.05|0.01|R|F|1993-03-10|1993-01-23|1993-03-17|COLLECT COD|AIR| the regular packages are sl +40646|1449|50|3|16|21607.04|0.03|0.03|R|F|1993-01-02|1993-02-02|1993-01-07|TAKE BACK RETURN|SHIP|s. carefully unu +40646|29|55|4|21|19509.42|0.08|0.00|R|F|1993-03-16|1993-01-08|1993-04-12|TAKE BACK RETURN|SHIP|among the blithely ironic requests +40647|1433|51|1|38|50708.34|0.04|0.06|A|F|1994-09-16|1994-09-20|1994-09-21|TAKE BACK RETURN|TRUCK|al, regular dependencies ar +40647|1330|69|2|46|56641.18|0.06|0.06|R|F|1994-08-21|1994-10-09|1994-08-31|COLLECT COD|TRUCK|n foxes haggl +40647|1144|53|3|21|21947.94|0.10|0.08|R|F|1994-11-18|1994-11-13|1994-11-24|DELIVER IN PERSON|SHIP|mptotes sleep slyly pen +40647|1428|46|4|32|42541.44|0.05|0.08|R|F|1994-09-24|1994-10-06|1994-10-18|NONE|RAIL|ests wake across the even d +40647|1227|65|5|33|37231.26|0.10|0.01|R|F|1994-08-27|1994-09-23|1994-09-25|COLLECT COD|FOB|ic requests above t +40647|798|31|6|2|3397.58|0.02|0.01|A|F|1994-12-14|1994-10-30|1994-12-19|TAKE BACK RETURN|TRUCK|nto beans. pending acc +40647|1060|31|7|12|11532.72|0.05|0.02|R|F|1994-11-20|1994-09-30|1994-12-17|TAKE BACK RETURN|SHIP|alongside of the ironi +40672|1954|43|1|8|14847.60|0.03|0.00|A|F|1993-02-07|1992-12-07|1993-02-21|DELIVER IN PERSON|REG AIR|ic ideas run. furiously even instru +40672|667|61|2|13|20379.58|0.06|0.07|A|F|1992-11-12|1992-12-06|1992-11-19|DELIVER IN PERSON|FOB|ely pending instructions +40672|453|83|3|44|59551.80|0.05|0.02|R|F|1993-01-19|1992-12-11|1993-02-13|NONE|RAIL|bout the ironic, unusual plat +40673|1693|94|1|48|76545.12|0.09|0.06|R|F|1992-04-18|1992-03-30|1992-05-01|COLLECT COD|AIR|. regular, ironic ideas sleep. blithel +40673|200|79|2|25|27505.00|0.06|0.05|R|F|1992-04-20|1992-04-29|1992-05-15|COLLECT COD|FOB|unusual requests nod slyly b +40673|1833|63|3|31|53779.73|0.02|0.08|A|F|1992-04-09|1992-05-14|1992-05-06|NONE|SHIP| packages around the depende +40673|1700|1|4|29|46449.30|0.05|0.06|R|F|1992-05-08|1992-03-26|1992-05-28|DELIVER IN PERSON|MAIL| the carefully regular pl +40673|599|30|5|9|13496.31|0.09|0.02|R|F|1992-06-17|1992-05-18|1992-06-22|TAKE BACK RETURN|FOB|ly regular req +40673|104|83|6|12|12049.20|0.10|0.01|R|F|1992-03-24|1992-05-08|1992-04-02|NONE|RAIL| pinto beans are across +40674|393|94|1|10|12933.90|0.08|0.00|N|O|1997-10-23|1997-11-29|1997-11-07|TAKE BACK RETURN|AIR|final, final de +40674|238|39|2|6|6829.38|0.01|0.02|N|O|1998-01-23|1997-12-04|1998-02-09|COLLECT COD|SHIP|along the express ideas boost b +40674|706|3|3|10|16067.00|0.10|0.08|N|O|1997-10-14|1997-12-26|1997-10-21|COLLECT COD|AIR| evenly ironic theodolites ha +40674|1261|99|4|17|19758.42|0.04|0.08|N|O|1998-01-28|1997-12-28|1998-02-14|COLLECT COD|REG AIR|totes integrate blith +40674|1978|23|5|12|22559.64|0.05|0.01|N|O|1998-01-25|1997-12-04|1998-02-17|COLLECT COD|REG AIR|y even orbits; pinto beans are be +40674|707|4|6|46|73954.20|0.04|0.05|N|O|1998-01-20|1997-11-25|1998-01-22|NONE|TRUCK|l packages nag into the slyly ironic +40675|1750|35|1|2|3303.50|0.03|0.02|A|F|1994-03-27|1994-05-17|1994-04-23|DELIVER IN PERSON|FOB|lyly even pinto beans. slyly i +40675|1425|26|2|17|22549.14|0.07|0.05|R|F|1994-04-11|1994-06-10|1994-04-12|TAKE BACK RETURN|FOB|s detect. slyly express pack +40676|1416|56|1|1|1317.41|0.00|0.08|R|F|1992-06-23|1992-05-15|1992-07-05|TAKE BACK RETURN|FOB|e foxes. regular packages hagg +40676|120|73|2|3|3060.36|0.01|0.08|A|F|1992-07-22|1992-06-15|1992-08-19|DELIVER IN PERSON|REG AIR|ironic waters. bold packages sleep. instru +40676|1350|51|3|18|22524.30|0.09|0.00|A|F|1992-06-07|1992-04-27|1992-06-30|TAKE BACK RETURN|SHIP|ages against the final deposits slee +40676|759|56|4|17|28215.75|0.04|0.00|A|F|1992-04-25|1992-06-08|1992-05-25|DELIVER IN PERSON|REG AIR|s use slyly furiously special requests. sly +40677|70|21|1|48|46563.36|0.06|0.06|R|F|1993-10-02|1993-12-02|1993-10-15|TAKE BACK RETURN|TRUCK| pinto beans to +40677|28|29|2|49|45472.98|0.04|0.08|R|F|1993-09-22|1993-12-05|1993-10-19|DELIVER IN PERSON|MAIL| special asymptotes nag carefully r +40678|755|56|1|31|51328.25|0.02|0.02|R|F|1993-07-30|1993-06-04|1993-08-18|NONE|RAIL|es. ironically special r +40678|1517|58|2|14|19859.14|0.03|0.07|A|F|1993-05-16|1993-06-15|1993-05-30|NONE|REG AIR|lent accounts across the id +40678|550|11|3|38|55120.90|0.01|0.02|R|F|1993-07-17|1993-06-18|1993-08-14|TAKE BACK RETURN|FOB|ithely. braids +40678|1572|13|4|40|58942.80|0.06|0.04|A|F|1993-06-07|1993-06-08|1993-06-10|DELIVER IN PERSON|TRUCK|sts maintain carefully. ironic ideas boost +40679|506|7|1|30|42195.00|0.05|0.05|R|F|1993-06-17|1993-08-03|1993-07-14|NONE|RAIL|ies wake. regular +40679|1260|98|2|41|47611.66|0.05|0.04|A|F|1993-08-26|1993-09-11|1993-09-12|NONE|AIR|eep carefully against the furiously even +40679|1734|61|3|8|13085.84|0.08|0.08|A|F|1993-08-03|1993-08-12|1993-08-16|NONE|TRUCK|the quickly fluff +40679|1653|54|4|42|65295.30|0.05|0.08|A|F|1993-09-02|1993-07-21|1993-09-28|TAKE BACK RETURN|TRUCK|ironic, unusual asymptotes +40704|1898|99|1|10|17998.90|0.09|0.07|R|F|1994-03-20|1994-02-07|1994-04-11|TAKE BACK RETURN|REG AIR|its cajole along the +40704|1339|54|2|18|22325.94|0.03|0.07|A|F|1994-01-29|1994-02-18|1994-02-12|TAKE BACK RETURN|FOB|special pack +40704|1151|24|3|28|29460.20|0.04|0.03|A|F|1994-02-22|1994-03-20|1994-02-23|COLLECT COD|RAIL|l theodolites. instr +40704|1614|15|4|30|45468.30|0.06|0.05|R|F|1994-01-30|1994-02-21|1994-02-12|DELIVER IN PERSON|RAIL|ously regular frays. special +40704|57|83|5|27|25840.35|0.09|0.07|R|F|1994-02-18|1994-03-07|1994-03-01|NONE|RAIL|blithely re +40704|1888|75|6|7|12529.16|0.07|0.07|R|F|1994-04-18|1994-03-16|1994-04-30|DELIVER IN PERSON|MAIL|ithely pending idea +40704|1420|38|7|33|43606.86|0.07|0.05|R|F|1994-03-19|1994-03-09|1994-03-26|NONE|AIR|heodolites are. packages us +40705|1722|65|1|9|14613.48|0.01|0.05|N|O|1997-05-02|1997-04-14|1997-05-17|TAKE BACK RETURN|REG AIR|uickly unusual deposits. +40705|1367|82|2|4|5073.44|0.07|0.01|N|O|1997-03-30|1997-04-25|1997-04-23|TAKE BACK RETURN|SHIP|luffy pinto beans are quickly. acco +40705|959|62|3|18|33479.10|0.03|0.06|N|O|1997-03-18|1997-05-03|1997-04-04|TAKE BACK RETURN|REG AIR| ironic, bold pa +40705|1863|64|4|9|15883.74|0.00|0.06|N|O|1997-06-07|1997-04-12|1997-06-20|NONE|RAIL|ar packages wake against the f +40705|1442|43|5|35|47020.40|0.02|0.02|N|O|1997-05-29|1997-04-24|1997-06-05|NONE|AIR|s grow carefully carefully bold asympt +40706|1803|4|1|37|63077.60|0.09|0.06|R|F|1992-05-04|1992-04-05|1992-05-13|DELIVER IN PERSON|REG AIR|lent deposits. quickly even a +40706|1677|78|2|46|72618.82|0.07|0.07|A|F|1992-04-08|1992-04-11|1992-04-23|DELIVER IN PERSON|SHIP| express, bold foxes above the carefully +40706|1284|59|3|19|22520.32|0.02|0.06|R|F|1992-05-15|1992-03-11|1992-05-23|NONE|REG AIR| around the s +40706|1683|7|4|11|17431.48|0.04|0.06|A|F|1992-04-30|1992-03-03|1992-05-18|NONE|REG AIR|. ironic, express depend +40707|274|56|1|9|10568.43|0.03|0.00|R|F|1994-10-03|1994-08-07|1994-10-09|DELIVER IN PERSON|REG AIR|onic dolphins. sly +40708|732|97|1|1|1632.73|0.03|0.05|A|F|1994-11-28|1995-01-01|1994-12-01|DELIVER IN PERSON|MAIL|arefully bold d +40708|1811|12|2|3|5138.43|0.02|0.03|R|F|1995-01-28|1994-12-28|1995-02-26|TAKE BACK RETURN|MAIL|dolites sleep +40708|13|39|3|18|16434.18|0.01|0.03|A|F|1995-01-18|1994-12-15|1995-02-11|TAKE BACK RETURN|SHIP|ven accounts d +40708|1749|34|4|23|37967.02|0.09|0.05|A|F|1994-11-22|1994-12-02|1994-12-16|DELIVER IN PERSON|TRUCK|s. blithely regular excuses s +40708|343|44|5|44|54706.96|0.02|0.05|A|F|1994-12-11|1995-01-09|1994-12-25|COLLECT COD|REG AIR|. blithely even d +40708|738|35|6|36|58994.28|0.05|0.03|R|F|1994-11-29|1994-11-24|1994-12-24|COLLECT COD|MAIL|. fluffily regular accounts accordi +40708|710|75|7|40|64428.40|0.01|0.07|A|F|1994-12-12|1994-12-23|1994-12-17|COLLECT COD|SHIP|lyly final in +40709|335|64|1|41|50648.53|0.00|0.01|N|O|1995-10-19|1995-12-05|1995-10-31|NONE|FOB|fily final instructions sle +40710|1325|2|1|18|22073.76|0.10|0.01|N|O|1996-07-24|1996-08-29|1996-08-23|DELIVER IN PERSON|TRUCK|. special, regular +40711|1098|69|1|40|39963.60|0.09|0.06|R|F|1992-09-14|1992-08-17|1992-10-03|DELIVER IN PERSON|MAIL|efully. instructions +40711|1083|89|2|36|35426.88|0.05|0.07|R|F|1992-07-17|1992-08-15|1992-07-23|COLLECT COD|RAIL|sly above the slyly ironic courts. stealthi +40711|1517|98|3|30|42555.30|0.08|0.02|R|F|1992-08-27|1992-09-10|1992-08-28|NONE|MAIL| requests haggle carefully +40711|1109|10|4|43|43434.30|0.04|0.06|R|F|1992-09-26|1992-10-03|1992-09-29|DELIVER IN PERSON|SHIP|yly pending requests must +40711|476|35|5|13|17894.11|0.09|0.04|A|F|1992-08-19|1992-09-24|1992-09-02|NONE|TRUCK|wake closely special pinto beans +40711|164|43|6|1|1064.16|0.03|0.02|A|F|1992-09-02|1992-10-05|1992-09-23|COLLECT COD|MAIL|ar foxes serv +40736|1941|42|1|2|3685.88|0.07|0.08|R|F|1993-01-21|1992-11-13|1993-02-03|COLLECT COD|AIR|ly final requests are furiously ab +40737|1292|67|1|3|3579.87|0.03|0.06|N|O|1997-10-17|1997-12-22|1997-11-06|TAKE BACK RETURN|REG AIR|the packages cajole sl +40737|543|4|2|6|8661.24|0.01|0.02|N|O|1997-11-28|1997-12-18|1997-12-22|NONE|MAIL|eodolites nag carefully. bravely fin +40737|1027|98|3|32|29696.64|0.00|0.05|N|O|1997-11-07|1998-01-08|1997-11-28|TAKE BACK RETURN|AIR|ng the carefully regular orbits are among t +40737|1136|9|4|26|26965.38|0.06|0.07|N|O|1997-12-12|1997-12-28|1998-01-06|DELIVER IN PERSON|RAIL|al requests are furiously warhorses. qu +40737|555|46|5|6|8733.30|0.09|0.00|N|O|1997-11-02|1997-12-04|1997-11-19|DELIVER IN PERSON|FOB| deposits. even requests +40738|863|30|1|12|21166.32|0.09|0.03|N|O|1998-03-17|1998-04-14|1998-03-21|NONE|FOB|integrate carefully fluffily silen +40738|788|53|2|12|20265.36|0.05|0.02|N|O|1998-04-29|1998-05-01|1998-05-29|NONE|REG AIR|blithely slow i +40738|680|12|3|2|3161.36|0.06|0.00|N|O|1998-04-11|1998-03-15|1998-04-30|NONE|FOB|sits. ruthless, regular inst +40738|1422|40|4|37|48966.54|0.00|0.03|N|O|1998-03-21|1998-04-16|1998-03-26|TAKE BACK RETURN|TRUCK|ies affix r +40738|1838|25|5|42|73072.86|0.02|0.06|N|O|1998-04-29|1998-03-11|1998-05-04|TAKE BACK RETURN|AIR|eposits. blithely ironic +40739|1093|99|1|12|11929.08|0.04|0.04|N|O|1998-10-07|1998-09-07|1998-10-18|DELIVER IN PERSON|RAIL|ckages after the furiousl +40739|73|24|2|5|4865.35|0.03|0.04|N|O|1998-08-15|1998-09-25|1998-08-16|DELIVER IN PERSON|AIR|integrate fluffily even account +40740|1944|45|1|15|27689.10|0.02|0.06|A|F|1994-07-06|1994-07-29|1994-07-12|COLLECT COD|FOB|unts. pinto beans cajole slyly. unusual, f +40741|1606|7|1|27|40705.20|0.05|0.06|N|O|1998-07-19|1998-06-13|1998-07-20|COLLECT COD|RAIL|sleep furiously slyly final depo +40741|1873|60|2|22|39047.14|0.06|0.03|N|O|1998-04-02|1998-05-02|1998-05-01|DELIVER IN PERSON|AIR|rate carefully. quickly unu +40741|286|41|3|24|28470.72|0.02|0.08|N|O|1998-06-27|1998-05-30|1998-07-17|TAKE BACK RETURN|RAIL|ymptotes. evenly regular instruct +40741|67|43|4|15|14505.90|0.01|0.07|N|O|1998-06-27|1998-05-14|1998-06-30|NONE|FOB| about the ironic deposits are blith +40741|782|83|5|38|63945.64|0.10|0.01|N|O|1998-05-23|1998-06-13|1998-06-20|DELIVER IN PERSON|FOB|uickly final deposits. regular ac +40741|435|36|6|47|62765.21|0.08|0.03|N|O|1998-06-04|1998-05-27|1998-06-06|TAKE BACK RETURN|AIR|ual pinto beans along the final d +40742|1533|74|1|10|14345.30|0.05|0.08|N|O|1998-02-21|1998-03-17|1998-03-13|TAKE BACK RETURN|SHIP|gularly alongside of the final pack +40742|960|95|2|6|11165.76|0.07|0.07|N|O|1998-02-13|1998-02-02|1998-02-15|DELIVER IN PERSON|RAIL|endencies are carefully furiously express +40742|308|37|3|15|18124.50|0.03|0.07|N|O|1998-04-26|1998-02-28|1998-05-20|COLLECT COD|AIR|. carefully regular excuses cajole blith +40742|1343|20|4|29|36085.86|0.05|0.07|N|O|1998-03-22|1998-02-15|1998-03-28|COLLECT COD|MAIL|usual requests cajole carefully; carefu +40743|1659|42|1|10|15606.50|0.03|0.04|N|O|1997-12-08|1998-01-13|1998-01-05|DELIVER IN PERSON|SHIP|hely bold dependenc +40743|941|44|2|21|38680.74|0.10|0.03|N|O|1997-11-25|1998-01-13|1997-11-27|NONE|REG AIR|uests against t +40743|1883|13|3|29|51761.52|0.01|0.07|N|O|1998-01-07|1998-01-12|1998-01-08|NONE|FOB|s accounts; carefully final th +40743|1088|94|4|6|5934.48|0.07|0.02|N|O|1998-01-24|1998-01-18|1998-02-11|DELIVER IN PERSON|TRUCK|ctions. furiously pending foxes use quick +40743|20|96|5|5|4600.10|0.10|0.04|N|O|1998-02-24|1997-12-08|1998-03-23|TAKE BACK RETURN|SHIP|theodolites: express ideas wake accordi +40768|1921|22|1|43|78385.56|0.03|0.08|N|O|1997-05-12|1997-05-24|1997-05-19|COLLECT COD|TRUCK|sly regular theodolites. fluffily +40769|1002|73|1|42|37926.00|0.03|0.02|N|O|1998-08-01|1998-07-18|1998-08-26|TAKE BACK RETURN|REG AIR|furiously pending in +40769|1458|59|2|31|42142.95|0.08|0.05|N|O|1998-07-05|1998-07-12|1998-07-15|TAKE BACK RETURN|MAIL|pinto beans c +40770|1762|89|1|37|61559.12|0.02|0.06|N|O|1995-07-29|1995-05-30|1995-08-03|COLLECT COD|REG AIR| accounts cajole +40770|506|7|2|49|68918.50|0.06|0.01|A|F|1995-05-21|1995-05-23|1995-05-27|DELIVER IN PERSON|SHIP|rts against the fluff +40771|1699|41|1|40|64027.60|0.06|0.01|N|O|1996-07-17|1996-06-06|1996-07-25|NONE|MAIL|ironic theodolites. theodolites use amo +40771|1468|8|2|39|53408.94|0.03|0.05|N|O|1996-07-13|1996-06-14|1996-08-08|DELIVER IN PERSON|SHIP|s wake fluffily +40771|1350|27|3|13|16267.55|0.02|0.02|N|O|1996-05-17|1996-06-30|1996-06-14|NONE|AIR|nusual pinto beans nag furiously afte +40771|424|83|4|29|38408.18|0.08|0.07|N|O|1996-05-11|1996-06-01|1996-06-08|DELIVER IN PERSON|REG AIR|ideas. final accounts wake among +40771|972|73|5|10|18729.70|0.01|0.01|N|O|1996-07-23|1996-06-10|1996-08-17|DELIVER IN PERSON|RAIL|alongside of +40771|71|22|6|16|15537.12|0.04|0.04|N|O|1996-04-21|1996-06-27|1996-05-06|DELIVER IN PERSON|MAIL|y pending instructions. slyl +40772|1756|83|1|36|59679.00|0.02|0.03|A|F|1992-05-17|1992-03-15|1992-05-27|NONE|MAIL| slyly regular dolp +40772|1601|2|2|3|4507.80|0.03|0.01|R|F|1992-03-26|1992-03-20|1992-04-18|TAKE BACK RETURN|REG AIR|onic account +40772|1057|28|3|7|6706.35|0.04|0.05|A|F|1992-03-02|1992-04-03|1992-03-05|NONE|SHIP|olites hagg +40772|1744|45|4|32|52663.68|0.01|0.08|R|F|1992-03-12|1992-03-22|1992-03-31|DELIVER IN PERSON|SHIP|dolites wake above the slyly bold theodo +40772|1252|90|5|29|33444.25|0.05|0.02|R|F|1992-03-21|1992-04-05|1992-03-28|DELIVER IN PERSON|TRUCK|es. carefull +40773|1298|36|1|14|16790.06|0.00|0.06|A|F|1995-01-15|1994-12-26|1995-01-19|DELIVER IN PERSON|AIR|ar dugouts wake furiously blithely unusu +40774|1945|34|1|3|5540.82|0.05|0.00|N|O|1996-08-04|1996-08-17|1996-08-28|NONE|AIR|te slyly bold deposits. blithe +40774|281|82|2|47|55520.16|0.03|0.06|N|O|1996-08-05|1996-09-24|1996-09-02|DELIVER IN PERSON|RAIL|ng to the blithely express asymptote +40774|98|24|3|28|27946.52|0.05|0.03|N|O|1996-08-07|1996-08-13|1996-08-14|DELIVER IN PERSON|TRUCK|hely express foxes. sly +40774|1863|64|4|14|24708.04|0.04|0.02|N|O|1996-09-10|1996-09-09|1996-09-21|NONE|AIR|to the regular, express requests. ca +40774|183|36|5|28|30329.04|0.09|0.06|N|O|1996-08-29|1996-10-06|1996-09-07|NONE|TRUCK|press, even depo +40775|1425|26|1|26|34486.92|0.04|0.00|R|F|1994-02-17|1993-12-26|1994-02-25|NONE|RAIL|e furiously ironi +40775|1273|74|2|31|36402.37|0.07|0.03|R|F|1994-02-01|1993-12-18|1994-02-03|NONE|REG AIR|grate. regular pac +40775|593|84|3|16|23897.44|0.08|0.07|R|F|1994-02-03|1994-01-08|1994-02-16|DELIVER IN PERSON|SHIP|l ideas ac +40775|1394|33|4|48|62178.72|0.00|0.01|A|F|1994-03-01|1994-01-06|1994-03-22|DELIVER IN PERSON|AIR|ructions sleep slyly aft +40800|684|78|1|43|68141.24|0.02|0.07|A|F|1994-02-09|1994-01-29|1994-03-07|COLLECT COD|MAIL|odolites wake. special, bold p +40800|1437|55|2|23|30783.89|0.05|0.04|A|F|1993-12-29|1994-01-25|1994-01-22|NONE|RAIL|s cajole ruthlessly according to the furiou +40800|1509|30|3|19|26799.50|0.01|0.02|R|F|1994-03-22|1994-01-05|1994-04-20|DELIVER IN PERSON|MAIL|ic dolphins detect slyl +40800|1520|21|4|45|63968.40|0.04|0.03|A|F|1994-03-31|1994-02-20|1994-04-22|DELIVER IN PERSON|RAIL|leep finally about the carefully regular +40800|1796|81|5|32|54329.28|0.03|0.03|R|F|1994-03-28|1994-01-25|1994-03-29|DELIVER IN PERSON|SHIP|he even decoys are slyly bold accounts. +40801|1828|58|1|36|62273.52|0.08|0.07|A|F|1992-08-04|1992-08-18|1992-08-11|DELIVER IN PERSON|REG AIR|he blithely special requests. regu +40801|297|79|2|49|58667.21|0.00|0.03|A|F|1992-07-04|1992-08-12|1992-07-26|DELIVER IN PERSON|FOB|bold pinto beans are sly +40801|436|37|3|37|49447.91|0.10|0.08|A|F|1992-10-02|1992-08-06|1992-10-20|DELIVER IN PERSON|SHIP|gular requests across the +40801|204|32|4|34|37542.80|0.00|0.07|R|F|1992-09-29|1992-08-05|1992-10-15|TAKE BACK RETURN|AIR|s use carefully ac +40801|1804|34|5|36|61408.80|0.01|0.05|A|F|1992-09-16|1992-09-25|1992-10-16|NONE|TRUCK|ng the fluffily ironic accounts. bl +40802|646|78|1|8|12373.12|0.10|0.04|R|F|1992-11-21|1992-10-30|1992-11-29|COLLECT COD|AIR|regular instructions. final +40802|1647|71|2|18|27875.52|0.06|0.07|A|F|1992-11-21|1992-11-19|1992-12-13|NONE|TRUCK|kages must sleep quickly. special, +40802|74|25|3|9|8766.63|0.06|0.03|R|F|1992-10-27|1992-10-20|1992-11-10|DELIVER IN PERSON|MAIL|efully blithely ironi +40802|566|97|4|1|1466.56|0.07|0.02|R|F|1992-11-12|1992-10-08|1992-11-18|DELIVER IN PERSON|MAIL|heodolites wake slyly special requests +40802|1364|79|5|6|7592.16|0.10|0.08|A|F|1992-10-27|1992-10-26|1992-11-18|TAKE BACK RETURN|SHIP|ic, even warhorses sleep acco +40803|1681|5|1|15|23740.20|0.01|0.08|N|O|1995-07-28|1995-05-14|1995-08-23|TAKE BACK RETURN|TRUCK|eposits. final, ir +40803|1969|2|2|4|7483.84|0.06|0.03|N|O|1995-07-18|1995-05-16|1995-07-20|TAKE BACK RETURN|RAIL|nic sheaves +40803|6|82|3|3|2718.00|0.05|0.08|R|F|1995-04-20|1995-07-04|1995-04-23|NONE|TRUCK| pending depe +40803|582|13|4|6|8895.48|0.00|0.02|A|F|1995-06-04|1995-05-23|1995-06-08|NONE|SHIP|the brave deposits. thin +40804|1652|76|1|29|45055.85|0.07|0.02|R|F|1993-06-19|1993-05-29|1993-07-18|TAKE BACK RETURN|SHIP|symptotes de +40804|648|11|2|36|55751.04|0.00|0.04|R|F|1993-07-10|1993-05-24|1993-08-09|TAKE BACK RETURN|SHIP|nic deposits. fluffily special accounts +40804|279|80|3|28|33019.56|0.09|0.07|R|F|1993-06-12|1993-04-28|1993-06-23|TAKE BACK RETURN|TRUCK| ironic dependencies impress sly +40804|688|89|4|11|17475.48|0.01|0.04|A|F|1993-04-15|1993-06-01|1993-05-15|TAKE BACK RETURN|RAIL|lar requests abo +40804|703|4|5|12|19244.40|0.10|0.03|R|F|1993-04-18|1993-05-01|1993-05-11|COLLECT COD|AIR|. furiously regular instructions sleep +40804|164|91|6|25|26604.00|0.09|0.05|R|F|1993-05-11|1993-04-29|1993-05-19|DELIVER IN PERSON|FOB|regular packages. requests h +40805|1645|69|1|3|4639.92|0.00|0.08|A|F|1994-02-02|1994-01-11|1994-02-28|NONE|FOB|c, express accounts among the blithely +40806|1433|34|1|43|57380.49|0.07|0.00|N|O|1995-12-20|1995-11-02|1995-12-27|DELIVER IN PERSON|MAIL|structions sleep. final accounts haggle +40806|1043|49|2|9|8496.36|0.00|0.08|N|O|1995-12-23|1995-10-30|1996-01-08|TAKE BACK RETURN|MAIL|e across the pending ideas. silent instr +40806|1894|38|3|34|61060.26|0.05|0.04|N|O|1995-09-24|1995-12-05|1995-10-20|COLLECT COD|REG AIR|lar packages poach about th +40806|291|19|4|39|46460.31|0.03|0.07|N|O|1995-12-17|1995-12-01|1995-12-21|TAKE BACK RETURN|RAIL|sts wake quickly +40806|388|73|5|7|9018.66|0.05|0.08|N|O|1995-12-16|1995-11-07|1996-01-13|TAKE BACK RETURN|FOB|ven accounts detec +40806|648|11|6|39|60396.96|0.05|0.02|N|O|1995-10-07|1995-11-10|1995-10-23|TAKE BACK RETURN|FOB|imes express theodolit +40807|1815|59|1|30|51504.30|0.07|0.00|A|F|1993-04-26|1993-05-24|1993-05-10|NONE|SHIP|to beans. slyly e +40807|477|78|2|9|12397.23|0.05|0.08|A|F|1993-07-01|1993-06-13|1993-07-26|DELIVER IN PERSON|AIR|ent packages. regular, busy requests cajo +40807|1458|59|3|48|65253.60|0.01|0.06|A|F|1993-05-21|1993-06-05|1993-06-15|NONE|SHIP| regular deposits boost furiously. f +40807|1809|39|4|46|78696.80|0.00|0.06|R|F|1993-06-30|1993-06-18|1993-07-27|COLLECT COD|RAIL|rts around the furiously even excuse +40807|1187|88|5|39|42439.02|0.10|0.05|R|F|1993-05-22|1993-06-14|1993-05-25|TAKE BACK RETURN|MAIL|usual deposits detect fu +40832|1565|46|1|41|60128.96|0.02|0.01|R|F|1993-04-15|1993-06-23|1993-05-04|NONE|FOB| the furiously even instructions. eve +40832|834|1|2|4|6939.32|0.08|0.07|R|F|1993-07-17|1993-05-23|1993-08-12|COLLECT COD|TRUCK|ts sleep across the +40832|1648|90|3|24|37191.36|0.07|0.01|A|F|1993-05-03|1993-05-11|1993-05-05|COLLECT COD|RAIL|sits cajole blithe +40833|1520|41|1|17|24165.84|0.01|0.03|R|F|1993-08-18|1993-09-08|1993-08-31|DELIVER IN PERSON|SHIP|ironic instructions according to the pendi +40833|1018|24|2|24|22056.24|0.02|0.08|R|F|1993-10-20|1993-10-08|1993-11-14|NONE|SHIP|d requests cajo +40833|1718|45|3|5|8098.55|0.05|0.08|A|F|1993-09-24|1993-09-16|1993-10-03|NONE|MAIL|e quickly above the expres +40833|356|85|4|44|55279.40|0.05|0.06|R|F|1993-08-04|1993-10-10|1993-09-03|DELIVER IN PERSON|SHIP|kly special pinto beans. slyly +40833|576|7|5|17|25101.69|0.06|0.08|A|F|1993-10-03|1993-09-27|1993-10-25|NONE|MAIL|al packages affix slyly +40833|988|57|6|2|3777.96|0.02|0.08|A|F|1993-08-31|1993-10-09|1993-09-19|TAKE BACK RETURN|TRUCK|nic, express courts wake carefu +40833|1572|93|7|33|48627.81|0.06|0.07|R|F|1993-08-28|1993-09-14|1993-09-15|NONE|SHIP|ly even accounts. quickly even theodolit +40834|182|61|1|26|28136.68|0.01|0.02|N|O|1998-09-28|1998-07-03|1998-10-14|NONE|AIR|e slyly. ideas wake +40834|854|21|2|49|85987.65|0.06|0.04|N|O|1998-09-22|1998-08-22|1998-10-20|DELIVER IN PERSON|SHIP| packages nag beneath the i +40834|1762|89|3|42|69877.92|0.00|0.01|N|O|1998-07-28|1998-08-04|1998-07-30|TAKE BACK RETURN|FOB|ckly carefully regular theodolites +40834|889|89|4|36|64435.68|0.10|0.01|N|O|1998-07-01|1998-06-30|1998-07-23|DELIVER IN PERSON|SHIP|cial foxes haggle above t +40835|785|18|1|29|48887.62|0.04|0.00|R|F|1995-02-12|1995-02-05|1995-02-23|DELIVER IN PERSON|MAIL|y. always even theodolites wake ca +40835|1246|58|2|22|25239.28|0.09|0.03|R|F|1995-01-27|1995-01-29|1995-02-15|TAKE BACK RETURN|REG AIR| cajole instruct +40835|1769|54|3|4|6683.04|0.04|0.00|R|F|1994-11-28|1995-01-06|1994-11-29|DELIVER IN PERSON|FOB| quickly bold +40835|780|13|4|31|52104.18|0.08|0.08|R|F|1994-12-30|1995-02-06|1995-01-23|COLLECT COD|TRUCK|iously even deposits. furious +40835|189|42|5|8|8713.44|0.06|0.06|R|F|1995-03-22|1995-01-26|1995-03-30|DELIVER IN PERSON|FOB|pecial accounts after the deposi +40836|612|13|1|38|57479.18|0.06|0.05|N|O|1998-03-17|1998-01-27|1998-03-30|DELIVER IN PERSON|TRUCK|inal deposits +40836|1788|89|2|13|21967.14|0.07|0.08|N|O|1998-04-12|1998-03-09|1998-05-02|TAKE BACK RETURN|MAIL|tions haggle fl +40836|440|99|3|28|37532.32|0.01|0.07|N|O|1997-12-17|1998-03-12|1997-12-28|COLLECT COD|SHIP|slyly bold plate +40836|233|15|4|22|24931.06|0.02|0.07|N|O|1998-03-05|1998-02-01|1998-03-17|TAKE BACK RETURN|FOB|he furiously f +40836|509|40|5|29|40875.50|0.00|0.03|N|O|1998-03-04|1998-01-24|1998-03-16|TAKE BACK RETURN|RAIL|arefully regular foxes. slyly spe +40836|1905|94|6|41|74082.90|0.09|0.00|N|O|1998-02-07|1998-03-09|1998-03-02|COLLECT COD|REG AIR|e of the regular deposits dete +40836|1474|75|7|19|26133.93|0.08|0.01|N|O|1997-12-20|1998-01-24|1998-01-17|DELIVER IN PERSON|MAIL|boost caref +40837|294|95|1|6|7165.74|0.06|0.03|N|O|1996-12-11|1997-01-25|1996-12-16|DELIVER IN PERSON|RAIL| pinto beans +40837|559|90|2|34|49624.70|0.04|0.07|N|O|1997-01-10|1996-12-08|1997-01-28|TAKE BACK RETURN|RAIL|yly final instruct +40837|1173|46|3|45|48337.65|0.01|0.06|N|O|1996-12-25|1996-12-15|1997-01-23|NONE|RAIL|posits after the quick +40837|1160|97|4|16|16978.56|0.05|0.07|N|O|1997-02-14|1996-12-23|1997-03-12|COLLECT COD|FOB|eans. idly regular instructions +40837|196|97|5|48|52617.12|0.03|0.06|N|O|1997-02-01|1997-01-25|1997-02-19|NONE|RAIL|ions dazzle furiously quickly e +40838|1949|38|1|8|14807.52|0.09|0.08|R|F|1993-01-31|1993-02-01|1993-02-14|DELIVER IN PERSON|TRUCK|kages. furiously express deposit +40838|763|64|2|43|71541.68|0.05|0.02|R|F|1992-12-03|1992-12-29|1992-12-17|NONE|REG AIR|lithely eve +40838|1399|38|3|9|11703.51|0.01|0.05|A|F|1993-03-25|1993-02-04|1993-04-09|DELIVER IN PERSON|SHIP|leep between the slyly final deposits. n +40838|959|28|4|4|7439.80|0.02|0.06|R|F|1993-03-05|1993-01-15|1993-03-07|DELIVER IN PERSON|FOB|jole furiously +40839|1456|96|1|26|35293.70|0.03|0.02|A|F|1992-04-18|1992-05-04|1992-04-30|COLLECT COD|TRUCK|structions. thinly ironic requests are c +40839|483|84|2|15|20752.20|0.05|0.07|R|F|1992-06-08|1992-06-09|1992-06-18|TAKE BACK RETURN|AIR|ar ideas wake bl +40839|451|39|3|12|16217.40|0.07|0.08|A|F|1992-05-09|1992-06-28|1992-05-28|TAKE BACK RETURN|TRUCK|eep carefully: fu +40864|75|51|1|6|5850.42|0.07|0.05|N|O|1996-08-12|1996-05-19|1996-09-09|NONE|FOB|he carefully final account +40864|1309|86|2|40|48412.00|0.08|0.00|N|O|1996-06-22|1996-05-15|1996-06-25|TAKE BACK RETURN|RAIL|s. quietly final p +40864|1450|51|3|29|39192.05|0.10|0.04|N|O|1996-05-21|1996-06-21|1996-06-12|COLLECT COD|FOB|lithely even pinto beans. furiously +40864|1211|12|4|12|13346.52|0.09|0.02|N|O|1996-04-24|1996-05-24|1996-05-13|DELIVER IN PERSON|RAIL|ly among the quickly unusual +40864|1751|52|5|47|77679.25|0.04|0.05|N|O|1996-07-04|1996-07-12|1996-07-17|NONE|SHIP|uickly express dolphins. caref +40864|647|79|6|22|34048.08|0.03|0.04|N|O|1996-06-21|1996-06-17|1996-07-20|TAKE BACK RETURN|RAIL| quick requ +40864|1057|63|7|5|4790.25|0.04|0.00|N|O|1996-04-17|1996-06-19|1996-04-23|NONE|MAIL|he blithely special +40865|619|20|1|47|71421.67|0.04|0.06|N|O|1995-08-27|1995-07-21|1995-09-18|NONE|AIR|tructions among the pinto +40865|1807|37|2|8|13670.40|0.05|0.08|N|O|1995-09-04|1995-09-05|1995-09-07|TAKE BACK RETURN|REG AIR|according to the inst +40865|1094|95|3|29|28857.61|0.08|0.03|N|O|1995-07-07|1995-08-08|1995-08-01|TAKE BACK RETURN|FOB|efully bold theodolites. pending, s +40866|1315|30|1|24|29191.44|0.02|0.05|R|F|1993-06-17|1993-08-17|1993-06-26|COLLECT COD|AIR| the slyly bold ideas grow fluffily +40866|578|39|2|43|63578.51|0.08|0.08|R|F|1993-08-11|1993-07-26|1993-09-01|NONE|MAIL|ing to the slyly regular requests. e +40867|1429|47|1|8|10643.36|0.07|0.06|N|O|1998-02-26|1998-03-09|1998-03-28|COLLECT COD|REG AIR|blithely even theodolites sleep furiously +40867|654|17|2|41|63740.65|0.08|0.07|N|O|1998-04-16|1998-02-06|1998-04-27|TAKE BACK RETURN|FOB|e furiously about the f +40867|1595|36|3|24|35918.16|0.07|0.04|N|O|1998-01-07|1998-02-12|1998-02-02|COLLECT COD|SHIP|ld requests sleep fluffily around the +40867|82|58|4|43|42229.44|0.02|0.06|N|O|1998-04-08|1998-02-14|1998-04-30|NONE|FOB|ach slyly blithely final re +40867|606|100|5|22|33145.20|0.02|0.06|N|O|1998-03-22|1998-03-11|1998-04-15|TAKE BACK RETURN|FOB|silent ideas. excuses among +40867|224|52|6|45|50589.90|0.05|0.03|N|O|1998-01-14|1998-02-16|1998-01-23|COLLECT COD|AIR|es. blithely bold ideas cajol +40868|1615|39|1|17|25782.37|0.01|0.00|N|O|1995-12-23|1995-12-08|1996-01-03|DELIVER IN PERSON|TRUCK|quests above the unusual ac +40868|1938|39|2|12|22079.16|0.01|0.04|N|O|1995-10-17|1995-12-24|1995-11-01|COLLECT COD|REG AIR|ronic requests wake above the +40869|1614|97|1|1|1515.61|0.10|0.07|N|O|1997-02-13|1997-03-29|1997-03-10|NONE|AIR|ach final depos +40869|1750|35|2|4|6607.00|0.01|0.00|N|O|1997-04-05|1997-02-20|1997-04-16|DELIVER IN PERSON|MAIL|. pending packages nag carefully-- fu +40870|727|60|1|25|40693.00|0.02|0.05|N|O|1996-01-14|1996-02-19|1996-01-31|COLLECT COD|REG AIR|ly final ideas hang sl +40870|166|67|2|20|21323.20|0.00|0.08|N|O|1996-01-30|1996-01-14|1996-02-18|NONE|MAIL|posits sleep blith +40870|1528|69|3|6|8577.12|0.05|0.04|N|O|1996-03-28|1996-01-23|1996-04-15|TAKE BACK RETURN|REG AIR|quests wake furiously. pending, bol +40870|1183|92|4|41|44451.38|0.06|0.02|N|O|1996-03-08|1996-03-11|1996-03-28|COLLECT COD|FOB|e slyly carefully +40870|797|98|5|36|61120.44|0.03|0.03|N|O|1996-04-05|1996-03-01|1996-04-28|NONE|SHIP|s across the slyly ironic theodolites +40871|824|25|1|29|50019.78|0.00|0.03|N|O|1995-12-25|1995-10-14|1996-01-08|NONE|SHIP|ets! courts according to the regular acc +40871|286|41|2|23|27284.44|0.08|0.01|N|O|1995-11-10|1995-12-03|1995-12-10|COLLECT COD|MAIL|y regular accounts at the deposi +40871|486|74|3|17|23570.16|0.00|0.02|N|O|1995-09-19|1995-12-03|1995-10-01|NONE|SHIP|counts according to +40871|409|97|4|12|15712.80|0.02|0.02|N|O|1995-12-18|1995-11-09|1996-01-16|DELIVER IN PERSON|MAIL| the furiously r +40896|946|81|1|6|11081.64|0.09|0.04|N|O|1996-01-01|1995-11-13|1996-01-05|TAKE BACK RETURN|RAIL|ress, unusual a +40896|1865|66|2|46|81275.56|0.09|0.00|N|O|1995-11-12|1995-11-25|1995-11-14|TAKE BACK RETURN|AIR|gular, even acc +40896|363|92|3|50|63168.00|0.03|0.07|N|O|1995-10-18|1995-11-15|1995-10-22|COLLECT COD|SHIP|sits. furiously unusual +40896|1151|88|4|11|11573.65|0.09|0.04|N|O|1995-11-26|1995-11-09|1995-12-23|DELIVER IN PERSON|TRUCK|ironic packages. car +40896|1452|70|5|22|29775.90|0.05|0.03|N|O|1995-09-25|1995-11-12|1995-10-16|COLLECT COD|RAIL|iously even instructions: final, express +40897|487|46|1|1|1387.48|0.08|0.08|N|O|1998-01-06|1998-01-22|1998-01-28|DELIVER IN PERSON|RAIL|heodolites. regular inst +40897|1043|14|2|22|20768.88|0.05|0.08|N|O|1998-02-13|1998-01-06|1998-02-17|NONE|AIR| excuses unwind fu +40898|667|68|1|45|70544.70|0.00|0.01|N|O|1996-06-07|1996-06-21|1996-06-11|DELIVER IN PERSON|MAIL| accounts. quickly express +40898|1699|23|2|36|57624.84|0.08|0.04|N|O|1996-06-12|1996-05-16|1996-06-14|DELIVER IN PERSON|MAIL|kages are above the quic +40898|227|82|3|47|52979.34|0.07|0.02|N|O|1996-04-29|1996-06-01|1996-04-30|TAKE BACK RETURN|MAIL|requests wake. even ideas m +40898|475|5|4|38|52267.86|0.01|0.04|N|O|1996-06-25|1996-05-16|1996-07-19|NONE|SHIP|dependencies grow quickly furiously e +40899|478|79|1|26|35840.22|0.01|0.02|N|O|1996-03-23|1996-02-23|1996-03-29|COLLECT COD|AIR|l pinto beans. regular excuses boost fluf +40900|1064|70|1|33|31846.98|0.04|0.00|N|O|1997-01-13|1997-03-11|1997-01-25|NONE|RAIL|eas wake. furiousl +40900|901|4|2|30|54057.00|0.02|0.00|N|O|1997-01-26|1997-03-22|1997-02-24|DELIVER IN PERSON|MAIL|t the ironic pinto +40900|1582|83|3|8|11868.64|0.03|0.03|N|O|1997-04-28|1997-03-12|1997-05-21|TAKE BACK RETURN|FOB| blithely. pending dependenc +40900|1573|14|4|4|5898.28|0.00|0.00|N|O|1997-03-04|1997-02-23|1997-03-13|TAKE BACK RETURN|SHIP|e. furiously bold pinto beans wake fro +40900|366|23|5|13|16462.68|0.01|0.07|N|O|1997-02-17|1997-02-17|1997-03-03|DELIVER IN PERSON|MAIL|e slyly ironic pack +40900|1551|92|6|30|43576.50|0.02|0.08|N|O|1997-03-14|1997-02-12|1997-03-31|COLLECT COD|REG AIR| impress furiously along the even, +40901|1395|96|1|23|29816.97|0.03|0.08|R|F|1992-10-25|1992-10-02|1992-11-22|COLLECT COD|REG AIR|al ideas bene +40901|895|29|2|9|16163.01|0.04|0.08|R|F|1992-08-11|1992-09-20|1992-08-21|TAKE BACK RETURN|RAIL|ly ironic ideas. slyly silent deposits g +40901|1763|48|3|3|4994.28|0.02|0.06|R|F|1992-11-26|1992-09-19|1992-12-11|TAKE BACK RETURN|MAIL|excuses. unusual foxes play final, dogge +40901|528|19|4|8|11428.16|0.07|0.01|A|F|1992-09-11|1992-09-24|1992-10-02|TAKE BACK RETURN|FOB|osits. regular excuses doze af +40901|1719|4|5|39|63207.69|0.10|0.05|R|F|1992-09-11|1992-09-24|1992-09-16|DELIVER IN PERSON|SHIP|sleep regular, express requests +40901|1858|59|6|30|52795.50|0.10|0.04|R|F|1992-08-16|1992-10-04|1992-08-25|NONE|TRUCK|carefully express excuses boost. fin +40901|424|54|7|39|51652.38|0.00|0.04|A|F|1992-07-31|1992-10-05|1992-08-11|NONE|RAIL|foxes would cajole sly +40902|507|38|1|12|16890.00|0.06|0.01|A|F|1994-09-27|1994-09-12|1994-10-02|NONE|FOB|deas. regu +40902|381|10|2|16|20502.08|0.01|0.00|R|F|1994-09-08|1994-10-01|1994-09-25|NONE|TRUCK|fully instructions +40902|1521|2|3|19|27027.88|0.03|0.01|R|F|1994-07-09|1994-08-20|1994-07-15|TAKE BACK RETURN|FOB|ully special deposits may +40902|420|50|4|33|43573.86|0.10|0.05|A|F|1994-07-16|1994-08-21|1994-08-01|COLLECT COD|AIR|luffily ironic dolphins. s +40902|460|19|5|49|66662.54|0.06|0.05|A|F|1994-08-28|1994-10-01|1994-09-17|NONE|FOB|he bold, pending accounts detect +40902|787|52|6|23|38818.94|0.08|0.06|A|F|1994-09-08|1994-09-18|1994-09-18|TAKE BACK RETURN|SHIP|s sleep blithely am +40903|1727|70|1|6|9772.32|0.02|0.04|N|O|1996-07-29|1996-07-03|1996-08-05|COLLECT COD|SHIP|o beans. accou +40903|1248|60|2|19|21835.56|0.02|0.00|N|O|1996-06-16|1996-06-30|1996-07-02|NONE|REG AIR|rate. pinto be +40903|783|80|3|44|74086.32|0.01|0.07|N|O|1996-08-07|1996-06-18|1996-08-26|DELIVER IN PERSON|RAIL|riously iro +40903|907|10|4|26|47005.40|0.05|0.00|N|O|1996-07-02|1996-07-03|1996-07-04|NONE|AIR|uses cajole sl +40903|1455|34|5|41|55614.45|0.04|0.03|N|O|1996-07-24|1996-07-05|1996-08-21|COLLECT COD|REG AIR| packages. slyly final pinto beans across +40928|1520|21|1|16|22744.32|0.02|0.03|R|F|1995-01-11|1994-10-17|1995-01-16|COLLECT COD|RAIL|s. blithely ironic excuses a +40928|1263|75|2|22|25613.72|0.06|0.00|A|F|1994-12-09|1994-10-17|1994-12-13|DELIVER IN PERSON|SHIP|ions. carefully +40928|37|88|3|32|29984.96|0.03|0.02|A|F|1994-12-25|1994-10-27|1994-12-26|TAKE BACK RETURN|TRUCK|y final packages wake furio +40929|864|64|1|46|81183.56|0.03|0.04|N|O|1997-01-05|1997-02-13|1997-01-20|NONE|RAIL|l packages +40929|1262|63|2|14|16285.64|0.08|0.03|N|O|1997-01-30|1997-02-01|1997-02-20|TAKE BACK RETURN|REG AIR|ironic deposits. regularly regular +40929|736|69|3|15|24550.95|0.04|0.04|N|O|1997-01-09|1997-03-18|1997-01-30|TAKE BACK RETURN|RAIL|te furiously furiously even theodoli +40929|1162|35|4|8|8505.28|0.07|0.01|N|O|1997-02-14|1997-02-05|1997-03-05|TAKE BACK RETURN|AIR| ideas haggle quickly alongsi +40930|875|75|1|17|30189.79|0.02|0.02|N|O|1998-07-14|1998-08-15|1998-07-27|TAKE BACK RETURN|MAIL|raids detect blithely according to the bl +40930|1302|3|2|1|1203.30|0.09|0.03|N|O|1998-07-08|1998-08-19|1998-07-13|DELIVER IN PERSON|AIR| ironic foxes +40930|1326|65|3|16|19637.12|0.03|0.04|N|O|1998-10-09|1998-07-24|1998-10-20|NONE|AIR|fully even packages across the carefully +40930|503|94|4|42|58947.00|0.02|0.01|N|O|1998-08-01|1998-08-31|1998-08-13|TAKE BACK RETURN|SHIP|pending pa +40930|1482|83|5|16|22135.68|0.08|0.04|N|O|1998-07-02|1998-08-11|1998-07-26|TAKE BACK RETURN|SHIP| deposits sl +40931|650|51|1|1|1550.65|0.07|0.00|N|O|1997-05-08|1997-03-04|1997-05-24|DELIVER IN PERSON|REG AIR|final frays wake accord +40931|1209|47|2|8|8881.60|0.05|0.08|N|O|1997-03-16|1997-02-12|1997-03-25|TAKE BACK RETURN|RAIL|nt, even a +40931|246|28|3|35|40118.40|0.01|0.01|N|O|1997-04-20|1997-02-09|1997-05-10|NONE|SHIP|ckly final instructions. unusual pinto bean +40931|365|50|4|16|20245.76|0.07|0.04|N|O|1997-05-02|1997-03-11|1997-05-15|TAKE BACK RETURN|RAIL|l, express requests nag blith +40932|64|40|1|47|45310.82|0.04|0.08|N|O|1998-08-29|1998-07-03|1998-09-04|TAKE BACK RETURN|MAIL|unts cajole ruthlessl +40932|1752|79|2|23|38036.25|0.02|0.02|N|O|1998-08-09|1998-06-24|1998-08-20|COLLECT COD|AIR|the regular theodolites. deposi +40932|694|88|3|4|6378.76|0.06|0.02|N|O|1998-06-26|1998-06-16|1998-07-16|DELIVER IN PERSON|MAIL|lets along the bold deposits wake +40932|943|44|4|22|40566.68|0.06|0.05|N|O|1998-05-17|1998-07-11|1998-06-13|NONE|REG AIR| regular packages cajo +40932|1112|21|5|14|14183.54|0.00|0.08|N|O|1998-07-01|1998-07-16|1998-07-21|DELIVER IN PERSON|REG AIR|usual excuses sleep fluffily stealthily s +40933|857|91|1|6|10547.10|0.02|0.05|R|F|1992-08-17|1992-08-25|1992-08-23|TAKE BACK RETURN|AIR|odolites across the quickly bol +40933|290|18|2|18|21425.22|0.00|0.05|R|F|1992-08-23|1992-07-18|1992-09-22|TAKE BACK RETURN|FOB|he slyly pending deposits are fl +40933|1280|18|3|27|31894.56|0.01|0.03|A|F|1992-06-30|1992-07-01|1992-07-30|NONE|AIR|und the qui +40933|1636|60|4|17|26139.71|0.03|0.05|A|F|1992-09-16|1992-07-25|1992-09-24|DELIVER IN PERSON|RAIL|pending waters. quickly +40934|754|19|1|45|74463.75|0.00|0.01|N|O|1995-12-23|1995-12-15|1996-01-15|NONE|SHIP|nding instructions sleep furiously acc +40934|610|4|2|9|13595.49|0.03|0.02|N|O|1995-12-24|1996-02-08|1995-12-30|NONE|SHIP|. pending pinto beans +40934|1305|20|3|9|10856.70|0.01|0.02|N|O|1996-02-05|1996-01-17|1996-02-26|TAKE BACK RETURN|REG AIR|al instructions. expre +40934|1399|14|4|29|37711.31|0.10|0.03|N|O|1995-11-22|1996-01-06|1995-12-08|DELIVER IN PERSON|AIR|ronic forges according to the furiously iro +40934|1966|55|5|29|54170.84|0.08|0.07|N|O|1995-12-22|1996-02-07|1996-01-16|TAKE BACK RETURN|MAIL|. carefully reg +40935|256|57|1|35|40468.75|0.07|0.06|N|O|1996-06-26|1996-07-13|1996-07-13|COLLECT COD|RAIL| special excuses haggle carefu +40935|910|45|2|1|1810.91|0.03|0.00|N|O|1996-09-02|1996-08-18|1996-09-23|COLLECT COD|AIR|pending sau +40935|845|79|3|26|45391.84|0.10|0.04|N|O|1996-09-04|1996-08-24|1996-09-20|DELIVER IN PERSON|RAIL|bold foxes maintai +40960|879|79|1|41|72974.67|0.04|0.02|N|O|1998-08-06|1998-06-11|1998-08-08|COLLECT COD|FOB|eep busily. carefully slow +40960|980|15|2|41|77120.18|0.03|0.00|N|O|1998-05-23|1998-06-28|1998-06-02|COLLECT COD|RAIL| unusual instructions. caref +40960|1497|98|3|23|32165.27|0.09|0.05|N|O|1998-06-27|1998-06-22|1998-06-29|TAKE BACK RETURN|FOB|ly special re +40960|3|54|4|48|43344.00|0.05|0.07|N|O|1998-07-28|1998-07-06|1998-08-19|COLLECT COD|REG AIR|wake slyly special deposits. fluffily iro +40960|358|15|5|32|40267.20|0.09|0.07|N|O|1998-05-06|1998-07-10|1998-05-11|COLLECT COD|MAIL|ages cajole blithely among the requ +40961|346|31|1|23|28665.82|0.04|0.00|N|O|1995-07-27|1995-05-20|1995-08-09|COLLECT COD|AIR|s. fluffily bold dependencies should hav +40961|86|62|2|17|16763.36|0.07|0.08|A|F|1995-04-30|1995-05-08|1995-05-05|COLLECT COD|AIR|lyly ironic sauternes along t +40962|1521|62|1|18|25605.36|0.04|0.01|A|F|1995-05-19|1995-04-24|1995-05-31|NONE|MAIL| pinto beans use slyly along the re +40962|1706|49|2|35|56269.50|0.00|0.07|A|F|1995-06-08|1995-05-19|1995-06-10|DELIVER IN PERSON|TRUCK|tegrate acc +40962|349|34|3|17|21238.78|0.10|0.06|A|F|1995-02-26|1995-04-11|1995-03-19|COLLECT COD|REG AIR|. daring accounts wake furiously al +40962|1522|3|4|39|55517.28|0.02|0.06|R|F|1995-04-28|1995-04-28|1995-05-26|NONE|FOB|ic requests. un +40962|1226|64|5|26|29307.72|0.03|0.01|R|F|1995-05-21|1995-05-15|1995-06-11|COLLECT COD|SHIP|ependencies sleep dar +40963|826|26|1|4|6907.28|0.08|0.02|N|O|1997-06-06|1997-05-21|1997-06-10|NONE|RAIL| the theodolites. final deposi +40963|1682|24|2|14|22171.52|0.00|0.05|N|O|1997-07-05|1997-06-15|1997-07-26|COLLECT COD|REG AIR|es sleep among the ironic, +40963|146|99|3|44|46030.16|0.08|0.03|N|O|1997-04-22|1997-06-22|1997-05-18|NONE|TRUCK|ccounts affix idly regular foxes. slyly i +40963|1238|76|4|46|52404.58|0.07|0.01|N|O|1997-05-23|1997-06-04|1997-06-09|NONE|RAIL|hely across the regular theodolites. +40963|1220|95|5|6|6727.32|0.05|0.07|N|O|1997-06-25|1997-05-08|1997-06-27|NONE|SHIP| use slyly according to the iron +40963|784|81|6|49|82554.22|0.00|0.03|N|O|1997-07-29|1997-05-27|1997-08-07|TAKE BACK RETURN|REG AIR|, final dependencies. blithely even packag +40963|591|92|7|11|16407.49|0.07|0.03|N|O|1997-04-26|1997-06-24|1997-05-17|TAKE BACK RETURN|TRUCK|ts. regular idea +40964|1778|5|1|43|72230.11|0.00|0.00|R|F|1995-05-25|1995-07-01|1995-06-12|TAKE BACK RETURN|FOB|ckly according to the even packages. furiou +40964|1587|8|2|25|37214.50|0.04|0.02|N|O|1995-07-19|1995-07-02|1995-07-24|TAKE BACK RETURN|REG AIR|carefully brave dependencies sublate +40965|1537|58|1|36|51787.08|0.03|0.03|R|F|1994-11-30|1995-01-23|1994-12-11|COLLECT COD|SHIP|s nag furiously carefully regu +40965|534|35|2|43|61684.79|0.02|0.03|A|F|1995-02-17|1994-12-24|1995-02-28|TAKE BACK RETURN|FOB|nding courts wake. s +40965|1486|65|3|42|58274.16|0.08|0.01|R|F|1995-01-09|1995-01-15|1995-01-13|COLLECT COD|MAIL|le furiously. furi +40965|1632|15|4|22|33739.86|0.10|0.05|R|F|1995-02-12|1995-01-16|1995-02-19|DELIVER IN PERSON|AIR|ironic ideas boost s +40965|1246|21|5|40|45889.60|0.03|0.01|A|F|1995-01-02|1995-01-16|1995-01-16|NONE|FOB| blithely final foxes. blithely silen +40965|428|16|6|48|63764.16|0.06|0.08|A|F|1995-02-10|1995-01-11|1995-02-14|DELIVER IN PERSON|FOB|special requests haggle furious +40966|806|40|1|13|22188.40|0.08|0.05|N|O|1997-08-26|1997-08-14|1997-09-17|TAKE BACK RETURN|MAIL|packages. carefully regular account +40966|1216|28|2|15|16758.15|0.02|0.03|N|O|1997-07-04|1997-06-24|1997-07-13|NONE|RAIL|ages haggle. r +40966|363|64|3|43|54324.48|0.02|0.04|N|O|1997-08-06|1997-07-04|1997-08-10|DELIVER IN PERSON|AIR|ss theodolites wake p +40966|676|70|4|28|44146.76|0.02|0.04|N|O|1997-07-20|1997-07-06|1997-07-27|NONE|FOB|according to the quickly final +40966|1010|81|5|44|40084.44|0.00|0.04|N|O|1997-06-17|1997-08-11|1997-06-27|COLLECT COD|SHIP|ely. ironic, regular saute +40967|35|11|1|23|21505.69|0.09|0.02|N|O|1997-10-25|1997-12-09|1997-11-24|NONE|AIR|gular pinto beans wake slyly at th +40967|933|2|2|13|23841.09|0.07|0.05|N|O|1997-10-21|1997-12-05|1997-10-26|TAKE BACK RETURN|TRUCK|fluffily. slyly regular requ +40967|1360|61|3|4|5045.44|0.06|0.01|N|O|1997-09-29|1997-11-15|1997-10-20|COLLECT COD|REG AIR|special tithes wake carefully. unusual p +40967|1734|35|4|50|81786.50|0.02|0.00|N|O|1997-12-22|1997-11-30|1998-01-21|TAKE BACK RETURN|RAIL|nal excuses print ironically fu +40967|450|38|5|16|21607.20|0.07|0.04|N|O|1997-12-24|1997-12-15|1998-01-10|NONE|SHIP|n packages breach slyly about the bold acco +40992|452|11|1|50|67622.50|0.03|0.06|A|F|1993-12-18|1994-02-07|1993-12-31|NONE|SHIP|usly even re +40992|902|5|2|38|68510.20|0.05|0.04|R|F|1993-12-02|1994-02-11|1993-12-21|COLLECT COD|AIR|ag always across th +40993|986|21|1|14|26417.72|0.00|0.04|N|O|1997-12-26|1998-01-05|1997-12-31|DELIVER IN PERSON|RAIL|tainments cajole slyly across the +40993|620|52|2|46|69948.52|0.04|0.02|N|O|1997-11-23|1997-11-30|1997-12-13|COLLECT COD|SHIP|al accounts alongside of the spec +40994|837|37|1|34|59086.22|0.03|0.01|A|F|1992-11-23|1992-12-20|1992-12-12|TAKE BACK RETURN|TRUCK|grate slyly fluffily ironic ac +40994|651|14|2|31|48101.15|0.04|0.02|R|F|1992-11-17|1993-01-08|1992-12-07|NONE|REG AIR|egular packages are about the fi +40994|694|88|3|8|12757.52|0.08|0.01|A|F|1992-11-23|1992-11-13|1992-12-15|TAKE BACK RETURN|RAIL|y accounts. furiousl +40994|1864|51|4|9|15892.74|0.02|0.05|R|F|1992-11-21|1992-11-17|1992-12-04|COLLECT COD|REG AIR|s. final accounts affix carefully. even d +40995|1185|86|1|50|54309.00|0.06|0.08|N|O|1998-07-11|1998-07-25|1998-08-07|TAKE BACK RETURN|MAIL| the furiously ironic pinto beans are +40996|246|47|1|9|10316.16|0.01|0.05|R|F|1994-09-10|1994-10-27|1994-10-08|NONE|TRUCK| the even acco +40996|331|32|2|7|8619.31|0.08|0.05|R|F|1994-10-14|1994-10-06|1994-10-16|NONE|FOB|use across the pending, regular packages +40996|990|25|3|7|13236.93|0.10|0.01|R|F|1994-09-17|1994-09-21|1994-10-10|COLLECT COD|TRUCK|ructions. carefully bold requests u +40997|174|1|1|9|9667.53|0.07|0.07|A|F|1994-07-07|1994-07-20|1994-07-20|NONE|TRUCK| silent reque +40997|1434|52|2|4|5341.72|0.06|0.02|R|F|1994-07-18|1994-07-03|1994-08-14|NONE|SHIP|ular dinos nag requests. stea +40997|1410|28|3|40|52456.40|0.10|0.03|A|F|1994-04-26|1994-07-16|1994-05-09|NONE|AIR|ully permanent deposits play c +40997|1016|22|4|3|2751.03|0.02|0.05|A|F|1994-07-20|1994-06-29|1994-08-03|NONE|SHIP|, ironic i +40997|891|58|5|38|68091.82|0.07|0.00|A|F|1994-04-29|1994-06-10|1994-05-07|DELIVER IN PERSON|TRUCK| special pain +40998|265|66|1|43|50106.18|0.01|0.04|A|F|1994-08-29|1994-06-19|1994-08-31|COLLECT COD|SHIP|y final deposits do wake. express, unusual +40998|1385|24|2|1|1286.38|0.05|0.01|A|F|1994-06-13|1994-07-30|1994-07-09|COLLECT COD|SHIP|l are slyly +40998|294|22|3|20|23885.80|0.05|0.08|A|F|1994-06-21|1994-06-25|1994-07-13|DELIVER IN PERSON|MAIL| deposits w +40999|40|16|1|18|16920.72|0.02|0.08|A|F|1992-07-21|1992-06-22|1992-08-09|NONE|MAIL|es believe quickly. pending, specia +41024|538|69|1|46|66172.38|0.00|0.00|R|F|1993-10-30|1993-10-09|1993-11-28|NONE|TRUCK| regular accounts are slyly accounts. +41024|1808|52|2|39|66682.20|0.03|0.03|A|F|1993-08-12|1993-09-28|1993-08-22|NONE|SHIP|cording to the un +41024|1251|63|3|10|11522.50|0.03|0.00|R|F|1993-07-26|1993-09-28|1993-07-29|DELIVER IN PERSON|REG AIR|fily accor +41024|299|81|4|38|45573.02|0.07|0.00|A|F|1993-10-17|1993-10-11|1993-11-01|DELIVER IN PERSON|TRUCK|ideas. slyly express fo +41025|1703|46|1|7|11232.90|0.05|0.06|N|O|1996-02-17|1996-03-30|1996-03-03|DELIVER IN PERSON|TRUCK|lent excuses. carefully regular pi +41025|554|85|2|45|65454.75|0.02|0.01|N|O|1996-03-04|1996-04-21|1996-03-21|TAKE BACK RETURN|MAIL|the blithely final requests. final excu +41025|655|56|3|20|31113.00|0.04|0.05|N|O|1996-03-21|1996-03-26|1996-04-01|TAKE BACK RETURN|AIR|s sleep slyly against the quick +41026|767|68|1|39|65042.64|0.09|0.01|N|F|1995-06-14|1995-07-14|1995-06-25|TAKE BACK RETURN|REG AIR| accounts haggle. blithely iro +41026|1986|19|2|44|83071.12|0.09|0.04|N|O|1995-07-13|1995-07-06|1995-08-01|NONE|RAIL|essly iron +41026|109|36|3|49|49445.90|0.08|0.04|N|O|1995-07-29|1995-05-22|1995-08-26|NONE|SHIP| against the silent ideas. blithely +41026|1471|89|4|2|2744.94|0.02|0.02|N|O|1995-08-19|1995-07-16|1995-08-30|COLLECT COD|REG AIR|eposits wake +41026|15|16|5|20|18300.20|0.04|0.03|N|O|1995-07-25|1995-07-02|1995-08-20|TAKE BACK RETURN|TRUCK| quickly special idea +41027|1211|23|1|32|35590.72|0.03|0.08|R|F|1994-03-07|1994-04-19|1994-03-22|DELIVER IN PERSON|REG AIR|g deposits are across the carefull +41027|1689|72|2|40|63627.20|0.03|0.04|A|F|1994-03-10|1994-05-12|1994-03-20|TAKE BACK RETURN|SHIP|gular requests. care +41027|1366|67|3|37|46892.32|0.08|0.03|A|F|1994-06-13|1994-05-23|1994-06-18|NONE|TRUCK|ideas. furiously even notornis impress. dep +41028|257|85|1|47|54390.75|0.04|0.07|N|O|1997-06-06|1997-07-29|1997-06-09|NONE|FOB|arefully ironic +41028|1263|64|2|50|58213.00|0.09|0.06|N|O|1997-08-29|1997-06-10|1997-09-15|TAKE BACK RETURN|MAIL|thely regular platelets wake across t +41028|1532|53|3|48|68809.44|0.03|0.03|N|O|1997-05-23|1997-07-21|1997-05-25|NONE|SHIP|ages after the blithely pending +41028|872|39|4|35|62050.45|0.05|0.06|N|O|1997-08-23|1997-06-24|1997-09-15|TAKE BACK RETURN|AIR| beans; final, f +41028|407|95|5|13|16996.20|0.04|0.04|N|O|1997-08-22|1997-07-04|1997-09-08|COLLECT COD|FOB|e regular forges. regular, regular courts b +41029|1054|60|1|1|955.05|0.02|0.06|N|O|1996-07-05|1996-06-29|1996-07-29|TAKE BACK RETURN|FOB|s. furiously ironic pa +41029|700|32|2|46|73632.20|0.08|0.07|N|O|1996-05-17|1996-08-01|1996-06-06|TAKE BACK RETURN|MAIL|ic accounts abov +41029|1180|81|3|27|29191.86|0.04|0.03|N|O|1996-05-19|1996-06-23|1996-06-08|NONE|REG AIR|gle quickly f +41029|515|46|4|28|39634.28|0.07|0.08|N|O|1996-06-17|1996-07-29|1996-07-05|TAKE BACK RETURN|FOB|long the requests. unusual deposi +41030|691|23|1|22|35017.18|0.09|0.01|N|O|1996-02-27|1996-04-03|1996-03-07|DELIVER IN PERSON|SHIP|usly regular dolphins. daring asy +41030|1864|94|2|25|44146.50|0.03|0.06|N|O|1996-02-16|1996-03-18|1996-03-12|DELIVER IN PERSON|SHIP|uests. requests prom +41030|1775|76|3|44|73777.88|0.02|0.06|N|O|1996-06-01|1996-04-30|1996-06-25|COLLECT COD|AIR|egular sentiments. ironic +41031|1201|39|1|1|1102.20|0.08|0.04|N|O|1996-05-17|1996-04-26|1996-06-02|DELIVER IN PERSON|REG AIR|unusual foxes are ca +41031|250|78|2|27|31056.75|0.06|0.01|N|O|1996-06-16|1996-04-25|1996-07-07|TAKE BACK RETURN|RAIL|pending requests. pending +41031|1545|86|3|17|24591.18|0.06|0.05|N|O|1996-04-26|1996-05-22|1996-05-12|DELIVER IN PERSON|AIR|s. furiously even foxe +41031|786|87|4|42|70844.76|0.03|0.03|N|O|1996-04-15|1996-04-24|1996-04-29|DELIVER IN PERSON|MAIL|riously final instructions cajole caref +41031|1096|2|5|7|6979.63|0.06|0.03|N|O|1996-04-16|1996-05-21|1996-04-20|NONE|FOB|l accounts wake express pi +41056|1335|12|1|23|28435.59|0.02|0.02|A|F|1992-06-11|1992-06-21|1992-06-27|NONE|RAIL|ously fluffy ideas. furiously furious +41056|1251|63|2|3|3456.75|0.08|0.02|A|F|1992-07-11|1992-06-20|1992-07-31|DELIVER IN PERSON|MAIL|counts use c +41056|1152|25|3|23|24222.45|0.00|0.03|A|F|1992-04-21|1992-06-11|1992-05-07|TAKE BACK RETURN|FOB|sly regular pinto beans +41057|18|19|1|19|17442.19|0.07|0.08|N|O|1998-05-16|1998-03-17|1998-05-20|NONE|FOB| fluffily special requests boost +41057|271|26|2|16|18740.32|0.05|0.03|N|O|1998-05-09|1998-04-06|1998-05-13|NONE|RAIL| requests maintain blithely dari +41057|841|41|3|7|12192.88|0.07|0.00|N|O|1998-04-23|1998-03-30|1998-05-17|TAKE BACK RETURN|FOB|ully. accounts p +41057|1263|1|4|17|19792.42|0.00|0.03|N|O|1998-04-12|1998-02-27|1998-05-06|NONE|TRUCK|usly bold pinto beans +41057|1246|58|5|13|14914.12|0.10|0.03|N|O|1998-02-07|1998-02-20|1998-02-19|TAKE BACK RETURN|RAIL|sly pending asymptotes above th +41058|419|78|1|28|36943.48|0.01|0.00|N|O|1997-10-25|1997-09-28|1997-10-30|DELIVER IN PERSON|RAIL|express dinos hinder sl +41059|101|28|1|37|37040.70|0.00|0.06|A|F|1993-11-04|1993-11-05|1993-11-14|COLLECT COD|TRUCK| frets. unusual, regular requests h +41059|1352|67|2|44|55147.40|0.03|0.04|R|F|1993-10-02|1993-11-16|1993-10-16|NONE|RAIL|thely ironic epit +41059|755|52|3|36|59607.00|0.01|0.08|A|F|1994-01-07|1993-10-24|1994-01-10|NONE|REG AIR|e the evenly express as +41059|827|94|4|15|25917.30|0.04|0.02|A|F|1994-01-06|1993-10-15|1994-01-18|TAKE BACK RETURN|MAIL|n instruct +41059|632|64|5|37|56707.31|0.00|0.02|A|F|1994-01-12|1993-10-16|1994-01-21|COLLECT COD|RAIL|ges. blithely silent ideas are car +41059|190|17|6|20|21803.80|0.07|0.08|A|F|1993-11-02|1993-11-08|1993-11-16|COLLECT COD|RAIL|eans. fluffily quick +41060|1182|91|1|35|37911.30|0.01|0.06|A|F|1994-10-01|1994-08-18|1994-10-21|TAKE BACK RETURN|RAIL|elets haggle. even, silent a +41060|1596|37|2|26|38937.34|0.01|0.01|R|F|1994-07-12|1994-09-01|1994-07-19|TAKE BACK RETURN|RAIL|ans. packages are carefully. b +41061|1587|68|1|34|50611.72|0.09|0.01|N|O|1997-05-14|1997-05-09|1997-05-21|COLLECT COD|FOB|es. unusual asymptotes s +41061|586|47|2|23|34191.34|0.00|0.01|N|O|1997-06-29|1997-05-05|1997-07-17|COLLECT COD|TRUCK|riously evenly regular pack +41062|976|11|1|36|67570.92|0.07|0.07|R|F|1995-05-03|1995-02-21|1995-05-21|COLLECT COD|FOB|ending requests. qu +41062|1011|47|2|32|29184.32|0.02|0.07|A|F|1995-02-15|1995-03-15|1995-03-06|COLLECT COD|SHIP|even deposits wake unusual pa +41062|1992|25|3|21|39773.79|0.04|0.08|R|F|1995-01-26|1995-04-08|1995-02-17|TAKE BACK RETURN|AIR|des along the finally bold pinto bea +41063|1415|55|1|29|38175.89|0.00|0.05|R|F|1993-02-06|1993-02-03|1993-03-05|COLLECT COD|SHIP|out the unusual foxes are quietly +41063|1225|26|2|19|21398.18|0.00|0.06|R|F|1993-01-13|1993-01-26|1993-01-20|NONE|TRUCK| bold requests hang above the carefully i +41063|886|20|3|19|33950.72|0.04|0.07|R|F|1993-02-01|1992-12-31|1993-02-25|COLLECT COD|REG AIR|ole fluffily blithely final theod +41063|1380|95|4|18|23064.84|0.07|0.01|R|F|1993-01-04|1993-01-03|1993-01-15|DELIVER IN PERSON|REG AIR|inal accounts. fur +41063|151|30|5|50|52557.50|0.00|0.01|A|F|1993-01-12|1993-02-10|1993-02-07|NONE|SHIP|e the special braids. ir +41063|1393|8|6|19|24593.41|0.01|0.07|R|F|1993-01-23|1993-02-08|1993-02-01|NONE|MAIL|beans cajole carefully blithely ironi +41063|1559|40|7|37|54040.35|0.05|0.04|A|F|1993-01-29|1993-01-08|1993-02-15|NONE|REG AIR|ly final requests a +41088|1299|37|1|13|15603.77|0.02|0.04|N|O|1998-05-31|1998-06-29|1998-06-24|COLLECT COD|MAIL|final dependencies print about +41089|1427|45|1|49|65092.58|0.10|0.05|N|O|1998-08-29|1998-09-27|1998-09-10|TAKE BACK RETURN|SHIP|ithely fina +41090|1357|72|1|21|26425.35|0.01|0.03|A|F|1994-07-29|1994-07-01|1994-08-15|COLLECT COD|AIR|ly sly accounts are fluffily. quickl +41090|95|96|2|27|26867.43|0.09|0.04|A|F|1994-06-03|1994-05-10|1994-06-21|TAKE BACK RETURN|AIR| packages are alon +41090|1443|44|3|6|8066.64|0.04|0.08|R|F|1994-06-12|1994-06-17|1994-06-20|NONE|AIR|tions cajole around the ironic, express dep +41090|271|53|4|47|55049.69|0.00|0.04|R|F|1994-04-23|1994-05-12|1994-05-19|COLLECT COD|TRUCK|nic dependencies-- accoun +41091|19|70|1|45|41355.45|0.10|0.06|A|F|1994-07-27|1994-08-19|1994-08-26|DELIVER IN PERSON|SHIP|ions; even +41091|657|51|2|15|23364.75|0.09|0.00|A|F|1994-06-18|1994-08-01|1994-07-18|COLLECT COD|FOB|nstructions. accounts nag. furiously expre +41091|377|62|3|43|54926.91|0.07|0.06|R|F|1994-09-19|1994-07-21|1994-10-10|DELIVER IN PERSON|REG AIR|omas. fluffily ironic Tiresia +41092|1235|36|1|27|30678.21|0.04|0.00|N|O|1997-10-27|1997-09-03|1997-10-29|COLLECT COD|TRUCK|ts. final accounts w +41092|175|54|2|22|23653.74|0.10|0.05|N|O|1997-10-15|1997-08-16|1997-10-24|DELIVER IN PERSON|AIR|nusual packages grow blithely pend +41092|508|99|3|50|70425.00|0.02|0.03|N|O|1997-11-08|1997-08-29|1997-12-06|COLLECT COD|MAIL|old, regular theodolites h +41093|680|81|1|30|47420.40|0.05|0.07|N|O|1997-05-28|1997-03-16|1997-06-12|NONE|SHIP|ular asymptotes. bold packages integrate +41093|181|82|2|7|7568.26|0.03|0.06|N|O|1997-03-03|1997-03-16|1997-03-24|TAKE BACK RETURN|RAIL| ideas nag aroun +41093|823|90|3|44|75848.08|0.04|0.07|N|O|1997-04-19|1997-03-19|1997-05-05|COLLECT COD|REG AIR|xpress acco +41093|1832|33|4|36|62417.88|0.05|0.00|N|O|1997-06-01|1997-05-09|1997-06-26|COLLECT COD|FOB|ts. fluffily even foxes +41093|879|46|5|18|32037.66|0.10|0.02|N|O|1997-04-11|1997-04-22|1997-04-28|TAKE BACK RETURN|RAIL|ously even instructions. slyl +41093|333|62|6|15|18499.95|0.03|0.08|N|O|1997-03-12|1997-03-12|1997-04-02|TAKE BACK RETURN|FOB|eans. unusual reques +41094|1984|73|1|49|92413.02|0.07|0.07|R|F|1994-01-31|1994-03-26|1994-02-07|COLLECT COD|TRUCK|foxes cajole quickl +41094|289|17|2|28|33299.84|0.10|0.05|A|F|1994-04-08|1994-02-13|1994-04-20|TAKE BACK RETURN|TRUCK| regular accounts. slyly even deposits slee +41094|1972|61|3|48|89950.56|0.04|0.06|R|F|1994-02-17|1994-02-17|1994-03-01|COLLECT COD|MAIL|leep after the sly +41094|1187|24|4|30|32645.40|0.10|0.08|A|F|1994-03-08|1994-02-28|1994-03-22|COLLECT COD|REG AIR|accounts. furiously final accounts abou +41094|854|21|5|4|7019.40|0.04|0.02|R|F|1994-03-24|1994-02-07|1994-04-05|TAKE BACK RETURN|RAIL|xes. carefully final asympt +41094|71|47|6|5|4855.35|0.02|0.03|R|F|1994-03-12|1994-02-20|1994-04-04|DELIVER IN PERSON|TRUCK| foxes among the deposi +41094|337|22|7|44|54442.52|0.02|0.07|R|F|1994-02-12|1994-03-10|1994-02-17|COLLECT COD|SHIP|hely around the b +41095|134|35|1|16|16546.08|0.04|0.06|N|O|1997-02-26|1997-03-20|1997-03-18|NONE|SHIP|ely bold accounts are carefully. carefull +41120|1773|58|1|45|75364.65|0.09|0.07|R|F|1992-08-01|1992-09-09|1992-08-28|TAKE BACK RETURN|REG AIR|ts after the furiously unus +41120|1996|29|2|37|70225.63|0.04|0.08|A|F|1992-08-20|1992-09-11|1992-09-15|COLLECT COD|FOB| the carefully expr +41120|1370|85|3|5|6356.85|0.10|0.07|A|F|1992-10-26|1992-08-26|1992-11-08|COLLECT COD|SHIP|boost blithely silent escapades. slyl +41120|141|94|4|14|14575.96|0.04|0.01|R|F|1992-08-17|1992-09-13|1992-08-28|NONE|TRUCK|ideas against the special, re +41120|791|92|5|3|5075.37|0.10|0.02|R|F|1992-07-27|1992-08-14|1992-08-09|TAKE BACK RETURN|MAIL| furiously among the bold theodo +41120|708|41|6|9|14478.30|0.04|0.00|R|F|1992-10-08|1992-08-20|1992-10-25|NONE|RAIL|onic, pending excuses boost quickly. r +41121|1934|23|1|29|53241.97|0.02|0.03|N|O|1996-08-29|1996-08-18|1996-09-15|NONE|FOB| cajole. furiously ironic pinto b +41122|150|3|1|29|30454.35|0.06|0.00|A|F|1993-06-21|1993-03-30|1993-07-11|NONE|AIR|ously express +41122|1222|34|2|34|38189.48|0.07|0.01|A|F|1993-06-11|1993-04-20|1993-06-19|COLLECT COD|RAIL|al, regular packages above the +41122|828|29|3|10|17288.20|0.02|0.04|R|F|1993-05-01|1993-04-16|1993-05-08|NONE|SHIP|to beans. +41123|800|65|1|50|85040.00|0.04|0.06|R|F|1993-12-08|1994-02-15|1993-12-30|NONE|FOB|lms cajole carefully furiously final pi +41123|1897|84|2|48|86346.72|0.03|0.00|A|F|1994-02-13|1994-03-07|1994-03-01|COLLECT COD|AIR|nts wake b +41124|1389|90|1|45|58067.10|0.03|0.06|R|F|1994-08-20|1994-07-20|1994-08-22|TAKE BACK RETURN|FOB|along the fluffily special packa +41124|73|49|2|12|11676.84|0.01|0.07|A|F|1994-07-21|1994-06-23|1994-08-11|DELIVER IN PERSON|AIR|st idly about t +41124|216|98|3|5|5581.05|0.02|0.06|R|F|1994-08-16|1994-08-07|1994-08-26|NONE|RAIL|hless accounts. quickly daring foxes are. s +41125|269|24|1|16|18708.16|0.08|0.00|N|O|1995-07-29|1995-07-21|1995-08-08|TAKE BACK RETURN|AIR| daring dino +41125|41|67|2|33|31054.32|0.10|0.08|R|F|1995-05-29|1995-07-01|1995-06-10|NONE|RAIL|carefully ironic ideas cajole slyly quick +41126|1850|51|1|32|56059.20|0.01|0.02|N|O|1998-06-03|1998-06-30|1998-06-11|DELIVER IN PERSON|TRUCK|ual frets. fluffily final acc +41127|333|62|1|1|1233.33|0.08|0.06|N|O|1996-12-01|1996-10-15|1996-12-11|COLLECT COD|FOB|slyly close depen +41127|1213|14|2|47|52367.87|0.03|0.06|N|O|1996-09-06|1996-09-25|1996-10-01|NONE|TRUCK|le furiously. bold requests integrate quick +41127|633|65|3|25|38340.75|0.01|0.08|N|O|1996-10-05|1996-09-03|1996-10-26|NONE|REG AIR|pinto beans. regular, fin +41127|1913|14|4|11|19964.01|0.02|0.08|N|O|1996-10-26|1996-09-03|1996-11-10|TAKE BACK RETURN|RAIL|blithely unusual foxes. +41127|1692|34|5|46|73309.74|0.01|0.03|N|O|1996-11-04|1996-09-16|1996-11-16|TAKE BACK RETURN|SHIP|ag furiously alongside of the asympto +41152|441|71|1|4|5365.76|0.10|0.03|N|O|1995-10-16|1995-10-16|1995-11-02|DELIVER IN PERSON|REG AIR|riously even packages. blithely bold court +41152|1378|17|2|9|11514.33|0.00|0.08|N|O|1995-09-21|1995-11-29|1995-09-23|DELIVER IN PERSON|RAIL|ckages. theodolites haggle. care +41152|1606|7|3|36|54273.60|0.10|0.08|N|O|1995-12-23|1995-10-17|1996-01-22|NONE|TRUCK|ally ironic waters are fluffily. unusual +41152|1691|15|4|8|12741.52|0.00|0.03|N|O|1995-10-14|1995-11-19|1995-10-24|NONE|TRUCK|xpress pinto +41152|507|68|5|46|64745.00|0.08|0.08|N|O|1995-12-13|1995-10-14|1996-01-10|NONE|REG AIR|ffily even accounts with the slyly +41153|1221|22|1|22|24688.84|0.08|0.04|A|F|1994-04-13|1994-05-29|1994-04-15|DELIVER IN PERSON|AIR|gular dependencies +41153|914|17|2|33|59892.03|0.10|0.03|A|F|1994-07-01|1994-04-04|1994-07-26|TAKE BACK RETURN|REG AIR|s after the slyly bo +41153|1770|55|3|14|23404.78|0.08|0.02|A|F|1994-04-02|1994-04-08|1994-04-25|COLLECT COD|RAIL|counts sleep brave +41154|1247|48|1|11|12630.64|0.01|0.03|R|F|1994-07-23|1994-06-02|1994-08-03|NONE|REG AIR|ts doubt slyly. fur +41154|1953|54|2|45|83472.75|0.10|0.03|R|F|1994-07-31|1994-06-10|1994-08-27|TAKE BACK RETURN|MAIL|ffix furiously final, e +41154|406|7|3|19|24821.60|0.08|0.03|R|F|1994-07-12|1994-07-07|1994-07-14|COLLECT COD|MAIL| according to the furiously +41155|1615|39|1|2|3033.22|0.05|0.05|N|O|1996-05-11|1996-06-09|1996-06-07|COLLECT COD|SHIP| accounts are. furiously ironic deposits h +41155|1514|35|2|3|4246.53|0.03|0.05|N|O|1996-04-17|1996-06-17|1996-05-04|COLLECT COD|AIR|osits sleep +41155|1838|82|3|7|12178.81|0.09|0.07|N|O|1996-07-28|1996-05-27|1996-08-25|DELIVER IN PERSON|TRUCK|usly ideas. blithely ironic instruc +41155|623|17|4|29|44184.98|0.09|0.05|N|O|1996-06-09|1996-06-16|1996-06-15|DELIVER IN PERSON|FOB| unusual, bold dependencies hag +41156|319|76|1|37|45114.47|0.04|0.01|N|O|1998-07-11|1998-06-19|1998-07-17|DELIVER IN PERSON|TRUCK|uests wake carefully above the furiou +41157|962|31|1|28|52162.88|0.03|0.04|N|O|1995-07-06|1995-07-02|1995-07-23|NONE|SHIP|uriously even epitaphs unwind regula +41157|1527|48|2|17|24284.84|0.09|0.08|N|F|1995-06-12|1995-06-20|1995-07-09|DELIVER IN PERSON|RAIL|ar packages? th +41157|943|44|3|32|59006.08|0.04|0.04|N|O|1995-08-05|1995-07-03|1995-08-12|NONE|RAIL|nto beans. +41157|1275|13|4|15|17644.05|0.05|0.02|N|O|1995-07-15|1995-06-25|1995-07-24|COLLECT COD|FOB| promise. close accounts cajo +41157|392|77|5|38|49110.82|0.07|0.06|N|O|1995-07-07|1995-06-25|1995-07-14|COLLECT COD|RAIL|blithely fluffily ironi +41158|746|79|1|22|36228.28|0.10|0.07|N|O|1996-04-10|1996-05-17|1996-05-06|COLLECT COD|FOB|ackages must sleep carefully. fina +41158|1271|72|2|20|23445.40|0.00|0.06|N|O|1996-06-01|1996-06-29|1996-06-14|NONE|FOB|ously pending packages wake regul +41158|138|17|3|33|34258.29|0.01|0.02|N|O|1996-07-21|1996-06-16|1996-07-22|NONE|SHIP|accounts. final packages integrate aga +41158|1262|100|4|16|18612.16|0.05|0.05|N|O|1996-07-29|1996-05-10|1996-08-07|DELIVER IN PERSON|FOB|dencies. f +41158|186|13|5|18|19551.24|0.06|0.02|N|O|1996-06-27|1996-05-09|1996-07-09|NONE|REG AIR| sleep slyly ev +41158|1254|92|6|50|57762.50|0.10|0.07|N|O|1996-06-24|1996-05-15|1996-07-01|TAKE BACK RETURN|RAIL|es wake never ironic, re +41159|35|86|1|12|11220.36|0.08|0.03|N|O|1997-01-25|1997-01-24|1997-02-11|DELIVER IN PERSON|TRUCK|totes cajole slyly. carefully thi +41184|585|46|1|50|74279.00|0.00|0.02|N|O|1995-12-23|1995-11-24|1996-01-21|TAKE BACK RETURN|SHIP|iously along +41184|439|27|2|8|10715.44|0.01|0.03|N|O|1995-12-31|1995-11-19|1996-01-09|NONE|AIR|y express dolphins. deposit +41184|1013|14|3|9|8226.09|0.04|0.04|N|O|1995-12-13|1995-12-07|1995-12-25|DELIVER IN PERSON|TRUCK|und the carefully special accounts +41184|1482|61|4|7|9684.36|0.09|0.01|N|O|1995-11-26|1995-11-29|1995-12-05|DELIVER IN PERSON|TRUCK| enticing packages are +41184|1332|47|5|26|32066.58|0.08|0.02|N|O|1995-11-19|1995-11-10|1995-12-05|COLLECT COD|REG AIR|imes. final a +41185|1713|14|1|41|66203.11|0.06|0.06|R|F|1994-12-26|1995-02-07|1995-01-20|DELIVER IN PERSON|RAIL|after the regular platelets eat quickl +41185|817|18|2|14|24049.34|0.02|0.01|R|F|1995-02-15|1995-02-08|1995-03-15|COLLECT COD|REG AIR|bout the final p +41185|472|31|3|11|15097.17|0.03|0.06|A|F|1995-03-13|1995-02-06|1995-04-12|NONE|TRUCK|ultipliers- +41185|1365|66|4|27|34191.72|0.04|0.08|R|F|1995-03-28|1995-01-24|1995-03-31|NONE|RAIL|luffily about the ironically p +41185|1230|42|5|4|4524.92|0.08|0.03|R|F|1994-12-29|1995-02-03|1995-01-16|NONE|AIR|iously furious ide +41185|158|37|6|6|6348.90|0.10|0.06|A|F|1995-02-28|1995-02-25|1995-03-28|COLLECT COD|SHIP|out the ironic deposits lose even reques +41185|1145|82|7|29|30338.06|0.02|0.02|R|F|1995-02-19|1995-01-21|1995-02-25|TAKE BACK RETURN|TRUCK|he instructions affix carefully. re +41186|743|44|1|22|36162.28|0.07|0.05|A|F|1994-03-05|1993-12-31|1994-03-10|COLLECT COD|RAIL|ial foxes along the slowly +41186|1071|42|2|44|42771.08|0.03|0.08|A|F|1994-03-22|1993-12-27|1994-03-28|NONE|TRUCK|dolites cajol +41186|1662|63|3|4|6254.64|0.05|0.01|R|F|1994-02-26|1994-01-01|1994-03-07|NONE|SHIP|ly. blithely +41186|804|4|4|18|30686.40|0.09|0.02|R|F|1994-03-01|1993-12-24|1994-03-03|TAKE BACK RETURN|FOB|des nag carefully alongside +41186|1154|55|5|13|13716.95|0.09|0.03|R|F|1994-01-17|1993-12-23|1994-01-22|DELIVER IN PERSON|AIR|ely even packages. even pa +41186|1605|47|6|1|1506.60|0.01|0.04|R|F|1994-02-10|1994-01-30|1994-02-23|NONE|TRUCK|kages sleep even acc +41186|1767|52|7|22|36712.72|0.10|0.02|R|F|1993-12-29|1994-01-06|1994-01-23|NONE|AIR|deposits against the packages +41187|1049|20|1|33|31351.32|0.00|0.04|A|F|1993-10-02|1993-12-27|1993-10-29|TAKE BACK RETURN|RAIL| slyly ironic package +41187|725|26|2|6|9754.32|0.08|0.07|R|F|1993-10-19|1993-12-18|1993-10-23|DELIVER IN PERSON|FOB|tect about the ne +41187|1379|18|3|25|32009.25|0.07|0.03|A|F|1993-12-07|1993-12-05|1993-12-27|TAKE BACK RETURN|MAIL|osits: furiously s +41187|881|15|4|23|40983.24|0.05|0.04|A|F|1994-01-23|1993-12-02|1994-02-21|TAKE BACK RETURN|MAIL| quickly slyly regular packages. +41187|319|20|5|40|48772.40|0.10|0.05|A|F|1994-01-12|1993-11-07|1994-02-01|NONE|SHIP|lites haggle slyly ironic asympto +41188|1563|64|1|14|20503.84|0.04|0.02|N|O|1998-04-13|1998-05-15|1998-05-03|NONE|TRUCK|s believe c +41188|647|48|2|14|21666.96|0.08|0.03|N|O|1998-05-26|1998-05-31|1998-06-23|COLLECT COD|REG AIR|lites? carefully even foxes use finally ir +41189|265|66|1|42|48940.92|0.05|0.08|R|F|1994-07-16|1994-10-01|1994-08-15|TAKE BACK RETURN|REG AIR| sleep blithely silent accounts. even +41189|257|58|2|26|30088.50|0.04|0.06|A|F|1994-10-17|1994-08-28|1994-10-30|DELIVER IN PERSON|AIR|heodolites. carefully even ideas +41189|1071|7|3|3|2916.21|0.00|0.04|A|F|1994-08-29|1994-09-04|1994-09-02|DELIVER IN PERSON|RAIL|fully regular instructions are carefully +41189|799|32|4|45|76490.55|0.00|0.06|R|F|1994-11-08|1994-08-28|1994-11-12|COLLECT COD|RAIL| regular instruction +41190|1495|35|1|25|34912.25|0.00|0.00|A|F|1993-12-15|1993-11-25|1994-01-04|NONE|FOB| ironic tithes wake quickly. pend +41190|347|76|2|43|53635.62|0.04|0.06|A|F|1994-01-22|1993-11-09|1994-02-05|NONE|SHIP|deas wake carefully. blithely regular pinto +41190|1216|28|3|33|36867.93|0.03|0.07|A|F|1993-11-04|1993-10-31|1993-11-26|DELIVER IN PERSON|FOB|hely silent instructions +41190|1031|37|4|3|2796.09|0.07|0.05|A|F|1993-10-15|1993-10-29|1993-11-11|DELIVER IN PERSON|TRUCK|ntegrate sly +41190|634|66|5|22|33761.86|0.01|0.06|R|F|1994-01-08|1993-11-15|1994-01-20|DELIVER IN PERSON|REG AIR|beneath the flu +41190|1698|81|6|19|30394.11|0.01|0.00|R|F|1993-12-14|1993-12-13|1993-12-15|NONE|AIR|. instructions sleep caref +41191|1349|50|1|37|46262.58|0.09|0.08|N|O|1998-04-26|1998-04-07|1998-05-24|DELIVER IN PERSON|REG AIR|refully regular dependencies +41191|1368|45|2|28|35542.08|0.08|0.04|N|O|1998-06-22|1998-04-02|1998-07-01|COLLECT COD|REG AIR|ly final ideas among the unusual co +41191|1206|7|3|37|40966.40|0.05|0.04|N|O|1998-05-29|1998-05-26|1998-06-01|DELIVER IN PERSON|RAIL| accounts. quick, special packages u +41191|1664|88|4|34|53232.44|0.10|0.01|N|O|1998-06-27|1998-04-03|1998-07-13|COLLECT COD|FOB|slyly about the fluffily regular dugout +41191|645|46|5|18|27821.52|0.00|0.02|N|O|1998-06-21|1998-04-13|1998-06-26|NONE|REG AIR|ealthily. carefu +41191|800|97|6|26|44220.80|0.05|0.03|N|O|1998-06-03|1998-04-19|1998-06-23|DELIVER IN PERSON|TRUCK| deposits. bl +41191|297|25|7|10|11972.90|0.06|0.00|N|O|1998-05-16|1998-05-09|1998-05-18|COLLECT COD|AIR|deas play quickly above the furiousl +41216|1565|46|1|10|14665.60|0.01|0.00|R|F|1994-09-14|1994-09-04|1994-09-26|NONE|MAIL|y pending packages use furio +41216|1379|18|2|21|26887.77|0.07|0.07|A|F|1994-10-25|1994-08-13|1994-11-14|COLLECT COD|FOB|lly final r +41216|412|71|3|22|28873.02|0.06|0.05|R|F|1994-09-06|1994-08-28|1994-09-16|COLLECT COD|MAIL|es sleep blithely car +41217|407|95|1|24|31377.60|0.00|0.03|N|O|1995-08-20|1995-08-14|1995-09-12|NONE|AIR|g theodolites n +41217|1497|76|2|13|18180.37|0.02|0.03|N|O|1995-11-01|1995-08-18|1995-11-14|COLLECT COD|REG AIR|s sleep carefully. carefully fin +41218|930|33|1|22|40280.46|0.00|0.00|N|O|1996-12-22|1997-01-17|1997-01-21|TAKE BACK RETURN|REG AIR|deposits. +41218|254|9|2|23|26547.75|0.01|0.01|N|O|1996-12-05|1996-12-28|1996-12-29|TAKE BACK RETURN|MAIL|nding accounts cajo +41218|697|60|3|27|43137.63|0.06|0.05|N|O|1997-01-01|1996-12-18|1997-01-15|COLLECT COD|AIR|carefully. blithely express ins +41218|973|74|4|25|46849.25|0.05|0.04|N|O|1996-10-27|1996-12-24|1996-11-01|COLLECT COD|REG AIR|efully special +41219|372|57|1|43|54711.91|0.10|0.05|A|F|1992-09-29|1992-08-16|1992-10-10|COLLECT COD|RAIL|uses cajole furiously around the car +41219|152|31|2|46|48398.90|0.05|0.00|A|F|1992-10-20|1992-09-29|1992-10-30|TAKE BACK RETURN|AIR|ecial requests nod fi +41219|1961|50|3|11|20492.56|0.03|0.08|R|F|1992-09-10|1992-09-16|1992-10-02|TAKE BACK RETURN|TRUCK|accounts haggle c +41219|918|19|4|3|5456.73|0.10|0.03|A|F|1992-07-06|1992-09-07|1992-07-20|TAKE BACK RETURN|REG AIR|s about the furiously regular ac +41220|1901|90|1|42|75721.80|0.05|0.01|N|O|1997-09-04|1997-09-26|1997-09-06|DELIVER IN PERSON|FOB|d ideas bo +41220|1081|87|2|19|18659.52|0.07|0.03|N|O|1997-10-17|1997-11-14|1997-11-11|TAKE BACK RETURN|MAIL|players. furiously e +41220|372|73|3|20|25447.40|0.08|0.00|N|O|1997-10-27|1997-11-03|1997-11-09|DELIVER IN PERSON|RAIL| furiously fluffily bold pla +41220|208|36|4|3|3324.60|0.06|0.03|N|O|1997-09-14|1997-10-04|1997-09-15|TAKE BACK RETURN|MAIL|al asymptotes are furiously e +41221|1846|47|1|9|15730.56|0.09|0.06|A|F|1994-12-01|1994-10-24|1994-12-12|NONE|AIR|totes boost above t +41221|578|79|2|22|32528.54|0.06|0.01|R|F|1994-09-22|1994-11-18|1994-10-09|NONE|TRUCK|ound the pending, bold packa +41222|94|20|1|40|39763.60|0.03|0.07|N|O|1998-06-03|1998-06-06|1998-06-20|DELIVER IN PERSON|SHIP| ideas. even, regular packa +41222|1032|38|2|6|5598.18|0.02|0.01|N|O|1998-06-30|1998-05-04|1998-07-19|NONE|SHIP|lar somas se +41222|40|16|3|15|14100.60|0.07|0.07|N|O|1998-04-03|1998-04-24|1998-04-27|DELIVER IN PERSON|AIR| nag carefully along t +41223|784|49|1|23|38749.94|0.06|0.03|N|O|1998-01-19|1997-12-02|1998-02-01|TAKE BACK RETURN|RAIL| accounts integrate carefully furiously +41223|171|72|2|24|25708.08|0.00|0.06|N|O|1997-11-23|1998-01-02|1997-12-01|NONE|REG AIR|y regular acco +41223|1882|83|3|9|16054.92|0.02|0.02|N|O|1998-01-14|1998-01-05|1998-01-16|TAKE BACK RETURN|FOB|ter the unusual epitaphs. pend +41223|738|71|4|50|81936.50|0.04|0.05|N|O|1997-11-29|1998-01-28|1997-12-09|DELIVER IN PERSON|REG AIR|ly even deposits. slyly ironic fox +41223|535|66|5|13|18661.89|0.00|0.00|N|O|1997-12-27|1997-12-12|1998-01-17|TAKE BACK RETURN|SHIP|nag carefully. qui +41248|125|4|1|38|38954.56|0.09|0.01|N|O|1998-07-10|1998-05-11|1998-07-17|TAKE BACK RETURN|FOB|ckages integrate slyly e +41248|1497|76|2|30|41954.70|0.05|0.03|N|O|1998-06-23|1998-05-03|1998-06-24|COLLECT COD|RAIL| blithely at the furiously regular +41248|341|98|3|30|37240.20|0.01|0.08|N|O|1998-07-25|1998-06-04|1998-08-03|NONE|SHIP|posits at the unusual, fin +41248|1697|39|4|26|41565.94|0.08|0.06|N|O|1998-04-05|1998-04-28|1998-04-15|DELIVER IN PERSON|AIR| slyly along the furiously +41248|162|63|5|12|12745.92|0.00|0.08|N|O|1998-07-05|1998-06-05|1998-07-06|TAKE BACK RETURN|AIR|nic accounts. slyly regular ideas wake +41248|1516|37|6|43|60952.93|0.09|0.00|N|O|1998-05-10|1998-05-15|1998-05-21|COLLECT COD|SHIP|es cajole accord +41248|1674|75|7|21|33089.07|0.00|0.05|N|O|1998-03-31|1998-05-10|1998-04-18|COLLECT COD|AIR|bold packa +41249|874|74|1|43|76319.41|0.01|0.08|N|O|1998-05-16|1998-07-13|1998-05-17|NONE|SHIP|lly final foxes. carefully regular +41249|165|18|2|12|12781.92|0.01|0.02|N|O|1998-08-22|1998-07-18|1998-08-23|TAKE BACK RETURN|TRUCK|wake regular packages. express, regu +41249|737|38|3|8|13101.84|0.10|0.01|N|O|1998-06-15|1998-07-07|1998-07-14|COLLECT COD|AIR|zzle express, even packages. slyl +41249|1287|99|4|37|43966.36|0.02|0.02|N|O|1998-06-27|1998-05-29|1998-07-27|TAKE BACK RETURN|RAIL|sely final accounts: quickly re +41250|1479|97|1|28|38653.16|0.04|0.05|N|O|1996-10-01|1996-07-12|1996-10-10|TAKE BACK RETURN|REG AIR|. furiously final t +41250|1725|52|2|25|40668.00|0.08|0.00|N|O|1996-06-07|1996-09-02|1996-07-06|COLLECT COD|MAIL|ccounts sleep slyly across the pe +41250|480|81|3|47|64882.56|0.07|0.02|N|O|1996-08-28|1996-08-01|1996-09-13|COLLECT COD|RAIL|nic packages. final, even packages mainta +41250|546|7|4|47|67987.38|0.08|0.08|N|O|1996-06-26|1996-07-12|1996-07-23|COLLECT COD|RAIL|lyly slyly special requests. pending +41250|1891|21|5|43|77094.27|0.08|0.08|N|O|1996-06-24|1996-08-01|1996-07-01|TAKE BACK RETURN|FOB|l packages impress. careful +41251|919|20|1|25|45497.75|0.05|0.07|N|O|1998-06-08|1998-04-10|1998-06-15|COLLECT COD|AIR|ide the ironic, regular pinto beans boo +41251|1342|81|2|8|9946.72|0.08|0.08|N|O|1998-05-29|1998-04-14|1998-06-19|COLLECT COD|FOB|pecial deposits haggle furiously ironic f +41251|150|3|3|9|9451.35|0.10|0.04|N|O|1998-05-08|1998-05-07|1998-06-01|NONE|RAIL|le blithely never pending deposit +41251|162|15|4|39|41424.24|0.05|0.06|N|O|1998-05-15|1998-04-22|1998-06-08|TAKE BACK RETURN|MAIL|hely final dep +41252|5|56|1|26|23530.00|0.00|0.03|N|O|1997-05-08|1997-03-18|1997-06-02|NONE|SHIP|eas are quickly carefull +41252|1950|95|2|10|18519.50|0.08|0.03|N|O|1997-02-23|1997-03-24|1997-03-13|COLLECT COD|AIR|ithely along the blithely even accoun +41253|380|81|1|18|23046.84|0.01|0.08|R|F|1994-07-18|1994-06-07|1994-07-20|COLLECT COD|FOB|sly accordin +41253|1174|83|2|10|10751.70|0.06|0.03|R|F|1994-06-10|1994-07-11|1994-06-14|DELIVER IN PERSON|RAIL|: bold instructions wake slyly final +41253|722|23|3|15|24340.80|0.07|0.00|A|F|1994-08-08|1994-06-28|1994-08-09|COLLECT COD|SHIP| special a +41253|346|3|4|48|59824.32|0.03|0.02|R|F|1994-06-22|1994-07-29|1994-07-11|NONE|MAIL|thely slow requests haggle b +41253|1497|76|5|33|46150.17|0.08|0.02|A|F|1994-08-17|1994-07-18|1994-08-31|DELIVER IN PERSON|TRUCK|tainments. blithely express ideas sl +41253|766|63|6|2|3333.52|0.07|0.01|R|F|1994-06-25|1994-08-05|1994-07-14|COLLECT COD|AIR|ely idle foxes. deposits sleep slyly afte +41253|1584|85|7|50|74279.00|0.07|0.08|A|F|1994-05-29|1994-06-28|1994-06-23|COLLECT COD|REG AIR|unts after the +41254|344|1|1|34|42307.56|0.01|0.08|R|F|1995-03-17|1995-02-19|1995-04-07|TAKE BACK RETURN|AIR|sly even pack +41254|797|98|2|22|37351.38|0.07|0.07|R|F|1995-03-06|1995-02-14|1995-03-11|TAKE BACK RETURN|SHIP|re furiously above the slyl +41254|1877|21|3|46|81828.02|0.02|0.04|A|F|1995-03-22|1995-02-23|1995-04-13|TAKE BACK RETURN|MAIL|ously silent foxes. carefully unusual req +41254|1771|98|4|35|58546.95|0.03|0.06|R|F|1995-04-03|1995-04-11|1995-04-26|COLLECT COD|RAIL|aggle slyly bold p +41255|1333|10|1|34|41967.22|0.00|0.08|R|F|1994-11-06|1995-01-05|1994-11-25|NONE|REG AIR|ts. slyly even dol +41255|1464|82|2|3|4096.38|0.10|0.03|A|F|1995-01-18|1994-12-27|1995-02-08|COLLECT COD|TRUCK|press deposits dazzle blithely fox +41255|1237|12|3|4|4552.92|0.01|0.05|R|F|1994-11-11|1994-12-03|1994-11-14|DELIVER IN PERSON|FOB|arefully specia +41255|1314|29|4|39|47397.09|0.05|0.06|A|F|1995-02-12|1995-01-15|1995-03-05|NONE|TRUCK| alongside of the fluffily +41255|382|67|5|23|29494.74|0.03|0.04|A|F|1995-01-07|1995-01-14|1995-01-20|NONE|REG AIR|kly. blithely ironic dolphins nag ca +41280|1699|23|1|18|28812.42|0.04|0.00|N|O|1996-11-07|1996-10-14|1996-11-18|DELIVER IN PERSON|SHIP|its. stealthy depos +41280|875|9|2|31|55051.97|0.09|0.03|N|O|1996-09-23|1996-10-07|1996-10-22|COLLECT COD|REG AIR|n deposits haggle blithely e +41281|437|67|1|17|22736.31|0.07|0.05|A|F|1992-01-30|1992-04-07|1992-02-16|NONE|AIR|y carefully ironic +41281|1093|94|2|19|18887.71|0.09|0.07|A|F|1992-04-07|1992-04-07|1992-04-14|COLLECT COD|MAIL|uests haggle blit +41282|1818|19|1|6|10318.86|0.04|0.02|A|F|1994-07-21|1994-09-18|1994-08-10|DELIVER IN PERSON|MAIL|ts. blithely express excu +41282|740|41|2|45|73833.30|0.02|0.05|A|F|1994-08-18|1994-09-20|1994-09-10|COLLECT COD|RAIL|usly bold packages across the quick t +41282|46|47|3|7|6622.28|0.02|0.02|R|F|1994-10-15|1994-09-25|1994-11-11|DELIVER IN PERSON|TRUCK|ly unusual pearls wake f +41282|247|29|4|37|42447.88|0.05|0.07|A|F|1994-07-07|1994-09-19|1994-07-29|DELIVER IN PERSON|AIR|ove the theodolites. final, even pinto bean +41282|1038|39|5|27|25353.81|0.04|0.00|A|F|1994-08-25|1994-08-17|1994-09-08|COLLECT COD|AIR|gle slyly e +41283|909|78|1|46|83255.40|0.04|0.05|N|O|1996-06-11|1996-05-26|1996-06-21|NONE|SHIP| pinto beans. bold, final foxes +41283|1411|29|2|25|32810.25|0.09|0.00|N|O|1996-04-21|1996-05-16|1996-04-27|COLLECT COD|REG AIR|yly bold packages cajole e +41283|1684|26|3|43|68184.24|0.00|0.00|N|O|1996-07-06|1996-06-07|1996-07-14|DELIVER IN PERSON|FOB|e unusual packages cajo +41284|1410|89|1|41|53767.81|0.06|0.06|N|O|1998-08-27|1998-10-10|1998-09-12|DELIVER IN PERSON|RAIL|egular, unusual platel +41284|427|28|2|24|31858.08|0.10|0.08|N|O|1998-10-25|1998-08-31|1998-11-17|TAKE BACK RETURN|AIR|ckly bold ideas. furiously unusual dep +41284|13|14|3|39|35607.39|0.04|0.02|N|O|1998-08-25|1998-09-01|1998-09-11|TAKE BACK RETURN|MAIL|heodolites according to the unusual, eve +41284|127|80|4|23|23623.76|0.01|0.08|N|O|1998-07-30|1998-09-13|1998-08-18|TAKE BACK RETURN|REG AIR|heodolites sleep blithely. bl +41284|407|8|5|25|32685.00|0.08|0.01|N|O|1998-10-30|1998-08-23|1998-11-16|NONE|MAIL|ide of the furiously ironic dinos. final wa +41284|1009|15|6|22|20020.00|0.02|0.04|N|O|1998-09-28|1998-10-15|1998-10-27|COLLECT COD|REG AIR|s wake quickly since the blit +41285|189|16|1|46|50102.28|0.07|0.02|N|O|1998-04-19|1998-05-06|1998-05-06|DELIVER IN PERSON|SHIP|e across the furiously ironic pack +41285|1859|89|2|50|88042.50|0.07|0.01|N|O|1998-05-21|1998-05-05|1998-06-09|COLLECT COD|AIR|ts cajole abov +41285|1707|92|3|29|46652.30|0.06|0.08|N|O|1998-04-02|1998-03-21|1998-04-03|TAKE BACK RETURN|FOB|ickly pendi +41285|1807|51|4|11|18796.80|0.05|0.05|N|O|1998-03-05|1998-05-09|1998-03-10|DELIVER IN PERSON|RAIL|. deposits haggle excuses. care +41285|48|74|5|8|7584.32|0.02|0.05|N|O|1998-05-26|1998-04-16|1998-06-19|DELIVER IN PERSON|FOB| final theodolites detect blithely expres +41285|209|10|6|3|3327.60|0.07|0.00|N|O|1998-04-21|1998-04-05|1998-04-24|DELIVER IN PERSON|TRUCK| carefully +41285|810|44|7|49|83829.69|0.08|0.06|N|O|1998-05-07|1998-04-08|1998-05-29|NONE|FOB| detect ca +41286|252|53|1|37|42633.25|0.00|0.07|R|F|1992-10-15|1992-12-01|1992-10-28|DELIVER IN PERSON|FOB| pending ideas detect. furiously ironic +41286|1544|45|2|27|39029.58|0.00|0.01|R|F|1993-01-10|1992-10-19|1993-02-07|COLLECT COD|AIR| deposits boost carefully across t +41286|491|79|3|41|57051.09|0.01|0.00|A|F|1992-09-30|1992-10-31|1992-10-04|TAKE BACK RETURN|FOB| furiously +41286|1627|28|4|45|68787.90|0.01|0.08|R|F|1993-01-13|1992-11-30|1993-02-05|NONE|TRUCK| along the bo +41287|374|31|1|44|56072.28|0.00|0.07|N|O|1996-05-18|1996-04-25|1996-05-25|TAKE BACK RETURN|AIR|against the slyly pending theodolites. sly +41287|1964|9|2|17|31721.32|0.01|0.03|N|O|1996-06-21|1996-05-25|1996-06-28|NONE|TRUCK|posits cajole blithely. pinto beans +41312|1763|48|1|39|64925.64|0.08|0.07|R|F|1992-04-24|1992-03-19|1992-05-12|COLLECT COD|RAIL| blithely along the furiously final acc +41312|1831|18|2|22|38122.26|0.01|0.07|R|F|1992-02-05|1992-04-14|1992-02-17|NONE|REG AIR|he carefully re +41312|1420|99|3|5|6607.10|0.10|0.04|R|F|1992-02-25|1992-04-01|1992-03-09|NONE|SHIP|sits use blithely brave +41312|1005|6|4|31|28086.00|0.06|0.00|R|F|1992-05-10|1992-04-22|1992-06-04|DELIVER IN PERSON|AIR|s haggle. ironic instructions +41312|185|38|5|22|23873.96|0.01|0.01|A|F|1992-05-05|1992-04-25|1992-05-20|TAKE BACK RETURN|REG AIR|along the enticingly entic +41312|567|58|6|7|10272.92|0.09|0.06|R|F|1992-03-16|1992-03-04|1992-04-15|COLLECT COD|SHIP|accounts. slyly ironic accounts use fina +41312|191|70|7|30|32735.70|0.06|0.08|A|F|1992-02-14|1992-04-18|1992-02-17|DELIVER IN PERSON|RAIL|slyly final accounts among the requ +41313|1347|24|1|21|26215.14|0.08|0.02|R|F|1993-02-12|1993-03-04|1993-02-13|DELIVER IN PERSON|TRUCK|ly regular packages +41313|1364|3|2|29|36695.44|0.04|0.02|R|F|1993-02-23|1993-03-21|1993-03-13|COLLECT COD|FOB|ven foxes above the special accounts caj +41313|198|25|3|15|16472.85|0.03|0.05|A|F|1993-02-09|1993-03-17|1993-02-18|TAKE BACK RETURN|REG AIR|final deposits. ideas sleep busily acc +41314|913|14|1|45|81625.95|0.08|0.02|N|O|1997-08-03|1997-07-23|1997-08-12|TAKE BACK RETURN|AIR|ly even accou +41314|248|3|2|33|37891.92|0.02|0.07|N|O|1997-08-24|1997-06-23|1997-08-25|TAKE BACK RETURN|RAIL|y slyly final somas. fluffily regular excus +41314|1755|56|3|48|79524.00|0.00|0.08|N|O|1997-07-15|1997-07-17|1997-07-22|TAKE BACK RETURN|REG AIR|sual accounts boost blithely f +41314|255|83|4|41|47365.25|0.05|0.08|N|O|1997-08-10|1997-06-18|1997-08-26|COLLECT COD|RAIL|dolites along the depths c +41315|840|7|1|7|12185.88|0.08|0.06|N|O|1998-07-25|1998-09-26|1998-08-18|NONE|TRUCK|n deposits across the special packages caj +41315|735|68|2|41|67064.93|0.01|0.04|N|O|1998-09-21|1998-08-26|1998-10-05|NONE|SHIP|hely idle theodolites across the regul +41315|632|95|3|49|75098.87|0.04|0.08|N|O|1998-10-30|1998-10-15|1998-11-03|TAKE BACK RETURN|FOB|efully even warthogs amon +41316|1594|15|1|25|37389.75|0.05|0.00|R|F|1994-11-07|1994-10-08|1994-11-08|TAKE BACK RETURN|REG AIR| play furiousl +41316|850|84|2|26|45522.10|0.01|0.06|R|F|1994-11-06|1994-10-09|1994-11-26|TAKE BACK RETURN|RAIL| across the packages poach +41316|1890|91|3|4|7167.56|0.06|0.08|A|F|1994-10-26|1994-08-26|1994-11-14|NONE|AIR|eposits. slyly stealthy packages los +41316|718|19|4|19|30755.49|0.01|0.02|A|F|1994-08-05|1994-08-30|1994-08-17|COLLECT COD|MAIL|ts affix slyly ironic deposits. ironic, r +41316|1394|95|5|5|6476.95|0.08|0.08|R|F|1994-08-15|1994-10-20|1994-08-27|TAKE BACK RETURN|RAIL|gular, regular i +41316|1365|4|6|49|62051.64|0.05|0.05|R|F|1994-10-15|1994-09-26|1994-10-30|TAKE BACK RETURN|AIR|ions engage furiously qui +41316|921|24|7|24|43726.08|0.04|0.00|R|F|1994-08-04|1994-09-09|1994-08-15|NONE|RAIL|dolites. blithely final accounts +41317|1778|63|1|46|77269.42|0.06|0.04|N|O|1998-07-30|1998-06-15|1998-08-04|NONE|TRUCK|. blithely quick f +41317|1356|57|2|16|20117.60|0.07|0.03|N|O|1998-07-31|1998-08-02|1998-08-05|NONE|SHIP|s platelets. accounts breach blithely a +41317|285|67|3|3|3555.84|0.01|0.06|N|O|1998-09-07|1998-06-26|1998-09-24|DELIVER IN PERSON|MAIL|slyly regular +41317|1272|84|4|40|46930.80|0.09|0.03|N|O|1998-08-07|1998-07-06|1998-08-23|COLLECT COD|REG AIR|ording to the carefully sly +41317|1516|37|5|49|69457.99|0.07|0.03|N|O|1998-05-30|1998-07-11|1998-06-01|DELIVER IN PERSON|FOB|usly pending packages sleep q +41317|473|74|6|47|64553.09|0.03|0.06|N|O|1998-08-26|1998-07-04|1998-08-27|COLLECT COD|RAIL|n, bold accounts are bl +41318|476|6|1|9|12388.23|0.01|0.03|N|O|1995-11-24|1995-11-11|1995-12-09|NONE|TRUCK|ages above the ironic asymptotes snooze +41318|1660|61|2|27|42164.82|0.07|0.08|N|O|1996-01-24|1995-11-24|1996-02-03|COLLECT COD|RAIL|mpress furiously silent +41318|831|65|3|25|43295.75|0.00|0.02|N|O|1995-10-14|1995-12-09|1995-11-12|TAKE BACK RETURN|MAIL|r deposits. +41318|500|88|4|38|53219.00|0.02|0.01|N|O|1995-10-16|1995-11-12|1995-11-15|TAKE BACK RETURN|FOB|er the blithely even theodolites. express +41318|1803|33|5|38|64782.40|0.03|0.07|N|O|1995-12-03|1995-12-31|1995-12-29|NONE|MAIL|ly against the slyly +41318|207|89|6|31|34323.20|0.09|0.07|N|O|1996-01-13|1996-01-05|1996-02-10|TAKE BACK RETURN|FOB|telets are. slyly final deposits +41318|1663|64|7|2|3129.32|0.03|0.00|N|O|1995-10-30|1995-11-30|1995-10-31|TAKE BACK RETURN|RAIL|bout the deposit +41319|1637|38|1|15|23079.45|0.00|0.08|R|F|1992-10-01|1992-08-18|1992-10-21|DELIVER IN PERSON|SHIP|ep slyly according to the slyly express pa +41344|1821|8|1|18|31010.76|0.05|0.07|A|F|1992-04-16|1992-06-09|1992-05-02|DELIVER IN PERSON|TRUCK|gular courts. blithely b +41345|815|49|1|22|37747.82|0.03|0.02|A|F|1992-05-12|1992-04-06|1992-05-29|DELIVER IN PERSON|RAIL|ckly quickly silent foxes. carefully pendi +41345|827|27|2|32|55290.24|0.09|0.08|A|F|1992-04-24|1992-04-24|1992-05-17|NONE|FOB|und the special epitaphs. perma +41345|148|1|3|42|44021.88|0.03|0.04|A|F|1992-05-23|1992-04-16|1992-06-09|COLLECT COD|FOB|ess packages haggle blithely after th +41345|1864|51|4|34|60039.24|0.05|0.00|R|F|1992-04-16|1992-05-02|1992-04-29|TAKE BACK RETURN|RAIL|ithely thin deposits +41345|1181|90|5|15|16232.70|0.03|0.04|R|F|1992-03-11|1992-03-08|1992-03-29|NONE|SHIP|. regular asymptotes s +41345|216|17|6|4|4464.84|0.00|0.01|R|F|1992-03-16|1992-03-29|1992-03-28|COLLECT COD|RAIL|ounts detect sly +41346|1747|32|1|8|13189.92|0.03|0.02|N|O|1997-02-12|1997-04-16|1997-02-14|TAKE BACK RETURN|TRUCK|s pinto beans across the quickl +41346|480|68|2|22|30370.56|0.07|0.03|N|O|1997-03-07|1997-04-14|1997-03-09|DELIVER IN PERSON|SHIP|ep against the slyly bol +41347|1780|23|1|42|70634.76|0.04|0.00|R|F|1994-01-04|1993-12-22|1994-01-22|COLLECT COD|TRUCK| the slyly ironic +41347|1766|67|2|29|48365.04|0.01|0.00|R|F|1993-11-09|1993-12-02|1993-12-09|NONE|TRUCK|ully pending instructions after th +41348|1337|52|1|47|58201.51|0.02|0.07|N|O|1996-11-23|1997-01-18|1996-12-08|NONE|RAIL|ar package +41348|1257|95|2|40|46330.00|0.10|0.05|N|O|1997-03-16|1996-12-26|1997-03-19|TAKE BACK RETURN|SHIP|ckly silent deposits +41348|81|32|3|38|37281.04|0.03|0.00|N|O|1997-01-14|1997-02-08|1997-01-27|DELIVER IN PERSON|AIR| final packages. special p +41349|1028|99|1|23|21367.46|0.10|0.01|N|O|1996-01-25|1996-01-23|1996-01-30|COLLECT COD|AIR| accounts boost al +41349|620|14|2|39|59304.18|0.04|0.01|N|O|1996-01-11|1996-01-28|1996-01-25|COLLECT COD|SHIP|accounts. regular, final +41349|322|7|3|45|55004.40|0.04|0.06|N|O|1996-01-21|1996-03-02|1996-02-10|TAKE BACK RETURN|AIR| slyly across the fu +41349|340|69|4|27|33489.18|0.05|0.06|N|O|1996-02-01|1996-02-24|1996-02-27|NONE|RAIL|after the carefully regular packages. unus +41350|795|96|1|25|42394.75|0.03|0.03|R|F|1993-07-03|1993-06-26|1993-07-17|COLLECT COD|MAIL|tes boost furiously final ideas +41350|567|68|2|29|42559.24|0.10|0.07|R|F|1993-07-27|1993-06-20|1993-08-11|TAKE BACK RETURN|REG AIR|longside of +41350|643|37|3|10|15436.40|0.00|0.07|R|F|1993-05-30|1993-06-17|1993-06-20|NONE|FOB|nal instructions wake +41351|396|81|1|40|51855.60|0.04|0.00|R|F|1993-11-28|1993-12-21|1993-12-19|TAKE BACK RETURN|AIR|lites are carefully abo +41351|1620|21|2|34|51735.08|0.01|0.00|A|F|1993-11-10|1993-11-14|1993-12-04|NONE|FOB|e slyly carefull +41351|678|79|3|32|50517.44|0.08|0.00|A|F|1993-10-15|1993-12-21|1993-10-31|NONE|FOB| blithely even deposi +41376|1413|53|1|18|23659.38|0.01|0.00|A|F|1992-12-23|1993-01-28|1992-12-29|COLLECT COD|AIR|egular ideas are alongside of +41376|74|25|2|47|45781.29|0.05|0.00|A|F|1993-01-06|1993-03-08|1993-01-28|TAKE BACK RETURN|TRUCK|ronic deposits. carefully pending the +41376|1887|17|3|44|78710.72|0.08|0.05|A|F|1993-01-06|1993-02-08|1993-01-26|NONE|RAIL| furiously ironic ins +41376|1307|84|4|19|22957.70|0.06|0.00|A|F|1993-01-20|1993-02-10|1993-02-16|COLLECT COD|TRUCK|ronic, bold theodolites. sly +41376|1775|18|5|8|13414.16|0.10|0.04|R|F|1992-12-23|1993-03-03|1992-12-26|DELIVER IN PERSON|TRUCK| quietly sly packages. quickly regular +41377|1364|3|1|37|46818.32|0.03|0.05|N|O|1996-03-04|1996-03-10|1996-03-31|NONE|RAIL|its. quickly final +41378|1308|9|1|7|8465.10|0.02|0.07|A|F|1992-11-26|1992-12-02|1992-12-09|COLLECT COD|MAIL| slyly asymptotes. unusual +41378|1691|74|2|10|15926.90|0.03|0.08|A|F|1993-01-18|1992-12-28|1993-02-03|TAKE BACK RETURN|AIR|ents integrate carefully according to the f +41378|1545|86|3|8|11572.32|0.07|0.08|A|F|1992-11-10|1992-12-01|1992-11-30|TAKE BACK RETURN|TRUCK|sits among the even, pending acco +41378|241|42|4|48|54779.52|0.03|0.05|R|F|1992-12-09|1993-01-13|1992-12-22|DELIVER IN PERSON|TRUCK|riously even theo +41379|335|64|1|33|40765.89|0.04|0.01|R|F|1993-04-04|1993-04-24|1993-04-29|COLLECT COD|AIR|times final requests nag carefully; f +41379|1213|25|2|30|33426.30|0.07|0.01|R|F|1993-03-16|1993-04-29|1993-04-01|TAKE BACK RETURN|TRUCK|r accounts. special packages sol +41379|250|5|3|5|5751.25|0.03|0.08|A|F|1993-03-27|1993-04-04|1993-03-31|COLLECT COD|MAIL|e; furiousl +41379|1097|68|4|45|44914.05|0.00|0.05|R|F|1993-04-29|1993-04-16|1993-05-08|COLLECT COD|SHIP|althy instructions around the final re +41379|1303|80|5|30|36129.00|0.05|0.08|A|F|1993-05-16|1993-04-27|1993-06-15|TAKE BACK RETURN|RAIL|ously blithely i +41379|1311|12|6|10|12123.10|0.00|0.05|R|F|1993-04-22|1993-04-01|1993-05-06|NONE|RAIL|ly. slyly ironic requ +41379|1668|69|7|30|47089.80|0.01|0.04|R|F|1993-04-18|1993-04-16|1993-04-19|DELIVER IN PERSON|FOB|fully final dependenc +41380|1892|93|1|6|10763.34|0.10|0.02|N|O|1998-05-31|1998-07-02|1998-06-24|DELIVER IN PERSON|TRUCK|lar requests haggle across the expre +41380|1032|38|2|41|38254.23|0.06|0.06|N|O|1998-07-20|1998-06-29|1998-08-09|NONE|FOB|blithely bold foxes. ironic, +41380|747|12|3|8|13181.92|0.07|0.04|N|O|1998-08-20|1998-06-06|1998-09-06|NONE|RAIL|ular requests +41380|1985|74|4|44|83027.12|0.09|0.00|N|O|1998-06-06|1998-06-23|1998-06-07|DELIVER IN PERSON|REG AIR|nic theodolites. +41380|1284|59|5|5|5926.40|0.01|0.01|N|O|1998-07-05|1998-07-16|1998-07-11|DELIVER IN PERSON|RAIL|ly regular theodolites. special, regular +41380|1357|72|6|36|45300.60|0.01|0.03|N|O|1998-06-13|1998-06-05|1998-06-17|COLLECT COD|RAIL|al requests. acc +41381|184|37|1|1|1084.18|0.09|0.02|N|O|1996-02-22|1996-03-27|1996-03-02|COLLECT COD|RAIL|ns are care +41382|1506|47|1|44|61930.00|0.09|0.06|N|O|1997-11-29|1997-12-20|1997-12-07|COLLECT COD|TRUCK|ronic pinto beans sleep. even, special +41383|204|5|1|18|19875.60|0.01|0.07|A|F|1993-08-01|1993-07-19|1993-08-18|DELIVER IN PERSON|AIR|after the carefully regular orb +41383|858|92|2|50|87942.50|0.06|0.00|R|F|1993-06-15|1993-06-13|1993-07-04|COLLECT COD|FOB|heodolites sleep across th +41383|25|26|3|14|12950.28|0.03|0.07|R|F|1993-06-15|1993-07-26|1993-06-16|TAKE BACK RETURN|AIR|ts? slyly special deposits use carefu +41408|690|84|1|24|38176.56|0.07|0.06|N|O|1995-12-09|1995-10-26|1996-01-01|COLLECT COD|FOB|horses. regular instru +41408|611|74|2|15|22674.15|0.06|0.07|N|O|1995-11-03|1995-11-01|1995-11-07|COLLECT COD|FOB|instructions nag quickly +41408|854|54|3|46|80723.10|0.02|0.08|N|O|1995-12-06|1995-10-09|1996-01-03|TAKE BACK RETURN|REG AIR|ress, regul +41408|518|9|4|5|7092.55|0.09|0.00|N|O|1995-10-03|1995-11-07|1995-10-18|TAKE BACK RETURN|SHIP|jole carefu +41408|1198|35|5|9|9892.71|0.06|0.07|N|O|1995-10-26|1995-09-28|1995-11-01|TAKE BACK RETURN|TRUCK|ly final br +41408|530|21|6|35|50068.55|0.00|0.02|N|O|1995-09-02|1995-10-08|1995-10-02|COLLECT COD|AIR|accounts. b +41408|1664|88|7|4|6262.64|0.09|0.05|N|O|1995-12-07|1995-10-22|1995-12-27|NONE|MAIL|ies. furio +41409|1432|72|1|7|9334.01|0.06|0.02|N|O|1995-10-05|1995-10-03|1995-11-02|COLLECT COD|SHIP| ironic instructions use ac +41409|1812|13|2|17|29134.77|0.10|0.07|N|O|1995-10-27|1995-10-16|1995-11-07|TAKE BACK RETURN|MAIL| excuses sleep regular pinto beans +41409|769|34|3|34|56771.84|0.00|0.06|N|O|1995-08-31|1995-09-28|1995-09-12|TAKE BACK RETURN|RAIL|usual ideas. +41409|322|79|4|4|4889.28|0.08|0.03|N|O|1995-09-13|1995-10-03|1995-10-06|DELIVER IN PERSON|TRUCK|efully among the special +41409|8|34|5|32|29056.00|0.00|0.00|N|O|1995-11-15|1995-09-09|1995-11-23|DELIVER IN PERSON|FOB|r ideas. final accounts sleep fluffily a +41409|697|91|6|22|35149.18|0.02|0.08|N|O|1995-10-17|1995-09-14|1995-11-08|NONE|RAIL|ng packages wake quickly ironic accounts +41409|460|48|7|25|34011.50|0.07|0.02|N|O|1995-08-12|1995-08-22|1995-09-11|NONE|TRUCK|r asymptotes nag carefully. carefully +41410|463|64|1|1|1363.46|0.02|0.05|A|F|1992-06-17|1992-06-27|1992-07-15|TAKE BACK RETURN|MAIL|ges; carefully even +41411|1439|79|1|26|34851.18|0.02|0.06|N|O|1996-01-27|1995-12-07|1996-02-10|NONE|MAIL|ccounts against the furiousl +41411|1064|70|2|38|36672.28|0.07|0.03|N|O|1995-10-16|1995-12-27|1995-10-17|NONE|TRUCK|hely ironic dependencies +41412|654|86|1|36|55967.40|0.10|0.01|A|F|1994-10-22|1994-11-30|1994-11-12|DELIVER IN PERSON|FOB|l deposits. pinto +41412|1056|57|2|37|35410.85|0.09|0.00|R|F|1994-11-13|1994-11-01|1994-11-28|DELIVER IN PERSON|SHIP|special accounts. special, reg +41412|1696|20|3|43|68700.67|0.01|0.00|R|F|1994-12-10|1994-10-21|1994-12-22|NONE|FOB|ly. slyly bold decoys wake +41413|1986|75|1|8|15103.84|0.06|0.02|N|O|1996-02-05|1996-01-08|1996-02-19|COLLECT COD|TRUCK|le theodolite +41413|1476|55|2|27|37191.69|0.01|0.08|N|O|1995-11-19|1996-01-01|1995-12-13|COLLECT COD|RAIL|rly bold deposits nag quickly. slyly reg +41413|502|33|3|44|61710.00|0.08|0.00|N|O|1996-03-15|1995-12-25|1996-03-18|COLLECT COD|RAIL|ess decoys kindle slyly. carefully careful +41413|402|90|4|33|42979.20|0.10|0.04|N|O|1996-03-15|1996-02-06|1996-03-29|TAKE BACK RETURN|TRUCK|t the requests wake fur +41413|163|64|5|4|4252.64|0.05|0.02|N|O|1995-11-30|1995-12-18|1995-12-06|NONE|SHIP| pearls boost. pack +41413|1736|63|6|13|21290.49|0.01|0.01|N|O|1995-12-21|1996-01-11|1996-01-08|DELIVER IN PERSON|TRUCK|ously against the quickly regular dep +41413|577|78|7|2|2955.14|0.06|0.07|N|O|1996-01-28|1996-02-01|1996-01-30|TAKE BACK RETURN|SHIP| accounts. +41414|94|70|1|27|26840.43|0.01|0.05|R|F|1993-08-04|1993-08-01|1993-08-17|TAKE BACK RETURN|AIR| unusual instructions. ev +41415|46|22|1|45|42571.80|0.09|0.08|A|F|1994-12-14|1995-01-07|1994-12-17|NONE|FOB|e furiously ironic dolphins boost a +41415|514|45|2|39|55165.89|0.04|0.07|R|F|1995-02-02|1995-02-02|1995-03-04|DELIVER IN PERSON|AIR|ts affix. even foxes sleep +41415|1776|19|3|43|72144.11|0.07|0.05|A|F|1995-02-17|1994-12-15|1995-02-19|DELIVER IN PERSON|SHIP|gifts play regular, speci +41415|187|40|4|46|50010.28|0.02|0.07|A|F|1994-12-07|1994-12-23|1994-12-11|DELIVER IN PERSON|AIR|rint carefully! bold, ironic exc +41415|1405|6|5|16|20902.40|0.03|0.04|R|F|1995-01-27|1994-12-26|1995-02-11|DELIVER IN PERSON|TRUCK|s. blithely unusual deposits boost ironi +41415|2|53|6|40|36080.00|0.06|0.06|A|F|1994-12-10|1995-02-08|1994-12-14|COLLECT COD|REG AIR|nent packages instead of the furiously +41440|1496|75|1|14|19564.86|0.06|0.02|R|F|1994-11-03|1994-12-07|1994-11-05|TAKE BACK RETURN|FOB|ckages detect carefully regular requests. +41440|53|29|2|15|14295.75|0.04|0.08|R|F|1994-11-22|1994-10-30|1994-12-19|COLLECT COD|TRUCK| special package +41440|1911|100|3|2|3625.82|0.03|0.03|R|F|1994-10-15|1994-11-06|1994-10-18|TAKE BACK RETURN|SHIP|nag about the ironically express ideas +41440|754|55|4|43|71154.25|0.04|0.04|R|F|1994-10-08|1994-11-22|1994-10-10|NONE|MAIL|sts wake. unusual platelets ar +41440|395|52|5|44|56997.16|0.03|0.01|R|F|1994-10-07|1994-12-20|1994-10-25|COLLECT COD|AIR|the slyly unusual accounts. blithely +41441|1185|94|1|20|21723.60|0.00|0.03|A|F|1992-05-24|1992-04-03|1992-06-10|TAKE BACK RETURN|TRUCK|l accounts detect carefully al +41441|1035|71|2|35|32761.05|0.05|0.07|R|F|1992-05-20|1992-03-20|1992-06-16|COLLECT COD|REG AIR|. quickly +41441|474|4|3|11|15119.17|0.04|0.05|A|F|1992-02-28|1992-03-27|1992-03-20|DELIVER IN PERSON|FOB|are furiously regular requests. +41442|1732|59|1|26|42476.98|0.08|0.01|R|F|1994-06-22|1994-07-23|1994-06-24|TAKE BACK RETURN|MAIL|sly unusual sheaves. regular inst +41442|597|98|2|26|38937.34|0.07|0.07|A|F|1994-07-07|1994-07-05|1994-07-11|NONE|REG AIR|ges. slyly ironic accounts promise slow pa +41442|1367|68|3|33|41855.88|0.07|0.07|A|F|1994-07-15|1994-06-13|1994-07-21|TAKE BACK RETURN|FOB|ke carefull +41443|453|41|1|7|9474.15|0.06|0.02|N|O|1996-05-02|1996-02-29|1996-05-15|NONE|FOB|leep after t +41443|766|63|2|27|45002.52|0.06|0.07|N|O|1996-03-11|1996-03-28|1996-03-27|COLLECT COD|SHIP|fully accord +41443|1863|50|3|2|3529.72|0.06|0.01|N|O|1996-03-19|1996-02-25|1996-03-30|COLLECT COD|FOB|cial requests use +41443|769|34|4|33|55102.08|0.07|0.01|N|O|1996-03-11|1996-03-17|1996-04-03|COLLECT COD|REG AIR|ounts wake carefully. final, fi +41444|1008|79|1|48|43632.00|0.02|0.08|N|O|1998-06-24|1998-09-06|1998-06-28|DELIVER IN PERSON|MAIL|posits. quickly even ac +41445|899|33|1|45|80995.05|0.05|0.05|N|O|1996-05-27|1996-04-16|1996-06-01|NONE|RAIL|ccounts. requests doze careful +41445|1439|40|2|39|52276.77|0.02|0.04|N|O|1996-05-19|1996-03-25|1996-06-18|TAKE BACK RETURN|REG AIR|onic instructions. furiously +41445|958|27|3|39|72499.05|0.04|0.01|N|O|1996-03-03|1996-03-11|1996-03-26|TAKE BACK RETURN|RAIL|riously ironic asymptotes after the quic +41445|1510|31|4|46|64929.46|0.02|0.00|N|O|1996-05-14|1996-05-03|1996-05-24|TAKE BACK RETURN|REG AIR| deposits. accounts +41445|1170|7|5|43|46060.31|0.01|0.05|N|O|1996-02-09|1996-04-13|1996-03-04|TAKE BACK RETURN|SHIP|uickly about the fi +41445|849|83|6|26|45495.84|0.01|0.02|N|O|1996-03-29|1996-03-25|1996-04-16|COLLECT COD|RAIL|d, regular +41445|1833|20|7|18|31226.94|0.10|0.08|N|O|1996-02-17|1996-04-27|1996-02-26|TAKE BACK RETURN|REG AIR|kly bold accounts wake furiously furious +41446|90|16|1|28|27722.52|0.03|0.05|R|F|1995-01-14|1995-01-30|1995-02-02|COLLECT COD|RAIL|theodolites. daringly bold accounts wake fi +41446|1451|30|2|10|13524.50|0.02|0.00|R|F|1994-11-04|1994-12-19|1994-11-14|NONE|AIR| pending accounts cajole +41446|317|2|3|45|54778.95|0.07|0.05|R|F|1994-11-10|1994-12-26|1994-11-18|NONE|AIR|among the evenly pendi +41447|153|80|1|11|11584.65|0.02|0.08|N|O|1997-06-11|1997-06-24|1997-06-24|TAKE BACK RETURN|SHIP|ven requests wake regularly again +41447|437|96|2|28|37448.04|0.05|0.06|N|O|1997-06-13|1997-06-27|1997-07-02|TAKE BACK RETURN|TRUCK|uickly. furiously even depend +41447|1191|92|3|40|43687.60|0.00|0.08|N|O|1997-06-28|1997-06-24|1997-07-07|COLLECT COD|FOB| ideas-- slyly regu +41472|398|99|1|1|1298.39|0.10|0.04|A|F|1993-04-01|1993-03-20|1993-04-10|DELIVER IN PERSON|REG AIR|y unusual mu +41472|1700|1|2|22|35237.40|0.03|0.01|R|F|1993-05-02|1993-04-10|1993-05-14|COLLECT COD|MAIL| furiously. deposits cajole special i +41472|1248|23|3|47|54014.28|0.01|0.03|R|F|1993-02-25|1993-02-28|1993-03-05|TAKE BACK RETURN|TRUCK|l requests after the slow req +41472|1354|93|4|35|43937.25|0.03|0.06|R|F|1993-03-01|1993-04-21|1993-03-21|NONE|MAIL|riously. furiou +41472|361|18|5|31|39102.16|0.06|0.02|R|F|1993-05-06|1993-04-01|1993-05-26|COLLECT COD|TRUCK|beans are. +41473|1728|55|1|21|34224.12|0.05|0.03|N|O|1997-12-08|1997-11-16|1997-12-25|NONE|REG AIR|equests. fluffily even deposits wake car +41473|435|65|2|7|9348.01|0.08|0.05|N|O|1998-01-06|1997-12-21|1998-01-22|TAKE BACK RETURN|RAIL|s. quiet, special depos +41474|729|94|1|30|48891.60|0.06|0.05|R|F|1994-06-24|1994-06-05|1994-07-19|NONE|TRUCK|the silent, regular pinto beans wake f +41474|1312|27|2|2|2426.62|0.07|0.06|R|F|1994-07-19|1994-06-09|1994-07-25|NONE|TRUCK| the furiously idle deposits. unusual i +41474|736|69|3|24|39281.52|0.04|0.03|R|F|1994-05-03|1994-06-30|1994-06-02|NONE|AIR|haggle above the carefully regular t +41474|445|75|4|38|51126.72|0.07|0.07|R|F|1994-05-12|1994-06-14|1994-05-13|COLLECT COD|RAIL|ke slyly; slyly pending co +41474|91|67|5|3|2973.27|0.06|0.08|A|F|1994-07-03|1994-06-26|1994-08-02|NONE|FOB|above the regular theo +41474|1443|83|6|22|29577.68|0.05|0.05|A|F|1994-06-02|1994-07-13|1994-06-26|NONE|RAIL|silent theodolites nag furiously +41475|1029|100|1|49|45570.98|0.10|0.00|N|O|1998-05-03|1998-06-24|1998-05-04|TAKE BACK RETURN|AIR|requests caj +41475|355|12|2|23|28873.05|0.09|0.04|N|O|1998-06-18|1998-07-10|1998-07-02|NONE|TRUCK|ns cajole quickly evenly regular e +41475|851|52|3|43|75329.55|0.10|0.02|N|O|1998-06-30|1998-06-15|1998-07-02|NONE|REG AIR|uriously above the reg +41475|586|17|4|23|34191.34|0.05|0.01|N|O|1998-07-28|1998-06-28|1998-08-05|DELIVER IN PERSON|RAIL| engage according to the blithely regu +41475|1590|91|5|23|34306.57|0.03|0.03|N|O|1998-07-08|1998-06-13|1998-07-25|TAKE BACK RETURN|MAIL|egular deposits after +41475|228|29|6|30|33846.60|0.10|0.07|N|O|1998-08-27|1998-07-10|1998-09-08|NONE|AIR|uriously along the even deposits +41476|1370|9|1|13|16527.81|0.08|0.07|R|F|1993-07-19|1993-08-26|1993-07-30|TAKE BACK RETURN|RAIL|yly. furiously special +41476|1544|45|2|32|46257.28|0.04|0.07|A|F|1993-08-17|1993-08-10|1993-09-11|COLLECT COD|MAIL|. carefully even requests integrate ca +41476|157|58|3|14|14800.10|0.06|0.05|R|F|1993-09-02|1993-07-20|1993-09-06|NONE|MAIL| among the +41476|1103|76|4|34|34139.40|0.00|0.02|A|F|1993-06-08|1993-08-06|1993-06-14|COLLECT COD|MAIL|ts haggle. c +41476|949|18|5|49|90647.06|0.08|0.06|A|F|1993-07-13|1993-07-27|1993-07-16|COLLECT COD|FOB|nic, unusual dependencies will hav +41477|600|61|1|6|9003.60|0.10|0.03|N|O|1998-06-17|1998-07-11|1998-06-24|DELIVER IN PERSON|AIR|lithely regular ex +41477|1196|5|2|29|31818.51|0.05|0.03|N|O|1998-08-15|1998-07-19|1998-09-06|COLLECT COD|REG AIR|s boost slyly regular ac +41477|1973|74|3|14|26249.58|0.00|0.06|N|O|1998-07-19|1998-07-06|1998-08-05|NONE|MAIL|ccounts. even requests around the fluffil +41477|684|47|4|5|7923.40|0.05|0.06|N|O|1998-05-03|1998-06-29|1998-05-29|TAKE BACK RETURN|FOB|onic multip +41478|26|52|1|16|14816.32|0.08|0.01|N|O|1997-02-13|1997-01-11|1997-02-17|NONE|RAIL| packages? carefully regular asy +41478|1663|87|2|8|12517.28|0.05|0.06|N|O|1997-02-25|1997-02-17|1997-03-14|DELIVER IN PERSON|SHIP|s boost slyly? blithely regular tithes wak +41479|1725|10|1|4|6506.88|0.08|0.02|A|F|1994-07-10|1994-06-12|1994-07-15|DELIVER IN PERSON|REG AIR|ng excuses. +41479|175|76|2|30|32255.10|0.06|0.08|A|F|1994-07-23|1994-06-07|1994-08-05|COLLECT COD|SHIP|silent ideas. +41504|1722|49|1|4|6494.88|0.10|0.02|R|F|1992-12-03|1993-01-23|1992-12-12|TAKE BACK RETURN|SHIP| regular dolphins thrash quickly. +41504|1238|50|2|3|3417.69|0.08|0.06|A|F|1993-02-03|1993-01-17|1993-02-19|DELIVER IN PERSON|AIR|ing to the +41504|1775|18|3|7|11737.39|0.06|0.00|R|F|1993-01-01|1992-12-17|1993-01-27|TAKE BACK RETURN|SHIP|eep above the furiously final reques +41504|769|2|4|32|53432.32|0.08|0.02|A|F|1993-01-11|1992-12-31|1993-01-22|NONE|MAIL|ress deposits us +41504|926|27|5|46|84038.32|0.00|0.00|A|F|1993-01-08|1992-12-21|1993-01-16|NONE|AIR|. excuses are quickly! dog +41504|279|7|6|4|4717.08|0.09|0.07|R|F|1992-11-22|1993-01-15|1992-12-03|TAKE BACK RETURN|MAIL|phs. final depe +41504|1321|98|7|29|35447.28|0.05|0.03|A|F|1993-01-28|1993-01-08|1993-02-14|COLLECT COD|TRUCK|ously even accounts among +41505|1555|96|1|32|46609.60|0.09|0.02|R|F|1993-08-16|1993-07-13|1993-08-19|COLLECT COD|MAIL|equests are blithely packages +41505|336|21|2|3|3708.99|0.05|0.08|R|F|1993-07-11|1993-07-03|1993-07-31|NONE|MAIL|deas engage slyly ironic reques +41505|243|98|3|42|48016.08|0.00|0.01|R|F|1993-07-23|1993-06-01|1993-07-31|COLLECT COD|SHIP|pinto beans cajole +41505|699|62|4|41|65587.29|0.10|0.01|A|F|1993-05-27|1993-06-27|1993-06-14|TAKE BACK RETURN|REG AIR|es mold furiously. regular ideas cajole a +41505|281|63|5|15|17719.20|0.00|0.05|A|F|1993-07-16|1993-07-10|1993-08-09|TAKE BACK RETURN|TRUCK|ng the car +41506|799|32|1|12|20397.48|0.02|0.03|N|O|1996-09-04|1996-10-28|1996-09-29|COLLECT COD|SHIP|. slyly ironic pack +41506|1559|80|2|45|65724.75|0.08|0.02|N|O|1996-11-12|1996-09-15|1996-11-13|DELIVER IN PERSON|AIR|ove the regular requests. final ins +41506|1583|24|3|19|28207.02|0.00|0.06|N|O|1996-10-26|1996-11-10|1996-11-13|COLLECT COD|MAIL|riously above the carefully final ide +41506|938|7|4|34|62523.62|0.01|0.04|N|O|1996-10-31|1996-10-20|1996-11-12|TAKE BACK RETURN|AIR| unusual, final p +41506|1590|11|5|5|7457.95|0.03|0.06|N|O|1996-10-13|1996-09-17|1996-10-23|NONE|MAIL|ts. special, eve +41506|1848|49|6|8|13998.72|0.02|0.01|N|O|1996-09-01|1996-11-01|1996-09-22|TAKE BACK RETURN|AIR|uriously ironic accounts sleep furiousl +41507|745|46|1|18|29623.32|0.04|0.08|A|F|1994-01-03|1994-01-23|1994-01-10|NONE|FOB| furiously slyly ironic +41508|931|66|1|36|65949.48|0.07|0.00|R|F|1993-11-24|1993-12-15|1993-12-07|COLLECT COD|TRUCK| carefully about the blithe +41508|964|67|2|9|16784.64|0.05|0.00|R|F|1994-01-04|1993-11-15|1994-01-15|NONE|TRUCK|its. blithely bold instruct +41508|1776|61|3|36|60399.72|0.04|0.02|A|F|1993-10-02|1993-12-09|1993-10-10|TAKE BACK RETURN|MAIL|e bold pin +41508|922|91|4|24|43750.08|0.03|0.04|A|F|1993-10-08|1993-11-28|1993-10-22|COLLECT COD|FOB| special ideas. carefully even pint +41508|1453|54|5|44|59595.80|0.02|0.08|R|F|1993-10-30|1993-11-07|1993-11-15|NONE|MAIL| furious ideas. silent theodolites cajole +41509|102|81|1|14|14029.40|0.08|0.03|R|F|1994-02-27|1994-01-25|1994-03-22|COLLECT COD|TRUCK|refully final deposits. sil +41509|1851|38|2|2|3505.70|0.04|0.00|A|F|1993-11-30|1994-01-01|1993-12-05|TAKE BACK RETURN|SHIP|n the requests. ideas +41509|1646|88|3|12|18571.68|0.02|0.05|A|F|1994-02-20|1994-01-06|1994-03-07|COLLECT COD|AIR|c platelets. +41510|1159|32|1|20|21203.00|0.08|0.00|A|F|1992-05-04|1992-04-21|1992-05-26|NONE|RAIL|e the furiously even Tires +41511|1797|98|1|19|32277.01|0.09|0.07|R|F|1994-11-14|1994-11-11|1994-12-14|TAKE BACK RETURN|RAIL|hely fluffily regu +41511|942|11|2|47|86618.18|0.03|0.05|A|F|1995-01-05|1994-12-14|1995-02-03|COLLECT COD|RAIL|he fluffily +41536|1071|7|1|27|26245.89|0.01|0.03|N|O|1996-12-13|1996-10-25|1996-12-26|COLLECT COD|SHIP|. regular, final packages haggle carefull +41536|1111|12|2|2|2024.22|0.08|0.01|N|O|1996-10-04|1996-12-03|1996-10-12|COLLECT COD|AIR|ests hang blithely expres +41536|1447|48|3|23|31014.12|0.02|0.00|N|O|1996-09-15|1996-10-07|1996-10-12|TAKE BACK RETURN|FOB|ironic request +41536|412|71|4|45|59058.45|0.00|0.03|N|O|1996-12-26|1996-11-03|1997-01-10|COLLECT COD|REG AIR|al deposits. permanently final depend +41536|1173|74|5|45|48337.65|0.09|0.07|N|O|1996-10-07|1996-10-07|1996-10-31|DELIVER IN PERSON|FOB| special, special packages above the expres +41536|1228|66|6|6|6775.32|0.06|0.02|N|O|1997-01-01|1996-10-12|1997-01-02|DELIVER IN PERSON|MAIL| slyly quiet, final pearls. accou +41536|714|15|7|30|48441.30|0.08|0.04|N|O|1996-11-02|1996-11-08|1996-11-07|DELIVER IN PERSON|MAIL|bold theodolites dazzle slyly express dep +41537|471|30|1|33|45258.51|0.06|0.03|N|O|1997-01-17|1997-01-12|1997-02-15|TAKE BACK RETURN|MAIL|furiously ironic requests. slyly unusu +41537|1035|41|2|29|27144.87|0.05|0.04|N|O|1997-03-06|1996-12-22|1997-03-31|NONE|AIR|cajole quickly about the regular, final ins +41537|459|60|3|5|6797.25|0.00|0.05|N|O|1997-02-08|1997-01-19|1997-02-11|COLLECT COD|FOB|se carefully. furiously bold accounts wa +41537|1492|10|4|9|12541.41|0.01|0.02|N|O|1997-02-27|1996-12-16|1997-03-06|NONE|FOB|nusual, even requests +41537|724|25|5|43|69862.96|0.05|0.05|N|O|1996-11-14|1997-01-21|1996-11-27|COLLECT COD|RAIL|egular deposits. carefully unusual foxe +41537|1984|29|6|4|7543.92|0.09|0.08|N|O|1997-03-02|1996-12-19|1997-03-27|COLLECT COD|MAIL|ding warthogs use quick +41538|1258|33|1|40|46370.00|0.07|0.05|N|O|1996-12-19|1996-11-24|1997-01-14|NONE|RAIL|. never regular orbits sleep among the +41539|776|73|1|36|60363.72|0.10|0.05|N|O|1995-08-12|1995-07-15|1995-09-04|TAKE BACK RETURN|FOB| above the quickly bo +41539|797|30|2|43|73004.97|0.09|0.02|N|O|1995-08-06|1995-06-21|1995-08-20|COLLECT COD|MAIL|re blithely carefully sil +41539|757|90|3|26|43101.50|0.01|0.07|N|O|1995-08-06|1995-06-23|1995-08-16|TAKE BACK RETURN|REG AIR|e along the slyly regular dependenc +41539|1379|56|4|36|46093.32|0.04|0.05|A|F|1995-05-26|1995-07-28|1995-06-14|COLLECT COD|SHIP|he slyly even accoun +41539|1041|42|5|24|22608.96|0.10|0.01|N|O|1995-07-03|1995-06-20|1995-07-26|NONE|FOB|s. even braids run +41539|1686|28|6|15|23815.20|0.10|0.02|N|O|1995-07-24|1995-06-17|1995-08-22|TAKE BACK RETURN|TRUCK|ar requests according to the re +41540|1596|37|1|29|43430.11|0.08|0.04|N|O|1997-02-08|1997-02-05|1997-03-06|DELIVER IN PERSON|MAIL|ons use blithely. ideas hinder slyl +41540|505|36|2|44|61842.00|0.04|0.05|N|O|1997-03-17|1997-03-20|1997-04-03|COLLECT COD|REG AIR|ress depos +41540|55|31|3|30|28651.50|0.02|0.08|N|O|1997-02-20|1997-03-07|1997-03-21|COLLECT COD|RAIL|ly according to the slyly close dolphin +41540|1612|13|4|45|68112.45|0.04|0.02|N|O|1997-01-16|1997-02-06|1997-02-15|COLLECT COD|MAIL|d the furiously special reques +41540|1519|40|5|33|46876.83|0.10|0.05|N|O|1997-01-31|1997-01-30|1997-02-05|TAKE BACK RETURN|TRUCK|lithely around the slyly regular excuses +41540|384|41|6|3|3853.14|0.09|0.08|N|O|1997-02-02|1997-03-15|1997-02-23|COLLECT COD|SHIP|among the furiously regular theodolites. +41540|834|35|7|18|31226.94|0.08|0.06|N|O|1997-03-29|1997-02-05|1997-04-11|NONE|RAIL|across the quickly silent deposits cajole c +41541|96|97|1|27|26894.43|0.03|0.06|N|O|1997-02-27|1997-02-08|1997-03-11|DELIVER IN PERSON|MAIL|the slyly p +41541|1834|21|2|43|74640.69|0.07|0.02|N|O|1996-12-08|1997-02-13|1996-12-25|DELIVER IN PERSON|RAIL|ly pending +41541|1104|41|3|40|40204.00|0.05|0.05|N|O|1996-12-24|1997-02-10|1997-01-03|DELIVER IN PERSON|TRUCK|rate fluffily abov +41541|970|71|4|7|13096.79|0.01|0.04|N|O|1997-02-08|1997-01-30|1997-03-06|TAKE BACK RETURN|SHIP| blithely. blithely expres +41541|1480|98|5|43|59403.64|0.08|0.05|N|O|1996-12-15|1997-02-14|1996-12-31|TAKE BACK RETURN|FOB|tructions sle +41542|774|7|1|25|41869.25|0.03|0.07|R|F|1994-12-28|1994-11-08|1995-01-12|COLLECT COD|REG AIR|y regular deposits wake acr +41542|314|71|2|23|27929.13|0.04|0.05|A|F|1995-01-22|1994-11-09|1995-02-14|DELIVER IN PERSON|AIR|s dolphins are. c +41542|1009|80|3|21|19110.00|0.03|0.01|A|F|1994-09-28|1994-12-21|1994-10-02|TAKE BACK RETURN|SHIP|riously. ironic requests nag blithely +41542|1658|59|4|11|17156.15|0.04|0.01|A|F|1994-12-20|1994-12-09|1994-12-31|TAKE BACK RETURN|AIR|ggle blithely blithely final +41543|475|76|1|16|22007.52|0.04|0.01|R|F|1994-02-20|1994-03-14|1994-02-25|TAKE BACK RETURN|TRUCK|ts nag sly +41543|743|40|2|27|44380.98|0.02|0.01|A|F|1994-05-24|1994-04-22|1994-06-10|COLLECT COD|RAIL| platelets. bravel +41543|441|29|3|41|54999.04|0.03|0.06|A|F|1994-03-06|1994-05-01|1994-03-25|TAKE BACK RETURN|REG AIR|ornis believe carefully. blithely pending p +41543|851|18|4|42|73577.70|0.00|0.07|R|F|1994-02-10|1994-03-10|1994-02-16|TAKE BACK RETURN|TRUCK|s. regular, even warthogs cajole c +41543|1667|9|5|20|31373.20|0.04|0.02|A|F|1994-04-10|1994-04-03|1994-04-29|TAKE BACK RETURN|REG AIR|nes boost busily furiously pending idea +41568|1064|65|1|7|6755.42|0.05|0.06|R|F|1993-08-01|1993-08-04|1993-08-13|NONE|MAIL|use quickly n +41569|1413|31|1|3|3943.23|0.04|0.04|A|F|1993-10-24|1993-09-17|1993-11-16|DELIVER IN PERSON|FOB| express pinto beans wake along +41569|1082|83|2|40|39323.20|0.08|0.04|A|F|1993-10-03|1993-09-22|1993-10-11|NONE|AIR| final multi +41569|1865|9|3|16|28269.76|0.04|0.05|A|F|1993-11-15|1993-08-28|1993-12-15|COLLECT COD|SHIP|nal pinto beans. blithely bold ideas +41569|1108|17|4|34|34309.40|0.07|0.04|R|F|1993-11-16|1993-09-06|1993-12-13|NONE|MAIL|uctions are. blithely pending requests +41569|325|10|5|41|50238.12|0.00|0.01|R|F|1993-08-18|1993-10-11|1993-09-14|DELIVER IN PERSON|AIR|eposits about the c +41569|261|62|6|1|1161.26|0.01|0.05|R|F|1993-09-23|1993-10-14|1993-10-21|TAKE BACK RETURN|MAIL|s affix carefully carefully special c +41569|1079|85|7|26|25481.82|0.01|0.06|A|F|1993-08-01|1993-09-22|1993-08-26|DELIVER IN PERSON|RAIL|eodolites. slyly eve +41570|837|37|1|42|72988.86|0.01|0.06|A|F|1994-02-23|1994-01-11|1994-03-01|DELIVER IN PERSON|FOB|refully regular accounts nag slyly +41570|282|10|2|34|40197.52|0.03|0.00|R|F|1994-03-10|1994-02-10|1994-03-12|DELIVER IN PERSON|AIR| unusual instructions are +41570|1517|58|3|22|31207.22|0.06|0.03|R|F|1994-03-27|1994-01-10|1994-04-05|COLLECT COD|MAIL| final theodolites; acco +41570|706|7|4|21|33740.70|0.09|0.05|R|F|1993-12-09|1994-02-22|1993-12-27|NONE|REG AIR|ithely ironic excuses! +41570|933|36|5|5|9169.65|0.02|0.06|R|F|1994-03-21|1994-02-08|1994-04-04|NONE|RAIL|fluffily even packages wake about the bold +41570|203|31|6|22|24270.40|0.07|0.01|A|F|1994-02-13|1994-01-29|1994-03-07|COLLECT COD|TRUCK|lithely final accounts. careful +41571|1725|26|1|28|45548.16|0.03|0.01|R|F|1995-06-13|1995-08-13|1995-06-15|DELIVER IN PERSON|TRUCK| regular courts integrate regularly +41571|1364|3|2|41|51879.76|0.05|0.06|N|O|1995-07-26|1995-07-22|1995-07-27|TAKE BACK RETURN|SHIP| carefully between the blithely iro +41571|461|49|3|44|59904.24|0.08|0.06|N|O|1995-07-12|1995-08-17|1995-07-30|NONE|SHIP|y final excuses. furiously s +41571|1363|40|4|11|13907.96|0.07|0.05|N|O|1995-09-19|1995-07-17|1995-10-16|DELIVER IN PERSON|MAIL| bold instruction +41571|848|15|5|23|40223.32|0.02|0.01|N|O|1995-07-31|1995-08-24|1995-08-09|COLLECT COD|FOB|pendencies according to the final, ex +41572|270|25|1|29|33937.83|0.06|0.07|N|O|1997-04-24|1997-05-15|1997-05-16|COLLECT COD|TRUCK|st carefully +41572|1578|59|2|39|57703.23|0.06|0.04|N|O|1997-04-27|1997-05-18|1997-05-14|TAKE BACK RETURN|RAIL|lently according to the excus +41572|1692|93|3|21|33467.49|0.03|0.08|N|O|1997-03-18|1997-04-13|1997-03-28|TAKE BACK RETURN|TRUCK|t furiously carefull +41572|1966|55|4|17|31755.32|0.06|0.06|N|O|1997-05-20|1997-05-08|1997-05-23|COLLECT COD|RAIL|along the slyly +41572|727|24|5|33|53714.76|0.06|0.06|N|O|1997-03-21|1997-05-21|1997-04-06|NONE|REG AIR|nt deposits cajole across the bl +41572|820|87|6|9|15487.38|0.10|0.03|N|O|1997-04-06|1997-05-17|1997-04-27|DELIVER IN PERSON|AIR|ons after the s +41573|1405|84|1|19|24821.60|0.02|0.00|N|O|1996-03-15|1996-04-21|1996-04-02|COLLECT COD|TRUCK|ckly around the ironic accounts. furiously +41573|1693|17|2|25|39867.25|0.01|0.02|N|O|1996-04-04|1996-05-07|1996-05-02|COLLECT COD|FOB|he express accounts. acco +41573|999|100|3|18|34199.82|0.06|0.07|N|O|1996-05-10|1996-05-17|1996-05-30|NONE|FOB|courts above the +41573|1001|37|4|23|20746.00|0.00|0.01|N|O|1996-06-10|1996-05-23|1996-07-10|DELIVER IN PERSON|AIR|ously. slyl +41573|1712|39|5|2|3227.42|0.10|0.07|N|O|1996-03-13|1996-04-29|1996-03-19|DELIVER IN PERSON|RAIL|ar requests. eve +41573|928|31|6|2|3657.84|0.08|0.02|N|O|1996-06-21|1996-05-14|1996-06-24|COLLECT COD|TRUCK|ideas. ironic, +41573|1935|68|7|46|84498.78|0.09|0.02|N|O|1996-06-15|1996-04-26|1996-07-13|DELIVER IN PERSON|RAIL|t fluffily notornis +41574|1093|99|1|36|35787.24|0.07|0.02|A|F|1994-01-11|1993-11-07|1994-01-16|DELIVER IN PERSON|AIR|p stealthily ironic packa +41574|1202|14|2|6|6619.20|0.09|0.01|A|F|1993-12-15|1993-12-03|1993-12-18|NONE|RAIL|endencies must h +41574|1025|26|3|9|8334.18|0.01|0.05|R|F|1993-12-16|1993-10-27|1993-12-20|TAKE BACK RETURN|TRUCK|ly bold pa +41574|1546|87|4|32|46321.28|0.07|0.03|R|F|1993-09-29|1993-11-20|1993-10-29|DELIVER IN PERSON|FOB|s nag furiously regular accou +41574|802|3|5|12|20433.60|0.03|0.00|R|F|1993-11-05|1993-12-09|1993-11-30|TAKE BACK RETURN|FOB|mptotes hinder. quickl +41574|1598|19|6|17|25493.03|0.08|0.00|A|F|1993-09-22|1993-12-01|1993-10-18|NONE|RAIL|c deposits wake fluffily slyly express +41574|109|36|7|31|31282.10|0.01|0.02|R|F|1994-01-15|1993-12-13|1994-02-06|DELIVER IN PERSON|AIR|e blithely pendin +41575|1574|15|1|1|1475.57|0.05|0.03|N|O|1997-10-02|1997-09-21|1997-10-05|COLLECT COD|RAIL|ptotes. special foxes are furiously. quic +41575|1765|8|2|24|40002.24|0.06|0.03|N|O|1997-11-15|1997-10-02|1997-12-11|TAKE BACK RETURN|SHIP|ts. unusual, pendin +41575|1078|84|3|12|11748.84|0.01|0.07|N|O|1997-09-24|1997-10-06|1997-10-04|NONE|REG AIR|lyly ironic requests. pending, final +41575|692|55|4|28|44595.32|0.05|0.01|N|O|1997-09-08|1997-09-19|1997-09-21|NONE|AIR|efully. foxes +41575|966|69|5|41|76545.36|0.07|0.07|N|O|1997-11-08|1997-09-25|1997-11-21|DELIVER IN PERSON|REG AIR|he carefully regular epitaphs haggle abou +41575|1066|67|6|42|40616.52|0.07|0.06|N|O|1997-11-26|1997-10-07|1997-12-24|COLLECT COD|AIR| foxes x-ray furiously +41600|1130|3|1|33|34027.29|0.08|0.03|N|O|1997-07-05|1997-05-13|1997-07-08|TAKE BACK RETURN|RAIL|xpress requests! regular packages ca +41600|1025|26|2|11|10186.22|0.05|0.08|N|O|1997-06-01|1997-05-30|1997-06-20|TAKE BACK RETURN|TRUCK| furiously carefully pending reques +41600|1901|90|3|22|39663.80|0.05|0.02|N|O|1997-07-01|1997-06-27|1997-07-10|DELIVER IN PERSON|RAIL|ways final packages. fluffily f +41600|1239|77|4|26|29645.98|0.00|0.05|N|O|1997-07-23|1997-06-01|1997-08-09|COLLECT COD|MAIL|al frays hang furio +41600|1943|32|5|23|42433.62|0.06|0.05|N|O|1997-05-28|1997-05-21|1997-05-29|NONE|SHIP|ckly ironic +41600|1550|31|6|27|39191.85|0.04|0.02|N|O|1997-07-04|1997-07-03|1997-08-02|TAKE BACK RETURN|SHIP|jole furiously. regular reque +41601|1316|55|1|43|52344.33|0.04|0.06|R|F|1994-11-23|1994-12-10|1994-12-23|NONE|REG AIR|al deposits around the blit +41601|1192|65|2|46|50286.74|0.10|0.07|R|F|1994-12-05|1994-11-12|1994-12-26|DELIVER IN PERSON|SHIP|xpress, pe +41602|530|91|1|42|60082.26|0.06|0.05|N|O|1995-09-21|1995-09-21|1995-10-20|TAKE BACK RETURN|MAIL|ut the final platelets. idly reg +41603|1906|7|1|26|47005.40|0.08|0.00|N|O|1997-11-04|1997-09-19|1997-11-22|NONE|AIR|ions. asymptotes are furio +41603|1798|83|2|15|25496.85|0.09|0.01|N|O|1997-08-18|1997-10-02|1997-08-30|DELIVER IN PERSON|TRUCK|ests serve slyly. fluffily regula +41603|1309|48|3|15|18154.50|0.01|0.03|N|O|1997-08-04|1997-10-17|1997-08-06|COLLECT COD|TRUCK|ve carefully even theo +41604|984|53|1|19|35814.62|0.10|0.07|A|F|1994-03-06|1994-04-23|1994-03-19|COLLECT COD|MAIL|cuses wake carefull +41605|1693|17|1|20|31893.80|0.00|0.06|A|F|1994-02-26|1994-03-25|1994-03-06|TAKE BACK RETURN|RAIL|ly pending instructions. fur +41605|1449|67|2|11|14854.84|0.08|0.04|R|F|1994-03-24|1994-03-19|1994-03-31|TAKE BACK RETURN|AIR| accounts are slyly final, +41606|1523|4|1|28|39886.56|0.01|0.07|A|F|1994-10-11|1994-08-19|1994-11-04|COLLECT COD|SHIP|riously fur +41606|365|22|2|45|56941.20|0.10|0.08|R|F|1994-08-20|1994-09-18|1994-09-07|COLLECT COD|REG AIR|h regularly pending ideas. furiously +41606|351|8|3|46|57562.10|0.01|0.00|R|F|1994-10-06|1994-09-19|1994-10-20|TAKE BACK RETURN|FOB|s accounts alongside of the carefully si +41606|138|65|4|5|5190.65|0.06|0.03|A|F|1994-10-12|1994-08-27|1994-10-15|DELIVER IN PERSON|MAIL|. slyly bold dol +41607|20|21|1|29|26680.58|0.04|0.05|A|F|1995-01-20|1995-01-22|1995-02-01|NONE|MAIL|elets. quickly final instructions wake f +41607|219|74|2|5|5596.05|0.02|0.02|A|F|1995-02-11|1995-03-14|1995-03-03|TAKE BACK RETURN|REG AIR|packages sleep fur +41607|698|99|3|32|51158.08|0.08|0.07|A|F|1995-02-24|1995-03-19|1995-02-28|NONE|AIR|lar packages. r +41607|1245|83|4|3|3438.72|0.02|0.07|A|F|1994-12-30|1995-03-17|1995-01-13|COLLECT COD|AIR|. carefully express +41607|378|63|5|26|33237.62|0.08|0.06|R|F|1994-12-21|1995-02-27|1994-12-31|COLLECT COD|RAIL|g the silent deposits wake f +41607|1333|72|6|12|14811.96|0.08|0.01|R|F|1995-03-03|1995-01-25|1995-03-06|DELIVER IN PERSON|RAIL|lly unusual theodolites haggle blithe +41607|696|90|7|39|62270.91|0.07|0.08|R|F|1995-01-25|1995-02-22|1995-02-01|TAKE BACK RETURN|MAIL|ckages wake furiously blithely +41632|230|58|1|33|37297.59|0.01|0.05|R|F|1994-03-06|1994-03-02|1994-03-07|NONE|TRUCK|y pending deposits wake slyly quickly f +41632|1854|98|2|48|84280.80|0.00|0.05|R|F|1994-01-19|1994-02-24|1994-01-23|TAKE BACK RETURN|FOB|pecial pearls wake quickly regular account +41632|782|79|3|12|20193.36|0.05|0.07|R|F|1994-03-17|1994-01-03|1994-04-03|TAKE BACK RETURN|SHIP| carefully regular +41632|1020|21|4|15|13815.30|0.03|0.08|A|F|1994-03-17|1994-01-10|1994-04-06|COLLECT COD|RAIL|ake slyly blithely final requests. +41633|1977|10|1|7|13152.79|0.08|0.06|R|F|1994-02-11|1994-01-21|1994-02-27|DELIVER IN PERSON|MAIL| across the sl +41633|1821|22|2|36|62021.52|0.02|0.05|R|F|1993-11-29|1994-01-27|1993-12-19|TAKE BACK RETURN|FOB|regular attainments. blithely ironic +41633|1700|1|3|7|11211.90|0.00|0.08|A|F|1993-12-09|1993-12-15|1993-12-29|TAKE BACK RETURN|AIR|wake quickly blit +41633|817|84|4|2|3435.62|0.02|0.00|R|F|1993-12-24|1993-12-25|1994-01-01|COLLECT COD|FOB| beans. esca +41633|807|7|5|2|3415.60|0.09|0.02|A|F|1993-12-25|1994-02-02|1994-01-11|COLLECT COD|FOB| detect among the re +41633|799|64|6|41|69691.39|0.08|0.00|R|F|1993-12-28|1993-12-26|1994-01-21|NONE|RAIL|nts breach furiousl +41634|376|77|1|45|57436.65|0.04|0.07|R|F|1993-02-09|1993-02-15|1993-03-11|DELIVER IN PERSON|RAIL|furiously ironic ideas poach quickly. blith +41634|396|25|2|1|1296.39|0.03|0.03|R|F|1993-03-30|1993-02-27|1993-04-28|TAKE BACK RETURN|RAIL|e the regular, unusual asymptotes. deposits +41634|463|93|3|11|14998.06|0.00|0.04|R|F|1993-02-06|1993-03-04|1993-02-11|COLLECT COD|TRUCK|luffily after th +41634|854|21|4|26|45626.10|0.02|0.05|A|F|1992-12-21|1993-02-20|1992-12-25|NONE|RAIL| beans. carefully ironic packages +41634|1664|88|5|39|61060.74|0.05|0.02|A|F|1993-01-10|1993-03-02|1993-01-20|TAKE BACK RETURN|FOB|lithely regular excu +41634|635|67|6|16|24570.08|0.09|0.05|A|F|1993-03-09|1993-03-05|1993-03-16|DELIVER IN PERSON|AIR|furiously carefully bold n +41634|169|96|7|24|25659.84|0.05|0.08|R|F|1992-12-15|1993-01-20|1993-01-11|TAKE BACK RETURN|MAIL| decoys. express depths haggle quickly +41635|1611|94|1|28|42353.08|0.01|0.02|A|F|1993-11-01|1993-10-15|1993-11-07|NONE|RAIL|ckages cajole quickly across the +41635|1575|96|2|47|69398.79|0.06|0.06|A|F|1993-10-11|1993-10-29|1993-11-06|TAKE BACK RETURN|RAIL|y. even, ev +41636|655|56|1|37|57559.05|0.03|0.03|R|F|1994-11-23|1994-10-08|1994-12-03|COLLECT COD|MAIL|s! instructions use carefully +41636|758|91|2|26|43127.50|0.09|0.04|A|F|1994-11-05|1994-10-26|1994-11-28|DELIVER IN PERSON|REG AIR|heodolites haggle blith +41636|1605|6|3|36|54237.60|0.02|0.00|A|F|1994-09-21|1994-10-01|1994-10-12|COLLECT COD|RAIL|y furiously regular pinto beans. quiet +41636|1111|84|4|44|44532.84|0.00|0.07|R|F|1994-09-16|1994-11-12|1994-09-24|TAKE BACK RETURN|REG AIR|inal accounts cajole after the ironic, +41636|809|43|5|4|6839.20|0.02|0.07|A|F|1994-09-03|1994-09-20|1994-09-29|NONE|SHIP|s are abou +41636|10|11|6|45|40950.45|0.03|0.07|R|F|1994-10-12|1994-10-17|1994-10-30|COLLECT COD|FOB|special requests acc +41637|108|35|1|48|48388.80|0.10|0.05|R|F|1993-06-23|1993-06-16|1993-07-21|TAKE BACK RETURN|TRUCK|asymptotes promise slyly atop t +41637|1061|62|2|34|32710.04|0.01|0.04|R|F|1993-07-14|1993-06-20|1993-08-08|TAKE BACK RETURN|FOB|nstructions. r +41637|715|48|3|33|53318.43|0.03|0.00|R|F|1993-07-17|1993-07-18|1993-08-11|NONE|AIR|s are fluff +41637|1005|76|4|14|12684.00|0.04|0.02|R|F|1993-08-16|1993-06-07|1993-08-26|NONE|RAIL|among the never r +41637|1756|41|5|14|23208.50|0.10|0.05|R|F|1993-06-18|1993-07-03|1993-07-08|TAKE BACK RETURN|MAIL|e regular, sly packages. dep +41638|236|18|1|19|21588.37|0.06|0.04|A|F|1993-09-12|1993-08-12|1993-09-17|DELIVER IN PERSON|AIR|as haggle furiously final orbit +41638|1586|7|2|28|41652.24|0.09|0.06|R|F|1993-09-02|1993-07-28|1993-09-17|DELIVER IN PERSON|AIR|cial dependenc +41639|1123|60|1|41|41988.92|0.02|0.02|N|O|1996-06-08|1996-04-26|1996-07-04|DELIVER IN PERSON|REG AIR| ideas among the pending theo +41639|763|28|2|18|29947.68|0.09|0.05|N|O|1996-06-09|1996-05-21|1996-06-11|TAKE BACK RETURN|RAIL| regular deposits are carefu +41639|616|10|3|26|39431.86|0.00|0.02|N|O|1996-05-19|1996-04-30|1996-06-08|TAKE BACK RETURN|TRUCK|accounts was carefu +41639|1523|24|4|34|48433.68|0.02|0.07|N|O|1996-06-22|1996-05-13|1996-07-15|NONE|AIR|t foxes. platelets affix blit +41664|111|38|1|32|32355.52|0.07|0.01|N|O|1996-01-14|1996-02-28|1996-01-22|TAKE BACK RETURN|FOB|essly silent ideas use! furiousl +41664|1336|37|2|18|22271.94|0.03|0.03|N|O|1996-02-11|1996-02-29|1996-02-28|TAKE BACK RETURN|TRUCK|g foxes can nag acc +41664|214|69|3|4|4456.84|0.00|0.05|N|O|1995-12-10|1996-01-17|1996-01-08|NONE|RAIL|blithely expre +41664|212|40|4|4|4448.84|0.07|0.05|N|O|1996-01-01|1996-03-04|1996-01-09|DELIVER IN PERSON|RAIL| final requests sleep about the theodoli +41665|521|82|1|4|5686.08|0.04|0.07|N|O|1996-07-17|1996-10-01|1996-08-06|DELIVER IN PERSON|MAIL|uickly even platel +41665|911|12|2|46|83347.86|0.09|0.05|N|O|1996-07-21|1996-10-11|1996-07-29|NONE|MAIL|lms. carefully pending accounts are i +41665|1277|52|3|30|35348.10|0.05|0.05|N|O|1996-09-28|1996-09-04|1996-10-24|COLLECT COD|SHIP|x-ray carefully arou +41666|735|32|1|22|35986.06|0.05|0.04|R|F|1992-03-29|1992-05-06|1992-04-11|COLLECT COD|MAIL|liers. carefully even foxes x-ray +41666|1957|90|2|2|3717.90|0.07|0.02|R|F|1992-05-30|1992-04-12|1992-06-21|DELIVER IN PERSON|REG AIR|tes. quickly fin +41666|1741|42|3|48|78851.52|0.06|0.00|A|F|1992-04-27|1992-05-14|1992-05-14|DELIVER IN PERSON|REG AIR|s use blithely bol +41666|1304|5|4|1|1205.30|0.02|0.08|A|F|1992-04-15|1992-04-06|1992-05-07|DELIVER IN PERSON|RAIL|uriously special pinto beans hang ironica +41666|1276|51|5|45|52977.15|0.04|0.05|A|F|1992-03-26|1992-04-29|1992-04-23|NONE|MAIL|eposits doze +41666|820|20|6|24|41299.68|0.03|0.07|R|F|1992-06-12|1992-05-20|1992-07-11|DELIVER IN PERSON|RAIL|pecial accounts. fluffi +41667|1989|78|1|46|86985.08|0.02|0.08|R|F|1992-09-06|1992-08-24|1992-09-28|DELIVER IN PERSON|AIR| over the slyly even accounts. platele +41667|482|41|2|42|58064.16|0.06|0.06|R|F|1992-09-18|1992-07-31|1992-10-06|DELIVER IN PERSON|REG AIR|arefully silent +41667|1731|32|3|23|37552.79|0.00|0.04|A|F|1992-07-31|1992-09-18|1992-08-14|TAKE BACK RETURN|RAIL|ts nag final packages. b +41668|396|25|1|1|1296.39|0.05|0.07|N|O|1996-06-15|1996-08-06|1996-07-11|DELIVER IN PERSON|TRUCK|ts nag according to the blithely bra +41669|235|90|1|21|23839.83|0.10|0.03|N|O|1997-12-28|1998-02-01|1997-12-31|NONE|FOB|egular deposits wake blithely. +41669|1965|54|2|10|18669.60|0.08|0.01|N|O|1998-03-10|1997-12-25|1998-03-28|TAKE BACK RETURN|FOB|ccounts cajol +41669|589|20|3|18|26812.44|0.02|0.02|N|O|1998-01-11|1997-12-19|1998-02-03|NONE|REG AIR|its. instructions x-ray quickly. ir +41669|1061|67|4|41|39444.46|0.05|0.02|N|O|1997-12-04|1998-01-01|1997-12-13|DELIVER IN PERSON|RAIL|xes will affix blithely express p +41669|209|37|5|16|17747.20|0.10|0.00|N|O|1997-12-31|1997-12-19|1998-01-27|DELIVER IN PERSON|AIR|ep blithely among the quickly even foxes +41669|1683|25|6|19|30108.92|0.00|0.02|N|O|1998-02-11|1997-12-29|1998-02-12|NONE|RAIL|regular, bold ideas; final, re +41670|1109|18|1|10|10101.00|0.07|0.04|N|O|1996-10-11|1996-10-13|1996-11-06|NONE|TRUCK|efully. blithely special deposi +41670|1657|81|2|8|12469.20|0.05|0.01|N|O|1996-09-05|1996-11-17|1996-09-10|NONE|SHIP|. blithely exp +41670|624|56|3|17|25918.54|0.08|0.04|N|O|1996-10-14|1996-10-11|1996-11-04|DELIVER IN PERSON|RAIL|even, final requests maintain slyly +41670|1808|38|4|43|73521.40|0.00|0.08|N|O|1996-11-07|1996-09-26|1996-11-26|NONE|RAIL|ironic, unusual as +41671|1541|62|1|47|67799.38|0.01|0.01|A|F|1993-03-28|1993-01-09|1993-04-03|DELIVER IN PERSON|FOB|ily final +41671|27|53|2|47|43569.94|0.04|0.06|A|F|1993-03-20|1993-02-06|1993-03-23|COLLECT COD|REG AIR|ole above the express, ironic deposits? pe +41696|256|38|1|38|43937.50|0.07|0.06|R|F|1994-08-21|1994-10-05|1994-09-02|TAKE BACK RETURN|FOB|ect pending id +41696|573|4|2|2|2947.14|0.02|0.04|R|F|1994-09-16|1994-09-28|1994-09-25|NONE|AIR|ing to the ir +41697|760|25|1|29|48162.04|0.08|0.05|N|O|1997-01-31|1997-01-26|1997-02-28|NONE|TRUCK|heodolites haggle after the i +41697|474|4|2|35|48106.45|0.02|0.07|N|O|1997-01-20|1997-01-28|1997-02-09|COLLECT COD|AIR|ndencies haggle carefully final asympt +41697|591|52|3|22|32814.98|0.04|0.06|N|O|1997-02-16|1997-01-28|1997-03-14|NONE|RAIL|ses along the pinto beans haggle +41698|948|17|1|3|5546.82|0.05|0.05|N|O|1998-06-23|1998-05-09|1998-07-01|TAKE BACK RETURN|TRUCK|osits are fluffily about the furiously +41699|1622|23|1|19|28948.78|0.01|0.00|A|F|1993-04-15|1993-03-30|1993-05-02|DELIVER IN PERSON|RAIL|ts across +41699|204|5|2|2|2208.40|0.05|0.02|A|F|1993-04-08|1993-04-04|1993-05-07|DELIVER IN PERSON|REG AIR|ld requests wake a +41700|466|67|1|46|62857.16|0.08|0.04|N|O|1997-09-27|1997-08-12|1997-10-01|COLLECT COD|MAIL| regular p +41700|592|53|2|46|68659.14|0.10|0.05|N|O|1997-07-02|1997-09-14|1997-07-27|COLLECT COD|AIR|l deposits cajole quickly regular hockey +41700|1969|58|3|19|35548.24|0.03|0.08|N|O|1997-09-18|1997-08-26|1997-10-08|NONE|FOB|use regular packages. special accounts kind +41700|133|12|4|39|40292.07|0.07|0.05|N|O|1997-09-06|1997-09-11|1997-09-28|TAKE BACK RETURN|MAIL|ronic, pending p +41701|1396|35|1|12|15568.68|0.01|0.08|N|O|1997-03-31|1997-04-11|1997-04-16|TAKE BACK RETURN|AIR|xpress hockey players +41701|732|97|2|41|66941.93|0.07|0.08|N|O|1997-04-20|1997-04-10|1997-05-15|NONE|SHIP|y regular theodolites. blithely even fre +41701|1618|1|3|14|21274.54|0.10|0.07|N|O|1997-06-01|1997-05-25|1997-06-14|COLLECT COD|REG AIR|s upon the slyly final realms try to cajo +41701|107|34|4|28|28198.80|0.07|0.06|N|O|1997-04-13|1997-04-06|1997-04-24|COLLECT COD|RAIL|ular pinto beans +41701|1517|38|5|17|24114.67|0.03|0.02|N|O|1997-06-23|1997-05-17|1997-06-25|DELIVER IN PERSON|REG AIR|p even deposits. express dep +41701|1552|93|6|5|7267.75|0.01|0.08|N|O|1997-05-04|1997-05-07|1997-05-30|TAKE BACK RETURN|MAIL|lithely ironic pinto +41702|1537|18|1|38|54664.14|0.06|0.03|A|F|1994-03-16|1994-02-22|1994-04-13|TAKE BACK RETURN|TRUCK|fily ironic r +41702|241|69|2|43|49073.32|0.10|0.08|R|F|1994-03-28|1994-03-09|1994-03-29|TAKE BACK RETURN|AIR|ly after the qui +41702|274|75|3|22|25833.94|0.01|0.00|A|F|1994-04-16|1994-03-23|1994-04-26|NONE|REG AIR|gle slyly. carefully +41702|911|46|4|18|32614.38|0.08|0.08|R|F|1994-03-16|1994-02-13|1994-04-07|TAKE BACK RETURN|TRUCK|lent, bold accounts. blithely regular +41702|1138|11|5|14|14547.82|0.04|0.03|R|F|1994-04-22|1994-03-11|1994-05-15|TAKE BACK RETURN|TRUCK|efully carefully final accounts. furiou +41703|1140|13|1|2|2082.28|0.00|0.05|R|F|1992-05-26|1992-06-13|1992-05-30|COLLECT COD|MAIL|blithely daring ideas beli +41703|1480|20|2|39|53877.72|0.04|0.02|A|F|1992-06-25|1992-06-27|1992-06-27|NONE|SHIP|inst the b +41703|1830|60|3|27|46759.41|0.04|0.05|A|F|1992-08-20|1992-06-28|1992-09-01|NONE|RAIL| accounts. pending, regular pinto beans wak +41703|1974|7|4|31|58155.07|0.03|0.01|A|F|1992-07-29|1992-06-19|1992-08-04|DELIVER IN PERSON|TRUCK|ully final deposits about the +41703|315|16|5|21|25521.51|0.00|0.02|R|F|1992-07-23|1992-07-25|1992-08-01|DELIVER IN PERSON|FOB|ents cajole after the blithely ev +41703|207|62|6|21|23251.20|0.03|0.03|A|F|1992-07-10|1992-06-08|1992-07-29|TAKE BACK RETURN|FOB| after the carefully final +41728|1988|21|1|45|85049.10|0.10|0.02|R|F|1995-01-17|1994-12-09|1995-01-26|TAKE BACK RETURN|MAIL|iously finally ironic +41728|1302|17|2|31|37302.30|0.09|0.00|A|F|1994-11-27|1994-12-19|1994-12-25|NONE|FOB|ts cajole quickly along the ideas? +41728|1735|78|3|45|73652.85|0.03|0.05|R|F|1994-10-23|1994-12-08|1994-10-26|NONE|MAIL|nts. blithely special foxes are silent, r +41728|136|15|4|5|5180.65|0.06|0.00|A|F|1995-01-28|1994-11-27|1995-02-05|DELIVER IN PERSON|TRUCK|riously stealthy requests are +41728|1718|19|5|43|69647.53|0.03|0.06|A|F|1994-10-21|1994-12-28|1994-10-29|NONE|SHIP|ully furiously quiet i +41728|770|3|6|30|50123.10|0.08|0.02|R|F|1994-12-20|1994-11-25|1995-01-17|DELIVER IN PERSON|RAIL|es are. even reque +41728|1486|4|7|17|23587.16|0.04|0.05|R|F|1994-11-11|1994-12-25|1994-11-15|DELIVER IN PERSON|RAIL|ular packages use +41729|365|22|1|5|6326.80|0.01|0.08|R|F|1993-03-26|1993-03-02|1993-03-27|COLLECT COD|RAIL|deas wake ca +41730|894|61|1|18|32308.02|0.10|0.04|N|O|1997-03-17|1997-01-08|1997-04-13|DELIVER IN PERSON|REG AIR| final deposits haggle slyly after the +41730|1997|42|2|44|83555.56|0.08|0.01|N|O|1996-12-09|1997-01-14|1996-12-12|TAKE BACK RETURN|SHIP|y, regular deposits: furiously final foxe +41730|19|20|3|19|17461.19|0.02|0.01|N|O|1997-02-10|1996-12-25|1997-02-20|TAKE BACK RETURN|MAIL|. regular, reg +41730|1825|69|4|20|34536.40|0.06|0.03|N|O|1997-02-23|1996-12-25|1997-03-25|DELIVER IN PERSON|RAIL|quietly unus +41730|280|8|5|11|12983.08|0.04|0.00|N|O|1997-03-10|1996-12-20|1997-04-04|COLLECT COD|REG AIR| blithely after +41731|1424|64|1|22|29159.24|0.08|0.06|N|O|1996-04-29|1996-05-31|1996-05-20|DELIVER IN PERSON|REG AIR|l deposits abou +41732|981|50|1|8|15055.84|0.10|0.07|A|F|1994-09-28|1994-09-30|1994-10-18|NONE|SHIP|s the slyly bold theodolites. regu +41732|1344|83|2|36|44832.24|0.01|0.01|R|F|1994-11-22|1994-11-02|1994-12-22|TAKE BACK RETURN|FOB|s haggle deposits. quickly regular acc +41732|1660|61|3|2|3123.32|0.07|0.06|R|F|1994-09-05|1994-10-17|1994-09-12|TAKE BACK RETURN|SHIP|according to the ironic, bold accounts-- f +41732|108|35|4|34|34275.40|0.01|0.06|A|F|1994-09-10|1994-10-29|1994-10-08|DELIVER IN PERSON|FOB| carefully quickly pending packages. +41733|1011|12|1|14|12768.14|0.04|0.03|N|O|1998-01-25|1998-01-14|1998-02-10|TAKE BACK RETURN|RAIL|yly regular idea +41733|964|65|2|1|1864.96|0.01|0.08|N|O|1997-12-24|1998-01-18|1998-01-01|DELIVER IN PERSON|REG AIR|nic accounts above the blithely s +41733|1011|17|3|7|6384.07|0.00|0.07|N|O|1998-02-12|1997-12-30|1998-02-21|DELIVER IN PERSON|AIR|c accounts. ironic depo +41733|517|18|4|17|24097.67|0.01|0.08|N|O|1998-01-02|1997-12-26|1998-01-13|DELIVER IN PERSON|MAIL|slyly final packages. furiously +41734|981|50|1|40|75279.20|0.01|0.08|A|F|1994-01-17|1994-02-18|1994-01-31|TAKE BACK RETURN|MAIL|unts use blithely slyly express pack +41734|1135|36|2|6|6216.78|0.09|0.04|A|F|1994-01-02|1994-03-03|1994-01-13|COLLECT COD|RAIL|to beans haggle +41734|621|15|3|38|57821.56|0.05|0.02|A|F|1994-03-01|1994-01-30|1994-03-19|DELIVER IN PERSON|MAIL|onically final notornis! final asymptotes a +41734|1641|83|4|14|21596.96|0.07|0.07|A|F|1994-01-16|1994-01-20|1994-01-18|TAKE BACK RETURN|REG AIR|ic packages. caref +41734|1177|78|5|13|14016.21|0.10|0.08|R|F|1994-03-12|1994-02-01|1994-03-13|DELIVER IN PERSON|RAIL|thely among the slyly final asymp +41735|1537|58|1|28|40278.84|0.07|0.08|N|O|1996-11-03|1996-10-23|1996-11-06|TAKE BACK RETURN|TRUCK|usly final +41735|332|61|2|16|19717.28|0.01|0.05|N|O|1996-11-30|1996-11-22|1996-12-15|COLLECT COD|FOB|he carefully ironic +41760|17|18|1|36|33012.36|0.03|0.08|R|F|1992-05-27|1992-03-06|1992-05-29|NONE|TRUCK|y ruthless pinto b +41760|798|63|2|4|6795.16|0.06|0.08|R|F|1992-05-27|1992-03-02|1992-06-18|DELIVER IN PERSON|REG AIR|fully bold accounts. bold, s +41760|1851|38|3|41|71866.85|0.02|0.03|A|F|1992-04-06|1992-04-24|1992-04-28|NONE|FOB|iously. ironic, fi +41760|1683|84|4|49|77649.32|0.05|0.05|R|F|1992-04-04|1992-03-15|1992-05-03|NONE|SHIP|st the permanently s +41760|488|47|5|3|4165.44|0.03|0.02|A|F|1992-03-06|1992-03-12|1992-04-04|TAKE BACK RETURN|AIR| even, regular foxes nag carefully. slyly +41760|165|44|6|7|7456.12|0.05|0.01|A|F|1992-05-27|1992-03-18|1992-06-25|TAKE BACK RETURN|SHIP|ckages sleep slyly above the furio +41760|716|13|7|19|30717.49|0.09|0.01|R|F|1992-05-12|1992-03-24|1992-05-26|COLLECT COD|REG AIR|he blithel +41761|1158|67|1|31|32833.65|0.10|0.01|N|O|1998-09-15|1998-07-14|1998-10-04|TAKE BACK RETURN|SHIP|uctions haggle furiously after +41761|940|9|2|20|36818.80|0.03|0.03|N|O|1998-09-21|1998-08-26|1998-09-27|COLLECT COD|SHIP|ackages hang slyly a +41762|1186|95|1|44|47835.92|0.10|0.08|N|O|1997-04-25|1997-07-04|1997-05-10|COLLECT COD|REG AIR| unusual asymptotes alongside of the +41762|1745|30|2|2|3293.48|0.08|0.01|N|O|1997-05-01|1997-06-19|1997-05-05|NONE|SHIP|slyly quickly final attainments. slyl +41762|1427|6|3|21|27896.82|0.04|0.03|N|O|1997-05-09|1997-06-07|1997-06-05|TAKE BACK RETURN|FOB|its. furiously express deposits haggle fur +41762|881|15|4|17|30291.96|0.06|0.05|N|O|1997-08-04|1997-05-12|1997-08-17|DELIVER IN PERSON|SHIP|instructions haggle regular ideas. final +41762|866|66|5|10|17668.60|0.02|0.04|N|O|1997-06-24|1997-06-25|1997-07-07|NONE|RAIL|ernes. silent deposits are blithely +41763|981|50|1|19|35757.62|0.08|0.06|A|F|1993-09-28|1993-07-17|1993-10-23|COLLECT COD|AIR|le careful +41763|1434|74|2|14|18696.02|0.03|0.00|A|F|1993-07-08|1993-07-24|1993-07-20|NONE|REG AIR|thely? regular packages a +41763|1609|33|3|45|67977.00|0.06|0.05|R|F|1993-09-02|1993-09-09|1993-09-07|DELIVER IN PERSON|FOB|ix carefully above the asym +41764|331|60|1|14|17238.62|0.01|0.00|A|F|1995-01-13|1994-12-24|1995-01-24|TAKE BACK RETURN|FOB|slyly regular packages +41764|1469|9|2|47|64411.62|0.00|0.06|R|F|1995-01-19|1994-11-28|1995-01-20|TAKE BACK RETURN|REG AIR|ietly furiously even deposits. +41764|465|24|3|11|15020.06|0.10|0.07|R|F|1995-02-04|1994-11-10|1995-02-14|TAKE BACK RETURN|SHIP|gular warhorses sleep bl +41764|1836|80|4|5|8689.15|0.09|0.03|R|F|1995-01-28|1994-12-08|1995-02-07|COLLECT COD|FOB| maintain sometimes regular theodolites +41764|62|88|5|12|11544.72|0.00|0.03|A|F|1994-11-25|1994-12-05|1994-12-13|DELIVER IN PERSON|FOB|dogged req +41764|412|71|6|28|36747.48|0.07|0.01|R|F|1994-12-12|1994-12-07|1994-12-26|NONE|REG AIR|requests. never +41764|423|82|7|37|48966.54|0.06|0.05|A|F|1995-01-29|1994-11-12|1995-02-06|DELIVER IN PERSON|REG AIR| carefully along the fluffily even acc +41765|1315|16|1|41|49868.71|0.00|0.08|R|F|1995-03-21|1995-02-16|1995-04-19|DELIVER IN PERSON|REG AIR|y final pinto beans around the slyly +41765|19|95|2|14|12866.14|0.07|0.00|A|F|1995-03-16|1995-01-28|1995-04-12|COLLECT COD|TRUCK|ly regular requests. +41765|1104|13|3|39|39198.90|0.00|0.01|R|F|1995-02-09|1995-01-18|1995-02-15|DELIVER IN PERSON|REG AIR| express ep +41765|1698|40|4|22|35193.18|0.08|0.05|A|F|1994-12-21|1995-01-11|1994-12-29|COLLECT COD|SHIP| even deposits. furiously pendi +41765|1429|30|5|37|49225.54|0.09|0.02|A|F|1995-03-23|1995-02-23|1995-04-07|COLLECT COD|TRUCK|quickly expres +41765|1386|1|6|7|9011.66|0.04|0.05|R|F|1995-03-08|1995-01-30|1995-03-22|COLLECT COD|SHIP|sts near the deposits affix across +41766|1596|97|1|25|37439.75|0.03|0.00|R|F|1992-09-27|1992-11-23|1992-10-15|DELIVER IN PERSON|MAIL|arefully! regular platelets are fur +41766|1494|12|2|42|58610.58|0.08|0.08|R|F|1992-09-22|1992-12-02|1992-10-13|COLLECT COD|SHIP|to the theodolites. pe +41766|1604|87|3|27|40651.20|0.08|0.06|A|F|1992-12-30|1992-10-19|1993-01-14|TAKE BACK RETURN|RAIL|r packages. even +41766|185|12|4|14|15192.52|0.09|0.08|A|F|1992-11-04|1992-11-14|1992-11-22|TAKE BACK RETURN|SHIP|e even requests. +41766|1655|97|5|43|66935.95|0.00|0.07|A|F|1992-12-10|1992-10-25|1992-12-11|NONE|SHIP|gular excuses at the ideas haggle +41766|546|7|6|29|41949.66|0.02|0.05|A|F|1992-12-14|1992-12-04|1993-01-10|DELIVER IN PERSON|REG AIR|ole furiously closely regular hockey p +41766|322|23|7|2|2444.64|0.01|0.01|R|F|1992-09-15|1992-11-13|1992-09-29|NONE|TRUCK| deposits. daringly final instructions inte +41767|544|45|1|43|62115.22|0.02|0.04|R|F|1994-10-28|1994-10-06|1994-11-12|DELIVER IN PERSON|TRUCK|lar deposit +41767|1815|59|2|40|68672.40|0.07|0.00|R|F|1994-09-26|1994-10-01|1994-10-12|NONE|MAIL|l dinos haggle among the ironic foxes +41767|300|82|3|17|20405.10|0.07|0.06|A|F|1994-10-01|1994-09-15|1994-10-03|NONE|AIR| dependencies. dependen +41792|1601|25|1|30|45078.00|0.09|0.01|N|O|1997-11-09|1997-08-18|1997-12-04|DELIVER IN PERSON|RAIL| carefully +41793|1143|44|1|39|40721.46|0.00|0.00|A|F|1994-08-12|1994-06-19|1994-09-04|TAKE BACK RETURN|SHIP|ts sleep blithely. foxes +41793|324|53|2|15|18364.80|0.04|0.04|A|F|1994-07-29|1994-07-04|1994-08-22|COLLECT COD|REG AIR|, ironic ideas. unusual requests affix +41793|1898|99|3|23|41397.47|0.08|0.02|A|F|1994-07-30|1994-08-06|1994-08-09|DELIVER IN PERSON|AIR|foxes sleep furiously. +41793|1890|20|4|13|23294.57|0.08|0.03|R|F|1994-08-07|1994-07-04|1994-08-28|NONE|REG AIR|packages sleep +41793|137|64|5|46|47707.98|0.07|0.04|A|F|1994-09-03|1994-08-11|1994-09-14|TAKE BACK RETURN|MAIL|ckages nod final packages. silent, u +41794|1328|43|1|33|40567.56|0.10|0.08|N|F|1995-06-17|1995-07-01|1995-06-18|NONE|REG AIR|structions nag furiou +41794|454|84|2|46|62304.70|0.00|0.06|N|O|1995-09-13|1995-08-08|1995-09-21|COLLECT COD|FOB|s. slyly ironic theodolites w +41794|705|2|3|32|51382.40|0.10|0.04|N|O|1995-08-31|1995-08-05|1995-09-18|NONE|MAIL|ly unusual pinto beans c +41794|1085|86|4|16|15777.28|0.03|0.06|N|F|1995-06-06|1995-08-04|1995-06-23|COLLECT COD|RAIL|e ironic requests +41795|1169|70|1|20|21403.20|0.03|0.04|N|O|1996-12-04|1996-12-13|1996-12-30|TAKE BACK RETURN|REG AIR|oss the furiou +41795|905|40|2|29|52371.10|0.06|0.04|N|O|1996-11-11|1996-10-19|1996-11-25|DELIVER IN PERSON|TRUCK|ost. quietly final tithes hinder carefull +41795|1196|97|3|10|10971.90|0.03|0.04|N|O|1996-10-09|1996-10-20|1996-10-28|DELIVER IN PERSON|AIR|inal ideas about the ironic, +41796|86|12|1|21|20707.68|0.08|0.03|N|O|1998-05-02|1998-02-18|1998-05-28|NONE|REG AIR|de of the blithely fin +41797|1056|62|1|45|43067.25|0.06|0.05|N|O|1996-06-08|1996-06-24|1996-07-04|COLLECT COD|TRUCK|d accounts doubt slyly +41797|1600|41|2|46|69073.60|0.06|0.04|N|O|1996-04-27|1996-05-05|1996-05-26|TAKE BACK RETURN|REG AIR|old accounts sleep quickly carefully perm +41798|1938|71|1|18|33118.74|0.00|0.02|R|F|1992-11-21|1992-12-17|1992-11-29|NONE|FOB|y special pack +41798|1978|23|2|24|45119.28|0.04|0.08|R|F|1992-12-15|1993-02-09|1993-01-14|NONE|AIR|o beans according to the b +41798|299|54|3|28|33580.12|0.00|0.06|R|F|1993-01-10|1993-01-14|1993-02-07|NONE|SHIP|al dependencies sleep. furiously quick acc +41798|1226|64|4|43|48470.46|0.04|0.08|A|F|1993-02-06|1993-01-10|1993-03-01|TAKE BACK RETURN|AIR|ggle across the bold deposit +41799|53|54|1|2|1906.10|0.05|0.03|A|F|1994-10-08|1994-08-23|1994-10-13|DELIVER IN PERSON|AIR|cies. special pinto bean +41799|1402|81|2|42|54742.80|0.09|0.03|R|F|1994-09-09|1994-08-03|1994-10-07|DELIVER IN PERSON|RAIL|the final packages integ +41824|489|48|1|6|8336.88|0.00|0.06|R|F|1993-10-18|1993-09-18|1993-10-23|COLLECT COD|FOB|express instructions are. fina +41824|1997|86|2|23|43676.77|0.06|0.01|A|F|1993-07-26|1993-08-28|1993-08-04|NONE|REG AIR|courts. silent packages are qui +41824|1937|70|3|33|60684.69|0.06|0.08|A|F|1993-08-09|1993-09-28|1993-08-16|COLLECT COD|FOB|iously final dugouts +41824|60|61|4|29|27841.74|0.10|0.00|A|F|1993-09-24|1993-09-05|1993-10-23|COLLECT COD|MAIL|ly. furiou +41824|663|64|5|17|26582.22|0.10|0.06|A|F|1993-10-14|1993-08-18|1993-10-30|COLLECT COD|FOB|lyly bold ideas. ironic dugouts a +41824|514|75|6|35|49507.85|0.05|0.02|A|F|1993-07-26|1993-08-12|1993-07-28|NONE|AIR|kly regular accoun +41824|1184|93|7|18|19533.24|0.05|0.01|R|F|1993-07-23|1993-08-24|1993-08-07|NONE|FOB|metimes unusual instructions +41825|406|36|1|2|2612.80|0.04|0.03|A|F|1994-10-29|1994-10-20|1994-11-26|DELIVER IN PERSON|RAIL| the furiousl +41825|1907|52|2|14|25324.60|0.09|0.01|R|F|1994-12-17|1994-10-21|1994-12-21|NONE|SHIP|uickly express deposits. ironic pack +41825|789|90|3|39|65901.42|0.10|0.08|A|F|1994-09-13|1994-11-17|1994-09-21|NONE|REG AIR| requests boost fluffily expres +41825|738|35|4|18|29497.14|0.01|0.05|R|F|1994-12-13|1994-10-27|1994-12-16|COLLECT COD|MAIL|equests. ironic requests sl +41826|1415|55|1|37|48707.17|0.08|0.03|A|F|1994-02-09|1994-01-08|1994-02-15|TAKE BACK RETURN|RAIL|kly bold excuses +41826|355|40|2|49|61512.15|0.03|0.02|A|F|1994-01-29|1993-11-30|1994-02-22|TAKE BACK RETURN|RAIL| furiously +41826|1976|77|3|47|88264.59|0.10|0.00|A|F|1993-12-09|1993-12-24|1993-12-10|COLLECT COD|REG AIR| against the bold +41826|1926|71|4|1|1827.92|0.05|0.06|R|F|1993-12-15|1993-12-04|1993-12-26|DELIVER IN PERSON|FOB|the blithely ironic n +41826|1305|44|5|35|42220.50|0.06|0.01|A|F|1994-01-02|1993-12-21|1994-01-24|NONE|AIR|hely regular requests thrash +41827|513|14|1|26|36751.26|0.08|0.05|N|O|1996-02-16|1996-01-26|1996-02-23|DELIVER IN PERSON|AIR|ffily pending instruc +41827|1162|35|2|13|13821.08|0.00|0.07|N|O|1996-01-15|1996-01-08|1996-01-20|TAKE BACK RETURN|REG AIR| unusual pinto beans ought to use evenly +41828|491|50|1|9|12523.41|0.04|0.06|N|O|1997-02-23|1997-01-28|1997-03-14|TAKE BACK RETURN|REG AIR|er the carefully even +41829|1310|11|1|29|35127.99|0.02|0.05|N|O|1997-11-06|1998-01-11|1997-11-27|NONE|RAIL|es after the car +41829|32|58|2|9|8388.27|0.00|0.07|N|O|1998-01-08|1998-01-14|1998-01-16|NONE|MAIL|ents. furiously iron +41829|637|69|3|43|66118.09|0.07|0.08|N|O|1997-11-01|1997-12-15|1997-11-26|COLLECT COD|TRUCK|haggle slyly +41829|1017|53|4|17|15606.17|0.06|0.08|N|O|1997-11-22|1997-12-21|1997-12-08|TAKE BACK RETURN|TRUCK|ounts use fu +41829|697|60|5|48|76689.12|0.01|0.02|N|O|1997-11-01|1998-01-21|1997-11-07|NONE|TRUCK| furiously regular accounts +41829|576|77|6|22|32484.54|0.03|0.08|N|O|1998-01-26|1998-01-17|1998-02-01|TAKE BACK RETURN|SHIP|structions are a +41830|1494|12|1|38|53028.62|0.10|0.08|R|F|1992-06-07|1992-04-11|1992-06-26|TAKE BACK RETURN|FOB| furiously pendi +41830|355|12|2|42|52724.70|0.00|0.01|A|F|1992-05-12|1992-04-12|1992-05-13|COLLECT COD|AIR|es. furious theodoli +41830|1898|99|3|46|82794.94|0.00|0.01|A|F|1992-02-20|1992-04-16|1992-03-04|TAKE BACK RETURN|AIR| furiously regular accounts. packages s +41831|168|21|1|22|23499.52|0.05|0.01|A|F|1992-08-21|1992-10-05|1992-08-22|COLLECT COD|TRUCK|deposits poach blithely even +41831|1002|38|2|2|1806.00|0.07|0.06|R|F|1992-09-10|1992-10-14|1992-10-09|COLLECT COD|TRUCK|uffily final excuses. regularly regul +41831|744|77|3|25|41118.50|0.10|0.02|A|F|1992-10-08|1992-10-19|1992-10-31|TAKE BACK RETURN|FOB|es cajole on the quickly unusual pack +41831|1719|62|4|33|53483.43|0.05|0.03|A|F|1992-07-30|1992-09-02|1992-08-19|COLLECT COD|SHIP|c foxes wake blith +41831|1073|79|5|31|30196.17|0.00|0.05|A|F|1992-10-26|1992-08-26|1992-11-12|NONE|FOB|. carefully reg +41831|1123|24|6|28|28675.36|0.01|0.08|R|F|1992-09-26|1992-10-18|1992-10-06|NONE|REG AIR|. regular excuses sleep furiously bold Tire +41831|1286|24|7|17|20183.76|0.08|0.04|A|F|1992-09-30|1992-09-23|1992-10-13|DELIVER IN PERSON|MAIL|ously regular accounts use special +41856|228|10|1|48|54154.56|0.00|0.07|A|F|1993-11-01|1993-10-01|1993-11-12|NONE|FOB| across the blith +41857|1432|33|1|6|8000.58|0.09|0.05|N|O|1995-07-30|1995-07-02|1995-08-04|NONE|AIR|al ideas. silent dolphins sleep fu +41857|234|89|2|5|5671.15|0.08|0.01|N|O|1995-06-29|1995-08-05|1995-07-24|TAKE BACK RETURN|TRUCK|al pinto beans. deposits wake pending w +41857|1917|62|3|41|74575.31|0.04|0.04|N|O|1995-07-16|1995-06-29|1995-07-27|TAKE BACK RETURN|AIR|even requests. ironic, even ideas na +41857|554|85|4|10|14545.50|0.08|0.00|N|O|1995-08-26|1995-08-04|1995-09-22|TAKE BACK RETURN|FOB|ckly silent deposits +41857|1278|90|5|36|42453.72|0.02|0.08|N|O|1995-08-26|1995-06-19|1995-09-11|TAKE BACK RETURN|REG AIR|xpress foxes. special request +41858|1771|56|1|15|25091.55|0.04|0.01|N|O|1998-02-08|1998-01-12|1998-02-12|TAKE BACK RETURN|AIR|oss the carefully r +41858|976|79|2|13|24400.61|0.03|0.01|N|O|1998-04-01|1998-03-01|1998-04-03|DELIVER IN PERSON|AIR|o beans. slyly regular packages nag; expres +41858|482|83|3|15|20737.20|0.10|0.06|N|O|1997-12-20|1998-02-04|1998-01-12|DELIVER IN PERSON|TRUCK|f the final depo +41858|1980|81|4|45|84689.10|0.05|0.05|N|O|1998-02-23|1998-02-24|1998-03-22|TAKE BACK RETURN|MAIL|es against the express, bold courts detec +41858|945|80|5|25|46148.50|0.02|0.06|N|O|1998-03-17|1998-01-21|1998-04-06|COLLECT COD|SHIP|packages after the carefully ironic i +41858|1908|97|6|10|18099.00|0.03|0.07|N|O|1997-12-12|1998-02-27|1997-12-30|NONE|REG AIR| pinto beans. +41858|1872|59|7|42|74502.54|0.04|0.01|N|O|1998-03-04|1998-03-03|1998-03-23|DELIVER IN PERSON|FOB|ly bold accounts. blithe +41859|620|14|1|10|15206.20|0.02|0.05|N|O|1997-06-09|1997-05-18|1997-07-08|NONE|TRUCK|ickly unusual t +41859|807|7|2|16|27324.80|0.03|0.04|N|O|1997-04-21|1997-04-23|1997-04-28|NONE|AIR|t according to the slyly regular pa +41859|352|9|3|19|23794.65|0.00|0.00|N|O|1997-04-18|1997-05-01|1997-05-07|TAKE BACK RETURN|SHIP|ns across the blithely regu +41859|474|33|4|29|39859.63|0.05|0.02|N|O|1997-05-10|1997-04-22|1997-05-29|COLLECT COD|SHIP|sits alongside of +41860|1983|16|1|25|47124.50|0.05|0.05|N|O|1997-05-26|1997-07-07|1997-06-02|NONE|FOB| platelets. blith +41861|663|57|1|48|75055.68|0.09|0.08|A|F|1993-12-02|1994-01-01|1993-12-21|TAKE BACK RETURN|REG AIR|riously ironic accounts affix. f +41861|96|72|2|21|20917.89|0.10|0.05|R|F|1993-12-12|1994-02-16|1993-12-21|NONE|SHIP|, ironic theodolites against the d +41861|613|14|3|42|63571.62|0.09|0.05|R|F|1994-02-22|1994-01-14|1994-02-24|TAKE BACK RETURN|MAIL| are. ironic dependencies wake silent +41861|299|27|4|44|52768.76|0.09|0.05|R|F|1994-03-27|1993-12-29|1994-04-07|NONE|MAIL|al accounts a +41861|1991|80|5|15|28394.85|0.06|0.03|A|F|1993-12-20|1994-01-04|1994-01-10|NONE|FOB|al, bold requests except the q +41861|217|99|6|26|29047.46|0.09|0.02|R|F|1994-03-17|1994-01-11|1994-04-01|NONE|MAIL|olphins. furiously dar +41862|1608|32|1|8|12076.80|0.05|0.00|N|O|1997-02-17|1997-03-14|1997-03-02|COLLECT COD|FOB|iously regular +41862|1900|1|2|41|73877.90|0.09|0.08|N|O|1997-05-08|1997-03-03|1997-06-03|COLLECT COD|TRUCK|r deposits +41862|1295|33|3|4|4785.16|0.09|0.00|N|O|1997-03-08|1997-03-15|1997-03-15|TAKE BACK RETURN|MAIL|gage. excuses boost slyly across +41862|1997|42|4|19|36080.81|0.06|0.06|N|O|1997-05-01|1997-03-25|1997-05-18|TAKE BACK RETURN|FOB|n packages. always expres +41862|1987|76|5|22|41557.56|0.08|0.08|N|O|1997-03-06|1997-04-09|1997-03-25|NONE|SHIP|ng to the q +41862|1648|90|6|22|34092.08|0.02|0.00|N|O|1997-03-10|1997-04-08|1997-04-09|DELIVER IN PERSON|AIR|tructions. express requ +41862|276|77|7|14|16467.78|0.06|0.05|N|O|1997-04-01|1997-03-09|1997-04-19|TAKE BACK RETURN|SHIP|aringly dogged deposits across the furiousl +41863|1404|83|1|44|57437.60|0.03|0.00|N|O|1996-02-19|1996-03-30|1996-03-18|NONE|FOB|ges are carefully behind the careful +41863|382|83|2|36|46165.68|0.01|0.08|N|O|1996-01-09|1996-03-04|1996-01-15|COLLECT COD|FOB|ly special foxes integrate alon +41888|68|69|1|17|16457.02|0.03|0.07|A|F|1994-06-29|1994-04-10|1994-07-06|COLLECT COD|REG AIR| ironic fox +41888|1646|70|2|34|52619.76|0.07|0.08|A|F|1994-04-12|1994-05-30|1994-05-06|COLLECT COD|RAIL|ound the unusual, expres +41888|873|74|3|44|78050.28|0.08|0.01|A|F|1994-04-10|1994-05-14|1994-04-21|DELIVER IN PERSON|RAIL|s. instruct +41888|1275|87|4|22|25877.94|0.10|0.04|A|F|1994-06-29|1994-05-26|1994-07-12|NONE|RAIL|ns sleep past the carefully speci +41888|326|27|5|22|26979.04|0.06|0.02|A|F|1994-04-17|1994-04-18|1994-04-26|TAKE BACK RETURN|RAIL|ymptotes. furious +41888|1822|66|6|16|27581.12|0.08|0.00|A|F|1994-04-18|1994-05-07|1994-05-06|TAKE BACK RETURN|FOB|nto beans. blithel +41889|194|21|1|44|48144.36|0.08|0.03|A|F|1994-10-10|1994-11-10|1994-11-01|TAKE BACK RETURN|RAIL|nal dinos. dogged, regular requests +41889|456|44|2|48|65109.60|0.10|0.02|A|F|1994-11-21|1994-11-27|1994-11-29|COLLECT COD|SHIP|ent, special realms could cajole furious +41889|1431|71|3|31|41305.33|0.08|0.01|A|F|1994-12-11|1994-11-22|1994-12-29|COLLECT COD|TRUCK|ar platelets. ironic, final i +41889|584|85|4|45|66806.10|0.02|0.04|A|F|1994-09-25|1994-11-19|1994-09-29|NONE|FOB|ans wake careful +41889|772|73|5|29|48510.33|0.04|0.01|R|F|1994-10-14|1994-12-03|1994-11-02|COLLECT COD|REG AIR| deposits. notornis thrash blithely +41890|78|29|1|15|14671.05|0.05|0.05|R|F|1993-02-23|1993-02-15|1993-03-02|DELIVER IN PERSON|TRUCK|lyly regular theodolites sleep dogge +41890|530|31|2|47|67234.91|0.07|0.00|R|F|1993-02-06|1993-03-07|1993-02-16|DELIVER IN PERSON|TRUCK|. final accounts integrate quickly. slyly +41890|1383|98|3|47|60365.86|0.08|0.02|R|F|1993-04-21|1993-03-16|1993-05-13|COLLECT COD|MAIL|egular, final accounts wake dolphins. p +41890|1349|26|4|9|11253.06|0.07|0.02|R|F|1993-01-17|1993-03-21|1993-02-05|DELIVER IN PERSON|MAIL|s sleep furio +41890|579|70|5|30|44387.10|0.00|0.04|R|F|1993-02-01|1993-02-17|1993-02-07|DELIVER IN PERSON|MAIL| requests wake +41891|1365|66|1|39|49388.04|0.09|0.05|N|O|1995-08-10|1995-07-12|1995-09-02|NONE|AIR|ackages poach f +41891|953|22|2|26|48202.70|0.00|0.06|N|O|1995-09-15|1995-07-20|1995-09-24|COLLECT COD|REG AIR|, express accounts. final theodolites use f +41891|931|34|3|31|56789.83|0.05|0.00|N|O|1995-07-19|1995-08-16|1995-08-17|TAKE BACK RETURN|REG AIR|aggle ruthlessly excus +41891|183|10|4|36|38994.48|0.09|0.03|N|O|1995-08-29|1995-06-30|1995-09-09|COLLECT COD|RAIL|y pending instructions. fluffily even f +41891|1776|77|5|3|5033.31|0.00|0.02|N|O|1995-09-15|1995-08-08|1995-10-05|DELIVER IN PERSON|AIR|o beans. furiously express reques +41891|1914|47|6|31|56293.21|0.04|0.03|N|O|1995-08-17|1995-07-10|1995-09-14|TAKE BACK RETURN|AIR|theodolites nag furiously around the f +41892|1142|15|1|25|26078.50|0.10|0.05|N|O|1996-08-23|1996-08-26|1996-09-08|NONE|AIR|l deposits haggle bo +41892|1270|45|2|47|55049.69|0.07|0.00|N|O|1996-11-12|1996-10-12|1996-12-09|DELIVER IN PERSON|FOB|hely of the +41892|437|67|3|8|10699.44|0.02|0.00|N|O|1996-07-25|1996-09-30|1996-07-26|DELIVER IN PERSON|REG AIR|ptotes. caref +41892|31|57|4|35|32586.05|0.07|0.04|N|O|1996-09-26|1996-10-06|1996-10-11|DELIVER IN PERSON|RAIL|oost blithely regular excuses. +41892|774|39|5|29|48568.33|0.03|0.01|N|O|1996-07-24|1996-09-01|1996-08-07|NONE|RAIL|eas. slyly idle req +41892|269|51|6|21|24554.46|0.05|0.03|N|O|1996-09-11|1996-10-03|1996-09-19|TAKE BACK RETURN|TRUCK|es are quickly carefully ir +41892|220|2|7|35|39207.70|0.07|0.02|N|O|1996-10-26|1996-10-19|1996-11-08|COLLECT COD|FOB|xpress excuses nag qui +41893|821|88|1|36|61985.52|0.03|0.01|N|O|1996-07-09|1996-06-25|1996-07-27|TAKE BACK RETURN|SHIP|ar theodolites a +41893|1456|35|2|11|14931.95|0.08|0.07|N|O|1996-05-16|1996-05-26|1996-05-24|DELIVER IN PERSON|FOB|furiously. furiously quiet excuses ha +41893|1351|52|3|4|5009.40|0.08|0.01|N|O|1996-08-04|1996-06-26|1996-08-17|DELIVER IN PERSON|TRUCK|e the ironic dep +41894|1576|77|1|27|39894.39|0.07|0.07|N|O|1998-09-25|1998-09-19|1998-10-17|DELIVER IN PERSON|AIR|carefully accounts. furiously unusual req +41895|144|23|1|46|48030.44|0.05|0.00|R|F|1995-03-14|1995-04-08|1995-04-07|DELIVER IN PERSON|REG AIR|telets wake closel +41895|1354|93|2|28|35149.80|0.05|0.08|A|F|1995-04-25|1995-03-13|1995-05-07|DELIVER IN PERSON|REG AIR|ouches. blithely ironic instruc +41895|1041|12|3|6|5652.24|0.08|0.01|A|F|1995-02-15|1995-04-02|1995-03-10|DELIVER IN PERSON|TRUCK| blithely even hockey players. +41920|1316|55|1|35|42605.85|0.02|0.01|N|O|1998-08-27|1998-09-27|1998-09-11|COLLECT COD|AIR| regular requests. idle, e +41920|1173|10|2|44|47263.48|0.00|0.04|N|O|1998-11-07|1998-09-14|1998-11-24|NONE|RAIL|al theodolites. ironic reque +41921|1489|29|1|39|54228.72|0.06|0.01|R|F|1992-05-12|1992-04-15|1992-05-29|NONE|TRUCK|old furiously regular packages; slyly +41921|131|84|2|36|37120.68|0.02|0.00|R|F|1992-03-14|1992-05-18|1992-03-21|NONE|RAIL|re above the w +41921|1483|62|3|19|26305.12|0.08|0.06|A|F|1992-06-02|1992-05-10|1992-07-01|TAKE BACK RETURN|REG AIR| blithely pending account +41922|647|10|1|47|72739.08|0.08|0.06|R|F|1993-10-15|1993-12-15|1993-10-30|NONE|RAIL| furiously. +41922|1230|5|2|36|40724.28|0.01|0.03|R|F|1994-01-13|1993-11-27|1994-01-24|TAKE BACK RETURN|MAIL|en requests. carefully final instruct +41922|1956|45|3|14|26011.30|0.04|0.04|R|F|1993-11-07|1993-11-04|1993-11-09|DELIVER IN PERSON|AIR|sly even packages +41922|361|18|4|13|16397.68|0.08|0.02|A|F|1993-11-05|1993-12-03|1993-11-27|DELIVER IN PERSON|AIR|ly even requests. fluffily silent f +41923|1777|62|1|49|82259.73|0.09|0.06|N|O|1996-09-22|1996-08-31|1996-10-16|DELIVER IN PERSON|FOB|deposits hagg +41923|913|48|2|11|19953.01|0.00|0.01|N|O|1996-10-15|1996-09-20|1996-11-12|COLLECT COD|AIR| carefully unusual, +41923|166|45|3|29|30918.64|0.02|0.05|N|O|1996-10-02|1996-09-14|1996-10-07|DELIVER IN PERSON|FOB|kindle. final deposits cajole blithely +41923|1099|100|4|18|18001.62|0.03|0.07|N|O|1996-10-09|1996-09-26|1996-11-01|COLLECT COD|TRUCK|. ironic, regular deposits to t +41923|589|80|5|10|14895.80|0.08|0.08|N|O|1996-07-25|1996-08-27|1996-07-30|COLLECT COD|SHIP|kly about the final p +41923|107|34|6|32|32227.20|0.10|0.02|N|O|1996-10-25|1996-09-13|1996-11-16|NONE|SHIP|bout the slyly regular instructions. caref +41924|1140|49|1|23|23946.22|0.00|0.07|N|O|1995-08-23|1995-07-23|1995-09-15|DELIVER IN PERSON|RAIL|usly special instructions. careful +41924|1775|60|2|31|51979.87|0.07|0.00|N|O|1995-09-03|1995-08-08|1995-09-07|COLLECT COD|RAIL|onic requests ca +41925|1758|1|1|27|44813.25|0.05|0.02|N|O|1997-04-09|1997-04-05|1997-05-08|NONE|FOB|ajole slyly according to the foxes. +41926|1872|59|1|26|46120.62|0.05|0.07|R|F|1995-03-20|1995-04-07|1995-03-24|COLLECT COD|SHIP|instructions wake furiously. even acc +41926|1062|98|2|16|15408.96|0.00|0.05|R|F|1995-04-23|1995-04-26|1995-05-12|TAKE BACK RETURN|SHIP|s affix blithely. furiously pending dolphi +41926|426|56|3|37|49077.54|0.08|0.04|A|F|1995-05-31|1995-04-29|1995-06-10|TAKE BACK RETURN|REG AIR|s. slyly final requests ar +41926|1967|12|4|29|54199.84|0.00|0.02|R|F|1995-03-26|1995-04-03|1995-04-03|TAKE BACK RETURN|MAIL|s could sleep. even, regular platelets ar +41926|147|48|5|22|23037.08|0.05|0.00|A|F|1995-04-12|1995-04-27|1995-04-15|TAKE BACK RETURN|MAIL| furiously even packages. carefully final +41927|1785|70|1|26|43856.28|0.05|0.02|R|F|1992-07-25|1992-08-30|1992-08-13|DELIVER IN PERSON|REG AIR|r courts alongside of the final pint +41952|785|82|1|43|72488.54|0.00|0.02|A|F|1993-09-29|1993-09-23|1993-10-17|NONE|SHIP|sual dugouts cajole blithely alongside of t +41952|1202|14|2|40|44128.00|0.09|0.01|A|F|1993-10-14|1993-10-13|1993-10-31|DELIVER IN PERSON|TRUCK|quests integrate requests. re +41952|1354|93|3|40|50214.00|0.09|0.07|R|F|1993-08-30|1993-09-29|1993-09-25|COLLECT COD|MAIL|ic instructio +41952|218|73|4|26|29073.46|0.04|0.08|A|F|1993-11-04|1993-09-10|1993-11-07|TAKE BACK RETURN|TRUCK|ent accounts are +41953|212|40|1|36|40039.56|0.00|0.08|N|O|1997-10-19|1997-10-15|1997-11-11|TAKE BACK RETURN|RAIL|into beans above the blithely stealthy dep +41954|1087|23|1|25|24702.00|0.08|0.05|N|O|1996-06-18|1996-07-03|1996-07-04|DELIVER IN PERSON|REG AIR|arefully pending requests cajole furio +41954|152|53|2|16|16834.40|0.01|0.06|N|O|1996-06-03|1996-06-30|1996-07-03|NONE|FOB|uickly unusual theodolites. furi +41954|1539|20|3|9|12964.77|0.10|0.00|N|O|1996-07-14|1996-07-30|1996-08-12|DELIVER IN PERSON|AIR| nag fluffily along the fluffily bo +41954|1373|12|4|6|7646.22|0.07|0.05|N|O|1996-05-23|1996-07-06|1996-05-31|DELIVER IN PERSON|REG AIR|ly final accounts +41954|143|44|5|31|32337.34|0.01|0.03|N|O|1996-08-19|1996-07-24|1996-09-18|DELIVER IN PERSON|RAIL|ly special +41954|978|13|6|1|1878.97|0.01|0.05|N|O|1996-07-21|1996-07-08|1996-08-17|COLLECT COD|AIR|ounts hang alongside of the fluffil +41955|1237|12|1|29|33008.67|0.05|0.05|N|O|1995-07-18|1995-06-10|1995-08-01|TAKE BACK RETURN|FOB|ic ideas. regular, slow gifts p +41955|1591|32|2|50|74629.50|0.02|0.04|R|F|1995-05-30|1995-06-15|1995-06-02|TAKE BACK RETURN|TRUCK|gular reque +41955|540|31|3|44|63383.76|0.10|0.04|N|O|1995-06-27|1995-06-25|1995-07-11|NONE|FOB|ake fluffily regular requests +41955|40|16|4|20|18800.80|0.01|0.01|R|F|1995-04-12|1995-06-06|1995-04-24|COLLECT COD|MAIL|. blithely regular multipliers sleep +41955|224|79|5|33|37099.26|0.01|0.04|N|O|1995-06-20|1995-06-26|1995-06-22|TAKE BACK RETURN|TRUCK|ial excuses. blithely bold theodolites +41955|996|31|6|18|34145.82|0.00|0.08|R|F|1995-04-27|1995-06-21|1995-05-21|NONE|REG AIR|fluffily. t +41955|1800|27|7|20|34036.00|0.05|0.07|N|O|1995-07-06|1995-06-23|1995-07-18|TAKE BACK RETURN|REG AIR|uests are. furiously th +41956|1524|25|1|6|8553.12|0.06|0.01|N|O|1996-03-24|1996-02-03|1996-04-15|COLLECT COD|AIR|ly ironic foxes. car +41956|1983|84|2|13|24504.74|0.07|0.03|N|O|1996-03-09|1996-01-23|1996-03-14|NONE|FOB|s. blithely even deposits doubt. excuses +41956|809|9|3|10|17098.00|0.07|0.05|N|O|1996-04-08|1996-03-05|1996-05-04|COLLECT COD|RAIL| the silent pa +41956|443|31|4|5|6717.20|0.03|0.08|N|O|1996-01-01|1996-03-03|1996-01-22|DELIVER IN PERSON|TRUCK|ular requests wake blithely furiously iron +41956|715|80|5|44|71091.24|0.08|0.08|N|O|1996-03-14|1996-02-03|1996-03-31|TAKE BACK RETURN|AIR|ckages along the slyly regular br +41956|875|42|6|24|42620.88|0.04|0.06|N|O|1995-12-14|1996-03-03|1995-12-18|DELIVER IN PERSON|REG AIR|less requests wake slow +41957|289|44|1|34|40435.52|0.01|0.03|N|O|1998-04-08|1998-03-06|1998-04-26|DELIVER IN PERSON|RAIL| carefully even +41957|1616|58|2|24|36422.64|0.02|0.08|N|O|1998-03-05|1998-03-14|1998-03-30|NONE|TRUCK|ly at the eve +41957|205|6|3|49|54154.80|0.02|0.06|N|O|1998-04-16|1998-02-17|1998-05-05|NONE|MAIL|deas nag pending, pending braids. r +41957|580|41|4|48|71067.84|0.01|0.02|N|O|1998-01-03|1998-02-03|1998-01-21|TAKE BACK RETURN|REG AIR|t Tiresias are furiously thinly +41957|1200|37|5|26|28631.20|0.08|0.06|N|O|1998-03-03|1998-03-03|1998-03-15|TAKE BACK RETURN|SHIP|ss ideas cajole fluffily. +41957|1158|95|6|18|19064.70|0.09|0.03|N|O|1998-03-27|1998-02-17|1998-03-31|DELIVER IN PERSON|FOB|haggle quickly regular requests. blithely r +41958|1794|95|1|13|22045.27|0.08|0.00|N|O|1997-06-15|1997-07-26|1997-07-10|NONE|REG AIR|unts among the blithely +41958|1600|21|2|37|55559.20|0.02|0.02|N|O|1997-06-07|1997-07-04|1997-06-27|COLLECT COD|AIR|e even courts. special +41958|959|28|3|21|39058.95|0.04|0.06|N|O|1997-07-20|1997-07-08|1997-07-26|NONE|AIR|. express, regular packa +41958|470|58|4|24|32891.28|0.05|0.08|N|O|1997-06-02|1997-07-31|1997-07-02|NONE|TRUCK|e furiously speci +41958|549|10|5|32|46385.28|0.09|0.02|N|O|1997-07-25|1997-07-29|1997-08-18|NONE|MAIL|arefully alongs +41958|1620|21|6|35|53256.70|0.06|0.00|N|O|1997-09-01|1997-07-22|1997-09-18|DELIVER IN PERSON|SHIP|hely carefully ev +41958|793|94|7|4|6775.16|0.09|0.03|N|O|1997-09-14|1997-08-20|1997-09-30|TAKE BACK RETURN|REG AIR|ual dolphins. slyly eve +41959|1894|24|1|3|5387.67|0.03|0.07|R|F|1993-05-15|1993-07-23|1993-06-01|DELIVER IN PERSON|REG AIR|thely even requests. even deposits ac +41959|111|38|2|38|38422.18|0.04|0.05|A|F|1993-08-01|1993-06-17|1993-08-17|TAKE BACK RETURN|FOB|s play blithely according to the f +41959|1561|42|3|47|68740.32|0.06|0.07|A|F|1993-06-17|1993-06-20|1993-07-14|NONE|REG AIR|ets. slyly ironic packages cajole. slyly s +41984|500|88|1|28|39214.00|0.06|0.02|N|O|1997-02-23|1997-04-29|1997-02-26|DELIVER IN PERSON|FOB|asymptotes. stealthily special packa +41984|1824|25|2|40|69032.80|0.07|0.06|N|O|1997-03-18|1997-04-28|1997-04-10|NONE|REG AIR|ses need to wake blithely b +41984|1914|3|3|42|76268.22|0.00|0.08|N|O|1997-03-15|1997-04-27|1997-04-01|TAKE BACK RETURN|TRUCK|press ideas. final theodolites in +41985|710|75|1|8|12885.68|0.04|0.00|N|O|1996-09-29|1996-09-30|1996-10-05|DELIVER IN PERSON|RAIL|inst the slyly ironic the +41985|1028|99|2|33|30657.66|0.00|0.00|N|O|1996-09-28|1996-09-07|1996-10-23|NONE|RAIL| pinto beans use +41985|1144|53|3|24|25083.36|0.02|0.08|N|O|1996-11-08|1996-08-16|1996-12-03|TAKE BACK RETURN|SHIP|long the requests. even, slow foxes +41985|308|9|4|33|39873.90|0.07|0.07|N|O|1996-09-16|1996-09-13|1996-10-04|TAKE BACK RETURN|AIR|ully quick re +41985|1409|10|5|1|1310.40|0.01|0.02|N|O|1996-08-29|1996-09-15|1996-09-02|DELIVER IN PERSON|MAIL|wind according to the instruc +41985|1301|40|6|11|13225.30|0.03|0.05|N|O|1996-07-20|1996-10-08|1996-08-16|TAKE BACK RETURN|FOB|ts grow. slyly bold packages affi +41985|1516|57|7|44|62370.44|0.06|0.06|N|O|1996-10-19|1996-09-02|1996-11-17|TAKE BACK RETURN|REG AIR|es nag. foxes sleep slyly against the furio +41986|1632|56|1|27|41408.01|0.01|0.08|A|F|1993-03-14|1993-04-24|1993-04-02|COLLECT COD|TRUCK|ronic packages h +41986|358|87|2|44|55367.40|0.03|0.06|R|F|1993-03-31|1993-04-10|1993-04-20|COLLECT COD|FOB|d deposits. blithely express package +41987|1454|33|1|2|2710.90|0.10|0.01|N|O|1996-02-04|1995-12-14|1996-02-18|COLLECT COD|MAIL|ickly regula +41987|1167|40|2|12|12817.92|0.08|0.04|N|O|1995-10-25|1995-11-28|1995-11-05|TAKE BACK RETURN|AIR|out the blithely special +41987|1510|11|3|14|19761.14|0.10|0.04|N|O|1995-12-17|1996-01-10|1995-12-20|NONE|RAIL|old packages. +41987|443|44|4|15|20151.60|0.07|0.05|N|O|1995-11-26|1995-12-08|1995-12-08|TAKE BACK RETURN|SHIP|s. theodolites promise sly +41987|551|82|5|22|31934.10|0.05|0.08|N|O|1996-01-23|1996-01-10|1996-02-08|DELIVER IN PERSON|REG AIR|pinto beans after the carefully silent ac +41987|1240|15|6|35|39943.40|0.02|0.01|N|O|1995-12-26|1995-12-24|1996-01-07|DELIVER IN PERSON|SHIP|tes? regula +41987|1245|83|7|10|11462.40|0.07|0.02|N|O|1995-12-05|1995-12-31|1995-12-14|NONE|RAIL|longside of the caref +41988|170|71|1|46|49227.82|0.03|0.08|A|F|1994-03-24|1994-03-07|1994-04-07|NONE|REG AIR|ts nag according to the ironic instruct +41988|1844|74|2|28|48883.52|0.10|0.05|A|F|1994-02-07|1994-04-02|1994-02-19|DELIVER IN PERSON|AIR|er the unusual +41988|666|67|3|1|1566.66|0.01|0.03|R|F|1994-03-03|1994-05-02|1994-03-16|TAKE BACK RETURN|FOB|yly regular notornis haggle q +41988|919|54|4|46|83715.86|0.09|0.05|R|F|1994-03-08|1994-03-08|1994-03-17|TAKE BACK RETURN|RAIL| express dinos sleep according to the even, +41988|588|49|5|49|72940.42|0.10|0.04|A|F|1994-02-22|1994-03-18|1994-03-07|COLLECT COD|AIR|lent foxes sleep fluffily. qu +41988|801|35|6|39|66370.20|0.10|0.07|A|F|1994-05-17|1994-04-17|1994-06-03|DELIVER IN PERSON|MAIL|uffily pending ideas nag. slyl +41989|1026|62|1|4|3708.08|0.10|0.08|A|F|1993-07-15|1993-06-26|1993-08-09|NONE|AIR|s should inte +41989|1446|25|2|46|61982.24|0.05|0.01|R|F|1993-07-17|1993-05-13|1993-07-28|COLLECT COD|TRUCK|dolites: slyly +41990|181|60|1|1|1081.18|0.10|0.01|N|O|1997-07-28|1997-08-05|1997-08-02|DELIVER IN PERSON|MAIL|y. quickly +41990|804|5|2|45|76716.00|0.04|0.02|N|O|1997-08-21|1997-08-23|1997-08-28|COLLECT COD|TRUCK|the, pending asymptotes. ironic waters nag +41990|1495|96|3|36|50273.64|0.05|0.03|N|O|1997-08-22|1997-08-13|1997-09-08|TAKE BACK RETURN|AIR|ily pending deposits are blithely +41990|390|75|4|37|47744.43|0.06|0.05|N|O|1997-07-16|1997-08-01|1997-07-25|NONE|MAIL|even packages. f +41990|648|11|5|7|10840.48|0.01|0.02|N|O|1997-07-31|1997-08-16|1997-08-04|NONE|FOB| alongside of the furiou +41990|1277|15|6|32|37704.64|0.03|0.01|N|O|1997-08-27|1997-07-16|1997-09-15|TAKE BACK RETURN|RAIL|ly unusual ideas ha +41991|1561|42|1|11|16088.16|0.02|0.02|N|O|1996-02-20|1996-01-23|1996-03-20|NONE|SHIP|o beans do wak +41991|1932|33|2|30|55017.90|0.10|0.06|N|O|1996-01-18|1996-02-02|1996-02-02|TAKE BACK RETURN|TRUCK|es. unusual, ironic +41991|1463|81|3|4|5457.84|0.00|0.05|N|O|1996-03-11|1996-02-20|1996-03-27|TAKE BACK RETURN|AIR|lyly against the care +41991|1881|82|4|46|82012.48|0.10|0.07|N|O|1996-01-17|1996-02-10|1996-02-01|NONE|RAIL|ckly even deposits. blithel +41991|1017|18|5|46|42228.46|0.03|0.05|N|O|1996-01-28|1996-01-20|1996-01-31|TAKE BACK RETURN|MAIL|excuses detect carefully platele +41991|1486|87|6|25|34687.00|0.01|0.04|N|O|1996-02-26|1996-02-17|1996-03-20|NONE|SHIP|pendencies wake furiou +42016|754|51|1|32|52952.00|0.00|0.07|A|F|1993-10-01|1993-09-13|1993-10-19|COLLECT COD|AIR|efully ironic deposits use blithely f +42016|360|61|2|48|60497.28|0.03|0.01|A|F|1993-08-16|1993-09-06|1993-08-26|DELIVER IN PERSON|SHIP|uriously about the slyly special +42016|1931|76|3|8|14663.44|0.05|0.08|R|F|1993-11-03|1993-10-01|1993-12-01|COLLECT COD|RAIL|quests. slyly +42016|1932|21|4|25|45848.25|0.04|0.01|R|F|1993-09-17|1993-09-11|1993-10-01|DELIVER IN PERSON|FOB|dencies use fluffily. reques +42016|278|60|5|15|17674.05|0.09|0.05|A|F|1993-08-07|1993-09-15|1993-09-04|DELIVER IN PERSON|TRUCK|rious ideas sub +42017|1259|71|1|13|15083.25|0.06|0.04|N|O|1995-09-15|1995-08-09|1995-10-14|NONE|AIR| along the quic +42017|353|54|2|36|45120.60|0.05|0.01|N|O|1995-08-01|1995-08-08|1995-08-07|DELIVER IN PERSON|FOB|manently even notornis. iro +42017|144|45|3|44|45942.16|0.09|0.06|N|O|1995-09-28|1995-08-23|1995-10-13|NONE|AIR|theodolites across the +42017|1599|100|4|7|10504.13|0.06|0.02|R|F|1995-06-02|1995-08-12|1995-06-16|DELIVER IN PERSON|SHIP|eposits should are after the express requ +42018|701|2|1|1|1601.70|0.10|0.07|N|O|1996-11-29|1996-11-12|1996-12-14|DELIVER IN PERSON|AIR|s boost accordin +42018|590|21|2|14|20868.26|0.04|0.04|N|O|1997-01-16|1996-11-12|1997-02-05|NONE|TRUCK|ve the deposits. fluffily iro +42018|1374|13|3|35|44637.95|0.08|0.02|N|O|1996-09-27|1996-12-14|1996-10-27|NONE|AIR|re blithely. e +42018|206|88|4|43|47566.60|0.02|0.08|N|O|1996-12-17|1996-11-18|1996-12-21|COLLECT COD|RAIL|he doggedly bold acc +42019|564|65|1|35|51259.60|0.07|0.08|N|O|1997-09-16|1997-07-28|1997-09-20|COLLECT COD|SHIP|s. blithely ironic packages ar +42020|814|81|1|44|75451.64|0.09|0.00|N|O|1995-07-04|1995-06-16|1995-07-24|DELIVER IN PERSON|REG AIR|leep quickly. fl +42020|1443|61|2|3|4033.32|0.01|0.03|N|O|1995-06-24|1995-05-21|1995-06-25|DELIVER IN PERSON|MAIL|furiously regular +42020|1361|38|3|8|10098.88|0.05|0.03|N|O|1995-07-12|1995-05-30|1995-07-21|NONE|REG AIR|inal escapades +42020|1278|16|4|9|10613.43|0.06|0.00|N|O|1995-06-28|1995-06-15|1995-07-11|DELIVER IN PERSON|FOB|nal, special foxes. fluffily +42020|1839|40|5|8|13926.64|0.02|0.01|N|O|1995-06-20|1995-04-21|1995-06-22|COLLECT COD|TRUCK|ntain slyly according to the d +42021|1870|71|1|33|58471.71|0.10|0.07|N|O|1996-07-18|1996-08-05|1996-07-21|COLLECT COD|REG AIR|se pending, bold deposits +42021|740|5|2|43|70551.82|0.08|0.07|N|O|1996-07-08|1996-09-09|1996-07-30|DELIVER IN PERSON|REG AIR|. regular, final acco +42021|1212|87|3|38|42301.98|0.00|0.01|N|O|1996-08-07|1996-07-17|1996-09-02|COLLECT COD|AIR|ar deposits must boost across +42021|224|79|4|40|44968.80|0.04|0.05|N|O|1996-07-18|1996-09-08|1996-08-12|DELIVER IN PERSON|TRUCK|requests across the furi +42022|1932|33|1|19|34844.67|0.05|0.01|A|F|1994-10-03|1994-12-14|1994-10-14|TAKE BACK RETURN|AIR|ss, regular ideas are s +42022|354|11|2|13|16306.55|0.01|0.07|A|F|1994-10-17|1994-12-15|1994-11-03|COLLECT COD|TRUCK|tions haggle +42022|640|41|3|4|6162.56|0.10|0.05|R|F|1995-01-12|1994-12-21|1995-01-26|COLLECT COD|MAIL|e. quickly silent pinto beans +42022|400|85|4|10|13004.00|0.10|0.02|R|F|1994-11-11|1994-12-17|1994-12-04|TAKE BACK RETURN|REG AIR|ong the quickly regular package +42023|150|77|1|50|52507.50|0.06|0.06|R|F|1992-11-12|1992-11-09|1992-12-10|DELIVER IN PERSON|REG AIR|ecial, ironic escapades with the fluffil +42023|215|16|2|47|52414.87|0.01|0.02|A|F|1992-11-29|1992-12-04|1992-12-27|DELIVER IN PERSON|RAIL| against the furious +42023|450|9|3|10|13504.50|0.02|0.07|R|F|1993-01-05|1992-12-10|1993-02-02|TAKE BACK RETURN|SHIP|s. final dependencies haggle agains +42023|486|87|4|18|24956.64|0.05|0.01|A|F|1992-10-30|1992-10-30|1992-11-23|TAKE BACK RETURN|MAIL|es nag fluffily slyly bol +42048|998|1|1|37|70262.63|0.01|0.00|N|O|1995-12-12|1995-11-09|1996-01-08|COLLECT COD|AIR| quickly regular patterns. +42048|1520|61|2|49|69654.48|0.07|0.02|N|O|1995-11-16|1995-12-02|1995-12-12|DELIVER IN PERSON|TRUCK|s. slyly ironic ideas along the always spe +42048|164|43|3|12|12769.92|0.02|0.07|N|O|1995-10-22|1995-12-24|1995-11-11|NONE|AIR|pinto beans cajole carefully alongside of t +42048|429|88|4|34|45200.28|0.02|0.06|N|O|1995-10-16|1996-01-01|1995-11-15|NONE|RAIL|its alongside of the furiou +42048|42|93|5|44|41449.76|0.05|0.01|N|O|1996-02-08|1995-11-23|1996-03-05|NONE|AIR|ate ironic +42049|1825|69|1|26|44897.32|0.10|0.04|N|O|1997-11-14|1997-10-18|1997-12-04|COLLECT COD|TRUCK| silent ideas. slyly final instr +42049|78|29|2|25|24451.75|0.05|0.07|N|O|1997-08-27|1997-11-02|1997-09-08|NONE|MAIL|ites. ideas sleep blithely pending, iron +42050|1840|70|1|23|40062.32|0.01|0.01|A|F|1995-04-21|1995-06-19|1995-05-12|DELIVER IN PERSON|MAIL|encies cajole accounts. furiously +42051|1853|54|1|11|19303.35|0.01|0.07|R|F|1993-01-24|1992-11-20|1993-02-02|COLLECT COD|FOB|y bold reque +42051|1568|89|2|30|44086.80|0.10|0.01|A|F|1993-01-05|1992-12-24|1993-01-07|NONE|RAIL|usly along t +42051|1554|95|3|28|40755.40|0.09|0.06|R|F|1992-11-07|1992-12-03|1992-11-11|TAKE BACK RETURN|FOB|bove the care +42052|238|93|1|28|31870.44|0.10|0.05|N|O|1995-09-21|1995-09-01|1995-10-01|COLLECT COD|AIR|counts sleep fluffily alon +42052|1878|79|2|39|69414.93|0.10|0.08|N|O|1995-08-20|1995-10-01|1995-09-10|DELIVER IN PERSON|AIR|hins cajole. +42052|1857|1|3|41|72112.85|0.02|0.07|N|O|1995-10-26|1995-08-12|1995-11-12|TAKE BACK RETURN|MAIL|efully regular +42052|1891|35|4|1|1792.89|0.08|0.08|N|O|1995-09-06|1995-09-10|1995-10-06|COLLECT COD|REG AIR|usly slyly bold deposits. fl +42053|1468|47|1|46|62995.16|0.10|0.03|N|O|1997-09-21|1997-08-28|1997-10-13|COLLECT COD|REG AIR|imes express inst +42053|1170|7|2|11|11782.87|0.02|0.04|N|O|1997-09-17|1997-07-29|1997-10-11|TAKE BACK RETURN|SHIP|ly final i +42053|193|46|3|10|10931.90|0.07|0.04|N|O|1997-10-17|1997-09-21|1997-10-24|DELIVER IN PERSON|SHIP| theodolites are aft +42053|1277|15|4|1|1178.27|0.07|0.02|N|O|1997-08-04|1997-08-04|1997-08-11|COLLECT COD|FOB|ss platelets use sly +42053|531|92|5|42|60124.26|0.03|0.08|N|O|1997-09-01|1997-08-28|1997-09-17|DELIVER IN PERSON|RAIL|pinto beans. careful +42053|423|24|6|46|60877.32|0.02|0.02|N|O|1997-10-10|1997-09-16|1997-10-22|TAKE BACK RETURN|MAIL|tes haggle s +42054|299|54|1|11|13192.19|0.03|0.08|A|F|1992-10-08|1992-12-12|1992-10-19|DELIVER IN PERSON|AIR|, regular requests are carefully. r +42054|608|40|2|49|73921.40|0.05|0.00|R|F|1992-09-21|1992-10-18|1992-09-29|TAKE BACK RETURN|TRUCK|arefully unusua +42054|637|100|3|2|3075.26|0.01|0.05|A|F|1992-12-06|1992-11-19|1992-12-31|COLLECT COD|RAIL|g to the packages. blithe +42054|785|82|4|45|75860.10|0.03|0.08|R|F|1992-10-27|1992-10-21|1992-11-21|TAKE BACK RETURN|FOB| accounts. carefully +42054|690|53|5|15|23860.35|0.02|0.08|R|F|1992-09-16|1992-11-14|1992-10-16|NONE|AIR|ckages sleep furiously re +42055|1691|33|1|41|65300.29|0.03|0.05|N|O|1996-04-18|1996-04-08|1996-05-02|TAKE BACK RETURN|MAIL|xpress, unusual re +42055|87|13|2|23|22702.84|0.02|0.03|N|O|1996-01-25|1996-03-14|1996-01-26|DELIVER IN PERSON|REG AIR|f the accounts ar +42055|1176|49|3|46|49549.82|0.06|0.02|N|O|1996-03-27|1996-03-25|1996-04-24|TAKE BACK RETURN|MAIL|deposits engage furiously. fluffily f +42080|1762|89|1|25|41594.00|0.00|0.00|N|O|1996-08-03|1996-09-24|1996-08-09|NONE|AIR|ndencies sleep daringly across the slowl +42080|1271|72|2|27|31651.29|0.05|0.01|N|O|1996-09-09|1996-10-14|1996-10-08|TAKE BACK RETURN|SHIP| unusual dependencies a +42081|1177|14|1|23|24797.91|0.05|0.02|A|F|1995-03-31|1995-03-21|1995-04-02|NONE|SHIP|ions. slyly unusual deposits lose slyly. i +42081|654|86|2|7|10882.55|0.02|0.02|A|F|1995-04-29|1995-03-05|1995-05-13|COLLECT COD|MAIL|etect furiously beside the carefu +42081|829|63|3|29|50164.78|0.07|0.08|R|F|1995-04-08|1995-03-14|1995-05-06|TAKE BACK RETURN|REG AIR|ns nag carefully. dolphins wake slyly sly +42081|1515|56|4|39|55243.89|0.08|0.03|R|F|1995-02-18|1995-03-05|1995-02-20|COLLECT COD|TRUCK|tions promise. quickly even req +42081|1633|75|5|50|76731.50|0.09|0.04|A|F|1995-04-19|1995-02-23|1995-04-30|NONE|SHIP|inal foxes dazzle furiously. blithely re +42081|54|80|6|48|45794.40|0.03|0.04|R|F|1995-03-09|1995-03-17|1995-03-21|TAKE BACK RETURN|MAIL|the ironic +42081|941|42|7|3|5525.82|0.09|0.03|A|F|1995-03-25|1995-04-04|1995-04-17|COLLECT COD|FOB|final packages. carefully ironic +42082|39|65|1|47|44134.41|0.07|0.08|N|O|1996-02-20|1996-02-03|1996-03-21|COLLECT COD|TRUCK|y deposits use furiously +42082|1178|87|2|19|20504.23|0.09|0.06|N|O|1996-01-31|1996-02-06|1996-02-06|TAKE BACK RETURN|TRUCK| pinto beans. unusual pinto beans wak +42082|182|83|3|39|42205.02|0.05|0.03|N|O|1996-01-08|1996-03-16|1996-02-03|DELIVER IN PERSON|RAIL|r pinto bean +42082|615|9|4|41|62140.01|0.10|0.06|N|O|1996-04-18|1996-02-08|1996-05-17|DELIVER IN PERSON|TRUCK|tions use fina +42082|182|35|5|44|47615.92|0.07|0.04|N|O|1996-03-10|1996-03-15|1996-03-12|COLLECT COD|TRUCK|gular ideas by t +42082|445|33|6|28|37672.32|0.07|0.01|N|O|1996-03-12|1996-03-18|1996-04-09|COLLECT COD|FOB|ifts? furiously +42083|648|11|1|49|75883.36|0.05|0.02|N|O|1996-02-05|1996-02-20|1996-02-07|TAKE BACK RETURN|MAIL|osits boost along the carefully unusual pac +42083|372|73|2|17|21630.29|0.07|0.02|N|O|1996-03-25|1996-02-26|1996-04-22|COLLECT COD|FOB|refully pe +42083|834|68|3|29|50310.07|0.03|0.05|N|O|1996-02-16|1996-02-16|1996-03-01|TAKE BACK RETURN|AIR|ructions caj +42084|1810|54|1|19|32524.39|0.03|0.00|N|O|1997-04-09|1997-03-21|1997-04-11|TAKE BACK RETURN|TRUCK|ss packages. slyly silent packages cajole +42084|1732|75|2|23|37575.79|0.08|0.03|N|O|1997-05-21|1997-03-28|1997-06-14|DELIVER IN PERSON|REG AIR|ss the carefully express deposits +42084|1549|90|3|31|44966.74|0.06|0.00|N|O|1997-03-29|1997-05-15|1997-04-06|DELIVER IN PERSON|TRUCK|uriously. packages haggle fluffily al +42084|77|53|4|45|43968.15|0.04|0.07|N|O|1997-03-16|1997-04-21|1997-04-13|NONE|RAIL|pending deposits integrate furiously carefu +42084|885|52|5|43|76792.84|0.10|0.02|N|O|1997-03-21|1997-05-14|1997-04-14|COLLECT COD|MAIL|y regular decoys. requests +42084|1798|41|6|44|74790.76|0.08|0.04|N|O|1997-03-23|1997-04-10|1997-04-14|TAKE BACK RETURN|RAIL|uickly silent accounts sublate along +42085|965|68|1|20|37319.20|0.10|0.01|N|O|1998-08-18|1998-08-30|1998-09-06|TAKE BACK RETURN|RAIL|s cajole carefully. carefully brave +42085|1256|57|2|39|45132.75|0.01|0.00|N|O|1998-07-22|1998-08-29|1998-07-29|TAKE BACK RETURN|FOB|xpress accounts against the deposits d +42085|1358|73|3|32|40299.20|0.07|0.02|N|O|1998-09-25|1998-08-22|1998-10-23|DELIVER IN PERSON|REG AIR|requests cajole. slyly i +42085|373|30|4|32|40747.84|0.08|0.04|N|O|1998-10-13|1998-09-22|1998-10-14|COLLECT COD|MAIL|eposits mold slyly along the +42086|481|82|1|8|11051.84|0.02|0.03|R|F|1993-10-07|1993-09-22|1993-10-23|NONE|FOB|e furiously slyly ruthless depen +42087|1217|92|1|2|2236.42|0.07|0.07|N|O|1997-05-26|1997-06-23|1997-06-01|NONE|AIR|ic theodolites. even, +42087|1395|10|2|12|15556.68|0.10|0.02|N|O|1997-06-23|1997-05-24|1997-07-22|TAKE BACK RETURN|FOB|ly against the accounts. carefu +42087|989|24|3|23|43469.54|0.02|0.07|N|O|1997-07-20|1997-05-23|1997-07-28|DELIVER IN PERSON|AIR|uffily along the quickly ev +42087|191|44|4|19|20732.61|0.05|0.00|N|O|1997-07-05|1997-06-11|1997-08-04|TAKE BACK RETURN|FOB|s boost. pending orbits use b +42087|618|12|5|35|53151.35|0.08|0.07|N|O|1997-05-23|1997-05-30|1997-05-28|DELIVER IN PERSON|RAIL| the quickly final d +42087|1322|23|6|35|42816.20|0.06|0.07|N|O|1997-04-11|1997-06-11|1997-04-20|DELIVER IN PERSON|FOB|tes eat carefully. ironic depos +42112|567|28|1|27|39624.12|0.03|0.03|R|F|1994-02-28|1994-01-29|1994-03-27|DELIVER IN PERSON|FOB|requests. blithely final requests cajol +42112|1510|51|2|17|23995.67|0.08|0.04|A|F|1994-01-05|1994-03-04|1994-01-18|COLLECT COD|RAIL|dolites with the i +42112|773|74|3|37|61929.49|0.10|0.06|R|F|1994-04-18|1994-02-26|1994-04-22|TAKE BACK RETURN|RAIL| bold deposits. quick +42112|150|3|4|27|28354.05|0.01|0.06|R|F|1994-03-28|1994-02-21|1994-04-03|COLLECT COD|AIR|ending ideas must h +42113|883|50|1|14|24974.32|0.08|0.07|A|F|1994-03-11|1994-04-19|1994-03-15|NONE|AIR|thely instructio +42114|1757|42|1|5|8293.75|0.08|0.01|N|O|1997-04-20|1997-03-31|1997-05-20|NONE|FOB|ording to the careful +42114|584|85|2|2|2969.16|0.05|0.08|N|O|1997-03-19|1997-04-04|1997-03-26|NONE|REG AIR|at the regular, special excuses integr +42114|92|68|3|40|39683.60|0.09|0.02|N|O|1997-02-26|1997-05-06|1997-03-12|TAKE BACK RETURN|RAIL| accounts against the final pinto beans are +42115|1400|39|1|38|49453.20|0.00|0.04|A|F|1992-03-07|1992-04-08|1992-03-20|COLLECT COD|REG AIR|the theodolites. express excuses +42115|1921|22|2|1|1822.92|0.05|0.06|A|F|1992-05-03|1992-05-18|1992-05-27|DELIVER IN PERSON|MAIL|usily. even, even deposits nag ironical +42115|163|16|3|26|27642.16|0.02|0.07|R|F|1992-02-29|1992-05-16|1992-03-16|NONE|SHIP|among the pinto beans. carefully sile +42115|1484|2|4|31|42949.88|0.09|0.03|A|F|1992-05-12|1992-05-12|1992-05-16|DELIVER IN PERSON|MAIL|s accounts eat furiously bo +42115|1215|53|5|7|7813.47|0.00|0.05|A|F|1992-03-03|1992-04-09|1992-03-24|COLLECT COD|TRUCK| regular accounts c +42115|450|38|6|19|25658.55|0.02|0.02|R|F|1992-05-16|1992-03-20|1992-06-15|DELIVER IN PERSON|MAIL|g the careful +42115|153|6|7|50|52657.50|0.09|0.03|R|F|1992-06-19|1992-04-23|1992-07-07|TAKE BACK RETURN|AIR|cial deposits. final, unusual pac +42116|933|34|1|18|33010.74|0.09|0.03|N|O|1996-10-06|1996-11-21|1996-11-02|NONE|TRUCK|lly. slyly pending ideas at the fur +42116|1819|49|2|15|25812.15|0.03|0.06|N|O|1996-09-08|1996-10-13|1996-10-03|DELIVER IN PERSON|REG AIR|quickly final foxes impress ac +42116|1877|7|3|16|28461.92|0.01|0.03|N|O|1996-12-20|1996-11-15|1997-01-01|TAKE BACK RETURN|AIR|he bold packages s +42116|1080|81|4|28|27470.24|0.05|0.08|N|O|1996-11-21|1996-10-20|1996-12-13|COLLECT COD|REG AIR| ironic account +42116|997|32|5|3|5693.97|0.09|0.07|N|O|1996-12-25|1996-10-09|1997-01-05|COLLECT COD|AIR|leep furiously carefully final deposits. +42116|886|53|6|1|1786.88|0.06|0.03|N|O|1996-10-15|1996-11-08|1996-11-04|NONE|REG AIR|final ideas beyond the fluffily regular +42117|773|70|1|36|60255.72|0.03|0.00|N|F|1995-06-12|1995-05-04|1995-06-19|COLLECT COD|MAIL|quests are fluffily. slyly i +42117|623|86|2|10|15236.20|0.10|0.08|R|F|1995-02-26|1995-05-01|1995-03-06|TAKE BACK RETURN|FOB|nd the never unusual theodolites are carefu +42117|327|28|3|47|57684.04|0.07|0.06|A|F|1995-03-09|1995-04-15|1995-04-01|DELIVER IN PERSON|RAIL|ts use after the slyly express theodoli +42117|1852|82|4|15|26307.75|0.04|0.06|R|F|1995-06-01|1995-04-27|1995-06-17|DELIVER IN PERSON|TRUCK|s. slyly enticing sauternes m +42118|1699|41|1|11|17607.59|0.03|0.08|N|O|1996-10-16|1996-10-03|1996-10-18|TAKE BACK RETURN|REG AIR|s haggle slyly: dep +42118|578|39|2|49|72449.93|0.07|0.07|N|O|1996-10-06|1996-10-09|1996-10-11|DELIVER IN PERSON|SHIP|round the quickly unusu +42118|1231|32|3|17|19247.91|0.08|0.05|N|O|1996-10-23|1996-10-01|1996-10-27|NONE|AIR|ide of the ironic deposits use carefully +42118|1338|77|4|47|58248.51|0.10|0.02|N|O|1996-09-04|1996-09-02|1996-09-21|TAKE BACK RETURN|SHIP|ckages! busy, final dep +42118|1088|59|5|18|17803.44|0.00|0.01|N|O|1996-09-17|1996-10-02|1996-10-09|NONE|TRUCK|ly express dinos are +42118|817|18|6|14|24049.34|0.01|0.04|N|O|1996-10-24|1996-08-23|1996-11-13|DELIVER IN PERSON|AIR|y ironic theodolites. +42119|37|63|1|27|25299.81|0.02|0.00|N|O|1998-04-05|1998-05-12|1998-04-10|TAKE BACK RETURN|RAIL|ts against the slyly permanent accounts ca +42119|528|19|2|35|49998.20|0.04|0.02|N|O|1998-03-30|1998-03-30|1998-04-21|NONE|MAIL|phins acco +42119|596|87|3|8|11972.72|0.02|0.03|N|O|1998-03-08|1998-04-01|1998-03-09|NONE|RAIL| instructions wake c +42119|303|88|4|49|58961.70|0.02|0.05|N|O|1998-03-24|1998-04-07|1998-03-25|DELIVER IN PERSON|FOB|ronic requests are +42144|653|16|1|42|65253.30|0.08|0.03|R|F|1994-12-09|1995-01-13|1995-01-04|DELIVER IN PERSON|FOB|fully silent requests wa +42144|447|48|2|2|2694.88|0.02|0.01|A|F|1994-11-22|1995-01-13|1994-11-29|TAKE BACK RETURN|AIR|e carefully aft +42144|696|59|3|40|63867.60|0.08|0.05|A|F|1995-01-18|1995-01-29|1995-01-27|NONE|RAIL|nusual excuses are +42144|1488|67|4|8|11115.84|0.07|0.01|A|F|1994-11-16|1995-01-27|1994-11-25|COLLECT COD|RAIL|s; packages nag after the slyl +42144|737|34|5|27|44218.71|0.03|0.01|A|F|1994-12-18|1995-02-05|1995-01-01|DELIVER IN PERSON|MAIL|nic foxes haggle care +42145|608|71|1|34|51292.40|0.05|0.02|N|O|1998-02-21|1997-12-27|1998-03-02|TAKE BACK RETURN|SHIP|ual accounts maintain against th +42145|1433|12|2|19|25354.17|0.00|0.04|N|O|1998-01-20|1998-02-15|1998-02-02|NONE|AIR|express asymptotes are idly spe +42145|1320|59|3|8|9770.56|0.10|0.01|N|O|1997-12-04|1998-01-24|1997-12-12|COLLECT COD|TRUCK|sual instr +42145|1961|94|4|36|67066.56|0.00|0.01|N|O|1998-01-01|1998-01-06|1998-01-23|NONE|AIR|packages. regular +42146|774|71|1|43|72015.11|0.03|0.01|N|O|1998-05-09|1998-04-19|1998-05-26|NONE|RAIL|ffily pending packages nod ca +42146|823|23|2|6|10342.92|0.10|0.03|N|O|1998-03-19|1998-03-07|1998-03-27|TAKE BACK RETURN|AIR|ideas. deposits nag slyly unu +42147|2|28|1|21|18942.00|0.00|0.04|N|O|1997-09-25|1997-07-16|1997-09-29|COLLECT COD|REG AIR|cial, final de +42147|1452|31|2|24|32482.80|0.06|0.06|N|O|1997-07-26|1997-07-16|1997-08-19|COLLECT COD|AIR|otes. care +42147|1962|63|3|19|35415.24|0.05|0.03|N|O|1997-09-25|1997-08-23|1997-10-23|COLLECT COD|REG AIR|quests sleep bl +42147|1154|91|4|50|52757.50|0.01|0.02|N|O|1997-07-18|1997-08-21|1997-08-05|COLLECT COD|AIR|ly careful +42147|955|90|5|16|29695.20|0.08|0.06|N|O|1997-09-05|1997-07-24|1997-09-22|NONE|REG AIR|notornis snooze furiously blith +42147|1960|93|6|19|35377.24|0.02|0.00|N|O|1997-10-08|1997-08-07|1997-11-06|DELIVER IN PERSON|SHIP| packages breach carefully +42147|1034|5|7|9|8415.27|0.03|0.00|N|O|1997-07-11|1997-07-21|1997-07-16|COLLECT COD|RAIL|r the carefully regular ideas. i +42148|576|37|1|33|48726.81|0.08|0.08|N|O|1995-12-17|1995-12-10|1996-01-05|TAKE BACK RETURN|REG AIR|asymptotes. furiously pending instru +42148|1069|75|2|37|35892.22|0.00|0.03|N|O|1996-01-21|1995-12-14|1996-02-11|DELIVER IN PERSON|REG AIR|ously at the excuse +42148|1901|46|3|19|34255.10|0.01|0.06|N|O|1996-01-06|1995-12-05|1996-01-08|NONE|RAIL|e blithely. +42148|1819|6|4|32|55065.92|0.00|0.07|N|O|1995-11-23|1995-12-07|1995-11-28|NONE|TRUCK|en pinto beans accordin +42148|867|1|5|25|44196.50|0.02|0.06|N|O|1995-12-25|1996-01-17|1995-12-29|TAKE BACK RETURN|MAIL|ans boost. packages across the i +42149|1218|56|1|6|6715.26|0.08|0.04|N|O|1996-06-01|1996-05-11|1996-06-06|NONE|FOB| carefully regular asymptotes. expres +42149|701|34|2|22|35237.40|0.05|0.02|N|O|1996-05-27|1996-05-28|1996-06-13|TAKE BACK RETURN|REG AIR| ironic theodolites dazzle sl +42150|226|8|1|9|10135.98|0.07|0.00|N|O|1998-02-03|1998-02-28|1998-02-05|COLLECT COD|AIR|usly pending packages. final packages +42150|994|29|2|40|75799.60|0.02|0.02|N|O|1998-03-19|1998-02-16|1998-04-17|TAKE BACK RETURN|SHIP|bove the final excus +42150|1147|48|3|15|15722.10|0.05|0.07|N|O|1998-02-25|1998-02-03|1998-03-12|COLLECT COD|AIR|ly bold accounts cajole blithely across the +42150|585|86|4|34|50509.72|0.05|0.08|N|O|1998-01-03|1998-03-18|1998-01-18|TAKE BACK RETURN|SHIP|ges boost slyly express foxes. bold, bold i +42150|1653|77|5|41|63740.65|0.01|0.08|N|O|1998-01-16|1998-03-02|1998-01-19|DELIVER IN PERSON|MAIL|te doggedly carefull +42151|1366|43|1|3|3802.08|0.07|0.01|A|F|1994-01-09|1994-02-28|1994-01-20|COLLECT COD|AIR|tions! unus +42151|1944|77|2|19|35072.86|0.09|0.03|A|F|1994-03-02|1994-02-18|1994-03-28|NONE|REG AIR|ss theodolites integrate quickly special +42151|252|7|3|18|20740.50|0.03|0.04|A|F|1994-02-19|1994-02-17|1994-03-19|DELIVER IN PERSON|MAIL| ironic, express dependencies nag: +42151|1605|88|4|2|3013.20|0.08|0.02|A|F|1994-02-06|1994-01-27|1994-02-18|NONE|AIR|thely bold requests. fluffily even asym +42176|159|38|1|26|27537.90|0.00|0.07|N|O|1998-02-23|1998-03-18|1998-03-21|DELIVER IN PERSON|AIR|gle furiously furiously ironic p +42176|1511|12|2|31|43787.81|0.00|0.08|N|O|1998-02-10|1998-04-04|1998-03-07|DELIVER IN PERSON|SHIP|y regular requests are al +42176|1674|75|3|18|28362.06|0.03|0.00|N|O|1998-05-20|1998-03-06|1998-05-26|DELIVER IN PERSON|SHIP|es haggle express pinto beans. reg +42176|872|73|4|50|88643.50|0.02|0.05|N|O|1998-02-08|1998-03-13|1998-02-20|COLLECT COD|MAIL| accounts. sly +42176|1870|71|5|39|69102.93|0.00|0.06|N|O|1998-03-21|1998-03-19|1998-03-23|TAKE BACK RETURN|SHIP|even courts doubt. bli +42177|696|28|1|3|4790.07|0.08|0.03|A|F|1992-08-08|1992-08-09|1992-09-04|DELIVER IN PERSON|REG AIR| close pinto beans wake. ironic, speci +42177|1134|35|2|48|49686.24|0.06|0.02|R|F|1992-06-29|1992-07-12|1992-07-01|DELIVER IN PERSON|AIR|bout the carefully re +42177|1121|58|3|37|37818.44|0.06|0.01|R|F|1992-08-12|1992-08-18|1992-08-15|COLLECT COD|TRUCK|dolites integrate alongside +42177|909|44|4|19|34388.10|0.03|0.00|R|F|1992-07-29|1992-07-31|1992-08-06|TAKE BACK RETURN|MAIL| beans affix quickly according t +42178|1726|27|1|9|14649.48|0.05|0.04|A|F|1993-10-11|1993-09-04|1993-11-09|COLLECT COD|SHIP|ironic, unusu +42178|8|84|2|49|44492.00|0.00|0.06|R|F|1993-09-15|1993-09-20|1993-09-29|DELIVER IN PERSON|FOB|lly after th +42178|696|59|3|14|22353.66|0.07|0.00|A|F|1993-10-12|1993-08-14|1993-11-06|COLLECT COD|SHIP|atelets. f +42179|1819|6|1|32|55065.92|0.05|0.06|N|O|1996-08-03|1996-06-22|1996-08-11|NONE|RAIL| dependencies haggle furi +42179|1300|75|2|34|40844.20|0.05|0.00|N|O|1996-05-08|1996-06-16|1996-05-14|TAKE BACK RETURN|SHIP|ong the even pinto beans. bold requ +42179|501|32|3|16|22424.00|0.07|0.03|N|O|1996-08-15|1996-06-04|1996-08-30|TAKE BACK RETURN|FOB|ts detect slyly. quickly even instructi +42179|1872|73|4|28|49668.36|0.07|0.05|N|O|1996-05-26|1996-06-20|1996-05-29|COLLECT COD|FOB|tes: regular epitaphs nag above the +42179|348|5|5|3|3745.02|0.06|0.02|N|O|1996-07-14|1996-07-01|1996-07-21|COLLECT COD|TRUCK|rns. unusual, final fox +42179|620|83|6|13|19768.06|0.08|0.01|N|O|1996-05-19|1996-07-06|1996-05-24|DELIVER IN PERSON|TRUCK|ously final foxes use slyly. blithely fin +42179|194|21|7|49|53615.31|0.01|0.02|N|O|1996-04-22|1996-06-03|1996-05-21|TAKE BACK RETURN|AIR|fter the carefully regular deposits. +42180|645|39|1|16|24730.24|0.06|0.05|N|O|1997-11-14|1997-08-29|1997-12-10|TAKE BACK RETURN|FOB|ss the packages are quickly special the +42180|233|34|2|6|6799.38|0.10|0.01|N|O|1997-07-28|1997-09-12|1997-08-25|DELIVER IN PERSON|TRUCK|arefully ironic instructions cajole quick +42180|549|10|3|27|39137.58|0.04|0.08|N|O|1997-08-07|1997-08-31|1997-08-21|NONE|MAIL|ly even deposits at the blithely p +42180|56|57|4|10|9560.50|0.04|0.05|N|O|1997-11-18|1997-08-30|1997-11-30|NONE|MAIL|unts nag quickly across the blithely regula +42180|1061|32|5|4|3848.24|0.02|0.03|N|O|1997-08-17|1997-09-22|1997-08-31|DELIVER IN PERSON|SHIP|requests use quickly ironic accounts! ca +42180|1011|47|6|1|912.01|0.04|0.02|N|O|1997-09-28|1997-09-11|1997-10-10|COLLECT COD|AIR|y. finally pending deposits are acros +42180|1774|59|7|21|35191.17|0.06|0.08|N|O|1997-11-03|1997-09-06|1997-11-13|NONE|REG AIR|ffix among the +42181|1999|32|1|8|15207.92|0.05|0.05|N|O|1996-01-02|1995-11-19|1996-01-20|DELIVER IN PERSON|RAIL|ymptotes use after the quickly special pin +42181|1608|9|2|26|39249.60|0.08|0.03|N|O|1996-02-12|1995-12-19|1996-03-13|COLLECT COD|REG AIR|, bold theodolites around the furiously s +42181|1124|97|3|23|23577.76|0.00|0.01|N|O|1995-12-15|1995-11-20|1995-12-19|TAKE BACK RETURN|FOB|l sheaves haggle bl +42181|848|82|4|14|24483.76|0.07|0.07|N|O|1995-11-18|1995-12-01|1995-12-10|TAKE BACK RETURN|FOB|entiments above the r +42181|1465|5|5|24|32795.04|0.08|0.05|N|O|1995-11-11|1995-12-15|1995-11-23|DELIVER IN PERSON|FOB|old pinto beans. regular pack +42182|1669|70|1|8|12565.28|0.07|0.08|R|F|1993-08-30|1993-09-25|1993-09-09|COLLECT COD|FOB| gifts snooze care +42183|827|28|1|18|31100.76|0.06|0.02|N|O|1998-04-04|1998-03-28|1998-04-13|DELIVER IN PERSON|SHIP|uickly ironic deposits. packages use quickl +42208|124|25|1|38|38916.56|0.07|0.02|R|F|1993-02-03|1993-01-20|1993-02-10|DELIVER IN PERSON|TRUCK| foxes kin +42208|1994|27|2|43|81527.57|0.00|0.05|A|F|1993-02-19|1993-01-20|1993-03-07|NONE|MAIL|he unusual, final requests are slyly +42209|1539|80|1|45|64823.85|0.00|0.05|A|F|1993-06-07|1993-06-11|1993-06-28|COLLECT COD|AIR|ully about the furiously regu +42209|1477|78|2|35|48246.45|0.07|0.00|A|F|1993-05-27|1993-05-26|1993-06-21|TAKE BACK RETURN|MAIL| the pending accounts. blithely quiet re +42209|1665|48|3|33|51699.78|0.03|0.02|A|F|1993-06-03|1993-06-08|1993-06-24|NONE|TRUCK|slyly pending pint +42209|1786|71|4|29|48945.62|0.10|0.00|A|F|1993-06-29|1993-05-12|1993-07-22|DELIVER IN PERSON|MAIL|d sleep slyly. qu +42209|1273|74|5|22|25833.94|0.04|0.05|R|F|1993-06-08|1993-06-25|1993-06-26|NONE|RAIL| even dolphins after the furiously even +42210|1702|3|1|12|19244.40|0.08|0.08|R|F|1994-07-27|1994-06-17|1994-07-31|COLLECT COD|MAIL| foxes. speci +42210|1762|47|2|16|26620.16|0.05|0.01|R|F|1994-06-10|1994-07-17|1994-06-24|TAKE BACK RETURN|MAIL|structions h +42211|1663|46|1|50|78233.00|0.06|0.01|R|F|1992-09-04|1992-08-03|1992-09-22|COLLECT COD|REG AIR|ctions above the platel +42211|548|79|2|35|50698.90|0.05|0.06|R|F|1992-10-17|1992-08-20|1992-11-04|NONE|AIR|ly ironic requests +42211|1843|87|3|50|87242.00|0.05|0.03|R|F|1992-08-07|1992-08-19|1992-08-28|TAKE BACK RETURN|TRUCK|final theodolites accord +42211|846|47|4|34|59392.56|0.04|0.08|R|F|1992-07-09|1992-09-06|1992-08-02|COLLECT COD|SHIP| brave reque +42212|665|59|1|8|12525.28|0.01|0.07|R|F|1992-08-13|1992-07-11|1992-08-27|TAKE BACK RETURN|TRUCK| final accounts. blithely re +42212|1081|52|2|20|19641.60|0.06|0.08|R|F|1992-05-24|1992-05-24|1992-06-02|NONE|FOB|fter the quickly special +42212|1594|35|3|50|74779.50|0.04|0.02|R|F|1992-06-20|1992-05-24|1992-07-18|NONE|MAIL|ts above the furiously bold requ +42212|1587|28|4|48|71451.84|0.10|0.02|A|F|1992-06-11|1992-07-09|1992-06-25|DELIVER IN PERSON|MAIL| even asymptotes sleep quickly unusual +42212|521|12|5|43|61125.36|0.09|0.04|R|F|1992-05-12|1992-06-11|1992-05-26|NONE|REG AIR|s cajole furiously. sly +42212|1652|94|6|17|26412.05|0.08|0.00|R|F|1992-06-02|1992-06-10|1992-07-01|COLLECT COD|SHIP|s. ironic dependencies dazz +42213|1677|60|1|25|39466.75|0.00|0.03|N|O|1995-06-22|1995-05-07|1995-07-15|COLLECT COD|TRUCK|sual, regular de +42213|1381|58|2|5|6411.90|0.07|0.01|R|F|1995-05-23|1995-04-29|1995-06-06|TAKE BACK RETURN|MAIL|osits. regu +42213|1471|72|3|33|45291.51|0.03|0.08|N|O|1995-07-10|1995-05-06|1995-07-14|DELIVER IN PERSON|FOB|tegrate furiously. fluffily +42213|1836|37|4|4|6951.32|0.07|0.04|R|F|1995-04-29|1995-05-15|1995-05-17|TAKE BACK RETURN|TRUCK|ly special warhors +42214|707|8|1|38|61092.60|0.08|0.04|N|F|1995-06-03|1995-08-21|1995-06-26|TAKE BACK RETURN|AIR|posits. final, special packages wak +42214|1481|60|2|49|67741.52|0.06|0.08|R|F|1995-06-06|1995-07-19|1995-06-16|NONE|RAIL|theodolites are +42214|637|38|3|14|21526.82|0.05|0.01|N|O|1995-08-30|1995-08-01|1995-08-31|COLLECT COD|TRUCK|ly final accounts nag +42214|915|18|4|15|27238.65|0.01|0.07|N|O|1995-06-28|1995-08-09|1995-07-28|COLLECT COD|MAIL|le. quickly even pl +42214|1286|61|5|43|51053.04|0.03|0.04|N|F|1995-06-02|1995-07-02|1995-06-21|NONE|FOB| through the caref +42214|61|62|6|17|16338.02|0.03|0.08|N|F|1995-06-05|1995-07-05|1995-06-18|COLLECT COD|FOB|carefully even packag +42214|1581|22|7|41|60785.78|0.03|0.00|N|O|1995-09-05|1995-07-08|1995-09-16|NONE|FOB|gle slyly. quickly ironic courts hagg +42215|1668|92|1|33|51798.78|0.09|0.02|A|F|1993-12-22|1993-12-10|1994-01-04|COLLECT COD|SHIP|y bold asymptotes nag furiously sl +42215|193|72|2|15|16397.85|0.00|0.05|A|F|1993-11-24|1993-12-17|1993-12-15|DELIVER IN PERSON|AIR|ost furiously furiously ironic packag +42240|251|6|1|13|14966.25|0.06|0.06|N|O|1996-04-06|1996-06-11|1996-04-07|TAKE BACK RETURN|MAIL|theodolites. r +42240|848|82|2|14|24483.76|0.08|0.08|N|O|1996-06-07|1996-04-18|1996-06-22|NONE|AIR|leep slyly acc +42240|407|8|3|40|52296.00|0.04|0.07|N|O|1996-05-27|1996-04-25|1996-06-14|COLLECT COD|SHIP|packages wake blithely throughout the fi +42240|1328|43|4|41|50402.12|0.07|0.06|N|O|1996-05-19|1996-05-01|1996-05-26|COLLECT COD|AIR| theodolites boost carefu +42240|1198|99|5|45|49463.55|0.00|0.01|N|O|1996-04-19|1996-06-07|1996-05-01|TAKE BACK RETURN|AIR|al accounts. slyly ironic pac +42240|731|64|6|38|62005.74|0.05|0.00|N|O|1996-05-15|1996-05-17|1996-06-01|DELIVER IN PERSON|MAIL|oxes. furiously silent pi +42241|1856|86|1|46|80861.10|0.09|0.02|R|F|1992-05-21|1992-06-21|1992-06-05|NONE|MAIL|sts affix beyond +42241|1219|31|2|37|41447.77|0.10|0.04|A|F|1992-06-06|1992-07-13|1992-06-28|TAKE BACK RETURN|AIR|furiously final dugouts wake slyly +42241|994|29|3|32|60639.68|0.03|0.08|R|F|1992-07-01|1992-05-30|1992-07-24|COLLECT COD|RAIL|ickly final pinto b +42242|1657|99|1|31|48318.15|0.09|0.00|R|F|1994-06-29|1994-06-01|1994-07-06|TAKE BACK RETURN|TRUCK|gular requests. even ideas abo +42242|299|81|2|45|53968.05|0.03|0.00|R|F|1994-06-09|1994-05-23|1994-06-13|DELIVER IN PERSON|TRUCK|dolites affix slyly against +42242|1969|70|3|30|56128.80|0.08|0.08|R|F|1994-07-14|1994-05-07|1994-08-11|DELIVER IN PERSON|RAIL|kly ironic ideas. carefully even deposits +42242|1747|48|4|19|31326.06|0.06|0.01|A|F|1994-07-17|1994-06-25|1994-08-06|TAKE BACK RETURN|SHIP|lithely alongside of the a +42242|1569|50|5|27|39705.12|0.01|0.02|R|F|1994-06-03|1994-05-10|1994-06-30|DELIVER IN PERSON|SHIP| cajole according to the qu +42242|504|95|6|1|1404.50|0.06|0.06|R|F|1994-05-30|1994-05-15|1994-06-11|COLLECT COD|FOB|ts use slyly against the unusual +42243|1058|94|1|37|35484.85|0.08|0.01|R|F|1992-07-02|1992-06-10|1992-07-06|TAKE BACK RETURN|MAIL|ly even instructions across th +42243|704|37|2|18|28884.60|0.00|0.05|R|F|1992-04-16|1992-06-09|1992-04-21|COLLECT COD|SHIP|regular deposits. dugouts n +42243|279|34|3|20|23585.40|0.08|0.05|R|F|1992-06-01|1992-05-04|1992-06-24|NONE|TRUCK|eans haggle slyly along the specia +42243|401|31|4|13|16918.20|0.06|0.05|A|F|1992-06-21|1992-05-25|1992-06-27|NONE|REG AIR|re blithely fin +42243|195|22|5|5|5475.95|0.08|0.05|A|F|1992-07-05|1992-05-22|1992-07-31|NONE|AIR|solve fluffily furiously bold ideas. +42244|1718|61|1|22|35633.62|0.01|0.00|N|O|1998-07-05|1998-07-16|1998-07-27|COLLECT COD|FOB|ending packages hagg +42244|878|78|2|15|26683.05|0.03|0.03|N|O|1998-08-06|1998-07-04|1998-08-30|TAKE BACK RETURN|FOB|ding to the +42245|309|94|1|17|20558.10|0.08|0.08|N|O|1997-06-05|1997-08-04|1997-07-01|NONE|MAIL|ges haggle. bli +42245|84|10|2|17|16729.36|0.09|0.02|N|O|1997-07-08|1997-07-02|1997-08-06|COLLECT COD|TRUCK|latelets. regular requests sleep +42245|1366|81|3|46|58298.56|0.09|0.07|N|O|1997-07-30|1997-06-28|1997-08-06|COLLECT COD|MAIL|s haggle blithely alongside of the +42245|1215|16|4|34|37951.14|0.04|0.03|N|O|1997-08-29|1997-08-05|1997-09-25|COLLECT COD|AIR|y. slyly even accounts use stealthily. r +42245|404|92|5|24|31305.60|0.05|0.08|N|O|1997-05-16|1997-07-17|1997-05-29|COLLECT COD|AIR|fluffily final deposits. blithely regul +42245|1285|60|6|20|23725.60|0.06|0.05|N|O|1997-06-10|1997-07-07|1997-07-08|TAKE BACK RETURN|REG AIR|ges thrash +42245|1652|76|7|50|77682.50|0.09|0.03|N|O|1997-07-29|1997-08-10|1997-08-23|DELIVER IN PERSON|AIR|ly furiously even accounts. fluff +42246|1726|69|1|27|43948.44|0.09|0.05|A|F|1992-06-27|1992-07-23|1992-07-13|TAKE BACK RETURN|SHIP|s-- ironic deposits cajol +42246|310|95|2|9|10892.79|0.04|0.06|R|F|1992-07-20|1992-06-21|1992-07-22|NONE|TRUCK|efully silent inst +42246|1690|73|3|37|58892.53|0.10|0.08|A|F|1992-06-15|1992-05-28|1992-07-04|DELIVER IN PERSON|REG AIR|s sleep furio +42246|924|93|4|16|29198.72|0.03|0.07|A|F|1992-08-12|1992-06-03|1992-08-19|TAKE BACK RETURN|TRUCK|-- carefully even multipli +42246|1120|21|5|42|42887.04|0.06|0.02|R|F|1992-06-15|1992-07-12|1992-06-22|DELIVER IN PERSON|SHIP|iously bold +42246|872|39|6|11|19501.57|0.03|0.03|R|F|1992-07-04|1992-06-08|1992-07-05|TAKE BACK RETURN|FOB|kly final packages integrate slyly. +42246|450|38|7|18|24308.10|0.00|0.06|R|F|1992-07-06|1992-07-03|1992-07-30|NONE|RAIL|st furiousl +42247|1597|78|1|7|10490.13|0.05|0.01|N|O|1997-01-23|1996-11-25|1997-02-03|NONE|FOB|pending pinto beans cajole sl +42272|1518|59|1|47|66716.97|0.08|0.06|N|O|1996-02-07|1995-12-25|1996-02-08|DELIVER IN PERSON|TRUCK|ar dolphins cajole above +42272|805|5|2|29|49468.20|0.08|0.03|N|O|1996-02-16|1996-01-17|1996-03-07|COLLECT COD|REG AIR|e ironic requests: regular theo +42273|1578|79|1|29|42907.53|0.04|0.04|N|O|1996-11-10|1996-12-25|1996-11-14|NONE|RAIL|foxes hinder carefully. slow platel +42273|1775|76|2|7|11737.39|0.05|0.02|N|O|1997-01-27|1996-12-29|1997-01-28|DELIVER IN PERSON|FOB|riously silent +42274|1184|57|1|33|35810.94|0.00|0.06|N|O|1995-10-27|1995-11-30|1995-11-11|DELIVER IN PERSON|FOB|kages cajole furiously. expres +42274|1763|64|2|31|51607.56|0.07|0.01|N|O|1995-11-06|1995-11-25|1995-11-17|DELIVER IN PERSON|SHIP| blithely thin packages. theodolite +42274|1612|36|3|22|33299.42|0.08|0.05|N|O|1995-11-04|1995-11-25|1995-11-24|DELIVER IN PERSON|TRUCK|even, expre +42274|796|29|4|9|15271.11|0.03|0.04|N|O|1995-12-19|1995-11-30|1996-01-01|DELIVER IN PERSON|TRUCK| packages nag stealthily. blithely +42275|1139|40|1|24|24963.12|0.04|0.04|A|F|1993-01-02|1992-12-25|1993-01-05|COLLECT COD|AIR|ly busy accounts sleep pending packages. +42276|1610|11|1|10|15116.10|0.00|0.07|A|F|1994-08-27|1994-10-01|1994-09-19|COLLECT COD|SHIP|unusual requests cajole q +42276|1188|61|2|8|8713.44|0.09|0.02|R|F|1994-08-02|1994-09-30|1994-08-16|NONE|RAIL|ts haggle furiously across the fina +42276|1413|53|3|14|18401.74|0.10|0.07|A|F|1994-08-12|1994-09-06|1994-09-01|NONE|SHIP|tipliers wake blithely exp +42277|1914|3|1|41|74452.31|0.10|0.05|N|O|1997-05-16|1997-05-02|1997-06-04|NONE|MAIL|ests use along th +42277|373|58|2|6|7640.22|0.04|0.04|N|O|1997-03-01|1997-04-06|1997-03-07|COLLECT COD|AIR|carefully. iron +42277|80|56|3|38|37243.04|0.08|0.08|N|O|1997-05-23|1997-04-27|1997-06-11|NONE|SHIP|uests! ironic, ironic dolphi +42277|1655|38|4|50|77832.50|0.05|0.01|N|O|1997-06-02|1997-03-30|1997-06-10|NONE|FOB|e: brave instructions use. slyly special p +42278|1619|2|1|40|60824.40|0.10|0.01|N|O|1995-10-03|1995-08-11|1995-10-15|TAKE BACK RETURN|TRUCK|cajole according to the blithely +42278|927|28|2|12|21935.04|0.00|0.02|N|O|1995-09-12|1995-08-16|1995-10-04|NONE|MAIL|nal braids: bold pinto beans sleep fur +42278|91|92|3|39|38652.51|0.07|0.03|N|O|1995-09-08|1995-07-10|1995-09-15|DELIVER IN PERSON|RAIL|nal excuses. unusual packages wak +42278|1551|32|4|18|26145.90|0.08|0.00|N|O|1995-07-03|1995-08-14|1995-07-09|TAKE BACK RETURN|FOB|oze slyly. ironic theodolite +42278|254|36|5|15|17313.75|0.01|0.05|N|O|1995-08-24|1995-08-11|1995-09-20|DELIVER IN PERSON|MAIL|ckly ironic accounts h +42279|445|75|1|26|34981.44|0.02|0.05|R|F|1994-09-16|1994-08-07|1994-10-11|COLLECT COD|MAIL|lly express pinto bean +42279|1935|68|2|26|47760.18|0.10|0.00|A|F|1994-09-06|1994-09-27|1994-10-01|COLLECT COD|TRUCK| around th +42279|944|47|3|19|35053.86|0.02|0.01|R|F|1994-10-21|1994-09-23|1994-11-17|DELIVER IN PERSON|AIR|ial accounts use across the bl +42279|1527|8|4|16|22856.32|0.09|0.05|R|F|1994-07-03|1994-08-19|1994-07-21|NONE|FOB|cajole quickly after the deposits +42279|1640|64|5|23|35457.72|0.10|0.05|A|F|1994-07-07|1994-08-15|1994-07-23|DELIVER IN PERSON|RAIL|ages against the +42279|1032|3|6|2|1866.06|0.05|0.07|R|F|1994-07-22|1994-09-19|1994-08-16|NONE|AIR|ges above the final multipliers boost +42304|1560|61|1|48|70154.88|0.08|0.08|A|F|1994-04-19|1994-06-04|1994-04-22|TAKE BACK RETURN|TRUCK|g the platelets. final accoun +42304|1263|1|2|47|54720.22|0.09|0.02|A|F|1994-04-03|1994-05-23|1994-04-18|DELIVER IN PERSON|RAIL| slyly final theodolites +42304|931|32|3|22|40302.46|0.00|0.08|A|F|1994-04-16|1994-05-23|1994-05-01|TAKE BACK RETURN|SHIP|uriously slyly expre +42304|1277|78|4|24|28278.48|0.07|0.08|R|F|1994-04-12|1994-05-27|1994-05-05|DELIVER IN PERSON|RAIL| ironic, ironic pinto beans are furiously. +42304|33|59|5|12|11196.36|0.06|0.03|R|F|1994-05-27|1994-05-06|1994-06-16|NONE|REG AIR|ven ideas. ironic, final pinto b +42305|1375|90|1|29|37014.73|0.01|0.04|N|O|1998-02-25|1998-05-02|1998-03-09|COLLECT COD|FOB|pecial deposits nod. slyly final ideas +42306|1724|51|1|49|79660.28|0.01|0.05|A|F|1992-11-08|1992-11-18|1992-12-08|TAKE BACK RETURN|SHIP|nag ironic +42306|1438|56|2|9|12054.87|0.07|0.01|A|F|1992-10-11|1992-10-18|1992-10-29|DELIVER IN PERSON|AIR|uses. deposits de +42306|1015|86|3|12|10992.12|0.04|0.07|R|F|1993-01-01|1992-10-15|1993-01-05|TAKE BACK RETURN|REG AIR|efully reg +42306|1876|77|4|47|83559.89|0.02|0.00|R|F|1992-11-12|1992-12-06|1992-11-25|DELIVER IN PERSON|AIR|s cajole slyly for the bravely +42306|893|94|5|31|55610.59|0.09|0.06|A|F|1992-12-21|1992-10-29|1993-01-05|NONE|MAIL|hogs. silent platel +42306|1361|38|6|35|44182.60|0.03|0.06|A|F|1992-09-17|1992-12-07|1992-09-25|COLLECT COD|AIR|t the blithely final reque +42307|115|94|1|40|40604.40|0.03|0.04|N|O|1998-06-15|1998-04-11|1998-06-27|COLLECT COD|FOB|y regular asymptotes haggle fl +42307|635|29|2|4|6142.52|0.08|0.01|N|O|1998-03-31|1998-05-01|1998-04-23|COLLECT COD|SHIP|refully. excuses +42307|612|13|3|50|75630.50|0.00|0.00|N|O|1998-05-12|1998-04-30|1998-06-06|DELIVER IN PERSON|TRUCK|y regular foxes a +42307|1991|80|4|1|1892.99|0.10|0.05|N|O|1998-03-27|1998-05-05|1998-04-19|TAKE BACK RETURN|FOB|ously regular, ruthless platelets +42307|1567|88|5|45|66085.20|0.05|0.07|N|O|1998-06-01|1998-04-13|1998-06-10|DELIVER IN PERSON|MAIL|kindle across the regular, slow +42307|755|20|6|36|59607.00|0.10|0.08|N|O|1998-05-21|1998-05-16|1998-05-23|DELIVER IN PERSON|FOB|es detect carefully about the furi +42308|552|13|1|3|4357.65|0.04|0.03|R|F|1994-10-02|1994-08-18|1994-10-03|COLLECT COD|RAIL|grate blit +42308|1236|37|2|10|11372.30|0.06|0.08|R|F|1994-08-26|1994-07-25|1994-09-16|DELIVER IN PERSON|AIR|ajole quickly fi +42308|128|29|3|13|13365.56|0.07|0.01|A|F|1994-10-11|1994-08-17|1994-11-10|DELIVER IN PERSON|REG AIR|y permanent reque +42308|553|54|4|50|72677.50|0.01|0.02|A|F|1994-07-12|1994-08-26|1994-07-31|NONE|SHIP|latelets haggle fluffily pending, special +42308|1729|72|5|5|8153.60|0.07|0.05|A|F|1994-08-23|1994-08-22|1994-09-04|COLLECT COD|AIR|asymptotes. d +42309|1735|62|1|29|47465.17|0.08|0.06|R|F|1994-11-01|1994-09-13|1994-11-13|TAKE BACK RETURN|AIR| slyly regular foxes sleep. slyly dogged at +42309|946|81|2|21|38785.74|0.07|0.08|R|F|1994-08-20|1994-10-23|1994-09-12|TAKE BACK RETURN|AIR|lly unusual, ironic accounts. blithe i +42309|944|45|3|39|71952.66|0.10|0.04|R|F|1994-09-05|1994-09-13|1994-09-15|COLLECT COD|MAIL|deas. unusual pint +42309|1317|94|4|23|28021.13|0.07|0.07|A|F|1994-09-04|1994-09-16|1994-09-20|COLLECT COD|RAIL|ong the furiously +42309|53|29|5|4|3812.20|0.07|0.00|A|F|1994-09-04|1994-09-12|1994-09-16|TAKE BACK RETURN|MAIL|oost blithel +42310|559|90|1|4|5838.20|0.09|0.06|A|F|1994-11-14|1994-09-20|1994-11-16|COLLECT COD|REG AIR|ions. asymptotes ca +42310|1662|86|2|21|32836.86|0.06|0.00|A|F|1994-10-14|1994-08-21|1994-10-26|COLLECT COD|SHIP|unts: regular, +42310|1961|6|3|11|20492.56|0.09|0.00|A|F|1994-10-19|1994-09-02|1994-11-15|NONE|RAIL|uctions. fluffily regu +42310|1834|35|4|8|13886.64|0.10|0.07|R|F|1994-11-10|1994-09-12|1994-11-13|DELIVER IN PERSON|FOB|sly regula +42310|543|44|5|45|64959.30|0.05|0.06|R|F|1994-11-01|1994-08-30|1994-12-01|NONE|MAIL|press deposits wak +42311|1218|56|1|16|17907.36|0.03|0.05|N|O|1998-09-03|1998-10-09|1998-09-14|DELIVER IN PERSON|MAIL|jole carefully express requests. +42311|264|46|2|26|30270.76|0.03|0.04|N|O|1998-10-28|1998-08-22|1998-11-11|COLLECT COD|AIR|uickly express deposits print fluffil +42311|752|49|3|17|28096.75|0.02|0.02|N|O|1998-09-17|1998-10-07|1998-10-10|COLLECT COD|SHIP| above the +42311|1061|62|4|23|22127.38|0.02|0.08|N|O|1998-09-22|1998-09-05|1998-10-15|TAKE BACK RETURN|SHIP| silent accounts wake blith +42311|1822|23|5|32|55162.24|0.03|0.04|N|O|1998-09-28|1998-09-03|1998-09-30|TAKE BACK RETURN|REG AIR|ly fluffily +42311|1957|2|6|49|91088.55|0.02|0.06|N|O|1998-08-17|1998-08-21|1998-08-18|COLLECT COD|FOB|s. regular accounts detect b +42336|953|54|1|40|74158.00|0.02|0.01|R|F|1992-06-11|1992-07-26|1992-06-27|NONE|RAIL| the slowly fi +42336|1174|83|2|25|26879.25|0.05|0.06|R|F|1992-06-25|1992-06-26|1992-07-15|NONE|AIR|tructions grow fluffily. ironic pinto +42337|414|2|1|37|48633.17|0.09|0.06|N|O|1996-01-15|1996-02-28|1996-01-18|COLLECT COD|AIR|xes! slyly ironic +42337|1585|6|2|30|44597.40|0.02|0.07|N|O|1996-01-29|1996-04-02|1996-02-08|DELIVER IN PERSON|RAIL|ns are slyly ironic sheaves. fluffily u +42337|1218|56|3|36|40291.56|0.07|0.08|N|O|1996-03-18|1996-02-21|1996-04-09|NONE|MAIL|sly regular packages. sly accounts ab +42337|658|90|4|25|38966.25|0.08|0.07|N|O|1996-02-04|1996-02-07|1996-03-02|TAKE BACK RETURN|FOB| foxes cajole blithel +42337|1153|26|5|47|49545.05|0.04|0.07|N|O|1996-02-21|1996-03-15|1996-03-07|NONE|AIR|cording to the fu +42338|657|58|1|37|57633.05|0.07|0.00|R|F|1995-01-31|1994-12-27|1995-02-09|DELIVER IN PERSON|AIR|quests use. carefully ironic in +42338|1470|10|2|14|19200.58|0.07|0.07|A|F|1995-03-01|1995-01-03|1995-03-16|TAKE BACK RETURN|MAIL|ecial packages! ideas agai +42338|1461|62|3|16|21799.36|0.00|0.01|A|F|1994-12-08|1994-12-05|1994-12-25|TAKE BACK RETURN|SHIP|oss the silent p +42338|1297|98|4|41|49129.89|0.04|0.03|A|F|1994-12-01|1994-12-11|1994-12-09|TAKE BACK RETURN|AIR|lar requests. idly pe +42338|989|92|5|34|64259.32|0.02|0.00|R|F|1995-01-31|1994-12-09|1995-02-03|DELIVER IN PERSON|REG AIR| of the pending deposits sleep fluf +42339|422|52|1|18|23803.56|0.00|0.08|R|F|1994-02-18|1994-03-28|1994-03-13|TAKE BACK RETURN|RAIL|efully along the carefully ironic asym +42339|1208|46|2|25|27730.00|0.08|0.05|A|F|1994-03-07|1994-05-06|1994-03-09|NONE|FOB|iously final packages. +42339|982|17|3|24|45191.52|0.04|0.01|R|F|1994-04-17|1994-03-23|1994-04-24|TAKE BACK RETURN|SHIP| deposits sleep bravely along the +42339|1165|74|4|47|50109.52|0.03|0.02|A|F|1994-04-21|1994-03-29|1994-05-15|DELIVER IN PERSON|REG AIR|s use slyly. stealthi +42340|211|66|1|22|24446.62|0.03|0.04|A|F|1992-07-26|1992-08-25|1992-08-12|NONE|FOB|s-- carefully ironic excuses +42341|495|96|1|7|9768.43|0.10|0.04|N|O|1996-08-08|1996-09-08|1996-08-22|COLLECT COD|RAIL|equests cajole along t +42341|26|2|2|12|11112.24|0.01|0.04|N|O|1996-07-25|1996-08-19|1996-08-06|COLLECT COD|SHIP|sts. accoun +42341|626|58|3|13|19846.06|0.00|0.06|N|O|1996-11-02|1996-09-10|1996-12-01|DELIVER IN PERSON|SHIP|slyly final ideas haggle sl +42342|1803|90|1|40|68192.00|0.03|0.03|R|F|1994-12-12|1994-11-22|1994-12-20|DELIVER IN PERSON|REG AIR|old, special theodolites +42342|374|75|2|16|20389.92|0.04|0.03|R|F|1994-11-12|1994-11-13|1994-12-06|TAKE BACK RETURN|MAIL|pending foxes across the even packages +42342|990|59|3|21|39710.79|0.10|0.08|A|F|1994-11-06|1994-10-25|1994-11-07|NONE|TRUCK|l packages +42342|1541|22|4|23|33178.42|0.05|0.08|R|F|1994-09-26|1994-11-19|1994-10-19|DELIVER IN PERSON|TRUCK|ake carefully. +42343|393|22|1|9|11640.51|0.06|0.06|A|F|1994-09-08|1994-11-07|1994-09-23|TAKE BACK RETURN|SHIP|s packages. carefully ironic pack +42343|1527|48|2|47|67140.44|0.09|0.00|R|F|1994-08-18|1994-09-18|1994-08-19|NONE|SHIP|ainst the instructions. +42343|1972|17|3|11|20613.67|0.01|0.02|A|F|1994-11-11|1994-09-26|1994-11-29|COLLECT COD|RAIL|kly ironic frays are. even, pending pla +42368|459|47|1|39|53018.55|0.05|0.03|N|O|1996-01-08|1996-01-19|1996-01-25|DELIVER IN PERSON|FOB|imes even accounts. +42368|592|53|2|17|25374.03|0.10|0.00|N|O|1995-12-04|1995-12-11|1995-12-06|DELIVER IN PERSON|MAIL| along the doggedl +42368|1659|1|3|26|40576.90|0.07|0.06|N|O|1995-12-20|1996-01-06|1996-01-11|TAKE BACK RETURN|MAIL|s. dolphins use blithely +42369|431|61|1|41|54588.63|0.09|0.06|R|F|1993-09-09|1993-10-26|1993-09-15|TAKE BACK RETURN|SHIP| affix. quickly special reques +42369|402|32|2|8|10419.20|0.06|0.03|A|F|1993-09-17|1993-10-23|1993-09-25|TAKE BACK RETURN|MAIL| quickly pending packag +42369|1365|4|3|37|46855.32|0.02|0.08|R|F|1993-09-19|1993-11-03|1993-10-19|COLLECT COD|AIR|regular, ironic pinto beans integrate +42369|1731|74|4|46|75105.58|0.09|0.04|R|F|1993-09-06|1993-10-18|1993-09-26|DELIVER IN PERSON|TRUCK|ording to the carefully pen +42370|131|32|1|16|16498.08|0.07|0.07|N|O|1996-01-17|1996-01-24|1996-02-05|COLLECT COD|MAIL|ructions ab +42370|1277|78|2|26|30635.02|0.06|0.07|N|O|1996-03-13|1996-01-27|1996-03-20|TAKE BACK RETURN|SHIP| ideas haggle slyly. always final gifts caj +42370|1694|36|3|14|22339.66|0.09|0.01|N|O|1995-12-27|1995-12-23|1996-01-10|NONE|RAIL|furiously final ideas. furiously pending ac +42371|1462|2|1|12|16361.52|0.08|0.01|N|O|1996-03-26|1996-05-06|1996-04-25|TAKE BACK RETURN|MAIL|tions integrate furiously a +42372|740|37|1|5|8203.70|0.03|0.05|N|O|1996-06-07|1996-07-12|1996-06-15|COLLECT COD|REG AIR|neath the +42372|1240|78|2|17|19401.08|0.00|0.07|N|O|1996-05-17|1996-06-26|1996-06-15|DELIVER IN PERSON|MAIL|above the carefully fin +42372|707|72|3|48|77169.60|0.07|0.03|N|O|1996-05-03|1996-07-21|1996-06-02|TAKE BACK RETURN|MAIL|y bold excuses use. expr +42372|805|6|4|3|5117.40|0.06|0.08|N|O|1996-07-03|1996-07-09|1996-07-26|DELIVER IN PERSON|REG AIR|ular packages. +42372|891|91|5|27|48381.03|0.08|0.07|N|O|1996-07-16|1996-05-27|1996-07-18|NONE|TRUCK|ress accounts boost a +42373|1338|53|1|47|58248.51|0.09|0.01|N|O|1995-10-26|1995-10-26|1995-10-31|COLLECT COD|REG AIR|against the blithely bold instruct +42373|1122|59|2|39|39901.68|0.07|0.03|N|O|1995-12-10|1995-09-18|1996-01-05|TAKE BACK RETURN|AIR|unts after +42373|433|63|3|45|60004.35|0.10|0.03|N|O|1995-10-08|1995-11-14|1995-10-11|DELIVER IN PERSON|SHIP|dolites according to the re +42373|127|6|4|25|25678.00|0.05|0.05|N|O|1995-10-30|1995-11-13|1995-11-05|COLLECT COD|AIR|, ironic theodolites +42373|395|96|5|43|55701.77|0.10|0.01|N|O|1995-09-26|1995-09-21|1995-09-27|NONE|AIR| regular decoys. slyly s +42374|398|99|1|43|55830.77|0.02|0.03|R|F|1992-07-19|1992-09-17|1992-08-12|NONE|REG AIR|ges. furiously silent theodo +42374|485|44|2|9|12469.32|0.01|0.07|A|F|1992-08-09|1992-10-11|1992-08-25|COLLECT COD|TRUCK|ven deposits about the re +42374|1169|42|3|48|51367.68|0.02|0.04|A|F|1992-08-13|1992-08-18|1992-09-06|TAKE BACK RETURN|TRUCK|ackages. carefully pending +42374|1319|96|4|4|4881.24|0.02|0.01|R|F|1992-08-27|1992-10-09|1992-09-17|TAKE BACK RETURN|AIR|e slyly final accounts detect along +42375|1130|31|1|28|28871.64|0.01|0.01|A|F|1993-11-06|1993-11-24|1993-11-12|NONE|AIR|eans. busily regular accounts wak +42375|1051|57|2|39|37129.95|0.06|0.04|A|F|1993-12-15|1993-12-05|1994-01-08|NONE|TRUCK|uriously. fluffily regular foxes +42375|33|59|3|49|45718.47|0.06|0.02|A|F|1993-11-11|1993-12-24|1993-12-07|NONE|REG AIR| x-ray carefully bold instru +42375|170|97|4|28|29964.76|0.06|0.02|R|F|1993-12-15|1993-11-30|1994-01-01|NONE|FOB|? fluffily regular packages +42400|955|90|1|42|77949.90|0.04|0.07|R|F|1992-09-06|1992-10-23|1992-09-12|COLLECT COD|AIR|ermanent foxes along the +42400|1065|71|2|2|1932.12|0.06|0.08|A|F|1992-08-15|1992-10-29|1992-08-16|DELIVER IN PERSON|SHIP|bold requests. carefully even re +42400|1584|85|3|40|59423.20|0.04|0.05|A|F|1992-09-28|1992-10-24|1992-10-28|COLLECT COD|RAIL|furiously about the regular foxes. slyly +42400|1018|24|4|23|21137.23|0.03|0.01|R|F|1992-09-13|1992-10-28|1992-10-01|NONE|FOB|ckages. blithely express requests +42400|1088|24|5|7|6923.56|0.06|0.04|A|F|1992-11-25|1992-10-01|1992-12-17|COLLECT COD|RAIL|eas across the slyly ironic accoun +42401|563|54|1|34|49761.04|0.09|0.02|N|O|1997-01-05|1996-10-22|1997-01-06|TAKE BACK RETURN|SHIP|to the quickly even +42401|1688|30|2|27|42921.36|0.09|0.03|N|O|1996-10-08|1996-11-13|1996-11-06|NONE|AIR|wake among the regular +42401|672|66|3|12|18872.04|0.04|0.05|N|O|1996-11-10|1996-11-30|1996-12-08|NONE|TRUCK|ironic packages a +42401|130|31|4|29|29873.77|0.02|0.03|N|O|1996-12-18|1996-11-24|1997-01-14|TAKE BACK RETURN|SHIP|theodolites engage furiously slyly iron +42401|1102|3|5|42|42130.20|0.07|0.07|N|O|1997-01-02|1996-11-11|1997-01-31|COLLECT COD|MAIL|osits. furiously ca +42402|889|90|1|7|12529.16|0.09|0.07|A|F|1992-12-06|1992-10-14|1992-12-14|NONE|MAIL|sual instructions. platelets according +42402|1350|89|2|39|48802.65|0.04|0.06|A|F|1992-11-19|1992-10-17|1992-12-18|TAKE BACK RETURN|TRUCK|ests. furiously regular requests are +42403|1452|53|1|32|43310.40|0.07|0.07|A|F|1994-07-08|1994-08-14|1994-08-03|DELIVER IN PERSON|MAIL|e the furiously regular th +42403|1446|86|2|44|59287.36|0.10|0.05|R|F|1994-09-01|1994-08-31|1994-09-22|NONE|RAIL|uriously regular courts cajole quickly s +42403|1140|41|3|42|43727.88|0.00|0.08|A|F|1994-08-11|1994-08-24|1994-09-05|DELIVER IN PERSON|SHIP|luffily final plat +42403|1065|36|4|49|47336.94|0.04|0.05|R|F|1994-07-18|1994-08-06|1994-08-15|DELIVER IN PERSON|SHIP|ular requests may engage ag +42403|1221|22|5|15|16833.30|0.01|0.03|R|F|1994-08-22|1994-07-26|1994-09-18|COLLECT COD|SHIP|deposits use blith +42403|1515|96|6|12|16998.12|0.06|0.00|R|F|1994-08-27|1994-08-29|1994-09-25|DELIVER IN PERSON|AIR|al sheaves. ironic, special pinto b +42404|1264|76|1|11|12817.86|0.02|0.07|N|O|1998-01-24|1997-11-13|1998-02-05|DELIVER IN PERSON|TRUCK| ironic packages hag +42404|1763|64|2|14|23306.64|0.09|0.07|N|O|1998-01-30|1997-11-05|1998-02-15|NONE|REG AIR|unts boost agai +42405|1129|30|1|44|45325.28|0.08|0.02|R|F|1993-02-10|1993-04-21|1993-02-27|TAKE BACK RETURN|MAIL|unusual ac +42405|604|98|2|10|15046.00|0.03|0.00|R|F|1993-03-01|1993-03-09|1993-03-22|COLLECT COD|TRUCK|y among the regular warho +42405|804|71|3|44|75011.20|0.05|0.07|A|F|1993-02-14|1993-02-25|1993-03-09|NONE|AIR|ons. carefully express platelets +42405|1054|25|4|21|20056.05|0.02|0.08|R|F|1993-04-26|1993-02-21|1993-05-16|NONE|SHIP|ect accord +42405|153|32|5|14|14744.10|0.08|0.05|A|F|1993-03-25|1993-03-01|1993-03-28|DELIVER IN PERSON|REG AIR|ong the furiously unusual +42405|799|96|6|12|20397.48|0.09|0.01|A|F|1993-02-28|1993-02-26|1993-03-19|TAKE BACK RETURN|SHIP|aggle blithely along the quickly iro +42406|994|63|1|49|92854.51|0.01|0.08|N|O|1996-04-04|1996-02-28|1996-04-14|NONE|MAIL|nic deposits sleep blit +42407|1271|72|1|32|37512.64|0.08|0.03|N|O|1997-02-05|1997-03-09|1997-02-18|TAKE BACK RETURN|TRUCK|deposits. bold theodolites are. +42407|1692|16|2|39|62153.91|0.03|0.07|N|O|1997-02-15|1997-02-17|1997-02-26|DELIVER IN PERSON|FOB|ons. furiously pending pint +42432|1586|87|1|13|19338.54|0.02|0.03|R|F|1993-11-28|1993-11-26|1993-12-19|COLLECT COD|REG AIR|sits are quickly. carefully bold +42432|1573|94|2|31|45711.67|0.00|0.02|R|F|1993-09-20|1993-10-17|1993-09-21|NONE|AIR|final, brave packages u +42433|814|81|1|32|54873.92|0.06|0.03|A|F|1993-05-30|1993-03-19|1993-06-22|NONE|AIR|nto beans against the slyly bold fray +42433|490|91|2|23|31981.27|0.10|0.08|R|F|1993-04-20|1993-04-15|1993-05-08|TAKE BACK RETURN|SHIP|arefully even theodolites according to the +42433|1462|41|3|40|54538.40|0.03|0.02|R|F|1993-03-29|1993-03-26|1993-04-01|COLLECT COD|TRUCK|ckages are carefully? furiously pending the +42434|1078|14|1|30|29372.10|0.10|0.07|N|O|1998-02-14|1998-03-28|1998-03-05|COLLECT COD|REG AIR|integrate carefully alo +42434|222|4|2|3|3366.66|0.01|0.06|N|O|1998-01-24|1998-03-28|1998-01-25|DELIVER IN PERSON|AIR| accounts above the +42434|1352|67|3|27|33840.45|0.09|0.06|N|O|1998-01-22|1998-04-09|1998-02-18|DELIVER IN PERSON|REG AIR| accounts n +42434|932|33|4|20|36658.60|0.06|0.04|N|O|1998-04-10|1998-04-04|1998-05-03|DELIVER IN PERSON|MAIL|unts. quickly silent somas across +42434|1261|62|5|37|43003.62|0.06|0.00|N|O|1998-02-25|1998-04-06|1998-03-14|NONE|REG AIR| regular dependencies are. slyly final excu +42434|368|53|6|9|11415.24|0.04|0.05|N|O|1998-04-09|1998-03-13|1998-05-06|TAKE BACK RETURN|SHIP|ts alongside of the +42435|1894|81|1|17|30530.13|0.10|0.02|N|O|1998-01-08|1997-12-18|1998-02-06|TAKE BACK RETURN|RAIL|after the slyly unusual pinto +42435|933|34|2|30|55017.90|0.04|0.06|N|O|1998-02-04|1997-12-10|1998-02-15|COLLECT COD|AIR|escapades wake quickly. f +42436|1123|24|1|19|19458.28|0.09|0.01|R|F|1992-10-20|1992-10-28|1992-11-07|DELIVER IN PERSON|REG AIR|ronic pinto beans +42436|1423|2|2|35|46354.70|0.09|0.05|A|F|1992-09-17|1992-10-28|1992-10-15|NONE|TRUCK|efully instructions +42436|1902|35|3|36|64940.40|0.05|0.08|R|F|1992-08-12|1992-10-09|1992-08-20|TAKE BACK RETURN|AIR|tes are quickly even foxe +42437|1318|95|1|2|2438.62|0.02|0.02|A|F|1992-05-28|1992-06-03|1992-06-24|NONE|REG AIR|usly pending +42437|61|37|2|9|8649.54|0.00|0.01|R|F|1992-06-21|1992-05-18|1992-07-21|TAKE BACK RETURN|MAIL|ironic requests. fluffily regul +42438|1067|73|1|33|31945.98|0.07|0.05|N|O|1998-02-23|1998-02-01|1998-03-20|COLLECT COD|MAIL|ackages. fluffily final notor +42438|1916|17|2|29|52719.39|0.05|0.01|N|O|1997-11-24|1998-02-07|1997-12-11|NONE|MAIL|sts. slyly unusual somas wake never ev +42438|1950|83|3|44|81485.80|0.10|0.01|N|O|1998-01-08|1997-12-17|1998-01-22|DELIVER IN PERSON|MAIL|oost across the blithely even accounts +42438|396|25|4|15|19445.85|0.10|0.06|N|O|1998-02-23|1998-02-05|1998-03-16|NONE|TRUCK|s use ironic foxes. regular ideas cajol +42438|1924|69|5|31|56603.52|0.02|0.08|N|O|1998-01-09|1997-12-31|1998-02-05|TAKE BACK RETURN|TRUCK|, special foxes. quickly b +42438|985|88|6|24|45263.52|0.06|0.05|N|O|1997-12-19|1998-01-25|1998-01-14|NONE|FOB|y regular theo +42438|761|26|7|17|28249.92|0.03|0.07|N|O|1997-12-21|1998-01-28|1998-01-10|DELIVER IN PERSON|AIR|lar instructions. special, speci +42439|1514|55|1|1|1415.51|0.06|0.02|A|F|1993-09-28|1993-07-25|1993-10-24|TAKE BACK RETURN|MAIL| slyly express accounts wake. dep +42439|169|96|2|11|11760.76|0.10|0.07|R|F|1993-09-14|1993-08-11|1993-09-24|TAKE BACK RETURN|SHIP|ges. quick +42439|1996|97|3|46|87307.54|0.09|0.01|A|F|1993-08-09|1993-09-17|1993-08-14|NONE|AIR|ts sleep furiously. furiousl +42439|1437|38|4|26|34799.18|0.05|0.06|R|F|1993-08-04|1993-09-11|1993-08-08|COLLECT COD|AIR|y final packages. blithely silent accounts +42439|1658|82|5|35|54587.75|0.01|0.03|A|F|1993-08-16|1993-08-23|1993-08-21|NONE|FOB|he carefully dogged instructions. slyly un +42439|665|97|6|38|59495.08|0.07|0.03|R|F|1993-07-01|1993-08-28|1993-07-05|TAKE BACK RETURN|RAIL|egular theodolites. blit +42464|90|91|1|49|48514.41|0.04|0.06|N|O|1998-02-16|1998-03-24|1998-02-26|TAKE BACK RETURN|MAIL|es boost thinly bo +42464|1485|3|2|25|34662.00|0.09|0.00|N|O|1998-05-06|1998-02-17|1998-05-19|DELIVER IN PERSON|FOB|uriously regular deposits sle +42464|132|85|3|9|9289.17|0.10|0.06|N|O|1998-02-06|1998-03-28|1998-03-05|COLLECT COD|REG AIR|sly bold requests; enticing, unusual p +42465|1|52|1|24|21624.00|0.01|0.01|A|F|1994-03-27|1994-03-11|1994-04-11|TAKE BACK RETURN|RAIL|regular packages cajole-- ideas accordi +42465|1208|83|2|40|44368.00|0.08|0.06|A|F|1994-04-04|1994-03-07|1994-04-24|COLLECT COD|SHIP|bold theodolites. ironic, regu +42466|1449|28|1|28|37812.32|0.09|0.03|A|F|1994-05-26|1994-05-31|1994-06-21|DELIVER IN PERSON|AIR|r foxes are carefully; final +42467|66|42|1|22|21253.32|0.00|0.08|A|F|1993-11-21|1993-11-29|1993-12-16|TAKE BACK RETURN|RAIL|quickly even requests sleep even +42467|1220|32|2|48|53818.56|0.10|0.07|A|F|1993-11-08|1993-12-31|1993-11-12|NONE|AIR|jole furiously along the final +42467|1496|36|3|38|53104.62|0.05|0.06|A|F|1994-02-01|1993-12-10|1994-02-02|DELIVER IN PERSON|RAIL|gular packages haggle +42467|1072|78|4|27|26272.89|0.05|0.04|A|F|1994-02-01|1993-12-05|1994-02-25|TAKE BACK RETURN|AIR|closely. quickly spe +42468|763|96|1|34|56567.84|0.06|0.01|A|F|1993-06-09|1993-06-09|1993-07-04|TAKE BACK RETURN|FOB|uickly furiously unusual depos +42469|1838|25|1|11|19138.13|0.07|0.04|R|F|1993-02-23|1992-12-31|1993-03-02|TAKE BACK RETURN|MAIL| according to the fluffily close +42469|1529|10|2|6|8583.12|0.06|0.05|A|F|1992-12-24|1993-01-25|1993-01-23|TAKE BACK RETURN|RAIL|telets. reg +42469|320|5|3|28|34168.96|0.07|0.02|A|F|1992-11-16|1993-02-02|1992-12-06|NONE|TRUCK|fluffily final packages sleep +42469|401|2|4|11|14315.40|0.04|0.02|A|F|1992-12-24|1992-12-30|1993-01-03|TAKE BACK RETURN|AIR|across the furiou +42469|1904|93|5|42|75847.80|0.07|0.08|A|F|1993-03-10|1992-12-10|1993-04-07|NONE|AIR| ideas wake. blithely silent packages are c +42469|387|88|6|42|54069.96|0.04|0.06|A|F|1993-01-07|1993-02-03|1993-01-13|DELIVER IN PERSON|AIR|y bold accounts. carefully final pint +42470|1190|99|1|38|41465.22|0.00|0.05|N|O|1998-07-26|1998-07-12|1998-08-01|TAKE BACK RETURN|TRUCK|kly regular fo +42470|325|54|2|17|20830.44|0.02|0.00|N|O|1998-07-25|1998-09-04|1998-07-28|TAKE BACK RETURN|FOB|ven accounts boost carefully bold packages. +42470|877|44|3|10|17778.70|0.06|0.08|N|O|1998-07-05|1998-09-05|1998-07-26|DELIVER IN PERSON|SHIP|ymptotes. e +42470|95|71|4|18|17911.62|0.04|0.02|N|O|1998-06-21|1998-08-28|1998-07-12|DELIVER IN PERSON|RAIL|riously fina +42470|1014|20|5|21|19215.21|0.01|0.05|N|O|1998-09-21|1998-07-10|1998-10-19|DELIVER IN PERSON|FOB|egular, regular sauternes. +42470|172|99|6|15|16082.55|0.04|0.08|N|O|1998-08-21|1998-07-31|1998-09-08|DELIVER IN PERSON|RAIL|tornis. expre +42470|1500|18|7|35|49052.50|0.09|0.04|N|O|1998-09-10|1998-08-13|1998-09-29|TAKE BACK RETURN|FOB|arefully ironic gro +42471|898|99|1|40|71955.60|0.06|0.07|A|F|1992-04-03|1992-05-04|1992-04-16|TAKE BACK RETURN|REG AIR|o are according to the +42471|905|8|2|42|75847.80|0.01|0.07|A|F|1992-04-10|1992-05-25|1992-05-02|TAKE BACK RETURN|FOB|g the unusual deposi +42471|262|17|3|41|47652.66|0.09|0.04|R|F|1992-04-24|1992-05-12|1992-05-10|DELIVER IN PERSON|SHIP|ly special orbits across the dogged excuses +42471|131|32|4|39|40214.07|0.10|0.08|A|F|1992-06-20|1992-04-15|1992-06-27|COLLECT COD|SHIP|requests detect fu +42471|1548|89|5|16|23192.64|0.07|0.00|A|F|1992-03-23|1992-05-02|1992-04-14|TAKE BACK RETURN|RAIL|lly among the regu +42471|1488|89|6|29|40294.92|0.01|0.02|A|F|1992-04-17|1992-04-16|1992-04-26|NONE|MAIL|fully. slyly unusual packages +42496|1817|18|1|26|44689.06|0.02|0.00|N|O|1997-02-15|1997-04-24|1997-02-26|COLLECT COD|REG AIR|. requests cajole +42497|649|43|1|30|46489.20|0.00|0.01|N|O|1996-05-14|1996-06-07|1996-05-25|COLLECT COD|SHIP|ld dolphins haggle furiously slyly e +42497|662|63|2|21|32815.86|0.02|0.01|N|O|1996-05-05|1996-06-01|1996-05-25|DELIVER IN PERSON|MAIL|y brave packages might haggle +42498|643|6|1|48|74094.72|0.00|0.05|A|F|1993-04-01|1993-03-26|1993-04-05|COLLECT COD|REG AIR|l pinto beans sl +42499|1257|58|1|32|37064.00|0.05|0.08|N|O|1995-09-28|1995-09-24|1995-10-24|COLLECT COD|SHIP|nal packages sleep furi +42500|877|78|1|2|3555.74|0.06|0.04|A|F|1993-03-10|1993-03-23|1993-03-31|COLLECT COD|SHIP|deposits nag f +42500|1018|24|2|50|45950.50|0.10|0.08|A|F|1993-05-23|1993-03-27|1993-06-18|DELIVER IN PERSON|FOB|latelets haggle quickly. pa +42500|1683|84|3|13|20600.84|0.09|0.06|A|F|1993-02-22|1993-04-12|1993-02-25|NONE|TRUCK|ges boost b +42500|1066|2|4|39|37715.34|0.00|0.07|R|F|1993-03-28|1993-04-18|1993-03-31|DELIVER IN PERSON|MAIL|ackages use never ironic co +42500|1464|43|5|13|17750.98|0.04|0.06|A|F|1993-05-13|1993-04-13|1993-05-16|DELIVER IN PERSON|MAIL|ly pending acco +42501|1244|56|1|16|18323.84|0.08|0.08|A|F|1992-11-24|1993-01-03|1992-12-07|TAKE BACK RETURN|TRUCK|ular deposits +42501|94|45|2|19|18887.71|0.08|0.06|A|F|1992-12-17|1993-01-20|1993-01-02|NONE|MAIL| asymptotes are. slyly e +42501|448|49|3|12|16181.28|0.08|0.03|A|F|1992-12-15|1993-01-02|1992-12-28|NONE|SHIP|carefully dogged ideas. furious +42501|1641|24|4|38|58620.32|0.09|0.03|R|F|1993-01-24|1993-01-29|1993-02-13|NONE|TRUCK|ckly ironic theodolites are. regula +42501|542|73|5|22|31735.88|0.08|0.02|R|F|1992-11-22|1992-12-24|1992-12-09|TAKE BACK RETURN|MAIL|n, ironic requests. unusual deposits are ac +42501|1833|20|6|24|41635.92|0.09|0.05|A|F|1993-01-16|1993-02-04|1993-02-14|NONE|MAIL|pending packages. blithely unusual pi +42501|1557|78|7|42|61259.10|0.09|0.06|A|F|1992-12-25|1993-01-04|1993-01-15|DELIVER IN PERSON|REG AIR|y ironic ideas hag +42502|60|11|1|13|12480.78|0.06|0.00|N|O|1997-07-19|1997-06-25|1997-08-12|COLLECT COD|MAIL|lyly. express +42502|363|64|2|6|7580.16|0.02|0.02|N|O|1997-09-08|1997-06-25|1997-09-30|NONE|MAIL|ending, regular pinto beans. silent asympt +42503|1159|96|1|3|3180.45|0.08|0.00|N|O|1997-03-10|1997-02-09|1997-03-28|NONE|TRUCK|quickly final accounts use quickly accordi +42503|1450|29|2|7|9460.15|0.03|0.00|N|O|1997-03-11|1997-02-16|1997-03-12|COLLECT COD|REG AIR| special forges haggle fluffily +42503|1699|23|3|42|67228.98|0.05|0.01|N|O|1997-01-23|1997-02-06|1997-02-03|COLLECT COD|RAIL|w fluffily a +42503|1617|59|4|1|1518.61|0.08|0.07|N|O|1997-01-27|1997-01-19|1997-02-17|COLLECT COD|AIR|longside of the even, +42503|153|80|5|22|23169.30|0.04|0.04|N|O|1997-03-09|1997-02-23|1997-03-20|NONE|REG AIR|er the blithely spe +42503|1077|48|6|27|26407.89|0.07|0.02|N|O|1996-12-10|1997-01-04|1996-12-13|NONE|MAIL|s cajole slyly ironic deposits. fin +42503|834|68|7|39|67658.37|0.09|0.08|N|O|1997-03-07|1997-02-13|1997-03-19|DELIVER IN PERSON|AIR|riously silent accounts against the care +42528|292|20|1|31|36960.99|0.06|0.03|R|F|1993-05-29|1993-04-22|1993-06-12|TAKE BACK RETURN|FOB|fully express packages snooze slyly. fu +42528|1002|73|2|16|14448.00|0.04|0.02|R|F|1993-04-02|1993-04-07|1993-04-25|COLLECT COD|TRUCK|final instr +42528|1496|14|3|32|44719.68|0.02|0.05|R|F|1993-03-06|1993-04-22|1993-04-02|NONE|SHIP|telets cajole: sp +42528|1826|56|4|27|46651.14|0.06|0.03|A|F|1993-05-28|1993-05-01|1993-06-12|DELIVER IN PERSON|AIR|haggle furiou +42528|1959|4|5|1|1860.95|0.10|0.07|R|F|1993-03-04|1993-04-08|1993-04-03|COLLECT COD|SHIP|its. fluffily sile +42528|1135|72|6|40|41445.20|0.08|0.06|A|F|1993-03-23|1993-04-18|1993-04-12|TAKE BACK RETURN|RAIL|nt, ironic accounts boos +42528|304|61|7|45|54193.50|0.05|0.01|R|F|1993-04-05|1993-05-21|1993-04-07|DELIVER IN PERSON|REG AIR|? regular, ironic ideas use quickly after +42529|1308|47|1|39|47162.70|0.02|0.04|A|F|1993-12-19|1994-01-04|1994-01-13|TAKE BACK RETURN|RAIL|furiously bold pinto beans +42529|1117|90|2|46|46833.06|0.01|0.04|R|F|1993-10-21|1993-11-27|1993-11-01|DELIVER IN PERSON|MAIL|y express theodolites detect fluffil +42529|909|44|3|13|23528.70|0.06|0.04|R|F|1994-01-05|1993-12-06|1994-01-21|NONE|FOB|lessly. pending dependenc +42529|738|39|4|29|47523.17|0.06|0.05|A|F|1993-10-13|1993-11-24|1993-10-23|NONE|AIR|nal deposits wake caref +42529|1938|83|5|7|12879.51|0.07|0.05|R|F|1993-12-14|1994-01-02|1994-01-11|COLLECT COD|MAIL|efully bold +42530|722|23|1|1|1622.72|0.03|0.01|N|O|1997-06-28|1997-07-02|1997-07-26|DELIVER IN PERSON|REG AIR|of the special f +42530|658|90|2|48|74815.20|0.07|0.00|N|O|1997-05-02|1997-06-23|1997-05-18|TAKE BACK RETURN|SHIP|inal reques +42530|932|1|3|28|51322.04|0.02|0.06|N|O|1997-05-30|1997-06-15|1997-06-05|TAKE BACK RETURN|SHIP|ld, final deposits lose blithely +42530|1519|20|4|43|61081.93|0.09|0.08|N|O|1997-06-04|1997-06-27|1997-07-04|DELIVER IN PERSON|SHIP|ding instructi +42530|1273|48|5|43|50493.61|0.05|0.02|N|O|1997-05-16|1997-05-13|1997-05-18|TAKE BACK RETURN|AIR|ions boost furiousl +42530|351|52|6|7|8759.45|0.06|0.00|N|O|1997-06-05|1997-05-22|1997-06-14|DELIVER IN PERSON|RAIL|ully regul +42531|587|78|1|14|20826.12|0.10|0.07|N|O|1996-05-27|1996-06-22|1996-06-08|DELIVER IN PERSON|MAIL|y ironic packages. +42531|1569|50|2|47|69116.32|0.03|0.00|N|O|1996-06-01|1996-07-02|1996-06-13|TAKE BACK RETURN|TRUCK|ully even packages sleep fur +42531|327|28|3|15|18409.80|0.10|0.04|N|O|1996-08-11|1996-07-22|1996-09-04|TAKE BACK RETURN|AIR|p blithely amon +42531|1315|16|4|10|12163.10|0.02|0.00|N|O|1996-05-13|1996-07-06|1996-05-27|NONE|AIR|ke. final, silent ideas are accor +42531|1513|94|5|32|45264.32|0.04|0.05|N|O|1996-08-10|1996-07-16|1996-08-16|COLLECT COD|TRUCK|sublate ca +42531|1418|97|6|50|65970.50|0.07|0.02|N|O|1996-08-12|1996-07-25|1996-08-29|DELIVER IN PERSON|REG AIR|ing deposits. carefully bo +42531|1475|93|7|8|11011.76|0.08|0.05|N|O|1996-08-31|1996-07-05|1996-09-17|DELIVER IN PERSON|AIR|usily even +42532|1112|49|1|49|49642.39|0.03|0.08|N|O|1996-02-06|1996-03-17|1996-02-25|TAKE BACK RETURN|FOB|equests are care +42532|1855|99|2|14|24595.90|0.07|0.07|N|O|1996-05-23|1996-03-22|1996-06-09|COLLECT COD|SHIP|ing patterns haggl +42532|1496|75|3|28|39129.72|0.00|0.05|N|O|1996-03-02|1996-03-20|1996-03-23|COLLECT COD|RAIL|ronic dolphins. +42532|496|26|4|8|11171.92|0.05|0.04|N|O|1996-04-12|1996-03-16|1996-04-13|COLLECT COD|RAIL|lly careful requests. +42533|1053|54|1|22|20989.10|0.02|0.08|N|O|1998-07-31|1998-06-30|1998-08-27|DELIVER IN PERSON|RAIL|sleep boldly regul +42533|1590|31|2|4|5966.36|0.03|0.08|N|O|1998-06-28|1998-08-17|1998-07-01|NONE|RAIL| the final reque +42533|2|53|3|27|24354.00|0.08|0.05|N|O|1998-09-14|1998-07-17|1998-10-07|COLLECT COD|FOB|courts among the daringly un +42533|1362|39|4|43|54324.48|0.00|0.03|N|O|1998-07-13|1998-08-22|1998-07-28|TAKE BACK RETURN|AIR|dolphins are except the u +42534|1445|85|1|42|56550.48|0.02|0.00|A|F|1993-07-10|1993-06-09|1993-08-01|TAKE BACK RETURN|REG AIR|fully across t +42535|898|65|1|21|37776.69|0.07|0.08|N|O|1996-02-27|1996-02-02|1996-03-12|DELIVER IN PERSON|AIR|ost. unusual theodolites sleep. blithely +42535|348|5|2|24|29960.16|0.10|0.00|N|O|1995-12-14|1996-02-01|1996-01-11|NONE|AIR|hy theodolites sleep quickly +42560|527|58|1|37|52818.24|0.04|0.08|R|F|1993-02-16|1992-12-17|1993-03-10|DELIVER IN PERSON|RAIL|ly busy packages doubt quick +42560|1471|72|2|49|67251.03|0.04|0.03|A|F|1992-11-29|1992-12-28|1992-12-03|NONE|MAIL|e slyly after the blithely bold +42560|1619|2|3|40|60824.40|0.01|0.01|R|F|1993-01-25|1993-01-01|1993-02-20|TAKE BACK RETURN|MAIL|uests. quickly regular depths +42561|1924|69|1|50|91296.00|0.09|0.08|A|F|1993-04-03|1993-04-27|1993-04-06|TAKE BACK RETURN|MAIL| accounts nag quickly after the d +42561|1453|93|2|46|62304.70|0.09|0.02|A|F|1993-05-15|1993-04-24|1993-05-28|COLLECT COD|RAIL|posits dazzle +42561|1206|7|3|15|16608.00|0.01|0.01|R|F|1993-02-09|1993-04-21|1993-02-27|TAKE BACK RETURN|AIR| blithely unu +42561|635|36|4|46|70638.98|0.05|0.02|A|F|1993-04-25|1993-03-30|1993-05-22|COLLECT COD|REG AIR|unts are blithely pen +42561|1331|32|5|14|17252.62|0.07|0.03|R|F|1993-05-12|1993-03-24|1993-06-11|COLLECT COD|TRUCK|as. special grouches boost. furiously re +42561|1860|61|6|18|31713.48|0.01|0.00|A|F|1993-04-23|1993-04-10|1993-05-04|NONE|AIR|g to the carefully exp +42561|913|16|7|29|52603.39|0.05|0.05|R|F|1993-05-08|1993-05-01|1993-05-14|TAKE BACK RETURN|FOB|fily around t +42562|702|99|1|1|1602.70|0.01|0.00|A|F|1994-09-29|1994-08-17|1994-10-28|COLLECT COD|REG AIR|fully unusual i +42563|37|13|1|41|38418.23|0.10|0.01|R|F|1993-08-15|1993-10-03|1993-09-09|NONE|FOB|uctions sleep. ironic platelets haggle. c +42563|1200|73|2|11|12113.20|0.00|0.06|A|F|1993-11-26|1993-11-05|1993-11-27|COLLECT COD|AIR| are carefully slyly special acc +42564|470|29|1|2|2740.94|0.07|0.08|A|F|1992-12-16|1992-10-13|1992-12-26|DELIVER IN PERSON|TRUCK|he carefully express deposits. +42564|692|86|2|41|65300.29|0.01|0.00|A|F|1992-11-01|1992-10-28|1992-11-23|NONE|SHIP|thely dogged hockey +42564|958|27|3|44|81793.80|0.06|0.06|R|F|1992-10-23|1992-10-31|1992-10-31|TAKE BACK RETURN|AIR| instructio +42565|1540|61|1|16|23064.64|0.05|0.03|R|F|1993-10-24|1993-12-03|1993-11-02|TAKE BACK RETURN|MAIL|to beans wake. +42565|1798|41|2|34|57792.86|0.06|0.00|R|F|1993-12-07|1993-11-17|1994-01-01|NONE|SHIP|the even, reg +42565|1913|2|3|49|88930.59|0.10|0.06|A|F|1993-12-07|1993-12-13|1993-12-28|DELIVER IN PERSON|TRUCK| even packages about the +42565|838|72|4|45|78247.35|0.08|0.05|R|F|1994-01-10|1993-12-15|1994-02-02|NONE|AIR|the final, express pinto bea +42565|886|53|5|27|48245.76|0.06|0.05|R|F|1993-09-29|1993-10-26|1993-10-06|TAKE BACK RETURN|TRUCK|counts. quickly special p +42565|646|47|6|42|64958.88|0.05|0.08|A|F|1993-10-06|1993-11-27|1993-10-14|COLLECT COD|MAIL| packages: slyly +42566|72|48|1|49|47631.43|0.06|0.07|A|F|1994-04-25|1994-04-13|1994-05-24|DELIVER IN PERSON|SHIP|sits haggle. slyly r +42566|681|13|2|50|79084.00|0.01|0.01|R|F|1994-06-14|1994-04-23|1994-06-15|TAKE BACK RETURN|SHIP| quickly special platelets. furi +42566|526|57|3|15|21397.80|0.10|0.02|R|F|1994-06-13|1994-05-31|1994-07-12|DELIVER IN PERSON|RAIL|es boost reques +42566|1252|53|4|5|5766.25|0.07|0.02|A|F|1994-04-29|1994-05-31|1994-05-10|NONE|SHIP| unusual requests daz +42567|1841|42|1|17|29628.28|0.00|0.08|A|F|1993-01-24|1993-03-20|1993-02-19|TAKE BACK RETURN|FOB|r the even +42567|1400|39|2|9|11712.60|0.02|0.00|A|F|1993-03-16|1993-02-23|1993-04-11|TAKE BACK RETURN|RAIL|ccounts against the slyly express excuse +42567|1151|88|3|22|23147.30|0.08|0.01|R|F|1993-02-27|1993-04-11|1993-03-05|DELIVER IN PERSON|MAIL|unusual, regular deposits sleep caref +42567|1124|61|4|15|15376.80|0.01|0.07|A|F|1993-04-23|1993-02-23|1993-05-20|TAKE BACK RETURN|SHIP|sleep stealthily furi +42567|1357|34|5|18|22650.30|0.08|0.05|R|F|1993-03-16|1993-03-05|1993-03-30|DELIVER IN PERSON|MAIL|c courts wake. carefully express +42592|799|96|1|6|10198.74|0.03|0.05|A|F|1994-09-01|1994-10-03|1994-09-10|TAKE BACK RETURN|RAIL|final warhorses a +42592|716|81|2|33|53351.43|0.00|0.04|A|F|1994-07-25|1994-08-26|1994-07-26|DELIVER IN PERSON|AIR|leep blithely. fluffil +42592|76|27|3|19|18545.33|0.03|0.05|R|F|1994-11-01|1994-08-31|1994-11-25|NONE|REG AIR|rve furiously. i +42592|297|25|4|8|9578.32|0.04|0.04|R|F|1994-10-16|1994-09-26|1994-10-17|NONE|RAIL|ies. regular pack +42592|185|64|5|18|19533.24|0.04|0.04|A|F|1994-09-25|1994-10-01|1994-10-11|COLLECT COD|TRUCK|layers. asymptotes wake quickly across the +42592|139|92|6|21|21821.73|0.10|0.07|A|F|1994-09-25|1994-08-26|1994-10-02|COLLECT COD|TRUCK| silent theo +42593|1232|7|1|11|12465.53|0.07|0.01|N|O|1998-08-09|1998-07-17|1998-08-10|COLLECT COD|SHIP|e furiously ironic accounts detect quickl +42593|1029|35|2|9|8370.18|0.08|0.02|N|O|1998-07-25|1998-07-12|1998-08-24|NONE|FOB| above the final requests. furiously +42593|775|72|3|41|68706.57|0.00|0.06|N|O|1998-06-23|1998-07-24|1998-07-12|TAKE BACK RETURN|RAIL|he foxes. quickly daring accounts na +42593|894|94|4|33|59231.37|0.09|0.05|N|O|1998-09-23|1998-07-11|1998-10-10|DELIVER IN PERSON|TRUCK| pending, ironic pin +42593|1914|15|5|8|14527.28|0.09|0.05|N|O|1998-07-05|1998-07-09|1998-07-22|COLLECT COD|AIR|ges. express deposits sleep caref +42594|1109|46|1|31|31313.10|0.07|0.00|N|O|1996-02-03|1996-02-01|1996-02-26|DELIVER IN PERSON|REG AIR|ites print furiously. final +42594|336|21|2|14|17308.62|0.06|0.00|N|O|1996-02-24|1996-02-09|1996-03-04|TAKE BACK RETURN|AIR| the thinly close instructions. final p +42594|544|35|3|50|72227.00|0.04|0.03|N|O|1996-01-03|1996-01-18|1996-01-31|DELIVER IN PERSON|AIR|across the furiou +42595|1753|80|1|39|64535.25|0.05|0.05|N|O|1997-08-30|1997-09-10|1997-09-05|TAKE BACK RETURN|AIR|lly regular deposits. e +42595|932|35|2|47|86147.71|0.02|0.03|N|O|1997-10-29|1997-09-22|1997-11-26|TAKE BACK RETURN|AIR|ctions cajole +42596|155|8|1|35|36930.25|0.05|0.03|R|F|1992-11-29|1992-10-04|1992-12-09|DELIVER IN PERSON|MAIL|promise carefully. furiously ironic reque +42596|1007|78|2|15|13620.00|0.01|0.01|R|F|1992-11-11|1992-10-13|1992-11-18|COLLECT COD|TRUCK|ely above the carefully express +42597|225|26|1|16|18003.52|0.09|0.03|R|F|1993-06-10|1993-05-09|1993-06-14|DELIVER IN PERSON|SHIP|ss accounts cajole alongside of the close, +42598|782|79|1|3|5048.34|0.10|0.01|N|O|1996-08-22|1996-07-22|1996-08-28|TAKE BACK RETURN|FOB|iously. ideas abou +42598|904|5|2|21|37902.90|0.02|0.06|N|O|1996-05-13|1996-07-06|1996-05-28|NONE|FOB| packages. entic +42598|174|75|3|3|3222.51|0.07|0.07|N|O|1996-08-18|1996-07-25|1996-08-19|TAKE BACK RETURN|SHIP|xes sleep slyly. express pinto b +42598|464|94|4|38|51849.48|0.04|0.00|N|O|1996-07-24|1996-07-28|1996-08-23|COLLECT COD|SHIP|h the furiously express instruc +42598|1235|47|5|45|51130.35|0.04|0.06|N|O|1996-08-17|1996-07-26|1996-09-12|TAKE BACK RETURN|RAIL|ccounts are fluffily even pla +42598|1054|55|6|17|16235.85|0.07|0.06|N|O|1996-07-29|1996-07-12|1996-08-27|DELIVER IN PERSON|AIR|slyly regular pains haggle abo +42599|94|45|1|28|27834.52|0.07|0.04|R|F|1994-04-25|1994-06-13|1994-04-27|COLLECT COD|RAIL|gular, special theodolit +42599|1189|90|2|32|34885.76|0.00|0.01|R|F|1994-08-03|1994-06-12|1994-08-12|NONE|SHIP|uses at the bli +42599|42|68|3|17|16014.68|0.01|0.07|A|F|1994-07-31|1994-05-17|1994-08-15|NONE|SHIP|eposits are furiou +42599|1688|30|4|20|31793.60|0.04|0.00|A|F|1994-04-20|1994-06-07|1994-04-23|TAKE BACK RETURN|MAIL|lose accounts breach. pending packages +42624|678|79|1|7|11050.69|0.10|0.07|A|F|1992-05-06|1992-04-03|1992-06-04|NONE|AIR|y bold theodolites wake carefully final +42624|1432|72|2|18|24001.74|0.10|0.03|R|F|1992-03-17|1992-04-15|1992-04-09|TAKE BACK RETURN|RAIL|egular asy +42624|1154|27|3|44|46426.60|0.08|0.03|A|F|1992-06-02|1992-05-04|1992-06-04|DELIVER IN PERSON|AIR|ven packages are furiously. silent package +42624|967|2|4|27|50434.92|0.05|0.02|A|F|1992-03-21|1992-05-08|1992-03-31|COLLECT COD|FOB|ly express pinto beans h +42624|937|72|5|18|33082.74|0.10|0.00|A|F|1992-03-24|1992-04-14|1992-04-20|COLLECT COD|TRUCK|y. regular, sly +42624|1367|6|6|4|5073.44|0.10|0.07|R|F|1992-06-16|1992-04-16|1992-06-24|NONE|AIR|express packa +42624|1103|76|7|21|21086.10|0.10|0.01|A|F|1992-03-18|1992-04-17|1992-03-21|TAKE BACK RETURN|REG AIR|busily along the fluffily iron +42625|868|68|1|4|7075.44|0.05|0.01|N|O|1997-12-09|1997-10-19|1998-01-03|TAKE BACK RETURN|TRUCK|ter the final, +42625|198|77|2|25|27454.75|0.07|0.02|N|O|1997-12-05|1997-11-13|1998-01-03|COLLECT COD|TRUCK|l requests. even depo +42626|872|73|1|32|56731.84|0.05|0.08|N|O|1998-05-29|1998-03-27|1998-06-27|NONE|AIR|ate slyly unusual pinto beans-- sl +42626|63|14|2|9|8667.54|0.09|0.03|N|O|1998-03-20|1998-04-12|1998-03-26|TAKE BACK RETURN|RAIL|lets. slyly even realms use furiously +42626|1155|64|3|32|33796.80|0.05|0.01|N|O|1998-04-06|1998-04-01|1998-05-03|COLLECT COD|SHIP|ly regular pinto +42626|1698|99|4|34|54389.46|0.06|0.06|N|O|1998-04-21|1998-03-21|1998-05-08|NONE|AIR|uickly ironic, fluffy deposits. bold +42626|1704|31|5|16|25691.20|0.10|0.00|N|O|1998-03-31|1998-03-20|1998-04-11|NONE|SHIP|ts. final, ruthless foxes above the +42626|131|84|6|15|15466.95|0.10|0.00|N|O|1998-03-08|1998-04-22|1998-04-02|NONE|SHIP|l dolphins. unu +42626|439|40|7|33|44201.19|0.06|0.07|N|O|1998-02-16|1998-04-25|1998-03-06|DELIVER IN PERSON|SHIP|nag blithely. slyly regular deposits +42627|802|36|1|46|78328.80|0.00|0.06|N|O|1996-12-29|1997-01-12|1997-01-04|NONE|REG AIR|ach. carefully unusual frays boost. bli +42628|660|23|1|12|18727.92|0.09|0.01|N|F|1995-06-05|1995-06-05|1995-07-04|DELIVER IN PERSON|REG AIR|efully blithely regular accounts. +42628|17|68|2|41|37597.41|0.08|0.02|N|O|1995-07-31|1995-07-23|1995-08-07|NONE|SHIP|deposits haggle slyly alon +42628|1594|35|3|17|25425.03|0.05|0.04|N|O|1995-07-03|1995-07-17|1995-07-26|DELIVER IN PERSON|REG AIR|ly final pinto beans +42629|1001|7|1|30|27060.00|0.05|0.05|R|F|1994-02-15|1994-03-30|1994-03-16|COLLECT COD|MAIL|re thinly. special requests are carefully i +42630|1242|80|1|13|14862.12|0.06|0.08|A|F|1993-03-24|1993-02-24|1993-04-20|DELIVER IN PERSON|TRUCK|tes. fluffily final +42631|1986|87|1|31|58527.38|0.05|0.00|R|F|1994-08-02|1994-07-27|1994-08-29|DELIVER IN PERSON|RAIL|r ideas are after the final, express +42631|1679|3|2|29|45839.43|0.06|0.06|R|F|1994-06-14|1994-07-24|1994-07-13|NONE|TRUCK|the accounts. slyly unusual th +42631|1600|21|3|11|16517.60|0.10|0.04|A|F|1994-08-28|1994-06-16|1994-09-22|DELIVER IN PERSON|AIR|ites about the slyly regular requests boos +42631|766|63|4|15|25001.40|0.08|0.07|A|F|1994-05-11|1994-07-26|1994-05-25|DELIVER IN PERSON|MAIL|e dependencies. slyly final ideas +42631|1423|2|5|20|26488.40|0.04|0.07|A|F|1994-06-14|1994-07-30|1994-07-08|DELIVER IN PERSON|RAIL| sleep blithely slyly reg +42631|517|78|6|34|48195.34|0.08|0.08|R|F|1994-05-17|1994-06-30|1994-05-26|TAKE BACK RETURN|AIR|equests sleep furiously under the +42631|274|29|7|18|21136.86|0.08|0.05|R|F|1994-06-01|1994-06-18|1994-06-02|DELIVER IN PERSON|REG AIR|e furiously about +42656|871|38|1|25|44296.75|0.00|0.04|N|O|1996-01-05|1996-01-08|1996-01-29|COLLECT COD|RAIL|accounts h +42656|596|87|2|34|50884.06|0.10|0.05|N|O|1996-02-12|1996-02-07|1996-03-06|NONE|TRUCK|cial requests use fluffily among the regula +42656|869|3|3|34|60175.24|0.05|0.08|N|O|1996-01-28|1996-01-30|1996-01-30|DELIVER IN PERSON|FOB|cording to the slyly pending epitaphs. s +42656|1171|8|4|10|10721.70|0.00|0.05|N|O|1996-01-27|1996-01-14|1996-02-08|DELIVER IN PERSON|SHIP|ptotes. ironic, regular requests x-ray. s +42657|1888|89|1|29|51906.52|0.02|0.06|N|O|1995-11-21|1995-12-09|1995-12-18|COLLECT COD|SHIP|iously ironic p +42657|1643|67|2|27|41705.28|0.03|0.02|N|O|1995-10-16|1995-11-27|1995-10-22|COLLECT COD|RAIL|thely regular packages-- unusual accounts w +42657|1202|77|3|21|23167.20|0.05|0.08|N|O|1995-10-09|1995-12-19|1995-10-24|COLLECT COD|MAIL| cajole fox +42658|1293|94|1|34|40605.86|0.03|0.07|A|F|1993-08-07|1993-08-01|1993-08-24|TAKE BACK RETURN|REG AIR|entiments ag +42658|451|81|2|29|39192.05|0.04|0.05|R|F|1993-08-19|1993-07-17|1993-08-24|COLLECT COD|MAIL|. fluffily reg +42658|1302|3|3|35|42115.50|0.07|0.08|A|F|1993-10-04|1993-09-10|1993-10-28|COLLECT COD|RAIL|ironic, final requests alongside of the +42659|1450|68|1|10|13514.50|0.06|0.00|N|O|1995-07-30|1995-10-10|1995-08-03|TAKE BACK RETURN|SHIP| quickly carefully ironi +42659|357|14|2|31|38977.85|0.06|0.04|N|O|1995-10-01|1995-08-18|1995-10-08|TAKE BACK RETURN|TRUCK|as sleep. permanent, +42659|1419|98|3|1|1320.41|0.04|0.02|N|O|1995-08-31|1995-10-11|1995-09-13|DELIVER IN PERSON|TRUCK|uickly regular deposit +42659|1947|92|4|4|7395.76|0.02|0.08|N|O|1995-11-01|1995-10-07|1995-11-27|COLLECT COD|TRUCK| accounts use slyly. regular excuses +42659|419|49|5|24|31665.84|0.09|0.00|N|O|1995-10-23|1995-09-18|1995-11-21|COLLECT COD|MAIL|eans. furiously bold dolp +42660|366|23|1|9|11397.24|0.05|0.08|N|O|1997-06-05|1997-03-23|1997-06-12|NONE|REG AIR|ly alongside of the special pa +42660|562|93|2|28|40951.68|0.02|0.00|N|O|1997-05-19|1997-05-11|1997-05-27|COLLECT COD|AIR|uffily? furi +42660|1328|5|3|5|6146.60|0.09|0.00|N|O|1997-03-23|1997-04-24|1997-04-10|DELIVER IN PERSON|REG AIR|its haggle fluffily blithely r +42660|875|76|4|10|17758.70|0.05|0.04|N|O|1997-04-17|1997-03-26|1997-04-18|DELIVER IN PERSON|AIR|heodolites integrat +42660|1974|19|5|3|5627.91|0.09|0.08|N|O|1997-06-03|1997-04-16|1997-06-25|TAKE BACK RETURN|AIR|ffily. requests cajol +42661|464|94|1|37|50485.02|0.01|0.05|N|O|1998-05-30|1998-06-18|1998-06-06|DELIVER IN PERSON|TRUCK|ously about the ironi +42661|1333|72|2|15|18514.95|0.04|0.02|N|O|1998-06-30|1998-07-31|1998-07-13|TAKE BACK RETURN|MAIL|haggle according to the slyly fin +42661|1010|11|3|45|40995.45|0.00|0.03|N|O|1998-06-01|1998-07-02|1998-06-11|DELIVER IN PERSON|REG AIR| instructions. caref +42661|1339|78|4|11|13643.63|0.03|0.01|N|O|1998-07-02|1998-06-22|1998-07-08|TAKE BACK RETURN|FOB|lways. quickly unusual instruct +42661|1161|34|5|40|42486.40|0.06|0.02|N|O|1998-07-10|1998-06-15|1998-07-19|NONE|AIR| final instructions along the quic +42661|204|86|6|50|55210.00|0.08|0.00|N|O|1998-09-04|1998-08-04|1998-09-28|COLLECT COD|MAIL|requests hang blithely. ironic ideas +42661|1234|46|7|3|3405.69|0.06|0.02|N|O|1998-08-11|1998-06-20|1998-08-14|COLLECT COD|MAIL|es. carefully even requ +42662|1227|28|1|14|15795.08|0.08|0.02|N|O|1997-09-26|1997-09-12|1997-10-02|DELIVER IN PERSON|SHIP|eep furiously instead of the ironic, +42663|1677|78|1|30|47360.10|0.00|0.02|N|O|1998-03-10|1998-05-05|1998-04-07|DELIVER IN PERSON|MAIL|essly unusual pinto +42663|1163|72|2|40|42566.40|0.00|0.02|N|O|1998-04-16|1998-04-08|1998-04-22|TAKE BACK RETURN|SHIP| run about the carefully regular idea +42688|1180|81|1|48|51896.64|0.07|0.08|R|F|1992-11-30|1992-09-17|1992-12-15|NONE|TRUCK| asymptotes wake furiously. s +42689|75|1|1|43|41928.01|0.08|0.07|N|O|1995-12-22|1996-02-29|1995-12-24|NONE|REG AIR|ts. final, re +42690|610|42|1|41|61935.01|0.03|0.00|A|F|1993-12-18|1993-11-16|1993-12-30|DELIVER IN PERSON|SHIP|ending dep +42690|41|42|2|25|23526.00|0.06|0.06|R|F|1993-10-02|1993-11-18|1993-10-19|COLLECT COD|TRUCK| along the regular +42690|943|12|3|10|18439.40|0.10|0.08|A|F|1993-11-05|1993-10-31|1993-11-11|NONE|MAIL|deas. final, +42690|1312|27|4|7|8493.17|0.06|0.05|A|F|1993-11-27|1993-12-13|1993-12-03|COLLECT COD|AIR|ly bold dependencies breach furious +42691|1765|50|1|36|60003.36|0.06|0.02|A|F|1993-08-18|1993-07-21|1993-08-19|COLLECT COD|RAIL| theodolites against the blithely reg +42691|793|90|2|12|20325.48|0.00|0.08|A|F|1993-08-18|1993-07-27|1993-09-11|TAKE BACK RETURN|FOB|lly careful ideas are permanently across t +42691|1053|89|3|17|16218.85|0.04|0.01|R|F|1993-07-03|1993-08-02|1993-07-06|NONE|RAIL|ully. quickly f +42691|683|77|4|39|61763.52|0.01|0.04|A|F|1993-08-22|1993-06-24|1993-09-20|TAKE BACK RETURN|TRUCK|. requests detect against the fur +42691|953|88|5|17|31517.15|0.09|0.06|A|F|1993-06-29|1993-08-04|1993-07-05|COLLECT COD|TRUCK|eas; blithely bold packages about th +42691|727|92|6|15|24415.80|0.10|0.08|A|F|1993-07-24|1993-07-04|1993-07-26|NONE|MAIL| carefully. even theo +42691|1373|88|7|15|19115.55|0.08|0.04|A|F|1993-06-19|1993-06-27|1993-07-12|TAKE BACK RETURN|SHIP|r, even dependencies. slyly f +42692|1688|71|1|18|28614.24|0.10|0.07|N|O|1996-02-15|1996-03-18|1996-03-14|DELIVER IN PERSON|FOB|even dependencies lose beside the reg +42692|1070|41|2|29|28161.03|0.01|0.03|N|O|1995-12-26|1996-03-12|1996-01-20|TAKE BACK RETURN|AIR|en foxes haggle care +42692|1422|40|3|48|63524.16|0.10|0.04|N|O|1996-01-14|1996-02-25|1996-02-05|COLLECT COD|SHIP|arefully final deposits caj +42692|1912|1|4|47|85253.77|0.10|0.00|N|O|1996-04-12|1996-03-05|1996-04-25|COLLECT COD|REG AIR|s affix slyly +42692|1018|24|5|24|22056.24|0.04|0.06|N|O|1996-03-07|1996-02-21|1996-03-27|DELIVER IN PERSON|RAIL|al deposits. slyly ironic requests +42693|1225|26|1|41|46175.02|0.08|0.04|A|F|1994-07-01|1994-06-05|1994-07-09|COLLECT COD|SHIP|the final deposits. pack +42693|1551|72|2|27|39218.85|0.10|0.02|A|F|1994-05-01|1994-05-08|1994-05-10|NONE|TRUCK|usual asymptotes bre +42693|1943|88|3|20|36898.80|0.04|0.06|A|F|1994-04-13|1994-05-15|1994-05-09|COLLECT COD|RAIL|n pinto beans. quickly +42693|431|61|4|21|27960.03|0.00|0.04|A|F|1994-06-18|1994-07-04|1994-07-04|COLLECT COD|MAIL|s. carefully +42693|1522|43|5|2|2847.04|0.06|0.05|R|F|1994-04-23|1994-05-24|1994-05-22|COLLECT COD|RAIL|le carefully. pinto beans are sile +42694|622|23|1|24|36542.88|0.07|0.02|N|O|1996-05-18|1996-05-06|1996-05-25|DELIVER IN PERSON|TRUCK|ts sleep furiously. +42694|943|46|2|37|68225.78|0.05|0.00|N|O|1996-07-09|1996-06-13|1996-07-13|DELIVER IN PERSON|MAIL|the furiously express acc +42694|555|46|3|24|34933.20|0.07|0.01|N|O|1996-07-25|1996-05-13|1996-08-13|TAKE BACK RETURN|SHIP|uests about the +42694|1537|58|4|13|18700.89|0.06|0.03|N|O|1996-04-22|1996-06-16|1996-05-21|TAKE BACK RETURN|MAIL|gle fluffily. realms cajole +42694|1373|88|5|1|1274.37|0.09|0.03|N|O|1996-04-28|1996-05-20|1996-05-16|COLLECT COD|SHIP|regular ideas-- furiously fi +42694|1471|89|6|45|61761.15|0.03|0.06|N|O|1996-04-07|1996-06-17|1996-04-27|NONE|FOB|of the furio +42695|492|22|1|19|26457.31|0.02|0.05|R|F|1994-03-18|1994-03-12|1994-04-09|NONE|RAIL|ructions. special g +42720|594|25|1|2|2989.18|0.05|0.07|N|O|1995-11-12|1995-09-24|1995-11-25|DELIVER IN PERSON|MAIL|luffy packages ha +42721|1681|5|1|26|41149.68|0.04|0.04|N|O|1997-04-05|1997-02-03|1997-05-02|COLLECT COD|REG AIR|he instruction +42721|637|31|2|1|1537.63|0.00|0.07|N|O|1997-03-23|1997-01-28|1997-04-09|NONE|TRUCK|ounts. slyly ironic packages sleep quickly +42722|139|92|1|35|36369.55|0.04|0.04|R|F|1992-11-05|1992-12-02|1992-11-07|NONE|MAIL|he ironic pinto beans. pending, stealthy pi +42722|110|63|2|2|2020.22|0.03|0.05|A|F|1992-10-16|1993-01-06|1992-11-08|TAKE BACK RETURN|MAIL|the quickly ironic accounts. final id +42722|299|81|3|3|3597.87|0.06|0.06|R|F|1992-11-12|1992-11-11|1992-12-01|COLLECT COD|TRUCK|of the closely express instruc +42722|1125|98|4|49|50279.88|0.02|0.03|A|F|1992-10-30|1992-12-26|1992-11-22|NONE|SHIP|ccounts. even packages dou +42722|1028|99|5|46|42734.92|0.06|0.05|R|F|1992-10-31|1992-11-27|1992-11-21|NONE|AIR|y express requests. packag +42723|30|6|1|25|23250.75|0.00|0.01|N|O|1998-02-06|1998-03-13|1998-02-18|TAKE BACK RETURN|FOB|usual depende +42723|369|70|2|36|45696.96|0.09|0.00|N|O|1998-02-15|1998-02-25|1998-03-03|COLLECT COD|AIR| carefully after the qu +42723|95|21|3|48|47764.32|0.10|0.04|N|O|1998-03-04|1998-02-28|1998-03-10|TAKE BACK RETURN|MAIL|onic instructions cajole. sl +42723|500|30|4|19|26609.50|0.09|0.03|N|O|1998-02-12|1998-03-21|1998-02-19|NONE|RAIL|g accounts +42724|214|15|1|4|4456.84|0.04|0.01|N|O|1996-12-11|1996-11-21|1996-12-30|NONE|FOB| requests are carefully above t +42724|1148|49|2|20|20982.80|0.08|0.04|N|O|1996-10-11|1996-10-01|1996-10-15|TAKE BACK RETURN|REG AIR|y regular courts wake quickly +42725|1198|71|1|6|6595.14|0.03|0.07|N|O|1995-08-01|1995-07-03|1995-08-08|NONE|MAIL|breach furiously. +42725|171|24|2|50|53558.50|0.01|0.03|N|O|1995-07-09|1995-06-09|1995-07-27|NONE|TRUCK|l, idle dependencies. slyly fi +42725|707|72|3|22|35369.40|0.01|0.03|N|O|1995-08-16|1995-06-19|1995-08-26|COLLECT COD|TRUCK|s. blithely final dependencies affix after +42725|567|28|4|35|51364.60|0.06|0.08|N|O|1995-08-06|1995-06-27|1995-09-05|NONE|REG AIR|old foxes alo +42726|899|33|1|40|71995.60|0.05|0.01|R|F|1993-08-11|1993-10-08|1993-08-17|NONE|SHIP|posits mold deposits +42726|1658|41|2|42|65505.30|0.05|0.04|A|F|1993-09-29|1993-09-07|1993-10-26|NONE|AIR|requests. ironic pinto beans wak +42726|1379|18|3|38|48654.06|0.05|0.00|A|F|1993-10-16|1993-09-21|1993-11-14|TAKE BACK RETURN|MAIL|tes sleep quickly +42727|170|71|1|40|42806.80|0.05|0.04|A|F|1995-05-04|1995-07-02|1995-06-03|DELIVER IN PERSON|MAIL|ns integrate. carefully ironic pinto beans +42727|1695|19|2|50|79834.50|0.08|0.04|N|F|1995-06-02|1995-07-05|1995-07-01|COLLECT COD|SHIP|express platelets haggle ironic +42727|304|89|3|1|1204.30|0.03|0.07|N|O|1995-07-07|1995-06-06|1995-07-20|NONE|SHIP| instructions cajole fur +42752|1126|99|1|3|3081.36|0.06|0.01|N|O|1996-10-14|1996-12-06|1996-11-13|TAKE BACK RETURN|MAIL|r, pending instructions ha +42752|1927|28|2|22|40236.24|0.02|0.02|N|O|1996-10-20|1996-11-19|1996-11-08|COLLECT COD|TRUCK|hely careful pinto bea +42752|1071|42|3|29|28190.03|0.03|0.00|N|O|1996-12-26|1996-10-28|1997-01-24|TAKE BACK RETURN|RAIL|fluffily regular requests wake furiously i +42753|1581|22|1|33|48925.14|0.00|0.04|A|F|1992-03-09|1992-03-24|1992-03-15|NONE|AIR|hes around the fi +42753|1989|34|2|18|34037.64|0.02|0.06|A|F|1992-03-11|1992-03-28|1992-03-23|DELIVER IN PERSON|FOB|nts. ironic courts sleep among t +42753|1096|2|3|19|18944.71|0.04|0.03|A|F|1992-02-02|1992-02-18|1992-02-07|NONE|FOB|. regular requests integra +42753|842|42|4|16|27885.44|0.03|0.07|A|F|1992-04-27|1992-04-10|1992-04-28|NONE|MAIL|tes. slyly ironic deposits according +42754|1925|14|1|29|52980.68|0.01|0.03|A|F|1993-08-29|1993-11-17|1993-09-15|NONE|AIR|wind against the slyly bold deposits. regu +42754|1989|90|2|43|81312.14|0.09|0.04|A|F|1993-10-31|1993-10-12|1993-11-26|TAKE BACK RETURN|AIR| among the blithely careful forges sleep +42754|965|68|3|9|16793.64|0.08|0.06|R|F|1993-10-05|1993-11-20|1993-10-10|COLLECT COD|AIR| packages would print +42754|1955|100|4|29|53851.55|0.04|0.06|A|F|1993-10-16|1993-10-03|1993-11-15|COLLECT COD|AIR|egular platelets cajol +42754|408|9|5|6|7850.40|0.07|0.02|A|F|1993-08-30|1993-10-13|1993-09-13|NONE|FOB|ully pending, bold +42754|1880|24|6|15|26728.20|0.03|0.05|A|F|1993-12-04|1993-11-08|1993-12-18|NONE|RAIL|ironic pin +42754|134|13|7|27|27921.51|0.00|0.08|R|F|1993-12-17|1993-11-21|1994-01-16|COLLECT COD|RAIL|al pinto beans +42755|1659|1|1|25|39016.25|0.01|0.00|A|F|1992-11-24|1992-10-26|1992-12-04|TAKE BACK RETURN|SHIP|e regular, regu +42755|1264|2|2|18|20974.68|0.05|0.01|R|F|1992-09-30|1992-10-28|1992-10-19|DELIVER IN PERSON|MAIL|even ideas play slyly. furiously sil +42755|606|100|3|47|70810.20|0.08|0.05|A|F|1992-11-06|1992-09-26|1992-11-09|TAKE BACK RETURN|REG AIR|packages sleep carefully according +42756|794|59|1|10|16947.90|0.03|0.06|R|F|1993-07-06|1993-07-30|1993-07-11|COLLECT COD|TRUCK|e furiousl +42756|176|29|2|46|49503.82|0.00|0.01|R|F|1993-09-02|1993-08-05|1993-09-23|DELIVER IN PERSON|TRUCK|accounts serve. carefully clo +42756|23|74|3|43|39689.86|0.04|0.06|R|F|1993-09-02|1993-09-18|1993-09-09|DELIVER IN PERSON|MAIL| express dependencies +42756|1140|49|4|4|4164.56|0.09|0.07|A|F|1993-07-15|1993-09-18|1993-07-31|DELIVER IN PERSON|TRUCK|ss deposits; slyly special requests hag +42756|1411|51|5|3|3937.23|0.07|0.05|A|F|1993-09-18|1993-08-15|1993-10-14|NONE|TRUCK|ag slyly according to the blithel +42756|586|17|6|16|23785.28|0.05|0.07|R|F|1993-08-14|1993-08-11|1993-08-28|DELIVER IN PERSON|REG AIR|to the blithely final accounts. ideas wake +42757|1309|48|1|46|55673.80|0.06|0.02|N|O|1995-06-25|1995-08-20|1995-07-01|COLLECT COD|SHIP| always special packages affix against the +42757|1071|72|2|10|9720.70|0.10|0.01|N|F|1995-06-01|1995-08-13|1995-06-25|DELIVER IN PERSON|RAIL|ously regular orbits +42758|1564|65|1|1|1465.56|0.02|0.06|R|F|1993-02-18|1993-02-07|1993-02-20|TAKE BACK RETURN|MAIL|e. quickly pend +42758|1|27|2|40|36040.00|0.10|0.05|R|F|1993-03-01|1993-01-09|1993-03-08|DELIVER IN PERSON|REG AIR|t blithely between the quickly final theodo +42758|630|24|3|37|56633.31|0.10|0.02|R|F|1992-11-16|1992-12-18|1992-12-13|NONE|TRUCK|ly regular +42758|9|35|4|18|16362.00|0.06|0.05|A|F|1993-02-15|1992-12-15|1993-03-09|COLLECT COD|MAIL|ajole slyly about the instructions +42758|1962|7|5|40|74558.40|0.04|0.01|A|F|1993-01-08|1993-01-27|1993-01-11|DELIVER IN PERSON|AIR|y ironic sauternes haggle quickly. blithe +42758|1188|25|6|6|6535.08|0.08|0.08|R|F|1993-01-03|1992-12-12|1993-01-28|COLLECT COD|FOB|haggle carefully unusual requests. +42758|1404|22|7|1|1305.40|0.00|0.07|R|F|1993-01-19|1992-12-21|1993-02-15|TAKE BACK RETURN|RAIL|enticingly final platelets. sly +42759|1780|65|1|19|31953.82|0.09|0.01|N|O|1997-05-18|1997-04-25|1997-05-29|TAKE BACK RETURN|AIR|fter the carefully unusual escapades-- s +42759|1937|38|2|39|71718.27|0.00|0.08|N|O|1997-04-24|1997-04-30|1997-05-09|DELIVER IN PERSON|REG AIR|ly regular deposits boost blith +42759|1669|52|3|8|12565.28|0.09|0.04|N|O|1997-02-23|1997-03-18|1997-03-15|TAKE BACK RETURN|MAIL|s. slyly bold +42759|620|21|4|9|13685.58|0.03|0.00|N|O|1997-04-28|1997-04-09|1997-05-24|TAKE BACK RETURN|MAIL|refully regular deposits. careful accou +42759|215|43|5|49|54645.29|0.00|0.06|N|O|1997-04-10|1997-03-25|1997-05-01|NONE|RAIL|ter the ironic deposits. carefully pending +42759|1832|33|6|47|81490.01|0.05|0.05|N|O|1997-06-02|1997-03-31|1997-07-02|NONE|REG AIR| deposits wake around +42784|1550|31|1|36|52255.80|0.10|0.02|N|O|1996-06-03|1996-06-11|1996-06-13|COLLECT COD|AIR|ly regular pac +42784|1232|7|2|25|28330.75|0.10|0.04|N|O|1996-08-22|1996-06-17|1996-09-05|DELIVER IN PERSON|RAIL|ven dependencies. special, bo +42785|1393|94|1|36|46598.04|0.08|0.01|N|O|1996-09-25|1996-10-22|1996-10-17|DELIVER IN PERSON|TRUCK|fter the carefully ironic instruc +42785|1523|24|2|24|34188.48|0.10|0.03|N|O|1996-09-24|1996-11-29|1996-09-30|DELIVER IN PERSON|FOB|old ideas. bold +42785|1990|91|3|17|32163.83|0.10|0.03|N|O|1996-12-22|1996-10-13|1997-01-02|NONE|TRUCK|ockey players about the even reques +42785|971|40|4|5|9359.85|0.08|0.01|N|O|1997-01-02|1996-11-01|1997-01-20|COLLECT COD|RAIL|along the blithely +42785|1775|2|5|1|1676.77|0.02|0.05|N|O|1996-11-02|1996-11-20|1996-11-09|COLLECT COD|FOB|lly. ironic packages haggl +42785|1615|98|6|49|74313.89|0.03|0.08|N|O|1997-01-08|1996-11-27|1997-01-26|TAKE BACK RETURN|REG AIR| packages haggle furiously above the reques +42785|1641|24|7|24|37023.36|0.07|0.08|N|O|1996-12-19|1996-10-22|1996-12-24|NONE|RAIL|gular pinto beans sleep by the exp +42786|867|68|1|43|76017.98|0.00|0.05|R|F|1993-12-08|1993-12-03|1994-01-07|DELIVER IN PERSON|RAIL|about the blithely even deposits. platelets +42786|870|4|2|36|63751.32|0.05|0.06|R|F|1993-11-04|1993-12-16|1993-12-02|DELIVER IN PERSON|RAIL|ular accounts try to wake car +42786|606|7|3|25|37665.00|0.00|0.05|A|F|1993-10-22|1993-11-16|1993-11-04|TAKE BACK RETURN|SHIP|ely bold request +42786|1164|37|4|37|39410.92|0.08|0.07|R|F|1993-10-30|1994-01-03|1993-11-09|NONE|SHIP|uests sleep carefully bold pac +42787|846|13|1|26|45417.84|0.03|0.01|N|O|1997-08-31|1997-07-10|1997-09-24|NONE|SHIP|ing instructions against the regular +42787|1034|35|2|16|14960.48|0.04|0.08|N|O|1997-09-14|1997-08-14|1997-09-19|DELIVER IN PERSON|REG AIR|ular theodolites +42787|301|86|3|11|13214.30|0.07|0.03|N|O|1997-06-06|1997-06-19|1997-06-29|COLLECT COD|REG AIR|nal pinto beans shall ha +42787|1684|26|4|43|68184.24|0.07|0.01|N|O|1997-09-12|1997-07-10|1997-09-13|TAKE BACK RETURN|AIR|carefully up the carefully ironic foxe +42787|1045|16|5|14|13244.56|0.08|0.01|N|O|1997-08-23|1997-06-21|1997-09-16|DELIVER IN PERSON|MAIL|r deposits are carefully +42787|293|21|6|40|47731.60|0.01|0.04|N|O|1997-07-13|1997-07-10|1997-07-25|DELIVER IN PERSON|RAIL|ts alongside of the deposits nag carefully +42787|1194|95|7|5|5475.95|0.09|0.07|N|O|1997-07-13|1997-06-15|1997-08-10|NONE|AIR|ly unusual foxes. express i +42788|825|25|1|15|25887.30|0.06|0.05|N|O|1995-12-23|1996-01-12|1996-01-11|NONE|REG AIR|theodolites sleep slyly thin package +42788|1460|100|2|11|14976.06|0.10|0.06|N|O|1995-11-29|1995-12-03|1995-12-15|COLLECT COD|TRUCK|mong the final, unusual f +42788|416|46|3|24|31593.84|0.03|0.08|N|O|1995-10-29|1995-12-17|1995-11-11|DELIVER IN PERSON|TRUCK|haggle slyly amon +42788|1023|94|4|30|27720.60|0.04|0.05|N|O|1995-11-21|1996-01-02|1995-12-11|COLLECT COD|RAIL|nstructions are. even, re +42789|419|7|1|23|30346.43|0.02|0.06|A|F|1992-03-21|1992-04-06|1992-03-30|TAKE BACK RETURN|RAIL|gainst the slyly silent foxes hag +42790|1715|16|1|48|77602.08|0.08|0.07|N|O|1998-05-27|1998-06-02|1998-06-22|NONE|RAIL|as are furiously specia +42790|1912|45|2|29|52603.39|0.06|0.08|N|O|1998-06-16|1998-07-02|1998-07-05|TAKE BACK RETURN|REG AIR|ely even ideas. +42790|1106|15|3|27|27191.70|0.01|0.07|N|O|1998-06-11|1998-06-04|1998-07-02|COLLECT COD|SHIP|boost across the reg +42790|125|52|4|33|33828.96|0.06|0.01|N|O|1998-05-12|1998-06-03|1998-05-27|COLLECT COD|FOB|ding deposits use. deposits affix carefull +42790|1794|95|5|4|6783.16|0.07|0.01|N|O|1998-07-22|1998-06-28|1998-08-07|NONE|RAIL|xpress accounts. +42790|171|98|6|44|47131.48|0.10|0.06|N|O|1998-05-30|1998-06-14|1998-06-03|COLLECT COD|RAIL|ly ironic deposits hagg +42790|1170|79|7|13|13925.21|0.06|0.03|N|O|1998-08-15|1998-07-24|1998-09-05|NONE|AIR| quickly among the packages. fu +42791|593|54|1|21|31365.39|0.06|0.06|N|O|1998-01-23|1998-03-08|1998-01-26|NONE|RAIL|s. furious +42816|340|25|1|19|23566.46|0.04|0.07|R|F|1992-05-21|1992-04-20|1992-06-02|COLLECT COD|TRUCK|e fluffily fina +42816|262|44|2|47|54626.22|0.07|0.05|A|F|1992-04-11|1992-05-20|1992-05-04|TAKE BACK RETURN|FOB|its? requests wake furiously. silent, +42816|1764|49|3|24|39978.24|0.01|0.05|A|F|1992-04-04|1992-05-22|1992-04-14|NONE|SHIP|regular pinto beans are slyly +42816|308|9|4|24|28999.20|0.05|0.05|R|F|1992-04-10|1992-05-15|1992-04-25|DELIVER IN PERSON|TRUCK|riously alongside of t +42816|1685|86|5|32|50773.76|0.08|0.06|A|F|1992-06-30|1992-06-11|1992-07-17|DELIVER IN PERSON|MAIL|ar foxes affix quiet +42817|1008|44|1|41|37269.00|0.04|0.02|N|O|1997-09-25|1997-11-25|1997-10-06|NONE|RAIL|g excuses. furious +42817|536|97|2|24|34476.72|0.09|0.08|N|O|1997-12-11|1997-10-01|1997-12-13|TAKE BACK RETURN|RAIL| regular ideas +42818|1304|81|1|32|38569.60|0.06|0.02|A|F|1993-07-13|1993-08-12|1993-08-01|DELIVER IN PERSON|FOB| deposits wake among the f +42818|1234|46|2|23|26110.29|0.09|0.05|R|F|1993-09-12|1993-08-21|1993-09-28|TAKE BACK RETURN|SHIP|nts haggle blithely. ruthle +42819|1377|16|1|37|47299.69|0.04|0.07|N|O|1998-04-13|1998-05-03|1998-04-27|TAKE BACK RETURN|SHIP|kly regular deposits. quickly unusual hocke +42819|388|73|2|40|51535.20|0.10|0.05|N|O|1998-07-22|1998-06-03|1998-08-11|COLLECT COD|TRUCK|ackages wake carefully accordi +42819|1724|67|3|23|37391.56|0.06|0.01|N|O|1998-04-12|1998-06-24|1998-04-18|NONE|RAIL|c instructions. special requests do thr +42819|591|82|4|7|10441.13|0.03|0.07|N|O|1998-06-27|1998-05-31|1998-07-04|DELIVER IN PERSON|RAIL|ounts wake idly. carefull +42820|1640|82|1|45|69373.80|0.08|0.08|A|F|1993-03-30|1993-05-15|1993-04-11|TAKE BACK RETURN|TRUCK|he ironic, express +42821|1838|39|1|37|64373.71|0.03|0.03|N|O|1997-10-10|1997-10-06|1997-10-18|NONE|AIR|g the blithely u +42821|909|12|2|49|88685.10|0.10|0.02|N|O|1997-11-01|1997-09-18|1997-11-21|COLLECT COD|REG AIR| boost fluffily furiously final accounts. +42821|1479|19|3|50|69023.50|0.00|0.08|N|O|1997-08-22|1997-10-05|1997-09-10|TAKE BACK RETURN|AIR|ound the foxes use sly +42821|1397|12|4|29|37653.31|0.10|0.02|N|O|1997-08-15|1997-09-27|1997-08-27|COLLECT COD|RAIL|ainst the +42821|987|56|5|23|43423.54|0.05|0.08|N|O|1997-10-26|1997-10-06|1997-11-07|COLLECT COD|RAIL|nic instructions cajole carefully regular +42822|405|93|1|7|9137.80|0.10|0.04|N|O|1998-08-11|1998-06-11|1998-08-18|DELIVER IN PERSON|SHIP| ironic accou +42822|473|32|2|30|41204.10|0.08|0.02|N|O|1998-06-01|1998-06-13|1998-06-18|DELIVER IN PERSON|AIR|ackages after the regular, ironic ideas bo +42822|933|68|3|48|88028.64|0.10|0.00|N|O|1998-05-25|1998-07-05|1998-06-19|DELIVER IN PERSON|TRUCK|odolites. pinto beans cajole quic +42822|886|87|4|31|55393.28|0.06|0.04|N|O|1998-06-05|1998-07-16|1998-07-03|COLLECT COD|SHIP|ole quickly whithout the +42822|1283|21|5|35|41449.80|0.09|0.02|N|O|1998-08-07|1998-05-31|1998-08-11|TAKE BACK RETURN|TRUCK|ng accounts play slyly blithely bol +42822|544|35|6|8|11556.32|0.10|0.06|N|O|1998-08-18|1998-07-10|1998-08-31|NONE|REG AIR|al foxes: enticingly final accounts cajol +42823|1854|98|1|14|24581.90|0.00|0.01|R|F|1993-09-03|1993-09-15|1993-09-15|COLLECT COD|AIR| carefully. platelets a +42823|767|100|2|10|16677.60|0.10|0.00|R|F|1993-06-28|1993-09-12|1993-07-04|TAKE BACK RETURN|MAIL|e the unusual, regular deposits. unusual +42823|116|17|3|7|7112.77|0.06|0.04|A|F|1993-10-24|1993-09-18|1993-10-25|COLLECT COD|RAIL|ses. furio +42823|1145|54|4|19|19876.66|0.07|0.02|A|F|1993-10-02|1993-07-28|1993-10-06|DELIVER IN PERSON|REG AIR| requests according to the slyly even ac +42823|330|87|5|42|51673.86|0.06|0.01|R|F|1993-07-23|1993-08-20|1993-08-02|DELIVER IN PERSON|MAIL| packages cajole final deposit +42823|1119|20|6|46|46925.06|0.04|0.05|R|F|1993-08-14|1993-08-13|1993-09-12|COLLECT COD|SHIP|ns. blithely ironic gifts haggle. blit +42848|1528|69|1|22|31449.44|0.04|0.04|R|F|1992-12-30|1992-11-15|1993-01-24|TAKE BACK RETURN|RAIL|ld frays boost quickly regular instruc +42849|1477|78|1|21|28947.87|0.02|0.07|N|O|1996-07-19|1996-07-08|1996-07-31|DELIVER IN PERSON|FOB|ct carefull +42849|1523|24|2|44|62678.88|0.05|0.08|N|O|1996-08-14|1996-07-07|1996-08-15|DELIVER IN PERSON|FOB|packages about the busily regul +42849|302|3|3|13|15629.90|0.09|0.08|N|O|1996-05-26|1996-08-01|1996-05-29|COLLECT COD|FOB|e slyly fluff +42849|796|29|4|31|52600.49|0.10|0.01|N|O|1996-07-27|1996-07-13|1996-08-04|NONE|FOB| the express f +42849|320|49|5|6|7321.92|0.07|0.00|N|O|1996-06-18|1996-07-14|1996-07-01|DELIVER IN PERSON|REG AIR|ag around the doggedly re +42850|909|44|1|2|3619.80|0.03|0.01|N|O|1995-07-12|1995-08-13|1995-07-14|NONE|RAIL|ven, regular deposits. fluffily +42850|434|22|2|29|38698.47|0.00|0.07|N|O|1995-07-02|1995-09-03|1995-07-27|DELIVER IN PERSON|SHIP|ites about the carefully +42850|944|79|3|16|29519.04|0.05|0.03|N|O|1995-07-25|1995-08-24|1995-08-12|DELIVER IN PERSON|RAIL|ove the ironic deposits. carefully un +42851|676|77|1|23|36263.41|0.05|0.00|A|F|1994-09-11|1994-07-13|1994-09-30|NONE|RAIL| instructions cajol +42851|1997|42|2|17|32282.83|0.00|0.05|R|F|1994-06-11|1994-07-24|1994-06-17|NONE|TRUCK|s sleep. fluffily even plat +42851|326|11|3|37|45373.84|0.03|0.04|R|F|1994-09-23|1994-08-16|1994-10-14|NONE|REG AIR|al courts sleep carefully pa +42851|867|34|4|34|60107.24|0.02|0.06|A|F|1994-08-04|1994-08-26|1994-08-09|NONE|SHIP|ly ironic deposits impress quick +42851|385|86|5|32|41132.16|0.05|0.04|A|F|1994-07-19|1994-07-12|1994-08-12|NONE|MAIL|hely regular ideas. fluffily speci +42852|1874|4|1|42|74586.54|0.03|0.08|A|F|1995-04-14|1995-02-13|1995-04-22|TAKE BACK RETURN|MAIL|ely ironic accounts. +42852|1736|37|2|7|11464.11|0.00|0.00|R|F|1995-02-09|1995-03-17|1995-02-14|NONE|RAIL|ly ideas. quickly regular fr +42853|715|48|1|1|1615.71|0.04|0.02|N|O|1997-03-25|1997-01-21|1997-04-09|TAKE BACK RETURN|REG AIR|efully. final de +42853|1625|67|2|2|3053.24|0.08|0.03|N|O|1997-03-30|1997-01-14|1997-04-21|COLLECT COD|REG AIR|e slyly final deposits. ironic deposits +42854|497|98|1|49|68477.01|0.04|0.08|N|O|1998-02-28|1998-03-24|1998-03-13|DELIVER IN PERSON|AIR|ithely pending theodolites. quickly even +42854|212|94|2|33|36702.93|0.02|0.00|N|O|1998-03-02|1998-04-30|1998-03-27|COLLECT COD|TRUCK|nding deposits. slyly even re +42854|1669|70|3|16|25130.56|0.07|0.03|N|O|1998-03-07|1998-04-25|1998-04-05|NONE|TRUCK|slyly regular packages haggle along +42855|1807|94|1|42|71769.60|0.00|0.06|N|O|1995-10-28|1995-08-30|1995-11-24|COLLECT COD|SHIP|ar foxes slee +42855|270|25|2|48|56172.96|0.01|0.07|N|O|1995-10-26|1995-09-22|1995-10-28|TAKE BACK RETURN|MAIL|otornis wake +42855|1863|7|3|18|31767.48|0.04|0.01|N|O|1995-07-19|1995-09-12|1995-07-20|DELIVER IN PERSON|TRUCK|ve the blithely q +42855|1094|100|4|12|11941.08|0.10|0.02|N|O|1995-10-01|1995-08-12|1995-10-23|COLLECT COD|SHIP|n ideas. u +42880|1290|91|1|25|29782.25|0.10|0.03|N|O|1997-06-21|1997-06-14|1997-07-21|TAKE BACK RETURN|TRUCK|nts use furiously special +42880|1279|17|2|21|24785.67|0.08|0.03|N|O|1997-07-13|1997-05-14|1997-07-21|DELIVER IN PERSON|AIR| play fluffily across the quickly u +42880|410|11|3|9|11793.69|0.10|0.02|N|O|1997-05-18|1997-06-11|1997-06-03|TAKE BACK RETURN|RAIL| dependencies after th +42880|1777|78|4|15|25181.55|0.01|0.05|N|O|1997-06-04|1997-05-29|1997-06-17|TAKE BACK RETURN|REG AIR|ven, regular platele +42880|152|31|5|31|32616.65|0.10|0.02|N|O|1997-06-15|1997-05-26|1997-06-25|DELIVER IN PERSON|MAIL|ons doubt slyly even waters. slyly sp +42881|774|71|1|17|28471.09|0.09|0.04|R|F|1992-12-18|1992-12-15|1993-01-01|NONE|AIR|ar, ironic theo +42881|772|73|2|31|51855.87|0.06|0.00|R|F|1993-02-11|1992-12-22|1993-03-13|DELIVER IN PERSON|FOB|pecial theodolit +42882|1245|57|1|9|10316.16|0.03|0.04|A|F|1993-11-22|1994-01-11|1993-12-16|DELIVER IN PERSON|AIR|eep quickly fluffily b +42882|993|62|2|22|41667.78|0.05|0.06|A|F|1993-12-30|1994-01-22|1994-01-26|DELIVER IN PERSON|AIR|s, special instructions. requests cajol +42882|1759|2|3|35|58126.25|0.00|0.07|R|F|1993-11-24|1994-01-21|1993-12-11|TAKE BACK RETURN|RAIL|refully regular foxes haggle according +42882|859|60|4|46|80953.10|0.00|0.08|A|F|1993-11-04|1993-12-09|1993-11-12|NONE|RAIL|posits. slyly silent reques +42882|897|31|5|40|71915.60|0.06|0.02|R|F|1994-01-12|1993-12-18|1994-02-02|NONE|MAIL|quests above +42883|463|51|1|21|28632.66|0.03|0.00|N|F|1995-05-23|1995-03-22|1995-06-21|TAKE BACK RETURN|MAIL|nding requests are slyly alongsi +42884|1801|88|1|30|51084.00|0.09|0.02|A|F|1993-05-20|1993-05-16|1993-06-10|NONE|TRUCK|lly regular excuses sleep b +42884|476|77|2|30|41294.10|0.00|0.07|R|F|1993-05-28|1993-04-16|1993-06-23|COLLECT COD|RAIL|c asymptotes are blithely quickly +42885|1629|30|1|12|18367.44|0.03|0.01|N|O|1996-12-16|1997-01-27|1997-01-07|TAKE BACK RETURN|MAIL|ts. pending in +42885|899|100|2|18|32398.02|0.04|0.08|N|O|1996-12-08|1997-01-14|1996-12-21|DELIVER IN PERSON|REG AIR|quickly. ideas cajole pinto beans. blithe +42885|284|39|3|9|10658.52|0.09|0.01|N|O|1997-01-19|1997-01-20|1997-02-13|NONE|REG AIR|c packages +42885|627|90|4|4|6110.48|0.04|0.02|N|O|1997-01-20|1996-12-19|1997-02-07|COLLECT COD|REG AIR|pendencies breach qu +42886|1628|70|1|21|32122.02|0.07|0.02|R|F|1992-04-07|1992-02-13|1992-04-14|TAKE BACK RETURN|SHIP|uriously from the regul +42886|125|26|2|12|12301.44|0.05|0.07|R|F|1992-04-17|1992-02-16|1992-05-10|COLLECT COD|TRUCK|yly ironic theodolites against the p +42886|1783|84|3|17|28641.26|0.00|0.05|R|F|1992-04-29|1992-02-28|1992-05-26|DELIVER IN PERSON|MAIL|braids across the slyly e +42887|742|43|1|45|73923.30|0.06|0.07|R|F|1992-06-24|1992-08-11|1992-07-03|COLLECT COD|REG AIR|s along the carefu +42887|83|9|2|11|10813.88|0.02|0.08|A|F|1992-09-04|1992-07-19|1992-09-09|TAKE BACK RETURN|AIR|ully pending +42887|1238|13|3|39|44429.97|0.05|0.05|A|F|1992-09-22|1992-08-29|1992-10-19|COLLECT COD|FOB|, final accounts engage fluffily unusual co +42887|43|44|4|23|21689.92|0.09|0.06|R|F|1992-07-21|1992-08-19|1992-07-29|NONE|REG AIR|ly across the thinly final +42887|1542|63|5|40|57741.60|0.07|0.05|A|F|1992-07-10|1992-08-13|1992-07-28|NONE|SHIP|pon the blithely express deposit +42912|1348|25|1|25|31233.50|0.07|0.07|R|F|1993-05-11|1993-07-09|1993-05-17|DELIVER IN PERSON|RAIL|s. blithely speci +42912|240|22|2|36|41048.64|0.07|0.04|A|F|1993-07-02|1993-08-03|1993-07-06|COLLECT COD|FOB|inst the carefully ironic instru +42912|811|78|3|9|15406.29|0.05|0.04|R|F|1993-06-15|1993-07-24|1993-07-09|NONE|TRUCK|alongside of the quic +42912|749|14|4|35|57740.90|0.01|0.00|R|F|1993-06-15|1993-07-06|1993-07-04|TAKE BACK RETURN|FOB| quickly final account +42913|1011|82|1|41|37392.41|0.09|0.00|N|O|1996-06-13|1996-07-04|1996-06-25|NONE|REG AIR|ans. carefully regular ideas cajole slyly a +42913|1581|62|2|10|14825.80|0.10|0.02|N|O|1996-06-13|1996-06-24|1996-07-09|NONE|SHIP|xpress accounts. quickly s +42913|1849|36|3|33|57777.72|0.07|0.05|N|O|1996-07-03|1996-06-22|1996-07-22|DELIVER IN PERSON|REG AIR| carefully accounts +42914|306|7|1|48|57902.40|0.01|0.07|N|O|1998-04-16|1998-05-17|1998-05-02|DELIVER IN PERSON|RAIL|s haggle pending packages. regular foxes +42914|1105|14|2|45|45274.50|0.07|0.07|N|O|1998-06-12|1998-06-18|1998-07-09|TAKE BACK RETURN|FOB|al requests cajole. regular pack +42914|1644|68|3|2|3091.28|0.10|0.00|N|O|1998-04-15|1998-06-09|1998-05-12|NONE|REG AIR|efully acro +42914|569|70|4|49|72008.44|0.06|0.06|N|O|1998-06-23|1998-05-16|1998-07-04|COLLECT COD|TRUCK|al accounts. slyly bold platelets cajole f +42914|836|70|5|20|34736.60|0.01|0.04|N|O|1998-06-08|1998-06-02|1998-06-10|DELIVER IN PERSON|RAIL|the fluffily silent deposits. f +42914|1930|19|6|15|27478.95|0.02|0.04|N|O|1998-04-29|1998-05-18|1998-05-18|COLLECT COD|TRUCK|ls. regular asymptotes +42914|279|80|7|11|12971.97|0.05|0.08|N|O|1998-07-10|1998-06-11|1998-08-01|DELIVER IN PERSON|SHIP|o beans haggl +42915|350|79|1|16|20005.60|0.10|0.02|N|O|1998-06-12|1998-05-07|1998-06-28|DELIVER IN PERSON|FOB| slyly quickly regular packages. careful +42915|1570|11|2|35|51504.95|0.08|0.07|N|O|1998-05-02|1998-05-22|1998-05-11|TAKE BACK RETURN|MAIL|unusual instructions +42915|1645|87|3|36|55679.04|0.00|0.07|N|O|1998-05-23|1998-06-04|1998-05-31|COLLECT COD|AIR|r asymptotes. stea +42915|791|88|4|15|25376.85|0.08|0.07|N|O|1998-07-01|1998-04-18|1998-07-14|COLLECT COD|SHIP|g slyly pending, final ideas. furiousl +42915|1831|75|5|27|46786.41|0.00|0.01|N|O|1998-06-27|1998-05-14|1998-07-17|TAKE BACK RETURN|FOB|riously car +42915|944|45|6|13|23984.22|0.00|0.07|N|O|1998-04-06|1998-05-09|1998-04-30|TAKE BACK RETURN|AIR| above the slyly +42915|1133|70|7|31|32058.03|0.04|0.08|N|O|1998-05-26|1998-05-04|1998-06-07|DELIVER IN PERSON|SHIP|auternes. slyly regul +42916|1105|14|1|36|36219.60|0.09|0.05|N|O|1997-03-18|1997-03-31|1997-04-15|NONE|FOB|ts eat. pending packages wake carefu +42917|614|46|1|11|16660.71|0.10|0.06|N|O|1996-06-23|1996-04-12|1996-07-23|NONE|FOB|ges wake. regular, express deposits +42917|630|93|2|32|48980.16|0.06|0.06|N|O|1996-04-21|1996-04-22|1996-05-03|COLLECT COD|MAIL|wake pending +42918|1068|69|1|13|12597.78|0.00|0.07|A|F|1995-06-08|1995-07-22|1995-06-09|TAKE BACK RETURN|RAIL|instructions above the slyly regular packa +42918|611|43|2|50|75580.50|0.04|0.02|N|F|1995-06-08|1995-08-20|1995-06-26|COLLECT COD|AIR| even deposits b +42918|1070|71|3|21|20392.47|0.00|0.01|N|F|1995-06-01|1995-07-13|1995-06-28|COLLECT COD|MAIL|sleep regular foxes. quickly ironi +42918|1287|88|4|46|54660.88|0.07|0.03|N|F|1995-06-16|1995-07-14|1995-06-24|DELIVER IN PERSON|SHIP|fluffily re +42918|1998|87|5|44|83599.56|0.07|0.05|N|O|1995-08-15|1995-08-20|1995-08-31|TAKE BACK RETURN|MAIL| haggle blithely unusual theodolites. blith +42918|879|13|6|41|72974.67|0.08|0.07|A|F|1995-05-26|1995-08-09|1995-06-13|NONE|AIR| would believe final +42918|1675|17|7|18|28380.06|0.03|0.05|N|O|1995-08-18|1995-08-05|1995-08-22|DELIVER IN PERSON|FOB|wake! slyly express +42919|151|30|1|8|8409.20|0.07|0.06|N|O|1995-11-15|1995-11-16|1995-12-06|NONE|TRUCK| special requests imp +42919|1579|20|2|9|13325.13|0.09|0.08|N|O|1995-10-24|1995-12-18|1995-11-01|COLLECT COD|FOB|mong the eve +42919|1224|36|3|17|19128.74|0.08|0.03|N|O|1995-10-10|1995-12-02|1995-10-22|COLLECT COD|FOB|ly even instructions sleep ag +42919|983|18|4|18|33911.64|0.06|0.04|N|O|1995-11-30|1995-11-26|1995-12-19|COLLECT COD|AIR|ly pending +42919|351|36|5|48|60064.80|0.08|0.02|N|O|1995-12-15|1995-12-27|1996-01-02|NONE|FOB| to the carefully i +42919|1533|34|6|31|44470.43|0.01|0.08|N|O|1995-10-16|1995-12-12|1995-10-30|COLLECT COD|RAIL|riously regular requests. fluffily unusual +42944|780|77|1|12|20169.36|0.02|0.07|A|F|1993-01-11|1993-02-04|1993-02-06|COLLECT COD|FOB|e blithely special t +42944|283|84|2|29|34315.12|0.03|0.05|R|F|1993-03-02|1993-02-02|1993-03-24|COLLECT COD|RAIL|ments. furiously pendin +42944|169|48|3|18|19244.88|0.10|0.03|A|F|1993-02-08|1993-01-14|1993-02-28|DELIVER IN PERSON|MAIL|ess sheaves. special, f +42945|1674|57|1|38|59875.46|0.07|0.05|A|F|1993-02-02|1993-02-18|1993-03-01|DELIVER IN PERSON|SHIP|ld, express depo +42945|334|63|2|39|48138.87|0.05|0.05|A|F|1993-04-16|1993-02-19|1993-04-29|COLLECT COD|SHIP| pending, b +42945|479|9|3|16|22071.52|0.03|0.03|R|F|1993-01-29|1993-03-07|1993-01-31|NONE|AIR|aggle slyly final, busy dependencies. dep +42945|902|37|4|17|30649.30|0.01|0.00|R|F|1993-04-10|1993-03-30|1993-05-05|TAKE BACK RETURN|RAIL|ts; slyly unusual theodoli +42945|924|25|5|34|62047.28|0.05|0.08|A|F|1993-03-05|1993-03-01|1993-03-25|NONE|FOB|usly ironic pearls. pending, ir +42945|1854|98|6|25|43896.25|0.10|0.07|R|F|1993-03-09|1993-03-10|1993-03-30|COLLECT COD|REG AIR| slow pinto beans. slyly un +42946|810|10|1|28|47902.68|0.10|0.04|N|O|1997-12-05|1997-11-28|1997-12-17|COLLECT COD|RAIL| wake blithely above the caref +42946|1667|9|2|40|62746.40|0.01|0.06|N|O|1997-12-07|1997-10-14|1997-12-28|TAKE BACK RETURN|FOB|ffix fluffily. +42946|122|1|3|5|5110.60|0.02|0.03|N|O|1997-12-10|1997-10-15|1997-12-23|NONE|RAIL|t the slyly express instructions. quick +42946|1454|33|4|21|28464.45|0.03|0.07|N|O|1997-09-27|1997-11-16|1997-10-22|DELIVER IN PERSON|MAIL|totes cajole quick +42946|300|55|5|30|36009.00|0.09|0.03|N|O|1997-09-14|1997-11-01|1997-09-20|DELIVER IN PERSON|FOB|ecial accounts +42946|1928|29|6|46|84176.32|0.04|0.04|N|O|1997-11-13|1997-10-29|1997-11-17|NONE|TRUCK|ackages after the carefully ironic packag +42946|1832|19|7|9|15604.47|0.09|0.08|N|O|1997-12-24|1997-11-09|1998-01-05|TAKE BACK RETURN|MAIL|carefully fu +42947|620|21|1|33|50180.46|0.00|0.00|R|F|1993-10-28|1993-11-17|1993-11-27|TAKE BACK RETURN|AIR| requests nag +42947|1424|25|2|43|56993.06|0.02|0.08|R|F|1993-11-01|1993-10-02|1993-11-06|TAKE BACK RETURN|RAIL|ar deposits cajole furiously carefully +42948|1838|39|1|44|76552.52|0.07|0.01|N|O|1997-01-29|1997-02-10|1997-02-06|NONE|SHIP|ular, regular +42948|447|77|2|42|56592.48|0.03|0.00|N|O|1997-03-13|1997-02-03|1997-03-19|TAKE BACK RETURN|TRUCK|use permanently slyly unus +42948|1494|95|3|35|48842.15|0.02|0.07|N|O|1997-03-03|1996-12-15|1997-03-15|TAKE BACK RETURN|RAIL|t carefully ironic instructions. final, +42949|18|44|1|16|14688.16|0.03|0.05|R|F|1994-05-25|1994-08-12|1994-06-16|NONE|RAIL|y along the slyl +42949|1433|73|2|47|62718.21|0.03|0.04|A|F|1994-09-07|1994-07-10|1994-09-29|NONE|FOB| ideas wake furiousl +42949|608|40|3|48|72412.80|0.07|0.00|A|F|1994-09-07|1994-08-20|1994-10-02|COLLECT COD|SHIP|ular instructions. unusual, ironic reques +42949|1661|3|4|26|40629.16|0.08|0.02|A|F|1994-06-07|1994-07-29|1994-06-24|NONE|MAIL|asymptotes alongside of the theodo +42950|1101|10|1|40|40084.00|0.07|0.08|A|F|1993-10-26|1993-09-22|1993-11-10|COLLECT COD|RAIL|ace of the unusual platel +42950|244|26|2|41|46913.84|0.03|0.07|R|F|1993-12-13|1993-10-25|1993-12-21|TAKE BACK RETURN|FOB|ggle slyly final accounts. fur +42950|1144|81|3|50|52257.00|0.00|0.08|A|F|1993-10-09|1993-11-20|1993-10-29|NONE|FOB| sleep furiou +42950|477|65|4|13|17907.11|0.05|0.04|R|F|1993-09-20|1993-10-01|1993-09-26|NONE|RAIL| ironic pl +42950|298|99|5|48|57517.92|0.04|0.07|A|F|1993-12-17|1993-10-26|1993-12-21|DELIVER IN PERSON|SHIP|s? furiously regular realms ca +42951|1563|84|1|38|55653.28|0.02|0.01|R|F|1992-10-29|1992-11-03|1992-11-27|TAKE BACK RETURN|RAIL|odolites. furiously +42951|1094|30|2|26|25872.34|0.09|0.05|A|F|1992-12-25|1992-12-13|1993-01-20|NONE|AIR|ges integrate quickly blit +42951|871|71|3|12|21262.44|0.00|0.02|R|F|1992-09-28|1992-12-02|1992-10-17|NONE|REG AIR|of the final deposits. regula +42951|637|100|4|8|12301.04|0.09|0.00|A|F|1993-01-04|1992-11-23|1993-01-08|DELIVER IN PERSON|TRUCK| ideas wake sly +42951|1116|25|5|17|17290.87|0.10|0.03|R|F|1992-09-20|1992-11-30|1992-10-08|DELIVER IN PERSON|RAIL|ely according to the car +42951|6|32|6|48|43488.00|0.05|0.07|R|F|1992-11-10|1992-11-21|1992-11-23|COLLECT COD|TRUCK|al deposits wake evenly. bli +42951|1639|63|7|39|60084.57|0.06|0.02|A|F|1993-01-15|1992-11-29|1993-02-10|NONE|RAIL|he ironically unusual frets. blithely bold +42976|418|48|1|38|50099.58|0.03|0.04|N|O|1998-08-19|1998-09-06|1998-09-09|TAKE BACK RETURN|SHIP|ess accounts. slyly ironic d +42976|75|1|2|44|42903.08|0.03|0.06|N|O|1998-08-31|1998-10-22|1998-09-15|NONE|RAIL|sleep quickly above the slyly special +42976|1537|18|3|42|60418.26|0.03|0.02|N|O|1998-11-10|1998-10-05|1998-12-02|DELIVER IN PERSON|AIR|. carefully even dependencie +42976|1894|95|4|8|14367.12|0.05|0.06|N|O|1998-08-24|1998-09-07|1998-08-28|DELIVER IN PERSON|MAIL|. furiously ironic escapades wake alon +42976|1428|68|5|14|18611.88|0.07|0.08|N|O|1998-11-09|1998-10-15|1998-12-06|DELIVER IN PERSON|REG AIR|ages. caref +42977|1493|94|1|1|1394.49|0.04|0.06|N|O|1997-12-07|1997-11-05|1997-12-15|COLLECT COD|REG AIR|nag furiously final +42978|963|98|1|30|55918.80|0.05|0.08|N|O|1998-01-03|1997-11-25|1998-01-21|NONE|REG AIR|eep carefully above the always f +42978|716|17|2|43|69518.53|0.10|0.00|N|O|1998-01-23|1997-12-29|1998-01-27|TAKE BACK RETURN|SHIP|telets sleep blithely whith +42978|595|96|3|39|58328.01|0.03|0.06|N|O|1997-12-31|1997-11-15|1998-01-06|TAKE BACK RETURN|REG AIR|s. idly bold deposits ca +42978|1727|12|4|25|40718.00|0.04|0.08|N|O|1997-11-23|1997-12-25|1997-11-29|COLLECT COD|MAIL|final, bold deposits boost quickl +42978|1082|88|5|40|39323.20|0.08|0.04|N|O|1997-10-05|1997-12-03|1997-10-15|NONE|FOB|hely along the quickly even instructio +42978|1380|95|6|34|43566.92|0.10|0.06|N|O|1997-10-04|1997-11-21|1997-10-15|DELIVER IN PERSON|MAIL|press packages. final deposits +42979|1030|1|1|40|37241.20|0.04|0.00|A|F|1995-05-26|1995-07-13|1995-06-12|DELIVER IN PERSON|REG AIR|ly special theodolites affix ironic, brave +42979|111|90|2|14|14155.54|0.09|0.06|A|F|1995-05-28|1995-07-17|1995-06-03|NONE|AIR|p blithely +42979|993|94|3|23|43561.77|0.00|0.07|N|O|1995-08-25|1995-06-20|1995-09-12|TAKE BACK RETURN|AIR|ake slyly above the finally unusual somas. +42979|1715|100|4|29|46884.59|0.06|0.07|A|F|1995-06-04|1995-07-08|1995-06-06|TAKE BACK RETURN|RAIL|. carefully unus +42979|796|93|5|38|64478.02|0.09|0.00|N|O|1995-07-09|1995-07-12|1995-08-04|DELIVER IN PERSON|AIR|after the unusual, bold p +42980|1211|86|1|30|33366.30|0.03|0.05|N|O|1998-07-22|1998-09-18|1998-08-14|NONE|TRUCK|ly even packages. ironic epitaphs arou +42980|1015|86|2|30|27480.30|0.02|0.00|N|O|1998-10-23|1998-09-08|1998-11-16|COLLECT COD|SHIP|ent courts. theodolites doubt. ideas thra +42980|805|6|3|35|59703.00|0.05|0.00|N|O|1998-07-31|1998-09-05|1998-08-24|COLLECT COD|MAIL|s wake slyly. carefully +42980|657|89|4|27|42056.55|0.05|0.00|N|O|1998-08-02|1998-09-23|1998-08-05|TAKE BACK RETURN|FOB|s according +42981|586|87|1|30|44597.40|0.01|0.02|A|F|1994-06-02|1994-07-18|1994-06-03|TAKE BACK RETURN|REG AIR|egular ideas are sometimes +42981|718|51|2|17|27518.07|0.04|0.01|A|F|1994-07-02|1994-07-28|1994-07-21|TAKE BACK RETURN|RAIL|he bold requests. unusual deposits cajole s +42981|1809|53|3|35|59878.00|0.02|0.07|A|F|1994-09-11|1994-08-29|1994-09-20|NONE|AIR|ully unusual accounts doubt. e +42982|1565|66|1|16|23464.96|0.10|0.01|R|F|1992-08-13|1992-10-10|1992-09-11|DELIVER IN PERSON|RAIL| realms. slyly furious accounts +42982|370|99|2|27|34299.99|0.02|0.01|A|F|1992-09-25|1992-09-24|1992-09-26|COLLECT COD|TRUCK|counts haggle along the bold acc +42982|1280|92|3|18|21263.04|0.03|0.08|A|F|1992-09-27|1992-09-25|1992-10-17|DELIVER IN PERSON|TRUCK|foxes. pending theodolites slee +42982|446|76|4|48|64629.12|0.00|0.04|R|F|1992-08-23|1992-09-27|1992-09-17|NONE|REG AIR|. fluffily express co +42982|1697|80|5|11|17585.59|0.08|0.00|A|F|1992-11-05|1992-10-21|1992-11-24|COLLECT COD|SHIP|c excuses-- blithely fi +42982|1494|95|6|47|65588.03|0.00|0.04|R|F|1992-11-13|1992-09-01|1992-11-24|DELIVER IN PERSON|RAIL|ptotes haggle. instructions +42983|1129|30|1|3|3090.36|0.04|0.02|N|O|1997-07-21|1997-09-18|1997-08-08|DELIVER IN PERSON|TRUCK|the slyly special pl +42983|250|32|2|21|24155.25|0.01|0.03|N|O|1997-10-01|1997-09-19|1997-10-27|DELIVER IN PERSON|SHIP|carefully regular r +42983|751|16|3|7|11562.25|0.08|0.01|N|O|1997-10-06|1997-08-05|1997-10-23|COLLECT COD|FOB|ns haggle blithely according to t +43008|1085|91|1|23|22679.84|0.03|0.06|N|O|1997-02-01|1996-12-03|1997-02-08|DELIVER IN PERSON|TRUCK|egrate. dep +43008|721|18|2|37|60003.64|0.06|0.03|N|O|1997-01-03|1996-11-25|1997-01-06|NONE|TRUCK|r the express, regul +43008|207|89|3|11|12179.20|0.09|0.01|N|O|1996-11-16|1996-12-24|1996-11-23|COLLECT COD|TRUCK|foxes. carefully q +43008|315|100|4|16|19444.96|0.03|0.06|N|O|1996-11-18|1997-01-12|1996-12-15|TAKE BACK RETURN|MAIL|posits nag furiou +43008|1552|33|5|13|18896.15|0.05|0.05|N|O|1996-12-30|1997-01-13|1997-01-18|TAKE BACK RETURN|SHIP|pendencies use silently ruthless ideas +43008|1075|76|6|23|22449.61|0.07|0.06|N|O|1996-10-27|1997-01-01|1996-11-05|COLLECT COD|TRUCK|egular, bold courts. +43009|1019|90|1|2|1840.02|0.07|0.00|A|F|1994-07-31|1994-07-11|1994-08-09|COLLECT COD|FOB|ts nag daringly according to the furious +43009|406|36|2|1|1306.40|0.06|0.00|R|F|1994-09-12|1994-07-03|1994-09-16|NONE|MAIL|e furiously blithely fin +43010|857|91|1|41|72071.85|0.09|0.00|R|F|1993-02-08|1992-11-19|1993-02-22|DELIVER IN PERSON|TRUCK|against the slyly express accounts +43010|1866|10|2|5|8839.30|0.09|0.08|R|F|1992-10-28|1992-12-27|1992-11-15|DELIVER IN PERSON|RAIL|ide of the fl +43010|823|57|3|25|43095.50|0.00|0.04|R|F|1992-12-04|1992-12-09|1992-12-22|TAKE BACK RETURN|AIR|egular dolphins. furiously un +43011|1546|27|1|36|52111.44|0.07|0.01|N|O|1996-06-29|1996-07-12|1996-07-18|NONE|REG AIR|eposits against the regular, s +43011|671|65|2|13|20431.71|0.02|0.02|N|O|1996-06-13|1996-06-14|1996-06-22|NONE|MAIL|ages integrate. ironic d +43011|11|87|3|14|12754.14|0.10|0.07|N|O|1996-06-12|1996-06-09|1996-07-11|TAKE BACK RETURN|RAIL|ng, even packages about the p +43011|644|7|4|29|44794.56|0.00|0.02|N|O|1996-05-27|1996-06-29|1996-06-08|COLLECT COD|REG AIR|ependencie +43011|1736|21|5|35|57320.55|0.02|0.05|N|O|1996-06-25|1996-07-04|1996-07-04|COLLECT COD|TRUCK|eep bold deposits. sl +43011|562|23|6|13|19013.28|0.03|0.04|N|O|1996-05-25|1996-07-10|1996-06-07|TAKE BACK RETURN|FOB|e after the furiously regular deposits. f +43011|1371|10|7|31|39443.47|0.09|0.04|N|O|1996-06-26|1996-07-04|1996-06-27|DELIVER IN PERSON|FOB|sits. blithely pending dolphins do +43012|1835|79|1|21|36473.43|0.03|0.00|R|F|1992-10-26|1992-10-18|1992-11-20|DELIVER IN PERSON|SHIP|onic ideas integrate above the d +43013|53|79|1|10|9530.50|0.08|0.08|R|F|1995-05-19|1995-06-21|1995-05-28|NONE|FOB| carefully special warhors +43013|1203|4|2|21|23188.20|0.08|0.02|N|O|1995-07-13|1995-07-12|1995-07-21|TAKE BACK RETURN|TRUCK|y silent instructions besides the +43013|682|14|3|17|26905.56|0.00|0.01|N|O|1995-08-21|1995-06-06|1995-09-19|NONE|SHIP|e quickly. sly +43013|1528|9|4|45|64328.40|0.06|0.01|N|O|1995-06-19|1995-05-27|1995-07-09|NONE|TRUCK|luffily ironic re +43013|1037|38|5|3|2814.09|0.01|0.08|N|O|1995-08-16|1995-05-27|1995-09-01|COLLECT COD|RAIL|lites print carefully among the ironic +43013|1665|66|6|50|78333.00|0.05|0.02|N|O|1995-08-13|1995-05-29|1995-08-26|COLLECT COD|SHIP|he carefully special pac +43013|666|29|7|8|12533.28|0.09|0.04|N|O|1995-08-03|1995-06-28|1995-08-24|DELIVER IN PERSON|TRUCK| special dep +43014|22|48|1|24|22128.48|0.04|0.05|R|F|1994-11-30|1995-02-04|1994-12-18|DELIVER IN PERSON|SHIP| across the blit +43014|1688|30|2|43|68356.24|0.00|0.00|A|F|1994-12-14|1995-01-22|1994-12-29|COLLECT COD|REG AIR| the slyly ruthless courts. silent, final +43014|1912|57|3|19|34464.29|0.00|0.03|R|F|1994-11-22|1994-12-31|1994-12-04|TAKE BACK RETURN|MAIL|ously even f +43014|1465|5|4|36|49192.56|0.06|0.04|R|F|1994-12-07|1994-12-20|1994-12-20|TAKE BACK RETURN|SHIP|ions. blithely final theo +43014|825|59|5|48|82839.36|0.01|0.04|R|F|1994-11-21|1995-01-08|1994-11-24|TAKE BACK RETURN|TRUCK| ironic instructions boo +43014|705|38|6|35|56199.50|0.04|0.04|A|F|1995-01-19|1995-01-20|1995-01-24|NONE|REG AIR|packages sl +43015|19|20|1|15|13785.15|0.05|0.08|N|O|1996-03-29|1996-05-11|1996-04-11|NONE|MAIL| quickly even foxes use fl +43015|1578|59|2|12|17754.84|0.10|0.02|N|O|1996-06-12|1996-04-15|1996-07-10|TAKE BACK RETURN|MAIL|nal, express packa +43015|1338|77|3|17|21068.61|0.00|0.00|N|O|1996-06-16|1996-05-02|1996-07-09|DELIVER IN PERSON|RAIL|ss the blithely bold re +43015|201|83|4|25|27530.00|0.10|0.06|N|O|1996-05-13|1996-05-03|1996-05-14|DELIVER IN PERSON|RAIL|e blithely slyly even accounts: regula +43015|122|75|5|43|43951.16|0.04|0.05|N|O|1996-06-02|1996-04-21|1996-06-28|NONE|MAIL|lly. furiously final accounts affix +43015|1521|22|6|2|2845.04|0.04|0.07|N|O|1996-06-22|1996-04-14|1996-07-18|COLLECT COD|FOB|ngly unusual ins +43040|890|24|1|32|57308.48|0.10|0.01|N|O|1996-09-13|1996-10-16|1996-09-14|DELIVER IN PERSON|AIR|y fluffily even platelets. fluff +43040|309|94|2|23|27813.90|0.10|0.05|N|O|1996-10-13|1996-09-16|1996-11-11|COLLECT COD|RAIL|sts are along the regular pinto beans. +43041|1623|6|1|11|16770.82|0.03|0.00|N|O|1997-03-28|1997-02-24|1997-04-24|TAKE BACK RETURN|RAIL| to the carefully stealthy pac +43041|857|57|2|2|3515.70|0.10|0.03|N|O|1997-04-08|1997-02-18|1997-04-22|DELIVER IN PERSON|RAIL|usly after the pinto b +43041|304|5|3|17|20473.10|0.03|0.05|N|O|1997-01-04|1997-03-14|1997-01-14|DELIVER IN PERSON|FOB|le closely b +43041|565|66|4|48|70346.88|0.01|0.08|N|O|1997-01-24|1997-03-10|1997-02-22|TAKE BACK RETURN|AIR| sheaves promise courts. ironic decoys +43041|1499|78|5|29|40614.21|0.07|0.08|N|O|1997-01-08|1997-03-14|1997-01-30|DELIVER IN PERSON|FOB| furiously ironic reque +43042|1165|74|1|4|4264.64|0.10|0.07|N|O|1997-11-27|1997-10-31|1997-12-21|NONE|AIR|instructions ar +43042|970|73|2|23|43032.31|0.00|0.00|N|O|1997-12-01|1997-09-23|1997-12-30|NONE|AIR|s doubt after the fluffily quiet request +43042|485|44|3|37|51262.76|0.02|0.00|N|O|1997-10-30|1997-11-04|1997-11-28|NONE|SHIP|ke ironic excus +43042|1655|38|4|41|63822.65|0.09|0.02|N|O|1997-11-13|1997-11-07|1997-12-13|DELIVER IN PERSON|TRUCK|ost slyly doggedly e +43042|595|96|5|14|20938.26|0.09|0.02|N|O|1997-11-25|1997-11-05|1997-12-18|DELIVER IN PERSON|REG AIR|ly even accounts +43043|378|79|1|8|10226.96|0.07|0.01|R|F|1992-05-01|1992-07-13|1992-05-25|NONE|MAIL|s haggle carefully final pinto beans +43043|896|30|2|23|41328.47|0.08|0.08|A|F|1992-07-28|1992-06-09|1992-08-17|COLLECT COD|TRUCK| ideas. even excuses detect f +43043|1052|88|3|32|30497.60|0.01|0.02|R|F|1992-08-05|1992-05-15|1992-08-29|DELIVER IN PERSON|AIR|ans haggle always a +43043|1550|91|4|6|8709.30|0.00|0.05|A|F|1992-05-05|1992-05-24|1992-05-25|NONE|REG AIR|ending requests play fluffily care +43043|60|86|5|20|19201.20|0.08|0.00|R|F|1992-07-22|1992-06-05|1992-08-07|COLLECT COD|RAIL|ptotes boost. theodolites wake bl +43043|1955|88|6|29|53851.55|0.06|0.08|A|F|1992-04-30|1992-06-02|1992-05-01|DELIVER IN PERSON|TRUCK|ers haggle furiously courts. orbits +43043|249|4|7|47|54014.28|0.05|0.05|R|F|1992-05-13|1992-06-24|1992-06-02|DELIVER IN PERSON|FOB|instructions. pending acc +43044|62|63|1|37|35596.22|0.01|0.01|R|F|1994-10-21|1994-12-08|1994-11-18|TAKE BACK RETURN|REG AIR|s nag again +43044|1678|20|2|44|69505.48|0.00|0.06|R|F|1994-12-23|1994-12-08|1995-01-17|COLLECT COD|RAIL|express, regular requ +43044|502|63|3|32|44880.00|0.01|0.04|R|F|1995-01-06|1994-12-04|1995-01-25|COLLECT COD|MAIL|yly ironic accounts affix sly +43044|1055|56|4|47|44934.35|0.03|0.00|R|F|1995-01-14|1995-01-15|1995-01-16|COLLECT COD|AIR|final dolphins; even deposits haggle a +43044|1099|70|5|34|34003.06|0.07|0.01|R|F|1994-11-16|1994-12-17|1994-12-14|NONE|TRUCK| furiously. blithely express theodolites c +43044|1664|47|6|4|6262.64|0.02|0.03|A|F|1995-01-04|1994-12-23|1995-02-03|NONE|MAIL|riously regular sentiments along the un +43044|1411|12|7|35|45934.35|0.06|0.03|A|F|1994-11-15|1994-12-13|1994-11-29|TAKE BACK RETURN|AIR|the carefully express dolphi +43045|1554|75|1|18|26199.90|0.00|0.01|R|F|1992-08-02|1992-07-28|1992-08-23|COLLECT COD|MAIL|ckly regular pinto beans breach furio +43045|1258|96|2|48|55644.00|0.10|0.05|A|F|1992-08-25|1992-08-10|1992-08-28|TAKE BACK RETURN|MAIL|against the sly deposits nag furiously +43046|177|56|1|14|15080.38|0.05|0.07|N|O|1996-09-18|1996-10-02|1996-09-26|NONE|FOB|g the carefull +43046|714|47|2|45|72661.95|0.04|0.01|N|O|1996-12-01|1996-11-01|1996-12-25|COLLECT COD|AIR|slyly even requests. special, ev +43046|744|45|3|7|11513.18|0.04|0.00|N|O|1996-10-27|1996-10-13|1996-11-16|NONE|FOB|ding theodolites boost quickly. slyly +43046|353|54|4|29|36347.15|0.06|0.06|N|O|1996-10-12|1996-10-10|1996-10-31|NONE|AIR|the silent instructions +43046|1104|5|5|10|10051.00|0.09|0.02|N|O|1996-10-15|1996-11-10|1996-10-25|NONE|FOB|blithely special theodolites. carefully sp +43046|1149|50|6|16|16802.24|0.10|0.02|N|O|1996-08-30|1996-11-08|1996-09-25|TAKE BACK RETURN|TRUCK|efully ironic ac +43046|269|51|7|24|28062.24|0.04|0.02|N|O|1996-09-05|1996-10-16|1996-09-10|DELIVER IN PERSON|FOB| deposits haggle along t +43047|527|88|1|39|55673.28|0.04|0.01|N|O|1997-05-11|1997-04-18|1997-05-14|COLLECT COD|SHIP|ubt around the furiously ironic +43047|28|29|2|3|2784.06|0.07|0.02|N|O|1997-04-17|1997-04-28|1997-05-04|NONE|SHIP|es. quickly ironi +43047|67|93|3|26|25143.56|0.05|0.04|N|O|1997-04-04|1997-05-22|1997-04-30|DELIVER IN PERSON|MAIL|egular asymp +43047|730|31|4|9|14676.57|0.10|0.07|N|O|1997-05-24|1997-03-29|1997-05-27|TAKE BACK RETURN|MAIL| furiously regular excuse +43072|1776|3|1|47|78855.19|0.01|0.08|N|O|1998-08-28|1998-06-10|1998-09-05|NONE|FOB|c instructions. regular ac +43072|1987|20|2|49|92560.02|0.10|0.06|N|O|1998-08-16|1998-07-29|1998-08-30|TAKE BACK RETURN|SHIP|en platelets are ideas +43073|1687|70|1|16|25418.88|0.03|0.05|N|O|1996-10-19|1996-10-22|1996-10-31|NONE|AIR|ular reque +43073|662|56|2|7|10938.62|0.01|0.04|N|O|1996-11-02|1996-10-23|1996-11-27|NONE|RAIL|unts nag carefully slyly express pinto +43073|1236|74|3|19|21607.37|0.10|0.07|N|O|1996-09-15|1996-10-06|1996-10-04|COLLECT COD|FOB|bold requests? regular +43074|45|96|1|12|11340.48|0.01|0.03|R|F|1993-12-19|1993-10-30|1993-12-29|DELIVER IN PERSON|TRUCK|integrate boldly f +43074|1339|40|2|42|52093.86|0.01|0.04|R|F|1993-11-21|1993-12-20|1993-11-22|DELIVER IN PERSON|FOB|ounts. asymptotes integrate +43074|731|28|3|33|53847.09|0.09|0.05|A|F|1994-01-29|1993-12-16|1994-01-31|COLLECT COD|TRUCK|y final requests +43074|1420|38|4|29|38321.18|0.04|0.05|R|F|1994-01-05|1993-11-22|1994-02-01|TAKE BACK RETURN|AIR|quickly regular platelets. dogged accou +43074|864|65|5|35|61770.10|0.02|0.02|R|F|1993-12-24|1993-12-21|1994-01-03|COLLECT COD|SHIP|iously unusual deposits. slyl +43075|1027|98|1|21|19488.42|0.00|0.04|N|O|1997-09-30|1997-08-10|1997-10-10|DELIVER IN PERSON|MAIL|ns. unusual sauternes haggle blithely. pen +43075|1009|10|2|20|18200.00|0.10|0.08|N|O|1997-10-18|1997-08-10|1997-11-08|TAKE BACK RETURN|RAIL|ly pending deposits according to t +43076|1380|81|1|24|30753.12|0.10|0.08|R|F|1993-10-14|1993-09-07|1993-11-08|NONE|TRUCK| tithes. carefully bo +43076|546|7|2|8|11572.32|0.03|0.00|R|F|1993-08-28|1993-08-26|1993-09-23|COLLECT COD|SHIP| even sentiments use blithel +43076|1994|95|3|26|49295.74|0.09|0.03|A|F|1993-09-20|1993-09-11|1993-10-19|DELIVER IN PERSON|SHIP|ronic deposi +43076|195|96|4|46|50378.74|0.10|0.05|A|F|1993-08-13|1993-09-10|1993-09-03|DELIVER IN PERSON|MAIL|ual accounts! furiously unusual acc +43076|728|25|5|8|13029.76|0.00|0.05|R|F|1993-08-17|1993-09-15|1993-09-15|TAKE BACK RETURN|AIR|e blithely ir +43076|1713|40|6|43|69432.53|0.04|0.02|A|F|1993-08-05|1993-09-11|1993-08-14|TAKE BACK RETURN|TRUCK|express accounts ar +43077|1111|12|1|34|34411.74|0.04|0.02|N|O|1997-02-07|1997-03-03|1997-02-20|NONE|AIR|ing to the fluffily even packages. furious +43077|1615|16|2|44|66730.84|0.04|0.02|N|O|1997-02-16|1997-02-23|1997-02-19|COLLECT COD|TRUCK|unts! even pinto beans ar +43077|1904|49|3|16|28894.40|0.04|0.08|N|O|1997-01-17|1997-02-14|1997-01-27|NONE|MAIL|he ironic accounts sleep quic +43078|369|26|1|47|59659.92|0.03|0.07|N|O|1998-06-18|1998-06-27|1998-07-10|COLLECT COD|TRUCK|encies. slyly bold +43079|34|35|1|5|4670.15|0.04|0.02|A|F|1994-10-03|1994-10-11|1994-10-29|COLLECT COD|FOB| blithely: blithely even pl +43079|1837|38|2|19|33037.77|0.05|0.02|R|F|1994-09-15|1994-10-19|1994-10-12|TAKE BACK RETURN|RAIL|totes. carefully ironic asymptot +43104|1947|48|1|34|62863.96|0.09|0.01|R|F|1993-01-03|1992-12-06|1993-01-26|DELIVER IN PERSON|FOB|cial foxes eat around the quickly reg +43104|1643|85|2|20|30892.80|0.10|0.06|R|F|1992-12-31|1992-11-28|1993-01-27|NONE|FOB|luffily expr +43104|646|78|3|41|63412.24|0.01|0.07|R|F|1993-02-11|1992-12-08|1993-02-15|TAKE BACK RETURN|AIR|ge slyly. ironic, even instructi +43104|1028|34|4|15|13935.30|0.03|0.06|R|F|1993-01-10|1992-12-24|1993-02-03|TAKE BACK RETURN|AIR|ongside of the carefully express theodoli +43104|1454|55|5|25|33886.25|0.02|0.04|R|F|1992-11-24|1992-12-29|1992-11-25|NONE|RAIL|osits doze above the slyly ironi +43105|1522|23|1|23|32740.96|0.10|0.02|N|O|1998-02-02|1998-03-01|1998-02-17|DELIVER IN PERSON|SHIP|ct slyly slyly r +43105|1349|26|2|40|50013.60|0.01|0.03|N|O|1998-04-14|1998-02-18|1998-05-05|DELIVER IN PERSON|TRUCK| the carefu +43105|857|24|3|11|19336.35|0.04|0.06|N|O|1998-04-20|1998-03-03|1998-05-12|DELIVER IN PERSON|FOB|old dependencies wake slyl +43105|622|54|4|1|1522.62|0.06|0.02|N|O|1998-05-05|1998-03-01|1998-05-07|TAKE BACK RETURN|FOB|mptotes serve quick +43106|1432|33|1|40|53337.20|0.03|0.07|R|F|1995-04-14|1995-03-09|1995-05-01|NONE|TRUCK|telets cajole across the +43106|1770|71|2|37|61855.49|0.03|0.08|R|F|1995-03-26|1995-04-08|1995-04-02|DELIVER IN PERSON|TRUCK|n, express pl +43106|424|83|3|29|38408.18|0.01|0.04|A|F|1995-02-09|1995-03-17|1995-02-27|TAKE BACK RETURN|MAIL|y. regular, regular foxes accordin +43106|954|89|4|12|22259.40|0.04|0.04|R|F|1995-04-15|1995-03-10|1995-05-07|COLLECT COD|MAIL|s wake furious +43106|1347|24|5|38|47436.92|0.02|0.08|A|F|1995-05-19|1995-03-31|1995-05-28|NONE|MAIL|coys haggle fluffily r +43107|10|36|1|6|5460.06|0.03|0.08|N|O|1997-09-09|1997-07-14|1997-10-07|NONE|MAIL|ges integrate som +43107|291|19|2|13|15486.77|0.01|0.06|N|O|1997-06-27|1997-08-07|1997-07-27|NONE|REG AIR|along the ironic foxes. furious +43107|866|33|3|38|67140.68|0.01|0.02|N|O|1997-06-13|1997-06-27|1997-07-11|COLLECT COD|FOB| carefully regular deposits boo +43107|1398|37|4|21|27287.19|0.07|0.01|N|O|1997-09-07|1997-06-24|1997-09-08|DELIVER IN PERSON|TRUCK|pending foxes affix careful +43108|858|25|1|41|72112.85|0.01|0.05|N|O|1996-08-21|1996-10-19|1996-08-31|TAKE BACK RETURN|RAIL|. blithely ironic packages across +43108|730|27|2|24|39137.52|0.10|0.08|N|O|1996-11-03|1996-11-07|1996-11-29|COLLECT COD|MAIL|ipliers are slyly regular i +43109|1040|41|1|37|34818.48|0.07|0.06|A|F|1993-01-24|1993-03-07|1993-02-06|TAKE BACK RETURN|RAIL|st furious +43109|1012|48|2|8|7304.08|0.08|0.01|R|F|1993-03-25|1993-02-22|1993-04-15|DELIVER IN PERSON|MAIL|instructions wake carefully regular r +43109|918|21|3|42|76394.22|0.00|0.06|A|F|1993-01-05|1993-03-04|1993-01-31|TAKE BACK RETURN|REG AIR|at carefully regular, regular somas. +43109|1971|16|4|33|61808.01|0.08|0.00|A|F|1993-01-30|1993-03-17|1993-02-01|TAKE BACK RETURN|MAIL|uickly pending requests. fina +43109|1582|3|5|19|28188.02|0.05|0.05|R|F|1992-12-24|1993-02-10|1993-01-15|COLLECT COD|SHIP|ly unusual packages agains +43109|1633|57|6|14|21484.82|0.01|0.03|R|F|1993-04-20|1993-02-07|1993-05-17|TAKE BACK RETURN|AIR|y regular excuses sleep car +43110|1640|82|1|20|30832.80|0.08|0.05|A|F|1995-03-09|1995-04-29|1995-03-12|DELIVER IN PERSON|TRUCK| final dolphins. unusual courts a +43110|1389|4|2|21|27097.98|0.02|0.07|R|F|1995-03-14|1995-03-24|1995-03-30|COLLECT COD|TRUCK|nal requests. slyly iron +43110|412|100|3|36|47246.76|0.01|0.00|A|F|1995-03-13|1995-04-10|1995-03-31|COLLECT COD|RAIL|above the pending instructions. packa +43110|614|8|4|12|18175.32|0.00|0.02|A|F|1995-05-26|1995-03-28|1995-06-14|TAKE BACK RETURN|AIR|ly dogged requests. furiousl +43110|1468|8|5|11|15064.06|0.02|0.06|A|F|1995-04-18|1995-04-05|1995-04-19|TAKE BACK RETURN|SHIP|ld accounts: slyly pending package +43110|1901|90|6|31|55889.90|0.08|0.00|R|F|1995-05-15|1995-05-04|1995-06-01|TAKE BACK RETURN|SHIP|ways pending accou +43111|1874|18|1|14|24862.18|0.05|0.05|N|O|1995-09-26|1995-12-07|1995-10-08|NONE|RAIL|quickly around the fu +43111|412|13|2|18|23623.38|0.05|0.08|N|O|1995-10-12|1995-12-02|1995-10-31|NONE|REG AIR|ts. sometimes even theodoli +43111|215|70|3|49|54645.29|0.02|0.06|N|O|1995-11-25|1995-12-05|1995-12-02|DELIVER IN PERSON|SHIP|. carefully final theo +43111|229|30|4|37|41781.14|0.03|0.06|N|O|1995-11-21|1995-11-14|1995-11-30|NONE|REG AIR|uffily. silent instructions about +43111|14|15|5|32|29248.32|0.08|0.01|N|O|1995-09-25|1995-11-24|1995-10-01|TAKE BACK RETURN|RAIL|er the slyl +43111|695|96|6|3|4787.07|0.06|0.01|N|O|1995-12-13|1995-11-14|1996-01-12|COLLECT COD|AIR|special packages could have to x-ray bli +43111|725|22|7|1|1625.72|0.02|0.01|N|O|1995-09-30|1995-12-06|1995-10-10|TAKE BACK RETURN|FOB|beans use carefully a +43136|332|17|1|25|30808.25|0.02|0.05|A|F|1993-08-29|1993-11-11|1993-09-04|TAKE BACK RETURN|SHIP|lways regular requests wake a +43137|611|5|1|30|45348.30|0.04|0.01|A|F|1995-05-12|1995-04-21|1995-06-05|NONE|TRUCK|hely even requests cajole inst +43138|468|56|1|40|54738.40|0.05|0.02|A|F|1992-05-19|1992-06-11|1992-05-29|COLLECT COD|FOB|iously alongside of the closely regu +43138|1012|48|2|17|15521.17|0.04|0.00|R|F|1992-03-24|1992-05-24|1992-04-13|TAKE BACK RETURN|FOB|lar, pending accounts; carefully t +43139|992|61|1|35|66254.65|0.03|0.05|N|O|1997-03-16|1997-03-09|1997-04-02|DELIVER IN PERSON|TRUCK|ssly slyly unusual theodolites. +43139|1221|59|2|7|7855.54|0.06|0.05|N|O|1997-03-02|1997-03-04|1997-03-25|TAKE BACK RETURN|MAIL|ts. regular packages are. bo +43139|1301|16|3|10|12023.00|0.01|0.01|N|O|1997-03-09|1997-04-01|1997-03-12|NONE|AIR|o beans. acc +43140|655|18|1|47|73115.55|0.01|0.08|A|F|1994-04-17|1994-06-06|1994-05-17|TAKE BACK RETURN|RAIL|ites was. u +43140|1470|88|2|28|38401.16|0.00|0.07|R|F|1994-07-12|1994-05-25|1994-07-28|COLLECT COD|AIR|onic accounts along the reg +43140|780|13|3|27|45381.06|0.09|0.00|A|F|1994-05-30|1994-05-09|1994-06-26|TAKE BACK RETURN|MAIL| quickly special theodolites. ironic excuse +43140|245|27|4|17|19469.08|0.01|0.07|R|F|1994-04-24|1994-06-11|1994-05-11|TAKE BACK RETURN|RAIL|ong the fluffily regular acc +43141|1518|99|1|2|2839.02|0.02|0.05|R|F|1993-08-20|1993-10-02|1993-09-04|DELIVER IN PERSON|FOB|ts; final pinto beans doze +43141|920|89|2|45|81941.40|0.03|0.03|R|F|1993-10-29|1993-08-12|1993-11-08|DELIVER IN PERSON|MAIL|ic ideas. carefully bold deposits a +43141|932|1|3|41|75150.13|0.09|0.03|A|F|1993-10-08|1993-09-22|1993-11-01|DELIVER IN PERSON|RAIL| realms haggle slyly after the flu +43141|1440|80|4|19|25487.36|0.06|0.03|R|F|1993-07-28|1993-09-15|1993-07-31|NONE|REG AIR|xcuses poach at +43141|1889|33|5|8|14327.04|0.07|0.06|R|F|1993-10-30|1993-09-03|1993-11-19|NONE|SHIP|inder carefull +43142|1871|72|1|50|88643.50|0.05|0.06|N|O|1996-04-27|1996-03-15|1996-05-26|NONE|SHIP|slyly even foxes. neve +43142|1760|61|2|47|78102.72|0.03|0.03|N|O|1996-03-11|1996-04-05|1996-04-03|TAKE BACK RETURN|FOB|ages. blithely pending accounts use furio +43142|1654|96|3|46|71559.90|0.10|0.06|N|O|1996-04-16|1996-03-19|1996-04-23|COLLECT COD|REG AIR|ironic request +43142|277|32|4|28|32963.56|0.04|0.08|N|O|1996-03-11|1996-04-21|1996-03-14|COLLECT COD|SHIP|packages promise. accounts boost qu +43142|1822|66|5|42|72400.44|0.03|0.00|N|O|1996-05-15|1996-03-11|1996-05-29|DELIVER IN PERSON|MAIL| special deposits na +43142|462|63|6|33|44961.18|0.06|0.00|N|O|1996-04-24|1996-05-03|1996-05-04|DELIVER IN PERSON|AIR|ealthily ironic foxes between the q +43143|279|61|1|47|55425.69|0.02|0.02|N|O|1998-02-21|1998-03-18|1998-03-19|DELIVER IN PERSON|MAIL|sly final depos +43143|107|34|2|18|18127.80|0.10|0.01|N|O|1998-05-22|1998-03-25|1998-05-27|TAKE BACK RETURN|RAIL|kages wake blithely +43143|1420|21|3|7|9249.94|0.05|0.06|N|O|1998-02-25|1998-03-09|1998-02-28|TAKE BACK RETURN|TRUCK|st the special, unusual deposi +43143|1514|55|4|32|45296.32|0.10|0.05|N|O|1998-05-23|1998-04-13|1998-05-30|TAKE BACK RETURN|SHIP|cording to the even package +43143|1739|82|5|15|24610.95|0.07|0.06|N|O|1998-02-16|1998-03-29|1998-03-01|DELIVER IN PERSON|TRUCK| the slyly ironic instructions. +43143|888|88|6|20|35777.60|0.01|0.08|N|O|1998-04-23|1998-03-23|1998-05-12|NONE|TRUCK|uctions solve slyly quickly regula +43168|923|26|1|5|9119.60|0.10|0.01|N|O|1996-07-18|1996-06-19|1996-08-09|TAKE BACK RETURN|AIR| boost quickly final, silent packag +43168|827|27|2|32|55290.24|0.07|0.00|N|O|1996-07-21|1996-05-22|1996-08-10|COLLECT COD|AIR|ely regular requests. e +43168|1068|69|3|20|19381.20|0.00|0.06|N|O|1996-05-07|1996-06-04|1996-05-30|COLLECT COD|TRUCK|g deposits. quickly r +43168|24|75|4|43|39732.86|0.01|0.03|N|O|1996-05-07|1996-06-08|1996-05-22|COLLECT COD|REG AIR|ajole furiously unusual, +43169|1377|16|1|44|56248.28|0.05|0.04|R|F|1994-05-08|1994-06-29|1994-05-27|DELIVER IN PERSON|REG AIR| packages cajole slyly bold asymptotes. fin +43170|1482|83|1|43|59489.64|0.00|0.07|A|F|1993-07-11|1993-07-04|1993-08-08|NONE|MAIL|ly even packages no +43170|153|32|2|1|1053.15|0.08|0.07|R|F|1993-08-20|1993-07-02|1993-09-13|TAKE BACK RETURN|REG AIR|usly final accounts grow care +43170|592|23|3|38|56718.42|0.04|0.06|R|F|1993-05-18|1993-06-26|1993-05-28|COLLECT COD|TRUCK| the always silent a +43170|1779|80|4|23|38657.71|0.06|0.02|R|F|1993-08-28|1993-06-23|1993-09-26|NONE|RAIL|kages engage slyly according to the depend +43170|1856|86|5|23|40430.55|0.03|0.05|R|F|1993-08-14|1993-07-04|1993-08-18|COLLECT COD|REG AIR|o beans cajole blithely. +43170|510|11|6|30|42315.30|0.02|0.04|A|F|1993-08-18|1993-07-27|1993-09-13|TAKE BACK RETURN|RAIL|carefully special pinto beans +43170|1350|89|7|24|30032.40|0.09|0.04|R|F|1993-06-18|1993-06-19|1993-06-28|NONE|FOB|ly. blithely special +43171|1499|39|1|11|15405.39|0.04|0.07|N|O|1996-08-21|1996-07-17|1996-09-15|DELIVER IN PERSON|TRUCK|special theodolites are blithely qui +43171|1919|8|2|35|63731.85|0.07|0.00|N|O|1996-07-10|1996-09-08|1996-08-04|COLLECT COD|REG AIR|y regular requests wake specia +43172|796|93|1|14|23755.06|0.07|0.06|A|F|1994-08-29|1994-08-30|1994-09-23|DELIVER IN PERSON|FOB|ove the ironic +43172|317|46|2|3|3651.93|0.01|0.08|A|F|1994-10-19|1994-09-09|1994-10-20|COLLECT COD|MAIL|ing ideas unwi +43173|1645|87|1|37|57225.68|0.06|0.05|N|O|1996-04-10|1996-04-01|1996-05-10|NONE|REG AIR|inal ideas wake carefully even theodol +43174|1413|53|1|7|9200.87|0.09|0.02|N|O|1998-01-31|1998-02-28|1998-02-24|NONE|RAIL|usly even theod +43175|539|40|1|10|14395.30|0.03|0.00|N|O|1996-05-08|1996-04-30|1996-06-07|COLLECT COD|REG AIR|y. pending, ironic foxes +43175|89|15|2|19|18792.52|0.09|0.08|N|O|1996-05-08|1996-04-15|1996-05-31|TAKE BACK RETURN|SHIP| ironic packages! +43175|1794|79|3|22|37307.38|0.10|0.00|N|O|1996-04-06|1996-04-19|1996-05-04|COLLECT COD|FOB|he furiously regular deposits. e +43175|991|26|4|28|52975.72|0.03|0.03|N|O|1996-05-15|1996-04-30|1996-05-24|COLLECT COD|RAIL|, silent theodolites +43200|870|4|1|21|37188.27|0.10|0.03|R|F|1993-10-08|1993-10-28|1993-11-02|DELIVER IN PERSON|FOB| the quickly regular deposits b +43200|703|36|2|33|52922.10|0.02|0.08|R|F|1993-10-23|1993-10-08|1993-11-22|TAKE BACK RETURN|TRUCK|ges alongsi +43200|1165|66|3|49|52241.84|0.02|0.03|A|F|1993-08-16|1993-10-26|1993-08-30|TAKE BACK RETURN|AIR|special reque +43200|932|67|4|35|64152.55|0.03|0.00|R|F|1993-10-13|1993-09-07|1993-10-26|TAKE BACK RETURN|FOB|counts. care +43200|790|87|5|37|62559.23|0.01|0.07|A|F|1993-10-04|1993-10-18|1993-10-28|TAKE BACK RETURN|SHIP|ve the bold idea +43200|480|68|6|15|20707.20|0.09|0.06|R|F|1993-10-12|1993-10-05|1993-11-10|DELIVER IN PERSON|FOB|f the blithely ironic decoys. slyl +43201|31|7|1|17|15827.51|0.01|0.05|A|F|1995-04-28|1995-05-19|1995-05-12|COLLECT COD|MAIL| pending asymptotes. ironic, ironic att +43202|1824|25|1|19|32790.58|0.07|0.03|R|F|1994-08-11|1994-10-16|1994-08-26|NONE|MAIL|nts. final depo +43202|1729|30|2|48|78274.56|0.02|0.03|R|F|1994-11-28|1994-10-04|1994-12-28|COLLECT COD|FOB|o detect blithely. ideas haggle +43203|865|65|1|44|77697.84|0.08|0.07|A|F|1992-04-26|1992-04-26|1992-05-08|TAKE BACK RETURN|FOB|lithely ir +43203|1360|61|2|36|45408.96|0.04|0.00|A|F|1992-03-29|1992-03-31|1992-04-12|NONE|RAIL|furiously pending excuses. quickly pending +43203|1582|83|3|38|56376.04|0.07|0.00|R|F|1992-04-03|1992-03-17|1992-04-28|TAKE BACK RETURN|TRUCK|bold, regular accounts. carefully +43204|1924|69|1|44|80340.48|0.01|0.01|R|F|1995-02-26|1995-01-28|1995-03-08|TAKE BACK RETURN|FOB|s. unusual requests sleep against the +43204|617|11|2|10|15176.10|0.10|0.03|R|F|1994-12-07|1995-01-05|1994-12-10|COLLECT COD|AIR|pendencies +43204|1978|67|3|12|22559.64|0.06|0.02|R|F|1995-03-28|1995-01-14|1995-04-01|NONE|MAIL|quickly fluffily quiet deposits +43204|1949|50|4|32|59230.08|0.08|0.02|R|F|1995-03-12|1995-01-23|1995-04-04|COLLECT COD|MAIL|nal foxes. slyly regular packa +43204|1372|11|5|39|49661.43|0.05|0.02|R|F|1995-03-01|1995-02-24|1995-03-14|COLLECT COD|FOB|s use furiously. quickly +43205|777|10|1|39|65433.03|0.00|0.00|N|O|1997-06-28|1997-06-12|1997-07-11|COLLECT COD|TRUCK|e slyly about the unu +43206|777|10|1|21|35233.17|0.05|0.05|A|F|1994-11-20|1994-11-12|1994-12-20|COLLECT COD|SHIP|o wake according to th +43206|1832|33|2|45|78022.35|0.05|0.00|A|F|1994-10-27|1994-11-15|1994-11-01|TAKE BACK RETURN|RAIL|lithely alongside of th +43206|372|57|3|33|41988.21|0.05|0.01|R|F|1994-09-10|1994-09-25|1994-09-19|NONE|REG AIR|es are blithely regular +43206|529|90|4|39|55751.28|0.04|0.05|R|F|1994-09-07|1994-10-07|1994-09-11|COLLECT COD|RAIL|sly ironic +43206|507|98|5|48|67560.00|0.07|0.04|A|F|1994-08-27|1994-11-18|1994-09-05|DELIVER IN PERSON|REG AIR|. thin accounts print +43207|1179|88|1|21|22683.57|0.04|0.01|A|F|1993-07-20|1993-07-23|1993-07-25|COLLECT COD|REG AIR|ts. furiously final deposits boost blithel +43207|880|47|2|35|62330.80|0.00|0.03|R|F|1993-08-20|1993-09-04|1993-09-08|COLLECT COD|FOB|ly ironic ideas wake carefully a +43207|1589|30|3|24|35773.92|0.10|0.05|A|F|1993-06-27|1993-08-21|1993-07-16|COLLECT COD|SHIP|ing requests. blithely regular +43207|940|41|4|32|58910.08|0.03|0.02|R|F|1993-09-05|1993-08-02|1993-09-14|TAKE BACK RETURN|TRUCK|ickly pending asympt +43207|1269|44|5|1|1170.26|0.02|0.01|R|F|1993-10-06|1993-08-10|1993-10-14|TAKE BACK RETURN|FOB| never regular pinto bean +43207|1270|82|6|49|57392.23|0.00|0.04|R|F|1993-07-18|1993-09-06|1993-07-30|TAKE BACK RETURN|MAIL|lly idle theodolites. qui +43207|1895|82|7|5|8984.45|0.06|0.00|A|F|1993-09-14|1993-08-18|1993-10-06|NONE|SHIP| carefully express ideas use. furio +43232|601|2|1|31|46549.60|0.03|0.08|N|O|1995-10-15|1995-12-16|1995-10-29|COLLECT COD|REG AIR|quickly fluffily sly theodolites. +43232|1366|43|2|4|5069.44|0.04|0.03|N|O|1995-11-12|1995-12-17|1995-12-05|TAKE BACK RETURN|AIR|ular, pending pinto +43233|1197|98|1|16|17571.04|0.10|0.07|R|F|1993-07-30|1993-08-30|1993-08-19|NONE|TRUCK|xpress deposi +43233|835|35|2|12|20829.96|0.02|0.03|A|F|1993-08-02|1993-08-07|1993-08-17|COLLECT COD|REG AIR| dogged, final tithes nag careful +43234|127|54|1|2|2054.24|0.02|0.05|N|O|1998-01-06|1997-12-21|1998-01-31|DELIVER IN PERSON|AIR|round the furiously regular instructions +43234|25|1|2|24|22200.48|0.09|0.01|N|O|1998-01-25|1998-01-10|1998-01-29|TAKE BACK RETURN|MAIL|s. fluffily b +43234|1845|32|3|33|57645.72|0.09|0.01|N|O|1997-11-02|1997-12-03|1997-11-03|COLLECT COD|RAIL|theodolites are. u +43234|1118|55|4|38|38726.18|0.07|0.00|N|O|1998-02-04|1998-01-10|1998-02-07|TAKE BACK RETURN|REG AIR| blithely quick foxes. slyly ironic ac +43234|1673|56|5|10|15746.70|0.04|0.06|N|O|1998-01-06|1997-12-19|1998-01-12|DELIVER IN PERSON|RAIL|nstructions. bold packages around the +43234|902|3|6|40|72116.00|0.00|0.03|N|O|1998-01-06|1997-11-29|1998-01-30|COLLECT COD|MAIL|oxes. final, pending foxes sleep s +43234|541|32|7|4|5766.16|0.01|0.02|N|O|1997-10-22|1998-01-14|1997-10-26|COLLECT COD|REG AIR|ve to dazzle furiously final, car +43235|1498|77|1|17|23791.33|0.07|0.03|N|O|1995-08-03|1995-10-03|1995-08-25|NONE|TRUCK|s lose against the qui +43236|1844|31|1|28|48883.52|0.05|0.07|R|F|1993-08-23|1993-08-10|1993-08-27|NONE|FOB|ld accounts against the furiously +43236|435|65|2|33|44069.19|0.05|0.08|R|F|1993-10-04|1993-08-15|1993-10-16|TAKE BACK RETURN|AIR|riously requests. deposits engage slyly +43236|738|71|3|10|16387.30|0.05|0.04|A|F|1993-07-10|1993-09-06|1993-07-14|COLLECT COD|TRUCK|carefully. ca +43236|1236|11|4|15|17058.45|0.07|0.06|R|F|1993-07-15|1993-09-03|1993-08-12|NONE|TRUCK|use fluffily alo +43237|1604|87|1|36|54201.60|0.05|0.08|A|F|1993-09-08|1993-08-14|1993-09-27|NONE|TRUCK|yly even ideas sle +43237|1762|63|2|14|23292.64|0.08|0.00|A|F|1993-06-02|1993-07-03|1993-06-15|COLLECT COD|SHIP|elieve furiously f +43237|1505|86|3|37|52040.50|0.06|0.08|A|F|1993-08-24|1993-07-30|1993-09-17|COLLECT COD|REG AIR|tructions af +43238|223|24|1|11|12355.42|0.01|0.05|N|O|1996-05-24|1996-05-24|1996-05-28|NONE|REG AIR|epths are furio +43238|1115|88|2|18|18289.98|0.10|0.08|N|O|1996-06-11|1996-06-28|1996-06-24|COLLECT COD|AIR|ithely against the slyly pending depos +43238|303|88|3|46|55351.80|0.07|0.08|N|O|1996-06-18|1996-06-16|1996-07-12|TAKE BACK RETURN|REG AIR|old frays. final, ironic platelets po +43238|1993|26|4|10|18949.90|0.06|0.05|N|O|1996-05-15|1996-06-28|1996-05-28|TAKE BACK RETURN|MAIL|he ironic packages cajole carefully iron +43239|688|82|1|39|61958.52|0.00|0.00|N|O|1995-06-18|1995-04-28|1995-06-22|COLLECT COD|SHIP|ong the ex +43264|705|38|1|27|43353.90|0.04|0.03|N|O|1996-06-05|1996-05-29|1996-06-09|COLLECT COD|AIR|even attainments +43264|171|98|2|41|43917.97|0.01|0.06|N|O|1996-07-27|1996-05-21|1996-08-16|NONE|RAIL|al ideas use qu +43265|1453|93|1|6|8126.70|0.07|0.06|N|O|1997-10-26|1997-09-24|1997-10-31|DELIVER IN PERSON|REG AIR|aggle quickly at the slyly regular reques +43265|1502|83|2|36|50526.00|0.09|0.05|N|O|1997-08-07|1997-09-28|1997-08-22|NONE|RAIL|the slyly ironic packages affix +43265|1096|2|3|50|49854.50|0.02|0.06|N|O|1997-10-22|1997-09-27|1997-11-03|TAKE BACK RETURN|AIR|ously unusual pinto beans are bol +43265|1980|13|4|11|20701.78|0.07|0.04|N|O|1997-10-22|1997-10-04|1997-10-24|DELIVER IN PERSON|FOB|eposits are furiously quickly iron +43266|168|47|1|32|34181.12|0.09|0.01|N|O|1998-02-08|1998-03-14|1998-02-24|COLLECT COD|MAIL|uests. regular, clos +43266|1211|12|2|40|44488.40|0.06|0.05|N|O|1998-05-30|1998-04-12|1998-06-25|TAKE BACK RETURN|AIR|usly unusual notornis. +43266|1652|94|3|13|20197.45|0.00|0.05|N|O|1998-04-08|1998-04-11|1998-05-06|TAKE BACK RETURN|TRUCK|. evenly ironic +43266|1804|34|4|20|34116.00|0.01|0.01|N|O|1998-04-18|1998-05-03|1998-05-10|NONE|RAIL| ironic ideas: even platelets grow ac +43267|1140|49|1|46|47892.44|0.01|0.05|N|O|1995-09-03|1995-07-13|1995-09-10|NONE|SHIP|uctions are furiously inside the +43267|1372|73|2|40|50934.80|0.02|0.00|R|F|1995-05-27|1995-08-07|1995-06-06|NONE|MAIL|egular instructions-- blithely +43268|393|22|1|15|19400.85|0.04|0.08|N|O|1996-10-19|1996-10-29|1996-11-15|COLLECT COD|TRUCK|platelets b +43269|838|39|1|8|13910.64|0.07|0.08|R|F|1994-04-19|1994-06-17|1994-05-08|DELIVER IN PERSON|TRUCK|usual, regular packa +43269|1640|64|2|5|7708.20|0.08|0.06|R|F|1994-05-12|1994-06-29|1994-05-28|DELIVER IN PERSON|REG AIR| use furiously. fur +43270|1305|6|1|4|4825.20|0.08|0.03|A|F|1992-09-19|1992-10-29|1992-09-30|DELIVER IN PERSON|FOB|final accounts cajole fluffily +43270|1728|13|2|10|16297.20|0.09|0.08|A|F|1992-12-09|1992-10-31|1992-12-21|TAKE BACK RETURN|REG AIR| bravely pending request +43270|1909|54|3|31|56137.90|0.08|0.03|A|F|1992-09-17|1992-11-18|1992-09-18|NONE|MAIL|ide of the even deposits. bold accoun +43270|106|33|4|4|4024.40|0.07|0.00|A|F|1992-12-31|1992-10-27|1993-01-07|DELIVER IN PERSON|MAIL|cial account +43271|1601|25|1|8|12020.80|0.09|0.06|A|F|1993-04-30|1993-05-23|1993-05-15|NONE|MAIL|unts: express deposits sleep. special +43271|992|93|2|1|1892.99|0.04|0.08|A|F|1993-03-29|1993-05-03|1993-04-16|DELIVER IN PERSON|TRUCK|mpress across the fluffily special ex +43271|1074|80|3|22|21451.54|0.03|0.06|R|F|1993-04-27|1993-04-28|1993-05-21|COLLECT COD|TRUCK|hely express pearls sleep quic +43296|1763|48|1|22|36624.72|0.04|0.01|A|F|1992-04-02|1992-04-21|1992-04-11|DELIVER IN PERSON|AIR|sts use slyly carefu +43297|1501|2|1|6|8415.00|0.04|0.02|N|O|1998-06-17|1998-04-04|1998-07-13|COLLECT COD|FOB|iously ironic packages detect under the +43297|436|37|2|50|66821.50|0.09|0.08|N|O|1998-03-04|1998-05-04|1998-03-19|NONE|RAIL|ts dazzle carefully. ironic, fi +43297|476|64|3|14|19270.58|0.05|0.03|N|O|1998-05-16|1998-04-04|1998-05-18|DELIVER IN PERSON|RAIL|deas detect quickly. slyly final +43297|57|83|4|8|7656.40|0.03|0.05|N|O|1998-04-13|1998-05-14|1998-04-15|COLLECT COD|MAIL|ual asymptotes cajole slyly. final pint +43297|479|80|5|20|27589.40|0.02|0.08|N|O|1998-03-10|1998-04-15|1998-03-25|TAKE BACK RETURN|TRUCK|posits. furiously regular asymptotes caj +43297|1560|41|6|29|42385.24|0.09|0.07|N|O|1998-04-13|1998-05-21|1998-04-24|TAKE BACK RETURN|RAIL|cial dugouts believe silent +43297|1635|36|7|19|29195.97|0.05|0.03|N|O|1998-04-01|1998-04-17|1998-04-02|COLLECT COD|AIR|gular instructions after the silent +43298|669|70|1|27|42380.82|0.05|0.08|N|O|1995-07-28|1995-09-18|1995-08-21|COLLECT COD|MAIL|ly pinto beans over the ironic dinos lose +43298|1345|60|2|4|4985.36|0.06|0.04|N|O|1995-08-26|1995-08-12|1995-09-04|TAKE BACK RETURN|REG AIR|yly bold asymptotes wake ca +43298|1904|37|3|40|72236.00|0.08|0.06|N|O|1995-10-25|1995-09-23|1995-11-18|TAKE BACK RETURN|REG AIR|unts solve idly. quietly bold somas +43298|1707|50|4|5|8043.50|0.01|0.08|N|O|1995-09-18|1995-09-08|1995-09-26|TAKE BACK RETURN|AIR|around the +43298|22|98|5|12|11064.24|0.09|0.04|N|O|1995-07-18|1995-08-26|1995-08-13|DELIVER IN PERSON|AIR| sleep blithely ironic requests. blithely e +43299|324|81|1|48|58767.36|0.09|0.08|N|O|1997-01-27|1997-02-26|1997-02-17|COLLECT COD|RAIL|ular accounts na +43299|1732|59|2|31|50645.63|0.10|0.06|N|O|1997-04-26|1997-02-11|1997-05-18|DELIVER IN PERSON|TRUCK|re furiously alongside o +43300|85|36|1|9|8865.72|0.09|0.00|N|O|1998-05-15|1998-05-26|1998-06-07|TAKE BACK RETURN|AIR|itaphs; regular instruc +43300|92|68|2|44|43651.96|0.09|0.01|N|O|1998-04-24|1998-04-24|1998-04-27|NONE|TRUCK|cross the special theo +43301|283|65|1|3|3549.84|0.00|0.08|A|F|1994-12-06|1994-10-06|1994-12-14|DELIVER IN PERSON|REG AIR|yly final requests b +43301|93|69|2|18|17875.62|0.01|0.00|R|F|1994-09-20|1994-09-27|1994-10-20|COLLECT COD|FOB|ut the bold +43301|597|58|3|48|71884.32|0.10|0.06|R|F|1994-12-01|1994-10-22|1994-12-17|COLLECT COD|FOB|refully unusual packages sleep +43301|1103|76|4|7|7028.70|0.09|0.01|A|F|1994-10-04|1994-09-29|1994-10-16|TAKE BACK RETURN|FOB|ake among the blithely regula +43301|465|95|5|35|47791.10|0.10|0.08|R|F|1994-12-19|1994-10-20|1995-01-06|COLLECT COD|MAIL| packages? carefully regular ideas haggle. +43301|909|78|6|7|12669.30|0.09|0.00|R|F|1994-09-16|1994-09-24|1994-10-12|DELIVER IN PERSON|FOB|sly regular platelets +43301|299|100|7|35|41975.15|0.02|0.03|A|F|1994-11-26|1994-11-03|1994-12-12|DELIVER IN PERSON|MAIL|equests. s +43302|909|12|1|5|9049.50|0.06|0.03|N|O|1995-09-27|1995-11-09|1995-10-24|DELIVER IN PERSON|MAIL|telets eat blithely furiously sp +43302|101|28|2|10|10011.00|0.00|0.02|N|O|1995-12-12|1995-11-14|1995-12-25|NONE|FOB|ly. even, express ideas haggle furiously al +43302|1713|98|3|23|37138.33|0.05|0.08|N|O|1995-10-19|1995-10-20|1995-11-04|COLLECT COD|MAIL|uffily according to the carefully ir +43302|904|39|4|31|55951.90|0.08|0.01|N|O|1995-12-03|1995-10-21|1995-12-08|TAKE BACK RETURN|MAIL|ar deposits +43303|1549|70|1|40|58021.60|0.00|0.08|R|F|1994-06-11|1994-05-28|1994-07-07|DELIVER IN PERSON|TRUCK|ic excuses cajole furio +43303|906|9|2|33|59627.70|0.00|0.00|R|F|1994-04-23|1994-05-17|1994-05-18|DELIVER IN PERSON|SHIP|ites. furiously s +43328|1253|54|1|42|48478.50|0.01|0.04|A|F|1995-03-21|1995-05-04|1995-03-30|NONE|REG AIR|posits. regular packages boost: regular acc +43328|1047|48|2|17|16116.68|0.10|0.00|R|F|1995-03-13|1995-04-25|1995-04-04|TAKE BACK RETURN|AIR|lent ideas breach sly +43328|1422|62|3|3|3970.26|0.04|0.00|R|F|1995-03-25|1995-06-02|1995-04-02|COLLECT COD|RAIL|odolites sleep boldly pending depos +43328|1481|82|4|39|53916.72|0.06|0.02|A|F|1995-04-16|1995-04-28|1995-05-09|COLLECT COD|AIR|ole carefully quickly ruth +43328|196|97|5|40|43847.60|0.02|0.03|N|O|1995-06-20|1995-04-18|1995-06-28|DELIVER IN PERSON|RAIL| accounts wake quickly expre +43329|1069|75|1|7|6790.42|0.06|0.07|A|F|1993-06-27|1993-05-15|1993-07-05|DELIVER IN PERSON|RAIL|nding deposit +43329|1509|10|2|10|14105.00|0.05|0.06|R|F|1993-03-28|1993-04-09|1993-04-12|DELIVER IN PERSON|REG AIR|fter the carefully +43329|1700|83|3|43|68873.10|0.00|0.03|A|F|1993-06-06|1993-05-23|1993-06-11|NONE|REG AIR|ending platele +43329|1108|9|4|12|12109.20|0.03|0.03|A|F|1993-05-30|1993-04-11|1993-06-01|COLLECT COD|RAIL|nal ideas ca +43329|1062|33|5|14|13482.84|0.08|0.00|A|F|1993-05-16|1993-05-20|1993-06-11|TAKE BACK RETURN|SHIP|cial ideas affix caref +43330|70|71|1|3|2910.21|0.03|0.07|R|F|1994-07-10|1994-06-26|1994-07-31|TAKE BACK RETURN|AIR|fully about the dogged, ironic +43330|70|21|2|21|20371.47|0.08|0.02|R|F|1994-05-01|1994-05-28|1994-05-09|TAKE BACK RETURN|FOB|haggle according to the +43330|474|75|3|45|61851.15|0.07|0.07|A|F|1994-08-21|1994-06-23|1994-09-12|DELIVER IN PERSON|AIR| accounts affix blit +43331|1531|12|1|2|2865.06|0.03|0.00|N|O|1998-03-27|1998-05-01|1998-04-09|COLLECT COD|TRUCK|o the blithely ironic requ +43331|1287|62|2|27|32083.56|0.06|0.08|N|O|1998-06-15|1998-06-17|1998-07-12|NONE|AIR|ve blithely alongside of the e +43332|1925|26|1|17|31057.64|0.03|0.00|R|F|1992-09-14|1992-11-05|1992-10-02|NONE|MAIL|as sometimes final deposits. +43332|904|5|2|18|32488.20|0.05|0.04|A|F|1992-11-26|1992-11-19|1992-12-08|TAKE BACK RETURN|MAIL|fully ironic accounts. +43332|1152|53|3|50|52657.50|0.02|0.03|A|F|1992-10-12|1992-11-04|1992-10-20|COLLECT COD|SHIP|ns. blithely bold foxes sleep. furiously ev +43332|744|9|4|26|42763.24|0.09|0.01|R|F|1992-10-19|1992-10-17|1992-11-15|TAKE BACK RETURN|RAIL|arefully busy instructions. even platelets +43333|120|73|1|9|9181.08|0.02|0.06|R|F|1994-01-18|1994-02-08|1994-02-13|COLLECT COD|FOB|express foxes ar +43334|1534|35|1|4|5742.12|0.05|0.03|A|F|1993-11-20|1993-09-16|1993-11-27|COLLECT COD|SHIP|wake about the fluffily special request +43335|410|98|1|13|17035.33|0.10|0.05|N|O|1998-06-06|1998-07-14|1998-06-16|COLLECT COD|SHIP|pendencies sleep slyly durin +43335|1361|62|2|4|5049.44|0.10|0.07|N|O|1998-06-15|1998-06-20|1998-07-05|NONE|REG AIR|ously blithel +43360|1980|25|1|9|16937.82|0.08|0.00|R|F|1994-12-09|1995-01-11|1995-01-08|NONE|REG AIR|usly blithe warthogs. special, bold asymp +43360|757|90|2|16|26524.00|0.10|0.05|R|F|1994-11-20|1994-12-12|1994-12-11|TAKE BACK RETURN|AIR|lly ironic ins +43360|1933|22|3|49|89911.57|0.03|0.05|R|F|1994-11-25|1994-11-20|1994-12-07|COLLECT COD|SHIP|its! quickly ironic ideas will have +43361|147|100|1|8|8377.12|0.06|0.06|N|O|1995-11-14|1995-12-01|1995-11-29|NONE|RAIL|ts sleep. furious +43362|1821|22|1|43|74081.26|0.03|0.04|R|F|1994-02-04|1994-02-21|1994-02-10|DELIVER IN PERSON|TRUCK|fully across the express accounts. +43362|589|50|2|21|31281.18|0.00|0.02|R|F|1994-05-05|1994-03-04|1994-05-17|DELIVER IN PERSON|AIR|posits are blithely quickly +43362|1170|79|3|15|16067.55|0.05|0.05|R|F|1994-04-06|1994-02-16|1994-05-05|COLLECT COD|RAIL|pinto beans. fluffily even as +43362|128|7|4|44|45237.28|0.07|0.05|R|F|1994-02-03|1994-03-18|1994-03-01|COLLECT COD|MAIL|gular packages. carefully ironic de +43362|1240|52|5|11|12553.64|0.09|0.00|A|F|1994-02-10|1994-04-12|1994-02-13|NONE|FOB|phs cajole against the furious +43363|874|41|1|5|8874.35|0.06|0.07|N|O|1995-12-27|1995-10-13|1996-01-03|DELIVER IN PERSON|RAIL| regular foxes are. unusual acc +43363|924|59|2|49|89421.08|0.03|0.08|N|O|1995-11-12|1995-11-24|1995-12-08|DELIVER IN PERSON|AIR| ideas wake above the even request +43363|1392|31|3|22|28454.58|0.05|0.02|N|O|1995-09-29|1995-11-13|1995-10-07|DELIVER IN PERSON|REG AIR| final, final platelets according to the s +43363|1906|39|4|7|12655.30|0.09|0.05|N|O|1995-10-28|1995-11-04|1995-11-13|NONE|AIR| blithe, regular Tiresias. slyly +43363|166|19|5|6|6396.96|0.09|0.03|N|O|1995-11-02|1995-11-16|1995-11-26|COLLECT COD|REG AIR|alongside of the +43363|1880|81|6|31|55238.28|0.04|0.06|N|O|1995-11-18|1995-11-08|1995-12-17|COLLECT COD|TRUCK|althily final excuses detect. bravel +43364|1498|38|1|24|33587.76|0.05|0.05|R|F|1992-05-10|1992-07-03|1992-05-26|TAKE BACK RETURN|AIR|. furiously unusual pinto +43364|75|51|2|47|45828.29|0.02|0.02|A|F|1992-07-24|1992-06-30|1992-08-04|DELIVER IN PERSON|AIR|ans boost slyly about th +43364|1342|81|3|1|1243.34|0.01|0.02|R|F|1992-04-23|1992-05-21|1992-05-20|TAKE BACK RETURN|MAIL|s sleep quickly carefully regular account +43364|1034|70|4|31|28985.93|0.03|0.07|R|F|1992-07-27|1992-06-27|1992-07-31|NONE|MAIL| furiously regular dolphins boost ac +43364|1038|39|5|14|13146.42|0.04|0.08|R|F|1992-05-28|1992-05-26|1992-06-23|TAKE BACK RETURN|MAIL| daring instructions among the regular, +43365|357|14|1|15|18860.25|0.05|0.03|N|O|1998-06-06|1998-04-12|1998-06-21|NONE|TRUCK|tegrate among the orbi +43365|1576|77|2|23|33984.11|0.04|0.00|N|O|1998-03-20|1998-04-16|1998-03-23|DELIVER IN PERSON|FOB|egrate blithely according to the car +43365|956|59|3|7|12998.65|0.06|0.06|N|O|1998-03-12|1998-06-03|1998-03-15|COLLECT COD|REG AIR|y even dependencies. furiously silent +43365|787|52|4|28|47257.84|0.05|0.01|N|O|1998-05-14|1998-06-05|1998-06-02|NONE|RAIL|ar platelets. quickly fina +43365|106|85|5|8|8048.80|0.10|0.06|N|O|1998-03-15|1998-05-07|1998-04-04|COLLECT COD|FOB|ent dependencies. excuses a +43366|896|96|1|25|44922.25|0.05|0.03|N|O|1997-06-12|1997-06-24|1997-06-23|COLLECT COD|TRUCK|s the furiously quiet hockey players aff +43366|1183|20|2|27|29272.86|0.06|0.01|N|O|1997-04-28|1997-05-20|1997-05-04|TAKE BACK RETURN|SHIP|as poach slyly pi +43366|1061|32|3|35|33672.10|0.08|0.08|N|O|1997-06-10|1997-07-08|1997-06-17|DELIVER IN PERSON|SHIP| after the slyly bold reque +43366|711|76|4|48|77362.08|0.02|0.06|N|O|1997-07-21|1997-05-31|1997-07-26|COLLECT COD|SHIP|tions cajole sl +43367|1117|26|1|5|5090.55|0.01|0.03|A|F|1993-05-20|1993-04-23|1993-06-14|NONE|MAIL|dolphins. carefully unusual foxes along +43367|46|22|2|12|11352.48|0.01|0.01|A|F|1993-06-02|1993-04-10|1993-06-09|TAKE BACK RETURN|REG AIR|even requests are quickly carefully regula +43367|1527|48|3|14|19999.28|0.05|0.08|A|F|1993-07-04|1993-04-11|1993-07-23|DELIVER IN PERSON|AIR|lyly furious requests. pending, regula +43367|85|61|4|4|3940.32|0.07|0.03|A|F|1993-04-08|1993-04-27|1993-05-01|NONE|SHIP|s boost furiously except the quickly +43367|1174|75|5|30|32255.10|0.05|0.00|A|F|1993-05-02|1993-05-01|1993-05-11|NONE|MAIL|y unusual a +43367|1481|99|6|20|27649.60|0.04|0.01|A|F|1993-03-28|1993-05-22|1993-04-03|NONE|FOB|platelets solve slyly. careful +43392|682|14|1|7|11078.76|0.02|0.02|A|F|1995-03-27|1995-03-29|1995-04-11|TAKE BACK RETURN|AIR|ual frets along the furi +43392|1343|82|2|2|2488.68|0.09|0.02|R|F|1995-03-16|1995-03-22|1995-04-04|NONE|TRUCK|ites thrash slyly according to the +43392|1921|66|3|35|63802.20|0.08|0.02|R|F|1995-04-10|1995-03-22|1995-04-26|TAKE BACK RETURN|MAIL|ic requests. quickly ironic packages w +43392|13|89|4|38|34694.38|0.04|0.03|A|F|1995-03-22|1995-03-29|1995-04-21|COLLECT COD|SHIP|special platelets. slyly permanent +43392|425|13|5|4|5301.68|0.06|0.02|R|F|1995-01-09|1995-03-23|1995-02-07|NONE|TRUCK|ss tithes. quickly express instr +43392|608|2|6|17|25646.20|0.00|0.01|R|F|1995-02-06|1995-02-24|1995-02-13|DELIVER IN PERSON|FOB|eep above the furio +43392|657|20|7|35|54517.75|0.09|0.03|R|F|1995-01-05|1995-03-21|1995-01-24|DELIVER IN PERSON|MAIL|slyly final grouches detect slyly bo +43393|93|44|1|2|1986.18|0.03|0.08|N|O|1996-07-15|1996-08-24|1996-08-04|DELIVER IN PERSON|FOB|ccounts sleep qui +43393|145|24|2|50|52257.00|0.04|0.02|N|O|1996-08-26|1996-08-03|1996-09-18|COLLECT COD|TRUCK|nst the ironic deposits. regular ideas ar +43394|1720|21|1|26|42164.72|0.07|0.05|A|F|1994-08-27|1994-07-26|1994-09-26|COLLECT COD|SHIP|ously regular requests. furiously fina +43395|132|85|1|4|4128.52|0.07|0.07|N|O|1996-03-20|1996-02-16|1996-04-12|DELIVER IN PERSON|AIR|aggle. carefully brave accounts print car +43396|1026|27|1|28|25956.56|0.09|0.06|R|F|1993-01-11|1993-02-12|1993-01-22|COLLECT COD|TRUCK|nusual courts about the f +43397|16|67|1|30|27480.30|0.10|0.03|N|F|1995-06-03|1995-07-31|1995-07-02|DELIVER IN PERSON|MAIL|ously. slyly even the +43398|1084|20|1|44|43343.52|0.04|0.01|N|O|1995-07-12|1995-05-31|1995-07-17|DELIVER IN PERSON|SHIP|ckages. fina +43398|698|30|2|17|27177.73|0.05|0.05|N|O|1995-07-31|1995-06-03|1995-08-15|COLLECT COD|FOB|lar packages according to +43398|1882|26|3|16|28542.08|0.06|0.05|N|F|1995-06-11|1995-07-11|1995-07-02|TAKE BACK RETURN|TRUCK|ect furiously pending courts. sl +43398|593|84|4|30|44807.70|0.08|0.05|A|F|1995-05-26|1995-06-24|1995-06-12|DELIVER IN PERSON|RAIL|ptotes use across the quickly pendin +43398|1418|97|5|4|5277.64|0.09|0.00|N|O|1995-08-13|1995-06-09|1995-08-23|NONE|REG AIR| sly packages. fluffily unusual deposits +43399|611|43|1|23|34767.03|0.03|0.07|A|F|1994-11-18|1994-10-07|1994-12-08|NONE|FOB| even foxes? furiously final accounts ar +43399|413|43|2|19|24954.79|0.03|0.01|A|F|1994-11-04|1994-09-10|1994-11-06|DELIVER IN PERSON|TRUCK|equests hagg +43399|1578|99|3|40|59182.80|0.09|0.07|R|F|1994-11-29|1994-09-10|1994-12-15|TAKE BACK RETURN|MAIL|tealthily express dependencies cajole aro +43399|879|80|4|47|83653.89|0.02|0.02|R|F|1994-11-12|1994-10-19|1994-11-29|COLLECT COD|TRUCK|unusual instructions. +43399|1986|87|5|17|32095.66|0.07|0.08|R|F|1994-08-26|1994-08-30|1994-09-15|NONE|RAIL|ctions. slyly final asym +43399|543|34|6|42|60628.68|0.10|0.02|R|F|1994-09-20|1994-08-31|1994-10-02|DELIVER IN PERSON|AIR|sly unusual platelets. caref +43399|1128|37|7|40|41164.80|0.01|0.05|R|F|1994-11-04|1994-09-02|1994-11-15|TAKE BACK RETURN|TRUCK|thrash quickly +43424|991|60|1|18|34055.82|0.07|0.05|N|O|1995-11-29|1995-10-26|1995-11-30|DELIVER IN PERSON|AIR|p fluffily accord +43425|360|45|1|36|45372.96|0.09|0.03|A|F|1994-04-22|1994-02-21|1994-05-12|NONE|TRUCK|t against the r +43425|875|76|2|18|31965.66|0.01|0.07|A|F|1994-03-02|1994-03-08|1994-03-05|COLLECT COD|MAIL|ld asymptotes haggle slyly a +43426|1496|75|1|27|37732.23|0.01|0.00|A|F|1993-03-28|1993-04-18|1993-04-22|TAKE BACK RETURN|TRUCK|nic requests are. even dependencies be +43426|1408|87|2|35|45829.00|0.09|0.03|A|F|1993-03-14|1993-05-25|1993-03-29|DELIVER IN PERSON|REG AIR|of the furio +43426|1553|74|3|35|50909.25|0.09|0.08|A|F|1993-06-03|1993-04-25|1993-06-23|NONE|TRUCK|al instructions use furiously unu +43426|1125|98|4|31|31809.72|0.09|0.01|R|F|1993-04-08|1993-05-20|1993-04-11|NONE|TRUCK|ing theodolites wake blithely. carefully bo +43426|1271|83|5|14|16411.78|0.09|0.07|A|F|1993-06-25|1993-04-13|1993-06-29|NONE|FOB|special requ +43426|322|51|6|43|52559.76|0.06|0.08|R|F|1993-03-27|1993-04-18|1993-04-04|NONE|AIR|efully above the slyl +43427|1101|74|1|9|9018.90|0.04|0.06|N|O|1995-12-10|1995-11-17|1995-12-21|DELIVER IN PERSON|MAIL|y dependencies. +43427|20|96|2|3|2760.06|0.10|0.08|N|O|1995-10-12|1995-11-19|1995-10-15|DELIVER IN PERSON|TRUCK| ideas sleep carefully. express req +43428|903|4|1|29|52313.10|0.05|0.08|N|O|1998-07-03|1998-06-13|1998-07-26|COLLECT COD|TRUCK|hely final ideas sleep. +43429|974|75|1|49|91873.53|0.03|0.00|A|F|1992-09-27|1992-09-21|1992-10-01|NONE|AIR|ans across the blithely e +43429|1834|21|2|12|20829.96|0.00|0.01|A|F|1992-09-27|1992-10-03|1992-10-19|DELIVER IN PERSON|REG AIR|e pending accounts. idly ex +43429|1353|54|3|42|52682.70|0.09|0.02|A|F|1992-09-29|1992-09-01|1992-09-30|COLLECT COD|REG AIR| the ironic, pending packa +43429|1301|40|4|16|19236.80|0.01|0.01|R|F|1992-10-30|1992-08-30|1992-11-12|TAKE BACK RETURN|RAIL|requests sleep furiously along +43429|624|56|5|8|12196.96|0.09|0.01|A|F|1992-07-25|1992-08-11|1992-07-29|NONE|REG AIR| deposits cajole according +43429|1814|44|6|1|1715.81|0.04|0.03|A|F|1992-08-20|1992-09-29|1992-08-27|COLLECT COD|MAIL|rs. packages nag. platelets solve +43429|254|36|7|26|30010.50|0.03|0.02|R|F|1992-08-31|1992-08-23|1992-09-30|TAKE BACK RETURN|AIR|dolites are qu +43430|945|46|1|16|29535.04|0.05|0.05|A|F|1992-10-20|1992-08-08|1992-11-05|COLLECT COD|FOB|bout the quickly ironic packages. blithe +43430|208|63|2|46|50977.20|0.01|0.04|A|F|1992-08-06|1992-07-28|1992-08-20|NONE|SHIP|lar accounts use +43430|1354|31|3|22|27617.70|0.03|0.05|R|F|1992-10-08|1992-09-08|1992-10-15|DELIVER IN PERSON|REG AIR|luffily ironic courts eat pack +43431|1719|46|1|24|38897.04|0.00|0.06|N|O|1995-08-21|1995-07-27|1995-09-01|DELIVER IN PERSON|TRUCK|ites. final packages hagg +43456|1646|70|1|30|46429.20|0.02|0.04|N|O|1997-04-22|1997-05-20|1997-05-15|TAKE BACK RETURN|AIR|ets. furiously regular pinto beans +43456|807|8|2|27|46110.60|0.01|0.00|N|O|1997-07-12|1997-07-01|1997-08-05|COLLECT COD|REG AIR|wake sly deposits. bl +43456|1908|41|3|34|61536.60|0.07|0.07|N|O|1997-05-17|1997-07-16|1997-05-30|COLLECT COD|TRUCK|al requests integrate fluffily. furiousl +43456|152|31|4|22|23147.30|0.05|0.02|N|O|1997-07-24|1997-05-20|1997-07-26|NONE|MAIL|he slyly careful pains boost against the i +43457|789|86|1|27|45624.06|0.02|0.01|N|O|1996-06-15|1996-08-28|1996-06-22|DELIVER IN PERSON|TRUCK|. foxes eat. q +43457|1464|65|2|10|13654.60|0.08|0.03|N|O|1996-06-11|1996-08-05|1996-07-07|TAKE BACK RETURN|RAIL|l instructions sleep +43457|1952|85|3|25|46348.75|0.03|0.08|N|O|1996-10-03|1996-07-12|1996-10-30|DELIVER IN PERSON|TRUCK|encies wake a +43457|616|17|4|29|43981.69|0.03|0.04|N|O|1996-08-05|1996-07-06|1996-08-09|TAKE BACK RETURN|SHIP| carefully carefully regular +43458|1385|100|1|34|43736.92|0.05|0.08|N|O|1996-06-28|1996-08-03|1996-07-23|NONE|SHIP|egular asymptotes eat slyly across the c +43458|1523|44|2|38|54131.76|0.04|0.04|N|O|1996-09-10|1996-08-23|1996-09-13|DELIVER IN PERSON|RAIL|onic foxes haggle around t +43458|996|97|3|28|53115.72|0.07|0.01|N|O|1996-09-08|1996-07-14|1996-09-24|COLLECT COD|MAIL|into beans about the ironi +43459|372|1|1|22|27992.14|0.00|0.06|N|O|1996-02-13|1996-01-06|1996-03-14|TAKE BACK RETURN|FOB|sts. requests wake fluffily reques +43460|1786|71|1|20|33755.60|0.06|0.02|R|F|1992-06-25|1992-07-23|1992-07-15|NONE|MAIL|xpress exc +43460|605|68|2|5|7528.00|0.07|0.04|R|F|1992-09-09|1992-08-01|1992-09-21|TAKE BACK RETURN|FOB|ow deposits are ironic +43460|1018|24|3|41|37679.41|0.05|0.03|R|F|1992-06-16|1992-07-26|1992-06-30|COLLECT COD|SHIP| carefully u +43460|109|62|4|12|12109.20|0.04|0.02|R|F|1992-09-01|1992-09-08|1992-09-28|NONE|SHIP|special pearls affix packages. furi +43460|1128|37|5|2|2058.24|0.07|0.04|R|F|1992-07-31|1992-08-23|1992-08-27|TAKE BACK RETURN|AIR|encies. deposits +43461|1322|99|1|6|7339.92|0.09|0.01|N|O|1998-06-08|1998-05-19|1998-07-02|TAKE BACK RETURN|RAIL|asymptotes wake quickly +43461|205|6|2|29|32050.80|0.04|0.02|N|O|1998-04-25|1998-05-07|1998-05-22|TAKE BACK RETURN|MAIL|ily silent theodol +43461|1877|78|3|49|87164.63|0.03|0.01|N|O|1998-03-26|1998-04-05|1998-03-28|TAKE BACK RETURN|TRUCK| asymptotes wake carefully r +43461|1354|55|4|32|40171.20|0.00|0.00|N|O|1998-06-13|1998-05-14|1998-07-12|COLLECT COD|SHIP|yly unusual accounts cajol +43462|1711|96|1|35|56444.85|0.00|0.07|R|F|1993-05-28|1993-07-09|1993-06-25|NONE|FOB|tain after the +43463|49|75|1|47|44604.88|0.09|0.06|N|O|1996-07-31|1996-10-17|1996-08-17|COLLECT COD|SHIP|ths. furiousl +43463|972|41|2|50|93648.50|0.01|0.07|N|O|1996-09-20|1996-08-27|1996-10-12|COLLECT COD|FOB|egular accounts. blithely ironic +43463|1256|57|3|32|37032.00|0.07|0.02|N|O|1996-11-08|1996-10-18|1996-11-20|DELIVER IN PERSON|SHIP| packages: packages accor +43463|866|66|4|16|28269.76|0.08|0.04|N|O|1996-11-06|1996-08-29|1996-11-30|TAKE BACK RETURN|MAIL|ly? furiou +43463|205|87|5|21|23209.20|0.06|0.05|N|O|1996-08-25|1996-09-15|1996-09-15|COLLECT COD|RAIL|ronic, ironic deposits among th +43463|1197|6|6|22|24160.18|0.05|0.02|N|O|1996-10-11|1996-09-19|1996-10-16|DELIVER IN PERSON|MAIL|e across th +43463|1735|78|7|43|70379.39|0.08|0.07|N|O|1996-09-21|1996-10-13|1996-10-20|TAKE BACK RETURN|MAIL|nal requests sleep carefully. slyly +43488|1922|55|1|49|89372.08|0.10|0.01|R|F|1992-07-05|1992-08-09|1992-07-09|DELIVER IN PERSON|TRUCK|kages are carefully. caref +43488|87|88|2|14|13819.12|0.10|0.08|A|F|1992-07-01|1992-09-07|1992-07-27|COLLECT COD|TRUCK|doubt according to the furiously pendin +43488|1133|6|3|42|43433.46|0.00|0.00|R|F|1992-07-02|1992-09-10|1992-07-29|TAKE BACK RETURN|RAIL|ep furiously according to the blithely si +43488|270|98|4|10|11702.70|0.08|0.02|R|F|1992-09-30|1992-09-10|1992-10-30|NONE|TRUCK|ide of the iron +43488|57|8|5|6|5742.30|0.01|0.06|R|F|1992-07-18|1992-08-01|1992-08-16|COLLECT COD|RAIL| quickly final for +43488|229|11|6|46|51944.12|0.07|0.01|A|F|1992-10-17|1992-09-09|1992-10-28|TAKE BACK RETURN|RAIL|as. quickly unusual package +43488|46|97|7|31|29327.24|0.02|0.07|R|F|1992-10-08|1992-08-19|1992-11-05|COLLECT COD|AIR|. quickly regular de +43489|773|74|1|11|18411.47|0.01|0.02|N|O|1996-12-09|1996-10-26|1997-01-05|DELIVER IN PERSON|SHIP|o beans. fluffily ironic instruction +43489|1316|31|2|23|27998.13|0.05|0.06|N|O|1996-09-23|1996-10-27|1996-10-15|NONE|REG AIR|ar packages affix quickly pending requests. +43490|647|48|1|31|47976.84|0.09|0.07|R|F|1994-09-06|1994-10-06|1994-09-30|NONE|RAIL|ond the slyly regular waters. +43491|19|95|1|19|17461.19|0.01|0.01|N|O|1995-07-03|1995-04-28|1995-07-29|DELIVER IN PERSON|FOB|dolites are slyly according to the fur +43491|1148|21|2|34|35670.76|0.02|0.06|R|F|1995-05-09|1995-06-03|1995-05-10|COLLECT COD|MAIL|y regular accounts boost along the +43491|1473|13|3|10|13744.70|0.01|0.04|A|F|1995-04-22|1995-05-26|1995-05-13|TAKE BACK RETURN|AIR|after the expr +43491|510|41|4|2|2821.02|0.03|0.03|N|O|1995-07-04|1995-05-30|1995-07-08|DELIVER IN PERSON|REG AIR|jole slyly. excuses use blithely ab +43491|1820|21|5|15|25827.30|0.10|0.00|R|F|1995-03-11|1995-06-06|1995-03-18|COLLECT COD|REG AIR|nal deposits wake. unusual d +43491|1861|62|6|45|79328.70|0.09|0.08|R|F|1995-03-31|1995-06-02|1995-04-19|NONE|AIR| hinder. s +43492|23|74|1|35|32305.70|0.00|0.07|N|O|1996-06-03|1996-05-03|1996-06-29|DELIVER IN PERSON|FOB|lly final theodolites sleep blithel +43492|1611|53|2|47|71092.67|0.02|0.00|N|O|1996-03-31|1996-04-21|1996-04-08|COLLECT COD|SHIP|thely brave ideas wake quickly qui +43493|965|34|1|42|78370.32|0.04|0.06|R|F|1992-08-13|1992-06-25|1992-09-09|TAKE BACK RETURN|SHIP|ing deposits. unusual +43493|1356|57|2|37|46521.95|0.08|0.08|A|F|1992-07-06|1992-07-23|1992-07-20|NONE|REG AIR|nic packag +43493|725|26|3|9|14631.48|0.09|0.03|A|F|1992-07-12|1992-06-26|1992-07-23|DELIVER IN PERSON|SHIP|all have to promise fu +43493|1278|16|4|39|45991.53|0.01|0.02|R|F|1992-05-24|1992-07-19|1992-06-20|NONE|MAIL|refully pending pi +43493|176|29|5|25|26904.25|0.02|0.00|A|F|1992-08-10|1992-07-16|1992-09-01|COLLECT COD|RAIL|. slyly even epitaphs cajole sl +43493|1257|32|6|16|18532.00|0.04|0.00|A|F|1992-06-18|1992-06-23|1992-07-05|DELIVER IN PERSON|RAIL|s. regular, b +43493|710|7|7|17|27382.07|0.06|0.06|A|F|1992-05-20|1992-06-10|1992-05-24|DELIVER IN PERSON|MAIL|fully express deposits; instructions boos +43494|1969|2|1|1|1870.96|0.03|0.06|A|F|1992-03-05|1992-02-27|1992-03-09|TAKE BACK RETURN|REG AIR|dolites are brave +43494|556|87|2|27|39326.85|0.07|0.06|A|F|1992-01-13|1992-02-05|1992-02-04|NONE|AIR|hely. even packages nag sl +43494|1581|2|3|30|44477.40|0.04|0.04|A|F|1992-02-06|1992-03-25|1992-03-03|DELIVER IN PERSON|TRUCK|gular deposits across the unusual theodo +43494|1483|23|4|20|27689.60|0.04|0.02|A|F|1992-03-19|1992-03-27|1992-04-08|COLLECT COD|TRUCK| slyly final packages affix care +43494|1723|66|5|6|9748.32|0.02|0.04|A|F|1992-01-14|1992-04-03|1992-02-12|COLLECT COD|REG AIR|ly unusual foxes +43495|708|9|1|24|38608.80|0.07|0.02|N|O|1997-02-10|1996-12-11|1997-03-09|TAKE BACK RETURN|FOB| bold accounts are careful +43495|1201|2|2|36|39679.20|0.00|0.03|N|O|1997-01-23|1996-12-07|1997-02-15|COLLECT COD|TRUCK|ickly fina +43495|1983|84|3|44|82939.12|0.02|0.04|N|O|1997-02-02|1997-01-13|1997-02-07|TAKE BACK RETURN|AIR|ar packages detect quickly ag +43495|1695|37|4|38|60674.22|0.09|0.00|N|O|1996-12-27|1997-01-19|1997-01-06|TAKE BACK RETURN|MAIL|es against the pending theodolites thra +43495|1370|47|5|24|30512.88|0.08|0.04|N|O|1997-01-20|1997-01-10|1997-02-04|NONE|FOB|beans among the blithely silent sentime +43520|77|53|1|48|46899.36|0.08|0.04|N|O|1998-03-14|1998-04-10|1998-04-03|DELIVER IN PERSON|REG AIR|he slyly final requ +43520|1431|71|2|5|6662.15|0.10|0.04|N|O|1998-03-25|1998-04-09|1998-03-27|NONE|RAIL|sly pending foxes boost busily. regular +43520|165|44|3|35|37280.60|0.03|0.03|N|O|1998-06-07|1998-04-03|1998-07-03|NONE|AIR|structions. packages wake slyly. special t +43520|1789|74|4|44|74394.32|0.07|0.03|N|O|1998-05-02|1998-04-19|1998-05-30|TAKE BACK RETURN|FOB| final, final accounts about the sp +43520|1357|96|5|18|22650.30|0.00|0.06|N|O|1998-04-11|1998-04-05|1998-05-07|TAKE BACK RETURN|FOB|iously along t +43520|30|56|6|35|32551.05|0.04|0.07|N|O|1998-05-05|1998-04-29|1998-05-14|TAKE BACK RETURN|MAIL|ully express as +43521|1356|95|1|30|37720.50|0.00|0.06|R|F|1994-07-05|1994-06-11|1994-07-15|DELIVER IN PERSON|MAIL|ackages use ev +43521|1222|60|2|44|49421.68|0.00|0.06|R|F|1994-05-29|1994-06-14|1994-06-24|TAKE BACK RETURN|SHIP| regular instruct +43522|215|16|1|3|3345.63|0.00|0.05|R|F|1994-03-06|1994-03-25|1994-03-23|COLLECT COD|FOB|doubt permanent +43522|1173|82|2|5|5370.85|0.03|0.06|A|F|1994-04-11|1994-03-17|1994-05-04|DELIVER IN PERSON|MAIL|grate. ironic requests a +43522|1579|20|3|21|31091.97|0.02|0.01|A|F|1994-05-23|1994-03-18|1994-06-21|NONE|FOB| the braids. furiously final +43523|1555|56|1|22|32044.10|0.00|0.01|A|F|1992-07-16|1992-08-22|1992-08-11|NONE|SHIP|sts cajole. carefully +43523|209|10|2|38|42149.60|0.10|0.07|A|F|1992-09-02|1992-07-27|1992-09-30|COLLECT COD|MAIL|ess platelets alongside of the blithely +43523|212|13|3|21|23356.41|0.09|0.02|R|F|1992-07-12|1992-06-27|1992-07-19|DELIVER IN PERSON|MAIL|quickly pending, dog +43524|1256|94|1|6|6943.50|0.06|0.06|R|F|1992-08-15|1992-09-08|1992-09-14|TAKE BACK RETURN|TRUCK|requests cajo +43524|104|5|2|30|30123.00|0.10|0.05|R|F|1992-07-19|1992-09-11|1992-07-20|COLLECT COD|REG AIR| final sheaves haggle care +43525|727|24|1|25|40693.00|0.03|0.04|A|F|1993-06-22|1993-08-06|1993-07-04|DELIVER IN PERSON|FOB|gular pinto beans a +43526|692|93|1|12|19112.28|0.01|0.06|A|F|1993-09-19|1993-07-19|1993-10-02|DELIVER IN PERSON|TRUCK|s decoys affix furi +43526|1133|6|2|19|19648.47|0.02|0.05|R|F|1993-09-02|1993-07-15|1993-09-08|TAKE BACK RETURN|RAIL|carefully regular e +43526|1876|6|3|13|23112.31|0.08|0.08|A|F|1993-08-29|1993-06-27|1993-09-24|COLLECT COD|SHIP|ans. furiously pending theodolites about t +43526|71|47|4|48|46611.36|0.04|0.03|A|F|1993-08-25|1993-06-30|1993-08-26|NONE|SHIP|longside of t +43527|90|91|1|32|31682.88|0.08|0.02|A|F|1993-09-27|1993-11-20|1993-10-06|COLLECT COD|MAIL|excuses nag regular packages-- boldl +43527|1598|99|2|50|74979.50|0.10|0.06|R|F|1993-12-10|1993-10-03|1993-12-16|TAKE BACK RETURN|REG AIR|pendencies. blithely silent +43527|372|29|3|23|29264.51|0.03|0.06|A|F|1993-08-23|1993-10-16|1993-08-31|COLLECT COD|RAIL|ular accounts. final pinto beans use. care +43552|1544|45|1|46|66494.84|0.05|0.08|R|F|1994-08-11|1994-05-26|1994-08-14|COLLECT COD|REG AIR| regular acco +43552|925|94|2|29|52951.68|0.10|0.04|A|F|1994-07-07|1994-07-01|1994-07-18|TAKE BACK RETURN|TRUCK|s boost af +43552|1401|41|3|40|52096.00|0.00|0.02|R|F|1994-05-07|1994-05-29|1994-05-23|DELIVER IN PERSON|TRUCK|ess pinto bean +43553|113|40|1|37|37485.07|0.02|0.01|A|F|1994-06-13|1994-07-19|1994-06-30|TAKE BACK RETURN|TRUCK| packages after +43553|1308|47|2|34|41116.20|0.05|0.01|A|F|1994-09-07|1994-06-17|1994-09-27|DELIVER IN PERSON|FOB|rash carefully according to th +43553|1103|40|3|48|48196.80|0.05|0.06|A|F|1994-06-22|1994-08-12|1994-06-23|COLLECT COD|RAIL|refully bold instructions across th +43553|249|4|4|27|31029.48|0.05|0.01|R|F|1994-07-04|1994-07-09|1994-07-28|TAKE BACK RETURN|FOB|uests haggle slyly. +43554|198|99|1|50|54909.50|0.02|0.08|R|F|1995-01-15|1994-12-10|1995-02-11|NONE|TRUCK|ding to the quickly regular deposits +43554|319|4|2|26|31702.06|0.05|0.07|R|F|1994-11-08|1994-12-28|1994-12-07|TAKE BACK RETURN|REG AIR| express accounts. furiousl +43554|1228|40|3|6|6775.32|0.08|0.03|A|F|1994-11-12|1994-12-11|1994-11-30|COLLECT COD|AIR|accounts boost. q +43555|901|36|1|26|46849.40|0.07|0.01|R|F|1992-09-18|1992-08-13|1992-10-13|COLLECT COD|AIR| cajole blithely quickly ironic pinto +43555|254|36|2|38|43861.50|0.03|0.01|A|F|1992-07-19|1992-09-06|1992-07-31|NONE|RAIL|ly unusual dependencies a +43555|644|45|3|31|47883.84|0.07|0.03|R|F|1992-10-28|1992-09-27|1992-11-03|DELIVER IN PERSON|FOB|p carefully about t +43556|496|26|1|36|50273.64|0.00|0.05|R|F|1992-11-18|1992-09-19|1992-11-29|DELIVER IN PERSON|SHIP|ag quickly about the quickly final realm +43557|316|1|1|19|23109.89|0.04|0.02|N|O|1998-03-19|1998-04-06|1998-03-29|COLLECT COD|REG AIR|ly regular, regular packages. regular ac +43557|903|38|2|14|25254.60|0.05|0.05|N|O|1998-05-22|1998-04-29|1998-06-04|COLLECT COD|TRUCK| sentiments wa +43557|785|18|3|9|15172.02|0.03|0.03|N|O|1998-05-16|1998-03-06|1998-06-08|NONE|TRUCK|s among the fu +43557|966|1|4|44|82146.24|0.01|0.01|N|O|1998-05-01|1998-04-13|1998-05-23|DELIVER IN PERSON|RAIL|ic requests acro +43558|525|26|1|36|51318.72|0.04|0.00|N|O|1996-09-27|1996-08-18|1996-10-21|DELIVER IN PERSON|TRUCK|even excuses a +43558|115|42|2|27|27407.97|0.05|0.02|N|O|1996-10-06|1996-08-04|1996-10-12|NONE|TRUCK|he furiously even deposits. final +43559|931|66|1|27|49462.11|0.07|0.02|N|O|1995-08-30|1995-09-12|1995-09-27|TAKE BACK RETURN|REG AIR|special dolphins detect about the furiou +43559|1290|2|2|3|3573.87|0.05|0.08|N|O|1995-08-13|1995-10-11|1995-08-14|DELIVER IN PERSON|SHIP|. furiously pending i +43559|1828|58|3|40|69192.80|0.05|0.03|N|O|1995-10-08|1995-10-03|1995-10-15|COLLECT COD|SHIP|the accounts cajole sl +43559|137|16|4|13|13482.69|0.00|0.02|N|O|1995-10-17|1995-10-23|1995-11-16|TAKE BACK RETURN|SHIP|ular multiplie +43584|657|51|1|34|52960.10|0.05|0.03|N|O|1996-06-10|1996-07-11|1996-07-02|DELIVER IN PERSON|FOB|totes kindle after the carefully regul +43584|1820|50|2|11|18940.02|0.06|0.03|N|O|1996-09-26|1996-07-11|1996-10-03|DELIVER IN PERSON|MAIL|furiously regular requests agai +43584|905|74|3|12|21670.80|0.05|0.02|N|O|1996-08-10|1996-07-17|1996-09-01|NONE|FOB|l accounts +43584|612|6|4|45|68067.45|0.00|0.00|N|O|1996-07-25|1996-08-05|1996-08-07|COLLECT COD|SHIP|es lose fluffily across the fur +43584|548|9|5|20|28970.80|0.03|0.05|N|O|1996-06-09|1996-08-31|1996-06-13|DELIVER IN PERSON|MAIL|old platelets. caref +43584|1993|94|6|46|87169.54|0.06|0.03|N|O|1996-06-27|1996-08-04|1996-07-19|COLLECT COD|AIR| regular packages haggle slyly even a +43584|1576|17|7|40|59102.80|0.05|0.04|N|O|1996-08-20|1996-08-12|1996-09-11|TAKE BACK RETURN|TRUCK|ickly special, r +43585|1741|84|1|10|16427.40|0.07|0.05|A|F|1993-12-17|1994-02-08|1993-12-26|DELIVER IN PERSON|SHIP|ously even requests. carefully even pinto +43585|1048|54|2|42|39859.68|0.05|0.07|A|F|1994-02-09|1993-12-11|1994-02-15|DELIVER IN PERSON|TRUCK|enly regular frets. +43586|990|59|1|32|60511.68|0.00|0.00|N|O|1997-02-09|1997-01-04|1997-02-20|COLLECT COD|MAIL| fluffily. slyly final instructions a +43586|528|59|2|37|52855.24|0.07|0.05|N|O|1996-10-29|1996-12-28|1996-11-18|DELIVER IN PERSON|RAIL|hely ironic instructions use fluf +43586|974|9|3|16|29999.52|0.05|0.03|N|O|1997-01-04|1996-12-16|1997-01-15|DELIVER IN PERSON|REG AIR|leep slowly. furiously unusual deposits +43586|1131|4|4|1|1032.13|0.02|0.07|N|O|1996-11-10|1997-01-13|1996-11-24|TAKE BACK RETURN|FOB|sits around the furiously final courts nag +43586|603|35|5|11|16539.60|0.08|0.08|N|O|1996-10-29|1997-01-12|1996-10-31|COLLECT COD|AIR|s wake ideas? regular a +43587|304|89|1|37|44559.10|0.00|0.04|N|O|1997-02-06|1997-03-04|1997-02-28|COLLECT COD|AIR|y pending pa +43587|635|29|2|29|44533.27|0.03|0.02|N|O|1997-04-18|1997-04-18|1997-05-18|COLLECT COD|AIR|eans about the slyly regula +43588|1959|60|1|48|89325.60|0.05|0.07|A|F|1992-11-24|1992-11-22|1992-12-19|TAKE BACK RETURN|MAIL|lithely thin re +43588|1901|2|2|26|46875.40|0.10|0.07|R|F|1992-12-15|1992-10-21|1992-12-16|DELIVER IN PERSON|FOB|s. slyly bol +43588|671|34|3|21|33005.07|0.05|0.04|R|F|1992-11-01|1992-11-07|1992-11-25|NONE|RAIL|e carefully blithely +43588|1352|53|4|18|22560.30|0.05|0.07|A|F|1992-11-20|1992-11-19|1992-12-16|NONE|TRUCK| regular idea +43588|1058|64|5|25|23976.25|0.02|0.00|A|F|1992-09-30|1992-10-06|1992-10-17|NONE|FOB| will have to wake quickly. care +43588|1679|21|6|6|9484.02|0.05|0.01|R|F|1992-10-15|1992-10-27|1992-10-26|NONE|REG AIR|refully ironic gif +43588|883|83|7|13|23190.44|0.00|0.05|A|F|1992-09-04|1992-11-18|1992-09-23|TAKE BACK RETURN|TRUCK|pending hockey playe +43589|1845|46|1|13|22708.92|0.06|0.06|A|F|1993-08-21|1993-07-17|1993-09-05|NONE|FOB|c asymptotes. requests engage instr +43589|1968|57|2|14|26179.44|0.06|0.00|A|F|1993-09-11|1993-07-08|1993-09-15|NONE|REG AIR|against the instructions. si +43589|620|52|3|12|18247.44|0.09|0.05|R|F|1993-06-07|1993-06-29|1993-06-23|COLLECT COD|AIR|. ironic, ironic foxes inte +43590|1272|84|1|48|56316.96|0.09|0.02|R|F|1994-10-09|1994-11-13|1994-10-15|NONE|REG AIR|carefully platele +43590|1476|55|2|19|26171.93|0.10|0.03|R|F|1994-09-12|1994-12-04|1994-10-04|DELIVER IN PERSON|SHIP|. slyly ironic excuses u +43590|1678|61|3|21|33173.07|0.09|0.03|R|F|1994-12-11|1994-12-05|1994-12-16|TAKE BACK RETURN|FOB|s cajole fluffily. regular, regular package +43590|357|86|4|39|49036.65|0.01|0.07|R|F|1994-10-05|1994-11-28|1994-10-14|TAKE BACK RETURN|SHIP|e special instru +43590|296|51|5|8|9570.32|0.03|0.00|R|F|1994-09-16|1994-10-30|1994-09-19|COLLECT COD|MAIL|nal, pending deposits +43590|1520|1|6|31|44067.12|0.00|0.04|A|F|1994-09-22|1994-11-14|1994-10-21|DELIVER IN PERSON|SHIP|bravely regular ideas. quic +43590|1354|93|7|50|62767.50|0.06|0.03|A|F|1994-09-30|1994-11-17|1994-10-29|TAKE BACK RETURN|MAIL|kly according to the furiously iro +43591|934|3|1|47|86241.71|0.10|0.05|N|O|1996-05-14|1996-04-25|1996-06-11|NONE|TRUCK|c instructions haggle acco +43591|836|36|2|43|74683.69|0.02|0.01|N|O|1996-03-12|1996-05-01|1996-03-29|DELIVER IN PERSON|RAIL|of the fluffi +43591|690|53|3|44|69990.36|0.02|0.01|N|O|1996-04-03|1996-05-09|1996-04-21|NONE|MAIL|uickly bold excuses. +43591|662|25|4|38|59381.08|0.05|0.01|N|O|1996-06-17|1996-05-09|1996-06-26|DELIVER IN PERSON|TRUCK|ckages. regular requests are furiously +43616|735|32|1|5|8178.65|0.04|0.01|N|O|1997-01-22|1997-02-07|1997-01-30|NONE|TRUCK|ccounts beside the +43616|1104|41|2|9|9045.90|0.00|0.08|N|O|1996-12-25|1997-02-28|1997-01-09|DELIVER IN PERSON|FOB|nal accounts breach carefully across th +43616|1139|48|3|18|18722.34|0.08|0.04|N|O|1997-03-26|1997-02-02|1997-04-22|TAKE BACK RETURN|FOB|daringly. carefully final courts +43616|1536|57|4|29|41688.37|0.09|0.08|N|O|1997-01-19|1997-02-11|1997-01-27|COLLECT COD|REG AIR|. blithely express cou +43616|734|99|5|36|58850.28|0.05|0.05|N|O|1996-12-23|1997-02-16|1997-01-01|COLLECT COD|SHIP| the slyly unusual packages a +43616|543|44|6|12|17322.48|0.01|0.05|N|O|1997-01-09|1997-02-24|1997-01-14|NONE|FOB|nic packages. regular packages slee +43616|251|52|7|39|44898.75|0.02|0.00|N|O|1997-02-14|1997-01-03|1997-03-07|DELIVER IN PERSON|TRUCK|accounts are blithely silent account +43617|1218|30|1|8|8953.68|0.04|0.07|N|O|1996-05-05|1996-06-17|1996-05-26|DELIVER IN PERSON|MAIL|xpress ideas. carefully regu +43617|1619|20|2|25|38015.25|0.00|0.04|N|O|1996-06-16|1996-06-24|1996-07-15|COLLECT COD|TRUCK|encies sleep. final requests cajole th +43617|437|38|3|3|4012.29|0.08|0.00|N|O|1996-06-08|1996-07-24|1996-06-27|DELIVER IN PERSON|REG AIR|theodolites along the furiously regul +43617|1515|16|4|33|46744.83|0.10|0.02|N|O|1996-08-19|1996-06-21|1996-09-15|DELIVER IN PERSON|RAIL| wake ruthlessly above +43617|491|50|5|44|61225.56|0.02|0.06|N|O|1996-05-09|1996-06-09|1996-05-19|TAKE BACK RETURN|FOB|l asymptotes haggl +43617|903|72|6|3|5411.70|0.09|0.06|N|O|1996-07-28|1996-06-23|1996-08-16|TAKE BACK RETURN|TRUCK|boost amon +43617|878|45|7|36|64039.32|0.01|0.01|N|O|1996-08-02|1996-06-21|1996-08-06|TAKE BACK RETURN|RAIL| blithely. thin, express courts +43618|805|39|1|16|27292.80|0.07|0.01|N|O|1996-09-16|1996-10-25|1996-10-16|DELIVER IN PERSON|REG AIR|around the finally regular pearls. even fo +43618|996|31|2|18|34145.82|0.03|0.00|N|O|1996-09-23|1996-11-19|1996-10-01|DELIVER IN PERSON|REG AIR|jole furiously according to the +43618|402|90|3|44|57305.60|0.10|0.05|N|O|1996-12-02|1996-10-22|1996-12-08|COLLECT COD|MAIL|t across the quickly even acc +43618|736|33|4|40|65469.20|0.08|0.08|N|O|1996-09-08|1996-11-20|1996-10-03|TAKE BACK RETURN|RAIL|ns. express accounts boost +43618|1950|39|5|45|83337.75|0.02|0.02|N|O|1996-11-28|1996-10-15|1996-12-13|NONE|MAIL|ptotes detect carefully even depen +43618|1211|49|6|39|43376.19|0.05|0.04|N|O|1996-10-22|1996-11-18|1996-11-09|TAKE BACK RETURN|REG AIR|e deposits. blithel +43619|820|20|1|37|63670.34|0.04|0.05|N|O|1997-06-26|1997-06-18|1997-07-11|NONE|REG AIR| wake furious +43619|669|32|2|46|72204.36|0.08|0.06|N|O|1997-08-23|1997-07-04|1997-09-19|TAKE BACK RETURN|AIR|instructions. furiously express packages sl +43619|428|29|3|11|14612.62|0.04|0.08|N|O|1997-06-23|1997-06-13|1997-07-23|COLLECT COD|SHIP| furiously bold dependenc +43619|1662|86|4|10|15636.60|0.10|0.00|N|O|1997-08-19|1997-07-12|1997-08-27|COLLECT COD|FOB|inal requests. regular +43619|531|62|5|5|7157.65|0.08|0.05|N|O|1997-05-13|1997-07-07|1997-06-10|TAKE BACK RETURN|RAIL|ructions can cajole according to the +43620|306|63|1|11|13269.30|0.01|0.00|A|F|1994-04-30|1994-04-16|1994-05-26|NONE|SHIP| accounts against the qu +43620|518|9|2|38|53903.38|0.03|0.03|A|F|1994-04-22|1994-03-24|1994-04-28|DELIVER IN PERSON|REG AIR|uriously! silent requests about the car +43620|326|11|3|5|6131.60|0.04|0.07|R|F|1994-05-17|1994-03-22|1994-06-15|COLLECT COD|REG AIR|carefully even es +43620|504|95|4|35|49157.50|0.04|0.06|A|F|1994-02-28|1994-03-14|1994-03-13|TAKE BACK RETURN|SHIP|ording to the slyly +43621|1984|85|1|44|82983.12|0.05|0.06|R|F|1995-04-18|1995-05-07|1995-05-05|COLLECT COD|SHIP|unts use af +43622|250|51|1|6|6901.50|0.10|0.08|N|O|1997-09-10|1997-10-26|1997-09-28|TAKE BACK RETURN|AIR|ise furiously slyly fi +43622|640|3|2|41|63166.24|0.10|0.05|N|O|1997-08-07|1997-10-01|1997-08-11|DELIVER IN PERSON|SHIP|fily final deposits cajole abo +43622|406|65|3|3|3919.20|0.09|0.01|N|O|1997-11-15|1997-10-13|1997-12-02|NONE|MAIL|l platelets are a +43622|508|39|4|49|69016.50|0.01|0.07|N|O|1997-10-31|1997-10-10|1997-11-02|NONE|SHIP|g regular pinto beans. slyly spe +43622|343|44|5|18|22380.12|0.09|0.06|N|O|1997-11-15|1997-09-04|1997-12-11|NONE|TRUCK|ress requests-- bold dep +43623|1256|68|1|45|52076.25|0.05|0.06|N|O|1998-06-18|1998-06-30|1998-06-21|NONE|MAIL|pending excus +43623|408|67|2|30|39252.00|0.02|0.04|N|O|1998-08-21|1998-06-23|1998-08-25|DELIVER IN PERSON|TRUCK|s cajole fluffily pending foxes. dugouts +43623|1146|55|3|5|5235.70|0.05|0.02|N|O|1998-07-19|1998-07-25|1998-07-20|NONE|SHIP| final, special depths can wake. special +43648|498|28|1|16|22375.84|0.06|0.06|N|O|1995-07-15|1995-05-12|1995-07-29|NONE|REG AIR|cajole slyly even accoun +43649|1131|40|1|7|7224.91|0.10|0.04|R|F|1993-10-15|1993-12-13|1993-10-16|NONE|AIR|e furiously. even, pen +43650|757|90|1|31|51390.25|0.05|0.02|R|F|1994-05-13|1994-06-03|1994-06-08|TAKE BACK RETURN|FOB|uickly stealthy requests boost alongside +43650|1893|23|2|26|46667.14|0.09|0.02|R|F|1994-05-19|1994-06-15|1994-05-24|TAKE BACK RETURN|RAIL|lithely express accounts wake among +43650|2|53|3|46|41492.00|0.06|0.00|R|F|1994-06-19|1994-05-09|1994-07-05|COLLECT COD|SHIP|regular instructions. fluffily ironic +43650|412|13|4|10|13124.10|0.10|0.07|R|F|1994-05-17|1994-04-29|1994-05-21|COLLECT COD|AIR| the ironic theodolites engage about th +43650|441|42|5|27|36218.88|0.04|0.01|A|F|1994-05-19|1994-05-07|1994-06-07|NONE|AIR| deposits according to the qu +43650|1034|70|6|39|36466.17|0.04|0.06|R|F|1994-07-20|1994-05-14|1994-08-04|DELIVER IN PERSON|REG AIR| carefully about the bold, final pinto +43650|1221|59|7|10|11222.20|0.01|0.01|A|F|1994-05-16|1994-06-02|1994-06-04|NONE|MAIL|t blithely. blithely bold accounts hag +43651|1206|81|1|10|11072.00|0.02|0.03|N|O|1998-01-22|1998-01-31|1998-02-06|DELIVER IN PERSON|TRUCK|out the regu +43651|1999|44|2|38|72237.62|0.08|0.05|N|O|1998-02-23|1997-12-18|1998-03-09|NONE|TRUCK|the furiously special ins +43651|1657|58|3|38|59228.70|0.02|0.03|N|O|1997-12-10|1997-12-18|1997-12-14|TAKE BACK RETURN|MAIL| requests cajole furious +43651|249|31|4|39|44820.36|0.03|0.01|N|O|1997-11-14|1998-01-22|1997-11-15|TAKE BACK RETURN|RAIL|unusual requests use furiously unusua +43652|760|57|1|4|6643.04|0.02|0.03|N|O|1998-01-05|1998-02-04|1998-01-25|DELIVER IN PERSON|SHIP|y regular requests nod. +43653|1805|6|1|15|25602.00|0.03|0.07|R|F|1992-11-07|1993-01-20|1992-11-30|DELIVER IN PERSON|FOB|odolites boost blithely along t +43653|299|27|2|16|19188.64|0.07|0.02|R|F|1992-12-24|1993-01-07|1992-12-25|DELIVER IN PERSON|SHIP|riously alongside of the +43653|531|92|3|5|7157.65|0.02|0.04|R|F|1992-12-16|1993-01-07|1992-12-22|COLLECT COD|MAIL|ages cajole fluff +43653|1932|65|4|23|42180.39|0.08|0.06|A|F|1992-12-17|1993-01-11|1993-01-04|TAKE BACK RETURN|MAIL|riously even accounts us +43653|1353|30|5|2|2508.70|0.09|0.07|R|F|1992-12-14|1992-12-25|1993-01-09|DELIVER IN PERSON|TRUCK| above the furiously ironic +43653|13|64|6|3|2739.03|0.05|0.05|A|F|1992-12-09|1992-12-03|1992-12-18|DELIVER IN PERSON|REG AIR|al accounts nag aga +43653|1099|5|7|8|8000.72|0.09|0.05|R|F|1992-12-02|1992-12-28|1992-12-21|DELIVER IN PERSON|TRUCK|s. furiously ironic deposits sleep slyly t +43654|170|23|1|4|4280.68|0.03|0.05|R|F|1994-09-01|1994-08-21|1994-09-18|COLLECT COD|REG AIR|boost ironic +43654|1697|80|2|21|33572.49|0.02|0.07|A|F|1994-07-03|1994-09-06|1994-07-23|NONE|AIR|ully even foxes was accordin +43654|1448|27|3|30|40483.20|0.06|0.01|R|F|1994-10-02|1994-08-22|1994-10-14|NONE|SHIP| packages around the +43654|1945|34|4|19|35091.86|0.01|0.01|A|F|1994-08-21|1994-07-19|1994-08-28|DELIVER IN PERSON|MAIL|sts ought to ca +43654|1255|30|5|31|35843.75|0.05|0.00|A|F|1994-09-26|1994-07-18|1994-10-09|COLLECT COD|MAIL|. quickly even Tire +43654|248|49|6|36|41336.64|0.06|0.03|A|F|1994-08-27|1994-07-15|1994-09-20|NONE|REG AIR|nal depths. slyly ironic accounts boost +43654|1706|7|7|31|49838.70|0.02|0.00|A|F|1994-08-08|1994-07-23|1994-08-22|COLLECT COD|FOB|in furiously alongside of +43655|556|87|1|2|2913.10|0.02|0.05|N|O|1997-07-29|1997-09-14|1997-08-28|TAKE BACK RETURN|REG AIR|ently against the slyly regular dependen +43655|595|86|2|12|17947.08|0.02|0.04|N|O|1997-09-11|1997-08-26|1997-09-23|TAKE BACK RETURN|REG AIR|fily final pint +43655|1880|24|3|36|64147.68|0.03|0.03|N|O|1997-09-21|1997-08-16|1997-10-19|COLLECT COD|TRUCK|structions nag. ideas +43655|874|74|4|36|63895.32|0.01|0.06|N|O|1997-10-14|1997-09-28|1997-10-22|NONE|FOB|carefully final decoys abo +43655|142|43|5|49|51064.86|0.02|0.01|N|O|1997-08-27|1997-08-31|1997-09-10|TAKE BACK RETURN|AIR| quickly pending deposits wa +43655|1490|8|6|5|6957.45|0.04|0.00|N|O|1997-10-03|1997-09-15|1997-10-31|DELIVER IN PERSON|MAIL|ily even depo +43655|785|50|7|13|21915.14|0.01|0.07|N|O|1997-08-21|1997-09-20|1997-09-20|DELIVER IN PERSON|SHIP|ar foxes eat blithe +43680|920|89|1|46|83762.32|0.05|0.05|A|F|1993-06-23|1993-05-28|1993-07-13|DELIVER IN PERSON|RAIL|alongside of the theodolites. +43680|1525|66|2|14|19971.28|0.02|0.00|A|F|1993-06-10|1993-04-29|1993-06-28|TAKE BACK RETURN|RAIL|tes cajole against the ca +43680|838|38|3|37|64336.71|0.09|0.07|R|F|1993-05-21|1993-05-20|1993-06-03|COLLECT COD|REG AIR|s. carefully even warhorses will have to +43680|979|14|4|41|77078.77|0.09|0.07|A|F|1993-05-17|1993-05-16|1993-05-31|NONE|RAIL|posits. even idea +43681|861|62|1|30|52855.80|0.10|0.07|N|O|1995-06-27|1995-06-11|1995-07-17|NONE|TRUCK|ress attainments wak +43682|145|46|1|50|52257.00|0.03|0.03|A|F|1992-11-08|1992-10-28|1992-12-08|DELIVER IN PERSON|TRUCK|uickly regular pl +43682|1711|12|2|41|66121.11|0.00|0.00|R|F|1992-10-23|1992-11-26|1992-11-15|DELIVER IN PERSON|FOB|elets are after the furiously final p +43682|597|88|3|18|26956.62|0.08|0.06|R|F|1992-12-01|1992-10-27|1992-12-07|TAKE BACK RETURN|MAIL|iously even packages along the expres +43682|926|27|4|34|62115.28|0.05|0.08|R|F|1992-10-11|1992-10-21|1992-11-05|DELIVER IN PERSON|SHIP|ickly special pinto be +43683|229|57|1|9|10162.98|0.04|0.03|N|O|1997-11-13|1997-10-13|1997-12-09|DELIVER IN PERSON|MAIL|ve the asymptotes. final, final a +43683|1836|37|2|40|69513.20|0.00|0.04|N|O|1997-12-19|1997-12-11|1998-01-14|NONE|MAIL|sits. slyly regular grouches wake. slowl +43684|1586|67|1|28|41652.24|0.09|0.08|N|O|1997-02-07|1997-02-22|1997-03-01|DELIVER IN PERSON|MAIL|ven package +43684|104|83|2|17|17069.70|0.10|0.07|N|O|1997-04-13|1997-02-16|1997-04-24|COLLECT COD|AIR|yly according to the bold pinto beans. e +43684|1848|35|3|2|3499.68|0.05|0.04|N|O|1997-03-22|1997-02-16|1997-03-30|DELIVER IN PERSON|RAIL|dependencies near the pe +43684|1319|34|4|32|39049.92|0.07|0.05|N|O|1997-02-24|1997-02-24|1997-02-28|COLLECT COD|MAIL|furiously stealthy theodolites +43685|1012|48|1|8|7304.08|0.05|0.07|N|O|1997-11-06|1997-11-08|1997-11-10|COLLECT COD|MAIL|ns will hav +43685|1144|81|2|43|44941.02|0.10|0.02|N|O|1997-09-14|1997-09-19|1997-10-12|TAKE BACK RETURN|RAIL| the slyly blithe +43685|41|17|3|4|3764.16|0.10|0.06|N|O|1997-08-27|1997-10-22|1997-09-13|COLLECT COD|SHIP|ully above the even, eve +43685|705|2|4|8|12845.60|0.07|0.00|N|O|1997-10-16|1997-09-28|1997-11-04|NONE|RAIL|h quickly blithely bold excuses. +43685|1952|97|5|50|92697.50|0.10|0.04|N|O|1997-11-30|1997-11-06|1997-12-24|DELIVER IN PERSON|AIR| dependencies. regula +43685|1358|97|6|6|7556.10|0.05|0.00|N|O|1997-12-14|1997-10-09|1998-01-01|TAKE BACK RETURN|SHIP| fluffy gifts. carefully special depos +43686|394|95|1|25|32359.75|0.01|0.03|N|O|1995-06-28|1995-07-30|1995-07-11|TAKE BACK RETURN|REG AIR|lyly regular platele +43686|1515|16|2|24|33996.24|0.01|0.08|N|O|1995-08-04|1995-06-13|1995-08-18|NONE|SHIP|thely ironic instructions +43686|101|28|3|42|42046.20|0.05|0.08|N|O|1995-07-03|1995-06-27|1995-07-27|NONE|REG AIR|lithely special packages. ironic, regu +43686|841|75|4|22|38320.48|0.03|0.02|N|O|1995-07-26|1995-06-16|1995-08-24|DELIVER IN PERSON|MAIL|ake blithely. attai +43687|894|61|1|6|10769.34|0.10|0.00|N|O|1997-07-01|1997-05-29|1997-07-25|DELIVER IN PERSON|FOB| blithely reg +43687|1875|76|2|48|85289.76|0.00|0.00|N|O|1997-05-31|1997-06-01|1997-06-11|NONE|FOB| even requests cajole blithely furi +43687|812|79|3|42|71938.02|0.05|0.07|N|O|1997-05-12|1997-04-28|1997-05-18|DELIVER IN PERSON|SHIP|st the furiously even accounts. careful +43687|240|95|4|44|50170.56|0.08|0.01|N|O|1997-05-13|1997-05-21|1997-05-17|DELIVER IN PERSON|REG AIR|y according to the +43687|786|51|5|21|35422.38|0.10|0.06|N|O|1997-05-03|1997-05-19|1997-05-25|TAKE BACK RETURN|MAIL|ross the waters +43712|1583|24|1|28|41568.24|0.09|0.07|R|F|1995-05-21|1995-04-27|1995-05-31|DELIVER IN PERSON|RAIL|to beans. carefully regula +43713|1509|50|1|33|46546.50|0.02|0.00|A|F|1992-09-13|1992-10-13|1992-10-07|NONE|SHIP| slyly silent +43713|1297|72|2|14|16776.06|0.00|0.00|A|F|1992-12-10|1992-10-20|1993-01-03|NONE|RAIL|en deposits nag along the final, even p +43713|383|12|3|7|8983.66|0.01|0.00|A|F|1993-01-04|1992-10-18|1993-01-31|DELIVER IN PERSON|AIR|ar courts boost blithely. ca +43713|1791|34|4|38|64326.02|0.08|0.04|A|F|1992-09-09|1992-12-03|1992-10-09|DELIVER IN PERSON|RAIL|s. furiously express platelet +43714|660|92|1|50|78033.00|0.10|0.08|N|O|1996-09-11|1996-10-01|1996-10-08|DELIVER IN PERSON|MAIL|furiously regular d +43714|1819|6|2|33|56786.73|0.02|0.02|N|O|1996-11-07|1996-09-20|1996-11-18|DELIVER IN PERSON|MAIL|d accounts haggle slyly. qui +43714|791|88|3|23|38911.17|0.07|0.03|N|O|1996-11-14|1996-10-27|1996-12-03|DELIVER IN PERSON|TRUCK|deposits use above the blithely bold +43714|1165|66|4|22|23455.52|0.07|0.05|N|O|1996-11-18|1996-10-02|1996-12-03|COLLECT COD|REG AIR|ons. ironic theodolites s +43714|980|81|5|16|30095.68|0.03|0.00|N|O|1996-11-03|1996-10-08|1996-11-10|NONE|RAIL|grouches. thin accounts sleep qui +43714|115|42|6|11|11166.21|0.00|0.04|N|O|1996-11-03|1996-09-12|1996-11-06|COLLECT COD|TRUCK|ly even accounts sleep c +43714|645|77|7|17|26275.88|0.00|0.04|N|O|1996-08-06|1996-09-16|1996-08-28|NONE|FOB|y regular theod +43715|1313|28|1|42|51001.02|0.09|0.01|N|O|1996-07-10|1996-08-13|1996-07-25|TAKE BACK RETURN|FOB|osits integrate blithely b +43716|435|65|1|48|64100.64|0.00|0.01|N|O|1995-08-02|1995-07-13|1995-08-26|DELIVER IN PERSON|MAIL|ular ideas. evenl +43716|1805|49|2|29|49497.20|0.01|0.08|N|O|1995-08-18|1995-07-02|1995-09-09|DELIVER IN PERSON|SHIP|fluffily quickly s +43716|854|88|3|11|19303.35|0.01|0.04|N|O|1995-07-16|1995-06-30|1995-08-04|NONE|FOB| dependencies. furiously cl +43717|135|62|1|3|3105.39|0.06|0.04|N|O|1997-01-24|1997-02-26|1997-01-31|NONE|FOB|posits. fluffily regular foxes +43717|1415|94|2|3|3949.23|0.10|0.03|N|O|1996-12-27|1997-01-17|1997-01-17|DELIVER IN PERSON|REG AIR|nts sleep blithely careful +43717|295|96|3|1|1195.29|0.03|0.06|N|O|1997-04-15|1997-03-05|1997-04-22|COLLECT COD|AIR|uriously blithe requests +43717|967|2|4|49|91530.04|0.02|0.06|N|O|1996-12-28|1997-02-07|1997-01-16|COLLECT COD|RAIL|es cajole along +43717|1094|100|5|3|2985.27|0.06|0.02|N|O|1997-01-31|1997-03-05|1997-03-01|TAKE BACK RETURN|RAIL|final packages. ironic asymptotes detect +43717|1673|97|6|39|61412.13|0.07|0.07|N|O|1997-02-07|1997-01-15|1997-02-24|NONE|TRUCK| slyly special +43717|528|29|7|33|47141.16|0.09|0.05|N|O|1997-02-23|1997-01-25|1997-03-10|COLLECT COD|AIR|s wake slyly. care +43718|33|59|1|36|33589.08|0.07|0.04|N|O|1997-02-18|1997-04-04|1997-02-20|TAKE BACK RETURN|REG AIR|the regular packages +43718|276|77|2|46|54108.42|0.07|0.02|N|O|1997-03-27|1997-04-18|1997-04-23|NONE|FOB|y regular foxes. blithely ruthless packages +43719|765|66|1|7|11660.32|0.09|0.03|N|O|1997-10-11|1997-10-20|1997-10-31|NONE|TRUCK|ang along the stealt +43719|1042|43|2|1|943.04|0.01|0.00|N|O|1997-11-23|1997-10-22|1997-12-17|TAKE BACK RETURN|MAIL|equests nag fluff +43719|1609|51|3|23|34743.80|0.00|0.06|N|O|1997-10-12|1997-10-04|1997-10-31|COLLECT COD|SHIP|the blithely bold accounts ca +43719|373|30|4|26|33107.62|0.10|0.02|N|O|1997-11-12|1997-10-15|1997-11-27|DELIVER IN PERSON|MAIL|nt blithely against the furious +43719|669|63|5|42|65925.72|0.02|0.05|N|O|1997-09-28|1997-10-07|1997-10-06|TAKE BACK RETURN|MAIL|ep. requests +43744|1829|30|1|19|32885.58|0.10|0.01|R|F|1992-02-25|1992-05-03|1992-03-15|DELIVER IN PERSON|MAIL|r foxes. accounts above the fluf +43745|614|8|1|42|63613.62|0.09|0.00|A|F|1993-12-09|1994-01-07|1993-12-25|DELIVER IN PERSON|REG AIR|olites cajole careful +43745|715|16|2|5|8078.55|0.00|0.07|R|F|1993-12-24|1994-01-11|1993-12-29|DELIVER IN PERSON|RAIL|uffily silent +43745|492|80|3|32|44559.68|0.06|0.08|R|F|1993-11-06|1994-01-15|1993-11-28|COLLECT COD|RAIL|osits. carefully ironic foxes +43745|1131|32|4|21|21674.73|0.05|0.08|A|F|1994-01-29|1994-01-06|1994-02-11|COLLECT COD|AIR|mong the sly accounts. care +43745|1565|66|5|40|58662.40|0.04|0.02|A|F|1994-02-04|1994-01-22|1994-02-20|NONE|FOB|foxes. fluffily express deposits haggle car +43745|335|20|6|20|24706.60|0.03|0.06|A|F|1993-12-30|1994-01-19|1994-01-18|DELIVER IN PERSON|REG AIR|nal pinto beans use carefull +43745|1217|92|7|11|12300.31|0.03|0.05|A|F|1993-12-19|1993-12-10|1993-12-26|NONE|MAIL|requests. bold deposits af +43746|725|90|1|14|22760.08|0.05|0.03|N|O|1997-09-08|1997-10-02|1997-09-12|DELIVER IN PERSON|REG AIR|uses unwind ruthlessly even ideas. +43746|1944|33|2|34|62761.96|0.08|0.07|N|O|1997-10-10|1997-08-23|1997-10-29|NONE|AIR|the slyly ironic reque +43746|1098|69|3|31|30971.79|0.08|0.01|N|O|1997-09-08|1997-10-17|1997-10-01|TAKE BACK RETURN|MAIL|egular accounts nag slyl +43747|157|84|1|48|50743.20|0.01|0.08|N|O|1997-08-16|1997-11-04|1997-09-09|DELIVER IN PERSON|MAIL| express requests after the blithe +43747|1027|98|2|15|13920.30|0.00|0.05|N|O|1997-08-14|1997-11-03|1997-08-28|TAKE BACK RETURN|TRUCK| are carefully regular +43748|1358|73|1|7|8815.45|0.01|0.00|A|F|1992-07-07|1992-05-31|1992-07-29|COLLECT COD|SHIP|. even requests cajole carefully acr +43749|1697|98|1|10|15986.90|0.09|0.04|A|F|1992-12-06|1992-10-12|1992-12-29|NONE|FOB|arefully along the slyly regul +43749|743|76|2|32|52599.68|0.04|0.04|A|F|1992-09-19|1992-09-27|1992-09-26|NONE|TRUCK|ggle thinly slyly fin +43750|437|67|1|21|28086.03|0.06|0.06|N|O|1997-02-10|1997-01-09|1997-02-21|TAKE BACK RETURN|SHIP|sly regular requests. final ide +43751|837|4|1|1|1737.83|0.03|0.00|R|F|1992-09-19|1992-09-01|1992-10-18|DELIVER IN PERSON|TRUCK|. daringly silent dolphins are above the +43751|1079|85|2|50|49003.50|0.06|0.03|R|F|1992-10-20|1992-08-19|1992-10-30|COLLECT COD|MAIL|eposits wake blithely. fluffily final +43751|1170|43|3|8|8569.36|0.09|0.01|R|F|1992-10-03|1992-09-14|1992-10-21|NONE|AIR|totes. slyly even ideas na +43776|1832|76|1|26|45079.58|0.05|0.02|A|F|1992-12-30|1993-01-03|1993-01-18|NONE|FOB|s boost slyl +43776|857|24|2|20|35157.00|0.10|0.05|A|F|1992-12-11|1993-02-13|1993-01-03|COLLECT COD|SHIP|r asymptotes cajole? quickly +43776|1891|35|3|8|14343.12|0.01|0.03|A|F|1993-03-31|1993-02-22|1993-04-02|COLLECT COD|FOB|unts haggle agains +43777|950|53|1|37|68485.15|0.07|0.06|N|O|1998-05-02|1998-06-08|1998-05-18|DELIVER IN PERSON|SHIP|ncies nag carefully quickly expres +43777|796|29|2|22|37329.38|0.10|0.02|N|O|1998-06-06|1998-07-03|1998-06-27|DELIVER IN PERSON|MAIL|its. pinto +43777|1518|19|3|22|31229.22|0.00|0.05|N|O|1998-08-22|1998-07-14|1998-09-12|TAKE BACK RETURN|TRUCK|lar asymptotes cajole fluffily +43777|208|90|4|25|27705.00|0.10|0.08|N|O|1998-06-26|1998-05-30|1998-07-13|DELIVER IN PERSON|REG AIR|osits. furiously ironic instructions a +43777|233|61|5|9|10199.07|0.10|0.08|N|O|1998-07-26|1998-06-18|1998-08-24|NONE|FOB|press accoun +43778|292|74|1|48|57229.92|0.01|0.05|N|O|1997-04-27|1997-05-29|1997-04-28|COLLECT COD|RAIL|nt accounts. +43778|46|97|2|19|17974.76|0.00|0.00|N|O|1997-05-28|1997-06-18|1997-06-26|TAKE BACK RETURN|REG AIR|regular foxes cajole? regular, +43778|1864|8|3|10|17658.60|0.09|0.02|N|O|1997-07-09|1997-07-10|1997-08-07|DELIVER IN PERSON|SHIP|c pinto beans after the final +43778|967|68|4|5|9339.80|0.09|0.03|N|O|1997-07-16|1997-06-04|1997-07-24|NONE|AIR|jole blithely regular waters. quick +43778|886|86|5|13|23229.44|0.02|0.08|N|O|1997-06-26|1997-05-25|1997-07-23|NONE|AIR|egular instru +43778|685|79|6|25|39642.00|0.09|0.07|N|O|1997-07-13|1997-07-02|1997-08-12|NONE|FOB|its. blithely special excuses was fluffily +43778|1938|83|7|26|47838.18|0.06|0.06|N|O|1997-06-02|1997-05-27|1997-06-21|NONE|AIR|. carefully expre +43779|1658|100|1|23|35871.95|0.01|0.01|A|F|1994-09-27|1994-10-29|1994-10-24|NONE|REG AIR| ruthless accounts. carefully unu +43779|784|17|2|6|10108.68|0.08|0.00|R|F|1994-11-19|1994-11-15|1994-12-15|NONE|RAIL|al epitaphs. blithely fina +43779|801|1|3|27|45948.60|0.05|0.04|R|F|1994-08-28|1994-09-22|1994-09-13|DELIVER IN PERSON|MAIL|uriously. slyly +43780|516|17|1|38|53827.38|0.10|0.08|N|O|1997-03-10|1997-02-01|1997-03-24|COLLECT COD|TRUCK|ng to the ironic pinto bean +43780|788|21|2|36|60796.08|0.04|0.01|N|O|1997-02-26|1997-01-17|1997-03-22|TAKE BACK RETURN|RAIL|nt requests. quickly reg +43781|1133|6|1|16|16546.08|0.05|0.06|A|F|1993-05-02|1993-03-08|1993-05-23|COLLECT COD|RAIL|ts? ruthlessly quick pinto beans are carefu +43781|1955|100|2|43|79848.85|0.08|0.05|A|F|1993-05-30|1993-04-30|1993-06-04|COLLECT COD|REG AIR|es. hockey players sleep thro +43781|952|21|3|49|90794.55|0.00|0.03|R|F|1993-05-30|1993-04-15|1993-06-20|NONE|AIR|asymptotes +43781|1496|75|4|21|29347.29|0.07|0.05|A|F|1993-04-07|1993-05-03|1993-04-11|COLLECT COD|SHIP|uests against the furiously expr +43782|1191|100|1|10|10921.90|0.03|0.08|A|F|1994-01-17|1993-12-21|1994-02-08|TAKE BACK RETURN|REG AIR|thely alongside of the slow, special pac +43782|273|74|2|46|53970.42|0.05|0.01|A|F|1994-01-24|1993-12-31|1994-02-03|COLLECT COD|AIR|uffily express deposits are along the slow +43782|236|91|3|2|2272.46|0.03|0.06|A|F|1993-12-26|1993-12-31|1994-01-14|COLLECT COD|AIR|ress ideas-- quickly express foxes doze alo +43782|92|93|4|10|9920.90|0.05|0.04|R|F|1994-03-05|1994-01-27|1994-03-12|TAKE BACK RETURN|RAIL|into beans poach above the +43782|33|34|5|22|20526.66|0.00|0.08|A|F|1994-02-17|1994-01-01|1994-03-02|NONE|SHIP|ts. furiously pending deposits wake fluffil +43783|1299|37|1|8|9602.32|0.05|0.07|N|O|1997-02-02|1997-04-16|1997-02-06|NONE|SHIP|oxes are carefully after the en +43783|1205|80|2|49|54203.80|0.00|0.04|N|O|1997-05-08|1997-04-12|1997-06-04|TAKE BACK RETURN|RAIL|. pinto beans use blit +43783|825|25|3|31|53500.42|0.00|0.04|N|O|1997-04-03|1997-04-18|1997-04-24|TAKE BACK RETURN|SHIP|requests above the furiousl +43783|1433|34|4|34|45370.62|0.05|0.05|N|O|1997-03-30|1997-04-09|1997-04-29|NONE|FOB|ts haggle slyly across +43783|1866|10|5|22|38892.92|0.00|0.00|N|O|1997-04-21|1997-03-07|1997-04-22|DELIVER IN PERSON|AIR|ronic packages a +43783|1733|34|6|35|57215.55|0.09|0.03|N|O|1997-05-10|1997-03-23|1997-05-26|DELIVER IN PERSON|AIR|accounts. silent foxes about the +43783|553|84|7|31|45060.05|0.00|0.02|N|O|1997-04-11|1997-03-08|1997-04-14|TAKE BACK RETURN|AIR|sual, final dolphins use slyly since the +43808|1069|70|1|14|13580.84|0.05|0.01|A|F|1995-02-18|1995-04-05|1995-02-26|TAKE BACK RETURN|AIR| carefully express dep +43808|332|17|2|16|19717.28|0.02|0.05|A|F|1995-01-15|1995-02-17|1995-01-31|COLLECT COD|SHIP|cial, express forge +43808|1770|55|3|24|40122.48|0.08|0.05|R|F|1995-01-14|1995-03-10|1995-02-11|COLLECT COD|MAIL|ironic deposits detect quickly blithely e +43808|149|2|4|26|27277.64|0.09|0.01|R|F|1995-01-21|1995-02-16|1995-01-27|DELIVER IN PERSON|REG AIR|sly ironic instructions. caref +43809|1017|88|1|41|37638.41|0.08|0.00|N|O|1997-08-02|1997-06-01|1997-08-20|TAKE BACK RETURN|MAIL|r ideas. s +43809|372|57|2|50|63618.50|0.10|0.02|N|O|1997-07-16|1997-07-11|1997-07-21|NONE|REG AIR| idly. multipliers after the carefully even +43809|1469|87|3|27|37002.42|0.07|0.01|N|O|1997-06-10|1997-06-26|1997-06-28|NONE|REG AIR|y according to the quick +43810|751|52|1|39|64418.25|0.01|0.08|N|O|1998-06-04|1998-05-17|1998-06-15|COLLECT COD|AIR|r deposits +43810|897|97|2|43|77309.27|0.05|0.05|N|O|1998-03-20|1998-05-10|1998-03-23|COLLECT COD|FOB|, regular packages about +43810|891|91|3|22|39421.58|0.04|0.00|N|O|1998-05-30|1998-05-02|1998-06-23|NONE|AIR|nts. regular, ironic dep +43810|867|67|4|34|60107.24|0.05|0.00|N|O|1998-04-15|1998-04-25|1998-05-04|NONE|AIR| ironic accounts nod +43810|321|78|5|23|28090.36|0.00|0.08|N|O|1998-04-04|1998-04-23|1998-04-27|NONE|SHIP|c packages are about the +43810|1348|25|6|39|48724.26|0.02|0.08|N|O|1998-06-07|1998-05-28|1998-07-03|COLLECT COD|AIR|close, silent packages haggle above the +43810|1773|16|7|14|23446.78|0.09|0.07|N|O|1998-04-17|1998-06-04|1998-05-16|DELIVER IN PERSON|SHIP|sual deposits are caref +43811|1127|100|1|49|50377.88|0.04|0.03|N|O|1998-08-01|1998-07-18|1998-08-21|NONE|RAIL|ependencies are sly, quick depe +43811|821|55|2|18|30992.76|0.10|0.01|N|O|1998-09-08|1998-08-01|1998-09-28|DELIVER IN PERSON|REG AIR| at the unusual packages +43811|21|72|3|41|37761.82|0.10|0.01|N|O|1998-06-06|1998-07-29|1998-06-24|NONE|TRUCK|gular foxes acro +43811|1596|17|4|19|28454.21|0.10|0.04|N|O|1998-07-07|1998-08-01|1998-07-30|NONE|RAIL|ke blithely slyly fina +43812|129|82|1|49|50426.88|0.01|0.07|N|O|1996-08-01|1996-08-10|1996-08-08|TAKE BACK RETURN|AIR|inal accounts are. accounts w +43812|1043|44|2|3|2832.12|0.09|0.00|N|O|1996-07-14|1996-07-27|1996-08-01|COLLECT COD|SHIP|ly final pinto beans wake above the car +43812|327|12|3|29|35592.28|0.00|0.00|N|O|1996-08-05|1996-07-17|1996-08-19|COLLECT COD|AIR|arefully ironic ideas sleep ironic, fina +43812|1215|90|4|34|37951.14|0.09|0.03|N|O|1996-07-04|1996-07-27|1996-07-09|TAKE BACK RETURN|RAIL|foxes haggle daringly a +43813|1500|40|1|38|53257.00|0.08|0.02|A|F|1994-09-30|1994-09-22|1994-10-30|COLLECT COD|MAIL|blithely carefully ironic theodolites. +43813|427|86|2|49|65043.58|0.02|0.03|A|F|1994-09-23|1994-09-18|1994-10-11|TAKE BACK RETURN|AIR| deposits. ironic, pending platelets wake. +43814|1289|1|1|8|9522.24|0.09|0.03|A|F|1995-01-29|1995-03-28|1995-02-14|TAKE BACK RETURN|TRUCK|e silently. regular, re +43814|1704|47|2|31|49776.70|0.09|0.05|A|F|1995-04-21|1995-04-05|1995-05-07|NONE|AIR|refully along the express, unusual accou +43814|950|85|3|19|35168.05|0.10|0.01|A|F|1995-05-11|1995-02-09|1995-05-24|DELIVER IN PERSON|SHIP|tructions a +43814|962|63|4|37|68929.52|0.00|0.00|R|F|1995-04-29|1995-03-20|1995-05-24|TAKE BACK RETURN|AIR|gular platelets. even +43814|43|44|5|25|23576.00|0.10|0.03|A|F|1995-01-27|1995-03-09|1995-02-18|COLLECT COD|SHIP|osits. spe +43814|1109|10|6|12|12121.20|0.05|0.08|R|F|1995-03-08|1995-03-08|1995-03-26|DELIVER IN PERSON|RAIL|sly throughout the blithely +43814|319|20|7|4|4877.24|0.07|0.00|A|F|1995-05-05|1995-03-25|1995-05-09|NONE|MAIL|ng to the slyly unusual +43815|106|85|1|15|15091.50|0.01|0.05|A|F|1992-06-17|1992-08-06|1992-07-02|TAKE BACK RETURN|FOB|e instead of the silent, ironic +43815|831|98|2|38|65809.54|0.05|0.00|A|F|1992-06-30|1992-07-17|1992-07-20|COLLECT COD|RAIL| slyly. furiously reg +43815|1942|87|3|12|22127.28|0.08|0.01|A|F|1992-07-21|1992-08-27|1992-08-08|TAKE BACK RETURN|AIR|iously final somas. final, regul +43815|765|66|4|2|3331.52|0.04|0.00|A|F|1992-08-02|1992-09-08|1992-08-11|NONE|REG AIR|refully ironic deposits use even orbits. qu +43815|772|37|5|3|5018.31|0.09|0.06|R|F|1992-08-25|1992-08-19|1992-09-06|TAKE BACK RETURN|AIR|ously ironic requests sleep +43815|1454|94|6|49|66417.05|0.10|0.00|A|F|1992-07-22|1992-08-07|1992-08-10|COLLECT COD|REG AIR|e quickly blithely ironic pinto beans +43840|1362|1|1|14|17687.04|0.10|0.02|N|O|1998-04-15|1998-06-16|1998-04-30|TAKE BACK RETURN|MAIL|ingly regular platelets cajole along the +43841|674|6|1|29|45665.43|0.08|0.01|N|O|1996-02-04|1995-12-08|1996-02-21|TAKE BACK RETURN|MAIL|nusual requests. re +43841|69|70|2|20|19381.20|0.01|0.03|N|O|1996-02-19|1995-12-11|1996-02-25|DELIVER IN PERSON|TRUCK|. express packages maintain. even asymptot +43842|909|10|1|44|79635.60|0.05|0.07|A|F|1994-04-15|1994-03-07|1994-04-17|COLLECT COD|RAIL|y. pending, special asympto +43842|1116|89|2|37|37633.07|0.00|0.01|A|F|1994-03-26|1994-03-13|1994-04-05|COLLECT COD|AIR| after the accounts. p +43842|164|91|3|2|2128.32|0.00|0.04|R|F|1994-04-24|1994-04-05|1994-05-07|COLLECT COD|MAIL|e slyly ironic platelets +43842|915|18|4|38|69004.58|0.02|0.06|A|F|1994-02-05|1994-03-21|1994-02-06|TAKE BACK RETURN|RAIL|cies. blithely careful accounts use care +43842|399|56|5|8|10395.12|0.01|0.06|R|F|1994-05-12|1994-03-26|1994-06-10|DELIVER IN PERSON|AIR|uffily express ideas. final deposits so +43843|1236|37|1|13|14783.99|0.08|0.00|N|O|1997-11-25|1997-11-20|1997-12-17|COLLECT COD|REG AIR|al requests hag +43843|1660|84|2|24|37479.84|0.03|0.07|N|O|1997-11-13|1997-12-15|1997-11-28|NONE|FOB|y bold deposits are thinly +43843|228|10|3|28|31590.16|0.04|0.00|N|O|1997-10-28|1997-12-10|1997-11-08|TAKE BACK RETURN|MAIL|deposits. bold deposits slee +43843|1504|45|4|6|8433.00|0.08|0.05|N|O|1998-01-11|1997-12-22|1998-01-14|DELIVER IN PERSON|SHIP|furiously final deposits s +43843|1163|100|5|13|13834.08|0.08|0.07|N|O|1997-11-21|1997-12-18|1997-12-06|NONE|TRUCK|indle blithely alongside of the accounts. +43843|767|64|6|30|50032.80|0.10|0.02|N|O|1997-10-07|1997-12-21|1997-10-20|NONE|RAIL|ily unusual theod +43843|1394|33|7|48|62178.72|0.06|0.05|N|O|1997-10-12|1997-12-12|1997-10-23|DELIVER IN PERSON|RAIL| kindle blithely above the c +43844|1256|57|1|37|42818.25|0.10|0.02|R|F|1994-02-04|1994-01-24|1994-02-10|NONE|TRUCK| are along the fu +43844|1021|57|2|3|2766.06|0.10|0.00|A|F|1994-02-23|1993-12-01|1994-03-18|COLLECT COD|REG AIR|. always regular pinto bean +43845|1000|69|1|40|36040.00|0.04|0.06|N|O|1997-02-12|1997-04-18|1997-03-13|TAKE BACK RETURN|REG AIR|ggle slyly. quickly special accoun +43845|1929|74|2|33|60420.36|0.06|0.06|N|O|1997-03-25|1997-04-09|1997-04-16|COLLECT COD|MAIL|final, final accounts print carefully regul +43845|1970|71|3|10|18719.70|0.05|0.00|N|O|1997-05-14|1997-03-24|1997-06-02|NONE|SHIP|ly even foxes wake slyly according to the +43845|722|23|4|21|34077.12|0.09|0.05|N|O|1997-05-14|1997-04-03|1997-06-04|NONE|MAIL|ss escapades. carefully ruthless instr +43845|908|9|5|30|54267.00|0.01|0.08|N|O|1997-05-07|1997-03-01|1997-05-19|TAKE BACK RETURN|MAIL|lly pendin +43845|1451|30|6|7|9467.15|0.07|0.04|N|O|1997-04-28|1997-03-08|1997-05-06|COLLECT COD|FOB| furiously final deposits cajole c +43846|1359|60|1|37|46632.95|0.02|0.04|A|F|1994-04-07|1994-03-30|1994-04-28|TAKE BACK RETURN|RAIL| fluffily ironic ideas alo +43846|1187|60|2|20|21763.60|0.01|0.06|A|F|1994-04-01|1994-05-08|1994-04-06|DELIVER IN PERSON|REG AIR| blithely instructi +43846|894|94|3|32|57436.48|0.01|0.07|R|F|1994-03-15|1994-05-22|1994-03-30|NONE|REG AIR|old deposits det +43846|258|86|4|8|9266.00|0.02|0.05|A|F|1994-04-04|1994-05-05|1994-04-06|COLLECT COD|MAIL|lly special theodolites kindle quickl +43846|1637|61|5|44|67699.72|0.07|0.00|R|F|1994-04-24|1994-04-22|1994-05-22|DELIVER IN PERSON|FOB|ncies. fluffily bold packag +43846|1878|22|6|40|71194.80|0.03|0.05|A|F|1994-04-20|1994-05-23|1994-04-27|NONE|TRUCK| haggle. slyly unusual accoun +43846|808|9|7|35|59808.00|0.02|0.00|A|F|1994-03-13|1994-05-11|1994-04-10|TAKE BACK RETURN|TRUCK|ymptotes wake furiously furiously even asym +43847|1352|67|1|10|12533.50|0.10|0.01|R|F|1992-11-07|1992-10-14|1992-11-13|NONE|MAIL| haggle slyl +43872|697|98|1|31|49528.39|0.04|0.00|N|O|1997-07-24|1997-09-22|1997-08-06|COLLECT COD|REG AIR| to the silent theodolites. carefully fina +43873|603|97|1|47|70669.20|0.00|0.04|N|O|1997-07-12|1997-08-07|1997-07-24|NONE|REG AIR|yly thin warhorses. close, regul +43873|439|27|2|16|21430.88|0.08|0.01|N|O|1997-06-29|1997-08-16|1997-07-01|TAKE BACK RETURN|MAIL|blithely along the fluffi +43873|1803|47|3|16|27276.80|0.01|0.02|N|O|1997-07-17|1997-07-28|1997-08-08|TAKE BACK RETURN|RAIL| packages across the expre +43873|935|4|4|16|29374.88|0.09|0.02|N|O|1997-07-17|1997-07-27|1997-07-29|COLLECT COD|MAIL| pinto beans. carefully regular d +43873|290|72|5|20|23805.80|0.03|0.07|N|O|1997-09-04|1997-08-14|1997-10-04|DELIVER IN PERSON|REG AIR|ly against the furiously unusual de +43873|832|33|6|42|72778.86|0.00|0.02|N|O|1997-08-01|1997-06-29|1997-08-09|TAKE BACK RETURN|RAIL|leep. quickly unusual pac +43874|1517|38|1|23|32625.73|0.02|0.00|A|F|1992-06-30|1992-09-02|1992-07-10|TAKE BACK RETURN|RAIL|iously unusual deposits haggle carefully ir +43875|1478|18|1|43|59317.21|0.07|0.00|N|O|1996-03-24|1996-02-10|1996-04-19|TAKE BACK RETURN|RAIL| boost pending packages. ste +43875|1933|78|2|4|7339.72|0.00|0.02|N|O|1996-01-09|1996-01-09|1996-02-02|TAKE BACK RETURN|AIR| furiously special ideas sleep +43875|1503|44|3|27|37921.50|0.05|0.04|N|O|1996-03-05|1996-03-03|1996-04-01|DELIVER IN PERSON|AIR|manent deposits. +43875|1969|2|4|48|89806.08|0.04|0.04|N|O|1996-02-21|1996-01-11|1996-02-26|NONE|AIR|deposits. fluffily fluffy +43875|1613|55|5|5|7573.05|0.07|0.02|N|O|1996-01-07|1996-03-01|1996-01-24|TAKE BACK RETURN|AIR|fily ironic, express deposits: furi +43875|815|49|6|29|49758.49|0.03|0.02|N|O|1996-01-14|1996-03-07|1996-01-22|TAKE BACK RETURN|FOB|regular ideas wake bravely fl +43875|601|33|7|41|61565.60|0.09|0.04|N|O|1995-12-11|1996-02-24|1996-01-07|NONE|TRUCK|kages haggle. furiously express deposi +43876|1235|73|1|38|43176.74|0.07|0.07|N|O|1996-04-05|1996-05-15|1996-05-03|NONE|FOB|around the regular theodolites. depend +43876|467|55|2|27|36921.42|0.03|0.02|N|O|1996-06-05|1996-05-18|1996-06-26|COLLECT COD|TRUCK|s regular pac +43876|1169|78|3|5|5350.80|0.05|0.05|N|O|1996-06-19|1996-04-30|1996-07-14|DELIVER IN PERSON|TRUCK|bove the blithely +43876|884|51|4|23|41052.24|0.10|0.08|N|O|1996-04-24|1996-06-22|1996-04-26|TAKE BACK RETURN|RAIL|. carefully unusual packages haggle f +43876|1718|3|5|26|42112.46|0.08|0.08|N|O|1996-06-29|1996-06-04|1996-07-02|NONE|REG AIR| sheaves. bold ideas cajole. slyly special +43876|771|36|6|36|60183.72|0.01|0.00|N|O|1996-04-01|1996-05-30|1996-04-16|TAKE BACK RETURN|TRUCK|e furiously special foxes. f +43876|411|99|7|21|27539.61|0.04|0.06|N|O|1996-05-24|1996-06-06|1996-06-05|COLLECT COD|RAIL|posits. qu +43877|1247|22|1|37|42484.88|0.06|0.01|A|F|1993-05-12|1993-05-12|1993-05-26|COLLECT COD|AIR|refully even ideas so +43877|1639|40|2|30|46218.90|0.03|0.00|A|F|1993-06-07|1993-05-11|1993-06-12|DELIVER IN PERSON|REG AIR|al accounts. carefully unusual in +43877|1731|32|3|19|31021.87|0.05|0.02|R|F|1993-04-19|1993-05-25|1993-05-14|DELIVER IN PERSON|MAIL|usly regular reques +43878|473|32|1|16|21975.52|0.04|0.03|N|O|1996-05-02|1996-04-29|1996-05-16|DELIVER IN PERSON|TRUCK|al accounts +43878|242|70|2|32|36551.68|0.01|0.01|N|O|1996-04-26|1996-06-22|1996-05-08|TAKE BACK RETURN|RAIL|. final packages +43878|951|20|3|3|5555.85|0.10|0.03|N|O|1996-04-19|1996-06-09|1996-04-30|DELIVER IN PERSON|RAIL|lar deposits haggle fur +43878|448|36|4|50|67422.00|0.01|0.02|N|O|1996-05-11|1996-06-08|1996-05-19|DELIVER IN PERSON|AIR|the final, final foxes +43878|1177|86|5|11|11859.87|0.04|0.03|N|O|1996-05-07|1996-04-28|1996-05-26|TAKE BACK RETURN|REG AIR|structions are above the +43879|250|32|1|17|19554.25|0.00|0.03|R|F|1993-09-28|1993-11-04|1993-10-16|COLLECT COD|SHIP|arefully silent dolphins. s +43879|866|67|2|37|65373.82|0.10|0.07|A|F|1993-09-16|1993-11-06|1993-10-09|TAKE BACK RETURN|RAIL|eas? bold, regular fret +43904|1428|7|1|30|39882.60|0.01|0.04|A|F|1993-08-19|1993-06-04|1993-08-22|TAKE BACK RETURN|REG AIR|among the slyly ironic packages +43904|525|56|2|15|21382.80|0.08|0.03|A|F|1993-07-13|1993-07-28|1993-08-10|DELIVER IN PERSON|SHIP| packages. blithely bold packages +43904|24|50|3|9|8316.18|0.00|0.06|R|F|1993-08-01|1993-06-25|1993-08-14|COLLECT COD|SHIP|e quickly iron +43904|1360|99|4|23|29011.28|0.04|0.05|A|F|1993-06-18|1993-07-27|1993-06-21|COLLECT COD|AIR|y final de +43905|1838|25|1|21|36536.43|0.08|0.02|N|O|1998-03-18|1998-03-13|1998-04-15|NONE|SHIP|even theodolite +43905|1205|43|2|1|1106.20|0.08|0.07|N|O|1998-04-21|1998-03-21|1998-05-07|DELIVER IN PERSON|TRUCK|refully regular packages use +43905|979|80|3|8|15039.76|0.03|0.04|N|O|1998-04-23|1998-04-06|1998-05-20|COLLECT COD|MAIL|lar deposits above +43905|1859|89|4|26|45782.10|0.06|0.03|N|O|1998-06-01|1998-04-09|1998-06-15|COLLECT COD|MAIL|ges are. carefully pending ide +43906|453|83|1|35|47370.75|0.02|0.01|R|F|1992-05-26|1992-03-13|1992-06-07|COLLECT COD|TRUCK|e furiously exp +43906|708|73|2|37|59521.90|0.06|0.05|A|F|1992-06-06|1992-04-11|1992-06-09|NONE|TRUCK|its with the +43906|1713|98|3|15|24220.65|0.10|0.06|A|F|1992-05-17|1992-04-13|1992-06-16|DELIVER IN PERSON|SHIP|efully unusual f +43906|1664|6|4|18|28181.88|0.05|0.03|R|F|1992-04-12|1992-04-10|1992-04-26|TAKE BACK RETURN|RAIL|gular requests. furiously fi +43907|1000|3|1|26|23426.00|0.05|0.08|R|F|1992-09-25|1992-10-04|1992-10-14|NONE|TRUCK|requests boost blithely across the quickly +43907|462|63|2|3|4087.38|0.05|0.03|A|F|1992-08-31|1992-09-09|1992-09-08|DELIVER IN PERSON|REG AIR|pinto beans haggle across t +43907|974|75|3|35|65623.95|0.08|0.04|R|F|1992-10-26|1992-09-01|1992-11-12|TAKE BACK RETURN|TRUCK|zzle slyly against the final, e +43908|284|85|1|12|14211.36|0.04|0.05|N|O|1998-04-16|1998-03-14|1998-05-08|NONE|REG AIR|le. even accounts boost ca +43908|623|55|2|2|3047.24|0.07|0.08|N|O|1998-04-02|1998-04-01|1998-04-16|NONE|SHIP| nag alongsi +43908|352|81|3|46|57608.10|0.01|0.08|N|O|1998-02-10|1998-03-21|1998-02-13|NONE|SHIP|gular, ironic dependen +43909|550|41|1|15|21758.25|0.06|0.07|A|F|1994-04-13|1994-02-25|1994-05-10|COLLECT COD|MAIL|ly express dolphins use even depo +43909|749|46|2|29|47842.46|0.00|0.06|A|F|1994-03-05|1994-03-26|1994-03-22|TAKE BACK RETURN|AIR|press ideas +43910|883|17|1|13|23190.44|0.08|0.07|N|O|1997-07-04|1997-05-25|1997-07-19|TAKE BACK RETURN|FOB| alongside +43910|1483|1|2|39|53994.72|0.06|0.07|N|O|1997-07-10|1997-05-04|1997-07-22|DELIVER IN PERSON|TRUCK| final theodolites boost carefully sly +43911|156|9|1|7|7393.05|0.08|0.05|A|F|1994-03-27|1994-02-15|1994-04-06|NONE|TRUCK|onic, special deposits are s +43911|1619|20|2|12|18247.32|0.09|0.07|R|F|1994-03-07|1994-02-17|1994-03-23|COLLECT COD|MAIL|unts nag fluffily. express, slow c +43911|1762|89|3|6|9982.56|0.09|0.02|R|F|1994-05-07|1994-02-18|1994-05-23|TAKE BACK RETURN|TRUCK|c requests. asymptotes use +43911|1271|46|4|45|52752.15|0.04|0.04|A|F|1994-02-17|1994-04-14|1994-03-10|TAKE BACK RETURN|REG AIR| the unusual instruction +43911|53|79|5|16|15248.80|0.04|0.06|A|F|1994-05-14|1994-03-08|1994-05-29|NONE|SHIP| special instructio +43936|1535|16|1|25|35913.25|0.03|0.07|R|F|1993-05-03|1993-06-01|1993-05-14|DELIVER IN PERSON|FOB|thely unusual requests wake furiously ex +43936|630|62|2|38|58163.94|0.01|0.02|R|F|1993-06-21|1993-05-07|1993-06-29|NONE|REG AIR|c packages. furiously bold fr +43936|1271|9|3|23|26962.21|0.08|0.01|R|F|1993-07-02|1993-05-16|1993-07-06|DELIVER IN PERSON|MAIL|instructions cajole. regular r +43936|12|13|4|8|7296.08|0.08|0.01|A|F|1993-06-14|1993-04-25|1993-07-09|COLLECT COD|SHIP|pecial accounts sleep caref +43936|188|67|5|3|3264.54|0.01|0.01|R|F|1993-07-06|1993-05-28|1993-07-29|DELIVER IN PERSON|REG AIR|ts detect somas. blithely ironic fox +43937|1092|98|1|4|3972.36|0.09|0.00|A|F|1992-06-22|1992-04-16|1992-06-23|NONE|MAIL|se above the carefully +43937|603|97|2|41|61647.60|0.02|0.05|R|F|1992-07-09|1992-06-05|1992-07-23|TAKE BACK RETURN|FOB|nal dinos according to the carefully f +43938|1212|50|1|31|34509.51|0.04|0.01|N|O|1998-02-07|1998-01-01|1998-03-01|COLLECT COD|TRUCK|use furiously across the slyly +43938|1734|61|2|24|39257.52|0.00|0.04|N|O|1998-02-19|1997-12-16|1998-03-11|DELIVER IN PERSON|REG AIR|final packages +43938|1483|1|3|15|20767.20|0.04|0.08|N|O|1998-01-11|1997-12-09|1998-01-26|NONE|AIR| carefully pending, bo +43938|1746|31|4|22|36250.28|0.08|0.06|N|O|1998-01-31|1997-11-30|1998-02-10|NONE|FOB|efully blithe packages. carefull +43938|12|38|5|3|2736.03|0.07|0.02|N|O|1998-02-12|1997-12-19|1998-02-16|NONE|MAIL| accounts are express theodolites. +43938|1115|88|6|15|15241.65|0.03|0.06|N|O|1997-12-20|1997-12-16|1998-01-07|COLLECT COD|TRUCK|c deposits sleep carefully. quickly ironic +43938|628|22|7|5|7643.10|0.08|0.08|N|O|1998-01-28|1997-12-02|1998-02-17|DELIVER IN PERSON|SHIP|ect furiously +43939|1556|97|1|23|33523.65|0.02|0.06|R|F|1994-03-15|1994-04-18|1994-04-10|DELIVER IN PERSON|TRUCK|foxes-- carefully special packages after th +43939|885|19|2|6|10715.28|0.05|0.01|R|F|1994-04-05|1994-03-20|1994-04-14|COLLECT COD|MAIL| boost slyly a +43939|1118|19|3|19|19363.09|0.09|0.02|R|F|1994-05-05|1994-04-07|1994-05-29|COLLECT COD|REG AIR|s affix slyly finally +43939|564|55|4|14|20503.84|0.03|0.03|A|F|1994-05-06|1994-03-29|1994-05-12|TAKE BACK RETURN|SHIP|the pending deposits are according +43940|323|8|1|41|50156.12|0.02|0.05|A|F|1993-02-28|1993-05-06|1993-03-02|TAKE BACK RETURN|FOB|stealthy ideas are quickly blithely even +43940|1188|89|2|16|17426.88|0.03|0.04|R|F|1993-04-25|1993-04-23|1993-05-04|NONE|RAIL|nal pinto beans. regular f +43940|437|67|3|32|42797.76|0.09|0.08|R|F|1993-05-28|1993-05-13|1993-06-07|COLLECT COD|FOB|sly ironic deposits. +43940|1912|13|4|27|48975.57|0.01|0.05|R|F|1993-04-15|1993-04-29|1993-05-15|TAKE BACK RETURN|TRUCK|l requests accordin +43940|623|86|5|1|1523.62|0.07|0.02|A|F|1993-04-05|1993-04-15|1993-04-22|TAKE BACK RETURN|REG AIR|ular foxes sleep carefully. +43940|1885|86|6|32|57180.16|0.02|0.03|A|F|1993-05-03|1993-04-02|1993-05-07|TAKE BACK RETURN|MAIL|otes should have to cajole dogged, bold +43941|1649|32|1|11|17057.04|0.08|0.06|N|O|1997-03-31|1997-03-16|1997-04-12|NONE|TRUCK| sly foxes shall have to cajole slyly +43942|670|71|1|20|31413.40|0.03|0.07|N|O|1996-10-26|1996-11-02|1996-11-06|NONE|SHIP|re slyly along the +43942|1766|51|2|24|40026.24|0.05|0.04|N|O|1996-09-26|1996-10-18|1996-10-10|TAKE BACK RETURN|RAIL|ffily special +43942|1762|5|3|19|31611.44|0.10|0.05|N|O|1996-10-30|1996-10-10|1996-11-23|TAKE BACK RETURN|MAIL|ular courts haggle furiously. quickly s +43942|268|96|4|47|54908.22|0.08|0.05|N|O|1996-09-03|1996-11-01|1996-10-01|TAKE BACK RETURN|TRUCK|equests wake according to the slyly +43942|522|53|5|3|4267.56|0.10|0.04|N|O|1996-10-25|1996-11-12|1996-11-24|COLLECT COD|REG AIR|n packages along +43942|1146|83|6|18|18848.52|0.07|0.08|N|O|1996-11-18|1996-09-20|1996-12-12|COLLECT COD|SHIP|against the enticingly special theodolites. +43942|1093|29|7|36|35787.24|0.02|0.06|N|O|1996-08-27|1996-11-16|1996-09-15|COLLECT COD|FOB|ronic platelets grow slyly +43943|1872|73|1|33|58537.71|0.07|0.02|N|O|1997-12-23|1998-01-07|1997-12-27|NONE|TRUCK|ly even requests. sl +43943|1633|16|2|33|50642.79|0.00|0.04|N|O|1997-11-15|1997-12-14|1997-11-17|DELIVER IN PERSON|REG AIR|l ideas-- final dependencies hinder sl +43968|397|26|1|2|2594.78|0.04|0.03|N|O|1996-12-28|1996-11-17|1996-12-31|COLLECT COD|MAIL|yly final accounts wake. slyl +43968|1736|21|2|49|80248.77|0.01|0.04|N|O|1996-10-17|1996-10-11|1996-11-03|NONE|REG AIR| cajole sly +43969|400|85|1|48|62419.20|0.06|0.01|N|O|1998-09-01|1998-09-15|1998-09-18|NONE|REG AIR|s express multipliers according +43969|1485|64|2|36|49913.28|0.08|0.01|N|O|1998-11-24|1998-09-03|1998-12-24|DELIVER IN PERSON|TRUCK| instructions cajole along +43969|1904|37|3|21|37923.90|0.08|0.03|N|O|1998-10-16|1998-08-28|1998-10-26|DELIVER IN PERSON|SHIP|ounts haggle above the pendin +43969|1585|26|4|47|69869.26|0.04|0.02|N|O|1998-09-06|1998-10-14|1998-09-13|COLLECT COD|SHIP|anent, ironic accounts. blithely unusual ac +43969|860|94|5|20|35217.20|0.06|0.08|N|O|1998-08-07|1998-09-13|1998-08-13|DELIVER IN PERSON|TRUCK|counts according to the fu +43970|590|91|1|22|32792.98|0.03|0.04|R|F|1993-11-11|1993-10-13|1993-11-24|COLLECT COD|SHIP|l asymptotes-- +43971|701|98|1|42|67271.40|0.03|0.01|N|O|1996-05-29|1996-05-14|1996-06-23|COLLECT COD|TRUCK|re. bravely even instructions +43971|185|64|2|12|13022.16|0.00|0.03|N|O|1996-07-14|1996-05-30|1996-08-05|COLLECT COD|MAIL|e thinly. quickly special pinto beans +43971|310|11|3|6|7261.86|0.07|0.02|N|O|1996-05-24|1996-05-20|1996-06-12|DELIVER IN PERSON|SHIP|y express request +43972|885|19|1|42|75006.96|0.10|0.04|R|F|1993-05-04|1993-05-30|1993-05-08|NONE|TRUCK|dolites cajole slyly after the furiously +43972|1301|78|2|3|3606.90|0.09|0.02|R|F|1993-07-07|1993-06-13|1993-07-10|TAKE BACK RETURN|REG AIR|hins. requests across the slyly e +43972|1239|40|3|47|53590.81|0.07|0.08|A|F|1993-03-25|1993-05-08|1993-04-23|TAKE BACK RETURN|RAIL|s about the slowly unusual inst +43972|1236|48|4|43|48900.89|0.08|0.03|R|F|1993-03-25|1993-05-09|1993-03-26|TAKE BACK RETURN|FOB|uickly regular ideas. unusual +43972|1029|35|5|30|27900.60|0.05|0.07|R|F|1993-06-03|1993-05-13|1993-06-26|NONE|AIR|nding requests s +43972|879|79|6|32|56955.84|0.03|0.01|R|F|1993-07-11|1993-04-30|1993-07-29|DELIVER IN PERSON|AIR|ut the bold, ironic instruc +43973|1789|74|1|26|43960.28|0.01|0.05|N|O|1998-02-04|1998-03-12|1998-02-14|COLLECT COD|MAIL|silent asymptotes det +43973|1473|52|2|38|52229.86|0.03|0.03|N|O|1998-03-16|1998-04-11|1998-03-21|COLLECT COD|TRUCK|ons. boldly express excuses according to +43973|1382|83|3|6|7700.28|0.08|0.05|N|O|1998-04-15|1998-02-25|1998-05-01|TAKE BACK RETURN|RAIL|e. sometimes regul +43973|1117|90|4|23|23416.53|0.09|0.04|N|O|1998-05-01|1998-02-18|1998-05-28|DELIVER IN PERSON|MAIL|osits are quickly even notornis. q +43973|62|13|5|33|31747.98|0.10|0.06|N|O|1998-03-12|1998-04-03|1998-03-23|NONE|TRUCK|ickly unusu +43973|413|72|6|50|65670.50|0.02|0.05|N|O|1998-05-05|1998-04-01|1998-05-13|COLLECT COD|TRUCK|nstructions. enticingly even theodolites sl +43973|24|75|7|2|1848.04|0.03|0.07|N|O|1998-05-01|1998-02-18|1998-05-29|TAKE BACK RETURN|AIR|ets accord +43974|1392|93|1|27|34921.53|0.03|0.00|A|F|1994-10-13|1994-12-14|1994-11-02|TAKE BACK RETURN|SHIP|lithely bold deposits try to haggle fl +43974|1280|92|2|35|41344.80|0.00|0.01|R|F|1994-12-14|1994-11-13|1995-01-13|NONE|MAIL|uriously final requests of the special, sp +43975|838|72|1|43|74769.69|0.07|0.06|A|F|1995-02-20|1995-03-17|1995-03-18|COLLECT COD|SHIP|sual packages. carefully spe +43975|987|56|2|10|18879.80|0.01|0.03|A|F|1995-04-02|1995-03-15|1995-04-12|COLLECT COD|REG AIR|he slyly pending pint +43975|149|28|3|29|30425.06|0.01|0.02|A|F|1995-01-30|1995-02-25|1995-02-18|COLLECT COD|MAIL|e carefully even instructions play slyly d +43975|1556|97|4|17|24778.35|0.09|0.00|R|F|1995-01-06|1995-04-03|1995-01-23|TAKE BACK RETURN|REG AIR| the packages sleep slyly f +44000|1253|91|1|3|3462.75|0.08|0.00|R|F|1992-10-08|1992-12-06|1992-11-05|DELIVER IN PERSON|SHIP|ges affix quickly blithe +44000|1232|70|2|20|22664.60|0.05|0.04|R|F|1992-10-14|1992-12-08|1992-11-13|NONE|REG AIR|ly careful +44000|38|39|3|50|46901.50|0.09|0.01|A|F|1992-11-23|1992-12-19|1992-11-27|DELIVER IN PERSON|MAIL| special, bold requests. carefully un +44000|1694|95|4|19|30318.11|0.05|0.04|R|F|1992-12-28|1992-12-26|1993-01-06|NONE|TRUCK|le. unusual frets wak +44000|1502|23|5|19|26666.50|0.08|0.08|R|F|1993-01-30|1992-12-27|1993-02-11|DELIVER IN PERSON|RAIL|thely ironic requests are; pending +44000|510|1|6|8|11284.08|0.00|0.06|R|F|1992-12-29|1992-12-03|1993-01-02|NONE|SHIP|carefully final deposits are blith +44000|142|69|7|27|28137.78|0.01|0.08|R|F|1993-01-22|1992-12-15|1993-01-31|COLLECT COD|SHIP|warthogs. blithely regular requests caj +44001|1332|9|1|33|40699.89|0.00|0.07|N|O|1997-11-09|1997-11-03|1997-12-06|DELIVER IN PERSON|RAIL|ets are ironically asympt +44001|1357|58|2|35|44042.25|0.07|0.01|N|O|1997-11-25|1997-11-20|1997-12-23|DELIVER IN PERSON|FOB|ructions caj +44001|194|73|3|49|53615.31|0.10|0.08|N|O|1997-11-01|1997-12-19|1997-11-26|TAKE BACK RETURN|SHIP|egular instruc +44002|1329|6|1|41|50443.12|0.10|0.03|R|F|1994-05-26|1994-03-11|1994-06-02|DELIVER IN PERSON|AIR|tructions detect carefully acros +44002|1148|57|2|12|12589.68|0.07|0.05|A|F|1994-02-21|1994-04-25|1994-02-28|TAKE BACK RETURN|SHIP|lithely alo +44002|303|88|3|13|15642.90|0.03|0.07|A|F|1994-02-27|1994-04-03|1994-03-13|NONE|SHIP|nticing packages are carefully express p +44002|815|15|4|28|48042.68|0.03|0.04|A|F|1994-04-26|1994-04-23|1994-05-24|TAKE BACK RETURN|AIR|, unusual pinto beans al +44002|734|35|5|18|29425.14|0.01|0.02|A|F|1994-03-10|1994-03-17|1994-03-26|COLLECT COD|FOB|dolites. instructions are according to +44003|255|83|1|28|32347.00|0.07|0.02|N|O|1996-02-10|1995-12-31|1996-03-04|TAKE BACK RETURN|AIR|slow requests +44003|209|91|2|45|49914.00|0.00|0.03|N|O|1996-02-12|1996-01-02|1996-02-18|COLLECT COD|SHIP|wind carefully regular requests. instr +44003|267|95|3|7|8170.82|0.07|0.04|N|O|1996-01-25|1996-01-01|1996-02-14|COLLECT COD|REG AIR|slyly regular forges integr +44003|249|31|4|2|2298.48|0.04|0.00|N|O|1996-02-21|1996-02-08|1996-03-17|COLLECT COD|FOB| fluffily final packages. fu +44004|697|91|1|43|68700.67|0.04|0.02|N|O|1995-11-16|1995-10-04|1995-11-21|COLLECT COD|SHIP|the fluffily unusual deposits. even theod +44004|1902|3|2|13|23450.70|0.03|0.00|N|O|1995-10-16|1995-10-07|1995-10-31|TAKE BACK RETURN|RAIL|osits x-ray furi +44004|1501|42|3|20|28050.00|0.00|0.02|N|O|1995-11-08|1995-09-29|1995-12-05|DELIVER IN PERSON|SHIP|onic packages integrate around +44005|1466|84|1|6|8204.76|0.07|0.03|R|F|1993-12-24|1993-11-01|1994-01-01|COLLECT COD|SHIP|outside the bo +44006|138|39|1|41|42563.33|0.03|0.06|N|O|1998-05-18|1998-05-08|1998-06-10|DELIVER IN PERSON|AIR|nstructions are +44007|1749|92|1|30|49522.20|0.07|0.08|N|O|1995-07-22|1995-08-09|1995-08-01|NONE|REG AIR|regular fo +44032|1624|25|1|12|18307.44|0.07|0.05|R|F|1993-04-20|1993-06-17|1993-04-23|COLLECT COD|RAIL|press packages integrate slyly. express +44032|1471|72|2|12|16469.64|0.07|0.08|A|F|1993-07-16|1993-06-25|1993-08-08|TAKE BACK RETURN|FOB|egular dependencies nag between the silent, +44032|838|5|3|41|71292.03|0.08|0.08|A|F|1993-05-18|1993-06-02|1993-06-05|DELIVER IN PERSON|REG AIR|sts haggle final accounts +44032|1865|95|4|33|58306.38|0.08|0.00|A|F|1993-05-21|1993-06-28|1993-06-09|TAKE BACK RETURN|REG AIR|s. regular ideas wake. b +44032|1628|70|5|11|16825.82|0.10|0.02|R|F|1993-04-10|1993-06-06|1993-04-21|TAKE BACK RETURN|REG AIR|ic escapades. bl +44032|1179|80|6|13|14042.21|0.10|0.00|R|F|1993-06-09|1993-06-10|1993-06-26|NONE|FOB| packages are quie +44032|906|75|7|19|34331.10|0.07|0.03|A|F|1993-04-30|1993-05-24|1993-05-04|NONE|TRUCK|ges against the final, regu +44033|406|94|1|47|61400.80|0.08|0.05|R|F|1992-03-14|1992-03-21|1992-03-18|COLLECT COD|RAIL|osits are. fluffily final packages wake f +44034|1678|20|1|28|44230.76|0.07|0.03|N|O|1996-06-22|1996-08-09|1996-07-09|DELIVER IN PERSON|TRUCK|eposits cajole carefully abo +44034|865|99|2|30|52975.80|0.10|0.05|N|O|1996-09-10|1996-07-27|1996-10-08|COLLECT COD|RAIL|nto beans sleep carefu +44034|319|4|3|26|31702.06|0.10|0.01|N|O|1996-08-01|1996-09-06|1996-08-09|TAKE BACK RETURN|RAIL|bout the daring ideas cajole carefully pe +44034|1021|27|4|50|46101.00|0.08|0.07|N|O|1996-09-12|1996-09-13|1996-09-14|DELIVER IN PERSON|MAIL|al packages. blithely fin +44034|1443|22|5|1|1344.44|0.05|0.08|N|O|1996-08-09|1996-07-17|1996-08-19|COLLECT COD|MAIL|ages run. furiously regular t +44035|255|10|1|19|21949.75|0.09|0.01|A|F|1992-02-28|1992-05-21|1992-03-09|TAKE BACK RETURN|MAIL|ths. even, final pinto beans x +44036|389|46|1|20|25787.60|0.07|0.06|R|F|1992-04-19|1992-03-19|1992-04-20|NONE|RAIL|usual deposits. regular, regular pinto be +44037|1118|19|1|26|26496.86|0.09|0.07|R|F|1992-07-03|1992-08-10|1992-07-12|DELIVER IN PERSON|FOB|y even accounts across the fluffily expr +44037|360|45|2|13|16384.68|0.06|0.02|A|F|1992-09-15|1992-09-24|1992-09-20|NONE|SHIP|, enticing foxes. ir +44037|497|27|3|25|34937.25|0.08|0.03|A|F|1992-07-24|1992-07-30|1992-08-12|DELIVER IN PERSON|REG AIR|ons according to t +44037|60|61|4|21|20161.26|0.10|0.02|A|F|1992-07-20|1992-08-24|1992-07-31|DELIVER IN PERSON|TRUCK|he quickly final package +44037|1211|86|5|21|23356.41|0.04|0.02|R|F|1992-08-24|1992-09-18|1992-09-20|NONE|SHIP|ng to the carefully even exc +44037|54|5|6|11|10494.55|0.03|0.01|A|F|1992-07-11|1992-07-31|1992-08-01|NONE|SHIP|al foxes. slyly bold ide +44038|577|38|1|31|45804.67|0.10|0.04|N|O|1997-06-22|1997-06-28|1997-07-20|DELIVER IN PERSON|FOB|ly across t +44038|1090|26|2|14|13875.26|0.01|0.06|N|O|1997-05-30|1997-07-12|1997-06-05|NONE|MAIL|blithely slow acco +44039|424|12|1|41|54301.22|0.07|0.00|N|O|1996-09-28|1996-12-15|1996-10-14|COLLECT COD|SHIP| furiously bold asymp +44039|1191|100|2|26|28396.94|0.03|0.01|N|O|1996-11-02|1996-11-06|1996-11-06|DELIVER IN PERSON|FOB|s haggle blithely. carefully express p +44064|1263|64|1|36|41913.36|0.10|0.07|R|F|1993-04-23|1993-04-05|1993-05-07|DELIVER IN PERSON|FOB|yers wake around the slyl +44064|123|2|2|41|41947.92|0.05|0.01|A|F|1993-04-12|1993-05-15|1993-05-02|COLLECT COD|SHIP|sts haggle careful +44065|634|97|1|15|23019.45|0.00|0.06|R|F|1993-10-28|1993-09-07|1993-11-06|DELIVER IN PERSON|TRUCK|sly express accounts nag. p +44065|1402|20|2|45|58653.00|0.02|0.05|A|F|1993-09-28|1993-09-11|1993-10-17|COLLECT COD|AIR|kly bold pinto beans +44065|594|85|3|47|70245.73|0.09|0.06|R|F|1993-07-12|1993-08-11|1993-07-26|DELIVER IN PERSON|REG AIR|latelets d +44065|394|23|4|3|3883.17|0.05|0.04|R|F|1993-10-31|1993-09-11|1993-11-14|TAKE BACK RETURN|RAIL|es affix blithely about the sly +44065|1344|83|5|49|61021.66|0.01|0.03|A|F|1993-08-01|1993-08-24|1993-08-19|TAKE BACK RETURN|TRUCK|ly even theodo +44066|978|13|1|23|43216.31|0.01|0.06|N|O|1997-07-04|1997-06-13|1997-08-02|TAKE BACK RETURN|TRUCK|after the furi +44066|1543|84|2|20|28890.80|0.06|0.02|N|O|1997-06-19|1997-05-30|1997-07-10|NONE|AIR| are slyly unusual foxes. ir +44066|393|94|3|4|5173.56|0.07|0.02|N|O|1997-06-23|1997-07-21|1997-07-04|NONE|AIR|final ideas. furiously pending ideas ca +44066|971|6|4|7|13103.79|0.06|0.04|N|O|1997-08-17|1997-07-14|1997-09-08|DELIVER IN PERSON|MAIL|ss requests. carefully brave requ +44066|1841|71|5|40|69713.60|0.09|0.03|N|O|1997-08-15|1997-06-25|1997-08-28|NONE|MAIL| across the instruction +44066|1154|55|6|13|13716.95|0.00|0.00|N|O|1997-06-11|1997-07-18|1997-06-20|TAKE BACK RETURN|REG AIR|ts. even, pending foxes +44067|254|82|1|29|33473.25|0.09|0.03|N|O|1997-02-10|1997-01-23|1997-03-04|TAKE BACK RETURN|AIR|usly above the furiously express fox +44067|216|71|2|28|31253.88|0.02|0.03|N|O|1996-12-18|1997-01-24|1996-12-25|DELIVER IN PERSON|FOB|d requests. carefully special requests sl +44067|667|61|3|5|7838.30|0.08|0.01|N|O|1997-03-07|1997-01-09|1997-03-21|TAKE BACK RETURN|REG AIR| haggle furiously quickly bold re +44067|628|91|4|36|55030.32|0.07|0.07|N|O|1996-12-07|1997-01-15|1996-12-26|TAKE BACK RETURN|AIR|iously even platelets are fluffily ideas. +44068|1017|53|1|33|30294.33|0.05|0.08|A|F|1995-05-24|1995-07-08|1995-05-26|DELIVER IN PERSON|RAIL|old accounts poach alongside of the spe +44068|1327|42|2|33|40534.56|0.02|0.06|A|F|1995-05-31|1995-07-27|1995-06-16|NONE|SHIP| ironic ideas impress carefully unusual acc +44068|87|88|3|39|38496.12|0.00|0.00|N|O|1995-09-05|1995-06-12|1995-09-25|DELIVER IN PERSON|AIR|posits among the fu +44068|1054|25|4|41|39157.05|0.02|0.02|N|O|1995-07-13|1995-06-27|1995-08-03|COLLECT COD|MAIL|ess, ironic instructions are along the regu +44069|634|35|1|11|16880.93|0.08|0.05|A|F|1994-03-23|1994-03-25|1994-04-02|NONE|REG AIR|s. slyly special decoys throughout the +44069|986|55|2|49|92462.02|0.01|0.08|R|F|1994-04-09|1994-02-22|1994-05-06|TAKE BACK RETURN|MAIL|blithely pending requests are +44069|1966|99|3|38|70982.48|0.09|0.03|R|F|1994-04-22|1994-03-02|1994-04-27|COLLECT COD|TRUCK|e express deposits. carefully +44069|1908|53|4|1|1809.90|0.05|0.08|R|F|1994-03-30|1994-02-16|1994-04-01|NONE|SHIP|; silent th +44070|1965|10|1|17|31738.32|0.02|0.08|N|O|1997-09-28|1997-12-15|1997-10-26|COLLECT COD|REG AIR| regular deposits. re +44070|1476|55|2|19|26171.93|0.10|0.00|N|O|1997-11-21|1997-10-26|1997-12-12|NONE|RAIL|gular accounts cajole furiously accordin +44070|448|7|3|24|32362.56|0.08|0.07|N|O|1997-12-01|1997-10-31|1997-12-21|DELIVER IN PERSON|SHIP|ironic, express excuses haggle un +44070|731|32|4|25|40793.25|0.06|0.05|N|O|1997-12-10|1997-11-02|1998-01-09|COLLECT COD|REG AIR|brave accounts. special packages boos +44070|479|80|5|46|63455.62|0.07|0.07|N|O|1997-12-28|1997-12-07|1998-01-03|TAKE BACK RETURN|TRUCK|e to cajole along the furious +44070|1505|26|6|14|19691.00|0.09|0.04|N|O|1997-12-25|1997-11-30|1998-01-21|NONE|REG AIR|he special, even in +44070|1422|62|7|15|19851.30|0.01|0.00|N|O|1997-10-18|1997-12-15|1997-10-28|DELIVER IN PERSON|RAIL|pending packages wake according to +44071|1628|29|1|37|56595.94|0.09|0.01|A|F|1992-05-18|1992-06-01|1992-05-21|TAKE BACK RETURN|TRUCK|y final requests. regular, even pack +44071|827|28|2|6|10366.92|0.00|0.07|A|F|1992-04-17|1992-06-14|1992-04-30|TAKE BACK RETURN|SHIP|efully final ideas ab +44071|815|82|3|27|46326.87|0.04|0.07|R|F|1992-05-14|1992-06-20|1992-05-26|TAKE BACK RETURN|MAIL|osits boost caref +44071|1236|48|4|29|32979.67|0.04|0.05|A|F|1992-08-08|1992-05-27|1992-08-10|COLLECT COD|TRUCK|s. final pinto beans na +44096|1220|21|1|15|16818.30|0.03|0.02|N|O|1997-05-30|1997-03-22|1997-06-19|TAKE BACK RETURN|FOB|slyly express requests impress. furiously +44096|648|49|2|15|23229.60|0.06|0.07|N|O|1997-03-26|1997-04-17|1997-04-11|TAKE BACK RETURN|TRUCK|as are furiously along the blithely ir +44096|129|8|3|39|40135.68|0.07|0.05|N|O|1997-03-27|1997-04-29|1997-04-16|NONE|FOB|ecial theodolites. even requests mainta +44096|15|41|4|13|11895.13|0.00|0.01|N|O|1997-03-19|1997-03-26|1997-04-11|NONE|MAIL|uests use slyly along +44096|196|75|5|39|42751.41|0.00|0.07|N|O|1997-03-30|1997-04-23|1997-04-29|NONE|MAIL|ound the slyly even foxes haggle fur +44096|1521|42|6|45|64013.40|0.01|0.03|N|O|1997-01-30|1997-04-23|1997-02-07|COLLECT COD|FOB|pecial acc +44096|278|79|7|17|20030.59|0.03|0.00|N|O|1997-04-22|1997-04-13|1997-05-11|DELIVER IN PERSON|AIR|ly express asym +44097|1949|38|1|10|18509.40|0.06|0.08|N|O|1996-03-01|1996-01-23|1996-03-14|DELIVER IN PERSON|RAIL|ding to the quickly +44097|1850|94|2|4|7007.40|0.07|0.00|N|O|1996-02-10|1996-03-07|1996-02-25|DELIVER IN PERSON|SHIP|ts promise quickly. bli +44098|1896|97|1|40|71915.60|0.10|0.06|A|F|1993-03-31|1993-04-12|1993-04-10|NONE|MAIL|oxes around the slyly unusu +44098|156|83|2|21|22179.15|0.05|0.00|A|F|1993-05-27|1993-03-27|1993-06-11|COLLECT COD|TRUCK|hely daring platelets use closely abo +44098|451|39|3|32|43246.40|0.06|0.07|A|F|1993-04-28|1993-03-05|1993-05-01|NONE|TRUCK|ing dolphins. carefully unusual re +44098|209|37|4|43|47695.60|0.05|0.01|A|F|1993-02-25|1993-04-06|1993-03-04|TAKE BACK RETURN|RAIL|yly express accounts aft +44098|1618|1|5|18|27352.98|0.08|0.01|A|F|1993-03-20|1993-03-29|1993-03-31|TAKE BACK RETURN|RAIL|gular deposit +44098|1668|92|6|30|47089.80|0.07|0.00|A|F|1993-02-10|1993-04-26|1993-02-28|COLLECT COD|FOB|inal, quiet accounts haggle enticingl +44099|101|54|1|10|10011.00|0.09|0.07|R|F|1992-06-04|1992-05-07|1992-06-16|TAKE BACK RETURN|RAIL|ons. regular deposits haggle carefully expr +44099|1073|79|2|24|23377.68|0.01|0.04|R|F|1992-04-29|1992-05-11|1992-05-01|TAKE BACK RETURN|SHIP| pinto beans hinder furiously special +44099|356|85|3|24|30152.40|0.05|0.03|A|F|1992-05-11|1992-05-03|1992-05-30|TAKE BACK RETURN|AIR| quickly ironic excuses a +44099|278|79|4|28|32991.56|0.02|0.00|R|F|1992-04-08|1992-05-02|1992-04-24|NONE|REG AIR| wake furi +44099|1887|74|5|36|64399.68|0.00|0.03|A|F|1992-04-03|1992-04-30|1992-05-03|NONE|REG AIR|ess packages integrate furiously. unusu +44099|625|88|6|3|4576.86|0.08|0.05|R|F|1992-04-10|1992-05-08|1992-04-17|COLLECT COD|RAIL|gular excus +44100|133|60|1|2|2066.26|0.10|0.06|N|O|1998-07-17|1998-08-12|1998-07-21|COLLECT COD|AIR| slyly unusual depths into the theod +44101|1005|6|1|12|10872.00|0.02|0.05|N|O|1996-04-17|1996-04-12|1996-05-15|DELIVER IN PERSON|AIR| final theodo +44101|1279|91|2|2|2360.54|0.04|0.03|N|O|1996-02-24|1996-02-23|1996-03-23|DELIVER IN PERSON|SHIP|lar requests +44101|840|74|3|17|29594.28|0.02|0.04|N|O|1996-03-28|1996-03-20|1996-04-01|NONE|TRUCK|d pinto beans about the furio +44101|1788|15|4|29|49003.62|0.01|0.05|N|O|1996-02-07|1996-03-29|1996-02-21|COLLECT COD|FOB|old requests. carefully +44101|322|51|5|16|19557.12|0.09|0.03|N|O|1996-04-03|1996-03-30|1996-04-24|NONE|REG AIR|. deposits sleep furiously. slyly regula +44101|1194|67|6|1|1095.19|0.03|0.06|N|O|1996-03-14|1996-03-19|1996-04-06|COLLECT COD|SHIP|pending packages are final, fina +44102|1494|95|1|20|27909.80|0.08|0.04|R|F|1995-03-17|1995-03-13|1995-03-21|NONE|SHIP|e fluffily. regular, fi +44102|1626|9|2|18|27497.16|0.01|0.04|A|F|1995-03-21|1995-02-18|1995-04-02|TAKE BACK RETURN|RAIL|y special packages. final accoun +44102|633|96|3|5|7668.15|0.04|0.06|R|F|1995-02-18|1995-04-04|1995-03-11|NONE|TRUCK|ag carefully +44102|846|80|4|43|75114.12|0.01|0.08|R|F|1995-02-25|1995-02-28|1995-02-27|TAKE BACK RETURN|RAIL|blithely special acco +44102|594|95|5|30|44837.70|0.09|0.06|R|F|1995-04-21|1995-04-14|1995-04-26|DELIVER IN PERSON|REG AIR| slyly silen +44102|1015|51|6|49|44884.49|0.03|0.03|R|F|1995-05-13|1995-02-27|1995-05-22|COLLECT COD|SHIP| to the special, final depo +44102|773|6|7|18|30127.86|0.09|0.02|R|F|1995-05-07|1995-02-24|1995-06-01|TAKE BACK RETURN|TRUCK|inal platelets nag enticingly. fi +44103|2|28|1|50|45100.00|0.02|0.00|N|O|1997-02-14|1997-05-03|1997-03-12|COLLECT COD|SHIP|y even pinto beans are furio +44103|429|88|2|27|35894.34|0.02|0.08|N|O|1997-04-24|1997-05-01|1997-05-09|DELIVER IN PERSON|MAIL|es. carefully regu +44128|52|53|1|31|29513.55|0.07|0.02|N|O|1996-12-15|1997-02-08|1996-12-21|NONE|RAIL|around the quickly bol +44128|107|8|2|12|12085.20|0.01|0.04|N|O|1997-02-02|1996-12-25|1997-02-16|DELIVER IN PERSON|FOB|ely regular asymptotes. fluffily final pac +44129|1018|24|1|14|12866.14|0.04|0.03|N|O|1998-07-03|1998-05-15|1998-07-24|NONE|FOB| dependencies +44129|219|20|2|22|24622.62|0.05|0.07|N|O|1998-06-14|1998-04-23|1998-06-18|COLLECT COD|FOB|g to the thinly final exc +44129|105|84|3|31|31158.10|0.08|0.03|N|O|1998-05-07|1998-05-08|1998-05-21|COLLECT COD|SHIP|e quickly ironic accounts was qui +44130|1060|31|1|42|40364.52|0.07|0.02|N|O|1996-04-11|1996-04-25|1996-05-07|COLLECT COD|AIR|lphins are. deposits w +44130|1080|16|2|12|11772.96|0.00|0.01|N|O|1996-03-31|1996-03-22|1996-04-28|COLLECT COD|RAIL|es integrate blithely regular deposit +44130|479|9|3|42|57937.74|0.10|0.01|N|O|1996-04-08|1996-04-11|1996-04-17|TAKE BACK RETURN|REG AIR|y pending accounts boost silent +44130|676|70|4|43|67796.81|0.09|0.03|N|O|1996-04-07|1996-04-28|1996-04-13|TAKE BACK RETURN|AIR|ffily pending deposits. fluffil +44130|870|37|5|22|38959.14|0.01|0.08|N|O|1996-03-27|1996-04-24|1996-04-14|COLLECT COD|TRUCK|carefully even ideas. furiously special a +44130|247|2|6|30|34417.20|0.01|0.00|N|O|1996-04-01|1996-04-03|1996-04-18|NONE|FOB|arefully iron +44130|1913|14|7|39|70781.49|0.03|0.00|N|O|1996-03-31|1996-02-28|1996-04-30|NONE|RAIL|ecial excuses cajole slyly pa +44131|289|71|1|33|39246.24|0.10|0.07|N|O|1997-12-21|1998-01-09|1998-01-14|NONE|SHIP|affix along the ruthlessly regular acco +44131|518|9|2|37|52484.87|0.06|0.07|N|O|1998-01-01|1997-12-11|1998-01-15|TAKE BACK RETURN|REG AIR|ts alongside of the requests sublat +44131|896|63|3|11|19765.79|0.08|0.02|N|O|1998-02-15|1997-11-29|1998-02-24|NONE|RAIL|hinly. silen +44131|281|36|4|19|22444.32|0.00|0.02|N|O|1997-12-09|1998-01-10|1998-01-03|NONE|REG AIR|fully regular instructions. carefu +44131|1249|61|5|48|55211.52|0.00|0.01|N|O|1998-02-09|1997-12-03|1998-02-28|DELIVER IN PERSON|MAIL|lly bold ideas. bold, silent packages promi +44131|590|21|6|13|19377.67|0.02|0.08|N|O|1997-11-04|1997-12-03|1997-11-14|NONE|RAIL|ar accounts. unusual theodolites nag +44132|1486|87|1|32|44399.36|0.09|0.00|N|O|1997-04-25|1997-04-30|1997-05-13|TAKE BACK RETURN|MAIL|l accounts. carefu +44132|1789|74|2|26|43960.28|0.00|0.05|N|O|1997-07-04|1997-05-14|1997-07-26|COLLECT COD|RAIL| frets! furiously ironic accounts desp +44132|1302|79|3|13|15642.90|0.02|0.06|N|O|1997-05-31|1997-05-26|1997-06-03|NONE|SHIP|equests. even hockey +44132|1285|23|4|13|15421.64|0.01|0.06|N|O|1997-06-25|1997-05-09|1997-07-12|NONE|AIR|ious dependencies +44133|1125|98|1|23|23600.76|0.03|0.04|A|F|1993-02-05|1993-02-25|1993-02-09|TAKE BACK RETURN|RAIL|ng accounts nag. furiously silen +44133|1892|79|2|25|44847.25|0.02|0.07|R|F|1993-04-29|1993-03-24|1993-05-18|COLLECT COD|REG AIR|sly according to the pendin +44133|492|80|3|18|25064.82|0.00|0.08|A|F|1993-02-03|1993-03-04|1993-02-07|TAKE BACK RETURN|MAIL|ly ironic packages +44134|705|38|1|15|24085.50|0.04|0.08|A|F|1995-02-15|1995-01-24|1995-03-17|NONE|TRUCK|c deposits; carefully special +44134|810|11|2|16|27372.96|0.06|0.03|A|F|1995-02-04|1994-12-23|1995-03-01|TAKE BACK RETURN|SHIP|ns integrate +44134|787|52|3|44|74262.32|0.00|0.02|R|F|1995-01-24|1995-01-27|1995-02-15|TAKE BACK RETURN|RAIL| about the blithely ironic pinto beans. +44134|1943|88|4|50|92247.00|0.03|0.03|A|F|1995-01-16|1994-12-02|1995-02-11|TAKE BACK RETURN|REG AIR|es. bold excuses unwind blithely about +44135|838|39|1|38|66075.54|0.02|0.04|R|F|1994-12-25|1994-12-28|1995-01-07|COLLECT COD|REG AIR|slyly special reques +44135|1455|56|2|6|8138.70|0.10|0.04|R|F|1995-02-04|1995-01-21|1995-02-14|COLLECT COD|MAIL|dolites. furiously regular packages e +44160|1720|5|1|36|58381.92|0.00|0.02|N|O|1997-03-15|1997-02-06|1997-04-02|DELIVER IN PERSON|AIR|ts. pending, unusu +44160|1505|6|2|49|68918.50|0.01|0.04|N|O|1996-12-02|1996-12-25|1996-12-22|DELIVER IN PERSON|TRUCK|thes affix ent +44160|155|34|3|6|6330.90|0.04|0.06|N|O|1997-02-14|1997-01-16|1997-02-22|COLLECT COD|SHIP|nal pinto +44160|1889|90|4|23|41190.24|0.07|0.02|N|O|1997-02-20|1996-12-31|1997-03-11|TAKE BACK RETURN|TRUCK|ngside of +44161|1095|31|1|5|4980.45|0.02|0.06|N|O|1996-10-05|1996-10-23|1996-10-08|DELIVER IN PERSON|MAIL|ix after the brave, iro +44162|1380|95|1|20|25627.60|0.03|0.06|R|F|1993-06-18|1993-05-01|1993-06-20|DELIVER IN PERSON|AIR|ters haggle quickly across +44163|1075|46|1|38|37090.66|0.10|0.04|N|O|1997-05-10|1997-03-02|1997-06-01|TAKE BACK RETURN|REG AIR|dolites. speci +44163|1258|96|2|39|45210.75|0.07|0.00|N|O|1997-04-25|1997-02-19|1997-05-07|TAKE BACK RETURN|TRUCK|icing escapades +44163|1146|47|3|28|29319.92|0.03|0.05|N|O|1997-05-01|1997-04-08|1997-05-10|COLLECT COD|MAIL|longside of t +44163|1337|76|4|16|19813.28|0.10|0.06|N|O|1997-02-07|1997-04-09|1997-02-25|COLLECT COD|MAIL|tornis ought +44163|1084|90|5|43|42358.44|0.00|0.02|N|O|1997-01-26|1997-04-07|1997-02-06|NONE|SHIP|ackages above the express requests wake fu +44163|1467|68|6|4|5473.84|0.00|0.06|N|O|1997-02-10|1997-03-31|1997-03-03|DELIVER IN PERSON|SHIP|y; final packages cajo +44164|447|48|1|42|56592.48|0.08|0.01|N|O|1996-06-10|1996-06-12|1996-07-05|COLLECT COD|RAIL|fily packages. silent pinto +44165|786|87|1|44|74218.32|0.03|0.01|N|O|1996-10-24|1996-10-14|1996-11-05|COLLECT COD|TRUCK|furiously +44165|1920|53|2|23|41904.16|0.08|0.00|N|O|1996-10-13|1996-10-13|1996-10-19|COLLECT COD|FOB|final, regu +44165|533|94|3|41|58774.73|0.07|0.03|N|O|1996-10-21|1996-10-23|1996-11-11|NONE|TRUCK| ironic, pending p +44165|746|43|4|2|3293.48|0.09|0.03|N|O|1996-09-15|1996-09-19|1996-09-23|COLLECT COD|AIR|uests eat blithely regular ideas. +44165|1964|97|5|24|44783.04|0.05|0.06|N|O|1996-09-12|1996-09-10|1996-10-03|COLLECT COD|MAIL|asymptotes use caref +44165|1546|67|6|35|50663.90|0.04|0.06|N|O|1996-10-18|1996-10-11|1996-11-17|COLLECT COD|FOB|equests are blithely furiously unusual acco +44165|602|96|7|31|46580.60|0.00|0.08|N|O|1996-09-15|1996-10-15|1996-09-27|NONE|AIR| express requests after the careful +44166|738|3|1|21|34413.33|0.04|0.08|N|O|1997-12-14|1998-02-21|1998-01-04|NONE|MAIL|ndle about the slyly ironi +44166|727|60|2|9|14649.48|0.10|0.00|N|O|1997-12-08|1998-01-22|1997-12-24|TAKE BACK RETURN|RAIL| would wake carefully according +44166|371|72|3|47|59754.39|0.03|0.04|N|O|1998-01-02|1998-01-19|1998-01-26|COLLECT COD|SHIP|onic, bold accounts breach fu +44166|1742|69|4|18|29587.32|0.04|0.02|N|O|1998-01-14|1998-01-29|1998-02-13|TAKE BACK RETURN|TRUCK|s cajole along the even, unusual requests. +44167|202|84|1|4|4408.80|0.09|0.07|A|F|1992-03-07|1992-03-20|1992-04-01|NONE|REG AIR|ithely ironic dugouts cajole fu +44167|1697|21|2|21|33572.49|0.06|0.00|A|F|1992-05-05|1992-03-28|1992-06-01|TAKE BACK RETURN|TRUCK|wake among the furious +44167|1329|6|3|28|34448.96|0.07|0.01|R|F|1992-03-02|1992-03-31|1992-03-29|NONE|AIR|xes across th +44167|1877|7|4|30|53366.10|0.05|0.08|A|F|1992-05-20|1992-03-19|1992-05-29|DELIVER IN PERSON|SHIP| bold foxes. silent dependencies use +44167|360|45|5|27|34029.72|0.04|0.03|R|F|1992-02-23|1992-04-13|1992-03-15|NONE|SHIP|t the fluffily even deposits u +44167|905|6|6|35|63206.50|0.05|0.07|R|F|1992-04-30|1992-03-27|1992-05-24|COLLECT COD|RAIL|final dolphins. silen +44192|991|26|1|40|75679.60|0.05|0.06|N|O|1997-09-20|1997-08-17|1997-10-13|TAKE BACK RETURN|FOB|efully final accounts. express fox +44192|1335|50|2|16|19781.28|0.00|0.05|N|O|1997-09-30|1997-09-27|1997-10-04|TAKE BACK RETURN|REG AIR|y even foxes along the +44193|1615|98|1|16|24265.76|0.00|0.07|N|O|1997-11-01|1997-09-27|1997-11-09|COLLECT COD|MAIL| after the carefully regular pint +44193|647|79|2|25|38691.00|0.00|0.04|N|O|1997-10-27|1997-10-24|1997-10-31|COLLECT COD|FOB|al foxes dazzle. +44193|452|40|3|2|2704.90|0.06|0.07|N|O|1997-09-02|1997-10-25|1997-09-10|COLLECT COD|SHIP|ng to the instructions sl +44193|1959|4|4|1|1860.95|0.06|0.05|N|O|1997-09-30|1997-10-16|1997-10-30|COLLECT COD|TRUCK|ructions. express instructio +44193|982|17|5|40|75319.20|0.00|0.06|N|O|1997-11-28|1997-10-31|1997-12-22|COLLECT COD|REG AIR|ckly. unus +44193|687|19|6|45|71445.60|0.07|0.05|N|O|1997-10-21|1997-10-09|1997-11-12|NONE|AIR|sly silent asymptotes gr +44194|266|67|1|26|30322.76|0.00|0.05|N|O|1996-10-19|1996-09-09|1996-11-18|DELIVER IN PERSON|REG AIR|ake across the final r +44194|1293|5|2|18|21497.22|0.07|0.00|N|O|1996-11-19|1996-09-11|1996-12-03|NONE|SHIP|o beans. carefully final requests abou +44194|655|56|3|32|49780.80|0.03|0.00|N|O|1996-09-27|1996-09-01|1996-10-18|COLLECT COD|RAIL|uriously against the s +44194|1627|28|4|43|65730.66|0.06|0.08|N|O|1996-09-05|1996-10-04|1996-09-25|DELIVER IN PERSON|RAIL|e quickly final pinto +44194|1209|84|5|40|44408.00|0.04|0.06|N|O|1996-08-19|1996-09-30|1996-09-15|DELIVER IN PERSON|AIR|special ideas se +44195|697|60|1|25|39942.25|0.01|0.02|N|O|1996-04-26|1996-04-14|1996-05-12|DELIVER IN PERSON|REG AIR|he furiously final deposits. deposits a +44195|1925|58|2|3|5480.76|0.01|0.02|N|O|1996-03-19|1996-04-19|1996-04-17|COLLECT COD|AIR|ions. carefully quiet asym +44195|1075|76|3|49|47827.43|0.10|0.02|N|O|1996-04-12|1996-04-04|1996-04-26|NONE|MAIL|ole carefully requests. packages haggl +44195|425|55|4|24|31810.08|0.05|0.08|N|O|1996-06-18|1996-03-25|1996-07-13|COLLECT COD|MAIL|regular theodolites sublate q +44196|1300|12|1|7|8409.10|0.04|0.01|R|F|1994-10-18|1994-09-27|1994-11-02|DELIVER IN PERSON|MAIL|gle with the blithely unusu +44196|54|55|2|40|38162.00|0.03|0.07|A|F|1994-08-28|1994-09-26|1994-09-08|DELIVER IN PERSON|RAIL|nusual ideas pr +44196|554|55|3|1|1454.55|0.01|0.02|R|F|1994-11-05|1994-11-03|1994-11-23|DELIVER IN PERSON|MAIL|ounts are caref +44197|677|40|1|37|58373.79|0.01|0.06|A|F|1994-03-07|1994-02-22|1994-03-14|TAKE BACK RETURN|RAIL|pades wake carefully until the careful +44197|1846|33|2|12|20974.08|0.07|0.01|R|F|1994-03-08|1994-04-11|1994-03-23|COLLECT COD|FOB|grate slyly according to +44197|1342|57|3|29|36056.86|0.03|0.00|A|F|1994-01-27|1994-04-21|1994-02-17|COLLECT COD|TRUCK|ly. blithely eve +44197|1374|75|4|5|6376.85|0.04|0.00|R|F|1994-05-04|1994-03-21|1994-05-12|COLLECT COD|FOB|oxes sleep carefully against +44197|488|76|5|49|68035.52|0.08|0.07|R|F|1994-01-22|1994-03-27|1994-02-16|NONE|AIR|lyly. fluffi +44197|885|52|6|13|23216.44|0.01|0.06|R|F|1994-03-30|1994-04-15|1994-04-09|DELIVER IN PERSON|MAIL|according to the regular, pending pin +44197|1590|91|7|23|34306.57|0.08|0.03|R|F|1994-03-10|1994-04-21|1994-03-12|COLLECT COD|FOB|ly final pains detect? regular +44198|1484|63|1|22|30480.56|0.02|0.00|A|F|1995-03-08|1995-03-17|1995-03-12|DELIVER IN PERSON|RAIL| according to the special, even dolphin +44198|920|55|2|6|10925.52|0.01|0.00|R|F|1995-01-12|1995-02-09|1995-02-08|TAKE BACK RETURN|AIR|s sleep slyly around +44198|855|56|3|23|40384.55|0.06|0.01|A|F|1995-01-17|1995-03-30|1995-02-06|COLLECT COD|MAIL|ang about the blithely even de +44198|1970|3|4|25|46799.25|0.07|0.00|R|F|1995-03-05|1995-03-05|1995-03-31|TAKE BACK RETURN|AIR|thely above the +44198|1097|33|5|15|14971.35|0.09|0.05|A|F|1995-05-05|1995-04-03|1995-05-15|DELIVER IN PERSON|RAIL|onic deposits. slyly regular deposits w +44199|1209|47|1|10|11102.00|0.07|0.02|A|F|1992-06-07|1992-04-04|1992-07-03|TAKE BACK RETURN|TRUCK|t the quickly regular deposits. +44199|1017|53|2|19|17442.19|0.02|0.08|A|F|1992-06-26|1992-04-09|1992-07-05|NONE|RAIL| players print quietly express, +44199|926|95|3|23|42019.16|0.06|0.02|R|F|1992-04-30|1992-05-25|1992-05-19|NONE|REG AIR|d the blithely unusual deposits-- special, +44199|1898|99|4|41|73795.49|0.08|0.08|A|F|1992-04-07|1992-05-13|1992-05-06|NONE|MAIL|tructions are across the quickl +44199|1991|92|5|12|22715.88|0.00|0.07|R|F|1992-04-09|1992-04-06|1992-04-28|COLLECT COD|MAIL|l asymptotes nag fluffily careful +44224|1519|100|1|8|11364.08|0.07|0.07|A|F|1993-09-29|1993-10-23|1993-10-05|COLLECT COD|REG AIR|ructions. slyly regular instruction +44224|542|43|2|33|47603.82|0.01|0.04|A|F|1993-11-06|1993-09-19|1993-12-03|TAKE BACK RETURN|SHIP|kages. carefully special ideas use slyl +44225|114|93|1|36|36507.96|0.09|0.05|A|F|1994-04-26|1994-05-14|1994-05-09|COLLECT COD|SHIP|quests against the furiously regular br +44225|1437|77|2|17|22753.31|0.03|0.00|A|F|1994-07-04|1994-05-23|1994-08-02|TAKE BACK RETURN|FOB|ests; regular platel +44225|1574|55|3|37|54596.09|0.02|0.01|R|F|1994-05-28|1994-05-16|1994-06-10|TAKE BACK RETURN|MAIL|blithely even +44225|270|25|4|13|15213.51|0.06|0.06|A|F|1994-06-12|1994-05-09|1994-06-16|NONE|RAIL| hinder. ironic accounts wake qu +44225|1801|88|5|27|45975.60|0.09|0.05|R|F|1994-04-25|1994-07-03|1994-05-22|NONE|AIR|shall affix slyly quickly ironic pinto +44225|1508|89|6|19|26780.50|0.08|0.04|R|F|1994-05-06|1994-06-18|1994-05-11|TAKE BACK RETURN|SHIP|ke slyly gifts. blit +44225|182|61|7|7|7575.26|0.08|0.04|A|F|1994-06-16|1994-06-03|1994-07-10|COLLECT COD|SHIP|ly ironic excuses cajole. s +44226|1237|75|1|9|10244.07|0.05|0.07|N|O|1996-01-19|1996-02-16|1996-02-16|TAKE BACK RETURN|FOB|gs. furiously even excuses acr +44227|1178|87|1|9|9712.53|0.02|0.03|A|F|1992-07-10|1992-06-03|1992-08-09|COLLECT COD|AIR|deposits. accounts un +44227|839|73|2|13|22617.79|0.01|0.00|A|F|1992-07-11|1992-05-06|1992-08-07|NONE|REG AIR|nic asymptotes +44227|1083|19|3|47|46251.76|0.04|0.00|A|F|1992-03-27|1992-06-06|1992-03-31|COLLECT COD|MAIL|boost. regular accounts use careful +44227|1985|86|4|30|56609.40|0.00|0.00|A|F|1992-04-09|1992-05-13|1992-04-29|NONE|SHIP|nag about the fluffily pending r +44228|1483|23|1|3|4153.44|0.09|0.07|N|O|1998-04-18|1998-06-05|1998-05-17|COLLECT COD|MAIL|ffily regular requests +44228|681|82|2|39|61685.52|0.03|0.03|N|O|1998-06-04|1998-04-21|1998-06-29|DELIVER IN PERSON|AIR|ly? carefully pending theodolites +44228|391|48|3|13|16788.07|0.08|0.06|N|O|1998-07-06|1998-05-25|1998-07-16|NONE|FOB|final accounts. blithely ex +44228|1443|61|4|8|10755.52|0.02|0.07|N|O|1998-04-26|1998-04-22|1998-05-01|NONE|REG AIR|carefully special pinto +44228|1468|8|5|39|53408.94|0.03|0.01|N|O|1998-05-05|1998-05-22|1998-05-17|DELIVER IN PERSON|REG AIR|nusual excu +44229|1698|99|1|44|70386.36|0.03|0.08|A|F|1993-09-02|1993-07-03|1993-09-18|TAKE BACK RETURN|AIR|after the qu +44229|1826|56|2|49|84663.18|0.02|0.01|R|F|1993-07-06|1993-07-28|1993-07-21|NONE|TRUCK|ending foxes: slyly unusual patte +44229|1052|53|3|24|22873.20|0.05|0.00|A|F|1993-08-07|1993-07-24|1993-09-06|DELIVER IN PERSON|TRUCK|ts are thinly above the fu +44230|1756|99|1|17|28181.75|0.04|0.01|R|F|1993-06-23|1993-05-17|1993-07-05|DELIVER IN PERSON|FOB|nts cajole f +44231|143|44|1|15|15647.10|0.08|0.01|R|F|1995-01-24|1995-01-07|1995-02-07|COLLECT COD|SHIP|requests. furiously bold +44231|966|69|2|43|80279.28|0.07|0.06|R|F|1994-12-04|1994-12-24|1994-12-09|NONE|SHIP|oxes. packages after the i +44231|1436|37|3|6|8024.58|0.03|0.04|A|F|1994-12-21|1994-12-31|1994-12-25|DELIVER IN PERSON|RAIL|luffily even fo +44231|1231|6|4|19|21512.37|0.09|0.01|R|F|1994-12-14|1995-01-15|1995-01-03|TAKE BACK RETURN|FOB|ans after the regular notornis +44231|427|86|5|44|58406.48|0.03|0.07|A|F|1995-01-19|1994-12-06|1995-02-03|DELIVER IN PERSON|AIR|es wake above the deposits. final packages +44231|1963|96|6|28|52218.88|0.04|0.04|R|F|1995-02-01|1995-01-07|1995-02-07|TAKE BACK RETURN|AIR|sual accounts haggle +44231|1668|92|7|6|9417.96|0.09|0.07|R|F|1994-12-23|1994-12-14|1995-01-18|TAKE BACK RETURN|FOB|ounts. even depo +44256|1653|95|1|45|69959.25|0.09|0.06|N|O|1996-01-08|1996-01-09|1996-01-21|NONE|TRUCK|ons are fluffily. theodolit +44256|765|62|2|44|73293.44|0.00|0.02|N|O|1996-02-11|1995-12-29|1996-03-02|COLLECT COD|AIR|ideas sublate past the fu +44256|167|46|3|19|20276.04|0.07|0.08|N|O|1995-11-29|1996-01-17|1995-12-20|DELIVER IN PERSON|RAIL|along the requests: furiously bold accoun +44256|743|8|4|35|57530.90|0.03|0.08|N|O|1995-12-07|1996-01-23|1996-01-06|COLLECT COD|TRUCK|kages boost ironic accounts. fluf +44256|10|86|5|10|9100.10|0.00|0.01|N|O|1996-02-20|1996-01-28|1996-03-02|NONE|TRUCK|ly. carefully even platele +44256|1857|1|6|32|56283.20|0.04|0.00|N|O|1996-02-01|1996-01-20|1996-02-03|DELIVER IN PERSON|RAIL|aringly blithely pending re +44257|255|37|1|24|27726.00|0.02|0.01|N|O|1996-11-06|1996-11-29|1996-11-22|DELIVER IN PERSON|FOB|ckages are blithely besides the iro +44257|1744|87|2|13|21394.62|0.05|0.07|N|O|1996-10-05|1996-11-01|1996-10-15|DELIVER IN PERSON|SHIP|slyly ironic requests. ideas da +44257|1655|38|3|29|45142.85|0.07|0.00|N|O|1996-10-03|1996-10-23|1996-10-14|COLLECT COD|REG AIR| fluffily final accoun +44257|1512|13|4|41|57953.91|0.10|0.02|N|O|1996-09-23|1996-11-23|1996-10-09|COLLECT COD|SHIP|e packages. furiously regular multipliers +44257|662|63|5|32|50005.12|0.01|0.03|N|O|1996-11-12|1996-12-07|1996-12-02|NONE|REG AIR|tornis. accounts maintain furiou +44257|21|97|6|50|46051.00|0.05|0.03|N|O|1996-12-25|1996-10-20|1997-01-08|NONE|REG AIR|leep carefully. special, +44257|174|1|7|28|30076.76|0.06|0.05|N|O|1996-09-17|1996-11-13|1996-09-25|DELIVER IN PERSON|TRUCK|ully even pinto beans. re +44258|415|16|1|39|51300.99|0.08|0.03|R|F|1994-10-03|1994-08-27|1994-10-17|DELIVER IN PERSON|SHIP|es according to the accounts nag fro +44258|112|91|2|24|24290.64|0.09|0.03|A|F|1994-08-10|1994-08-15|1994-08-31|COLLECT COD|SHIP|y slyly daring theodolites. furiously pendi +44258|1984|17|3|30|56579.40|0.01|0.06|A|F|1994-09-11|1994-07-20|1994-10-09|COLLECT COD|AIR|ully regular deposits. slyly pending asym +44258|776|9|4|25|41919.25|0.04|0.01|R|F|1994-07-02|1994-07-11|1994-07-07|NONE|FOB| the slyly unusua +44259|1783|68|1|48|80869.44|0.03|0.00|N|O|1997-09-16|1997-10-19|1997-09-27|DELIVER IN PERSON|SHIP|kages nag slyly above the pending +44260|560|91|1|13|18987.28|0.05|0.02|N|O|1998-05-08|1998-05-07|1998-05-22|COLLECT COD|AIR| express requests boost according to the q +44260|1564|5|2|22|32242.32|0.02|0.01|N|O|1998-04-22|1998-04-29|1998-05-18|COLLECT COD|SHIP|kly bold e +44261|63|64|1|37|35633.22|0.02|0.03|R|F|1992-05-13|1992-05-02|1992-06-03|NONE|AIR|bove the carefully pending pac +44261|151|78|2|23|24176.45|0.04|0.05|R|F|1992-07-08|1992-06-08|1992-07-19|NONE|SHIP|l, express p +44261|1077|83|3|49|47925.43|0.06|0.05|A|F|1992-06-29|1992-06-01|1992-07-11|COLLECT COD|RAIL|s. blithely unusual +44261|22|48|4|24|22128.48|0.06|0.06|R|F|1992-05-01|1992-05-03|1992-05-09|NONE|MAIL|. ironic, regular frets nag quickly alon +44261|856|57|5|23|40407.55|0.04|0.06|R|F|1992-05-02|1992-04-30|1992-05-31|COLLECT COD|FOB|ithely even +44261|276|31|6|2|2352.54|0.05|0.07|R|F|1992-07-10|1992-06-12|1992-07-13|NONE|REG AIR|d the unusual, fi +44261|253|8|7|35|40363.75|0.09|0.00|A|F|1992-04-10|1992-06-21|1992-04-20|NONE|TRUCK|packages run quickly carefull +44262|1018|24|1|13|11947.13|0.07|0.05|R|F|1994-06-20|1994-07-11|1994-07-05|DELIVER IN PERSON|RAIL|sleep blithely blithely express platelets. +44263|1028|99|1|1|929.02|0.10|0.02|N|O|1998-06-19|1998-06-25|1998-07-17|TAKE BACK RETURN|FOB|nstructions nag blithely! final, ironic +44263|1597|98|2|41|61442.19|0.06|0.01|N|O|1998-05-31|1998-05-23|1998-06-21|COLLECT COD|SHIP| furiously. slyly unusual foxes boost even, +44263|342|27|3|10|12423.40|0.03|0.00|N|O|1998-07-19|1998-06-30|1998-08-06|NONE|SHIP| packages. +44263|1974|75|4|40|75038.80|0.06|0.03|N|O|1998-06-04|1998-07-04|1998-06-05|TAKE BACK RETURN|AIR|pinto beans haggle furiously regular Ti +44263|1300|75|5|21|25227.30|0.10|0.08|N|O|1998-07-01|1998-06-27|1998-07-27|TAKE BACK RETURN|REG AIR|furiously. bold pac +44263|1024|60|6|24|22200.48|0.01|0.04|N|O|1998-08-04|1998-06-04|1998-08-22|NONE|MAIL|ounts haggle slyly. carefully bold instruc +44263|673|36|7|12|18884.04|0.10|0.03|N|O|1998-05-17|1998-06-07|1998-06-04|COLLECT COD|RAIL|round the furiously regular foxe +44288|716|17|1|20|32334.20|0.05|0.00|N|O|1997-01-15|1997-01-19|1997-01-26|DELIVER IN PERSON|RAIL|p evenly regular foxes. blithe +44288|1745|72|2|30|49402.20|0.05|0.08|N|O|1996-11-30|1996-12-24|1996-12-14|TAKE BACK RETURN|RAIL|iously furiously even accoun +44288|1703|30|3|8|12837.60|0.10|0.08|N|O|1997-02-11|1997-01-07|1997-02-17|COLLECT COD|MAIL| express, thin asymptotes alongside of t +44288|558|89|4|45|65634.75|0.01|0.08|N|O|1996-12-06|1996-12-30|1996-12-25|TAKE BACK RETURN|RAIL|eposits: slyly dar +44288|510|41|5|50|70525.50|0.00|0.07|N|O|1997-02-08|1996-12-20|1997-02-20|DELIVER IN PERSON|SHIP| silent requests coul +44289|1549|50|1|19|27560.26|0.06|0.05|N|O|1996-08-27|1996-10-23|1996-09-04|DELIVER IN PERSON|AIR|cial packages haggle furiously +44289|488|76|2|49|68035.52|0.03|0.02|N|O|1996-08-24|1996-10-22|1996-09-08|TAKE BACK RETURN|RAIL|unusual dolphins. slyl +44290|342|27|1|30|37270.20|0.03|0.01|A|F|1993-06-07|1993-05-16|1993-07-01|NONE|TRUCK| alongside of the fluffily even requests b +44290|297|52|2|47|56272.63|0.04|0.01|A|F|1993-05-12|1993-05-10|1993-05-15|DELIVER IN PERSON|MAIL|cajole aft +44290|1595|76|3|28|41904.52|0.05|0.08|A|F|1993-04-02|1993-05-03|1993-04-20|TAKE BACK RETURN|TRUCK|nic foxes wake bus +44290|668|62|4|1|1568.66|0.00|0.04|R|F|1993-03-23|1993-06-12|1993-03-26|DELIVER IN PERSON|SHIP|al dependencies. slyly regular pac +44290|942|77|5|49|90304.06|0.08|0.05|A|F|1993-07-10|1993-05-11|1993-07-24|NONE|FOB|ickly according +44290|1911|44|6|4|7251.64|0.03|0.06|A|F|1993-06-01|1993-05-21|1993-06-25|TAKE BACK RETURN|SHIP|its sleep blithely fluffily regular +44290|1537|18|7|4|5754.12|0.08|0.07|A|F|1993-04-29|1993-06-08|1993-05-09|COLLECT COD|SHIP| quickly final excu +44291|913|82|1|11|19953.01|0.04|0.04|N|O|1996-01-25|1996-03-08|1996-02-13|NONE|TRUCK|ly busy courts. quickly ironic gifts a +44292|105|32|1|27|27137.70|0.10|0.07|N|O|1995-07-09|1995-09-01|1995-07-20|COLLECT COD|REG AIR| after the carefully express pain +44292|575|6|2|44|64925.08|0.05|0.00|N|O|1995-08-02|1995-09-02|1995-08-22|TAKE BACK RETURN|FOB|to the regular, final instructions belie +44292|961|64|3|48|89374.08|0.06|0.05|N|O|1995-07-01|1995-07-18|1995-07-24|DELIVER IN PERSON|RAIL|iously. pending asymptotes +44292|372|73|4|19|24175.03|0.01|0.06|N|O|1995-08-17|1995-08-13|1995-09-15|TAKE BACK RETURN|RAIL| excuses use slowly instructions. furiou +44293|331|60|1|49|60335.17|0.07|0.02|N|O|1996-11-11|1996-10-04|1996-11-28|TAKE BACK RETURN|MAIL|the pending epitaphs wake across the +44293|794|27|2|2|3389.58|0.08|0.00|N|O|1996-07-30|1996-10-11|1996-08-04|TAKE BACK RETURN|TRUCK|en accounts affix slyly ac +44293|1112|21|3|18|18235.98|0.02|0.00|N|O|1996-08-19|1996-09-07|1996-09-16|COLLECT COD|FOB|h. slyly express +44293|1039|45|4|19|17860.57|0.02|0.06|N|O|1996-09-24|1996-09-04|1996-10-20|DELIVER IN PERSON|MAIL|ggle carefully around the pending request +44293|1664|65|5|36|56363.76|0.05|0.01|N|O|1996-09-23|1996-08-29|1996-10-12|COLLECT COD|FOB| final instructions after the never blith +44293|1430|9|6|25|33285.75|0.05|0.08|N|O|1996-10-18|1996-09-20|1996-11-12|COLLECT COD|RAIL|y even requests-- regular accounts unwind. +44293|1273|74|7|16|18788.32|0.04|0.00|N|O|1996-09-24|1996-10-15|1996-10-01|COLLECT COD|MAIL|ymptotes after the furiously pending accoun +44294|459|60|1|44|59815.80|0.04|0.06|A|F|1994-07-02|1994-08-20|1994-07-26|DELIVER IN PERSON|SHIP|uests are. bold platelets +44294|158|59|2|1|1058.15|0.02|0.04|A|F|1994-08-23|1994-07-17|1994-09-20|COLLECT COD|RAIL|egrate quickly slowly final pea +44294|1559|80|3|7|10223.85|0.04|0.04|A|F|1994-07-08|1994-07-26|1994-07-22|NONE|RAIL|ng theodolite +44294|553|44|4|2|2907.10|0.04|0.00|A|F|1994-07-25|1994-08-19|1994-08-19|TAKE BACK RETURN|MAIL|theodolites-- quickly pending +44294|1338|15|5|18|22307.94|0.04|0.02|R|F|1994-09-13|1994-08-21|1994-10-03|TAKE BACK RETURN|FOB|its? packages abov +44294|129|56|6|26|26757.12|0.09|0.03|R|F|1994-08-09|1994-07-08|1994-08-22|COLLECT COD|FOB|ickly ironic requests haggle +44295|947|50|1|6|11087.64|0.06|0.08|R|F|1993-05-08|1993-03-02|1993-05-23|COLLECT COD|FOB| special, even pinto beans. blithely stealt +44295|1900|1|2|34|61264.60|0.09|0.06|A|F|1993-05-06|1993-04-03|1993-05-31|COLLECT COD|RAIL|inal warthogs haggle above the blithe +44295|534|95|3|22|31559.66|0.06|0.08|R|F|1993-02-20|1993-02-24|1993-03-11|DELIVER IN PERSON|TRUCK|r deposits cajole instructions! slyly +44295|245|73|4|32|36647.68|0.04|0.02|A|F|1993-03-07|1993-04-06|1993-03-26|TAKE BACK RETURN|SHIP|le. blithely express ideas sleep slyly wi +44295|1304|81|5|16|19284.80|0.06|0.02|R|F|1993-04-01|1993-04-19|1993-04-09|COLLECT COD|REG AIR|phins are beside +44295|1486|4|6|5|6937.40|0.06|0.07|R|F|1993-03-09|1993-03-07|1993-03-26|COLLECT COD|FOB| bold courts alongside of +44295|432|62|7|37|49299.91|0.02|0.00|A|F|1993-03-04|1993-04-12|1993-03-05|TAKE BACK RETURN|TRUCK|ccounts. carefully express packages b +44320|1004|10|1|34|30770.00|0.08|0.06|A|F|1994-05-23|1994-07-25|1994-05-27|NONE|FOB|. bold frays ar +44321|1268|6|1|16|18708.16|0.06|0.06|N|O|1995-09-06|1995-08-27|1995-10-04|COLLECT COD|SHIP|e the final, un +44321|1115|88|2|34|34547.74|0.05|0.03|N|O|1995-07-31|1995-09-13|1995-08-29|COLLECT COD|FOB|lithely? even, +44321|1111|48|3|10|10121.10|0.08|0.06|N|O|1995-08-15|1995-08-19|1995-09-05|COLLECT COD|REG AIR| against the blithely express deposits. ca +44322|44|95|1|24|22656.96|0.10|0.00|N|O|1995-12-15|1995-12-13|1995-12-30|NONE|REG AIR|ithely sly instructions. slowly ironic +44322|1894|81|2|48|86202.72|0.04|0.01|N|O|1996-01-25|1995-11-26|1996-02-03|NONE|MAIL| packages haggle. ironi +44322|18|69|3|32|29376.32|0.03|0.08|N|O|1995-12-17|1995-12-13|1996-01-05|COLLECT COD|RAIL|uests are carefully asymptotes. +44322|369|54|4|3|3808.08|0.00|0.07|N|O|1996-02-06|1995-12-10|1996-02-28|DELIVER IN PERSON|AIR|oxes wake fl +44322|43|94|5|6|5658.24|0.04|0.01|N|O|1996-01-13|1995-12-30|1996-02-01|NONE|FOB|waters sleep. iro +44323|1669|11|1|9|14135.94|0.02|0.05|A|F|1992-12-02|1992-11-06|1992-12-24|DELIVER IN PERSON|SHIP|ronic plat +44323|946|15|2|48|88653.12|0.04|0.07|R|F|1992-12-04|1992-10-22|1992-12-07|COLLECT COD|AIR|nusual foxes use slyly acro +44323|1860|61|3|27|47570.22|0.03|0.08|R|F|1992-09-23|1992-10-31|1992-10-21|NONE|REG AIR| excuses haggle. regular, even deposits +44323|921|24|4|36|65589.12|0.08|0.08|R|F|1992-09-09|1992-09-18|1992-09-28|NONE|MAIL|s beyond the final, special request +44323|1032|33|5|15|13995.45|0.02|0.01|R|F|1992-09-05|1992-10-09|1992-09-10|DELIVER IN PERSON|SHIP|e unusual foxes. +44323|1032|3|6|17|15861.51|0.00|0.01|R|F|1992-08-15|1992-10-25|1992-08-27|TAKE BACK RETURN|AIR|requests against the slyly even instru +44323|489|90|7|31|43073.88|0.05|0.07|R|F|1992-10-03|1992-10-14|1992-10-14|TAKE BACK RETURN|RAIL|nal, special theodolites. furiously +44324|914|49|1|50|90745.50|0.01|0.06|N|O|1998-01-01|1997-12-29|1998-01-24|DELIVER IN PERSON|REG AIR|nst the bold requests; regular acc +44324|1199|72|2|1|1100.19|0.10|0.08|N|O|1998-02-09|1997-12-15|1998-03-07|DELIVER IN PERSON|SHIP| the slowly re +44324|141|94|3|25|26028.50|0.10|0.03|N|O|1997-11-10|1998-01-03|1997-11-19|COLLECT COD|RAIL|leep furiously after the final +44324|533|34|4|1|1433.53|0.01|0.01|N|O|1998-01-12|1997-12-12|1998-01-18|NONE|RAIL|ular pinto beans unwind +44324|1783|84|5|10|16847.80|0.01|0.07|N|O|1997-12-05|1997-12-05|1997-12-27|TAKE BACK RETURN|MAIL|ts across the furiously ironic pinto +44324|464|52|6|22|30018.12|0.09|0.04|N|O|1998-01-08|1998-01-14|1998-01-09|DELIVER IN PERSON|REG AIR|oxes. carefully express depos +44324|7|58|7|36|32652.00|0.04|0.02|N|O|1998-02-17|1997-12-20|1998-02-26|COLLECT COD|FOB|iously regular +44325|1431|71|1|24|31978.32|0.06|0.04|R|F|1994-03-21|1994-04-06|1994-03-27|DELIVER IN PERSON|REG AIR|gular frets around the ironi +44325|169|96|2|8|8553.28|0.01|0.05|A|F|1994-04-17|1994-05-02|1994-05-12|DELIVER IN PERSON|MAIL|packages wake fur +44326|1366|5|1|19|24079.84|0.00|0.00|A|F|1992-12-05|1992-10-27|1992-12-13|NONE|AIR|into beans h +44326|723|20|2|48|77938.56|0.07|0.03|R|F|1993-01-03|1992-11-20|1993-01-13|COLLECT COD|RAIL|theodolites wake furiously q +44327|882|49|1|39|69532.32|0.06|0.04|N|O|1998-01-19|1998-03-16|1998-02-17|COLLECT COD|TRUCK|old instructio +44327|413|14|2|34|44655.94|0.09|0.05|N|O|1998-01-23|1998-02-22|1998-01-26|DELIVER IN PERSON|FOB|ns sleep blithely +44327|791|56|3|4|6767.16|0.08|0.02|N|O|1998-04-06|1998-02-15|1998-04-25|COLLECT COD|RAIL|le quickly after the bl +44352|1334|73|1|7|8647.31|0.09|0.06|A|F|1994-10-04|1994-11-24|1994-10-13|NONE|RAIL|nst the blithely even pi +44352|1660|2|2|28|43726.48|0.05|0.03|R|F|1994-09-28|1994-12-14|1994-10-05|TAKE BACK RETURN|SHIP|s are fluffily slyly special pinto b +44352|56|57|3|24|22945.20|0.01|0.08|R|F|1994-11-10|1994-10-18|1994-11-26|COLLECT COD|MAIL|ccounts. blithely final ideas nag +44352|1723|66|4|9|14622.48|0.04|0.08|A|F|1995-01-03|1994-12-12|1995-01-17|TAKE BACK RETURN|REG AIR|deposits doze car +44352|195|96|5|25|27379.75|0.05|0.08|A|F|1995-01-10|1994-12-04|1995-02-05|TAKE BACK RETURN|REG AIR| above the requests must detect sl +44352|862|63|6|44|77565.84|0.04|0.01|R|F|1994-12-27|1994-11-11|1995-01-20|DELIVER IN PERSON|SHIP|refully blithely bold multiplier +44353|889|90|1|21|37587.48|0.08|0.02|R|F|1995-03-19|1995-04-21|1995-03-21|DELIVER IN PERSON|FOB|breach permanently +44353|1103|40|2|34|34139.40|0.06|0.03|A|F|1995-06-05|1995-03-13|1995-06-15|NONE|RAIL|sly final dolph +44353|483|71|3|10|13834.80|0.05|0.06|A|F|1995-04-25|1995-03-07|1995-05-03|DELIVER IN PERSON|TRUCK|osits. slyly final sentim +44353|891|25|4|49|87802.61|0.09|0.06|A|F|1995-05-18|1995-04-12|1995-05-27|TAKE BACK RETURN|MAIL|thrash instead o +44354|1717|44|1|17|27518.07|0.06|0.00|N|O|1997-08-26|1997-08-02|1997-09-12|COLLECT COD|FOB|bove the even, final depos +44354|962|63|2|28|52162.88|0.04|0.07|N|O|1997-07-27|1997-09-01|1997-08-04|COLLECT COD|RAIL|sits would wake. ex +44354|1759|44|3|31|51483.25|0.06|0.06|N|O|1997-08-10|1997-07-24|1997-08-21|DELIVER IN PERSON|SHIP|furiously. regular ideas sleep blithe +44354|1079|50|4|41|40182.87|0.04|0.07|N|O|1997-08-28|1997-07-05|1997-09-24|DELIVER IN PERSON|REG AIR|gular, final requests lose. r +44355|557|48|1|31|45184.05|0.01|0.08|N|O|1996-04-12|1996-04-09|1996-05-05|DELIVER IN PERSON|REG AIR|ly regular deposits wake? slyl +44355|31|7|2|10|9310.30|0.00|0.02|N|O|1996-03-16|1996-05-11|1996-04-12|TAKE BACK RETURN|REG AIR|ent, pending accounts affix carefully. exp +44355|782|47|3|33|55531.74|0.01|0.06|N|O|1996-04-05|1996-03-30|1996-04-09|DELIVER IN PERSON|REG AIR|quickly according to the sheaves. fluffi +44355|32|8|4|27|25164.81|0.04|0.08|N|O|1996-05-11|1996-04-25|1996-05-25|TAKE BACK RETURN|REG AIR|nic packages are slyly; even at +44355|1929|74|5|5|9154.60|0.04|0.04|N|O|1996-05-29|1996-03-27|1996-06-14|COLLECT COD|REG AIR|ndencies. reg +44355|1899|100|6|46|82840.94|0.04|0.02|N|O|1996-06-16|1996-03-27|1996-07-12|DELIVER IN PERSON|TRUCK|carefully regular foxes are bravely r +44355|869|3|7|13|23008.18|0.08|0.02|N|O|1996-03-24|1996-05-05|1996-04-05|DELIVER IN PERSON|MAIL|nding requests. always c +44356|1109|10|1|35|35353.50|0.10|0.00|N|O|1996-06-23|1996-08-06|1996-07-02|COLLECT COD|REG AIR|se requests. regular asymptotes +44356|990|93|2|16|30255.84|0.00|0.05|N|O|1996-08-25|1996-09-08|1996-09-14|NONE|AIR|its. platelets use +44356|777|42|3|38|63755.26|0.07|0.07|N|O|1996-09-09|1996-08-02|1996-09-26|NONE|FOB|pending requests. requests kindle acr +44356|294|22|4|11|13137.19|0.03|0.02|N|O|1996-08-07|1996-09-01|1996-09-01|DELIVER IN PERSON|SHIP| ideas sleep along the dep +44356|1330|31|5|32|39402.56|0.01|0.07|N|O|1996-08-02|1996-08-05|1996-08-11|COLLECT COD|MAIL|s the blithely permanent reque +44356|330|59|6|36|44291.88|0.10|0.00|N|O|1996-10-09|1996-07-23|1996-10-15|NONE|RAIL|ross the slyly regul +44357|1348|49|1|4|4997.36|0.09|0.00|N|O|1995-12-08|1996-01-25|1995-12-13|NONE|FOB|t excuses. furiously regular ideas +44357|234|89|2|28|31758.44|0.03|0.05|N|O|1996-02-22|1996-01-15|1996-03-20|TAKE BACK RETURN|AIR|ously across the carefully bold ideas. s +44357|722|55|3|4|6490.88|0.09|0.03|N|O|1995-12-02|1995-12-29|1995-12-30|DELIVER IN PERSON|SHIP|blithely alongs +44357|474|75|4|37|50855.39|0.02|0.00|N|O|1995-12-01|1996-01-11|1995-12-05|TAKE BACK RETURN|REG AIR|aggle fluffily quick r +44357|1408|48|5|39|51066.60|0.05|0.03|N|O|1995-12-15|1996-01-15|1995-12-26|TAKE BACK RETURN|REG AIR|eep slyly. special gifts nag slyly slyly ev +44358|1625|26|1|17|25952.54|0.08|0.07|A|F|1993-04-29|1993-05-04|1993-05-04|DELIVER IN PERSON|SHIP|furiously regular packa +44358|1594|35|2|42|62814.78|0.03|0.08|R|F|1993-04-23|1993-06-10|1993-05-09|NONE|RAIL|lay enticingly around the bold theo +44358|888|88|3|41|73344.08|0.03|0.07|A|F|1993-07-30|1993-06-07|1993-08-08|NONE|MAIL|y even plat +44358|434|22|4|10|13344.30|0.10|0.08|R|F|1993-06-24|1993-05-09|1993-07-20|DELIVER IN PERSON|TRUCK|. even deposits poach furiousl +44358|433|34|5|27|36002.61|0.05|0.07|R|F|1993-04-30|1993-05-06|1993-05-10|TAKE BACK RETURN|REG AIR|leep quickly am +44358|1227|28|6|1|1128.22|0.09|0.07|R|F|1993-07-08|1993-06-25|1993-07-12|NONE|FOB|equests wa +44358|478|79|7|7|9649.29|0.07|0.03|R|F|1993-06-07|1993-05-18|1993-06-29|TAKE BACK RETURN|RAIL| instructions use quickly furiously ir +44359|1396|97|1|38|49300.82|0.03|0.05|R|F|1994-02-19|1994-02-04|1994-02-24|NONE|TRUCK|ly pending requests. blithely reg +44359|949|52|2|38|70297.72|0.01|0.01|A|F|1993-12-02|1994-02-13|1993-12-31|NONE|MAIL| ironic theodolites are ca +44359|590|51|3|28|41736.52|0.00|0.06|R|F|1994-01-02|1994-01-22|1994-01-27|DELIVER IN PERSON|RAIL|ding deposits wake according to the f +44359|1938|39|4|49|90156.57|0.06|0.02|A|F|1993-12-17|1993-12-31|1994-01-12|NONE|FOB|fluffily close exc +44359|258|86|5|15|17373.75|0.02|0.03|A|F|1993-12-20|1994-02-19|1994-01-19|DELIVER IN PERSON|REG AIR|use blithely final notornis: ironic +44359|1593|14|6|41|61278.19|0.00|0.02|R|F|1994-03-25|1994-01-16|1994-04-07|DELIVER IN PERSON|RAIL|ages wake slyly: express deposits u +44384|1960|5|1|28|52134.88|0.00|0.00|N|O|1998-01-14|1998-03-11|1998-02-12|COLLECT COD|FOB|beans. quickly pending excuses +44384|1607|31|2|26|39223.60|0.09|0.00|N|O|1998-02-05|1998-03-08|1998-02-26|COLLECT COD|SHIP| express foxes are blithely across the +44385|451|81|1|22|29731.90|0.09|0.07|N|O|1996-05-16|1996-03-12|1996-06-05|DELIVER IN PERSON|MAIL|ove the slyly regular fox +44386|75|26|1|34|33152.38|0.03|0.05|A|F|1992-06-25|1992-05-22|1992-07-20|NONE|AIR|deposits haggle alongside of th +44386|781|82|2|17|28590.26|0.05|0.01|R|F|1992-07-02|1992-05-27|1992-07-11|DELIVER IN PERSON|MAIL|en requests. final pinto beans are quickly +44386|326|27|3|15|18394.80|0.02|0.06|A|F|1992-05-05|1992-05-30|1992-05-09|NONE|FOB|g instructions. ruthless +44386|742|39|4|32|52567.68|0.00|0.06|A|F|1992-04-15|1992-05-24|1992-05-05|TAKE BACK RETURN|MAIL|final excuses; regular accounts +44386|1106|15|5|33|33234.30|0.09|0.01|A|F|1992-05-13|1992-05-20|1992-06-02|NONE|TRUCK|sits impress quickly. qui +44387|1297|35|1|50|59914.50|0.03|0.00|R|F|1994-03-08|1994-05-05|1994-03-20|COLLECT COD|AIR|ckly final pa +44387|315|44|2|24|29167.44|0.10|0.07|R|F|1994-05-24|1994-03-08|1994-06-11|COLLECT COD|RAIL|s nag slyl +44387|272|27|3|20|23445.40|0.03|0.06|A|F|1994-04-21|1994-04-04|1994-05-06|COLLECT COD|MAIL|carefully express th +44387|1353|54|4|36|45156.60|0.09|0.02|A|F|1994-03-25|1994-03-29|1994-04-10|COLLECT COD|TRUCK|t requests. blithely unusual +44387|1257|58|5|10|11582.50|0.07|0.01|R|F|1994-06-06|1994-03-18|1994-06-13|DELIVER IN PERSON|TRUCK| final deposits. furiousl +44388|282|10|1|49|57931.72|0.09|0.07|N|O|1997-07-25|1997-06-14|1997-08-16|DELIVER IN PERSON|RAIL|kly special theodolites wake furi +44388|1563|64|2|34|49795.04|0.09|0.00|N|O|1997-05-25|1997-07-03|1997-05-26|TAKE BACK RETURN|AIR| packages use blithely alway +44388|811|11|3|4|6847.24|0.00|0.03|N|O|1997-06-11|1997-07-04|1997-06-13|COLLECT COD|TRUCK|to beans affix slyly regular requ +44389|409|39|1|23|30116.20|0.03|0.02|R|F|1994-03-11|1994-04-23|1994-04-10|COLLECT COD|AIR|slyly. blithely final theodolites shall +44389|1819|63|2|12|20649.72|0.04|0.05|A|F|1994-06-06|1994-03-30|1994-06-21|DELIVER IN PERSON|TRUCK|thely regular excuse +44390|79|5|1|41|40141.87|0.03|0.04|A|F|1994-02-15|1994-01-28|1994-02-27|NONE|FOB|eep blithely be +44390|476|64|2|46|63317.62|0.01|0.06|A|F|1993-12-20|1994-01-31|1994-01-05|TAKE BACK RETURN|TRUCK|ly slow ac +44390|168|47|3|40|42726.40|0.09|0.03|R|F|1994-01-02|1994-02-07|1994-01-09|TAKE BACK RETURN|SHIP|fluffily. blithely final accounts sle +44390|141|20|4|39|40604.46|0.01|0.05|A|F|1994-03-02|1994-02-17|1994-03-23|NONE|MAIL|packages. +44390|1809|53|5|35|59878.00|0.02|0.08|A|F|1994-01-09|1994-02-25|1994-01-14|TAKE BACK RETURN|AIR|eodolites above the ironic accoun +44391|1839|69|1|7|12185.81|0.00|0.05|A|F|1994-01-17|1994-03-07|1994-01-24|TAKE BACK RETURN|TRUCK|. pending foxes wake blithely at the fluffi +44391|1716|43|2|49|79267.79|0.02|0.06|A|F|1994-05-03|1994-02-20|1994-05-25|DELIVER IN PERSON|TRUCK|en pinto beans nag slyly quickly final fo +44391|1902|3|3|1|1803.90|0.04|0.01|A|F|1994-03-19|1994-02-15|1994-04-08|TAKE BACK RETURN|AIR|eep blithe +44391|1714|41|4|12|19388.52|0.01|0.05|A|F|1994-03-26|1994-03-05|1994-04-24|COLLECT COD|MAIL|nto beans are sl +44391|1773|100|5|48|80388.96|0.08|0.08|R|F|1994-04-27|1994-03-16|1994-05-09|NONE|REG AIR|. quietly pending a +44416|38|39|1|50|46901.50|0.02|0.01|N|O|1996-07-24|1996-08-23|1996-08-14|COLLECT COD|MAIL|ost carefully according to the furiousl +44416|234|89|2|14|15879.22|0.08|0.05|N|O|1996-07-16|1996-09-03|1996-07-27|DELIVER IN PERSON|AIR|to beans. furiously silent +44416|706|7|3|15|24100.50|0.06|0.00|N|O|1996-09-14|1996-08-02|1996-09-21|TAKE BACK RETURN|SHIP|final packages cajole among the blithely +44416|1405|23|4|26|33966.40|0.08|0.08|N|O|1996-07-30|1996-08-05|1996-08-20|COLLECT COD|TRUCK|sly ironic account +44416|464|52|5|39|53213.94|0.03|0.06|N|O|1996-07-04|1996-08-20|1996-07-10|DELIVER IN PERSON|MAIL|lose ideas against the furiously p +44416|1997|98|6|22|41777.78|0.05|0.02|N|O|1996-09-23|1996-09-15|1996-10-14|DELIVER IN PERSON|MAIL|ly bold ideas affix atop +44417|585|46|1|28|41596.24|0.10|0.00|A|F|1994-02-01|1994-01-26|1994-03-03|COLLECT COD|FOB|egular requests; blithely even requests +44417|632|33|2|48|73566.24|0.09|0.02|A|F|1994-03-20|1994-02-10|1994-04-13|DELIVER IN PERSON|REG AIR|dolites sleep blithely slyly i +44417|291|73|3|11|13104.19|0.02|0.03|A|F|1994-03-25|1994-02-09|1994-04-12|NONE|RAIL| regular packages use furiously +44417|1176|77|4|48|51704.16|0.05|0.02|R|F|1994-01-11|1994-01-12|1994-02-04|DELIVER IN PERSON|TRUCK|riously above the blithely ironic deposi +44418|1291|66|1|41|48883.89|0.10|0.07|R|F|1995-02-09|1995-04-09|1995-03-10|DELIVER IN PERSON|AIR|aggle fluffily theodolites. unusual, +44418|189|16|2|42|45745.56|0.07|0.05|R|F|1995-04-12|1995-04-17|1995-04-25|NONE|TRUCK|sly against the theod +44418|1519|100|3|29|41194.79|0.09|0.00|A|F|1995-05-15|1995-03-21|1995-05-29|COLLECT COD|FOB|s are across the slyly final requests? care +44418|1065|66|4|11|10626.66|0.07|0.06|R|F|1995-03-31|1995-03-10|1995-04-11|TAKE BACK RETURN|FOB|lyly according to the quickly pen +44418|1950|39|5|48|88893.60|0.05|0.07|R|F|1995-05-28|1995-03-07|1995-06-14|COLLECT COD|REG AIR|yly final packages n +44418|666|60|6|11|17233.26|0.04|0.06|R|F|1995-02-17|1995-03-29|1995-03-03|COLLECT COD|REG AIR|ily. packages alo +44419|1268|69|1|33|38585.58|0.01|0.00|N|O|1997-09-19|1997-09-10|1997-10-13|NONE|SHIP|sleep according to the fluf +44419|1041|47|2|17|16014.68|0.00|0.06|N|O|1997-08-02|1997-08-19|1997-08-09|NONE|MAIL|blithely foxes. ironic pint +44420|766|67|1|15|25001.40|0.05|0.08|N|O|1998-05-18|1998-07-25|1998-06-06|COLLECT COD|REG AIR|tructions affix against the unusual, bold +44420|143|22|2|24|25035.36|0.09|0.06|N|O|1998-05-27|1998-06-19|1998-06-25|TAKE BACK RETURN|RAIL|packages caj +44420|218|73|3|21|23482.41|0.02|0.04|N|O|1998-05-07|1998-07-07|1998-06-03|NONE|SHIP|ng requests wake. +44421|1383|98|1|32|41100.16|0.02|0.04|N|O|1998-06-09|1998-08-08|1998-06-23|NONE|REG AIR|ptotes boost blithely. +44421|1476|77|2|37|50966.39|0.03|0.00|N|O|1998-08-25|1998-07-02|1998-09-21|NONE|SHIP|dly stealthy +44421|1272|47|3|30|35198.10|0.01|0.00|N|O|1998-06-15|1998-07-08|1998-06-28|TAKE BACK RETURN|RAIL|ckly. carefully regular accoun +44422|896|63|1|45|80860.05|0.09|0.02|A|F|1992-04-18|1992-06-07|1992-04-29|NONE|RAIL|lithely above th +44422|1271|46|2|6|7033.62|0.04|0.04|R|F|1992-06-18|1992-06-24|1992-07-17|TAKE BACK RETURN|RAIL|sts above the carefully unusual idea +44422|1540|41|3|24|34596.96|0.10|0.05|A|F|1992-07-02|1992-07-13|1992-07-22|TAKE BACK RETURN|TRUCK| final instruction +44422|1039|45|4|11|10340.33|0.07|0.06|R|F|1992-07-25|1992-06-23|1992-08-06|COLLECT COD|MAIL|equests ca +44422|738|3|5|49|80297.77|0.04|0.03|R|F|1992-05-04|1992-05-17|1992-05-22|DELIVER IN PERSON|FOB|t foxes dazzle slyly theodolites. carefully +44423|1671|95|1|42|66052.14|0.10|0.06|R|F|1992-11-11|1992-10-23|1992-11-19|DELIVER IN PERSON|MAIL|ress accounts. even, iron +44423|95|21|2|8|7960.72|0.10|0.06|R|F|1992-11-18|1992-10-02|1992-12-05|DELIVER IN PERSON|SHIP|ly bold pinto be +44423|92|18|3|16|15873.44|0.10|0.05|R|F|1992-08-23|1992-10-23|1992-09-07|NONE|SHIP|nic foxes kindle. slyly bold reques +44448|918|19|1|41|74575.31|0.08|0.01|A|F|1994-05-20|1994-07-07|1994-06-07|DELIVER IN PERSON|SHIP|uickly sil +44448|1885|72|2|32|57180.16|0.07|0.05|A|F|1994-07-18|1994-06-21|1994-08-13|NONE|MAIL|l platelets. fluffil +44448|619|20|3|35|53186.35|0.09|0.03|R|F|1994-05-26|1994-06-10|1994-05-29|NONE|REG AIR|deas. regular +44448|1318|19|4|35|42675.85|0.02|0.01|R|F|1994-06-14|1994-06-26|1994-07-14|NONE|SHIP|ess packages +44448|1358|35|5|43|54152.05|0.03|0.01|A|F|1994-05-12|1994-05-16|1994-05-13|NONE|FOB|t requests use. fin +44449|560|61|1|48|70106.88|0.02|0.08|N|O|1995-10-04|1995-11-03|1995-10-11|TAKE BACK RETURN|RAIL|ajole regularly among th +44449|1859|60|2|39|68673.15|0.08|0.02|N|O|1995-11-25|1995-11-14|1995-11-29|DELIVER IN PERSON|SHIP|quickly special packages haggle slyl +44450|1314|91|1|28|34028.68|0.09|0.00|A|F|1994-02-05|1993-11-09|1994-02-14|COLLECT COD|SHIP|y bold theodolites unwind furious +44450|121|100|2|18|18380.16|0.07|0.05|A|F|1993-12-16|1993-11-16|1993-12-23|NONE|REG AIR|tes. express accounts ab +44450|335|92|3|25|30883.25|0.07|0.03|R|F|1994-01-03|1993-12-24|1994-01-09|DELIVER IN PERSON|SHIP| furiously idle accounts inside +44450|599|60|4|35|52485.65|0.06|0.07|R|F|1994-01-07|1993-11-20|1994-01-16|COLLECT COD|REG AIR|e quiet, bold courts. carefully even Ti +44451|1051|57|1|43|40938.15|0.01|0.02|N|O|1995-12-15|1995-11-04|1996-01-06|COLLECT COD|RAIL|deposits haggle. even packages boos +44451|1570|71|2|47|69163.79|0.09|0.06|N|O|1995-10-25|1995-11-27|1995-10-29|DELIVER IN PERSON|REG AIR|s platelets sleep acr +44451|467|26|3|46|62903.16|0.10|0.02|N|O|1995-12-01|1995-10-21|1995-12-03|DELIVER IN PERSON|FOB| the fluffily bold instru +44451|519|50|4|45|63877.95|0.05|0.08|N|O|1995-12-22|1995-11-02|1996-01-14|TAKE BACK RETURN|AIR| packages use furiously express +44451|1327|4|5|22|27023.04|0.04|0.07|N|O|1995-10-25|1995-12-03|1995-11-04|TAKE BACK RETURN|AIR|by the furious deposits. c +44451|983|86|6|33|62171.34|0.10|0.06|N|O|1995-11-20|1995-11-01|1995-12-17|DELIVER IN PERSON|MAIL|dolites sleep about the bold platele +44452|898|32|1|10|17988.90|0.09|0.08|N|O|1996-01-12|1996-01-09|1996-01-19|TAKE BACK RETURN|SHIP|wake against the fluffily fluffy packages +44452|433|92|2|50|66671.50|0.03|0.04|N|O|1996-02-23|1996-02-24|1996-03-01|DELIVER IN PERSON|RAIL|p carefully. enticingly ironic +44452|1056|57|3|41|39239.05|0.04|0.07|N|O|1996-02-26|1996-03-07|1996-03-12|NONE|FOB|ronic accou +44452|1578|79|4|6|8877.42|0.06|0.05|N|O|1996-01-11|1996-02-29|1996-02-01|DELIVER IN PERSON|FOB|ly accounts. carefully pending depende +44453|791|24|1|44|74438.76|0.01|0.06|R|F|1994-04-12|1994-05-01|1994-05-07|NONE|TRUCK|requests serve according to the regul +44454|717|18|1|29|46913.59|0.08|0.00|N|O|1997-02-22|1997-02-21|1997-02-26|NONE|FOB|ual, pending theo +44454|1203|4|2|47|51897.40|0.04|0.08|N|O|1997-01-01|1997-01-18|1997-01-16|DELIVER IN PERSON|MAIL|s nag carefully. special asymptotes mu +44454|1773|74|3|15|25121.55|0.08|0.05|N|O|1997-02-21|1997-01-17|1997-03-09|TAKE BACK RETURN|SHIP|ing notornis according to +44454|1775|76|4|17|28505.09|0.07|0.04|N|O|1997-01-31|1997-01-25|1997-02-16|NONE|AIR|xes solve carefully slyly ironic braids. fl +44454|404|92|5|32|41740.80|0.07|0.03|N|O|1997-01-26|1997-02-12|1997-01-31|DELIVER IN PERSON|SHIP|nts. silent instructions +44455|1637|38|1|24|36927.12|0.00|0.06|N|O|1997-08-18|1997-07-27|1997-09-10|NONE|AIR|arthogs. requests run blithely across the +44455|75|76|2|46|44853.22|0.09|0.05|N|O|1997-09-16|1997-09-12|1997-09-23|NONE|AIR|nst the pending +44455|1604|46|3|13|19572.80|0.01|0.03|N|O|1997-07-02|1997-08-06|1997-07-16|DELIVER IN PERSON|MAIL|to beans wake blithel +44455|688|20|4|4|6354.72|0.03|0.04|N|O|1997-06-26|1997-08-15|1997-07-16|DELIVER IN PERSON|TRUCK|. carefully dogged dependenc +44455|1043|14|5|7|6608.28|0.08|0.04|N|O|1997-08-24|1997-08-14|1997-09-13|NONE|TRUCK|blithely. ca +44480|257|58|1|42|48604.50|0.01|0.00|R|F|1993-06-03|1993-08-06|1993-06-16|TAKE BACK RETURN|RAIL|jole furiousl +44480|295|50|2|29|34663.41|0.07|0.07|R|F|1993-08-18|1993-07-26|1993-08-28|DELIVER IN PERSON|MAIL|ly express excuses are slyly under the requ +44481|26|52|1|14|12964.28|0.06|0.07|N|O|1996-06-26|1996-08-03|1996-07-20|TAKE BACK RETURN|FOB|counts sleep f +44481|753|54|2|1|1653.75|0.00|0.01|N|O|1996-09-03|1996-08-17|1996-09-26|NONE|MAIL|y regular accounts. even +44481|189|16|3|46|50102.28|0.09|0.08|N|O|1996-09-04|1996-08-16|1996-09-20|DELIVER IN PERSON|REG AIR|s. ironic, regular packages after the +44481|27|78|4|19|17613.38|0.08|0.03|N|O|1996-08-09|1996-08-23|1996-09-06|DELIVER IN PERSON|TRUCK|, even escapades alongs +44481|1193|2|5|35|38296.65|0.00|0.06|N|O|1996-06-07|1996-08-20|1996-06-14|COLLECT COD|REG AIR|ly silent excuses after the slyly +44481|1541|42|6|2|2885.08|0.02|0.00|N|O|1996-08-08|1996-08-23|1996-08-14|COLLECT COD|RAIL|about the slyly bold deposits +44481|93|94|7|42|41709.78|0.03|0.06|N|O|1996-07-30|1996-09-03|1996-08-14|COLLECT COD|TRUCK|sits. regular requests wake final +44482|66|67|1|7|6762.42|0.00|0.01|N|O|1998-06-25|1998-04-17|1998-07-25|COLLECT COD|TRUCK|ges. carefully ironic ideas doze alon +44482|1485|25|2|50|69324.00|0.04|0.08|N|O|1998-05-11|1998-04-23|1998-05-19|COLLECT COD|MAIL|the ironic, even requests? regu +44483|1466|45|1|20|27349.20|0.09|0.01|N|O|1996-11-09|1996-10-17|1996-11-27|COLLECT COD|MAIL|e slyly above the enticingly ironic acc +44483|1668|51|2|38|59647.08|0.09|0.03|N|O|1996-10-16|1996-09-03|1996-11-01|DELIVER IN PERSON|FOB|y around the furiously final depo +44483|1946|35|3|21|38806.74|0.04|0.05|N|O|1996-09-22|1996-10-23|1996-09-27|TAKE BACK RETURN|SHIP|ickly thinly regular requests. slyly f +44483|716|49|4|48|77602.08|0.02|0.04|N|O|1996-08-21|1996-09-22|1996-08-27|COLLECT COD|AIR|regular requests. blithely regular asymp +44483|664|96|5|8|12517.28|0.10|0.08|N|O|1996-11-01|1996-09-14|1996-11-26|TAKE BACK RETURN|AIR|. ironic instruct +44483|506|97|6|38|53447.00|0.02|0.04|N|O|1996-09-21|1996-10-22|1996-09-24|COLLECT COD|SHIP|gular accounts. instructions sl +44483|708|41|7|15|24130.50|0.08|0.00|N|O|1996-09-21|1996-09-24|1996-09-27|NONE|FOB|gular requests cajole. ironic acc +44484|95|21|1|16|15921.44|0.00|0.04|N|O|1996-03-12|1996-03-19|1996-03-19|TAKE BACK RETURN|AIR|ajole. quickly e +44484|1374|51|2|17|21681.29|0.01|0.02|N|O|1996-05-31|1996-04-04|1996-06-06|DELIVER IN PERSON|RAIL|ges. regular, special +44484|837|71|3|39|67775.37|0.07|0.04|N|O|1996-02-27|1996-04-01|1996-03-05|DELIVER IN PERSON|RAIL|requests. slyl +44484|1105|42|4|47|47286.70|0.07|0.08|N|O|1996-04-16|1996-05-01|1996-05-08|NONE|TRUCK|ve the boldly pe +44484|969|38|5|44|82278.24|0.08|0.04|N|O|1996-06-06|1996-03-16|1996-06-07|TAKE BACK RETURN|TRUCK|its might haggle furiously acro +44484|868|68|6|46|81367.56|0.04|0.00|N|O|1996-05-27|1996-04-24|1996-06-22|COLLECT COD|FOB|osits wake sile +44484|465|24|7|9|12289.14|0.06|0.03|N|O|1996-03-08|1996-03-29|1996-03-21|TAKE BACK RETURN|SHIP|g the ideas. quickly unu +44485|1190|91|1|40|43647.60|0.06|0.02|R|F|1994-07-28|1994-08-21|1994-08-04|NONE|FOB|oost! fluffily +44485|838|72|2|44|76508.52|0.03|0.06|A|F|1994-09-17|1994-09-10|1994-09-27|COLLECT COD|TRUCK|s. ideas along the unusua +44485|1908|53|3|47|85065.30|0.03|0.08|R|F|1994-08-10|1994-09-15|1994-08-27|DELIVER IN PERSON|AIR| express requests nag at th +44486|139|18|1|35|36369.55|0.03|0.07|A|F|1992-08-12|1992-09-18|1992-08-18|TAKE BACK RETURN|AIR|aggle carefully blithely fi +44486|535|66|2|1|1435.53|0.01|0.02|R|F|1992-08-15|1992-09-10|1992-09-11|NONE|TRUCK|ly regular packages. regu +44487|909|12|1|28|50677.20|0.03|0.02|A|F|1994-11-14|1994-11-04|1994-11-18|DELIVER IN PERSON|RAIL|nt accounts? carefully special idea +44487|600|31|2|13|19507.80|0.02|0.04|A|F|1994-12-31|1994-10-31|1995-01-23|TAKE BACK RETURN|RAIL|y regular accounts. r +44487|543|4|3|39|56298.06|0.00|0.05|A|F|1994-10-05|1994-10-28|1994-10-11|DELIVER IN PERSON|AIR|ests. furiously fin +44487|1801|45|4|49|83437.20|0.05|0.03|R|F|1995-01-08|1994-11-13|1995-02-03|DELIVER IN PERSON|AIR|e quickly ironic packages. ironic, regula +44487|115|94|5|15|15226.65|0.08|0.04|R|F|1994-12-04|1994-10-25|1994-12-29|DELIVER IN PERSON|MAIL|egular foxes. packages sle +44487|848|49|6|37|64707.08|0.03|0.06|R|F|1994-10-09|1994-12-08|1994-10-28|COLLECT COD|REG AIR|osits according to the quickly ironic i +44487|674|68|7|10|15746.70|0.06|0.06|R|F|1994-12-03|1994-10-27|1994-12-17|COLLECT COD|FOB|ally special courts? never +44512|1809|10|1|29|49613.20|0.01|0.02|A|F|1993-04-16|1993-06-08|1993-05-03|COLLECT COD|TRUCK|lites print express p +44513|116|69|1|4|4064.44|0.10|0.03|R|F|1994-08-07|1994-10-01|1994-08-17|COLLECT COD|AIR| foxes cajole slyly sil +44513|1154|55|2|11|11606.65|0.10|0.07|A|F|1994-09-29|1994-08-25|1994-10-29|COLLECT COD|MAIL|ts. regular, bold packages s +44513|1358|73|3|9|11334.15|0.08|0.01|R|F|1994-09-28|1994-10-04|1994-10-14|NONE|AIR| ironic pack +44514|1282|83|1|38|44964.64|0.00|0.05|A|F|1995-02-03|1995-02-13|1995-02-21|TAKE BACK RETURN|TRUCK|s. blithely brave depend +44515|428|16|1|27|35867.34|0.01|0.05|N|O|1997-01-14|1996-11-09|1997-02-01|NONE|TRUCK|uriously across +44515|1206|7|2|4|4428.80|0.04|0.06|N|O|1996-10-13|1996-12-17|1996-11-10|COLLECT COD|RAIL|slyly final accounts acros +44516|714|11|1|50|80735.50|0.04|0.01|N|O|1995-08-21|1995-08-14|1995-09-19|DELIVER IN PERSON|REG AIR|totes are carefully carefully regular +44516|1309|10|2|7|8472.10|0.02|0.08|N|O|1995-08-19|1995-09-24|1995-08-20|TAKE BACK RETURN|REG AIR|quests across the unusual +44516|1841|85|3|13|22656.92|0.05|0.06|N|O|1995-10-13|1995-09-12|1995-10-25|NONE|MAIL|lithely special, pending depe +44516|1739|40|4|34|55784.82|0.07|0.06|N|O|1995-08-26|1995-08-18|1995-09-25|NONE|SHIP|fully even accounts detect above th +44516|1973|74|5|19|35624.43|0.06|0.02|N|O|1995-10-10|1995-09-17|1995-11-07|NONE|TRUCK|ccording to the quickly r +44516|1884|85|6|37|66077.56|0.09|0.08|N|O|1995-09-23|1995-09-18|1995-10-14|COLLECT COD|TRUCK|ironic deposits haggle along +44517|693|56|1|38|60560.22|0.01|0.05|R|F|1994-06-15|1994-07-16|1994-06-19|DELIVER IN PERSON|SHIP|e about the unusual theodolites. sly +44517|1141|42|2|3|3126.42|0.02|0.04|R|F|1994-05-01|1994-06-04|1994-05-10|COLLECT COD|REG AIR|e blithely per +44517|181|60|3|22|23785.96|0.06|0.00|A|F|1994-08-07|1994-07-10|1994-08-25|NONE|RAIL|y regular asymptotes. carefully ironic th +44517|728|25|4|4|6514.88|0.01|0.07|R|F|1994-06-05|1994-06-23|1994-06-10|DELIVER IN PERSON|MAIL|se instructions detec +44517|1854|55|5|17|29849.45|0.04|0.03|R|F|1994-04-28|1994-07-17|1994-05-06|COLLECT COD|SHIP|fully blithe packages doz +44517|1880|10|6|35|62365.80|0.03|0.08|R|F|1994-07-20|1994-07-04|1994-08-16|NONE|FOB|he fluffily regular accounts. spec +44517|1268|69|7|14|16369.64|0.09|0.04|R|F|1994-05-25|1994-06-27|1994-06-13|COLLECT COD|REG AIR|ckages sno +44518|588|49|1|32|47634.56|0.04|0.07|N|O|1996-09-24|1996-08-31|1996-10-08|TAKE BACK RETURN|SHIP|requests. +44518|1277|78|2|44|51843.88|0.01|0.08|N|O|1996-07-22|1996-09-11|1996-08-12|COLLECT COD|REG AIR|ccounts nag quickly across the +44519|1525|6|1|5|7132.60|0.03|0.00|A|F|1993-06-16|1993-07-19|1993-06-18|COLLECT COD|SHIP|ans. quickly pending deposits use accounts. +44519|1650|33|2|33|51204.45|0.10|0.07|A|F|1993-07-28|1993-07-18|1993-08-09|DELIVER IN PERSON|AIR|final theodolites. +44519|183|10|3|45|48743.10|0.04|0.06|A|F|1993-06-19|1993-07-11|1993-07-08|COLLECT COD|TRUCK|thely pending requests use carefully. f +44519|621|15|4|35|53256.70|0.00|0.07|A|F|1993-05-23|1993-08-13|1993-06-18|COLLECT COD|TRUCK|inst the quickly pending foxes. slyly iro +44519|1162|35|5|1|1063.16|0.01|0.04|A|F|1993-09-12|1993-07-12|1993-09-14|NONE|TRUCK|ites wake quickly slyly ironic requ +44519|1952|41|6|21|38932.95|0.10|0.04|A|F|1993-08-12|1993-08-16|1993-08-17|TAKE BACK RETURN|FOB|long the quic +44544|1471|89|1|42|57643.74|0.10|0.07|N|O|1998-04-24|1998-05-29|1998-05-09|NONE|AIR|ckly pending dependen +44544|859|26|2|4|7039.40|0.09|0.02|N|O|1998-04-01|1998-04-22|1998-04-22|DELIVER IN PERSON|TRUCK|along the slyly final de +44544|630|24|3|19|29081.97|0.05|0.00|N|O|1998-04-16|1998-04-23|1998-04-17|TAKE BACK RETURN|SHIP|ial, unusual dolphins. blithe +44544|1253|91|4|39|45015.75|0.06|0.08|N|O|1998-03-22|1998-04-13|1998-03-31|NONE|RAIL|sts across the even, ex +44544|1684|8|5|19|30127.92|0.05|0.07|N|O|1998-04-10|1998-04-30|1998-05-07|NONE|REG AIR|fully at the care +44544|475|34|6|26|35762.22|0.00|0.01|N|O|1998-06-20|1998-04-27|1998-07-20|DELIVER IN PERSON|FOB|e furiously even re +44545|84|85|1|11|10824.88|0.00|0.02|N|O|1998-04-06|1998-04-05|1998-04-09|DELIVER IN PERSON|REG AIR|. idly regular +44545|493|23|2|23|32050.27|0.05|0.06|N|O|1998-03-05|1998-03-31|1998-03-21|COLLECT COD|MAIL|s. furiously +44545|1906|95|3|1|1807.90|0.05|0.05|N|O|1998-05-08|1998-03-25|1998-05-18|NONE|RAIL| instructions. carefully unus +44545|443|44|4|18|24181.92|0.06|0.04|N|O|1998-01-16|1998-03-28|1998-02-02|TAKE BACK RETURN|FOB| haggle furiously ironic p +44545|641|35|5|9|13874.76|0.08|0.01|N|O|1998-02-28|1998-03-08|1998-03-28|COLLECT COD|RAIL| blithely slyly regular acco +44545|1358|35|6|8|10074.80|0.08|0.08|N|O|1998-03-03|1998-03-19|1998-03-13|NONE|MAIL|sly even packages ca +44545|175|54|7|50|53758.50|0.07|0.06|N|O|1998-05-05|1998-02-13|1998-05-28|TAKE BACK RETURN|SHIP|ng the quickly special accounts. +44546|161|40|1|42|44568.72|0.02|0.06|A|F|1993-07-17|1993-06-05|1993-08-02|COLLECT COD|SHIP| the finally regular t +44546|583|44|2|37|54892.46|0.07|0.00|A|F|1993-03-30|1993-04-29|1993-04-03|TAKE BACK RETURN|REG AIR|s haggle after the never ironic +44546|1324|1|3|38|46562.16|0.08|0.01|R|F|1993-06-09|1993-06-21|1993-06-21|NONE|AIR| furiously regular accounts. unu +44547|1041|42|1|49|46159.96|0.09|0.02|N|O|1995-07-25|1995-06-13|1995-08-13|TAKE BACK RETURN|MAIL| the furious +44547|1957|58|2|35|65063.25|0.01|0.08|N|O|1995-07-29|1995-07-23|1995-08-25|COLLECT COD|SHIP| silent requests +44548|1335|50|1|21|25962.93|0.07|0.02|N|O|1997-09-07|1997-09-29|1997-10-07|DELIVER IN PERSON|REG AIR|carefully express packages n +44548|1746|31|2|34|56023.16|0.09|0.08|N|O|1997-08-24|1997-08-25|1997-09-09|COLLECT COD|RAIL| integrate regularly. quickly +44548|100|26|3|1|1000.10|0.00|0.02|N|O|1997-10-13|1997-09-15|1997-11-02|COLLECT COD|MAIL|counts. slyly pending forges are +44549|1351|28|1|46|57608.10|0.02|0.02|R|F|1992-05-16|1992-04-02|1992-05-21|DELIVER IN PERSON|RAIL|fluffily above the +44549|2000|89|2|20|18040.00|0.02|0.06|A|F|1992-04-10|1992-03-22|1992-05-01|COLLECT COD|FOB|ntegrate furiously after the fi +44549|962|65|3|47|87559.12|0.09|0.08|R|F|1992-04-25|1992-04-01|1992-04-28|NONE|RAIL|instruction +44550|1716|43|1|22|35589.62|0.08|0.08|N|O|1997-11-25|1997-11-04|1997-12-14|DELIVER IN PERSON|TRUCK|quests. ironic, +44550|386|71|2|35|45023.30|0.05|0.05|N|O|1997-12-19|1997-10-09|1997-12-28|NONE|REG AIR|ts. sentiments behind the pending +44551|546|77|1|21|30377.34|0.08|0.08|N|O|1997-02-20|1997-03-07|1997-02-28|COLLECT COD|TRUCK|olites. asymptotes doze carefully across t +44576|1360|61|1|6|7568.16|0.04|0.08|A|F|1995-04-23|1995-02-27|1995-05-11|DELIVER IN PERSON|REG AIR|s use across the slyly regular s +44576|1584|25|2|13|19312.54|0.04|0.05|R|F|1995-03-03|1995-01-28|1995-03-24|NONE|TRUCK| packages nag quietl +44576|98|99|3|3|2994.27|0.08|0.07|R|F|1995-01-05|1995-03-19|1995-01-06|DELIVER IN PERSON|RAIL|counts wake. bold, unusual pinto be +44576|495|96|4|21|29305.29|0.10|0.06|A|F|1995-04-07|1995-02-19|1995-04-29|DELIVER IN PERSON|RAIL|ackages above t +44576|1536|37|5|19|27313.07|0.08|0.01|R|F|1995-04-19|1995-03-21|1995-05-13|DELIVER IN PERSON|AIR|c accounts. enticingly final a +44576|1704|31|6|35|56199.50|0.03|0.03|A|F|1995-02-18|1995-03-19|1995-02-27|NONE|MAIL|ounts. even, special ideas +44577|253|54|1|23|26524.75|0.06|0.03|N|O|1997-06-24|1997-06-09|1997-07-14|NONE|FOB|ly ironic excuses +44577|142|43|2|4|4168.56|0.10|0.00|N|O|1997-06-26|1997-05-24|1997-06-28|DELIVER IN PERSON|FOB| ideas; quickly ironic theodolites wake sl +44577|535|66|3|43|61727.79|0.10|0.03|N|O|1997-03-31|1997-05-19|1997-04-05|NONE|TRUCK|es wake. quickly ironic accounts hind +44577|338|39|4|27|33434.91|0.02|0.03|N|O|1997-05-11|1997-05-12|1997-05-30|TAKE BACK RETURN|SHIP|yly blithe deposits among the sly +44578|1430|70|1|42|55920.06|0.09|0.05|N|O|1997-04-15|1997-04-09|1997-05-14|TAKE BACK RETURN|MAIL|. pending packages cajo +44578|1061|32|2|24|23089.44|0.02|0.01|N|O|1997-04-07|1997-04-03|1997-05-03|TAKE BACK RETURN|AIR|lyly even asymptotes are carefully among th +44578|1820|64|3|47|80925.54|0.06|0.07|N|O|1997-05-26|1997-04-19|1997-06-25|TAKE BACK RETURN|RAIL|eodolites integrate slyly never stealthy +44578|1678|2|4|22|34752.74|0.02|0.05|N|O|1997-02-20|1997-03-23|1997-03-19|COLLECT COD|MAIL|ke ironic, idle ideas +44578|787|20|5|48|81013.44|0.04|0.04|N|O|1997-02-12|1997-03-06|1997-03-01|NONE|MAIL|dolites across the bravely ironic foxes a +44578|1265|3|6|12|13995.12|0.02|0.01|N|O|1997-02-24|1997-04-01|1997-02-28|NONE|MAIL| special ideas use slyly regular in +44579|1404|83|1|2|2610.80|0.04|0.00|N|O|1995-07-24|1995-08-08|1995-08-11|TAKE BACK RETURN|RAIL|l platelets wake furio +44579|1338|39|2|15|18589.95|0.05|0.05|N|O|1995-08-29|1995-08-16|1995-09-15|DELIVER IN PERSON|RAIL|ackages use fluffily. regular ideas +44579|43|94|3|11|10373.44|0.10|0.08|N|O|1995-07-02|1995-07-10|1995-07-25|COLLECT COD|FOB|gle slyly requests. blithely ironi +44579|719|84|4|27|43732.17|0.01|0.00|N|O|1995-08-04|1995-08-22|1995-08-22|DELIVER IN PERSON|RAIL|uests sleep furiously a +44579|441|100|5|49|65730.56|0.09|0.00|N|O|1995-08-26|1995-08-27|1995-09-03|COLLECT COD|REG AIR|ly unusual orbits are f +44579|312|41|6|24|29095.44|0.03|0.03|N|O|1995-09-16|1995-08-29|1995-10-10|NONE|RAIL|ckly unusual accounts. even ideas slee +44579|1062|68|7|4|3852.24|0.02|0.03|N|F|1995-06-05|1995-07-15|1995-06-21|COLLECT COD|AIR| ironic theodolites? special dolphins integ +44580|119|20|1|33|33630.63|0.09|0.03|R|F|1992-06-28|1992-05-04|1992-06-29|DELIVER IN PERSON|FOB|hins unwind. slyly sly dolphins ha +44580|897|31|2|15|26968.35|0.04|0.03|R|F|1992-07-14|1992-05-21|1992-08-11|NONE|TRUCK|s affix. blithely iro +44580|1884|71|3|19|33931.72|0.05|0.07|A|F|1992-04-12|1992-05-10|1992-04-26|NONE|AIR|refully regular packages alon +44581|1224|99|1|24|27005.28|0.03|0.07|N|O|1997-12-02|1998-01-11|1997-12-16|DELIVER IN PERSON|SHIP|ect accordi +44581|507|8|2|40|56300.00|0.05|0.06|N|O|1997-12-08|1998-02-07|1997-12-22|DELIVER IN PERSON|MAIL|iously dogged decoys boost evenly above the +44581|587|88|3|49|72891.42|0.01|0.06|N|O|1998-02-15|1998-02-05|1998-03-04|COLLECT COD|TRUCK|oss the pending gifts integrate carefully +44581|644|45|4|24|37071.36|0.08|0.00|N|O|1997-12-17|1998-01-22|1997-12-23|NONE|TRUCK|lyly silent foxes. +44581|1014|85|5|34|31110.34|0.09|0.08|N|O|1998-02-17|1998-01-27|1998-02-25|TAKE BACK RETURN|REG AIR|osits according t +44581|1957|58|6|32|59486.40|0.02|0.02|N|O|1997-12-18|1998-01-27|1997-12-28|NONE|REG AIR|e, pending accounts use a +44582|1337|52|1|38|47056.54|0.06|0.06|N|O|1997-01-10|1997-01-01|1997-01-15|NONE|SHIP|he excuses. instructions across +44582|793|58|2|22|37263.38|0.04|0.01|N|O|1997-01-06|1997-02-11|1997-01-09|COLLECT COD|SHIP|g, bold deposits alongside of the furi +44583|1053|59|1|20|19081.00|0.06|0.05|A|F|1994-12-22|1994-11-15|1994-12-30|NONE|SHIP|thely about the notornis. slyly r +44583|391|92|2|41|52946.99|0.08|0.05|A|F|1994-11-27|1994-12-02|1994-12-24|COLLECT COD|AIR|l packages cajole along +44608|1868|55|1|42|74334.12|0.07|0.07|R|F|1992-05-07|1992-04-25|1992-05-13|COLLECT COD|RAIL|ly around the even accounts. courts +44608|495|96|2|45|62797.05|0.10|0.07|R|F|1992-04-01|1992-03-17|1992-04-02|COLLECT COD|MAIL|lly silent dependencies. blithely final de +44608|105|6|3|20|20102.00|0.04|0.00|R|F|1992-02-11|1992-03-12|1992-02-13|DELIVER IN PERSON|REG AIR|efully express instructions pro +44608|242|43|4|45|51400.80|0.06|0.00|R|F|1992-05-14|1992-03-24|1992-05-24|TAKE BACK RETURN|SHIP| blithely express asymptotes thrash caref +44608|1502|23|5|21|29473.50|0.01|0.03|R|F|1992-02-08|1992-03-21|1992-02-16|DELIVER IN PERSON|TRUCK|ietly regular ac +44608|343|72|6|2|2486.68|0.08|0.04|A|F|1992-05-02|1992-03-14|1992-05-09|DELIVER IN PERSON|FOB|es. final dependencies nag caref +44608|764|61|7|23|38289.48|0.02|0.06|R|F|1992-04-29|1992-04-08|1992-05-15|NONE|MAIL|out the regularly unusual requ +44609|1789|74|1|21|35506.38|0.02|0.08|N|O|1995-09-09|1995-09-08|1995-09-14|NONE|FOB|yly express packages wake carefully a +44609|812|12|2|4|6851.24|0.08|0.06|N|O|1995-08-29|1995-08-19|1995-09-12|DELIVER IN PERSON|REG AIR| packages alo +44609|395|52|3|38|49224.82|0.01|0.06|N|O|1995-08-01|1995-08-09|1995-08-04|NONE|RAIL|inal deposits along the quickly +44609|385|42|4|24|30849.12|0.05|0.00|N|O|1995-06-30|1995-08-04|1995-07-26|COLLECT COD|AIR| courts mold permanent accounts: instr +44609|332|33|5|40|49293.20|0.01|0.05|N|O|1995-09-01|1995-08-01|1995-09-18|DELIVER IN PERSON|REG AIR|gly after the +44609|118|45|6|20|20362.20|0.02|0.05|N|O|1995-08-23|1995-07-21|1995-08-28|TAKE BACK RETURN|RAIL|latelets nag furiously at the regular +44610|185|64|1|17|18448.06|0.10|0.02|A|F|1995-04-12|1995-04-16|1995-04-25|COLLECT COD|FOB|nically bold accounts +44610|374|3|2|22|28036.14|0.04|0.02|N|F|1995-06-04|1995-05-04|1995-06-18|DELIVER IN PERSON|SHIP|le furiously alongside of the care +44610|1278|90|3|40|47170.80|0.02|0.04|R|F|1995-04-28|1995-05-05|1995-05-01|TAKE BACK RETURN|REG AIR|counts. pending platel +44610|1152|25|4|45|47391.75|0.06|0.04|N|O|1995-06-26|1995-05-08|1995-06-29|COLLECT COD|RAIL|final dolphins! foxes +44610|697|98|5|16|25563.04|0.08|0.08|R|F|1995-04-18|1995-05-05|1995-05-01|TAKE BACK RETURN|MAIL|sual accounts except the +44611|260|42|1|30|34807.80|0.05|0.00|N|O|1997-09-20|1997-10-13|1997-10-05|COLLECT COD|FOB|sly unusual d +44611|1386|87|2|29|37334.02|0.03|0.06|N|O|1997-09-19|1997-10-13|1997-09-26|TAKE BACK RETURN|MAIL|l tithes nag. furiously +44611|1249|24|3|2|2300.48|0.09|0.03|N|O|1997-09-26|1997-09-13|1997-10-09|DELIVER IN PERSON|REG AIR|across the b +44611|974|77|4|35|65623.95|0.04|0.05|N|O|1997-10-19|1997-09-29|1997-11-16|NONE|REG AIR| alongside of the regular +44612|559|20|1|27|39407.85|0.03|0.03|A|F|1995-05-13|1995-06-09|1995-05-17|COLLECT COD|SHIP|ar requests print furiously si +44612|958|59|2|42|78075.90|0.08|0.07|N|O|1995-07-05|1995-05-05|1995-07-16|DELIVER IN PERSON|SHIP|en deposits. deposits at the caref +44612|137|64|3|10|10371.30|0.02|0.03|A|F|1995-04-28|1995-05-20|1995-05-09|TAKE BACK RETURN|REG AIR|posits. carefully ev +44612|1135|72|4|19|19686.47|0.00|0.04|R|F|1995-05-15|1995-05-20|1995-05-19|NONE|AIR|ckages. quickly ironic instructions +44612|964|99|5|7|13054.72|0.01|0.08|N|O|1995-07-12|1995-05-04|1995-07-23|NONE|REG AIR|ackages-- regular dependencies sle +44613|1555|96|1|16|23304.80|0.02|0.04|A|F|1993-09-17|1993-11-15|1993-10-13|TAKE BACK RETURN|TRUCK|ke idly. final accounts na +44613|383|84|2|43|55185.34|0.09|0.05|R|F|1993-11-15|1993-11-28|1993-11-17|DELIVER IN PERSON|REG AIR|lites. final accounts sleep atop the final +44613|40|66|3|47|44181.88|0.05|0.02|R|F|1993-12-25|1993-11-07|1993-12-27|NONE|REG AIR|equests mold among the packages. blith +44613|1435|53|4|8|10691.44|0.10|0.03|R|F|1993-10-23|1993-11-23|1993-10-25|DELIVER IN PERSON|RAIL|ets cajole. tithes doze. even idea +44614|1191|64|1|21|22935.99|0.09|0.03|R|F|1993-09-20|1993-08-04|1993-09-21|COLLECT COD|FOB|ithely unusual pac +44614|300|55|2|18|21605.40|0.02|0.05|R|F|1993-09-17|1993-08-28|1993-09-18|COLLECT COD|TRUCK|ts cajole sl +44614|600|91|3|8|12004.80|0.08|0.00|R|F|1993-08-17|1993-08-15|1993-08-27|DELIVER IN PERSON|RAIL|y regular packages haggle carefully. pendin +44614|1803|90|4|34|57963.20|0.10|0.04|A|F|1993-07-13|1993-08-17|1993-07-26|DELIVER IN PERSON|RAIL|ntly special excu +44614|1714|57|5|32|51702.72|0.07|0.06|R|F|1993-06-19|1993-07-25|1993-07-14|DELIVER IN PERSON|TRUCK|ckly sometimes ironi +44614|1647|71|6|20|30972.80|0.10|0.04|A|F|1993-07-28|1993-08-16|1993-08-14|COLLECT COD|AIR|al, regular pinto beans. ironic, speci +44615|1551|92|1|48|69722.40|0.08|0.01|R|F|1993-05-19|1993-07-14|1993-06-03|NONE|RAIL|ding requests! fi +44615|380|65|2|7|8962.66|0.03|0.08|R|F|1993-08-24|1993-07-04|1993-09-15|NONE|AIR|s fluffily blithely sp +44615|769|2|3|11|18367.36|0.02|0.01|R|F|1993-08-03|1993-06-25|1993-08-15|NONE|REG AIR|y along the special deposi +44615|1895|25|4|43|77266.27|0.03|0.03|R|F|1993-05-30|1993-08-07|1993-06-26|NONE|TRUCK| furiously pending depos +44615|441|100|5|24|32194.56|0.05|0.01|A|F|1993-06-11|1993-07-19|1993-07-11|DELIVER IN PERSON|AIR| sleep blithely. regular, regu +44640|646|9|1|40|61865.60|0.01|0.02|N|O|1997-12-18|1997-12-29|1998-01-12|NONE|RAIL|arefully regular asymptotes. dogged courts +44640|327|28|2|17|20864.44|0.04|0.06|N|O|1997-11-03|1997-11-13|1997-11-25|COLLECT COD|MAIL|silent accounts wake. slyly even +44640|1367|68|3|23|29172.28|0.05|0.06|N|O|1998-01-31|1997-12-09|1998-02-28|COLLECT COD|FOB|regular dolphins print. pinto beans +44641|1856|86|1|37|65040.45|0.05|0.05|N|O|1998-04-07|1998-04-04|1998-04-10|DELIVER IN PERSON|TRUCK|ideas sublate +44641|540|41|2|26|37454.04|0.01|0.04|N|O|1998-03-02|1998-04-05|1998-03-04|TAKE BACK RETURN|AIR|lites. pinto beans are carefully sly +44641|1143|44|3|45|46986.30|0.03|0.08|N|O|1998-05-04|1998-05-15|1998-05-28|NONE|TRUCK|ly regular pint +44642|1813|57|1|50|85740.50|0.10|0.08|N|O|1998-02-22|1998-01-21|1998-03-22|TAKE BACK RETURN|TRUCK|- furiously specia +44642|957|26|2|23|42732.85|0.07|0.04|N|O|1997-12-29|1998-02-17|1998-01-13|COLLECT COD|FOB|ress accounts cajole through the slyly regu +44642|1048|84|3|30|28471.20|0.01|0.01|N|O|1998-01-31|1998-02-17|1998-02-28|TAKE BACK RETURN|FOB|ray carefull +44642|1633|57|4|15|23019.45|0.02|0.02|N|O|1998-04-12|1998-01-21|1998-04-15|DELIVER IN PERSON|RAIL|the pending +44642|1984|85|5|47|88641.06|0.03|0.03|N|O|1998-03-18|1998-01-18|1998-04-06|NONE|MAIL|rays. ironic packages nag regula +44643|233|88|1|20|22664.60|0.04|0.08|A|F|1994-07-14|1994-04-18|1994-08-06|DELIVER IN PERSON|TRUCK|pending deposit +44643|820|20|2|33|56787.06|0.05|0.02|R|F|1994-03-30|1994-06-09|1994-04-09|DELIVER IN PERSON|SHIP|nt dolphins use furio +44643|421|51|3|29|38321.18|0.06|0.06|R|F|1994-05-28|1994-05-05|1994-06-26|TAKE BACK RETURN|TRUCK|s. express requests +44643|1140|77|4|19|19781.66|0.03|0.02|A|F|1994-06-22|1994-06-02|1994-07-15|COLLECT COD|TRUCK|althily. ironic, even escapades h +44644|481|40|1|22|30392.56|0.07|0.00|N|O|1996-02-05|1996-03-20|1996-02-14|TAKE BACK RETURN|AIR|ly final acco +44645|1931|32|1|34|62319.62|0.03|0.04|R|F|1995-04-22|1995-06-17|1995-05-15|TAKE BACK RETURN|TRUCK|sits at the quick, +44646|729|30|1|18|29334.96|0.03|0.04|R|F|1992-02-23|1992-02-06|1992-02-25|COLLECT COD|RAIL|s nag caref +44646|1989|22|2|14|26473.72|0.02|0.05|A|F|1992-04-10|1992-03-13|1992-05-07|TAKE BACK RETURN|AIR|, unusual foxes nag along the furiously s +44646|73|99|3|47|45734.29|0.08|0.01|R|F|1992-02-12|1992-03-09|1992-02-25|TAKE BACK RETURN|RAIL|requests cajole slyly across +44647|1284|96|1|14|16593.92|0.05|0.01|R|F|1992-05-08|1992-04-11|1992-05-23|NONE|FOB|le idly furiously final deposits. +44647|1348|49|2|41|51222.94|0.01|0.02|A|F|1992-04-01|1992-04-09|1992-04-24|DELIVER IN PERSON|AIR|layers hinder slyly around th +44647|1157|66|3|45|47616.75|0.01|0.04|R|F|1992-04-03|1992-04-24|1992-04-18|DELIVER IN PERSON|FOB|its wake quickly b +44647|1832|76|4|5|8669.15|0.08|0.02|A|F|1992-03-01|1992-03-02|1992-03-16|COLLECT COD|TRUCK|use blithely ironic theodoli +44647|1209|47|5|25|27755.00|0.03|0.02|R|F|1992-02-15|1992-04-11|1992-03-08|TAKE BACK RETURN|TRUCK| haggle carefully ideas. final reques +44647|1462|63|6|21|28632.66|0.02|0.07|A|F|1992-03-20|1992-04-23|1992-03-30|NONE|AIR|ely ironic requests. slyly unusu +44647|951|54|7|38|70374.10|0.08|0.04|A|F|1992-02-21|1992-04-17|1992-03-22|DELIVER IN PERSON|TRUCK|al theodolites boost quic +44672|1576|97|1|23|33984.11|0.05|0.04|N|O|1998-06-08|1998-06-17|1998-07-08|NONE|SHIP| along the +44672|447|35|2|37|49855.28|0.03|0.07|N|O|1998-07-12|1998-06-08|1998-08-05|DELIVER IN PERSON|AIR|ar dolphins run fl +44672|263|64|3|21|24428.46|0.00|0.01|N|O|1998-06-20|1998-05-29|1998-07-15|NONE|AIR|t the slyly even excuses. express foxes +44673|1583|4|1|30|44537.40|0.00|0.02|N|O|1996-10-04|1996-11-14|1996-10-31|COLLECT COD|SHIP| dependencies. bl +44673|1709|52|2|1|1610.70|0.01|0.01|N|O|1996-12-24|1996-11-13|1997-01-13|TAKE BACK RETURN|MAIL|e furiously unusual accounts. qu +44673|1580|1|3|7|10371.06|0.03|0.02|N|O|1996-10-24|1996-10-20|1996-11-17|TAKE BACK RETURN|FOB|furiously special packages. blithely re +44674|858|92|1|15|26382.75|0.10|0.06|N|O|1996-12-24|1996-12-15|1997-01-10|NONE|AIR|olites. carefully unusual pinto beans s +44674|151|52|2|49|51506.35|0.00|0.04|N|O|1996-12-12|1996-11-08|1997-01-05|NONE|FOB| final, stealthy accounts nag quickly bl +44674|1962|51|3|22|41007.12|0.00|0.08|N|O|1996-12-01|1996-12-01|1996-12-04|DELIVER IN PERSON|SHIP|hely regular account +44674|312|41|4|26|31520.06|0.02|0.07|N|O|1997-01-16|1996-12-27|1997-02-04|NONE|REG AIR|ronic instructions boost along the blit +44674|1724|51|5|41|66654.52|0.04|0.00|N|O|1996-12-17|1996-11-30|1997-01-13|COLLECT COD|SHIP|s unwind. ir +44675|227|55|1|21|23671.62|0.05|0.03|N|O|1996-07-23|1996-05-28|1996-08-14|COLLECT COD|TRUCK|furiously carefully b +44675|772|5|2|27|45164.79|0.03|0.08|N|O|1996-07-14|1996-05-20|1996-07-19|DELIVER IN PERSON|SHIP|se slyly darin +44675|38|39|3|6|5628.18|0.01|0.01|N|O|1996-04-26|1996-05-31|1996-05-01|DELIVER IN PERSON|MAIL|t the dolphin +44676|1474|92|1|48|66022.56|0.10|0.06|N|O|1998-07-17|1998-05-28|1998-07-31|TAKE BACK RETURN|FOB|nal packages +44676|1668|10|2|24|37671.84|0.01|0.04|N|O|1998-06-20|1998-05-13|1998-06-30|NONE|SHIP|carefully even theodolites a +44676|1333|34|3|4|4937.32|0.07|0.02|N|O|1998-07-14|1998-06-03|1998-07-30|COLLECT COD|TRUCK|ep furiously! fluffily regular warhor +44676|125|52|4|16|16401.92|0.08|0.08|N|O|1998-04-27|1998-05-07|1998-05-05|NONE|AIR| haggle. patt +44676|1458|59|5|5|6797.25|0.06|0.02|N|O|1998-06-24|1998-04-26|1998-07-08|DELIVER IN PERSON|SHIP|kages. slyly pending asympt +44677|968|69|1|28|52330.88|0.02|0.01|N|O|1997-09-06|1997-09-18|1997-09-17|COLLECT COD|FOB|ular accounts haggle. unusual excuses +44678|682|76|1|42|66472.56|0.08|0.01|R|F|1993-01-11|1992-11-13|1993-01-27|COLLECT COD|AIR|p; quickly regular pa +44678|1202|14|2|7|7722.40|0.07|0.06|A|F|1992-10-22|1992-12-08|1992-11-21|NONE|AIR|cies are qui +44678|1607|31|3|3|4525.80|0.02|0.03|A|F|1992-10-21|1992-12-27|1992-10-31|COLLECT COD|AIR|efully regu +44678|1431|32|4|44|58626.92|0.08|0.04|R|F|1993-01-23|1992-12-13|1993-02-10|TAKE BACK RETURN|TRUCK|kly perman +44678|407|95|5|5|6537.00|0.09|0.06|R|F|1992-10-28|1992-11-13|1992-11-08|NONE|REG AIR|thely pending dep +44678|633|34|6|28|42941.64|0.09|0.00|A|F|1992-12-27|1993-01-04|1993-01-19|DELIVER IN PERSON|RAIL|gular pinto +44678|1654|96|7|9|14000.85|0.05|0.08|R|F|1992-11-22|1992-11-22|1992-12-12|TAKE BACK RETURN|SHIP|al accounts. furiously silent dependenci +44679|1924|69|1|31|56603.52|0.08|0.05|R|F|1992-07-06|1992-08-04|1992-07-15|TAKE BACK RETURN|FOB|ermanent requests. slyly final fo +44679|596|27|2|26|38911.34|0.06|0.03|A|F|1992-06-22|1992-07-13|1992-07-15|TAKE BACK RETURN|AIR| quiet instr +44704|1358|35|1|42|52892.70|0.06|0.01|N|O|1997-05-04|1997-04-16|1997-05-28|COLLECT COD|MAIL|sits. quickly express esca +44704|1081|82|2|35|34372.80|0.05|0.05|N|O|1997-04-22|1997-04-09|1997-04-25|TAKE BACK RETURN|MAIL|lithely ironic accounts. even soma +44704|719|52|3|29|46971.59|0.09|0.01|N|O|1997-05-27|1997-03-09|1997-05-30|TAKE BACK RETURN|MAIL|ions wake. theodolites +44705|763|64|1|37|61559.12|0.03|0.07|N|O|1996-11-02|1996-10-25|1996-11-26|NONE|AIR| regular deposits. final accounts wake ab +44705|810|44|2|47|80408.07|0.03|0.03|N|O|1996-12-18|1996-11-07|1996-12-24|COLLECT COD|RAIL|eep furiou +44705|370|71|3|37|47003.69|0.05|0.03|N|O|1996-09-13|1996-11-18|1996-10-09|COLLECT COD|FOB|le slyly blithely pending re +44705|1182|91|4|9|9748.62|0.08|0.00|N|O|1996-11-23|1996-10-22|1996-12-17|TAKE BACK RETURN|FOB|g to the slyly bold packages. finally bu +44706|1104|41|1|49|49249.90|0.01|0.02|R|F|1993-07-20|1993-05-17|1993-07-28|DELIVER IN PERSON|SHIP|y unusual packages +44706|1255|93|2|29|33531.25|0.04|0.07|R|F|1993-05-23|1993-05-13|1993-06-01|NONE|SHIP|lly regular patt +44706|897|31|3|36|64724.04|0.02|0.04|R|F|1993-05-15|1993-06-16|1993-05-16|DELIVER IN PERSON|REG AIR|ccounts above the carefully expres +44706|648|11|4|33|51105.12|0.07|0.08|R|F|1993-06-08|1993-05-16|1993-06-23|NONE|AIR|y even foxes. furiously reg +44707|1763|64|1|50|83238.00|0.09|0.02|N|O|1997-08-25|1997-10-21|1997-09-24|DELIVER IN PERSON|TRUCK| regular packages are carefully +44707|1563|44|2|50|73228.00|0.10|0.08|N|O|1997-09-10|1997-10-25|1997-09-15|NONE|MAIL| are. quickly bold platelets wake carefull +44707|1994|39|3|48|91007.52|0.03|0.02|N|O|1997-11-19|1997-09-25|1997-11-24|COLLECT COD|REG AIR|he silent deposits haggle fina +44707|687|50|4|45|71445.60|0.02|0.06|N|O|1997-08-24|1997-09-23|1997-09-01|NONE|FOB|nto beans detect ruthlessly about the speci +44707|1805|49|5|36|61444.80|0.00|0.01|N|O|1997-08-16|1997-11-02|1997-08-18|COLLECT COD|RAIL|y regular requests. slyly even ac +44707|1268|69|6|50|58463.00|0.08|0.06|N|O|1997-11-15|1997-09-23|1997-12-08|TAKE BACK RETURN|MAIL|ess foxes sleep slyly slyly final the +44708|202|57|1|37|40781.40|0.03|0.07|A|F|1994-10-16|1994-10-11|1994-10-20|TAKE BACK RETURN|MAIL|ally express deposits run careful +44708|1280|81|2|18|21263.04|0.09|0.00|A|F|1994-10-27|1994-09-25|1994-11-23|TAKE BACK RETURN|FOB| carefully unusual accounts; +44709|1104|5|1|50|50255.00|0.01|0.01|N|O|1996-04-23|1996-03-16|1996-05-14|COLLECT COD|TRUCK|ly after the fluffily r +44710|1185|94|1|37|40188.66|0.04|0.08|N|O|1995-08-28|1995-08-09|1995-09-27|TAKE BACK RETURN|AIR|dly accordin +44711|17|43|1|41|37597.41|0.10|0.08|A|F|1994-11-25|1994-10-13|1994-12-02|COLLECT COD|TRUCK|furiously slyly +44711|147|74|2|21|21989.94|0.08|0.05|R|F|1994-09-10|1994-10-11|1994-10-05|NONE|SHIP|ecoys wake. caref +44736|143|22|1|24|25035.36|0.02|0.03|R|F|1993-07-17|1993-06-15|1993-08-14|TAKE BACK RETURN|REG AIR|s use furiously. fluffy deposits are fu +44736|720|53|2|45|72932.40|0.04|0.06|A|F|1993-06-03|1993-06-01|1993-06-21|NONE|FOB|cial instructions: carefully +44737|156|9|1|24|25347.60|0.05|0.07|R|F|1993-01-27|1993-02-11|1993-02-09|DELIVER IN PERSON|MAIL|hang blithely. +44737|1313|52|2|15|18214.65|0.10|0.01|A|F|1993-01-13|1992-12-20|1993-02-07|TAKE BACK RETURN|SHIP|f the silent d +44737|612|13|3|48|72605.28|0.10|0.02|R|F|1993-02-15|1993-01-27|1993-03-15|NONE|REG AIR|heodolites. dolphins boost slyly. pen +44737|1621|45|4|1|1522.62|0.01|0.07|R|F|1993-01-20|1993-01-27|1993-02-03|COLLECT COD|SHIP|y even orbits. slyly even accounts s +44737|96|47|5|5|4980.45|0.01|0.07|R|F|1993-01-19|1993-01-08|1993-02-01|NONE|RAIL|fully unusual deposits are alongs +44737|236|18|6|45|51130.35|0.05|0.01|R|F|1993-01-15|1993-02-12|1993-02-02|COLLECT COD|FOB| even ideas promise slyly i +44737|739|36|7|29|47552.17|0.10|0.01|A|F|1993-02-28|1993-02-16|1993-03-03|NONE|SHIP|. unusual deposits integrate blithely +44738|1261|62|1|3|3486.78|0.10|0.06|A|F|1994-03-04|1994-02-04|1994-03-12|COLLECT COD|FOB|ackages. furiously exp +44738|1761|4|2|26|43231.76|0.05|0.00|R|F|1994-03-18|1994-02-10|1994-04-01|NONE|RAIL|ar request +44738|815|49|3|37|63484.97|0.03|0.01|A|F|1994-03-07|1994-01-15|1994-03-28|NONE|RAIL|ly regular +44738|1594|15|4|29|43372.11|0.10|0.04|R|F|1994-02-25|1994-01-12|1994-03-14|COLLECT COD|AIR|carefully final +44738|721|86|5|11|17838.92|0.07|0.04|R|F|1993-12-18|1994-02-27|1994-01-12|TAKE BACK RETURN|TRUCK|lites. furiousl +44739|525|16|1|22|31361.44|0.02|0.00|N|O|1998-07-20|1998-08-01|1998-07-30|TAKE BACK RETURN|MAIL|counts. blith +44739|1196|5|2|4|4388.76|0.04|0.00|N|O|1998-05-29|1998-07-13|1998-06-27|COLLECT COD|FOB| platelets haggle fluffily. e +44739|735|36|3|14|22900.22|0.06|0.05|N|O|1998-06-17|1998-06-29|1998-06-24|TAKE BACK RETURN|MAIL|furious sentimen +44740|878|12|1|16|28461.92|0.00|0.00|R|F|1992-07-02|1992-07-15|1992-07-05|NONE|MAIL|r foxes. special +44740|1579|100|2|20|29611.40|0.03|0.08|R|F|1992-08-15|1992-07-31|1992-08-27|DELIVER IN PERSON|REG AIR| regularly slyly regular pinto beans +44740|1513|94|3|23|32533.73|0.06|0.04|A|F|1992-07-07|1992-08-29|1992-08-01|NONE|REG AIR|e furiously. sometimes final +44740|664|58|4|5|7823.30|0.01|0.01|R|F|1992-09-20|1992-08-16|1992-10-11|NONE|SHIP|s cajole slyly around the requests. +44740|1606|7|5|2|3015.20|0.07|0.06|R|F|1992-07-28|1992-08-01|1992-08-12|COLLECT COD|MAIL| at the slyly final theodolite +44740|1035|6|6|8|7488.24|0.10|0.04|R|F|1992-07-21|1992-07-08|1992-07-24|TAKE BACK RETURN|TRUCK|doggedly. final esca +44741|1368|7|1|17|21579.12|0.08|0.00|N|O|1998-05-29|1998-06-12|1998-06-17|TAKE BACK RETURN|SHIP| the even, even packages try to wake +44742|283|38|1|18|21299.04|0.04|0.08|A|F|1993-03-16|1993-04-28|1993-04-14|COLLECT COD|MAIL|al foxes. even ideas use a +44742|1355|94|2|36|45228.60|0.03|0.01|R|F|1993-04-11|1993-05-03|1993-04-30|TAKE BACK RETURN|MAIL| regular ideas believe. fu +44742|514|15|3|9|12730.59|0.05|0.02|A|F|1993-03-29|1993-05-19|1993-04-09|NONE|REG AIR|dependencies. +44742|1856|43|4|35|61524.75|0.03|0.05|A|F|1993-03-10|1993-04-15|1993-03-13|DELIVER IN PERSON|AIR|gular packages sleep c +44743|33|34|1|30|27990.90|0.06|0.05|N|O|1996-05-02|1996-02-04|1996-05-23|DELIVER IN PERSON|AIR|ogs sleep carefull +44743|1078|84|2|17|16644.19|0.08|0.00|N|O|1996-04-05|1996-03-18|1996-05-05|DELIVER IN PERSON|RAIL|accounts. depths grow slyly. ironic +44743|1222|60|3|25|28080.50|0.10|0.03|N|O|1996-01-12|1996-02-06|1996-02-10|NONE|MAIL| requests cajole slyly across the carefull +44768|383|12|1|24|30801.12|0.00|0.03|R|F|1992-09-19|1992-07-21|1992-10-10|DELIVER IN PERSON|SHIP| carefully even multipli +44768|1894|24|2|3|5387.67|0.09|0.08|R|F|1992-07-06|1992-08-10|1992-08-03|NONE|FOB|osits cajole among the slyly final d +44768|37|63|3|1|937.03|0.07|0.01|R|F|1992-07-15|1992-07-27|1992-08-03|COLLECT COD|AIR|. blithely furious requests are +44768|342|43|4|16|19877.44|0.10|0.07|R|F|1992-08-30|1992-07-21|1992-09-29|COLLECT COD|SHIP|carefully across the even +44768|1506|87|5|46|64745.00|0.01|0.05|A|F|1992-07-30|1992-08-05|1992-08-14|TAKE BACK RETURN|REG AIR|side of the fluffily final pa +44768|707|40|6|26|41800.20|0.01|0.07|R|F|1992-06-18|1992-07-10|1992-07-02|DELIVER IN PERSON|SHIP|ake ruthlessl +44769|760|57|1|37|61448.12|0.07|0.02|R|F|1993-04-27|1993-03-22|1993-05-14|TAKE BACK RETURN|SHIP|e fluffily platelets. even, final pac +44770|776|73|1|25|41919.25|0.10|0.03|N|O|1998-09-02|1998-07-31|1998-10-01|NONE|AIR| boost idly +44770|1696|97|2|37|59114.53|0.08|0.05|N|O|1998-05-30|1998-07-15|1998-06-01|TAKE BACK RETURN|TRUCK|tornis sleep blithely across the +44770|1162|71|3|9|9568.44|0.04|0.08|N|O|1998-07-16|1998-07-31|1998-08-11|COLLECT COD|SHIP|ng to the theodolites. special, ironic t +44770|623|17|4|15|22854.30|0.10|0.07|N|O|1998-08-12|1998-08-01|1998-09-04|TAKE BACK RETURN|REG AIR|carefully blithe sauternes was +44770|696|28|5|24|38320.56|0.00|0.07|N|O|1998-06-10|1998-08-17|1998-06-20|NONE|REG AIR|integrate q +44771|508|39|1|10|14085.00|0.06|0.08|N|O|1996-12-27|1996-12-25|1997-01-12|TAKE BACK RETURN|TRUCK| ironic accounts sho +44771|1663|5|2|23|35987.18|0.02|0.04|N|O|1996-11-22|1996-11-18|1996-11-29|COLLECT COD|MAIL|ly according to the slyly final de +44771|1721|48|3|24|38945.28|0.05|0.08|N|O|1996-12-03|1996-11-09|1996-12-23|COLLECT COD|TRUCK|usly even accounts. express asy +44771|1449|28|4|20|27008.80|0.10|0.06|N|O|1997-01-26|1996-11-18|1997-02-24|TAKE BACK RETURN|AIR|regular, unusual deposits play +44771|823|57|5|36|62057.52|0.02|0.08|N|O|1997-01-01|1997-01-07|1997-01-02|DELIVER IN PERSON|TRUCK| according to the ironic, +44772|1268|6|1|44|51447.44|0.07|0.06|R|F|1994-04-10|1994-05-24|1994-05-10|NONE|MAIL|ecial request +44772|951|52|2|14|25927.30|0.05|0.01|A|F|1994-06-19|1994-05-14|1994-06-25|DELIVER IN PERSON|SHIP|uses according to the slyly pending pl +44772|983|84|3|33|62171.34|0.00|0.06|A|F|1994-06-16|1994-06-15|1994-06-25|DELIVER IN PERSON|REG AIR|riously ste +44772|1540|41|4|11|15856.94|0.10|0.02|R|F|1994-06-04|1994-06-02|1994-06-16|COLLECT COD|TRUCK|regular packages. bravely fina +44773|777|42|1|47|78855.19|0.07|0.05|N|O|1996-05-17|1996-05-17|1996-05-30|TAKE BACK RETURN|MAIL|kages. even deposits do wake beyond the +44774|1497|76|1|39|54541.11|0.07|0.08|N|O|1998-07-26|1998-09-09|1998-08-17|COLLECT COD|MAIL| at the accounts detect f +44774|384|13|2|17|21834.46|0.03|0.06|N|O|1998-08-16|1998-08-14|1998-08-26|DELIVER IN PERSON|RAIL|. enticingly even requests sleep +44774|476|6|3|2|2752.94|0.08|0.02|N|O|1998-08-29|1998-08-25|1998-09-20|DELIVER IN PERSON|FOB|ter the bli +44774|223|24|4|33|37066.26|0.08|0.02|N|O|1998-09-16|1998-09-09|1998-09-25|TAKE BACK RETURN|SHIP|its. express foxes boost acro +44774|1983|72|5|23|43354.54|0.10|0.00|N|O|1998-10-11|1998-09-20|1998-11-07|NONE|REG AIR|beans nag blithely expr +44775|1608|50|1|1|1509.60|0.10|0.00|R|F|1994-10-22|1994-12-06|1994-11-17|COLLECT COD|TRUCK| detect blith +44775|1672|55|2|8|12589.36|0.08|0.00|R|F|1994-12-11|1994-11-01|1995-01-05|DELIVER IN PERSON|RAIL| unusual tithes +44800|572|3|1|14|20615.98|0.04|0.01|N|O|1995-12-18|1995-11-13|1996-01-02|COLLECT COD|TRUCK| express, ironic deposits +44800|1420|21|2|37|48892.54|0.04|0.07|N|O|1995-11-14|1995-09-24|1995-11-17|DELIVER IN PERSON|RAIL|egular pac +44800|325|10|3|24|29407.68|0.10|0.05|N|O|1995-11-26|1995-10-17|1995-12-26|DELIVER IN PERSON|FOB|ronic warthogs. +44800|337|66|4|48|59391.84|0.03|0.01|N|O|1995-08-28|1995-10-02|1995-08-31|TAKE BACK RETURN|FOB|ly according to the s +44800|425|84|5|24|31810.08|0.05|0.00|N|O|1995-12-14|1995-10-19|1996-01-09|DELIVER IN PERSON|FOB|fully to the patterns. careful +44800|1104|13|6|20|20102.00|0.07|0.02|N|O|1995-11-09|1995-11-10|1995-11-14|DELIVER IN PERSON|MAIL|ffily express asymptotes about th +44801|1765|50|1|28|46669.28|0.06|0.07|N|O|1997-01-14|1997-03-16|1997-02-06|NONE|REG AIR|eposits boos +44801|1879|23|2|1|1780.87|0.08|0.04|N|O|1997-01-31|1997-03-08|1997-02-28|DELIVER IN PERSON|RAIL|. slyly even deposits use. slyly regular +44802|1499|100|1|15|21007.35|0.04|0.02|A|F|1992-02-16|1992-04-26|1992-03-08|DELIVER IN PERSON|RAIL|deposits. blithely ironic deposits en +44802|273|1|2|19|22292.13|0.10|0.04|R|F|1992-02-10|1992-04-09|1992-02-26|DELIVER IN PERSON|FOB|al, ironic foxes. carefully ironic +44803|1626|27|1|35|53466.70|0.06|0.05|N|O|1998-09-13|1998-10-09|1998-09-21|DELIVER IN PERSON|TRUCK|slyly around the carefully silent +44803|1335|12|2|21|25962.93|0.01|0.00|N|O|1998-10-01|1998-09-01|1998-10-18|COLLECT COD|SHIP|cording to the ironic w +44803|1542|23|3|10|14435.40|0.06|0.07|N|O|1998-10-28|1998-08-27|1998-11-09|NONE|REG AIR|cial ideas. packag +44803|1788|15|4|48|81109.44|0.02|0.02|N|O|1998-10-03|1998-08-31|1998-10-08|COLLECT COD|SHIP|sly against the requests. f +44804|642|5|1|23|35480.72|0.00|0.05|N|O|1996-03-16|1996-03-24|1996-04-05|NONE|MAIL| along the carefully ironic theodolit +44804|1953|42|2|18|33389.10|0.05|0.00|N|O|1996-04-20|1996-04-12|1996-04-23|TAKE BACK RETURN|RAIL|ly. slyly ironic dependencies ca +44804|486|74|3|48|66551.04|0.04|0.07|N|O|1996-02-26|1996-03-29|1996-02-28|COLLECT COD|RAIL|furiously id +44804|1429|8|4|39|51886.38|0.09|0.06|N|O|1996-02-15|1996-03-20|1996-02-25|NONE|FOB|jole furiously for t +44804|1131|4|5|3|3096.39|0.10|0.06|N|O|1996-03-08|1996-04-29|1996-03-15|DELIVER IN PERSON|TRUCK|xcuses engage blit +44805|582|83|1|44|65233.52|0.09|0.01|A|F|1992-12-02|1992-10-18|1992-12-25|NONE|MAIL|e slyly against the i +44806|238|20|1|13|14796.99|0.04|0.05|N|O|1998-03-17|1998-01-17|1998-04-10|NONE|MAIL|deposits use blithely. excuses +44806|1781|24|2|8|13462.24|0.05|0.08|N|O|1998-03-31|1998-02-06|1998-04-26|TAKE BACK RETURN|MAIL|s. sometimes bold theodolites cajole s +44806|569|100|3|33|48495.48|0.03|0.00|N|O|1998-02-20|1998-01-31|1998-03-18|NONE|REG AIR|ts above the fluffily re +44806|956|57|4|11|20426.45|0.07|0.08|N|O|1998-01-01|1998-03-07|1998-01-10|NONE|MAIL|final idea +44806|667|99|5|24|37623.84|0.04|0.05|N|O|1998-03-27|1998-02-27|1998-04-02|DELIVER IN PERSON|TRUCK| to the pending pinto beans +44807|1957|58|1|38|70640.10|0.06|0.08|N|O|1998-07-25|1998-05-24|1998-07-27|NONE|REG AIR|ely according to the blithely ironi +44807|727|92|2|32|52087.04|0.09|0.05|N|O|1998-03-27|1998-05-19|1998-04-20|COLLECT COD|AIR|packages. regular theodolites amo +44807|80|6|3|47|46063.76|0.09|0.04|N|O|1998-06-12|1998-06-07|1998-06-15|COLLECT COD|REG AIR|riously unusual waters caj +44807|184|63|4|34|36862.12|0.09|0.07|N|O|1998-04-14|1998-06-21|1998-05-09|NONE|FOB|inos cajole blithely pending accounts-- p +44832|771|68|1|9|15045.93|0.01|0.05|N|O|1996-01-30|1996-02-28|1996-02-21|TAKE BACK RETURN|SHIP|ds. requests after the special, +44833|1159|96|1|45|47706.75|0.08|0.00|R|F|1994-11-05|1994-11-28|1994-11-09|DELIVER IN PERSON|TRUCK|ons haggle furiously at +44833|712|45|2|11|17739.81|0.08|0.03|A|F|1994-12-06|1994-12-14|1995-01-03|DELIVER IN PERSON|TRUCK|carefully s +44834|1483|23|1|14|19382.72|0.02|0.05|A|F|1994-08-10|1994-07-02|1994-09-05|COLLECT COD|MAIL|ng platelets. blithely regular +44834|1076|82|2|11|10747.77|0.09|0.05|A|F|1994-05-25|1994-05-28|1994-06-11|COLLECT COD|RAIL| requests whithout the carefully +44834|1173|74|3|32|34373.44|0.10|0.06|A|F|1994-08-01|1994-07-10|1994-08-07|TAKE BACK RETURN|TRUCK|posits. furi +44834|100|26|4|5|5000.50|0.07|0.07|A|F|1994-05-15|1994-07-20|1994-06-05|TAKE BACK RETURN|REG AIR| against the ironic packa +44834|1533|14|5|2|2869.06|0.10|0.01|A|F|1994-06-27|1994-05-30|1994-07-06|DELIVER IN PERSON|REG AIR|nts! quickl +44835|1508|9|1|47|66246.50|0.06|0.07|N|O|1997-11-05|1997-10-24|1997-12-03|NONE|MAIL|ronic pinto beans sleep deposits; slyly s +44835|950|53|2|45|83292.75|0.06|0.01|N|O|1997-10-22|1997-11-14|1997-11-21|DELIVER IN PERSON|FOB|telets are furiously. fluffily regula +44835|590|91|3|20|29811.80|0.00|0.03|N|O|1997-10-26|1997-10-02|1997-10-31|COLLECT COD|MAIL|s sleep; furiously regular instructions +44835|838|5|4|30|52164.90|0.05|0.00|N|O|1997-09-06|1997-10-29|1997-09-10|NONE|RAIL|p after the slyly final packages. furiously +44836|1655|56|1|28|43586.20|0.07|0.00|A|F|1994-10-06|1994-11-17|1994-10-31|COLLECT COD|AIR|y ideas sleep carefully quickly express p +44836|1769|70|2|23|38427.48|0.03|0.07|R|F|1994-12-21|1994-11-26|1995-01-15|TAKE BACK RETURN|AIR|ckly ironic packa +44836|1992|81|3|31|58713.69|0.05|0.01|A|F|1994-11-26|1994-10-23|1994-12-09|DELIVER IN PERSON|SHIP|yly even packages. platelets mo +44836|1516|57|4|34|48195.34|0.10|0.01|A|F|1994-12-22|1994-11-16|1995-01-16|TAKE BACK RETURN|MAIL|ts sleep regularly across the final acc +44836|145|98|5|7|7315.98|0.01|0.03|R|F|1994-12-17|1994-11-24|1994-12-18|DELIVER IN PERSON|SHIP|inal packages. ironic, +44837|557|18|1|17|24778.35|0.10|0.00|N|O|1996-09-27|1996-08-02|1996-10-20|COLLECT COD|REG AIR|inal accounts. foxes abov +44837|809|76|2|34|58133.20|0.09|0.08|N|O|1996-06-28|1996-07-19|1996-07-23|DELIVER IN PERSON|TRUCK|ly bold requests along the slyly +44837|92|43|3|36|35715.24|0.00|0.05|N|O|1996-07-18|1996-07-24|1996-08-08|DELIVER IN PERSON|TRUCK|t the blithely spec +44837|1983|72|4|2|3769.96|0.10|0.04|N|O|1996-06-23|1996-08-03|1996-07-19|DELIVER IN PERSON|SHIP|requests above the fluffily sil +44837|1752|79|5|41|67803.75|0.05|0.05|N|O|1996-07-02|1996-07-09|1996-07-28|DELIVER IN PERSON|TRUCK| quickly alongside of the regular, exp +44837|1764|91|6|15|24986.40|0.03|0.06|N|O|1996-07-14|1996-07-09|1996-07-22|DELIVER IN PERSON|MAIL|e regular excuses. furiously bold ideas bo +44838|539|70|1|49|70536.97|0.01|0.00|N|O|1998-01-25|1997-12-13|1998-01-26|COLLECT COD|TRUCK|ins. sometimes regular requests boost sl +44838|372|57|2|49|62346.13|0.10|0.03|N|O|1997-11-22|1997-11-23|1997-12-14|DELIVER IN PERSON|MAIL|t the slyly regular theodolites. slyly t +44838|343|100|3|29|36056.86|0.00|0.04|N|O|1998-01-10|1997-12-17|1998-01-23|TAKE BACK RETURN|FOB|o the slyly regular deposits +44839|1566|47|1|50|73378.00|0.09|0.04|R|F|1992-08-31|1992-08-07|1992-09-14|TAKE BACK RETURN|MAIL|refully about the blithely close packages +44839|1017|18|2|16|14688.16|0.03|0.04|A|F|1992-08-09|1992-08-29|1992-09-01|NONE|AIR|s must haggle carefully accor +44839|577|8|3|21|31028.97|0.06|0.07|R|F|1992-07-21|1992-08-11|1992-08-07|TAKE BACK RETURN|TRUCK|, special instructions a +44839|308|65|4|14|16916.20|0.10|0.06|R|F|1992-09-18|1992-09-02|1992-10-09|NONE|MAIL|e furiously ironic +44839|1724|51|5|23|37391.56|0.04|0.01|A|F|1992-09-30|1992-07-20|1992-10-25|DELIVER IN PERSON|RAIL|he blithely final platelets use +44839|1221|59|6|1|1122.22|0.09|0.03|A|F|1992-09-02|1992-07-14|1992-09-05|DELIVER IN PERSON|REG AIR|furiously final packa +44839|366|51|7|3|3799.08|0.06|0.06|R|F|1992-10-03|1992-08-18|1992-10-14|NONE|REG AIR|its. final ideas us +44864|1563|84|1|13|19039.28|0.02|0.00|R|F|1993-08-16|1993-09-05|1993-08-22|NONE|MAIL|ctions. final foxes kindle among +44864|615|16|2|14|21218.54|0.01|0.05|A|F|1993-07-05|1993-09-07|1993-07-07|DELIVER IN PERSON|REG AIR|s cajole around the regu +44864|1446|47|3|27|36380.88|0.10|0.02|A|F|1993-09-15|1993-07-27|1993-09-16|NONE|RAIL| accounts. regular, expre +44864|1728|55|4|30|48891.60|0.03|0.07|A|F|1993-10-12|1993-07-25|1993-10-19|TAKE BACK RETURN|RAIL|furiously even f +44864|603|35|5|13|19546.80|0.02|0.00|R|F|1993-08-02|1993-09-06|1993-08-10|NONE|MAIL|unusual instructions solve again +44864|652|15|6|50|77632.50|0.06|0.07|R|F|1993-09-14|1993-07-23|1993-09-17|DELIVER IN PERSON|SHIP|ely express instruction +44865|1520|1|1|6|8529.12|0.02|0.05|N|O|1997-10-20|1997-12-05|1997-11-16|COLLECT COD|RAIL| tithes are slyly sl +44865|1492|93|2|37|51559.13|0.05|0.01|N|O|1997-12-18|1997-12-28|1997-12-28|TAKE BACK RETURN|REG AIR|es. blithely pe +44865|766|31|3|29|48336.04|0.00|0.07|N|O|1997-12-15|1997-12-25|1997-12-25|NONE|TRUCK|deas: dinos haggle blithely. blithely spec +44865|1423|63|4|12|15893.04|0.10|0.05|N|O|1997-12-21|1997-12-26|1998-01-12|TAKE BACK RETURN|AIR|ully according to th +44865|628|91|5|24|36686.88|0.09|0.00|N|O|1998-01-10|1997-12-04|1998-01-24|DELIVER IN PERSON|TRUCK|s the regular platelets h +44866|346|31|1|38|47360.92|0.08|0.08|N|O|1997-03-11|1997-04-10|1997-04-09|DELIVER IN PERSON|REG AIR|fully after the car +44866|428|29|2|26|34538.92|0.08|0.03|N|O|1997-03-31|1997-04-08|1997-04-23|NONE|SHIP|ans nag fluffily regular pack +44866|1873|74|3|27|47921.49|0.04|0.03|N|O|1997-04-13|1997-03-25|1997-04-22|COLLECT COD|SHIP|nooze quickly +44866|263|91|4|19|22101.94|0.04|0.01|N|O|1997-02-18|1997-03-22|1997-03-05|TAKE BACK RETURN|TRUCK|nusual ideas. deposits use s +44866|34|85|5|4|3736.12|0.10|0.03|N|O|1997-03-19|1997-04-18|1997-03-22|COLLECT COD|RAIL|ss excuses wake +44866|1848|78|6|37|64744.08|0.10|0.06|N|O|1997-05-05|1997-04-08|1997-05-13|DELIVER IN PERSON|MAIL|olphins among the quickly ironic accounts +44867|782|47|1|23|38703.94|0.04|0.01|R|F|1994-09-03|1994-09-15|1994-09-13|DELIVER IN PERSON|RAIL|grouches sleep slyly about the carefully +44868|664|27|1|30|46939.80|0.08|0.08|N|O|1997-03-28|1997-05-09|1997-04-19|TAKE BACK RETURN|FOB|gular deposits af +44868|1560|41|2|23|33615.88|0.10|0.03|N|O|1997-03-29|1997-04-29|1997-04-04|DELIVER IN PERSON|SHIP| carefully carefully silent packages. +44868|1935|80|3|30|55107.90|0.10|0.08|N|O|1997-03-29|1997-05-31|1997-04-12|NONE|MAIL|d epitaphs +44868|601|2|4|4|6006.40|0.08|0.08|N|O|1997-04-04|1997-05-21|1997-04-13|TAKE BACK RETURN|AIR|ts detect? final, special +44869|439|69|1|1|1339.43|0.03|0.03|R|F|1992-09-05|1992-11-03|1992-10-01|TAKE BACK RETURN|RAIL|es. ironic, exp +44869|158|11|2|50|52907.50|0.06|0.03|A|F|1992-12-10|1992-09-29|1992-12-31|NONE|SHIP|ong the furiously +44869|1153|54|3|38|40057.70|0.09|0.00|R|F|1992-11-19|1992-10-13|1992-12-05|DELIVER IN PERSON|AIR|l dolphins nod thi +44869|797|98|4|30|50933.70|0.02|0.06|A|F|1992-10-17|1992-09-28|1992-11-09|COLLECT COD|FOB| blithely behind t +44870|1413|53|1|27|35489.07|0.03|0.00|N|O|1997-10-14|1997-10-05|1997-10-23|TAKE BACK RETURN|SHIP|s thrash blithely ironic +44870|186|13|2|32|34757.76|0.08|0.04|N|O|1997-10-18|1997-11-01|1997-11-11|DELIVER IN PERSON|MAIL|oxes are ironic deposits. +44870|550|81|3|30|43516.50|0.02|0.00|N|O|1997-11-02|1997-11-11|1997-12-01|NONE|MAIL|ely within th +44870|1962|63|4|14|26095.44|0.07|0.03|N|O|1997-09-28|1997-09-24|1997-10-10|TAKE BACK RETURN|MAIL|s sleep quickly regular excuses. blithely i +44870|167|20|5|48|51223.68|0.07|0.00|N|O|1997-09-13|1997-10-19|1997-09-21|NONE|AIR|nto beans; silent requests cajol +44870|1498|77|6|45|62977.05|0.06|0.03|N|O|1997-12-22|1997-10-06|1997-12-26|TAKE BACK RETURN|MAIL|atelets are along the furiously regular acc +44870|1181|90|7|14|15150.52|0.05|0.00|N|O|1997-09-14|1997-10-08|1997-09-17|COLLECT COD|AIR|g the final, ironic excuses. regular +44871|1666|67|1|43|67409.38|0.05|0.05|R|F|1995-06-04|1995-07-11|1995-06-06|NONE|REG AIR|ven, ironi +44871|899|33|2|35|62996.15|0.09|0.01|N|O|1995-07-23|1995-06-17|1995-08-06|COLLECT COD|SHIP|posits haggle requests. bold ideas +44871|1648|72|3|15|23244.60|0.09|0.01|A|F|1995-06-04|1995-06-06|1995-06-07|NONE|FOB|eposits. ironic theodolites sle +44871|507|98|4|2|2815.00|0.07|0.08|N|O|1995-07-11|1995-07-07|1995-08-01|COLLECT COD|SHIP|ickly regular platelets cajole carefully! +44871|1075|46|5|23|22449.61|0.08|0.06|N|O|1995-07-27|1995-06-05|1995-08-09|DELIVER IN PERSON|FOB|uests breach; carefully final instruction +44871|1046|52|6|9|8523.36|0.02|0.01|A|F|1995-05-22|1995-07-04|1995-05-25|TAKE BACK RETURN|SHIP| the slyly ironic platelets. ironic +44896|959|28|1|46|85557.70|0.07|0.05|N|O|1996-06-05|1996-08-01|1996-06-29|TAKE BACK RETURN|REG AIR|ependencies use pend +44896|872|39|2|37|65596.19|0.07|0.00|N|O|1996-09-13|1996-07-04|1996-10-12|DELIVER IN PERSON|SHIP| instructions. bold dependencies hagg +44896|1611|53|3|41|62017.01|0.05|0.02|N|O|1996-09-21|1996-08-14|1996-10-10|TAKE BACK RETURN|SHIP|eep across the silent +44897|59|35|1|13|12467.65|0.10|0.06|A|F|1993-06-12|1993-04-24|1993-06-26|COLLECT COD|SHIP|ses; furiously ironic accounts +44897|1172|73|2|49|52585.33|0.09|0.03|A|F|1993-03-11|1993-05-27|1993-03-25|NONE|RAIL|refully regular grouc +44897|318|19|3|40|48732.40|0.10|0.02|A|F|1993-06-24|1993-05-02|1993-07-14|TAKE BACK RETURN|MAIL|nic, final notornis. furiously even +44897|74|50|4|28|27273.96|0.00|0.00|R|F|1993-06-17|1993-05-18|1993-06-22|COLLECT COD|REG AIR|s sleep. stealthily silent deposits grow t +44898|346|31|1|13|16202.42|0.06|0.00|A|F|1992-07-10|1992-05-31|1992-07-22|TAKE BACK RETURN|REG AIR|are permanently pending, regular pinto +44898|25|51|2|13|12025.26|0.06|0.03|A|F|1992-07-02|1992-05-19|1992-07-26|TAKE BACK RETURN|TRUCK|are furiously courts. furiousl +44898|812|79|3|19|32543.39|0.08|0.03|R|F|1992-05-01|1992-05-24|1992-05-15|TAKE BACK RETURN|TRUCK|tions haggle carefully. enticingly regul +44898|1242|54|4|14|16005.36|0.00|0.08|R|F|1992-05-14|1992-06-29|1992-05-17|TAKE BACK RETURN|TRUCK|ly pending packages cajole sly +44898|1822|9|5|11|18962.02|0.05|0.07|A|F|1992-06-24|1992-06-20|1992-06-30|NONE|RAIL|even asymptote +44899|284|39|1|7|8289.96|0.00|0.02|N|O|1998-08-08|1998-06-12|1998-08-31|TAKE BACK RETURN|RAIL|ironic, regular theodolites. pend +44899|1962|51|2|27|50326.92|0.06|0.04|N|O|1998-07-27|1998-06-19|1998-08-11|COLLECT COD|SHIP|ilent accounts. never special r +44899|553|54|3|40|58142.00|0.09|0.03|N|O|1998-07-29|1998-07-12|1998-08-11|NONE|RAIL|its above the blithel +44900|232|60|1|9|10190.07|0.02|0.08|A|F|1993-04-28|1993-05-01|1993-05-25|NONE|AIR|nic platelets nag slyly after the thin +44900|511|12|2|33|46579.83|0.08|0.01|R|F|1993-05-01|1993-03-29|1993-05-31|NONE|RAIL|ely even packages sublate. never reg +44900|992|61|3|29|54896.71|0.06|0.05|A|F|1993-03-02|1993-05-08|1993-03-29|NONE|TRUCK| deposits accord +44900|288|70|4|27|32083.56|0.03|0.05|R|F|1993-06-01|1993-04-21|1993-06-03|TAKE BACK RETURN|SHIP|cross the always ex +44900|1030|1|5|27|25137.81|0.02|0.05|A|F|1993-05-08|1993-05-03|1993-05-12|TAKE BACK RETURN|RAIL|old packages. slyly regular packages mai +44901|1299|11|1|18|21605.22|0.04|0.00|N|O|1997-02-28|1997-03-31|1997-03-28|TAKE BACK RETURN|SHIP|y slyly iro +44901|504|5|2|6|8427.00|0.07|0.07|N|O|1997-04-23|1997-03-17|1997-05-16|DELIVER IN PERSON|AIR| unusual ideas cajole ironic, unusual pin +44902|325|82|1|7|8577.24|0.00|0.01|N|O|1998-05-19|1998-07-04|1998-06-13|TAKE BACK RETURN|SHIP|unts. ironic, +44903|1878|79|1|38|67635.06|0.10|0.00|R|F|1992-05-17|1992-04-15|1992-05-24|DELIVER IN PERSON|RAIL|pinto beans sleep slyly. thin instructi +44903|839|73|2|44|76552.52|0.09|0.08|R|F|1992-04-20|1992-05-05|1992-04-23|TAKE BACK RETURN|MAIL|eep among the +44903|191|18|3|37|40374.03|0.02|0.01|R|F|1992-06-10|1992-06-02|1992-06-22|TAKE BACK RETURN|RAIL|ts nag slyly regular, final deposits. ca +44903|1114|51|4|1|1015.11|0.04|0.04|R|F|1992-05-29|1992-05-11|1992-06-10|DELIVER IN PERSON|FOB|nding depos +44903|438|97|5|18|24091.74|0.10|0.08|A|F|1992-06-13|1992-05-23|1992-06-21|COLLECT COD|FOB|into beans. carefully regula +44903|867|34|6|9|15910.74|0.03|0.08|A|F|1992-03-25|1992-05-29|1992-04-11|NONE|FOB|ross the blithel +44928|1300|1|1|39|46850.70|0.08|0.08|N|O|1996-05-08|1996-03-19|1996-05-20|TAKE BACK RETURN|REG AIR|le quickly bold accounts. +44929|713|14|1|47|75844.37|0.05|0.02|A|F|1993-10-31|1993-09-15|1993-11-27|COLLECT COD|SHIP|osits haggle bli +44929|273|28|2|10|11732.70|0.00|0.07|A|F|1993-09-20|1993-09-15|1993-10-18|DELIVER IN PERSON|AIR|se quickly regular, express instruct +44929|454|55|3|15|20316.75|0.10|0.05|R|F|1993-11-17|1993-10-22|1993-12-17|TAKE BACK RETURN|RAIL| the pending +44929|1740|83|4|34|55819.16|0.03|0.04|R|F|1993-08-24|1993-09-18|1993-08-26|TAKE BACK RETURN|FOB| wake fluffily regular depos +44930|541|32|1|10|14415.40|0.03|0.04|A|F|1994-11-18|1994-11-20|1994-12-05|COLLECT COD|RAIL|n foxes wake slyly b +44930|505|6|2|26|36543.00|0.02|0.05|R|F|1994-10-31|1994-10-30|1994-11-09|COLLECT COD|TRUCK|cording to the blithely final packages +44930|605|37|3|45|67752.00|0.10|0.05|A|F|1994-11-28|1994-12-09|1994-12-14|TAKE BACK RETURN|TRUCK|nag carefully. sometimes final re +44930|1191|64|4|15|16382.85|0.05|0.04|A|F|1994-12-19|1994-12-16|1994-12-27|TAKE BACK RETURN|MAIL|ully ironi +44930|1855|42|5|24|42164.40|0.03|0.01|R|F|1994-10-31|1994-11-30|1994-11-27|NONE|TRUCK|ending instructions boost quickly. blith +44930|382|39|6|25|32059.50|0.01|0.03|R|F|1994-12-30|1994-10-26|1995-01-09|COLLECT COD|REG AIR|use against the excuses. fluffily final +44930|279|34|7|17|20047.59|0.05|0.00|R|F|1994-11-25|1994-11-07|1994-12-06|DELIVER IN PERSON|MAIL|furiously pin +44931|1034|35|1|14|13090.42|0.06|0.05|N|O|1996-02-23|1996-01-23|1996-03-07|NONE|MAIL|ages. final packages nag except the f +44932|1622|46|1|7|10665.34|0.05|0.03|N|O|1996-01-20|1996-02-17|1996-01-28|TAKE BACK RETURN|AIR|uickly never even requests. carefully bold +44932|1937|70|2|32|58845.76|0.00|0.06|N|O|1996-04-24|1996-03-18|1996-04-29|TAKE BACK RETURN|MAIL|he furiously daring accounts-- slyly e +44932|665|97|3|49|76717.34|0.05|0.06|N|O|1996-04-16|1996-03-22|1996-04-26|COLLECT COD|MAIL|ss requests maintain fluffil +44932|988|91|4|9|17000.82|0.02|0.01|N|O|1996-03-01|1996-03-20|1996-03-18|COLLECT COD|AIR|tes. fluffily ironic requests sleep +44932|1588|69|5|24|35749.92|0.05|0.07|N|O|1996-04-06|1996-03-18|1996-04-30|COLLECT COD|FOB|phins. blithely even request +44932|839|6|6|28|48715.24|0.04|0.02|N|O|1996-03-30|1996-02-15|1996-04-21|NONE|TRUCK|kages haggle. quickly q +44932|115|42|7|18|18271.98|0.03|0.03|N|O|1996-04-12|1996-02-26|1996-05-02|TAKE BACK RETURN|AIR|eposits cajole. fin +44933|409|97|1|47|61541.80|0.07|0.00|R|F|1993-09-19|1993-10-17|1993-10-19|TAKE BACK RETURN|TRUCK|olphins. silent, regular ideas wake blit +44933|532|23|2|1|1432.53|0.09|0.06|R|F|1993-12-12|1993-09-23|1993-12-16|DELIVER IN PERSON|REG AIR|wake blithely blithely +44933|1209|21|3|36|39967.20|0.08|0.01|A|F|1993-11-18|1993-09-17|1993-12-04|TAKE BACK RETURN|REG AIR|arefully along the blithely +44934|77|78|1|36|35174.52|0.03|0.00|A|F|1993-05-20|1993-06-24|1993-06-05|NONE|FOB| special deposits c +44935|470|71|1|27|37002.69|0.10|0.05|R|F|1994-01-22|1994-01-03|1994-02-15|DELIVER IN PERSON|TRUCK|uickly even accounts wake s +44935|883|50|2|48|85626.24|0.01|0.02|R|F|1994-02-18|1994-01-10|1994-03-11|COLLECT COD|REG AIR|arefully carefully brave pinto be +44935|1263|1|3|37|43077.62|0.08|0.06|R|F|1994-02-21|1994-01-31|1994-03-19|DELIVER IN PERSON|SHIP| ideas use carefully along the pending +44935|1826|56|4|24|41467.68|0.08|0.06|A|F|1993-12-16|1994-01-19|1993-12-23|NONE|FOB| wake blithely after the even +44935|1770|55|5|11|18389.47|0.05|0.04|R|F|1994-02-09|1994-01-09|1994-02-17|COLLECT COD|RAIL|deposits. bold, bold courts solve caref +44935|386|87|6|36|46309.68|0.00|0.02|A|F|1993-12-22|1994-01-28|1993-12-30|COLLECT COD|SHIP|rmanent accoun +44960|584|45|1|11|16330.38|0.10|0.02|N|O|1995-07-22|1995-07-14|1995-07-27|TAKE BACK RETURN|RAIL| slow requ +44960|1038|9|2|13|12207.39|0.07|0.01|N|F|1995-06-16|1995-06-09|1995-07-09|NONE|REG AIR|ans. quickly furious braids sleep: accou +44960|1486|87|3|20|27749.60|0.03|0.06|N|O|1995-08-27|1995-07-09|1995-09-16|COLLECT COD|TRUCK|ly unusual instructions nag +44960|1909|42|4|19|34407.10|0.03|0.06|N|F|1995-06-11|1995-06-20|1995-07-03|COLLECT COD|REG AIR|ncies wake blithely final fo +44960|423|24|5|48|63524.16|0.10|0.07|N|O|1995-07-21|1995-06-11|1995-08-06|DELIVER IN PERSON|FOB|kages-- blithely express +44960|633|96|6|7|10735.41|0.02|0.04|N|O|1995-08-10|1995-07-30|1995-08-16|TAKE BACK RETURN|MAIL|onic pinto beans sleep. car +44960|1427|45|7|39|51808.38|0.00|0.03|N|O|1995-07-18|1995-07-28|1995-08-02|COLLECT COD|MAIL|ccounts. furiousl +44961|1455|73|1|8|10851.60|0.06|0.07|N|O|1996-05-04|1996-03-18|1996-06-02|TAKE BACK RETURN|MAIL| ironic, slow theodolites. iron +44962|598|29|1|3|4495.77|0.03|0.07|A|F|1995-03-25|1995-03-14|1995-04-19|DELIVER IN PERSON|TRUCK|packages cajole fluffil +44962|1868|55|2|23|40706.78|0.05|0.06|A|F|1995-02-10|1995-03-22|1995-02-19|DELIVER IN PERSON|TRUCK|blithely ironic p +44963|29|30|1|17|15793.34|0.03|0.05|N|O|1997-03-06|1997-04-25|1997-03-17|TAKE BACK RETURN|REG AIR|he sometimes r +44963|443|31|2|29|38959.76|0.07|0.03|N|O|1997-02-28|1997-03-28|1997-03-26|NONE|REG AIR|ic theodolites. carefully final platel +44963|1805|49|3|25|42670.00|0.02|0.06|N|O|1997-06-25|1997-04-01|1997-07-04|NONE|MAIL|lyly unusual deposits integrate slyly sp +44963|1147|20|4|34|35636.76|0.04|0.05|N|O|1997-04-20|1997-05-05|1997-05-08|TAKE BACK RETURN|SHIP|egular, regular platelets s +44964|1188|25|1|15|16337.70|0.04|0.03|N|O|1996-10-25|1996-10-07|1996-10-29|COLLECT COD|SHIP| final deposits. regu +44964|499|58|2|42|58778.58|0.08|0.06|N|O|1996-11-07|1996-11-07|1996-12-03|COLLECT COD|TRUCK|ckages. slyly pending dependencies haggle. +44964|877|11|3|41|72892.67|0.08|0.00|N|O|1996-09-26|1996-10-27|1996-10-14|NONE|FOB|refully final request +44964|1309|24|4|48|58094.40|0.05|0.00|N|O|1996-10-04|1996-11-15|1996-10-15|DELIVER IN PERSON|REG AIR| deposits nag pen +44964|1444|23|5|44|59199.36|0.10|0.02|N|O|1996-09-17|1996-10-13|1996-09-19|COLLECT COD|AIR|according to the furiously special pac +44964|764|97|6|35|58266.60|0.10|0.01|N|O|1996-09-03|1996-10-18|1996-09-12|TAKE BACK RETURN|TRUCK|e slyly. f +44965|1174|11|1|6|6451.02|0.00|0.02|N|O|1996-02-01|1995-11-21|1996-02-08|DELIVER IN PERSON|FOB|g alongside of the +44965|996|97|2|49|92952.51|0.07|0.06|N|O|1995-10-17|1995-12-01|1995-11-12|COLLECT COD|TRUCK|egular pinto bean +44965|549|50|3|10|14495.40|0.10|0.01|N|O|1995-10-19|1995-11-26|1995-11-11|TAKE BACK RETURN|AIR|al theodolites. furi +44965|226|54|4|48|54058.56|0.09|0.01|N|O|1995-10-08|1995-11-03|1995-10-25|DELIVER IN PERSON|MAIL|fully final +44965|1684|26|5|23|36470.64|0.01|0.06|N|O|1995-12-13|1995-12-08|1995-12-15|COLLECT COD|FOB|ages. quickly bold pack +44965|1908|53|6|39|70586.10|0.04|0.04|N|O|1995-12-02|1995-12-03|1995-12-24|DELIVER IN PERSON|RAIL|counts. final pl +44966|1560|1|1|26|38000.56|0.05|0.05|R|F|1992-05-01|1992-04-05|1992-05-29|NONE|TRUCK|ly after t +44966|1885|86|2|12|21442.56|0.07|0.00|R|F|1992-04-30|1992-05-29|1992-05-03|TAKE BACK RETURN|RAIL| ideas cajole stealthily along the slyly p +44966|1434|74|3|12|16025.16|0.04|0.01|R|F|1992-06-04|1992-05-11|1992-06-13|NONE|RAIL|e slyly ironic courts. fluffily +44967|849|50|1|48|83992.32|0.07|0.08|N|O|1997-01-06|1996-11-25|1997-01-27|TAKE BACK RETURN|TRUCK|ep carefully carefull +44992|880|14|1|26|46302.88|0.07|0.04|R|F|1993-01-09|1993-03-14|1993-02-02|COLLECT COD|TRUCK|quickly silent attainmen +44992|1044|15|2|1|945.04|0.08|0.00|A|F|1993-02-14|1993-03-16|1993-03-07|TAKE BACK RETURN|FOB|ld packages cajole carefully alongsi +44992|1105|14|3|9|9054.90|0.05|0.01|A|F|1993-04-19|1993-02-26|1993-04-25|NONE|AIR|cross the ironic theodolites. ironic fo +44992|271|53|4|29|33966.83|0.01|0.02|A|F|1993-03-27|1993-03-04|1993-04-07|DELIVER IN PERSON|AIR|quickly ironic requests. regular theodolite +44992|17|18|5|41|37597.41|0.00|0.00|R|F|1993-04-03|1993-03-23|1993-05-01|TAKE BACK RETURN|FOB|ly packages. carefully even deposit +44992|296|97|6|14|16748.06|0.10|0.01|R|F|1992-12-31|1993-03-19|1993-01-03|DELIVER IN PERSON|RAIL| affix furiously instructions. special +44992|599|100|7|29|43488.11|0.02|0.07|R|F|1993-04-18|1993-02-20|1993-05-08|DELIVER IN PERSON|FOB|n dinos would cajole acros +44993|799|32|1|19|32296.01|0.06|0.03|N|O|1996-03-25|1996-02-24|1996-04-09|DELIVER IN PERSON|REG AIR|equests are quickly above the caref +44994|355|84|1|29|36405.15|0.08|0.08|N|O|1998-02-10|1998-03-11|1998-03-09|DELIVER IN PERSON|RAIL| pending packages. bold accounts un +44995|406|36|1|43|56175.20|0.03|0.04|R|F|1994-11-21|1994-10-08|1994-12-15|DELIVER IN PERSON|TRUCK|y even request +44995|612|75|2|7|10588.27|0.02|0.08|R|F|1994-11-17|1994-10-03|1994-11-25|DELIVER IN PERSON|AIR|l requests cajole blithely package +44995|302|87|3|17|20439.10|0.00|0.02|R|F|1994-09-03|1994-10-24|1994-09-15|COLLECT COD|FOB|lithely carefully special accounts. furio +44995|1269|44|4|43|50321.18|0.10|0.00|A|F|1994-09-17|1994-10-21|1994-09-24|DELIVER IN PERSON|FOB|ly regular theodolites. busily +44996|623|86|1|1|1523.62|0.06|0.01|N|O|1996-12-21|1997-01-15|1997-01-05|DELIVER IN PERSON|RAIL|o beans. special, silent warh +44996|1636|60|2|28|43053.64|0.03|0.07|N|O|1996-12-08|1997-01-02|1996-12-29|NONE|SHIP| excuses. f +44996|435|65|3|3|4006.29|0.07|0.07|N|O|1996-10-25|1997-01-04|1996-11-21|DELIVER IN PERSON|FOB|ithely regu +44996|1750|93|4|30|49552.50|0.05|0.04|N|O|1997-01-13|1996-11-23|1997-02-02|DELIVER IN PERSON|AIR|regular foxes. accounts through +44996|118|97|5|18|18325.98|0.01|0.01|N|O|1996-12-12|1996-12-15|1996-12-15|COLLECT COD|RAIL| pinto beans. +44997|1597|38|1|41|61442.19|0.04|0.06|N|O|1996-01-09|1995-11-17|1996-01-20|TAKE BACK RETURN|AIR|aves. furiously regular foxes abo +44997|1899|29|2|31|55827.59|0.02|0.00|N|O|1995-12-09|1995-11-23|1995-12-29|COLLECT COD|SHIP|to sleep furiously against the f +44998|1119|28|1|14|14281.54|0.04|0.06|N|O|1996-12-30|1997-01-17|1997-01-08|NONE|MAIL|posits. busi +44998|865|99|2|26|45912.36|0.03|0.00|N|O|1996-12-23|1997-02-16|1997-01-03|NONE|REG AIR| patterns cajole furiously eve +44998|1182|55|3|3|3249.54|0.04|0.07|N|O|1997-01-31|1997-03-04|1997-02-15|COLLECT COD|REG AIR|lowly against the fi +44998|1468|8|4|50|68473.00|0.03|0.00|N|O|1997-01-31|1997-03-09|1997-02-22|COLLECT COD|TRUCK|ns above the express, regular pinto bea +44998|1938|39|5|4|7359.72|0.01|0.01|N|O|1997-03-17|1997-03-04|1997-03-21|TAKE BACK RETURN|AIR| against the slyly exp +44999|86|87|1|35|34512.80|0.06|0.07|R|F|1993-03-27|1993-04-06|1993-04-20|NONE|TRUCK|. ironic accounts against the p +44999|930|99|2|45|82391.85|0.07|0.01|R|F|1993-05-12|1993-03-19|1993-06-02|NONE|RAIL| blithely along the quickly bold reque +45024|1311|26|1|42|50917.02|0.09|0.07|N|O|1998-07-02|1998-08-04|1998-07-25|TAKE BACK RETURN|RAIL|ake against the quickly s +45024|256|57|2|21|24281.25|0.09|0.06|N|O|1998-08-02|1998-08-12|1998-08-09|TAKE BACK RETURN|REG AIR|sts wake carefully furi +45024|808|8|3|48|82022.40|0.00|0.05|N|O|1998-08-30|1998-08-01|1998-09-14|DELIVER IN PERSON|MAIL|equests; fluffily unusua +45024|600|91|4|23|34513.80|0.06|0.06|N|O|1998-08-10|1998-06-29|1998-08-20|COLLECT COD|AIR|ns cajole foxes. ironically busy ins +45024|1173|46|5|1|1074.17|0.05|0.01|N|O|1998-09-09|1998-07-20|1998-09-22|TAKE BACK RETURN|RAIL|ake furiously. even instructions detect +45024|1455|95|6|9|12208.05|0.00|0.07|N|O|1998-05-31|1998-08-02|1998-06-22|COLLECT COD|REG AIR|silent dependencies sleep accor +45025|71|72|1|16|15537.12|0.06|0.07|N|O|1995-08-11|1995-05-28|1995-08-30|TAKE BACK RETURN|FOB|ely. slyly pending packages boost +45025|757|22|2|46|76256.50|0.06|0.06|N|O|1995-07-19|1995-06-18|1995-08-02|DELIVER IN PERSON|AIR|ans across the bold, ironic r +45025|1920|53|3|21|38260.32|0.07|0.05|N|O|1995-08-10|1995-05-17|1995-08-27|TAKE BACK RETURN|MAIL|zle through +45025|993|94|4|15|28409.85|0.10|0.05|A|F|1995-04-28|1995-05-16|1995-05-17|DELIVER IN PERSON|TRUCK|r, ironic deposits. qui +45025|1134|35|5|23|23807.99|0.10|0.03|R|F|1995-04-30|1995-06-24|1995-05-21|NONE|SHIP|accounts wake slyly slyly +45025|1133|42|6|26|26887.38|0.10|0.03|N|F|1995-06-15|1995-05-29|1995-06-21|COLLECT COD|FOB| are slyly bold, final packages. unusual a +45026|611|74|1|8|12092.88|0.04|0.05|N|O|1996-05-07|1996-04-17|1996-05-30|COLLECT COD|RAIL|al pinto beans wake fl +45026|595|56|2|36|53841.24|0.10|0.06|N|O|1996-04-12|1996-03-02|1996-04-15|TAKE BACK RETURN|TRUCK|ages sleep regula +45026|766|63|3|42|70003.92|0.05|0.08|N|O|1996-03-18|1996-02-24|1996-04-02|DELIVER IN PERSON|TRUCK|play. even accounts according to +45027|1325|2|1|1|1226.32|0.10|0.03|A|F|1992-12-10|1992-11-12|1992-12-23|COLLECT COD|REG AIR|ajole carefully! furiou +45027|46|72|2|30|28381.20|0.01|0.02|A|F|1992-12-14|1992-11-06|1993-01-06|NONE|FOB| cajole. fluffily ironic deposits s +45027|1000|3|3|31|27931.00|0.01|0.03|A|F|1992-11-25|1992-10-16|1992-12-25|NONE|TRUCK|bold waters. furiously i +45028|785|86|1|29|48887.62|0.01|0.02|N|O|1996-05-17|1996-05-11|1996-06-13|COLLECT COD|RAIL| beans after the carefully regular p +45028|1190|99|2|19|20732.61|0.05|0.06|N|O|1996-05-09|1996-04-08|1996-06-03|TAKE BACK RETURN|TRUCK|tions-- cl +45028|396|25|3|45|58337.55|0.06|0.01|N|O|1996-06-23|1996-04-11|1996-06-25|TAKE BACK RETURN|TRUCK|ove the blithely ironic foxes. tithes i +45029|88|64|1|48|47427.84|0.07|0.08|A|F|1993-10-23|1993-09-24|1993-11-18|COLLECT COD|MAIL|tes. express, iron +45029|158|59|2|49|51849.35|0.05|0.05|R|F|1993-09-05|1993-09-07|1993-09-14|NONE|FOB|eodolites cajole blithely even accounts. +45029|354|55|3|34|42647.90|0.02|0.04|R|F|1993-09-16|1993-08-06|1993-10-15|TAKE BACK RETURN|AIR| even, special pinto +45030|426|85|1|24|31834.08|0.01|0.06|A|F|1993-10-05|1993-09-06|1993-11-01|DELIVER IN PERSON|FOB| excuses after the ironic accounts a +45030|1801|31|2|36|61300.80|0.06|0.00|A|F|1993-11-18|1993-09-14|1993-12-07|COLLECT COD|TRUCK|yly regular instruct +45030|170|97|3|6|6421.02|0.08|0.00|A|F|1993-11-02|1993-09-07|1993-11-05|NONE|FOB|, ironic packages impress blithely ironic, +45030|1496|14|4|25|34937.25|0.05|0.06|A|F|1993-10-26|1993-10-13|1993-11-13|TAKE BACK RETURN|TRUCK|ly pending requests ab +45030|1589|70|5|37|55151.46|0.07|0.05|A|F|1993-10-16|1993-10-05|1993-10-17|TAKE BACK RETURN|SHIP|press deposits +45030|732|65|6|26|42450.98|0.09|0.07|A|F|1993-08-28|1993-09-19|1993-09-06|DELIVER IN PERSON|MAIL|ar requests wake +45031|161|40|1|13|13795.08|0.01|0.05|R|F|1993-02-14|1993-02-09|1993-02-27|COLLECT COD|FOB|the even packages. thinly bold accounts +45031|257|85|2|27|31245.75|0.01|0.00|A|F|1992-12-01|1993-02-04|1992-12-17|NONE|REG AIR|blithely pe +45031|1932|21|3|25|45848.25|0.10|0.00|A|F|1993-01-15|1993-01-25|1993-02-10|TAKE BACK RETURN|REG AIR|cies. furiously even +45031|1404|83|4|14|18275.60|0.06|0.03|A|F|1992-12-13|1993-01-03|1992-12-28|TAKE BACK RETURN|AIR|l deposits cajole quickly against th +45031|615|47|5|38|57593.18|0.03|0.05|A|F|1993-02-24|1992-12-31|1993-03-05|DELIVER IN PERSON|RAIL|cial requests +45056|762|95|1|34|56533.84|0.08|0.05|R|F|1995-01-13|1994-12-08|1995-01-22|DELIVER IN PERSON|FOB|kages nag. deposits affix sly +45056|1535|76|2|12|17238.36|0.08|0.06|R|F|1994-11-30|1995-01-13|1994-12-10|TAKE BACK RETURN|MAIL|al deposits. even instructions haggle. +45056|1634|35|3|45|69103.35|0.02|0.03|A|F|1995-02-17|1994-12-29|1995-03-13|COLLECT COD|REG AIR|never silent foxes across t +45056|1991|24|4|49|92756.51|0.07|0.04|A|F|1994-11-24|1995-01-19|1994-12-07|COLLECT COD|FOB|grow carefully +45057|236|64|1|49|55675.27|0.01|0.08|N|O|1997-05-13|1997-06-12|1997-06-11|COLLECT COD|RAIL|arefully against +45057|352|53|2|34|42579.90|0.09|0.04|N|O|1997-05-28|1997-05-18|1997-06-11|COLLECT COD|TRUCK|c warthogs ac +45057|800|65|3|45|76536.00|0.04|0.04|N|O|1997-05-16|1997-04-20|1997-05-23|TAKE BACK RETURN|AIR| above the fluffily even theodolit +45057|1686|69|4|25|39692.00|0.00|0.01|N|O|1997-07-14|1997-05-29|1997-07-28|COLLECT COD|TRUCK|iously special accounts. pack +45057|1167|76|5|14|14954.24|0.00|0.01|N|O|1997-05-09|1997-05-18|1997-05-27|NONE|TRUCK|s haggle. regular, bol +45058|1080|16|1|42|41205.36|0.04|0.04|N|O|1997-05-10|1997-03-04|1997-05-27|DELIVER IN PERSON|FOB|tipliers ought to affix. foxes a +45058|399|28|2|22|28586.58|0.01|0.02|N|O|1997-04-11|1997-03-15|1997-04-20|TAKE BACK RETURN|FOB|packages. requests use. unusu +45058|220|75|3|15|16803.30|0.03|0.06|N|O|1997-05-10|1997-02-20|1997-05-24|TAKE BACK RETURN|SHIP|eodolites about the b +45058|1661|44|4|9|14063.94|0.08|0.05|N|O|1997-04-14|1997-03-21|1997-04-29|DELIVER IN PERSON|RAIL| boost fluffily even excu +45058|158|37|5|39|41267.85|0.04|0.08|N|O|1997-04-21|1997-03-11|1997-05-15|DELIVER IN PERSON|RAIL| furiously +45058|1597|78|6|48|71932.32|0.00|0.07|N|O|1997-01-24|1997-03-01|1997-02-07|NONE|REG AIR|to the idle, regular ac +45059|1685|86|1|10|15866.80|0.00|0.07|A|F|1995-03-30|1995-04-27|1995-04-14|NONE|REG AIR|waters. regular ideas doze quickly. +45059|1996|97|2|45|85409.55|0.05|0.04|A|F|1995-04-05|1995-03-21|1995-04-14|COLLECT COD|REG AIR|fily pending accounts are across the furiou +45059|1582|23|3|6|8901.48|0.04|0.06|R|F|1995-02-06|1995-03-15|1995-03-07|NONE|TRUCK|aggle. ideas +45059|1753|54|4|45|74463.75|0.01|0.06|R|F|1995-04-15|1995-03-24|1995-05-13|NONE|FOB|theodolites. carefully regular +45059|401|31|5|8|10411.20|0.03|0.07|R|F|1995-04-14|1995-04-23|1995-04-23|TAKE BACK RETURN|TRUCK|kindle alongside +45059|10|36|6|44|40040.44|0.06|0.06|N|F|1995-06-04|1995-03-20|1995-07-01|TAKE BACK RETURN|RAIL|ep. blithely expre +45060|401|60|1|28|36439.20|0.05|0.03|R|F|1994-07-17|1994-07-28|1994-08-05|NONE|SHIP|fully regular re +45061|1722|49|1|46|74691.12|0.07|0.03|N|O|1996-06-14|1996-06-07|1996-07-03|TAKE BACK RETURN|REG AIR|s. regular, +45061|122|1|2|41|41906.92|0.00|0.02|N|O|1996-05-19|1996-06-09|1996-06-10|COLLECT COD|REG AIR|notornis hang slyly final dep +45061|908|77|3|18|32560.20|0.00|0.04|N|O|1996-05-08|1996-07-01|1996-05-25|DELIVER IN PERSON|MAIL| quickly according to the carefully bold +45062|428|87|1|16|21254.72|0.09|0.00|N|O|1998-07-28|1998-08-31|1998-08-22|DELIVER IN PERSON|FOB|ly final theodolites aff +45062|81|7|2|19|18640.52|0.10|0.03|N|O|1998-06-13|1998-07-17|1998-06-30|DELIVER IN PERSON|SHIP|r foxes nag slyly. blithely final +45062|424|12|3|50|66221.00|0.06|0.08|N|O|1998-07-27|1998-08-30|1998-07-29|TAKE BACK RETURN|AIR|iously special deposits are carefull +45062|275|30|4|34|39959.18|0.08|0.06|N|O|1998-08-01|1998-08-16|1998-08-18|COLLECT COD|MAIL|accounts. +45062|283|38|5|26|30765.28|0.07|0.06|N|O|1998-08-06|1998-08-20|1998-08-28|TAKE BACK RETURN|MAIL|t the furiously special requests sle +45062|1249|50|6|24|27605.76|0.03|0.05|N|O|1998-07-05|1998-07-12|1998-07-19|DELIVER IN PERSON|SHIP|counts grow. de +45062|301|30|7|20|24026.00|0.01|0.01|N|O|1998-07-12|1998-09-05|1998-07-21|NONE|MAIL|arefully? quickly ironic ins +45063|401|2|1|36|46850.40|0.00|0.06|N|O|1997-05-04|1997-04-02|1997-05-26|DELIVER IN PERSON|MAIL|regular excuses u +45063|1288|89|2|36|42814.08|0.02|0.00|N|O|1997-05-07|1997-03-25|1997-05-20|DELIVER IN PERSON|AIR|d accounts. f +45063|1979|24|3|23|43262.31|0.06|0.02|N|O|1997-04-21|1997-03-26|1997-05-17|TAKE BACK RETURN|MAIL|ooze along the regular theodolit +45063|982|83|4|41|77202.18|0.04|0.03|N|O|1997-04-17|1997-04-09|1997-04-23|NONE|MAIL|lites: furiously unusual deposits sleep +45063|1736|79|5|34|55682.82|0.09|0.00|N|O|1997-01-14|1997-02-14|1997-01-29|NONE|FOB|kages was accounts. idea +45088|235|36|1|36|40868.28|0.10|0.03|R|F|1994-03-15|1994-02-02|1994-03-31|NONE|RAIL|r the furiously regular asympt +45088|1273|11|2|26|30531.02|0.08|0.00|R|F|1994-01-31|1993-12-26|1994-03-01|DELIVER IN PERSON|AIR|the slyly thin dolph +45089|240|68|1|17|19384.08|0.00|0.08|R|F|1994-02-24|1994-03-03|1994-03-14|TAKE BACK RETURN|AIR|tegrate. quickly special +45089|463|51|2|24|32723.04|0.08|0.03|A|F|1994-04-24|1994-04-02|1994-05-09|COLLECT COD|SHIP| unusual platelets. regular, regul +45090|1992|93|1|21|39773.79|0.10|0.00|R|F|1993-09-17|1993-09-30|1993-10-04|NONE|MAIL|packages. packages about the ironic acc +45090|1712|13|2|30|48411.30|0.09|0.01|A|F|1993-08-09|1993-08-31|1993-09-03|DELIVER IN PERSON|RAIL|re slyly slyly re +45091|1697|80|1|11|17585.59|0.02|0.03|N|O|1995-12-03|1995-10-24|1995-12-29|COLLECT COD|TRUCK|sily close r +45091|1137|46|2|23|23876.99|0.05|0.02|N|O|1995-09-29|1995-11-26|1995-10-05|NONE|RAIL|y pending courts haggl +45092|83|34|1|25|24577.00|0.08|0.03|N|O|1996-11-13|1996-10-28|1996-11-20|COLLECT COD|AIR|slyly even pac +45092|1439|40|2|24|32170.32|0.03|0.01|N|O|1996-11-30|1996-10-19|1996-12-11|TAKE BACK RETURN|RAIL|s lose furiousl +45092|989|92|3|10|18899.80|0.09|0.00|N|O|1996-11-24|1996-10-18|1996-12-08|COLLECT COD|REG AIR|ly regular frays sleep d +45092|105|6|4|44|44224.40|0.10|0.07|N|O|1996-09-27|1996-12-01|1996-10-07|COLLECT COD|RAIL|ly ideas. +45092|6|32|5|7|6342.00|0.05|0.08|N|O|1997-01-06|1996-11-19|1997-01-16|TAKE BACK RETURN|RAIL|r dependencies; carefully express in +45093|1146|55|1|22|23037.08|0.00|0.00|N|O|1998-05-09|1998-04-18|1998-06-05|TAKE BACK RETURN|REG AIR|the unusual, reg +45093|1894|38|2|37|66447.93|0.09|0.00|N|O|1998-06-03|1998-04-29|1998-06-26|NONE|RAIL|ress, ironic requests int +45093|888|89|3|22|39355.36|0.05|0.06|N|O|1998-03-21|1998-06-11|1998-03-26|DELIVER IN PERSON|REG AIR|s. fluffily unusual excuses c +45093|426|14|4|5|6632.10|0.01|0.07|N|O|1998-03-24|1998-05-15|1998-04-20|COLLECT COD|REG AIR|r ideas. enticing pinto beans detect eve +45093|1973|62|5|26|48749.22|0.07|0.03|N|O|1998-03-26|1998-04-18|1998-03-30|DELIVER IN PERSON|FOB|gular accounts. carefully sly +45094|1042|78|1|6|5658.24|0.08|0.05|N|O|1997-07-15|1997-07-08|1997-07-27|COLLECT COD|RAIL| even accounts play furiously ac +45094|1109|46|2|4|4040.40|0.07|0.05|N|O|1997-04-25|1997-05-17|1997-05-14|DELIVER IN PERSON|FOB|d foxes sleep blithely. courts +45094|1454|72|3|24|32530.80|0.10|0.06|N|O|1997-05-31|1997-06-18|1997-06-02|DELIVER IN PERSON|RAIL|sts hinder fluffily. fluffi +45094|489|77|4|48|66695.04|0.05|0.05|N|O|1997-06-11|1997-05-28|1997-06-18|NONE|SHIP|er the slyly regular theodolites sleep qui +45094|1323|38|5|9|11018.88|0.07|0.04|N|O|1997-06-16|1997-05-15|1997-07-09|TAKE BACK RETURN|TRUCK|uests sleep bli +45095|1755|40|1|30|49702.50|0.07|0.08|N|O|1997-06-01|1997-05-10|1997-06-12|DELIVER IN PERSON|RAIL|y regular +45120|1742|85|1|7|11506.18|0.06|0.05|R|F|1994-05-11|1994-07-01|1994-05-29|DELIVER IN PERSON|MAIL|packages sleep blithely around the cour +45120|220|21|2|32|35847.04|0.05|0.00|A|F|1994-06-01|1994-05-14|1994-06-22|NONE|AIR|ounts: final accounts boost. furiously +45120|1685|86|3|1|1586.68|0.01|0.08|A|F|1994-07-30|1994-06-17|1994-08-07|TAKE BACK RETURN|REG AIR|deas. furiously bold plat +45120|968|71|4|28|52330.88|0.05|0.08|R|F|1994-07-20|1994-06-15|1994-07-25|TAKE BACK RETURN|RAIL|ld accounts cajole slyly express the +45120|360|61|5|1|1260.36|0.07|0.05|A|F|1994-07-10|1994-07-02|1994-07-15|DELIVER IN PERSON|AIR| above the slyly pending ideas boost furio +45120|1079|80|6|26|25481.82|0.02|0.02|A|F|1994-07-11|1994-06-21|1994-07-28|DELIVER IN PERSON|TRUCK|s are against the pending, express request +45120|766|31|7|32|53336.32|0.03|0.05|R|F|1994-07-25|1994-05-17|1994-08-09|DELIVER IN PERSON|MAIL|, unusual deposits according to t +45121|1608|50|1|9|13586.40|0.04|0.01|N|O|1998-05-17|1998-05-20|1998-05-28|DELIVER IN PERSON|TRUCK|terns sleep final, final tithes. sly +45121|45|71|2|11|10395.44|0.03|0.06|N|O|1998-05-30|1998-07-04|1998-06-14|TAKE BACK RETURN|REG AIR|onic, final +45122|1708|35|1|3|4829.10|0.05|0.02|R|F|1993-02-15|1992-12-12|1993-02-22|COLLECT COD|REG AIR|ites. furiously unusual ideas +45122|665|28|2|48|75151.68|0.02|0.02|A|F|1993-01-26|1992-12-15|1993-02-21|NONE|RAIL| platelets. carefully final +45122|117|96|3|29|29496.19|0.08|0.02|R|F|1992-11-25|1992-12-14|1992-11-26|DELIVER IN PERSON|RAIL|d, express requests. slyly silent p +45122|1980|13|4|24|45167.52|0.06|0.05|R|F|1993-01-16|1993-01-27|1993-02-12|NONE|TRUCK|he packages maintain f +45123|1259|60|1|50|58012.50|0.09|0.04|N|O|1998-06-21|1998-06-21|1998-07-10|COLLECT COD|REG AIR| use carefully slyly special ideas. f +45123|439|69|2|22|29467.46|0.07|0.06|N|O|1998-04-14|1998-05-28|1998-05-01|TAKE BACK RETURN|AIR|l realms use. even pinto beans are sly +45123|752|17|3|1|1652.75|0.10|0.03|N|O|1998-03-31|1998-06-24|1998-04-13|DELIVER IN PERSON|REG AIR|. pending instructions hagg +45123|1664|65|4|49|76717.34|0.01|0.00|N|O|1998-04-22|1998-06-13|1998-05-06|TAKE BACK RETURN|AIR|patterns nag quickly above the slyly ironic +45124|161|14|1|16|16978.56|0.05|0.00|N|O|1998-03-07|1998-04-15|1998-03-08|DELIVER IN PERSON|MAIL|e pinto beans cajole furiousl +45125|1553|54|1|5|7272.75|0.05|0.08|R|F|1992-07-03|1992-08-18|1992-08-01|DELIVER IN PERSON|TRUCK|nwind sometimes up the +45125|1241|79|2|44|50258.56|0.00|0.03|R|F|1992-07-02|1992-08-25|1992-07-31|COLLECT COD|SHIP|sly regular +45125|1409|27|3|43|56347.20|0.09|0.08|A|F|1992-08-09|1992-08-24|1992-08-19|NONE|RAIL|he furiously even pe +45125|1418|58|4|39|51456.99|0.08|0.02|A|F|1992-06-14|1992-08-09|1992-06-27|COLLECT COD|TRUCK| close requests wake around the regu +45125|187|66|5|14|15220.52|0.01|0.08|A|F|1992-07-09|1992-07-13|1992-08-08|NONE|TRUCK|riously bold requests should have to pri +45125|1954|43|6|6|11135.70|0.06|0.03|R|F|1992-09-27|1992-08-10|1992-10-27|TAKE BACK RETURN|SHIP|lar excuses are f +45126|1195|96|1|44|48232.36|0.04|0.07|R|F|1992-06-15|1992-07-07|1992-07-03|NONE|FOB|regular packages. ironic foxes ha +45126|589|80|2|10|14895.80|0.09|0.08|R|F|1992-07-11|1992-06-30|1992-07-14|NONE|RAIL| pending, regular dolp +45127|45|21|1|25|23626.00|0.07|0.04|R|F|1993-03-10|1993-03-15|1993-03-13|TAKE BACK RETURN|RAIL|s. furiously express reque +45127|873|40|2|16|28381.92|0.04|0.00|R|F|1993-03-01|1993-03-23|1993-03-18|COLLECT COD|MAIL|d the theodolites haggle furiously ev +45127|1358|97|3|29|36521.15|0.09|0.03|R|F|1993-03-07|1993-02-02|1993-03-21|DELIVER IN PERSON|TRUCK|s. regular +45127|779|12|4|5|8398.85|0.07|0.01|A|F|1993-03-06|1993-02-21|1993-04-04|NONE|REG AIR|odolites! blithely express deposits cajole. +45127|1985|18|5|37|69818.26|0.10|0.01|R|F|1993-03-24|1993-03-14|1993-04-11|NONE|MAIL| quickly dependencies. car +45127|690|84|6|19|30223.11|0.01|0.01|R|F|1993-02-26|1993-03-15|1993-03-02|COLLECT COD|AIR|usual instructions. fluffily bu +45152|141|94|1|14|14575.96|0.06|0.00|N|O|1997-12-22|1997-12-25|1998-01-19|DELIVER IN PERSON|RAIL|ajole fluffily. slyly even theodolites s +45152|1218|56|2|21|23503.41|0.07|0.03|N|O|1997-12-08|1997-12-29|1997-12-10|DELIVER IN PERSON|TRUCK|slyly about the bold +45152|655|49|3|12|18667.80|0.08|0.04|N|O|1998-01-10|1997-12-18|1998-01-19|TAKE BACK RETURN|MAIL|theodolites print. blithe +45152|1077|48|4|42|41078.94|0.04|0.04|N|O|1997-11-07|1998-01-20|1997-11-17|COLLECT COD|MAIL|sits. quickly regular deposi +45152|1779|22|5|35|58826.95|0.09|0.06|N|O|1997-11-22|1997-11-30|1997-12-20|NONE|MAIL| slyly final +45152|1686|87|6|45|71445.60|0.10|0.07|N|O|1998-01-24|1997-12-29|1998-01-28|NONE|FOB|sits! unus +45153|1034|5|1|17|15895.51|0.00|0.05|R|F|1992-07-10|1992-07-04|1992-07-22|TAKE BACK RETURN|SHIP|ructions. carefully re +45154|203|31|1|3|3309.60|0.05|0.03|N|O|1996-11-14|1996-12-08|1996-11-24|TAKE BACK RETURN|AIR|ongside of the fl +45154|362|63|2|42|53019.12|0.07|0.07|N|O|1997-01-05|1996-12-16|1997-01-29|DELIVER IN PERSON|TRUCK|ar accounts. ironi +45154|748|13|3|9|14838.66|0.03|0.02|N|O|1997-01-05|1997-01-17|1997-01-16|COLLECT COD|TRUCK|yly. final requests affix entic +45154|965|34|4|49|91432.04|0.05|0.08|N|O|1997-01-03|1996-11-30|1997-02-02|NONE|MAIL|arefully regular att +45154|1391|30|5|12|15508.68|0.00|0.06|N|O|1996-11-21|1996-12-03|1996-12-14|TAKE BACK RETURN|SHIP|ts across the express, unusual packages +45154|1228|40|6|33|37264.26|0.10|0.04|N|O|1997-01-19|1996-12-06|1997-02-04|COLLECT COD|REG AIR|enticingly iron +45154|430|60|7|41|54547.63|0.01|0.07|N|O|1996-11-27|1997-01-16|1996-11-29|NONE|AIR|ously even dependencies mold fluf +45155|1320|97|1|37|45188.84|0.03|0.00|R|F|1995-03-30|1995-04-05|1995-04-10|TAKE BACK RETURN|SHIP|y final packages. blithely +45155|367|52|2|12|15208.32|0.06|0.07|A|F|1995-04-05|1995-04-30|1995-04-25|DELIVER IN PERSON|TRUCK|ular foxes haggle slyly among the special d +45155|1692|93|3|29|46217.01|0.00|0.08|A|F|1995-03-01|1995-03-28|1995-03-14|TAKE BACK RETURN|TRUCK|regular requ +45155|871|71|4|32|56699.84|0.02|0.05|R|F|1995-04-10|1995-05-16|1995-05-03|TAKE BACK RETURN|SHIP|lar packag +45155|203|85|5|34|37508.80|0.07|0.01|A|F|1995-05-15|1995-05-09|1995-06-11|DELIVER IN PERSON|REG AIR|uring the express package +45156|365|94|1|3|3796.08|0.04|0.04|R|F|1995-05-27|1995-05-09|1995-06-05|DELIVER IN PERSON|RAIL|jole-- express, regular requests nag +45156|873|7|2|6|10643.22|0.10|0.08|A|F|1995-04-24|1995-03-30|1995-05-15|TAKE BACK RETURN|RAIL| blithely pend +45156|206|88|3|46|50885.20|0.06|0.03|A|F|1995-04-12|1995-04-30|1995-05-02|NONE|FOB| requests. carefully thin accoun +45156|756|57|4|24|39762.00|0.05|0.03|R|F|1995-05-01|1995-03-27|1995-05-29|NONE|REG AIR|s. regular id +45156|325|26|5|16|19605.12|0.03|0.03|A|F|1995-04-08|1995-04-25|1995-04-21|COLLECT COD|FOB|ake quickly. instructions prom +45157|1227|39|1|50|56411.00|0.05|0.07|N|O|1997-07-14|1997-07-21|1997-07-25|NONE|REG AIR|larly final packages +45157|40|41|2|17|15980.68|0.07|0.00|N|O|1997-06-24|1997-07-30|1997-07-21|COLLECT COD|RAIL| accounts cajole bl +45157|339|40|3|4|4957.32|0.10|0.00|N|O|1997-07-05|1997-06-13|1997-07-18|COLLECT COD|FOB| the furiously bold +45158|799|96|1|21|35695.59|0.08|0.01|A|F|1993-05-09|1993-06-11|1993-05-15|NONE|FOB|f the blit +45158|1463|81|2|23|31382.58|0.05|0.01|R|F|1993-07-11|1993-07-03|1993-07-14|DELIVER IN PERSON|FOB|e fluffily alongside of the slow accounts. +45158|914|15|3|13|23593.83|0.08|0.07|R|F|1993-06-04|1993-07-04|1993-06-23|DELIVER IN PERSON|TRUCK|nusual requests. +45159|1098|69|1|45|44959.05|0.10|0.02|A|F|1994-08-05|1994-07-05|1994-08-19|NONE|FOB|rve daringly. bold, re +45159|1234|35|2|12|13622.76|0.03|0.05|R|F|1994-09-04|1994-07-25|1994-10-01|NONE|RAIL|ys express waters haggle qui +45159|1214|52|3|30|33456.30|0.06|0.00|A|F|1994-05-16|1994-07-21|1994-06-13|TAKE BACK RETURN|REG AIR|aters. blithely express +45159|1503|84|4|26|36517.00|0.04|0.04|R|F|1994-08-31|1994-07-09|1994-09-15|DELIVER IN PERSON|SHIP|le permanently special dep +45159|747|12|5|16|26363.84|0.03|0.08|R|F|1994-07-19|1994-07-30|1994-07-25|COLLECT COD|TRUCK|sly about the ruthlessly regu +45159|1924|25|6|43|78514.56|0.06|0.02|R|F|1994-08-27|1994-07-31|1994-08-30|DELIVER IN PERSON|REG AIR|w foxes doubt above the realm +45184|995|98|1|44|83423.56|0.04|0.04|R|F|1993-09-01|1993-08-30|1993-09-08|TAKE BACK RETURN|SHIP|lly above the dependencies. foxes haggle bl +45184|855|22|2|33|57943.05|0.00|0.02|R|F|1993-08-12|1993-09-06|1993-09-06|NONE|REG AIR|es grow fluffily among +45184|1646|70|3|34|52619.76|0.08|0.01|A|F|1993-07-26|1993-08-10|1993-08-12|DELIVER IN PERSON|TRUCK|ly after the requests. slyly regul +45184|811|78|4|18|30812.58|0.06|0.08|R|F|1993-08-25|1993-08-06|1993-09-03|NONE|FOB|quests are. careful +45184|469|99|5|46|62995.16|0.01|0.07|R|F|1993-08-22|1993-09-07|1993-09-21|DELIVER IN PERSON|AIR| across the evenly even a +45184|1471|89|6|9|12352.23|0.10|0.08|R|F|1993-08-29|1993-09-01|1993-09-11|TAKE BACK RETURN|SHIP|ts boost stealthily express, thin reque +45185|1303|18|1|18|21677.40|0.00|0.01|R|F|1993-05-21|1993-05-14|1993-05-25|DELIVER IN PERSON|MAIL|thely even excuses u +45185|990|59|2|21|39710.79|0.08|0.08|A|F|1993-04-01|1993-05-18|1993-04-18|TAKE BACK RETURN|FOB|furiously express instructions boost bli +45185|118|97|3|42|42760.62|0.09|0.04|A|F|1993-05-09|1993-05-24|1993-05-14|TAKE BACK RETURN|REG AIR| pinto beans. care +45185|635|36|4|47|72174.61|0.07|0.01|A|F|1993-04-26|1993-04-23|1993-05-01|COLLECT COD|AIR|es serve idly ironic requests. unusual f +45185|1442|82|5|44|59111.36|0.02|0.01|A|F|1993-04-02|1993-06-03|1993-04-11|TAKE BACK RETURN|AIR| bold ideas sleep +45186|899|100|1|46|82794.94|0.00|0.08|N|O|1998-08-29|1998-07-08|1998-09-20|NONE|RAIL|r the quietly pending packages are slyly a +45186|431|19|2|25|33285.75|0.00|0.03|N|O|1998-09-08|1998-07-15|1998-09-15|NONE|SHIP|nic accounts along the fluffily +45186|222|4|3|18|20199.96|0.02|0.03|N|O|1998-07-27|1998-06-21|1998-07-28|TAKE BACK RETURN|SHIP|structions until +45187|93|19|1|28|27806.52|0.05|0.02|R|F|1994-01-04|1994-01-20|1994-01-20|DELIVER IN PERSON|MAIL|counts use. quickly ironic packages boos +45187|1651|75|2|23|35710.95|0.06|0.07|A|F|1993-12-02|1993-12-28|1993-12-09|TAKE BACK RETURN|REG AIR|jole furiously blithe +45187|1560|41|3|34|49693.04|0.07|0.06|A|F|1994-02-24|1994-01-30|1994-03-17|NONE|FOB| requests try to print. +45187|1344|45|4|7|8717.38|0.08|0.05|R|F|1994-01-09|1993-12-27|1994-01-14|DELIVER IN PERSON|AIR| the slyly un +45187|239|21|5|2|2278.46|0.06|0.08|A|F|1994-03-08|1993-12-13|1994-04-07|COLLECT COD|REG AIR|oxes use furiously. deposits +45187|1128|29|6|14|14407.68|0.04|0.00|R|F|1994-02-09|1993-12-14|1994-02-26|TAKE BACK RETURN|REG AIR|posits. slyly +45187|581|12|7|39|57781.62|0.07|0.07|R|F|1993-11-21|1993-12-20|1993-12-13|TAKE BACK RETURN|AIR|ar theodolites sleep furiously according t +45188|1693|17|1|11|17541.59|0.00|0.02|N|O|1996-10-30|1996-10-27|1996-11-05|NONE|FOB|s. pending p +45188|1782|67|2|29|48829.62|0.05|0.02|N|O|1996-08-16|1996-10-06|1996-08-30|COLLECT COD|MAIL|arefully e +45188|1110|19|3|33|33366.63|0.06|0.01|N|O|1996-09-13|1996-09-26|1996-10-09|TAKE BACK RETURN|REG AIR| are slyly across the regular packages. +45188|439|27|4|49|65632.07|0.01|0.02|N|O|1996-09-22|1996-10-09|1996-10-19|DELIVER IN PERSON|REG AIR|es. express, final pinto beans +45188|1708|35|5|38|61168.60|0.02|0.02|N|O|1996-09-17|1996-09-23|1996-10-03|NONE|AIR|beans about the carefully regula +45188|1829|30|6|38|65771.16|0.02|0.01|N|O|1996-10-05|1996-10-03|1996-10-17|NONE|MAIL|nto beans doze-- express +45188|1314|29|7|40|48612.40|0.06|0.05|N|O|1996-10-12|1996-09-17|1996-10-17|TAKE BACK RETURN|RAIL|slyly quick requests wake silently agai +45189|801|68|1|39|66370.20|0.09|0.02|R|F|1995-03-01|1995-02-15|1995-03-25|COLLECT COD|REG AIR|ly regular packages use q +45189|1270|45|2|18|21082.86|0.03|0.05|R|F|1995-01-28|1995-03-02|1995-02-05|TAKE BACK RETURN|MAIL|pending somas. ideas affi +45189|1620|62|3|5|7608.10|0.03|0.01|R|F|1995-04-03|1995-02-07|1995-04-06|DELIVER IN PERSON|RAIL|al package +45189|1974|7|4|36|67534.92|0.06|0.04|R|F|1994-12-17|1995-02-25|1994-12-24|TAKE BACK RETURN|SHIP|carefully even ideas +45189|1194|67|5|39|42712.41|0.10|0.08|A|F|1994-12-14|1995-02-19|1994-12-18|DELIVER IN PERSON|SHIP|ns. blithely ironic pa +45189|541|2|6|18|25947.72|0.03|0.06|R|F|1995-03-05|1995-01-28|1995-03-26|DELIVER IN PERSON|FOB| furiously f +45190|718|15|1|31|50180.01|0.04|0.04|R|F|1993-11-29|1994-01-24|1993-12-20|DELIVER IN PERSON|MAIL|y regular packages boost bold +45190|477|36|2|2|2754.94|0.03|0.03|A|F|1994-01-30|1994-01-11|1994-01-31|NONE|MAIL|packages. carefully special pinto bean +45190|144|71|3|19|19838.66|0.09|0.06|R|F|1993-12-12|1994-02-02|1993-12-30|DELIVER IN PERSON|SHIP|ously final requests haggle. furiousl +45190|1939|40|4|36|66273.48|0.02|0.00|A|F|1994-01-01|1993-12-23|1994-01-16|DELIVER IN PERSON|MAIL|r deposits. quietly regu +45190|1859|60|5|1|1760.85|0.08|0.03|A|F|1994-01-07|1994-01-03|1994-01-20|TAKE BACK RETURN|RAIL|r the slyly unusual platelets. regular requ +45191|83|59|1|24|23593.92|0.05|0.00|A|F|1993-01-30|1993-01-09|1993-02-26|DELIVER IN PERSON|SHIP|nic foxes. foxes above +45216|1690|32|1|27|42975.63|0.09|0.07|N|O|1996-09-23|1996-08-21|1996-09-29|COLLECT COD|AIR|ronic frays +45217|1299|11|1|32|38409.28|0.03|0.00|A|F|1993-11-29|1993-11-16|1993-12-26|DELIVER IN PERSON|MAIL|ress requests haggle furiously about +45217|1480|81|2|6|8288.88|0.04|0.07|R|F|1993-09-27|1993-11-02|1993-10-11|TAKE BACK RETURN|AIR|oost in place of t +45217|907|10|3|28|50621.20|0.02|0.07|R|F|1993-10-26|1993-10-20|1993-11-16|COLLECT COD|MAIL|osits. carefully even depths b +45218|1300|12|1|8|9610.40|0.08|0.04|R|F|1994-08-31|1994-06-14|1994-09-23|TAKE BACK RETURN|RAIL|y regular foxes +45218|1549|30|2|42|60922.68|0.04|0.07|A|F|1994-06-17|1994-07-12|1994-06-18|COLLECT COD|MAIL|lites detect slyly ironic, regula +45219|1737|80|1|16|26219.68|0.04|0.02|A|F|1992-05-17|1992-05-18|1992-06-02|COLLECT COD|AIR|late regularly. slyly final a +45219|1699|100|2|33|52822.77|0.00|0.06|R|F|1992-06-27|1992-04-04|1992-07-07|NONE|MAIL|jole carefully after the slyly +45219|293|21|3|29|34605.41|0.05|0.04|R|F|1992-04-26|1992-05-16|1992-05-13|TAKE BACK RETURN|TRUCK|ests cajole furiously against the regular +45219|1820|50|4|41|70594.62|0.02|0.03|A|F|1992-03-30|1992-04-02|1992-04-06|DELIVER IN PERSON|RAIL| doze carefully after the final, regu +45219|1734|35|5|25|40893.25|0.03|0.04|A|F|1992-04-04|1992-05-02|1992-04-20|NONE|RAIL|s haggle slyly ironic +45220|1324|25|1|25|30633.00|0.04|0.07|N|O|1997-05-25|1997-07-17|1997-06-21|DELIVER IN PERSON|AIR|lly final packages. even, regular idea +45220|1510|11|2|12|16938.12|0.08|0.03|N|O|1997-09-19|1997-08-01|1997-09-25|DELIVER IN PERSON|RAIL|the blithely final packages use fluffily at +45220|1014|15|3|34|31110.34|0.05|0.06|N|O|1997-05-26|1997-07-04|1997-05-31|NONE|AIR|leep slyly u +45220|718|83|4|30|48561.30|0.01|0.07|N|O|1997-09-01|1997-07-15|1997-09-19|COLLECT COD|SHIP| regular accounts cajole. carefully ironic +45221|1296|97|1|23|27537.67|0.08|0.05|N|O|1997-11-23|1997-11-15|1997-12-02|NONE|REG AIR|ccounts cajole slyly bold requests; c +45221|1247|85|2|41|47077.84|0.06|0.00|N|O|1997-12-10|1997-12-06|1997-12-16|DELIVER IN PERSON|REG AIR| final accounts detect blithely bold +45221|384|69|3|20|25687.60|0.00|0.04|N|O|1998-01-03|1997-11-22|1998-01-17|DELIVER IN PERSON|SHIP|furiously furiously silent depths. fluffi +45221|1830|74|4|3|5195.49|0.07|0.08|N|O|1998-02-06|1997-12-24|1998-02-09|COLLECT COD|AIR|. pinto beans around the carefully unu +45222|409|39|1|17|22259.80|0.05|0.05|N|O|1996-11-04|1996-08-22|1996-12-02|TAKE BACK RETURN|RAIL|ests detect furiously packages. furiousl +45222|843|10|2|38|66265.92|0.08|0.00|N|O|1996-07-23|1996-09-15|1996-08-01|TAKE BACK RETURN|RAIL|s use furiously +45223|1399|76|1|1|1300.39|0.09|0.04|N|O|1996-12-27|1996-12-02|1997-01-08|DELIVER IN PERSON|AIR|courts wake slyly. even accounts +45223|1909|54|2|25|45272.50|0.01|0.08|N|O|1996-11-16|1996-11-06|1996-12-14|COLLECT COD|SHIP|ests haggle +45223|1031|2|3|45|41941.35|0.00|0.07|N|O|1996-11-13|1996-11-07|1996-12-03|NONE|MAIL| haggle. blithely fluffy excuses nag fluffi +45223|713|46|4|13|20978.23|0.05|0.03|N|O|1996-10-17|1996-11-06|1996-10-27|TAKE BACK RETURN|AIR|unusual accounts. furiously pen +45223|952|21|5|10|18529.50|0.03|0.01|N|O|1996-10-15|1996-11-16|1996-10-18|COLLECT COD|FOB|. slyly final dependencies integ +45223|1826|70|6|5|8639.10|0.07|0.05|N|O|1996-10-14|1996-11-30|1996-11-11|NONE|AIR| special requests haggle +45223|1618|1|7|5|7598.05|0.09|0.01|N|O|1996-09-19|1996-11-17|1996-09-30|NONE|MAIL|fully regular dolphins agains +45248|1409|10|1|23|30139.20|0.01|0.03|N|O|1995-07-19|1995-07-04|1995-07-27|DELIVER IN PERSON|SHIP|he bravely final pinto beans wake +45248|144|97|2|13|13573.82|0.08|0.08|R|F|1995-04-21|1995-07-04|1995-05-13|TAKE BACK RETURN|MAIL|s are carefully. closely i +45248|54|5|3|12|11448.60|0.00|0.00|A|F|1995-04-19|1995-05-23|1995-04-20|TAKE BACK RETURN|MAIL|. doggedly unusual platelets among th +45248|836|70|4|24|41683.92|0.04|0.08|R|F|1995-04-27|1995-06-16|1995-05-07|TAKE BACK RETURN|MAIL|symptotes sleep blithely. +45248|695|96|5|11|17552.59|0.01|0.07|R|F|1995-05-15|1995-07-12|1995-06-08|COLLECT COD|MAIL|eside the express, final pearls: unusual +45249|845|79|1|19|33170.96|0.04|0.00|A|F|1993-12-09|1993-12-29|1994-01-03|COLLECT COD|REG AIR|kages wake furiously deposits +45249|888|55|2|4|7155.52|0.10|0.06|A|F|1994-03-17|1994-01-13|1994-03-19|COLLECT COD|MAIL|foxes affix pending asymp +45250|1852|82|1|46|80677.10|0.05|0.01|N|O|1998-02-08|1997-12-20|1998-02-20|COLLECT COD|FOB|ckages. express, quick deposits woul +45250|1239|40|2|37|42188.51|0.06|0.06|N|O|1997-11-15|1997-11-28|1997-11-27|NONE|SHIP|latelets haggle carefully after the f +45250|618|50|3|44|66818.84|0.02|0.04|N|O|1998-01-16|1997-12-25|1998-01-27|TAKE BACK RETURN|SHIP|ly ironic theodol +45250|453|83|4|24|32482.80|0.09|0.05|N|O|1998-01-07|1997-12-30|1998-01-21|TAKE BACK RETURN|FOB| regular, express braids +45250|1015|51|5|42|38472.42|0.03|0.00|N|O|1998-01-31|1997-12-11|1998-02-03|NONE|MAIL| should have to cajol +45250|1176|77|6|24|25852.08|0.07|0.01|N|O|1998-01-07|1997-12-10|1998-02-02|DELIVER IN PERSON|SHIP|ans use furio +45251|1644|68|1|14|21638.96|0.02|0.05|R|F|1993-09-05|1993-11-04|1993-09-19|COLLECT COD|REG AIR|usly about the blithely fin +45251|1872|2|2|2|3547.74|0.03|0.08|A|F|1993-11-11|1993-10-05|1993-11-12|DELIVER IN PERSON|FOB| affix. unusual, fl +45251|185|12|3|24|26044.32|0.10|0.00|R|F|1993-12-16|1993-10-02|1993-12-21|DELIVER IN PERSON|SHIP| boost about the slyly s +45251|1810|40|4|43|73607.83|0.00|0.07|R|F|1993-09-09|1993-11-19|1993-10-05|NONE|MAIL| sheaves about the ironic pinto bean +45252|604|67|1|31|46642.60|0.04|0.00|R|F|1994-10-31|1994-08-20|1994-11-06|NONE|TRUCK|ironically spec +45252|1962|51|2|30|55918.80|0.00|0.08|R|F|1994-09-24|1994-09-04|1994-10-13|TAKE BACK RETURN|AIR|r theodolites. +45252|561|62|3|37|54077.72|0.03|0.03|A|F|1994-10-31|1994-09-01|1994-11-02|COLLECT COD|MAIL|uests haggle furiously final ideas. packa +45252|150|29|4|20|21003.00|0.02|0.07|A|F|1994-07-30|1994-09-11|1994-08-19|DELIVER IN PERSON|MAIL|ly regular instructions. blithe +45252|574|65|5|6|8847.42|0.06|0.05|A|F|1994-10-06|1994-08-30|1994-10-07|COLLECT COD|REG AIR|requests haggle slyly. sly +45252|194|73|6|36|39390.84|0.09|0.01|R|F|1994-08-18|1994-08-24|1994-09-04|DELIVER IN PERSON|RAIL|heodolites. slyly special accounts h +45253|871|38|1|46|81506.02|0.02|0.08|N|O|1997-03-08|1997-02-04|1997-03-26|COLLECT COD|MAIL|aphs detect furiously blithely expre +45253|33|9|2|14|13062.42|0.00|0.07|N|O|1996-12-05|1997-01-10|1996-12-07|TAKE BACK RETURN|REG AIR|sts: quickly final pinto beans sleep. +45253|1352|53|3|43|53894.05|0.06|0.02|N|O|1996-12-10|1997-02-05|1997-01-03|TAKE BACK RETURN|AIR|ular requests. plate +45253|788|89|4|49|82750.22|0.03|0.03|N|O|1997-01-19|1997-02-25|1997-02-10|NONE|RAIL|l asymptotes boost furious +45254|1266|78|1|2|2334.52|0.01|0.06|A|F|1993-09-03|1993-08-28|1993-09-13|COLLECT COD|FOB|ing foxes cajole ac +45254|178|79|2|49|52830.33|0.01|0.04|R|F|1993-10-18|1993-09-12|1993-11-14|NONE|RAIL|even foxes sleep furiously. deposits nag +45254|450|38|3|13|17555.85|0.02|0.03|A|F|1993-10-27|1993-09-26|1993-11-26|TAKE BACK RETURN|FOB| ironic foxes haggle among t +45254|171|98|4|2|2142.34|0.01|0.00|R|F|1993-11-24|1993-09-10|1993-12-19|TAKE BACK RETURN|TRUCK|eodolites among the furiously special ac +45254|1733|60|5|20|32694.60|0.01|0.06|R|F|1993-10-25|1993-10-09|1993-11-08|NONE|MAIL| fluffily. slyly silent dependencies +45255|1510|51|1|29|40933.79|0.10|0.06|N|O|1997-09-21|1997-09-03|1997-09-23|COLLECT COD|TRUCK|ic platelets slee +45255|1041|77|2|8|7536.32|0.04|0.02|N|O|1997-07-17|1997-09-08|1997-08-06|NONE|REG AIR|thely ironic instructions. final, iro +45255|1183|20|3|40|43367.20|0.08|0.03|N|O|1997-10-20|1997-10-13|1997-11-17|TAKE BACK RETURN|REG AIR|deposits haggle b +45255|271|72|4|42|49193.34|0.00|0.07|N|O|1997-09-30|1997-10-08|1997-10-25|TAKE BACK RETURN|MAIL|eans wake slyly at the +45255|513|74|5|7|9894.57|0.03|0.02|N|O|1997-08-11|1997-09-04|1997-08-29|NONE|AIR| special pinto beans use quickly. as +45255|286|87|6|9|10676.52|0.09|0.01|N|O|1997-07-30|1997-09-28|1997-08-16|NONE|AIR|deposits haggle b +45255|1149|22|7|43|45156.02|0.08|0.03|N|O|1997-10-14|1997-09-19|1997-10-27|DELIVER IN PERSON|AIR|regular foxes cajole evenl +45280|1549|70|1|34|49318.36|0.03|0.07|N|O|1998-02-22|1998-01-27|1998-02-26|TAKE BACK RETURN|REG AIR|ly alongside of the bli +45280|1694|95|2|42|67018.98|0.08|0.05|N|O|1997-11-20|1997-12-26|1997-11-23|COLLECT COD|RAIL|y express packages believe blithely a +45280|1682|6|3|42|66514.56|0.08|0.00|N|O|1997-12-03|1998-01-05|1997-12-13|DELIVER IN PERSON|RAIL|tions haggl +45280|1718|19|4|7|11337.97|0.10|0.01|N|O|1997-11-23|1998-02-01|1997-12-01|TAKE BACK RETURN|REG AIR| quickly regular excuses are blith +45280|1069|40|5|6|5820.36|0.08|0.03|N|O|1997-11-11|1997-12-06|1997-11-26|NONE|RAIL|es. quickly pending depths hag +45280|1564|65|6|6|8793.36|0.06|0.01|N|O|1998-01-14|1998-01-02|1998-02-11|COLLECT COD|TRUCK|tes. quickly bold foxes across the blithel +45281|1961|6|1|3|5588.88|0.05|0.08|N|O|1997-05-05|1997-04-20|1997-05-27|DELIVER IN PERSON|TRUCK|odolites can haggle. carefully ironi +45281|959|28|2|34|63238.30|0.02|0.02|N|O|1997-04-17|1997-05-14|1997-05-07|NONE|TRUCK|ly permanent requ +45282|1293|68|1|33|39411.57|0.01|0.02|N|O|1998-02-02|1998-02-28|1998-02-12|TAKE BACK RETURN|AIR|are according to the s +45282|1085|91|2|18|17749.44|0.04|0.01|N|O|1998-01-01|1998-02-01|1998-01-03|NONE|SHIP|bold waters wake blithely sly +45282|1163|100|3|31|32988.96|0.03|0.08|N|O|1998-02-28|1998-01-16|1998-03-16|NONE|SHIP|ades. carefully bold +45282|707|40|4|16|25723.20|0.06|0.06|N|O|1998-02-23|1998-02-21|1998-03-19|NONE|FOB|odolites caj +45282|794|91|5|14|23727.06|0.02|0.06|N|O|1998-02-23|1998-01-12|1998-03-08|NONE|TRUCK|ans sleep. regular deposits nag carefu +45282|6|32|6|27|24462.00|0.08|0.06|N|O|1998-01-03|1998-02-15|1998-01-16|COLLECT COD|RAIL|ructions. final requests use regul +45282|1276|14|7|45|52977.15|0.08|0.05|N|O|1997-12-12|1998-01-14|1998-01-09|TAKE BACK RETURN|TRUCK|deposits. iro +45283|1654|78|1|23|35779.95|0.09|0.07|N|O|1996-11-12|1996-12-12|1996-11-21|NONE|SHIP| blithely special deposits across the +45283|2000|89|2|6|5412.00|0.03|0.07|N|O|1996-12-27|1996-12-30|1997-01-23|DELIVER IN PERSON|TRUCK| sleep. sometimes even theodol +45283|1394|71|3|37|47929.43|0.08|0.08|N|O|1996-12-14|1996-11-07|1997-01-07|COLLECT COD|AIR|after the fluffily final accounts. quickl +45283|402|61|4|18|23443.20|0.03|0.02|N|O|1996-11-25|1996-11-26|1996-12-20|NONE|MAIL|excuses. quiet instructions +45283|942|45|5|29|53445.26|0.02|0.08|N|O|1996-12-03|1996-11-26|1996-12-28|DELIVER IN PERSON|TRUCK|refully after the requests. pinto b +45283|690|84|6|34|54083.46|0.08|0.03|N|O|1996-12-07|1996-12-13|1996-12-12|DELIVER IN PERSON|TRUCK|packages. bl +45283|688|89|7|37|58781.16|0.07|0.01|N|O|1997-01-05|1996-12-31|1997-01-11|TAKE BACK RETURN|RAIL|egrate quickly. fluffily regular pac +45284|971|40|1|25|46799.25|0.00|0.04|A|F|1992-04-10|1992-03-22|1992-04-28|NONE|SHIP|less accounts wake carefu +45285|581|82|1|11|16297.38|0.07|0.08|N|O|1997-01-02|1996-10-15|1997-01-10|NONE|SHIP|equests use across the blithely +45285|1763|48|2|4|6659.04|0.06|0.05|N|O|1996-12-03|1996-10-18|1996-12-27|TAKE BACK RETURN|REG AIR| carefully special foxes integr +45285|1334|11|3|25|30883.25|0.03|0.06|N|O|1996-11-11|1996-11-20|1996-11-13|NONE|AIR|l excuses wak +45285|463|64|4|17|23178.82|0.03|0.03|N|O|1997-01-02|1996-10-31|1997-01-31|NONE|AIR|beans cajole alongside +45286|1989|78|1|42|79421.16|0.10|0.03|N|O|1998-11-01|1998-09-11|1998-11-07|COLLECT COD|AIR|ironic requests. +45286|1983|84|2|17|32044.66|0.00|0.06|N|O|1998-08-22|1998-10-03|1998-09-12|NONE|MAIL|fter the care +45286|1259|34|3|28|32487.00|0.08|0.08|N|O|1998-09-19|1998-09-18|1998-09-25|TAKE BACK RETURN|REG AIR|s among the ironic foxes +45287|330|31|1|48|59055.84|0.09|0.01|N|O|1998-03-22|1998-01-25|1998-04-04|COLLECT COD|MAIL|s boost fluffily on the slyly +45287|279|80|2|27|31840.29|0.10|0.08|N|O|1998-02-18|1998-02-24|1998-02-27|COLLECT COD|FOB|. ironically regula +45287|1234|35|3|13|14757.99|0.09|0.07|N|O|1998-02-26|1998-03-18|1998-03-21|COLLECT COD|RAIL|platelets doze slyl +45287|1498|38|4|14|19592.86|0.06|0.00|N|O|1998-03-12|1998-02-12|1998-03-19|TAKE BACK RETURN|SHIP|gedly bold deposi +45287|468|56|5|27|36948.42|0.09|0.02|N|O|1998-04-19|1998-03-04|1998-04-30|NONE|TRUCK|en deposits around the quickly pending +45312|267|68|1|39|45523.14|0.10|0.07|N|O|1996-05-28|1996-07-10|1996-06-25|NONE|MAIL| slyly across the b +45312|516|7|2|28|39662.28|0.02|0.07|N|O|1996-07-05|1996-07-05|1996-07-10|TAKE BACK RETURN|FOB|ackages kindle. slyly f +45312|1314|15|3|40|48612.40|0.08|0.08|N|O|1996-07-03|1996-06-16|1996-07-09|COLLECT COD|SHIP|sly regular p +45312|63|39|4|47|45263.82|0.00|0.01|N|O|1996-07-14|1996-07-02|1996-08-09|DELIVER IN PERSON|MAIL|t the quietly even requests mold furio +45312|521|52|5|49|69654.48|0.03|0.07|N|O|1996-08-09|1996-07-04|1996-09-04|NONE|FOB|uctions ca +45312|836|37|6|3|5210.49|0.10|0.05|N|O|1996-05-20|1996-06-10|1996-06-16|TAKE BACK RETURN|AIR|posits wake furiously among the furio +45313|64|15|1|49|47238.94|0.06|0.01|N|O|1996-09-19|1996-10-07|1996-10-01|NONE|FOB|kly daring pinto beans cajole after the +45313|807|41|2|31|52941.80|0.08|0.08|N|O|1996-10-25|1996-11-30|1996-11-11|NONE|SHIP| furiously across the blithely regu +45313|1030|66|3|49|45620.47|0.06|0.05|N|O|1996-09-04|1996-11-10|1996-10-03|COLLECT COD|MAIL|ously ironic accounts boost +45313|1336|51|4|44|54442.52|0.04|0.03|N|O|1996-10-21|1996-11-02|1996-11-02|NONE|SHIP|ronic pinto beans. unusua +45313|371|100|5|19|24156.03|0.08|0.04|N|O|1996-12-21|1996-10-31|1997-01-10|NONE|SHIP| furiously after the slyly ironic dolp +45313|955|56|6|36|66814.20|0.05|0.02|N|O|1996-10-17|1996-10-27|1996-10-29|DELIVER IN PERSON|FOB|rious accounts. pending, regular waters +45314|196|97|1|42|46039.98|0.04|0.07|N|O|1996-05-20|1996-05-08|1996-05-26|COLLECT COD|REG AIR|nusual deposits. carefully regular acc +45314|1888|75|2|44|78754.72|0.04|0.04|N|O|1996-03-25|1996-06-07|1996-04-12|DELIVER IN PERSON|TRUCK|ts are. regular, regular deposits +45315|1624|48|1|22|33563.64|0.09|0.08|A|F|1992-06-20|1992-06-13|1992-07-13|NONE|RAIL|xpress, ironic packages wake furio +45315|1363|78|2|2|2528.72|0.01|0.01|A|F|1992-08-02|1992-06-14|1992-08-29|DELIVER IN PERSON|RAIL|boost furiously above the +45315|254|9|3|6|6925.50|0.01|0.04|A|F|1992-06-24|1992-06-11|1992-06-30|COLLECT COD|SHIP|run slyly qu +45316|359|16|1|22|27705.70|0.01|0.02|N|O|1997-10-19|1997-09-07|1997-11-01|NONE|AIR|ld packages cajole stealthily about th +45317|1629|30|1|1|1530.62|0.03|0.05|A|F|1992-06-14|1992-04-23|1992-06-27|NONE|SHIP|ully express deposits ca +45317|530|31|2|31|44346.43|0.07|0.08|A|F|1992-05-11|1992-04-19|1992-06-05|NONE|FOB|ly regular packages are. furiously final +45317|182|83|3|11|11903.98|0.09|0.00|A|F|1992-06-11|1992-05-13|1992-07-06|NONE|SHIP| theodolites. blithely pending +45317|996|99|4|30|56909.70|0.04|0.01|R|F|1992-03-30|1992-04-11|1992-04-28|TAKE BACK RETURN|MAIL|he accounts affix ca +45317|957|26|5|9|16721.55|0.01|0.04|A|F|1992-03-13|1992-04-26|1992-03-24|COLLECT COD|TRUCK|unts use unusual, e +45317|1389|90|6|18|23226.84|0.02|0.02|R|F|1992-06-28|1992-04-12|1992-07-19|TAKE BACK RETURN|FOB|fully express platelets are +45317|804|38|7|23|39210.40|0.10|0.00|R|F|1992-04-02|1992-04-22|1992-04-19|NONE|TRUCK|packages. fluffily b +45318|1373|50|1|45|57346.65|0.07|0.04|N|O|1998-02-18|1998-01-17|1998-02-26|COLLECT COD|SHIP|gular theodolites +45318|1589|90|2|36|53660.88|0.07|0.02|N|O|1998-01-13|1997-12-26|1998-02-10|NONE|RAIL| ironic excuses. thinly quick pinto +45318|1190|27|3|31|33826.89|0.08|0.06|N|O|1997-11-26|1997-12-22|1997-12-01|DELIVER IN PERSON|SHIP|ending pinto beans nag besides the de +45318|846|13|4|17|29696.28|0.10|0.00|N|O|1998-01-05|1997-12-23|1998-01-26|TAKE BACK RETURN|FOB|press deposits. express asy +45318|1123|32|5|34|34820.08|0.06|0.01|N|O|1997-11-18|1998-01-07|1997-12-06|NONE|TRUCK|iously among the quic +45318|636|99|6|1|1536.63|0.02|0.03|N|O|1997-12-17|1997-12-06|1998-01-01|TAKE BACK RETURN|MAIL|s serve theodolites. furiou +45319|1841|42|1|40|69713.60|0.07|0.04|N|O|1997-06-21|1997-06-29|1997-07-17|TAKE BACK RETURN|MAIL|final, regular requests do haggle slowly i +45319|815|15|2|45|77211.45|0.06|0.06|N|O|1997-05-30|1997-07-16|1997-06-11|TAKE BACK RETURN|SHIP|sits. fluffily reg +45319|273|74|3|16|18772.32|0.00|0.00|N|O|1997-06-11|1997-07-04|1997-07-06|NONE|AIR|ic pinto beans use doggedly fluffily fina +45319|17|18|4|46|42182.46|0.07|0.00|N|O|1997-05-13|1997-08-04|1997-05-20|DELIVER IN PERSON|TRUCK|ts nag blithely about the ruthles +45344|551|42|1|25|36288.75|0.03|0.02|A|F|1993-12-28|1993-12-06|1994-01-14|COLLECT COD|TRUCK|ar deposits according +45345|1027|28|1|4|3712.08|0.05|0.04|A|F|1993-10-26|1993-09-18|1993-11-04|DELIVER IN PERSON|AIR|efully across the carefully pendi +45345|1047|48|2|7|6636.28|0.04|0.01|A|F|1993-07-06|1993-08-22|1993-07-31|DELIVER IN PERSON|SHIP|endencies nag-- f +45346|967|68|1|39|72850.44|0.03|0.01|A|F|1993-03-07|1993-02-11|1993-03-09|DELIVER IN PERSON|MAIL|pains. final packages sleep sly +45346|706|39|2|38|61054.60|0.06|0.02|A|F|1993-01-07|1993-01-16|1993-01-21|DELIVER IN PERSON|RAIL|carefully silent deposits. quickly p +45347|702|3|1|47|75326.90|0.09|0.04|A|F|1993-11-26|1993-11-12|1993-12-10|TAKE BACK RETURN|MAIL|he final, +45347|1864|8|2|21|37083.06|0.10|0.04|R|F|1993-11-06|1993-12-09|1993-11-27|COLLECT COD|AIR|gularly ironic pinto beans: blithel +45347|1333|48|3|30|37029.90|0.07|0.02|A|F|1993-11-29|1993-11-20|1993-12-24|NONE|SHIP|s. slyly regular packages wake slyly. iro +45347|687|19|4|31|49218.08|0.02|0.07|R|F|1993-11-10|1993-12-09|1993-11-30|NONE|MAIL|sits. fluffily close pin +45347|1934|35|5|17|31210.81|0.01|0.03|R|F|1994-01-05|1993-11-11|1994-01-09|NONE|FOB|instructions haggl +45347|38|14|6|25|23450.75|0.04|0.00|A|F|1994-01-11|1993-12-09|1994-01-12|COLLECT COD|RAIL|en deposits! quickly special deposit +45348|227|9|1|49|55233.78|0.07|0.06|R|F|1993-07-13|1993-08-09|1993-08-12|TAKE BACK RETURN|TRUCK|beans are final ideas. blith +45348|1396|97|2|38|49300.82|0.02|0.00|R|F|1993-09-13|1993-08-15|1993-09-20|TAKE BACK RETURN|REG AIR|yly regular hockey players +45349|389|46|1|44|56732.72|0.07|0.04|R|F|1995-05-27|1995-04-18|1995-05-29|TAKE BACK RETURN|FOB|nusual orbits doze carefully +45349|527|88|2|30|42825.60|0.02|0.08|R|F|1995-04-19|1995-04-28|1995-04-30|COLLECT COD|REG AIR|o beans doubt. fluffily quic +45350|499|58|1|24|33587.76|0.09|0.04|R|F|1995-03-19|1995-02-03|1995-03-25|TAKE BACK RETURN|TRUCK|l deposits doubt slyly. ironic, speci +45350|1125|26|2|17|17444.04|0.00|0.07|R|F|1995-02-26|1995-03-04|1995-03-13|DELIVER IN PERSON|SHIP|blithely express depe +45350|1954|43|3|50|92797.50|0.01|0.01|A|F|1995-01-30|1995-03-24|1995-02-06|NONE|REG AIR|requests integrate according to the +45351|1770|71|1|8|13374.16|0.05|0.06|N|O|1997-06-13|1997-07-05|1997-06-19|NONE|RAIL|ldly stealthy instructions. carefull +45351|1902|35|2|44|79371.60|0.09|0.03|N|O|1997-08-08|1997-08-07|1997-09-07|COLLECT COD|MAIL|g accounts integrate slyly of t +45351|1240|78|3|30|34237.20|0.04|0.04|N|O|1997-08-15|1997-08-07|1997-08-16|NONE|REG AIR|arefully furiously ironic excuses; b +45351|976|45|4|37|69447.89|0.00|0.03|N|O|1997-05-30|1997-07-28|1997-05-31|NONE|AIR|ly pending requests are quickly; furiou +45351|215|70|5|42|46838.82|0.09|0.00|N|O|1997-07-05|1997-06-22|1997-07-07|NONE|FOB|detect quickly. regular, ir +45351|402|32|6|2|2604.80|0.02|0.00|N|O|1997-06-14|1997-07-16|1997-06-26|NONE|TRUCK|le. request +45351|290|18|7|9|10712.61|0.10|0.00|N|O|1997-06-11|1997-08-02|1997-06-17|NONE|MAIL|uctions sleep closely regular the +45376|1954|55|1|37|68670.15|0.10|0.06|N|O|1996-03-25|1996-02-13|1996-04-13|COLLECT COD|AIR|express, regular packages sleep blithel +45376|1281|56|2|43|50838.04|0.07|0.05|N|O|1996-01-08|1996-02-16|1996-01-25|TAKE BACK RETURN|AIR|fluffily ent +45376|1665|7|3|42|65799.72|0.09|0.07|N|O|1996-03-26|1996-01-31|1996-03-28|TAKE BACK RETURN|MAIL|detect never- +45376|1649|91|4|12|18607.68|0.03|0.08|N|O|1995-12-28|1996-01-27|1996-01-01|TAKE BACK RETURN|RAIL|ld requests boost slyly ruthless +45376|1422|23|5|18|23821.56|0.03|0.06|N|O|1996-02-23|1996-02-28|1996-02-28|DELIVER IN PERSON|MAIL| to the regular theodo +45376|1570|11|6|6|8829.42|0.00|0.02|N|O|1996-03-03|1996-02-22|1996-03-18|COLLECT COD|SHIP|eodolites are quick +45376|139|40|7|35|36369.55|0.07|0.08|N|O|1996-02-27|1996-01-28|1996-03-11|DELIVER IN PERSON|AIR|dependencies. pin +45377|1336|37|1|44|54442.52|0.09|0.08|R|F|1995-05-02|1995-05-26|1995-06-01|COLLECT COD|MAIL|ully sly pains? +45377|1624|7|2|48|73229.76|0.08|0.01|N|O|1995-06-26|1995-05-05|1995-07-03|NONE|MAIL|gle quickly q +45377|1850|80|3|45|78833.25|0.08|0.04|N|O|1995-07-20|1995-05-18|1995-08-09|COLLECT COD|SHIP|e blithely pe +45377|1280|18|4|40|47251.20|0.02|0.07|N|F|1995-05-27|1995-05-27|1995-06-24|TAKE BACK RETURN|REG AIR|ial requests wake carefully along +45378|963|64|1|45|83878.20|0.03|0.05|R|F|1992-07-07|1992-07-02|1992-08-03|NONE|AIR|uctions. unusual, ironic accounts +45378|1820|64|2|9|15496.38|0.09|0.02|R|F|1992-09-09|1992-07-23|1992-09-27|COLLECT COD|MAIL|ely. blithely pending pinto be +45379|1362|63|1|49|61904.64|0.09|0.06|A|F|1994-09-09|1994-09-09|1994-09-28|DELIVER IN PERSON|AIR|uests boost fur +45379|1678|2|2|49|77403.83|0.07|0.00|R|F|1994-10-20|1994-08-22|1994-11-07|DELIVER IN PERSON|FOB|ss accounts. slyly express accounts sol +45380|1396|73|1|13|16866.07|0.02|0.07|R|F|1994-05-18|1994-06-09|1994-06-16|NONE|RAIL|e across the special deposi +45380|727|60|2|49|79758.28|0.00|0.06|R|F|1994-07-10|1994-06-15|1994-07-11|COLLECT COD|SHIP|unusual excuses +45380|727|60|3|50|81386.00|0.08|0.06|R|F|1994-06-09|1994-07-25|1994-06-24|TAKE BACK RETURN|REG AIR|es. quickly bold frets are t +45380|1475|93|4|14|19270.58|0.05|0.08|A|F|1994-05-28|1994-07-09|1994-06-21|DELIVER IN PERSON|AIR|ully ironic theodolite +45380|1512|93|5|32|45232.32|0.00|0.06|R|F|1994-07-11|1994-07-25|1994-08-01|COLLECT COD|MAIL|, ironic requests-- pinto beans +45380|1268|69|6|16|18708.16|0.07|0.00|R|F|1994-05-03|1994-06-10|1994-05-04|NONE|TRUCK|ic requests haggle around the regular, re +45381|792|93|1|49|82946.71|0.10|0.05|N|O|1995-09-17|1995-10-08|1995-10-08|COLLECT COD|FOB|ts around the even idea +45381|978|47|2|27|50732.19|0.10|0.00|N|O|1995-12-13|1995-11-19|1996-01-10|TAKE BACK RETURN|AIR|n, regular packages abou +45381|1762|47|3|44|73205.44|0.03|0.01|N|O|1995-08-30|1995-10-09|1995-09-26|TAKE BACK RETURN|SHIP|thely unusual theodolites use slyly careful +45381|1011|47|4|10|9120.10|0.02|0.08|N|O|1995-09-04|1995-10-06|1995-09-21|DELIVER IN PERSON|MAIL|es wake blithely carefully even +45381|488|89|5|12|16661.76|0.04|0.03|N|O|1995-10-26|1995-09-21|1995-11-20|DELIVER IN PERSON|RAIL|express platelets. regular, ironic acco +45382|922|91|1|42|76562.64|0.00|0.06|N|O|1996-02-09|1996-04-18|1996-02-10|NONE|SHIP|ly requests. furiously final requests w +45382|764|97|2|26|43283.76|0.06|0.03|N|O|1996-03-24|1996-04-20|1996-04-05|COLLECT COD|REG AIR|s sleep furiously after the carefull +45382|981|16|3|31|58341.38|0.02|0.08|N|O|1996-01-30|1996-04-15|1996-02-07|COLLECT COD|MAIL|o beans breach +45382|917|18|4|32|58173.12|0.02|0.07|N|O|1996-01-30|1996-04-20|1996-02-02|NONE|TRUCK|oss the fluffily even +45382|1265|40|5|23|26823.98|0.01|0.07|N|O|1996-05-01|1996-04-18|1996-05-15|TAKE BACK RETURN|RAIL|cies engage blithely above the regular, u +45382|1876|6|6|48|85337.76|0.01|0.03|N|O|1996-02-04|1996-03-03|1996-02-09|NONE|SHIP|thely. final, special foxes are blith +45382|1729|30|7|27|44029.44|0.03|0.03|N|O|1996-05-06|1996-03-29|1996-06-01|NONE|SHIP|ously even hockey players are among the b +45383|475|76|1|47|64647.09|0.00|0.07|N|O|1997-11-03|1997-09-13|1997-11-19|COLLECT COD|FOB|phins sleep. c +45383|1996|97|2|43|81613.57|0.04|0.08|N|O|1997-10-03|1997-08-29|1997-10-29|COLLECT COD|TRUCK| close foxes. final ideas above +45408|728|93|1|22|35831.84|0.09|0.02|A|F|1994-04-23|1994-03-13|1994-05-12|NONE|REG AIR|metimes enticing accounts wa +45408|558|89|2|40|58342.00|0.00|0.05|R|F|1994-01-04|1994-02-05|1994-01-26|COLLECT COD|AIR|ronic deposits wake carefully carefully f +45408|31|57|3|4|3724.12|0.05|0.04|A|F|1994-04-05|1994-03-11|1994-04-24|NONE|REG AIR|he slyly bold accounts sleep evenly depos +45409|1182|91|1|25|27079.50|0.04|0.03|A|F|1993-05-24|1993-06-26|1993-05-29|TAKE BACK RETURN|RAIL| slyly reg +45409|28|79|2|15|13920.30|0.09|0.04|R|F|1993-05-27|1993-05-16|1993-06-17|DELIVER IN PERSON|RAIL|fily bold theodolites wake. final, eve +45409|1466|6|3|44|60168.24|0.09|0.08|A|F|1993-06-11|1993-05-18|1993-07-06|TAKE BACK RETURN|REG AIR|fts. carefully special packages again +45409|1367|68|4|28|35514.08|0.04|0.02|A|F|1993-06-27|1993-06-22|1993-07-04|DELIVER IN PERSON|REG AIR|ic waters cajole carefully. pi +45409|1563|4|5|23|33684.88|0.02|0.04|R|F|1993-07-05|1993-05-13|1993-08-02|NONE|FOB|sits breach final deposits: slyly fin +45409|1582|63|6|49|72695.42|0.10|0.01|R|F|1993-06-12|1993-06-05|1993-07-06|TAKE BACK RETURN|AIR|ns. dependencies boost a +45410|1113|14|1|33|33465.63|0.00|0.01|R|F|1994-11-08|1994-10-16|1994-12-07|COLLECT COD|SHIP|to mold: slyly blithe +45410|1356|71|2|37|46521.95|0.02|0.00|R|F|1994-12-15|1994-10-04|1994-12-31|DELIVER IN PERSON|SHIP|silent, even instr +45410|1131|32|3|42|43349.46|0.02|0.06|R|F|1994-12-17|1994-10-23|1994-12-23|COLLECT COD|TRUCK|maintain slyly. accounts sleep +45411|442|30|1|15|20136.60|0.03|0.06|N|O|1995-09-22|1995-09-07|1995-10-22|TAKE BACK RETURN|FOB|beans. quickl +45411|1780|23|2|24|40362.72|0.09|0.04|N|O|1995-08-28|1995-09-03|1995-08-31|COLLECT COD|RAIL|ffix furiously along the fluffily fluff +45412|1041|77|1|9|8478.36|0.06|0.01|R|F|1993-08-06|1993-07-21|1993-08-29|NONE|SHIP|y. dogged, ironic requests b +45412|1581|82|2|34|50407.72|0.09|0.02|R|F|1993-05-19|1993-07-16|1993-06-17|COLLECT COD|FOB|ccounts alongside of the regular pinto be +45412|412|13|3|17|22310.97|0.10|0.07|A|F|1993-08-08|1993-07-16|1993-08-29|COLLECT COD|SHIP|e slyly special deposi +45412|1864|65|4|45|79463.70|0.00|0.05|R|F|1993-05-23|1993-06-10|1993-06-21|NONE|RAIL|ickly unusual deposits. qu +45412|769|2|5|46|76808.96|0.10|0.08|A|F|1993-08-08|1993-06-29|1993-08-19|NONE|FOB|requests. quickly ironic grouches are quick +45412|365|50|6|42|53145.12|0.09|0.05|A|F|1993-07-05|1993-05-28|1993-08-03|COLLECT COD|TRUCK|ckages are. blithely special +45412|683|46|7|1|1583.68|0.03|0.06|A|F|1993-05-07|1993-06-23|1993-06-05|COLLECT COD|MAIL|lithely da +45413|668|69|1|7|10980.62|0.10|0.03|R|F|1993-08-14|1993-09-06|1993-08-28|TAKE BACK RETURN|TRUCK| blithely alongside +45413|1588|29|2|25|37239.50|0.08|0.06|R|F|1993-08-17|1993-07-26|1993-09-13|NONE|AIR|ending instructio +45413|529|20|3|44|62898.88|0.03|0.07|A|F|1993-07-05|1993-08-18|1993-07-11|TAKE BACK RETURN|REG AIR|ages. pending depe +45413|511|12|4|17|23995.67|0.10|0.03|A|F|1993-08-26|1993-08-06|1993-09-19|COLLECT COD|RAIL|. slyly ironic +45413|512|3|5|15|21187.65|0.05|0.06|R|F|1993-07-01|1993-08-24|1993-07-17|COLLECT COD|TRUCK|ly even accounts snooze. fu +45413|1837|24|6|44|76508.52|0.07|0.06|R|F|1993-08-03|1993-08-19|1993-08-05|DELIVER IN PERSON|AIR|t the fluffily regular platelets. careful +45413|132|11|7|46|47477.98|0.07|0.05|R|F|1993-08-02|1993-08-23|1993-08-27|TAKE BACK RETURN|AIR|yly silent deposits boost busily +45414|1659|1|1|41|63986.65|0.02|0.05|R|F|1994-03-30|1994-03-29|1994-04-12|NONE|REG AIR|e foxes. car +45414|757|90|2|43|71283.25|0.03|0.01|R|F|1994-05-18|1994-03-18|1994-05-31|TAKE BACK RETURN|SHIP|yly even theodolite +45415|1869|13|1|20|35417.20|0.00|0.00|R|F|1992-06-13|1992-05-20|1992-06-26|COLLECT COD|REG AIR|ven ideas upon the carefully +45440|752|85|1|44|72721.00|0.05|0.04|A|F|1992-11-05|1992-09-14|1992-11-14|NONE|TRUCK|ronic platelets. regular accoun +45440|868|35|2|36|63678.96|0.08|0.01|A|F|1992-11-03|1992-10-26|1992-11-16|NONE|SHIP|osits nod despite the regular +45440|1713|56|3|46|74276.66|0.02|0.05|R|F|1992-09-29|1992-11-03|1992-10-24|TAKE BACK RETURN|MAIL|ounts affix slyly alongside o +45440|221|3|4|33|37000.26|0.02|0.03|R|F|1992-09-30|1992-10-15|1992-10-29|NONE|FOB|thely ironic depos +45440|1588|9|5|45|67031.10|0.05|0.04|R|F|1992-11-18|1992-10-28|1992-11-29|DELIVER IN PERSON|FOB|uests. regular theodolites +45440|10|61|6|47|42770.47|0.06|0.07|R|F|1992-11-14|1992-09-21|1992-12-14|COLLECT COD|FOB|alongside of the regular, special i +45440|1211|23|7|13|14458.73|0.00|0.08|R|F|1992-10-26|1992-11-07|1992-11-19|DELIVER IN PERSON|REG AIR|he asymptotes. regular instructio +45441|1760|45|1|17|28249.92|0.01|0.06|N|O|1998-01-07|1997-11-21|1998-01-12|DELIVER IN PERSON|AIR| foxes. quickly pending acc +45441|1814|15|2|30|51474.30|0.08|0.02|N|O|1997-12-04|1997-11-28|1997-12-19|NONE|SHIP|s pinto beans nag across the quickly ev +45441|897|98|3|33|59330.37|0.09|0.06|N|O|1997-10-17|1997-11-19|1997-10-22|TAKE BACK RETURN|SHIP|reach around the pending, unu +45442|622|23|1|12|18271.44|0.06|0.02|A|F|1995-05-31|1995-03-21|1995-06-16|NONE|SHIP|refully in place o +45442|211|66|2|20|22224.20|0.09|0.02|N|F|1995-06-03|1995-03-22|1995-06-18|COLLECT COD|RAIL|ly across t +45442|858|92|3|8|14070.80|0.04|0.00|R|F|1995-04-14|1995-04-01|1995-04-25|TAKE BACK RETURN|SHIP| deposits sleep furiously flu +45442|908|9|4|6|10853.40|0.06|0.07|R|F|1995-04-08|1995-04-01|1995-04-20|NONE|TRUCK|the packages. carefully pending accou +45443|381|66|1|40|51255.20|0.08|0.02|N|O|1996-04-16|1996-06-01|1996-04-22|NONE|SHIP|hould have to are +45443|1583|64|2|44|65321.52|0.08|0.01|N|O|1996-04-28|1996-05-03|1996-05-07|NONE|FOB|es. even deposits shal +45444|1915|60|1|29|52690.39|0.02|0.03|A|F|1992-11-12|1992-12-23|1992-11-16|NONE|FOB|yly express packages. +45444|1195|32|2|41|44943.79|0.06|0.03|R|F|1992-11-14|1992-12-26|1992-12-13|DELIVER IN PERSON|TRUCK|. deposits sleep quickly around the eve +45444|1513|14|3|10|14145.10|0.05|0.05|A|F|1992-12-29|1993-01-24|1993-01-08|DELIVER IN PERSON|SHIP|s sleep after th +45445|1197|34|1|30|32945.70|0.07|0.05|N|O|1996-07-22|1996-05-31|1996-08-15|TAKE BACK RETURN|AIR|eposits boost blithely. regu +45446|676|39|1|40|63066.80|0.01|0.08|N|O|1997-10-18|1997-09-21|1997-11-01|TAKE BACK RETURN|REG AIR| requests boost carefully against +45446|1080|81|2|44|43167.52|0.07|0.06|N|O|1997-08-10|1997-09-19|1997-08-24|NONE|RAIL| bold pinto beans. accounts sleep blithe +45446|1542|43|3|4|5774.16|0.07|0.01|N|O|1997-07-27|1997-09-29|1997-08-15|NONE|REG AIR|ges. regular packages nag carefully pending +45447|1000|1|1|5|4505.00|0.03|0.00|R|F|1992-04-12|1992-04-19|1992-04-25|COLLECT COD|SHIP| fluffily regular, ironic acco +45447|427|57|2|24|31858.08|0.06|0.05|R|F|1992-03-01|1992-04-09|1992-03-13|DELIVER IN PERSON|TRUCK|eodolites wake slyly against t +45447|636|68|3|47|72221.61|0.05|0.06|A|F|1992-05-07|1992-04-01|1992-05-28|DELIVER IN PERSON|FOB|y final deposits wa +45447|1585|66|4|19|28245.02|0.07|0.06|A|F|1992-03-15|1992-03-11|1992-04-11|DELIVER IN PERSON|AIR|the quickly regular requests sle +45447|943|12|5|17|31346.98|0.05|0.05|R|F|1992-05-06|1992-04-22|1992-05-17|DELIVER IN PERSON|SHIP|pains subl +45447|1767|52|6|29|48394.04|0.06|0.02|A|F|1992-04-10|1992-03-09|1992-04-24|NONE|MAIL|iers wake regularly. bli +45472|1572|13|1|32|47154.24|0.04|0.01|N|O|1996-09-07|1996-11-01|1996-09-23|NONE|FOB|ies along the silent excuses are qui +45472|284|66|2|50|59214.00|0.07|0.08|N|O|1996-08-26|1996-10-11|1996-09-25|TAKE BACK RETURN|SHIP|its. slyly ironi +45473|763|64|1|39|64886.64|0.06|0.02|N|O|1995-08-18|1995-10-27|1995-09-02|COLLECT COD|REG AIR|s about the deposits sleep sly +45473|750|83|2|49|80886.75|0.02|0.00|N|O|1995-10-23|1995-10-18|1995-11-10|TAKE BACK RETURN|MAIL|ly final excuses sh +45473|549|80|3|19|27541.26|0.06|0.05|N|O|1995-10-25|1995-10-04|1995-10-28|DELIVER IN PERSON|FOB|le furiously q +45473|1216|28|4|40|44688.40|0.03|0.02|N|O|1995-10-06|1995-10-06|1995-11-01|DELIVER IN PERSON|RAIL|, bold ideas slee +45474|1477|95|1|28|38597.16|0.03|0.01|N|O|1996-06-18|1996-05-02|1996-07-07|TAKE BACK RETURN|SHIP|ajole carefully. spe +45474|1052|23|2|8|7624.40|0.05|0.06|N|O|1996-03-16|1996-03-28|1996-03-29|TAKE BACK RETURN|TRUCK|ets according to t +45475|1670|53|1|19|29861.73|0.03|0.04|A|F|1993-06-16|1993-08-03|1993-07-11|TAKE BACK RETURN|SHIP|ever unusual cour +45476|57|33|1|40|38282.00|0.00|0.03|A|F|1992-07-18|1992-05-22|1992-07-29|NONE|MAIL|ully silent packag +45476|569|70|2|17|24982.52|0.10|0.08|R|F|1992-04-21|1992-06-15|1992-05-21|COLLECT COD|FOB|nto beans wake slyly quickly fina +45476|1908|53|3|25|45247.50|0.09|0.07|A|F|1992-07-08|1992-07-17|1992-07-12|TAKE BACK RETURN|SHIP|sleep regular request +45476|1754|39|4|28|46361.00|0.03|0.03|R|F|1992-06-05|1992-05-30|1992-06-15|NONE|REG AIR|gular deposits. quickly final p +45476|1093|99|5|6|5964.54|0.09|0.04|R|F|1992-05-08|1992-05-27|1992-05-30|TAKE BACK RETURN|AIR|packages. un +45476|1979|24|6|27|50786.19|0.05|0.06|R|F|1992-07-08|1992-07-11|1992-07-30|DELIVER IN PERSON|SHIP|al foxes. furiously slow packages wake ag +45477|733|30|1|26|42476.98|0.05|0.02|N|O|1996-04-27|1996-03-29|1996-05-14|TAKE BACK RETURN|TRUCK| carefully along the requests +45477|381|66|2|42|53817.96|0.07|0.04|N|O|1996-05-11|1996-03-08|1996-06-04|TAKE BACK RETURN|REG AIR|ar, ironic requests cajole daringly around +45477|1793|78|3|11|18642.69|0.02|0.07|N|O|1996-03-06|1996-04-07|1996-03-23|TAKE BACK RETURN|SHIP|eas. slyly regular sheaves can affix +45477|1754|97|4|9|14901.75|0.01|0.00|N|O|1996-02-03|1996-03-04|1996-02-22|NONE|TRUCK|bold requests maintain. carefull +45477|1503|84|5|18|25281.00|0.05|0.03|N|O|1996-02-18|1996-03-11|1996-03-03|NONE|FOB|r foxes doubt carefully express +45478|564|95|1|20|29291.20|0.04|0.07|N|O|1996-12-16|1996-10-17|1997-01-13|COLLECT COD|FOB|ar, regular excuses doubt blithel +45478|1952|85|2|23|42640.85|0.05|0.06|N|O|1996-10-21|1996-10-12|1996-10-24|NONE|REG AIR|sts unwind carefully blithely fina +45478|1200|9|3|4|4404.80|0.01|0.00|N|O|1996-12-24|1996-12-08|1997-01-21|NONE|AIR|y express asymptotes dete +45478|1378|17|4|49|62689.13|0.09|0.03|N|O|1996-11-02|1996-12-06|1996-11-19|COLLECT COD|MAIL|stealthily: blithely special instructions +45479|1617|18|1|32|48595.52|0.00|0.04|N|O|1998-07-27|1998-06-26|1998-07-29|DELIVER IN PERSON|REG AIR|unts. blithely ironic deposits boost ca +45504|1966|55|1|7|13075.72|0.07|0.01|R|F|1992-12-08|1992-10-12|1993-01-02|DELIVER IN PERSON|AIR| the theodolites. even accounts hag +45504|1122|95|2|10|10231.20|0.01|0.03|R|F|1992-10-10|1992-10-20|1992-10-18|TAKE BACK RETURN|RAIL|y ironic theodolites about the fu +45504|1402|81|3|45|58653.00|0.08|0.01|A|F|1992-11-25|1992-10-30|1992-12-05|TAKE BACK RETURN|MAIL|es x-ray even, regular requests. fu +45504|1403|43|4|14|18261.60|0.05|0.00|R|F|1993-01-05|1992-11-19|1993-01-24|DELIVER IN PERSON|AIR|ggle furious +45504|1940|41|5|32|58942.08|0.10|0.00|R|F|1992-11-03|1992-11-09|1992-11-22|COLLECT COD|FOB|even asymptotes are furiou +45504|1780|7|6|9|15136.02|0.08|0.00|A|F|1992-11-27|1992-11-12|1992-12-22|NONE|REG AIR|ly unusual +45505|1059|30|1|7|6720.35|0.05|0.05|N|O|1998-07-19|1998-05-05|1998-07-23|COLLECT COD|TRUCK|final theodoli +45506|37|13|1|36|33733.08|0.06|0.02|N|O|1995-12-29|1996-02-25|1996-01-21|TAKE BACK RETURN|REG AIR| gifts nag closely expres +45506|1183|84|2|3|3252.54|0.00|0.06|N|O|1996-02-09|1996-03-13|1996-02-24|NONE|REG AIR|courts across t +45506|211|12|3|19|21112.99|0.05|0.03|N|O|1996-01-27|1996-02-11|1996-02-18|DELIVER IN PERSON|SHIP|rets are. carefully quiet deposit +45506|1054|25|4|13|12415.65|0.03|0.03|N|O|1996-01-02|1996-01-27|1996-01-10|TAKE BACK RETURN|RAIL|ironic, special dependencies. unusual r +45506|364|93|5|17|21494.12|0.06|0.02|N|O|1996-04-04|1996-02-16|1996-04-17|TAKE BACK RETURN|FOB|ording to the bold dep +45507|1762|47|1|34|56567.84|0.06|0.00|N|O|1997-06-10|1997-05-25|1997-07-07|TAKE BACK RETURN|REG AIR|idle dependencies nag slyly regular +45507|953|56|2|4|7415.80|0.00|0.00|N|O|1997-06-11|1997-06-24|1997-07-09|TAKE BACK RETURN|SHIP|y packages +45507|1664|88|3|14|21919.24|0.00|0.07|N|O|1997-07-27|1997-05-08|1997-07-29|TAKE BACK RETURN|AIR|permanently final asymptotes after t +45507|355|40|4|18|22596.30|0.08|0.01|N|O|1997-06-25|1997-06-26|1997-07-03|DELIVER IN PERSON|TRUCK|olites unwind furiously across the f +45507|1788|89|5|2|3379.56|0.03|0.05|N|O|1997-05-29|1997-06-27|1997-06-06|DELIVER IN PERSON|SHIP|! quickly silent +45507|442|43|6|19|25506.36|0.06|0.01|N|O|1997-06-11|1997-05-06|1997-06-25|COLLECT COD|RAIL|nts. express +45507|1406|85|7|8|10459.20|0.05|0.07|N|O|1997-07-25|1997-05-18|1997-08-21|DELIVER IN PERSON|FOB|ithely after the ruthlessl +45508|96|47|1|23|22910.07|0.08|0.06|N|O|1997-12-07|1997-12-12|1997-12-20|DELIVER IN PERSON|MAIL|posits along the c +45509|1745|46|1|33|54342.42|0.00|0.08|R|F|1993-03-05|1993-03-23|1993-03-14|TAKE BACK RETURN|FOB| blithely bold instructions. blith +45509|321|6|2|21|25647.72|0.05|0.08|R|F|1993-02-16|1993-03-20|1993-03-01|DELIVER IN PERSON|FOB|thely ironic de +45510|1012|83|1|47|42911.47|0.00|0.04|N|O|1997-02-20|1997-03-02|1997-03-05|COLLECT COD|RAIL| theodolites mold never silent asymptotes: +45510|50|51|2|37|35151.85|0.08|0.08|N|O|1997-01-13|1997-03-13|1997-01-26|NONE|TRUCK|azzle fluffily after +45510|1102|3|3|19|19058.90|0.09|0.06|N|O|1996-12-15|1997-02-23|1996-12-31|TAKE BACK RETURN|RAIL|y ironic packages belie +45510|1164|65|4|33|35150.28|0.04|0.03|N|O|1997-04-11|1997-01-20|1997-05-01|COLLECT COD|SHIP|ze quickly final deposits. carefully unus +45510|457|45|5|44|59727.80|0.04|0.07|N|O|1997-03-28|1997-02-16|1997-04-02|DELIVER IN PERSON|FOB|sits x-ray c +45510|1962|7|6|48|89470.08|0.10|0.06|N|O|1997-03-16|1997-01-30|1997-03-27|DELIVER IN PERSON|RAIL|daringly special requests +45510|605|68|7|39|58718.40|0.06|0.02|N|O|1997-02-11|1997-02-06|1997-03-01|NONE|RAIL|nic packages: slyly iro +45511|1494|95|1|33|46051.17|0.02|0.07|A|F|1993-10-24|1993-11-07|1993-10-30|NONE|TRUCK|s asymptotes +45511|1064|70|2|36|34742.16|0.07|0.00|A|F|1993-11-04|1993-10-12|1993-11-12|NONE|RAIL|o unwind above the slyly even depo +45511|984|19|3|31|58434.38|0.03|0.08|R|F|1993-12-09|1993-10-30|1993-12-20|NONE|SHIP|even, expr +45536|949|18|1|28|51798.32|0.00|0.00|A|F|1992-04-13|1992-04-15|1992-04-22|NONE|REG AIR|ic pinto beans. bold, regular pac +45536|31|82|2|4|3724.12|0.08|0.02|A|F|1992-03-03|1992-04-13|1992-03-29|NONE|MAIL|urts. bold requests use carefully b +45537|173|52|1|3|3219.51|0.08|0.02|N|O|1997-12-06|1998-02-01|1997-12-15|DELIVER IN PERSON|SHIP|ar foxes detect carefully. slyly regular +45537|910|45|2|25|45272.75|0.04|0.08|N|O|1997-11-27|1998-01-04|1997-12-05|NONE|REG AIR|ly regular fox +45537|429|30|3|12|15953.04|0.06|0.06|N|O|1998-01-21|1998-01-03|1998-02-07|COLLECT COD|RAIL| regular theodolites. even deposits ha +45537|1508|9|4|17|23961.50|0.08|0.02|N|O|1998-02-28|1998-01-04|1998-03-22|COLLECT COD|TRUCK|counts. regular +45537|811|11|5|33|56489.73|0.10|0.03|N|O|1998-02-24|1998-02-22|1998-03-09|NONE|TRUCK|e express somas are regular instructions +45537|188|15|6|1|1088.18|0.05|0.05|N|O|1998-03-05|1998-01-20|1998-04-01|TAKE BACK RETURN|RAIL|fully up the furiously even accounts. sl +45538|1263|1|1|11|12806.86|0.02|0.01|N|O|1997-10-24|1997-09-25|1997-11-08|COLLECT COD|SHIP|ngside of t +45538|1616|99|2|36|54633.96|0.08|0.04|N|O|1997-08-22|1997-10-18|1997-09-10|DELIVER IN PERSON|RAIL|sual instructions. ironi +45538|1486|87|3|8|11099.84|0.01|0.02|N|O|1997-11-17|1997-11-05|1997-12-07|NONE|FOB|ckly unusual theodolites. re +45538|92|43|4|15|14881.35|0.07|0.06|N|O|1997-09-04|1997-09-18|1997-09-23|COLLECT COD|TRUCK|ts. instructions cajole carefully ironic p +45538|1383|22|5|48|61650.24|0.06|0.07|N|O|1997-11-25|1997-10-03|1997-12-02|COLLECT COD|RAIL|s. carefully even packages believe furio +45538|1028|34|6|3|2787.06|0.07|0.08|N|O|1997-10-25|1997-10-21|1997-11-13|DELIVER IN PERSON|AIR|quickly ironic fox +45538|531|62|7|47|67281.91|0.07|0.02|N|O|1997-11-21|1997-11-02|1997-12-04|DELIVER IN PERSON|SHIP|nag carefully furious +45539|1631|55|1|48|73566.24|0.09|0.05|A|F|1994-09-24|1994-10-28|1994-09-27|DELIVER IN PERSON|SHIP| permanent accounts wake furious +45539|1731|58|2|49|80003.77|0.01|0.01|R|F|1994-10-23|1994-09-15|1994-11-15|TAKE BACK RETURN|TRUCK|. quickly final waters sleep fluffily s +45539|1664|47|3|37|57929.42|0.10|0.02|A|F|1994-08-05|1994-10-09|1994-08-15|TAKE BACK RETURN|AIR|uests boost blithely. furi +45539|1305|82|4|31|37395.30|0.09|0.06|A|F|1994-08-29|1994-09-24|1994-09-13|TAKE BACK RETURN|MAIL|ges. slyly regular theodolites play fluffi +45539|314|15|5|13|15786.03|0.06|0.06|A|F|1994-09-21|1994-09-06|1994-10-02|NONE|SHIP|old, final requests +45539|933|36|6|25|45848.25|0.00|0.03|A|F|1994-09-20|1994-10-25|1994-10-06|COLLECT COD|REG AIR|e around the even packages. +45540|1987|88|1|6|11333.88|0.03|0.08|N|O|1996-07-17|1996-05-20|1996-08-16|NONE|SHIP|y. blithely express packages boost furiou +45541|1640|82|1|29|44707.56|0.00|0.02|N|O|1998-07-18|1998-06-24|1998-07-30|TAKE BACK RETURN|AIR|ages. ironic, ironic +45541|301|58|2|2|2402.60|0.08|0.04|N|O|1998-04-28|1998-07-02|1998-05-15|DELIVER IN PERSON|MAIL|ter the pending platelets haggle care +45541|209|64|3|16|17747.20|0.03|0.06|N|O|1998-06-17|1998-06-04|1998-07-07|TAKE BACK RETURN|FOB|ide of the quiet +45541|384|69|4|7|8990.66|0.05|0.07|N|O|1998-05-05|1998-07-20|1998-05-28|NONE|MAIL|g deposits boost carefu +45541|562|53|5|2|2925.12|0.08|0.01|N|O|1998-06-12|1998-06-17|1998-06-26|TAKE BACK RETURN|SHIP|s, even requests. +45541|1782|9|6|8|13470.24|0.00|0.01|N|O|1998-06-05|1998-06-02|1998-06-13|DELIVER IN PERSON|MAIL|s. carefully eve +45541|577|68|7|40|59102.80|0.00|0.08|N|O|1998-05-04|1998-06-14|1998-05-21|TAKE BACK RETURN|REG AIR|quests detect. ironic p +45542|180|7|1|23|24844.14|0.02|0.06|R|F|1993-02-20|1993-04-24|1993-03-01|NONE|RAIL|ironic accounts use furiousl +45542|714|15|2|8|12917.68|0.02|0.01|R|F|1993-03-05|1993-04-10|1993-03-28|DELIVER IN PERSON|RAIL|ly daring packages nag sly +45542|1473|91|3|1|1374.47|0.02|0.00|A|F|1993-05-30|1993-04-25|1993-06-20|TAKE BACK RETURN|REG AIR|ic packages. regular excuses sle +45542|1181|82|4|23|24890.14|0.01|0.04|A|F|1993-04-02|1993-03-11|1993-04-18|DELIVER IN PERSON|FOB|unusual pinto beans ab +45542|1229|41|5|29|32776.38|0.09|0.03|R|F|1993-05-27|1993-05-04|1993-06-06|TAKE BACK RETURN|SHIP|. regular requests cajole blithel +45542|691|54|6|7|11141.83|0.08|0.04|A|F|1993-03-10|1993-04-20|1993-04-03|NONE|TRUCK|ons. fluffily bol +45542|1420|38|7|49|64749.58|0.01|0.03|A|F|1993-03-15|1993-04-25|1993-04-01|NONE|MAIL|cial frays. furio +45543|71|72|1|38|36900.66|0.10|0.05|R|F|1995-03-07|1995-03-08|1995-04-06|TAKE BACK RETURN|RAIL|ests sleep fluffily. regular +45543|1879|9|2|47|83700.89|0.06|0.08|A|F|1995-05-17|1995-04-29|1995-06-14|NONE|SHIP|inal instructions? carefully +45543|1598|19|3|49|73479.91|0.06|0.06|A|F|1995-05-21|1995-04-30|1995-06-02|DELIVER IN PERSON|REG AIR|ymptotes boost slyly. pending re +45568|363|20|1|21|26530.56|0.03|0.07|N|O|1998-07-02|1998-05-16|1998-07-24|COLLECT COD|FOB|ites use blithel +45568|495|96|2|23|32096.27|0.10|0.08|N|O|1998-05-30|1998-06-20|1998-06-23|TAKE BACK RETURN|REG AIR|s. quickly even instructions snooz +45568|547|38|3|13|18818.02|0.01|0.03|N|O|1998-05-13|1998-05-17|1998-05-24|TAKE BACK RETURN|FOB|al accounts! quickly silent instruct +45568|1192|1|4|22|24050.18|0.03|0.05|N|O|1998-04-06|1998-06-03|1998-04-25|NONE|SHIP|odolites. quickly regular ide +45568|598|89|5|38|56946.42|0.09|0.04|N|O|1998-07-16|1998-06-03|1998-07-28|COLLECT COD|REG AIR|as cajole slyly pending package +45568|354|39|6|50|62717.50|0.05|0.08|N|O|1998-05-19|1998-05-17|1998-06-12|TAKE BACK RETURN|MAIL|arefully fin +45569|1168|41|1|25|26729.00|0.07|0.01|N|O|1997-05-19|1997-06-18|1997-06-07|DELIVER IN PERSON|MAIL|ironic theodolites. special, unusual packa +45569|1664|47|2|30|46969.80|0.01|0.01|N|O|1997-07-30|1997-07-05|1997-08-03|COLLECT COD|MAIL| about the quickly unusual a +45569|463|22|3|21|28632.66|0.02|0.00|N|O|1997-06-04|1997-06-13|1997-06-21|DELIVER IN PERSON|RAIL|final foxes. even escapa +45570|564|95|1|10|14645.60|0.04|0.02|A|F|1993-11-19|1993-10-29|1993-11-22|TAKE BACK RETURN|MAIL|instructions nag doggedly bold, ironic +45570|685|48|2|31|49156.08|0.05|0.02|R|F|1993-11-24|1993-10-19|1993-12-12|COLLECT COD|MAIL|yly final requests. +45570|1020|56|3|30|27630.60|0.07|0.04|R|F|1993-10-05|1993-10-12|1993-10-07|TAKE BACK RETURN|RAIL|he furiously i +45570|1714|41|4|29|46855.59|0.02|0.02|R|F|1993-09-12|1993-10-30|1993-09-19|DELIVER IN PERSON|RAIL|pecial foxes. carefully final requests i +45571|63|89|1|34|32744.04|0.02|0.08|R|F|1992-10-12|1992-12-02|1992-10-21|DELIVER IN PERSON|MAIL| ironic foxes across the express i +45571|833|34|2|34|58950.22|0.08|0.07|A|F|1993-01-10|1992-11-13|1993-01-13|DELIVER IN PERSON|TRUCK|odolites boost furiously. bold ideas a +45571|623|55|3|36|54850.32|0.02|0.00|A|F|1993-01-21|1992-11-02|1993-02-07|COLLECT COD|AIR|ate furiously against the fluffily ironic +45571|302|31|4|23|27652.90|0.05|0.08|R|F|1992-10-02|1992-11-06|1992-10-30|TAKE BACK RETURN|TRUCK|y ironic forges sleep quickly! even, pendi +45571|576|37|5|35|51679.95|0.10|0.06|R|F|1992-11-29|1992-12-01|1992-12-13|COLLECT COD|FOB|en pinto beans use quickly along +45571|625|19|6|16|24409.92|0.03|0.08|R|F|1992-12-23|1992-12-10|1992-12-25|DELIVER IN PERSON|MAIL|ckages integrate bravely blithely regu +45572|292|74|1|31|36960.99|0.03|0.05|N|O|1996-08-12|1996-07-09|1996-09-10|TAKE BACK RETURN|REG AIR|sits haggle s +45572|1521|42|2|43|61168.36|0.07|0.08|N|O|1996-07-03|1996-07-17|1996-07-04|COLLECT COD|FOB|ly about the accounts-- furiously special t +45572|1643|44|3|40|61785.60|0.08|0.01|N|O|1996-08-10|1996-07-25|1996-09-06|DELIVER IN PERSON|SHIP|st. quickly pend +45572|1426|44|4|10|13274.20|0.04|0.07|N|O|1996-07-18|1996-07-12|1996-08-07|COLLECT COD|SHIP|finally. blithely unusual ideas a +45572|816|17|5|22|37769.82|0.08|0.06|N|O|1996-06-23|1996-08-25|1996-07-06|DELIVER IN PERSON|MAIL|ular ideas; blithely specia +45572|1299|37|6|32|38409.28|0.08|0.05|N|O|1996-07-04|1996-07-18|1996-07-31|TAKE BACK RETURN|SHIP|ions boost quickly silent requests. somet +45573|780|45|1|16|26892.48|0.03|0.02|R|F|1994-10-27|1994-10-23|1994-11-13|NONE|RAIL| bold foxes. +45574|1190|63|1|27|29462.13|0.07|0.00|N|O|1996-12-04|1996-12-16|1996-12-08|TAKE BACK RETURN|MAIL|egular dependencies. quickly final +45575|710|11|1|23|37046.33|0.00|0.04|A|F|1992-04-14|1992-05-31|1992-05-10|NONE|TRUCK|, unusual foxes integrate +45575|1646|47|2|48|74286.72|0.07|0.05|A|F|1992-07-15|1992-07-04|1992-08-01|NONE|AIR| cajole carefull +45575|33|34|3|43|40120.29|0.04|0.00|R|F|1992-06-03|1992-07-09|1992-07-01|COLLECT COD|REG AIR|press platelets wake slyly along the blith +45575|849|49|4|27|47245.68|0.05|0.06|R|F|1992-05-29|1992-05-19|1992-06-08|DELIVER IN PERSON|MAIL|packages run final instructions. care +45600|500|59|1|49|68624.50|0.05|0.07|R|F|1992-10-22|1992-09-25|1992-10-29|NONE|REG AIR|as. furiously unusual id +45601|1467|7|1|47|64317.62|0.06|0.08|N|O|1995-11-06|1995-11-22|1995-11-10|COLLECT COD|REG AIR|uctions wake according t +45601|1357|58|2|43|54109.05|0.08|0.06|N|O|1995-11-18|1995-12-25|1995-12-11|DELIVER IN PERSON|REG AIR|the fluffily iron +45601|1591|92|3|18|26866.62|0.04|0.02|N|O|1995-11-12|1995-11-20|1995-12-11|TAKE BACK RETURN|TRUCK|foxes poach. ironic ideas among the +45601|875|76|4|16|28413.92|0.03|0.08|N|O|1995-12-29|1995-11-12|1996-01-08|NONE|TRUCK|l are. quickly fi +45602|1995|28|1|36|68291.64|0.08|0.00|N|O|1996-12-07|1996-12-07|1996-12-16|COLLECT COD|SHIP|its; deposits +45602|1717|2|2|18|29136.78|0.05|0.03|N|O|1997-02-16|1997-01-19|1997-03-02|NONE|AIR|deas haggle blithely acco +45602|460|90|3|14|19046.44|0.01|0.01|N|O|1997-02-20|1996-12-29|1997-02-21|DELIVER IN PERSON|AIR|fter the quickly regular acc +45602|57|58|4|23|22012.15|0.02|0.05|N|O|1996-11-04|1997-01-10|1996-11-16|DELIVER IN PERSON|MAIL|iously regular exc +45602|1105|78|5|17|17103.70|0.01|0.01|N|O|1997-01-20|1996-12-18|1997-02-09|NONE|RAIL|ickly express ac +45602|361|62|6|12|15136.32|0.08|0.05|N|O|1996-12-28|1997-01-05|1997-01-17|NONE|REG AIR|ar ideas wake caref +45602|58|9|7|41|39280.05|0.04|0.08|N|O|1996-12-02|1996-12-05|1996-12-17|TAKE BACK RETURN|AIR|s cajole pinto bea +45603|413|43|1|31|40715.71|0.02|0.01|N|O|1996-11-30|1996-11-03|1996-12-26|DELIVER IN PERSON|RAIL|ckages. even instructions boost. quickl +45603|1612|95|2|8|12108.88|0.06|0.02|N|O|1996-09-13|1996-10-03|1996-09-27|COLLECT COD|FOB|ges sleep sometimes. regular theodolites a +45603|698|30|3|24|38368.56|0.08|0.03|N|O|1996-09-20|1996-11-02|1996-10-14|COLLECT COD|SHIP|lithely bold requests +45603|694|57|4|35|55814.15|0.09|0.06|N|O|1996-12-09|1996-10-02|1997-01-05|COLLECT COD|AIR|ts use quickly +45604|448|7|1|29|39104.76|0.01|0.07|A|F|1993-06-13|1993-04-28|1993-07-04|DELIVER IN PERSON|AIR|ons haggle slyly about the regula +45604|703|68|2|10|16037.00|0.04|0.08|R|F|1993-05-09|1993-04-16|1993-05-18|COLLECT COD|REG AIR|jole slyly. furiously i +45605|1268|43|1|35|40924.10|0.02|0.05|A|F|1993-06-23|1993-05-17|1993-07-02|TAKE BACK RETURN|MAIL|inos. final accounts try to +45605|1381|96|2|15|19235.70|0.01|0.03|R|F|1993-06-29|1993-05-19|1993-07-12|NONE|TRUCK| thrash slyly. even deposits against the +45605|1967|100|3|38|71020.48|0.09|0.03|A|F|1993-05-21|1993-06-28|1993-06-03|DELIVER IN PERSON|FOB|kages believe blithely according +45605|432|20|4|26|34643.18|0.03|0.08|R|F|1993-06-08|1993-07-01|1993-07-06|DELIVER IN PERSON|RAIL|pecial ideas slee +45606|1686|28|1|9|14289.12|0.05|0.02|N|O|1996-01-03|1995-10-27|1996-01-22|COLLECT COD|REG AIR|ely express multipliers. regular d +45606|847|48|2|4|6991.36|0.07|0.01|N|O|1995-09-25|1995-11-13|1995-10-24|NONE|RAIL|ts play special platelets. p +45606|1334|73|3|18|22235.94|0.10|0.02|N|O|1995-10-06|1995-12-12|1995-10-18|DELIVER IN PERSON|MAIL|al instructions cajole against the blit +45606|635|67|4|18|27641.34|0.10|0.06|N|O|1995-11-23|1995-11-27|1995-12-02|NONE|MAIL|uests. packages atop the +45606|225|53|5|30|33756.60|0.09|0.00|N|O|1995-12-14|1995-11-19|1996-01-11|DELIVER IN PERSON|RAIL|along the foxes. furiously i +45606|1593|94|6|10|14945.90|0.05|0.02|N|O|1995-09-24|1995-11-21|1995-10-16|TAKE BACK RETURN|REG AIR|arefully silent requests are. slyl +45607|495|83|1|5|6977.45|0.03|0.00|N|O|1998-02-10|1998-02-02|1998-03-02|DELIVER IN PERSON|AIR| the final requests. pending, iron +45607|949|50|2|22|40698.68|0.07|0.06|N|O|1998-02-25|1998-01-27|1998-03-01|COLLECT COD|RAIL|arefully unusual foxe +45607|1020|91|3|22|20262.44|0.04|0.03|N|O|1997-12-29|1998-02-03|1998-01-19|TAKE BACK RETURN|FOB|aringly even re +45607|1144|17|4|16|16722.24|0.02|0.06|N|O|1998-01-01|1998-01-10|1998-01-15|NONE|FOB|ar packages dazzle +45632|237|38|1|38|43214.74|0.09|0.01|R|F|1993-09-06|1993-07-31|1993-09-16|DELIVER IN PERSON|SHIP|. blithely unusual accounts cajole quickly +45632|199|52|2|18|19785.42|0.02|0.08|A|F|1993-08-11|1993-07-07|1993-08-18|COLLECT COD|REG AIR|gular reques +45632|1077|83|3|46|44991.22|0.07|0.00|A|F|1993-07-25|1993-07-15|1993-08-10|COLLECT COD|REG AIR|furiously iro +45632|1772|73|4|5|8368.85|0.05|0.07|R|F|1993-06-06|1993-06-15|1993-07-03|DELIVER IN PERSON|TRUCK|al hockey players. blithely reg +45632|278|6|5|47|55378.69|0.10|0.02|A|F|1993-06-07|1993-07-19|1993-06-30|COLLECT COD|SHIP|ronic sheaves cajole +45632|1609|51|6|32|48339.20|0.03|0.08|A|F|1993-05-25|1993-08-09|1993-06-11|TAKE BACK RETURN|TRUCK|blithely final requests boo +45632|1921|66|7|33|60156.36|0.05|0.03|R|F|1993-05-19|1993-06-11|1993-06-17|DELIVER IN PERSON|RAIL|old, ironic platelets. ev +45633|916|19|1|12|21802.92|0.08|0.04|N|O|1997-04-21|1997-04-16|1997-04-30|TAKE BACK RETURN|AIR|ng requests. quickly pending accoun +45633|840|74|2|42|73115.28|0.01|0.03|N|O|1997-02-22|1997-03-14|1997-02-27|DELIVER IN PERSON|RAIL|le. furiously special accounts haggle befo +45633|93|44|3|49|48661.41|0.05|0.05|N|O|1997-02-17|1997-04-23|1997-02-23|COLLECT COD|AIR|er the carefully special packages +45633|518|79|4|12|17022.12|0.09|0.05|N|O|1997-05-12|1997-03-05|1997-05-29|TAKE BACK RETURN|TRUCK|uffily even ideas cajole quic +45633|214|42|5|27|30083.67|0.00|0.04|N|O|1997-03-10|1997-04-26|1997-03-27|COLLECT COD|TRUCK|regular dep +45634|313|98|1|22|26692.82|0.06|0.00|N|O|1997-09-11|1997-10-07|1997-09-30|DELIVER IN PERSON|SHIP|lithely around +45635|726|91|1|9|14640.48|0.02|0.07|R|F|1992-06-06|1992-07-07|1992-07-03|COLLECT COD|REG AIR|sly above the deposits. quickly +45635|783|80|2|11|18521.58|0.08|0.06|A|F|1992-04-30|1992-06-22|1992-05-10|TAKE BACK RETURN|MAIL|es affix sly foxes. ideas caj +45636|622|23|1|40|60904.80|0.10|0.08|N|O|1996-12-02|1996-12-09|1996-12-11|TAKE BACK RETURN|REG AIR|besides the silent Tiresias cajole across t +45636|205|33|2|2|2210.40|0.07|0.06|N|O|1996-10-24|1996-12-23|1996-10-25|DELIVER IN PERSON|SHIP|ts haggle sly +45637|550|11|1|8|11604.40|0.09|0.05|A|F|1994-07-04|1994-04-26|1994-07-06|TAKE BACK RETURN|MAIL|ously after t +45637|1069|75|2|37|35892.22|0.02|0.06|A|F|1994-06-27|1994-05-31|1994-07-04|NONE|FOB|ve the requests. special, final excuses thr +45638|1363|64|1|22|27815.92|0.01|0.00|N|O|1997-11-15|1997-10-31|1997-12-15|NONE|TRUCK|ithely furiously regular +45638|1766|9|2|50|83388.00|0.02|0.06|N|O|1997-09-02|1997-10-18|1997-09-23|COLLECT COD|AIR|efully regular pinto beans use express wa +45638|1093|64|3|40|39763.60|0.09|0.03|N|O|1997-09-01|1997-11-18|1997-09-16|NONE|REG AIR| nod slyly sp +45638|497|98|4|24|33539.76|0.10|0.04|N|O|1997-09-04|1997-11-21|1997-09-23|COLLECT COD|REG AIR| regular packages sleep. caref +45638|1886|73|5|22|39333.36|0.06|0.04|N|O|1997-09-03|1997-10-21|1997-09-15|TAKE BACK RETURN|AIR|osits wake slyly ironic pinto bean +45638|172|25|6|47|50391.99|0.01|0.02|N|O|1997-12-09|1997-10-15|1997-12-31|DELIVER IN PERSON|FOB|ut the blithel +45638|317|2|7|47|57213.57|0.01|0.00|N|O|1997-11-20|1997-11-06|1997-12-04|DELIVER IN PERSON|MAIL|lly pending requests. express deposi +45639|39|90|1|45|42256.35|0.03|0.00|N|O|1996-07-30|1996-07-26|1996-08-23|DELIVER IN PERSON|AIR|ages wake carefully afte +45639|380|37|2|5|6401.90|0.03|0.04|N|O|1996-08-02|1996-07-06|1996-08-06|COLLECT COD|FOB|etect furious +45664|528|89|1|39|55712.28|0.06|0.07|R|F|1992-07-28|1992-08-24|1992-08-16|DELIVER IN PERSON|REG AIR|c packages hang furious +45664|1284|96|2|43|50967.04|0.06|0.01|R|F|1992-09-14|1992-08-11|1992-10-08|COLLECT COD|MAIL|ges wake permanently a +45664|1384|99|3|6|7712.28|0.10|0.00|A|F|1992-08-24|1992-07-25|1992-09-03|NONE|TRUCK|ate among the slyly idle pa +45664|1638|80|4|9|13856.67|0.08|0.01|A|F|1992-08-08|1992-08-21|1992-09-04|COLLECT COD|SHIP|s packages beyond the ironicall +45665|1584|85|1|38|56452.04|0.06|0.07|N|O|1997-05-21|1997-07-24|1997-06-16|NONE|TRUCK|courts! quickly +45665|1027|28|2|22|20416.44|0.04|0.07|N|O|1997-07-12|1997-07-18|1997-07-13|TAKE BACK RETURN|MAIL|ost. blithely final pack +45665|414|15|3|41|53890.81|0.02|0.07|N|O|1997-06-19|1997-06-20|1997-07-17|NONE|REG AIR| ironic requests nag alongside of +45665|1823|67|4|33|56919.06|0.08|0.00|N|O|1997-08-28|1997-06-27|1997-09-03|COLLECT COD|SHIP|ithely final packages integrate. ir +45665|183|62|5|46|49826.28|0.07|0.06|N|O|1997-07-02|1997-07-21|1997-07-19|NONE|AIR|requests. pending excuses against the care +45666|1165|2|1|21|22389.36|0.05|0.02|N|O|1997-05-11|1997-04-16|1997-06-09|TAKE BACK RETURN|MAIL|g the platelets. carefu +45666|443|44|2|45|60454.80|0.08|0.08|N|O|1997-05-13|1997-04-09|1997-05-25|TAKE BACK RETURN|RAIL| the furiously unusual theodoli +45666|268|96|3|20|23365.20|0.03|0.06|N|O|1997-06-14|1997-03-18|1997-06-21|DELIVER IN PERSON|FOB|s. busily final deposits are quickly. n +45666|752|53|4|43|71068.25|0.07|0.08|N|O|1997-05-18|1997-05-15|1997-06-12|COLLECT COD|REG AIR| ideas. bold requests sleep sile +45667|1446|47|1|22|29643.68|0.10|0.07|N|O|1996-08-18|1996-06-15|1996-09-01|TAKE BACK RETURN|TRUCK|dolites are slyly after th +45667|1862|92|2|1|1763.86|0.07|0.04|N|O|1996-05-29|1996-06-14|1996-06-13|NONE|FOB|brave accounts sleep always abou +45667|1236|37|3|4|4548.92|0.05|0.03|N|O|1996-07-31|1996-07-22|1996-08-03|DELIVER IN PERSON|RAIL|xpress accounts above +45667|541|72|4|35|50453.90|0.10|0.04|N|O|1996-08-09|1996-07-04|1996-08-28|NONE|SHIP|yly final +45667|908|11|5|29|52458.10|0.00|0.00|N|O|1996-05-10|1996-05-27|1996-06-06|COLLECT COD|MAIL|into beans. silent accounts sleep s +45667|1990|91|6|8|15135.92|0.09|0.03|N|O|1996-06-21|1996-07-18|1996-07-21|COLLECT COD|AIR|ual, ironic +45667|1731|58|7|6|9796.38|0.09|0.02|N|O|1996-06-04|1996-06-05|1996-07-03|NONE|MAIL|egular frets nag. express, bold packages bo +45668|528|59|1|48|68568.96|0.09|0.07|R|F|1994-02-26|1994-01-31|1994-03-07|TAKE BACK RETURN|FOB|furiously. carefull +45668|57|83|2|39|37324.95|0.04|0.03|A|F|1994-01-26|1994-02-15|1994-02-14|NONE|RAIL| carefully silent pl +45668|1355|70|3|19|23870.65|0.06|0.03|R|F|1994-03-02|1994-03-10|1994-03-31|NONE|TRUCK|ccounts. furiously sp +45668|442|1|4|44|59067.36|0.02|0.06|A|F|1994-01-08|1994-02-10|1994-02-05|TAKE BACK RETURN|FOB|althily ironic instruction +45668|1451|91|5|1|1352.45|0.01|0.00|R|F|1994-03-22|1994-03-04|1994-04-03|COLLECT COD|MAIL|the fluffily regular in +45668|251|33|6|24|27630.00|0.08|0.03|A|F|1994-03-22|1994-02-28|1994-04-15|NONE|FOB|e blithely according +45669|200|1|1|5|5501.00|0.03|0.01|N|O|1995-07-05|1995-09-15|1995-07-28|NONE|SHIP|ccounts lose carefully in pl +45669|49|100|2|2|1898.08|0.08|0.00|N|O|1995-08-11|1995-08-13|1995-09-02|NONE|MAIL|s. regular, ex +45669|1300|1|3|5|6006.50|0.05|0.00|N|O|1995-08-16|1995-08-08|1995-08-31|DELIVER IN PERSON|RAIL|blithely b +45669|1441|59|4|19|25506.36|0.04|0.03|N|O|1995-07-18|1995-09-09|1995-07-20|NONE|SHIP|sts are even, final requests. deposits sle +45669|1855|99|5|49|86085.65|0.06|0.06|N|O|1995-08-08|1995-07-31|1995-08-19|COLLECT COD|AIR|o beans cajo +45669|1909|42|6|26|47083.40|0.02|0.05|N|O|1995-07-14|1995-08-21|1995-08-11|NONE|REG AIR| maintain furiously across the +45670|1799|42|1|33|56126.07|0.00|0.08|R|F|1992-09-23|1992-09-18|1992-10-19|TAKE BACK RETURN|SHIP|he even packages are quickly sile +45670|1665|7|2|40|62666.40|0.03|0.00|R|F|1992-08-23|1992-11-04|1992-08-26|NONE|REG AIR|slyly silen +45670|145|24|3|27|28218.78|0.10|0.02|R|F|1992-09-29|1992-09-22|1992-10-29|NONE|AIR|uriously e +45670|1935|68|4|44|80824.92|0.00|0.03|A|F|1992-10-30|1992-09-17|1992-11-04|TAKE BACK RETURN|MAIL|y unusual frets. regular, special acc +45670|568|69|5|48|70490.88|0.06|0.02|A|F|1992-08-30|1992-10-10|1992-09-28|TAKE BACK RETURN|SHIP|eep above the slyly unusual accounts +45670|1580|81|6|48|71115.84|0.05|0.08|R|F|1992-12-04|1992-10-04|1992-12-11|NONE|SHIP|ajole sometimes blithely final pinto bea +45670|337|22|7|21|25983.93|0.04|0.06|A|F|1992-11-04|1992-09-17|1992-11-12|DELIVER IN PERSON|SHIP|attainments. regular, fi +45671|445|46|1|37|49781.28|0.08|0.04|N|O|1995-07-09|1995-09-11|1995-07-13|TAKE BACK RETURN|RAIL|luffily regul +45671|671|65|2|8|12573.36|0.01|0.01|N|O|1995-09-02|1995-08-06|1995-09-12|TAKE BACK RETURN|FOB|enly final pinto beans affix abov +45671|1952|53|3|1|1853.95|0.08|0.04|N|O|1995-06-25|1995-09-10|1995-06-29|NONE|AIR|xes. caref +45671|1312|89|4|2|2426.62|0.07|0.04|N|O|1995-07-14|1995-07-18|1995-07-20|TAKE BACK RETURN|MAIL|nts; careful +45696|752|49|1|49|80984.75|0.09|0.04|N|O|1997-03-01|1997-02-17|1997-03-31|TAKE BACK RETURN|FOB|ts are carefully. final, unu +45696|760|61|2|7|11625.32|0.01|0.07|N|O|1997-03-31|1997-02-17|1997-04-08|TAKE BACK RETURN|REG AIR|at the flu +45696|650|82|3|33|51171.45|0.08|0.04|N|O|1997-04-08|1997-02-10|1997-04-14|TAKE BACK RETURN|FOB|c instructions believe slyly +45696|289|71|4|31|36867.68|0.02|0.05|N|O|1997-01-16|1997-03-10|1997-01-22|TAKE BACK RETURN|RAIL|slyly express accounts +45696|1795|80|5|36|61084.44|0.06|0.05|N|O|1997-02-25|1997-03-16|1997-03-19|COLLECT COD|TRUCK|d foxes. pinto beans serve. i +45696|363|20|6|40|50534.40|0.06|0.08|N|O|1997-01-16|1997-02-23|1997-02-15|TAKE BACK RETURN|REG AIR|iously pend +45697|1886|16|1|29|51848.52|0.10|0.08|R|F|1992-04-06|1992-02-05|1992-04-19|COLLECT COD|REG AIR|instructions ki +45697|1977|66|2|39|73279.83|0.00|0.03|A|F|1992-03-16|1992-02-04|1992-03-22|TAKE BACK RETURN|AIR|efully according to the furiously expr +45697|1096|32|3|29|28915.61|0.07|0.08|A|F|1992-01-19|1992-02-22|1992-01-23|TAKE BACK RETURN|RAIL|uses cajole. +45697|724|21|4|48|77986.56|0.02|0.06|A|F|1992-02-11|1992-03-13|1992-02-15|COLLECT COD|SHIP|ickly bold theodolites +45697|1983|28|5|21|39584.58|0.05|0.08|R|F|1992-04-24|1992-03-16|1992-05-24|COLLECT COD|AIR|sly even pinto beans +45697|872|73|6|36|63823.32|0.02|0.05|A|F|1992-04-10|1992-03-25|1992-04-22|NONE|TRUCK|even accounts sleep bol +45697|1915|16|7|31|56324.21|0.05|0.01|R|F|1992-02-11|1992-02-11|1992-03-09|TAKE BACK RETURN|SHIP|ironic, ironic platelets +45698|1043|14|1|9|8496.36|0.06|0.00|A|F|1992-05-13|1992-06-01|1992-06-07|TAKE BACK RETURN|TRUCK|etect alongside of +45698|1692|34|2|6|9562.14|0.02|0.06|A|F|1992-07-15|1992-07-22|1992-08-10|TAKE BACK RETURN|SHIP|lyly final instructions. accounts +45698|1580|81|3|27|40002.66|0.10|0.04|A|F|1992-07-01|1992-06-20|1992-07-05|TAKE BACK RETURN|RAIL| deposits. theodolit +45699|1229|41|1|1|1130.22|0.10|0.03|N|O|1997-10-10|1997-10-31|1997-10-31|TAKE BACK RETURN|AIR|dolites wake. quick account +45699|505|66|2|21|29515.50|0.00|0.02|N|O|1997-10-15|1997-11-22|1997-10-20|NONE|AIR|t across the furiously ev +45700|679|80|1|38|60027.46|0.10|0.01|R|F|1993-01-03|1993-01-01|1993-01-07|NONE|REG AIR|g packages are ideas. fi +45700|580|71|2|28|41456.24|0.03|0.01|A|F|1993-01-11|1992-12-15|1993-01-30|DELIVER IN PERSON|MAIL| carefully among the ca +45700|1266|67|3|43|50192.18|0.01|0.08|R|F|1993-03-01|1993-01-26|1993-03-21|NONE|SHIP|nal packages w +45700|919|88|4|50|90995.50|0.01|0.04|A|F|1993-02-25|1992-12-18|1993-03-17|TAKE BACK RETURN|TRUCK|ccounts cajole furiou +45700|169|70|5|16|17106.56|0.09|0.08|A|F|1993-02-09|1993-01-19|1993-03-04|COLLECT COD|TRUCK|en, regular exc +45700|1447|65|6|34|45846.96|0.07|0.00|A|F|1992-12-10|1993-02-09|1992-12-22|DELIVER IN PERSON|SHIP|even foxes cajo +45701|961|96|1|21|39101.16|0.02|0.02|N|O|1997-07-04|1997-06-15|1997-07-16|DELIVER IN PERSON|AIR| poach slyly. fu +45701|516|7|2|36|50994.36|0.05|0.08|N|O|1997-08-16|1997-07-10|1997-08-21|COLLECT COD|FOB|s. slyly even deposits after th +45701|720|21|3|31|50242.32|0.10|0.03|N|O|1997-07-11|1997-07-20|1997-07-13|COLLECT COD|FOB|inal deposits eat carefully. f +45702|1726|11|1|19|30926.68|0.02|0.03|N|O|1995-08-18|1995-09-09|1995-08-23|COLLECT COD|SHIP|uests wake busily furiously +45702|249|50|2|50|57462.00|0.07|0.07|N|O|1995-11-14|1995-10-30|1995-12-07|TAKE BACK RETURN|RAIL| requests +45702|685|48|3|9|14271.12|0.03|0.06|N|O|1995-10-02|1995-10-04|1995-10-06|DELIVER IN PERSON|RAIL|ns. special accounts use +45703|1784|11|1|28|47201.84|0.02|0.05|N|O|1996-09-07|1996-08-14|1996-09-22|DELIVER IN PERSON|RAIL|. slyly bold instructions alongs +45703|1839|83|2|14|24371.62|0.02|0.03|N|O|1996-08-29|1996-07-05|1996-09-03|NONE|REG AIR|theodolites. ironic deposits haggle fu +45703|277|5|3|35|41204.45|0.06|0.02|N|O|1996-07-06|1996-07-12|1996-07-31|COLLECT COD|AIR|arefully express platelet +45728|1442|60|1|3|4030.32|0.00|0.00|A|F|1993-09-09|1993-07-25|1993-09-16|COLLECT COD|RAIL| furiously regular deposits. request +45728|1533|14|2|37|53077.61|0.09|0.05|R|F|1993-08-05|1993-08-21|1993-08-10|COLLECT COD|REG AIR|thely regular foxes haggle +45728|1819|49|3|18|30974.58|0.10|0.04|A|F|1993-09-24|1993-08-20|1993-09-26|NONE|AIR|ccounts sleep. quickly ironic excuses sle +45728|473|61|4|49|67300.03|0.10|0.03|R|F|1993-08-05|1993-08-04|1993-09-02|NONE|FOB|dencies. slyly +45728|364|49|5|4|5057.44|0.03|0.04|A|F|1993-09-02|1993-09-16|1993-09-17|DELIVER IN PERSON|SHIP|s haggle furiously ironic instruc +45729|706|7|1|24|38560.80|0.04|0.07|N|O|1998-05-18|1998-07-11|1998-06-14|COLLECT COD|RAIL|ly. quickly pen +45729|1629|12|2|22|33673.64|0.08|0.00|N|O|1998-05-22|1998-06-02|1998-05-25|TAKE BACK RETURN|REG AIR|nto beans cajole thinly about the +45729|1075|81|3|5|4880.35|0.00|0.00|N|O|1998-07-20|1998-05-27|1998-07-28|NONE|FOB| regular acc +45729|1422|40|4|42|55583.64|0.09|0.05|N|O|1998-06-09|1998-06-25|1998-06-27|TAKE BACK RETURN|TRUCK|ests. quiet, +45729|1715|100|5|14|22633.94|0.03|0.03|N|O|1998-06-22|1998-07-06|1998-06-26|DELIVER IN PERSON|TRUCK|the requests n +45729|383|40|6|3|3850.14|0.05|0.03|N|O|1998-05-20|1998-06-01|1998-05-26|COLLECT COD|RAIL| deposits affix +45729|1244|19|7|22|25195.28|0.08|0.07|N|O|1998-07-31|1998-06-25|1998-08-24|DELIVER IN PERSON|REG AIR|. even deposi +45730|708|73|1|33|53087.10|0.06|0.07|N|O|1998-03-28|1998-01-25|1998-04-07|TAKE BACK RETURN|REG AIR|arefully special pinto +45730|285|86|2|2|2370.56|0.00|0.01|N|O|1998-02-04|1998-02-17|1998-02-10|TAKE BACK RETURN|MAIL|leep carefully-- blithely bold de +45730|1555|96|3|12|17478.60|0.08|0.01|N|O|1998-02-11|1998-02-11|1998-03-01|COLLECT COD|TRUCK|eposits sleep quickly slyly express de +45731|973|74|1|46|86202.62|0.03|0.04|A|F|1994-10-21|1994-10-20|1994-11-10|NONE|FOB|gular pinto beans nag +45731|1137|10|2|32|33220.16|0.10|0.00|A|F|1994-11-15|1994-10-21|1994-11-17|NONE|REG AIR|use furiously carefully +45731|1970|15|3|45|84238.65|0.04|0.08|R|F|1994-10-31|1994-10-06|1994-11-26|COLLECT COD|SHIP| alongside of the pending, +45731|961|62|4|39|72616.44|0.10|0.04|A|F|1994-09-24|1994-10-22|1994-10-11|TAKE BACK RETURN|SHIP|above the slyly +45731|1913|58|5|47|85300.77|0.07|0.02|A|F|1994-10-18|1994-11-01|1994-11-01|COLLECT COD|SHIP|ously unusual theod +45732|1735|36|1|29|47465.17|0.04|0.00|R|F|1994-05-02|1994-04-19|1994-05-07|COLLECT COD|SHIP|es. fluffily ironic accounts print carefu +45732|603|97|2|49|73676.40|0.08|0.04|R|F|1994-03-09|1994-05-03|1994-04-06|TAKE BACK RETURN|MAIL|uld cajole be +45733|1379|18|1|27|34569.99|0.02|0.07|R|F|1994-01-16|1994-02-28|1994-02-11|TAKE BACK RETURN|TRUCK|leep slyly. sentim +45733|851|51|2|48|84088.80|0.00|0.02|R|F|1994-03-11|1994-01-07|1994-03-30|DELIVER IN PERSON|RAIL|oward the carefully even ideas +45733|868|35|3|46|81367.56|0.08|0.06|A|F|1994-04-05|1994-03-01|1994-04-30|NONE|AIR|unusual accounts wake carefully slyly t +45733|1391|30|4|41|52987.99|0.10|0.04|A|F|1994-01-11|1994-01-23|1994-01-20|TAKE BACK RETURN|FOB| along the silently ironic sentiments. furi +45734|1936|25|1|44|80868.92|0.10|0.07|A|F|1992-09-16|1992-09-07|1992-09-22|TAKE BACK RETURN|FOB|sly decoys. blithely stealthy fo +45734|1603|27|2|48|72220.80|0.02|0.06|R|F|1992-11-02|1992-09-28|1992-11-12|COLLECT COD|FOB|eyond the slyly silent packages. requests +45735|129|8|1|24|24698.88|0.06|0.08|N|O|1997-06-04|1997-06-10|1997-06-28|COLLECT COD|AIR|ts. deposits +45735|1580|21|2|23|34076.34|0.06|0.08|N|O|1997-06-17|1997-05-28|1997-07-09|NONE|AIR|y carefully express +45735|1782|25|3|26|43778.28|0.08|0.02|N|O|1997-07-21|1997-06-04|1997-08-13|TAKE BACK RETURN|REG AIR|usual packages kindle blit +45760|1051|87|1|10|9520.50|0.02|0.08|A|F|1993-08-21|1993-09-22|1993-08-22|DELIVER IN PERSON|REG AIR|ly regular deposits. slyly permanent re +45760|101|2|2|36|36039.60|0.01|0.01|A|F|1993-09-22|1993-09-29|1993-10-06|TAKE BACK RETURN|TRUCK|inal excuse +45760|755|20|3|4|6623.00|0.00|0.00|R|F|1993-11-10|1993-09-15|1993-11-20|TAKE BACK RETURN|AIR|lets. final, regular +45760|1735|78|4|36|58922.28|0.00|0.00|A|F|1993-10-22|1993-10-01|1993-11-13|TAKE BACK RETURN|SHIP|ependencies after the regular packages ar +45760|4|80|5|44|39776.00|0.04|0.08|A|F|1993-11-19|1993-09-21|1993-11-23|DELIVER IN PERSON|TRUCK|n foxes boost bravely regul +45761|55|6|1|50|47752.50|0.09|0.07|A|F|1992-09-03|1992-08-05|1992-09-25|TAKE BACK RETURN|RAIL|s hinder fluffily. quickly final i +45762|589|50|1|21|31281.18|0.03|0.07|A|F|1993-10-30|1993-09-07|1993-11-02|COLLECT COD|TRUCK|ts sleep express dolphins. unusual, fin +45762|1070|71|2|47|45640.29|0.05|0.04|A|F|1993-08-18|1993-10-03|1993-09-07|COLLECT COD|REG AIR|. foxes maint +45762|83|9|3|44|43255.52|0.06|0.02|A|F|1993-09-08|1993-08-27|1993-09-21|TAKE BACK RETURN|FOB|ds boost blithely along th +45762|158|11|4|35|37035.25|0.02|0.02|R|F|1993-07-26|1993-09-05|1993-08-07|NONE|AIR| sleep sometimes. carefully ironic court +45763|1034|5|1|3|2805.09|0.00|0.01|R|F|1993-09-24|1993-09-16|1993-10-23|TAKE BACK RETURN|FOB|s. dependencies along the quickly +45764|1314|91|1|10|12153.10|0.07|0.03|N|O|1996-09-02|1996-09-23|1996-09-03|DELIVER IN PERSON|MAIL|ar pinto beans. blithely ironic depen +45764|1923|56|2|31|56572.52|0.05|0.07|N|O|1996-12-05|1996-11-21|1996-12-16|TAKE BACK RETURN|FOB| the carefully ironic accounts. re +45764|1865|52|3|40|70674.40|0.06|0.03|N|O|1996-10-29|1996-11-07|1996-10-30|NONE|RAIL|s haggle b +45764|237|19|4|15|17058.45|0.03|0.03|N|O|1996-10-26|1996-11-21|1996-11-21|NONE|REG AIR| final ideas. decoys acros +45765|647|41|1|37|57262.68|0.10|0.05|A|F|1994-01-24|1993-11-21|1994-01-25|COLLECT COD|MAIL|ithely silent asymptotes integrate +45765|811|11|2|6|10270.86|0.05|0.04|R|F|1993-12-31|1993-11-28|1994-01-14|NONE|AIR|s sleep quickly even, reg +45765|1169|6|3|16|17122.56|0.02|0.03|R|F|1993-10-19|1994-01-09|1993-11-16|DELIVER IN PERSON|MAIL|cial instructions wake silent +45766|1566|67|1|1|1467.56|0.09|0.07|A|F|1993-07-31|1993-07-29|1993-08-24|TAKE BACK RETURN|MAIL|ages around +45766|1935|80|2|35|64292.55|0.09|0.05|R|F|1993-08-17|1993-06-15|1993-08-30|NONE|AIR|ts across the blithely final +45766|378|63|3|22|28124.14|0.07|0.03|A|F|1993-07-02|1993-06-24|1993-07-27|TAKE BACK RETURN|TRUCK|ss the quickly final d +45766|762|95|4|29|48220.04|0.03|0.02|R|F|1993-06-12|1993-06-13|1993-06-15|COLLECT COD|MAIL|eve stealthily. +45766|38|14|5|3|2814.09|0.09|0.04|R|F|1993-06-29|1993-07-06|1993-07-25|NONE|REG AIR|wake fluffily carefu +45766|709|42|6|40|64388.00|0.06|0.01|R|F|1993-06-02|1993-07-12|1993-06-12|COLLECT COD|SHIP|p carefully. slyly regul +45767|1807|8|1|24|41011.20|0.09|0.06|A|F|1992-10-05|1992-09-06|1992-10-19|TAKE BACK RETURN|MAIL|express theodolites cajole blithely a +45767|1635|36|2|1|1536.63|0.02|0.01|A|F|1992-09-22|1992-08-27|1992-10-05|DELIVER IN PERSON|FOB|special notornis will integrate. regu +45767|998|99|3|41|77858.59|0.10|0.03|R|F|1992-08-24|1992-10-09|1992-09-12|COLLECT COD|REG AIR|kages cajole. ruthlessly even depos +45792|1070|6|1|49|47582.43|0.07|0.04|N|O|1997-02-25|1997-01-19|1997-03-16|DELIVER IN PERSON|SHIP|nal theodolites use car +45792|1449|28|2|47|63470.68|0.06|0.00|N|O|1996-12-01|1997-02-09|1996-12-05|TAKE BACK RETURN|MAIL|? pending, final pinto beans +45792|1895|96|3|16|28750.24|0.04|0.08|N|O|1996-11-19|1997-01-17|1996-12-18|NONE|FOB|ncies. furiously expr +45792|1777|20|4|17|28539.09|0.07|0.07|N|O|1996-12-01|1997-01-04|1996-12-02|NONE|AIR|ronic requests around t +45792|992|27|5|40|75719.60|0.04|0.01|N|O|1996-12-21|1997-01-02|1997-01-01|TAKE BACK RETURN|REG AIR|es nag slyly final +45792|758|23|6|41|68008.75|0.05|0.00|N|O|1997-01-27|1996-12-30|1997-02-26|NONE|FOB|xes sleep quickly. slyly pending +45793|501|92|1|39|54658.50|0.07|0.07|N|O|1996-11-06|1996-11-20|1996-11-15|TAKE BACK RETURN|REG AIR|ing to the slyly pending packages-- ir +45793|117|18|2|47|47804.17|0.01|0.05|N|O|1996-12-17|1996-11-01|1997-01-09|DELIVER IN PERSON|SHIP| use furiously about the dogged, un +45794|1188|25|1|38|41388.84|0.03|0.06|N|O|1995-10-19|1995-11-21|1995-11-01|COLLECT COD|SHIP|l deposits. asymptote +45794|855|22|2|26|45652.10|0.00|0.02|N|O|1996-01-11|1995-10-27|1996-01-12|NONE|TRUCK|ly ironic dependencies. +45794|1336|37|3|23|28458.59|0.02|0.00|N|O|1996-01-11|1995-10-31|1996-01-13|TAKE BACK RETURN|FOB|ackages according to the quickly exp +45794|254|9|4|6|6925.50|0.02|0.02|N|O|1995-11-18|1995-11-20|1995-12-08|TAKE BACK RETURN|SHIP|en accounts could cajol +45794|1942|87|5|45|82977.30|0.05|0.05|N|O|1995-11-30|1995-11-02|1995-12-02|TAKE BACK RETURN|FOB|ges. theodolites boost slyly above the ide +45794|1139|12|6|10|10401.30|0.07|0.03|N|O|1995-09-27|1995-10-28|1995-09-29|DELIVER IN PERSON|AIR|heodolites use special instructions: furiou +45794|684|78|7|29|45955.72|0.05|0.06|N|O|1995-11-11|1995-11-13|1995-11-15|TAKE BACK RETURN|MAIL|bold pinto +45795|396|97|1|32|41484.48|0.08|0.04|N|O|1998-01-31|1998-03-04|1998-02-21|DELIVER IN PERSON|REG AIR|ages. unusual packages wake slyly +45795|1813|43|2|38|65162.78|0.03|0.04|N|O|1998-03-24|1998-04-06|1998-04-05|DELIVER IN PERSON|SHIP|pinto beans among the carefully regu +45795|1646|88|3|10|15476.40|0.00|0.05|N|O|1998-01-27|1998-02-18|1998-02-06|TAKE BACK RETURN|REG AIR|e carefully. final, express reques +45795|31|57|4|47|43758.41|0.10|0.02|N|O|1998-01-24|1998-03-12|1998-01-28|COLLECT COD|AIR| carefully final deposits. carefully reg +45796|535|66|1|30|43065.90|0.02|0.08|N|O|1996-02-21|1996-03-05|1996-02-25|COLLECT COD|SHIP|tructions haggle c +45796|845|79|2|20|34916.80|0.06|0.01|N|O|1996-03-20|1996-03-14|1996-04-11|COLLECT COD|TRUCK|l requests. slyly even +45796|680|43|3|49|77453.32|0.03|0.05|N|O|1996-02-22|1996-02-22|1996-03-02|COLLECT COD|AIR|counts are. slyly regular escapades +45796|1205|80|4|18|19911.60|0.07|0.08|N|O|1996-05-14|1996-03-24|1996-06-06|COLLECT COD|MAIL|ithe pains cajole ironic ideas. +45797|1212|13|1|45|50094.45|0.00|0.04|N|O|1997-12-21|1998-02-19|1997-12-26|COLLECT COD|TRUCK|ul requests. fluffily final pinto bea +45797|14|15|2|23|21022.23|0.03|0.07|N|O|1998-02-14|1998-01-12|1998-03-03|TAKE BACK RETURN|TRUCK|out the final, ironic requests beli +45797|770|67|3|45|75184.65|0.10|0.01|N|O|1998-01-30|1998-02-19|1998-02-16|TAKE BACK RETURN|SHIP|slyly pending packages? pac +45797|1770|13|4|29|48481.33|0.05|0.04|N|O|1998-02-05|1998-02-13|1998-02-15|TAKE BACK RETURN|RAIL|uickly across the pendin +45797|562|53|5|39|57039.84|0.03|0.05|N|O|1998-02-25|1998-01-17|1998-03-22|COLLECT COD|REG AIR| silent theo +45798|790|91|1|6|10144.74|0.06|0.06|A|F|1993-09-24|1993-09-06|1993-10-01|NONE|SHIP|lar pinto beans. exp +45799|920|89|1|10|18209.20|0.10|0.08|N|O|1995-09-05|1995-08-14|1995-09-12|NONE|SHIP|final deposits wake blithely +45799|1798|99|2|41|69691.39|0.06|0.01|N|O|1995-06-21|1995-08-14|1995-06-25|NONE|AIR|earls. regular requests wake furiously +45799|1535|36|3|15|21547.95|0.01|0.00|N|O|1995-07-16|1995-07-10|1995-08-04|NONE|MAIL|osits sleep. furiously +45799|1762|63|4|43|71541.68|0.01|0.00|N|O|1995-09-21|1995-07-12|1995-09-27|NONE|SHIP|counts. furio +45799|79|55|5|4|3916.28|0.06|0.00|N|F|1995-06-12|1995-07-21|1995-07-11|NONE|AIR|oxes. carefully unusual requests cajole +45799|75|51|6|36|35102.52|0.08|0.04|N|O|1995-09-26|1995-07-12|1995-10-10|NONE|FOB|ccounts. slowly pending deposits aff +45824|1775|2|1|33|55333.41|0.07|0.01|A|F|1994-12-14|1995-02-04|1995-01-03|NONE|RAIL|must cajol +45824|1279|54|2|1|1180.27|0.07|0.08|A|F|1995-01-05|1995-02-22|1995-01-17|COLLECT COD|REG AIR|n, even pinto beans. f +45825|1865|52|1|38|67140.68|0.06|0.08|R|F|1992-11-14|1992-12-20|1992-12-11|COLLECT COD|REG AIR|y unusual requests breach against t +45825|946|49|2|10|18469.40|0.10|0.06|A|F|1992-11-10|1992-12-29|1992-11-17|TAKE BACK RETURN|FOB|accounts lose slyly +45825|362|63|3|50|63118.00|0.06|0.02|R|F|1992-11-22|1992-11-12|1992-12-05|DELIVER IN PERSON|RAIL|ly express accoun +45825|680|74|4|2|3161.36|0.01|0.02|A|F|1992-11-21|1992-11-23|1992-11-30|COLLECT COD|FOB| instructions cajole s +45825|912|81|5|8|14503.28|0.03|0.03|A|F|1992-10-20|1992-11-21|1992-10-23|NONE|REG AIR|riously even somas use slyly +45825|126|79|6|22|22574.64|0.05|0.05|R|F|1993-01-13|1992-12-05|1993-01-31|NONE|MAIL|ns haggle against the final plat +45826|1197|6|1|22|24160.18|0.07|0.01|N|O|1997-06-16|1997-07-27|1997-07-05|TAKE BACK RETURN|RAIL|nusual pinto beans sleep carefully bol +45826|1157|58|2|25|26453.75|0.04|0.02|N|O|1997-07-09|1997-07-09|1997-07-27|COLLECT COD|SHIP|arefully fluffily pending deposits: furio +45826|1514|95|3|31|43880.81|0.01|0.04|N|O|1997-06-23|1997-08-11|1997-07-07|DELIVER IN PERSON|MAIL|en accounts along the ironic sauter +45826|616|17|4|20|30332.20|0.05|0.01|N|O|1997-07-06|1997-07-27|1997-07-11|TAKE BACK RETURN|MAIL|ular ideas are. enticingly express accoun +45827|1770|71|1|32|53496.64|0.07|0.00|R|F|1992-11-01|1992-10-03|1992-11-22|DELIVER IN PERSON|FOB|xpress packages sleep daringl +45827|911|12|2|1|1811.91|0.02|0.04|R|F|1992-10-24|1992-10-17|1992-11-06|TAKE BACK RETURN|AIR|carefully ex +45827|826|27|3|50|86341.00|0.00|0.08|A|F|1992-08-07|1992-10-12|1992-08-21|TAKE BACK RETURN|TRUCK|he furious +45827|410|40|4|19|24897.79|0.03|0.01|R|F|1992-09-13|1992-09-11|1992-09-20|TAKE BACK RETURN|SHIP|s boost accordin +45828|149|50|1|17|17835.38|0.00|0.02|N|O|1997-08-17|1997-08-27|1997-08-26|TAKE BACK RETURN|REG AIR|inal, special p +45828|436|24|2|30|40092.90|0.03|0.08|N|O|1997-08-22|1997-07-08|1997-09-14|TAKE BACK RETURN|RAIL|. dependencies wake f +45828|238|39|3|43|48943.89|0.05|0.06|N|O|1997-07-01|1997-07-16|1997-07-09|TAKE BACK RETURN|RAIL|arefully regular packages. +45828|307|92|4|16|19316.80|0.00|0.08|N|O|1997-09-28|1997-09-03|1997-10-12|TAKE BACK RETURN|SHIP|egular request +45828|381|82|5|32|41004.16|0.02|0.04|N|O|1997-09-12|1997-07-24|1997-09-16|TAKE BACK RETURN|REG AIR|ar accounts. blithely unusual instru +45829|1292|67|1|45|53698.05|0.10|0.00|N|O|1995-06-19|1995-05-07|1995-06-22|TAKE BACK RETURN|FOB|ly special +45830|285|67|1|40|47411.20|0.04|0.04|N|O|1997-10-31|1997-11-27|1997-11-24|DELIVER IN PERSON|SHIP|ructions. bold, final instructio +45830|83|59|2|29|28509.32|0.06|0.01|N|O|1997-12-04|1998-01-18|1997-12-21|DELIVER IN PERSON|RAIL|yly even platel +45830|1192|93|3|40|43727.60|0.06|0.06|N|O|1997-10-30|1998-01-05|1997-10-31|NONE|FOB|ld foxes. ideas cajole along the +45830|110|89|4|33|33333.63|0.06|0.07|N|O|1998-01-08|1997-11-22|1998-01-20|DELIVER IN PERSON|AIR|he final, fi +45830|393|50|5|32|41388.48|0.01|0.06|N|O|1997-12-26|1998-01-13|1998-01-14|NONE|RAIL|ular deposits. furiousl +45830|1708|51|6|45|72436.50|0.10|0.05|N|O|1997-11-11|1997-12-20|1997-11-17|TAKE BACK RETURN|MAIL|ithe, regular accoun +45831|1273|48|1|1|1174.27|0.10|0.06|N|O|1997-06-19|1997-05-22|1997-07-01|NONE|RAIL|nst the regular p +45831|714|11|2|34|54900.14|0.03|0.01|N|O|1997-07-04|1997-05-20|1997-08-01|COLLECT COD|SHIP|dependencies. ironic, regular packages are. +45831|411|70|3|2|2622.82|0.07|0.07|N|O|1997-07-08|1997-07-03|1997-07-16|DELIVER IN PERSON|MAIL| the blithely bold orbits haggle slyly e +45831|1189|62|4|24|26164.32|0.08|0.01|N|O|1997-04-19|1997-06-01|1997-05-02|DELIVER IN PERSON|AIR|y bold reques +45856|799|100|1|49|83289.71|0.03|0.01|N|O|1998-04-29|1998-05-15|1998-05-06|NONE|MAIL|eans along the furiously pending asympto +45856|1666|8|2|1|1567.66|0.05|0.02|N|O|1998-03-15|1998-04-11|1998-03-16|TAKE BACK RETURN|MAIL|up the express instructions. carefull +45856|1071|77|3|48|46659.36|0.08|0.00|N|O|1998-05-01|1998-03-24|1998-05-26|TAKE BACK RETURN|REG AIR|blithely bold pac +45856|376|5|4|15|19145.55|0.02|0.08|N|O|1998-05-22|1998-03-30|1998-05-28|COLLECT COD|MAIL|uriously unusual packages: +45856|1021|57|5|1|922.02|0.01|0.07|N|O|1998-05-07|1998-04-03|1998-05-20|COLLECT COD|TRUCK|sual foxes are about the ironic do +45856|611|5|6|26|39301.86|0.02|0.00|N|O|1998-03-07|1998-05-07|1998-04-03|DELIVER IN PERSON|FOB|y regular sheave +45857|479|67|1|7|9656.29|0.09|0.01|N|O|1997-09-09|1997-11-23|1997-10-09|COLLECT COD|TRUCK|sly carefully s +45857|1400|77|2|48|62467.20|0.04|0.05|N|O|1997-12-29|1997-11-16|1998-01-13|DELIVER IN PERSON|TRUCK|accounts after the +45858|1468|86|1|44|60256.24|0.05|0.02|N|O|1996-12-17|1996-12-23|1996-12-27|DELIVER IN PERSON|TRUCK|fluffily re +45859|514|15|1|42|59409.42|0.06|0.03|R|F|1994-02-08|1993-12-19|1994-02-11|DELIVER IN PERSON|REG AIR|final theodolites are theod +45859|493|94|2|22|30656.78|0.04|0.04|R|F|1993-12-02|1994-01-03|1993-12-19|NONE|REG AIR|os. ironic courts wake blithely. sly +45859|1939|28|3|39|71796.27|0.05|0.01|A|F|1994-01-16|1993-12-26|1994-01-30|COLLECT COD|SHIP|oggedly express pains are furiously b +45859|493|52|4|50|69674.50|0.07|0.04|R|F|1993-11-23|1993-12-11|1993-11-26|DELIVER IN PERSON|RAIL|grate furiously even packages-- blithel +45859|601|2|5|24|36038.40|0.04|0.05|R|F|1994-01-14|1993-12-30|1994-01-30|TAKE BACK RETURN|RAIL|lites around the slyly ironic pint +45860|850|51|1|40|70034.00|0.05|0.03|R|F|1992-11-02|1992-10-13|1992-11-20|TAKE BACK RETURN|AIR| beans-- express deposi +45860|1190|27|2|46|50194.74|0.09|0.03|A|F|1992-11-30|1992-09-26|1992-12-09|TAKE BACK RETURN|AIR| detect. bold, special foxes haggle. +45860|1484|63|3|19|26324.12|0.04|0.07|A|F|1992-12-09|1992-10-31|1992-12-11|TAKE BACK RETURN|FOB|ll run fluffily unusual r +45860|882|16|4|20|35657.60|0.06|0.06|R|F|1992-11-14|1992-11-11|1992-12-14|DELIVER IN PERSON|MAIL|ic excuses. carefull +45861|1257|69|1|19|22006.75|0.07|0.00|N|O|1995-10-04|1995-11-16|1995-10-06|COLLECT COD|SHIP| haggle furiously regular instruc +45861|285|86|2|18|21335.04|0.07|0.04|N|O|1995-08-31|1995-10-12|1995-09-26|TAKE BACK RETURN|TRUCK|ing, final theodolites w +45861|1939|28|3|34|62591.62|0.06|0.01|N|O|1995-10-25|1995-09-27|1995-11-01|NONE|TRUCK|d ideas mol +45861|878|12|4|8|14230.96|0.07|0.00|N|O|1995-10-28|1995-11-21|1995-11-03|NONE|MAIL|ding packa +45862|1557|98|1|5|7292.75|0.01|0.05|N|O|1997-07-22|1997-09-11|1997-08-11|COLLECT COD|REG AIR|ly busy requests along the ironic acco +45862|347|48|2|5|6236.70|0.00|0.04|N|O|1997-09-13|1997-08-21|1997-09-16|TAKE BACK RETURN|FOB|uriously blit +45862|9|10|3|1|909.00|0.00|0.02|N|O|1997-07-17|1997-08-19|1997-07-22|COLLECT COD|SHIP|accounts-- fluffily pending deposits a +45862|1156|29|4|9|9514.35|0.04|0.05|N|O|1997-08-20|1997-08-23|1997-09-04|NONE|SHIP|cajole carefully against the slyly re +45862|860|60|5|8|14086.88|0.07|0.04|N|O|1997-08-19|1997-08-01|1997-08-24|DELIVER IN PERSON|FOB|nic accounts. quickly p +45862|1046|52|6|4|3788.16|0.03|0.01|N|O|1997-08-09|1997-08-11|1997-08-22|COLLECT COD|AIR|posits detect carefully unusual +45863|1688|71|1|7|11127.76|0.05|0.08|R|F|1993-10-31|1993-12-01|1993-11-18|NONE|MAIL|egular courts slee +45863|1217|18|2|32|35782.72|0.06|0.02|R|F|1993-11-15|1993-11-24|1993-12-02|DELIVER IN PERSON|SHIP|ily daring courts mol +45863|1366|81|3|47|59565.92|0.00|0.07|A|F|1993-10-14|1993-11-03|1993-10-17|TAKE BACK RETURN|FOB|gular foxes wake blithely: dolphins imp +45888|736|1|1|29|47465.17|0.04|0.03|R|F|1993-07-30|1993-08-07|1993-08-28|DELIVER IN PERSON|SHIP|y pending foxes around the +45888|45|71|2|4|3780.16|0.02|0.02|A|F|1993-09-30|1993-08-17|1993-10-04|NONE|RAIL|nic ideas are fluffily. s +45889|1399|76|1|48|62418.72|0.00|0.02|N|O|1996-04-11|1996-03-06|1996-04-18|NONE|FOB|ar pinto beans. fluffily regular in +45889|1844|74|2|41|71579.44|0.06|0.05|N|O|1996-04-14|1996-04-14|1996-04-29|NONE|AIR|usly after the final requests! sl +45889|1407|86|3|22|28784.80|0.02|0.08|N|O|1996-04-30|1996-04-09|1996-05-02|DELIVER IN PERSON|REG AIR|sleep above the fluffily pending dugouts. e +45890|1876|63|1|15|26668.05|0.01|0.07|N|O|1995-12-04|1995-11-12|1995-12-05|NONE|RAIL|nstructions cajo +45891|1987|32|1|7|13222.86|0.06|0.02|R|F|1992-05-17|1992-07-06|1992-06-01|COLLECT COD|AIR|es boost furiou +45891|1287|99|2|38|45154.64|0.07|0.08|R|F|1992-06-13|1992-06-03|1992-06-20|COLLECT COD|RAIL|packages. slyly iron +45891|1648|31|3|34|52687.76|0.02|0.05|A|F|1992-07-27|1992-06-06|1992-08-26|DELIVER IN PERSON|RAIL|ost. carefull +45891|797|98|4|47|79796.13|0.05|0.02|R|F|1992-06-23|1992-05-30|1992-07-09|TAKE BACK RETURN|TRUCK|ackages wake carefull +45892|512|43|1|17|24012.67|0.08|0.07|A|F|1994-08-28|1994-07-24|1994-09-06|DELIVER IN PERSON|REG AIR|l requests. +45893|1307|46|1|38|45915.40|0.06|0.05|N|O|1995-08-03|1995-08-20|1995-08-30|COLLECT COD|RAIL|tes sleep among the dugouts. ideas nod +45893|1316|55|2|18|21911.58|0.08|0.07|N|O|1995-09-14|1995-07-11|1995-09-20|COLLECT COD|RAIL|nd the fluff +45893|476|64|3|40|55058.80|0.08|0.03|N|O|1995-07-23|1995-07-05|1995-07-30|DELIVER IN PERSON|TRUCK|y slow realms w +45893|46|97|4|7|6622.28|0.00|0.06|N|O|1995-09-07|1995-07-21|1995-09-19|DELIVER IN PERSON|REG AIR|uriously final requests. sly +45893|1292|4|5|40|47731.60|0.05|0.04|N|O|1995-07-18|1995-07-05|1995-07-27|NONE|TRUCK| run quickly unusual pinto b +45893|167|46|6|43|45887.88|0.08|0.08|N|O|1995-09-24|1995-07-12|1995-10-05|COLLECT COD|REG AIR|symptotes. quickly regula +45894|1639|81|1|27|41597.01|0.07|0.05|N|O|1996-06-26|1996-08-05|1996-07-12|NONE|REG AIR| cajole slyly stealthy accounts. +45895|1374|75|1|42|53565.54|0.10|0.00|A|F|1994-09-16|1994-07-26|1994-09-25|DELIVER IN PERSON|TRUCK|e boldly silent the +45895|1616|17|2|43|65257.23|0.04|0.01|R|F|1994-09-28|1994-09-15|1994-10-10|COLLECT COD|SHIP| quickly about the +45920|1902|47|1|38|68548.20|0.02|0.06|N|O|1996-08-22|1996-08-26|1996-08-29|TAKE BACK RETURN|TRUCK|regular, regular e +45920|500|59|2|27|37813.50|0.09|0.04|N|O|1996-08-21|1996-09-02|1996-09-03|DELIVER IN PERSON|AIR| regular pinto beans was slyly abou +45920|1780|23|3|16|26908.48|0.01|0.06|N|O|1996-07-14|1996-08-01|1996-08-06|NONE|MAIL|after the ironic d +45920|1388|65|4|38|48996.44|0.03|0.04|N|O|1996-10-08|1996-08-01|1996-10-14|COLLECT COD|REG AIR|le slyly final dolphi +45920|769|2|5|50|83488.00|0.01|0.00|N|O|1996-09-26|1996-08-12|1996-10-22|NONE|MAIL|ong the special foxes was +45921|1834|21|1|41|71169.03|0.03|0.00|N|O|1996-03-30|1996-04-02|1996-04-07|TAKE BACK RETURN|MAIL|ing to the accounts. furiously dogged theo +45921|1609|92|2|38|57402.80|0.04|0.06|N|O|1996-01-10|1996-03-02|1996-01-29|TAKE BACK RETURN|AIR|ronic theodolites against the asymp +45922|1254|66|1|45|51986.25|0.02|0.08|A|F|1994-01-13|1993-12-15|1994-01-28|COLLECT COD|AIR|. furiously express p +45922|1156|57|2|50|52857.50|0.10|0.05|R|F|1993-12-09|1993-12-28|1993-12-18|NONE|REG AIR|es. even foxes wake carefully even account +45922|707|72|3|11|17684.70|0.02|0.05|A|F|1993-11-21|1994-01-14|1993-12-06|DELIVER IN PERSON|AIR|en, ironic dolphins. slowly ironic +45922|944|79|4|35|64572.90|0.04|0.04|A|F|1993-11-07|1993-11-19|1993-11-09|TAKE BACK RETURN|MAIL|. fluffily final +45923|904|39|1|23|41512.70|0.00|0.04|N|O|1997-03-07|1997-02-20|1997-03-31|DELIVER IN PERSON|TRUCK|hins cajole slyly! furiously express +45923|1851|52|2|35|61349.75|0.07|0.02|N|O|1997-02-25|1997-03-11|1997-03-07|DELIVER IN PERSON|FOB|p furiously theodolites-- furiou +45923|692|86|3|30|47780.70|0.01|0.02|N|O|1997-02-02|1997-04-04|1997-02-22|DELIVER IN PERSON|SHIP|es haggle slyly final accounts. blit +45923|919|88|4|16|29118.56|0.10|0.04|N|O|1997-02-09|1997-03-22|1997-03-08|NONE|RAIL| cajole blithely. +45923|1158|59|5|8|8473.20|0.08|0.07|N|O|1997-04-06|1997-03-13|1997-04-21|NONE|FOB|usly express hockey players mold never +45923|1966|11|6|19|35491.24|0.04|0.07|N|O|1997-03-06|1997-03-26|1997-04-05|TAKE BACK RETURN|RAIL|latelets unwind bold packag +45924|1465|66|1|33|45093.18|0.04|0.08|A|F|1994-02-03|1994-03-06|1994-02-05|DELIVER IN PERSON|RAIL| ironic asymptotes. +45924|1033|34|2|42|39229.26|0.09|0.05|R|F|1994-01-20|1994-03-11|1994-01-24|COLLECT COD|REG AIR|ld notornis. carefully regula +45924|967|68|3|20|37359.20|0.08|0.04|R|F|1994-02-23|1994-02-14|1994-03-07|COLLECT COD|MAIL| dazzle above the quickly +45924|1208|83|4|28|31057.60|0.00|0.03|A|F|1994-04-20|1994-02-01|1994-04-23|COLLECT COD|TRUCK|olites. quickly ironic req +45924|330|31|5|28|34449.24|0.01|0.06|R|F|1994-04-16|1994-03-17|1994-05-08|NONE|RAIL|ep blithel +45925|192|45|1|30|32765.70|0.10|0.06|N|O|1996-05-05|1996-05-31|1996-05-21|TAKE BACK RETURN|SHIP|ainst the quickly ironic theodolites. +45925|1564|45|2|11|16121.16|0.07|0.01|N|O|1996-07-09|1996-07-11|1996-07-27|COLLECT COD|RAIL|ully final, ironic dolphins. +45926|997|32|1|19|36061.81|0.03|0.01|R|F|1995-03-17|1995-05-31|1995-03-20|COLLECT COD|SHIP|ar forges! carefully even +45926|1046|82|2|14|13258.56|0.08|0.04|A|F|1995-03-22|1995-04-04|1995-04-02|TAKE BACK RETURN|TRUCK| requests believe carefully about the care +45926|1250|51|3|13|14966.25|0.00|0.08|N|O|1995-06-30|1995-05-08|1995-07-11|TAKE BACK RETURN|REG AIR|doubt. close, regular accounts pro +45927|1192|65|1|27|29516.13|0.09|0.01|R|F|1994-09-27|1994-11-05|1994-10-19|DELIVER IN PERSON|FOB|re furiously alongside of the fluf +45927|695|96|2|11|17552.59|0.08|0.02|R|F|1994-11-18|1994-12-06|1994-11-25|TAKE BACK RETURN|MAIL|s. quickly quiet packages a +45927|1657|81|3|9|14027.85|0.02|0.03|R|F|1994-10-31|1994-12-22|1994-11-19|DELIVER IN PERSON|SHIP|ag furiously. unusual pin +45927|1323|24|4|27|33056.64|0.06|0.04|R|F|1995-01-20|1994-10-28|1995-01-27|COLLECT COD|MAIL|ughout the final th +45927|1305|20|5|1|1206.30|0.01|0.04|A|F|1994-12-05|1994-12-03|1994-12-20|COLLECT COD|TRUCK|es. final ex +45927|1177|78|6|26|28032.42|0.05|0.01|A|F|1994-10-11|1994-11-24|1994-11-02|DELIVER IN PERSON|FOB|quests wake quickly regula +45927|1931|64|7|8|14663.44|0.05|0.08|R|F|1994-12-23|1994-11-12|1995-01-20|COLLECT COD|FOB|iously regular deposits +45952|1910|11|1|28|50733.48|0.03|0.07|N|O|1997-04-19|1997-05-11|1997-05-11|TAKE BACK RETURN|RAIL|cajole about the +45952|1643|44|2|29|44794.56|0.05|0.02|N|O|1997-04-02|1997-04-25|1997-04-07|NONE|FOB|y even theodolites above the careful +45952|1120|29|3|27|27570.24|0.01|0.06|N|O|1997-05-19|1997-05-08|1997-06-11|NONE|RAIL|s boost blithely. instructi +45952|744|77|4|15|24671.10|0.02|0.05|N|O|1997-07-02|1997-06-11|1997-07-26|DELIVER IN PERSON|MAIL|g the express foxes cajole +45952|159|60|5|16|16946.40|0.04|0.00|N|O|1997-07-18|1997-05-04|1997-08-01|TAKE BACK RETURN|SHIP|lithely pending pac +45952|1126|63|6|35|35949.20|0.09|0.02|N|O|1997-07-08|1997-04-24|1997-07-16|DELIVER IN PERSON|RAIL|ets; pending waters al +45952|1559|60|7|25|36513.75|0.09|0.08|N|O|1997-04-21|1997-05-25|1997-04-27|COLLECT COD|TRUCK|ickly. fluffily express requests boost flu +45953|1324|63|1|31|37984.92|0.05|0.08|N|O|1998-08-11|1998-06-20|1998-08-26|COLLECT COD|MAIL|ully regular deposits +45954|1256|57|1|36|41661.00|0.10|0.05|N|O|1998-03-02|1998-02-18|1998-03-07|DELIVER IN PERSON|TRUCK|nal excuses along the hock +45954|978|79|2|7|13152.79|0.00|0.07|N|O|1998-02-27|1998-03-08|1998-03-16|COLLECT COD|AIR|l deposits. blithely regula +45954|413|1|3|32|42029.12|0.02|0.03|N|O|1998-04-08|1998-01-29|1998-05-03|DELIVER IN PERSON|RAIL|special accounts. slyly final deposits u +45955|917|52|1|9|16361.19|0.06|0.04|N|O|1998-10-12|1998-10-03|1998-10-15|DELIVER IN PERSON|AIR|ronic packages. blithely final in +45956|298|53|1|30|35948.70|0.00|0.01|N|O|1996-10-11|1996-10-24|1996-10-26|TAKE BACK RETURN|FOB|slyly stealthy grouches sleep express requ +45957|1580|81|1|38|56300.04|0.07|0.06|A|F|1993-12-05|1993-11-18|1993-12-29|TAKE BACK RETURN|MAIL|gular foxes wake blithely pending +45957|518|19|2|20|28370.20|0.05|0.06|A|F|1993-09-30|1993-11-23|1993-10-07|NONE|TRUCK|its. quickly iron +45957|1225|100|3|18|20271.96|0.08|0.00|R|F|1993-12-30|1993-11-04|1994-01-18|DELIVER IN PERSON|RAIL|azzle fluffily silent, pending r +45957|399|28|4|11|14293.29|0.08|0.02|R|F|1993-10-03|1993-11-11|1993-10-13|COLLECT COD|SHIP|ly regular instructions in place of the +45957|1083|54|5|32|31490.56|0.01|0.08|A|F|1993-11-23|1993-11-03|1993-12-19|TAKE BACK RETURN|SHIP|c foxes. bold, i +45958|1185|22|1|27|29326.86|0.05|0.00|N|O|1995-07-15|1995-07-20|1995-07-31|TAKE BACK RETURN|REG AIR|to beans wake alongside of the regular, ir +45958|1867|11|2|3|5306.58|0.05|0.05|N|O|1995-09-22|1995-08-19|1995-10-19|COLLECT COD|FOB|usual, bold requests affi +45958|523|14|3|38|54093.76|0.01|0.02|N|O|1995-08-09|1995-07-06|1995-08-16|DELIVER IN PERSON|TRUCK| even, pending theodolites print +45958|991|92|4|13|24595.87|0.06|0.03|N|O|1995-09-03|1995-07-11|1995-09-17|COLLECT COD|REG AIR|haggle fluffily quic +45958|100|1|5|10|10001.00|0.04|0.00|N|O|1995-07-13|1995-08-06|1995-07-23|COLLECT COD|RAIL|ilent theodolites are carefully p +45959|664|58|1|20|31293.20|0.03|0.05|A|F|1995-01-15|1995-02-20|1995-02-06|TAKE BACK RETURN|RAIL|y bold ideas cajole +45959|1727|70|2|47|76549.84|0.03|0.01|A|F|1995-02-11|1995-01-24|1995-03-03|COLLECT COD|AIR|ounts. ironic, +45959|492|51|3|11|15317.39|0.02|0.04|R|F|1995-01-10|1995-01-10|1995-01-26|COLLECT COD|SHIP|lites cajole c +45959|879|46|4|46|81874.02|0.04|0.01|A|F|1995-04-06|1995-01-06|1995-05-04|DELIVER IN PERSON|AIR|ngly final i +45959|470|71|5|16|21927.52|0.04|0.01|R|F|1995-01-12|1995-01-10|1995-01-20|NONE|TRUCK| about the alway +45959|776|77|6|3|5030.31|0.02|0.05|A|F|1995-01-04|1995-02-15|1995-02-02|TAKE BACK RETURN|RAIL| furiously regular +45959|1179|88|7|48|51848.16|0.09|0.02|A|F|1995-03-04|1995-02-28|1995-03-17|NONE|TRUCK|atelets are around the caref +45984|1227|65|1|33|37231.26|0.10|0.02|A|F|1992-03-27|1992-03-11|1992-04-21|TAKE BACK RETURN|SHIP| furiously unus +45984|831|31|2|23|39832.09|0.03|0.06|A|F|1992-05-09|1992-03-06|1992-05-19|NONE|AIR|instructions grow final waters. f +45984|1696|79|3|24|38344.56|0.07|0.05|A|F|1992-02-10|1992-04-05|1992-02-24|TAKE BACK RETURN|RAIL|lly final, specia +45984|1417|35|4|7|9228.87|0.09|0.04|R|F|1992-04-19|1992-03-09|1992-04-28|TAKE BACK RETURN|AIR| fluffily bold theodolites nag. +45984|1471|89|5|40|54898.80|0.07|0.03|R|F|1992-05-06|1992-04-25|1992-05-23|DELIVER IN PERSON|FOB|ests wake slyly special +45984|1723|24|6|9|14622.48|0.00|0.07|R|F|1992-05-19|1992-03-10|1992-05-27|COLLECT COD|FOB|accounts cajole fluffily-- slyly fi +45985|717|82|1|41|66326.11|0.02|0.05|N|O|1997-07-07|1997-06-05|1997-07-19|COLLECT COD|AIR|y ironic ins +45985|1972|61|2|15|28109.55|0.03|0.08|N|O|1997-07-21|1997-06-04|1997-08-10|NONE|MAIL|e fluffily unusual dinos enga +45985|606|69|3|33|49717.80|0.04|0.07|N|O|1997-06-26|1997-05-07|1997-07-15|TAKE BACK RETURN|FOB| bold packages +45985|297|52|4|27|32326.83|0.04|0.05|N|O|1997-04-30|1997-05-12|1997-05-02|TAKE BACK RETURN|FOB|totes. final, regular asymptotes sleep +45986|773|70|1|10|16737.70|0.04|0.03|R|F|1995-03-06|1995-02-23|1995-04-05|COLLECT COD|RAIL| regular packages nag +45986|501|32|2|13|18219.50|0.03|0.07|R|F|1995-01-03|1995-03-15|1995-01-30|COLLECT COD|AIR|nal excuses grow furiousl +45987|267|49|1|44|51359.44|0.09|0.03|R|F|1994-03-15|1994-05-24|1994-04-01|NONE|MAIL|accounts. +45987|370|71|2|34|43192.58|0.10|0.02|A|F|1994-05-20|1994-05-03|1994-06-11|NONE|REG AIR|uffily special packages. slyly +45987|590|51|3|50|74529.50|0.10|0.00|R|F|1994-04-26|1994-04-19|1994-05-12|COLLECT COD|RAIL|xpress deposits a +45987|1380|81|4|16|20502.08|0.05|0.03|A|F|1994-05-22|1994-05-23|1994-06-16|COLLECT COD|MAIL|nic accounts. busy dependencies +45987|1838|25|5|37|64373.71|0.08|0.06|R|F|1994-05-05|1994-05-29|1994-05-20|COLLECT COD|REG AIR|cuses wake furiously. unusual theodol +45988|301|2|1|38|45649.40|0.03|0.08|A|F|1994-12-31|1994-11-01|1995-01-24|COLLECT COD|MAIL|arefully ironic accounts sleep slyly +45988|615|16|2|49|74264.89|0.06|0.03|A|F|1994-11-08|1994-10-04|1994-11-22|COLLECT COD|FOB|uffily slyly pending deposits +45989|548|9|1|13|18831.02|0.07|0.01|A|F|1993-12-05|1993-09-29|1993-12-30|COLLECT COD|FOB|ts. fluffily special pinto +45989|1462|41|2|20|27269.20|0.04|0.02|R|F|1993-09-11|1993-10-30|1993-09-25|TAKE BACK RETURN|SHIP| ironic requests! carefully blithe ide +45989|1260|72|3|31|35999.06|0.03|0.01|R|F|1993-11-10|1993-10-08|1993-11-19|DELIVER IN PERSON|RAIL|y regular tith +45990|1614|15|1|22|33343.42|0.00|0.06|A|F|1994-10-22|1994-11-13|1994-11-15|COLLECT COD|FOB|slyly across the fu +45990|671|65|2|33|51865.11|0.03|0.07|R|F|1994-09-29|1994-10-17|1994-10-10|TAKE BACK RETURN|AIR|ress accounts. c +45990|1357|34|3|22|27683.70|0.01|0.01|R|F|1994-09-23|1994-11-19|1994-10-05|DELIVER IN PERSON|AIR| bold asymptotes cajole dogg +45991|1651|75|1|38|59000.70|0.10|0.00|N|F|1995-05-28|1995-04-11|1995-06-19|TAKE BACK RETURN|RAIL|counts sleep blithely above the furio +45991|152|31|2|31|32616.65|0.09|0.04|A|F|1995-03-02|1995-04-29|1995-03-12|TAKE BACK RETURN|FOB|ending req +45991|1988|33|3|7|13229.86|0.00|0.07|A|F|1995-03-04|1995-03-31|1995-03-19|COLLECT COD|RAIL| the slyly exp +45991|510|71|4|29|40904.79|0.10|0.03|A|F|1995-03-07|1995-04-06|1995-03-23|DELIVER IN PERSON|MAIL|, close pack +45991|928|97|5|21|38407.32|0.02|0.06|R|F|1995-04-13|1995-05-12|1995-04-26|TAKE BACK RETURN|MAIL|. slyly special deposits affix express, reg +46016|1607|49|1|38|57326.80|0.08|0.07|A|F|1993-08-23|1993-07-07|1993-09-22|COLLECT COD|SHIP| theodolites nag after the reg +46016|354|55|2|36|45156.60|0.10|0.04|R|F|1993-05-21|1993-07-28|1993-06-10|TAKE BACK RETURN|MAIL|fully regular acco +46016|1067|38|3|10|9680.60|0.05|0.08|A|F|1993-07-03|1993-07-30|1993-07-04|DELIVER IN PERSON|RAIL|ic requests? slyly f +46016|278|79|4|23|27100.21|0.06|0.08|A|F|1993-07-04|1993-06-29|1993-07-22|COLLECT COD|SHIP|. furiously pending instructions mai +46016|1170|43|5|45|48202.65|0.10|0.05|A|F|1993-08-27|1993-08-09|1993-09-12|TAKE BACK RETURN|SHIP|l, ruthless gifts. carefully +46016|708|73|6|32|51478.40|0.04|0.01|A|F|1993-08-25|1993-07-01|1993-09-22|DELIVER IN PERSON|RAIL|ronic ideas are slyly. never bold +46017|970|5|1|20|37419.40|0.07|0.04|R|F|1992-03-15|1992-04-27|1992-04-14|TAKE BACK RETURN|MAIL|even dolphins +46017|1402|42|2|32|41708.80|0.04|0.05|R|F|1992-06-06|1992-04-26|1992-07-03|COLLECT COD|TRUCK|hins detect blithely pending foxes. furio +46017|1196|69|3|23|25235.37|0.01|0.02|R|F|1992-04-02|1992-03-19|1992-04-16|TAKE BACK RETURN|RAIL|ongside of th +46017|1402|42|4|40|52136.00|0.00|0.00|R|F|1992-04-18|1992-04-02|1992-05-11|DELIVER IN PERSON|MAIL|brave ideas sleep blithely. careful +46018|293|21|1|5|5966.45|0.08|0.00|A|F|1994-09-17|1994-11-10|1994-09-26|NONE|MAIL|ost carefully final platelets. regul +46019|864|65|1|40|70594.40|0.01|0.00|N|O|1997-09-14|1997-09-25|1997-09-27|DELIVER IN PERSON|REG AIR|old, silent deposits; even packa +46019|825|26|2|3|5177.46|0.01|0.05|N|O|1997-09-11|1997-10-15|1997-10-11|COLLECT COD|SHIP|l, express de +46019|429|59|3|47|62482.74|0.05|0.04|N|O|1997-08-16|1997-09-22|1997-09-12|DELIVER IN PERSON|FOB|y above th +46020|654|48|1|23|35756.95|0.07|0.06|N|O|1997-05-08|1997-05-10|1997-05-27|DELIVER IN PERSON|AIR|lar asymptotes. ironic packages +46020|1584|65|2|8|11884.64|0.02|0.04|N|O|1997-04-07|1997-05-04|1997-05-06|DELIVER IN PERSON|SHIP|uriously final ideas are. packag +46020|563|54|3|15|21953.40|0.04|0.04|N|O|1997-05-13|1997-04-19|1997-05-16|COLLECT COD|FOB|. platelets are +46020|853|54|4|16|28061.60|0.00|0.04|N|O|1997-05-08|1997-04-13|1997-05-22|NONE|RAIL|ages hinder furio +46020|1130|3|5|15|15466.95|0.03|0.02|N|O|1997-05-25|1997-05-21|1997-05-30|DELIVER IN PERSON|RAIL|detect about the slyly express d +46020|702|35|6|33|52889.10|0.09|0.04|N|O|1997-04-10|1997-05-16|1997-05-10|DELIVER IN PERSON|REG AIR|tions. pending requests affix quickl +46020|148|75|7|18|18866.52|0.07|0.07|N|O|1997-03-11|1997-04-14|1997-03-15|TAKE BACK RETURN|MAIL|. carefully final dependencies use bol +46021|541|42|1|35|50453.90|0.10|0.07|A|F|1994-04-16|1994-04-11|1994-04-19|COLLECT COD|TRUCK| unusual accounts. someti +46021|1260|61|2|18|20902.68|0.10|0.08|R|F|1994-06-09|1994-04-20|1994-06-25|NONE|FOB|s. furiously regular +46022|1384|85|1|27|34705.26|0.06|0.04|N|O|1997-09-06|1997-10-31|1997-09-29|NONE|AIR|ular requests. furiously silent +46022|40|16|2|37|34781.48|0.05|0.07|N|O|1997-11-18|1997-12-03|1997-11-21|NONE|SHIP|arefully after the exp +46022|142|69|3|44|45854.16|0.10|0.06|N|O|1997-11-09|1997-10-12|1997-11-27|TAKE BACK RETURN|REG AIR|he carefully ironic reque +46022|5|56|4|34|30770.00|0.08|0.00|N|O|1997-11-15|1997-11-04|1997-12-04|DELIVER IN PERSON|AIR|olphins. excuses wake fluffily +46023|1975|76|1|40|75078.80|0.02|0.04|R|F|1992-06-21|1992-05-24|1992-07-07|NONE|MAIL|lithely above the accounts. carefully final +46023|291|92|2|35|41695.15|0.06|0.06|R|F|1992-04-28|1992-05-29|1992-05-23|NONE|TRUCK| blithely furiously final de +46023|1466|6|3|11|15042.06|0.04|0.06|A|F|1992-05-27|1992-06-17|1992-06-16|TAKE BACK RETURN|AIR|usly ironic depen +46023|987|56|4|17|32095.66|0.06|0.02|R|F|1992-03-26|1992-05-31|1992-04-08|NONE|REG AIR|eodolites grow. careful +46023|1261|62|5|4|4649.04|0.03|0.08|R|F|1992-05-04|1992-06-08|1992-05-16|COLLECT COD|FOB|grate blithely bold deposits. idl +46048|319|4|1|7|8535.17|0.08|0.08|R|F|1993-02-26|1993-02-03|1993-03-27|NONE|MAIL|ages was furiously express tith +46048|1745|72|2|14|23054.36|0.09|0.02|R|F|1992-12-21|1993-02-24|1992-12-23|TAKE BACK RETURN|RAIL|ests. iron +46048|654|55|3|35|54412.75|0.10|0.01|R|F|1993-01-25|1993-02-04|1993-01-28|DELIVER IN PERSON|FOB| bold packages sle +46048|1544|45|4|39|56376.06|0.07|0.03|R|F|1993-04-07|1993-02-02|1993-04-12|COLLECT COD|SHIP|cajole slyly among the blithely ir +46048|1340|79|5|28|34757.52|0.09|0.03|A|F|1993-03-14|1993-02-26|1993-04-10|NONE|TRUCK|the regularly final grouches. neve +46049|1912|45|1|22|39906.02|0.06|0.06|A|F|1992-07-11|1992-07-19|1992-07-20|TAKE BACK RETURN|REG AIR|ffily ironic depths mold along +46049|1082|53|2|31|30475.48|0.06|0.08|R|F|1992-08-21|1992-07-25|1992-08-25|DELIVER IN PERSON|TRUCK|cross the +46049|1312|13|3|30|36399.30|0.02|0.01|R|F|1992-08-11|1992-06-26|1992-08-28|COLLECT COD|REG AIR| foxes. ironic deposi +46050|386|15|1|35|45023.30|0.01|0.01|R|F|1993-05-01|1993-02-12|1993-05-29|COLLECT COD|RAIL|sly Tiresias. blithely +46050|928|29|2|4|7315.68|0.09|0.05|A|F|1993-03-27|1993-03-06|1993-04-21|NONE|FOB|s serve. final accounts are against the c +46050|1735|36|3|36|58922.28|0.04|0.07|A|F|1993-05-03|1993-03-04|1993-05-05|COLLECT COD|FOB|ven pinto beans. slyly even pa +46050|1691|74|4|37|58929.53|0.05|0.05|A|F|1993-01-27|1993-03-11|1993-02-09|TAKE BACK RETURN|TRUCK|ts: slyly +46050|873|40|5|47|83371.89|0.07|0.05|R|F|1993-01-31|1993-03-31|1993-02-26|NONE|AIR|riously bold packages. bold deposit +46050|235|17|6|24|27245.52|0.08|0.01|R|F|1993-03-15|1993-02-24|1993-03-30|DELIVER IN PERSON|SHIP|courts against the +46051|1167|40|1|17|18158.72|0.08|0.01|N|O|1998-02-26|1998-03-11|1998-03-09|TAKE BACK RETURN|SHIP|ss the slyly thin asymptotes! +46052|1065|1|1|47|45404.82|0.00|0.04|R|F|1995-03-15|1994-12-31|1995-03-21|TAKE BACK RETURN|FOB|es. carefully silent accounts sublate c +46052|512|13|2|14|19775.14|0.01|0.07|A|F|1995-02-17|1995-02-03|1995-02-26|COLLECT COD|FOB|arefully silent platelets about the darin +46052|651|45|3|38|58962.70|0.00|0.01|R|F|1994-12-21|1995-02-14|1995-01-05|NONE|FOB|special packages boost above the packages. +46052|445|75|4|5|6727.20|0.07|0.03|A|F|1994-12-07|1995-02-09|1995-01-03|NONE|FOB|accounts integrate. furiously final theodo +46052|547|38|5|17|24608.18|0.00|0.03|A|F|1995-03-20|1995-01-25|1995-03-21|COLLECT COD|SHIP|requests. carefully unusual requests cajo +46052|1078|14|6|40|39162.80|0.06|0.04|A|F|1995-01-08|1995-02-11|1995-01-17|NONE|MAIL|refully regular dolphins. grouches ca +46053|1309|10|1|19|22995.70|0.02|0.00|A|F|1992-12-22|1992-12-04|1993-01-14|TAKE BACK RETURN|REG AIR|he ironic, ex +46053|1127|36|2|33|33927.96|0.10|0.02|A|F|1992-10-04|1992-11-25|1992-10-22|COLLECT COD|RAIL|refully final orbits +46053|1363|40|3|6|7586.16|0.08|0.02|R|F|1992-10-07|1992-10-26|1992-10-10|NONE|MAIL|al deposits. +46053|1095|1|4|19|18925.71|0.09|0.01|R|F|1993-01-11|1992-12-10|1993-02-08|COLLECT COD|FOB|ess foxes. furiously +46054|1287|88|1|50|59414.00|0.04|0.03|R|F|1993-04-01|1993-01-01|1993-04-10|COLLECT COD|MAIL| special, final de +46054|1614|15|2|50|75780.50|0.04|0.08|A|F|1992-12-23|1993-01-21|1993-01-02|COLLECT COD|MAIL|efully furiously +46055|1967|68|1|31|57937.76|0.00|0.05|R|F|1992-07-10|1992-07-23|1992-08-06|DELIVER IN PERSON|MAIL|g the slyly slow pinto be +46055|1734|19|2|30|49071.90|0.01|0.02|A|F|1992-08-27|1992-07-25|1992-09-18|COLLECT COD|REG AIR|ut the carefully ironic accounts. furiously +46055|465|95|3|47|64176.62|0.00|0.07|A|F|1992-08-24|1992-08-20|1992-08-30|DELIVER IN PERSON|RAIL|attainments. bold +46055|1890|91|4|16|28670.24|0.01|0.05|A|F|1992-09-30|1992-07-12|1992-10-07|DELIVER IN PERSON|RAIL|s the blithely bold dolphins cajole f +46055|345|74|5|13|16189.42|0.00|0.05|R|F|1992-07-31|1992-08-29|1992-08-16|NONE|TRUCK|ly against the ironic, special +46055|300|1|6|14|16804.20|0.01|0.08|R|F|1992-06-19|1992-08-03|1992-07-08|NONE|FOB|equests. fluffily unusual pi +46055|232|33|7|48|54347.04|0.07|0.02|R|F|1992-07-10|1992-08-07|1992-08-02|NONE|FOB|tly unusual ins +46080|1812|13|1|33|56555.73|0.02|0.05|N|O|1997-10-18|1997-12-03|1997-11-04|DELIVER IN PERSON|MAIL|ronic accounts +46080|376|33|2|31|39567.47|0.05|0.01|N|O|1997-10-14|1997-11-07|1997-10-23|TAKE BACK RETURN|AIR|s. quickly bold pack +46080|1065|1|3|27|26083.62|0.01|0.07|N|O|1997-09-27|1997-11-28|1997-10-04|COLLECT COD|FOB|ross the rut +46080|614|46|4|48|72701.28|0.01|0.05|N|O|1997-12-15|1997-11-04|1998-01-06|COLLECT COD|REG AIR|kly ironic dugouts. special th +46081|877|44|1|31|55113.97|0.03|0.03|R|F|1992-07-10|1992-08-19|1992-07-17|COLLECT COD|FOB|arefully express depos +46081|788|89|2|21|35464.38|0.01|0.00|A|F|1992-08-21|1992-08-15|1992-09-05|TAKE BACK RETURN|TRUCK|ely after the +46081|735|68|3|42|68700.66|0.09|0.00|A|F|1992-07-17|1992-08-08|1992-07-18|NONE|TRUCK|doze fluffily. carefully +46082|227|82|1|47|52979.34|0.09|0.02|N|O|1998-04-03|1998-05-03|1998-04-20|TAKE BACK RETURN|FOB|s wake. furiously express asym +46082|829|30|2|1|1729.82|0.08|0.04|N|O|1998-05-27|1998-05-24|1998-06-15|TAKE BACK RETURN|MAIL|ructions might boost acc +46082|492|93|3|1|1392.49|0.05|0.01|N|O|1998-05-25|1998-05-20|1998-06-04|COLLECT COD|MAIL|structions affix furiously. careful +46082|1539|80|4|23|33132.19|0.00|0.00|N|O|1998-03-11|1998-04-13|1998-03-13|COLLECT COD|MAIL|r, unusual deposits cajole quickly +46082|348|49|5|47|58671.98|0.05|0.03|N|O|1998-05-03|1998-04-25|1998-05-14|TAKE BACK RETURN|SHIP|o the unusual requests. carefully fi +46082|30|6|6|14|13020.42|0.04|0.07|N|O|1998-04-27|1998-05-05|1998-05-03|DELIVER IN PERSON|RAIL|lithely express deposits inside the foxes +46082|837|37|7|21|36494.43|0.00|0.07|N|O|1998-05-12|1998-05-18|1998-06-11|NONE|FOB| detect after th +46083|1709|10|1|43|69260.10|0.10|0.03|A|F|1993-11-11|1993-10-27|1993-11-18|NONE|TRUCK|fully final multipliers according to t +46084|1906|39|1|20|36158.00|0.02|0.08|N|O|1997-12-31|1997-10-17|1998-01-12|COLLECT COD|TRUCK|ests. foxes wake blith +46084|1706|33|2|6|9646.20|0.05|0.06|N|O|1997-10-12|1997-11-03|1997-10-16|COLLECT COD|REG AIR|e slyly alongside of the foxes. bold ins +46084|963|66|3|39|72694.44|0.03|0.04|N|O|1997-10-03|1997-11-10|1997-10-09|TAKE BACK RETURN|FOB|s. furiously +46085|382|11|1|48|61554.24|0.04|0.03|R|F|1992-05-01|1992-03-01|1992-05-18|NONE|AIR|s the slyly close pac +46085|1453|71|2|37|50114.65|0.08|0.05|R|F|1992-03-30|1992-03-05|1992-04-28|DELIVER IN PERSON|TRUCK|riously unusual ideas are careful +46085|1895|96|3|17|30547.13|0.01|0.06|A|F|1992-04-07|1992-03-04|1992-04-22|TAKE BACK RETURN|RAIL|equests. slyly blithe packages are pen +46086|1973|62|1|19|35624.43|0.06|0.01|N|O|1995-11-23|1995-12-15|1995-11-30|COLLECT COD|MAIL|ckly final dugouts. carefully express req +46087|1708|93|1|1|1609.70|0.04|0.03|N|O|1996-02-20|1996-01-18|1996-03-13|TAKE BACK RETURN|REG AIR|ss the regular depths. blithely s +46112|1460|61|1|11|14976.06|0.00|0.07|A|F|1993-01-10|1992-11-15|1993-01-17|COLLECT COD|FOB|counts. pending pinto beans abo +46112|1946|79|2|11|20327.34|0.08|0.00|A|F|1993-01-07|1992-12-12|1993-01-11|NONE|SHIP|totes. instructions haggle. furiously fi +46112|914|83|3|11|19964.01|0.05|0.04|R|F|1992-11-24|1992-11-19|1992-12-12|NONE|RAIL|lithely pen +46113|133|60|1|17|17563.21|0.10|0.04|R|F|1995-01-16|1995-01-24|1995-01-17|NONE|TRUCK|luffily eve +46113|1217|18|2|4|4472.84|0.07|0.08|R|F|1995-03-29|1995-02-05|1995-04-21|COLLECT COD|MAIL| sleep carefu +46113|196|97|3|29|31789.51|0.10|0.05|A|F|1995-03-03|1995-01-13|1995-03-10|DELIVER IN PERSON|FOB|g to the furiously regular +46113|1597|18|4|48|71932.32|0.06|0.05|A|F|1995-01-23|1995-02-08|1995-02-16|TAKE BACK RETURN|REG AIR|furiously express excuses. +46113|1402|20|5|2|2606.80|0.09|0.04|R|F|1995-04-01|1995-01-17|1995-04-06|DELIVER IN PERSON|RAIL|es are slyly regular asymptotes. sl +46114|1102|75|1|14|14043.40|0.08|0.00|N|O|1997-08-29|1997-08-25|1997-09-09|NONE|FOB|close foxes. car +46114|660|54|2|27|42137.82|0.01|0.03|N|O|1997-10-16|1997-09-05|1997-10-17|NONE|FOB|s. furiously ironic +46115|1369|8|1|49|62247.64|0.10|0.08|A|F|1995-04-28|1995-04-19|1995-05-02|COLLECT COD|FOB|ully silent theodolites. fluffy d +46115|471|72|2|43|58973.21|0.03|0.02|R|F|1995-03-23|1995-05-19|1995-04-05|DELIVER IN PERSON|MAIL| unusual deposits. sl +46115|1417|96|3|18|23731.38|0.09|0.02|A|F|1995-03-12|1995-05-27|1995-03-13|TAKE BACK RETURN|FOB|ithely blithely special theodolites. furio +46115|1474|75|4|28|38513.16|0.10|0.05|A|F|1995-05-10|1995-04-02|1995-06-01|COLLECT COD|AIR|nts. final accounts haggle slyl +46115|874|75|5|46|81644.02|0.04|0.07|N|F|1995-06-01|1995-05-15|1995-06-18|TAKE BACK RETURN|FOB|al foxes. express foxes across t +46115|808|75|6|26|44428.80|0.04|0.06|N|O|1995-06-19|1995-05-13|1995-06-27|COLLECT COD|FOB|ake expres +46116|1969|70|1|5|9354.80|0.07|0.02|A|F|1995-03-09|1995-03-10|1995-03-24|NONE|SHIP|ending pearls wake. furiously ironic ins +46116|1979|80|2|15|28214.55|0.07|0.03|A|F|1995-04-30|1995-03-28|1995-05-17|NONE|REG AIR| slyly ruthle +46116|1056|92|3|6|5742.30|0.06|0.07|R|F|1995-04-26|1995-03-23|1995-05-09|NONE|REG AIR|r pinto beans. ironic, unusual accounts w +46116|1690|73|4|47|74809.43|0.05|0.04|R|F|1995-02-11|1995-02-16|1995-02-15|NONE|TRUCK|yly even acc +46116|1426|44|5|40|53096.80|0.07|0.03|R|F|1995-03-31|1995-02-16|1995-04-25|DELIVER IN PERSON|TRUCK|kages haggle fluffily along the dependenci +46116|1593|14|6|37|55299.83|0.02|0.06|R|F|1995-01-14|1995-04-08|1995-01-19|NONE|REG AIR|ly even pint +46117|1318|57|1|29|35359.99|0.04|0.08|N|O|1995-08-26|1995-07-02|1995-09-09|NONE|MAIL|quests detect blithely final accou +46117|741|38|2|37|60744.38|0.08|0.05|N|O|1995-07-31|1995-08-10|1995-08-08|TAKE BACK RETURN|REG AIR|packages. regular +46118|461|49|1|11|14976.06|0.06|0.00|N|O|1997-08-02|1997-06-09|1997-08-22|DELIVER IN PERSON|MAIL|uriously. even pearls boost blithe +46118|204|59|2|46|50793.20|0.03|0.00|N|O|1997-07-12|1997-07-01|1997-08-06|TAKE BACK RETURN|SHIP| the quickly regular platelets. even dolp +46118|60|11|3|44|42242.64|0.01|0.05|N|O|1997-06-11|1997-06-29|1997-07-05|DELIVER IN PERSON|TRUCK| final excuses +46118|1415|33|4|19|25011.79|0.02|0.05|N|O|1997-04-28|1997-06-07|1997-05-06|NONE|AIR|ckages sleep around the sly +46118|1774|75|5|50|83788.50|0.02|0.07|N|O|1997-06-16|1997-05-31|1997-06-18|TAKE BACK RETURN|RAIL|usly above the furious +46118|1694|77|6|27|43083.63|0.06|0.03|N|O|1997-04-22|1997-06-03|1997-05-02|COLLECT COD|FOB|he carefully express +46118|563|54|7|17|24880.52|0.08|0.01|N|O|1997-07-16|1997-07-10|1997-08-08|NONE|SHIP|iously even requests wake slyly expres +46119|1972|17|1|10|18739.70|0.08|0.04|R|F|1994-04-27|1994-05-02|1994-04-29|DELIVER IN PERSON|SHIP|boost quickly pinto beans. ent +46119|929|98|2|50|91496.00|0.05|0.08|A|F|1994-04-26|1994-05-15|1994-05-01|DELIVER IN PERSON|RAIL|packages sleep quic +46119|174|53|3|41|44040.97|0.05|0.03|R|F|1994-02-28|1994-04-27|1994-03-03|COLLECT COD|RAIL|lar ideas haggle +46119|1779|80|4|15|25211.55|0.02|0.06|R|F|1994-05-21|1994-03-21|1994-05-29|DELIVER IN PERSON|MAIL|fluffily among the blithely +46119|1732|17|5|42|68616.66|0.09|0.01|R|F|1994-03-22|1994-05-07|1994-04-06|TAKE BACK RETURN|FOB|g, final id +46119|920|89|6|19|34597.48|0.08|0.01|R|F|1994-03-08|1994-05-03|1994-04-03|COLLECT COD|FOB|s. furiously final theodolites are accoun +46144|978|81|1|12|22547.64|0.00|0.00|R|F|1993-03-14|1993-02-28|1993-04-04|DELIVER IN PERSON|FOB|among the furio +46144|1691|33|2|47|74856.43|0.02|0.02|R|F|1993-03-16|1993-01-12|1993-03-18|TAKE BACK RETURN|MAIL|he foxes could +46145|163|42|1|17|18073.72|0.06|0.06|N|O|1997-02-04|1997-03-08|1997-03-06|NONE|TRUCK|ts. furiously express multipliers +46145|1036|37|2|43|40292.29|0.00|0.05|N|O|1997-05-07|1997-03-22|1997-05-27|COLLECT COD|SHIP|ns! blithely iron +46145|1057|28|3|35|33531.75|0.07|0.00|N|O|1997-04-17|1997-03-22|1997-05-11|TAKE BACK RETURN|SHIP|s? deposits snooze slyly. +46146|496|84|1|35|48877.15|0.02|0.02|N|O|1997-12-28|1997-11-22|1998-01-27|TAKE BACK RETURN|REG AIR|ages cajole blithely excuses. +46146|1497|37|2|19|26571.31|0.02|0.06|N|O|1997-10-11|1997-12-01|1997-10-14|TAKE BACK RETURN|MAIL|ffily unusual deposits cajol +46146|979|82|3|13|24439.61|0.07|0.07|N|O|1997-10-09|1997-10-26|1997-10-28|DELIVER IN PERSON|REG AIR|deposits-- platelets are carefully +46147|796|61|1|6|10180.74|0.03|0.07|R|F|1995-03-26|1995-04-09|1995-04-18|NONE|AIR|counts are. even platelets use fluff +46147|376|77|2|32|40843.84|0.05|0.08|A|F|1995-01-28|1995-04-07|1995-01-30|COLLECT COD|REG AIR|tect furiou +46147|1628|52|3|34|52007.08|0.04|0.03|A|F|1995-03-09|1995-02-20|1995-03-25|TAKE BACK RETURN|TRUCK|eposits haggle quic +46147|1274|86|4|10|11752.70|0.00|0.06|A|F|1995-03-15|1995-03-29|1995-03-16|TAKE BACK RETURN|TRUCK|ages. final, silent deposits nag abov +46147|491|92|5|26|36178.74|0.01|0.01|R|F|1995-04-26|1995-04-03|1995-05-07|TAKE BACK RETURN|AIR|l requests sleep ironic accounts. care +46147|1748|33|6|32|52791.68|0.02|0.06|R|F|1995-02-03|1995-04-12|1995-02-20|NONE|AIR|ove the bold request +46148|291|92|1|4|4765.16|0.05|0.05|N|O|1997-07-10|1997-07-02|1997-07-29|NONE|FOB| deposits. fluffily ironi +46148|1184|57|2|37|40151.66|0.09|0.08|N|O|1997-07-03|1997-08-12|1997-07-20|DELIVER IN PERSON|SHIP|waters nag. fur +46149|566|57|1|16|23464.96|0.10|0.06|N|O|1996-06-03|1996-07-23|1996-06-30|NONE|SHIP|ic accounts affix b +46149|703|36|2|10|16037.00|0.08|0.01|N|O|1996-06-11|1996-08-11|1996-07-02|DELIVER IN PERSON|TRUCK|s haggle carefully. pa +46150|14|40|1|39|35646.39|0.10|0.05|A|F|1993-05-05|1993-04-22|1993-05-07|TAKE BACK RETURN|AIR|hely ironi +46151|647|10|1|25|38691.00|0.00|0.03|R|F|1994-12-10|1994-12-25|1994-12-18|TAKE BACK RETURN|TRUCK|. deposits are quickly even deposits +46151|1034|35|2|28|26180.84|0.03|0.01|A|F|1995-01-28|1995-01-23|1995-02-23|COLLECT COD|RAIL|cial platel +46151|1289|64|3|22|26186.16|0.02|0.04|R|F|1995-02-24|1994-12-13|1995-03-12|DELIVER IN PERSON|RAIL|l deposits are furiously across the ironi +46151|697|60|4|20|31953.80|0.08|0.04|R|F|1994-11-27|1994-12-12|1994-12-12|DELIVER IN PERSON|REG AIR|special depos +46151|227|55|5|29|32689.38|0.04|0.07|A|F|1995-01-27|1995-01-03|1995-02-23|COLLECT COD|RAIL|ounts sleep furiously furiously unusual +46151|1828|15|6|6|10378.92|0.00|0.00|A|F|1994-12-29|1995-02-01|1995-01-18|TAKE BACK RETURN|AIR|e regular platelets +46151|853|87|7|30|52615.50|0.00|0.01|R|F|1995-01-12|1995-01-04|1995-02-02|TAKE BACK RETURN|RAIL|lar, even accounts through the final +46176|1701|86|1|33|52889.10|0.07|0.08|N|O|1997-10-02|1997-11-28|1997-10-25|NONE|AIR|lithely above the regular, regular idea +46176|790|55|2|16|27052.64|0.08|0.07|N|O|1997-11-17|1997-11-21|1997-12-06|COLLECT COD|REG AIR|ate. ironic, silent foxes cajole slyly +46177|1021|27|1|28|25816.56|0.01|0.02|R|F|1994-02-05|1994-01-27|1994-02-22|TAKE BACK RETURN|REG AIR|ously regular theodoli +46177|791|92|2|20|33835.80|0.09|0.05|A|F|1993-12-25|1994-01-23|1994-01-15|DELIVER IN PERSON|SHIP|excuses. final +46177|1612|95|3|2|3027.22|0.04|0.08|A|F|1994-02-07|1994-01-05|1994-03-04|TAKE BACK RETURN|REG AIR|ous pinto beans. carefully pending noto +46177|279|80|4|28|33019.56|0.07|0.05|R|F|1994-03-05|1994-01-16|1994-03-07|NONE|AIR|uctions. fina +46177|1369|46|5|31|39381.16|0.07|0.04|R|F|1993-12-10|1994-02-13|1994-01-06|COLLECT COD|AIR|sts poach around the bold deposits. +46177|56|82|6|31|29637.55|0.07|0.05|R|F|1994-03-04|1994-02-16|1994-03-24|DELIVER IN PERSON|TRUCK| print among th +46177|1543|24|7|38|54892.52|0.05|0.04|R|F|1994-01-20|1994-02-21|1994-01-27|TAKE BACK RETURN|SHIP|oldly pending dolphins +46178|1099|5|1|48|48004.32|0.02|0.02|N|O|1996-03-10|1996-04-06|1996-04-09|DELIVER IN PERSON|SHIP|uriously final d +46178|700|63|2|12|19208.40|0.01|0.04|N|O|1996-06-02|1996-05-04|1996-06-29|NONE|REG AIR|ilent request +46178|1227|28|3|48|54154.56|0.00|0.03|N|O|1996-04-13|1996-05-01|1996-04-24|TAKE BACK RETURN|REG AIR|r the slyly even accounts +46179|62|13|1|30|28861.80|0.05|0.00|N|O|1998-08-30|1998-09-19|1998-09-19|DELIVER IN PERSON|TRUCK|l, unusual deposits. e +46179|1551|92|2|26|37766.30|0.04|0.05|N|O|1998-07-31|1998-09-23|1998-08-08|COLLECT COD|MAIL|lly. silently iron +46180|902|5|1|21|37860.90|0.00|0.06|N|O|1997-11-06|1997-10-18|1997-11-20|COLLECT COD|MAIL| slyly bold accounts wake furiously. iron +46180|1632|56|2|37|56744.31|0.08|0.00|N|O|1997-08-07|1997-09-24|1997-08-26|TAKE BACK RETURN|SHIP|fluffily regu +46180|1872|2|3|31|54989.97|0.09|0.05|N|O|1997-09-12|1997-08-27|1997-10-08|NONE|RAIL|. slyly ironic acc +46180|1597|98|4|13|19481.67|0.00|0.01|N|O|1997-10-28|1997-09-19|1997-11-13|TAKE BACK RETURN|SHIP|eodolites sleep ca +46181|1600|21|1|36|54057.60|0.07|0.03|N|O|1997-08-04|1997-08-11|1997-08-23|DELIVER IN PERSON|TRUCK|beans haggle slyly. slyly expres +46181|1132|41|2|45|46490.85|0.01|0.00|N|O|1997-09-12|1997-08-31|1997-09-27|DELIVER IN PERSON|MAIL| ironic accounts: carefully ironic re +46181|1902|47|3|17|30666.30|0.01|0.08|N|O|1997-07-12|1997-07-29|1997-08-08|COLLECT COD|REG AIR|arefully. +46181|1534|55|4|49|70340.97|0.03|0.04|N|O|1997-07-11|1997-07-25|1997-07-29|DELIVER IN PERSON|AIR|kages-- furiously +46182|765|62|1|32|53304.32|0.09|0.05|A|F|1993-04-17|1993-04-25|1993-05-02|NONE|REG AIR|ending dolph +46182|309|38|2|30|36279.00|0.05|0.02|R|F|1993-06-17|1993-04-29|1993-06-30|DELIVER IN PERSON|RAIL|ly above the furiously regular theodolites. +46182|1900|30|3|26|46849.40|0.10|0.01|R|F|1993-06-24|1993-04-24|1993-06-28|NONE|REG AIR|odolites cajole fur +46182|393|78|4|47|60789.33|0.00|0.08|A|F|1993-04-17|1993-06-05|1993-05-01|TAKE BACK RETURN|REG AIR|s pending packages. carefully +46182|587|88|5|45|66941.10|0.04|0.07|R|F|1993-05-25|1993-05-05|1993-05-30|TAKE BACK RETURN|RAIL|ound the pack +46183|1262|63|1|13|15122.38|0.05|0.07|R|F|1994-02-05|1994-01-18|1994-02-15|NONE|AIR|slyly regular platelets. +46183|1747|74|2|45|74193.30|0.06|0.02|R|F|1994-04-03|1994-02-03|1994-04-05|DELIVER IN PERSON|MAIL|ular deposit +46208|1226|27|1|32|36071.04|0.10|0.01|N|O|1997-06-19|1997-09-05|1997-07-09|COLLECT COD|TRUCK|ke closely above the reque +46208|1023|59|2|30|27720.60|0.06|0.06|N|O|1997-09-26|1997-07-18|1997-10-05|TAKE BACK RETURN|MAIL| carefully. +46208|1254|29|3|39|45054.75|0.05|0.04|N|O|1997-08-07|1997-08-01|1997-08-23|DELIVER IN PERSON|FOB|sly above the asymptotes. slyly pen +46208|1837|38|4|28|48687.24|0.06|0.00|N|O|1997-09-08|1997-07-21|1997-09-23|COLLECT COD|SHIP| the unusual, final ti +46208|1281|82|5|38|44926.64|0.02|0.00|N|O|1997-08-31|1997-09-10|1997-09-03|DELIVER IN PERSON|SHIP|unts wake. carefully ev +46208|566|57|6|33|48396.48|0.06|0.02|N|O|1997-09-27|1997-07-31|1997-09-30|COLLECT COD|FOB|usly regular accounts are fluffily bold pac +46209|90|91|1|38|37623.42|0.05|0.08|N|O|1996-08-17|1996-07-02|1996-09-09|TAKE BACK RETURN|FOB|al packages wake according to the b +46209|828|28|2|7|12101.74|0.08|0.05|N|O|1996-07-17|1996-08-02|1996-08-02|NONE|FOB|y even theodolites use quickly across the +46210|1782|83|1|48|80821.44|0.00|0.03|A|F|1994-11-11|1994-11-21|1994-11-23|TAKE BACK RETURN|SHIP|al accounts +46210|1783|68|2|36|60652.08|0.03|0.07|A|F|1994-10-10|1994-11-15|1994-11-04|COLLECT COD|SHIP|nal orbits are busily about t +46210|73|74|3|46|44761.22|0.03|0.05|A|F|1995-01-14|1994-11-04|1995-01-15|COLLECT COD|SHIP| carefully +46210|579|80|4|34|50305.38|0.08|0.00|R|F|1994-12-18|1994-12-19|1995-01-07|TAKE BACK RETURN|MAIL|usly carefully final dependencies. blithel +46210|319|76|5|31|37798.61|0.01|0.04|A|F|1994-11-15|1994-11-01|1994-12-04|DELIVER IN PERSON|REG AIR|ickly quick requests are blithel +46210|238|39|6|1|1138.23|0.10|0.01|A|F|1994-10-31|1994-12-21|1994-11-29|COLLECT COD|REG AIR| quickly ironic deposits +46211|1046|17|1|14|13258.56|0.03|0.07|A|F|1993-06-23|1993-08-28|1993-07-14|NONE|REG AIR|zle? special packages +46211|1596|97|2|4|5990.36|0.08|0.06|R|F|1993-08-17|1993-07-24|1993-08-21|DELIVER IN PERSON|REG AIR|en dependencies. carefully +46211|1706|33|3|41|65915.70|0.00|0.01|A|F|1993-08-04|1993-07-21|1993-08-20|NONE|RAIL|cross the accounts. slyly expre +46211|1106|43|4|36|36255.60|0.09|0.04|R|F|1993-07-25|1993-08-18|1993-08-17|COLLECT COD|MAIL|to the special pinto beans? +46212|1070|41|1|37|35929.59|0.06|0.05|R|F|1992-11-11|1992-12-09|1992-11-14|DELIVER IN PERSON|AIR|gular accounts sleep quickly. +46212|1445|46|2|45|60589.80|0.04|0.06|A|F|1992-10-05|1992-11-02|1992-10-11|COLLECT COD|FOB|n requests sleep slyly. furiou +46212|1568|69|3|15|22043.40|0.10|0.06|R|F|1992-11-11|1992-11-04|1992-12-10|COLLECT COD|RAIL|ously regular pinto beans +46213|1031|32|1|36|33553.08|0.09|0.08|A|F|1993-04-25|1993-03-15|1993-05-24|TAKE BACK RETURN|FOB| are furiously busily pending theodolite +46213|1593|94|2|49|73234.91|0.08|0.07|R|F|1993-03-05|1993-02-17|1993-03-19|COLLECT COD|REG AIR|ly alongside of the +46214|1599|100|1|34|51020.06|0.00|0.06|A|F|1993-05-03|1993-03-12|1993-05-10|TAKE BACK RETURN|SHIP|ependencies. stealthily final asymptotes ac +46214|572|33|2|40|58902.80|0.02|0.04|R|F|1993-03-04|1993-04-07|1993-03-19|COLLECT COD|FOB|bout the final requests. slyly express i +46215|1140|77|1|26|27069.64|0.04|0.01|R|F|1993-10-09|1993-10-19|1993-10-25|COLLECT COD|TRUCK|riously blithely special pi +46215|1625|49|2|1|1526.62|0.02|0.06|R|F|1993-10-30|1993-09-08|1993-11-14|COLLECT COD|RAIL|raids. fluffily reg +46215|1454|33|3|23|31175.35|0.04|0.08|A|F|1993-11-13|1993-10-18|1993-11-29|COLLECT COD|REG AIR|regular courts. carefully specia +46240|534|35|1|40|57381.20|0.05|0.03|R|F|1994-10-03|1994-12-23|1994-10-05|NONE|REG AIR|ng decoys boost carefully along the +46241|1547|88|1|10|14485.40|0.01|0.05|R|F|1994-07-13|1994-06-10|1994-08-05|TAKE BACK RETURN|REG AIR|y final deposits. slyly special frets b +46241|306|63|2|12|14475.60|0.03|0.00|A|F|1994-03-27|1994-05-27|1994-04-09|NONE|AIR|er the blithely pending forges. f +46241|654|86|3|49|76177.85|0.02|0.00|R|F|1994-03-28|1994-06-11|1994-03-31|NONE|TRUCK|iet deposit +46241|1638|80|4|33|50807.79|0.06|0.03|A|F|1994-05-17|1994-05-09|1994-05-19|COLLECT COD|REG AIR|y regular pinto +46241|808|42|5|47|80313.60|0.08|0.06|R|F|1994-07-06|1994-05-31|1994-07-11|COLLECT COD|FOB|according to the ironic, regular requests. +46241|216|44|6|12|13394.52|0.02|0.08|A|F|1994-03-17|1994-05-18|1994-03-20|TAKE BACK RETURN|REG AIR|t requests im +46242|961|64|1|31|57720.76|0.01|0.07|R|F|1993-11-11|1993-09-02|1993-12-07|COLLECT COD|TRUCK|ep blithely by the slyly ironic pinto bean +46242|705|2|2|8|12845.60|0.10|0.04|A|F|1993-10-27|1993-09-15|1993-11-19|TAKE BACK RETURN|AIR|ily across the bli +46243|983|52|1|12|22607.76|0.02|0.07|R|F|1992-04-23|1992-03-20|1992-05-13|DELIVER IN PERSON|SHIP|uctions past the r +46243|1125|26|2|33|33861.96|0.06|0.08|R|F|1992-03-11|1992-04-09|1992-04-09|DELIVER IN PERSON|MAIL|beans. ironic pinto bea +46243|1996|29|3|47|89205.53|0.06|0.03|R|F|1992-05-02|1992-04-05|1992-05-09|TAKE BACK RETURN|MAIL|nt deposits +46243|1932|33|4|31|56851.83|0.02|0.02|R|F|1992-05-11|1992-03-12|1992-06-05|DELIVER IN PERSON|AIR|riously after t +46243|1410|28|5|42|55079.22|0.07|0.03|A|F|1992-03-29|1992-03-09|1992-04-05|NONE|AIR|nto beans are slyly. slyly even accounts x +46243|1351|66|6|21|26299.35|0.00|0.06|A|F|1992-05-23|1992-04-07|1992-06-01|DELIVER IN PERSON|MAIL|phins. always fina +46244|1531|72|1|10|14325.30|0.10|0.06|R|F|1994-10-13|1994-09-27|1994-10-28|DELIVER IN PERSON|REG AIR| packages wake. +46244|221|49|2|25|28030.50|0.10|0.04|R|F|1994-10-13|1994-09-03|1994-10-19|DELIVER IN PERSON|FOB|lly ironic requests across the pending, +46244|1249|87|3|1|1150.24|0.00|0.03|R|F|1994-10-04|1994-08-05|1994-10-15|COLLECT COD|SHIP|the unusual ideas haggle carefully regular, +46244|563|64|4|1|1463.56|0.01|0.02|R|F|1994-08-08|1994-08-15|1994-08-21|DELIVER IN PERSON|AIR|ffily ironic requests hag +46245|1747|48|1|17|28028.58|0.07|0.04|N|O|1998-01-14|1997-12-23|1998-01-28|COLLECT COD|FOB| instructions boost. blithely final pa +46245|1576|77|2|28|41371.96|0.04|0.02|N|O|1997-12-30|1997-11-25|1998-01-15|TAKE BACK RETURN|FOB| pinto beans. dogged, regu +46246|543|34|1|19|27427.26|0.08|0.06|N|O|1998-04-23|1998-03-20|1998-05-06|TAKE BACK RETURN|REG AIR| among the sly +46246|1997|98|2|23|43676.77|0.08|0.00|N|O|1998-03-25|1998-04-03|1998-04-04|TAKE BACK RETURN|RAIL|n deposits cajole slyly. special requests +46246|1657|99|3|11|17145.15|0.06|0.01|N|O|1998-02-18|1998-03-31|1998-03-08|NONE|SHIP|carefully o +46246|1517|98|4|49|69506.99|0.08|0.05|N|O|1998-03-09|1998-04-08|1998-03-18|DELIVER IN PERSON|MAIL| bold requests sleep fluffily. ironic +46246|1090|61|5|7|6937.63|0.06|0.00|N|O|1998-02-02|1998-04-11|1998-03-02|COLLECT COD|REG AIR|pending accounts; dependencies sle +46247|751|48|1|47|77632.25|0.00|0.06|N|O|1996-10-12|1996-12-21|1996-10-15|TAKE BACK RETURN|RAIL|carefully si +46247|1019|55|2|45|41400.45|0.02|0.01|N|O|1996-09-28|1996-11-05|1996-10-07|NONE|REG AIR|y regular acc +46247|960|61|3|11|20470.56|0.05|0.01|N|O|1996-10-07|1996-12-16|1996-10-18|TAKE BACK RETURN|FOB|lphins. daring, enticing requests use slyl +46247|816|16|4|40|68672.40|0.03|0.01|N|O|1996-10-28|1996-12-09|1996-10-29|TAKE BACK RETURN|AIR|wake furiously unusual accounts. furiousl +46247|1702|87|5|1|1603.70|0.06|0.05|N|O|1996-12-19|1996-10-27|1996-12-21|NONE|TRUCK|y silent theodolites +46272|1143|44|1|21|21926.94|0.10|0.01|N|O|1996-05-11|1996-05-29|1996-06-06|TAKE BACK RETURN|SHIP|ounts. boldly regular theodolites wake +46272|730|95|2|12|19568.76|0.02|0.06|N|O|1996-03-16|1996-06-09|1996-04-09|DELIVER IN PERSON|TRUCK|r multiplier +46272|1594|15|3|42|62814.78|0.01|0.07|N|O|1996-06-07|1996-05-13|1996-07-07|COLLECT COD|SHIP|l deposits unwind after the quickly fina +46272|771|4|4|49|81916.73|0.03|0.00|N|O|1996-06-26|1996-05-27|1996-06-29|COLLECT COD|AIR| nag quick +46272|1022|23|5|35|32305.70|0.08|0.04|N|O|1996-06-16|1996-05-28|1996-06-22|DELIVER IN PERSON|MAIL|kages about the blithely bold excuse +46272|1762|89|6|45|74869.20|0.06|0.00|N|O|1996-04-02|1996-04-12|1996-04-13|COLLECT COD|RAIL| requests was quickl +46272|976|79|7|9|16892.73|0.03|0.07|N|O|1996-05-21|1996-06-07|1996-05-26|TAKE BACK RETURN|RAIL| fluffily. quickly regular ideas detec +46273|226|27|1|22|24776.84|0.00|0.08|N|O|1997-12-03|1997-09-27|1997-12-08|TAKE BACK RETURN|AIR| accounts. final asympto +46273|413|14|2|8|10507.28|0.01|0.06|N|O|1997-10-05|1997-10-03|1997-10-16|DELIVER IN PERSON|AIR|riously furiously final request +46273|640|72|3|13|20028.32|0.02|0.02|N|O|1997-09-29|1997-11-20|1997-10-11|COLLECT COD|MAIL|accounts hang +46273|237|38|4|18|20470.14|0.09|0.04|N|O|1997-10-15|1997-11-13|1997-11-03|TAKE BACK RETURN|AIR|es boost even ideas. furiously bold f +46274|524|85|1|11|15669.72|0.08|0.02|N|O|1997-04-06|1997-04-21|1997-04-25|NONE|RAIL|ven platelets. ironic +46274|1922|55|2|44|80252.48|0.04|0.07|N|O|1997-05-10|1997-03-30|1997-05-25|COLLECT COD|TRUCK|eas. enticingly silent +46274|811|12|3|17|29100.77|0.02|0.03|N|O|1997-03-19|1997-03-31|1997-03-29|COLLECT COD|MAIL| pending platelet +46274|588|19|4|5|7442.90|0.00|0.05|N|O|1997-05-17|1997-04-30|1997-06-12|TAKE BACK RETURN|FOB|silent dependencies +46274|1942|75|5|22|40566.68|0.08|0.04|N|O|1997-04-12|1997-05-15|1997-04-14|NONE|TRUCK|ffily according to the packages. +46274|1871|15|6|41|72687.67|0.02|0.06|N|O|1997-05-31|1997-04-16|1997-06-28|COLLECT COD|REG AIR|eposits detect alongsid +46275|778|11|1|20|33575.40|0.10|0.03|N|O|1997-04-29|1997-05-31|1997-05-01|TAKE BACK RETURN|MAIL|ffily express ideas wa +46275|1905|94|2|49|88538.10|0.06|0.07|N|O|1997-04-25|1997-07-16|1997-04-27|TAKE BACK RETURN|FOB|y bold ideas maintain close +46276|939|40|1|48|88316.64|0.06|0.00|R|F|1993-03-14|1993-02-08|1993-03-22|COLLECT COD|MAIL|even accounts affix +46276|1673|56|2|47|74009.49|0.08|0.05|A|F|1993-01-18|1993-02-04|1993-02-06|TAKE BACK RETURN|RAIL| ironic br +46276|34|35|3|8|7472.24|0.00|0.05|R|F|1993-02-06|1993-02-06|1993-02-28|COLLECT COD|SHIP|efully pending accounts are. blithely regu +46277|301|30|1|14|16818.20|0.00|0.00|N|O|1997-02-02|1997-01-30|1997-02-23|TAKE BACK RETURN|MAIL|ickly final foxes cajole furiously. +46277|831|32|2|25|43295.75|0.06|0.07|N|O|1996-12-06|1997-02-01|1996-12-23|TAKE BACK RETURN|TRUCK|ar requests d +46278|774|39|1|36|60291.72|0.07|0.02|N|O|1997-12-28|1997-11-09|1998-01-02|TAKE BACK RETURN|SHIP| even deposit +46278|452|82|2|20|27049.00|0.07|0.08|N|O|1997-11-22|1997-12-28|1997-12-09|COLLECT COD|FOB|ingly regular hockey players use +46278|863|63|3|14|24694.04|0.04|0.05|N|O|1997-10-06|1997-11-16|1997-11-04|COLLECT COD|FOB|efully final +46278|1255|56|4|28|32375.00|0.10|0.02|N|O|1998-01-24|1997-12-27|1998-02-02|COLLECT COD|SHIP|gle around the quickly final theodolites. r +46278|1084|20|5|25|24627.00|0.03|0.04|N|O|1997-12-02|1997-12-31|1997-12-17|TAKE BACK RETURN|TRUCK|ular dependenc +46278|626|58|6|32|48851.84|0.03|0.07|N|O|1997-12-15|1997-12-12|1997-12-28|TAKE BACK RETURN|FOB|fluffily after the speci +46278|1649|32|7|20|31012.80|0.04|0.07|N|O|1997-12-23|1997-11-29|1997-12-31|NONE|REG AIR|ove the furiously unusual pl +46279|1842|43|1|4|6975.36|0.05|0.08|N|O|1997-09-12|1997-09-09|1997-10-01|DELIVER IN PERSON|FOB|gle carefully accor +46279|94|20|2|27|26840.43|0.04|0.08|N|O|1997-07-26|1997-09-12|1997-08-04|NONE|FOB|ly among the special theodolites. fluffily +46279|1526|47|3|24|34260.48|0.07|0.08|N|O|1997-08-22|1997-08-22|1997-09-05|TAKE BACK RETURN|TRUCK|round the even, spe +46279|37|38|4|25|23425.75|0.00|0.05|N|O|1997-10-20|1997-08-12|1997-10-27|TAKE BACK RETURN|MAIL|ly. furiousl +46279|1453|32|5|9|12190.05|0.09|0.01|N|O|1997-08-13|1997-08-20|1997-08-26|TAKE BACK RETURN|FOB|usly silent requests. carefully final f +46279|848|82|6|43|75200.12|0.07|0.08|N|O|1997-08-18|1997-08-06|1997-09-13|TAKE BACK RETURN|TRUCK|dependencies. quickly +46279|775|40|7|1|1675.77|0.02|0.07|N|O|1997-08-28|1997-08-07|1997-09-23|DELIVER IN PERSON|RAIL|e slyly even excu +46304|1712|39|1|37|59707.27|0.04|0.01|N|O|1996-03-04|1996-02-06|1996-03-22|TAKE BACK RETURN|MAIL|lyly even ideas. express packages +46304|1312|89|2|24|29119.44|0.09|0.04|N|O|1996-01-17|1996-02-07|1996-01-27|TAKE BACK RETURN|TRUCK|g packages sl +46304|1769|96|3|42|70171.92|0.00|0.01|N|O|1995-11-28|1996-01-19|1995-12-24|TAKE BACK RETURN|FOB| foxes. perman +46304|1103|12|4|48|48196.80|0.09|0.01|N|O|1995-11-25|1995-12-30|1995-11-27|COLLECT COD|SHIP|oxes. slyly i +46305|1340|55|1|25|31033.50|0.01|0.06|N|O|1995-08-26|1995-09-14|1995-09-14|NONE|TRUCK|olites haggle slyly. slyly regular depos +46306|1874|18|1|9|15982.83|0.00|0.01|N|O|1998-08-19|1998-06-28|1998-08-27|COLLECT COD|MAIL| are. finally final frays +46306|1321|36|2|19|23224.08|0.07|0.08|N|O|1998-08-19|1998-06-29|1998-08-29|DELIVER IN PERSON|SHIP|r pains sleep requests. +46307|965|100|1|9|16793.64|0.04|0.05|A|F|1995-05-16|1995-05-06|1995-05-18|NONE|RAIL|ironic requests. carefully +46307|884|84|2|44|78534.72|0.00|0.01|R|F|1995-04-23|1995-05-02|1995-04-27|TAKE BACK RETURN|SHIP|ver final theodolites maintain slyly ir +46307|1978|79|3|48|90238.56|0.05|0.03|A|F|1995-05-08|1995-04-23|1995-05-09|COLLECT COD|MAIL| express excuses above the sometimes ir +46308|986|89|1|25|47174.50|0.02|0.01|N|O|1996-09-06|1996-09-05|1996-09-22|TAKE BACK RETURN|MAIL|ans sleep qui +46308|365|50|2|17|21511.12|0.04|0.00|N|O|1996-06-23|1996-09-06|1996-07-02|TAKE BACK RETURN|RAIL|e the slyly regular excuses sleep al +46308|602|65|3|8|12020.80|0.03|0.02|N|O|1996-09-03|1996-08-31|1996-09-22|TAKE BACK RETURN|AIR|posits use quickly carefully dogged +46308|1021|22|4|21|19362.42|0.02|0.08|N|O|1996-09-18|1996-08-27|1996-09-25|DELIVER IN PERSON|RAIL|ly bold deposit +46308|293|75|5|9|10739.61|0.08|0.01|N|O|1996-10-08|1996-08-25|1996-10-20|TAKE BACK RETURN|SHIP|ven ideas boost +46309|1270|71|1|43|50364.61|0.10|0.07|R|F|1993-12-10|1994-01-08|1993-12-16|NONE|MAIL|carefully final instru +46309|312|41|2|49|59403.19|0.10|0.01|R|F|1994-02-12|1993-12-16|1994-02-26|NONE|SHIP|the silent accounts. regular +46309|580|41|3|4|5922.32|0.08|0.04|A|F|1994-01-05|1993-12-14|1994-01-15|NONE|FOB|furiously ironic platelet +46309|649|43|4|12|18595.68|0.09|0.07|R|F|1993-11-29|1994-01-08|1993-12-08|TAKE BACK RETURN|REG AIR|ld asymptotes are bli +46309|1732|33|5|33|53913.09|0.04|0.04|A|F|1993-11-12|1993-12-27|1993-11-14|NONE|AIR|al pains above the slyly bo +46309|1220|32|6|27|30272.94|0.07|0.08|A|F|1994-01-02|1993-12-16|1994-01-11|DELIVER IN PERSON|FOB| accounts. blithely ironic accounts sleep b +46310|1447|65|1|31|41801.64|0.01|0.05|R|F|1993-08-12|1993-09-15|1993-08-28|TAKE BACK RETURN|TRUCK|nding deposits cajole caref +46310|1402|42|2|41|53439.40|0.00|0.08|R|F|1993-08-28|1993-10-02|1993-09-07|TAKE BACK RETURN|SHIP|ect blithely even, fi +46310|748|13|3|23|37921.02|0.04|0.08|R|F|1993-08-05|1993-08-23|1993-08-24|DELIVER IN PERSON|TRUCK|ular theodolites according to the f +46310|1384|23|4|40|51415.20|0.04|0.06|R|F|1993-09-28|1993-09-28|1993-10-09|TAKE BACK RETURN|FOB|iously ironic courts. furiously specia +46310|1749|76|5|48|79235.52|0.01|0.01|A|F|1993-10-19|1993-08-29|1993-11-06|NONE|MAIL|ly unusual deposits according to +46310|990|93|6|47|88876.53|0.10|0.05|A|F|1993-10-15|1993-09-12|1993-11-06|DELIVER IN PERSON|FOB|fully enticing dependencies wake. care +46310|1227|39|7|15|16923.30|0.04|0.04|A|F|1993-09-01|1993-09-28|1993-09-04|DELIVER IN PERSON|FOB|le regular req +46311|1539|80|1|28|40334.84|0.03|0.04|N|O|1995-10-27|1995-08-25|1995-11-02|NONE|RAIL|aring instruct +46311|716|81|2|47|75985.37|0.01|0.08|N|O|1995-10-13|1995-10-16|1995-11-04|TAKE BACK RETURN|FOB| ironic deposits. furiousl +46311|240|22|3|13|14823.12|0.06|0.05|N|O|1995-11-07|1995-09-19|1995-12-06|TAKE BACK RETURN|MAIL|e unusual, pending reques +46311|1605|6|4|23|34651.80|0.02|0.01|N|O|1995-09-03|1995-09-11|1995-09-11|TAKE BACK RETURN|AIR| requests l +46311|1416|17|5|37|48744.17|0.09|0.05|N|O|1995-08-31|1995-09-30|1995-09-13|DELIVER IN PERSON|SHIP|n escapades. blithely bold requests +46311|653|16|6|45|69914.25|0.08|0.06|N|O|1995-08-05|1995-09-11|1995-09-01|NONE|RAIL|neath the +46336|1327|42|1|31|38077.92|0.04|0.07|N|O|1995-10-05|1995-09-17|1995-10-16|TAKE BACK RETURN|RAIL|ular deposits nag carefully +46336|1355|32|2|47|59048.45|0.09|0.08|N|O|1995-09-01|1995-10-01|1995-09-29|NONE|MAIL|ake in place of the slyl +46337|1862|63|1|29|51151.94|0.10|0.02|R|F|1992-07-21|1992-05-31|1992-07-31|DELIVER IN PERSON|TRUCK|print along +46338|429|17|1|45|59823.90|0.02|0.08|N|O|1997-06-30|1997-06-26|1997-07-18|TAKE BACK RETURN|FOB| foxes. blithely i +46338|559|60|2|2|2919.10|0.06|0.05|N|O|1997-07-19|1997-05-27|1997-08-17|COLLECT COD|FOB|ar the excuses; ironic, brave packages are +46338|1677|78|3|49|77354.83|0.06|0.08|N|O|1997-04-29|1997-05-25|1997-05-12|TAKE BACK RETURN|FOB|lithely final deposits. furiously express r +46338|1122|59|4|36|36832.32|0.07|0.03|N|O|1997-06-22|1997-05-22|1997-06-30|DELIVER IN PERSON|FOB|ronic packages are slyly quickly +46338|226|27|5|6|6757.32|0.08|0.01|N|O|1997-05-28|1997-05-03|1997-06-24|TAKE BACK RETURN|REG AIR|y across the furiously +46338|1587|68|6|30|44657.40|0.00|0.08|N|O|1997-05-02|1997-05-02|1997-05-11|TAKE BACK RETURN|TRUCK|odolites. quickly regular orb +46338|729|30|7|8|13037.76|0.04|0.07|N|O|1997-06-24|1997-05-28|1997-07-13|DELIVER IN PERSON|RAIL|yly about the carefully regular multipliers +46339|681|75|1|19|30051.92|0.02|0.01|R|F|1994-07-19|1994-08-10|1994-07-27|COLLECT COD|TRUCK|gular, final id +46339|1656|80|2|13|20249.45|0.01|0.06|R|F|1994-07-11|1994-08-24|1994-08-07|DELIVER IN PERSON|MAIL|platelets haggle quickly. regularly +46339|3|79|3|26|23478.00|0.00|0.00|A|F|1994-07-25|1994-08-28|1994-08-20|COLLECT COD|SHIP|ounts cajole across the pending a +46339|620|83|4|44|66907.28|0.04|0.04|A|F|1994-07-21|1994-09-24|1994-07-28|COLLECT COD|MAIL|y. carefully express pinto beans +46339|440|70|5|44|58979.36|0.08|0.06|A|F|1994-10-14|1994-08-07|1994-11-07|DELIVER IN PERSON|TRUCK|tegrate alongside of the i +46339|1280|92|6|14|16537.92|0.04|0.05|A|F|1994-07-23|1994-09-15|1994-08-14|TAKE BACK RETURN|AIR| instructions wake slyly regular p +46340|824|24|1|31|53469.42|0.06|0.02|A|F|1992-07-14|1992-06-28|1992-07-19|DELIVER IN PERSON|FOB|ly unusual dolphins. carefully ironic +46340|1224|36|2|11|12377.42|0.01|0.01|R|F|1992-06-25|1992-07-12|1992-06-28|TAKE BACK RETURN|FOB| dependencies haggle across the reg +46341|311|40|1|1|1211.31|0.00|0.02|A|F|1995-03-02|1995-03-08|1995-03-22|NONE|RAIL| special realms. idly regular packages wak +46341|1705|90|2|40|64268.00|0.04|0.08|A|F|1995-01-11|1995-03-13|1995-02-06|TAKE BACK RETURN|RAIL|r packages along t +46341|582|73|3|16|23721.28|0.03|0.01|A|F|1995-02-16|1995-02-05|1995-02-17|COLLECT COD|SHIP|ng deposit +46341|850|84|4|28|49023.80|0.08|0.04|A|F|1995-01-03|1995-03-08|1995-01-08|COLLECT COD|AIR|lar dolphins along the ca +46341|690|84|5|47|74762.43|0.03|0.01|A|F|1995-04-18|1995-03-04|1995-04-26|DELIVER IN PERSON|RAIL|asymptotes are slyly special p +46341|1436|15|6|40|53497.20|0.04|0.03|R|F|1995-02-27|1995-03-11|1995-03-12|DELIVER IN PERSON|SHIP|he final packages. quickly ironic requ +46342|175|54|1|36|38706.12|0.05|0.03|R|F|1994-07-07|1994-07-18|1994-08-06|COLLECT COD|AIR|the carefull +46342|1303|4|2|10|12043.00|0.08|0.08|A|F|1994-06-16|1994-08-14|1994-06-27|NONE|MAIL| integrate +46342|187|40|3|49|53271.82|0.05|0.04|R|F|1994-09-24|1994-08-27|1994-10-15|NONE|TRUCK| carefully ironic requests use +46342|1051|87|4|17|16184.85|0.04|0.07|R|F|1994-07-01|1994-08-05|1994-07-22|DELIVER IN PERSON|MAIL|leep slyly fluffily r +46342|1147|84|5|19|19914.66|0.07|0.05|R|F|1994-08-25|1994-08-13|1994-08-27|TAKE BACK RETURN|MAIL|at the carefully express accounts. quickl +46342|1550|71|6|12|17418.60|0.06|0.07|R|F|1994-06-04|1994-08-11|1994-06-12|TAKE BACK RETURN|AIR|he furiously regular deposits. express pack +46342|420|50|7|6|7922.52|0.06|0.03|A|F|1994-08-07|1994-07-24|1994-08-31|TAKE BACK RETURN|FOB|posits boost fluffily furi +46343|452|82|1|23|31106.35|0.01|0.05|N|O|1997-10-22|1997-11-26|1997-11-11|NONE|MAIL|o beans. accounts above +46343|1183|92|2|43|46619.74|0.00|0.07|N|O|1997-12-31|1997-12-18|1998-01-24|NONE|TRUCK|x quickly carefully final +46343|107|60|3|39|39276.90|0.08|0.06|N|O|1997-10-03|1997-12-02|1997-11-02|COLLECT COD|RAIL| finally al +46343|546|37|4|28|40503.12|0.10|0.00|N|O|1997-10-28|1997-11-11|1997-11-19|NONE|TRUCK| quickly quickly iron +46368|494|53|1|9|12550.41|0.09|0.05|A|F|1992-08-12|1992-07-08|1992-08-21|COLLECT COD|RAIL|ously fina +46368|459|18|2|12|16313.40|0.02|0.08|A|F|1992-07-30|1992-06-02|1992-08-22|DELIVER IN PERSON|REG AIR| sleep furiously +46368|926|95|3|33|60288.36|0.02|0.04|R|F|1992-06-26|1992-06-01|1992-07-06|DELIVER IN PERSON|FOB| slyly above the enticingly specia +46368|1905|94|4|35|63241.50|0.05|0.06|A|F|1992-04-28|1992-07-02|1992-05-28|COLLECT COD|MAIL|unts wake ac +46368|1932|65|5|2|3667.86|0.01|0.05|R|F|1992-08-06|1992-06-12|1992-08-12|COLLECT COD|MAIL|hely final, regular instructions. accoun +46368|1943|76|6|49|90402.06|0.06|0.05|A|F|1992-06-16|1992-07-22|1992-07-03|DELIVER IN PERSON|REG AIR|carefully final +46368|488|89|7|4|5553.92|0.02|0.05|R|F|1992-08-01|1992-07-04|1992-08-05|TAKE BACK RETURN|TRUCK|. slyly unusual dependencies x +46369|762|59|1|48|79812.48|0.07|0.08|N|O|1997-05-09|1997-07-15|1997-05-30|COLLECT COD|SHIP|he blithely regular deposits. +46369|225|7|2|1|1125.22|0.03|0.00|N|O|1997-06-29|1997-07-13|1997-07-12|TAKE BACK RETURN|MAIL|lets cajole blithely. r +46369|478|8|3|8|11027.76|0.01|0.05|N|O|1997-08-03|1997-07-07|1997-09-02|COLLECT COD|FOB|s. final dolp +46369|1846|47|4|4|6991.36|0.01|0.01|N|O|1997-05-10|1997-06-03|1997-06-05|COLLECT COD|RAIL|uickly special packages. slyly bold shea +46369|1297|9|5|34|40741.86|0.07|0.03|N|O|1997-08-14|1997-06-08|1997-08-27|COLLECT COD|TRUCK|lly by the quickly silent packages. f +46369|370|71|6|23|29218.51|0.08|0.00|N|O|1997-07-10|1997-06-04|1997-07-30|NONE|MAIL| the bold pains boos +46370|1289|90|1|7|8331.96|0.07|0.08|N|O|1998-04-14|1998-02-13|1998-04-29|COLLECT COD|TRUCK| asymptotes-- caref +46371|133|12|1|50|51656.50|0.04|0.04|A|F|1994-09-07|1994-11-30|1994-09-15|TAKE BACK RETURN|REG AIR|y bold depo +46371|1394|33|2|29|37566.31|0.08|0.08|A|F|1994-09-17|1994-11-09|1994-10-11|COLLECT COD|REG AIR|thely ironic deposits. sly +46372|1443|61|1|8|10755.52|0.05|0.01|A|F|1995-03-06|1995-04-18|1995-03-09|DELIVER IN PERSON|FOB|final epitaphs. express acco +46372|1229|41|2|47|53120.34|0.09|0.02|R|F|1995-03-11|1995-04-14|1995-04-09|TAKE BACK RETURN|SHIP|uickly among the slyly ironic plat +46372|1788|31|3|15|25346.70|0.01|0.05|A|F|1995-05-21|1995-04-14|1995-06-04|NONE|RAIL|ooze carefully along the sly +46372|669|1|4|1|1569.66|0.02|0.04|R|F|1995-04-06|1995-05-25|1995-04-16|TAKE BACK RETURN|REG AIR|blithely bold deposits. slyly unusual d +46372|1244|19|5|24|27485.76|0.10|0.05|R|F|1995-03-05|1995-05-04|1995-03-08|TAKE BACK RETURN|REG AIR|y pending pinto beans. blithely unusu +46372|1966|99|6|15|28019.40|0.05|0.04|A|F|1995-05-16|1995-05-27|1995-06-14|NONE|SHIP|eans nag blithely. care +46373|130|83|1|26|26783.38|0.09|0.06|N|O|1998-02-02|1998-02-23|1998-02-11|COLLECT COD|FOB|ng waters use q +46374|1728|29|1|6|9778.32|0.07|0.02|A|F|1993-11-03|1993-10-06|1993-11-16|TAKE BACK RETURN|REG AIR|thely even platelet +46374|412|100|2|28|36747.48|0.08|0.02|A|F|1993-08-08|1993-08-13|1993-08-19|NONE|REG AIR|s. blithely special requests hagg +46374|1834|21|3|49|85055.67|0.09|0.06|R|F|1993-11-06|1993-09-18|1993-11-30|COLLECT COD|SHIP|ainst the even, careful courts cajole +46374|1249|87|4|29|33356.96|0.04|0.08|R|F|1993-07-24|1993-09-09|1993-08-08|TAKE BACK RETURN|FOB|s. quickly regular instructions +46374|1465|5|5|38|51925.48|0.09|0.02|A|F|1993-09-16|1993-08-16|1993-09-25|NONE|REG AIR|riously around the slyly regular +46374|1956|1|6|19|35301.05|0.00|0.00|A|F|1993-07-31|1993-08-19|1993-08-09|COLLECT COD|REG AIR|print furiou +46374|461|49|7|30|40843.80|0.08|0.07|R|F|1993-07-19|1993-08-25|1993-08-18|NONE|MAIL|. deposits sleep furiously alo +46375|1468|86|1|15|20541.90|0.08|0.05|A|F|1993-10-19|1993-11-12|1993-11-01|NONE|REG AIR|iously even dependencies det +46375|392|21|2|29|37479.31|0.05|0.01|R|F|1993-08-28|1993-10-16|1993-08-31|COLLECT COD|RAIL| quick warhorses integrate furiously a +46375|1888|32|3|44|78754.72|0.04|0.03|A|F|1993-12-26|1993-10-10|1994-01-15|DELIVER IN PERSON|FOB|cajole fluffily eve +46375|304|33|4|31|37333.30|0.04|0.07|A|F|1993-10-21|1993-11-24|1993-11-04|DELIVER IN PERSON|AIR| quickly regular theodolites boost +46375|741|6|5|27|44326.98|0.09|0.02|A|F|1993-09-27|1993-10-14|1993-10-26|COLLECT COD|FOB|se furiously final, ironic requests. f +46400|1784|27|1|44|74174.32|0.07|0.06|N|O|1997-06-21|1997-05-23|1997-06-30|DELIVER IN PERSON|REG AIR|y special packages promise. bold, silen +46400|156|83|2|45|47526.75|0.09|0.07|N|O|1997-03-21|1997-03-26|1997-03-29|COLLECT COD|SHIP| even requests. theodolites s +46400|220|2|3|36|40327.92|0.00|0.02|N|O|1997-06-15|1997-04-02|1997-06-28|COLLECT COD|AIR|serve carefully ab +46401|1171|72|1|32|34309.44|0.01|0.05|N|O|1998-08-19|1998-06-13|1998-08-29|DELIVER IN PERSON|RAIL| regular req +46401|1187|60|2|5|5440.90|0.09|0.00|N|O|1998-06-20|1998-06-15|1998-06-30|TAKE BACK RETURN|AIR|posits nag furiously above the b +46401|1977|66|3|17|31942.49|0.01|0.04|N|O|1998-07-08|1998-05-31|1998-07-15|NONE|MAIL|refully across t +46401|1145|54|4|5|5230.70|0.04|0.07|N|O|1998-05-30|1998-06-19|1998-06-22|TAKE BACK RETURN|SHIP|ffily unusual accounts. bli +46401|1320|35|5|10|12213.20|0.10|0.08|N|O|1998-05-20|1998-07-04|1998-06-05|COLLECT COD|FOB|ar accounts. quickly special +46402|93|69|1|40|39723.60|0.03|0.06|A|F|1995-01-30|1995-03-20|1995-02-06|DELIVER IN PERSON|REG AIR|ending, sly +46402|1255|67|2|6|6937.50|0.04|0.01|A|F|1995-03-27|1995-02-08|1995-04-18|TAKE BACK RETURN|MAIL|usual foxes. slyly express id +46402|1498|16|3|10|13994.90|0.03|0.07|A|F|1995-02-16|1995-02-23|1995-02-18|COLLECT COD|MAIL|ckages haggle unusual +46402|27|78|4|16|14832.32|0.00|0.01|A|F|1995-02-07|1995-03-13|1995-02-21|DELIVER IN PERSON|TRUCK|mong the final deposits. sautern +46402|1215|27|5|25|27905.25|0.05|0.05|R|F|1995-04-09|1995-03-11|1995-05-06|TAKE BACK RETURN|FOB| regular, ironic dependencie +46402|104|31|6|17|17069.70|0.10|0.01|R|F|1995-03-19|1995-04-09|1995-04-07|DELIVER IN PERSON|MAIL|ruthlessly instructions. quickly unu +46402|1743|70|7|36|59210.64|0.08|0.02|R|F|1995-02-02|1995-03-15|1995-03-02|COLLECT COD|MAIL|ar, regular instructio +46403|218|100|1|50|55910.50|0.10|0.02|R|F|1994-09-17|1994-07-27|1994-09-27|COLLECT COD|MAIL| theodolites nod about the furiously un +46403|1073|44|2|39|37988.73|0.07|0.03|A|F|1994-07-25|1994-07-14|1994-08-03|DELIVER IN PERSON|TRUCK|gainst the quickly final packages nag +46403|827|27|3|28|48378.96|0.06|0.06|R|F|1994-07-30|1994-07-10|1994-08-14|DELIVER IN PERSON|SHIP|uests; carefully regul +46404|483|42|1|10|13834.80|0.02|0.05|R|F|1992-07-03|1992-05-07|1992-07-26|TAKE BACK RETURN|REG AIR|e quickly unusual pains +46404|244|72|2|2|2288.48|0.03|0.03|A|F|1992-04-12|1992-04-12|1992-04-19|DELIVER IN PERSON|MAIL|the slyly iro +46404|348|49|3|11|13731.74|0.10|0.04|R|F|1992-05-18|1992-04-18|1992-05-29|NONE|REG AIR|sits. ironic asymptotes sleep ins +46404|871|38|4|31|54927.97|0.08|0.04|A|F|1992-03-14|1992-04-18|1992-03-21|DELIVER IN PERSON|SHIP|ckages doubt carefully across the +46404|75|26|5|29|28277.03|0.08|0.07|R|F|1992-04-01|1992-05-10|1992-04-05|COLLECT COD|TRUCK|lites: daring +46405|1710|95|1|48|77362.08|0.09|0.05|A|F|1993-04-02|1993-03-01|1993-04-03|NONE|RAIL|y even foxes x-ray ent +46405|1626|9|2|11|16803.82|0.04|0.05|R|F|1993-03-15|1993-03-29|1993-04-12|DELIVER IN PERSON|FOB|ackages. theodolites afte +46405|941|44|3|48|88413.12|0.00|0.08|A|F|1993-03-16|1993-03-28|1993-04-02|TAKE BACK RETURN|FOB|sual accounts +46405|690|53|4|34|54083.46|0.00|0.06|A|F|1993-01-07|1993-02-06|1993-01-30|DELIVER IN PERSON|TRUCK|pinto beans sleep carefully speci +46406|1536|77|1|39|56063.67|0.08|0.06|N|O|1998-07-18|1998-08-17|1998-07-24|DELIVER IN PERSON|AIR|ding requests. slyly pending p +46406|1641|24|2|38|58620.32|0.06|0.08|N|O|1998-10-19|1998-08-15|1998-11-05|NONE|SHIP| detect blithely pending package +46406|327|84|3|35|42956.20|0.05|0.04|N|O|1998-09-24|1998-09-24|1998-10-11|TAKE BACK RETURN|RAIL| fluffily bold requests. regular pai +46406|87|38|4|35|34547.80|0.09|0.06|N|O|1998-09-21|1998-08-26|1998-10-16|DELIVER IN PERSON|AIR|nly express decoys. spe +46406|645|39|5|18|27821.52|0.10|0.00|N|O|1998-10-16|1998-10-03|1998-11-14|TAKE BACK RETURN|AIR|ular accounts. blithely unus +46407|1231|6|1|27|30570.21|0.00|0.04|R|F|1994-03-29|1994-04-28|1994-04-01|TAKE BACK RETURN|SHIP|egrate about the silently pending grouch +46432|935|36|1|16|29374.88|0.04|0.03|A|F|1994-05-15|1994-06-30|1994-06-08|DELIVER IN PERSON|RAIL|ndencies nag slyly carefully unusual +46432|1791|34|2|19|32163.01|0.04|0.06|R|F|1994-08-03|1994-06-23|1994-08-22|DELIVER IN PERSON|AIR|uests use carefully sly +46432|810|10|3|44|75275.64|0.00|0.02|R|F|1994-06-25|1994-06-28|1994-07-22|NONE|RAIL|ly ironic requests kin +46432|318|3|4|3|3654.93|0.10|0.06|R|F|1994-06-05|1994-07-23|1994-06-21|NONE|RAIL|fully final deposits. slyly stealthy deposi +46432|1226|1|5|33|37198.26|0.06|0.06|R|F|1994-05-25|1994-06-05|1994-05-26|DELIVER IN PERSON|SHIP|ly final deposits. silent theodolites hag +46433|664|27|1|14|21905.24|0.10|0.04|N|O|1996-02-28|1996-03-06|1996-03-17|TAKE BACK RETURN|TRUCK|pecial requests. furious +46433|1188|61|2|25|27229.50|0.06|0.03|N|O|1996-02-01|1996-03-22|1996-02-29|COLLECT COD|AIR|egular theodolites haggle slyly about the +46433|1386|63|3|30|38621.40|0.00|0.00|N|O|1996-01-01|1996-03-01|1996-01-20|TAKE BACK RETURN|SHIP|d foxes. quickly sp +46433|926|95|4|28|51153.76|0.06|0.07|N|O|1996-01-08|1996-03-29|1996-02-07|DELIVER IN PERSON|AIR|nstructions are carefully +46433|1202|77|5|16|17651.20|0.04|0.04|N|O|1996-02-10|1996-03-10|1996-02-13|TAKE BACK RETURN|REG AIR|nal dependenc +46434|739|72|1|3|4919.19|0.03|0.06|A|F|1993-05-05|1993-06-24|1993-05-14|DELIVER IN PERSON|AIR|gular request +46434|947|16|2|7|12935.58|0.04|0.06|R|F|1993-05-22|1993-05-25|1993-06-13|NONE|REG AIR|ackages acc +46434|411|41|3|22|28851.02|0.04|0.08|R|F|1993-07-17|1993-06-10|1993-07-21|DELIVER IN PERSON|RAIL|kages boost! blithely final packag +46435|1537|38|1|31|44594.43|0.02|0.02|N|O|1996-12-10|1997-01-20|1997-01-05|COLLECT COD|RAIL|tions-- pe +46435|1580|61|2|2|2963.16|0.10|0.01|N|O|1997-02-06|1996-12-28|1997-02-27|TAKE BACK RETURN|SHIP| excuses cajole +46435|811|11|3|21|35948.01|0.04|0.01|N|O|1996-12-06|1997-01-05|1996-12-17|TAKE BACK RETURN|FOB|. carefully even platel +46435|1914|59|4|7|12711.37|0.06|0.03|N|O|1996-12-25|1996-12-29|1997-01-20|NONE|FOB|ully regular excuses. unusua +46435|671|3|5|36|56580.12|0.00|0.05|N|O|1997-01-09|1997-02-04|1997-01-13|NONE|SHIP|nusual deposits. slyly unu +46435|500|30|6|11|15405.50|0.00|0.02|N|O|1997-02-11|1996-12-24|1997-02-22|COLLECT COD|RAIL|rding to the even, +46435|1851|52|7|43|75372.55|0.04|0.02|N|O|1997-01-14|1996-12-24|1997-02-10|DELIVER IN PERSON|SHIP|jole carefully a +46436|1909|10|1|41|74246.90|0.02|0.02|A|F|1994-06-29|1994-05-08|1994-07-09|COLLECT COD|REG AIR|impress. even deposits mold. pinto +46436|1087|23|2|38|37547.04|0.06|0.00|A|F|1994-06-15|1994-05-30|1994-06-29|NONE|RAIL|ng to the bold deposits: quickly even id +46436|1294|95|3|7|8367.03|0.07|0.02|R|F|1994-05-06|1994-05-06|1994-05-09|TAKE BACK RETURN|TRUCK|ve the accounts. busy deposits nag +46436|712|9|4|39|62895.69|0.07|0.05|R|F|1994-05-25|1994-05-08|1994-06-03|COLLECT COD|FOB|to beans engage carefull +46436|918|87|5|46|83669.86|0.09|0.07|A|F|1994-05-31|1994-06-19|1994-06-24|DELIVER IN PERSON|FOB|ore the blithely pending asympto +46437|861|28|1|37|65188.82|0.05|0.07|R|F|1994-09-26|1994-11-08|1994-10-01|DELIVER IN PERSON|SHIP|structions haggle daringly +46438|1206|81|1|19|21036.80|0.08|0.05|A|F|1994-06-26|1994-07-11|1994-07-21|TAKE BACK RETURN|SHIP|s. daringly special ide +46438|1915|16|2|31|56324.21|0.09|0.04|A|F|1994-09-05|1994-07-10|1994-10-03|NONE|REG AIR|nst the furiously special Tiresias. unusual +46439|582|83|1|11|16308.38|0.04|0.08|N|O|1998-07-18|1998-08-19|1998-07-23|COLLECT COD|TRUCK|gular excuses cajole c +46464|201|56|1|45|49554.00|0.01|0.04|N|O|1997-05-06|1997-04-24|1997-05-19|NONE|RAIL|rts affix slyly; thin accou +46465|1544|65|1|34|49148.36|0.08|0.02|A|F|1994-07-15|1994-06-28|1994-07-21|NONE|SHIP| bold packages haggle furiously +46465|1867|11|2|5|8844.30|0.04|0.06|R|F|1994-05-15|1994-06-11|1994-06-04|DELIVER IN PERSON|REG AIR|kly after the express d +46465|1803|33|3|11|18752.80|0.08|0.05|A|F|1994-08-04|1994-07-17|1994-08-18|TAKE BACK RETURN|SHIP|counts doze fluffil +46465|1118|91|4|50|50955.50|0.06|0.03|R|F|1994-05-18|1994-07-15|1994-05-23|TAKE BACK RETURN|AIR| use across the +46465|652|84|5|33|51237.45|0.04|0.04|R|F|1994-07-13|1994-07-08|1994-08-01|NONE|TRUCK|ruthlessly regular packa +46465|847|47|6|7|12234.88|0.05|0.02|R|F|1994-07-18|1994-06-10|1994-07-22|DELIVER IN PERSON|TRUCK|ar instructio +46466|414|2|1|21|27602.61|0.10|0.00|R|F|1992-05-03|1992-05-02|1992-05-26|TAKE BACK RETURN|MAIL|detect slyly furiously regular accou +46466|1719|4|2|48|77794.08|0.10|0.04|R|F|1992-04-13|1992-04-03|1992-04-22|COLLECT COD|REG AIR|al sentiments. express deposit +46466|1069|70|3|40|38802.40|0.04|0.00|A|F|1992-05-16|1992-04-24|1992-06-01|TAKE BACK RETURN|TRUCK|uests cajole carefully. slyly ironic acco +46466|689|21|4|1|1589.68|0.09|0.05|A|F|1992-04-14|1992-03-23|1992-05-06|COLLECT COD|REG AIR|counts are slyly above t +46466|1947|36|5|33|61015.02|0.08|0.06|R|F|1992-03-15|1992-05-01|1992-03-21|COLLECT COD|FOB|es sleep b +46466|1084|90|6|3|2955.24|0.03|0.03|R|F|1992-03-17|1992-05-03|1992-03-27|COLLECT COD|RAIL|ly across th +46467|364|49|1|20|25287.20|0.07|0.07|N|O|1998-07-17|1998-07-08|1998-08-14|TAKE BACK RETURN|SHIP|s above the careful +46468|896|63|1|10|17968.90|0.03|0.03|R|F|1995-02-11|1995-03-16|1995-02-14|DELIVER IN PERSON|FOB|jole ruthlessly among the furiously bol +46468|1040|41|2|48|45169.92|0.02|0.02|R|F|1995-01-20|1995-02-12|1995-02-08|NONE|TRUCK|n the furiously pend +46468|202|84|3|36|39679.20|0.09|0.05|A|F|1995-04-19|1995-03-19|1995-04-27|DELIVER IN PERSON|AIR|slowly pending ideas are furiou +46468|1144|17|4|3|3135.42|0.05|0.00|A|F|1995-03-09|1995-03-01|1995-03-23|COLLECT COD|RAIL|e after the fluffily final foxes. requests +46468|1329|68|5|18|22145.76|0.09|0.00|R|F|1995-05-05|1995-02-27|1995-05-21|DELIVER IN PERSON|AIR|haggle slyly even +46468|1144|17|6|32|33444.48|0.00|0.01|R|F|1995-02-18|1995-03-03|1995-02-24|COLLECT COD|AIR|pecial platelets nag. thin, fluffy +46469|1599|100|1|15|22508.85|0.03|0.06|A|F|1994-11-19|1994-11-01|1994-11-27|NONE|TRUCK|ts nag. platelets affix across t +46469|1774|59|2|25|41894.25|0.03|0.08|A|F|1994-09-22|1994-10-26|1994-10-06|DELIVER IN PERSON|FOB|ntiments. e +46469|1963|96|3|27|50353.92|0.04|0.05|R|F|1994-11-03|1994-11-02|1994-11-09|DELIVER IN PERSON|TRUCK|ans integrate. fluffily regular excuses am +46469|1054|60|4|9|8595.45|0.01|0.07|R|F|1994-12-16|1994-10-22|1994-12-20|TAKE BACK RETURN|FOB|nic dependencie +46470|1537|58|1|15|21577.95|0.03|0.05|R|F|1993-12-26|1994-03-06|1994-01-05|TAKE BACK RETURN|RAIL|ndencies according to the b +46470|1708|93|2|3|4829.10|0.03|0.00|R|F|1994-01-21|1994-01-18|1994-02-03|NONE|MAIL|ide of the +46471|1627|51|1|27|41272.74|0.08|0.05|R|F|1992-09-15|1992-10-05|1992-09-18|TAKE BACK RETURN|SHIP|t the slyly bold depo +46471|410|11|2|15|19656.15|0.04|0.03|R|F|1992-11-03|1992-08-26|1992-11-16|NONE|MAIL|carefully even instructions +46471|751|16|3|25|41293.75|0.10|0.02|R|F|1992-07-16|1992-09-30|1992-07-17|NONE|MAIL|re furiously across th +46471|61|37|4|6|5766.36|0.03|0.05|A|F|1992-09-20|1992-09-12|1992-10-03|DELIVER IN PERSON|RAIL|tructions. sly accounts wake furi +46471|154|33|5|3|3162.45|0.10|0.07|R|F|1992-09-11|1992-09-10|1992-10-10|DELIVER IN PERSON|MAIL| packages. epita +46471|370|55|6|23|29218.51|0.10|0.07|R|F|1992-08-26|1992-10-11|1992-09-17|TAKE BACK RETURN|FOB|gular requests haggle f +46471|851|85|7|32|56059.20|0.05|0.00|A|F|1992-08-23|1992-09-22|1992-08-28|TAKE BACK RETURN|FOB|inal accounts could +46496|1826|70|1|37|63929.34|0.02|0.07|N|O|1997-03-04|1997-03-23|1997-03-06|DELIVER IN PERSON|RAIL|ges cajole unusual, regular deposit +46496|1423|24|2|41|54301.22|0.01|0.02|N|O|1997-03-31|1997-04-07|1997-04-26|DELIVER IN PERSON|REG AIR|onic deposits cajole caref +46497|703|68|1|16|25659.20|0.04|0.08|A|F|1992-10-11|1992-08-26|1992-11-05|DELIVER IN PERSON|TRUCK|y final pinto beans must nag bl +46497|423|11|2|35|46319.70|0.02|0.04|R|F|1992-10-08|1992-08-25|1992-11-05|DELIVER IN PERSON|FOB|ajole during the slyly final accounts. pack +46497|1499|17|3|26|36412.74|0.01|0.03|R|F|1992-08-28|1992-08-04|1992-09-20|TAKE BACK RETURN|FOB|ash furiously ironic, +46497|99|75|4|4|3996.36|0.04|0.08|A|F|1992-06-21|1992-08-25|1992-07-01|COLLECT COD|AIR|arefully ironic requests detect +46498|959|60|1|15|27899.25|0.06|0.00|N|O|1997-11-21|1997-10-22|1997-12-18|TAKE BACK RETURN|TRUCK|ular packages. carefully regular asympto +46498|1298|10|2|17|20387.93|0.00|0.03|N|O|1997-08-22|1997-09-21|1997-09-07|NONE|REG AIR|arefully ironic accounts after the slyly +46498|1095|1|3|34|33867.06|0.03|0.01|N|O|1997-11-14|1997-10-20|1997-11-17|NONE|MAIL|encies. slyly pending requests across the +46498|798|99|4|5|8493.95|0.05|0.05|N|O|1997-08-24|1997-10-17|1997-09-09|NONE|AIR|uickly fin +46498|1383|84|5|25|32109.50|0.03|0.07|N|O|1997-08-23|1997-10-18|1997-09-13|NONE|FOB|s snooze blithely. f +46499|1489|29|1|44|61181.12|0.09|0.02|A|F|1994-07-02|1994-08-03|1994-07-12|NONE|AIR|sts cajole blithely bl +46499|136|37|2|6|6216.78|0.10|0.08|A|F|1994-10-02|1994-08-30|1994-10-20|TAKE BACK RETURN|AIR|he carefully bold theodolites cajole furio +46499|99|50|3|1|999.09|0.07|0.03|A|F|1994-07-29|1994-08-08|1994-08-12|NONE|AIR|uests. final, +46499|400|57|4|35|45514.00|0.08|0.01|A|F|1994-08-04|1994-07-08|1994-08-26|NONE|RAIL|ernes haggle. even asymptotes alongside of +46499|528|29|5|21|29998.92|0.04|0.08|A|F|1994-09-10|1994-07-08|1994-09-22|DELIVER IN PERSON|TRUCK|kages. fluffily regular d +46499|852|53|6|14|24539.90|0.06|0.06|R|F|1994-10-07|1994-08-13|1994-11-01|COLLECT COD|TRUCK|ges are. excuses x-ray against the pending +46500|843|77|1|8|13950.72|0.02|0.06|N|O|1996-02-05|1996-03-15|1996-03-04|COLLECT COD|AIR| slyly final requests; pending fox +46501|1216|28|1|28|31281.88|0.08|0.08|N|O|1996-08-17|1996-06-25|1996-09-07|COLLECT COD|FOB|y bold platelets boost carefully. pinto bea +46501|790|91|2|35|59177.65|0.01|0.05|N|O|1996-06-27|1996-07-21|1996-07-10|NONE|MAIL|nstructions sleep along the carefully +46501|1692|16|3|47|74903.43|0.00|0.07|N|O|1996-06-17|1996-06-16|1996-07-01|TAKE BACK RETURN|REG AIR|yly pending deposits detect along the +46501|1987|76|4|4|7555.92|0.01|0.06|N|O|1996-06-11|1996-06-27|1996-06-24|TAKE BACK RETURN|REG AIR|ual theodolites affix slyly. silen +46502|1667|50|1|24|37647.84|0.06|0.02|N|O|1996-12-05|1996-10-17|1996-12-29|COLLECT COD|RAIL|structions. ironic, silent dolphins +46502|485|86|2|29|40178.92|0.04|0.00|N|O|1996-09-14|1996-11-09|1996-09-25|COLLECT COD|REG AIR|arefully about the slyly regu +46503|1176|49|1|5|5385.85|0.03|0.07|N|O|1995-12-30|1996-01-07|1996-01-23|TAKE BACK RETURN|RAIL|ounts wake above the fluffily sile +46503|956|59|2|37|68707.15|0.08|0.00|N|O|1996-02-02|1996-01-09|1996-02-03|COLLECT COD|FOB|ular pinto be +46503|1690|14|3|5|7958.45|0.08|0.05|N|O|1995-11-19|1996-01-20|1995-12-01|TAKE BACK RETURN|FOB|uctions use slyly about +46528|830|64|1|34|58848.22|0.00|0.00|A|F|1995-03-20|1995-01-31|1995-03-23|NONE|TRUCK|entiments cajole slyly bold +46528|290|91|2|30|35708.70|0.03|0.01|A|F|1995-03-27|1995-02-05|1995-04-07|TAKE BACK RETURN|TRUCK| ironic packages sleep blithely r +46528|999|2|3|43|81699.57|0.10|0.02|R|F|1995-02-27|1995-01-19|1995-03-02|TAKE BACK RETURN|REG AIR|ithely unusual packa +46529|146|47|1|23|24061.22|0.09|0.06|N|O|1997-09-01|1997-07-30|1997-09-18|NONE|RAIL|. slyly unusual deposits +46529|1201|39|2|47|51803.40|0.00|0.05|N|O|1997-06-21|1997-08-18|1997-07-17|COLLECT COD|FOB|thely regular ide +46529|371|56|3|42|53397.54|0.04|0.02|N|O|1997-06-29|1997-08-17|1997-07-01|TAKE BACK RETURN|RAIL|ructions. sile +46529|1576|77|4|38|56147.66|0.00|0.06|N|O|1997-07-17|1997-08-19|1997-07-25|NONE|SHIP|odolites aff +46529|210|65|5|7|7771.47|0.09|0.00|N|O|1997-07-26|1997-08-12|1997-08-05|TAKE BACK RETURN|MAIL|ies. fluffily special accounts are +46530|1806|50|1|1|1707.80|0.03|0.03|N|F|1995-06-05|1995-04-18|1995-07-05|COLLECT COD|FOB|rding to the sly +46530|1365|66|2|26|32925.36|0.10|0.01|A|F|1995-04-23|1995-05-06|1995-05-07|NONE|TRUCK|lets are special accounts. bold deposits w +46530|393|50|3|50|64669.50|0.07|0.08|R|F|1995-03-26|1995-05-23|1995-03-29|TAKE BACK RETURN|AIR|ns integrate blithely about the finally fu +46530|344|73|4|15|18665.10|0.02|0.04|A|F|1995-05-03|1995-04-30|1995-05-18|COLLECT COD|RAIL| along the regula +46530|311|68|5|26|31494.06|0.09|0.08|N|F|1995-06-07|1995-05-25|1995-06-30|DELIVER IN PERSON|AIR|ld theodolites wake alongsi +46531|33|84|1|15|13995.45|0.02|0.06|N|O|1995-12-06|1995-11-16|1995-12-17|NONE|MAIL|efully among +46531|1596|97|2|47|70386.73|0.04|0.04|N|O|1995-12-04|1995-09-25|1995-12-05|DELIVER IN PERSON|SHIP|e after the +46531|1936|69|3|42|77193.06|0.06|0.04|N|O|1995-12-04|1995-10-20|1996-01-02|DELIVER IN PERSON|SHIP|ng excuses. slyly regular +46531|9|35|4|5|4545.00|0.09|0.00|N|O|1995-08-25|1995-11-17|1995-09-10|NONE|REG AIR|, regular foxes poach quickly. furiously un +46531|232|33|5|1|1132.23|0.08|0.00|N|O|1995-12-11|1995-10-01|1996-01-08|COLLECT COD|RAIL|ly furiously express account +46531|1917|62|6|37|67299.67|0.04|0.05|N|O|1995-11-10|1995-11-09|1995-11-28|NONE|REG AIR|kly regular dol +46531|982|85|7|32|60255.36|0.05|0.00|N|O|1995-10-15|1995-11-10|1995-11-07|NONE|MAIL|leep. regular deposits caj +46532|176|55|1|24|25828.08|0.07|0.07|N|O|1998-02-02|1998-03-08|1998-02-27|TAKE BACK RETURN|AIR|ages. regular, r +46532|526|17|2|28|39942.56|0.01|0.06|N|O|1998-03-05|1998-03-19|1998-03-16|TAKE BACK RETURN|SHIP| unusual packages nag a +46532|1996|85|3|7|13285.93|0.05|0.07|N|O|1998-01-23|1998-02-05|1998-02-06|COLLECT COD|SHIP|unts behind the quickly unusual packag +46533|1620|21|1|16|24345.92|0.03|0.02|R|F|1994-11-17|1994-12-01|1994-12-16|TAKE BACK RETURN|AIR|s? carefully ironic in +46533|709|6|2|21|33803.70|0.06|0.03|R|F|1994-12-11|1994-11-14|1994-12-20|NONE|AIR|carefully regular packages +46533|247|2|3|48|55067.52|0.08|0.00|A|F|1994-12-20|1995-01-03|1995-01-14|DELIVER IN PERSON|SHIP|hely. carefully +46533|880|47|4|1|1780.88|0.01|0.03|R|F|1994-10-13|1994-12-30|1994-10-29|COLLECT COD|TRUCK|ully. furiously special deposits haggl +46534|1894|24|1|43|77223.27|0.09|0.08|A|F|1992-11-11|1992-11-08|1992-11-16|DELIVER IN PERSON|FOB|deposits cajole +46535|1984|17|1|49|92413.02|0.04|0.04|R|F|1995-05-06|1995-04-20|1995-05-31|COLLECT COD|SHIP| special foxes. slyly final pac +46560|1262|100|1|46|53509.96|0.06|0.07|N|O|1997-10-25|1997-11-14|1997-11-20|NONE|MAIL|rouches cajole. final packages cajo +46560|99|100|2|24|23978.16|0.06|0.05|N|O|1997-10-31|1997-09-30|1997-11-30|NONE|SHIP|ously unusual gifts wake b +46560|1409|27|3|21|27518.40|0.01|0.08|N|O|1997-10-05|1997-11-13|1997-11-04|DELIVER IN PERSON|REG AIR|ual dolphins was about the blithely si +46561|1796|39|1|10|16977.90|0.00|0.01|N|O|1997-07-29|1997-07-11|1997-08-13|TAKE BACK RETURN|SHIP|phins. courts sleep. unusual forges sleep i +46562|949|84|1|9|16649.46|0.06|0.05|R|F|1995-02-15|1995-05-06|1995-03-08|COLLECT COD|SHIP|ounts cajole. account +46562|1774|17|2|1|1675.77|0.05|0.03|A|F|1995-04-12|1995-05-05|1995-04-28|NONE|TRUCK| stealthy warhorses. slyly fina +46562|1326|41|3|47|57684.04|0.04|0.06|R|F|1995-04-25|1995-05-03|1995-05-25|COLLECT COD|MAIL|ular platelets grow furiously against the e +46563|1383|84|1|9|11559.42|0.07|0.07|R|F|1992-05-13|1992-03-16|1992-06-09|NONE|MAIL|accounts. final excuses are slyly +46563|353|82|2|1|1253.35|0.02|0.01|R|F|1992-04-09|1992-03-28|1992-04-26|COLLECT COD|TRUCK|uriously s +46563|205|87|3|20|22104.00|0.01|0.07|A|F|1992-01-29|1992-03-05|1992-02-05|COLLECT COD|REG AIR|r requests +46563|1705|90|4|36|57841.20|0.09|0.02|R|F|1992-02-02|1992-04-11|1992-02-28|NONE|FOB|t pinto beans. regular depos +46564|302|59|1|25|30057.50|0.01|0.01|N|O|1998-08-18|1998-07-13|1998-09-15|COLLECT COD|RAIL|ss asymptotes use furiously bold +46564|518|9|2|43|60995.93|0.10|0.08|N|O|1998-05-22|1998-06-20|1998-06-18|TAKE BACK RETURN|AIR|round the furiously ironic packages. blithe +46564|1772|99|3|18|30127.86|0.09|0.07|N|O|1998-06-29|1998-07-21|1998-07-02|TAKE BACK RETURN|FOB|ong the ruthless deposits. requests +46564|313|70|4|35|42465.85|0.10|0.04|N|O|1998-07-16|1998-07-14|1998-08-05|DELIVER IN PERSON|RAIL|uffily unusua +46565|1484|63|1|43|59575.64|0.08|0.04|N|O|1995-09-28|1995-08-27|1995-10-10|DELIVER IN PERSON|AIR|long the ironic, blithe d +46565|1933|22|2|42|77067.06|0.04|0.03|N|O|1995-07-03|1995-08-02|1995-07-24|COLLECT COD|FOB| under the regular, special +46565|1223|61|3|5|5621.10|0.09|0.01|N|O|1995-08-07|1995-07-27|1995-08-26|TAKE BACK RETURN|REG AIR|s nag furiously after the +46565|1845|32|4|43|75114.12|0.03|0.07|N|O|1995-07-08|1995-09-03|1995-07-17|TAKE BACK RETURN|FOB|rts affix furiously. instructions eat +46565|398|27|5|38|49338.82|0.03|0.01|N|O|1995-07-22|1995-09-09|1995-07-26|COLLECT COD|RAIL|ely even p +46565|577|38|6|44|65013.08|0.08|0.05|N|O|1995-09-03|1995-08-28|1995-09-06|DELIVER IN PERSON|RAIL|ter the regular ideas. +46565|165|44|7|36|38345.76|0.03|0.05|N|O|1995-09-05|1995-08-03|1995-10-03|NONE|RAIL|endencies use across the eve +46566|1594|75|1|15|22433.85|0.03|0.07|R|F|1992-05-05|1992-06-26|1992-05-28|DELIVER IN PERSON|RAIL|. carefully pending instructions sl +46566|589|90|2|9|13406.22|0.01|0.02|A|F|1992-04-12|1992-06-20|1992-04-13|DELIVER IN PERSON|RAIL|usual instructions use. quick +46566|787|52|3|45|75950.10|0.01|0.01|A|F|1992-05-24|1992-05-14|1992-06-22|COLLECT COD|SHIP|se carefully carefu +46566|437|96|4|17|22736.31|0.10|0.04|A|F|1992-07-08|1992-05-28|1992-07-12|TAKE BACK RETURN|RAIL|es sleep aga +46566|255|56|5|23|26570.75|0.09|0.05|R|F|1992-04-16|1992-06-19|1992-05-13|TAKE BACK RETURN|AIR|d, pending pinto beans according +46566|495|25|6|39|54424.11|0.05|0.01|A|F|1992-08-08|1992-06-10|1992-08-15|DELIVER IN PERSON|AIR|express, final instr +46567|157|84|1|44|46514.60|0.09|0.03|N|O|1998-04-18|1998-07-12|1998-05-06|TAKE BACK RETURN|RAIL|ithely sile +46567|226|27|2|22|24776.84|0.10|0.04|N|O|1998-04-26|1998-06-28|1998-05-06|NONE|REG AIR|ns are blithely. furio +46592|464|23|1|45|61400.70|0.09|0.07|A|F|1994-12-02|1994-09-19|1994-12-14|DELIVER IN PERSON|AIR|ly. furiously s +46592|211|12|2|44|48893.24|0.03|0.08|R|F|1994-11-13|1994-10-04|1994-11-21|DELIVER IN PERSON|AIR|luffily even requests +46592|161|62|3|9|9550.44|0.02|0.04|A|F|1994-09-09|1994-09-13|1994-10-05|TAKE BACK RETURN|MAIL|c requests w +46593|169|22|1|20|21383.20|0.04|0.02|N|O|1998-09-30|1998-07-11|1998-10-04|TAKE BACK RETURN|REG AIR|silently speci +46594|1933|22|1|43|78901.99|0.03|0.08|N|O|1998-07-29|1998-05-21|1998-08-19|DELIVER IN PERSON|MAIL|ven accounts. regular, ironic foxes over +46595|1094|100|1|25|24877.25|0.06|0.07|N|O|1998-09-02|1998-08-21|1998-09-23|TAKE BACK RETURN|REG AIR|kages affix qui +46595|1407|47|2|10|13084.00|0.09|0.00|N|O|1998-07-03|1998-09-03|1998-07-16|DELIVER IN PERSON|SHIP| accounts around the regular, d +46595|1366|43|3|2|2534.72|0.04|0.07|N|O|1998-09-06|1998-08-25|1998-09-14|DELIVER IN PERSON|SHIP|le express deposits. pending packages +46595|754|51|4|49|81082.75|0.09|0.01|N|O|1998-08-28|1998-07-27|1998-09-02|COLLECT COD|AIR|final pinto beans. instructions lo +46596|1207|8|1|18|19947.60|0.07|0.08|R|F|1993-08-16|1993-09-15|1993-09-05|TAKE BACK RETURN|SHIP|g to the ironic deposi +46596|1990|91|2|7|13243.93|0.04|0.01|A|F|1993-08-12|1993-08-09|1993-09-07|COLLECT COD|TRUCK|sual ideas are carefully +46596|500|1|3|16|22408.00|0.08|0.05|R|F|1993-08-08|1993-08-10|1993-08-11|DELIVER IN PERSON|RAIL|ing accounts. final decoys su +46597|539|40|1|6|8637.18|0.09|0.04|R|F|1993-02-16|1993-02-09|1993-03-18|DELIVER IN PERSON|RAIL|lly even packages. even depos +46597|1665|48|2|15|23499.90|0.01|0.00|R|F|1993-04-16|1993-03-10|1993-05-16|DELIVER IN PERSON|RAIL|er the slyly ironi +46597|1808|38|3|1|1709.80|0.04|0.05|R|F|1993-03-04|1993-03-30|1993-04-03|COLLECT COD|RAIL|e slyly regular packages. furiously f +46597|1804|91|4|27|46056.60|0.06|0.03|A|F|1993-02-11|1993-02-06|1993-02-26|NONE|FOB|ic requests about the slyly +46597|864|98|5|43|75888.98|0.03|0.06|A|F|1993-01-27|1993-02-16|1993-02-05|DELIVER IN PERSON|REG AIR|notornis haggle. packages about +46597|320|77|6|13|15864.16|0.00|0.06|A|F|1993-04-22|1993-03-13|1993-04-29|DELIVER IN PERSON|MAIL|g the final, final accounts. slyly regul +46597|302|87|7|23|27652.90|0.05|0.03|R|F|1993-02-10|1993-02-21|1993-03-03|DELIVER IN PERSON|RAIL|packages lose carefully unusual acc +46598|984|53|1|16|30159.68|0.03|0.05|N|O|1995-06-29|1995-06-15|1995-07-09|COLLECT COD|REG AIR|ackages according to the foxes a +46598|1525|26|2|36|51354.72|0.02|0.00|A|F|1995-04-20|1995-07-12|1995-05-20|TAKE BACK RETURN|FOB|thely regular the +46598|379|80|3|14|17911.18|0.04|0.08|N|F|1995-06-12|1995-06-16|1995-06-29|TAKE BACK RETURN|REG AIR|furiously silent pinto beans sleep +46599|1148|57|1|43|45113.02|0.04|0.07|R|F|1993-11-30|1993-12-11|1993-12-10|DELIVER IN PERSON|MAIL|according to +46599|1804|91|2|6|10234.80|0.04|0.04|A|F|1994-01-09|1993-10-16|1994-01-12|TAKE BACK RETURN|FOB|ts. blithely +46599|1433|12|3|16|21350.88|0.02|0.02|R|F|1994-01-05|1993-10-14|1994-02-01|NONE|SHIP|ve the unusual instructions. fluff +46599|49|100|4|31|29420.24|0.05|0.01|A|F|1993-11-07|1993-11-16|1993-11-30|DELIVER IN PERSON|MAIL|ide of the pending, ironic pint +46599|1958|59|5|21|39058.95|0.00|0.03|R|F|1993-11-02|1993-11-13|1993-11-14|NONE|RAIL|ar accounts haggle according to the slyly s +46624|1329|6|1|31|38139.92|0.00|0.06|R|F|1993-08-20|1993-07-18|1993-08-29|NONE|MAIL|eas. carefully pending dolph +46624|5|81|2|41|37105.00|0.07|0.04|R|F|1993-05-16|1993-07-15|1993-05-28|NONE|REG AIR|eep across the even, regular accounts. regu +46624|258|40|3|27|31272.75|0.00|0.04|R|F|1993-05-30|1993-06-02|1993-06-05|COLLECT COD|AIR|s use. blithel +46624|1010|16|4|25|22775.25|0.04|0.00|A|F|1993-06-07|1993-06-17|1993-06-11|TAKE BACK RETURN|AIR|carefully bold deposits cajole fluff +46625|1062|33|1|31|29854.86|0.09|0.01|A|F|1994-09-06|1994-10-02|1994-09-17|NONE|RAIL|al ideas. +46625|722|19|2|29|47058.88|0.07|0.03|A|F|1994-11-05|1994-10-13|1994-12-03|COLLECT COD|SHIP|carefully even deposi +46626|705|6|1|4|6422.80|0.08|0.02|A|F|1992-08-24|1992-09-11|1992-08-29|DELIVER IN PERSON|REG AIR|ns haggle express, even requests. pen +46626|343|100|2|8|9946.72|0.10|0.04|A|F|1992-09-22|1992-09-14|1992-09-24|DELIVER IN PERSON|MAIL|gularly bold theodolites are +46626|241|23|3|35|39943.40|0.03|0.04|R|F|1992-07-03|1992-08-20|1992-07-27|TAKE BACK RETURN|AIR|s. pending dep +46627|844|11|1|36|62814.24|0.02|0.04|R|F|1994-09-02|1994-07-12|1994-09-18|NONE|MAIL|cept the slyly express depen +46627|925|26|2|25|45648.00|0.09|0.08|R|F|1994-09-04|1994-08-06|1994-09-23|NONE|SHIP|. furiously silent pinto beans boost b +46627|651|45|3|21|32584.65|0.06|0.01|A|F|1994-07-13|1994-07-27|1994-08-03|NONE|REG AIR|ully ironic frays sl +46627|893|94|4|17|30496.13|0.05|0.04|R|F|1994-07-31|1994-08-05|1994-08-12|COLLECT COD|REG AIR|tipliers cajole furiously e +46627|1935|24|5|10|18369.30|0.00|0.07|R|F|1994-08-02|1994-07-16|1994-08-11|DELIVER IN PERSON|SHIP|ual packages. slyly regular deposits +46627|24|25|6|30|27720.60|0.00|0.02|A|F|1994-07-22|1994-07-17|1994-07-25|COLLECT COD|AIR|ular accounts dazzle quickly furious +46627|985|54|7|49|92413.02|0.01|0.06|A|F|1994-09-28|1994-08-17|1994-10-13|NONE|MAIL| requests. unusua +46628|491|50|1|37|51485.13|0.08|0.06|A|F|1994-10-03|1994-11-05|1994-10-15|NONE|TRUCK|ly unusual packages cajole. carefully final +46628|1501|2|2|37|51892.50|0.08|0.04|R|F|1994-10-31|1994-10-08|1994-11-04|COLLECT COD|FOB|al requests integrate +46628|1766|93|3|15|25016.40|0.07|0.02|A|F|1994-12-07|1994-10-23|1995-01-06|NONE|TRUCK| slyly pending packages affix u +46628|198|77|4|10|10981.90|0.07|0.00|A|F|1994-09-30|1994-11-22|1994-10-11|TAKE BACK RETURN|TRUCK|tipliers are blithel +46628|897|31|5|39|70117.71|0.05|0.07|R|F|1994-11-18|1994-10-17|1994-11-23|COLLECT COD|FOB| alongside of the silent account +46629|78|54|1|27|26407.89|0.09|0.00|N|O|1996-10-27|1996-09-23|1996-11-07|COLLECT COD|SHIP| ironic ideas. carefully reg +46629|531|32|2|27|38651.31|0.00|0.05|N|O|1996-08-28|1996-09-12|1996-09-09|COLLECT COD|FOB|sly regular accounts. eve +46629|486|74|3|44|61005.12|0.02|0.05|N|O|1996-09-19|1996-11-02|1996-09-28|NONE|REG AIR|pecial accounts cajole. slyly +46629|1680|22|4|11|17398.48|0.07|0.03|N|O|1996-10-01|1996-09-14|1996-10-17|COLLECT COD|SHIP|to beans. ironic, daring +46629|365|94|5|31|39226.16|0.08|0.06|N|O|1996-10-01|1996-09-17|1996-10-16|DELIVER IN PERSON|TRUCK|ong the express orbits use alongside of t +46629|956|59|6|32|59422.40|0.10|0.03|N|O|1996-11-28|1996-09-12|1996-11-29|TAKE BACK RETURN|REG AIR|express, pending attainments accord +46630|1284|59|1|1|1185.28|0.02|0.02|N|O|1998-04-20|1998-06-15|1998-05-07|COLLECT COD|REG AIR|es kindle accounts. unusual req +46630|1189|26|2|20|21803.60|0.00|0.01|N|O|1998-05-17|1998-05-14|1998-05-28|NONE|REG AIR|bove the regular deposits. carefully +46630|1593|74|3|14|20924.26|0.00|0.06|N|O|1998-05-17|1998-06-10|1998-06-11|TAKE BACK RETURN|SHIP|e pending instructions. slyly final pa +46630|757|90|4|46|76256.50|0.04|0.00|N|O|1998-04-19|1998-05-12|1998-05-09|TAKE BACK RETURN|MAIL|he regular, special theodoli +46631|619|20|1|5|7598.05|0.02|0.04|R|F|1992-06-02|1992-05-01|1992-06-11|COLLECT COD|FOB|t the quickly special dependencies. +46631|649|43|2|14|21694.96|0.01|0.02|A|F|1992-06-14|1992-05-16|1992-06-25|NONE|SHIP|ve the express reque +46631|687|88|3|39|61919.52|0.06|0.02|A|F|1992-04-15|1992-05-28|1992-04-30|TAKE BACK RETURN|FOB|wake! express, silent +46631|701|98|4|44|70474.80|0.06|0.04|R|F|1992-04-03|1992-04-23|1992-04-18|NONE|AIR|d requests wake. +46631|1955|88|5|48|89133.60|0.03|0.05|A|F|1992-03-15|1992-04-12|1992-04-01|TAKE BACK RETURN|AIR|tructions. furiously final pinto be +46656|898|32|1|41|73754.49|0.10|0.08|R|F|1994-08-21|1994-09-07|1994-09-02|COLLECT COD|RAIL| special pinto beans use according to +46656|542|73|2|6|8655.24|0.01|0.06|R|F|1994-10-17|1994-08-24|1994-11-06|DELIVER IN PERSON|SHIP|bold accounts cajo +46656|398|55|3|50|64919.50|0.04|0.04|A|F|1994-08-13|1994-08-29|1994-08-16|NONE|REG AIR|osits. carefully final dinos +46657|739|4|1|27|44272.71|0.10|0.02|N|O|1996-06-30|1996-05-17|1996-07-09|NONE|SHIP|ies sleep ab +46657|1039|75|2|13|12220.39|0.08|0.07|N|O|1996-05-01|1996-06-17|1996-05-08|NONE|RAIL|es. blithely final foxes cajol +46657|1907|40|3|17|30751.30|0.08|0.04|N|O|1996-07-22|1996-07-02|1996-08-14|DELIVER IN PERSON|REG AIR|lar pinto bea +46657|721|22|4|11|17838.92|0.06|0.03|N|O|1996-04-11|1996-05-07|1996-04-26|COLLECT COD|MAIL|s requests. dolphins about the excus +46657|1614|15|5|8|12124.88|0.00|0.03|N|O|1996-04-19|1996-05-27|1996-05-09|COLLECT COD|RAIL|excuses detect quickly. q +46657|768|69|6|40|66750.40|0.04|0.01|N|O|1996-05-22|1996-06-27|1996-06-08|TAKE BACK RETURN|TRUCK| express packages haggle slyly +46658|418|77|1|50|65920.50|0.01|0.07|N|O|1995-10-17|1995-10-28|1995-11-05|TAKE BACK RETURN|SHIP|ly regular dolphins wake blit +46658|1012|48|2|50|45650.50|0.01|0.05|N|O|1995-12-07|1995-09-26|1995-12-09|NONE|RAIL|carefully req +46658|721|86|3|24|38921.28|0.05|0.05|N|O|1995-09-11|1995-10-24|1995-09-17|TAKE BACK RETURN|RAIL|. stealthily special pl +46659|1714|57|1|33|53318.43|0.02|0.08|A|F|1993-06-09|1993-05-23|1993-07-05|COLLECT COD|MAIL|aggle slyly after the unusual pi +46659|259|60|2|38|44051.50|0.10|0.04|A|F|1993-05-10|1993-05-28|1993-06-06|DELIVER IN PERSON|RAIL|al, final instruc +46659|1413|31|3|46|60462.86|0.00|0.02|A|F|1993-07-12|1993-06-25|1993-07-17|DELIVER IN PERSON|FOB|reful grouches doze +46660|153|80|1|36|37913.40|0.01|0.00|N|O|1996-07-30|1996-09-16|1996-08-14|TAKE BACK RETURN|AIR|st slyly fluffily regular requests. careful +46660|1296|34|2|1|1197.29|0.07|0.04|N|O|1996-11-13|1996-09-17|1996-12-11|DELIVER IN PERSON|TRUCK|fter the blithely ironic pinto beans. +46660|1315|16|3|42|51085.02|0.08|0.05|N|O|1996-08-13|1996-09-01|1996-09-12|COLLECT COD|SHIP|lites boost. blithely regular foxe +46660|1461|79|4|24|32699.04|0.06|0.08|N|O|1996-10-19|1996-09-22|1996-11-05|COLLECT COD|SHIP|sits wake car +46661|856|57|1|26|45678.10|0.02|0.01|N|O|1998-05-01|1998-06-24|1998-05-08|COLLECT COD|MAIL| bold packages a +46661|1404|5|2|10|13054.00|0.05|0.01|N|O|1998-06-25|1998-05-31|1998-07-22|COLLECT COD|MAIL| regular pinto beans detect carefully. +46662|229|11|1|46|51944.12|0.09|0.03|N|O|1996-03-07|1996-02-20|1996-04-01|COLLECT COD|RAIL|nt instructions. blithely regular +46662|901|4|2|16|28830.40|0.04|0.08|N|O|1996-02-04|1996-02-29|1996-02-20|NONE|TRUCK|r deposits. carefully express request +46662|1245|83|3|22|25217.28|0.00|0.07|N|O|1996-02-10|1996-02-20|1996-02-11|NONE|SHIP| requests. carefully ironic packages wake +46662|1347|48|4|17|21221.78|0.09|0.08|N|O|1996-04-12|1996-03-22|1996-04-25|NONE|SHIP|ndencies. slyly ironic pint +46662|1822|52|5|1|1723.82|0.10|0.02|N|O|1996-02-17|1996-02-24|1996-03-16|COLLECT COD|FOB|y. express, even pains wake slyl +46663|6|82|1|23|20838.00|0.01|0.06|N|O|1998-04-21|1998-05-26|1998-05-14|NONE|MAIL|dolites sleep sl +46688|548|79|1|36|52147.44|0.07|0.08|N|O|1998-01-07|1997-12-26|1998-01-28|COLLECT COD|SHIP|usly about the regular, re +46688|600|31|2|27|40516.20|0.00|0.05|N|O|1997-10-03|1997-12-23|1997-10-09|DELIVER IN PERSON|TRUCK|ke fluffily bold instructions. instructi +46689|1361|76|1|26|32821.36|0.07|0.08|N|O|1996-05-09|1996-03-06|1996-06-04|TAKE BACK RETURN|FOB|ckages integrate sl +46689|942|11|2|17|31329.98|0.04|0.03|N|O|1996-04-08|1996-04-06|1996-04-17|DELIVER IN PERSON|SHIP|yly silent deposits. carefully ironic ins +46689|373|30|3|47|59848.39|0.00|0.08|N|O|1996-02-14|1996-03-06|1996-02-27|NONE|AIR|the accounts. even excuses ca +46689|726|59|4|40|65068.80|0.05|0.08|N|O|1996-02-15|1996-03-14|1996-03-09|COLLECT COD|AIR|t. slyly even foxes b +46689|1085|86|5|35|34512.80|0.10|0.01|N|O|1996-04-20|1996-03-29|1996-04-27|TAKE BACK RETURN|SHIP|to the fluffily +46689|1218|30|6|15|16788.15|0.04|0.08|N|O|1996-04-15|1996-02-23|1996-05-03|COLLECT COD|AIR|s. careful +46689|99|75|7|47|46957.23|0.03|0.03|N|O|1996-04-06|1996-03-08|1996-04-29|NONE|FOB|pendencies. slyly idle requests could h +46690|569|100|1|34|49965.04|0.08|0.08|R|F|1993-11-28|1993-11-14|1993-11-30|TAKE BACK RETURN|AIR| unusual ideas wake fur +46690|587|18|2|26|38677.08|0.06|0.04|R|F|1993-10-12|1993-10-27|1993-10-13|DELIVER IN PERSON|FOB|ously unusual requests cajole alongside of +46690|1792|77|3|18|30488.22|0.10|0.00|R|F|1993-11-29|1993-11-15|1993-12-10|DELIVER IN PERSON|MAIL|y final foxes. carefu +46690|1389|28|4|27|34840.26|0.10|0.03|A|F|1993-10-13|1993-11-06|1993-11-05|TAKE BACK RETURN|TRUCK|to the busily ironic theodolites. qu +46690|1829|30|5|25|43270.50|0.00|0.07|R|F|1993-12-27|1993-10-13|1993-12-31|NONE|REG AIR|solve regular theodolites. +46690|618|12|6|34|51632.74|0.01|0.04|R|F|1993-11-04|1993-10-24|1993-11-05|COLLECT COD|FOB| blithely regular +46690|689|52|7|25|39742.00|0.03|0.01|A|F|1993-11-18|1993-11-12|1993-12-05|TAKE BACK RETURN|TRUCK|eodolites boost carefully. even +46691|1523|24|1|15|21367.80|0.04|0.01|R|F|1992-08-03|1992-09-01|1992-08-21|TAKE BACK RETURN|REG AIR| gifts do sleep carefully car +46691|21|97|2|30|27630.60|0.03|0.08|R|F|1992-08-15|1992-09-06|1992-08-27|TAKE BACK RETURN|MAIL|special requests cajole. finally quick pint +46691|466|67|3|34|46459.64|0.04|0.06|R|F|1992-07-13|1992-09-05|1992-08-09|DELIVER IN PERSON|REG AIR| courts integrate with the fi +46691|1501|82|4|35|49087.50|0.10|0.02|R|F|1992-07-07|1992-08-05|1992-08-01|TAKE BACK RETURN|FOB| deposits integrat +46692|1475|15|1|10|13764.70|0.05|0.04|N|O|1996-09-10|1996-10-06|1996-09-26|COLLECT COD|FOB|lly across t +46693|851|52|1|34|59562.90|0.08|0.04|N|O|1998-10-25|1998-08-10|1998-11-04|DELIVER IN PERSON|SHIP|tes boost along the +46693|1591|92|2|5|7462.95|0.01|0.01|N|O|1998-10-12|1998-09-28|1998-10-14|NONE|REG AIR|ncies integrate +46693|405|64|3|12|15664.80|0.01|0.06|N|O|1998-11-08|1998-09-24|1998-11-30|COLLECT COD|FOB|yly pending asymp +46693|572|63|4|49|72155.93|0.08|0.02|N|O|1998-09-06|1998-09-05|1998-10-01|COLLECT COD|FOB|its. fluffily bold r +46693|192|71|5|30|32765.70|0.04|0.07|N|O|1998-10-04|1998-08-14|1998-10-09|COLLECT COD|MAIL|ar waters cajole slyly against the e +46693|1191|64|6|13|14198.47|0.02|0.03|N|O|1998-10-27|1998-08-17|1998-11-21|NONE|REG AIR| bold frets wake slyly. pendin +46693|646|47|7|10|15466.40|0.01|0.05|N|O|1998-10-16|1998-08-16|1998-11-12|COLLECT COD|FOB|tain. theodolites boost carefully. +46694|617|11|1|46|69810.06|0.02|0.01|N|O|1995-12-16|1995-11-06|1995-12-24|DELIVER IN PERSON|TRUCK|ously regular packages doubt c +46694|623|24|2|45|68562.90|0.08|0.01|N|O|1995-12-24|1995-10-22|1996-01-04|NONE|SHIP| quickly carefully ironic dol +46694|1687|11|3|27|42894.36|0.04|0.05|N|O|1995-11-28|1995-11-26|1995-12-15|COLLECT COD|MAIL|elets among the furiously fin +46694|1139|12|4|48|49926.24|0.05|0.01|N|O|1995-10-19|1995-10-22|1995-11-15|DELIVER IN PERSON|AIR|ular packages boost aga +46694|1516|57|5|26|36855.26|0.08|0.03|N|O|1995-09-28|1995-10-22|1995-10-05|TAKE BACK RETURN|TRUCK| final dolphins sleep quick +46694|384|69|6|4|5137.52|0.07|0.03|N|O|1995-11-13|1995-09-29|1995-12-08|DELIVER IN PERSON|MAIL|egular packages are ruthlessly quic +46695|1957|46|1|17|31602.15|0.09|0.06|R|F|1993-07-07|1993-07-21|1993-08-05|TAKE BACK RETURN|RAIL|s alongside of the slyly +46695|237|65|2|4|4548.92|0.04|0.02|A|F|1993-07-22|1993-06-25|1993-07-23|DELIVER IN PERSON|SHIP|sly even requests +46695|1513|34|3|44|62238.44|0.07|0.06|R|F|1993-07-27|1993-07-16|1993-07-30|COLLECT COD|FOB| quickly pending requests wake furiously +46720|1697|39|1|18|28776.42|0.04|0.05|N|O|1997-09-06|1997-07-01|1997-10-05|DELIVER IN PERSON|TRUCK|foxes nag final ideas. qu +46720|615|9|2|38|57593.18|0.01|0.04|N|O|1997-07-04|1997-08-12|1997-07-21|NONE|MAIL|deposits haggle furiously regular +46720|835|2|3|21|36452.43|0.00|0.00|N|O|1997-08-04|1997-07-24|1997-08-10|DELIVER IN PERSON|TRUCK|equests use. ironic, final +46721|356|57|1|8|10050.80|0.10|0.05|A|F|1994-10-25|1994-10-23|1994-11-12|TAKE BACK RETURN|MAIL| cajole speci +46721|202|84|2|35|38577.00|0.07|0.07|A|F|1994-11-16|1994-11-05|1994-11-28|COLLECT COD|SHIP|ly along the slyly express ideas. regula +46721|626|58|3|30|45798.60|0.03|0.03|R|F|1994-12-13|1994-10-20|1995-01-12|TAKE BACK RETURN|SHIP|bout the ironic instruction +46721|1540|61|4|6|8649.24|0.03|0.00|A|F|1994-10-17|1994-11-19|1994-11-10|DELIVER IN PERSON|SHIP|arhorses integrate about the platelets. fur +46721|1423|24|5|5|6622.10|0.08|0.06|R|F|1995-01-08|1994-11-30|1995-01-25|NONE|SHIP|ously close accounts detect qu +46721|1097|3|6|3|2994.27|0.04|0.03|A|F|1994-12-24|1994-11-06|1995-01-02|COLLECT COD|MAIL|p slyly slyly final braids. +46722|1108|45|1|17|17154.70|0.06|0.00|N|O|1996-02-02|1996-03-31|1996-02-24|DELIVER IN PERSON|SHIP|tructions use quickly after the +46722|64|90|2|49|47238.94|0.00|0.03|N|O|1996-04-28|1996-02-27|1996-05-19|NONE|TRUCK|heodolites use furiously depos +46722|991|92|3|19|35947.81|0.09|0.08|N|O|1996-04-29|1996-03-11|1996-05-17|NONE|SHIP|r accounts according to the blith +46722|1718|3|4|12|19436.52|0.08|0.06|N|O|1996-03-31|1996-04-20|1996-04-29|NONE|FOB|ggle ironic, final ideas. silent theodol +46722|971|74|5|39|73006.83|0.07|0.06|N|O|1996-01-27|1996-04-10|1996-02-07|TAKE BACK RETURN|FOB|ly final ideas might integrate bl +46722|112|65|6|45|45544.95|0.10|0.06|N|O|1996-03-03|1996-04-12|1996-03-16|DELIVER IN PERSON|TRUCK|usly enticing depende +46723|1992|25|1|38|71971.62|0.06|0.00|R|F|1992-06-21|1992-06-07|1992-07-12|TAKE BACK RETURN|RAIL|cial pinto beans nag thinly a +46723|1252|53|2|29|33444.25|0.02|0.07|R|F|1992-06-09|1992-05-21|1992-07-09|DELIVER IN PERSON|TRUCK|accounts. slyly regular deposits on the ca +46723|1705|6|3|26|41774.20|0.02|0.03|R|F|1992-05-02|1992-07-04|1992-05-30|NONE|RAIL|ly closely express accounts. slyly +46724|136|89|1|17|17614.21|0.07|0.00|N|O|1997-03-11|1997-04-02|1997-04-03|TAKE BACK RETURN|TRUCK|ronically dependencies. carefully bo +46724|1330|31|2|4|4925.32|0.05|0.08|N|O|1997-03-19|1997-04-02|1997-04-16|COLLECT COD|AIR| are. carefully reg +46724|930|65|3|26|47604.18|0.00|0.07|N|O|1997-02-20|1997-04-04|1997-02-21|TAKE BACK RETURN|AIR|ss requests wake slyly ironic r +46725|328|57|1|23|28251.36|0.09|0.06|R|F|1993-12-14|1993-10-29|1993-12-22|TAKE BACK RETURN|MAIL|alongside of +46725|1581|62|2|21|31134.18|0.06|0.07|A|F|1993-11-04|1993-12-14|1993-11-07|DELIVER IN PERSON|AIR|ajole furiously among the quickly expr +46725|397|98|3|50|64869.50|0.10|0.04|R|F|1993-11-29|1993-11-08|1993-12-16|COLLECT COD|REG AIR|. even requests wak +46725|1971|16|4|8|14983.76|0.03|0.00|A|F|1993-09-23|1993-11-29|1993-10-16|COLLECT COD|AIR| bold requests promise slyly +46725|867|68|5|28|49500.08|0.06|0.00|A|F|1993-09-30|1993-10-26|1993-10-30|COLLECT COD|TRUCK|s. slyly regular p +46725|271|26|6|20|23425.40|0.05|0.08|A|F|1993-11-27|1993-11-03|1993-11-28|TAKE BACK RETURN|TRUCK|ously regular depths slee +46725|86|87|7|2|1972.16|0.08|0.03|A|F|1994-01-15|1993-11-08|1994-01-31|DELIVER IN PERSON|TRUCK|ackages. quick accounts use carefully. car +46726|1372|73|1|1|1273.37|0.00|0.01|A|F|1992-07-30|1992-08-28|1992-08-09|COLLECT COD|REG AIR|lly. express, express +46726|160|39|2|25|26504.00|0.09|0.02|A|F|1992-10-13|1992-08-07|1992-10-16|DELIVER IN PERSON|REG AIR|final foxes wake slyly regular theodol +46726|1078|79|3|24|23497.68|0.05|0.06|R|F|1992-10-03|1992-09-06|1992-10-11|TAKE BACK RETURN|RAIL|p above the qu +46726|1150|51|4|40|42046.00|0.05|0.06|R|F|1992-09-16|1992-09-15|1992-10-04|TAKE BACK RETURN|TRUCK|nic accounts are furiously. regular deposi +46727|1649|50|1|35|54272.40|0.10|0.01|A|F|1995-03-10|1995-01-02|1995-03-19|NONE|REG AIR|ss accounts. furiously ev +46727|252|80|2|2|2304.50|0.08|0.07|A|F|1995-02-04|1994-12-24|1995-02-24|NONE|REG AIR| across the enticing foxes. pendin +46727|1114|15|3|30|30453.30|0.07|0.00|R|F|1994-12-09|1995-02-03|1995-01-03|DELIVER IN PERSON|MAIL|lar platelets cajole blithely +46727|676|8|4|2|3153.34|0.00|0.03|A|F|1995-01-13|1995-01-27|1995-02-11|COLLECT COD|RAIL| the notornis. regular pint +46752|652|53|1|46|71421.90|0.05|0.04|N|O|1996-09-02|1996-09-08|1996-09-05|DELIVER IN PERSON|TRUCK|fily bold deposits boost furiously. regu +46752|1671|54|2|47|73915.49|0.01|0.06|N|O|1996-11-12|1996-09-19|1996-12-01|DELIVER IN PERSON|SHIP|according to the never ironic foxes? fu +46752|493|81|3|4|5573.96|0.04|0.02|N|O|1996-09-04|1996-09-17|1996-09-11|TAKE BACK RETURN|TRUCK|y across the q +46752|440|41|4|2|2680.88|0.08|0.06|N|O|1996-09-18|1996-09-17|1996-10-10|DELIVER IN PERSON|FOB|od. furiously final accounts +46753|1522|23|1|34|48399.68|0.06|0.04|N|O|1996-06-13|1996-06-01|1996-07-08|TAKE BACK RETURN|AIR|ermanent ideas. furiously express pla +46753|695|96|2|10|15956.90|0.05|0.04|N|O|1996-05-07|1996-06-03|1996-05-10|DELIVER IN PERSON|MAIL| pinto beans. blithely final deposits wa +46753|789|90|3|34|57452.52|0.07|0.08|N|O|1996-06-06|1996-06-07|1996-06-12|COLLECT COD|SHIP|deposits nag blithely after the e +46753|207|8|4|25|27680.00|0.07|0.01|N|O|1996-05-19|1996-06-01|1996-05-23|COLLECT COD|AIR|ely regular deposits. carefully pe +46754|1406|24|1|40|52296.00|0.00|0.06|N|O|1997-12-29|1997-11-20|1997-12-30|DELIVER IN PERSON|AIR|thely regular deposits. slyly regula +46754|1355|56|2|39|48997.65|0.10|0.06|N|O|1998-01-02|1997-11-15|1998-01-29|COLLECT COD|SHIP|he unusual, pending pack +46754|541|2|3|40|57661.60|0.04|0.01|N|O|1997-12-10|1997-11-19|1997-12-13|NONE|RAIL|gle fluffily along the slyly ir +46754|387|44|4|22|28322.36|0.05|0.07|N|O|1997-12-08|1997-10-28|1998-01-01|NONE|AIR|ses. blithely regular platelets +46755|412|13|1|16|20998.56|0.07|0.06|R|F|1995-03-14|1995-04-18|1995-03-28|TAKE BACK RETURN|RAIL|nic, final accounts. +46755|1323|24|2|21|25710.72|0.00|0.04|A|F|1995-04-19|1995-04-10|1995-04-25|NONE|SHIP|unts. final, final plate +46755|1689|72|3|46|73171.28|0.03|0.01|A|F|1995-03-05|1995-04-30|1995-03-09|NONE|FOB|ss requests solve alo +46755|941|44|4|39|71835.66|0.08|0.04|R|F|1995-04-27|1995-03-10|1995-04-30|COLLECT COD|SHIP|ts. pending deposits sleep +46755|275|30|5|31|36433.37|0.01|0.04|R|F|1995-03-17|1995-03-23|1995-03-19|NONE|REG AIR|ly final accounts haggle +46755|1816|46|6|36|61841.16|0.05|0.02|A|F|1995-04-16|1995-04-03|1995-04-17|TAKE BACK RETURN|MAIL|s are. carefully +46756|1917|6|1|46|83669.86|0.06|0.05|A|F|1995-01-30|1994-12-28|1995-02-21|NONE|MAIL|gular foxes cajole quickly among +46756|714|79|2|34|54900.14|0.06|0.03|R|F|1994-11-19|1994-12-27|1994-12-17|DELIVER IN PERSON|REG AIR|ly about the carefully special foxes. si +46756|1587|8|3|42|62520.36|0.05|0.08|A|F|1994-12-15|1994-11-20|1994-12-27|TAKE BACK RETURN|REG AIR|ly special foxes after the special, +46756|1398|13|4|2|2598.78|0.03|0.07|R|F|1994-10-20|1994-12-17|1994-10-29|TAKE BACK RETURN|FOB| the accounts. instructions against th +46757|1163|36|1|10|10641.60|0.01|0.05|N|O|1995-09-15|1995-08-17|1995-10-14|TAKE BACK RETURN|AIR|kages about the even th +46757|593|94|2|24|35846.16|0.08|0.02|N|O|1995-08-13|1995-07-20|1995-09-10|NONE|TRUCK|e. final grouches a +46758|1619|43|1|7|10644.27|0.06|0.00|N|O|1995-12-29|1995-10-12|1995-12-30|NONE|AIR| beans affix. enticing packages are c +46759|714|47|1|3|4844.13|0.02|0.04|N|O|1996-01-25|1996-01-31|1996-02-15|NONE|TRUCK|ular instructions. +46759|1163|36|2|33|35117.28|0.07|0.01|N|O|1996-04-09|1996-03-02|1996-05-04|DELIVER IN PERSON|TRUCK| express instructions among the f +46759|221|3|3|37|41485.14|0.06|0.04|N|O|1996-01-01|1996-03-01|1996-01-06|COLLECT COD|REG AIR|. final deposits detect. +46759|268|96|4|26|30374.76|0.08|0.03|N|O|1996-02-21|1996-02-12|1996-03-12|DELIVER IN PERSON|REG AIR|rts cajole blithely regul +46784|571|32|1|43|63277.51|0.05|0.02|N|O|1995-12-01|1995-12-25|1995-12-25|COLLECT COD|AIR|unusual accoun +46784|866|33|2|5|8834.30|0.04|0.03|N|O|1995-11-25|1995-12-11|1995-12-16|TAKE BACK RETURN|AIR|ag blithely regula +46784|1254|92|3|7|8086.75|0.08|0.01|N|O|1996-02-05|1995-12-20|1996-02-25|NONE|REG AIR|its. instruct +46784|1942|87|4|19|35034.86|0.05|0.00|N|O|1996-01-20|1995-12-11|1996-01-24|COLLECT COD|SHIP|ounts. slyly ironic instructions haggle sl +46784|309|66|5|35|42325.50|0.03|0.00|N|O|1996-02-17|1995-12-14|1996-02-25|TAKE BACK RETURN|SHIP|tes. slyly bold packages use quickly slyl +46784|610|4|6|41|61935.01|0.07|0.08|N|O|1995-12-10|1996-01-09|1996-01-03|COLLECT COD|REG AIR|s use furiously among the regula +46785|778|75|1|41|68829.57|0.09|0.01|R|F|1993-02-22|1993-04-15|1993-03-17|TAKE BACK RETURN|MAIL| under the even packages haggle car +46785|253|8|2|48|55356.00|0.07|0.08|R|F|1993-03-05|1993-03-28|1993-04-02|NONE|FOB|oss the regul +46785|1476|16|3|26|35814.22|0.03|0.03|R|F|1993-03-05|1993-04-30|1993-03-19|TAKE BACK RETURN|TRUCK|accounts. blithely regular +46786|1729|56|1|29|47290.88|0.08|0.02|A|F|1993-06-13|1993-06-17|1993-07-04|COLLECT COD|REG AIR| slyly furious +46786|747|44|2|43|70852.82|0.07|0.00|A|F|1993-07-13|1993-06-11|1993-07-21|DELIVER IN PERSON|AIR|packages. pending packages was fluffily. s +46786|925|28|3|26|47473.92|0.03|0.08|R|F|1993-04-30|1993-05-23|1993-05-11|DELIVER IN PERSON|REG AIR|uctions sleep. forges cajole furious +46786|323|80|4|42|51379.44|0.03|0.03|R|F|1993-05-09|1993-06-10|1993-06-04|TAKE BACK RETURN|FOB|y along the deposits. regular depo +46786|1945|34|5|16|29551.04|0.02|0.08|R|F|1993-06-27|1993-05-20|1993-07-18|DELIVER IN PERSON|SHIP|ideas eat fluffily. pinto beans about the +46786|1586|27|6|26|38677.08|0.08|0.04|R|F|1993-07-27|1993-05-18|1993-08-06|DELIVER IN PERSON|RAIL|e. slyly bold acco +46787|214|69|1|35|38997.35|0.10|0.07|A|F|1992-07-02|1992-06-22|1992-07-26|DELIVER IN PERSON|SHIP|the furiou +46787|480|81|2|41|56599.68|0.00|0.05|R|F|1992-06-25|1992-05-22|1992-07-08|TAKE BACK RETURN|RAIL|ly ironic courts. regu +46787|1008|79|3|37|33633.00|0.06|0.07|R|F|1992-06-23|1992-06-27|1992-07-08|DELIVER IN PERSON|RAIL|ructions. furiously regular asymptotes doze +46787|1619|20|4|22|33453.42|0.09|0.07|R|F|1992-05-24|1992-05-15|1992-06-19|COLLECT COD|SHIP|deposits. blithely unusual deposits are bol +46788|1592|73|1|19|28378.21|0.07|0.05|R|F|1992-05-30|1992-03-26|1992-06-05|DELIVER IN PERSON|FOB|dolites are furiously asymptotes! blith +46788|670|2|2|14|21989.38|0.04|0.00|A|F|1992-05-14|1992-04-10|1992-05-17|NONE|FOB|sts detect across the carefully i +46788|235|17|3|8|9081.84|0.00|0.06|A|F|1992-03-20|1992-04-06|1992-04-04|DELIVER IN PERSON|FOB|accounts nag along the furiousl +46788|501|62|4|3|4204.50|0.05|0.06|R|F|1992-02-22|1992-03-19|1992-03-03|COLLECT COD|FOB|luffily against the +46788|1869|99|5|26|46042.36|0.01|0.08|A|F|1992-02-04|1992-04-21|1992-02-27|NONE|REG AIR|ans. blithely express +46789|751|16|1|41|67721.75|0.04|0.00|N|O|1997-03-18|1997-03-09|1997-04-14|DELIVER IN PERSON|MAIL|s. final asymp +46789|1048|54|2|49|46502.96|0.06|0.08|N|O|1997-02-20|1997-03-11|1997-03-19|TAKE BACK RETURN|FOB| pinto beans. even, e +46790|753|18|1|18|29767.50|0.08|0.03|N|O|1998-04-25|1998-06-07|1998-05-22|DELIVER IN PERSON|RAIL|ns. slyly ironic requests boost slyly i +46790|1928|73|2|23|42088.16|0.00|0.08|N|O|1998-04-16|1998-05-13|1998-04-18|DELIVER IN PERSON|MAIL|xes. quickly regular patter +46790|738|3|3|15|24580.95|0.05|0.08|N|O|1998-07-04|1998-05-27|1998-07-22|COLLECT COD|REG AIR|riously express fo +46790|1333|72|4|13|16046.29|0.08|0.07|N|O|1998-05-20|1998-05-11|1998-05-21|NONE|FOB|ts. ironic, bold pack +46791|1466|67|1|40|54698.40|0.03|0.08|R|F|1994-05-16|1994-05-29|1994-06-06|NONE|REG AIR|ithely ironic request +46791|84|35|2|32|31490.56|0.05|0.06|R|F|1994-04-13|1994-05-06|1994-04-16|DELIVER IN PERSON|SHIP|uriously exp +46791|495|54|3|4|5581.96|0.06|0.03|R|F|1994-06-09|1994-04-04|1994-06-11|COLLECT COD|MAIL|y regular accounts sleep blithely. ir +46791|695|96|4|29|46275.01|0.07|0.08|A|F|1994-06-12|1994-05-11|1994-07-06|DELIVER IN PERSON|SHIP|lly final excuses c +46791|505|36|5|13|18271.50|0.07|0.08|A|F|1994-05-12|1994-04-09|1994-06-06|COLLECT COD|REG AIR|ut the warhorses. final, express deposit +46816|987|90|1|29|54751.42|0.01|0.04|N|O|1996-04-04|1996-03-28|1996-04-27|COLLECT COD|TRUCK|o use alongside of +46816|1822|9|2|5|8619.10|0.03|0.02|N|O|1996-02-12|1996-03-31|1996-03-04|DELIVER IN PERSON|SHIP|nding pint +46816|234|89|3|19|21550.37|0.01|0.01|N|O|1996-04-11|1996-03-08|1996-04-16|DELIVER IN PERSON|AIR|gle. slyly bold acc +46816|1380|19|4|42|53817.96|0.09|0.01|N|O|1996-02-11|1996-03-11|1996-03-01|DELIVER IN PERSON|MAIL|tithes. thinly clo +46817|1043|49|1|20|18880.80|0.00|0.04|A|F|1992-11-10|1992-09-25|1992-12-07|NONE|AIR|ckages sleep blithely. blithel +46817|859|93|2|44|77433.40|0.01|0.08|R|F|1992-08-24|1992-09-18|1992-08-31|NONE|AIR| accounts wake fu +46817|771|68|3|23|38450.71|0.02|0.07|A|F|1992-08-14|1992-09-01|1992-08-24|DELIVER IN PERSON|MAIL|ial accounts will have to detect +46817|851|51|4|22|38540.70|0.07|0.04|R|F|1992-07-30|1992-09-25|1992-08-10|NONE|MAIL|s wake according to the evenly +46817|1972|73|5|49|91824.53|0.05|0.02|R|F|1992-11-23|1992-10-23|1992-12-10|TAKE BACK RETURN|TRUCK|s. silent theodolites sleep slyly. i +46818|1693|76|1|2|3189.38|0.06|0.02|N|O|1995-11-25|1996-01-27|1995-12-04|DELIVER IN PERSON|REG AIR|ince the slyly ironic ideas. furiousl +46819|1241|16|1|13|14849.12|0.00|0.02|N|O|1998-03-11|1998-01-28|1998-03-18|DELIVER IN PERSON|RAIL|y regular re +46819|1126|63|2|35|35949.20|0.08|0.04|N|O|1998-01-22|1997-12-25|1998-01-29|NONE|SHIP|cuses haggle ca +46819|1835|22|3|43|74683.69|0.09|0.05|N|O|1998-02-25|1998-01-26|1998-03-20|COLLECT COD|TRUCK|detect blithely against the flu +46819|456|57|4|37|50188.65|0.01|0.04|N|O|1998-02-02|1998-01-21|1998-02-10|DELIVER IN PERSON|AIR|ily regula +46820|1922|67|1|26|47421.92|0.01|0.00|N|O|1996-11-17|1996-10-04|1996-11-27|COLLECT COD|MAIL|thely pending deposits. sly, +46820|658|52|2|49|76373.85|0.02|0.05|N|O|1996-10-04|1996-09-30|1996-10-16|DELIVER IN PERSON|TRUCK|ggle carefully even requests. b +46820|289|44|3|29|34489.12|0.07|0.00|N|O|1996-10-31|1996-11-16|1996-11-15|COLLECT COD|RAIL|ular ideas. ironic accounts pri +46820|656|57|4|17|26463.05|0.10|0.03|N|O|1996-11-27|1996-11-09|1996-12-18|DELIVER IN PERSON|SHIP| platelets poach blithely furiousl +46820|750|51|5|11|18158.25|0.07|0.07|N|O|1996-09-09|1996-11-03|1996-09-22|COLLECT COD|RAIL|lar instructions boost carefully +46820|1468|86|6|39|53408.94|0.07|0.03|N|O|1996-11-19|1996-10-15|1996-11-23|NONE|RAIL| doubt blithely final instructions. expre +46821|490|91|1|36|50057.64|0.07|0.02|N|O|1996-04-26|1996-05-11|1996-05-13|COLLECT COD|SHIP|ptotes haggle upon the fluffily i +46822|544|35|1|7|10111.78|0.06|0.00|N|O|1997-05-19|1997-05-12|1997-06-05|TAKE BACK RETURN|MAIL|eas wake idly: +46822|934|37|2|42|77067.06|0.03|0.06|N|O|1997-05-19|1997-06-17|1997-05-24|NONE|TRUCK|cajole. carefully unus +46822|1801|45|3|28|47678.40|0.06|0.01|N|O|1997-05-01|1997-04-25|1997-05-23|COLLECT COD|FOB| frets sleep furious +46822|1137|38|4|7|7266.91|0.10|0.04|N|O|1997-05-22|1997-04-24|1997-06-13|COLLECT COD|AIR|ake. regular instructions after the +46822|393|78|5|3|3880.17|0.03|0.08|N|O|1997-06-01|1997-06-20|1997-06-04|DELIVER IN PERSON|RAIL|nic excuses hinder +46822|348|77|6|17|21221.78|0.02|0.05|N|O|1997-06-13|1997-06-03|1997-06-16|COLLECT COD|SHIP| beans haggle. regular, final depe +46822|1129|30|7|12|12361.44|0.02|0.07|N|O|1997-04-16|1997-05-28|1997-04-27|NONE|MAIL|ffily even deposits doubt fluffily even +46823|1950|83|1|39|72226.05|0.04|0.00|A|F|1994-04-08|1994-04-09|1994-04-28|DELIVER IN PERSON|TRUCK|r theodoli +46823|470|29|2|39|53448.33|0.05|0.07|A|F|1994-06-10|1994-05-09|1994-07-05|TAKE BACK RETURN|REG AIR|olites are carefully. quickly express in +46823|963|32|3|50|93198.00|0.04|0.05|R|F|1994-05-02|1994-04-22|1994-05-20|TAKE BACK RETURN|SHIP|rls affix o +46823|131|84|4|31|31965.03|0.03|0.05|R|F|1994-06-01|1994-06-03|1994-06-05|DELIVER IN PERSON|FOB|furiously final pearls. bold, regul +46823|310|95|5|23|27837.13|0.08|0.06|R|F|1994-04-21|1994-05-24|1994-04-24|DELIVER IN PERSON|MAIL|osits. furiously bold acc +46848|795|28|1|17|28828.43|0.07|0.03|A|F|1995-01-18|1994-12-27|1995-01-26|TAKE BACK RETURN|MAIL|ding packages. +46848|1100|36|2|7|7007.70|0.05|0.04|R|F|1995-01-15|1994-12-24|1995-02-11|TAKE BACK RETURN|REG AIR|ntegrate blithely. s +46848|1736|79|3|40|65509.20|0.03|0.05|A|F|1995-02-02|1994-12-12|1995-02-08|TAKE BACK RETURN|AIR|ct boldly ironic, ironic hockey playe +46849|1194|31|1|37|40522.03|0.09|0.04|A|F|1994-03-26|1994-03-12|1994-03-28|COLLECT COD|SHIP|yly regular packages. qui +46850|1082|88|1|16|15729.28|0.04|0.00|A|F|1993-12-21|1994-03-04|1993-12-30|NONE|AIR| final pinto beans use permanently carefu +46851|1809|39|1|32|54745.60|0.00|0.00|N|O|1996-12-12|1997-02-26|1997-01-02|TAKE BACK RETURN|FOB|posits sleep furiously slyl +46851|1667|68|2|14|21961.24|0.08|0.03|N|O|1997-01-29|1997-02-26|1997-01-31|DELIVER IN PERSON|RAIL| blithely final deposits; furiously +46851|711|44|3|1|1611.71|0.07|0.03|N|O|1997-04-01|1997-01-24|1997-04-30|COLLECT COD|AIR|ully final Tiresias will haggl +46851|316|45|4|1|1216.31|0.02|0.04|N|O|1997-01-20|1997-02-24|1997-02-06|DELIVER IN PERSON|RAIL|lithely final packages. slyly regular +46851|64|40|5|36|34706.16|0.09|0.05|N|O|1997-04-01|1997-01-27|1997-05-01|COLLECT COD|TRUCK|s dazzle blithely sp +46852|111|90|1|33|33366.63|0.06|0.01|A|F|1992-03-28|1992-04-14|1992-04-01|TAKE BACK RETURN|REG AIR| accounts boost bold pi +46852|928|29|2|35|64012.20|0.10|0.04|A|F|1992-04-21|1992-03-12|1992-05-10|COLLECT COD|MAIL|counts. slyly even platelets use +46852|601|64|3|6|9009.60|0.09|0.02|A|F|1992-02-24|1992-04-23|1992-03-19|DELIVER IN PERSON|AIR|ourts wake slyly along the qu +46852|883|83|4|31|55300.28|0.00|0.03|R|F|1992-02-12|1992-04-26|1992-03-07|COLLECT COD|TRUCK|, special fo +46852|1282|20|5|43|50881.04|0.04|0.05|R|F|1992-05-11|1992-04-20|1992-05-22|DELIVER IN PERSON|MAIL|ccording to the furiously special requ +46852|855|55|6|35|61454.75|0.03|0.02|R|F|1992-05-18|1992-02-29|1992-05-19|TAKE BACK RETURN|RAIL|less pinto beans sleep blithely r +46852|1380|81|7|38|48692.44|0.01|0.06|A|F|1992-04-21|1992-03-13|1992-04-26|TAKE BACK RETURN|MAIL|blithe instructions breach slyly. pendi +46853|789|22|1|45|76040.10|0.09|0.04|A|F|1994-09-12|1994-06-26|1994-09-28|NONE|FOB|eas about the packages mold quick +46853|1399|14|2|47|61118.33|0.09|0.05|A|F|1994-06-04|1994-06-28|1994-06-19|NONE|FOB|ar ideas. slyly ironi +46853|283|11|3|49|57980.72|0.05|0.07|A|F|1994-09-08|1994-07-06|1994-10-08|NONE|TRUCK|furiously about the furiously expre +46853|1523|24|4|43|61254.36|0.01|0.04|A|F|1994-09-11|1994-06-26|1994-10-04|DELIVER IN PERSON|MAIL|slyly even pinto beans. blithely unusual +46853|1128|29|5|24|24698.88|0.06|0.03|R|F|1994-09-07|1994-07-16|1994-10-06|COLLECT COD|TRUCK|uick, even foxes eat fluffily al +46853|1567|8|6|22|32308.32|0.01|0.01|A|F|1994-09-10|1994-08-04|1994-09-19|COLLECT COD|TRUCK|ges cajole blithely according to +46853|76|2|7|12|11712.84|0.06|0.03|R|F|1994-08-03|1994-08-01|1994-08-04|NONE|FOB|blithely pending tithes sleep blithe +46854|1915|48|1|40|72676.40|0.03|0.07|N|O|1996-12-04|1996-12-08|1997-01-01|NONE|FOB|nding pinto bea +46854|1752|37|2|29|47958.75|0.01|0.00|N|O|1996-11-30|1996-12-08|1996-12-26|COLLECT COD|TRUCK|telets hinder. furiously final acc +46854|1212|24|3|26|28943.46|0.03|0.00|N|O|1996-09-22|1996-11-21|1996-09-25|DELIVER IN PERSON|AIR|leep fluffily finally ironic accou +46854|1369|84|4|40|50814.40|0.02|0.08|N|O|1996-12-30|1996-11-15|1997-01-15|COLLECT COD|AIR|regular the +46854|1739|82|5|14|22970.22|0.07|0.02|N|O|1996-11-21|1996-11-04|1996-12-03|DELIVER IN PERSON|MAIL|requests. wart +46855|279|61|1|13|15330.51|0.04|0.07|R|F|1993-03-08|1993-04-27|1993-04-06|TAKE BACK RETURN|FOB|ans about the sp +46855|1635|18|2|6|9219.78|0.09|0.05|R|F|1993-04-20|1993-05-17|1993-05-06|DELIVER IN PERSON|REG AIR|uiet pinto beans. carefully regular pa +46855|1631|55|3|22|33717.86|0.03|0.04|A|F|1993-06-02|1993-04-22|1993-06-05|COLLECT COD|SHIP|al requests. fluffily even +46855|506|97|4|7|9845.50|0.09|0.04|R|F|1993-03-23|1993-05-11|1993-04-09|NONE|SHIP| regular, close requests haggl +46880|1317|32|1|9|10964.79|0.02|0.05|A|F|1993-09-29|1993-08-18|1993-10-19|DELIVER IN PERSON|MAIL| boost pending, dogged id +46881|1361|62|1|23|29034.28|0.10|0.00|A|F|1995-01-16|1995-01-05|1995-02-10|NONE|REG AIR|egular accoun +46881|620|14|2|6|9123.72|0.06|0.07|A|F|1995-01-18|1994-12-10|1995-01-25|TAKE BACK RETURN|RAIL|s accounts. acco +46881|620|52|3|36|54742.32|0.04|0.03|A|F|1994-12-07|1994-12-11|1995-01-04|DELIVER IN PERSON|AIR|heodolites about the sly +46881|437|25|4|44|58846.92|0.04|0.01|A|F|1994-12-30|1995-01-04|1995-01-28|COLLECT COD|MAIL|slyly pending accounts. quickly +46881|1103|40|5|47|47192.70|0.03|0.08|R|F|1995-02-01|1994-12-04|1995-02-18|NONE|RAIL|s. accounts across t +46881|1958|91|6|6|11159.70|0.05|0.02|R|F|1995-01-31|1994-12-10|1995-02-26|TAKE BACK RETURN|AIR|gle about the blithe +46882|1528|69|1|25|35738.00|0.01|0.00|N|O|1997-07-24|1997-04-27|1997-08-06|COLLECT COD|REG AIR|tes. packages sleep quickly? close, regular +46882|750|51|2|14|23110.50|0.04|0.00|N|O|1997-04-13|1997-06-15|1997-04-27|NONE|AIR|ts along the ironic platelets haggle sly +46882|1252|53|3|13|14992.25|0.02|0.05|N|O|1997-07-04|1997-06-11|1997-07-27|TAKE BACK RETURN|AIR|osits. requests wake slyly. slyly pe +46882|247|75|4|50|57362.00|0.06|0.04|N|O|1997-06-30|1997-06-07|1997-07-10|COLLECT COD|RAIL|rhorses against the bl +46882|1890|91|5|35|62716.15|0.00|0.02|N|O|1997-04-08|1997-05-18|1997-04-28|NONE|RAIL|e after the carefully f +46883|1348|25|1|7|8745.38|0.10|0.04|N|O|1997-06-14|1997-07-14|1997-07-07|DELIVER IN PERSON|AIR|lly even foxes according +46884|499|29|1|25|34987.25|0.07|0.00|R|F|1994-04-14|1994-03-12|1994-05-02|NONE|FOB| regular deposits ha +46884|1598|99|2|49|73479.91|0.04|0.01|A|F|1994-03-10|1994-03-27|1994-03-18|TAKE BACK RETURN|MAIL|e foxes. unusual multipliers above the +46884|1137|46|3|40|41525.20|0.00|0.03|R|F|1994-04-13|1994-03-04|1994-04-29|COLLECT COD|AIR|de of the fluffily unusual accounts. fur +46884|1928|29|4|28|51237.76|0.00|0.07|R|F|1994-05-05|1994-04-03|1994-05-31|DELIVER IN PERSON|MAIL|es wake against the realms. fin +46884|1399|76|5|3|3901.17|0.01|0.00|R|F|1994-03-28|1994-03-13|1994-04-26|NONE|SHIP|e furiously final instructions. fu +46884|1522|23|6|43|61211.36|0.10|0.07|R|F|1994-01-19|1994-03-14|1994-01-29|NONE|REG AIR|ts. quickly pending instructions hagg +46884|1730|73|7|16|26107.68|0.02|0.07|A|F|1994-03-08|1994-04-03|1994-03-11|DELIVER IN PERSON|REG AIR|blithely across the iron +46885|1346|85|1|8|9978.72|0.06|0.03|N|O|1995-07-28|1995-08-22|1995-07-31|NONE|TRUCK|metimes unusual accounts. doggedly even ide +46885|1455|34|2|16|21703.20|0.00|0.05|N|O|1995-07-21|1995-09-05|1995-08-18|COLLECT COD|TRUCK| requests. +46885|484|85|3|37|51225.76|0.04|0.05|N|O|1995-08-04|1995-08-01|1995-08-26|DELIVER IN PERSON|MAIL|y over the fluffily silent requests. +46885|356|41|4|28|35177.80|0.02|0.05|N|O|1995-09-12|1995-07-25|1995-10-06|TAKE BACK RETURN|TRUCK|requests. quickly final deposits hinder f +46885|530|91|5|48|68665.44|0.04|0.00|N|O|1995-10-06|1995-08-17|1995-10-21|COLLECT COD|MAIL|s instructions wake a +46885|586|77|6|2|2973.16|0.06|0.08|N|O|1995-06-18|1995-08-27|1995-06-23|COLLECT COD|SHIP|hins wake. quickly unusu +46885|425|84|7|28|37111.76|0.09|0.06|N|O|1995-08-11|1995-08-04|1995-09-07|NONE|TRUCK|foxes-- sl +46886|698|99|1|2|3197.38|0.02|0.03|N|O|1998-03-18|1998-05-20|1998-03-28|NONE|AIR|ggle. packages nod blithely +46886|176|3|2|4|4304.68|0.04|0.03|N|O|1998-04-29|1998-04-29|1998-05-19|COLLECT COD|REG AIR|c requests. quickly sile +46887|1242|17|1|11|12575.64|0.04|0.06|N|O|1997-09-03|1997-11-24|1997-09-18|DELIVER IN PERSON|AIR|eodolites boost carefully quickly b +46887|1735|62|2|9|14730.57|0.04|0.02|N|O|1997-12-15|1997-10-10|1998-01-05|DELIVER IN PERSON|TRUCK|nal packages; slyly ru +46887|284|39|3|39|46186.92|0.10|0.00|N|O|1997-09-23|1997-10-17|1997-10-23|DELIVER IN PERSON|RAIL|ckly silently regular +46887|701|2|4|46|73678.20|0.00|0.00|N|O|1997-11-07|1997-10-21|1997-11-20|TAKE BACK RETURN|REG AIR|slyly ironic reque +46912|1858|88|1|4|7039.40|0.07|0.01|A|F|1992-09-07|1992-09-07|1992-09-17|NONE|FOB|erns. blithely ironic accounts +46912|320|77|2|45|54914.40|0.10|0.08|R|F|1992-10-13|1992-09-12|1992-10-25|COLLECT COD|FOB|regular asymp +46912|414|44|3|6|7886.46|0.05|0.01|R|F|1992-08-17|1992-09-08|1992-09-08|TAKE BACK RETURN|REG AIR|packages haggle quick +46912|469|70|4|18|24650.28|0.05|0.04|R|F|1992-10-15|1992-08-30|1992-11-14|TAKE BACK RETURN|SHIP|y even asymptotes hag +46912|1854|41|5|46|80769.10|0.03|0.08|A|F|1992-10-05|1992-08-03|1992-10-10|COLLECT COD|SHIP|ar packages-- slyly special packages are. +46913|1501|22|1|18|25245.00|0.03|0.08|N|O|1998-05-01|1998-04-09|1998-05-28|DELIVER IN PERSON|AIR|osits wake slyly. furiously pending +46913|2|53|2|19|17138.00|0.10|0.00|N|O|1998-06-06|1998-04-23|1998-06-18|TAKE BACK RETURN|TRUCK|ing excuses wake carefully regular, s +46914|14|90|1|38|34732.38|0.04|0.06|N|O|1996-08-25|1996-10-30|1996-09-14|TAKE BACK RETURN|MAIL|ross the regularly unusual excus +46914|101|54|2|13|13014.30|0.07|0.08|N|O|1996-08-16|1996-10-31|1996-09-09|DELIVER IN PERSON|AIR|o are carefully after the slyly final +46914|1039|75|3|2|1880.06|0.06|0.03|N|O|1996-11-14|1996-10-14|1996-11-29|DELIVER IN PERSON|SHIP|g blithely. quickly final +46914|147|48|4|4|4188.56|0.05|0.04|N|O|1996-08-23|1996-09-29|1996-09-19|TAKE BACK RETURN|MAIL| the sly ideas? fluffi +46914|487|88|5|29|40236.92|0.04|0.01|N|O|1996-12-02|1996-10-16|1997-01-01|DELIVER IN PERSON|TRUCK|ns wake blithely pending asymptotes. b +46915|1996|85|1|18|34163.82|0.08|0.08|R|F|1994-10-24|1994-09-10|1994-11-08|DELIVER IN PERSON|MAIL|gside of th +46915|1085|21|2|26|25638.08|0.01|0.01|A|F|1994-08-12|1994-09-07|1994-09-10|NONE|FOB|ar requests. final accoun +46915|739|36|3|23|37713.79|0.09|0.08|R|F|1994-10-09|1994-09-21|1994-11-07|NONE|SHIP|lly according to the ironic requests: re +46916|523|84|1|37|52670.24|0.01|0.04|N|O|1996-01-31|1995-11-19|1996-02-01|DELIVER IN PERSON|FOB|to the fluffily final pack +46916|1191|64|2|5|5460.95|0.02|0.05|N|O|1995-10-10|1995-12-10|1995-11-02|DELIVER IN PERSON|SHIP|final packages. carefully ironi +46916|1600|81|3|7|10511.20|0.03|0.00|N|O|1996-01-16|1995-12-05|1996-01-30|COLLECT COD|MAIL|ular packa +46916|291|92|4|32|38121.28|0.06|0.01|N|O|1995-11-29|1995-12-26|1995-12-02|COLLECT COD|FOB|ly express theodol +46916|1054|60|5|1|955.05|0.09|0.07|N|O|1995-12-07|1995-11-30|1995-12-15|DELIVER IN PERSON|RAIL|special accounts sleep furiously. unusua +46916|1690|91|6|14|22283.66|0.03|0.02|N|O|1995-11-27|1995-12-12|1995-12-25|TAKE BACK RETURN|RAIL|mong the blithely r +46917|1543|24|1|39|56337.06|0.08|0.03|R|F|1993-10-23|1993-08-20|1993-11-04|COLLECT COD|FOB|ly regular deposits. carefully even cou +46917|1068|39|2|26|25195.56|0.02|0.03|A|F|1993-10-07|1993-10-06|1993-10-22|TAKE BACK RETURN|RAIL|e regular packages? dogg +46917|628|29|3|46|70316.52|0.02|0.04|R|F|1993-09-23|1993-09-08|1993-10-06|NONE|SHIP|packages above the always thi +46917|840|7|4|12|20890.08|0.06|0.04|R|F|1993-08-11|1993-09-07|1993-08-27|COLLECT COD|AIR| foxes cajole. accou +46917|1719|62|5|1|1620.71|0.05|0.02|R|F|1993-08-22|1993-08-21|1993-09-20|DELIVER IN PERSON|FOB| across the quickly regular courts-- +46918|478|8|1|28|38597.16|0.03|0.06|N|O|1996-08-15|1996-08-03|1996-09-06|TAKE BACK RETURN|TRUCK| carefully even requests are carefully alon +46918|1800|27|2|26|44246.80|0.05|0.03|N|O|1996-07-16|1996-09-11|1996-08-10|TAKE BACK RETURN|AIR|hy deposits. always express deposi +46918|895|96|3|1|1795.89|0.05|0.07|N|O|1996-09-13|1996-08-11|1996-10-08|COLLECT COD|RAIL|le furiously furio +46918|104|83|4|38|38155.80|0.07|0.02|N|O|1996-09-13|1996-09-19|1996-10-06|TAKE BACK RETURN|SHIP|ts sleep slyly busy dugouts. ca +46919|1966|11|1|29|54170.84|0.03|0.06|A|F|1994-09-20|1994-07-22|1994-10-13|DELIVER IN PERSON|TRUCK|y instructions. caref +46919|916|17|2|35|63591.85|0.06|0.08|R|F|1994-10-15|1994-07-29|1994-10-16|NONE|SHIP|telets alongside of the final instructio +46919|1467|46|3|3|4105.38|0.07|0.03|A|F|1994-07-23|1994-09-08|1994-07-26|COLLECT COD|RAIL|yly slyly regular accounts. furiously r +46919|793|90|4|21|35569.59|0.04|0.08|R|F|1994-08-02|1994-07-27|1994-08-18|DELIVER IN PERSON|MAIL| wake blithely after the regular fox +46944|881|81|1|46|81966.48|0.03|0.06|N|O|1996-02-28|1996-03-31|1996-03-14|COLLECT COD|AIR|furiously carefully pen +46944|351|80|2|15|18770.25|0.03|0.03|N|O|1996-03-18|1996-05-03|1996-03-23|TAKE BACK RETURN|MAIL|. even deposits are furiously +46944|429|17|3|15|19941.30|0.02|0.05|N|O|1996-06-02|1996-04-24|1996-06-27|NONE|TRUCK|special Tiresias haggle. plat +46944|741|42|4|22|36118.28|0.07|0.08|N|O|1996-06-18|1996-05-11|1996-07-11|NONE|REG AIR|mptotes boost fluffily +46944|1433|12|5|10|13344.30|0.03|0.05|N|O|1996-02-28|1996-05-13|1996-03-11|DELIVER IN PERSON|SHIP|e regularly even requests. +46944|80|31|6|9|8820.72|0.06|0.00|N|O|1996-05-27|1996-04-19|1996-06-22|TAKE BACK RETURN|MAIL|ial requests. ironic reques +46945|160|13|1|29|30744.64|0.09|0.08|A|F|1993-04-15|1993-03-28|1993-05-11|NONE|MAIL|ongside of the even, ir +46945|718|15|2|3|4856.13|0.08|0.06|R|F|1993-04-26|1993-02-24|1993-04-30|TAKE BACK RETURN|MAIL|ests. blithely final +46945|1337|14|3|25|30958.25|0.01|0.06|R|F|1993-02-14|1993-03-08|1993-02-16|NONE|MAIL|the slyly ironic packages wak +46945|194|47|4|11|12036.09|0.07|0.04|R|F|1993-03-04|1993-03-18|1993-03-19|NONE|TRUCK|st bravely qu +46946|994|95|1|11|20844.89|0.06|0.08|N|O|1998-01-27|1998-03-03|1998-02-16|COLLECT COD|AIR|w blithely. carefu +46946|648|11|2|22|34070.08|0.10|0.03|N|O|1998-03-27|1998-02-10|1998-04-02|DELIVER IN PERSON|FOB|efully special sentiments breach b +46946|1641|42|3|27|41651.28|0.02|0.03|N|O|1998-01-13|1998-01-30|1998-01-31|COLLECT COD|AIR|fluffily furiously +46946|1417|18|4|8|10547.28|0.05|0.08|N|O|1998-01-04|1998-02-09|1998-01-10|TAKE BACK RETURN|MAIL|. blithely ironic deposits enga +46946|471|1|5|35|48001.45|0.10|0.07|N|O|1998-03-15|1998-01-23|1998-03-30|DELIVER IN PERSON|RAIL| final deposits hag +46946|833|67|6|33|57216.39|0.08|0.02|N|O|1998-02-24|1998-01-23|1998-03-18|TAKE BACK RETURN|MAIL|ual dolphins +46947|279|34|1|16|18868.32|0.08|0.07|A|F|1994-03-07|1994-02-16|1994-03-16|NONE|MAIL|ress platele +46948|367|68|1|17|21545.12|0.02|0.05|A|F|1993-05-24|1993-06-21|1993-06-22|NONE|MAIL|c dolphins. +46948|408|96|2|16|20934.40|0.00|0.02|R|F|1993-08-05|1993-06-28|1993-08-11|NONE|AIR|final, regu +46948|1587|8|3|41|61031.78|0.10|0.08|A|F|1993-08-15|1993-08-12|1993-08-21|TAKE BACK RETURN|TRUCK|kly express reques +46948|53|29|4|36|34309.80|0.00|0.02|A|F|1993-09-04|1993-06-28|1993-09-18|TAKE BACK RETURN|REG AIR|nts. ironic, +46949|1895|96|1|13|23359.57|0.01|0.08|R|F|1993-05-05|1993-05-12|1993-05-30|DELIVER IN PERSON|MAIL|ndencies cajole fur +46949|921|22|2|32|58301.44|0.00|0.05|R|F|1993-06-03|1993-05-09|1993-06-04|COLLECT COD|TRUCK|ckly pending excuses +46949|1291|92|3|34|40537.86|0.02|0.03|R|F|1993-06-06|1993-05-18|1993-07-06|NONE|AIR|uses x-ray quickly above +46949|1233|8|4|34|38563.82|0.06|0.00|R|F|1993-07-06|1993-06-01|1993-07-24|TAKE BACK RETURN|AIR|bold, ironic th +46949|1535|56|5|45|64643.85|0.03|0.02|R|F|1993-03-19|1993-05-07|1993-04-01|NONE|TRUCK|ses. slowly even requests a +46950|430|31|1|37|49225.91|0.00|0.02|N|O|1997-06-21|1997-06-17|1997-06-23|COLLECT COD|REG AIR|nstructions haggle sometimes. bl +46950|413|1|2|10|13134.10|0.01|0.08|N|O|1997-04-21|1997-05-26|1997-05-12|NONE|MAIL|kly. blithely f +46950|751|48|3|12|19821.00|0.00|0.07|N|O|1997-05-07|1997-05-14|1997-06-04|NONE|RAIL| about the carefully express foxes. fluff +46951|1640|23|1|22|33916.08|0.08|0.03|N|O|1996-01-07|1996-01-22|1996-01-21|COLLECT COD|REG AIR|nt fluffily. carefully ironic theod +46976|425|55|1|6|7952.52|0.03|0.07|A|F|1994-07-01|1994-04-09|1994-07-17|COLLECT COD|RAIL|ns nag carefully-- idly +46976|1454|55|2|12|16265.40|0.06|0.04|A|F|1994-05-06|1994-04-11|1994-05-23|COLLECT COD|FOB|accounts nag. furiously ironic requests +46976|504|5|3|42|58989.00|0.01|0.06|A|F|1994-05-29|1994-04-21|1994-06-22|NONE|SHIP|even, express foxes boost +46977|1017|53|1|33|30294.33|0.10|0.08|R|F|1992-07-19|1992-06-22|1992-08-18|TAKE BACK RETURN|MAIL|ole slyly foxes! final, regular deposit +46977|647|10|2|14|21666.96|0.02|0.06|A|F|1992-07-20|1992-07-04|1992-08-03|NONE|MAIL|r the blithely +46977|557|48|3|5|7287.75|0.07|0.01|R|F|1992-05-28|1992-06-19|1992-06-05|TAKE BACK RETURN|FOB|ironic packages hang slyly ironic, +46977|1754|81|4|33|54639.75|0.04|0.02|R|F|1992-07-05|1992-08-02|1992-07-08|COLLECT COD|MAIL|y among the ironic, e +46978|997|98|1|47|89205.53|0.05|0.02|N|O|1998-09-13|1998-07-05|1998-09-14|TAKE BACK RETURN|SHIP|ecial warthogs. account +46978|301|30|2|17|20422.10|0.01|0.07|N|O|1998-09-23|1998-07-14|1998-10-23|COLLECT COD|AIR|y. quickly +46978|1791|18|3|15|25391.85|0.06|0.08|N|O|1998-08-14|1998-07-17|1998-08-27|COLLECT COD|AIR|lyly pending dependencies cajol +46979|1516|97|1|36|51030.36|0.06|0.07|A|F|1992-09-16|1992-08-24|1992-09-28|TAKE BACK RETURN|REG AIR|the pinto beans? foxes use +46979|546|37|2|18|26037.72|0.05|0.05|R|F|1992-08-25|1992-08-17|1992-09-17|NONE|SHIP| carefully even theodolit +46980|641|73|1|33|50874.12|0.09|0.01|R|F|1995-02-02|1995-04-18|1995-02-06|TAKE BACK RETURN|AIR|inal ideas are. f +46980|1364|79|2|28|35430.08|0.05|0.08|R|F|1995-04-13|1995-03-10|1995-04-18|COLLECT COD|MAIL|inal theodolites boost carefully accor +46980|549|50|3|24|34788.96|0.06|0.01|A|F|1995-05-16|1995-04-03|1995-06-03|NONE|TRUCK|final requests use above the +46981|973|74|1|23|43101.31|0.03|0.07|A|F|1994-02-12|1994-04-13|1994-03-11|COLLECT COD|FOB|hely special courts. e +46981|768|33|2|16|26700.16|0.00|0.04|A|F|1994-03-26|1994-03-20|1994-04-17|DELIVER IN PERSON|REG AIR|even accounts lose. e +46981|530|61|3|7|10013.71|0.08|0.00|A|F|1994-04-20|1994-04-07|1994-04-27|COLLECT COD|REG AIR|nts. pending r +46981|292|20|4|28|33384.12|0.03|0.01|A|F|1994-06-03|1994-05-07|1994-06-30|DELIVER IN PERSON|REG AIR|ag furiously +46981|345|30|5|37|46077.58|0.09|0.01|A|F|1994-04-05|1994-04-16|1994-04-16|DELIVER IN PERSON|REG AIR|lly blithe ideas; blithely express +46982|181|60|1|7|7568.26|0.09|0.03|N|O|1996-06-26|1996-09-05|1996-07-04|TAKE BACK RETURN|REG AIR|y ironic packages. furiously regular +46983|1334|73|1|3|3705.99|0.01|0.05|N|O|1996-05-19|1996-06-07|1996-06-18|TAKE BACK RETURN|TRUCK|. fluffily final requests about the blit +46983|1991|36|2|29|54896.71|0.02|0.05|N|O|1996-05-13|1996-06-18|1996-06-10|TAKE BACK RETURN|FOB| according to the blithely express accou +46983|510|1|3|2|2821.02|0.09|0.01|N|O|1996-08-09|1996-07-14|1996-09-04|COLLECT COD|TRUCK|ending packages across the perman +47008|331|88|1|38|46790.54|0.05|0.04|N|O|1997-09-10|1997-07-14|1997-10-08|NONE|RAIL|s cajole blithely ironic sheaves. s +47009|1649|73|1|17|26360.88|0.07|0.05|R|F|1994-07-10|1994-08-02|1994-07-15|TAKE BACK RETURN|FOB|uickly across the quickly +47009|564|95|2|37|54188.72|0.04|0.00|R|F|1994-06-23|1994-07-20|1994-07-11|DELIVER IN PERSON|FOB|can boost furiously r +47010|1113|14|1|32|32451.52|0.07|0.06|N|O|1995-12-19|1995-11-04|1996-01-11|NONE|RAIL|leep at the final courts. carefully bol +47010|544|75|2|29|41891.66|0.00|0.02|N|O|1995-10-12|1995-11-09|1995-10-13|TAKE BACK RETURN|MAIL| regular, iro +47010|919|20|3|44|80076.04|0.05|0.01|N|O|1995-10-11|1995-12-23|1995-11-03|DELIVER IN PERSON|FOB|sits eat. blithely bold packa +47010|1889|33|4|20|35817.60|0.10|0.07|N|O|1995-10-23|1995-12-22|1995-11-09|DELIVER IN PERSON|SHIP|deas. slyly ir +47011|682|14|1|46|72803.28|0.03|0.00|A|F|1994-04-16|1994-04-06|1994-05-05|NONE|REG AIR|silently after the ironic theodolites. +47011|1218|19|2|11|12311.31|0.06|0.01|R|F|1994-03-06|1994-05-19|1994-03-13|COLLECT COD|MAIL|ole blithe +47011|1424|42|3|35|46389.70|0.03|0.04|A|F|1994-06-02|1994-04-20|1994-07-02|DELIVER IN PERSON|TRUCK|l packages. blithely caref +47011|1400|1|4|9|11712.60|0.10|0.03|R|F|1994-05-07|1994-03-28|1994-05-10|NONE|SHIP|ccounts. final, regula +47011|1204|42|5|39|43102.80|0.05|0.00|R|F|1994-03-31|1994-05-21|1994-04-07|COLLECT COD|AIR|. ironic, even ideas sleep carefully quick +47012|1657|81|1|40|62346.00|0.09|0.00|R|F|1993-09-09|1993-08-10|1993-09-10|COLLECT COD|TRUCK|ngside of the asymptote +47012|836|37|2|12|20841.96|0.04|0.06|R|F|1993-05-19|1993-07-24|1993-06-14|TAKE BACK RETURN|MAIL|ites. regular i +47013|463|51|1|35|47721.10|0.01|0.04|N|O|1996-09-01|1996-10-22|1996-09-19|COLLECT COD|TRUCK|ly even accounts. blithely exp +47014|976|79|1|50|93848.50|0.07|0.02|R|F|1992-08-31|1992-06-18|1992-09-11|DELIVER IN PERSON|REG AIR|c, silent deposits. final, ironic forges ac +47014|1394|71|2|19|24612.41|0.03|0.08|R|F|1992-08-06|1992-06-16|1992-08-25|COLLECT COD|TRUCK|g the packa +47014|1835|79|3|27|46894.41|0.10|0.03|A|F|1992-06-24|1992-08-04|1992-07-05|NONE|TRUCK|egular ideas need to serve quickly +47015|1227|39|1|42|47385.24|0.05|0.04|A|F|1995-04-30|1995-03-22|1995-05-01|TAKE BACK RETURN|AIR|even deposits. regular +47015|1952|97|2|48|88989.60|0.09|0.07|R|F|1995-03-07|1995-03-31|1995-03-11|COLLECT COD|RAIL| deposits. furiously eve +47015|1119|20|3|34|34683.74|0.04|0.07|N|F|1995-06-06|1995-04-17|1995-06-22|NONE|RAIL|equests cajole carefully +47015|1974|63|4|49|91922.53|0.05|0.02|A|F|1995-04-18|1995-03-31|1995-05-14|NONE|AIR|arefully across the furiously slow pack +47040|324|25|1|21|25710.72|0.00|0.06|A|F|1993-10-29|1993-10-05|1993-11-19|DELIVER IN PERSON|REG AIR|ing deposits. furiou +47040|584|85|2|29|43052.82|0.08|0.04|A|F|1993-11-14|1993-10-28|1993-12-06|TAKE BACK RETURN|TRUCK|slowly even packages. quickly bold acco +47040|1168|69|3|27|28867.32|0.06|0.06|R|F|1993-09-18|1993-09-29|1993-09-29|COLLECT COD|REG AIR|regular dolphins +47041|1263|64|1|42|48898.92|0.03|0.05|R|F|1992-05-04|1992-06-27|1992-05-11|TAKE BACK RETURN|REG AIR| at the express +47041|400|85|2|17|22106.80|0.06|0.07|A|F|1992-04-20|1992-06-14|1992-05-18|DELIVER IN PERSON|AIR|its haggle quickly. idly final courts aga +47042|1423|41|1|16|21190.72|0.10|0.05|R|F|1992-04-10|1992-05-05|1992-05-03|COLLECT COD|SHIP|iously according to the quickly bold +47042|806|40|2|43|73392.40|0.04|0.06|R|F|1992-05-23|1992-05-12|1992-06-03|TAKE BACK RETURN|TRUCK|dly even pains affi +47042|345|74|3|47|58530.98|0.08|0.00|R|F|1992-05-14|1992-05-09|1992-06-01|NONE|SHIP|ent, ironic reques +47042|1209|84|4|10|11102.00|0.07|0.08|A|F|1992-05-29|1992-04-15|1992-05-30|DELIVER IN PERSON|REG AIR|sts. even requests hagg +47042|1091|97|5|17|16865.53|0.04|0.08|R|F|1992-04-04|1992-04-24|1992-04-21|DELIVER IN PERSON|AIR|ular accounts nag +47042|1822|52|6|49|84467.18|0.00|0.04|R|F|1992-05-10|1992-05-19|1992-06-08|COLLECT COD|FOB|ans sleep after the +47042|1547|48|7|50|72427.00|0.06|0.03|R|F|1992-06-16|1992-04-21|1992-06-26|DELIVER IN PERSON|SHIP| boost carefully above the careful +47043|1712|97|1|4|6454.84|0.01|0.04|N|O|1995-12-20|1995-11-26|1995-12-29|TAKE BACK RETURN|REG AIR|thely after the f +47043|181|34|2|18|19461.24|0.02|0.03|N|O|1995-10-21|1995-11-14|1995-11-06|TAKE BACK RETURN|RAIL|pendencies +47044|840|41|1|36|62670.24|0.07|0.07|N|O|1998-10-15|1998-08-31|1998-10-28|COLLECT COD|REG AIR|y after the express, iro +47044|1262|74|2|39|45367.14|0.09|0.08|N|O|1998-10-17|1998-09-20|1998-11-03|NONE|TRUCK|ncies. quickly special requests along th +47044|590|51|3|36|53661.24|0.10|0.03|N|O|1998-08-09|1998-09-07|1998-08-24|COLLECT COD|FOB|ts. deposits above the quiet +47044|1741|26|4|16|26283.84|0.01|0.01|N|O|1998-08-17|1998-10-04|1998-09-05|TAKE BACK RETURN|FOB|d foxes. regular deposits haggl +47044|434|35|5|14|18682.02|0.04|0.04|N|O|1998-11-18|1998-10-07|1998-12-15|TAKE BACK RETURN|RAIL|according to the even p +47044|1795|22|6|19|32239.01|0.00|0.06|N|O|1998-09-14|1998-10-12|1998-09-27|TAKE BACK RETURN|REG AIR|ounts after the slyly even accounts wake fu +47045|856|57|1|12|21082.20|0.08|0.03|N|O|1997-04-27|1997-03-12|1997-05-20|DELIVER IN PERSON|RAIL|the fluffily pending asymptotes. request +47045|933|36|2|26|47682.18|0.01|0.05|N|O|1997-03-29|1997-02-16|1997-04-02|TAKE BACK RETURN|MAIL| accounts wake blithely regular accounts. r +47045|720|53|3|41|66449.52|0.03|0.03|N|O|1997-02-01|1997-03-05|1997-02-16|DELIVER IN PERSON|TRUCK|ttainments unwind regula +47045|821|55|4|50|86091.00|0.10|0.02|N|O|1997-04-18|1997-04-08|1997-04-21|TAKE BACK RETURN|SHIP|ic, final foxes +47046|616|10|1|6|9099.66|0.10|0.05|A|F|1994-05-24|1994-04-28|1994-05-30|COLLECT COD|REG AIR|l pinto beans nag caref +47046|807|7|2|24|40987.20|0.03|0.03|A|F|1994-04-26|1994-04-22|1994-05-04|DELIVER IN PERSON|AIR|ly regular ide +47046|115|42|3|14|14211.54|0.00|0.00|A|F|1994-05-12|1994-04-20|1994-05-25|NONE|RAIL| fluffily regular patterns. depo +47046|1535|16|4|50|71826.50|0.05|0.07|R|F|1994-03-14|1994-04-26|1994-03-16|DELIVER IN PERSON|REG AIR|lithely regular so +47047|1266|4|1|42|49024.92|0.05|0.04|A|F|1994-10-23|1994-10-12|1994-11-10|COLLECT COD|AIR|egular acco +47072|1010|81|1|28|25508.28|0.04|0.07|A|F|1995-01-31|1995-01-27|1995-02-18|TAKE BACK RETURN|SHIP|riously bold asymptotes nag blithely re +47073|489|48|1|18|25010.64|0.09|0.00|R|F|1994-09-30|1994-09-04|1994-10-23|DELIVER IN PERSON|TRUCK|ng the asy +47073|1192|65|2|23|25143.37|0.09|0.04|A|F|1994-09-30|1994-08-25|1994-10-26|COLLECT COD|FOB|ing to the ironic, even re +47073|261|62|3|10|11612.60|0.00|0.06|A|F|1994-10-17|1994-07-31|1994-10-29|COLLECT COD|MAIL|side of the fluffily fluffy r +47074|1200|9|1|32|35238.40|0.07|0.00|N|O|1998-02-27|1998-01-28|1998-03-26|COLLECT COD|RAIL|o beans. regular packages solve furi +47074|1687|88|2|25|39717.00|0.01|0.02|N|O|1998-01-24|1998-01-28|1998-01-30|NONE|SHIP|are carefu +47074|1513|34|3|4|5658.04|0.10|0.06|N|O|1998-02-23|1998-02-15|1998-02-24|NONE|TRUCK|ct. quickly iro +47074|1038|39|4|10|9390.30|0.10|0.06|N|O|1997-12-14|1998-01-05|1997-12-29|COLLECT COD|FOB|n dependencies. carefully regu +47074|244|26|5|7|8009.68|0.09|0.06|N|O|1998-03-29|1998-02-06|1998-04-15|NONE|REG AIR|ake slyly. furiously fi +47074|1930|19|6|30|54957.90|0.03|0.02|N|O|1998-01-15|1998-02-10|1998-01-20|NONE|FOB|tions nag quickly express waters. deposits +47074|1828|72|7|42|72652.44|0.02|0.08|N|O|1998-02-18|1998-01-06|1998-02-23|COLLECT COD|TRUCK|accounts run slyly within +47075|277|32|1|27|31786.29|0.10|0.08|N|O|1996-01-11|1995-11-24|1996-01-31|TAKE BACK RETURN|TRUCK| accounts. grouc +47075|1125|62|2|9|9235.08|0.09|0.06|N|O|1996-01-06|1995-11-29|1996-02-02|COLLECT COD|SHIP| bold, ironic theod +47075|176|55|3|31|33361.27|0.03|0.04|N|O|1996-01-10|1995-12-04|1996-02-03|COLLECT COD|SHIP|s, blithe foxes believe alongside of th +47075|889|56|4|35|62645.80|0.07|0.06|N|O|1995-10-20|1995-11-28|1995-10-26|DELIVER IN PERSON|MAIL|gular requests cajole closely furi +47075|649|50|5|44|68184.16|0.06|0.05|N|O|1995-11-08|1995-12-08|1995-11-15|DELIVER IN PERSON|MAIL|ly regular instructi +47076|1795|38|1|11|18664.69|0.04|0.05|R|F|1995-04-02|1995-02-16|1995-04-26|COLLECT COD|MAIL|ess requests nag. +47077|863|30|1|32|56443.52|0.03|0.01|N|O|1996-09-16|1996-09-08|1996-10-09|TAKE BACK RETURN|MAIL|jole above the +47077|877|78|2|46|81782.02|0.09|0.01|N|O|1996-10-01|1996-09-03|1996-10-29|COLLECT COD|SHIP|ly pending foxes +47077|303|60|3|27|32489.10|0.09|0.01|N|O|1996-08-01|1996-08-01|1996-08-12|NONE|MAIL|the theodolites bey +47077|1180|53|4|11|11892.98|0.04|0.08|N|O|1996-08-23|1996-08-14|1996-09-16|DELIVER IN PERSON|TRUCK|ole fluffily. +47077|1498|16|5|2|2798.98|0.06|0.02|N|O|1996-10-10|1996-08-17|1996-10-22|NONE|SHIP|fluffily packages. slyly final request +47077|1940|73|6|49|90255.06|0.08|0.07|N|O|1996-07-26|1996-08-23|1996-08-11|COLLECT COD|REG AIR|ructions sleep alongside of the slyly even +47078|1977|10|1|30|56369.10|0.04|0.08|R|F|1993-08-02|1993-06-24|1993-08-12|NONE|AIR|slyly even ideas cajole instructi +47078|1531|32|2|22|31515.66|0.10|0.06|R|F|1993-08-15|1993-07-05|1993-09-08|NONE|FOB|the express packages. furiously unusual +47078|1087|23|3|50|49404.00|0.06|0.04|A|F|1993-04-28|1993-07-09|1993-05-21|DELIVER IN PERSON|REG AIR|ful packages. accounts dete +47078|4|30|4|5|4520.00|0.03|0.05|R|F|1993-05-10|1993-07-04|1993-05-16|DELIVER IN PERSON|REG AIR|packages. final deposits use slyly: q +47078|1706|91|5|50|80385.00|0.00|0.07|R|F|1993-05-29|1993-06-15|1993-06-21|DELIVER IN PERSON|TRUCK|, final acco +47079|1548|69|1|37|53632.98|0.05|0.08|N|O|1996-04-06|1996-03-10|1996-04-10|DELIVER IN PERSON|AIR|, regular deposits cajole +47079|1759|2|2|12|19929.00|0.10|0.08|N|O|1996-01-28|1996-01-31|1996-02-12|TAKE BACK RETURN|RAIL|kages. fina +47079|429|17|3|8|10635.36|0.03|0.05|N|O|1996-02-12|1996-01-25|1996-03-04|TAKE BACK RETURN|FOB|ackages. carefully final notornis are bl +47079|30|31|4|4|3720.12|0.05|0.06|N|O|1996-02-24|1996-03-16|1996-03-25|COLLECT COD|AIR|nding sentiments around the packages haggl +47079|1542|23|5|45|64959.30|0.10|0.07|N|O|1996-03-17|1996-03-07|1996-04-12|NONE|FOB|rhorses: furious +47079|180|33|6|47|50768.46|0.03|0.04|N|O|1996-03-17|1996-02-24|1996-04-07|NONE|REG AIR|r requests are blithely express waters. fl +47079|842|76|7|27|47056.68|0.04|0.02|N|O|1996-01-26|1996-03-07|1996-01-29|NONE|SHIP|n pinto beans. final excu +47104|1339|40|1|38|47132.54|0.05|0.05|R|F|1992-06-29|1992-08-25|1992-07-12|TAKE BACK RETURN|SHIP|g the slyly even ideas. blithely eve +47104|145|98|2|17|17767.38|0.07|0.06|A|F|1992-09-01|1992-08-27|1992-09-18|COLLECT COD|REG AIR|. express f +47104|16|92|3|29|26564.29|0.06|0.05|R|F|1992-08-25|1992-09-20|1992-09-06|NONE|REG AIR|l deposits +47104|326|11|4|23|28205.36|0.04|0.07|R|F|1992-09-17|1992-07-23|1992-09-28|COLLECT COD|RAIL|ironic courts +47105|1473|13|1|22|30238.34|0.00|0.04|N|O|1996-07-23|1996-07-26|1996-08-02|NONE|MAIL|e carefully final ideas. even asymptotes +47105|179|80|2|14|15108.38|0.09|0.08|N|O|1996-08-25|1996-07-21|1996-09-13|DELIVER IN PERSON|MAIL|l dependencies. quickly +47105|1797|98|3|25|42469.75|0.01|0.07|N|O|1996-08-24|1996-06-23|1996-09-06|DELIVER IN PERSON|RAIL|es. quietly ironic depos +47105|931|34|4|45|82436.85|0.05|0.02|N|O|1996-07-07|1996-07-21|1996-07-31|NONE|FOB|al, pending depos +47105|377|78|5|5|6386.85|0.02|0.05|N|O|1996-08-08|1996-08-06|1996-08-23|TAKE BACK RETURN|TRUCK|ccounts sleep blithely s +47106|231|13|1|40|45249.20|0.05|0.07|N|O|1996-02-15|1995-12-08|1996-02-23|DELIVER IN PERSON|TRUCK|are blithely final dependencies. never +47106|1284|85|2|26|30817.28|0.08|0.06|N|O|1995-11-23|1995-12-16|1995-12-11|NONE|RAIL|ts will have to nag. +47106|1607|31|3|42|63361.20|0.03|0.06|N|O|1996-01-19|1996-01-10|1996-02-01|TAKE BACK RETURN|AIR|g carefully. +47106|845|12|4|34|59358.56|0.07|0.05|N|O|1995-11-29|1995-12-05|1995-12-04|DELIVER IN PERSON|REG AIR|gular theodolites. furiously even theod +47107|134|13|1|32|33092.16|0.06|0.05|N|O|1996-04-14|1996-03-22|1996-04-20|TAKE BACK RETURN|SHIP|. bold, final platelets breac +47107|823|23|2|26|44819.32|0.05|0.07|N|O|1996-05-24|1996-05-21|1996-06-11|COLLECT COD|AIR|regular deposits. even +47107|739|4|3|32|52471.36|0.06|0.00|N|O|1996-03-03|1996-05-17|1996-03-06|DELIVER IN PERSON|TRUCK|ronic theodolites sleep slyly about the u +47107|863|30|4|25|44096.50|0.07|0.02|N|O|1996-04-05|1996-03-28|1996-04-11|TAKE BACK RETURN|AIR|er the quickly fi +47107|691|54|5|8|12733.52|0.10|0.03|N|O|1996-03-10|1996-04-06|1996-03-28|TAKE BACK RETURN|MAIL|n accounts cajole slyly even pint +47108|692|55|1|21|33446.49|0.05|0.04|R|F|1994-12-14|1994-12-25|1994-12-18|NONE|SHIP|yly. even pack +47108|1441|42|2|11|14766.84|0.03|0.03|R|F|1995-02-06|1994-12-21|1995-03-04|NONE|AIR|t fluffily. slyly ironic accounts sl +47108|1641|83|3|28|43193.92|0.10|0.01|R|F|1995-01-09|1994-12-06|1995-01-14|DELIVER IN PERSON|REG AIR| carefully special ideas among the +47108|1963|8|4|36|67138.56|0.04|0.01|A|F|1994-12-30|1994-11-26|1995-01-21|NONE|AIR| try to are blithely according +47108|607|39|5|28|42212.80|0.08|0.08|A|F|1995-02-05|1994-11-15|1995-02-24|TAKE BACK RETURN|TRUCK| careful packages sleep quickly a +47108|1867|97|6|20|35377.20|0.04|0.06|A|F|1994-10-22|1994-11-21|1994-11-21|COLLECT COD|SHIP|ithely ironic fo +47109|1182|55|1|1|1083.18|0.04|0.03|N|O|1995-10-27|1995-11-02|1995-11-21|TAKE BACK RETURN|MAIL|deposits unwind quickly. carefully ironi +47109|13|64|2|21|19173.21|0.09|0.00|N|O|1995-10-29|1995-10-21|1995-11-08|COLLECT COD|AIR| the doggedly expres +47109|546|77|3|34|49182.36|0.03|0.07|N|O|1995-09-18|1995-12-06|1995-09-21|DELIVER IN PERSON|RAIL|osits wake sly reque +47109|1003|74|4|32|28928.00|0.04|0.01|N|O|1995-11-29|1995-11-17|1995-12-08|DELIVER IN PERSON|TRUCK|ntegrate blithely along the +47109|699|62|5|45|71986.05|0.01|0.00|N|O|1995-11-01|1995-11-09|1995-11-09|NONE|MAIL|se, regular instructions. unus +47109|1079|80|6|44|43123.08|0.09|0.02|N|O|1995-11-17|1995-11-22|1995-11-30|DELIVER IN PERSON|FOB|iously according to the slyly expre +47110|1940|85|1|41|75519.54|0.02|0.04|R|F|1993-11-30|1993-11-14|1993-12-27|TAKE BACK RETURN|MAIL| according to the bl +47111|1441|42|1|35|46985.40|0.00|0.08|N|O|1998-01-06|1997-11-26|1998-01-30|COLLECT COD|AIR|ronic packages. silent, final fox +47111|172|73|2|15|16082.55|0.05|0.08|N|O|1997-12-31|1997-10-20|1998-01-30|TAKE BACK RETURN|FOB|ealthy asymptotes. unusual +47111|663|64|3|3|4690.98|0.07|0.01|N|O|1997-09-12|1997-11-15|1997-09-18|TAKE BACK RETURN|FOB|ial accounts atop +47111|1506|27|4|1|1407.50|0.09|0.06|N|O|1997-09-29|1997-12-06|1997-09-30|COLLECT COD|RAIL|ly ironic pinto beans c +47111|594|95|5|3|4483.77|0.03|0.08|N|O|1997-12-02|1997-12-06|1997-12-24|NONE|FOB|ke accordin +47111|401|31|6|9|11712.60|0.08|0.04|N|O|1997-11-30|1997-10-12|1997-12-23|NONE|FOB|uickly regular requests. slyly even do +47111|1779|22|7|19|31934.63|0.10|0.04|N|O|1998-01-08|1997-11-30|1998-01-23|COLLECT COD|SHIP|y ironic deposits us +47136|1953|86|1|47|87182.65|0.04|0.04|A|F|1995-04-30|1995-03-11|1995-05-03|DELIVER IN PERSON|SHIP|lyly. expres +47136|615|16|2|41|62140.01|0.07|0.07|R|F|1995-05-02|1995-04-04|1995-05-14|COLLECT COD|SHIP| slyly careful +47137|1373|88|1|16|20389.92|0.02|0.05|N|O|1996-05-27|1996-06-03|1996-06-04|DELIVER IN PERSON|SHIP|arefully express deposits. +47137|1382|21|2|4|5133.52|0.07|0.00|N|O|1996-06-11|1996-06-04|1996-07-09|NONE|MAIL|ate quickly carefully even +47137|1622|23|3|21|31996.02|0.02|0.04|N|O|1996-06-19|1996-04-18|1996-06-21|DELIVER IN PERSON|SHIP|oss the slyly fi +47137|310|67|4|7|8472.17|0.08|0.03|N|O|1996-06-20|1996-05-13|1996-06-23|TAKE BACK RETURN|REG AIR|usly unusual +47138|1132|69|1|16|16530.08|0.07|0.05|A|F|1994-02-08|1994-04-02|1994-03-05|COLLECT COD|AIR|egular pinto b +47138|639|33|2|10|15396.30|0.09|0.07|R|F|1994-04-30|1994-02-19|1994-05-03|DELIVER IN PERSON|FOB|ccounts. deposits abou +47138|1728|29|3|41|66818.52|0.05|0.02|A|F|1994-04-20|1994-03-02|1994-05-08|COLLECT COD|SHIP| foxes wake carefully regular dep +47138|559|60|4|50|72977.50|0.07|0.01|R|F|1994-04-15|1994-04-10|1994-05-15|TAKE BACK RETURN|FOB|egular accou +47138|1029|35|5|35|32550.70|0.02|0.01|R|F|1994-01-29|1994-04-06|1994-02-06|NONE|RAIL| beans boost +47138|741|42|6|34|55819.16|0.07|0.02|R|F|1994-02-14|1994-03-22|1994-03-05|DELIVER IN PERSON|AIR|ithely silent instructions amon +47139|1687|29|1|39|61958.52|0.10|0.02|N|O|1997-06-23|1997-06-18|1997-07-11|TAKE BACK RETURN|REG AIR|blithely of the carefully final f +47139|1339|16|2|12|14883.96|0.06|0.05|N|O|1997-06-25|1997-08-03|1997-07-14|COLLECT COD|AIR|ic dependencies +47140|240|68|1|8|9121.92|0.06|0.06|N|O|1998-08-29|1998-08-17|1998-09-21|COLLECT COD|TRUCK|ravely alongside of the +47140|1103|76|2|47|47192.70|0.08|0.01|N|O|1998-07-05|1998-08-11|1998-07-16|COLLECT COD|MAIL|ts boost quietly after the slyly even packa +47140|246|28|3|47|53873.28|0.03|0.01|N|O|1998-09-03|1998-07-17|1998-09-19|NONE|AIR|ealthy dependencies wak +47140|377|62|4|29|37043.73|0.04|0.03|N|O|1998-09-01|1998-07-13|1998-09-02|DELIVER IN PERSON|REG AIR|ys final platelets detect blith +47140|781|78|5|3|5045.34|0.04|0.05|N|O|1998-06-18|1998-08-23|1998-06-26|TAKE BACK RETURN|TRUCK|dolphins sleep furio +47141|1069|75|1|49|47532.94|0.07|0.02|A|F|1994-12-21|1994-12-21|1995-01-10|TAKE BACK RETURN|AIR|ep fluffily. slyly unusual packages +47141|944|13|2|22|40588.68|0.09|0.00|A|F|1995-01-06|1994-12-16|1995-01-31|DELIVER IN PERSON|RAIL|ep carefully: carefully final +47141|1239|77|3|38|43328.74|0.09|0.00|A|F|1995-01-04|1994-11-19|1995-01-13|TAKE BACK RETURN|TRUCK|ts. furiously final ideas are furiously +47141|526|17|4|20|28530.40|0.02|0.08|A|F|1995-02-01|1994-12-10|1995-02-11|NONE|AIR|s are. carefully ironic dependenci +47142|48|24|1|43|40765.72|0.02|0.04|N|O|1996-06-08|1996-05-03|1996-07-05|NONE|REG AIR|ests cajole along the b +47142|1926|15|2|36|65805.12|0.01|0.03|N|O|1996-06-17|1996-06-19|1996-07-01|COLLECT COD|FOB| deposits use furiousl +47142|746|11|3|4|6586.96|0.10|0.02|N|O|1996-05-07|1996-05-15|1996-06-04|TAKE BACK RETURN|REG AIR|, final instruct +47143|1455|34|1|33|44762.85|0.09|0.06|N|O|1997-10-15|1997-11-16|1997-10-23|DELIVER IN PERSON|MAIL|leep quickly a +47143|1213|88|2|23|25626.83|0.07|0.08|N|O|1997-10-07|1997-09-20|1997-10-31|TAKE BACK RETURN|TRUCK|nding requests integrate slyly! ironic r +47143|11|87|3|44|40084.44|0.08|0.04|N|O|1997-10-24|1997-09-23|1997-10-28|TAKE BACK RETURN|REG AIR|side of the furiously even request +47143|1714|99|4|28|45239.88|0.05|0.02|N|O|1997-12-12|1997-10-31|1997-12-26|COLLECT COD|REG AIR|he furiously unusual asymptotes. fin +47168|296|24|1|17|20336.93|0.09|0.06|A|F|1994-07-03|1994-09-07|1994-07-19|DELIVER IN PERSON|MAIL| the quickly dogged accounts print fluffily +47168|132|85|2|13|13417.69|0.07|0.02|R|F|1994-08-15|1994-09-11|1994-08-17|NONE|AIR|round the blithely bold +47168|1698|22|3|1|1599.69|0.10|0.00|R|F|1994-10-13|1994-08-29|1994-11-01|NONE|MAIL|lly after the +47168|1434|13|4|38|50746.34|0.01|0.01|A|F|1994-09-09|1994-08-13|1994-09-29|NONE|RAIL|furiously sly asymptotes. fluffily stealthy +47168|863|63|5|27|47624.22|0.03|0.04|R|F|1994-08-05|1994-08-16|1994-08-12|DELIVER IN PERSON|AIR| carefully +47168|15|66|6|9|8235.09|0.01|0.01|R|F|1994-07-31|1994-07-24|1994-08-14|COLLECT COD|REG AIR|ly regular accounts alongsid +47168|981|16|7|32|60223.36|0.02|0.06|R|F|1994-07-28|1994-08-21|1994-07-29|DELIVER IN PERSON|RAIL|nd the carefully +47169|970|5|1|8|14967.76|0.09|0.08|R|F|1993-06-13|1993-05-05|1993-07-13|DELIVER IN PERSON|FOB|ully among the bl +47169|80|56|2|16|15681.28|0.03|0.03|R|F|1993-06-23|1993-05-15|1993-07-11|NONE|AIR|he furiously +47169|1934|79|3|16|29374.88|0.01|0.06|A|F|1993-03-21|1993-05-06|1993-04-16|COLLECT COD|TRUCK|as wake about the fluffily e +47169|1658|82|4|39|60826.35|0.03|0.04|A|F|1993-05-04|1993-04-24|1993-05-19|TAKE BACK RETURN|FOB|theodolites use slyly +47169|122|75|5|42|42929.04|0.03|0.08|A|F|1993-05-19|1993-04-24|1993-05-31|DELIVER IN PERSON|TRUCK|y. blithely final excuses sl +47169|1947|36|6|23|42525.62|0.06|0.03|A|F|1993-06-02|1993-05-11|1993-06-11|TAKE BACK RETURN|RAIL| must have to snooze s +47170|744|77|1|39|64144.86|0.06|0.06|N|O|1997-01-10|1996-12-14|1997-01-25|TAKE BACK RETURN|TRUCK|l ideas-- bold accounts wake +47170|1429|47|2|8|10643.36|0.06|0.07|N|O|1996-11-14|1996-12-16|1996-11-17|DELIVER IN PERSON|TRUCK|ts boost quickly unusual +47170|1274|75|3|14|16453.78|0.08|0.05|N|O|1996-10-28|1996-12-19|1996-11-24|TAKE BACK RETURN|SHIP|nal, ironic packages. blithely regular acco +47170|19|70|4|20|18380.20|0.04|0.07|N|O|1996-10-22|1996-11-20|1996-11-14|TAKE BACK RETURN|RAIL|ons according to the quickly ironic +47170|1135|36|5|28|29011.64|0.07|0.01|N|O|1996-11-23|1996-12-23|1996-11-27|DELIVER IN PERSON|AIR|g instructions across the even d +47171|152|79|1|37|38929.55|0.03|0.06|A|F|1993-04-21|1993-04-05|1993-05-13|COLLECT COD|MAIL|arefully. bold m +47171|490|20|2|15|20857.35|0.01|0.04|A|F|1993-04-06|1993-03-26|1993-04-26|COLLECT COD|FOB|de of the ex +47171|1601|25|3|1|1502.60|0.05|0.03|R|F|1993-01-18|1993-03-02|1993-01-28|DELIVER IN PERSON|FOB|accounts sleep slyly among the fina +47171|290|91|4|20|23805.80|0.10|0.07|R|F|1993-02-11|1993-02-19|1993-03-08|COLLECT COD|MAIL|g requests. carefully fina +47171|119|46|5|17|17324.87|0.07|0.08|R|F|1993-03-20|1993-02-13|1993-04-14|TAKE BACK RETURN|RAIL|usly bold packages unwind carefull +47171|1150|23|6|7|7358.05|0.09|0.01|R|F|1993-03-18|1993-03-24|1993-03-23|DELIVER IN PERSON|REG AIR|gside of the carefully eve +47172|1663|46|1|38|59457.08|0.06|0.08|R|F|1993-12-09|1994-02-12|1994-01-06|NONE|AIR|ealthy dependencies with the furiousl +47172|417|47|2|24|31617.84|0.04|0.02|A|F|1993-12-19|1994-02-09|1993-12-28|TAKE BACK RETURN|MAIL|le slyly. slyly special requests x- +47173|572|73|1|41|60375.37|0.00|0.05|A|F|1994-12-16|1994-11-21|1994-12-24|TAKE BACK RETURN|MAIL| slyly after the +47173|1966|11|2|48|89662.08|0.07|0.07|A|F|1994-09-07|1994-10-28|1994-09-28|DELIVER IN PERSON|RAIL|lent, silent accounts after the sly +47173|300|82|3|20|24006.00|0.05|0.00|R|F|1994-09-13|1994-11-08|1994-10-01|DELIVER IN PERSON|FOB|ickly final instructions boost. idle i +47173|258|13|4|50|57912.50|0.07|0.05|R|F|1994-10-28|1994-10-23|1994-11-25|COLLECT COD|FOB| ideas are daringly. fluffil +47174|370|99|1|35|44462.95|0.08|0.02|N|O|1995-11-05|1995-12-03|1995-12-02|COLLECT COD|REG AIR|ide of the blithely express deposits w +47174|284|12|2|38|45002.64|0.00|0.02|N|O|1995-12-24|1995-11-13|1996-01-04|COLLECT COD|FOB| furiously against the slyly b +47175|39|65|1|32|30048.96|0.00|0.08|R|F|1993-08-01|1993-06-08|1993-08-08|NONE|SHIP|gular dolph +47175|1352|67|2|40|50134.00|0.10|0.05|A|F|1993-08-21|1993-07-09|1993-09-13|COLLECT COD|SHIP|hang blithely across the bli +47175|580|81|3|19|28131.02|0.00|0.03|R|F|1993-06-03|1993-07-02|1993-06-15|COLLECT COD|TRUCK|ously bold packages boost alo +47175|1991|36|4|44|83291.56|0.06|0.06|A|F|1993-05-26|1993-07-06|1993-06-06|DELIVER IN PERSON|MAIL|s deposits are outside the special +47175|1990|23|5|37|70003.63|0.05|0.08|A|F|1993-05-11|1993-07-22|1993-06-03|COLLECT COD|AIR|ideas. carefully even depos +47175|1434|74|6|7|9348.01|0.07|0.07|R|F|1993-05-13|1993-07-14|1993-05-21|DELIVER IN PERSON|TRUCK| packages. regular pinto beans haggle furi +47175|1573|54|7|20|29491.40|0.02|0.01|A|F|1993-07-02|1993-06-09|1993-07-25|DELIVER IN PERSON|TRUCK|kages. bli +47200|708|41|1|50|80435.00|0.04|0.04|N|O|1998-07-19|1998-06-04|1998-08-15|COLLECT COD|SHIP|e the even, even requests +47200|120|47|2|31|31623.72|0.04|0.02|N|O|1998-04-16|1998-05-30|1998-04-19|TAKE BACK RETURN|RAIL|uickly afte +47200|200|53|3|44|48408.80|0.04|0.05|N|O|1998-05-02|1998-05-12|1998-05-04|NONE|RAIL|mise quickly aga +47200|343|44|4|24|29840.16|0.06|0.02|N|O|1998-04-11|1998-06-27|1998-04-29|NONE|SHIP|ronic depths: carefully even deposit +47200|595|86|5|7|10469.13|0.04|0.05|N|O|1998-07-05|1998-06-02|1998-08-02|COLLECT COD|REG AIR|t the regular accounts. pendin +47200|60|36|6|3|2880.18|0.07|0.04|N|O|1998-05-10|1998-06-16|1998-05-28|TAKE BACK RETURN|TRUCK|even instructio +47200|947|50|7|18|33262.92|0.03|0.01|N|O|1998-07-18|1998-06-12|1998-08-10|DELIVER IN PERSON|MAIL|e slyly ideas +47201|7|58|1|25|22675.00|0.04|0.05|R|F|1995-04-08|1995-03-28|1995-04-12|TAKE BACK RETURN|AIR|ges. stealthily +47202|1717|18|1|12|19424.52|0.05|0.02|N|O|1997-04-02|1997-02-12|1997-04-27|TAKE BACK RETURN|TRUCK|ongside of the carefully ironic id +47202|1178|15|2|34|36691.78|0.07|0.05|N|O|1997-01-07|1997-01-17|1997-01-08|DELIVER IN PERSON|RAIL| ideas haggle furiously al +47202|579|80|3|40|59182.80|0.01|0.08|N|O|1997-01-17|1997-01-18|1997-01-18|DELIVER IN PERSON|MAIL| unusual packages haggle blithely speci +47202|637|38|4|9|13838.67|0.02|0.01|N|O|1997-02-10|1997-02-01|1997-02-11|TAKE BACK RETURN|TRUCK| requests. accounts sleep. carefully +47202|1519|60|5|5|7102.55|0.00|0.01|N|O|1997-02-01|1997-01-17|1997-02-16|TAKE BACK RETURN|AIR|ole. quickly pending requests wake +47202|1838|39|6|37|64373.71|0.06|0.01|N|O|1997-03-29|1997-01-23|1997-04-26|DELIVER IN PERSON|TRUCK| carefully even pinto beans haggle a +47203|487|17|1|22|30524.56|0.01|0.02|R|F|1995-03-23|1995-02-27|1995-03-29|TAKE BACK RETURN|RAIL|tructions along the fluffily ironic reques +47203|1714|41|2|5|8078.55|0.09|0.03|R|F|1995-03-31|1995-02-10|1995-04-17|NONE|REG AIR|ording to the fluffily special dolphins. +47203|691|92|3|2|3183.38|0.10|0.02|A|F|1995-02-20|1995-03-16|1995-03-16|TAKE BACK RETURN|REG AIR|ideas are carefully regular packag +47203|1370|9|4|47|59754.39|0.09|0.05|A|F|1994-12-21|1995-03-17|1994-12-28|NONE|SHIP|ag fluffily al +47203|406|7|5|39|50949.60|0.10|0.01|R|F|1995-01-07|1995-01-19|1995-01-21|COLLECT COD|FOB|ongside of the even requests nag blit +47204|1649|91|1|33|51171.12|0.00|0.05|N|O|1995-06-30|1995-05-19|1995-07-09|NONE|TRUCK|ly regular theodolites r +47204|1797|40|2|35|59457.65|0.10|0.05|A|F|1995-03-29|1995-06-03|1995-04-25|COLLECT COD|MAIL|ely even deposits. bli +47204|911|14|3|3|5435.73|0.05|0.05|N|O|1995-06-22|1995-05-01|1995-07-02|DELIVER IN PERSON|REG AIR|ffily bold sentiment +47204|1504|85|4|24|33732.00|0.01|0.01|R|F|1995-04-11|1995-05-29|1995-04-30|TAKE BACK RETURN|FOB|ular realms impress slyly express inst +47204|948|17|5|36|66561.84|0.08|0.05|N|F|1995-06-04|1995-04-29|1995-06-25|TAKE BACK RETURN|AIR|. ironic pe +47205|1822|52|1|27|46543.14|0.06|0.07|N|O|1998-06-23|1998-05-08|1998-06-26|NONE|MAIL| ironic theo +47205|939|8|2|44|80956.92|0.06|0.02|N|O|1998-04-26|1998-05-18|1998-04-27|NONE|AIR| regular requests; +47205|34|35|3|28|26152.84|0.09|0.07|N|O|1998-05-28|1998-05-28|1998-06-03|NONE|MAIL|equests detect +47205|680|74|4|4|6322.72|0.06|0.02|N|O|1998-07-14|1998-06-01|1998-07-15|NONE|SHIP| furiously ironic accoun +47205|24|100|5|15|13860.30|0.04|0.08|N|O|1998-04-01|1998-06-01|1998-04-26|COLLECT COD|REG AIR|. carefully unusual pa +47205|146|25|6|32|33476.48|0.03|0.06|N|O|1998-07-14|1998-06-16|1998-07-27|COLLECT COD|REG AIR| requests eat eve +47205|232|60|7|47|53214.81|0.08|0.03|N|O|1998-07-17|1998-05-11|1998-07-21|NONE|SHIP|sts boost about the packag +47206|316|73|1|30|36489.30|0.02|0.05|N|O|1996-04-07|1996-03-17|1996-04-12|DELIVER IN PERSON|AIR|cial packages about the accounts +47206|1156|65|2|4|4228.60|0.02|0.01|N|O|1996-04-18|1996-03-24|1996-05-05|COLLECT COD|AIR|te blithely regular, final +47206|1786|13|3|38|64135.64|0.01|0.06|N|O|1996-01-29|1996-03-20|1996-02-17|TAKE BACK RETURN|SHIP|uriously regular accounts. fluf +47206|1212|24|4|30|33396.30|0.06|0.08|N|O|1996-02-21|1996-03-25|1996-03-03|COLLECT COD|FOB|iously ironic requests. ironic dolphins +47206|613|14|5|3|4540.83|0.00|0.08|N|O|1996-02-28|1996-03-12|1996-03-21|COLLECT COD|RAIL|ly bold waters haggle caref +47206|593|54|6|15|22403.85|0.06|0.02|N|O|1996-04-08|1996-03-16|1996-04-12|NONE|RAIL| epitaphs cajo +47206|1295|96|7|34|40673.86|0.10|0.04|N|O|1996-03-30|1996-03-09|1996-04-23|DELIVER IN PERSON|MAIL|ly regular +47207|1204|16|1|20|22104.00|0.06|0.07|A|F|1995-01-17|1995-02-15|1995-02-13|NONE|REG AIR|ast the even requests. ironic, i +47207|1218|30|2|9|10072.89|0.00|0.08|A|F|1995-02-05|1995-01-19|1995-03-02|DELIVER IN PERSON|MAIL|express depo +47207|79|55|3|11|10769.77|0.08|0.07|A|F|1994-12-31|1995-03-17|1995-01-23|TAKE BACK RETURN|FOB|ooze. slyly thin +47207|1465|5|4|24|32795.04|0.04|0.00|R|F|1995-03-14|1995-02-11|1995-03-15|NONE|REG AIR|. blithely even requests ar +47207|637|31|5|1|1537.63|0.10|0.00|A|F|1995-01-28|1995-03-09|1995-02-15|DELIVER IN PERSON|AIR|s eat blithely. accounts nag car +47207|1392|7|6|3|3880.17|0.03|0.08|A|F|1995-02-08|1995-03-03|1995-02-14|DELIVER IN PERSON|RAIL|regular requests. stealthily iron +47232|1352|29|1|18|22560.30|0.08|0.03|A|F|1993-10-02|1993-09-24|1993-10-17|COLLECT COD|REG AIR|y bold foxes after the quickly ironic de +47232|1337|76|2|46|56963.18|0.03|0.07|R|F|1993-12-03|1993-10-09|1993-12-18|NONE|TRUCK| ideas. regular deposits sleep about +47232|576|67|3|18|26578.26|0.10|0.01|A|F|1993-10-02|1993-09-23|1993-10-05|DELIVER IN PERSON|RAIL|ly ironic pinto beans. evenly pending asymp +47233|1915|4|1|24|43605.84|0.01|0.06|R|F|1993-07-07|1993-06-14|1993-07-12|DELIVER IN PERSON|SHIP|. instructions boost. furiousl +47234|1924|69|1|1|1825.92|0.00|0.03|N|O|1998-08-22|1998-07-29|1998-09-14|NONE|FOB|y regular accounts wake. furiously ex +47234|394|79|2|41|53069.99|0.08|0.07|N|O|1998-08-12|1998-07-13|1998-08-23|NONE|RAIL|sts against +47234|1342|57|3|40|49733.60|0.06|0.00|N|O|1998-08-13|1998-07-31|1998-08-31|TAKE BACK RETURN|REG AIR|ly even deposits. +47234|469|99|4|22|30128.12|0.03|0.08|N|O|1998-09-09|1998-07-13|1998-10-09|NONE|MAIL|pending accounts. regular, ironic instru +47234|926|95|5|13|23749.96|0.09|0.02|N|O|1998-06-03|1998-06-13|1998-06-26|COLLECT COD|RAIL|s the carefully pending pint +47235|1106|7|1|21|21149.10|0.06|0.04|A|F|1992-04-22|1992-06-24|1992-05-12|COLLECT COD|FOB|accounts. requests a +47235|1388|65|2|27|34813.26|0.01|0.02|R|F|1992-07-06|1992-06-14|1992-07-08|COLLECT COD|REG AIR|s. quickly even tithes haggle +47235|199|100|3|23|25281.37|0.03|0.01|A|F|1992-06-01|1992-06-07|1992-06-24|TAKE BACK RETURN|RAIL|lithely even requests. furiously exp +47236|1153|90|1|38|40057.70|0.07|0.00|N|O|1995-10-11|1995-12-12|1995-10-25|TAKE BACK RETURN|TRUCK|d ideas nag car +47236|765|66|2|23|38312.48|0.00|0.00|N|O|1995-12-03|1995-12-31|1995-12-18|TAKE BACK RETURN|RAIL|ng the thin pinto beans. fin +47236|514|5|3|48|67896.48|0.07|0.03|N|O|1996-01-14|1995-11-16|1996-02-12|TAKE BACK RETURN|AIR|ully accounts. deposits +47236|1014|85|4|19|17385.19|0.08|0.06|N|O|1995-11-03|1996-01-01|1995-11-28|TAKE BACK RETURN|REG AIR|lly regular pa +47236|210|38|5|44|48849.24|0.06|0.06|N|O|1996-01-15|1995-11-27|1996-02-04|NONE|RAIL|fily against the bli +47236|619|82|6|48|72941.28|0.08|0.03|N|O|1995-12-23|1995-11-24|1996-01-11|TAKE BACK RETURN|TRUCK|ies along the foxes sle +47237|1827|28|1|16|27661.12|0.08|0.00|R|F|1993-09-04|1993-11-18|1993-09-08|NONE|SHIP| regular platelets. +47237|297|98|2|2|2394.58|0.05|0.03|A|F|1993-12-19|1993-11-09|1994-01-15|NONE|REG AIR|around the fluffily even accoun +47237|857|91|3|25|43946.25|0.03|0.07|A|F|1993-11-26|1993-11-20|1993-12-26|TAKE BACK RETURN|REG AIR|instructions above the blithely pendi +47237|1546|27|4|41|59349.14|0.05|0.04|R|F|1993-12-27|1993-10-18|1994-01-05|DELIVER IN PERSON|MAIL|theodolites. deposits ar +47237|1000|1|5|6|5406.00|0.01|0.07|R|F|1993-12-15|1993-11-26|1993-12-26|TAKE BACK RETURN|RAIL|. deposits sleep ca +47237|1450|51|6|44|59463.80|0.03|0.08|A|F|1993-12-11|1993-11-18|1994-01-10|TAKE BACK RETURN|AIR|the unusual acco +47237|1591|72|7|12|17911.08|0.04|0.03|A|F|1993-11-06|1993-11-18|1993-11-14|NONE|AIR|s boost furiously upo +47238|1182|55|1|25|27079.50|0.09|0.04|A|F|1993-01-23|1993-02-27|1993-02-02|NONE|REG AIR|gside of the +47239|1238|39|1|31|35316.13|0.01|0.06|N|O|1997-03-01|1997-02-20|1997-03-22|NONE|AIR|nic foxes across the ironic dolphins wake +47239|1842|86|2|43|74985.12|0.02|0.05|N|O|1997-03-20|1997-02-20|1997-04-06|NONE|AIR|hely above the pending, bold requests. +47239|254|9|3|1|1154.25|0.07|0.01|N|O|1997-03-04|1997-02-28|1997-04-02|DELIVER IN PERSON|TRUCK| express deposits are slyly. +47264|311|68|1|18|21803.58|0.09|0.02|N|O|1997-10-23|1997-11-03|1997-11-06|NONE|RAIL| furiously final requests run a +47264|1111|20|2|13|13157.43|0.00|0.08|N|O|1997-10-18|1997-11-12|1997-11-13|NONE|SHIP|ptotes sleep permanently ac +47265|1937|26|1|15|27583.95|0.00|0.01|N|O|1995-12-21|1996-01-10|1996-01-13|NONE|REG AIR|sts wake carefully. care +47265|1545|86|2|21|30377.34|0.05|0.03|N|O|1996-03-02|1996-01-31|1996-03-18|COLLECT COD|REG AIR|inal accounts nag fluffily slyly regula +47265|634|28|3|40|61385.20|0.05|0.02|N|O|1996-02-04|1996-01-27|1996-02-28|COLLECT COD|MAIL|into beans? final pains w +47265|1818|19|4|7|12038.67|0.00|0.00|N|O|1996-02-17|1996-01-15|1996-02-24|NONE|MAIL| slyly unusual +47266|382|11|1|32|41036.16|0.09|0.02|N|O|1997-04-27|1997-03-30|1997-05-05|DELIVER IN PERSON|REG AIR|y regular id +47266|1732|75|2|18|29407.14|0.07|0.08|N|O|1997-03-22|1997-04-07|1997-04-18|NONE|SHIP| furiously regular instructions +47266|1585|86|3|45|66896.10|0.03|0.07|N|O|1997-06-11|1997-04-26|1997-06-24|DELIVER IN PERSON|TRUCK|y. requests wake quickly across the regular +47266|1145|54|4|32|33476.48|0.02|0.07|N|O|1997-03-22|1997-04-01|1997-03-23|DELIVER IN PERSON|REG AIR|ly quickly unusual accounts. regular +47266|1994|83|5|29|54983.71|0.07|0.07|N|O|1997-05-09|1997-04-03|1997-05-31|DELIVER IN PERSON|RAIL|detect fur +47266|284|85|6|11|13027.08|0.04|0.06|N|O|1997-04-02|1997-04-29|1997-04-12|COLLECT COD|FOB|requests. even foxes cajole bra +47267|1960|61|1|10|18619.60|0.03|0.05|R|F|1994-04-26|1994-02-17|1994-05-13|DELIVER IN PERSON|AIR|he ironic, bold dependencies. b +47267|1433|34|2|5|6672.15|0.09|0.07|R|F|1994-04-24|1994-02-05|1994-05-17|NONE|SHIP|e ironic, regular platelets. care +47267|1745|46|3|6|9880.44|0.02|0.08|A|F|1994-04-09|1994-03-12|1994-05-06|NONE|RAIL|ously pending packages. ironic, bold platel +47267|409|68|4|28|36663.20|0.09|0.05|A|F|1994-01-13|1994-03-29|1994-01-27|TAKE BACK RETURN|AIR|yly regular requests. fina +47267|173|100|5|2|2146.34|0.01|0.08|A|F|1994-04-23|1994-02-24|1994-05-01|DELIVER IN PERSON|RAIL|ecial courts kindle against +47267|965|34|6|40|74638.40|0.02|0.01|R|F|1994-02-16|1994-02-02|1994-03-12|NONE|AIR|xcuses nag carefully carefully even reque +47267|547|38|7|28|40531.12|0.07|0.04|A|F|1994-02-12|1994-02-20|1994-02-18|TAKE BACK RETURN|FOB| above the idle deposits +47268|827|61|1|31|53562.42|0.09|0.05|N|O|1996-01-27|1995-12-03|1996-02-18|NONE|SHIP|ns integrate carefully +47268|757|54|2|14|23208.50|0.07|0.00|N|O|1995-10-18|1995-12-08|1995-10-20|COLLECT COD|TRUCK|aringly special req +47268|1124|25|3|29|29728.48|0.09|0.05|N|O|1996-01-16|1995-11-27|1996-01-28|DELIVER IN PERSON|FOB|ide of the regular theodolites. quickly re +47268|732|97|4|32|52247.36|0.10|0.01|N|O|1996-01-11|1995-11-15|1996-01-29|TAKE BACK RETURN|SHIP|according to the carefully even sentiments +47268|1032|38|5|49|45718.47|0.03|0.04|N|O|1996-01-14|1995-12-30|1996-01-17|COLLECT COD|REG AIR|kly final ac +47269|350|7|1|15|18755.25|0.10|0.01|N|O|1998-01-12|1997-12-16|1998-02-06|NONE|RAIL| carefully pending ideas. blithely even +47269|1755|98|2|47|77867.25|0.05|0.02|N|O|1998-01-22|1997-11-24|1998-02-04|TAKE BACK RETURN|FOB|ily. ironic, final courts above the slyly i +47270|115|16|1|25|25377.75|0.05|0.05|A|F|1993-10-24|1993-09-06|1993-11-22|DELIVER IN PERSON|REG AIR|ongside of the even, ironic +47270|1082|18|2|10|9830.80|0.00|0.06|R|F|1993-10-31|1993-09-27|1993-11-20|TAKE BACK RETURN|TRUCK| final foxes sleep about the c +47270|262|63|3|18|20920.68|0.09|0.00|A|F|1993-11-02|1993-09-07|1993-11-17|DELIVER IN PERSON|AIR|ct carefully. slyly express +47270|920|21|4|39|71015.88|0.04|0.08|A|F|1993-08-13|1993-09-08|1993-08-29|NONE|RAIL|ctions are +47270|1482|100|5|31|42887.88|0.04|0.00|A|F|1993-08-16|1993-09-24|1993-08-24|NONE|TRUCK|y regular theodolites acc +47270|977|12|6|1|1877.97|0.00|0.05|A|F|1993-10-22|1993-10-21|1993-11-11|DELIVER IN PERSON|AIR|es nag. bold, exp +47270|1125|62|7|40|41044.80|0.02|0.07|A|F|1993-09-05|1993-09-12|1993-10-02|NONE|FOB|pt the quickly ironic requ +47271|1670|71|1|49|77011.83|0.03|0.02|N|O|1995-08-24|1995-09-05|1995-09-23|NONE|REG AIR| the blithely express +47296|973|76|1|31|58093.07|0.00|0.04|R|F|1993-08-22|1993-09-11|1993-08-24|COLLECT COD|AIR|iously quickly unusual excuses. quickly pe +47296|323|80|2|13|15903.16|0.03|0.03|A|F|1993-07-08|1993-07-30|1993-07-09|COLLECT COD|TRUCK|old blithely. unusual ideas detect +47296|112|65|3|48|48581.28|0.06|0.03|R|F|1993-08-17|1993-08-29|1993-08-27|NONE|SHIP|nal ideas +47297|988|89|1|19|35890.62|0.06|0.02|N|O|1997-07-26|1997-08-30|1997-08-15|NONE|REG AIR|s above the unusual, final requests: slyly +47297|1901|90|2|36|64904.40|0.06|0.01|N|O|1997-08-21|1997-10-14|1997-08-22|DELIVER IN PERSON|TRUCK| on the bold depos +47297|391|20|3|43|55529.77|0.09|0.07|N|O|1997-10-13|1997-09-16|1997-10-29|NONE|SHIP| bold deposits engage against the car +47297|1427|67|4|47|62435.74|0.08|0.04|N|O|1997-10-20|1997-10-22|1997-10-27|NONE|RAIL| furiously regular ideas +47297|364|49|5|5|6321.80|0.00|0.06|N|O|1997-08-12|1997-08-24|1997-09-07|TAKE BACK RETURN|AIR|ng platelets are furiously in place of the +47298|297|98|1|41|49088.89|0.02|0.05|N|O|1995-10-16|1996-01-05|1995-10-30|TAKE BACK RETURN|TRUCK|bout the blithely dogged deposits. quick +47298|1843|73|2|15|26172.60|0.03|0.04|N|O|1996-01-19|1995-11-26|1996-02-09|TAKE BACK RETURN|SHIP|counts against the unusual, ironic depo +47298|1906|95|3|25|45197.50|0.03|0.01|N|O|1996-01-05|1995-11-13|1996-01-17|NONE|MAIL|ideas. unusual, ironic theodolites ab +47299|1562|43|1|18|26344.08|0.09|0.00|A|F|1993-11-26|1994-01-02|1993-12-18|COLLECT COD|TRUCK|hely unusual pac +47299|1471|50|2|17|23331.99|0.10|0.07|A|F|1994-02-11|1993-12-15|1994-02-28|TAKE BACK RETURN|AIR|elets. ironic theodoli +47300|454|84|1|46|62304.70|0.04|0.05|A|F|1994-02-28|1994-03-26|1994-03-18|DELIVER IN PERSON|MAIL|lets haggle furiously about the closely +47300|150|51|2|1|1050.15|0.05|0.07|A|F|1994-03-10|1994-03-12|1994-03-17|NONE|TRUCK|kages cajol +47300|1756|83|3|28|46417.00|0.02|0.03|A|F|1994-02-23|1994-02-16|1994-03-03|DELIVER IN PERSON|MAIL|o beans. r +47300|732|65|4|3|4898.19|0.08|0.04|R|F|1994-01-07|1994-02-09|1994-01-31|COLLECT COD|RAIL|fluffily even dolphins +47300|1773|16|5|31|51917.87|0.07|0.04|R|F|1994-02-06|1994-02-15|1994-02-15|COLLECT COD|SHIP|hs use blithely unusual +47300|1950|39|6|17|31483.15|0.06|0.03|A|F|1994-01-05|1994-03-12|1994-01-06|DELIVER IN PERSON|TRUCK|y regular asymptotes sleep +47300|565|66|7|43|63019.08|0.08|0.07|R|F|1994-01-29|1994-03-10|1994-02-22|COLLECT COD|MAIL| instructions serve final, busy requests. +47301|1851|95|1|22|38562.70|0.07|0.06|N|O|1995-11-03|1995-08-26|1995-11-13|DELIVER IN PERSON|SHIP|ests haggle +47301|87|13|2|6|5922.48|0.00|0.02|N|O|1995-07-25|1995-09-30|1995-08-20|DELIVER IN PERSON|MAIL|ts haggle fina +47301|1917|6|3|44|80032.04|0.09|0.06|N|O|1995-09-12|1995-09-06|1995-09-28|COLLECT COD|FOB|ly. carefully sly instructions sleep som +47302|1987|20|1|44|83115.12|0.03|0.06|N|O|1996-12-01|1996-12-13|1996-12-16|NONE|AIR|sleep blithely after the platel +47302|1674|75|2|42|66178.14|0.06|0.05|N|O|1996-11-08|1997-01-11|1996-11-11|TAKE BACK RETURN|MAIL|nt packages cajole furiously among the furi +47302|1612|13|3|23|34813.03|0.05|0.07|N|O|1996-12-22|1997-01-11|1997-01-18|NONE|AIR|the special epitaphs. c +47302|1126|27|4|14|14379.68|0.07|0.01|N|O|1996-11-23|1996-11-16|1996-12-15|NONE|MAIL|sts sleep final p +47302|274|2|5|50|58713.50|0.09|0.04|N|O|1997-01-08|1996-11-13|1997-01-14|DELIVER IN PERSON|FOB|wly regular accounts al +47303|91|17|1|47|46581.23|0.10|0.02|N|O|1996-03-29|1996-02-01|1996-04-02|DELIVER IN PERSON|MAIL|cing, final requests along the furiou +47303|1385|24|2|2|2572.76|0.10|0.00|N|O|1996-03-26|1996-02-09|1996-04-04|NONE|TRUCK|symptotes haggle blithely furious +47303|991|60|3|3|5675.97|0.10|0.02|N|O|1996-02-12|1996-01-20|1996-02-21|DELIVER IN PERSON|TRUCK|foxes at the fluffy warthogs cajo +47303|1942|75|4|28|51630.32|0.08|0.06|N|O|1996-03-07|1996-02-28|1996-03-18|NONE|REG AIR|ous requests. frays at the +47303|543|44|5|1|1443.54|0.07|0.08|N|O|1996-01-14|1996-02-20|1996-02-02|NONE|MAIL| bold theodolite +47303|1723|66|6|15|24370.80|0.08|0.01|N|O|1995-12-20|1996-02-26|1995-12-30|TAKE BACK RETURN|RAIL|arthogs affi +47328|1797|98|1|42|71349.18|0.08|0.01|N|O|1996-06-08|1996-07-10|1996-06-28|NONE|RAIL|es. final ideas about the sometim +47328|384|41|2|14|17981.32|0.01|0.06|N|O|1996-05-13|1996-06-07|1996-06-10|NONE|AIR|e final, regular packages. quickly ironic t +47329|1175|48|1|22|23675.74|0.07|0.00|A|F|1993-03-27|1993-03-24|1993-04-04|NONE|SHIP|carefully expre +47329|968|3|2|50|93448.00|0.00|0.05|R|F|1993-05-23|1993-04-19|1993-05-25|TAKE BACK RETURN|RAIL|ickly pending requests. packages wake regu +47329|1178|87|3|16|17266.72|0.02|0.03|R|F|1993-06-07|1993-04-18|1993-06-12|NONE|FOB|ross the carefully iro +47329|1735|36|4|12|19640.76|0.09|0.04|A|F|1993-05-02|1993-03-15|1993-05-29|DELIVER IN PERSON|FOB|ts cajole slyly after th +47329|727|28|5|3|4883.16|0.08|0.01|A|F|1993-04-16|1993-03-23|1993-04-28|NONE|TRUCK|ent requests along the blithel +47329|1325|2|6|47|57637.04|0.04|0.05|R|F|1993-06-05|1993-03-14|1993-06-11|COLLECT COD|SHIP|e quickly along the fluffily re +47329|512|43|7|9|12712.59|0.06|0.03|R|F|1993-05-24|1993-05-04|1993-06-21|COLLECT COD|MAIL|t requests haggle. furiously ironic pin +47330|668|62|1|39|61177.74|0.03|0.07|N|O|1995-07-12|1995-06-07|1995-07-13|DELIVER IN PERSON|SHIP|thely regular excus +47330|1600|1|2|39|58562.40|0.03|0.03|A|F|1995-05-12|1995-06-10|1995-05-26|NONE|AIR|ic accounts. deposits boo +47330|1792|19|3|30|50813.70|0.08|0.05|A|F|1995-05-08|1995-06-11|1995-06-05|DELIVER IN PERSON|REG AIR|he finally ironic ins +47330|1837|67|4|6|10432.98|0.01|0.03|A|F|1995-04-04|1995-06-29|1995-04-24|NONE|AIR| pinto beans. furiously even pinto beans s +47331|289|90|1|48|57085.44|0.06|0.00|N|O|1996-10-08|1996-10-15|1996-10-12|DELIVER IN PERSON|FOB|egular instructions are quickly quickly bo +47331|217|18|2|29|32399.09|0.10|0.08|N|O|1996-11-03|1996-09-19|1996-11-18|COLLECT COD|TRUCK|ies. furiously fina +47331|206|7|3|11|12168.20|0.01|0.00|N|O|1996-09-15|1996-09-24|1996-10-02|COLLECT COD|MAIL|p at the regular reque +47331|1553|54|4|24|34909.20|0.02|0.01|N|O|1996-09-25|1996-10-16|1996-10-11|COLLECT COD|MAIL|sly. silent, even requests dazzle. fl +47331|1335|74|5|39|48216.87|0.08|0.01|N|O|1996-10-18|1996-11-06|1996-10-24|DELIVER IN PERSON|AIR|usly. platele +47332|492|22|1|22|30634.78|0.07|0.06|N|O|1997-03-31|1997-04-16|1997-04-24|TAKE BACK RETURN|MAIL|xpress dependencies. unusual, stealthy +47332|1955|88|2|37|68707.15|0.10|0.03|N|O|1997-04-24|1997-04-03|1997-05-08|COLLECT COD|FOB| instructions nag furiously. +47332|428|16|3|37|49151.54|0.07|0.03|N|O|1997-03-19|1997-03-24|1997-04-04|DELIVER IN PERSON|AIR|gle furiously furiously final packages. +47332|893|60|4|18|32290.02|0.01|0.03|N|O|1997-05-24|1997-03-26|1997-06-18|COLLECT COD|FOB|y atop the express, special theodo +47332|227|28|5|9|10144.98|0.01|0.04|N|O|1997-04-20|1997-03-21|1997-04-25|TAKE BACK RETURN|MAIL|ecial requests bo +47333|1852|53|1|35|61384.75|0.03|0.01|N|O|1995-10-29|1995-10-30|1995-11-22|TAKE BACK RETURN|TRUCK|heodolites. quickly ironic reque +47334|1014|15|1|50|45750.50|0.04|0.00|A|F|1993-08-20|1993-06-22|1993-08-25|TAKE BACK RETURN|RAIL|sits. furiou +47334|785|50|2|16|26972.48|0.03|0.08|A|F|1993-05-19|1993-07-22|1993-06-18|NONE|MAIL|oost furiously final excu +47334|1134|35|3|35|36229.55|0.02|0.01|R|F|1993-06-05|1993-07-29|1993-07-03|DELIVER IN PERSON|SHIP|es wake across the always express theo +47334|900|34|4|8|14407.20|0.00|0.04|R|F|1993-07-22|1993-06-23|1993-08-03|NONE|SHIP|packages wake despite the final dep +47334|1638|80|5|13|20015.19|0.07|0.05|A|F|1993-06-08|1993-06-12|1993-06-19|NONE|REG AIR|y furiously regular theodolites. slyl +47334|582|43|6|13|19273.54|0.00|0.08|R|F|1993-08-03|1993-07-01|1993-08-21|COLLECT COD|SHIP|ly among the furiously unusual asymp +47334|1433|73|7|26|34695.18|0.09|0.02|R|F|1993-08-04|1993-07-19|1993-08-23|NONE|REG AIR|riously across the furiously ev +47335|1526|67|1|45|64238.40|0.05|0.06|R|F|1992-09-02|1992-08-31|1992-09-15|TAKE BACK RETURN|FOB|ingly. furiously special foxe +47335|1506|87|2|29|40817.50|0.08|0.08|R|F|1992-10-08|1992-09-27|1992-10-12|COLLECT COD|REG AIR|quests. regular, regular theodolites +47360|1002|73|1|12|10836.00|0.05|0.05|A|F|1993-12-23|1993-11-22|1994-01-04|DELIVER IN PERSON|REG AIR|kages haggle foxes. slyly ruthless dep +47360|549|80|2|34|49284.36|0.04|0.08|R|F|1993-10-23|1993-12-04|1993-11-19|DELIVER IN PERSON|SHIP|uick excuses. bli +47360|1582|63|3|32|47474.56|0.02|0.07|A|F|1993-10-16|1993-12-11|1993-11-14|COLLECT COD|RAIL|leep slyly across the s +47360|942|11|4|23|42387.62|0.03|0.01|R|F|1993-12-20|1993-12-06|1994-01-02|TAKE BACK RETURN|RAIL|s sublate according to t +47361|921|24|1|7|12753.44|0.03|0.02|N|O|1996-09-02|1996-09-25|1996-09-10|TAKE BACK RETURN|TRUCK|ve the furious +47361|1001|37|2|37|33374.00|0.08|0.08|N|O|1996-08-14|1996-10-11|1996-08-22|DELIVER IN PERSON|FOB|s according to +47361|1929|62|3|40|73236.80|0.03|0.01|N|O|1996-09-11|1996-09-24|1996-10-10|TAKE BACK RETURN|TRUCK|even ideas boost +47362|1206|81|1|2|2214.40|0.08|0.07|N|O|1996-05-02|1996-03-10|1996-05-10|TAKE BACK RETURN|TRUCK|iously even accounts! +47362|91|42|2|17|16848.53|0.05|0.01|N|O|1996-01-27|1996-04-11|1996-02-26|DELIVER IN PERSON|REG AIR|ths. slyly unusual deposits +47362|947|50|3|47|86853.18|0.10|0.02|N|O|1996-03-08|1996-02-28|1996-03-26|NONE|RAIL|. blithely fi +47362|767|32|4|23|38358.48|0.00|0.08|N|O|1996-03-27|1996-04-03|1996-04-12|DELIVER IN PERSON|RAIL|he regular, express request +47362|1789|16|5|22|37197.16|0.05|0.01|N|O|1996-03-09|1996-02-20|1996-03-22|DELIVER IN PERSON|RAIL| theodolites. slyly even +47362|355|84|6|38|47703.30|0.08|0.01|N|O|1996-03-13|1996-03-30|1996-04-04|COLLECT COD|FOB|n across the furiously +47362|930|65|7|21|38449.53|0.09|0.08|N|O|1996-01-30|1996-04-03|1996-02-14|DELIVER IN PERSON|FOB|s. blithely ironic requests +47363|1460|39|1|7|9530.22|0.02|0.03|N|O|1996-07-15|1996-08-30|1996-07-25|COLLECT COD|REG AIR|xpress requests. bli +47363|1222|97|2|7|7862.54|0.03|0.03|N|O|1996-09-20|1996-07-02|1996-09-30|TAKE BACK RETURN|MAIL|he special packages. dep +47363|1950|39|3|33|61114.35|0.05|0.07|N|O|1996-08-26|1996-07-08|1996-09-03|DELIVER IN PERSON|FOB| deposits. furiously final accounts a +47364|1905|6|1|6|10841.40|0.08|0.02|N|O|1997-05-29|1997-04-23|1997-06-17|TAKE BACK RETURN|REG AIR|mptotes. special +47364|1182|19|2|5|5415.90|0.07|0.04|N|O|1997-06-18|1997-03-25|1997-07-02|DELIVER IN PERSON|MAIL|es. quickly regu +47364|838|5|3|33|57381.39|0.01|0.03|N|O|1997-02-26|1997-05-17|1997-03-28|NONE|FOB|nal ideas are sp +47364|353|82|4|40|50134.00|0.02|0.03|N|O|1997-05-05|1997-04-22|1997-05-20|DELIVER IN PERSON|AIR|ckages boost blithely. bold, final deposits +47364|61|87|5|49|47091.94|0.00|0.04|N|O|1997-03-06|1997-04-13|1997-03-21|COLLECT COD|SHIP|s sleep stealthi +47364|1216|17|6|14|15640.94|0.02|0.00|N|O|1997-05-16|1997-04-16|1997-06-06|NONE|MAIL|y express dep +47365|705|6|1|44|70650.80|0.03|0.04|N|O|1997-09-24|1997-08-26|1997-10-22|TAKE BACK RETURN|AIR|g the accounts. +47365|172|99|2|42|45031.14|0.06|0.07|N|O|1997-08-16|1997-08-12|1997-09-07|NONE|REG AIR| regular asymptotes? special theodo +47365|238|20|3|13|14796.99|0.05|0.07|N|O|1997-08-02|1997-09-12|1997-09-01|NONE|RAIL|y express theodolites wake slyly fluffily +47365|272|100|4|2|2344.54|0.04|0.07|N|O|1997-09-25|1997-09-16|1997-10-06|DELIVER IN PERSON|TRUCK|e slyly fina +47365|125|78|5|15|15376.80|0.06|0.07|N|O|1997-10-15|1997-09-12|1997-10-27|COLLECT COD|TRUCK|tly pinto beans. +47365|1349|26|6|49|61266.66|0.03|0.05|N|O|1997-09-30|1997-09-19|1997-10-16|NONE|AIR|usual theodol +47365|872|6|7|7|12410.09|0.03|0.05|N|O|1997-07-26|1997-09-06|1997-07-30|TAKE BACK RETURN|SHIP|s boost slyly. express foxes use slyl +47366|1444|84|1|20|26908.80|0.03|0.01|A|F|1993-05-18|1993-04-16|1993-06-09|DELIVER IN PERSON|AIR|tructions mold slyly along the slyly even +47366|202|84|2|46|50701.20|0.02|0.02|A|F|1993-05-31|1993-05-11|1993-06-25|NONE|REG AIR|ts. slyly +47366|167|94|3|14|14940.24|0.05|0.03|A|F|1993-04-15|1993-03-21|1993-05-08|COLLECT COD|AIR|integrate slyly after the a +47366|782|15|4|2|3365.56|0.00|0.06|R|F|1993-03-02|1993-03-31|1993-03-08|DELIVER IN PERSON|RAIL|, ironic pinto beans. final, unusual acc +47367|1288|100|1|48|57085.44|0.01|0.04|R|F|1995-05-17|1995-07-03|1995-06-03|DELIVER IN PERSON|RAIL|es cajole caref +47367|1854|41|2|32|56187.20|0.07|0.01|R|F|1995-04-22|1995-06-25|1995-04-27|DELIVER IN PERSON|AIR|ages. slyly even requests sleep. blithely +47367|1160|61|3|7|7428.12|0.05|0.08|N|O|1995-07-18|1995-07-14|1995-07-30|COLLECT COD|SHIP| slyly exp +47392|614|15|1|33|49982.13|0.06|0.02|R|F|1994-11-08|1994-11-20|1994-11-13|NONE|TRUCK|iously regu +47392|1925|14|2|43|78557.56|0.08|0.02|A|F|1994-11-09|1994-10-30|1994-12-02|DELIVER IN PERSON|TRUCK|y ironic excuses affix after the furiously +47392|1052|88|3|22|20967.10|0.09|0.07|R|F|1994-10-24|1994-10-18|1994-11-14|TAKE BACK RETURN|AIR| beans do wake blithel +47392|405|93|4|20|26108.00|0.03|0.04|A|F|1995-01-04|1994-12-12|1995-01-11|NONE|TRUCK|mas nag slyly furiously re +47393|1162|99|1|36|38273.76|0.09|0.01|N|O|1998-09-15|1998-09-03|1998-09-30|TAKE BACK RETURN|REG AIR|sly. carefully regular accounts solve +47393|152|79|2|30|31564.50|0.10|0.00|N|O|1998-07-10|1998-08-30|1998-07-26|TAKE BACK RETURN|RAIL|refully blithely final foxes. +47393|1091|97|3|46|45636.14|0.01|0.04|N|O|1998-08-25|1998-08-23|1998-09-02|TAKE BACK RETURN|RAIL|beans after the packages haggle furio +47393|90|91|4|20|19801.80|0.05|0.01|N|O|1998-10-16|1998-08-05|1998-11-06|COLLECT COD|MAIL|ironic pinto beans wake. +47393|1287|88|5|27|32083.56|0.06|0.04|N|O|1998-10-11|1998-09-22|1998-11-02|NONE|MAIL|ptotes use blithely pending theodolites. +47393|299|54|6|47|56366.63|0.05|0.03|N|O|1998-07-26|1998-08-06|1998-08-10|TAKE BACK RETURN|TRUCK| furiously unusual accounts above the s +47394|366|95|1|33|41789.88|0.10|0.01|N|O|1998-11-23|1998-10-14|1998-12-12|TAKE BACK RETURN|SHIP|e fluffily even deposits; final, +47394|1941|74|2|41|75560.54|0.05|0.03|N|O|1998-11-25|1998-10-14|1998-12-17|TAKE BACK RETURN|MAIL| fluffily alongside of the furiously ex +47394|299|27|3|7|8395.03|0.07|0.07|N|O|1998-09-18|1998-09-30|1998-09-19|TAKE BACK RETURN|REG AIR| foxes. ironic a +47395|1902|91|1|35|63136.50|0.05|0.05|A|F|1992-05-13|1992-04-15|1992-05-21|NONE|MAIL|uests cajole carefully. slyly final package +47395|1758|43|2|32|53112.00|0.07|0.08|A|F|1992-05-19|1992-04-30|1992-06-01|DELIVER IN PERSON|FOB|ronic requests are slowly. waters +47396|1904|37|1|27|48759.30|0.10|0.04|N|O|1997-09-26|1997-07-19|1997-10-18|NONE|FOB|ly regular packages haggle blithely final r +47396|1169|6|2|36|38525.76|0.06|0.06|N|O|1997-07-25|1997-08-10|1997-08-20|TAKE BACK RETURN|MAIL|bold packages. furiously final instructio +47396|327|28|3|6|7363.92|0.08|0.01|N|O|1997-07-09|1997-07-12|1997-07-17|NONE|SHIP|old deposits wake carefully furiously iron +47396|1508|29|4|4|5638.00|0.00|0.00|N|O|1997-07-11|1997-08-08|1997-08-01|NONE|AIR|press requests sleep dar +47396|804|5|5|15|25572.00|0.00|0.00|N|O|1997-07-08|1997-08-26|1997-07-26|COLLECT COD|REG AIR| the blithely speci +47396|463|51|6|14|19088.44|0.01|0.00|N|O|1997-07-20|1997-08-13|1997-08-05|TAKE BACK RETURN|MAIL|e carefully regular asymptotes. regul +47397|992|95|1|5|9464.95|0.07|0.07|N|O|1998-04-29|1998-04-08|1998-05-04|TAKE BACK RETURN|MAIL|inments. furiously fi +47397|441|42|2|30|40243.20|0.07|0.02|N|O|1998-06-17|1998-05-17|1998-06-24|NONE|SHIP|gular, ironic +47398|900|1|1|35|63031.50|0.01|0.03|N|O|1995-06-27|1995-08-03|1995-07-11|TAKE BACK RETURN|SHIP|ithely regular +47398|226|8|2|23|25903.06|0.09|0.01|N|O|1995-08-18|1995-08-08|1995-08-22|COLLECT COD|AIR|slyly even deposit +47398|1238|39|3|25|28480.75|0.09|0.03|N|O|1995-07-01|1995-08-10|1995-07-31|TAKE BACK RETURN|REG AIR| packages. dolphins print blit +47398|64|90|4|3|2892.18|0.01|0.01|N|O|1995-07-28|1995-08-11|1995-08-11|COLLECT COD|FOB|ross the slyly ironic packages. fi +47399|242|97|1|14|15991.36|0.09|0.03|R|F|1992-08-13|1992-09-19|1992-08-30|DELIVER IN PERSON|MAIL|ng the instructions. pint +47399|129|8|2|50|51456.00|0.02|0.03|A|F|1992-08-28|1992-09-03|1992-09-01|NONE|MAIL| final deposits boost quick +47399|295|77|3|11|13148.19|0.10|0.00|A|F|1992-08-12|1992-10-30|1992-08-31|DELIVER IN PERSON|FOB|le along the special Tiresias +47399|1765|8|4|42|70003.92|0.01|0.08|R|F|1992-11-26|1992-09-07|1992-12-04|COLLECT COD|AIR|al asymptotes. furiously final deposi +47399|1555|76|5|32|46609.60|0.00|0.01|R|F|1992-11-16|1992-10-18|1992-11-29|TAKE BACK RETURN|SHIP| deposits. +47424|551|82|1|37|53707.35|0.01|0.04|N|O|1996-08-28|1996-09-06|1996-09-25|COLLECT COD|SHIP|ly regular g +47424|805|6|2|18|30704.40|0.06|0.00|N|O|1996-08-26|1996-09-10|1996-09-07|NONE|FOB|bove the unusual rea +47424|783|80|3|42|70718.76|0.09|0.07|N|O|1996-07-18|1996-09-11|1996-08-09|TAKE BACK RETURN|MAIL|le alongside of the special packag +47424|1208|46|4|12|13310.40|0.06|0.04|N|O|1996-08-24|1996-08-13|1996-09-12|NONE|TRUCK|e bold, exp +47424|1957|46|5|3|5576.85|0.00|0.01|N|O|1996-07-30|1996-08-27|1996-08-08|COLLECT COD|FOB|efully reg +47425|828|29|1|19|32847.58|0.03|0.06|N|O|1998-05-28|1998-03-13|1998-06-12|TAKE BACK RETURN|FOB|wake idly against the doggedly pendi +47425|572|33|2|8|11780.56|0.04|0.08|N|O|1998-03-03|1998-03-30|1998-03-20|NONE|AIR|s haggle fluffily. fin +47425|1532|13|3|16|22936.48|0.07|0.04|N|O|1998-04-12|1998-04-13|1998-04-22|DELIVER IN PERSON|FOB|ies sleep blithely final courts +47425|1525|46|4|40|57060.80|0.05|0.06|N|O|1998-03-11|1998-04-01|1998-04-06|DELIVER IN PERSON|AIR|nic platelets accordi +47426|1684|67|1|27|42813.36|0.00|0.03|R|F|1994-12-08|1994-11-01|1994-12-23|TAKE BACK RETURN|SHIP|grate care +47427|1617|18|1|5|7593.05|0.02|0.04|N|O|1998-03-14|1998-05-23|1998-04-12|TAKE BACK RETURN|AIR|arefully regular accounts snooze +47427|986|21|2|22|41513.56|0.08|0.02|N|O|1998-05-19|1998-04-07|1998-06-10|COLLECT COD|FOB|ly final f +47428|1443|83|1|4|5377.76|0.03|0.04|A|F|1993-06-04|1993-04-09|1993-06-25|COLLECT COD|TRUCK|instructions. deposits nag fluffily. c +47428|1035|41|2|10|9360.30|0.03|0.07|A|F|1993-04-23|1993-04-26|1993-05-04|NONE|AIR|gular accounts wake blithely. furiously fi +47429|732|97|1|9|14694.57|0.01|0.03|N|O|1996-05-28|1996-07-03|1996-06-19|DELIVER IN PERSON|MAIL|rding to the +47429|608|9|2|31|46766.60|0.10|0.02|N|O|1996-08-19|1996-08-01|1996-09-08|TAKE BACK RETURN|SHIP|bits are slyly. quickly fina +47430|396|25|1|30|38891.70|0.06|0.02|N|O|1997-07-08|1997-06-07|1997-07-27|COLLECT COD|REG AIR|carefully alongside of the perm +47430|108|87|2|3|3024.30|0.10|0.07|N|O|1997-06-24|1997-07-03|1997-07-08|DELIVER IN PERSON|TRUCK|ep express foxes. special instruction +47431|1065|36|1|8|7728.48|0.01|0.01|N|O|1997-10-24|1997-10-07|1997-11-20|NONE|SHIP|yly around the carefully speci +47431|149|50|2|36|37769.04|0.02|0.00|N|O|1997-12-21|1997-11-29|1998-01-02|NONE|RAIL|ake. carefully even +47431|949|52|3|12|22199.28|0.03|0.03|N|O|1997-12-20|1997-10-09|1998-01-04|TAKE BACK RETURN|TRUCK|y pending ideas are carefully ironic, pendi +47431|1665|7|4|38|59533.08|0.07|0.02|N|O|1997-12-26|1997-10-19|1998-01-02|TAKE BACK RETURN|AIR|uffily after the carefully regular deposits +47431|520|11|5|19|26989.88|0.05|0.07|N|O|1997-09-18|1997-10-13|1997-10-17|TAKE BACK RETURN|RAIL|he pending ideas. +47456|1996|41|1|20|37959.80|0.00|0.08|A|F|1992-08-11|1992-08-21|1992-09-01|TAKE BACK RETURN|TRUCK|totes. regular, regular foxes abov +47456|436|95|2|48|64148.64|0.03|0.07|R|F|1992-07-06|1992-07-04|1992-08-03|TAKE BACK RETURN|AIR|nusual foxes hang according to the slyly s +47456|1375|76|3|7|8934.59|0.07|0.05|R|F|1992-08-12|1992-08-15|1992-08-23|DELIVER IN PERSON|MAIL|g to the quick +47456|1483|1|4|23|31843.04|0.03|0.08|A|F|1992-07-29|1992-07-13|1992-08-10|NONE|REG AIR|sts. slyly u +47457|1945|90|1|33|60949.02|0.08|0.05|A|F|1994-07-16|1994-08-19|1994-07-23|TAKE BACK RETURN|AIR|ully against the carefully silent deposits. +47457|1152|89|2|26|27381.90|0.03|0.06|R|F|1994-08-19|1994-08-27|1994-08-29|COLLECT COD|RAIL|equests. slyly pending deposits affix +47457|437|25|3|21|28086.03|0.08|0.04|A|F|1994-08-24|1994-07-25|1994-08-27|NONE|AIR|final warth +47457|1740|83|4|36|59102.64|0.01|0.03|R|F|1994-06-08|1994-08-19|1994-06-24|COLLECT COD|FOB|around the unusual de +47457|421|22|5|9|11892.78|0.01|0.05|R|F|1994-07-09|1994-08-03|1994-07-15|NONE|MAIL|latelets. fluffily regular pack +47457|1985|30|6|33|62270.34|0.04|0.08|A|F|1994-09-09|1994-08-12|1994-09-21|TAKE BACK RETURN|AIR| quickly. re +47457|193|94|7|22|24050.18|0.03|0.06|R|F|1994-09-14|1994-07-21|1994-09-27|TAKE BACK RETURN|MAIL|regular deposits? bl +47458|1465|44|1|39|53291.94|0.04|0.04|N|O|1996-04-30|1996-07-09|1996-05-30|COLLECT COD|MAIL| regular pinto be +47458|655|49|2|10|15556.50|0.00|0.02|N|O|1996-07-26|1996-06-21|1996-08-17|DELIVER IN PERSON|MAIL|thely against the blithely bold ideas. s +47458|1092|98|3|30|29792.70|0.08|0.00|N|O|1996-07-11|1996-07-18|1996-08-01|TAKE BACK RETURN|FOB|inder furiously al +47458|617|18|4|5|7588.05|0.04|0.01|N|O|1996-07-16|1996-06-13|1996-08-06|NONE|SHIP|accounts sleep blithely alongsid +47458|560|21|5|7|10223.92|0.09|0.05|N|O|1996-07-04|1996-06-24|1996-07-23|DELIVER IN PERSON|REG AIR|dolites nag alongside of the furiously +47458|532|63|6|40|57301.20|0.07|0.03|N|O|1996-06-24|1996-06-25|1996-07-06|COLLECT COD|REG AIR|the furiously regular deposit +47458|1653|95|7|9|13991.85|0.02|0.07|N|O|1996-06-14|1996-07-15|1996-06-19|COLLECT COD|AIR|telets. blithely ironic +47459|1856|86|1|17|29883.45|0.09|0.05|N|O|1995-08-23|1995-10-20|1995-09-04|COLLECT COD|TRUCK|ss pinto beans nag +47459|455|43|2|30|40663.50|0.05|0.04|N|O|1995-08-29|1995-09-29|1995-09-06|COLLECT COD|FOB|even dependencies. furiously +47459|1210|11|3|23|25557.83|0.06|0.07|N|O|1995-09-18|1995-11-08|1995-09-21|COLLECT COD|REG AIR|uickly regular theodolites use sile +47460|608|71|1|34|51292.40|0.03|0.00|A|F|1993-11-15|1993-11-17|1993-12-07|TAKE BACK RETURN|FOB|ix furiously. slyly pending pack +47460|1633|16|2|39|59850.57|0.09|0.04|A|F|1993-10-13|1993-12-12|1993-11-10|TAKE BACK RETURN|SHIP|ests! special deposits nag carefully along +47461|782|15|1|44|74042.32|0.08|0.03|A|F|1993-05-02|1993-06-25|1993-05-22|COLLECT COD|RAIL|iously bold accounts +47461|597|28|2|19|28454.21|0.00|0.02|R|F|1993-07-28|1993-06-18|1993-08-26|NONE|SHIP|ly. accoun +47461|1487|88|3|15|20827.20|0.05|0.08|A|F|1993-08-04|1993-07-23|1993-08-21|NONE|TRUCK| special instructions sleep fur +47461|609|3|4|4|6038.40|0.07|0.01|A|F|1993-06-28|1993-06-16|1993-07-26|NONE|TRUCK|quickly thin asymptotes along the +47461|1086|22|5|33|32573.64|0.01|0.07|A|F|1993-06-10|1993-07-02|1993-06-29|DELIVER IN PERSON|SHIP|oze after the furi +47461|750|15|6|6|9904.50|0.00|0.01|R|F|1993-04-29|1993-07-18|1993-05-12|COLLECT COD|FOB|efully about the blithely fi +47461|1416|56|7|35|46109.35|0.10|0.05|R|F|1993-08-08|1993-06-03|1993-08-15|NONE|FOB| haggle furiously. express excuses ar +47462|1111|48|1|34|34411.74|0.10|0.03|N|O|1995-06-24|1995-08-01|1995-07-02|TAKE BACK RETURN|RAIL|en foxes acros +47462|706|7|2|23|36954.10|0.06|0.07|N|O|1995-10-09|1995-09-05|1995-10-25|NONE|TRUCK|sits engage fluf +47462|1013|19|3|27|24678.27|0.06|0.04|N|O|1995-06-27|1995-08-25|1995-07-11|TAKE BACK RETURN|MAIL|c platelets nag fluffil +47462|842|43|4|32|55770.88|0.08|0.02|N|O|1995-07-03|1995-09-03|1995-07-20|DELIVER IN PERSON|RAIL| ironic decoys cajole slyly +47462|222|4|5|1|1122.22|0.06|0.01|N|O|1995-08-07|1995-08-31|1995-08-31|TAKE BACK RETURN|RAIL| instructions integr +47463|310|39|1|41|49622.71|0.10|0.02|N|O|1998-05-25|1998-04-19|1998-06-03|NONE|RAIL|ies. quickl +47463|1069|5|2|30|29101.80|0.02|0.04|N|O|1998-03-05|1998-04-18|1998-04-01|DELIVER IN PERSON|MAIL|kly regular requests wake +47463|227|28|3|8|9017.76|0.05|0.02|N|O|1998-04-09|1998-04-30|1998-05-03|NONE|AIR|e final reques +47463|1778|5|4|29|48713.33|0.06|0.08|N|O|1998-05-10|1998-03-23|1998-05-25|DELIVER IN PERSON|AIR|silently ir +47488|985|20|1|37|69781.26|0.00|0.07|R|F|1995-05-11|1995-07-15|1995-05-14|COLLECT COD|FOB|tes. ironic, even ideas haggl +47489|596|97|1|39|58367.01|0.07|0.02|A|F|1994-06-22|1994-08-08|1994-07-22|TAKE BACK RETURN|AIR|arefully ironic requests. pending instr +47489|94|70|2|31|30816.79|0.09|0.05|R|F|1994-06-08|1994-06-22|1994-07-06|DELIVER IN PERSON|TRUCK|furiously +47489|911|12|3|47|85159.77|0.01|0.04|R|F|1994-08-08|1994-07-10|1994-08-30|COLLECT COD|SHIP|ideas. daringly +47490|1822|23|1|23|39647.86|0.03|0.05|N|O|1995-09-25|1995-10-12|1995-10-18|NONE|AIR|ke slyly. final dependencies serve furiou +47490|743|8|2|1|1643.74|0.06|0.08|N|O|1995-09-07|1995-10-07|1995-09-27|TAKE BACK RETURN|RAIL|ckly final ideas boo +47490|775|8|3|41|68706.57|0.08|0.07|N|O|1995-09-10|1995-09-29|1995-09-11|TAKE BACK RETURN|MAIL| integrate. fluffily sp +47490|839|39|4|15|26097.45|0.02|0.05|N|O|1995-11-05|1995-10-04|1995-11-30|DELIVER IN PERSON|FOB|nic pains. pending theo +47490|820|54|5|27|46462.14|0.01|0.06|N|O|1995-09-23|1995-11-10|1995-10-15|NONE|AIR|the furious +47490|1618|1|6|17|25833.37|0.02|0.07|N|O|1995-10-27|1995-10-30|1995-11-06|COLLECT COD|REG AIR|le carefully. q +47491|386|43|1|50|64319.00|0.07|0.02|N|O|1998-07-11|1998-05-04|1998-07-17|TAKE BACK RETURN|FOB|to the bold, special she +47492|884|51|1|14|24988.32|0.08|0.01|N|O|1995-07-26|1995-09-23|1995-07-27|NONE|SHIP| slyly unusual deposits int +47492|1384|85|2|10|12853.80|0.02|0.01|N|O|1995-10-12|1995-09-25|1995-11-11|DELIVER IN PERSON|SHIP|re furiously f +47492|1514|55|3|13|18401.63|0.01|0.01|N|O|1995-11-02|1995-10-19|1995-11-06|DELIVER IN PERSON|SHIP|ve deposits. furio +47492|1478|18|4|19|26209.93|0.07|0.02|N|O|1995-08-15|1995-09-28|1995-08-27|NONE|FOB|ts. quickly +47492|521|52|5|32|45488.64|0.10|0.01|N|O|1995-08-09|1995-10-11|1995-08-13|TAKE BACK RETURN|REG AIR|ss packages. blithely un +47492|61|37|6|42|40364.52|0.06|0.06|N|O|1995-09-02|1995-10-03|1995-09-29|TAKE BACK RETURN|FOB|ickly even +47492|1594|35|7|46|68797.14|0.00|0.03|N|O|1995-09-29|1995-10-04|1995-10-24|NONE|RAIL|usual foxe +47493|930|33|1|37|67744.41|0.01|0.03|R|F|1994-03-14|1994-05-02|1994-04-02|TAKE BACK RETURN|SHIP|beans affix. carefully bold requests are +47493|1454|72|2|25|33886.25|0.06|0.03|A|F|1994-05-03|1994-04-14|1994-05-05|COLLECT COD|RAIL|uriously. iro +47493|996|99|3|24|45527.76|0.07|0.06|A|F|1994-04-03|1994-04-15|1994-04-22|DELIVER IN PERSON|FOB|? blithe dependencies +47493|855|89|4|48|84280.80|0.01|0.08|R|F|1994-02-19|1994-03-15|1994-03-10|DELIVER IN PERSON|RAIL|t the theodolites. fur +47494|46|22|1|16|15136.64|0.08|0.08|A|F|1994-07-05|1994-09-05|1994-07-12|COLLECT COD|SHIP|ticing theo +47494|1000|3|2|35|31535.00|0.06|0.02|A|F|1994-08-29|1994-09-11|1994-09-10|NONE|AIR|egular packages. final pi +47494|286|68|3|11|13049.08|0.09|0.08|R|F|1994-08-17|1994-09-22|1994-09-13|COLLECT COD|RAIL|ckly. slyly final foxes doze furious +47494|629|30|4|25|38240.50|0.03|0.01|R|F|1994-07-24|1994-09-16|1994-08-02|DELIVER IN PERSON|AIR|ss packages sleep blithely regular r +47494|188|67|5|25|27204.50|0.06|0.05|A|F|1994-07-06|1994-08-25|1994-07-28|DELIVER IN PERSON|MAIL|gular dependencies. blithely even ideas +47494|935|70|6|31|56913.83|0.07|0.01|A|F|1994-07-14|1994-09-01|1994-07-22|TAKE BACK RETURN|REG AIR|express asymptotes ar +47495|1422|40|1|15|19851.30|0.08|0.07|N|O|1995-12-08|1995-11-22|1995-12-21|TAKE BACK RETURN|REG AIR| deposits. blithely spe +47495|334|19|2|32|39498.56|0.08|0.01|N|O|1995-09-01|1995-11-21|1995-09-14|TAKE BACK RETURN|MAIL|nal theodolites +47495|1672|96|3|32|50357.44|0.06|0.05|N|O|1995-11-26|1995-10-06|1995-12-09|DELIVER IN PERSON|TRUCK|al platelets across t +47495|1236|37|4|5|5686.15|0.08|0.02|N|O|1995-11-02|1995-10-01|1995-11-23|DELIVER IN PERSON|AIR|after the carefully +47495|2000|89|5|24|21648.00|0.08|0.03|N|O|1995-08-31|1995-11-04|1995-09-10|NONE|TRUCK|l dependencies wake between the +47495|1935|36|6|30|55107.90|0.10|0.06|N|O|1995-12-18|1995-11-22|1995-12-21|NONE|FOB|efully unusual ideas ha +47520|823|57|1|39|67228.98|0.08|0.07|R|F|1994-11-10|1994-12-11|1994-11-20|TAKE BACK RETURN|AIR|ins. carefu +47520|1734|61|2|21|34350.33|0.00|0.05|A|F|1995-02-05|1995-01-02|1995-02-06|NONE|RAIL|onic, ironic ideas cajole qui +47520|1120|21|3|4|4084.48|0.09|0.05|R|F|1994-11-15|1994-11-07|1994-12-02|NONE|FOB|. ironic, unusual accounts cajole furiousl +47520|1299|37|4|35|42010.15|0.00|0.07|A|F|1994-10-13|1994-12-16|1994-10-26|DELIVER IN PERSON|MAIL|ully pending theodolites are +47520|1491|70|5|24|33419.76|0.07|0.05|R|F|1995-02-03|1994-11-21|1995-02-23|DELIVER IN PERSON|MAIL|yly special +47520|1748|91|6|36|59390.64|0.10|0.00|A|F|1994-11-24|1994-11-28|1994-12-10|TAKE BACK RETURN|RAIL|platelets maintain blithe +47520|1831|32|7|18|31190.94|0.05|0.06|A|F|1994-11-10|1994-12-18|1994-11-22|COLLECT COD|SHIP|eep slyly despite the blithely even +47521|1762|5|1|23|38266.48|0.00|0.01|A|F|1994-01-01|1994-02-23|1994-01-05|COLLECT COD|TRUCK|usual packages cajole. +47521|404|92|2|23|30001.20|0.09|0.04|R|F|1994-01-24|1994-02-23|1994-02-15|COLLECT COD|RAIL|ully even warthogs. quic +47521|253|35|3|49|56509.25|0.03|0.07|R|F|1994-03-03|1994-03-04|1994-03-21|NONE|RAIL|ronic theodolites. quickly special dugouts +47521|217|18|4|19|21226.99|0.00|0.04|A|F|1994-04-07|1994-01-29|1994-04-18|TAKE BACK RETURN|AIR|latelets along +47522|1732|17|1|29|47378.17|0.03|0.05|A|F|1992-12-25|1992-12-30|1993-01-16|NONE|SHIP|en deposits. furiously ironic +47522|542|73|2|34|49046.36|0.05|0.00|R|F|1993-01-13|1992-12-09|1993-01-30|NONE|MAIL|ly regular deposits doubt. quickly regular +47522|1211|23|3|30|33366.30|0.05|0.05|R|F|1993-02-17|1993-01-18|1993-03-15|COLLECT COD|RAIL|ent ideas wake slyly: even, silent +47522|1136|9|4|35|36299.55|0.07|0.00|A|F|1993-01-21|1992-12-07|1993-02-06|NONE|FOB| above the deposits. blithel +47522|462|21|5|15|20436.90|0.03|0.00|R|F|1992-12-19|1993-01-09|1992-12-23|NONE|REG AIR|ely special theodolites integrat +47522|923|26|6|1|1823.92|0.08|0.03|A|F|1993-02-05|1992-12-30|1993-02-07|TAKE BACK RETURN|MAIL|quickly. carefully pen +47523|975|76|1|47|88170.59|0.03|0.07|A|F|1992-09-22|1992-08-22|1992-09-24|DELIVER IN PERSON|FOB|ges. deposits a +47523|712|77|2|19|30641.49|0.05|0.04|R|F|1992-07-12|1992-07-05|1992-08-01|DELIVER IN PERSON|AIR|ording to the speci +47523|1819|6|3|16|27532.96|0.02|0.04|A|F|1992-06-30|1992-08-01|1992-07-29|COLLECT COD|RAIL|phs sleep furiously about the carefully +47523|1569|10|4|31|45587.36|0.01|0.05|A|F|1992-09-15|1992-08-13|1992-10-14|COLLECT COD|AIR|ckages use fluffily instructi +47524|1257|95|1|5|5791.25|0.10|0.06|A|F|1993-06-21|1993-07-14|1993-07-01|DELIVER IN PERSON|AIR|bold instruct +47524|1084|90|2|21|20686.68|0.03|0.01|R|F|1993-07-22|1993-06-19|1993-08-15|NONE|AIR|ic pains boost along the fluffily r +47524|1805|49|3|4|6827.20|0.09|0.08|A|F|1993-08-02|1993-05-30|1993-08-17|TAKE BACK RETURN|AIR|nwind. carefully regular foxes serve furiou +47524|685|79|4|37|58670.16|0.09|0.06|A|F|1993-05-04|1993-06-14|1993-05-07|DELIVER IN PERSON|MAIL|s. dependencies cajole blithe +47524|824|24|5|40|68992.80|0.10|0.07|A|F|1993-05-29|1993-06-19|1993-06-14|TAKE BACK RETURN|MAIL|ing packages wake along the carefully regul +47524|927|96|6|12|21935.04|0.00|0.02|R|F|1993-05-03|1993-07-09|1993-06-02|NONE|SHIP|ong the ironic instruct +47525|350|7|1|28|35009.80|0.10|0.03|A|F|1995-05-24|1995-04-21|1995-06-14|COLLECT COD|TRUCK|ts. furiously regul +47525|1127|28|2|31|31871.72|0.05|0.08|A|F|1995-04-23|1995-05-16|1995-05-01|TAKE BACK RETURN|RAIL|he furiously regular deposits. ironic, fin +47525|1509|90|3|49|69114.50|0.06|0.07|A|F|1995-06-07|1995-04-18|1995-06-14|TAKE BACK RETURN|TRUCK|ts about the sly orbits cajole furiou +47525|1403|82|4|37|48262.80|0.03|0.08|N|F|1995-05-30|1995-04-24|1995-06-23|COLLECT COD|RAIL|symptotes dazzle +47525|771|72|5|42|70214.34|0.01|0.06|N|O|1995-06-25|1995-05-24|1995-07-13|DELIVER IN PERSON|FOB|riously regular pinto beans ha +47526|67|18|1|1|967.06|0.00|0.06|A|F|1992-05-14|1992-02-29|1992-06-13|NONE|FOB|usly daring, unusual theodolite +47526|1068|39|2|9|8721.54|0.09|0.05|R|F|1992-04-05|1992-04-03|1992-04-27|COLLECT COD|AIR|xes haggle bl +47526|1178|51|3|23|24820.91|0.07|0.00|R|F|1992-05-06|1992-03-01|1992-05-31|DELIVER IN PERSON|SHIP|. fluffily unusual sentiments +47526|406|7|4|45|58788.00|0.00|0.02|A|F|1992-03-23|1992-04-10|1992-03-31|TAKE BACK RETURN|REG AIR|osits. fluffily ironic instruc +47527|320|5|1|39|47592.48|0.07|0.07|A|F|1993-12-14|1993-12-17|1993-12-20|COLLECT COD|MAIL|sits. deposits integrate blith +47527|181|34|2|36|38922.48|0.07|0.07|A|F|1993-10-30|1993-12-07|1993-11-02|NONE|RAIL|cording to the furiously regular +47552|893|94|1|48|86106.72|0.10|0.04|N|O|1998-09-28|1998-08-05|1998-10-18|DELIVER IN PERSON|TRUCK| blithely bold foxes haggle evenly blithe +47552|1801|31|2|31|52786.80|0.02|0.04|N|O|1998-10-20|1998-09-23|1998-11-02|TAKE BACK RETURN|RAIL|ggle regular, stealthy sauternes. dari +47552|905|6|3|38|68624.20|0.02|0.04|N|O|1998-08-26|1998-08-14|1998-08-30|TAKE BACK RETURN|REG AIR|e quickly carefully final +47552|463|93|4|43|58628.78|0.06|0.04|N|O|1998-10-19|1998-08-22|1998-10-27|NONE|AIR| ironic deposits +47553|1481|82|1|31|42856.88|0.09|0.04|N|O|1995-07-15|1995-07-18|1995-08-14|NONE|SHIP|ly special requests above the slyly +47553|1659|60|2|45|70229.25|0.02|0.00|N|O|1995-07-20|1995-08-13|1995-08-10|TAKE BACK RETURN|RAIL|unusual ideas sleep. +47553|678|79|3|28|44202.76|0.07|0.08|N|O|1995-09-18|1995-08-05|1995-09-30|COLLECT COD|MAIL| idle deposits mold carefully +47553|388|45|4|50|64419.00|0.09|0.00|N|O|1995-09-08|1995-06-26|1995-09-09|NONE|RAIL|xes. special, regular deposits haggle +47554|1438|17|1|39|52237.77|0.01|0.01|R|F|1993-04-15|1993-06-11|1993-04-26|NONE|FOB|ar foxes. slyly bold pinto beans ar +47554|543|34|2|37|53410.98|0.02|0.00|R|F|1993-07-07|1993-06-04|1993-07-24|COLLECT COD|MAIL|c excuses are carefully along the regu +47554|20|21|3|24|22080.48|0.10|0.07|A|F|1993-05-13|1993-05-31|1993-05-30|NONE|FOB|ts nag blithely final pearls. car +47554|321|22|4|12|14655.84|0.00|0.00|A|F|1993-04-01|1993-05-04|1993-04-26|DELIVER IN PERSON|FOB|ully. deposits +47554|682|83|5|11|17409.48|0.07|0.08|R|F|1993-05-12|1993-05-13|1993-05-21|TAKE BACK RETURN|TRUCK|xes boost carefully slyly final +47555|263|91|1|27|31408.02|0.07|0.03|N|O|1997-10-28|1997-12-16|1997-11-10|DELIVER IN PERSON|SHIP|deas wake blithely even, pen +47555|949|50|2|16|29599.04|0.06|0.07|N|O|1997-10-07|1997-11-14|1997-11-02|DELIVER IN PERSON|RAIL|riously according to the carefu +47556|1186|59|1|39|42400.02|0.04|0.01|R|F|1993-08-29|1993-10-02|1993-09-25|TAKE BACK RETURN|REG AIR|quickly above the quickly express deposi +47556|479|80|2|35|48281.45|0.07|0.08|R|F|1993-10-15|1993-10-17|1993-11-12|NONE|RAIL|uickly against the furiously ironic depo +47556|1060|31|3|38|36520.28|0.05|0.08|R|F|1993-09-11|1993-10-04|1993-10-02|NONE|REG AIR|es sleep deposits. carefully bold +47557|1230|68|1|47|53167.81|0.06|0.08|N|O|1998-06-22|1998-08-13|1998-06-23|NONE|REG AIR| packages. slyly regular deposits boost s +47557|219|20|2|2|2238.42|0.02|0.06|N|O|1998-09-26|1998-08-11|1998-10-03|TAKE BACK RETURN|AIR|es maintain blithely silent +47557|1619|20|3|15|22809.15|0.08|0.02|N|O|1998-08-21|1998-08-15|1998-09-05|DELIVER IN PERSON|REG AIR|he blithely final packages. ironic +47557|830|97|4|20|34616.60|0.04|0.03|N|O|1998-09-28|1998-09-09|1998-09-30|COLLECT COD|REG AIR|odolites. carefully final fo +47557|1441|59|5|5|6712.20|0.04|0.02|N|O|1998-08-15|1998-08-13|1998-08-23|TAKE BACK RETURN|SHIP|special instructions. carefull +47557|404|34|6|22|28696.80|0.06|0.02|N|O|1998-08-02|1998-08-25|1998-08-14|NONE|MAIL|ns use after the +47558|1929|30|1|42|76898.64|0.08|0.06|N|O|1997-09-08|1997-08-08|1997-09-09|DELIVER IN PERSON|TRUCK|e along the carefully ironic ideas +47558|222|23|2|38|42644.36|0.03|0.00|N|O|1997-08-26|1997-08-01|1997-09-22|COLLECT COD|AIR|old accounts are. expre +47558|102|3|3|31|31065.10|0.05|0.04|N|O|1997-06-05|1997-07-09|1997-06-27|COLLECT COD|TRUCK|eposits sleep quickly al +47558|1459|38|4|41|55778.45|0.10|0.02|N|O|1997-08-11|1997-07-08|1997-09-05|COLLECT COD|RAIL|t against the slyly close pinto beans. +47558|1143|16|5|46|48030.44|0.08|0.01|N|O|1997-08-17|1997-07-23|1997-09-04|DELIVER IN PERSON|REG AIR|y special dependencies sleep +47558|1156|57|6|17|17971.55|0.07|0.00|N|O|1997-08-11|1997-06-11|1997-08-20|DELIVER IN PERSON|MAIL|nstructions use fluffily stealthy, regul +47559|1511|32|1|21|29662.71|0.08|0.06|N|O|1998-07-05|1998-08-24|1998-07-09|NONE|REG AIR|layers. furiously even instructions cajo +47559|1101|10|2|4|4008.40|0.09|0.04|N|O|1998-07-12|1998-07-13|1998-07-30|TAKE BACK RETURN|TRUCK| even packages haggle pending foxes +47559|1079|85|3|20|19601.40|0.01|0.06|N|O|1998-09-19|1998-08-03|1998-10-06|DELIVER IN PERSON|RAIL|impress quickly regular +47584|1771|98|1|29|48510.33|0.06|0.06|R|F|1993-11-17|1993-09-07|1993-11-28|NONE|REG AIR|nts cajole special c +47584|1851|38|2|28|49079.80|0.05|0.08|R|F|1993-08-29|1993-08-27|1993-09-12|COLLECT COD|RAIL|quickly. final packages are careful +47584|1269|70|3|35|40959.10|0.09|0.00|R|F|1993-11-09|1993-08-27|1993-11-18|TAKE BACK RETURN|RAIL| quickly about the unusual asymptot +47584|1429|47|4|45|59868.90|0.08|0.04|A|F|1993-08-12|1993-10-20|1993-08-29|DELIVER IN PERSON|TRUCK|special platele +47584|617|18|5|45|68292.45|0.03|0.07|A|F|1993-10-15|1993-10-19|1993-11-13|NONE|FOB|. blithely special +47584|1811|12|6|19|32543.39|0.06|0.08|R|F|1993-09-20|1993-09-10|1993-09-23|NONE|REG AIR|r dogged foxes use b +47585|1483|23|1|7|9691.36|0.04|0.08|N|O|1998-08-09|1998-07-12|1998-08-17|DELIVER IN PERSON|MAIL|unts cajole. blithely pending deposits wake +47585|442|72|2|41|55040.04|0.09|0.00|N|O|1998-09-11|1998-08-06|1998-10-08|DELIVER IN PERSON|SHIP|nts wake carefully final requests: +47585|980|81|3|45|84644.10|0.00|0.08|N|O|1998-07-20|1998-07-29|1998-07-31|NONE|RAIL|l packages maintain slyly. qu +47585|1670|12|4|16|25146.72|0.01|0.00|N|O|1998-09-08|1998-06-20|1998-09-17|TAKE BACK RETURN|REG AIR| carefully +47585|1128|37|5|32|32931.84|0.09|0.04|N|O|1998-08-02|1998-07-25|1998-08-26|NONE|FOB| ruthless foxes nag bl +47585|158|11|6|48|50791.20|0.07|0.02|N|O|1998-06-04|1998-07-07|1998-06-27|TAKE BACK RETURN|RAIL|lites. express, final depo +47585|418|77|7|49|64602.09|0.07|0.06|N|O|1998-05-14|1998-08-03|1998-06-02|DELIVER IN PERSON|RAIL|nticingly f +47586|1741|42|1|7|11499.18|0.02|0.05|N|O|1996-08-12|1996-07-15|1996-08-26|NONE|REG AIR|. quickly regular platelets haggle furi +47586|1127|64|2|23|23646.76|0.10|0.03|N|O|1996-06-05|1996-07-16|1996-06-16|TAKE BACK RETURN|RAIL|en pains. packages wake slyly +47586|1809|96|3|41|70142.80|0.02|0.05|N|O|1996-06-06|1996-07-02|1996-07-04|COLLECT COD|MAIL|courts. blithely bold requests haggle. bo +47586|1538|79|4|16|23032.48|0.10|0.03|N|O|1996-08-10|1996-07-22|1996-08-23|DELIVER IN PERSON|REG AIR|ironic requests nag carefully? regu +47586|382|83|5|37|47448.06|0.03|0.07|N|O|1996-08-25|1996-07-02|1996-08-28|NONE|RAIL|g packages. quickl +47586|911|14|6|41|74288.31|0.04|0.01|N|O|1996-06-26|1996-07-02|1996-07-05|COLLECT COD|TRUCK|quickly bol +47587|1937|70|1|15|27583.95|0.05|0.08|N|O|1996-05-23|1996-06-29|1996-06-12|NONE|REG AIR|ent asymptotes cajo +47588|1708|93|1|3|4829.10|0.02|0.07|A|F|1994-06-12|1994-07-23|1994-06-20|TAKE BACK RETURN|AIR| according to the regular packages haggle +47588|581|82|2|50|74079.00|0.06|0.02|R|F|1994-09-14|1994-06-25|1994-10-06|DELIVER IN PERSON|AIR|lar theodolites wake quickly f +47589|873|7|1|39|69180.93|0.04|0.02|N|O|1997-06-06|1997-06-16|1997-06-11|TAKE BACK RETURN|FOB|. regular pinto bea +47589|1912|13|2|43|77998.13|0.09|0.05|N|O|1997-05-03|1997-05-18|1997-05-23|COLLECT COD|FOB|final foxes. blithely +47590|182|83|1|11|11903.98|0.06|0.06|N|O|1997-08-15|1997-08-03|1997-09-10|COLLECT COD|AIR|nusual deposits. blithely special +47590|1953|42|2|15|27824.25|0.10|0.04|N|O|1997-10-13|1997-09-20|1997-11-06|DELIVER IN PERSON|REG AIR|orbits. pending, final instructions ca +47590|241|96|3|20|22824.80|0.10|0.08|N|O|1997-08-24|1997-08-15|1997-08-29|COLLECT COD|FOB|s. regular, even excuses affix slyly. slyl +47590|674|6|4|15|23620.05|0.10|0.06|N|O|1997-07-11|1997-09-03|1997-08-04|TAKE BACK RETURN|TRUCK|carefully bold accounts. regular, regula +47590|1535|16|5|11|15801.83|0.05|0.08|N|O|1997-09-24|1997-09-30|1997-10-02|NONE|MAIL|sely careful deposits nag blithely. slyly +47590|1365|4|6|46|58252.56|0.06|0.03|N|O|1997-07-14|1997-09-01|1997-07-20|COLLECT COD|SHIP|es wake blithely according to t +47591|676|39|1|38|59913.46|0.05|0.04|A|F|1992-01-06|1992-03-19|1992-01-11|COLLECT COD|REG AIR|ily above the carefully regular asy +47591|131|10|2|15|15466.95|0.01|0.01|A|F|1992-03-16|1992-02-12|1992-04-03|DELIVER IN PERSON|SHIP|hely busy ideas. pending deposits above t +47591|1184|57|3|48|52088.64|0.07|0.04|A|F|1992-02-29|1992-02-11|1992-03-11|TAKE BACK RETURN|AIR|ronic deposits breach fluffil +47616|921|24|1|22|40082.24|0.08|0.02|N|O|1997-12-11|1998-01-02|1998-01-10|TAKE BACK RETURN|RAIL|. slowly ironic ideas boost furious +47616|23|49|2|29|26767.58|0.03|0.03|N|O|1998-01-06|1997-12-08|1998-02-04|DELIVER IN PERSON|RAIL|w. blithely permanent ide +47617|260|15|1|43|49891.18|0.00|0.00|R|F|1995-03-16|1995-03-07|1995-03-18|TAKE BACK RETURN|TRUCK|en accounts haggle furiously. +47617|1277|78|2|50|58913.50|0.04|0.04|R|F|1994-12-27|1995-01-29|1995-01-12|DELIVER IN PERSON|RAIL|grate blithely. +47617|1872|2|3|20|35477.40|0.00|0.03|R|F|1995-02-05|1995-02-17|1995-02-26|NONE|RAIL|lar platelets. +47617|773|6|4|25|41844.25|0.04|0.02|A|F|1995-03-14|1995-03-09|1995-03-31|COLLECT COD|TRUCK|es are. final f +47617|1413|92|5|45|59148.45|0.01|0.01|R|F|1995-03-02|1995-02-09|1995-03-05|TAKE BACK RETURN|AIR| pending i +47617|1231|32|6|19|21512.37|0.05|0.08|R|F|1995-02-17|1995-01-23|1995-03-15|DELIVER IN PERSON|SHIP|ously after the silently express deposi +47618|426|27|1|38|50403.96|0.08|0.05|N|O|1996-10-22|1996-11-08|1996-11-15|TAKE BACK RETURN|SHIP| instructions wake a +47618|535|36|2|38|54550.14|0.04|0.05|N|O|1996-10-23|1996-11-20|1996-10-24|DELIVER IN PERSON|TRUCK|al foxes. slyly special platelets poach car +47618|1730|15|3|27|44056.71|0.06|0.00|N|O|1996-09-28|1996-11-13|1996-10-19|DELIVER IN PERSON|AIR|he quickly ironic foxes nod after the +47618|422|23|4|25|33060.50|0.05|0.01|N|O|1996-10-28|1996-12-05|1996-11-03|TAKE BACK RETURN|REG AIR|ounts integrate o +47618|858|58|5|35|61559.75|0.03|0.02|N|O|1996-10-28|1996-12-13|1996-11-14|TAKE BACK RETURN|RAIL|ular instructions. fu +47618|1420|99|6|22|29071.24|0.10|0.00|N|O|1997-01-12|1996-12-03|1997-01-22|DELIVER IN PERSON|RAIL| the express, bold packages. carefully regu +47618|1527|8|7|15|21427.80|0.03|0.05|N|O|1997-01-13|1996-12-04|1997-02-06|TAKE BACK RETURN|REG AIR|. blithely ironic theodo +47619|317|2|1|29|35301.99|0.01|0.08|R|F|1992-05-14|1992-05-23|1992-05-15|NONE|AIR|regular deposits. instructions wake fu +47620|1|77|1|44|39644.00|0.03|0.03|R|F|1992-10-07|1992-08-13|1992-10-24|TAKE BACK RETURN|SHIP|gainst the fluffily final +47620|256|84|2|33|38156.25|0.09|0.00|A|F|1992-10-04|1992-08-08|1992-10-27|COLLECT COD|TRUCK|al asymptotes sleep permanently above the +47620|205|87|3|12|13262.40|0.10|0.04|R|F|1992-08-14|1992-09-19|1992-08-23|NONE|MAIL| deposits use. slyly ir +47620|92|93|4|6|5952.54|0.10|0.06|R|F|1992-07-06|1992-07-31|1992-07-11|DELIVER IN PERSON|TRUCK|ncies. fluffily regul +47620|149|50|5|11|11540.54|0.07|0.08|R|F|1992-07-27|1992-07-29|1992-08-07|COLLECT COD|SHIP|lent packages. slyly even t +47621|926|95|1|47|85865.24|0.08|0.05|R|F|1994-07-22|1994-09-27|1994-08-20|DELIVER IN PERSON|RAIL|he regular, re +47621|1796|81|2|2|3395.58|0.07|0.07|A|F|1994-11-03|1994-08-25|1994-11-04|DELIVER IN PERSON|AIR| final foxes. +47622|1079|50|1|2|1960.14|0.06|0.07|A|F|1992-12-28|1992-11-12|1993-01-08|NONE|RAIL|fter the furiously thin ideas use quickly s +47622|345|30|2|15|18680.10|0.09|0.03|R|F|1992-11-22|1992-12-03|1992-12-08|TAKE BACK RETURN|SHIP|y even foxes. pending, special requ +47622|1731|16|3|15|24490.95|0.00|0.05|A|F|1992-12-10|1992-10-13|1992-12-31|NONE|TRUCK|atop the carefully even excuses wake slyly +47623|1744|87|1|39|64183.86|0.00|0.02|A|F|1994-02-27|1994-01-10|1994-03-09|TAKE BACK RETURN|FOB|f the quick, express instructions. blithel +47648|1507|28|1|12|16902.00|0.02|0.03|R|F|1992-09-30|1992-08-06|1992-10-20|DELIVER IN PERSON|MAIL|foxes! slyly idle accounts are. +47648|1422|1|2|14|18527.88|0.00|0.03|A|F|1992-08-27|1992-08-10|1992-09-15|NONE|TRUCK|he slyly express packages det +47648|1897|98|3|49|88145.61|0.04|0.06|A|F|1992-10-06|1992-09-14|1992-10-28|TAKE BACK RETURN|AIR|re slyly af +47648|1315|30|4|27|32840.37|0.03|0.03|A|F|1992-10-07|1992-08-22|1992-11-03|COLLECT COD|FOB|gly ironic deposits sleep fluffily +47649|111|90|1|27|27299.97|0.05|0.07|A|F|1992-12-01|1993-01-15|1992-12-28|NONE|AIR|ar deposits above the blithely furio +47650|1642|25|1|23|35503.72|0.01|0.07|R|F|1995-03-07|1995-03-12|1995-03-26|COLLECT COD|RAIL|ate slyly. unusual i +47650|1701|86|2|8|12821.60|0.09|0.08|A|F|1995-02-17|1995-04-06|1995-02-27|COLLECT COD|FOB| ironic requests ca +47650|1974|75|3|44|82542.68|0.04|0.05|R|F|1995-03-28|1995-04-27|1995-04-03|TAKE BACK RETURN|TRUCK|efully ironic accounts wake +47650|767|68|4|24|40026.24|0.06|0.00|R|F|1995-05-29|1995-03-23|1995-06-04|NONE|FOB|fily according +47650|1170|7|5|42|44989.14|0.06|0.02|R|F|1995-02-25|1995-04-08|1995-03-16|DELIVER IN PERSON|MAIL|carefully pending deposits +47651|1622|5|1|2|3047.24|0.05|0.04|N|O|1996-08-29|1996-09-18|1996-09-20|NONE|MAIL|ts wake carefully above th +47651|1712|55|2|19|30660.49|0.00|0.08|N|O|1996-11-19|1996-09-11|1996-12-18|DELIVER IN PERSON|FOB|ly above the carefully expres +47651|535|36|3|6|8613.18|0.01|0.06|N|O|1996-08-14|1996-10-23|1996-08-31|TAKE BACK RETURN|FOB|s x-ray fu +47652|865|66|1|25|44146.50|0.05|0.08|R|F|1994-05-19|1994-03-03|1994-06-11|DELIVER IN PERSON|SHIP| cajole blithe +47653|1916|17|1|42|76352.22|0.01|0.03|N|O|1996-09-06|1996-10-03|1996-09-11|DELIVER IN PERSON|FOB|hinder above the blithely ironic e +47653|1706|7|2|34|54661.80|0.09|0.06|N|O|1996-09-03|1996-09-09|1996-09-18|COLLECT COD|RAIL|lets cajole ca +47653|426|56|3|23|30507.66|0.04|0.04|N|O|1996-08-31|1996-09-13|1996-09-27|DELIVER IN PERSON|MAIL|e the blithely si +47653|288|70|4|40|47531.20|0.09|0.07|N|O|1996-09-25|1996-09-01|1996-10-08|NONE|SHIP|instructions. car +47654|1029|35|1|14|13020.28|0.03|0.01|N|O|1995-10-18|1995-09-28|1995-10-27|TAKE BACK RETURN|MAIL|thely regular ideas. sly reques +47655|563|24|1|10|14635.60|0.05|0.04|N|O|1997-10-20|1997-10-17|1997-11-01|DELIVER IN PERSON|MAIL| accounts cajole blithely after the q +47655|433|63|2|44|58670.92|0.01|0.04|N|O|1997-08-26|1997-09-17|1997-09-01|COLLECT COD|TRUCK| packages cajole slyly fluffily fin +47655|1380|95|3|44|56380.72|0.05|0.00|N|O|1997-10-17|1997-11-06|1997-11-13|DELIVER IN PERSON|REG AIR|thely ironic accounts wake bo +47655|1924|69|4|24|43822.08|0.01|0.03|N|O|1997-10-13|1997-10-06|1997-11-12|TAKE BACK RETURN|FOB|into beans slee +47655|448|7|5|12|16181.28|0.08|0.08|N|O|1997-10-14|1997-10-12|1997-10-28|DELIVER IN PERSON|AIR|above the quickly p +47655|312|97|6|50|60615.50|0.05|0.02|N|O|1997-11-13|1997-10-18|1997-11-14|DELIVER IN PERSON|AIR| thinly final requests +47655|1784|69|7|6|10114.68|0.00|0.06|N|O|1997-10-12|1997-10-03|1997-11-01|NONE|MAIL|es throughout the packages c +47680|1992|25|1|20|37879.80|0.05|0.07|N|O|1998-03-05|1998-03-23|1998-03-10|COLLECT COD|REG AIR|final accounts across the quickly final +47681|1394|33|1|1|1295.39|0.07|0.08|N|O|1996-02-03|1996-01-03|1996-02-17|TAKE BACK RETURN|MAIL|es nag alongside of th +47682|164|43|1|12|12769.92|0.01|0.02|R|F|1992-11-19|1992-12-26|1992-12-14|NONE|RAIL|efully ironic theodolites haggle deposi +47682|1685|86|2|25|39667.00|0.05|0.00|R|F|1992-12-12|1993-02-13|1993-01-11|COLLECT COD|AIR|ges affix quickl +47682|25|76|3|24|22200.48|0.10|0.04|R|F|1992-12-18|1992-12-24|1992-12-31|TAKE BACK RETURN|TRUCK|ose requests sleep amon +47682|1784|11|4|41|69116.98|0.02|0.06|A|F|1992-12-15|1993-01-23|1993-01-12|TAKE BACK RETURN|SHIP|even requests over the theodolites s +47682|1877|7|5|10|17788.70|0.07|0.03|A|F|1992-11-21|1993-01-14|1992-12-07|TAKE BACK RETURN|REG AIR|he furiously final accounts. f +47682|61|12|6|40|38442.40|0.07|0.07|R|F|1993-03-15|1993-01-05|1993-04-02|NONE|REG AIR|ake blithel +47683|1449|67|1|26|35111.44|0.08|0.08|R|F|1993-11-24|1993-10-10|1993-12-01|DELIVER IN PERSON|FOB|yly furiously even +47683|1987|76|2|34|64225.32|0.01|0.03|R|F|1993-12-23|1993-10-11|1994-01-06|NONE|SHIP|cial instructions haggl +47683|1809|96|3|6|10264.80|0.08|0.03|R|F|1993-11-10|1993-11-12|1993-12-08|COLLECT COD|FOB|deas among t +47683|1387|26|4|4|5153.52|0.00|0.00|R|F|1993-10-06|1993-10-26|1993-10-15|DELIVER IN PERSON|SHIP|inal platelet +47683|343|28|5|17|21136.78|0.00|0.05|R|F|1993-12-01|1993-11-01|1993-12-28|NONE|RAIL|into beans +47683|90|91|6|18|17821.62|0.06|0.00|A|F|1993-10-01|1993-10-09|1993-10-21|TAKE BACK RETURN|RAIL| even orbits haggle +47684|738|3|1|14|22942.22|0.00|0.07|N|O|1997-07-24|1997-08-12|1997-08-09|TAKE BACK RETURN|SHIP|ing to the slyly even requ +47684|381|82|2|34|43566.92|0.07|0.06|N|O|1997-07-21|1997-07-18|1997-07-27|TAKE BACK RETURN|RAIL|nal courts. slyly even packages affix +47684|1443|83|3|42|56466.48|0.10|0.05|N|O|1997-06-16|1997-07-10|1997-06-17|COLLECT COD|REG AIR|tes after the fluffily specia +47684|782|47|4|8|13462.24|0.03|0.03|N|O|1997-10-01|1997-07-28|1997-10-09|DELIVER IN PERSON|TRUCK|nal ideas dazzle carefully. ca +47684|997|98|5|39|74021.61|0.05|0.02|N|O|1997-07-12|1997-08-03|1997-07-23|TAKE BACK RETURN|RAIL|ep blithely quickly ironic deposits +47684|1531|32|6|25|35813.25|0.02|0.00|N|O|1997-07-27|1997-08-31|1997-08-01|DELIVER IN PERSON|SHIP|ly unusual d +47684|73|74|7|42|40868.94|0.02|0.01|N|O|1997-07-01|1997-08-21|1997-07-11|TAKE BACK RETURN|AIR|thely final foxes. car +47685|554|15|1|36|52363.80|0.06|0.05|N|O|1995-08-20|1995-08-06|1995-08-22|DELIVER IN PERSON|SHIP|ng escapades ha +47685|511|12|2|27|38110.77|0.01|0.05|N|O|1995-06-28|1995-09-05|1995-07-04|COLLECT COD|TRUCK|nos above t +47685|762|63|3|8|13302.08|0.07|0.08|N|O|1995-08-12|1995-08-18|1995-09-03|NONE|REG AIR|y bold accounts. blithely spe +47685|938|41|4|26|47812.18|0.03|0.04|N|O|1995-08-31|1995-08-28|1995-09-29|TAKE BACK RETURN|SHIP|t carefully about the eve +47685|1720|47|5|18|29190.96|0.05|0.00|N|O|1995-09-08|1995-07-20|1995-09-15|TAKE BACK RETURN|FOB|ts detect pending, regular attainmen +47685|1663|5|6|1|1564.66|0.03|0.01|N|O|1995-07-19|1995-08-02|1995-07-30|TAKE BACK RETURN|MAIL| fluffily pending escapades +47686|1453|71|1|9|12190.05|0.08|0.02|R|F|1993-01-03|1992-12-10|1993-01-22|COLLECT COD|MAIL|eep furiously across the bold Tiresias. fu +47686|455|85|2|32|43374.40|0.07|0.01|R|F|1993-01-13|1992-12-24|1993-01-27|COLLECT COD|AIR|he deposits. furiously even pa +47686|1743|28|3|38|62500.12|0.10|0.06|R|F|1992-10-24|1992-11-25|1992-11-18|COLLECT COD|MAIL|ar accounts +47686|422|81|4|14|18513.88|0.09|0.02|A|F|1993-01-26|1993-01-07|1993-02-12|DELIVER IN PERSON|SHIP|olites! reg +47686|1959|60|5|23|42801.85|0.02|0.07|R|F|1992-12-30|1992-12-06|1993-01-21|COLLECT COD|AIR|es are slyly. +47686|438|39|6|20|26768.60|0.09|0.01|R|F|1992-10-20|1992-11-23|1992-11-02|COLLECT COD|MAIL| through the fur +47686|503|64|7|5|7017.50|0.05|0.04|R|F|1992-12-21|1992-12-21|1992-12-28|DELIVER IN PERSON|SHIP|e of the Tiresias. blithely even p +47687|1729|56|1|49|79905.28|0.04|0.07|A|F|1992-04-01|1992-03-19|1992-05-01|COLLECT COD|AIR|sts. accou +47687|1371|86|2|37|47077.69|0.10|0.06|R|F|1992-05-24|1992-03-29|1992-06-22|TAKE BACK RETURN|AIR|iously ironic excuses. even theodolit +47712|1522|23|1|45|64058.40|0.08|0.02|A|F|1993-08-26|1993-10-06|1993-09-20|DELIVER IN PERSON|TRUCK|egrate quickly across the ruthless +47712|957|60|2|47|87323.65|0.09|0.06|R|F|1993-10-03|1993-09-12|1993-10-15|COLLECT COD|AIR|lently carefully +47712|224|79|3|2|2248.44|0.03|0.07|A|F|1993-08-08|1993-08-18|1993-08-23|TAKE BACK RETURN|SHIP| final, close ideas cajole slyly pendi +47712|1192|65|4|13|14211.47|0.00|0.01|A|F|1993-09-28|1993-10-03|1993-10-23|DELIVER IN PERSON|RAIL|pinto beans caj +47712|359|60|5|9|11334.15|0.00|0.02|R|F|1993-10-15|1993-08-29|1993-10-30|DELIVER IN PERSON|SHIP|en instructions. furiously ironic +47712|997|66|6|20|37959.80|0.08|0.02|R|F|1993-08-18|1993-08-25|1993-09-05|DELIVER IN PERSON|SHIP|ress! silent pinto beans haggle. pen +47712|22|98|7|8|7376.16|0.02|0.03|A|F|1993-08-01|1993-09-22|1993-08-30|DELIVER IN PERSON|REG AIR|ticing packages. slyly regular packages sl +47713|1068|4|1|49|47483.94|0.07|0.05|R|F|1994-09-18|1994-08-31|1994-09-28|DELIVER IN PERSON|AIR| express foxes wake carefully quickly +47713|1501|22|2|29|40672.50|0.04|0.01|R|F|1994-08-31|1994-08-04|1994-09-27|DELIVER IN PERSON|TRUCK|ckly final pinto beans. quickly final e +47713|235|36|3|47|53355.81|0.07|0.00|A|F|1994-08-19|1994-08-07|1994-09-07|DELIVER IN PERSON|RAIL|tes. slyly regular deposits haggle regul +47713|151|52|4|5|5255.75|0.00|0.01|R|F|1994-07-07|1994-08-10|1994-07-31|DELIVER IN PERSON|REG AIR|ly final dependenc +47713|947|48|5|11|20327.34|0.06|0.05|R|F|1994-09-27|1994-08-03|1994-10-02|COLLECT COD|RAIL|lithely-- final, reg +47713|1557|78|6|39|56883.45|0.01|0.05|A|F|1994-10-31|1994-08-21|1994-11-28|NONE|FOB| special ac +47713|221|49|7|31|34757.82|0.03|0.04|R|F|1994-10-13|1994-09-17|1994-11-09|TAKE BACK RETURN|MAIL|ore the carefully even th +47714|1119|56|1|19|19382.09|0.01|0.02|R|F|1995-03-20|1995-05-13|1995-04-11|NONE|TRUCK| silent, i +47714|950|85|2|11|20360.45|0.05|0.05|R|F|1995-03-24|1995-06-08|1995-04-20|COLLECT COD|REG AIR| asymptotes. regular, even package +47714|1784|69|3|45|75860.10|0.07|0.06|N|F|1995-06-17|1995-05-24|1995-07-11|NONE|FOB|s boost above the express, reg +47714|858|58|4|31|54524.35|0.04|0.08|A|F|1995-04-03|1995-04-29|1995-04-04|NONE|SHIP|romise fluffily around the carefully un +47714|1074|75|5|48|46803.36|0.01|0.01|N|F|1995-06-16|1995-05-30|1995-06-25|NONE|RAIL|tect blithely quickly special depo +47714|673|5|6|20|31473.40|0.09|0.05|N|O|1995-06-24|1995-05-24|1995-07-20|NONE|MAIL|y players. furiously ironic +47714|1187|88|7|29|31557.22|0.03|0.03|A|F|1995-04-08|1995-06-02|1995-04-21|TAKE BACK RETURN|AIR|eans believe +47715|1319|58|1|37|45151.47|0.02|0.05|N|O|1998-06-06|1998-06-03|1998-06-19|NONE|RAIL|fter the quietly pending +47715|1857|87|2|50|87942.50|0.06|0.04|N|O|1998-04-26|1998-05-06|1998-04-28|NONE|TRUCK|rding to the quickly final de +47716|1944|45|1|18|33226.92|0.08|0.01|N|O|1997-10-05|1997-11-20|1997-10-29|TAKE BACK RETURN|REG AIR| unwind among the +47716|1768|69|2|22|36734.72|0.06|0.02|N|O|1997-10-29|1997-11-15|1997-11-10|NONE|AIR|ironic accounts: pending account +47716|84|85|3|20|19681.60|0.08|0.08|N|O|1997-10-16|1997-12-10|1997-10-19|TAKE BACK RETURN|REG AIR|accounts are blithely even accounts. fret +47717|377|6|1|25|31934.25|0.00|0.03|N|O|1995-12-21|1996-03-08|1996-01-17|COLLECT COD|RAIL|the quickly pending packages affi +47717|292|74|2|35|41730.15|0.09|0.04|N|O|1996-01-12|1996-02-29|1996-01-21|NONE|TRUCK|l pinto beans. +47717|392|77|3|29|37479.31|0.05|0.08|N|O|1996-02-20|1996-01-29|1996-03-14|NONE|AIR|ost. unusual, regular deposits nag. fur +47717|1134|7|4|34|35194.42|0.06|0.04|N|O|1996-01-21|1996-03-01|1996-01-22|COLLECT COD|TRUCK| integrate slyly acco +47717|353|10|5|4|5013.40|0.08|0.06|N|O|1996-04-08|1996-03-15|1996-04-16|NONE|RAIL|usly final requests use slyly blithely dogg +47717|57|33|6|23|22012.15|0.10|0.08|N|O|1996-01-09|1996-02-19|1996-02-03|COLLECT COD|SHIP|careful reque +47717|727|28|7|6|9766.32|0.09|0.06|N|O|1996-02-12|1996-03-05|1996-03-02|TAKE BACK RETURN|AIR|! deposits cajole carefully even deposits. +47718|332|33|1|48|59151.84|0.01|0.02|N|O|1996-05-23|1996-06-12|1996-06-02|DELIVER IN PERSON|MAIL| the quickly silent atta +47718|620|14|2|49|74510.38|0.00|0.03|N|O|1996-05-10|1996-05-17|1996-06-02|TAKE BACK RETURN|TRUCK|e furiously silent deposi +47718|206|34|3|33|36504.60|0.04|0.01|N|O|1996-06-03|1996-04-22|1996-06-27|COLLECT COD|MAIL|ecial foxes. even, ironic excuses pr +47718|668|31|4|3|4705.98|0.04|0.08|N|O|1996-04-15|1996-06-16|1996-04-16|DELIVER IN PERSON|AIR|carefully after the s +47718|1935|36|5|32|58781.76|0.00|0.00|N|O|1996-06-30|1996-05-29|1996-07-18|DELIVER IN PERSON|SHIP|nstructions +47719|894|94|1|34|61026.26|0.10|0.02|N|O|1996-01-18|1996-02-16|1996-02-01|TAKE BACK RETURN|FOB| according to the final deposits +47744|1676|59|1|45|70995.15|0.00|0.07|N|O|1997-10-24|1997-08-18|1997-11-10|COLLECT COD|AIR|g the carefully special pinto beans. blith +47744|1766|9|2|37|61707.12|0.06|0.00|N|O|1997-08-05|1997-08-11|1997-09-03|NONE|RAIL|ng theodolites. furiously regul +47744|1149|58|3|22|23103.08|0.09|0.03|N|O|1997-10-07|1997-09-19|1997-11-05|TAKE BACK RETURN|MAIL| ironic packages haggle +47744|935|36|4|17|31210.81|0.04|0.07|N|O|1997-11-02|1997-08-24|1997-11-23|NONE|RAIL|ckly regular, +47744|558|49|5|50|72927.50|0.00|0.03|N|O|1997-08-12|1997-08-05|1997-08-23|COLLECT COD|REG AIR|to the even foxes. furiously even deposit +47745|807|8|1|30|51234.00|0.00|0.01|N|O|1998-06-27|1998-07-01|1998-07-26|NONE|AIR|ckly after the bl +47746|12|88|1|8|7296.08|0.05|0.04|N|O|1997-08-23|1997-08-03|1997-09-22|COLLECT COD|RAIL|final requests a +47746|140|19|2|35|36404.90|0.05|0.04|N|O|1997-05-28|1997-08-11|1997-06-03|COLLECT COD|RAIL|e bold multipliers are quickly ideas. fin +47747|591|52|1|3|4474.77|0.00|0.08|N|O|1995-11-25|1996-01-11|1995-12-12|COLLECT COD|AIR|fully. furiously ironic excus +47747|306|91|2|12|14475.60|0.01|0.07|N|O|1996-03-07|1996-01-24|1996-03-12|DELIVER IN PERSON|MAIL|ly according to the depo +47747|1636|19|3|12|18451.56|0.07|0.06|N|O|1996-02-09|1996-01-01|1996-03-06|COLLECT COD|RAIL|ns cajole slyly along the express excuses. +47748|462|21|1|30|40873.80|0.03|0.03|N|O|1996-05-13|1996-06-04|1996-05-26|TAKE BACK RETURN|FOB|e dependenc +47748|1279|17|2|45|53112.15|0.02|0.03|N|O|1996-05-11|1996-05-05|1996-05-18|NONE|TRUCK|ously even deposits. +47748|759|56|3|8|13278.00|0.04|0.06|N|O|1996-03-18|1996-05-13|1996-03-23|NONE|MAIL|olites wake slyly ironic +47748|591|92|4|21|31323.39|0.02|0.02|N|O|1996-04-18|1996-05-17|1996-04-27|COLLECT COD|TRUCK|. quickly ironic accounts boost +47748|1236|74|5|23|26156.29|0.07|0.08|N|O|1996-05-07|1996-05-04|1996-05-12|TAKE BACK RETURN|SHIP|y regular accounts a +47748|1289|90|6|11|13093.08|0.04|0.06|N|O|1996-03-29|1996-04-30|1996-04-26|DELIVER IN PERSON|SHIP| the careful +47748|1638|62|7|21|32332.23|0.04|0.04|N|O|1996-03-23|1996-06-05|1996-04-20|DELIVER IN PERSON|SHIP|odolites dazzle +47749|1848|49|1|1|1749.84|0.02|0.05|A|F|1993-04-18|1993-05-29|1993-05-04|NONE|AIR|quests detect bl +47750|1043|49|1|49|46257.96|0.08|0.05|R|F|1993-10-01|1993-09-06|1993-10-05|DELIVER IN PERSON|RAIL|riously ironi +47750|1442|60|2|9|12090.96|0.05|0.08|A|F|1993-07-03|1993-07-21|1993-07-09|DELIVER IN PERSON|REG AIR|ecial accounts. carefully final +47750|979|80|3|27|50759.19|0.10|0.05|A|F|1993-07-02|1993-08-28|1993-07-30|TAKE BACK RETURN|REG AIR|y bold packages. slyly unusual s +47750|792|25|4|43|72789.97|0.00|0.08|A|F|1993-08-02|1993-09-10|1993-08-16|NONE|REG AIR|blithely ironic dependen +47750|870|37|5|27|47813.49|0.09|0.03|R|F|1993-09-03|1993-09-14|1993-09-21|NONE|REG AIR|haggle unusual requests. blit +47750|1660|84|6|8|12493.28|0.08|0.04|A|F|1993-07-08|1993-07-18|1993-07-28|COLLECT COD|TRUCK|ains. blithely final +47750|385|86|7|36|46273.68|0.00|0.08|A|F|1993-07-13|1993-07-21|1993-08-12|COLLECT COD|RAIL| hang furiously. theodolites e +47751|1635|36|1|2|3073.26|0.08|0.00|N|O|1996-11-03|1996-11-28|1996-11-06|DELIVER IN PERSON|RAIL|the furiously final r +47751|833|33|2|2|3467.66|0.00|0.01|N|O|1996-10-15|1996-10-24|1996-11-01|COLLECT COD|TRUCK|. final, special requests kindle c +47751|1901|34|3|35|63101.50|0.05|0.01|N|O|1996-12-14|1996-11-20|1997-01-04|COLLECT COD|MAIL|gular theodolite +47751|1127|28|4|31|31871.72|0.08|0.04|N|O|1996-10-30|1996-12-11|1996-11-23|NONE|FOB|ackages sleep slyly special +47751|277|32|5|9|10595.43|0.10|0.03|N|O|1996-11-16|1996-10-27|1996-11-20|NONE|TRUCK|ctions haggle quickly? blithely speci +47751|1200|1|6|28|30833.60|0.02|0.03|N|O|1996-09-16|1996-11-17|1996-09-26|TAKE BACK RETURN|AIR|itaphs cajole fur +47751|1645|46|7|24|37119.36|0.10|0.08|N|O|1996-11-25|1996-11-28|1996-12-07|TAKE BACK RETURN|SHIP|e slyly idle a +47776|626|58|1|27|41218.74|0.08|0.03|N|O|1996-09-13|1996-08-28|1996-10-09|TAKE BACK RETURN|FOB|eep blithely +47776|1841|71|2|11|19171.24|0.00|0.01|N|O|1996-10-18|1996-09-01|1996-11-04|COLLECT COD|FOB|uses-- carefully ironic deposit +47776|315|44|3|2|2430.62|0.00|0.01|N|O|1996-08-17|1996-09-10|1996-08-20|DELIVER IN PERSON|TRUCK|t quickly quickly final requests. e +47776|1329|30|4|9|11072.88|0.09|0.04|N|O|1996-08-09|1996-09-06|1996-09-06|TAKE BACK RETURN|MAIL|ular deposits nag. pending, pending excu +47776|1782|25|5|13|21889.14|0.10|0.00|N|O|1996-10-18|1996-09-01|1996-10-27|COLLECT COD|TRUCK|ely regular p +47776|1035|6|6|50|46801.50|0.03|0.04|N|O|1996-10-13|1996-09-06|1996-11-07|NONE|RAIL| ironic packages. caref +47776|500|30|7|6|8403.00|0.09|0.08|N|O|1996-09-09|1996-08-12|1996-09-16|NONE|RAIL|t blithely along the theodoli +47777|1263|38|1|15|17463.90|0.03|0.07|R|F|1992-12-27|1993-02-12|1993-01-13|TAKE BACK RETURN|RAIL|press requests: regular platelets are. re +47777|886|53|2|22|39311.36|0.02|0.06|R|F|1993-01-29|1993-01-01|1993-02-28|TAKE BACK RETURN|AIR| frets against the quickly ironic +47778|1730|31|1|9|14685.57|0.08|0.05|R|F|1993-06-05|1993-05-09|1993-06-22|COLLECT COD|RAIL|mas lose final orbits. even packages after +47779|1905|50|1|9|16262.10|0.03|0.08|R|F|1992-09-17|1992-10-07|1992-10-04|DELIVER IN PERSON|TRUCK|luffily special theodolites nag blithely +47779|1728|55|2|3|4889.16|0.09|0.07|A|F|1992-09-24|1992-10-24|1992-10-19|DELIVER IN PERSON|REG AIR|hely special platelets. +47779|505|6|3|33|46381.50|0.00|0.06|A|F|1992-11-11|1992-10-19|1992-11-23|DELIVER IN PERSON|TRUCK|ly regular accounts. dependencies about +47779|271|72|4|50|58563.50|0.01|0.08|R|F|1992-11-30|1992-11-15|1992-12-24|COLLECT COD|AIR|eodolites cajole blithely after the +47780|179|32|1|48|51800.16|0.06|0.00|A|F|1993-05-03|1993-05-03|1993-05-29|NONE|MAIL|he slyly regular somas. req +47780|1124|61|2|34|34854.08|0.09|0.00|R|F|1993-05-31|1993-05-08|1993-06-02|NONE|SHIP|ar foxes-- carefully final pearls boost b +47780|1581|62|3|17|25203.86|0.05|0.03|A|F|1993-06-13|1993-06-20|1993-06-30|NONE|REG AIR|uietly regular instructions cajole +47781|709|42|1|22|35413.40|0.10|0.04|R|F|1995-05-01|1995-04-01|1995-05-11|TAKE BACK RETURN|REG AIR| the even requests. instructions kindle +47781|567|58|2|36|52832.16|0.09|0.00|R|F|1995-04-05|1995-04-08|1995-04-13|DELIVER IN PERSON|MAIL|longside of the +47781|1026|62|3|32|29664.64|0.01|0.08|A|F|1995-03-05|1995-04-07|1995-03-27|DELIVER IN PERSON|FOB|uffily blithely final acc +47782|737|70|1|29|47494.17|0.07|0.08|A|F|1992-09-02|1992-09-19|1992-09-19|COLLECT COD|MAIL| regular requests. blithel +47783|907|42|1|12|21694.80|0.03|0.06|R|F|1993-06-04|1993-06-14|1993-06-12|DELIVER IN PERSON|RAIL|. unusual, final ideas affix after th +47783|1908|41|2|30|54297.00|0.10|0.01|R|F|1993-05-28|1993-07-11|1993-06-03|NONE|REG AIR|final asymptotes. +47783|648|49|3|9|13937.76|0.01|0.02|A|F|1993-07-07|1993-07-20|1993-08-02|COLLECT COD|FOB|ickly special id +47783|1663|64|4|41|64151.06|0.01|0.04|A|F|1993-05-13|1993-07-16|1993-06-05|NONE|REG AIR|egular deposits. slyly ironic requests at +47808|1824|68|1|29|50048.78|0.00|0.03|N|O|1995-08-28|1995-07-28|1995-09-19|NONE|FOB|he final pinto beans. furiously +47808|1861|5|2|20|35257.20|0.07|0.00|N|O|1995-07-30|1995-09-15|1995-08-05|COLLECT COD|RAIL|ual accounts. carefully ironic +47808|745|78|3|22|36206.28|0.09|0.03|N|O|1995-07-16|1995-07-31|1995-08-07|NONE|MAIL| slyly final excu +47809|1509|90|1|41|57830.50|0.09|0.01|N|O|1995-09-17|1995-09-18|1995-10-12|TAKE BACK RETURN|REG AIR|nts wake slyly. slyly bold packages are car +47809|1775|2|2|22|36888.94|0.05|0.03|N|O|1995-09-25|1995-08-26|1995-10-12|NONE|FOB|nstructions sleep +47809|657|89|3|13|20249.45|0.01|0.08|N|O|1995-08-20|1995-08-06|1995-08-27|TAKE BACK RETURN|SHIP|r courts cajole carefully. carefully bol +47809|424|12|4|6|7946.52|0.10|0.04|N|O|1995-07-06|1995-09-04|1995-07-23|COLLECT COD|REG AIR|lar deposits. carefully +47809|738|71|5|44|72104.12|0.00|0.05|N|O|1995-07-29|1995-07-27|1995-08-07|COLLECT COD|FOB| regular foxes nag. blithely ironic fo +47809|1969|14|6|6|11225.76|0.05|0.00|N|O|1995-10-06|1995-07-30|1995-10-09|NONE|SHIP|le unusual accounts. deposits d +47809|695|96|7|8|12765.52|0.03|0.00|N|O|1995-10-22|1995-08-02|1995-11-12|COLLECT COD|TRUCK|ns. carefully bold packa +47810|456|57|1|11|14920.95|0.10|0.02|N|O|1995-12-05|1995-10-19|1995-12-29|DELIVER IN PERSON|AIR|e regular asymptot +47810|1984|73|2|33|62237.34|0.06|0.04|N|O|1995-11-27|1995-10-05|1995-12-15|NONE|AIR| are. unusual, entic +47810|1202|3|3|31|34199.20|0.10|0.00|N|O|1995-11-08|1995-10-25|1995-11-20|NONE|FOB|dolites nag. slyly final ideas can brea +47810|1266|67|4|38|44355.88|0.05|0.05|N|O|1995-09-16|1995-10-29|1995-09-30|COLLECT COD|MAIL|d pinto beans wake across the always slow +47811|43|94|1|33|31120.32|0.04|0.08|N|O|1996-05-16|1996-04-08|1996-06-10|TAKE BACK RETURN|AIR| pinto beans nag final dinos. furiousl +47811|460|61|2|34|46255.64|0.00|0.03|N|O|1996-06-21|1996-04-18|1996-07-21|TAKE BACK RETURN|AIR|e carefully ironic packages. bold theodoli +47811|923|58|3|42|76604.64|0.06|0.04|N|O|1996-05-30|1996-03-31|1996-06-18|TAKE BACK RETURN|AIR|silent, pending instructions about t +47811|893|94|4|3|5381.67|0.04|0.05|N|O|1996-05-29|1996-04-27|1996-06-09|TAKE BACK RETURN|REG AIR|ounts poach blithely above the +47811|1050|21|5|47|44699.35|0.07|0.02|N|O|1996-02-27|1996-05-11|1996-03-26|NONE|REG AIR|could have to x-ray. ca +47812|1334|35|1|27|33353.91|0.01|0.01|N|O|1995-10-01|1995-10-11|1995-10-22|COLLECT COD|TRUCK|excuses. slyly blithe requests integrate +47813|984|87|1|30|56549.40|0.05|0.07|A|F|1994-12-22|1994-11-07|1994-12-27|COLLECT COD|TRUCK|deposits. even depths solve u +47813|182|35|2|30|32465.40|0.10|0.06|R|F|1994-10-14|1994-11-21|1994-10-26|NONE|TRUCK|en requests +47813|874|41|3|28|49696.36|0.09|0.08|A|F|1994-10-11|1994-10-10|1994-10-18|TAKE BACK RETURN|REG AIR|slyly carefully pending +47813|391|92|4|19|24536.41|0.03|0.08|R|F|1994-09-06|1994-09-27|1994-09-23|TAKE BACK RETURN|TRUCK|egular ideas are furiousl +47813|575|76|5|49|72302.93|0.08|0.04|R|F|1994-11-14|1994-10-09|1994-11-25|DELIVER IN PERSON|AIR|s nag above +47813|1630|72|6|4|6126.52|0.07|0.03|R|F|1994-10-16|1994-10-09|1994-11-05|DELIVER IN PERSON|SHIP|ar deposits. dolphins cajo +47814|215|97|1|20|22304.20|0.03|0.01|N|O|1997-04-17|1997-05-17|1997-04-27|NONE|MAIL|thely. fluffily ironic theodolites wake +47814|42|68|2|18|16956.72|0.09|0.01|N|O|1997-07-01|1997-05-26|1997-07-10|COLLECT COD|TRUCK| foxes nag. furiously ironic instructions u +47814|1871|1|3|41|72687.67|0.01|0.00|N|O|1997-07-26|1997-05-13|1997-08-25|NONE|RAIL|lar deposits across the fu +47814|1526|67|4|12|17130.24|0.01|0.05|N|O|1997-07-30|1997-06-11|1997-08-09|TAKE BACK RETURN|RAIL|tes lose furiously afte +47814|1675|99|5|13|20496.71|0.08|0.00|N|O|1997-05-31|1997-05-14|1997-06-17|COLLECT COD|FOB| the carefully ironic packages. si +47814|965|34|6|8|14927.68|0.00|0.04|N|O|1997-05-23|1997-05-14|1997-06-11|COLLECT COD|AIR|. requests haggle regular, special deposit +47814|754|87|7|30|49642.50|0.01|0.05|N|O|1997-07-24|1997-05-12|1997-08-15|NONE|AIR|press pinto bean +47815|477|36|1|23|31681.81|0.06|0.02|R|F|1993-01-24|1993-03-03|1993-02-08|TAKE BACK RETURN|AIR|. carefully final dolp +47815|1191|64|2|4|4368.76|0.10|0.01|R|F|1993-04-23|1993-02-16|1993-05-14|NONE|REG AIR|egular reques +47815|1857|44|3|30|52765.50|0.06|0.03|R|F|1993-04-01|1993-03-31|1993-04-28|COLLECT COD|REG AIR|s. slyly ironic +47815|255|37|4|2|2310.50|0.10|0.08|A|F|1993-01-29|1993-03-09|1993-02-15|DELIVER IN PERSON|REG AIR|he finally +47815|644|45|5|31|47883.84|0.04|0.00|A|F|1993-01-21|1993-03-29|1993-02-01|TAKE BACK RETURN|FOB|g, ironic somas sleep slyly silent, unusua +47815|678|41|6|7|11050.69|0.08|0.08|A|F|1993-04-13|1993-03-28|1993-04-23|COLLECT COD|SHIP| unusual accou +47815|454|55|7|2|2708.90|0.04|0.08|A|F|1993-01-06|1993-02-04|1993-02-01|TAKE BACK RETURN|SHIP| packages cajole caref +47840|601|2|1|37|55559.20|0.03|0.07|R|F|1994-05-14|1994-05-19|1994-05-23|NONE|MAIL| blithely fluffily fin +47840|108|87|2|30|30243.00|0.01|0.04|A|F|1994-04-30|1994-04-12|1994-05-29|TAKE BACK RETURN|FOB|y unusual accounts wake furiously accordi +47840|1903|4|3|8|14439.20|0.10|0.00|R|F|1994-06-27|1994-05-20|1994-07-23|TAKE BACK RETURN|FOB|ular, even dependencies. blithely bold ide +47840|292|47|4|23|27422.67|0.09|0.07|R|F|1994-03-24|1994-04-15|1994-04-09|COLLECT COD|RAIL|uffily even deposits are ac +47840|903|4|5|31|55920.90|0.09|0.05|R|F|1994-04-20|1994-04-20|1994-05-15|NONE|AIR|ial, enticing theodolites. deposits +47840|1153|62|6|32|33732.80|0.05|0.02|R|F|1994-03-10|1994-04-23|1994-04-07|DELIVER IN PERSON|SHIP|ll cajole carefully. regular, fina +47840|336|37|7|6|7417.98|0.06|0.04|R|F|1994-04-05|1994-04-17|1994-04-08|COLLECT COD|AIR|ix slyly sly +47841|1042|48|1|17|16031.68|0.04|0.08|N|O|1996-05-10|1996-03-31|1996-05-27|COLLECT COD|TRUCK|instructions. permanently express +47841|1217|55|2|4|4472.84|0.02|0.06|N|O|1996-03-12|1996-04-28|1996-03-29|TAKE BACK RETURN|FOB| final deposits sleep carefully +47841|682|14|3|47|74385.96|0.00|0.05|N|O|1996-06-05|1996-03-20|1996-06-30|DELIVER IN PERSON|AIR|e deposits lose blithely bold packages. pac +47841|518|19|4|50|70925.50|0.02|0.05|N|O|1996-03-10|1996-04-23|1996-04-09|TAKE BACK RETURN|AIR|unwind furiously. dependen +47841|2000|45|5|37|33374.00|0.01|0.06|N|O|1996-02-22|1996-04-02|1996-03-21|NONE|FOB|. slyly bold foxes after the unusual s +47841|1616|58|6|6|9105.66|0.08|0.02|N|O|1996-03-14|1996-05-08|1996-04-01|DELIVER IN PERSON|SHIP| Tiresias use. de +47842|1199|100|1|33|36306.27|0.00|0.00|R|F|1993-06-15|1993-07-11|1993-06-29|COLLECT COD|REG AIR|furiously even courts. blithely final pac +47842|1991|36|2|1|1892.99|0.05|0.04|R|F|1993-07-28|1993-07-20|1993-08-17|DELIVER IN PERSON|MAIL|olphins. slyly ironic deposits wake bli +47842|456|15|3|37|50188.65|0.10|0.03|A|F|1993-08-19|1993-07-17|1993-09-17|COLLECT COD|SHIP|ual attainments cajole +47842|1964|9|4|22|41051.12|0.04|0.00|A|F|1993-06-28|1993-07-21|1993-07-10|NONE|AIR|lithely slyly regular pinto beans +47842|348|33|5|22|27463.48|0.09|0.03|A|F|1993-06-07|1993-06-25|1993-06-22|TAKE BACK RETURN|FOB|ly ironic ideas. reg +47842|594|95|6|43|64267.37|0.07|0.03|R|F|1993-08-28|1993-07-29|1993-09-15|NONE|TRUCK| lose. regular Tiresias wake furious +47843|1192|93|1|2|2186.38|0.02|0.01|R|F|1992-06-09|1992-06-03|1992-06-29|NONE|REG AIR|nts shall +47843|357|58|2|31|38977.85|0.02|0.01|A|F|1992-05-02|1992-04-23|1992-05-27|DELIVER IN PERSON|AIR|e silently regular forges snooze quickl +47843|679|42|3|13|20535.71|0.05|0.07|R|F|1992-05-31|1992-05-26|1992-06-03|NONE|SHIP|fily express pinto bea +47843|1243|55|4|12|13730.88|0.05|0.07|A|F|1992-06-06|1992-05-26|1992-07-04|NONE|MAIL|y requests cajole. carefully +47843|190|69|5|19|20713.61|0.04|0.03|R|F|1992-03-26|1992-06-12|1992-04-24|COLLECT COD|TRUCK|e the blithely bold +47843|188|89|6|48|52232.64|0.07|0.02|A|F|1992-05-28|1992-05-19|1992-06-11|COLLECT COD|FOB|egrate. unusua +47844|990|59|1|26|49165.74|0.00|0.01|R|F|1994-01-01|1994-01-15|1994-01-10|DELIVER IN PERSON|AIR|e quickly s +47844|1119|92|2|20|20402.20|0.07|0.00|R|F|1993-12-16|1994-02-04|1993-12-22|TAKE BACK RETURN|RAIL|. sometimes thin requests wake regular, +47844|1205|17|3|13|14380.60|0.04|0.05|R|F|1994-01-21|1994-02-13|1994-02-14|TAKE BACK RETURN|TRUCK|onic theodolites +47844|1310|11|4|1|1211.31|0.01|0.04|A|F|1994-01-02|1994-03-10|1994-01-30|NONE|FOB|mptotes sleep against the blithe +47844|1654|96|5|38|59114.70|0.07|0.08|R|F|1993-12-20|1994-01-13|1993-12-25|DELIVER IN PERSON|MAIL|ideas. even dolphins about t +47844|94|95|6|33|32804.97|0.02|0.06|R|F|1993-12-22|1994-03-09|1994-01-06|NONE|AIR|gage above the s +47845|245|27|1|42|48100.08|0.03|0.02|N|O|1997-01-21|1997-03-18|1997-02-06|DELIVER IN PERSON|FOB|olites. ironic, regular t +47845|1564|85|2|33|48363.48|0.00|0.00|N|O|1997-01-25|1997-02-06|1997-02-13|DELIVER IN PERSON|AIR|slyly unusu +47846|1830|17|1|40|69273.20|0.02|0.05|A|F|1992-10-13|1992-11-10|1992-10-30|COLLECT COD|SHIP|accounts ha +47846|113|40|2|13|13170.43|0.07|0.06|R|F|1992-10-05|1992-11-06|1992-10-16|DELIVER IN PERSON|MAIL|ously final +47846|521|82|3|2|2843.04|0.00|0.05|A|F|1992-12-05|1992-09-30|1992-12-08|DELIVER IN PERSON|RAIL|ourts. carefully express deposits wake sly +47846|598|89|4|36|53949.24|0.01|0.04|A|F|1992-10-29|1992-10-29|1992-11-20|DELIVER IN PERSON|MAIL|after the packages. slyly bold foxes ove +47846|301|2|5|41|49253.30|0.06|0.01|A|F|1992-12-05|1992-10-08|1992-12-28|COLLECT COD|FOB|above the blithely e +47846|1905|94|6|40|72276.00|0.05|0.04|R|F|1992-09-08|1992-09-12|1992-09-25|COLLECT COD|MAIL|tegrate. fluffily +47847|1348|49|1|2|2498.68|0.05|0.01|N|O|1996-02-22|1996-04-06|1996-03-08|TAKE BACK RETURN|REG AIR|osits cajole according to the e +47847|838|39|2|16|27821.28|0.07|0.08|N|O|1996-02-05|1996-04-04|1996-02-26|DELIVER IN PERSON|MAIL|express foxes boost slyly? fluffily ironic +47847|1791|34|3|13|22006.27|0.00|0.01|N|O|1996-02-18|1996-03-15|1996-02-22|COLLECT COD|TRUCK|carefully final asymptotes across the reg +47847|881|15|4|43|76620.84|0.02|0.00|N|O|1996-03-14|1996-04-04|1996-03-16|TAKE BACK RETURN|TRUCK|e slyly pending +47872|1436|54|1|46|61521.78|0.06|0.08|R|F|1994-09-24|1994-08-08|1994-09-26|NONE|AIR|its. furiously regular asymptotes after the +47872|982|17|2|27|50840.46|0.07|0.08|A|F|1994-08-04|1994-09-03|1994-08-09|NONE|RAIL|asymptotes. ironic +47872|970|71|3|30|56129.10|0.04|0.03|A|F|1994-09-07|1994-07-16|1994-09-25|TAKE BACK RETURN|AIR|iously above the quickly ironic deposits. +47872|534|65|4|15|21517.95|0.01|0.05|R|F|1994-07-03|1994-08-11|1994-07-20|DELIVER IN PERSON|AIR|pecial, spe +47872|717|82|5|7|11323.97|0.05|0.07|R|F|1994-07-06|1994-07-18|1994-07-29|COLLECT COD|MAIL|ructions. asymptotes instead of th +47873|903|6|1|1|1803.90|0.07|0.07|R|F|1993-12-06|1994-01-11|1993-12-24|DELIVER IN PERSON|TRUCK|n ideas sleep across +47873|480|68|2|37|51077.76|0.01|0.05|A|F|1994-01-31|1994-01-23|1994-02-25|DELIVER IN PERSON|TRUCK|riously final p +47873|973|76|3|45|84328.65|0.09|0.01|R|F|1993-12-22|1994-01-05|1994-01-11|NONE|SHIP|eep quickly according to the ruthless ide +47874|970|73|1|6|11225.82|0.03|0.05|N|O|1998-04-29|1998-05-30|1998-05-26|COLLECT COD|TRUCK|ing to the quickly ironic packages. f +47874|1795|22|2|25|42419.75|0.00|0.01|N|O|1998-06-15|1998-06-14|1998-07-13|DELIVER IN PERSON|AIR|ependencies. regular packages +47875|1552|73|1|38|55234.90|0.03|0.00|R|F|1992-09-10|1992-09-06|1992-10-07|NONE|TRUCK|ly silent epitaphs +47875|1703|30|2|17|27279.90|0.09|0.03|A|F|1992-11-30|1992-11-03|1992-12-07|NONE|TRUCK|le slyly across the theodol +47875|1476|16|3|29|39946.63|0.02|0.01|R|F|1992-12-02|1992-10-15|1992-12-23|COLLECT COD|RAIL|d the foxes. accounts are above the even, +47875|697|98|4|24|38344.56|0.05|0.08|A|F|1992-10-03|1992-09-28|1992-10-11|DELIVER IN PERSON|SHIP|s. quickly regular foxes cajole carefully +47875|888|55|5|20|35777.60|0.05|0.02|R|F|1992-11-23|1992-09-06|1992-11-26|TAKE BACK RETURN|REG AIR|egular accounts mold slyly +47876|1506|27|1|39|54892.50|0.00|0.02|A|F|1995-03-28|1995-03-23|1995-03-30|NONE|AIR|he unusual courts. slyl +47876|1233|45|2|14|15879.22|0.00|0.05|A|F|1995-03-09|1995-03-09|1995-03-10|DELIVER IN PERSON|REG AIR|wake slyly unusual requests +47876|778|11|3|47|78902.19|0.04|0.08|R|F|1995-02-22|1995-02-02|1995-03-21|NONE|RAIL|iously. furiously specia +47876|1797|40|4|37|62855.23|0.01|0.06|A|F|1995-01-20|1995-02-02|1995-02-02|TAKE BACK RETURN|REG AIR| courts cajole slyly unusual a +47876|1894|81|5|4|7183.56|0.00|0.06|R|F|1995-03-17|1995-01-29|1995-03-19|TAKE BACK RETURN|RAIL|uriously qui +47876|143|22|6|10|10431.40|0.09|0.05|A|F|1995-02-15|1995-03-14|1995-02-28|DELIVER IN PERSON|FOB|fluffy deposits detect furiously ir +47876|862|63|7|8|14102.88|0.08|0.00|A|F|1995-03-18|1995-02-13|1995-04-04|DELIVER IN PERSON|SHIP| fluffily even pinto bea +47877|554|45|1|41|59636.55|0.10|0.03|A|F|1994-08-31|1994-10-15|1994-09-22|COLLECT COD|REG AIR|lent frays are. regular excuses are f +47877|1193|30|2|48|52521.12|0.05|0.00|A|F|1994-10-03|1994-11-13|1994-10-11|TAKE BACK RETURN|AIR|ons cajole carefully quickly ironi +47877|708|73|3|16|25739.20|0.09|0.08|A|F|1994-10-19|1994-11-11|1994-11-06|DELIVER IN PERSON|REG AIR|tes nod blithely past the +47877|1959|60|4|31|57689.45|0.09|0.07|A|F|1994-12-10|1994-11-17|1994-12-18|DELIVER IN PERSON|FOB|into beans. blithely bo +47877|1580|81|5|46|68152.68|0.08|0.08|A|F|1994-10-29|1994-11-10|1994-11-07|COLLECT COD|FOB|cial foxes. blithely iro +47878|154|55|1|2|2108.30|0.04|0.00|N|F|1995-06-17|1995-07-08|1995-06-20|NONE|FOB|refully slyly ironic re +47878|1018|89|2|50|45950.50|0.02|0.01|N|F|1995-05-28|1995-08-03|1995-06-25|COLLECT COD|FOB|ly enticing ideas +47878|392|21|3|14|18093.46|0.03|0.01|N|O|1995-08-23|1995-06-15|1995-09-01|DELIVER IN PERSON|AIR|yly final pinto be +47878|700|1|4|18|28812.60|0.04|0.04|N|O|1995-08-21|1995-06-12|1995-09-01|COLLECT COD|AIR|theodolites. unusual +47879|599|60|1|36|53985.24|0.08|0.04|R|F|1992-02-17|1992-03-22|1992-02-18|DELIVER IN PERSON|MAIL| requests cajole quickly. furiously ir +47879|791|24|2|2|3383.58|0.06|0.04|A|F|1992-02-23|1992-03-26|1992-02-24|DELIVER IN PERSON|RAIL|sleep among the quickly iron +47904|159|60|1|35|37070.25|0.00|0.08|N|O|1997-08-29|1997-07-24|1997-09-15|NONE|RAIL|ing gifts use across the caref +47904|1273|85|2|24|28182.48|0.10|0.07|N|O|1997-08-06|1997-08-11|1997-08-24|TAKE BACK RETURN|MAIL|dle slyly ironic, even asymptotes +47904|22|73|3|10|9220.20|0.00|0.04|N|O|1997-09-26|1997-07-08|1997-10-07|NONE|AIR|o beans. furi +47904|597|58|4|32|47922.88|0.07|0.03|N|O|1997-07-09|1997-08-13|1997-07-24|COLLECT COD|TRUCK|about the furiously +47904|369|54|5|14|17771.04|0.05|0.07|N|O|1997-09-13|1997-08-15|1997-09-28|COLLECT COD|AIR| regular pinto beans detect fluffily ag +47904|1041|77|6|49|46159.96|0.09|0.06|N|O|1997-06-28|1997-07-31|1997-06-30|NONE|FOB|nt somas sle +47904|395|24|7|47|60883.33|0.03|0.02|N|O|1997-06-27|1997-07-31|1997-07-19|TAKE BACK RETURN|RAIL|t carefull +47905|853|87|1|25|43846.25|0.09|0.04|R|F|1994-04-04|1994-05-14|1994-04-14|TAKE BACK RETURN|SHIP|gouts sleep across the +47905|1915|48|2|33|59958.03|0.04|0.01|R|F|1994-05-14|1994-06-29|1994-05-25|DELIVER IN PERSON|MAIL|regular dugouts: blithel +47906|245|46|1|33|37792.92|0.07|0.07|N|O|1996-02-18|1996-04-01|1996-03-08|COLLECT COD|TRUCK|into beans use sometimes furiously specia +47906|1295|96|2|3|3588.87|0.01|0.05|N|O|1996-03-15|1996-02-18|1996-04-08|TAKE BACK RETURN|RAIL|lly pending patterns haggle +47906|1282|83|3|13|15382.64|0.06|0.01|N|O|1996-02-17|1996-02-15|1996-02-21|TAKE BACK RETURN|FOB|nts. even, slow pinto beans are above +47906|1354|69|4|27|33894.45|0.07|0.05|N|O|1996-04-26|1996-03-12|1996-05-26|TAKE BACK RETURN|RAIL| accounts haggle carefu +47907|714|11|1|48|77506.08|0.08|0.05|N|O|1998-06-17|1998-07-30|1998-06-29|NONE|MAIL|ly even accounts boost blithely blith +47907|884|51|2|18|32127.84|0.09|0.03|N|O|1998-08-01|1998-08-01|1998-08-25|DELIVER IN PERSON|REG AIR|the carefully r +47907|1697|21|3|4|6394.76|0.00|0.02|N|O|1998-08-05|1998-07-11|1998-08-14|COLLECT COD|AIR| boost. final account +47907|722|55|4|49|79513.28|0.08|0.03|N|O|1998-05-12|1998-06-10|1998-05-19|NONE|FOB|sts. blithely regular epitaphs +47907|1080|16|5|7|6867.56|0.04|0.02|N|O|1998-07-20|1998-06-15|1998-07-25|NONE|REG AIR|l accounts cajole. final, final package +47907|1659|1|6|21|32773.65|0.10|0.08|N|O|1998-07-22|1998-07-08|1998-08-09|COLLECT COD|SHIP|eans engage s +47908|365|22|1|15|18980.40|0.09|0.05|N|O|1998-02-01|1998-02-24|1998-02-19|TAKE BACK RETURN|SHIP|requests. quick packages nag fluffil +47908|209|64|2|40|44368.00|0.00|0.02|N|O|1998-03-26|1998-01-28|1998-04-12|COLLECT COD|REG AIR|nts. carefull +47908|1513|54|3|25|35362.75|0.10|0.07|N|O|1998-04-16|1998-03-16|1998-05-07|TAKE BACK RETURN|RAIL|fully! fluffily spe +47909|217|99|1|35|39102.35|0.02|0.06|A|F|1993-04-24|1993-05-12|1993-04-29|TAKE BACK RETURN|AIR|ss deposits are carefully express accounts +47909|970|73|2|24|44903.28|0.09|0.01|R|F|1993-05-05|1993-05-11|1993-05-28|TAKE BACK RETURN|SHIP|the accounts. furiously even theodol +47909|1717|60|3|28|45323.88|0.08|0.07|R|F|1993-06-17|1993-04-26|1993-07-07|DELIVER IN PERSON|FOB|slyly. furiou +47909|346|75|4|32|39882.88|0.02|0.07|R|F|1993-07-04|1993-05-18|1993-07-05|NONE|REG AIR|ages sleep quickly e +47909|217|99|5|38|42453.98|0.03|0.01|A|F|1993-04-09|1993-04-12|1993-04-11|DELIVER IN PERSON|MAIL|longside of the bold, ruthless +47909|1881|82|6|15|26743.20|0.09|0.04|R|F|1993-04-14|1993-04-29|1993-05-01|COLLECT COD|RAIL|efully regular theodo +47910|1205|6|1|44|48672.80|0.04|0.08|A|F|1994-11-01|1994-10-08|1994-11-26|COLLECT COD|FOB|ackages wake carefully f +47910|837|37|2|4|6951.32|0.05|0.08|A|F|1994-09-17|1994-09-17|1994-09-26|DELIVER IN PERSON|RAIL|ully regular reques +47910|397|26|3|45|58382.55|0.07|0.00|A|F|1994-10-18|1994-10-06|1994-10-29|DELIVER IN PERSON|AIR|hily bold accounts wake ironical +47911|685|17|1|18|28542.24|0.06|0.01|N|O|1996-08-07|1996-10-13|1996-08-16|DELIVER IN PERSON|AIR|iously special pinto beans hinder acr +47911|1090|91|2|22|21803.98|0.07|0.03|N|O|1996-08-16|1996-10-15|1996-09-01|TAKE BACK RETURN|AIR| the slyly even +47911|1187|96|3|49|53320.82|0.03|0.01|N|O|1996-11-06|1996-09-15|1996-11-18|TAKE BACK RETURN|REG AIR|ckages; carefully regular frets wake bl +47911|1681|82|4|6|9496.08|0.06|0.00|N|O|1996-09-10|1996-10-11|1996-10-05|TAKE BACK RETURN|AIR|ular ideas +47911|256|84|5|40|46250.00|0.06|0.05|N|O|1996-10-01|1996-09-09|1996-10-29|TAKE BACK RETURN|FOB|y enticing theodolites use against the i +47911|1062|68|6|41|39485.46|0.00|0.03|N|O|1996-10-11|1996-09-09|1996-10-31|DELIVER IN PERSON|FOB|sual accounts. final packages a +47911|754|19|7|34|56261.50|0.01|0.07|N|O|1996-08-05|1996-10-07|1996-08-22|NONE|RAIL|sual packag +47936|1388|27|1|44|56732.72|0.03|0.07|N|O|1997-01-12|1997-03-13|1997-01-30|TAKE BACK RETURN|AIR|fter the furiously unusual exc +47936|186|13|2|1|1086.18|0.10|0.03|N|O|1997-04-25|1997-03-10|1997-05-23|NONE|MAIL|refully regular asymptotes. quickly reg +47936|1743|44|3|33|54276.42|0.05|0.04|N|O|1997-04-13|1997-02-07|1997-04-16|DELIVER IN PERSON|RAIL| boost quickly regular warhorses. fur +47937|48|99|1|50|47402.00|0.00|0.07|A|F|1993-11-05|1993-10-03|1993-11-28|COLLECT COD|REG AIR|ch carefully. furiously special accou +47937|1836|66|2|13|22591.79|0.10|0.02|A|F|1993-10-02|1993-11-19|1993-10-20|COLLECT COD|SHIP|the theodolites. carefully bold +47937|1193|66|3|19|20789.61|0.05|0.07|A|F|1993-10-23|1993-10-11|1993-10-26|TAKE BACK RETURN|MAIL|ross the fluffily even asympto +47937|1080|81|4|4|3924.32|0.01|0.01|R|F|1993-09-13|1993-11-18|1993-10-03|DELIVER IN PERSON|AIR|ut the furi +47937|445|33|5|6|8072.64|0.09|0.06|A|F|1993-11-20|1993-10-20|1993-12-14|COLLECT COD|RAIL|uffily expr +47937|673|5|6|41|64520.47|0.07|0.07|A|F|1993-10-05|1993-11-02|1993-10-10|TAKE BACK RETURN|TRUCK|eposits. pinto beans +47938|39|65|1|43|40378.29|0.08|0.06|R|F|1994-09-09|1994-07-25|1994-09-24|NONE|TRUCK|ounts. furiously unusual requests doubt s +47938|577|78|2|2|2955.14|0.04|0.02|A|F|1994-10-24|1994-08-21|1994-11-11|COLLECT COD|AIR|ons. furiously iron +47938|1477|78|3|34|46867.98|0.03|0.06|R|F|1994-07-24|1994-09-11|1994-07-29|DELIVER IN PERSON|MAIL|refully spe +47938|1172|81|4|48|51512.16|0.09|0.04|A|F|1994-07-15|1994-08-04|1994-08-12|DELIVER IN PERSON|FOB|fluffily. careful +47938|721|18|5|15|24325.80|0.08|0.05|R|F|1994-09-18|1994-09-23|1994-09-29|NONE|AIR|egular accounts nag quickly; packag +47939|1737|22|1|49|80297.77|0.08|0.05|R|F|1992-07-28|1992-08-05|1992-08-20|COLLECT COD|RAIL|ously express deposits. ironic packages +47939|1634|17|2|7|10749.41|0.08|0.07|R|F|1992-06-03|1992-08-03|1992-06-10|COLLECT COD|RAIL|s impress slyly silent requests. regul +47940|1133|34|1|21|21716.73|0.01|0.03|R|F|1993-08-02|1993-07-11|1993-08-20|TAKE BACK RETURN|AIR|ges. blithely permanent foxes are +47940|233|88|2|11|12465.53|0.01|0.06|R|F|1993-07-21|1993-08-16|1993-07-31|COLLECT COD|REG AIR| slyly. evenly ironic theodolites wak +47941|400|1|1|8|10403.20|0.01|0.06|R|F|1994-11-02|1994-10-20|1994-11-30|NONE|TRUCK| requests doubt instructions. +47941|329|58|2|32|39338.24|0.00|0.08|R|F|1994-09-26|1994-10-20|1994-10-01|TAKE BACK RETURN|REG AIR|ar requests alon +47941|873|74|3|13|23060.31|0.05|0.04|R|F|1994-11-13|1994-09-28|1994-11-21|COLLECT COD|SHIP|posits. regular request +47941|1381|82|4|30|38471.40|0.01|0.07|R|F|1994-09-29|1994-10-25|1994-10-10|TAKE BACK RETURN|AIR| slyly regular theodolites afte +47941|841|8|5|49|85350.16|0.06|0.06|R|F|1994-10-29|1994-09-11|1994-11-06|TAKE BACK RETURN|SHIP|onic requests wake idly alo +47942|838|38|1|15|26082.45|0.07|0.04|R|F|1993-05-02|1993-04-06|1993-05-24|NONE|REG AIR| detect quickly across the excuses. b +47942|1438|17|2|36|48219.48|0.06|0.07|A|F|1993-03-03|1993-05-10|1993-03-10|DELIVER IN PERSON|REG AIR|s the carefull +47942|1531|12|3|49|70193.97|0.08|0.06|A|F|1993-05-25|1993-04-15|1993-06-13|COLLECT COD|MAIL|le furiously. final waters +47942|1290|91|4|44|52416.76|0.05|0.05|A|F|1993-06-11|1993-04-28|1993-07-10|DELIVER IN PERSON|MAIL|ly ironic request +47942|1929|62|5|42|76898.64|0.06|0.00|A|F|1993-06-03|1993-05-13|1993-06-15|NONE|REG AIR|d realms wake pending deposits. +47943|1285|86|1|41|48637.48|0.06|0.07|A|F|1994-11-21|1994-12-31|1994-12-02|NONE|AIR| furiously un +47943|359|16|2|2|2518.70|0.02|0.05|R|F|1994-11-21|1995-01-11|1994-11-29|NONE|AIR|uriously am +47943|806|7|3|29|49497.20|0.04|0.03|A|F|1994-11-18|1995-01-02|1994-11-29|COLLECT COD|AIR|ely express dep +47943|1612|54|4|3|4540.83|0.05|0.03|R|F|1994-12-29|1995-02-12|1995-01-08|COLLECT COD|TRUCK|l instructions. final accou +47943|350|51|5|19|23756.65|0.08|0.01|A|F|1995-03-01|1994-12-18|1995-03-18|TAKE BACK RETURN|MAIL|ys. carefully pendi +47943|1652|94|6|20|31073.00|0.10|0.06|A|F|1995-02-17|1995-01-04|1995-03-02|NONE|REG AIR|lar pinto beans according to +47968|947|48|1|23|42502.62|0.02|0.04|A|F|1993-05-09|1993-05-20|1993-06-06|COLLECT COD|MAIL|final asymptotes. fluffily +47969|1117|90|1|43|43778.73|0.07|0.04|A|F|1994-12-08|1995-02-14|1994-12-19|NONE|SHIP|ackages. blit +47970|1263|38|1|26|30270.76|0.03|0.02|N|O|1997-11-16|1997-09-25|1997-12-05|COLLECT COD|TRUCK|r requests. fin +47970|1821|8|2|44|75804.08|0.03|0.08|N|O|1997-10-03|1997-09-10|1997-11-01|COLLECT COD|FOB|egular ideas. carefully final sentimen +47970|353|10|3|46|57654.10|0.04|0.03|N|O|1997-11-13|1997-09-11|1997-12-10|TAKE BACK RETURN|REG AIR|olites aff +47971|552|13|1|32|46481.60|0.00|0.02|A|F|1993-02-22|1993-01-03|1993-03-03|DELIVER IN PERSON|RAIL|osits are slyly. slyly silent realm +47971|1930|63|2|2|3663.86|0.02|0.00|A|F|1993-01-26|1993-01-21|1993-02-21|COLLECT COD|TRUCK|y regular f +47971|1194|3|3|21|22998.99|0.03|0.05|A|F|1992-12-07|1992-11-29|1992-12-22|NONE|TRUCK|ests. fluffily regular accounts haggle +47971|994|95|4|50|94749.50|0.01|0.07|A|F|1992-11-14|1992-12-04|1992-11-22|DELIVER IN PERSON|FOB|s use into the carefully unusual +47971|1243|18|5|16|18307.84|0.04|0.02|R|F|1992-11-08|1992-12-24|1992-12-04|NONE|MAIL|haggle about the permanently slow theod +47971|1613|37|6|12|18175.32|0.10|0.08|R|F|1992-11-18|1992-12-19|1992-12-14|TAKE BACK RETURN|RAIL|y final deposits. carefully regul +47972|1505|86|1|40|56260.00|0.00|0.04|R|F|1993-12-21|1993-11-30|1994-01-13|TAKE BACK RETURN|FOB|e. furiously express +47972|403|62|2|16|20854.40|0.05|0.02|R|F|1993-10-29|1993-12-11|1993-11-22|TAKE BACK RETURN|AIR|egular instructions across the ironic idea +47972|1963|64|3|21|39164.16|0.04|0.02|R|F|1993-10-23|1993-11-20|1993-11-16|NONE|SHIP|s above the +47972|1785|28|4|28|47229.84|0.09|0.05|R|F|1993-10-26|1993-12-22|1993-11-22|COLLECT COD|AIR|carefully ironic +47973|647|48|1|21|32500.44|0.05|0.08|N|O|1997-08-04|1997-08-16|1997-08-31|TAKE BACK RETURN|RAIL|blithely even accounts. carefully regula +47973|85|86|2|5|4925.40|0.09|0.00|N|O|1997-09-23|1997-09-06|1997-10-16|TAKE BACK RETURN|REG AIR|against the b +47973|846|46|3|7|12227.88|0.02|0.00|N|O|1997-10-25|1997-09-26|1997-11-06|COLLECT COD|SHIP|pecial instructions was boldly exp +47973|342|99|4|4|4969.36|0.02|0.08|N|O|1997-10-24|1997-09-28|1997-11-20|DELIVER IN PERSON|TRUCK|ajole after the careful ide +47973|443|31|5|6|8060.64|0.02|0.01|N|O|1997-08-30|1997-09-27|1997-09-16|DELIVER IN PERSON|FOB|ongside of the careful +47973|1662|63|6|30|46909.80|0.07|0.05|N|O|1997-08-14|1997-09-13|1997-09-08|NONE|TRUCK|ously bold packages. foxes will have to wak +47973|656|50|7|35|54482.75|0.09|0.01|N|O|1997-09-08|1997-08-27|1997-09-15|NONE|MAIL|cuses use finally unusual platel +47974|1552|33|1|41|59595.55|0.00|0.05|A|F|1994-12-19|1994-11-27|1995-01-01|NONE|AIR|, pending packages. unusual packages accor +47974|697|29|2|29|46333.01|0.09|0.01|A|F|1994-11-16|1994-11-18|1994-12-15|TAKE BACK RETURN|AIR|yly ironic +47974|1726|69|3|17|27671.24|0.08|0.03|A|F|1994-10-23|1994-11-04|1994-11-11|TAKE BACK RETURN|AIR| the special, +47974|1102|39|4|14|14043.40|0.08|0.07|A|F|1994-12-10|1994-10-07|1994-12-27|TAKE BACK RETURN|TRUCK| express reques +47974|928|97|5|18|32920.56|0.09|0.01|R|F|1994-09-11|1994-10-19|1994-09-22|NONE|RAIL| packages. final, final deposit +47975|220|48|1|25|28005.50|0.05|0.04|R|F|1993-11-25|1993-09-29|1993-12-08|DELIVER IN PERSON|RAIL|requests w +47975|27|78|2|42|38934.84|0.05|0.02|A|F|1993-12-13|1993-09-29|1993-12-26|COLLECT COD|SHIP|tions. daringl +47975|361|18|3|29|36579.44|0.06|0.00|R|F|1993-11-08|1993-09-29|1993-11-16|TAKE BACK RETURN|MAIL|ackages may serve above the furiousl +48000|308|9|1|39|47123.70|0.07|0.04|R|F|1992-11-24|1992-10-21|1992-12-12|TAKE BACK RETURN|MAIL|arefully ironic as +48001|1804|5|1|35|59703.00|0.02|0.04|N|O|1998-04-27|1998-04-22|1998-05-11|NONE|AIR|hs among the blithely final instruc +48001|1464|82|2|19|25943.74|0.00|0.00|N|O|1998-06-12|1998-04-21|1998-07-03|NONE|SHIP|kly among the final, unusual deposits +48001|951|52|3|39|72226.05|0.05|0.01|N|O|1998-05-30|1998-04-28|1998-06-17|NONE|FOB|s sleep quickly ac +48001|1979|80|4|36|67714.92|0.00|0.03|N|O|1998-05-22|1998-03-23|1998-05-27|NONE|FOB|ccounts. slyly express request +48001|1591|12|5|23|34329.57|0.03|0.01|N|O|1998-03-26|1998-05-01|1998-03-28|NONE|REG AIR|nos nag furiously about the furiousl +48001|1484|85|6|44|60961.12|0.00|0.02|N|O|1998-05-28|1998-04-17|1998-06-03|DELIVER IN PERSON|RAIL|s alongside of t +48002|1378|79|1|37|47336.69|0.02|0.06|N|O|1996-05-29|1996-06-14|1996-06-01|COLLECT COD|REG AIR| packages sleep. fluffily regu +48002|1766|67|2|10|16677.60|0.06|0.01|N|O|1996-04-26|1996-05-16|1996-05-12|NONE|SHIP|furiously u +48002|498|99|3|14|19578.86|0.01|0.07|N|O|1996-06-02|1996-06-04|1996-06-14|NONE|SHIP|integrate blithely busy plat +48002|427|57|4|41|54424.22|0.05|0.05|N|O|1996-05-24|1996-06-17|1996-06-22|DELIVER IN PERSON|RAIL|es. carefully ironic accounts could hag +48002|647|79|5|27|41786.28|0.09|0.06|N|O|1996-06-11|1996-06-12|1996-06-25|TAKE BACK RETURN|REG AIR|nal asymptotes. always silen +48002|1804|48|6|37|63114.60|0.02|0.03|N|O|1996-07-16|1996-05-02|1996-07-24|TAKE BACK RETURN|REG AIR|deas sleep fluffily final dep +48003|727|24|1|19|30926.68|0.04|0.00|A|F|1992-02-17|1992-04-06|1992-03-09|TAKE BACK RETURN|FOB| packages doubt-- pending accounts along +48003|1448|49|2|24|32386.56|0.06|0.03|A|F|1992-03-30|1992-03-08|1992-04-10|COLLECT COD|AIR|ests. even, ironic +48003|1979|80|3|16|30095.52|0.07|0.04|A|F|1992-03-22|1992-03-17|1992-04-03|TAKE BACK RETURN|TRUCK|etect blithe +48003|1190|99|4|21|22914.99|0.09|0.01|R|F|1992-04-30|1992-03-28|1992-05-23|DELIVER IN PERSON|REG AIR| quickly ironic accounts. cl +48003|869|3|5|36|63714.96|0.03|0.00|A|F|1992-05-08|1992-04-12|1992-05-14|DELIVER IN PERSON|TRUCK|ages haggle a +48003|364|49|6|4|5057.44|0.09|0.00|R|F|1992-02-22|1992-03-23|1992-02-28|COLLECT COD|TRUCK|foxes. final packages wake sly +48003|1582|3|7|43|63793.94|0.03|0.06|A|F|1992-03-04|1992-02-27|1992-04-02|COLLECT COD|TRUCK|ar, regular accounts. furiously unusual acc +48004|205|6|1|23|25419.60|0.07|0.01|N|O|1998-02-15|1998-03-11|1998-03-02|NONE|REG AIR|en accounts haggle +48004|1082|83|2|30|29492.40|0.05|0.04|N|O|1998-04-18|1998-04-09|1998-04-25|NONE|AIR|eposits. blithely express accounts nag quic +48004|1375|52|3|46|58713.02|0.01|0.06|N|O|1998-01-23|1998-03-08|1998-02-22|DELIVER IN PERSON|TRUCK|ing to the bold, final ideas. carefu +48004|823|24|4|36|62057.52|0.03|0.00|N|O|1998-04-12|1998-02-18|1998-04-20|TAKE BACK RETURN|FOB|ove the carefully +48004|524|15|5|26|37037.52|0.07|0.07|N|O|1998-02-12|1998-03-23|1998-03-11|DELIVER IN PERSON|RAIL|uffily about the even +48005|1504|5|1|44|61842.00|0.05|0.02|N|O|1997-05-20|1997-07-03|1997-06-08|TAKE BACK RETURN|REG AIR|xcuses. pending deposits boost +48005|885|86|2|18|32145.84|0.04|0.00|N|O|1997-08-02|1997-07-07|1997-08-18|TAKE BACK RETURN|MAIL|asymptotes. slyly brave accounts nag platel +48005|1734|61|3|40|65429.20|0.05|0.05|N|O|1997-08-04|1997-06-22|1997-09-01|NONE|MAIL|st ironic patterns. s +48005|1158|95|4|11|11650.65|0.04|0.08|N|O|1997-07-17|1997-07-11|1997-07-27|COLLECT COD|RAIL|s about the fluffily fin +48005|195|96|5|40|43807.60|0.10|0.00|N|O|1997-05-11|1997-07-12|1997-05-15|NONE|MAIL|en deposits doze +48006|1142|15|1|4|4172.56|0.10|0.07|A|F|1992-10-03|1992-09-14|1992-10-22|DELIVER IN PERSON|AIR|ual deposits wake along th +48006|1724|9|2|3|4877.16|0.09|0.08|A|F|1992-08-29|1992-08-05|1992-09-26|COLLECT COD|AIR|he furiously regular dependencies. blith +48006|642|36|3|4|6170.56|0.04|0.05|A|F|1992-10-06|1992-09-24|1992-10-19|DELIVER IN PERSON|MAIL|ven sauternes are bravely-- quick +48007|76|52|1|5|4880.35|0.01|0.05|N|O|1997-08-12|1997-09-13|1997-08-14|COLLECT COD|MAIL|cial instruc +48007|594|25|2|42|62772.78|0.08|0.05|N|O|1997-10-23|1997-08-15|1997-11-08|NONE|RAIL| cajole furiously blithely special pac +48007|183|62|3|13|14081.34|0.10|0.02|N|O|1997-07-27|1997-07-30|1997-08-08|NONE|FOB| to the ironic accounts are sly +48007|284|12|4|25|29607.00|0.00|0.06|N|O|1997-09-03|1997-07-28|1997-09-20|TAKE BACK RETURN|TRUCK|cial platelets against the bold packages +48007|1674|57|5|48|75632.16|0.05|0.04|N|O|1997-08-14|1997-09-14|1997-09-10|NONE|FOB|s x-ray carefully +48007|1183|20|6|45|48788.10|0.07|0.02|N|O|1997-08-23|1997-09-23|1997-08-31|NONE|AIR|sual asymptotes. regular +48007|313|14|7|35|42465.85|0.04|0.00|N|O|1997-08-03|1997-08-09|1997-08-13|TAKE BACK RETURN|AIR|iously express foxes sleep. even platelet +48032|155|8|1|45|47481.75|0.06|0.06|R|F|1993-11-21|1993-09-30|1993-12-04|NONE|TRUCK|instructions impress. fluffy deposits +48032|711|44|2|9|14505.39|0.05|0.03|A|F|1993-10-23|1993-10-23|1993-11-03|TAKE BACK RETURN|TRUCK|ely. regular, +48032|1502|83|3|11|15438.50|0.00|0.05|R|F|1993-09-05|1993-10-08|1993-09-10|NONE|TRUCK|s haggle sly +48032|460|48|4|3|4081.38|0.05|0.02|A|F|1993-10-20|1993-11-14|1993-10-25|NONE|AIR|longside o +48032|272|27|5|19|22273.13|0.02|0.02|A|F|1993-12-04|1993-10-06|1993-12-16|TAKE BACK RETURN|FOB|es. silent o +48032|1301|16|6|9|10820.70|0.02|0.06|R|F|1993-11-17|1993-10-15|1993-11-18|COLLECT COD|RAIL|al theodol +48033|617|49|1|2|3035.22|0.06|0.05|N|O|1996-08-30|1996-10-15|1996-09-16|TAKE BACK RETURN|FOB|the ironic ideas. unusual ideas are a +48034|678|41|1|16|25258.72|0.06|0.05|R|F|1994-08-01|1994-08-27|1994-08-24|TAKE BACK RETURN|SHIP|ng to the slyly ironic packages. +48034|1543|64|2|49|70782.46|0.06|0.03|R|F|1994-08-09|1994-08-15|1994-08-21|COLLECT COD|RAIL|ites against the foxes nod stealthil +48034|319|48|3|13|15851.03|0.08|0.05|A|F|1994-11-07|1994-09-05|1994-12-07|TAKE BACK RETURN|FOB|e after the slyly final requests. slyly reg +48035|1549|90|1|21|30461.34|0.06|0.03|R|F|1994-05-22|1994-05-23|1994-05-25|TAKE BACK RETURN|SHIP| furiously final deposits cajole. careful +48035|1328|43|2|40|49172.80|0.04|0.07|R|F|1994-05-22|1994-06-12|1994-06-15|TAKE BACK RETURN|MAIL|o the carefully ironic reque +48036|1212|87|1|7|7792.47|0.02|0.04|N|O|1996-07-01|1996-05-18|1996-07-31|NONE|REG AIR|about the final, ironic +48036|507|8|2|9|12667.50|0.04|0.01|N|O|1996-04-16|1996-04-26|1996-05-15|DELIVER IN PERSON|RAIL|ess deposits. blithely bold pinto beans +48036|1416|95|3|35|46109.35|0.00|0.06|N|O|1996-06-11|1996-05-21|1996-06-15|TAKE BACK RETURN|FOB|l accounts. ironic requests inte +48036|1552|73|4|42|61049.10|0.03|0.05|N|O|1996-05-12|1996-04-22|1996-06-01|DELIVER IN PERSON|AIR| alongside +48036|645|77|5|28|43277.92|0.09|0.05|N|O|1996-06-07|1996-05-24|1996-06-28|TAKE BACK RETURN|FOB|heodolites haggle. carefully +48037|1564|65|1|34|49829.04|0.03|0.01|N|O|1995-11-13|1995-10-20|1995-11-26|DELIVER IN PERSON|RAIL|ions. blithely final sentiments wak +48037|719|52|2|18|29154.78|0.02|0.08|N|O|1995-11-03|1995-12-13|1995-11-10|TAKE BACK RETURN|REG AIR|unusual foxe +48038|47|23|1|25|23676.00|0.06|0.05|N|O|1997-05-05|1997-02-17|1997-05-25|COLLECT COD|RAIL|pinto beans among th +48038|1198|71|2|18|19785.42|0.00|0.03|N|O|1997-04-08|1997-03-15|1997-05-04|DELIVER IN PERSON|RAIL|nusual accounts haggle carefully. fu +48039|1264|2|1|22|25635.72|0.08|0.07|R|F|1993-11-21|1993-10-10|1993-11-22|COLLECT COD|RAIL|en asymptotes are fu +48064|1863|64|1|30|52945.80|0.09|0.06|A|F|1993-08-18|1993-08-22|1993-08-29|DELIVER IN PERSON|AIR|iously carefull +48064|503|4|2|27|37894.50|0.09|0.02|A|F|1993-08-06|1993-08-20|1993-09-01|DELIVER IN PERSON|AIR|ickly special courts use furiously +48065|762|59|1|22|36580.72|0.07|0.05|R|F|1993-08-05|1993-05-17|1993-08-30|DELIVER IN PERSON|MAIL|y regular account +48066|365|50|1|18|22776.48|0.09|0.07|R|F|1993-12-26|1993-11-26|1994-01-19|COLLECT COD|AIR| carefully brave platelets +48067|145|24|1|28|29263.92|0.08|0.01|R|F|1992-07-04|1992-08-21|1992-07-26|TAKE BACK RETURN|FOB|ly ironic r +48067|932|33|2|47|86147.71|0.06|0.02|A|F|1992-09-03|1992-09-12|1992-09-06|NONE|SHIP|al excuses. deposits haggle alongsid +48067|1588|69|3|10|14895.80|0.02|0.03|R|F|1992-08-05|1992-08-26|1992-08-31|DELIVER IN PERSON|FOB|al deposits. blithely ironic requests acco +48067|1484|2|4|47|65117.56|0.01|0.02|R|F|1992-10-23|1992-08-27|1992-11-21|TAKE BACK RETURN|AIR| instructions wake. +48067|974|9|5|5|9374.85|0.07|0.03|A|F|1992-07-17|1992-09-11|1992-07-24|TAKE BACK RETURN|SHIP| final, silent pains run +48067|1476|16|6|41|56476.27|0.04|0.01|R|F|1992-07-10|1992-08-01|1992-08-05|COLLECT COD|RAIL|ly orbits. fur +48067|592|53|7|4|5970.36|0.00|0.05|A|F|1992-10-17|1992-08-07|1992-10-22|NONE|FOB| silent dolphins. special, ironic a +48068|1502|83|1|2|2807.00|0.01|0.01|A|F|1993-01-15|1992-12-09|1993-01-30|COLLECT COD|MAIL| above the furiously +48069|347|4|1|3|3742.02|0.06|0.04|N|O|1996-08-13|1996-06-20|1996-08-24|COLLECT COD|RAIL| excuses. platelets are enticingly quickly +48070|1293|5|1|32|38217.28|0.08|0.06|N|O|1997-10-17|1997-09-19|1997-11-02|TAKE BACK RETURN|AIR|structions. ironic, regular +48071|609|3|1|48|72460.80|0.01|0.02|R|F|1995-03-26|1995-05-03|1995-03-29|TAKE BACK RETURN|TRUCK|inal accounts. regular, final frays abov +48096|776|73|1|43|72101.11|0.07|0.03|R|F|1994-07-20|1994-09-07|1994-08-04|COLLECT COD|FOB|counts across the ironic deposits affix sly +48096|96|22|2|10|9960.90|0.00|0.02|A|F|1994-09-01|1994-08-20|1994-09-29|TAKE BACK RETURN|TRUCK|sts wake fluffily about +48096|1234|9|3|13|14757.99|0.04|0.04|R|F|1994-08-19|1994-08-07|1994-08-29|DELIVER IN PERSON|FOB| instructions use across the reg +48096|653|85|4|32|49716.80|0.03|0.06|R|F|1994-06-26|1994-07-13|1994-07-11|DELIVER IN PERSON|RAIL|s integrate. blithely special depo +48096|906|41|5|38|68662.20|0.08|0.02|R|F|1994-07-07|1994-08-08|1994-07-12|DELIVER IN PERSON|RAIL|sly pending asymptotes hang fina +48096|807|74|6|35|59773.00|0.05|0.03|A|F|1994-08-23|1994-07-16|1994-09-12|TAKE BACK RETURN|TRUCK|ick asymptotes? silent, regu +48096|1386|87|7|18|23172.84|0.00|0.07|R|F|1994-07-30|1994-08-11|1994-08-25|NONE|TRUCK| stealthily sl +48097|492|93|1|28|38989.72|0.05|0.03|N|O|1997-09-23|1997-11-05|1997-09-28|NONE|SHIP|osits. fluffily regular pinto beans wa +48098|504|95|1|37|51966.50|0.00|0.02|R|F|1994-09-01|1994-11-10|1994-09-29|DELIVER IN PERSON|FOB|ly unusual +48098|1779|64|2|45|75634.65|0.05|0.00|A|F|1994-12-12|1994-10-18|1994-12-31|TAKE BACK RETURN|FOB|ravely regular requests. regu +48099|866|100|1|31|54772.66|0.09|0.07|N|O|1996-08-21|1996-07-01|1996-09-05|COLLECT COD|SHIP|tect furiously again +48100|643|6|1|48|74094.72|0.10|0.00|N|O|1998-03-16|1998-02-12|1998-03-20|DELIVER IN PERSON|AIR|ss foxes nag among the car +48101|1600|1|1|15|22524.00|0.06|0.02|N|O|1995-10-22|1995-11-03|1995-10-23|COLLECT COD|TRUCK|lyly pending ideas wake special +48101|422|23|2|5|6612.10|0.06|0.06|N|O|1995-12-11|1995-11-04|1996-01-07|TAKE BACK RETURN|SHIP|gular, permanent ideas are ab +48101|112|91|3|32|32387.52|0.07|0.07|N|O|1995-11-17|1995-11-02|1995-12-13|DELIVER IN PERSON|RAIL|ly instructions. +48101|1558|59|4|1|1459.55|0.04|0.07|N|O|1995-10-27|1995-12-10|1995-11-16|TAKE BACK RETURN|FOB|leep according to +48101|172|51|5|9|9649.53|0.10|0.07|N|O|1995-10-28|1995-10-23|1995-11-22|NONE|AIR| deposits must wake blithely ironic +48101|1106|15|6|49|49347.90|0.10|0.07|N|O|1995-09-29|1995-10-17|1995-10-16|TAKE BACK RETURN|RAIL|ic accounts detect carefull +48101|541|42|7|19|27389.26|0.02|0.05|N|O|1995-12-19|1995-12-08|1995-12-29|DELIVER IN PERSON|MAIL|ts beneath the deposits integrate furio +48102|873|74|1|2|3547.74|0.00|0.00|R|F|1992-04-13|1992-03-12|1992-04-26|NONE|SHIP| pending foxes. final instructi +48102|155|56|2|36|37985.40|0.03|0.07|R|F|1992-04-28|1992-03-25|1992-05-27|COLLECT COD|AIR| above the even accounts. sly +48103|570|71|1|18|26470.26|0.03|0.07|N|O|1996-10-04|1996-10-05|1996-10-28|DELIVER IN PERSON|MAIL|d requests are slyl +48103|693|87|2|34|54185.46|0.09|0.04|N|O|1996-07-23|1996-09-19|1996-07-24|TAKE BACK RETURN|RAIL|c, final foxes. bold platelets nag busi +48103|1118|27|3|14|14267.54|0.00|0.08|N|O|1996-07-20|1996-09-07|1996-08-10|COLLECT COD|TRUCK|ts sleep. care +48103|896|30|4|32|57500.48|0.10|0.05|N|O|1996-09-08|1996-09-30|1996-10-04|NONE|MAIL|ts use carefully; blithely regul +48103|820|20|5|19|32695.58|0.01|0.05|N|O|1996-08-19|1996-10-06|1996-09-13|NONE|RAIL|en deposits +48103|1100|36|6|28|28030.80|0.07|0.03|N|O|1996-10-14|1996-09-19|1996-11-09|COLLECT COD|TRUCK|use slyly express foxes. slyly special p +48128|1013|84|1|24|21936.24|0.02|0.04|R|F|1992-04-17|1992-05-20|1992-05-15|NONE|SHIP|gainst the carefully +48128|380|81|2|23|29448.74|0.08|0.07|A|F|1992-05-25|1992-07-02|1992-06-20|COLLECT COD|RAIL|s haggle slyly among the +48128|253|81|3|49|56509.25|0.03|0.00|A|F|1992-06-15|1992-07-04|1992-06-21|TAKE BACK RETURN|AIR|ts wake above the furiously unusua +48128|135|62|4|7|7245.91|0.06|0.02|R|F|1992-04-29|1992-05-31|1992-05-04|DELIVER IN PERSON|RAIL|ms integrate furiou +48128|405|64|5|6|7832.40|0.04|0.02|A|F|1992-08-10|1992-06-16|1992-09-05|TAKE BACK RETURN|TRUCK|side of the closel +48128|555|56|6|24|34933.20|0.05|0.07|A|F|1992-06-25|1992-06-28|1992-06-26|NONE|MAIL|. final requests are. slyly regular decoys +48128|1566|67|7|17|24948.52|0.08|0.08|A|F|1992-04-26|1992-07-01|1992-05-23|COLLECT COD|RAIL|gular, final acco +48129|1543|84|1|15|21668.10|0.05|0.06|N|O|1997-12-26|1997-12-13|1998-01-10|NONE|MAIL| lose? ironic foxes along t +48129|864|64|2|10|17648.60|0.04|0.04|N|O|1997-11-13|1997-12-30|1997-12-03|TAKE BACK RETURN|REG AIR|ounts. furiously unusual +48130|1635|18|1|33|50708.79|0.07|0.05|N|O|1997-12-09|1998-01-06|1997-12-27|COLLECT COD|FOB|the carefully special foxes. ironic foxes +48130|1339|16|2|9|11162.97|0.10|0.03|N|O|1998-03-03|1998-01-22|1998-03-12|COLLECT COD|REG AIR|carefully unusual theodolites. furiously +48130|631|25|3|8|12253.04|0.03|0.05|N|O|1997-11-18|1997-12-23|1997-12-05|TAKE BACK RETURN|FOB|oxes. ironic accounts serve blithely. reg +48130|1026|62|4|29|26883.58|0.03|0.07|N|O|1998-02-13|1997-12-07|1998-03-12|TAKE BACK RETURN|FOB|hely regular +48130|1497|98|5|50|69924.50|0.01|0.03|N|O|1997-12-15|1998-01-13|1998-01-12|COLLECT COD|TRUCK|to the slyly even excuses. furious +48131|1172|81|1|35|37560.95|0.00|0.05|N|O|1998-06-17|1998-05-11|1998-07-12|DELIVER IN PERSON|RAIL|c notornis sle +48132|1356|33|1|38|47779.30|0.09|0.05|R|F|1993-04-17|1993-02-13|1993-04-21|NONE|AIR|ngside of the unusual foxes. ironic, pendin +48132|559|90|2|47|68598.85|0.07|0.00|R|F|1993-02-21|1993-02-01|1993-03-14|NONE|MAIL|s theodolites. finally +48132|1247|48|3|35|40188.40|0.04|0.01|R|F|1993-01-05|1993-01-31|1993-01-08|TAKE BACK RETURN|SHIP|pecial packages ha +48133|1335|74|1|8|9890.64|0.08|0.04|N|O|1996-02-27|1996-02-10|1996-03-24|TAKE BACK RETURN|SHIP|y pending foxes. special ac +48133|1202|14|2|38|41921.60|0.06|0.04|N|O|1995-12-18|1996-01-18|1996-01-14|TAKE BACK RETURN|AIR|. slyly bold p +48133|1637|38|3|15|23079.45|0.03|0.06|N|O|1996-02-12|1996-02-20|1996-02-16|TAKE BACK RETURN|SHIP|pecial instructions toward the regular, fi +48134|1646|29|1|25|38691.00|0.09|0.02|R|F|1993-04-30|1993-04-14|1993-05-20|COLLECT COD|MAIL|t the final, bold din +48134|904|7|2|49|88440.10|0.02|0.04|R|F|1993-03-18|1993-05-30|1993-04-03|TAKE BACK RETURN|MAIL|ong the ste +48135|1527|68|1|39|55712.28|0.00|0.07|R|F|1994-06-10|1994-07-16|1994-06-24|COLLECT COD|REG AIR| final packages wake carefully car +48135|1311|26|2|36|43643.16|0.05|0.03|A|F|1994-05-11|1994-06-09|1994-05-21|DELIVER IN PERSON|TRUCK|oss the furiously regular pi +48135|1215|27|3|23|25672.83|0.00|0.06|R|F|1994-07-17|1994-05-26|1994-07-19|TAKE BACK RETURN|SHIP|ins sleep furiously bold dec +48135|500|88|4|31|43415.50|0.05|0.06|A|F|1994-04-22|1994-05-25|1994-05-16|COLLECT COD|SHIP|nic requests are furiously. fluffily +48135|113|92|5|14|14183.54|0.07|0.03|R|F|1994-07-14|1994-06-03|1994-07-17|COLLECT COD|AIR|ake quickly carefully final instructions. +48135|1129|38|6|38|39144.56|0.02|0.04|R|F|1994-06-23|1994-06-16|1994-07-21|DELIVER IN PERSON|MAIL|r packages +48135|808|42|7|48|82022.40|0.07|0.02|R|F|1994-07-08|1994-07-08|1994-07-30|TAKE BACK RETURN|FOB|refully across the b +48160|381|82|1|33|42285.54|0.09|0.08|N|O|1996-04-21|1996-03-19|1996-05-04|COLLECT COD|TRUCK|eposits. carefull +48160|194|73|2|4|4376.76|0.07|0.01|N|O|1996-02-19|1996-03-27|1996-03-18|DELIVER IN PERSON|MAIL|uickly regular +48160|1012|48|3|5|4565.05|0.04|0.05|N|O|1996-05-21|1996-04-06|1996-06-20|DELIVER IN PERSON|FOB|ully slyly regular pinto b +48160|944|13|4|26|47968.44|0.00|0.04|N|O|1996-03-12|1996-04-11|1996-04-06|TAKE BACK RETURN|AIR|al depths. slyly regular warthogs across th +48160|756|53|5|10|16567.50|0.08|0.08|N|O|1996-05-04|1996-03-22|1996-05-23|NONE|SHIP|endencies. quickly +48161|400|85|1|46|59818.40|0.06|0.02|N|O|1995-08-07|1995-07-08|1995-08-22|COLLECT COD|TRUCK| requests cajole: f +48161|1383|22|2|26|33393.88|0.06|0.00|N|O|1995-08-28|1995-08-02|1995-09-10|TAKE BACK RETURN|SHIP|egular deposits. regular pac +48161|1698|22|3|48|76785.12|0.06|0.08|N|F|1995-06-10|1995-06-28|1995-06-25|COLLECT COD|MAIL|w requests wake platelets. furious +48161|1861|62|4|11|19391.46|0.02|0.05|N|O|1995-09-17|1995-07-09|1995-09-26|DELIVER IN PERSON|RAIL|luffily regular platelets cajol +48161|427|57|5|14|18583.88|0.08|0.01|N|O|1995-08-17|1995-07-18|1995-09-05|DELIVER IN PERSON|FOB|, bold hockey playe +48161|614|77|6|17|25748.37|0.05|0.04|N|O|1995-07-10|1995-07-24|1995-07-20|NONE|AIR|ccounts. furiously pending deposits wake t +48161|1520|61|7|37|52596.24|0.02|0.05|N|O|1995-09-16|1995-08-19|1995-10-11|COLLECT COD|SHIP| final accounts int +48162|1277|89|1|17|20030.59|0.01|0.03|N|O|1996-06-06|1996-04-28|1996-06-09|DELIVER IN PERSON|MAIL|nto beans detect. quickly regular p +48162|1727|12|2|47|76549.84|0.07|0.01|N|O|1996-05-11|1996-04-22|1996-05-28|NONE|RAIL|etly regular foxes nag. ca +48162|1964|53|3|19|35453.24|0.06|0.03|N|O|1996-04-13|1996-04-28|1996-05-04|DELIVER IN PERSON|AIR|tect sentiments-- ironic, ironic in +48162|1077|13|4|8|7824.56|0.08|0.01|N|O|1996-07-07|1996-04-25|1996-07-17|NONE|RAIL|ns. requests s +48162|1824|68|5|17|29338.94|0.03|0.04|N|O|1996-04-23|1996-04-28|1996-05-08|NONE|AIR|lar foxes across the +48163|1803|90|1|34|57963.20|0.05|0.00|N|O|1997-06-11|1997-03-29|1997-07-11|TAKE BACK RETURN|TRUCK|furiously about +48163|1107|44|2|23|23186.30|0.00|0.05|N|O|1997-04-19|1997-05-10|1997-05-10|TAKE BACK RETURN|REG AIR|sual, slow excuses +48163|125|26|3|12|12301.44|0.05|0.05|N|O|1997-03-14|1997-05-07|1997-04-06|NONE|REG AIR|ts haggle fu +48163|723|24|4|36|58453.92|0.07|0.04|N|O|1997-04-01|1997-03-28|1997-05-01|TAKE BACK RETURN|MAIL|kly special requests. ca +48164|132|85|1|33|34060.29|0.08|0.02|N|O|1995-12-13|1995-12-23|1995-12-14|COLLECT COD|AIR|ns sleep after the slyly ironic +48165|1462|63|1|11|14998.06|0.01|0.03|R|F|1993-11-09|1994-01-15|1993-11-18|DELIVER IN PERSON|REG AIR|onic accounts unwind furiously above th +48165|62|38|2|13|12506.78|0.10|0.00|R|F|1993-11-21|1994-01-27|1993-12-08|TAKE BACK RETURN|MAIL| alongside of the even grouches. even, quie +48166|132|85|1|36|37156.68|0.03|0.05|N|O|1996-10-28|1996-09-09|1996-11-27|COLLECT COD|RAIL|against the asymptotes. slyly +48166|1689|90|2|48|76352.64|0.07|0.03|N|O|1996-09-28|1996-10-14|1996-10-15|NONE|MAIL|yly above the bold ideas! pending theodolit +48167|250|32|1|2|2300.50|0.09|0.04|A|F|1994-10-14|1994-10-30|1994-10-24|COLLECT COD|SHIP|bold packages mold permane +48167|1059|65|2|17|16320.85|0.07|0.01|R|F|1994-09-25|1994-10-28|1994-10-15|COLLECT COD|TRUCK|atelets beneath the deposits use in p +48167|692|55|3|36|57336.84|0.10|0.08|A|F|1994-10-23|1994-11-08|1994-11-19|COLLECT COD|REG AIR| special, +48167|31|32|4|8|7448.24|0.10|0.04|A|F|1994-11-19|1994-11-14|1994-12-05|NONE|AIR|es hang furiously +48167|1305|6|5|9|10856.70|0.05|0.06|A|F|1994-09-15|1994-11-29|1994-10-04|COLLECT COD|AIR| furiously blithe +48167|493|81|6|4|5573.96|0.07|0.02|R|F|1994-10-31|1994-10-27|1994-11-07|NONE|FOB|kly final requests cajole f +48192|811|11|1|34|58201.54|0.08|0.06|A|F|1995-03-16|1995-02-02|1995-03-31|COLLECT COD|MAIL|ithely express accounts? furiously c +48192|655|49|2|26|40446.90|0.02|0.05|A|F|1995-03-12|1995-01-16|1995-03-13|COLLECT COD|MAIL|fully quiet warthogs +48192|1145|18|3|25|26153.50|0.01|0.07|R|F|1994-12-20|1995-02-26|1995-01-12|NONE|FOB|deposits along the ironic pinto b +48192|1477|78|4|19|26190.93|0.10|0.02|R|F|1994-12-20|1995-01-21|1995-01-19|TAKE BACK RETURN|TRUCK| regular ideas doubt quickly +48192|1582|23|5|18|26704.44|0.08|0.08|R|F|1995-03-06|1995-02-08|1995-03-13|DELIVER IN PERSON|SHIP| notornis wake about the carefully regul +48193|1502|43|1|36|50526.00|0.02|0.01|N|O|1996-10-17|1996-10-28|1996-11-15|NONE|FOB| sentiments +48193|1111|84|2|9|9108.99|0.03|0.03|N|O|1996-09-05|1996-10-13|1996-09-20|DELIVER IN PERSON|FOB|ing packages. ironic, +48193|171|72|3|22|23565.74|0.07|0.03|N|O|1996-08-30|1996-11-06|1996-09-16|DELIVER IN PERSON|RAIL|he furiously ironic courts cajole pint +48194|917|20|1|46|83623.86|0.05|0.00|N|O|1997-12-27|1997-11-28|1998-01-13|COLLECT COD|FOB|across the blithely regular dolphins; +48194|1244|45|2|23|26340.52|0.06|0.06|N|O|1998-01-01|1997-11-24|1998-01-11|DELIVER IN PERSON|AIR|. carefully bold ac +48194|552|53|3|14|20335.70|0.06|0.02|N|O|1998-01-26|1997-11-17|1998-02-07|DELIVER IN PERSON|SHIP| bold deposits wake blith +48195|1483|62|1|39|53994.72|0.10|0.03|R|F|1993-12-31|1994-01-30|1994-01-29|COLLECT COD|SHIP|uriously regular dependenc +48195|266|48|2|6|6997.56|0.09|0.00|A|F|1993-12-01|1994-01-21|1993-12-02|COLLECT COD|SHIP|s wake quickly even, bold theodolites +48195|467|26|3|47|64270.62|0.00|0.04|A|F|1994-01-10|1994-01-21|1994-02-03|TAKE BACK RETURN|SHIP|y unusual re +48195|1428|68|4|23|30576.66|0.01|0.05|A|F|1994-02-15|1994-01-28|1994-03-13|COLLECT COD|MAIL|ions across the ironic gifts sublate eve +48195|515|6|5|29|41049.79|0.08|0.04|A|F|1994-01-16|1994-02-12|1994-01-23|TAKE BACK RETURN|TRUCK|ve finally inside the furiously +48196|898|65|1|29|52167.81|0.00|0.02|N|O|1998-05-11|1998-03-22|1998-06-04|COLLECT COD|FOB|s are slyly a +48196|142|43|2|8|8337.12|0.08|0.02|N|O|1998-04-04|1998-03-10|1998-04-15|NONE|MAIL|ts. furiously regular pearls sle +48196|494|24|3|19|26495.31|0.03|0.06|N|O|1998-02-26|1998-04-09|1998-03-08|TAKE BACK RETURN|FOB|s pinto beans? regular, pendi +48196|405|35|4|13|16970.20|0.00|0.07|N|O|1998-03-18|1998-03-16|1998-03-25|NONE|AIR|riously pen +48196|1315|92|5|29|35272.99|0.06|0.03|N|O|1998-01-19|1998-03-11|1998-01-27|DELIVER IN PERSON|MAIL| since the slyly regular +48197|1849|79|1|40|70033.60|0.05|0.02|R|F|1992-05-08|1992-07-15|1992-05-09|TAKE BACK RETURN|REG AIR|. bold, regular ideas use across +48197|1670|53|2|11|17288.37|0.05|0.05|A|F|1992-06-14|1992-07-30|1992-07-03|TAKE BACK RETURN|FOB|ress requests poach +48197|154|81|3|28|29516.20|0.00|0.05|R|F|1992-07-19|1992-07-06|1992-07-22|TAKE BACK RETURN|SHIP|y silent ideas. enticingly final pi +48197|58|34|4|8|7664.40|0.04|0.01|A|F|1992-07-30|1992-07-14|1992-08-02|COLLECT COD|MAIL|g to the ruthlessly bold accounts caj +48197|1333|34|5|15|18514.95|0.06|0.03|A|F|1992-07-31|1992-07-17|1992-08-10|COLLECT COD|REG AIR|fluffily regular requests wake slyly +48197|465|66|6|31|42329.26|0.04|0.00|A|F|1992-07-27|1992-07-19|1992-07-30|DELIVER IN PERSON|REG AIR|lyly even accounts detect q +48197|1133|34|7|4|4136.52|0.04|0.06|A|F|1992-06-11|1992-06-30|1992-07-10|COLLECT COD|TRUCK|requests are. silent pa +48198|397|26|1|37|48003.43|0.06|0.02|R|F|1995-01-27|1995-02-13|1995-02-18|DELIVER IN PERSON|MAIL|sely ironi +48198|253|81|2|6|6919.50|0.04|0.07|A|F|1995-01-29|1995-01-05|1995-02-27|NONE|FOB|ithely regula +48198|741|42|3|31|50893.94|0.08|0.04|R|F|1995-03-08|1995-01-15|1995-03-20|NONE|MAIL|symptotes. special +48198|1262|100|4|8|9306.08|0.07|0.02|R|F|1994-12-28|1995-02-15|1995-01-15|TAKE BACK RETURN|AIR|sits. caref +48198|1736|79|5|17|27841.41|0.04|0.07|R|F|1995-02-12|1995-01-12|1995-03-08|TAKE BACK RETURN|AIR|foxes promise final, special requ +48199|1795|80|1|49|83142.71|0.01|0.00|R|F|1994-05-02|1994-04-04|1994-05-05|NONE|REG AIR|ts unwind furiously ab +48199|1792|19|2|24|40650.96|0.05|0.07|R|F|1994-02-17|1994-04-06|1994-03-14|TAKE BACK RETURN|RAIL|after the deposits. pa +48199|1480|81|3|37|51114.76|0.02|0.01|R|F|1994-02-17|1994-03-12|1994-03-08|DELIVER IN PERSON|FOB|ss realms sleep. blithely p +48199|663|64|4|33|51600.78|0.03|0.05|A|F|1994-03-09|1994-03-26|1994-03-26|NONE|REG AIR|ffily special foxes are about the regul +48199|660|92|5|31|48380.46|0.06|0.04|R|F|1994-01-31|1994-02-23|1994-02-15|TAKE BACK RETURN|RAIL|uests grow. final requests use. s +48199|998|33|6|48|91151.52|0.03|0.05|A|F|1994-03-25|1994-03-10|1994-04-16|TAKE BACK RETURN|MAIL|ole blithely bold dolphins. quic +48224|748|81|1|23|37921.02|0.07|0.01|A|F|1993-11-06|1993-09-23|1993-12-05|TAKE BACK RETURN|FOB|uternes shall h +48224|1269|7|2|36|42129.36|0.06|0.01|A|F|1993-09-23|1993-09-22|1993-10-11|COLLECT COD|MAIL|foxes unwind carefully regular packages; +48224|1402|20|3|39|50832.60|0.01|0.06|A|F|1993-10-06|1993-08-23|1993-10-11|DELIVER IN PERSON|TRUCK|ways ironic foxes. fluffily even +48224|833|34|4|10|17338.30|0.02|0.00|R|F|1993-07-26|1993-09-17|1993-08-15|TAKE BACK RETURN|AIR|the pending warhorses. regular, bold r +48224|1573|54|5|23|33915.11|0.04|0.04|A|F|1993-10-26|1993-09-07|1993-11-09|NONE|AIR|ndencies. final package +48225|1041|42|1|11|10362.44|0.05|0.06|N|O|1996-02-09|1996-03-28|1996-03-07|TAKE BACK RETURN|SHIP|mptotes must use even instructions. foxes +48225|1783|10|2|2|3369.56|0.01|0.08|N|O|1996-05-04|1996-04-21|1996-05-23|COLLECT COD|FOB|al packages. slyly unusual theodol +48225|1165|74|3|12|12793.92|0.02|0.01|N|O|1996-02-17|1996-04-22|1996-02-20|NONE|TRUCK|ts wake. unusual, bold packag +48225|110|89|4|39|39394.29|0.00|0.06|N|O|1996-05-06|1996-03-21|1996-05-22|COLLECT COD|REG AIR|he even deposits would c +48225|511|2|5|26|36699.26|0.04|0.02|N|O|1996-05-20|1996-04-30|1996-06-11|COLLECT COD|FOB| according to the slyly even re +48225|379|36|6|9|11514.33|0.08|0.06|N|O|1996-04-11|1996-03-18|1996-05-09|DELIVER IN PERSON|FOB| furiously even accounts cajole slyly +48225|287|42|7|21|24932.88|0.07|0.08|N|O|1996-04-11|1996-03-15|1996-05-07|COLLECT COD|AIR|s use slowly ac +48226|1428|29|1|1|1329.42|0.06|0.07|R|F|1994-01-31|1994-02-15|1994-02-25|DELIVER IN PERSON|REG AIR|ructions haggle carefully above the blithe +48226|972|7|2|48|89902.56|0.08|0.08|A|F|1994-02-04|1994-03-14|1994-02-12|NONE|TRUCK|iously final pi +48226|131|10|3|39|40214.07|0.10|0.08|A|F|1994-02-26|1994-02-25|1994-03-16|TAKE BACK RETURN|AIR|efully slyly even packages. +48226|55|56|4|16|15280.80|0.06|0.01|A|F|1994-04-25|1994-02-10|1994-05-06|DELIVER IN PERSON|MAIL|out the slyly +48226|1678|61|5|27|42651.09|0.04|0.01|A|F|1994-01-16|1994-03-01|1994-01-30|DELIVER IN PERSON|REG AIR|lyly even p +48226|1771|72|6|44|73601.88|0.04|0.02|A|F|1994-01-30|1994-02-24|1994-03-01|NONE|SHIP|urts cajole. carefully re +48226|1932|77|7|30|55017.90|0.07|0.06|R|F|1994-01-24|1994-03-18|1994-02-01|DELIVER IN PERSON|REG AIR| packages about the fluffily unusual +48227|1677|60|1|40|63146.80|0.03|0.03|N|O|1998-10-18|1998-08-19|1998-11-12|NONE|AIR|ual instructions nag blithely bli +48227|1981|26|2|18|33893.64|0.02|0.02|N|O|1998-11-08|1998-08-13|1998-11-27|TAKE BACK RETURN|REG AIR|ges-- slyly regular ac +48227|1770|55|3|12|20061.24|0.08|0.05|N|O|1998-08-12|1998-09-01|1998-08-14|TAKE BACK RETURN|SHIP|ounts. furiously final requests han +48227|1154|91|4|47|49592.05|0.03|0.01|N|O|1998-11-09|1998-08-24|1998-12-02|DELIVER IN PERSON|FOB|, even dependencies. p +48227|1074|10|5|18|17551.26|0.03|0.02|N|O|1998-10-06|1998-10-06|1998-10-29|COLLECT COD|SHIP|ffily regu +48227|1955|100|6|47|87276.65|0.10|0.04|N|O|1998-09-04|1998-09-29|1998-09-07|NONE|AIR|y even requests. regular f +48228|784|17|1|19|32010.82|0.02|0.03|N|O|1995-06-26|1995-08-04|1995-07-01|COLLECT COD|MAIL|nic dependencies. ideas haggle af +48228|1233|8|2|7|7939.61|0.01|0.04|N|O|1995-09-24|1995-07-12|1995-10-23|DELIVER IN PERSON|FOB|ainst the regular decoys haggle fluffily +48228|884|84|3|29|51761.52|0.07|0.05|N|O|1995-08-23|1995-08-30|1995-09-10|DELIVER IN PERSON|AIR|thely pending pinto beans nag against t +48229|1202|77|1|49|54056.80|0.08|0.04|N|O|1998-01-27|1998-02-08|1998-02-01|COLLECT COD|RAIL|ess packages. blithely bold deposits hagg +48229|1024|25|2|37|34225.74|0.07|0.06|N|O|1998-03-31|1998-02-22|1998-04-12|NONE|MAIL|s cajole slyly afte +48229|756|53|3|36|59643.00|0.00|0.04|N|O|1998-02-01|1998-03-10|1998-02-21|NONE|FOB|ding, unusual c +48229|1860|90|4|46|81045.56|0.07|0.02|N|O|1998-01-10|1998-03-21|1998-02-01|COLLECT COD|MAIL|oss the unusual deposits. +48229|146|47|5|25|26153.50|0.02|0.02|N|O|1998-02-26|1998-02-12|1998-03-07|NONE|SHIP|es. ironic deposits use blithely ab +48229|706|71|6|26|41774.20|0.09|0.04|N|O|1998-04-04|1998-02-17|1998-04-10|NONE|REG AIR|he furiously regular deposi +48229|923|26|7|44|80252.48|0.05|0.07|N|O|1998-03-27|1998-02-20|1998-04-20|TAKE BACK RETURN|REG AIR|deposits slee +48230|383|40|1|7|8983.66|0.03|0.04|A|F|1994-06-21|1994-04-21|1994-06-26|NONE|RAIL|e the carefully eve +48230|1747|74|2|41|67598.34|0.03|0.05|A|F|1994-06-26|1994-05-13|1994-07-22|NONE|TRUCK| deposits sleep final requests. requests in +48230|1225|26|3|24|27029.28|0.04|0.02|A|F|1994-05-16|1994-04-14|1994-05-22|DELIVER IN PERSON|AIR|n requests cajole fu +48230|376|77|4|10|12763.70|0.04|0.02|A|F|1994-03-03|1994-04-29|1994-03-21|TAKE BACK RETURN|FOB| final accounts are among t +48230|917|20|5|33|59991.03|0.05|0.03|R|F|1994-03-21|1994-04-23|1994-04-15|COLLECT COD|TRUCK|e accounts. requests breach carefully car +48231|847|14|1|7|12234.88|0.04|0.00|A|F|1992-09-09|1992-11-15|1992-09-13|NONE|TRUCK|s use after the packages. f +48231|1066|37|2|22|21275.32|0.02|0.01|R|F|1992-08-31|1992-10-07|1992-09-28|COLLECT COD|RAIL|c requests breach slyly unusual theodo +48231|1457|97|3|9|12226.05|0.09|0.08|A|F|1992-09-14|1992-10-13|1992-09-18|NONE|RAIL|are. blithely sile +48256|1019|55|1|11|10120.11|0.06|0.04|R|F|1995-04-12|1995-07-01|1995-04-14|COLLECT COD|AIR|al platelets. +48257|377|6|1|15|19160.55|0.10|0.07|R|F|1994-07-21|1994-06-01|1994-08-08|TAKE BACK RETURN|RAIL|cial asymptotes +48257|1713|14|2|9|14532.39|0.04|0.08|R|F|1994-08-10|1994-07-03|1994-08-30|COLLECT COD|SHIP|terns solve furiously. sl +48258|1599|40|1|21|31512.39|0.08|0.00|N|O|1996-07-18|1996-08-09|1996-08-15|DELIVER IN PERSON|MAIL|ar gifts sleep carefully according to +48258|711|12|2|8|12893.68|0.10|0.08|N|O|1996-08-24|1996-08-11|1996-09-17|NONE|AIR|ages sleep slyl +48259|1574|75|1|41|60498.37|0.04|0.05|A|F|1993-11-21|1993-12-04|1993-11-23|DELIVER IN PERSON|AIR| regular re +48259|286|41|2|4|4745.12|0.06|0.02|R|F|1993-10-24|1993-11-28|1993-10-30|COLLECT COD|MAIL|, regular instruc +48259|563|24|3|35|51224.60|0.10|0.05|R|F|1993-10-15|1993-11-16|1993-11-08|TAKE BACK RETURN|AIR|ar packages +48259|858|92|4|24|42212.40|0.04|0.03|A|F|1994-02-11|1993-12-07|1994-02-24|TAKE BACK RETURN|SHIP|sits boost quickly do +48260|1279|91|1|18|21244.86|0.06|0.08|N|O|1996-12-21|1997-02-28|1997-01-13|TAKE BACK RETURN|FOB|express accounts. quickly fina +48260|1714|15|2|33|53318.43|0.10|0.06|N|O|1997-04-11|1997-01-13|1997-04-16|COLLECT COD|REG AIR|ular dugouts. pinto beans haggle. care +48260|1716|17|3|20|32354.20|0.04|0.04|N|O|1997-02-02|1997-02-27|1997-02-05|COLLECT COD|RAIL| excuses among the carefully +48260|1163|72|4|12|12769.92|0.09|0.01|N|O|1997-01-12|1997-03-02|1997-01-26|NONE|TRUCK| affix carefully across the blithel +48260|721|54|5|31|50273.32|0.01|0.00|N|O|1997-01-09|1997-02-12|1997-01-15|TAKE BACK RETURN|MAIL|carefully express courts boost furiously so +48261|539|100|1|4|5758.12|0.07|0.00|A|F|1995-04-11|1995-05-02|1995-04-22|NONE|MAIL|alongside of the slyly special +48261|856|57|2|44|77301.40|0.06|0.00|A|F|1995-05-04|1995-06-10|1995-06-03|NONE|RAIL|ng to the carefully even +48261|1166|3|3|16|17074.56|0.01|0.07|R|F|1995-04-07|1995-04-19|1995-04-28|DELIVER IN PERSON|RAIL|special deposits wake blith +48261|1240|15|4|1|1141.24|0.07|0.01|A|F|1995-04-13|1995-05-11|1995-05-10|DELIVER IN PERSON|RAIL|ronic accounts across the pinto beans grow +48262|993|94|1|25|47349.75|0.10|0.01|N|O|1996-06-06|1996-06-04|1996-06-21|TAKE BACK RETURN|AIR|lyly final accou +48262|727|92|2|37|60225.64|0.09|0.08|N|O|1996-07-07|1996-06-10|1996-07-23|NONE|AIR|nic ideas +48262|984|87|3|15|28274.70|0.05|0.06|N|O|1996-06-06|1996-05-28|1996-07-04|COLLECT COD|TRUCK|arefully silent accounts. c +48263|1641|24|1|33|50907.12|0.05|0.03|A|F|1993-05-03|1993-04-11|1993-05-21|NONE|SHIP|al requests. +48263|897|97|2|9|16181.01|0.08|0.08|R|F|1993-03-14|1993-04-12|1993-04-01|COLLECT COD|MAIL|s. realms sleep blithely across the furio +48263|225|7|3|11|12377.42|0.09|0.04|A|F|1993-06-20|1993-05-12|1993-07-07|COLLECT COD|FOB|ep. regular plat +48263|291|46|4|50|59564.50|0.00|0.00|A|F|1993-04-18|1993-06-05|1993-05-16|DELIVER IN PERSON|RAIL|ainst the blith +48263|689|21|5|29|46100.72|0.02|0.08|R|F|1993-04-05|1993-05-25|1993-04-24|TAKE BACK RETURN|FOB|ld have to wake regula +48288|522|23|1|4|5690.08|0.10|0.07|N|O|1995-11-18|1995-10-20|1995-11-20|TAKE BACK RETURN|REG AIR|unusual pinto +48288|263|91|2|5|5816.30|0.04|0.00|N|O|1995-11-21|1995-09-25|1995-12-14|COLLECT COD|MAIL|ggle furiously blithely re +48289|1310|49|1|47|56931.57|0.10|0.02|N|O|1997-08-28|1997-09-08|1997-08-29|NONE|MAIL|l accounts sleep according to t +48289|1492|93|2|25|34837.25|0.01|0.04|N|O|1997-07-08|1997-07-30|1997-07-20|TAKE BACK RETURN|AIR|y special accounts sleep afte +48289|304|61|3|38|45763.40|0.03|0.04|N|O|1997-07-12|1997-07-11|1997-07-31|TAKE BACK RETURN|MAIL| carefully express ac +48289|145|72|4|3|3135.42|0.08|0.06|N|O|1997-06-23|1997-07-13|1997-07-17|TAKE BACK RETURN|FOB|e final, ironic deposits. carefu +48289|1409|27|5|34|44553.60|0.02|0.07|N|O|1997-10-06|1997-07-19|1997-11-02|DELIVER IN PERSON|AIR|s above the requests integrate depo +48289|991|92|6|42|79463.58|0.02|0.01|N|O|1997-09-12|1997-08-01|1997-09-24|DELIVER IN PERSON|REG AIR| fluffily. final packages +48290|1030|36|1|17|15827.51|0.10|0.03|N|O|1998-02-08|1998-01-23|1998-02-11|COLLECT COD|MAIL| sometimes iron +48290|1778|79|2|43|72230.11|0.02|0.05|N|O|1998-01-08|1998-01-11|1998-01-23|COLLECT COD|TRUCK|ach furiousl +48290|881|48|3|4|7127.52|0.07|0.07|N|O|1997-12-23|1998-01-20|1998-01-04|TAKE BACK RETURN|AIR|fix quickly along the furiously final ac +48290|1092|98|4|9|8937.81|0.03|0.02|N|O|1998-03-01|1998-01-17|1998-03-09|NONE|REG AIR|ckages boost evenly regular packages. blit +48290|1488|67|5|2|2778.96|0.02|0.04|N|O|1998-01-16|1998-01-06|1998-02-14|COLLECT COD|RAIL|quickly unusual pinto beans use toward the +48290|1156|57|6|35|37000.25|0.07|0.08|N|O|1997-12-04|1998-02-04|1997-12-08|DELIVER IN PERSON|TRUCK|ully regular pinto beans. re +48290|1244|45|7|24|27485.76|0.02|0.07|N|O|1998-02-27|1998-01-30|1998-03-18|NONE|FOB|l accounts. regular ideas wake. pen +48291|1504|5|1|24|33732.00|0.09|0.07|N|O|1996-12-25|1996-12-19|1996-12-26|DELIVER IN PERSON|MAIL|l foxes above the c +48292|1915|60|1|43|78127.13|0.05|0.03|N|O|1998-06-18|1998-07-17|1998-07-10|TAKE BACK RETURN|FOB| accounts use car +48292|1585|26|2|2|2973.16|0.10|0.00|N|O|1998-08-10|1998-06-11|1998-09-04|COLLECT COD|REG AIR|xpress ide +48293|885|52|1|26|46432.88|0.05|0.06|A|F|1992-06-24|1992-05-19|1992-07-23|COLLECT COD|FOB|foxes are. blithely +48293|367|24|2|19|24079.84|0.04|0.06|A|F|1992-07-17|1992-06-13|1992-07-20|NONE|FOB|ns. carefully regular requests +48293|1206|44|3|9|9964.80|0.07|0.06|R|F|1992-07-10|1992-05-20|1992-07-13|NONE|TRUCK|r packages are blithely. quickly unusua +48294|1227|28|1|7|7897.54|0.09|0.02|R|F|1993-09-12|1993-08-06|1993-10-02|COLLECT COD|AIR|t theodolites a +48294|1172|45|2|27|28975.59|0.07|0.04|R|F|1993-07-15|1993-08-15|1993-07-25|NONE|TRUCK|l accounts sleep sl +48295|1897|27|1|28|50368.92|0.00|0.07|R|F|1995-03-13|1995-01-27|1995-04-12|NONE|FOB|packages use fluffily after the carefull +48295|602|65|2|17|25544.20|0.10|0.04|R|F|1994-12-20|1995-01-19|1994-12-31|DELIVER IN PERSON|FOB|evenly even d +48295|498|28|3|15|20977.35|0.05|0.04|A|F|1995-02-14|1995-01-05|1995-02-19|COLLECT COD|REG AIR|nly sly ideas are bli +48320|23|49|1|48|44304.96|0.09|0.02|N|O|1995-12-23|1995-12-17|1996-01-20|NONE|SHIP|odolites snooze slyly acc +48320|566|27|2|42|61595.52|0.03|0.04|N|O|1996-02-12|1995-12-27|1996-02-19|COLLECT COD|AIR| carefully slyly ironic ideas. blithely iro +48320|1406|24|3|9|11766.60|0.05|0.00|N|O|1996-01-25|1996-01-15|1996-02-11|DELIVER IN PERSON|AIR|the bold accounts sublate slyly a +48320|604|36|4|25|37615.00|0.02|0.02|N|O|1995-11-30|1996-01-13|1995-12-05|TAKE BACK RETURN|FOB|ully ironic accounts boost across the qui +48321|1176|77|1|13|14003.21|0.02|0.06|R|F|1993-11-05|1993-10-12|1993-12-04|TAKE BACK RETURN|FOB|across the pending theodolites +48321|1901|90|2|18|32452.20|0.04|0.08|A|F|1993-08-13|1993-09-05|1993-08-31|TAKE BACK RETURN|REG AIR|aggle carefully. +48321|295|96|3|34|40639.86|0.02|0.04|A|F|1993-08-12|1993-10-17|1993-08-21|DELIVER IN PERSON|SHIP| accounts s +48321|311|12|4|14|16958.34|0.04|0.01|R|F|1993-08-07|1993-09-25|1993-08-14|TAKE BACK RETURN|SHIP|ons print furiously beside the quickl +48322|1988|21|1|1|1889.98|0.03|0.00|A|F|1992-04-07|1992-04-12|1992-04-20|TAKE BACK RETURN|TRUCK|egularly final req +48322|129|82|2|33|33960.96|0.01|0.07|R|F|1992-05-16|1992-05-26|1992-05-26|NONE|MAIL|ily? regular packages against t +48323|616|48|1|4|6066.44|0.01|0.05|A|F|1993-11-05|1994-01-15|1993-11-30|NONE|REG AIR|even theodolites boost quickly slyly regula +48323|168|21|2|1|1068.16|0.02|0.04|R|F|1993-11-22|1993-12-13|1993-11-26|TAKE BACK RETURN|FOB|r the slyly pend +48323|657|51|3|23|35825.95|0.05|0.00|A|F|1994-01-05|1993-12-15|1994-01-13|NONE|MAIL|ccounts. slyly eve +48323|1315|16|4|6|7297.86|0.05|0.08|R|F|1994-01-16|1993-12-18|1994-01-22|DELIVER IN PERSON|MAIL|accounts through the idly +48324|1957|90|1|46|85511.70|0.08|0.07|R|F|1993-09-23|1993-07-23|1993-10-21|NONE|AIR|requests about t +48324|1924|57|2|22|40170.24|0.00|0.06|A|F|1993-06-27|1993-07-28|1993-07-26|DELIVER IN PERSON|TRUCK|kly express asymptotes slee +48324|1989|22|3|19|35928.62|0.07|0.04|A|F|1993-08-20|1993-08-25|1993-09-19|DELIVER IN PERSON|REG AIR|counts. bold asymptotes do +48325|1735|20|1|15|24550.95|0.03|0.08|N|O|1996-03-18|1996-05-09|1996-04-16|DELIVER IN PERSON|FOB|dazzle furiously re +48326|401|2|1|3|3904.20|0.03|0.01|A|F|1992-05-06|1992-04-06|1992-06-03|NONE|RAIL|nts haggle furiously iron +48326|982|51|2|8|15063.84|0.06|0.08|A|F|1992-03-08|1992-03-05|1992-03-10|COLLECT COD|TRUCK|y express pinto beans. furiously ironi +48326|1397|12|3|16|20774.24|0.10|0.07|R|F|1992-04-23|1992-03-26|1992-05-21|DELIVER IN PERSON|REG AIR|ajole. silent packages +48326|744|77|4|18|29605.32|0.00|0.00|R|F|1992-04-08|1992-03-27|1992-04-23|NONE|TRUCK|ts serve. final a +48327|1383|84|1|5|6421.90|0.06|0.01|R|F|1994-10-15|1994-09-12|1994-10-23|COLLECT COD|AIR|uctions. regularly ironic accounts +48327|1230|31|2|50|56561.50|0.06|0.02|A|F|1994-10-28|1994-11-01|1994-10-30|TAKE BACK RETURN|REG AIR|lphins use furiously against the iro +48327|1899|86|3|5|9004.45|0.06|0.00|R|F|1994-08-20|1994-09-11|1994-08-25|COLLECT COD|FOB|to beans nag quickly against +48327|655|87|4|38|59114.70|0.00|0.02|R|F|1994-11-14|1994-10-29|1994-12-08|COLLECT COD|REG AIR|ven requests. quick, special +48327|194|73|5|24|26260.56|0.04|0.00|A|F|1994-11-24|1994-09-10|1994-12-21|COLLECT COD|REG AIR|yly bold theodolites are alongside of +48327|529|90|6|12|17154.24|0.05|0.01|A|F|1994-12-07|1994-11-08|1994-12-12|TAKE BACK RETURN|SHIP|regular ideas use furiously carefull +48352|34|60|1|12|11208.36|0.05|0.08|N|O|1997-06-17|1997-06-18|1997-07-08|TAKE BACK RETURN|TRUCK| carefully above the +48353|322|7|1|2|2444.64|0.00|0.03|A|F|1993-02-12|1993-02-05|1993-03-11|NONE|MAIL|thely pending +48353|1182|55|2|35|37911.30|0.08|0.00|R|F|1992-12-30|1993-03-01|1993-01-09|COLLECT COD|AIR|nding packages are. blithely +48353|909|44|3|44|79635.60|0.01|0.01|A|F|1993-01-12|1993-02-16|1993-02-01|DELIVER IN PERSON|TRUCK|its according to the platelets +48353|1493|33|4|20|27889.80|0.00|0.05|A|F|1993-03-16|1993-02-03|1993-04-01|TAKE BACK RETURN|AIR| boost fluffily packages. +48353|140|19|5|47|48886.58|0.02|0.01|A|F|1993-01-28|1993-02-10|1993-02-21|TAKE BACK RETURN|TRUCK|s. quickly regular platelets nag am +48354|1736|37|1|9|14739.57|0.04|0.06|A|F|1995-05-04|1995-06-10|1995-05-22|TAKE BACK RETURN|SHIP|es haggle furiou +48355|1406|7|1|36|47066.40|0.09|0.06|N|O|1995-08-17|1995-10-09|1995-08-21|TAKE BACK RETURN|AIR|usly express ideas. final, reg +48355|1614|15|2|5|7578.05|0.09|0.05|N|O|1995-12-07|1995-09-20|1995-12-31|COLLECT COD|REG AIR|express packages. slyly +48355|1187|24|3|11|11969.98|0.00|0.01|N|O|1995-11-10|1995-10-07|1995-11-23|NONE|MAIL|er the instru +48355|1374|13|4|43|54840.91|0.05|0.05|N|O|1995-09-14|1995-10-04|1995-10-06|DELIVER IN PERSON|REG AIR|pinto beans affix even +48355|1724|25|5|8|13005.76|0.07|0.00|N|O|1995-11-02|1995-10-27|1995-11-09|DELIVER IN PERSON|TRUCK|r ideas integrate blithely ironic depos +48355|1174|83|6|6|6451.02|0.04|0.03|N|O|1995-09-21|1995-11-07|1995-09-25|NONE|MAIL|n excuses are slyly alongside of +48355|1361|100|7|20|25247.20|0.07|0.07|N|O|1995-12-13|1995-10-28|1995-12-16|TAKE BACK RETURN|REG AIR| are special, even deposits. platelet +48356|1934|79|1|33|60585.69|0.06|0.06|N|O|1997-05-02|1997-06-27|1997-05-06|DELIVER IN PERSON|REG AIR|to the furious +48356|981|84|2|31|58341.38|0.02|0.06|N|O|1997-06-25|1997-06-16|1997-07-24|TAKE BACK RETURN|REG AIR|sts. slyly ironic exc +48356|1955|88|3|35|64993.25|0.08|0.02|N|O|1997-06-03|1997-06-30|1997-06-30|DELIVER IN PERSON|FOB|e furiously re +48356|1915|48|4|23|41788.93|0.05|0.05|N|O|1997-05-30|1997-06-09|1997-06-14|DELIVER IN PERSON|MAIL| the furiously silent foxes cajole furi +48356|917|20|5|4|7271.64|0.03|0.04|N|O|1997-06-11|1997-06-25|1997-07-03|COLLECT COD|FOB|r foxes after the slyly regu +48356|390|47|6|9|11613.51|0.03|0.04|N|O|1997-05-13|1997-06-23|1997-06-09|COLLECT COD|AIR|heodolites-- closely even deposits haggle; +48357|1226|1|1|12|13526.64|0.03|0.08|A|F|1994-04-16|1994-05-18|1994-05-16|NONE|TRUCK|s. fluffily ironic a +48357|522|83|2|4|5690.08|0.06|0.06|A|F|1994-06-07|1994-06-13|1994-06-26|COLLECT COD|RAIL|against the regular, ironic p +48357|607|8|3|30|45228.00|0.08|0.07|R|F|1994-07-03|1994-05-11|1994-07-07|TAKE BACK RETURN|RAIL| have to use slyly. thinly regular +48357|10|86|4|41|37310.41|0.02|0.01|R|F|1994-07-21|1994-05-26|1994-07-30|NONE|AIR|ins use-- ironic co +48357|1401|80|5|37|48188.80|0.04|0.07|A|F|1994-04-21|1994-06-07|1994-04-25|NONE|FOB|riously blithely special r +48357|1102|3|6|18|18055.80|0.02|0.01|A|F|1994-05-18|1994-04-29|1994-06-12|TAKE BACK RETURN|FOB|e the silent reques +48358|1325|26|1|28|34336.96|0.01|0.04|N|O|1997-09-07|1997-09-29|1997-09-12|COLLECT COD|AIR|e quickly according to the thinly unusual +48358|910|13|2|32|57949.12|0.10|0.00|N|O|1997-09-09|1997-11-08|1997-09-24|TAKE BACK RETURN|SHIP|ses. slyly express multipliers boost carefu +48359|635|98|1|25|38390.75|0.07|0.03|N|O|1998-03-04|1998-01-14|1998-03-24|TAKE BACK RETURN|SHIP|unts. carefully unusual c +48359|1407|47|2|40|52336.00|0.02|0.04|N|O|1998-02-04|1998-02-08|1998-02-13|DELIVER IN PERSON|TRUCK|es after the deposit +48359|1957|46|3|31|57627.45|0.09|0.08|N|O|1998-02-24|1998-02-01|1998-03-07|NONE|FOB|ously carefully even ideas. sl +48359|307|8|4|15|18109.50|0.00|0.01|N|O|1997-12-21|1998-01-29|1997-12-29|COLLECT COD|RAIL|ly ironic requests along t +48384|222|50|1|44|49377.68|0.09|0.00|R|F|1994-10-02|1994-10-06|1994-10-28|COLLECT COD|RAIL| enticingly ironic warthogs +48384|629|23|2|26|39770.12|0.00|0.06|R|F|1994-09-12|1994-10-08|1994-10-08|NONE|TRUCK|etect. furiously ironic dep +48384|609|10|3|11|16605.60|0.10|0.00|R|F|1994-09-10|1994-09-23|1994-10-07|DELIVER IN PERSON|MAIL|ular pinto beans must have to serve. reg +48385|1676|77|1|46|72572.82|0.00|0.03|R|F|1994-09-28|1994-10-25|1994-10-27|COLLECT COD|RAIL|sits sleep. furiou +48385|236|64|2|16|18179.68|0.00|0.02|A|F|1994-12-27|1994-11-01|1995-01-16|TAKE BACK RETURN|AIR|the regular requests. regular, regular pac +48385|922|91|3|37|67448.04|0.02|0.05|A|F|1994-09-20|1994-10-27|1994-09-30|TAKE BACK RETURN|TRUCK|ackages. caref +48385|82|33|4|31|30444.48|0.09|0.03|R|F|1994-11-03|1994-11-03|1994-11-17|DELIVER IN PERSON|MAIL|packages boost alongside of the regula +48385|1234|72|5|43|48814.89|0.07|0.08|R|F|1994-11-03|1994-12-12|1994-12-03|DELIVER IN PERSON|RAIL|ending accounts. fu +48385|1235|36|6|16|18179.68|0.06|0.04|R|F|1994-12-04|1994-11-05|1994-12-29|COLLECT COD|MAIL|ans-- ironic foxes haggle blithely furio +48386|1055|61|1|19|18164.95|0.01|0.07|N|O|1998-09-15|1998-08-21|1998-09-26|DELIVER IN PERSON|MAIL|, ironic packages. ex +48386|1278|16|2|46|54246.42|0.09|0.06|N|O|1998-06-26|1998-08-13|1998-07-24|TAKE BACK RETURN|TRUCK|osits. quic +48386|1727|28|3|7|11401.04|0.03|0.00|N|O|1998-09-29|1998-08-30|1998-10-08|NONE|MAIL|special package +48386|1618|19|4|36|54705.96|0.09|0.08|N|O|1998-09-14|1998-08-11|1998-10-08|COLLECT COD|FOB|d about the bold e +48387|365|22|1|37|46818.32|0.04|0.00|R|F|1992-06-16|1992-06-06|1992-07-11|COLLECT COD|TRUCK|luffily idly brave attainmen +48387|963|98|2|9|16775.64|0.06|0.00|A|F|1992-05-16|1992-04-20|1992-06-15|NONE|SHIP|ess, regular requests. blithely regula +48387|1207|8|3|41|45436.20|0.03|0.01|A|F|1992-05-19|1992-04-23|1992-06-02|COLLECT COD|REG AIR|ully pending packages integrate alon +48387|1060|96|4|41|39403.46|0.02|0.04|A|F|1992-05-13|1992-04-30|1992-06-03|NONE|REG AIR| deposits n +48387|1959|60|5|24|44662.80|0.08|0.02|R|F|1992-04-21|1992-04-19|1992-04-30|COLLECT COD|RAIL| ironic packages sleep furiously. +48387|1511|32|6|23|32487.73|0.02|0.00|A|F|1992-06-27|1992-05-07|1992-07-22|DELIVER IN PERSON|FOB| the blithely +48387|1310|11|7|38|46029.78|0.04|0.07|A|F|1992-06-08|1992-04-23|1992-06-14|DELIVER IN PERSON|FOB|kly regular accounts no +48388|922|91|1|49|89323.08|0.02|0.00|R|F|1994-11-15|1994-10-13|1994-11-29|COLLECT COD|TRUCK| even foxes. regular requests are +48388|1976|77|2|15|28169.55|0.09|0.04|R|F|1994-09-24|1994-11-02|1994-09-29|NONE|RAIL|special instructions sleep slyly pending +48389|1410|50|1|44|57702.04|0.05|0.04|N|O|1997-06-17|1997-05-09|1997-06-25|TAKE BACK RETURN|FOB|lly ironic deposits. sly +48389|775|8|2|35|58651.95|0.04|0.07|N|O|1997-04-21|1997-03-24|1997-05-05|TAKE BACK RETURN|FOB|ly bold requests boost quickly. slyly re +48389|1635|77|3|44|67611.72|0.02|0.02|N|O|1997-06-17|1997-05-16|1997-06-24|COLLECT COD|MAIL|ts boost slyly +48389|717|14|4|17|27501.07|0.02|0.03|N|O|1997-02-20|1997-04-01|1997-03-05|DELIVER IN PERSON|FOB|ly permanent id +48390|497|27|1|7|9782.43|0.02|0.06|R|F|1993-08-15|1993-09-08|1993-09-08|COLLECT COD|SHIP|- carefully ironic platele +48390|1890|77|2|7|12543.23|0.03|0.07|R|F|1993-08-12|1993-09-10|1993-08-31|DELIVER IN PERSON|AIR|ugouts according to the theodolit +48390|1954|99|3|24|44542.80|0.07|0.06|A|F|1993-08-18|1993-10-20|1993-08-27|NONE|RAIL|e bravely ironic, bold +48390|1471|72|4|23|31566.81|0.02|0.05|A|F|1993-09-05|1993-09-16|1993-09-12|COLLECT COD|RAIL|old depths. carefully regular +48391|753|18|1|2|3307.50|0.02|0.06|R|F|1993-12-31|1994-01-18|1994-01-18|TAKE BACK RETURN|AIR|uests are at the slyly +48391|1199|8|2|34|37406.46|0.02|0.02|A|F|1994-01-28|1994-01-25|1994-02-03|NONE|SHIP|y unusual packages. silently pendin +48391|1704|47|3|22|35325.40|0.07|0.02|R|F|1994-01-21|1993-12-11|1994-02-16|COLLECT COD|SHIP|s haggle upon the blithely +48391|12|63|4|36|32832.36|0.02|0.00|A|F|1994-01-28|1994-01-05|1994-02-13|DELIVER IN PERSON|FOB|lent, ironic grouches. +48391|405|35|5|18|23497.20|0.08|0.00|A|F|1994-02-10|1993-12-20|1994-03-06|COLLECT COD|TRUCK|ets cajole furiously. slyly regular +48391|331|88|6|39|48021.87|0.03|0.05|R|F|1994-02-06|1994-01-26|1994-02-13|TAKE BACK RETURN|MAIL|sits nag blithely express +48416|1634|76|1|12|18427.56|0.05|0.01|R|F|1994-07-08|1994-08-25|1994-07-14|TAKE BACK RETURN|TRUCK| requests. +48417|716|13|1|5|8083.55|0.10|0.04|N|O|1998-04-18|1998-01-29|1998-05-17|COLLECT COD|AIR|y always pending pinto +48418|622|54|1|11|16748.82|0.08|0.06|N|O|1996-03-18|1996-02-17|1996-03-21|COLLECT COD|RAIL|ctions wake quic +48418|163|16|2|47|49968.52|0.08|0.07|N|O|1996-04-25|1996-03-25|1996-05-22|COLLECT COD|MAIL|g the quickly bold +48418|788|89|3|41|69239.98|0.08|0.05|N|O|1996-04-19|1996-02-23|1996-04-21|DELIVER IN PERSON|SHIP| bold courts. stealthily +48418|1883|13|4|11|19633.68|0.10|0.06|N|O|1996-01-18|1996-03-20|1996-02-05|TAKE BACK RETURN|SHIP|to beans play car +48419|1864|8|1|4|7063.44|0.08|0.01|N|O|1997-10-22|1997-11-30|1997-11-10|TAKE BACK RETURN|AIR|structions sleep quickly so +48419|1110|47|2|25|25277.75|0.10|0.06|N|O|1997-10-21|1997-10-30|1997-10-24|COLLECT COD|SHIP|nto beans cajole blithely after the ironi +48419|1023|59|3|4|3696.08|0.08|0.03|N|O|1998-01-16|1997-12-11|1998-01-29|COLLECT COD|FOB|s, even foxes. b +48419|874|74|4|49|86968.63|0.07|0.02|N|O|1997-12-09|1997-11-27|1997-12-27|TAKE BACK RETURN|REG AIR|ding accounts. carefully unusual +48420|1703|30|1|32|51350.40|0.03|0.04|R|F|1995-01-27|1994-12-28|1995-02-17|NONE|FOB|s. fluffily express instructions +48420|1216|28|2|32|35750.72|0.06|0.05|R|F|1994-12-10|1994-12-31|1995-01-07|TAKE BACK RETURN|FOB|ickly busy asymptotes run +48420|378|35|3|45|57526.65|0.08|0.02|R|F|1994-11-11|1994-11-15|1994-11-21|COLLECT COD|AIR|ithely regular theodolites use. +48420|874|41|4|23|40822.01|0.06|0.04|A|F|1994-12-03|1994-12-13|1994-12-10|COLLECT COD|REG AIR|re slyly final accounts. care +48420|404|63|5|15|19566.00|0.00|0.03|R|F|1994-12-31|1994-12-02|1995-01-24|COLLECT COD|FOB| requests. express, special +48420|1429|8|6|13|17295.46|0.00|0.05|R|F|1995-01-05|1994-12-04|1995-01-12|COLLECT COD|SHIP|silent pinto beans-- requ +48421|767|68|1|16|26684.16|0.05|0.08|A|F|1993-05-01|1993-05-18|1993-05-09|COLLECT COD|REG AIR|blithely regular dependenci +48421|589|80|2|35|52135.30|0.09|0.07|A|F|1993-04-22|1993-06-24|1993-04-30|COLLECT COD|AIR|lar deposits alongside of the carefully +48421|1022|93|3|41|37843.82|0.02|0.03|A|F|1993-04-20|1993-05-31|1993-05-16|TAKE BACK RETURN|RAIL|ic grouches haggle slyly express dep +48422|1005|76|1|44|39864.00|0.05|0.05|N|O|1998-06-07|1998-06-17|1998-07-02|NONE|REG AIR|ke. ironic instructions would +48422|1729|72|2|38|61967.36|0.00|0.05|N|O|1998-06-27|1998-05-30|1998-07-26|DELIVER IN PERSON|MAIL|s accounts wake slyly slyly final foxes. +48422|1940|41|3|47|86571.18|0.06|0.06|N|O|1998-07-03|1998-05-16|1998-07-15|COLLECT COD|FOB|nto beans run. slyly regular inst +48422|1575|16|4|3|4429.71|0.03|0.02|N|O|1998-07-10|1998-05-16|1998-07-17|NONE|MAIL|y even packages. even, special +48422|243|98|5|7|8002.68|0.00|0.04|N|O|1998-04-20|1998-06-26|1998-04-22|NONE|FOB|e express asymptotes. blith +48423|1649|91|1|1|1550.64|0.08|0.05|R|F|1992-12-15|1993-01-25|1992-12-27|TAKE BACK RETURN|RAIL|s affix fluffi +48423|965|68|2|16|29855.36|0.01|0.05|R|F|1992-12-18|1992-12-15|1992-12-24|TAKE BACK RETURN|AIR|ar frays alongside of the permanent +48423|470|58|3|32|43855.04|0.07|0.03|A|F|1992-11-17|1993-01-24|1992-11-25|NONE|TRUCK|boost blithely special foxes. pending, +48423|1832|19|4|13|22539.79|0.02|0.02|R|F|1992-12-28|1993-01-23|1993-01-17|TAKE BACK RETURN|AIR|iresias need to sublate. c +48448|511|2|1|41|57871.91|0.08|0.04|R|F|1993-01-06|1993-02-14|1993-01-14|NONE|REG AIR|lites nag. furiously regular +48448|1604|46|2|46|69257.60|0.10|0.04|R|F|1993-02-20|1993-01-09|1993-03-21|COLLECT COD|REG AIR|s nag even requests. +48448|1754|97|3|21|34770.75|0.03|0.00|A|F|1992-12-03|1993-01-16|1992-12-19|TAKE BACK RETURN|FOB|y quickly daring braids. foxes c +48448|832|32|4|3|5198.49|0.00|0.03|A|F|1993-02-28|1993-01-31|1993-03-09|DELIVER IN PERSON|MAIL| ironic request +48448|1650|92|5|19|29481.35|0.06|0.02|R|F|1993-01-30|1993-02-12|1993-02-17|DELIVER IN PERSON|AIR|nic, regular packages. final requests +48448|1243|18|6|48|54923.52|0.06|0.02|A|F|1993-02-24|1992-12-17|1993-03-13|COLLECT COD|SHIP|s use ironically speci +48448|594|85|7|19|28397.21|0.10|0.06|R|F|1993-03-03|1993-01-22|1993-03-22|COLLECT COD|FOB|beans haggl +48449|1110|47|1|9|9099.99|0.02|0.04|R|F|1995-05-06|1995-05-02|1995-05-25|NONE|FOB|ts lose along the caref +48449|1157|66|2|7|7407.05|0.09|0.07|A|F|1995-04-23|1995-05-01|1995-05-19|TAKE BACK RETURN|RAIL|quests. carefully regu +48449|1536|77|3|30|43125.90|0.03|0.07|N|O|1995-07-16|1995-04-22|1995-07-18|COLLECT COD|MAIL|kages are. theodolites doz +48450|1213|51|1|39|43454.19|0.08|0.08|N|O|1997-05-16|1997-07-17|1997-05-27|DELIVER IN PERSON|FOB|along the even pinto beans-- furiously unus +48450|1723|66|2|34|55240.48|0.02|0.07|N|O|1997-05-05|1997-06-25|1997-05-23|COLLECT COD|TRUCK|ickly final fr +48450|1491|70|3|14|19494.86|0.09|0.04|N|O|1997-07-03|1997-06-14|1997-07-24|TAKE BACK RETURN|SHIP|otes wake carefully. slyly regular request +48450|1013|84|4|6|5484.06|0.09|0.00|N|O|1997-08-23|1997-06-08|1997-09-12|COLLECT COD|MAIL| along the package +48450|942|11|5|26|47916.44|0.01|0.04|N|O|1997-08-17|1997-07-07|1997-08-21|DELIVER IN PERSON|SHIP|pending, unusual ideas. slyly unusual gr +48451|1737|22|1|26|42606.98|0.08|0.05|R|F|1995-01-27|1994-12-01|1995-02-06|TAKE BACK RETURN|RAIL|nal foxes nag slyly darin +48452|449|50|1|49|66122.56|0.02|0.03|R|F|1993-10-29|1993-12-02|1993-11-06|NONE|TRUCK|e slyly quickly ironic pack +48452|1508|29|2|14|19733.00|0.07|0.00|R|F|1993-10-22|1993-11-14|1993-11-20|NONE|RAIL|egular packages. carefully ironic accoun +48452|226|81|3|3|3378.66|0.04|0.04|R|F|1993-12-20|1994-01-05|1994-01-17|NONE|RAIL|ugouts across the furiously spec +48452|1906|95|4|44|79547.60|0.04|0.02|A|F|1994-02-05|1993-12-29|1994-02-10|NONE|REG AIR|ickly silent foxes. furiousl +48452|792|93|5|35|59247.65|0.03|0.06|R|F|1994-01-22|1993-11-16|1994-02-08|COLLECT COD|FOB|ndencies s +48452|491|50|6|23|32004.27|0.08|0.03|R|F|1993-11-16|1993-12-27|1993-12-12|TAKE BACK RETURN|MAIL|y ironic packages cajole. furiously +48452|153|80|7|7|7372.05|0.01|0.06|A|F|1993-11-25|1994-01-05|1993-12-06|COLLECT COD|AIR| boost. quietly final ideas cajol +48453|1459|38|1|1|1360.45|0.03|0.00|R|F|1994-11-08|1994-09-04|1994-11-22|DELIVER IN PERSON|AIR|hin accounts cajole slowly. regularly +48453|401|89|2|45|58563.00|0.07|0.03|R|F|1994-08-25|1994-09-25|1994-09-16|DELIVER IN PERSON|TRUCK| after the care +48453|280|35|3|30|35408.40|0.07|0.01|A|F|1994-08-10|1994-10-22|1994-08-14|COLLECT COD|TRUCK|ep slyly. iro +48453|1820|7|4|40|68872.80|0.06|0.08|R|F|1994-09-18|1994-08-29|1994-09-28|TAKE BACK RETURN|TRUCK|s nag furi +48453|1159|32|5|38|40285.70|0.03|0.08|A|F|1994-08-20|1994-10-21|1994-09-13|DELIVER IN PERSON|FOB|s. evenly unusual package +48453|551|42|6|34|49352.70|0.00|0.05|R|F|1994-07-29|1994-08-28|1994-08-27|COLLECT COD|FOB|cross the pending tithes. re +48454|42|93|1|3|2826.12|0.03|0.04|N|O|1996-04-03|1996-04-26|1996-04-09|NONE|RAIL|unts wake slyly above the even fr +48454|313|14|2|40|48532.40|0.00|0.01|N|O|1996-06-16|1996-05-11|1996-07-04|TAKE BACK RETURN|FOB|asymptotes wake slyly deposits. specia +48454|1097|3|3|42|41919.78|0.07|0.08|N|O|1996-03-17|1996-05-21|1996-04-08|NONE|MAIL|e furiously spec +48455|1853|97|1|36|63174.60|0.04|0.07|R|F|1994-08-05|1994-07-25|1994-08-13|DELIVER IN PERSON|TRUCK|even, special +48455|1870|57|2|2|3543.74|0.03|0.08|A|F|1994-07-17|1994-07-09|1994-08-15|COLLECT COD|RAIL|raids. regular +48455|504|35|3|16|22472.00|0.07|0.08|A|F|1994-07-24|1994-07-04|1994-08-09|COLLECT COD|SHIP|lyly final theodolites. carefully pe +48455|945|48|4|49|90451.06|0.07|0.06|A|F|1994-07-25|1994-08-14|1994-08-20|COLLECT COD|FOB|hely regular deposits +48455|289|17|5|6|7135.68|0.01|0.04|A|F|1994-09-15|1994-08-19|1994-10-14|NONE|AIR|lose requests sleep +48455|767|68|6|8|13342.08|0.07|0.05|A|F|1994-09-05|1994-07-18|1994-09-18|TAKE BACK RETURN|FOB|jole. fluffily final deposits caj +48455|1987|32|7|21|39668.58|0.00|0.04|R|F|1994-07-25|1994-08-15|1994-08-04|NONE|AIR|gular requests. +48480|1801|45|1|21|35758.80|0.00|0.06|A|F|1993-04-05|1993-03-23|1993-04-12|TAKE BACK RETURN|FOB|he furiously ironic deposi +48480|1405|23|2|31|40498.40|0.00|0.01|R|F|1993-04-06|1993-03-16|1993-04-16|NONE|RAIL|ake idly ironic pack +48480|323|8|3|27|33029.64|0.08|0.02|A|F|1993-01-19|1993-02-18|1993-01-26|COLLECT COD|SHIP|ld are sly +48481|1466|45|1|39|53330.94|0.02|0.03|N|O|1998-05-18|1998-05-11|1998-05-20|TAKE BACK RETURN|AIR| sleep deposits. exp +48481|1671|95|2|11|17299.37|0.01|0.06|N|O|1998-04-11|1998-05-12|1998-05-01|DELIVER IN PERSON|MAIL|ecial epitaphs use. c +48481|1594|95|3|16|23929.44|0.04|0.00|N|O|1998-08-03|1998-06-05|1998-09-02|COLLECT COD|MAIL|ve packages. fluffily exp +48481|95|46|4|30|29852.70|0.01|0.05|N|O|1998-07-19|1998-05-29|1998-08-16|DELIVER IN PERSON|TRUCK|lly final ideas haggle along the f +48481|198|51|5|14|15374.66|0.01|0.07|N|O|1998-07-02|1998-06-17|1998-07-05|NONE|FOB|ckages haggle fluffily after the final acco +48481|562|53|6|24|35101.44|0.10|0.08|N|O|1998-06-22|1998-06-28|1998-07-07|TAKE BACK RETURN|SHIP|fily even epitaphs. specia +48481|1555|56|7|50|72827.50|0.08|0.02|N|O|1998-06-19|1998-05-09|1998-06-29|DELIVER IN PERSON|RAIL|nstructions affix furiously final p +48482|885|85|1|19|33931.72|0.10|0.02|N|O|1996-12-28|1997-02-06|1997-01-21|DELIVER IN PERSON|REG AIR|ongside of the quickly even +48482|1498|16|2|26|36386.74|0.03|0.01|N|O|1997-02-17|1997-02-07|1997-03-13|TAKE BACK RETURN|SHIP|ctions. carefully +48482|397|54|3|16|20758.24|0.10|0.05|N|O|1996-12-28|1997-02-16|1997-01-22|DELIVER IN PERSON|FOB|ual, bold requests. perm +48482|1498|77|4|35|48982.15|0.10|0.00|N|O|1996-12-03|1997-01-17|1996-12-06|DELIVER IN PERSON|RAIL|sly instructions-- furiou +48482|1757|42|5|29|48103.75|0.00|0.02|N|O|1997-03-03|1996-12-30|1997-03-23|DELIVER IN PERSON|TRUCK|ites. quickly ironic packages doze quic +48482|623|24|6|22|33519.64|0.08|0.06|N|O|1997-03-01|1997-01-28|1997-03-28|NONE|REG AIR|across the carefully silent accounts im +48483|1869|99|1|36|63750.96|0.02|0.08|R|F|1995-01-14|1995-03-04|1995-02-03|DELIVER IN PERSON|REG AIR|e blithely unusual ideas +48483|1530|31|2|45|64418.85|0.08|0.04|A|F|1995-02-08|1995-02-10|1995-02-10|COLLECT COD|RAIL| the bravely pending +48483|1673|97|3|48|75584.16|0.09|0.00|R|F|1995-02-21|1995-03-04|1995-03-09|NONE|AIR| silent fox +48483|1145|46|4|4|4184.56|0.07|0.04|R|F|1995-03-17|1995-01-19|1995-03-31|NONE|AIR|hang furiously bli +48483|732|65|5|39|63676.47|0.06|0.00|A|F|1995-01-04|1995-03-04|1995-02-01|COLLECT COD|AIR|sual theodolites. carefully spec +48483|1609|51|6|50|75530.00|0.01|0.04|A|F|1995-01-06|1995-01-30|1995-01-08|COLLECT COD|MAIL|ts. carefully spe +48483|1343|58|7|44|54750.96|0.05|0.02|A|F|1995-02-25|1995-02-21|1995-03-13|TAKE BACK RETURN|MAIL|g to the fluffily regula +48484|112|13|1|43|43520.73|0.04|0.04|A|F|1993-07-21|1993-09-17|1993-08-15|COLLECT COD|AIR|of the final +48484|1202|14|2|10|11032.00|0.06|0.04|R|F|1993-08-15|1993-09-14|1993-09-07|COLLECT COD|RAIL|hely ironic foxes. regular theodo +48484|427|86|3|25|33185.50|0.02|0.04|R|F|1993-07-15|1993-08-29|1993-07-30|DELIVER IN PERSON|MAIL|excuses aff +48484|762|27|4|9|14964.84|0.09|0.01|R|F|1993-07-29|1993-09-03|1993-08-24|TAKE BACK RETURN|AIR|lyly above the carefully final ide +48484|1498|77|5|3|4198.47|0.03|0.01|A|F|1993-07-30|1993-09-15|1993-08-29|COLLECT COD|REG AIR|ut the quickly regular deposits +48484|1036|37|6|26|24362.78|0.06|0.06|A|F|1993-09-15|1993-08-28|1993-10-03|DELIVER IN PERSON|RAIL|accounts haggle fu +48485|54|80|1|36|34345.80|0.04|0.01|N|O|1997-11-21|1997-10-07|1997-12-02|COLLECT COD|RAIL|ckly final deposits wake around +48486|951|54|1|41|75929.95|0.06|0.05|N|O|1995-06-29|1995-08-01|1995-07-12|NONE|TRUCK|e carefully regular accounts. slyl +48487|423|53|1|37|48966.54|0.02|0.07|R|F|1993-03-26|1993-04-11|1993-04-08|DELIVER IN PERSON|RAIL|posits. fluffily final requests +48487|1782|25|2|34|57248.52|0.08|0.03|R|F|1993-03-10|1993-04-03|1993-03-21|NONE|AIR|ons wake slyly +48487|461|62|3|23|31313.58|0.05|0.07|A|F|1993-03-03|1993-02-11|1993-03-16|DELIVER IN PERSON|RAIL|the blithely pending dolphins. regular, re +48487|1715|42|4|45|72751.95|0.01|0.02|R|F|1993-03-26|1993-03-04|1993-04-19|DELIVER IN PERSON|AIR|ely. silent packages slee +48512|494|24|1|20|27889.80|0.01|0.02|N|O|1995-11-20|1995-09-19|1995-12-11|NONE|AIR|ns are carefully slyly regular asy +48512|6|82|2|32|28992.00|0.08|0.00|N|O|1995-10-03|1995-09-24|1995-11-01|TAKE BACK RETURN|TRUCK| courts along the ironic, pending mu +48512|1636|19|3|38|58429.94|0.06|0.05|N|O|1995-12-01|1995-11-02|1995-12-26|COLLECT COD|MAIL|. slyly bold instructions +48513|1028|29|1|32|29728.64|0.10|0.02|N|O|1996-03-16|1996-01-22|1996-03-18|COLLECT COD|MAIL|packages use furiously against the bold re +48513|1178|51|2|49|52879.33|0.08|0.05|N|O|1995-12-13|1996-01-30|1996-01-01|TAKE BACK RETURN|AIR| furiously after the pending +48513|1125|98|3|25|25653.00|0.01|0.08|N|O|1995-12-20|1996-01-25|1996-01-15|DELIVER IN PERSON|RAIL|atelets integrate fluffily across the sl +48513|830|30|4|10|17308.30|0.00|0.04|N|O|1995-12-23|1996-01-27|1996-01-18|TAKE BACK RETURN|TRUCK|n waters: slyly re +48514|1518|19|1|24|34068.24|0.06|0.04|N|O|1995-11-09|1995-10-27|1995-12-07|DELIVER IN PERSON|TRUCK|nal instructions cajole slyly. re +48514|1375|14|2|9|11487.33|0.06|0.06|N|O|1995-12-27|1995-11-22|1996-01-15|TAKE BACK RETURN|SHIP|e slyly regular accoun +48514|359|16|3|46|57930.10|0.03|0.02|N|O|1995-10-21|1995-11-04|1995-11-16|COLLECT COD|TRUCK|oss the eve +48515|875|42|1|47|83465.89|0.06|0.06|N|O|1996-03-17|1996-02-04|1996-04-02|DELIVER IN PERSON|TRUCK|accounts. enticingly final deposits detect +48515|1200|37|2|23|25327.60|0.05|0.05|N|O|1996-03-10|1996-03-15|1996-04-02|NONE|FOB|accounts. carefu +48515|1490|8|3|46|64008.54|0.02|0.05|N|O|1996-02-20|1996-03-07|1996-02-26|TAKE BACK RETURN|REG AIR|he furiously +48516|1987|76|1|9|17000.82|0.10|0.04|N|O|1998-03-01|1998-01-20|1998-03-08|TAKE BACK RETURN|REG AIR|refully unusual deposits. sauternes boost +48516|57|58|2|8|7656.40|0.10|0.06|N|O|1998-02-19|1998-01-05|1998-03-20|TAKE BACK RETURN|RAIL|ly regular deposit +48516|1509|50|3|49|69114.50|0.05|0.07|N|O|1997-12-25|1998-03-01|1998-01-08|TAKE BACK RETURN|REG AIR|ckages haggle. special, final pl +48516|1308|23|4|11|13302.30|0.02|0.02|N|O|1998-03-13|1998-01-03|1998-03-26|NONE|AIR|le furiously re +48516|859|60|5|11|19358.35|0.03|0.00|N|O|1998-01-30|1998-02-21|1998-02-25|DELIVER IN PERSON|SHIP|nding requests. blithely quick pl +48516|1158|31|6|25|26478.75|0.08|0.07|N|O|1998-02-21|1998-01-30|1998-03-04|NONE|FOB|er the even excuses. regular plat +48516|1902|91|7|38|68548.20|0.07|0.01|N|O|1998-03-13|1998-02-09|1998-03-20|NONE|AIR|inst the slyly quiet asymp +48517|770|67|1|7|11695.39|0.01|0.06|R|F|1993-05-21|1993-05-27|1993-06-14|TAKE BACK RETURN|RAIL|eposits. carefully special accou +48518|1424|42|1|46|60969.32|0.09|0.01|A|F|1994-06-18|1994-05-08|1994-06-25|COLLECT COD|MAIL|e. carefully bold foxes nag blithely. f +48518|825|25|2|25|43145.50|0.10|0.06|A|F|1994-04-07|1994-05-10|1994-04-21|NONE|REG AIR|ck deposits. spec +48518|1101|38|3|29|29060.90|0.07|0.07|A|F|1994-07-09|1994-06-02|1994-08-08|COLLECT COD|AIR|usly slyly +48518|1649|91|4|39|60474.96|0.00|0.08|A|F|1994-06-24|1994-05-07|1994-07-18|NONE|AIR|packages might haggle furious +48518|1429|47|5|25|33260.50|0.05|0.00|A|F|1994-05-24|1994-06-12|1994-06-18|DELIVER IN PERSON|FOB|ckly special deposits cajole +48518|607|1|6|33|49750.80|0.05|0.07|A|F|1994-05-04|1994-05-19|1994-05-15|NONE|TRUCK|lly quickly e +48519|350|35|1|4|5001.40|0.09|0.04|N|O|1998-04-08|1998-05-31|1998-04-21|NONE|REG AIR|ncies are ironically furiousl +48519|411|41|2|35|45899.35|0.07|0.00|N|O|1998-04-11|1998-04-14|1998-04-16|NONE|AIR|ar packages. slyly ironic in +48519|1301|40|3|26|31259.80|0.06|0.06|N|O|1998-03-06|1998-05-31|1998-03-22|COLLECT COD|FOB|oss the carefully unusual id +48519|1668|69|4|27|42380.82|0.05|0.04|N|O|1998-06-17|1998-04-26|1998-07-14|DELIVER IN PERSON|REG AIR|ing packages about the depend +48519|648|49|5|27|41813.28|0.01|0.02|N|O|1998-04-24|1998-04-29|1998-05-04|COLLECT COD|MAIL| could cajole furiously af +48519|410|11|6|37|48485.17|0.04|0.03|N|O|1998-03-10|1998-05-03|1998-04-06|TAKE BACK RETURN|FOB|sts integrate among the fu +48519|162|63|7|22|23367.52|0.02|0.07|N|O|1998-06-05|1998-05-02|1998-06-26|COLLECT COD|TRUCK| slyly regular deposits +48544|828|28|1|49|84712.18|0.01|0.06|N|F|1995-06-02|1995-07-18|1995-06-28|DELIVER IN PERSON|FOB|s boost above the slyl +48544|216|44|2|21|23440.41|0.01|0.03|N|O|1995-09-04|1995-07-13|1995-09-30|DELIVER IN PERSON|RAIL|se deposits. special requests are among +48544|1768|11|3|17|28385.92|0.09|0.04|N|O|1995-07-22|1995-07-23|1995-08-01|COLLECT COD|FOB|al pains poach boldly around the +48544|274|75|4|46|54016.42|0.06|0.02|N|O|1995-07-16|1995-07-15|1995-07-21|NONE|SHIP|ely final accounts about the bold, regular +48545|644|45|1|16|24714.24|0.09|0.01|N|O|1997-12-19|1998-02-08|1997-12-21|TAKE BACK RETURN|RAIL|sly. slyly regular instructio +48545|1200|1|2|39|42946.80|0.04|0.04|N|O|1998-01-31|1998-02-06|1998-02-12|NONE|RAIL|uctions use ne +48545|579|80|3|44|65101.08|0.06|0.00|N|O|1997-12-31|1998-02-22|1998-01-24|COLLECT COD|MAIL|s cajole quickly ironic forg +48545|656|19|4|20|31133.00|0.00|0.01|N|O|1998-03-16|1998-02-02|1998-04-15|TAKE BACK RETURN|AIR|blithely ironi +48545|1948|49|5|23|42548.62|0.02|0.02|N|O|1998-02-22|1998-01-22|1998-03-22|DELIVER IN PERSON|RAIL|to beans. silent, silent ideas nag. fluffi +48546|24|50|1|43|39732.86|0.05|0.00|A|F|1992-07-23|1992-07-30|1992-08-06|DELIVER IN PERSON|RAIL|y alongside of the closely silent a +48546|1795|38|2|6|10180.74|0.05|0.00|A|F|1992-07-26|1992-06-16|1992-07-29|COLLECT COD|AIR| the regular, express deposits. +48546|816|50|3|9|15451.29|0.03|0.07|R|F|1992-07-23|1992-07-11|1992-08-07|DELIVER IN PERSON|REG AIR|arefully regular foxes haggle. ironic p +48546|749|46|4|13|21446.62|0.06|0.05|A|F|1992-07-01|1992-07-24|1992-07-31|TAKE BACK RETURN|FOB| furiously special packages. furiousl +48547|1251|52|1|3|3456.75|0.01|0.08|A|F|1994-02-20|1994-04-24|1994-02-26|COLLECT COD|SHIP| foxes are +48547|1145|54|2|50|52307.00|0.03|0.08|A|F|1994-05-04|1994-03-12|1994-05-29|NONE|AIR|e the blithely +48548|1040|46|1|12|11292.48|0.01|0.04|N|O|1995-06-30|1995-05-04|1995-07-09|NONE|FOB|packages. slyly un +48548|34|35|2|6|5604.18|0.10|0.05|R|F|1995-04-29|1995-05-03|1995-05-22|TAKE BACK RETURN|MAIL| dogged, express d +48548|970|5|3|37|69225.89|0.01|0.02|N|O|1995-07-07|1995-05-06|1995-07-30|TAKE BACK RETURN|FOB|ular packages. ironic platelets ab +48548|168|69|4|29|30976.64|0.10|0.05|N|F|1995-06-03|1995-05-18|1995-07-03|TAKE BACK RETURN|FOB|ccounts was around the bl +48548|1842|43|5|2|3487.68|0.04|0.01|N|O|1995-06-27|1995-06-02|1995-07-14|DELIVER IN PERSON|TRUCK|he furiously silent instructions. car +48548|882|83|6|33|58835.04|0.00|0.03|A|F|1995-04-05|1995-04-30|1995-04-06|NONE|RAIL|wind against th +48548|417|5|7|40|52696.40|0.00|0.02|N|O|1995-07-03|1995-05-05|1995-07-19|NONE|REG AIR| pending dolphins +48549|1612|54|1|3|4540.83|0.05|0.02|N|O|1997-05-11|1997-05-19|1997-06-05|TAKE BACK RETURN|TRUCK|quickly around the flu +48549|1439|40|2|46|61659.78|0.05|0.05|N|O|1997-03-22|1997-05-20|1997-04-16|NONE|RAIL|un slyly even, even deposits. blithe +48549|1174|75|3|39|41931.63|0.09|0.05|N|O|1997-03-07|1997-04-07|1997-03-11|NONE|TRUCK| special requests are furiously regu +48549|1925|58|4|29|52980.68|0.10|0.03|N|O|1997-06-20|1997-05-02|1997-06-28|NONE|RAIL|ide of the packages cajole furiously a +48550|1139|40|1|3|3120.39|0.00|0.02|N|O|1996-11-02|1996-10-28|1996-11-03|TAKE BACK RETURN|FOB|are. fluffily bold theodo +48551|1571|92|1|23|33869.11|0.09|0.04|A|F|1993-04-08|1993-05-08|1993-04-15|DELIVER IN PERSON|AIR|eas. carefully pending theodolites nag flu +48551|1835|22|2|44|76420.52|0.04|0.06|R|F|1993-03-29|1993-04-07|1993-04-25|NONE|SHIP|le fluffily in place of the notor +48576|959|60|1|20|37199.00|0.07|0.00|A|F|1993-03-24|1993-01-30|1993-04-06|COLLECT COD|FOB|encies haggle carefully alongsid +48576|1741|84|2|27|44353.98|0.09|0.01|A|F|1993-01-21|1993-02-26|1993-02-14|NONE|TRUCK|along the slyly regular warhorse +48576|1925|70|3|35|63942.20|0.10|0.05|R|F|1992-12-29|1993-02-20|1993-01-19|TAKE BACK RETURN|SHIP|kages above the furiously regular ac +48576|999|100|4|26|49399.74|0.01|0.07|R|F|1993-03-10|1993-01-19|1993-04-07|TAKE BACK RETURN|TRUCK|ges wake slyly. flu +48576|623|55|5|15|22854.30|0.10|0.03|R|F|1993-02-22|1993-02-26|1993-03-02|TAKE BACK RETURN|MAIL|even requests? quick +48577|987|56|1|38|71743.24|0.10|0.05|A|F|1992-09-10|1992-10-01|1992-10-02|TAKE BACK RETURN|RAIL|e slyly fina +48577|475|76|2|39|53643.33|0.02|0.03|R|F|1992-11-07|1992-08-23|1992-11-19|TAKE BACK RETURN|SHIP|w carefully +48577|1126|63|3|47|48274.64|0.03|0.08|A|F|1992-09-17|1992-09-30|1992-10-05|TAKE BACK RETURN|AIR| are carefully ac +48577|1225|63|4|10|11262.20|0.07|0.08|R|F|1992-08-21|1992-09-25|1992-09-18|DELIVER IN PERSON|RAIL|as are final, iron +48577|981|82|5|32|60223.36|0.09|0.06|A|F|1992-08-26|1992-10-01|1992-08-30|TAKE BACK RETURN|RAIL|yly final theodol +48578|157|36|1|13|13742.95|0.06|0.04|N|O|1995-11-21|1995-10-07|1995-12-06|TAKE BACK RETURN|TRUCK|ouches. bold ac +48578|550|51|2|3|4351.65|0.06|0.03|N|O|1995-09-28|1995-09-30|1995-10-26|TAKE BACK RETURN|SHIP|e blithely pending accounts. +48579|1426|66|1|20|26548.40|0.06|0.04|N|O|1997-01-18|1997-01-11|1997-01-24|NONE|FOB|ular packages +48579|1445|85|2|38|51164.72|0.08|0.05|N|O|1996-12-07|1997-01-09|1996-12-21|COLLECT COD|TRUCK| sleep against the accoun +48579|332|89|3|20|24646.60|0.06|0.00|N|O|1997-01-20|1996-11-16|1997-01-25|NONE|RAIL|counts. carefully regular requests +48580|267|49|1|5|5836.30|0.05|0.00|R|F|1994-03-25|1994-02-12|1994-03-29|DELIVER IN PERSON|FOB|carefully eve +48580|1122|59|2|12|12277.44|0.01|0.03|A|F|1994-03-02|1994-03-16|1994-03-25|COLLECT COD|MAIL| theodolites. ironic deposits h +48581|600|1|1|24|36014.40|0.01|0.05|A|F|1992-11-10|1992-11-26|1992-11-26|NONE|FOB|ges after the fluffily eve +48581|1816|17|2|41|70430.21|0.05|0.00|A|F|1993-01-11|1992-12-07|1993-01-27|DELIVER IN PERSON|SHIP|out the regular deposits wake ir +48581|1024|60|3|16|14800.32|0.09|0.02|R|F|1993-01-16|1993-01-10|1993-02-02|NONE|AIR| about the even, bold requests affix +48581|1157|58|4|26|27511.90|0.04|0.07|R|F|1993-01-29|1992-12-11|1993-02-07|TAKE BACK RETURN|TRUCK|ely quick excuses inst +48581|1105|14|5|12|12073.20|0.01|0.03|R|F|1993-01-04|1993-01-08|1993-01-30|DELIVER IN PERSON|AIR|efully regular dep +48581|236|64|6|11|12498.53|0.10|0.07|R|F|1993-01-20|1992-12-02|1993-01-27|DELIVER IN PERSON|SHIP|as. deposi +48582|1139|76|1|17|17682.21|0.08|0.08|N|O|1998-04-30|1998-03-10|1998-05-05|NONE|SHIP|foxes use against the sly requests. sl +48582|177|30|2|13|14003.21|0.05|0.00|N|O|1998-05-27|1998-04-16|1998-06-24|NONE|FOB|ess pinto +48582|1739|82|3|36|59066.28|0.04|0.02|N|O|1998-06-02|1998-03-11|1998-06-17|DELIVER IN PERSON|MAIL|kly regular +48582|626|27|4|20|30532.40|0.05|0.07|N|O|1998-02-27|1998-03-09|1998-03-04|COLLECT COD|FOB|lar ideas. slyly bo +48583|208|90|1|2|2216.40|0.02|0.01|N|O|1998-03-22|1998-05-26|1998-04-14|COLLECT COD|FOB|carefully idle instructions. express +48583|560|51|2|37|54040.72|0.09|0.02|N|O|1998-05-18|1998-05-27|1998-06-17|TAKE BACK RETURN|REG AIR|lly carefully special requests. +48583|1214|89|3|34|37917.14|0.01|0.01|N|O|1998-07-01|1998-06-01|1998-07-03|NONE|REG AIR| are carefully blithely ironic req +48583|237|19|4|47|53449.81|0.09|0.05|N|O|1998-05-19|1998-05-03|1998-05-21|TAKE BACK RETURN|MAIL| blithely silen +48583|256|38|5|19|21968.75|0.04|0.00|N|O|1998-06-20|1998-05-19|1998-07-18|DELIVER IN PERSON|REG AIR|ly ironic accounts. regularly pending brai +48583|92|68|6|9|8928.81|0.10|0.02|N|O|1998-06-05|1998-04-17|1998-07-03|DELIVER IN PERSON|RAIL|gular accounts haggle slyl +48583|224|52|7|13|14614.86|0.01|0.06|N|O|1998-04-18|1998-04-05|1998-04-28|COLLECT COD|RAIL| packages sleep slyly a +48608|1176|49|1|22|23697.74|0.05|0.03|A|F|1993-12-06|1993-10-12|1993-12-13|TAKE BACK RETURN|TRUCK|counts. quickly final theodolites +48608|6|32|2|8|7248.00|0.06|0.07|R|F|1993-11-15|1993-11-04|1993-12-09|TAKE BACK RETURN|RAIL|cajole above the quickly regular a +48608|1637|79|3|50|76931.50|0.07|0.03|R|F|1993-08-30|1993-10-26|1993-09-17|NONE|SHIP|blithely pending +48608|624|18|4|30|45738.60|0.04|0.03|R|F|1993-10-14|1993-11-22|1993-10-31|DELIVER IN PERSON|TRUCK|ly unusual foxes? evenly regular tithe +48608|625|19|5|47|71704.14|0.00|0.08|A|F|1993-09-18|1993-10-02|1993-10-17|DELIVER IN PERSON|RAIL|ill sleep regular theodol +48608|1033|39|6|39|36427.17|0.09|0.04|A|F|1993-12-12|1993-11-13|1994-01-03|TAKE BACK RETURN|TRUCK|inst the furi +48608|1384|99|7|29|37276.02|0.05|0.08|A|F|1993-12-12|1993-10-02|1994-01-10|COLLECT COD|RAIL| asymptotes sleep. furiously iron +48609|80|81|1|41|40183.28|0.02|0.04|R|F|1993-05-28|1993-04-06|1993-06-11|TAKE BACK RETURN|FOB|ly express deposits hinder fluffily furio +48609|1355|56|2|20|25127.00|0.08|0.04|A|F|1993-04-29|1993-03-29|1993-05-13|DELIVER IN PERSON|FOB|oost slyly about the care +48609|1767|94|3|12|20025.12|0.08|0.04|A|F|1993-06-16|1993-05-22|1993-07-13|DELIVER IN PERSON|TRUCK|es haggle bold, ironic dolphins. quickly r +48609|897|64|4|40|71915.60|0.00|0.08|A|F|1993-06-06|1993-05-07|1993-06-30|COLLECT COD|FOB|uctions boost +48609|1646|70|5|33|51072.12|0.09|0.04|R|F|1993-05-21|1993-04-16|1993-05-25|NONE|TRUCK|ely. fluffily sly instructions wake furious +48609|745|78|6|1|1645.74|0.03|0.03|A|F|1993-05-08|1993-05-13|1993-05-09|NONE|MAIL|s haggle. quickly express theodolites of +48610|1127|28|1|18|18506.16|0.01|0.02|A|F|1993-04-19|1993-04-22|1993-04-28|NONE|AIR| final requests. slyly special ideas ar +48610|479|38|2|39|53799.33|0.00|0.00|R|F|1993-04-17|1993-05-18|1993-04-27|TAKE BACK RETURN|AIR|arefully pending foxes around the foxes wak +48610|1708|93|3|43|69217.10|0.09|0.05|R|F|1993-05-22|1993-04-20|1993-06-07|NONE|RAIL|es nag thinly. slyly regular depos +48610|879|13|4|3|5339.61|0.07|0.05|R|F|1993-07-15|1993-04-24|1993-07-30|NONE|TRUCK|ckly bold accounts promise +48610|344|45|5|48|59728.32|0.09|0.06|R|F|1993-04-28|1993-04-18|1993-05-21|COLLECT COD|RAIL|tithes are carefu +48611|1299|37|1|30|36008.70|0.00|0.05|R|F|1993-10-01|1993-12-01|1993-10-27|DELIVER IN PERSON|AIR|xpress foxes could have to +48611|1402|20|2|19|24764.60|0.07|0.05|R|F|1993-10-07|1993-10-14|1993-10-14|NONE|RAIL|he asymptotes. furiously bo +48611|1479|97|3|34|46935.98|0.06|0.08|A|F|1993-12-02|1993-11-11|1993-12-23|COLLECT COD|MAIL|ccording to the quickly ironic dep +48612|1790|33|1|20|33835.80|0.01|0.02|A|F|1992-08-13|1992-09-03|1992-08-14|NONE|AIR|e fluffily pending dependenci +48613|397|98|1|23|29839.97|0.08|0.08|N|O|1996-07-08|1996-08-28|1996-08-01|TAKE BACK RETURN|SHIP|rts cajole blithely +48613|1137|38|2|20|20762.60|0.01|0.01|N|O|1996-09-25|1996-09-14|1996-10-08|TAKE BACK RETURN|TRUCK|e the blithely even accounts. blithe +48613|1529|50|3|2|2861.04|0.08|0.03|N|O|1996-10-18|1996-07-24|1996-11-13|NONE|FOB|ly ironic instruction +48613|1875|76|4|11|19545.57|0.10|0.05|N|O|1996-09-18|1996-08-14|1996-09-27|NONE|SHIP|ing the final, final packages cajole furi +48613|1523|4|5|19|27065.88|0.10|0.00|N|O|1996-08-11|1996-08-28|1996-08-12|DELIVER IN PERSON|RAIL|al theodolites sleep carefully special a +48613|1110|83|6|9|9099.99|0.09|0.02|N|O|1996-07-17|1996-08-01|1996-07-18|TAKE BACK RETURN|AIR|xcuses. ca +48613|491|21|7|20|27829.80|0.00|0.07|N|O|1996-09-02|1996-08-22|1996-09-15|NONE|AIR|eas against the bold tithes maintai +48614|929|64|1|25|45748.00|0.06|0.01|R|F|1992-09-22|1992-08-30|1992-10-01|COLLECT COD|SHIP|e pending +48614|895|29|2|27|48489.03|0.04|0.03|A|F|1992-07-22|1992-08-16|1992-08-15|COLLECT COD|TRUCK|. regular packages ac +48614|1988|21|3|6|11339.88|0.04|0.08|A|F|1992-06-10|1992-08-13|1992-06-14|NONE|AIR|l packages engage fur +48615|165|18|1|4|4260.64|0.03|0.04|R|F|1992-12-24|1993-01-07|1993-01-12|NONE|RAIL|rve furiously. express epita +48615|1071|7|2|2|1944.14|0.10|0.04|A|F|1993-01-09|1993-01-20|1993-01-11|NONE|MAIL|ptotes cajole stealthily. furiousl +48615|1402|20|3|35|45619.00|0.10|0.03|A|F|1993-02-09|1993-02-05|1993-02-11|DELIVER IN PERSON|RAIL|after the pending instructions. bol +48615|1029|100|4|44|40920.88|0.05|0.08|R|F|1993-03-15|1993-01-23|1993-04-05|TAKE BACK RETURN|MAIL| sleep carefully according to the +48615|1780|65|5|50|84089.00|0.08|0.04|R|F|1993-01-23|1993-02-01|1993-02-06|TAKE BACK RETURN|FOB|according to the ironic packages sleep pint +48640|1513|54|1|41|57994.91|0.00|0.02|N|O|1996-05-03|1996-02-28|1996-05-22|DELIVER IN PERSON|TRUCK|g among the furiously blit +48640|30|81|2|32|29760.96|0.03|0.08|N|O|1996-02-10|1996-04-27|1996-02-29|NONE|RAIL|unusual deposits. fluffily fina +48641|635|98|1|17|26105.71|0.09|0.03|N|O|1996-01-03|1996-01-06|1996-01-30|DELIVER IN PERSON|AIR|furiously ironic deposits are even excu +48641|1691|33|2|3|4778.07|0.04|0.08|N|O|1996-03-18|1996-02-24|1996-04-04|COLLECT COD|REG AIR|y above the carefully bold accounts. bli +48641|145|46|3|47|49121.58|0.06|0.00|N|O|1996-03-28|1996-02-28|1996-04-13|DELIVER IN PERSON|TRUCK| detect-- fluffily pendin +48642|298|26|1|36|43138.44|0.04|0.06|R|F|1993-05-23|1993-04-02|1993-06-16|NONE|REG AIR| haggle carefully above the quickly speci +48642|1115|16|2|42|42676.62|0.07|0.04|R|F|1993-04-07|1993-03-30|1993-04-22|TAKE BACK RETURN|SHIP|pendencies may sleep special, even +48642|521|12|3|15|21322.80|0.04|0.07|R|F|1993-03-27|1993-04-15|1993-04-06|DELIVER IN PERSON|TRUCK|regular accounts. quickly bold +48642|246|28|4|4|4584.96|0.03|0.00|A|F|1993-04-09|1993-04-24|1993-05-03|DELIVER IN PERSON|FOB|es nag. blithely iron +48642|1775|60|5|16|26828.32|0.06|0.08|A|F|1993-03-29|1993-03-17|1993-04-21|NONE|RAIL|ke blithely pending account +48642|860|60|6|35|61630.10|0.07|0.02|R|F|1993-04-05|1993-04-03|1993-04-23|NONE|FOB| above the furiously si +48642|1655|38|7|37|57596.05|0.09|0.05|A|F|1993-02-11|1993-03-07|1993-02-26|TAKE BACK RETURN|MAIL|ronic courts haggle. qui +48643|941|76|1|48|88413.12|0.09|0.04|A|F|1992-11-10|1993-01-13|1992-12-05|COLLECT COD|AIR|ly about the blithely r +48643|1909|10|2|25|45272.50|0.06|0.06|R|F|1992-12-12|1992-12-25|1992-12-15|NONE|AIR|efully slyly special packages. slyly i +48643|1660|61|3|50|78083.00|0.10|0.00|A|F|1992-12-05|1992-12-11|1993-01-01|NONE|MAIL|refully regular packages integrat +48643|383|12|4|25|32084.50|0.10|0.05|A|F|1993-02-15|1992-12-21|1993-02-25|COLLECT COD|FOB|le carefully theodolites. slyly s +48643|1470|49|5|23|31543.81|0.03|0.08|A|F|1993-01-01|1992-11-19|1993-01-16|COLLECT COD|TRUCK| final theodo +48643|800|33|6|32|54425.60|0.01|0.01|A|F|1992-12-31|1992-12-30|1993-01-03|NONE|RAIL|jole slyly ironic +48644|1311|26|1|1|1212.31|0.07|0.00|N|O|1997-02-09|1997-03-19|1997-02-18|NONE|RAIL| excuses. braids believe fluffily +48644|290|45|2|11|13093.19|0.05|0.08|N|O|1997-02-24|1997-04-09|1997-02-26|TAKE BACK RETURN|TRUCK|usy pearls. r +48644|1152|61|3|34|35807.10|0.03|0.07|N|O|1997-04-07|1997-04-04|1997-04-21|TAKE BACK RETURN|MAIL|l deposits about the even, re +48644|1922|23|4|41|74780.72|0.03|0.08|N|O|1997-04-05|1997-03-15|1997-04-22|TAKE BACK RETURN|AIR|quests cajole quickly ironic package +48644|37|63|5|34|31859.02|0.01|0.08|N|O|1997-03-18|1997-03-13|1997-03-27|NONE|SHIP| after the even +48644|1818|62|6|35|60193.35|0.02|0.08|N|O|1997-01-20|1997-03-17|1997-02-07|NONE|REG AIR|side of the ironic instructions. slyly i +48645|531|22|1|29|41514.37|0.10|0.04|N|O|1996-07-29|1996-07-23|1996-08-06|DELIVER IN PERSON|TRUCK|kages? blithely pending courts caj +48645|650|44|2|37|57374.05|0.04|0.08|N|O|1996-08-05|1996-05-28|1996-09-02|COLLECT COD|SHIP|structions haggle expr +48646|1172|81|1|36|38634.12|0.07|0.02|N|O|1995-10-03|1995-12-02|1995-10-21|NONE|REG AIR|ructions sleep car +48646|1954|87|2|30|55678.50|0.01|0.00|N|O|1996-01-02|1995-10-12|1996-01-15|COLLECT COD|SHIP|sual dolphins boost idly acco +48646|1199|36|3|48|52809.12|0.08|0.07|N|O|1995-10-15|1995-10-13|1995-11-07|TAKE BACK RETURN|RAIL| special pinto beans. blithely spec +48647|1604|5|1|20|30112.00|0.09|0.07|R|F|1992-03-23|1992-05-18|1992-03-30|DELIVER IN PERSON|FOB|lithely bold excuses +48647|1383|60|2|4|5137.52|0.04|0.00|R|F|1992-06-25|1992-06-11|1992-07-16|DELIVER IN PERSON|MAIL|inal depende +48647|1732|17|3|14|22872.22|0.04|0.08|A|F|1992-07-06|1992-06-03|1992-07-19|COLLECT COD|MAIL|ng the blithely regular accounts sleep abou +48647|1778|79|4|29|48713.33|0.06|0.08|R|F|1992-07-07|1992-04-21|1992-07-26|COLLECT COD|AIR|tions. carefully regular +48672|1736|79|1|17|27841.41|0.06|0.04|A|F|1993-04-13|1993-02-16|1993-05-02|TAKE BACK RETURN|TRUCK| quickly bold deposits. regular excuse +48672|1625|26|2|14|21372.68|0.00|0.08|R|F|1993-01-10|1993-03-17|1993-01-16|COLLECT COD|RAIL|foxes. final deposits sleep blithely fin +48672|871|5|3|45|79734.15|0.03|0.01|R|F|1993-04-18|1993-03-04|1993-05-03|NONE|AIR|al foxes boost slyly +48672|1557|78|4|31|45215.05|0.08|0.05|R|F|1993-02-08|1993-02-10|1993-03-06|NONE|FOB| final forge +48672|879|80|5|18|32037.66|0.02|0.02|R|F|1993-01-15|1993-02-07|1993-01-31|DELIVER IN PERSON|MAIL|ly dependencies. even ideas wake +48672|1871|1|6|43|76233.41|0.09|0.08|A|F|1993-04-15|1993-03-26|1993-05-10|TAKE BACK RETURN|FOB|as according to the slyly r +48672|865|65|7|22|38848.92|0.09|0.00|R|F|1993-02-14|1993-03-21|1993-02-27|COLLECT COD|FOB|sts nag furious +48673|1899|29|1|43|77438.27|0.08|0.02|R|F|1992-05-17|1992-06-18|1992-05-31|NONE|MAIL|cial requests haggle among the excus +48674|1501|82|1|32|44880.00|0.03|0.01|N|O|1996-02-01|1996-02-22|1996-02-15|TAKE BACK RETURN|MAIL|. carefully express packages impress s +48674|551|52|2|37|53707.35|0.02|0.00|N|O|1996-02-13|1996-02-11|1996-03-02|NONE|RAIL|oss the express pinto beans detect +48674|649|50|3|15|23244.60|0.03|0.07|N|O|1996-04-22|1996-03-07|1996-05-02|TAKE BACK RETURN|AIR| furiously specia +48674|1577|78|4|1|1478.57|0.09|0.04|N|O|1996-04-04|1996-03-16|1996-05-04|DELIVER IN PERSON|AIR|he slyly regular platelets? caref +48674|421|9|5|5|6607.10|0.08|0.03|N|O|1996-03-18|1996-02-18|1996-04-17|COLLECT COD|TRUCK|he final, final deposits. unusua +48674|1117|26|6|16|16289.76|0.04|0.02|N|O|1996-02-05|1996-03-02|1996-02-23|TAKE BACK RETURN|AIR|ng, even instructions +48674|370|71|7|38|48274.06|0.06|0.04|N|O|1996-02-26|1996-03-27|1996-03-21|DELIVER IN PERSON|AIR|instructions +48675|824|91|1|31|53469.42|0.09|0.04|A|F|1992-07-14|1992-08-27|1992-07-18|NONE|MAIL|d packages. pending accounts across +48675|544|5|2|16|23112.64|0.02|0.05|R|F|1992-08-21|1992-08-17|1992-09-07|COLLECT COD|SHIP|silent packages. furiously +48675|1033|69|3|22|20548.66|0.00|0.06|A|F|1992-09-27|1992-10-07|1992-10-21|COLLECT COD|TRUCK|aggle furiously p +48676|565|56|1|24|35173.44|0.04|0.00|N|O|1998-08-17|1998-07-08|1998-08-22|DELIVER IN PERSON|SHIP| bold accounts sleep pending, +48676|1474|92|2|10|13754.70|0.04|0.08|N|O|1998-08-01|1998-06-27|1998-08-07|COLLECT COD|REG AIR|sly regula +48677|1987|32|1|50|94449.00|0.09|0.05|N|O|1996-09-23|1996-11-07|1996-09-24|NONE|SHIP|es. ironic deposits +48677|1869|13|2|42|74376.12|0.05|0.00|N|O|1996-09-15|1996-10-22|1996-09-24|DELIVER IN PERSON|MAIL|ccounts after the fluf +48678|691|54|1|5|7958.45|0.09|0.05|N|O|1996-02-19|1996-01-18|1996-03-16|COLLECT COD|REG AIR| instructions. quick +48678|638|1|2|5|7693.15|0.10|0.03|N|O|1995-12-25|1996-02-17|1996-01-14|NONE|REG AIR| packages haggle mult +48679|1636|19|1|5|7688.15|0.02|0.05|N|O|1997-06-17|1997-03-29|1997-07-03|COLLECT COD|TRUCK|fily carefully regular theodolites. fluf +48679|1831|18|2|27|46786.41|0.00|0.02|N|O|1997-04-22|1997-04-17|1997-05-21|TAKE BACK RETURN|REG AIR|ve the bli +48679|573|34|3|44|64837.08|0.04|0.05|N|O|1997-02-17|1997-03-22|1997-03-14|NONE|REG AIR|asymptotes. bold ideas ab +48679|1047|18|4|9|8532.36|0.05|0.01|N|O|1997-04-22|1997-04-13|1997-05-12|COLLECT COD|AIR|ies snooze across the furiously unusu +48679|1871|72|5|26|46094.62|0.10|0.04|N|O|1997-03-07|1997-05-05|1997-04-02|TAKE BACK RETURN|AIR|ow according to the stealthily fin +48679|1566|7|6|8|11740.48|0.10|0.01|N|O|1997-05-22|1997-03-29|1997-05-28|TAKE BACK RETURN|MAIL|fily never ev +48704|911|46|1|2|3623.82|0.03|0.02|A|F|1992-04-17|1992-04-02|1992-05-11|DELIVER IN PERSON|FOB|r excuses are even deposits. fluff +48704|1224|99|2|24|27005.28|0.04|0.00|A|F|1992-03-09|1992-02-14|1992-03-21|TAKE BACK RETURN|RAIL| slyly unusual ins +48704|1687|29|3|37|58781.16|0.01|0.06|R|F|1992-02-02|1992-02-19|1992-03-01|NONE|AIR|carefully slyly regular +48704|1896|40|4|47|84500.83|0.01|0.02|R|F|1992-04-06|1992-03-10|1992-04-30|TAKE BACK RETURN|AIR|lar attainments +48704|796|61|5|7|11877.53|0.04|0.02|R|F|1992-05-10|1992-03-06|1992-05-17|NONE|TRUCK|blithely ironic +48704|1912|45|6|19|34464.29|0.00|0.04|R|F|1992-01-28|1992-04-03|1992-02-27|COLLECT COD|TRUCK|s pains along the slyly express theodol +48704|531|92|7|30|42945.90|0.04|0.08|A|F|1992-03-20|1992-02-29|1992-04-15|TAKE BACK RETURN|TRUCK|ts haggle. carefully re +48705|1432|11|1|4|5333.72|0.08|0.00|N|O|1996-04-10|1996-04-22|1996-05-06|COLLECT COD|FOB|unts cajole acro +48705|858|58|2|40|70354.00|0.09|0.08|N|O|1996-04-26|1996-06-06|1996-05-23|NONE|REG AIR|refully special instructions wake quickl +48706|969|70|1|2|3739.92|0.06|0.01|A|F|1993-02-09|1993-01-07|1993-02-25|DELIVER IN PERSON|RAIL|cajole under the blithely busy a +48706|89|65|2|41|40552.28|0.01|0.03|R|F|1992-11-11|1992-12-02|1992-11-21|TAKE BACK RETURN|MAIL| sleep. special dolphins haggle fluffil +48706|1000|69|3|31|27931.00|0.00|0.05|A|F|1992-11-12|1993-01-15|1992-11-20|COLLECT COD|REG AIR|s. even, final theodolites wake blit +48707|390|91|1|18|23227.02|0.00|0.07|A|F|1992-10-01|1992-10-18|1992-10-28|NONE|FOB|the blithely ironic excuses. slyly ironi +48707|1729|56|2|11|17937.92|0.06|0.02|A|F|1992-11-26|1992-11-20|1992-12-17|NONE|SHIP|posits. slyly special packages after the u +48707|259|14|3|31|35936.75|0.05|0.00|R|F|1992-09-27|1992-11-15|1992-09-28|NONE|SHIP|ing theodoli +48707|897|98|4|32|57532.48|0.04|0.00|A|F|1992-12-06|1992-11-15|1992-12-31|NONE|SHIP|uriously final ideas cajol +48707|1294|32|5|11|13148.19|0.00|0.02|R|F|1992-09-23|1992-12-03|1992-10-06|COLLECT COD|AIR|ong the slyly regular p +48707|185|64|6|10|10851.80|0.03|0.08|R|F|1992-12-08|1992-10-22|1992-12-15|TAKE BACK RETURN|REG AIR|nst the carefully ironic excuses. +48708|1491|70|1|37|51522.13|0.02|0.06|N|O|1996-05-28|1996-07-18|1996-06-15|TAKE BACK RETURN|RAIL|pending, even pinto beans. b +48708|1162|99|2|35|37210.60|0.10|0.04|N|O|1996-08-21|1996-07-30|1996-09-18|COLLECT COD|FOB|ending pinto +48708|500|30|3|21|29410.50|0.07|0.04|N|O|1996-05-11|1996-07-04|1996-05-22|COLLECT COD|SHIP| carefully b +48709|292|47|1|18|21461.22|0.01|0.00|N|O|1995-09-04|1995-11-02|1995-09-22|COLLECT COD|MAIL|ithely final pinto beans. +48709|1247|85|2|22|25261.28|0.02|0.08|N|O|1995-11-23|1995-10-13|1995-12-02|NONE|REG AIR|y alongside of the ca +48709|1599|40|3|12|18007.08|0.01|0.07|N|O|1995-10-18|1995-11-22|1995-11-09|COLLECT COD|SHIP|even deposits eat slyly quick +48710|536|27|1|41|58897.73|0.09|0.07|A|F|1995-01-06|1995-02-02|1995-01-16|COLLECT COD|TRUCK| blithely regular asymptotes use +48710|1730|15|2|25|40793.25|0.01|0.00|A|F|1995-02-21|1995-01-10|1995-03-05|DELIVER IN PERSON|RAIL|ost slyly along the regular platele +48710|7|33|3|3|2721.00|0.00|0.08|A|F|1995-03-17|1994-12-30|1995-03-30|TAKE BACK RETURN|AIR|deposits. dep +48710|192|19|4|39|42595.41|0.03|0.03|R|F|1995-01-15|1995-01-07|1995-01-31|DELIVER IN PERSON|FOB| pinto beans. fluffily ru +48710|1528|49|5|9|12865.68|0.00|0.07|R|F|1995-02-23|1995-02-21|1995-03-12|TAKE BACK RETURN|REG AIR|lites use: pe +48710|758|91|6|5|8293.75|0.06|0.08|A|F|1994-12-24|1995-02-02|1995-01-11|TAKE BACK RETURN|FOB| deposits +48710|1823|10|7|43|74167.26|0.05|0.07|R|F|1995-03-15|1995-01-04|1995-04-02|DELIVER IN PERSON|FOB|ng the car +48711|989|24|1|47|88829.06|0.01|0.02|N|O|1997-04-26|1997-06-30|1997-05-04|TAKE BACK RETURN|SHIP|taphs. furio +48711|615|78|2|3|4546.83|0.07|0.05|N|O|1997-08-07|1997-06-30|1997-09-01|DELIVER IN PERSON|AIR|uickly unusual deposits boost sly +48711|1449|89|3|10|13504.40|0.10|0.03|N|O|1997-06-30|1997-05-24|1997-07-03|NONE|RAIL|nic theodolit +48711|1358|73|4|21|26446.35|0.09|0.00|N|O|1997-06-15|1997-05-18|1997-07-13|TAKE BACK RETURN|FOB|nic instru +48736|1055|56|1|10|9560.50|0.08|0.00|N|O|1997-06-29|1997-05-19|1997-07-21|NONE|TRUCK|hely. unusual +48737|1212|13|1|2|2226.42|0.07|0.00|N|O|1996-05-27|1996-04-24|1996-06-01|TAKE BACK RETURN|FOB|e carefully +48737|14|65|2|16|14624.16|0.07|0.07|N|O|1996-07-07|1996-06-02|1996-07-19|TAKE BACK RETURN|AIR|egular, even theodolites. carefully regu +48737|1981|70|3|43|80968.14|0.06|0.01|N|O|1996-05-22|1996-06-02|1996-06-18|TAKE BACK RETURN|MAIL|fix furiously across +48738|508|99|1|6|8451.00|0.08|0.01|N|O|1998-05-14|1998-04-20|1998-05-15|TAKE BACK RETURN|FOB|uses cajole platelets. ironic, express ac +48738|1877|21|2|9|16009.83|0.06|0.07|N|O|1998-05-06|1998-03-29|1998-05-30|COLLECT COD|TRUCK| are carefully across the regular asy +48738|519|80|3|41|58199.91|0.07|0.03|N|O|1998-02-15|1998-04-24|1998-03-11|TAKE BACK RETURN|FOB|hockey players haggle blithely. car +48739|713|14|1|31|50025.01|0.06|0.08|N|O|1997-12-19|1997-10-02|1997-12-29|DELIVER IN PERSON|MAIL|y unusual pac +48739|1477|78|2|38|52381.86|0.00|0.04|N|O|1997-11-11|1997-09-30|1997-11-26|COLLECT COD|TRUCK|arefully theodolites. caref +48740|1270|45|1|35|40994.45|0.00|0.03|N|O|1996-05-03|1996-05-19|1996-05-12|NONE|SHIP| nag furiously silent deposits. +48740|1158|59|2|37|39188.55|0.04|0.04|N|O|1996-04-26|1996-05-21|1996-05-04|TAKE BACK RETURN|RAIL|eposits. thinly unusual +48740|753|86|3|29|47958.75|0.06|0.06|N|O|1996-07-07|1996-04-23|1996-07-28|TAKE BACK RETURN|REG AIR|ke blithely. fluffily +48740|290|18|4|15|17854.35|0.01|0.03|N|O|1996-07-09|1996-04-12|1996-08-06|TAKE BACK RETURN|TRUCK|rate blithely blithe requests. furi +48741|1941|86|1|37|68188.78|0.01|0.04|N|O|1997-09-03|1997-09-09|1997-09-24|COLLECT COD|RAIL|l accounts cajole against the unus +48741|450|51|2|36|48616.20|0.02|0.06|N|O|1997-08-31|1997-09-02|1997-09-02|NONE|RAIL|ts use furiously slyl +48741|154|55|3|29|30570.35|0.00|0.02|N|O|1997-10-17|1997-08-08|1997-11-08|DELIVER IN PERSON|RAIL|boldly unu +48741|1218|19|4|29|32457.09|0.02|0.05|N|O|1997-10-27|1997-09-14|1997-11-12|TAKE BACK RETURN|AIR|regular accounts +48741|339|96|5|36|44615.88|0.04|0.05|N|O|1997-10-14|1997-08-29|1997-10-27|COLLECT COD|FOB|side of the +48741|551|12|6|31|44998.05|0.10|0.02|N|O|1997-09-10|1997-09-02|1997-09-28|TAKE BACK RETURN|MAIL|eep. quickly final requests unwind slyl +48741|992|61|7|12|22715.88|0.07|0.08|N|O|1997-08-14|1997-08-12|1997-08-28|DELIVER IN PERSON|FOB| instructions affix unusual, regular ideas. +48742|780|81|1|37|62188.86|0.00|0.08|A|F|1992-04-19|1992-06-19|1992-05-04|TAKE BACK RETURN|AIR|special deposits detect blithely above the +48742|1188|61|2|9|9802.62|0.02|0.06|A|F|1992-06-25|1992-07-10|1992-07-04|DELIVER IN PERSON|MAIL| across the ironic depende +48742|1718|61|3|22|35633.62|0.00|0.04|R|F|1992-05-24|1992-07-01|1992-06-09|DELIVER IN PERSON|SHIP|ckly quiet sheaves across the quickly reg +48742|78|54|4|20|19561.40|0.01|0.02|A|F|1992-05-10|1992-06-27|1992-06-05|TAKE BACK RETURN|FOB|ts nag. specia +48742|518|79|5|7|9929.57|0.09|0.02|A|F|1992-06-22|1992-06-07|1992-07-13|NONE|AIR|lly furiously +48742|1984|29|6|35|66009.30|0.04|0.07|A|F|1992-06-26|1992-07-13|1992-07-03|NONE|RAIL|iously regular packages +48743|1874|75|1|10|17758.70|0.00|0.06|A|F|1995-02-04|1995-02-09|1995-02-05|NONE|REG AIR|usly final requests abo +48768|513|14|1|16|22616.16|0.02|0.08|N|O|1997-11-11|1997-10-16|1997-11-26|DELIVER IN PERSON|MAIL|tegrate slyly +48768|1818|5|2|24|41275.44|0.08|0.08|N|O|1997-08-01|1997-09-19|1997-08-29|DELIVER IN PERSON|REG AIR|s cajole blithely ironi +48768|1639|81|3|3|4621.89|0.06|0.04|N|O|1997-07-26|1997-08-22|1997-07-29|TAKE BACK RETURN|SHIP| packages nag alongside of the pendi +48769|293|75|1|31|36991.99|0.02|0.05|N|O|1995-12-10|1995-11-18|1995-12-15|DELIVER IN PERSON|TRUCK| pinto bea +48769|957|58|2|13|24153.35|0.03|0.03|N|O|1995-11-03|1995-12-21|1995-12-02|DELIVER IN PERSON|RAIL|he even, un +48769|1569|70|3|47|69116.32|0.02|0.01|N|O|1995-10-31|1995-11-18|1995-11-02|COLLECT COD|RAIL| around the carefully reg +48770|1187|88|1|30|32645.40|0.01|0.08|A|F|1992-07-18|1992-05-28|1992-08-04|COLLECT COD|SHIP|rint. special requests wake. slyly ironic a +48770|169|22|2|18|19244.88|0.04|0.05|A|F|1992-05-03|1992-06-20|1992-05-11|DELIVER IN PERSON|MAIL|quickly quickly ironic re +48770|1272|47|3|20|23465.40|0.03|0.05|R|F|1992-06-05|1992-06-02|1992-06-15|NONE|RAIL|e fluffily above the regular, ironic i +48770|1146|55|4|38|39791.32|0.00|0.08|R|F|1992-04-10|1992-05-13|1992-04-20|TAKE BACK RETURN|SHIP|y. slyly ironic foxes +48771|830|31|1|2|3461.66|0.00|0.00|N|O|1998-02-04|1998-04-05|1998-02-17|DELIVER IN PERSON|SHIP|ng instructions wake. dinos +48771|1709|94|2|49|78924.30|0.06|0.03|N|O|1998-03-16|1998-03-30|1998-04-14|COLLECT COD|RAIL|hely even requests. +48772|1153|90|1|3|3162.45|0.07|0.04|R|F|1994-05-22|1994-06-21|1994-06-08|COLLECT COD|SHIP|ke pending, final foxes. unu +48772|1366|81|2|34|43090.24|0.01|0.07|R|F|1994-08-20|1994-08-05|1994-08-26|TAKE BACK RETURN|RAIL| haggle special dependenci +48772|502|3|3|11|15427.50|0.04|0.07|A|F|1994-05-16|1994-07-29|1994-06-09|NONE|AIR|posits wake +48772|1755|98|4|3|4970.25|0.03|0.04|R|F|1994-09-10|1994-07-12|1994-09-25|NONE|AIR|quickly ironic asym +48772|55|31|5|14|13370.70|0.06|0.04|R|F|1994-06-07|1994-08-09|1994-06-09|COLLECT COD|AIR|ms. carefull +48772|1859|60|6|6|10565.10|0.00|0.02|A|F|1994-08-20|1994-06-15|1994-08-31|COLLECT COD|AIR|l packages use caref +48772|1061|97|7|32|30785.92|0.03|0.03|A|F|1994-08-02|1994-07-31|1994-08-07|COLLECT COD|MAIL| regular foxes thrash s +48773|348|33|1|43|53678.62|0.04|0.03|R|F|1994-03-15|1994-02-28|1994-04-10|COLLECT COD|FOB| the blithely e +48773|191|44|2|37|40374.03|0.05|0.00|A|F|1994-03-05|1994-03-30|1994-03-27|TAKE BACK RETURN|SHIP|oost furiously. sp +48773|1460|100|3|45|61265.70|0.06|0.06|A|F|1994-04-25|1994-02-17|1994-05-24|COLLECT COD|MAIL|ely final foxes. blithely ironic excuse +48774|69|70|1|12|11628.72|0.04|0.03|R|F|1992-08-30|1992-10-30|1992-09-02|DELIVER IN PERSON|TRUCK|y ironic requests may sleep foxes. qu +48775|1465|83|1|5|6832.30|0.00|0.03|R|F|1994-11-30|1994-11-29|1994-12-19|NONE|AIR|y special dolphins are carefully +48775|877|77|2|49|87115.63|0.10|0.04|A|F|1994-11-08|1994-11-21|1994-11-19|COLLECT COD|AIR| to the dar +48775|1447|65|3|42|56634.48|0.10|0.06|R|F|1994-11-11|1994-10-12|1994-12-01|COLLECT COD|REG AIR|y carefully final +48800|1928|73|1|23|42088.16|0.03|0.02|R|F|1994-01-24|1994-01-18|1994-02-07|COLLECT COD|FOB|ckages are. slyly pe +48800|1760|87|2|23|38220.48|0.03|0.06|A|F|1994-01-08|1993-12-28|1994-01-18|TAKE BACK RETURN|TRUCK|special packages boost across the un +48800|669|70|3|9|14126.94|0.04|0.00|A|F|1993-12-05|1993-11-27|1993-12-28|TAKE BACK RETURN|TRUCK|unts. stealthily regular dependencie +48800|684|47|4|48|76064.64|0.01|0.01|R|F|1993-10-28|1993-12-27|1993-11-09|DELIVER IN PERSON|AIR|s according to the blith +48800|159|60|5|23|24360.45|0.04|0.01|R|F|1994-01-14|1994-01-05|1994-02-11|DELIVER IN PERSON|AIR|c accounts try to nag along the perman +48800|291|46|6|17|20251.93|0.09|0.03|R|F|1993-11-15|1993-12-20|1993-12-02|TAKE BACK RETURN|TRUCK|packages use slyly according to the slyly f +48801|767|100|1|10|16677.60|0.07|0.03|R|F|1992-11-24|1992-12-07|1992-12-17|DELIVER IN PERSON|FOB|across the unu +48801|957|60|2|22|40874.90|0.00|0.08|A|F|1992-11-13|1993-01-09|1992-12-08|TAKE BACK RETURN|FOB|nag alongside of the quickly regular p +48801|595|96|3|43|64310.37|0.05|0.07|A|F|1992-11-03|1992-12-19|1992-11-24|DELIVER IN PERSON|FOB|se about the carefully final dependencie +48801|1129|38|4|26|26783.12|0.02|0.07|A|F|1992-11-02|1992-12-15|1992-11-18|TAKE BACK RETURN|SHIP|arefully even accounts wake blithely +48801|1421|61|5|10|13224.20|0.07|0.08|A|F|1993-01-03|1992-12-15|1993-02-01|COLLECT COD|REG AIR|ly even requests. final pac +48801|1378|55|6|9|11514.33|0.06|0.08|R|F|1992-10-19|1992-12-04|1992-11-17|COLLECT COD|RAIL|et warthogs nag quickly accounts. bli +48802|1268|80|1|7|8184.82|0.09|0.08|A|F|1992-08-05|1992-09-23|1992-08-13|DELIVER IN PERSON|REG AIR|ely unusual pains +48803|1429|8|1|40|53216.80|0.04|0.05|A|F|1993-03-01|1993-01-06|1993-03-24|NONE|SHIP|lithely regular foxes sleep fluffil +48803|1590|91|2|41|61155.19|0.06|0.02|A|F|1993-02-19|1993-01-24|1993-03-11|DELIVER IN PERSON|MAIL|ly about the special, silent depo +48804|1834|35|1|5|8679.15|0.06|0.02|N|O|1997-10-09|1997-10-03|1997-11-07|COLLECT COD|AIR|he slyly si +48804|1956|1|2|42|78033.90|0.02|0.06|N|O|1997-12-18|1997-10-13|1998-01-08|NONE|TRUCK|le fluffily pending ideas. quickly ironic +48805|326|11|1|25|30658.00|0.02|0.07|A|F|1994-03-20|1994-04-07|1994-03-24|TAKE BACK RETURN|SHIP|ecial requests alongside of the furious +48806|1025|26|1|23|21298.46|0.04|0.03|N|O|1996-04-06|1996-05-09|1996-04-30|TAKE BACK RETURN|REG AIR|. platelets use carefully. qu +48806|1821|51|2|5|8614.10|0.06|0.07|N|O|1996-04-09|1996-04-28|1996-05-03|TAKE BACK RETURN|AIR|nts. slyly regular theodolites haggl +48806|1278|90|3|47|55425.69|0.08|0.06|N|O|1996-04-16|1996-05-08|1996-04-17|NONE|SHIP|ly packages. ironic th +48806|1906|51|4|26|47005.40|0.09|0.02|N|O|1996-03-16|1996-05-07|1996-04-08|DELIVER IN PERSON|AIR|platelets. ironic instr +48806|1793|78|5|21|35590.59|0.03|0.05|N|O|1996-04-13|1996-04-08|1996-05-12|DELIVER IN PERSON|FOB|odolites caj +48806|1930|19|6|18|32974.74|0.07|0.02|N|O|1996-03-06|1996-05-17|1996-03-23|TAKE BACK RETURN|REG AIR|unusual packages. regular, even instru +48806|1062|98|7|4|3852.24|0.05|0.08|N|O|1996-04-16|1996-05-01|1996-04-24|COLLECT COD|REG AIR|ly regular deposits. ironic ideas +48807|788|21|1|14|23642.92|0.01|0.01|A|F|1992-06-11|1992-08-01|1992-06-25|COLLECT COD|MAIL| furiously slyly eve +48807|1372|49|2|49|62395.13|0.10|0.01|R|F|1992-07-16|1992-07-20|1992-08-09|COLLECT COD|SHIP| blithely iron +48832|1025|26|1|18|16668.36|0.04|0.03|R|F|1993-07-26|1993-07-17|1993-08-24|NONE|MAIL| requests. deposi +48832|1015|16|2|7|6412.07|0.05|0.01|R|F|1993-06-21|1993-07-11|1993-07-03|TAKE BACK RETURN|SHIP|ought to boost slyly slyly unusual fray +48833|455|43|1|36|48796.20|0.03|0.05|N|O|1996-04-24|1996-04-29|1996-05-10|NONE|FOB|rls boost bli +48833|1631|14|2|29|44446.27|0.01|0.03|N|O|1996-04-22|1996-04-28|1996-05-04|COLLECT COD|REG AIR|the pending inst +48834|1213|25|1|14|15598.94|0.08|0.06|N|O|1997-01-07|1997-01-08|1997-01-22|TAKE BACK RETURN|REG AIR| final requests affix after the +48834|9|60|2|50|45450.00|0.05|0.03|N|O|1997-03-07|1996-12-18|1997-03-09|COLLECT COD|RAIL|ess foxes; carefully regular theodol +48834|1451|52|3|2|2704.90|0.03|0.08|N|O|1996-12-26|1997-01-27|1997-01-08|DELIVER IN PERSON|MAIL|l pearls are above the ironic +48835|660|54|1|50|78033.00|0.02|0.04|R|F|1993-04-11|1993-03-24|1993-04-12|COLLECT COD|MAIL|gside of the carefully +48836|401|60|1|7|9109.80|0.00|0.02|A|F|1994-02-16|1994-04-30|1994-02-24|NONE|FOB|fully around the furiously ironic depe +48836|1335|74|2|30|37089.90|0.00|0.08|R|F|1994-05-25|1994-03-30|1994-06-19|NONE|AIR| packages alo +48836|952|55|3|9|16676.55|0.07|0.01|A|F|1994-05-20|1994-05-14|1994-05-27|DELIVER IN PERSON|RAIL|posits. courts are blithely. +48836|352|81|4|44|55103.40|0.03|0.01|R|F|1994-03-29|1994-03-23|1994-04-22|NONE|TRUCK|ckly bold pinto bea +48836|1167|76|5|3|3204.48|0.03|0.05|R|F|1994-04-27|1994-04-13|1994-05-10|TAKE BACK RETURN|TRUCK|uffily special +48837|1061|97|1|24|23089.44|0.06|0.02|N|O|1995-07-28|1995-10-06|1995-08-03|TAKE BACK RETURN|SHIP|the carefully bol +48837|1900|87|2|39|70274.10|0.02|0.03|N|O|1995-09-11|1995-09-12|1995-09-22|TAKE BACK RETURN|AIR|aggle slyly. r +48837|1598|79|3|12|17995.08|0.09|0.03|N|O|1995-09-16|1995-09-07|1995-10-07|TAKE BACK RETURN|TRUCK|ve the final, blith +48837|1724|25|4|36|58525.92|0.02|0.04|N|O|1995-09-28|1995-09-24|1995-10-08|COLLECT COD|RAIL|ckly final platelets use according to the c +48838|1331|32|1|27|33272.91|0.06|0.06|N|O|1996-08-29|1996-09-11|1996-08-31|NONE|TRUCK|ests could wake. fluffi +48838|1429|30|2|10|13304.20|0.10|0.04|N|O|1996-09-11|1996-08-06|1996-09-13|DELIVER IN PERSON|MAIL|ly accordi +48838|1600|81|3|11|16517.60|0.04|0.04|N|O|1996-06-20|1996-09-05|1996-06-25|COLLECT COD|FOB|ackages among the blithely silent fo +48838|1208|20|4|43|47695.60|0.04|0.07|N|O|1996-08-28|1996-08-23|1996-09-21|TAKE BACK RETURN|FOB|ly regular deposits use blithe +48838|50|26|5|16|15200.80|0.01|0.01|N|O|1996-06-26|1996-07-28|1996-07-15|TAKE BACK RETURN|MAIL|equests? even pin +48839|419|78|1|20|26388.20|0.07|0.01|R|F|1993-08-14|1993-09-25|1993-09-12|DELIVER IN PERSON|TRUCK|posits haggle slyly against t +48839|391|48|2|27|34867.53|0.06|0.02|A|F|1993-08-11|1993-09-25|1993-08-21|TAKE BACK RETURN|SHIP|ar foxes. sl +48839|1432|33|3|33|44003.19|0.04|0.01|A|F|1993-07-29|1993-08-26|1993-08-22|TAKE BACK RETURN|RAIL|. ironic, pending th +48864|661|62|1|10|15616.60|0.05|0.01|N|O|1998-01-13|1997-12-13|1998-01-22|DELIVER IN PERSON|SHIP|ckly. silent pl +48864|793|58|2|25|42344.75|0.07|0.01|N|O|1998-01-21|1997-12-30|1998-02-03|TAKE BACK RETURN|MAIL|mptotes. furiousl +48865|1801|31|1|36|61300.80|0.08|0.00|A|F|1994-01-23|1993-12-14|1994-02-22|TAKE BACK RETURN|RAIL| pending platelets nag slyly alongsi +48865|1284|22|2|47|55708.16|0.04|0.07|R|F|1993-11-17|1993-12-18|1993-11-28|TAKE BACK RETURN|TRUCK|luffily fin +48865|832|99|3|7|12129.81|0.05|0.00|R|F|1994-02-10|1994-01-22|1994-03-12|NONE|RAIL|ffily pending pinto beans around the blit +48865|37|38|4|2|1874.06|0.00|0.01|R|F|1994-02-23|1993-12-08|1994-03-07|DELIVER IN PERSON|FOB|cajole over +48865|157|10|5|47|49686.05|0.01|0.05|R|F|1993-11-16|1993-11-29|1993-11-22|TAKE BACK RETURN|REG AIR|lve blithely along t +48865|1860|47|6|7|12333.02|0.07|0.07|A|F|1994-01-24|1994-01-10|1994-01-29|TAKE BACK RETURN|AIR|s. furiously unusual deposi +48866|1802|32|1|16|27260.80|0.02|0.04|R|F|1992-10-05|1992-09-14|1992-10-22|DELIVER IN PERSON|AIR|s. final, express requests a +48866|1706|33|2|30|48231.00|0.00|0.02|R|F|1992-08-19|1992-07-19|1992-09-16|NONE|AIR| bold requests sleep excuses. requests s +48866|1986|87|3|18|33983.64|0.01|0.01|R|F|1992-10-07|1992-07-23|1992-10-08|NONE|MAIL|slyly special platel +48867|516|77|1|23|32579.73|0.07|0.07|N|O|1998-03-04|1998-03-17|1998-03-23|NONE|AIR|tes. fluffily +48867|801|1|2|1|1701.80|0.08|0.02|N|O|1998-05-07|1998-04-12|1998-05-14|DELIVER IN PERSON|AIR|sts. ironic realms +48867|569|70|3|25|36739.00|0.04|0.08|N|O|1998-03-01|1998-05-06|1998-03-18|NONE|REG AIR|g packages. +48867|34|85|4|18|16812.54|0.07|0.07|N|O|1998-04-07|1998-05-04|1998-05-02|COLLECT COD|FOB|to the final, pending deposits nod +48867|667|68|5|2|3135.32|0.02|0.02|N|O|1998-05-06|1998-03-20|1998-05-26|DELIVER IN PERSON|REG AIR|ular theodolites. regular, expres +48868|1719|4|1|18|29172.78|0.09|0.05|R|F|1992-08-24|1992-07-17|1992-09-07|TAKE BACK RETURN|REG AIR|regular theodolite +48868|374|59|2|15|19115.55|0.02|0.02|R|F|1992-07-02|1992-07-16|1992-07-23|DELIVER IN PERSON|TRUCK| the fluffily special deposi +48868|1125|98|3|7|7182.84|0.00|0.08|A|F|1992-09-23|1992-07-19|1992-10-12|NONE|FOB|pinto beans. bold, busy +48868|1823|10|4|27|46570.14|0.02|0.02|A|F|1992-06-27|1992-08-08|1992-07-06|NONE|RAIL|y ironic accounts run slyly. furiously even +48868|376|61|5|16|20421.92|0.07|0.05|A|F|1992-09-24|1992-08-05|1992-10-11|TAKE BACK RETURN|MAIL|. furiously even braids +48868|1428|68|6|36|47859.12|0.03|0.03|R|F|1992-06-21|1992-07-14|1992-07-17|DELIVER IN PERSON|FOB|rate slyly according +48869|1319|20|1|42|51253.02|0.05|0.08|N|O|1996-10-09|1996-08-29|1996-10-26|DELIVER IN PERSON|FOB|press reque +48869|1801|45|2|24|40867.20|0.09|0.00|N|O|1996-08-20|1996-09-06|1996-08-21|DELIVER IN PERSON|FOB|ely special p +48869|410|40|3|37|48485.17|0.01|0.07|N|O|1996-09-26|1996-08-12|1996-10-12|COLLECT COD|TRUCK|e blithely ironic pac +48869|787|88|4|10|16877.80|0.02|0.02|N|O|1996-07-19|1996-08-20|1996-08-06|NONE|REG AIR| packages ha +48869|875|76|5|28|49724.36|0.07|0.04|N|O|1996-10-05|1996-09-10|1996-10-30|COLLECT COD|RAIL|xpress packages. quickly iro +48869|1002|73|6|45|40635.00|0.03|0.00|N|O|1996-09-17|1996-07-31|1996-10-10|NONE|TRUCK| fluffily thinly unusual excuses. final +48869|386|15|7|39|50168.82|0.01|0.05|N|O|1996-09-02|1996-07-28|1996-09-12|DELIVER IN PERSON|SHIP| accounts. fluffily ex +48870|24|50|1|42|38808.84|0.10|0.04|N|O|1996-08-11|1996-07-24|1996-08-23|TAKE BACK RETURN|FOB|inal, pending courts-- deposits are bl +48870|1960|49|2|49|91236.04|0.03|0.06|N|O|1996-06-17|1996-06-02|1996-07-11|COLLECT COD|RAIL|ackages: quickly special re +48870|159|12|3|21|22242.15|0.06|0.03|N|O|1996-06-29|1996-06-20|1996-07-19|TAKE BACK RETURN|FOB|foxes cajo +48870|1932|21|4|6|11003.58|0.08|0.00|N|O|1996-07-11|1996-07-17|1996-07-25|TAKE BACK RETURN|SHIP|quests nag about the regular dolphi +48871|1140|13|1|9|9370.26|0.02|0.07|N|O|1997-07-19|1997-08-07|1997-08-16|TAKE BACK RETURN|AIR|onic deposits. regular, bold idea +48896|1959|60|1|8|14887.60|0.03|0.05|A|F|1995-02-08|1994-12-19|1995-03-04|COLLECT COD|FOB|final theodolites haggle packages. +48896|1219|57|2|19|21283.99|0.04|0.08|A|F|1994-12-31|1994-12-11|1995-01-17|DELIVER IN PERSON|MAIL|ing deposits sleep quickly carefull +48897|1887|17|1|45|80499.60|0.03|0.03|N|O|1997-05-28|1997-06-03|1997-06-17|DELIVER IN PERSON|TRUCK|final packages. bold +48897|1354|55|2|23|28873.05|0.04|0.06|N|O|1997-05-10|1997-05-10|1997-05-27|COLLECT COD|FOB|fts across the r +48897|1157|94|3|34|35977.10|0.01|0.02|N|O|1997-07-13|1997-06-08|1997-08-05|NONE|TRUCK|e carefully special, express sentiments. +48897|1248|23|4|32|36775.68|0.03|0.03|N|O|1997-05-20|1997-06-26|1997-06-11|COLLECT COD|TRUCK|y regular pinto beans doze evenly iro +48898|366|23|1|46|58252.56|0.01|0.01|R|F|1992-05-21|1992-05-18|1992-06-20|NONE|SHIP|special packages sleep blit +48899|1121|58|1|39|39862.68|0.06|0.08|R|F|1995-01-22|1995-03-30|1995-02-06|DELIVER IN PERSON|TRUCK|eposits. requests haggle blithely. +48899|325|54|2|24|29407.68|0.07|0.06|A|F|1995-03-11|1995-03-16|1995-03-30|NONE|MAIL|ke quickly upon the fin +48899|1882|12|3|8|14271.04|0.07|0.07|A|F|1995-04-06|1995-03-16|1995-04-08|TAKE BACK RETURN|SHIP|leep furiously across the quickly bold cour +48899|1562|63|4|39|57078.84|0.05|0.00|A|F|1995-02-27|1995-03-30|1995-02-28|COLLECT COD|FOB|ronic deposits. i +48899|662|94|5|28|43754.48|0.04|0.08|R|F|1995-02-26|1995-03-09|1995-03-28|COLLECT COD|MAIL| blithely ironic a +48899|600|61|6|36|54021.60|0.01|0.07|R|F|1995-02-04|1995-02-27|1995-02-08|COLLECT COD|MAIL|y express courts sleep f +48900|1050|86|1|46|43748.30|0.04|0.00|R|F|1994-03-26|1994-06-14|1994-04-23|COLLECT COD|TRUCK| quickly according to the fluffily reg +48900|313|98|2|48|58238.88|0.09|0.08|A|F|1994-07-22|1994-04-30|1994-07-27|TAKE BACK RETURN|REG AIR|ests. caref +48900|1679|80|3|30|47420.10|0.07|0.06|A|F|1994-07-04|1994-05-08|1994-07-22|NONE|FOB|gle along the sl +48900|1617|18|4|5|7593.05|0.07|0.02|A|F|1994-07-04|1994-05-21|1994-07-09|TAKE BACK RETURN|AIR|old ideas after the f +48900|1132|69|5|47|48557.11|0.00|0.07|R|F|1994-04-29|1994-05-31|1994-05-11|DELIVER IN PERSON|FOB|; regular excuses cajole quickly at the fur +48901|804|38|1|36|61372.80|0.03|0.07|N|O|1998-02-28|1998-01-22|1998-03-21|TAKE BACK RETURN|SHIP|haggle blithely at the furiously sp +48901|1773|58|2|27|45218.79|0.05|0.00|N|O|1998-01-26|1998-02-19|1998-02-09|TAKE BACK RETURN|FOB|ts boost. iron +48901|1902|91|3|30|54117.00|0.02|0.05|N|O|1998-01-14|1998-01-24|1998-01-21|NONE|TRUCK|ole blithely alongside of the inst +48901|1722|7|4|24|38969.28|0.06|0.01|N|O|1997-12-15|1998-01-20|1998-01-12|COLLECT COD|AIR|hely above the blithely final pl +48901|217|45|5|48|53626.08|0.08|0.06|N|O|1998-01-26|1998-02-09|1998-02-10|NONE|TRUCK|structions. quickly regular instructions w +48901|1174|47|6|18|19353.06|0.06|0.05|N|O|1997-12-29|1998-02-07|1998-01-18|NONE|AIR|its cajole finally +48901|476|64|7|14|19270.58|0.06|0.03|N|O|1998-02-07|1998-01-13|1998-02-22|TAKE BACK RETURN|REG AIR|yly bold p +48902|795|60|1|13|22045.27|0.00|0.05|A|F|1992-10-26|1992-12-11|1992-10-31|COLLECT COD|AIR|press accounts. final theodolites +48902|283|11|2|13|15382.64|0.02|0.07|A|F|1993-01-11|1992-12-13|1993-01-31|COLLECT COD|FOB|gular, even accounts nag. i +48903|926|29|1|24|43846.08|0.10|0.08|R|F|1995-02-10|1995-01-30|1995-03-05|COLLECT COD|MAIL|eas sleep. regular accounts believe ag +48928|1193|94|1|45|49238.55|0.05|0.03|N|O|1997-09-30|1997-07-21|1997-10-24|DELIVER IN PERSON|MAIL|ly ironic asymptotes sleep quickly. fluff +48928|30|56|2|4|3720.12|0.07|0.05|N|O|1997-09-04|1997-09-01|1997-09-22|NONE|SHIP|cial, final packages. +48928|476|64|3|37|50929.39|0.03|0.05|N|O|1997-07-29|1997-07-26|1997-08-14|DELIVER IN PERSON|SHIP|se requests wake blithely alongside of t +48928|873|7|4|50|88693.50|0.00|0.04|N|O|1997-07-28|1997-07-21|1997-08-03|NONE|MAIL|to beans haggle quickly accordi +48928|1911|100|5|2|3625.82|0.09|0.02|N|O|1997-09-12|1997-08-03|1997-09-25|NONE|REG AIR|ress platelets. quickly bol +48929|221|3|1|3|3363.66|0.07|0.04|R|F|1994-12-04|1995-01-18|1994-12-10|NONE|AIR|ate finally idle reque +48929|1786|13|2|34|57384.52|0.10|0.05|A|F|1995-01-11|1995-01-16|1995-02-02|COLLECT COD|TRUCK|r excuses are carefully exp +48929|791|88|3|49|82897.71|0.03|0.08|A|F|1994-11-05|1995-01-05|1994-11-13|COLLECT COD|MAIL| deposits haggle furio +48929|150|51|4|43|45156.45|0.03|0.02|A|F|1995-01-26|1994-12-20|1995-02-16|TAKE BACK RETURN|REG AIR|blithely f +48929|805|72|5|43|73349.40|0.03|0.04|R|F|1994-12-27|1995-01-21|1995-01-24|NONE|FOB| packages boost +48929|1439|79|6|24|32170.32|0.03|0.01|A|F|1994-11-28|1995-01-20|1994-12-17|NONE|TRUCK|the special packages. +48930|531|62|1|23|32925.19|0.08|0.08|N|O|1996-05-20|1996-03-24|1996-06-06|NONE|TRUCK|riously express dol +48930|299|100|2|47|56366.63|0.03|0.08|N|O|1996-04-29|1996-04-29|1996-05-07|NONE|TRUCK| blithely alongside of th +48930|1033|4|3|30|28020.90|0.00|0.03|N|O|1996-02-09|1996-04-03|1996-02-18|TAKE BACK RETURN|TRUCK|hins. enticingly bold theodolite +48930|1184|21|4|41|44492.38|0.06|0.03|N|O|1996-02-21|1996-03-25|1996-03-21|DELIVER IN PERSON|SHIP|s the silently sp +48930|1828|58|5|36|62273.52|0.09|0.08|N|O|1996-02-26|1996-03-30|1996-03-18|NONE|FOB|ously final pinto bea +48930|485|44|6|29|40178.92|0.02|0.08|N|O|1996-02-08|1996-04-06|1996-02-17|NONE|SHIP|foxes use slyly. furiously express re +48930|680|74|7|14|22129.52|0.03|0.07|N|O|1996-05-01|1996-03-03|1996-05-20|COLLECT COD|TRUCK|ainst the requests are along +48931|888|88|1|43|76921.84|0.10|0.01|A|F|1994-09-24|1994-09-14|1994-10-18|TAKE BACK RETURN|MAIL|e excuses boost quickly afte +48931|1049|50|2|19|18050.76|0.07|0.05|R|F|1994-10-07|1994-09-08|1994-10-20|NONE|SHIP|ironic reque +48931|20|71|3|29|26680.58|0.06|0.05|R|F|1994-10-16|1994-08-25|1994-10-24|TAKE BACK RETURN|SHIP|special courts. furiously even requests ar +48931|99|50|4|4|3996.36|0.08|0.05|R|F|1994-08-24|1994-09-02|1994-09-20|TAKE BACK RETURN|MAIL|s haggle at the carefully even +48931|1295|70|5|42|50244.18|0.01|0.03|R|F|1994-09-24|1994-08-29|1994-10-04|DELIVER IN PERSON|SHIP|onic packages use +48931|768|65|6|49|81769.24|0.06|0.04|A|F|1994-09-08|1994-08-24|1994-09-23|TAKE BACK RETURN|REG AIR|ve the carefully final asymptotes. +48931|535|36|7|47|67469.91|0.09|0.01|A|F|1994-08-29|1994-08-27|1994-09-17|NONE|SHIP|ding instructions. +48932|1586|67|1|33|49090.14|0.01|0.08|N|O|1998-07-08|1998-06-21|1998-07-20|COLLECT COD|AIR|gular ideas wake carefully ab +48932|292|74|2|25|29807.25|0.01|0.00|N|O|1998-07-27|1998-06-30|1998-08-11|COLLECT COD|RAIL|eans are regular ideas. fluffily +48933|1112|13|1|15|15196.65|0.04|0.08|R|F|1992-04-04|1992-04-24|1992-04-15|TAKE BACK RETURN|MAIL|ly unusual pinto b +48934|129|82|1|40|41164.80|0.10|0.07|N|O|1997-05-07|1997-06-03|1997-06-03|NONE|MAIL|lar account +48934|1325|64|2|34|41694.88|0.05|0.08|N|O|1997-05-14|1997-07-02|1997-05-20|COLLECT COD|SHIP| blithely even re +48934|17|18|3|7|6419.07|0.06|0.00|N|O|1997-06-15|1997-05-24|1997-06-16|NONE|REG AIR|ptotes boost according to the furiou +48934|1201|76|4|19|20941.80|0.05|0.05|N|O|1997-06-19|1997-07-09|1997-07-12|TAKE BACK RETURN|SHIP|iously ironic p +48934|1907|96|5|1|1808.90|0.06|0.02|N|O|1997-04-23|1997-06-28|1997-04-24|COLLECT COD|REG AIR|lyly regular dolphins. bold, unusu +48935|244|45|1|5|5721.20|0.10|0.04|A|F|1993-03-12|1993-03-17|1993-03-21|NONE|FOB|onic theodolites. furiously +48935|1330|7|2|45|55409.85|0.00|0.06|A|F|1993-04-28|1993-02-27|1993-05-27|TAKE BACK RETURN|REG AIR|y bold accou +48935|1919|20|3|30|54627.30|0.10|0.05|R|F|1993-01-26|1993-04-03|1993-02-11|COLLECT COD|FOB|nal requests are regular accounts. quietly +48935|1571|92|4|40|58902.80|0.04|0.00|A|F|1993-04-10|1993-04-02|1993-04-30|COLLECT COD|MAIL|osits. fluffily pending th +48935|740|41|5|50|82037.00|0.08|0.04|R|F|1993-04-22|1993-02-08|1993-04-28|NONE|RAIL|ously final pinto beans haggle across +48935|1128|29|6|25|25728.00|0.08|0.08|A|F|1993-02-05|1993-02-10|1993-02-25|COLLECT COD|REG AIR|fully even deposits sleep b +48935|1536|77|7|32|46000.96|0.02|0.07|R|F|1993-02-17|1993-02-15|1993-02-26|COLLECT COD|SHIP|ial packages unwind above the quic +48960|1627|69|1|20|30572.40|0.10|0.00|N|O|1997-10-18|1997-10-16|1997-11-17|TAKE BACK RETURN|SHIP|structions are carefu +48960|1559|60|2|37|54040.35|0.02|0.02|N|O|1997-09-09|1997-10-24|1997-10-05|TAKE BACK RETURN|RAIL|le blithel +48960|1589|30|3|45|67076.10|0.00|0.07|N|O|1997-11-17|1997-12-03|1997-12-07|COLLECT COD|AIR|counts. final deposits about the regula +48960|374|59|4|15|19115.55|0.04|0.02|N|O|1997-09-27|1997-10-07|1997-10-10|COLLECT COD|FOB|lve against the furiously express packag +48961|61|62|1|6|5766.36|0.03|0.06|R|F|1994-11-06|1994-10-17|1994-12-06|TAKE BACK RETURN|TRUCK|lyly regular acco +48961|641|35|2|14|21582.96|0.01|0.07|R|F|1994-09-30|1994-08-31|1994-10-08|DELIVER IN PERSON|MAIL|en deposits +48961|46|72|3|36|34057.44|0.07|0.08|A|F|1994-10-13|1994-09-30|1994-10-31|COLLECT COD|TRUCK|ies impress slyly. daringly even ideas +48961|676|70|4|18|28380.06|0.06|0.00|R|F|1994-10-13|1994-08-26|1994-11-07|DELIVER IN PERSON|MAIL|ven excuses-- sentiments ar +48961|63|64|5|32|30817.92|0.06|0.01|R|F|1994-07-27|1994-09-30|1994-08-21|TAKE BACK RETURN|MAIL|ar instructions; slyly ironic b +48961|1696|97|6|27|43137.63|0.01|0.07|R|F|1994-07-31|1994-09-12|1994-08-22|COLLECT COD|MAIL|rouches haggle ag +48961|734|35|7|32|52311.36|0.02|0.04|A|F|1994-11-11|1994-10-08|1994-11-27|DELIVER IN PERSON|FOB|totes sleep ironically furiously b +48962|1046|82|1|46|43563.84|0.08|0.05|N|O|1998-02-03|1998-03-13|1998-02-08|DELIVER IN PERSON|FOB|s sleep above the furiously final requests +48962|745|78|2|44|72412.56|0.08|0.07|N|O|1998-02-28|1998-03-04|1998-03-30|COLLECT COD|RAIL|s: regular courts integra +48962|1827|28|3|44|76068.08|0.03|0.08|N|O|1998-02-16|1998-04-01|1998-02-21|DELIVER IN PERSON|MAIL| ironic requests wake. regular theodolites +48962|244|26|4|10|11442.40|0.07|0.04|N|O|1998-01-30|1998-03-30|1998-02-07|COLLECT COD|RAIL|aggle pendi +48962|429|59|5|18|23929.56|0.02|0.01|N|O|1998-04-03|1998-04-23|1998-04-06|TAKE BACK RETURN|SHIP|e carefully r +48962|1178|51|6|43|46404.31|0.08|0.08|N|O|1998-01-30|1998-04-11|1998-02-18|COLLECT COD|SHIP|nic depths. slyl +48962|1521|42|7|30|42675.60|0.08|0.06|N|O|1998-04-20|1998-03-21|1998-04-28|COLLECT COD|SHIP|hely even excuses boost. ironic +48963|294|76|1|48|57325.92|0.00|0.01|R|F|1993-12-13|1994-01-14|1993-12-27|NONE|TRUCK|l accounts affix slyly carefully +48963|1395|72|2|21|27224.19|0.01|0.00|R|F|1993-11-30|1993-12-06|1993-12-18|TAKE BACK RETURN|AIR|quietly even braids haggle slyly silent de +48963|1235|73|3|47|53402.81|0.02|0.05|A|F|1994-01-06|1993-12-31|1994-01-07|TAKE BACK RETURN|AIR|ideas x-ray. even, fi +48963|870|71|4|19|33646.53|0.02|0.02|A|F|1993-11-22|1993-12-05|1993-11-27|COLLECT COD|MAIL|cial pinto beans. furiously regular +48964|1194|31|1|22|24094.18|0.04|0.04|N|O|1996-11-04|1996-09-21|1996-11-14|COLLECT COD|AIR|the quickly r +48964|1090|61|2|19|18830.71|0.00|0.05|N|O|1996-09-11|1996-10-07|1996-09-30|DELIVER IN PERSON|REG AIR|oys boost among the unusual dolphins. +48964|1329|68|3|30|36909.60|0.01|0.03|N|O|1996-08-25|1996-10-17|1996-09-11|COLLECT COD|REG AIR|ess packages above t +48964|1212|24|4|20|22264.20|0.04|0.08|N|O|1996-10-04|1996-10-07|1996-10-20|COLLECT COD|SHIP|quests cajo +48965|130|57|1|48|49446.24|0.07|0.08|R|F|1993-06-19|1993-06-22|1993-07-03|COLLECT COD|AIR|ly ironic packages. +48965|779|76|2|14|23516.78|0.04|0.06|R|F|1993-04-16|1993-06-14|1993-04-29|NONE|REG AIR|dependencies for the even re +48965|445|75|3|42|56508.48|0.01|0.08|A|F|1993-05-31|1993-05-29|1993-06-14|NONE|AIR|y idle deposits. blithely special asym +48966|670|2|1|4|6282.68|0.10|0.01|R|F|1993-07-23|1993-08-04|1993-08-11|DELIVER IN PERSON|REG AIR|ntegrate carefull +48966|1926|71|2|2|3655.84|0.10|0.08|R|F|1993-06-19|1993-08-24|1993-06-20|NONE|RAIL|riously silent accounts. ironic excuses +48967|1245|83|1|6|6877.44|0.03|0.01|A|F|1992-02-24|1992-03-20|1992-03-07|NONE|MAIL| packages. furiously final packages cajo +48967|717|82|2|16|25883.36|0.00|0.02|A|F|1992-05-24|1992-03-23|1992-06-10|TAKE BACK RETURN|RAIL|nic, regular +48992|1608|32|1|5|7548.00|0.00|0.00|N|O|1996-03-13|1996-04-23|1996-04-08|DELIVER IN PERSON|MAIL|ly. ruthless acc +48992|78|79|2|39|38144.73|0.10|0.06|N|O|1996-02-22|1996-04-06|1996-03-15|TAKE BACK RETURN|FOB| unusual ideas wake accoun +48993|179|32|1|6|6475.02|0.09|0.07|A|F|1992-09-26|1992-07-01|1992-10-17|TAKE BACK RETURN|TRUCK|unts was throughout the +48993|1019|20|2|18|16560.18|0.10|0.06|R|F|1992-08-27|1992-08-27|1992-09-15|TAKE BACK RETURN|REG AIR|er the blithely regular realms: final pint +48993|1678|20|3|33|52129.11|0.01|0.01|A|F|1992-06-10|1992-08-23|1992-06-12|COLLECT COD|FOB|t the carefully bold +48993|1449|67|4|28|37812.32|0.10|0.01|A|F|1992-07-04|1992-07-19|1992-08-02|NONE|AIR|beans. dependenci +48994|1145|46|1|9|9415.26|0.03|0.08|R|F|1993-10-29|1994-01-18|1993-11-23|COLLECT COD|AIR| along the quickly pending de +48994|585|16|2|40|59423.20|0.09|0.01|R|F|1993-12-02|1994-01-20|1993-12-30|COLLECT COD|TRUCK|sly special foxes haggle. regular multip +48994|1862|49|3|15|26457.90|0.04|0.01|R|F|1993-12-13|1993-12-30|1993-12-14|DELIVER IN PERSON|SHIP| the final pinto beans cajole after the fur +48995|580|41|1|39|57742.62|0.02|0.01|N|O|1997-02-09|1997-04-04|1997-03-10|COLLECT COD|TRUCK|g ideas sleep among +48995|267|22|2|19|22177.94|0.03|0.07|N|O|1997-04-04|1997-03-23|1997-04-11|DELIVER IN PERSON|TRUCK| thin packages. bold accounts use fluffily +48995|1902|3|3|26|46901.40|0.01|0.00|N|O|1997-01-27|1997-04-07|1997-02-12|DELIVER IN PERSON|SHIP|ermanent pl +48995|1721|64|4|5|8113.60|0.04|0.08|N|O|1997-02-06|1997-03-21|1997-03-03|COLLECT COD|AIR|sits cajole above the slyly regula +48995|1634|17|5|13|19963.19|0.01|0.01|N|O|1997-04-07|1997-03-08|1997-04-23|NONE|AIR|lets are fluffily against the even depo +48995|718|15|6|27|43705.17|0.10|0.08|N|O|1997-05-17|1997-03-31|1997-06-01|COLLECT COD|RAIL|ely final packages. even de +48995|239|94|7|27|30759.21|0.10|0.08|N|O|1997-02-06|1997-03-03|1997-02-18|TAKE BACK RETURN|FOB|d requests along the slyly express depos +48996|1113|86|1|40|40564.40|0.02|0.03|N|O|1995-10-12|1995-08-10|1995-11-03|DELIVER IN PERSON|FOB|l, ironic platelets sleep final ideas. iron +48997|286|87|1|50|59314.00|0.02|0.06|R|F|1994-10-01|1994-09-01|1994-10-16|NONE|AIR|ending saut +48998|49|100|1|14|13286.56|0.01|0.08|A|F|1994-03-16|1994-03-25|1994-03-22|COLLECT COD|SHIP|al foxes detect across +48998|347|76|2|49|61119.66|0.08|0.07|R|F|1994-04-07|1994-05-18|1994-04-26|TAKE BACK RETURN|TRUCK|ackages. special, +48998|1526|7|3|43|61383.36|0.05|0.05|R|F|1994-06-14|1994-04-06|1994-06-28|COLLECT COD|AIR|ecial ideas haggle. bl +48998|923|92|4|17|31006.64|0.00|0.04|R|F|1994-03-30|1994-04-12|1994-04-13|COLLECT COD|SHIP|ly express ideas sleep requests. re +48998|744|45|5|22|36184.28|0.03|0.06|R|F|1994-04-28|1994-05-16|1994-05-16|NONE|SHIP| even requests thrash a +48998|529|60|6|46|65757.92|0.03|0.04|R|F|1994-05-20|1994-05-09|1994-05-23|COLLECT COD|TRUCK|regular requests x-ray sl +48998|679|73|7|40|63186.80|0.10|0.03|R|F|1994-02-20|1994-05-04|1994-03-20|DELIVER IN PERSON|MAIL| dependencies +48999|1094|65|1|27|26867.43|0.09|0.05|N|O|1996-11-21|1996-10-28|1996-12-18|TAKE BACK RETURN|TRUCK| accounts. blith +48999|1698|81|2|1|1599.69|0.07|0.06|N|O|1996-11-04|1996-10-05|1996-11-18|TAKE BACK RETURN|AIR| unusual requests. re +48999|1640|41|3|35|53957.40|0.02|0.04|N|O|1996-12-04|1996-09-30|1996-12-22|DELIVER IN PERSON|FOB|even theodolites against t +49024|523|24|1|30|42705.60|0.01|0.06|N|O|1997-11-16|1997-11-25|1997-12-13|TAKE BACK RETURN|TRUCK|dependencies-- furiously regula +49025|980|81|1|46|86525.08|0.01|0.07|A|F|1992-06-18|1992-09-11|1992-06-27|COLLECT COD|RAIL|ly quickly +49026|1223|35|1|32|35975.04|0.08|0.06|R|F|1995-05-24|1995-04-09|1995-06-05|NONE|REG AIR|ven ideas breach b +49027|1377|78|1|39|49856.43|0.07|0.02|A|F|1995-04-14|1995-07-06|1995-04-24|DELIVER IN PERSON|AIR|he furiously even foxes. +49027|908|9|2|15|27133.50|0.07|0.03|N|O|1995-06-20|1995-06-14|1995-07-09|COLLECT COD|SHIP| the blithely +49027|1455|34|3|9|12208.05|0.06|0.05|A|F|1995-05-09|1995-05-25|1995-05-21|DELIVER IN PERSON|TRUCK|requests sleep finally. quickly exp +49027|1526|7|4|44|62810.88|0.02|0.03|N|F|1995-06-07|1995-06-08|1995-06-18|TAKE BACK RETURN|RAIL|eas boost +49028|803|37|1|19|32372.20|0.10|0.01|N|O|1997-02-17|1997-01-26|1997-03-18|COLLECT COD|REG AIR|accounts believe. ironic, bol +49029|1105|42|1|40|40244.00|0.05|0.01|A|F|1992-07-12|1992-08-01|1992-07-25|NONE|FOB|accounts affix f +49029|982|85|2|14|26361.72|0.09|0.00|R|F|1992-06-13|1992-07-09|1992-07-03|COLLECT COD|TRUCK| should haggle furiously along th +49030|1943|32|1|16|29519.04|0.00|0.02|N|O|1998-03-19|1998-03-17|1998-04-12|COLLECT COD|TRUCK|pecial packages haggle carefully furi +49030|1699|23|2|22|35215.18|0.05|0.01|N|O|1998-04-21|1998-03-15|1998-04-24|NONE|AIR|ld instruc +49030|1591|72|3|37|55225.83|0.09|0.00|N|O|1998-05-01|1998-03-30|1998-05-21|COLLECT COD|SHIP|dependencies integrate +49031|1406|24|1|4|5229.60|0.01|0.07|N|O|1997-08-05|1997-09-05|1997-08-20|TAKE BACK RETURN|RAIL|s the furiously final +49031|190|69|2|15|16352.85|0.08|0.02|N|O|1997-10-14|1997-09-11|1997-10-29|NONE|SHIP|carefully ironic deposits. even a +49031|1956|89|3|46|85465.70|0.05|0.06|N|O|1997-06-27|1997-08-03|1997-07-14|COLLECT COD|RAIL|sly silent platelets acc +49031|243|25|4|10|11432.40|0.04|0.08|N|O|1997-09-01|1997-09-10|1997-09-08|DELIVER IN PERSON|AIR|g, unusual asymptotes. quickly expr +49056|1635|18|1|20|30732.60|0.07|0.02|R|F|1994-12-23|1994-11-29|1995-01-08|DELIVER IN PERSON|SHIP|y after the accounts. final excuses w +49056|367|24|2|48|60833.28|0.10|0.01|A|F|1994-11-26|1994-12-31|1994-12-17|COLLECT COD|MAIL|r deposits are fluffily along the furiousl +49056|1422|23|3|32|42349.44|0.09|0.07|R|F|1994-11-07|1994-12-22|1994-11-12|DELIVER IN PERSON|AIR|l platelets are carefully. ironic f +49056|1518|39|4|9|12775.59|0.08|0.06|A|F|1994-11-12|1994-11-15|1994-11-27|DELIVER IN PERSON|RAIL|along the thin +49056|189|16|5|32|34853.76|0.01|0.03|R|F|1994-10-10|1994-12-13|1994-10-28|TAKE BACK RETURN|AIR|t furiously across the ironic, +49056|862|29|6|27|47597.22|0.00|0.08|R|F|1995-01-06|1994-12-04|1995-01-31|NONE|MAIL| packages x-ray after the blith +49057|1876|6|1|36|64003.32|0.08|0.07|N|O|1997-02-01|1997-03-26|1997-02-20|DELIVER IN PERSON|REG AIR|about the fluffily ironic accou +49057|243|25|2|37|42299.88|0.01|0.07|N|O|1997-03-21|1997-02-06|1997-04-03|NONE|TRUCK|s cajole blithely above +49058|1649|73|1|6|9303.84|0.02|0.00|R|F|1993-03-08|1993-03-04|1993-03-28|NONE|MAIL|al accounts. carefully even ideas are +49059|1676|100|1|44|69417.48|0.04|0.06|R|F|1994-12-29|1994-11-25|1995-01-21|COLLECT COD|MAIL|lly even instructions boost carefully a +49059|443|2|2|43|57767.92|0.08|0.03|R|F|1994-12-08|1994-11-14|1994-12-22|NONE|REG AIR|he pending +49059|1415|33|3|20|26328.20|0.03|0.03|R|F|1994-11-18|1994-10-25|1994-12-05|NONE|FOB|ain blithely. sly +49059|381|38|4|42|53817.96|0.01|0.05|R|F|1994-12-27|1994-10-22|1995-01-06|NONE|REG AIR|sy instructions grow quickly bold p +49059|960|95|5|50|93048.00|0.04|0.08|A|F|1994-10-20|1994-11-08|1994-11-05|TAKE BACK RETURN|AIR|s around the carefully ev +49059|1972|61|6|3|5621.91|0.00|0.04|A|F|1994-12-27|1994-11-07|1995-01-02|NONE|FOB|ress requests lose blithe +49060|1381|96|1|18|23082.84|0.07|0.03|N|O|1998-09-20|1998-08-04|1998-10-05|COLLECT COD|REG AIR|packages. express, even theodolites +49060|1703|46|2|5|8023.50|0.00|0.04|N|O|1998-10-08|1998-09-04|1998-10-26|NONE|TRUCK|ut the slyly ironic deposits nag between +49061|487|75|1|31|43011.88|0.07|0.03|N|O|1996-10-03|1996-10-31|1996-10-17|DELIVER IN PERSON|AIR|usly ironic foxes. pinto beans cajo +49061|9|60|2|38|34542.00|0.10|0.02|N|O|1996-12-26|1996-10-14|1997-01-03|NONE|FOB|en frays. p +49061|1421|100|3|41|54219.22|0.05|0.08|N|O|1996-12-04|1996-10-09|1997-01-02|COLLECT COD|REG AIR|wake according +49061|1087|88|4|49|48415.92|0.01|0.02|N|O|1996-09-24|1996-11-27|1996-10-13|DELIVER IN PERSON|MAIL|. even requests are furiou +49062|1541|22|1|11|15867.94|0.00|0.06|A|F|1992-08-05|1992-06-05|1992-09-02|DELIVER IN PERSON|MAIL|inal requests x-ray blithel +49062|491|21|2|33|45919.17|0.08|0.00|A|F|1992-08-05|1992-06-30|1992-09-04|DELIVER IN PERSON|RAIL|thely unusual platele +49062|620|14|3|42|63866.04|0.01|0.02|R|F|1992-05-08|1992-05-21|1992-05-11|TAKE BACK RETURN|SHIP|ual theodolite +49062|519|80|4|19|26970.69|0.06|0.07|A|F|1992-07-17|1992-06-23|1992-07-19|DELIVER IN PERSON|FOB|cuses. pending +49062|1891|78|5|41|73508.49|0.08|0.06|R|F|1992-08-06|1992-07-09|1992-08-14|COLLECT COD|MAIL|onic requests breach slyly +49063|547|38|1|7|10132.78|0.09|0.06|N|O|1997-03-11|1997-02-26|1997-03-28|DELIVER IN PERSON|FOB|kages. bold, ruthless hocke +49063|1456|57|2|38|51583.10|0.08|0.06|N|O|1997-03-04|1997-02-26|1997-03-12|COLLECT COD|MAIL| regular accounts. furiously ironic ac +49063|1026|62|3|30|27810.60|0.01|0.08|N|O|1997-01-19|1997-03-28|1997-02-17|TAKE BACK RETURN|TRUCK|uses. even packages +49063|904|39|4|44|79415.60|0.05|0.03|N|O|1997-03-15|1997-03-28|1997-03-20|NONE|MAIL|ic asymptotes are carefully pen +49063|1375|14|5|23|29356.51|0.00|0.04|N|O|1997-03-09|1997-03-10|1997-03-16|COLLECT COD|FOB|encies. even theodolites haggle quic +49063|174|53|6|2|2148.34|0.09|0.01|N|O|1997-04-12|1997-02-11|1997-04-16|NONE|FOB|unts. slyly unusual instructions +49063|1921|10|7|37|67448.04|0.02|0.03|N|O|1997-02-12|1997-03-07|1997-03-12|NONE|AIR|final packages wake +49088|1064|70|1|29|27986.74|0.01|0.00|R|F|1994-09-28|1994-11-14|1994-10-06|TAKE BACK RETURN|TRUCK| regular frays. car +49088|650|44|2|34|52722.10|0.03|0.01|R|F|1994-10-26|1994-12-01|1994-11-14|TAKE BACK RETURN|SHIP|excuses nag slyly. busy theodolites abo +49088|772|69|3|45|75274.65|0.08|0.05|A|F|1994-10-04|1994-12-01|1994-10-07|DELIVER IN PERSON|RAIL|arefully across the fur +49088|535|36|4|8|11484.24|0.10|0.08|R|F|1995-01-23|1994-11-15|1995-01-30|COLLECT COD|REG AIR|busily fina +49088|1002|73|5|15|13545.00|0.06|0.03|A|F|1994-10-31|1994-12-04|1994-11-26|DELIVER IN PERSON|SHIP|quests. fl +49088|1966|11|6|34|63510.64|0.10|0.07|R|F|1994-11-01|1994-11-23|1994-11-30|TAKE BACK RETURN|MAIL| even packages across the furious +49088|435|23|7|18|24037.74|0.04|0.00|A|F|1994-12-07|1994-12-07|1994-12-28|NONE|MAIL|ully special grouches wake quickly fur +49089|296|97|1|24|28710.96|0.09|0.05|R|F|1993-08-18|1993-08-01|1993-08-25|NONE|RAIL|. unusual accoun +49089|1499|17|2|32|44815.68|0.03|0.06|A|F|1993-06-17|1993-08-10|1993-07-09|COLLECT COD|MAIL| to the furiously unus +49089|1572|93|3|27|39786.39|0.10|0.06|R|F|1993-09-25|1993-07-30|1993-10-09|COLLECT COD|MAIL|. foxes are al +49090|1347|24|1|12|14980.08|0.00|0.07|N|O|1997-05-05|1997-05-03|1997-05-28|NONE|MAIL|ly ironic pinto be +49090|1932|77|2|30|55017.90|0.07|0.02|N|O|1997-06-18|1997-05-05|1997-06-24|NONE|REG AIR|. slyly final sentiment +49090|1620|44|3|5|7608.10|0.07|0.03|N|O|1997-04-09|1997-06-18|1997-04-24|TAKE BACK RETURN|AIR| special sheaves. car +49090|1353|30|4|26|32613.10|0.04|0.05|N|O|1997-05-22|1997-06-18|1997-06-17|TAKE BACK RETURN|SHIP|asymptotes wake permanently express asym +49091|669|1|1|42|65925.72|0.08|0.05|N|O|1996-06-11|1996-07-12|1996-06-13|TAKE BACK RETURN|MAIL|to the quickly pending +49091|1641|83|2|31|47821.84|0.02|0.01|N|O|1996-08-23|1996-08-21|1996-08-31|TAKE BACK RETURN|TRUCK|s haggle along the +49091|70|96|3|22|21341.54|0.08|0.04|N|O|1996-06-25|1996-09-04|1996-07-25|NONE|RAIL|lose slyly among the pending dep +49091|114|15|4|29|29409.19|0.05|0.00|N|O|1996-09-14|1996-08-16|1996-10-10|TAKE BACK RETURN|MAIL|quickly bold packages! carefu +49091|1805|92|5|9|15361.20|0.04|0.08|N|O|1996-06-23|1996-08-02|1996-06-28|TAKE BACK RETURN|REG AIR|ter the sly +49092|598|59|1|49|73430.91|0.10|0.06|N|O|1998-01-14|1997-12-07|1998-02-10|DELIVER IN PERSON|TRUCK| fluffily above the slyly furio +49092|1585|86|2|1|1486.58|0.07|0.04|N|O|1998-02-21|1998-01-07|1998-03-08|TAKE BACK RETURN|FOB|ly. silent, unusual deposits +49092|695|89|3|32|51062.08|0.05|0.03|N|O|1998-02-09|1998-01-31|1998-03-09|TAKE BACK RETURN|RAIL|es. quickly even +49092|923|92|4|50|91196.00|0.04|0.00|N|O|1997-12-06|1998-01-20|1997-12-26|COLLECT COD|FOB|sly final deposits haggle carefully a +49092|654|55|5|20|31093.00|0.00|0.07|N|O|1998-01-21|1998-01-08|1998-01-28|COLLECT COD|FOB|rash furiously. instructions wake carefu +49092|900|67|6|13|23411.70|0.10|0.07|N|O|1998-01-13|1998-02-03|1998-01-15|COLLECT COD|TRUCK|e ideas cajole among t +49092|1837|81|7|9|15649.47|0.02|0.08|N|O|1998-01-18|1998-01-23|1998-02-16|DELIVER IN PERSON|AIR|eposits above the regular depend +49093|1430|31|1|41|54588.63|0.03|0.06|N|O|1998-10-24|1998-09-18|1998-10-30|DELIVER IN PERSON|TRUCK|ully unusual frets among +49094|171|72|1|10|10711.70|0.01|0.03|A|F|1992-12-27|1992-10-22|1993-01-08|TAKE BACK RETURN|AIR|manently even accounts. +49094|1768|95|2|33|55102.08|0.10|0.08|R|F|1992-09-13|1992-11-14|1992-09-14|NONE|FOB|ording to the fluffil +49094|981|16|3|4|7527.92|0.05|0.07|A|F|1992-10-25|1992-10-21|1992-11-24|TAKE BACK RETURN|MAIL| regular, ironic ideas hag +49094|799|100|4|45|76490.55|0.10|0.05|R|F|1992-09-30|1992-10-23|1992-10-30|NONE|AIR|deposits along the regular foxes nag furiou +49095|1927|60|1|25|45723.00|0.08|0.00|N|O|1997-06-04|1997-06-21|1997-06-16|COLLECT COD|AIR| express pinto beans sleep. blith +49095|182|83|2|6|6493.08|0.01|0.06|N|O|1997-08-14|1997-07-23|1997-08-26|COLLECT COD|SHIP|cross the pending accounts boost +49095|1669|93|3|33|51831.78|0.08|0.00|N|O|1997-05-17|1997-07-19|1997-06-03|COLLECT COD|MAIL|y. accounts detect blithely blit +49095|272|27|4|21|24617.67|0.02|0.01|N|O|1997-07-14|1997-07-29|1997-08-06|TAKE BACK RETURN|REG AIR|nag quickly pending foxes. ir +49095|1316|31|5|45|54778.95|0.04|0.05|N|O|1997-06-10|1997-07-04|1997-06-25|DELIVER IN PERSON|RAIL| blithely foxes. bl +49095|1974|19|6|19|35643.43|0.07|0.00|N|O|1997-05-24|1997-07-06|1997-06-01|COLLECT COD|MAIL|ld deposits wake. re +49120|765|30|1|1|1665.76|0.08|0.01|N|O|1996-10-04|1996-09-09|1996-10-26|NONE|MAIL|ggle ironic court +49121|270|98|1|16|18724.32|0.02|0.05|A|F|1993-02-23|1993-02-05|1993-03-17|NONE|REG AIR|venly unusual instructions cajole da +49121|851|18|2|24|42044.40|0.05|0.03|A|F|1993-02-11|1993-01-10|1993-03-12|NONE|REG AIR|gouts detect regular requests. furi +49122|483|71|1|37|51188.76|0.02|0.07|N|O|1996-10-02|1996-08-24|1996-10-07|NONE|REG AIR|ies haggle blithely slyly regular deposit +49122|1845|75|2|14|24455.76|0.02|0.07|N|O|1996-07-11|1996-09-19|1996-07-26|COLLECT COD|REG AIR|ages against th +49123|275|76|1|20|23505.40|0.07|0.08|A|F|1994-06-21|1994-04-10|1994-07-14|DELIVER IN PERSON|TRUCK|efully. furiously regular accounts cajol +49123|231|59|2|16|18099.68|0.02|0.08|A|F|1994-03-08|1994-05-02|1994-03-13|COLLECT COD|REG AIR|e fluffily despite the quickly expr +49123|266|21|3|26|30322.76|0.02|0.05|R|F|1994-05-08|1994-04-22|1994-05-13|COLLECT COD|MAIL|sits. final, unusual dolphins sleep fluf +49123|1099|35|4|11|11000.99|0.02|0.02|R|F|1994-03-24|1994-05-05|1994-04-08|NONE|FOB|y? slyly ironic warhorses haggle. +49123|1466|45|5|10|13674.60|0.08|0.00|A|F|1994-06-19|1994-04-22|1994-06-27|TAKE BACK RETURN|REG AIR|larly foxes. furiously +49124|1369|8|1|1|1270.36|0.02|0.03|N|O|1997-02-06|1997-01-30|1997-02-13|TAKE BACK RETURN|AIR|; carefully expr +49124|1577|18|2|16|23657.12|0.00|0.06|N|O|1997-03-09|1997-03-27|1997-03-23|TAKE BACK RETURN|MAIL|es boost slyly. car +49124|1614|15|3|36|54561.96|0.07|0.03|N|O|1997-04-11|1997-02-08|1997-05-04|NONE|TRUCK| pending pin +49124|649|12|4|45|69733.80|0.06|0.04|N|O|1997-03-17|1997-03-28|1997-03-29|DELIVER IN PERSON|RAIL|eposits might print acco +49125|798|63|1|8|13590.32|0.03|0.07|R|F|1994-07-10|1994-06-02|1994-07-24|NONE|SHIP|ptotes. asymptotes so +49125|1163|100|2|50|53208.00|0.07|0.05|A|F|1994-05-24|1994-06-11|1994-06-11|NONE|REG AIR|leep slyly +49125|1635|18|3|23|35342.49|0.07|0.03|A|F|1994-07-19|1994-06-21|1994-08-04|DELIVER IN PERSON|FOB|blithely final pinto beans. theod +49125|1777|20|4|50|83938.50|0.02|0.00|A|F|1994-04-23|1994-05-31|1994-04-29|DELIVER IN PERSON|AIR|ter the quick +49126|875|75|1|5|8879.35|0.02|0.06|N|O|1995-09-15|1995-09-05|1995-09-21|TAKE BACK RETURN|FOB|ding orbits. d +49126|769|34|2|1|1669.76|0.07|0.02|N|O|1995-08-04|1995-09-18|1995-08-11|TAKE BACK RETURN|FOB| express asym +49126|1685|68|3|49|77747.32|0.10|0.08|N|O|1995-07-12|1995-08-24|1995-08-06|NONE|RAIL|y even instructions according to the fina +49126|389|46|4|1|1289.38|0.03|0.02|N|O|1995-10-26|1995-08-29|1995-11-11|COLLECT COD|REG AIR|reful platelets ser +49126|9|60|5|48|43632.00|0.07|0.02|N|O|1995-09-10|1995-09-25|1995-09-25|COLLECT COD|TRUCK|fully slyly ironic deposits. sly +49126|1106|7|6|5|5035.50|0.07|0.08|N|O|1995-10-18|1995-09-10|1995-11-13|NONE|RAIL|ffily final somas haggle slyl +49127|835|69|1|9|15622.47|0.05|0.03|N|O|1995-07-01|1995-06-12|1995-07-15|COLLECT COD|MAIL|furiously even theodolites. blithely pendi +49127|125|26|2|43|44080.16|0.03|0.06|N|F|1995-06-16|1995-06-01|1995-07-03|DELIVER IN PERSON|TRUCK|counts. quick, pending re +49152|1458|76|1|11|14953.95|0.05|0.01|N|O|1997-10-09|1997-11-17|1997-10-25|TAKE BACK RETURN|AIR|tions except the quickly +49152|812|79|2|48|82214.88|0.10|0.01|N|O|1997-08-25|1997-11-02|1997-08-30|NONE|TRUCK|. ironic accounts +49152|489|77|3|24|33347.52|0.08|0.01|N|O|1997-10-23|1997-10-09|1997-11-07|COLLECT COD|FOB|s the furiously pending request +49152|182|9|4|14|15150.52|0.06|0.08|N|O|1997-10-06|1997-10-14|1997-10-17|NONE|AIR|nts. carefully f +49152|428|16|5|15|19926.30|0.00|0.04|N|O|1997-11-11|1997-10-12|1997-11-12|NONE|TRUCK|kages wake +49152|867|68|6|24|42428.64|0.00|0.02|N|O|1997-09-15|1997-10-16|1997-09-25|TAKE BACK RETURN|TRUCK|ooze furiously alongsi +49153|110|89|1|4|4040.44|0.00|0.08|R|F|1992-10-19|1992-10-27|1992-10-22|TAKE BACK RETURN|TRUCK| pinto beans cajole +49153|715|80|2|23|37161.33|0.06|0.04|A|F|1992-08-05|1992-10-16|1992-08-23|COLLECT COD|TRUCK|ully even asymptotes. carefully final a +49154|1379|18|1|50|64018.50|0.07|0.04|R|F|1994-06-01|1994-04-30|1994-06-22|TAKE BACK RETURN|MAIL| alongside of the special accou +49154|1389|66|2|25|32259.50|0.08|0.07|R|F|1994-05-24|1994-05-26|1994-05-29|NONE|TRUCK|into beans; ideas must haggle alongsi +49154|725|58|3|17|27637.24|0.06|0.02|A|F|1994-05-19|1994-05-16|1994-06-13|COLLECT COD|SHIP|s haggle quickly. slyl +49154|943|46|4|41|75601.54|0.03|0.01|A|F|1994-05-07|1994-04-18|1994-05-22|COLLECT COD|SHIP| the bold fo +49154|372|73|5|33|41988.21|0.06|0.07|A|F|1994-03-16|1994-05-30|1994-03-22|TAKE BACK RETURN|TRUCK|s the regular +49155|1619|43|1|39|59303.79|0.00|0.08|R|F|1993-10-15|1993-10-29|1993-10-20|TAKE BACK RETURN|SHIP|larly even, regular t +49155|1536|57|2|49|70438.97|0.04|0.08|R|F|1993-10-15|1993-10-24|1993-10-16|NONE|FOB| furiously final +49155|527|18|3|47|67093.44|0.01|0.02|R|F|1993-12-19|1993-10-28|1994-01-15|TAKE BACK RETURN|AIR|final asymptotes im +49155|855|89|4|1|1755.85|0.08|0.08|R|F|1993-10-25|1993-12-08|1993-11-10|DELIVER IN PERSON|MAIL| the carefully special hock +49155|1291|66|5|8|9538.32|0.08|0.05|A|F|1993-12-07|1993-11-26|1993-12-22|COLLECT COD|SHIP|ey players haggle: slyly ironic +49155|1677|78|6|2|3157.34|0.01|0.03|A|F|1994-01-14|1993-11-07|1994-01-21|DELIVER IN PERSON|SHIP|nt platelets alo +49156|1026|27|1|44|40788.88|0.01|0.00|A|F|1994-10-08|1994-12-06|1994-10-25|TAKE BACK RETURN|REG AIR| furiously special deposits sleep +49156|73|74|2|15|14596.05|0.04|0.03|A|F|1994-11-01|1994-11-28|1994-11-20|NONE|MAIL|l asymptotes +49156|1007|13|3|31|28148.00|0.00|0.04|R|F|1994-12-17|1994-10-27|1994-12-31|DELIVER IN PERSON|FOB|heodolites boost fluff +49157|1833|77|1|17|29492.11|0.05|0.08|N|O|1996-05-24|1996-04-15|1996-06-05|NONE|TRUCK|long the final packages +49157|1265|77|2|34|39652.84|0.09|0.00|N|O|1996-05-26|1996-03-27|1996-06-13|DELIVER IN PERSON|RAIL|onic deposits-- carefully special excuses +49158|364|21|1|16|20229.76|0.02|0.02|R|F|1992-10-17|1992-07-31|1992-11-01|NONE|MAIL|counts wake blithely. q +49159|998|1|1|39|74060.61|0.05|0.07|N|O|1997-12-24|1997-10-17|1998-01-02|DELIVER IN PERSON|FOB|en excuses. slyly bold packages sleep +49159|792|25|2|39|66018.81|0.06|0.08|N|O|1997-12-16|1997-11-30|1998-01-09|DELIVER IN PERSON|AIR|kages boost blithely ac +49159|557|58|3|1|1457.55|0.02|0.08|N|O|1997-09-23|1997-11-27|1997-10-13|TAKE BACK RETURN|FOB|xpress accounts ought to maintain. b +49159|1020|21|4|24|22104.48|0.04|0.06|N|O|1997-10-11|1997-11-07|1997-10-18|NONE|MAIL|ic, pending depth +49159|195|74|5|21|22998.99|0.02|0.02|N|O|1997-11-14|1997-11-25|1997-12-07|COLLECT COD|REG AIR| regular requests breac +49159|664|27|6|30|46939.80|0.01|0.01|N|O|1997-10-18|1997-11-20|1997-11-10|COLLECT COD|TRUCK|bove the even, unusual re +49159|1223|24|7|38|42720.36|0.02|0.03|N|O|1997-09-30|1997-10-17|1997-10-11|TAKE BACK RETURN|AIR| stealthy deposits. slyly silent in +49184|343|28|1|46|57193.64|0.02|0.03|R|F|1995-04-03|1995-05-30|1995-04-15|COLLECT COD|MAIL| regular requests. carefully +49184|1270|45|2|17|19911.59|0.09|0.05|R|F|1995-03-23|1995-04-24|1995-04-13|TAKE BACK RETURN|TRUCK|ven platelets along +49184|1045|16|3|46|43517.84|0.10|0.04|A|F|1995-04-08|1995-05-01|1995-04-21|NONE|AIR|regular warthogs. excuses +49185|852|53|1|27|47326.95|0.00|0.05|N|O|1996-03-08|1996-02-28|1996-03-17|TAKE BACK RETURN|RAIL|thrash carefully; regular +49185|768|1|2|29|48394.04|0.09|0.02|N|O|1996-02-22|1996-02-21|1996-02-29|TAKE BACK RETURN|FOB|ndencies wake thinly sly +49185|1457|75|3|12|16301.40|0.05|0.07|N|O|1996-02-26|1996-02-22|1996-03-02|COLLECT COD|REG AIR|luffily ironic theodolites are along the q +49185|1543|84|4|3|4333.62|0.04|0.01|N|O|1996-03-14|1996-04-17|1996-04-02|TAKE BACK RETURN|AIR|lithely special +49185|1057|63|5|6|5748.30|0.09|0.04|N|O|1996-01-26|1996-03-16|1996-02-12|TAKE BACK RETURN|AIR|sly across the +49185|1306|45|6|50|60365.00|0.01|0.07|N|O|1996-03-17|1996-03-03|1996-04-15|TAKE BACK RETURN|TRUCK|gular requests. regular frets cajole quic +49186|693|87|1|16|25499.04|0.01|0.02|N|O|1997-10-22|1997-09-04|1997-11-17|DELIVER IN PERSON|FOB|ests serve carefully according +49186|1636|19|2|6|9225.78|0.06|0.07|N|O|1997-11-13|1997-09-14|1997-12-05|COLLECT COD|MAIL|le carefully acc +49186|770|71|3|28|46781.56|0.03|0.07|N|O|1997-09-18|1997-08-30|1997-09-28|NONE|FOB|are furious +49186|131|32|4|24|24747.12|0.04|0.01|N|O|1997-10-12|1997-08-29|1997-11-01|DELIVER IN PERSON|MAIL|ithely. bl +49187|1726|53|1|23|37437.56|0.05|0.04|N|O|1997-11-04|1997-10-07|1997-11-11|TAKE BACK RETURN|RAIL|ular, ironic ideas. pe +49187|1584|25|2|10|14855.80|0.09|0.07|N|O|1997-08-12|1997-10-02|1997-09-06|NONE|AIR|bold account +49187|771|68|3|36|60183.72|0.02|0.08|N|O|1997-08-02|1997-08-23|1997-08-25|COLLECT COD|MAIL|ckly about t +49187|1996|97|4|4|7591.96|0.05|0.03|N|O|1997-08-27|1997-09-26|1997-09-16|DELIVER IN PERSON|TRUCK|posits wake bli +49187|569|30|5|42|61721.52|0.04|0.03|N|O|1997-09-08|1997-09-22|1997-09-19|COLLECT COD|TRUCK|uriously dar +49187|1515|36|6|24|33996.24|0.10|0.06|N|O|1997-11-13|1997-10-07|1997-11-17|DELIVER IN PERSON|RAIL|final, bold foxes sleep slyly accordin +49187|672|4|7|15|23590.05|0.07|0.07|N|O|1997-11-13|1997-10-11|1997-11-21|NONE|SHIP|usual pinto +49188|1926|27|1|20|36558.40|0.01|0.05|N|O|1995-07-21|1995-08-11|1995-08-10|NONE|REG AIR|onic accounts solve. final theo +49188|1209|84|2|8|8881.60|0.01|0.05|N|O|1995-08-12|1995-08-09|1995-09-11|NONE|AIR|ts. carefully ironic platelets wake after t +49188|1259|71|3|37|42929.25|0.05|0.00|N|O|1995-07-13|1995-07-24|1995-07-23|COLLECT COD|MAIL|e blithely. finally express foxes e +49188|1900|1|4|44|79283.60|0.06|0.02|N|O|1995-10-17|1995-08-29|1995-10-31|DELIVER IN PERSON|REG AIR|ggle. carefully ir +49188|1868|55|5|33|58405.38|0.05|0.07|N|O|1995-07-30|1995-09-09|1995-07-31|DELIVER IN PERSON|TRUCK|across the express, bold dependencies. flu +49189|747|44|1|7|11534.18|0.02|0.05|A|F|1995-02-03|1995-03-16|1995-02-21|TAKE BACK RETURN|FOB|es. carefull +49189|1918|7|2|43|78256.13|0.09|0.06|R|F|1995-05-16|1995-02-23|1995-05-28|NONE|RAIL|. furious packages +49189|1356|95|3|17|21374.95|0.04|0.06|R|F|1995-01-26|1995-03-12|1995-02-20|NONE|TRUCK|le along t +49189|208|63|4|15|16623.00|0.09|0.05|A|F|1995-01-17|1995-03-23|1995-02-07|COLLECT COD|REG AIR|eans along +49190|1249|87|1|13|14953.12|0.03|0.00|R|F|1993-04-05|1993-03-10|1993-04-09|DELIVER IN PERSON|REG AIR| furiously sile +49190|1485|3|2|29|40207.92|0.01|0.08|A|F|1993-02-12|1993-01-12|1993-03-08|DELIVER IN PERSON|FOB|sts wake furiously fluf +49190|550|81|3|29|42065.95|0.03|0.04|R|F|1993-02-03|1993-01-31|1993-03-05|NONE|MAIL|ly furiously pe +49190|1314|91|4|49|59550.19|0.03|0.04|A|F|1993-01-04|1993-02-10|1993-01-10|NONE|AIR|s. carefully final foxes haggle about the +49191|277|32|1|47|55331.69|0.07|0.04|N|O|1997-04-09|1997-03-22|1997-04-11|DELIVER IN PERSON|SHIP|oubt furiously toward the carefu +49191|1327|28|2|39|47904.48|0.10|0.03|N|O|1997-01-13|1997-01-28|1997-02-09|COLLECT COD|TRUCK|te furiously enticing asymp +49191|1977|78|3|33|62006.01|0.07|0.01|N|O|1997-01-27|1997-03-10|1997-02-06|DELIVER IN PERSON|RAIL|posits. furiously special notornis sle +49191|1078|14|4|29|28393.03|0.08|0.00|N|O|1997-01-22|1997-02-22|1997-01-29|DELIVER IN PERSON|REG AIR| packages sleep sometimes eve +49191|1898|85|5|15|26998.35|0.10|0.08|N|O|1997-02-22|1997-02-09|1997-03-02|TAKE BACK RETURN|REG AIR|ites boost. furiously pen +49216|1128|1|1|41|42193.92|0.00|0.07|A|F|1994-06-25|1994-05-17|1994-07-25|TAKE BACK RETURN|TRUCK|egular pinto beans. carefully pending pac +49216|294|49|2|3|3582.87|0.04|0.08|A|F|1994-03-22|1994-06-09|1994-04-01|TAKE BACK RETURN|AIR|iously. even, regular depos +49216|763|28|3|8|13310.08|0.08|0.04|R|F|1994-04-15|1994-05-01|1994-05-03|DELIVER IN PERSON|AIR|ter the fluffily pending foxes. carefull +49216|1590|71|4|4|5966.36|0.07|0.06|A|F|1994-06-17|1994-05-25|1994-06-22|TAKE BACK RETURN|MAIL| accounts +49216|1590|11|5|3|4474.77|0.03|0.01|A|F|1994-04-12|1994-05-15|1994-04-22|NONE|RAIL|le blithely silent, unusual +49216|905|8|6|11|19864.90|0.00|0.03|A|F|1994-06-11|1994-04-30|1994-06-28|TAKE BACK RETURN|MAIL|ly regular accounts. +49216|1631|32|7|42|64370.46|0.10|0.04|R|F|1994-05-03|1994-06-06|1994-05-21|TAKE BACK RETURN|REG AIR|ironic packages about the closely +49217|175|76|1|23|24728.91|0.10|0.05|A|F|1993-09-18|1993-08-20|1993-10-16|TAKE BACK RETURN|FOB|. ruthlessly regular requests +49217|100|26|2|36|36003.60|0.07|0.01|R|F|1993-07-08|1993-10-02|1993-07-11|TAKE BACK RETURN|TRUCK| carefully unusual requests. slyl +49217|1139|76|3|20|20802.60|0.08|0.02|A|F|1993-09-08|1993-09-22|1993-09-11|TAKE BACK RETURN|TRUCK|regular deposits detect after the +49217|1799|100|4|11|18708.69|0.06|0.02|R|F|1993-09-07|1993-08-05|1993-10-01|DELIVER IN PERSON|MAIL|ctions int +49217|794|27|5|28|47454.12|0.04|0.01|R|F|1993-10-03|1993-08-17|1993-10-11|COLLECT COD|REG AIR|uickly regular p +49217|1083|84|6|1|984.08|0.10|0.06|A|F|1993-09-07|1993-08-09|1993-09-22|DELIVER IN PERSON|MAIL|es. slyly fina +49218|428|29|1|39|51808.38|0.05|0.00|A|F|1993-09-25|1993-08-28|1993-10-20|TAKE BACK RETURN|REG AIR|er the carefully silent deposits sleep b +49218|597|98|2|31|46425.29|0.01|0.02|A|F|1993-09-11|1993-07-26|1993-10-03|DELIVER IN PERSON|RAIL|longside of t +49219|1077|48|1|24|23473.68|0.02|0.07|N|O|1996-12-03|1996-10-04|1996-12-27|TAKE BACK RETURN|REG AIR|ding accounts. +49219|1520|21|2|48|68232.96|0.02|0.02|N|O|1996-09-19|1996-10-07|1996-10-19|NONE|RAIL|le beside the even requests. even deposit +49219|1085|86|3|25|24652.00|0.03|0.07|N|O|1996-09-01|1996-11-15|1996-09-04|COLLECT COD|SHIP|d dolphins detect fluffily even foxes! +49219|1045|46|4|37|35003.48|0.06|0.08|N|O|1996-10-02|1996-11-23|1996-10-23|COLLECT COD|RAIL| the carefully close packages. qui +49219|549|40|5|16|23192.64|0.02|0.08|N|O|1996-09-27|1996-11-07|1996-10-26|DELIVER IN PERSON|FOB|nts. final, b +49220|1267|68|1|22|25701.72|0.08|0.06|N|O|1995-10-03|1995-09-13|1995-10-25|NONE|FOB|atop the Tiresias. depo +49220|1715|58|2|25|40417.75|0.09|0.04|N|O|1995-11-06|1995-09-24|1995-11-16|COLLECT COD|FOB|ronic foxes about +49220|1968|57|3|4|7479.84|0.04|0.08|N|O|1995-08-17|1995-09-23|1995-09-11|COLLECT COD|FOB|ctions among the fluffily +49220|226|27|4|21|23650.62|0.04|0.05|N|O|1995-11-16|1995-11-10|1995-12-15|TAKE BACK RETURN|RAIL|ep about the final accounts. final, spe +49220|1140|13|5|1|1041.14|0.09|0.01|N|O|1995-08-15|1995-09-28|1995-09-03|TAKE BACK RETURN|FOB|dolphins. carefully unusual reques +49220|1011|17|6|20|18240.20|0.10|0.02|N|O|1995-08-16|1995-10-23|1995-09-14|DELIVER IN PERSON|AIR|ts cajole across the requests. furiou +49220|1069|5|7|7|6790.42|0.07|0.06|N|O|1995-09-03|1995-10-09|1995-09-12|NONE|FOB|hely ironic packages c +49221|891|58|1|31|55548.59|0.05|0.07|R|F|1993-08-05|1993-08-26|1993-08-17|NONE|MAIL|lphins cajole. furiously special instruc +49221|1676|59|2|25|39441.75|0.01|0.05|A|F|1993-09-09|1993-09-12|1993-10-06|DELIVER IN PERSON|FOB|sual deposits cajole along the +49221|1442|43|3|37|49707.28|0.02|0.03|A|F|1993-07-23|1993-08-26|1993-08-01|COLLECT COD|FOB|odolites. busy, ironic accounts integ +49221|277|32|4|20|23545.40|0.08|0.08|A|F|1993-07-25|1993-08-08|1993-07-28|DELIVER IN PERSON|FOB|cies. express, express packages according +49222|1839|26|1|45|78337.35|0.10|0.00|N|O|1998-06-15|1998-06-23|1998-06-29|TAKE BACK RETURN|RAIL|ilent asymptotes nag among the +49223|1364|3|1|15|18980.40|0.07|0.01|N|O|1995-11-14|1995-11-19|1995-12-05|NONE|FOB|deposits cajole s +49223|307|36|2|45|54328.50|0.09|0.07|N|O|1995-11-19|1995-12-23|1995-11-24|COLLECT COD|RAIL|ever excuses. express excuses are qui +49248|1891|21|1|4|7171.56|0.04|0.00|R|F|1992-07-26|1992-10-05|1992-07-31|NONE|AIR|regular tithes wake. bold, regular packag +49249|1391|30|1|13|16801.07|0.00|0.00|N|O|1998-03-01|1998-01-04|1998-03-18|NONE|FOB|he theodolites. unusual +49249|443|31|2|3|4030.32|0.07|0.01|N|O|1998-03-09|1998-02-06|1998-03-16|NONE|AIR|e express pinto beans. +49249|1785|86|3|25|42169.50|0.08|0.06|N|O|1998-02-16|1998-02-07|1998-03-11|NONE|FOB|uriously regular, even theodolit +49249|385|86|4|43|55271.34|0.04|0.02|N|O|1998-02-16|1998-02-01|1998-03-15|DELIVER IN PERSON|TRUCK|n theodolit +49249|1586|7|5|46|68428.68|0.08|0.01|N|O|1998-03-08|1997-12-27|1998-04-07|TAKE BACK RETURN|AIR|usly pending requests. careful +49249|883|84|6|18|32109.84|0.04|0.08|N|O|1997-12-30|1997-12-22|1998-01-07|NONE|TRUCK|dencies gr +49250|1285|97|1|8|9490.24|0.05|0.08|N|O|1996-04-25|1996-06-03|1996-05-04|DELIVER IN PERSON|RAIL|silent asymptot +49250|533|64|2|12|17202.36|0.05|0.00|N|O|1996-05-27|1996-06-21|1996-06-08|TAKE BACK RETURN|MAIL|lar platelets. regular accoun +49250|999|100|3|17|32299.83|0.06|0.05|N|O|1996-05-11|1996-06-17|1996-05-23|COLLECT COD|SHIP|ing to the deposits. bl +49251|1926|27|1|25|45698.00|0.08|0.03|A|F|1994-02-22|1993-12-31|1994-02-27|COLLECT COD|SHIP|arefully careful d +49251|682|14|2|17|26905.56|0.07|0.02|R|F|1994-01-27|1994-01-24|1994-01-28|TAKE BACK RETURN|TRUCK|s. ironic multipliers are along t +49251|715|16|3|37|59781.27|0.03|0.06|A|F|1994-01-26|1994-01-18|1994-02-19|NONE|SHIP|ously regular requests are across +49251|1313|90|4|38|46143.78|0.09|0.03|A|F|1994-01-31|1994-01-14|1994-02-22|DELIVER IN PERSON|REG AIR|lyly regular notornis. packages haggle bli +49251|317|74|5|22|26780.82|0.07|0.01|R|F|1994-03-16|1993-12-30|1994-03-28|TAKE BACK RETURN|AIR|heodolites sleep. furiously even deposit +49251|587|18|6|23|34214.34|0.05|0.00|R|F|1994-01-26|1994-02-12|1994-02-05|COLLECT COD|AIR|ts sleep. furiously fina +49252|1581|82|1|23|34099.34|0.09|0.04|A|F|1995-04-04|1995-01-19|1995-04-14|TAKE BACK RETURN|REG AIR|uickly ironic +49252|353|54|2|31|38853.85|0.07|0.05|A|F|1994-12-18|1995-02-17|1995-01-14|COLLECT COD|SHIP|sleep blithely. quickly regular accounts +49252|852|53|3|27|47326.95|0.02|0.00|R|F|1995-02-17|1995-02-04|1995-03-09|NONE|MAIL|hely even requests; furiously fi +49253|927|28|1|45|82256.40|0.08|0.05|R|F|1994-06-11|1994-07-09|1994-06-14|COLLECT COD|SHIP|ccording to the quickly quic +49253|1572|73|2|39|57469.23|0.01|0.01|A|F|1994-05-18|1994-07-21|1994-05-25|COLLECT COD|TRUCK|ccounts. slyly regular pinto bea +49253|1965|54|3|28|52274.88|0.02|0.06|R|F|1994-06-21|1994-06-06|1994-07-04|DELIVER IN PERSON|REG AIR|across the bold, even foxes. slyly unusual +49253|509|100|4|23|32418.50|0.00|0.03|A|F|1994-07-13|1994-07-28|1994-08-05|TAKE BACK RETURN|TRUCK|n packages snooze afte +49254|1936|25|1|21|38596.53|0.06|0.03|N|O|1998-03-11|1998-02-28|1998-03-27|COLLECT COD|AIR|tructions. furious +49254|636|37|2|20|30732.60|0.06|0.05|N|O|1998-01-23|1998-03-02|1998-01-30|COLLECT COD|FOB|e furiously car +49255|441|42|1|46|61706.24|0.10|0.05|R|F|1992-07-15|1992-07-26|1992-07-28|NONE|SHIP|pending accounts; +49255|1355|70|2|50|62817.50|0.01|0.01|R|F|1992-08-09|1992-09-14|1992-08-14|COLLECT COD|TRUCK|ly. carefully even ideas +49255|1560|61|3|44|64308.64|0.10|0.00|A|F|1992-08-03|1992-08-19|1992-08-27|NONE|RAIL| among the regular de +49255|1406|7|4|35|45759.00|0.01|0.02|A|F|1992-10-09|1992-08-14|1992-10-15|DELIVER IN PERSON|MAIL|old, special excuses dou +49280|1787|14|1|21|35464.38|0.05|0.08|N|F|1995-06-10|1995-06-05|1995-07-01|COLLECT COD|SHIP|gular instructi +49280|1466|84|2|6|8204.76|0.10|0.01|R|F|1995-05-24|1995-07-22|1995-06-04|COLLECT COD|REG AIR|wake slyly regular pi +49280|745|78|3|43|70766.82|0.00|0.04|N|O|1995-08-13|1995-06-14|1995-08-14|NONE|MAIL|ts. even forges a +49280|509|40|4|44|62018.00|0.01|0.07|N|F|1995-06-16|1995-06-19|1995-06-18|DELIVER IN PERSON|REG AIR|e carefully atop the carefully brave acc +49280|1889|33|5|5|8954.40|0.07|0.05|N|O|1995-07-31|1995-07-27|1995-08-11|COLLECT COD|FOB|. busily final theodolites above +49280|1004|5|6|12|10860.00|0.03|0.07|N|O|1995-07-14|1995-06-18|1995-07-26|COLLECT COD|TRUCK|urts. deposits thrash furiously-- ironi +49281|1532|33|1|33|47306.49|0.05|0.05|R|F|1995-03-02|1995-04-13|1995-03-07|DELIVER IN PERSON|SHIP| blithely even foxes. +49281|1938|39|2|31|57037.83|0.03|0.04|R|F|1995-04-30|1995-04-27|1995-05-07|NONE|SHIP|e ironic dug +49282|1685|68|1|35|55533.80|0.06|0.05|N|O|1995-09-28|1995-08-15|1995-10-07|TAKE BACK RETURN|SHIP|sleep around the +49282|118|19|2|22|22398.42|0.09|0.06|N|O|1995-08-24|1995-08-25|1995-09-15|COLLECT COD|AIR| among the furiously even accounts. sly +49283|501|62|1|31|43446.50|0.00|0.05|R|F|1995-02-23|1995-01-19|1995-03-25|TAKE BACK RETURN|RAIL|usual, even d +49283|1291|92|2|13|15499.77|0.03|0.06|R|F|1994-12-25|1995-03-09|1995-01-10|NONE|SHIP|es. bold r +49283|1994|83|3|29|54983.71|0.01|0.07|A|F|1995-01-23|1995-01-28|1995-01-24|TAKE BACK RETURN|REG AIR|s the requests? slyly silent deposi +49283|1017|18|4|23|21114.23|0.10|0.01|R|F|1995-01-29|1995-01-25|1995-02-24|NONE|REG AIR|ages boost? regular theodolites integrate +49284|821|21|1|21|36158.22|0.06|0.04|R|F|1994-04-13|1994-02-16|1994-04-25|COLLECT COD|SHIP|ns boost. s +49284|140|67|2|44|45766.16|0.03|0.04|R|F|1994-04-03|1994-02-06|1994-04-07|COLLECT COD|TRUCK|le carefully even foxes. regular reque +49284|1383|84|3|35|44953.30|0.01|0.08|R|F|1994-02-23|1994-03-23|1994-03-09|DELIVER IN PERSON|RAIL|e. blithely final pinto beans thrash ag +49284|882|83|4|9|16045.92|0.09|0.03|A|F|1994-03-17|1994-03-05|1994-04-12|COLLECT COD|SHIP|hely furiously special platelets. +49284|923|92|5|27|49245.84|0.09|0.00|R|F|1994-02-18|1994-02-15|1994-03-07|NONE|MAIL|instructions. fluffily re +49284|1983|84|6|37|69744.26|0.05|0.02|R|F|1994-01-18|1994-02-17|1994-01-30|NONE|REG AIR|regular ideas afte +49285|904|7|1|22|39707.80|0.09|0.05|N|O|1997-08-08|1997-07-14|1997-08-11|DELIVER IN PERSON|RAIL|. carefully special cou +49285|128|29|2|30|30843.60|0.10|0.04|N|O|1997-06-20|1997-07-03|1997-07-06|NONE|SHIP|g unusual, even request +49285|1269|70|3|33|38618.58|0.08|0.02|N|O|1997-05-31|1997-07-05|1997-06-25|DELIVER IN PERSON|TRUCK|the stealthy deposits haggl +49285|1862|49|4|23|40568.78|0.10|0.01|N|O|1997-09-10|1997-06-24|1997-09-27|NONE|REG AIR| final pinto b +49285|1357|72|5|15|18875.25|0.01|0.08|N|O|1997-06-28|1997-06-24|1997-07-05|NONE|TRUCK|gular packages. quickl +49286|1781|8|1|31|52166.18|0.03|0.02|N|O|1997-07-18|1997-06-14|1997-08-10|DELIVER IN PERSON|AIR|realms. carefully final dependencie +49286|487|46|2|49|67986.52|0.10|0.03|N|O|1997-07-22|1997-06-17|1997-08-03|DELIVER IN PERSON|RAIL|y regular theodolites. b +49286|956|57|3|27|50137.65|0.04|0.02|N|O|1997-05-07|1997-06-12|1997-05-24|NONE|FOB|al deposits +49286|1288|89|4|43|51139.04|0.06|0.05|N|O|1997-06-20|1997-05-17|1997-06-23|TAKE BACK RETURN|FOB|nag slyly ironi +49286|1253|28|5|38|43861.50|0.06|0.08|N|O|1997-06-11|1997-05-01|1997-06-17|NONE|FOB|g the carefully fi +49287|135|14|1|48|49686.24|0.02|0.05|A|F|1994-07-15|1994-08-03|1994-07-25|COLLECT COD|MAIL|e carefully ironic packages. blithely regul +49287|237|38|2|36|40940.28|0.06|0.07|A|F|1994-08-14|1994-08-06|1994-08-16|NONE|MAIL| express deposits cajole slyl +49287|1383|60|3|37|47522.06|0.04|0.08|A|F|1994-07-22|1994-07-05|1994-08-19|DELIVER IN PERSON|RAIL|structions are a +49287|101|2|4|33|33036.30|0.00|0.01|R|F|1994-07-18|1994-08-06|1994-08-01|TAKE BACK RETURN|TRUCK|usly even ideas according to th +49287|1512|33|5|20|28270.20|0.04|0.00|A|F|1994-08-25|1994-08-14|1994-09-15|TAKE BACK RETURN|TRUCK|ithely even idea +49287|580|41|6|22|32572.76|0.02|0.00|A|F|1994-06-15|1994-07-19|1994-07-13|COLLECT COD|RAIL|lar platelets sleep final pack +49312|1794|37|1|5|8478.95|0.02|0.01|R|F|1995-03-09|1995-04-30|1995-03-21|DELIVER IN PERSON|SHIP|usly bold dolphins cajole carefully about +49312|1649|32|2|8|12405.12|0.02|0.01|A|F|1995-05-03|1995-03-24|1995-05-13|NONE|SHIP|thrash slyly even grouches. unus +49312|1032|33|3|40|37321.20|0.07|0.07|A|F|1995-05-08|1995-03-31|1995-05-25|TAKE BACK RETURN|SHIP|old deposits will cajo +49312|1188|89|4|16|17426.88|0.00|0.06|R|F|1995-04-07|1995-03-26|1995-05-05|COLLECT COD|AIR|s wake quickly. slyly +49312|1923|24|5|50|91246.00|0.01|0.07|A|F|1995-03-03|1995-04-09|1995-03-10|DELIVER IN PERSON|TRUCK|deposits. r +49312|789|54|6|33|55762.74|0.09|0.04|A|F|1995-03-24|1995-05-15|1995-04-08|COLLECT COD|MAIL|iously unusual packages +49312|311|12|7|47|56931.57|0.08|0.03|R|F|1995-05-19|1995-05-13|1995-06-13|NONE|FOB|cross the slyly +49313|1114|87|1|36|36543.96|0.10|0.02|R|F|1995-01-17|1994-12-07|1995-01-21|NONE|AIR|the final deposits. +49313|1311|50|2|48|58190.88|0.03|0.04|R|F|1994-11-29|1994-12-07|1994-12-28|DELIVER IN PERSON|REG AIR|t carefully r +49314|1724|51|1|29|47145.88|0.01|0.00|N|O|1996-03-16|1996-02-20|1996-04-06|NONE|FOB|usly express requests +49314|1718|45|2|43|69647.53|0.00|0.04|N|O|1996-05-02|1996-03-29|1996-05-29|COLLECT COD|REG AIR|e even, ironic forges. slyly +49314|1833|34|3|42|72862.86|0.03|0.02|N|O|1996-05-08|1996-04-09|1996-05-12|DELIVER IN PERSON|REG AIR|al request +49314|1192|65|4|23|25143.37|0.02|0.08|N|O|1996-04-23|1996-03-12|1996-04-27|COLLECT COD|REG AIR|lyly regular deposits. furiousl +49314|1692|16|5|19|30280.11|0.00|0.01|N|O|1996-03-11|1996-02-20|1996-03-16|TAKE BACK RETURN|MAIL| regular packages sleep slyly unusual plat +49315|1275|13|1|40|47050.80|0.06|0.06|N|O|1998-07-26|1998-07-15|1998-08-11|NONE|SHIP|e alongside of the furiously even +49315|284|85|2|47|55661.16|0.05|0.01|N|O|1998-05-09|1998-06-17|1998-05-10|NONE|AIR|ges. even sentiments grow +49315|758|23|3|49|81278.75|0.03|0.05|N|O|1998-05-10|1998-06-02|1998-05-13|NONE|TRUCK|ly carefully regular foxes. blithely ev +49316|1317|18|1|28|34112.68|0.04|0.06|N|O|1996-04-06|1996-04-22|1996-04-10|TAKE BACK RETURN|RAIL|ly furiously regular +49317|1606|7|1|49|73872.40|0.04|0.03|N|O|1998-07-06|1998-07-15|1998-07-29|DELIVER IN PERSON|REG AIR|aringly even escapades affix slyly. ironi +49317|989|92|2|37|69929.26|0.09|0.01|N|O|1998-06-27|1998-06-20|1998-07-05|NONE|MAIL|e express foxes. quickly special requests +49317|1831|75|3|44|76244.52|0.05|0.06|N|O|1998-05-26|1998-07-21|1998-06-04|TAKE BACK RETURN|FOB|fully even theodolites in +49317|222|4|4|28|31422.16|0.09|0.08|N|O|1998-05-19|1998-07-10|1998-05-30|NONE|FOB|le slyly according to the furiously regu +49317|1904|37|5|7|12641.30|0.05|0.04|N|O|1998-08-07|1998-06-27|1998-08-30|TAKE BACK RETURN|FOB|s, stealthy platelets. furiously r +49317|1065|36|6|11|10626.66|0.06|0.06|N|O|1998-05-11|1998-06-27|1998-05-17|NONE|TRUCK|nto beans are. furiously pending pack +49317|713|14|7|29|46797.59|0.06|0.07|N|O|1998-07-18|1998-06-29|1998-07-20|NONE|SHIP|osits. regular deposits will boost about +49318|1962|51|1|12|22367.52|0.01|0.03|N|O|1998-01-29|1997-12-18|1998-02-20|NONE|MAIL| the furiously express waters. i +49318|36|62|2|50|46801.50|0.07|0.06|N|O|1997-11-22|1997-12-02|1997-11-23|COLLECT COD|FOB|uriously even dolphins could +49319|1357|34|1|27|33975.45|0.04|0.07|N|O|1995-10-20|1995-10-09|1995-10-21|COLLECT COD|MAIL|sts. slyly regul +49319|311|96|2|31|37550.61|0.02|0.02|N|O|1995-09-08|1995-10-26|1995-09-28|DELIVER IN PERSON|FOB|ly final theodolites. furiously daring +49319|1059|60|3|1|960.05|0.09|0.03|N|O|1995-11-29|1995-10-28|1995-12-01|COLLECT COD|SHIP|lithely regular packages are +49319|1919|20|4|17|30955.47|0.06|0.06|N|O|1995-10-15|1995-11-18|1995-11-14|DELIVER IN PERSON|REG AIR|nal packages. accounts against the +49319|202|3|5|38|41883.60|0.02|0.04|N|O|1995-10-22|1995-11-22|1995-10-31|COLLECT COD|FOB|fully silent accounts. specia +49319|1998|87|6|21|39899.79|0.09|0.08|N|O|1995-09-14|1995-11-05|1995-09-29|DELIVER IN PERSON|SHIP|osits cajole. blithely +49344|181|60|1|4|4324.72|0.00|0.03|A|F|1993-04-01|1993-02-04|1993-05-01|DELIVER IN PERSON|TRUCK|eans cajole stealthily after the sl +49344|484|43|2|39|53994.72|0.04|0.00|A|F|1993-01-27|1993-03-16|1993-02-11|TAKE BACK RETURN|REG AIR| theodolites sleep quickly about the depend +49344|500|59|3|32|44816.00|0.08|0.04|R|F|1993-03-13|1993-03-24|1993-03-27|NONE|REG AIR|es. quickly final ideas cajole +49344|1431|49|4|36|47967.48|0.00|0.04|R|F|1993-03-28|1993-03-01|1993-04-03|TAKE BACK RETURN|AIR|slyly even requests en +49344|1252|64|5|6|6919.50|0.01|0.00|A|F|1993-01-13|1993-03-10|1993-01-23|TAKE BACK RETURN|TRUCK|e pinto beans was furiously amo +49345|699|62|1|7|11197.83|0.06|0.03|R|F|1992-04-29|1992-06-09|1992-05-18|DELIVER IN PERSON|RAIL|ep doggedly dolphins. slyly even +49345|1691|33|2|50|79634.50|0.01|0.07|A|F|1992-06-13|1992-06-03|1992-06-15|COLLECT COD|MAIL|sual foxes unwind around the busy idea +49346|1870|14|1|11|19490.57|0.06|0.01|N|O|1995-06-18|1995-07-19|1995-06-26|COLLECT COD|MAIL|ltipliers. slyly pending f +49346|1321|36|2|39|47670.48|0.05|0.01|A|F|1995-06-04|1995-06-18|1995-06-11|NONE|RAIL| hockey players. +49346|1978|67|3|28|52639.16|0.05|0.07|A|F|1995-05-22|1995-07-29|1995-06-09|DELIVER IN PERSON|AIR|l deposits haggle. quic +49346|1101|2|4|16|16033.60|0.08|0.01|N|O|1995-07-10|1995-07-02|1995-08-06|TAKE BACK RETURN|TRUCK|long the regular pinto bean +49346|1187|24|5|8|8705.44|0.02|0.01|A|F|1995-06-04|1995-07-26|1995-06-05|NONE|RAIL|lites. carefully unusual deposits +49347|1342|43|1|44|54706.96|0.04|0.07|R|F|1995-01-21|1995-03-28|1995-01-28|TAKE BACK RETURN|MAIL|r dependencies. boldly e +49347|69|20|2|40|38762.40|0.05|0.04|A|F|1995-02-11|1995-04-06|1995-02-20|COLLECT COD|TRUCK|l pinto beans +49348|257|85|1|11|12729.75|0.10|0.06|N|O|1997-05-02|1997-04-19|1997-05-25|DELIVER IN PERSON|REG AIR|lyly even accounts. final re +49348|1476|94|2|30|41324.10|0.08|0.02|N|O|1997-06-27|1997-05-21|1997-06-30|TAKE BACK RETURN|REG AIR|lent pinto bea +49348|812|12|3|21|35969.01|0.03|0.06|N|O|1997-07-05|1997-05-26|1997-07-25|DELIVER IN PERSON|AIR|quickly careful foxes be +49348|832|66|4|5|8664.15|0.04|0.04|N|O|1997-06-17|1997-05-22|1997-07-12|NONE|RAIL|oost furiously! regular, bold ideas +49348|1119|56|5|47|47945.17|0.07|0.06|N|O|1997-06-02|1997-05-24|1997-06-21|DELIVER IN PERSON|TRUCK|y the even, regular accou +49348|1992|37|6|48|90911.52|0.03|0.08|N|O|1997-06-13|1997-04-18|1997-06-24|TAKE BACK RETURN|TRUCK|uests are fluffil +49348|1089|25|7|34|33662.72|0.00|0.06|N|O|1997-03-29|1997-05-28|1997-04-25|TAKE BACK RETURN|RAIL|tes. slyly even requests detect c +49349|1650|74|1|35|54307.75|0.00|0.05|N|O|1995-07-25|1995-07-28|1995-07-30|NONE|RAIL|o the carefully pending accounts +49349|1846|76|2|26|45443.84|0.10|0.03|N|O|1995-07-02|1995-07-22|1995-08-01|TAKE BACK RETURN|RAIL|ajole among the busy requests. furious +49349|1358|73|3|46|57930.10|0.09|0.03|N|O|1995-07-24|1995-07-28|1995-07-31|COLLECT COD|FOB|yly express ex +49350|116|69|1|23|23370.53|0.06|0.05|R|F|1992-10-19|1992-10-12|1992-10-22|NONE|SHIP|. regular, final packages u +49350|749|14|2|46|75888.04|0.03|0.02|R|F|1992-12-15|1992-11-16|1992-12-19|TAKE BACK RETURN|MAIL|ions haggle carefully. ir +49350|1405|23|3|5|6532.00|0.08|0.03|R|F|1992-10-26|1992-10-16|1992-11-03|COLLECT COD|FOB| the slyly final pains nag f +49351|517|8|1|13|18427.63|0.08|0.02|A|F|1992-04-24|1992-05-10|1992-05-02|DELIVER IN PERSON|REG AIR|long the even pinto b +49351|379|80|2|11|14073.07|0.09|0.02|A|F|1992-04-24|1992-05-27|1992-05-11|COLLECT COD|RAIL|c pinto beans after the blit +49351|372|29|3|42|53439.54|0.00|0.04|A|F|1992-07-09|1992-06-27|1992-08-06|NONE|REG AIR|ckly furiously silent theodol +49351|1922|67|4|41|74780.72|0.03|0.01|A|F|1992-04-24|1992-05-31|1992-05-16|COLLECT COD|MAIL|st slyly according to the idly even platel +49376|1359|36|1|37|46632.95|0.01|0.00|N|O|1997-08-19|1997-09-01|1997-09-18|NONE|SHIP| the carefully ironic packages. qui +49376|448|36|2|32|43150.08|0.08|0.03|N|O|1997-09-09|1997-09-07|1997-09-30|DELIVER IN PERSON|AIR|leep quickly along the +49376|12|38|3|23|20976.23|0.08|0.08|N|O|1997-08-19|1997-07-29|1997-08-20|COLLECT COD|REG AIR|s may sleep quickl +49376|109|62|4|8|8072.80|0.06|0.07|N|O|1997-08-04|1997-07-24|1997-08-18|DELIVER IN PERSON|TRUCK|accounts wake fluffily after +49376|720|17|5|48|77794.56|0.07|0.00|N|O|1997-09-18|1997-07-23|1997-09-21|DELIVER IN PERSON|AIR|uffily regular accounts detect. deposit +49376|539|40|6|26|37427.78|0.02|0.01|N|O|1997-08-07|1997-07-29|1997-09-02|NONE|FOB| furiously final deposits. sly +49376|1346|23|7|43|53635.62|0.03|0.04|N|O|1997-08-03|1997-08-02|1997-08-21|NONE|TRUCK|e quickly after the regular, final reque +49377|1263|38|1|25|29106.50|0.04|0.07|R|F|1993-04-05|1993-04-13|1993-05-04|NONE|AIR|kages wake bl +49377|1054|60|2|49|46797.45|0.10|0.02|A|F|1993-03-13|1993-04-18|1993-03-23|TAKE BACK RETURN|TRUCK|terns: silent, regular accounts alon +49377|325|82|3|7|8577.24|0.08|0.01|R|F|1993-03-03|1993-05-14|1993-03-14|TAKE BACK RETURN|MAIL|pending foxes around the p +49378|1957|46|1|37|68781.15|0.06|0.07|N|O|1996-09-15|1996-08-23|1996-09-28|DELIVER IN PERSON|AIR|gular deposits will have t +49378|344|29|2|21|26131.14|0.00|0.07|N|O|1996-09-13|1996-08-25|1996-09-26|DELIVER IN PERSON|TRUCK|eful deposits. carefully special deposits +49379|1394|71|1|35|45338.65|0.07|0.03|N|O|1996-10-23|1996-09-19|1996-11-18|COLLECT COD|REG AIR|deas. slyly silent orbits use b +49379|1810|11|2|42|71896.02|0.01|0.08|N|O|1996-10-25|1996-11-09|1996-11-18|DELIVER IN PERSON|REG AIR|eodolites shall have to play bli +49379|568|29|3|46|67553.76|0.03|0.03|N|O|1996-08-19|1996-10-10|1996-08-28|COLLECT COD|FOB|e carefully f +49380|832|66|1|31|53717.73|0.05|0.05|R|F|1992-08-16|1992-07-10|1992-09-03|NONE|FOB|ronic ideas. quiet foxe +49380|1371|72|2|1|1272.37|0.07|0.01|A|F|1992-07-29|1992-06-14|1992-08-09|DELIVER IN PERSON|TRUCK| according to the blith +49380|456|57|3|7|9495.15|0.07|0.08|R|F|1992-07-16|1992-07-07|1992-07-21|TAKE BACK RETURN|MAIL|e carefully iron +49380|1945|90|4|15|27704.10|0.07|0.04|A|F|1992-05-22|1992-06-29|1992-05-23|NONE|REG AIR|ns. final somas s +49380|1215|16|5|4|4464.84|0.06|0.07|R|F|1992-06-16|1992-07-14|1992-07-16|DELIVER IN PERSON|MAIL|kages sleep blithely. fluffily even fr +49381|58|34|1|10|9580.50|0.02|0.08|A|F|1993-02-24|1993-01-13|1993-03-19|DELIVER IN PERSON|AIR|against the furiously final accounts. b +49381|1154|91|2|34|35875.10|0.04|0.08|R|F|1993-03-15|1993-01-16|1993-03-25|DELIVER IN PERSON|RAIL|o beans affix care +49381|1442|21|3|33|44333.52|0.10|0.04|R|F|1993-04-08|1993-02-14|1993-04-25|NONE|TRUCK|y. carefully pending +49382|353|82|1|32|40107.20|0.05|0.00|N|O|1996-04-07|1996-04-15|1996-04-08|TAKE BACK RETURN|MAIL|ter the pending, pending re +49382|66|67|2|47|45404.82|0.04|0.06|N|O|1996-05-20|1996-05-14|1996-06-04|NONE|AIR| unusual accounts wake blit +49383|1299|11|1|40|48011.60|0.10|0.02|N|O|1998-02-28|1998-01-14|1998-03-24|TAKE BACK RETURN|RAIL| quickly ironic deposits should hav +49383|1461|40|2|32|43598.72|0.02|0.03|N|O|1997-12-13|1998-01-29|1998-01-01|TAKE BACK RETURN|RAIL|ic excuses! slyly regular dolphins a +49383|1936|81|3|50|91896.50|0.04|0.08|N|O|1997-12-09|1997-12-14|1997-12-21|TAKE BACK RETURN|RAIL|furiously p +49383|380|37|4|38|48654.44|0.07|0.00|N|O|1997-12-28|1997-12-22|1998-01-09|DELIVER IN PERSON|FOB|ronic instruc +49408|1207|8|1|41|45436.20|0.04|0.06|N|O|1998-06-25|1998-07-28|1998-07-01|COLLECT COD|TRUCK| to the ruthlessly regular deposits. even +49408|1525|66|2|38|54207.76|0.09|0.05|N|O|1998-08-22|1998-08-17|1998-09-11|TAKE BACK RETURN|RAIL|n place of the silently ironic t +49408|445|46|3|10|13454.40|0.09|0.08|N|O|1998-08-03|1998-09-20|1998-08-12|COLLECT COD|RAIL|ts wake carefully iron +49408|676|70|4|26|40993.42|0.02|0.08|N|O|1998-07-02|1998-08-16|1998-07-22|TAKE BACK RETURN|FOB| bravely. slyly even packages among the +49408|384|13|5|2|2568.76|0.01|0.05|N|O|1998-09-16|1998-07-28|1998-10-01|COLLECT COD|SHIP|accounts cajole ironic requests +49409|1927|72|1|12|21947.04|0.09|0.01|N|O|1995-08-24|1995-10-15|1995-09-03|COLLECT COD|RAIL|al packages. slyly final dolphins wa +49409|646|78|2|27|41759.28|0.09|0.06|N|O|1995-11-29|1995-09-25|1995-12-24|COLLECT COD|SHIP|, quiet theodolites. evenly f +49409|75|26|3|18|17551.26|0.04|0.05|N|O|1995-09-27|1995-09-18|1995-10-07|NONE|TRUCK|lithely. quietly +49409|1403|82|4|28|36523.20|0.02|0.01|N|O|1995-12-05|1995-10-14|1996-01-03|DELIVER IN PERSON|MAIL| the blithely brave accounts. furiously r +49409|931|34|5|48|87932.64|0.01|0.07|N|O|1995-11-04|1995-11-09|1995-11-07|COLLECT COD|AIR|ironic instructions. i +49409|1345|60|6|32|39882.88|0.09|0.08|N|O|1995-10-24|1995-11-02|1995-11-03|DELIVER IN PERSON|AIR|efully fluffily ironic forges? furi +49409|1023|24|7|7|6468.14|0.00|0.00|N|O|1995-09-28|1995-09-27|1995-10-24|COLLECT COD|MAIL|ully slyly ironic foxes. slyly final packag +49410|1966|11|1|4|7471.84|0.00|0.06|R|F|1993-10-17|1993-11-12|1993-11-10|TAKE BACK RETURN|TRUCK|the fluffily close requests. +49410|952|21|2|22|40764.90|0.02|0.03|A|F|1993-10-13|1993-11-01|1993-10-31|DELIVER IN PERSON|RAIL|to the fluffily close accounts may nag +49410|1999|44|3|2|3801.98|0.06|0.04|A|F|1993-09-20|1993-11-25|1993-09-29|NONE|MAIL| bold courts cajole blithely +49410|1630|72|4|31|47480.53|0.06|0.00|A|F|1993-11-18|1993-11-26|1993-11-23|COLLECT COD|SHIP| above the blithely +49411|219|1|1|48|53722.08|0.07|0.04|A|F|1995-02-03|1995-01-23|1995-02-20|NONE|TRUCK|riously final accounts a +49412|972|75|1|43|80537.71|0.00|0.04|A|F|1994-06-08|1994-05-11|1994-06-30|COLLECT COD|RAIL|ely pending requests use fluffi +49412|1758|1|2|10|16597.50|0.10|0.01|A|F|1994-04-01|1994-05-26|1994-04-15|DELIVER IN PERSON|REG AIR|ic theodolites sleep blithely. fluffily +49413|1338|39|1|38|47094.54|0.07|0.08|N|O|1998-06-25|1998-06-30|1998-07-24|NONE|TRUCK|requests use car +49413|28|79|2|17|15776.34|0.01|0.01|N|O|1998-06-04|1998-05-31|1998-06-11|NONE|REG AIR|ites cajole according to the final exc +49413|1904|5|3|24|43341.60|0.03|0.08|N|O|1998-05-14|1998-06-25|1998-05-31|DELIVER IN PERSON|AIR|would engage furi +49413|167|46|4|38|40552.08|0.08|0.07|N|O|1998-06-29|1998-05-22|1998-07-26|TAKE BACK RETURN|AIR|l accounts detect. ironic theodolites after +49414|477|7|1|23|31681.81|0.08|0.05|N|O|1995-09-19|1995-10-01|1995-10-01|DELIVER IN PERSON|REG AIR| final acco +49415|60|86|1|4|3840.24|0.09|0.06|N|O|1998-08-19|1998-07-10|1998-08-28|TAKE BACK RETURN|REG AIR|ording to the special accounts cajole slyly +49415|1834|78|2|50|86791.50|0.09|0.04|N|O|1998-06-30|1998-07-24|1998-07-04|TAKE BACK RETURN|MAIL|blithely fina +49415|560|91|3|47|68646.32|0.05|0.08|N|O|1998-08-23|1998-07-14|1998-08-30|TAKE BACK RETURN|FOB|sometimes unusual deposits haggle blithely +49415|1065|71|4|13|12558.78|0.05|0.08|N|O|1998-08-23|1998-07-31|1998-09-02|TAKE BACK RETURN|AIR|fluffily. regular pains integrate furio +49415|1161|62|5|1|1062.16|0.02|0.03|N|O|1998-07-12|1998-07-19|1998-08-09|NONE|TRUCK|blate. blithely bold deposits against t +49415|842|9|6|18|31371.12|0.03|0.03|N|O|1998-09-05|1998-07-25|1998-09-13|TAKE BACK RETURN|SHIP|bove the slyly ironic ideas. even, +49440|385|14|1|39|50129.82|0.05|0.01|N|O|1997-06-28|1997-06-05|1997-07-01|NONE|MAIL| detect blithely. fluffily +49440|756|57|2|40|66270.00|0.04|0.02|N|O|1997-05-26|1997-05-03|1997-06-18|COLLECT COD|TRUCK|l instructions affix quickly. pendin +49440|1520|1|3|49|69654.48|0.04|0.04|N|O|1997-04-28|1997-06-04|1997-05-23|DELIVER IN PERSON|REG AIR|. furiously even requests +49440|1257|95|4|8|9266.00|0.07|0.06|N|O|1997-05-12|1997-04-23|1997-05-28|COLLECT COD|MAIL|the bravel +49440|1263|38|5|30|34927.80|0.10|0.02|N|O|1997-06-25|1997-05-19|1997-07-01|NONE|TRUCK|pending asympt +49441|1559|60|1|4|5842.20|0.00|0.02|A|F|1994-12-13|1994-11-12|1994-12-28|COLLECT COD|RAIL| unusual dependencies. final accoun +49441|799|64|2|31|52693.49|0.00|0.00|R|F|1995-01-02|1994-12-20|1995-01-06|COLLECT COD|AIR|arefully slow ideas cajole carefully aga +49441|1948|81|3|21|38848.74|0.05|0.06|A|F|1994-11-14|1994-11-29|1994-12-02|TAKE BACK RETURN|SHIP|t quickly ironic requests. +49441|64|90|4|49|47238.94|0.10|0.04|A|F|1994-12-06|1994-12-09|1994-12-14|TAKE BACK RETURN|MAIL|against the regular excuses are furiou +49442|1745|30|1|13|21407.62|0.04|0.08|A|F|1992-08-25|1992-11-01|1992-08-29|COLLECT COD|FOB|instructions. slyl +49442|1238|76|2|47|53543.81|0.04|0.07|R|F|1992-12-07|1992-10-10|1993-01-02|DELIVER IN PERSON|AIR|ly along the quickly even requests. slyl +49442|310|39|3|22|26626.82|0.07|0.07|A|F|1992-09-14|1992-10-23|1992-09-21|COLLECT COD|RAIL|gouts about the excuses sl +49442|1681|5|4|1|1582.68|0.09|0.04|A|F|1992-09-13|1992-09-18|1992-09-22|DELIVER IN PERSON|RAIL| of the finally dogg +49442|1570|71|5|30|44147.10|0.06|0.00|A|F|1992-11-03|1992-09-18|1992-11-29|NONE|REG AIR|ouches above the regular asym +49442|583|44|6|15|22253.70|0.06|0.07|A|F|1992-08-11|1992-09-23|1992-08-15|COLLECT COD|TRUCK| deposits a +49443|350|7|1|49|61267.15|0.04|0.07|R|F|1995-01-30|1995-04-22|1995-02-13|DELIVER IN PERSON|SHIP|. blithely even pinto beans boost slyl +49443|1441|42|2|35|46985.40|0.03|0.02|R|F|1995-05-09|1995-03-26|1995-05-20|COLLECT COD|FOB|ffily bold requests against the final dep +49443|435|36|3|44|58758.92|0.02|0.07|A|F|1995-03-17|1995-04-12|1995-03-25|TAKE BACK RETURN|AIR|ys sleep c +49444|225|7|1|22|24754.84|0.06|0.08|N|O|1997-03-03|1997-04-19|1997-03-25|TAKE BACK RETURN|MAIL|l requests among the blithely fin +49444|495|25|2|34|47446.66|0.10|0.08|N|O|1997-05-17|1997-02-27|1997-06-04|NONE|MAIL|ges haggle +49444|1949|50|3|36|66633.84|0.10|0.01|N|O|1997-05-06|1997-03-04|1997-05-24|COLLECT COD|TRUCK|sly final accounts integrate. +49444|497|85|4|3|4192.47|0.04|0.06|N|O|1997-05-10|1997-04-17|1997-05-12|TAKE BACK RETURN|RAIL| accounts. slyly regular packages +49444|1459|60|5|25|34011.25|0.04|0.06|N|O|1997-03-07|1997-03-20|1997-03-28|COLLECT COD|TRUCK|hins boost carefully abo +49444|1378|79|6|40|51174.80|0.01|0.07|N|O|1997-03-30|1997-04-09|1997-04-29|COLLECT COD|FOB|hely even deposits slee +49444|1752|95|7|1|1653.75|0.05|0.05|N|O|1997-01-24|1997-04-03|1997-02-14|TAKE BACK RETURN|RAIL|c courts nag theodolites. quickly +49445|1359|36|1|31|39070.85|0.07|0.02|N|O|1998-05-21|1998-04-23|1998-06-07|COLLECT COD|SHIP|y ironic pinto b +49445|162|15|2|20|21243.20|0.09|0.05|N|O|1998-06-09|1998-04-21|1998-06-13|COLLECT COD|AIR|sly bold foxes affix slyly above +49445|1679|62|3|36|56904.12|0.10|0.02|N|O|1998-03-21|1998-04-23|1998-04-08|DELIVER IN PERSON|TRUCK|ing deposits ac +49445|1724|25|4|47|76408.84|0.03|0.05|N|O|1998-03-22|1998-05-06|1998-04-14|TAKE BACK RETURN|FOB|ts nag blithely a +49445|46|22|5|20|18920.80|0.03|0.02|N|O|1998-04-10|1998-06-03|1998-05-06|NONE|SHIP| against th +49446|644|45|1|1|1544.64|0.09|0.05|N|O|1998-01-27|1997-12-20|1998-02-19|DELIVER IN PERSON|TRUCK|ounts wake carefully. accounts sleep b +49446|955|58|2|23|42686.85|0.02|0.06|N|O|1998-01-19|1997-11-28|1998-02-01|COLLECT COD|SHIP|onic asymptotes integrate careful +49446|809|76|3|36|61552.80|0.04|0.00|N|O|1997-11-04|1997-12-25|1997-11-11|NONE|SHIP|ets use carefully theodolites. slyly +49447|637|31|1|15|23064.45|0.08|0.08|N|O|1996-07-10|1996-09-14|1996-07-31|DELIVER IN PERSON|REG AIR|t deposits detect furiously. accounts +49447|1681|82|2|34|53811.12|0.09|0.08|N|O|1996-09-21|1996-08-28|1996-10-07|DELIVER IN PERSON|MAIL|hely fluffily ironic mult +49447|1114|23|3|12|12181.32|0.03|0.07|N|O|1996-09-21|1996-08-29|1996-10-08|NONE|MAIL|ithely special requests? bold, even p +49447|1258|96|4|3|3477.75|0.06|0.07|N|O|1996-08-19|1996-08-12|1996-08-25|DELIVER IN PERSON|TRUCK|the slyly special packages wake around th +49447|97|73|5|13|12962.17|0.05|0.02|N|O|1996-09-23|1996-09-02|1996-10-18|NONE|AIR| carefully final accounts hagg +49447|243|71|6|15|17148.60|0.02|0.01|N|O|1996-07-31|1996-09-02|1996-08-25|COLLECT COD|REG AIR|e regular, ironic asymptotes cajo +49447|527|58|7|30|42825.60|0.06|0.02|N|O|1996-10-03|1996-09-16|1996-10-10|NONE|SHIP|s use quickly. +49472|1736|63|1|46|75335.58|0.02|0.04|A|F|1993-08-04|1993-09-01|1993-08-28|NONE|REG AIR|g asymptotes need to wake carefully regula +49472|338|95|2|9|11144.97|0.08|0.04|A|F|1993-08-17|1993-10-10|1993-09-06|COLLECT COD|RAIL|uickly escapa +49472|173|26|3|9|9658.53|0.04|0.03|A|F|1993-09-25|1993-10-03|1993-09-29|DELIVER IN PERSON|AIR|es boost furiously according to +49472|1381|58|4|41|52577.58|0.07|0.08|A|F|1993-07-25|1993-09-22|1993-08-19|COLLECT COD|AIR|even requests wake ca +49472|583|74|5|9|13352.22|0.02|0.02|A|F|1993-09-27|1993-09-27|1993-10-19|NONE|RAIL|beans print. ironic pac +49473|1168|77|1|38|40628.08|0.00|0.04|N|O|1997-09-17|1997-10-26|1997-10-06|DELIVER IN PERSON|AIR|deposits sleep carefully. +49473|1998|99|2|48|91199.52|0.02|0.03|N|O|1997-09-19|1997-10-17|1997-09-23|NONE|REG AIR|ajole slyly deposits. pending fox +49473|1913|46|3|44|79856.04|0.02|0.08|N|O|1997-10-25|1997-10-14|1997-11-16|COLLECT COD|TRUCK|latelets ha +49473|1418|36|4|9|11874.69|0.09|0.05|N|O|1997-09-23|1997-10-12|1997-09-26|TAKE BACK RETURN|RAIL|elets across the ironic deposits haggle flu +49473|1281|82|5|15|17734.20|0.00|0.06|N|O|1997-11-10|1997-10-10|1997-11-20|DELIVER IN PERSON|RAIL|ly regular dolphin +49473|1821|8|6|16|27565.12|0.08|0.05|N|O|1997-10-28|1997-09-24|1997-11-03|TAKE BACK RETURN|RAIL|ully ironic platelets sleep careful +49473|810|11|7|50|85540.50|0.03|0.01|N|O|1997-10-04|1997-10-21|1997-10-22|TAKE BACK RETURN|RAIL|he slyly ironic requests. blithely re +49474|127|54|1|3|3081.36|0.09|0.02|N|O|1997-12-09|1997-12-12|1997-12-31|NONE|REG AIR| final accounts haggl +49474|617|80|2|2|3035.22|0.02|0.05|N|O|1997-11-10|1997-12-12|1997-11-25|COLLECT COD|TRUCK|lent instructions engage quickly aga +49474|1287|99|3|27|32083.56|0.03|0.03|N|O|1998-02-13|1997-12-20|1998-03-10|DELIVER IN PERSON|TRUCK|ions believe. carefully ironic deposits ki +49474|763|64|4|17|28283.92|0.09|0.00|N|O|1998-01-04|1998-01-10|1998-01-07|DELIVER IN PERSON|TRUCK|instructions ma +49474|1972|61|5|14|26235.58|0.08|0.05|N|O|1998-02-15|1998-01-20|1998-03-03|COLLECT COD|SHIP|egular, special r +49474|552|83|6|7|10167.85|0.08|0.05|N|O|1998-01-22|1998-01-21|1998-01-23|COLLECT COD|REG AIR|ly final instructions +49475|1156|93|1|23|24314.45|0.02|0.04|N|O|1997-07-13|1997-08-05|1997-07-22|DELIVER IN PERSON|SHIP|special ideas. carefully b +49475|1515|36|2|30|42495.30|0.01|0.00|N|O|1997-08-31|1997-08-03|1997-09-29|DELIVER IN PERSON|MAIL|quickly sp +49475|1653|77|3|15|23319.75|0.07|0.03|N|O|1997-06-02|1997-07-03|1997-06-19|COLLECT COD|SHIP|tealthy dependenci +49476|1508|49|1|40|56380.00|0.09|0.05|N|O|1997-11-25|1997-12-17|1997-12-24|NONE|MAIL|tions. carefully speci +49476|327|84|2|16|19637.12|0.07|0.01|N|O|1998-01-14|1997-11-16|1998-01-17|COLLECT COD|TRUCK|ages x-ray after the even, final ac +49476|1409|49|3|17|22276.80|0.04|0.03|N|O|1998-01-13|1997-11-21|1998-02-09|TAKE BACK RETURN|RAIL|l foxes are at the special, ironic +49476|455|14|4|50|67772.50|0.04|0.00|N|O|1997-12-24|1997-12-13|1997-12-26|NONE|FOB|s dependencies cajole fluffily. regular, bl +49476|297|25|5|31|37115.99|0.08|0.02|N|O|1997-12-05|1997-12-16|1997-12-16|NONE|SHIP|iously even packages are careful +49476|622|54|6|43|65472.66|0.04|0.02|N|O|1997-12-05|1997-11-30|1997-12-20|TAKE BACK RETURN|TRUCK|y alongside of the +49476|30|81|7|10|9300.30|0.07|0.04|N|O|1997-10-17|1997-12-29|1997-11-13|COLLECT COD|SHIP|ilent requests up the regular +49477|602|34|1|26|39067.60|0.08|0.06|N|O|1996-03-11|1996-01-28|1996-03-19|NONE|RAIL|the unusual requests. accounts eat. daring +49477|510|11|2|2|2821.02|0.05|0.03|N|O|1996-01-26|1996-02-06|1996-02-21|NONE|FOB|haggle slyly final deposits. +49477|1142|43|3|15|15647.10|0.08|0.03|N|O|1996-03-06|1996-01-28|1996-03-17|DELIVER IN PERSON|REG AIR|ly requests. attai +49477|353|10|4|3|3760.05|0.09|0.07|N|O|1996-01-21|1996-02-27|1996-02-13|DELIVER IN PERSON|RAIL| packages hinder c +49477|1907|52|5|40|72356.00|0.00|0.07|N|O|1996-03-15|1996-02-23|1996-04-04|COLLECT COD|FOB|unusual de +49477|169|96|6|43|45973.88|0.07|0.01|N|O|1996-02-11|1996-01-03|1996-02-20|TAKE BACK RETURN|REG AIR|ng pinto beans after the +49478|463|22|1|8|10907.68|0.04|0.06|N|O|1998-02-24|1998-03-03|1998-03-20|NONE|RAIL|. pending requests about th +49478|126|79|2|2|2052.24|0.00|0.04|N|O|1998-02-17|1998-03-27|1998-03-09|COLLECT COD|RAIL|s deposits wake car +49478|1389|28|3|34|43872.92|0.07|0.08|N|O|1998-02-03|1998-04-19|1998-02-18|NONE|TRUCK|regular, final platelets ought to w +49478|707|8|4|12|19292.40|0.08|0.05|N|O|1998-05-13|1998-02-28|1998-06-10|COLLECT COD|RAIL|ainst the ironic requests. carefully regul +49479|240|41|1|9|10262.16|0.01|0.00|N|O|1995-08-31|1995-09-24|1995-09-20|TAKE BACK RETURN|FOB|y accounts. asymptotes sleep fluffily b +49479|875|42|2|18|31965.66|0.03|0.07|N|O|1995-08-31|1995-10-04|1995-09-15|DELIVER IN PERSON|MAIL|. slyly ironic deposits cajol +49479|775|72|3|45|75409.65|0.09|0.04|N|O|1995-10-08|1995-09-01|1995-10-25|NONE|FOB|ial ideas are +49479|1698|99|4|49|78384.81|0.10|0.05|N|O|1995-10-28|1995-10-21|1995-11-04|NONE|SHIP|ole carefully outside the dep +49479|731|32|5|46|75059.58|0.01|0.02|N|O|1995-08-06|1995-09-26|1995-08-11|DELIVER IN PERSON|REG AIR|ven instructions sho +49504|1045|81|1|6|5676.24|0.06|0.04|A|F|1994-12-31|1995-02-10|1995-01-02|TAKE BACK RETURN|TRUCK|ages. final frets u +49504|526|87|2|42|59913.84|0.07|0.04|A|F|1995-02-05|1994-12-20|1995-02-24|DELIVER IN PERSON|TRUCK| sleep accordin +49505|151|52|1|35|36790.25|0.08|0.05|R|F|1994-02-27|1994-03-04|1994-03-17|DELIVER IN PERSON|TRUCK|. carefully busy a +49505|968|69|2|22|41117.12|0.02|0.04|A|F|1994-01-31|1994-03-22|1994-02-28|DELIVER IN PERSON|AIR|nts. quickly ironic packages alongside +49505|1536|17|3|36|51751.08|0.07|0.05|R|F|1994-02-11|1994-02-25|1994-02-19|TAKE BACK RETURN|REG AIR|ld courts after the furiously regular depos +49505|296|24|4|4|4785.16|0.07|0.06|R|F|1994-02-02|1994-02-22|1994-03-03|DELIVER IN PERSON|FOB|. furiously final instructions haggle +49505|715|16|5|4|6462.84|0.01|0.08|R|F|1994-02-13|1994-04-22|1994-02-17|NONE|FOB|e. carefully silent re +49505|1038|9|6|34|31927.02|0.03|0.02|R|F|1994-03-03|1994-04-15|1994-03-18|NONE|RAIL| accounts engage slyly ab +49505|1927|72|7|22|40236.24|0.01|0.06|A|F|1994-02-06|1994-04-03|1994-03-05|COLLECT COD|FOB| slyly regu +49506|1870|100|1|41|72646.67|0.03|0.07|N|O|1997-06-01|1997-06-13|1997-06-20|TAKE BACK RETURN|TRUCK|hely express th +49506|528|19|2|27|38570.04|0.05|0.06|N|O|1997-05-11|1997-06-19|1997-06-10|NONE|RAIL|regular depos +49506|642|74|3|24|37023.36|0.02|0.06|N|O|1997-08-05|1997-07-02|1997-08-25|DELIVER IN PERSON|SHIP|. fluffily ironic accounts wake quick +49507|1775|2|1|40|67070.80|0.04|0.06|N|O|1997-11-30|1998-01-13|1997-12-06|DELIVER IN PERSON|REG AIR|around the slyly ironic accounts. bo +49507|1982|15|2|31|58403.38|0.07|0.07|N|O|1997-12-07|1997-11-22|1997-12-20|NONE|FOB|g the blithely unusual foxes wake slyly acc +49508|1799|26|1|8|13606.32|0.08|0.02|N|O|1998-08-19|1998-09-02|1998-08-24|TAKE BACK RETURN|FOB|ccounts are furious +49508|260|88|2|46|53371.96|0.01|0.08|N|O|1998-08-16|1998-09-22|1998-08-29|DELIVER IN PERSON|SHIP|ar accounts cajole. packages +49508|50|51|3|49|46552.45|0.09|0.03|N|O|1998-11-02|1998-08-24|1998-11-19|DELIVER IN PERSON|REG AIR|ckly daring +49508|1076|82|4|41|40059.87|0.01|0.08|N|O|1998-09-14|1998-08-14|1998-09-17|NONE|SHIP|es serve fluffily about the silen +49508|53|54|5|38|36215.90|0.09|0.06|N|O|1998-10-16|1998-08-25|1998-11-12|DELIVER IN PERSON|MAIL|nd the slyly pendin +49508|840|40|6|35|60929.40|0.04|0.02|N|O|1998-07-16|1998-09-03|1998-08-10|DELIVER IN PERSON|SHIP| pending accounts cajole. ironically fin +49509|1808|38|1|5|8549.00|0.03|0.01|N|O|1995-07-18|1995-08-13|1995-08-01|COLLECT COD|MAIL|ously ironic +49509|968|71|2|13|24296.48|0.01|0.06|N|O|1995-07-17|1995-09-02|1995-07-19|TAKE BACK RETURN|REG AIR|al platelets haggle carefully. requests ca +49509|321|50|3|28|34196.96|0.07|0.06|N|O|1995-09-03|1995-08-04|1995-09-16|NONE|FOB|, regular ideas nag after the +49510|1083|84|1|19|18697.52|0.04|0.07|R|F|1992-07-19|1992-05-09|1992-07-25|COLLECT COD|REG AIR| alongside of the final deposits. ev +49510|1151|60|2|32|33668.80|0.10|0.04|R|F|1992-06-20|1992-05-29|1992-06-23|NONE|RAIL| platelets impress across the even +49510|1749|50|3|24|39617.76|0.01|0.02|R|F|1992-07-17|1992-06-17|1992-07-24|DELIVER IN PERSON|TRUCK|ress instructions along the express +49510|1778|79|4|19|31915.63|0.05|0.00|A|F|1992-06-22|1992-04-20|1992-07-21|TAKE BACK RETURN|AIR|as ought to are carefu +49511|1798|83|1|6|10198.74|0.01|0.06|A|F|1994-07-09|1994-06-25|1994-07-24|COLLECT COD|REG AIR|fully special p +49511|661|24|2|5|7808.30|0.01|0.02|R|F|1994-07-01|1994-07-16|1994-07-20|NONE|FOB|iously ironic packages detect carefully; c +49511|288|89|3|7|8317.96|0.06|0.05|A|F|1994-05-01|1994-05-28|1994-05-26|DELIVER IN PERSON|TRUCK|ests wake across the ironic foxe +49511|1613|14|4|3|4543.83|0.00|0.01|A|F|1994-07-03|1994-05-25|1994-07-17|NONE|TRUCK|gle above the regu +49511|1847|91|5|39|68204.76|0.02|0.01|A|F|1994-04-26|1994-05-26|1994-04-29|TAKE BACK RETURN|TRUCK|g the furiously even +49511|464|52|6|33|45027.18|0.08|0.00|R|F|1994-06-06|1994-06-19|1994-06-27|COLLECT COD|RAIL|eas snooze fluffily +49536|461|62|1|3|4084.38|0.10|0.02|N|O|1996-02-15|1996-02-08|1996-03-16|COLLECT COD|FOB|sly. blithely regula +49536|1034|35|2|50|46751.50|0.05|0.03|N|O|1996-03-13|1996-01-20|1996-03-21|DELIVER IN PERSON|REG AIR| express excuses. slyly regular asympto +49537|161|62|1|30|31834.80|0.00|0.04|R|F|1995-03-25|1995-05-10|1995-03-28|COLLECT COD|FOB|s use bold realms. pending a +49538|1787|14|1|3|5066.34|0.08|0.04|A|F|1993-03-27|1993-04-20|1993-04-03|DELIVER IN PERSON|MAIL|haggle quickly unusual pinto beans. sile +49538|333|62|2|22|27133.26|0.01|0.08|A|F|1993-07-03|1993-06-12|1993-07-23|TAKE BACK RETURN|SHIP|nts boost blithely depos +49538|70|96|3|26|25221.82|0.00|0.02|A|F|1993-06-20|1993-06-10|1993-07-02|COLLECT COD|FOB|osits among the blithely ironic decoys be +49538|284|39|4|38|45002.64|0.01|0.01|A|F|1993-03-28|1993-05-08|1993-04-26|NONE|RAIL|row carefully. bl +49539|1047|83|1|26|24649.04|0.06|0.04|A|F|1993-04-13|1993-05-21|1993-05-12|NONE|AIR|ccording to the furiously f +49539|1920|65|2|17|30972.64|0.04|0.02|A|F|1993-07-31|1993-06-25|1993-08-12|NONE|AIR|egular reques +49539|422|81|3|8|10579.36|0.09|0.03|A|F|1993-04-17|1993-06-17|1993-04-25|NONE|FOB|ly regular ideas nod bl +49539|1921|66|4|34|61979.28|0.01|0.03|R|F|1993-04-30|1993-05-29|1993-05-22|DELIVER IN PERSON|RAIL|structions detect above the quick +49540|271|53|1|33|38651.91|0.00|0.02|N|O|1997-11-24|1997-11-17|1997-11-28|NONE|RAIL|ular pains sleep furiously idle sauterne +49540|936|39|2|49|90009.57|0.05|0.00|N|O|1997-12-21|1997-10-30|1998-01-17|DELIVER IN PERSON|RAIL|n quickly blithel +49540|1070|41|3|36|34958.52|0.03|0.08|N|O|1997-12-24|1997-12-12|1998-01-07|TAKE BACK RETURN|RAIL|riously ironic excuses. furi +49540|1000|1|4|12|10812.00|0.09|0.02|N|O|1997-10-09|1997-12-06|1997-10-15|NONE|SHIP|ckages detect carefully. silent, reg +49541|260|42|1|31|35968.06|0.05|0.01|R|F|1994-01-20|1994-03-01|1994-02-13|TAKE BACK RETURN|REG AIR| slyly ide +49542|1053|54|1|22|20989.10|0.08|0.01|R|F|1993-10-06|1993-09-20|1993-10-31|DELIVER IN PERSON|SHIP|mong the quickly re +49542|1049|20|2|45|42751.80|0.08|0.07|A|F|1993-10-28|1993-09-24|1993-11-05|TAKE BACK RETURN|FOB|xes. furiously even theodolit +49543|189|68|1|46|50102.28|0.01|0.06|R|F|1992-04-30|1992-03-22|1992-05-12|TAKE BACK RETURN|AIR|nto beans cajole quic +49543|758|91|2|10|16587.50|0.06|0.00|A|F|1992-04-28|1992-02-16|1992-05-27|COLLECT COD|MAIL|ven instructions haggle slyly blithely reg +49543|1285|23|3|23|27284.44|0.04|0.05|R|F|1992-02-23|1992-02-29|1992-03-01|TAKE BACK RETURN|AIR| above the final d +49568|1173|82|1|46|49411.82|0.09|0.03|N|O|1997-06-28|1997-05-23|1997-07-02|NONE|RAIL|s instructions. +49568|183|36|2|16|17330.88|0.04|0.04|N|O|1997-04-26|1997-03-30|1997-05-06|DELIVER IN PERSON|MAIL|ely express packages according t +49569|458|88|1|28|38036.60|0.00|0.03|R|F|1994-09-07|1994-09-14|1994-09-08|TAKE BACK RETURN|MAIL|press requests. s +49569|1033|34|2|45|42031.35|0.09|0.07|R|F|1994-08-13|1994-09-07|1994-08-24|DELIVER IN PERSON|TRUCK|sts. blithely regular dolphins +49569|1193|30|3|31|33919.89|0.09|0.07|R|F|1994-08-14|1994-08-01|1994-09-13|COLLECT COD|SHIP|ajole slyly +49569|849|83|4|37|64744.08|0.01|0.02|R|F|1994-06-26|1994-09-09|1994-07-04|DELIVER IN PERSON|SHIP|ts integrate carefull +49569|1845|75|5|45|78607.80|0.04|0.07|R|F|1994-09-21|1994-08-31|1994-10-15|NONE|REG AIR| to the carefully b +49570|206|61|1|21|23230.20|0.10|0.07|A|F|1994-09-06|1994-07-31|1994-10-04|NONE|AIR|ecial, special dependencies. even, regular +49570|907|8|2|2|3615.80|0.01|0.04|R|F|1994-09-18|1994-08-17|1994-10-18|DELIVER IN PERSON|FOB| accounts are against t +49570|624|87|3|24|36590.88|0.08|0.04|R|F|1994-10-18|1994-09-22|1994-10-27|NONE|REG AIR|ructions. fin +49571|1276|77|1|37|43558.99|0.01|0.03|N|O|1997-01-09|1996-11-23|1997-01-22|NONE|RAIL|structions sleep. regular foxes hinder. r +49571|1588|89|2|17|25322.86|0.01|0.08|N|O|1997-01-10|1996-11-30|1997-01-26|TAKE BACK RETURN|REG AIR|symptotes haggle. grouches play abo +49571|1184|85|3|25|27129.50|0.03|0.01|N|O|1997-01-05|1996-12-18|1997-01-30|DELIVER IN PERSON|REG AIR|lyly ironic accounts n +49571|297|79|4|22|26340.38|0.01|0.03|N|O|1996-11-22|1996-12-19|1996-11-24|COLLECT COD|RAIL|ies haggle. requests sleep carefully furio +49572|463|51|1|11|14998.06|0.05|0.08|N|O|1997-02-09|1997-03-27|1997-02-19|NONE|RAIL|ts throughout the blithely final acco +49572|1384|61|2|15|19280.70|0.05|0.08|N|O|1997-01-13|1997-02-21|1997-01-20|COLLECT COD|MAIL|hes. slyly express de +49573|892|59|1|11|19721.79|0.01|0.02|N|O|1998-01-15|1998-03-23|1998-01-19|NONE|FOB|unwind quickly abou +49574|1312|27|1|34|41252.54|0.08|0.07|N|O|1998-01-25|1998-03-08|1998-02-15|DELIVER IN PERSON|SHIP|ross the acco +49574|281|9|2|12|14175.36|0.00|0.08|N|O|1998-02-14|1998-02-11|1998-02-16|DELIVER IN PERSON|FOB|tructions use express theodolites. +49574|1522|23|3|49|69752.48|0.09|0.00|N|O|1998-03-04|1998-02-16|1998-03-28|TAKE BACK RETURN|REG AIR|y ironic, pending pinto beans. requests ha +49575|710|7|1|31|49932.01|0.01|0.06|A|F|1994-02-13|1994-02-11|1994-02-26|DELIVER IN PERSON|RAIL|ts about the quick +49575|868|69|2|36|63678.96|0.00|0.06|R|F|1994-03-10|1994-02-15|1994-04-06|TAKE BACK RETURN|REG AIR|ully ironic requests sleep quic +49575|1500|79|3|43|60264.50|0.07|0.01|A|F|1994-01-11|1994-02-18|1994-02-08|NONE|FOB|nic deposits. blithely reg +49575|1198|99|4|28|30777.32|0.03|0.07|A|F|1994-03-12|1994-02-18|1994-03-16|NONE|SHIP|y furiously +49575|1582|63|5|18|26704.44|0.08|0.06|A|F|1994-04-05|1994-02-24|1994-04-22|COLLECT COD|REG AIR|s cajole. +49575|1230|42|6|18|20362.14|0.10|0.07|R|F|1994-03-17|1994-03-13|1994-04-07|DELIVER IN PERSON|AIR|ously pending mult +49575|736|33|7|16|26187.68|0.10|0.05|R|F|1994-01-21|1994-01-23|1994-02-09|NONE|MAIL|as was care +49600|1176|85|1|4|4308.68|0.09|0.01|N|F|1995-06-16|1995-04-18|1995-06-29|DELIVER IN PERSON|RAIL|inal deposits. blithely p +49600|1363|78|2|29|36666.44|0.10|0.03|N|F|1995-05-30|1995-04-10|1995-06-24|COLLECT COD|SHIP|ts wake over the fluffily ironi +49600|1037|43|3|25|23450.75|0.01|0.07|N|O|1995-07-06|1995-05-05|1995-07-21|NONE|SHIP|y ironic packages? regular, regular foxes +49600|1612|95|4|21|31785.81|0.08|0.01|A|F|1995-04-17|1995-06-03|1995-05-10|NONE|MAIL|ickly even instructio +49600|659|60|5|21|32752.65|0.06|0.03|A|F|1995-05-29|1995-05-07|1995-06-09|NONE|RAIL| unusual hockey players inte +49601|387|44|1|34|43770.92|0.05|0.01|R|F|1995-04-01|1995-03-27|1995-04-08|DELIVER IN PERSON|TRUCK|packages use busily. furiously special +49601|140|19|2|10|10401.40|0.09|0.03|R|F|1995-03-20|1995-04-13|1995-04-09|NONE|RAIL|e blithely even ideas. blithely sil +49601|1692|93|3|33|52591.77|0.01|0.03|A|F|1995-04-12|1995-04-27|1995-04-24|NONE|REG AIR|requests accor +49601|248|3|4|46|52819.04|0.06|0.08|A|F|1995-04-09|1995-04-26|1995-04-13|DELIVER IN PERSON|FOB|aggle always. busy deposits use ironicall +49602|275|57|1|39|45835.53|0.01|0.04|A|F|1992-03-19|1992-04-19|1992-04-04|NONE|SHIP|ncies. blithely express package +49602|891|25|2|40|71675.60|0.00|0.00|R|F|1992-06-17|1992-04-15|1992-07-04|TAKE BACK RETURN|FOB|ly final instruct +49602|1409|27|3|50|65520.00|0.06|0.00|R|F|1992-04-18|1992-05-30|1992-05-09|COLLECT COD|REG AIR|nal accounts so +49602|742|43|4|8|13141.92|0.00|0.01|R|F|1992-05-05|1992-05-06|1992-05-16|COLLECT COD|REG AIR|equests. fluffily ir +49602|1912|57|5|23|41719.93|0.09|0.08|A|F|1992-05-12|1992-06-06|1992-05-29|DELIVER IN PERSON|FOB|odolites wake furious +49603|1014|15|1|31|28365.31|0.01|0.08|N|O|1996-02-16|1995-12-07|1996-02-19|NONE|AIR|olites. blithely express requests h +49603|1736|79|2|47|76973.31|0.04|0.00|N|O|1996-01-26|1995-12-20|1996-02-08|TAKE BACK RETURN|TRUCK|foxes was. bold ideas a +49603|1426|5|3|46|61061.32|0.02|0.07|N|O|1995-12-14|1995-12-22|1996-01-13|NONE|TRUCK|. final requests at the even sheaves na +49603|36|62|4|23|21528.69|0.01|0.03|N|O|1995-12-10|1995-12-15|1995-12-19|DELIVER IN PERSON|FOB|counts. carefully pending accounts use c +49604|1939|72|1|14|25773.02|0.02|0.05|N|O|1997-04-17|1997-03-12|1997-04-19|DELIVER IN PERSON|RAIL|nt, even platelets. accounts among +49604|1072|43|2|37|36003.59|0.00|0.04|N|O|1997-05-25|1997-03-07|1997-06-12|DELIVER IN PERSON|AIR|l ideas. r +49605|251|52|1|27|31083.75|0.10|0.01|N|O|1998-05-05|1998-04-11|1998-05-19|NONE|MAIL|itaphs are unusual requests; fi +49605|919|88|2|48|87355.68|0.07|0.08|N|O|1998-02-25|1998-04-09|1998-03-08|COLLECT COD|TRUCK|ross the regular c +49605|1027|28|3|15|13920.30|0.07|0.03|N|O|1998-03-02|1998-03-31|1998-03-31|TAKE BACK RETURN|FOB| furiously above the carefully unusual p +49605|179|58|4|33|35612.61|0.01|0.03|N|O|1998-03-10|1998-04-21|1998-04-04|DELIVER IN PERSON|REG AIR|quickly among the carefully silent p +49605|1673|97|5|25|39366.75|0.01|0.08|N|O|1998-03-10|1998-03-28|1998-04-03|DELIVER IN PERSON|TRUCK|cingly final deposits. sl +49606|1165|38|1|38|40514.08|0.05|0.02|A|F|1993-12-25|1993-12-29|1994-01-23|DELIVER IN PERSON|AIR| pinto beans wak +49607|925|26|1|39|71210.88|0.05|0.03|R|F|1994-05-08|1994-07-23|1994-06-03|COLLECT COD|FOB|ckly ironic p +49632|455|43|1|25|33886.25|0.01|0.00|R|F|1993-02-05|1993-01-13|1993-03-02|COLLECT COD|MAIL|y even dependen +49632|1659|83|2|20|31213.00|0.02|0.01|R|F|1993-03-20|1993-01-15|1993-03-24|COLLECT COD|AIR|gular package +49632|1056|62|3|25|23926.25|0.10|0.01|A|F|1993-02-27|1993-01-16|1993-03-20|NONE|AIR|e unusual, ironic instructions? careful +49632|1147|48|4|13|13625.82|0.00|0.05|A|F|1993-03-21|1993-02-19|1993-04-07|COLLECT COD|FOB|old request +49632|469|28|5|49|67103.54|0.10|0.08|A|F|1993-01-09|1993-01-16|1993-02-02|DELIVER IN PERSON|FOB|. blithely silent packages cajole +49632|821|55|6|6|10330.92|0.08|0.04|R|F|1993-03-14|1993-01-09|1993-04-03|TAKE BACK RETURN|FOB|ly carefully +49633|1867|68|1|7|12382.02|0.01|0.04|A|F|1993-04-07|1993-04-01|1993-04-10|COLLECT COD|TRUCK|ndencies. slyly ironic foxes affix +49633|1262|74|2|36|41877.36|0.03|0.05|R|F|1993-02-23|1993-04-25|1993-02-26|COLLECT COD|FOB|g to the ruthless +49633|1268|69|3|44|51447.44|0.02|0.06|A|F|1993-03-15|1993-03-27|1993-03-18|NONE|REG AIR| grouches above the caref +49633|720|21|4|43|69690.96|0.09|0.02|A|F|1993-03-28|1993-03-15|1993-04-12|NONE|SHIP| the unusual, special accounts. silent, b +49633|1601|2|5|35|52591.00|0.01|0.04|R|F|1993-03-15|1993-03-12|1993-03-24|TAKE BACK RETURN|SHIP|iers run according to the +49633|1971|4|6|27|50570.19|0.04|0.00|A|F|1993-05-13|1993-05-05|1993-05-15|COLLECT COD|REG AIR|uriously ironic, pending requests! +49634|1507|8|1|41|57748.50|0.04|0.08|R|F|1992-04-24|1992-06-15|1992-05-01|TAKE BACK RETURN|SHIP| foxes haggle. pending deposits after the +49634|371|56|2|18|22884.66|0.04|0.08|A|F|1992-05-01|1992-05-05|1992-05-11|TAKE BACK RETURN|FOB|riously. ev +49634|1869|70|3|1|1770.86|0.04|0.02|A|F|1992-07-01|1992-06-18|1992-07-08|DELIVER IN PERSON|RAIL|unusual pinto beans. slyly regular fox +49634|1980|13|4|49|92217.02|0.07|0.08|R|F|1992-04-12|1992-05-30|1992-05-01|DELIVER IN PERSON|REG AIR|latelets use fluffily quickly +49634|145|72|5|33|34489.62|0.08|0.03|A|F|1992-05-23|1992-06-18|1992-05-30|COLLECT COD|TRUCK|sits. slyly ironic frets acc +49634|803|3|6|9|15334.20|0.09|0.00|R|F|1992-07-03|1992-05-25|1992-07-22|NONE|RAIL|ut the special foxes wake +49634|1323|62|7|20|24486.40|0.08|0.06|R|F|1992-05-03|1992-06-17|1992-05-12|NONE|REG AIR| requests sleep ir +49635|660|54|1|19|29652.54|0.07|0.02|R|F|1993-04-24|1993-06-08|1993-04-27|NONE|TRUCK|ackages wake fu +49635|1728|71|2|20|32594.40|0.00|0.02|R|F|1993-05-24|1993-06-13|1993-06-16|COLLECT COD|REG AIR|inal deposits cajole quickly. furiously u +49635|851|18|3|41|71825.85|0.01|0.08|A|F|1993-06-10|1993-06-13|1993-06-21|NONE|MAIL|dependencies. slyly f +49636|1267|5|1|44|51403.44|0.09|0.06|A|F|1993-04-21|1993-03-14|1993-04-22|TAKE BACK RETURN|SHIP|ffix along the furiously final deposits? fl +49636|647|79|2|16|24762.24|0.05|0.08|A|F|1993-02-11|1993-02-05|1993-02-13|NONE|REG AIR|y express ideas. b +49636|1215|27|3|35|39067.35|0.05|0.08|A|F|1993-04-04|1993-01-27|1993-04-08|NONE|REG AIR|gainst the quickly pend +49636|947|50|4|49|90549.06|0.10|0.01|R|F|1993-01-20|1993-03-06|1993-02-11|COLLECT COD|TRUCK|nusual accounts +49636|1833|34|5|21|36431.43|0.02|0.00|A|F|1993-03-23|1993-03-04|1993-04-12|TAKE BACK RETURN|TRUCK| across the final instruction +49637|218|73|1|37|41373.77|0.06|0.02|R|F|1992-07-12|1992-09-10|1992-07-23|COLLECT COD|REG AIR|fully final accounts engage f +49638|889|23|1|13|23268.44|0.05|0.04|R|F|1993-09-12|1993-11-05|1993-09-28|COLLECT COD|AIR|s haggle furiously about the blit +49638|1668|51|2|48|75343.68|0.01|0.05|R|F|1993-08-20|1993-10-24|1993-08-24|NONE|FOB|y silent foxes. carefully quiet theo +49638|1981|14|3|5|9414.90|0.01|0.00|R|F|1993-12-06|1993-09-15|1993-12-16|DELIVER IN PERSON|FOB|e quickly reg +49638|303|4|4|28|33692.40|0.10|0.08|A|F|1993-08-15|1993-09-14|1993-08-28|TAKE BACK RETURN|REG AIR|es along the slyly pending pa +49638|1711|54|5|33|53219.43|0.08|0.08|R|F|1993-08-19|1993-09-12|1993-08-20|TAKE BACK RETURN|RAIL|uffy theodolites. carefully pending de +49638|821|88|6|11|18940.02|0.07|0.04|A|F|1993-08-26|1993-10-22|1993-09-08|NONE|SHIP|ts doze sl +49638|1275|87|7|43|50579.61|0.09|0.01|A|F|1993-09-09|1993-11-03|1993-09-20|COLLECT COD|MAIL|lar requests along the slyly regular theodo +49639|413|1|1|28|36775.48|0.01|0.04|R|F|1994-02-13|1994-01-03|1994-02-26|TAKE BACK RETURN|REG AIR|ress deposits haggle final courts. ru +49639|412|71|2|2|2624.82|0.10|0.08|R|F|1993-12-25|1993-11-30|1994-01-10|DELIVER IN PERSON|REG AIR|gainst the final theodolites. regular depen +49639|290|91|3|7|8332.03|0.06|0.02|R|F|1993-10-27|1993-11-30|1993-11-06|TAKE BACK RETURN|REG AIR| regular exc +49664|495|83|1|38|53028.62|0.07|0.04|A|F|1994-05-18|1994-06-15|1994-05-28|COLLECT COD|TRUCK|long the regular theodoli +49664|1327|66|2|19|23338.08|0.02|0.07|R|F|1994-05-04|1994-04-20|1994-05-09|TAKE BACK RETURN|RAIL|en theodolites detect express packa +49664|799|96|3|17|28896.43|0.03|0.01|A|F|1994-07-10|1994-06-13|1994-07-11|NONE|FOB|to beans. quickly regular accounts lose +49664|422|10|4|7|9256.94|0.02|0.06|A|F|1994-07-10|1994-06-17|1994-08-05|NONE|AIR|ost slyly about the s +49664|1460|61|5|15|20421.90|0.07|0.06|R|F|1994-06-06|1994-06-02|1994-06-22|DELIVER IN PERSON|FOB|es wake ex +49664|327|28|6|17|20864.44|0.00|0.06|R|F|1994-05-12|1994-05-27|1994-05-27|COLLECT COD|MAIL|sits thrash blithely bold d +49664|883|84|7|15|26758.20|0.09|0.07|R|F|1994-04-07|1994-05-22|1994-05-02|NONE|SHIP|y regular deposits. even account +49665|1851|95|1|28|49079.80|0.10|0.03|N|O|1996-04-10|1996-04-25|1996-04-17|DELIVER IN PERSON|MAIL|e furiously. unusual, idle accounts eat c +49665|821|88|2|42|72316.44|0.07|0.06|N|O|1996-06-12|1996-05-13|1996-06-23|NONE|SHIP|y along the regularl +49665|1845|46|3|14|24455.76|0.01|0.05|N|O|1996-05-06|1996-05-11|1996-05-29|NONE|TRUCK|ld courts. fluffily +49665|1251|52|4|1|1152.25|0.06|0.08|N|O|1996-05-29|1996-06-17|1996-06-04|TAKE BACK RETURN|FOB|xcuses? pinto beans +49665|427|15|5|9|11946.78|0.02|0.05|N|O|1996-07-08|1996-06-04|1996-08-01|TAKE BACK RETURN|TRUCK|packages breach slyly along +49665|806|6|6|1|1706.80|0.09|0.05|N|O|1996-04-08|1996-06-01|1996-04-16|NONE|SHIP|ckly regular deposits affix quickly abou +49665|1872|73|7|34|60311.58|0.00|0.03|N|O|1996-04-07|1996-05-01|1996-05-01|TAKE BACK RETURN|FOB|ully ironic requests boost after the +49666|89|15|1|26|25716.08|0.01|0.02|A|F|1994-10-07|1994-10-04|1994-10-12|NONE|FOB|ounts haggle furiously c +49666|193|20|2|40|43727.60|0.07|0.07|R|F|1994-10-10|1994-10-28|1994-11-02|TAKE BACK RETURN|FOB| cajole bli +49666|635|67|3|28|42997.64|0.01|0.02|A|F|1994-09-08|1994-10-11|1994-10-01|TAKE BACK RETURN|MAIL|es cajole carefully against the ironic +49666|1491|70|4|25|34812.25|0.04|0.08|R|F|1994-09-18|1994-10-25|1994-10-04|TAKE BACK RETURN|TRUCK| alongside of the ironic pinto bea +49667|1923|12|1|20|36498.40|0.03|0.08|N|O|1996-08-15|1996-09-09|1996-09-05|NONE|TRUCK|hockey players play. ruthlessly +49667|1583|4|2|30|44537.40|0.04|0.08|N|O|1996-08-18|1996-10-20|1996-08-29|DELIVER IN PERSON|TRUCK| quickly final asymptotes. specia +49667|1700|83|3|33|52856.10|0.02|0.03|N|O|1996-08-11|1996-10-11|1996-08-19|TAKE BACK RETURN|TRUCK|nt carefully +49667|546|77|4|50|72327.00|0.10|0.08|N|O|1996-08-26|1996-09-23|1996-09-20|TAKE BACK RETURN|AIR|endencies. furiously bold notornis affix +49667|848|49|5|9|15739.56|0.05|0.00|N|O|1996-09-04|1996-10-10|1996-09-26|COLLECT COD|TRUCK|quests cajole about the f +49667|847|14|6|26|45443.84|0.01|0.05|N|O|1996-11-17|1996-09-15|1996-11-29|NONE|TRUCK|d packages. fl +49668|1671|95|1|21|33026.07|0.01|0.06|R|F|1995-03-10|1995-02-16|1995-03-12|DELIVER IN PERSON|FOB|unts. quickly express requests are regul +49669|1084|85|1|1|985.08|0.00|0.02|N|O|1998-08-16|1998-07-22|1998-09-12|DELIVER IN PERSON|TRUCK|d the slyly ironic packa +49669|1356|33|2|30|37720.50|0.01|0.07|N|O|1998-06-22|1998-08-29|1998-06-28|COLLECT COD|AIR|e dogged accounts use slyly +49669|489|48|3|45|62526.60|0.08|0.01|N|O|1998-09-23|1998-08-02|1998-10-04|COLLECT COD|RAIL|ously blithe waters. +49669|1318|95|4|46|56088.26|0.03|0.07|N|O|1998-09-21|1998-07-13|1998-09-24|NONE|RAIL|efully silent excuses. slyly unusual +49670|1759|86|1|31|51483.25|0.08|0.07|N|O|1997-03-13|1997-05-08|1997-03-30|DELIVER IN PERSON|FOB| ironic orbits. express accounts wake. fu +49670|1161|62|2|42|44610.72|0.00|0.05|N|O|1997-04-16|1997-04-04|1997-05-13|DELIVER IN PERSON|REG AIR|l requests around +49670|1003|74|3|38|34352.00|0.01|0.03|N|O|1997-05-05|1997-05-27|1997-05-24|COLLECT COD|MAIL|inal deposits use regu +49670|320|21|4|7|8542.24|0.04|0.08|N|O|1997-03-16|1997-04-02|1997-03-22|DELIVER IN PERSON|RAIL|ng to the regular, i +49670|1750|77|5|2|3303.50|0.00|0.01|N|O|1997-06-25|1997-05-22|1997-07-05|TAKE BACK RETURN|RAIL|ackages after the slyly special +49670|521|52|6|4|5686.08|0.01|0.08|N|O|1997-03-13|1997-05-13|1997-04-03|TAKE BACK RETURN|TRUCK|riously silent requests unwind along +49671|1018|54|1|23|21137.23|0.04|0.03|N|O|1997-01-29|1997-01-09|1997-02-18|TAKE BACK RETURN|AIR|ending packages. fluffily +49671|1997|30|2|11|20888.89|0.06|0.06|N|O|1996-11-27|1997-01-08|1996-12-10|NONE|FOB| the carefu +49696|323|8|1|49|59942.68|0.04|0.04|N|O|1998-08-20|1998-06-28|1998-08-25|DELIVER IN PERSON|SHIP|ully slyly special requests. +49696|1564|65|2|29|42501.24|0.04|0.00|N|O|1998-05-08|1998-07-04|1998-05-25|DELIVER IN PERSON|AIR|counts wake furiously special instruc +49696|1100|71|3|49|49053.90|0.06|0.08|N|O|1998-07-30|1998-07-03|1998-08-25|TAKE BACK RETURN|TRUCK|latelets. blithely regular pinto beans +49696|1509|90|4|44|62062.00|0.02|0.06|N|O|1998-08-23|1998-07-11|1998-09-22|TAKE BACK RETURN|REG AIR|ach carefully. even deposits detect bold, f +49696|126|79|5|7|7182.84|0.02|0.00|N|O|1998-05-23|1998-08-01|1998-06-15|TAKE BACK RETURN|FOB|y about the express accounts. thinly +49696|970|5|6|23|43032.31|0.00|0.04|N|O|1998-05-24|1998-07-08|1998-06-16|COLLECT COD|RAIL|riously ironic, fin +49697|890|57|1|11|19699.79|0.05|0.04|N|O|1996-11-21|1997-01-19|1996-12-14|DELIVER IN PERSON|RAIL|egular, ironic f +49697|2000|45|2|36|32472.00|0.04|0.02|N|O|1997-01-26|1996-12-22|1997-02-15|DELIVER IN PERSON|MAIL|ly even theodolites. furi +49697|1097|98|3|37|36929.33|0.05|0.03|N|O|1997-02-27|1997-01-20|1997-03-21|COLLECT COD|TRUCK| silent deposits. even, unusual request +49697|378|63|4|29|37072.73|0.01|0.08|N|O|1996-11-13|1996-12-14|1996-11-14|COLLECT COD|SHIP|riously final warthogs. pending pinto +49698|1656|39|1|18|28037.70|0.09|0.01|N|O|1998-01-29|1998-01-30|1998-02-24|DELIVER IN PERSON|AIR|sly ironic sheaves. requests a +49698|1008|9|2|17|15453.00|0.03|0.07|N|O|1997-12-08|1997-12-29|1997-12-29|TAKE BACK RETURN|TRUCK|ing deposits hang slyly! quickl +49698|1790|33|3|47|79514.13|0.00|0.00|N|O|1997-12-25|1998-01-04|1998-01-11|NONE|FOB|zzle. furiously regular packages must h +49698|1744|45|4|34|55955.16|0.05|0.00|N|O|1998-02-27|1998-02-07|1998-03-19|TAKE BACK RETURN|FOB|ckages haggle blithely. furiously iron +49698|1445|63|5|44|59243.36|0.02|0.04|N|O|1997-12-02|1998-01-18|1997-12-18|NONE|AIR| blithely final requests nag +49699|1254|66|1|46|53141.50|0.04|0.08|N|O|1996-02-07|1996-03-04|1996-02-10|DELIVER IN PERSON|AIR|deposits wake +49699|1852|53|2|20|35077.00|0.07|0.01|N|O|1996-01-27|1996-02-23|1996-02-06|DELIVER IN PERSON|SHIP|ct. express pinto beans cajo +49699|1361|38|3|34|42920.24|0.03|0.03|N|O|1996-02-25|1996-02-16|1996-03-14|DELIVER IN PERSON|SHIP|ar frets cajole quickly express sau +49699|1229|4|4|29|32776.38|0.02|0.01|N|O|1996-04-30|1996-04-04|1996-05-04|DELIVER IN PERSON|REG AIR|ctions impres +49700|1269|81|1|11|12872.86|0.00|0.06|N|O|1996-08-06|1996-09-26|1996-09-01|NONE|MAIL|deas cajole requests. ev +49700|1829|30|2|30|51924.60|0.07|0.00|N|O|1996-11-13|1996-10-19|1996-11-27|COLLECT COD|TRUCK|s use past the slyly unusual +49700|942|45|3|21|38701.74|0.06|0.05|N|O|1996-10-17|1996-09-08|1996-10-31|COLLECT COD|MAIL|r instructions. special, bold +49700|1694|95|4|35|55849.15|0.03|0.01|N|O|1996-08-15|1996-09-29|1996-08-24|NONE|FOB|he final requests. final requests boo +49700|723|88|5|17|27603.24|0.09|0.04|N|O|1996-09-09|1996-09-20|1996-09-26|NONE|FOB|orbits. careful +49700|1622|23|6|7|10665.34|0.01|0.08|N|O|1996-11-25|1996-09-24|1996-12-13|TAKE BACK RETURN|RAIL| the dolphins sleep reg +49700|714|79|7|16|25835.36|0.02|0.07|N|O|1996-11-03|1996-10-03|1996-11-14|NONE|TRUCK|s snooze among the quickly regular pinto be +49701|1305|82|1|32|38601.60|0.10|0.06|N|O|1996-08-08|1996-08-13|1996-08-15|COLLECT COD|FOB|s. blithely regular packages a +49701|893|93|2|16|28702.24|0.00|0.07|N|O|1996-08-07|1996-06-19|1996-08-25|NONE|AIR| the bold plat +49702|1415|33|1|46|60554.86|0.10|0.00|N|O|1996-12-15|1997-01-13|1996-12-17|COLLECT COD|AIR| haggle furiously about the pending fo +49702|1655|38|2|4|6226.60|0.06|0.07|N|O|1997-02-20|1997-02-04|1997-03-01|COLLECT COD|RAIL|hs about the regular, pending accounts +49702|6|57|3|33|29898.00|0.08|0.06|N|O|1997-01-24|1996-12-17|1997-02-19|DELIVER IN PERSON|FOB|wake blithely regular deposits. caref +49702|212|40|4|48|53386.08|0.09|0.02|N|O|1997-03-08|1997-01-30|1997-03-15|COLLECT COD|SHIP|ly regular +49702|794|91|5|27|45759.33|0.04|0.05|N|O|1996-12-26|1997-01-12|1997-01-15|COLLECT COD|AIR|the slyly bold +49702|1113|22|6|32|32451.52|0.10|0.07|N|O|1997-03-03|1996-12-23|1997-03-30|DELIVER IN PERSON|REG AIR|final deposits. even, special se +49703|720|85|1|29|47000.88|0.00|0.04|N|O|1998-07-12|1998-06-20|1998-08-09|COLLECT COD|SHIP|ke express deposits. final packages +49703|723|24|2|18|29226.96|0.04|0.05|N|O|1998-08-10|1998-06-30|1998-08-31|COLLECT COD|TRUCK|ng to the carefully express +49703|1596|37|3|16|23961.44|0.03|0.00|N|O|1998-06-27|1998-08-01|1998-06-30|COLLECT COD|FOB|engage according to the asymptotes. +49703|1632|74|4|22|33739.86|0.09|0.06|N|O|1998-06-22|1998-08-01|1998-07-15|TAKE BACK RETURN|REG AIR|kly before the quickly ir +49703|1845|89|5|5|8734.20|0.08|0.08|N|O|1998-08-12|1998-06-20|1998-08-29|COLLECT COD|FOB|ily ironic +49728|1143|52|1|11|11485.54|0.05|0.02|N|O|1998-09-30|1998-07-27|1998-10-19|NONE|TRUCK| alongside of the theodolites wake car +49729|1508|89|1|21|29599.50|0.01|0.03|N|O|1996-03-06|1996-03-24|1996-03-21|COLLECT COD|REG AIR|ntegrate across the ironic courts: carefull +49730|1251|52|1|22|25349.50|0.09|0.07|R|F|1994-03-13|1994-02-08|1994-04-07|NONE|FOB|fully silent packages wake furio +49730|1931|76|2|3|5498.79|0.08|0.07|A|F|1994-02-21|1994-03-27|1994-02-25|DELIVER IN PERSON|MAIL|ffily around +49731|241|23|1|29|33095.96|0.09|0.00|R|F|1995-02-14|1994-12-18|1995-03-07|COLLECT COD|FOB|uickly final gifts. final pa +49731|882|16|2|5|8914.40|0.10|0.06|A|F|1994-11-06|1994-12-10|1994-11-07|NONE|MAIL|ts among the ironic somas haggle against th +49731|1511|52|3|10|14125.10|0.01|0.01|A|F|1995-02-14|1995-01-14|1995-03-07|NONE|FOB|ourts. carefully permanent +49731|1010|16|4|20|18220.20|0.08|0.06|R|F|1995-01-01|1995-01-11|1995-01-10|COLLECT COD|MAIL|; excuses sleep. furiously pe +49732|252|53|1|8|9218.00|0.03|0.01|R|F|1993-10-23|1993-12-12|1993-10-29|COLLECT COD|SHIP|e along the carefully +49732|1278|90|2|20|23585.40|0.09|0.03|A|F|1993-12-21|1993-11-21|1994-01-19|COLLECT COD|TRUCK|unusual, bold ideas abo +49732|1274|49|3|39|45835.53|0.01|0.05|R|F|1994-01-14|1993-12-16|1994-02-12|DELIVER IN PERSON|SHIP|nic asymptotes. ironi +49732|1898|99|4|27|48597.03|0.06|0.04|R|F|1993-09-26|1993-11-14|1993-10-24|TAKE BACK RETURN|REG AIR|quests use carefully evenly even a +49732|1371|86|5|22|27992.14|0.10|0.00|R|F|1993-11-16|1993-11-23|1993-11-22|TAKE BACK RETURN|AIR| foxes. even ideas use fur +49733|1835|22|1|26|45157.58|0.03|0.05|N|O|1997-04-17|1997-03-07|1997-05-13|COLLECT COD|MAIL| furiously regular instructio +49733|862|96|2|33|58174.38|0.08|0.06|N|O|1997-03-10|1997-02-12|1997-04-07|NONE|AIR|sleep alongside +49734|1031|37|1|7|6524.21|0.02|0.00|R|F|1995-05-04|1995-04-01|1995-05-24|COLLECT COD|REG AIR| furiously. instructions wak +49734|1254|66|2|41|47365.25|0.01|0.04|A|F|1995-01-31|1995-03-05|1995-02-12|NONE|RAIL|onic packages +49734|816|17|3|47|80690.07|0.05|0.02|R|F|1995-02-28|1995-03-08|1995-03-11|COLLECT COD|MAIL|posits nag across the fluffily even pack +49734|1108|45|4|17|17154.70|0.00|0.04|A|F|1995-02-15|1995-03-25|1995-03-03|NONE|TRUCK|escapades. finally ironic +49735|721|86|1|46|74599.12|0.06|0.03|R|F|1994-11-19|1994-11-09|1994-12-14|COLLECT COD|FOB|nto beans. carefully final r +49735|316|17|2|22|26758.82|0.08|0.03|A|F|1995-01-02|1994-12-06|1995-01-04|COLLECT COD|TRUCK|s after the furio +49735|969|4|3|8|14959.68|0.06|0.01|R|F|1994-12-12|1994-11-21|1995-01-02|DELIVER IN PERSON|RAIL|inal foxes accord +49735|311|40|4|24|29071.44|0.08|0.05|A|F|1994-10-08|1994-12-23|1994-10-20|TAKE BACK RETURN|TRUCK|deposits haggle against the accounts. +49735|1681|82|5|12|18992.16|0.09|0.01|A|F|1994-12-22|1994-11-17|1995-01-04|NONE|RAIL|arefully theodolites. unu +49735|1544|25|6|32|46257.28|0.01|0.01|A|F|1994-11-07|1994-12-05|1994-11-28|DELIVER IN PERSON|REG AIR|ully pending deposits wake sly +49760|400|85|1|34|44213.60|0.10|0.02|N|O|1995-12-25|1995-12-10|1996-01-08|NONE|FOB|ng to the even, careful foxes. close th +49760|1812|99|2|3|5141.43|0.01|0.07|N|O|1995-10-07|1995-11-25|1995-11-02|TAKE BACK RETURN|AIR|press instr +49760|897|97|3|6|10787.34|0.01|0.07|N|O|1996-01-23|1995-12-06|1996-02-17|DELIVER IN PERSON|TRUCK|inal instruc +49760|80|56|4|32|31362.56|0.07|0.02|N|O|1996-01-29|1995-12-15|1996-02-21|DELIVER IN PERSON|SHIP|unts haggle blithely. bold, regular ex +49760|1190|63|5|42|45829.98|0.07|0.06|N|O|1995-11-11|1995-12-27|1995-12-01|DELIVER IN PERSON|AIR|ecial requests are blithely a +49761|541|72|1|28|40363.12|0.00|0.04|A|F|1995-03-22|1995-03-19|1995-03-30|COLLECT COD|FOB|r, regular ideas. carefully +49761|1230|42|2|30|33936.90|0.08|0.07|A|F|1995-04-02|1995-03-07|1995-04-07|DELIVER IN PERSON|TRUCK|kly regular excuses. packages run fluf +49761|380|81|3|42|53775.96|0.01|0.06|A|F|1995-03-09|1995-04-24|1995-03-16|TAKE BACK RETURN|AIR|ckly pending requests +49761|1807|94|4|45|76896.00|0.09|0.02|R|F|1995-03-23|1995-03-28|1995-04-12|NONE|TRUCK| requests haggle even +49761|988|91|5|5|9444.90|0.06|0.04|R|F|1995-02-05|1995-04-04|1995-02-16|TAKE BACK RETURN|RAIL|longside of the deposits. +49761|1016|22|6|42|38514.42|0.00|0.04|A|F|1995-04-30|1995-02-24|1995-05-24|NONE|RAIL|low accounts inte +49761|1737|22|7|36|58994.28|0.05|0.04|R|F|1995-04-11|1995-03-05|1995-04-19|DELIVER IN PERSON|MAIL| deposits wake furiously. sly +49762|652|15|1|16|24842.40|0.05|0.06|N|O|1995-07-07|1995-08-13|1995-07-10|COLLECT COD|FOB|ns affix bli +49762|1256|57|2|6|6943.50|0.07|0.05|N|O|1995-09-25|1995-08-13|1995-10-25|DELIVER IN PERSON|FOB|s wake outside the ironic +49762|1105|42|3|18|18109.80|0.09|0.07|N|O|1995-09-26|1995-08-25|1995-10-04|COLLECT COD|FOB|ully around the +49763|662|63|1|50|78133.00|0.03|0.00|A|F|1995-05-26|1995-03-22|1995-05-27|COLLECT COD|SHIP|ornis. blith +49763|1782|83|2|6|10102.68|0.05|0.03|R|F|1995-03-06|1995-05-07|1995-03-07|NONE|SHIP|ate blithely after the blithel +49763|1441|42|3|40|53697.60|0.08|0.00|A|F|1995-05-28|1995-04-14|1995-06-15|COLLECT COD|AIR|ss the boldly unusual acco +49763|411|70|4|21|27539.61|0.00|0.05|R|F|1995-05-05|1995-03-27|1995-05-29|COLLECT COD|SHIP|kages. ironic pinto beans haggle. bl +49764|1335|50|1|31|38326.23|0.01|0.00|A|F|1994-01-04|1993-11-27|1994-01-14|TAKE BACK RETURN|TRUCK|odolites hag +49764|1561|62|2|39|57039.84|0.01|0.00|R|F|1993-12-24|1993-12-17|1993-12-29|NONE|MAIL|ges use. special, regula +49765|350|35|1|34|42511.90|0.07|0.04|R|F|1994-02-04|1993-11-30|1994-02-09|NONE|SHIP|t patterns haggle fluffily. +49765|1478|79|2|38|52419.86|0.10|0.01|A|F|1993-10-09|1994-01-04|1993-10-30|TAKE BACK RETURN|SHIP|theodolites? express dependencies e +49765|139|40|3|5|5195.65|0.07|0.04|R|F|1993-12-14|1993-12-18|1993-12-18|COLLECT COD|AIR|ously. special, regular package +49765|1010|81|4|2|1822.02|0.07|0.02|A|F|1993-10-30|1993-11-11|1993-11-13|NONE|RAIL| special courts among the special acco +49765|1379|56|5|15|19205.55|0.05|0.02|R|F|1993-11-30|1993-11-13|1993-12-04|DELIVER IN PERSON|TRUCK|ons boost quickly regular, regular platelet +49765|1499|17|6|5|7002.45|0.09|0.02|R|F|1993-10-24|1993-11-22|1993-11-12|TAKE BACK RETURN|REG AIR|al packages print. +49765|1370|9|7|6|7628.22|0.04|0.03|R|F|1993-10-24|1993-12-11|1993-11-02|DELIVER IN PERSON|REG AIR|ong the sometimes ir +49766|1572|53|1|2|2947.14|0.00|0.07|N|O|1996-03-01|1996-04-13|1996-03-25|DELIVER IN PERSON|FOB|areful requests. fluffily e +49766|850|51|2|2|3501.70|0.09|0.06|N|O|1996-05-09|1996-03-19|1996-05-27|NONE|TRUCK|the furiously regular i +49766|298|99|3|22|26362.38|0.03|0.01|N|O|1996-02-18|1996-03-04|1996-03-15|TAKE BACK RETURN|FOB|aggle slyly. even, final d +49767|1082|83|1|13|12780.04|0.06|0.03|A|F|1993-12-31|1993-12-20|1994-01-19|NONE|REG AIR|furiously express dependencies cajol +49767|1155|56|2|34|35909.10|0.10|0.06|R|F|1993-12-02|1994-01-12|1993-12-30|NONE|REG AIR|ly regular request +49767|893|93|3|39|69961.71|0.08|0.03|A|F|1993-11-14|1993-12-17|1993-12-01|NONE|FOB|y ironic dependencies wake against t +49767|434|93|4|19|25354.17|0.01|0.07|A|F|1994-01-20|1993-12-27|1994-01-28|COLLECT COD|REG AIR|y regular accounts haggl +49767|1612|54|5|2|3027.22|0.01|0.07|R|F|1993-11-10|1993-12-26|1993-11-26|COLLECT COD|SHIP|ross the fluffily pending packages nag +49767|156|9|6|10|10561.50|0.09|0.08|R|F|1994-02-02|1993-12-19|1994-02-08|DELIVER IN PERSON|REG AIR|ly against the carefully even packages. +49767|1677|1|7|9|14208.03|0.01|0.06|R|F|1994-01-05|1993-12-15|1994-02-02|NONE|RAIL|fily after the req +49792|1430|48|1|38|50594.34|0.08|0.06|N|O|1997-11-30|1997-12-01|1997-12-14|DELIVER IN PERSON|RAIL|ag according to the slyly dogged packages +49793|1743|28|1|15|24671.10|0.09|0.00|A|F|1994-06-11|1994-04-16|1994-06-30|COLLECT COD|AIR|nwind furiously. fluffily final accou +49794|435|23|1|4|5341.72|0.01|0.00|N|O|1995-11-30|1995-11-05|1995-12-21|COLLECT COD|MAIL|y slyly silent not +49794|780|13|2|13|21850.14|0.06|0.01|N|O|1995-11-05|1995-10-17|1995-11-19|COLLECT COD|MAIL|. blithely f +49795|551|12|1|7|10160.85|0.08|0.05|N|O|1998-06-23|1998-07-05|1998-07-08|TAKE BACK RETURN|MAIL|s thrash blithely evenly regular i +49795|689|21|2|24|38152.32|0.04|0.02|N|O|1998-04-10|1998-06-23|1998-04-28|TAKE BACK RETURN|SHIP|latelets sleep furiou +49795|417|76|3|29|38204.89|0.03|0.00|N|O|1998-04-25|1998-05-16|1998-04-29|COLLECT COD|REG AIR|es boost bl +49796|47|48|1|43|40722.72|0.07|0.07|N|O|1998-02-19|1998-04-28|1998-02-28|TAKE BACK RETURN|SHIP|uctions? car +49797|419|7|1|13|17152.33|0.03|0.01|N|O|1995-06-22|1995-04-10|1995-07-10|COLLECT COD|TRUCK|slyly regular theodolites. s +49797|1225|100|2|9|10135.98|0.10|0.01|A|F|1995-06-01|1995-04-20|1995-06-03|COLLECT COD|MAIL|ests. slowly id +49797|825|26|3|22|37968.04|0.08|0.03|A|F|1995-04-26|1995-04-09|1995-05-13|DELIVER IN PERSON|RAIL|lar notornis detect qu +49797|1535|16|4|20|28730.60|0.08|0.00|R|F|1995-05-11|1995-04-30|1995-05-20|DELIVER IN PERSON|RAIL|platelets sublate carefully: unusual d +49797|602|34|5|16|24041.60|0.02|0.05|N|O|1995-06-30|1995-05-30|1995-07-05|NONE|MAIL|s along the furiously final pack +49798|776|41|1|22|36888.94|0.06|0.05|A|F|1993-04-07|1993-02-18|1993-04-15|NONE|REG AIR|o beans. silent +49798|260|61|2|9|10442.34|0.00|0.06|A|F|1993-03-29|1993-01-10|1993-04-12|TAKE BACK RETURN|TRUCK|furiously bold i +49798|1696|38|3|30|47930.70|0.04|0.01|A|F|1993-03-23|1993-03-04|1993-04-18|COLLECT COD|RAIL| regular, unusual requests boo +49798|627|28|4|21|32080.02|0.03|0.03|A|F|1993-03-11|1993-01-17|1993-04-09|COLLECT COD|MAIL|ully. slyly final depend +49798|1885|29|5|35|62540.80|0.05|0.01|A|F|1993-03-20|1993-02-15|1993-03-24|TAKE BACK RETURN|AIR|ckly even platelets against +49798|1808|9|6|13|22227.40|0.01|0.00|A|F|1993-02-05|1993-01-31|1993-02-07|NONE|RAIL|. furiously regular packages sublat +49799|1322|37|1|31|37922.92|0.00|0.02|R|F|1994-09-02|1994-10-11|1994-09-17|DELIVER IN PERSON|SHIP|ts detect st +49799|1777|20|2|14|23502.78|0.05|0.07|A|F|1994-10-12|1994-11-08|1994-11-09|COLLECT COD|SHIP|ggle around the packages. furiously +49799|1879|80|3|35|62330.45|0.09|0.08|A|F|1994-11-03|1994-11-19|1994-11-25|DELIVER IN PERSON|MAIL|xcuses use along the regular deposits. r +49799|471|30|4|42|57601.74|0.02|0.04|R|F|1994-11-25|1994-10-28|1994-12-12|COLLECT COD|AIR|ly final pearls agains +49799|1743|86|5|31|50986.94|0.02|0.00|A|F|1994-10-17|1994-09-25|1994-10-28|COLLECT COD|RAIL|slyly alongside of the +49799|1602|3|6|49|73676.40|0.04|0.04|R|F|1994-09-28|1994-10-18|1994-10-21|COLLECT COD|RAIL|y ironic packages grow slyly +49824|1791|92|1|6|10156.74|0.02|0.04|A|F|1995-04-29|1995-05-08|1995-05-21|COLLECT COD|RAIL|telets. quickly +49824|1514|95|2|1|1415.51|0.03|0.04|R|F|1995-04-21|1995-05-29|1995-05-05|TAKE BACK RETURN|RAIL|usual excuses boost idly pending packa +49824|1584|5|3|50|74279.00|0.10|0.01|A|F|1995-04-25|1995-06-04|1995-05-08|NONE|REG AIR|regular theodolites. +49824|1052|58|4|46|43840.30|0.01|0.00|N|F|1995-06-15|1995-04-28|1995-07-03|NONE|FOB|tions after the slyly regular foxes are +49825|904|73|1|20|36098.00|0.03|0.03|A|F|1994-02-17|1994-03-11|1994-03-16|COLLECT COD|SHIP|ly special accounts wake about the +49826|405|6|1|39|50910.60|0.06|0.00|N|O|1996-10-15|1996-10-19|1996-11-06|DELIVER IN PERSON|RAIL|silent forges use stealthily ironic d +49826|1733|60|2|43|70293.39|0.00|0.08|N|O|1996-11-04|1996-10-07|1996-11-15|DELIVER IN PERSON|REG AIR|ar instructions. slyly bold packages nag +49826|590|21|3|3|4471.77|0.04|0.03|N|O|1996-09-22|1996-10-11|1996-10-07|DELIVER IN PERSON|RAIL|regular pac +49826|1173|10|4|28|30076.76|0.00|0.08|N|O|1996-09-13|1996-10-12|1996-10-11|TAKE BACK RETURN|REG AIR|egular excuses +49827|1930|75|1|26|47630.18|0.04|0.02|A|F|1992-09-29|1992-10-11|1992-10-17|COLLECT COD|AIR|elets haggle across the regular accou +49827|1214|15|2|17|18958.57|0.09|0.07|R|F|1992-11-18|1992-10-22|1992-11-23|TAKE BACK RETURN|RAIL|sts are carefully? quickly i +49828|56|82|1|10|9560.50|0.06|0.08|N|O|1995-12-26|1995-11-20|1996-01-05|DELIVER IN PERSON|MAIL|final requests cajole +49828|1573|54|2|18|26542.26|0.00|0.01|N|O|1995-12-17|1995-10-03|1995-12-20|DELIVER IN PERSON|AIR|ns. quickly ironic id +49828|1757|58|3|21|34833.75|0.10|0.08|N|O|1995-12-13|1995-10-05|1995-12-22|DELIVER IN PERSON|RAIL|refully among the care +49828|117|96|4|7|7119.77|0.09|0.01|N|O|1995-09-24|1995-11-14|1995-10-19|COLLECT COD|FOB|l platelets hinder regula +49828|1749|34|5|21|34665.54|0.10|0.06|N|O|1995-09-05|1995-10-04|1995-09-06|DELIVER IN PERSON|FOB|s nag furiously final requests- +49829|887|88|1|17|30393.96|0.02|0.07|N|O|1996-12-07|1997-01-14|1996-12-18|NONE|FOB|lar deposits alongside of the qu +49829|160|39|2|41|43466.56|0.07|0.01|N|O|1997-02-27|1997-01-30|1997-03-20|NONE|AIR|ests-- ruthlessly unusual theodoli +49829|1784|27|3|40|67431.20|0.08|0.03|N|O|1997-03-24|1996-12-29|1997-03-30|NONE|AIR|ncies sleep express asymptot +49829|1982|83|4|11|20723.78|0.10|0.04|N|O|1997-03-25|1997-02-18|1997-03-31|DELIVER IN PERSON|MAIL|ress multipliers are blithely at th +49830|1759|44|1|15|24911.25|0.06|0.00|A|F|1994-10-17|1994-09-04|1994-10-30|DELIVER IN PERSON|TRUCK|furiously final pinto beans. quic +49830|834|1|2|45|78067.35|0.05|0.00|A|F|1994-07-27|1994-08-28|1994-08-03|NONE|FOB|ross the fina +49830|426|56|3|39|51730.38|0.09|0.03|R|F|1994-11-02|1994-09-05|1994-11-19|COLLECT COD|TRUCK|al instructions. furiously pending +49830|1674|57|4|25|39391.75|0.02|0.04|A|F|1994-09-08|1994-08-30|1994-09-20|COLLECT COD|REG AIR| carefully bold, +49830|1911|100|5|7|12690.37|0.09|0.05|R|F|1994-08-23|1994-09-20|1994-09-21|NONE|SHIP|ss the quickly ironic requests +49831|1174|47|1|37|39781.29|0.06|0.02|R|F|1993-11-20|1993-11-02|1993-11-23|COLLECT COD|REG AIR|ly special r +49831|54|80|2|32|30529.60|0.01|0.00|A|F|1993-11-11|1993-10-20|1993-11-20|COLLECT COD|MAIL|ideas. carefully unusual pin +49831|708|5|3|13|20913.10|0.10|0.01|R|F|1993-09-27|1993-10-12|1993-10-09|COLLECT COD|RAIL|breach fluffily ac +49856|1631|32|1|48|73566.24|0.10|0.04|N|O|1998-07-19|1998-07-29|1998-08-10|NONE|MAIL|. furiously unusual +49857|358|59|1|29|36492.15|0.09|0.04|N|O|1997-03-29|1997-04-24|1997-04-05|NONE|FOB| slyly final pac +49857|963|98|2|33|61510.68|0.01|0.08|N|O|1997-04-05|1997-04-16|1997-04-08|TAKE BACK RETURN|AIR|s. silent instructions among +49857|277|78|3|27|31786.29|0.00|0.08|N|O|1997-05-23|1997-05-21|1997-06-19|DELIVER IN PERSON|RAIL|le quickly alongs +49857|1008|14|4|32|29088.00|0.06|0.02|N|O|1997-03-10|1997-04-18|1997-03-25|DELIVER IN PERSON|RAIL|ronically according to the +49858|1668|10|1|42|65925.72|0.01|0.02|R|F|1993-08-20|1993-07-12|1993-09-13|NONE|AIR|otes. accounts alongside +49858|866|66|2|43|75974.98|0.02|0.05|R|F|1993-08-13|1993-06-19|1993-09-06|TAKE BACK RETURN|TRUCK|lets sleep. requests +49858|489|19|3|17|23621.16|0.00|0.07|R|F|1993-06-12|1993-07-16|1993-07-06|COLLECT COD|TRUCK|out the qui +49859|1040|11|1|49|46110.96|0.02|0.01|N|O|1996-07-12|1996-06-15|1996-07-27|TAKE BACK RETURN|FOB|inal deposits affix fluffily. +49859|1045|16|2|5|4730.20|0.01|0.07|N|O|1996-05-05|1996-07-21|1996-05-23|COLLECT COD|FOB|y even accounts? ruthl +49859|1336|37|3|49|60629.17|0.09|0.01|N|O|1996-08-26|1996-07-31|1996-08-31|NONE|TRUCK| foxes sleep carefully. +49859|414|73|4|28|36803.48|0.03|0.08|N|O|1996-06-04|1996-06-11|1996-06-29|TAKE BACK RETURN|SHIP| deposits c +49859|1963|8|5|13|24244.48|0.05|0.00|N|O|1996-08-28|1996-06-22|1996-08-30|DELIVER IN PERSON|MAIL| final deposi +49859|1508|49|6|49|69065.50|0.01|0.05|N|O|1996-08-10|1996-06-23|1996-08-17|COLLECT COD|TRUCK| furiously bold deposits sleep +49860|816|16|1|32|54937.92|0.07|0.02|N|O|1996-10-10|1996-09-05|1996-10-20|DELIVER IN PERSON|SHIP|ld instructions. furiousl +49860|1448|66|2|47|63423.68|0.04|0.04|N|O|1996-06-25|1996-08-27|1996-06-27|TAKE BACK RETURN|FOB|thely ironic packages. pending, even depos +49860|701|2|3|14|22423.80|0.01|0.07|N|O|1996-09-01|1996-08-05|1996-09-29|NONE|FOB|ckly regular instructions sl +49860|1301|78|4|4|4809.20|0.07|0.06|N|O|1996-08-25|1996-08-07|1996-09-14|NONE|REG AIR|foxes alongside of +49860|1300|38|5|23|27629.90|0.09|0.04|N|O|1996-09-26|1996-08-09|1996-10-16|COLLECT COD|MAIL|ts. instructions are blithely blithely s +49860|530|21|6|2|2861.06|0.10|0.00|N|O|1996-06-30|1996-08-21|1996-07-01|COLLECT COD|AIR| ideas according to the final account +49861|1184|85|1|43|46662.74|0.00|0.03|A|F|1994-09-19|1994-08-17|1994-10-17|DELIVER IN PERSON|TRUCK|aggle. blithely regular pa +49861|1309|10|2|48|58094.40|0.02|0.07|R|F|1994-07-09|1994-08-07|1994-07-28|COLLECT COD|SHIP|y express ac +49861|69|45|3|36|34886.16|0.10|0.01|A|F|1994-07-31|1994-08-20|1994-08-19|NONE|AIR|efully furio +49861|12|63|4|26|23712.26|0.01|0.00|R|F|1994-09-30|1994-09-05|1994-10-04|NONE|TRUCK|ess ideas haggle. express packages nag agai +49861|128|81|5|44|45237.28|0.07|0.03|A|F|1994-10-07|1994-08-28|1994-10-08|NONE|AIR|ly special accounts. requests sleep am +49861|594|85|6|14|20924.26|0.08|0.05|A|F|1994-09-28|1994-09-08|1994-10-26|TAKE BACK RETURN|TRUCK|its ought to are furiously. quickly pendi +49861|997|66|7|38|72123.62|0.03|0.07|R|F|1994-08-24|1994-07-19|1994-09-10|NONE|MAIL| beans eat quickly about +49862|584|85|1|9|13361.22|0.01|0.01|A|F|1992-10-03|1992-12-12|1992-10-24|DELIVER IN PERSON|FOB| bold realms. busily un +49862|802|2|2|7|11919.60|0.06|0.04|R|F|1992-10-18|1992-10-23|1992-10-29|NONE|MAIL|tions. slyly re +49862|195|48|3|10|10951.90|0.07|0.03|A|F|1992-09-27|1992-11-06|1992-10-01|COLLECT COD|AIR|r asymptotes cajole fur +49862|1206|44|4|4|4428.80|0.04|0.00|R|F|1992-11-20|1992-10-28|1992-12-05|DELIVER IN PERSON|MAIL|! regular pi +49862|1211|49|5|46|51161.66|0.02|0.01|A|F|1992-09-26|1992-10-20|1992-09-27|COLLECT COD|REG AIR|ial accounts nag among the flu +49863|1887|74|1|25|44722.00|0.10|0.00|N|O|1996-09-30|1996-07-09|1996-10-19|COLLECT COD|SHIP|alongside of the fluffily regular dept +49863|121|100|2|44|44929.28|0.09|0.04|N|O|1996-07-03|1996-08-23|1996-07-31|NONE|REG AIR|doze unusual plat +49863|1274|86|3|41|48186.07|0.04|0.00|N|O|1996-08-16|1996-08-09|1996-09-01|COLLECT COD|TRUCK|x slyly furiously spe +49863|1131|40|4|11|11353.43|0.02|0.01|N|O|1996-06-23|1996-08-14|1996-07-05|TAKE BACK RETURN|TRUCK|s detect furiously slyly regu +49863|817|18|5|25|42945.25|0.05|0.07|N|O|1996-07-02|1996-09-03|1996-07-30|DELIVER IN PERSON|RAIL|furiously even asymptotes +49863|790|87|6|37|62559.23|0.08|0.06|N|O|1996-06-17|1996-07-24|1996-06-27|DELIVER IN PERSON|TRUCK|s promise according to the c +49888|634|28|1|30|46038.90|0.08|0.02|N|O|1998-05-20|1998-03-17|1998-05-27|COLLECT COD|RAIL|. carefully regular dependencies use? s +49888|221|22|2|17|19060.74|0.09|0.02|N|O|1998-02-20|1998-03-12|1998-03-05|DELIVER IN PERSON|FOB|gular hockey pla +49889|1761|46|1|38|63184.88|0.01|0.08|A|F|1992-12-15|1993-01-13|1993-01-02|COLLECT COD|REG AIR|ng theodolites. furiously bo +49889|75|1|2|23|22426.61|0.09|0.04|A|F|1992-12-21|1993-02-03|1993-01-13|COLLECT COD|AIR| pending req +49889|537|68|3|31|44563.43|0.09|0.01|A|F|1993-01-05|1993-02-28|1993-01-29|NONE|RAIL|. final asymptotes us +49890|1786|29|1|25|42194.50|0.04|0.07|A|F|1992-05-25|1992-06-26|1992-06-09|COLLECT COD|AIR|uickly pending packa +49890|1580|61|2|22|32594.76|0.10|0.08|R|F|1992-07-30|1992-06-25|1992-08-07|COLLECT COD|SHIP| across the final requests. furious +49890|1152|61|3|23|24222.45|0.04|0.01|A|F|1992-07-10|1992-05-19|1992-08-01|TAKE BACK RETURN|AIR|to the enticing platelets. quic +49891|1270|71|1|2|2342.54|0.09|0.00|R|F|1994-10-04|1994-11-01|1994-10-21|COLLECT COD|TRUCK|ly bold asymptotes. bli +49891|1464|43|2|22|30040.12|0.09|0.06|R|F|1994-09-17|1994-10-26|1994-10-15|NONE|RAIL|lyly special foxes +49891|926|27|3|40|73076.80|0.03|0.01|R|F|1994-09-18|1994-11-15|1994-10-18|DELIVER IN PERSON|REG AIR| against the furiously r +49891|1828|72|4|19|32866.58|0.04|0.01|A|F|1994-10-21|1994-11-21|1994-11-13|COLLECT COD|SHIP| slyly regular, pending +49891|1280|92|5|43|50795.04|0.02|0.03|R|F|1994-12-28|1994-10-31|1995-01-25|NONE|TRUCK|e furiously even accounts. furio +49891|961|62|6|37|68892.52|0.08|0.05|R|F|1995-01-04|1994-11-08|1995-01-20|COLLECT COD|AIR|egular requests are furiously above the sly +49892|1534|15|1|49|70340.97|0.04|0.01|A|F|1995-03-06|1995-03-22|1995-03-25|NONE|MAIL|jole unusual instructi +49893|472|60|1|46|63133.62|0.09|0.04|N|O|1997-04-22|1997-03-14|1997-05-11|COLLECT COD|MAIL|uses wake according to the quickly regular +49894|841|75|1|25|43546.00|0.03|0.00|N|O|1997-07-20|1997-06-16|1997-08-05|NONE|RAIL|packages boost blithely silent r +49894|1271|46|2|29|33995.83|0.04|0.02|N|O|1997-07-31|1997-06-11|1997-08-08|TAKE BACK RETURN|AIR|ly regular fo +49894|286|41|3|4|4745.12|0.08|0.08|N|O|1997-08-27|1997-08-07|1997-09-21|COLLECT COD|TRUCK|uctions among the pinto beans +49894|1887|17|4|41|73344.08|0.01|0.07|N|O|1997-06-26|1997-06-15|1997-07-18|COLLECT COD|RAIL|ts haggle bravely alongside of the package +49894|982|85|5|50|94149.00|0.10|0.06|N|O|1997-06-15|1997-06-23|1997-06-29|COLLECT COD|MAIL|regular ideas wake regul +49894|922|23|6|28|51041.76|0.09|0.07|N|O|1997-06-28|1997-07-23|1997-07-05|COLLECT COD|RAIL|uests nag alongside of the furiously fi +49895|1520|21|1|4|5686.08|0.07|0.03|R|F|1994-01-11|1993-12-15|1994-01-22|DELIVER IN PERSON|FOB|sly regular +49920|342|99|1|29|36027.86|0.01|0.02|N|O|1996-03-23|1996-05-12|1996-04-01|DELIVER IN PERSON|TRUCK|the quickly special req +49920|1499|78|2|2|2800.98|0.07|0.06|N|O|1996-04-19|1996-04-17|1996-04-23|COLLECT COD|MAIL|the blithely special packages; slyly fina +49920|1441|59|3|3|4027.32|0.05|0.02|N|O|1996-04-27|1996-04-09|1996-05-16|DELIVER IN PERSON|TRUCK|gularly. instruction +49920|1295|33|4|10|11962.90|0.08|0.05|N|O|1996-03-06|1996-05-11|1996-03-20|NONE|FOB|fully final excuses are at +49920|1793|20|5|37|62707.23|0.06|0.02|N|O|1996-03-30|1996-04-01|1996-04-21|DELIVER IN PERSON|RAIL|e furiously about the packages. furiously f +49920|1922|67|6|12|21887.04|0.08|0.01|N|O|1996-03-07|1996-04-06|1996-04-04|NONE|RAIL|ses haggle quickly regular theodolites. q +49920|1302|79|7|50|60165.00|0.01|0.01|N|O|1996-05-05|1996-04-21|1996-05-08|TAKE BACK RETURN|AIR|efully furious requests +49921|771|68|1|42|70214.34|0.03|0.05|R|F|1995-02-28|1995-04-13|1995-03-15|NONE|RAIL|deposits. furiously r +49921|1755|40|2|44|72897.00|0.00|0.06|A|F|1995-03-28|1995-04-05|1995-04-07|TAKE BACK RETURN|AIR|olites haggle regular +49921|1788|89|3|32|54072.96|0.00|0.06|A|F|1995-05-20|1995-03-23|1995-06-15|COLLECT COD|REG AIR|hely ironic pinto beans sleep furiousl +49921|1799|42|4|14|23811.06|0.08|0.07|A|F|1995-04-12|1995-05-09|1995-05-05|COLLECT COD|RAIL|sits nag about the pinto beans. qu +49921|1465|66|5|42|57391.32|0.08|0.06|A|F|1995-03-03|1995-04-15|1995-03-07|NONE|RAIL| unusual foxes. unusual dep +49921|353|54|6|29|36347.15|0.05|0.05|A|F|1995-04-29|1995-04-05|1995-05-13|NONE|REG AIR|cies. stealthily regular pin +49921|932|67|7|1|1832.93|0.01|0.08|R|F|1995-04-29|1995-04-24|1995-05-08|DELIVER IN PERSON|AIR|p; quickly pending deposits among th +49922|1486|26|1|24|33299.52|0.06|0.04|A|F|1994-10-24|1994-10-06|1994-11-23|DELIVER IN PERSON|AIR|ly excuses. expre +49923|1008|9|1|12|10908.00|0.04|0.05|A|F|1994-08-04|1994-06-23|1994-09-01|DELIVER IN PERSON|MAIL|r accounts +49923|137|90|2|30|31113.90|0.01|0.08|R|F|1994-07-08|1994-07-05|1994-08-07|TAKE BACK RETURN|REG AIR|decoys. bold deposits +49924|1399|100|1|42|54616.38|0.06|0.02|N|F|1995-06-04|1995-07-06|1995-06-19|TAKE BACK RETURN|RAIL|ully even requests +49924|663|64|2|12|18763.92|0.04|0.04|R|F|1995-05-30|1995-07-17|1995-06-08|DELIVER IN PERSON|RAIL|uctions. patterns can haggle idly do +49924|1229|41|3|21|23734.62|0.03|0.03|N|F|1995-06-11|1995-07-27|1995-07-10|TAKE BACK RETURN|SHIP|ular deposit +49924|984|19|4|1|1884.98|0.03|0.02|N|F|1995-06-08|1995-06-28|1995-07-04|NONE|RAIL|tect blithely. +49924|1032|33|5|47|43852.41|0.02|0.02|N|O|1995-08-17|1995-06-28|1995-08-28|COLLECT COD|MAIL| along the carefully ironic +49925|574|5|1|8|11796.56|0.10|0.02|R|F|1993-02-27|1993-04-12|1993-03-17|TAKE BACK RETURN|SHIP| accounts solve bl +49925|1865|66|2|42|74208.12|0.01|0.03|R|F|1993-02-16|1993-04-16|1993-02-26|NONE|SHIP| ironic ideas use fina +49925|1706|7|3|39|62700.30|0.00|0.00|A|F|1993-01-26|1993-03-12|1993-02-09|TAKE BACK RETURN|MAIL|, pending pin +49926|361|90|1|27|34056.72|0.03|0.08|N|F|1995-06-07|1995-06-14|1995-07-02|COLLECT COD|MAIL|le. blithely specia +49926|496|84|2|37|51670.13|0.10|0.05|N|O|1995-07-06|1995-05-28|1995-07-22|COLLECT COD|MAIL|onic, expre +49927|370|27|1|30|38111.10|0.00|0.04|A|F|1992-07-30|1992-10-06|1992-08-21|TAKE BACK RETURN|RAIL|ests accord +49927|148|49|2|24|25155.36|0.10|0.08|R|F|1992-08-06|1992-09-06|1992-08-10|DELIVER IN PERSON|AIR|among the slyly bold theodolites ha +49927|592|23|3|36|53733.24|0.00|0.04|R|F|1992-08-14|1992-08-21|1992-08-16|COLLECT COD|FOB| theodolites along the idly i +49927|1856|100|4|5|8789.25|0.03|0.05|A|F|1992-10-03|1992-08-31|1992-10-26|DELIVER IN PERSON|SHIP|wake blithely above the quic +49952|1807|8|1|20|34176.00|0.10|0.02|N|O|1995-12-05|1996-02-14|1995-12-14|COLLECT COD|RAIL|. fluffily special pinto +49952|1182|55|2|5|5415.90|0.03|0.02|N|O|1996-01-25|1996-01-14|1996-02-03|NONE|FOB|en deposits nod even pin +49952|1410|50|3|47|61636.27|0.04|0.06|N|O|1996-02-25|1996-01-19|1996-03-25|DELIVER IN PERSON|SHIP|g fluffily furiously express accounts. car +49953|1679|62|1|15|23710.05|0.08|0.07|A|F|1992-04-05|1992-05-02|1992-04-07|NONE|RAIL| nag slyly spec +49953|685|86|2|26|41227.68|0.07|0.01|R|F|1992-07-09|1992-04-28|1992-08-08|COLLECT COD|FOB|uffily unusual pinto beans wake. slyly pend +49953|1175|84|3|33|35513.61|0.05|0.01|R|F|1992-04-10|1992-04-20|1992-04-27|NONE|SHIP|gular requests. quickly +49953|1795|96|4|31|52600.49|0.08|0.03|A|F|1992-03-23|1992-05-27|1992-04-07|COLLECT COD|MAIL|he evenly +49953|218|100|5|23|25718.83|0.08|0.00|R|F|1992-05-13|1992-06-09|1992-05-14|DELIVER IN PERSON|FOB| wake slyly carefully even foxes. +49953|1677|19|6|2|3157.34|0.05|0.08|A|F|1992-05-07|1992-04-24|1992-05-08|NONE|REG AIR|gged asymptotes shall have to bo +49954|1514|95|1|32|45296.32|0.06|0.05|R|F|1992-05-18|1992-04-01|1992-05-20|COLLECT COD|TRUCK|usual pinto beans sublate above the s +49954|1470|10|2|46|63087.62|0.08|0.00|R|F|1992-04-18|1992-05-20|1992-04-23|COLLECT COD|FOB|es among the +49955|448|7|1|32|43150.08|0.01|0.05|N|O|1996-10-05|1996-08-08|1996-10-17|DELIVER IN PERSON|TRUCK|ress, ironic deposit +49955|1427|45|2|3|3985.26|0.00|0.00|N|O|1996-08-16|1996-08-07|1996-09-12|NONE|TRUCK|ess deposits boost carefully across the s +49955|1222|34|3|24|26957.28|0.07|0.08|N|O|1996-08-30|1996-10-01|1996-09-26|TAKE BACK RETURN|REG AIR| regular requests sleep alongside of +49956|1053|24|1|37|35299.85|0.06|0.03|N|O|1997-05-18|1997-04-18|1997-06-11|COLLECT COD|SHIP|integrate slyly. regular, +49956|888|88|2|24|42933.12|0.02|0.05|N|O|1997-03-03|1997-04-17|1997-04-02|COLLECT COD|AIR|ss instructions breach fluffily after +49957|440|99|1|32|42894.08|0.08|0.06|N|O|1996-07-04|1996-05-10|1996-07-12|NONE|AIR| the quickly bold instructions sleep f +49957|62|38|2|5|4810.30|0.04|0.06|N|O|1996-04-21|1996-06-29|1996-05-18|NONE|FOB|leep fluffily. +49958|1653|77|1|37|57522.05|0.05|0.04|N|O|1996-10-25|1996-09-26|1996-11-12|TAKE BACK RETURN|FOB|gular deposits. theodolites cajole +49958|818|85|2|23|39532.63|0.04|0.08|N|O|1996-10-25|1996-10-18|1996-11-10|DELIVER IN PERSON|MAIL|ss the unusual theodolite +49958|1162|63|3|41|43589.56|0.08|0.02|N|O|1996-11-25|1996-10-05|1996-12-22|NONE|REG AIR| pending accounts about the boldly iron +49958|1705|6|4|12|19280.40|0.00|0.06|N|O|1996-12-11|1996-11-13|1997-01-08|NONE|RAIL|y final theodolites. careful +49959|1424|42|1|8|10603.36|0.09|0.03|N|O|1997-09-21|1997-11-07|1997-10-12|DELIVER IN PERSON|TRUCK|he blithely ev +49959|1943|32|2|26|47968.44|0.08|0.01|N|O|1997-11-22|1997-10-23|1997-11-29|DELIVER IN PERSON|REG AIR|edly pending dependenc +49959|1061|32|3|28|26937.68|0.06|0.06|N|O|1997-10-21|1997-10-03|1997-11-02|TAKE BACK RETURN|FOB|heodolites hagg +49959|1116|53|4|2|2034.22|0.05|0.02|N|O|1997-09-23|1997-10-14|1997-09-26|NONE|FOB| packages against the furiously busy id +49959|1781|24|5|18|30290.04|0.05|0.02|N|O|1997-11-20|1997-10-22|1997-12-16|COLLECT COD|AIR|. frets about the fluffy requests prom +49959|1848|78|6|3|5249.52|0.03|0.07|N|O|1997-10-21|1997-11-22|1997-11-15|NONE|TRUCK|lar, final accoun +49984|744|41|1|19|31250.06|0.04|0.00|A|F|1994-08-12|1994-06-20|1994-08-18|DELIVER IN PERSON|RAIL|the special requests. ironically pe +49984|105|58|2|47|47239.70|0.00|0.03|A|F|1994-06-11|1994-07-26|1994-06-22|DELIVER IN PERSON|SHIP|dencies engage slyly darin +49984|682|14|3|20|31653.60|0.00|0.08|R|F|1994-05-13|1994-06-14|1994-06-11|NONE|AIR|nod furiously ironic asymptotes. +49984|1675|76|4|33|52030.11|0.07|0.05|A|F|1994-08-26|1994-06-24|1994-09-19|TAKE BACK RETURN|MAIL|ckages detect carefully final frets. fluffi +49984|793|94|5|25|42344.75|0.10|0.00|R|F|1994-08-06|1994-07-16|1994-08-08|COLLECT COD|TRUCK|he even instructions print blithely ar +49984|1893|23|6|16|28718.24|0.01|0.01|R|F|1994-06-26|1994-07-23|1994-07-08|DELIVER IN PERSON|MAIL|egular platelets hag +49985|975|76|1|47|88170.59|0.02|0.06|N|O|1998-07-29|1998-10-09|1998-08-25|NONE|RAIL| furiously final req +49986|885|19|1|27|48218.76|0.02|0.05|R|F|1993-12-27|1993-12-11|1994-01-06|DELIVER IN PERSON|TRUCK|s serve blithely alongside of the +49986|900|34|2|49|88244.10|0.02|0.04|A|F|1993-11-30|1993-12-30|1993-12-26|DELIVER IN PERSON|SHIP|e slyly express depos +49986|1807|8|3|4|6835.20|0.09|0.06|R|F|1993-11-22|1993-12-03|1993-12-22|TAKE BACK RETURN|SHIP|hely unusual dep +49986|448|36|4|8|10787.52|0.06|0.01|R|F|1993-12-13|1993-12-20|1994-01-11|COLLECT COD|TRUCK|ding pinto beans. fluffil +49986|120|99|5|49|49985.88|0.07|0.05|R|F|1994-02-12|1993-12-29|1994-02-27|DELIVER IN PERSON|AIR| alongside of the fluffily regu +49987|1120|57|1|26|26549.12|0.00|0.03|A|F|1995-03-06|1995-03-30|1995-03-12|NONE|MAIL|ndle blithely regular pinto b +49987|1607|90|2|15|22629.00|0.10|0.06|R|F|1995-02-16|1995-02-20|1995-02-19|DELIVER IN PERSON|TRUCK|f the even requests. never re +49987|745|78|3|46|75704.04|0.06|0.04|A|F|1995-02-27|1995-04-01|1995-03-27|DELIVER IN PERSON|FOB|dolphins are according to the final +49987|134|87|4|21|21716.73|0.09|0.08|R|F|1995-03-18|1995-03-17|1995-03-29|TAKE BACK RETURN|REG AIR|hely regular +49987|465|24|5|19|25943.74|0.01|0.06|A|F|1995-04-10|1995-03-19|1995-04-27|DELIVER IN PERSON|REG AIR|s. accounts nag. in +49987|150|3|6|39|40955.85|0.07|0.03|A|F|1995-05-12|1995-04-08|1995-06-05|COLLECT COD|MAIL|st the quickly silent reque +49987|718|19|7|41|66367.11|0.04|0.06|A|F|1995-04-27|1995-04-14|1995-05-22|TAKE BACK RETURN|REG AIR|sits detect. furiously even package +49988|936|71|1|30|55107.90|0.09|0.05|A|F|1994-03-02|1994-01-29|1994-03-24|DELIVER IN PERSON|TRUCK| fluffy theodolites wit +49988|1846|33|2|25|43696.00|0.05|0.03|A|F|1994-02-12|1994-02-18|1994-03-02|TAKE BACK RETURN|FOB|olphins. carefully unusual sauternes wake +49988|728|29|3|33|53747.76|0.06|0.00|A|F|1994-04-21|1994-02-16|1994-05-10|TAKE BACK RETURN|FOB|pending requests engage f +49988|707|40|4|24|38584.80|0.00|0.01|A|F|1994-03-10|1994-02-25|1994-03-14|TAKE BACK RETURN|AIR|ly special packages. slyly +49988|941|44|5|47|86571.18|0.03|0.00|A|F|1993-12-27|1994-03-06|1994-01-25|COLLECT COD|MAIL| unusual depths. final, regular +49988|1376|53|6|9|11496.33|0.07|0.07|A|F|1994-02-10|1994-03-08|1994-02-26|COLLECT COD|REG AIR| according to the +49989|1581|62|1|16|23721.28|0.08|0.08|R|F|1993-05-29|1993-06-23|1993-06-12|COLLECT COD|REG AIR|ges solve carefully sile +49989|1869|13|2|4|7083.44|0.10|0.02|R|F|1993-05-23|1993-07-05|1993-06-10|COLLECT COD|RAIL|rate. carefully final +49989|999|2|3|4|7599.96|0.10|0.01|R|F|1993-08-03|1993-06-06|1993-08-10|TAKE BACK RETURN|SHIP|quests could wake fluffily express Tiresi +49990|230|58|1|11|12432.53|0.06|0.05|R|F|1994-11-13|1994-11-08|1994-12-10|TAKE BACK RETURN|FOB|lets along the +49991|19|20|1|23|21137.23|0.05|0.08|N|O|1998-02-15|1998-01-31|1998-02-16|NONE|RAIL|inal platelets engage slyly. +49991|962|65|2|7|13040.72|0.04|0.05|N|O|1998-02-01|1997-12-29|1998-02-26|TAKE BACK RETURN|AIR|ts about the blithely r +49991|712|77|3|18|29028.78|0.02|0.02|N|O|1998-03-10|1998-01-17|1998-03-22|DELIVER IN PERSON|TRUCK|y special packages hang. specia +49991|1108|81|4|27|27245.70|0.06|0.07|N|O|1998-03-26|1998-01-06|1998-04-13|COLLECT COD|REG AIR|efully along the +49991|1225|37|5|18|20271.96|0.10|0.05|N|O|1998-01-07|1998-02-22|1998-01-22|NONE|AIR| even deposi +49991|1950|83|6|10|18519.50|0.08|0.06|N|O|1997-12-15|1998-01-05|1997-12-20|TAKE BACK RETURN|FOB|onic instructions haggle blithely about t +50016|595|86|1|40|59823.60|0.07|0.03|A|F|1994-07-05|1994-06-09|1994-08-03|COLLECT COD|TRUCK|. slyly silent packages nod +50016|1728|55|2|41|66818.52|0.08|0.02|R|F|1994-07-11|1994-06-01|1994-07-25|COLLECT COD|TRUCK|usly. pinto beans sleep +50016|569|60|3|20|29391.20|0.06|0.08|R|F|1994-07-28|1994-06-23|1994-08-01|COLLECT COD|RAIL|gainst the regular packages. ir +50016|1708|9|4|10|16097.00|0.03|0.08|A|F|1994-06-11|1994-06-19|1994-06-17|DELIVER IN PERSON|TRUCK|structions wake slyly excuses. fluffily +50016|83|34|5|6|5898.48|0.10|0.07|R|F|1994-05-06|1994-05-15|1994-05-21|DELIVER IN PERSON|MAIL|inst the slyly even ideas +50016|986|87|6|9|16982.82|0.10|0.08|R|F|1994-04-20|1994-05-06|1994-05-08|TAKE BACK RETURN|SHIP|s the ruthlessly ironic requests. Tires +50016|1668|92|7|11|17266.26|0.06|0.08|A|F|1994-07-30|1994-05-14|1994-08-22|TAKE BACK RETURN|RAIL| express, final asymptotes. fur +50017|1260|98|1|1|1161.26|0.06|0.00|A|F|1993-02-15|1993-01-12|1993-02-22|TAKE BACK RETURN|FOB|gular packag +50017|1781|66|2|4|6731.12|0.09|0.05|R|F|1993-03-11|1993-02-12|1993-04-05|COLLECT COD|SHIP|esias sleep idly express pinto bean +50017|1533|34|3|36|51643.08|0.10|0.06|R|F|1993-03-13|1993-02-01|1993-04-01|COLLECT COD|AIR|ar foxes wake. bold instructions are. fu +50017|326|27|4|9|11036.88|0.10|0.03|A|F|1993-01-06|1993-02-04|1993-01-09|COLLECT COD|TRUCK|lphins. slyly final dolphins wake s +50017|1652|53|5|1|1553.65|0.05|0.00|R|F|1993-02-01|1992-12-21|1993-02-26|DELIVER IN PERSON|SHIP|kages. slyly express patte +50017|472|2|6|25|34311.75|0.07|0.08|R|F|1993-01-15|1993-01-04|1993-02-01|NONE|REG AIR|ly regular pin +50018|1377|54|1|37|47299.69|0.01|0.06|N|O|1998-02-17|1998-01-09|1998-02-21|NONE|REG AIR|ronic dependencies. +50018|1175|84|2|12|12914.04|0.08|0.07|N|O|1998-01-27|1997-11-30|1998-02-13|DELIVER IN PERSON|MAIL|ithely quickly special ideas. ex +50018|945|48|3|34|62761.96|0.03|0.05|N|O|1998-01-21|1998-01-25|1998-02-09|COLLECT COD|AIR|nts cajole blithely above the fluffil +50018|834|35|4|6|10408.98|0.08|0.01|N|O|1997-12-15|1997-12-28|1998-01-13|DELIVER IN PERSON|RAIL|. carefully express packages detect stea +50018|1106|79|5|22|22156.20|0.05|0.04|N|O|1998-02-04|1997-12-11|1998-02-21|TAKE BACK RETURN|TRUCK|ans boost careful +50018|998|99|6|43|81656.57|0.09|0.00|N|O|1997-11-20|1997-12-31|1997-11-23|NONE|MAIL|lly furiously regular pinto bea +50018|1133|70|7|37|38262.81|0.06|0.05|N|O|1997-12-09|1998-01-15|1997-12-17|COLLECT COD|REG AIR|even, even +50019|289|44|1|34|40435.52|0.08|0.00|A|F|1994-10-07|1994-11-16|1994-10-27|NONE|MAIL|et package +50020|1575|56|1|22|32484.54|0.02|0.04|N|O|1996-06-28|1996-08-01|1996-06-29|DELIVER IN PERSON|RAIL|gular foxes wake ironic +50020|997|66|2|36|68327.64|0.00|0.03|N|O|1996-07-25|1996-08-01|1996-08-06|DELIVER IN PERSON|MAIL|le blithely. +50020|305|34|3|30|36159.00|0.09|0.08|N|O|1996-10-04|1996-07-14|1996-10-28|DELIVER IN PERSON|AIR|hins. bold, reg +50020|1296|34|4|10|11972.90|0.10|0.08|N|O|1996-06-19|1996-08-14|1996-07-06|NONE|SHIP|aringly express dependencies. slyly i +50020|1860|61|5|33|58141.38|0.04|0.05|N|O|1996-09-03|1996-08-09|1996-09-20|NONE|RAIL|ording to the slyly expr +50021|1089|90|1|7|6930.56|0.01|0.06|R|F|1993-02-27|1992-12-11|1993-03-06|TAKE BACK RETURN|SHIP|ously even accounts. sl +50021|944|79|2|34|62727.96|0.09|0.05|R|F|1993-02-01|1992-12-08|1993-02-04|NONE|RAIL|dencies doze fluffily furi +50022|262|17|1|31|36030.06|0.07|0.07|N|O|1996-02-29|1996-05-13|1996-03-09|NONE|TRUCK|ss packages haggle slyly fina +50022|1858|59|2|6|10559.10|0.05|0.03|N|O|1996-06-19|1996-04-28|1996-06-25|NONE|SHIP|ites affix carefully alongside of the furio +50022|1988|33|3|26|49139.48|0.00|0.00|N|O|1996-03-01|1996-04-05|1996-03-04|COLLECT COD|REG AIR|ed foxes serve along the exp +50022|340|41|4|48|59536.32|0.09|0.00|N|O|1996-03-21|1996-04-21|1996-03-22|NONE|MAIL|usly regular deposits. slyly +50022|780|45|5|35|58827.30|0.04|0.04|N|O|1996-04-12|1996-04-24|1996-04-23|DELIVER IN PERSON|REG AIR|sly ironic requests against the pending, si +50022|54|80|6|32|30529.60|0.03|0.06|N|O|1996-05-04|1996-04-27|1996-05-06|COLLECT COD|REG AIR|odolites alongside of the even excuses +50023|1669|93|1|48|75391.68|0.10|0.02|N|O|1997-07-18|1997-06-03|1997-08-14|TAKE BACK RETURN|FOB|sleep slyly. carefully eve +50023|881|82|2|48|85530.24|0.02|0.02|N|O|1997-05-02|1997-05-15|1997-05-30|COLLECT COD|REG AIR|ly furiously regular accounts. blith +50023|781|14|3|21|35317.38|0.06|0.05|N|O|1997-06-29|1997-06-07|1997-07-12|COLLECT COD|REG AIR|y even platelets. caref +50023|1841|85|4|24|41828.16|0.02|0.08|N|O|1997-04-21|1997-06-06|1997-05-20|DELIVER IN PERSON|FOB|ts haggle ev +50023|1650|51|5|4|6206.60|0.10|0.02|N|O|1997-06-14|1997-07-05|1997-07-06|NONE|AIR|furiously final depths thrash carefull +50023|1736|79|6|38|62233.74|0.04|0.07|N|O|1997-05-03|1997-06-22|1997-05-08|TAKE BACK RETURN|TRUCK|es along th +50048|1974|7|1|37|69410.89|0.10|0.05|R|F|1993-03-04|1993-02-19|1993-03-29|TAKE BACK RETURN|REG AIR|uriously regular theodoli +50048|1833|34|2|21|36431.43|0.06|0.00|A|F|1993-03-10|1993-04-18|1993-04-09|COLLECT COD|MAIL|otes mold furiously. even foxes wake amon +50048|1188|97|3|22|23961.96|0.03|0.07|R|F|1993-04-21|1993-03-22|1993-05-11|TAKE BACK RETURN|FOB|. daring instructions s +50048|1236|48|4|31|35254.13|0.09|0.05|A|F|1993-03-01|1993-03-08|1993-03-07|COLLECT COD|SHIP|g deposits. +50048|881|81|5|36|64147.68|0.06|0.06|R|F|1993-02-23|1993-04-19|1993-03-21|NONE|MAIL|ss, special pat +50049|137|38|1|37|38373.81|0.10|0.05|N|O|1996-05-21|1996-04-20|1996-06-02|COLLECT COD|RAIL|s wake blithely. expres +50049|1903|4|2|37|66781.30|0.10|0.04|N|O|1996-03-13|1996-03-22|1996-03-20|COLLECT COD|TRUCK|instructions. fina +50049|1451|52|3|10|13524.50|0.06|0.00|N|O|1996-04-20|1996-04-10|1996-05-04|NONE|FOB|c accounts. express, ironic theodolites m +50049|1564|65|4|29|42501.24|0.06|0.06|N|O|1996-05-09|1996-04-28|1996-05-26|COLLECT COD|TRUCK|usly final foxes x-ray quickly. fur +50049|1120|21|5|44|44929.28|0.03|0.03|N|O|1996-03-22|1996-03-10|1996-04-21|NONE|REG AIR|rnis. blithely final acco +50050|58|59|1|11|10538.55|0.02|0.01|A|F|1994-01-02|1994-03-03|1994-01-26|COLLECT COD|AIR|ages. regular packages haggle furiousl +50050|1641|42|2|34|52449.76|0.00|0.02|R|F|1994-02-11|1994-02-10|1994-03-11|NONE|FOB|y. carefully quiet requests +50050|373|2|3|39|49661.43|0.04|0.06|R|F|1994-02-18|1994-01-25|1994-03-14|TAKE BACK RETURN|REG AIR|special deposits boost blith +50050|521|22|4|39|55439.28|0.02|0.00|R|F|1994-04-21|1994-01-27|1994-05-07|COLLECT COD|AIR|ts mold about the regular, ir +50050|1641|65|5|3|4627.92|0.05|0.06|R|F|1994-01-30|1994-03-16|1994-02-13|NONE|REG AIR|ngside of the r +50050|326|11|6|50|61316.00|0.09|0.03|A|F|1994-01-26|1994-02-26|1994-02-11|COLLECT COD|AIR| dolphins. +50051|815|82|1|50|85790.50|0.05|0.05|A|F|1994-10-31|1994-11-15|1994-11-14|COLLECT COD|REG AIR|ges against the slyl +50051|1459|38|2|29|39453.05|0.05|0.01|A|F|1994-12-27|1994-12-17|1994-12-29|COLLECT COD|MAIL|ronic excu +50051|1897|27|3|48|86346.72|0.03|0.04|R|F|1994-10-24|1994-11-09|1994-11-07|TAKE BACK RETURN|RAIL|ckly even package +50051|825|59|4|40|69032.80|0.04|0.07|A|F|1994-12-25|1994-11-28|1994-12-29|TAKE BACK RETURN|SHIP|ly against the dogged deposits. care +50051|314|99|5|20|24286.20|0.08|0.01|R|F|1995-01-30|1995-01-01|1995-02-09|DELIVER IN PERSON|SHIP| requests. final foxes may cajole. +50051|295|50|6|21|25101.09|0.04|0.00|R|F|1994-10-27|1994-12-27|1994-11-10|TAKE BACK RETURN|AIR|y even asymptotes. slyly special theo +50051|940|75|7|7|12886.58|0.02|0.00|A|F|1995-01-29|1994-11-05|1995-02-24|TAKE BACK RETURN|REG AIR|tes. blithely even accoun +50052|493|23|1|27|37624.23|0.07|0.03|N|O|1995-11-21|1995-09-03|1995-12-02|NONE|FOB|ending excuses +50052|34|85|2|6|5604.18|0.04|0.03|N|O|1995-09-04|1995-10-22|1995-09-12|TAKE BACK RETURN|TRUCK|even accounts? deposits dazzle regularly re +50052|830|30|3|40|69233.20|0.10|0.02|N|O|1995-11-12|1995-09-24|1995-11-15|NONE|TRUCK|es: stealthy ideas cajole +50052|1952|85|4|38|70450.10|0.03|0.00|N|O|1995-09-14|1995-09-09|1995-10-11|TAKE BACK RETURN|MAIL|s. quickly regular r +50052|674|6|5|32|50389.44|0.03|0.03|N|O|1995-09-25|1995-10-20|1995-10-24|TAKE BACK RETURN|REG AIR|aggle blithely. special, reg +50052|898|65|6|5|8994.45|0.01|0.04|N|O|1995-08-05|1995-08-30|1995-08-19|DELIVER IN PERSON|SHIP|ays cajole carefully after the c +50052|1923|56|7|32|58397.44|0.06|0.04|N|O|1995-09-15|1995-10-26|1995-10-14|TAKE BACK RETURN|RAIL|nic deposit +50053|1896|40|1|28|50340.92|0.10|0.05|N|O|1995-07-01|1995-07-28|1995-07-25|COLLECT COD|FOB|across the pending accounts boost caref +50053|1795|96|2|12|20361.48|0.00|0.07|N|O|1995-08-10|1995-07-19|1995-08-14|COLLECT COD|FOB| deposits +50053|96|97|3|32|31874.88|0.09|0.05|N|O|1995-07-06|1995-07-25|1995-08-01|TAKE BACK RETURN|REG AIR|ccounts cajole. ironic package +50054|1497|37|1|46|64330.54|0.05|0.06|A|F|1994-01-01|1993-10-15|1994-01-17|COLLECT COD|MAIL|e according to the regular deposi +50054|384|41|2|50|64219.00|0.09|0.01|A|F|1993-11-04|1993-11-20|1993-12-02|TAKE BACK RETURN|AIR|ourts; carefully ironic packages d +50055|882|83|1|43|76663.84|0.04|0.08|A|F|1993-02-06|1992-12-09|1993-03-02|TAKE BACK RETURN|REG AIR|inments are +50055|1071|72|2|17|16525.19|0.00|0.02|A|F|1992-12-07|1992-12-05|1993-01-04|DELIVER IN PERSON|TRUCK|ironic foxes. care +50055|1258|96|3|42|48688.50|0.08|0.01|A|F|1993-02-09|1993-01-09|1993-03-09|TAKE BACK RETURN|AIR|gle according to the slyly f +50055|512|13|4|15|21187.65|0.10|0.00|A|F|1992-12-21|1992-12-18|1992-12-22|NONE|TRUCK| the slyly ev +50055|640|3|5|45|69328.80|0.10|0.02|R|F|1993-01-23|1993-01-11|1993-01-24|DELIVER IN PERSON|RAIL|slyly regular packages haggle blithe +50080|723|88|1|39|63325.08|0.08|0.00|N|O|1997-03-07|1997-03-25|1997-03-31|DELIVER IN PERSON|MAIL| fluffily b +50080|1827|71|2|49|84712.18|0.01|0.02|N|O|1997-05-08|1997-04-12|1997-05-12|NONE|TRUCK|ckly unusual accounts caj +50080|1781|24|3|5|8413.90|0.04|0.05|N|O|1997-04-18|1997-04-25|1997-05-09|NONE|RAIL|lithe foxes-- idle accou +50080|1348|87|4|9|11244.06|0.02|0.02|N|O|1997-03-08|1997-05-16|1997-03-16|TAKE BACK RETURN|RAIL| slyly final ideas cajo +50080|1669|93|5|23|36125.18|0.08|0.01|N|O|1997-02-27|1997-04-14|1997-03-15|TAKE BACK RETURN|RAIL|ecial instructions. carefully f +50081|493|52|1|33|45985.17|0.04|0.06|A|F|1995-01-21|1995-01-02|1995-02-17|COLLECT COD|MAIL|n, final ideas. iron +50081|1358|73|2|41|51633.35|0.01|0.02|A|F|1995-02-10|1994-12-29|1995-02-28|NONE|AIR|of the idle foxes. +50081|500|88|3|18|25209.00|0.06|0.02|R|F|1995-02-26|1995-01-03|1995-03-04|COLLECT COD|AIR|the furiously ironic requests sleep about +50081|1924|57|4|32|58429.44|0.04|0.08|R|F|1994-12-13|1995-01-24|1995-01-08|COLLECT COD|FOB|c deposits detect over the +50082|81|82|1|26|25508.08|0.04|0.03|A|F|1993-01-15|1993-01-04|1993-02-12|DELIVER IN PERSON|MAIL| the final dolphins. silently final +50083|332|33|1|11|13555.63|0.09|0.02|R|F|1995-04-22|1995-06-26|1995-05-14|TAKE BACK RETURN|TRUCK|sits cajole. +50083|1815|59|2|17|29185.77|0.09|0.02|N|O|1995-07-18|1995-07-08|1995-08-16|NONE|TRUCK|ial sauternes sleep quickly deposit +50083|1084|20|3|1|985.08|0.01|0.01|R|F|1995-06-04|1995-06-15|1995-06-05|TAKE BACK RETURN|RAIL| packages: express, pendi +50083|1912|13|4|2|3627.82|0.09|0.08|A|F|1995-05-14|1995-05-15|1995-06-04|NONE|REG AIR|gular pinto +50084|110|37|1|1|1010.11|0.02|0.00|N|O|1998-06-19|1998-06-27|1998-06-21|TAKE BACK RETURN|SHIP|ly special asymptot +50084|72|48|2|24|23329.68|0.08|0.00|N|O|1998-06-22|1998-05-19|1998-06-23|NONE|AIR|ronic theod +50084|988|91|3|48|90671.04|0.09|0.07|N|O|1998-04-29|1998-05-28|1998-05-20|NONE|REG AIR|dolites cajole. blithely expr +50084|1932|21|4|16|29342.88|0.07|0.04|N|O|1998-08-10|1998-05-19|1998-08-15|TAKE BACK RETURN|MAIL| maintain carefull +50084|384|69|5|16|20550.08|0.05|0.06|N|O|1998-05-20|1998-06-09|1998-06-11|TAKE BACK RETURN|SHIP|ccording to the fina +50084|427|86|6|41|54424.22|0.00|0.07|N|O|1998-07-03|1998-06-23|1998-07-17|TAKE BACK RETURN|TRUCK|ular requests. carefully even foxes acros +50084|1386|1|7|5|6436.90|0.08|0.07|N|O|1998-05-03|1998-06-13|1998-05-10|DELIVER IN PERSON|RAIL|ts. requests use slyly re +50085|1497|76|1|34|47548.66|0.02|0.01|N|O|1995-12-07|1995-12-15|1996-01-04|COLLECT COD|FOB|. regular, regular accounts nag slyl +50086|662|63|1|8|12501.28|0.00|0.02|R|F|1992-11-22|1992-12-18|1992-12-03|COLLECT COD|MAIL|eat. slyly special courts detec +50086|330|59|2|46|56595.18|0.05|0.08|A|F|1993-01-15|1992-12-04|1993-02-04|TAKE BACK RETURN|RAIL|regular deposits. +50086|335|92|3|1|1235.33|0.01|0.02|A|F|1992-11-29|1992-10-30|1992-12-19|COLLECT COD|AIR| Tiresias are +50087|986|87|1|9|16982.82|0.07|0.01|A|F|1993-07-09|1993-06-16|1993-07-15|TAKE BACK RETURN|AIR|e slyly even requests +50087|1723|66|2|2|3249.44|0.05|0.08|A|F|1993-06-06|1993-07-05|1993-06-10|TAKE BACK RETURN|SHIP|r, pending accounts. packages detect final +50087|243|71|3|36|41156.64|0.04|0.05|A|F|1993-08-22|1993-07-03|1993-09-07|DELIVER IN PERSON|AIR|nusual packages are ironically regular, +50087|856|90|4|6|10541.10|0.03|0.01|A|F|1993-06-03|1993-07-28|1993-06-22|DELIVER IN PERSON|REG AIR|eposits cajole. even, e +50087|1908|41|5|26|47057.40|0.09|0.04|R|F|1993-05-30|1993-07-24|1993-06-02|NONE|FOB|ke blithely around +50112|1042|43|1|24|22632.96|0.03|0.03|N|O|1996-03-08|1995-12-30|1996-03-21|TAKE BACK RETURN|FOB|eas above the blithely regular a +50113|1808|9|1|43|73521.40|0.02|0.05|N|O|1997-01-26|1997-01-26|1997-02-04|NONE|AIR|riously regular deposits according to the +50113|1892|93|2|38|68167.82|0.03|0.07|N|O|1997-01-05|1997-02-18|1997-01-17|TAKE BACK RETURN|REG AIR|ic accounts. slyly regular foxes haggle bli +50113|619|82|3|42|63823.62|0.10|0.06|N|O|1997-04-03|1997-02-12|1997-04-26|NONE|MAIL|. pending accounts about the expr +50113|1206|7|4|26|28787.20|0.09|0.02|N|O|1997-03-07|1997-03-01|1997-04-02|COLLECT COD|AIR| bold pinto beans. fluffily ironic foxes ar +50113|1023|29|5|34|31416.68|0.09|0.04|N|O|1997-01-09|1997-01-22|1997-01-19|COLLECT COD|TRUCK|ons. slyly regular ide +50113|1358|73|6|2|2518.70|0.05|0.08|N|O|1997-03-11|1997-02-15|1997-03-13|NONE|FOB|ep against the +50113|298|99|7|41|49129.89|0.10|0.00|N|O|1997-03-31|1997-01-29|1997-04-25|TAKE BACK RETURN|RAIL|ly bold ideas across the carefully pe +50114|794|27|1|44|74570.76|0.00|0.06|N|O|1997-01-04|1997-01-01|1997-01-05|COLLECT COD|REG AIR|as. special, special accounts are bl +50114|489|19|2|27|37515.96|0.01|0.00|N|O|1997-01-09|1997-02-16|1997-01-20|DELIVER IN PERSON|REG AIR|inal accounts. carefully even ideas i +50114|48|24|3|21|19908.84|0.09|0.01|N|O|1997-02-14|1997-01-24|1997-03-05|TAKE BACK RETURN|TRUCK|osits. quickly e +50114|143|22|4|28|29207.92|0.06|0.07|N|O|1996-12-13|1997-02-10|1997-01-11|TAKE BACK RETURN|SHIP|nusual, even accounts are qui +50114|961|96|5|11|20481.56|0.06|0.02|N|O|1997-03-18|1997-01-24|1997-04-05|DELIVER IN PERSON|AIR|ly special t +50114|1137|38|6|13|13495.69|0.08|0.08|N|O|1997-02-22|1997-02-01|1997-03-13|COLLECT COD|REG AIR|side of the carefully unusual deposi +50115|1105|14|1|37|37225.70|0.08|0.01|R|F|1993-11-22|1993-12-24|1993-12-16|DELIVER IN PERSON|FOB|al packages. even, bold theodolites sleep +50115|1914|3|2|23|41765.93|0.01|0.00|R|F|1994-03-02|1993-12-18|1994-03-30|COLLECT COD|REG AIR|carefully special courts. final acco +50115|455|14|3|46|62350.70|0.08|0.03|A|F|1994-02-05|1993-12-17|1994-02-06|DELIVER IN PERSON|SHIP|capades boost according to the accounts. fu +50115|140|93|4|34|35364.76|0.07|0.04|A|F|1994-02-11|1993-12-23|1994-02-14|TAKE BACK RETURN|AIR|nt foxes among the b +50115|633|96|5|47|72080.61|0.00|0.03|A|F|1994-02-24|1994-01-13|1994-03-02|NONE|AIR|g among the furiously blithe depos +50116|1515|96|1|1|1416.51|0.07|0.08|N|O|1996-06-29|1996-07-19|1996-07-01|COLLECT COD|AIR|ccounts at the expre +50116|1926|15|2|21|38386.32|0.01|0.02|N|O|1996-06-06|1996-06-11|1996-06-14|TAKE BACK RETURN|REG AIR|wake carefully deposits. package +50116|1535|56|3|34|48842.02|0.03|0.03|N|O|1996-06-01|1996-06-17|1996-06-02|NONE|MAIL|ctions: final foxes are fluffily p +50117|603|4|1|16|24057.60|0.10|0.00|N|O|1995-08-10|1995-08-01|1995-08-26|TAKE BACK RETURN|FOB|e above the unusual foxes. carefu +50117|1667|9|2|8|12549.28|0.08|0.05|N|O|1995-08-27|1995-07-30|1995-09-24|TAKE BACK RETURN|AIR|inal excuses. express +50118|1726|11|1|47|76502.84|0.06|0.02|A|F|1993-05-06|1993-05-12|1993-05-16|DELIVER IN PERSON|AIR|uriously above the carefully regular foxes. +50118|1040|46|2|35|32936.40|0.06|0.07|R|F|1993-04-16|1993-04-18|1993-04-29|TAKE BACK RETURN|SHIP|carefully ironic pinto beans. permane +50118|318|47|3|23|28021.13|0.09|0.00|A|F|1993-06-23|1993-04-23|1993-06-27|COLLECT COD|FOB|iously along the theodolites. even, s +50118|55|31|4|14|13370.70|0.06|0.00|R|F|1993-05-31|1993-05-08|1993-06-09|NONE|REG AIR|nooze enticingly +50118|152|53|5|23|24199.45|0.08|0.00|A|F|1993-04-04|1993-06-12|1993-05-03|DELIVER IN PERSON|MAIL|ng theodolites breach furiously? c +50118|1759|86|6|31|51483.25|0.08|0.00|R|F|1993-03-25|1993-05-18|1993-04-16|COLLECT COD|FOB|g, unusual theodolites are furio +50119|1074|75|1|46|44853.22|0.07|0.03|R|F|1993-07-20|1993-07-30|1993-08-03|COLLECT COD|TRUCK|of the busily +50119|1426|66|2|41|54424.22|0.05|0.00|R|F|1993-07-29|1993-08-20|1993-08-11|NONE|FOB|ic ideas. fluffily re +50144|228|56|1|30|33846.60|0.02|0.06|A|F|1992-07-30|1992-07-24|1992-08-13|TAKE BACK RETURN|MAIL|lar packages sleep. blithely ironic packa +50144|175|28|2|34|36555.78|0.05|0.00|A|F|1992-09-29|1992-09-01|1992-10-29|NONE|SHIP| according to the blithely s +50144|1312|51|3|48|58238.88|0.07|0.01|A|F|1992-06-12|1992-07-18|1992-07-03|TAKE BACK RETURN|REG AIR|ffily express fox +50144|191|70|4|20|21823.80|0.08|0.02|R|F|1992-08-30|1992-08-24|1992-09-16|COLLECT COD|FOB|unts. carefully ironic dep +50145|768|69|1|25|41719.00|0.03|0.01|A|F|1995-04-16|1995-04-07|1995-04-18|COLLECT COD|RAIL|sly final requests +50145|1147|20|2|1|1048.14|0.04|0.01|R|F|1995-05-03|1995-04-12|1995-06-02|TAKE BACK RETURN|AIR| deposits are blithely slyly ironic deposit +50145|1058|29|3|50|47952.50|0.09|0.01|A|F|1995-05-01|1995-04-29|1995-05-25|TAKE BACK RETURN|FOB|fully unusual request +50145|361|90|4|15|18920.40|0.05|0.04|R|F|1995-04-04|1995-04-16|1995-04-26|DELIVER IN PERSON|SHIP|ding to the blithely bo +50145|109|62|5|15|15136.50|0.05|0.03|A|F|1995-03-03|1995-05-24|1995-03-05|TAKE BACK RETURN|REG AIR| packages. b +50145|1180|17|6|44|47571.92|0.01|0.03|A|F|1995-04-06|1995-05-20|1995-05-01|DELIVER IN PERSON|MAIL|ideas wake sl +50145|368|25|7|31|39319.16|0.00|0.06|N|O|1995-06-22|1995-05-27|1995-06-26|NONE|FOB|ccounts. frays sleep. sil +50146|352|37|1|2|2504.70|0.10|0.06|R|F|1993-11-26|1993-09-20|1993-12-03|COLLECT COD|RAIL| permanently regular asymptotes sl +50146|1526|7|2|22|31405.44|0.02|0.08|A|F|1993-10-24|1993-10-01|1993-11-15|TAKE BACK RETURN|SHIP|luffily ironic theodolites. enticing, +50146|1350|65|3|26|32535.10|0.02|0.08|R|F|1993-11-24|1993-10-11|1993-12-15|DELIVER IN PERSON|MAIL|quests. regularly express hockey players +50146|546|7|4|23|33270.42|0.04|0.07|A|F|1993-08-13|1993-09-26|1993-08-30|DELIVER IN PERSON|TRUCK| even excuses use blithely according t +50146|1466|84|5|8|10939.68|0.06|0.03|A|F|1993-10-19|1993-09-29|1993-11-09|COLLECT COD|REG AIR|nt. requests wake. carefully even accoun +50147|415|74|1|23|30254.43|0.01|0.07|A|F|1995-01-19|1994-11-16|1995-02-04|COLLECT COD|AIR|counts boost around the quick accou +50147|232|33|2|46|52082.58|0.00|0.00|A|F|1994-10-25|1994-12-01|1994-11-23|NONE|SHIP|equests cajole: even, eve +50147|34|85|3|47|43899.41|0.08|0.01|A|F|1994-12-16|1994-12-10|1995-01-10|COLLECT COD|RAIL|ges: pending requests hag +50147|1171|72|4|22|23587.74|0.05|0.08|A|F|1995-01-30|1994-12-22|1995-02-15|TAKE BACK RETURN|FOB|quiet accounts. slyly brave +50147|439|27|5|49|65632.07|0.05|0.06|R|F|1995-01-26|1994-12-07|1995-02-08|COLLECT COD|AIR|en requests among the f +50148|1739|24|1|17|27892.41|0.07|0.03|A|F|1992-05-21|1992-04-08|1992-06-19|DELIVER IN PERSON|REG AIR|s. carefully final theodoli +50148|698|30|2|12|19184.28|0.07|0.08|A|F|1992-04-23|1992-04-07|1992-04-24|DELIVER IN PERSON|SHIP|ns was furiously +50148|568|59|3|12|17622.72|0.05|0.00|R|F|1992-02-23|1992-05-02|1992-03-16|TAKE BACK RETURN|AIR|ly. regular packages cajole slyly r +50148|1101|10|4|6|6012.60|0.03|0.06|A|F|1992-04-22|1992-04-17|1992-04-30|NONE|RAIL|s use slowly final i +50148|1350|51|5|50|62567.50|0.09|0.08|A|F|1992-06-02|1992-03-26|1992-06-12|TAKE BACK RETURN|FOB|ions about the platelets are according to +50148|1275|76|6|30|35288.10|0.07|0.00|A|F|1992-04-29|1992-03-12|1992-05-15|DELIVER IN PERSON|MAIL|slyly pending packages. packages +50149|1983|16|1|38|71629.24|0.01|0.04|A|F|1994-05-09|1994-06-07|1994-05-17|TAKE BACK RETURN|RAIL|ickly regular foxes cajole blithely. +50149|1344|59|2|10|12453.40|0.00|0.00|A|F|1994-07-02|1994-06-12|1994-07-31|TAKE BACK RETURN|FOB|e accounts. packag +50149|52|28|3|26|24753.30|0.02|0.01|R|F|1994-07-20|1994-06-20|1994-08-18|COLLECT COD|AIR|gular requests. furious +50150|1328|29|1|20|24586.40|0.06|0.08|N|O|1996-06-11|1996-07-17|1996-07-10|TAKE BACK RETURN|AIR|sts detect even +50150|812|12|2|45|77076.45|0.02|0.07|N|O|1996-07-16|1996-08-07|1996-07-28|DELIVER IN PERSON|TRUCK|e furiously. slyly special pinto beans abov +50150|676|77|3|23|36263.41|0.02|0.02|N|O|1996-08-15|1996-06-17|1996-08-20|DELIVER IN PERSON|SHIP|hlessly against the blithely speci +50150|1941|30|4|14|25801.16|0.06|0.08|N|O|1996-05-22|1996-08-02|1996-06-03|DELIVER IN PERSON|REG AIR|ge packages. sl +50150|952|21|5|27|50029.65|0.04|0.04|N|O|1996-08-19|1996-07-20|1996-09-10|COLLECT COD|SHIP| the idle, bold theodolites. +50150|1590|91|6|22|32814.98|0.07|0.03|N|O|1996-07-10|1996-06-24|1996-08-06|TAKE BACK RETURN|SHIP| haggle slyly. instructions dou +50150|698|99|7|15|23980.35|0.08|0.07|N|O|1996-06-14|1996-08-07|1996-06-24|COLLECT COD|MAIL|d packages +50151|1290|28|1|31|36929.99|0.09|0.00|N|O|1998-07-19|1998-07-05|1998-08-17|COLLECT COD|MAIL|s. furiously ironic deposi +50151|1031|32|2|34|31689.02|0.05|0.08|N|O|1998-08-29|1998-07-19|1998-09-06|TAKE BACK RETURN|AIR|n packages. thinly even accounts sleep c +50151|1350|89|3|2|2502.70|0.03|0.03|N|O|1998-05-17|1998-08-06|1998-06-08|NONE|FOB|arefully special theodol +50151|106|7|4|43|43262.30|0.10|0.06|N|O|1998-08-28|1998-07-10|1998-09-22|COLLECT COD|TRUCK|to beans wake regular, final +50151|1498|77|5|45|62977.05|0.03|0.08|N|O|1998-08-24|1998-06-09|1998-09-23|NONE|MAIL|ic platelets around the +50176|1413|14|1|8|10515.28|0.04|0.02|R|F|1993-03-02|1993-05-22|1993-03-15|NONE|MAIL|riously final instructions after the th +50176|378|7|2|9|11505.33|0.00|0.08|A|F|1993-05-16|1993-05-26|1993-05-29|DELIVER IN PERSON|RAIL|es. special +50176|846|13|3|19|33189.96|0.10|0.05|A|F|1993-03-11|1993-04-26|1993-03-17|TAKE BACK RETURN|TRUCK| sleep. instructions cajole silently amon +50176|868|68|4|4|7075.44|0.10|0.06|R|F|1993-03-31|1993-04-14|1993-04-23|DELIVER IN PERSON|AIR|uriously. blithel +50177|336|37|1|19|23490.27|0.08|0.08|N|O|1998-05-09|1998-05-07|1998-05-12|TAKE BACK RETURN|FOB|nic asymptotes are carefully slyly final +50177|1662|63|2|7|10945.62|0.04|0.06|N|O|1998-05-17|1998-05-26|1998-06-16|DELIVER IN PERSON|FOB|nic theodolites us +50177|709|42|3|4|6438.80|0.07|0.05|N|O|1998-04-16|1998-05-04|1998-04-29|COLLECT COD|RAIL|quests. furiously regular requests among t +50177|1705|48|4|16|25707.20|0.09|0.07|N|O|1998-04-02|1998-05-09|1998-04-29|COLLECT COD|MAIL|al packages run daringly regular courts. ca +50177|202|30|5|31|34168.20|0.05|0.07|N|O|1998-05-30|1998-05-18|1998-06-09|TAKE BACK RETURN|MAIL|lyly permanent instructions haggl +50177|1680|4|6|37|58522.16|0.05|0.05|N|O|1998-03-29|1998-04-16|1998-04-25|TAKE BACK RETURN|TRUCK|xcuses boost furiously about the somas. esc +50178|253|8|1|39|44976.75|0.05|0.08|R|F|1992-07-26|1992-06-07|1992-07-29|COLLECT COD|RAIL|ide the ironic platele +50179|333|34|1|4|4933.32|0.00|0.01|N|O|1998-07-26|1998-05-21|1998-08-07|NONE|FOB|ove the blithely special +50179|1520|1|2|38|54017.76|0.06|0.01|N|O|1998-05-15|1998-06-01|1998-05-18|DELIVER IN PERSON|SHIP|arefully final pinto beans use +50179|1451|91|3|18|24344.10|0.05|0.05|N|O|1998-04-23|1998-06-08|1998-04-24|DELIVER IN PERSON|AIR|le carefully final d +50179|322|7|4|16|19557.12|0.08|0.07|N|O|1998-07-21|1998-06-19|1998-08-09|NONE|AIR|foxes. carefully pendin +50180|530|91|1|11|15735.83|0.04|0.00|R|F|1994-02-23|1994-01-14|1994-03-07|COLLECT COD|AIR|al foxes wake q +50180|1646|29|2|3|4642.92|0.05|0.02|A|F|1994-03-03|1993-12-15|1994-03-27|COLLECT COD|SHIP|ts haggle furiously among th +50180|1235|36|3|12|13634.76|0.09|0.02|A|F|1994-02-19|1994-01-17|1994-02-28|NONE|SHIP|ngside of th +50180|1364|79|4|45|56941.20|0.02|0.03|R|F|1993-11-09|1993-12-21|1993-11-15|COLLECT COD|TRUCK| deposits maintain carefully according to +50181|284|39|1|23|27238.44|0.05|0.06|R|F|1992-09-08|1992-08-06|1992-09-29|COLLECT COD|REG AIR|the blithely bold depos +50181|1641|83|2|29|44736.56|0.06|0.08|R|F|1992-09-27|1992-07-19|1992-09-30|COLLECT COD|TRUCK|ss the furiously express theodolites. +50181|1615|16|3|45|68247.45|0.01|0.06|A|F|1992-07-25|1992-08-12|1992-08-24|NONE|REG AIR|y special asymptotes cajole furiously abo +50181|412|13|4|23|30185.43|0.03|0.01|R|F|1992-07-13|1992-08-08|1992-07-28|TAKE BACK RETURN|TRUCK|ounts are. requests be +50181|71|47|5|13|12623.91|0.07|0.03|R|F|1992-09-05|1992-07-11|1992-09-27|DELIVER IN PERSON|AIR|ly furiously ironic accounts +50181|1094|100|6|49|48759.41|0.03|0.06|A|F|1992-09-22|1992-08-20|1992-10-10|NONE|AIR|lar accounts. ironic deposits sle +50182|383|40|1|5|6416.90|0.05|0.05|N|O|1997-08-01|1997-08-31|1997-08-31|COLLECT COD|TRUCK| blithely bold accounts +50182|310|11|2|24|29047.44|0.10|0.02|N|O|1997-10-08|1997-09-25|1997-10-26|NONE|MAIL|nal packages. regular theodolites a +50182|1435|75|3|40|53457.20|0.00|0.07|N|O|1997-09-06|1997-09-05|1997-09-24|DELIVER IN PERSON|RAIL|refully thin +50183|750|47|1|14|23110.50|0.06|0.02|A|F|1993-08-05|1993-07-27|1993-08-10|DELIVER IN PERSON|FOB|wake. slyly furious excuses wake. furiously +50183|1798|41|2|34|57792.86|0.08|0.05|A|F|1993-06-02|1993-07-15|1993-06-21|NONE|SHIP|hely! quickly bo +50183|1908|97|3|9|16289.10|0.03|0.05|R|F|1993-08-01|1993-08-06|1993-08-30|COLLECT COD|REG AIR| carefully carefully +50183|660|23|4|10|15606.60|0.09|0.05|A|F|1993-09-19|1993-08-22|1993-09-22|COLLECT COD|AIR|cies use finally. quiet ideas use quick +50183|1974|63|5|9|16883.73|0.04|0.01|A|F|1993-07-19|1993-07-07|1993-08-01|COLLECT COD|AIR|ely silent d +50183|415|74|6|14|18415.74|0.00|0.01|R|F|1993-06-18|1993-07-27|1993-06-29|COLLECT COD|REG AIR|efully quick foxes. blithely +50208|155|82|1|32|33764.80|0.07|0.02|A|F|1995-04-06|1995-04-05|1995-05-01|COLLECT COD|SHIP|ructions use always. fluffily bold grouches +50208|800|1|2|16|27212.80|0.00|0.06|A|F|1995-04-07|1995-03-04|1995-04-20|NONE|MAIL|its. deposits +50208|443|44|3|27|36272.88|0.03|0.02|A|F|1995-03-07|1995-04-08|1995-03-29|NONE|AIR|symptotes. s +50208|1230|42|4|32|36199.36|0.02|0.02|A|F|1995-03-24|1995-03-18|1995-04-12|COLLECT COD|TRUCK|lyly express ideas. unusual dependenci +50208|1342|81|5|48|59680.32|0.09|0.07|A|F|1995-01-31|1995-04-02|1995-02-21|NONE|TRUCK|nts. furiously final foxes +50209|118|19|1|24|24434.64|0.00|0.04|A|F|1993-10-19|1993-10-29|1993-11-12|TAKE BACK RETURN|SHIP|fully brave frays. blithely ironic reques +50209|1629|53|2|21|32143.02|0.07|0.01|R|F|1993-12-20|1993-10-27|1994-01-14|TAKE BACK RETURN|MAIL|s sleep blithe +50209|1302|17|3|33|39708.90|0.05|0.03|R|F|1993-10-29|1993-10-28|1993-11-11|COLLECT COD|MAIL|ickly ironic req +50209|1247|48|4|27|31002.48|0.07|0.08|A|F|1993-10-26|1993-11-28|1993-11-12|COLLECT COD|AIR|ccounts. slyly +50209|235|36|5|34|38597.82|0.02|0.04|A|F|1993-12-25|1993-12-03|1993-12-31|DELIVER IN PERSON|AIR| accounts at the clo +50209|1379|56|6|49|62738.13|0.10|0.00|R|F|1993-11-30|1993-11-22|1993-12-15|COLLECT COD|TRUCK|bold accounts boost carefully +50209|1404|22|7|9|11748.60|0.01|0.08|R|F|1993-10-28|1993-11-04|1993-11-23|DELIVER IN PERSON|REG AIR|pades breach carefully. fluffily regu +50210|361|62|1|25|31534.00|0.06|0.05|R|F|1993-11-11|1993-09-28|1993-12-03|DELIVER IN PERSON|MAIL|ounts. bold courts around the furiously +50210|1600|1|2|1|1501.60|0.10|0.05|R|F|1993-10-07|1993-09-01|1993-10-11|DELIVER IN PERSON|TRUCK|ickly. ironic, bold orbits haggle slyly. s +50210|153|80|3|3|3159.45|0.05|0.07|A|F|1993-08-12|1993-08-30|1993-08-22|COLLECT COD|TRUCK|asymptotes. fluffily regular acc +50210|1070|6|4|14|13594.98|0.02|0.08|A|F|1993-10-25|1993-09-10|1993-10-29|DELIVER IN PERSON|SHIP|s integrate among the furiously even ideas +50210|830|64|5|43|74425.69|0.03|0.05|R|F|1993-11-10|1993-10-02|1993-11-22|DELIVER IN PERSON|RAIL|ly ironic a +50210|80|56|6|35|34302.80|0.03|0.06|R|F|1993-08-31|1993-10-06|1993-09-09|DELIVER IN PERSON|TRUCK|kages are. furiousl +50210|763|28|7|38|63222.88|0.02|0.08|R|F|1993-08-26|1993-09-03|1993-09-10|DELIVER IN PERSON|TRUCK| the furiously fluffy acco +50211|1865|66|1|17|30036.62|0.02|0.04|N|O|1997-01-14|1996-12-20|1997-01-20|TAKE BACK RETURN|MAIL|to the quickly sly excus +50211|976|77|2|16|30031.52|0.02|0.07|N|O|1997-02-17|1996-12-19|1997-03-15|COLLECT COD|TRUCK|pecial asymptotes +50211|643|6|3|36|55571.04|0.09|0.02|N|O|1996-12-02|1997-01-25|1996-12-21|DELIVER IN PERSON|REG AIR|ld dependencies integrate about the bli +50211|838|5|4|13|22604.79|0.06|0.07|N|O|1997-01-10|1997-01-07|1997-01-27|DELIVER IN PERSON|TRUCK|ix carefully after the quickly express requ +50212|282|64|1|33|39015.24|0.04|0.07|N|O|1997-10-20|1997-11-06|1997-11-19|COLLECT COD|RAIL|n foxes ca +50212|1884|85|2|19|33931.72|0.04|0.05|N|O|1997-11-22|1997-11-21|1997-11-26|NONE|AIR|as. slyly regular ideas sleep alongs +50212|516|17|3|10|14165.10|0.00|0.00|N|O|1997-10-18|1997-11-05|1997-10-25|TAKE BACK RETURN|AIR|kages. quickly expres +50212|250|51|4|18|20704.50|0.03|0.03|N|O|1997-12-01|1997-10-13|1997-12-18|DELIVER IN PERSON|REG AIR|ackages boost after the slyly bold depende +50213|811|11|1|49|83878.69|0.01|0.00|N|O|1997-09-22|1997-08-18|1997-10-22|TAKE BACK RETURN|TRUCK|ully final ideas wake blithely sile +50213|93|44|2|9|8937.81|0.01|0.05|N|O|1997-09-14|1997-09-06|1997-09-27|NONE|RAIL|ely even accounts p +50213|1337|76|3|14|17336.62|0.02|0.00|N|O|1997-07-20|1997-08-26|1997-07-27|COLLECT COD|AIR| even plate +50213|543|44|4|32|46193.28|0.05|0.06|N|O|1997-07-06|1997-08-06|1997-07-07|TAKE BACK RETURN|RAIL|lets cajole about the bli +50213|776|77|5|28|46949.56|0.04|0.01|N|O|1997-08-19|1997-07-21|1997-08-22|COLLECT COD|FOB|counts. acco +50213|1546|67|6|29|41978.66|0.01|0.04|N|O|1997-09-08|1997-08-20|1997-09-14|TAKE BACK RETURN|MAIL|ckages cajole above the final deposits +50213|1351|52|7|49|61365.15|0.03|0.07|N|O|1997-08-20|1997-08-09|1997-09-16|DELIVER IN PERSON|AIR|thely final +50214|7|33|1|47|42629.00|0.04|0.08|A|F|1994-08-31|1994-07-23|1994-09-12|NONE|MAIL|ts nag slyly final, ironic d +50214|959|94|2|21|39058.95|0.07|0.03|A|F|1994-10-03|1994-08-07|1994-10-08|NONE|TRUCK| even accounts against th +50214|1955|88|3|15|27854.25|0.05|0.02|A|F|1994-09-12|1994-08-19|1994-09-29|DELIVER IN PERSON|SHIP|unusual accounts. permane +50214|336|21|4|23|28435.59|0.10|0.02|R|F|1994-07-08|1994-07-22|1994-08-05|COLLECT COD|SHIP| furiously regular pinto beans cajole b +50214|328|57|5|1|1228.32|0.06|0.07|R|F|1994-09-10|1994-09-15|1994-09-21|NONE|FOB|endencies print carefully. furiousl +50214|844|45|6|21|36641.64|0.00|0.07|R|F|1994-07-19|1994-08-03|1994-07-31|DELIVER IN PERSON|REG AIR|ronic packages nag. furiou +50214|1905|6|7|41|74082.90|0.02|0.03|A|F|1994-10-06|1994-08-30|1994-10-23|COLLECT COD|AIR|ajole slyly final instruc +50215|1550|51|1|44|63868.20|0.01|0.06|N|O|1996-06-15|1996-07-11|1996-06-30|NONE|FOB|nal platelets are carefully above the ent +50240|1903|36|1|13|23463.70|0.05|0.06|R|F|1992-04-03|1992-05-04|1992-04-25|TAKE BACK RETURN|SHIP|arefully bold accounts. fluf +50241|485|44|1|24|33251.52|0.09|0.04|N|O|1998-03-19|1998-02-25|1998-04-14|DELIVER IN PERSON|SHIP|arefully among the slyly s +50241|1663|64|2|20|31293.20|0.04|0.08|N|O|1998-01-25|1998-02-03|1998-02-11|NONE|REG AIR|ending accounts. regular deposits are +50241|317|46|3|31|37736.61|0.01|0.05|N|O|1998-04-17|1998-01-24|1998-04-24|NONE|SHIP|e besides the unusual, final accounts-- pi +50241|1497|98|4|10|13984.90|0.04|0.06|N|O|1998-01-25|1998-01-31|1998-02-17|NONE|AIR|cuses; furiously unusual depo +50241|988|57|5|6|11333.88|0.05|0.07|N|O|1998-03-05|1998-03-05|1998-03-25|COLLECT COD|SHIP|ages about th +50241|43|94|6|12|11316.48|0.09|0.04|N|O|1998-01-08|1998-02-18|1998-01-14|COLLECT COD|MAIL|ns according to the final packages haggle f +50241|1495|96|7|3|4189.47|0.04|0.00|N|O|1998-01-25|1998-02-15|1998-01-31|DELIVER IN PERSON|REG AIR|ages boost. sly foxes haggle daringly pen +50242|70|21|1|36|34922.52|0.06|0.06|A|F|1993-07-27|1993-10-02|1993-08-23|TAKE BACK RETURN|SHIP|counts. slyly unusual instruc +50242|154|81|2|17|17920.55|0.05|0.08|R|F|1993-08-10|1993-09-03|1993-09-05|TAKE BACK RETURN|FOB|l deposits haggle closely across t +50242|166|67|3|9|9595.44|0.10|0.07|A|F|1993-11-10|1993-09-28|1993-11-13|TAKE BACK RETURN|AIR|ccounts sleep furiously against the +50242|551|12|4|21|30482.55|0.01|0.07|R|F|1993-08-23|1993-09-15|1993-09-05|COLLECT COD|FOB|ways blithely final f +50242|126|27|5|24|24626.88|0.07|0.04|R|F|1993-08-16|1993-10-15|1993-09-15|NONE|TRUCK|ts. carefully final excuses sleep. special +50242|1043|14|6|20|18880.80|0.06|0.03|A|F|1993-11-01|1993-09-23|1993-11-23|DELIVER IN PERSON|RAIL|sly silent deposits haggle blithely acro +50242|1257|32|7|8|9266.00|0.00|0.04|A|F|1993-10-15|1993-09-07|1993-11-08|TAKE BACK RETURN|SHIP|r sheaves. bold, express deposits +50243|370|55|1|46|58437.02|0.04|0.01|R|F|1994-12-27|1994-11-30|1995-01-16|TAKE BACK RETURN|REG AIR|ld accounts. furiously silent +50244|135|88|1|27|27948.51|0.06|0.05|A|F|1992-07-28|1992-08-27|1992-08-20|DELIVER IN PERSON|RAIL|the deposits. fluffily silent +50245|1618|1|1|19|28872.59|0.10|0.01|N|O|1996-02-03|1996-02-04|1996-02-19|NONE|AIR|s nag. blithely regular foxes sleep along +50245|574|35|2|48|70779.36|0.05|0.04|N|O|1996-01-01|1996-03-22|1996-01-21|NONE|MAIL|posits. slyly regular deposits are boldly +50245|1195|32|3|12|13154.28|0.06|0.05|N|O|1996-01-21|1996-02-10|1996-02-08|COLLECT COD|SHIP|pendencies engage blithely regular +50245|804|4|4|11|18752.80|0.09|0.08|N|O|1996-03-21|1996-01-30|1996-03-24|DELIVER IN PERSON|MAIL|ickly unusual packages. carefull +50245|1547|68|5|40|57941.60|0.09|0.03|N|O|1996-04-09|1996-03-24|1996-04-24|DELIVER IN PERSON|AIR|ckly. deposits use-- final +50246|1665|48|1|49|76766.34|0.06|0.08|R|F|1993-11-22|1993-10-18|1993-12-09|NONE|TRUCK|, bold instructions. pa +50246|1233|45|2|44|49906.12|0.04|0.05|R|F|1993-08-29|1993-10-12|1993-09-02|COLLECT COD|TRUCK| are above the carefully fin +50246|131|84|3|48|49494.24|0.10|0.00|A|F|1993-12-05|1993-10-08|1993-12-19|TAKE BACK RETURN|FOB|ffily final theodolites. +50246|122|23|4|42|42929.04|0.07|0.07|R|F|1993-10-29|1993-10-03|1993-11-02|COLLECT COD|FOB|g requests nag idly above th +50247|138|91|1|35|36334.55|0.03|0.05|N|O|1996-02-05|1996-03-09|1996-02-21|TAKE BACK RETURN|AIR|urts agains +50247|1260|61|2|24|27870.24|0.03|0.01|N|O|1996-05-25|1996-03-22|1996-06-16|COLLECT COD|SHIP|requests are into the regularly fin +50247|1327|4|3|1|1228.32|0.07|0.01|N|O|1996-02-04|1996-03-29|1996-02-05|TAKE BACK RETURN|SHIP|ggle furiously along +50247|1936|69|4|13|23893.09|0.02|0.01|N|O|1996-04-06|1996-04-07|1996-04-30|TAKE BACK RETURN|REG AIR|y even, even accounts. slyly regular depos +50272|667|68|1|1|1567.66|0.06|0.01|A|F|1994-01-11|1993-11-21|1994-02-01|TAKE BACK RETURN|FOB|ng asymptotes ca +50272|233|88|2|22|24931.06|0.09|0.04|R|F|1993-11-24|1993-12-07|1993-12-16|TAKE BACK RETURN|FOB|oxes. enticing reque +50272|356|41|3|5|6281.75|0.06|0.07|R|F|1993-12-02|1993-11-04|1993-12-06|DELIVER IN PERSON|SHIP|notornis. fluffily pending foxes are fu +50272|1732|59|4|39|63715.47|0.00|0.07|A|F|1993-12-05|1993-11-01|1993-12-30|DELIVER IN PERSON|RAIL|old foxes. sometimes special realms us +50273|150|29|1|9|9451.35|0.10|0.05|A|F|1994-05-26|1994-07-01|1994-06-13|DELIVER IN PERSON|FOB|sly. bold instructions ma +50274|538|99|1|20|28770.60|0.02|0.07|N|O|1996-03-07|1996-02-26|1996-03-11|DELIVER IN PERSON|REG AIR|tect furiously busily express dependenc +50274|820|21|2|3|5162.46|0.07|0.08|N|O|1996-02-25|1996-04-07|1996-03-11|TAKE BACK RETURN|SHIP|dependencies cajole slyly +50274|1449|89|3|17|22957.48|0.00|0.04|N|O|1996-04-04|1996-03-25|1996-04-14|COLLECT COD|RAIL|lly regular deposits. slyly +50274|1401|41|4|46|59910.40|0.01|0.08|N|O|1996-03-09|1996-04-02|1996-03-16|TAKE BACK RETURN|RAIL|its nag blithely. carefully regular asymp +50274|681|44|5|49|77502.32|0.09|0.01|N|O|1996-05-12|1996-03-05|1996-05-24|TAKE BACK RETURN|RAIL|uffily regular pinto beans sleep s +50275|292|20|1|35|41730.15|0.10|0.04|R|F|1994-12-11|1995-02-06|1994-12-15|COLLECT COD|TRUCK|le carefully; carefully +50275|849|83|2|13|22747.92|0.07|0.01|A|F|1995-04-04|1995-01-11|1995-04-15|DELIVER IN PERSON|AIR|lly even theodolite +50275|573|74|3|14|20629.98|0.00|0.07|R|F|1995-04-05|1995-02-11|1995-05-05|TAKE BACK RETURN|REG AIR|silent deposits nag agains +50275|103|56|4|2|2006.20|0.06|0.07|A|F|1995-01-11|1995-02-25|1995-02-01|COLLECT COD|REG AIR|ithely regular +50275|969|70|5|16|29919.36|0.04|0.01|A|F|1995-03-20|1995-01-06|1995-03-30|COLLECT COD|RAIL|xpress asymptotes haggle +50275|744|41|6|13|21381.62|0.05|0.08|A|F|1995-02-08|1995-02-20|1995-02-11|TAKE BACK RETURN|TRUCK|es. fluffily ironic packages are f +50276|1179|52|1|39|42126.63|0.07|0.06|R|F|1995-05-16|1995-04-21|1995-06-02|COLLECT COD|MAIL|s requests. regular deposit +50276|1686|87|2|4|6350.72|0.00|0.03|A|F|1995-02-24|1995-04-14|1995-03-15|DELIVER IN PERSON|FOB|ly special theodolites. +50276|1351|90|3|32|40075.20|0.04|0.08|A|F|1995-05-21|1995-03-21|1995-05-26|TAKE BACK RETURN|REG AIR|equests are according to the pendin +50277|1256|57|1|24|27774.00|0.03|0.07|R|F|1995-01-01|1995-01-19|1995-01-12|DELIVER IN PERSON|AIR|usly unusual +50277|855|56|2|13|22826.05|0.04|0.01|R|F|1994-11-25|1994-12-07|1994-12-20|DELIVER IN PERSON|RAIL|. packages sleep quickly carefully speci +50277|762|27|3|49|81475.24|0.04|0.07|A|F|1994-12-08|1994-11-30|1994-12-26|TAKE BACK RETURN|RAIL|gedly express dolphins sl +50277|1377|54|4|20|25567.40|0.05|0.00|R|F|1994-12-15|1995-01-02|1995-01-06|TAKE BACK RETURN|SHIP|olites wake blithely. quickly cl +50278|1433|51|1|7|9341.01|0.09|0.04|R|F|1993-07-22|1993-07-02|1993-08-08|TAKE BACK RETURN|REG AIR|sts across the slyly final reque +50278|314|43|2|14|17000.34|0.04|0.01|R|F|1993-08-05|1993-08-06|1993-09-04|DELIVER IN PERSON|REG AIR|es haggle. slyly regular platelets nag c +50278|569|70|3|39|57312.84|0.00|0.02|R|F|1993-07-30|1993-07-15|1993-08-22|COLLECT COD|REG AIR| to the regular packages. +50279|832|32|1|44|76244.52|0.04|0.05|R|F|1994-12-10|1995-01-07|1994-12-23|TAKE BACK RETURN|SHIP|ckages boost slyly. even instructions are s +50279|1879|9|2|4|7123.48|0.08|0.02|R|F|1995-02-09|1995-02-03|1995-03-04|COLLECT COD|FOB|e unusual acco +50304|72|48|1|27|26245.89|0.10|0.00|R|F|1993-04-04|1993-03-21|1993-04-07|NONE|RAIL|regular dolphins. fu +50304|272|100|2|48|56268.96|0.07|0.06|R|F|1993-04-09|1993-04-08|1993-04-16|TAKE BACK RETURN|SHIP|ic deposits wake. furiously regular plat +50304|1848|49|3|14|24497.76|0.06|0.01|A|F|1993-02-23|1993-03-19|1993-03-21|DELIVER IN PERSON|SHIP|the carefully silent deposits int +50305|1557|38|1|27|39380.85|0.00|0.07|A|F|1994-03-12|1994-05-01|1994-03-18|TAKE BACK RETURN|AIR|en packages +50305|1996|97|2|42|79715.58|0.02|0.00|A|F|1994-03-01|1994-03-16|1994-03-19|TAKE BACK RETURN|SHIP|osits along the platelets mold sl +50306|632|33|1|7|10728.41|0.08|0.01|N|O|1995-07-13|1995-06-22|1995-08-07|TAKE BACK RETURN|SHIP|eodolites sleep. idly special dep +50306|1330|31|2|7|8619.31|0.00|0.08|N|O|1995-09-12|1995-07-25|1995-09-26|DELIVER IN PERSON|TRUCK|pades wake carefully. slyly regular a +50306|89|65|3|24|23737.92|0.10|0.04|N|O|1995-07-25|1995-08-06|1995-08-20|NONE|AIR|eans. requests will haggle slyly among +50307|1895|25|1|15|26953.35|0.03|0.05|R|F|1993-12-24|1993-12-27|1994-01-03|DELIVER IN PERSON|AIR|phins sleep blithely reg +50307|762|59|2|35|58196.60|0.07|0.00|R|F|1993-11-25|1993-12-23|1993-12-24|NONE|TRUCK|ically bold instructions about +50307|1935|68|3|40|73477.20|0.10|0.01|R|F|1993-11-03|1994-01-06|1993-12-01|TAKE BACK RETURN|AIR|ffily after the regularly blithe ideas. bl +50307|810|77|4|20|34216.20|0.09|0.07|A|F|1993-12-31|1993-12-29|1994-01-01|COLLECT COD|REG AIR|final theodolites nag stealth +50307|824|91|5|43|74167.26|0.07|0.06|A|F|1994-01-30|1993-12-19|1994-02-05|COLLECT COD|FOB|s wake fur +50307|85|61|6|1|985.08|0.10|0.05|R|F|1993-11-23|1993-12-23|1993-11-29|COLLECT COD|SHIP|lent escap +50307|98|74|7|2|1996.18|0.01|0.05|R|F|1993-11-04|1993-11-25|1993-11-25|COLLECT COD|FOB|nding instructions. blithely fin +50308|1599|20|1|5|7502.95|0.08|0.03|R|F|1993-01-04|1992-12-26|1993-01-18|COLLECT COD|SHIP|ss the final accounts. furiously pending +50308|760|57|2|16|26572.16|0.03|0.08|R|F|1992-10-27|1993-01-11|1992-11-08|NONE|SHIP|gular packag +50308|932|33|3|34|62319.62|0.07|0.03|R|F|1993-01-18|1992-12-28|1993-02-13|DELIVER IN PERSON|FOB|fully special deposi +50308|217|18|4|29|32399.09|0.02|0.01|A|F|1992-12-14|1992-12-01|1993-01-04|COLLECT COD|MAIL|beans sleep sl +50308|1708|51|5|29|46681.30|0.01|0.03|A|F|1993-01-05|1993-01-01|1993-01-18|DELIVER IN PERSON|REG AIR|c requests cajole carefu +50308|1553|94|6|18|26181.90|0.07|0.08|R|F|1992-12-05|1992-11-18|1992-12-27|DELIVER IN PERSON|REG AIR|ffily final requests. slyly bol +50308|8|9|7|21|19068.00|0.09|0.08|A|F|1992-12-24|1993-01-01|1993-01-21|DELIVER IN PERSON|RAIL|l courts cajole carefully alo +50309|452|53|1|5|6762.25|0.02|0.07|A|F|1995-05-10|1995-05-24|1995-05-20|TAKE BACK RETURN|AIR|sits wake furiousl +50309|183|10|2|48|51992.64|0.01|0.02|N|O|1995-06-23|1995-05-27|1995-07-09|TAKE BACK RETURN|RAIL|ithely special, final orbits. regular, fi +50309|114|15|3|35|35493.85|0.00|0.01|R|F|1995-03-25|1995-04-23|1995-04-06|NONE|MAIL|onic packa +50310|133|34|1|8|8265.04|0.08|0.08|R|F|1994-09-16|1994-09-18|1994-09-21|TAKE BACK RETURN|RAIL|ymptotes wake according to the +50310|319|4|2|29|35359.99|0.07|0.07|A|F|1994-10-31|1994-10-28|1994-11-28|COLLECT COD|FOB|lphins wake fluffily. even atta +50310|55|56|3|47|44887.35|0.01|0.04|A|F|1994-11-18|1994-11-14|1994-12-15|COLLECT COD|REG AIR|y final foxes. final, express theodolites a +50310|1864|65|4|41|72400.26|0.02|0.05|R|F|1994-08-28|1994-10-08|1994-09-11|COLLECT COD|FOB|anent accounts. bold realms wake acr +50310|665|66|5|43|67323.38|0.02|0.00|A|F|1994-11-01|1994-11-13|1994-11-07|DELIVER IN PERSON|SHIP|the carefully special accounts. careful +50310|1581|62|6|24|35581.92|0.02|0.07|A|F|1994-12-10|1994-09-17|1995-01-09|DELIVER IN PERSON|FOB|at alongside of the pending deposits! +50310|1651|75|7|8|12421.20|0.06|0.04|A|F|1994-11-07|1994-10-18|1994-11-29|TAKE BACK RETURN|TRUCK|he courts-- ideas integrate. f +50311|283|65|1|33|39048.24|0.03|0.05|N|O|1996-04-20|1996-05-07|1996-05-12|TAKE BACK RETURN|MAIL|efore the carefully regular accounts s +50311|859|26|2|49|86232.65|0.09|0.03|N|O|1996-03-01|1996-04-01|1996-03-23|NONE|TRUCK|onic dolphins cajole quickly carefully i +50311|391|76|3|50|64569.50|0.10|0.06|N|O|1996-02-23|1996-04-15|1996-03-14|TAKE BACK RETURN|TRUCK| to the pla +50311|1468|8|4|49|67103.54|0.08|0.04|N|O|1996-03-28|1996-03-20|1996-04-20|TAKE BACK RETURN|FOB|fily bold fo +50311|1635|77|5|8|12293.04|0.08|0.00|N|O|1996-04-19|1996-03-24|1996-05-17|COLLECT COD|MAIL|counts? carefully final requests +50311|574|65|6|40|58982.80|0.10|0.01|N|O|1996-05-21|1996-05-02|1996-06-07|COLLECT COD|RAIL|ess, final excuse +50336|267|49|1|25|29181.50|0.10|0.02|A|F|1995-01-06|1994-12-23|1995-01-12|DELIVER IN PERSON|SHIP|tes wake carefully. furious theodolites ca +50336|1462|2|2|23|31359.58|0.00|0.08|A|F|1994-11-29|1994-12-29|1994-12-29|DELIVER IN PERSON|AIR|ironic pinto beans cajole +50336|597|98|3|32|47922.88|0.05|0.05|A|F|1995-01-23|1994-12-10|1995-02-09|DELIVER IN PERSON|SHIP|usual package +50337|802|36|1|48|81734.40|0.02|0.00|R|F|1994-05-08|1994-05-30|1994-05-09|DELIVER IN PERSON|SHIP|ular deposits wake from the s +50337|1786|71|2|4|6751.12|0.07|0.00|R|F|1994-04-19|1994-05-26|1994-05-17|DELIVER IN PERSON|RAIL|ests haggle blithely. regula +50337|1840|70|3|5|8709.20|0.08|0.01|A|F|1994-07-24|1994-05-18|1994-08-05|NONE|FOB| unusual instructions eat. slyl +50337|1468|69|4|7|9586.22|0.04|0.02|A|F|1994-07-16|1994-05-17|1994-08-15|NONE|TRUCK|ke blithely unusua +50337|1467|46|5|18|24632.28|0.01|0.08|R|F|1994-05-03|1994-06-07|1994-05-19|DELIVER IN PERSON|SHIP| pending, unusual ideas along +50337|1599|40|6|41|61524.19|0.04|0.07|A|F|1994-08-14|1994-06-03|1994-09-13|COLLECT COD|FOB| theodolites +50338|1604|87|1|7|10539.20|0.06|0.03|A|F|1994-03-28|1994-04-29|1994-04-16|NONE|REG AIR| cajole furiously. even, spec +50338|1932|65|2|38|69689.34|0.02|0.00|R|F|1994-04-02|1994-05-28|1994-04-30|COLLECT COD|SHIP|ng to the bold packages ca +50339|1389|90|1|28|36130.64|0.00|0.05|R|F|1994-02-23|1994-02-21|1994-03-23|COLLECT COD|REG AIR|furiously. even ideas +50339|740|5|2|23|37737.02|0.00|0.07|A|F|1994-01-29|1994-03-02|1994-02-06|NONE|RAIL| theodolites lose furiously fluffi +50339|1651|75|3|18|27947.70|0.02|0.01|A|F|1994-01-22|1994-03-04|1994-02-19|COLLECT COD|RAIL|counts hinder sometimes ironic depen +50340|778|79|1|40|67150.80|0.00|0.08|N|O|1997-04-18|1997-03-01|1997-05-05|COLLECT COD|TRUCK|e ironic, expr +50340|36|87|2|41|38377.23|0.07|0.04|N|O|1997-03-11|1997-03-19|1997-03-15|COLLECT COD|TRUCK|sits sleep carefully even foxes. reg +50340|1220|21|3|12|13454.64|0.05|0.06|N|O|1997-04-07|1997-03-06|1997-04-13|DELIVER IN PERSON|AIR|uriously bold +50340|1852|53|4|49|85938.65|0.02|0.00|N|O|1997-01-17|1997-03-07|1997-02-14|NONE|RAIL|he furiously careful accounts +50340|1778|5|5|8|13438.16|0.06|0.07|N|O|1997-04-07|1997-02-22|1997-04-18|TAKE BACK RETURN|TRUCK|n requests after the quickly unusual reques +50340|1341|18|6|48|59632.32|0.09|0.08|N|O|1997-03-30|1997-02-22|1997-04-10|DELIVER IN PERSON|AIR|s. careful +50340|1999|88|7|21|39920.79|0.03|0.06|N|O|1997-03-01|1997-04-03|1997-03-26|COLLECT COD|FOB| theodolites n +50341|595|86|1|43|64310.37|0.09|0.06|N|O|1998-04-16|1998-05-01|1998-05-08|COLLECT COD|SHIP|eodolites. bold accounts are carefully +50342|722|23|1|2|3245.44|0.00|0.06|A|F|1994-12-13|1994-12-07|1994-12-24|DELIVER IN PERSON|TRUCK|onic asymptotes use fluffi +50342|1100|36|2|18|18019.80|0.10|0.08|R|F|1994-12-27|1995-01-22|1995-01-18|TAKE BACK RETURN|SHIP|cies. furiously even braids +50342|491|21|3|2|2782.98|0.07|0.00|A|F|1994-11-12|1994-12-04|1994-11-18|NONE|SHIP|lently even instru +50342|718|15|4|45|72841.95|0.02|0.07|A|F|1995-02-01|1994-12-23|1995-02-17|DELIVER IN PERSON|SHIP|r accounts wake +50342|700|32|5|29|46420.30|0.09|0.04|R|F|1994-11-12|1994-12-20|1994-12-06|DELIVER IN PERSON|SHIP|ickly ironic +50342|1858|2|6|31|54555.35|0.06|0.04|A|F|1994-12-28|1995-01-20|1995-01-15|TAKE BACK RETURN|FOB|odolites. slyly ironic +50343|173|26|1|32|34341.44|0.06|0.05|N|O|1998-07-12|1998-06-06|1998-07-17|COLLECT COD|MAIL|osits. slyly +50343|378|7|2|24|30680.88|0.04|0.05|N|O|1998-05-17|1998-05-15|1998-06-11|COLLECT COD|SHIP|instructions w +50343|1102|11|3|14|14043.40|0.05|0.00|N|O|1998-03-26|1998-05-12|1998-03-30|TAKE BACK RETURN|RAIL| bold accounts dazzle +50368|1706|7|1|19|30546.30|0.04|0.04|R|F|1992-09-18|1992-10-01|1992-09-19|COLLECT COD|RAIL|accounts. express foxes haggl +50369|685|86|1|45|71355.60|0.10|0.00|N|O|1998-05-23|1998-04-21|1998-06-09|TAKE BACK RETURN|TRUCK|t the regular excuses. furiously +50369|1358|73|2|3|3778.05|0.01|0.01|N|O|1998-04-04|1998-03-28|1998-04-22|COLLECT COD|REG AIR|. fluffily even courts hi +50369|885|86|3|43|76792.84|0.05|0.02|N|O|1998-05-27|1998-04-10|1998-06-07|NONE|AIR| blithely ironic pinto beans cajole slyly a +50369|759|56|4|45|74688.75|0.02|0.04|N|O|1998-03-11|1998-04-29|1998-04-07|TAKE BACK RETURN|RAIL|gside of the courts h +50369|2000|89|5|9|8118.00|0.02|0.02|N|O|1998-02-16|1998-04-30|1998-03-04|DELIVER IN PERSON|AIR|ven requests. unusual instr +50369|1981|14|6|6|11297.88|0.05|0.07|N|O|1998-06-05|1998-04-08|1998-06-11|DELIVER IN PERSON|MAIL|egular deposits wake fur +50370|1279|80|1|42|49571.34|0.10|0.03|R|F|1993-02-17|1993-02-05|1993-03-17|NONE|AIR| blithely pending sauternes haggle furi +50370|425|84|2|30|39762.60|0.02|0.01|A|F|1993-02-15|1993-02-02|1993-03-16|COLLECT COD|MAIL|y even deposits. q +50371|1653|77|1|45|69959.25|0.04|0.08|R|F|1994-08-31|1994-09-19|1994-09-26|COLLECT COD|REG AIR|ding theodolites eat +50371|1048|84|2|8|7592.32|0.06|0.08|R|F|1994-09-30|1994-09-01|1994-10-27|DELIVER IN PERSON|RAIL|ructions sleep quickly furious +50371|1286|24|3|43|51053.04|0.03|0.06|R|F|1994-08-23|1994-08-15|1994-09-08|DELIVER IN PERSON|MAIL|efully unusual platele +50371|1624|7|4|1|1525.62|0.01|0.01|A|F|1994-10-17|1994-08-19|1994-11-13|NONE|SHIP|ctions. final pinto beans alo +50371|1553|74|5|32|46545.60|0.05|0.07|A|F|1994-07-27|1994-09-21|1994-08-03|TAKE BACK RETURN|AIR|bold requests haggle b +50372|875|76|1|5|8879.35|0.08|0.00|N|O|1997-05-27|1997-04-24|1997-06-26|TAKE BACK RETURN|SHIP| beans cajole against the pending a +50372|1095|66|2|34|33867.06|0.08|0.01|N|O|1997-04-07|1997-06-13|1997-04-23|NONE|FOB|ven requests sleep fluffi +50373|1379|94|1|19|24327.03|0.02|0.01|R|F|1994-09-21|1994-08-20|1994-10-20|NONE|AIR|al, regular frets boost slyly bold pac +50373|1660|43|2|44|68713.04|0.01|0.05|R|F|1994-07-12|1994-09-15|1994-08-04|NONE|FOB|ag carefully. regular, ironic pinto beans +50373|1270|71|3|47|55049.69|0.02|0.07|A|F|1994-10-16|1994-09-24|1994-11-04|COLLECT COD|AIR|ly. packages de +50373|1044|50|4|45|42526.80|0.05|0.00|R|F|1994-07-10|1994-09-15|1994-07-16|NONE|SHIP|ts run blithely +50373|1309|24|5|8|9682.40|0.09|0.08|R|F|1994-10-17|1994-09-28|1994-11-09|NONE|FOB|. furiously ironic +50373|415|3|6|8|10523.28|0.00|0.04|R|F|1994-09-10|1994-08-25|1994-09-15|COLLECT COD|TRUCK|ncies doze. deposits sleep furious +50373|1279|91|7|30|35408.10|0.08|0.01|R|F|1994-07-14|1994-10-01|1994-07-22|NONE|REG AIR|dolites haggle furiously fluf +50374|940|41|1|26|47864.44|0.00|0.05|R|F|1994-07-28|1994-07-02|1994-07-30|NONE|RAIL|pending, regular pinto +50374|622|16|2|39|59382.18|0.05|0.08|A|F|1994-06-06|1994-07-23|1994-07-02|NONE|REG AIR| accounts. court +50374|1529|50|3|16|22888.32|0.03|0.06|R|F|1994-06-30|1994-08-28|1994-07-06|TAKE BACK RETURN|MAIL|ets. even pack +50375|3|79|1|36|32508.00|0.10|0.01|N|O|1996-09-15|1996-09-03|1996-09-24|NONE|MAIL|e. blithely final deposi +50375|1416|56|2|5|6587.05|0.02|0.04|N|O|1996-08-15|1996-09-22|1996-09-13|DELIVER IN PERSON|REG AIR|ackages. even, regular accounts agai +50375|1069|75|3|35|33952.10|0.00|0.01|N|O|1996-11-04|1996-08-08|1996-11-27|COLLECT COD|FOB|s sleep alongside +50375|982|83|4|46|86617.08|0.02|0.06|N|O|1996-09-06|1996-08-19|1996-09-27|COLLECT COD|MAIL|apades sleep sometimes slyly +50375|1099|35|5|42|42003.78|0.08|0.08|N|O|1996-09-21|1996-09-29|1996-09-29|DELIVER IN PERSON|SHIP|the ironic theodolites haggl +50400|1519|100|1|28|39774.28|0.06|0.04|R|F|1992-09-10|1992-09-22|1992-09-20|NONE|AIR| packages-- carefully special accoun +50400|1107|44|2|45|45364.50|0.02|0.08|R|F|1992-09-19|1992-09-24|1992-10-18|TAKE BACK RETURN|REG AIR|ully final requests: +50401|168|95|1|23|24567.68|0.05|0.06|N|O|1998-01-14|1998-02-11|1998-02-08|NONE|RAIL|e quickly fina +50402|773|6|1|41|68624.57|0.10|0.03|N|O|1998-03-20|1998-02-22|1998-03-21|COLLECT COD|MAIL|cajole across the pending pinto beans. pen +50402|159|12|2|17|18005.55|0.07|0.05|N|O|1998-03-15|1998-02-26|1998-04-01|TAKE BACK RETURN|SHIP|unts? busy +50402|168|47|3|10|10681.60|0.07|0.04|N|O|1998-04-06|1998-01-20|1998-04-09|NONE|SHIP|slyly entici +50402|306|7|4|41|49458.30|0.01|0.01|N|O|1998-01-08|1998-03-05|1998-01-31|NONE|AIR|inal requests. slow, unusual plate +50402|363|64|5|39|49271.04|0.02|0.03|N|O|1998-01-09|1998-02-26|1998-01-20|TAKE BACK RETURN|TRUCK|kages. express, even deposits w +50403|1713|40|1|29|46826.59|0.04|0.04|A|F|1992-08-23|1992-07-04|1992-09-17|COLLECT COD|SHIP|always unusual instructi +50403|276|31|2|36|42345.72|0.06|0.00|R|F|1992-08-19|1992-07-29|1992-09-14|COLLECT COD|SHIP|ests haggle blithely dogged account +50403|609|10|3|24|36230.40|0.02|0.05|A|F|1992-08-15|1992-08-04|1992-09-05|NONE|MAIL|bout the regular dependen +50403|83|9|4|15|14746.20|0.10|0.00|A|F|1992-09-10|1992-07-19|1992-09-24|DELIVER IN PERSON|REG AIR|sts nag blithely slyly f +50403|1374|13|5|18|22956.66|0.01|0.07|A|F|1992-08-06|1992-07-26|1992-08-22|NONE|TRUCK|ourts believe silently blithe +50404|75|76|1|38|37052.66|0.01|0.01|A|F|1995-05-14|1995-06-24|1995-05-24|TAKE BACK RETURN|AIR|luffily bold requests. slyly +50404|1591|12|2|47|70151.73|0.10|0.04|A|F|1995-04-24|1995-06-17|1995-05-08|NONE|TRUCK|egular ideas across th +50404|1388|3|3|7|9025.66|0.00|0.07|R|F|1995-05-10|1995-06-02|1995-05-23|DELIVER IN PERSON|REG AIR| cajole slyl +50404|783|16|4|31|52197.18|0.03|0.00|R|F|1995-04-07|1995-05-30|1995-04-26|COLLECT COD|AIR|at carefully final e +50404|89|90|5|34|33628.72|0.05|0.05|R|F|1995-04-05|1995-05-12|1995-04-22|COLLECT COD|AIR|nic deposit +50405|577|78|1|37|54670.09|0.10|0.02|N|O|1995-08-29|1995-08-19|1995-09-24|NONE|REG AIR| even, special dolphins wake fl +50405|880|80|2|50|89044.00|0.00|0.02|N|O|1995-09-03|1995-09-10|1995-09-22|COLLECT COD|REG AIR|ual theodolites a +50405|1729|72|3|41|66859.52|0.10|0.02|N|O|1995-07-09|1995-09-30|1995-07-18|COLLECT COD|AIR| deposits sleep furiously. carefully +50405|1675|99|4|16|25226.72|0.08|0.02|N|O|1995-09-30|1995-09-08|1995-10-16|TAKE BACK RETURN|FOB|as. fluffily ironic pinto beans haggle sl +50405|375|4|5|10|12753.70|0.04|0.04|N|O|1995-07-24|1995-09-17|1995-07-28|DELIVER IN PERSON|MAIL|fily special reque +50405|1084|20|6|34|33492.72|0.07|0.01|N|O|1995-10-28|1995-09-03|1995-11-17|NONE|FOB|, bold foxes are slyly ac +50406|1640|82|1|29|44707.56|0.07|0.02|N|O|1996-01-22|1996-02-04|1996-02-14|DELIVER IN PERSON|FOB|special requests dete +50406|1870|57|2|8|14174.96|0.08|0.00|N|O|1996-02-15|1996-03-08|1996-02-22|DELIVER IN PERSON|RAIL|mise. foxes across the furiously +50407|1798|25|1|49|83289.71|0.10|0.02|R|F|1993-08-26|1993-07-22|1993-08-28|TAKE BACK RETURN|RAIL|l pinto beans +50432|1394|71|1|12|15544.68|0.00|0.03|A|F|1994-09-08|1994-08-24|1994-09-29|NONE|TRUCK|es cajole according to the blithely iron +50432|715|16|2|6|9694.26|0.01|0.00|R|F|1994-10-04|1994-09-02|1994-10-07|COLLECT COD|MAIL| courts are. quickly ev +50432|349|78|3|49|61217.66|0.02|0.02|A|F|1994-07-03|1994-09-04|1994-07-08|DELIVER IN PERSON|MAIL|egrate carefully expr +50432|814|48|4|18|30866.58|0.05|0.01|R|F|1994-09-16|1994-07-15|1994-10-06|DELIVER IN PERSON|SHIP| final escapades nag fu +50432|1355|56|5|27|33921.45|0.05|0.07|A|F|1994-06-10|1994-09-06|1994-06-25|DELIVER IN PERSON|REG AIR|ar ideas haggle. ironic, p +50432|1136|45|6|8|8297.04|0.01|0.03|R|F|1994-08-07|1994-08-29|1994-08-30|DELIVER IN PERSON|FOB|g deposits wake quic +50433|1366|5|1|49|62100.64|0.03|0.01|A|F|1992-04-25|1992-03-10|1992-05-07|DELIVER IN PERSON|SHIP| courts. even theodolites boost. +50433|594|85|2|38|56794.42|0.10|0.07|R|F|1992-04-11|1992-03-06|1992-05-07|DELIVER IN PERSON|FOB|ironic deposits +50433|1987|20|3|19|35890.62|0.10|0.08|R|F|1992-04-29|1992-02-28|1992-05-08|DELIVER IN PERSON|MAIL| blithely even de +50433|1379|56|4|20|25607.40|0.02|0.02|A|F|1992-01-24|1992-04-04|1992-02-06|COLLECT COD|MAIL|platelets. slyly even re +50433|1674|75|5|50|78783.50|0.06|0.01|A|F|1992-03-22|1992-03-09|1992-04-19|COLLECT COD|REG AIR|equests. packages integrate blithely ca +50433|925|28|6|46|83992.32|0.06|0.03|A|F|1992-01-31|1992-03-12|1992-02-11|NONE|REG AIR|dolites? blithely r +50434|1665|48|1|40|62666.40|0.07|0.00|A|F|1993-02-07|1993-03-04|1993-02-14|TAKE BACK RETURN|TRUCK|r requests. pinto beans ar +50434|73|24|2|35|34057.45|0.09|0.06|R|F|1993-04-14|1993-02-20|1993-05-08|COLLECT COD|TRUCK|ages. special, special patterns across +50435|18|44|1|13|11934.13|0.07|0.08|N|O|1997-09-07|1997-07-14|1997-10-04|COLLECT COD|MAIL| the furiously e +50435|917|20|2|3|5453.73|0.04|0.04|N|O|1997-08-23|1997-08-07|1997-09-12|DELIVER IN PERSON|RAIL|ding to the blithely regular requests caj +50435|623|86|3|29|44184.98|0.00|0.08|N|O|1997-09-30|1997-07-24|1997-10-22|TAKE BACK RETURN|TRUCK|ess requests. bold pinto beans are slyly +50436|1530|11|1|2|2863.06|0.03|0.06|A|F|1992-10-14|1992-10-23|1992-11-04|NONE|TRUCK|sual platelets wake carefully +50437|812|46|1|23|39394.63|0.06|0.01|N|O|1997-04-08|1997-03-25|1997-04-26|DELIVER IN PERSON|SHIP| quickly ironic +50437|180|81|2|17|18363.06|0.07|0.03|N|O|1997-06-02|1997-04-19|1997-06-13|NONE|REG AIR|quickly pending dugouts. accounts sl +50437|1942|43|3|33|60850.02|0.08|0.01|N|O|1997-02-26|1997-04-05|1997-03-11|COLLECT COD|SHIP|usly ironic theodolites sleep iro +50437|1153|54|4|35|36895.25|0.09|0.00|N|O|1997-02-22|1997-04-27|1997-03-03|COLLECT COD|FOB|posits. slyly ironic dependencies nag. pa +50437|394|79|5|16|20710.24|0.09|0.03|N|O|1997-06-06|1997-05-01|1997-06-27|TAKE BACK RETURN|AIR|quests! carefully re +50438|1321|98|1|7|8556.24|0.09|0.00|N|O|1996-10-15|1996-09-19|1996-11-13|TAKE BACK RETURN|MAIL|xes haggle boldly within the furious +50439|805|5|1|42|71643.60|0.05|0.05|N|O|1998-06-01|1998-06-12|1998-06-14|NONE|FOB|nding deposits. silen +50439|200|1|2|27|29705.40|0.03|0.02|N|O|1998-03-29|1998-06-14|1998-04-26|COLLECT COD|RAIL|its detect sl +50439|895|95|3|2|3591.78|0.01|0.07|N|O|1998-04-23|1998-05-22|1998-05-03|NONE|TRUCK|longside of the requests run furiously ac +50439|1927|28|4|46|84130.32|0.07|0.08|N|O|1998-07-14|1998-06-02|1998-08-02|DELIVER IN PERSON|FOB|ly regular, special foxes. fluffily bold d +50439|746|11|5|33|54342.42|0.05|0.03|N|O|1998-06-07|1998-04-26|1998-06-19|TAKE BACK RETURN|RAIL|ly even asymptotes. ironi +50439|1499|39|6|4|5601.96|0.06|0.08|N|O|1998-06-19|1998-05-12|1998-07-03|TAKE BACK RETURN|REG AIR|y, special requests haggle quickly final +50439|214|96|7|5|5571.05|0.04|0.03|N|O|1998-07-20|1998-05-04|1998-08-04|DELIVER IN PERSON|REG AIR|oost blithely. carefull +50464|1878|65|1|9|16018.83|0.00|0.01|N|O|1995-12-24|1995-11-01|1995-12-31|DELIVER IN PERSON|SHIP|n foxes integ +50465|71|47|1|5|4855.35|0.03|0.02|N|O|1995-07-09|1995-05-24|1995-07-14|NONE|MAIL|quickly. inst +50465|1797|98|2|47|79843.13|0.09|0.05|R|F|1995-04-21|1995-05-24|1995-05-14|DELIVER IN PERSON|SHIP|into beans haggle quickly slyly regu +50465|1862|63|3|8|14110.88|0.10|0.08|A|F|1995-05-10|1995-05-09|1995-05-27|COLLECT COD|REG AIR|he slyly regular d +50465|45|96|4|38|35911.52|0.02|0.07|N|F|1995-06-10|1995-06-02|1995-07-05|NONE|TRUCK|e carefully special requests sleep theod +50465|1364|3|5|32|40491.52|0.06|0.05|N|O|1995-06-27|1995-05-18|1995-07-02|TAKE BACK RETURN|TRUCK|st the slyly bold foxes +50466|965|34|1|3|5597.88|0.04|0.07|R|F|1992-08-24|1992-09-05|1992-09-18|NONE|RAIL|uests are slyly after the instructi +50466|1269|44|2|32|37448.32|0.03|0.06|A|F|1992-07-14|1992-09-17|1992-07-29|DELIVER IN PERSON|MAIL| theodolite +50466|496|26|3|21|29326.29|0.09|0.07|A|F|1992-09-30|1992-09-20|1992-10-02|COLLECT COD|RAIL|sly silent dolphins. furiously +50467|1332|33|1|34|41933.22|0.04|0.00|N|O|1998-09-05|1998-07-11|1998-09-21|DELIVER IN PERSON|AIR|nly final excuses according to the +50467|1404|5|2|16|20886.40|0.07|0.05|N|O|1998-09-06|1998-07-21|1998-09-30|COLLECT COD|SHIP|arefully. ideas wake carefully among th +50467|1509|90|3|5|7052.50|0.04|0.02|N|O|1998-08-13|1998-08-06|1998-08-27|TAKE BACK RETURN|RAIL|y among the carefully ironic +50467|495|54|4|30|41864.70|0.00|0.02|N|O|1998-09-17|1998-08-28|1998-10-01|COLLECT COD|FOB|d requests believe carefully. ironic, ir +50467|371|72|5|31|39412.47|0.04|0.08|N|O|1998-08-27|1998-08-22|1998-08-28|COLLECT COD|TRUCK|-- carefully careful requests along +50468|1470|71|1|37|50744.39|0.01|0.02|A|F|1992-03-17|1992-05-01|1992-04-16|TAKE BACK RETURN|REG AIR|ckey players are slyly against +50468|11|37|2|8|7288.08|0.03|0.03|R|F|1992-02-22|1992-04-10|1992-03-20|DELIVER IN PERSON|AIR|al ideas. deposits above the +50469|158|85|1|18|19046.70|0.09|0.08|A|F|1993-08-31|1993-08-30|1993-09-14|TAKE BACK RETURN|RAIL|e final, regular foxes. fluffily expr +50469|1164|73|2|1|1065.16|0.09|0.07|R|F|1993-10-15|1993-08-05|1993-11-02|COLLECT COD|RAIL|lar deposits. always regular pack +50469|937|38|3|29|53299.97|0.09|0.08|R|F|1993-07-22|1993-08-20|1993-07-23|TAKE BACK RETURN|AIR|ironic packa +50469|65|41|4|28|27021.68|0.09|0.08|A|F|1993-08-03|1993-09-07|1993-08-21|TAKE BACK RETURN|MAIL|carefully quick +50469|1520|21|5|49|69654.48|0.03|0.06|A|F|1993-10-11|1993-09-16|1993-10-14|NONE|SHIP|ily. deposits wake car +50470|1871|15|1|45|79779.15|0.07|0.05|A|F|1993-08-31|1993-11-07|1993-09-16|NONE|AIR|ackages nag among the +50470|499|29|2|49|68575.01|0.01|0.01|R|F|1993-12-07|1993-11-09|1993-12-25|COLLECT COD|SHIP|deas are slyly. pending dinos ca +50470|111|38|3|7|7077.77|0.06|0.08|A|F|1993-11-13|1993-10-07|1993-12-11|COLLECT COD|SHIP|final foxes. carefully regular +50470|1801|88|4|20|34056.00|0.06|0.04|R|F|1993-08-28|1993-09-27|1993-09-12|TAKE BACK RETURN|FOB|bout the quickly unusual p +50470|782|47|5|30|50483.40|0.01|0.06|R|F|1993-09-04|1993-10-01|1993-10-03|DELIVER IN PERSON|SHIP|regular ac +50470|866|33|6|42|74208.12|0.09|0.07|A|F|1993-11-06|1993-10-04|1993-11-21|COLLECT COD|FOB|he boldly ironi +50471|229|57|1|36|40651.92|0.07|0.03|A|F|1992-03-08|1992-03-12|1992-03-24|COLLECT COD|AIR|ously regular requests. +50496|1066|72|1|2|1934.12|0.10|0.04|A|F|1994-08-15|1994-11-07|1994-08-26|NONE|FOB|the ironic idea +50496|1167|4|2|16|17090.56|0.01|0.05|R|F|1994-12-08|1994-10-10|1994-12-20|DELIVER IN PERSON|TRUCK|iously again +50496|1182|19|3|32|34661.76|0.00|0.05|A|F|1994-11-08|1994-09-21|1994-11-26|TAKE BACK RETURN|MAIL|xcuses. ironic courts amo +50497|1460|100|1|35|47651.10|0.03|0.01|N|O|1996-04-16|1996-06-20|1996-04-20|TAKE BACK RETURN|RAIL|eposits wake blithely final deposit +50497|887|88|2|14|25030.32|0.03|0.04|N|O|1996-04-24|1996-06-27|1996-05-12|TAKE BACK RETURN|FOB|eposits. pinto beans us +50497|437|38|3|42|56172.06|0.04|0.00|N|O|1996-06-03|1996-06-16|1996-06-07|COLLECT COD|SHIP| haggle slyly after the deposit +50498|1|77|1|32|28832.00|0.10|0.08|N|O|1997-07-29|1997-06-22|1997-08-04|COLLECT COD|REG AIR|lar packages. slyly ir +50498|1561|62|2|7|10237.92|0.01|0.02|N|O|1997-09-01|1997-07-31|1997-09-29|COLLECT COD|TRUCK|sly. regular accounts cajole. pend +50498|458|17|3|35|47545.75|0.06|0.02|N|O|1997-08-24|1997-07-06|1997-08-26|NONE|FOB|cuses. slyly regular notornis sle +50499|951|54|1|19|35187.05|0.02|0.05|N|O|1995-12-22|1996-01-04|1996-01-19|TAKE BACK RETURN|REG AIR|s. regular packages cajole blithe +50499|277|32|2|19|22368.13|0.00|0.07|N|O|1995-12-23|1995-12-12|1995-12-29|COLLECT COD|RAIL|onic dolphi +50499|1621|45|3|15|22839.30|0.08|0.00|N|O|1995-10-18|1995-12-30|1995-11-13|NONE|TRUCK| ironic dependencies +50499|1887|31|4|23|41144.24|0.09|0.06|N|O|1995-12-19|1995-11-24|1996-01-17|COLLECT COD|SHIP|ess packages. fluffily ironic pin +50499|2|78|5|35|31570.00|0.06|0.03|N|O|1995-11-23|1995-12-07|1995-12-15|TAKE BACK RETURN|TRUCK|atelets according to the ironic, iro +50499|730|31|6|18|29353.14|0.07|0.06|N|O|1995-12-13|1996-01-05|1995-12-16|NONE|RAIL|al platelets cajol +50500|738|39|1|39|63910.47|0.00|0.04|N|O|1995-11-22|1995-11-30|1995-11-25|NONE|RAIL| deposits. furiously unus +50500|1878|22|2|46|81874.02|0.10|0.05|N|O|1995-10-27|1995-11-24|1995-11-11|DELIVER IN PERSON|AIR|. furiously special depo +50500|1281|93|3|21|24827.88|0.09|0.04|N|O|1995-12-03|1995-11-06|1995-12-19|COLLECT COD|TRUCK|leep slyly ironic ideas. quickly fi +50500|1350|89|4|33|41294.55|0.02|0.06|N|O|1995-11-09|1995-11-06|1995-11-22|DELIVER IN PERSON|SHIP|fully unusual packages +50500|1982|83|5|43|81011.14|0.00|0.03|N|O|1995-10-28|1995-11-22|1995-11-26|NONE|AIR|ts snooze daringly among the +50500|425|55|6|7|9277.94|0.06|0.08|N|O|1995-12-06|1995-11-06|1995-12-14|COLLECT COD|AIR| excuses. fluffi +50501|187|40|1|44|47835.92|0.08|0.02|R|F|1994-08-08|1994-08-03|1994-09-03|NONE|MAIL|es wake across the fluffily express request +50501|558|89|2|48|70010.40|0.10|0.00|R|F|1994-07-13|1994-08-23|1994-08-02|TAKE BACK RETURN|SHIP|ngly ideas. final, spec +50501|444|45|3|46|61844.24|0.10|0.03|R|F|1994-09-15|1994-07-26|1994-10-14|TAKE BACK RETURN|TRUCK|s the slyly regular dolphins. +50501|335|36|4|3|3705.99|0.06|0.04|R|F|1994-09-27|1994-06-29|1994-10-09|TAKE BACK RETURN|AIR| blithely final deposits cajo +50502|942|45|1|47|86618.18|0.10|0.06|A|F|1995-05-31|1995-06-25|1995-06-11|COLLECT COD|TRUCK|-- pending ideas are. +50503|1853|54|1|34|59664.90|0.02|0.02|A|F|1992-12-04|1993-01-21|1992-12-22|DELIVER IN PERSON|MAIL|c ideas. pinto beans cajole package +50503|1679|21|2|37|58484.79|0.06|0.03|A|F|1992-12-24|1992-12-31|1993-01-08|TAKE BACK RETURN|AIR| affix. unusual requests about the spe +50503|1153|54|3|29|30570.35|0.06|0.05|R|F|1993-03-03|1993-01-22|1993-03-13|DELIVER IN PERSON|SHIP|oubt blithely deposits. ironic, re +50503|948|83|4|23|42525.62|0.02|0.00|R|F|1993-01-24|1993-01-25|1993-01-27|TAKE BACK RETURN|RAIL| the caref +50503|1414|15|5|19|24992.79|0.09|0.01|A|F|1992-12-23|1993-01-22|1993-01-05|COLLECT COD|AIR|ing packages are alongside of the thin req +50503|1875|5|6|27|47975.49|0.02|0.01|R|F|1992-12-15|1992-12-29|1993-01-13|TAKE BACK RETURN|MAIL|iously permanent requests +50528|1709|52|1|7|11274.90|0.00|0.01|N|O|1997-04-05|1997-02-28|1997-04-19|TAKE BACK RETURN|SHIP|boost slyly furiously ironic ideas. quick +50528|384|41|2|7|8990.66|0.05|0.02|N|O|1997-02-04|1997-02-26|1997-02-18|COLLECT COD|REG AIR|ual packages. accounts along the slyly fina +50528|1435|53|3|40|53457.20|0.05|0.07|N|O|1997-02-27|1997-02-04|1997-03-13|TAKE BACK RETURN|AIR|ckages haggle car +50528|667|30|4|43|67409.38|0.01|0.02|N|O|1997-03-16|1997-02-24|1997-03-18|COLLECT COD|RAIL|r courts serve carefully close, ironic +50528|1912|13|5|38|68928.58|0.05|0.01|N|O|1997-04-04|1997-01-12|1997-04-10|COLLECT COD|AIR|s. sometimes ruthless theodolite +50528|866|100|6|27|47705.22|0.10|0.07|N|O|1997-02-11|1997-02-08|1997-03-13|DELIVER IN PERSON|FOB|nusual, regular +50529|133|60|1|26|26861.38|0.09|0.03|N|O|1996-05-26|1996-03-18|1996-06-24|COLLECT COD|RAIL|inal, unusua +50529|1191|28|2|45|49148.55|0.02|0.03|N|O|1996-02-15|1996-04-16|1996-03-01|NONE|TRUCK|requests: regular foxes haggle c +50530|532|33|1|46|65896.38|0.09|0.06|R|F|1992-03-10|1992-04-29|1992-04-06|DELIVER IN PERSON|SHIP|e the furiously +50530|1851|38|2|14|24539.90|0.07|0.06|A|F|1992-04-28|1992-04-28|1992-05-05|COLLECT COD|SHIP|ost thinly: final forges above the pac +50531|3|4|1|41|37023.00|0.00|0.05|N|O|1996-05-06|1996-07-09|1996-05-16|NONE|FOB|. carefully regular ideas detec +50531|1537|58|2|9|12946.77|0.09|0.01|N|O|1996-06-15|1996-07-04|1996-06-22|TAKE BACK RETURN|RAIL|sts nag. furio +50531|218|46|3|46|51437.66|0.06|0.02|N|O|1996-07-27|1996-07-11|1996-08-03|DELIVER IN PERSON|MAIL| cajole blithely even ideas. slyly s +50531|15|91|4|48|43920.48|0.05|0.08|N|O|1996-07-16|1996-06-24|1996-08-10|COLLECT COD|FOB|sits use bravely slyly regular +50531|1872|59|5|6|10643.22|0.03|0.08|N|O|1996-08-02|1996-06-03|1996-08-20|TAKE BACK RETURN|AIR|ve the excuse +50531|1853|83|6|50|87742.50|0.05|0.06|N|O|1996-07-29|1996-07-24|1996-08-27|TAKE BACK RETURN|MAIL|dencies cajole t +50532|691|85|1|13|20691.97|0.07|0.00|A|F|1992-11-12|1992-09-28|1992-12-05|DELIVER IN PERSON|SHIP|es about the final, special dep +50532|1776|77|2|1|1677.77|0.06|0.02|A|F|1992-12-03|1992-11-12|1992-12-11|COLLECT COD|MAIL|are quickly furiously silent requests. pend +50532|1902|47|3|25|45097.50|0.10|0.05|A|F|1992-11-06|1992-09-20|1992-12-03|COLLECT COD|AIR|y daring deposits cajole caref +50532|694|88|4|37|59003.53|0.02|0.08|R|F|1992-10-05|1992-10-11|1992-10-24|DELIVER IN PERSON|SHIP|t the fluffily blithe ideas. final, +50532|767|64|5|41|68378.16|0.01|0.04|R|F|1992-12-05|1992-10-27|1992-12-17|NONE|SHIP| excuses. +50532|941|44|6|49|90255.06|0.01|0.02|A|F|1992-11-20|1992-11-12|1992-11-22|COLLECT COD|SHIP|rmanent excuses acco +50532|1589|30|7|17|25339.86|0.06|0.00|A|F|1992-10-05|1992-11-04|1992-10-09|TAKE BACK RETURN|TRUCK|ironic, even ideas. quick +50533|56|7|1|23|21989.15|0.08|0.00|A|F|1995-06-02|1995-08-05|1995-06-09|NONE|REG AIR|r packages are furi +50533|1794|21|2|14|23741.06|0.05|0.00|N|O|1995-09-01|1995-07-18|1995-09-30|COLLECT COD|REG AIR|the deposits are furiously between the car +50533|1639|81|3|45|69328.35|0.05|0.02|N|O|1995-09-11|1995-07-16|1995-10-06|DELIVER IN PERSON|SHIP|lyly across the +50533|1552|33|4|24|34885.20|0.06|0.04|N|O|1995-09-21|1995-08-20|1995-10-04|COLLECT COD|RAIL|ual, pending pint +50534|1981|70|1|11|20712.78|0.09|0.06|N|O|1998-06-24|1998-04-18|1998-07-04|COLLECT COD|MAIL|ns. furiously regular packages cajo +50534|805|39|2|44|75055.20|0.01|0.07|N|O|1998-05-12|1998-04-26|1998-05-27|TAKE BACK RETURN|RAIL|lent pinto beans ar +50535|1133|34|1|42|43433.46|0.02|0.07|R|F|1994-01-21|1994-03-07|1994-02-20|DELIVER IN PERSON|REG AIR|carefully pending +50535|1848|78|2|22|38496.48|0.04|0.07|R|F|1994-03-07|1994-01-09|1994-03-30|COLLECT COD|SHIP|uriously unusual sentiments about the fluff +50560|1933|22|1|7|12844.51|0.01|0.08|N|O|1996-11-26|1996-12-01|1996-12-09|DELIVER IN PERSON|SHIP|g to the carefully ironic theodolite +50560|1671|13|2|19|29880.73|0.03|0.02|N|O|1996-10-02|1996-12-04|1996-10-07|TAKE BACK RETURN|AIR| final ideas. quickly +50560|1417|35|3|17|22412.97|0.08|0.07|N|O|1996-12-03|1996-12-15|1996-12-24|NONE|RAIL|e fluffily blithely +50560|1940|85|4|35|64467.90|0.05|0.00|N|O|1996-12-24|1996-11-28|1997-01-01|DELIVER IN PERSON|TRUCK|up the regular, regular request +50560|371|100|5|29|36869.73|0.01|0.06|N|O|1996-11-01|1996-10-28|1996-11-26|COLLECT COD|REG AIR|ss dependencies are bravely. silently +50561|1865|66|1|9|15901.74|0.10|0.00|N|O|1998-08-24|1998-08-04|1998-09-22|DELIVER IN PERSON|AIR|r requests. blithely special theodol +50561|371|56|2|4|5085.48|0.10|0.02|N|O|1998-06-07|1998-06-23|1998-07-05|NONE|MAIL| express packages c +50561|1998|99|3|41|77899.59|0.10|0.06|N|O|1998-08-03|1998-07-07|1998-08-04|DELIVER IN PERSON|REG AIR|ithely silent accounts. b +50562|330|31|1|4|4921.32|0.09|0.02|N|O|1996-03-17|1996-05-04|1996-03-22|DELIVER IN PERSON|TRUCK|ges against the furiously pe +50562|756|57|2|10|16567.50|0.01|0.06|N|O|1996-03-17|1996-04-30|1996-04-14|DELIVER IN PERSON|TRUCK|y according to th +50563|262|63|1|41|47652.66|0.05|0.06|N|O|1995-10-01|1995-09-21|1995-10-25|NONE|AIR| fluffily regular deposits. slyly ex +50563|1857|44|2|8|14070.80|0.07|0.08|N|O|1995-08-20|1995-09-12|1995-09-02|NONE|FOB|s the unusual, silent +50563|340|41|3|6|7442.04|0.07|0.08|N|O|1995-09-11|1995-09-19|1995-09-13|DELIVER IN PERSON|MAIL|efully above the busily ironic +50563|488|76|4|41|56927.68|0.04|0.05|N|O|1995-10-17|1995-09-25|1995-10-21|COLLECT COD|SHIP|ding pinto +50564|258|40|1|8|9266.00|0.02|0.04|A|F|1992-04-09|1992-04-14|1992-04-19|TAKE BACK RETURN|FOB| carefully quickly ex +50564|335|20|2|18|22235.94|0.08|0.08|R|F|1992-04-30|1992-05-09|1992-05-07|COLLECT COD|SHIP|ptotes wake busily. caref +50564|1201|39|3|26|28657.20|0.00|0.00|R|F|1992-04-26|1992-05-16|1992-05-15|DELIVER IN PERSON|REG AIR|uests. blithely unusual packages +50564|1548|29|4|44|63779.76|0.07|0.05|R|F|1992-07-02|1992-05-17|1992-07-31|NONE|AIR|o beans against +50565|904|5|1|8|14439.20|0.01|0.05|R|F|1992-12-25|1992-09-30|1992-12-29|TAKE BACK RETURN|SHIP|quests. fluffi +50565|1634|76|2|4|6142.52|0.08|0.05|A|F|1992-10-20|1992-11-08|1992-10-23|TAKE BACK RETURN|SHIP|eas affix around the fluf +50565|1070|71|3|44|42727.08|0.02|0.06|R|F|1992-10-13|1992-11-21|1992-10-27|TAKE BACK RETURN|TRUCK|ven ideas haggle slyl +50565|1069|75|4|9|8730.54|0.06|0.06|R|F|1992-10-11|1992-10-01|1992-10-17|DELIVER IN PERSON|RAIL|ajole boldly above the furiously re +50565|1650|92|5|48|74479.20|0.07|0.04|A|F|1992-09-23|1992-11-08|1992-10-17|COLLECT COD|RAIL| sleep slyly about the fu +50565|1957|2|6|16|29743.20|0.06|0.00|A|F|1992-12-15|1992-10-22|1993-01-04|COLLECT COD|MAIL|usual, quiet foxes. carefully ironic d +50565|1784|27|7|36|60688.08|0.01|0.06|R|F|1992-11-16|1992-10-26|1992-12-09|TAKE BACK RETURN|RAIL| even accounts sleep fluffily. careful +50566|1697|21|1|47|75138.43|0.00|0.07|N|O|1995-12-30|1995-11-18|1996-01-05|TAKE BACK RETURN|TRUCK|ites are carefully-- ironic, regular +50566|1237|12|2|49|55773.27|0.10|0.00|N|O|1995-12-28|1995-11-26|1996-01-11|DELIVER IN PERSON|AIR|nding accounts. regular, +50567|764|65|1|41|68255.16|0.02|0.08|A|F|1992-04-14|1992-05-04|1992-04-27|NONE|SHIP|ts: fluffily ironic requests boos +50567|1190|99|2|4|4364.76|0.02|0.01|R|F|1992-05-13|1992-03-10|1992-05-15|TAKE BACK RETURN|FOB|ily alongside of the slyly fi +50567|1585|26|3|19|28245.02|0.00|0.01|A|F|1992-04-09|1992-04-18|1992-05-06|DELIVER IN PERSON|SHIP|ests nag carefully special, unusual f +50567|1558|39|4|17|24812.35|0.09|0.05|A|F|1992-03-04|1992-04-23|1992-03-05|DELIVER IN PERSON|RAIL|nal attainments sleep sl +50567|270|98|5|25|29256.75|0.10|0.08|A|F|1992-04-24|1992-04-29|1992-05-03|DELIVER IN PERSON|FOB|ests can nag blithely against the fin +50592|199|100|1|30|32975.70|0.09|0.05|N|O|1996-12-22|1997-01-02|1996-12-29|NONE|SHIP|nag carefully express foxes. slyly sp +50592|294|76|2|43|51354.47|0.09|0.04|N|O|1996-11-26|1997-01-10|1996-12-09|NONE|RAIL|ithely express accounts. carefully regul +50592|1134|7|3|30|31053.90|0.08|0.07|N|O|1996-12-11|1996-12-22|1996-12-12|COLLECT COD|FOB|closely regular dependencies solve. ir +50592|1546|87|4|39|56454.06|0.08|0.01|N|O|1996-12-02|1997-01-29|1996-12-28|NONE|SHIP|ly express requ +50593|1527|68|1|42|59997.84|0.02|0.05|N|O|1995-09-21|1995-08-26|1995-10-04|TAKE BACK RETURN|SHIP|, final pack +50593|1468|86|2|40|54778.40|0.06|0.08|N|O|1995-10-30|1995-08-26|1995-11-08|DELIVER IN PERSON|FOB|gular frets. pending depo +50593|1961|94|3|25|46574.00|0.10|0.04|N|O|1995-07-28|1995-08-10|1995-07-31|TAKE BACK RETURN|TRUCK|idly silent pack +50594|621|84|1|30|45648.60|0.09|0.02|A|F|1993-09-14|1993-08-10|1993-09-28|DELIVER IN PERSON|REG AIR|. carefully +50594|691|92|2|25|39792.25|0.09|0.02|A|F|1993-09-11|1993-08-05|1993-09-16|TAKE BACK RETURN|AIR|gular acco +50594|1840|27|3|7|12192.88|0.02|0.08|A|F|1993-07-19|1993-08-06|1993-07-30|TAKE BACK RETURN|RAIL|nding waters are sl +50594|1812|13|4|48|82262.88|0.01|0.04|A|F|1993-07-23|1993-07-05|1993-08-19|COLLECT COD|SHIP|fully express, re +50594|1880|81|5|2|3563.76|0.10|0.03|R|F|1993-07-17|1993-07-02|1993-07-29|TAKE BACK RETURN|FOB|unusual, pending inst +50594|1832|19|6|25|43345.75|0.01|0.04|A|F|1993-08-03|1993-08-03|1993-08-28|TAKE BACK RETURN|RAIL|y regular packages. unu +50595|115|68|1|43|43649.73|0.08|0.01|N|O|1997-12-04|1997-11-09|1997-12-13|COLLECT COD|RAIL|ar requests nod furiously pending +50595|313|14|2|42|50959.02|0.02|0.03|N|O|1998-01-09|1997-11-29|1998-01-13|COLLECT COD|FOB|ully according to +50596|650|51|1|22|34114.30|0.05|0.08|R|F|1992-11-02|1992-10-06|1992-11-18|COLLECT COD|REG AIR|ages maintain bo +50596|1765|8|2|20|33335.20|0.06|0.03|A|F|1992-12-18|1992-11-13|1992-12-29|COLLECT COD|FOB|ts. foxes dazzle furiously fu +50597|1424|64|1|46|60969.32|0.03|0.05|N|O|1998-09-02|1998-10-16|1998-09-23|COLLECT COD|FOB|hins engage carefull +50597|602|3|2|38|57098.80|0.02|0.05|N|O|1998-11-13|1998-08-28|1998-11-25|DELIVER IN PERSON|REG AIR|ecial deposit +50597|521|82|3|41|58282.32|0.04|0.01|N|O|1998-08-07|1998-09-17|1998-09-05|NONE|SHIP|posits. deposits cajole. ir +50597|1602|26|4|23|34582.80|0.09|0.08|N|O|1998-11-05|1998-09-12|1998-11-21|NONE|RAIL|deposits sl +50597|1385|24|5|4|5145.52|0.06|0.02|N|O|1998-10-23|1998-09-07|1998-10-25|COLLECT COD|MAIL| furiously. blithely unus +50597|27|28|6|48|44496.96|0.00|0.07|N|O|1998-08-23|1998-08-25|1998-09-19|NONE|AIR|y against the always bli +50597|366|67|7|20|25327.20|0.05|0.00|N|O|1998-10-02|1998-09-30|1998-10-07|NONE|MAIL|inal dinos. even theodolit +50598|1071|42|1|49|47631.43|0.06|0.04|N|O|1996-02-24|1996-02-16|1996-02-27|NONE|SHIP| ironic instructions sleep regular gifts. +50599|1149|86|1|1|1050.14|0.07|0.06|N|O|1998-06-05|1998-05-13|1998-06-25|NONE|SHIP| furiously regular requests. f +50599|1975|76|2|20|37539.40|0.00|0.04|N|O|1998-03-19|1998-04-19|1998-04-17|COLLECT COD|MAIL| upon the sly, ironic deposits. fluffil +50599|1407|25|3|45|58878.00|0.08|0.04|N|O|1998-03-17|1998-05-15|1998-04-10|DELIVER IN PERSON|RAIL|ffix. regular, silent excuses +50624|571|62|1|22|32374.54|0.03|0.07|N|O|1996-07-21|1996-07-04|1996-07-27|COLLECT COD|REG AIR|iet excuses are blithel +50624|1820|64|2|31|53376.42|0.07|0.03|N|O|1996-08-01|1996-05-29|1996-08-21|NONE|TRUCK|y regular the +50624|658|21|3|26|40524.90|0.08|0.04|N|O|1996-05-09|1996-06-22|1996-05-28|COLLECT COD|REG AIR|ithely ironic accounts. regular accounts c +50624|186|87|4|41|44533.38|0.10|0.05|N|O|1996-07-24|1996-06-09|1996-08-07|NONE|MAIL|lar accounts cajo +50625|1140|41|1|49|51015.86|0.02|0.07|R|F|1994-06-05|1994-06-08|1994-06-20|TAKE BACK RETURN|SHIP|riously pendin +50625|431|90|2|46|61245.78|0.09|0.00|R|F|1994-06-20|1994-07-12|1994-06-29|DELIVER IN PERSON|REG AIR|lly ironic excuses. +50625|274|56|3|49|57539.23|0.06|0.00|A|F|1994-07-28|1994-06-23|1994-08-12|DELIVER IN PERSON|FOB|ages. regula +50626|1793|36|1|46|77960.34|0.06|0.02|A|F|1994-11-26|1994-12-10|1994-11-29|DELIVER IN PERSON|MAIL|across the busily unusual packages use b +50626|1293|31|2|8|9554.32|0.00|0.01|R|F|1995-02-14|1994-12-22|1995-02-15|NONE|MAIL|. unusual, even accounts haggl +50626|1141|50|3|4|4168.56|0.07|0.02|R|F|1995-02-17|1994-12-30|1995-03-03|TAKE BACK RETURN|TRUCK|y ironic courts haggle final accoun +50626|64|65|4|26|25065.56|0.01|0.08|R|F|1995-01-25|1994-11-27|1995-02-20|NONE|FOB|heodolites breach am +50627|415|74|1|17|22361.97|0.07|0.03|N|O|1998-06-29|1998-04-20|1998-07-29|TAKE BACK RETURN|SHIP|o beans. slyly even deposits x-ra +50627|579|80|2|13|19234.41|0.02|0.05|N|O|1998-05-30|1998-05-21|1998-06-21|TAKE BACK RETURN|AIR|sts. bold a +50628|1082|83|1|28|27526.24|0.01|0.03|N|O|1997-12-24|1998-01-24|1998-01-21|NONE|AIR|. carefully even pinto +50628|1664|47|2|24|37575.84|0.06|0.02|N|O|1998-01-10|1997-12-03|1998-01-15|TAKE BACK RETURN|TRUCK|he furiously quick packages boost abo +50628|1759|60|3|23|38197.25|0.04|0.08|N|O|1997-12-27|1997-12-23|1998-01-26|NONE|FOB| sentiments. sly requests ca +50628|1328|43|4|34|41796.88|0.02|0.00|N|O|1997-10-29|1998-01-16|1997-11-10|TAKE BACK RETURN|RAIL|en packages. blith +50629|1244|56|1|26|29776.24|0.04|0.02|N|O|1996-02-15|1996-01-27|1996-02-26|NONE|REG AIR|s the packages +50629|175|54|2|31|33330.27|0.10|0.02|N|O|1995-12-15|1996-01-11|1995-12-30|NONE|SHIP|ckly regular account +50629|919|88|3|42|76436.22|0.01|0.05|N|O|1996-01-05|1995-12-18|1996-01-14|COLLECT COD|REG AIR|ve the carefully final foxes integr +50630|1773|74|1|17|28471.09|0.00|0.06|N|O|1996-11-06|1996-09-04|1996-12-05|NONE|TRUCK| sleep spec +50630|450|51|2|27|36462.15|0.02|0.00|N|O|1996-10-16|1996-10-03|1996-11-13|COLLECT COD|SHIP|ymptotes use along the carefully reg +50630|787|84|3|17|28692.26|0.03|0.08|N|O|1996-09-30|1996-09-06|1996-10-01|TAKE BACK RETURN|MAIL|press foxes wake. sly +50630|235|90|4|9|10217.07|0.08|0.01|N|O|1996-09-27|1996-08-25|1996-10-27|COLLECT COD|TRUCK|y ironic requests nag. +50630|608|40|5|13|19611.80|0.07|0.01|N|O|1996-09-17|1996-09-09|1996-10-12|NONE|TRUCK|s cajole. fluffily express ideas according +50631|629|23|1|2|3059.24|0.04|0.05|N|O|1998-09-16|1998-08-02|1998-09-26|DELIVER IN PERSON|SHIP|fully bold i +50631|1143|52|2|8|8353.12|0.04|0.00|N|O|1998-07-26|1998-09-03|1998-08-04|COLLECT COD|MAIL|special pinto bea +50631|76|2|3|25|24401.75|0.09|0.07|N|O|1998-08-28|1998-08-08|1998-09-23|TAKE BACK RETURN|AIR|sleep furiously. ironic accounts haggle +50656|883|83|1|26|46380.88|0.00|0.00|A|F|1995-02-22|1994-12-03|1995-03-04|COLLECT COD|MAIL|onic deposits nag idly from +50656|399|84|2|2|2598.78|0.00|0.00|R|F|1994-12-21|1994-12-02|1994-12-26|TAKE BACK RETURN|SHIP|platelets boost boldly. regular +50656|1354|31|3|11|13808.85|0.08|0.06|A|F|1994-11-14|1994-11-29|1994-11-18|NONE|MAIL|riously furiously final pinto bea +50656|574|35|4|14|20643.98|0.01|0.07|A|F|1995-02-07|1994-12-03|1995-02-24|TAKE BACK RETURN|TRUCK| ironic asymptotes after the +50656|247|29|5|24|27533.76|0.06|0.00|A|F|1994-10-31|1994-12-26|1994-11-14|NONE|AIR|f the blithely even asympto +50656|1017|53|6|34|31212.34|0.06|0.07|A|F|1995-01-01|1994-12-18|1995-01-12|NONE|FOB|bout the even requests. furiously speci +50656|1887|17|7|21|37566.48|0.01|0.07|R|F|1994-10-28|1995-01-22|1994-11-20|DELIVER IN PERSON|SHIP|se furiously final, regular pac +50657|903|4|1|26|46901.40|0.02|0.01|N|O|1995-12-29|1996-01-24|1996-01-26|TAKE BACK RETURN|RAIL|e slyly special packages wake al +50657|422|23|2|23|30415.66|0.00|0.04|N|O|1996-02-03|1996-02-27|1996-02-04|DELIVER IN PERSON|SHIP|s sleep quickly according to the f +50657|551|42|3|28|40643.40|0.06|0.08|N|O|1995-12-27|1996-01-18|1996-01-23|COLLECT COD|SHIP|cing packages. fl +50657|657|51|4|11|17134.15|0.07|0.02|N|O|1996-02-06|1996-03-06|1996-02-21|NONE|MAIL|onic instructio +50657|858|59|5|8|14070.80|0.09|0.02|N|O|1996-04-10|1996-02-15|1996-04-12|TAKE BACK RETURN|REG AIR|ing packages sl +50657|1190|27|6|1|1091.19|0.03|0.06|N|O|1996-03-02|1996-02-05|1996-03-18|DELIVER IN PERSON|FOB|ccounts. special theodolites haggl +50657|154|81|7|35|36895.25|0.09|0.07|N|O|1996-03-02|1996-03-09|1996-03-15|NONE|SHIP|lites sleep carefully about the regular as +50658|1116|25|1|3|3051.33|0.10|0.03|R|F|1994-12-09|1994-10-01|1994-12-25|DELIVER IN PERSON|FOB| special requests. reg +50658|1562|83|2|9|13172.04|0.03|0.00|A|F|1994-11-11|1994-10-10|1994-12-08|COLLECT COD|FOB|tead of the carefully regular reques +50658|1722|65|3|25|40593.00|0.10|0.05|A|F|1994-11-07|1994-10-01|1994-12-05|DELIVER IN PERSON|SHIP|foxes affix quickly fu +50658|931|32|4|34|62285.62|0.05|0.05|R|F|1994-11-12|1994-11-13|1994-12-12|TAKE BACK RETURN|REG AIR|; final platelet +50658|1119|20|5|22|22442.42|0.02|0.03|A|F|1994-10-27|1994-09-28|1994-11-15|DELIVER IN PERSON|FOB|efully. qui +50659|1170|71|1|30|32135.10|0.08|0.02|N|O|1998-07-18|1998-07-03|1998-07-30|COLLECT COD|TRUCK|ld blithely in place of the quickly silen +50659|1963|8|2|34|63408.64|0.10|0.02|N|O|1998-07-07|1998-07-11|1998-07-28|TAKE BACK RETURN|AIR|ecial theodolites. furiou +50659|332|17|3|43|52990.19|0.00|0.04|N|O|1998-06-16|1998-05-21|1998-07-08|DELIVER IN PERSON|TRUCK|. furiously regular depend +50659|229|84|4|3|3387.66|0.07|0.02|N|O|1998-06-04|1998-06-24|1998-06-13|DELIVER IN PERSON|REG AIR|cies: special, permanent foxe +50660|1116|17|1|47|47804.17|0.00|0.03|N|O|1996-04-28|1996-05-18|1996-05-09|COLLECT COD|REG AIR|to beans wake. furiously pending accounts i +50661|1080|86|1|42|41205.36|0.08|0.04|N|O|1996-12-23|1996-12-22|1996-12-26|NONE|SHIP| furiously expres +50661|1962|95|2|11|20503.56|0.03|0.02|N|O|1996-12-13|1997-01-17|1997-01-10|COLLECT COD|FOB|unts are quickly. +50661|1704|89|3|34|54593.80|0.09|0.07|N|O|1997-01-01|1996-12-20|1997-01-09|TAKE BACK RETURN|SHIP|he pending, express packages. da +50662|1959|60|1|17|31636.15|0.01|0.02|N|O|1997-05-25|1997-05-27|1997-06-13|TAKE BACK RETURN|SHIP|hely quick pinto beans integrate +50662|555|16|2|42|61133.10|0.08|0.03|N|O|1997-06-12|1997-04-27|1997-06-15|TAKE BACK RETURN|FOB| packages. slyly regular +50663|1186|59|1|22|23917.96|0.04|0.06|R|F|1994-03-03|1993-12-10|1994-03-06|TAKE BACK RETURN|RAIL|slyly final notornis against the deposits +50663|618|12|2|45|68337.45|0.02|0.06|A|F|1994-02-11|1993-12-16|1994-03-03|TAKE BACK RETURN|REG AIR|een the bold requests. slyly final +50663|1802|89|3|6|10222.80|0.04|0.00|A|F|1994-03-07|1994-02-08|1994-03-19|COLLECT COD|REG AIR|ickly regular deposits cajole fluff +50663|1119|28|4|9|9180.99|0.10|0.00|A|F|1994-03-08|1994-01-07|1994-04-02|NONE|SHIP|furiously even ideas +50663|1470|10|5|29|39772.63|0.01|0.08|R|F|1993-11-26|1994-01-15|1993-11-30|COLLECT COD|AIR|; unusual, pend +50688|1683|66|1|17|26939.56|0.02|0.04|N|O|1996-02-07|1996-03-13|1996-03-04|TAKE BACK RETURN|RAIL| beans nag fro +50688|434|64|2|31|41367.33|0.06|0.08|N|O|1995-12-19|1996-02-12|1995-12-30|COLLECT COD|FOB|s among the slyly unusual instructi +50688|1509|90|3|15|21157.50|0.09|0.07|N|O|1996-02-18|1996-02-28|1996-03-09|COLLECT COD|FOB|ave foxes. blithely regular dep +50688|1670|12|4|42|66010.14|0.02|0.00|N|O|1995-12-29|1996-02-14|1996-01-10|TAKE BACK RETURN|AIR|requests. sly a +50688|108|61|5|13|13105.30|0.04|0.00|N|O|1996-03-07|1996-03-13|1996-03-11|COLLECT COD|SHIP|lyly silent war +50689|621|53|1|44|66951.28|0.00|0.00|R|F|1994-07-11|1994-08-15|1994-07-26|DELIVER IN PERSON|MAIL|yly regular deposits wake ruthlessly after +50689|770|67|2|24|40098.48|0.06|0.05|A|F|1994-09-05|1994-08-09|1994-09-09|NONE|SHIP|uctions. slyly pending +50690|412|13|1|12|15748.92|0.07|0.04|R|F|1994-01-05|1993-11-19|1994-01-23|DELIVER IN PERSON|TRUCK|ironic accounts integrate furiously blithe +50690|1920|53|2|22|40082.24|0.09|0.08|R|F|1993-10-28|1994-01-09|1993-11-27|NONE|REG AIR| around the carefully unusua +50690|1084|20|3|36|35462.88|0.10|0.01|R|F|1994-01-24|1993-12-20|1994-02-20|TAKE BACK RETURN|AIR| excuses integrate silently packages. d +50690|921|90|4|1|1821.92|0.00|0.01|R|F|1994-01-24|1993-12-19|1994-01-31|COLLECT COD|RAIL|tes nag packages. furiously close foxes tr +50690|1397|74|5|45|58427.55|0.09|0.01|A|F|1993-11-04|1993-12-08|1993-11-19|DELIVER IN PERSON|AIR|s. regular, regular requests ca +50690|772|73|6|5|8363.85|0.05|0.07|R|F|1994-02-15|1993-12-09|1994-03-15|NONE|REG AIR|s. slyly bold pinto beans +50691|450|9|1|21|28359.45|0.02|0.04|N|O|1997-07-08|1997-06-25|1997-07-26|TAKE BACK RETURN|TRUCK|structions sleep slyly careful +50691|320|77|2|41|50033.12|0.01|0.00|N|O|1997-07-18|1997-07-29|1997-07-29|TAKE BACK RETURN|AIR|pending dolphins. carefully silent platelet +50691|437|67|3|14|18724.02|0.08|0.03|N|O|1997-08-28|1997-06-24|1997-09-26|TAKE BACK RETURN|MAIL|s. blithely silent accounts integrate +50691|933|2|4|35|64187.55|0.06|0.03|N|O|1997-06-15|1997-07-25|1997-06-16|TAKE BACK RETURN|MAIL|he slyly pen +50692|1019|55|1|37|34040.37|0.04|0.01|A|F|1993-10-02|1993-11-01|1993-10-28|COLLECT COD|AIR| above the sometimes regular ideas +50692|446|47|2|20|26928.80|0.07|0.06|R|F|1993-10-12|1993-12-11|1993-11-09|DELIVER IN PERSON|TRUCK|s bold dep +50692|1294|69|3|24|28686.96|0.04|0.04|R|F|1993-10-24|1993-11-05|1993-11-19|NONE|AIR|ions sleep. expre +50692|648|11|4|41|63494.24|0.01|0.06|R|F|1993-11-25|1993-11-10|1993-12-16|COLLECT COD|AIR|its cajole slyly final packages. carefully +50692|1772|99|5|45|75319.65|0.00|0.04|A|F|1993-10-08|1993-10-21|1993-10-12|DELIVER IN PERSON|TRUCK|less pinto beans doubt quickly against the +50692|1880|81|6|37|65929.56|0.09|0.00|R|F|1993-10-17|1993-12-03|1993-11-14|DELIVER IN PERSON|SHIP| excuses sleep above the care +50692|769|66|7|18|30055.68|0.03|0.01|A|F|1993-09-28|1993-10-19|1993-10-28|TAKE BACK RETURN|FOB|, even foxes. requests nag alongside +50693|1485|64|1|23|31889.04|0.07|0.00|R|F|1995-02-03|1995-03-21|1995-02-26|COLLECT COD|MAIL|ording to t +50693|29|80|2|19|17651.38|0.00|0.06|R|F|1995-04-21|1995-04-10|1995-04-26|NONE|RAIL| blithely regular p +50694|720|53|1|35|56725.20|0.10|0.04|N|O|1996-10-04|1996-11-30|1996-10-23|DELIVER IN PERSON|SHIP| unusual r +50694|1734|77|2|10|16357.30|0.01|0.00|N|O|1996-10-28|1996-10-26|1996-11-04|TAKE BACK RETURN|MAIL|foxes. pending +50694|88|89|3|1|988.08|0.06|0.02|N|O|1996-12-27|1996-12-01|1997-01-24|COLLECT COD|REG AIR|fully. furiously unusual in +50694|568|99|4|8|11748.48|0.00|0.04|N|O|1996-12-11|1996-10-18|1996-12-19|DELIVER IN PERSON|AIR|jole about the blithely regular depend +50694|360|45|5|2|2520.72|0.01|0.05|N|O|1996-12-02|1996-10-07|1996-12-17|TAKE BACK RETURN|TRUCK|ic instructions across the unusual, +50695|206|7|1|32|35398.40|0.08|0.03|N|O|1996-01-14|1996-02-13|1996-02-06|DELIVER IN PERSON|RAIL| alongside of the unusual, ironic theodolit +50720|544|35|1|49|70782.46|0.08|0.02|A|F|1995-01-08|1994-12-24|1995-02-02|DELIVER IN PERSON|TRUCK|accounts eat about th +50720|318|75|2|4|4873.24|0.02|0.04|R|F|1994-12-25|1994-12-12|1995-01-08|NONE|RAIL|eas. furiously express packages use alon +50720|1023|59|3|7|6468.14|0.08|0.01|A|F|1994-12-04|1994-11-10|1994-12-28|COLLECT COD|REG AIR|ost quickly spe +50720|889|89|4|35|62645.80|0.09|0.01|R|F|1994-10-10|1994-11-23|1994-10-13|DELIVER IN PERSON|REG AIR|xes poach blithely according to the b +50720|522|23|5|6|8535.12|0.05|0.05|R|F|1994-10-24|1994-11-02|1994-11-10|COLLECT COD|TRUCK|ffily final dependencies. +50721|1441|20|1|44|59067.36|0.04|0.05|A|F|1992-03-15|1992-04-22|1992-03-30|NONE|REG AIR|ffix bravely. quickly i +50721|525|26|2|30|42765.60|0.08|0.03|A|F|1992-05-02|1992-04-14|1992-05-29|TAKE BACK RETURN|REG AIR|oss the care +50721|288|16|3|23|27330.44|0.05|0.08|A|F|1992-05-01|1992-04-15|1992-05-24|TAKE BACK RETURN|SHIP|ffily. furi +50721|1188|61|4|11|11980.98|0.08|0.02|R|F|1992-04-08|1992-04-03|1992-05-01|DELIVER IN PERSON|RAIL|otes. carefully even foxes +50721|1209|21|5|31|34416.20|0.05|0.08|A|F|1992-05-28|1992-05-11|1992-06-21|COLLECT COD|RAIL|inal sautern +50722|1300|38|1|27|32435.10|0.03|0.06|R|F|1993-01-04|1992-12-24|1993-01-10|NONE|AIR| deposits use slyly sly the +50723|1657|81|1|36|56111.40|0.10|0.01|N|O|1996-11-25|1996-10-18|1996-12-24|DELIVER IN PERSON|REG AIR|ncies haggle f +50723|1457|97|2|2|2716.90|0.05|0.01|N|O|1996-08-24|1996-09-25|1996-08-31|NONE|AIR|uests use quickly unusual foxes. fu +50723|1768|69|3|41|68460.16|0.06|0.06|N|O|1996-09-15|1996-10-11|1996-09-27|DELIVER IN PERSON|TRUCK|inal deposits. idle request +50723|1821|8|4|27|46516.14|0.00|0.04|N|O|1996-10-15|1996-11-03|1996-10-26|COLLECT COD|SHIP| along the requests. blithely regu +50723|1004|5|5|22|19910.00|0.07|0.03|N|O|1996-09-01|1996-10-19|1996-09-09|NONE|RAIL|ut the express excuses. bl +50723|1776|19|6|7|11744.39|0.07|0.06|N|O|1996-11-05|1996-10-26|1996-11-22|TAKE BACK RETURN|SHIP|sits. furious +50724|464|94|1|32|43662.72|0.10|0.07|N|O|1996-12-26|1996-12-21|1997-01-07|COLLECT COD|MAIL| regular dolphins must +50724|1679|3|2|50|79033.50|0.00|0.05|N|O|1996-11-29|1996-11-30|1996-12-20|NONE|MAIL| carefully regular accounts haggle quick +50724|923|92|3|15|27358.80|0.00|0.01|N|O|1996-12-18|1996-12-21|1996-12-19|NONE|TRUCK|al escapad +50724|779|12|4|19|31915.63|0.07|0.04|N|O|1996-12-16|1996-12-05|1996-12-21|TAKE BACK RETURN|RAIL|ans hang s +50724|1413|14|5|8|10515.28|0.04|0.00|N|O|1997-02-07|1996-11-16|1997-02-19|TAKE BACK RETURN|REG AIR|ts. pendin +50725|485|86|1|50|69274.00|0.09|0.08|A|F|1994-02-23|1994-01-03|1994-03-25|DELIVER IN PERSON|TRUCK|kages snooze under the st +50725|996|97|2|24|45527.76|0.05|0.00|R|F|1994-02-27|1994-01-15|1994-03-14|DELIVER IN PERSON|AIR|quickly final instructions +50725|1446|25|3|7|9432.08|0.01|0.05|A|F|1994-01-25|1994-01-10|1994-02-16|COLLECT COD|REG AIR|efully final decoys. fluf +50725|1687|70|4|22|34950.96|0.06|0.06|A|F|1994-02-01|1994-02-14|1994-02-23|NONE|SHIP|r instructio +50725|429|59|5|34|45200.28|0.09|0.03|R|F|1994-03-09|1994-02-11|1994-03-16|TAKE BACK RETURN|AIR|ickly. regular epitaphs are. carefully t +50725|56|7|6|18|17208.90|0.03|0.08|R|F|1994-03-17|1993-12-24|1994-04-09|NONE|FOB|uriously s +50726|1458|59|1|34|46221.30|0.10|0.07|N|O|1995-12-09|1996-01-25|1995-12-27|TAKE BACK RETURN|REG AIR|ully pending attainment +50726|1320|97|2|47|57402.04|0.06|0.00|N|O|1995-12-07|1996-01-16|1996-01-06|DELIVER IN PERSON|MAIL|tect alongside of the fu +50726|110|89|3|12|12121.32|0.03|0.07|N|O|1996-01-06|1995-12-20|1996-01-25|TAKE BACK RETURN|AIR|ly instead of the quickly final p +50726|1658|82|4|25|38991.25|0.07|0.05|N|O|1996-01-17|1996-01-20|1996-01-28|TAKE BACK RETURN|REG AIR|ly regular courts haggl +50726|1616|99|5|14|21246.54|0.01|0.00|N|O|1995-11-27|1995-12-28|1995-12-23|COLLECT COD|REG AIR|nic instructions. blithely fina +50726|523|14|6|43|61211.36|0.05|0.04|N|O|1996-02-05|1995-12-24|1996-02-11|DELIVER IN PERSON|FOB|sh asymptotes. busily fi +50726|165|44|7|46|48997.36|0.02|0.05|N|O|1996-01-09|1995-12-28|1996-01-18|TAKE BACK RETURN|FOB|e furiously after +50727|644|76|1|24|37071.36|0.06|0.08|N|O|1996-07-09|1996-07-30|1996-07-20|TAKE BACK RETURN|REG AIR|sly ironic foxes. ironic requests caj +50752|470|29|1|50|68523.50|0.07|0.07|A|F|1993-06-06|1993-07-03|1993-07-03|TAKE BACK RETURN|FOB|es sleep fluffily along t +50752|793|26|2|42|71139.18|0.09|0.04|A|F|1993-08-31|1993-07-10|1993-09-26|DELIVER IN PERSON|FOB|ic packages. ironic +50753|1671|95|1|48|75488.16|0.07|0.04|N|O|1997-01-15|1997-04-03|1997-01-25|NONE|AIR|y by the r +50753|159|12|2|44|46602.60|0.10|0.07|N|O|1997-04-23|1997-02-12|1997-05-02|TAKE BACK RETURN|FOB|d the special packages maintain silent, fi +50753|1345|60|3|44|54838.96|0.06|0.00|N|O|1997-01-09|1997-02-21|1997-02-01|NONE|MAIL|rash carefully alongside of +50753|905|8|4|29|52371.10|0.00|0.07|N|O|1997-04-27|1997-03-29|1997-05-16|COLLECT COD|FOB|ites use fluffily final +50754|702|35|1|19|30451.30|0.08|0.07|R|F|1995-02-05|1995-02-14|1995-02-14|DELIVER IN PERSON|SHIP|ose doggedly. slyl +50754|1357|72|2|34|42783.90|0.02|0.05|R|F|1995-02-09|1995-01-26|1995-02-21|COLLECT COD|MAIL| furiously regular pi +50754|1909|10|3|17|30785.30|0.01|0.08|A|F|1995-02-08|1995-01-13|1995-02-26|DELIVER IN PERSON|MAIL|r packages. slyly ironic pinto beans +50754|447|6|4|14|18864.16|0.01|0.02|A|F|1994-12-24|1995-01-31|1995-01-21|COLLECT COD|AIR|ecial accounts run even w +50755|1843|30|1|18|31407.12|0.09|0.00|N|O|1998-07-03|1998-07-08|1998-07-18|TAKE BACK RETURN|REG AIR|regular deposits nag fluffily about the un +50755|1553|34|2|9|13090.95|0.05|0.02|N|O|1998-06-22|1998-07-12|1998-07-07|COLLECT COD|TRUCK|uriously final instructions wake furi +50756|1666|90|1|21|32920.86|0.01|0.00|R|F|1993-09-22|1993-12-01|1993-10-21|TAKE BACK RETURN|TRUCK|r requests. fluffily ironic accounts wak +50756|615|78|2|40|60624.40|0.07|0.06|A|F|1993-09-17|1993-10-24|1993-10-12|NONE|AIR|y regular requests haggle qui +50756|1917|50|3|29|52748.39|0.08|0.07|A|F|1993-11-02|1993-12-03|1993-11-11|TAKE BACK RETURN|REG AIR|urts cajole +50756|1485|3|4|37|51299.76|0.00|0.03|A|F|1993-11-06|1993-11-02|1993-11-11|COLLECT COD|AIR|thely. pending +50756|233|15|5|33|37396.59|0.02|0.08|R|F|1993-10-18|1993-12-07|1993-10-27|DELIVER IN PERSON|FOB|dly regular accounts use bli +50756|277|59|6|13|15304.51|0.01|0.04|R|F|1994-01-09|1993-10-13|1994-01-20|COLLECT COD|RAIL|ng the even pinto b +50756|373|2|7|41|52208.17|0.00|0.07|A|F|1993-12-18|1993-10-30|1993-12-20|DELIVER IN PERSON|REG AIR|ies. furiously +50757|1325|26|1|30|36789.60|0.00|0.04|N|O|1997-05-04|1997-06-23|1997-05-13|COLLECT COD|MAIL|ial pinto beans haggle slyly. ca +50757|1960|49|2|15|27929.40|0.02|0.04|N|O|1997-06-22|1997-06-03|1997-07-22|COLLECT COD|REG AIR|e. pending ideas nag. careful +50757|379|36|3|17|21749.29|0.10|0.06|N|O|1997-05-07|1997-06-11|1997-05-28|TAKE BACK RETURN|AIR|he carefully f +50758|248|30|1|50|57412.00|0.08|0.00|A|F|1992-07-16|1992-09-19|1992-08-03|COLLECT COD|MAIL|ironic theodolite +50758|669|1|2|29|45520.14|0.03|0.02|R|F|1992-09-25|1992-08-22|1992-10-12|DELIVER IN PERSON|MAIL|gular attainme +50759|1999|100|1|7|13306.93|0.00|0.03|A|F|1993-06-24|1993-05-21|1993-06-29|DELIVER IN PERSON|TRUCK|ress epitaphs sleep. furiously express +50759|39|90|2|1|939.03|0.04|0.08|A|F|1993-06-18|1993-05-10|1993-06-21|DELIVER IN PERSON|RAIL|pendencies. carefully +50784|1427|6|1|13|17269.46|0.03|0.03|R|F|1992-04-10|1992-03-26|1992-04-13|DELIVER IN PERSON|MAIL|tealthy packages. even pinto +50785|926|95|1|3|5480.76|0.07|0.05|N|O|1997-09-16|1997-10-24|1997-10-01|COLLECT COD|AIR|furiously final dependencies +50785|1249|61|2|32|36807.68|0.03|0.08|N|O|1997-09-29|1997-11-13|1997-10-06|NONE|MAIL|ckages sleep furi +50785|1661|85|3|3|4687.98|0.01|0.02|N|O|1998-01-01|1997-11-23|1998-01-03|COLLECT COD|TRUCK|uests. slowly bold depo +50785|496|97|4|37|51670.13|0.07|0.07|N|O|1997-10-13|1997-10-16|1997-10-25|DELIVER IN PERSON|REG AIR| poach furiou +50786|1796|39|1|8|13582.32|0.04|0.00|R|F|1995-02-03|1994-12-23|1995-02-11|COLLECT COD|TRUCK|ideas cajole quietly. realms cajole +50786|520|11|2|6|8523.12|0.06|0.04|A|F|1995-01-06|1995-01-04|1995-02-01|TAKE BACK RETURN|TRUCK|cies. blithely regul +50787|707|72|1|28|45015.60|0.03|0.05|A|F|1994-03-11|1994-03-03|1994-03-15|TAKE BACK RETURN|RAIL|s. never e +50788|841|8|1|42|73157.28|0.01|0.03|N|O|1998-09-01|1998-06-30|1998-09-10|DELIVER IN PERSON|AIR|kages boost dar +50788|628|29|2|48|73373.76|0.03|0.08|N|O|1998-07-20|1998-08-08|1998-08-05|COLLECT COD|SHIP|ronic dependencies +50788|210|92|3|11|12212.31|0.01|0.01|N|O|1998-08-21|1998-07-04|1998-08-30|DELIVER IN PERSON|MAIL|wake among the express epitaphs. +50788|1323|38|4|11|13467.52|0.05|0.00|N|O|1998-09-07|1998-07-25|1998-09-25|NONE|REG AIR|ave to wake abo +50788|1708|93|5|22|35413.40|0.06|0.05|N|O|1998-09-04|1998-07-03|1998-09-06|TAKE BACK RETURN|RAIL|requests around the quickly even gifts af +50789|1591|32|1|47|70151.73|0.06|0.00|N|F|1995-06-14|1995-04-25|1995-07-09|TAKE BACK RETURN|REG AIR|e furiously fluffi +50789|1707|50|2|18|28956.60|0.09|0.02|A|F|1995-04-19|1995-05-06|1995-05-07|TAKE BACK RETURN|TRUCK|nding asymptotes among the +50789|1363|78|3|23|29080.28|0.02|0.00|R|F|1995-05-22|1995-05-08|1995-06-05|TAKE BACK RETURN|RAIL|ts; slyly express account +50790|257|12|1|22|25459.50|0.06|0.02|N|O|1995-10-02|1995-10-12|1995-10-25|DELIVER IN PERSON|AIR|uternes across the express +50790|188|67|2|2|2176.36|0.02|0.06|N|O|1995-10-29|1995-08-18|1995-11-20|TAKE BACK RETURN|REG AIR|deas. blithely unusual p +50791|1885|15|1|39|69688.32|0.07|0.05|N|O|1998-05-27|1998-08-24|1998-05-28|NONE|FOB| deposits. quickly sp +50791|1030|1|2|7|6517.21|0.00|0.05|N|O|1998-09-14|1998-07-16|1998-10-07|TAKE BACK RETURN|SHIP|thely between the quickly bold requests. +50816|1948|93|1|37|68447.78|0.02|0.00|R|F|1994-05-07|1994-05-23|1994-05-14|TAKE BACK RETURN|FOB|he slyly r +50816|1043|79|2|50|47202.00|0.06|0.05|A|F|1994-07-01|1994-05-16|1994-07-29|NONE|FOB| the final accounts. furiously ironi +50816|163|90|3|19|20200.04|0.05|0.03|R|F|1994-06-25|1994-06-07|1994-07-11|COLLECT COD|TRUCK| requests n +50816|1825|12|4|49|84614.18|0.06|0.05|A|F|1994-06-17|1994-06-14|1994-07-12|COLLECT COD|REG AIR|ackages. dependencies across the +50817|1749|50|1|30|49522.20|0.09|0.08|N|O|1996-06-29|1996-08-01|1996-07-01|TAKE BACK RETURN|RAIL|sly about the always f +50818|239|40|1|35|39873.05|0.05|0.01|R|F|1992-12-04|1992-11-30|1992-12-14|NONE|SHIP|s, regular accounts +50818|178|5|2|24|25876.08|0.04|0.03|A|F|1993-01-10|1992-12-14|1993-01-19|DELIVER IN PERSON|FOB|heodolites. carefully even pin +50818|1735|78|3|18|29461.14|0.09|0.04|A|F|1993-01-20|1992-12-04|1993-02-11|DELIVER IN PERSON|RAIL|s-- furiousl +50819|1150|87|1|28|29432.20|0.02|0.08|N|O|1997-12-27|1997-12-18|1998-01-19|COLLECT COD|REG AIR|blithely regular deposits cajole. carefu +50819|1156|57|2|28|29600.20|0.05|0.00|N|O|1998-02-05|1997-12-31|1998-02-15|NONE|TRUCK|ronic courts according t +50820|624|25|1|17|25918.54|0.07|0.06|N|O|1998-03-16|1998-04-30|1998-03-26|DELIVER IN PERSON|TRUCK|furiously daring deposits? co +50820|1047|83|2|6|5688.24|0.06|0.08|N|O|1998-02-08|1998-04-29|1998-03-01|TAKE BACK RETURN|MAIL|nal accounts mold furiously. carefully f +50821|906|41|1|9|16262.10|0.06|0.05|R|F|1992-02-17|1992-04-14|1992-02-19|NONE|MAIL|ccounts wake request +50821|1242|17|2|39|44586.36|0.07|0.02|A|F|1992-03-26|1992-02-29|1992-03-31|COLLECT COD|REG AIR|c pearls nag quickly above the platelets. +50822|915|18|1|19|34502.29|0.05|0.06|R|F|1992-04-28|1992-03-21|1992-05-15|NONE|TRUCK| requests. furiously e +50822|495|25|2|23|32096.27|0.04|0.03|A|F|1992-05-09|1992-04-24|1992-05-10|NONE|FOB|le blithely. even deposits snooze. final +50822|1489|90|3|42|58400.16|0.06|0.04|R|F|1992-03-14|1992-03-29|1992-04-06|NONE|REG AIR|cajole according to +50822|1485|64|4|34|47140.32|0.07|0.03|A|F|1992-02-19|1992-03-31|1992-03-14|COLLECT COD|SHIP|ts along the ironic ideas sleep slyly fl +50822|263|64|5|47|54673.22|0.09|0.05|R|F|1992-03-20|1992-04-09|1992-04-01|DELIVER IN PERSON|AIR|tegrate furiously final pack +50822|229|11|6|29|32747.38|0.02|0.08|R|F|1992-05-13|1992-04-26|1992-05-23|TAKE BACK RETURN|TRUCK|carefully. theodolites above the excuses a +50822|337|66|7|5|6186.65|0.02|0.08|R|F|1992-05-29|1992-03-27|1992-06-08|TAKE BACK RETURN|REG AIR|nal excuses sleep among the pending in +50823|676|39|1|35|55183.45|0.00|0.02|A|F|1994-09-25|1994-10-02|1994-10-02|DELIVER IN PERSON|TRUCK|hely regular dinos p +50823|510|41|2|17|23978.67|0.01|0.06|R|F|1994-09-12|1994-09-07|1994-10-07|DELIVER IN PERSON|TRUCK|pending accounts. packages cajole. final, i +50823|1287|25|3|41|48719.48|0.00|0.08|R|F|1994-09-09|1994-08-23|1994-10-08|COLLECT COD|AIR|s nag carefully final packages. pac +50823|1656|57|4|7|10903.55|0.10|0.04|R|F|1994-08-15|1994-08-21|1994-09-09|NONE|RAIL|rding to the blithel +50823|1416|56|5|43|56648.63|0.00|0.07|A|F|1994-08-12|1994-08-31|1994-08-19|COLLECT COD|REG AIR|s instructions. slyly regular requests +50848|546|47|1|43|62201.22|0.06|0.01|R|F|1993-03-30|1993-02-19|1993-04-09|TAKE BACK RETURN|MAIL| furiously unusua +50849|790|87|1|23|38888.17|0.06|0.04|R|F|1992-12-31|1992-12-05|1993-01-15|COLLECT COD|MAIL| quickly ironic deposits cajole qui +50849|14|65|2|21|19194.21|0.01|0.02|R|F|1992-12-17|1992-11-25|1993-01-14|DELIVER IN PERSON|REG AIR|y final accounts doze +50850|91|42|1|37|36670.33|0.06|0.00|A|F|1994-06-23|1994-07-14|1994-07-04|COLLECT COD|TRUCK|final pint +50850|147|26|2|13|13612.82|0.05|0.01|A|F|1994-05-20|1994-07-21|1994-05-27|NONE|SHIP|e carefully slyly regular theodolite +50850|1735|62|3|15|24550.95|0.10|0.03|R|F|1994-07-17|1994-07-29|1994-08-02|DELIVER IN PERSON|FOB| dependencies nod quickly. deposits are +50850|189|90|4|40|43567.20|0.05|0.06|R|F|1994-07-05|1994-08-03|1994-07-17|TAKE BACK RETURN|SHIP|fully ironic accounts. regular p +50850|1849|36|5|33|57777.72|0.10|0.00|R|F|1994-06-17|1994-07-10|1994-06-22|DELIVER IN PERSON|SHIP|nding theodolites. regular courts hagg +50850|793|58|6|11|18631.69|0.10|0.08|A|F|1994-06-01|1994-07-09|1994-06-12|NONE|TRUCK|tes wake caref +50850|702|67|7|2|3205.40|0.10|0.04|R|F|1994-05-08|1994-07-12|1994-05-22|TAKE BACK RETURN|TRUCK| beans. ironic excuses against th +50851|1546|87|1|3|4342.62|0.10|0.05|N|O|1998-05-24|1998-04-19|1998-06-13|TAKE BACK RETURN|TRUCK|ckly even dependencies sleep +50851|823|90|2|14|24133.48|0.10|0.06|N|O|1998-05-21|1998-06-07|1998-05-29|COLLECT COD|MAIL|t, blithe accounts. furiousl +50851|1178|87|3|43|46404.31|0.08|0.04|N|O|1998-05-03|1998-05-29|1998-05-20|DELIVER IN PERSON|TRUCK|ges sleep furiously final instruc +50851|1442|60|4|48|64485.12|0.10|0.03|N|O|1998-06-10|1998-04-17|1998-06-16|NONE|RAIL| requests w +50851|1030|66|5|21|19551.63|0.09|0.01|N|O|1998-06-28|1998-05-05|1998-07-25|COLLECT COD|TRUCK|fluffily carefully ironic pinto bean +50851|681|13|6|6|9490.08|0.04|0.08|N|O|1998-05-08|1998-04-16|1998-05-24|COLLECT COD|TRUCK|the pinto beans. slyly bold platelets wake +50852|276|31|1|13|15291.51|0.06|0.01|N|O|1995-09-20|1995-08-10|1995-09-22|TAKE BACK RETURN|RAIL|bold accounts h +50852|887|87|2|48|85818.24|0.08|0.02|N|O|1995-06-23|1995-08-02|1995-07-09|TAKE BACK RETURN|FOB|ounts x-ray accord +50852|350|51|3|37|46262.95|0.02|0.05|N|O|1995-08-10|1995-07-21|1995-09-07|TAKE BACK RETURN|SHIP|deas try to are along the carefull +50852|558|89|4|6|8751.30|0.10|0.07|N|O|1995-07-27|1995-08-02|1995-07-28|DELIVER IN PERSON|AIR|g about the regular platelets. regular f +50853|553|14|1|25|36338.75|0.01|0.07|A|F|1994-07-07|1994-09-25|1994-07-22|DELIVER IN PERSON|FOB| stealthily after the +50853|1499|17|2|29|40614.21|0.09|0.06|A|F|1994-07-08|1994-07-30|1994-07-25|DELIVER IN PERSON|FOB|tructions. regu +50853|1912|1|3|5|9069.55|0.09|0.07|A|F|1994-09-27|1994-09-16|1994-10-17|NONE|REG AIR|urts. furiou +50853|1349|50|4|23|28757.82|0.02|0.00|A|F|1994-10-05|1994-09-05|1994-11-01|NONE|FOB| the furiously unusual accounts sleep blit +50853|478|79|5|7|9649.29|0.06|0.04|A|F|1994-10-22|1994-08-20|1994-11-06|NONE|MAIL| the carefully express packages ha +50854|117|44|1|40|40684.40|0.02|0.03|N|O|1995-12-28|1996-02-19|1996-01-18|COLLECT COD|SHIP|ptotes wake boldly f +50854|779|80|2|23|38634.71|0.04|0.06|N|O|1996-03-28|1996-02-23|1996-04-10|COLLECT COD|SHIP| even instructions sleep across the furious +50854|1861|48|3|19|33494.34|0.01|0.04|N|O|1996-02-19|1996-01-29|1996-02-26|COLLECT COD|RAIL|s. blithely unusual ideas above +50854|60|86|4|44|42242.64|0.03|0.04|N|O|1996-03-01|1996-01-28|1996-03-27|DELIVER IN PERSON|RAIL|wake carefully among t +50854|1283|21|5|17|20132.76|0.08|0.08|N|O|1996-02-11|1996-03-02|1996-02-26|NONE|FOB| deposits wake ruthlessly special ex +50854|1860|47|6|47|82807.42|0.03|0.01|N|O|1995-12-31|1996-02-03|1996-01-24|TAKE BACK RETURN|MAIL|into beans? pinto beans sleep +50854|610|73|7|45|67977.45|0.06|0.08|N|O|1996-03-24|1996-03-05|1996-04-21|COLLECT COD|SHIP|ackages are fluf +50855|101|28|1|47|47051.70|0.02|0.01|A|F|1992-07-03|1992-06-10|1992-07-29|TAKE BACK RETURN|AIR|ress requests. express deposits acros +50855|1109|18|2|17|17171.70|0.04|0.03|R|F|1992-06-07|1992-06-10|1992-06-13|TAKE BACK RETURN|RAIL|arefully even accounts are furiousl +50880|1637|61|1|45|69238.35|0.05|0.08|A|F|1995-05-01|1995-05-22|1995-05-20|COLLECT COD|TRUCK|among the entici +50880|1529|70|2|13|18596.76|0.08|0.03|N|O|1995-07-14|1995-05-30|1995-07-23|COLLECT COD|AIR|c deposits. +50880|156|57|3|37|39077.55|0.00|0.03|A|F|1995-04-17|1995-05-15|1995-04-21|NONE|AIR|ly. furiously +50880|671|65|4|19|29861.73|0.10|0.08|N|O|1995-06-27|1995-06-23|1995-07-04|TAKE BACK RETURN|REG AIR|gular dolphins. ruthlessly regu +50881|1562|43|1|39|57078.84|0.09|0.07|N|O|1997-05-03|1997-03-14|1997-05-31|COLLECT COD|TRUCK|iously even platelets boos +50882|1985|86|1|42|79253.16|0.09|0.07|R|F|1993-12-22|1993-11-14|1994-01-02|COLLECT COD|FOB|ending ideas do affix furiously. s +50882|1909|42|2|44|79679.60|0.02|0.02|R|F|1993-09-23|1993-11-25|1993-10-20|TAKE BACK RETURN|RAIL|y unusual package +50883|790|87|1|43|72703.97|0.06|0.01|A|F|1992-08-28|1992-08-27|1992-09-01|TAKE BACK RETURN|AIR|ic deposits are slyly unusual requests-- e +50883|150|51|2|34|35705.10|0.05|0.02|R|F|1992-07-09|1992-07-09|1992-07-24|TAKE BACK RETURN|REG AIR|ide of the blithely final foxes. qu +50883|1648|90|3|27|41840.28|0.09|0.04|R|F|1992-08-15|1992-08-13|1992-08-16|NONE|TRUCK|he ironic platelets +50884|1004|75|1|46|41630.00|0.03|0.02|N|O|1998-11-16|1998-10-24|1998-12-16|COLLECT COD|REG AIR|bove the f +50884|149|50|2|3|3147.42|0.10|0.02|N|O|1998-09-23|1998-10-09|1998-10-17|DELIVER IN PERSON|SHIP|p finally af +50884|917|18|3|28|50901.48|0.05|0.08|N|O|1998-09-10|1998-10-16|1998-09-29|TAKE BACK RETURN|TRUCK|ly. carefully regular gifts haggle slyly +50884|1035|41|4|49|45865.47|0.02|0.07|N|O|1998-09-12|1998-09-09|1998-10-01|TAKE BACK RETURN|RAIL|special packages haggle flu +50884|1324|39|5|35|42886.20|0.05|0.01|N|O|1998-10-24|1998-08-30|1998-10-30|TAKE BACK RETURN|TRUCK|e carefully special, express foxes. bold re +50885|1161|34|1|37|39299.92|0.08|0.02|A|F|1995-02-07|1995-01-02|1995-02-16|COLLECT COD|REG AIR|s sleep quickly regular, bold +50885|1331|8|2|36|44363.88|0.03|0.04|A|F|1994-11-28|1995-01-01|1994-12-03|COLLECT COD|AIR|inst the blithe +50886|1466|67|1|39|53330.94|0.04|0.04|N|O|1998-05-10|1998-07-22|1998-05-28|TAKE BACK RETURN|REG AIR|sly foxes. pending deposits was carefully +50886|1362|39|2|45|56851.20|0.09|0.04|N|O|1998-05-31|1998-06-14|1998-06-21|COLLECT COD|REG AIR|counts use. ironic foxes af +50886|1893|37|3|18|32308.02|0.03|0.06|N|O|1998-05-14|1998-07-01|1998-06-04|COLLECT COD|AIR|s sleep furiously unus +50887|134|87|1|31|32058.03|0.08|0.04|A|F|1993-09-28|1993-08-03|1993-09-30|NONE|FOB|according to the final, bold foxes! even +50887|773|6|2|32|53560.64|0.01|0.05|R|F|1993-06-20|1993-08-09|1993-06-29|TAKE BACK RETURN|SHIP|ymptotes; carefully bold realms bo +50887|336|65|3|6|7417.98|0.09|0.06|A|F|1993-06-15|1993-07-18|1993-06-19|NONE|FOB|regular packages above the slyly fin +50887|1134|71|4|43|44510.59|0.10|0.08|A|F|1993-06-09|1993-08-21|1993-07-08|COLLECT COD|MAIL|ias affix slyl +50912|134|87|1|27|27921.51|0.06|0.06|N|O|1996-02-16|1996-03-23|1996-03-11|NONE|RAIL|uests acro +50912|1951|96|2|46|85235.70|0.08|0.04|N|O|1996-04-11|1996-04-09|1996-04-26|COLLECT COD|TRUCK| detect above the ironic instructions. +50912|7|33|3|44|39908.00|0.02|0.04|N|O|1996-03-01|1996-04-17|1996-03-22|DELIVER IN PERSON|SHIP|ctions. bold requests ha +50912|211|39|4|24|26669.04|0.03|0.03|N|O|1996-03-20|1996-04-09|1996-04-08|TAKE BACK RETURN|TRUCK|requests impress furiously above the bold f +50913|274|56|1|16|18788.32|0.02|0.02|N|O|1997-06-01|1997-05-09|1997-06-08|NONE|MAIL|uses. ironic, pending wate +50913|1855|56|2|5|8784.25|0.10|0.00|N|O|1997-04-06|1997-05-22|1997-04-26|NONE|MAIL|y bold packages again +50913|1986|87|3|36|67967.28|0.00|0.05|N|O|1997-02-23|1997-05-05|1997-03-11|COLLECT COD|MAIL|sly unusual foxes cajole carefully +50913|1909|98|4|14|25352.60|0.03|0.03|N|O|1997-06-11|1997-04-20|1997-06-12|COLLECT COD|RAIL|orges sleep idle, unusual deposi +50913|1651|34|5|3|4657.95|0.07|0.01|N|O|1997-04-11|1997-05-10|1997-05-01|COLLECT COD|RAIL|xpress requests. carefully ironic +50913|854|54|6|44|77213.40|0.07|0.00|N|O|1997-05-26|1997-05-06|1997-06-05|DELIVER IN PERSON|AIR|according t +50913|1587|88|7|19|28283.02|0.07|0.04|N|O|1997-05-12|1997-05-16|1997-06-02|DELIVER IN PERSON|RAIL|ic patterns. slyly special pi +50914|1577|98|1|32|47314.24|0.01|0.04|R|F|1992-07-27|1992-09-25|1992-08-02|DELIVER IN PERSON|MAIL|es. theodolites maintain; +50914|1060|66|2|12|11532.72|0.02|0.05|R|F|1992-08-20|1992-08-21|1992-09-18|NONE|RAIL|instructions. final accounts haggle. +50914|430|89|3|44|58538.92|0.01|0.06|A|F|1992-07-19|1992-08-03|1992-08-02|TAKE BACK RETURN|REG AIR|lly express deposits +50914|520|21|4|16|22728.32|0.02|0.07|R|F|1992-09-07|1992-08-19|1992-10-03|DELIVER IN PERSON|REG AIR|ng the regular accounts. quickly regu +50914|1506|87|5|47|66152.50|0.04|0.03|R|F|1992-07-09|1992-10-01|1992-07-16|NONE|TRUCK|nto beans doze. +50914|1746|89|6|27|44488.98|0.07|0.08|R|F|1992-10-20|1992-08-04|1992-11-17|DELIVER IN PERSON|TRUCK|pecial, silent pains around the furiou +50914|234|16|7|31|35161.13|0.10|0.06|A|F|1992-07-23|1992-09-12|1992-08-07|COLLECT COD|SHIP|fully regular ideas. +50915|877|11|1|6|10667.22|0.10|0.08|N|O|1996-07-16|1996-06-28|1996-07-20|COLLECT COD|REG AIR| along the fin +50915|1575|76|2|22|32484.54|0.04|0.03|N|O|1996-06-22|1996-07-04|1996-06-27|COLLECT COD|FOB|latelets cajol +50915|106|7|3|11|11067.10|0.03|0.05|N|O|1996-05-30|1996-06-21|1996-06-13|NONE|RAIL|uests wake blithely regular ideas +50916|1565|86|1|22|32264.32|0.01|0.00|R|F|1994-10-13|1994-09-29|1994-10-14|TAKE BACK RETURN|RAIL|s. fluffily even theodolites a +50916|643|75|2|50|77182.00|0.09|0.06|A|F|1994-10-29|1994-10-31|1994-11-11|COLLECT COD|AIR|kages detect carefully inst +50917|1235|73|1|20|22724.60|0.03|0.04|A|F|1994-08-25|1994-09-03|1994-09-17|DELIVER IN PERSON|MAIL|as use furiously. car +50917|1734|19|2|50|81786.50|0.10|0.04|A|F|1994-10-29|1994-09-22|1994-11-03|NONE|REG AIR|nts. regular instructions along +50918|399|28|1|31|40281.09|0.03|0.02|R|F|1993-12-07|1994-01-04|1994-01-05|NONE|MAIL|lly unusual escap +50918|1146|19|2|36|37697.04|0.05|0.03|A|F|1994-04-03|1994-01-08|1994-04-10|COLLECT COD|AIR|sts poach blithely about the slyly fi +50918|1450|51|3|42|56760.90|0.09|0.05|R|F|1994-03-19|1994-01-07|1994-03-20|TAKE BACK RETURN|FOB|sts cajole beside the packages +50918|1716|59|4|1|1617.71|0.05|0.06|R|F|1994-01-01|1994-01-19|1994-01-08|NONE|AIR|bold deposits boost fu +50918|1799|42|5|44|74834.76|0.06|0.01|A|F|1994-02-16|1994-01-24|1994-02-23|DELIVER IN PERSON|MAIL|ironic foxes +50918|677|78|6|5|7888.35|0.07|0.01|R|F|1993-12-26|1994-03-03|1993-12-29|TAKE BACK RETURN|MAIL|express pinto +50919|878|12|1|27|48029.49|0.02|0.04|N|O|1995-07-21|1995-09-10|1995-08-11|TAKE BACK RETURN|MAIL| the final instructions. even +50919|229|11|2|3|3387.66|0.01|0.02|N|O|1995-07-15|1995-09-08|1995-08-11|NONE|SHIP|ly special platelets-- +50919|535|36|3|37|53114.61|0.02|0.06|N|O|1995-10-17|1995-08-13|1995-11-05|DELIVER IN PERSON|FOB|ithout the b +50919|1127|28|4|23|23646.76|0.05|0.00|N|O|1995-10-17|1995-08-18|1995-11-04|DELIVER IN PERSON|SHIP|s across the depos +50944|1110|19|1|42|42466.62|0.03|0.02|N|O|1998-07-22|1998-09-13|1998-08-16|DELIVER IN PERSON|RAIL|olphins. thinly special accounts inte +50944|1629|53|2|45|68877.90|0.06|0.01|N|O|1998-08-08|1998-09-07|1998-08-24|TAKE BACK RETURN|REG AIR|ar pinto bean +50944|1081|82|3|29|28480.32|0.01|0.06|N|O|1998-09-14|1998-08-20|1998-09-30|TAKE BACK RETURN|TRUCK|ites detect. final theodolites +50944|1663|46|4|27|42245.82|0.04|0.08|N|O|1998-09-02|1998-08-05|1998-09-13|NONE|REG AIR|p quickly along the fur +50944|736|33|5|38|62195.74|0.00|0.08|N|O|1998-09-10|1998-08-28|1998-09-15|NONE|MAIL|e carefully regular de +50945|1130|67|1|29|29902.77|0.06|0.03|R|F|1995-03-02|1995-03-07|1995-03-17|NONE|MAIL|ests affix furiously outside +50945|785|50|2|13|21915.14|0.02|0.06|R|F|1995-04-25|1995-02-08|1995-04-28|COLLECT COD|REG AIR|tions among the ironic, silent requ +50945|1647|48|3|39|60396.96|0.08|0.00|A|F|1995-02-03|1995-02-18|1995-02-04|DELIVER IN PERSON|RAIL|ound the requests. pendi +50946|1110|83|1|43|43477.73|0.02|0.07|N|O|1998-09-08|1998-09-04|1998-10-01|DELIVER IN PERSON|SHIP|quests. regular foxes wa +50946|1209|10|2|47|52179.40|0.08|0.01|N|O|1998-08-05|1998-08-16|1998-08-11|DELIVER IN PERSON|AIR|eodolites. carefully unusual excuse +50947|1930|31|1|40|73277.20|0.03|0.07|N|O|1996-03-31|1996-03-12|1996-04-02|DELIVER IN PERSON|AIR|uickly bold ideas. even deposits +50947|1074|75|2|33|32177.31|0.02|0.03|N|O|1996-02-20|1996-04-11|1996-03-10|NONE|AIR|ar foxes cajole enticingly. slyly spec +50947|133|86|3|21|21695.73|0.01|0.01|N|O|1996-03-30|1996-05-07|1996-04-09|COLLECT COD|FOB|regular deposits +50947|1305|82|4|3|3618.90|0.08|0.00|N|O|1996-03-21|1996-04-23|1996-03-30|NONE|RAIL|ounts grow +50947|656|19|5|47|73162.55|0.02|0.03|N|O|1996-02-15|1996-04-27|1996-03-06|TAKE BACK RETURN|MAIL| ideas nag: fluffily final asymptot +50947|1426|27|6|3|3982.26|0.00|0.07|N|O|1996-04-13|1996-03-28|1996-05-03|NONE|REG AIR|ironic packages. carefully +50948|1957|46|1|39|72499.05|0.10|0.07|A|F|1994-11-03|1994-09-28|1994-11-16|DELIVER IN PERSON|SHIP| furiously regular requ +50949|47|23|1|32|30305.28|0.02|0.08|R|F|1995-04-17|1995-05-03|1995-04-18|NONE|AIR|carefully final frays cajole somet +50949|1196|33|2|33|36207.27|0.07|0.04|R|F|1995-05-17|1995-03-15|1995-06-15|COLLECT COD|RAIL|nag quickly ironic theodolites. ironic +50949|150|3|3|19|19952.85|0.08|0.04|R|F|1995-04-23|1995-04-09|1995-05-10|NONE|AIR|uickly pending accounts. furiou +50949|408|96|4|26|34018.40|0.08|0.04|R|F|1995-03-03|1995-04-23|1995-03-21|COLLECT COD|RAIL|deposits engage pending de +50950|761|62|1|4|6647.04|0.01|0.00|R|F|1993-01-08|1993-03-11|1993-01-24|DELIVER IN PERSON|TRUCK|xes across the carefully even warhorses +50950|1602|26|2|49|73676.40|0.01|0.03|R|F|1993-01-19|1993-02-17|1993-01-20|NONE|SHIP|arefully about the quickly special p +50950|1744|87|3|49|80641.26|0.01|0.04|R|F|1993-03-25|1993-02-27|1993-04-12|NONE|REG AIR|nal requests along the quickly spec +50950|860|94|4|20|35217.20|0.05|0.07|A|F|1993-01-20|1993-03-12|1993-02-01|NONE|RAIL|ar requests. dolph +50951|25|26|1|18|16650.36|0.07|0.07|A|F|1992-04-29|1992-05-31|1992-04-30|TAKE BACK RETURN|TRUCK|foxes. unusual requests cajole ev +50951|1665|7|2|41|64233.06|0.10|0.03|R|F|1992-05-24|1992-05-24|1992-06-21|COLLECT COD|SHIP|ke slyly fu +50951|1397|98|3|12|15580.68|0.09|0.00|A|F|1992-04-21|1992-05-24|1992-05-03|COLLECT COD|AIR|pending accounts ha +50951|1483|23|4|4|5537.92|0.00|0.05|R|F|1992-07-22|1992-05-12|1992-08-05|TAKE BACK RETURN|AIR| about the expr +50951|146|73|5|17|17784.38|0.09|0.00|R|F|1992-07-12|1992-06-05|1992-07-31|TAKE BACK RETURN|RAIL|r packages. quick +50951|1108|9|6|17|17154.70|0.02|0.03|R|F|1992-04-05|1992-05-18|1992-04-23|NONE|TRUCK|wake blithely carefully regular depo +50976|1766|9|1|23|38358.48|0.01|0.08|R|F|1995-03-02|1995-01-31|1995-03-15|NONE|MAIL|ly ironic ideas affix. carefully regu +50976|1578|99|2|39|57703.23|0.09|0.03|A|F|1995-02-06|1995-01-18|1995-02-10|NONE|TRUCK|ily pending deposits. foxes engage b +50976|1982|27|3|7|13187.86|0.08|0.07|R|F|1995-02-04|1995-01-22|1995-02-23|TAKE BACK RETURN|AIR|regular deposits cajole. enticingly +50977|708|9|1|18|28956.60|0.09|0.07|R|F|1992-07-31|1992-08-18|1992-08-06|TAKE BACK RETURN|RAIL|slyly against the furiously special theo +50977|1341|56|2|29|36027.86|0.04|0.01|R|F|1992-07-12|1992-08-26|1992-07-24|DELIVER IN PERSON|RAIL|ng foxes breac +50977|1207|45|3|37|41003.40|0.08|0.08|R|F|1992-07-13|1992-09-04|1992-08-06|DELIVER IN PERSON|AIR| the furiously final +50977|825|92|4|27|46597.14|0.07|0.02|R|F|1992-10-07|1992-08-03|1992-10-11|NONE|FOB|. closely ironic f +50977|1230|5|5|26|29411.98|0.02|0.01|R|F|1992-10-09|1992-07-13|1992-10-29|TAKE BACK RETURN|SHIP|egular ideas. carefully silen +50977|1072|78|6|45|43788.15|0.00|0.05|R|F|1992-08-20|1992-09-05|1992-08-27|COLLECT COD|AIR|c requests h +50978|160|39|1|45|47707.20|0.00|0.00|A|F|1992-05-09|1992-05-02|1992-06-07|TAKE BACK RETURN|REG AIR|even asymptotes boost after +50978|1102|3|2|40|40124.00|0.09|0.08|R|F|1992-06-14|1992-05-14|1992-06-27|NONE|RAIL| theodolites wake carefully again +50978|232|33|3|9|10190.07|0.02|0.04|A|F|1992-04-11|1992-05-27|1992-04-22|COLLECT COD|MAIL| express pinto +50979|561|22|1|38|55539.28|0.03|0.02|A|F|1992-08-10|1992-06-01|1992-08-12|TAKE BACK RETURN|AIR|regular, fina +50979|383|40|2|33|42351.54|0.08|0.04|A|F|1992-05-10|1992-06-07|1992-05-25|NONE|REG AIR|ng multipliers. quiet, enticing pinto bea +50979|1288|89|3|21|24974.88|0.08|0.05|A|F|1992-06-11|1992-06-15|1992-06-23|TAKE BACK RETURN|REG AIR|are quickly about the r +50979|1589|10|4|45|67076.10|0.03|0.01|A|F|1992-04-21|1992-07-10|1992-05-07|DELIVER IN PERSON|AIR|structions sleep ca +50979|1861|91|5|41|72277.26|0.01|0.02|A|F|1992-06-15|1992-06-16|1992-06-17|NONE|REG AIR|eep about the quickly unusual deposits. eve +50980|1190|99|1|13|14185.47|0.03|0.01|N|O|1998-05-05|1998-04-28|1998-05-19|TAKE BACK RETURN|FOB|ecial deposits. quickly i +50981|1076|77|1|44|42991.08|0.04|0.06|R|F|1994-11-05|1994-10-27|1994-11-07|DELIVER IN PERSON|MAIL|ts. furiously unusual pa +50981|652|15|2|44|68316.60|0.03|0.03|A|F|1994-09-21|1994-09-08|1994-10-11|DELIVER IN PERSON|MAIL|final ideas. q +50981|1924|69|3|20|36518.40|0.04|0.02|R|F|1994-08-21|1994-09-12|1994-09-11|NONE|SHIP|ar instructions haggle blithely. even +50981|248|76|4|11|12630.64|0.09|0.02|R|F|1994-11-24|1994-09-17|1994-12-13|NONE|FOB|ecial packages are blithely carefully final +50982|1043|14|1|46|43425.84|0.00|0.04|A|F|1992-07-18|1992-05-25|1992-08-11|TAKE BACK RETURN|TRUCK|deas wake furiously pending accounts. regul +50982|299|100|2|12|14391.48|0.08|0.07|R|F|1992-04-27|1992-06-17|1992-05-05|DELIVER IN PERSON|AIR|yly bold requests wake quickly. furious +50982|1090|91|3|4|3964.36|0.07|0.07|A|F|1992-06-22|1992-07-14|1992-07-14|TAKE BACK RETURN|FOB|counts integrate ca +50982|544|35|4|44|63559.76|0.04|0.02|R|F|1992-08-11|1992-05-19|1992-08-28|COLLECT COD|FOB|express deposit +50983|537|98|1|34|48876.02|0.05|0.04|N|O|1995-10-06|1995-08-08|1995-10-31|TAKE BACK RETURN|TRUCK|quests doubt fl +50983|497|56|2|45|62887.05|0.08|0.01|N|O|1995-07-05|1995-09-20|1995-07-11|TAKE BACK RETURN|TRUCK|ffily enticing hockey players +50983|447|48|3|46|61982.24|0.01|0.00|N|O|1995-07-26|1995-08-01|1995-08-24|DELIVER IN PERSON|AIR|y. slyly pending instructions sleep +50983|712|45|4|33|53219.43|0.06|0.04|N|O|1995-07-15|1995-08-04|1995-08-05|DELIVER IN PERSON|FOB|uriously pending requests cajole. +50983|1942|31|5|13|23971.22|0.03|0.08|N|O|1995-10-16|1995-09-11|1995-11-06|TAKE BACK RETURN|FOB|into beans. slyly ir +50983|494|95|6|36|50201.64|0.04|0.01|N|O|1995-09-12|1995-08-12|1995-10-08|COLLECT COD|AIR|y ironic packages doz +51008|445|33|1|41|55163.04|0.08|0.01|N|O|1995-12-01|1995-10-14|1995-12-29|COLLECT COD|SHIP|according to the carefully ironic +51008|1061|67|2|36|34634.16|0.08|0.00|N|O|1995-11-17|1995-10-02|1995-12-14|DELIVER IN PERSON|TRUCK|blithely ironic requests. blithely ironic +51008|334|35|3|41|50607.53|0.08|0.00|N|O|1995-10-18|1995-11-06|1995-11-08|NONE|SHIP|xpress patterns +51008|1527|48|4|38|54283.76|0.02|0.05|N|O|1995-12-07|1995-10-04|1995-12-19|NONE|RAIL|ent packages sleep quickly among the care +51008|1460|78|5|37|50374.02|0.08|0.07|N|O|1995-11-18|1995-11-10|1995-12-17|TAKE BACK RETURN|FOB|lly ironic +51008|801|68|6|26|44246.80|0.06|0.03|N|O|1995-11-20|1995-10-08|1995-12-15|TAKE BACK RETURN|SHIP|eful, final grouches wake above the +51009|721|18|1|41|66490.52|0.08|0.08|N|O|1996-01-15|1995-12-26|1996-02-13|DELIVER IN PERSON|FOB|jole according to the even, final req +51009|1296|34|2|31|37115.99|0.04|0.02|N|O|1995-11-25|1996-01-02|1995-12-24|NONE|REG AIR|about the slyly final pinto b +51009|974|77|3|22|41249.34|0.10|0.07|N|O|1995-12-18|1995-12-18|1995-12-23|COLLECT COD|AIR|riously ironic packag +51009|1075|11|4|49|47827.43|0.01|0.08|N|O|1995-11-15|1996-01-20|1995-12-10|DELIVER IN PERSON|REG AIR|ally regular pinto beans. unusual, unusual +51009|843|44|5|23|40108.32|0.08|0.02|N|O|1995-12-04|1995-12-19|1995-12-09|COLLECT COD|TRUCK|bout the quickly express deposits x-ray f +51009|1871|1|6|41|72687.67|0.03|0.01|N|O|1996-01-31|1995-12-21|1996-02-27|TAKE BACK RETURN|AIR|tions. blithely bold pinto beans wake +51009|933|34|7|21|38512.53|0.04|0.05|N|O|1996-01-21|1995-12-18|1996-02-14|TAKE BACK RETURN|RAIL|beans thrash +51010|198|25|1|27|29651.13|0.06|0.01|A|F|1993-12-18|1993-11-17|1993-12-22|TAKE BACK RETURN|AIR|he closely special pint +51010|959|62|2|9|16739.55|0.03|0.01|A|F|1993-11-28|1993-12-07|1993-12-10|TAKE BACK RETURN|RAIL|hrash carefully against the final depo +51011|831|31|1|40|69273.20|0.07|0.01|A|F|1993-06-12|1993-08-18|1993-07-02|TAKE BACK RETURN|AIR|to beans. furiousl +51011|413|1|2|21|27581.61|0.02|0.06|A|F|1993-06-25|1993-08-17|1993-07-10|NONE|RAIL|uriously after the Tiresias +51011|725|22|3|38|61777.36|0.03|0.03|A|F|1993-09-03|1993-07-22|1993-09-09|COLLECT COD|RAIL|ully special foxes after t +51012|226|27|1|49|55184.78|0.00|0.04|N|O|1995-08-18|1995-06-30|1995-09-07|DELIVER IN PERSON|RAIL| carefully +51012|453|83|2|38|51431.10|0.09|0.00|N|F|1995-06-01|1995-07-05|1995-06-20|DELIVER IN PERSON|RAIL|nst the carefully fin +51013|701|66|1|10|16017.00|0.03|0.00|A|F|1993-04-23|1993-05-29|1993-05-06|COLLECT COD|REG AIR|ly special pinto beans cajole care +51014|1843|73|1|3|5234.52|0.08|0.03|N|O|1996-09-03|1996-10-25|1996-09-17|COLLECT COD|FOB|de of the carefully +51014|1173|10|2|22|23631.74|0.10|0.06|N|O|1996-10-08|1996-10-28|1996-10-21|NONE|SHIP|es shall have t +51014|203|4|3|40|44128.00|0.05|0.08|N|O|1996-09-21|1996-10-06|1996-09-29|TAKE BACK RETURN|TRUCK|ns. ideas integ +51014|1603|4|4|48|72220.80|0.01|0.08|N|O|1996-11-11|1996-09-18|1996-11-20|NONE|REG AIR|ainst the final platelets affix +51014|1617|100|5|12|18223.32|0.08|0.01|N|O|1996-09-25|1996-09-10|1996-10-11|DELIVER IN PERSON|AIR|g to the bold asymptotes slee +51014|81|7|6|17|16678.36|0.01|0.05|N|O|1996-08-13|1996-09-24|1996-08-31|TAKE BACK RETURN|RAIL|counts across t +51015|1716|17|1|42|67943.82|0.01|0.02|A|F|1994-03-16|1994-03-22|1994-03-29|NONE|AIR|s. ironic instructions affix +51015|1669|70|2|17|26701.22|0.00|0.07|R|F|1994-04-11|1994-03-22|1994-04-13|COLLECT COD|MAIL|ven asymptotes nag caref +51040|1769|12|1|42|70171.92|0.00|0.00|N|O|1997-04-13|1997-03-13|1997-04-27|DELIVER IN PERSON|TRUCK|kages. ideas among the ironic accounts +51040|1812|99|2|35|59983.35|0.05|0.06|N|O|1997-03-13|1997-04-03|1997-03-16|NONE|MAIL|g the always final dependencies. regular de +51041|1117|54|1|31|31561.41|0.03|0.04|A|F|1993-11-11|1993-09-30|1993-11-23|COLLECT COD|SHIP| haggle slyly. fluffily ruthle +51041|1185|22|2|15|16292.70|0.07|0.02|R|F|1993-08-05|1993-09-15|1993-08-22|DELIVER IN PERSON|AIR|lithely among the furiously pending ins +51042|1118|19|1|37|37707.07|0.09|0.06|N|O|1998-01-13|1998-02-18|1998-01-24|TAKE BACK RETURN|TRUCK| sleep spec +51042|1493|33|2|37|51596.13|0.08|0.00|N|O|1998-02-04|1998-01-06|1998-02-05|NONE|RAIL|. furiously pending requests ag +51042|1527|48|3|43|61426.36|0.00|0.04|N|O|1998-03-14|1998-01-06|1998-04-06|COLLECT COD|RAIL|ffily ironi +51042|62|63|4|39|37520.34|0.07|0.01|N|O|1998-03-26|1998-03-04|1998-04-01|NONE|SHIP|y along the slyly express soma +51042|1559|80|5|12|17526.60|0.09|0.07|N|O|1998-03-11|1998-01-12|1998-04-10|COLLECT COD|REG AIR|ate along the blithely unusual ac +51042|1787|88|6|34|57418.52|0.10|0.06|N|O|1998-03-28|1998-01-31|1998-04-12|DELIVER IN PERSON|RAIL| instructions. blithely even ideas a +51042|1123|24|7|20|20482.40|0.02|0.02|N|O|1998-02-06|1998-03-01|1998-03-02|DELIVER IN PERSON|TRUCK|posits haggle. ideas abo +51043|832|33|1|23|39855.09|0.04|0.04|N|O|1997-06-16|1997-07-23|1997-07-15|NONE|SHIP|he slyly pending accounts. fluffily pendi +51044|1361|100|1|11|13885.96|0.06|0.06|R|F|1992-05-16|1992-03-11|1992-05-31|DELIVER IN PERSON|REG AIR|hely. bold ideas alongside of th +51044|1095|96|2|7|6972.63|0.06|0.02|A|F|1992-04-20|1992-03-25|1992-05-13|COLLECT COD|TRUCK|ickly bold accounts haggle regular, +51044|1502|3|3|32|44912.00|0.10|0.00|A|F|1992-03-19|1992-04-12|1992-03-20|DELIVER IN PERSON|REG AIR|es sleep blithely ex +51044|526|57|4|43|61340.36|0.06|0.04|R|F|1992-04-29|1992-03-22|1992-05-25|TAKE BACK RETURN|AIR| slyly regular depths wake instructions. +51044|590|91|5|6|8943.54|0.02|0.06|R|F|1992-03-03|1992-04-04|1992-03-20|COLLECT COD|REG AIR|s wake furiously agai +51044|1124|61|6|14|14351.68|0.02|0.04|R|F|1992-04-03|1992-03-22|1992-04-07|NONE|SHIP|lyly pending excuses on the +51044|946|15|7|34|62795.96|0.04|0.05|R|F|1992-01-23|1992-03-15|1992-02-09|TAKE BACK RETURN|TRUCK| are. unusual dep +51045|401|31|1|20|26028.00|0.04|0.00|R|F|1992-10-29|1993-01-05|1992-11-27|DELIVER IN PERSON|REG AIR| the furiously even theodolit +51045|1757|84|2|19|31516.25|0.05|0.08|R|F|1992-10-19|1992-11-30|1992-10-25|NONE|RAIL|uffy accounts. regular foxes a +51045|735|68|3|20|32714.60|0.06|0.03|R|F|1993-01-17|1992-12-04|1993-01-19|COLLECT COD|TRUCK|jole. fluffily special escapad +51045|1798|41|4|26|44194.54|0.08|0.08|A|F|1993-01-16|1993-01-06|1993-02-12|DELIVER IN PERSON|REG AIR|y blithe theodolites. ir +51045|1771|14|5|42|70256.34|0.07|0.03|R|F|1993-01-19|1992-12-15|1993-01-23|DELIVER IN PERSON|FOB|accounts integrate furiously slyly +51045|102|29|6|42|42088.20|0.04|0.03|R|F|1992-11-01|1993-01-12|1992-12-01|DELIVER IN PERSON|SHIP| final packages cajole accoun +51046|1113|50|1|1|1014.11|0.05|0.02|N|O|1997-05-02|1997-06-03|1997-05-17|TAKE BACK RETURN|TRUCK| ironic ideas +51046|1105|78|2|44|44268.40|0.07|0.02|N|O|1997-05-29|1997-05-08|1997-06-15|DELIVER IN PERSON|AIR|ns. regular ideas sleep fluffily. express, +51046|198|99|3|8|8785.52|0.08|0.02|N|O|1997-04-15|1997-05-03|1997-04-20|DELIVER IN PERSON|SHIP|requests. slyly regular theodolites +51046|1698|99|4|17|27194.73|0.10|0.01|N|O|1997-07-17|1997-05-07|1997-07-20|COLLECT COD|MAIL|cial foxes. even instructions mold +51046|1546|67|5|15|21713.10|0.08|0.02|N|O|1997-05-28|1997-06-15|1997-06-07|TAKE BACK RETURN|AIR|ts use furiously +51046|129|8|6|38|39106.56|0.09|0.06|N|O|1997-05-12|1997-05-29|1997-05-22|TAKE BACK RETURN|FOB| final deposits. quickly silent packages ac +51047|185|12|1|22|23873.96|0.05|0.06|A|F|1994-05-02|1994-06-12|1994-05-21|TAKE BACK RETURN|REG AIR|ross the quickly ironic idea +51047|670|71|2|39|61256.13|0.09|0.04|A|F|1994-06-05|1994-06-04|1994-06-12|TAKE BACK RETURN|AIR|e blithely. carefully +51047|569|30|3|29|42617.24|0.02|0.08|A|F|1994-05-19|1994-07-07|1994-06-07|DELIVER IN PERSON|SHIP|ld requests around the c +51047|1843|87|4|17|29662.28|0.00|0.08|R|F|1994-07-13|1994-06-16|1994-08-04|TAKE BACK RETURN|MAIL|carefully thin theodolites. +51047|1984|73|5|10|18859.80|0.10|0.03|R|F|1994-05-19|1994-06-22|1994-05-29|COLLECT COD|AIR|y regular +51072|1903|4|1|26|46927.40|0.00|0.08|R|F|1994-11-11|1994-12-05|1994-11-13|DELIVER IN PERSON|FOB|ularly against the ir +51072|1155|64|2|46|48582.90|0.02|0.04|A|F|1994-10-05|1994-11-14|1994-10-07|TAKE BACK RETURN|SHIP|ost carefully furiously fina +51072|1683|25|3|15|23770.20|0.08|0.02|A|F|1994-11-19|1994-12-20|1994-11-28|TAKE BACK RETURN|RAIL|ing deposits are +51073|569|100|1|24|35269.44|0.01|0.03|R|F|1993-06-23|1993-08-09|1993-07-20|DELIVER IN PERSON|FOB|pending instructions sleep quic +51073|1457|75|2|12|16301.40|0.08|0.07|A|F|1993-05-19|1993-07-10|1993-06-14|TAKE BACK RETURN|REG AIR|ronic pinto beans haggle carefully. slyly +51073|649|81|3|8|12397.12|0.03|0.08|R|F|1993-08-09|1993-07-14|1993-08-28|DELIVER IN PERSON|REG AIR|iously alongside of +51073|1103|4|4|46|46188.60|0.09|0.02|A|F|1993-09-09|1993-08-08|1993-09-21|COLLECT COD|SHIP|. carefully pendi +51073|1735|78|5|40|65469.20|0.10|0.01|A|F|1993-08-12|1993-07-27|1993-08-15|COLLECT COD|RAIL|blithely re +51073|1856|100|6|17|29883.45|0.04|0.01|R|F|1993-06-04|1993-06-24|1993-06-13|NONE|TRUCK|ual deposits. ideas at the fur +51074|620|14|1|35|53221.70|0.04|0.07|N|O|1995-12-25|1995-10-07|1996-01-15|COLLECT COD|RAIL|ously. slyly ironic package +51074|485|15|2|45|62346.60|0.08|0.00|N|O|1995-10-06|1995-11-23|1995-10-25|TAKE BACK RETURN|MAIL|kages after +51074|1211|23|3|1|1112.21|0.00|0.07|N|O|1995-10-27|1995-11-11|1995-11-13|COLLECT COD|RAIL|nusual, even accounts. blithe +51074|390|47|4|12|15484.68|0.10|0.00|N|O|1995-10-15|1995-11-13|1995-11-14|NONE|TRUCK|ending pinto beans-- final acc +51074|714|15|5|4|6458.84|0.10|0.01|N|O|1995-09-10|1995-11-30|1995-09-26|NONE|MAIL|gular foxes nod slyly furiously pending pi +51075|1478|96|1|22|30348.34|0.03|0.07|R|F|1994-02-14|1994-02-13|1994-02-18|COLLECT COD|REG AIR|ckages outside the +51075|1167|40|2|7|7477.12|0.01|0.07|R|F|1994-02-03|1994-02-19|1994-02-24|DELIVER IN PERSON|MAIL|esias nag. furiou +51075|1139|76|3|21|21842.73|0.06|0.03|A|F|1994-03-15|1994-02-16|1994-03-16|COLLECT COD|SHIP|y about the quickly even deposit +51075|500|30|4|36|50418.00|0.07|0.01|R|F|1993-12-12|1994-01-21|1993-12-15|COLLECT COD|SHIP|ress ideas doubt carefu +51076|1753|80|1|32|52952.00|0.06|0.05|N|O|1996-12-22|1996-11-19|1997-01-16|NONE|TRUCK|e regular, final ideas. re +51077|621|53|1|46|69994.52|0.08|0.01|N|O|1997-04-07|1997-03-05|1997-04-17|COLLECT COD|MAIL|lyly regular accounts. ironic package +51077|452|82|2|23|31106.35|0.05|0.06|N|O|1997-03-17|1997-04-03|1997-04-10|DELIVER IN PERSON|REG AIR| slyly express Tiresias across t +51077|23|49|3|13|11999.26|0.08|0.01|N|O|1997-04-05|1997-04-19|1997-04-24|DELIVER IN PERSON|RAIL|nstructions cajole blit +51077|1912|1|4|6|10883.46|0.06|0.02|N|O|1997-05-29|1997-04-24|1997-06-02|TAKE BACK RETURN|RAIL|cial braids alon +51077|476|35|5|19|26152.93|0.05|0.04|N|O|1997-02-28|1997-03-29|1997-03-19|COLLECT COD|MAIL| bold instructions +51078|1324|25|1|38|46562.16|0.04|0.00|N|O|1997-04-26|1997-03-16|1997-05-06|NONE|AIR| carefully slyly unusual foxes? blith +51078|629|23|2|13|19885.06|0.06|0.06|N|O|1997-05-05|1997-03-15|1997-06-02|COLLECT COD|RAIL|riously slyly regu +51078|974|9|3|34|63748.98|0.04|0.05|N|O|1997-05-06|1997-05-04|1997-05-23|DELIVER IN PERSON|MAIL|s about the quick +51079|1690|91|1|38|60484.22|0.03|0.01|N|O|1998-02-28|1998-01-06|1998-03-02|DELIVER IN PERSON|RAIL|yly. blithely pending packages pl +51079|942|45|2|3|5528.82|0.10|0.03|N|O|1998-01-11|1998-02-19|1998-01-23|COLLECT COD|FOB|according to the blithel +51079|1765|66|3|13|21667.88|0.05|0.05|N|O|1998-02-11|1998-01-07|1998-03-10|TAKE BACK RETURN|RAIL|kly along the blithely +51079|1837|38|4|9|15649.47|0.09|0.01|N|O|1998-03-20|1998-01-24|1998-04-19|NONE|FOB|. quickly bold instructions boost car +51079|527|88|5|36|51390.72|0.10|0.08|N|O|1998-03-09|1998-01-01|1998-04-03|COLLECT COD|TRUCK|sits are into the regular id +51104|556|87|1|15|21848.25|0.06|0.05|N|O|1998-01-08|1997-11-20|1998-02-06|DELIVER IN PERSON|SHIP|. even, express dolphins sleep about t +51104|190|69|2|16|17443.04|0.06|0.07|N|O|1997-10-10|1997-12-03|1997-10-19|COLLECT COD|FOB|ke about the quickly bold instructions. pen +51104|1003|9|3|2|1808.00|0.10|0.07|N|O|1997-10-29|1997-12-12|1997-11-05|NONE|TRUCK| requests. ironic, regular i +51105|1639|63|1|12|18487.56|0.02|0.00|N|O|1998-07-13|1998-08-10|1998-08-02|TAKE BACK RETURN|TRUCK| final pinto beans. final requests inte +51105|1609|92|2|34|51360.40|0.10|0.00|N|O|1998-07-23|1998-08-06|1998-08-03|NONE|MAIL|he slyly s +51105|259|14|3|5|5796.25|0.03|0.04|N|O|1998-08-13|1998-06-26|1998-09-07|DELIVER IN PERSON|SHIP|ts sleep final, +51106|505|96|1|6|8433.00|0.07|0.06|A|F|1993-10-15|1993-10-18|1993-11-14|NONE|AIR|luffily ironic p +51107|530|91|1|46|65804.38|0.01|0.06|R|F|1992-12-06|1992-11-23|1992-12-17|NONE|MAIL|ckages. foxes according to +51107|1589|90|2|30|44717.40|0.01|0.02|A|F|1992-12-13|1992-12-09|1993-01-08|DELIVER IN PERSON|AIR|rns. furious +51107|185|64|3|25|27129.50|0.08|0.05|R|F|1992-10-27|1992-12-01|1992-11-20|NONE|AIR|xcuses. speci +51107|487|75|4|39|54111.72|0.02|0.00|R|F|1992-12-01|1992-10-28|1992-12-02|NONE|AIR|ly furious +51108|392|49|1|50|64619.50|0.01|0.06|N|O|1996-10-19|1996-11-21|1996-11-05|NONE|REG AIR|r requests boo +51108|1074|10|2|35|34127.45|0.06|0.03|N|O|1996-09-19|1996-11-11|1996-09-25|TAKE BACK RETURN|FOB|oze furiou +51108|647|48|3|11|17024.04|0.01|0.03|N|O|1996-11-24|1996-11-05|1996-12-19|COLLECT COD|REG AIR|. furiously ironic deposits alongside of th +51109|262|44|1|22|25569.72|0.03|0.08|R|F|1992-11-10|1992-12-27|1992-11-26|COLLECT COD|RAIL|ely even pinto beans nag permanent +51110|1484|63|1|2|2770.96|0.09|0.05|N|O|1996-08-09|1996-09-18|1996-08-14|DELIVER IN PERSON|SHIP|unusual accounts +51110|377|62|2|4|5109.48|0.04|0.08|N|O|1996-09-18|1996-10-18|1996-10-06|COLLECT COD|REG AIR|cally ironic requests af +51110|259|14|3|16|18548.00|0.04|0.07|N|O|1996-11-05|1996-10-13|1996-11-23|NONE|SHIP|arefully furiously final de +51110|532|63|4|38|54436.14|0.10|0.01|N|O|1996-11-12|1996-09-23|1996-12-01|COLLECT COD|RAIL| even pinto beans cajole carefully +51111|1894|24|1|13|23346.57|0.00|0.07|R|F|1992-02-24|1992-03-27|1992-03-05|TAKE BACK RETURN|SHIP|e pinto beans. special, even +51111|1926|71|2|11|20107.12|0.04|0.03|A|F|1992-04-09|1992-03-26|1992-04-27|NONE|TRUCK|e slyly even theodolites. fluffily dogged f +51111|590|81|3|42|62604.78|0.01|0.06|R|F|1992-04-12|1992-04-27|1992-04-18|NONE|REG AIR| furiously ironic theodolites use blith +51136|1566|67|1|33|48429.48|0.10|0.06|A|F|1992-05-29|1992-08-11|1992-06-01|TAKE BACK RETURN|FOB|press packages use thinly abo +51136|218|73|2|25|27955.25|0.01|0.07|A|F|1992-06-09|1992-07-01|1992-07-07|DELIVER IN PERSON|SHIP|press asymptotes serve. slyly ironic d +51137|1899|43|1|28|50424.92|0.01|0.07|N|O|1997-01-09|1996-10-24|1997-01-22|TAKE BACK RETURN|RAIL|ses. bold accounts boost furiously. fi +51137|1742|85|2|31|50955.94|0.10|0.07|N|O|1996-12-17|1996-10-28|1997-01-11|COLLECT COD|MAIL|nts cajole slyly pen +51137|1002|8|3|28|25284.00|0.08|0.01|N|O|1997-01-04|1996-10-20|1997-02-03|COLLECT COD|SHIP|atelets prom +51137|1879|9|4|38|67673.06|0.02|0.01|N|O|1996-12-06|1996-11-22|1996-12-31|TAKE BACK RETURN|MAIL|e carefully carefully final accounts. p +51137|638|39|5|47|72315.61|0.10|0.01|N|O|1996-12-02|1996-11-25|1997-01-01|NONE|RAIL|osits wake fluffily ag +51137|246|74|6|24|27509.76|0.06|0.04|N|O|1996-10-26|1996-11-13|1996-11-14|COLLECT COD|FOB|ts. foxes use quickl +51137|548|49|7|39|56493.06|0.08|0.02|N|O|1996-12-28|1996-10-16|1997-01-17|COLLECT COD|SHIP|ts solve blithely. regular, fin +51138|1680|4|1|4|6326.72|0.05|0.04|N|O|1997-10-20|1997-10-19|1997-10-29|DELIVER IN PERSON|AIR|furiously special instructions. fu +51138|1000|3|2|5|4505.00|0.08|0.01|N|O|1997-12-12|1997-11-05|1997-12-25|NONE|AIR| final accounts poach according to the theo +51138|1659|60|3|1|1560.65|0.04|0.00|N|O|1998-01-04|1997-10-25|1998-01-14|NONE|TRUCK|ckages cajole closely regular +51138|1783|10|4|32|53912.96|0.06|0.01|N|O|1997-11-15|1997-11-15|1997-11-27|NONE|MAIL|ss accounts along the even, regular +51138|91|42|5|27|26759.43|0.03|0.05|N|O|1997-11-24|1997-10-28|1997-12-20|NONE|MAIL|lthy pinto beans ha +51138|98|74|6|5|4990.45|0.05|0.07|N|O|1997-10-28|1997-10-22|1997-11-06|DELIVER IN PERSON|SHIP| excuses. car +51139|110|37|1|5|5050.55|0.01|0.00|R|F|1994-12-01|1994-10-27|1994-12-18|COLLECT COD|REG AIR|dolites. slyly bold she +51139|510|11|2|32|45136.32|0.05|0.00|R|F|1994-09-20|1994-09-23|1994-10-08|NONE|MAIL| ironic ideas boost s +51140|114|67|1|35|35493.85|0.07|0.08|R|F|1992-12-08|1992-11-28|1992-12-21|DELIVER IN PERSON|RAIL|dolites. ironic packages +51140|907|76|2|40|72316.00|0.00|0.03|A|F|1992-11-04|1992-11-27|1992-11-17|COLLECT COD|FOB| boost around the slyly unusual foxes. +51140|561|22|3|33|48231.48|0.01|0.08|A|F|1992-11-18|1992-11-21|1992-12-17|COLLECT COD|FOB|sts sleep alo +51140|221|49|4|13|14575.86|0.10|0.08|R|F|1992-12-20|1992-11-19|1992-12-30|NONE|TRUCK|es affix. quickly iron +51140|1378|93|5|25|31984.25|0.01|0.08|R|F|1992-09-17|1992-11-29|1992-09-19|TAKE BACK RETURN|TRUCK|y. carefully regular tithes wake- +51140|930|99|6|1|1830.93|0.06|0.02|A|F|1992-10-09|1992-11-04|1992-11-07|TAKE BACK RETURN|REG AIR|refully regular r +51141|1317|56|1|29|35330.99|0.03|0.00|R|F|1992-06-08|1992-07-04|1992-06-10|NONE|FOB|. ruthlessly final ideas +51141|43|94|2|21|19803.84|0.03|0.01|R|F|1992-05-11|1992-06-26|1992-05-28|TAKE BACK RETURN|TRUCK|rns use final, final accounts +51141|358|15|3|47|59142.45|0.09|0.05|A|F|1992-09-02|1992-07-08|1992-09-12|TAKE BACK RETURN|SHIP|ithes use. final +51141|1585|6|4|41|60949.78|0.09|0.04|R|F|1992-08-22|1992-07-12|1992-09-08|DELIVER IN PERSON|FOB|iously regula +51141|618|81|5|2|3037.22|0.06|0.08|A|F|1992-06-15|1992-06-18|1992-06-25|DELIVER IN PERSON|RAIL|s. carefully sp +51142|1501|22|1|5|7012.50|0.01|0.06|N|O|1995-10-04|1995-07-23|1995-10-14|TAKE BACK RETURN|SHIP|ly according +51142|1524|25|2|30|42765.60|0.00|0.06|N|O|1995-10-15|1995-08-09|1995-11-01|DELIVER IN PERSON|SHIP|y alongside of the +51142|1376|91|3|11|14051.07|0.07|0.01|N|O|1995-08-12|1995-08-29|1995-08-15|COLLECT COD|AIR|usly even pinto beans p +51143|347|48|1|45|56130.30|0.04|0.03|N|O|1998-01-05|1998-01-31|1998-01-14|DELIVER IN PERSON|REG AIR|have to use slyly slyly ironic foxe +51143|1036|42|2|37|34670.11|0.04|0.03|N|O|1998-02-15|1998-01-30|1998-03-11|COLLECT COD|FOB| regular requests. slyly idle foxes integr +51143|1307|84|3|13|15707.90|0.05|0.04|N|O|1998-01-22|1998-02-01|1998-02-11|TAKE BACK RETURN|SHIP|e blithely. final, final r +51143|1462|2|4|1|1363.46|0.03|0.03|N|O|1998-03-07|1998-01-26|1998-03-09|TAKE BACK RETURN|RAIL|counts. final ideas thrash slyly amon +51168|950|51|1|7|12956.65|0.05|0.05|R|F|1994-08-27|1994-07-30|1994-09-07|DELIVER IN PERSON|REG AIR|even dolphins are sl +51168|1880|10|2|46|81966.48|0.05|0.03|R|F|1994-08-29|1994-06-30|1994-09-02|COLLECT COD|MAIL|its. quickly special forges cajole +51168|1074|45|3|39|38027.73|0.07|0.05|A|F|1994-05-22|1994-07-14|1994-05-23|TAKE BACK RETURN|REG AIR|ly ironic packages are. r +51169|308|9|1|18|21749.40|0.09|0.08|R|F|1994-01-07|1994-03-03|1994-01-31|COLLECT COD|REG AIR|the deposits. pending, special p +51169|565|96|2|40|58622.40|0.02|0.06|R|F|1994-02-13|1994-03-20|1994-03-08|DELIVER IN PERSON|MAIL|ts haggle furiously. dependen +51169|1841|85|3|40|69713.60|0.04|0.00|A|F|1994-01-11|1994-02-01|1994-01-30|TAKE BACK RETURN|REG AIR|nal warhorses. slyly ironic packages c +51170|1955|44|1|21|38995.95|0.04|0.01|N|O|1998-07-09|1998-09-03|1998-07-12|COLLECT COD|TRUCK|elets promise furiously unusual foxes. fina +51170|1496|97|2|19|26552.31|0.07|0.08|N|O|1998-10-14|1998-09-04|1998-11-11|COLLECT COD|AIR|onic deposits run c +51170|1503|44|3|45|63202.50|0.02|0.08|N|O|1998-07-05|1998-08-05|1998-07-09|COLLECT COD|SHIP|ely regular sentiments +51170|9|85|4|33|29997.00|0.08|0.03|N|O|1998-07-24|1998-09-05|1998-08-08|NONE|REG AIR|inal decoys +51170|490|91|5|20|27809.80|0.02|0.02|N|O|1998-08-12|1998-08-17|1998-08-25|TAKE BACK RETURN|AIR|structions sleep after the blithely expre +51170|1235|36|6|23|26133.29|0.09|0.01|N|O|1998-07-29|1998-08-20|1998-08-18|TAKE BACK RETURN|AIR|. carefully +51170|1063|34|7|15|14460.90|0.04|0.08|N|O|1998-09-22|1998-09-10|1998-09-27|TAKE BACK RETURN|FOB|s detect slyly quiet requests +51171|1258|33|1|46|53325.50|0.02|0.00|A|F|1993-10-15|1993-08-15|1993-11-11|TAKE BACK RETURN|RAIL| bold accounts sleep carefully-- furious +51172|301|2|1|1|1201.30|0.01|0.02|N|O|1997-12-14|1997-12-07|1998-01-12|NONE|MAIL|ies use carefully s +51172|751|48|2|2|3303.50|0.01|0.03|N|O|1997-11-09|1997-11-23|1997-11-12|NONE|TRUCK|luffily fluf +51172|1557|58|3|25|36463.75|0.03|0.00|N|O|1997-12-05|1997-11-11|1997-12-10|COLLECT COD|AIR|nal packages. slyly final instru +51172|1134|7|4|15|15526.95|0.10|0.05|N|O|1997-11-18|1997-11-08|1997-11-20|NONE|REG AIR|onic theodol +51172|1620|44|5|10|15216.20|0.01|0.05|N|O|1997-12-27|1997-11-24|1998-01-09|TAKE BACK RETURN|REG AIR|grate according to the final depths. blithe +51172|72|48|6|43|41799.01|0.06|0.08|N|O|1997-12-10|1997-10-25|1998-01-07|COLLECT COD|AIR| the final deposits. pendin +51172|1885|72|7|31|55393.28|0.09|0.04|N|O|1997-10-03|1997-11-17|1997-10-13|COLLECT COD|REG AIR|ructions sleep slyly. carefully pendin +51173|724|21|1|45|73112.40|0.06|0.06|R|F|1992-12-23|1993-02-07|1993-01-07|TAKE BACK RETURN|REG AIR|te about the fluffily even requests. flu +51173|609|10|2|33|49816.80|0.09|0.01|R|F|1993-01-18|1992-12-28|1993-01-29|DELIVER IN PERSON|REG AIR| regular accounts n +51173|913|16|3|24|43533.84|0.06|0.00|R|F|1993-03-07|1992-12-18|1993-03-24|TAKE BACK RETURN|REG AIR|inal requests alongside of the f +51173|1553|74|4|20|29091.00|0.06|0.06|A|F|1993-03-17|1993-01-13|1993-04-13|COLLECT COD|SHIP|kages haggle furiously afte +51174|312|41|1|40|48492.40|0.09|0.00|N|O|1997-07-20|1997-07-03|1997-08-17|NONE|RAIL|le always boldly final foxes. quickly sil +51174|126|79|2|13|13339.56|0.09|0.00|N|O|1997-08-24|1997-06-29|1997-09-14|COLLECT COD|SHIP|s. furiously pending packages wake. eve +51174|1924|25|3|30|54777.60|0.06|0.08|N|O|1997-08-24|1997-07-21|1997-08-27|DELIVER IN PERSON|FOB|he furiously fin +51174|1638|21|4|3|4618.89|0.09|0.05|N|O|1997-07-01|1997-06-16|1997-07-28|COLLECT COD|MAIL|grouches p +51174|1802|89|5|47|80078.60|0.04|0.05|N|O|1997-07-03|1997-06-12|1997-07-27|DELIVER IN PERSON|REG AIR|carefully theod +51174|1940|29|6|23|42364.62|0.06|0.04|N|O|1997-05-15|1997-06-25|1997-05-28|COLLECT COD|REG AIR| brave excuses. furiously re +51174|1042|43|7|42|39607.68|0.00|0.03|N|O|1997-05-25|1997-07-27|1997-05-31|DELIVER IN PERSON|RAIL|s. slyly silent deposits are regular depos +51175|186|65|1|35|38016.30|0.07|0.02|A|F|1992-11-22|1992-10-06|1992-12-10|NONE|AIR|telets. even, unusual +51175|1285|86|2|28|33215.84|0.10|0.05|A|F|1992-12-04|1992-10-05|1992-12-30|TAKE BACK RETURN|MAIL|y daringly express accounts; furiously ir +51175|561|22|3|31|45308.36|0.03|0.02|A|F|1992-11-15|1992-10-26|1992-11-29|TAKE BACK RETURN|SHIP|ironic deposits poach slyly. foxe +51175|1314|91|4|44|53473.64|0.01|0.04|R|F|1992-10-18|1992-10-30|1992-11-04|TAKE BACK RETURN|RAIL|lent depos +51200|354|39|1|37|46410.95|0.01|0.00|N|O|1996-02-14|1995-12-29|1996-03-02|COLLECT COD|REG AIR|Tiresias. furiously special foxes wake furi +51200|916|51|2|45|81760.95|0.04|0.05|N|O|1995-12-23|1996-02-05|1996-01-19|NONE|AIR|ironic deposits. pending +51200|1871|1|3|40|70914.80|0.02|0.05|N|O|1996-01-10|1996-01-10|1996-01-14|DELIVER IN PERSON|SHIP|nusual accounts sublate among the blithel +51200|1157|94|4|9|9523.35|0.09|0.04|N|O|1996-02-18|1996-02-14|1996-02-23|TAKE BACK RETURN|FOB|ggle alongside of th +51200|825|92|5|45|77661.90|0.01|0.00|N|O|1996-02-24|1996-02-01|1996-03-05|DELIVER IN PERSON|REG AIR| print. special packages ca +51200|308|37|6|20|24166.00|0.01|0.02|N|O|1996-01-11|1996-01-30|1996-02-01|NONE|FOB|ven packages boost bl +51201|1288|63|1|49|58274.72|0.02|0.04|N|O|1996-02-09|1996-02-03|1996-03-07|TAKE BACK RETURN|REG AIR|ccounts cajole fluffily across the even, +51201|520|11|2|13|18466.76|0.10|0.02|N|O|1996-03-11|1996-03-13|1996-04-04|TAKE BACK RETURN|RAIL| above the fluffily +51202|585|46|1|49|72793.42|0.09|0.07|A|F|1992-07-10|1992-06-14|1992-07-24|DELIVER IN PERSON|FOB|counts are. carefully b +51202|35|86|2|11|10285.33|0.10|0.06|A|F|1992-05-09|1992-05-24|1992-05-21|NONE|REG AIR| packages use blithely carefully final +51202|658|90|3|7|10910.55|0.10|0.08|R|F|1992-05-14|1992-06-26|1992-05-21|TAKE BACK RETURN|FOB|final requests. slyly even depo +51202|859|59|4|32|56315.20|0.04|0.00|A|F|1992-06-08|1992-06-27|1992-07-05|TAKE BACK RETURN|FOB| excuses. careful +51203|196|97|1|7|7673.33|0.09|0.00|N|O|1996-02-02|1996-02-29|1996-02-19|TAKE BACK RETURN|SHIP|nding accounts +51203|1210|22|2|6|6667.26|0.06|0.04|N|O|1996-01-13|1996-03-14|1996-02-05|DELIVER IN PERSON|REG AIR|quickly regula +51204|1153|62|1|21|22137.15|0.09|0.01|N|O|1996-02-16|1996-02-22|1996-03-09|COLLECT COD|REG AIR|mptotes poach! final deposits nod blithel +51205|833|67|1|25|43345.75|0.00|0.02|A|F|1993-01-06|1993-01-23|1993-01-23|NONE|FOB|ts across the fl +51205|1545|26|2|30|43396.20|0.00|0.04|R|F|1993-02-03|1993-02-01|1993-02-16|TAKE BACK RETURN|FOB|ages about the regula +51205|85|61|3|14|13791.12|0.07|0.08|A|F|1993-03-27|1993-03-07|1993-04-08|DELIVER IN PERSON|TRUCK|ts haggle carefully. regul +51205|876|10|4|10|17768.70|0.06|0.03|R|F|1992-12-21|1993-02-14|1993-01-10|DELIVER IN PERSON|FOB|etimes. furious +51206|40|41|1|23|21620.92|0.07|0.05|A|F|1994-04-16|1994-04-21|1994-05-03|DELIVER IN PERSON|TRUCK|ke slyly. package +51206|1165|38|2|11|11727.76|0.06|0.08|R|F|1994-02-13|1994-05-05|1994-03-12|DELIVER IN PERSON|REG AIR|s. even requests cajole blithe +51206|1540|21|3|7|10090.78|0.10|0.02|R|F|1994-05-17|1994-04-10|1994-05-25|TAKE BACK RETURN|FOB|gular requests. regular, regular foxes boos +51207|1827|71|1|48|82983.36|0.01|0.00|N|O|1996-10-06|1996-08-23|1996-10-14|DELIVER IN PERSON|FOB|o beans sleep during the blithely p +51207|856|56|2|21|36893.85|0.08|0.06|N|O|1996-09-16|1996-09-26|1996-09-30|DELIVER IN PERSON|TRUCK|ular accounts impress blithely. ideas wil +51232|570|31|1|49|72057.93|0.05|0.06|A|F|1992-01-23|1992-04-05|1992-02-18|DELIVER IN PERSON|RAIL|ng the bold excuses. theodolites +51232|1392|7|2|42|54322.38|0.04|0.06|A|F|1992-03-13|1992-02-26|1992-04-03|COLLECT COD|TRUCK|above the even deposits! b +51232|1702|29|3|48|76977.60|0.08|0.07|R|F|1992-02-04|1992-03-25|1992-02-20|NONE|TRUCK|ar gifts migh +51232|979|14|4|35|65798.95|0.08|0.04|R|F|1992-05-12|1992-03-24|1992-05-26|COLLECT COD|RAIL| theodolites at the sly +51233|666|98|1|9|14099.94|0.08|0.00|R|F|1995-01-28|1995-01-14|1995-02-20|COLLECT COD|FOB|ans among the s +51233|692|93|2|30|47780.70|0.00|0.00|A|F|1995-03-12|1995-02-13|1995-03-18|TAKE BACK RETURN|TRUCK|y sly instructions. s +51233|1016|17|3|36|33012.36|0.05|0.03|A|F|1994-12-19|1995-02-11|1995-01-02|DELIVER IN PERSON|MAIL|epths. carefully +51233|134|87|4|17|17580.21|0.04|0.08|R|F|1995-03-10|1995-02-09|1995-04-08|TAKE BACK RETURN|TRUCK|cording to the fluffi +51233|1206|7|5|19|21036.80|0.00|0.02|A|F|1995-02-12|1995-02-12|1995-02-13|COLLECT COD|TRUCK|e. even, special deposits are daringly alon +51234|1558|99|1|43|62760.65|0.04|0.05|R|F|1994-03-20|1994-02-18|1994-04-19|NONE|RAIL|es detect quickly. pending +51234|644|45|2|29|44794.56|0.06|0.05|A|F|1994-03-31|1994-02-26|1994-04-27|DELIVER IN PERSON|SHIP|after the carefully careful depos +51234|1471|89|3|22|30194.34|0.03|0.03|R|F|1994-03-15|1994-01-15|1994-04-06|DELIVER IN PERSON|AIR|he ironic requests haggle quickly +51234|211|66|4|45|50004.45|0.01|0.08|R|F|1994-01-09|1994-01-08|1994-01-16|DELIVER IN PERSON|TRUCK|ular deposits-- quickly pendin +51234|1634|35|5|10|15356.30|0.06|0.05|A|F|1993-12-06|1994-01-28|1993-12-17|TAKE BACK RETURN|AIR|eposits haggle carefully atop +51235|27|28|1|13|12051.26|0.07|0.03|N|O|1998-06-30|1998-07-02|1998-07-29|TAKE BACK RETURN|AIR|dependenci +51236|1001|37|1|38|34276.00|0.09|0.05|N|O|1998-07-09|1998-10-04|1998-07-18|TAKE BACK RETURN|REG AIR| use. silen +51236|13|89|2|7|6391.07|0.03|0.08|N|O|1998-10-15|1998-09-03|1998-10-25|NONE|FOB|the express de +51236|705|38|3|29|46565.30|0.00|0.07|N|O|1998-10-03|1998-08-20|1998-10-27|DELIVER IN PERSON|SHIP|pinto beans nag blithely a +51236|1132|33|4|32|33060.16|0.00|0.08|N|O|1998-10-07|1998-09-17|1998-10-14|COLLECT COD|RAIL|ges nag carefully regular, even deposits. +51236|1323|100|5|41|50197.12|0.02|0.00|N|O|1998-10-13|1998-09-14|1998-10-20|TAKE BACK RETURN|AIR|ve the slyly regular instructions: +51236|90|41|6|4|3960.36|0.08|0.08|N|O|1998-07-30|1998-08-18|1998-08-10|COLLECT COD|RAIL|along the daring, ironic +51237|1100|36|1|47|47051.70|0.07|0.03|A|F|1992-06-04|1992-04-26|1992-07-01|COLLECT COD|TRUCK|deposits. furiously f +51238|1779|80|1|3|5042.31|0.01|0.05|N|O|1998-09-29|1998-08-02|1998-10-16|NONE|FOB|eside the fluffily bo +51238|1515|56|2|35|49577.85|0.06|0.03|N|O|1998-09-26|1998-07-31|1998-10-20|COLLECT COD|TRUCK|s hinder carefull +51238|1748|75|3|29|47842.46|0.00|0.02|N|O|1998-07-10|1998-09-05|1998-07-27|NONE|MAIL|equests kindle abo +51238|1951|52|4|10|18529.50|0.01|0.03|N|O|1998-08-29|1998-08-05|1998-09-27|DELIVER IN PERSON|TRUCK|cial asymptotes are about the instructions. +51238|8|59|5|47|42676.00|0.02|0.04|N|O|1998-06-09|1998-08-24|1998-06-11|DELIVER IN PERSON|TRUCK|sly pending dependencies are f +51238|1155|92|6|44|46470.60|0.05|0.01|N|O|1998-07-20|1998-08-29|1998-08-06|NONE|SHIP| ironic packages +51239|1384|99|1|24|30849.12|0.10|0.06|A|F|1992-05-12|1992-04-16|1992-05-30|NONE|REG AIR|eep furiously around the f +51239|1322|99|2|35|42816.20|0.05|0.07|A|F|1992-04-04|1992-04-18|1992-05-03|NONE|REG AIR| along the quick +51239|501|32|3|48|67272.00|0.06|0.06|A|F|1992-03-07|1992-04-19|1992-03-30|COLLECT COD|SHIP|ng instructions are fluffily. regular, fina +51264|780|13|1|15|25211.70|0.00|0.04|N|O|1996-12-26|1996-11-10|1997-01-03|DELIVER IN PERSON|TRUCK|. fluffily dogged packages slee +51264|687|50|2|3|4763.04|0.06|0.04|N|O|1996-12-05|1996-11-03|1997-01-04|TAKE BACK RETURN|SHIP|ithely unusual dependenci +51264|352|37|3|44|55103.40|0.10|0.04|N|O|1996-11-16|1996-11-11|1996-11-19|DELIVER IN PERSON|RAIL|ithely silent theodolites +51264|1382|83|4|1|1283.38|0.06|0.00|N|O|1996-12-15|1996-12-14|1997-01-14|DELIVER IN PERSON|REG AIR|regular acco +51264|579|40|5|31|45866.67|0.02|0.08|N|O|1997-01-10|1996-11-24|1997-01-20|COLLECT COD|SHIP|thout the furiously fin +51264|1143|80|6|23|24015.22|0.02|0.02|N|O|1996-10-31|1996-11-06|1996-11-30|TAKE BACK RETURN|AIR|ly atop the finally fina +51265|1395|72|1|45|58337.55|0.02|0.04|N|O|1998-10-03|1998-09-24|1998-10-30|COLLECT COD|RAIL|s cajole al +51265|664|58|2|26|40681.16|0.08|0.08|N|O|1998-11-13|1998-10-06|1998-12-04|DELIVER IN PERSON|TRUCK|r asymptotes are slyly instruc +51266|174|75|1|43|46189.31|0.04|0.08|R|F|1994-07-22|1994-05-11|1994-08-11|NONE|FOB|hely even requests. final i +51266|701|66|2|44|70474.80|0.00|0.01|A|F|1994-04-09|1994-05-26|1994-04-21|COLLECT COD|MAIL|blithely even package +51266|1064|100|3|19|18336.14|0.02|0.00|R|F|1994-04-29|1994-05-25|1994-05-05|NONE|AIR| to the ironic theodolite +51266|1249|50|4|30|34507.20|0.04|0.01|R|F|1994-06-21|1994-05-06|1994-07-07|TAKE BACK RETURN|REG AIR|ld courts. ironic requests +51266|332|33|5|22|27111.26|0.07|0.07|R|F|1994-06-12|1994-05-09|1994-07-06|NONE|REG AIR|l packages. furiously final pla +51266|140|19|6|44|45766.16|0.02|0.04|A|F|1994-07-10|1994-06-04|1994-07-17|NONE|SHIP|ets wake carefully about the final pack +51267|531|32|1|23|32925.19|0.10|0.08|A|F|1992-05-10|1992-06-12|1992-05-17|TAKE BACK RETURN|MAIL|ays final instr +51268|1605|47|1|33|49717.80|0.10|0.00|N|O|1997-05-05|1997-03-21|1997-05-25|COLLECT COD|REG AIR|lphins. pending instructions hagg +51268|1538|39|2|12|17274.36|0.03|0.05|N|O|1997-05-12|1997-03-02|1997-05-30|COLLECT COD|SHIP|ests. busily bold pains x-ray slyly. +51268|684|16|3|47|74479.96|0.07|0.03|N|O|1997-05-12|1997-04-24|1997-06-05|TAKE BACK RETURN|MAIL|nto beans serve alongside of +51269|1478|18|1|18|24830.46|0.08|0.05|R|F|1992-04-29|1992-03-22|1992-05-10|NONE|TRUCK|: final packa +51269|1345|22|2|47|58577.98|0.09|0.03|A|F|1992-02-19|1992-02-26|1992-02-25|NONE|FOB|ke carefully above the doggedly qu +51269|299|27|3|4|4797.16|0.09|0.06|A|F|1992-01-21|1992-02-21|1992-02-10|COLLECT COD|AIR|ependencies cajole. deposit +51269|1307|8|4|27|32624.10|0.09|0.04|R|F|1992-02-02|1992-03-31|1992-03-01|DELIVER IN PERSON|SHIP|blithely bold acc +51269|1371|48|5|12|15268.44|0.00|0.00|R|F|1992-02-01|1992-03-28|1992-02-17|COLLECT COD|MAIL|ackages at the slyly ex +51269|1922|67|6|27|49245.84|0.10|0.05|R|F|1992-04-12|1992-03-21|1992-05-07|NONE|MAIL|. slyly even deposits +51270|1795|22|1|50|84839.50|0.06|0.02|N|O|1998-01-05|1998-03-09|1998-01-16|NONE|SHIP|lithely special pl +51270|882|49|2|43|76663.84|0.02|0.01|N|O|1998-02-10|1998-02-07|1998-03-06|NONE|MAIL| regular deposits. final requests accordi +51270|1755|56|3|17|28164.75|0.03|0.01|N|O|1997-12-25|1998-03-09|1998-01-24|TAKE BACK RETURN|MAIL|, even packages eat carefully after th +51270|1778|5|4|49|82308.73|0.07|0.07|N|O|1998-03-23|1998-02-28|1998-03-30|NONE|AIR|s cajole above the carefully unusual pac +51270|739|40|5|32|52471.36|0.02|0.01|N|O|1997-12-25|1998-03-03|1998-01-18|DELIVER IN PERSON|RAIL|thely final ideas nag slyly along the +51270|290|72|6|18|21425.22|0.09|0.00|N|O|1998-02-27|1998-02-10|1998-03-18|COLLECT COD|SHIP|ng theodolites. slyly e +51271|1092|63|1|18|17875.62|0.02|0.03|R|F|1993-12-23|1993-12-01|1994-01-12|NONE|AIR|atelets nod: special +51271|1352|91|2|31|38853.85|0.01|0.08|R|F|1993-11-28|1993-12-24|1993-12-13|DELIVER IN PERSON|RAIL|ular foxes believe ruthlessly accord +51271|1926|59|3|3|5483.76|0.04|0.00|R|F|1994-01-17|1994-01-23|1994-01-27|DELIVER IN PERSON|AIR|fluffily furiously pen +51271|21|22|4|1|921.02|0.10|0.00|R|F|1993-12-14|1994-01-05|1994-01-02|NONE|FOB|oach quickly alongside of the even saut +51271|1398|99|5|32|41580.48|0.00|0.08|R|F|1993-11-01|1993-12-27|1993-11-09|DELIVER IN PERSON|REG AIR|l packages haggle regular deposits. +51271|1505|46|6|22|30943.00|0.05|0.01|R|F|1994-02-09|1993-12-25|1994-03-07|COLLECT COD|REG AIR|y pending accounts. ironic exc +51296|940|75|1|50|92047.00|0.01|0.03|R|F|1993-10-27|1993-12-05|1993-11-20|COLLECT COD|RAIL|nts. packages mold +51296|1720|47|2|33|53516.76|0.08|0.08|A|F|1993-12-25|1993-12-06|1994-01-15|NONE|SHIP| the unusua +51296|1514|55|3|32|45296.32|0.10|0.06|R|F|1994-02-04|1993-12-01|1994-03-01|NONE|TRUCK|uests against the ex +51296|1994|27|4|11|20855.89|0.02|0.05|A|F|1993-11-08|1994-01-10|1993-11-29|COLLECT COD|REG AIR|fix fluffily alongside o +51296|1939|28|5|42|77319.06|0.05|0.06|A|F|1994-01-06|1994-01-04|1994-01-14|COLLECT COD|AIR| pending, regular requests. final, unusual +51297|910|13|1|7|12676.37|0.09|0.08|A|F|1993-03-08|1993-01-27|1993-03-19|DELIVER IN PERSON|TRUCK|usual packages. quick +51297|1321|98|2|36|44003.52|0.09|0.01|R|F|1993-01-30|1993-01-31|1993-02-14|TAKE BACK RETURN|RAIL|dolites. furiously bold asymptotes wak +51298|577|38|1|43|63535.51|0.08|0.04|A|F|1994-05-04|1994-04-02|1994-05-24|DELIVER IN PERSON|TRUCK| of the quickly s +51298|511|2|2|16|22584.16|0.08|0.04|R|F|1994-02-27|1994-04-15|1994-03-21|TAKE BACK RETURN|RAIL|nt accounts run slyly eve +51298|645|77|3|23|35549.72|0.00|0.07|R|F|1994-03-22|1994-04-04|1994-03-24|DELIVER IN PERSON|REG AIR| bold courts cajole. +51298|1665|89|4|37|57966.42|0.05|0.04|R|F|1994-04-01|1994-03-01|1994-04-14|COLLECT COD|TRUCK|ending deposits. special instruction +51298|1153|26|5|24|25299.60|0.10|0.05|R|F|1994-05-21|1994-04-19|1994-06-16|DELIVER IN PERSON|MAIL|usly silently express +51298|696|97|6|2|3193.38|0.01|0.06|R|F|1994-05-01|1994-04-10|1994-05-17|COLLECT COD|REG AIR| carefully final pint +51299|1578|99|1|47|69539.79|0.10|0.07|N|O|1998-08-17|1998-08-08|1998-08-23|COLLECT COD|FOB|above the carefully final deposits d +51299|1983|72|2|45|84824.10|0.01|0.00|N|O|1998-08-29|1998-07-19|1998-09-22|NONE|RAIL|he quickly ironic foxes. blithely final +51299|1774|17|3|3|5027.31|0.02|0.01|N|O|1998-06-25|1998-08-09|1998-07-07|COLLECT COD|AIR|tes wake blithely along the quickly +51299|200|27|4|49|53909.80|0.07|0.03|N|O|1998-08-25|1998-08-08|1998-09-23|DELIVER IN PERSON|FOB|press asym +51299|1736|63|5|10|16377.30|0.03|0.01|N|O|1998-07-21|1998-08-02|1998-08-01|DELIVER IN PERSON|REG AIR|ins according to the caref +51299|996|31|6|24|45527.76|0.07|0.08|N|O|1998-05-28|1998-07-26|1998-06-20|COLLECT COD|FOB|s sleep furi +51299|1001|7|7|32|28864.00|0.10|0.03|N|O|1998-08-08|1998-08-10|1998-08-21|NONE|REG AIR|heodolites. packages n +51300|1637|61|1|1|1538.63|0.01|0.05|N|O|1995-11-24|1995-11-24|1995-12-21|DELIVER IN PERSON|AIR|blithe orbits. slyly ironic at +51300|694|88|2|12|19136.28|0.00|0.06|N|O|1995-12-23|1996-01-07|1996-01-02|COLLECT COD|TRUCK|s the regular, silent requests. requests +51300|1720|21|3|24|38921.28|0.10|0.08|N|O|1995-10-19|1996-01-07|1995-11-09|NONE|SHIP|ronic accounts cajole carefully acc +51300|1029|35|4|14|13020.28|0.08|0.05|N|O|1996-01-28|1996-01-14|1996-02-26|DELIVER IN PERSON|TRUCK|fily unusua +51300|277|78|5|22|25899.94|0.08|0.04|N|O|1996-02-01|1996-01-01|1996-02-12|TAKE BACK RETURN|REG AIR|s wake. fluffily bold requests cajole sly +51300|1252|27|6|5|5766.25|0.04|0.04|N|O|1995-10-27|1995-12-02|1995-11-11|COLLECT COD|MAIL|lar packages. +51300|530|61|7|25|35763.25|0.03|0.04|N|O|1995-12-14|1995-11-30|1995-12-24|NONE|MAIL|as nag blithely even instr +51301|823|24|1|8|13790.56|0.00|0.03|N|O|1997-04-22|1997-07-01|1997-05-07|NONE|REG AIR|ly ironic ideas wak +51301|1443|22|2|33|44366.52|0.05|0.06|N|O|1997-07-15|1997-07-04|1997-08-10|NONE|REG AIR|kly idle accounts +51301|1759|44|3|44|73073.00|0.03|0.05|N|O|1997-04-22|1997-05-16|1997-04-30|NONE|AIR|beans use +51301|342|27|4|44|54662.96|0.08|0.04|N|O|1997-08-02|1997-05-19|1997-08-27|TAKE BACK RETURN|FOB|lly even instructions: carefully pending f +51301|1970|59|5|33|61775.01|0.06|0.07|N|O|1997-08-04|1997-07-06|1997-08-06|COLLECT COD|FOB|thily busy accounts haggle s +51302|1885|86|1|6|10721.28|0.08|0.06|N|O|1995-11-06|1995-10-09|1995-11-29|COLLECT COD|RAIL| the quickly unusual asymptotes. furiou +51302|1806|36|2|17|29032.60|0.00|0.02|N|O|1995-10-28|1995-11-08|1995-11-06|NONE|SHIP|ecial grouches. regular reque +51302|1702|45|3|47|75373.90|0.08|0.07|N|O|1995-11-14|1995-11-06|1995-12-07|COLLECT COD|AIR|ously final platele +51302|673|74|4|19|29899.73|0.00|0.08|N|O|1995-11-26|1995-11-01|1995-12-10|COLLECT COD|FOB|fluffily unusual asymptotes. c +51302|629|30|5|25|38240.50|0.07|0.05|N|O|1995-10-23|1995-10-19|1995-11-05|TAKE BACK RETURN|REG AIR|ions sleep slyly regula +51302|1403|21|6|50|65220.00|0.08|0.05|N|O|1995-09-26|1995-11-22|1995-10-25|COLLECT COD|FOB|e slyly about the blithely +51303|1477|95|1|1|1378.47|0.04|0.01|R|F|1993-09-12|1993-07-16|1993-10-01|DELIVER IN PERSON|REG AIR|ns integrate slyly; slyly +51328|281|63|1|48|56701.44|0.10|0.04|A|F|1993-11-12|1994-01-21|1993-12-05|DELIVER IN PERSON|TRUCK|gle furiously according t +51328|891|25|2|42|75259.38|0.06|0.08|A|F|1994-02-15|1993-12-14|1994-02-25|DELIVER IN PERSON|SHIP|ular pinto beans. quick +51328|1205|80|3|33|36504.60|0.06|0.00|R|F|1993-12-17|1994-01-21|1994-01-15|TAKE BACK RETURN|FOB|uriously a +51328|550|51|4|6|8703.30|0.00|0.06|R|F|1994-02-24|1993-11-27|1994-03-07|COLLECT COD|TRUCK|tterns are qu +51329|1068|39|1|50|48453.00|0.07|0.00|N|O|1996-08-15|1996-09-30|1996-09-14|COLLECT COD|REG AIR|requests unwind +51329|1070|6|2|13|12623.91|0.02|0.07|N|O|1996-11-05|1996-09-21|1996-11-22|DELIVER IN PERSON|FOB|ecial, even theod +51329|1219|57|3|3|3360.63|0.09|0.03|N|O|1996-11-20|1996-10-14|1996-12-18|DELIVER IN PERSON|SHIP|riously bol +51329|592|93|4|19|28359.21|0.10|0.06|N|O|1996-10-06|1996-10-04|1996-10-12|COLLECT COD|SHIP|deposits integrate ironically along the a +51329|242|70|5|28|31982.72|0.01|0.05|N|O|1996-09-09|1996-09-18|1996-09-19|NONE|RAIL|sly. final, bold packages haggle carefully. +51329|1949|50|6|47|86994.18|0.04|0.03|N|O|1996-11-02|1996-10-28|1996-11-05|DELIVER IN PERSON|AIR|s according to the fluffily eve +51330|249|50|1|19|21835.56|0.05|0.06|N|O|1998-09-26|1998-08-17|1998-10-01|DELIVER IN PERSON|RAIL|ses. carefully unusual packages +51330|1091|62|2|47|46628.23|0.05|0.01|N|O|1998-09-03|1998-09-03|1998-09-21|NONE|FOB|s sleep above the quickly final deposits! +51330|1413|31|3|1|1314.41|0.04|0.07|N|O|1998-10-01|1998-08-04|1998-10-31|COLLECT COD|FOB|ole quickly final depths. f +51331|214|96|1|19|21169.99|0.09|0.00|N|O|1997-01-16|1997-02-10|1997-01-18|TAKE BACK RETURN|MAIL|ers cajole after the carefully final in +51331|925|28|2|18|32866.56|0.01|0.03|N|O|1997-03-16|1996-12-25|1997-04-08|DELIVER IN PERSON|TRUCK|f the slyly regular instructions +51331|960|61|3|18|33497.28|0.01|0.07|N|O|1997-01-07|1997-02-06|1997-01-14|NONE|SHIP| requests. carefully ironi +51332|1135|72|1|25|25903.25|0.08|0.06|N|O|1997-12-09|1997-10-18|1997-12-11|NONE|RAIL| the theodolites. quickly enticing +51332|1779|80|2|34|57146.18|0.05|0.04|N|O|1997-09-29|1997-10-18|1997-10-19|DELIVER IN PERSON|RAIL|ag carefully +51332|929|64|3|31|56727.52|0.02|0.04|N|O|1997-09-16|1997-11-08|1997-10-03|NONE|AIR|ingly bold packages are: expres +51332|1745|88|4|18|29641.32|0.04|0.04|N|O|1997-11-10|1997-10-18|1997-12-05|DELIVER IN PERSON|MAIL|ly final requests. carefully final +51332|560|61|5|42|61343.52|0.06|0.01|N|O|1997-10-06|1997-10-23|1997-10-14|COLLECT COD|AIR|thlessly sly asymptotes. doggedly +51333|1329|30|1|23|28297.36|0.03|0.00|R|F|1992-11-02|1992-11-27|1992-11-13|COLLECT COD|FOB|integrate furiously above the ca +51333|1766|93|2|48|80052.48|0.06|0.02|R|F|1992-11-13|1992-12-16|1992-11-28|TAKE BACK RETURN|REG AIR|pinto beans nag furiously +51333|23|99|3|41|37843.82|0.00|0.04|R|F|1992-12-17|1992-12-26|1993-01-09|TAKE BACK RETURN|RAIL|ironic foxes use quickly. furiously even so +51334|1539|60|1|22|31691.66|0.08|0.06|N|O|1997-05-14|1997-04-12|1997-06-06|TAKE BACK RETURN|FOB|ans use carefull +51334|1910|99|2|43|77912.13|0.05|0.04|N|O|1997-04-14|1997-04-07|1997-04-21|COLLECT COD|RAIL|. ironic, regular requests cajole. furio +51334|761|94|3|22|36558.72|0.08|0.07|N|O|1997-05-12|1997-04-19|1997-05-22|TAKE BACK RETURN|SHIP|lyly against +51334|1788|89|4|8|13518.24|0.10|0.04|N|O|1997-03-02|1997-05-21|1997-03-23|COLLECT COD|FOB|y quick instructions. slyly express +51335|1171|80|1|33|35381.61|0.10|0.05|A|F|1995-01-06|1995-01-09|1995-01-26|COLLECT COD|AIR|ending foxes cajole carefully caref +51360|1121|94|1|21|21464.52|0.10|0.00|N|O|1995-09-16|1995-09-01|1995-09-26|NONE|SHIP|inly ironic accounts haggle quickly +51361|920|21|1|7|12746.44|0.10|0.07|A|F|1995-05-12|1995-06-04|1995-05-18|TAKE BACK RETURN|AIR|oxes sleep care +51361|1616|99|2|14|21246.54|0.00|0.00|A|F|1995-04-25|1995-05-08|1995-05-07|NONE|RAIL|cajole blithely excu +51361|1785|12|3|37|62410.86|0.08|0.04|A|F|1995-04-04|1995-06-07|1995-04-07|NONE|AIR|. slyly even r +51361|361|18|4|2|2522.72|0.03|0.05|N|O|1995-07-17|1995-05-11|1995-07-21|NONE|TRUCK| dolphins. special courts solve. clos +51361|1242|54|5|11|12575.64|0.07|0.04|R|F|1995-05-17|1995-05-05|1995-06-15|TAKE BACK RETURN|TRUCK|es. furiously final dol +51361|727|24|6|2|3255.44|0.07|0.02|R|F|1995-05-03|1995-05-03|1995-05-05|NONE|RAIL|tes. quickly final accou +51362|1068|39|1|45|43607.70|0.01|0.03|A|F|1993-06-17|1993-04-06|1993-06-25|TAKE BACK RETURN|RAIL|he instructions. dolphins x-ray +51362|811|78|2|29|49642.49|0.02|0.04|R|F|1993-05-05|1993-04-27|1993-05-20|TAKE BACK RETURN|FOB|hely careful depo +51362|808|42|3|31|52972.80|0.06|0.06|R|F|1993-05-14|1993-04-23|1993-06-02|DELIVER IN PERSON|SHIP|final deposits nod bravely reg +51363|1764|49|1|44|73293.44|0.07|0.05|N|O|1997-06-06|1997-08-14|1997-06-10|NONE|SHIP|furiously special accoun +51364|1821|65|1|1|1722.82|0.10|0.02|R|F|1994-02-22|1993-12-28|1994-03-04|DELIVER IN PERSON|SHIP|ggle furiously among the +51364|1800|43|2|8|13614.40|0.04|0.03|A|F|1993-12-23|1993-12-22|1994-01-05|TAKE BACK RETURN|AIR|quickly ironic +51365|1101|2|1|8|8016.80|0.10|0.01|R|F|1992-08-14|1992-10-06|1992-08-24|NONE|TRUCK|the final ideas. fina +51365|1883|27|2|1|1784.88|0.10|0.08|R|F|1992-08-22|1992-11-02|1992-09-21|COLLECT COD|TRUCK|nic packages. packages affix account +51365|121|22|3|12|12253.44|0.03|0.03|A|F|1992-08-26|1992-11-02|1992-09-23|TAKE BACK RETURN|FOB|ockey players boo +51366|1209|10|1|35|38857.00|0.07|0.08|N|O|1995-06-25|1995-06-30|1995-06-30|DELIVER IN PERSON|FOB|regular theodolit +51366|1122|31|2|41|41947.92|0.00|0.00|N|O|1995-09-14|1995-06-25|1995-09-28|DELIVER IN PERSON|FOB|ag across the carefully unusual dep +51367|1624|48|1|20|30512.40|0.05|0.08|R|F|1994-11-23|1994-12-29|1994-12-09|NONE|SHIP| was above the ironic ideas. +51367|1183|92|2|44|47703.92|0.04|0.03|R|F|1994-12-13|1995-01-22|1994-12-25|COLLECT COD|MAIL|arefully regular +51367|527|18|3|22|31405.44|0.02|0.06|A|F|1994-12-15|1995-01-28|1994-12-22|DELIVER IN PERSON|SHIP|heodolites hag +51392|138|39|1|38|39448.94|0.07|0.05|R|F|1994-11-17|1995-01-11|1994-11-19|TAKE BACK RETURN|TRUCK|express accounts c +51392|639|33|2|24|36951.12|0.10|0.01|A|F|1995-03-10|1995-01-05|1995-03-11|NONE|SHIP|hely pending packa +51392|1708|93|3|34|54729.80|0.05|0.00|R|F|1995-02-11|1995-02-03|1995-02-13|DELIVER IN PERSON|SHIP|t at the blithe +51392|1813|100|4|11|18862.91|0.06|0.04|R|F|1995-02-04|1994-12-17|1995-02-16|TAKE BACK RETURN|REG AIR|iously. carefully spec +51393|1576|97|1|17|25118.69|0.00|0.00|N|O|1997-04-25|1997-04-25|1997-05-19|DELIVER IN PERSON|FOB|g the carefully ironic p +51393|253|81|2|10|11532.50|0.02|0.05|N|O|1997-04-27|1997-05-11|1997-05-08|COLLECT COD|AIR|ce the furiously final packages. instr +51394|28|29|1|49|45472.98|0.01|0.07|A|F|1994-12-28|1994-10-26|1995-01-25|TAKE BACK RETURN|TRUCK|ly bold instructions. furiou +51394|871|5|2|16|28349.92|0.10|0.01|R|F|1994-09-12|1994-10-18|1994-09-17|TAKE BACK RETURN|TRUCK| sleep quickly around the slow packages. qu +51394|1081|87|3|17|16695.36|0.05|0.06|R|F|1995-01-07|1994-10-19|1995-01-23|NONE|FOB|nusual, ironic theodolites wake. +51394|1470|10|4|45|61716.15|0.00|0.01|R|F|1995-01-04|1994-10-08|1995-01-10|TAKE BACK RETURN|RAIL|ns: furiously even accounts +51394|1233|45|5|23|26087.29|0.09|0.04|A|F|1994-10-22|1994-11-06|1994-11-05|COLLECT COD|SHIP|accounts. slyly bold sheaves cajole. slyly +51395|692|86|1|42|66892.98|0.02|0.04|A|F|1993-07-03|1993-08-21|1993-07-28|DELIVER IN PERSON|SHIP|e against the quick, fi +51395|1833|77|2|7|12143.81|0.08|0.05|A|F|1993-06-27|1993-08-25|1993-07-13|NONE|FOB|lyly regular request +51395|1684|67|3|12|19028.16|0.02|0.01|A|F|1993-09-13|1993-09-06|1993-10-02|COLLECT COD|MAIL| even theodolites +51395|1790|33|4|47|79514.13|0.02|0.04|A|F|1993-08-04|1993-07-19|1993-09-01|DELIVER IN PERSON|MAIL| pending dependencies nag quickly +51395|979|14|5|37|69558.89|0.10|0.00|A|F|1993-08-04|1993-08-16|1993-08-28|NONE|MAIL|ajole even deposits? even f +51396|117|96|1|28|28479.08|0.05|0.06|N|O|1998-01-01|1998-02-07|1998-01-20|TAKE BACK RETURN|AIR|lly pending deposits cajole fluffily acr +51396|1135|72|2|19|19686.47|0.00|0.06|N|O|1998-02-14|1998-02-18|1998-03-05|COLLECT COD|TRUCK|packages cajole special +51396|1296|97|3|48|57469.92|0.09|0.00|N|O|1998-01-29|1998-03-16|1998-02-28|DELIVER IN PERSON|FOB| above the blithely final req +51396|1118|27|4|41|41783.51|0.09|0.05|N|O|1998-01-13|1998-02-22|1998-01-29|DELIVER IN PERSON|SHIP|ages nod slowl +51397|3|29|1|31|27993.00|0.01|0.07|A|F|1992-05-17|1992-03-23|1992-06-01|DELIVER IN PERSON|AIR|ously express depos +51398|1489|7|1|23|31981.04|0.01|0.07|N|O|1996-07-27|1996-08-14|1996-08-07|TAKE BACK RETURN|TRUCK| wake according to the fluffily bo +51398|1485|86|2|7|9705.36|0.10|0.03|N|O|1996-08-09|1996-08-29|1996-09-07|NONE|MAIL|regular foxes. quickly ironic escapades sl +51399|1293|31|1|36|42994.44|0.03|0.01|N|O|1998-02-27|1997-12-09|1998-03-15|TAKE BACK RETURN|REG AIR|gular accounts above the slyly e +51399|183|10|2|23|24913.14|0.08|0.08|N|O|1997-12-14|1998-01-03|1997-12-28|DELIVER IN PERSON|MAIL|s the always final ideas. furiously +51399|624|56|3|47|71657.14|0.06|0.06|N|O|1998-01-02|1997-12-15|1998-01-25|COLLECT COD|RAIL|ic platelets about the +51424|1076|82|1|40|39082.80|0.08|0.02|A|F|1992-04-12|1992-03-05|1992-04-18|DELIVER IN PERSON|MAIL|he escapades. requests +51424|1916|61|2|25|45447.75|0.09|0.00|R|F|1992-04-06|1992-02-18|1992-05-04|NONE|MAIL|age carefully fluffily i +51424|814|14|3|27|46299.87|0.10|0.05|A|F|1992-01-13|1992-03-09|1992-01-27|DELIVER IN PERSON|FOB|iously against the blithely +51424|475|76|4|33|45390.51|0.10|0.02|A|F|1992-03-14|1992-03-10|1992-03-22|NONE|SHIP|st have to wake fluffily against the +51425|902|37|1|9|16226.10|0.10|0.05|N|O|1998-03-21|1998-02-10|1998-04-14|TAKE BACK RETURN|REG AIR|s according to the quickly ironic excu +51425|1925|14|2|7|12788.44|0.02|0.00|N|O|1998-02-07|1997-12-31|1998-02-08|TAKE BACK RETURN|FOB|y against the slyly r +51425|856|57|3|16|28109.60|0.00|0.00|N|O|1998-01-30|1998-02-07|1998-02-07|DELIVER IN PERSON|SHIP|urious accounts sleep +51425|1640|64|4|38|58582.32|0.03|0.02|N|O|1998-03-18|1997-12-28|1998-04-05|DELIVER IN PERSON|TRUCK|ular requests are furiously pen +51425|592|53|5|8|11940.72|0.06|0.01|N|O|1998-03-05|1998-01-04|1998-03-22|COLLECT COD|FOB| deposits? i +51426|456|86|1|20|27129.00|0.03|0.08|A|F|1994-01-22|1994-02-28|1994-02-07|COLLECT COD|FOB|y thin ideas. express platelets a +51426|1551|52|2|28|40671.40|0.06|0.06|R|F|1994-01-07|1994-01-26|1994-02-01|TAKE BACK RETURN|RAIL| regular de +51427|251|6|1|6|6907.50|0.08|0.06|N|O|1998-03-21|1998-03-29|1998-04-04|TAKE BACK RETURN|RAIL|carefully fur +51427|1624|7|2|45|68652.90|0.07|0.07|N|O|1998-01-18|1998-02-01|1998-01-27|DELIVER IN PERSON|AIR| even pinto b +51428|1297|98|1|47|56319.63|0.08|0.04|A|F|1995-03-09|1995-02-07|1995-04-06|TAKE BACK RETURN|SHIP|egular decoys sleep blithely. furi +51428|494|95|2|14|19522.86|0.04|0.03|R|F|1995-02-17|1995-02-01|1995-03-03|NONE|RAIL|ons. boldly regu +51428|9|60|3|9|8181.00|0.07|0.06|A|F|1995-03-08|1995-02-17|1995-04-01|COLLECT COD|AIR|ilent accounts are qui +51428|758|55|4|49|81278.75|0.01|0.05|R|F|1995-01-04|1995-02-11|1995-01-08|DELIVER IN PERSON|TRUCK|essly above the quickly final reques +51428|147|74|5|29|30367.06|0.09|0.03|A|F|1995-02-18|1995-03-10|1995-03-07|TAKE BACK RETURN|FOB|refully regular +51428|590|21|6|48|71548.32|0.08|0.07|A|F|1995-03-17|1995-02-11|1995-03-27|TAKE BACK RETURN|FOB|the slyly pending +51429|877|11|1|50|88893.50|0.04|0.00|N|O|1998-05-21|1998-06-24|1998-06-17|TAKE BACK RETURN|REG AIR|ites. carefully bold packa +51429|1351|28|2|40|50094.00|0.07|0.05|N|O|1998-07-23|1998-05-06|1998-08-21|COLLECT COD|TRUCK|ully special request +51429|268|96|3|46|53739.96|0.02|0.06|N|O|1998-07-14|1998-06-06|1998-08-11|COLLECT COD|FOB|ily. furiously final instructions accor +51429|1380|19|4|4|5125.52|0.06|0.03|N|O|1998-07-12|1998-06-26|1998-08-05|DELIVER IN PERSON|AIR|ely slyly regular deposits. caref +51429|366|23|5|50|63318.00|0.05|0.02|N|O|1998-04-27|1998-06-05|1998-05-23|COLLECT COD|RAIL|ns. regular ex +51429|1205|6|6|46|50885.20|0.02|0.05|N|O|1998-07-18|1998-05-29|1998-07-27|TAKE BACK RETURN|SHIP| haggle fluff +51430|551|12|1|22|31934.10|0.07|0.05|N|O|1996-01-24|1996-03-26|1996-02-02|TAKE BACK RETURN|SHIP|sits about the accounts nag blith +51431|1907|96|1|32|57884.80|0.00|0.06|N|O|1997-12-26|1998-03-20|1998-01-20|COLLECT COD|SHIP|l platelets sub +51431|1314|15|2|41|49827.71|0.03|0.07|N|O|1998-01-15|1998-03-04|1998-01-18|COLLECT COD|FOB|luffily express ideas. furi +51456|34|10|1|18|16812.54|0.06|0.04|A|F|1993-07-30|1993-06-26|1993-08-10|COLLECT COD|FOB|s! slyly regular platelets nag after th +51457|427|15|1|35|46459.70|0.04|0.04|N|O|1998-03-19|1998-03-31|1998-04-13|TAKE BACK RETURN|REG AIR|losely unusual +51458|1523|24|1|30|42735.60|0.04|0.02|N|O|1995-07-03|1995-08-07|1995-07-08|COLLECT COD|RAIL|c dinos along the slyly fi +51458|396|97|2|23|29816.97|0.09|0.08|N|O|1995-06-18|1995-07-15|1995-06-24|TAKE BACK RETURN|FOB|c foxes. bold, ironic instructi +51458|128|81|3|41|42152.92|0.04|0.02|N|O|1995-07-13|1995-07-23|1995-08-01|COLLECT COD|REG AIR|fully regular dolphins are according +51459|1124|25|1|48|49205.76|0.00|0.08|N|O|1996-02-02|1996-02-23|1996-02-08|COLLECT COD|SHIP|y against +51459|1068|69|2|10|9690.60|0.08|0.03|N|O|1996-03-20|1996-02-29|1996-03-28|TAKE BACK RETURN|FOB|ests print. slyly even platelets wake. +51459|929|64|3|23|42088.16|0.02|0.01|N|O|1996-03-15|1996-03-13|1996-03-18|NONE|FOB|dependencies are. unusual, p +51460|1541|82|1|33|47603.82|0.02|0.06|N|O|1998-11-07|1998-09-03|1998-11-10|TAKE BACK RETURN|RAIL|as wake evenly. quickly iron +51461|331|60|1|47|57872.51|0.00|0.00|A|F|1995-04-09|1995-04-15|1995-04-24|TAKE BACK RETURN|FOB|carefully +51461|939|40|2|49|90156.57|0.10|0.02|A|F|1995-03-10|1995-04-01|1995-04-01|COLLECT COD|SHIP| even, ironic pearls boost fo +51461|1287|88|3|46|54660.88|0.02|0.06|A|F|1995-02-13|1995-04-08|1995-03-08|TAKE BACK RETURN|RAIL| under the regular +51461|1690|14|4|6|9550.14|0.05|0.03|R|F|1995-04-23|1995-04-01|1995-05-08|NONE|REG AIR|nts are beside the fu +51461|756|21|5|42|69583.50|0.07|0.02|A|F|1995-06-04|1995-04-29|1995-06-11|DELIVER IN PERSON|SHIP|y regular ideas are furiously ir +51461|250|51|6|42|48310.50|0.10|0.07|R|F|1995-05-02|1995-03-25|1995-05-04|COLLECT COD|FOB|slyly furiously speci +51461|325|82|7|12|14703.84|0.08|0.05|N|F|1995-06-05|1995-05-03|1995-06-27|TAKE BACK RETURN|TRUCK|ld account +51462|1826|13|1|47|81207.54|0.07|0.07|N|O|1995-10-09|1995-08-03|1995-10-30|DELIVER IN PERSON|MAIL|ins are ironically: ironic requests are +51462|798|95|2|20|33975.80|0.07|0.06|N|O|1995-08-24|1995-08-28|1995-09-07|COLLECT COD|AIR|es cajole carefully even instruct +51462|1897|41|3|47|84547.83|0.05|0.02|N|O|1995-09-13|1995-08-30|1995-10-06|COLLECT COD|FOB|carefully accounts. qui +51462|1030|1|4|26|24206.78|0.01|0.04|N|O|1995-10-11|1995-09-03|1995-11-01|NONE|AIR|ven pinto beans. sly +51462|1016|22|5|47|43099.47|0.05|0.04|N|O|1995-07-01|1995-08-14|1995-07-15|DELIVER IN PERSON|RAIL|ong the even ideas +51463|48|24|1|30|28441.20|0.07|0.01|N|O|1996-02-11|1996-01-30|1996-02-28|TAKE BACK RETURN|RAIL|final instructions wake furiously. care +51463|562|53|2|24|35101.44|0.06|0.08|N|O|1996-02-14|1996-01-27|1996-03-11|COLLECT COD|RAIL|s sleep aga +51463|182|35|3|10|10821.80|0.10|0.04|N|O|1996-02-28|1996-03-14|1996-03-25|COLLECT COD|TRUCK|y dogged platelets cajole slyly. slyly b +51463|1264|65|4|7|8156.82|0.07|0.08|N|O|1996-01-27|1996-02-24|1996-02-07|NONE|AIR|r theodolites +51488|1178|51|1|8|8633.36|0.10|0.08|A|F|1993-08-01|1993-07-03|1993-08-13|NONE|SHIP|sts. dogged dependenc +51488|174|27|2|2|2148.34|0.01|0.05|R|F|1993-07-30|1993-07-15|1993-08-28|DELIVER IN PERSON|RAIL|usual packag +51488|1743|28|3|24|39473.76|0.00|0.00|R|F|1993-07-10|1993-08-01|1993-07-17|TAKE BACK RETURN|SHIP|nts boost against the furiousl +51488|522|83|4|12|17070.24|0.01|0.06|R|F|1993-06-13|1993-06-10|1993-07-13|TAKE BACK RETURN|RAIL|onic excuses according to the blith +51488|314|15|5|36|43715.16|0.02|0.00|A|F|1993-08-24|1993-07-23|1993-08-25|TAKE BACK RETURN|TRUCK|ng accounts use s +51488|398|27|6|44|57129.16|0.01|0.03|A|F|1993-07-08|1993-06-11|1993-07-24|COLLECT COD|AIR|ular accounts. bold i +51489|1553|54|1|44|64000.20|0.06|0.00|R|F|1992-03-31|1992-05-26|1992-04-12|NONE|AIR|s are fluffily i +51489|1587|8|2|18|26794.44|0.09|0.03|R|F|1992-03-06|1992-05-19|1992-03-17|COLLECT COD|TRUCK|ding to the furi +51489|964|65|3|35|65273.60|0.09|0.04|A|F|1992-06-29|1992-05-19|1992-07-08|COLLECT COD|REG AIR|e packages? +51489|916|85|4|12|21802.92|0.08|0.04|A|F|1992-03-20|1992-05-21|1992-03-31|NONE|SHIP|. packages hag +51489|1331|46|5|20|24646.60|0.06|0.02|A|F|1992-06-07|1992-05-16|1992-06-16|COLLECT COD|AIR|r escapades cajo +51489|1703|46|6|11|17651.70|0.08|0.03|A|F|1992-05-07|1992-05-23|1992-05-14|TAKE BACK RETURN|REG AIR| special packages. slyly even reques +51490|1359|36|1|11|13863.85|0.05|0.01|N|O|1997-06-27|1997-06-03|1997-07-16|COLLECT COD|TRUCK|he deposits. special packages wake +51490|947|16|2|30|55438.20|0.05|0.08|N|O|1997-07-21|1997-05-17|1997-08-16|NONE|FOB| final requests. carefully silen +51491|902|3|1|24|43269.60|0.05|0.03|N|O|1998-03-22|1998-04-23|1998-04-06|TAKE BACK RETURN|RAIL|ests. furiously pending deposi +51491|885|85|2|7|12501.16|0.03|0.08|N|O|1998-03-22|1998-03-17|1998-03-30|DELIVER IN PERSON|AIR|he carefully silent accounts nod final de +51491|1594|35|3|12|17947.08|0.00|0.07|N|O|1998-04-17|1998-04-27|1998-05-05|NONE|TRUCK|ons cajole slyly. slyly +51491|49|75|4|36|34165.44|0.03|0.07|N|O|1998-02-28|1998-03-19|1998-03-22|DELIVER IN PERSON|FOB|en requests about the furiou +51491|1932|77|5|41|75191.13|0.05|0.03|N|O|1998-04-27|1998-04-01|1998-05-09|TAKE BACK RETURN|MAIL| nag furiously along the qu +51492|107|86|1|7|7049.70|0.07|0.02|N|O|1998-04-11|1998-04-22|1998-04-17|TAKE BACK RETURN|FOB| bold ideas. regular deposits wake +51492|424|83|2|32|42381.44|0.08|0.04|N|O|1998-05-15|1998-04-17|1998-05-30|NONE|AIR| regularly even excuses. furious +51492|208|36|3|20|22164.00|0.10|0.03|N|O|1998-05-22|1998-04-17|1998-06-18|TAKE BACK RETURN|REG AIR|long the furiously busy requests. +51492|1660|61|4|12|18739.92|0.01|0.04|N|O|1998-04-10|1998-05-04|1998-04-18|NONE|AIR|slyly ironic depo +51492|1998|87|5|45|85499.55|0.03|0.00|N|O|1998-04-19|1998-03-18|1998-05-13|DELIVER IN PERSON|MAIL|oost according to the furious +51493|555|86|1|20|29111.00|0.09|0.05|N|O|1995-09-27|1995-09-12|1995-10-15|TAKE BACK RETURN|MAIL| regular foxes nag +51493|1280|55|2|2|2362.56|0.03|0.01|N|O|1995-07-31|1995-10-01|1995-08-12|TAKE BACK RETURN|REG AIR|regular instructions. unusual requests c +51493|673|67|3|16|25178.72|0.00|0.06|N|O|1995-10-13|1995-09-03|1995-10-22|DELIVER IN PERSON|AIR|sits above the fluffily +51493|680|12|4|48|75872.64|0.04|0.02|N|O|1995-08-20|1995-09-30|1995-09-14|DELIVER IN PERSON|AIR| permanently among the slyly ironic +51493|557|58|5|42|61217.10|0.09|0.04|N|O|1995-09-05|1995-09-19|1995-10-01|TAKE BACK RETURN|MAIL|refully silent requests. regular, +51493|171|24|6|50|53558.50|0.10|0.06|N|O|1995-07-21|1995-09-11|1995-08-10|DELIVER IN PERSON|AIR|gle carefully furiously +51494|497|27|1|36|50309.64|0.00|0.02|N|O|1995-11-13|1995-10-10|1995-12-04|TAKE BACK RETURN|REG AIR| engage. silent, silent +51494|296|24|2|23|27514.67|0.04|0.03|N|O|1995-08-27|1995-10-16|1995-09-20|NONE|REG AIR| tithes. furiou +51495|1826|56|1|30|51834.60|0.05|0.05|R|F|1992-10-12|1992-10-11|1992-10-16|NONE|REG AIR|quests. sly requests aga +51495|846|13|2|36|62886.24|0.03|0.08|A|F|1992-08-27|1992-10-06|1992-09-02|NONE|SHIP|s. blithely even accounts affix e +51495|785|18|3|17|28658.26|0.06|0.02|A|F|1992-08-15|1992-08-31|1992-09-12|NONE|MAIL|t requests sleep perma +51520|1904|5|1|25|45147.50|0.07|0.06|N|O|1996-08-05|1996-08-20|1996-08-29|DELIVER IN PERSON|SHIP| slyly express excuses are fluffily ev +51520|758|23|2|15|24881.25|0.07|0.02|N|O|1996-09-05|1996-09-10|1996-09-17|DELIVER IN PERSON|RAIL|he foxes. carefully ironic r +51520|406|94|3|36|47030.40|0.03|0.03|N|O|1996-09-10|1996-09-13|1996-09-12|NONE|REG AIR|pecial, even requests above the express f +51520|650|82|4|14|21709.10|0.06|0.01|N|O|1996-09-04|1996-08-07|1996-09-29|TAKE BACK RETURN|FOB|lly regular instruction +51520|51|27|5|5|4755.25|0.01|0.05|N|O|1996-08-23|1996-08-23|1996-09-03|DELIVER IN PERSON|MAIL|ounts nag slyly abo +51520|1775|2|6|21|35212.17|0.01|0.01|N|O|1996-09-11|1996-09-02|1996-10-11|COLLECT COD|SHIP|xpress theodolites haggle slyly unusual +51520|488|89|7|13|18050.24|0.09|0.04|N|O|1996-08-01|1996-08-01|1996-08-23|COLLECT COD|TRUCK|ully unusual dolphins against t +51521|751|16|1|30|49552.50|0.10|0.06|N|O|1996-07-23|1996-09-12|1996-08-17|NONE|RAIL|ly express packages. re +51521|1898|99|2|7|12599.23|0.10|0.02|N|O|1996-08-27|1996-08-12|1996-09-10|DELIVER IN PERSON|REG AIR|above the quickly unusual dep +51521|1284|22|3|29|34373.12|0.03|0.06|N|O|1996-08-08|1996-08-15|1996-08-15|TAKE BACK RETURN|MAIL|use boldly quickly +51521|406|65|4|50|65320.00|0.03|0.01|N|O|1996-07-14|1996-09-05|1996-08-12|NONE|MAIL|platelets ha +51521|1285|23|5|28|33215.84|0.10|0.06|N|O|1996-08-30|1996-07-21|1996-08-31|TAKE BACK RETURN|AIR|ests sleep accor +51522|1195|96|1|22|24116.18|0.02|0.05|N|O|1995-11-05|1996-01-04|1995-11-14|COLLECT COD|AIR|ironic acc +51522|815|16|2|35|60053.35|0.04|0.03|N|O|1995-11-24|1995-11-26|1995-12-14|DELIVER IN PERSON|AIR|ously regula +51522|166|19|3|36|38381.76|0.09|0.06|N|O|1995-11-11|1995-12-17|1995-12-07|TAKE BACK RETURN|MAIL|its. regular pinto beans cajole ironi +51522|1478|96|4|13|17933.11|0.00|0.06|N|O|1995-12-07|1995-12-30|1995-12-11|NONE|FOB|haggle slyly. carefully ev +51523|1366|67|1|28|35486.08|0.07|0.07|A|F|1994-07-28|1994-10-09|1994-08-19|TAKE BACK RETURN|REG AIR|lar dependencies. packa +51524|549|50|1|35|50733.90|0.01|0.08|R|F|1993-04-24|1993-05-02|1993-05-09|DELIVER IN PERSON|TRUCK|the final pinto +51524|233|88|2|27|30597.21|0.08|0.05|R|F|1993-06-23|1993-05-02|1993-07-05|NONE|TRUCK|deposits cajol +51524|668|100|3|31|48628.46|0.01|0.05|A|F|1993-06-17|1993-04-21|1993-07-16|DELIVER IN PERSON|FOB|ly ironic hockey players cajole +51524|1215|16|4|38|42415.98|0.00|0.02|A|F|1993-07-03|1993-06-06|1993-07-29|TAKE BACK RETURN|SHIP|grow. special packages +51525|956|91|1|3|5570.85|0.10|0.01|N|O|1996-01-15|1996-01-22|1996-02-07|COLLECT COD|REG AIR|deposits sleep finally ab +51525|953|22|2|45|83427.75|0.01|0.07|N|O|1996-01-23|1996-01-01|1996-02-01|DELIVER IN PERSON|SHIP|lar realms nag furiously special foxes. bli +51525|1753|80|3|47|77773.25|0.07|0.01|N|O|1996-01-05|1996-01-21|1996-01-09|TAKE BACK RETURN|FOB|ly slyly pending instructions? iro +51526|1656|80|1|44|68536.60|0.09|0.07|R|F|1995-05-10|1995-06-27|1995-06-01|DELIVER IN PERSON|SHIP|lites doub +51527|349|78|1|11|13742.74|0.01|0.03|N|O|1997-07-30|1997-07-01|1997-07-31|NONE|MAIL|ly final theodolites after the r +51527|47|48|2|42|39775.68|0.09|0.07|N|O|1997-07-04|1997-08-04|1997-07-13|COLLECT COD|SHIP|r packages cajole carefully sp +51527|528|29|3|43|61426.36|0.06|0.06|N|O|1997-05-25|1997-07-12|1997-06-10|TAKE BACK RETURN|MAIL|ar requests nag carefully furiously regula +51527|1226|64|4|31|34943.82|0.01|0.00|N|O|1997-05-14|1997-06-13|1997-05-28|COLLECT COD|AIR|gular accounts boost carefull +51527|1738|39|5|10|16397.30|0.03|0.03|N|O|1997-05-20|1997-07-16|1997-06-19|NONE|REG AIR|ickly final +51527|546|77|6|43|62201.22|0.03|0.02|N|O|1997-05-10|1997-07-10|1997-05-24|DELIVER IN PERSON|SHIP|y express requests nag slyly unusual +51552|1557|78|1|26|37922.30|0.03|0.00|N|O|1998-07-11|1998-06-11|1998-07-23|TAKE BACK RETURN|AIR|posits nod about the +51553|1931|32|1|21|38491.53|0.07|0.06|N|O|1996-02-11|1996-02-05|1996-03-02|NONE|TRUCK|ously deposits. quickly final theodolit +51553|1726|69|2|25|40693.00|0.00|0.00|N|O|1996-03-13|1996-02-22|1996-03-27|COLLECT COD|REG AIR| pains. carefully even instructions gro +51553|280|62|3|5|5901.40|0.07|0.01|N|O|1996-02-25|1996-01-31|1996-03-18|DELIVER IN PERSON|RAIL|l accounts wake +51553|291|92|4|28|33356.12|0.01|0.04|N|O|1996-01-17|1996-02-24|1996-02-03|COLLECT COD|TRUCK|es are across the careful deposi +51553|38|14|5|38|35645.14|0.07|0.01|N|O|1995-12-16|1995-12-28|1995-12-31|NONE|TRUCK|osits use carefully alo +51553|1483|62|6|38|52610.24|0.06|0.05|N|O|1995-12-05|1996-01-04|1995-12-17|COLLECT COD|AIR|ording to the +51553|786|51|7|42|70844.76|0.00|0.00|N|O|1995-12-11|1996-02-13|1996-01-07|DELIVER IN PERSON|AIR|y bold accounts bo +51554|1625|26|1|2|3053.24|0.03|0.04|A|F|1994-05-06|1994-06-08|1994-05-08|NONE|REG AIR| detect furiousl +51554|1092|63|2|19|18868.71|0.07|0.01|A|F|1994-04-16|1994-05-01|1994-05-16|COLLECT COD|SHIP|latelets about th +51554|1411|51|3|47|61683.27|0.04|0.02|A|F|1994-05-21|1994-04-30|1994-06-16|DELIVER IN PERSON|RAIL|ole carefully alongside of the +51554|564|25|4|48|70298.88|0.00|0.07|R|F|1994-07-16|1994-06-02|1994-07-19|NONE|FOB|ts. silent, silent +51554|1151|24|5|46|48398.90|0.08|0.05|A|F|1994-06-18|1994-04-30|1994-07-14|COLLECT COD|SHIP| along the +51554|612|75|6|34|51428.74|0.02|0.05|R|F|1994-04-27|1994-05-08|1994-05-14|DELIVER IN PERSON|FOB|arefully regular, silent +51555|836|36|1|42|72946.86|0.10|0.05|R|F|1995-04-10|1995-02-23|1995-04-14|NONE|REG AIR|pending, ironic requests +51555|527|18|2|17|24267.84|0.08|0.01|A|F|1995-01-27|1995-02-17|1995-01-30|NONE|TRUCK|the slyly ironic frets +51556|742|75|1|43|70637.82|0.10|0.07|A|F|1993-01-20|1992-11-27|1993-02-10|TAKE BACK RETURN|MAIL| pinto beans. r +51557|264|92|1|8|9314.08|0.06|0.05|N|O|1996-01-03|1996-01-28|1996-01-08|TAKE BACK RETURN|MAIL|d accounts. even courts about the +51557|402|3|2|35|45584.00|0.04|0.08|N|O|1996-02-16|1996-01-08|1996-02-26|DELIVER IN PERSON|AIR|ar deposits are blithely. u +51558|1435|75|1|16|21382.88|0.03|0.08|A|F|1993-07-03|1993-05-02|1993-07-15|TAKE BACK RETURN|FOB| quickly unusual +51558|433|21|2|6|8000.58|0.10|0.05|A|F|1993-04-17|1993-06-25|1993-05-15|NONE|TRUCK|ts against the pending accounts wa +51558|634|35|3|3|4603.89|0.08|0.01|R|F|1993-04-21|1993-06-25|1993-05-08|DELIVER IN PERSON|AIR|ly after the fluffily unusual theodol +51558|1923|24|4|30|54747.60|0.09|0.08|A|F|1993-05-24|1993-05-22|1993-06-19|COLLECT COD|RAIL|ding requests haggle slyly on the +51558|171|98|5|27|28921.59|0.01|0.05|R|F|1993-07-03|1993-06-12|1993-07-20|DELIVER IN PERSON|SHIP|y. even packages sle +51558|416|17|6|42|55289.22|0.10|0.05|R|F|1993-04-23|1993-05-27|1993-05-16|COLLECT COD|TRUCK|y slow accounts slee +51559|1745|88|1|3|4940.22|0.04|0.06|A|F|1992-05-11|1992-05-24|1992-06-03|COLLECT COD|MAIL|y pending foxes wa +51559|28|54|2|33|30624.66|0.04|0.04|A|F|1992-05-13|1992-05-27|1992-05-22|TAKE BACK RETURN|RAIL|s cajole. ruthless de +51559|1703|88|3|27|43326.90|0.09|0.00|R|F|1992-04-08|1992-05-10|1992-05-05|COLLECT COD|RAIL|slyly even pinto beans use slyly acro +51559|632|64|4|32|49044.16|0.08|0.06|A|F|1992-06-29|1992-04-16|1992-07-08|COLLECT COD|REG AIR|ove the ironic theodolites. +51559|211|93|5|48|53338.08|0.02|0.01|R|F|1992-04-11|1992-04-04|1992-04-20|DELIVER IN PERSON|SHIP|g requests? even theodolites +51584|1274|12|1|45|52887.15|0.03|0.00|A|F|1994-01-26|1993-12-25|1994-02-09|TAKE BACK RETURN|REG AIR|blithely daring requests. careful +51584|1670|12|2|25|39291.75|0.08|0.04|A|F|1993-11-16|1993-12-11|1993-12-12|COLLECT COD|FOB|wake furiousl +51584|959|62|3|39|72538.05|0.03|0.00|A|F|1993-12-20|1993-12-26|1994-01-10|COLLECT COD|MAIL| furiously bol +51584|1981|82|4|37|69670.26|0.05|0.08|R|F|1993-11-24|1994-01-03|1993-12-04|COLLECT COD|TRUCK|carefully special depende +51584|1156|29|5|16|16914.40|0.09|0.04|A|F|1994-01-31|1993-12-24|1994-02-09|TAKE BACK RETURN|RAIL|sits around the accounts +51584|277|5|6|4|4709.08|0.04|0.03|R|F|1993-12-06|1993-11-27|1993-12-13|NONE|FOB|ronic accounts amon +51585|1770|13|1|35|58511.95|0.04|0.05|N|O|1996-05-29|1996-06-23|1996-06-28|TAKE BACK RETURN|RAIL|carefully special foxes across the +51585|1574|15|2|31|45742.67|0.00|0.00|N|O|1996-06-13|1996-06-13|1996-06-24|NONE|AIR| carefully special inst +51585|1874|61|3|47|83465.89|0.02|0.08|N|O|1996-05-21|1996-06-17|1996-05-26|NONE|REG AIR|counts unwind slyly a +51585|677|9|4|6|9466.02|0.08|0.06|N|O|1996-08-18|1996-06-23|1996-09-04|DELIVER IN PERSON|AIR|ickly. furiously ex +51585|1305|20|5|2|2412.60|0.10|0.03|N|O|1996-06-30|1996-06-10|1996-07-04|DELIVER IN PERSON|MAIL| blithely even requests. care +51585|1741|26|6|43|70637.82|0.07|0.08|N|O|1996-07-21|1996-06-20|1996-08-09|COLLECT COD|MAIL|ar deposits +51586|1550|51|1|4|5806.20|0.07|0.03|N|O|1997-05-07|1997-03-10|1997-05-18|NONE|TRUCK|s alongside o +51586|945|48|2|2|3691.88|0.09|0.02|N|O|1997-05-25|1997-04-14|1997-06-17|COLLECT COD|FOB|sly ironic +51586|1633|16|3|39|59850.57|0.07|0.06|N|O|1997-02-02|1997-03-28|1997-03-03|TAKE BACK RETURN|RAIL|cies along the waters are quickly +51586|911|14|4|38|68852.58|0.10|0.04|N|O|1997-03-13|1997-03-29|1997-03-25|COLLECT COD|SHIP|riously bold +51586|798|31|5|9|15289.11|0.03|0.03|N|O|1997-02-22|1997-04-14|1997-03-11|NONE|TRUCK|blithely ironic +51586|1939|84|6|50|92046.50|0.07|0.00|N|O|1997-05-21|1997-04-07|1997-06-08|COLLECT COD|FOB| regular dolphins. bol +51587|799|32|1|22|37395.38|0.09|0.08|N|O|1998-03-17|1998-02-01|1998-04-03|NONE|RAIL|cross the pending deposits +51587|732|29|2|14|22858.22|0.03|0.01|N|O|1998-04-20|1998-02-23|1998-04-30|COLLECT COD|TRUCK|ourts nag quickly against the cour +51587|743|8|3|6|9862.44|0.06|0.04|N|O|1998-02-24|1998-03-28|1998-03-12|NONE|MAIL|deposits. regul +51588|63|14|1|33|31780.98|0.06|0.05|N|O|1997-06-28|1997-05-18|1997-07-23|NONE|RAIL|the idly e +51589|1739|82|1|50|82036.50|0.05|0.08|N|O|1995-06-29|1995-08-16|1995-07-23|DELIVER IN PERSON|AIR|the slyly re +51589|655|56|2|17|26446.05|0.03|0.01|N|O|1995-07-31|1995-07-12|1995-08-30|NONE|TRUCK|y unusual ideas across +51589|1522|23|3|16|22776.32|0.10|0.02|N|O|1995-09-11|1995-07-08|1995-09-18|TAKE BACK RETURN|MAIL|onic foxes unwind quickly pe +51589|955|90|4|44|81661.80|0.08|0.01|N|O|1995-06-26|1995-07-13|1995-07-04|DELIVER IN PERSON|FOB|bold dolphins. deposi +51589|823|23|5|45|77571.90|0.02|0.02|N|O|1995-09-27|1995-08-25|1995-10-04|NONE|TRUCK|he ironic courts. e +51589|109|36|6|47|47427.70|0.05|0.00|N|O|1995-10-03|1995-07-31|1995-10-05|DELIVER IN PERSON|SHIP|usual packages detect blit +51590|21|97|1|48|44208.96|0.01|0.01|N|O|1998-08-10|1998-06-04|1998-09-07|COLLECT COD|MAIL|pending deposits affix. furi +51590|644|38|2|31|47883.84|0.03|0.08|N|O|1998-07-26|1998-07-07|1998-07-28|TAKE BACK RETURN|RAIL|ourts. furiously even ideas are slyly al +51590|670|71|3|47|73821.49|0.03|0.03|N|O|1998-05-13|1998-06-05|1998-06-02|NONE|AIR|s run slyly furiously idle depo +51590|608|9|4|7|10560.20|0.04|0.07|N|O|1998-08-12|1998-06-20|1998-09-02|COLLECT COD|SHIP|ong the unusual instructions serve afte +51590|1402|42|5|33|43012.20|0.04|0.03|N|O|1998-06-25|1998-07-06|1998-07-19|COLLECT COD|SHIP|bold courts against +51591|1039|40|1|25|23500.75|0.10|0.03|A|F|1995-01-30|1994-11-04|1995-02-22|NONE|SHIP|ate. express realms doubt slow, close depo +51591|1828|72|2|49|84761.18|0.05|0.05|A|F|1995-01-06|1994-12-10|1995-01-22|COLLECT COD|FOB|accounts haggle +51591|94|95|3|32|31810.88|0.02|0.06|R|F|1994-12-22|1994-12-22|1995-01-17|DELIVER IN PERSON|TRUCK|tes detect above the furiously final dep +51591|1160|97|4|11|11672.76|0.09|0.06|R|F|1994-12-13|1994-12-19|1995-01-02|NONE|AIR|packages must have to boost +51591|1510|51|5|11|15526.61|0.01|0.02|R|F|1994-12-14|1994-12-04|1994-12-23|DELIVER IN PERSON|FOB|ns against the accounts d +51591|1370|71|6|8|10170.96|0.05|0.08|R|F|1994-12-03|1994-12-26|1994-12-17|NONE|MAIL|ounts. carefully express pac +51616|1761|62|1|9|14964.84|0.07|0.06|N|O|1997-11-08|1997-09-27|1997-12-03|COLLECT COD|RAIL|lar dolphins poach slyly quickly ironic +51617|254|36|1|20|23085.00|0.09|0.00|N|O|1997-03-12|1997-02-16|1997-03-22|TAKE BACK RETURN|AIR|es nag carefully slyly final as +51617|898|65|2|43|77352.27|0.06|0.04|N|O|1997-03-10|1996-12-31|1997-03-17|COLLECT COD|RAIL|ong the bold accounts. ironic theodolit +51617|467|97|3|31|42391.26|0.02|0.02|N|O|1997-02-26|1996-12-27|1997-03-13|COLLECT COD|AIR|he asymptotes about the furiously special +51617|1642|66|4|4|6174.56|0.06|0.05|N|O|1997-02-27|1997-02-09|1997-03-18|COLLECT COD|RAIL|mong the furiously special +51617|220|48|5|42|47049.24|0.07|0.03|N|O|1997-01-28|1996-12-31|1997-02-05|TAKE BACK RETURN|MAIL|ts. slyly regular r +51617|1062|63|6|40|38522.40|0.10|0.05|N|O|1997-02-25|1997-01-31|1997-02-26|NONE|REG AIR|egular requests. special pinto +51617|1238|13|7|6|6835.38|0.01|0.05|N|O|1997-02-14|1997-02-03|1997-03-08|NONE|FOB| of the final ideas. slyly pending +51618|354|55|1|23|28850.05|0.02|0.04|N|O|1998-04-06|1998-03-25|1998-04-15|NONE|TRUCK|grow quickly. +51618|1338|15|2|33|40897.89|0.02|0.03|N|O|1998-03-18|1998-04-29|1998-04-15|DELIVER IN PERSON|SHIP|nd the regular, unusual accounts bre +51618|329|14|3|17|20898.44|0.06|0.01|N|O|1998-04-06|1998-03-29|1998-04-27|DELIVER IN PERSON|TRUCK| even instructions. final accounts cajole. +51618|1389|28|4|49|63228.62|0.00|0.00|N|O|1998-05-13|1998-03-26|1998-06-08|NONE|FOB|ncies are. final pin +51618|1696|38|5|18|28758.42|0.09|0.04|N|O|1998-04-22|1998-04-29|1998-05-13|DELIVER IN PERSON|RAIL|aggle furiously. silently regular +51618|57|8|6|47|44981.35|0.00|0.08|N|O|1998-03-04|1998-04-15|1998-03-25|NONE|AIR|ns. fluffily ironic packages cajole ca +51619|1117|26|1|45|45814.95|0.04|0.05|R|F|1994-12-02|1994-10-15|1994-12-04|DELIVER IN PERSON|AIR|odolites. fu +51619|881|81|2|30|53456.40|0.02|0.06|A|F|1994-11-11|1994-11-16|1994-12-05|COLLECT COD|RAIL|ns. deposits must wake furiously pen +51619|147|74|3|2|2094.28|0.03|0.07|A|F|1994-12-13|1994-11-13|1995-01-08|DELIVER IN PERSON|MAIL|furiously fluffily special platele +51619|731|96|4|11|17949.03|0.05|0.07|A|F|1994-11-03|1994-10-17|1994-11-04|COLLECT COD|MAIL|ic, regular ideas sleep. +51619|1996|85|5|9|17081.91|0.08|0.01|R|F|1994-10-08|1994-10-26|1994-10-14|TAKE BACK RETURN|TRUCK|fully up the final deposits. slyly +51619|184|85|6|9|9757.62|0.05|0.02|R|F|1994-12-19|1994-10-31|1995-01-04|COLLECT COD|SHIP|arefully final accounts wake slyly. fina +51619|20|71|7|46|42320.92|0.05|0.04|R|F|1994-11-23|1994-10-28|1994-12-07|TAKE BACK RETURN|SHIP|y final instructions boost qui +51620|1396|73|1|47|60977.33|0.04|0.06|R|F|1992-05-29|1992-05-17|1992-06-12|NONE|REG AIR|nto beans. regular, even theodolites +51620|1924|25|2|40|73036.80|0.04|0.00|A|F|1992-06-01|1992-06-01|1992-06-23|DELIVER IN PERSON|MAIL| cajole slyly special packages. doggedly +51620|852|19|3|1|1752.85|0.00|0.02|R|F|1992-04-17|1992-05-02|1992-04-30|TAKE BACK RETURN|MAIL| ideas. quickly ironic instr +51620|955|24|4|9|16703.55|0.08|0.07|A|F|1992-04-20|1992-04-28|1992-05-16|DELIVER IN PERSON|TRUCK|uests boost slyly bli +51620|1974|19|5|43|80666.71|0.08|0.01|R|F|1992-06-20|1992-05-22|1992-07-13|COLLECT COD|TRUCK|ructions det +51620|1869|70|6|34|60209.24|0.01|0.08|R|F|1992-04-26|1992-05-26|1992-05-02|NONE|REG AIR|al deposits against the caref +51620|1348|87|7|1|1249.34|0.08|0.08|A|F|1992-05-09|1992-05-31|1992-05-19|NONE|MAIL|ly even theodolite +51621|1489|68|1|19|26419.12|0.03|0.04|A|F|1994-03-17|1994-01-04|1994-04-13|NONE|SHIP|s are after the quickly pending att +51621|987|88|2|6|11327.88|0.08|0.04|R|F|1994-03-19|1994-02-02|1994-04-09|COLLECT COD|REG AIR|even foxes. furiously p +51622|1626|50|1|33|50411.46|0.08|0.00|N|O|1997-10-18|1997-10-27|1997-11-08|DELIVER IN PERSON|MAIL|uriously ironic sentiment +51622|1111|20|2|36|36435.96|0.02|0.02|N|O|1997-10-11|1997-11-09|1997-11-05|DELIVER IN PERSON|MAIL| final deposits caj +51622|398|99|3|27|35056.53|0.00|0.06|N|O|1997-10-11|1997-10-28|1997-10-19|COLLECT COD|RAIL|beans alongside o +51622|665|28|4|19|29747.54|0.10|0.05|N|O|1997-10-21|1997-12-11|1997-11-17|COLLECT COD|MAIL|rs. blithel +51623|1809|53|1|37|63299.60|0.01|0.00|R|F|1994-02-08|1994-03-13|1994-03-07|NONE|SHIP|theodolites. final, special accounts mol +51623|1739|82|2|25|41018.25|0.01|0.01|R|F|1994-03-24|1994-03-20|1994-04-13|NONE|FOB|according to the special +51623|1578|59|3|26|38468.82|0.06|0.02|A|F|1994-03-19|1994-03-09|1994-04-01|DELIVER IN PERSON|RAIL| deposits. idle foxes hagg +51623|753|18|4|26|42997.50|0.05|0.05|R|F|1994-04-14|1994-04-13|1994-05-02|DELIVER IN PERSON|TRUCK|y regular acc +51623|1704|47|5|8|12845.60|0.02|0.00|A|F|1994-03-18|1994-03-04|1994-04-11|NONE|TRUCK|rding to the slyly ironic accounts; t +51623|1968|13|6|5|9349.80|0.01|0.05|R|F|1994-04-14|1994-02-13|1994-05-14|COLLECT COD|TRUCK| slyly express packages along the +51623|487|17|7|5|6937.40|0.00|0.01|R|F|1994-04-02|1994-03-17|1994-04-27|TAKE BACK RETURN|FOB|ic packages. requests mold +51648|635|98|1|47|72174.61|0.06|0.02|A|F|1992-03-22|1992-03-25|1992-04-06|COLLECT COD|TRUCK|r instructions sleep carefully. un +51648|476|64|2|46|63317.62|0.07|0.07|R|F|1992-03-31|1992-02-21|1992-04-09|DELIVER IN PERSON|FOB|posits cajole slyly ironic deposits. s +51648|1363|64|3|19|24022.84|0.04|0.00|R|F|1992-02-18|1992-03-05|1992-03-07|TAKE BACK RETURN|AIR|he bold courts! ev +51648|1708|9|4|17|27364.90|0.08|0.06|R|F|1992-03-08|1992-03-14|1992-03-21|DELIVER IN PERSON|TRUCK|ites unwind fluffily pendi +51648|480|39|5|32|44175.36|0.10|0.00|A|F|1992-02-12|1992-03-28|1992-02-22|TAKE BACK RETURN|TRUCK|xes haggle slyly alon +51648|542|73|6|47|67799.38|0.06|0.05|R|F|1992-01-20|1992-03-28|1992-02-03|COLLECT COD|RAIL|g accounts. quickly +51648|870|37|7|10|17708.70|0.07|0.07|R|F|1992-04-17|1992-03-02|1992-05-12|DELIVER IN PERSON|TRUCK|ven requests thr +51649|44|45|1|45|42481.80|0.09|0.07|N|O|1996-11-19|1996-12-27|1996-11-24|DELIVER IN PERSON|AIR|nder the even, final ideas. bli +51649|1987|20|2|34|64225.32|0.06|0.01|N|O|1997-02-25|1996-12-07|1997-03-25|DELIVER IN PERSON|REG AIR|ly special requests affix along the unu +51649|1984|73|3|20|37719.60|0.06|0.01|N|O|1996-12-01|1996-12-25|1996-12-31|NONE|TRUCK| accounts. flu +51649|17|93|4|14|12838.14|0.09|0.03|N|O|1997-03-04|1996-12-20|1997-04-02|DELIVER IN PERSON|AIR|kly bold asymptotes cajole +51650|1725|52|1|28|45548.16|0.07|0.01|N|O|1995-08-16|1995-07-15|1995-08-23|DELIVER IN PERSON|AIR|ccounts detect. regula +51650|1054|55|2|26|24831.30|0.08|0.08|N|O|1995-09-16|1995-07-30|1995-09-22|DELIVER IN PERSON|SHIP|s haggle about the regula +51650|494|53|3|7|9761.43|0.03|0.08|N|O|1995-08-26|1995-07-30|1995-09-16|DELIVER IN PERSON|RAIL|somas hagg +51650|439|98|4|38|50898.34|0.09|0.02|N|O|1995-07-14|1995-08-30|1995-08-13|TAKE BACK RETURN|REG AIR|fy courts cajole furio +51650|1038|9|5|29|27231.87|0.05|0.03|N|F|1995-06-08|1995-08-21|1995-07-08|TAKE BACK RETURN|TRUCK|uriously. slyly +51651|522|53|1|10|14225.20|0.05|0.01|N|O|1998-02-07|1998-04-07|1998-03-09|NONE|RAIL|its try to sublate. s +51651|251|33|2|17|19571.25|0.05|0.06|N|O|1998-01-26|1998-03-23|1998-02-18|TAKE BACK RETURN|REG AIR| snooze carefully notornis. silent, speci +51652|647|79|1|12|18571.68|0.00|0.00|N|O|1995-06-24|1995-07-08|1995-07-16|NONE|MAIL|wake blithely +51652|1064|65|2|39|37637.34|0.09|0.08|N|O|1995-07-11|1995-06-27|1995-07-26|TAKE BACK RETURN|FOB|ch furious +51652|280|8|3|35|41309.80|0.02|0.08|N|O|1995-08-02|1995-06-05|1995-08-31|DELIVER IN PERSON|RAIL|ilent deposits haggle blithe +51652|883|50|4|30|53516.40|0.04|0.06|R|F|1995-04-24|1995-06-10|1995-05-07|TAKE BACK RETURN|MAIL|uriously regular ideas. slyly +51652|1658|59|5|23|35871.95|0.05|0.05|R|F|1995-04-27|1995-05-31|1995-05-16|NONE|REG AIR|ound the carefully bold acc +51652|577|8|6|39|57625.23|0.03|0.03|N|O|1995-08-09|1995-06-28|1995-09-04|COLLECT COD|REG AIR|ges. express requests cajole. +51653|947|16|1|2|3695.88|0.03|0.04|N|O|1997-11-07|1997-11-09|1997-12-01|TAKE BACK RETURN|AIR|g theodolites. unusual packages h +51653|1972|73|2|48|89950.56|0.00|0.05|N|O|1997-10-10|1997-12-03|1997-11-03|NONE|SHIP|s. stealthy, spe +51653|1093|64|3|44|43739.96|0.00|0.06|N|O|1998-01-12|1997-11-03|1998-01-30|DELIVER IN PERSON|AIR|inos haggle around the re +51653|1089|95|4|11|10890.88|0.01|0.05|N|O|1997-11-11|1997-12-04|1997-12-04|NONE|MAIL|unts. carefully regular deposits boost am +51653|234|89|5|6|6805.38|0.00|0.00|N|O|1997-10-19|1997-12-21|1997-11-10|COLLECT COD|SHIP|cies. furi +51654|1498|38|1|12|16793.88|0.04|0.03|N|O|1996-06-22|1996-06-24|1996-07-15|NONE|SHIP|beans about the quickly ironic forge +51654|925|60|2|9|16433.28|0.00|0.00|N|O|1996-04-18|1996-06-14|1996-05-02|NONE|MAIL|cajole according to t +51654|311|12|3|38|46029.78|0.08|0.08|N|O|1996-06-18|1996-06-11|1996-07-13|DELIVER IN PERSON|SHIP|ges sublate quickly af +51654|1348|87|4|12|14992.08|0.03|0.04|N|O|1996-06-05|1996-06-15|1996-06-12|COLLECT COD|AIR|! carefully express theodolites haggle. si +51654|1797|24|5|17|28879.43|0.03|0.03|N|O|1996-04-04|1996-05-06|1996-04-16|TAKE BACK RETURN|REG AIR|sits haggle fluffil +51654|1404|44|6|21|27413.40|0.07|0.05|N|O|1996-06-13|1996-05-15|1996-07-13|NONE|FOB|after the regular, speci +51655|1219|31|1|26|29125.46|0.03|0.04|A|F|1993-11-27|1993-11-13|1993-12-03|DELIVER IN PERSON|AIR|: unusual, express deposits wake q +51655|1503|84|2|36|50562.00|0.05|0.02|R|F|1994-01-16|1993-11-07|1994-01-27|TAKE BACK RETURN|FOB| carefully express deposits. quickl +51680|1890|20|1|14|25086.46|0.08|0.05|N|O|1996-04-18|1996-02-04|1996-05-01|DELIVER IN PERSON|MAIL|ckages sleep furiously +51681|980|15|1|48|90287.04|0.06|0.05|N|O|1998-03-19|1998-03-02|1998-04-08|DELIVER IN PERSON|RAIL|thely. quickly silent instru +51681|1703|46|2|27|43326.90|0.02|0.04|N|O|1998-05-17|1998-03-25|1998-05-20|DELIVER IN PERSON|MAIL|ickly regular p +51681|1805|49|3|26|44376.80|0.09|0.08|N|O|1998-05-24|1998-04-02|1998-06-15|COLLECT COD|FOB|ole slyly. packages cajole. +51681|1129|66|4|2|2060.24|0.10|0.02|N|O|1998-04-23|1998-03-05|1998-05-15|NONE|REG AIR|carefully express theodolites. caref +51681|1873|3|5|32|56795.84|0.02|0.00|N|O|1998-02-06|1998-04-06|1998-02-28|COLLECT COD|RAIL|ites sleep slyl +51682|1554|55|1|36|52399.80|0.10|0.00|R|F|1993-08-08|1993-06-28|1993-08-17|NONE|TRUCK|of the fluffily silent gifts. pinto beans a +51682|1290|28|2|45|53608.05|0.01|0.00|R|F|1993-06-11|1993-06-12|1993-06-20|NONE|SHIP|boost carefully stealthily e +51682|265|93|3|24|27966.24|0.03|0.06|R|F|1993-08-07|1993-06-14|1993-08-23|DELIVER IN PERSON|AIR| quiet dolphins! fluffily even pinto +51683|1848|92|1|26|45495.84|0.01|0.04|R|F|1993-08-19|1993-08-11|1993-09-01|DELIVER IN PERSON|RAIL|. ironic, +51683|1050|86|2|12|11412.60|0.05|0.05|A|F|1993-08-19|1993-08-24|1993-08-28|TAKE BACK RETURN|MAIL|ironic foxes about +51684|732|65|1|29|47349.17|0.06|0.04|R|F|1994-02-25|1994-01-17|1994-03-13|NONE|REG AIR|d foxes after the packages snooze fur +51684|1214|15|2|13|14497.73|0.02|0.02|A|F|1993-12-11|1994-02-13|1993-12-17|DELIVER IN PERSON|AIR|the requests. +51684|970|39|3|39|72967.83|0.07|0.07|R|F|1994-02-15|1994-01-14|1994-02-20|TAKE BACK RETURN|MAIL|elets are alongside of the +51684|1036|72|4|34|31859.02|0.05|0.02|A|F|1994-03-23|1994-01-21|1994-04-21|TAKE BACK RETURN|MAIL|after the regular, +51685|669|1|1|22|34532.52|0.04|0.01|A|F|1992-07-23|1992-06-21|1992-08-05|NONE|AIR|le at the blithely ironic instructions. ca +51685|984|19|2|1|1884.98|0.05|0.08|A|F|1992-04-29|1992-07-03|1992-05-08|DELIVER IN PERSON|TRUCK|ions; blithely regular platelets +51685|1327|66|3|27|33164.64|0.02|0.05|R|F|1992-04-30|1992-05-22|1992-05-03|COLLECT COD|AIR| silent foxes. quickly brave account +51686|38|89|1|3|2814.09|0.00|0.05|N|O|1997-04-24|1997-04-02|1997-05-10|NONE|AIR| to nag. fluffy, quick i +51686|858|59|2|33|58042.05|0.09|0.06|N|O|1997-03-10|1997-04-05|1997-03-28|COLLECT COD|RAIL|e blithely thin pinto beans. blithely re +51686|137|90|3|13|13482.69|0.07|0.08|N|O|1997-05-06|1997-04-17|1997-05-16|DELIVER IN PERSON|REG AIR|uriously along the +51686|1476|55|4|32|44079.04|0.06|0.01|N|O|1997-03-14|1997-04-05|1997-04-13|TAKE BACK RETURN|REG AIR|accounts wake carefully according to t +51686|642|36|5|9|13883.76|0.05|0.00|N|O|1997-06-03|1997-04-05|1997-07-01|DELIVER IN PERSON|RAIL|e slyly ironic platelets. ca +51687|656|88|1|16|24906.40|0.04|0.02|N|O|1995-11-01|1995-10-18|1995-11-27|DELIVER IN PERSON|REG AIR|hall have to are fluffi +51687|45|96|2|23|21735.92|0.06|0.05|N|O|1995-12-28|1995-11-22|1996-01-12|TAKE BACK RETURN|AIR|nal deposits above th +51687|1026|27|3|37|34299.74|0.03|0.07|N|O|1995-10-01|1995-10-14|1995-10-26|NONE|MAIL|se along the carefully pendin +51687|256|84|4|9|10406.25|0.01|0.05|N|O|1995-09-25|1995-10-24|1995-10-17|NONE|RAIL|ronic courts detect slyly ironic requ +51687|1327|4|5|12|14739.84|0.02|0.01|N|O|1995-11-30|1995-11-24|1995-12-21|COLLECT COD|FOB|nstructions. pending, final +51687|776|73|6|32|53656.64|0.01|0.07|N|O|1995-12-25|1995-10-22|1996-01-10|TAKE BACK RETURN|REG AIR|gular excuses at the caref +51687|930|65|7|17|31125.81|0.03|0.02|N|O|1995-10-30|1995-11-04|1995-11-07|TAKE BACK RETURN|SHIP|carefully final h +51712|354|83|1|22|27595.70|0.01|0.08|N|O|1997-09-19|1997-10-12|1997-10-10|DELIVER IN PERSON|MAIL|ng packages wa +51712|739|40|2|21|34434.33|0.03|0.08|N|O|1997-09-16|1997-10-18|1997-10-06|COLLECT COD|MAIL|, slow instructions. asympto +51712|664|65|3|41|64151.06|0.08|0.00|N|O|1997-11-09|1997-10-14|1997-11-28|DELIVER IN PERSON|TRUCK|sly regular deposi +51713|1784|27|1|27|45516.06|0.08|0.00|N|O|1995-06-28|1995-06-18|1995-07-21|COLLECT COD|SHIP|he carefully iron +51713|690|53|2|36|57264.84|0.06|0.08|R|F|1995-05-24|1995-04-22|1995-06-08|TAKE BACK RETURN|MAIL|y special pack +51713|1839|83|3|43|74855.69|0.10|0.04|R|F|1995-06-04|1995-06-11|1995-06-11|TAKE BACK RETURN|REG AIR|final asymptotes. blithel +51713|217|18|4|9|10054.89|0.10|0.03|A|F|1995-03-25|1995-05-06|1995-04-05|DELIVER IN PERSON|REG AIR|yly about +51713|1769|96|5|43|71842.68|0.06|0.05|A|F|1995-04-14|1995-06-12|1995-05-11|DELIVER IN PERSON|SHIP|ts use blithel +51713|258|86|6|8|9266.00|0.08|0.06|R|F|1995-03-21|1995-05-29|1995-04-01|DELIVER IN PERSON|MAIL|y quiet requests. furiously regular pains +51714|1535|76|1|42|60334.26|0.04|0.06|A|F|1994-10-20|1994-11-12|1994-11-13|COLLECT COD|TRUCK| deposits cajole blit +51714|590|81|2|18|26830.62|0.10|0.06|R|F|1994-10-19|1994-12-03|1994-10-20|NONE|SHIP|lar, regular packages affix. reg +51714|1173|10|3|24|25780.08|0.08|0.02|A|F|1994-12-06|1994-10-24|1994-12-19|NONE|TRUCK|ckages detect according +51714|876|77|4|4|7107.48|0.10|0.01|R|F|1994-09-24|1994-10-13|1994-09-30|DELIVER IN PERSON|AIR| fluffily regular reques +51714|31|7|5|11|10241.33|0.00|0.02|A|F|1994-11-08|1994-10-29|1994-11-28|COLLECT COD|FOB|excuses solve furiously regu +51714|4|30|6|41|37064.00|0.05|0.07|R|F|1994-11-29|1994-12-05|1994-12-21|COLLECT COD|FOB|ons. carefully regular packages are al +51714|1166|39|7|36|38417.76|0.05|0.03|A|F|1994-12-29|1994-10-28|1995-01-08|DELIVER IN PERSON|RAIL|ctions. car +51715|1511|12|1|41|57912.91|0.03|0.00|N|O|1996-03-12|1996-04-14|1996-03-23|NONE|TRUCK|sual, iron +51715|1629|30|2|19|29081.78|0.06|0.08|N|O|1996-04-16|1996-03-19|1996-05-11|TAKE BACK RETURN|RAIL|posits haggle quickly ev +51715|1252|90|3|29|33444.25|0.02|0.06|N|O|1996-05-27|1996-04-20|1996-06-15|TAKE BACK RETURN|MAIL|ily ironic instructions boost regularly +51715|990|25|4|39|73748.61|0.06|0.04|N|O|1996-03-30|1996-04-05|1996-04-21|DELIVER IN PERSON|MAIL|ithely final pinto beans. finally final +51715|103|30|5|44|44136.40|0.02|0.04|N|O|1996-02-13|1996-03-29|1996-03-03|NONE|FOB|ly special instructions haggle against t +51715|827|94|6|44|76024.08|0.08|0.08|N|O|1996-03-03|1996-04-17|1996-03-24|NONE|SHIP| carefully. blithely iron +51715|1131|32|7|3|3096.39|0.09|0.02|N|O|1996-02-20|1996-04-07|1996-02-24|NONE|REG AIR| dependencies cajole fluffil +51716|1866|67|1|46|81321.56|0.07|0.07|N|O|1997-01-25|1997-01-16|1997-02-09|NONE|REG AIR|bits after the blithely pending +51717|1753|96|1|24|39714.00|0.07|0.08|N|O|1998-07-28|1998-07-07|1998-08-21|DELIVER IN PERSON|TRUCK| among the blithely b +51718|1635|59|1|25|38415.75|0.10|0.07|N|O|1996-04-09|1996-03-14|1996-05-03|NONE|MAIL| warhorses. blithely +51718|1059|95|2|34|32641.70|0.07|0.08|N|O|1996-05-19|1996-05-02|1996-05-29|NONE|MAIL|l accounts are carefully above +51718|1024|25|3|19|17575.38|0.01|0.01|N|O|1996-05-29|1996-03-14|1996-06-16|COLLECT COD|AIR|ts haggle blithely express package +51718|1585|6|4|30|44597.40|0.05|0.02|N|O|1996-02-12|1996-04-28|1996-02-24|COLLECT COD|SHIP|e furiously along the +51718|647|48|5|7|10833.48|0.06|0.02|N|O|1996-04-24|1996-04-09|1996-05-05|DELIVER IN PERSON|REG AIR|inal platelets. carefully final instruc +51719|830|97|1|2|3461.66|0.05|0.00|N|O|1996-10-05|1996-11-07|1996-11-03|TAKE BACK RETURN|AIR|s. slyly special accounts doze blithe +51719|1314|29|2|10|12153.10|0.08|0.08|N|O|1996-09-20|1996-11-13|1996-10-13|COLLECT COD|FOB|s. ironic packages ac +51744|354|39|1|8|10034.80|0.01|0.00|N|O|1996-11-27|1997-01-24|1996-12-19|NONE|RAIL|ut the fluffily exp +51744|1509|10|2|34|47957.00|0.00|0.08|N|O|1997-02-13|1997-01-13|1997-03-06|DELIVER IN PERSON|RAIL|s boost blithely final instructions. +51744|1238|76|3|4|4556.92|0.07|0.07|N|O|1997-01-08|1996-12-15|1997-01-15|TAKE BACK RETURN|TRUCK|t, quiet excuses. +51744|398|27|4|12|15580.68|0.02|0.00|N|O|1996-12-27|1997-01-16|1997-01-01|DELIVER IN PERSON|REG AIR|al instructions. quickly silent accoun +51745|629|23|1|26|39770.12|0.00|0.05|N|O|1996-10-12|1996-12-05|1996-10-24|COLLECT COD|REG AIR|e furiously regular +51745|1742|43|2|11|18081.14|0.08|0.01|N|O|1996-10-01|1996-10-17|1996-10-12|COLLECT COD|MAIL|. special instructions are furi +51746|458|17|1|30|40753.50|0.10|0.03|A|F|1992-12-26|1992-12-12|1992-12-29|TAKE BACK RETURN|REG AIR|lar dolphins use slyly b +51747|755|52|1|2|3311.50|0.08|0.01|A|F|1992-07-24|1992-08-15|1992-08-22|DELIVER IN PERSON|MAIL|carefully furiously +51747|1924|25|2|6|10955.52|0.04|0.00|R|F|1992-07-07|1992-08-06|1992-07-31|TAKE BACK RETURN|TRUCK|ly special g +51747|395|80|3|9|11658.51|0.04|0.08|A|F|1992-07-18|1992-10-01|1992-07-26|TAKE BACK RETURN|AIR|regular, regular p +51747|1034|5|4|30|28050.90|0.03|0.06|R|F|1992-09-22|1992-09-05|1992-10-15|COLLECT COD|AIR|fluffily even packages ru +51747|1284|22|5|22|26076.16|0.08|0.02|A|F|1992-09-07|1992-09-28|1992-09-30|NONE|MAIL|the carefully ironic deposits. unusual pac +51747|916|85|6|49|89028.59|0.00|0.01|R|F|1992-10-29|1992-09-09|1992-11-06|NONE|FOB|uests cajole fluff +51748|1194|95|1|22|24094.18|0.03|0.04|N|O|1995-07-03|1995-08-31|1995-07-25|TAKE BACK RETURN|RAIL|asymptotes are slyly. fluffily final theo +51748|176|29|2|2|2152.34|0.07|0.01|N|O|1995-08-09|1995-09-05|1995-08-22|DELIVER IN PERSON|SHIP|requests haggle. +51748|451|39|3|21|28380.45|0.03|0.07|N|O|1995-09-20|1995-07-19|1995-10-09|NONE|AIR|ole according to the unusual, r +51749|1013|84|1|17|15538.17|0.04|0.03|N|O|1997-03-17|1997-05-23|1997-04-12|TAKE BACK RETURN|SHIP|st furiously. slyly express +51749|1819|63|2|23|39578.63|0.01|0.02|N|O|1997-04-10|1997-04-09|1997-05-02|NONE|SHIP|osits. instructions +51749|1080|86|3|34|33356.72|0.00|0.06|N|O|1997-04-28|1997-04-29|1997-05-04|NONE|RAIL|ments sublate unusual deposits. ca +51749|824|25|4|41|70717.62|0.04|0.07|N|O|1997-03-31|1997-05-30|1997-04-25|NONE|FOB|t the slyly regular warthogs. unusual de +51749|1635|18|5|19|29195.97|0.04|0.07|N|O|1997-06-26|1997-04-16|1997-07-26|NONE|SHIP|inst the blithely ironic foxes. +51749|561|22|6|32|46769.92|0.06|0.06|N|O|1997-05-02|1997-05-27|1997-05-30|TAKE BACK RETURN|TRUCK|foxes against the ironic, even +51750|1892|22|1|6|10763.34|0.10|0.02|A|F|1993-07-07|1993-05-14|1993-07-22|DELIVER IN PERSON|SHIP|ngside of the furiously pending pinto +51751|1913|46|1|17|30853.47|0.09|0.01|R|F|1994-07-23|1994-06-09|1994-07-28|TAKE BACK RETURN|REG AIR| silent request +51776|1414|93|1|12|15784.92|0.09|0.08|N|O|1996-07-13|1996-08-27|1996-07-27|NONE|FOB|packages sleep slyly slyly pe +51777|314|99|1|22|26714.82|0.10|0.07|A|F|1995-02-25|1995-03-26|1995-03-24|TAKE BACK RETURN|TRUCK|ccounts are slyly alongside +51777|1077|83|2|16|15649.12|0.00|0.00|A|F|1995-04-22|1995-04-13|1995-04-28|DELIVER IN PERSON|RAIL|ess platel +51777|269|70|3|50|58463.00|0.03|0.07|A|F|1995-04-12|1995-04-02|1995-04-30|DELIVER IN PERSON|SHIP|its. slowly specia +51777|1935|24|4|33|60618.69|0.00|0.00|R|F|1995-06-02|1995-05-07|1995-06-10|DELIVER IN PERSON|FOB| fluffily even +51777|509|10|5|10|14095.00|0.04|0.06|A|F|1995-04-09|1995-05-09|1995-04-26|DELIVER IN PERSON|AIR|eposits. ca +51778|644|7|1|29|44794.56|0.05|0.00|N|O|1998-01-04|1998-01-22|1998-01-27|COLLECT COD|SHIP|uickly regular deposi +51779|1873|74|1|14|24848.18|0.01|0.04|N|O|1995-11-20|1995-12-12|1995-12-15|COLLECT COD|MAIL|s. quickly ironic packages haggle a +51780|1066|72|1|15|14505.90|0.02|0.06|A|F|1993-11-01|1993-10-22|1993-11-27|DELIVER IN PERSON|RAIL|ly final waters at the fi +51780|1403|82|2|36|46958.40|0.04|0.03|A|F|1993-08-14|1993-09-19|1993-09-10|NONE|REG AIR|ular instructions cajole furiously ab +51780|444|74|3|41|55122.04|0.06|0.04|R|F|1993-11-04|1993-09-09|1993-12-03|TAKE BACK RETURN|RAIL|eposits. quickly unusu +51780|557|48|4|12|17490.60|0.04|0.08|A|F|1993-10-26|1993-08-27|1993-11-01|COLLECT COD|REG AIR|xes ought to aff +51780|1146|83|5|15|15707.10|0.02|0.07|R|F|1993-11-11|1993-10-05|1993-11-25|NONE|AIR|es cajole according to the stealthily +51780|514|15|6|5|7072.55|0.00|0.02|R|F|1993-08-04|1993-09-26|1993-08-28|NONE|REG AIR|requests us +51780|1356|57|7|13|16345.55|0.03|0.00|A|F|1993-08-09|1993-09-26|1993-08-10|TAKE BACK RETURN|FOB|ld packages shall use unusual deposi +51781|1971|72|1|9|16856.73|0.08|0.08|N|O|1996-05-30|1996-04-26|1996-05-31|DELIVER IN PERSON|MAIL|s! carefully unusual forges sleep after th +51781|731|32|2|2|3263.46|0.02|0.08|N|O|1996-05-03|1996-05-28|1996-05-19|TAKE BACK RETURN|FOB|t fluffily. even t +51782|812|13|1|9|15415.29|0.09|0.06|R|F|1993-12-16|1993-10-18|1994-01-06|DELIVER IN PERSON|AIR|y silent, regular packages. carefully r +51782|1784|85|2|22|37087.16|0.04|0.05|R|F|1993-10-11|1993-11-25|1993-11-09|DELIVER IN PERSON|SHIP|its mold blithely a +51782|1553|74|3|34|49454.70|0.10|0.02|R|F|1993-11-18|1993-10-05|1993-11-26|TAKE BACK RETURN|TRUCK|inal deposits. final packages +51782|1743|70|4|40|65789.60|0.07|0.00|R|F|1993-10-23|1993-11-22|1993-11-03|COLLECT COD|REG AIR|carefully regular accounts-- speci +51783|511|2|1|33|46579.83|0.06|0.00|N|O|1995-11-29|1996-01-25|1995-12-20|COLLECT COD|TRUCK|he furiously unusual de +51783|1692|16|2|47|74903.43|0.03|0.03|N|O|1995-12-09|1996-01-01|1996-01-02|COLLECT COD|FOB|s foxes wake slyly across the slyl +51783|188|89|3|8|8705.44|0.06|0.04|N|O|1995-11-17|1996-01-17|1995-12-07|COLLECT COD|SHIP| regular idea +51783|1078|14|4|43|42100.01|0.02|0.07|N|O|1996-01-30|1995-12-30|1996-02-13|COLLECT COD|FOB|silent instructions +51783|1779|64|5|49|82357.73|0.03|0.06|N|O|1995-12-17|1995-12-29|1996-01-13|TAKE BACK RETURN|TRUCK| theodolites. clos +51783|1039|45|6|24|22560.72|0.07|0.07|N|O|1996-03-01|1996-01-31|1996-03-12|DELIVER IN PERSON|AIR|ly. express deposits cajole. blithel +51808|1728|29|1|9|14667.48|0.00|0.00|R|F|1993-09-03|1993-10-12|1993-09-15|TAKE BACK RETURN|RAIL|. ironic foxes integrate theo +51808|368|97|2|28|35514.08|0.03|0.01|R|F|1993-10-27|1993-10-25|1993-11-20|COLLECT COD|FOB|ly above the final excus +51808|1580|21|3|26|38521.08|0.08|0.00|A|F|1993-11-25|1993-09-28|1993-12-20|COLLECT COD|TRUCK|jole above the ex +51808|210|65|4|5|5551.05|0.02|0.00|A|F|1993-10-15|1993-10-01|1993-11-10|TAKE BACK RETURN|FOB|ly fluffily final accounts. +51809|213|41|1|26|28943.46|0.05|0.05|A|F|1992-09-13|1992-09-01|1992-10-05|TAKE BACK RETURN|TRUCK|s the ideas. r +51809|172|73|2|30|32165.10|0.09|0.00|A|F|1992-08-20|1992-08-20|1992-09-19|COLLECT COD|TRUCK|packages. fluffily regular pin +51809|955|56|3|21|38974.95|0.04|0.08|R|F|1992-07-20|1992-08-14|1992-08-11|NONE|RAIL| final platelets. instruc +51809|1859|89|4|35|61629.75|0.01|0.03|R|F|1992-10-08|1992-08-26|1992-10-26|TAKE BACK RETURN|TRUCK|counts poach +51810|1075|81|1|41|40018.87|0.00|0.02|A|F|1993-07-23|1993-06-23|1993-07-24|COLLECT COD|TRUCK|posits against the carefull +51810|1430|31|2|8|10651.44|0.02|0.03|R|F|1993-06-14|1993-06-23|1993-06-18|DELIVER IN PERSON|RAIL|bout the furiously final accounts. i +51810|559|60|3|24|35029.20|0.03|0.03|A|F|1993-05-28|1993-08-05|1993-06-08|NONE|REG AIR|y blithely bold accounts. special fo +51811|418|77|1|44|58010.04|0.01|0.06|R|F|1992-09-10|1992-10-11|1992-09-16|DELIVER IN PERSON|SHIP|unts are sl +51812|1160|69|1|36|38201.76|0.07|0.01|N|O|1997-08-10|1997-07-29|1997-08-28|NONE|REG AIR|ajole. care +51812|655|18|2|45|70004.25|0.04|0.08|N|O|1997-06-10|1997-08-07|1997-07-06|NONE|MAIL|ilent somas. ironically reg +51812|36|37|3|9|8424.27|0.07|0.01|N|O|1997-08-15|1997-07-02|1997-08-16|TAKE BACK RETURN|TRUCK|fter the fluffily ironic a +51812|1079|50|4|17|16661.19|0.03|0.01|N|O|1997-08-30|1997-07-14|1997-09-10|COLLECT COD|FOB|ronic dependencies wake care +51812|831|98|5|4|6927.32|0.03|0.07|N|O|1997-06-22|1997-06-26|1997-06-25|COLLECT COD|RAIL|ully unusual ideas cajole furious +51812|152|5|6|29|30512.35|0.03|0.04|N|O|1997-08-03|1997-07-20|1997-08-30|NONE|SHIP|at the quickly enticing foxe +51812|853|87|7|48|84184.80|0.03|0.03|N|O|1997-06-16|1997-07-28|1997-07-13|NONE|TRUCK|hs. express, +51813|710|75|1|49|78924.79|0.07|0.04|R|F|1993-02-18|1993-03-10|1993-03-08|NONE|AIR|ke. ironic, expr +51813|1773|100|2|11|18422.47|0.03|0.03|R|F|1993-01-06|1993-02-24|1993-01-15|COLLECT COD|AIR|atelets among the final +51813|162|15|3|5|5310.80|0.05|0.00|A|F|1993-01-28|1993-03-16|1993-01-29|NONE|TRUCK|ong the deposits wake ca +51813|1797|24|4|18|30578.22|0.10|0.04|A|F|1993-02-17|1993-01-21|1993-02-28|COLLECT COD|AIR| alongside of the pinto beans. slyly i +51813|1627|10|5|26|39744.12|0.04|0.01|A|F|1993-03-20|1993-02-04|1993-04-06|TAKE BACK RETURN|FOB|lly dependencies. accounts solve fu +51814|569|70|1|40|58782.40|0.02|0.00|A|F|1994-01-15|1993-11-09|1994-02-05|COLLECT COD|FOB|y furiously regular instructions. slyly exp +51814|1059|65|2|7|6720.35|0.07|0.04|A|F|1993-10-26|1993-10-30|1993-11-10|COLLECT COD|RAIL| carefully ironic, ironic ideas. final, +51814|646|47|3|5|7733.20|0.02|0.01|R|F|1994-01-23|1993-12-18|1994-01-31|NONE|TRUCK|onic accounts. furiously bold deposits +51814|674|68|4|38|59837.46|0.05|0.04|A|F|1993-10-13|1993-11-09|1993-11-11|COLLECT COD|RAIL|ests along t +51814|1936|25|5|32|58813.76|0.03|0.07|A|F|1993-10-26|1993-11-28|1993-10-29|NONE|FOB|, final ideas wake blithely against the c +51814|74|75|6|6|5844.42|0.07|0.02|R|F|1993-11-09|1993-12-03|1993-11-26|TAKE BACK RETURN|MAIL|ual instructions. slyly special reques +51814|1600|1|7|46|69073.60|0.09|0.07|R|F|1993-12-31|1993-11-11|1994-01-07|COLLECT COD|TRUCK|s along the furiously bold +51815|1683|84|1|41|64971.88|0.05|0.04|R|F|1994-07-02|1994-07-17|1994-07-08|DELIVER IN PERSON|AIR|y furiously express theodol +51815|1481|99|2|24|33179.52|0.06|0.00|A|F|1994-07-17|1994-07-22|1994-08-02|COLLECT COD|RAIL|g the slyly even fox +51815|688|82|3|32|50837.76|0.05|0.02|A|F|1994-06-02|1994-06-27|1994-06-20|NONE|AIR|. carefully regular real +51815|1882|26|4|11|19622.68|0.04|0.01|R|F|1994-07-04|1994-07-22|1994-07-11|COLLECT COD|AIR|, bold accounts cajole fur +51815|563|54|5|12|17562.72|0.09|0.06|R|F|1994-08-24|1994-08-20|1994-08-25|DELIVER IN PERSON|SHIP|ons. blithely fin +51815|1245|20|6|44|50434.56|0.04|0.01|A|F|1994-07-31|1994-06-30|1994-08-21|NONE|REG AIR| might engage quickl +51815|701|2|7|36|57661.20|0.06|0.02|A|F|1994-08-27|1994-07-13|1994-09-26|NONE|MAIL| according to the ironic ideas +51840|839|40|1|49|85251.67|0.05|0.06|N|O|1996-07-30|1996-09-16|1996-08-08|DELIVER IN PERSON|AIR|s wake. quickly ironic patterns wake +51841|432|33|1|15|19986.45|0.01|0.06|N|O|1997-05-23|1997-05-05|1997-06-15|DELIVER IN PERSON|FOB| regular i +51842|1199|72|1|34|37406.46|0.03|0.07|N|O|1996-02-19|1996-02-10|1996-03-05|DELIVER IN PERSON|REG AIR|ccounts. final foxes alo +51842|170|71|2|2|2140.34|0.09|0.00|N|O|1996-02-05|1996-01-03|1996-02-29|COLLECT COD|AIR|. blithely unusual i +51842|63|14|3|21|20224.26|0.00|0.05|N|O|1996-01-11|1996-01-07|1996-01-25|NONE|SHIP|ully regular waters cajole quickly bold in +51842|814|14|4|14|24007.34|0.08|0.03|N|O|1995-12-18|1996-02-09|1996-01-14|TAKE BACK RETURN|FOB|packages? c +51842|1319|20|5|24|29287.44|0.10|0.05|N|O|1996-01-27|1996-01-24|1996-02-10|COLLECT COD|MAIL|s are slyly at the accounts. +51842|949|52|6|31|57348.14|0.02|0.04|N|O|1996-01-18|1996-01-01|1996-02-15|DELIVER IN PERSON|SHIP|deposits wake! furiously e +51842|966|35|7|42|78412.32|0.07|0.06|N|O|1995-12-02|1996-01-14|1995-12-10|NONE|MAIL|r accounts cajole carefully across the fur +51843|680|12|1|42|66388.56|0.01|0.07|N|O|1996-05-16|1996-03-16|1996-06-09|DELIVER IN PERSON|TRUCK|ges cajole +51843|360|89|2|2|2520.72|0.10|0.06|N|O|1996-03-04|1996-03-05|1996-03-28|NONE|RAIL|gular ideas int +51843|1536|17|3|19|27313.07|0.03|0.00|N|O|1996-05-29|1996-04-08|1996-06-18|DELIVER IN PERSON|REG AIR|ckages. daringly express foxes +51843|59|60|4|23|22058.15|0.01|0.07|N|O|1996-03-25|1996-03-30|1996-04-05|DELIVER IN PERSON|SHIP|the ironically ironic notornis us +51843|1760|61|5|17|28249.92|0.05|0.07|N|O|1996-02-01|1996-04-29|1996-02-05|COLLECT COD|SHIP|usual ideas. final acc +51843|967|2|6|18|33623.28|0.03|0.05|N|O|1996-04-18|1996-03-10|1996-05-06|NONE|REG AIR|st the furiously unusua +51843|1148|57|7|23|24130.22|0.03|0.06|N|O|1996-02-25|1996-03-01|1996-03-09|COLLECT COD|AIR|counts afte +51844|437|38|1|39|52159.77|0.07|0.07|R|F|1994-06-18|1994-06-11|1994-07-07|DELIVER IN PERSON|SHIP|re quickly pending accounts. express depo +51844|1357|72|2|43|54109.05|0.05|0.03|R|F|1994-05-01|1994-05-24|1994-05-09|COLLECT COD|REG AIR|platelets affix carefully bold epitap +51844|1884|85|3|39|69649.32|0.04|0.07|A|F|1994-05-17|1994-06-27|1994-06-16|TAKE BACK RETURN|MAIL|ccounts above the regular, +51844|1441|42|4|26|34903.44|0.04|0.05|A|F|1994-05-09|1994-06-28|1994-06-04|DELIVER IN PERSON|TRUCK|ggle slyly. furiously quick depe +51844|1988|33|5|7|13229.86|0.09|0.08|R|F|1994-04-28|1994-06-24|1994-05-10|NONE|TRUCK|equests are. dogged accounts dazzle fluffil +51845|821|22|1|6|10330.92|0.10|0.05|R|F|1992-07-25|1992-06-15|1992-07-27|COLLECT COD|RAIL|ully bold instructions haggle ironical +51845|1562|43|2|2|2927.12|0.06|0.08|R|F|1992-07-16|1992-07-26|1992-07-22|DELIVER IN PERSON|FOB| final packages cajole +51845|1431|10|3|29|38640.47|0.05|0.04|A|F|1992-08-12|1992-06-14|1992-08-21|NONE|AIR|uternes. blithe +51845|1177|78|4|19|20485.23|0.02|0.07|R|F|1992-06-08|1992-06-29|1992-06-27|DELIVER IN PERSON|MAIL| blithely. carefully even courts are qui +51845|97|98|5|36|35895.24|0.08|0.07|R|F|1992-06-14|1992-06-12|1992-06-18|NONE|MAIL|y unusual p +51846|1164|37|1|31|33019.96|0.06|0.06|N|O|1998-08-18|1998-08-12|1998-08-30|NONE|TRUCK|ns. unusual foxes are silently bold pinto +51846|886|87|2|4|7147.52|0.08|0.04|N|O|1998-07-28|1998-08-11|1998-08-04|NONE|REG AIR|ins are furiously a +51846|590|81|3|2|2981.18|0.06|0.03|N|O|1998-10-14|1998-08-31|1998-11-12|DELIVER IN PERSON|MAIL|ly pending excuses. busily regular pa +51846|1719|62|4|41|66449.11|0.03|0.07|N|O|1998-06-23|1998-07-30|1998-07-05|COLLECT COD|MAIL|y final requests cajole +51846|629|30|5|38|58125.56|0.07|0.06|N|O|1998-10-09|1998-09-17|1998-10-19|COLLECT COD|FOB|into beans mus +51847|882|16|1|15|26743.20|0.01|0.04|N|O|1997-03-10|1997-03-13|1997-03-22|COLLECT COD|SHIP|ithely above the fluffily regular +51847|18|69|2|26|23868.26|0.07|0.07|N|O|1997-02-09|1997-02-13|1997-02-17|NONE|REG AIR|ronic packages. fu +51847|551|52|3|45|65319.75|0.02|0.01|N|O|1997-04-30|1997-02-25|1997-05-19|NONE|SHIP|uickly regular pa +51847|1472|90|4|42|57685.74|0.08|0.07|N|O|1997-03-21|1997-03-03|1997-03-24|DELIVER IN PERSON|MAIL|ily ironic a +51847|1001|7|5|23|20746.00|0.10|0.00|N|O|1997-04-26|1997-02-18|1997-05-12|COLLECT COD|AIR|uests sleep carefully. slyly re +51847|425|13|6|47|62294.74|0.04|0.01|N|O|1997-02-24|1997-03-06|1997-03-13|TAKE BACK RETURN|AIR|ckly above the +51872|1491|70|1|15|20887.35|0.05|0.00|R|F|1992-06-10|1992-05-27|1992-07-02|DELIVER IN PERSON|REG AIR|wake blithely fin +51872|1181|82|2|19|20561.42|0.00|0.04|R|F|1992-06-30|1992-06-18|1992-07-10|TAKE BACK RETURN|AIR|fily ironic theodolites are care +51872|1671|54|3|26|40889.42|0.00|0.04|A|F|1992-07-06|1992-07-23|1992-07-24|TAKE BACK RETURN|REG AIR| about the regular, express accounts! unus +51872|570|1|4|41|60293.37|0.08|0.08|R|F|1992-05-20|1992-07-04|1992-06-10|TAKE BACK RETURN|TRUCK|slyly around the +51872|37|63|5|44|41229.32|0.05|0.00|R|F|1992-07-06|1992-07-14|1992-07-24|DELIVER IN PERSON|REG AIR|es. pending foxe +51872|1798|99|6|31|52693.49|0.02|0.06|R|F|1992-08-11|1992-06-22|1992-08-29|NONE|REG AIR|le idly about the thin foxes. +51872|1978|11|7|45|84598.65|0.06|0.08|R|F|1992-06-19|1992-06-29|1992-07-01|COLLECT COD|TRUCK|quickly final packages wake: bold +51873|1239|14|1|21|23944.83|0.08|0.05|A|F|1994-07-01|1994-07-04|1994-07-28|DELIVER IN PERSON|REG AIR|. carefully final depo +51873|198|99|2|17|18669.23|0.07|0.05|R|F|1994-05-28|1994-07-03|1994-06-19|NONE|RAIL|l, final courts. +51873|1920|9|3|16|29150.72|0.04|0.00|A|F|1994-05-26|1994-07-28|1994-06-01|COLLECT COD|MAIL| among the quickly ironic foxe +51873|379|36|4|24|30704.88|0.03|0.01|R|F|1994-05-15|1994-06-29|1994-05-27|TAKE BACK RETURN|TRUCK|above the pinto be +51873|29|5|5|2|1858.04|0.04|0.08|A|F|1994-06-26|1994-06-15|1994-06-28|DELIVER IN PERSON|RAIL|y pending asymptot +51874|1725|26|1|27|43921.44|0.04|0.07|N|O|1998-04-05|1998-03-19|1998-04-29|NONE|AIR|ress foxes wake carefully alongside of t +51874|190|43|2|3|3270.57|0.04|0.02|N|O|1998-03-06|1998-03-06|1998-03-13|COLLECT COD|SHIP|snooze carefull +51875|1361|76|1|1|1262.36|0.02|0.07|N|O|1997-08-05|1997-08-08|1997-08-18|COLLECT COD|AIR|s. slyly i +51875|1733|60|2|25|40868.25|0.07|0.01|N|O|1997-09-09|1997-07-28|1997-10-01|TAKE BACK RETURN|MAIL|r the carefully regular requests are af +51875|355|40|3|3|3766.05|0.07|0.04|N|O|1997-08-20|1997-08-13|1997-09-09|TAKE BACK RETURN|SHIP|ss, regular excuses maintain bli +51876|300|28|1|7|8402.10|0.03|0.07|A|F|1992-04-11|1992-05-07|1992-04-26|TAKE BACK RETURN|SHIP|nusual deposits mold around the careful +51877|1506|87|1|41|57707.50|0.04|0.06|N|O|1996-03-18|1996-01-23|1996-03-26|COLLECT COD|MAIL|. blithely express excuse +51877|505|66|2|45|63247.50|0.05|0.07|N|O|1996-02-03|1996-02-09|1996-02-12|TAKE BACK RETURN|SHIP|regular gi +51877|1140|13|3|8|8329.12|0.04|0.01|N|O|1996-01-03|1996-01-15|1996-01-17|NONE|SHIP|egular frays. even +51877|65|16|4|23|22196.38|0.09|0.08|N|O|1996-03-13|1996-02-19|1996-04-03|COLLECT COD|FOB|egular foxes nag blithely deposits. furi +51877|1564|5|5|22|32242.32|0.07|0.05|N|O|1996-01-23|1996-01-10|1996-02-01|DELIVER IN PERSON|FOB| blithely. blithely ironi +51877|1178|87|6|14|15108.38|0.02|0.01|N|O|1996-02-26|1996-02-03|1996-03-07|DELIVER IN PERSON|REG AIR| quickly blithe accounts. express frays +51877|1495|35|7|3|4189.47|0.01|0.01|N|O|1996-04-03|1996-01-13|1996-04-08|NONE|MAIL|fluffily brave requ +51878|691|23|1|18|28650.42|0.06|0.06|N|O|1995-11-10|1995-11-21|1995-11-12|COLLECT COD|AIR| ironic theodolites wake according to +51878|1588|9|2|9|13406.22|0.10|0.05|N|O|1995-12-11|1995-11-20|1995-12-12|NONE|TRUCK|ven packages. even, regula +51879|612|13|1|21|31764.81|0.09|0.03|A|F|1993-10-13|1993-10-03|1993-10-18|NONE|MAIL|ve the furiously even +51879|383|84|2|50|64169.00|0.04|0.02|R|F|1993-09-11|1993-11-23|1993-09-14|TAKE BACK RETURN|FOB|eans nag carefully blithely re +51879|812|12|3|41|70225.21|0.03|0.08|A|F|1993-12-10|1993-11-18|1993-12-29|TAKE BACK RETURN|MAIL| players: final excuses w +51904|129|82|1|27|27786.24|0.01|0.06|N|O|1998-04-10|1998-05-08|1998-04-18|DELIVER IN PERSON|SHIP|encies haggle alongsid +51905|1072|78|1|42|40868.94|0.00|0.01|N|O|1998-01-17|1998-01-27|1998-01-23|DELIVER IN PERSON|FOB|. slyly pe +51905|1121|58|2|41|41906.92|0.00|0.03|N|O|1998-01-11|1997-12-21|1998-01-31|COLLECT COD|RAIL|ding dependencies are quickl +51905|1980|25|3|42|79043.16|0.02|0.03|N|O|1997-12-18|1997-12-26|1998-01-14|TAKE BACK RETURN|TRUCK|ully bold ac +51905|1275|87|4|5|5881.35|0.00|0.01|N|O|1998-01-06|1997-12-27|1998-02-03|TAKE BACK RETURN|TRUCK|d ideas. furiously unusual ideas +51906|1157|58|1|24|25395.60|0.05|0.02|N|O|1995-09-06|1995-11-04|1995-10-02|DELIVER IN PERSON|RAIL|lithely express packages affix quickly abou +51906|1610|11|2|45|68022.45|0.08|0.04|N|O|1995-11-15|1995-10-31|1995-11-19|TAKE BACK RETURN|AIR|ccounts use carefull +51906|1783|26|3|45|75815.10|0.00|0.08|N|O|1995-12-19|1995-10-12|1995-12-25|TAKE BACK RETURN|TRUCK|gle boldly ir +51906|1857|1|4|37|65077.45|0.10|0.07|N|O|1995-09-28|1995-11-09|1995-10-20|TAKE BACK RETURN|REG AIR|usual requests after the accoun +51906|453|54|5|6|8120.70|0.08|0.06|N|O|1995-11-24|1995-11-25|1995-12-07|NONE|SHIP|quickly to the ironic accounts. ironic, +51907|1411|51|1|19|24935.79|0.03|0.02|N|O|1997-12-30|1997-12-30|1998-01-09|NONE|FOB|ackages. fluff +51907|1641|42|2|40|61705.60|0.03|0.03|N|O|1997-12-07|1998-02-04|1997-12-18|DELIVER IN PERSON|SHIP|nstructions. furiously regular deposits use +51907|1847|34|3|27|47218.68|0.03|0.03|N|O|1998-01-18|1998-01-26|1998-02-08|TAKE BACK RETURN|MAIL|ily final accounts +51908|1719|62|1|20|32414.20|0.08|0.04|N|O|1996-09-29|1996-10-06|1996-10-29|NONE|RAIL|ccounts boost after th +51908|1159|32|2|42|44526.30|0.10|0.05|N|O|1996-09-03|1996-10-07|1996-09-13|NONE|AIR|alongside of the blithely regu +51908|286|87|3|38|45078.64|0.03|0.01|N|O|1996-11-04|1996-10-01|1996-11-30|DELIVER IN PERSON|SHIP|ans nag carefully a +51908|530|91|4|38|54360.14|0.07|0.04|N|O|1996-12-09|1996-11-10|1996-12-31|COLLECT COD|TRUCK|efully unusual asymptotes wake according +51908|545|6|5|23|33247.42|0.04|0.08|N|O|1996-09-29|1996-09-30|1996-10-24|COLLECT COD|REG AIR|less accounts. regular, regular foxes poa +51909|1773|58|1|5|8373.85|0.02|0.06|N|O|1996-06-10|1996-06-29|1996-07-09|NONE|MAIL|ely bold ideas: fluffily pending ac +51909|313|70|2|34|41252.54|0.01|0.05|N|O|1996-06-13|1996-07-05|1996-07-10|COLLECT COD|AIR|ic platelets. blithely unusual theodol +51909|1291|92|3|21|25038.09|0.02|0.00|N|O|1996-05-31|1996-05-27|1996-06-14|DELIVER IN PERSON|MAIL|gular packages. pearls use accordin +51909|518|79|4|49|69506.99|0.08|0.08|N|O|1996-06-24|1996-07-06|1996-07-11|DELIVER IN PERSON|REG AIR|ly above the blit +51909|1742|69|5|27|44380.98|0.03|0.08|N|O|1996-07-09|1996-07-05|1996-07-29|TAKE BACK RETURN|AIR|ously special +51909|989|92|6|32|60479.36|0.08|0.03|N|O|1996-04-13|1996-06-08|1996-04-16|COLLECT COD|FOB|cial dugouts about the quickly final asym +51910|834|1|1|12|20817.96|0.01|0.04|N|O|1995-07-22|1995-08-13|1995-07-25|TAKE BACK RETURN|FOB|ilent accounts. car +51910|793|94|2|25|42344.75|0.09|0.02|N|O|1995-08-19|1995-07-04|1995-09-16|TAKE BACK RETURN|REG AIR| wake among the slyly pending +51910|99|25|3|10|9990.90|0.08|0.00|N|O|1995-09-23|1995-08-01|1995-10-08|TAKE BACK RETURN|RAIL|s. thin deposits aft +51910|1124|33|4|46|47155.52|0.05|0.03|N|O|1995-07-08|1995-08-05|1995-07-19|NONE|REG AIR|lar excuses. stealthily regular deposi +51910|1862|6|5|26|45860.36|0.08|0.07|N|O|1995-08-15|1995-08-17|1995-08-31|NONE|FOB|quests. express accounts cajole sly +51910|509|100|6|49|69065.50|0.02|0.02|N|O|1995-07-04|1995-08-18|1995-08-01|COLLECT COD|AIR|y. quickly even ideas +51911|740|37|1|43|70551.82|0.07|0.07|N|O|1997-06-30|1997-04-12|1997-07-22|COLLECT COD|FOB| excuses are. express accounts +51911|1791|92|2|21|35548.59|0.07|0.05|N|O|1997-06-06|1997-05-10|1997-07-06|NONE|SHIP|asymptotes. quickly ironic reque +51911|1155|28|3|33|34852.95|0.02|0.00|N|O|1997-03-19|1997-06-01|1997-04-09|COLLECT COD|REG AIR|lets. unusual accounts cajole above th +51911|998|99|4|27|51272.73|0.01|0.05|N|O|1997-05-02|1997-04-19|1997-05-03|COLLECT COD|RAIL|al instructions. package +51911|1481|21|5|30|41474.40|0.04|0.04|N|O|1997-06-04|1997-04-16|1997-06-08|NONE|MAIL|ng sauternes wake accounts. quickly thin ac +51936|1678|2|1|43|67925.81|0.01|0.02|N|O|1998-11-17|1998-09-07|1998-11-28|DELIVER IN PERSON|REG AIR|bold requests haggle blithely. quick +51937|943|12|1|42|77445.48|0.01|0.08|R|F|1994-04-19|1994-04-20|1994-04-27|DELIVER IN PERSON|RAIL|along the even deposits. pinto beans a +51937|859|60|2|5|8799.25|0.06|0.02|R|F|1994-04-05|1994-05-01|1994-04-27|NONE|RAIL|ular packages. packages nag slyly even +51938|1006|12|1|24|21768.00|0.08|0.06|N|F|1995-05-30|1995-07-29|1995-06-27|COLLECT COD|MAIL|efully platelets. express packages integrat +51938|1189|98|2|38|41426.84|0.10|0.02|N|O|1995-07-05|1995-07-13|1995-07-12|COLLECT COD|REG AIR|ckly. requests +51939|107|86|1|13|13092.30|0.03|0.06|N|O|1996-05-30|1996-03-27|1996-06-20|NONE|AIR|ss deposits boost; fu +51939|24|75|2|34|31416.68|0.05|0.00|N|O|1996-06-02|1996-04-01|1996-06-14|DELIVER IN PERSON|REG AIR|ts haggle fluffily carefully +51940|301|30|1|24|28831.20|0.10|0.02|A|F|1993-01-04|1993-01-07|1993-01-06|NONE|MAIL|ns. slyly eve +51940|700|63|2|40|64028.00|0.07|0.06|R|F|1992-12-24|1993-01-09|1993-01-05|NONE|AIR|. daringly pending requests na +51941|566|57|1|2|2933.12|0.02|0.01|N|O|1996-03-31|1996-03-21|1996-04-01|TAKE BACK RETURN|SHIP|. requests are blithely e +51941|38|14|2|8|7504.24|0.07|0.02|N|O|1996-03-22|1996-03-23|1996-04-09|DELIVER IN PERSON|AIR|ven theodolites sleep slyly pending fray +51941|182|61|3|31|33547.58|0.05|0.02|N|O|1996-04-18|1996-04-07|1996-04-24|TAKE BACK RETURN|TRUCK|lly regular packages throughout the slyly +51941|20|46|4|48|44160.96|0.06|0.05|N|O|1996-03-14|1996-03-14|1996-03-31|TAKE BACK RETURN|RAIL|osits. regular accounts according to +51942|229|30|1|23|25972.06|0.09|0.01|N|O|1997-03-17|1997-05-01|1997-04-04|NONE|AIR| slyly special instructions b +51942|150|51|2|27|28354.05|0.02|0.06|N|O|1997-03-03|1997-05-24|1997-03-18|COLLECT COD|TRUCK|thely pending foxes. carefully un +51942|1354|31|3|49|61512.15|0.05|0.03|N|O|1997-04-26|1997-04-02|1997-05-23|TAKE BACK RETURN|REG AIR|ts. carefully stealthy pinto beans us +51942|1725|52|4|26|42294.72|0.03|0.03|N|O|1997-05-30|1997-05-10|1997-06-12|TAKE BACK RETURN|TRUCK|cial pinto beans nag slyly slyly special d +51942|492|80|5|24|33419.76|0.05|0.07|N|O|1997-05-15|1997-04-13|1997-05-24|TAKE BACK RETURN|FOB|unts. final de +51943|1629|12|1|50|76531.00|0.01|0.02|A|F|1994-07-11|1994-07-18|1994-07-14|NONE|RAIL|ffily special +51943|1278|90|2|6|7075.62|0.02|0.05|R|F|1994-07-25|1994-06-28|1994-08-17|COLLECT COD|REG AIR|nst the carefully even depos +51943|311|40|3|47|56931.57|0.06|0.01|A|F|1994-04-28|1994-06-28|1994-05-26|NONE|REG AIR|e the deposits wake +51968|1556|97|1|1|1457.55|0.07|0.00|R|F|1994-12-14|1994-11-06|1994-12-29|TAKE BACK RETURN|SHIP|etect quickly even packages. quic +51968|176|29|2|49|52732.33|0.09|0.01|R|F|1994-12-22|1994-10-09|1995-01-04|TAKE BACK RETURN|MAIL|affix except the furiously unusual +51969|1873|3|1|27|47921.49|0.00|0.02|N|O|1995-10-11|1995-10-07|1995-11-03|COLLECT COD|AIR|theodolites cajole thinly. final acco +51969|1388|3|2|14|18051.32|0.01|0.04|N|O|1995-12-06|1995-11-09|1995-12-28|TAKE BACK RETURN|RAIL|symptotes unwind quickly f +51969|1437|16|3|44|58890.92|0.01|0.06|N|O|1995-09-20|1995-12-02|1995-10-15|COLLECT COD|RAIL|egular pinto beans x-ray quickly unus +51969|961|64|4|22|40963.12|0.03|0.01|N|O|1995-09-07|1995-10-14|1995-09-11|DELIVER IN PERSON|RAIL|y final accou +51969|1371|10|5|28|35626.36|0.07|0.08|N|O|1995-12-01|1995-11-25|1995-12-22|TAKE BACK RETURN|FOB|deposits across the fluffily even deposit +51969|1002|73|6|27|24381.00|0.10|0.01|N|O|1995-12-08|1995-11-02|1995-12-27|NONE|TRUCK| even accounts boost careful +51969|1285|60|7|39|46264.92|0.02|0.08|N|O|1995-12-06|1995-10-10|1996-01-03|NONE|MAIL|gouts cajole blithely. care +51970|1041|42|1|10|9420.40|0.00|0.06|R|F|1992-01-21|1992-03-26|1992-01-24|DELIVER IN PERSON|MAIL|s thrash blithel +51970|1817|18|2|3|5156.43|0.05|0.03|A|F|1992-01-18|1992-02-19|1992-02-11|DELIVER IN PERSON|REG AIR|y deposits. slyly final ideas are slyly. f +51970|93|19|3|1|993.09|0.06|0.04|A|F|1992-04-09|1992-02-25|1992-05-05|COLLECT COD|AIR|quests. slyly unusual +51970|768|33|4|19|31706.44|0.00|0.08|A|F|1992-04-18|1992-02-23|1992-05-09|NONE|FOB|uctions. fluffily sile +51970|1293|31|5|24|28662.96|0.05|0.04|R|F|1992-02-22|1992-04-06|1992-03-19|TAKE BACK RETURN|FOB|d foxes cajole carefull +51970|605|68|6|16|24089.60|0.10|0.05|A|F|1992-01-19|1992-02-13|1992-01-26|NONE|SHIP|ng dependencies. ruthless +51970|1|77|7|14|12614.00|0.01|0.04|R|F|1992-05-06|1992-03-16|1992-06-04|NONE|MAIL| play blith +51971|190|91|1|31|33795.89|0.09|0.01|N|O|1995-12-16|1995-11-23|1995-12-31|NONE|RAIL|s. fluffily silent id +51971|879|46|2|30|53396.10|0.09|0.04|N|O|1995-12-29|1995-12-05|1996-01-25|COLLECT COD|FOB|ar theodolites a +51971|1898|85|3|35|62996.15|0.03|0.04|N|O|1995-10-05|1995-11-26|1995-10-12|NONE|MAIL|ess requests. carefully bo +51971|581|72|4|19|28150.02|0.08|0.06|N|O|1995-12-07|1995-11-08|1996-01-02|NONE|RAIL| boost along +51971|572|3|5|45|66265.65|0.02|0.01|N|O|1996-01-27|1995-12-05|1996-01-30|NONE|MAIL| deposits haggle carefully unusual deposit +51971|455|43|6|39|52862.55|0.05|0.01|N|O|1995-11-29|1995-12-23|1995-12-17|DELIVER IN PERSON|SHIP|y about the slyly u +51972|683|46|1|46|72849.28|0.08|0.03|N|O|1996-08-17|1996-07-30|1996-08-21|TAKE BACK RETURN|AIR|dependencies after the q +51972|401|31|2|46|59864.40|0.00|0.00|N|O|1996-08-13|1996-07-31|1996-08-17|NONE|TRUCK| along the slyly pending ideas are a +51972|777|42|3|17|28522.09|0.01|0.06|N|O|1996-08-26|1996-08-01|1996-09-05|NONE|AIR| pending pinto beans? enticingly final +51973|148|75|1|1|1048.14|0.05|0.03|N|O|1998-09-12|1998-06-23|1998-10-08|NONE|AIR|yly final account +51973|1223|98|2|49|55086.78|0.07|0.06|N|O|1998-07-30|1998-06-26|1998-08-18|TAKE BACK RETURN|TRUCK| sleep carefully furious +51973|1374|75|3|13|16579.81|0.07|0.08|N|O|1998-07-02|1998-07-14|1998-07-23|TAKE BACK RETURN|SHIP|uffily ironic tithes doze carefully around +51973|1367|44|4|34|43124.24|0.04|0.02|N|O|1998-07-26|1998-06-23|1998-08-16|NONE|RAIL|nto beans acro +51974|1593|94|1|29|43343.11|0.02|0.07|R|F|1995-05-13|1995-04-09|1995-06-11|COLLECT COD|AIR|riously pending dolphins detect stealthil +51974|1982|83|2|40|75359.20|0.01|0.04|A|F|1995-05-09|1995-04-16|1995-05-15|NONE|AIR| even platelets sleep blithely afte +51974|888|22|3|43|76921.84|0.04|0.04|A|F|1995-03-13|1995-03-22|1995-04-04|COLLECT COD|MAIL|lphins. furiously e +51974|1342|19|4|31|38543.54|0.07|0.07|R|F|1995-05-24|1995-04-03|1995-06-11|TAKE BACK RETURN|REG AIR|enly final accounts. ideas along the sil +51974|1220|21|5|11|12333.42|0.07|0.02|A|F|1995-02-08|1995-04-02|1995-02-23|DELIVER IN PERSON|TRUCK| quickly bold de +51975|896|96|1|20|35937.80|0.10|0.01|R|F|1995-01-09|1995-03-15|1995-02-02|TAKE BACK RETURN|REG AIR|inal ideas a +51975|436|24|2|50|66821.50|0.07|0.04|A|F|1995-04-16|1995-02-16|1995-04-29|TAKE BACK RETURN|MAIL|ial accounts. regular, final T +51975|1897|84|3|34|61162.26|0.03|0.02|A|F|1995-04-09|1995-02-15|1995-05-01|TAKE BACK RETURN|TRUCK|kages wake ironic packa +51975|505|66|4|44|61842.00|0.08|0.00|A|F|1994-12-22|1995-02-14|1995-01-07|COLLECT COD|TRUCK|tegrate carefully around the furiously +51975|288|70|5|48|57037.44|0.04|0.01|R|F|1995-02-15|1995-01-31|1995-03-15|NONE|SHIP|along the bli +51975|773|6|6|49|82014.73|0.04|0.08|A|F|1995-03-08|1995-01-23|1995-04-07|NONE|TRUCK|te carefully +51975|612|6|7|25|37815.25|0.03|0.06|A|F|1995-03-15|1995-03-12|1995-04-05|NONE|AIR|g dolphins cajole. pin +52000|1638|39|1|11|16935.93|0.10|0.05|R|F|1993-01-21|1993-01-01|1993-02-05|TAKE BACK RETURN|RAIL|y regular pinto +52000|1733|18|2|39|63754.47|0.08|0.05|R|F|1992-12-31|1992-11-13|1993-01-05|DELIVER IN PERSON|TRUCK|ronic instructions sleep quickl +52000|420|8|3|31|40933.02|0.04|0.02|R|F|1993-01-05|1993-01-02|1993-01-07|COLLECT COD|REG AIR|thely. blithely unusual depo +52000|1539|20|4|38|54740.14|0.01|0.05|R|F|1992-11-05|1992-12-25|1992-12-02|DELIVER IN PERSON|AIR|odolites according to the regular account +52000|1655|38|5|4|6226.60|0.05|0.03|R|F|1993-01-28|1992-12-01|1993-02-18|NONE|REG AIR|quests nag quickly near the even accounts +52001|399|56|1|48|62370.72|0.06|0.00|A|F|1992-11-21|1992-09-18|1992-12-19|DELIVER IN PERSON|AIR|. final, final +52001|40|41|2|13|12220.52|0.06|0.02|A|F|1992-11-30|1992-11-05|1992-12-28|COLLECT COD|RAIL|y around the carefully even a +52001|1734|77|3|41|67064.93|0.04|0.06|A|F|1992-08-11|1992-10-17|1992-08-20|TAKE BACK RETURN|REG AIR|have to eat +52001|363|48|4|28|35374.08|0.06|0.01|A|F|1992-11-21|1992-10-28|1992-12-19|NONE|SHIP|beans cajole accordi +52001|1306|83|5|50|60365.00|0.08|0.02|A|F|1992-10-25|1992-09-26|1992-11-24|NONE|SHIP|thely special instructions. sly +52001|1770|97|6|38|63527.26|0.06|0.08|R|F|1992-08-15|1992-10-24|1992-09-01|DELIVER IN PERSON|MAIL|foxes against the fluffily pendin +52001|1164|65|7|47|50062.52|0.07|0.01|R|F|1992-12-06|1992-09-08|1992-12-14|DELIVER IN PERSON|FOB|packages. express deposits alongs +52002|23|99|1|42|38766.84|0.02|0.03|R|F|1994-07-21|1994-08-28|1994-08-11|COLLECT COD|AIR|special excuses. bold packages wake +52002|603|4|2|33|49618.80|0.03|0.06|R|F|1994-06-19|1994-08-15|1994-07-10|DELIVER IN PERSON|TRUCK|y even dinos. blithely regular escap +52002|1564|65|3|11|16121.16|0.10|0.08|R|F|1994-09-24|1994-07-17|1994-09-25|TAKE BACK RETURN|FOB|posits ought to boost quickly regular pint +52002|692|24|4|41|65300.29|0.00|0.01|R|F|1994-06-23|1994-07-05|1994-07-10|NONE|RAIL| fluffy ideas. bold instructio +52003|817|17|1|14|24049.34|0.04|0.00|A|F|1992-06-05|1992-03-24|1992-06-21|COLLECT COD|MAIL|otes are furiously +52003|1743|70|2|11|18092.14|0.07|0.05|R|F|1992-04-04|1992-04-18|1992-04-07|NONE|REG AIR|rets. packages promise silently regular dep +52004|1432|11|1|50|66671.50|0.03|0.05|N|O|1996-07-31|1996-08-02|1996-08-16|COLLECT COD|RAIL|ns are fluffily e +52005|903|38|1|14|25254.60|0.10|0.00|R|F|1994-01-25|1994-03-20|1994-02-18|DELIVER IN PERSON|AIR|its-- silent, even packages at the ironic +52006|1781|66|1|34|57214.52|0.05|0.05|A|F|1994-08-12|1994-09-15|1994-09-08|TAKE BACK RETURN|REG AIR|ely according to +52006|1001|2|2|46|41492.00|0.09|0.08|R|F|1994-09-03|1994-07-25|1994-09-16|COLLECT COD|REG AIR|totes according to +52006|498|86|3|39|54541.11|0.10|0.01|A|F|1994-07-06|1994-08-28|1994-07-23|TAKE BACK RETURN|SHIP|, special dependencie +52006|368|53|4|36|45660.96|0.04|0.00|R|F|1994-10-17|1994-09-11|1994-11-05|NONE|TRUCK|eans. special, unusual theodolites are +52006|79|80|5|21|20560.47|0.10|0.04|A|F|1994-07-17|1994-09-12|1994-08-04|DELIVER IN PERSON|SHIP|n accounts. regular ideas alon +52007|63|14|1|28|26965.68|0.08|0.05|A|F|1992-05-18|1992-06-09|1992-06-17|COLLECT COD|AIR|lar, regular platelet +52007|974|43|2|22|41249.34|0.06|0.06|A|F|1992-05-09|1992-05-31|1992-05-29|TAKE BACK RETURN|RAIL|. final packag +52007|1860|47|3|28|49332.08|0.10|0.03|R|F|1992-06-28|1992-06-15|1992-07-07|DELIVER IN PERSON|RAIL| regular requests. regular theodolites ar +52007|1665|7|4|5|7833.30|0.08|0.02|R|F|1992-04-23|1992-06-20|1992-05-23|COLLECT COD|REG AIR|egularly bold hoc +52007|726|23|5|30|48801.60|0.05|0.00|R|F|1992-06-09|1992-06-23|1992-07-09|COLLECT COD|RAIL|ans cajole furiously in place of the care +52007|188|41|6|31|33733.58|0.08|0.08|A|F|1992-05-15|1992-05-28|1992-06-01|NONE|TRUCK|use slyly slyly +52007|655|49|7|20|31113.00|0.10|0.03|A|F|1992-07-14|1992-05-21|1992-08-03|TAKE BACK RETURN|MAIL| theodolit +52032|552|83|1|9|13072.95|0.10|0.04|N|O|1997-06-12|1997-06-08|1997-06-28|COLLECT COD|FOB|es sleep. fi +52032|1654|55|2|43|66892.95|0.03|0.06|N|O|1997-06-24|1997-07-31|1997-07-05|COLLECT COD|AIR|sly silent accounts sleep ca +52032|576|77|3|11|16242.27|0.06|0.00|N|O|1997-06-12|1997-08-03|1997-07-04|NONE|SHIP| are. care +52032|71|97|4|14|13594.98|0.08|0.03|N|O|1997-08-22|1997-06-09|1997-08-31|TAKE BACK RETURN|RAIL|uffily bold accounts wake s +52032|1413|14|5|42|55205.22|0.08|0.07|N|O|1997-06-22|1997-07-03|1997-06-24|NONE|RAIL|gle fluffily furio +52033|1056|27|1|19|18183.95|0.01|0.02|N|O|1997-11-13|1997-12-19|1997-12-07|TAKE BACK RETURN|SHIP|nstructions detec +52033|95|71|2|42|41793.78|0.02|0.02|N|O|1998-01-24|1997-12-24|1998-02-14|COLLECT COD|MAIL|oach slyly after the accounts. furiousl +52034|451|39|1|36|48652.20|0.08|0.06|N|O|1996-08-22|1996-07-29|1996-08-27|COLLECT COD|AIR|usly in place of the bli +52034|1748|49|2|36|59390.64|0.10|0.05|N|O|1996-10-13|1996-07-26|1996-10-22|TAKE BACK RETURN|TRUCK|ccounts wake +52034|1383|60|3|26|33393.88|0.04|0.04|N|O|1996-08-23|1996-09-16|1996-09-17|COLLECT COD|SHIP| bold, final excus +52034|1245|83|4|4|4584.96|0.00|0.08|N|O|1996-09-20|1996-08-11|1996-10-09|COLLECT COD|SHIP|eep among the fluffily ir +52034|600|91|5|16|24009.60|0.07|0.02|N|O|1996-07-13|1996-08-08|1996-08-11|TAKE BACK RETURN|SHIP|al theodoli +52034|1589|90|6|34|50679.72|0.01|0.05|N|O|1996-10-12|1996-08-12|1996-11-10|NONE|RAIL|ep blithely above the fluffy dolphins. quic +52034|1934|35|7|2|3671.86|0.04|0.00|N|O|1996-09-04|1996-07-26|1996-09-26|NONE|RAIL|lites haggle quickly iron +52035|1430|31|1|27|35948.61|0.00|0.07|A|F|1995-02-15|1995-01-01|1995-02-24|DELIVER IN PERSON|RAIL|cording to the blithely +52036|826|26|1|28|48350.96|0.07|0.01|N|O|1998-07-08|1998-07-21|1998-08-01|COLLECT COD|SHIP|old tithes. q +52036|107|60|2|46|46326.60|0.04|0.07|N|O|1998-06-17|1998-08-08|1998-07-15|COLLECT COD|MAIL|requests about th +52036|489|48|3|36|50021.28|0.06|0.00|N|O|1998-09-28|1998-08-19|1998-10-04|TAKE BACK RETURN|AIR|resias. fluffily pending r +52036|777|78|4|27|45299.79|0.07|0.02|N|O|1998-09-18|1998-09-04|1998-09-20|NONE|MAIL|ular accounts doubt carefully even pl +52036|1643|67|5|19|29348.16|0.06|0.06|N|O|1998-09-14|1998-07-27|1998-10-06|TAKE BACK RETURN|REG AIR|s pinto beans sle +52036|1297|98|6|22|26362.38|0.09|0.02|N|O|1998-07-17|1998-08-23|1998-07-24|DELIVER IN PERSON|MAIL|kly ironic accounts. +52036|1803|4|7|5|8524.00|0.10|0.00|N|O|1998-06-18|1998-08-13|1998-06-27|NONE|SHIP|olites along the carefully regular accou +52037|1859|46|1|35|61629.75|0.01|0.05|N|O|1996-10-23|1996-09-23|1996-11-03|DELIVER IN PERSON|FOB|ns haggle ironic foxes? thinly ev +52038|1316|93|1|40|48692.40|0.09|0.04|N|O|1996-10-20|1996-09-13|1996-10-31|NONE|SHIP|tructions. regular instruction +52038|1735|36|2|37|60559.01|0.09|0.07|N|O|1996-07-21|1996-09-24|1996-08-16|NONE|MAIL|cial theodolites integrat +52038|1018|89|3|34|31246.34|0.03|0.03|N|O|1996-08-12|1996-09-08|1996-09-11|DELIVER IN PERSON|MAIL|onic requests hag +52038|17|43|4|24|22008.24|0.08|0.05|N|O|1996-10-20|1996-09-26|1996-10-26|COLLECT COD|TRUCK|ecial packages cajole +52038|240|95|5|23|26225.52|0.00|0.00|N|O|1996-09-29|1996-09-03|1996-10-14|COLLECT COD|MAIL|nstructions +52039|470|29|1|20|27409.40|0.09|0.06|A|F|1992-09-02|1992-10-07|1992-09-26|NONE|REG AIR|mong the packages. +52039|1886|87|2|22|39333.36|0.04|0.03|R|F|1992-10-27|1992-10-12|1992-11-12|TAKE BACK RETURN|REG AIR|ctions kindle +52039|208|90|3|1|1108.20|0.03|0.02|A|F|1992-08-25|1992-09-22|1992-09-20|DELIVER IN PERSON|MAIL|final instruction +52039|1499|100|4|26|36412.74|0.08|0.07|A|F|1992-11-21|1992-09-14|1992-12-14|DELIVER IN PERSON|RAIL|lithely special re +52039|487|17|5|46|63824.08|0.10|0.03|R|F|1992-11-05|1992-10-24|1992-12-03|NONE|TRUCK|ily pending requests-- slyly final dolph +52039|651|14|6|42|65169.30|0.00|0.06|R|F|1992-08-08|1992-10-12|1992-09-05|DELIVER IN PERSON|RAIL| blithely unusual foxes about the quick +52064|850|50|1|5|8754.25|0.08|0.03|N|O|1997-10-08|1997-11-10|1997-11-05|COLLECT COD|AIR|yly slowly regular platelets. ideas boo +52064|568|99|2|1|1468.56|0.00|0.04|N|O|1997-08-27|1997-10-08|1997-09-23|COLLECT COD|SHIP|sual accounts. carefull +52065|221|76|1|22|24666.84|0.10|0.00|N|O|1996-07-18|1996-06-20|1996-08-02|DELIVER IN PERSON|MAIL|inal frays +52065|1987|88|2|20|37779.60|0.01|0.08|N|O|1996-05-08|1996-05-30|1996-05-19|NONE|FOB|pecial dependencies across the bl +52065|1350|27|3|7|8759.45|0.02|0.05|N|O|1996-06-14|1996-06-01|1996-06-30|TAKE BACK RETURN|AIR|uriously unusual fox +52066|1286|61|1|31|36805.68|0.09|0.01|N|O|1996-06-26|1996-08-12|1996-06-28|NONE|RAIL| was fluffily. +52067|272|54|1|38|44546.26|0.00|0.01|N|O|1998-08-01|1998-07-27|1998-08-31|TAKE BACK RETURN|FOB|dencies breach fu +52067|740|41|2|32|52503.68|0.07|0.05|N|O|1998-09-28|1998-09-14|1998-10-13|NONE|AIR|aring, final accounts +52067|1417|18|3|50|65920.50|0.03|0.01|N|O|1998-08-14|1998-08-03|1998-08-31|COLLECT COD|SHIP|above the slyly +52067|685|48|4|33|52327.44|0.04|0.02|N|O|1998-10-04|1998-08-09|1998-10-18|COLLECT COD|SHIP| print asymptotes. pending, regu +52068|30|31|1|21|19530.63|0.06|0.00|R|F|1992-03-26|1992-04-07|1992-04-03|NONE|RAIL|, bold deposits. +52068|720|85|2|24|38897.28|0.08|0.03|R|F|1992-03-28|1992-03-25|1992-04-08|TAKE BACK RETURN|RAIL|ffy, final +52068|173|100|3|15|16097.55|0.02|0.06|R|F|1992-03-22|1992-03-07|1992-03-23|DELIVER IN PERSON|SHIP| slyly final foxes. ironic, +52068|1910|11|4|19|34426.29|0.04|0.05|R|F|1992-02-22|1992-03-14|1992-02-28|DELIVER IN PERSON|REG AIR|es after the carefully fi +52068|632|26|5|28|42913.64|0.10|0.01|R|F|1992-04-24|1992-03-31|1992-05-12|COLLECT COD|RAIL|tes sleep furiously ac +52068|1366|67|6|19|24079.84|0.06|0.03|R|F|1992-04-30|1992-04-12|1992-05-10|TAKE BACK RETURN|REG AIR|pecial ideas are. bu +52069|1998|31|1|13|24699.87|0.01|0.06|N|O|1998-05-31|1998-05-12|1998-06-23|COLLECT COD|REG AIR|refully regular waters. grouches +52070|11|62|1|35|31885.35|0.10|0.05|A|F|1995-03-07|1995-01-14|1995-04-05|COLLECT COD|TRUCK|nal, regular accounts. slyly +52070|1959|48|2|4|7443.80|0.04|0.04|R|F|1995-03-23|1995-01-11|1995-03-24|NONE|AIR|n the carefully silent foxes might are ar +52071|998|1|1|4|7595.96|0.09|0.02|N|O|1995-12-21|1996-02-23|1996-01-18|DELIVER IN PERSON|AIR|s. final deposits use among the bold, final +52071|511|42|2|33|46579.83|0.04|0.00|N|O|1996-02-13|1996-02-24|1996-03-13|TAKE BACK RETURN|FOB|orses maintain fluffily abo +52071|369|26|3|47|59659.92|0.06|0.08|N|O|1996-01-20|1996-02-17|1996-02-09|TAKE BACK RETURN|FOB|riously final d +52071|1697|21|4|50|79934.50|0.05|0.05|N|O|1996-03-03|1996-01-29|1996-03-19|COLLECT COD|SHIP|atelets should have to nod. s +52071|250|32|5|24|27606.00|0.10|0.04|N|O|1996-03-03|1996-01-26|1996-03-06|TAKE BACK RETURN|MAIL| even Tiresias ea +52071|1633|57|6|41|62919.83|0.07|0.04|N|O|1996-01-08|1996-01-27|1996-01-22|NONE|AIR|y even requests across the unusual, +52096|1846|47|1|50|87392.00|0.09|0.02|N|O|1995-12-27|1996-01-31|1996-01-09|DELIVER IN PERSON|TRUCK|cross the quickly unusual pinto beans +52096|879|13|2|19|33817.53|0.01|0.02|N|O|1996-01-11|1996-01-22|1996-01-30|TAKE BACK RETURN|AIR|lar requests haggl +52097|1139|48|1|41|42645.33|0.04|0.06|N|O|1997-08-24|1997-07-12|1997-09-05|NONE|SHIP|eodolites. special pinto beans engage bli +52097|616|17|2|47|71280.67|0.03|0.00|N|O|1997-07-30|1997-08-08|1997-08-03|DELIVER IN PERSON|TRUCK|-- ironic i +52097|1574|95|3|10|14755.70|0.02|0.05|N|O|1997-08-13|1997-06-25|1997-08-18|DELIVER IN PERSON|REG AIR|s-- daring accounts lose +52097|514|75|4|37|52336.87|0.10|0.03|N|O|1997-08-30|1997-08-08|1997-09-02|COLLECT COD|FOB|pending requests wak +52098|1308|23|1|26|31441.80|0.00|0.01|R|F|1993-06-27|1993-04-14|1993-07-24|COLLECT COD|FOB|nts. special excuses ha +52099|1690|14|1|48|76401.12|0.09|0.02|N|O|1996-05-31|1996-05-13|1996-06-08|TAKE BACK RETURN|MAIL|ans. furiously final deposits wake blit +52099|1145|46|2|9|9415.26|0.08|0.03|N|O|1996-05-11|1996-05-14|1996-05-29|TAKE BACK RETURN|RAIL|carefully after the pending packages. +52100|1767|68|1|42|70087.92|0.05|0.03|N|O|1997-10-02|1997-11-20|1997-10-26|TAKE BACK RETURN|FOB|ld packages. carefully ironic acco +52100|421|80|2|3|3964.26|0.09|0.07|N|O|1997-11-05|1997-11-02|1997-11-21|NONE|TRUCK| the furiously special deposits. fin +52100|1369|84|3|39|49544.04|0.03|0.08|N|O|1998-01-20|1997-12-15|1998-01-22|DELIVER IN PERSON|RAIL|ent, unusual escapades nag sly +52101|1766|51|1|28|46697.28|0.08|0.02|N|O|1998-03-22|1998-03-16|1998-04-12|COLLECT COD|RAIL|blithely final foxes; car +52101|628|91|2|34|51973.08|0.04|0.01|N|O|1998-03-05|1998-04-23|1998-03-09|COLLECT COD|MAIL|tainments wake +52101|147|100|3|8|8377.12|0.00|0.04|N|O|1998-02-14|1998-04-07|1998-02-17|TAKE BACK RETURN|AIR|s. dugouts wake fluffily. slyly regular +52101|1950|83|4|1|1851.95|0.10|0.03|N|O|1998-02-20|1998-02-28|1998-03-02|NONE|RAIL| ironic acc +52102|1014|20|1|22|20130.22|0.07|0.01|R|F|1993-10-08|1993-12-09|1993-10-23|TAKE BACK RETURN|MAIL| accounts sleep never across t +52102|1669|11|2|26|40837.16|0.10|0.07|A|F|1993-10-14|1993-10-24|1993-10-18|COLLECT COD|TRUCK|ruthless theodolites. special requests aff +52102|1421|39|3|42|55541.64|0.01|0.05|A|F|1993-11-29|1993-10-31|1993-12-17|TAKE BACK RETURN|SHIP|ly silent requests. deposits are carefully +52103|3|29|1|12|10836.00|0.03|0.08|R|F|1995-04-07|1995-03-08|1995-05-07|DELIVER IN PERSON|TRUCK|ges run sl +52103|1879|66|2|3|5342.61|0.06|0.01|R|F|1995-03-13|1995-03-04|1995-03-28|DELIVER IN PERSON|MAIL| regular grou +52128|90|66|1|15|14851.35|0.07|0.01|A|F|1994-01-06|1994-02-19|1994-01-14|NONE|TRUCK|tructions run quickly fur +52128|1110|11|2|37|37411.07|0.08|0.06|A|F|1993-12-21|1994-01-03|1994-01-19|COLLECT COD|FOB|riously regu +52128|344|45|3|29|36085.86|0.05|0.07|R|F|1994-01-25|1994-02-04|1994-02-16|DELIVER IN PERSON|RAIL|lyly silent p +52128|1679|62|4|1|1580.67|0.03|0.05|R|F|1994-01-23|1994-02-16|1994-01-24|TAKE BACK RETURN|MAIL|es! bold dolphins sleep after the pen +52129|491|92|1|46|64008.54|0.06|0.04|N|O|1996-11-11|1996-12-13|1996-11-17|TAKE BACK RETURN|FOB|kly ironic dependencies. +52129|945|48|2|9|16613.46|0.06|0.03|N|O|1997-03-03|1997-01-24|1997-03-13|COLLECT COD|SHIP|ts: slyly regular deposits bo +52129|1857|58|3|19|33418.15|0.09|0.04|N|O|1997-02-14|1996-12-30|1997-03-15|COLLECT COD|MAIL| blithely regular acc +52129|1859|89|4|8|14086.80|0.01|0.04|N|O|1997-02-02|1996-12-31|1997-02-07|TAKE BACK RETURN|AIR|ular requests. carefully final platel +52129|1973|18|5|9|16874.73|0.01|0.03|N|O|1996-11-27|1996-12-18|1996-12-27|NONE|MAIL|uses haggle enticing +52129|1258|59|6|31|35936.75|0.03|0.07|N|O|1996-11-24|1997-02-02|1996-11-30|TAKE BACK RETURN|FOB|y unusual asymptotes? furiously expr +52130|1768|11|1|40|66790.40|0.07|0.04|A|F|1993-01-01|1992-11-02|1993-01-20|COLLECT COD|SHIP|gular accounts. blithely sp +52130|236|64|2|32|36359.36|0.03|0.08|A|F|1992-11-07|1992-10-27|1992-11-15|NONE|SHIP|sts boost blithely slyly eve +52130|1695|96|3|5|7983.45|0.06|0.06|A|F|1992-11-09|1992-11-28|1992-12-06|NONE|REG AIR|. ironic, permanent packages sublate slyly +52130|843|43|4|39|68009.76|0.00|0.05|A|F|1992-09-30|1992-11-22|1992-10-12|TAKE BACK RETURN|MAIL|carefully final depos +52130|981|84|5|45|84689.10|0.09|0.02|A|F|1992-10-23|1992-11-13|1992-10-26|NONE|REG AIR|counts are-- deposit +52130|1109|18|6|47|47474.70|0.06|0.05|R|F|1992-12-26|1992-12-05|1993-01-04|TAKE BACK RETURN|REG AIR|riously pending ideas: stealthily +52131|1176|77|1|35|37700.95|0.10|0.08|N|O|1998-03-03|1997-12-24|1998-03-15|NONE|AIR|es sleep quickly. furiously close d +52131|1278|16|2|29|34198.83|0.09|0.08|N|O|1998-02-14|1997-12-29|1998-03-01|TAKE BACK RETURN|TRUCK|xpress theodolit +52131|80|31|3|7|6860.56|0.05|0.03|N|O|1998-03-09|1998-01-30|1998-03-24|DELIVER IN PERSON|AIR|nd the furiously regular pains. furiously i +52132|762|95|1|10|16627.60|0.06|0.03|N|F|1995-06-01|1995-06-05|1995-06-23|COLLECT COD|REG AIR|blithely bold p +52132|1775|2|2|25|41919.25|0.02|0.05|N|O|1995-07-02|1995-06-17|1995-07-15|TAKE BACK RETURN|REG AIR|the blithely pending foxes wak +52133|1729|14|1|13|21199.36|0.07|0.04|N|O|1998-02-01|1998-02-17|1998-02-13|DELIVER IN PERSON|MAIL|ys unusual accounts boost blithely across t +52133|1149|86|2|16|16802.24|0.00|0.04|N|O|1998-01-31|1998-04-04|1998-02-14|NONE|FOB|ously according to the blithely bo +52133|861|62|3|28|49332.08|0.10|0.02|N|O|1998-05-16|1998-02-27|1998-06-11|DELIVER IN PERSON|SHIP| foxes sleep q +52133|1060|61|4|49|47091.94|0.05|0.02|N|O|1998-03-20|1998-02-26|1998-03-28|DELIVER IN PERSON|SHIP|silent request +52133|652|53|5|13|20184.45|0.00|0.05|N|O|1998-03-23|1998-03-02|1998-04-22|NONE|REG AIR|ns are furiously idle r +52134|1343|20|1|7|8710.38|0.10|0.05|R|F|1994-07-11|1994-07-01|1994-08-09|COLLECT COD|SHIP| across the decoys +52134|1061|97|2|2|1924.12|0.08|0.04|A|F|1994-05-21|1994-05-22|1994-06-09|NONE|AIR| the quickly final ideas +52134|1788|73|3|50|84489.00|0.00|0.08|R|F|1994-06-04|1994-06-01|1994-06-18|NONE|AIR|s thrash a +52134|1397|98|4|17|22072.63|0.00|0.02|R|F|1994-06-19|1994-07-06|1994-06-25|TAKE BACK RETURN|SHIP| waters integrate slyl +52134|692|55|5|15|23890.35|0.06|0.00|R|F|1994-07-19|1994-07-11|1994-08-12|DELIVER IN PERSON|FOB|s affix. fu +52134|426|56|6|12|15917.04|0.07|0.03|R|F|1994-05-07|1994-06-09|1994-05-25|NONE|FOB|al packages eat. final accounts +52134|537|38|7|6|8625.18|0.05|0.07|R|F|1994-08-04|1994-05-31|1994-08-20|COLLECT COD|SHIP|nts cajole blithely pending do +52135|1359|74|1|25|31508.75|0.10|0.03|R|F|1993-06-22|1993-05-21|1993-07-14|TAKE BACK RETURN|SHIP|nt foxes-- furiously regular instructio +52135|1775|60|2|24|40242.48|0.00|0.06|A|F|1993-06-29|1993-06-09|1993-07-22|TAKE BACK RETURN|REG AIR|l, ironic theodolites detec +52135|479|38|3|19|26209.93|0.01|0.05|A|F|1993-07-17|1993-05-03|1993-07-18|COLLECT COD|AIR|according to th +52135|345|74|4|34|42341.56|0.05|0.06|A|F|1993-05-12|1993-06-10|1993-05-20|NONE|AIR| requests cajole quickly express accou +52135|1725|10|5|33|53681.76|0.08|0.08|R|F|1993-06-15|1993-04-24|1993-07-07|COLLECT COD|MAIL| along the furiously bol +52135|423|82|6|42|55583.64|0.00|0.02|R|F|1993-06-03|1993-06-20|1993-07-02|NONE|RAIL|ackages. fluffily even cou +52160|715|16|1|12|19388.52|0.01|0.05|N|O|1995-09-30|1995-08-30|1995-10-04|NONE|TRUCK|he requests. instructions use boldly b +52160|275|57|2|7|8226.89|0.04|0.08|N|O|1995-10-05|1995-08-11|1995-10-14|DELIVER IN PERSON|SHIP|tructions haggle. sometimes regular frays t +52160|1696|97|3|30|47930.70|0.03|0.00|N|O|1995-07-26|1995-09-20|1995-08-22|NONE|SHIP|ss the express, final +52160|1294|32|4|3|3585.87|0.02|0.05|N|O|1995-07-09|1995-09-22|1995-08-02|DELIVER IN PERSON|FOB|en asymptotes. ironic multiplie +52160|448|36|5|13|17529.72|0.10|0.00|N|O|1995-08-27|1995-08-30|1995-09-09|DELIVER IN PERSON|FOB|onic deposits cajole furiousl +52160|1616|58|6|10|15176.10|0.05|0.00|N|O|1995-10-12|1995-09-10|1995-10-30|COLLECT COD|FOB|its use pe +52160|1850|37|7|2|3503.70|0.03|0.03|N|O|1995-09-26|1995-09-15|1995-10-15|TAKE BACK RETURN|SHIP|unusual instructio +52161|574|5|1|8|11796.56|0.08|0.05|N|O|1997-11-24|1997-11-01|1997-12-17|TAKE BACK RETURN|FOB|l instructions +52161|1447|65|2|5|6742.20|0.03|0.05|N|O|1997-11-11|1997-11-06|1997-12-01|NONE|MAIL|y. carefully express excuses +52161|1360|99|3|34|42886.24|0.07|0.01|N|O|1997-12-22|1997-12-01|1998-01-17|NONE|FOB|ular instructions boost blithely about +52161|1851|95|4|17|29798.45|0.00|0.07|N|O|1997-11-05|1997-11-18|1997-11-14|COLLECT COD|FOB|ajole quickly carefully si +52161|528|59|5|16|22856.32|0.06|0.02|N|O|1997-11-30|1997-12-07|1997-12-04|COLLECT COD|MAIL|cing packages are furiously. f +52161|674|75|6|34|53538.78|0.02|0.05|N|O|1998-01-28|1997-11-30|1998-02-18|COLLECT COD|FOB|y among the packages. +52162|269|70|1|20|23385.20|0.07|0.02|N|O|1995-11-15|1995-12-23|1995-11-16|TAKE BACK RETURN|MAIL|y express depe +52162|544|45|2|21|30335.34|0.03|0.04|N|O|1995-12-08|1995-12-04|1995-12-25|COLLECT COD|TRUCK|ely ironic d +52162|35|36|3|7|6545.21|0.09|0.00|N|O|1996-01-25|1996-01-26|1996-02-17|COLLECT COD|RAIL|r instructions. +52162|835|35|4|34|59018.22|0.01|0.08|N|O|1995-11-26|1996-01-13|1995-12-05|TAKE BACK RETURN|REG AIR|ckages. special packages are. unusual p +52162|1629|71|5|41|62755.42|0.07|0.00|N|O|1996-01-13|1996-01-22|1996-02-09|TAKE BACK RETURN|AIR|ic braids +52162|857|57|6|3|5273.55|0.08|0.06|N|O|1995-12-24|1996-01-10|1996-01-05|DELIVER IN PERSON|AIR|ges wake acco +52162|1812|42|7|12|20565.72|0.00|0.00|N|O|1995-11-07|1995-12-18|1995-11-30|NONE|RAIL| lose blithely among the careful +52163|1688|89|1|4|6358.72|0.06|0.04|N|O|1997-08-17|1997-09-08|1997-08-19|DELIVER IN PERSON|RAIL|doubt furiously except the express, ironic +52164|335|20|1|15|18529.95|0.02|0.05|A|F|1992-06-06|1992-05-29|1992-06-10|COLLECT COD|RAIL|nts. unusual excuses cajole carefully about +52164|6|7|2|50|45300.00|0.01|0.03|R|F|1992-04-19|1992-06-28|1992-05-17|NONE|REG AIR|le quickly. slyly final pinto beans +52165|1827|57|1|33|57051.06|0.09|0.06|N|O|1998-07-31|1998-07-16|1998-08-03|TAKE BACK RETURN|AIR|he furiously ironic requests. reg +52165|1070|76|2|40|38842.80|0.00|0.04|N|O|1998-06-14|1998-08-17|1998-06-23|DELIVER IN PERSON|MAIL|lyly final depe +52165|1149|86|3|41|43055.74|0.05|0.02|N|O|1998-09-08|1998-08-13|1998-09-15|NONE|FOB|de of the furiously even packages-- bl +52165|175|76|4|15|16127.55|0.10|0.07|N|O|1998-08-09|1998-07-09|1998-08-23|COLLECT COD|AIR|furiously silent deposits +52165|423|11|5|22|29115.24|0.06|0.05|N|O|1998-06-23|1998-08-21|1998-07-20|TAKE BACK RETURN|SHIP|ual somas. furiously regul +52165|1866|10|6|8|14142.88|0.06|0.02|N|O|1998-06-06|1998-06-29|1998-06-07|COLLECT COD|FOB| regular instruct +52165|1627|69|7|28|42801.36|0.00|0.07|N|O|1998-09-16|1998-06-25|1998-09-18|NONE|FOB|sits wake. requests wake +52166|6|57|1|8|7248.00|0.02|0.05|N|O|1996-02-07|1996-03-14|1996-02-13|DELIVER IN PERSON|TRUCK|g furiously doggedly +52167|247|48|1|29|33269.96|0.04|0.03|N|O|1998-10-03|1998-09-10|1998-10-16|TAKE BACK RETURN|MAIL|ts are enticingly. stealthily slow +52167|18|44|2|22|20196.22|0.09|0.04|N|O|1998-08-03|1998-08-23|1998-08-08|TAKE BACK RETURN|TRUCK|ess deposits eat blithely. brave +52167|1646|70|3|50|77382.00|0.02|0.03|N|O|1998-11-08|1998-09-05|1998-11-14|DELIVER IN PERSON|TRUCK|e regularly furiously even ideas +52167|756|89|4|42|69583.50|0.10|0.07|N|O|1998-08-16|1998-08-31|1998-08-21|TAKE BACK RETURN|REG AIR|silent, final reque +52167|1070|41|5|31|30103.17|0.00|0.08|N|O|1998-11-01|1998-08-15|1998-11-17|COLLECT COD|MAIL|ckly ironic idea +52167|138|65|6|7|7266.91|0.04|0.05|N|O|1998-09-01|1998-08-10|1998-09-09|DELIVER IN PERSON|MAIL|ts play evenly am +52192|1561|2|1|30|43876.80|0.01|0.08|N|O|1998-10-04|1998-07-17|1998-10-21|COLLECT COD|MAIL|g platelets. furiously blithe accounts wak +52192|1200|1|2|33|36339.60|0.06|0.05|N|O|1998-08-01|1998-08-31|1998-08-03|NONE|FOB|g packages are bold, +52192|340|25|3|6|7442.04|0.09|0.06|N|O|1998-06-22|1998-07-26|1998-07-09|TAKE BACK RETURN|RAIL|. blithely express theodolites wake. furio +52192|1340|41|4|22|27309.48|0.02|0.03|N|O|1998-08-23|1998-08-22|1998-08-29|TAKE BACK RETURN|SHIP|packages. waters cajole. slyly r +52192|1015|51|5|39|35724.39|0.02|0.04|N|O|1998-06-28|1998-08-14|1998-07-25|DELIVER IN PERSON|AIR|ly among the regular acco +52192|26|77|6|8|7408.16|0.05|0.02|N|O|1998-10-11|1998-08-02|1998-10-22|COLLECT COD|TRUCK|excuses dete +52192|1601|2|7|3|4507.80|0.08|0.04|N|O|1998-07-04|1998-07-21|1998-07-30|NONE|FOB|nic platelets detect. even packag +52193|292|74|1|6|7153.74|0.06|0.08|R|F|1993-03-26|1993-05-11|1993-04-19|NONE|REG AIR|long the furiously ironic +52193|1938|83|2|6|11039.58|0.06|0.03|R|F|1993-06-04|1993-05-25|1993-06-12|NONE|MAIL|ole blithely against t +52193|183|36|3|20|21663.60|0.04|0.05|R|F|1993-06-30|1993-05-15|1993-07-13|NONE|SHIP|carefully even requests. real +52193|1274|49|4|42|49361.34|0.02|0.08|A|F|1993-03-31|1993-05-21|1993-04-23|TAKE BACK RETURN|SHIP| notornis wake car +52193|529|30|5|6|8577.12|0.06|0.02|R|F|1993-03-07|1993-04-29|1993-03-28|COLLECT COD|MAIL| the quiet id +52193|471|30|6|48|65830.56|0.04|0.03|R|F|1993-04-10|1993-04-20|1993-05-09|TAKE BACK RETURN|RAIL|ecial pains haggle slyly carefull +52193|1289|27|7|28|33327.84|0.10|0.05|A|F|1993-04-16|1993-04-17|1993-04-26|NONE|REG AIR|y final foxes-- +52194|1297|72|1|12|14379.48|0.03|0.06|A|F|1994-04-09|1994-01-29|1994-04-17|DELIVER IN PERSON|TRUCK|thely special theodolites boost expr +52194|151|4|2|35|36790.25|0.07|0.07|A|F|1994-02-16|1994-01-28|1994-02-26|COLLECT COD|TRUCK|ven ideas. unusual escapades are i +52194|869|70|3|29|51325.94|0.09|0.07|A|F|1994-03-02|1994-02-01|1994-03-24|DELIVER IN PERSON|REG AIR|s. even, special requests boos +52194|1691|33|4|5|7963.45|0.03|0.02|R|F|1994-03-01|1994-02-28|1994-03-14|NONE|FOB|luffily furiously bold requests. +52194|552|13|5|16|23240.80|0.10|0.07|A|F|1994-03-06|1994-02-25|1994-03-16|COLLECT COD|TRUCK| requests haggle fur +52194|1272|73|6|40|46930.80|0.02|0.00|R|F|1994-02-27|1994-02-04|1994-03-13|TAKE BACK RETURN|MAIL|e slyly after the final +52195|955|90|1|42|77949.90|0.10|0.05|N|O|1995-12-30|1995-12-21|1996-01-01|NONE|TRUCK|gular packages believe aft +52195|1932|33|2|48|88028.64|0.10|0.00|N|O|1996-02-10|1995-12-10|1996-03-11|NONE|SHIP|al, regular ideas. ironi +52195|158|59|3|39|41267.85|0.06|0.03|N|O|1995-11-09|1995-12-17|1995-11-26|NONE|REG AIR|lly quickly spe +52195|785|82|4|39|65745.42|0.08|0.00|N|O|1996-01-25|1995-12-09|1996-02-12|COLLECT COD|TRUCK|requests! furiously ironic +52195|1462|41|5|42|57265.32|0.06|0.06|N|O|1995-12-16|1995-11-28|1995-12-31|COLLECT COD|AIR|y, bold dolphins nag fluffy deposits. pi +52196|1782|9|1|46|77453.88|0.00|0.03|R|F|1993-03-13|1993-03-13|1993-04-10|COLLECT COD|RAIL|ide of the ironic accounts. regular acco +52196|364|65|2|9|11379.24|0.06|0.03|A|F|1993-05-18|1993-04-19|1993-06-08|TAKE BACK RETURN|FOB|cording to the furiously fin +52196|485|44|3|28|38793.44|0.09|0.01|R|F|1993-05-26|1993-03-12|1993-06-23|NONE|AIR|ess, pending req +52197|1787|72|1|20|33775.60|0.00|0.08|A|F|1992-10-01|1992-09-14|1992-10-08|NONE|TRUCK|ackages wake car +52197|1553|94|2|41|59636.55|0.08|0.07|R|F|1992-11-06|1992-11-02|1992-11-19|COLLECT COD|TRUCK| use fluffily around the f +52197|1379|56|3|31|39691.47|0.02|0.04|A|F|1992-09-11|1992-10-25|1992-09-19|NONE|RAIL|of the quickly ironic id +52197|157|58|4|1|1057.15|0.10|0.03|A|F|1992-11-20|1992-10-07|1992-12-14|NONE|AIR| ironic theodolites along the +52197|1229|30|5|14|15823.08|0.01|0.08|A|F|1992-10-29|1992-10-19|1992-11-19|COLLECT COD|REG AIR|lar deposits sleep quickly +52198|1625|49|1|6|9159.72|0.04|0.00|N|O|1996-06-03|1996-08-01|1996-06-24|NONE|SHIP| quickly regular courts. final foxes ca +52198|498|99|2|15|20977.35|0.10|0.08|N|O|1996-08-19|1996-08-11|1996-08-30|DELIVER IN PERSON|SHIP|ns cajole fur +52198|1617|18|3|47|71374.67|0.01|0.07|N|O|1996-08-18|1996-07-09|1996-09-05|COLLECT COD|TRUCK|ecial gifts +52198|188|15|4|48|52232.64|0.04|0.00|N|O|1996-07-06|1996-07-29|1996-07-20|NONE|REG AIR|lets. furiousl +52198|309|10|5|42|50790.60|0.06|0.04|N|O|1996-06-12|1996-08-10|1996-06-17|DELIVER IN PERSON|TRUCK|Tiresias sleep carefully alongside +52198|921|90|6|44|80164.48|0.09|0.00|N|O|1996-07-31|1996-07-19|1996-08-05|DELIVER IN PERSON|FOB|ng the carefully regular theo +52198|1342|81|7|45|55950.30|0.06|0.01|N|O|1996-08-10|1996-07-13|1996-09-02|DELIVER IN PERSON|RAIL|ly unusual p +52199|454|55|1|38|51469.10|0.05|0.03|A|F|1995-04-06|1995-04-04|1995-04-12|COLLECT COD|AIR|deposits wake blithely even +52199|1483|84|2|4|5537.92|0.10|0.07|A|F|1995-05-07|1995-03-27|1995-05-26|DELIVER IN PERSON|REG AIR| fluffily ironic requests. quickly iron +52199|1294|32|3|11|13148.19|0.08|0.07|R|F|1995-04-30|1995-02-27|1995-05-29|TAKE BACK RETURN|RAIL|lyly pending requests slee +52224|1319|34|1|10|12203.10|0.10|0.08|N|O|1997-07-08|1997-07-20|1997-07-18|TAKE BACK RETURN|REG AIR|ts. furiously unusual requests are +52225|1107|16|1|1|1008.10|0.09|0.08|R|F|1992-07-01|1992-05-23|1992-07-14|TAKE BACK RETURN|RAIL|quickly slyly regul +52225|317|18|2|24|29215.44|0.05|0.06|R|F|1992-07-20|1992-06-02|1992-07-26|TAKE BACK RETURN|TRUCK|deposits. furiously final packages against +52225|245|46|3|23|26340.52|0.09|0.07|A|F|1992-06-09|1992-06-21|1992-06-30|DELIVER IN PERSON|REG AIR|rding to the furi +52225|1516|37|4|8|11340.08|0.00|0.02|R|F|1992-07-30|1992-06-21|1992-08-06|NONE|TRUCK|ronic packages. pinto beans sleep. care +52225|1989|22|5|49|92658.02|0.07|0.06|R|F|1992-06-11|1992-06-12|1992-07-04|TAKE BACK RETURN|TRUCK|fily regular excuses sleep carefully. sp +52226|935|38|1|29|53241.97|0.08|0.00|R|F|1995-03-01|1995-01-15|1995-03-16|COLLECT COD|AIR|he slyly specia +52226|1855|99|2|3|5270.55|0.07|0.02|R|F|1995-02-19|1994-12-03|1995-03-17|NONE|RAIL|ly final platel +52227|1231|43|1|28|31702.44|0.05|0.06|A|F|1994-04-02|1994-04-16|1994-04-20|COLLECT COD|TRUCK|use. fluffily regular platelets nag slyly a +52227|1716|17|2|7|11323.97|0.05|0.04|R|F|1994-04-21|1994-04-25|1994-04-29|DELIVER IN PERSON|SHIP| the blithely regular instructions. bol +52227|1425|43|3|36|47751.12|0.01|0.05|A|F|1994-04-07|1994-04-21|1994-04-24|DELIVER IN PERSON|TRUCK|kages should have to doubt carefully eve +52227|1849|36|4|2|3501.68|0.00|0.07|A|F|1994-02-22|1994-03-20|1994-03-03|NONE|RAIL|en, final ideas boost slyly after the pend +52227|1841|42|5|47|81913.48|0.06|0.03|A|F|1994-04-24|1994-04-13|1994-05-15|NONE|FOB|ar packages +52228|1880|81|1|8|14255.04|0.10|0.00|N|O|1998-02-05|1997-12-16|1998-03-06|TAKE BACK RETURN|REG AIR|y special warthogs. furiously bold requ +52228|1697|21|2|22|35171.18|0.09|0.07|N|O|1997-11-22|1997-12-29|1997-12-16|DELIVER IN PERSON|TRUCK|l accounts wake against the requ +52228|1933|22|3|46|84406.78|0.00|0.01|N|O|1997-12-12|1997-11-27|1998-01-04|TAKE BACK RETURN|RAIL|into beans. slowly ev +52228|1976|77|4|26|48827.22|0.09|0.02|N|O|1997-12-08|1997-12-14|1997-12-28|DELIVER IN PERSON|MAIL|ged, regular ideas solve along the slyly +52228|211|39|5|25|27780.25|0.06|0.07|N|O|1997-11-13|1997-12-19|1997-12-07|NONE|RAIL|e furiously ironic in +52229|533|64|1|50|71676.50|0.03|0.07|N|O|1997-05-23|1997-04-20|1997-06-09|TAKE BACK RETURN|TRUCK|gainst the carefully final packages. +52229|415|74|2|4|5261.64|0.00|0.00|N|O|1997-05-06|1997-05-23|1997-05-13|COLLECT COD|SHIP|larly unusual theodol +52229|369|54|3|45|57121.20|0.08|0.02|N|O|1997-06-27|1997-05-07|1997-07-04|NONE|FOB|along the fluffily +52229|224|25|4|7|7869.54|0.00|0.04|N|O|1997-05-23|1997-05-12|1997-06-22|NONE|SHIP|yly regular reque +52229|1700|24|5|25|40042.50|0.06|0.05|N|O|1997-05-27|1997-04-27|1997-06-18|NONE|SHIP|onic accounts +52230|1578|99|1|40|59182.80|0.08|0.01|R|F|1992-09-06|1992-11-25|1992-10-01|TAKE BACK RETURN|REG AIR|tect furiously. slyly special +52230|1994|27|2|17|32231.83|0.03|0.00|A|F|1992-09-21|1992-10-24|1992-10-11|COLLECT COD|RAIL|g silent accounts. furious +52230|1376|15|3|19|24270.03|0.01|0.08|R|F|1992-11-17|1992-10-03|1992-11-18|COLLECT COD|FOB|ven packages along the slyl +52230|1441|42|4|39|52355.16|0.00|0.08|A|F|1992-09-26|1992-11-12|1992-10-16|COLLECT COD|MAIL|ke. instructions among the fu +52231|679|80|1|36|56868.12|0.05|0.00|A|F|1994-07-31|1994-09-23|1994-08-22|COLLECT COD|AIR|s packages. pending multiplier +52231|1147|48|2|4|4192.56|0.05|0.06|R|F|1994-10-16|1994-09-04|1994-11-06|DELIVER IN PERSON|RAIL| unusual accounts mold quickly final +52231|1698|81|3|22|35193.18|0.00|0.01|A|F|1994-08-04|1994-08-26|1994-08-10|COLLECT COD|AIR|y across the bold requests. +52231|871|72|4|35|62015.45|0.07|0.07|A|F|1994-11-07|1994-09-13|1994-11-24|DELIVER IN PERSON|AIR|blithely across the final, regular p +52231|1901|90|5|27|48678.30|0.09|0.08|R|F|1994-08-13|1994-08-15|1994-08-15|DELIVER IN PERSON|MAIL|ct furiously a +52231|1521|42|6|11|15647.72|0.02|0.07|A|F|1994-10-11|1994-09-25|1994-10-31|COLLECT COD|FOB|regular packages boost slyly slyly regula +52256|1305|82|1|35|42220.50|0.04|0.05|A|F|1993-11-10|1994-01-19|1993-12-01|DELIVER IN PERSON|TRUCK|ly express requests affix aft +52256|589|90|2|31|46176.98|0.03|0.00|A|F|1994-03-06|1994-01-23|1994-03-26|NONE|MAIL|ccounts integrate fur +52257|259|60|1|8|9274.00|0.09|0.05|N|O|1997-08-09|1997-07-03|1997-09-07|NONE|SHIP|s sublate. regular pinto beans affi +52257|1393|8|2|47|60836.33|0.09|0.00|N|O|1997-06-05|1997-07-21|1997-06-30|DELIVER IN PERSON|FOB|oost furiously. blithely +52257|451|81|3|8|10811.60|0.04|0.01|N|O|1997-05-27|1997-08-06|1997-06-04|COLLECT COD|FOB|eposits haggle furiously final, pending pa +52257|1710|53|4|35|56409.85|0.10|0.00|N|O|1997-09-14|1997-07-18|1997-10-09|TAKE BACK RETURN|SHIP|ing pinto beans. unusual +52258|238|39|1|31|35285.13|0.00|0.05|R|F|1994-03-07|1994-05-02|1994-04-06|COLLECT COD|SHIP|iously regular +52258|1658|100|2|11|17156.15|0.10|0.00|R|F|1994-03-17|1994-05-02|1994-03-22|TAKE BACK RETURN|SHIP|ons sleep blithely final, final +52258|272|54|3|17|19928.59|0.07|0.02|A|F|1994-06-12|1994-04-03|1994-06-18|COLLECT COD|SHIP|s wake according to the regular de +52259|31|7|1|21|19551.63|0.05|0.04|N|O|1998-04-10|1998-04-29|1998-04-30|NONE|TRUCK|lly special excuses boost carefully across +52260|141|94|1|8|8329.12|0.06|0.08|R|F|1993-07-08|1993-08-02|1993-07-21|DELIVER IN PERSON|AIR|, even depo +52260|1469|48|2|47|64411.62|0.10|0.02|A|F|1993-08-28|1993-07-23|1993-09-22|NONE|FOB| to the silent, +52260|913|82|3|36|65300.76|0.06|0.07|R|F|1993-08-09|1993-07-30|1993-09-05|NONE|SHIP|ular accounts de +52261|413|14|1|24|31521.84|0.01|0.02|R|F|1995-05-02|1995-06-23|1995-05-14|TAKE BACK RETURN|FOB|ccounts hang carefully slyly +52261|1704|31|2|4|6422.80|0.07|0.01|N|O|1995-07-20|1995-06-21|1995-07-27|COLLECT COD|RAIL|e slyly final ideas-- bl +52261|1474|92|3|14|19256.58|0.03|0.05|A|F|1995-05-30|1995-07-20|1995-05-31|COLLECT COD|AIR|regular accounts. blithely special request +52261|1540|21|4|46|66310.84|0.10|0.06|N|O|1995-08-15|1995-06-28|1995-08-21|TAKE BACK RETURN|SHIP|nic platelets c +52261|817|51|5|20|34356.20|0.02|0.05|N|F|1995-06-12|1995-06-08|1995-07-06|NONE|FOB|ajole according to the +52261|668|31|6|12|18823.92|0.02|0.01|R|F|1995-05-20|1995-05-29|1995-06-16|COLLECT COD|SHIP|long the slyly regular t +52261|923|92|7|31|56541.52|0.10|0.03|R|F|1995-05-18|1995-07-15|1995-05-26|NONE|MAIL|ggedly express as +52262|1415|33|1|9|11847.69|0.07|0.08|R|F|1992-06-24|1992-04-26|1992-07-24|TAKE BACK RETURN|REG AIR|kages. regular pinto +52263|1940|85|1|27|49732.38|0.03|0.06|A|F|1994-05-24|1994-06-14|1994-06-08|TAKE BACK RETURN|TRUCK|nding instructions. slyly unusual reque +52288|701|66|1|46|73678.20|0.00|0.03|N|O|1995-08-29|1995-09-27|1995-09-09|NONE|FOB| about the ironically final request +52288|1796|23|2|1|1697.79|0.06|0.05|N|O|1995-11-22|1995-09-14|1995-12-14|NONE|SHIP|ests solve. regular deposits are careful +52288|1205|6|3|33|36504.60|0.10|0.02|N|O|1995-10-23|1995-10-19|1995-11-05|DELIVER IN PERSON|TRUCK| alongside of the even pinto beans. ca +52288|1489|29|4|38|52838.24|0.05|0.04|N|O|1995-12-02|1995-09-17|1995-12-21|NONE|TRUCK| fluffily special accounts cajole +52288|687|19|5|16|25402.88|0.03|0.03|N|O|1995-10-23|1995-10-28|1995-11-18|NONE|AIR| blithely regular accounts wake quickl +52289|1678|61|1|27|42651.09|0.03|0.02|N|O|1998-09-27|1998-08-05|1998-10-19|TAKE BACK RETURN|AIR|y express requests +52289|1107|44|2|45|45364.50|0.07|0.03|N|O|1998-07-13|1998-07-12|1998-07-17|DELIVER IN PERSON|FOB|ntly express packages. c +52289|1915|60|3|19|34521.29|0.07|0.02|N|O|1998-07-17|1998-08-26|1998-08-07|COLLECT COD|FOB|ns boost above the blithely expres +52289|854|54|4|45|78968.25|0.00|0.02|N|O|1998-09-19|1998-07-21|1998-10-08|TAKE BACK RETURN|REG AIR|ar pinto bea +52289|300|82|5|6|7201.80|0.02|0.05|N|O|1998-09-14|1998-08-10|1998-10-08|TAKE BACK RETURN|MAIL|y. regular theodolites +52289|11|87|6|18|16398.18|0.00|0.01|N|O|1998-06-10|1998-07-27|1998-07-03|TAKE BACK RETURN|TRUCK|the regular r +52289|1844|31|7|32|55866.88|0.07|0.01|N|O|1998-06-14|1998-07-12|1998-07-04|TAKE BACK RETURN|TRUCK|its. pending, pendin +52290|942|11|1|40|73717.60|0.08|0.05|R|F|1992-07-31|1992-08-18|1992-08-27|DELIVER IN PERSON|SHIP|iously ironic deposits. quickly pending req +52290|1299|100|2|35|42010.15|0.01|0.05|A|F|1992-09-20|1992-07-24|1992-09-24|COLLECT COD|MAIL|egular excuses wake quickl +52290|1583|64|3|27|40083.66|0.04|0.04|A|F|1992-07-28|1992-08-16|1992-08-05|COLLECT COD|FOB|express, bold id +52290|613|76|4|30|45408.30|0.04|0.06|R|F|1992-05-30|1992-08-05|1992-06-10|TAKE BACK RETURN|MAIL|egular deposits. theodolites wake +52290|841|42|5|24|41804.16|0.01|0.08|R|F|1992-09-03|1992-08-12|1992-09-28|DELIVER IN PERSON|FOB|posits wake furiously; furiously pending id +52290|1892|79|6|14|25114.46|0.05|0.02|A|F|1992-08-28|1992-07-26|1992-09-11|DELIVER IN PERSON|REG AIR|ggle slyly outside the ironic, unu +52290|434|22|7|26|34695.18|0.05|0.06|R|F|1992-09-07|1992-07-08|1992-09-15|NONE|AIR|er. blithely +52291|724|89|1|36|58489.92|0.02|0.06|R|F|1994-12-07|1994-12-05|1995-01-03|COLLECT COD|RAIL|ly. bold pinto beans sleep above the i +52291|1057|58|2|22|21077.10|0.08|0.00|R|F|1995-01-15|1994-12-14|1995-02-14|COLLECT COD|SHIP|s. furiously eve +52291|1432|72|3|45|60004.35|0.02|0.08|R|F|1995-01-31|1994-12-09|1995-02-03|DELIVER IN PERSON|AIR|ss deposits. fluffily enticing packages aft +52292|1212|13|1|41|45641.61|0.06|0.03|A|F|1993-11-12|1993-12-28|1993-11-30|TAKE BACK RETURN|RAIL|l dependencies-- fluffily even theodoli +52292|278|60|2|20|23565.40|0.04|0.04|R|F|1993-10-28|1993-11-08|1993-11-02|NONE|MAIL|fily carefully special deposits. bold theod +52292|50|26|3|7|6650.35|0.09|0.03|R|F|1994-01-15|1993-12-20|1994-02-06|TAKE BACK RETURN|TRUCK| pinto beans integrate carefully a +52292|1844|74|4|19|33170.96|0.05|0.00|A|F|1993-11-14|1993-11-09|1993-11-19|TAKE BACK RETURN|MAIL|ooze after the final account +52293|14|15|1|45|41130.45|0.07|0.06|N|O|1995-07-29|1995-06-04|1995-08-25|NONE|REG AIR| pinto beans wake fur +52293|843|10|2|32|55802.88|0.00|0.03|N|O|1995-08-08|1995-05-31|1995-08-23|DELIVER IN PERSON|MAIL|telets. pending +52293|1544|25|3|37|53484.98|0.06|0.06|A|F|1995-05-29|1995-05-20|1995-05-30|NONE|SHIP| the packages. slyly +52293|1383|84|4|38|48806.44|0.02|0.00|R|F|1995-04-26|1995-07-15|1995-05-25|NONE|TRUCK|. even, special accoun +52294|1064|100|1|19|18336.14|0.07|0.03|N|O|1996-11-18|1996-11-15|1996-11-26|DELIVER IN PERSON|AIR| bold, pending plate +52294|1118|91|2|25|25477.75|0.04|0.00|N|O|1996-10-20|1996-11-01|1996-11-17|NONE|MAIL|e blithely regular dep +52294|1039|75|3|41|38541.23|0.05|0.03|N|O|1996-11-22|1996-10-26|1996-11-28|NONE|FOB| slyly? furiously regular pa +52294|918|19|4|16|29102.56|0.08|0.04|N|O|1996-11-27|1996-10-15|1996-12-07|DELIVER IN PERSON|MAIL|ironic foxes! quickly expre +52294|290|18|5|37|44040.73|0.06|0.01|N|O|1996-11-15|1996-11-10|1996-12-09|NONE|RAIL|foxes haggle +52294|1769|96|6|6|10024.56|0.07|0.06|N|O|1996-10-05|1996-11-05|1996-10-20|NONE|RAIL|usual ideas. acc +52294|1151|88|7|41|43138.15|0.10|0.08|N|O|1996-10-04|1996-10-22|1996-10-21|NONE|SHIP|d ideas boost. final ideas w +52295|494|82|1|28|39045.72|0.00|0.03|N|O|1996-01-03|1996-01-10|1996-01-30|DELIVER IN PERSON|AIR|ar Tiresias. regularly final requests wa +52295|546|47|2|48|69433.92|0.05|0.00|N|O|1996-02-05|1995-12-24|1996-02-06|COLLECT COD|FOB|furiously carefully even e +52295|1984|85|3|12|22631.76|0.03|0.01|N|O|1995-12-30|1996-01-02|1996-01-29|NONE|RAIL| slyly quickly regular req +52295|587|48|4|46|68428.68|0.07|0.05|N|O|1996-02-04|1996-02-03|1996-02-22|TAKE BACK RETURN|TRUCK|ts. furiously ironic deposits grow quickly +52295|1930|31|5|37|67781.41|0.08|0.07|N|O|1996-03-21|1996-02-19|1996-04-11|TAKE BACK RETURN|FOB|ly express +52320|93|19|1|34|33765.06|0.01|0.07|A|F|1992-10-02|1992-10-26|1992-10-10|DELIVER IN PERSON|AIR| cajole carefully unusual packages. +52320|623|55|2|41|62468.42|0.08|0.00|A|F|1992-11-30|1992-12-19|1992-12-26|NONE|RAIL|beans hang furiously a +52320|1381|58|3|47|60271.86|0.10|0.06|A|F|1992-10-23|1992-12-12|1992-10-30|COLLECT COD|RAIL|nts. requests among the carefully final +52321|626|58|1|32|48851.84|0.02|0.03|N|O|1996-01-18|1996-01-27|1996-01-30|DELIVER IN PERSON|MAIL|ickly ironic r +52321|1300|12|2|50|60065.00|0.09|0.03|N|O|1996-01-11|1996-01-07|1996-02-01|NONE|FOB|slyly deposits. carefully c +52321|1593|94|3|30|44837.70|0.05|0.04|N|O|1996-02-09|1996-01-05|1996-02-26|TAKE BACK RETURN|AIR|behind the excuses boost +52321|1847|34|4|39|68204.76|0.00|0.04|N|O|1996-01-09|1996-01-21|1996-01-11|NONE|RAIL|ependencies haggle slyly. blithely +52321|482|70|5|5|6912.40|0.02|0.02|N|O|1995-11-28|1996-01-30|1995-12-04|TAKE BACK RETURN|REG AIR|al foxes haggle fl +52321|1013|49|6|47|42958.47|0.09|0.01|N|O|1995-12-25|1995-12-07|1996-01-02|TAKE BACK RETURN|REG AIR|quickly special theodolites haggle sl +52322|1745|46|1|36|59282.64|0.05|0.07|A|F|1993-04-21|1993-03-30|1993-05-18|DELIVER IN PERSON|MAIL| deposits. carefully pen +52323|35|11|1|5|4675.15|0.04|0.03|N|O|1997-08-30|1997-06-25|1997-09-26|NONE|REG AIR|onic deposits sleep. regular, r +52323|138|17|2|10|10381.30|0.06|0.05|N|O|1997-07-05|1997-06-01|1997-07-26|TAKE BACK RETURN|REG AIR|y express deposits cajole boldly. ironic, +52323|233|15|3|45|50995.35|0.10|0.07|N|O|1997-06-16|1997-07-06|1997-07-06|COLLECT COD|REG AIR|ic accounts across the +52323|286|68|4|33|39147.24|0.01|0.07|N|O|1997-06-07|1997-06-03|1997-06-15|TAKE BACK RETURN|TRUCK|ly across the final packages. +52323|811|45|5|8|13694.48|0.07|0.04|N|O|1997-08-10|1997-06-19|1997-08-31|DELIVER IN PERSON|SHIP|ld orbits wake slyly about the iron +52323|229|57|6|4|4516.88|0.05|0.05|N|O|1997-07-18|1997-07-23|1997-08-07|DELIVER IN PERSON|SHIP|requests sleep permanently. express theod +52324|1911|12|1|15|27193.65|0.10|0.03|A|F|1992-07-05|1992-08-28|1992-08-04|TAKE BACK RETURN|SHIP| special acco +52324|1702|3|2|39|62544.30|0.09|0.08|A|F|1992-07-23|1992-09-17|1992-08-09|DELIVER IN PERSON|REG AIR|sts. pinto +52324|769|66|3|26|43413.76|0.04|0.00|R|F|1992-08-18|1992-09-04|1992-08-23|NONE|TRUCK| pending pearls sleep carefully request +52324|1529|10|4|28|40054.56|0.07|0.02|A|F|1992-07-19|1992-09-07|1992-07-30|TAKE BACK RETURN|FOB|s bold requests. slyly unusual +52324|711|76|5|47|75750.37|0.03|0.08|A|F|1992-08-18|1992-07-31|1992-08-23|DELIVER IN PERSON|RAIL|l requests. speci +52324|1531|52|6|46|65896.38|0.07|0.01|A|F|1992-09-16|1992-09-05|1992-10-15|TAKE BACK RETURN|AIR|ages nag sly +52325|54|30|1|8|7632.40|0.07|0.00|R|F|1992-08-08|1992-10-09|1992-08-18|NONE|TRUCK| slyly unusual dolphins. quickly reg +52325|108|35|2|50|50405.00|0.07|0.08|A|F|1992-08-23|1992-09-25|1992-09-14|TAKE BACK RETURN|AIR|e pinto beans. even de +52325|241|96|3|40|45649.60|0.07|0.06|R|F|1992-09-29|1992-09-05|1992-10-13|NONE|REG AIR|al foxes are; carefully silent +52325|442|43|4|37|49670.28|0.10|0.00|A|F|1992-08-25|1992-09-26|1992-08-27|COLLECT COD|AIR| platelets sleep. carefully daring gifts +52326|1152|89|1|6|6318.90|0.04|0.05|A|F|1993-10-31|1993-09-08|1993-11-17|COLLECT COD|FOB|oss the slyly express theodolites +52326|1046|52|2|17|16099.68|0.01|0.02|A|F|1993-11-11|1993-10-05|1993-11-27|DELIVER IN PERSON|RAIL|nto beans are. speci +52326|1427|67|3|49|65092.58|0.04|0.08|A|F|1993-08-23|1993-10-01|1993-08-27|COLLECT COD|TRUCK|ins wake ac +52326|1171|72|4|2|2144.34|0.08|0.05|A|F|1993-10-10|1993-09-06|1993-10-21|COLLECT COD|FOB|above the quickly careful real +52326|1901|34|5|20|36058.00|0.07|0.01|R|F|1993-08-17|1993-09-18|1993-08-29|COLLECT COD|AIR| accounts nag blithely along +52326|457|16|6|8|10859.60|0.07|0.00|R|F|1993-09-05|1993-10-06|1993-09-09|DELIVER IN PERSON|MAIL|ssly ironic packages. quickly +52327|1087|58|1|1|988.08|0.02|0.00|N|O|1996-02-03|1996-02-08|1996-02-18|NONE|FOB|ronic requests +52327|11|37|2|33|30063.33|0.07|0.08|N|O|1996-02-24|1996-02-01|1996-03-02|TAKE BACK RETURN|RAIL|asymptotes. furiously even accounts above +52327|772|69|3|35|58546.95|0.04|0.00|N|O|1996-03-16|1996-02-01|1996-03-21|DELIVER IN PERSON|REG AIR|hely silent theodolites m +52327|1600|81|4|26|39041.60|0.08|0.04|N|O|1996-01-30|1996-03-11|1996-02-08|TAKE BACK RETURN|SHIP|g the bold, express reque +52327|1425|65|5|13|17243.46|0.10|0.08|N|O|1996-02-26|1996-03-12|1996-03-18|NONE|RAIL|fluffily regular reque +52327|1995|28|6|7|13278.93|0.04|0.04|N|O|1996-02-05|1996-01-27|1996-02-20|TAKE BACK RETURN|RAIL|instructions detect furiou +52327|1936|25|7|32|58813.76|0.03|0.01|N|O|1996-03-01|1996-01-25|1996-03-09|COLLECT COD|REG AIR|the brave, express accounts sleep foxe +52352|773|6|1|37|61929.49|0.03|0.08|N|O|1997-06-13|1997-04-09|1997-07-02|DELIVER IN PERSON|SHIP| deposits. caref +52352|555|86|2|1|1455.55|0.00|0.07|N|O|1997-05-31|1997-05-09|1997-06-17|COLLECT COD|SHIP|beans detect: quickly regular acc +52352|350|35|3|18|22506.30|0.00|0.05|N|O|1997-03-22|1997-04-29|1997-04-13|COLLECT COD|REG AIR|e carefully regular theodolites sl +52352|111|64|4|32|32355.52|0.10|0.04|N|O|1997-04-20|1997-03-28|1997-05-08|TAKE BACK RETURN|RAIL| requests +52352|1457|36|5|5|6792.25|0.03|0.00|N|O|1997-05-03|1997-03-29|1997-05-22|DELIVER IN PERSON|AIR|refully ironically un +52352|1316|17|6|43|52344.33|0.05|0.03|N|O|1997-03-02|1997-03-27|1997-03-09|TAKE BACK RETURN|FOB|en pains. regular, final dependenci +52353|1442|21|1|5|6717.20|0.03|0.02|N|O|1997-02-25|1997-02-10|1997-03-11|COLLECT COD|REG AIR|ackages. carefully re +52353|1456|96|2|5|6787.25|0.00|0.03|N|O|1997-03-14|1997-02-23|1997-03-25|NONE|TRUCK|nos sleep +52353|1608|9|3|20|30192.00|0.03|0.08|N|O|1997-03-20|1997-03-16|1997-03-26|NONE|SHIP|nst the slyly ironic pinto bea +52354|1419|37|1|45|59418.45|0.08|0.01|A|F|1992-08-27|1992-10-11|1992-09-06|COLLECT COD|SHIP|ly regular dependencies. +52354|1649|91|2|31|48069.84|0.02|0.08|A|F|1992-10-13|1992-09-27|1992-10-24|TAKE BACK RETURN|REG AIR|the slyly even a +52355|1154|91|1|47|49592.05|0.05|0.00|N|O|1997-07-22|1997-08-20|1997-08-11|DELIVER IN PERSON|FOB|l somas. deposits cajole furiously! bol +52355|1747|90|2|18|29677.32|0.00|0.02|N|O|1997-09-07|1997-07-31|1997-09-27|COLLECT COD|MAIL|nal courts against the regular asymptotes w +52355|1787|14|3|25|42219.50|0.10|0.02|N|O|1997-07-02|1997-08-02|1997-07-15|DELIVER IN PERSON|TRUCK|deas. carefully regular deposits wake ca +52355|1797|98|4|49|83240.71|0.10|0.02|N|O|1997-06-28|1997-07-12|1997-07-14|COLLECT COD|RAIL| final somas wake slyly above t +52355|1342|43|5|7|8703.38|0.09|0.00|N|O|1997-06-18|1997-09-04|1997-07-01|NONE|SHIP| carefully dogged pa +52356|12|13|1|18|16416.18|0.06|0.05|N|O|1998-01-27|1998-03-14|1998-02-11|COLLECT COD|REG AIR|blithely along the regular, unusual de +52356|1310|25|2|17|20592.27|0.03|0.06|N|O|1998-01-13|1998-03-07|1998-02-05|NONE|MAIL|the unusual, +52356|537|38|3|39|56063.67|0.10|0.02|N|O|1998-02-16|1998-01-23|1998-03-13|TAKE BACK RETURN|FOB| express ideas. fluffily pending theodo +52356|1889|19|4|22|39399.36|0.06|0.07|N|O|1998-02-10|1998-02-17|1998-02-21|DELIVER IN PERSON|TRUCK|e slyly regular accounts. unusual pinto +52357|849|16|1|33|57744.72|0.07|0.06|R|F|1994-10-05|1994-11-22|1994-10-14|COLLECT COD|MAIL|d packages use fur +52357|425|84|2|32|42413.44|0.06|0.01|A|F|1994-09-25|1994-10-07|1994-10-05|TAKE BACK RETURN|AIR|. fluffily ironic deposits boost q +52357|1022|93|3|9|8307.18|0.00|0.01|R|F|1994-10-09|1994-11-02|1994-10-23|TAKE BACK RETURN|TRUCK|lyly special foxes. sly asymptotes was. +52357|816|17|4|26|44637.06|0.01|0.04|R|F|1994-11-19|1994-10-10|1994-12-01|NONE|TRUCK|gular, bold packages. carefully iron +52358|1450|29|1|10|13514.50|0.05|0.07|N|O|1997-02-25|1997-02-25|1997-03-05|COLLECT COD|REG AIR|egular, thin dependencies sleep carefully a +52358|1417|96|2|1|1318.41|0.07|0.00|N|O|1997-03-21|1997-02-24|1997-03-23|COLLECT COD|REG AIR|structions cajole quickly after the final +52359|674|75|1|12|18896.04|0.08|0.01|N|O|1998-08-23|1998-08-06|1998-09-07|DELIVER IN PERSON|RAIL|. bold instructio +52359|1699|41|2|24|38416.56|0.02|0.02|N|O|1998-09-01|1998-07-28|1998-09-17|DELIVER IN PERSON|MAIL|ly unusual deposits. blithely regular +52359|166|19|3|6|6396.96|0.00|0.02|N|O|1998-07-12|1998-08-20|1998-08-06|COLLECT COD|FOB|ions. final deposits with +52359|898|98|4|13|23385.57|0.04|0.02|N|O|1998-07-13|1998-08-25|1998-08-08|DELIVER IN PERSON|SHIP|g asymptotes. furi +52384|1272|73|1|13|15252.51|0.07|0.02|N|O|1998-06-03|1998-07-26|1998-07-02|DELIVER IN PERSON|RAIL| final asymptotes wake +52384|1635|77|2|3|4609.89|0.09|0.04|N|O|1998-08-30|1998-08-10|1998-09-16|TAKE BACK RETURN|AIR|ickly about the fluffily speci +52384|1350|27|3|3|3754.05|0.05|0.06|N|O|1998-06-20|1998-07-23|1998-06-28|COLLECT COD|MAIL|y across the furi +52384|1624|25|4|27|41191.74|0.04|0.06|N|O|1998-09-09|1998-06-27|1998-09-22|COLLECT COD|RAIL|ely regular requests. requests haggle f +52384|165|66|5|34|36215.44|0.09|0.06|N|O|1998-08-12|1998-07-18|1998-08-19|COLLECT COD|REG AIR| furiously express theod +52384|1457|97|6|16|21735.20|0.04|0.08|N|O|1998-05-29|1998-07-07|1998-06-20|DELIVER IN PERSON|REG AIR|ar, unusual packages. special asymp +52385|447|48|1|29|39075.76|0.05|0.03|A|F|1994-01-12|1994-02-16|1994-01-29|DELIVER IN PERSON|AIR|accounts haggle fluffily across the furious +52385|1480|20|2|28|38681.44|0.01|0.06|R|F|1994-01-20|1994-03-23|1994-02-07|COLLECT COD|FOB|es wake after the regular, final req +52385|1489|68|3|34|47276.32|0.05|0.07|A|F|1994-04-07|1994-02-17|1994-04-14|COLLECT COD|AIR|ke regular +52385|1209|84|4|16|17763.20|0.09|0.07|R|F|1994-04-27|1994-02-02|1994-05-07|NONE|REG AIR|arefully bold +52386|956|91|1|19|35282.05|0.05|0.00|A|F|1994-02-14|1994-03-28|1994-03-04|DELIVER IN PERSON|MAIL|packages eat carefully. reg +52386|1555|96|2|3|4369.65|0.02|0.02|A|F|1994-03-12|1994-03-31|1994-03-14|NONE|FOB|ges? ironic platelets detect furi +52386|185|64|3|15|16277.70|0.05|0.07|R|F|1994-04-11|1994-02-10|1994-04-14|TAKE BACK RETURN|REG AIR|ending sauternes cajole blit +52386|372|57|4|46|58529.02|0.06|0.06|A|F|1994-05-03|1994-04-04|1994-05-25|NONE|RAIL|usual, even courts lose enticingly furi +52386|957|26|5|30|55738.50|0.03|0.03|A|F|1994-02-15|1994-02-16|1994-03-03|COLLECT COD|RAIL| the regular requests. furiously bo +52387|1821|22|1|30|51684.60|0.03|0.04|N|O|1997-01-02|1996-12-06|1997-01-21|NONE|AIR|lyly bold requests us +52387|1525|66|2|42|59913.84|0.05|0.03|N|O|1997-01-09|1996-11-24|1997-01-18|DELIVER IN PERSON|RAIL| furiously again +52387|396|97|3|4|5185.56|0.09|0.05|N|O|1996-09-23|1996-11-20|1996-09-24|NONE|MAIL|cross the carefully final deposits. +52387|831|31|4|48|83127.84|0.03|0.06|N|O|1996-11-04|1996-11-14|1996-11-05|NONE|RAIL|ringly. accounts haggle furiously! blithel +52388|1229|67|1|9|10171.98|0.05|0.00|N|O|1996-05-28|1996-06-08|1996-05-29|DELIVER IN PERSON|MAIL|uctions nag furiously against the slyl +52388|1136|37|2|5|5185.65|0.08|0.03|N|O|1996-06-14|1996-05-18|1996-06-30|TAKE BACK RETURN|REG AIR|ven, regul +52388|935|38|3|33|60585.69|0.07|0.06|N|O|1996-04-22|1996-05-28|1996-05-06|NONE|SHIP|ar asymptotes use furiously to the ca +52388|1533|74|4|35|50208.55|0.02|0.07|N|O|1996-05-01|1996-05-05|1996-05-19|COLLECT COD|TRUCK| beans need to cajole quickly until the car +52388|1933|22|5|18|33028.74|0.09|0.02|N|O|1996-06-23|1996-05-07|1996-07-01|COLLECT COD|REG AIR|y final requests. regular ins +52388|78|4|6|35|34232.45|0.04|0.03|N|O|1996-04-23|1996-04-23|1996-04-30|NONE|RAIL|press deposits haggle specia +52389|941|76|1|47|86571.18|0.06|0.01|N|O|1996-02-09|1995-12-14|1996-02-20|NONE|FOB|accounts grow quickly afte +52389|318|3|2|49|59697.19|0.10|0.04|N|O|1995-12-23|1996-01-08|1995-12-27|DELIVER IN PERSON|AIR| x-ray across the busily ironic reques +52389|1908|97|3|19|34388.10|0.01|0.02|N|O|1996-02-09|1995-12-05|1996-03-03|NONE|AIR|ic ideas wake against th +52389|1806|36|4|43|73435.40|0.06|0.03|N|O|1996-01-26|1996-01-03|1996-02-12|NONE|TRUCK|ions use above the pending grouches: quick, +52390|1509|30|1|28|39494.00|0.03|0.01|N|O|1997-03-16|1997-01-09|1997-03-17|DELIVER IN PERSON|SHIP|each furiously +52390|1044|15|2|14|13230.56|0.08|0.05|N|O|1997-02-12|1996-12-20|1997-03-03|NONE|TRUCK|al requests nag carefully. +52390|1497|98|3|21|29368.29|0.00|0.04|N|O|1997-03-15|1997-01-29|1997-03-22|DELIVER IN PERSON|FOB|s cajole! slyly ironic asym +52390|885|52|4|17|30359.96|0.02|0.04|N|O|1997-01-11|1997-01-07|1997-01-28|NONE|TRUCK| ironic deposits. +52391|1386|1|1|30|38621.40|0.09|0.03|A|F|1995-03-11|1995-01-20|1995-03-31|TAKE BACK RETURN|TRUCK| accounts boost slyly special asymptotes. +52391|375|4|2|22|28058.14|0.03|0.02|R|F|1995-02-10|1995-01-17|1995-03-03|TAKE BACK RETURN|RAIL|detect fluffily +52391|1052|53|3|16|15248.80|0.08|0.05|A|F|1995-01-14|1995-03-11|1995-01-22|COLLECT COD|REG AIR| pending, express foxes boost along the sly +52391|648|49|4|12|18583.68|0.06|0.04|A|F|1995-03-29|1995-02-19|1995-04-26|NONE|REG AIR|efully silent deposits hagg +52391|1528|9|5|2|2859.04|0.10|0.04|R|F|1995-01-08|1995-02-12|1995-01-19|COLLECT COD|REG AIR|ndencies cajole blithely acros +52416|1172|9|1|2|2146.34|0.08|0.04|A|F|1994-05-25|1994-04-01|1994-06-18|TAKE BACK RETURN|FOB|bold accounts boost furiously u +52416|1046|17|2|39|36934.56|0.05|0.07|A|F|1994-05-05|1994-03-28|1994-06-04|NONE|RAIL|ironic, bold pinto beans among the pending +52416|150|29|3|13|13651.95|0.01|0.04|R|F|1994-05-05|1994-04-04|1994-05-17|NONE|FOB|regular, exp +52416|1361|38|4|4|5049.44|0.05|0.04|A|F|1994-05-28|1994-03-13|1994-06-08|COLLECT COD|RAIL| final acc +52416|1247|59|5|23|26409.52|0.09|0.07|R|F|1994-04-16|1994-04-14|1994-04-26|COLLECT COD|MAIL|instructions use furiously regular excuse +52417|203|31|1|13|14341.60|0.03|0.03|N|O|1996-01-24|1996-03-10|1996-02-01|COLLECT COD|FOB|press ideas boost slyly regular f +52417|1458|98|2|8|10875.60|0.07|0.02|N|O|1996-01-17|1996-03-18|1996-02-05|NONE|MAIL|le slyly sl +52417|343|28|3|8|9946.72|0.08|0.00|N|O|1996-02-22|1996-02-17|1996-03-13|DELIVER IN PERSON|SHIP|ies. furiously even de +52418|1172|73|1|50|53658.50|0.04|0.04|N|O|1998-09-01|1998-08-22|1998-09-09|TAKE BACK RETURN|RAIL|ckages. carefully even th +52419|393|50|1|11|14227.29|0.09|0.04|R|F|1992-10-28|1992-11-07|1992-11-25|COLLECT COD|AIR|into beans. ironic, r +52419|1765|66|2|33|55003.08|0.07|0.05|A|F|1992-11-30|1992-12-07|1992-12-26|COLLECT COD|TRUCK| snooze carefully pending deposits. packag +52419|784|17|3|42|70760.76|0.02|0.07|R|F|1992-12-15|1992-12-08|1992-12-31|NONE|FOB|t the carefully even accounts. furi +52420|956|59|1|35|64993.25|0.00|0.07|N|O|1998-05-23|1998-07-27|1998-06-17|DELIVER IN PERSON|REG AIR|he regular p +52420|1769|70|2|37|61818.12|0.06|0.05|N|O|1998-05-27|1998-06-05|1998-06-05|COLLECT COD|FOB|ffily unusual instructions haggle af +52420|384|13|3|27|34678.26|0.07|0.04|N|O|1998-05-11|1998-07-08|1998-05-21|COLLECT COD|REG AIR|ickly brave asymptotes are br +52420|539|70|4|36|51823.08|0.06|0.07|N|O|1998-06-18|1998-07-24|1998-07-04|DELIVER IN PERSON|MAIL|xpress deposits. blithely pending ideas +52420|659|91|5|25|38991.25|0.04|0.06|N|O|1998-07-19|1998-07-09|1998-08-06|TAKE BACK RETURN|REG AIR|es eat according to the furi +52420|1073|9|6|5|4870.35|0.08|0.02|N|O|1998-08-08|1998-07-25|1998-08-11|TAKE BACK RETURN|TRUCK|snooze blithely express deposi +52420|847|47|7|49|85644.16|0.00|0.04|N|O|1998-05-28|1998-06-07|1998-06-18|NONE|SHIP|requests sleep. quickly silent theodolite +52421|84|85|1|22|21649.76|0.03|0.02|N|O|1996-06-13|1996-04-22|1996-07-05|COLLECT COD|MAIL|ructions nod fluffily enticing i +52421|849|50|2|20|34996.80|0.10|0.05|N|O|1996-07-13|1996-04-13|1996-07-20|NONE|TRUCK| regular orbits affix quickl +52422|1195|32|1|17|18635.23|0.05|0.01|N|O|1997-05-09|1997-05-26|1997-06-03|COLLECT COD|FOB|fluffily even excuses. furiou +52423|1878|8|1|16|28477.92|0.08|0.08|N|O|1995-08-10|1995-06-11|1995-08-26|DELIVER IN PERSON|FOB| accounts boost blithely after the depos +52423|703|36|2|40|64148.00|0.00|0.07|N|O|1995-07-18|1995-06-25|1995-07-21|NONE|TRUCK|lar courts sleep e +52423|1154|91|3|48|50647.20|0.00|0.01|A|F|1995-05-10|1995-06-11|1995-05-12|TAKE BACK RETURN|RAIL|ove the slyly final forges. final requ +52423|1264|65|4|38|44279.88|0.01|0.03|R|F|1995-04-13|1995-05-18|1995-04-21|COLLECT COD|FOB|mptotes about the slyly ironi +52423|1575|16|5|7|10335.99|0.01|0.05|R|F|1995-06-02|1995-06-19|1995-06-14|COLLECT COD|FOB|y even foxes. blith +52423|1873|60|6|18|31947.66|0.05|0.00|R|F|1995-04-27|1995-06-04|1995-05-10|NONE|RAIL|usual depen +52448|28|29|1|35|32480.70|0.01|0.06|R|F|1993-10-22|1993-12-01|1993-11-07|COLLECT COD|REG AIR|final accounts about the carefully fina +52448|1438|17|2|4|5357.72|0.05|0.06|R|F|1993-11-17|1993-11-22|1993-11-22|DELIVER IN PERSON|AIR|nly silent deposits haggle furi +52448|499|100|3|12|16793.88|0.00|0.08|R|F|1993-11-02|1993-11-17|1993-12-02|COLLECT COD|TRUCK|lly even d +52448|1903|48|4|28|50537.20|0.09|0.08|A|F|1993-12-08|1993-11-05|1993-12-20|NONE|FOB| atop the slowly dogged escapade +52448|103|30|5|23|23071.30|0.03|0.00|A|F|1993-09-19|1993-10-26|1993-09-30|DELIVER IN PERSON|TRUCK|ual requests sleep blithe +52448|573|74|6|20|29471.40|0.07|0.03|A|F|1993-09-30|1993-12-02|1993-10-03|TAKE BACK RETURN|MAIL|ronic deposits boost final requests. fluf +52449|646|40|1|25|38666.00|0.01|0.01|N|O|1997-08-25|1997-07-12|1997-08-30|DELIVER IN PERSON|FOB|al pinto beans integrate along the +52449|1242|80|2|47|53732.28|0.06|0.01|N|O|1997-08-04|1997-06-23|1997-08-09|DELIVER IN PERSON|MAIL|fily blithely ironi +52450|893|94|1|40|71755.60|0.04|0.00|N|O|1997-01-17|1997-02-26|1997-02-14|COLLECT COD|MAIL| platelets use sly ideas. +52451|35|36|1|43|40206.29|0.03|0.08|N|O|1996-11-17|1996-12-08|1996-12-05|DELIVER IN PERSON|SHIP|ly slyly ironic packages. iro +52451|135|36|2|39|40370.07|0.01|0.06|N|O|1996-11-13|1996-11-23|1996-11-17|DELIVER IN PERSON|RAIL|cuses. quickly pending account +52451|984|53|3|10|18849.80|0.10|0.04|N|O|1996-12-27|1996-12-14|1997-01-25|COLLECT COD|RAIL|y express deposits p +52451|357|14|4|40|50294.00|0.03|0.03|N|O|1996-11-08|1996-12-08|1996-11-29|COLLECT COD|SHIP| slyly ironic i +52452|1728|29|1|17|27705.24|0.02|0.08|A|F|1994-03-12|1994-01-11|1994-03-26|NONE|MAIL|ackages. ironic +52452|173|52|2|45|48292.65|0.04|0.06|R|F|1994-03-11|1994-01-12|1994-04-04|NONE|MAIL|uickly of the reques +52452|1091|97|3|26|25794.34|0.10|0.02|A|F|1994-02-18|1994-01-30|1994-03-09|NONE|AIR| enticingly blithely express requests? +52452|1995|84|4|32|60703.68|0.08|0.01|R|F|1994-02-18|1994-02-08|1994-02-22|DELIVER IN PERSON|SHIP| final packages cajole carefully across +52453|161|40|1|1|1061.16|0.05|0.01|R|F|1994-04-01|1994-03-28|1994-04-27|NONE|AIR|onic deposits +52453|1717|44|2|45|72841.95|0.06|0.01|A|F|1994-05-18|1994-02-24|1994-06-13|NONE|SHIP|r Tiresias across the regular, bold +52453|24|75|3|10|9240.20|0.05|0.01|A|F|1994-01-26|1994-04-07|1994-01-30|COLLECT COD|AIR|arhorses affi +52453|1567|88|4|5|7342.80|0.02|0.05|A|F|1994-02-10|1994-04-06|1994-03-01|NONE|AIR| doze. final ideas poach across the +52454|1537|18|1|26|37401.78|0.03|0.04|N|O|1997-04-04|1997-04-10|1997-04-28|DELIVER IN PERSON|FOB|s foxes throughout t +52454|796|61|2|19|32239.01|0.08|0.05|N|O|1997-06-05|1997-05-03|1997-06-08|NONE|FOB| unusual, special accounts boost careful +52454|819|86|3|24|41275.44|0.07|0.01|N|O|1997-03-17|1997-04-15|1997-04-04|NONE|REG AIR|y silent accounts hagg +52454|1101|38|4|42|42088.20|0.10|0.06|N|O|1997-04-30|1997-05-02|1997-05-10|TAKE BACK RETURN|MAIL|furiously final instructions. iron +52454|819|19|5|6|10318.86|0.06|0.02|N|O|1997-06-12|1997-04-21|1997-07-08|TAKE BACK RETURN|MAIL|o beans detect. fluffily +52454|1194|3|6|22|24094.18|0.09|0.00|N|O|1997-05-04|1997-04-24|1997-05-07|TAKE BACK RETURN|SHIP|fully bold +52454|68|69|7|2|1936.12|0.03|0.03|N|O|1997-06-04|1997-05-05|1997-06-16|COLLECT COD|SHIP|deas. final asymptotes sleep carefully. fl +52455|139|18|1|23|23899.99|0.01|0.01|R|F|1994-01-30|1994-02-04|1994-02-28|NONE|TRUCK|s asymptotes haggle carefully accounts +52455|907|10|2|29|52429.10|0.06|0.00|A|F|1993-12-04|1993-12-31|1994-01-02|DELIVER IN PERSON|SHIP|ular dolphi +52480|1561|62|1|45|65815.20|0.01|0.01|R|F|1993-10-31|1993-09-21|1993-11-07|NONE|FOB|ending requests. +52480|1642|43|2|47|72551.08|0.05|0.03|A|F|1993-11-08|1993-10-15|1993-11-16|DELIVER IN PERSON|TRUCK|g accounts. express requests sleep after th +52480|723|56|3|49|79562.28|0.08|0.02|R|F|1993-08-02|1993-08-27|1993-08-03|COLLECT COD|FOB|its. regular acco +52480|1905|6|4|38|68662.20|0.06|0.05|R|F|1993-09-30|1993-09-26|1993-10-18|DELIVER IN PERSON|RAIL| deposits. fluffily express pi +52480|541|2|5|48|69193.92|0.04|0.08|R|F|1993-11-18|1993-09-06|1993-12-05|TAKE BACK RETURN|AIR|g to the carefully regular +52480|1640|64|6|29|44707.56|0.03|0.04|R|F|1993-10-02|1993-09-24|1993-10-26|TAKE BACK RETURN|FOB|ously bold packages c +52480|1607|31|7|5|7543.00|0.02|0.00|A|F|1993-08-30|1993-09-23|1993-09-04|DELIVER IN PERSON|MAIL|fluffily against +52481|1444|23|1|47|63235.68|0.02|0.06|N|O|1997-11-11|1997-11-26|1997-11-14|NONE|TRUCK|wake: unusual theodolites +52481|861|28|2|41|72236.26|0.06|0.01|N|O|1997-10-10|1997-10-30|1997-10-18|COLLECT COD|RAIL|he ironic accounts +52482|1607|31|1|1|1508.60|0.02|0.06|A|F|1995-04-19|1995-04-13|1995-05-03|TAKE BACK RETURN|AIR|ructions. quickl +52482|1524|65|2|44|62722.88|0.05|0.05|A|F|1995-02-23|1995-04-23|1995-02-26|COLLECT COD|FOB|uickly carefully ironic platelets. cl +52482|1821|65|3|10|17228.20|0.01|0.05|R|F|1995-02-15|1995-03-21|1995-02-16|TAKE BACK RETURN|AIR|ns haggle alo +52482|1676|77|4|28|44174.76|0.09|0.03|A|F|1995-02-15|1995-04-15|1995-03-06|DELIVER IN PERSON|SHIP|onic packages run about the foxes. even a +52482|1376|77|5|5|6386.85|0.04|0.01|A|F|1995-05-15|1995-03-03|1995-06-07|DELIVER IN PERSON|SHIP|ly express courts. fluffily bold escap +52482|932|35|6|17|31159.81|0.08|0.01|R|F|1995-04-10|1995-03-13|1995-05-01|DELIVER IN PERSON|RAIL|deas. carefully final +52482|1289|64|7|5|5951.40|0.03|0.01|R|F|1995-05-04|1995-04-22|1995-05-23|COLLECT COD|FOB| bold packages. bold accounts +52483|1875|5|1|19|33760.53|0.04|0.07|N|O|1997-11-05|1997-11-17|1997-11-28|NONE|MAIL|ss foxes sleep +52483|385|70|2|7|8997.66|0.10|0.07|N|O|1997-12-01|1997-11-10|1997-12-12|TAKE BACK RETURN|REG AIR|al asymptotes believe +52483|993|96|3|46|87123.54|0.07|0.05|N|O|1998-01-23|1997-11-12|1998-02-15|TAKE BACK RETURN|RAIL|sits above the caref +52483|1029|30|4|39|36270.78|0.00|0.01|N|O|1997-12-11|1997-11-03|1997-12-23|COLLECT COD|FOB|es unwind furiously blithely ironic ideas. +52484|408|9|1|20|26168.00|0.01|0.01|N|O|1996-07-14|1996-06-22|1996-08-13|COLLECT COD|AIR|ly final dependenc +52484|1562|83|2|48|70250.88|0.05|0.08|N|O|1996-08-25|1996-07-11|1996-09-17|COLLECT COD|FOB|elets cajole quickly carefully unusua +52484|1132|41|3|25|25828.25|0.03|0.05|N|O|1996-05-28|1996-08-06|1996-06-20|NONE|REG AIR|c excuses. special packages un +52484|1961|94|4|35|65203.60|0.05|0.08|N|O|1996-05-29|1996-06-30|1996-06-27|COLLECT COD|SHIP|ions cajole reque +52484|283|11|5|16|18932.48|0.07|0.00|N|O|1996-06-10|1996-08-11|1996-07-01|COLLECT COD|FOB|c packages dete +52485|1479|19|1|13|17946.11|0.10|0.01|N|O|1996-06-30|1996-06-01|1996-07-03|COLLECT COD|TRUCK| final pinto beans cajole quick +52485|182|35|2|24|25972.32|0.08|0.05|N|O|1996-06-03|1996-06-16|1996-06-26|COLLECT COD|FOB|ckly careful +52485|877|44|3|10|17778.70|0.02|0.04|N|O|1996-07-15|1996-05-15|1996-07-20|TAKE BACK RETURN|SHIP| haggle above the furiousl +52485|1500|79|4|31|43446.50|0.06|0.08|N|O|1996-04-22|1996-05-27|1996-05-15|DELIVER IN PERSON|RAIL|arefully unusual excuses use q +52485|1581|2|5|12|17790.96|0.03|0.04|N|O|1996-05-18|1996-05-15|1996-06-17|COLLECT COD|AIR|cial dependencies alongside of the fur +52485|721|54|6|13|21082.36|0.06|0.03|N|O|1996-06-29|1996-06-02|1996-07-16|DELIVER IN PERSON|RAIL|ent, regular ide +52485|1610|93|7|45|68022.45|0.01|0.01|N|O|1996-05-29|1996-05-28|1996-06-15|COLLECT COD|AIR|gular deposits was after the regular +52486|1753|54|1|30|49642.50|0.00|0.07|A|F|1995-04-18|1995-02-18|1995-04-20|COLLECT COD|FOB| accounts alongside of the bl +52486|188|89|2|44|47879.92|0.03|0.01|A|F|1995-01-06|1995-03-04|1995-02-04|DELIVER IN PERSON|FOB|o haggle requests. slyly ironic packages na +52486|499|100|3|23|32188.27|0.09|0.05|A|F|1995-03-28|1995-02-11|1995-04-07|TAKE BACK RETURN|RAIL|uests above the permanent, unusual accoun +52486|915|18|4|44|79900.04|0.07|0.02|R|F|1995-04-26|1995-02-27|1995-05-22|COLLECT COD|FOB|ily special courts +52486|275|76|5|50|58763.50|0.00|0.00|A|F|1995-02-07|1995-03-18|1995-02-16|TAKE BACK RETURN|SHIP|tions. pending +52486|92|93|6|13|12897.17|0.09|0.04|A|F|1995-03-13|1995-03-14|1995-03-16|NONE|TRUCK|s wake unusual accounts. carefully ironic r +52487|1845|89|1|35|61139.40|0.05|0.01|R|F|1994-08-17|1994-07-03|1994-09-07|COLLECT COD|REG AIR|ts. blithely unusual dep +52487|1022|28|2|27|24921.54|0.00|0.07|R|F|1994-06-04|1994-07-15|1994-06-12|DELIVER IN PERSON|TRUCK|al accounts are +52487|1603|4|3|41|61688.60|0.07|0.00|R|F|1994-09-19|1994-08-18|1994-09-27|TAKE BACK RETURN|AIR|t the quickly express theodolites +52487|1637|20|4|18|27695.34|0.10|0.01|R|F|1994-08-06|1994-07-03|1994-08-11|NONE|AIR|fily furious, ironic foxes +52487|1728|29|5|49|79856.28|0.08|0.04|R|F|1994-09-14|1994-07-28|1994-10-14|NONE|MAIL|ons thrash slyly until +52512|1053|24|1|49|46748.45|0.04|0.00|N|O|1995-09-08|1995-08-24|1995-09-11|DELIVER IN PERSON|TRUCK|s sleep. regular, final i +52512|260|42|2|25|29006.50|0.10|0.04|N|O|1995-08-17|1995-09-08|1995-08-30|DELIVER IN PERSON|TRUCK|requests. final, regular instruct +52512|601|95|3|21|31533.60|0.06|0.06|N|O|1995-09-25|1995-08-18|1995-10-10|TAKE BACK RETURN|AIR|xpress pinto beans above t +52512|1058|29|4|35|33566.75|0.04|0.05|N|O|1995-08-19|1995-08-26|1995-08-22|COLLECT COD|MAIL|dolphins cajole against +52512|822|89|5|32|55130.24|0.08|0.00|N|O|1995-08-04|1995-09-18|1995-08-15|COLLECT COD|SHIP|odolites. carefully unusual re +52512|440|70|6|27|36191.88|0.06|0.02|N|O|1995-07-28|1995-09-25|1995-08-22|TAKE BACK RETURN|SHIP|old realms run fluffily of th +52512|443|31|7|27|36272.88|0.08|0.04|N|O|1995-09-21|1995-09-30|1995-10-11|TAKE BACK RETURN|RAIL|owly bold ideas detect blithely slyly +52513|967|36|1|39|72850.44|0.07|0.04|N|O|1996-12-11|1996-12-10|1996-12-15|COLLECT COD|SHIP|ilent accounts. caref +52513|835|36|2|5|8679.15|0.04|0.02|N|O|1997-02-01|1996-12-19|1997-02-17|DELIVER IN PERSON|MAIL|oost fluffily along the deposits. +52513|593|94|3|22|32858.98|0.07|0.07|N|O|1996-10-28|1997-01-11|1996-11-10|COLLECT COD|MAIL|al accounts boost after the furious +52513|376|77|4|8|10210.96|0.09|0.02|N|O|1996-10-30|1996-12-20|1996-11-06|DELIVER IN PERSON|REG AIR|y after the dependencie +52513|969|70|5|48|89758.08|0.04|0.08|N|O|1997-02-06|1996-12-25|1997-03-08|NONE|AIR|ffily after the quickly bold instructions. +52514|76|27|1|1|976.07|0.07|0.07|N|O|1997-09-12|1997-07-05|1997-09-17|DELIVER IN PERSON|FOB|eposits. enticing instructions run against +52514|905|40|2|17|30700.30|0.01|0.02|N|O|1997-08-02|1997-07-06|1997-08-04|TAKE BACK RETURN|SHIP|ar multipliers: quickly slow r +52514|157|36|3|48|50743.20|0.09|0.03|N|O|1997-08-04|1997-08-03|1997-08-06|COLLECT COD|RAIL|ss pinto bea +52514|1001|37|4|39|35178.00|0.07|0.05|N|O|1997-08-27|1997-07-18|1997-09-07|COLLECT COD|SHIP|ticingly regular +52514|1107|80|5|20|20162.00|0.06|0.01|N|O|1997-07-29|1997-07-12|1997-08-17|NONE|TRUCK|heodolites. quickly ironic packages +52514|1203|78|6|22|24292.40|0.03|0.05|N|O|1997-09-18|1997-08-23|1997-09-27|COLLECT COD|FOB|ages about the carefully bold packa +52515|408|96|1|23|30093.20|0.04|0.04|N|O|1997-01-20|1997-03-11|1997-02-05|COLLECT COD|TRUCK|to beans. de +52516|1369|8|1|45|57166.20|0.06|0.01|R|F|1992-03-21|1992-03-06|1992-04-01|DELIVER IN PERSON|AIR|counts. blithely expr +52516|269|51|2|1|1169.26|0.01|0.08|R|F|1992-03-24|1992-02-20|1992-04-07|COLLECT COD|TRUCK|usly about the fluff +52516|1634|76|3|48|73710.24|0.01|0.05|R|F|1992-02-05|1992-03-24|1992-02-06|DELIVER IN PERSON|SHIP|re carefully. +52516|1075|76|4|9|8784.63|0.03|0.05|A|F|1992-01-12|1992-03-28|1992-01-26|DELIVER IN PERSON|MAIL|sleep busily. blithely sly acco +52516|901|4|5|5|9009.50|0.00|0.00|A|F|1992-03-19|1992-03-30|1992-04-08|COLLECT COD|MAIL|ding to the even pinto +52516|1561|62|6|8|11700.48|0.04|0.04|R|F|1992-03-06|1992-03-29|1992-03-17|DELIVER IN PERSON|RAIL| theodolites ar +52517|763|60|1|23|38266.48|0.06|0.00|A|F|1992-01-30|1992-03-27|1992-02-27|DELIVER IN PERSON|SHIP|lyly express platelets +52517|1681|23|2|41|64889.88|0.05|0.01|A|F|1992-03-27|1992-02-25|1992-04-25|NONE|AIR|oubt about the ironic pinto beans. the +52517|1378|17|3|24|30704.88|0.06|0.07|R|F|1992-03-30|1992-02-07|1992-04-16|TAKE BACK RETURN|RAIL|ructions cajole +52518|1793|78|1|35|59317.65|0.10|0.05|R|F|1992-06-11|1992-06-09|1992-06-24|TAKE BACK RETURN|TRUCK|out the blithel +52518|661|93|2|50|78083.00|0.01|0.03|A|F|1992-07-14|1992-06-14|1992-08-09|DELIVER IN PERSON|RAIL|sts cajole blithely above the blithely ev +52518|777|78|3|48|80532.96|0.06|0.08|R|F|1992-07-30|1992-05-22|1992-08-25|TAKE BACK RETURN|AIR|iously carefully silent ideas. +52518|1507|88|4|33|46480.50|0.01|0.04|A|F|1992-04-05|1992-05-26|1992-04-28|NONE|SHIP|each furiously i +52518|1038|9|5|47|44134.41|0.06|0.05|A|F|1992-05-14|1992-06-21|1992-06-13|DELIVER IN PERSON|SHIP| carefully acco +52518|1544|85|6|36|52039.44|0.05|0.08|R|F|1992-07-22|1992-06-20|1992-08-15|TAKE BACK RETURN|RAIL|leep blithely +52519|508|39|1|9|12676.50|0.01|0.08|R|F|1992-07-30|1992-06-27|1992-08-21|COLLECT COD|FOB|refully. even, ironic requests hinder +52519|1377|92|2|9|11505.33|0.06|0.00|R|F|1992-07-16|1992-06-03|1992-08-04|DELIVER IN PERSON|AIR|ic platelets are. dependenci +52519|392|49|3|37|47818.43|0.10|0.03|A|F|1992-08-19|1992-06-20|1992-09-10|DELIVER IN PERSON|AIR|ing to the express, final request +52519|1334|11|4|32|39530.56|0.05|0.02|A|F|1992-08-25|1992-07-06|1992-09-04|TAKE BACK RETURN|REG AIR|encies use sometimes about the blithely +52544|386|15|1|37|47596.06|0.04|0.08|A|F|1992-05-12|1992-03-11|1992-05-26|TAKE BACK RETURN|REG AIR|ic packages wake against the +52544|721|18|2|26|42164.72|0.06|0.04|A|F|1992-04-30|1992-05-02|1992-05-06|COLLECT COD|RAIL|ternes sleep furiousl +52544|1419|20|3|19|25087.79|0.10|0.08|R|F|1992-05-27|1992-03-12|1992-06-06|DELIVER IN PERSON|MAIL|usly even +52545|1487|27|1|46|63870.08|0.02|0.08|N|O|1996-05-27|1996-03-28|1996-06-08|COLLECT COD|REG AIR|the asympto +52545|1637|61|2|30|46158.90|0.10|0.05|N|O|1996-04-10|1996-05-22|1996-05-03|NONE|RAIL| pending reques +52545|1874|18|3|11|19534.57|0.09|0.03|N|O|1996-04-01|1996-05-03|1996-04-16|DELIVER IN PERSON|REG AIR|hlessly ironic ideas are slyl +52545|1140|77|4|43|44769.02|0.06|0.02|N|O|1996-05-26|1996-05-07|1996-06-02|NONE|MAIL|ven, bold instructions. final +52545|1946|47|5|44|81309.36|0.08|0.04|N|O|1996-06-11|1996-05-07|1996-06-19|COLLECT COD|REG AIR|ld foxes integrate about the furiously +52546|1914|47|1|15|27238.65|0.01|0.00|N|O|1997-07-22|1997-06-04|1997-08-16|NONE|MAIL|ing courts affix carefully. ironi +52546|1324|39|2|24|29407.68|0.05|0.08|N|O|1997-07-13|1997-05-19|1997-08-01|DELIVER IN PERSON|MAIL|ely final fox +52546|771|72|3|17|28420.09|0.05|0.08|N|O|1997-04-15|1997-05-26|1997-04-20|DELIVER IN PERSON|REG AIR|regular foxes. blithely +52546|1834|64|4|8|13886.64|0.07|0.04|N|O|1997-05-31|1997-05-22|1997-06-21|NONE|SHIP|al packages print carefully against +52546|225|26|5|13|14627.86|0.10|0.01|N|O|1997-06-14|1997-06-08|1997-07-07|COLLECT COD|RAIL|ounts are idly unusual instructions. depos +52547|1538|19|1|46|66218.38|0.04|0.08|N|O|1997-01-28|1997-01-31|1997-02-15|COLLECT COD|REG AIR|ar excuses use. ironic deposits wake +52547|1829|30|2|16|27693.12|0.09|0.08|N|O|1996-12-26|1997-02-02|1997-01-15|NONE|SHIP|inal deposits cajole carefully careful +52547|1636|37|3|10|15376.30|0.01|0.01|N|O|1997-03-12|1997-02-09|1997-03-21|COLLECT COD|MAIL|quests despite the special +52547|1350|27|4|17|21272.95|0.08|0.04|N|O|1997-04-20|1997-02-24|1997-05-06|NONE|MAIL|y special notornis nag +52547|768|33|5|44|73425.44|0.06|0.07|N|O|1997-03-17|1997-02-04|1997-03-25|COLLECT COD|TRUCK|lets cajole +52548|510|41|1|5|7052.55|0.03|0.02|N|O|1996-03-09|1996-02-28|1996-03-16|COLLECT COD|FOB|egular, ironic requests. ideas haggle slyly +52548|92|18|2|41|40675.69|0.08|0.05|N|O|1996-04-12|1996-02-03|1996-04-24|NONE|TRUCK|re carefully. carefully bold plate +52548|1332|47|3|30|36999.90|0.06|0.05|N|O|1996-03-13|1996-03-27|1996-04-02|DELIVER IN PERSON|MAIL|efully around the special ideas +52548|61|87|4|7|6727.42|0.04|0.05|N|O|1996-03-07|1996-03-28|1996-03-20|NONE|TRUCK| haggle package +52548|1254|55|5|28|32347.00|0.02|0.00|N|O|1996-01-18|1996-02-03|1996-02-17|NONE|MAIL|sts doze. final, silent th +52548|447|77|6|21|28296.24|0.08|0.02|N|O|1996-05-02|1996-02-05|1996-05-26|TAKE BACK RETURN|MAIL|ly regular id +52549|493|94|1|21|29263.29|0.03|0.07|N|O|1996-12-22|1996-12-27|1997-01-04|NONE|SHIP|bove the slyly even ideas. +52549|572|33|2|18|26506.26|0.06|0.03|N|O|1996-12-05|1997-01-12|1996-12-28|DELIVER IN PERSON|AIR|azzle accounts. regular, regular requ +52549|1343|20|3|50|62217.00|0.06|0.01|N|O|1997-01-09|1997-02-14|1997-01-26|NONE|FOB|s wake furiously. quickly ruthless +52549|200|27|4|34|37406.80|0.05|0.07|N|O|1996-12-03|1997-01-18|1997-01-02|TAKE BACK RETURN|REG AIR|s even requests. blithely express accounts +52549|1259|60|5|4|4641.00|0.06|0.00|N|O|1997-01-31|1996-12-31|1997-02-15|COLLECT COD|TRUCK| ironic ideas hang against the blithely +52549|1822|66|6|27|46543.14|0.02|0.07|N|O|1997-03-20|1997-01-26|1997-04-08|COLLECT COD|RAIL|nto beans maintain. carefully regula +52549|189|68|7|26|28318.68|0.00|0.05|N|O|1996-12-23|1997-01-20|1997-01-03|COLLECT COD|RAIL|s theodolit +52550|1152|25|1|31|32647.65|0.10|0.05|N|O|1997-05-24|1997-03-19|1997-06-07|DELIVER IN PERSON|REG AIR| the slyly regu +52550|548|39|2|9|13036.86|0.00|0.07|N|O|1997-03-04|1997-03-30|1997-03-07|TAKE BACK RETURN|SHIP|y from the regular dependencies. furio +52550|1589|10|3|1|1490.58|0.08|0.06|N|O|1997-05-29|1997-04-03|1997-06-10|DELIVER IN PERSON|REG AIR|y pending deposits boost! blithely r +52550|249|50|4|35|40223.40|0.06|0.08|N|O|1997-03-22|1997-03-13|1997-04-20|TAKE BACK RETURN|MAIL|e of the unusual accounts. pending acco +52550|1107|16|5|39|39315.90|0.01|0.03|N|O|1997-04-18|1997-04-25|1997-04-27|DELIVER IN PERSON|AIR|ous accounts boost blithe +52550|1757|42|6|34|56397.50|0.04|0.08|N|O|1997-02-13|1997-03-24|1997-02-16|DELIVER IN PERSON|AIR|express, even theodolites accordi +52551|866|66|1|28|49472.08|0.09|0.01|A|F|1995-01-24|1995-04-21|1995-02-13|TAKE BACK RETURN|TRUCK|le slyly for the bravely pendin +52551|1433|12|2|41|54711.63|0.06|0.01|R|F|1995-05-12|1995-04-06|1995-06-01|DELIVER IN PERSON|MAIL|anent requests. +52576|450|38|1|40|54018.00|0.10|0.02|A|F|1994-06-30|1994-04-28|1994-07-04|COLLECT COD|REG AIR|slyly above the unusual deposits. packages +52576|1119|28|2|16|16321.76|0.05|0.07|R|F|1994-06-25|1994-05-16|1994-07-21|DELIVER IN PERSON|SHIP|ular braids wake. sometimes final d +52576|1663|5|3|40|62586.40|0.03|0.02|R|F|1994-06-28|1994-05-20|1994-07-16|NONE|AIR|inal deposits. packages nag. furi +52576|378|35|4|3|3835.11|0.02|0.06|A|F|1994-06-19|1994-05-03|1994-06-22|COLLECT COD|TRUCK|packages. carefull +52577|220|21|1|47|52650.34|0.07|0.08|N|O|1997-09-24|1997-10-16|1997-10-21|COLLECT COD|FOB|ss asymptotes. furiously bold +52577|851|18|2|24|42044.40|0.04|0.05|N|O|1997-08-31|1997-09-26|1997-09-12|TAKE BACK RETURN|FOB| of the regular, +52578|1445|63|1|29|39046.76|0.03|0.07|A|F|1995-03-17|1995-05-10|1995-03-18|TAKE BACK RETURN|RAIL|refully express theodolites w +52578|508|9|2|35|49297.50|0.00|0.00|R|F|1995-03-21|1995-06-05|1995-03-28|COLLECT COD|FOB|s wake quickly. ironic, final a +52578|819|20|3|10|17198.10|0.10|0.05|R|F|1995-04-22|1995-06-05|1995-05-11|NONE|AIR|thely even pinto beans wake a +52578|277|32|4|16|18836.32|0.01|0.02|N|O|1995-06-25|1995-05-29|1995-06-26|COLLECT COD|RAIL|furiously final idea +52578|271|53|5|46|53878.42|0.01|0.03|R|F|1995-03-09|1995-05-07|1995-04-03|NONE|RAIL|ts. slyly even requests wake fluffily +52579|1608|91|1|7|10567.20|0.04|0.02|N|O|1996-02-28|1996-05-13|1996-02-29|COLLECT COD|RAIL|al platelets! +52579|718|19|2|4|6474.84|0.01|0.04|N|O|1996-04-07|1996-04-24|1996-04-25|DELIVER IN PERSON|MAIL|refully quiet theodolites: fin +52579|788|85|3|40|67551.20|0.07|0.00|N|O|1996-05-22|1996-04-05|1996-05-28|NONE|REG AIR|grow never. +52580|1864|65|1|43|75931.98|0.04|0.05|R|F|1992-10-15|1992-11-14|1992-10-21|TAKE BACK RETURN|RAIL|to integrate carefu +52580|6|7|2|12|10872.00|0.10|0.02|R|F|1992-11-14|1992-09-28|1992-11-15|DELIVER IN PERSON|SHIP|es sleep carefully ironic packag +52580|1973|62|3|35|65623.95|0.03|0.07|R|F|1992-12-09|1992-11-05|1992-12-26|COLLECT COD|REG AIR|deas are quickly regu +52580|112|91|4|8|8096.88|0.03|0.00|R|F|1992-09-06|1992-11-07|1992-10-03|NONE|FOB|somas about the +52580|1866|10|5|47|83089.42|0.10|0.04|A|F|1992-09-28|1992-09-30|1992-10-28|NONE|RAIL|ges snooze above the +52580|511|12|6|48|67752.48|0.01|0.02|A|F|1992-09-28|1992-10-13|1992-10-20|DELIVER IN PERSON|AIR|ly thin pinto beans wak +52580|676|8|7|24|37840.08|0.02|0.05|R|F|1992-09-14|1992-10-09|1992-10-11|NONE|SHIP|usual packages. carefully idle d +52581|729|62|1|28|45632.16|0.01|0.00|N|O|1995-11-14|1995-11-11|1995-11-20|DELIVER IN PERSON|REG AIR|ly ironic deposits a +52581|1105|78|2|16|16097.60|0.00|0.08|N|O|1995-10-11|1995-11-22|1995-10-22|TAKE BACK RETURN|RAIL|deposits cajole furiou +52582|1923|56|1|16|29198.72|0.07|0.02|N|O|1997-06-11|1997-06-09|1997-07-11|COLLECT COD|RAIL|re blithely a +52582|33|84|2|22|20526.66|0.05|0.04|N|O|1997-07-01|1997-04-19|1997-07-19|NONE|TRUCK|ng packages. +52582|1123|96|3|10|10241.20|0.00|0.03|N|O|1997-06-07|1997-05-02|1997-07-02|TAKE BACK RETURN|MAIL|the theodo +52583|1837|38|1|33|57381.39|0.10|0.03|N|O|1997-07-05|1997-06-04|1997-07-27|NONE|FOB| unusual deposits det +52583|874|8|2|26|46146.62|0.05|0.01|N|O|1997-08-10|1997-06-21|1997-08-14|DELIVER IN PERSON|MAIL|dolphins integrate multiplie +52583|1359|98|3|3|3781.05|0.04|0.07|N|O|1997-06-16|1997-07-11|1997-06-27|NONE|FOB|uickly final, regular requests. regular a +52583|652|46|4|46|71421.90|0.02|0.08|N|O|1997-05-23|1997-06-10|1997-06-17|NONE|FOB|requests are sometimes above the +52608|951|86|1|8|14815.60|0.06|0.04|A|F|1994-01-29|1994-03-07|1994-02-25|TAKE BACK RETURN|AIR|s haggle slyly even requests. slyly sly e +52608|1914|3|2|22|39950.02|0.00|0.04|R|F|1994-03-15|1994-04-12|1994-03-28|COLLECT COD|SHIP| according to the final packages. +52608|854|88|3|36|63174.60|0.10|0.03|A|F|1994-05-16|1994-04-08|1994-06-12|COLLECT COD|FOB|ng the busy, pen +52608|830|30|4|21|36347.43|0.04|0.06|A|F|1994-03-10|1994-03-03|1994-04-03|DELIVER IN PERSON|TRUCK| to the slowly ironic somas. slyly +52608|16|92|5|28|25648.28|0.00|0.07|R|F|1994-05-07|1994-03-10|1994-06-05|DELIVER IN PERSON|FOB|ly ironic asymptotes against +52608|1522|3|6|16|22776.32|0.07|0.04|A|F|1994-04-26|1994-03-09|1994-05-15|DELIVER IN PERSON|REG AIR|regular deposits about the b +52609|872|39|1|9|15955.83|0.05|0.06|N|O|1997-05-09|1997-05-11|1997-05-25|DELIVER IN PERSON|RAIL|al deposits boost. blithely regular +52609|1296|8|2|44|52680.76|0.03|0.02|N|O|1997-03-09|1997-05-15|1997-03-19|COLLECT COD|TRUCK|ly bold packages boost even package +52610|1497|98|1|9|12586.41|0.08|0.06|R|F|1993-04-04|1993-03-14|1993-04-28|COLLECT COD|FOB|ickly regular req +52611|813|47|1|41|70266.21|0.08|0.01|N|O|1995-08-05|1995-07-20|1995-08-21|DELIVER IN PERSON|SHIP|lthily regular requests after th +52611|1660|61|2|12|18739.92|0.08|0.07|N|F|1995-06-07|1995-06-16|1995-06-22|COLLECT COD|AIR|leep blithely agai +52611|1100|71|3|6|6006.60|0.03|0.08|A|F|1995-05-19|1995-05-28|1995-06-07|COLLECT COD|TRUCK|lyly express instructio +52611|1042|43|4|48|45265.92|0.04|0.06|R|F|1995-05-17|1995-07-19|1995-05-25|TAKE BACK RETURN|TRUCK|posits. instructions use accor +52611|274|75|5|23|27008.21|0.03|0.01|R|F|1995-05-04|1995-07-22|1995-06-01|COLLECT COD|AIR|ial deposits cajole caref +52612|1467|46|1|33|45159.18|0.02|0.08|R|F|1993-01-13|1993-02-06|1993-01-21|NONE|AIR|ic, unusual deposits. furi +52613|1013|14|1|24|21936.24|0.08|0.02|R|F|1994-12-10|1994-11-15|1994-12-21|TAKE BACK RETURN|MAIL|uctions above th +52614|246|74|1|31|35533.44|0.05|0.03|R|F|1992-06-17|1992-05-30|1992-06-26|COLLECT COD|REG AIR|ctions cajole slyly final theodolite +52614|1176|49|2|20|21543.40|0.01|0.00|A|F|1992-04-17|1992-06-17|1992-04-24|DELIVER IN PERSON|FOB|y regular instructions cajol +52615|185|38|1|43|46662.74|0.05|0.04|R|F|1994-12-02|1995-01-16|1995-01-01|COLLECT COD|AIR|posits. fluffily unusual +52615|279|34|2|23|27123.21|0.03|0.03|A|F|1995-01-30|1995-01-13|1995-02-11|NONE|TRUCK|nic, regular requests. furio +52615|1204|5|3|50|55260.00|0.04|0.05|A|F|1994-11-23|1994-11-19|1994-12-02|NONE|SHIP|e the carefully pending ins +52615|1312|27|4|5|6066.55|0.09|0.02|R|F|1994-11-07|1994-11-19|1994-11-24|DELIVER IN PERSON|FOB| permanent acc +52615|741|74|5|26|42685.24|0.04|0.05|A|F|1995-01-19|1994-11-20|1995-01-28|TAKE BACK RETURN|REG AIR|against the quic +52615|908|11|6|41|74164.90|0.08|0.01|A|F|1995-02-09|1994-12-11|1995-02-28|DELIVER IN PERSON|TRUCK| sentiments sleep carefully furiousl +52640|1648|72|1|48|74382.72|0.08|0.06|A|F|1995-01-21|1995-02-05|1995-01-23|TAKE BACK RETURN|FOB|the special platelet +52640|432|33|2|37|49299.91|0.02|0.05|A|F|1995-03-04|1995-03-16|1995-03-20|NONE|FOB|kly pending packages cajole iron +52640|1393|94|3|15|19415.85|0.00|0.05|A|F|1995-05-03|1995-03-16|1995-05-15|DELIVER IN PERSON|FOB|ans are slyly. regular ideas haggle b +52640|1437|38|4|47|62906.21|0.02|0.00|A|F|1995-04-11|1995-03-26|1995-04-18|COLLECT COD|REG AIR|xes use furiously af +52640|1870|71|5|24|42524.88|0.07|0.02|A|F|1995-02-18|1995-02-02|1995-02-24|TAKE BACK RETURN|MAIL|endencies. slyly final ideas sleep +52641|1416|34|1|42|55331.22|0.10|0.03|A|F|1994-01-22|1993-12-17|1994-01-25|DELIVER IN PERSON|REG AIR|e special, unusual pla +52641|620|14|2|27|41056.74|0.00|0.02|R|F|1993-12-05|1993-12-13|1994-01-01|COLLECT COD|TRUCK| pinto beans. blithely even +52641|1886|73|3|5|8939.40|0.09|0.08|A|F|1993-11-29|1993-12-28|1993-12-24|TAKE BACK RETURN|RAIL|sly-- regularly silent requests t +52641|1822|66|4|7|12066.74|0.04|0.01|A|F|1993-12-31|1993-12-02|1994-01-28|TAKE BACK RETURN|AIR|lly pending requests sleep slyl +52641|1149|22|5|40|42005.60|0.09|0.03|A|F|1993-12-03|1994-01-06|1993-12-05|NONE|FOB|g the final deposits use slyly spec +52641|1177|78|6|41|44204.97|0.10|0.01|R|F|1993-11-03|1994-01-01|1993-11-10|COLLECT COD|AIR|. quickly regular foxes +52642|1855|85|1|44|77301.40|0.08|0.06|N|O|1995-06-20|1995-08-05|1995-07-08|NONE|MAIL| carefully pending sentime +52642|694|88|2|31|49435.39|0.10|0.01|N|O|1995-07-22|1995-08-06|1995-08-11|NONE|TRUCK|al dependencies snooze fluffily +52642|1115|88|3|39|39628.29|0.04|0.03|N|O|1995-09-19|1995-09-11|1995-09-28|DELIVER IN PERSON|RAIL| carefully silent packages haggle qui +52642|1643|67|4|33|50973.12|0.06|0.02|N|O|1995-09-13|1995-09-01|1995-10-01|COLLECT COD|RAIL|inal, ironic instructions wake ca +52642|1908|9|5|12|21718.80|0.09|0.00|N|O|1995-10-04|1995-09-01|1995-10-24|NONE|AIR|ts are about the ironic dolphins. +52642|1481|99|6|39|53916.72|0.05|0.05|N|O|1995-06-29|1995-08-01|1995-07-10|DELIVER IN PERSON|RAIL|ng account +52642|6|7|7|4|3624.00|0.06|0.00|N|O|1995-07-18|1995-08-04|1995-08-14|DELIVER IN PERSON|SHIP|s sublate furiously regular depo +52643|994|97|1|15|28424.85|0.01|0.07|R|F|1993-11-16|1993-11-10|1993-12-01|COLLECT COD|MAIL|er the carefully r +52643|671|65|2|7|11001.69|0.07|0.02|R|F|1993-10-31|1993-12-12|1993-11-12|NONE|MAIL|ter the dependencies affix fu +52644|574|65|1|30|44237.10|0.04|0.04|A|F|1992-08-01|1992-08-04|1992-08-14|DELIVER IN PERSON|RAIL|ecoys. boldly ironic pinto beans wake sly +52644|1628|11|2|14|21414.68|0.00|0.07|A|F|1992-09-05|1992-08-16|1992-09-22|COLLECT COD|REG AIR| foxes use. blithely +52644|1690|14|3|26|41383.94|0.01|0.02|A|F|1992-07-29|1992-08-08|1992-08-21|NONE|FOB|after the carefully pending pla +52644|80|81|4|31|30382.48|0.04|0.04|A|F|1992-07-26|1992-07-27|1992-08-22|TAKE BACK RETURN|TRUCK|ronic ideas. slyly pending accounts wake. c +52644|421|80|5|34|44928.28|0.07|0.03|R|F|1992-07-18|1992-07-22|1992-08-16|COLLECT COD|MAIL|ld detect. special, final instructions w +52644|145|46|6|33|34489.62|0.10|0.02|R|F|1992-08-18|1992-08-11|1992-08-26|NONE|FOB|ts. deposits hinder above the furious +52645|373|58|1|45|57301.65|0.06|0.05|R|F|1992-04-09|1992-05-09|1992-04-27|NONE|AIR|e the regular requests +52645|1783|84|2|6|10108.68|0.07|0.00|A|F|1992-05-14|1992-05-21|1992-06-03|TAKE BACK RETURN|RAIL|o beans wake carefully about the pearls. f +52645|1872|73|3|33|58537.71|0.03|0.01|R|F|1992-04-08|1992-04-26|1992-04-21|TAKE BACK RETURN|AIR|furiously sl +52645|1347|86|4|35|43691.90|0.03|0.04|A|F|1992-06-06|1992-05-11|1992-07-02|COLLECT COD|FOB|sly. slyly silent instructions wake furious +52645|1235|47|5|7|7953.61|0.08|0.02|R|F|1992-06-05|1992-05-13|1992-06-14|TAKE BACK RETURN|SHIP|elets. slyly r +52645|617|18|6|3|4552.83|0.00|0.04|A|F|1992-04-07|1992-04-30|1992-05-01|COLLECT COD|FOB|e. furious +52645|1557|38|7|35|51049.25|0.03|0.05|A|F|1992-06-03|1992-04-29|1992-06-08|TAKE BACK RETURN|AIR|cial ideas. +52646|1279|91|1|22|25965.94|0.07|0.06|N|O|1996-03-27|1996-05-27|1996-04-23|TAKE BACK RETURN|FOB|g excuses across the quickly +52646|388|17|2|10|12883.80|0.08|0.08|N|O|1996-04-20|1996-05-29|1996-05-12|TAKE BACK RETURN|AIR| carefully ironic accounts hagg +52646|428|87|3|1|1328.42|0.05|0.01|N|O|1996-07-03|1996-06-07|1996-07-15|COLLECT COD|RAIL|ly at the fi +52647|1323|24|1|8|9794.56|0.00|0.08|N|O|1997-10-27|1997-08-11|1997-10-29|COLLECT COD|FOB|sly silent +52647|1506|47|2|36|50670.00|0.04|0.01|N|O|1997-10-08|1997-09-22|1997-11-07|TAKE BACK RETURN|FOB| integrate furious +52647|652|53|3|11|17079.15|0.02|0.00|N|O|1997-10-27|1997-08-31|1997-10-29|DELIVER IN PERSON|RAIL|y regular theodolites a +52647|1619|20|4|1|1520.61|0.02|0.04|N|O|1997-09-17|1997-09-17|1997-09-20|TAKE BACK RETURN|MAIL|ts integrate quietly ironic r +52647|854|88|5|17|29832.45|0.06|0.08|N|O|1997-10-13|1997-08-12|1997-10-27|DELIVER IN PERSON|MAIL| sleep blithely. slyly final ideas s +52647|542|43|6|46|66356.84|0.00|0.06|N|O|1997-10-25|1997-09-22|1997-10-26|DELIVER IN PERSON|FOB|s the fluffily bold theodo +52672|1642|25|1|15|23154.60|0.02|0.05|A|F|1995-05-04|1995-02-17|1995-05-08|DELIVER IN PERSON|REG AIR| carefully final, final deposits. ev +52672|1942|75|2|4|7375.76|0.01|0.02|R|F|1995-02-01|1995-02-22|1995-02-23|NONE|MAIL|as haggle slyly. fluffily even th +52672|336|65|3|36|44507.88|0.05|0.04|A|F|1995-03-10|1995-02-24|1995-03-16|COLLECT COD|FOB|ly special waters. slyly +52672|1715|100|4|45|72751.95|0.10|0.03|R|F|1995-04-20|1995-02-27|1995-05-14|DELIVER IN PERSON|RAIL| ironic, bold gifts +52673|1283|84|1|49|58029.72|0.04|0.07|R|F|1992-07-25|1992-07-10|1992-08-08|NONE|SHIP|counts inside the blithely special +52673|1284|22|2|13|15408.64|0.09|0.00|R|F|1992-06-25|1992-06-18|1992-07-16|DELIVER IN PERSON|MAIL|beans cajol +52673|1286|24|3|9|10685.52|0.00|0.08|R|F|1992-06-28|1992-07-22|1992-07-03|TAKE BACK RETURN|AIR|, ironic pinto beans cajo +52673|53|4|4|1|953.05|0.10|0.05|R|F|1992-05-24|1992-07-14|1992-05-25|TAKE BACK RETURN|TRUCK|lyly. accounts sle +52674|1029|65|1|27|25110.54|0.00|0.03|N|O|1996-06-05|1996-06-14|1996-07-01|NONE|RAIL|ges among +52674|1860|61|2|45|79283.70|0.10|0.03|N|O|1996-05-26|1996-06-27|1996-06-09|NONE|RAIL|even deposits hag +52674|253|54|3|44|50743.00|0.05|0.04|N|O|1996-07-30|1996-05-21|1996-08-15|TAKE BACK RETURN|SHIP|dencies play flu +52674|342|99|4|21|26089.14|0.01|0.00|N|O|1996-06-08|1996-07-05|1996-07-01|DELIVER IN PERSON|SHIP|the quickly ironic acc +52674|125|52|5|38|38954.56|0.10|0.05|N|O|1996-05-01|1996-06-13|1996-05-18|COLLECT COD|RAIL|ts are along the quickly pending deposi +52674|246|74|6|6|6877.44|0.05|0.01|N|O|1996-04-28|1996-07-08|1996-05-23|COLLECT COD|AIR|requests. express do +52674|291|73|7|49|58373.21|0.02|0.01|N|O|1996-07-23|1996-07-19|1996-08-18|NONE|SHIP|s. furiously even theodolites sleep acro +52675|680|81|1|25|39517.00|0.03|0.01|N|O|1995-11-30|1995-11-19|1995-12-23|TAKE BACK RETURN|REG AIR|ffily regular deposit +52675|1699|100|2|18|28812.42|0.07|0.07|N|O|1996-02-09|1995-12-13|1996-02-12|COLLECT COD|TRUCK|. slyly even instructions +52675|1455|73|3|9|12208.05|0.01|0.01|N|O|1996-01-29|1995-11-19|1996-02-17|COLLECT COD|REG AIR|odolites might are bli +52675|183|10|4|22|23829.96|0.10|0.00|N|O|1995-12-07|1995-11-17|1995-12-25|NONE|AIR| sleep furiously final ideas. bol +52675|411|99|5|21|27539.61|0.02|0.01|N|O|1995-12-19|1995-11-14|1995-12-21|NONE|RAIL| sheaves. bold accounts against the +52675|662|56|6|45|70319.70|0.10|0.01|N|O|1996-02-01|1995-12-04|1996-02-08|TAKE BACK RETURN|FOB|encies hagg +52675|330|31|7|44|54134.52|0.05|0.00|N|O|1995-12-09|1995-11-17|1995-12-26|TAKE BACK RETURN|FOB|nding accounts dazzle fluffily never reg +52676|443|73|1|9|12090.96|0.05|0.08|A|F|1992-09-17|1992-11-24|1992-09-29|COLLECT COD|TRUCK| carefully +52676|1848|92|2|2|3499.68|0.08|0.05|A|F|1992-11-07|1992-10-02|1992-12-03|TAKE BACK RETURN|MAIL|ideas. even pint +52676|627|59|3|24|36662.88|0.03|0.03|A|F|1992-09-08|1992-11-12|1992-10-05|COLLECT COD|REG AIR|uriously final pinto beans against +52676|421|9|4|47|62106.74|0.00|0.03|A|F|1992-11-03|1992-10-21|1992-11-19|NONE|MAIL|leep alongsi +52676|539|70|5|2|2879.06|0.04|0.04|A|F|1992-11-04|1992-09-30|1992-12-02|COLLECT COD|AIR| even packages sleep carefully ironic +52676|441|42|6|6|8048.64|0.05|0.05|R|F|1992-09-16|1992-10-26|1992-10-07|NONE|RAIL|ngside of the even deposits nod slyly even +52676|1311|26|7|46|55766.26|0.01|0.04|R|F|1992-11-05|1992-11-09|1992-11-16|TAKE BACK RETURN|AIR| warthogs. deposits cajole carefully along +52677|73|49|1|12|11676.84|0.04|0.01|R|F|1994-03-28|1994-04-23|1994-03-30|DELIVER IN PERSON|RAIL| final instructions sleep iro +52678|1941|74|1|31|57131.14|0.00|0.04|R|F|1992-11-07|1992-10-01|1992-11-30|TAKE BACK RETURN|REG AIR| pending foxes. furiously final requests +52678|1646|29|2|47|72739.08|0.01|0.02|A|F|1992-10-16|1992-10-24|1992-10-24|DELIVER IN PERSON|REG AIR| packages. carefully +52678|1674|75|3|34|53572.78|0.07|0.00|A|F|1992-08-01|1992-09-17|1992-08-10|TAKE BACK RETURN|SHIP|ts. furiously bo +52678|1233|8|4|35|39698.05|0.00|0.00|A|F|1992-08-12|1992-10-03|1992-09-01|NONE|SHIP|ng deposits. ruthless frets us +52679|690|22|1|36|57264.84|0.03|0.08|N|O|1996-06-16|1996-05-20|1996-07-04|TAKE BACK RETURN|TRUCK|xes. packages according to the expr +52704|86|62|1|12|11832.96|0.08|0.08|A|F|1994-01-27|1994-02-19|1994-01-31|COLLECT COD|TRUCK|carefully +52704|333|90|2|39|48099.87|0.09|0.06|A|F|1994-04-11|1994-02-06|1994-04-27|TAKE BACK RETURN|FOB|es wake even deposits. blith +52704|363|20|3|27|34110.72|0.01|0.08|R|F|1994-02-17|1994-02-02|1994-02-23|TAKE BACK RETURN|FOB|. final requests cajole carefully ste +52704|1623|47|4|42|64034.04|0.10|0.08|R|F|1994-03-20|1994-03-04|1994-04-11|NONE|MAIL| blithely pending excuses. c +52705|732|29|1|18|29389.14|0.08|0.03|N|O|1998-09-12|1998-09-27|1998-10-12|TAKE BACK RETURN|MAIL|e slyly enticing platele +52705|268|23|2|40|46730.40|0.10|0.08|N|O|1998-07-18|1998-09-25|1998-08-05|COLLECT COD|TRUCK|en excuses use quickly against th +52705|1538|19|3|39|56141.67|0.02|0.00|N|O|1998-10-19|1998-08-05|1998-11-12|COLLECT COD|TRUCK|y? requests according to the bl +52705|681|75|4|3|4745.04|0.08|0.05|N|O|1998-09-24|1998-07-31|1998-10-18|COLLECT COD|MAIL|ow pinto beans. express accounts nag bl +52706|1241|53|1|37|42262.88|0.06|0.05|R|F|1992-08-18|1992-08-18|1992-09-05|DELIVER IN PERSON|MAIL|even accounts alongside of the +52706|306|63|2|49|59108.70|0.06|0.05|A|F|1992-10-20|1992-08-27|1992-11-05|COLLECT COD|MAIL| lose among th +52706|1128|29|3|21|21611.52|0.06|0.01|R|F|1992-08-14|1992-09-08|1992-08-15|COLLECT COD|AIR|ress, regular excuses slee +52707|841|42|1|47|81866.48|0.03|0.01|N|O|1996-11-17|1996-09-25|1996-11-27|NONE|AIR|egular, regula +52707|1864|65|2|47|82995.42|0.08|0.05|N|O|1996-09-29|1996-10-31|1996-10-22|COLLECT COD|REG AIR|ounts wake. bold, re +52707|1529|10|3|23|32901.96|0.00|0.08|N|O|1996-12-05|1996-09-24|1996-12-16|COLLECT COD|TRUCK|accounts. blithely +52707|1657|58|4|29|45200.85|0.10|0.03|N|O|1996-10-02|1996-09-21|1996-11-01|TAKE BACK RETURN|TRUCK|pearls cajole. ironic deposits pri +52708|1082|53|1|49|48170.92|0.02|0.05|N|O|1997-04-21|1997-04-04|1997-04-25|NONE|RAIL| ideas. furi +52708|1699|82|2|27|43218.63|0.07|0.05|N|O|1997-03-27|1997-05-10|1997-04-13|NONE|RAIL|al requests are blithely f +52709|1847|77|1|42|73451.28|0.00|0.06|R|F|1994-12-19|1994-11-28|1994-12-29|COLLECT COD|AIR|ing theodolites cajole furio +52710|1822|52|1|37|63781.34|0.00|0.06|A|F|1993-11-29|1993-12-14|1993-12-27|NONE|FOB|inal accounts haggle. caref +52711|1260|61|1|23|26708.98|0.06|0.02|N|O|1995-10-15|1995-10-31|1995-10-27|TAKE BACK RETURN|TRUCK| careful packages +52711|492|93|2|28|38989.72|0.00|0.05|N|O|1995-12-16|1995-12-15|1995-12-29|DELIVER IN PERSON|MAIL|. blithely regular requests p +52711|888|22|3|21|37566.48|0.01|0.06|N|O|1995-10-06|1995-10-28|1995-10-23|COLLECT COD|REG AIR|ndle furio +52711|1545|46|4|49|70880.46|0.09|0.03|N|O|1995-10-25|1995-10-30|1995-11-04|TAKE BACK RETURN|REG AIR|lyly final packages wake; pending +52711|1877|78|5|17|30240.79|0.06|0.00|N|O|1995-10-11|1995-11-08|1995-11-05|TAKE BACK RETURN|TRUCK|ss dolphins sle +52711|402|32|6|49|63817.60|0.05|0.04|N|O|1995-11-28|1995-11-05|1995-12-12|TAKE BACK RETURN|AIR|. silent, unusual package +52711|664|65|7|35|54763.10|0.07|0.02|N|O|1995-12-23|1995-12-02|1996-01-15|DELIVER IN PERSON|MAIL| special asymptotes are slyly against the +52736|757|54|1|2|3315.50|0.08|0.04|N|O|1998-08-09|1998-08-31|1998-09-03|TAKE BACK RETURN|RAIL|y across the re +52736|272|27|2|13|15239.51|0.08|0.05|N|O|1998-09-18|1998-07-10|1998-10-08|TAKE BACK RETURN|TRUCK|t the slyly regular pac +52736|834|1|3|38|65923.54|0.06|0.06|N|O|1998-09-04|1998-07-20|1998-09-16|NONE|SHIP|ly pending pinto beans haggle furiously idl +52736|143|22|4|40|41725.60|0.09|0.08|N|O|1998-07-25|1998-07-09|1998-08-06|TAKE BACK RETURN|RAIL|quickly special accoun +52737|297|79|1|17|20353.93|0.09|0.04|R|F|1994-02-19|1994-01-31|1994-02-24|NONE|TRUCK| are among the furiously regular +52737|1311|50|2|32|38793.92|0.07|0.03|R|F|1994-03-08|1994-01-06|1994-03-22|DELIVER IN PERSON|AIR|ticing dependen +52737|1251|89|3|34|39176.50|0.03|0.08|R|F|1994-02-08|1994-02-02|1994-02-20|DELIVER IN PERSON|REG AIR|lets cajole quickly regular theodolites. pi +52737|189|68|4|40|43567.20|0.00|0.06|A|F|1994-01-19|1993-12-14|1994-02-04|COLLECT COD|REG AIR|the slyly final platelets. carefully specia +52737|1084|85|5|3|2955.24|0.09|0.03|R|F|1993-12-13|1994-01-27|1993-12-29|COLLECT COD|MAIL|? unusual accoun +52738|180|7|1|15|16202.70|0.01|0.02|N|O|1996-10-26|1996-09-16|1996-11-14|NONE|TRUCK|s sleep quickly. express, regul +52738|660|54|2|6|9363.96|0.02|0.03|N|O|1996-11-06|1996-09-30|1996-11-30|DELIVER IN PERSON|FOB|ccounts! bold, bold deposits sleep. fu +52739|424|83|1|15|19866.30|0.03|0.06|A|F|1994-03-21|1994-03-02|1994-04-18|NONE|RAIL|ctions. theodolites a +52739|1024|60|2|7|6475.14|0.04|0.06|R|F|1994-02-04|1994-02-09|1994-03-02|TAKE BACK RETURN|REG AIR|intain express req +52740|486|16|1|34|47140.32|0.00|0.04|N|O|1996-11-05|1996-09-08|1996-12-03|NONE|SHIP| ironic deposits. pinto beans sleep +52740|91|42|2|17|16848.53|0.06|0.02|N|O|1996-07-21|1996-08-24|1996-08-01|NONE|AIR|iously careful deposits. carefully regular +52740|1827|57|3|19|32847.58|0.00|0.08|N|O|1996-07-30|1996-08-30|1996-08-08|DELIVER IN PERSON|MAIL| boldly pending accounts detect furious +52741|689|90|1|17|27024.56|0.02|0.07|N|O|1998-07-31|1998-08-11|1998-08-23|NONE|FOB|s are slyly furiously final depos +52741|999|100|2|35|66499.65|0.09|0.04|N|O|1998-06-23|1998-08-15|1998-07-10|COLLECT COD|TRUCK|about the slyly even ideas us +52741|1443|83|3|15|20166.60|0.06|0.01|N|O|1998-06-16|1998-07-23|1998-07-08|DELIVER IN PERSON|MAIL|quickly unusual, express ideas. quickly ir +52741|101|54|4|35|35038.50|0.00|0.05|N|O|1998-08-25|1998-07-25|1998-09-07|COLLECT COD|FOB|bold accounts nag blithely furiously ironic +52741|642|43|5|3|4627.92|0.02|0.05|N|O|1998-06-02|1998-06-28|1998-06-13|TAKE BACK RETURN|SHIP|s. even dolphins cajole q +52741|1746|47|6|24|39545.76|0.10|0.00|N|O|1998-07-16|1998-08-10|1998-08-01|COLLECT COD|MAIL|nic deposit +52741|1726|27|7|12|19532.64|0.03|0.03|N|O|1998-07-29|1998-07-25|1998-08-16|DELIVER IN PERSON|RAIL|foxes cajole slyly +52742|1926|27|1|7|12795.44|0.04|0.04|N|O|1995-08-19|1995-07-21|1995-09-04|DELIVER IN PERSON|AIR|latelets u +52743|1231|69|1|41|46421.43|0.06|0.04|A|F|1993-08-31|1993-08-08|1993-09-13|DELIVER IN PERSON|AIR|capades sleep d +52743|133|60|2|28|28927.64|0.00|0.07|A|F|1993-07-08|1993-10-01|1993-07-26|TAKE BACK RETURN|RAIL|gside of the packages. slyly bol +52768|587|78|1|16|23801.28|0.03|0.08|N|O|1998-03-14|1998-02-24|1998-04-02|TAKE BACK RETURN|TRUCK|ously unusu +52768|1363|2|2|21|26551.56|0.10|0.07|N|O|1998-04-01|1998-02-14|1998-04-07|TAKE BACK RETURN|TRUCK|s are. fluffily silent deposit +52768|1302|3|3|33|39708.90|0.10|0.04|N|O|1997-12-29|1998-01-28|1997-12-30|TAKE BACK RETURN|TRUCK|quests integrate above the +52768|1253|54|4|13|15005.25|0.03|0.03|N|O|1997-12-22|1998-03-14|1998-01-13|COLLECT COD|TRUCK|uriously even excuses among the ironic, +52768|368|69|5|42|53271.12|0.09|0.06|N|O|1998-01-29|1998-02-15|1998-02-10|COLLECT COD|REG AIR|slyly final requests boost furiously. +52768|1736|21|6|20|32754.60|0.01|0.06|N|O|1998-01-01|1998-02-24|1998-01-03|DELIVER IN PERSON|FOB|ular theodol +52769|849|50|1|15|26247.60|0.00|0.03|N|O|1996-05-10|1996-06-19|1996-06-06|TAKE BACK RETURN|TRUCK|lthy accounts wake furiously +52769|1160|97|2|14|14856.24|0.06|0.01|N|O|1996-07-21|1996-05-21|1996-07-23|TAKE BACK RETURN|MAIL| about the regular accounts. furiou +52769|1475|76|3|13|17894.11|0.08|0.05|N|O|1996-05-30|1996-05-28|1996-06-07|NONE|AIR|, unusual asymptotes use +52769|1894|81|4|7|12571.23|0.02|0.03|N|O|1996-06-04|1996-06-01|1996-06-30|TAKE BACK RETURN|REG AIR|o the theodolites. blithely ev +52770|19|20|1|39|35841.39|0.07|0.06|N|O|1996-07-23|1996-07-05|1996-08-10|TAKE BACK RETURN|TRUCK|ully regular multiplie +52770|971|6|2|10|18719.70|0.05|0.00|N|O|1996-05-23|1996-05-22|1996-06-22|NONE|RAIL|le slyly ironic ideas. slyly +52771|283|84|1|13|15382.64|0.02|0.04|R|F|1993-12-08|1993-12-25|1993-12-21|TAKE BACK RETURN|AIR|lyly accor +52771|90|41|2|42|41583.78|0.05|0.01|A|F|1993-12-26|1993-12-27|1993-12-28|NONE|FOB|ages might inte +52771|36|62|3|29|27144.87|0.07|0.05|A|F|1993-11-25|1993-12-06|1993-12-15|NONE|FOB|e carefully unusual packages. account +52771|193|20|4|15|16397.85|0.03|0.05|R|F|1993-12-09|1993-11-15|1993-12-30|TAKE BACK RETURN|REG AIR|as among the slyly bold asymptotes. fur +52771|1245|20|5|26|29802.24|0.00|0.06|A|F|1993-12-15|1993-11-14|1994-01-13|NONE|TRUCK|ecial deposits. fluf +52772|680|43|1|7|11064.76|0.04|0.02|R|F|1993-03-03|1992-12-24|1993-03-17|DELIVER IN PERSON|RAIL|refully fluffily unusual excuse +52772|189|42|2|42|45745.56|0.02|0.08|A|F|1992-12-24|1993-01-03|1993-01-07|DELIVER IN PERSON|SHIP|fully careful deposits are. bold, +52772|1616|40|3|36|54633.96|0.05|0.08|A|F|1992-12-02|1993-02-02|1992-12-28|NONE|SHIP|to cajole regular, e +52772|986|89|4|47|88688.06|0.04|0.05|R|F|1993-01-23|1993-01-11|1993-01-26|DELIVER IN PERSON|REG AIR|packages nag slyly. req +52772|571|32|5|38|55919.66|0.07|0.02|R|F|1992-11-12|1992-12-13|1992-11-24|TAKE BACK RETURN|FOB|avely alongside of the silently unusual the +52772|1367|82|6|35|44392.60|0.07|0.08|R|F|1993-02-20|1993-01-15|1993-03-19|COLLECT COD|AIR|cial packag +52772|1672|55|7|39|61373.13|0.08|0.01|A|F|1992-12-21|1992-12-08|1993-01-18|TAKE BACK RETURN|SHIP| special requests. final pla +52773|683|84|1|31|49094.08|0.00|0.02|N|O|1996-04-09|1996-04-02|1996-04-17|COLLECT COD|SHIP|permanently regular plat +52773|1917|18|2|26|47291.66|0.10|0.05|N|O|1996-03-31|1996-03-01|1996-04-30|NONE|REG AIR|oost accor +52773|1714|99|3|47|75938.37|0.04|0.06|N|O|1996-01-24|1996-03-24|1996-02-09|TAKE BACK RETURN|MAIL|e express, unusual asymptotes affix sl +52773|1241|42|4|39|44547.36|0.01|0.01|N|O|1996-02-29|1996-03-21|1996-03-08|TAKE BACK RETURN|FOB| unusual dolphin +52773|1633|57|5|6|9207.78|0.07|0.08|N|O|1996-02-02|1996-03-07|1996-02-06|TAKE BACK RETURN|AIR|excuses. final p +52773|1595|36|6|10|14965.90|0.00|0.05|N|O|1996-03-16|1996-02-23|1996-04-07|TAKE BACK RETURN|REG AIR|g to the blithely special deposits. blit +52773|446|76|7|32|43086.08|0.06|0.05|N|O|1996-02-01|1996-03-18|1996-02-17|DELIVER IN PERSON|REG AIR| platelets. slyly sp +52774|1734|35|1|17|27807.41|0.00|0.00|N|O|1997-09-17|1997-07-31|1997-10-13|COLLECT COD|RAIL|ests. furiously thin +52774|1735|62|2|20|32734.60|0.01|0.04|N|O|1997-06-14|1997-07-31|1997-07-12|DELIVER IN PERSON|AIR| special instructions haggle +52774|163|16|3|22|23389.52|0.08|0.05|N|O|1997-06-27|1997-07-07|1997-07-15|DELIVER IN PERSON|AIR|eposits maintain slyly. fox +52774|1394|33|4|1|1295.39|0.05|0.02|N|O|1997-06-13|1997-07-24|1997-07-13|DELIVER IN PERSON|FOB| busily express courts nag. slyly unusual +52774|344|29|5|23|28619.82|0.04|0.06|N|O|1997-08-18|1997-07-31|1997-08-20|NONE|RAIL| furiously acc +52774|292|20|6|27|32191.83|0.05|0.00|N|O|1997-09-10|1997-07-07|1997-09-29|COLLECT COD|MAIL|es along the r +52774|1737|38|7|41|67187.93|0.05|0.07|N|O|1997-08-06|1997-06-24|1997-08-15|DELIVER IN PERSON|TRUCK|ven pinto beans sublate un +52775|1884|85|1|10|17858.80|0.05|0.02|N|O|1997-04-20|1997-03-08|1997-04-30|TAKE BACK RETURN|MAIL| packages sleep furiously regular request +52775|629|92|2|30|45888.60|0.04|0.01|N|O|1997-04-12|1997-04-13|1997-04-24|COLLECT COD|AIR| carefully even packages. regula +52775|188|15|3|12|13058.16|0.06|0.03|N|O|1997-02-14|1997-04-19|1997-03-12|DELIVER IN PERSON|MAIL|r the pending depo +52800|1555|76|1|13|18935.15|0.04|0.05|R|F|1993-11-23|1993-11-25|1993-12-14|DELIVER IN PERSON|SHIP|ial packages. fluffily even dol +52800|930|65|2|5|9154.65|0.06|0.00|R|F|1993-11-09|1993-11-19|1993-12-06|DELIVER IN PERSON|TRUCK|ites. slyly final requests x- +52800|440|28|3|34|45574.96|0.10|0.02|A|F|1993-12-26|1993-11-27|1993-12-29|TAKE BACK RETURN|SHIP|into beans according to the fl +52800|390|19|4|14|18065.46|0.08|0.01|R|F|1994-02-02|1994-01-07|1994-02-26|COLLECT COD|SHIP|e furiously. fluffily bold accounts +52801|1035|41|1|42|39313.26|0.05|0.02|N|O|1997-08-23|1997-10-05|1997-08-29|DELIVER IN PERSON|REG AIR| special requests cajole s +52801|543|74|2|10|14435.40|0.03|0.00|N|O|1997-09-12|1997-10-16|1997-10-06|NONE|FOB|ounts wake blithely close ideas? furious +52802|659|22|1|36|56147.40|0.09|0.04|N|O|1996-01-18|1995-12-06|1996-01-19|NONE|MAIL|unts use blithely at the pending, regula +52802|1247|85|2|10|11482.40|0.03|0.01|N|O|1996-01-23|1995-12-20|1996-02-10|TAKE BACK RETURN|TRUCK|unusual instruction +52802|1559|40|3|5|7302.75|0.08|0.05|N|O|1995-11-15|1995-12-16|1995-12-05|DELIVER IN PERSON|AIR|unts. spec +52802|1320|97|4|36|43967.52|0.00|0.06|N|O|1996-02-10|1996-01-13|1996-02-13|DELIVER IN PERSON|RAIL|in the silent deposits. quic +52802|1972|17|5|34|63714.98|0.08|0.00|N|O|1996-01-31|1996-01-17|1996-02-01|COLLECT COD|AIR|s boost above the accounts. pending request +52802|194|47|6|18|19695.42|0.02|0.07|N|O|1995-12-26|1995-12-26|1996-01-17|DELIVER IN PERSON|REG AIR| silent deposits boost fluffily special +52803|522|23|1|12|17070.24|0.01|0.01|A|F|1995-01-19|1994-12-18|1995-02-10|NONE|MAIL|ts. carefully ironic accou +52803|677|78|2|43|67839.81|0.05|0.02|R|F|1994-11-24|1994-12-14|1994-12-14|TAKE BACK RETURN|TRUCK|lly pending instruction +52803|1438|39|3|9|12054.87|0.03|0.08|A|F|1994-10-22|1994-12-19|1994-10-27|TAKE BACK RETURN|RAIL|as haggle furiously after the fluffily f +52804|1528|29|1|6|8577.12|0.04|0.03|R|F|1994-11-12|1994-12-15|1994-11-22|COLLECT COD|REG AIR|l ideas use +52805|698|30|1|50|79934.50|0.08|0.02|N|O|1996-01-22|1995-12-11|1996-02-01|DELIVER IN PERSON|FOB|ggle fluffily after the final +52805|57|58|2|20|19141.00|0.10|0.07|N|O|1996-01-10|1995-12-01|1996-01-17|COLLECT COD|FOB|tes wake slyly furiously ironic depos +52805|840|74|3|32|55706.88|0.05|0.04|N|O|1995-12-06|1995-11-19|1995-12-12|NONE|RAIL| closely sp +52805|48|74|4|30|28441.20|0.07|0.04|N|O|1995-11-10|1995-11-04|1995-11-15|DELIVER IN PERSON|FOB|ts doze foxes. fu +52805|1729|56|5|32|52183.04|0.10|0.06|N|O|1996-01-01|1995-11-18|1996-01-06|DELIVER IN PERSON|TRUCK|ecial platelets. furiously busy pac +52805|967|68|6|6|11207.76|0.01|0.03|N|O|1995-11-26|1995-11-19|1995-11-30|NONE|FOB|e. bold accounts +52806|1359|74|1|34|42851.90|0.00|0.07|N|O|1996-05-07|1996-04-27|1996-05-15|NONE|RAIL|ites. blithely idle accounts sleep. speci +52806|1221|59|2|45|50499.90|0.02|0.02|N|O|1996-04-12|1996-04-15|1996-04-29|DELIVER IN PERSON|SHIP|special requests integrate quickly +52806|481|11|3|29|40062.92|0.04|0.05|N|O|1996-06-15|1996-04-24|1996-07-02|DELIVER IN PERSON|AIR|instructions wake above th +52807|112|91|1|49|49593.39|0.10|0.01|R|F|1994-03-01|1993-12-26|1994-03-31|TAKE BACK RETURN|REG AIR| regular excuses nag carefully requests +52807|400|85|2|29|37711.60|0.10|0.04|R|F|1993-12-06|1994-02-15|1994-01-04|COLLECT COD|RAIL| unusual dependencies sleep. slyly p +52807|627|90|3|24|36662.88|0.03|0.03|R|F|1994-01-22|1994-02-13|1994-02-09|COLLECT COD|FOB|as slyly about the +52807|583|84|4|2|2967.16|0.02|0.02|A|F|1994-01-08|1993-12-27|1994-01-22|COLLECT COD|FOB|ctions. quickly silent deposits wake +52807|1958|59|5|20|37199.00|0.10|0.04|R|F|1993-12-18|1994-01-08|1994-01-16|NONE|REG AIR|oach blithely by the bravely b +52832|1547|88|1|14|20279.56|0.01|0.02|N|O|1998-06-06|1998-05-15|1998-06-10|DELIVER IN PERSON|AIR|ctions against the blith +52832|870|70|2|24|42500.88|0.10|0.03|N|O|1998-04-20|1998-06-10|1998-05-03|NONE|MAIL| sleep across +52832|234|62|3|50|56711.50|0.04|0.03|N|O|1998-05-08|1998-04-20|1998-05-09|COLLECT COD|TRUCK| the express theodolites sleep acro +52832|1420|21|4|16|21142.72|0.05|0.01|N|O|1998-06-09|1998-06-03|1998-06-22|TAKE BACK RETURN|FOB|egrate regular r +52832|1062|98|5|34|32744.04|0.02|0.08|N|O|1998-05-02|1998-06-14|1998-05-18|TAKE BACK RETURN|MAIL|platelets impress slyly blithely fi +52833|1025|26|1|5|4630.10|0.01|0.05|N|O|1996-03-12|1996-03-14|1996-04-01|TAKE BACK RETURN|FOB|aggle. quickly exp +52833|1118|91|2|33|33630.63|0.10|0.05|N|O|1996-03-22|1996-02-07|1996-03-23|DELIVER IN PERSON|AIR|e furiously alongside of the furiously fin +52833|772|5|3|45|75274.65|0.02|0.05|N|O|1996-03-04|1996-03-08|1996-03-12|DELIVER IN PERSON|TRUCK|lar deposits snooze. silent requests sleep +52833|865|32|4|46|81229.56|0.01|0.08|N|O|1996-01-10|1996-02-18|1996-01-30|COLLECT COD|TRUCK| deposits; accounts x-ray blithely +52834|1398|13|1|27|35083.53|0.05|0.00|N|O|1998-03-15|1998-02-03|1998-04-06|DELIVER IN PERSON|SHIP|e ironic dolphins. theodolites sleep +52834|263|91|2|27|31408.02|0.06|0.04|N|O|1998-03-05|1998-01-29|1998-03-31|COLLECT COD|AIR|long the slyly ironic attainments. si +52834|308|9|3|4|4833.20|0.03|0.07|N|O|1998-03-28|1998-01-23|1998-03-31|DELIVER IN PERSON|AIR|yly final dugouts wake furiously q +52834|821|88|4|48|82647.36|0.05|0.03|N|O|1998-02-03|1998-02-06|1998-03-02|NONE|SHIP|ly unusual requests cajole a +52834|1225|26|5|39|43922.58|0.04|0.01|N|O|1998-01-03|1998-02-23|1998-01-25|NONE|MAIL|unusual instructions ought to hagg +52835|592|83|1|44|65673.96|0.07|0.01|N|O|1997-10-13|1997-11-10|1997-10-25|DELIVER IN PERSON|AIR| behind the carefully final theodolite +52835|1105|6|2|45|45274.50|0.09|0.01|N|O|1997-10-29|1997-11-24|1997-11-19|DELIVER IN PERSON|SHIP|hely express acc +52835|1939|40|3|29|53386.97|0.10|0.00|N|O|1997-12-10|1997-10-27|1998-01-07|NONE|AIR|xpress packages. theodol +52835|102|81|4|28|28058.80|0.01|0.08|N|O|1997-09-30|1997-11-28|1997-10-22|DELIVER IN PERSON|MAIL|f the idly even packages. special, final +52835|29|5|5|18|16722.36|0.01|0.04|N|O|1997-12-19|1997-10-18|1998-01-10|DELIVER IN PERSON|MAIL|y theodolites. regular idea +52836|1571|72|1|32|47122.24|0.04|0.05|N|O|1998-07-04|1998-06-29|1998-07-12|COLLECT COD|MAIL|blate even, even requ +52836|1100|71|2|22|22024.20|0.01|0.02|N|O|1998-06-03|1998-06-18|1998-06-15|COLLECT COD|TRUCK|ronic pinto beans wake regularly fu +52836|1936|69|3|42|77193.06|0.09|0.08|N|O|1998-06-20|1998-07-03|1998-07-11|DELIVER IN PERSON|SHIP|s engage s +52836|638|70|4|41|63083.83|0.09|0.07|N|O|1998-07-22|1998-06-30|1998-07-30|NONE|REG AIR|inal courts. final, eve +52836|1525|6|5|38|54207.76|0.05|0.07|N|O|1998-07-06|1998-05-28|1998-07-17|COLLECT COD|AIR|ccounts detect against th +52836|466|67|6|32|43726.72|0.08|0.06|N|O|1998-07-03|1998-05-21|1998-07-27|NONE|REG AIR|usly. accounts +52837|1895|82|1|38|68281.82|0.01|0.06|A|F|1992-03-13|1992-03-07|1992-04-06|COLLECT COD|TRUCK|uriously slow +52837|751|52|2|39|64418.25|0.08|0.04|R|F|1992-05-07|1992-03-31|1992-05-16|TAKE BACK RETURN|AIR|eans cajole blithely +52837|366|23|3|45|56986.20|0.03|0.00|A|F|1992-05-12|1992-03-22|1992-05-23|NONE|TRUCK|requests sleep blithely. fu +52837|299|54|4|31|37177.99|0.00|0.01|A|F|1992-04-22|1992-03-25|1992-05-19|NONE|AIR|y according to the special +52838|38|64|1|28|26264.84|0.05|0.05|N|O|1998-03-05|1998-01-09|1998-03-21|TAKE BACK RETURN|RAIL|ong the even instructions. regular request +52838|364|93|2|23|29080.28|0.09|0.06|N|O|1997-12-15|1998-01-03|1998-01-11|TAKE BACK RETURN|TRUCK|lly quietly ironic accounts. f +52838|20|21|3|45|41400.90|0.07|0.05|N|O|1997-11-19|1998-01-01|1997-11-21|DELIVER IN PERSON|AIR|onic, final requests sleep fu +52838|1291|3|4|33|39345.57|0.08|0.05|N|O|1997-11-25|1998-02-09|1997-12-02|NONE|REG AIR|lly. slyly express packages +52838|1536|17|5|37|53188.61|0.10|0.07|N|O|1998-02-13|1997-12-28|1998-02-19|DELIVER IN PERSON|MAIL| ironic asymptotes cajole +52839|495|83|1|37|51633.13|0.00|0.03|A|F|1993-04-27|1993-05-28|1993-05-04|TAKE BACK RETURN|AIR|packages haggle against the slyly +52839|398|83|2|46|59725.94|0.02|0.02|R|F|1993-06-27|1993-05-26|1993-07-17|TAKE BACK RETURN|TRUCK|beans haggle across the ruthless package +52864|738|39|1|6|9832.38|0.10|0.08|R|F|1993-11-22|1993-10-10|1993-12-09|DELIVER IN PERSON|FOB| blithely silent accounts are +52864|1490|8|2|2|2782.98|0.04|0.08|A|F|1993-08-24|1993-10-15|1993-09-06|DELIVER IN PERSON|TRUCK| carefully regular deposits +52864|1245|20|3|3|3438.72|0.09|0.00|A|F|1993-08-15|1993-10-26|1993-08-25|TAKE BACK RETURN|REG AIR|sly. quickly +52864|1254|29|4|35|40433.75|0.05|0.06|A|F|1993-09-28|1993-09-28|1993-10-17|NONE|TRUCK|lyly regular theodolite +52864|953|88|5|19|35225.05|0.05|0.01|A|F|1993-10-26|1993-10-24|1993-11-16|COLLECT COD|TRUCK| of the carefully fi +52865|236|37|1|6|6817.38|0.00|0.02|N|O|1996-02-28|1996-03-16|1996-03-27|TAKE BACK RETURN|AIR|s use. slyly ironic deposits are flu +52865|982|17|2|47|88500.06|0.09|0.05|N|O|1996-03-15|1996-02-11|1996-03-27|DELIVER IN PERSON|MAIL|ccounts prom +52865|381|82|3|45|57662.10|0.01|0.02|N|O|1996-02-11|1996-03-14|1996-02-21|TAKE BACK RETURN|MAIL|e pending idea +52865|448|49|4|38|51240.72|0.04|0.08|N|O|1996-03-16|1996-01-25|1996-03-27|TAKE BACK RETURN|TRUCK|ld asymptotes. slyly final war +52865|1255|93|5|28|32375.00|0.08|0.01|N|O|1995-12-31|1996-02-18|1996-01-04|TAKE BACK RETURN|REG AIR|ccounts. even, silent asym +52865|915|84|6|18|32686.38|0.06|0.02|N|O|1996-01-02|1996-03-13|1996-01-17|COLLECT COD|FOB|. idly fina +52866|454|84|1|34|46051.30|0.05|0.04|A|F|1992-07-03|1992-06-19|1992-07-05|COLLECT COD|AIR|s sleep furiously. slyly bold +52866|1082|18|2|14|13763.12|0.09|0.03|R|F|1992-07-11|1992-07-15|1992-07-20|NONE|FOB|s. careful the +52866|1656|80|3|1|1557.65|0.01|0.01|R|F|1992-08-20|1992-06-22|1992-08-28|TAKE BACK RETURN|REG AIR|fluffily even asymptotes slee +52866|47|48|4|35|33146.40|0.02|0.02|R|F|1992-05-28|1992-07-23|1992-06-18|DELIVER IN PERSON|REG AIR|ss excuses nag blithely furiously ironi +52866|376|61|5|48|61265.76|0.01|0.02|A|F|1992-07-23|1992-06-19|1992-07-26|COLLECT COD|RAIL|use blithely among the express, +52867|947|82|1|24|44350.56|0.07|0.04|R|F|1994-12-01|1994-10-21|1994-12-17|NONE|FOB|nal accounts a +52867|1979|80|2|3|5642.91|0.03|0.01|R|F|1994-09-21|1994-10-17|1994-09-23|DELIVER IN PERSON|AIR| beans. sil +52867|1626|9|3|5|7638.10|0.08|0.00|A|F|1994-09-04|1994-10-08|1994-09-23|TAKE BACK RETURN|SHIP|uriously bold foxes wake even +52868|527|28|1|44|62810.88|0.03|0.06|R|F|1995-02-23|1995-03-28|1995-02-28|DELIVER IN PERSON|TRUCK|rious packages cajole sly +52868|1602|85|2|35|52626.00|0.09|0.05|R|F|1995-03-21|1995-04-02|1995-04-01|TAKE BACK RETURN|MAIL|ounts. furiously expre +52868|1067|68|3|45|43562.70|0.10|0.04|R|F|1995-05-15|1995-04-19|1995-05-18|NONE|TRUCK|bold packages. slyly silent p +52868|496|26|4|31|43291.19|0.01|0.05|N|F|1995-06-04|1995-04-14|1995-06-25|TAKE BACK RETURN|REG AIR|ng accounts. blithely bold pinto beans +52868|663|95|5|20|31273.20|0.09|0.02|N|F|1995-06-12|1995-03-27|1995-06-30|NONE|RAIL|d requests. fur +52868|413|72|6|13|17074.33|0.08|0.00|A|F|1995-05-06|1995-04-18|1995-05-12|TAKE BACK RETURN|TRUCK|regular packages. ca +52869|122|23|1|47|48039.64|0.00|0.04|N|O|1996-06-25|1996-06-10|1996-07-19|COLLECT COD|MAIL|shall are da +52869|567|98|2|17|24948.52|0.02|0.05|N|O|1996-06-12|1996-06-13|1996-07-04|NONE|MAIL|lyly even no +52869|958|61|3|13|24166.35|0.02|0.01|N|O|1996-04-25|1996-06-26|1996-05-18|DELIVER IN PERSON|RAIL|earls use blithely. regular accounts sle +52870|1437|16|1|49|65583.07|0.00|0.01|R|F|1994-04-27|1994-04-10|1994-04-28|COLLECT COD|RAIL|ounts haggle boldly carefully ironic inst +52870|905|74|2|14|25282.60|0.07|0.03|A|F|1994-05-28|1994-04-26|1994-06-11|DELIVER IN PERSON|MAIL|onic deposits. even, unusual +52870|1624|7|3|39|59499.18|0.09|0.01|R|F|1994-03-11|1994-04-29|1994-04-06|COLLECT COD|AIR|uickly against the fluffi +52870|1858|45|4|40|70394.00|0.07|0.08|A|F|1994-04-10|1994-04-17|1994-05-08|COLLECT COD|MAIL|ously regular platelets. furiously bold ins +52871|1595|76|1|14|20952.26|0.08|0.07|N|O|1995-08-22|1995-07-10|1995-08-31|TAKE BACK RETURN|TRUCK|nal dependencies. blithely +52871|1787|72|2|32|54040.96|0.03|0.07|R|F|1995-05-14|1995-07-19|1995-05-16|NONE|TRUCK|l courts. slyly silent ideas cajole fl +52896|1023|29|1|47|43428.94|0.06|0.07|R|F|1993-12-14|1994-01-13|1993-12-16|TAKE BACK RETURN|MAIL|e requests. slyly ironic ideas haggle slyly +52896|1009|10|2|12|10920.00|0.04|0.00|R|F|1994-02-21|1993-11-23|1994-03-18|DELIVER IN PERSON|MAIL|s use blithely about th +52896|1507|88|3|46|64791.00|0.07|0.05|A|F|1993-11-05|1994-01-19|1993-11-16|TAKE BACK RETURN|MAIL|blithely regula +52896|719|84|4|50|80985.50|0.01|0.06|A|F|1993-11-15|1993-11-23|1993-12-15|COLLECT COD|MAIL|te across the slyl +52896|178|31|5|47|50673.99|0.07|0.08|R|F|1993-12-26|1993-11-30|1994-01-12|COLLECT COD|RAIL|hely bold dependencies play blithely aft +52896|1115|24|6|20|20322.20|0.03|0.00|A|F|1993-11-30|1994-01-05|1993-12-03|DELIVER IN PERSON|RAIL|ckey players after the slyly regular r +52896|414|2|7|20|26288.20|0.07|0.08|A|F|1993-12-26|1994-01-12|1994-01-12|NONE|TRUCK|ully pending pinto beans snooze quickly ca +52897|1069|75|1|23|22311.38|0.08|0.04|A|F|1994-11-26|1994-10-12|1994-12-20|NONE|RAIL|l packages: furi +52897|32|83|2|24|22368.72|0.10|0.01|A|F|1994-10-25|1994-10-12|1994-11-12|NONE|REG AIR|ss, ironic requests sle +52897|300|28|3|43|51612.90|0.00|0.08|A|F|1994-09-01|1994-11-17|1994-09-14|TAKE BACK RETURN|TRUCK|atelets sleep always furiously f +52897|955|24|4|32|59390.40|0.01|0.03|R|F|1994-10-30|1994-11-18|1994-11-12|COLLECT COD|SHIP|hely even requests. express e +52898|593|54|1|28|41820.52|0.07|0.08|N|O|1996-04-19|1996-03-15|1996-05-16|TAKE BACK RETURN|MAIL|less accounts cajole furiously. quickly r +52898|1778|21|2|14|23516.78|0.06|0.08|N|O|1996-03-05|1996-03-09|1996-03-17|COLLECT COD|TRUCK| unusual packages. fluffily +52898|404|5|3|24|31305.60|0.01|0.05|N|O|1996-03-10|1996-03-27|1996-04-02|TAKE BACK RETURN|RAIL| special deposits. blithely b +52898|197|98|4|6|6583.14|0.03|0.06|N|O|1996-04-01|1996-04-05|1996-04-05|DELIVER IN PERSON|AIR|nag carefully around the caref +52898|521|82|5|5|7107.60|0.09|0.07|N|O|1996-02-22|1996-02-26|1996-03-16|DELIVER IN PERSON|MAIL| even asymptotes haggle quickl +52898|40|66|6|23|21620.92|0.03|0.08|N|O|1996-01-31|1996-02-12|1996-02-08|NONE|AIR|gle fluffily among the +52899|940|43|1|29|53387.26|0.05|0.06|N|O|1997-03-17|1997-03-02|1997-03-22|TAKE BACK RETURN|AIR|. ironic, unusual requests print blithel +52899|1063|69|2|30|28921.80|0.10|0.03|N|O|1997-01-08|1997-03-08|1997-01-25|DELIVER IN PERSON|SHIP|atelets around t +52899|1107|80|3|29|29234.90|0.03|0.02|N|O|1997-04-13|1997-04-02|1997-04-15|TAKE BACK RETURN|MAIL|haggle quickly ironic deposits. slyly f +52899|199|52|4|37|40670.03|0.06|0.02|N|O|1997-02-25|1997-02-04|1997-03-14|COLLECT COD|FOB|y furiously even theodol +52900|615|9|1|36|54561.96|0.08|0.06|N|O|1995-06-20|1995-07-29|1995-06-27|COLLECT COD|REG AIR|ular deposits. carefully i +52900|1500|1|2|4|5606.00|0.10|0.02|N|O|1995-08-13|1995-08-19|1995-09-05|NONE|FOB|lyly regular ins +52900|1456|57|3|46|62442.70|0.08|0.08|N|O|1995-09-13|1995-07-10|1995-09-25|TAKE BACK RETURN|TRUCK|l instructions. regular pinto beans +52900|192|93|4|41|44779.79|0.10|0.08|N|O|1995-07-31|1995-07-03|1995-08-29|TAKE BACK RETURN|TRUCK|e carefully silent ac +52900|266|48|5|16|18660.16|0.02|0.02|N|O|1995-09-01|1995-08-06|1995-09-03|DELIVER IN PERSON|AIR|eep carefully fin +52900|1348|25|6|37|46225.58|0.07|0.07|N|O|1995-07-26|1995-07-06|1995-08-20|TAKE BACK RETURN|MAIL| regular package +52901|1929|30|1|21|38449.32|0.01|0.04|N|O|1998-03-12|1998-06-03|1998-03-20|COLLECT COD|RAIL|furiously; carefu +52901|997|32|2|23|43653.77|0.01|0.06|N|O|1998-05-31|1998-05-16|1998-06-10|DELIVER IN PERSON|REG AIR|ding requests wake quickly alongsid +52901|911|80|3|12|21742.92|0.01|0.08|N|O|1998-05-05|1998-05-03|1998-05-21|COLLECT COD|MAIL|o beans haggle abou +52901|917|18|4|34|61808.94|0.06|0.05|N|O|1998-07-05|1998-05-08|1998-07-24|NONE|REG AIR|at the packages wa +52901|1992|37|5|30|56819.70|0.06|0.04|N|O|1998-06-20|1998-04-24|1998-06-22|DELIVER IN PERSON|TRUCK|ajole furiously. slyly ironic packages +52902|628|22|1|17|25986.54|0.02|0.02|A|F|1993-09-12|1993-09-28|1993-10-06|TAKE BACK RETURN|REG AIR|ep. blithely regular accounts +52902|1854|98|2|17|29849.45|0.03|0.02|A|F|1993-09-09|1993-10-11|1993-09-29|TAKE BACK RETURN|RAIL|ven instruct +52902|287|15|3|42|49865.76|0.09|0.06|A|F|1993-07-25|1993-10-01|1993-08-23|NONE|FOB|ions across the fluff +52902|102|3|4|14|14029.40|0.01|0.01|A|F|1993-07-26|1993-09-21|1993-08-11|NONE|MAIL| cajole after the c +52902|1513|54|5|34|48093.34|0.09|0.05|R|F|1993-08-05|1993-09-26|1993-09-03|DELIVER IN PERSON|SHIP|. slyly final account +52903|411|99|1|39|51144.99|0.02|0.08|N|O|1996-04-16|1996-05-15|1996-05-16|COLLECT COD|REG AIR|y about the slyly final pin +52903|923|26|2|30|54717.60|0.00|0.01|N|O|1996-07-06|1996-05-26|1996-07-08|TAKE BACK RETURN|TRUCK|totes nod fluffily ironic requests. +52903|1198|7|3|3|3297.57|0.06|0.04|N|O|1996-04-01|1996-05-18|1996-04-07|DELIVER IN PERSON|MAIL|ep quickly. bold deposits +52903|1369|8|4|21|26677.56|0.03|0.02|N|O|1996-05-10|1996-06-14|1996-05-25|COLLECT COD|FOB| theodolites wake. quickly ironic acco +52903|112|13|5|35|35423.85|0.04|0.00|N|O|1996-06-18|1996-05-23|1996-06-28|NONE|FOB|l theodolites cajole fu +52928|1123|24|1|13|13313.56|0.00|0.06|N|O|1997-12-02|1997-10-12|1997-12-29|TAKE BACK RETURN|AIR| bold accounts are blithely: p +52928|1863|64|2|19|33532.34|0.01|0.08|N|O|1997-08-31|1997-10-18|1997-09-10|DELIVER IN PERSON|TRUCK|beans. carefully +52929|1657|58|1|38|59228.70|0.06|0.06|R|F|1995-06-03|1995-05-24|1995-06-04|DELIVER IN PERSON|AIR|quickly final accounts ha +52929|1372|11|2|47|59848.39|0.08|0.06|N|O|1995-07-12|1995-07-03|1995-07-22|COLLECT COD|SHIP|le quickly th +52929|1321|36|3|23|28113.36|0.10|0.06|N|O|1995-07-28|1995-06-26|1995-08-18|NONE|RAIL| blithely pending packages are. sly +52929|1279|54|4|15|17704.05|0.07|0.07|A|F|1995-05-10|1995-05-19|1995-05-23|TAKE BACK RETURN|TRUCK|nstructions are fu +52929|304|89|5|6|7225.80|0.03|0.02|N|O|1995-07-30|1995-06-25|1995-08-02|NONE|MAIL|yly according to the carefully blithe re +52930|149|50|1|30|31474.20|0.06|0.01|N|O|1996-01-12|1995-12-23|1996-02-07|DELIVER IN PERSON|MAIL|even pinto beans wake fu +52930|842|42|2|12|20914.08|0.07|0.07|N|O|1996-02-14|1996-01-12|1996-03-15|COLLECT COD|SHIP|posits alongside of the blith +52930|1385|24|3|37|47596.06|0.04|0.07|N|O|1996-01-28|1996-01-09|1996-02-11|DELIVER IN PERSON|TRUCK| lose quickly? care +52930|1974|19|4|50|93798.50|0.01|0.05|N|O|1995-11-17|1995-12-16|1995-12-10|TAKE BACK RETURN|RAIL| accounts +52930|1075|11|5|1|976.07|0.00|0.05|N|O|1995-12-14|1995-12-28|1996-01-08|TAKE BACK RETURN|FOB|ests. carefully unusual theodolites +52930|339|96|6|22|27265.26|0.09|0.08|N|O|1995-11-20|1995-12-23|1995-12-17|COLLECT COD|MAIL|arefully ironic requests affix slyly car +52930|1890|77|7|6|10751.34|0.10|0.00|N|O|1995-11-23|1996-01-31|1995-12-17|TAKE BACK RETURN|FOB|al pinto beans cajol +52931|1995|40|1|9|17072.91|0.01|0.02|A|F|1993-08-19|1993-06-24|1993-09-03|TAKE BACK RETURN|TRUCK|es are carefully: furiously speci +52931|799|100|2|10|16997.90|0.07|0.05|R|F|1993-05-21|1993-07-11|1993-06-14|DELIVER IN PERSON|REG AIR|gle according to the accou +52931|1011|17|3|25|22800.25|0.03|0.01|A|F|1993-05-21|1993-05-28|1993-06-17|NONE|TRUCK|. quickly silent accounts u +52931|870|70|4|31|54896.97|0.08|0.02|A|F|1993-05-31|1993-05-22|1993-06-09|COLLECT COD|REG AIR|ly bold requests. quietly +52931|595|56|5|41|61319.19|0.10|0.04|R|F|1993-05-08|1993-06-05|1993-06-03|COLLECT COD|AIR|he ironic accounts. quickly ironic package +52931|660|54|6|33|51501.78|0.06|0.03|R|F|1993-08-08|1993-05-26|1993-08-13|DELIVER IN PERSON|TRUCK|y final deposits was c +52931|282|83|7|5|5911.40|0.06|0.02|R|F|1993-05-30|1993-07-17|1993-06-22|COLLECT COD|FOB|old accoun +52932|1035|71|1|25|23400.75|0.07|0.04|R|F|1992-07-31|1992-06-24|1992-08-15|COLLECT COD|FOB|uffily special theodolites slee +52933|1467|85|1|48|65686.08|0.10|0.07|A|F|1993-12-21|1993-09-30|1994-01-02|DELIVER IN PERSON|AIR|ffily bold deposits wake. blithely regu +52933|524|55|2|22|31339.44|0.04|0.04|A|F|1993-12-06|1993-10-30|1993-12-25|TAKE BACK RETURN|TRUCK|packages against the fluffily even plate +52933|1552|53|3|39|56688.45|0.03|0.07|R|F|1993-12-05|1993-10-15|1993-12-19|TAKE BACK RETURN|REG AIR|fily regular deposits sleep sly +52933|519|80|4|28|39746.28|0.06|0.02|R|F|1993-09-08|1993-11-09|1993-10-06|TAKE BACK RETURN|REG AIR|ly final accounts. flu +52933|1277|89|5|18|21208.86|0.00|0.04|R|F|1993-11-03|1993-11-24|1993-11-19|DELIVER IN PERSON|MAIL|ments haggle. furiously ironic courts +52933|1914|15|6|26|47213.66|0.07|0.08|R|F|1993-11-07|1993-10-01|1993-11-28|TAKE BACK RETURN|FOB|ges cajole permanently. furiously fi +52934|538|69|1|26|37401.78|0.09|0.03|N|O|1995-09-28|1995-09-24|1995-10-26|COLLECT COD|TRUCK|ost against the bravely unusua +52934|322|7|2|22|26891.04|0.05|0.00|N|O|1995-09-14|1995-09-12|1995-10-04|COLLECT COD|RAIL|y ironic asymptotes +52934|1240|15|3|49|55920.76|0.00|0.03|N|O|1995-09-08|1995-08-27|1995-09-11|NONE|TRUCK|nts detect furiously. f +52934|1895|82|4|7|12578.23|0.02|0.08|N|O|1995-10-11|1995-08-28|1995-11-06|DELIVER IN PERSON|REG AIR|y blithe accounts. express, pending pin +52934|1788|15|5|45|76040.10|0.08|0.06|N|O|1995-11-24|1995-10-19|1995-12-03|TAKE BACK RETURN|REG AIR|lites haggle. thin +52935|1699|100|1|45|72031.05|0.08|0.06|N|O|1998-09-02|1998-08-26|1998-09-25|DELIVER IN PERSON|RAIL|counts wake! caref +52935|387|44|2|18|23172.84|0.09|0.05|N|O|1998-11-01|1998-09-06|1998-11-13|DELIVER IN PERSON|MAIL|t furiously against +52935|1300|75|3|9|10811.70|0.04|0.05|N|O|1998-10-05|1998-09-12|1998-10-22|DELIVER IN PERSON|MAIL|uests. slyly speci +52960|890|24|1|17|30445.13|0.10|0.01|N|O|1997-10-21|1997-10-13|1997-11-13|DELIVER IN PERSON|FOB|inal deposi +52961|579|80|1|48|71019.36|0.03|0.00|N|O|1997-04-29|1997-04-25|1997-05-24|COLLECT COD|SHIP|ide of the unusual, regular package +52961|1379|94|2|12|15364.44|0.02|0.02|N|O|1997-04-01|1997-04-28|1997-04-23|NONE|REG AIR|behind the quickly ir +52961|1589|70|3|39|58132.62|0.09|0.03|N|O|1997-05-06|1997-04-13|1997-06-02|DELIVER IN PERSON|RAIL|ake about the special theodol +52961|317|74|4|13|15825.03|0.02|0.01|N|O|1997-06-24|1997-04-10|1997-07-02|DELIVER IN PERSON|TRUCK|nding, silent mult +52961|544|75|5|17|24557.18|0.05|0.04|N|O|1997-06-21|1997-04-10|1997-07-16|COLLECT COD|RAIL| quickly e +52961|244|99|6|27|30894.48|0.09|0.05|N|O|1997-05-08|1997-05-25|1997-05-12|COLLECT COD|AIR|s. pending pinto beans nod b +52962|1247|48|1|39|44781.36|0.07|0.00|N|O|1998-06-17|1998-07-09|1998-06-23|COLLECT COD|FOB|ilent deposits. express ins +52962|346|75|2|2|2492.68|0.10|0.08|N|O|1998-06-13|1998-06-27|1998-07-07|TAKE BACK RETURN|TRUCK|nic theodolites use slyly alongs +52962|1384|61|3|37|47559.06|0.02|0.01|N|O|1998-08-10|1998-07-30|1998-09-08|DELIVER IN PERSON|AIR|posits. unu +52962|79|55|4|5|4895.35|0.03|0.05|N|O|1998-09-24|1998-08-09|1998-10-23|TAKE BACK RETURN|AIR|ily across the +52962|1920|65|5|9|16397.28|0.09|0.08|N|O|1998-07-29|1998-08-25|1998-08-15|NONE|REG AIR|at the quickly permanent packages na +52963|197|50|1|32|35110.08|0.03|0.07|N|O|1998-03-29|1998-05-15|1998-04-02|COLLECT COD|MAIL| requests wake fluffily closely +52963|1260|98|2|21|24386.46|0.08|0.02|N|O|1998-03-19|1998-05-28|1998-03-20|DELIVER IN PERSON|FOB|detect slyl +52963|1071|72|3|41|39854.87|0.04|0.08|N|O|1998-04-07|1998-05-28|1998-04-29|TAKE BACK RETURN|RAIL|olve furiously even deposits. blithely iro +52963|289|71|4|6|7135.68|0.10|0.08|N|O|1998-05-17|1998-05-11|1998-05-23|NONE|REG AIR|the Tiresias. slyly p +52963|990|93|5|45|85094.55|0.09|0.06|N|O|1998-03-12|1998-05-17|1998-03-22|TAKE BACK RETURN|TRUCK|usly. bold f +52963|390|19|6|43|55486.77|0.07|0.02|N|O|1998-06-01|1998-04-20|1998-06-27|DELIVER IN PERSON|RAIL| silent accounts haggle sly +52964|976|77|1|8|15015.76|0.03|0.02|R|F|1993-04-30|1993-06-01|1993-05-30|NONE|MAIL|nticingly ironic accounts. bl +52964|1255|67|2|31|35843.75|0.05|0.00|A|F|1993-06-17|1993-05-27|1993-06-27|DELIVER IN PERSON|MAIL|ly regular excuses. unusual depos +52964|1651|93|3|14|21737.10|0.07|0.04|R|F|1993-04-26|1993-05-26|1993-05-05|COLLECT COD|AIR|ourts. fluffily ironic instruct +52964|1239|77|4|22|25085.06|0.06|0.03|R|F|1993-06-01|1993-05-07|1993-06-06|TAKE BACK RETURN|TRUCK|etect furiously across the request +52965|721|54|1|26|42164.72|0.02|0.00|N|O|1996-11-15|1996-10-28|1996-12-07|TAKE BACK RETURN|RAIL|ic deposits. regular packages haggle bl +52965|828|29|2|30|51864.60|0.02|0.08|N|O|1996-11-30|1996-12-02|1996-12-05|NONE|AIR|l deposits +52965|1600|1|3|42|63067.20|0.02|0.01|N|O|1997-01-20|1996-11-29|1997-02-11|NONE|SHIP|ns. furiously regular packages cajole car +52965|907|42|4|50|90395.00|0.01|0.07|N|O|1996-12-09|1996-11-29|1996-12-11|COLLECT COD|AIR|ly unusual waters. fluffily regular r +52965|945|80|5|36|66453.84|0.02|0.05|N|O|1997-01-08|1996-11-18|1997-02-01|TAKE BACK RETURN|SHIP|ully silent requests solve fluffily a +52965|1582|3|6|45|66761.10|0.01|0.08|N|O|1997-01-20|1996-11-24|1997-02-09|DELIVER IN PERSON|TRUCK|about the ruthless, bold +52965|1697|21|7|42|67144.98|0.00|0.07|N|O|1996-10-18|1996-12-01|1996-10-21|TAKE BACK RETURN|SHIP|y pending reque +52966|1934|23|1|7|12851.51|0.10|0.06|R|F|1993-03-05|1993-01-04|1993-03-27|DELIVER IN PERSON|REG AIR| excuses. carefu +52966|1589|90|2|30|44717.40|0.02|0.00|R|F|1993-03-05|1993-03-02|1993-04-01|TAKE BACK RETURN|SHIP|xpress accounts wake tithes. s +52967|875|9|1|17|30189.79|0.10|0.01|N|O|1998-04-30|1998-07-26|1998-05-15|DELIVER IN PERSON|RAIL|s cajole a +52967|384|69|2|27|34678.26|0.00|0.04|N|O|1998-08-16|1998-07-22|1998-08-27|DELIVER IN PERSON|RAIL|hely. packages haggle blithely. c +52967|13|39|3|37|33781.37|0.10|0.05|N|O|1998-07-04|1998-07-05|1998-07-09|COLLECT COD|MAIL|lithely regular dolphins. f +52992|1785|28|1|50|84339.00|0.00|0.06|N|O|1997-02-14|1997-02-16|1997-02-18|TAKE BACK RETURN|AIR|sual packages nag-- carefully b +52992|1200|37|2|16|17619.20|0.07|0.07|N|O|1997-02-11|1997-01-25|1997-02-18|TAKE BACK RETURN|FOB|l theodolites. regular instructions s +52992|226|81|3|29|32660.38|0.01|0.08|N|O|1997-02-04|1997-03-02|1997-02-20|COLLECT COD|AIR|leep carefully bold asymptotes +52992|1864|51|4|48|84761.28|0.08|0.03|N|O|1997-01-16|1997-02-06|1997-01-18|TAKE BACK RETURN|RAIL|y pending forges nag furiously amo +52992|1290|91|5|2|2382.58|0.03|0.00|N|O|1997-03-31|1997-02-24|1997-04-11|TAKE BACK RETURN|REG AIR|ly even, regular epitaphs. i +52993|1800|27|1|13|22123.40|0.02|0.04|A|F|1992-07-31|1992-09-17|1992-08-06|NONE|MAIL|fluffily bold requests wa +52993|1767|94|2|29|48394.04|0.10|0.03|R|F|1992-11-07|1992-10-01|1992-11-17|NONE|SHIP| pending packag +52993|976|79|3|31|58186.07|0.03|0.05|R|F|1992-08-03|1992-09-22|1992-08-27|DELIVER IN PERSON|SHIP|refully express +52994|1649|50|1|9|13955.76|0.10|0.02|R|F|1995-04-07|1995-01-25|1995-04-15|NONE|MAIL|s. final, final pinto beans poach blith +52994|275|3|2|31|36433.37|0.04|0.03|A|F|1995-03-09|1995-02-19|1995-03-19|COLLECT COD|REG AIR|he quickly +52994|1325|2|3|32|39242.24|0.02|0.06|A|F|1995-03-21|1995-02-19|1995-03-26|DELIVER IN PERSON|TRUCK|s wake about the carefully even +52995|1655|56|1|11|17123.15|0.09|0.04|R|F|1992-03-29|1992-04-26|1992-04-24|DELIVER IN PERSON|AIR|ully ironic de +52995|5|56|2|7|6335.00|0.08|0.08|A|F|1992-06-20|1992-06-02|1992-07-12|DELIVER IN PERSON|AIR|dolites cajole furious +52995|735|36|3|4|6542.92|0.00|0.06|R|F|1992-03-19|1992-05-07|1992-04-16|NONE|FOB|ly after the furiousl +52995|1715|100|4|30|48501.30|0.00|0.03|R|F|1992-06-25|1992-04-17|1992-07-10|DELIVER IN PERSON|AIR|. slyly ironic dep +52996|1108|45|1|5|5045.50|0.09|0.05|N|O|1996-11-05|1996-10-25|1996-11-17|NONE|RAIL|arefully c +52996|327|12|2|8|9818.56|0.02|0.08|N|O|1996-08-11|1996-10-17|1996-08-19|COLLECT COD|SHIP|e pinto beans doze about the quickly iron +52996|1995|84|3|5|9484.95|0.03|0.07|N|O|1996-09-28|1996-09-14|1996-10-18|DELIVER IN PERSON|REG AIR|dly. final, regular theodolites use quic +52996|521|52|4|11|15636.72|0.07|0.01|N|O|1996-10-11|1996-11-03|1996-11-07|COLLECT COD|AIR|lar packages nag special requests. theodoli +52997|1566|7|1|33|48429.48|0.09|0.08|A|F|1994-03-15|1994-04-04|1994-03-17|NONE|RAIL|ly dogged +52997|747|80|2|5|8238.70|0.10|0.08|A|F|1994-02-21|1994-04-24|1994-03-02|DELIVER IN PERSON|MAIL| use daringly do +52997|451|52|3|47|63518.15|0.06|0.06|R|F|1994-05-23|1994-04-20|1994-06-14|TAKE BACK RETURN|TRUCK|wake according to the regular accounts. +52998|1531|32|1|21|30083.13|0.06|0.00|R|F|1993-08-06|1993-10-10|1993-09-04|TAKE BACK RETURN|RAIL|ias across the slyly ev +52998|1296|97|2|2|2394.58|0.08|0.07|A|F|1993-09-14|1993-09-15|1993-10-09|TAKE BACK RETURN|REG AIR|uctions. furiously even acc +52999|393|50|1|34|43975.26|0.02|0.03|R|F|1992-05-20|1992-06-06|1992-06-03|NONE|TRUCK|sleep quickly slyly even ideas. +52999|1549|30|2|24|34812.96|0.10|0.04|A|F|1992-05-08|1992-06-12|1992-05-30|TAKE BACK RETURN|MAIL|y special +52999|1647|48|3|1|1548.64|0.00|0.05|R|F|1992-05-21|1992-06-19|1992-05-26|DELIVER IN PERSON|TRUCK|equests hang. slyly final sheaves sleep abo +52999|1669|11|4|8|12565.28|0.10|0.03|A|F|1992-04-28|1992-07-07|1992-05-14|TAKE BACK RETURN|MAIL|l accounts. blithely bold req +52999|126|27|5|7|7182.84|0.05|0.03|R|F|1992-07-25|1992-06-15|1992-08-24|NONE|MAIL| use careful +52999|1559|80|6|49|71566.95|0.03|0.07|A|F|1992-06-07|1992-07-06|1992-07-01|COLLECT COD|MAIL|ructions. carefully unusual deposits ac +52999|1273|74|7|29|34053.83|0.04|0.07|R|F|1992-07-30|1992-07-15|1992-08-04|TAKE BACK RETURN|MAIL|accounts. platelets boost careful +53024|1243|81|1|27|30894.48|0.02|0.04|A|F|1992-07-16|1992-08-11|1992-08-11|DELIVER IN PERSON|FOB|tes sleep slyly along the final +53024|1836|23|2|30|52134.90|0.06|0.04|A|F|1992-05-17|1992-08-05|1992-06-03|TAKE BACK RETURN|AIR|p blithely even accounts. +53024|103|4|3|15|15046.50|0.00|0.04|R|F|1992-06-11|1992-08-09|1992-06-22|COLLECT COD|AIR|ar, even instruc +53024|389|90|4|44|56732.72|0.08|0.07|A|F|1992-08-24|1992-07-20|1992-08-29|DELIVER IN PERSON|AIR|ole according to the furi +53024|1072|8|5|41|39895.87|0.03|0.07|R|F|1992-07-04|1992-07-10|1992-07-27|COLLECT COD|REG AIR|special requests use furiousl +53024|1402|81|6|44|57349.60|0.02|0.03|A|F|1992-09-10|1992-08-08|1992-10-08|NONE|FOB| carefully even packages at +53024|1302|79|7|31|37302.30|0.10|0.07|A|F|1992-07-06|1992-06-19|1992-07-18|COLLECT COD|REG AIR|. unusual, pend +53025|541|32|1|2|2883.08|0.00|0.06|A|F|1993-05-20|1993-06-03|1993-06-17|COLLECT COD|RAIL|nusual deposits. stealthy ideas cajo +53025|1025|96|2|21|19446.42|0.06|0.07|A|F|1993-06-07|1993-06-04|1993-06-12|DELIVER IN PERSON|SHIP|blithely bold forges +53025|1931|32|3|30|54987.90|0.09|0.04|R|F|1993-07-10|1993-06-04|1993-08-03|NONE|TRUCK|ly regular courts wake dogg +53026|742|75|1|33|54210.42|0.09|0.00|R|F|1992-03-02|1992-04-25|1992-03-04|COLLECT COD|SHIP|inal, pending accounts. carefully even +53026|505|6|2|20|28110.00|0.07|0.08|A|F|1992-05-02|1992-05-22|1992-05-30|NONE|TRUCK|nic packages. slyly even pack +53026|1049|50|3|7|6650.28|0.04|0.04|A|F|1992-05-25|1992-04-27|1992-06-01|DELIVER IN PERSON|SHIP|ideas. furiously even a +53026|1238|39|4|41|46708.43|0.01|0.01|R|F|1992-05-23|1992-04-02|1992-06-04|TAKE BACK RETURN|REG AIR| quickly deposits. blithel +53027|1357|96|1|44|55367.40|0.03|0.03|R|F|1993-12-14|1994-01-08|1993-12-28|NONE|REG AIR|mptotes haggle slyl +53027|1835|22|2|42|72946.86|0.05|0.02|R|F|1993-11-29|1994-01-09|1993-12-04|DELIVER IN PERSON|TRUCK|lyly until the slyly quick de +53027|711|8|3|50|80585.50|0.00|0.06|A|F|1993-11-20|1993-12-09|1993-11-27|NONE|REG AIR|carefully special packages nag +53028|1048|54|1|7|6643.28|0.08|0.01|N|O|1997-05-28|1997-04-04|1997-06-11|NONE|REG AIR|tect furious +53028|1731|58|2|34|55512.82|0.04|0.08|N|O|1997-04-27|1997-05-03|1997-05-01|DELIVER IN PERSON|RAIL| quickly against the regular, iron +53028|1442|60|3|24|32242.56|0.09|0.05|N|O|1997-05-02|1997-05-08|1997-05-24|TAKE BACK RETURN|REG AIR|g ideas wake quickl +53028|1626|27|4|11|16803.82|0.08|0.06|N|O|1997-03-05|1997-04-10|1997-03-08|DELIVER IN PERSON|AIR|foxes. deposits sleep furio +53029|828|95|1|31|53593.42|0.06|0.02|R|F|1994-10-22|1994-08-29|1994-11-03|TAKE BACK RETURN|SHIP|ending depo +53029|118|97|2|39|39706.29|0.02|0.08|A|F|1994-09-20|1994-10-04|1994-10-20|COLLECT COD|TRUCK|t realms use slyly furi +53029|762|63|3|32|53208.32|0.04|0.04|R|F|1994-11-01|1994-09-23|1994-11-26|COLLECT COD|SHIP|ironic ideas unwind carefully slyly +53029|1349|50|4|37|46262.58|0.07|0.02|A|F|1994-08-29|1994-08-29|1994-09-17|TAKE BACK RETURN|REG AIR|eposits. furiously regular instructions +53029|461|20|5|44|59904.24|0.00|0.00|A|F|1994-09-02|1994-10-26|1994-09-10|TAKE BACK RETURN|AIR|s. final acco +53030|531|32|1|35|50103.55|0.07|0.00|N|O|1996-09-01|1996-06-10|1996-09-05|COLLECT COD|FOB|ests: slyly ironic accounts wake about t +53030|1708|9|2|45|72436.50|0.09|0.06|N|O|1996-05-10|1996-07-03|1996-05-31|DELIVER IN PERSON|MAIL|es. daring deposits p +53030|25|1|3|19|17575.38|0.03|0.07|N|O|1996-08-15|1996-08-04|1996-09-07|DELIVER IN PERSON|SHIP|ugouts. pint +53030|1413|14|4|48|63091.68|0.10|0.05|N|O|1996-07-31|1996-07-19|1996-08-26|DELIVER IN PERSON|TRUCK|ions. requ +53031|20|71|1|48|44160.96|0.04|0.04|N|O|1997-09-12|1997-10-03|1997-09-15|COLLECT COD|TRUCK|out the blithely special instruction +53056|246|47|1|25|28656.00|0.10|0.07|N|O|1996-02-05|1995-12-11|1996-02-28|TAKE BACK RETURN|MAIL|cajole. furiously unu +53056|1976|77|2|26|48827.22|0.05|0.08|N|O|1995-11-18|1995-12-31|1995-12-09|DELIVER IN PERSON|FOB|beans. furiously final platelets impre +53056|449|37|3|18|24289.92|0.00|0.02|N|O|1996-01-20|1996-01-05|1996-02-03|DELIVER IN PERSON|MAIL|ts wake always about the ir +53056|273|74|4|49|57490.23|0.06|0.07|N|O|1996-02-26|1995-12-04|1996-03-04|NONE|MAIL|oss the requests. carefully special depos +53057|1585|6|1|21|31218.18|0.05|0.04|A|F|1993-11-04|1993-09-05|1993-11-05|TAKE BACK RETURN|REG AIR|quests across the carefu +53057|1654|37|2|14|21779.10|0.06|0.03|A|F|1993-08-23|1993-09-13|1993-09-04|DELIVER IN PERSON|REG AIR|olites are boldly stealthily regu +53057|587|48|3|26|38677.08|0.09|0.04|A|F|1993-09-23|1993-10-06|1993-10-06|DELIVER IN PERSON|SHIP| blithely bold ideas nag blith +53057|417|18|4|24|31617.84|0.02|0.07|R|F|1993-10-12|1993-10-16|1993-11-10|DELIVER IN PERSON|RAIL|s according to the pending, fina +53057|1515|96|5|25|35412.75|0.05|0.05|R|F|1993-10-21|1993-09-07|1993-11-14|NONE|MAIL|gular, silent somas sleep +53057|1530|71|6|16|22904.48|0.09|0.06|R|F|1993-09-02|1993-10-10|1993-09-17|COLLECT COD|RAIL|the brave, final instru +53057|376|5|7|47|59989.39|0.02|0.01|A|F|1993-10-01|1993-09-07|1993-10-28|DELIVER IN PERSON|TRUCK|er the blithely ironic +53058|813|47|1|31|53128.11|0.07|0.02|N|O|1998-01-27|1998-03-17|1998-02-08|DELIVER IN PERSON|REG AIR|inal dependencies. slyly regular +53058|584|75|2|8|11876.64|0.08|0.00|N|O|1998-01-23|1998-04-08|1998-02-09|TAKE BACK RETURN|FOB|es-- furiously final requests across t +53059|1358|97|1|30|37780.50|0.02|0.03|N|O|1997-07-15|1997-06-23|1997-07-22|NONE|FOB|he fluffily special package +53059|1173|10|2|20|21483.40|0.06|0.03|N|O|1997-04-25|1997-05-29|1997-05-04|TAKE BACK RETURN|FOB|yly unusual foxes +53059|1271|83|3|41|48063.07|0.03|0.06|N|O|1997-06-23|1997-06-16|1997-06-28|COLLECT COD|RAIL|he tithes are. even instructions need +53059|1770|71|4|12|20061.24|0.03|0.01|N|O|1997-07-03|1997-05-14|1997-07-08|DELIVER IN PERSON|TRUCK|hely ironic foxes. +53059|1867|97|5|24|42452.64|0.00|0.07|N|O|1997-04-06|1997-05-02|1997-04-26|DELIVER IN PERSON|AIR|are quietly-- b +53060|1546|67|1|24|34740.96|0.07|0.08|R|F|1993-06-30|1993-04-24|1993-07-23|COLLECT COD|REG AIR|unts wake furiously even courts. u +53060|1338|53|2|46|57009.18|0.04|0.02|R|F|1993-04-23|1993-06-07|1993-04-26|DELIVER IN PERSON|RAIL|accounts are blith +53060|1480|81|3|50|69074.00|0.08|0.05|R|F|1993-04-23|1993-05-10|1993-05-14|COLLECT COD|FOB| final deposits. ironic reque +53060|1308|9|4|24|29023.20|0.06|0.08|R|F|1993-05-07|1993-04-29|1993-05-12|COLLECT COD|REG AIR|ts use even packages. slyly bold dinos af +53061|529|20|1|1|1429.52|0.02|0.01|N|O|1995-09-06|1995-10-01|1995-10-04|TAKE BACK RETURN|SHIP|y ironic requests. slyly bold theodolit +53061|1306|83|2|34|41048.20|0.01|0.00|N|O|1995-09-26|1995-09-18|1995-10-08|NONE|TRUCK|s forges. blithely reg +53061|1601|84|3|6|9015.60|0.06|0.01|N|O|1995-08-09|1995-09-28|1995-08-31|TAKE BACK RETURN|MAIL|hely even requests. instruct +53061|760|61|4|19|31554.44|0.05|0.04|N|O|1995-10-29|1995-10-03|1995-11-06|TAKE BACK RETURN|AIR|posits. special +53061|963|64|5|50|93198.00|0.00|0.08|N|O|1995-08-17|1995-10-18|1995-09-08|TAKE BACK RETURN|FOB|special dugouts. careful +53062|335|20|1|37|45707.21|0.02|0.00|A|F|1994-12-14|1994-10-16|1994-12-15|DELIVER IN PERSON|TRUCK|y silent, ironic requests. final re +53062|916|19|2|22|39972.02|0.09|0.02|A|F|1994-11-18|1994-11-10|1994-11-22|DELIVER IN PERSON|FOB|nts. blithely regular pinto be +53062|10|61|3|26|23660.26|0.00|0.05|A|F|1994-09-01|1994-11-12|1994-09-25|DELIVER IN PERSON|RAIL|ly until t +53062|42|43|4|20|18840.80|0.06|0.00|A|F|1994-09-10|1994-10-01|1994-09-18|NONE|TRUCK|eposits. slyly even packages are sp +53062|985|54|5|32|60351.36|0.03|0.02|R|F|1994-12-10|1994-11-02|1994-12-28|DELIVER IN PERSON|REG AIR|l, unusual instruction +53063|1525|66|1|44|62766.88|0.00|0.04|N|O|1997-03-30|1997-03-19|1997-04-29|COLLECT COD|SHIP|pinto beans! fluffily unusual d +53088|479|67|1|50|68973.50|0.02|0.06|N|O|1996-04-01|1996-02-13|1996-04-15|NONE|RAIL|s. fluffily ironic ideas haggle quickly +53088|161|62|2|11|11672.76|0.10|0.03|N|O|1996-04-07|1996-01-23|1996-05-02|TAKE BACK RETURN|TRUCK| fluffily special forges cajole +53088|1788|73|3|42|70970.76|0.08|0.05|N|O|1996-02-08|1996-03-05|1996-03-09|TAKE BACK RETURN|REG AIR|l foxes hang against the furio +53088|1506|7|4|10|14075.00|0.08|0.07|N|O|1996-02-01|1996-03-01|1996-02-15|DELIVER IN PERSON|FOB|beans sleep quickly among the quickly +53088|72|98|5|43|41799.01|0.02|0.06|N|O|1995-12-15|1996-01-11|1995-12-23|NONE|SHIP| silent, thin requests about the quickly u +53088|729|94|6|16|26075.52|0.06|0.05|N|O|1996-03-22|1996-01-28|1996-04-14|TAKE BACK RETURN|REG AIR|nding depos +53089|113|40|1|4|4052.44|0.07|0.01|N|O|1998-05-21|1998-07-02|1998-05-22|TAKE BACK RETURN|RAIL| quickly bold packages integrate ab +53089|1844|88|2|17|29679.28|0.03|0.00|N|O|1998-05-17|1998-06-02|1998-05-21|COLLECT COD|RAIL| the blithely unusual pac +53090|1010|81|1|4|3644.04|0.08|0.07|A|F|1994-06-29|1994-06-08|1994-07-02|DELIVER IN PERSON|MAIL| foxes cajole fluffily ironic pinto bean +53091|595|26|1|28|41876.52|0.09|0.04|N|O|1996-08-22|1996-07-09|1996-09-19|DELIVER IN PERSON|RAIL| the express p +53091|1435|36|2|46|61475.78|0.02|0.00|N|O|1996-09-17|1996-08-18|1996-09-18|TAKE BACK RETURN|REG AIR|es wake slyly sly accounts. foxes about +53091|355|12|3|16|20085.60|0.09|0.06|N|O|1996-09-08|1996-08-06|1996-09-20|COLLECT COD|AIR|ross the final, bold deposits. fluffi +53091|1700|1|4|47|75279.90|0.08|0.06|N|O|1996-09-01|1996-08-04|1996-09-08|TAKE BACK RETURN|SHIP| sleep slyly according to the bold +53091|1403|82|5|12|15652.80|0.05|0.02|N|O|1996-08-28|1996-08-08|1996-09-21|COLLECT COD|RAIL|ven ideas amo +53091|1222|60|6|5|5616.10|0.02|0.06|N|O|1996-07-15|1996-08-31|1996-08-03|TAKE BACK RETURN|MAIL|usual packa +53091|992|27|7|21|39752.79|0.02|0.05|N|O|1996-07-23|1996-08-04|1996-07-26|NONE|SHIP|uriously ironi +53092|1382|83|1|39|50051.82|0.09|0.06|N|O|1998-01-03|1998-03-04|1998-01-30|NONE|SHIP| the expres +53093|643|37|1|27|41678.28|0.00|0.02|R|F|1993-04-15|1993-07-11|1993-04-27|NONE|SHIP|lent requests ar +53094|67|18|1|47|45451.82|0.08|0.04|N|O|1998-01-27|1998-02-08|1998-02-24|NONE|FOB|furiously ironic foxes affix +53095|332|17|1|35|43131.55|0.05|0.08|N|O|1997-12-15|1997-12-25|1998-01-02|TAKE BACK RETURN|AIR|lose carefully regular th +53120|1647|30|1|16|24778.24|0.03|0.05|R|F|1992-07-08|1992-08-04|1992-08-02|DELIVER IN PERSON|TRUCK|asymptotes. +53120|1128|65|2|27|27786.24|0.06|0.00|A|F|1992-05-21|1992-07-03|1992-06-08|TAKE BACK RETURN|AIR|e of the ironically even asymptotes. sly +53120|1632|33|3|19|29138.97|0.05|0.03|R|F|1992-07-04|1992-08-04|1992-07-31|NONE|RAIL|its boost carefully ironic packa +53120|755|56|4|9|14901.75|0.05|0.03|A|F|1992-06-27|1992-06-26|1992-07-08|TAKE BACK RETURN|MAIL|osits wake blithely. ironic, final re +53120|1545|26|5|13|18805.02|0.08|0.01|R|F|1992-05-19|1992-08-04|1992-06-02|COLLECT COD|SHIP|ronic accounts. furiously final dinos poa +53121|1395|10|1|14|18149.46|0.03|0.00|N|O|1996-02-02|1996-03-22|1996-02-15|NONE|AIR|ts run furi +53121|74|25|2|22|21429.54|0.07|0.00|N|O|1996-04-07|1996-02-19|1996-04-17|DELIVER IN PERSON|REG AIR|slyly. final, ironic requests detect quick +53121|1819|6|3|21|36137.01|0.08|0.03|N|O|1996-05-01|1996-03-16|1996-05-30|TAKE BACK RETURN|AIR|refully ruthless ide +53121|1705|32|4|6|9640.20|0.03|0.04|N|O|1996-04-12|1996-03-31|1996-04-14|COLLECT COD|SHIP|ular asymptotes wake +53121|719|16|5|41|66408.11|0.02|0.02|N|O|1996-01-26|1996-03-09|1996-02-21|COLLECT COD|AIR|ly pending dependenci +53121|1674|75|6|17|26786.39|0.08|0.08|N|O|1996-05-07|1996-03-09|1996-05-18|TAKE BACK RETURN|MAIL|ts. daring foxes nag furiously. pending n +53122|798|31|1|29|49264.91|0.05|0.00|N|O|1995-07-15|1995-09-24|1995-08-10|DELIVER IN PERSON|TRUCK|ng among the blithely silen +53123|1107|8|1|24|24194.40|0.09|0.00|A|F|1994-09-04|1994-10-06|1994-09-19|COLLECT COD|AIR| the pending e +53123|22|48|2|34|31348.68|0.05|0.05|A|F|1994-09-15|1994-11-03|1994-10-08|TAKE BACK RETURN|AIR|ar requests about the packages cajole blith +53123|510|71|3|4|5642.04|0.05|0.04|R|F|1994-10-09|1994-10-11|1994-11-04|DELIVER IN PERSON|RAIL|urts across the unusua +53123|410|98|4|4|5241.64|0.05|0.03|A|F|1994-09-21|1994-10-15|1994-10-08|TAKE BACK RETURN|REG AIR|ckly even foxes integrate carefully caref +53123|1468|8|5|17|23280.82|0.04|0.03|R|F|1994-12-21|1994-11-26|1995-01-02|COLLECT COD|TRUCK|efully ironic platelets nag fluffily e +53123|1702|87|6|20|32074.00|0.01|0.00|A|F|1994-12-27|1994-10-11|1994-12-30|COLLECT COD|FOB|ously ironic foxes. express, ironic +53124|1027|33|1|38|35264.76|0.07|0.08|A|F|1993-02-12|1993-03-06|1993-03-06|TAKE BACK RETURN|TRUCK|he slyly even foxes +53124|973|42|2|7|13117.79|0.04|0.07|A|F|1993-02-23|1993-03-12|1993-03-05|NONE|REG AIR|s. regular, regular +53125|837|37|1|36|62561.88|0.06|0.04|N|O|1998-09-10|1998-09-01|1998-09-20|NONE|AIR|nst the final, ironic accoun +53125|801|1|2|46|78282.80|0.10|0.00|N|O|1998-08-06|1998-09-19|1998-08-09|TAKE BACK RETURN|REG AIR|eans impress furiou +53125|1173|46|3|2|2148.34|0.10|0.02|N|O|1998-09-29|1998-09-16|1998-10-29|NONE|SHIP|al waters are blithely ironic req +53125|1708|93|4|5|8048.50|0.06|0.00|N|O|1998-10-18|1998-10-06|1998-11-13|COLLECT COD|RAIL|ins wake after the quietly silent exc +53125|602|3|5|25|37565.00|0.04|0.08|N|O|1998-11-14|1998-09-27|1998-11-16|NONE|REG AIR|ly. special requests are car +53126|1192|93|1|11|12025.09|0.06|0.02|A|F|1995-01-02|1995-01-10|1995-01-18|TAKE BACK RETURN|FOB| against the ironic deposits impress ent +53127|137|16|1|34|35262.42|0.08|0.05|N|O|1995-07-07|1995-07-19|1995-08-04|TAKE BACK RETURN|REG AIR|y final accounts. idly +53127|219|74|2|35|39172.35|0.06|0.08|N|O|1995-07-01|1995-06-12|1995-07-23|TAKE BACK RETURN|AIR|nal requests cajole. r +53127|1524|45|3|11|15680.72|0.04|0.06|N|F|1995-06-02|1995-07-17|1995-06-23|NONE|FOB|wake according to the slyly expres +53127|278|60|4|45|53022.15|0.09|0.07|N|O|1995-09-08|1995-06-15|1995-09-29|NONE|SHIP|ironic packages in +53127|1644|45|5|5|7728.20|0.10|0.02|N|O|1995-06-27|1995-06-17|1995-07-20|DELIVER IN PERSON|FOB|efully regular pi +53152|971|40|1|15|28079.55|0.08|0.03|R|F|1994-05-13|1994-04-19|1994-05-29|NONE|SHIP| unusual, ironic pinto +53152|883|50|2|9|16054.92|0.05|0.05|A|F|1994-04-26|1994-05-07|1994-05-24|DELIVER IN PERSON|MAIL|usly ironic deposits sleep blithel +53152|935|4|3|11|20195.23|0.02|0.04|R|F|1994-07-02|1994-05-09|1994-07-24|COLLECT COD|RAIL| hinder according to the furiousl +53152|1173|82|4|26|27928.42|0.07|0.03|R|F|1994-04-13|1994-04-20|1994-05-12|TAKE BACK RETURN|REG AIR|ents grow quickly unus +53152|783|16|5|31|52197.18|0.04|0.08|A|F|1994-03-15|1994-06-04|1994-04-12|TAKE BACK RETURN|MAIL|usual deposits-- +53153|594|25|1|43|64267.37|0.09|0.03|A|F|1994-09-29|1994-12-13|1994-10-21|NONE|RAIL|e carefully even pinto b +53153|398|83|2|18|23371.02|0.05|0.06|A|F|1994-11-25|1994-11-27|1994-12-14|COLLECT COD|AIR|s. quickly regular requests are quickl +53153|1072|78|3|38|36976.66|0.08|0.07|R|F|1994-11-01|1994-11-01|1994-11-11|DELIVER IN PERSON|AIR|es nag blithely along the f +53153|973|76|4|41|76832.77|0.05|0.01|R|F|1994-11-25|1994-11-18|1994-12-12|DELIVER IN PERSON|TRUCK|counts. blithely regular gr +53154|1782|67|1|28|47145.84|0.02|0.00|R|F|1992-05-10|1992-05-19|1992-06-06|COLLECT COD|TRUCK|nic pinto beans-- final packa +53155|1700|42|1|4|6406.80|0.05|0.02|N|O|1996-12-14|1996-10-27|1996-12-20|DELIVER IN PERSON|TRUCK|ayers haggle regular deposi +53155|1695|96|2|40|63867.60|0.08|0.06|N|O|1996-11-12|1996-12-09|1996-12-07|DELIVER IN PERSON|RAIL|layers. express accou +53155|54|55|3|36|34345.80|0.09|0.03|N|O|1996-12-22|1996-10-23|1996-12-31|NONE|FOB|ts integrate fu +53155|761|58|4|44|73117.44|0.04|0.04|N|O|1996-12-04|1996-11-28|1996-12-27|COLLECT COD|TRUCK|packages according to the r +53155|626|89|5|31|47325.22|0.00|0.01|N|O|1997-01-12|1996-10-29|1997-01-17|COLLECT COD|TRUCK|ual packages wake enticingly unusu +53155|173|26|6|12|12878.04|0.00|0.01|N|O|1996-10-06|1996-12-02|1996-10-28|NONE|RAIL|dolites hag +53156|1505|26|1|3|4219.50|0.09|0.02|A|F|1992-03-25|1992-04-11|1992-04-03|DELIVER IN PERSON|AIR|iers among the special, silent packa +53156|265|93|2|5|5826.30|0.01|0.06|A|F|1992-05-24|1992-05-26|1992-06-22|NONE|RAIL|ts. bold packages solve carefull +53156|483|84|3|44|60873.12|0.07|0.04|R|F|1992-04-26|1992-06-03|1992-05-01|DELIVER IN PERSON|SHIP| blithely bold packag +53157|1454|72|1|13|17620.85|0.03|0.07|N|O|1997-07-15|1997-06-01|1997-07-26|NONE|MAIL|eodolites haggle. furiously regular instruc +53157|603|66|2|16|24057.60|0.06|0.00|N|O|1997-08-19|1997-07-14|1997-08-20|DELIVER IN PERSON|SHIP|ng deposits. final, pending instruc +53158|1853|97|1|17|29832.45|0.07|0.07|N|O|1997-04-25|1997-07-04|1997-05-05|DELIVER IN PERSON|FOB| excuses affi +53158|780|13|2|2|3361.56|0.04|0.08|N|O|1997-04-21|1997-06-24|1997-05-12|DELIVER IN PERSON|REG AIR|y even instructions. +53158|491|50|3|36|50093.64|0.00|0.07|N|O|1997-05-16|1997-06-17|1997-05-27|NONE|REG AIR|final dependencies. ironic pack +53158|1340|79|4|6|7448.04|0.05|0.06|N|O|1997-05-06|1997-05-15|1997-05-07|DELIVER IN PERSON|TRUCK|arefully bold excus +53158|1127|28|5|46|47293.52|0.00|0.07|N|O|1997-05-03|1997-06-07|1997-05-10|COLLECT COD|AIR|foxes boost furiously by the slyly ironi +53158|541|32|6|36|51895.44|0.02|0.04|N|O|1997-07-24|1997-06-12|1997-08-12|NONE|MAIL|areful foxes nag. ideas nag acc +53158|84|85|7|39|38379.12|0.05|0.02|N|O|1997-08-02|1997-06-07|1997-08-24|COLLECT COD|MAIL| carefully regular foxes sleep q +53159|1552|53|1|26|37792.30|0.08|0.03|R|F|1992-04-15|1992-04-02|1992-05-03|TAKE BACK RETURN|AIR| dogged theodolites. fluffil +53159|680|43|2|37|58485.16|0.00|0.02|A|F|1992-06-10|1992-04-27|1992-07-04|DELIVER IN PERSON|SHIP|y final deposits. carefull +53159|1158|59|3|38|40247.70|0.10|0.01|R|F|1992-03-31|1992-04-28|1992-04-26|NONE|REG AIR|dle among the accounts. caref +53159|888|22|4|11|19677.68|0.02|0.03|R|F|1992-03-31|1992-03-28|1992-04-22|DELIVER IN PERSON|AIR|y even theodolites. qu +53159|1549|50|5|23|33362.42|0.09|0.03|R|F|1992-03-14|1992-03-18|1992-03-16|DELIVER IN PERSON|REG AIR|lent deposits haggle blithely about t +53184|1636|60|1|43|66118.09|0.10|0.00|N|O|1998-04-13|1998-04-13|1998-05-07|COLLECT COD|SHIP| to the ironically fluffy accounts. fina +53184|1841|71|2|31|54028.04|0.00|0.01|N|O|1998-04-28|1998-03-28|1998-05-22|TAKE BACK RETURN|FOB|es. requests after the furio +53184|304|89|3|4|4817.20|0.09|0.08|N|O|1998-02-10|1998-05-06|1998-03-06|DELIVER IN PERSON|RAIL|slyly above the s +53185|237|92|1|29|32979.67|0.06|0.06|R|F|1994-02-24|1994-02-11|1994-03-17|COLLECT COD|SHIP|es breach according to the +53185|522|23|2|42|59745.84|0.03|0.04|R|F|1993-12-27|1994-02-21|1994-01-24|DELIVER IN PERSON|SHIP|ronic theodo +53186|277|5|1|33|38849.91|0.02|0.00|N|O|1997-02-01|1997-02-13|1997-02-18|COLLECT COD|TRUCK|sly ironic the +53186|1832|76|2|39|67619.37|0.08|0.01|N|O|1996-12-14|1997-02-17|1996-12-26|NONE|FOB| special, ironi +53186|200|53|3|27|29705.40|0.04|0.04|N|O|1996-12-25|1997-02-22|1997-01-17|DELIVER IN PERSON|AIR|final asymptotes use fluffily regular pin +53186|454|55|4|38|51469.10|0.08|0.06|N|O|1997-01-14|1997-01-25|1997-01-15|TAKE BACK RETURN|REG AIR| wake slyly even requests. fur +53187|790|91|1|26|43960.54|0.05|0.06|A|F|1994-03-08|1994-01-26|1994-03-24|DELIVER IN PERSON|RAIL|lithely regular saut +53187|1108|17|2|11|11100.10|0.06|0.03|A|F|1994-02-04|1994-01-07|1994-02-25|TAKE BACK RETURN|TRUCK|, even requests. blithely even packag +53187|802|36|3|21|35758.80|0.07|0.08|R|F|1993-11-22|1994-01-12|1993-12-03|DELIVER IN PERSON|TRUCK|carefully ironic accounts wake pending req +53187|1261|99|4|10|11622.60|0.10|0.00|R|F|1994-02-14|1994-01-02|1994-03-09|COLLECT COD|AIR|l epitaphs at the tithes detect quickly e +53187|136|15|5|8|8289.04|0.05|0.02|A|F|1993-11-17|1994-01-22|1993-12-04|COLLECT COD|SHIP|x furiously. +53188|1584|25|1|24|35653.92|0.03|0.01|R|F|1992-11-27|1993-01-03|1992-12-23|NONE|FOB|even packages po +53188|166|45|2|5|5330.80|0.04|0.03|A|F|1992-11-18|1992-12-12|1992-11-30|COLLECT COD|FOB|across the special, ironi +53188|1162|35|3|19|20200.04|0.10|0.05|R|F|1992-11-30|1992-12-30|1992-12-19|COLLECT COD|SHIP|osits wake. quickly express pac +53189|1056|62|1|7|6699.35|0.01|0.04|N|O|1995-10-17|1995-11-21|1995-11-07|NONE|AIR|ounts. accounts haggle slyly fur +53189|1|77|2|3|2703.00|0.03|0.01|N|O|1995-09-30|1995-11-07|1995-10-30|COLLECT COD|FOB|regular ideas. iron +53189|503|64|3|21|29473.50|0.07|0.08|N|O|1995-10-27|1995-11-19|1995-11-09|TAKE BACK RETURN|FOB| deposits nag according to the blith +53189|1585|26|4|2|2973.16|0.03|0.02|N|O|1995-09-08|1995-10-09|1995-09-14|NONE|TRUCK|ages. furiously final as +53190|1717|18|1|9|14568.39|0.05|0.02|A|F|1994-12-04|1994-10-26|1994-12-27|NONE|RAIL|as boost despite t +53190|15|16|2|43|39345.43|0.01|0.03|A|F|1994-11-12|1994-11-15|1994-11-28|COLLECT COD|MAIL|iously quick +53190|10|61|3|16|14560.16|0.10|0.03|A|F|1994-09-30|1994-11-25|1994-10-04|DELIVER IN PERSON|TRUCK|ial, pending deposits sleep carefully dari +53190|354|11|4|9|11289.15|0.09|0.06|A|F|1995-01-19|1994-11-20|1995-01-30|COLLECT COD|AIR| dependencies are qu +53190|1868|12|5|20|35397.20|0.04|0.07|R|F|1994-12-26|1994-10-28|1995-01-07|TAKE BACK RETURN|SHIP|ully quiet packages. unusual +53190|610|42|6|9|13595.49|0.09|0.02|A|F|1995-01-24|1994-11-05|1995-02-04|NONE|TRUCK|efully even accounts? special, special fox +53190|1929|18|7|29|53096.68|0.01|0.02|A|F|1994-10-18|1994-12-08|1994-10-21|DELIVER IN PERSON|FOB|ns sleep; final packages above th +53191|1069|5|1|33|32011.98|0.08|0.06|A|F|1993-02-08|1993-04-30|1993-03-07|TAKE BACK RETURN|REG AIR|oost fluffily careful instruction +53191|783|48|2|36|60616.08|0.03|0.08|R|F|1993-05-29|1993-04-22|1993-06-14|DELIVER IN PERSON|REG AIR|xes. daring de +53191|1624|7|3|33|50345.46|0.07|0.04|A|F|1993-04-29|1993-04-22|1993-05-21|TAKE BACK RETURN|FOB|lowly regular deposits? slyly even theod +53191|47|23|4|22|20834.88|0.04|0.00|A|F|1993-05-08|1993-04-16|1993-05-28|DELIVER IN PERSON|AIR|ges. special foxes daz +53191|1503|84|5|19|26685.50|0.05|0.04|R|F|1993-04-15|1993-03-29|1993-04-16|NONE|AIR| deposits sublate furiously special instru +53216|1270|82|1|16|18740.32|0.09|0.06|A|F|1993-03-05|1993-02-11|1993-03-11|DELIVER IN PERSON|MAIL|egular asymptotes +53216|1002|73|2|11|9933.00|0.06|0.07|R|F|1993-01-08|1993-02-09|1993-02-06|DELIVER IN PERSON|REG AIR|sts haggle slyly about +53216|1354|31|3|34|42681.90|0.08|0.01|A|F|1993-03-19|1993-01-06|1993-04-17|COLLECT COD|RAIL|ing to the quickly even accounts. fluf +53216|840|41|4|30|52225.20|0.08|0.01|A|F|1993-02-25|1993-01-10|1993-03-25|TAKE BACK RETURN|REG AIR|ross the unusual, dogged notornis +53216|1229|30|5|44|49729.68|0.07|0.03|R|F|1993-01-04|1993-03-03|1993-01-18|TAKE BACK RETURN|SHIP|hely ironic packages wake car +53216|274|29|6|33|38750.91|0.03|0.01|A|F|1992-12-13|1993-01-24|1993-01-08|NONE|AIR|nt pinto beans boost quic +53216|1695|96|7|10|15966.90|0.06|0.03|A|F|1993-01-14|1993-01-10|1993-01-22|COLLECT COD|SHIP|d have to nag against the pendi +53217|1931|32|1|45|82481.85|0.03|0.06|N|O|1998-07-26|1998-08-14|1998-08-07|COLLECT COD|RAIL|express frets. final packag +53217|1117|18|2|27|27488.97|0.05|0.05|N|O|1998-10-14|1998-10-04|1998-10-18|TAKE BACK RETURN|FOB|ng deposits wak +53217|1775|60|3|8|13414.16|0.04|0.05|N|O|1998-10-31|1998-09-23|1998-11-05|COLLECT COD|REG AIR|usy, regular theodolite +53217|1730|57|4|3|4895.19|0.04|0.03|N|O|1998-10-05|1998-09-08|1998-10-08|TAKE BACK RETURN|MAIL|p furiously. final instructions s +53218|1576|57|1|7|10342.99|0.04|0.04|R|F|1994-05-21|1994-06-09|1994-05-25|TAKE BACK RETURN|SHIP|excuses haggle slyly across the slyly fin +53218|131|58|2|34|35058.42|0.09|0.02|R|F|1994-07-27|1994-06-14|1994-08-14|TAKE BACK RETURN|TRUCK|eans wake slyly about the qui +53218|1899|43|3|18|32416.02|0.06|0.00|A|F|1994-06-28|1994-05-20|1994-07-04|DELIVER IN PERSON|RAIL|he carefully final packages. regular pac +53218|846|80|4|16|27949.44|0.04|0.05|A|F|1994-05-06|1994-06-20|1994-05-23|TAKE BACK RETURN|REG AIR|riously unusual deposits w +53219|1519|100|1|18|25569.18|0.00|0.03|N|O|1996-06-15|1996-07-12|1996-07-05|NONE|FOB|g courts us +53219|1459|38|2|5|6802.25|0.06|0.05|N|O|1996-07-12|1996-07-02|1996-07-16|DELIVER IN PERSON|SHIP|sly. packages boost +53220|1856|86|1|32|56251.20|0.05|0.06|N|O|1997-07-16|1997-08-26|1997-08-03|TAKE BACK RETURN|FOB|unts. blithely sile +53220|1681|23|2|18|28488.24|0.02|0.01|N|O|1997-09-11|1997-09-30|1997-09-16|NONE|FOB| thin foxes. slyly dogged pinto beans use +53220|500|88|3|7|9803.50|0.06|0.00|N|O|1997-09-04|1997-09-22|1997-09-11|TAKE BACK RETURN|TRUCK| requests. silently special patterns ha +53220|182|61|4|33|35711.94|0.01|0.08|N|O|1997-08-24|1997-09-21|1997-09-15|COLLECT COD|MAIL|kly. never dogged accounts alongside of t +53220|1441|81|5|46|61752.24|0.00|0.06|N|O|1997-11-06|1997-08-25|1997-11-21|TAKE BACK RETURN|MAIL|es nag about the final, bold foxes. ev +53221|1395|72|1|37|47966.43|0.02|0.08|R|F|1992-03-03|1992-04-20|1992-03-25|DELIVER IN PERSON|SHIP|heodolites. +53221|929|32|2|22|40258.24|0.00|0.08|R|F|1992-05-25|1992-04-10|1992-06-10|TAKE BACK RETURN|RAIL|e quickly. fu +53221|1667|91|3|40|62746.40|0.09|0.05|A|F|1992-05-27|1992-05-22|1992-06-14|COLLECT COD|FOB|ts. blithely regular tithes hind +53221|1300|75|4|29|34837.70|0.06|0.02|R|F|1992-06-07|1992-04-02|1992-06-16|TAKE BACK RETURN|REG AIR|c asymptotes? instructions haggle bl +53221|874|74|5|15|26623.05|0.02|0.06|A|F|1992-06-25|1992-05-03|1992-07-12|TAKE BACK RETURN|SHIP|s. express, ironic theodolites thr +53221|1689|31|6|34|54083.12|0.05|0.04|R|F|1992-06-15|1992-03-28|1992-07-04|DELIVER IN PERSON|FOB|, unusual depe +53222|1949|94|1|1|1850.94|0.10|0.08|R|F|1994-10-30|1994-12-22|1994-10-31|DELIVER IN PERSON|FOB|uickly unusua +53223|1609|92|1|36|54381.60|0.06|0.08|R|F|1992-07-31|1992-09-05|1992-08-03|NONE|RAIL|nts wake slyly blithely pending pains. qui +53223|663|95|2|34|53164.44|0.02|0.07|A|F|1992-10-25|1992-08-30|1992-10-26|TAKE BACK RETURN|FOB|ickly final pinto beans. carefully even exc +53223|781|14|3|35|58862.30|0.06|0.05|A|F|1992-10-22|1992-09-08|1992-11-02|TAKE BACK RETURN|FOB|e quickly. ca +53223|832|33|4|44|76244.52|0.08|0.03|A|F|1992-08-13|1992-08-26|1992-08-31|NONE|REG AIR|n theodolites are +53223|727|92|5|6|9766.32|0.03|0.03|A|F|1992-10-12|1992-10-10|1992-10-17|TAKE BACK RETURN|REG AIR|ly ideas. slyly regular package +53248|252|7|1|48|55308.00|0.07|0.01|R|F|1993-12-18|1994-01-13|1993-12-19|COLLECT COD|MAIL|: foxes boost according to the even +53248|712|45|2|24|38705.04|0.03|0.05|A|F|1994-02-10|1993-12-18|1994-03-05|NONE|AIR| sleep always above the express as +53248|515|6|3|18|25479.18|0.05|0.00|A|F|1994-02-07|1994-01-18|1994-02-09|COLLECT COD|AIR|sleep furiously silent accounts. slyly qu +53248|971|72|4|18|33695.46|0.10|0.02|A|F|1994-02-03|1993-12-13|1994-03-05|DELIVER IN PERSON|RAIL| bold requests are against the carefully re +53248|353|82|5|17|21306.95|0.02|0.02|A|F|1994-01-07|1994-01-06|1994-01-15|DELIVER IN PERSON|TRUCK|yly regular accounts x-ray alo +53248|48|74|6|48|45505.92|0.01|0.08|R|F|1993-12-15|1993-12-03|1994-01-01|COLLECT COD|MAIL|deas breach slyl +53248|695|96|7|33|52657.77|0.05|0.04|A|F|1994-02-26|1994-01-18|1994-03-16|NONE|AIR|gular pinto +53249|435|94|1|44|58758.92|0.08|0.08|A|F|1992-09-19|1992-12-01|1992-10-10|COLLECT COD|MAIL|nal foxes haggle. pending courts +53250|1378|79|1|6|7676.22|0.09|0.07|N|O|1997-02-18|1997-02-08|1997-03-20|TAKE BACK RETURN|AIR|. regular excuses +53250|1283|84|2|1|1184.28|0.09|0.02|N|O|1996-12-12|1997-02-02|1996-12-21|DELIVER IN PERSON|SHIP|ng attainmen +53250|49|100|3|43|40808.72|0.03|0.00|N|O|1997-01-20|1997-01-12|1997-01-30|DELIVER IN PERSON|AIR|y pending f +53250|1456|57|4|22|29863.90|0.07|0.02|N|O|1997-01-10|1997-01-23|1997-01-27|TAKE BACK RETURN|RAIL|sts nag fluffily slyly regular pa +53250|149|76|5|2|2098.28|0.07|0.01|N|O|1997-03-14|1997-02-09|1997-03-22|DELIVER IN PERSON|MAIL|iously regular dep +53250|187|66|6|39|42400.02|0.08|0.02|N|O|1997-03-06|1997-01-18|1997-03-27|NONE|REG AIR|ect final, silent +53250|1656|57|7|40|62306.00|0.01|0.00|N|O|1997-02-05|1997-02-14|1997-03-03|NONE|AIR|hely. furiously +53251|1475|76|1|25|34411.75|0.02|0.00|A|F|1995-05-25|1995-05-31|1995-06-14|DELIVER IN PERSON|FOB|ke regular, even requests. quickly ironic +53252|1075|46|1|9|8784.63|0.01|0.04|N|O|1998-10-18|1998-08-25|1998-10-23|DELIVER IN PERSON|RAIL|pinto beans a +53252|644|45|2|36|55607.04|0.08|0.01|N|O|1998-10-09|1998-08-31|1998-10-17|COLLECT COD|REG AIR|packages. furiously even +53253|1760|3|1|18|29911.68|0.08|0.01|N|O|1998-08-17|1998-09-23|1998-09-01|NONE|SHIP| except the bold pla +53253|790|23|2|14|23671.06|0.04|0.06|N|O|1998-08-16|1998-08-09|1998-09-12|DELIVER IN PERSON|MAIL|ses. slyly ironic pinto be +53253|1215|90|3|40|44648.40|0.05|0.08|N|O|1998-09-22|1998-09-10|1998-09-30|NONE|RAIL|s cajole. quickly final +53253|1022|58|4|18|16614.36|0.01|0.05|N|O|1998-09-03|1998-08-22|1998-09-25|DELIVER IN PERSON|REG AIR|nding decoys use +53253|1800|43|5|16|27228.80|0.06|0.08|N|O|1998-07-30|1998-08-05|1998-08-14|DELIVER IN PERSON|REG AIR|the regular packages affix sly +53254|543|44|1|17|24540.18|0.00|0.03|R|F|1994-10-09|1994-11-02|1994-11-03|COLLECT COD|FOB|riously around the rut +53254|1210|48|2|50|55560.50|0.05|0.03|A|F|1994-11-19|1994-11-17|1994-12-01|TAKE BACK RETURN|REG AIR| foxes sleep about the special packa +53254|717|82|3|23|37207.33|0.02|0.04|A|F|1994-09-22|1994-10-07|1994-10-03|NONE|SHIP|enticing, regula +53255|1501|22|1|35|49087.50|0.00|0.08|N|O|1997-10-27|1997-08-07|1997-11-12|COLLECT COD|FOB|nic courts about +53255|1855|42|2|10|17568.50|0.09|0.01|N|O|1997-07-10|1997-08-12|1997-07-16|NONE|SHIP|nts. quickly special asympto +53255|1310|11|3|46|55720.26|0.06|0.00|N|O|1997-07-04|1997-08-22|1997-07-13|TAKE BACK RETURN|SHIP|regular, regular accounts wake +53255|848|49|4|23|40223.32|0.03|0.00|N|O|1997-09-06|1997-09-20|1997-09-07|NONE|REG AIR|uests. courts caj +53280|930|99|1|43|78729.99|0.01|0.05|A|F|1995-03-30|1995-02-28|1995-04-11|NONE|AIR|quickly. carefully pending instru +53280|1355|56|2|24|30152.40|0.00|0.02|A|F|1995-01-22|1995-03-22|1995-02-01|DELIVER IN PERSON|TRUCK|symptotes across the blithely fi +53281|1070|76|1|40|38842.80|0.02|0.08|A|F|1994-04-11|1994-05-20|1994-04-14|TAKE BACK RETURN|REG AIR| blithely sly packages cajole carefu +53281|148|27|2|42|44021.88|0.08|0.04|A|F|1994-08-01|1994-06-22|1994-08-24|COLLECT COD|REG AIR| foxes. even, ironic tithes wake q +53281|42|18|3|46|43333.84|0.02|0.01|R|F|1994-05-04|1994-06-09|1994-05-23|DELIVER IN PERSON|AIR| alongside of the pending +53281|1412|91|4|15|19701.15|0.05|0.04|A|F|1994-07-13|1994-06-16|1994-08-06|NONE|SHIP|, final deposits. silent, enticing foxes +53282|939|40|1|14|25759.02|0.04|0.02|A|F|1994-08-19|1994-09-30|1994-09-12|TAKE BACK RETURN|SHIP|side of the +53282|646|40|2|22|34026.08|0.00|0.07|A|F|1994-11-07|1994-09-21|1994-11-22|NONE|TRUCK|egular deposits believe care +53283|1507|8|1|48|67608.00|0.06|0.01|N|O|1995-12-28|1996-01-12|1996-01-18|DELIVER IN PERSON|SHIP|ding accounts: final courts +53283|1121|94|2|7|7154.84|0.00|0.01|N|O|1995-11-18|1996-01-22|1995-11-26|NONE|REG AIR|tes. carefully even hock +53283|1230|42|3|27|30543.21|0.01|0.01|N|O|1995-11-14|1996-01-09|1995-11-21|NONE|MAIL|nticingly bold i +53283|478|37|4|50|68923.50|0.09|0.02|N|O|1995-11-28|1996-01-05|1995-12-04|NONE|REG AIR|lites wake quickly fluffily regular +53284|1046|47|1|29|27464.16|0.10|0.02|N|O|1996-12-22|1996-11-04|1996-12-28|DELIVER IN PERSON|MAIL|eep careful +53284|1399|14|2|4|5201.56|0.08|0.01|N|O|1996-12-21|1996-11-21|1997-01-04|DELIVER IN PERSON|REG AIR|s. blithely +53284|1594|75|3|9|13460.31|0.08|0.07|N|O|1996-10-15|1996-11-21|1996-11-12|TAKE BACK RETURN|FOB|ajole quickly regular packages. warthog +53284|213|68|4|26|28943.46|0.02|0.08|N|O|1996-11-09|1996-11-26|1996-11-15|TAKE BACK RETURN|MAIL|uctions. bold, +53284|666|98|5|31|48566.46|0.02|0.06|N|O|1996-10-26|1996-11-09|1996-11-25|TAKE BACK RETURN|SHIP|unts. carefully pending instructions +53284|1788|73|6|37|62521.86|0.08|0.05|N|O|1997-01-01|1996-11-26|1997-01-06|DELIVER IN PERSON|AIR|ly unusual platelets wake +53285|1138|11|1|13|13508.69|0.07|0.02|A|F|1992-08-26|1992-08-01|1992-08-31|TAKE BACK RETURN|AIR|uickly pend +53285|428|87|2|2|2656.84|0.06|0.08|R|F|1992-07-20|1992-06-26|1992-08-05|NONE|FOB|ing package +53286|232|60|1|49|55479.27|0.08|0.01|A|F|1993-08-08|1993-08-03|1993-08-23|COLLECT COD|REG AIR|excuses haggle fluffily regular foxes. +53286|1732|17|2|35|57180.55|0.06|0.02|R|F|1993-08-29|1993-08-11|1993-09-14|COLLECT COD|AIR|ar theodolites are acco +53286|1698|81|3|34|54389.46|0.04|0.04|R|F|1993-10-11|1993-09-16|1993-11-03|NONE|AIR|y accounts. even fox +53287|1649|32|1|16|24810.24|0.07|0.03|N|O|1996-12-07|1996-12-05|1997-01-03|NONE|AIR|uriously bold courts x-ray quic +53287|1051|22|2|9|8568.45|0.04|0.03|N|O|1996-11-21|1996-11-19|1996-12-08|NONE|SHIP|tions. quickly +53287|878|78|3|6|10673.22|0.04|0.08|N|O|1996-12-05|1996-11-15|1997-01-03|NONE|AIR|quickly quick instructions. blithely ev +53287|1376|53|4|9|11496.33|0.07|0.02|N|O|1996-12-21|1996-12-17|1997-01-18|COLLECT COD|AIR|the quietly +53287|1550|51|5|30|43546.50|0.09|0.01|N|O|1997-01-18|1996-10-22|1997-01-20|COLLECT COD|FOB|es wake after the r +53312|218|73|1|37|41373.77|0.05|0.02|A|F|1994-10-03|1994-09-21|1994-10-19|NONE|RAIL|s haggle furiously. slyly idle pac +53312|1253|65|2|17|19622.25|0.07|0.07|R|F|1994-09-03|1994-08-24|1994-09-28|NONE|AIR|egular, special foxes haggle furiously a +53312|890|57|3|23|41190.47|0.09|0.01|R|F|1994-09-03|1994-10-02|1994-09-17|COLLECT COD|TRUCK|leep about t +53312|1678|79|4|30|47390.10|0.08|0.01|R|F|1994-07-30|1994-09-07|1994-08-25|COLLECT COD|SHIP|ng to the even theodolites slee +53312|320|21|5|12|14643.84|0.04|0.00|R|F|1994-08-31|1994-08-18|1994-09-01|COLLECT COD|REG AIR| blithely final dolphins. furiously regular +53312|912|47|6|7|12690.37|0.04|0.05|A|F|1994-07-26|1994-09-29|1994-07-31|COLLECT COD|MAIL| quickly bold ideas. quickly regular depo +53313|691|23|1|22|35017.18|0.07|0.03|N|O|1997-03-20|1997-04-07|1997-04-14|DELIVER IN PERSON|AIR|ironic theodolites integra +53313|141|20|2|27|28110.78|0.10|0.00|N|O|1997-04-20|1997-03-17|1997-05-03|COLLECT COD|REG AIR|l pinto beans wake blithely. ironic +53313|473|61|3|47|64553.09|0.07|0.01|N|O|1997-04-15|1997-03-22|1997-04-29|NONE|FOB| slyly blithe requests serve above +53313|451|52|4|15|20271.75|0.10|0.06|N|O|1997-05-03|1997-03-24|1997-05-04|DELIVER IN PERSON|REG AIR|nto beans. final requests nag qui +53313|1705|6|5|42|67481.40|0.01|0.03|N|O|1997-05-26|1997-05-06|1997-06-17|TAKE BACK RETURN|AIR|ouches nag iron +53314|250|78|1|43|49460.75|0.02|0.06|A|F|1993-12-07|1993-11-29|1993-12-21|COLLECT COD|AIR|gle ironic idea +53314|1012|18|2|12|10956.12|0.01|0.02|A|F|1993-12-10|1993-10-20|1993-12-26|COLLECT COD|TRUCK|pendencies. +53314|1623|65|3|29|44213.98|0.01|0.00|A|F|1993-10-15|1993-10-21|1993-10-25|NONE|SHIP| sleep slyly. sil +53314|1820|21|4|47|80925.54|0.10|0.06|R|F|1993-10-04|1993-10-23|1993-10-05|TAKE BACK RETURN|RAIL|ic deposits. silently silent depo +53315|1884|71|1|11|19644.68|0.10|0.08|N|O|1995-08-21|1995-09-21|1995-09-09|DELIVER IN PERSON|TRUCK|usly express deposits along the quickl +53315|1962|95|2|26|48462.96|0.04|0.08|N|O|1995-08-12|1995-09-01|1995-08-29|TAKE BACK RETURN|MAIL|he blithely fina +53315|1856|100|3|21|36914.85|0.02|0.08|N|O|1995-08-28|1995-09-24|1995-08-29|DELIVER IN PERSON|FOB|refully permanent requests +53316|1585|26|1|38|56490.04|0.04|0.03|N|O|1997-03-01|1997-02-12|1997-03-09|TAKE BACK RETURN|MAIL|es against the +53316|1593|74|2|12|17935.08|0.01|0.03|N|O|1997-03-06|1997-02-19|1997-03-15|COLLECT COD|SHIP|rding to the express, expre +53316|554|15|3|32|46545.60|0.01|0.06|N|O|1997-03-11|1997-04-01|1997-03-31|NONE|REG AIR|ffix-- enticing accounts across the caref +53316|1289|64|4|20|23805.60|0.03|0.01|N|O|1997-01-21|1997-03-09|1997-01-31|COLLECT COD|SHIP|refully regular requ +53316|1555|76|5|38|55348.90|0.08|0.05|N|O|1997-05-06|1997-02-25|1997-05-08|COLLECT COD|RAIL|ts. blithely special +53316|1526|7|6|30|42825.60|0.02|0.05|N|O|1997-04-15|1997-03-03|1997-04-17|NONE|RAIL|riously. final theodolites integ +53316|855|89|7|32|56187.20|0.07|0.01|N|O|1997-04-18|1997-02-28|1997-05-12|TAKE BACK RETURN|MAIL|ckages against the furiously final ideas su +53317|156|35|1|43|45414.45|0.02|0.01|A|F|1995-03-07|1995-01-12|1995-03-30|NONE|SHIP|de of the deposits. furiously +53317|992|93|2|31|58682.69|0.02|0.08|R|F|1994-12-10|1995-01-21|1994-12-28|DELIVER IN PERSON|MAIL|age slyly slyly regular pi +53318|814|14|1|22|37725.82|0.01|0.02|R|F|1993-03-13|1993-01-08|1993-03-24|TAKE BACK RETURN|RAIL|jole along the sil +53319|101|80|1|47|47051.70|0.07|0.07|N|O|1998-01-19|1997-12-30|1998-02-13|NONE|SHIP|y blithe asymptotes. carefully final +53319|142|21|2|43|44812.02|0.01|0.04|N|O|1997-12-26|1998-01-20|1998-01-08|NONE|RAIL|are slowly. asymp +53319|1806|36|3|21|35863.80|0.08|0.07|N|O|1998-01-30|1998-01-23|1998-02-13|TAKE BACK RETURN|RAIL|kly regular pinto +53319|1352|53|4|6|7520.10|0.04|0.00|N|O|1998-03-08|1998-01-29|1998-03-11|COLLECT COD|RAIL|ole blithely final theodolites. fluffi +53319|1216|28|5|24|26813.04|0.04|0.07|N|O|1997-12-26|1997-12-28|1998-01-03|TAKE BACK RETURN|FOB|y even theodolites. i +53319|1081|52|6|28|27498.24|0.06|0.07|N|O|1998-02-16|1997-12-24|1998-03-17|COLLECT COD|FOB|y express asymptotes sleep car +53344|791|56|1|22|37219.38|0.05|0.07|A|F|1993-03-31|1993-04-14|1993-04-18|COLLECT COD|REG AIR|pending deposits. slyly reg +53344|1590|31|2|33|49222.47|0.04|0.07|R|F|1993-04-10|1993-03-30|1993-04-24|COLLECT COD|REG AIR|the carefully ironic instructions. b +53344|1472|51|3|17|23348.99|0.09|0.07|A|F|1993-06-26|1993-05-01|1993-07-13|DELIVER IN PERSON|AIR|cies. ironic foxes solve-- regular pinto +53344|1826|56|4|1|1727.82|0.03|0.01|A|F|1993-04-12|1993-05-13|1993-04-18|DELIVER IN PERSON|REG AIR|ending asym +53344|200|53|5|50|55010.00|0.06|0.04|A|F|1993-06-12|1993-04-18|1993-07-04|TAKE BACK RETURN|MAIL|hs sleep slyl +53344|1814|1|6|14|24021.34|0.04|0.05|A|F|1993-03-07|1993-04-26|1993-03-18|DELIVER IN PERSON|AIR|ide of the blithely ironic pinto beans. reg +53345|319|76|1|16|19508.96|0.00|0.07|N|O|1997-05-29|1997-03-29|1997-06-07|NONE|TRUCK|y daring packages. slyly special packages +53345|1675|99|2|50|78833.50|0.06|0.07|N|O|1997-06-15|1997-03-27|1997-07-01|DELIVER IN PERSON|RAIL| bold dolphins along t +53346|421|9|1|6|7928.52|0.01|0.04|N|O|1996-10-05|1996-10-05|1996-10-17|COLLECT COD|FOB|ogs hinder package +53346|1876|63|2|23|40891.01|0.02|0.04|N|O|1996-08-17|1996-09-03|1996-09-05|DELIVER IN PERSON|TRUCK|ely express packages boost b +53346|975|10|3|34|63782.98|0.02|0.06|N|O|1996-08-23|1996-09-23|1996-08-29|TAKE BACK RETURN|RAIL|tes cajole carefully: even, +53346|685|17|4|16|25370.88|0.07|0.03|N|O|1996-08-28|1996-09-04|1996-09-24|TAKE BACK RETURN|REG AIR|tions hinder c +53346|426|14|5|23|30507.66|0.07|0.05|N|O|1996-10-12|1996-09-12|1996-10-16|DELIVER IN PERSON|SHIP| boost to the somet +53346|414|73|6|16|21030.56|0.06|0.02|N|O|1996-11-06|1996-09-17|1996-11-25|NONE|AIR| final theodolites use b +53346|340|25|7|43|53334.62|0.00|0.05|N|O|1996-10-08|1996-09-21|1996-10-17|DELIVER IN PERSON|RAIL|ze furiously. express +53347|1769|54|1|18|30073.68|0.03|0.06|N|O|1997-02-04|1997-02-08|1997-03-01|TAKE BACK RETURN|FOB|al theodolites. slyly unusua +53347|605|68|2|32|48179.20|0.04|0.08|N|O|1997-03-06|1997-03-02|1997-03-18|COLLECT COD|SHIP|requests. special ideas according to the +53347|1737|64|3|7|11471.11|0.06|0.00|N|O|1997-02-07|1997-03-07|1997-03-03|COLLECT COD|RAIL| packages. deposits are. sile +53347|58|34|4|4|3832.20|0.03|0.02|N|O|1997-03-31|1997-02-11|1997-04-27|DELIVER IN PERSON|RAIL|lar deposits. +53347|980|49|5|6|11285.88|0.04|0.03|N|O|1996-12-17|1997-02-16|1997-01-04|DELIVER IN PERSON|AIR|p carefully express ideas. even, unusual +53347|1788|89|6|45|76040.10|0.00|0.00|N|O|1997-01-13|1997-02-16|1997-01-15|DELIVER IN PERSON|SHIP|efully. furiously final +53347|223|5|7|43|48298.46|0.04|0.03|N|O|1997-02-13|1997-01-11|1997-02-21|TAKE BACK RETURN|REG AIR|usly final excuses haggle b +53348|1514|35|1|30|42465.30|0.05|0.01|N|O|1997-09-03|1997-10-20|1997-09-04|COLLECT COD|TRUCK| requests dazzle package +53349|374|75|1|43|54797.91|0.09|0.03|A|F|1993-05-09|1993-05-11|1993-05-16|COLLECT COD|FOB|y. fluffily pen +53350|1307|46|1|28|33832.40|0.07|0.00|A|F|1994-08-16|1994-07-28|1994-09-15|DELIVER IN PERSON|SHIP|. bold deposits sleep slyl +53350|343|72|2|12|14920.08|0.05|0.01|R|F|1994-08-21|1994-09-04|1994-09-19|TAKE BACK RETURN|AIR| carefully carefully ev +53350|1695|37|3|17|27143.73|0.01|0.02|R|F|1994-08-08|1994-09-07|1994-08-13|COLLECT COD|FOB|inal deposits would cajole slyly +53351|350|7|1|33|41261.55|0.09|0.04|A|F|1992-07-27|1992-08-27|1992-08-06|DELIVER IN PERSON|MAIL|ag fluffily since the blithely +53351|1014|50|2|49|44835.49|0.08|0.07|R|F|1992-09-21|1992-09-21|1992-10-20|TAKE BACK RETURN|REG AIR|boost slyly above the idle req +53351|1879|23|3|26|46302.62|0.02|0.03|R|F|1992-08-04|1992-09-04|1992-08-13|DELIVER IN PERSON|FOB|ts. carefully final packages +53351|358|43|4|6|7550.10|0.00|0.00|A|F|1992-07-11|1992-09-18|1992-08-03|DELIVER IN PERSON|FOB|tes sleep around the reques +53351|1434|35|5|28|37392.04|0.00|0.03|A|F|1992-10-03|1992-09-01|1992-10-06|COLLECT COD|RAIL|gularly final gifts h +53351|788|21|6|45|75995.10|0.09|0.05|A|F|1992-09-12|1992-09-02|1992-09-28|TAKE BACK RETURN|MAIL|regular instructions. ironic deposits a +53376|357|14|1|38|47779.30|0.04|0.04|N|O|1997-09-28|1997-10-08|1997-10-28|TAKE BACK RETURN|REG AIR| final package +53376|1350|27|2|33|41294.55|0.09|0.05|N|O|1997-11-23|1997-11-09|1997-12-02|COLLECT COD|AIR|packages: final, ironic courts are. special +53376|573|34|3|50|73678.50|0.07|0.06|N|O|1997-11-09|1997-09-13|1997-11-28|COLLECT COD|TRUCK|e along the qu +53376|514|15|4|11|15559.61|0.07|0.06|N|O|1997-10-14|1997-10-12|1997-10-23|COLLECT COD|SHIP|ackages affix. fluffily bold foxe +53376|91|17|5|4|3964.36|0.03|0.01|N|O|1997-10-28|1997-10-09|1997-11-18|DELIVER IN PERSON|SHIP|onic deposits along the express, ironic pi +53376|1411|29|6|9|11811.69|0.03|0.01|N|O|1997-11-24|1997-09-14|1997-11-30|NONE|REG AIR|s above the closely regular packages u +53377|1911|44|1|17|30819.47|0.10|0.04|N|O|1998-10-05|1998-10-12|1998-10-17|DELIVER IN PERSON|MAIL| requests. +53377|1815|2|2|36|61805.16|0.07|0.00|N|O|1998-08-22|1998-10-07|1998-09-17|NONE|SHIP|ilently. silent requests are bl +53377|1557|58|3|26|37922.30|0.09|0.08|N|O|1998-10-06|1998-09-07|1998-10-21|DELIVER IN PERSON|RAIL|kages. slyly even packages wake furiously +53377|1590|91|4|9|13424.31|0.05|0.03|N|O|1998-11-11|1998-10-05|1998-11-12|DELIVER IN PERSON|RAIL|tect furiously even deposits. +53377|736|69|5|35|57285.55|0.02|0.01|N|O|1998-11-22|1998-09-20|1998-12-16|TAKE BACK RETURN|AIR|y players. carefully special packages +53377|304|33|6|5|6021.50|0.05|0.03|N|O|1998-08-28|1998-09-02|1998-08-30|TAKE BACK RETURN|SHIP|ts are slyly ironic theodolites. unusual +53378|615|9|1|25|37890.25|0.08|0.00|A|F|1992-08-16|1992-10-09|1992-09-05|NONE|MAIL|haggle. quick +53378|1799|84|2|23|39118.17|0.09|0.04|A|F|1992-07-16|1992-08-28|1992-07-20|NONE|MAIL|lyly ironic +53378|561|92|3|1|1461.56|0.10|0.00|A|F|1992-08-15|1992-08-28|1992-08-28|DELIVER IN PERSON|REG AIR| nag slyly according to the c +53378|1650|33|4|10|15516.50|0.05|0.01|R|F|1992-09-02|1992-09-03|1992-09-25|NONE|RAIL| ironic depos +53378|352|37|5|32|40075.20|0.01|0.04|A|F|1992-08-20|1992-09-16|1992-09-12|NONE|REG AIR|posits are +53378|1809|96|6|49|83829.20|0.08|0.07|R|F|1992-09-23|1992-08-25|1992-10-20|NONE|SHIP|into beans play blithe +53378|80|81|7|1|980.08|0.06|0.07|A|F|1992-07-28|1992-08-14|1992-08-19|TAKE BACK RETURN|MAIL| foxes along the furiously express +53379|753|86|1|4|6615.00|0.05|0.01|N|O|1997-12-24|1998-01-19|1998-01-17|DELIVER IN PERSON|MAIL|al, special requests s +53379|717|50|2|42|67943.82|0.04|0.07|N|O|1998-01-28|1998-02-26|1998-02-03|COLLECT COD|FOB|ges boost above the +53380|1521|42|1|36|51210.72|0.08|0.01|R|F|1993-12-30|1994-01-11|1994-01-24|TAKE BACK RETURN|AIR|oxes. ironic, bold exc +53380|1199|8|2|31|34105.89|0.06|0.03|R|F|1994-01-12|1994-02-19|1994-01-15|NONE|AIR|ly fluffily even dependencies. slyly regula +53380|1842|86|3|37|64522.08|0.00|0.07|A|F|1994-01-29|1994-01-21|1994-02-24|COLLECT COD|REG AIR|eodolites. carefully pending ideas +53381|1484|2|1|48|66503.04|0.04|0.01|A|F|1993-12-05|1993-11-09|1994-01-04|NONE|AIR|ound the stealthily +53381|1095|66|2|14|13945.26|0.10|0.01|A|F|1993-12-29|1993-11-18|1994-01-06|TAKE BACK RETURN|AIR|imes at the deposits. spec +53381|823|57|3|15|25857.30|0.02|0.02|A|F|1993-10-02|1993-12-05|1993-10-22|DELIVER IN PERSON|TRUCK|ly silent accounts. fluffily ev +53381|1572|13|4|35|51574.95|0.08|0.05|A|F|1993-11-11|1993-11-02|1993-11-15|NONE|REG AIR|ould hinder. ironic requests h +53381|662|25|5|32|50005.12|0.07|0.04|A|F|1993-10-28|1993-10-27|1993-11-20|DELIVER IN PERSON|MAIL|al foxes-- regular asymptotes against the +53382|282|64|1|13|15369.64|0.08|0.06|R|F|1994-12-31|1995-03-21|1995-01-08|NONE|REG AIR| somas. busy, final p +53382|1372|73|2|38|48388.06|0.04|0.01|A|F|1995-04-04|1995-03-12|1995-04-07|COLLECT COD|RAIL|blithely amon +53382|734|99|3|33|53946.09|0.07|0.08|A|F|1995-04-16|1995-02-27|1995-04-23|NONE|AIR|y special instructions be +53383|375|32|1|40|51014.80|0.09|0.04|N|O|1996-09-11|1996-11-01|1996-10-05|NONE|SHIP|cross the regular packages. slyly pendi +53383|413|43|2|14|18387.74|0.09|0.07|N|O|1996-11-18|1996-10-09|1996-11-23|COLLECT COD|FOB|eas haggle always a +53383|1427|28|3|41|54465.22|0.04|0.00|N|O|1996-12-06|1996-10-29|1996-12-27|COLLECT COD|FOB|bold packages. eve +53408|1199|100|1|35|38506.65|0.08|0.07|A|F|1993-10-15|1993-11-18|1993-10-26|NONE|RAIL|ost furiously across the carefu +53409|472|31|1|6|8234.82|0.10|0.08|N|O|1996-04-26|1996-04-12|1996-05-14|NONE|SHIP|oubt busy, ironic e +53410|1527|28|1|47|67140.44|0.06|0.01|A|F|1994-11-01|1994-10-15|1994-11-07|DELIVER IN PERSON|AIR| unusual warhorses. slyly quiet +53411|1146|55|1|19|19895.66|0.05|0.02|N|O|1995-12-21|1996-01-13|1996-01-17|NONE|FOB|ong the bold, +53411|1114|51|2|2|2030.22|0.07|0.07|N|O|1995-12-14|1996-01-02|1996-01-01|NONE|RAIL|slyly carefully regular packages. quic +53411|1550|51|3|43|62416.65|0.08|0.07|N|O|1996-01-20|1996-02-14|1996-02-06|NONE|MAIL|rnis grow ironi +53412|1177|78|1|21|22641.57|0.02|0.06|A|F|1994-10-23|1994-12-05|1994-10-30|DELIVER IN PERSON|MAIL|arefully against +53412|499|87|2|21|29389.29|0.04|0.01|A|F|1994-12-22|1994-12-02|1995-01-06|NONE|TRUCK|e fluffily special dep +53412|1215|53|3|24|26789.04|0.03|0.00|R|F|1994-10-30|1994-11-29|1994-11-20|DELIVER IN PERSON|FOB|accounts. unusual ideas sleep fluffily +53412|1146|55|4|43|45027.02|0.03|0.03|R|F|1994-12-30|1994-10-16|1995-01-22|NONE|REG AIR|y special platelets could snooze after t +53413|775|76|1|21|35191.17|0.02|0.00|N|O|1996-07-25|1996-06-20|1996-08-01|DELIVER IN PERSON|AIR|ong the furiously permanent pa +53413|567|58|2|12|17610.72|0.02|0.01|N|O|1996-06-04|1996-06-30|1996-06-11|NONE|RAIL|hs. blithely pending +53413|709|6|3|47|75655.90|0.07|0.02|N|O|1996-06-17|1996-05-25|1996-06-19|DELIVER IN PERSON|FOB|ar platelets. slyly regular exc +53413|273|1|4|21|24638.67|0.00|0.04|N|O|1996-08-12|1996-07-14|1996-08-22|DELIVER IN PERSON|SHIP|uriously regular foxes hag +53413|720|53|5|27|43759.44|0.07|0.07|N|O|1996-05-22|1996-07-01|1996-06-12|COLLECT COD|TRUCK|ies affix slyly. furio +53414|1563|4|1|27|39543.12|0.01|0.02|N|O|1996-11-29|1996-11-18|1996-12-03|TAKE BACK RETURN|AIR|usly stealthy packages after the idea +53414|246|47|2|10|11462.40|0.08|0.02|N|O|1996-11-18|1996-11-11|1996-12-04|TAKE BACK RETURN|AIR|structions wake furiously regular ideas? +53414|1183|20|3|32|34693.76|0.07|0.05|N|O|1996-10-16|1996-12-02|1996-10-30|COLLECT COD|REG AIR|l, final pinto beans. carefully fi +53414|983|52|4|21|39563.58|0.01|0.06|N|O|1996-12-09|1996-11-23|1996-12-15|DELIVER IN PERSON|MAIL|ironic war +53414|1317|32|5|28|34112.68|0.04|0.02|N|O|1996-11-20|1996-12-16|1996-11-29|NONE|AIR|nag regular deposits. f +53414|836|70|6|9|15631.47|0.02|0.06|N|O|1996-12-02|1996-12-21|1996-12-30|DELIVER IN PERSON|RAIL|lithely regular asymptotes. slyly rut +53414|359|88|7|25|31483.75|0.09|0.08|N|O|1996-10-06|1996-11-04|1996-10-12|NONE|REG AIR|y regular pinto beans +53415|1222|60|1|33|37066.26|0.04|0.05|N|O|1997-11-12|1997-10-20|1997-11-25|TAKE BACK RETURN|REG AIR|n furiously about the final pinto bea +53440|917|86|1|29|52719.39|0.05|0.00|N|O|1998-09-05|1998-09-23|1998-09-29|NONE|MAIL|telets thrash. final +53441|1695|37|1|18|28740.42|0.04|0.06|R|F|1994-12-19|1994-11-07|1994-12-22|NONE|RAIL|sly special instructions. i +53441|68|19|2|28|27105.68|0.07|0.01|A|F|1994-11-23|1994-09-24|1994-12-16|NONE|FOB|ial accounts detect fluffily carefully +53441|863|30|3|18|31749.48|0.10|0.04|A|F|1994-10-03|1994-10-29|1994-10-19|DELIVER IN PERSON|TRUCK|accounts hang +53441|1179|52|4|45|48607.65|0.00|0.00|R|F|1994-10-16|1994-10-05|1994-11-08|DELIVER IN PERSON|RAIL|xpress, silent packages sleep a +53442|1821|65|1|42|72358.44|0.01|0.01|A|F|1994-10-19|1994-09-11|1994-11-14|COLLECT COD|TRUCK|eep against +53442|80|31|2|44|43123.52|0.09|0.02|R|F|1994-09-03|1994-07-27|1994-09-11|DELIVER IN PERSON|REG AIR|nto beans are quickly multipliers. ironic +53442|1994|39|3|8|15167.92|0.03|0.06|R|F|1994-10-09|1994-07-23|1994-10-14|NONE|FOB|s. furiously unusual accoun +53443|604|98|1|30|45138.00|0.07|0.00|N|O|1995-10-15|1995-11-10|1995-10-19|COLLECT COD|RAIL|s; slyly perman +53443|1994|39|2|47|89111.53|0.02|0.06|N|O|1996-01-25|1995-12-14|1996-02-23|TAKE BACK RETURN|SHIP|t carefully according to the blithel +53443|101|54|3|44|44048.40|0.06|0.04|N|O|1995-11-21|1995-12-19|1995-12-05|DELIVER IN PERSON|AIR|nwind blithely a +53443|1485|3|4|3|4159.44|0.05|0.07|N|O|1995-11-12|1995-11-11|1995-11-18|DELIVER IN PERSON|SHIP|quickly at the bold, iron +53443|1915|60|5|28|50873.48|0.02|0.02|N|O|1995-12-31|1995-11-28|1996-01-10|NONE|REG AIR|inal requests. carefully unusu +53443|1738|39|6|46|75427.58|0.02|0.03|N|O|1995-11-17|1995-12-05|1995-12-05|NONE|RAIL|ly regular the +53443|708|9|7|21|33782.70|0.08|0.06|N|O|1996-02-05|1995-11-09|1996-02-13|COLLECT COD|REG AIR| the carefully ironic deposits +53444|791|56|1|19|32144.01|0.06|0.03|N|O|1998-02-14|1997-12-13|1998-03-11|COLLECT COD|TRUCK| carefully stealthy theodolites. fluffil +53444|1086|92|2|20|19741.60|0.07|0.00|N|O|1998-02-16|1997-12-15|1998-02-25|NONE|MAIL|gular dependencies dazzle. +53444|1133|42|3|4|4136.52|0.04|0.03|N|O|1997-12-08|1998-01-03|1997-12-30|TAKE BACK RETURN|REG AIR|otes affix. express p +53445|1928|73|1|34|62217.28|0.00|0.02|R|F|1993-01-27|1992-12-18|1993-02-24|NONE|SHIP|sly deposits daz +53445|54|5|2|11|10494.55|0.04|0.06|A|F|1993-01-23|1992-11-28|1993-02-17|DELIVER IN PERSON|RAIL|ely final pinto beans according to +53445|53|79|3|48|45746.40|0.07|0.05|A|F|1992-12-06|1992-12-27|1993-01-04|DELIVER IN PERSON|SHIP|nding deposits boost furiously c +53445|586|47|4|8|11892.64|0.04|0.00|R|F|1993-02-15|1993-01-06|1993-02-23|TAKE BACK RETURN|REG AIR|es haggle furiou +53445|1156|93|5|43|45457.45|0.01|0.06|R|F|1992-11-20|1993-01-13|1992-12-09|TAKE BACK RETURN|MAIL|equests after the bold, final packages +53445|1135|36|6|29|30047.77|0.00|0.08|R|F|1992-11-18|1992-12-26|1992-12-04|COLLECT COD|REG AIR|osits. blithely regular instructi +53445|745|46|7|18|29623.32|0.00|0.02|A|F|1993-01-12|1992-12-17|1993-01-18|DELIVER IN PERSON|SHIP|tions use quickly. pending, express +53446|1330|31|1|15|18469.95|0.00|0.03|N|O|1997-11-08|1997-12-12|1997-11-12|DELIVER IN PERSON|SHIP|. multipliers cajole slyly +53447|1512|13|1|46|65021.46|0.09|0.05|N|O|1998-04-20|1998-04-22|1998-05-12|NONE|SHIP|g excuses cajole +53447|1695|96|2|12|19160.28|0.07|0.06|N|O|1998-06-13|1998-04-16|1998-07-10|DELIVER IN PERSON|FOB|lent courts. +53447|540|1|3|37|53299.98|0.10|0.04|N|O|1998-03-28|1998-05-06|1998-04-27|COLLECT COD|SHIP|e. furiously final accounts haggle +53472|1490|91|1|39|54268.11|0.03|0.02|N|O|1998-02-10|1998-02-08|1998-02-26|NONE|SHIP|ing to the slyly regular +53472|1458|76|2|24|32626.80|0.03|0.02|N|O|1998-03-03|1998-01-22|1998-03-23|TAKE BACK RETURN|AIR|ets. slyly ironic depos +53472|1842|86|3|46|80216.64|0.00|0.03|N|O|1998-02-28|1997-12-30|1998-03-20|DELIVER IN PERSON|SHIP|ld pinto beans. b +53473|1821|65|1|17|29287.94|0.00|0.03|A|F|1995-02-10|1995-03-03|1995-02-17|DELIVER IN PERSON|RAIL|ng to the regular accounts sleep f +53473|1925|26|2|41|74903.72|0.05|0.00|A|F|1995-04-03|1995-02-28|1995-04-11|DELIVER IN PERSON|TRUCK|n hockey players: furiously special foxes c +53473|693|87|3|29|46217.01|0.01|0.07|A|F|1995-02-03|1995-03-12|1995-02-13|DELIVER IN PERSON|FOB|e against +53474|498|28|1|37|51744.13|0.01|0.08|A|F|1992-03-27|1992-03-19|1992-04-10|TAKE BACK RETURN|TRUCK| regular instructions kindle quickly +53474|710|7|2|34|54764.14|0.00|0.08|A|F|1992-01-15|1992-03-08|1992-02-04|TAKE BACK RETURN|FOB|quickly slyly unusual packa +53475|1394|33|1|6|7772.34|0.07|0.06|N|O|1997-12-16|1997-12-09|1997-12-29|TAKE BACK RETURN|RAIL|s the slyly ironi +53475|1012|18|2|45|41085.45|0.03|0.07|N|O|1998-02-05|1997-12-21|1998-02-09|COLLECT COD|AIR|ccording to the foxes wake blithely i +53475|303|60|3|48|57758.40|0.07|0.08|N|O|1998-01-11|1997-12-08|1998-01-13|TAKE BACK RETURN|MAIL|s packages unwind ironically above the s +53475|467|68|4|2|2734.92|0.03|0.03|N|O|1997-12-27|1997-12-08|1998-01-05|NONE|SHIP|iously unusual deposits. slyly ironi +53475|1318|95|5|30|36579.30|0.01|0.05|N|O|1998-01-02|1997-11-13|1998-01-19|TAKE BACK RETURN|MAIL|. regular, bold pinto beans h +53475|1417|57|6|23|30323.43|0.06|0.05|N|O|1998-01-01|1997-11-18|1998-01-31|TAKE BACK RETURN|REG AIR|ove the ideas cajole blithely quickl +53475|1775|2|7|45|75454.65|0.00|0.02|N|O|1997-11-06|1997-12-23|1997-11-09|DELIVER IN PERSON|TRUCK|closely dari +53476|1710|11|1|49|78973.79|0.03|0.02|A|F|1994-09-28|1994-08-16|1994-09-29|COLLECT COD|AIR|ffy braids would boost care +53476|317|46|2|20|24346.20|0.01|0.01|R|F|1994-09-02|1994-08-12|1994-09-30|COLLECT COD|RAIL| regular deposits about the final instruc +53476|1661|44|3|33|51567.78|0.02|0.03|A|F|1994-08-07|1994-08-17|1994-08-09|DELIVER IN PERSON|AIR| the ironic idea +53476|1957|58|4|46|85511.70|0.06|0.05|R|F|1994-06-25|1994-08-06|1994-07-04|COLLECT COD|MAIL|ss requests boost fl +53476|949|84|5|35|64747.90|0.03|0.08|A|F|1994-10-05|1994-07-31|1994-10-23|COLLECT COD|TRUCK|dolphins along the furiously +53476|114|41|6|18|18253.98|0.01|0.04|R|F|1994-07-10|1994-08-02|1994-08-09|COLLECT COD|SHIP|ar packages. slyly +53477|531|32|1|19|27199.07|0.04|0.02|R|F|1992-08-18|1992-06-19|1992-09-04|DELIVER IN PERSON|TRUCK|out the pinto beans +53477|980|49|2|1|1880.98|0.07|0.02|A|F|1992-08-30|1992-07-06|1992-09-10|TAKE BACK RETURN|AIR|s cajole carefully carefully quick accounts +53477|1125|26|3|14|14365.68|0.09|0.01|R|F|1992-07-14|1992-07-20|1992-07-17|TAKE BACK RETURN|SHIP|special ac +53477|1457|75|4|19|25810.55|0.07|0.01|R|F|1992-08-30|1992-08-02|1992-09-23|DELIVER IN PERSON|RAIL|osits. blithely ironic sheaves nag furi +53478|276|31|1|26|30583.02|0.08|0.03|N|O|1996-10-06|1996-10-28|1996-10-08|DELIVER IN PERSON|FOB|pending excuses x-ray carefully instruction +53478|810|11|2|20|34216.20|0.06|0.08|N|O|1996-10-17|1996-10-09|1996-10-19|COLLECT COD|SHIP|f the slyly special platelet +53479|1321|22|1|32|39114.24|0.02|0.02|A|F|1994-01-11|1994-03-22|1994-01-18|TAKE BACK RETURN|REG AIR| are blithely +53479|1203|4|2|2|2208.40|0.04|0.00|A|F|1994-03-29|1994-03-05|1994-04-19|NONE|RAIL| even accounts. blithely fu +53504|416|4|1|39|51339.99|0.07|0.08|R|F|1994-07-23|1994-07-20|1994-07-26|NONE|AIR|cording to the fluffily fin +53504|196|97|2|48|52617.12|0.03|0.08|A|F|1994-06-08|1994-05-22|1994-06-25|COLLECT COD|TRUCK|furiously pending requests. quic +53505|1570|11|1|28|41203.96|0.10|0.08|R|F|1992-12-24|1992-12-13|1993-01-06|NONE|FOB|ounts haggle care +53505|1791|18|2|49|82946.71|0.07|0.06|A|F|1992-11-26|1993-01-07|1992-12-20|COLLECT COD|TRUCK|s are blithely even excuses. packag +53506|218|73|1|48|53674.08|0.03|0.00|N|O|1996-01-06|1995-10-20|1996-01-22|NONE|FOB|he regular +53506|1739|66|2|9|14766.57|0.07|0.05|N|O|1996-01-12|1995-10-31|1996-02-02|NONE|MAIL|slyly. never special +53506|1282|57|3|4|4733.12|0.05|0.00|N|O|1995-12-08|1995-11-12|1995-12-19|COLLECT COD|TRUCK|g to the ironic fox +53507|1409|49|1|46|60278.40|0.07|0.00|N|O|1997-03-18|1997-04-01|1997-04-14|NONE|MAIL| regular theodolites after th +53507|778|75|2|14|23502.78|0.04|0.06|N|O|1997-05-01|1997-03-24|1997-05-13|DELIVER IN PERSON|REG AIR|ar asymptotes are: slyl +53507|1911|44|3|38|68890.58|0.05|0.08|N|O|1997-03-24|1997-04-13|1997-04-19|DELIVER IN PERSON|AIR| regular requests. i +53507|1925|58|4|30|54807.60|0.05|0.02|N|O|1997-05-22|1997-03-21|1997-06-16|TAKE BACK RETURN|FOB|cajole blithely quickly even theodo +53508|625|26|1|31|47294.22|0.07|0.00|R|F|1994-12-11|1995-01-26|1994-12-28|DELIVER IN PERSON|AIR|carefully blithely even +53508|124|77|2|1|1024.12|0.02|0.06|R|F|1995-03-02|1994-12-19|1995-03-05|COLLECT COD|FOB|ess packages. thinly final +53508|1530|31|3|40|57261.20|0.07|0.08|R|F|1995-02-25|1995-01-20|1995-03-22|COLLECT COD|FOB|ve the blithely express accounts. even, +53508|1459|77|4|27|36732.15|0.06|0.07|A|F|1995-03-12|1995-01-16|1995-03-22|DELIVER IN PERSON|RAIL|c ideas promise quickly above +53508|917|18|5|41|74534.31|0.04|0.02|A|F|1995-02-09|1995-01-05|1995-02-11|DELIVER IN PERSON|TRUCK|. furiously pending exc +53508|408|9|6|16|20934.40|0.09|0.00|R|F|1995-02-20|1995-01-10|1995-03-06|DELIVER IN PERSON|REG AIR|lyly slyly ironic acco +53509|1084|90|1|49|48268.92|0.06|0.06|N|O|1998-05-15|1998-05-15|1998-06-06|DELIVER IN PERSON|RAIL|ole express requests. slyly silent accoun +53509|1559|40|2|50|73027.50|0.01|0.01|N|O|1998-06-04|1998-04-05|1998-06-23|COLLECT COD|SHIP|eas about the final accoun +53509|1882|69|3|9|16054.92|0.04|0.07|N|O|1998-04-23|1998-04-01|1998-04-30|NONE|RAIL|y final foxes sleep after the regula +53509|1453|54|4|27|36570.15|0.01|0.08|N|O|1998-05-21|1998-04-07|1998-05-31|DELIVER IN PERSON|SHIP|ular requests play slyly along t +53509|626|27|5|5|7633.10|0.03|0.07|N|O|1998-06-19|1998-04-10|1998-07-13|COLLECT COD|MAIL| are. slyly re +53510|1490|91|1|1|1391.49|0.02|0.02|A|F|1992-07-13|1992-07-07|1992-08-09|NONE|SHIP|nag fluffily! packages nag +53510|497|56|2|17|23757.33|0.05|0.07|R|F|1992-05-08|1992-06-25|1992-06-03|COLLECT COD|REG AIR|ronic instructions w +53510|1271|9|3|37|43373.99|0.04|0.06|A|F|1992-06-09|1992-07-24|1992-06-28|DELIVER IN PERSON|TRUCK|r realms are quickly. qu +53510|1647|30|4|16|24778.24|0.05|0.08|R|F|1992-07-21|1992-07-05|1992-07-31|TAKE BACK RETURN|AIR|uickly. slyly +53510|1858|45|5|46|80953.10|0.07|0.05|A|F|1992-07-13|1992-07-10|1992-08-07|DELIVER IN PERSON|AIR|ests haggle blithely after +53510|1657|99|6|37|57670.05|0.01|0.06|R|F|1992-05-24|1992-06-07|1992-06-20|NONE|SHIP|uffily quickly +53511|1064|65|1|27|26056.62|0.02|0.08|A|F|1994-03-13|1994-05-14|1994-04-10|DELIVER IN PERSON|REG AIR|nt deposits. furiously even requests +53511|1086|22|2|31|30599.48|0.04|0.01|A|F|1994-05-25|1994-04-22|1994-06-11|NONE|SHIP|ainst the carefully fin +53511|1180|81|3|25|27029.50|0.08|0.08|A|F|1994-02-23|1994-05-04|1994-03-22|TAKE BACK RETURN|AIR|nts run careful +53511|166|93|4|40|42646.40|0.04|0.07|R|F|1994-05-12|1994-04-12|1994-05-21|NONE|REG AIR|ut the furiously ironic ideas. car +53511|649|12|5|8|12397.12|0.00|0.05|A|F|1994-06-06|1994-04-30|1994-06-25|TAKE BACK RETURN|TRUCK| regular requests affix slyly. fluffily +53511|1632|56|6|24|36807.12|0.03|0.00|R|F|1994-05-21|1994-04-18|1994-05-30|COLLECT COD|RAIL|ing packages haggle. accounts lo +53511|1816|60|7|6|10306.86|0.06|0.02|A|F|1994-06-17|1994-04-18|1994-07-13|TAKE BACK RETURN|TRUCK|ld platelets. deposits cajole. even pac +53536|1466|45|1|4|5469.84|0.05|0.04|R|F|1993-02-10|1992-12-07|1993-02-15|COLLECT COD|SHIP|blithely ironic, unusual packages. pinto +53536|94|95|2|21|20875.89|0.03|0.08|R|F|1993-02-07|1992-12-17|1993-02-18|COLLECT COD|MAIL|uriously specia +53536|850|51|3|6|10505.10|0.10|0.08|A|F|1993-01-23|1993-01-20|1993-02-08|TAKE BACK RETURN|AIR|he blithely express deposits. slyly +53536|1638|62|4|44|67743.72|0.04|0.05|R|F|1992-11-29|1993-01-07|1992-12-16|DELIVER IN PERSON|TRUCK|after the furi +53536|1287|88|5|41|48719.48|0.07|0.04|R|F|1993-02-21|1992-12-08|1993-03-06|TAKE BACK RETURN|SHIP|special platelets wake slyly carefu +53536|85|86|6|10|9850.80|0.02|0.02|R|F|1993-01-18|1992-12-10|1993-01-23|COLLECT COD|RAIL|thy ideas use carefully after the +53536|574|65|7|12|17694.84|0.10|0.05|R|F|1993-02-13|1992-12-01|1993-03-10|DELIVER IN PERSON|AIR|among the qu +53537|1027|98|1|43|39904.86|0.01|0.01|N|O|1998-10-08|1998-09-06|1998-10-22|NONE|MAIL|ly even ideas cajole? +53537|307|36|2|41|49499.30|0.02|0.03|N|O|1998-09-28|1998-10-18|1998-10-21|COLLECT COD|SHIP|quickly? special, even pl +53537|868|69|3|14|24764.04|0.00|0.03|N|O|1998-10-18|1998-09-05|1998-11-07|DELIVER IN PERSON|FOB|gainst the pending foxes. package +53538|224|6|1|36|40471.92|0.03|0.02|N|O|1997-11-19|1997-12-25|1997-11-23|DELIVER IN PERSON|REG AIR|bold accounts. +53539|1789|32|1|48|81157.44|0.04|0.03|N|O|1995-07-05|1995-04-19|1995-07-12|DELIVER IN PERSON|RAIL|s. regular, regular accounts alongside of +53539|516|17|2|35|49577.85|0.08|0.01|N|O|1995-06-23|1995-04-17|1995-07-16|TAKE BACK RETURN|TRUCK|regular dependencies. even requests ag +53539|1731|32|3|37|60411.01|0.08|0.00|R|F|1995-05-23|1995-05-01|1995-06-16|TAKE BACK RETURN|AIR|rding to the blithely regular accounts. +53539|231|32|4|17|19230.91|0.09|0.08|N|F|1995-06-13|1995-04-14|1995-06-27|DELIVER IN PERSON|AIR|counts wake ironic deposits. unus +53540|1058|59|1|21|20140.05|0.02|0.02|R|F|1993-02-24|1993-04-19|1993-02-27|COLLECT COD|AIR|y special deposits wake slyly among the +53541|1568|69|1|50|73478.00|0.09|0.03|R|F|1994-03-18|1994-02-28|1994-04-17|DELIVER IN PERSON|FOB|n packages. unusual, ironic requests nag re +53542|1573|54|1|34|50135.38|0.08|0.02|N|O|1998-07-18|1998-07-30|1998-07-26|DELIVER IN PERSON|AIR| blithely ironic package +53542|786|19|2|12|20241.36|0.10|0.06|N|O|1998-05-14|1998-06-27|1998-05-16|TAKE BACK RETURN|MAIL|ermanent notornis na +53542|1508|89|3|36|50742.00|0.03|0.00|N|O|1998-08-05|1998-07-09|1998-08-16|COLLECT COD|TRUCK|carefully express dependencies sleep c +53542|1502|83|4|3|4210.50|0.00|0.03|N|O|1998-09-03|1998-06-29|1998-10-03|DELIVER IN PERSON|TRUCK| close excuses print carefull +53542|1291|92|5|45|53653.05|0.09|0.05|N|O|1998-05-13|1998-06-09|1998-05-26|TAKE BACK RETURN|AIR| ironic deposi +53543|45|46|1|37|34966.48|0.02|0.06|R|F|1994-01-24|1994-02-18|1994-02-16|NONE|TRUCK|cajole blithely before the s +53543|1451|52|2|36|48688.20|0.08|0.01|R|F|1994-04-01|1994-03-28|1994-04-06|TAKE BACK RETURN|RAIL| the final asymptotes integrate slyly sly +53568|1653|77|1|43|66849.95|0.01|0.01|R|F|1993-09-27|1993-09-07|1993-10-23|DELIVER IN PERSON|TRUCK|le blithely regular epitaphs. blith +53568|637|100|2|42|64580.46|0.06|0.02|R|F|1993-09-30|1993-09-14|1993-10-22|COLLECT COD|RAIL|tructions cajole +53569|1901|2|1|47|84736.30|0.00|0.00|N|O|1998-01-25|1997-11-12|1998-02-23|TAKE BACK RETURN|REG AIR|eans. reques +53569|1631|55|2|46|70500.98|0.00|0.06|N|O|1997-12-11|1997-12-15|1998-01-03|TAKE BACK RETURN|FOB| even packag +53570|1358|35|1|11|13852.85|0.04|0.00|N|O|1996-10-16|1996-11-17|1996-10-25|COLLECT COD|RAIL|ges at the flu +53570|134|35|2|28|28955.64|0.07|0.01|N|O|1996-12-08|1996-11-19|1996-12-12|NONE|AIR|fluffily sly packages wake carefully. +53570|1119|92|3|23|23462.53|0.00|0.00|N|O|1996-12-22|1996-10-27|1997-01-18|NONE|TRUCK|ly ironic req +53570|1657|81|4|48|74815.20|0.05|0.07|N|O|1996-11-14|1996-10-20|1996-11-17|COLLECT COD|AIR|the carefully express +53570|1278|16|5|27|31840.29|0.05|0.06|N|O|1996-12-17|1996-11-30|1997-01-09|DELIVER IN PERSON|AIR|efully unusual foxes; request +53571|1964|53|1|25|46649.00|0.02|0.02|R|F|1992-05-25|1992-05-01|1992-05-29|DELIVER IN PERSON|MAIL|usy requests play. quietly r +53571|1261|73|2|3|3486.78|0.06|0.01|A|F|1992-04-22|1992-06-05|1992-04-28|COLLECT COD|FOB|s boost blithely along the slyly final inst +53571|601|95|3|35|52556.00|0.04|0.08|A|F|1992-05-10|1992-05-23|1992-05-13|TAKE BACK RETURN|AIR|the fluffily ironic +53571|1121|94|4|25|25553.00|0.00|0.02|R|F|1992-05-28|1992-06-13|1992-06-26|COLLECT COD|MAIL|cajole permanently +53571|963|32|5|2|3727.92|0.08|0.06|A|F|1992-05-26|1992-04-19|1992-06-06|COLLECT COD|AIR|ts! careful +53571|1287|88|6|35|41589.80|0.07|0.03|R|F|1992-05-30|1992-06-14|1992-06-18|TAKE BACK RETURN|RAIL|old deposits. packages boost pending f +53571|923|92|7|5|9119.60|0.10|0.06|R|F|1992-05-12|1992-04-24|1992-05-22|TAKE BACK RETURN|REG AIR|e ideas. even packages according to the +53572|1054|60|1|21|20056.05|0.05|0.08|R|F|1993-08-19|1993-07-27|1993-09-15|NONE|TRUCK|kly final depos +53572|215|16|2|18|20073.78|0.02|0.06|A|F|1993-08-27|1993-07-18|1993-08-30|DELIVER IN PERSON|MAIL|ally ironic instru +53573|155|82|1|3|3165.45|0.02|0.00|R|F|1994-03-18|1994-04-15|1994-04-11|TAKE BACK RETURN|AIR|r, final ideas use slyly against the slyly +53574|241|42|1|38|43367.12|0.02|0.08|A|F|1992-05-30|1992-05-28|1992-06-09|COLLECT COD|FOB|cial asymptotes +53575|222|50|1|28|31422.16|0.00|0.02|N|O|1998-01-21|1997-12-24|1998-02-12|COLLECT COD|SHIP|lithely according to the slyly final excu +53575|265|47|2|16|18644.16|0.03|0.00|N|O|1998-01-25|1998-01-08|1998-02-09|NONE|RAIL| platelets haggle furiously among the q +53600|8|34|1|3|2724.00|0.04|0.07|R|F|1992-09-07|1992-09-12|1992-10-06|NONE|MAIL|. accounts haggle quickly. regular i +53600|1669|93|2|5|7853.30|0.02|0.08|A|F|1992-08-24|1992-08-30|1992-09-21|DELIVER IN PERSON|RAIL|s. fluffily special d +53600|281|63|3|31|36619.68|0.00|0.01|R|F|1992-08-27|1992-09-28|1992-09-02|TAKE BACK RETURN|FOB| the fluff +53600|993|62|4|42|79547.58|0.02|0.03|A|F|1992-07-19|1992-09-08|1992-08-13|COLLECT COD|RAIL|somas against th +53600|1621|4|5|37|56336.94|0.08|0.08|A|F|1992-08-15|1992-10-08|1992-08-16|TAKE BACK RETURN|MAIL| pinto beans cajole. unusual asymptot +53600|1335|74|6|34|42035.22|0.09|0.03|A|F|1992-11-09|1992-09-28|1992-11-15|COLLECT COD|AIR| special dependencie +53601|1383|22|1|4|5137.52|0.09|0.04|N|O|1997-07-02|1997-09-04|1997-07-18|DELIVER IN PERSON|REG AIR|c deposits sleep furious +53602|433|92|1|27|36002.61|0.06|0.07|A|F|1993-10-05|1993-09-04|1993-11-03|TAKE BACK RETURN|TRUCK| requests integrate sly +53603|383|68|1|28|35934.64|0.08|0.07|N|O|1995-08-04|1995-08-10|1995-09-03|COLLECT COD|TRUCK| against the regul +53603|1174|83|2|33|35480.61|0.04|0.04|N|O|1995-09-15|1995-08-27|1995-10-06|NONE|TRUCK|uests among t +53603|462|92|3|6|8174.76|0.01|0.03|N|O|1995-08-27|1995-07-19|1995-09-05|DELIVER IN PERSON|TRUCK|nt furiously carefully +53603|1238|50|4|6|6835.38|0.05|0.01|N|O|1995-07-19|1995-08-17|1995-08-03|NONE|FOB|s against the carefully final accounts a +53603|1660|61|5|49|76521.34|0.06|0.02|N|O|1995-07-10|1995-08-07|1995-07-30|TAKE BACK RETURN|MAIL|sly quickly even accounts. fluffy requ +53603|640|34|6|33|50841.12|0.09|0.08|N|O|1995-08-28|1995-07-19|1995-09-08|DELIVER IN PERSON|AIR|theodolites. slow packages hag +53603|1488|6|7|25|34737.00|0.09|0.06|N|O|1995-08-04|1995-07-30|1995-08-17|NONE|AIR|bold ideas. quickly regular packa +53604|130|9|1|10|10301.30|0.08|0.08|N|O|1995-10-08|1995-10-26|1995-10-26|TAKE BACK RETURN|FOB|usly even deposits. regular theodolites bo +53604|1227|2|2|2|2256.44|0.07|0.08|N|O|1995-11-11|1995-11-04|1995-11-17|COLLECT COD|MAIL|xes. carefully unu +53605|1944|33|1|13|23997.22|0.07|0.06|R|F|1993-11-05|1993-10-17|1993-11-26|COLLECT COD|REG AIR| theodolites. unusual accounts cajole blit +53605|736|37|2|37|60559.01|0.10|0.01|R|F|1993-11-16|1993-10-19|1993-12-14|COLLECT COD|REG AIR|osits. fina +53605|1401|41|3|16|20838.40|0.10|0.08|R|F|1993-10-12|1993-11-01|1993-10-16|TAKE BACK RETURN|AIR| accounts. +53605|554|15|4|17|24727.35|0.00|0.02|A|F|1993-12-03|1993-10-16|1993-12-12|TAKE BACK RETURN|FOB|ing requests. blithely fin +53605|1934|23|5|24|44062.32|0.08|0.06|R|F|1993-09-22|1993-09-17|1993-10-21|NONE|SHIP|nts. slyly bold +53605|573|64|6|13|19156.41|0.00|0.04|A|F|1993-10-24|1993-10-04|1993-11-17|NONE|AIR|ide of the sometimes special acco +53606|1194|67|1|15|16427.85|0.04|0.02|N|O|1997-06-23|1997-04-29|1997-07-11|COLLECT COD|RAIL|symptotes. sentiments b +53606|1196|69|2|27|29624.13|0.06|0.07|N|O|1997-07-11|1997-05-08|1997-08-09|DELIVER IN PERSON|FOB|lites. slyly reg +53606|164|43|3|41|43630.56|0.03|0.04|N|O|1997-06-17|1997-04-23|1997-06-26|COLLECT COD|REG AIR|sits. regular instruc +53607|716|49|1|29|46884.59|0.01|0.08|N|O|1996-03-20|1996-03-06|1996-04-19|COLLECT COD|MAIL|ronic warthogs cajole bl +53632|107|34|1|12|12085.20|0.04|0.01|R|F|1992-11-23|1993-02-03|1992-11-29|COLLECT COD|TRUCK|gular realms. pending foxes ca +53633|1142|79|1|29|30251.06|0.03|0.03|N|O|1997-11-25|1997-10-26|1997-12-06|DELIVER IN PERSON|RAIL|, regular ep +53633|282|10|2|7|8275.96|0.04|0.05|N|O|1997-11-01|1997-10-22|1997-11-24|TAKE BACK RETURN|RAIL|ains. pinto beans use blithely. ca +53633|1410|50|3|24|31473.84|0.00|0.05|N|O|1997-10-11|1997-10-11|1997-10-16|TAKE BACK RETURN|SHIP|gular requests wake carefully caref +53634|414|44|1|16|21030.56|0.08|0.00|N|F|1995-06-03|1995-03-27|1995-06-24|TAKE BACK RETURN|REG AIR|e final, regu +53635|1154|55|1|37|39040.55|0.06|0.01|A|F|1992-08-11|1992-09-14|1992-09-03|TAKE BACK RETURN|TRUCK|y special requests. slyly +53635|1988|21|2|17|32129.66|0.02|0.08|R|F|1992-09-28|1992-09-12|1992-10-21|NONE|SHIP|nding accounts. ca +53636|739|36|1|1|1639.73|0.08|0.00|N|O|1996-02-02|1996-04-04|1996-02-23|COLLECT COD|FOB|ly regular depos +53636|11|12|2|42|38262.42|0.03|0.04|N|O|1996-04-14|1996-02-24|1996-04-26|DELIVER IN PERSON|REG AIR|. slyly regular foxes wake bli +53636|111|90|3|38|38422.18|0.00|0.00|N|O|1996-03-30|1996-04-06|1996-04-09|NONE|REG AIR|carefully speci +53636|368|69|4|4|5073.44|0.03|0.08|N|O|1996-01-24|1996-03-06|1996-02-07|DELIVER IN PERSON|REG AIR|olites. foxes cajole alongside o +53637|1077|48|1|48|46947.36|0.06|0.03|R|F|1995-03-29|1995-05-20|1995-04-18|COLLECT COD|RAIL|sits. blithely regular instru +53637|1937|70|2|31|57006.83|0.05|0.04|N|F|1995-05-29|1995-05-11|1995-06-26|COLLECT COD|TRUCK|ong the blithely final pinto beans do +53637|1259|71|3|18|20884.50|0.09|0.04|N|O|1995-07-13|1995-05-29|1995-08-01|TAKE BACK RETURN|RAIL| platelets cajole according to the depo +53637|1866|96|4|27|47732.22|0.07|0.00|N|F|1995-06-12|1995-04-25|1995-06-25|COLLECT COD|SHIP|e blithely final de +53637|1149|86|5|13|13651.82|0.05|0.05|R|F|1995-04-13|1995-05-29|1995-05-12|NONE|RAIL|c dolphins! regular requests pla +53638|1363|78|1|19|24022.84|0.02|0.00|N|O|1997-03-28|1997-04-06|1997-04-04|TAKE BACK RETURN|AIR|refully furiously blithe packages. re +53638|1873|60|2|30|53246.10|0.09|0.03|N|O|1997-04-03|1997-03-18|1997-04-25|NONE|MAIL|n packages. slyly bold pac +53638|999|100|3|19|36099.81|0.10|0.01|N|O|1997-05-18|1997-03-27|1997-06-09|NONE|MAIL|symptotes detect after the foxes +53639|1406|85|1|21|27455.40|0.01|0.02|N|O|1996-12-23|1996-11-14|1997-01-13|DELIVER IN PERSON|FOB|osits promi +53639|346|31|2|9|11217.06|0.05|0.02|N|O|1997-01-01|1996-11-30|1997-01-02|DELIVER IN PERSON|AIR| ironic pinto beans. +53639|680|12|3|37|58485.16|0.05|0.02|N|O|1996-11-28|1996-11-20|1996-12-04|NONE|REG AIR|requests use carefully bold reques +53639|91|42|4|44|43607.96|0.00|0.01|N|O|1996-11-30|1996-10-27|1996-12-10|COLLECT COD|REG AIR|l sentiments nag fluffil +53639|1124|61|5|21|21527.52|0.02|0.03|N|O|1996-11-28|1996-11-23|1996-12-16|DELIVER IN PERSON|TRUCK|ully ironic requests boost blit +53639|1733|76|6|13|21251.49|0.00|0.03|N|O|1997-01-08|1996-12-07|1997-01-29|DELIVER IN PERSON|RAIL| regular accounts. regu +53639|1223|35|7|2|2248.44|0.08|0.07|N|O|1996-12-21|1996-12-19|1997-01-03|NONE|RAIL|ic instructions detect fluffily quickl +53664|1667|9|1|9|14117.94|0.03|0.02|N|O|1996-08-24|1996-10-29|1996-09-23|NONE|FOB|pinto beans sleep carefully. furiously +53665|1182|19|1|15|16247.70|0.03|0.07|N|O|1998-05-14|1998-05-08|1998-05-26|COLLECT COD|MAIL|ccounts mold ne +53665|1623|24|2|20|30492.40|0.05|0.00|N|O|1998-04-17|1998-03-24|1998-04-30|DELIVER IN PERSON|AIR| carefully fin +53665|1159|32|3|21|22263.15|0.03|0.06|N|O|1998-06-06|1998-05-19|1998-06-11|COLLECT COD|SHIP|posits wake. regula +53665|991|26|4|48|90815.52|0.08|0.05|N|O|1998-04-20|1998-04-05|1998-04-26|COLLECT COD|TRUCK|st carefully against the accou +53665|719|84|5|26|42112.46|0.05|0.00|N|O|1998-05-23|1998-05-15|1998-06-01|COLLECT COD|TRUCK|dencies imp +53665|271|72|6|4|4685.08|0.10|0.02|N|O|1998-03-13|1998-04-14|1998-03-20|TAKE BACK RETURN|AIR|y pending cour +53666|856|57|1|19|33380.15|0.08|0.06|N|O|1997-08-25|1997-09-24|1997-09-03|COLLECT COD|MAIL|ccounts after th +53666|1734|77|2|14|22900.22|0.03|0.03|N|O|1997-10-10|1997-09-08|1997-10-14|TAKE BACK RETURN|RAIL| furiously thin pinto beans +53666|399|84|3|33|42879.87|0.07|0.07|N|O|1997-08-01|1997-08-26|1997-08-18|TAKE BACK RETURN|REG AIR|s according to t +53666|985|86|4|30|56579.40|0.02|0.05|N|O|1997-09-08|1997-10-04|1997-09-25|NONE|REG AIR|packages cajole after the quickly +53666|1084|20|5|2|1970.16|0.09|0.08|N|O|1997-10-16|1997-10-05|1997-11-06|COLLECT COD|MAIL|ts. platelets haggle quickly. blithel +53667|1490|30|1|50|69574.50|0.01|0.06|A|F|1992-08-01|1992-08-06|1992-08-22|NONE|RAIL|uses thrash slyly-- c +53667|278|60|2|32|37704.64|0.01|0.05|R|F|1992-09-06|1992-08-03|1992-09-09|COLLECT COD|AIR|final packages. c +53668|556|17|1|32|46609.60|0.02|0.03|R|F|1993-07-03|1993-06-19|1993-07-23|NONE|SHIP| ironic packages boost slyly ex +53668|1482|100|2|16|22135.68|0.06|0.04|R|F|1993-07-07|1993-05-01|1993-07-12|DELIVER IN PERSON|MAIL| dependencies haggle furiously ex +53668|1898|42|3|20|35997.80|0.04|0.06|A|F|1993-05-19|1993-06-29|1993-05-22|COLLECT COD|TRUCK|ckly. quiet requ +53668|917|86|4|24|43629.84|0.01|0.07|A|F|1993-04-24|1993-06-21|1993-04-30|NONE|TRUCK| express dep +53668|811|12|5|7|11982.67|0.10|0.07|R|F|1993-07-07|1993-05-17|1993-07-14|TAKE BACK RETURN|RAIL|oze silently about the b +53668|1704|89|6|18|28902.60|0.09|0.00|R|F|1993-06-29|1993-05-21|1993-07-16|COLLECT COD|TRUCK|y final theodolites. u +53669|933|68|1|42|77025.06|0.00|0.06|N|O|1998-05-16|1998-04-15|1998-06-07|COLLECT COD|FOB|nusual requests after th +53669|564|65|2|28|41007.68|0.03|0.06|N|O|1998-05-28|1998-05-16|1998-06-10|DELIVER IN PERSON|AIR| against the regular, special deposits. s +53669|823|24|3|43|74124.26|0.03|0.07|N|O|1998-04-04|1998-05-01|1998-04-08|COLLECT COD|MAIL|y quickly iron +53669|329|86|4|7|8605.24|0.07|0.02|N|O|1998-05-01|1998-05-12|1998-05-24|DELIVER IN PERSON|TRUCK|sly ironic pearls. +53669|1380|57|5|45|57662.10|0.04|0.00|N|O|1998-04-27|1998-05-27|1998-05-13|NONE|RAIL|quickly. pen +53670|716|17|1|4|6466.84|0.01|0.05|A|F|1993-12-07|1994-02-02|1993-12-12|NONE|SHIP|phins sleep pending +53671|1539|60|1|7|10083.71|0.05|0.02|N|O|1995-08-24|1995-08-05|1995-09-23|COLLECT COD|MAIL|counts. eve +53671|1375|76|2|35|44672.95|0.00|0.01|N|O|1995-08-26|1995-09-07|1995-09-15|DELIVER IN PERSON|SHIP|requests cajole along the expres +53671|1947|48|3|25|46223.50|0.00|0.03|N|O|1995-08-22|1995-08-29|1995-09-10|COLLECT COD|AIR|egular instructions haggle above the pendi +53671|1677|78|4|28|44202.76|0.04|0.02|N|O|1995-09-04|1995-07-25|1995-09-07|NONE|REG AIR| even accounts +53671|185|64|5|16|17362.88|0.02|0.03|N|F|1995-06-17|1995-07-19|1995-06-18|DELIVER IN PERSON|SHIP|h beyond the unusual, pending accoun +53671|300|82|6|20|24006.00|0.09|0.05|N|O|1995-09-18|1995-08-24|1995-10-12|COLLECT COD|TRUCK|kly pending asymptotes us +53696|868|68|1|34|60141.24|0.10|0.03|R|F|1994-01-22|1994-03-03|1994-01-26|TAKE BACK RETURN|FOB|ily. quickly even excuses impress s +53696|675|7|2|16|25210.72|0.01|0.08|R|F|1994-03-04|1994-01-31|1994-03-27|NONE|RAIL|ag accordi +53696|1921|66|3|26|47395.92|0.00|0.08|A|F|1994-03-22|1994-02-18|1994-03-28|DELIVER IN PERSON|FOB|theodolites +53696|1239|14|4|45|51310.35|0.06|0.05|A|F|1994-02-08|1994-01-30|1994-02-13|DELIVER IN PERSON|RAIL|ns instead o +53696|10|11|5|36|32760.36|0.10|0.05|R|F|1994-03-29|1994-01-30|1994-04-05|NONE|REG AIR|as affix bli +53697|22|48|1|25|23050.50|0.08|0.02|R|F|1993-02-07|1993-03-27|1993-02-10|TAKE BACK RETURN|AIR|s. ideas use slyly after the +53698|529|20|1|40|57180.80|0.02|0.05|A|F|1992-07-19|1992-08-08|1992-07-20|DELIVER IN PERSON|FOB|sly bold dependencies u +53698|1826|27|2|29|50106.78|0.06|0.08|A|F|1992-06-21|1992-07-27|1992-06-25|TAKE BACK RETURN|RAIL|phins. furiously reg +53698|1032|33|3|47|43852.41|0.02|0.00|R|F|1992-09-09|1992-08-26|1992-10-01|TAKE BACK RETURN|RAIL|e fluffily. furiously even instruction +53699|796|61|1|5|8483.95|0.06|0.04|N|O|1996-11-10|1996-12-05|1996-11-16|TAKE BACK RETURN|MAIL|sits cajole fluffily slyly pending request +53699|713|14|2|33|53252.43|0.07|0.08|N|O|1996-12-23|1996-12-21|1997-01-22|NONE|REG AIR|g furiously ironic deposits. q +53699|812|12|3|5|8564.05|0.07|0.03|N|O|1996-11-24|1996-11-20|1996-11-26|COLLECT COD|MAIL|ons. accounts haggle. +53699|1024|60|4|8|7400.16|0.03|0.01|N|O|1997-01-28|1996-12-17|1997-02-26|TAKE BACK RETURN|FOB|sly silent ideas +53699|1421|22|5|26|34382.92|0.06|0.05|N|O|1997-01-27|1996-12-16|1997-02-17|DELIVER IN PERSON|RAIL| final asymptotes. slyly +53699|46|97|6|24|22704.96|0.07|0.03|N|O|1997-02-03|1997-01-02|1997-02-22|NONE|AIR|ter the packages nag blith +53699|457|16|7|29|39366.05|0.06|0.08|N|O|1996-11-29|1996-12-04|1996-12-22|DELIVER IN PERSON|REG AIR|deposits sleep furiously slyly final +53700|1814|15|1|26|44611.06|0.05|0.02|N|O|1997-01-01|1997-02-02|1997-01-08|COLLECT COD|FOB|ully ironic packag +53700|189|90|2|27|29407.86|0.05|0.00|N|O|1997-02-13|1997-02-24|1997-03-04|DELIVER IN PERSON|REG AIR|sits doubt busily after the fluffily sile +53701|1798|41|1|39|66291.81|0.05|0.04|N|O|1998-03-15|1998-04-10|1998-04-02|COLLECT COD|MAIL|ding to the +53701|348|49|2|31|38698.54|0.04|0.05|N|O|1998-03-25|1998-05-18|1998-04-20|TAKE BACK RETURN|AIR|es about the regular, +53701|1445|63|3|26|35007.44|0.06|0.05|N|O|1998-04-06|1998-04-21|1998-04-24|NONE|MAIL|riously final deposits are aft +53702|1326|41|1|3|3681.96|0.09|0.07|R|F|1994-08-15|1994-06-10|1994-09-05|DELIVER IN PERSON|AIR| special ideas print always. slyl +53702|469|57|2|16|21911.36|0.01|0.04|R|F|1994-08-24|1994-07-01|1994-09-17|TAKE BACK RETURN|SHIP|regular courts after the acc +53702|1188|25|3|5|5445.90|0.02|0.02|A|F|1994-06-10|1994-07-10|1994-06-12|DELIVER IN PERSON|REG AIR|ages cajole carefully regular depo +53702|1880|10|4|28|49892.64|0.10|0.08|R|F|1994-05-08|1994-05-27|1994-05-21|COLLECT COD|FOB| instructions wake +53702|1778|79|5|10|16797.70|0.01|0.01|R|F|1994-06-12|1994-06-21|1994-06-15|TAKE BACK RETURN|TRUCK| even, final ideas sleep ca +53703|849|50|1|5|8749.20|0.05|0.03|R|F|1993-06-28|1993-09-02|1993-07-01|TAKE BACK RETURN|SHIP|ld sleep according to the requests +53703|442|1|2|18|24163.92|0.08|0.01|A|F|1993-07-06|1993-08-31|1993-07-14|DELIVER IN PERSON|AIR|furiously +53703|801|35|3|35|59563.00|0.05|0.03|A|F|1993-08-04|1993-08-04|1993-08-21|TAKE BACK RETURN|RAIL| furiously +53703|497|27|4|9|12577.41|0.10|0.02|A|F|1993-09-14|1993-08-31|1993-10-07|TAKE BACK RETURN|RAIL| regular deposits run quickly after the c +53728|1752|79|1|42|69457.50|0.02|0.06|N|O|1995-11-19|1996-01-16|1995-12-10|TAKE BACK RETURN|AIR|y slow packages +53728|1530|31|2|10|14315.30|0.05|0.04|N|O|1996-01-07|1995-12-15|1996-01-25|DELIVER IN PERSON|TRUCK|nic pinto beans. carefully bold +53728|441|29|3|42|56340.48|0.04|0.02|N|O|1995-12-08|1995-12-03|1995-12-14|COLLECT COD|REG AIR|l instructions. slyl +53729|537|38|1|43|61813.79|0.05|0.08|N|O|1997-04-18|1997-03-17|1997-05-03|TAKE BACK RETURN|MAIL| unusual requests along +53730|295|50|1|16|19124.64|0.00|0.07|R|F|1993-03-11|1993-03-12|1993-03-25|TAKE BACK RETURN|FOB|ccounts? fluffily expres +53730|1146|19|2|20|20942.80|0.08|0.07|R|F|1993-04-13|1993-03-04|1993-05-05|NONE|RAIL|. slyly pending packages engage f +53730|568|99|3|41|60210.96|0.05|0.03|R|F|1993-04-08|1993-03-26|1993-04-11|NONE|SHIP|s boost furi +53730|1566|47|4|29|42559.24|0.08|0.08|A|F|1993-01-12|1993-03-13|1993-01-22|NONE|MAIL| regular d +53730|501|62|5|11|15416.50|0.06|0.07|A|F|1993-04-14|1993-03-11|1993-04-22|NONE|MAIL|packages boost fluffi +53731|1112|21|1|38|38498.18|0.07|0.06|N|O|1998-06-09|1998-04-10|1998-07-09|DELIVER IN PERSON|AIR|osits wake furiously. ironic, even +53731|1642|66|2|4|6174.56|0.05|0.03|N|O|1998-06-16|1998-04-20|1998-06-24|DELIVER IN PERSON|FOB|jole at the blithel +53731|977|78|3|7|13145.79|0.04|0.06|N|O|1998-05-29|1998-04-23|1998-06-15|DELIVER IN PERSON|TRUCK|requests use a +53731|912|15|4|25|45322.75|0.05|0.05|N|O|1998-03-28|1998-05-26|1998-04-20|NONE|FOB| silent, regular req +53732|1682|6|1|29|45926.72|0.10|0.06|N|O|1995-07-24|1995-08-06|1995-08-02|DELIVER IN PERSON|TRUCK|ar packages. fluffily final accoun +53732|868|2|2|5|8844.30|0.02|0.06|N|O|1995-07-26|1995-09-12|1995-08-16|TAKE BACK RETURN|SHIP|ully pending realms. slyly regular de +53732|1206|7|3|4|4428.80|0.01|0.06|N|O|1995-07-19|1995-08-04|1995-08-15|DELIVER IN PERSON|SHIP|jole along the regular deposits. slyl +53732|1035|36|4|16|14976.48|0.08|0.00|N|O|1995-09-01|1995-08-31|1995-09-15|NONE|AIR|blithely pending courts cajole fluffil +53733|1074|10|1|23|22426.61|0.02|0.06|N|O|1997-04-27|1997-04-22|1997-05-19|TAKE BACK RETURN|RAIL|to the bravely special orbits. slyly specia +53733|271|99|2|4|4685.08|0.01|0.02|N|O|1997-04-21|1997-04-15|1997-04-23|NONE|RAIL|carefully after the slyly s +53733|747|80|3|43|70852.82|0.04|0.03|N|O|1997-04-03|1997-03-26|1997-04-09|NONE|AIR|cial frets cajole furio +53733|160|61|4|35|37105.60|0.03|0.07|N|O|1997-02-24|1997-05-01|1997-03-12|NONE|FOB|ld quickly. slyly special plat +53733|371|28|5|27|34326.99|0.01|0.08|N|O|1997-05-14|1997-05-12|1997-05-25|DELIVER IN PERSON|RAIL|arefully about the carefully even foxes. +53733|1278|90|6|16|18868.32|0.04|0.08|N|O|1997-05-25|1997-05-02|1997-06-01|NONE|REG AIR|ickly above the final packages. doggedly ev +53733|1156|93|7|13|13742.95|0.07|0.07|N|O|1997-05-23|1997-04-21|1997-06-18|TAKE BACK RETURN|MAIL| alongside of the quickly +53734|1379|80|1|42|53775.54|0.07|0.06|N|O|1997-05-14|1997-05-10|1997-05-18|COLLECT COD|REG AIR|as wake enticingly fi +53735|15|66|1|4|3660.04|0.10|0.07|N|O|1997-03-05|1997-04-21|1997-03-10|NONE|MAIL|? deposits wake furiously. silently bo +53735|340|69|2|6|7442.04|0.08|0.00|N|O|1997-05-07|1997-02-27|1997-06-04|NONE|RAIL|ess sheave +53760|1216|17|1|7|7820.47|0.03|0.03|N|O|1996-05-16|1996-06-16|1996-06-04|COLLECT COD|FOB|gular theodolites. flu +53760|722|23|2|33|53549.76|0.08|0.07|N|O|1996-05-02|1996-06-01|1996-05-30|TAKE BACK RETURN|REG AIR| to the final, ironic accounts integrate ca +53760|407|8|3|29|37914.60|0.10|0.04|N|O|1996-07-03|1996-05-25|1996-08-01|TAKE BACK RETURN|FOB|al ideas use furiously. quickly +53760|1365|66|4|16|20261.76|0.10|0.01|N|O|1996-06-24|1996-05-20|1996-06-28|COLLECT COD|MAIL| among the dogged depe +53760|1797|98|5|7|11891.53|0.09|0.05|N|O|1996-05-08|1996-05-30|1996-05-16|COLLECT COD|MAIL|g finally carefully +53760|660|23|6|18|28091.88|0.08|0.04|N|O|1996-06-06|1996-06-11|1996-06-08|COLLECT COD|RAIL|onic platelets breach +53760|763|28|7|2|3327.52|0.03|0.08|N|O|1996-04-21|1996-05-29|1996-05-18|DELIVER IN PERSON|FOB|bold excuses are; regular c +53761|1167|76|1|32|34181.12|0.03|0.06|N|O|1995-07-28|1995-06-25|1995-08-19|COLLECT COD|AIR|s. carefully bold foxes are. bravely +53761|965|100|2|20|37319.20|0.06|0.03|N|O|1995-08-04|1995-05-20|1995-09-01|COLLECT COD|TRUCK|uickly. deposits after the +53762|568|99|1|1|1468.56|0.03|0.08|A|F|1992-07-20|1992-07-06|1992-08-07|DELIVER IN PERSON|REG AIR|sual asymptotes. slyly pend +53762|1909|42|2|21|38028.90|0.07|0.03|R|F|1992-08-13|1992-07-14|1992-08-31|TAKE BACK RETURN|AIR|unts. epitaphs de +53762|424|54|3|9|11919.78|0.04|0.04|A|F|1992-07-06|1992-08-22|1992-07-22|COLLECT COD|RAIL| the foxes. deposits cajo +53762|430|31|4|42|55878.06|0.00|0.07|R|F|1992-06-12|1992-08-31|1992-06-28|NONE|TRUCK|ress across the furiously pending p +53762|1041|42|5|9|8478.36|0.10|0.00|R|F|1992-07-18|1992-07-18|1992-07-28|DELIVER IN PERSON|REG AIR|uests are packages. slyly regula +53763|1231|32|1|48|54347.04|0.04|0.08|N|O|1996-07-20|1996-08-05|1996-07-27|DELIVER IN PERSON|AIR|nding ideas integrate care +53763|333|90|2|41|50566.53|0.09|0.04|N|O|1996-06-23|1996-07-19|1996-06-28|COLLECT COD|MAIL|, pending ins +53764|1466|67|1|7|9572.22|0.04|0.02|N|O|1997-06-01|1997-06-06|1997-06-17|NONE|MAIL|efully pending req +53764|1025|96|2|48|44448.96|0.01|0.02|N|O|1997-06-17|1997-05-28|1997-06-30|DELIVER IN PERSON|FOB| regular accounts. regula +53764|1283|84|3|22|26054.16|0.00|0.00|N|O|1997-05-01|1997-05-24|1997-05-24|COLLECT COD|MAIL|counts are slyly ironic +53764|1123|96|4|8|8192.96|0.04|0.08|N|O|1997-07-23|1997-06-23|1997-08-22|NONE|REG AIR|ly pending a +53764|10|86|5|9|8190.09|0.00|0.06|N|O|1997-06-21|1997-06-07|1997-07-01|COLLECT COD|TRUCK|gle boldly expre +53764|1017|18|6|29|26622.29|0.05|0.08|N|O|1997-05-02|1997-05-28|1997-05-05|NONE|REG AIR|he permanent requests. ironic pains wake fl +53765|1161|98|1|45|47797.20|0.04|0.00|R|F|1993-11-16|1993-12-13|1993-12-07|TAKE BACK RETURN|MAIL| ironic pin +53765|1727|28|2|47|76549.84|0.05|0.07|R|F|1993-12-28|1993-12-09|1993-12-31|DELIVER IN PERSON|MAIL|r pinto beans sleep fluffily +53765|41|92|3|41|38582.64|0.10|0.04|R|F|1994-01-23|1993-12-22|1994-02-01|COLLECT COD|REG AIR|usly alongs +53766|1648|72|1|50|77482.00|0.02|0.08|R|F|1995-01-06|1995-01-09|1995-01-10|NONE|AIR|ely pending requests are pending instr +53767|32|33|1|2|1864.06|0.03|0.01|N|O|1995-10-29|1995-10-16|1995-10-30|TAKE BACK RETURN|TRUCK|beans wake acro +53767|56|57|2|7|6692.35|0.02|0.05|N|O|1995-08-30|1995-11-15|1995-08-31|COLLECT COD|AIR|thely furi +53767|529|20|3|29|41456.08|0.04|0.08|N|O|1995-11-25|1995-10-27|1995-11-29|TAKE BACK RETURN|RAIL|iously pending accounts are speci +53767|1256|94|4|35|40503.75|0.04|0.06|N|O|1995-09-30|1995-10-15|1995-10-10|DELIVER IN PERSON|SHIP| slyly pending +53767|729|62|5|12|19556.64|0.06|0.03|N|O|1995-10-08|1995-10-10|1995-11-04|COLLECT COD|REG AIR|ggle. blithely express theodolite +53767|1441|59|6|36|48327.84|0.04|0.08|N|O|1995-09-29|1995-11-05|1995-10-27|DELIVER IN PERSON|REG AIR|ously ironic excuses integrate stealth +53792|1918|7|1|44|80076.04|0.03|0.00|N|O|1998-07-02|1998-07-10|1998-07-15|DELIVER IN PERSON|TRUCK|ves sleep quickly unusual theodol +53792|729|30|2|24|39113.28|0.10|0.02|N|O|1998-06-27|1998-07-06|1998-07-06|TAKE BACK RETURN|TRUCK|ffily bold platelets wake +53792|1981|14|3|6|11297.88|0.10|0.01|N|O|1998-09-07|1998-07-31|1998-09-08|NONE|SHIP|ly unusual orbits. carefully regular a +53792|330|59|4|6|7381.98|0.09|0.02|N|O|1998-09-14|1998-07-07|1998-10-12|NONE|AIR|s snooze f +53793|1047|83|1|35|33181.40|0.09|0.03|A|F|1994-11-25|1994-12-23|1994-12-07|TAKE BACK RETURN|FOB|ts. carefully regula +53793|259|87|2|36|41733.00|0.06|0.07|A|F|1995-02-09|1995-02-07|1995-03-05|NONE|REG AIR|en requests. blithely pendi +53793|424|12|3|6|7946.52|0.03|0.03|A|F|1995-01-29|1995-02-04|1995-02-12|NONE|RAIL|uriously close foxes. final accounts +53793|1889|90|4|9|16117.92|0.03|0.01|R|F|1994-11-21|1994-12-16|1994-12-10|DELIVER IN PERSON|FOB|round the regular depend +53793|1175|12|5|8|8609.36|0.05|0.08|A|F|1994-11-29|1994-12-20|1994-12-13|TAKE BACK RETURN|MAIL| slyly bold, unusual as +53793|136|37|6|1|1036.13|0.10|0.05|A|F|1995-02-14|1995-01-06|1995-03-13|NONE|AIR|l deposits are +53794|510|41|1|26|36673.26|0.02|0.03|N|O|1997-11-27|1997-10-15|1997-12-08|DELIVER IN PERSON|SHIP|sly furious deposits are quic +53794|1241|79|2|40|45689.60|0.00|0.05|N|O|1998-01-07|1997-10-28|1998-01-11|DELIVER IN PERSON|AIR|ial foxes integrate after the pending, u +53794|1726|27|3|20|32554.40|0.03|0.02|N|O|1997-12-30|1997-10-15|1998-01-29|COLLECT COD|AIR|fully special excuses. blithely +53794|1960|5|4|33|61444.68|0.06|0.06|N|O|1997-10-18|1997-10-19|1997-10-30|TAKE BACK RETURN|SHIP|ial requests hinder +53795|463|64|1|46|62719.16|0.10|0.04|A|F|1992-02-15|1992-03-19|1992-02-21|DELIVER IN PERSON|RAIL|daring dugouts cajole furiously. carefully +53795|678|10|2|13|20522.71|0.00|0.01|R|F|1992-03-09|1992-03-01|1992-03-24|DELIVER IN PERSON|FOB|press accounts affix fluffily. pack +53795|1468|8|3|37|50670.02|0.08|0.00|R|F|1992-02-15|1992-04-04|1992-02-18|COLLECT COD|MAIL|egular packages cajole enticingly regular +53795|827|94|4|2|3455.64|0.05|0.07|A|F|1992-05-15|1992-04-19|1992-06-05|TAKE BACK RETURN|MAIL|ans according to the +53795|14|90|5|26|23764.26|0.03|0.04|R|F|1992-03-27|1992-04-23|1992-04-08|TAKE BACK RETURN|TRUCK|ructions hinder ironic instruction +53795|397|82|6|7|9081.73|0.03|0.00|R|F|1992-05-14|1992-04-10|1992-05-30|DELIVER IN PERSON|REG AIR|regular dolphins. even +53796|1111|20|1|17|17205.87|0.03|0.02|A|F|1993-09-22|1993-08-08|1993-09-30|TAKE BACK RETURN|FOB|efully reg +53797|578|79|1|34|50271.38|0.02|0.07|A|F|1995-01-05|1994-11-15|1995-01-23|TAKE BACK RETURN|SHIP| fluffily fluffily +53797|430|18|2|12|15965.16|0.01|0.02|A|F|1995-01-20|1994-11-01|1995-02-12|NONE|RAIL|he pending packag +53797|1717|60|3|38|61510.98|0.03|0.03|R|F|1995-01-27|1994-12-20|1995-01-28|DELIVER IN PERSON|MAIL|ent accounts. regular requests caj +53797|357|58|4|33|41492.55|0.10|0.00|A|F|1995-01-19|1994-11-03|1995-02-12|DELIVER IN PERSON|RAIL|e slyly regular accounts. qui +53797|769|2|5|15|25046.40|0.06|0.00|A|F|1994-10-22|1994-12-05|1994-11-03|TAKE BACK RETURN|MAIL|nding ideas are regular, +53797|60|11|6|26|24961.56|0.07|0.01|A|F|1994-12-30|1994-11-27|1995-01-17|NONE|RAIL|ns use und +53798|45|71|1|4|3780.16|0.04|0.06|A|F|1994-05-16|1994-05-26|1994-06-04|COLLECT COD|SHIP|usly ironic +53798|744|77|2|50|82237.00|0.01|0.05|R|F|1994-08-16|1994-07-06|1994-08-18|TAKE BACK RETURN|REG AIR|ickly regular pinto be +53798|588|49|3|48|71451.84|0.03|0.00|R|F|1994-05-28|1994-06-12|1994-06-24|TAKE BACK RETURN|TRUCK|fluffily fluffy requests are carefully ac +53799|1102|39|1|45|45139.50|0.00|0.07|N|O|1997-01-26|1997-03-03|1997-02-09|TAKE BACK RETURN|REG AIR|, express ideas affix against the fluffil +53799|1339|78|2|37|45892.21|0.04|0.07|N|O|1997-04-10|1997-02-16|1997-05-02|TAKE BACK RETURN|MAIL|urious frays. carefully final foxes cajole +53799|735|68|3|42|68700.66|0.00|0.06|N|O|1997-01-04|1997-01-20|1997-01-25|TAKE BACK RETURN|FOB|ly about the carefully speci +53799|850|17|4|1|1750.85|0.06|0.06|N|O|1997-04-01|1997-03-08|1997-04-21|COLLECT COD|FOB|re furiously across the specia +53799|342|43|5|43|53420.62|0.05|0.04|N|O|1997-03-08|1997-02-05|1997-03-12|DELIVER IN PERSON|MAIL| alongside of the pending deposits doubt ir +53799|385|42|6|7|8997.66|0.00|0.08|N|O|1997-02-06|1997-01-23|1997-02-16|NONE|SHIP|ual pinto +53799|1240|41|7|6|6847.44|0.05|0.02|N|O|1997-04-04|1997-01-18|1997-04-27|NONE|AIR| the quick, even requests +53824|790|23|1|18|30434.22|0.04|0.02|N|O|1997-07-22|1997-08-26|1997-08-05|COLLECT COD|REG AIR|rint ironic foxes. +53825|1131|68|1|33|34060.29|0.09|0.08|N|O|1995-07-06|1995-06-26|1995-07-08|NONE|RAIL|s haggle slyly. pending, regular dependenc +53825|1|27|2|25|22525.00|0.00|0.02|N|O|1995-07-28|1995-07-03|1995-07-31|DELIVER IN PERSON|RAIL|thinly pending package +53825|1164|1|3|45|47932.20|0.04|0.00|A|F|1995-06-11|1995-06-27|1995-06-15|DELIVER IN PERSON|TRUCK|ever even accounts. sp +53825|1780|23|4|4|6727.12|0.02|0.00|A|F|1995-05-23|1995-06-16|1995-06-05|DELIVER IN PERSON|MAIL|al accounts are furiously benea +53825|868|68|5|10|17688.60|0.10|0.02|A|F|1995-05-31|1995-05-11|1995-06-13|DELIVER IN PERSON|SHIP| wake courts. fluffily even requests doubt +53825|1218|93|6|33|36933.93|0.03|0.01|R|F|1995-06-03|1995-05-22|1995-06-09|TAKE BACK RETURN|RAIL|packages wake blithely ruthlessly +53826|1614|15|1|27|40921.47|0.01|0.07|N|O|1996-12-30|1997-01-29|1997-01-18|DELIVER IN PERSON|REG AIR|ts. blithely sp +53826|1415|33|2|36|47390.76|0.03|0.04|N|O|1997-01-16|1997-01-06|1997-02-03|TAKE BACK RETURN|TRUCK|al, even foxes haggle carefully accordi +53826|1178|15|3|29|31295.93|0.04|0.07|N|O|1997-02-09|1996-12-14|1997-02-24|COLLECT COD|FOB| alongside of the furiousl +53827|1668|69|1|18|28253.88|0.10|0.01|N|O|1998-02-11|1998-02-28|1998-02-19|DELIVER IN PERSON|FOB|the blithely bold packages +53827|1810|97|2|31|53066.11|0.09|0.06|N|O|1998-02-06|1998-03-08|1998-02-17|DELIVER IN PERSON|REG AIR|deposits boost quickly after the furiousl +53827|453|41|3|9|12181.05|0.07|0.08|N|O|1997-12-15|1998-01-16|1997-12-27|NONE|FOB| regular packages across the quickly re +53828|1504|5|1|35|49192.50|0.04|0.08|N|O|1996-08-30|1996-08-02|1996-09-09|TAKE BACK RETURN|MAIL|cording to the unusual theodolites. +53828|1251|89|2|16|18436.00|0.00|0.05|N|O|1996-06-19|1996-09-03|1996-07-05|NONE|FOB|cajole quickly idly even deposits; fluff +53829|896|97|1|1|1796.89|0.03|0.02|N|O|1997-04-13|1997-04-15|1997-05-09|DELIVER IN PERSON|FOB|inal plate +53829|529|20|2|45|64328.40|0.06|0.07|N|O|1997-04-20|1997-05-09|1997-05-03|NONE|MAIL|ording to the furiously even ideas. expre +53829|914|49|3|32|58077.12|0.03|0.05|N|O|1997-04-18|1997-05-07|1997-04-27|TAKE BACK RETURN|AIR|ic platelets. package +53829|1789|90|4|2|3381.56|0.06|0.04|N|O|1997-05-17|1997-04-17|1997-05-29|DELIVER IN PERSON|TRUCK|blithely express dependencies. doggedly un +53829|1713|98|5|31|50056.01|0.05|0.05|N|O|1997-05-13|1997-05-01|1997-05-22|COLLECT COD|TRUCK|ld depths. express pear +53830|970|73|1|13|24322.61|0.00|0.04|A|F|1993-11-12|1993-11-06|1993-12-05|TAKE BACK RETURN|AIR|ccounts. final, special requests amo +53830|13|14|2|1|913.01|0.03|0.07|R|F|1993-10-16|1993-09-30|1993-10-28|NONE|AIR|efully across t +53830|1096|32|3|25|24927.25|0.02|0.07|R|F|1993-09-17|1993-10-23|1993-09-28|TAKE BACK RETURN|RAIL|tly slyly regular packages. blithely even d +53830|1552|33|4|27|39245.85|0.10|0.02|A|F|1993-11-10|1993-10-05|1993-12-10|DELIVER IN PERSON|AIR|leep finally +53830|881|48|5|10|17818.80|0.09|0.06|A|F|1993-10-23|1993-11-20|1993-10-31|COLLECT COD|SHIP|ges maintain slyly fluffily bold ideas +53830|845|79|6|5|8729.20|0.03|0.01|R|F|1993-12-18|1993-10-26|1994-01-02|TAKE BACK RETURN|SHIP|s promise fluffily blithely ironic de +53831|312|41|1|5|6061.55|0.00|0.01|N|O|1998-04-15|1998-06-10|1998-04-17|TAKE BACK RETURN|MAIL|s instructions across the +53831|1006|77|2|37|33559.00|0.05|0.06|N|O|1998-04-09|1998-04-17|1998-05-07|DELIVER IN PERSON|AIR|hely even accounts. ironic deposits +53831|1754|39|3|42|69541.50|0.04|0.06|N|O|1998-07-07|1998-04-17|1998-07-21|DELIVER IN PERSON|MAIL|he slyly quiet accounts. ironic requests s +53831|464|94|4|43|58671.78|0.01|0.06|N|O|1998-06-29|1998-04-26|1998-07-19|NONE|REG AIR|ar packages. pending, even request +53831|1754|39|5|7|11590.25|0.02|0.08|N|O|1998-06-18|1998-05-07|1998-07-12|NONE|AIR|ithely pending r +53831|1626|50|6|24|36662.88|0.10|0.08|N|O|1998-06-07|1998-04-25|1998-06-29|NONE|RAIL|lar foxes slee +53831|583|14|7|43|63793.94|0.09|0.08|N|O|1998-05-25|1998-05-25|1998-06-10|NONE|RAIL|ticing foxes. in +53856|909|44|1|8|14479.20|0.07|0.06|N|O|1996-07-19|1996-06-29|1996-08-12|COLLECT COD|RAIL|ependencies wake carefully after the pendi +53856|288|43|2|28|33271.84|0.08|0.05|N|O|1996-09-02|1996-07-23|1996-09-24|NONE|MAIL|express deposits. ironic deposit +53856|1463|3|3|19|25924.74|0.01|0.05|N|O|1996-06-01|1996-06-12|1996-06-07|NONE|FOB|c, final packag +53857|1491|9|1|34|47344.66|0.08|0.07|N|O|1996-06-02|1996-06-08|1996-06-24|NONE|AIR|cies cajole expres +53857|1366|81|2|12|15208.32|0.09|0.05|N|O|1996-04-09|1996-06-18|1996-05-01|TAKE BACK RETURN|RAIL|dolites sl +53857|295|50|3|8|9562.32|0.05|0.03|N|O|1996-07-02|1996-05-28|1996-07-31|DELIVER IN PERSON|FOB|ckly bold pint +53857|32|58|4|50|46601.50|0.07|0.08|N|O|1996-06-01|1996-04-28|1996-06-28|NONE|TRUCK|c requests thrash fluffily eve +53857|1790|75|5|14|23685.06|0.01|0.01|N|O|1996-04-14|1996-06-06|1996-04-24|NONE|MAIL|metimes. regular packages wake +53857|1991|92|6|40|75719.60|0.07|0.03|N|O|1996-06-30|1996-04-29|1996-07-13|COLLECT COD|TRUCK|ages. slyly silen +53857|413|43|7|19|24954.79|0.06|0.08|N|O|1996-06-08|1996-06-05|1996-07-04|NONE|FOB|ets nag blithely pinto beans: theodol +53858|154|33|1|11|11595.65|0.02|0.06|N|O|1998-08-19|1998-07-30|1998-09-14|COLLECT COD|TRUCK|nal foxes use blithely. care +53858|843|10|2|9|15694.56|0.00|0.06|N|O|1998-09-04|1998-08-24|1998-09-07|TAKE BACK RETURN|SHIP|ironic packages. silently fluffy foxes prin +53858|1514|15|3|4|5662.04|0.09|0.03|N|O|1998-06-18|1998-07-17|1998-07-03|TAKE BACK RETURN|TRUCK|the deposits kindle blithely across th +53859|712|45|1|22|35479.62|0.03|0.00|A|F|1993-08-25|1993-07-03|1993-08-30|COLLECT COD|RAIL|carefully bold packages. quickly unu +53860|431|61|1|4|5325.72|0.03|0.08|R|F|1994-04-18|1994-03-14|1994-05-18|NONE|MAIL|packages. accounts cajole slyly s +53861|1830|60|1|18|31172.94|0.07|0.02|N|O|1996-06-16|1996-04-26|1996-07-08|NONE|FOB|c dependencies boost furiously fin +53861|1031|37|2|41|38213.23|0.07|0.05|N|O|1996-07-06|1996-05-23|1996-08-01|TAKE BACK RETURN|FOB|ding accoun +53861|1501|22|3|48|67320.00|0.10|0.07|N|O|1996-07-21|1996-05-05|1996-08-05|DELIVER IN PERSON|MAIL| nag fluffily accordi +53861|668|69|4|1|1568.66|0.09|0.07|N|O|1996-03-28|1996-06-08|1996-04-24|TAKE BACK RETURN|SHIP|posits haggle. depe +53861|359|88|5|1|1259.35|0.02|0.04|N|O|1996-06-04|1996-06-16|1996-06-25|TAKE BACK RETURN|SHIP|f the regular, silent somas run carefully a +53861|1002|8|6|46|41538.00|0.03|0.02|N|O|1996-04-05|1996-06-09|1996-04-30|NONE|SHIP|its haggle. speci +53861|1636|37|7|5|7688.15|0.01|0.08|N|O|1996-04-01|1996-05-28|1996-04-17|NONE|FOB|pths boost carefully +53862|1550|51|1|9|13063.95|0.05|0.07|N|O|1996-07-21|1996-08-19|1996-07-26|TAKE BACK RETURN|SHIP|kages haggle carefully slow theodolit +53862|1409|49|2|42|55036.80|0.05|0.01|N|O|1996-08-06|1996-08-12|1996-08-21|NONE|FOB|nt deposit +53862|1611|35|3|45|68067.45|0.08|0.00|N|O|1996-09-28|1996-09-29|1996-10-15|COLLECT COD|SHIP|ar dependencies boost alongs +53862|1554|95|4|3|4366.65|0.04|0.06|N|O|1996-08-13|1996-09-01|1996-09-10|TAKE BACK RETURN|SHIP|y regular realms. fluffily bold pac +53862|931|32|5|22|40302.46|0.00|0.01|N|O|1996-09-20|1996-09-07|1996-10-16|COLLECT COD|AIR|equests dazzle carefully furi +53863|614|15|1|8|12116.88|0.04|0.00|R|F|1993-09-27|1993-08-21|1993-10-17|DELIVER IN PERSON|TRUCK|luffily fi +53863|1280|18|2|49|57882.72|0.06|0.01|R|F|1993-08-23|1993-07-18|1993-09-03|COLLECT COD|MAIL|nto beans use furiously after +53863|909|10|3|41|74205.90|0.07|0.02|A|F|1993-10-01|1993-08-09|1993-10-20|TAKE BACK RETURN|FOB|ar accounts. pendin +53863|1222|60|4|44|49421.68|0.03|0.06|A|F|1993-07-16|1993-08-15|1993-07-29|DELIVER IN PERSON|AIR|ake blithely carefull +53888|1710|37|1|21|33845.91|0.00|0.06|N|O|1997-05-31|1997-04-12|1997-06-23|NONE|RAIL|hin packages sleep around +53888|1993|82|2|25|47374.75|0.10|0.01|N|O|1997-04-02|1997-03-11|1997-04-23|NONE|FOB|ld requests h +53888|913|14|3|34|61672.94|0.06|0.01|N|O|1997-05-18|1997-03-30|1997-06-09|TAKE BACK RETURN|REG AIR|ons use. final asymptotes affix carefull +53888|1121|94|4|31|31685.72|0.04|0.04|N|O|1997-06-03|1997-04-07|1997-06-11|COLLECT COD|TRUCK|ts wake after the blithely ev +53888|1980|13|5|31|58341.38|0.01|0.05|N|O|1997-05-22|1997-03-13|1997-05-24|TAKE BACK RETURN|MAIL|al deposits ca +53888|1912|45|6|29|52603.39|0.06|0.07|N|O|1997-04-18|1997-04-11|1997-05-08|DELIVER IN PERSON|MAIL| pending deposits. express ideas +53888|216|71|7|11|12278.31|0.04|0.01|N|O|1997-03-15|1997-03-27|1997-03-26|NONE|MAIL|e blithely even dep +53889|1027|63|1|44|40832.88|0.01|0.02|N|O|1997-03-14|1997-04-11|1997-04-02|TAKE BACK RETURN|SHIP|carefully foxes. +53889|495|25|2|39|54424.11|0.00|0.08|N|O|1997-05-03|1997-04-08|1997-06-02|NONE|SHIP|ve the quick courts cajole furiou +53889|1752|79|3|3|4961.25|0.05|0.05|N|O|1997-02-21|1997-05-10|1997-02-26|DELIVER IN PERSON|SHIP|jole always among the furiou +53889|778|79|4|9|15108.93|0.04|0.06|N|O|1997-05-29|1997-05-06|1997-06-19|NONE|AIR|ole carefully final platelets. slyly fi +53889|1751|52|5|38|62804.50|0.04|0.00|N|O|1997-05-15|1997-03-31|1997-05-22|NONE|SHIP|ss dependencies cajole. ironic requests +53890|188|15|1|39|42439.02|0.03|0.04|N|O|1998-03-06|1998-03-10|1998-03-26|COLLECT COD|RAIL| boost quickly packages +53890|1710|53|2|4|6446.84|0.06|0.03|N|O|1998-03-18|1998-03-19|1998-04-11|TAKE BACK RETURN|TRUCK|ly even instructions. requests along th +53890|125|26|3|39|39979.68|0.03|0.03|N|O|1998-03-31|1998-03-13|1998-04-25|COLLECT COD|TRUCK|nic packages. regular ideas affix someti +53890|688|82|4|14|22241.52|0.08|0.04|N|O|1998-04-30|1998-03-03|1998-05-14|NONE|REG AIR|wake ironic, regular wa +53890|1283|21|5|33|39081.24|0.00|0.03|N|O|1998-02-04|1998-04-16|1998-02-26|DELIVER IN PERSON|SHIP| pearls. unusual the +53890|1757|42|6|22|36492.50|0.03|0.01|N|O|1998-04-30|1998-02-26|1998-05-06|COLLECT COD|RAIL|ngside of the even packages play acco +53890|1341|80|7|34|42239.56|0.06|0.05|N|O|1998-04-22|1998-02-26|1998-05-15|NONE|SHIP|ully final packages cajole. e +53891|1083|84|1|39|38379.12|0.00|0.06|A|F|1994-04-29|1994-03-12|1994-05-28|DELIVER IN PERSON|TRUCK|aggle carefully +53891|560|51|2|6|8763.36|0.05|0.07|R|F|1994-03-30|1994-03-07|1994-04-20|COLLECT COD|REG AIR|accounts wake furiously special d +53891|1397|98|3|20|25967.80|0.06|0.04|R|F|1994-04-01|1994-04-20|1994-04-30|DELIVER IN PERSON|MAIL| cajole carefully. expre +53891|1584|5|4|44|65365.52|0.02|0.06|A|F|1994-03-27|1994-03-07|1994-04-13|COLLECT COD|SHIP|packages are around the carefully +53891|1633|34|5|2|3069.26|0.07|0.07|A|F|1994-03-15|1994-03-25|1994-04-11|NONE|MAIL|usly among the +53892|225|53|1|22|24754.84|0.08|0.02|N|O|1998-04-09|1998-06-18|1998-05-08|DELIVER IN PERSON|TRUCK|refully against the r +53892|1682|6|2|41|64930.88|0.00|0.04|N|O|1998-06-17|1998-05-07|1998-07-09|DELIVER IN PERSON|SHIP|y pending accounts across the +53892|1103|76|3|28|28114.80|0.10|0.08|N|O|1998-03-26|1998-05-29|1998-04-25|DELIVER IN PERSON|RAIL|y alongside of the furiously +53893|1955|56|1|16|29711.20|0.04|0.03|N|O|1998-01-30|1998-03-21|1998-02-17|NONE|TRUCK| furiously ex +53893|1296|8|2|12|14367.48|0.09|0.00|N|O|1998-02-14|1998-03-20|1998-02-22|COLLECT COD|MAIL| slyly. carefully final escapades try to c +53893|1334|35|3|4|4941.32|0.05|0.04|N|O|1998-03-02|1998-02-27|1998-03-08|TAKE BACK RETURN|FOB|ily even, even packages. iro +53894|1557|58|1|45|65634.75|0.09|0.00|R|F|1994-07-11|1994-09-14|1994-07-28|DELIVER IN PERSON|REG AIR|its are quickly above the special instruc +53894|1226|27|2|46|51852.12|0.02|0.07|R|F|1994-09-16|1994-10-04|1994-09-20|COLLECT COD|AIR|o the carefully pending accounts. fluffy, +53894|843|10|3|25|43596.00|0.09|0.03|R|F|1994-08-19|1994-08-23|1994-09-09|COLLECT COD|MAIL|y pending deposits. silent asymptotes nag s +53894|1434|35|4|29|38727.47|0.05|0.02|R|F|1994-08-13|1994-08-12|1994-08-15|TAKE BACK RETURN|SHIP|lithe requests around the ca +53894|1825|26|5|1|1726.82|0.08|0.06|R|F|1994-09-09|1994-09-02|1994-09-18|TAKE BACK RETURN|RAIL|en epitaphs integrate across the special +53894|1790|17|6|25|42294.75|0.00|0.05|A|F|1994-07-25|1994-10-04|1994-07-27|DELIVER IN PERSON|AIR|slyly furiously final requests. furiously +53894|1447|87|7|5|6742.20|0.01|0.02|A|F|1994-10-07|1994-09-12|1994-10-22|NONE|TRUCK|requests sleep somet +53895|1948|49|1|13|24049.22|0.09|0.01|N|O|1995-10-03|1995-11-09|1995-10-17|NONE|REG AIR|gular ideas. final foxes slee +53895|1572|53|2|32|47154.24|0.10|0.02|N|O|1995-10-23|1995-11-02|1995-11-11|NONE|AIR| even accounts sleep quickly across the sly +53895|1436|54|3|28|37448.04|0.03|0.00|N|O|1995-09-10|1995-11-20|1995-09-25|NONE|REG AIR|p fluffily pending accounts. quietly r +53920|1961|62|1|46|85696.16|0.01|0.07|A|F|1994-04-16|1994-05-28|1994-05-03|TAKE BACK RETURN|TRUCK|symptotes. request +53920|1886|73|2|7|12515.16|0.08|0.03|R|F|1994-07-12|1994-05-09|1994-07-22|NONE|TRUCK|ilent accounts +53920|1383|98|3|44|56512.72|0.10|0.01|R|F|1994-05-07|1994-05-21|1994-05-26|COLLECT COD|SHIP|haggle across th +53920|97|73|4|46|45866.14|0.08|0.01|R|F|1994-07-09|1994-05-28|1994-07-13|TAKE BACK RETURN|REG AIR|e even requests. express pac +53920|1556|57|5|29|42268.95|0.08|0.04|R|F|1994-05-14|1994-05-16|1994-06-03|NONE|TRUCK|aggle furiously above the furious +53920|1198|99|6|48|52761.12|0.10|0.08|A|F|1994-04-16|1994-05-21|1994-05-06|DELIVER IN PERSON|AIR|ven excuses a +53920|1422|40|7|50|66171.00|0.06|0.02|A|F|1994-07-14|1994-06-09|1994-07-30|DELIVER IN PERSON|FOB|nal hockey play +53921|1003|9|1|1|904.00|0.07|0.04|R|F|1992-10-09|1992-10-22|1992-11-04|TAKE BACK RETURN|FOB|ies integrate among the f +53921|1170|71|2|19|20352.23|0.10|0.07|A|F|1992-10-13|1992-10-31|1992-11-12|TAKE BACK RETURN|TRUCK|l accounts. s +53922|1317|56|1|47|57260.57|0.09|0.04|N|O|1996-12-07|1996-11-21|1997-01-02|TAKE BACK RETURN|TRUCK|lly regular patterns. furiously fina +53922|369|26|2|41|52043.76|0.01|0.01|N|O|1996-11-12|1996-10-24|1996-11-13|DELIVER IN PERSON|SHIP|special dependencies nag blithely +53922|22|73|3|47|43334.94|0.01|0.05|N|O|1996-12-22|1996-12-02|1997-01-07|TAKE BACK RETURN|TRUCK| foxes. final foxes th +53922|1173|10|4|37|39744.29|0.10|0.05|N|O|1996-10-11|1996-11-01|1996-10-27|NONE|REG AIR|es wake flu +53922|1753|80|5|5|8273.75|0.09|0.05|N|O|1996-10-05|1996-12-06|1996-10-25|DELIVER IN PERSON|REG AIR|e carefully fina +53922|1096|32|6|8|7976.72|0.09|0.05|N|O|1996-11-04|1996-11-29|1996-11-15|DELIVER IN PERSON|FOB|into beans boost carefu +53922|417|5|7|29|38204.89|0.08|0.04|N|O|1996-12-26|1996-10-23|1997-01-08|COLLECT COD|MAIL|ructions are after the q +53923|526|57|1|34|48501.68|0.04|0.03|N|O|1998-01-03|1997-11-09|1998-01-05|TAKE BACK RETURN|SHIP|y bold platelets are careful +53923|101|80|2|20|20022.00|0.01|0.03|N|O|1997-11-19|1997-10-29|1997-12-02|NONE|RAIL|to beans nag slyly fur +53923|227|55|3|49|55233.78|0.00|0.01|N|O|1997-11-23|1997-11-14|1997-12-19|COLLECT COD|REG AIR|ag among the ironic +53924|1242|54|1|17|19435.08|0.07|0.07|N|O|1996-12-19|1997-02-01|1997-01-12|COLLECT COD|REG AIR|ven ideas. slyly careful ideas +53924|840|41|2|37|64411.08|0.00|0.08|N|O|1997-01-10|1997-02-14|1997-01-13|TAKE BACK RETURN|TRUCK|g the quickly +53924|541|32|3|18|25947.72|0.05|0.00|N|O|1996-12-20|1997-03-06|1997-01-02|DELIVER IN PERSON|MAIL|al ideas haggle quickly. request +53924|1475|15|4|30|41294.10|0.05|0.01|N|O|1997-02-02|1997-01-21|1997-03-02|NONE|SHIP|inder carefully according +53925|402|61|1|4|5209.60|0.09|0.07|N|O|1997-04-09|1997-03-25|1997-04-29|TAKE BACK RETURN|FOB|t accounts. pending accounts use express +53925|270|71|2|41|47981.07|0.10|0.05|N|O|1997-05-07|1997-03-07|1997-05-28|TAKE BACK RETURN|RAIL|ideas wake. blithely express packages wa +53925|1949|82|3|28|51826.32|0.02|0.05|N|O|1997-02-06|1997-02-27|1997-02-21|TAKE BACK RETURN|AIR|courts use fluffi +53925|1559|100|4|27|39434.85|0.02|0.04|N|O|1997-05-06|1997-03-02|1997-05-14|NONE|AIR|lyly slyly final realms. +53925|890|57|5|6|10745.34|0.09|0.06|N|O|1997-02-08|1997-04-17|1997-02-26|TAKE BACK RETURN|FOB|odolites. ideas sublate carefully +53925|1435|53|6|12|16037.16|0.00|0.08|N|O|1997-04-16|1997-03-16|1997-04-23|DELIVER IN PERSON|AIR|oach among the furiously reg +53925|1409|49|7|33|43243.20|0.08|0.03|N|O|1997-02-12|1997-02-24|1997-02-23|TAKE BACK RETURN|TRUCK|furiously. bold, pending t +53926|405|64|1|17|22191.80|0.04|0.04|N|O|1996-08-21|1996-09-05|1996-08-31|NONE|FOB|ic deposits. pending, regular theodoli +53926|278|6|2|14|16495.78|0.01|0.04|N|O|1996-11-15|1996-10-27|1996-11-29|NONE|FOB|y stealthy +53926|419|20|3|11|14513.51|0.03|0.07|N|O|1996-10-07|1996-09-17|1996-11-06|DELIVER IN PERSON|AIR| regular accounts wake furiously c +53927|270|98|1|47|55002.69|0.02|0.07|N|O|1995-08-15|1995-08-24|1995-09-13|TAKE BACK RETURN|MAIL|ts are blithely under the furiously regula +53927|327|56|2|3|3681.96|0.08|0.06|N|O|1995-10-07|1995-08-25|1995-11-03|DELIVER IN PERSON|AIR|s. careful +53927|257|58|3|36|41661.00|0.06|0.02|N|O|1995-07-10|1995-10-02|1995-07-22|COLLECT COD|TRUCK|was above the bli +53927|847|81|4|42|73409.28|0.06|0.03|N|O|1995-07-14|1995-08-06|1995-08-08|TAKE BACK RETURN|MAIL|es. quickly special a +53927|1303|18|5|6|7225.80|0.01|0.02|N|O|1995-07-17|1995-08-16|1995-07-24|NONE|FOB|ironic, darin +53952|181|60|1|49|52977.82|0.02|0.05|N|O|1998-01-04|1998-02-13|1998-01-08|COLLECT COD|TRUCK|courts. slyly bold packag +53952|1641|24|2|1|1542.64|0.03|0.06|N|O|1997-12-15|1997-12-27|1998-01-11|TAKE BACK RETURN|REG AIR|ely final request +53952|1547|88|3|34|49250.36|0.00|0.08|N|O|1998-03-07|1998-01-07|1998-03-16|COLLECT COD|TRUCK|ly slyly bold deposit +53952|1969|2|4|40|74838.40|0.07|0.06|N|O|1998-03-13|1998-02-02|1998-03-17|TAKE BACK RETURN|SHIP|ickly close theodolites sleep. ruthless, r +53952|1724|67|5|43|69905.96|0.04|0.00|N|O|1998-03-02|1997-12-24|1998-03-10|DELIVER IN PERSON|REG AIR|are furiously. foxes detect ironica +53952|150|29|6|29|30454.35|0.06|0.01|N|O|1997-12-15|1997-12-19|1997-12-23|COLLECT COD|SHIP|nst the carefully final requests sleep furi +53953|431|90|1|8|10651.44|0.06|0.03|R|F|1994-06-21|1994-06-19|1994-06-22|TAKE BACK RETURN|MAIL|r accounts sleep. special instruction +53953|1781|82|2|48|80773.44|0.10|0.05|R|F|1994-07-02|1994-06-17|1994-07-09|DELIVER IN PERSON|REG AIR|egular accounts. bold, final accounts wake +53953|881|15|3|44|78402.72|0.05|0.08|R|F|1994-06-23|1994-05-24|1994-07-23|COLLECT COD|FOB|riously. bold, final requests alongsid +53953|261|62|4|2|2322.52|0.08|0.05|A|F|1994-04-27|1994-05-19|1994-05-01|NONE|RAIL|quickly special asymptotes nag never. fina +53953|866|100|5|44|77741.84|0.08|0.03|A|F|1994-07-24|1994-06-03|1994-08-08|DELIVER IN PERSON|FOB|ular accounts +53953|990|59|6|11|20800.89|0.00|0.07|R|F|1994-05-29|1994-06-01|1994-06-16|NONE|REG AIR|quests use: furi +53954|1339|16|1|38|47132.54|0.01|0.06|N|O|1997-11-03|1997-09-23|1997-12-02|TAKE BACK RETURN|TRUCK|al, unusual courts boost special somas. +53955|1371|10|1|17|21630.29|0.07|0.04|N|F|1995-06-03|1995-05-23|1995-06-21|DELIVER IN PERSON|MAIL|lithely final re +53956|282|37|1|47|55567.16|0.07|0.03|N|O|1995-10-02|1995-10-29|1995-10-05|NONE|AIR|l requests. even w +53956|1394|33|2|15|19430.85|0.02|0.07|N|O|1995-09-24|1995-10-19|1995-10-03|DELIVER IN PERSON|MAIL| packages! carefully +53956|96|47|3|3|2988.27|0.03|0.03|N|O|1995-11-16|1995-10-07|1995-12-07|COLLECT COD|RAIL|le fluffily regular excuses. express acc +53956|509|100|4|38|53561.00|0.01|0.05|N|O|1995-08-22|1995-10-17|1995-08-28|TAKE BACK RETURN|TRUCK|ages cajole speci +53956|216|98|5|24|26789.04|0.07|0.03|N|O|1995-10-30|1995-10-31|1995-11-12|COLLECT COD|RAIL|iously bold packages integrate qui +53956|1328|67|6|46|56548.72|0.00|0.06|N|O|1995-10-14|1995-10-16|1995-11-06|COLLECT COD|SHIP|y bold excuses cajole +53956|997|32|7|45|85409.55|0.09|0.05|N|O|1995-08-29|1995-09-25|1995-08-30|DELIVER IN PERSON|TRUCK|olphins. furiously even theodo +53957|901|36|1|28|50453.20|0.02|0.05|N|O|1997-10-21|1997-12-30|1997-11-06|NONE|REG AIR|nto beans. quickly final accounts +53957|1072|78|2|14|13622.98|0.10|0.00|N|O|1998-01-27|1998-01-04|1998-02-15|DELIVER IN PERSON|TRUCK|equests. carefully reg +53957|1265|66|3|50|58313.00|0.04|0.02|N|O|1997-12-18|1998-01-12|1998-01-09|TAKE BACK RETURN|REG AIR|nding foxes. blithely fi +53958|1650|33|1|13|20171.45|0.09|0.05|N|O|1998-03-03|1998-02-12|1998-04-02|DELIVER IN PERSON|SHIP|, unusual theodolites cajole blithely. +53958|946|47|2|37|68336.78|0.05|0.07|N|O|1998-02-15|1998-02-09|1998-02-25|TAKE BACK RETURN|SHIP|l packages. final instructions about +53958|1882|26|3|20|35677.60|0.09|0.02|N|O|1998-03-01|1998-03-24|1998-03-11|DELIVER IN PERSON|SHIP|ix according t +53958|773|38|4|35|58581.95|0.05|0.00|N|O|1998-04-23|1998-03-07|1998-05-05|NONE|MAIL|furiously quickly unusual dependenc +53958|1945|46|5|27|49867.38|0.01|0.05|N|O|1998-04-23|1998-02-20|1998-05-06|NONE|MAIL| bold ideas after the slyly special platele +53958|1252|27|6|6|6919.50|0.10|0.05|N|O|1998-04-05|1998-03-17|1998-04-06|COLLECT COD|AIR|g the slyly silent ideas. slyly even d +53959|1044|50|1|35|33076.40|0.03|0.00|N|O|1997-03-16|1997-05-04|1997-03-17|NONE|AIR|yly regular +53959|1729|14|2|33|53813.76|0.01|0.05|N|O|1997-04-19|1997-04-14|1997-05-14|TAKE BACK RETURN|SHIP| idly ironic, express instructions. i +53959|733|34|3|37|60448.01|0.10|0.02|N|O|1997-02-26|1997-05-11|1997-03-11|TAKE BACK RETURN|SHIP|ecial asymptotes haggle according to the bl +53959|1060|66|4|15|14415.90|0.04|0.03|N|O|1997-05-05|1997-04-30|1997-05-11|NONE|SHIP| pinto beans +53959|106|85|5|32|32195.20|0.01|0.00|N|O|1997-04-26|1997-04-23|1997-05-26|COLLECT COD|AIR|foxes boost fluffily abou +53959|912|15|6|26|47135.66|0.03|0.07|N|O|1997-03-08|1997-04-06|1997-04-06|TAKE BACK RETURN|REG AIR|s are. pending dinos wake up the care +53959|879|80|7|21|37377.27|0.08|0.01|N|O|1997-06-12|1997-04-23|1997-06-30|NONE|SHIP|ly bold depos +53984|33|59|1|18|16794.54|0.03|0.08|A|F|1993-01-19|1993-02-10|1993-01-24|COLLECT COD|TRUCK|thy deposits. silent requests agains +53984|1221|22|2|7|7855.54|0.04|0.03|R|F|1993-02-25|1993-02-06|1993-03-10|TAKE BACK RETURN|AIR| final foxes about the regula +53984|255|56|3|20|23105.00|0.04|0.03|A|F|1993-03-08|1993-01-17|1993-03-25|TAKE BACK RETURN|MAIL|usly ruthless +53985|122|23|1|42|42929.04|0.09|0.06|N|O|1996-12-13|1997-01-08|1996-12-14|DELIVER IN PERSON|FOB| requests ar +53985|1850|37|2|41|71825.85|0.06|0.07|N|O|1996-11-20|1996-12-29|1996-11-29|TAKE BACK RETURN|AIR| about the accounts. furiously thin pin +53985|1919|8|3|49|89224.59|0.02|0.00|N|O|1997-01-03|1996-12-17|1997-01-24|NONE|MAIL|yly dolphins. bold, +53985|1303|80|4|29|34924.70|0.09|0.05|N|O|1997-02-12|1997-01-20|1997-03-13|NONE|AIR|ggle final instructions. +53985|604|36|5|9|13541.40|0.06|0.07|N|O|1996-12-03|1996-12-16|1996-12-15|NONE|SHIP| instructi +53985|1191|92|6|36|39318.84|0.01|0.01|N|O|1997-02-07|1996-12-14|1997-02-11|DELIVER IN PERSON|TRUCK|. excuses wil +53986|1504|45|1|28|39354.00|0.05|0.08|A|F|1994-02-02|1994-02-18|1994-03-03|DELIVER IN PERSON|SHIP| frets acros +53986|808|9|2|48|82022.40|0.05|0.02|R|F|1994-01-15|1994-03-01|1994-01-18|DELIVER IN PERSON|AIR|y along the +53986|1383|22|3|19|24403.22|0.01|0.06|R|F|1993-12-17|1994-01-16|1994-01-03|DELIVER IN PERSON|MAIL|old platelets doze agains +53986|1094|30|4|34|33833.06|0.08|0.08|A|F|1993-12-17|1994-02-17|1993-12-31|TAKE BACK RETURN|AIR|usly pending packages wake fluffily +53987|1818|48|1|3|5159.43|0.00|0.06|R|F|1993-05-24|1993-04-06|1993-05-30|COLLECT COD|FOB|packages about the furiously special a +53988|460|19|1|34|46255.64|0.09|0.05|R|F|1992-02-08|1992-03-22|1992-02-22|COLLECT COD|TRUCK|rding to the permanent deposits. careful +53988|1411|29|2|13|17061.33|0.08|0.05|A|F|1992-01-09|1992-02-15|1992-01-25|COLLECT COD|RAIL|furiously ironic, +53988|1580|81|3|12|17778.96|0.09|0.00|R|F|1992-03-19|1992-03-14|1992-04-03|DELIVER IN PERSON|SHIP|unts. regul +53989|1731|58|1|33|53880.09|0.06|0.07|N|O|1997-04-23|1997-03-27|1997-05-22|TAKE BACK RETURN|TRUCK|onic requests boost carefully. fur +53990|400|85|1|30|39012.00|0.10|0.07|R|F|1993-01-21|1992-12-06|1993-01-25|DELIVER IN PERSON|FOB|ic, express accounts among the s +53990|1925|26|2|36|65769.12|0.07|0.02|R|F|1993-01-23|1993-01-10|1993-02-16|DELIVER IN PERSON|AIR|the permanent, pending instruction +53991|452|82|1|23|31106.35|0.03|0.05|A|F|1994-04-22|1994-06-11|1994-04-26|TAKE BACK RETURN|MAIL|ly. fluffily ironic +54016|681|44|1|30|47450.40|0.00|0.02|N|O|1996-11-05|1996-12-10|1996-11-08|DELIVER IN PERSON|AIR|ove the carefully special package +54016|131|32|2|29|29902.77|0.03|0.08|N|O|1997-01-04|1996-10-31|1997-01-25|TAKE BACK RETURN|SHIP| final accounts. furiously pending dep +54017|1693|94|1|33|52624.77|0.03|0.02|N|O|1998-01-20|1998-01-10|1998-02-05|COLLECT COD|MAIL|deas according to the final ideas wake +54017|865|32|2|37|65336.82|0.06|0.03|N|O|1997-11-13|1998-01-02|1997-12-07|NONE|TRUCK|e final, bold deposits are alongside of the +54017|1075|46|3|14|13664.98|0.07|0.06|N|O|1997-12-09|1998-01-15|1997-12-30|COLLECT COD|RAIL|e thinly. furiously even do +54018|1798|25|1|32|54393.28|0.10|0.03|N|O|1998-09-26|1998-09-05|1998-10-09|COLLECT COD|RAIL|ar, careful forges are caref +54019|1891|78|1|34|60958.26|0.02|0.00|R|F|1994-10-06|1994-09-23|1994-10-22|COLLECT COD|TRUCK|ly final foxes cajole slyly a +54019|1815|16|2|21|36053.01|0.09|0.08|A|F|1994-07-04|1994-09-03|1994-08-01|NONE|SHIP|ites mold quickl +54019|225|80|3|21|23629.62|0.01|0.06|A|F|1994-09-20|1994-08-08|1994-10-15|NONE|RAIL|he furiously +54020|1665|48|1|4|6266.64|0.10|0.01|R|F|1992-05-12|1992-04-29|1992-05-21|NONE|MAIL|ent, final ideas. furiously bold packages +54020|352|37|2|34|42579.90|0.06|0.02|R|F|1992-03-18|1992-03-27|1992-03-31|DELIVER IN PERSON|SHIP| unusual, bold multiplie +54020|1959|48|3|16|29775.20|0.07|0.08|R|F|1992-04-06|1992-04-09|1992-04-30|TAKE BACK RETURN|AIR|y along the pending theodolites. fur +54020|870|4|4|12|21250.44|0.05|0.02|R|F|1992-03-31|1992-04-26|1992-04-02|DELIVER IN PERSON|RAIL|ests. pending gif +54020|1173|82|5|9|9667.53|0.09|0.05|A|F|1992-03-29|1992-03-11|1992-04-20|COLLECT COD|FOB|nal grouches detect brave, pending +54021|100|1|1|4|4000.40|0.07|0.02|A|F|1994-01-31|1993-11-28|1994-02-08|COLLECT COD|SHIP|refully after +54022|717|14|1|24|38825.04|0.02|0.03|N|O|1996-12-26|1996-12-12|1997-01-04|TAKE BACK RETURN|TRUCK|ns according to +54023|537|68|1|44|63251.32|0.04|0.00|R|F|1992-09-26|1992-08-24|1992-10-16|DELIVER IN PERSON|SHIP|y even pinto beans. furiously +54048|610|11|1|16|24169.76|0.10|0.03|R|F|1993-01-18|1992-12-19|1993-02-06|TAKE BACK RETURN|MAIL|s haggle. e +54048|887|54|2|43|76878.84|0.03|0.03|A|F|1993-01-29|1992-12-20|1993-02-26|DELIVER IN PERSON|AIR|. blithely e +54048|20|71|3|36|33120.72|0.08|0.01|A|F|1993-03-07|1993-02-12|1993-03-29|TAKE BACK RETURN|TRUCK|onic requests can haggle qui +54049|846|46|1|39|68126.76|0.10|0.05|A|F|1993-12-20|1993-12-20|1994-01-13|TAKE BACK RETURN|RAIL|fluffily ironic foxes impress sl +54049|315|100|2|11|13368.41|0.05|0.05|R|F|1994-01-28|1993-11-16|1994-02-06|COLLECT COD|SHIP|y regular packages haggle furiousl +54050|1446|25|1|32|43118.08|0.04|0.07|N|O|1997-06-21|1997-08-05|1997-07-03|TAKE BACK RETURN|MAIL|dolites. furious +54050|507|38|2|6|8445.00|0.04|0.02|N|O|1997-06-23|1997-08-22|1997-07-22|TAKE BACK RETURN|SHIP|inly final foxes. furiously ironic accounts +54050|825|92|3|40|69032.80|0.05|0.05|N|O|1997-07-07|1997-08-03|1997-08-02|TAKE BACK RETURN|AIR|ackages boost carefull +54051|1635|18|1|37|56855.31|0.04|0.01|N|O|1995-11-04|1995-11-06|1995-12-03|TAKE BACK RETURN|REG AIR|the carefully ironic packages. slyl +54051|592|93|2|4|5970.36|0.06|0.06|N|O|1995-08-28|1995-09-25|1995-09-02|COLLECT COD|SHIP|yly pending foxes haggle qui +54051|731|32|3|25|40793.25|0.10|0.05|N|O|1995-12-06|1995-10-29|1995-12-18|TAKE BACK RETURN|FOB|ely regular ideas. final accounts sleep +54051|737|70|4|36|58958.28|0.08|0.05|N|O|1995-09-07|1995-09-22|1995-09-30|NONE|TRUCK|s sleep around the quickly silent foxes. ca +54051|778|75|5|48|80580.96|0.04|0.08|N|O|1995-08-19|1995-09-17|1995-09-08|DELIVER IN PERSON|FOB|riously regular deposits ac +54051|1420|99|6|25|33035.50|0.08|0.02|N|O|1995-09-04|1995-11-02|1995-09-24|COLLECT COD|FOB|y final accounts integrate quickly accordin +54051|917|20|7|18|32722.38|0.10|0.07|N|O|1995-09-01|1995-09-21|1995-09-14|DELIVER IN PERSON|MAIL|ymptotes sleep blithely accordin +54052|277|32|1|36|42381.72|0.08|0.06|N|O|1996-08-08|1996-10-08|1996-09-01|TAKE BACK RETURN|REG AIR|y ironic, regular reques +54052|1344|59|2|13|16189.42|0.01|0.06|N|O|1996-10-24|1996-09-07|1996-11-07|DELIVER IN PERSON|TRUCK|e fluffily unusual packages. +54052|1896|26|3|33|59330.37|0.09|0.05|N|O|1996-11-09|1996-10-17|1996-12-08|COLLECT COD|SHIP|s asymptotes +54052|1681|5|4|42|66472.56|0.09|0.02|N|O|1996-09-26|1996-09-16|1996-10-11|DELIVER IN PERSON|AIR|nal ideas. fu +54052|1210|85|5|16|17779.36|0.08|0.01|N|O|1996-11-03|1996-09-17|1996-11-21|DELIVER IN PERSON|TRUCK| fluffy foxes. +54052|1769|54|6|14|23390.64|0.01|0.06|N|O|1996-07-25|1996-09-01|1996-08-14|DELIVER IN PERSON|REG AIR|regular dependencies +54053|1466|6|1|45|61535.70|0.00|0.01|R|F|1992-02-28|1992-04-09|1992-03-08|DELIVER IN PERSON|MAIL|al asymptotes boost carefully. unusua +54053|1309|10|2|25|30257.50|0.00|0.08|R|F|1992-03-13|1992-04-30|1992-03-22|DELIVER IN PERSON|AIR|ely unusual p +54053|1033|69|3|29|27086.87|0.00|0.01|R|F|1992-06-01|1992-05-11|1992-06-18|COLLECT COD|AIR|posits wake slyly among the ca +54053|643|6|4|32|49396.48|0.00|0.02|A|F|1992-06-04|1992-04-24|1992-07-01|COLLECT COD|TRUCK|packages wake slyly. slyly regular depos +54053|1746|31|5|32|52727.68|0.07|0.05|R|F|1992-06-02|1992-05-10|1992-06-21|TAKE BACK RETURN|SHIP|ly silent requests haggle. regul +54053|893|94|6|46|82518.94|0.02|0.08|R|F|1992-04-17|1992-04-29|1992-04-21|DELIVER IN PERSON|MAIL|ges. pending foxes sleep furiousl +54054|100|1|1|39|39003.90|0.09|0.06|N|O|1996-03-10|1996-04-16|1996-04-05|NONE|SHIP|structions hag +54054|233|61|2|3|3399.69|0.03|0.05|N|O|1996-02-18|1996-04-10|1996-03-18|COLLECT COD|AIR|osits. even +54054|1473|91|3|28|38485.16|0.06|0.05|N|O|1996-02-15|1996-02-20|1996-03-03|COLLECT COD|SHIP|the boldly express asymptot +54054|419|49|4|41|54095.81|0.08|0.03|N|O|1996-02-01|1996-03-11|1996-02-23|TAKE BACK RETURN|TRUCK|ckages. express, close excus +54055|913|14|1|27|48975.57|0.00|0.07|A|F|1994-05-30|1994-03-31|1994-06-19|NONE|FOB|nusual ideas nag furio +54080|1072|43|1|10|9730.70|0.02|0.05|R|F|1994-09-15|1994-09-12|1994-10-07|COLLECT COD|TRUCK|nding accounts. furiously sp +54081|291|92|1|9|10721.61|0.08|0.03|N|F|1995-06-04|1995-06-09|1995-06-18|COLLECT COD|MAIL|usly regular instructions a +54081|240|41|2|20|22804.80|0.05|0.03|N|F|1995-06-13|1995-04-30|1995-06-19|COLLECT COD|SHIP|he furiously ironic platelets +54081|1580|21|3|45|66671.10|0.00|0.05|R|F|1995-04-30|1995-05-05|1995-05-11|COLLECT COD|AIR|ghout the dep +54081|336|65|4|39|48216.87|0.02|0.00|R|F|1995-03-31|1995-05-09|1995-04-17|TAKE BACK RETURN|FOB|pendencies. fluffy r +54081|1295|96|5|12|14355.48|0.05|0.06|N|O|1995-07-09|1995-06-07|1995-07-10|NONE|REG AIR| unusual, unusual e +54082|1751|78|1|33|54540.75|0.09|0.03|R|F|1993-11-03|1993-09-07|1993-11-26|TAKE BACK RETURN|AIR|sleep furiously across th +54082|1714|41|2|23|37161.33|0.10|0.00|R|F|1993-08-22|1993-08-28|1993-09-21|COLLECT COD|AIR|before the foxes; carefully regular +54082|308|37|3|44|53165.20|0.06|0.08|A|F|1993-10-06|1993-09-08|1993-11-05|COLLECT COD|AIR|onic accounts haggle. furiously regular r +54082|1644|45|4|3|4636.92|0.01|0.02|A|F|1993-08-08|1993-09-03|1993-08-30|TAKE BACK RETURN|MAIL| slyly pendin +54082|588|79|5|7|10420.06|0.07|0.08|A|F|1993-10-02|1993-09-22|1993-10-28|DELIVER IN PERSON|TRUCK|unusual accounts. express packages wa +54082|1236|74|6|44|50038.12|0.00|0.02|A|F|1993-07-14|1993-09-04|1993-08-02|COLLECT COD|REG AIR|ter the ironic pinto beans. regular, r +54083|652|46|1|42|65211.30|0.02|0.01|N|O|1995-08-21|1995-08-28|1995-08-26|NONE|TRUCK|ely among the care +54083|1814|58|2|35|60053.35|0.04|0.06|N|O|1995-11-17|1995-08-21|1995-11-19|NONE|TRUCK|special dependencies. accounts wake a +54083|250|5|3|25|28756.25|0.08|0.05|N|O|1995-08-25|1995-08-28|1995-08-28|NONE|FOB|cial courts. final platelets x-ray caref +54084|1600|81|1|42|63067.20|0.07|0.08|N|O|1995-10-19|1995-12-08|1995-10-21|TAKE BACK RETURN|FOB|out the fluffily express packages thra +54084|1567|88|2|1|1468.56|0.02|0.03|N|O|1996-01-06|1995-12-09|1996-01-07|NONE|AIR|gular, regular dependencies. +54084|1064|35|3|50|48253.00|0.10|0.04|N|O|1995-11-26|1995-11-30|1995-12-07|COLLECT COD|RAIL|y above the unusual, close pl +54085|656|50|1|43|66935.95|0.03|0.08|N|O|1996-02-06|1995-12-02|1996-03-01|NONE|RAIL|lyly regular packa +54086|2|78|1|42|37884.00|0.03|0.05|A|F|1992-09-30|1992-10-17|1992-10-28|COLLECT COD|REG AIR|ns serve ironic accounts. accounts wake +54086|675|7|2|36|56724.12|0.09|0.05|A|F|1992-11-08|1992-11-11|1992-11-20|COLLECT COD|REG AIR|yly final d +54086|900|67|3|47|84642.30|0.08|0.04|A|F|1993-01-04|1992-11-13|1993-01-22|NONE|FOB|fully above the blithely iro +54086|1907|8|4|37|66929.30|0.09|0.07|A|F|1992-12-08|1992-12-05|1993-01-02|COLLECT COD|MAIL|usual theodol +54086|617|18|5|43|65257.23|0.02|0.02|R|F|1992-11-10|1992-11-30|1992-11-23|DELIVER IN PERSON|REG AIR|usly unusual deposits; fluffily fina +54086|1382|21|6|23|29517.74|0.03|0.08|R|F|1992-09-26|1992-11-28|1992-10-09|DELIVER IN PERSON|MAIL|g the quickly bold +54087|639|2|1|38|58505.94|0.07|0.07|N|O|1998-07-16|1998-08-29|1998-07-24|DELIVER IN PERSON|SHIP|ress pinto beans are quickly final theodo +54087|177|4|2|11|11848.87|0.05|0.06|N|O|1998-10-12|1998-09-17|1998-10-22|DELIVER IN PERSON|TRUCK|ans cajole furiously alon +54087|454|84|3|23|31152.35|0.07|0.06|N|O|1998-09-15|1998-09-30|1998-10-06|COLLECT COD|RAIL|ly regular requests: regular theodolites h +54087|498|99|4|14|19578.86|0.02|0.06|N|O|1998-08-17|1998-08-17|1998-08-27|TAKE BACK RETURN|SHIP|s. carefully special requests after th +54087|1698|99|5|17|27194.73|0.02|0.08|N|O|1998-08-11|1998-08-26|1998-08-31|NONE|SHIP|e. slyly even ideas cajo +54087|267|68|6|15|17508.90|0.02|0.03|N|O|1998-07-23|1998-09-04|1998-08-20|COLLECT COD|REG AIR|ording to +54087|1786|87|7|47|79325.66|0.01|0.04|N|O|1998-07-09|1998-09-18|1998-07-22|NONE|TRUCK|nic deposits. furiously unusual du +54112|626|89|1|44|67171.28|0.02|0.08|N|O|1998-06-08|1998-08-25|1998-07-08|COLLECT COD|MAIL|s against the even theodolit +54112|1333|48|2|31|38264.23|0.10|0.07|N|O|1998-06-16|1998-08-01|1998-07-15|DELIVER IN PERSON|RAIL|ages. carefully ironic foxes cajole. slyl +54112|644|45|3|47|72598.08|0.07|0.05|N|O|1998-08-04|1998-08-07|1998-08-06|TAKE BACK RETURN|AIR|ing sauternes lose b +54112|1095|31|4|13|12949.17|0.00|0.04|N|O|1998-07-30|1998-08-20|1998-08-03|DELIVER IN PERSON|RAIL|thely unusual instructions int +54112|1497|98|5|16|22375.84|0.03|0.01|N|O|1998-08-16|1998-07-29|1998-08-20|DELIVER IN PERSON|REG AIR|ls wake among the bold +54113|565|26|1|45|65950.20|0.07|0.05|N|O|1997-11-25|1997-11-27|1997-12-18|NONE|MAIL|eans; quickly iron +54113|1615|98|2|29|43981.69|0.07|0.03|N|O|1998-01-16|1997-10-26|1998-02-08|COLLECT COD|RAIL| accounts cajole above the pending r +54113|502|3|3|36|50490.00|0.04|0.05|N|O|1997-10-30|1997-11-22|1997-11-16|TAKE BACK RETURN|TRUCK|sleep furiously. express ideas among th +54113|262|17|4|22|25569.72|0.08|0.04|N|O|1997-12-28|1997-11-27|1998-01-06|TAKE BACK RETURN|FOB|beans wake carefully. expre +54114|1049|50|1|19|18050.76|0.02|0.03|A|F|1994-12-25|1994-11-08|1995-01-20|TAKE BACK RETURN|RAIL|ironic instructions. quickly furious court +54114|19|70|2|44|40436.44|0.08|0.08|A|F|1994-12-12|1994-12-18|1995-01-08|TAKE BACK RETURN|TRUCK| accounts. bold, silent instructions amon +54115|648|42|1|28|43361.92|0.09|0.07|R|F|1992-03-08|1992-02-22|1992-04-03|TAKE BACK RETURN|FOB|ons sleep. unusual foxes between the quic +54115|1513|14|2|1|1414.51|0.09|0.06|R|F|1992-03-15|1992-03-22|1992-04-09|NONE|TRUCK| even gifts boost around the q +54115|594|95|3|21|31386.39|0.06|0.00|A|F|1992-04-04|1992-04-05|1992-05-03|TAKE BACK RETURN|TRUCK|ve the carefully pe +54115|1420|38|4|35|46249.70|0.09|0.02|R|F|1992-02-15|1992-03-23|1992-02-22|NONE|MAIL| the furiously unusual requ +54115|1587|88|5|28|41680.24|0.02|0.06|A|F|1992-01-15|1992-04-05|1992-01-22|TAKE BACK RETURN|AIR|y enticing theod +54115|492|80|6|23|32027.27|0.05|0.02|A|F|1992-03-09|1992-03-17|1992-03-25|COLLECT COD|REG AIR|ly. carefully pen +54116|423|24|1|12|15881.04|0.08|0.01|N|O|1996-02-28|1996-02-02|1996-03-09|DELIVER IN PERSON|RAIL|aggle furiously al +54116|705|38|2|16|25691.20|0.02|0.08|N|O|1995-11-08|1996-01-31|1995-11-18|NONE|TRUCK|kly even accounts detec +54116|424|54|3|1|1324.42|0.08|0.05|N|O|1996-02-04|1996-01-07|1996-03-04|COLLECT COD|AIR|he blithely expres +54116|1565|6|4|34|49863.04|0.02|0.05|N|O|1995-12-04|1996-01-11|1995-12-12|DELIVER IN PERSON|RAIL|t the requests. closely unusual packages ha +54116|1491|31|5|12|16709.88|0.10|0.05|N|O|1995-12-13|1995-12-21|1995-12-15|COLLECT COD|FOB|eodolites. fl +54116|1577|18|6|22|32528.54|0.01|0.03|N|O|1996-01-25|1995-12-11|1996-02-06|NONE|SHIP|gle after the carefully iro +54116|719|16|7|41|66408.11|0.05|0.08|N|O|1995-12-24|1996-01-11|1996-01-04|TAKE BACK RETURN|AIR|e. furiously regular ideas sleep amon +54117|840|40|1|5|8704.20|0.04|0.00|N|O|1998-10-01|1998-07-25|1998-10-27|DELIVER IN PERSON|SHIP|lets sleep blithel +54118|238|39|1|36|40976.28|0.06|0.03|N|O|1998-04-28|1998-05-24|1998-05-23|NONE|TRUCK|nts! fluffily regular d +54118|830|30|2|2|3461.66|0.10|0.05|N|O|1998-06-22|1998-04-22|1998-07-22|DELIVER IN PERSON|AIR|rash. special epitaphs use sl +54118|728|29|3|18|29316.96|0.07|0.08|N|O|1998-04-23|1998-04-12|1998-05-13|COLLECT COD|MAIL|ly final requests. ironic requests +54118|909|10|4|40|72396.00|0.10|0.04|N|O|1998-06-06|1998-04-06|1998-06-10|DELIVER IN PERSON|MAIL|y between the +54119|36|12|1|28|26208.84|0.05|0.07|A|F|1993-06-12|1993-07-16|1993-06-27|TAKE BACK RETURN|FOB| accounts integrate carefull +54119|664|96|2|41|64151.06|0.08|0.00|A|F|1993-09-01|1993-08-15|1993-09-09|DELIVER IN PERSON|AIR| regular instructions mol +54119|1566|87|3|3|4402.68|0.03|0.02|R|F|1993-06-06|1993-07-15|1993-06-11|COLLECT COD|AIR|nts. furiously special excuses may u +54119|998|33|4|13|24686.87|0.07|0.03|A|F|1993-06-04|1993-08-11|1993-06-28|TAKE BACK RETURN|TRUCK|lithely fi +54119|414|44|5|24|31545.84|0.10|0.07|R|F|1993-06-15|1993-07-01|1993-06-22|DELIVER IN PERSON|TRUCK|ing platelets. slyly r +54119|756|89|6|14|23194.50|0.03|0.01|R|F|1993-06-20|1993-07-19|1993-07-03|TAKE BACK RETURN|REG AIR| theodolites +54119|669|32|7|7|10987.62|0.09|0.08|R|F|1993-06-03|1993-08-09|1993-06-20|COLLECT COD|TRUCK|s haggle about the ironic instructions. +54144|260|15|1|32|37128.32|0.06|0.07|A|F|1994-10-23|1994-12-07|1994-11-21|COLLECT COD|MAIL|y instructions. sly courts haggle final p +54145|613|76|1|31|46921.91|0.09|0.07|R|F|1993-01-31|1993-02-08|1993-02-20|TAKE BACK RETURN|TRUCK|ously. furiously unusual deposits caj +54145|1828|15|2|48|83031.36|0.04|0.07|R|F|1993-01-26|1993-03-18|1993-01-31|COLLECT COD|SHIP|press reque +54145|1400|77|3|21|27329.40|0.00|0.00|R|F|1993-02-18|1993-03-18|1993-03-10|TAKE BACK RETURN|MAIL|riously spe +54145|852|53|4|35|61349.75|0.05|0.04|R|F|1993-01-17|1993-03-11|1993-02-09|NONE|AIR|ost carefully-- spe +54145|871|72|5|30|53156.10|0.04|0.05|R|F|1993-03-10|1993-03-20|1993-03-25|TAKE BACK RETURN|TRUCK|the furiously pending deposits. f +54146|329|58|1|44|54090.08|0.05|0.08|R|F|1993-12-30|1993-12-22|1994-01-05|NONE|MAIL|stealthily never final excuses. thin +54146|1154|55|2|45|47481.75|0.00|0.00|R|F|1993-11-29|1993-12-25|1993-12-04|NONE|AIR|larly special depo +54146|516|77|3|31|43911.81|0.10|0.07|A|F|1993-12-13|1993-12-25|1993-12-28|TAKE BACK RETURN|SHIP|lly regular requests. final request +54146|119|98|4|29|29554.19|0.05|0.00|R|F|1994-01-04|1993-12-03|1994-01-25|TAKE BACK RETURN|AIR|furiously pending requests. regul +54146|471|72|5|32|43887.04|0.05|0.05|R|F|1993-11-12|1994-01-02|1993-11-27|TAKE BACK RETURN|MAIL|ourts use fluffily regular deposi +54147|1559|60|1|32|46737.60|0.09|0.04|N|O|1997-08-16|1997-06-18|1997-09-14|NONE|RAIL|ly unusual accounts. blithely pend +54147|491|92|2|45|62617.05|0.02|0.03|N|O|1997-08-22|1997-07-15|1997-08-27|TAKE BACK RETURN|REG AIR|luffily regular requests haggl +54147|1004|10|3|5|4525.00|0.06|0.05|N|O|1997-06-25|1997-07-29|1997-07-20|COLLECT COD|REG AIR|ckly special braids shall +54147|964|65|4|7|13054.72|0.05|0.00|N|O|1997-08-02|1997-07-09|1997-08-16|COLLECT COD|MAIL|c accounts sleep. never iron +54147|105|32|5|30|30153.00|0.06|0.00|N|O|1997-06-20|1997-07-10|1997-07-01|COLLECT COD|MAIL|final pinto beans sleep slyly. care +54147|1639|22|6|27|41597.01|0.09|0.02|N|O|1997-06-12|1997-07-08|1997-06-18|NONE|RAIL|ntegrate fluffily ir +54148|1796|23|1|16|27164.64|0.10|0.00|N|O|1996-12-25|1997-01-26|1997-01-14|COLLECT COD|AIR|aggle quickly final Tiresias. +54148|530|91|2|6|8583.18|0.10|0.03|N|O|1997-01-11|1997-01-20|1997-01-30|COLLECT COD|MAIL|tes will nag carefully along the c +54148|1258|70|3|25|28981.25|0.09|0.01|N|O|1996-12-07|1997-01-13|1996-12-17|DELIVER IN PERSON|MAIL|ly. ironic dependencies boost furiously abo +54149|296|78|1|9|10766.61|0.00|0.08|N|O|1996-03-28|1996-05-12|1996-04-08|COLLECT COD|AIR|kly regular accounts. request +54149|823|24|2|43|74124.26|0.00|0.06|N|O|1996-05-09|1996-06-02|1996-05-24|NONE|FOB|ins. ironic theodolites are slyly furi +54150|1914|15|1|43|78084.13|0.09|0.06|N|O|1995-10-03|1995-07-31|1995-10-30|NONE|TRUCK|ily packages. fluffily pending asymp +54151|92|18|1|25|24802.25|0.05|0.00|R|F|1994-10-22|1994-10-16|1994-11-21|DELIVER IN PERSON|MAIL|efully even foxes wake doggedly +54151|515|46|2|46|65113.46|0.05|0.00|R|F|1994-09-19|1994-10-26|1994-09-27|TAKE BACK RETURN|FOB|eodolites s +54151|1561|62|3|45|65815.20|0.04|0.01|R|F|1994-11-29|1994-11-24|1994-12-21|NONE|MAIL|structions are c +54151|141|94|4|26|27069.64|0.05|0.06|A|F|1994-09-09|1994-11-20|1994-09-22|DELIVER IN PERSON|SHIP|ages sleep furiously slyly final packages +54176|1051|57|1|19|18088.95|0.08|0.00|N|O|1995-10-17|1995-08-23|1995-11-12|TAKE BACK RETURN|SHIP|alms engage +54176|703|100|2|26|41696.20|0.06|0.08|N|O|1995-07-17|1995-09-12|1995-08-01|DELIVER IN PERSON|MAIL|r instructions. +54177|455|85|1|38|51507.10|0.10|0.01|A|F|1992-02-01|1992-02-28|1992-02-02|COLLECT COD|FOB|uriously even foxes. furiously express +54177|288|70|2|33|39213.24|0.01|0.00|A|F|1992-03-07|1992-02-28|1992-03-27|COLLECT COD|AIR|uriously according to the instructions. b +54177|783|48|3|45|75770.10|0.04|0.04|A|F|1992-02-06|1992-04-24|1992-02-18|DELIVER IN PERSON|MAIL|sly slyly regular foxes. requ +54177|1570|51|4|46|67692.22|0.09|0.00|R|F|1992-02-15|1992-03-21|1992-03-05|DELIVER IN PERSON|SHIP|yly ironic courts. blithely special accou +54178|1027|98|1|5|4640.10|0.09|0.01|N|O|1996-06-14|1996-03-29|1996-07-10|NONE|AIR|ly special courts-- asym +54178|401|31|2|29|37740.60|0.06|0.04|N|O|1996-06-03|1996-04-09|1996-06-21|NONE|REG AIR|lyly final pinto beans haggle slyly +54178|348|33|3|33|41195.22|0.02|0.05|N|O|1996-02-24|1996-04-16|1996-02-25|DELIVER IN PERSON|REG AIR|olites boo +54178|985|86|4|38|71667.24|0.04|0.03|N|O|1996-04-03|1996-05-15|1996-04-18|TAKE BACK RETURN|TRUCK|latelets sleep final dependencies. r +54178|476|64|5|33|45423.51|0.06|0.03|N|O|1996-05-15|1996-04-28|1996-06-05|NONE|MAIL|egular dependencies. final +54178|1716|17|6|2|3235.42|0.07|0.04|N|O|1996-05-12|1996-05-19|1996-05-23|DELIVER IN PERSON|MAIL|ully across the blithely s +54179|1604|5|1|42|63235.20|0.05|0.00|N|O|1995-06-30|1995-05-17|1995-07-20|NONE|MAIL|s. carefully bold depos +54180|1121|22|1|5|5110.60|0.00|0.04|A|F|1993-02-15|1992-11-29|1993-03-14|COLLECT COD|AIR|onic ideas. +54180|1511|12|2|28|39550.28|0.09|0.07|A|F|1992-12-13|1992-12-15|1992-12-14|TAKE BACK RETURN|MAIL|eposits about the furiously s +54180|1490|69|3|23|32004.27|0.10|0.04|A|F|1992-11-12|1993-01-11|1992-11-30|COLLECT COD|RAIL|s wake quickly about the even, final +54180|168|69|4|41|43794.56|0.10|0.00|A|F|1992-11-06|1992-12-03|1992-11-25|NONE|REG AIR|ding accounts. ironic pinto beans a +54181|1462|41|1|22|29996.12|0.00|0.02|A|F|1992-06-01|1992-06-22|1992-07-01|DELIVER IN PERSON|MAIL|unts. even packages h +54181|98|49|2|17|16967.53|0.04|0.02|R|F|1992-09-17|1992-07-17|1992-10-04|COLLECT COD|TRUCK|sts nod slyly. careful +54181|857|91|3|31|54493.35|0.09|0.08|A|F|1992-07-09|1992-08-09|1992-07-16|TAKE BACK RETURN|MAIL| regular pains. slyly expre +54181|766|31|4|32|53336.32|0.04|0.00|R|F|1992-06-18|1992-07-19|1992-06-24|TAKE BACK RETURN|RAIL|ly furiously special +54181|794|59|5|6|10168.74|0.01|0.04|R|F|1992-08-05|1992-07-08|1992-08-06|DELIVER IN PERSON|REG AIR|eposits. slyly pending pinto bea +54181|365|94|6|23|29103.28|0.03|0.08|R|F|1992-07-03|1992-07-04|1992-07-08|TAKE BACK RETURN|SHIP| packages haggle furiously. asymp +54181|816|16|7|31|53221.11|0.06|0.07|A|F|1992-09-03|1992-08-04|1992-09-05|DELIVER IN PERSON|AIR|usly among the blithely +54182|1856|100|1|7|12304.95|0.00|0.02|N|O|1998-07-07|1998-08-15|1998-07-13|COLLECT COD|TRUCK|slyly brave foxes. blithel +54182|248|30|2|43|49374.32|0.06|0.04|N|O|1998-10-06|1998-08-09|1998-10-09|TAKE BACK RETURN|RAIL|yly ironic excuses. blit +54182|1946|79|3|2|3695.88|0.02|0.07|N|O|1998-08-29|1998-08-01|1998-09-26|COLLECT COD|SHIP|inal Tiresias are above the slyly bold d +54182|773|6|4|48|80340.96|0.08|0.04|N|O|1998-06-17|1998-08-13|1998-07-05|TAKE BACK RETURN|SHIP|ent pinto beans grow along the special +54182|354|39|5|39|48919.65|0.07|0.03|N|O|1998-09-26|1998-08-01|1998-10-25|COLLECT COD|SHIP| packages +54182|1744|87|6|5|8228.70|0.07|0.01|N|O|1998-06-25|1998-07-24|1998-06-29|TAKE BACK RETURN|AIR|ake fluffily fluffily final foxes. slyly +54182|1872|73|7|25|44346.75|0.06|0.07|N|O|1998-08-22|1998-09-08|1998-09-01|NONE|RAIL|. carefully bold ideas cajole. f +54183|405|6|1|29|37856.60|0.03|0.05|A|F|1992-07-22|1992-06-22|1992-08-07|COLLECT COD|AIR|phs wake. bl +54183|1987|76|2|32|60447.36|0.04|0.06|A|F|1992-07-07|1992-06-25|1992-07-18|DELIVER IN PERSON|FOB|s are carefully from the blithely i +54183|322|79|3|26|31780.32|0.06|0.04|R|F|1992-07-30|1992-06-13|1992-08-09|COLLECT COD|AIR|s the pending, unusual +54183|47|23|4|14|13258.56|0.05|0.08|R|F|1992-05-17|1992-06-19|1992-05-28|COLLECT COD|TRUCK|ven packages us +54183|623|24|5|1|1523.62|0.07|0.03|R|F|1992-05-28|1992-06-22|1992-05-30|NONE|MAIL|lar foxes are fluff +54183|414|15|6|23|30231.43|0.04|0.01|A|F|1992-08-02|1992-05-19|1992-08-09|TAKE BACK RETURN|REG AIR|efully unusual packages. unusual, si +54183|1731|58|7|50|81636.50|0.06|0.05|R|F|1992-07-12|1992-06-17|1992-07-14|NONE|FOB|ently pending ideas c +54208|1878|8|1|9|16018.83|0.04|0.00|N|O|1998-08-08|1998-08-17|1998-08-21|NONE|AIR|ly bold foxes cajole furiously carefu +54208|350|51|2|29|36260.15|0.01|0.00|N|O|1998-09-27|1998-07-18|1998-10-24|COLLECT COD|SHIP| packages. +54208|448|7|3|18|24271.92|0.04|0.06|N|O|1998-06-28|1998-07-25|1998-07-02|COLLECT COD|FOB|y packages. +54208|1788|31|4|49|82799.22|0.03|0.01|N|O|1998-07-18|1998-08-07|1998-07-25|TAKE BACK RETURN|SHIP|e furiously final theodolite +54209|349|6|1|13|16241.42|0.05|0.02|A|F|1992-09-23|1992-10-21|1992-09-29|COLLECT COD|MAIL|ctions. ironic, regular deposits amo +54209|1607|49|2|28|42240.80|0.06|0.07|R|F|1992-11-24|1992-09-27|1992-12-02|COLLECT COD|RAIL|s. blithely unusual i +54209|1831|18|3|32|55450.56|0.08|0.00|A|F|1992-10-02|1992-10-01|1992-10-20|COLLECT COD|AIR| the carefully even requests detect s +54209|1446|47|4|9|12126.96|0.04|0.05|R|F|1992-11-02|1992-10-13|1992-11-06|COLLECT COD|REG AIR|packages affix carefu +54209|236|91|5|40|45449.20|0.06|0.04|R|F|1992-11-26|1992-11-02|1992-12-18|DELIVER IN PERSON|REG AIR|egular, bold +54210|903|6|1|12|21646.80|0.07|0.02|A|F|1993-11-21|1993-11-10|1993-12-04|TAKE BACK RETURN|MAIL| regular deposits eat blithely a +54211|1182|19|1|31|33578.58|0.04|0.07|N|O|1996-05-06|1996-06-30|1996-05-30|TAKE BACK RETURN|AIR|nic accoun +54211|772|5|2|7|11709.39|0.00|0.06|N|O|1996-05-21|1996-06-13|1996-05-30|DELIVER IN PERSON|RAIL|ar foxes nag silent courts. ironic +54211|1195|32|3|33|36174.27|0.10|0.01|N|O|1996-04-29|1996-06-15|1996-05-22|DELIVER IN PERSON|SHIP|re. packages x-ray slyly +54212|1732|17|1|24|39209.52|0.04|0.08|A|F|1994-05-14|1994-05-03|1994-05-22|TAKE BACK RETURN|AIR|eposits. furiously unu +54212|1676|59|2|39|61529.13|0.10|0.02|R|F|1994-03-16|1994-05-26|1994-04-08|COLLECT COD|TRUCK|c deposits use quickly after the ironic, e +54212|790|55|3|17|28743.43|0.04|0.00|R|F|1994-03-19|1994-04-13|1994-03-24|NONE|FOB|structions are afte +54213|525|16|1|31|44191.12|0.03|0.06|A|F|1995-02-22|1995-04-26|1995-03-03|NONE|FOB|mptotes unwin +54213|40|66|2|35|32901.40|0.05|0.05|R|F|1995-05-24|1995-04-27|1995-06-07|DELIVER IN PERSON|FOB|. carefully pending deposi +54213|337|38|3|16|19797.28|0.07|0.02|R|F|1995-03-19|1995-04-04|1995-03-30|NONE|AIR|riously special theodolites breach bl +54214|769|70|1|5|8348.80|0.07|0.01|A|F|1992-01-16|1992-03-21|1992-02-15|NONE|RAIL|sly express att +54214|238|39|2|41|46667.43|0.01|0.07|A|F|1992-02-25|1992-03-18|1992-03-19|COLLECT COD|AIR|rts use busily carefully stealthy deposits. +54215|1654|96|1|1|1555.65|0.03|0.00|N|O|1996-02-20|1996-01-03|1996-03-10|NONE|FOB|l packages eat furiously. quic +54215|147|74|2|46|48168.44|0.07|0.04|N|O|1996-01-05|1996-01-04|1996-01-31|DELIVER IN PERSON|FOB|bout the special +54215|1721|64|3|19|30831.68|0.02|0.03|N|O|1995-10-31|1996-01-09|1995-11-11|COLLECT COD|REG AIR|sleep carefull +54215|1326|3|4|7|8591.24|0.09|0.01|N|O|1995-12-12|1996-01-17|1996-01-07|COLLECT COD|REG AIR|ven packages. regular excuses +54215|1328|43|5|28|34420.96|0.00|0.02|N|O|1995-12-01|1995-12-12|1995-12-13|TAKE BACK RETURN|SHIP|sublate quickly regular somas. unusual requ +54215|1032|3|6|5|4665.15|0.06|0.02|N|O|1996-01-04|1995-11-29|1996-01-17|COLLECT COD|RAIL|ng packages. fluffily +54240|830|30|1|28|48463.24|0.07|0.07|N|O|1996-07-10|1996-08-03|1996-07-14|DELIVER IN PERSON|FOB|ly unusual ideas. fi +54240|1142|15|2|3|3129.42|0.08|0.07|N|O|1996-06-30|1996-07-15|1996-07-03|DELIVER IN PERSON|AIR|ggle quickly special platelets. platelets h +54240|415|3|3|31|40777.71|0.05|0.07|N|O|1996-07-25|1996-06-15|1996-08-20|COLLECT COD|REG AIR|ages. carefull +54240|332|33|4|3|3696.99|0.05|0.04|N|O|1996-05-31|1996-07-08|1996-06-24|DELIVER IN PERSON|SHIP|egular excuses. carefully regular +54241|453|12|1|6|8120.70|0.06|0.06|A|F|1992-09-17|1992-10-26|1992-10-13|TAKE BACK RETURN|REG AIR|s haggle. accounts print after the quickly +54241|1802|89|2|26|44298.80|0.06|0.07|R|F|1992-08-15|1992-10-05|1992-08-22|TAKE BACK RETURN|TRUCK|carefully final court +54241|81|57|3|46|45129.68|0.00|0.05|A|F|1992-08-31|1992-09-21|1992-09-10|COLLECT COD|FOB|ual courts among the blithely +54241|101|2|4|24|24026.40|0.00|0.08|R|F|1992-10-01|1992-10-20|1992-10-23|TAKE BACK RETURN|TRUCK|symptotes sleep carefully +54241|1220|32|5|26|29151.72|0.09|0.01|R|F|1992-10-23|1992-09-05|1992-11-04|TAKE BACK RETURN|MAIL|final packages x-ra +54241|261|43|6|11|12773.86|0.08|0.07|A|F|1992-11-14|1992-09-08|1992-11-28|TAKE BACK RETURN|FOB| fluffily pending d +54241|270|25|7|6|7021.62|0.02|0.02|R|F|1992-11-18|1992-09-23|1992-12-02|NONE|TRUCK|c accounts poach above the unusual, iron +54242|1776|19|1|32|53688.64|0.08|0.01|N|O|1998-06-06|1998-06-24|1998-06-08|NONE|REG AIR|encies cajole carefully. regular, even fo +54242|1360|75|2|16|20181.76|0.04|0.03|N|O|1998-07-26|1998-06-09|1998-08-04|TAKE BACK RETURN|FOB|ffily ironic dependencies. slow theodolite +54242|853|20|3|41|71907.85|0.01|0.07|N|O|1998-06-22|1998-04-30|1998-06-29|DELIVER IN PERSON|FOB| boost quickly. ironically express r +54242|557|88|4|5|7287.75|0.02|0.03|N|O|1998-06-11|1998-05-04|1998-06-13|COLLECT COD|RAIL|ing pinto beans wake b +54242|1122|59|5|30|30693.60|0.06|0.04|N|O|1998-06-17|1998-05-31|1998-06-21|DELIVER IN PERSON|FOB|riously regu +54243|856|90|1|8|14054.80|0.06|0.07|A|F|1994-12-16|1994-12-12|1994-12-24|NONE|TRUCK|ithe deposits cajole fluffily sp +54243|159|12|2|10|10591.50|0.09|0.03|A|F|1994-11-25|1994-12-13|1994-12-16|NONE|MAIL|furiously. ca +54243|1852|53|3|24|42092.40|0.09|0.04|R|F|1994-12-15|1994-10-19|1995-01-08|NONE|AIR|g theodolites. ironic epitaph +54243|1292|4|4|15|17899.35|0.09|0.03|R|F|1994-09-18|1994-10-29|1994-09-27|COLLECT COD|REG AIR|n deposits. regular, qui +54244|1161|62|1|26|27616.16|0.01|0.08|N|O|1996-05-19|1996-05-25|1996-05-23|DELIVER IN PERSON|FOB| excuses? furiou +54244|866|66|2|29|51238.94|0.06|0.04|N|O|1996-04-10|1996-05-08|1996-05-05|DELIVER IN PERSON|AIR|pades are. carefully i +54245|889|90|1|26|46536.88|0.06|0.02|R|F|1995-04-22|1995-05-23|1995-05-21|DELIVER IN PERSON|REG AIR|ckly ironic, pending pack +54245|472|60|2|44|60388.68|0.05|0.08|N|O|1995-06-28|1995-05-12|1995-07-26|TAKE BACK RETURN|REG AIR|y against the car +54246|1022|28|1|30|27690.60|0.10|0.01|R|F|1993-09-19|1993-09-19|1993-10-15|NONE|RAIL|silent inst +54246|1337|14|2|17|21051.61|0.07|0.05|R|F|1993-09-05|1993-08-30|1993-09-15|NONE|AIR| express theodolites. +54247|1725|10|1|43|69948.96|0.09|0.05|N|O|1997-05-03|1997-07-15|1997-05-30|TAKE BACK RETURN|MAIL|e furiously ironic foxes. f +54247|1613|55|2|21|31806.81|0.02|0.08|N|O|1997-04-22|1997-07-11|1997-05-19|NONE|RAIL| the slyly +54247|1544|65|3|18|26019.72|0.01|0.08|N|O|1997-07-23|1997-06-15|1997-07-27|NONE|TRUCK|n ideas are +54247|1634|76|4|34|52211.42|0.07|0.01|N|O|1997-05-15|1997-06-01|1997-06-03|DELIVER IN PERSON|TRUCK|lyly regular excuses cajole furiously f +54247|557|58|5|15|21863.25|0.01|0.06|N|O|1997-07-28|1997-05-22|1997-08-09|TAKE BACK RETURN|FOB|the slyly pending requests. fluffi +54247|843|77|6|26|45339.84|0.01|0.02|N|O|1997-07-08|1997-05-20|1997-07-11|TAKE BACK RETURN|SHIP|ests. regular, special pinto beans ha +54272|737|2|1|29|47494.17|0.10|0.01|N|O|1997-11-26|1997-10-13|1997-12-20|DELIVER IN PERSON|TRUCK|s. blithely express instructions wake alon +54272|1550|31|2|4|5806.20|0.06|0.05|N|O|1997-09-24|1997-09-23|1997-10-12|DELIVER IN PERSON|MAIL|as haggle alongside of +54272|362|63|3|20|25247.20|0.07|0.04|N|O|1997-11-12|1997-10-12|1997-12-12|NONE|SHIP|pendencies +54273|751|48|1|3|4955.25|0.07|0.05|N|O|1998-08-29|1998-08-05|1998-09-20|TAKE BACK RETURN|FOB|sy asymptotes nag sometimes about the fi +54273|60|86|2|25|24001.50|0.08|0.07|N|O|1998-07-04|1998-08-01|1998-07-26|DELIVER IN PERSON|REG AIR|ges around the ironic asymptotes wa +54273|1188|25|3|10|10891.80|0.01|0.05|N|O|1998-06-17|1998-06-19|1998-07-16|NONE|SHIP|ular excuse +54273|389|90|4|32|41260.16|0.07|0.02|N|O|1998-08-06|1998-07-31|1998-08-31|TAKE BACK RETURN|SHIP|tegrate after the instructions. +54273|606|69|5|25|37665.00|0.01|0.06|N|O|1998-05-26|1998-07-27|1998-06-16|TAKE BACK RETURN|FOB|slyly bold r +54273|957|58|6|7|13005.65|0.05|0.02|N|O|1998-08-28|1998-07-10|1998-09-02|TAKE BACK RETURN|MAIL|ans sleep across t +54273|526|17|7|3|4279.56|0.03|0.07|N|O|1998-08-05|1998-07-06|1998-08-20|COLLECT COD|RAIL|lyly quickly +54274|1799|100|1|25|42519.75|0.06|0.06|A|F|1994-01-02|1994-02-11|1994-01-19|DELIVER IN PERSON|TRUCK|ronic accounts are after +54274|1598|39|2|20|29991.80|0.08|0.01|A|F|1994-02-12|1994-01-18|1994-02-24|DELIVER IN PERSON|FOB|d theodoli +54274|629|61|3|5|7648.10|0.03|0.00|A|F|1993-12-30|1994-01-12|1994-01-05|TAKE BACK RETURN|SHIP| final requests eat carefully quick +54274|61|12|4|9|8649.54|0.03|0.02|A|F|1994-02-23|1994-02-01|1994-03-10|TAKE BACK RETURN|REG AIR|sleep about the +54274|1218|93|5|29|32457.09|0.08|0.02|A|F|1994-01-06|1994-02-07|1994-01-17|COLLECT COD|MAIL|ntegrate slyly. carefully ironic fox +54274|850|51|6|30|52525.50|0.04|0.05|A|F|1993-12-23|1994-02-02|1993-12-30|DELIVER IN PERSON|REG AIR|, ironic dependencies impress +54274|786|19|7|25|42169.50|0.08|0.01|A|F|1993-12-28|1994-01-15|1994-01-09|TAKE BACK RETURN|REG AIR|y bold theodo +54275|711|76|1|17|27399.07|0.06|0.06|R|F|1993-03-28|1993-02-22|1993-04-24|COLLECT COD|FOB|cross the blithely final accounts. unus +54275|1428|29|2|28|37223.76|0.05|0.06|A|F|1993-01-22|1993-03-31|1993-01-31|DELIVER IN PERSON|FOB|r the blith +54276|210|11|1|28|31085.88|0.04|0.07|A|F|1993-04-07|1993-04-03|1993-05-07|COLLECT COD|SHIP|uffily bold dolphins against the requ +54276|1459|99|2|20|27209.00|0.10|0.01|R|F|1993-02-10|1993-03-17|1993-02-20|DELIVER IN PERSON|REG AIR|nal foxes. quickly special courts use +54276|941|44|3|25|46048.50|0.00|0.05|A|F|1993-04-25|1993-04-14|1993-05-18|TAKE BACK RETURN|TRUCK| cajole unusual c +54276|422|52|4|37|48929.54|0.06|0.03|A|F|1993-03-16|1993-04-06|1993-04-03|NONE|RAIL|y final platelets +54277|1964|9|1|46|85834.16|0.08|0.00|A|F|1993-03-25|1993-04-02|1993-03-30|TAKE BACK RETURN|TRUCK|ong the accounts? special instructions +54277|1405|84|2|19|24821.60|0.03|0.07|A|F|1993-03-20|1993-03-19|1993-04-13|COLLECT COD|SHIP|pinto beans are +54277|18|69|3|32|29376.32|0.02|0.03|A|F|1993-02-17|1993-03-05|1993-02-28|DELIVER IN PERSON|AIR| fluffy, ironic packages. furiou +54277|1969|58|4|43|80451.28|0.00|0.00|A|F|1993-04-12|1993-03-01|1993-05-05|COLLECT COD|MAIL| accounts +54277|487|17|5|11|15262.28|0.06|0.04|R|F|1993-04-09|1993-04-02|1993-05-02|TAKE BACK RETURN|RAIL|d accounts a +54277|286|87|6|1|1186.28|0.07|0.07|A|F|1993-04-26|1993-03-10|1993-04-28|DELIVER IN PERSON|TRUCK|le furiousl +54277|84|85|7|28|27554.24|0.10|0.00|A|F|1993-04-29|1993-02-05|1993-05-24|COLLECT COD|MAIL|ncies. slyly final packages boos +54278|1620|21|1|33|50213.46|0.01|0.00|N|O|1997-08-17|1997-07-31|1997-09-01|TAKE BACK RETURN|RAIL|iers. furiously special theodolit +54278|837|71|2|35|60824.05|0.10|0.08|N|O|1997-07-16|1997-07-10|1997-07-28|NONE|REG AIR| fluffily regular ideas accord +54278|512|73|3|13|18362.63|0.05|0.02|N|O|1997-07-28|1997-07-14|1997-08-14|NONE|AIR|nal packages are qu +54278|177|78|4|4|4308.68|0.03|0.05|N|O|1997-08-05|1997-07-27|1997-08-22|NONE|TRUCK|. even accounts sleep along the blithely +54278|1306|83|5|31|37426.30|0.03|0.05|N|O|1997-06-03|1997-07-25|1997-06-19|DELIVER IN PERSON|MAIL|solve carefully. frays print aft +54278|1214|52|6|11|12267.31|0.01|0.05|N|O|1997-05-26|1997-07-03|1997-06-07|COLLECT COD|FOB|final requests +54278|1278|53|7|29|34198.83|0.02|0.00|N|O|1997-05-12|1997-08-03|1997-05-27|COLLECT COD|REG AIR|onic deposits. carefully regular +54279|1574|75|1|7|10328.99|0.00|0.08|N|O|1995-09-13|1995-10-28|1995-09-16|COLLECT COD|FOB|into beans. da +54279|1117|90|2|6|6108.66|0.00|0.00|N|O|1995-10-04|1995-09-11|1995-10-14|TAKE BACK RETURN|AIR|nal instructions. furiou +54279|1287|25|3|35|41589.80|0.10|0.05|N|O|1995-09-20|1995-09-13|1995-10-02|DELIVER IN PERSON|SHIP|. fluffily +54279|131|32|4|20|20622.60|0.06|0.01|N|O|1995-11-19|1995-10-17|1995-12-16|COLLECT COD|TRUCK|sleep. pending realms are blithely. pend +54279|1588|69|5|5|7447.90|0.01|0.08|N|O|1995-11-14|1995-10-19|1995-12-07|TAKE BACK RETURN|AIR|uickly quickly unusual de +54279|378|35|6|26|33237.62|0.04|0.06|N|O|1995-10-20|1995-10-23|1995-10-31|TAKE BACK RETURN|RAIL|pecial deposits abo +54279|1369|84|7|26|33029.36|0.10|0.02|N|O|1995-08-13|1995-10-03|1995-09-06|DELIVER IN PERSON|AIR|ously regular +54304|888|55|1|15|26833.20|0.10|0.01|A|F|1993-02-22|1993-04-23|1993-03-18|TAKE BACK RETURN|MAIL|equests. furiously regular +54304|742|75|2|47|77208.78|0.03|0.00|R|F|1993-02-26|1993-04-27|1993-03-04|COLLECT COD|RAIL|c asymptotes +54305|1297|9|1|8|9586.32|0.10|0.01|N|O|1997-10-31|1997-10-30|1997-11-17|NONE|FOB|refully. foxes are furiously +54305|1055|91|2|43|41110.15|0.01|0.05|N|O|1997-09-26|1997-11-10|1997-10-02|DELIVER IN PERSON|RAIL|inal instructions against +54305|1620|62|3|20|30432.40|0.10|0.05|N|O|1997-10-10|1997-11-09|1997-10-29|NONE|RAIL|kages haggle carefully among the spe +54305|927|96|4|15|27418.80|0.02|0.02|N|O|1997-11-18|1997-11-09|1997-12-17|NONE|TRUCK|ounts hang carefully regu +54305|1165|2|5|17|18124.72|0.01|0.07|N|O|1997-11-01|1997-09-29|1997-11-05|NONE|REG AIR| blithely even accou +54306|843|77|1|37|64522.08|0.03|0.07|R|F|1992-09-19|1992-07-31|1992-10-10|COLLECT COD|AIR| accounts. slyly pending accounts cajo +54307|1940|73|1|31|57100.14|0.08|0.03|A|F|1992-02-27|1992-03-08|1992-03-15|TAKE BACK RETURN|SHIP|eas. final, final ideas nag aft +54307|1399|76|2|6|7802.34|0.10|0.01|A|F|1992-02-21|1992-02-24|1992-03-06|DELIVER IN PERSON|FOB|y blithely final instructions. blithe +54307|303|4|3|40|48132.00|0.09|0.05|A|F|1992-01-17|1992-03-08|1992-01-30|NONE|AIR|fily ironic platelets boost am +54307|212|13|4|42|46712.82|0.07|0.04|A|F|1992-02-21|1992-03-06|1992-03-08|COLLECT COD|FOB|efully even ideas. slyly regular reques +54307|1703|88|5|20|32094.00|0.07|0.04|R|F|1992-04-02|1992-03-18|1992-04-27|COLLECT COD|FOB|ithely regular +54307|457|45|6|20|27149.00|0.07|0.04|R|F|1992-02-06|1992-03-15|1992-02-27|NONE|AIR|. ironic, unusu +54308|1076|12|1|24|23449.68|0.06|0.08|N|O|1996-04-18|1996-05-26|1996-04-29|DELIVER IN PERSON|MAIL|ep carefully. dinos wake +54308|1548|29|2|35|50733.90|0.09|0.07|N|O|1996-06-12|1996-04-15|1996-06-18|NONE|RAIL|l accounts? fluffily regular pinto bea +54308|1543|84|3|14|20223.56|0.02|0.05|N|O|1996-03-29|1996-04-03|1996-04-14|COLLECT COD|RAIL| quickly according to the furious +54308|886|87|4|34|60753.92|0.05|0.03|N|O|1996-03-30|1996-04-29|1996-04-06|NONE|MAIL|uickly regular asymptotes doze f +54308|1503|24|5|11|15449.50|0.07|0.02|N|O|1996-03-31|1996-04-06|1996-04-13|DELIVER IN PERSON|SHIP|ake quickl +54308|1874|61|6|43|76362.41|0.08|0.05|N|O|1996-03-12|1996-04-10|1996-04-08|COLLECT COD|TRUCK|l pinto beans use within +54309|442|43|1|19|25506.36|0.10|0.03|R|F|1992-07-23|1992-08-12|1992-07-31|NONE|FOB| carefully +54309|1893|80|2|28|50256.92|0.10|0.07|A|F|1992-09-19|1992-08-31|1992-09-20|DELIVER IN PERSON|REG AIR| accounts affi +54309|485|44|3|26|36022.48|0.04|0.02|R|F|1992-07-28|1992-08-18|1992-07-31|COLLECT COD|RAIL|y even acco +54310|1626|9|1|26|39718.12|0.01|0.07|N|O|1998-05-27|1998-05-14|1998-06-16|DELIVER IN PERSON|TRUCK|ronic somas. fluffily +54310|759|56|2|45|74688.75|0.01|0.02|N|O|1998-06-28|1998-05-23|1998-07-11|NONE|REG AIR|endencies us +54310|202|30|3|22|24248.40|0.01|0.01|N|O|1998-07-11|1998-05-06|1998-07-26|TAKE BACK RETURN|MAIL|ake furiously sile +54310|1814|58|4|12|20589.72|0.05|0.07|N|O|1998-06-26|1998-06-21|1998-07-25|NONE|MAIL|y even packages +54311|817|84|1|50|85890.50|0.03|0.05|N|O|1998-04-26|1998-03-15|1998-05-10|NONE|MAIL|iously even accounts. +54311|1014|50|2|25|22875.25|0.03|0.06|N|O|1998-02-09|1998-03-22|1998-02-15|TAKE BACK RETURN|FOB|gular accounts might are about the idea +54311|1780|81|3|46|77361.88|0.05|0.04|N|O|1998-03-20|1998-03-05|1998-03-23|NONE|REG AIR|ounts. ironic, express dinos wake: furious +54311|1118|27|4|27|27515.97|0.00|0.05|N|O|1998-03-22|1998-02-09|1998-04-08|TAKE BACK RETURN|REG AIR|ly ironic theodo +54311|747|12|5|33|54375.42|0.09|0.07|N|O|1998-03-02|1998-03-05|1998-03-24|TAKE BACK RETURN|AIR| instructi +54336|559|50|1|36|52543.80|0.07|0.03|A|F|1993-08-10|1993-06-08|1993-08-14|TAKE BACK RETURN|FOB|uests doubt alon +54336|1100|1|2|44|44048.40|0.00|0.03|A|F|1993-06-27|1993-07-12|1993-07-06|TAKE BACK RETURN|REG AIR| are quickly special ideas. +54336|115|94|3|7|7105.77|0.00|0.07|A|F|1993-05-08|1993-05-25|1993-05-19|NONE|AIR|etect! courts alongside of the +54336|1902|3|4|6|10823.40|0.05|0.05|R|F|1993-05-03|1993-05-24|1993-05-17|NONE|RAIL|y even packa +54337|1115|16|1|21|21338.31|0.09|0.05|N|O|1996-11-08|1996-10-18|1996-11-22|DELIVER IN PERSON|SHIP|he pending platelets. carefully bold es +54337|924|59|2|20|36498.40|0.01|0.01|N|O|1996-10-31|1996-09-20|1996-11-10|NONE|RAIL|luffily pinto b +54337|134|87|3|33|34126.29|0.10|0.00|N|O|1996-10-20|1996-10-31|1996-10-24|COLLECT COD|RAIL|into beans thrash a +54337|1856|43|4|32|56251.20|0.10|0.02|N|O|1996-11-06|1996-10-07|1996-11-10|NONE|SHIP|al theodolites run fl +54338|676|8|1|10|15766.70|0.06|0.00|N|O|1998-04-24|1998-02-18|1998-04-28|DELIVER IN PERSON|MAIL|s haggle fluffily except the regular i +54338|998|67|2|7|13292.93|0.09|0.03|N|O|1998-01-18|1998-02-14|1998-01-19|COLLECT COD|AIR|nd the regular dependencie +54338|268|23|3|48|56076.48|0.10|0.05|N|O|1998-04-24|1998-03-28|1998-05-01|COLLECT COD|RAIL|fully special deposits haggle across t +54338|1316|17|4|6|7303.86|0.06|0.04|N|O|1998-02-09|1998-03-17|1998-03-04|COLLECT COD|AIR|osits sleep carefully carefully regular fox +54338|812|46|5|42|71938.02|0.01|0.04|N|O|1998-01-29|1998-03-05|1998-02-28|DELIVER IN PERSON|FOB|ounts. epitaphs detect carefully fur +54339|1449|50|1|7|9453.08|0.05|0.04|A|F|1992-05-16|1992-07-28|1992-06-10|NONE|RAIL|ons doubt. furiously ironic re +54339|227|28|2|7|7890.54|0.04|0.02|R|F|1992-08-01|1992-07-04|1992-08-08|TAKE BACK RETURN|TRUCK|. regular, express +54339|1188|89|3|2|2178.36|0.02|0.04|A|F|1992-08-15|1992-07-21|1992-09-10|DELIVER IN PERSON|TRUCK|thely ironic requests along the unus +54339|428|29|4|44|58450.48|0.06|0.08|A|F|1992-05-21|1992-07-18|1992-06-07|TAKE BACK RETURN|SHIP|ingly along the special, unusual acc +54339|1500|40|5|49|68673.50|0.03|0.03|A|F|1992-08-26|1992-06-20|1992-09-24|NONE|FOB|, ironic packages will have to haggle quic +54339|893|94|6|46|82518.94|0.05|0.07|A|F|1992-06-05|1992-07-12|1992-06-14|COLLECT COD|REG AIR|ully even theo +54340|1213|88|1|42|46796.82|0.00|0.04|R|F|1994-01-11|1993-12-19|1994-02-01|DELIVER IN PERSON|MAIL|arefully regul +54341|1848|78|1|28|48995.52|0.04|0.08|R|F|1992-07-12|1992-05-28|1992-08-01|DELIVER IN PERSON|AIR|gifts nag according to the f +54341|1306|45|2|9|10865.70|0.10|0.07|R|F|1992-08-10|1992-05-31|1992-08-23|TAKE BACK RETURN|REG AIR|excuses. fluffi +54341|1888|18|3|32|57276.16|0.08|0.08|A|F|1992-05-22|1992-07-07|1992-06-15|TAKE BACK RETURN|TRUCK|s use blithely careful +54341|1730|31|4|4|6526.92|0.07|0.02|R|F|1992-05-16|1992-07-02|1992-05-24|NONE|AIR|. furiously ironic packages s +54342|909|44|1|20|36198.00|0.00|0.06|A|F|1994-08-08|1994-07-11|1994-08-15|COLLECT COD|RAIL|carefully above the carefully spe +54342|82|83|2|22|21605.76|0.04|0.06|A|F|1994-10-04|1994-07-25|1994-10-29|TAKE BACK RETURN|AIR|oys cajole furiously above +54342|1655|56|3|26|40472.90|0.09|0.07|R|F|1994-07-23|1994-09-06|1994-08-10|DELIVER IN PERSON|FOB|ges haggle above the express plate +54342|1851|81|4|12|21034.20|0.00|0.05|A|F|1994-06-23|1994-07-13|1994-06-26|DELIVER IN PERSON|RAIL|nusual pinto beans. +54342|461|20|5|34|46289.64|0.10|0.01|A|F|1994-07-15|1994-07-16|1994-07-16|DELIVER IN PERSON|MAIL|ar requests. +54343|1795|96|1|1|1696.79|0.05|0.01|N|O|1998-08-19|1998-10-03|1998-09-09|COLLECT COD|TRUCK|gular ideas nag blit +54343|1411|51|2|19|24935.79|0.00|0.07|N|O|1998-10-09|1998-09-26|1998-10-24|TAKE BACK RETURN|SHIP|tainments. furiously iron +54343|946|15|3|37|68336.78|0.00|0.02|N|O|1998-09-09|1998-10-22|1998-10-08|NONE|TRUCK| somas mold blithely. quickly e +54343|1748|91|4|45|74238.30|0.06|0.07|N|O|1998-10-25|1998-09-01|1998-11-14|COLLECT COD|FOB|ts. carefully regular plat +54343|1636|78|5|28|43053.64|0.06|0.04|N|O|1998-09-13|1998-09-29|1998-10-05|DELIVER IN PERSON|REG AIR|ithely final requests. carefu +54343|515|46|6|17|24063.67|0.07|0.04|N|O|1998-08-12|1998-10-15|1998-08-18|TAKE BACK RETURN|AIR|ts hang? final instructions use +54343|1914|3|7|7|12711.37|0.04|0.05|N|O|1998-11-18|1998-10-13|1998-12-18|COLLECT COD|FOB|inal, special deposits during the qu +54368|1658|59|1|26|40550.90|0.03|0.04|N|O|1995-11-20|1996-01-27|1995-12-11|TAKE BACK RETURN|FOB|st across the ironic, +54368|1777|4|2|21|35254.17|0.08|0.02|N|O|1996-02-07|1995-12-11|1996-02-24|DELIVER IN PERSON|RAIL|n ideas! carefully ruthless asymptotes +54368|607|1|3|9|13568.40|0.00|0.03|N|O|1995-12-15|1995-12-08|1995-12-25|COLLECT COD|AIR|ily above the always final packages. +54368|642|5|4|41|63248.24|0.03|0.07|N|O|1996-02-06|1996-01-03|1996-02-27|COLLECT COD|SHIP|ithely unusual packages hinder after +54368|1581|82|5|49|72646.42|0.03|0.02|N|O|1995-12-21|1996-01-09|1995-12-24|NONE|TRUCK|to the packages was alo +54368|1772|99|6|39|65277.03|0.10|0.01|N|O|1996-02-24|1996-01-28|1996-02-28|DELIVER IN PERSON|FOB|ajole carefully ironic requests. blithel +54368|1658|41|7|15|23394.75|0.00|0.03|N|O|1995-12-15|1996-01-17|1995-12-16|NONE|SHIP| final platelets would +54369|1588|89|1|16|23833.28|0.06|0.00|R|F|1994-05-06|1994-05-24|1994-05-27|DELIVER IN PERSON|REG AIR|y regular courts. bold, +54369|892|93|2|5|8964.45|0.07|0.05|A|F|1994-03-07|1994-05-22|1994-03-26|COLLECT COD|MAIL|eans doubt blit +54369|1554|35|3|46|66955.30|0.04|0.00|A|F|1994-05-09|1994-05-17|1994-05-10|DELIVER IN PERSON|AIR|. dugouts b +54370|894|61|1|4|7179.56|0.04|0.00|R|F|1992-07-11|1992-06-15|1992-07-21|NONE|RAIL|ests; final theodolites us +54370|184|85|2|39|42283.02|0.06|0.02|A|F|1992-05-18|1992-05-23|1992-05-31|COLLECT COD|TRUCK| fluffily q +54370|995|30|3|32|60671.68|0.08|0.07|R|F|1992-04-16|1992-06-19|1992-04-26|NONE|FOB|re slyly b +54370|491|21|4|25|34787.25|0.07|0.04|A|F|1992-08-04|1992-06-24|1992-09-03|NONE|REG AIR|the carefully unusual +54371|1685|86|1|47|74573.96|0.10|0.08|R|F|1992-06-07|1992-03-20|1992-06-08|COLLECT COD|REG AIR|boost slyly about the ironic +54371|1617|41|2|12|18223.32|0.03|0.06|R|F|1992-04-04|1992-03-29|1992-05-03|COLLECT COD|REG AIR|ding, even requests maintain enti +54371|1638|62|3|7|10777.41|0.07|0.02|R|F|1992-04-22|1992-03-28|1992-05-18|COLLECT COD|SHIP|usly regular platelets sleep blithely. +54372|118|97|1|7|7126.77|0.08|0.04|A|F|1995-04-20|1995-05-26|1995-05-15|DELIVER IN PERSON|RAIL|ake slyly ironic, express dependencie +54372|1511|12|2|28|39550.28|0.07|0.03|R|F|1995-04-07|1995-04-28|1995-04-28|TAKE BACK RETURN|SHIP|en dugouts haggle blithely. +54372|1538|39|3|27|38867.31|0.02|0.01|R|F|1995-05-03|1995-06-17|1995-05-07|NONE|RAIL|sly final ideas. +54372|1372|73|4|1|1273.37|0.05|0.00|R|F|1995-05-20|1995-05-19|1995-06-13|TAKE BACK RETURN|SHIP| permanent requ +54372|460|48|5|31|42174.26|0.01|0.07|N|F|1995-06-04|1995-05-20|1995-06-20|NONE|AIR|lly. ironic, quiet accounts haggle ste +54372|1111|84|6|43|43520.73|0.01|0.06|N|O|1995-06-20|1995-04-28|1995-07-17|COLLECT COD|FOB|s play furiously quickly ev +54372|773|74|7|42|70298.34|0.06|0.06|A|F|1995-04-26|1995-04-25|1995-05-07|COLLECT COD|REG AIR| pending asymptotes wake +54373|707|8|1|15|24115.50|0.10|0.05|N|O|1998-03-29|1998-02-19|1998-04-22|TAKE BACK RETURN|REG AIR|luffily even notornis. +54373|637|31|2|12|18451.56|0.07|0.06|N|O|1998-02-13|1998-02-27|1998-03-11|DELIVER IN PERSON|FOB|ar deposits h +54373|45|96|3|14|13230.56|0.10|0.08|N|O|1998-03-06|1998-02-19|1998-03-21|TAKE BACK RETURN|TRUCK|al dependencies believe carefully +54374|919|54|1|4|7279.64|0.08|0.03|N|O|1997-10-31|1997-09-07|1997-11-02|TAKE BACK RETURN|SHIP|ests lose alongside +54374|853|53|2|11|19292.35|0.01|0.04|N|O|1997-09-23|1997-09-08|1997-10-14|COLLECT COD|SHIP|haggle carefully. ironic +54374|173|100|3|40|42926.80|0.09|0.06|N|O|1997-08-24|1997-09-23|1997-09-08|COLLECT COD|TRUCK|nts. regular ideas alongside of the b +54374|1482|83|4|46|63640.08|0.00|0.07|N|O|1997-08-26|1997-10-03|1997-09-10|COLLECT COD|SHIP|t theodolites ca +54374|1445|24|5|2|2692.88|0.02|0.07|N|O|1997-08-28|1997-10-02|1997-09-11|DELIVER IN PERSON|REG AIR|nic accounts boost across +54375|16|42|1|9|8244.09|0.08|0.07|N|O|1997-09-14|1997-08-05|1997-10-14|TAKE BACK RETURN|AIR|lar accounts are quiet +54375|1939|72|2|33|60750.69|0.04|0.01|N|O|1997-08-24|1997-06-30|1997-09-19|NONE|RAIL|xcuses detect furiously slyly special ideas +54375|320|77|3|28|34168.96|0.07|0.06|N|O|1997-09-03|1997-08-06|1997-09-12|NONE|MAIL| after the enticingl +54375|757|54|4|21|34812.75|0.06|0.04|N|O|1997-07-02|1997-08-07|1997-07-15|TAKE BACK RETURN|TRUCK|nto the carefully ironic accounts +54375|1133|70|5|4|4136.52|0.05|0.00|N|O|1997-08-20|1997-07-04|1997-08-21|NONE|FOB|otes. carefully un +54375|1366|5|6|11|13940.96|0.09|0.07|N|O|1997-05-29|1997-06-29|1997-06-15|NONE|SHIP| requests cajole against +54400|1655|38|1|37|57596.05|0.06|0.03|N|O|1997-09-08|1997-09-17|1997-09-10|NONE|TRUCK|mptotes ha +54400|47|48|2|40|37881.60|0.05|0.03|N|O|1997-10-04|1997-09-16|1997-10-28|TAKE BACK RETURN|RAIL|. tithes after the blithely pending a +54400|1077|13|3|7|6846.49|0.03|0.02|N|O|1997-10-14|1997-10-02|1997-11-03|TAKE BACK RETURN|MAIL|. blithely ironic deposits until the ca +54400|1391|68|4|25|32309.75|0.04|0.05|N|O|1997-10-08|1997-09-27|1997-10-21|TAKE BACK RETURN|FOB|even ideas. quickl +54401|858|58|1|3|5276.55|0.01|0.08|N|O|1996-02-18|1996-02-10|1996-03-03|DELIVER IN PERSON|AIR|l pinto beans haggle carefully against +54401|643|75|2|27|41678.28|0.09|0.07|N|O|1996-03-20|1996-01-06|1996-03-28|COLLECT COD|RAIL| blithely regular notornis. brave, ex +54401|1990|35|3|10|18919.90|0.04|0.05|N|O|1996-02-22|1996-02-22|1996-03-22|COLLECT COD|TRUCK|ests. ironic deposit +54401|805|72|4|4|6823.20|0.00|0.04|N|O|1996-01-16|1996-02-07|1996-01-28|NONE|RAIL|e according to +54401|223|78|5|43|48298.46|0.10|0.05|N|O|1995-12-09|1996-02-01|1995-12-24|COLLECT COD|REG AIR|xpress ideas cajole blithely after the +54401|1134|43|6|5|5175.65|0.08|0.01|N|O|1996-02-21|1996-02-05|1996-03-17|TAKE BACK RETURN|AIR| nag slyly about th +54401|466|54|7|50|68323.00|0.01|0.00|N|O|1996-03-20|1996-01-16|1996-04-02|TAKE BACK RETURN|TRUCK|coys. silent, regular accounts among the ca +54402|1136|73|1|13|13482.69|0.03|0.00|N|O|1997-02-03|1996-12-14|1997-02-04|DELIVER IN PERSON|MAIL|long the fluffily regular in +54402|1167|76|2|25|26704.00|0.03|0.04|N|O|1996-12-12|1996-11-26|1996-12-22|TAKE BACK RETURN|AIR| sleep ruthlessly unusual requests. care +54402|934|3|3|22|40368.46|0.10|0.00|N|O|1996-11-19|1996-11-19|1996-11-22|COLLECT COD|TRUCK|g theodolites haggle permanently am +54402|1937|38|4|32|58845.76|0.07|0.01|N|O|1996-12-20|1996-12-05|1997-01-03|NONE|AIR| deposits serve +54402|1194|95|5|28|30665.32|0.08|0.07|N|O|1996-12-12|1996-12-21|1997-01-06|DELIVER IN PERSON|FOB|y special pinto beans? ironic, final dol +54402|1557|58|6|8|11668.40|0.02|0.01|N|O|1996-11-01|1996-12-02|1996-11-28|TAKE BACK RETURN|MAIL| according to the fluffily special depende +54402|1695|19|7|16|25547.04|0.09|0.03|N|O|1996-12-08|1996-12-23|1996-12-31|COLLECT COD|FOB|ges are. quickly final ideas haggle +54403|1009|15|1|3|2730.00|0.08|0.05|N|O|1996-06-07|1996-04-12|1996-06-20|TAKE BACK RETURN|TRUCK| packages. unusual, slow theodolit +54403|238|20|2|41|46667.43|0.01|0.07|N|O|1996-06-01|1996-05-06|1996-06-03|DELIVER IN PERSON|REG AIR|essly unusual waters along the sly +54404|725|26|1|17|27637.24|0.04|0.04|N|O|1998-05-25|1998-05-13|1998-06-24|TAKE BACK RETURN|MAIL|nts. final foxes after the ca +54404|866|66|2|15|26502.90|0.05|0.05|N|O|1998-06-07|1998-05-12|1998-06-18|TAKE BACK RETURN|REG AIR|ackages nag quickly expres +54404|918|87|3|41|74575.31|0.05|0.01|N|O|1998-06-07|1998-04-20|1998-06-09|NONE|RAIL|ns. carefully bold asymptotes after +54404|1833|77|4|12|20817.96|0.10|0.02|N|O|1998-04-07|1998-03-26|1998-05-03|DELIVER IN PERSON|SHIP|efully regular +54404|1614|56|5|27|40921.47|0.09|0.01|N|O|1998-05-11|1998-05-14|1998-05-22|COLLECT COD|SHIP|riously ev +54405|662|94|1|46|71882.36|0.10|0.04|R|F|1994-08-29|1994-08-06|1994-09-17|TAKE BACK RETURN|FOB|d instructions. even packages +54405|1315|30|2|33|40138.23|0.02|0.02|R|F|1994-08-11|1994-07-21|1994-08-16|NONE|MAIL|riously ironic warhorses abou +54406|1525|26|1|47|67046.44|0.03|0.02|N|O|1995-09-24|1995-08-02|1995-10-19|NONE|RAIL|final deposits use slyly. regular request +54406|200|53|2|11|12102.20|0.06|0.04|N|O|1995-07-29|1995-07-18|1995-08-02|TAKE BACK RETURN|RAIL|ts haggle doggedly instructions. furious +54406|1258|96|3|42|48688.50|0.10|0.06|N|O|1995-08-02|1995-08-26|1995-08-25|COLLECT COD|RAIL|ld deposit +54406|1825|69|4|47|81160.54|0.03|0.00|N|O|1995-07-08|1995-07-11|1995-07-24|TAKE BACK RETURN|RAIL| final reque +54406|763|64|5|44|73205.44|0.06|0.05|N|O|1995-09-11|1995-08-13|1995-09-20|DELIVER IN PERSON|RAIL|ckly even requests n +54406|294|49|6|15|17914.35|0.10|0.02|N|O|1995-06-29|1995-08-29|1995-07-12|TAKE BACK RETURN|AIR| slyly even platelets haggle furiously amon +54407|948|83|1|25|46223.50|0.09|0.00|A|F|1993-09-20|1993-09-13|1993-10-19|DELIVER IN PERSON|REG AIR|fix. blithely +54407|673|5|2|36|56652.12|0.05|0.05|A|F|1993-07-31|1993-09-15|1993-08-12|NONE|TRUCK|es. blithely regular do +54407|1513|94|3|18|25461.18|0.06|0.06|A|F|1993-08-26|1993-08-29|1993-09-24|TAKE BACK RETURN|REG AIR|express accounts +54407|130|31|4|17|17512.21|0.10|0.06|R|F|1993-08-15|1993-08-23|1993-08-16|DELIVER IN PERSON|FOB|riously even instruct +54407|1921|10|5|1|1822.92|0.09|0.03|A|F|1993-07-04|1993-08-11|1993-07-20|TAKE BACK RETURN|TRUCK|ithely regular packa +54432|339|96|1|10|12393.30|0.02|0.05|N|O|1996-04-22|1996-05-19|1996-04-26|NONE|REG AIR|otes cajole c +54432|1507|88|2|41|57748.50|0.10|0.02|N|O|1996-06-02|1996-04-19|1996-06-30|NONE|AIR|uffily careful +54433|583|14|1|45|66761.10|0.03|0.05|N|O|1997-12-11|1997-10-31|1998-01-04|COLLECT COD|RAIL| blithely express gifts. s +54433|649|81|2|39|60435.96|0.08|0.03|N|O|1998-01-08|1997-12-21|1998-01-29|TAKE BACK RETURN|REG AIR|nto beans! blithely spec +54434|1118|27|1|4|4076.44|0.02|0.01|A|F|1994-10-18|1994-12-13|1994-10-26|NONE|AIR|fully ironic r +54434|1514|55|2|50|70775.50|0.09|0.07|R|F|1995-01-06|1994-11-02|1995-01-10|DELIVER IN PERSON|AIR|e blithely idl +54434|1481|99|3|10|13824.80|0.06|0.01|A|F|1994-11-28|1994-11-01|1994-12-23|DELIVER IN PERSON|FOB| dogged deposits. packages nag-- brav +54435|1211|12|1|25|27805.25|0.01|0.02|N|O|1997-06-04|1997-06-05|1997-06-21|DELIVER IN PERSON|FOB| finally. +54435|335|20|2|26|32118.58|0.08|0.05|N|O|1997-07-01|1997-07-15|1997-07-31|TAKE BACK RETURN|AIR| dependencies. +54435|1325|40|3|26|31884.32|0.08|0.01|N|O|1997-06-06|1997-07-16|1997-06-24|NONE|RAIL|ress, bold depos +54435|1706|49|4|7|11253.90|0.05|0.03|N|O|1997-07-30|1997-05-27|1997-08-18|TAKE BACK RETURN|FOB|ly ironic requests haggle slyly +54435|1268|6|5|23|26892.98|0.02|0.06|N|O|1997-06-12|1997-06-01|1997-07-06|DELIVER IN PERSON|REG AIR| the carefully enticing +54435|289|44|6|46|54706.88|0.07|0.07|N|O|1997-07-15|1997-06-21|1997-08-06|TAKE BACK RETURN|MAIL|s sleep blithely final packages. unusua +54436|13|14|1|49|44737.49|0.05|0.06|A|F|1994-10-23|1994-12-18|1994-11-16|NONE|TRUCK|ress carefully along the requests +54436|2|78|2|29|26158.00|0.03|0.08|R|F|1994-12-10|1994-10-22|1994-12-12|DELIVER IN PERSON|MAIL|lent pinto beans. platele +54436|1489|68|3|36|50057.28|0.00|0.04|A|F|1995-01-06|1994-12-16|1995-01-24|NONE|AIR|ajole furiously b +54436|1055|61|4|37|35373.85|0.04|0.07|R|F|1994-10-25|1994-12-10|1994-11-04|TAKE BACK RETURN|MAIL|packages are slyly at the carefully bli +54436|1846|76|5|1|1747.84|0.01|0.05|R|F|1995-01-18|1994-10-24|1995-01-27|COLLECT COD|FOB|its haggle car +54436|340|41|6|40|49613.60|0.08|0.04|R|F|1994-11-27|1994-12-12|1994-12-19|COLLECT COD|REG AIR|ounts use. slyly brave +54436|2|3|7|5|4510.00|0.05|0.02|R|F|1994-12-06|1994-11-28|1994-12-29|NONE|MAIL|boost quickly. blithely unusual asymptotes +54437|735|100|1|50|81786.50|0.02|0.00|R|F|1994-03-28|1994-03-11|1994-04-06|DELIVER IN PERSON|MAIL|ly busy requests sleep. fur +54437|1386|63|2|7|9011.66|0.09|0.08|R|F|1994-01-16|1994-02-04|1994-01-21|COLLECT COD|SHIP|he fluffily express ideas +54437|699|93|3|3|4799.07|0.08|0.00|R|F|1994-01-10|1994-02-24|1994-01-15|NONE|REG AIR|pinto beans. quickly blithe fr +54438|1677|60|1|34|53674.78|0.07|0.01|A|F|1993-06-03|1993-03-22|1993-06-30|COLLECT COD|TRUCK|oxes cajole. quickly spe +54438|1675|58|2|46|72526.82|0.04|0.02|R|F|1993-03-16|1993-05-16|1993-03-21|TAKE BACK RETURN|TRUCK|carefully even acco +54438|1745|88|3|16|26347.84|0.06|0.04|R|F|1993-05-26|1993-04-07|1993-05-29|NONE|RAIL|ithely regular foxes. slyly pending accoun +54439|780|13|1|26|43700.28|0.07|0.00|N|O|1998-05-03|1998-06-13|1998-06-01|COLLECT COD|RAIL|ously final, regular instructions. s +54439|1023|24|2|24|22176.48|0.06|0.05|N|O|1998-08-15|1998-06-19|1998-09-11|NONE|REG AIR|c deposits ha +54439|1685|9|3|41|65053.88|0.05|0.00|N|O|1998-08-08|1998-06-29|1998-08-23|DELIVER IN PERSON|FOB|nusual Tiresias cajole quickly aft +54439|184|85|4|28|30357.04|0.07|0.02|N|O|1998-05-09|1998-07-06|1998-05-20|NONE|TRUCK|uthless theodolites bo +54464|1329|68|1|7|8612.24|0.07|0.00|A|F|1994-10-03|1994-11-14|1994-10-09|COLLECT COD|RAIL|ely final theodolites hinder according to +54464|1047|48|2|34|32233.36|0.06|0.02|R|F|1994-10-18|1994-10-06|1994-11-06|NONE|TRUCK|y unusual a +54464|1478|18|3|7|9656.29|0.03|0.06|R|F|1994-09-27|1994-10-30|1994-10-09|TAKE BACK RETURN|AIR|nding requests grow +54464|1739|24|4|27|44299.71|0.04|0.03|R|F|1994-12-07|1994-10-02|1995-01-03|DELIVER IN PERSON|RAIL|edly regular requests detec +54464|437|96|5|33|44135.19|0.06|0.02|R|F|1994-10-05|1994-11-26|1994-10-11|NONE|RAIL| regular p +54464|1501|82|6|20|28050.00|0.00|0.04|A|F|1994-09-13|1994-10-18|1994-10-08|DELIVER IN PERSON|REG AIR|e carefully e +54464|1653|77|7|49|76177.85|0.04|0.06|R|F|1994-11-10|1994-11-26|1994-11-22|NONE|SHIP| slyly ironic ideas sleep fur +54465|1556|37|1|16|23320.80|0.03|0.05|N|O|1997-08-24|1997-10-18|1997-09-22|TAKE BACK RETURN|SHIP|ly bold accounts. carefully even packages +54466|1788|89|1|16|27036.48|0.03|0.07|N|O|1997-08-24|1997-09-06|1997-08-31|DELIVER IN PERSON|SHIP|nts maintain blithely ab +54467|183|36|1|2|2166.36|0.04|0.02|A|F|1993-12-06|1993-11-30|1993-12-10|DELIVER IN PERSON|MAIL|ccounts hinder ironic deposi +54467|245|46|2|37|42373.88|0.09|0.01|R|F|1993-12-08|1993-12-05|1993-12-22|COLLECT COD|REG AIR|cial requests cajole furiou +54467|854|21|3|10|17548.50|0.09|0.00|A|F|1994-01-05|1993-12-19|1994-01-12|DELIVER IN PERSON|MAIL|le furiously. furiously final packages +54467|605|68|4|42|63235.20|0.02|0.07|A|F|1993-12-16|1993-12-12|1993-12-18|DELIVER IN PERSON|RAIL|express dolphins cajole quietly alon +54468|1782|67|1|41|69034.98|0.01|0.01|R|F|1995-01-04|1995-03-04|1995-01-20|COLLECT COD|MAIL| requests. regular platelets haggle. slyl +54468|1087|93|2|16|15809.28|0.02|0.05|A|F|1995-02-25|1995-02-18|1995-03-15|NONE|TRUCK|wake furiously. quietly bold +54468|1806|7|3|2|3415.60|0.04|0.05|A|F|1995-02-27|1995-02-26|1995-03-25|DELIVER IN PERSON|MAIL| regular requests grow furio +54468|393|94|4|6|7760.34|0.01|0.03|A|F|1995-04-14|1995-02-20|1995-04-24|TAKE BACK RETURN|TRUCK|iously ironic plate +54468|984|19|5|47|88594.06|0.07|0.00|A|F|1995-03-28|1995-03-02|1995-04-21|TAKE BACK RETURN|FOB|ckages. un +54468|1905|6|6|2|3613.80|0.06|0.04|A|F|1994-12-21|1995-02-25|1995-01-10|DELIVER IN PERSON|AIR|ly. fluffily silent packages sleep furiou +54469|832|33|1|4|6931.32|0.05|0.07|N|O|1997-08-20|1997-09-13|1997-09-16|COLLECT COD|RAIL|l deposits +54469|1432|11|2|48|64004.64|0.00|0.01|N|O|1997-08-29|1997-10-28|1997-09-06|COLLECT COD|RAIL| use blithely en +54470|1306|45|1|40|48292.00|0.09|0.02|N|O|1997-12-26|1998-01-25|1998-01-02|DELIVER IN PERSON|AIR|ronic dolphins wake carefully upon the e +54471|15|91|1|18|16470.18|0.04|0.06|R|F|1992-11-14|1992-12-04|1992-11-16|NONE|REG AIR|fully. furiously ironic requests haggle a +54471|697|60|2|31|49528.39|0.03|0.01|R|F|1992-12-24|1992-10-24|1993-01-15|COLLECT COD|FOB|refully express instructions. p +54471|947|48|3|20|36958.80|0.02|0.00|A|F|1992-11-20|1992-10-16|1992-12-14|NONE|AIR|refully final foxes. reg +54471|1390|5|4|45|58112.55|0.04|0.07|R|F|1992-12-11|1992-11-17|1992-12-29|NONE|MAIL| accounts l +54471|134|87|5|43|44467.59|0.09|0.06|R|F|1992-10-15|1992-12-01|1992-11-01|TAKE BACK RETURN|MAIL|gly ironic pinto beans. packages a +54496|1162|99|1|49|52094.84|0.05|0.03|N|O|1996-02-22|1996-02-16|1996-03-02|TAKE BACK RETURN|TRUCK|ut the blithely final account +54497|1837|67|1|38|66075.54|0.10|0.04|A|F|1993-01-22|1993-03-31|1993-02-21|TAKE BACK RETURN|MAIL|ld foxes? f +54497|12|88|2|19|17328.19|0.01|0.06|R|F|1993-01-22|1993-02-19|1993-02-06|NONE|SHIP|nding accounts behind the +54497|88|14|3|27|26678.16|0.07|0.03|A|F|1993-03-06|1993-03-17|1993-04-03|COLLECT COD|RAIL|l dinos haggle st +54498|1260|72|1|20|23225.20|0.07|0.06|N|O|1996-05-29|1996-04-21|1996-06-13|NONE|TRUCK|. bold accounts ought to use f +54498|1558|79|2|36|52543.80|0.08|0.04|N|O|1996-03-05|1996-04-12|1996-03-24|NONE|REG AIR| special ideas s +54498|300|1|3|24|28807.20|0.02|0.06|N|O|1996-04-28|1996-04-16|1996-05-21|DELIVER IN PERSON|REG AIR|ts. slyly ironic accounts acr +54498|566|27|4|10|14665.60|0.04|0.03|N|O|1996-05-08|1996-05-03|1996-05-25|NONE|MAIL|ely express foxes. d +54498|1379|94|5|12|15364.44|0.02|0.03|N|O|1996-05-19|1996-03-22|1996-06-03|COLLECT COD|TRUCK|s among the furiousl +54498|596|97|6|27|40407.93|0.08|0.00|N|O|1996-05-10|1996-04-03|1996-05-20|DELIVER IN PERSON|RAIL|ecial deposits haggle abou +54499|49|75|1|41|38910.64|0.02|0.07|A|F|1993-06-24|1993-05-14|1993-06-25|NONE|AIR|efully ironic foxes. carefully sile +54499|865|32|2|50|88293.00|0.05|0.02|A|F|1993-05-19|1993-06-04|1993-05-26|DELIVER IN PERSON|RAIL|blithely regular +54499|976|77|3|31|58186.07|0.04|0.07|R|F|1993-06-15|1993-05-11|1993-07-03|TAKE BACK RETURN|AIR|uriously even, even accounts. slyly +54500|1481|99|1|10|13824.80|0.08|0.05|N|O|1997-12-23|1997-12-04|1998-01-14|NONE|MAIL| foxes boost sly +54500|1510|11|2|17|23995.67|0.10|0.08|N|O|1997-12-12|1997-12-08|1997-12-22|COLLECT COD|SHIP|le carefully ab +54501|656|88|1|10|15566.50|0.04|0.00|A|F|1993-02-20|1993-01-22|1993-02-21|COLLECT COD|RAIL|eposits are blithely sl +54501|1244|82|2|4|4580.96|0.03|0.05|R|F|1993-03-05|1993-02-22|1993-03-23|COLLECT COD|AIR|e slyly carefu +54501|212|94|3|2|2224.42|0.01|0.06|A|F|1993-02-11|1993-01-11|1993-03-11|DELIVER IN PERSON|AIR|. ironic, pendi +54501|557|18|4|1|1457.55|0.08|0.00|R|F|1993-03-12|1993-01-30|1993-03-31|DELIVER IN PERSON|TRUCK| special packages impress blithely abou +54501|925|28|5|18|32866.56|0.03|0.08|A|F|1993-02-25|1993-01-24|1993-03-06|NONE|TRUCK|ly ironic instructions. slyly final pinto +54502|1458|59|1|19|25829.55|0.08|0.03|N|O|1995-11-12|1995-12-26|1995-11-27|DELIVER IN PERSON|SHIP| quickly af +54502|554|45|2|49|71272.95|0.02|0.01|N|O|1995-10-19|1995-12-01|1995-11-10|TAKE BACK RETURN|FOB|uickly about the packages. sly +54502|1226|1|3|26|29307.72|0.02|0.05|N|O|1995-10-24|1995-12-07|1995-11-01|DELIVER IN PERSON|RAIL|s accounts. carefully +54502|1433|34|4|33|44036.19|0.10|0.05|N|O|1995-11-15|1995-11-17|1995-12-07|COLLECT COD|TRUCK| wake furiously blithely daring +54502|1587|68|5|25|37214.50|0.10|0.03|N|O|1995-11-01|1995-12-11|1995-11-09|DELIVER IN PERSON|REG AIR|hely brave din +54503|101|28|1|14|14015.40|0.05|0.01|R|F|1994-09-01|1994-09-22|1994-09-17|COLLECT COD|TRUCK| above the carefully re +54503|261|89|2|33|38321.58|0.01|0.08|R|F|1994-10-03|1994-09-05|1994-10-21|COLLECT COD|SHIP|quests sleep fluf +54503|14|40|3|33|30162.33|0.02|0.02|A|F|1994-10-26|1994-10-05|1994-11-22|NONE|SHIP|ut the final +54503|1169|70|4|40|42806.40|0.09|0.01|A|F|1994-10-26|1994-09-13|1994-11-18|NONE|RAIL|ing to the instructions boost ca +54503|1243|18|5|3|3432.72|0.09|0.08|A|F|1994-09-16|1994-09-19|1994-09-18|COLLECT COD|TRUCK|cial deposits-- sly +54503|1803|4|6|29|49439.20|0.07|0.08|A|F|1994-10-06|1994-09-22|1994-10-16|COLLECT COD|TRUCK| pending grouche +54503|903|4|7|21|37881.90|0.08|0.07|R|F|1994-07-24|1994-10-02|1994-07-25|DELIVER IN PERSON|SHIP|onic pinto beans are express +54528|88|89|1|41|40511.28|0.10|0.01|A|F|1995-04-29|1995-03-22|1995-05-20|COLLECT COD|AIR| slow accounts about the furiou +54528|1244|19|2|30|34357.20|0.10|0.00|A|F|1995-04-12|1995-04-05|1995-04-21|NONE|AIR|arefully regular ac +54528|1374|13|3|20|25507.40|0.02|0.05|A|F|1995-02-22|1995-04-01|1995-03-04|COLLECT COD|RAIL|about the carefully unusual d +54528|1735|36|4|23|37644.79|0.08|0.02|R|F|1995-03-12|1995-02-24|1995-03-19|DELIVER IN PERSON|MAIL|mptotes detect about the carefully final +54528|1311|50|5|3|3636.93|0.04|0.08|A|F|1995-04-02|1995-03-13|1995-04-13|NONE|RAIL|he slyly careful +54528|1283|84|6|31|36712.68|0.03|0.07|R|F|1995-03-08|1995-04-02|1995-04-01|COLLECT COD|SHIP|. blithely regular id +54529|1258|33|1|40|46370.00|0.04|0.05|N|O|1997-08-01|1997-07-14|1997-08-22|NONE|FOB|ckages alo +54529|706|3|2|30|48201.00|0.09|0.08|N|O|1997-08-13|1997-08-27|1997-08-18|TAKE BACK RETURN|MAIL| regular accounts. regular, even +54529|897|64|3|39|70117.71|0.08|0.03|N|O|1997-08-04|1997-08-03|1997-08-12|COLLECT COD|SHIP|l accounts. furiously pending instructi +54529|140|19|4|33|34324.62|0.01|0.02|N|O|1997-07-29|1997-07-09|1997-08-02|DELIVER IN PERSON|SHIP|old accounts a +54530|1842|43|1|26|45339.84|0.00|0.08|A|F|1993-01-17|1992-12-11|1993-01-30|COLLECT COD|TRUCK|ins use across the +54531|885|86|1|33|58934.04|0.01|0.07|N|O|1996-05-20|1996-04-27|1996-05-26|NONE|SHIP|ithely ironic platelets. q +54531|1319|58|2|30|36609.30|0.06|0.00|N|O|1996-03-24|1996-04-01|1996-04-16|COLLECT COD|SHIP| haggle carefully. +54531|1589|70|3|3|4471.74|0.08|0.07|N|O|1996-04-29|1996-03-17|1996-05-18|COLLECT COD|AIR|dolphins eat blithely. quickly quiet p +54531|1549|70|4|21|30461.34|0.08|0.08|N|O|1996-05-19|1996-04-28|1996-06-15|DELIVER IN PERSON|RAIL| regular pa +54531|303|4|5|13|15642.90|0.07|0.06|N|O|1996-03-15|1996-04-30|1996-04-10|NONE|REG AIR|final patter +54531|1836|80|6|34|59086.22|0.07|0.02|N|O|1996-05-14|1996-03-23|1996-05-17|TAKE BACK RETURN|FOB|furiously thin f +54532|1594|95|1|7|10469.13|0.08|0.07|N|O|1998-02-26|1998-05-01|1998-03-15|NONE|MAIL|ously ironic pinto beans. fluffily +54532|717|82|2|3|4853.13|0.04|0.02|N|O|1998-05-22|1998-04-29|1998-06-12|NONE|RAIL|are above +54532|581|12|3|46|68152.68|0.09|0.03|N|O|1998-03-31|1998-04-16|1998-04-03|NONE|FOB| affix furiously even theod +54532|43|44|4|26|24519.04|0.10|0.06|N|O|1998-04-07|1998-03-25|1998-04-15|NONE|REG AIR|y bold requests c +54532|887|88|5|19|33969.72|0.07|0.00|N|O|1998-03-08|1998-04-23|1998-04-03|NONE|MAIL|ular, furious instructions +54532|982|83|6|10|18829.80|0.09|0.04|N|O|1998-03-22|1998-04-01|1998-04-02|COLLECT COD|AIR|y bold ideas wake carefully. furiously regu +54533|238|93|1|8|9105.84|0.05|0.03|N|O|1996-03-03|1996-02-25|1996-03-14|TAKE BACK RETURN|FOB|ully even theodolites about the silent +54533|1566|67|2|27|39624.12|0.03|0.01|N|O|1996-01-12|1996-02-04|1996-01-26|COLLECT COD|FOB|cajole according to the pending deposits +54533|843|77|3|41|71497.44|0.00|0.03|N|O|1996-02-14|1996-01-29|1996-03-02|DELIVER IN PERSON|FOB|quests. pending +54533|70|21|4|20|19401.40|0.00|0.06|N|O|1996-03-21|1996-02-06|1996-04-12|DELIVER IN PERSON|AIR| accounts among the f +54533|1860|47|5|11|19380.46|0.08|0.07|N|O|1995-12-30|1996-02-01|1996-01-04|NONE|AIR|ests. bold accounts are furiously i +54534|193|72|1|29|31702.51|0.06|0.06|A|F|1992-05-29|1992-04-30|1992-06-17|DELIVER IN PERSON|FOB|s. instruc +54535|9|10|1|8|7272.00|0.03|0.05|N|O|1996-04-20|1996-04-17|1996-04-21|NONE|TRUCK|ly ironic ideas wake. carefully express wa +54560|747|44|1|13|21420.62|0.03|0.06|R|F|1994-10-07|1994-10-14|1994-10-22|TAKE BACK RETURN|SHIP|ng deposits wake carefully +54560|973|8|2|44|82454.68|0.09|0.08|A|F|1994-08-07|1994-09-19|1994-08-15|COLLECT COD|RAIL|kages. idly final requests +54560|1008|9|3|16|14544.00|0.08|0.00|A|F|1994-11-11|1994-08-16|1994-11-17|DELIVER IN PERSON|FOB|yly around the carefully si +54560|157|84|4|3|3171.45|0.09|0.05|A|F|1994-11-09|1994-09-27|1994-11-17|TAKE BACK RETURN|AIR|en excuses +54561|1058|94|1|50|47952.50|0.08|0.07|N|O|1998-04-26|1998-07-01|1998-05-10|COLLECT COD|MAIL|s. slyly final cour +54561|1871|15|2|8|14182.96|0.02|0.02|N|O|1998-05-05|1998-06-17|1998-05-14|TAKE BACK RETURN|MAIL| the regular depe +54561|833|100|3|11|19072.13|0.03|0.05|N|O|1998-07-27|1998-06-06|1998-08-17|NONE|FOB|fully after the depos +54561|1750|35|4|46|75980.50|0.04|0.04|N|O|1998-05-31|1998-05-12|1998-06-20|NONE|AIR|e after the ironic excu +54562|1492|32|1|40|55739.60|0.08|0.00|N|O|1997-01-05|1996-12-09|1997-01-12|DELIVER IN PERSON|SHIP|uthlessly special theodolites wak +54562|614|8|2|38|57555.18|0.03|0.00|N|O|1996-12-09|1996-12-09|1996-12-28|DELIVER IN PERSON|SHIP|rate fluffily across the dogged foxe +54562|224|79|3|19|21360.18|0.08|0.03|N|O|1997-01-23|1997-01-17|1997-02-03|TAKE BACK RETURN|MAIL|o the furiously special platelets. gi +54562|689|90|4|8|12717.44|0.06|0.08|N|O|1997-02-19|1997-01-10|1997-03-04|DELIVER IN PERSON|FOB| slyly; silent accounts a +54563|1406|46|1|9|11766.60|0.10|0.03|A|F|1993-11-06|1993-11-28|1993-11-11|TAKE BACK RETURN|MAIL|to beans wake fluf +54563|201|56|2|49|53958.80|0.08|0.03|R|F|1994-01-25|1993-12-20|1994-01-28|NONE|MAIL|ages boost blithely sly +54563|461|91|3|50|68073.00|0.08|0.01|R|F|1993-11-13|1993-11-08|1993-12-05|COLLECT COD|FOB|blithely ironic dolphins. always pend +54563|1766|51|4|30|50032.80|0.04|0.00|R|F|1993-10-27|1993-12-24|1993-11-04|NONE|MAIL| carefully silent +54563|939|42|5|43|79116.99|0.07|0.02|A|F|1993-10-27|1993-12-20|1993-10-30|NONE|FOB|beans sublate ironic, bold sentiments. +54563|1656|98|6|45|70094.25|0.09|0.03|A|F|1994-02-02|1993-11-09|1994-02-24|TAKE BACK RETURN|FOB|long the furiously si +54563|1652|35|7|31|48163.15|0.09|0.01|A|F|1994-01-05|1993-12-25|1994-02-04|COLLECT COD|RAIL|egular acc +54564|1464|65|1|36|49156.56|0.03|0.07|A|F|1993-12-12|1994-01-27|1994-01-09|TAKE BACK RETURN|SHIP|. bold, express +54564|1810|40|2|32|54777.92|0.09|0.08|A|F|1993-12-21|1994-02-03|1994-01-06|NONE|SHIP|uffily regular ideas. slyly silent depos +54564|837|38|3|9|15640.47|0.00|0.00|R|F|1993-12-21|1994-02-27|1993-12-23|NONE|MAIL|e silent i +54565|817|84|1|19|32638.39|0.01|0.02|N|O|1996-08-24|1996-08-19|1996-08-31|DELIVER IN PERSON|TRUCK|use bold account +54565|1382|21|2|43|55185.34|0.04|0.01|N|O|1996-07-17|1996-09-01|1996-07-27|TAKE BACK RETURN|RAIL|xes. carefully even deposits are furiou +54565|881|81|3|34|60583.92|0.08|0.08|N|O|1996-09-12|1996-08-26|1996-09-21|NONE|AIR|ts do haggle always bold theodolit +54566|1222|23|1|50|56161.00|0.06|0.07|N|O|1996-09-12|1996-09-30|1996-09-24|NONE|AIR| are furiously quickly +54566|1855|99|2|50|87842.50|0.09|0.02|N|O|1996-09-07|1996-09-28|1996-09-19|COLLECT COD|RAIL| theodolites. fluffily regular +54566|542|43|3|19|27408.26|0.07|0.08|N|O|1996-09-08|1996-10-18|1996-10-03|DELIVER IN PERSON|FOB|sts are furiously. fluffily ironic court +54567|1720|47|1|29|47029.88|0.07|0.06|R|F|1994-09-27|1994-09-02|1994-10-01|NONE|RAIL| even requests sleep fluffily slyly ir +54567|1731|16|2|24|39185.52|0.09|0.04|R|F|1994-09-16|1994-10-05|1994-09-24|DELIVER IN PERSON|SHIP|refully expre +54567|1581|82|3|30|44477.40|0.02|0.07|A|F|1994-10-18|1994-10-06|1994-10-21|COLLECT COD|TRUCK|ns solve according +54592|1805|35|1|49|83633.20|0.10|0.07|N|O|1995-07-28|1995-07-18|1995-07-29|DELIVER IN PERSON|REG AIR|nto beans. furiously ironic deposits boo +54592|1|77|2|24|21624.00|0.03|0.03|N|O|1995-06-23|1995-08-31|1995-07-02|NONE|TRUCK|regular deposits sleep furiously unusua +54592|123|24|3|20|20462.40|0.06|0.07|N|O|1995-09-29|1995-08-28|1995-09-30|NONE|AIR|furious dependenc +54592|678|10|4|6|9472.02|0.07|0.01|N|O|1995-09-02|1995-08-08|1995-09-27|TAKE BACK RETURN|MAIL|ions. pending deposits use accord +54592|1989|34|5|13|24582.74|0.08|0.05|N|O|1995-08-23|1995-08-20|1995-09-01|DELIVER IN PERSON|MAIL|. carefully express +54592|518|49|6|24|34044.24|0.05|0.04|N|O|1995-09-11|1995-07-29|1995-10-11|TAKE BACK RETURN|RAIL|e ironic, ironic packages. furiously bold +54592|1376|15|7|29|37043.73|0.07|0.03|N|O|1995-08-24|1995-09-04|1995-09-20|DELIVER IN PERSON|REG AIR|ronic, special deposits. regular, regular +54593|431|32|1|15|19971.45|0.01|0.07|A|F|1992-10-19|1992-11-09|1992-11-16|TAKE BACK RETURN|TRUCK|ly unusual requests +54593|1229|4|2|44|49729.68|0.05|0.02|R|F|1992-09-07|1992-10-25|1992-09-30|COLLECT COD|RAIL| carefully carefully s +54593|1486|87|3|37|51336.76|0.01|0.07|A|F|1992-10-05|1992-10-29|1992-10-15|DELIVER IN PERSON|RAIL|timents nag furiously ab +54593|585|16|4|46|68336.68|0.08|0.02|R|F|1992-11-07|1992-10-17|1992-11-16|NONE|FOB| express foxes. re +54593|926|27|5|16|29230.72|0.09|0.03|R|F|1992-10-31|1992-11-14|1992-11-02|COLLECT COD|REG AIR|al deposits nag quickly above the flu +54594|1998|87|1|29|55099.71|0.07|0.01|N|O|1996-09-05|1996-08-12|1996-09-06|DELIVER IN PERSON|MAIL|deposits wake blithely +54595|1492|10|1|24|33443.76|0.09|0.04|R|F|1994-08-12|1994-07-13|1994-09-08|DELIVER IN PERSON|MAIL|ggle despite the bold packages. fin +54595|411|41|2|47|61636.27|0.01|0.04|R|F|1994-07-13|1994-07-18|1994-07-17|TAKE BACK RETURN|AIR|fully quickly bold id +54595|593|84|3|36|53769.24|0.08|0.01|R|F|1994-08-03|1994-06-29|1994-08-21|NONE|AIR| ironic foxes haggle fur +54595|627|21|4|19|29024.78|0.09|0.02|A|F|1994-05-24|1994-06-08|1994-05-26|NONE|AIR|lly ironic requests. +54595|343|100|5|49|60923.66|0.10|0.02|A|F|1994-07-27|1994-06-26|1994-08-18|DELIVER IN PERSON|SHIP|accounts n +54596|213|41|1|47|52320.87|0.05|0.02|N|O|1997-07-14|1997-08-06|1997-08-06|COLLECT COD|TRUCK|asymptotes. ironic t +54596|750|83|2|14|23110.50|0.09|0.02|N|O|1997-08-08|1997-07-15|1997-08-15|TAKE BACK RETURN|REG AIR|es. carefully final accounts along the slyl +54597|1130|31|1|22|22684.86|0.01|0.06|N|O|1996-07-09|1996-06-13|1996-07-11|COLLECT COD|MAIL| across the carefully +54597|100|51|2|48|48004.80|0.02|0.08|N|O|1996-06-02|1996-05-24|1996-06-30|NONE|RAIL|ss the fluffil +54597|160|61|3|31|32864.96|0.03|0.08|N|O|1996-04-22|1996-07-08|1996-05-06|DELIVER IN PERSON|RAIL|riously ir +54598|1275|76|1|27|31759.29|0.04|0.02|N|O|1996-08-02|1996-06-05|1996-08-08|TAKE BACK RETURN|REG AIR|ptotes sleep carefully across the f +54598|626|27|2|1|1526.62|0.10|0.06|N|O|1996-05-13|1996-07-08|1996-05-15|TAKE BACK RETURN|REG AIR|yly agains +54598|1415|16|3|36|47390.76|0.09|0.06|N|O|1996-06-12|1996-07-12|1996-06-23|DELIVER IN PERSON|AIR|fully regu +54598|1798|41|4|27|45894.33|0.03|0.01|N|O|1996-09-02|1996-07-06|1996-09-25|NONE|RAIL|quests sleep carefully across +54598|1626|50|5|8|12220.96|0.03|0.00|N|O|1996-07-12|1996-06-25|1996-07-26|TAKE BACK RETURN|MAIL|e regular deposits ha +54599|1887|74|1|6|10733.28|0.00|0.06|N|O|1997-10-27|1998-01-23|1997-11-26|COLLECT COD|TRUCK|r, bold instructions-- carefully final +54624|1500|40|1|11|15416.50|0.02|0.03|N|O|1998-04-25|1998-05-12|1998-05-25|DELIVER IN PERSON|FOB| foxes. bold, expr +54624|411|12|2|7|9179.87|0.09|0.08|N|O|1998-07-16|1998-05-30|1998-07-21|DELIVER IN PERSON|REG AIR|ts alongside of the de +54624|1733|60|3|19|31059.87|0.04|0.04|N|O|1998-04-18|1998-05-06|1998-05-14|DELIVER IN PERSON|TRUCK|al requests use upon the careful +54625|1872|73|1|36|63859.32|0.03|0.06|A|F|1993-08-01|1993-06-17|1993-08-02|TAKE BACK RETURN|AIR|hless instructions cajol +54625|326|11|2|25|30658.00|0.04|0.06|R|F|1993-07-10|1993-06-24|1993-07-19|NONE|FOB|ounts. unusual accounts across the final, +54625|238|66|3|10|11382.30|0.05|0.03|R|F|1993-08-30|1993-07-26|1993-09-28|NONE|FOB|ven ideas. slyly regular instructions im +54625|567|58|4|43|63105.08|0.09|0.06|A|F|1993-06-16|1993-08-12|1993-07-14|NONE|MAIL|uriously even foxes. regular, exp +54626|635|29|1|31|47604.53|0.00|0.06|N|O|1997-05-04|1997-07-04|1997-05-14|NONE|SHIP|even requests nag courts. quickly ironic id +54626|1027|28|2|1|928.02|0.10|0.03|N|O|1997-04-16|1997-06-25|1997-04-28|DELIVER IN PERSON|TRUCK|the regular platelets de +54626|806|40|3|5|8534.00|0.07|0.05|N|O|1997-06-09|1997-05-20|1997-07-02|COLLECT COD|TRUCK|use regular, final excuses. +54626|1631|55|4|17|26054.71|0.07|0.05|N|O|1997-04-15|1997-05-08|1997-05-05|TAKE BACK RETURN|AIR|ounts. regular, pending instructio +54626|655|56|5|16|24890.40|0.01|0.05|N|O|1997-04-12|1997-06-12|1997-05-01|COLLECT COD|FOB| beans cajole. slyly even deposits eat s +54626|292|20|6|21|25038.09|0.05|0.06|N|O|1997-05-05|1997-06-13|1997-06-01|COLLECT COD|FOB| even deposits integrate carefully blith +54626|219|1|7|25|27980.25|0.01|0.07|N|O|1997-06-09|1997-05-15|1997-07-01|DELIVER IN PERSON|REG AIR|leep quickly. close, silent foxes integra +54627|646|47|1|24|37119.36|0.09|0.04|N|O|1998-05-30|1998-06-28|1998-06-21|COLLECT COD|SHIP|. daringly even accounts nag. s +54627|341|26|2|31|38481.54|0.09|0.04|N|O|1998-05-15|1998-07-05|1998-06-01|TAKE BACK RETURN|FOB| nag daringly. regula +54628|241|96|1|7|7988.68|0.01|0.05|A|F|1993-06-10|1993-08-05|1993-06-12|COLLECT COD|REG AIR|its. fluffily final accounts cajole blith +54628|1009|80|2|44|40040.00|0.08|0.03|A|F|1993-08-10|1993-08-02|1993-08-26|NONE|AIR|c accounts behind the furiously +54628|981|84|3|14|26347.72|0.04|0.06|A|F|1993-08-07|1993-07-30|1993-08-22|TAKE BACK RETURN|FOB| according to the slyly pending deposits +54629|322|51|1|41|50115.12|0.02|0.06|N|O|1996-12-19|1996-11-01|1997-01-05|TAKE BACK RETURN|FOB|s asymptotes haggle furiously after the req +54630|206|88|1|44|48672.80|0.10|0.07|A|F|1992-10-05|1992-10-29|1992-10-22|DELIVER IN PERSON|TRUCK|pendencies cajole. blithely +54630|494|24|2|11|15339.39|0.01|0.04|A|F|1992-10-31|1992-09-24|1992-11-23|TAKE BACK RETURN|REG AIR|accounts. slyly unusual theodolites +54630|465|66|3|33|45060.18|0.05|0.03|A|F|1992-09-18|1992-10-16|1992-10-04|NONE|AIR|pendencies haggle after the blit +54630|1113|22|4|23|23324.53|0.10|0.06|A|F|1992-08-29|1992-10-09|1992-09-28|COLLECT COD|AIR|ing to the quickly even multipliers wake +54630|2|53|5|4|3608.00|0.09|0.08|R|F|1992-11-06|1992-09-18|1992-12-04|COLLECT COD|SHIP|pendencies thrash. qu +54630|330|59|6|29|35679.57|0.09|0.00|R|F|1992-09-20|1992-10-28|1992-09-25|COLLECT COD|SHIP|ang. final ideas pr +54631|817|84|1|44|75583.64|0.00|0.06|N|O|1998-07-26|1998-09-03|1998-07-29|TAKE BACK RETURN|RAIL|bove the quietl +54631|1774|17|2|25|41894.25|0.04|0.08|N|O|1998-09-19|1998-08-12|1998-09-22|COLLECT COD|SHIP|nusual excuses ab +54631|1941|30|3|5|9214.70|0.10|0.06|N|O|1998-07-19|1998-08-12|1998-08-14|DELIVER IN PERSON|SHIP|regular, ironic ideas +54631|973|76|4|26|48723.22|0.09|0.00|N|O|1998-11-07|1998-09-03|1998-12-06|DELIVER IN PERSON|SHIP|uctions believe across the furiously e +54631|96|47|5|21|20917.89|0.01|0.03|N|O|1998-11-05|1998-08-10|1998-11-25|COLLECT COD|AIR| quickly ironic r +54656|1250|62|1|5|5756.25|0.06|0.02|R|F|1993-01-03|1992-12-29|1993-01-07|DELIVER IN PERSON|MAIL|slyly final, dogged pearls. furiously reg +54656|368|97|2|43|54539.48|0.01|0.08|A|F|1992-12-18|1992-12-24|1993-01-09|TAKE BACK RETURN|REG AIR| instructions. final +54656|1306|45|3|4|4829.20|0.05|0.02|R|F|1993-01-26|1993-01-08|1993-02-12|COLLECT COD|MAIL| ironic excuse +54656|1668|69|4|26|40811.16|0.09|0.02|R|F|1993-03-15|1993-01-04|1993-03-29|NONE|RAIL|n theodoli +54657|551|12|1|1|1451.55|0.10|0.08|R|F|1992-08-09|1992-08-26|1992-08-20|NONE|TRUCK|ests are ruthlessly according to the eve +54657|797|94|2|13|22071.27|0.01|0.07|R|F|1992-10-11|1992-08-12|1992-10-14|NONE|SHIP|ets. quickly ironic instru +54657|1439|40|3|11|14744.73|0.10|0.01|A|F|1992-09-26|1992-08-16|1992-10-07|NONE|MAIL| instructions u +54657|1857|1|4|36|63318.60|0.08|0.07|R|F|1992-07-23|1992-08-28|1992-08-13|TAKE BACK RETURN|REG AIR|cial ideas. frets after the blithe +54658|409|97|1|46|60232.40|0.07|0.05|N|O|1998-05-26|1998-05-16|1998-06-19|DELIVER IN PERSON|TRUCK|nstructions. +54658|244|72|2|38|43481.12|0.03|0.06|N|O|1998-06-07|1998-04-26|1998-06-09|NONE|RAIL|e silently final packages wake furiously +54659|136|89|1|33|34192.29|0.00|0.02|N|O|1995-11-11|1995-10-05|1995-11-29|NONE|AIR|y regular requests. sl +54659|1588|89|2|43|64051.94|0.10|0.05|N|O|1995-10-26|1995-10-26|1995-11-23|TAKE BACK RETURN|MAIL| final pinto +54660|1070|71|1|16|15537.12|0.02|0.07|R|F|1994-07-01|1994-06-13|1994-07-15|NONE|REG AIR|ns. special deposits grow: quic +54660|1163|36|2|18|19154.88|0.06|0.06|R|F|1994-04-09|1994-06-01|1994-04-28|DELIVER IN PERSON|SHIP|deposits are furi +54660|1682|65|3|5|7918.40|0.06|0.02|R|F|1994-05-06|1994-05-30|1994-05-12|TAKE BACK RETURN|SHIP| furiously express packages. pen +54660|288|43|4|2|2376.56|0.05|0.06|A|F|1994-07-16|1994-05-05|1994-07-19|TAKE BACK RETURN|MAIL|lithely. requests among +54660|1090|96|5|19|18830.71|0.00|0.02|R|F|1994-07-04|1994-06-17|1994-07-08|COLLECT COD|FOB|. regular, unusual +54660|1297|72|6|6|7189.74|0.01|0.03|R|F|1994-06-08|1994-05-01|1994-06-30|DELIVER IN PERSON|SHIP|the final accounts. quickly pending +54661|1236|48|1|46|52312.58|0.04|0.05|N|O|1998-08-05|1998-08-30|1998-08-16|TAKE BACK RETURN|FOB|are enticingly. slyly i +54661|1748|75|2|19|31345.06|0.01|0.07|N|O|1998-10-08|1998-09-06|1998-10-25|COLLECT COD|MAIL|usual requests +54661|1287|99|3|39|46342.92|0.00|0.01|N|O|1998-08-08|1998-10-16|1998-08-13|COLLECT COD|SHIP|ly regular platelets sleep furiously reg +54661|1305|82|4|47|56696.10|0.04|0.01|N|O|1998-10-18|1998-09-17|1998-11-14|NONE|SHIP|f the packages. fl +54661|1480|81|5|19|26248.12|0.06|0.00|N|O|1998-08-13|1998-09-26|1998-09-06|COLLECT COD|TRUCK|des the quickly express +54661|1994|39|6|28|53087.72|0.08|0.02|N|O|1998-08-30|1998-10-13|1998-09-11|NONE|FOB|ilent accounts wake against the regular +54661|746|47|7|14|23054.36|0.10|0.00|N|O|1998-08-18|1998-09-13|1998-09-12|TAKE BACK RETURN|AIR|hy theodolites detect fluffily among +54662|865|99|1|20|35317.20|0.01|0.08|N|O|1997-03-26|1997-04-13|1997-04-03|TAKE BACK RETURN|AIR|nal, special +54662|1739|40|2|3|4922.19|0.10|0.00|N|O|1997-04-04|1997-05-17|1997-04-26|COLLECT COD|RAIL|xpress ideas along the bold req +54662|1029|100|3|43|39990.86|0.03|0.01|N|O|1997-04-25|1997-04-17|1997-05-25|NONE|SHIP|furiously above the furiously ironic +54662|293|94|4|35|41765.15|0.09|0.08|N|O|1997-04-17|1997-05-05|1997-05-02|COLLECT COD|MAIL|deas. deposits boost pending pains. i +54662|1687|88|5|38|60369.84|0.01|0.04|N|O|1997-03-05|1997-05-12|1997-04-01|NONE|RAIL|usly express de +54663|1975|64|1|6|11261.82|0.00|0.00|N|O|1996-05-06|1996-06-03|1996-06-05|NONE|SHIP|c, unusual packages wake +54663|1060|61|2|36|34598.16|0.06|0.06|N|O|1996-07-03|1996-06-09|1996-07-12|TAKE BACK RETURN|TRUCK|s packages wake. furiously ironic pint +54663|1939|40|3|38|69955.34|0.07|0.06|N|O|1996-06-17|1996-05-24|1996-06-30|TAKE BACK RETURN|MAIL|deposits about the bold accounts +54688|836|70|1|6|10420.98|0.08|0.01|N|O|1997-02-13|1996-11-20|1997-02-28|COLLECT COD|MAIL|ly ironic deposits kindle slyly spe +54688|342|27|2|14|17392.76|0.09|0.07|N|O|1997-01-19|1996-11-29|1997-02-06|TAKE BACK RETURN|RAIL|slyly above the bli +54689|1655|56|1|29|45142.85|0.10|0.05|A|F|1993-11-15|1993-11-04|1993-12-02|DELIVER IN PERSON|REG AIR|olites are furiously among the carefully +54690|1221|96|1|3|3366.66|0.09|0.02|A|F|1992-03-27|1992-04-23|1992-04-10|TAKE BACK RETURN|RAIL| boost quickl +54690|40|91|2|28|26321.12|0.08|0.03|R|F|1992-03-14|1992-03-28|1992-03-24|DELIVER IN PERSON|MAIL|ly unusual accounts cajole against +54690|691|23|3|36|57300.84|0.05|0.02|R|F|1992-06-20|1992-04-09|1992-07-06|DELIVER IN PERSON|RAIL| blithely above the stealthy foxes. +54690|135|62|4|5|5175.65|0.02|0.01|R|F|1992-05-29|1992-05-06|1992-06-13|DELIVER IN PERSON|RAIL|the blithely express accounts. sl +54690|206|61|5|32|35398.40|0.01|0.04|R|F|1992-03-02|1992-04-05|1992-03-13|NONE|TRUCK|ily. furiously unusual pinto +54690|1847|91|6|25|43721.00|0.09|0.03|R|F|1992-04-03|1992-04-21|1992-04-11|DELIVER IN PERSON|REG AIR|to the blithely unusual packages. blithely +54690|867|67|7|43|76017.98|0.07|0.08|R|F|1992-03-11|1992-04-30|1992-04-02|TAKE BACK RETURN|SHIP|ss the express, ironic packag +54691|333|90|1|22|27133.26|0.10|0.04|N|O|1997-07-18|1997-07-08|1997-08-17|NONE|SHIP|, special ideas use. bli +54691|569|100|2|17|24982.52|0.04|0.01|N|O|1997-08-10|1997-06-23|1997-08-11|NONE|REG AIR|cies. regularly even requests about +54692|605|6|1|6|9033.60|0.04|0.02|A|F|1993-04-07|1993-05-01|1993-04-23|TAKE BACK RETURN|AIR|sly regular dolphins cajole about the f +54692|1649|32|2|49|75981.36|0.03|0.00|A|F|1993-06-25|1993-05-25|1993-07-14|NONE|AIR|engage slyly final platelet +54692|32|83|3|13|12116.39|0.00|0.08|R|F|1993-06-29|1993-04-16|1993-07-12|DELIVER IN PERSON|MAIL|pecial depende +54692|1435|53|4|35|46775.05|0.03|0.04|A|F|1993-03-11|1993-05-20|1993-03-19|DELIVER IN PERSON|TRUCK|ly platelets. +54692|1865|52|5|24|42404.64|0.02|0.05|R|F|1993-05-01|1993-04-05|1993-05-28|DELIVER IN PERSON|TRUCK|efully regular instructions +54692|1764|65|6|2|3331.52|0.02|0.07|R|F|1993-04-15|1993-05-20|1993-04-27|COLLECT COD|RAIL|even deposits a +54693|1172|9|1|25|26829.25|0.08|0.08|N|O|1998-01-27|1997-12-23|1998-02-24|NONE|FOB|e about the +54693|1114|51|2|35|35528.85|0.08|0.07|N|O|1997-12-29|1997-12-19|1998-01-23|COLLECT COD|RAIL|le fluffily according +54693|678|41|3|24|37888.08|0.07|0.08|N|O|1997-11-13|1997-12-22|1997-11-18|COLLECT COD|REG AIR|ests integra +54693|1708|35|4|48|77265.60|0.07|0.00|N|O|1998-01-12|1997-12-08|1998-02-01|NONE|REG AIR|ag blithely final depths. +54693|1335|50|5|7|8654.31|0.05|0.02|N|O|1997-10-31|1997-12-31|1997-11-29|DELIVER IN PERSON|MAIL|inst the packages believe ab +54693|1032|38|6|12|11196.36|0.00|0.03|N|O|1998-01-14|1997-12-26|1998-02-07|TAKE BACK RETURN|MAIL|fily special deposits need +54693|519|80|7|41|58199.91|0.04|0.04|N|O|1998-01-28|1997-12-02|1998-01-29|DELIVER IN PERSON|REG AIR| slyly ironic accounts run slyly caref +54694|1281|19|1|28|33103.84|0.01|0.08|A|F|1995-01-08|1994-11-02|1995-02-07|TAKE BACK RETURN|SHIP|ep accounts. carefully final depende +54694|539|100|2|44|63339.32|0.06|0.04|A|F|1994-10-10|1994-11-27|1994-10-31|NONE|RAIL|hely ironic packages +54694|1003|74|3|47|42488.00|0.00|0.08|R|F|1994-11-11|1994-11-30|1994-12-11|TAKE BACK RETURN|FOB|t the quickly express deposits. ca +54694|1464|4|4|47|64176.62|0.05|0.06|R|F|1995-01-10|1994-11-28|1995-01-13|COLLECT COD|TRUCK|. regular packages use blithely furiou +54695|1709|10|1|1|1610.70|0.10|0.07|N|O|1997-10-26|1997-10-12|1997-11-08|NONE|FOB|osits. carefully silent or +54695|1795|96|2|19|32239.01|0.04|0.05|N|O|1997-07-22|1997-10-17|1997-08-08|DELIVER IN PERSON|TRUCK|egular platelets nag blithel +54695|1400|15|3|25|32535.00|0.08|0.08|N|O|1997-11-10|1997-10-17|1997-12-06|NONE|AIR|nding platelets. dogg +54695|371|28|4|43|54668.91|0.00|0.00|N|O|1997-08-18|1997-09-06|1997-09-14|NONE|TRUCK|riously about the fluffily reg +54695|968|69|5|33|61675.68|0.10|0.03|N|O|1997-09-20|1997-10-06|1997-10-05|COLLECT COD|RAIL|are among the final i +54695|1029|65|6|31|28830.62|0.04|0.08|N|O|1997-10-13|1997-09-07|1997-10-27|TAKE BACK RETURN|MAIL| theodolites. +54720|1999|44|1|19|36118.81|0.02|0.05|N|O|1996-06-09|1996-03-27|1996-06-23|DELIVER IN PERSON|REG AIR|t accounts. furiously bo +54720|360|61|2|32|40331.52|0.07|0.02|N|O|1996-04-05|1996-04-27|1996-04-09|COLLECT COD|REG AIR|y final ac +54721|278|60|1|39|45952.53|0.05|0.04|A|F|1993-01-18|1992-12-22|1993-01-22|DELIVER IN PERSON|AIR|c accounts. carefully final +54721|1602|44|2|29|43604.40|0.00|0.03|A|F|1992-11-12|1993-01-14|1992-12-11|COLLECT COD|TRUCK|tructions +54721|687|50|3|24|38104.32|0.02|0.03|A|F|1992-12-06|1993-01-01|1993-01-02|NONE|AIR|e carefully alongside of the f +54721|330|87|4|32|39370.56|0.03|0.05|A|F|1993-01-08|1993-01-09|1993-01-27|TAKE BACK RETURN|AIR|ts sleep r +54721|1758|1|5|36|59751.00|0.03|0.05|R|F|1992-11-17|1992-11-19|1992-12-07|COLLECT COD|AIR|es. blithely express courts affix fur +54722|775|72|1|18|30163.86|0.06|0.07|A|F|1993-05-05|1993-03-03|1993-05-13|DELIVER IN PERSON|FOB| haggle fluffily across the slyly +54722|1423|2|2|36|47679.12|0.07|0.00|R|F|1993-01-31|1993-02-22|1993-02-17|DELIVER IN PERSON|MAIL|furiously bold plate +54722|943|78|3|21|38722.74|0.07|0.06|R|F|1993-05-05|1993-04-05|1993-05-19|TAKE BACK RETURN|REG AIR|sits haggle fluffily? quick +54722|1496|14|4|36|50309.64|0.09|0.08|R|F|1993-02-02|1993-03-26|1993-02-05|NONE|SHIP| bold foxes. regular, final +54722|1045|81|5|43|40679.72|0.07|0.02|R|F|1993-03-30|1993-02-23|1993-04-11|COLLECT COD|TRUCK|l foxes. blith +54722|1077|48|6|8|7824.56|0.07|0.07|A|F|1993-05-08|1993-03-03|1993-05-11|COLLECT COD|MAIL|its. packages along the quick +54723|244|26|1|41|46913.84|0.00|0.04|A|F|1994-04-28|1994-03-14|1994-05-14|DELIVER IN PERSON|FOB|riously ironic pint +54723|46|72|2|31|29327.24|0.07|0.05|R|F|1994-02-08|1994-03-19|1994-02-24|NONE|RAIL|ly regular foxes haggle furiousl +54723|210|65|3|49|54400.29|0.08|0.02|A|F|1994-01-23|1994-03-09|1994-02-08|TAKE BACK RETURN|RAIL|o the final +54723|386|43|4|37|47596.06|0.03|0.07|A|F|1994-04-27|1994-03-05|1994-05-07|COLLECT COD|SHIP|s hang blithely ironic, final ins +54723|444|3|5|21|28233.24|0.04|0.06|A|F|1994-05-13|1994-02-15|1994-05-28|NONE|MAIL|t regular, quick pinto beans. slyly expre +54723|988|91|6|5|9444.90|0.10|0.08|R|F|1994-01-25|1994-02-20|1994-02-03|TAKE BACK RETURN|AIR|furiously expr +54724|1411|90|1|14|18373.74|0.07|0.05|A|F|1992-07-03|1992-08-01|1992-07-06|DELIVER IN PERSON|SHIP|ly special foxes. blithely regular foxes +54725|1883|70|1|5|8924.40|0.01|0.03|N|O|1998-06-19|1998-07-24|1998-06-24|TAKE BACK RETURN|RAIL|ccounts. court +54725|928|97|2|38|69498.96|0.02|0.05|N|O|1998-06-28|1998-07-27|1998-07-25|DELIVER IN PERSON|RAIL|ully express +54725|1584|5|3|26|38625.08|0.02|0.01|N|O|1998-09-01|1998-06-09|1998-09-20|COLLECT COD|AIR| sleep from the regular accounts! furiousl +54725|388|17|4|25|32209.50|0.10|0.01|N|O|1998-07-25|1998-07-27|1998-08-17|TAKE BACK RETURN|MAIL|carefully against the s +54725|1662|45|5|38|59419.08|0.03|0.07|N|O|1998-05-28|1998-06-04|1998-06-14|DELIVER IN PERSON|MAIL|lthily regular asympto +54725|1120|29|6|49|50034.88|0.00|0.07|N|O|1998-06-13|1998-07-28|1998-06-29|COLLECT COD|REG AIR|accounts haggle excep +54725|1981|14|7|43|80968.14|0.03|0.05|N|O|1998-06-22|1998-07-01|1998-07-20|TAKE BACK RETURN|REG AIR|furious pin +54726|429|30|1|38|50517.96|0.08|0.07|R|F|1992-12-20|1992-11-24|1992-12-28|TAKE BACK RETURN|AIR|posits. special f +54726|398|55|2|25|32459.75|0.09|0.07|R|F|1992-11-15|1992-10-15|1992-12-15|TAKE BACK RETURN|REG AIR| the carefully +54726|1114|15|3|3|3045.33|0.01|0.03|R|F|1992-09-20|1992-11-08|1992-09-22|DELIVER IN PERSON|MAIL|fully special theodolites. ir +54726|278|33|4|35|41239.45|0.10|0.02|R|F|1992-09-29|1992-11-22|1992-10-06|DELIVER IN PERSON|TRUCK|. quickly regular requests use car +54726|390|91|5|23|29678.97|0.03|0.00|R|F|1992-09-25|1992-10-25|1992-10-17|NONE|SHIP|gular Tiresias above the regular, slow pac +54726|1414|54|6|12|15784.92|0.05|0.05|R|F|1992-12-07|1992-11-07|1993-01-05|DELIVER IN PERSON|MAIL|refully. even deposits boost quickly s +54726|928|31|7|41|74985.72|0.05|0.06|A|F|1993-01-10|1992-10-17|1993-01-22|DELIVER IN PERSON|RAIL|lites wake +54727|1179|16|1|25|27004.25|0.05|0.05|A|F|1994-01-16|1994-03-12|1994-01-26|NONE|MAIL|ronically. final, unusual requests pr +54727|904|7|2|21|37902.90|0.07|0.02|R|F|1994-01-28|1994-01-19|1994-02-13|NONE|SHIP|e blithely carefully daring deposits. furio +54727|653|54|3|21|32626.65|0.07|0.04|A|F|1994-03-10|1994-03-07|1994-03-22|COLLECT COD|RAIL| deposits. slyly regula +54752|1606|48|1|40|60304.00|0.01|0.08|N|O|1996-12-08|1996-11-07|1996-12-15|DELIVER IN PERSON|RAIL|le furiously about the carefully +54752|1042|48|2|24|22632.96|0.02|0.05|N|O|1996-11-23|1996-09-29|1996-12-08|NONE|FOB| across the blithely final excuses. +54752|1229|30|3|40|45208.80|0.08|0.02|N|O|1996-08-25|1996-11-10|1996-09-01|TAKE BACK RETURN|RAIL|ess, unusual packages haggle aroun +54752|1618|19|4|8|12156.88|0.01|0.04|N|O|1996-09-12|1996-10-23|1996-09-13|COLLECT COD|FOB|lyly regular accounts among the iro +54753|1261|62|1|19|22082.94|0.05|0.08|A|F|1994-07-23|1994-06-17|1994-08-18|DELIVER IN PERSON|REG AIR|gouts: blithely ironic pinto beans affix +54753|494|24|2|26|36256.74|0.03|0.05|A|F|1994-05-25|1994-07-09|1994-06-17|NONE|FOB|g the even braids. accounts u +54753|1662|63|3|29|45346.14|0.10|0.00|R|F|1994-06-08|1994-05-24|1994-06-10|DELIVER IN PERSON|MAIL|gainst the +54753|800|65|4|33|56126.40|0.10|0.06|R|F|1994-07-03|1994-06-05|1994-07-16|DELIVER IN PERSON|SHIP|ounts. ironic ideas +54754|1815|45|1|33|56654.73|0.06|0.00|N|O|1996-10-08|1996-11-29|1996-10-17|NONE|SHIP|ently final packages. b +54754|1056|27|2|50|47852.50|0.10|0.08|N|O|1996-12-07|1996-11-21|1996-12-08|TAKE BACK RETURN|AIR|uests cajole quickly along +54754|1650|74|3|13|20171.45|0.02|0.01|N|O|1996-10-24|1996-12-08|1996-11-02|NONE|TRUCK| accounts. carefully ironic deposi +54755|1670|53|1|4|6286.68|0.00|0.07|R|F|1994-12-21|1995-03-08|1994-12-30|TAKE BACK RETURN|FOB|sleep quickly above the q +54755|1433|34|2|17|22685.31|0.08|0.01|R|F|1995-01-02|1995-01-15|1995-01-31|COLLECT COD|SHIP|uriously unusual ideas impress +54755|1111|12|3|32|32387.52|0.07|0.08|A|F|1995-01-23|1995-01-18|1995-02-07|NONE|MAIL| requests. regularly regular fo +54755|831|31|4|48|83127.84|0.09|0.02|A|F|1995-03-09|1995-01-12|1995-03-27|DELIVER IN PERSON|REG AIR|riously about the slyly silent a +54755|930|99|5|5|9154.65|0.07|0.06|A|F|1995-02-07|1995-01-18|1995-02-26|TAKE BACK RETURN|REG AIR|dolites use +54755|1982|83|6|33|62171.34|0.10|0.06|R|F|1995-02-06|1995-02-22|1995-03-05|TAKE BACK RETURN|REG AIR|gle carefully +54756|1661|3|1|48|75007.68|0.06|0.01|N|O|1996-08-26|1996-08-12|1996-09-18|DELIVER IN PERSON|SHIP|t above the stealthily special +54756|1051|22|2|46|43794.30|0.00|0.08|N|O|1996-09-07|1996-09-14|1996-09-09|NONE|TRUCK|l deposits. pending depo +54756|1691|15|3|7|11148.83|0.00|0.08|N|O|1996-10-11|1996-08-22|1996-10-20|DELIVER IN PERSON|FOB|quickly bold accounts use +54756|1709|10|4|14|22549.80|0.10|0.03|N|O|1996-08-26|1996-09-13|1996-08-31|NONE|AIR|ven packages. +54756|1409|10|5|39|51105.60|0.03|0.00|N|O|1996-08-19|1996-08-03|1996-08-24|COLLECT COD|MAIL|excuses poach quickly abov +54757|697|60|1|38|60712.22|0.08|0.08|A|F|1993-04-01|1993-01-03|1993-04-16|NONE|RAIL|refully pending instruct +54757|646|9|2|13|20106.32|0.08|0.02|A|F|1992-12-20|1993-02-11|1993-01-17|COLLECT COD|FOB|in. furiously regular deposits eat carefull +54758|831|32|1|11|19050.13|0.01|0.02|R|F|1995-02-04|1995-01-18|1995-03-05|COLLECT COD|AIR|arefully across the bold excuses. ironic +54759|17|68|1|6|5502.06|0.00|0.06|R|F|1994-06-09|1994-07-10|1994-06-24|DELIVER IN PERSON|TRUCK|special, bold package +54759|318|47|2|30|36549.30|0.00|0.08|A|F|1994-07-28|1994-08-01|1994-08-26|NONE|REG AIR|equests alongside of the fluffily pend +54759|911|14|3|42|76100.22|0.08|0.07|R|F|1994-07-10|1994-07-31|1994-08-08|DELIVER IN PERSON|REG AIR|bold sentiments may cajole sl +54759|1169|42|4|33|35315.28|0.02|0.06|R|F|1994-08-31|1994-07-16|1994-09-12|NONE|FOB|pecial ideas +54759|840|41|5|5|8704.20|0.10|0.02|A|F|1994-06-10|1994-08-05|1994-06-17|NONE|TRUCK|s cajole furiously. slyly bold +54784|658|59|1|18|28055.70|0.04|0.04|R|F|1992-03-17|1992-04-13|1992-03-25|COLLECT COD|FOB|. final accounts sleep +54784|321|50|2|7|8549.24|0.01|0.07|A|F|1992-05-03|1992-04-14|1992-05-19|COLLECT COD|REG AIR|cies integrate slyly pinto beans. fina +54784|474|75|3|26|35736.22|0.06|0.01|A|F|1992-03-14|1992-04-22|1992-03-27|COLLECT COD|RAIL|haggle final pearls. ironic r +54785|675|76|1|41|64602.47|0.09|0.06|N|O|1996-08-06|1996-08-02|1996-08-25|DELIVER IN PERSON|SHIP|furiously dinos. u +54785|1353|92|2|15|18815.25|0.04|0.04|N|O|1996-10-15|1996-08-17|1996-10-28|DELIVER IN PERSON|RAIL|posits wake above the slyly regul +54785|848|82|3|23|40223.32|0.10|0.08|N|O|1996-07-24|1996-08-17|1996-07-31|TAKE BACK RETURN|RAIL|uthlessly carefully regula +54785|38|89|4|31|29078.93|0.09|0.00|N|O|1996-07-29|1996-08-19|1996-08-16|DELIVER IN PERSON|AIR|ully express pac +54786|1747|90|1|17|28028.58|0.09|0.00|A|F|1992-03-25|1992-03-05|1992-03-26|TAKE BACK RETURN|FOB|telets. regular, +54786|453|12|2|34|46017.30|0.01|0.00|A|F|1992-04-13|1992-03-25|1992-05-09|TAKE BACK RETURN|FOB|lly unusual accounts affix among the +54786|1805|6|3|24|40963.20|0.03|0.06|R|F|1992-04-07|1992-03-21|1992-04-14|NONE|SHIP|t the blithely regular account +54786|1970|71|4|24|44927.28|0.09|0.06|A|F|1992-02-14|1992-04-06|1992-03-05|TAKE BACK RETURN|MAIL|de of the slyly even accounts. special +54787|1546|27|1|7|10132.78|0.04|0.01|A|F|1995-05-23|1995-04-10|1995-05-31|COLLECT COD|FOB|requests about the ideas thrash +54787|1552|73|2|44|63956.20|0.01|0.05|N|F|1995-06-15|1995-04-10|1995-07-04|TAKE BACK RETURN|AIR|n platelets sublate. fluffily pending pin +54787|1264|39|3|33|38453.58|0.07|0.00|A|F|1995-03-06|1995-03-31|1995-03-30|TAKE BACK RETURN|MAIL|ests after +54788|1584|25|1|7|10399.06|0.09|0.05|N|O|1998-06-13|1998-07-06|1998-06-23|NONE|AIR|s cajole blithely a +54788|1167|4|2|3|3204.48|0.07|0.07|N|O|1998-08-17|1998-06-29|1998-09-13|NONE|AIR|ular attainments will ha +54789|1071|77|1|47|45687.29|0.08|0.08|N|O|1995-11-11|1995-11-30|1995-11-24|TAKE BACK RETURN|REG AIR|? even pinto bea +54789|1472|51|2|44|60432.68|0.00|0.07|N|O|1995-10-26|1995-12-08|1995-11-17|COLLECT COD|REG AIR|s are among the even plate +54790|1547|28|1|50|72427.00|0.09|0.00|A|F|1993-12-31|1994-03-07|1994-01-17|DELIVER IN PERSON|SHIP|elets are slyly final accounts. furi +54790|1673|74|2|43|67710.81|0.09|0.00|A|F|1994-01-05|1994-01-17|1994-01-19|DELIVER IN PERSON|SHIP|silent excuses al +54791|1301|16|1|13|15629.90|0.10|0.02|A|F|1993-02-21|1993-02-27|1993-03-16|NONE|AIR|y. bold deposits +54791|1654|55|2|10|15556.50|0.05|0.07|R|F|1993-04-17|1993-02-03|1993-05-13|COLLECT COD|TRUCK|areful, regular pinto beans wake evenly +54791|1911|44|3|25|45322.75|0.08|0.01|A|F|1993-04-07|1993-03-08|1993-04-23|NONE|FOB|s wake slyly special deposits. caref +54791|170|97|4|23|24613.91|0.04|0.00|A|F|1993-03-28|1993-01-22|1993-04-03|DELIVER IN PERSON|RAIL|ding warhorses. even, +54791|95|46|5|33|32837.97|0.01|0.03|R|F|1993-01-02|1993-02-17|1993-01-13|NONE|AIR|s cajole foxes. eve +54791|1041|42|6|37|34855.48|0.08|0.06|A|F|1993-03-16|1993-02-24|1993-03-20|TAKE BACK RETURN|REG AIR| deposits are bravely against the car +54791|1673|74|7|9|14172.03|0.06|0.03|A|F|1993-03-07|1993-01-28|1993-04-01|TAKE BACK RETURN|FOB|olites. silent foxes aff +54816|847|81|1|30|52435.20|0.03|0.04|R|F|1995-02-07|1995-02-12|1995-02-16|COLLECT COD|RAIL|ironic theodolites. furiously +54816|693|87|2|11|17530.59|0.02|0.02|R|F|1995-02-14|1995-01-14|1995-03-05|COLLECT COD|TRUCK|nts. furiousl +54816|1957|58|3|42|78075.90|0.04|0.00|A|F|1995-02-14|1995-02-27|1995-03-05|COLLECT COD|AIR|cuses sleep furiously. final packages +54816|235|36|4|26|29515.98|0.10|0.04|A|F|1994-12-26|1995-01-27|1994-12-31|NONE|AIR|blithely quick pinto beans. fluffily eve +54816|207|89|5|1|1107.20|0.06|0.02|A|F|1995-02-18|1995-02-21|1995-03-12|NONE|RAIL|about the final accounts. never f +54817|513|14|1|37|52299.87|0.03|0.05|R|F|1992-05-28|1992-07-30|1992-06-08|DELIVER IN PERSON|MAIL|egular packages. blithely i +54817|1764|49|2|27|44975.52|0.08|0.05|A|F|1992-08-21|1992-08-10|1992-08-29|DELIVER IN PERSON|TRUCK|beans use behind the even excuses. final e +54817|500|88|3|19|26609.50|0.08|0.04|R|F|1992-08-18|1992-07-30|1992-09-17|TAKE BACK RETURN|RAIL|ideas across the +54817|1045|51|4|22|20812.88|0.07|0.01|A|F|1992-06-06|1992-08-08|1992-06-28|DELIVER IN PERSON|SHIP|slyly. silent dependencies sl +54817|1162|99|5|50|53158.00|0.06|0.03|A|F|1992-09-10|1992-08-03|1992-10-09|COLLECT COD|REG AIR| beans against +54817|1489|7|6|28|38933.44|0.03|0.03|R|F|1992-08-30|1992-07-20|1992-09-29|COLLECT COD|TRUCK|inments thrash. som +54818|185|38|1|44|47747.92|0.05|0.08|N|O|1997-07-31|1997-08-28|1997-08-06|NONE|MAIL|lar theodolites boost above the flu +54819|1844|31|1|11|19204.24|0.03|0.04|R|F|1994-12-13|1994-12-06|1994-12-30|DELIVER IN PERSON|FOB|ress deposits: furiously unusual idea +54819|587|78|2|15|22313.70|0.04|0.05|A|F|1994-11-10|1994-12-31|1994-11-24|COLLECT COD|MAIL|cording to the requests thrash slo +54819|1747|90|3|44|72544.56|0.07|0.01|R|F|1994-12-29|1994-11-24|1995-01-05|TAKE BACK RETURN|AIR|equests cajole ironic, blit +54819|612|44|4|47|71092.67|0.03|0.04|A|F|1994-11-29|1994-11-10|1994-12-12|COLLECT COD|MAIL|gular platelets abov +54819|815|82|5|46|78927.26|0.06|0.07|A|F|1994-12-23|1994-12-04|1995-01-21|NONE|MAIL|e special, special requ +54819|274|56|6|50|58713.50|0.07|0.06|R|F|1994-10-25|1994-11-17|1994-11-19|DELIVER IN PERSON|RAIL| slyly. final asy +54819|1583|84|7|44|65321.52|0.04|0.08|R|F|1994-12-20|1994-12-12|1994-12-23|NONE|MAIL|ld instructions. deposit +54820|703|36|1|27|43299.90|0.07|0.00|N|O|1996-04-18|1996-03-28|1996-04-28|COLLECT COD|REG AIR|structions run a +54820|1624|48|2|28|42717.36|0.01|0.00|N|O|1996-04-01|1996-03-05|1996-04-02|DELIVER IN PERSON|MAIL|le above th +54821|1206|81|1|27|29894.40|0.07|0.07|R|F|1994-05-29|1994-07-02|1994-06-21|COLLECT COD|SHIP|ages sleep carefully regular theodolites. +54821|160|13|2|34|36045.44|0.07|0.02|R|F|1994-07-05|1994-06-17|1994-07-10|NONE|SHIP| fluffily furiously regular +54821|949|52|3|39|72147.66|0.00|0.02|A|F|1994-07-18|1994-06-21|1994-07-20|COLLECT COD|REG AIR|. final, even requests affix bold +54821|1210|48|4|1|1111.21|0.01|0.04|R|F|1994-06-14|1994-07-04|1994-06-26|DELIVER IN PERSON|TRUCK|sual asymptotes? never ironic deposit +54822|628|91|1|18|27515.16|0.02|0.08|R|F|1995-01-12|1995-02-01|1995-01-25|COLLECT COD|AIR|s are furiously. furiously bold requ +54822|1906|95|2|2|3615.80|0.07|0.07|A|F|1995-03-15|1995-02-02|1995-03-20|COLLECT COD|AIR| quickly pending pearls nag slyly regular T +54822|481|11|3|24|33155.52|0.09|0.04|A|F|1995-02-14|1995-03-22|1995-03-16|TAKE BACK RETURN|RAIL|e furiously? furiously final courts boos +54822|1588|9|4|45|67031.10|0.01|0.05|R|F|1995-03-12|1995-01-26|1995-03-18|TAKE BACK RETURN|FOB|r excuses. quickly fina +54823|1942|75|1|13|23971.22|0.06|0.08|N|O|1998-07-01|1998-06-11|1998-07-21|DELIVER IN PERSON|SHIP| fluffily about the furiously re +54823|1526|7|2|35|49963.20|0.04|0.07|N|O|1998-04-03|1998-05-14|1998-04-23|TAKE BACK RETURN|MAIL| accounts between the bold depths +54823|467|68|3|14|19144.44|0.01|0.06|N|O|1998-06-11|1998-05-04|1998-06-15|COLLECT COD|AIR| express request +54823|294|22|4|14|16720.06|0.10|0.02|N|O|1998-04-06|1998-05-14|1998-05-01|COLLECT COD|RAIL|posits play blithely slow, bold in +54848|505|96|1|1|1405.50|0.03|0.06|N|O|1998-01-15|1997-11-27|1998-02-06|DELIVER IN PERSON|REG AIR|ructions are. furiously even +54848|1317|32|2|47|57260.57|0.02|0.08|N|O|1997-12-26|1997-12-07|1998-01-02|COLLECT COD|FOB|refully quickly unusual deposits? final +54848|20|21|3|41|37720.82|0.09|0.04|N|O|1997-11-14|1997-10-23|1997-11-27|DELIVER IN PERSON|SHIP|e quickly final ideas. quickly ironic pack +54849|1862|63|1|45|79373.70|0.10|0.07|N|O|1996-09-24|1996-08-12|1996-09-28|DELIVER IN PERSON|AIR| furiously pending packages hagg +54850|1778|79|1|4|6719.08|0.10|0.02|R|F|1994-02-16|1994-03-11|1994-03-17|COLLECT COD|SHIP|ick theodolit +54850|421|22|2|8|10571.36|0.02|0.04|R|F|1994-04-14|1994-01-27|1994-05-10|COLLECT COD|SHIP| sleep carefully; express instructions d +54850|1970|59|3|17|31823.49|0.10|0.01|R|F|1994-01-17|1994-03-03|1994-02-05|COLLECT COD|FOB|ously even dolphins around th +54850|1526|47|4|27|38543.04|0.02|0.06|R|F|1994-01-05|1994-02-13|1994-01-17|DELIVER IN PERSON|MAIL|slyly bold theodolites cajole. regula +54850|1363|2|5|37|46781.32|0.07|0.06|R|F|1994-01-17|1994-02-05|1994-01-23|NONE|REG AIR| ideas boost carefully blith +54850|261|62|6|32|37160.32|0.04|0.03|A|F|1994-01-27|1994-03-23|1994-01-29|TAKE BACK RETURN|FOB|alms cajole blithely about +54850|1102|75|7|13|13040.30|0.05|0.01|R|F|1994-01-17|1994-02-21|1994-01-26|DELIVER IN PERSON|SHIP|ngside of the even requests. ironi +54851|1137|46|1|49|50868.37|0.06|0.07|A|F|1994-01-28|1993-11-16|1994-01-31|DELIVER IN PERSON|MAIL|ul dependenc +54851|829|63|2|1|1729.82|0.04|0.04|A|F|1993-11-22|1993-12-10|1993-12-02|DELIVER IN PERSON|REG AIR| requests cajole. carefu +54851|1452|53|3|42|56844.90|0.00|0.08|A|F|1993-12-12|1994-01-03|1994-01-07|TAKE BACK RETURN|TRUCK| instructions. sl +54852|1008|44|1|42|38178.00|0.09|0.03|N|O|1997-06-07|1997-07-06|1997-07-06|COLLECT COD|AIR|ructions are around the final, +54852|577|78|2|24|35461.68|0.07|0.07|N|O|1997-07-20|1997-06-20|1997-08-14|COLLECT COD|REG AIR|slyly. carefully regular depths integrate +54852|559|90|3|50|72977.50|0.10|0.01|N|O|1997-08-22|1997-07-28|1997-09-07|TAKE BACK RETURN|MAIL| are. final requests according to +54852|680|12|4|24|37936.32|0.07|0.08|N|O|1997-08-17|1997-07-06|1997-09-04|NONE|SHIP|. slyly regular forges +54852|1857|44|5|38|66836.30|0.07|0.08|N|O|1997-07-30|1997-07-26|1997-08-24|TAKE BACK RETURN|AIR|run. evenly un +54852|1719|46|6|37|59966.27|0.08|0.04|N|O|1997-06-12|1997-06-12|1997-06-23|COLLECT COD|AIR|ns believe fluffily sl +54853|1945|34|1|36|66489.84|0.02|0.01|N|O|1997-03-21|1997-03-06|1997-03-27|NONE|RAIL| the ironic requests. +54853|811|11|2|11|18829.91|0.08|0.04|N|O|1997-01-09|1997-02-12|1997-01-23|TAKE BACK RETURN|TRUCK|al requests. sp +54853|417|18|3|7|9221.87|0.08|0.08|N|O|1997-02-21|1997-01-19|1997-03-10|NONE|MAIL|quickly. unusual accounts should believe. +54854|64|40|1|25|24101.50|0.05|0.06|N|O|1997-03-22|1997-03-11|1997-04-11|DELIVER IN PERSON|RAIL|ts play fluffil +54854|341|42|2|7|8689.38|0.06|0.00|N|O|1997-02-12|1997-03-22|1997-02-26|COLLECT COD|RAIL| ideas sleep furiously about the blit +54854|884|51|3|36|64255.68|0.01|0.08|N|O|1997-01-23|1997-03-28|1997-02-08|COLLECT COD|SHIP| bold sheaves. regular, even requests slee +54855|1008|44|1|29|26361.00|0.05|0.06|R|F|1992-10-12|1992-08-06|1992-10-20|DELIVER IN PERSON|SHIP|t, regular pinto bean +54855|469|70|2|17|23280.82|0.03|0.05|R|F|1992-07-13|1992-09-26|1992-07-25|TAKE BACK RETURN|MAIL|le carefully. quickly unu +54855|1034|70|3|9|8415.27|0.04|0.08|A|F|1992-08-11|1992-08-01|1992-09-03|NONE|FOB|slyly special braids. regu +54880|1123|60|1|12|12289.44|0.04|0.07|N|O|1996-07-20|1996-10-01|1996-08-09|TAKE BACK RETURN|SHIP|kages. slyly ironic foxes sleep +54880|689|90|2|28|44511.04|0.05|0.01|N|O|1996-10-19|1996-08-27|1996-11-09|DELIVER IN PERSON|MAIL|. slyly regular theod +54880|621|15|3|24|36518.88|0.08|0.05|N|O|1996-08-04|1996-09-15|1996-08-13|TAKE BACK RETURN|SHIP|across the final packages integrate +54880|1172|9|4|41|43999.97|0.06|0.07|N|O|1996-10-27|1996-10-10|1996-10-30|COLLECT COD|SHIP|uriously silent instructions. final, ir +54880|225|80|5|46|51760.12|0.09|0.06|N|O|1996-08-30|1996-09-14|1996-09-05|NONE|SHIP| fluffily ab +54881|1036|7|1|46|43103.38|0.10|0.02|N|O|1998-07-05|1998-07-19|1998-07-08|NONE|SHIP|regular decoys detect fluff +54881|308|93|2|22|26582.60|0.04|0.05|N|O|1998-07-18|1998-07-24|1998-07-28|TAKE BACK RETURN|FOB|mptotes nod furiously slyly ironic packages +54881|470|100|3|15|20557.05|0.00|0.03|N|O|1998-06-12|1998-06-29|1998-06-28|TAKE BACK RETURN|SHIP|ly theodolites use furiously slyly +54881|1825|26|4|2|3453.64|0.09|0.02|N|O|1998-06-30|1998-06-02|1998-07-06|NONE|TRUCK|yly? regular pin +54882|9|10|1|41|37269.00|0.00|0.06|R|F|1995-05-23|1995-03-09|1995-05-30|COLLECT COD|REG AIR|cross the +54882|1457|75|2|6|8150.70|0.10|0.07|A|F|1995-05-23|1995-04-09|1995-06-10|TAKE BACK RETURN|FOB|ions. requests sleep bravely am +54882|1841|28|3|17|29628.28|0.07|0.03|R|F|1995-04-26|1995-03-29|1995-05-15|DELIVER IN PERSON|TRUCK|telets sublate +54882|1034|5|4|10|9350.30|0.03|0.02|A|F|1995-04-04|1995-04-13|1995-04-20|DELIVER IN PERSON|FOB| ironic reque +54883|411|41|1|49|64259.09|0.02|0.06|N|O|1997-08-03|1997-09-06|1997-08-31|COLLECT COD|FOB|ular deposits do use slyly-- bol +54884|473|74|1|12|16481.64|0.02|0.03|A|F|1992-11-10|1992-10-29|1992-11-13|NONE|FOB|resias haggle furiously busy foxes? care +54885|971|74|1|31|58031.07|0.02|0.00|N|O|1997-02-07|1997-03-01|1997-02-10|DELIVER IN PERSON|SHIP|e silently express ac +54885|1350|51|2|30|37540.50|0.09|0.08|N|O|1997-03-07|1997-02-23|1997-03-24|NONE|TRUCK| packages above the express excuses cajole +54885|1839|69|3|48|83559.84|0.00|0.03|N|O|1997-02-24|1997-02-12|1997-03-08|TAKE BACK RETURN|AIR|final deposits. bli +54885|225|26|4|48|54010.56|0.00|0.05|N|O|1997-01-22|1997-02-09|1997-02-14|NONE|FOB|ular instructions. bold, final request +54885|229|57|5|1|1129.22|0.03|0.01|N|O|1997-02-04|1997-01-09|1997-02-17|COLLECT COD|TRUCK|usual deposits ar +54886|1683|84|1|14|22185.52|0.10|0.06|R|F|1992-09-24|1992-10-11|1992-10-07|TAKE BACK RETURN|FOB|es? deposits wake slyly special, +54886|1093|99|2|17|16899.53|0.04|0.01|R|F|1992-09-24|1992-09-12|1992-10-07|NONE|RAIL|s, regular requests. +54886|1209|47|3|12|13322.40|0.04|0.08|A|F|1992-10-23|1992-11-01|1992-11-14|TAKE BACK RETURN|SHIP|sly bold ideas sleep ironic asy +54887|1935|80|1|33|60618.69|0.06|0.01|N|O|1998-08-26|1998-09-19|1998-09-06|NONE|TRUCK|inal deposits haggle along the final, +54887|1700|83|2|6|9610.20|0.01|0.03|N|O|1998-10-30|1998-08-29|1998-11-20|COLLECT COD|TRUCK|. express excuses w +54887|1767|52|3|7|11681.32|0.06|0.06|N|O|1998-10-01|1998-10-10|1998-10-15|NONE|REG AIR| instructions. requests lose across t +54912|217|72|1|14|15640.94|0.07|0.06|N|O|1995-10-01|1995-08-31|1995-10-18|DELIVER IN PERSON|RAIL|ing deposi +54912|1403|21|2|7|9130.80|0.00|0.01|N|O|1995-10-01|1995-09-14|1995-10-11|TAKE BACK RETURN|RAIL|carefully against the blithely unusual +54913|475|34|1|26|35762.22|0.00|0.08|A|F|1993-09-08|1993-09-11|1993-09-20|COLLECT COD|AIR|orbits: blith +54914|679|73|1|20|31593.40|0.09|0.04|N|O|1995-11-16|1995-10-12|1995-11-28|NONE|RAIL|nt, ironic re +54914|1396|73|2|30|38921.70|0.07|0.03|N|O|1995-09-27|1995-11-09|1995-10-23|TAKE BACK RETURN|TRUCK|regular requests nag +54914|1396|97|3|2|2594.78|0.02|0.06|N|O|1995-11-09|1995-10-07|1995-12-01|TAKE BACK RETURN|FOB|ular realms. slyly regular requests detect +54914|330|31|4|50|61516.50|0.08|0.00|N|O|1995-09-11|1995-10-11|1995-09-14|COLLECT COD|SHIP|nic requests. slyly special accounts a +54914|1032|3|5|33|30789.99|0.06|0.06|N|O|1995-11-11|1995-10-24|1995-12-05|TAKE BACK RETURN|MAIL|ly. asymptotes was furi +54914|1759|44|6|32|53144.00|0.10|0.05|N|O|1995-09-01|1995-11-07|1995-09-14|COLLECT COD|REG AIR|tructions are ironic courts. slyly ruthless +54914|743|76|7|26|42737.24|0.04|0.08|N|O|1995-11-16|1995-11-15|1995-12-11|NONE|SHIP|are furiou +54915|1833|20|1|7|12143.81|0.05|0.00|N|O|1995-09-22|1995-08-31|1995-09-30|TAKE BACK RETURN|REG AIR|carefully final accounts +54916|215|97|1|22|24534.62|0.08|0.02|N|O|1998-05-19|1998-04-08|1998-06-11|COLLECT COD|TRUCK|ctions alongside of t +54916|160|39|2|17|18022.72|0.07|0.00|N|O|1998-04-07|1998-04-11|1998-04-30|NONE|TRUCK|lar requests. excuses use blithely. silent +54916|1227|39|3|1|1128.22|0.05|0.01|N|O|1998-02-04|1998-04-17|1998-02-24|TAKE BACK RETURN|REG AIR| quickly about the regular pack +54917|872|39|1|15|26593.05|0.01|0.07|A|F|1993-07-12|1993-07-02|1993-07-16|DELIVER IN PERSON|SHIP|s are quickly. asymptotes wake careful +54917|762|27|2|12|19953.12|0.03|0.07|A|F|1993-06-03|1993-05-17|1993-06-10|NONE|SHIP|he regular, +54917|982|51|3|10|18829.80|0.07|0.01|R|F|1993-06-10|1993-07-09|1993-07-10|TAKE BACK RETURN|FOB|t the blithely careful pinto +54917|1507|28|4|44|61974.00|0.04|0.04|A|F|1993-05-18|1993-05-27|1993-05-23|NONE|REG AIR|along the instructions. +54917|1687|11|5|43|68313.24|0.08|0.08|R|F|1993-05-04|1993-07-03|1993-05-29|COLLECT COD|AIR|luffily regular theodolites beli +54917|1799|26|6|40|68031.60|0.08|0.01|A|F|1993-07-20|1993-05-23|1993-08-15|NONE|MAIL| deposits use furiously qu +54917|843|44|7|25|43596.00|0.09|0.02|R|F|1993-07-21|1993-05-28|1993-08-08|TAKE BACK RETURN|REG AIR|ts. fluffily pending accou +54918|1033|4|1|4|3736.12|0.01|0.03|N|O|1996-05-30|1996-05-20|1996-06-20|NONE|REG AIR|otes across the bold ideas breac +54918|1626|27|2|41|62632.42|0.08|0.02|N|O|1996-08-07|1996-06-05|1996-08-15|DELIVER IN PERSON|REG AIR|ic deposits are. regular +54919|603|4|1|37|55633.20|0.03|0.05|A|F|1994-05-21|1994-06-08|1994-06-03|DELIVER IN PERSON|SHIP|y furiously unusual accounts. pendin +54919|1329|44|2|37|45521.84|0.08|0.03|A|F|1994-08-28|1994-07-09|1994-09-14|TAKE BACK RETURN|SHIP|ding theodolites +54919|1972|17|3|29|54345.13|0.05|0.07|A|F|1994-08-10|1994-07-20|1994-08-24|NONE|AIR|ctions. furiously pend +54919|779|12|4|31|52072.87|0.04|0.02|R|F|1994-08-21|1994-06-07|1994-09-06|COLLECT COD|REG AIR|rbits sleep across the c +54919|1273|48|5|9|10568.43|0.09|0.02|A|F|1994-08-29|1994-07-11|1994-09-11|DELIVER IN PERSON|MAIL|en pinto beans sleep c +54944|1401|2|1|31|40374.40|0.02|0.04|A|F|1995-02-26|1995-02-23|1995-02-27|NONE|MAIL|ar pinto bean +54945|1714|41|1|5|8078.55|0.05|0.02|N|O|1997-01-03|1996-12-17|1997-01-21|COLLECT COD|MAIL|ely regular courts hinder sl +54945|1390|67|2|46|59403.94|0.00|0.04|N|O|1997-01-04|1996-10-19|1997-01-13|TAKE BACK RETURN|RAIL|arefully ironic dependencies cajole +54945|715|16|3|25|40392.75|0.00|0.08|N|O|1996-09-30|1996-11-30|1996-10-06|NONE|REG AIR|e the pending, bol +54945|1275|87|4|26|30583.02|0.06|0.00|N|O|1997-01-11|1996-11-02|1997-01-25|DELIVER IN PERSON|MAIL|y brave deposits haggle slyly above the c +54945|276|4|5|32|37640.64|0.00|0.02|N|O|1996-10-12|1996-10-24|1996-10-13|NONE|TRUCK|ronic accounts are blithe +54945|412|13|6|39|51183.99|0.01|0.08|N|O|1996-10-03|1996-12-17|1996-10-06|NONE|AIR|ests at the slyly b +54945|1033|69|7|22|20548.66|0.06|0.04|N|O|1996-10-26|1996-12-05|1996-11-02|TAKE BACK RETURN|AIR|kages. furiously ironic as +54946|1776|3|1|29|48655.33|0.05|0.01|N|O|1997-12-12|1998-01-02|1998-01-09|TAKE BACK RETURN|MAIL|uses. pendi +54946|906|7|2|12|21682.80|0.00|0.06|N|O|1997-12-08|1998-01-25|1998-01-06|NONE|AIR|thely silent pinto beans. blithely pend +54946|1040|46|3|39|36700.56|0.10|0.06|N|O|1997-12-25|1998-01-23|1998-01-06|DELIVER IN PERSON|SHIP|ide of the furiously final instructions ru +54946|1586|27|4|38|56528.04|0.04|0.08|N|O|1997-12-01|1998-02-14|1997-12-08|DELIVER IN PERSON|FOB|ithes. carefully silent instruc +54946|689|83|5|36|57228.48|0.10|0.08|N|O|1997-12-16|1998-01-17|1997-12-20|COLLECT COD|SHIP|nto beans. packages cajole above t +54946|599|90|6|33|49486.47|0.07|0.01|N|O|1997-12-26|1998-01-17|1998-01-01|COLLECT COD|REG AIR|ly regular asymp +54946|1735|78|7|15|24550.95|0.02|0.08|N|O|1998-01-16|1997-12-21|1998-01-20|DELIVER IN PERSON|FOB|regular pint +54947|1979|80|1|30|56429.10|0.10|0.01|R|F|1994-04-26|1994-04-08|1994-05-24|COLLECT COD|FOB|riously express pinto beans impre +54947|1225|37|2|6|6757.32|0.10|0.08|R|F|1994-04-06|1994-04-01|1994-05-05|NONE|AIR| requests nag slyly al +54947|175|28|3|44|47307.48|0.06|0.05|A|F|1994-03-14|1994-05-20|1994-03-20|TAKE BACK RETURN|MAIL|icing foxes integra +54947|1401|80|4|48|62515.20|0.04|0.00|R|F|1994-04-18|1994-03-29|1994-04-25|NONE|REG AIR| may are about the final, expres +54948|1014|50|1|4|3660.04|0.09|0.01|N|O|1997-11-25|1998-01-14|1997-12-12|NONE|MAIL|furiously quickly regular theodolites. sil +54948|1325|26|2|20|24526.40|0.04|0.06|N|O|1997-12-28|1997-12-30|1997-12-31|COLLECT COD|MAIL|uriously regular depths wake. reg +54948|1600|41|3|4|6006.40|0.03|0.02|N|O|1997-12-09|1998-01-31|1997-12-19|TAKE BACK RETURN|RAIL|eans again +54948|1609|51|4|43|64955.80|0.08|0.02|N|O|1998-02-11|1998-02-03|1998-03-03|COLLECT COD|SHIP|efully regular requests +54949|699|93|1|8|12797.52|0.03|0.00|R|F|1994-11-09|1994-09-30|1994-11-23|COLLECT COD|REG AIR|luffily caref +54949|1336|13|2|33|40831.89|0.06|0.04|R|F|1994-10-13|1994-11-09|1994-10-29|TAKE BACK RETURN|TRUCK|ages. ironic ideas wake regular decoys. +54949|1259|60|3|28|32487.00|0.10|0.00|A|F|1994-09-28|1994-09-19|1994-10-16|TAKE BACK RETURN|TRUCK|into beans use. blith +54949|1860|47|4|13|22904.18|0.10|0.08|A|F|1994-10-26|1994-09-15|1994-11-04|DELIVER IN PERSON|RAIL|uffily. quickly pending courts sleep +54949|1878|79|5|10|17798.70|0.03|0.00|R|F|1994-11-03|1994-09-26|1994-11-30|NONE|SHIP|ven depths are alon +54949|1651|93|6|46|71421.90|0.05|0.03|A|F|1994-10-21|1994-10-25|1994-11-12|DELIVER IN PERSON|REG AIR| above the blithely regular requests. +54949|780|77|7|35|58827.30|0.09|0.06|R|F|1994-10-27|1994-10-22|1994-11-12|COLLECT COD|RAIL|; regular, special requests wake always ev +54950|1401|2|1|26|33862.40|0.07|0.06|A|F|1994-03-19|1994-02-10|1994-04-16|COLLECT COD|AIR|es. carefully regular ideas nag +54950|1546|87|2|25|36188.50|0.04|0.04|R|F|1994-01-21|1994-02-06|1994-02-14|NONE|TRUCK|structions. blithely ironic pinto bea +54950|951|86|3|4|7407.80|0.09|0.05|R|F|1994-03-09|1994-01-22|1994-03-14|COLLECT COD|AIR|efully. slowly regular requests are sly +54950|502|3|4|26|36465.00|0.02|0.03|A|F|1994-02-25|1994-02-11|1994-03-20|TAKE BACK RETURN|RAIL|y slyly unus +54950|1459|77|5|5|6802.25|0.06|0.03|A|F|1994-01-06|1994-01-22|1994-01-13|TAKE BACK RETURN|TRUCK|packages. quick +54950|230|31|6|40|45209.20|0.03|0.07|A|F|1994-01-28|1994-01-25|1994-02-17|DELIVER IN PERSON|TRUCK|across the special, final instructions. +54951|953|22|1|19|35225.05|0.01|0.00|N|O|1998-06-18|1998-06-11|1998-06-28|TAKE BACK RETURN|RAIL|ndencies. bold theodolites detect fluf +54951|560|21|2|40|58422.40|0.09|0.00|N|O|1998-06-08|1998-05-25|1998-06-11|COLLECT COD|MAIL| even accounts integrate slyly after the q +54951|1130|31|3|3|3093.39|0.08|0.07|N|O|1998-06-15|1998-06-30|1998-07-09|COLLECT COD|MAIL| packages. quickly regular theodolit +54951|1679|62|4|32|50581.44|0.03|0.02|N|O|1998-05-20|1998-06-01|1998-06-15|DELIVER IN PERSON|SHIP|, final packages: +54951|476|35|5|36|49552.92|0.10|0.03|N|O|1998-06-03|1998-05-18|1998-06-20|COLLECT COD|SHIP|foxes are fluffi +54951|1769|12|6|45|75184.20|0.06|0.03|N|O|1998-07-04|1998-06-07|1998-07-09|NONE|FOB|even excuses. sly +54976|489|48|1|41|56968.68|0.01|0.07|R|F|1993-04-02|1993-03-26|1993-04-11|DELIVER IN PERSON|MAIL|ructions sleep special +54977|1878|65|1|22|39157.14|0.07|0.03|N|O|1995-09-24|1995-10-06|1995-10-24|DELIVER IN PERSON|SHIP|nts are. eve +54977|1567|8|2|7|10279.92|0.04|0.01|N|O|1995-08-28|1995-09-24|1995-09-23|COLLECT COD|AIR|y even excuses? c +54977|840|74|3|29|50484.36|0.08|0.03|N|O|1995-10-06|1995-09-12|1995-10-18|DELIVER IN PERSON|RAIL|ely final packages along the ironic +54977|501|32|4|33|46249.50|0.03|0.03|N|O|1995-07-22|1995-09-01|1995-08-05|COLLECT COD|REG AIR|ptotes. express d +54977|106|85|5|29|29176.90|0.00|0.04|N|O|1995-08-15|1995-10-01|1995-08-29|COLLECT COD|SHIP|e quickly pending packages. blithe +54977|1959|4|6|35|65133.25|0.04|0.00|N|O|1995-07-28|1995-09-30|1995-08-06|NONE|TRUCK|kages. blithel +54978|305|62|1|22|26516.60|0.07|0.06|R|F|1992-05-04|1992-02-27|1992-05-23|TAKE BACK RETURN|MAIL|y silent a +54979|308|9|1|8|9666.40|0.07|0.00|N|O|1995-11-17|1996-01-15|1995-12-11|TAKE BACK RETURN|TRUCK|ag carefully along +54980|1357|72|1|21|26425.35|0.10|0.02|R|F|1994-05-30|1994-06-28|1994-06-01|TAKE BACK RETURN|FOB|s wake between the expre +54980|1108|17|2|18|18163.80|0.03|0.07|R|F|1994-07-24|1994-06-10|1994-07-26|NONE|REG AIR| lose blithely f +54980|1479|19|3|5|6902.35|0.03|0.03|A|F|1994-07-03|1994-06-21|1994-07-16|COLLECT COD|RAIL| slyly slyly regular accounts. fu +54981|1741|42|1|6|9856.44|0.09|0.05|A|F|1992-03-19|1992-03-28|1992-03-25|COLLECT COD|FOB|r excuses. +54981|792|57|2|38|64326.02|0.07|0.03|R|F|1992-03-21|1992-04-21|1992-04-03|COLLECT COD|RAIL|ual requests. ir +54981|39|40|3|41|38500.23|0.09|0.01|A|F|1992-05-29|1992-05-06|1992-06-09|NONE|TRUCK|ing to the furiously pending account +54982|788|89|1|41|69239.98|0.01|0.01|N|O|1998-05-10|1998-05-10|1998-05-12|COLLECT COD|REG AIR|nding foxes sle +54982|172|51|2|39|41814.63|0.04|0.06|N|O|1998-04-12|1998-04-06|1998-05-10|COLLECT COD|RAIL|es solve ac +54982|819|53|3|37|63632.97|0.04|0.03|N|O|1998-05-05|1998-04-19|1998-05-08|TAKE BACK RETURN|AIR|eposits un +54982|1573|54|4|29|42762.53|0.09|0.03|N|O|1998-05-08|1998-04-12|1998-05-09|TAKE BACK RETURN|SHIP|ress plate +54983|630|93|1|13|19898.19|0.07|0.05|N|O|1998-06-15|1998-05-20|1998-07-06|TAKE BACK RETURN|TRUCK|ackages cajole across the fina +54983|453|12|2|35|47370.75|0.06|0.07|N|O|1998-03-25|1998-04-13|1998-03-30|TAKE BACK RETURN|RAIL|packages. requests dazzle across the regu +55008|1874|75|1|15|26638.05|0.02|0.02|N|O|1998-09-16|1998-08-25|1998-09-24|NONE|MAIL|press theodolites +55008|1826|70|2|36|62201.52|0.03|0.04|N|O|1998-08-29|1998-09-13|1998-08-31|TAKE BACK RETURN|TRUCK|aggle quickly after the q +55008|938|73|3|40|73557.20|0.04|0.05|N|O|1998-10-10|1998-09-25|1998-11-09|COLLECT COD|FOB|sts. instructions +55008|1264|2|4|32|37288.32|0.09|0.01|N|O|1998-07-28|1998-10-08|1998-08-22|COLLECT COD|TRUCK|ickly among the express accounts. even +55008|1657|99|5|13|20262.45|0.08|0.03|N|O|1998-08-16|1998-10-09|1998-08-27|COLLECT COD|SHIP|l deposits. quic +55008|703|36|6|12|19244.40|0.03|0.02|N|O|1998-07-28|1998-09-08|1998-08-08|TAKE BACK RETURN|TRUCK| requests sleep s +55008|1075|81|7|16|15617.12|0.00|0.04|N|O|1998-09-19|1998-09-01|1998-10-16|TAKE BACK RETURN|MAIL|g the decoys. quickly even instructions are +55009|378|63|1|22|28124.14|0.06|0.06|R|F|1992-10-09|1992-11-08|1992-11-08|TAKE BACK RETURN|AIR|g to the blithely special deposi +55009|593|94|2|50|74679.50|0.02|0.08|R|F|1992-10-27|1992-11-24|1992-11-02|TAKE BACK RETURN|RAIL|y regular foxes. carefully unus +55010|1648|72|1|10|15496.40|0.01|0.08|N|O|1998-08-13|1998-10-24|1998-08-29|COLLECT COD|AIR| excuses. regular req +55010|1816|46|2|14|24049.34|0.09|0.06|N|O|1998-10-26|1998-09-05|1998-10-29|COLLECT COD|FOB|onic ideas nag. +55010|1917|6|3|41|74575.31|0.05|0.05|N|O|1998-08-17|1998-09-28|1998-08-20|NONE|REG AIR|ly final accounts. even instructio +55010|921|24|4|46|83808.32|0.08|0.07|N|O|1998-09-16|1998-09-08|1998-09-18|DELIVER IN PERSON|AIR|xpress packages. unusual, daring acco +55011|300|1|1|33|39609.90|0.06|0.02|R|F|1992-02-14|1992-02-10|1992-02-28|TAKE BACK RETURN|AIR|ending reque +55011|261|89|2|25|29031.50|0.05|0.03|R|F|1992-02-13|1992-03-03|1992-02-19|DELIVER IN PERSON|REG AIR|ly! furiously speci +55011|531|22|3|34|48672.02|0.00|0.06|A|F|1992-04-07|1992-02-29|1992-04-21|NONE|SHIP|ular patterns sleep careful +55011|273|55|4|13|15252.51|0.06|0.03|A|F|1992-04-21|1992-02-26|1992-05-18|COLLECT COD|RAIL|requests about the busily pending p +55011|112|65|5|50|50605.50|0.04|0.04|R|F|1992-03-04|1992-03-04|1992-03-08|NONE|TRUCK|ar asymptotes +55011|1719|4|6|20|32414.20|0.03|0.00|A|F|1992-01-17|1992-02-07|1992-02-02|TAKE BACK RETURN|AIR|blithely regular +55012|1606|89|1|49|73872.40|0.09|0.00|N|O|1998-05-01|1998-03-20|1998-05-26|TAKE BACK RETURN|RAIL|ar deposits alongside of t +55012|513|74|2|42|59367.42|0.01|0.02|N|O|1998-05-09|1998-04-13|1998-05-28|COLLECT COD|TRUCK|ts. entici +55013|1015|16|1|33|30228.33|0.05|0.08|N|O|1995-10-04|1995-08-29|1995-10-30|NONE|FOB|. blithely sp +55013|1044|50|2|50|47252.00|0.01|0.04|N|O|1995-10-25|1995-08-13|1995-11-03|COLLECT COD|REG AIR|ncies wake +55013|1345|60|3|12|14956.08|0.05|0.03|N|O|1995-07-24|1995-09-25|1995-08-07|TAKE BACK RETURN|MAIL|inst the blithely fi +55013|722|19|4|26|42190.72|0.00|0.05|N|O|1995-09-07|1995-08-26|1995-10-06|NONE|TRUCK|. permanently bold deposits integr +55013|1130|3|5|8|8249.04|0.10|0.03|N|O|1995-08-17|1995-10-01|1995-09-05|COLLECT COD|TRUCK|quests: final +55014|1436|15|1|31|41460.33|0.07|0.06|A|F|1993-11-12|1993-12-10|1993-11-19|TAKE BACK RETURN|RAIL|s the slyly express instr +55014|849|50|2|28|48995.52|0.06|0.00|A|F|1994-02-23|1994-01-04|1994-02-28|DELIVER IN PERSON|AIR|o beans. quickly unusual foxes +55014|1624|48|3|35|53396.70|0.06|0.03|A|F|1994-01-16|1994-01-07|1994-01-26|NONE|FOB|ounts sleep furiousl +55014|452|11|4|9|12172.05|0.01|0.03|R|F|1994-01-15|1993-12-18|1994-01-18|TAKE BACK RETURN|FOB|ole carefully +55014|1721|48|5|37|60040.64|0.01|0.03|A|F|1994-01-09|1993-12-23|1994-01-12|NONE|RAIL|, regular platelets cajole furiousl +55014|855|56|6|48|84280.80|0.08|0.00|R|F|1993-12-27|1994-01-23|1994-01-11|COLLECT COD|SHIP|uickly dogged tithes are alongs +55014|147|26|7|15|15707.10|0.04|0.01|R|F|1993-11-19|1993-12-30|1993-12-18|TAKE BACK RETURN|FOB|: slyly unusual requests +55015|1654|37|1|41|63781.65|0.05|0.05|A|F|1993-11-15|1993-11-13|1993-11-16|COLLECT COD|MAIL|deas after the final pinto beans +55015|244|99|2|12|13730.88|0.00|0.03|R|F|1993-12-11|1993-11-10|1994-01-09|NONE|SHIP|ng ideas? reque +55015|1737|64|3|26|42606.98|0.08|0.03|A|F|1993-11-23|1993-12-02|1993-12-02|DELIVER IN PERSON|FOB|usly even excuses engage blit +55015|787|20|4|3|5063.34|0.10|0.05|R|F|1993-11-21|1993-11-22|1993-12-08|COLLECT COD|FOB| slyly. blit +55015|920|55|5|40|72836.80|0.02|0.04|A|F|1993-12-14|1993-11-28|1994-01-10|DELIVER IN PERSON|SHIP|dolites. furiously regu +55015|1084|85|6|50|49254.00|0.01|0.01|R|F|1993-10-11|1993-11-11|1993-11-09|TAKE BACK RETURN|MAIL| sleep slyly in place of th +55040|1807|51|1|22|37593.60|0.08|0.04|R|F|1994-05-16|1994-06-21|1994-05-19|TAKE BACK RETURN|MAIL|. requests wake furiously aroun +55040|1634|35|2|3|4606.89|0.07|0.03|A|F|1994-06-14|1994-07-09|1994-07-03|TAKE BACK RETURN|AIR|tegrate carefully furiously special theodo +55040|256|11|3|29|33531.25|0.01|0.01|A|F|1994-04-17|1994-06-20|1994-04-18|COLLECT COD|TRUCK| furiously f +55040|1047|53|4|27|25597.08|0.09|0.07|R|F|1994-08-07|1994-05-13|1994-08-19|DELIVER IN PERSON|SHIP|e quickly ironic packages. evenly +55040|1958|59|5|3|5579.85|0.03|0.04|A|F|1994-07-18|1994-05-28|1994-08-03|NONE|SHIP|ly ironic packages. carefull +55040|1614|38|6|41|62140.01|0.03|0.03|A|F|1994-04-18|1994-06-28|1994-05-05|COLLECT COD|REG AIR|ctions. carefully careful theodolites coul +55041|871|71|1|39|69102.93|0.01|0.05|N|O|1997-01-11|1996-12-04|1997-01-13|NONE|FOB| beans integrate blithel +55041|299|27|2|39|46772.31|0.01|0.07|N|O|1997-01-10|1996-11-16|1997-01-27|NONE|FOB|iously express packag +55041|125|78|3|32|32803.84|0.07|0.02|N|O|1997-01-15|1996-12-16|1997-01-31|NONE|TRUCK|riously special ideas haggl +55041|984|87|4|6|11309.88|0.04|0.05|N|O|1996-10-27|1996-11-27|1996-11-06|NONE|TRUCK|ins wake flu +55041|615|78|5|10|15156.10|0.08|0.08|N|O|1996-09-27|1996-12-15|1996-10-27|NONE|MAIL|ffix quickly. carefully +55042|1262|100|1|29|33734.54|0.05|0.08|N|O|1996-02-09|1996-02-17|1996-02-10|TAKE BACK RETURN|RAIL|ven requests. even +55042|1848|92|2|43|75243.12|0.04|0.03|N|O|1996-02-07|1996-02-19|1996-03-08|DELIVER IN PERSON|SHIP|carefully. unusual, ironic warthogs engage +55043|219|20|1|25|27980.25|0.03|0.05|N|O|1997-03-08|1997-03-31|1997-03-19|COLLECT COD|MAIL|after the quietly even foxes run among th +55043|1223|98|2|9|10117.98|0.00|0.03|N|O|1997-06-18|1997-04-13|1997-07-17|NONE|AIR| carefully unusual foxes. carefully regular +55043|1005|11|3|34|30804.00|0.03|0.03|N|O|1997-04-09|1997-05-01|1997-05-04|NONE|RAIL| quickly unusual accounts +55043|1988|33|4|44|83159.12|0.09|0.00|N|O|1997-03-22|1997-05-22|1997-03-26|DELIVER IN PERSON|RAIL| slyly bold foxes boost +55043|1118|19|5|36|36687.96|0.10|0.04|N|O|1997-05-28|1997-04-17|1997-06-20|DELIVER IN PERSON|MAIL|lent deposit +55044|688|20|1|49|77845.32|0.09|0.08|N|O|1998-05-29|1998-04-18|1998-06-15|DELIVER IN PERSON|RAIL|ily even frets +55044|344|29|2|49|60972.66|0.00|0.04|N|O|1998-06-06|1998-03-22|1998-06-26|NONE|REG AIR|even packages +55044|1587|88|3|31|46145.98|0.02|0.07|N|O|1998-04-10|1998-04-03|1998-04-12|TAKE BACK RETURN|REG AIR|as. carefully ironic platelets +55045|652|46|1|27|41921.55|0.00|0.07|R|F|1995-01-13|1995-01-29|1995-01-27|NONE|MAIL|ently regular +55046|444|74|1|37|49744.28|0.04|0.04|R|F|1994-07-10|1994-06-07|1994-07-27|COLLECT COD|REG AIR| furiously even deposits +55046|1348|63|2|17|21238.78|0.06|0.01|R|F|1994-05-04|1994-05-23|1994-05-31|NONE|MAIL|furiously unusual packages cajole. u +55047|1083|84|1|21|20665.68|0.10|0.01|A|F|1993-10-08|1993-08-12|1993-10-09|TAKE BACK RETURN|AIR|kages are carefully. final idea +55047|537|68|2|16|23000.48|0.02|0.05|A|F|1993-07-13|1993-07-23|1993-07-14|TAKE BACK RETURN|SHIP|es cajole blithely along +55047|1300|12|3|10|12013.00|0.08|0.05|A|F|1993-06-29|1993-09-16|1993-07-25|NONE|FOB|express requests integrate thinly above +55047|541|2|4|37|53336.98|0.06|0.01|A|F|1993-08-09|1993-08-08|1993-08-28|DELIVER IN PERSON|FOB|packages doub +55047|1070|71|5|35|33987.45|0.01|0.03|A|F|1993-09-24|1993-08-27|1993-10-24|DELIVER IN PERSON|RAIL|ously. slyly express foxes dete +55047|1304|5|6|19|22900.70|0.07|0.04|A|F|1993-10-10|1993-07-22|1993-10-20|NONE|RAIL|ccording to the even in +55047|1701|86|7|16|25643.20|0.04|0.03|A|F|1993-08-04|1993-09-13|1993-08-07|TAKE BACK RETURN|MAIL|pinto beans maintain alongside of the fl +55072|627|90|1|22|33607.64|0.04|0.04|R|F|1995-01-21|1995-03-09|1995-01-23|TAKE BACK RETURN|AIR|lar packages. carefully +55072|1006|7|2|2|1814.00|0.00|0.08|R|F|1995-05-04|1995-02-25|1995-05-23|NONE|RAIL|al instructions. theodol +55072|831|32|3|2|3463.66|0.03|0.06|A|F|1995-03-07|1995-03-12|1995-03-22|TAKE BACK RETURN|RAIL| accounts haggle. enticingly even theo +55072|517|48|4|16|22680.16|0.07|0.05|A|F|1995-01-16|1995-03-09|1995-01-24|DELIVER IN PERSON|FOB|y brave requests haggle blithely +55073|649|43|1|46|71283.44|0.01|0.06|R|F|1992-03-26|1992-05-27|1992-04-21|COLLECT COD|TRUCK| carefully even pinto beans grow about +55073|822|23|2|21|36179.22|0.04|0.05|R|F|1992-04-23|1992-05-28|1992-05-17|COLLECT COD|FOB|efully quiet a +55074|423|53|1|7|9263.94|0.00|0.04|N|O|1997-12-07|1997-10-26|1997-12-20|NONE|RAIL|. blithely pending requests cajole bli +55074|238|66|2|9|10244.07|0.04|0.07|N|O|1998-01-08|1997-10-15|1998-01-26|NONE|TRUCK|inal asymptotes cajole blithely fi +55074|1313|52|3|47|57072.57|0.01|0.03|N|O|1998-01-03|1997-12-01|1998-01-21|DELIVER IN PERSON|TRUCK|lites. blithely ironic requests afte +55074|435|65|4|34|45404.62|0.08|0.04|N|O|1997-09-22|1997-10-10|1997-09-26|COLLECT COD|REG AIR|ld ideas promise i +55074|1530|51|5|5|7157.65|0.01|0.05|N|O|1997-11-17|1997-11-03|1997-12-15|NONE|RAIL| need to cajole. unusual accounts are +55074|378|35|6|26|33237.62|0.08|0.07|N|O|1997-11-14|1997-11-10|1997-11-27|NONE|TRUCK|en packages sleep fluffily bl +55075|49|25|1|47|44604.88|0.02|0.04|A|F|1995-06-01|1995-04-09|1995-06-16|DELIVER IN PERSON|RAIL|al platelets sleep fluffily alongside +55075|746|43|2|22|36228.28|0.00|0.04|A|F|1995-02-08|1995-03-29|1995-02-21|DELIVER IN PERSON|MAIL|. ideas haggle. furiously special pa +55075|1253|28|3|32|36936.00|0.02|0.01|R|F|1995-04-12|1995-03-22|1995-05-09|DELIVER IN PERSON|REG AIR| blithely express requests acro +55075|425|26|4|50|66271.00|0.06|0.01|A|F|1995-03-21|1995-03-15|1995-03-24|COLLECT COD|AIR|e slyly. ev +55076|1961|62|1|22|40985.12|0.01|0.04|N|O|1996-07-08|1996-07-04|1996-08-07|COLLECT COD|SHIP|gular dependencies. quickly final m +55076|1399|14|2|44|57217.16|0.09|0.03|N|O|1996-05-29|1996-08-20|1996-06-24|NONE|TRUCK| even packages nag quickly stealthily speci +55076|722|87|3|47|76267.84|0.00|0.04|N|O|1996-09-23|1996-08-24|1996-10-20|TAKE BACK RETURN|TRUCK|en packages beyond the +55076|910|13|4|41|74247.31|0.08|0.03|N|O|1996-06-14|1996-08-03|1996-06-26|NONE|FOB|haggle carefully. blithely +55076|500|30|5|15|21007.50|0.01|0.06|N|O|1996-09-16|1996-07-27|1996-09-18|COLLECT COD|TRUCK|excuses cajole fluffily carefully i +55076|768|65|6|5|8343.80|0.02|0.00|N|O|1996-08-15|1996-08-23|1996-09-01|DELIVER IN PERSON|SHIP|s do cajole furiously blithely unusual the +55076|905|6|7|7|12641.30|0.05|0.05|N|O|1996-06-29|1996-08-16|1996-07-20|DELIVER IN PERSON|RAIL|pending accounts are fluffily. silent, re +55077|1964|53|1|14|26123.44|0.04|0.04|N|O|1995-10-20|1995-12-07|1995-11-14|TAKE BACK RETURN|REG AIR|ts should have to impress blithely acr +55077|785|82|2|44|74174.32|0.02|0.00|N|O|1996-01-23|1995-11-06|1996-02-03|TAKE BACK RETURN|AIR|ns sleep quickly blithely expres +55077|1588|89|3|21|31281.18|0.06|0.03|N|O|1996-01-15|1995-12-15|1996-02-10|NONE|TRUCK|ntegrate. fluffily regular +55077|240|95|4|46|52451.04|0.02|0.06|N|O|1995-10-07|1995-12-10|1995-10-26|DELIVER IN PERSON|RAIL|c packages. final deposits wake cl +55078|518|49|1|22|31207.22|0.01|0.01|N|O|1998-06-18|1998-07-19|1998-06-28|COLLECT COD|TRUCK|ing to the final foxes. slyly bo +55078|783|80|2|8|13470.24|0.09|0.06|N|O|1998-07-23|1998-09-05|1998-08-01|NONE|AIR| the excuses. bold, silen +55078|1924|69|3|43|78514.56|0.09|0.02|N|O|1998-06-25|1998-08-23|1998-07-07|DELIVER IN PERSON|MAIL|ages doze around th +55079|417|76|1|40|52696.40|0.08|0.07|N|O|1996-08-12|1996-06-28|1996-09-06|NONE|TRUCK| bold asymptotes believe carefully warth +55079|1520|1|2|23|32694.96|0.10|0.08|N|O|1996-07-08|1996-06-04|1996-07-30|COLLECT COD|FOB| fluffily pe +55079|1305|82|3|21|25332.30|0.07|0.02|N|O|1996-08-27|1996-06-12|1996-08-30|NONE|AIR|oxes sleep sly +55079|1263|1|4|8|9314.08|0.08|0.08|N|O|1996-08-08|1996-06-08|1996-08-26|DELIVER IN PERSON|SHIP|ong the fluffily +55104|1574|15|1|1|1475.57|0.04|0.06|N|O|1998-05-01|1998-04-07|1998-05-02|NONE|AIR|haggle. express c +55104|997|66|2|30|56939.70|0.06|0.01|N|O|1998-01-23|1998-03-09|1998-02-21|DELIVER IN PERSON|SHIP|es cajole along the furiously ironic +55104|1716|1|3|22|35589.62|0.05|0.03|N|O|1998-02-28|1998-03-05|1998-03-27|NONE|REG AIR| wake carefully. expres +55104|574|5|4|4|5898.28|0.08|0.04|N|O|1998-02-25|1998-03-26|1998-03-07|COLLECT COD|SHIP|ess packages across th +55104|1019|20|5|6|5520.06|0.06|0.07|N|O|1998-05-10|1998-04-01|1998-06-01|NONE|REG AIR|ronic requests run. furiously even pinto b +55105|1382|21|1|47|60318.86|0.10|0.01|R|F|1994-05-18|1994-06-07|1994-05-26|TAKE BACK RETURN|FOB|ly pending theodolites after the quickly +55105|1478|57|2|13|17933.11|0.05|0.04|R|F|1994-06-21|1994-07-28|1994-07-06|COLLECT COD|AIR|ake agains +55105|594|95|3|36|53805.24|0.07|0.04|R|F|1994-08-05|1994-06-11|1994-08-19|NONE|TRUCK|arefully ironic packages use careful +55105|589|80|4|36|53624.88|0.00|0.05|A|F|1994-07-30|1994-07-17|1994-08-12|NONE|TRUCK|es. regular, express deposits sleep +55105|115|68|5|21|21317.31|0.03|0.08|A|F|1994-08-29|1994-07-10|1994-09-28|NONE|TRUCK|otes integrate carefully bold, +55106|1795|80|1|42|71265.18|0.02|0.06|N|O|1996-08-16|1996-06-26|1996-09-01|COLLECT COD|RAIL|ly across the theodoli +55106|967|36|2|35|65378.60|0.01|0.01|N|O|1996-06-16|1996-07-14|1996-07-10|DELIVER IN PERSON|RAIL|ites are regular platelets. ins +55107|314|43|1|50|60715.50|0.05|0.05|A|F|1993-08-24|1993-06-09|1993-09-06|NONE|AIR|gged accounts; expre +55107|24|75|2|50|46201.00|0.06|0.08|R|F|1993-09-04|1993-08-03|1993-09-07|COLLECT COD|MAIL|lly silent theodolite +55107|1729|30|3|27|44029.44|0.06|0.05|R|F|1993-08-09|1993-06-26|1993-09-07|TAKE BACK RETURN|AIR| the slyly ironic +55107|1975|20|4|22|41293.34|0.00|0.02|A|F|1993-05-23|1993-07-09|1993-06-20|TAKE BACK RETURN|RAIL| special platelets. final waters cajole! +55108|506|37|1|36|50634.00|0.08|0.04|N|O|1997-10-29|1997-11-20|1997-10-30|COLLECT COD|SHIP|ts. regular deposits a +55108|1772|15|2|32|53560.64|0.10|0.05|N|O|1997-09-21|1997-11-14|1997-09-30|COLLECT COD|REG AIR|unusual foxes +55108|1893|94|3|29|52051.81|0.04|0.08|N|O|1997-12-04|1997-11-04|1997-12-30|DELIVER IN PERSON|MAIL| daring requests wake among +55108|558|49|4|23|33546.65|0.06|0.02|N|O|1997-10-04|1997-11-20|1997-10-23|DELIVER IN PERSON|SHIP|pinto beans use against the regular instru +55108|1769|12|5|30|50122.80|0.07|0.03|N|O|1997-12-20|1997-11-16|1998-01-12|TAKE BACK RETURN|RAIL|egular, ironic foxe +55108|1765|50|6|23|38335.48|0.02|0.03|N|O|1997-11-03|1997-12-04|1997-11-28|NONE|RAIL|dolites. blithely bold +55109|1833|20|1|33|57249.39|0.03|0.04|N|O|1996-04-15|1996-05-02|1996-05-10|NONE|FOB| even requests. unusual accounts use. +55110|881|81|1|15|26728.20|0.02|0.04|N|O|1997-07-23|1997-09-03|1997-08-22|DELIVER IN PERSON|MAIL|thrash furiously accor +55110|702|99|2|32|51286.40|0.02|0.04|N|O|1997-10-04|1997-07-24|1997-10-18|COLLECT COD|REG AIR|rs cajole furi +55110|583|74|3|30|44507.40|0.04|0.01|N|O|1997-06-29|1997-09-17|1997-07-25|COLLECT COD|TRUCK| haggle bli +55110|493|52|4|20|27869.80|0.02|0.03|N|O|1997-09-24|1997-09-14|1997-10-01|DELIVER IN PERSON|REG AIR|y silent depos +55110|6|7|5|16|14496.00|0.02|0.08|N|O|1997-09-06|1997-08-10|1997-10-04|COLLECT COD|SHIP| permanently regular pa +55110|1569|70|6|29|42646.24|0.05|0.03|N|O|1997-07-27|1997-08-25|1997-08-07|NONE|REG AIR|st carefully. eve +55110|1516|17|7|15|21262.65|0.03|0.05|N|O|1997-06-22|1997-08-18|1997-07-20|DELIVER IN PERSON|MAIL|. even, final +55111|741|42|1|46|75520.04|0.10|0.06|N|O|1997-08-07|1997-07-14|1997-08-24|NONE|MAIL|ts. final fo +55111|270|25|2|27|31597.29|0.09|0.07|N|O|1997-05-27|1997-07-01|1997-06-04|NONE|SHIP|beans boost furiously alo +55111|380|9|3|12|15364.56|0.06|0.00|N|O|1997-06-11|1997-07-04|1997-06-12|COLLECT COD|MAIL| final foxes solve about the slyly bo +55136|1178|79|1|14|15108.38|0.10|0.03|R|F|1993-12-20|1993-11-30|1994-01-17|TAKE BACK RETURN|MAIL|pendencies nag carefully final instruc +55136|382|67|2|41|52577.58|0.08|0.02|A|F|1993-12-31|1994-01-07|1994-01-06|DELIVER IN PERSON|RAIL|hely regular pinto beans sleep quickly +55136|2|3|3|46|41492.00|0.01|0.08|A|F|1993-11-17|1993-11-28|1993-12-14|TAKE BACK RETURN|FOB|ctions. regular instruc +55136|178|5|4|16|17250.72|0.05|0.01|A|F|1994-01-21|1993-12-11|1994-01-29|DELIVER IN PERSON|MAIL|he bold, ironic deposits. ironic, regular +55136|783|16|5|47|79137.66|0.09|0.05|A|F|1993-12-10|1993-12-13|1993-12-27|NONE|TRUCK|sual ideas wake about th +55136|1548|49|6|8|11596.32|0.00|0.01|R|F|1993-10-16|1993-11-09|1993-10-22|DELIVER IN PERSON|REG AIR|ular deposits promise c +55136|1154|27|7|23|24268.45|0.10|0.00|A|F|1993-10-30|1993-12-12|1993-11-16|COLLECT COD|FOB|kages use +55137|19|95|1|32|29408.32|0.02|0.00|A|F|1993-06-10|1993-05-09|1993-07-09|TAKE BACK RETURN|TRUCK|quickly regular +55137|1365|66|2|38|48121.68|0.05|0.00|A|F|1993-04-06|1993-04-24|1993-04-08|COLLECT COD|TRUCK|furiously even theodolites are careful +55138|233|88|1|25|28330.75|0.04|0.01|A|F|1994-10-02|1994-11-20|1994-10-08|DELIVER IN PERSON|REG AIR| the ironic packages. pinto beans haggl +55139|1589|10|1|30|44717.40|0.00|0.03|R|F|1993-01-19|1993-04-05|1993-02-01|NONE|REG AIR|usly. quickly +55139|1572|93|2|11|16209.27|0.07|0.03|R|F|1993-04-15|1993-04-05|1993-04-17|NONE|AIR| even deposits +55139|86|37|3|5|4930.40|0.02|0.06|R|F|1993-02-17|1993-03-29|1993-03-14|NONE|REG AIR|r the final pinto beans. i +55139|610|4|4|33|49850.13|0.03|0.01|R|F|1993-02-05|1993-03-04|1993-02-17|TAKE BACK RETURN|MAIL|d, silent deposits are ca +55139|1150|51|5|42|44148.30|0.03|0.08|A|F|1993-04-24|1993-04-05|1993-05-17|NONE|MAIL|blithely pending theodo +55139|745|10|6|21|34560.54|0.09|0.03|A|F|1993-02-22|1993-04-06|1993-03-09|DELIVER IN PERSON|FOB|frays. deposit +55139|1784|11|7|33|55630.74|0.08|0.00|R|F|1993-05-12|1993-04-04|1993-05-28|DELIVER IN PERSON|AIR| promise. thinly +55140|1920|65|1|47|85630.24|0.09|0.01|A|F|1993-07-22|1993-09-04|1993-08-02|COLLECT COD|RAIL|l accounts. carefully regu +55140|134|61|2|2|2068.26|0.03|0.01|A|F|1993-08-21|1993-09-07|1993-08-31|COLLECT COD|FOB|latelets across the deposits cajol +55140|554|15|3|16|23272.80|0.10|0.05|R|F|1993-08-18|1993-08-24|1993-09-11|TAKE BACK RETURN|RAIL|earls along the furious pinto beans boos +55140|1446|86|4|6|8084.64|0.01|0.08|A|F|1993-10-01|1993-10-03|1993-10-28|NONE|MAIL|rnes. always bold requests haggl +55141|489|77|1|27|37515.96|0.01|0.07|N|O|1996-08-18|1996-07-03|1996-08-22|DELIVER IN PERSON|FOB| deposits. furiously f +55141|1979|12|2|32|60191.04|0.01|0.00|N|O|1996-07-07|1996-08-14|1996-07-14|NONE|FOB|ely special +55142|1435|14|1|49|65485.07|0.03|0.01|A|F|1994-02-25|1994-01-31|1994-02-26|DELIVER IN PERSON|TRUCK|s the furiously ironic acc +55142|1469|70|2|30|41113.80|0.03|0.00|A|F|1994-03-05|1994-02-01|1994-03-23|NONE|MAIL|yly regular theodolites +55142|998|67|3|42|79757.58|0.08|0.06|R|F|1993-12-27|1994-02-20|1994-01-25|NONE|MAIL|thless packages. furiously regular reques +55142|444|74|4|16|21511.04|0.10|0.01|A|F|1993-12-23|1994-02-27|1994-01-17|NONE|TRUCK|riously regular ac +55143|1677|1|1|5|7893.35|0.09|0.05|A|F|1993-03-25|1993-03-01|1993-04-24|NONE|AIR|ng to the furiously silen +55143|140|67|2|47|48886.58|0.08|0.05|A|F|1993-05-12|1993-04-05|1993-05-22|DELIVER IN PERSON|TRUCK| carefully unusual pains. quickly bo +55143|1930|75|3|15|27478.95|0.00|0.05|R|F|1993-03-25|1993-03-11|1993-04-01|NONE|REG AIR|use carefully special accounts. steal +55168|1676|77|1|11|17354.37|0.07|0.03|N|O|1997-06-09|1997-05-30|1997-06-30|DELIVER IN PERSON|TRUCK|ly regular decoys; fu +55168|888|89|2|38|67977.44|0.03|0.04|N|O|1997-06-08|1997-05-23|1997-06-16|COLLECT COD|RAIL| along the blithely ironic foxes. pi +55168|1215|27|3|29|32370.09|0.10|0.00|N|O|1997-06-07|1997-05-29|1997-06-29|COLLECT COD|TRUCK|instructions b +55168|1547|48|4|17|24625.18|0.05|0.05|N|O|1997-07-23|1997-05-19|1997-07-30|DELIVER IN PERSON|SHIP|regular accou +55168|287|88|5|49|58176.72|0.05|0.01|N|O|1997-05-21|1997-05-28|1997-06-02|TAKE BACK RETURN|FOB|e the excuses +55169|710|7|1|21|33824.91|0.01|0.06|A|F|1992-08-13|1992-06-15|1992-08-20|NONE|REG AIR| regular packages. carefully sp +55170|1932|21|1|33|60519.69|0.09|0.06|R|F|1992-10-22|1992-11-05|1992-11-07|COLLECT COD|RAIL|lithely unusual foxes. blithely pend +55170|1327|28|2|42|51589.44|0.05|0.04|R|F|1993-01-06|1992-10-23|1993-01-21|NONE|TRUCK|deposits ca +55170|49|75|3|39|37012.56|0.05|0.00|A|F|1992-10-11|1992-12-10|1992-11-07|COLLECT COD|FOB|e the carefully final theodolites. regu +55170|1957|58|4|3|5576.85|0.10|0.07|R|F|1993-01-15|1992-12-07|1993-02-07|DELIVER IN PERSON|RAIL|lites. reg +55170|567|28|5|33|48429.48|0.07|0.01|R|F|1992-11-06|1992-11-07|1992-11-23|NONE|TRUCK|ecial requests boost ruthlessly even idea +55171|578|69|1|31|45835.67|0.10|0.07|A|F|1992-11-18|1992-12-24|1992-11-30|COLLECT COD|AIR|ng pinto b +55171|995|96|2|49|92903.51|0.07|0.03|A|F|1993-02-13|1992-12-26|1993-03-13|NONE|RAIL|uctions haggle furio +55171|774|71|3|34|56942.18|0.03|0.03|A|F|1992-11-23|1992-12-19|1992-11-30|COLLECT COD|SHIP|. even requests alongside of th +55171|1218|56|4|13|14549.73|0.02|0.01|A|F|1993-01-07|1993-01-19|1993-01-17|TAKE BACK RETURN|AIR|lithely. bold foxes boost even, e +55171|1351|28|5|42|52598.70|0.01|0.03|R|F|1993-01-31|1993-01-07|1993-02-07|DELIVER IN PERSON|REG AIR| packages. blithely ironic pac +55172|1723|8|1|41|66613.52|0.10|0.03|R|F|1993-12-16|1994-02-07|1994-01-08|DELIVER IN PERSON|RAIL|le blithely across the carefully final +55172|426|14|2|33|43771.86|0.02|0.07|R|F|1994-01-23|1994-01-09|1994-01-28|DELIVER IN PERSON|FOB|ond the regular +55172|482|70|3|5|6912.40|0.10|0.08|A|F|1994-01-05|1994-01-26|1994-01-18|COLLECT COD|AIR|. carefully pending dependencies hag +55172|721|54|4|23|37299.56|0.08|0.02|A|F|1993-12-21|1994-01-23|1993-12-29|DELIVER IN PERSON|FOB|r foxes wake among the silent, ironic dolp +55172|109|88|5|26|26236.60|0.09|0.06|A|F|1994-03-08|1994-01-16|1994-04-02|COLLECT COD|FOB|auternes run. packages a +55173|362|91|1|4|5049.44|0.06|0.00|N|O|1998-01-27|1998-01-16|1998-01-28|DELIVER IN PERSON|RAIL|y regular deposits according to the +55173|693|25|2|18|28686.42|0.04|0.06|N|O|1998-01-08|1998-02-05|1998-01-11|TAKE BACK RETURN|RAIL|s accounts about the blithe +55173|317|2|3|12|14607.72|0.03|0.08|N|O|1998-03-18|1997-12-27|1998-03-19|COLLECT COD|REG AIR|nstructions grow furiously. courts sleep +55173|475|34|4|34|46765.98|0.10|0.07|N|O|1997-12-11|1998-01-27|1997-12-16|COLLECT COD|FOB|. even, ironic req +55173|305|90|5|35|42185.50|0.03|0.08|N|O|1998-01-08|1997-12-26|1998-01-31|TAKE BACK RETURN|SHIP| are bold, unusual packages. quick +55174|1985|18|1|24|45287.52|0.00|0.01|R|F|1993-09-10|1993-08-14|1993-09-24|COLLECT COD|REG AIR|y above the closely ironic packa +55174|963|66|2|28|52190.88|0.00|0.03|R|F|1993-10-02|1993-09-12|1993-10-10|NONE|SHIP|the slyly regular packages affix regul +55174|1531|32|3|22|31515.66|0.04|0.00|A|F|1993-09-05|1993-10-04|1993-09-10|NONE|AIR|quests sleep blithely whithout the furiousl +55174|1244|19|4|2|2290.48|0.09|0.02|A|F|1993-07-17|1993-09-04|1993-08-14|TAKE BACK RETURN|REG AIR|ously blithely expr +55175|492|93|1|16|22279.84|0.02|0.04|N|O|1995-10-23|1995-09-15|1995-11-08|DELIVER IN PERSON|TRUCK| haggle among the pendin +55200|605|99|1|23|34628.80|0.02|0.00|R|F|1993-11-02|1993-11-09|1993-11-06|TAKE BACK RETURN|RAIL|quickly final +55200|1844|88|2|33|57612.72|0.10|0.05|A|F|1993-11-21|1993-10-06|1993-12-12|NONE|FOB|foxes. carefully special dependencies are +55200|794|27|3|18|30506.22|0.08|0.00|R|F|1993-11-16|1993-11-01|1993-11-22|COLLECT COD|MAIL| wake. final asymptotes haggle ev +55200|1292|93|4|30|35798.70|0.06|0.07|R|F|1993-11-24|1993-10-11|1993-12-03|NONE|SHIP| quickly i +55200|957|92|5|1|1857.95|0.06|0.06|A|F|1993-10-05|1993-10-23|1993-10-22|TAKE BACK RETURN|TRUCK|mold. quickl +55200|209|10|6|18|19965.60|0.03|0.00|R|F|1993-10-27|1993-11-20|1993-11-21|NONE|RAIL|ke carefully furiously express account +55201|1692|75|1|18|28686.42|0.02|0.07|A|F|1993-05-27|1993-04-26|1993-06-17|DELIVER IN PERSON|FOB|ets eat slyly thinly ironic pinto beans. +55202|977|78|1|1|1877.97|0.05|0.07|N|O|1995-12-19|1995-11-15|1996-01-05|DELIVER IN PERSON|AIR|quests maintain slyly patte +55202|1605|6|2|43|64783.80|0.09|0.04|N|O|1995-12-11|1995-10-17|1996-01-07|COLLECT COD|REG AIR|ly final ideas. regular deposits after the +55202|1634|17|3|18|27641.34|0.01|0.06|N|O|1995-09-04|1995-09-26|1995-09-12|COLLECT COD|MAIL|its sleep slyly acc +55202|1401|80|4|19|24745.60|0.01|0.04|N|O|1995-10-27|1995-10-24|1995-11-14|NONE|SHIP|e furiously blithely i +55202|607|39|5|37|55781.20|0.01|0.00|N|O|1995-10-07|1995-10-26|1995-10-16|TAKE BACK RETURN|MAIL|ggle furious +55203|1305|44|1|33|39807.90|0.01|0.04|A|F|1993-08-06|1993-05-13|1993-08-12|COLLECT COD|MAIL|heodolites affix slyly. +55203|586|17|2|44|65409.52|0.07|0.08|R|F|1993-04-26|1993-06-06|1993-05-17|COLLECT COD|AIR|y bold requests across the final d +55203|1916|49|3|39|70898.49|0.00|0.03|A|F|1993-04-18|1993-06-15|1993-05-03|DELIVER IN PERSON|REG AIR|osits doze. quickly final +55204|1951|96|1|24|44470.80|0.04|0.06|N|O|1997-10-29|1997-09-21|1997-11-17|DELIVER IN PERSON|MAIL|structions wake quickly even requ +55204|311|12|2|27|32705.37|0.09|0.07|N|O|1997-09-23|1997-10-20|1997-10-20|TAKE BACK RETURN|RAIL|posits. furiously ironic reque +55204|1535|56|3|3|4309.59|0.01|0.05|N|O|1997-11-03|1997-09-08|1997-11-04|NONE|FOB|play carefully. slyly reg +55204|1467|7|4|12|16421.52|0.05|0.00|N|O|1997-08-16|1997-09-26|1997-09-10|NONE|REG AIR|cial requests. carefully even +55204|1764|65|5|38|63298.88|0.05|0.04|N|O|1997-08-26|1997-10-16|1997-09-13|NONE|AIR| requests about the +55205|971|6|1|41|76750.77|0.01|0.07|N|O|1998-08-03|1998-09-25|1998-08-19|DELIVER IN PERSON|TRUCK|ross the blithely +55205|961|30|2|19|35377.24|0.08|0.00|N|O|1998-08-28|1998-10-16|1998-08-29|DELIVER IN PERSON|AIR| carefully regular packages wake carefull +55205|702|67|3|29|46478.30|0.05|0.02|N|O|1998-11-09|1998-09-18|1998-11-19|DELIVER IN PERSON|MAIL|deposits. pending foxes boo +55205|1900|1|4|41|73877.90|0.01|0.02|N|O|1998-11-02|1998-09-30|1998-11-28|COLLECT COD|MAIL|latelets; ruthlessly permanent instru +55206|1616|17|1|27|40975.47|0.10|0.07|N|O|1995-12-16|1996-01-15|1995-12-20|TAKE BACK RETURN|AIR|encies wake furiou +55206|1265|66|2|30|34987.80|0.06|0.01|N|O|1995-12-14|1996-01-04|1996-01-04|DELIVER IN PERSON|AIR|ronic accounts. blithely regular +55207|953|54|1|21|38932.95|0.03|0.06|R|F|1995-01-20|1994-12-27|1995-01-22|NONE|RAIL|egrate carefully final, express e +55232|1038|9|1|4|3756.12|0.01|0.06|N|O|1996-02-03|1996-04-15|1996-02-26|TAKE BACK RETURN|MAIL|c requests sleep +55232|422|52|2|21|27770.82|0.09|0.03|N|O|1996-04-23|1996-04-12|1996-04-28|COLLECT COD|AIR|ackages haggle even excuses. s +55232|1571|52|3|5|7362.85|0.08|0.03|N|O|1996-03-10|1996-04-07|1996-03-29|TAKE BACK RETURN|TRUCK|ironic package +55232|1983|72|4|2|3769.96|0.05|0.02|N|O|1996-04-02|1996-03-01|1996-04-09|NONE|REG AIR|g the furiously final foxes. bold, un +55232|1576|77|5|39|57625.23|0.01|0.06|N|O|1996-05-21|1996-03-18|1996-05-24|DELIVER IN PERSON|RAIL|refully final dependencies +55233|283|65|1|34|40231.52|0.05|0.07|A|F|1995-03-16|1995-05-01|1995-04-05|NONE|TRUCK|oss the speci +55234|978|79|1|39|73279.83|0.09|0.04|A|F|1993-10-15|1993-10-03|1993-11-14|TAKE BACK RETURN|RAIL|ts haggle carefully quickly ev +55234|101|80|2|38|38041.80|0.07|0.05|R|F|1993-11-22|1993-10-26|1993-11-24|COLLECT COD|RAIL|l accounts wake carefully pinto beans. slyl +55234|353|82|3|50|62667.50|0.10|0.04|A|F|1993-09-16|1993-09-06|1993-09-29|TAKE BACK RETURN|TRUCK| carefully bold, regula +55234|1187|96|4|23|25028.14|0.02|0.08|R|F|1993-09-06|1993-09-04|1993-10-03|NONE|RAIL|eas. slyly regular ideas are. quick +55234|182|35|5|38|41122.84|0.10|0.02|A|F|1993-10-28|1993-10-07|1993-11-20|DELIVER IN PERSON|AIR|haggle ironic package +55234|785|18|6|43|72488.54|0.03|0.02|R|F|1993-11-11|1993-09-01|1993-11-27|NONE|MAIL|gside of the blit +55234|568|29|7|49|71959.44|0.10|0.02|A|F|1993-11-23|1993-10-14|1993-11-24|DELIVER IN PERSON|RAIL|. quickly si +55235|1006|77|1|12|10884.00|0.09|0.07|R|F|1994-01-26|1993-11-19|1994-02-11|TAKE BACK RETURN|MAIL|r deposits boost after the pendi +55235|59|60|2|47|45075.35|0.06|0.03|R|F|1993-11-02|1993-12-29|1993-11-18|DELIVER IN PERSON|MAIL|ructions haggle. furiously i +55235|1294|95|3|49|58569.21|0.04|0.06|R|F|1994-01-30|1993-11-25|1994-02-20|TAKE BACK RETURN|SHIP|jole according to the f +55235|1578|99|4|12|17754.84|0.04|0.06|A|F|1993-12-21|1993-12-07|1994-01-17|DELIVER IN PERSON|TRUCK|ar deposits wake alongside of the s +55235|582|43|5|10|14825.80|0.02|0.05|R|F|1993-12-15|1993-12-04|1993-12-18|NONE|RAIL|heodolites in +55236|354|55|1|32|40139.20|0.05|0.08|N|O|1997-01-21|1997-02-14|1997-02-16|NONE|MAIL|aggle accordi +55237|1559|80|1|9|13144.95|0.08|0.05|N|O|1997-05-31|1997-04-27|1997-06-18|COLLECT COD|REG AIR|arefully a +55237|748|49|2|11|18136.14|0.02|0.01|N|O|1997-04-19|1997-04-24|1997-05-06|NONE|REG AIR|uickly regular instructions are blithely +55238|927|62|1|28|51181.76|0.10|0.07|N|O|1998-06-20|1998-07-24|1998-06-30|TAKE BACK RETURN|RAIL|g to the c +55238|390|75|2|44|56777.16|0.04|0.07|N|O|1998-09-13|1998-07-05|1998-09-25|DELIVER IN PERSON|MAIL| carefully unusual deposits sleep furiou +55238|349|6|3|27|33732.18|0.04|0.01|N|O|1998-08-21|1998-08-03|1998-08-22|COLLECT COD|REG AIR|y ironic excuses haggle fluffily +55238|1709|10|4|42|67649.40|0.03|0.07|N|O|1998-06-13|1998-08-06|1998-06-18|NONE|MAIL|sual pearls. final, unusual accounts c +55238|821|55|5|41|70594.62|0.05|0.07|N|O|1998-06-28|1998-07-03|1998-07-11|DELIVER IN PERSON|RAIL|uests sleep caref +55238|1028|64|6|4|3716.08|0.10|0.00|N|O|1998-09-26|1998-08-03|1998-10-20|COLLECT COD|AIR|rding to the +55238|117|18|7|12|12205.32|0.08|0.04|N|O|1998-09-14|1998-07-05|1998-09-28|TAKE BACK RETURN|REG AIR|closely special packages ar +55239|1628|29|1|7|10707.34|0.05|0.07|A|F|1992-12-09|1993-01-07|1992-12-13|NONE|AIR|ironic, express +55239|1210|22|2|44|48893.24|0.05|0.07|R|F|1993-01-14|1993-01-26|1993-02-02|DELIVER IN PERSON|AIR|lyly. ironic packages a +55239|271|72|3|4|4685.08|0.07|0.04|R|F|1993-03-06|1993-03-04|1993-03-09|COLLECT COD|MAIL|ously regular id +55239|867|67|4|27|47732.22|0.00|0.06|R|F|1993-03-24|1993-01-31|1993-03-28|NONE|AIR|old accounts are ca +55239|1306|83|5|40|48292.00|0.03|0.08|R|F|1993-02-28|1993-01-06|1993-03-22|TAKE BACK RETURN|RAIL|ites. somet +55239|12|88|6|19|17328.19|0.10|0.07|R|F|1993-01-15|1993-01-24|1993-01-23|TAKE BACK RETURN|RAIL|deas. furiously u +55239|1508|49|7|10|14095.00|0.10|0.01|R|F|1992-12-05|1993-02-16|1993-01-02|COLLECT COD|REG AIR|ns haggle. furiously special foxes nag f +55264|880|81|1|1|1780.88|0.05|0.08|R|F|1994-01-20|1994-03-15|1994-02-06|TAKE BACK RETURN|MAIL|structions wake blithely blithely reg +55265|897|31|1|17|30564.13|0.08|0.06|A|F|1995-01-15|1994-11-09|1995-02-14|TAKE BACK RETURN|RAIL|ully unusual pinto beans. final notornis bo +55265|347|32|2|37|46151.58|0.03|0.04|A|F|1994-11-24|1994-11-28|1994-11-29|DELIVER IN PERSON|REG AIR|ily regular escapades? packages h +55265|914|83|3|42|76226.22|0.01|0.06|R|F|1995-01-02|1994-12-03|1995-01-05|NONE|FOB|to beans. furious, final packages s +55265|1818|5|4|14|24077.34|0.04|0.03|R|F|1994-11-07|1994-11-24|1994-11-17|COLLECT COD|RAIL|ly regular excuses. bravely ironic accoun +55265|1867|68|5|44|77829.84|0.02|0.02|R|F|1994-10-06|1994-11-03|1994-10-08|COLLECT COD|TRUCK|special accounts thrash fluffil +55265|1792|77|6|30|50813.70|0.09|0.00|A|F|1995-01-13|1994-11-18|1995-01-20|TAKE BACK RETURN|TRUCK|nts sleep carefully afte +55265|24|25|7|20|18480.40|0.05|0.08|A|F|1994-11-04|1994-11-08|1994-11-12|COLLECT COD|TRUCK| to the carefully even asymp +55266|1525|66|1|36|51354.72|0.08|0.04|A|F|1992-08-18|1992-07-23|1992-09-04|DELIVER IN PERSON|AIR|efully ironic, special foxes. furiou +55266|1710|37|2|35|56409.85|0.04|0.04|R|F|1992-08-19|1992-08-30|1992-08-28|NONE|FOB| slow, bold packages. slyly expres +55267|881|82|1|30|53456.40|0.06|0.00|N|O|1998-06-17|1998-05-03|1998-07-07|NONE|RAIL|ar platelets. final packages wa +55267|1312|27|2|36|43679.16|0.10|0.04|N|O|1998-03-30|1998-05-02|1998-04-19|TAKE BACK RETURN|TRUCK|t the fluffily ironic id +55268|1180|53|1|14|15136.52|0.09|0.00|R|F|1992-03-28|1992-04-24|1992-03-29|DELIVER IN PERSON|TRUCK|e quickly final asymptotes: +55268|76|77|2|38|37090.66|0.06|0.04|R|F|1992-05-30|1992-05-29|1992-06-15|DELIVER IN PERSON|SHIP|refully regular patterns affix c +55269|286|68|1|49|58127.72|0.05|0.04|R|F|1993-06-21|1993-04-28|1993-06-25|DELIVER IN PERSON|FOB| after the slyly expres +55269|768|33|2|28|46725.28|0.08|0.05|A|F|1993-05-17|1993-04-20|1993-06-12|COLLECT COD|TRUCK|ecial packages. pending acco +55269|422|23|3|13|17191.46|0.05|0.04|R|F|1993-04-05|1993-04-23|1993-04-06|TAKE BACK RETURN|AIR|ash slyly ironic, final braid +55269|1074|45|4|33|32177.31|0.04|0.00|R|F|1993-03-31|1993-06-05|1993-04-11|TAKE BACK RETURN|TRUCK| regular asymptotes cajole car +55269|1974|19|5|11|20635.67|0.00|0.01|R|F|1993-05-23|1993-05-22|1993-06-19|DELIVER IN PERSON|REG AIR|ss deposits. dolphins wak +55269|999|100|6|42|79799.58|0.02|0.05|A|F|1993-07-03|1993-04-24|1993-07-08|COLLECT COD|MAIL|ular, ironic asymptote +55270|1241|79|1|31|35409.44|0.06|0.08|R|F|1993-05-16|1993-03-28|1993-06-09|TAKE BACK RETURN|REG AIR|y between the +55270|329|30|2|17|20898.44|0.03|0.08|R|F|1993-03-11|1993-03-10|1993-04-09|COLLECT COD|SHIP|e above the fur +55270|1374|89|3|39|49739.43|0.01|0.01|A|F|1993-02-25|1993-04-02|1993-03-02|NONE|RAIL|refully regular requests. carefully +55270|1016|87|4|24|22008.24|0.06|0.05|A|F|1993-04-01|1993-03-18|1993-04-19|COLLECT COD|AIR|ay furiously express multiplie +55270|1723|8|5|2|3249.44|0.08|0.00|R|F|1993-04-17|1993-04-20|1993-05-07|NONE|AIR| boldly express requests nag bli +55270|356|41|6|24|30152.40|0.04|0.02|A|F|1993-03-26|1993-02-27|1993-04-16|DELIVER IN PERSON|FOB|t slyly furiousl +55270|857|24|7|6|10547.10|0.00|0.06|R|F|1993-04-29|1993-04-23|1993-05-10|COLLECT COD|TRUCK|e the ideas. express braids sleep furio +55271|1128|37|1|34|34990.08|0.09|0.05|R|F|1995-04-23|1995-04-15|1995-05-06|NONE|REG AIR|pecial packages cajole blithely among +55271|239|94|2|15|17088.45|0.07|0.04|N|O|1995-06-28|1995-04-22|1995-07-07|NONE|REG AIR|the ironic, even accounts are +55271|1191|100|3|48|52425.12|0.00|0.08|A|F|1995-05-21|1995-05-18|1995-06-06|TAKE BACK RETURN|RAIL|dolphins. final, special +55271|912|13|4|25|45322.75|0.05|0.02|N|O|1995-07-11|1995-04-25|1995-07-21|NONE|MAIL|regular packages unwind blithely. sp +55271|693|56|5|8|12749.52|0.09|0.05|N|O|1995-06-19|1995-05-26|1995-07-15|TAKE BACK RETURN|RAIL|l packages. deposits engage +55271|1025|26|6|45|41670.90|0.03|0.07|N|F|1995-06-03|1995-06-07|1995-06-21|TAKE BACK RETURN|FOB|gly final dependencies. sly +55296|176|55|1|10|10761.70|0.10|0.02|R|F|1993-01-23|1992-12-11|1993-02-10|NONE|RAIL|jole carefully according to th +55296|1122|31|2|11|11254.32|0.03|0.06|A|F|1993-02-17|1992-12-14|1993-03-06|TAKE BACK RETURN|SHIP|quickly ironic packages. bl +55296|396|97|3|3|3889.17|0.03|0.01|A|F|1993-01-31|1992-12-07|1993-02-02|TAKE BACK RETURN|SHIP|ronic requests. carefully final accounts +55296|378|63|4|30|38351.10|0.06|0.01|A|F|1992-11-01|1993-01-12|1992-11-28|NONE|REG AIR| have to grow across the blithely ironic de +55296|297|25|5|12|14367.48|0.07|0.02|A|F|1993-02-01|1992-12-31|1993-03-01|COLLECT COD|TRUCK|against the furiously special i +55297|790|87|1|42|71013.18|0.09|0.02|R|F|1994-02-03|1993-12-29|1994-02-04|COLLECT COD|FOB|nal dolphins. bold, regular account +55297|924|93|2|47|85771.24|0.09|0.05|R|F|1993-11-18|1993-12-19|1993-11-26|DELIVER IN PERSON|TRUCK|ronic, bold sheaves sleep blithely. reg +55297|1658|41|3|45|70184.25|0.03|0.05|A|F|1993-10-31|1994-01-18|1993-11-26|TAKE BACK RETURN|FOB|ic accounts wake agains +55297|1861|62|4|11|19391.46|0.09|0.04|R|F|1993-12-29|1993-12-24|1994-01-07|NONE|MAIL| the slyly final foxes. furio +55298|1808|9|1|15|25647.00|0.09|0.08|A|F|1994-08-19|1994-09-21|1994-08-23|NONE|MAIL|ly regular, unusual +55298|454|13|2|19|25734.55|0.09|0.02|A|F|1994-10-25|1994-09-12|1994-11-21|NONE|MAIL|es boost according to the pac +55298|969|38|3|13|24309.48|0.05|0.01|A|F|1994-10-09|1994-09-27|1994-10-14|COLLECT COD|TRUCK|ts kindle carefully final, pendi +55299|257|12|1|44|50919.00|0.08|0.00|A|F|1992-04-01|1992-05-01|1992-04-15|NONE|AIR|ly. furiously special depo +55299|1286|87|2|2|2374.56|0.06|0.01|A|F|1992-04-01|1992-05-15|1992-04-10|TAKE BACK RETURN|SHIP|. ironic, final account +55299|1417|35|3|25|32960.25|0.05|0.01|A|F|1992-07-16|1992-06-26|1992-08-11|TAKE BACK RETURN|MAIL|ully even deposits according to the +55300|721|22|1|1|1621.72|0.05|0.06|A|F|1994-03-20|1994-04-16|1994-03-26|TAKE BACK RETURN|TRUCK|lly. carefully unus +55300|1246|21|2|47|53920.28|0.01|0.07|A|F|1994-06-06|1994-05-04|1994-06-08|TAKE BACK RETURN|TRUCK|n accounts wak +55300|1341|56|3|34|42239.56|0.05|0.06|R|F|1994-04-25|1994-04-03|1994-04-30|NONE|RAIL|nts. carefully bra +55300|972|7|4|33|61808.01|0.02|0.03|A|F|1994-03-16|1994-04-04|1994-03-18|DELIVER IN PERSON|FOB|he final, final deposits. blithely specia +55300|1459|60|5|5|6802.25|0.05|0.03|A|F|1994-04-28|1994-03-26|1994-05-21|TAKE BACK RETURN|AIR|refully unusual epitaphs wa +55300|1003|39|6|4|3616.00|0.00|0.04|A|F|1994-03-11|1994-05-09|1994-03-16|NONE|AIR| asymptotes boo +55300|1263|64|7|23|26777.98|0.05|0.01|R|F|1994-06-17|1994-05-02|1994-07-02|TAKE BACK RETURN|RAIL|oxes: slyly regular pinto b +55301|1518|39|1|38|53941.38|0.02|0.02|R|F|1994-05-16|1994-05-03|1994-06-12|TAKE BACK RETURN|MAIL|iously final requ +55302|705|2|1|45|72256.50|0.06|0.00|N|O|1998-01-20|1998-01-05|1998-02-11|TAKE BACK RETURN|FOB|he accounts. blithely regular foxe +55302|1455|95|2|16|21703.20|0.08|0.07|N|O|1998-01-18|1998-01-21|1998-02-06|TAKE BACK RETURN|FOB|ect carefu +55302|990|59|3|36|68075.64|0.10|0.06|N|O|1997-11-30|1998-01-28|1997-12-16|COLLECT COD|RAIL|slyly final fo +55302|724|89|4|43|69862.96|0.01|0.03|N|O|1998-03-15|1997-12-23|1998-03-29|NONE|REG AIR| ideas haggle enticingly. +55303|6|7|1|49|44394.00|0.06|0.08|N|O|1995-06-28|1995-05-02|1995-07-15|DELIVER IN PERSON|SHIP|bold packages integrate. slyly fina +55303|380|9|2|21|26887.98|0.10|0.08|N|O|1995-06-30|1995-06-07|1995-07-13|NONE|FOB|fully even accounts. slyly +55303|188|41|3|8|8705.44|0.09|0.08|R|F|1995-04-08|1995-05-29|1995-04-19|NONE|MAIL|ccording to the f +55328|406|94|1|48|62707.20|0.00|0.08|N|O|1998-04-15|1998-04-23|1998-04-26|DELIVER IN PERSON|MAIL| even foxes. slyly bold id +55329|691|23|1|12|19100.28|0.04|0.06|N|O|1996-07-01|1996-09-15|1996-07-08|DELIVER IN PERSON|REG AIR|g to the blithely pending requests haggle +55329|350|51|2|19|23756.65|0.05|0.00|N|O|1996-07-29|1996-08-28|1996-08-10|DELIVER IN PERSON|AIR|lly ironic packages. +55329|278|6|3|46|54200.42|0.05|0.02|N|O|1996-10-14|1996-08-26|1996-11-13|NONE|AIR|slyly stealthy accou +55329|851|52|4|4|7007.40|0.03|0.06|N|O|1996-07-30|1996-07-31|1996-08-06|TAKE BACK RETURN|SHIP| asymptotes. blithely bold dinos caj +55329|1193|66|5|41|44861.79|0.07|0.00|N|O|1996-07-13|1996-09-08|1996-08-12|DELIVER IN PERSON|TRUCK|bits might cajole against +55329|1585|26|6|13|19325.54|0.03|0.05|N|O|1996-09-23|1996-08-03|1996-10-18|TAKE BACK RETURN|TRUCK| foxes boost furiously. slyly brave plate +55330|900|34|1|38|68434.20|0.09|0.04|R|F|1994-10-16|1994-09-26|1994-11-15|NONE|SHIP|ons use carefully. slyly special t +55330|139|92|2|6|6234.78|0.02|0.01|R|F|1994-09-14|1994-10-01|1994-10-12|TAKE BACK RETURN|RAIL| have to w +55330|579|40|3|49|72498.93|0.09|0.07|R|F|1994-08-31|1994-09-17|1994-09-05|DELIVER IN PERSON|AIR|uickly regular packages use slyly i +55330|1241|16|4|27|30840.48|0.10|0.08|A|F|1994-10-09|1994-10-30|1994-10-28|DELIVER IN PERSON|AIR|quickly regular frays serve. sl +55330|638|1|5|33|50774.79|0.01|0.06|R|F|1994-10-10|1994-10-17|1994-10-29|COLLECT COD|MAIL|ges boost across the carefully pending de +55330|1003|9|6|27|24408.00|0.03|0.05|R|F|1994-12-01|1994-09-19|1994-12-21|TAKE BACK RETURN|AIR|lithely. foxes cajole along the caref +55331|618|50|1|49|74411.89|0.02|0.08|R|F|1994-01-10|1994-01-20|1994-01-25|DELIVER IN PERSON|AIR|theodolites +55331|1584|85|2|45|66851.10|0.07|0.04|A|F|1994-02-24|1994-02-01|1994-03-21|TAKE BACK RETURN|FOB|unusual asymptotes affix along the bl +55331|666|98|3|31|48566.46|0.10|0.03|R|F|1994-01-04|1994-03-10|1994-01-11|DELIVER IN PERSON|TRUCK|eans? blithely silent packages doz +55331|1986|87|4|44|83071.12|0.02|0.00|R|F|1994-01-09|1994-03-11|1994-01-25|TAKE BACK RETURN|MAIL|iously. carefully unusua +55331|1737|64|5|33|54078.09|0.00|0.00|A|F|1993-12-18|1994-02-23|1994-01-03|DELIVER IN PERSON|FOB|efully ironic requests. furious +55331|1430|48|6|7|9320.01|0.06|0.01|R|F|1994-01-29|1994-01-31|1994-02-02|NONE|TRUCK|ctions-- furiously +55332|1972|61|1|26|48723.22|0.08|0.05|N|O|1998-05-27|1998-06-10|1998-06-13|TAKE BACK RETURN|RAIL|ully. slyly ironic accou +55333|1242|80|1|47|53732.28|0.09|0.03|A|F|1994-02-22|1994-01-25|1994-02-24|TAKE BACK RETURN|RAIL|above the car +55333|1835|65|2|45|78157.35|0.03|0.01|R|F|1994-01-28|1993-12-23|1994-02-19|NONE|SHIP|cial theodolites. blithe +55333|249|50|3|28|32178.72|0.00|0.00|A|F|1994-01-15|1994-01-23|1994-02-04|DELIVER IN PERSON|SHIP|final requests must have to +55333|460|19|4|9|12244.14|0.02|0.04|A|F|1993-12-21|1994-01-16|1994-01-20|NONE|FOB|thy packag +55334|1427|45|1|25|33210.50|0.01|0.05|N|O|1997-06-25|1997-07-17|1997-07-17|DELIVER IN PERSON|AIR|y regular somas. carefully express +55334|740|41|2|42|68911.08|0.02|0.01|N|O|1997-06-03|1997-06-17|1997-06-04|COLLECT COD|REG AIR|. fluffily regular account +55334|967|2|3|14|26151.44|0.09|0.01|N|O|1997-07-13|1997-07-21|1997-08-02|NONE|RAIL|ular courts against the fluffy somas +55334|387|72|4|6|7724.28|0.07|0.08|N|O|1997-08-18|1997-08-04|1997-09-15|DELIVER IN PERSON|SHIP|pecial deposits use slyly. foxes na +55334|1281|19|5|36|42562.08|0.04|0.07|N|O|1997-05-16|1997-06-24|1997-06-06|COLLECT COD|TRUCK| requests. special instructions +55334|1363|40|6|21|26551.56|0.05|0.04|N|O|1997-05-27|1997-06-18|1997-06-05|TAKE BACK RETURN|RAIL|ounts are slyly about the iron +55335|1548|49|1|44|63779.76|0.10|0.02|R|F|1992-12-04|1992-10-29|1992-12-05|COLLECT COD|RAIL| foxes about +55335|1024|25|2|24|22200.48|0.08|0.01|R|F|1992-10-20|1992-11-13|1992-11-06|COLLECT COD|MAIL| theodolites cajole boldly against the +55335|1369|46|3|33|41921.88|0.07|0.07|R|F|1992-10-20|1992-11-29|1992-10-31|DELIVER IN PERSON|RAIL| quickly blithely thin foxes. slyly ev +55335|1015|16|4|10|9160.10|0.03|0.01|R|F|1992-12-26|1992-12-02|1993-01-08|DELIVER IN PERSON|FOB|ously accounts. even packag +55360|1362|1|1|1|1263.36|0.06|0.07|R|F|1994-02-25|1994-04-10|1994-03-26|COLLECT COD|TRUCK|atop the furiousl +55360|998|99|2|24|45575.76|0.01|0.02|A|F|1994-01-30|1994-04-19|1994-01-31|NONE|AIR|impress carefully +55360|1030|66|3|46|42827.38|0.09|0.02|A|F|1994-04-16|1994-04-20|1994-05-07|TAKE BACK RETURN|TRUCK|ending ideas. slyly special packa +55360|418|77|4|22|29005.02|0.10|0.03|R|F|1994-03-17|1994-04-19|1994-04-12|TAKE BACK RETURN|SHIP|coys. ironic ideas against th +55360|1474|75|5|12|16505.64|0.10|0.07|R|F|1994-05-08|1994-03-30|1994-05-15|COLLECT COD|REG AIR|ar requests. even orbits sleep +55360|373|74|6|5|6366.85|0.09|0.01|R|F|1994-02-10|1994-03-31|1994-03-01|DELIVER IN PERSON|SHIP|nto beans haggle alongsid +55360|111|12|7|43|43477.73|0.00|0.01|R|F|1994-02-16|1994-03-08|1994-03-08|NONE|AIR|g pinto beans against the unusu +55361|982|51|1|49|92266.02|0.04|0.07|N|O|1995-06-25|1995-04-24|1995-07-12|COLLECT COD|FOB|ven platelets are. bold excus +55361|1692|93|2|24|38248.56|0.04|0.01|R|F|1995-03-25|1995-06-08|1995-03-26|DELIVER IN PERSON|MAIL|ruthless deposits wake unusual +55361|213|95|3|41|45641.61|0.01|0.07|N|O|1995-07-17|1995-06-02|1995-07-29|COLLECT COD|SHIP|re according to the slyly p +55362|1241|53|1|28|31982.72|0.03|0.08|N|F|1995-06-15|1995-07-05|1995-06-25|TAKE BACK RETURN|RAIL| accounts haggle carefully furiousl +55362|1438|56|2|42|56256.06|0.02|0.06|N|O|1995-06-26|1995-07-01|1995-07-18|COLLECT COD|MAIL| foxes. even Tiresias a +55362|1192|93|3|45|49193.55|0.00|0.00|N|O|1995-07-12|1995-05-29|1995-07-19|DELIVER IN PERSON|FOB|ding deposits +55362|1821|22|4|37|63744.34|0.01|0.07|N|F|1995-05-31|1995-06-28|1995-06-30|COLLECT COD|RAIL| above the carefully careful dinos +55362|132|11|5|49|50574.37|0.10|0.08|R|F|1995-06-07|1995-06-18|1995-06-08|COLLECT COD|RAIL|instructions. slyly even pac +55363|790|91|1|48|81157.92|0.08|0.02|A|F|1994-03-22|1994-03-05|1994-04-21|COLLECT COD|MAIL|ccounts above the +55363|1157|58|2|9|9523.35|0.04|0.06|R|F|1994-03-11|1994-03-09|1994-03-13|NONE|SHIP| special b +55363|29|80|3|47|43663.94|0.10|0.02|R|F|1994-03-18|1994-03-23|1994-03-25|DELIVER IN PERSON|TRUCK|ag after t +55363|421|51|4|33|43606.86|0.05|0.08|R|F|1994-03-19|1994-02-07|1994-03-30|COLLECT COD|FOB|st the final r +55363|1056|92|5|15|14355.75|0.07|0.08|A|F|1994-03-29|1994-03-17|1994-04-02|NONE|AIR|arefully ruthless accounts. furiously +55364|1231|43|1|11|12454.53|0.05|0.06|N|O|1996-12-02|1996-12-12|1996-12-10|TAKE BACK RETURN|TRUCK| slyly across the furiously final realms. +55364|932|33|2|31|56820.83|0.01|0.04|N|O|1997-01-07|1996-11-25|1997-01-12|NONE|TRUCK|quickly unusual +55365|99|25|1|20|19981.80|0.06|0.05|N|O|1996-01-11|1996-02-05|1996-02-02|DELIVER IN PERSON|MAIL|he slyly ironic instructions. c +55365|1263|1|2|27|31435.02|0.05|0.05|N|O|1996-01-17|1996-04-05|1996-02-02|COLLECT COD|AIR|odolites. special ac +55365|350|79|3|29|36260.15|0.01|0.07|N|O|1996-03-12|1996-04-02|1996-03-28|COLLECT COD|SHIP|express acco +55365|910|11|4|45|81490.95|0.02|0.04|N|O|1996-03-09|1996-03-26|1996-03-14|COLLECT COD|MAIL|xcept the doggedly pe +55365|607|1|5|25|37690.00|0.02|0.04|N|O|1996-01-23|1996-03-13|1996-02-14|NONE|FOB|s-- asymptotes haggle ideas: quickly pend +55365|829|30|6|8|13838.56|0.00|0.06|N|O|1996-03-18|1996-03-23|1996-03-31|DELIVER IN PERSON|SHIP| requests. regular +55366|166|93|1|17|18124.72|0.06|0.08|A|F|1993-01-25|1993-01-01|1993-02-19|COLLECT COD|REG AIR|iously regular depo +55366|652|84|2|22|34158.30|0.01|0.04|A|F|1993-02-05|1992-11-29|1993-02-27|NONE|RAIL| accounts. quickly +55366|1113|22|3|38|38536.18|0.06|0.06|R|F|1993-01-21|1992-11-26|1993-01-25|DELIVER IN PERSON|RAIL|the packages. slyly regular pi +55367|434|64|1|34|45370.62|0.03|0.01|A|F|1994-03-06|1994-02-20|1994-03-15|NONE|AIR|nts. slyly ev +55367|118|71|2|37|37670.07|0.07|0.08|R|F|1994-03-27|1994-03-02|1994-04-18|DELIVER IN PERSON|RAIL|pending packages c +55367|55|31|3|24|22921.20|0.00|0.07|R|F|1994-01-15|1994-02-22|1994-02-09|COLLECT COD|SHIP|s. requests +55367|1062|33|4|8|7704.48|0.06|0.06|R|F|1994-01-16|1994-03-03|1994-01-26|NONE|REG AIR|y according to the quickly even pinto bean +55367|266|21|5|38|44317.88|0.02|0.01|R|F|1994-03-23|1994-04-08|1994-04-04|NONE|FOB|n pinto beans. unusual acc +55367|140|93|6|16|16642.24|0.10|0.00|A|F|1994-03-27|1994-02-25|1994-04-03|COLLECT COD|REG AIR|ss requests wak +55367|441|29|7|11|14755.84|0.05|0.00|R|F|1994-01-28|1994-03-01|1994-02-05|TAKE BACK RETURN|FOB|he even courts +55392|287|42|1|9|10685.52|0.10|0.01|A|F|1994-07-02|1994-08-21|1994-07-25|NONE|MAIL|, even pinto beans haggle f +55392|341|70|2|33|40964.22|0.08|0.08|A|F|1994-09-24|1994-08-10|1994-10-06|DELIVER IN PERSON|FOB| even theodolites. +55392|703|4|3|34|54525.80|0.10|0.04|A|F|1994-09-16|1994-07-07|1994-09-21|TAKE BACK RETURN|FOB|he dinos cajole c +55392|746|47|4|35|57635.90|0.07|0.00|A|F|1994-09-08|1994-07-08|1994-09-19|TAKE BACK RETURN|RAIL|ously ironic, express platel +55392|1318|57|5|49|59746.19|0.07|0.03|R|F|1994-08-29|1994-07-08|1994-09-27|TAKE BACK RETURN|REG AIR|ay. even, express pinto beans wa +55392|1479|19|6|20|27609.40|0.06|0.08|R|F|1994-08-14|1994-08-30|1994-09-12|TAKE BACK RETURN|AIR| the furiously regular dugouts. +55392|641|42|7|25|38541.00|0.06|0.06|A|F|1994-08-09|1994-08-21|1994-09-06|NONE|SHIP|ckly. furiously ironic pinto beans boost bl +55393|573|34|1|25|36839.25|0.07|0.07|N|O|1996-06-27|1996-07-20|1996-07-09|DELIVER IN PERSON|FOB|special ideas run blithely +55393|1141|14|2|42|43769.88|0.10|0.07|N|O|1996-07-20|1996-06-23|1996-08-18|NONE|TRUCK|posits. slyly final +55393|144|71|3|17|17750.38|0.07|0.08|N|O|1996-08-23|1996-07-30|1996-09-15|TAKE BACK RETURN|FOB| quickly unusual foxes +55393|808|9|4|16|27340.80|0.02|0.04|N|O|1996-06-13|1996-07-04|1996-06-22|DELIVER IN PERSON|REG AIR|beans wake +55394|1773|74|1|42|70340.34|0.00|0.08|A|F|1993-04-27|1993-04-26|1993-05-02|TAKE BACK RETURN|FOB| against the final requests grow blithely +55394|198|77|2|1|1098.19|0.04|0.04|R|F|1993-03-30|1993-05-19|1993-04-19|NONE|MAIL| ideas sleep blithely ruthless +55394|1308|23|3|17|20558.10|0.08|0.07|R|F|1993-06-04|1993-05-09|1993-07-01|DELIVER IN PERSON|TRUCK| accounts boost blithely express, +55394|269|51|4|23|26892.98|0.04|0.07|A|F|1993-03-23|1993-04-11|1993-04-14|COLLECT COD|FOB|ts cajole. blithely pendin +55394|882|49|5|1|1782.88|0.07|0.07|R|F|1993-05-10|1993-04-12|1993-05-24|DELIVER IN PERSON|RAIL|ronic platelets haggle after the caref +55395|1779|22|1|14|23530.78|0.08|0.00|R|F|1994-12-20|1995-01-02|1995-01-11|TAKE BACK RETURN|TRUCK|ar, special +55395|465|66|2|19|25943.74|0.09|0.05|R|F|1994-12-28|1994-12-08|1995-01-10|DELIVER IN PERSON|RAIL|uickly regular theodolites haggle caref +55396|180|81|1|17|18363.06|0.02|0.00|R|F|1994-08-05|1994-05-13|1994-08-09|COLLECT COD|TRUCK|phs. final theodolites sno +55396|639|71|2|18|27713.34|0.03|0.04|R|F|1994-04-09|1994-07-03|1994-04-11|NONE|AIR|kly unusual de +55396|153|54|3|17|17903.55|0.04|0.06|A|F|1994-06-07|1994-06-01|1994-06-10|TAKE BACK RETURN|REG AIR| cajole blithely quickly +55397|773|70|1|22|36822.94|0.06|0.06|R|F|1993-05-29|1993-06-25|1993-06-19|DELIVER IN PERSON|REG AIR|ending deposits try to haggle carefully fin +55397|7|58|2|13|11791.00|0.06|0.06|A|F|1993-06-21|1993-06-15|1993-07-07|DELIVER IN PERSON|REG AIR|haggle. requests are sly +55398|1807|37|1|11|18796.80|0.06|0.04|A|F|1993-05-22|1993-02-23|1993-06-12|TAKE BACK RETURN|FOB|s are finally q +55398|1689|90|2|32|50901.76|0.07|0.03|R|F|1993-01-29|1993-02-25|1993-02-07|DELIVER IN PERSON|REG AIR|longside of the ironic, spec +55398|336|21|3|27|33380.91|0.06|0.00|R|F|1993-02-13|1993-04-14|1993-03-10|TAKE BACK RETURN|REG AIR|larly unusual grouches +55398|1840|84|4|49|85350.16|0.07|0.07|A|F|1993-01-22|1993-04-03|1993-02-17|COLLECT COD|RAIL|es affix toward the +55398|1095|1|5|29|28886.61|0.06|0.05|R|F|1993-05-17|1993-03-17|1993-05-23|TAKE BACK RETURN|FOB|ld instructions integra +55399|654|86|1|8|12437.20|0.04|0.08|N|O|1996-06-08|1996-04-16|1996-06-19|COLLECT COD|TRUCK|s; blithe courts wake after the blithe +55399|1141|42|2|13|13547.82|0.01|0.03|N|O|1996-04-24|1996-04-27|1996-05-12|COLLECT COD|REG AIR|s sleep. packag +55399|1993|26|3|2|3789.98|0.00|0.08|N|O|1996-04-18|1996-04-18|1996-04-21|NONE|SHIP|cuses sleep above the sl +55399|1181|54|4|5|5410.90|0.01|0.03|N|O|1996-03-27|1996-05-03|1996-04-05|TAKE BACK RETURN|AIR|blithely express requests. deposits haggle +55399|965|66|5|14|26123.44|0.01|0.04|N|O|1996-03-04|1996-03-25|1996-03-15|NONE|FOB|lar asympt +55399|657|20|6|10|15576.50|0.05|0.04|N|O|1996-03-27|1996-03-20|1996-04-19|NONE|FOB|y about the quickly ironic theodolites. spe +55424|1613|37|1|23|34836.03|0.07|0.02|R|F|1993-04-04|1993-04-30|1993-04-29|DELIVER IN PERSON|SHIP|asymptotes. requests +55424|614|8|2|36|54525.96|0.06|0.04|R|F|1993-06-20|1993-05-11|1993-06-22|COLLECT COD|MAIL|c requests us +55424|650|13|3|23|35664.95|0.10|0.03|R|F|1993-06-09|1993-04-02|1993-06-11|COLLECT COD|TRUCK|. final, regular i +55424|1283|95|4|32|37896.96|0.02|0.02|R|F|1993-05-15|1993-05-04|1993-06-12|TAKE BACK RETURN|MAIL|e above the blithely even p +55424|787|84|5|4|6751.12|0.06|0.04|A|F|1993-04-06|1993-04-11|1993-04-10|NONE|REG AIR| accounts wake by the furiousl +55424|646|9|6|9|13919.76|0.08|0.07|R|F|1993-03-07|1993-04-24|1993-03-29|DELIVER IN PERSON|TRUCK| special excuses. deposits d +55424|364|65|7|22|27815.92|0.05|0.00|R|F|1993-03-05|1993-04-29|1993-04-02|NONE|RAIL|counts would are caref +55425|796|97|1|27|45813.33|0.04|0.02|N|O|1995-11-23|1995-12-09|1995-11-28|COLLECT COD|AIR|unts are quickly under the +55425|1500|1|2|10|14015.00|0.04|0.03|N|O|1995-11-07|1996-01-12|1995-11-10|COLLECT COD|SHIP|nal depend +55425|1732|75|3|28|45744.44|0.10|0.03|N|O|1996-01-12|1995-12-15|1996-01-31|DELIVER IN PERSON|AIR|sits wake slyly according to the quickly +55425|348|33|4|23|28711.82|0.07|0.04|N|O|1996-01-05|1996-01-23|1996-01-22|NONE|AIR|lar instructions are flu +55425|748|45|5|36|59354.64|0.04|0.05|N|O|1995-11-15|1996-01-11|1995-12-09|COLLECT COD|AIR|e carefully ironic requests. requests +55425|32|83|6|2|1864.06|0.09|0.06|N|O|1995-12-20|1996-01-25|1995-12-31|TAKE BACK RETURN|MAIL|ornis. slyly regular theod +55426|660|92|1|43|67108.38|0.01|0.02|N|O|1997-05-11|1997-02-27|1997-05-30|DELIVER IN PERSON|REG AIR|ular, ironic packages. hockey players use. +55426|500|88|2|8|11204.00|0.04|0.02|N|O|1997-02-23|1997-03-28|1997-03-09|TAKE BACK RETURN|MAIL|e furiously accounts. ca +55426|933|68|3|44|80692.92|0.09|0.04|N|O|1997-02-22|1997-03-14|1997-02-27|TAKE BACK RETURN|SHIP|nic foxes about the fluffily pen +55426|1078|79|4|4|3916.28|0.00|0.01|N|O|1997-02-08|1997-03-10|1997-03-07|NONE|FOB|ll sleep quickly slyly silent +55427|586|17|1|28|41624.24|0.00|0.07|N|O|1995-07-21|1995-08-15|1995-08-15|NONE|TRUCK|ronic dugouts cajo +55427|602|96|2|27|40570.20|0.04|0.04|N|O|1995-10-30|1995-09-01|1995-11-14|NONE|MAIL|ths use blithe +55427|1109|46|3|39|39393.90|0.02|0.03|N|O|1995-09-03|1995-09-22|1995-09-30|NONE|RAIL|e fluffily regular platelets. slyly fin +55427|429|59|4|4|5317.68|0.02|0.07|N|O|1995-10-04|1995-08-23|1995-10-15|DELIVER IN PERSON|RAIL|n requests. slyly +55428|121|74|1|46|46971.52|0.06|0.04|N|O|1996-10-03|1996-08-14|1996-11-02|TAKE BACK RETURN|TRUCK| nag slyly according to the regular, ex +55428|1197|34|2|45|49418.55|0.03|0.07|N|O|1996-07-17|1996-09-14|1996-08-07|TAKE BACK RETURN|AIR|y special req +55428|41|42|3|5|4705.20|0.03|0.02|N|O|1996-08-30|1996-09-19|1996-09-08|COLLECT COD|REG AIR|ges nag among +55428|977|80|4|12|22535.64|0.09|0.04|N|O|1996-07-08|1996-08-27|1996-07-20|COLLECT COD|REG AIR|ular deposits. care +55429|779|44|1|16|26876.32|0.02|0.06|R|F|1994-08-23|1994-09-08|1994-09-01|TAKE BACK RETURN|AIR|ed deposits sleep blithel +55429|1781|8|2|44|74042.32|0.00|0.04|A|F|1994-10-08|1994-09-21|1994-10-15|TAKE BACK RETURN|TRUCK|fully final instructions. quickly regula +55429|429|88|3|35|46529.70|0.02|0.00|A|F|1994-08-05|1994-09-09|1994-08-22|TAKE BACK RETURN|RAIL|. final deposits haggle. blithely unus +55429|1440|19|4|17|22804.48|0.05|0.00|A|F|1994-08-12|1994-09-10|1994-08-19|COLLECT COD|FOB|ully. ironic deposits integrat +55430|1843|44|1|13|22682.92|0.08|0.03|R|F|1994-09-11|1994-08-02|1994-10-04|COLLECT COD|MAIL|hely bold pa +55430|1493|33|2|26|36256.74|0.00|0.01|R|F|1994-08-29|1994-08-20|1994-09-27|NONE|FOB|structions are daringly-- slyly +55430|1401|41|3|41|53398.40|0.09|0.08|R|F|1994-07-03|1994-07-25|1994-07-08|DELIVER IN PERSON|TRUCK|inal deposits. furiously regular +55430|66|67|4|9|8694.54|0.01|0.00|A|F|1994-09-23|1994-07-18|1994-10-16|TAKE BACK RETURN|AIR|nticingly +55430|385|70|5|15|19280.70|0.06|0.05|A|F|1994-09-04|1994-07-11|1994-09-05|COLLECT COD|SHIP|eposits haggle for the s +55430|1501|22|6|42|58905.00|0.05|0.01|A|F|1994-09-28|1994-08-25|1994-10-08|DELIVER IN PERSON|RAIL|pending, regular packages +55431|1856|86|1|33|58009.05|0.00|0.06|R|F|1992-07-12|1992-08-28|1992-08-10|TAKE BACK RETURN|REG AIR|foxes among +55431|1243|44|2|17|19452.08|0.02|0.05|R|F|1992-10-08|1992-07-27|1992-10-16|COLLECT COD|RAIL|fter the express depths. regular, sil +55431|1838|25|3|38|66113.54|0.04|0.01|A|F|1992-09-30|1992-08-11|1992-10-28|TAKE BACK RETURN|TRUCK|lar requests cajole quickly ab +55431|763|28|4|31|51576.56|0.01|0.08|A|F|1992-07-28|1992-07-16|1992-08-17|TAKE BACK RETURN|FOB|. regular, even +55431|305|62|5|14|16874.20|0.09|0.03|R|F|1992-07-16|1992-08-14|1992-07-18|TAKE BACK RETURN|TRUCK|l theodolites use carefully. ironic dolp +55431|1625|49|6|5|7633.10|0.00|0.01|A|F|1992-06-11|1992-09-06|1992-06-29|NONE|TRUCK|final instructions hag +55456|1404|5|1|8|10443.20|0.00|0.04|A|F|1993-04-08|1993-03-31|1993-04-11|TAKE BACK RETURN|AIR|g the furiously bold requests. furiousl +55456|195|48|2|20|21903.80|0.09|0.00|R|F|1993-02-12|1993-03-29|1993-03-01|NONE|MAIL|ckages affix ironic deposits. care +55456|150|51|3|37|38855.55|0.01|0.04|A|F|1993-02-04|1993-03-18|1993-02-21|COLLECT COD|FOB|lithely regular pac +55456|779|76|4|31|52072.87|0.05|0.06|A|F|1993-02-05|1993-02-23|1993-02-21|DELIVER IN PERSON|SHIP|sts wake furiousl +55456|1390|67|5|18|23245.02|0.07|0.03|A|F|1993-04-05|1993-02-07|1993-04-11|TAKE BACK RETURN|SHIP| to use carefully after the +55457|318|47|1|18|21929.58|0.09|0.03|N|O|1996-11-02|1996-10-11|1996-11-26|COLLECT COD|MAIL| special deposits haggle qui +55457|1835|36|2|18|31262.94|0.00|0.08|N|O|1996-09-24|1996-10-11|1996-10-04|DELIVER IN PERSON|REG AIR|ructions alongside of the +55458|32|58|1|32|29824.96|0.07|0.06|A|F|1992-04-01|1992-05-19|1992-04-13|COLLECT COD|REG AIR|gle around the ironic instructions: +55458|1812|99|2|21|35990.01|0.08|0.06|R|F|1992-07-14|1992-04-22|1992-08-03|TAKE BACK RETURN|REG AIR|nic frays detect b +55458|1821|51|3|4|6891.28|0.03|0.05|A|F|1992-04-29|1992-05-17|1992-05-17|COLLECT COD|REG AIR|nts sleep quickly. quickly final ideas +55458|1844|31|4|9|15712.56|0.00|0.03|R|F|1992-06-23|1992-06-03|1992-06-29|COLLECT COD|RAIL|kly quickly final fo +55459|660|23|1|47|73351.02|0.00|0.07|R|F|1994-06-19|1994-06-06|1994-07-12|NONE|SHIP|ackages wake slyly furiously pe +55459|101|2|2|41|41045.10|0.10|0.06|R|F|1994-07-14|1994-07-10|1994-07-30|DELIVER IN PERSON|MAIL|ly sly deposits. silently unusual +55459|205|87|3|19|20998.80|0.00|0.07|R|F|1994-08-24|1994-06-29|1994-09-16|DELIVER IN PERSON|MAIL| foxes wake blithely ironic requests. spec +55459|289|90|4|11|13082.08|0.01|0.08|A|F|1994-06-02|1994-06-18|1994-06-26|NONE|RAIL|oxes. carefully bold foxes at the requests +55459|625|26|5|5|7628.10|0.04|0.05|R|F|1994-05-04|1994-06-10|1994-05-10|NONE|SHIP|lithely unusual deposits beyond the r +55460|1508|9|1|32|45104.00|0.08|0.06|R|F|1992-07-26|1992-08-04|1992-08-24|TAKE BACK RETURN|REG AIR|. furious foxes detect blithely alongside +55460|697|60|2|45|71896.05|0.00|0.05|R|F|1992-05-31|1992-07-12|1992-06-07|COLLECT COD|REG AIR|ake slyly pe +55460|1840|27|3|36|62706.24|0.06|0.08|R|F|1992-08-10|1992-07-11|1992-08-14|COLLECT COD|REG AIR|ccounts after the +55461|1994|83|1|30|56879.70|0.00|0.01|A|F|1994-11-06|1994-11-07|1994-11-08|NONE|AIR|ithely. express, regular +55461|820|21|2|46|79157.72|0.07|0.00|R|F|1995-01-21|1994-12-20|1995-02-19|DELIVER IN PERSON|MAIL|foxes impress ab +55461|170|71|3|10|10701.70|0.10|0.06|R|F|1994-10-24|1994-12-19|1994-10-26|NONE|FOB| regular dependencies sleep +55461|970|71|4|1|1870.97|0.05|0.03|A|F|1994-11-20|1994-12-12|1994-12-13|COLLECT COD|REG AIR|l deposits wa +55461|637|100|5|24|36903.12|0.02|0.06|R|F|1994-10-17|1994-11-25|1994-11-16|DELIVER IN PERSON|TRUCK|foxes use carefully regular accounts: even +55462|1106|7|1|47|47333.70|0.05|0.05|R|F|1992-05-03|1992-06-26|1992-06-02|NONE|MAIL|tructions wake f +55462|629|92|2|39|59655.18|0.08|0.00|R|F|1992-04-03|1992-06-02|1992-04-17|DELIVER IN PERSON|FOB|ly permanen +55462|1785|12|3|18|30362.04|0.02|0.01|R|F|1992-04-08|1992-05-25|1992-05-02|NONE|FOB|unusual de +55462|767|32|4|32|53368.32|0.02|0.00|A|F|1992-07-05|1992-05-26|1992-07-28|TAKE BACK RETURN|TRUCK|sits. fluffily bold +55462|1717|2|5|40|64748.40|0.06|0.00|A|F|1992-05-17|1992-06-26|1992-05-30|DELIVER IN PERSON|FOB|y ironic requests are +55462|1301|78|6|25|30057.50|0.09|0.07|R|F|1992-07-09|1992-06-11|1992-08-05|DELIVER IN PERSON|MAIL|. ideas wake fluffily fluffily fina +55463|1498|38|1|13|18193.37|0.01|0.06|R|F|1993-07-24|1993-08-08|1993-07-30|DELIVER IN PERSON|TRUCK|blithely regular ideas. +55488|1630|13|1|41|62796.83|0.00|0.05|N|O|1996-02-21|1996-05-04|1996-03-15|NONE|REG AIR|ges sublate fluffily ironic, final instr +55488|1627|10|2|37|56558.94|0.05|0.04|N|O|1996-05-21|1996-03-27|1996-06-06|TAKE BACK RETURN|RAIL|symptotes. pinto beans wake bl +55488|1618|60|3|47|71421.67|0.01|0.03|N|O|1996-03-20|1996-03-31|1996-04-12|COLLECT COD|MAIL|le slyly. carefully final gifts sleep +55488|458|17|4|20|27169.00|0.00|0.08|N|O|1996-04-07|1996-05-09|1996-04-24|NONE|REG AIR| somas wake carefully about th +55489|162|15|1|4|4248.64|0.03|0.06|N|O|1996-08-19|1996-08-18|1996-08-23|DELIVER IN PERSON|SHIP|ove the bold deposits. carefully b +55489|261|43|2|14|16257.64|0.01|0.05|N|O|1996-08-13|1996-09-19|1996-08-27|TAKE BACK RETURN|FOB|al accounts? express accounts us +55489|290|45|3|28|33328.12|0.00|0.04|N|O|1996-07-27|1996-09-15|1996-07-30|COLLECT COD|SHIP| blithe deposits are before the unu +55490|1991|80|1|42|79505.58|0.04|0.07|R|F|1995-03-16|1994-12-24|1995-03-17|TAKE BACK RETURN|REG AIR|ages. blithely regular ideas among the q +55490|433|34|2|20|26668.60|0.09|0.00|R|F|1995-01-21|1995-02-14|1995-01-24|COLLECT COD|RAIL|final asymptote +55490|1309|10|3|46|55673.80|0.02|0.05|R|F|1995-02-03|1994-12-18|1995-02-06|DELIVER IN PERSON|FOB|ironic waters maintain car +55490|1143|16|4|23|24015.22|0.04|0.03|A|F|1995-01-07|1994-12-24|1995-01-28|TAKE BACK RETURN|RAIL|sits against the slyly regul +55491|1989|78|1|5|9454.90|0.08|0.06|N|O|1995-08-16|1995-07-12|1995-08-28|NONE|TRUCK|ly regular theodo +55491|1974|7|2|5|9379.85|0.03|0.03|N|F|1995-05-22|1995-06-21|1995-06-21|DELIVER IN PERSON|MAIL| quickly silent packages kindle slyly +55491|1794|37|3|46|78006.34|0.01|0.06|N|O|1995-07-06|1995-06-25|1995-07-16|DELIVER IN PERSON|SHIP|usly special accounts. qu +55492|1179|88|1|31|33485.27|0.07|0.00|N|O|1995-10-22|1995-12-12|1995-11-07|NONE|AIR|uffily abo +55492|642|43|2|28|43193.92|0.04|0.02|N|O|1995-10-11|1995-11-12|1995-10-18|COLLECT COD|REG AIR|accounts sleep fluffily about the ironic, i +55492|1760|45|3|50|83088.00|0.01|0.01|N|O|1995-12-21|1995-10-28|1995-12-30|DELIVER IN PERSON|SHIP|the stealthy +55492|745|46|4|19|31269.06|0.06|0.07|N|O|1995-12-19|1995-12-14|1996-01-11|COLLECT COD|MAIL|f the slyly even theodolites are bl +55493|112|39|1|25|25302.75|0.04|0.07|R|F|1993-12-27|1993-11-10|1994-01-18|COLLECT COD|RAIL|ys cajole furiously above the f +55493|57|33|2|9|8613.45|0.09|0.02|A|F|1994-01-04|1993-10-16|1994-01-29|DELIVER IN PERSON|TRUCK|xes. slyly even i +55494|746|79|1|27|44461.98|0.08|0.01|R|F|1992-08-15|1992-07-31|1992-08-18|NONE|MAIL|nts. quickly bold war +55494|264|65|2|27|31435.02|0.04|0.00|R|F|1992-09-28|1992-07-30|1992-10-05|COLLECT COD|REG AIR|es. blithely special packag +55494|296|97|3|14|16748.06|0.02|0.03|R|F|1992-08-07|1992-09-14|1992-08-17|TAKE BACK RETURN|AIR|carefully ironic ideas are beside th +55494|1809|10|4|14|23951.20|0.02|0.06|A|F|1992-10-17|1992-08-20|1992-10-26|NONE|REG AIR|nic forges nag blithely fluffily clos +55494|1178|51|5|30|32375.10|0.10|0.03|A|F|1992-08-24|1992-09-23|1992-09-05|NONE|AIR|t the ideas. furiously un +55494|1685|27|6|49|77747.32|0.07|0.06|R|F|1992-08-02|1992-09-02|1992-08-24|COLLECT COD|SHIP|ironic excuses affix furiously alongsid +55494|166|67|7|33|35183.28|0.03|0.07|A|F|1992-07-05|1992-08-29|1992-08-02|COLLECT COD|RAIL| after the slyly express instru +55495|174|75|1|28|30076.76|0.04|0.08|N|O|1996-07-24|1996-08-08|1996-08-13|COLLECT COD|AIR|sits haggle. packages nag slyl +55495|392|77|2|7|9046.73|0.05|0.02|N|O|1996-09-15|1996-08-19|1996-10-10|TAKE BACK RETURN|AIR|ccounts. brave, pen +55495|1375|52|3|27|34461.99|0.02|0.06|N|O|1996-09-02|1996-07-02|1996-09-10|NONE|AIR|tect blithely regular requests. final p +55495|171|50|4|16|17138.72|0.01|0.07|N|O|1996-08-17|1996-08-08|1996-09-01|COLLECT COD|RAIL|al, bold excuses. careful +55520|857|57|1|49|86134.65|0.06|0.01|N|O|1995-07-02|1995-06-25|1995-07-10|COLLECT COD|TRUCK|eposits. carefully idle +55520|1475|15|2|18|24776.46|0.04|0.04|R|F|1995-05-15|1995-07-21|1995-05-21|COLLECT COD|REG AIR|slyly carefu +55521|970|71|1|44|82322.68|0.01|0.04|N|O|1997-07-09|1997-08-12|1997-07-29|COLLECT COD|FOB| packages. final accounts nod carefu +55521|199|52|2|15|16487.85|0.00|0.02|N|O|1997-08-24|1997-08-17|1997-08-28|TAKE BACK RETURN|AIR|ter the qu +55522|258|13|1|2|2316.50|0.09|0.00|A|F|1994-07-23|1994-08-02|1994-08-10|TAKE BACK RETURN|AIR| fluffily un +55522|1219|31|2|8|8961.68|0.04|0.07|R|F|1994-07-07|1994-09-13|1994-07-20|DELIVER IN PERSON|SHIP|le special theodolites. furio +55522|52|53|3|14|13328.70|0.01|0.07|A|F|1994-09-12|1994-09-15|1994-09-15|NONE|REG AIR|ld accounts. accounts above the fluf +55523|379|64|1|14|17911.18|0.01|0.00|N|O|1998-08-22|1998-07-09|1998-08-26|COLLECT COD|TRUCK|lites. asymptotes cajole blithe +55523|427|28|2|35|46459.70|0.05|0.00|N|O|1998-07-18|1998-07-13|1998-08-08|COLLECT COD|AIR|refully final reques +55524|1775|60|1|14|23474.78|0.08|0.04|N|O|1996-02-26|1995-12-31|1996-03-22|TAKE BACK RETURN|FOB|haggle carefully silently ironic pack +55524|253|81|2|42|48436.50|0.05|0.01|N|O|1995-12-26|1996-01-13|1996-01-13|COLLECT COD|FOB|nt foxes wake slyly +55525|727|28|1|40|65108.80|0.04|0.00|R|F|1994-07-28|1994-07-18|1994-08-20|DELIVER IN PERSON|MAIL|dugouts cajole ac +55525|954|23|2|11|20404.45|0.08|0.04|A|F|1994-05-20|1994-07-08|1994-05-29|DELIVER IN PERSON|MAIL|e slyly ironic accounts. pending, final pa +55525|1358|73|3|32|40299.20|0.10|0.08|A|F|1994-07-26|1994-06-11|1994-08-03|DELIVER IN PERSON|SHIP|cross the furiously regular exc +55525|1465|5|4|47|64223.62|0.00|0.00|A|F|1994-08-27|1994-06-08|1994-09-05|NONE|TRUCK| unusual orbits. ac +55525|667|61|5|17|26650.22|0.09|0.08|R|F|1994-06-11|1994-06-08|1994-06-19|DELIVER IN PERSON|REG AIR|gside of the blithe +55526|685|48|1|40|63427.20|0.00|0.00|A|F|1992-10-12|1992-09-11|1992-10-21|NONE|MAIL|uick dependencies affix express, reg +55526|1979|80|2|34|63952.98|0.09|0.03|R|F|1992-10-23|1992-09-17|1992-11-09|NONE|MAIL| slyly blithely even tithes. furio +55526|706|3|3|14|22493.80|0.01|0.06|R|F|1992-07-17|1992-08-22|1992-07-31|TAKE BACK RETURN|RAIL|ackages. ironic +55526|1977|22|4|10|18789.70|0.05|0.00|A|F|1992-09-21|1992-09-12|1992-10-21|COLLECT COD|TRUCK|ly final instruct +55526|1451|30|5|28|37868.60|0.08|0.02|R|F|1992-07-23|1992-09-19|1992-08-20|NONE|MAIL|press, final foxes sleep ca +55526|831|65|6|42|72736.86|0.08|0.06|A|F|1992-09-29|1992-08-12|1992-10-18|DELIVER IN PERSON|AIR|ymptotes affix +55527|547|78|1|45|65139.30|0.02|0.06|N|O|1997-11-20|1997-08-25|1997-12-06|TAKE BACK RETURN|REG AIR|blithely final deposits +55527|479|9|2|44|60696.68|0.01|0.04|N|O|1997-11-19|1997-09-06|1997-12-12|DELIVER IN PERSON|REG AIR| ideas integrate slyly. unusual, r +55552|557|48|1|25|36438.75|0.00|0.06|N|O|1996-11-07|1996-11-19|1996-11-14|TAKE BACK RETURN|SHIP|lent requests +55552|611|12|2|15|22674.15|0.01|0.01|N|O|1997-01-10|1996-12-28|1997-01-21|DELIVER IN PERSON|RAIL|ding to the carefully regu +55552|1812|99|3|42|71980.02|0.06|0.07|N|O|1996-12-30|1997-01-06|1997-01-28|TAKE BACK RETURN|RAIL|ructions. slyly even requests ac +55553|336|37|1|14|17308.62|0.04|0.08|A|F|1994-10-23|1994-10-11|1994-11-14|COLLECT COD|SHIP|ose permanently final accounts. carefully +55553|1743|86|2|32|52631.68|0.04|0.01|A|F|1994-08-02|1994-10-15|1994-08-08|DELIVER IN PERSON|SHIP|carefully. express pi +55553|581|12|3|22|32594.76|0.02|0.00|R|F|1994-07-20|1994-10-03|1994-07-21|NONE|FOB|t the carefull +55553|1986|31|4|13|24543.74|0.09|0.01|R|F|1994-10-28|1994-10-14|1994-11-17|COLLECT COD|MAIL|lar instruc +55554|1885|15|1|16|28590.08|0.06|0.04|R|F|1994-12-21|1995-01-09|1995-01-04|DELIVER IN PERSON|REG AIR|slyly according to the +55554|1624|7|2|23|35089.26|0.07|0.03|R|F|1995-03-04|1995-01-31|1995-03-11|DELIVER IN PERSON|RAIL|e slyly express platelets believe careful +55554|1100|6|3|43|43047.30|0.01|0.03|A|F|1994-12-19|1995-01-31|1994-12-28|COLLECT COD|TRUCK|usly. furiously ironic requests above +55554|156|9|4|28|29572.20|0.01|0.04|R|F|1994-12-16|1995-02-11|1995-01-01|COLLECT COD|MAIL|sts. slyly final pinto beans mold furious +55554|352|81|5|35|43832.25|0.07|0.02|A|F|1995-01-11|1995-01-09|1995-02-04|TAKE BACK RETURN|SHIP|tions. regular packages are pending, bold e +55554|288|43|6|39|46342.92|0.10|0.08|A|F|1994-12-25|1995-01-15|1995-01-24|DELIVER IN PERSON|SHIP| accounts would nag fluffily aroun +55554|1061|97|7|7|6734.42|0.03|0.08|A|F|1994-12-15|1995-01-26|1994-12-16|DELIVER IN PERSON|RAIL|ly even deposits are doggedly unusual h +55555|1247|59|1|50|57412.00|0.01|0.06|N|O|1997-12-27|1998-01-22|1998-01-16|NONE|MAIL|the fluffily ironic deposits +55555|1996|85|2|8|15183.92|0.10|0.02|N|O|1998-01-27|1998-01-22|1998-01-28|DELIVER IN PERSON|REG AIR| dolphins affix even theo +55556|1283|95|1|13|15395.64|0.02|0.05|N|O|1996-02-11|1996-02-07|1996-03-05|TAKE BACK RETURN|TRUCK|dolites detect furiously blithel +55556|66|42|2|16|15456.96|0.10|0.07|N|O|1996-01-05|1996-02-09|1996-01-23|TAKE BACK RETURN|TRUCK| blithely. packages nag furiou +55556|494|53|3|45|62752.05|0.05|0.01|N|O|1995-11-30|1996-02-07|1995-12-02|TAKE BACK RETURN|FOB|gle across the quickly bold deposit +55557|1366|67|1|46|58298.56|0.01|0.02|N|O|1997-05-13|1997-03-07|1997-06-10|NONE|RAIL|deas nag blithe platelets. quickly +55557|779|12|2|10|16797.70|0.01|0.04|N|O|1997-03-06|1997-04-01|1997-03-12|COLLECT COD|MAIL|ccounts above the furiously speci +55557|656|50|3|3|4669.95|0.04|0.01|N|O|1997-03-15|1997-04-21|1997-04-13|COLLECT COD|FOB|uriously even dep +55557|924|59|4|3|5474.76|0.05|0.07|N|O|1997-04-22|1997-05-04|1997-05-13|COLLECT COD|RAIL|e blithely final dugouts. slyly regu +55558|517|18|1|15|21262.65|0.02|0.07|A|F|1993-11-28|1993-10-25|1993-12-24|TAKE BACK RETURN|TRUCK|s. final, express accounts wake +55558|1556|57|2|2|2915.10|0.05|0.07|A|F|1993-09-10|1993-10-18|1993-09-27|TAKE BACK RETURN|TRUCK|above the ironic, final idea +55559|241|69|1|5|5706.20|0.04|0.03|N|O|1997-12-03|1997-11-02|1998-01-01|NONE|MAIL|gular excuses dazzle fluffily pla +55559|392|21|2|25|32309.75|0.07|0.05|N|O|1997-12-29|1997-11-24|1998-01-13|DELIVER IN PERSON|REG AIR| even warthogs. deposits sleep fluff +55559|561|62|3|31|45308.36|0.03|0.02|N|O|1997-11-17|1997-11-27|1997-12-12|TAKE BACK RETURN|FOB|ackages. blithely unu +55559|1673|97|4|25|39366.75|0.06|0.04|N|O|1998-01-02|1997-12-01|1998-01-12|COLLECT COD|AIR|s. theodolites haggle. furiously final acc +55559|408|67|5|3|3925.20|0.02|0.01|N|O|1997-11-28|1997-12-01|1997-12-02|COLLECT COD|AIR|lly final requests. packages +55584|1729|72|1|36|58705.92|0.00|0.01|N|O|1996-06-23|1996-04-20|1996-06-27|NONE|AIR|express deposits grow among the final, +55584|1135|36|2|44|45589.72|0.10|0.07|N|O|1996-03-14|1996-05-23|1996-04-04|DELIVER IN PERSON|RAIL|structions. express dugout +55585|1967|100|1|42|78496.32|0.03|0.05|N|O|1997-02-28|1997-04-07|1997-03-06|DELIVER IN PERSON|RAIL| are fluffily about the c +55586|584|85|1|30|44537.40|0.01|0.04|N|O|1998-06-29|1998-06-25|1998-07-20|TAKE BACK RETURN|REG AIR|counts: regular accounts impr +55586|150|51|2|44|46206.60|0.05|0.01|N|O|1998-06-13|1998-06-30|1998-06-16|TAKE BACK RETURN|AIR|y bold instructions. +55586|768|1|3|45|75094.20|0.05|0.06|N|O|1998-05-21|1998-06-28|1998-06-13|DELIVER IN PERSON|TRUCK|lly express instructio +55586|1088|94|4|11|10879.88|0.01|0.00|N|O|1998-06-16|1998-06-30|1998-07-12|COLLECT COD|RAIL|ers are quickly carefully unusu +55587|1933|66|1|18|33028.74|0.00|0.01|R|F|1993-11-06|1993-08-28|1993-11-22|NONE|MAIL|r the final packages. furiously final pa +55587|917|18|2|17|30904.47|0.01|0.06|R|F|1993-08-16|1993-09-18|1993-09-01|DELIVER IN PERSON|REG AIR|special accounts sleep quickly o +55588|1035|71|1|19|17784.57|0.06|0.05|R|F|1993-06-27|1993-06-12|1993-07-05|COLLECT COD|AIR|mise furiously pending depen +55588|1632|33|2|16|24538.08|0.04|0.08|A|F|1993-03-18|1993-06-13|1993-03-27|DELIVER IN PERSON|MAIL|nly special theodolites cajol +55588|49|100|3|28|26573.12|0.03|0.02|A|F|1993-04-14|1993-05-15|1993-05-05|DELIVER IN PERSON|FOB|leep blithely ironic packages. fur +55588|348|5|4|49|61168.66|0.03|0.04|A|F|1993-07-12|1993-06-10|1993-07-28|NONE|MAIL|quickly accounts. furiou +55588|160|87|5|46|48767.36|0.10|0.01|R|F|1993-06-08|1993-06-07|1993-06-17|TAKE BACK RETURN|RAIL|se across th +55588|136|15|6|42|43517.46|0.04|0.05|A|F|1993-04-17|1993-06-07|1993-04-29|COLLECT COD|SHIP|ut the requests +55588|79|55|7|7|6853.49|0.05|0.04|A|F|1993-06-21|1993-04-20|1993-07-21|TAKE BACK RETURN|SHIP| special somas! even +55589|719|84|1|37|59929.27|0.01|0.00|A|F|1993-04-06|1993-05-03|1993-04-22|NONE|REG AIR|e fluffily unusual the +55590|1735|36|1|40|65469.20|0.01|0.06|N|O|1997-04-11|1997-03-13|1997-04-15|NONE|AIR| furiously against t +55590|266|94|2|6|6997.56|0.02|0.08|N|O|1997-03-11|1997-02-17|1997-03-12|COLLECT COD|MAIL| furiously busy foxes. pe +55590|196|75|3|41|44943.79|0.00|0.07|N|O|1997-03-25|1997-02-01|1997-04-23|DELIVER IN PERSON|AIR| fluffily i +55591|977|46|1|27|50705.19|0.03|0.04|N|O|1997-09-10|1997-09-02|1997-09-12|COLLECT COD|MAIL|nic foxes. somas against the ca +55591|659|53|2|3|4678.95|0.06|0.03|N|O|1997-09-05|1997-09-27|1997-09-16|NONE|AIR| ironic dolphins sl +55591|1134|7|3|12|12421.56|0.09|0.02|N|O|1997-08-29|1997-10-31|1997-09-26|NONE|TRUCK|. accounts wake above the sl +55591|1076|12|4|5|4885.35|0.00|0.01|N|O|1997-10-01|1997-09-03|1997-10-25|COLLECT COD|REG AIR|ithely even epitaphs. final instructions r +55591|1159|32|5|5|5300.75|0.08|0.05|N|O|1997-10-21|1997-09-23|1997-10-26|NONE|REG AIR|ironic, speci +55591|1196|69|6|22|24138.18|0.07|0.07|N|O|1997-08-30|1997-10-07|1997-09-26|NONE|TRUCK|permanently sil +55591|622|85|7|22|33497.64|0.07|0.05|N|O|1997-08-16|1997-10-13|1997-09-03|DELIVER IN PERSON|FOB|ound the slyly +55616|621|53|1|20|30432.40|0.03|0.07|A|F|1995-05-18|1995-06-16|1995-06-14|COLLECT COD|REG AIR|grate carefully +55616|1290|28|2|35|41695.15|0.08|0.02|N|O|1995-09-02|1995-07-22|1995-09-08|TAKE BACK RETURN|RAIL|ss requests +55616|455|14|3|6|8132.70|0.01|0.03|R|F|1995-05-11|1995-06-15|1995-06-05|TAKE BACK RETURN|RAIL|s requests engage carefully blithely fi +55616|35|11|4|44|41141.32|0.10|0.00|N|O|1995-07-08|1995-07-10|1995-07-12|TAKE BACK RETURN|AIR| deposits. fina +55617|396|53|1|45|58337.55|0.08|0.05|N|O|1998-08-22|1998-09-02|1998-08-30|TAKE BACK RETURN|AIR|ites integrate furiously ironic ideas +55617|220|48|2|44|49289.68|0.10|0.04|N|O|1998-09-22|1998-09-13|1998-09-30|COLLECT COD|RAIL|uffily regular +55617|682|83|3|7|11078.76|0.10|0.04|N|O|1998-09-24|1998-08-10|1998-09-25|DELIVER IN PERSON|TRUCK|usly above the excuses. forges along +55617|460|48|4|10|13604.60|0.10|0.00|N|O|1998-07-13|1998-09-18|1998-08-12|COLLECT COD|SHIP|o beans cajole express depos +55617|1545|86|5|49|70880.46|0.07|0.08|N|O|1998-09-28|1998-08-11|1998-10-01|COLLECT COD|REG AIR|ts sublate gifts. furiously ex +55617|610|73|6|43|64956.23|0.10|0.04|N|O|1998-09-22|1998-08-06|1998-10-09|DELIVER IN PERSON|SHIP|efully regular multipliers wake. slyly reg +55617|1705|32|7|2|3213.40|0.02|0.06|N|O|1998-09-16|1998-08-20|1998-09-26|TAKE BACK RETURN|AIR|unts integrate caref +55618|1636|60|1|44|67655.72|0.05|0.06|A|F|1992-02-26|1992-03-12|1992-02-29|TAKE BACK RETURN|SHIP|xpress, pending t +55618|93|19|2|45|44689.05|0.08|0.00|A|F|1992-03-08|1992-02-26|1992-03-25|NONE|FOB|sly idle requests h +55618|1121|94|3|25|25553.00|0.05|0.03|A|F|1992-02-27|1992-04-08|1992-03-20|NONE|SHIP|ly after t +55618|1676|100|4|7|11043.69|0.07|0.02|R|F|1992-05-15|1992-02-29|1992-05-29|COLLECT COD|TRUCK|e even instructions haggl +55618|154|55|5|23|24245.45|0.09|0.01|A|F|1992-05-16|1992-04-19|1992-05-25|COLLECT COD|AIR|odolites cajole fina +55618|463|51|6|32|43630.72|0.04|0.07|R|F|1992-02-04|1992-04-06|1992-02-26|NONE|REG AIR|. accounts slee +55619|665|59|1|8|12525.28|0.06|0.06|N|O|1998-01-03|1998-01-02|1998-01-26|COLLECT COD|MAIL|y ironic instructi +55619|1567|8|2|27|39651.12|0.01|0.03|N|O|1997-11-24|1998-01-20|1997-11-29|NONE|TRUCK| the deposits- +55619|1771|98|3|46|76947.42|0.08|0.02|N|O|1998-01-17|1998-02-12|1998-01-31|DELIVER IN PERSON|MAIL|ven pinto beans slee +55619|141|42|4|33|34357.62|0.08|0.04|N|O|1998-01-02|1997-12-29|1998-01-16|TAKE BACK RETURN|MAIL|use carefully specia +55620|1762|89|1|2|3327.52|0.03|0.07|N|O|1998-01-14|1998-03-31|1998-01-25|DELIVER IN PERSON|REG AIR|unusual courts +55621|1592|33|1|18|26884.62|0.08|0.03|N|O|1995-06-25|1995-05-10|1995-07-13|NONE|SHIP| affix blithely blithely ironic ac +55621|1030|66|2|21|19551.63|0.06|0.04|N|O|1995-06-20|1995-06-13|1995-07-01|TAKE BACK RETURN|AIR|oss the furiously +55621|1066|67|3|11|10637.66|0.04|0.04|N|O|1995-07-06|1995-05-16|1995-07-09|NONE|SHIP|lar pinto beans w +55621|1085|21|4|34|33526.72|0.05|0.06|A|F|1995-04-16|1995-06-05|1995-04-23|NONE|REG AIR|osits haggle some +55621|504|95|5|28|39326.00|0.07|0.00|R|F|1995-05-17|1995-06-09|1995-05-20|TAKE BACK RETURN|MAIL|y even asymptotes alongside of the +55622|1101|38|1|9|9018.90|0.04|0.00|R|F|1994-10-09|1994-11-20|1994-11-03|NONE|TRUCK|eep carefully alongside of the fl +55623|914|83|1|31|56262.21|0.06|0.00|R|F|1992-12-02|1992-12-30|1992-12-28|NONE|AIR|cial ideas. regular, regul +55623|1286|98|2|12|14247.36|0.00|0.01|A|F|1993-01-27|1992-12-17|1993-01-28|NONE|TRUCK|above the slyly regula +55623|1158|31|3|15|15887.25|0.03|0.08|R|F|1993-01-17|1992-11-12|1993-01-24|DELIVER IN PERSON|AIR|unts. carefull +55623|117|44|4|3|3051.33|0.05|0.06|A|F|1992-12-09|1992-12-05|1992-12-19|NONE|AIR|t. final dolphins are blithely after the ir +55648|350|79|1|41|51264.35|0.02|0.06|A|F|1994-12-20|1994-11-03|1994-12-21|NONE|AIR|l excuses detect slyly r +55648|1395|10|2|21|27224.19|0.08|0.02|R|F|1994-11-03|1994-10-13|1994-11-30|TAKE BACK RETURN|MAIL| even pearls detect bold, final th +55648|1408|48|3|20|26188.00|0.02|0.08|A|F|1994-10-05|1994-11-22|1994-10-09|TAKE BACK RETURN|MAIL|sits. blithely +55648|1412|30|4|17|22327.97|0.10|0.02|R|F|1994-10-31|1994-10-14|1994-11-08|NONE|REG AIR|ven foxes. blithel +55648|744|41|5|29|47697.46|0.07|0.07|A|F|1995-01-09|1994-11-05|1995-02-05|TAKE BACK RETURN|MAIL|t furiously after +55648|6|82|6|47|42582.00|0.00|0.07|A|F|1994-09-13|1994-11-16|1994-09-29|TAKE BACK RETURN|TRUCK|its. blithely ironic requests +55648|1454|55|7|47|63706.15|0.01|0.05|A|F|1994-12-18|1994-11-18|1994-12-23|COLLECT COD|FOB|s sleep fluffily r +55649|811|11|1|35|59913.35|0.10|0.00|N|O|1998-01-30|1998-03-02|1998-02-01|TAKE BACK RETURN|AIR|ackages snooze furiously a +55649|233|61|2|29|32863.67|0.10|0.00|N|O|1998-01-27|1998-04-16|1998-02-21|DELIVER IN PERSON|RAIL|asymptotes print carefully except the +55649|808|9|3|5|8544.00|0.04|0.07|N|O|1998-05-01|1998-04-16|1998-05-31|DELIVER IN PERSON|MAIL|kly carefully regular epitaphs. slyly ir +55649|1260|35|4|4|4645.04|0.01|0.03|N|O|1998-03-09|1998-04-08|1998-03-16|DELIVER IN PERSON|SHIP|ans. furiously pending instruct +55649|1802|89|5|23|39187.40|0.02|0.03|N|O|1998-03-25|1998-02-28|1998-04-13|DELIVER IN PERSON|TRUCK|affix blithely accordin +55649|308|65|6|2|2416.60|0.09|0.03|N|O|1998-04-08|1998-03-27|1998-04-15|TAKE BACK RETURN|REG AIR|he even reque +55650|1305|44|1|17|20507.10|0.01|0.06|N|O|1995-12-28|1995-12-27|1996-01-14|NONE|TRUCK|t the regular ideas boost quickly at +55651|742|75|1|44|72280.56|0.08|0.02|A|F|1992-04-26|1992-04-17|1992-05-04|DELIVER IN PERSON|TRUCK|g the packag +55651|879|80|2|46|81874.02|0.00|0.07|R|F|1992-04-07|1992-05-22|1992-04-27|TAKE BACK RETURN|RAIL|unusual pinto beans. deposits +55651|840|40|3|7|12185.88|0.10|0.04|A|F|1992-06-13|1992-04-23|1992-06-22|TAKE BACK RETURN|TRUCK| express pinto beans cajole +55651|1284|85|4|27|32002.56|0.00|0.05|R|F|1992-05-09|1992-05-15|1992-05-30|DELIVER IN PERSON|SHIP|nal accounts +55651|937|6|5|22|40434.46|0.03|0.07|R|F|1992-03-31|1992-04-16|1992-04-28|NONE|RAIL|en pinto beans sleep above the final, ex +55651|536|97|6|27|38786.31|0.01|0.00|R|F|1992-06-01|1992-04-10|1992-06-09|COLLECT COD|FOB|ly regular platele +55651|605|6|7|41|61729.60|0.01|0.06|R|F|1992-06-25|1992-05-10|1992-07-05|NONE|FOB| unusual theod +55652|1291|29|1|23|27422.67|0.08|0.06|R|F|1994-01-16|1994-02-14|1994-01-22|DELIVER IN PERSON|TRUCK|y along the slyly regular ideas. bli +55652|505|6|2|2|2811.00|0.01|0.00|A|F|1994-01-14|1994-03-03|1994-01-19|COLLECT COD|RAIL| blithely +55653|101|28|1|9|9009.90|0.04|0.00|R|F|1993-12-19|1994-01-05|1994-01-10|NONE|MAIL|haggle furiously silent h +55653|340|41|2|15|18605.10|0.06|0.04|R|F|1993-12-14|1994-01-14|1993-12-20|COLLECT COD|REG AIR|ly ironic platel +55653|1309|10|3|6|7261.80|0.03|0.03|R|F|1994-01-15|1993-12-30|1994-01-25|NONE|SHIP|he slyly unusual pinto beans +55653|142|95|4|32|33348.48|0.03|0.08|A|F|1994-01-15|1994-01-23|1994-01-23|COLLECT COD|FOB|old courts across the slyly daring +55654|1989|22|1|4|7563.92|0.02|0.08|A|F|1993-10-31|1993-10-22|1993-11-12|TAKE BACK RETURN|MAIL|p carefully final grouc +55654|1866|96|2|32|56571.52|0.01|0.03|R|F|1993-12-14|1993-10-27|1993-12-20|TAKE BACK RETURN|TRUCK| stealthily iron +55654|1416|17|3|29|38204.89|0.02|0.05|A|F|1993-12-08|1993-11-24|1993-12-27|COLLECT COD|MAIL|ges. furiously unusual instructions among +55655|834|34|1|42|72862.86|0.01|0.08|A|F|1993-01-20|1992-11-05|1993-02-03|TAKE BACK RETURN|AIR|sts sleep +55655|17|43|2|35|32095.35|0.09|0.08|A|F|1993-01-18|1992-12-22|1993-01-20|DELIVER IN PERSON|AIR|ep. regular asymp +55655|1166|75|3|25|26679.00|0.08|0.03|A|F|1992-12-16|1992-11-01|1992-12-22|TAKE BACK RETURN|RAIL|y bold theodolites use quickly? regular a +55655|1550|71|4|33|47901.15|0.06|0.05|A|F|1992-10-01|1992-11-18|1992-10-26|COLLECT COD|RAIL|ronic waters. qui +55655|1762|5|5|41|68214.16|0.05|0.02|A|F|1992-11-02|1992-10-30|1992-11-21|DELIVER IN PERSON|SHIP| quickly pending packages after the slyly p +55655|812|46|6|31|53097.11|0.05|0.02|R|F|1993-01-19|1992-11-10|1993-02-18|DELIVER IN PERSON|MAIL|gular accounts. slyly regular sauternes caj +55680|187|14|1|6|6523.08|0.00|0.07|R|F|1992-09-02|1992-08-24|1992-09-29|DELIVER IN PERSON|AIR|. express, final notornis across t +55681|1420|60|1|8|10571.36|0.05|0.02|N|O|1996-10-05|1996-10-28|1996-10-14|COLLECT COD|MAIL| the unusual, regular cour +55682|399|100|1|36|46778.04|0.07|0.07|R|F|1995-01-13|1995-02-04|1995-01-14|DELIVER IN PERSON|TRUCK|oxes was quickly. furiously unusual acc +55683|1261|36|1|32|37192.32|0.08|0.00|R|F|1992-08-27|1992-10-03|1992-09-05|TAKE BACK RETURN|MAIL|kly ironic requests sleep slyly +55683|1965|98|2|1|1866.96|0.00|0.06|A|F|1992-10-07|1992-08-25|1992-10-25|TAKE BACK RETURN|RAIL|ly final accounts alongside +55683|1593|14|3|44|65761.96|0.00|0.04|R|F|1992-09-03|1992-09-23|1992-09-19|COLLECT COD|RAIL|nal asymptotes. carefull +55683|541|32|4|18|25947.72|0.07|0.00|R|F|1992-10-09|1992-09-18|1992-10-10|COLLECT COD|REG AIR|. express request +55683|1681|5|5|19|30070.92|0.07|0.02|R|F|1992-09-07|1992-09-18|1992-09-25|DELIVER IN PERSON|REG AIR|sts. packages boost alongside of the +55683|1701|2|6|16|25643.20|0.08|0.03|A|F|1992-07-31|1992-08-20|1992-08-04|DELIVER IN PERSON|TRUCK|l packages. f +55683|1125|98|7|12|12313.44|0.10|0.03|A|F|1992-10-13|1992-10-11|1992-11-11|COLLECT COD|RAIL| sleep blithely above the express platel +55684|194|95|1|20|21883.80|0.10|0.03|N|O|1995-06-19|1995-05-27|1995-06-25|TAKE BACK RETURN|RAIL|ideas are f +55684|142|95|2|29|30222.06|0.00|0.02|R|F|1995-05-21|1995-05-22|1995-06-01|NONE|RAIL|ously express +55685|315|72|1|40|48612.40|0.04|0.05|A|F|1992-11-24|1993-01-02|1992-12-14|DELIVER IN PERSON|AIR|unusual deposits. regular, regu +55685|268|23|2|21|24533.46|0.09|0.00|A|F|1992-10-14|1992-12-24|1992-10-28|COLLECT COD|FOB|sly permanent deposits above the carefully +55686|583|84|1|27|40056.66|0.07|0.02|R|F|1995-04-12|1995-06-03|1995-05-10|DELIVER IN PERSON|AIR|pendencies wake +55686|811|11|2|6|10270.86|0.04|0.07|N|O|1995-07-08|1995-05-31|1995-07-12|TAKE BACK RETURN|MAIL|ounts. slyly regular accounts us +55686|491|50|3|45|62617.05|0.01|0.08|A|F|1995-04-01|1995-05-03|1995-04-28|COLLECT COD|AIR|slyly bold requests are thi +55686|1903|36|4|48|86635.20|0.06|0.00|N|O|1995-07-11|1995-05-02|1995-07-23|DELIVER IN PERSON|FOB|uctions. slyly furio +55686|1810|40|5|44|75319.64|0.02|0.06|R|F|1995-04-05|1995-06-18|1995-04-08|NONE|SHIP| along the speci +55686|1599|40|6|20|30011.80|0.05|0.07|N|O|1995-07-20|1995-06-21|1995-07-27|COLLECT COD|RAIL|r, regular platelet +55686|85|36|7|49|48268.92|0.02|0.05|N|O|1995-07-07|1995-05-05|1995-07-10|NONE|MAIL|y across the blithely unusual excuses +55687|555|86|1|32|46577.60|0.04|0.00|R|F|1992-10-28|1993-01-14|1992-11-11|COLLECT COD|FOB| deposits. doggedly unusual asymptote +55712|1220|21|1|15|16818.30|0.10|0.04|N|O|1997-02-21|1996-12-23|1997-03-19|NONE|SHIP|ly regular reque +55712|1179|88|2|31|33485.27|0.06|0.06|N|O|1997-03-06|1997-01-13|1997-03-09|COLLECT COD|RAIL|ven accounts. bold, expres +55713|578|69|1|22|32528.54|0.04|0.00|A|F|1994-04-02|1994-04-06|1994-04-14|TAKE BACK RETURN|TRUCK|regular packages boost fluffi +55713|1618|1|2|40|60784.40|0.09|0.03|A|F|1994-05-23|1994-04-29|1994-05-29|TAKE BACK RETURN|SHIP|lyly bold i +55713|1533|74|3|41|58815.73|0.08|0.03|A|F|1994-05-08|1994-03-19|1994-06-01|TAKE BACK RETURN|FOB|usly. account +55713|669|1|4|33|51798.78|0.08|0.05|R|F|1994-04-29|1994-03-20|1994-05-09|NONE|FOB|according to the slyly ev +55713|1705|6|5|43|69088.10|0.09|0.01|A|F|1994-05-02|1994-05-03|1994-05-14|TAKE BACK RETURN|RAIL|efully even instructions. fluffily +55713|1780|23|6|11|18499.58|0.06|0.02|A|F|1994-03-29|1994-04-11|1994-04-22|TAKE BACK RETURN|FOB| regular theodol +55713|778|79|7|48|80580.96|0.01|0.06|A|F|1994-06-01|1994-04-01|1994-06-28|DELIVER IN PERSON|RAIL|de of the carefully furious packa +55714|1341|18|1|43|53420.62|0.05|0.08|N|O|1997-06-06|1997-07-06|1997-06-28|COLLECT COD|MAIL|. enticing requests haggle silently across +55714|1831|32|2|7|12129.81|0.04|0.05|N|O|1997-09-28|1997-07-08|1997-10-10|NONE|FOB|final deposits +55715|871|5|1|22|38981.14|0.10|0.04|R|F|1995-04-06|1995-05-11|1995-04-30|COLLECT COD|FOB|etect blithe +55715|18|69|2|7|6426.07|0.02|0.04|N|F|1995-06-09|1995-06-30|1995-06-24|DELIVER IN PERSON|FOB|endencies about +55716|1293|68|1|11|13137.19|0.04|0.06|R|F|1992-12-14|1992-11-22|1992-12-31|NONE|MAIL|le along the even pinto b +55716|701|2|2|36|57661.20|0.04|0.07|A|F|1992-12-31|1992-12-26|1993-01-23|COLLECT COD|TRUCK|ng pinto beans. ironic instructions thra +55717|860|60|1|13|22891.18|0.03|0.05|R|F|1992-05-05|1992-03-24|1992-05-14|COLLECT COD|AIR| pending requ +55718|850|51|1|21|36767.85|0.10|0.01|N|O|1997-10-01|1997-09-14|1997-10-02|COLLECT COD|FOB|ounts. fluffily ev +55718|1429|8|2|7|9312.94|0.01|0.06|N|O|1997-07-08|1997-09-06|1997-07-22|DELIVER IN PERSON|TRUCK| nag busily. slyly final excuses cajole b +55718|296|78|3|25|29907.25|0.02|0.07|N|O|1997-10-05|1997-08-09|1997-10-30|TAKE BACK RETURN|MAIL|ickly special deposits use slyly iron +55718|1801|2|4|5|8514.00|0.10|0.06|N|O|1997-09-12|1997-08-28|1997-09-17|TAKE BACK RETURN|REG AIR|es. pinto bea +55718|737|70|5|44|72060.12|0.02|0.05|N|O|1997-07-08|1997-08-13|1997-08-03|TAKE BACK RETURN|RAIL|egular, bold orb +55718|207|89|6|6|6643.20|0.06|0.04|N|O|1997-07-25|1997-08-06|1997-08-07|NONE|TRUCK|uctions. account +55719|1133|70|1|27|27921.51|0.05|0.03|A|F|1992-12-23|1992-12-20|1993-01-02|TAKE BACK RETURN|REG AIR|ly against the carefully fin +55744|820|21|1|2|3441.64|0.05|0.08|N|O|1995-11-20|1995-12-14|1995-12-18|COLLECT COD|REG AIR|requests eat furiously regular theodolite +55744|1287|99|2|1|1188.28|0.10|0.00|N|O|1995-10-29|1996-01-18|1995-11-25|DELIVER IN PERSON|MAIL|l packages. foxes lo +55744|129|30|3|17|17495.04|0.02|0.07|N|O|1996-02-13|1995-11-25|1996-02-22|COLLECT COD|MAIL| packages. foxes thra +55744|219|20|4|45|50364.45|0.00|0.05|N|O|1996-01-03|1995-12-05|1996-01-15|TAKE BACK RETURN|SHIP|sts according +55744|1554|35|5|36|52399.80|0.07|0.01|N|O|1996-01-16|1995-12-05|1996-01-18|TAKE BACK RETURN|MAIL|cajole quickly. slyly i +55744|822|22|6|32|55130.24|0.07|0.07|N|O|1995-12-26|1996-01-17|1995-12-30|NONE|MAIL|es hang fluff +55745|285|40|1|27|32002.56|0.04|0.01|A|F|1994-04-09|1994-03-31|1994-04-17|NONE|FOB|indle carefully a +55745|626|89|2|3|4579.86|0.05|0.03|R|F|1994-02-20|1994-04-26|1994-03-03|TAKE BACK RETURN|MAIL|nts. fluffily ironic foxe +55745|618|50|3|6|9111.66|0.04|0.05|R|F|1994-03-24|1994-04-10|1994-04-02|COLLECT COD|FOB|es sleep. slyly special platel +55745|62|38|4|20|19241.20|0.05|0.01|R|F|1994-02-23|1994-05-03|1994-03-05|NONE|TRUCK|kages. blithely regular pinto beans d +55745|1020|56|5|6|5526.12|0.09|0.07|R|F|1994-03-24|1994-04-04|1994-04-12|NONE|SHIP|nic platelets are blithely furiousl +55746|1003|74|1|20|18080.00|0.05|0.06|R|F|1994-09-30|1994-08-14|1994-10-12|DELIVER IN PERSON|SHIP|bt silently even waters. special notorn +55746|730|63|2|9|14676.57|0.00|0.05|A|F|1994-08-07|1994-08-12|1994-08-25|TAKE BACK RETURN|FOB|efully. busy theodolites boost sly +55747|1213|14|1|19|21169.99|0.08|0.06|A|F|1992-12-10|1993-02-14|1992-12-14|NONE|FOB|ackages about the blithely final courts +55747|1976|77|2|7|13145.79|0.10|0.03|A|F|1993-03-19|1993-01-21|1993-04-06|NONE|SHIP|s. express deposit +55747|717|14|3|24|38825.04|0.06|0.08|A|F|1993-02-12|1993-02-08|1993-03-13|COLLECT COD|MAIL|equests are furiously against the plat +55747|244|99|4|23|26317.52|0.03|0.06|A|F|1993-01-22|1993-02-13|1993-02-09|COLLECT COD|SHIP|ular accounts. close +55748|523|54|1|41|58364.32|0.03|0.03|N|O|1995-08-27|1995-11-03|1995-09-02|DELIVER IN PERSON|AIR|the quickly even accounts detect +55748|1391|68|2|42|54280.38|0.08|0.03|N|O|1995-12-08|1995-09-21|1995-12-25|COLLECT COD|MAIL|heodolites. foxes aro +55749|420|21|1|39|51496.38|0.08|0.03|R|F|1992-05-26|1992-06-12|1992-06-08|TAKE BACK RETURN|SHIP| blithely final deposits use fluffily pendi +55749|1957|2|2|29|53909.55|0.07|0.08|A|F|1992-06-21|1992-07-15|1992-07-12|DELIVER IN PERSON|MAIL|e regular idea +55750|634|35|1|34|52177.42|0.10|0.05|R|F|1993-11-25|1993-10-28|1993-12-23|TAKE BACK RETURN|FOB|ajole regular deposits. blithely special de +55750|859|93|2|12|21118.20|0.08|0.06|A|F|1993-11-26|1993-10-16|1993-12-19|TAKE BACK RETURN|FOB|s sleep carefully. ca +55750|1282|57|3|23|27215.44|0.08|0.06|R|F|1993-12-25|1993-10-18|1994-01-06|DELIVER IN PERSON|AIR|es. blithely final packag +55750|1780|81|4|31|52135.18|0.07|0.08|R|F|1993-10-26|1993-10-04|1993-11-17|NONE|MAIL|sits around +55750|503|4|5|46|64561.00|0.05|0.03|R|F|1993-12-23|1993-10-14|1994-01-16|TAKE BACK RETURN|AIR|heodolites. quickly fluffy instruc +55751|652|84|1|17|26395.05|0.07|0.00|N|O|1997-12-24|1998-02-20|1998-01-19|NONE|RAIL|uriously final account +55751|1185|94|2|16|17378.88|0.05|0.04|N|O|1998-04-02|1998-01-31|1998-05-02|DELIVER IN PERSON|AIR|ss theodolites boost? fluffily si +55751|1784|11|3|34|57316.52|0.04|0.03|N|O|1998-01-03|1998-01-09|1998-01-13|DELIVER IN PERSON|MAIL|ix along the furiously stealthy excuse +55776|121|22|1|10|10211.20|0.03|0.01|R|F|1994-04-10|1994-06-14|1994-05-01|TAKE BACK RETURN|REG AIR| theodolites. carefully +55776|1066|72|2|31|29978.86|0.10|0.01|A|F|1994-04-18|1994-05-28|1994-04-30|DELIVER IN PERSON|SHIP|sly quick deposits. carefully +55776|371|56|3|31|39412.47|0.10|0.08|A|F|1994-06-20|1994-04-30|1994-06-27|NONE|MAIL|s. unusual, unusual ideas aro +55777|1999|32|1|4|7603.96|0.00|0.01|R|F|1992-12-10|1992-12-13|1993-01-02|NONE|SHIP|ickly ironic courts. fu +55777|1740|83|2|18|29551.32|0.10|0.00|R|F|1993-02-23|1993-01-31|1993-03-03|DELIVER IN PERSON|FOB|the packages. s +55777|1466|84|3|37|50596.02|0.00|0.04|A|F|1993-01-27|1992-12-22|1993-02-17|COLLECT COD|RAIL|nto beans. unusual pac +55778|902|71|1|5|9014.50|0.08|0.00|N|O|1997-07-04|1997-06-26|1997-07-27|TAKE BACK RETURN|SHIP|fully above the special +55779|322|51|1|39|47670.48|0.05|0.01|R|F|1992-05-01|1992-05-01|1992-05-10|TAKE BACK RETURN|MAIL|carefully ca +55779|1458|76|2|6|8156.70|0.00|0.08|R|F|1992-06-09|1992-04-21|1992-07-04|TAKE BACK RETURN|AIR|ainments cajole blithely around the fur +55779|503|94|3|2|2807.00|0.01|0.03|R|F|1992-04-26|1992-05-21|1992-05-19|DELIVER IN PERSON|MAIL|leep blithely. +55779|528|29|4|46|65711.92|0.03|0.08|R|F|1992-04-30|1992-04-15|1992-05-26|TAKE BACK RETURN|AIR| regular deposits. blithely bold notorni +55780|866|67|1|39|68907.54|0.05|0.03|N|O|1997-12-07|1998-01-03|1997-12-30|DELIVER IN PERSON|RAIL|ts are quickly carefully +55780|1690|73|2|15|23875.35|0.05|0.01|N|O|1997-10-30|1998-01-02|1997-11-22|NONE|RAIL|fily pending packages use. quickly special +55780|1038|74|3|8|7512.24|0.03|0.04|N|O|1998-01-01|1998-01-02|1998-01-14|NONE|REG AIR|ke slyly after the silent dep +55780|1366|5|4|15|19010.40|0.00|0.08|N|O|1997-12-27|1997-11-30|1998-01-22|DELIVER IN PERSON|RAIL|ar platelets. silent pinto beans pr +55780|1514|95|5|30|42465.30|0.06|0.01|N|O|1998-01-26|1998-01-09|1998-02-10|NONE|MAIL|ly final pinto +55781|478|66|1|45|62031.15|0.03|0.04|N|O|1996-12-23|1997-02-10|1997-01-06|TAKE BACK RETURN|SHIP|s detect final, thin requests. ironic, +55782|1425|4|1|47|62341.74|0.07|0.03|N|O|1997-08-14|1997-10-21|1997-08-27|DELIVER IN PERSON|TRUCK|ular somas nod +55783|1800|1|1|28|47650.40|0.01|0.05|N|O|1996-07-30|1996-09-12|1996-07-31|NONE|RAIL|counts. furio +55783|1544|25|2|22|31801.88|0.09|0.03|N|O|1996-07-29|1996-10-01|1996-08-25|NONE|RAIL|ts. sheaves above the quickly pending +55808|1764|49|1|8|13326.08|0.06|0.03|A|F|1995-05-10|1995-04-12|1995-05-20|COLLECT COD|REG AIR|jole final deposits. dependencies use +55808|345|74|2|31|38605.54|0.06|0.08|R|F|1995-03-23|1995-04-30|1995-04-03|NONE|MAIL|ular courts. bold, even dolphins are. final +55808|413|43|3|38|49909.58|0.02|0.06|A|F|1995-05-12|1995-04-17|1995-06-03|DELIVER IN PERSON|FOB|ed to nag furiously express packages. qu +55808|1172|81|4|9|9658.53|0.05|0.00|A|F|1995-04-04|1995-03-19|1995-04-09|TAKE BACK RETURN|TRUCK|cross the regular packages. final, pe +55808|1738|39|5|19|31154.87|0.03|0.08|N|F|1995-06-16|1995-04-22|1995-07-15|NONE|MAIL|he regular accounts. carefull +55808|994|29|6|45|85274.55|0.10|0.08|R|F|1995-04-12|1995-04-13|1995-04-15|NONE|MAIL|press requests. slyly sile +55808|1153|90|7|31|32678.65|0.03|0.00|A|F|1995-02-16|1995-04-05|1995-02-24|DELIVER IN PERSON|REG AIR| notornis boos +55809|1156|93|1|39|41228.85|0.01|0.07|N|O|1995-10-20|1995-11-11|1995-11-04|NONE|REG AIR|oss the even instruc +55809|868|2|2|12|21226.32|0.03|0.07|N|O|1995-10-29|1995-11-25|1995-11-03|DELIVER IN PERSON|MAIL|tithes. ironic deposits integrate above th +55809|600|61|3|48|72028.80|0.08|0.06|N|O|1995-09-29|1995-12-01|1995-10-05|TAKE BACK RETURN|TRUCK|ic instructions above the quickly even f +55809|1735|78|4|1|1636.73|0.06|0.05|N|O|1996-01-08|1995-10-29|1996-01-17|DELIVER IN PERSON|REG AIR|of the fluffily even instructions sleep +55809|90|91|5|9|8910.81|0.05|0.08|N|O|1995-11-05|1995-11-19|1995-11-23|TAKE BACK RETURN|REG AIR|pending deposits along the +55810|762|27|1|36|59859.36|0.10|0.08|N|O|1996-08-05|1996-06-14|1996-08-14|TAKE BACK RETURN|REG AIR|e fluffily regular pinto bean +55810|468|56|2|21|28737.66|0.09|0.00|N|O|1996-04-27|1996-07-06|1996-04-28|NONE|SHIP|ajole even accou +55810|479|9|3|27|37245.69|0.07|0.05|N|O|1996-06-08|1996-05-09|1996-06-14|NONE|FOB|lites detect blithely. carefully +55810|1806|93|4|49|83682.20|0.10|0.08|N|O|1996-06-15|1996-05-11|1996-06-24|DELIVER IN PERSON|RAIL|ctions. quickly bold request +55810|1218|19|5|14|15668.94|0.04|0.03|N|O|1996-07-27|1996-07-01|1996-07-29|TAKE BACK RETURN|RAIL|y final ideas above th +55810|1324|63|6|31|37984.92|0.00|0.05|N|O|1996-04-23|1996-05-27|1996-05-16|TAKE BACK RETURN|REG AIR| pinto beans. carefully fin +55811|810|77|1|47|80408.07|0.10|0.00|N|O|1998-09-27|1998-07-13|1998-10-26|COLLECT COD|FOB| of the even packages. slyly expr +55812|1610|11|1|48|72557.28|0.02|0.00|R|F|1994-01-06|1993-12-08|1994-01-31|DELIVER IN PERSON|SHIP|lithely regular requests could +55812|1941|86|2|44|81089.36|0.07|0.06|R|F|1993-11-17|1994-01-18|1993-12-08|COLLECT COD|AIR|g to the ironic, pending dolphins. +55812|737|34|3|28|45856.44|0.03|0.06|A|F|1994-01-18|1994-01-24|1994-02-11|COLLECT COD|MAIL|nding, unusual asymptotes. iron +55812|675|38|4|35|55148.45|0.04|0.00|A|F|1993-12-12|1994-01-24|1994-01-01|DELIVER IN PERSON|TRUCK|s wake carefull +55813|1969|58|1|41|76709.36|0.04|0.03|A|F|1992-09-04|1992-09-24|1992-10-02|NONE|TRUCK|ithely. blithel +55813|1176|77|2|33|35546.61|0.02|0.08|A|F|1992-08-16|1992-10-01|1992-09-05|NONE|AIR|osits. fluffily special excuses are car +55813|1009|80|3|31|28210.00|0.03|0.08|A|F|1992-08-25|1992-10-27|1992-09-13|COLLECT COD|TRUCK|above the carefully furious deposit +55813|398|99|4|33|42846.87|0.07|0.03|A|F|1992-09-21|1992-09-28|1992-10-05|COLLECT COD|REG AIR| asymptotes. blithely +55813|1700|1|5|26|41644.20|0.07|0.04|A|F|1992-10-02|1992-09-06|1992-10-25|DELIVER IN PERSON|TRUCK|uests. carefully unusual e +55814|219|74|1|22|24622.62|0.06|0.08|R|F|1993-08-29|1993-10-21|1993-09-10|NONE|SHIP|al deposits. carefu +55814|1473|52|2|43|59102.21|0.01|0.07|R|F|1993-09-27|1993-10-10|1993-10-01|NONE|TRUCK| the carefull +55815|938|39|1|16|29422.88|0.10|0.03|A|F|1995-04-05|1995-02-17|1995-04-11|TAKE BACK RETURN|TRUCK|nto beans snooze carefully ex +55815|567|68|2|26|38156.56|0.02|0.07|R|F|1995-03-07|1995-03-04|1995-03-31|COLLECT COD|SHIP|ar deposits boost slyly even packages. s +55815|629|23|3|24|36710.88|0.04|0.08|A|F|1995-04-23|1995-03-22|1995-04-25|TAKE BACK RETURN|RAIL|en ideas. f +55815|1732|17|4|1|1633.73|0.09|0.05|R|F|1995-05-08|1995-03-09|1995-05-26|COLLECT COD|RAIL| courts cajole fluffily final pac +55815|330|31|5|32|39370.56|0.03|0.04|R|F|1995-03-20|1995-03-22|1995-03-21|COLLECT COD|MAIL|accounts through the theodolites +55815|509|10|6|9|12685.50|0.08|0.05|R|F|1995-03-06|1995-02-28|1995-03-29|TAKE BACK RETURN|MAIL| carefully spe +55815|75|51|7|25|24376.75|0.04|0.07|A|F|1995-05-11|1995-03-23|1995-05-14|COLLECT COD|SHIP|: carefully pending t +55840|1001|2|1|33|29766.00|0.08|0.03|A|F|1994-10-27|1994-10-02|1994-11-07|NONE|FOB|fily unusual +55840|1064|70|2|28|27021.68|0.03|0.00|A|F|1994-10-27|1994-10-24|1994-11-01|TAKE BACK RETURN|TRUCK|e quickly final tithes nag alongside o +55840|274|2|3|13|15265.51|0.02|0.02|A|F|1994-12-07|1994-10-01|1994-12-29|TAKE BACK RETURN|TRUCK|thely regular accounts use idly ironic, b +55840|1009|15|4|9|8190.00|0.10|0.03|A|F|1994-08-23|1994-10-11|1994-09-18|NONE|REG AIR|s x-ray pending +55840|1829|73|5|12|20769.84|0.00|0.00|R|F|1994-09-14|1994-11-04|1994-09-23|COLLECT COD|REG AIR|egular depths. final +55841|1129|38|1|36|37084.32|0.02|0.02|N|O|1996-11-16|1997-01-22|1996-12-11|COLLECT COD|AIR|ar packages haggle furiously: stealt +55842|49|100|1|45|42706.80|0.00|0.02|N|O|1996-04-23|1996-04-04|1996-05-20|TAKE BACK RETURN|REG AIR|y regular e +55842|1505|6|2|6|8439.00|0.07|0.01|N|O|1996-05-14|1996-05-24|1996-05-26|DELIVER IN PERSON|SHIP|ts alongside of the ex +55842|1718|19|3|48|77746.08|0.03|0.08|N|O|1996-05-26|1996-04-24|1996-06-09|TAKE BACK RETURN|AIR| express idea +55842|1773|74|4|2|3349.54|0.01|0.05|N|O|1996-04-10|1996-04-24|1996-04-28|TAKE BACK RETURN|FOB|long the reques +55842|633|27|5|28|42941.64|0.06|0.02|N|O|1996-04-28|1996-04-29|1996-05-26|DELIVER IN PERSON|SHIP|sly ironic, unusual accounts. pending p +55842|1541|42|6|18|25965.72|0.06|0.08|N|O|1996-05-17|1996-05-18|1996-06-13|DELIVER IN PERSON|MAIL|even theodolites a +55842|1434|52|7|48|64100.64|0.08|0.00|N|O|1996-03-07|1996-04-09|1996-04-05|DELIVER IN PERSON|REG AIR|deposits nag carefully around the +55843|879|13|1|13|23138.31|0.02|0.01|N|O|1995-06-25|1995-05-21|1995-07-04|NONE|RAIL|tes wake closely after the slyl +55844|1722|7|1|3|4871.16|0.04|0.05|N|O|1996-01-18|1996-01-23|1996-01-27|TAKE BACK RETURN|RAIL|ckly enticing foxes. special requests h +55844|429|30|2|33|43870.86|0.07|0.00|N|O|1996-01-01|1996-01-29|1996-01-10|DELIVER IN PERSON|RAIL|st blithely furiously e +55845|411|99|1|1|1311.41|0.01|0.08|N|O|1995-09-09|1995-10-02|1995-09-18|NONE|MAIL|carefully ironic foxes. carefully final +55845|1577|58|2|38|56185.66|0.02|0.06|N|O|1995-08-24|1995-08-21|1995-09-10|DELIVER IN PERSON|FOB|, final requests nag carefully about t +55845|1874|75|3|28|49724.36|0.00|0.08|N|O|1995-10-20|1995-09-06|1995-11-02|TAKE BACK RETURN|TRUCK|thely ironic theodolites nag quick +55845|1887|74|4|32|57244.16|0.00|0.00|N|O|1995-09-03|1995-10-13|1995-09-29|COLLECT COD|SHIP|s would nag carefully ac +55846|1882|26|1|5|8919.40|0.05|0.00|R|F|1994-09-20|1994-10-19|1994-10-07|COLLECT COD|REG AIR|ly express packages. furiously close depos +55847|1538|39|1|40|57581.20|0.01|0.04|A|F|1994-09-22|1994-09-19|1994-10-15|TAKE BACK RETURN|RAIL|efully final accounts. fin +55847|1860|47|2|19|33475.34|0.08|0.03|R|F|1994-09-18|1994-09-08|1994-10-04|TAKE BACK RETURN|RAIL|are furiously a +55872|1273|85|1|43|50493.61|0.05|0.02|R|F|1994-02-25|1994-01-27|1994-03-04|NONE|TRUCK|ly carefully ironic +55873|1143|52|1|35|36544.90|0.04|0.05|N|O|1996-01-11|1996-01-30|1996-01-27|TAKE BACK RETURN|SHIP| pearls-- furiously +55873|1877|21|2|30|53366.10|0.04|0.04|N|O|1996-01-26|1996-01-10|1996-02-08|NONE|RAIL|. carefully enticing pinto beans boo +55873|1889|76|3|33|59099.04|0.08|0.02|N|O|1996-01-23|1996-02-11|1996-01-30|DELIVER IN PERSON|REG AIR|e slyly. pend +55873|609|41|4|45|67932.00|0.01|0.07|N|O|1996-02-16|1996-02-10|1996-02-23|COLLECT COD|MAIL|tions among the packages are +55873|414|15|5|31|40746.71|0.03|0.03|N|O|1996-02-13|1996-01-19|1996-03-07|COLLECT COD|REG AIR|s. carefully unusual accounts haggle. ac +55873|922|91|6|31|56510.52|0.07|0.01|N|O|1996-02-11|1995-12-21|1996-02-15|DELIVER IN PERSON|AIR|. carefully even d +55873|1410|50|7|38|49833.58|0.02|0.04|N|O|1995-12-17|1996-02-01|1996-01-04|TAKE BACK RETURN|MAIL|d the regul +55874|15|41|1|1|915.01|0.05|0.03|R|F|1994-03-14|1994-05-11|1994-04-07|TAKE BACK RETURN|REG AIR|y. packages bo +55874|149|50|2|45|47211.30|0.04|0.01|A|F|1994-03-29|1994-04-22|1994-04-26|COLLECT COD|SHIP|t quickly regular depos +55874|56|7|3|23|21989.15|0.01|0.07|A|F|1994-03-02|1994-05-16|1994-03-11|COLLECT COD|SHIP| blithely special asymptotes bo +55874|719|16|4|10|16197.10|0.01|0.04|R|F|1994-03-11|1994-05-04|1994-04-03|TAKE BACK RETURN|RAIL|es against the slyly furious packa +55874|30|56|5|9|8370.27|0.05|0.02|R|F|1994-05-25|1994-05-05|1994-06-09|NONE|AIR|. special, ironic deposits around the +55874|537|38|6|11|15812.83|0.10|0.00|R|F|1994-04-10|1994-04-07|1994-04-27|DELIVER IN PERSON|SHIP|e even accounts. ironic ideas use quickly a +55875|1037|73|1|38|35645.14|0.02|0.02|A|F|1995-03-22|1995-01-04|1995-04-02|COLLECT COD|REG AIR|y regular requests dazzle slyly. special +55875|869|36|2|25|44246.50|0.06|0.05|R|F|1995-01-05|1995-01-26|1995-01-15|COLLECT COD|FOB|lithely bold +55876|488|76|1|36|49985.28|0.06|0.02|N|O|1997-12-03|1997-12-13|1997-12-14|DELIVER IN PERSON|MAIL|slyly; blithely reg +55876|228|29|2|14|15795.08|0.04|0.06|N|O|1997-11-24|1997-12-06|1997-11-30|NONE|TRUCK|e to affix above the thinly final asympto +55876|1893|80|3|47|84359.83|0.07|0.03|N|O|1997-11-20|1997-11-07|1997-12-06|DELIVER IN PERSON|RAIL| cajole quickly alon +55877|964|65|1|2|3729.92|0.07|0.01|R|F|1993-06-01|1993-04-19|1993-06-27|COLLECT COD|SHIP|fily among the ideas. fi +55877|1025|96|2|27|25002.54|0.09|0.02|R|F|1993-05-20|1993-04-13|1993-06-04|NONE|RAIL|s sleep flu +55877|1050|56|3|22|20923.10|0.09|0.07|R|F|1993-02-23|1993-04-25|1993-03-05|NONE|MAIL| special court +55877|330|31|4|11|13533.63|0.07|0.02|R|F|1993-02-23|1993-04-24|1993-03-22|DELIVER IN PERSON|SHIP|usly regular platelets caj +55877|517|18|5|26|36855.26|0.09|0.06|A|F|1993-02-25|1993-03-23|1993-03-03|COLLECT COD|RAIL|osits. carefully regula +55877|18|44|6|43|39474.43|0.09|0.06|R|F|1993-05-13|1993-04-01|1993-05-28|NONE|REG AIR|around the accounts. ironi +55877|733|30|7|41|66982.93|0.07|0.05|R|F|1993-04-07|1993-04-08|1993-05-03|NONE|MAIL|regular foxes. slyly ironic deposits cajole +55878|778|11|1|7|11751.39|0.02|0.08|N|O|1995-06-20|1995-06-28|1995-06-25|TAKE BACK RETURN|TRUCK|gle quickly along the even deposits. b +55878|869|69|2|2|3539.72|0.05|0.03|N|O|1995-07-17|1995-06-05|1995-07-28|DELIVER IN PERSON|RAIL|eposits. expre +55879|1646|47|1|28|43333.92|0.09|0.02|R|F|1994-07-13|1994-06-13|1994-08-01|NONE|FOB|lites. quickly pending req +55904|146|47|1|50|52307.00|0.00|0.06|A|F|1993-04-12|1993-06-06|1993-04-23|TAKE BACK RETURN|RAIL|ial, pending accounts unwind slyly. regul +55904|1621|22|2|38|57859.56|0.05|0.08|R|F|1993-06-01|1993-04-21|1993-06-06|COLLECT COD|RAIL| are blithely along the express deposi +55904|1364|65|3|32|40491.52|0.00|0.01|A|F|1993-05-03|1993-04-26|1993-05-25|NONE|REG AIR|nd carefully. sl +55904|552|43|4|28|40671.40|0.04|0.08|A|F|1993-04-12|1993-05-03|1993-04-24|NONE|FOB|hely even pi +55904|342|99|5|15|18635.10|0.04|0.05|A|F|1993-06-06|1993-05-11|1993-06-30|TAKE BACK RETURN|REG AIR| wake quickly final orbits. blithe +55904|79|30|6|14|13706.98|0.05|0.04|R|F|1993-06-16|1993-06-07|1993-07-09|NONE|REG AIR|ideas. requests alongside of the +55905|1098|69|1|49|48955.41|0.08|0.03|N|O|1996-09-11|1996-09-07|1996-09-30|COLLECT COD|REG AIR|sts across the ironic, ironic fo +55905|1660|61|2|32|49973.12|0.08|0.03|N|O|1996-06-29|1996-09-10|1996-07-07|TAKE BACK RETURN|TRUCK|lets are. slyly specia +55905|1544|65|3|9|13009.86|0.06|0.04|N|O|1996-08-06|1996-09-20|1996-08-22|TAKE BACK RETURN|REG AIR|use fluffily regular foxes-- +55906|1099|35|1|38|38003.42|0.02|0.02|A|F|1995-01-25|1995-01-31|1995-02-15|TAKE BACK RETURN|REG AIR|ons wake carefully pending plate +55906|1510|11|2|41|57871.91|0.05|0.01|R|F|1994-12-14|1994-12-31|1995-01-13|TAKE BACK RETURN|RAIL|counts. pending accounts wake. fluffily iro +55906|1477|78|3|21|28947.87|0.08|0.02|A|F|1995-02-08|1995-01-03|1995-02-17|TAKE BACK RETURN|REG AIR|regular pinto beans alon +55906|1768|53|4|29|48423.04|0.05|0.03|R|F|1995-03-24|1995-01-18|1995-04-20|TAKE BACK RETURN|FOB| unusual ideas wake among t +55906|230|58|5|16|18083.68|0.07|0.00|R|F|1995-01-15|1995-01-24|1995-01-21|DELIVER IN PERSON|SHIP|luffily express pinto beans cajole reg +55906|1333|48|6|13|16046.29|0.04|0.06|R|F|1995-02-21|1995-01-25|1995-03-02|COLLECT COD|AIR|nly express foxes boost final, +55907|1952|85|1|26|48202.70|0.05|0.03|N|O|1997-02-09|1996-11-28|1997-03-07|TAKE BACK RETURN|FOB| slyly besides the +55907|465|53|2|8|10923.68|0.03|0.03|N|O|1997-01-06|1996-11-30|1997-01-27|NONE|MAIL|nto beans cajole furiously +55907|1637|79|3|30|46158.90|0.02|0.01|N|O|1997-02-06|1996-12-05|1997-02-16|NONE|RAIL|ow, even dolphins cajole +55907|1044|45|4|47|44416.88|0.07|0.06|N|O|1997-02-18|1997-01-01|1997-03-13|COLLECT COD|SHIP| close dolphins. regular packages +55908|1615|16|1|27|40948.47|0.05|0.00|R|F|1994-07-24|1994-06-24|1994-07-30|TAKE BACK RETURN|FOB|he blithely pending somas promise slyly e +55908|583|44|2|21|31155.18|0.07|0.08|R|F|1994-08-09|1994-06-24|1994-08-18|NONE|TRUCK|cajole furiously bo +55908|1706|33|3|29|46623.30|0.03|0.01|R|F|1994-08-23|1994-08-10|1994-09-10|DELIVER IN PERSON|AIR|ach about the final, pending f +55908|55|56|4|50|47752.50|0.10|0.01|A|F|1994-09-07|1994-07-04|1994-10-05|COLLECT COD|SHIP| cajole about the sly +55909|1988|89|1|7|13229.86|0.05|0.02|R|F|1994-06-02|1994-06-21|1994-06-26|NONE|REG AIR|ole carefully against the blithely reg +55909|1365|42|2|4|5065.44|0.03|0.00|R|F|1994-07-07|1994-07-12|1994-08-03|COLLECT COD|REG AIR|uriously regular instructions nag. ca +55909|1901|2|3|3|5408.70|0.00|0.07|A|F|1994-05-30|1994-07-31|1994-06-21|COLLECT COD|REG AIR|ly. final excuses ha +55909|157|84|4|33|34885.95|0.00|0.07|A|F|1994-08-24|1994-06-21|1994-08-28|TAKE BACK RETURN|RAIL|xpress fox +55909|396|97|5|11|14260.29|0.07|0.07|R|F|1994-05-25|1994-08-16|1994-06-15|COLLECT COD|FOB|ns use evenly across the pending deposits +55910|488|89|1|11|15273.28|0.09|0.06|R|F|1994-01-11|1993-11-18|1994-01-15|NONE|AIR| about the special instructions. carefu +55910|1345|22|2|4|4985.36|0.04|0.00|A|F|1993-12-14|1993-11-04|1993-12-19|DELIVER IN PERSON|FOB|sts haggle. enticingly even +55911|392|93|1|26|33602.14|0.04|0.06|R|F|1993-12-31|1994-01-01|1994-01-23|NONE|RAIL|unusual deposits +55911|1474|53|2|24|33011.28|0.05|0.02|A|F|1993-12-21|1993-12-29|1994-01-14|DELIVER IN PERSON|AIR|tainments boost blithely ab +55936|1653|36|1|45|69959.25|0.05|0.07|N|O|1996-03-16|1996-02-19|1996-04-12|NONE|AIR|y. requests pla +55936|797|94|2|45|76400.55|0.08|0.01|N|O|1996-02-15|1996-03-07|1996-03-12|TAKE BACK RETURN|MAIL|bove the sly de +55937|1156|29|1|20|21143.00|0.10|0.03|R|F|1994-04-28|1994-03-20|1994-05-16|DELIVER IN PERSON|REG AIR|ions. even ideas +55937|1870|57|2|40|70874.80|0.03|0.01|A|F|1994-04-03|1994-04-14|1994-04-27|NONE|REG AIR|e foxes are after the fluf +55937|1830|60|3|48|83127.84|0.10|0.00|A|F|1994-03-08|1994-03-27|1994-04-07|DELIVER IN PERSON|MAIL|ter the ironic accounts use after +55937|400|85|4|49|63719.60|0.02|0.08|A|F|1994-03-04|1994-03-08|1994-03-22|TAKE BACK RETURN|MAIL|ar packages? final accounts boost blithely +55937|462|63|5|19|25886.74|0.05|0.01|A|F|1994-05-15|1994-03-17|1994-06-08|TAKE BACK RETURN|RAIL| theodolites kindle slyly slyly clo +55937|1735|62|6|45|73652.85|0.00|0.05|A|F|1994-04-21|1994-03-21|1994-05-16|COLLECT COD|REG AIR|arefully a +55937|1539|80|7|47|67704.91|0.05|0.08|R|F|1994-03-26|1994-03-02|1994-04-15|COLLECT COD|SHIP|s sleep final, ironic fox +55938|1952|97|1|25|46348.75|0.03|0.04|R|F|1992-08-18|1992-09-05|1992-09-08|COLLECT COD|MAIL|quests above the +55938|614|46|2|42|63613.62|0.07|0.03|R|F|1992-10-16|1992-09-27|1992-10-30|DELIVER IN PERSON|TRUCK|unusual requests play fluffil +55938|966|67|3|48|89614.08|0.01|0.05|R|F|1992-10-15|1992-09-04|1992-10-30|COLLECT COD|MAIL|es affix furiousl +55938|310|11|4|45|54463.95|0.00|0.05|R|F|1992-07-18|1992-09-05|1992-08-15|DELIVER IN PERSON|MAIL|nag carefully alongside of t +55939|443|73|1|6|8060.64|0.06|0.06|N|O|1997-03-18|1997-03-12|1997-03-31|COLLECT COD|REG AIR|deposits are sly +55940|1766|93|1|17|28351.92|0.02|0.00|R|F|1994-06-14|1994-06-24|1994-07-10|NONE|RAIL|r accounts boost bold p +55940|357|86|2|23|28919.05|0.08|0.03|A|F|1994-07-14|1994-07-13|1994-08-13|TAKE BACK RETURN|RAIL|press excuses boost furiously bold packag +55941|1476|94|1|31|42701.57|0.08|0.00|R|F|1995-05-15|1995-05-05|1995-05-20|DELIVER IN PERSON|TRUCK|endencies boost quickly- +55941|626|58|2|5|7633.10|0.06|0.08|A|F|1995-05-19|1995-05-09|1995-06-14|NONE|MAIL| use theodolites. ironic ideas across the i +55941|743|8|3|10|16437.40|0.09|0.03|R|F|1995-06-04|1995-05-17|1995-06-16|DELIVER IN PERSON|AIR|otes. packages nag. quickly ironic dep +55942|1771|14|1|1|1672.77|0.10|0.02|N|O|1998-04-10|1998-05-09|1998-04-25|DELIVER IN PERSON|MAIL| carefully a +55942|226|54|2|21|23650.62|0.09|0.06|N|O|1998-06-10|1998-05-13|1998-06-27|COLLECT COD|MAIL|packages about +55942|721|86|3|29|47029.88|0.03|0.05|N|O|1998-06-14|1998-05-24|1998-07-03|COLLECT COD|REG AIR|l requests should sleep +55942|31|82|4|5|4655.15|0.02|0.06|N|O|1998-06-08|1998-04-09|1998-06-13|TAKE BACK RETURN|FOB| final packages wake f +55942|1852|39|5|36|63138.60|0.01|0.02|N|O|1998-06-21|1998-05-12|1998-06-28|TAKE BACK RETURN|REG AIR|al deposits detect ironically atop the sile +55942|68|69|6|4|3872.24|0.02|0.04|N|O|1998-06-17|1998-05-16|1998-07-17|DELIVER IN PERSON|REG AIR|uests are across +55942|1560|41|7|18|26308.08|0.01|0.00|N|O|1998-05-11|1998-05-21|1998-05-13|DELIVER IN PERSON|FOB|leep above the +55943|1627|28|1|45|68787.90|0.07|0.03|N|O|1997-05-16|1997-06-15|1997-06-10|COLLECT COD|SHIP|ourts boost slyly according t +55943|541|72|2|17|24506.18|0.09|0.00|N|O|1997-06-15|1997-06-13|1997-07-06|NONE|REG AIR|lose accounts haggle around t +55968|1325|64|1|17|20847.44|0.03|0.02|R|F|1993-01-28|1992-12-09|1993-02-01|TAKE BACK RETURN|TRUCK|kages are +55968|197|24|2|34|37304.46|0.08|0.00|R|F|1992-12-30|1992-11-25|1993-01-12|TAKE BACK RETURN|AIR|s the special requests haggle sometimes a +55968|1369|84|3|21|26677.56|0.05|0.01|R|F|1993-01-01|1992-12-22|1993-01-15|TAKE BACK RETURN|REG AIR|arefully carefully unusual accounts. ca +55968|613|14|4|33|49949.13|0.08|0.07|R|F|1992-11-18|1992-12-11|1992-12-06|NONE|SHIP|ully bold ideas. carefully idle asymptot +55969|291|46|1|7|8339.03|0.07|0.04|R|F|1993-11-12|1993-11-25|1993-11-30|DELIVER IN PERSON|REG AIR|. quickly regular requests boo +55969|678|10|2|10|15786.70|0.01|0.03|A|F|1993-11-13|1993-11-26|1993-12-05|NONE|SHIP|fully regular accounts wake furiously +55969|564|55|3|19|27826.64|0.05|0.02|A|F|1993-11-29|1993-12-10|1993-12-08|TAKE BACK RETURN|TRUCK|e. unusual foxes across the furiousl +55969|1274|75|4|27|31732.29|0.02|0.04|A|F|1994-01-20|1993-12-27|1994-02-17|TAKE BACK RETURN|TRUCK|uctions-- express accounts sleep slyly fur +55969|893|94|5|24|43053.36|0.08|0.00|R|F|1993-10-29|1993-11-16|1993-11-26|COLLECT COD|MAIL|Tiresias. quickly unusual +55970|652|46|1|26|40368.90|0.03|0.00|N|O|1995-10-21|1995-12-16|1995-10-31|TAKE BACK RETURN|AIR|deas sleep furiously blithely b +55970|1830|31|2|5|8659.15|0.09|0.07|N|O|1996-01-01|1995-11-06|1996-01-29|NONE|MAIL|haggle furiously. +55970|1531|72|3|8|11460.24|0.02|0.03|N|O|1996-01-23|1995-11-12|1996-02-01|COLLECT COD|MAIL|nst the carefully express courts wak +55970|21|47|4|40|36840.80|0.10|0.01|N|O|1995-11-14|1995-11-13|1995-12-07|DELIVER IN PERSON|FOB|platelets unwind +55970|1397|98|5|6|7790.34|0.06|0.01|N|O|1995-10-17|1995-11-09|1995-11-09|NONE|REG AIR|egular pinto beans integrate fl +55971|1670|53|1|16|25146.72|0.06|0.06|N|O|1997-02-18|1997-02-23|1997-03-01|COLLECT COD|MAIL|uests impres +55971|1355|32|2|11|13819.85|0.03|0.07|N|O|1997-03-19|1997-03-14|1997-04-08|NONE|FOB|ole carefully quickly silen +55971|1629|53|3|50|76531.00|0.01|0.00|N|O|1997-02-10|1997-03-04|1997-03-04|TAKE BACK RETURN|FOB| carefully. carefully un +55971|1097|33|4|28|27946.52|0.01|0.04|N|O|1997-04-28|1997-02-04|1997-05-12|COLLECT COD|TRUCK|carefully since the orbits. quickly pending +55971|1791|92|5|14|23699.06|0.05|0.08|N|O|1997-03-26|1997-03-13|1997-04-13|COLLECT COD|TRUCK|ss the furiou +55971|1991|80|6|47|88970.53|0.09|0.02|N|O|1997-03-20|1997-02-04|1997-04-10|DELIVER IN PERSON|MAIL| even requests cajole furiously slyl +55972|1563|64|1|9|13181.04|0.00|0.01|N|O|1996-02-09|1995-12-10|1996-03-10|DELIVER IN PERSON|FOB| blithely special foxes sol +55972|800|33|2|17|28913.60|0.05|0.03|N|O|1996-02-04|1996-01-06|1996-02-13|NONE|AIR|xes are. final deposits nod slyly f +55972|1250|62|3|4|4605.00|0.03|0.00|N|O|1996-02-14|1996-01-23|1996-03-01|COLLECT COD|RAIL|jole brave re +55972|807|74|4|40|68312.00|0.07|0.06|N|O|1995-11-28|1995-12-17|1995-12-03|NONE|FOB|en accounts +55972|100|1|5|13|13001.30|0.00|0.02|N|O|1995-11-10|1996-01-20|1995-12-08|COLLECT COD|MAIL|uests haggle after +55973|394|79|1|41|53069.99|0.00|0.07|R|F|1995-05-28|1995-03-25|1995-06-05|DELIVER IN PERSON|FOB|ar pinto beans are f +55973|1688|71|2|18|28614.24|0.05|0.08|R|F|1995-05-20|1995-03-19|1995-05-25|DELIVER IN PERSON|REG AIR| carefully iro +55973|629|61|3|34|52007.08|0.01|0.08|A|F|1995-03-23|1995-04-29|1995-04-07|COLLECT COD|REG AIR|hinder fluffily along +55973|361|18|4|50|63068.00|0.10|0.01|N|F|1995-06-11|1995-05-06|1995-07-05|COLLECT COD|MAIL| to the slyly sp +55973|1106|43|5|35|35248.50|0.05|0.06|R|F|1995-02-27|1995-04-25|1995-03-20|COLLECT COD|RAIL|yly along the slyly reg +55973|403|62|6|17|22157.80|0.00|0.08|R|F|1995-04-15|1995-03-26|1995-04-20|NONE|REG AIR|ideas. furiously ironic ideas cajole fluf +55973|958|61|7|49|91088.55|0.04|0.06|R|F|1995-04-19|1995-04-21|1995-05-15|COLLECT COD|MAIL|refully unus +55974|961|30|1|3|5585.88|0.00|0.03|N|O|1996-08-10|1996-07-06|1996-08-17|NONE|FOB|s, final foxes. regular, even +55974|150|3|2|27|28354.05|0.07|0.05|N|O|1996-08-28|1996-07-25|1996-09-02|TAKE BACK RETURN|TRUCK|r foxes. ironic packages haggle. +55974|1386|1|3|11|14161.18|0.01|0.06|N|O|1996-06-25|1996-07-15|1996-07-05|COLLECT COD|RAIL|efully above the exp +55975|504|5|1|44|61798.00|0.10|0.02|N|O|1998-02-22|1998-03-20|1998-03-17|TAKE BACK RETURN|TRUCK| requests run. +55975|623|17|2|11|16759.82|0.07|0.02|N|O|1998-04-11|1998-04-21|1998-05-03|NONE|TRUCK| slyly fluffily unusual packages. +55975|964|65|3|13|24244.48|0.04|0.06|N|O|1998-06-04|1998-03-26|1998-06-08|TAKE BACK RETURN|TRUCK|the special reques +55975|1678|20|4|38|60027.46|0.05|0.02|N|O|1998-06-03|1998-03-19|1998-06-27|COLLECT COD|TRUCK| beans sle +56000|1845|75|1|15|26202.60|0.01|0.04|N|O|1997-01-05|1997-01-07|1997-01-23|DELIVER IN PERSON|TRUCK|nusual instructions cajole furiously pa +56000|1355|70|2|31|38946.85|0.06|0.03|N|O|1996-12-03|1997-01-24|1996-12-16|COLLECT COD|FOB|fily regular, regular re +56001|1388|89|1|19|24498.22|0.03|0.03|R|F|1993-05-22|1993-06-29|1993-06-08|DELIVER IN PERSON|AIR|ar asymptotes. furiously special p +56001|815|82|2|19|32600.39|0.09|0.05|R|F|1993-06-26|1993-06-03|1993-07-04|TAKE BACK RETURN|MAIL|ions. pending ideas cajole s +56001|563|54|3|6|8781.36|0.01|0.03|R|F|1993-07-06|1993-05-27|1993-08-02|TAKE BACK RETURN|SHIP|players affix quickly! furi +56001|846|80|4|6|10481.04|0.09|0.06|R|F|1993-05-16|1993-06-17|1993-05-26|TAKE BACK RETURN|SHIP|ial instructions. q +56001|1599|100|5|39|58523.01|0.06|0.08|A|F|1993-04-18|1993-05-28|1993-04-21|DELIVER IN PERSON|AIR|low, ironic dolphins. special, close foxe +56002|818|52|1|37|63595.97|0.02|0.02|A|F|1994-10-15|1994-08-21|1994-10-31|NONE|SHIP|ests detect slyly final, special deposit +56002|517|48|2|44|62370.44|0.08|0.04|R|F|1994-10-09|1994-09-11|1994-11-01|COLLECT COD|RAIL|hy deposits! carefully even dep +56002|1267|5|3|27|31543.02|0.06|0.07|R|F|1994-10-03|1994-08-30|1994-10-15|NONE|RAIL|fter the fu +56002|1711|54|4|39|62895.69|0.05|0.04|R|F|1994-08-05|1994-09-14|1994-08-19|NONE|TRUCK|ss notornis. regular foxe +56002|605|99|5|2|3011.20|0.10|0.03|A|F|1994-08-26|1994-09-22|1994-08-29|TAKE BACK RETURN|SHIP|ely silent packages. bold, fin +56002|1431|71|6|38|50632.34|0.03|0.05|R|F|1994-10-12|1994-09-02|1994-10-22|DELIVER IN PERSON|TRUCK|und the fluffily regular requests haggle ca +56002|559|60|7|4|5838.20|0.03|0.00|R|F|1994-09-22|1994-08-28|1994-09-24|NONE|MAIL|deas. blithely ir +56003|637|69|1|7|10763.41|0.09|0.04|A|F|1993-04-29|1993-05-11|1993-05-29|NONE|MAIL|al pinto beans. +56003|1170|43|2|13|13925.21|0.04|0.02|A|F|1993-05-05|1993-05-21|1993-05-28|COLLECT COD|REG AIR|eposits haggle bol +56003|1925|14|3|5|9134.60|0.05|0.01|R|F|1993-07-23|1993-05-31|1993-07-24|DELIVER IN PERSON|AIR|ong the requests sleep furiou +56003|909|10|4|30|54297.00|0.03|0.01|A|F|1993-04-15|1993-07-04|1993-04-24|TAKE BACK RETURN|REG AIR|refully fluffily reg +56003|1815|16|5|30|51504.30|0.10|0.07|R|F|1993-05-28|1993-06-21|1993-06-20|NONE|SHIP|nd the carefu +56004|533|64|1|14|20069.42|0.06|0.04|A|F|1993-08-01|1993-08-21|1993-08-16|NONE|SHIP|lyly pending instructions around the busi +56005|171|24|1|4|4284.68|0.10|0.02|N|O|1996-03-09|1996-03-04|1996-03-10|DELIVER IN PERSON|SHIP|ideas haggle. furio +56005|1271|9|2|2|2344.54|0.01|0.03|N|O|1996-04-18|1996-03-09|1996-05-05|TAKE BACK RETURN|SHIP|ly about t +56005|1190|63|3|11|12003.09|0.05|0.04|N|O|1996-04-26|1996-04-08|1996-05-14|DELIVER IN PERSON|RAIL|rls. final excuses +56005|1652|76|4|49|76128.85|0.00|0.01|N|O|1996-01-25|1996-04-01|1996-02-17|DELIVER IN PERSON|FOB|e furiously final foxes ar +56005|856|90|5|41|72030.85|0.10|0.08|N|O|1996-01-15|1996-03-30|1996-02-12|DELIVER IN PERSON|SHIP|ruthlessly alongside of the silent de +56005|715|12|6|9|14541.39|0.07|0.03|N|O|1996-04-11|1996-04-05|1996-04-17|NONE|AIR|riously after the furiousl +56005|673|74|7|7|11015.69|0.06|0.00|N|O|1996-04-29|1996-03-31|1996-05-15|DELIVER IN PERSON|SHIP| express packages. regular, unus +56006|345|30|1|35|43586.90|0.02|0.01|N|O|1996-01-07|1995-11-15|1996-01-13|NONE|MAIL|ng pinto bean +56006|1168|5|2|29|31005.64|0.05|0.05|N|O|1995-11-10|1995-12-21|1995-11-24|COLLECT COD|SHIP| sublate afte +56006|1871|58|3|50|88643.50|0.10|0.08|N|O|1996-01-04|1995-11-29|1996-01-12|TAKE BACK RETURN|FOB|hely regular excuses along the final t +56006|1857|87|4|35|61559.75|0.01|0.04|N|O|1995-12-24|1995-12-11|1995-12-27|COLLECT COD|REG AIR|ths cajole along the fluffily +56006|709|6|5|24|38632.80|0.06|0.02|N|O|1995-11-14|1995-12-15|1995-12-08|COLLECT COD|RAIL|es sleep quickly along the ironic, q +56006|432|62|6|45|59959.35|0.07|0.05|N|O|1996-01-31|1995-12-09|1996-02-19|DELIVER IN PERSON|TRUCK|haggle slyly slyly idle foxes. bold, fina +56007|688|20|1|6|9532.08|0.09|0.05|R|F|1992-03-07|1992-03-05|1992-03-11|NONE|FOB|ss packages wake sl +56032|313|70|1|8|9706.48|0.02|0.05|N|O|1996-01-03|1996-02-13|1996-01-28|DELIVER IN PERSON|TRUCK|to beans. furiously unus +56032|1329|44|2|21|25836.72|0.07|0.00|N|O|1995-12-22|1996-01-26|1995-12-23|COLLECT COD|SHIP|ording to the even tithes nag +56032|908|77|3|24|43413.60|0.08|0.08|N|O|1996-01-21|1996-02-16|1996-02-16|NONE|MAIL|ross the ironic, sile +56032|1018|24|4|11|10109.11|0.10|0.03|N|O|1996-01-14|1996-03-02|1996-02-11|TAKE BACK RETURN|REG AIR| express warhorses after the care +56033|147|26|1|34|35602.76|0.07|0.00|R|F|1992-04-24|1992-02-14|1992-04-28|DELIVER IN PERSON|MAIL| blithely pending +56034|749|50|1|28|46192.72|0.08|0.03|N|O|1997-09-30|1997-12-06|1997-10-07|TAKE BACK RETURN|REG AIR| breach furiously. furiously ironic +56034|619|13|2|21|31911.81|0.01|0.01|N|O|1997-12-13|1997-10-10|1997-12-14|NONE|REG AIR|e the slyly special theodolites cajole a +56034|1167|40|3|7|7477.12|0.09|0.02|N|O|1997-11-28|1997-10-25|1997-12-01|TAKE BACK RETURN|SHIP|oost slyly express, special +56034|330|87|4|44|54134.52|0.00|0.08|N|O|1997-12-19|1997-12-06|1997-12-27|COLLECT COD|MAIL|press, pending excuses across the ironic re +56034|1943|44|5|10|18449.40|0.05|0.01|N|O|1997-09-27|1997-10-19|1997-10-17|NONE|TRUCK|nos are blithely along the fi +56034|314|43|6|36|43715.16|0.02|0.05|N|O|1997-09-24|1997-11-19|1997-09-27|NONE|SHIP|. final, thin requests haggle ir +56035|1156|29|1|36|38057.40|0.10|0.03|N|O|1996-11-08|1996-10-03|1996-11-22|DELIVER IN PERSON|SHIP|y final deposits. quick +56035|810|11|2|29|49613.49|0.08|0.07|N|O|1996-08-15|1996-10-13|1996-09-03|COLLECT COD|REG AIR|tions. packages doze +56036|1416|17|1|5|6587.05|0.03|0.04|N|O|1996-12-29|1996-12-13|1997-01-03|DELIVER IN PERSON|REG AIR|ts. furiously even dinos along +56036|1926|71|2|20|36558.40|0.08|0.00|N|O|1997-02-01|1997-01-02|1997-02-11|TAKE BACK RETURN|AIR|ckly regular pac +56036|434|22|3|26|34695.18|0.09|0.07|N|O|1996-12-07|1997-01-06|1996-12-29|DELIVER IN PERSON|FOB|quests sleep. bold, unusual accounts abo +56037|834|1|1|39|67658.37|0.08|0.02|N|O|1996-05-16|1996-04-30|1996-06-01|COLLECT COD|RAIL|ounts affix furiously. furiously +56037|166|67|2|28|29852.48|0.07|0.01|N|O|1996-05-01|1996-05-11|1996-05-31|TAKE BACK RETURN|FOB|uickly pending packa +56037|277|59|3|45|52977.15|0.01|0.00|N|O|1996-05-01|1996-05-23|1996-05-14|NONE|SHIP|lar accounts haggle across +56037|1388|89|4|32|41260.16|0.00|0.07|N|O|1996-05-05|1996-06-09|1996-05-13|DELIVER IN PERSON|FOB| braids. carefully special requests s +56037|1633|16|5|33|50642.79|0.01|0.00|N|O|1996-05-22|1996-06-09|1996-06-12|TAKE BACK RETURN|AIR|al deposits. carefully regular gifts +56038|858|59|1|22|38694.70|0.00|0.02|R|F|1994-04-07|1994-02-22|1994-04-29|TAKE BACK RETURN|RAIL| furiously. fluffily even pinto beans caj +56038|165|92|2|20|21303.20|0.07|0.06|A|F|1994-03-13|1994-03-14|1994-03-23|TAKE BACK RETURN|SHIP|phins. instructions wake above the fin +56038|286|87|3|15|17794.20|0.01|0.08|A|F|1994-05-10|1994-02-21|1994-05-31|DELIVER IN PERSON|MAIL|, silent asymptotes affix about t +56038|869|3|4|8|14158.88|0.08|0.03|R|F|1994-04-30|1994-04-08|1994-05-28|TAKE BACK RETURN|AIR|ajole blithely. carefully +56038|1741|26|5|18|29569.32|0.06|0.03|R|F|1994-02-27|1994-03-11|1994-03-07|NONE|MAIL|equests should cajole slyly after +56038|1323|100|6|50|61216.00|0.10|0.01|R|F|1994-03-21|1994-03-18|1994-03-27|TAKE BACK RETURN|FOB|unusual requests. b +56039|364|93|1|21|26551.56|0.05|0.07|N|O|1996-01-01|1996-01-16|1996-01-15|TAKE BACK RETURN|FOB|s according to the ironically express +56039|1297|35|2|32|38345.28|0.02|0.07|N|O|1995-12-29|1996-02-03|1996-01-26|DELIVER IN PERSON|FOB|express deposits affix fluffily against +56039|369|98|3|37|46966.32|0.07|0.08|N|O|1996-01-10|1996-01-13|1996-01-19|COLLECT COD|REG AIR|unts sleep quickly +56039|1562|43|4|33|48297.48|0.09|0.00|N|O|1996-02-29|1996-02-02|1996-03-15|NONE|AIR|. carefully pending asymptote +56039|494|82|5|9|12550.41|0.05|0.08|N|O|1996-03-10|1996-01-22|1996-03-21|TAKE BACK RETURN|RAIL|the ironic, even theodoli +56039|1324|63|6|42|51463.44|0.02|0.00|N|O|1996-03-08|1996-01-30|1996-03-18|DELIVER IN PERSON|MAIL|xpress foxes ought to cajole furious +56039|856|56|7|18|31623.30|0.01|0.03|N|O|1996-02-09|1996-01-25|1996-03-02|DELIVER IN PERSON|TRUCK|nal ideas. blithely bold ideas sleep +56064|1681|5|1|21|33236.28|0.03|0.07|R|F|1994-12-19|1995-01-04|1995-01-03|TAKE BACK RETURN|FOB|? carefully final +56064|1504|85|2|22|30921.00|0.06|0.08|A|F|1994-12-12|1995-01-28|1994-12-22|COLLECT COD|TRUCK|special excuses cajole against the ironic, +56064|11|62|3|45|40995.45|0.06|0.08|R|F|1995-02-06|1994-12-28|1995-02-18|TAKE BACK RETURN|AIR|equests. entici +56064|15|91|4|1|915.01|0.01|0.02|A|F|1994-11-10|1995-01-08|1994-11-16|DELIVER IN PERSON|AIR|ges. ironic +56064|1208|9|5|20|22184.00|0.10|0.03|R|F|1994-11-18|1995-01-19|1994-11-24|COLLECT COD|AIR|ts wake blithely +56064|964|65|6|22|41029.12|0.03|0.02|R|F|1994-11-18|1994-12-18|1994-12-17|DELIVER IN PERSON|AIR|posits aff +56064|1271|83|7|3|3516.81|0.04|0.06|R|F|1994-12-15|1995-01-08|1995-01-03|DELIVER IN PERSON|FOB|al dependencies are blithely. +56065|956|57|1|15|27854.25|0.01|0.04|A|F|1995-04-25|1995-05-18|1995-05-15|TAKE BACK RETURN|FOB|tions sleep carefully since the furi +56065|913|82|2|47|85253.77|0.00|0.05|N|O|1995-07-15|1995-05-04|1995-08-08|COLLECT COD|FOB|the furiously regular accounts slee +56065|286|14|3|13|15421.64|0.02|0.02|N|O|1995-07-28|1995-06-19|1995-08-24|TAKE BACK RETURN|FOB|haggle along the idly ironic requ +56065|1256|31|4|36|41661.00|0.05|0.07|N|O|1995-07-13|1995-05-29|1995-07-16|NONE|TRUCK|riously special deposits are. unusu +56066|1915|48|1|13|23619.83|0.04|0.03|N|O|1998-02-18|1998-04-18|1998-02-26|DELIVER IN PERSON|SHIP|s. courts nag +56066|286|87|2|13|15421.64|0.02|0.00|N|O|1998-01-25|1998-02-26|1998-02-15|NONE|REG AIR|ular accounts cajole furiously. fu +56067|1724|25|1|32|52023.04|0.02|0.05|N|O|1996-12-27|1996-10-14|1997-01-11|COLLECT COD|SHIP| the carefully even ideas cajole furi +56067|175|76|2|27|29029.59|0.07|0.00|N|O|1996-10-20|1996-10-05|1996-11-05|NONE|RAIL|ickly fluffily +56067|990|25|3|49|92658.51|0.03|0.07|N|O|1996-09-16|1996-10-18|1996-10-13|NONE|FOB| asymptotes haggle blithely about the fin +56067|932|1|4|40|73317.20|0.09|0.08|N|O|1996-09-18|1996-10-14|1996-09-30|COLLECT COD|AIR| special pinto beans abou +56067|793|58|5|38|64364.02|0.10|0.02|N|O|1996-12-31|1996-11-29|1997-01-28|COLLECT COD|FOB| haggle-- asymptotes alongside of the +56068|435|23|1|2|2670.86|0.01|0.05|N|O|1997-03-06|1997-02-26|1997-03-25|TAKE BACK RETURN|TRUCK|ully against the pending +56068|812|13|2|33|56522.73|0.02|0.03|N|O|1997-02-13|1997-02-16|1997-03-03|DELIVER IN PERSON|AIR|al platelets. pending notornis engage +56068|1881|25|3|40|71315.20|0.08|0.08|N|O|1997-04-09|1997-03-25|1997-04-12|TAKE BACK RETURN|AIR|ly bold requests doubt carefully bold +56069|182|9|1|44|47615.92|0.03|0.03|R|F|1993-01-22|1992-11-21|1993-02-03|NONE|TRUCK|ully regular i +56070|1745|30|1|50|82337.00|0.03|0.05|A|F|1992-03-07|1992-03-23|1992-03-20|DELIVER IN PERSON|SHIP| furiously. quickly re +56071|236|37|1|13|14770.99|0.00|0.07|N|O|1996-08-10|1996-08-28|1996-08-21|COLLECT COD|REG AIR| accounts use against t +56071|1095|31|2|34|33867.06|0.01|0.08|N|O|1996-09-03|1996-09-15|1996-09-23|NONE|AIR|s. ironic, even platelets us +56071|1283|21|3|38|45002.64|0.04|0.08|N|O|1996-10-12|1996-09-01|1996-11-08|COLLECT COD|TRUCK|sly express packages. bold pinto beans a +56071|1848|35|4|33|57744.72|0.02|0.08|N|O|1996-08-24|1996-08-29|1996-09-01|DELIVER IN PERSON|MAIL| quickly slyly +56071|1065|71|5|37|35744.22|0.07|0.03|N|O|1996-07-30|1996-08-23|1996-08-29|NONE|AIR|ly furious foxes. slyly ironic packages wak +56071|765|98|6|27|44975.52|0.08|0.01|N|O|1996-07-31|1996-09-22|1996-08-25|TAKE BACK RETURN|FOB|according to the furiously bold pack +56071|1116|25|7|29|29496.19|0.10|0.06|N|O|1996-07-28|1996-09-06|1996-08-11|TAKE BACK RETURN|FOB|c, regular forg +56096|419|49|1|15|19791.15|0.07|0.07|N|O|1995-11-23|1995-12-31|1995-11-30|TAKE BACK RETURN|FOB| use furiously ironic depo +56096|432|20|2|7|9327.01|0.08|0.05|N|O|1995-12-01|1995-12-24|1995-12-21|TAKE BACK RETURN|SHIP|ackages against the furiously expres +56096|1945|90|3|37|68336.78|0.04|0.07|N|O|1996-01-04|1995-11-20|1996-01-17|TAKE BACK RETURN|REG AIR|s nag ironic foxes. furiously e +56097|829|30|1|23|39785.86|0.08|0.03|N|O|1996-06-14|1996-06-04|1996-07-04|TAKE BACK RETURN|FOB|ts. quiet platelets use. fluffily final dep +56097|808|75|2|36|61516.80|0.09|0.06|N|O|1996-07-22|1996-06-02|1996-08-04|NONE|REG AIR|ts. slyly fina +56097|474|33|3|23|31612.81|0.05|0.02|N|O|1996-06-30|1996-06-19|1996-07-03|DELIVER IN PERSON|FOB|ng deposits nag along +56097|245|73|4|33|37792.92|0.06|0.06|N|O|1996-05-24|1996-07-21|1996-06-03|COLLECT COD|SHIP|ic accounts. express requests above +56097|1842|29|5|49|85448.16|0.03|0.01|N|O|1996-08-19|1996-06-06|1996-09-11|DELIVER IN PERSON|RAIL|fter the pend +56098|1987|32|1|35|66114.30|0.09|0.04|N|O|1997-01-01|1997-02-24|1997-01-13|DELIVER IN PERSON|RAIL| requests haggle carefully regular packages +56098|1195|68|2|12|13154.28|0.10|0.01|N|O|1997-03-20|1997-02-07|1997-03-21|COLLECT COD|MAIL|r the blithely regu +56098|517|8|3|26|36855.26|0.00|0.08|N|O|1997-01-24|1997-02-15|1997-02-04|TAKE BACK RETURN|RAIL|quests. quickly e +56098|1292|4|4|4|4773.16|0.01|0.07|N|O|1997-01-24|1997-02-25|1997-02-13|DELIVER IN PERSON|AIR|ng platelets. furiously iro +56098|1209|47|5|13|14432.60|0.02|0.00|N|O|1997-01-04|1997-01-21|1997-01-09|COLLECT COD|AIR|structions sleep. careful +56099|53|54|1|47|44793.35|0.03|0.03|R|F|1994-01-28|1993-12-23|1994-02-17|TAKE BACK RETURN|RAIL|unts. even requests +56099|255|37|2|3|3465.75|0.10|0.06|A|F|1993-10-13|1993-11-15|1993-11-08|NONE|TRUCK|blithely express asymptotes are +56099|65|16|3|49|47287.94|0.07|0.08|A|F|1994-01-14|1994-01-02|1994-02-09|TAKE BACK RETURN|REG AIR| unusual deposits wa +56099|235|36|4|47|53355.81|0.02|0.04|A|F|1993-12-16|1994-01-03|1993-12-17|DELIVER IN PERSON|MAIL|ts. quick foxes nag blit +56099|623|17|5|38|57897.56|0.03|0.06|R|F|1994-01-02|1993-12-03|1994-01-30|TAKE BACK RETURN|MAIL|ise quickly carefully final packages. unu +56100|753|18|1|21|34728.75|0.02|0.00|R|F|1993-05-28|1993-06-19|1993-06-27|TAKE BACK RETURN|MAIL|kages. blithely regular instructions sleep +56100|1170|43|2|24|25708.08|0.05|0.02|R|F|1993-07-07|1993-06-25|1993-07-24|COLLECT COD|FOB|packages. furiously ruthless dolphin +56100|149|76|3|14|14687.96|0.09|0.02|R|F|1993-06-14|1993-06-28|1993-07-14|DELIVER IN PERSON|RAIL|egular frays arou +56101|1591|12|1|37|55225.83|0.07|0.00|A|F|1993-10-07|1993-09-30|1993-10-28|TAKE BACK RETURN|RAIL|uickly. regular a +56101|1408|26|2|46|60232.40|0.00|0.01|A|F|1993-09-22|1993-09-11|1993-10-19|COLLECT COD|MAIL|y. blithely even accounts haggle +56101|100|51|3|17|17001.70|0.05|0.07|A|F|1993-10-07|1993-09-12|1993-10-26|COLLECT COD|AIR|theodolites nag doggedly blithely ironic th +56101|1201|2|4|45|49599.00|0.06|0.08|R|F|1993-09-10|1993-09-10|1993-09-30|COLLECT COD|SHIP|ackages nag? carefully +56101|1826|56|5|14|24189.48|0.00|0.06|A|F|1993-10-31|1993-09-28|1993-11-24|DELIVER IN PERSON|MAIL|nal excuses unwind +56101|774|39|6|46|77039.42|0.02|0.07|R|F|1993-08-03|1993-08-27|1993-09-02|COLLECT COD|RAIL|l instructions. dolphins +56102|1192|65|1|6|6559.14|0.06|0.00|N|O|1997-02-23|1997-02-14|1997-03-01|TAKE BACK RETURN|TRUCK|the bold dolph +56102|1231|6|2|6|6793.38|0.00|0.02|N|O|1997-05-02|1997-03-23|1997-05-27|COLLECT COD|SHIP|luffily unusual accounts might are +56102|404|5|3|18|23479.20|0.08|0.08|N|O|1997-05-02|1997-03-13|1997-05-15|COLLECT COD|FOB|ully regular, iron +56102|1869|99|4|14|24792.04|0.04|0.01|N|O|1997-03-16|1997-02-18|1997-04-09|NONE|MAIL|ously regular theodolites. fluffily even a +56102|726|59|5|43|69948.96|0.01|0.00|N|O|1997-01-23|1997-03-22|1997-02-14|DELIVER IN PERSON|TRUCK|longside of t +56103|1447|26|1|46|62028.24|0.00|0.06|A|F|1994-03-21|1994-02-03|1994-03-22|NONE|AIR|. blithely enticing requests de +56103|948|51|2|47|86900.18|0.00|0.07|R|F|1994-03-23|1994-03-02|1994-04-08|NONE|FOB|ng the pinto +56103|1318|33|3|29|35359.99|0.03|0.03|A|F|1994-01-15|1994-03-07|1994-02-09|TAKE BACK RETURN|AIR|y regular requests alongside of the +56103|1938|83|4|22|40478.46|0.02|0.00|R|F|1994-02-26|1994-03-14|1994-03-06|DELIVER IN PERSON|RAIL|sual deposits wake daringly slyly silen +56103|1323|38|5|24|29383.68|0.02|0.04|R|F|1994-01-17|1994-02-01|1994-02-16|DELIVER IN PERSON|MAIL|y regular pinto beans. regu +56103|1575|76|6|5|7382.85|0.09|0.04|R|F|1994-01-20|1994-01-26|1994-02-09|DELIVER IN PERSON|RAIL|structions haggle blithely e +56128|389|18|1|28|36102.64|0.00|0.04|R|F|1993-08-27|1993-09-11|1993-09-17|COLLECT COD|AIR|f the blithely fina +56128|1189|26|2|2|2180.36|0.00|0.02|R|F|1993-10-17|1993-09-15|1993-11-04|TAKE BACK RETURN|RAIL|furiously even deposits according +56128|617|18|3|31|47045.91|0.09|0.02|A|F|1993-10-10|1993-09-12|1993-10-12|DELIVER IN PERSON|FOB|ly regular excuses detect pending foxes. +56128|1554|95|4|10|14555.50|0.08|0.05|R|F|1993-09-13|1993-09-30|1993-09-25|NONE|AIR|requests. regular packages are furiously +56128|1425|4|5|17|22549.14|0.08|0.08|A|F|1993-10-17|1993-10-17|1993-11-06|TAKE BACK RETURN|RAIL|packages use th +56128|522|83|6|4|5690.08|0.09|0.06|A|F|1993-10-21|1993-10-25|1993-10-23|TAKE BACK RETURN|MAIL|s boost quickly +56128|1678|79|7|41|64766.47|0.05|0.08|R|F|1993-11-19|1993-09-09|1993-12-08|DELIVER IN PERSON|TRUCK|uickly acr +56129|1885|86|1|47|83983.36|0.04|0.04|N|O|1996-01-18|1996-03-17|1996-01-21|COLLECT COD|RAIL|ffily express accounts. ironic, ironic inst +56130|1608|50|1|23|34720.80|0.08|0.03|N|O|1996-03-23|1996-02-25|1996-04-18|NONE|MAIL|sts detect furiously r +56130|360|45|2|19|23946.84|0.08|0.06|N|O|1995-12-10|1996-01-31|1996-01-04|NONE|TRUCK|lent pains use against the sl +56130|1768|69|3|16|26716.16|0.06|0.04|N|O|1996-01-28|1996-01-18|1996-02-18|NONE|TRUCK|ts use furiously. pendin +56130|348|33|4|4|4993.36|0.01|0.03|N|O|1996-03-24|1996-01-19|1996-04-12|COLLECT COD|TRUCK|es. bold, final req +56130|1712|13|5|25|40342.75|0.06|0.03|N|O|1996-02-22|1995-12-31|1996-03-11|NONE|TRUCK| maintain +56130|869|36|6|7|12389.02|0.00|0.07|N|O|1996-02-07|1996-01-20|1996-03-07|DELIVER IN PERSON|AIR|e furiously final multipliers. fina +56131|1792|19|1|32|54201.28|0.07|0.02|R|F|1993-05-09|1993-05-27|1993-05-18|NONE|MAIL|en accounts. special de +56131|856|90|2|34|59732.90|0.02|0.05|A|F|1993-06-14|1993-04-22|1993-06-27|NONE|SHIP|quick packages! furiousl +56132|498|86|1|32|44751.68|0.01|0.07|A|F|1992-07-08|1992-08-14|1992-07-12|DELIVER IN PERSON|RAIL|ven, express pinto beans ha +56132|1649|73|2|35|54272.40|0.06|0.07|R|F|1992-07-09|1992-07-19|1992-07-30|NONE|TRUCK| carefully b +56133|1573|54|1|13|19169.41|0.04|0.02|N|O|1996-04-26|1996-06-22|1996-05-13|COLLECT COD|MAIL|quickly regular idea +56133|283|11|2|16|18932.48|0.02|0.08|N|O|1996-06-09|1996-06-25|1996-06-26|DELIVER IN PERSON|RAIL|horses. closely regula +56133|351|52|3|2|2502.70|0.09|0.05|N|O|1996-06-10|1996-06-15|1996-07-05|DELIVER IN PERSON|AIR|ing to the carefully ironic dependencies. +56133|1050|51|4|33|31384.65|0.02|0.00|N|O|1996-05-08|1996-06-03|1996-05-30|DELIVER IN PERSON|REG AIR|ze. accounts doubt +56134|593|94|1|42|62730.78|0.00|0.02|N|O|1998-06-28|1998-06-03|1998-07-06|COLLECT COD|TRUCK| blithely final reque +56134|428|29|2|36|47823.12|0.10|0.01|N|O|1998-07-11|1998-05-05|1998-08-01|DELIVER IN PERSON|MAIL| express platelets from the slyl +56134|1645|87|3|36|55679.04|0.02|0.06|N|O|1998-05-23|1998-06-28|1998-06-06|COLLECT COD|MAIL|equests. quickly special theodolit +56134|89|90|4|24|23737.92|0.07|0.02|N|O|1998-05-31|1998-06-29|1998-06-23|COLLECT COD|TRUCK|l packages maintain about +56134|885|19|5|8|14287.04|0.04|0.01|N|O|1998-07-23|1998-06-25|1998-07-29|NONE|REG AIR| even foxes. +56134|471|59|6|15|20572.05|0.09|0.00|N|O|1998-07-08|1998-06-15|1998-07-16|NONE|SHIP|final theodolites. special +56135|840|41|1|18|31335.12|0.01|0.01|R|F|1993-12-21|1994-01-11|1994-01-13|COLLECT COD|SHIP|odolites doze blithely regular accoun +56135|224|52|2|1|1124.22|0.08|0.04|R|F|1993-12-08|1994-02-01|1994-01-06|DELIVER IN PERSON|AIR| nag quickly above the even packa +56135|1180|89|3|41|44328.38|0.01|0.02|A|F|1994-01-05|1994-02-06|1994-01-16|TAKE BACK RETURN|AIR| slyly regular pinto beans. carefully +56135|1915|16|4|27|49056.57|0.01|0.00|A|F|1993-12-26|1994-01-08|1994-01-14|TAKE BACK RETURN|SHIP|the regular accounts. slyly re +56135|362|63|5|34|42920.24|0.01|0.07|A|F|1993-12-02|1994-01-02|1993-12-28|COLLECT COD|TRUCK|uests detect i +56135|634|66|6|10|15346.30|0.02|0.02|R|F|1994-03-13|1994-01-07|1994-03-21|DELIVER IN PERSON|TRUCK|st carefully ironic +56135|443|31|7|38|51050.72|0.00|0.06|A|F|1993-12-22|1993-12-14|1994-01-09|NONE|REG AIR|y ironic excuses. even, unusual pi +56160|296|97|1|43|51440.47|0.06|0.02|A|F|1995-01-10|1994-11-09|1995-01-30|TAKE BACK RETURN|AIR|arefully even foxes must +56160|944|45|2|49|90402.06|0.03|0.00|R|F|1994-10-08|1994-12-09|1994-10-27|NONE|TRUCK| even instructi +56160|414|15|3|40|52576.40|0.07|0.03|R|F|1994-10-04|1994-11-18|1994-10-06|COLLECT COD|FOB|its. fluffily special deposits was slyly e +56160|1293|5|4|20|23885.80|0.09|0.02|A|F|1994-10-24|1994-11-18|1994-11-14|COLLECT COD|MAIL|ely. pendi +56160|47|73|5|49|46404.96|0.09|0.07|A|F|1994-09-27|1994-11-03|1994-10-08|TAKE BACK RETURN|TRUCK|lar, special pinto +56160|1445|85|6|26|35007.44|0.02|0.05|R|F|1995-01-05|1994-11-22|1995-01-22|DELIVER IN PERSON|MAIL|ic, ironic ideas haggle about t +56160|1695|78|7|27|43110.63|0.10|0.08|R|F|1994-11-02|1994-12-13|1994-11-19|NONE|REG AIR|uriously bold theodolites +56161|711|8|1|19|30622.49|0.00|0.00|A|F|1992-07-01|1992-06-03|1992-07-29|DELIVER IN PERSON|AIR|yly pending instructions integ +56161|522|53|2|19|27027.88|0.00|0.08|R|F|1992-07-11|1992-05-15|1992-07-24|COLLECT COD|TRUCK| blithely express pinto beans affix sly +56161|503|34|3|12|16842.00|0.02|0.08|R|F|1992-06-05|1992-07-02|1992-07-02|DELIVER IN PERSON|SHIP|uests are carefully among the slyly reg +56161|164|91|4|34|36181.44|0.08|0.04|R|F|1992-07-14|1992-06-20|1992-08-12|NONE|SHIP|ests haggle slyly +56162|1859|3|1|26|45782.10|0.06|0.06|N|O|1995-07-16|1995-06-26|1995-07-31|TAKE BACK RETURN|MAIL|tions sleep slyly +56162|838|72|2|50|86941.50|0.09|0.03|A|F|1995-05-19|1995-06-29|1995-06-15|TAKE BACK RETURN|SHIP|ts. requests at the ironic deposits nag c +56162|238|39|3|24|27317.52|0.04|0.01|N|O|1995-07-07|1995-07-17|1995-07-29|NONE|TRUCK|r the furiously pending accounts cajole fur +56163|1861|62|1|48|84617.28|0.02|0.07|R|F|1994-10-26|1994-10-28|1994-11-17|COLLECT COD|AIR|tegrate furiously above the slyly final r +56163|1166|67|2|9|9604.44|0.10|0.00|R|F|1994-09-11|1994-09-29|1994-09-29|TAKE BACK RETURN|TRUCK|ial packages wake carefully even, fina +56163|983|84|3|23|43331.54|0.02|0.02|A|F|1994-11-24|1994-10-05|1994-12-07|TAKE BACK RETURN|REG AIR|inal depths. slyly r +56164|1154|55|1|24|25323.60|0.10|0.00|N|O|1998-07-10|1998-08-18|1998-07-31|NONE|SHIP|d furiously among the slyly regular dol +56164|1783|68|2|3|5054.34|0.07|0.06|N|O|1998-09-04|1998-08-14|1998-09-28|DELIVER IN PERSON|SHIP|ns kindle +56164|1726|11|3|36|58597.92|0.08|0.03|N|O|1998-06-17|1998-06-28|1998-06-26|NONE|FOB|xes. close, silent deposit +56164|47|23|4|18|17046.72|0.09|0.04|N|O|1998-06-26|1998-06-28|1998-07-12|TAKE BACK RETURN|REG AIR|lyly regular deposits. fluffily speci +56165|395|52|1|39|50520.21|0.00|0.04|R|F|1992-06-22|1992-06-11|1992-06-28|NONE|RAIL|s. packages sleep s +56166|1488|28|1|11|15284.28|0.04|0.02|A|F|1993-11-07|1993-10-27|1993-12-04|TAKE BACK RETURN|FOB|cial requests cajole slyly regular tithes. +56166|101|54|2|5|5005.50|0.10|0.06|R|F|1993-09-15|1993-10-14|1993-09-30|COLLECT COD|REG AIR|ly ironic theodol +56166|68|69|3|2|1936.12|0.02|0.04|A|F|1993-08-18|1993-10-09|1993-09-01|TAKE BACK RETURN|TRUCK|y bold requests sleep quickly express +56166|229|30|4|44|49685.68|0.06|0.00|R|F|1993-08-08|1993-09-18|1993-09-06|TAKE BACK RETURN|RAIL|final deposits: furiousl +56167|363|92|1|48|60641.28|0.05|0.02|N|O|1996-07-16|1996-05-31|1996-07-28|NONE|FOB|nag ruthlessly slyly regular escapades. spe +56167|727|60|2|36|58597.92|0.03|0.08|N|O|1996-07-01|1996-06-06|1996-07-18|COLLECT COD|SHIP|bove the unusual, +56192|675|38|1|42|66178.14|0.05|0.04|N|O|1997-04-11|1997-06-03|1997-05-06|NONE|RAIL| foxes haggle af +56192|19|20|2|32|29408.32|0.04|0.06|N|O|1997-06-23|1997-05-31|1997-06-24|COLLECT COD|FOB|. final theodolites w +56193|1564|65|1|11|16121.16|0.00|0.05|N|O|1996-07-16|1996-07-22|1996-08-09|COLLECT COD|FOB| furiously ironic requests nod furio +56193|816|83|2|1|1716.81|0.09|0.05|N|O|1996-07-22|1996-08-08|1996-08-08|COLLECT COD|MAIL|yly after the ironic, stealthy deposits. +56193|294|76|3|23|27468.67|0.01|0.04|N|O|1996-07-31|1996-08-19|1996-08-03|COLLECT COD|REG AIR|s. special asymp +56193|878|79|4|9|16009.83|0.00|0.01|N|O|1996-07-15|1996-08-20|1996-07-20|TAKE BACK RETURN|SHIP|cross the even, express fox +56193|1516|57|5|24|34020.24|0.04|0.02|N|O|1996-09-16|1996-08-26|1996-09-22|TAKE BACK RETURN|TRUCK|cies haggle final courts. slyly pending d +56193|406|7|6|33|43111.20|0.06|0.00|N|O|1996-08-15|1996-07-08|1996-09-04|DELIVER IN PERSON|RAIL|yly. slyly final accounts over th +56193|1363|64|7|32|40459.52|0.00|0.01|N|O|1996-09-27|1996-07-31|1996-10-22|DELIVER IN PERSON|AIR|uffily even theodolite +56194|1901|46|1|6|10817.40|0.04|0.05|N|O|1996-04-30|1996-05-02|1996-05-30|NONE|AIR|ns. slyly even warhorses thrash +56195|1608|50|1|33|49816.80|0.08|0.02|R|F|1993-08-19|1993-10-03|1993-08-27|TAKE BACK RETURN|RAIL|t carefully. fluffily pe +56195|1198|71|2|31|34074.89|0.03|0.04|A|F|1993-09-01|1993-09-17|1993-09-02|DELIVER IN PERSON|SHIP|l accounts +56195|1211|49|3|23|25580.83|0.02|0.03|R|F|1993-09-03|1993-08-10|1993-09-04|COLLECT COD|REG AIR|thely ironic theodolites +56196|828|62|1|20|34576.40|0.03|0.06|A|F|1995-03-04|1995-01-20|1995-03-27|DELIVER IN PERSON|TRUCK|ke furiously. blithely pending foxes det +56196|706|71|2|40|64268.00|0.01|0.05|A|F|1994-11-30|1994-12-29|1994-12-27|NONE|REG AIR|arefully above the fluffily final platel +56196|1146|19|3|7|7329.98|0.08|0.00|R|F|1995-01-07|1995-01-07|1995-01-23|TAKE BACK RETURN|MAIL|olites. bold instructions wake fluf +56196|1219|94|4|12|13442.52|0.07|0.08|A|F|1995-01-29|1994-12-26|1995-02-27|COLLECT COD|REG AIR|tructions. iron +56196|1748|33|5|48|79187.52|0.08|0.06|R|F|1995-02-04|1995-01-11|1995-02-16|COLLECT COD|MAIL|nic instructions +56197|829|29|1|2|3459.64|0.06|0.02|R|F|1994-07-06|1994-06-14|1994-07-24|COLLECT COD|AIR|etect across the requests. slyly bold p +56197|1587|68|2|49|72940.42|0.05|0.00|R|F|1994-05-16|1994-06-18|1994-06-05|COLLECT COD|REG AIR|ly special theodolites +56197|316|17|3|43|52301.33|0.03|0.07|R|F|1994-06-27|1994-07-20|1994-07-18|TAKE BACK RETURN|FOB|y unusual packages. fluffily i +56197|1895|39|4|17|30547.13|0.00|0.05|A|F|1994-06-15|1994-06-23|1994-06-18|COLLECT COD|AIR|es wake care +56197|804|4|5|24|40915.20|0.05|0.02|A|F|1994-08-29|1994-08-07|1994-09-24|NONE|RAIL|lent pains wake requests. pending packages +56198|1832|62|1|12|20805.96|0.05|0.06|N|O|1997-11-30|1997-12-19|1997-12-05|TAKE BACK RETURN|MAIL|ffily regular accounts haggl +56198|1683|66|2|34|53879.12|0.08|0.08|N|O|1998-01-11|1998-01-02|1998-01-15|DELIVER IN PERSON|MAIL|ts: slyly silent requests +56198|1527|8|3|14|19999.28|0.02|0.08|N|O|1998-02-12|1997-12-18|1998-03-01|DELIVER IN PERSON|SHIP|ular ideas boost according to t +56199|763|96|1|23|38266.48|0.00|0.01|N|O|1997-09-24|1997-08-25|1997-09-25|COLLECT COD|RAIL|instructions. regular acc +56224|437|67|1|40|53497.20|0.07|0.06|A|F|1992-12-08|1992-12-17|1992-12-27|NONE|TRUCK| during the blithely express foxes haggle +56224|549|50|2|23|33339.42|0.09|0.06|A|F|1993-02-01|1992-12-05|1993-02-05|NONE|FOB|sual ideas. b +56224|782|83|3|15|25241.70|0.01|0.04|R|F|1993-02-15|1993-01-04|1993-03-16|TAKE BACK RETURN|MAIL|ideas. even, regular ideas according to +56224|947|16|4|24|44350.56|0.00|0.01|R|F|1993-01-28|1993-01-17|1993-02-12|TAKE BACK RETURN|FOB|resias detect quickly abov +56224|392|77|5|28|36186.92|0.02|0.05|A|F|1993-01-04|1993-01-15|1993-01-05|NONE|TRUCK|ly. carefully unusual +56224|1551|92|6|39|56649.45|0.10|0.05|A|F|1993-01-20|1993-01-04|1993-01-21|DELIVER IN PERSON|REG AIR|ly regular pinto beans alongsi +56225|786|83|1|9|15181.02|0.06|0.04|N|O|1995-11-16|1995-12-27|1995-11-25|COLLECT COD|RAIL|nic dependencies run above th +56225|1722|49|2|38|61701.36|0.00|0.06|N|O|1995-12-18|1995-12-08|1995-12-24|COLLECT COD|AIR|es. regular packages haggle special reque +56225|1787|72|3|49|82750.22|0.00|0.03|N|O|1995-12-23|1995-12-14|1996-01-20|NONE|RAIL|inal asymptotes are re +56225|1049|20|4|12|11400.48|0.08|0.07|N|O|1995-12-10|1995-12-19|1995-12-22|COLLECT COD|MAIL|even instructions. express depos +56226|1163|36|1|1|1064.16|0.01|0.04|N|O|1996-12-28|1997-01-26|1997-01-02|NONE|SHIP|gle about the fluffily +56226|1407|8|2|21|27476.40|0.04|0.08|N|O|1997-01-03|1997-01-11|1997-01-29|DELIVER IN PERSON|MAIL|deposits. i +56226|240|22|3|28|31926.72|0.01|0.07|N|O|1997-02-14|1997-01-23|1997-02-21|COLLECT COD|RAIL| integrate alongside +56226|390|75|4|32|41292.48|0.08|0.03|N|O|1997-01-16|1997-03-03|1997-01-18|TAKE BACK RETURN|FOB|packages haggle on the flu +56226|1413|14|5|26|34174.66|0.01|0.06|N|O|1997-03-05|1997-02-03|1997-03-24|NONE|TRUCK|s. furiously special +56226|1669|70|6|46|72250.36|0.01|0.08|N|O|1997-01-17|1997-02-04|1997-02-16|NONE|FOB|inal deposits doubt carefully +56226|1529|50|7|29|41485.08|0.00|0.08|N|O|1997-02-12|1997-03-03|1997-03-12|NONE|SHIP|egular packages +56227|1701|44|1|31|49683.70|0.06|0.06|N|O|1996-12-24|1996-12-08|1997-01-21|DELIVER IN PERSON|AIR|he slyly re +56227|852|86|2|2|3505.70|0.10|0.00|N|O|1996-12-20|1996-11-12|1997-01-12|DELIVER IN PERSON|SHIP|somas along +56228|555|86|1|43|62588.65|0.01|0.04|A|F|1994-01-13|1994-02-01|1994-01-16|TAKE BACK RETURN|REG AIR| careful accounts. pendi +56228|977|12|2|48|90142.56|0.04|0.07|R|F|1993-12-31|1994-02-28|1994-01-26|NONE|TRUCK|iously regular grouches. slyly ironi +56228|1226|38|3|41|46216.02|0.00|0.02|R|F|1994-01-28|1994-02-06|1994-02-07|TAKE BACK RETURN|RAIL|hely express asymptotes. +56228|1741|42|4|37|60781.38|0.03|0.01|R|F|1994-02-12|1994-01-28|1994-02-14|DELIVER IN PERSON|SHIP|egular requests-- r +56228|375|60|5|17|21681.29|0.02|0.05|A|F|1993-12-28|1994-01-13|1994-01-09|DELIVER IN PERSON|TRUCK| unusual theodolites +56228|222|77|6|26|29177.72|0.04|0.06|A|F|1994-04-05|1994-02-06|1994-04-22|DELIVER IN PERSON|FOB|onic accoun +56229|1601|84|1|18|27046.80|0.07|0.06|N|O|1997-07-31|1997-08-30|1997-08-04|DELIVER IN PERSON|SHIP|ven deposits haggle against the fluffily re +56230|900|100|1|48|86443.20|0.06|0.01|R|F|1995-05-14|1995-07-21|1995-05-26|TAKE BACK RETURN|MAIL|quests. carefully +56230|527|28|2|33|47108.16|0.03|0.07|N|O|1995-06-27|1995-07-10|1995-07-06|NONE|TRUCK|riously silent deposits. deposits wake ca +56231|1018|19|1|26|23894.26|0.07|0.03|N|O|1998-08-01|1998-06-29|1998-08-29|DELIVER IN PERSON|AIR|ious requests doubt blithel +56231|666|98|2|50|78333.00|0.09|0.07|N|O|1998-06-01|1998-07-30|1998-06-10|NONE|AIR|es. deposits against the quickl +56256|90|66|1|24|23762.16|0.03|0.02|A|F|1993-11-08|1993-10-02|1993-12-05|DELIVER IN PERSON|SHIP|ter the slyly even deposits try to +56257|214|15|1|36|40111.56|0.07|0.00|N|O|1995-10-18|1995-12-07|1995-10-30|COLLECT COD|TRUCK| special excuses. +56257|233|15|2|38|43062.74|0.00|0.00|N|O|1995-09-29|1995-10-20|1995-10-28|NONE|SHIP|, even requests. fluffily pending warhorse +56257|1546|47|3|25|36188.50|0.06|0.08|N|O|1995-12-31|1995-11-11|1996-01-15|NONE|AIR|es sublate carefully among the +56257|1451|69|4|19|25696.55|0.05|0.08|N|O|1995-11-22|1995-10-31|1995-12-22|TAKE BACK RETURN|AIR|blithely foxes. packages +56258|579|40|1|18|26632.26|0.03|0.02|N|O|1997-04-04|1997-02-10|1997-04-26|TAKE BACK RETURN|MAIL| unusual platelets wake a +56258|853|53|2|27|47353.95|0.04|0.03|N|O|1997-04-06|1997-02-25|1997-05-03|NONE|SHIP|? express asymptotes x-r +56258|1844|45|3|9|15712.56|0.06|0.04|N|O|1997-03-19|1997-02-04|1997-04-08|DELIVER IN PERSON|REG AIR|ully ironic +56258|632|26|4|35|53642.05|0.06|0.04|N|O|1996-12-21|1997-01-30|1997-01-16|NONE|SHIP|ic dependencies wake slyly. +56258|511|42|5|42|59283.42|0.05|0.04|N|O|1997-01-16|1997-02-02|1997-01-26|COLLECT COD|TRUCK|l packages. blithely entic +56258|276|4|6|4|4705.08|0.10|0.07|N|O|1997-04-02|1997-02-03|1997-04-06|NONE|TRUCK|es. quickly regular deposits h +56259|1293|94|1|15|17914.35|0.08|0.03|N|O|1995-11-14|1996-01-01|1995-12-13|COLLECT COD|REG AIR|ons. slyly ironic requests a +56260|1448|49|1|42|56676.48|0.07|0.00|A|F|1994-09-21|1994-10-08|1994-10-20|DELIVER IN PERSON|MAIL|dolites. regular foxes +56260|1949|94|2|22|40720.68|0.04|0.04|A|F|1994-10-22|1994-11-01|1994-10-27|COLLECT COD|TRUCK|sly ironic requests haggl +56260|1581|22|3|32|47442.56|0.10|0.02|R|F|1994-10-09|1994-10-05|1994-10-21|NONE|SHIP|the slyly regular requests cajole slyly +56261|1350|51|1|39|48802.65|0.01|0.01|R|F|1992-04-09|1992-04-28|1992-04-17|COLLECT COD|FOB|ic deposits detect slyly alongsi +56261|1397|12|2|34|44145.26|0.05|0.04|A|F|1992-04-03|1992-04-17|1992-04-21|TAKE BACK RETURN|TRUCK| foxes. regular acc +56261|162|41|3|40|42486.40|0.03|0.06|R|F|1992-05-09|1992-04-07|1992-05-11|DELIVER IN PERSON|MAIL|eas wake care +56261|608|2|4|4|6034.40|0.03|0.04|R|F|1992-05-23|1992-05-16|1992-06-04|DELIVER IN PERSON|REG AIR|ages. furiou +56261|29|55|5|46|42734.92|0.08|0.05|R|F|1992-04-13|1992-05-23|1992-05-09|NONE|SHIP|haggle along the ideas. blith +56262|427|28|1|41|54424.22|0.01|0.07|N|O|1996-08-08|1996-07-02|1996-08-27|DELIVER IN PERSON|AIR|e pinto beans can affix slyly express fo +56262|1263|1|2|27|31435.02|0.06|0.05|N|O|1996-04-28|1996-07-08|1996-05-28|DELIVER IN PERSON|REG AIR| furiously. express requests sleep careful +56262|129|30|3|17|17495.04|0.10|0.01|N|O|1996-06-10|1996-05-20|1996-06-28|NONE|AIR|ssly even excuses. slyly regular foxes w +56262|530|21|4|27|38624.31|0.07|0.07|N|O|1996-04-25|1996-07-08|1996-05-17|COLLECT COD|SHIP|xes. fluffily r +56263|1405|6|1|44|57481.60|0.01|0.02|A|F|1993-10-02|1993-09-07|1993-10-16|COLLECT COD|MAIL| decoys haggle boldly across t +56288|598|99|1|8|11988.72|0.05|0.02|R|F|1993-07-09|1993-09-25|1993-07-18|COLLECT COD|TRUCK|ag among the bl +56288|1789|90|2|45|76085.10|0.00|0.04|A|F|1993-09-15|1993-08-15|1993-09-26|COLLECT COD|SHIP|c requests +56288|1736|37|3|40|65509.20|0.07|0.06|A|F|1993-07-13|1993-08-26|1993-08-11|NONE|RAIL|re carefully pending, +56288|1382|97|4|12|15400.56|0.04|0.07|R|F|1993-08-19|1993-09-06|1993-09-17|COLLECT COD|TRUCK|arefully regular theodoli +56289|1194|31|1|39|42712.41|0.03|0.08|N|O|1996-01-16|1996-01-27|1996-01-20|COLLECT COD|SHIP| sleep furiously +56290|1677|1|1|27|42624.09|0.10|0.03|A|F|1995-05-29|1995-06-18|1995-06-16|TAKE BACK RETURN|SHIP|l requests sleep slyly special acc +56290|564|25|2|35|51259.60|0.00|0.04|R|F|1995-04-19|1995-07-08|1995-04-28|DELIVER IN PERSON|MAIL|inal accounts in +56290|555|46|3|41|59677.55|0.00|0.03|N|O|1995-06-29|1995-06-10|1995-07-08|TAKE BACK RETURN|MAIL|ending packages cajole carefully. furious +56290|466|54|4|2|2732.92|0.10|0.03|R|F|1995-05-24|1995-06-03|1995-06-13|NONE|TRUCK|yly bold excuses. even theodolite +56290|204|86|5|8|8833.60|0.00|0.03|N|O|1995-08-08|1995-05-16|1995-08-22|DELIVER IN PERSON|TRUCK|ter the bold pin +56290|471|72|6|27|37029.69|0.01|0.07|N|F|1995-05-30|1995-07-07|1995-06-22|NONE|SHIP|even realms cajole regul +56290|819|19|7|6|10318.86|0.03|0.07|N|F|1995-06-02|1995-06-05|1995-06-22|TAKE BACK RETURN|SHIP|use carefully silent packages. +56291|1978|79|1|2|3759.94|0.06|0.07|R|F|1992-10-05|1992-12-11|1992-10-10|DELIVER IN PERSON|SHIP|y even asymptotes? clo +56291|1378|55|2|16|20469.92|0.07|0.02|R|F|1992-10-22|1992-10-29|1992-11-15|COLLECT COD|FOB|iously ironic deposits wake among the +56291|1491|70|3|17|23672.33|0.05|0.01|R|F|1992-11-09|1992-11-06|1992-11-14|COLLECT COD|AIR| pending theodolites sleep carefu +56291|1188|25|4|18|19605.24|0.05|0.07|R|F|1992-09-22|1992-11-05|1992-10-20|TAKE BACK RETURN|MAIL| fluffily ev +56291|1912|57|5|35|63486.85|0.02|0.02|R|F|1992-11-25|1992-11-02|1992-12-01|DELIVER IN PERSON|SHIP|grate busily carefully regular sh +56291|1118|19|6|40|40764.40|0.09|0.02|R|F|1992-11-05|1992-11-07|1992-11-23|TAKE BACK RETURN|AIR|ously according to the blithel +56292|345|30|1|15|18680.10|0.03|0.03|A|F|1992-05-22|1992-05-23|1992-06-20|TAKE BACK RETURN|RAIL| quickly. ironic dependencies doze f +56292|1899|86|2|48|86442.72|0.00|0.06|A|F|1992-03-07|1992-04-25|1992-03-13|COLLECT COD|SHIP|ing to the bl +56292|1117|26|3|45|45814.95|0.03|0.00|A|F|1992-04-28|1992-04-24|1992-05-22|COLLECT COD|AIR| pending r +56292|1868|98|4|23|40706.78|0.05|0.00|R|F|1992-03-04|1992-04-08|1992-03-06|DELIVER IN PERSON|MAIL|egular requests nag across the slyly bol +56292|624|18|5|23|35066.26|0.07|0.08|R|F|1992-06-29|1992-05-21|1992-07-27|DELIVER IN PERSON|SHIP|lly even frays above the blithely eve +56292|1705|32|6|29|46594.30|0.03|0.03|A|F|1992-03-04|1992-04-02|1992-03-15|COLLECT COD|TRUCK|quests cajole boldly instructions. quick +56293|929|30|1|13|23788.96|0.05|0.03|A|F|1993-04-11|1993-03-26|1993-04-30|DELIVER IN PERSON|AIR|ages. blithely +56293|1609|51|2|26|39275.60|0.03|0.05|R|F|1993-04-24|1993-03-24|1993-05-19|DELIVER IN PERSON|SHIP|iously even platelets. carefully ironic +56293|1407|86|3|8|10467.20|0.00|0.06|A|F|1993-01-22|1993-02-21|1993-02-11|TAKE BACK RETURN|MAIL|ke. furiously final dolphins are ar +56293|1723|24|4|42|68238.24|0.03|0.00|R|F|1993-04-29|1993-03-14|1993-05-15|COLLECT COD|RAIL|s. theodolites nag according to the bold, +56293|453|54|5|4|5413.80|0.07|0.00|R|F|1993-01-11|1993-04-04|1993-02-10|TAKE BACK RETURN|REG AIR|ly along the si +56294|643|6|1|26|40134.64|0.08|0.05|N|O|1998-04-14|1998-03-20|1998-04-17|TAKE BACK RETURN|SHIP|even packages nag slyly am +56294|1014|50|2|40|36600.40|0.00|0.00|N|O|1998-04-07|1998-04-30|1998-04-25|TAKE BACK RETURN|TRUCK|ke about the regula +56294|1365|80|3|4|5065.44|0.08|0.05|N|O|1998-03-15|1998-03-26|1998-04-01|TAKE BACK RETURN|SHIP|yly alongside of the regular +56294|471|30|4|3|4114.41|0.10|0.05|N|O|1998-04-27|1998-03-06|1998-05-14|NONE|REG AIR|ly ruthless accounts are around the even +56294|1354|55|5|27|33894.45|0.09|0.03|N|O|1998-03-07|1998-04-07|1998-03-17|TAKE BACK RETURN|TRUCK|eep slyly across the carefully pending +56294|763|96|6|47|78196.72|0.02|0.06|N|O|1998-03-27|1998-03-25|1998-04-16|DELIVER IN PERSON|SHIP|se after the even +56294|1331|32|7|14|17252.62|0.04|0.06|N|O|1998-05-01|1998-04-04|1998-05-22|NONE|MAIL|e pending accounts. furiously silent req +56295|1401|80|1|43|56003.20|0.09|0.03|R|F|1995-05-04|1995-05-10|1995-05-20|NONE|MAIL| play carefully through the carefu +56295|1683|84|2|44|69725.92|0.08|0.08|A|F|1995-05-15|1995-04-24|1995-05-19|DELIVER IN PERSON|TRUCK|express requests wake blithely acros +56295|1195|96|3|2|2192.38|0.00|0.08|R|F|1995-02-28|1995-03-30|1995-03-03|COLLECT COD|MAIL|n pinto beans are slyly across the fl +56320|1796|23|1|19|32258.01|0.08|0.04|N|O|1997-12-27|1997-10-02|1997-12-28|DELIVER IN PERSON|MAIL|symptotes wake furiously regular requests. +56320|872|6|2|39|69141.93|0.08|0.06|N|O|1997-11-01|1997-11-05|1997-11-15|NONE|SHIP|ecial instructions may integrate furious +56320|1624|66|3|17|25935.54|0.08|0.08|N|O|1997-10-03|1997-10-17|1997-10-18|COLLECT COD|SHIP|ly silent packages solve carefully after th +56321|615|16|1|12|18187.32|0.07|0.07|A|F|1993-07-08|1993-05-17|1993-07-16|TAKE BACK RETURN|FOB|across the slyly idle theodoli +56321|839|39|2|50|86991.50|0.06|0.04|R|F|1993-04-19|1993-05-25|1993-05-15|COLLECT COD|SHIP|efully regular pa +56321|54|5|3|42|40070.10|0.10|0.06|R|F|1993-08-06|1993-06-18|1993-08-22|TAKE BACK RETURN|REG AIR|ly special instructions wake q +56321|1612|13|4|39|59030.79|0.04|0.08|R|F|1993-07-25|1993-05-31|1993-07-31|NONE|RAIL|. slyly ironic foxes hang blithely iron +56321|45|96|5|46|43471.84|0.06|0.08|A|F|1993-06-02|1993-07-06|1993-06-06|DELIVER IN PERSON|MAIL|ges wake carefully above the ir +56321|696|59|6|16|25547.04|0.09|0.08|A|F|1993-05-15|1993-07-12|1993-06-08|COLLECT COD|SHIP| quickly unusual, ironic re +56321|1051|22|7|48|45698.40|0.06|0.03|A|F|1993-06-13|1993-06-06|1993-07-01|TAKE BACK RETURN|REG AIR|the blithe +56322|615|78|1|40|60624.40|0.09|0.06|N|O|1995-11-05|1995-11-01|1995-11-30|COLLECT COD|TRUCK|e furiously special accounts-- quickl +56322|1887|74|2|21|37566.48|0.06|0.07|N|O|1996-01-02|1995-12-03|1996-01-23|TAKE BACK RETURN|FOB| pinto beans are slyly pending reque +56322|114|15|3|11|11155.21|0.08|0.00|N|O|1995-11-01|1995-12-02|1995-11-14|TAKE BACK RETURN|REG AIR|ng requests after the +56322|624|87|4|17|25918.54|0.08|0.06|N|O|1995-12-26|1995-12-06|1996-01-07|NONE|FOB|ironic deposits +56322|1001|2|5|22|19844.00|0.05|0.08|N|O|1995-11-17|1995-12-10|1995-12-13|NONE|AIR|g deposits haggle closely afte +56323|790|91|1|31|52414.49|0.03|0.00|N|O|1997-02-05|1997-02-26|1997-02-23|NONE|REG AIR|. blithely b +56323|1775|60|2|33|55333.41|0.10|0.08|N|O|1997-03-10|1997-02-12|1997-03-25|DELIVER IN PERSON|MAIL|lets nag furiously stealthy accounts. car +56323|1479|97|3|40|55218.80|0.09|0.06|N|O|1997-03-29|1997-01-27|1997-04-24|COLLECT COD|REG AIR| above the quickly steal +56323|408|38|4|21|27476.40|0.02|0.08|N|O|1996-12-23|1997-03-05|1997-01-07|NONE|REG AIR|s. furiously sly foxes detect +56323|1070|76|5|1|971.07|0.02|0.06|N|O|1997-02-14|1997-01-26|1997-02-16|COLLECT COD|AIR|arefully pending requests? unusual, expr +56324|471|59|1|37|50744.39|0.00|0.04|N|O|1996-01-11|1996-03-11|1996-02-05|DELIVER IN PERSON|AIR|rding to the slyly ironic instruc +56324|1205|80|2|2|2212.40|0.10|0.04|N|O|1996-04-09|1996-02-22|1996-04-12|DELIVER IN PERSON|REG AIR|oss the carefully unusual accounts wake c +56325|1787|14|1|16|27020.48|0.10|0.07|N|O|1998-03-30|1998-02-05|1998-04-27|DELIVER IN PERSON|MAIL|regular theodolites amo +56326|775|8|1|8|13406.16|0.02|0.00|N|O|1998-07-16|1998-08-05|1998-08-13|NONE|AIR|hockey players integrate blithely +56326|1133|34|2|14|14477.82|0.10|0.00|N|O|1998-07-20|1998-09-01|1998-07-25|COLLECT COD|RAIL|ular foxes above the final instructi +56326|1849|93|3|14|24511.76|0.02|0.03|N|O|1998-09-27|1998-09-05|1998-10-09|NONE|AIR|haggle boldly. final +56327|1164|73|1|20|21303.20|0.07|0.04|A|F|1993-01-25|1993-02-17|1993-01-31|TAKE BACK RETURN|MAIL|ously express request +56327|1531|52|2|15|21487.95|0.05|0.05|A|F|1993-03-31|1993-02-20|1993-04-21|COLLECT COD|TRUCK|yly pending requests believe. quickly i +56327|1979|12|3|4|7523.88|0.02|0.03|R|F|1993-04-25|1993-03-21|1993-05-11|TAKE BACK RETURN|AIR|heodolites to the f +56327|792|93|4|45|76175.55|0.10|0.04|R|F|1993-03-27|1993-03-13|1993-04-10|TAKE BACK RETURN|FOB| carefully express courts. furiously rut +56327|366|67|5|26|32925.36|0.09|0.08|A|F|1993-03-15|1993-02-12|1993-03-25|TAKE BACK RETURN|AIR| against the unusual deposi +56327|1679|62|6|23|36355.41|0.04|0.03|R|F|1993-03-24|1993-03-23|1993-04-10|COLLECT COD|REG AIR|ly blithely final packages. quickly regul +56327|1447|87|7|24|32362.56|0.08|0.05|R|F|1993-03-23|1993-03-10|1993-04-13|COLLECT COD|TRUCK|ove the slyly pending accounts. slyly u +56352|236|18|1|35|39768.05|0.09|0.03|N|O|1997-01-19|1997-03-05|1997-02-11|TAKE BACK RETURN|AIR| across the enticingly regular deposits. fu +56352|885|85|2|18|32145.84|0.00|0.01|N|O|1997-01-20|1997-03-29|1997-01-22|COLLECT COD|MAIL|iously regular +56353|160|61|1|39|41346.24|0.07|0.05|N|O|1997-05-14|1997-06-06|1997-05-18|DELIVER IN PERSON|SHIP|s wake slyly about the final instructio +56354|1562|63|1|37|54151.72|0.06|0.07|R|F|1992-03-27|1992-03-25|1992-04-12|DELIVER IN PERSON|RAIL|unusual, ironic deposits. +56355|1351|90|1|21|26299.35|0.10|0.05|N|O|1996-03-27|1996-05-22|1996-04-20|COLLECT COD|FOB|sly blithe epitaphs. slyly even theodo +56355|1885|15|2|43|76835.84|0.04|0.06|N|O|1996-04-17|1996-03-30|1996-04-27|NONE|RAIL|ests snooze furiously ironic accounts. +56355|1977|78|3|8|15031.76|0.03|0.05|N|O|1996-04-26|1996-04-14|1996-05-14|DELIVER IN PERSON|FOB|uriously regular accounts haggle slyly +56355|475|34|4|50|68773.50|0.01|0.06|N|O|1996-04-27|1996-05-22|1996-05-03|COLLECT COD|MAIL|ly against +56355|1270|8|5|41|48022.07|0.07|0.03|N|O|1996-03-13|1996-04-08|1996-03-21|DELIVER IN PERSON|SHIP|tions boost requests. blithely blithe pinto +56355|1958|3|6|18|33479.10|0.06|0.04|N|O|1996-05-18|1996-05-25|1996-06-06|DELIVER IN PERSON|REG AIR|lly bold fo +56356|449|37|1|24|32386.56|0.05|0.02|N|O|1998-02-09|1998-01-14|1998-02-24|DELIVER IN PERSON|RAIL|refully after the ironic +56356|1854|55|2|40|70234.00|0.03|0.06|N|O|1997-12-16|1998-02-02|1998-01-14|COLLECT COD|SHIP|ts. final asymptotes use after the slyly +56356|170|71|3|37|39596.29|0.09|0.08|N|O|1998-03-12|1998-02-09|1998-03-24|COLLECT COD|RAIL|ep slyly furiously +56357|1300|1|1|13|15616.90|0.00|0.05|N|O|1996-11-28|1996-09-07|1996-12-18|TAKE BACK RETURN|TRUCK|ns; slyly regular accounts among +56357|236|18|2|2|2272.46|0.04|0.03|N|O|1996-10-09|1996-10-09|1996-11-03|TAKE BACK RETURN|MAIL|ular deposits. final +56358|320|5|1|42|51253.44|0.01|0.05|R|F|1992-04-26|1992-05-24|1992-05-14|COLLECT COD|MAIL|iously special asymptotes aroun +56359|1966|11|1|50|93398.00|0.03|0.03|R|F|1994-02-20|1994-03-05|1994-03-22|NONE|RAIL|ular accounts. furiously iro +56359|780|81|2|16|26892.48|0.06|0.08|R|F|1994-02-04|1994-02-26|1994-02-06|TAKE BACK RETURN|MAIL|ing the fluffily ironic pinto +56359|1641|42|3|29|44736.56|0.06|0.08|A|F|1994-03-26|1994-02-13|1994-04-24|COLLECT COD|TRUCK|e the regular, final +56359|1291|3|4|9|10730.61|0.10|0.03|A|F|1994-01-09|1994-01-29|1994-01-31|COLLECT COD|SHIP|dencies lose requ +56359|1020|56|5|36|33156.72|0.01|0.04|R|F|1993-12-30|1994-01-27|1994-01-24|DELIVER IN PERSON|FOB| accounts. even packages breach about t +56359|772|5|6|44|73601.88|0.00|0.01|A|F|1994-03-27|1994-03-21|1994-03-30|COLLECT COD|AIR|y special pinto beans bo +56359|343|44|7|18|22380.12|0.09|0.01|R|F|1994-01-14|1994-02-11|1994-01-16|TAKE BACK RETURN|TRUCK|ourts alongsi +56384|1049|20|1|46|43701.84|0.02|0.01|A|F|1992-08-10|1992-09-22|1992-09-07|TAKE BACK RETURN|MAIL|even accounts sle +56384|1486|65|2|33|45786.84|0.05|0.08|R|F|1992-11-30|1992-10-02|1992-12-26|NONE|REG AIR|y along the bold req +56384|1409|10|3|22|28828.80|0.00|0.06|R|F|1992-09-10|1992-09-25|1992-09-18|NONE|MAIL|le slyly regular requests. final depe +56384|591|82|4|47|70104.73|0.04|0.00|A|F|1992-08-30|1992-09-30|1992-09-27|NONE|TRUCK|unusual dependencies. silent +56384|449|79|5|30|40483.20|0.02|0.06|A|F|1992-11-14|1992-10-15|1992-11-15|DELIVER IN PERSON|REG AIR|ts cajole fl +56384|217|18|6|9|10054.89|0.03|0.03|A|F|1992-08-08|1992-09-28|1992-08-23|NONE|AIR|lar packages; furiously unusual packag +56384|1568|69|7|30|44086.80|0.01|0.05|A|F|1992-10-19|1992-09-10|1992-11-12|DELIVER IN PERSON|AIR|uses in place of the boldly even asy +56385|247|48|1|37|42447.88|0.00|0.08|N|O|1998-07-18|1998-06-20|1998-07-21|COLLECT COD|TRUCK|. final, bol +56385|1388|3|2|47|60600.86|0.10|0.04|N|O|1998-07-17|1998-04-30|1998-08-08|DELIVER IN PERSON|FOB|ckages alon +56385|309|66|3|29|35069.70|0.00|0.08|N|O|1998-07-02|1998-05-03|1998-07-12|TAKE BACK RETURN|TRUCK|slyly. regular, bold pinto beans affix +56386|977|12|1|10|18779.70|0.05|0.03|N|O|1996-12-24|1997-01-02|1997-01-08|COLLECT COD|RAIL|refully ironic deposits. bli +56386|281|36|2|7|8268.96|0.01|0.02|N|O|1997-03-20|1997-01-23|1997-04-05|COLLECT COD|AIR| beans. iron +56386|61|12|3|31|29792.86|0.04|0.07|N|O|1997-02-02|1997-02-16|1997-02-10|NONE|REG AIR|hely fluffily ironic realms. +56387|1644|68|1|21|32458.44|0.08|0.02|N|O|1995-07-30|1995-08-01|1995-08-21|TAKE BACK RETURN|REG AIR|y express t +56387|1457|75|2|2|2716.90|0.10|0.00|N|O|1995-06-27|1995-07-26|1995-07-17|TAKE BACK RETURN|AIR|thely bold d +56387|1449|28|3|46|62120.24|0.10|0.05|N|O|1995-07-03|1995-08-13|1995-07-20|DELIVER IN PERSON|REG AIR|foxes must nag +56387|252|80|4|41|47242.25|0.05|0.01|N|O|1995-07-03|1995-06-30|1995-07-13|COLLECT COD|SHIP|ns affix. slyly ironic warhorses +56387|775|72|5|31|51948.87|0.09|0.02|N|O|1995-07-04|1995-07-13|1995-07-08|DELIVER IN PERSON|REG AIR|r, busy packages haggl +56387|310|11|6|16|19364.96|0.04|0.04|N|O|1995-07-19|1995-06-27|1995-08-10|NONE|AIR| special ideas nag alongside of th +56387|1699|41|7|39|62426.91|0.03|0.01|N|O|1995-08-17|1995-07-18|1995-08-28|COLLECT COD|TRUCK|ss instructio +56388|1314|29|1|9|10937.79|0.10|0.02|N|O|1997-03-14|1997-04-09|1997-04-04|NONE|SHIP|thely regular foxes haggle regu +56388|1368|83|2|26|33003.36|0.03|0.06|N|O|1997-06-09|1997-04-28|1997-06-26|DELIVER IN PERSON|MAIL|ke blithely aft +56388|1981|70|3|50|94149.00|0.05|0.04|N|O|1997-05-31|1997-03-29|1997-06-04|TAKE BACK RETURN|MAIL|integrate? carefully pending req +56388|1009|15|4|3|2730.00|0.05|0.03|N|O|1997-04-16|1997-05-02|1997-04-23|COLLECT COD|TRUCK|lly final requests haggle carefully. +56388|375|76|5|37|47188.69|0.02|0.00|N|O|1997-03-30|1997-05-14|1997-04-07|DELIVER IN PERSON|RAIL|usly pending instructions. a +56388|1930|31|6|34|62285.62|0.04|0.04|N|O|1997-05-21|1997-04-22|1997-06-15|TAKE BACK RETURN|TRUCK|le against the specia +56388|1023|94|7|23|21252.46|0.06|0.04|N|O|1997-03-16|1997-04-25|1997-04-12|DELIVER IN PERSON|TRUCK| regular, bold accounts +56389|348|49|1|21|26215.14|0.03|0.02|N|O|1997-10-11|1997-08-24|1997-10-19|COLLECT COD|AIR|lets along the carefully final +56389|1337|38|2|31|38388.23|0.06|0.03|N|O|1997-09-09|1997-09-09|1997-10-02|NONE|MAIL|xes-- slyly ironic +56389|678|72|3|4|6314.68|0.03|0.07|N|O|1997-10-09|1997-10-10|1997-10-11|COLLECT COD|FOB|regular, regular deposits. depo +56389|1242|80|4|21|24008.04|0.05|0.01|N|O|1997-10-05|1997-09-28|1997-10-06|COLLECT COD|TRUCK|d the blithely unusual fox +56389|1883|70|5|27|48191.76|0.07|0.04|N|O|1997-11-11|1997-09-26|1997-12-11|DELIVER IN PERSON|SHIP|ording to the blithely regular foxe +56389|1885|86|6|18|32163.84|0.07|0.08|N|O|1997-11-09|1997-09-24|1997-11-10|DELIVER IN PERSON|MAIL|c theodolites. slyly dogged requ +56390|849|49|1|33|57744.72|0.05|0.01|N|O|1997-04-12|1997-04-27|1997-04-25|COLLECT COD|MAIL|gular deposi +56390|3|54|2|16|14448.00|0.00|0.07|N|O|1997-04-05|1997-03-23|1997-04-09|DELIVER IN PERSON|TRUCK|riously. blithely final asymptotes are s +56390|1997|98|3|48|91151.52|0.08|0.06|N|O|1997-02-28|1997-04-04|1997-03-02|COLLECT COD|AIR| bold theodolites haggle. blithely final in +56390|54|55|4|34|32437.70|0.07|0.08|N|O|1997-05-25|1997-04-20|1997-06-23|NONE|RAIL|ts haggle blithely furiously final +56390|578|69|5|39|57664.23|0.01|0.03|N|O|1997-03-23|1997-04-21|1997-04-21|DELIVER IN PERSON|AIR|ts use slyly: final accounts +56390|1120|93|6|40|40844.80|0.00|0.08|N|O|1997-04-25|1997-04-13|1997-04-30|COLLECT COD|MAIL|n asymptot +56390|1375|90|7|41|52331.17|0.05|0.00|N|O|1997-04-02|1997-05-05|1997-04-17|COLLECT COD|MAIL|deas unwin +56391|1921|22|1|27|49218.84|0.06|0.00|N|O|1995-10-26|1995-09-22|1995-11-18|DELIVER IN PERSON|SHIP|al, blithe packages. foxes cajole af +56391|1910|11|2|37|67040.67|0.03|0.00|N|O|1995-10-28|1995-10-30|1995-11-15|TAKE BACK RETURN|SHIP|e of the unusual foxes +56391|281|63|3|6|7087.68|0.04|0.06|N|O|1995-11-21|1995-10-22|1995-12-05|TAKE BACK RETURN|AIR|ng the slyly +56391|1466|67|4|12|16409.52|0.00|0.08|N|O|1995-09-10|1995-10-23|1995-10-01|TAKE BACK RETURN|TRUCK|nstructions boost careful +56391|912|81|5|3|5438.73|0.06|0.02|N|O|1995-09-29|1995-09-28|1995-10-27|NONE|TRUCK| the slyly ir +56391|597|98|6|25|37439.75|0.07|0.04|N|O|1995-11-19|1995-11-17|1995-11-22|TAKE BACK RETURN|MAIL|even, bold instr +56416|1862|6|1|46|81137.56|0.10|0.03|R|F|1992-05-24|1992-07-01|1992-06-09|TAKE BACK RETURN|AIR|dolites. platelets across the quic +56417|1451|91|1|23|31106.35|0.03|0.08|N|O|1997-09-18|1997-08-02|1997-10-01|NONE|TRUCK|accounts. slyly fin +56417|936|39|2|29|53270.97|0.03|0.05|N|O|1997-07-04|1997-07-17|1997-08-01|TAKE BACK RETURN|AIR|as. carefully regular packages engage +56417|1285|97|3|48|56941.44|0.10|0.07|N|O|1997-08-04|1997-08-16|1997-08-26|TAKE BACK RETURN|REG AIR|express excus +56418|36|37|1|41|38377.23|0.07|0.02|R|F|1992-08-02|1992-05-28|1992-08-03|TAKE BACK RETURN|MAIL|dencies cajole blithely qu +56418|114|15|2|12|12169.32|0.09|0.06|A|F|1992-05-23|1992-05-19|1992-06-02|TAKE BACK RETURN|AIR|e boldly ir +56418|1319|58|3|38|46371.78|0.05|0.04|A|F|1992-05-27|1992-06-19|1992-05-29|TAKE BACK RETURN|RAIL|sly after the slyly +56418|143|96|4|28|29207.92|0.00|0.06|A|F|1992-04-14|1992-07-01|1992-05-01|TAKE BACK RETURN|RAIL| final requests sl +56418|754|87|5|6|9928.50|0.04|0.01|R|F|1992-06-11|1992-06-27|1992-07-02|COLLECT COD|TRUCK|ackages. final packages against the quic +56419|1874|75|1|39|69258.93|0.01|0.06|A|F|1993-06-13|1993-08-12|1993-07-12|TAKE BACK RETURN|RAIL|eep fluffily aga +56420|1417|96|1|39|51417.99|0.08|0.06|N|O|1995-08-16|1995-08-25|1995-08-18|NONE|TRUCK| quickly unusual pack +56420|1375|52|2|19|24251.03|0.07|0.00|N|O|1995-11-11|1995-09-22|1995-11-12|NONE|AIR|nding deposits. regular pinto beans acco +56420|1375|90|3|37|47225.69|0.10|0.05|N|O|1995-11-16|1995-09-24|1995-11-17|COLLECT COD|SHIP|egular dugouts boost. carefully +56420|1184|85|4|26|28214.68|0.05|0.00|N|O|1995-07-26|1995-09-15|1995-07-27|TAKE BACK RETURN|FOB|y regular packages. carefully ironi +56421|1136|37|1|17|17631.21|0.04|0.04|N|O|1997-02-08|1997-03-06|1997-03-04|TAKE BACK RETURN|REG AIR|eodolites run furiously about the slyly +56421|281|82|2|32|37800.96|0.08|0.01|N|O|1997-04-06|1997-02-14|1997-04-11|NONE|FOB|ounts wake blithely against the fin +56421|1830|60|3|44|76200.52|0.07|0.07|N|O|1997-02-23|1997-03-18|1997-02-26|DELIVER IN PERSON|RAIL| brave requests. carefully regu +56421|544|75|4|33|47669.82|0.06|0.01|N|O|1997-03-09|1997-03-15|1997-03-30|COLLECT COD|REG AIR|fluffily abo +56421|529|60|5|46|65757.92|0.10|0.03|N|O|1997-01-14|1997-03-12|1997-01-21|TAKE BACK RETURN|SHIP|ests. fluffily pend +56421|194|21|6|3|3282.57|0.05|0.05|N|O|1996-12-23|1997-03-06|1996-12-27|NONE|REG AIR|od bold ideas. packages against the blit +56422|714|11|1|48|77506.08|0.02|0.04|A|F|1992-05-30|1992-03-10|1992-06-21|NONE|FOB| above the express packages sl +56422|1306|21|2|47|56743.10|0.03|0.06|R|F|1992-06-05|1992-03-18|1992-06-10|TAKE BACK RETURN|SHIP|uickly unusual packages haggle s +56422|1777|78|3|38|63793.26|0.02|0.08|R|F|1992-05-17|1992-03-29|1992-05-30|TAKE BACK RETURN|FOB|urts? slyly silent packa +56423|695|89|1|48|76593.12|0.08|0.04|N|O|1996-03-05|1996-03-25|1996-03-30|TAKE BACK RETURN|REG AIR|s after the courts wake sheaves. reg +56423|1554|75|2|35|50944.25|0.00|0.01|N|O|1996-03-10|1996-03-01|1996-03-17|COLLECT COD|SHIP| dependencies. blithely special packa +56423|1499|100|3|38|53218.62|0.09|0.01|N|O|1996-04-17|1996-02-08|1996-05-06|TAKE BACK RETURN|TRUCK|dolites cajole carefull +56423|1579|100|4|38|56261.66|0.02|0.00|N|O|1996-02-17|1996-02-09|1996-03-02|NONE|TRUCK|ending accou +56423|1732|75|5|2|3267.46|0.00|0.07|N|O|1996-01-25|1996-03-21|1996-02-20|TAKE BACK RETURN|TRUCK|quickly. blithely unusual theodolite +56423|1028|29|6|3|2787.06|0.10|0.08|N|O|1996-04-20|1996-03-22|1996-05-06|NONE|SHIP|urts promise blithely after the +56448|678|41|1|38|59989.46|0.04|0.07|A|F|1993-08-24|1993-11-14|1993-09-12|NONE|AIR| requests. +56448|1593|94|2|44|65761.96|0.04|0.08|A|F|1993-11-16|1993-10-06|1993-11-22|COLLECT COD|MAIL|nts. ideas nag blithely. pending, ex +56449|637|38|1|34|52279.42|0.10|0.01|N|O|1998-08-20|1998-07-23|1998-09-13|DELIVER IN PERSON|SHIP|into beans det +56449|835|36|2|21|36452.43|0.04|0.02|N|O|1998-06-28|1998-08-07|1998-06-29|COLLECT COD|AIR|ites kindle blithely about the furi +56449|412|13|3|15|19686.15|0.04|0.03|N|O|1998-07-21|1998-07-30|1998-08-17|DELIVER IN PERSON|AIR|le. blithely regul +56449|21|22|4|36|33156.72|0.03|0.06|N|O|1998-08-17|1998-07-22|1998-09-16|COLLECT COD|RAIL|e carefully ev +56450|629|30|1|40|61184.80|0.08|0.01|N|O|1998-08-25|1998-09-12|1998-08-26|TAKE BACK RETURN|FOB|ending requests sleep according t +56451|416|17|1|30|39492.30|0.09|0.04|N|O|1996-12-21|1997-01-26|1996-12-22|DELIVER IN PERSON|FOB|ely blithely even ex +56451|1376|53|2|29|37043.73|0.06|0.03|N|O|1996-11-10|1997-01-23|1996-11-12|DELIVER IN PERSON|AIR|ckages cajole quickly about the express, fi +56452|1638|21|1|5|7698.15|0.09|0.04|A|F|1994-05-01|1994-04-20|1994-05-18|TAKE BACK RETURN|SHIP|carefully about the ironic platelets +56452|844|44|2|29|50600.36|0.01|0.00|R|F|1994-05-26|1994-04-24|1994-05-30|COLLECT COD|REG AIR|uctions! final packages across the re +56452|986|87|3|7|13208.86|0.03|0.00|R|F|1994-06-11|1994-05-04|1994-06-12|NONE|REG AIR|xes. slyly express accoun +56453|1587|28|1|2|2977.16|0.05|0.03|A|F|1992-07-13|1992-05-20|1992-07-26|TAKE BACK RETURN|REG AIR| requests alongsid +56453|1756|99|2|21|34812.75|0.06|0.04|R|F|1992-07-12|1992-07-11|1992-08-08|COLLECT COD|AIR|s. pending theodolit +56453|461|49|3|4|5445.84|0.09|0.00|A|F|1992-07-31|1992-06-03|1992-08-28|NONE|REG AIR|as. regular accounts are +56453|1674|57|4|33|51997.11|0.00|0.03|R|F|1992-07-02|1992-06-23|1992-07-28|NONE|AIR|y ironic ideas x-ray furiou +56453|1956|1|5|43|79891.85|0.02|0.06|A|F|1992-04-30|1992-05-15|1992-05-15|TAKE BACK RETURN|SHIP| final requests nag blithely ruthle +56453|323|80|6|10|12233.20|0.07|0.02|A|F|1992-08-04|1992-06-25|1992-08-19|DELIVER IN PERSON|FOB|ermanent foxes integr +56453|1893|23|7|18|32308.02|0.02|0.06|R|F|1992-06-12|1992-05-24|1992-07-01|DELIVER IN PERSON|FOB|ully pending pinto beans. +56454|641|73|1|21|32374.44|0.05|0.00|N|O|1997-01-08|1997-03-02|1997-01-09|NONE|TRUCK|ainst the furiously unusual pinto beans +56454|1563|4|2|48|70298.88|0.01|0.06|N|O|1997-03-03|1997-02-01|1997-03-26|TAKE BACK RETURN|AIR| unusual packages across th +56455|839|6|1|33|57414.39|0.00|0.02|R|F|1992-03-12|1992-03-02|1992-03-19|NONE|AIR|ctions. blit +56455|29|80|2|30|27870.60|0.03|0.06|R|F|1992-04-07|1992-03-31|1992-05-02|DELIVER IN PERSON|REG AIR|e ironic, regular platelets sleep +56455|114|93|3|8|8112.88|0.09|0.03|R|F|1992-04-28|1992-04-02|1992-05-04|NONE|RAIL|by the unusual decoys. requests among t +56455|737|70|4|16|26203.68|0.03|0.04|A|F|1992-03-29|1992-04-21|1992-04-20|DELIVER IN PERSON|REG AIR|ding packages. bl +56455|784|49|5|24|40434.72|0.07|0.06|R|F|1992-04-16|1992-02-23|1992-05-07|NONE|REG AIR|ld depths at the carefully pending idea +56480|93|94|1|2|1986.18|0.09|0.04|R|F|1993-03-24|1993-06-02|1993-03-26|TAKE BACK RETURN|AIR|an use quickly slyly special pinto bean +56481|1386|25|1|27|34759.26|0.02|0.01|A|F|1993-04-25|1993-06-08|1993-04-29|TAKE BACK RETURN|MAIL|sly ironic pinto beans. regular +56482|44|70|1|24|22656.96|0.02|0.05|R|F|1993-09-17|1993-08-30|1993-09-27|COLLECT COD|AIR|ges nag atop the +56482|609|3|2|49|73970.40|0.09|0.08|R|F|1993-06-13|1993-08-27|1993-07-04|COLLECT COD|MAIL|y along the slyly silent requests. f +56482|664|58|3|27|42245.82|0.06|0.01|R|F|1993-06-17|1993-08-24|1993-06-27|DELIVER IN PERSON|REG AIR|! pending epi +56483|1845|32|1|25|43671.00|0.02|0.00|A|F|1994-06-10|1994-04-19|1994-07-01|TAKE BACK RETURN|TRUCK|even instructions. carefully ironic asy +56483|1262|74|2|8|9306.08|0.09|0.00|A|F|1994-05-17|1994-05-17|1994-05-18|DELIVER IN PERSON|AIR|en instructions su +56484|649|43|1|49|75932.36|0.05|0.00|N|O|1996-01-01|1995-12-27|1996-01-02|NONE|RAIL|y ironic foxes. brave dependen +56484|1715|100|2|48|77602.08|0.04|0.06|N|O|1996-03-04|1995-12-25|1996-03-18|TAKE BACK RETURN|RAIL|he final, ironic accounts. ironic depo +56484|950|85|3|15|27764.25|0.03|0.00|N|O|1996-01-23|1996-02-09|1996-02-09|NONE|FOB|kages hagg +56484|1499|100|4|42|58820.58|0.09|0.02|N|O|1996-03-15|1996-02-14|1996-03-18|COLLECT COD|TRUCK|the blithely express accounts. quickly +56484|331|16|5|27|33245.91|0.10|0.07|N|O|1996-03-01|1996-02-19|1996-03-30|NONE|TRUCK|sits. furiously pend +56485|178|5|1|30|32345.10|0.03|0.04|N|O|1996-09-01|1996-10-13|1996-09-05|COLLECT COD|AIR|sleep blithely. f +56486|1111|12|1|45|45544.95|0.00|0.01|A|F|1994-08-27|1994-06-29|1994-09-23|NONE|TRUCK|ial foxes. final, unusual accounts sleep. +56486|1504|25|2|48|67464.00|0.01|0.06|A|F|1994-07-10|1994-07-26|1994-07-23|DELIVER IN PERSON|REG AIR|accounts cajo +56486|1395|10|3|37|47966.43|0.01|0.08|R|F|1994-09-24|1994-07-18|1994-10-18|DELIVER IN PERSON|MAIL| use furiously across the bold, even pack +56486|894|61|4|3|5384.67|0.00|0.07|A|F|1994-09-14|1994-07-17|1994-10-02|DELIVER IN PERSON|MAIL|accounts might wake across the blithel +56486|942|77|5|5|9214.70|0.09|0.05|A|F|1994-06-03|1994-08-07|1994-07-01|DELIVER IN PERSON|RAIL| the slyly even foxes. blithely si +56487|1261|62|1|38|44165.88|0.01|0.05|N|O|1995-08-25|1995-07-18|1995-08-30|DELIVER IN PERSON|REG AIR|hely regular pinto +56512|165|44|1|43|45801.88|0.05|0.08|N|O|1997-08-09|1997-07-20|1997-08-15|COLLECT COD|FOB|e requests. regular +56512|1949|82|2|18|33316.92|0.09|0.01|N|O|1997-05-02|1997-07-09|1997-06-01|TAKE BACK RETURN|AIR|lyly final requests. furi +56513|1971|16|1|37|69299.89|0.10|0.01|N|O|1996-08-16|1996-09-02|1996-08-30|DELIVER IN PERSON|REG AIR|ts lose furiously slyly unusual accounts +56513|1560|41|2|10|14615.60|0.08|0.00|N|O|1996-09-13|1996-08-28|1996-10-05|COLLECT COD|AIR|fily against the pending, regular +56513|503|4|3|48|67368.00|0.00|0.07|N|O|1996-09-02|1996-08-16|1996-09-25|TAKE BACK RETURN|SHIP| furiously express +56513|384|13|4|35|44953.30|0.04|0.08|N|O|1996-06-13|1996-08-02|1996-07-07|NONE|MAIL|; final packages believe furiously ironic +56513|1322|37|5|9|11009.88|0.07|0.04|N|O|1996-09-19|1996-08-30|1996-10-10|DELIVER IN PERSON|RAIL|atelets wake fluffil +56513|1534|55|6|20|28710.60|0.06|0.02|N|O|1996-09-22|1996-07-09|1996-10-03|TAKE BACK RETURN|REG AIR|s! final, blithe asymptotes cajol +56513|1732|33|7|21|34308.33|0.09|0.07|N|O|1996-08-29|1996-07-09|1996-09-02|NONE|AIR|oss the pending packages. b +56514|1322|99|1|2|2446.64|0.07|0.03|A|F|1992-05-12|1992-04-17|1992-05-15|DELIVER IN PERSON|TRUCK|unts. furiously +56514|534|35|2|33|47339.49|0.00|0.02|A|F|1992-06-02|1992-03-17|1992-06-07|TAKE BACK RETURN|TRUCK|ng to the +56514|375|4|3|4|5101.48|0.03|0.01|R|F|1992-02-23|1992-03-24|1992-03-20|NONE|RAIL|fily across the even ex +56514|613|14|4|23|34813.03|0.10|0.08|R|F|1992-02-29|1992-04-25|1992-03-05|TAKE BACK RETURN|MAIL| to the special, express accounts haggl +56514|1105|78|5|47|47286.70|0.01|0.07|R|F|1992-05-05|1992-05-11|1992-06-04|NONE|SHIP|nic frets +56514|900|34|6|46|82841.40|0.08|0.07|R|F|1992-05-01|1992-05-04|1992-05-09|NONE|TRUCK| slyly even accounts +56515|1712|39|1|26|41956.46|0.07|0.06|N|O|1995-07-07|1995-07-21|1995-07-21|TAKE BACK RETURN|REG AIR|e blithely above th +56515|211|39|2|18|20001.78|0.02|0.08|N|O|1995-09-19|1995-07-17|1995-10-12|DELIVER IN PERSON|SHIP|usual excuses +56515|1996|41|3|8|15183.92|0.07|0.04|N|O|1995-07-08|1995-07-15|1995-08-05|COLLECT COD|RAIL|nts. express +56515|427|86|4|32|42477.44|0.02|0.02|N|O|1995-07-10|1995-06-28|1995-07-28|COLLECT COD|AIR|closely. blithely express account +56516|1607|8|1|28|42240.80|0.09|0.07|R|F|1994-11-30|1994-09-22|1994-12-04|DELIVER IN PERSON|MAIL|ccounts unwind ironic requests. furio +56516|175|76|2|7|7526.19|0.07|0.08|A|F|1994-12-03|1994-10-01|1994-12-06|COLLECT COD|AIR|carefully after the +56516|196|49|3|47|51520.93|0.08|0.07|R|F|1994-10-29|1994-10-09|1994-11-20|TAKE BACK RETURN|REG AIR| regular deposits cajole pac +56516|221|22|4|3|3363.66|0.07|0.06|R|F|1994-11-09|1994-11-02|1994-11-13|DELIVER IN PERSON|REG AIR|al accounts. quickly special depend +56516|10|86|5|17|15470.17|0.09|0.08|A|F|1994-09-20|1994-10-30|1994-09-26|NONE|TRUCK|dencies haggl +56516|1326|65|6|9|11045.88|0.04|0.07|A|F|1994-09-16|1994-10-05|1994-10-10|TAKE BACK RETURN|FOB|lose final, brave ideas. deposits wake a +56516|1641|24|7|10|15426.40|0.06|0.04|R|F|1994-09-29|1994-09-22|1994-10-21|DELIVER IN PERSON|REG AIR|ptotes integrate +56517|75|26|1|13|12675.91|0.00|0.02|N|O|1998-01-24|1997-12-02|1998-02-11|COLLECT COD|REG AIR|ckly idle dependencies. acc +56517|580|41|2|2|2961.16|0.07|0.04|N|O|1998-02-12|1997-12-08|1998-02-23|TAKE BACK RETURN|FOB|as lose thinly after +56518|120|99|1|42|42845.04|0.07|0.06|N|O|1998-06-01|1998-05-18|1998-06-23|TAKE BACK RETURN|MAIL| special fox +56518|1232|44|2|9|10199.07|0.03|0.06|N|O|1998-03-13|1998-05-06|1998-03-20|DELIVER IN PERSON|REG AIR|gular deposits nag througho +56518|706|7|3|30|48201.00|0.06|0.03|N|O|1998-03-24|1998-05-25|1998-03-30|TAKE BACK RETURN|SHIP|oxes. slyly furiou +56518|942|11|4|12|22115.28|0.05|0.06|N|O|1998-06-14|1998-04-25|1998-06-15|COLLECT COD|FOB|g the furiously bold packag +56519|1648|72|1|30|46489.20|0.01|0.06|N|O|1996-05-20|1996-04-26|1996-06-16|NONE|TRUCK|riously even realms. +56519|847|48|2|14|24469.76|0.08|0.01|N|O|1996-06-22|1996-04-21|1996-06-27|DELIVER IN PERSON|RAIL|ins. blithely fi +56519|1622|23|3|20|30472.40|0.08|0.08|N|O|1996-04-22|1996-05-20|1996-05-19|COLLECT COD|TRUCK|unts eat carefully among the bold asym +56519|63|14|4|14|13482.84|0.02|0.08|N|O|1996-04-25|1996-06-01|1996-05-20|NONE|RAIL|ts unwind a +56519|1691|74|5|14|22297.66|0.01|0.04|N|O|1996-04-11|1996-05-09|1996-05-07|COLLECT COD|MAIL|nusual instructions believe abo +56544|721|18|1|25|40543.00|0.02|0.05|N|O|1997-01-02|1996-12-28|1997-01-21|COLLECT COD|MAIL|ully carefully r +56544|834|1|2|45|78067.35|0.08|0.03|N|O|1996-11-29|1997-01-06|1996-12-22|DELIVER IN PERSON|TRUCK| slyly unusual, ironic packages. furiou +56544|558|19|3|26|37922.30|0.00|0.07|N|O|1997-03-05|1997-01-28|1997-03-26|COLLECT COD|TRUCK| ironic requests above the quickly final pl +56545|1724|9|1|22|35765.84|0.07|0.02|N|O|1995-08-06|1995-08-07|1995-08-28|NONE|MAIL|ns across the +56545|1268|69|2|13|15200.38|0.00|0.01|N|O|1995-09-23|1995-07-22|1995-10-19|TAKE BACK RETURN|TRUCK|he ironic fo +56546|765|30|1|18|29983.68|0.08|0.02|N|O|1997-09-06|1997-10-20|1997-09-28|DELIVER IN PERSON|SHIP|ent foxes. ironic, thin packages nag. even +56546|229|30|2|10|11292.20|0.05|0.01|N|O|1997-11-15|1997-11-27|1997-12-09|DELIVER IN PERSON|AIR|into beans. carefully final ideas na +56546|1235|73|3|35|39768.05|0.10|0.04|N|O|1997-12-17|1997-10-16|1998-01-16|DELIVER IN PERSON|TRUCK|l courts haggle furiously quickly regula +56546|1005|6|4|12|10872.00|0.07|0.07|N|O|1997-11-27|1997-11-30|1997-12-05|DELIVER IN PERSON|RAIL|e furiously even theod +56546|1822|66|5|44|75848.08|0.06|0.07|N|O|1997-12-14|1997-10-02|1997-12-17|DELIVER IN PERSON|SHIP|gged ideas sleep furiously after the expr +56546|1645|28|6|4|6186.56|0.04|0.01|N|O|1997-09-21|1997-11-14|1997-10-05|DELIVER IN PERSON|FOB|arefully unusual deposits along the +56547|924|59|1|37|67522.04|0.07|0.07|A|F|1993-07-10|1993-08-13|1993-07-20|COLLECT COD|RAIL|lly unusua +56547|1124|61|2|20|20502.40|0.02|0.02|A|F|1993-09-03|1993-08-22|1993-09-05|TAKE BACK RETURN|TRUCK|are permanently slyly bold pinto beans. e +56548|731|32|1|44|71796.12|0.00|0.04|A|F|1992-12-10|1992-11-27|1992-12-23|COLLECT COD|REG AIR| ironic deposits boost blithely +56548|289|71|2|3|3567.84|0.00|0.07|R|F|1992-12-16|1992-11-05|1993-01-05|DELIVER IN PERSON|RAIL|unts sleep pendin +56548|1932|33|3|9|16505.37|0.02|0.01|A|F|1992-11-01|1992-11-05|1992-11-29|DELIVER IN PERSON|MAIL|onic accounts. regula +56548|1422|23|4|22|29115.24|0.02|0.06|R|F|1992-12-15|1992-12-01|1993-01-11|COLLECT COD|MAIL|iers will have to are ruthlessly sly +56549|561|52|1|1|1461.56|0.04|0.00|N|O|1997-02-02|1997-03-09|1997-02-15|COLLECT COD|MAIL|above the final, even packag +56549|481|40|2|6|8288.88|0.00|0.00|N|O|1997-03-08|1997-02-16|1997-03-10|NONE|REG AIR|riously pending pinto beans above the even +56550|475|34|1|41|56394.27|0.05|0.00|N|O|1995-07-06|1995-07-08|1995-07-27|NONE|RAIL|final packages. +56550|1765|66|2|50|83338.00|0.02|0.01|N|F|1995-06-10|1995-06-11|1995-06-22|COLLECT COD|MAIL|bove the slyly r +56550|116|95|3|50|50805.50|0.10|0.03|A|F|1995-05-15|1995-06-19|1995-05-28|TAKE BACK RETURN|REG AIR|ests. regular dolphins caj +56550|1789|16|4|4|6763.12|0.00|0.02|R|F|1995-05-15|1995-05-18|1995-05-28|DELIVER IN PERSON|FOB|ly slyly regular requests. carefu +56550|524|15|5|23|32763.96|0.07|0.02|N|O|1995-07-07|1995-06-05|1995-08-01|TAKE BACK RETURN|FOB|inal excuses. special theodolites cajole ab +56550|1123|32|6|34|34820.08|0.10|0.08|A|F|1995-06-15|1995-05-29|1995-06-16|TAKE BACK RETURN|RAIL|egular foxes sleep +56550|648|11|7|30|46459.20|0.05|0.03|N|O|1995-07-23|1995-06-22|1995-07-25|TAKE BACK RETURN|FOB|uriously ironic foxe +56551|437|67|1|9|12036.87|0.03|0.00|N|O|1998-05-10|1998-04-29|1998-06-01|COLLECT COD|AIR|ymptotes are carefully bold packages. +56551|1327|4|2|30|36849.60|0.03|0.00|N|O|1998-02-23|1998-05-14|1998-02-26|COLLECT COD|SHIP| theodolites. furiously re +56551|1305|20|3|36|43426.80|0.07|0.04|N|O|1998-03-25|1998-04-12|1998-04-18|NONE|FOB|ss the thin theodolites print fluffily sl +56551|939|8|4|47|86476.71|0.03|0.01|N|O|1998-04-18|1998-05-04|1998-04-30|COLLECT COD|REG AIR|tes wake carefully among the si +56551|606|69|5|24|36158.40|0.07|0.02|N|O|1998-04-28|1998-05-07|1998-05-17|COLLECT COD|AIR|ffily furiously ironic +56551|1728|71|6|15|24445.80|0.03|0.00|N|O|1998-05-21|1998-05-06|1998-05-22|NONE|RAIL|ly carefully ironic accounts. pending reque +56551|1746|31|7|18|29659.32|0.00|0.00|N|O|1998-04-05|1998-05-08|1998-04-06|TAKE BACK RETURN|MAIL|thely even pinto beans +56576|358|59|1|23|28942.05|0.08|0.05|N|O|1996-11-04|1996-11-05|1996-11-13|COLLECT COD|RAIL|ackages: regular, final +56577|546|77|1|31|44842.74|0.02|0.07|N|O|1996-02-12|1996-01-10|1996-03-01|DELIVER IN PERSON|FOB| according to the slyly r +56577|1807|51|2|10|17088.00|0.04|0.02|N|O|1996-01-15|1996-01-05|1996-01-21|NONE|TRUCK|regular asymptotes. r +56577|660|54|3|28|43698.48|0.08|0.05|N|O|1996-01-24|1996-01-01|1996-01-25|NONE|REG AIR|ruthless theodolite +56577|1190|63|4|27|29462.13|0.06|0.03|N|O|1995-12-18|1996-01-03|1996-01-03|NONE|MAIL| accounts +56577|1099|35|5|33|33002.97|0.09|0.04|N|O|1995-11-28|1995-12-03|1995-12-09|TAKE BACK RETURN|FOB|long the s +56577|757|54|6|41|67967.75|0.03|0.05|N|O|1995-11-17|1996-01-10|1995-12-02|COLLECT COD|FOB|ending theodolites cajole carefully +56578|1406|46|1|14|18303.60|0.10|0.07|N|O|1997-05-17|1997-05-10|1997-05-23|TAKE BACK RETURN|REG AIR|lly pending deposits. quickly even req +56578|1558|59|2|34|49624.70|0.04|0.07|N|O|1997-05-21|1997-04-25|1997-06-12|TAKE BACK RETURN|AIR|ents sleep above the b +56578|1237|49|3|33|37561.59|0.04|0.03|N|O|1997-04-30|1997-04-16|1997-05-03|DELIVER IN PERSON|RAIL|s along the bra +56579|1058|59|1|43|41239.15|0.10|0.02|N|O|1996-10-02|1996-08-01|1996-10-29|DELIVER IN PERSON|FOB|slyly bold requests. carefully +56580|1628|70|1|3|4588.86|0.04|0.06|N|O|1995-09-06|1995-11-08|1995-10-05|NONE|FOB|ar, ruthless requests cajole furiously ab +56580|1091|92|2|26|25794.34|0.10|0.01|N|O|1995-12-10|1995-10-14|1995-12-24|NONE|FOB|hely pending +56580|1119|56|3|48|48965.28|0.09|0.05|N|O|1995-10-20|1995-10-16|1995-11-06|NONE|AIR|ully above the slyly s +56580|788|85|4|33|55729.74|0.06|0.01|N|O|1995-09-22|1995-09-17|1995-10-18|DELIVER IN PERSON|MAIL|ss instructions. fluffily eve +56580|409|97|5|30|39282.00|0.00|0.07|N|O|1995-10-14|1995-10-21|1995-10-16|NONE|RAIL| carefully regular deposits. regular excuse +56580|880|14|6|9|16027.92|0.00|0.04|N|O|1995-10-17|1995-09-27|1995-10-29|TAKE BACK RETURN|FOB|slyly regular requests. foxes cajole. +56580|1430|48|7|35|46600.05|0.10|0.04|N|O|1995-12-14|1995-09-29|1996-01-01|COLLECT COD|RAIL|ver regular warthogs ca +56581|662|63|1|29|45317.14|0.08|0.05|A|F|1994-03-11|1994-03-29|1994-04-01|TAKE BACK RETURN|SHIP|al requests. furiously regular packages al +56581|65|16|2|50|48253.00|0.09|0.05|A|F|1994-04-03|1994-04-04|1994-04-04|DELIVER IN PERSON|TRUCK|thless pinto +56581|427|57|3|1|1327.42|0.07|0.02|A|F|1994-02-25|1994-05-01|1994-03-04|DELIVER IN PERSON|FOB|ideas sleep carefully regular depo +56582|1246|58|1|21|24092.04|0.09|0.01|A|F|1994-08-29|1994-07-24|1994-09-07|TAKE BACK RETURN|TRUCK|ds wake slyly closely regular pac +56582|1659|60|2|5|7803.25|0.05|0.04|R|F|1994-10-07|1994-08-30|1994-10-22|COLLECT COD|SHIP|dolites among the final accounts +56582|81|57|3|4|3924.32|0.00|0.06|R|F|1994-08-09|1994-09-07|1994-08-25|DELIVER IN PERSON|TRUCK|ogged dolphins. slyly ir +56582|229|57|4|45|50814.90|0.06|0.05|A|F|1994-09-28|1994-07-18|1994-10-05|NONE|MAIL|thely final re +56582|1165|66|5|38|40514.08|0.09|0.02|A|F|1994-08-30|1994-08-11|1994-09-15|TAKE BACK RETURN|RAIL|y furiously express deposits. ironic in +56582|1732|17|6|25|40843.25|0.10|0.01|R|F|1994-08-31|1994-09-08|1994-09-10|NONE|SHIP|posits. furiously sp +56582|1496|36|7|27|37732.23|0.06|0.04|A|F|1994-09-16|1994-07-27|1994-10-04|TAKE BACK RETURN|MAIL| carefully silent theodolites bo +56583|1579|20|1|48|71067.36|0.05|0.04|N|O|1997-11-16|1998-01-11|1997-11-20|NONE|MAIL|ringly daringly regular theodolites. +56608|1010|81|1|22|20042.22|0.04|0.01|R|F|1994-12-06|1994-12-21|1994-12-09|DELIVER IN PERSON|RAIL|. blithely final requests promi +56608|695|96|2|18|28722.42|0.04|0.03|A|F|1995-03-19|1995-01-12|1995-04-04|TAKE BACK RETURN|RAIL| slyly eve +56609|1790|91|1|27|45678.33|0.00|0.02|N|O|1997-05-04|1997-03-03|1997-05-23|TAKE BACK RETURN|FOB|nts. excuses according to +56609|876|43|2|13|23099.31|0.05|0.00|N|O|1997-03-08|1997-04-26|1997-04-06|TAKE BACK RETURN|AIR|gular asymptotes use careful +56609|1714|99|3|36|58165.56|0.05|0.06|N|O|1997-04-23|1997-04-25|1997-05-05|TAKE BACK RETURN|MAIL|e furiously busy +56609|1967|68|4|13|24296.48|0.04|0.05|N|O|1997-04-23|1997-04-04|1997-05-11|TAKE BACK RETURN|REG AIR|eposits. express, special waters hang fur +56610|1012|18|1|22|20086.22|0.00|0.06|R|F|1993-06-12|1993-04-20|1993-07-09|NONE|TRUCK|ut the slyly ironic requests. furiously bo +56611|1215|16|1|41|45764.61|0.10|0.03|N|O|1996-02-20|1996-02-26|1996-03-19|DELIVER IN PERSON|AIR|sual packages. never final dependencies l +56611|209|91|2|19|21074.80|0.08|0.03|N|O|1996-03-25|1996-01-19|1996-04-05|TAKE BACK RETURN|REG AIR|nts. quickly final gift +56612|537|38|1|7|10062.71|0.04|0.08|R|F|1994-08-19|1994-09-11|1994-08-26|DELIVER IN PERSON|REG AIR|ests. deposits +56613|1122|95|1|1|1023.12|0.06|0.00|R|F|1994-01-27|1993-12-08|1994-02-05|COLLECT COD|REG AIR|ous deposits. +56613|509|70|2|12|16914.00|0.10|0.02|A|F|1994-02-16|1994-01-20|1994-03-01|TAKE BACK RETURN|AIR|uches are furiously alongside of the +56613|329|14|3|12|14751.84|0.05|0.07|R|F|1994-02-01|1994-01-20|1994-02-23|DELIVER IN PERSON|MAIL|egrate quickly among t +56613|759|60|4|36|59751.00|0.00|0.08|A|F|1993-12-15|1993-12-30|1993-12-29|TAKE BACK RETURN|RAIL|ously pendin +56614|1741|68|1|11|18070.14|0.07|0.02|A|F|1992-09-18|1992-11-05|1992-10-12|COLLECT COD|FOB|the regular pearls hang accord +56614|774|71|2|43|72015.11|0.09|0.04|R|F|1992-11-26|1992-10-16|1992-12-17|DELIVER IN PERSON|AIR|e somas. furiously expr +56614|1819|6|3|28|48182.68|0.04|0.08|A|F|1993-01-01|1992-11-25|1993-01-02|COLLECT COD|RAIL|theodolites haggle carefully a +56614|1237|75|4|11|12520.53|0.03|0.07|A|F|1993-01-02|1992-11-11|1993-01-30|DELIVER IN PERSON|REG AIR|ly regular packa +56614|1355|32|5|40|50254.00|0.06|0.03|A|F|1992-11-16|1992-11-04|1992-12-05|DELIVER IN PERSON|REG AIR|sits. slyly ironic ins +56614|1164|73|6|43|45801.88|0.07|0.07|R|F|1992-11-01|1992-12-04|1992-11-28|COLLECT COD|AIR|lar dependencies. blithely ironic as +56614|155|56|7|23|24268.45|0.00|0.04|A|F|1992-10-13|1992-11-17|1992-10-31|DELIVER IN PERSON|MAIL|ges. slyly careful depende +56615|1268|43|1|2|2338.52|0.06|0.07|N|O|1995-09-13|1995-08-25|1995-10-10|NONE|RAIL|ckages. even, idle packages x-ray carefull +56615|1775|18|2|50|83838.50|0.09|0.03|N|O|1995-08-25|1995-08-22|1995-09-10|COLLECT COD|RAIL|furiously even packages are along th +56615|1417|18|3|1|1318.41|0.09|0.06|N|O|1995-07-28|1995-09-03|1995-07-31|DELIVER IN PERSON|RAIL| final requests +56640|146|73|1|34|35568.76|0.06|0.00|N|O|1995-12-03|1995-11-14|1995-12-18|COLLECT COD|FOB|lessly among the +56640|1994|39|2|43|81527.57|0.04|0.07|N|O|1995-09-26|1995-10-16|1995-10-08|DELIVER IN PERSON|RAIL|ructions wake against the depos +56640|252|80|3|13|14979.25|0.08|0.08|N|O|1995-10-19|1995-10-03|1995-10-23|COLLECT COD|AIR|lar packages sleep closely ironic acc +56640|1198|7|4|5|5495.95|0.02|0.01|N|O|1995-11-02|1995-10-10|1995-11-09|COLLECT COD|SHIP|boost after the silent pinto beans-- bli +56640|235|17|5|1|1135.23|0.07|0.06|N|O|1995-10-15|1995-10-28|1995-10-18|TAKE BACK RETURN|MAIL|iously after the bold, unusual foxes. i +56640|1760|87|6|48|79764.48|0.10|0.01|N|O|1995-09-18|1995-10-06|1995-10-04|DELIVER IN PERSON|MAIL|alongside of the regular, bol +56640|64|15|7|32|30849.92|0.08|0.01|N|O|1995-11-13|1995-09-26|1995-12-12|COLLECT COD|REG AIR|onic instructions sleep +56641|1966|11|1|1|1867.96|0.01|0.08|N|O|1996-06-09|1996-07-11|1996-06-19|COLLECT COD|REG AIR|gside of the furio +56641|1019|55|2|39|35880.39|0.03|0.02|N|O|1996-05-09|1996-07-21|1996-05-19|NONE|RAIL|lar dependencies. final, final instr +56642|54|30|1|43|41024.15|0.06|0.00|N|O|1996-04-03|1996-03-31|1996-04-17|TAKE BACK RETURN|FOB|s haggle slyly bold deposit +56642|147|48|2|26|27225.64|0.02|0.05|N|O|1996-05-06|1996-04-15|1996-06-03|TAKE BACK RETURN|SHIP|. carefully final pinto +56642|1169|6|3|5|5350.80|0.01|0.03|N|O|1996-06-15|1996-04-17|1996-07-06|COLLECT COD|SHIP|ending warhorses. fu +56642|1684|8|4|44|69769.92|0.10|0.05|N|O|1996-06-07|1996-05-16|1996-06-30|DELIVER IN PERSON|FOB|t have to wake slyly across the caref +56642|474|4|5|35|48106.45|0.01|0.04|N|O|1996-06-16|1996-04-10|1996-07-10|COLLECT COD|MAIL| run blithely final frays +56642|627|59|6|3|4582.86|0.04|0.01|N|O|1996-04-02|1996-04-16|1996-04-16|NONE|FOB|es. fluffily regular theo +56642|1710|37|7|42|67691.82|0.07|0.00|N|O|1996-05-20|1996-05-14|1996-05-21|TAKE BACK RETURN|FOB|ckly unusual +56643|49|50|1|26|24675.04|0.02|0.07|A|F|1992-07-31|1992-07-05|1992-08-05|DELIVER IN PERSON|TRUCK|e carefully special, final asymptotes. fur +56643|1687|88|2|38|60369.84|0.04|0.03|A|F|1992-07-16|1992-06-14|1992-08-09|COLLECT COD|SHIP| quickly regular req +56643|1135|8|3|42|43517.46|0.03|0.08|A|F|1992-07-13|1992-06-07|1992-07-18|NONE|RAIL|long the dogged +56643|1998|99|4|32|60799.68|0.01|0.04|R|F|1992-07-10|1992-07-17|1992-07-11|TAKE BACK RETURN|FOB|tructions: blithe +56643|1861|91|5|31|54648.66|0.03|0.06|A|F|1992-06-07|1992-06-04|1992-06-09|DELIVER IN PERSON|REG AIR| the quick +56643|4|5|6|5|4520.00|0.09|0.02|R|F|1992-07-21|1992-06-07|1992-08-12|COLLECT COD|FOB|sual accounts. slyly regular theodolit +56644|923|24|1|7|12767.44|0.01|0.01|R|F|1993-01-01|1993-01-21|1993-01-30|NONE|RAIL|en foxes sle +56644|1908|97|2|16|28958.40|0.01|0.05|R|F|1993-03-08|1993-01-22|1993-03-12|NONE|FOB|ly final packages ac +56644|718|19|3|7|11330.97|0.01|0.08|A|F|1993-03-13|1993-02-24|1993-04-02|TAKE BACK RETURN|MAIL| haggle quickly quickly regular ideas. ir +56644|1538|39|4|35|50383.55|0.05|0.05|A|F|1993-03-20|1993-02-13|1993-04-09|NONE|TRUCK|fully quickly +56644|899|33|5|15|26998.35|0.10|0.01|R|F|1992-12-31|1993-01-08|1993-01-07|TAKE BACK RETURN|TRUCK|ely final requests. slyl +56644|1273|74|6|28|32879.56|0.10|0.05|R|F|1993-03-18|1993-01-31|1993-04-07|NONE|RAIL|l deposits +56644|1530|31|7|41|58692.73|0.04|0.04|R|F|1993-03-25|1993-01-31|1993-04-21|COLLECT COD|MAIL|ironic, final instructions. f +56645|737|38|1|25|40943.25|0.10|0.05|R|F|1992-03-19|1992-02-15|1992-04-08|NONE|FOB|y unusual packages. slyl +56645|547|48|2|3|4342.62|0.09|0.03|A|F|1992-03-18|1992-02-14|1992-04-07|NONE|FOB| accounts according to the fur +56645|567|28|3|50|73378.00|0.09|0.01|A|F|1992-03-12|1992-03-30|1992-04-10|NONE|FOB| asymptotes. deposits wake ir +56645|945|46|4|47|86759.18|0.05|0.01|R|F|1992-02-11|1992-03-21|1992-03-02|NONE|SHIP|ounts integrate after the blithely regu +56645|753|86|5|50|82687.50|0.09|0.01|R|F|1992-04-19|1992-02-23|1992-05-18|COLLECT COD|REG AIR|lyly up the ideas. packages us +56645|999|2|6|4|7599.96|0.05|0.05|A|F|1992-02-03|1992-02-09|1992-03-01|DELIVER IN PERSON|MAIL|ons. furiously bold foxes are ca +56646|1386|87|1|45|57932.10|0.00|0.04|A|F|1993-08-07|1993-06-22|1993-09-03|COLLECT COD|RAIL|ven ideas. +56646|432|33|2|6|7994.58|0.05|0.07|A|F|1993-09-14|1993-07-19|1993-10-10|DELIVER IN PERSON|REG AIR|deposits toward the slyly +56646|1602|3|3|32|48115.20|0.09|0.06|A|F|1993-09-17|1993-07-24|1993-10-05|TAKE BACK RETURN|RAIL|final forges! express, even package +56647|1508|89|1|34|47923.00|0.10|0.08|N|O|1995-11-17|1995-10-27|1995-12-11|DELIVER IN PERSON|REG AIR|s warthogs cajole. decoys cajo +56647|141|42|2|23|23946.22|0.05|0.05|N|O|1995-08-30|1995-09-27|1995-09-18|COLLECT COD|RAIL|, final packages. slyl +56672|1967|12|1|43|80365.28|0.07|0.01|R|F|1992-06-30|1992-08-10|1992-07-16|DELIVER IN PERSON|RAIL|sts. carefully even theo +56672|598|29|2|2|2997.18|0.07|0.00|A|F|1992-08-27|1992-07-14|1992-09-25|TAKE BACK RETURN|MAIL| regular, unusua +56672|1454|33|3|44|59639.80|0.06|0.03|A|F|1992-05-19|1992-07-08|1992-05-22|COLLECT COD|FOB|along the platelets. carefully express Tir +56672|1741|26|4|1|1642.74|0.07|0.01|R|F|1992-08-21|1992-08-09|1992-09-12|TAKE BACK RETURN|FOB|aggle alongside of the +56673|1205|6|1|10|11062.00|0.06|0.03|R|F|1993-04-25|1993-04-10|1993-05-17|DELIVER IN PERSON|AIR| the slyly regular dolphins; regul +56673|1038|74|2|2|1878.06|0.01|0.04|A|F|1993-05-05|1993-02-23|1993-05-11|COLLECT COD|SHIP|he fluffily even requests. unusual, pen +56673|1451|52|3|34|45983.30|0.02|0.08|A|F|1993-02-20|1993-03-15|1993-03-22|DELIVER IN PERSON|AIR|theodolites. carefully e +56673|11|87|4|23|20953.23|0.09|0.01|A|F|1993-02-22|1993-02-20|1993-03-07|DELIVER IN PERSON|SHIP|lly unusual packages sleep ab +56674|147|48|1|17|17801.38|0.01|0.03|A|F|1993-12-24|1993-11-21|1993-12-25|NONE|REG AIR| even pinto beans are slyly fluffily expre +56674|1020|56|2|13|11973.26|0.08|0.08|A|F|1993-12-02|1993-12-06|1993-12-04|COLLECT COD|RAIL|engage fluffi +56674|548|79|3|44|63735.76|0.06|0.05|A|F|1993-12-28|1993-12-15|1994-01-03|DELIVER IN PERSON|TRUCK|c requests cajole furiously slyly express +56674|1053|24|4|21|20035.05|0.04|0.05|A|F|1993-10-28|1993-12-04|1993-11-17|COLLECT COD|AIR|ld deposits wake slyly regular depo +56675|385|86|1|15|19280.70|0.02|0.05|R|F|1992-03-24|1992-03-06|1992-04-22|TAKE BACK RETURN|AIR|luffily regular ideas. packag +56675|730|31|2|21|34245.33|0.01|0.02|R|F|1992-04-25|1992-02-13|1992-05-10|DELIVER IN PERSON|MAIL|ages. slyly final theodolites serve f +56675|288|89|3|46|54660.88|0.02|0.01|A|F|1992-03-08|1992-02-13|1992-03-15|TAKE BACK RETURN|RAIL|uriously final th +56675|1625|8|4|23|35112.26|0.03|0.04|R|F|1992-02-29|1992-02-25|1992-03-08|TAKE BACK RETURN|RAIL| courts cajole quickly. +56676|1183|84|1|19|20599.42|0.10|0.02|R|F|1992-12-06|1992-12-20|1993-01-03|TAKE BACK RETURN|SHIP|eed to haggle at the slyly +56677|828|28|1|38|65695.16|0.10|0.06|A|F|1994-05-26|1994-06-20|1994-06-19|NONE|MAIL|sly above the slyly bold request +56677|1532|13|2|9|12901.77|0.01|0.05|R|F|1994-05-20|1994-07-07|1994-05-26|NONE|TRUCK|ress accounts. regular, e +56677|1587|88|3|27|40191.66|0.08|0.05|A|F|1994-06-27|1994-06-12|1994-07-06|COLLECT COD|MAIL|low, unusual packag +56678|627|59|1|36|54994.32|0.05|0.06|N|O|1997-02-07|1997-01-26|1997-02-22|NONE|FOB| final requests. ironic, final foxes aro +56678|609|3|2|29|43778.40|0.02|0.07|N|O|1996-12-04|1997-01-18|1996-12-11|COLLECT COD|TRUCK|ounts kindle above the fluffily iro +56678|676|8|3|20|31533.40|0.03|0.06|N|O|1997-03-20|1997-01-08|1997-03-26|TAKE BACK RETURN|MAIL|lyly pending accounts use +56678|1343|20|4|32|39818.88|0.04|0.03|N|O|1997-01-22|1997-01-21|1997-01-30|COLLECT COD|SHIP|pearls. furiously even epitaphs +56678|1757|100|5|45|74643.75|0.05|0.01|N|O|1997-03-15|1997-02-06|1997-03-27|TAKE BACK RETURN|AIR|y pending instructions are carefully after +56678|603|97|6|31|46611.60|0.01|0.07|N|O|1996-12-09|1997-02-05|1996-12-28|COLLECT COD|REG AIR|tipliers ar +56678|87|13|7|13|12832.04|0.07|0.04|N|O|1997-03-21|1997-02-04|1997-03-25|TAKE BACK RETURN|SHIP|ross the furiously fi +56679|599|90|1|17|25493.03|0.02|0.08|N|O|1997-09-06|1997-07-27|1997-09-28|DELIVER IN PERSON|REG AIR|ornis. permanently final theodolites +56679|1713|14|2|42|67817.82|0.08|0.00|N|O|1997-08-13|1997-08-15|1997-08-31|COLLECT COD|AIR|ithely even deposits will have to slee +56679|1191|64|3|33|36042.27|0.03|0.08|N|O|1997-07-27|1997-06-20|1997-07-31|TAKE BACK RETURN|AIR|tions above +56679|590|51|4|30|44717.70|0.05|0.04|N|O|1997-08-02|1997-08-03|1997-08-09|DELIVER IN PERSON|REG AIR|doze after the even, specia +56679|1913|2|5|13|23593.83|0.08|0.01|N|O|1997-05-23|1997-07-28|1997-05-31|COLLECT COD|FOB|nic courts cajole blithely regul +56679|985|20|6|5|9429.90|0.10|0.04|N|O|1997-06-16|1997-07-19|1997-07-11|TAKE BACK RETURN|RAIL|e. fluffily regular accounts +56679|1980|25|7|27|50813.46|0.02|0.02|N|O|1997-07-05|1997-08-09|1997-07-31|COLLECT COD|RAIL|onic requests +56704|623|24|1|29|44184.98|0.02|0.04|A|F|1992-11-19|1992-10-07|1992-12-13|TAKE BACK RETURN|RAIL| carefully unusual accounts across +56704|1112|13|2|31|31406.41|0.08|0.01|R|F|1992-10-16|1992-10-16|1992-11-08|NONE|AIR|ns wake furio +56704|788|89|3|33|55729.74|0.02|0.03|R|F|1992-10-19|1992-10-05|1992-10-26|DELIVER IN PERSON|MAIL|ully enticing depos +56705|647|48|1|34|52619.76|0.03|0.08|N|O|1997-04-18|1997-04-14|1997-04-26|COLLECT COD|REG AIR|d thinly. bold, special de +56705|832|32|2|14|24259.62|0.02|0.00|N|O|1997-03-25|1997-04-16|1997-04-17|COLLECT COD|FOB|al packages cajole slyly among the +56705|654|55|3|15|23319.75|0.06|0.05|N|O|1997-02-04|1997-03-30|1997-02-06|NONE|AIR|st furiously according to the stea +56705|1893|80|4|34|61026.26|0.06|0.08|N|O|1997-03-08|1997-04-06|1997-04-05|TAKE BACK RETURN|TRUCK| regular requests nod-- regular depo +56705|432|20|5|43|57294.49|0.01|0.07|N|O|1997-05-12|1997-04-24|1997-05-24|COLLECT COD|REG AIR|uickly express i +56705|426|14|6|44|58362.48|0.00|0.00|N|O|1997-03-20|1997-04-25|1997-03-22|COLLECT COD|FOB|ual requests detect +56706|149|2|1|16|16786.24|0.01|0.03|R|F|1995-03-04|1995-01-22|1995-03-25|TAKE BACK RETURN|MAIL|pending, even pinto +56706|1049|20|2|23|21850.92|0.07|0.00|R|F|1994-12-09|1995-02-01|1995-01-02|DELIVER IN PERSON|FOB| furiously. fluff +56706|1285|60|3|37|43892.36|0.01|0.06|R|F|1995-01-16|1995-01-12|1995-02-07|DELIVER IN PERSON|REG AIR|tes use furiously +56706|1278|79|4|24|28302.48|0.03|0.07|R|F|1995-01-14|1995-01-21|1995-01-24|TAKE BACK RETURN|SHIP|y requests. +56706|1735|36|5|32|52375.36|0.02|0.01|R|F|1994-11-18|1995-02-01|1994-12-09|TAKE BACK RETURN|REG AIR|g instructions snooze according to the car +56706|453|54|6|10|13534.50|0.09|0.00|A|F|1994-12-12|1995-01-11|1994-12-28|DELIVER IN PERSON|REG AIR|nal deposits +56707|266|67|1|10|11662.60|0.03|0.05|A|F|1993-03-23|1993-02-09|1993-04-16|NONE|TRUCK|tect above the quickly +56707|1154|27|2|42|44316.30|0.04|0.08|A|F|1993-03-23|1993-03-06|1993-03-25|NONE|FOB|t, regular packages. b +56707|363|92|3|43|54324.48|0.03|0.08|A|F|1993-04-01|1993-03-17|1993-04-02|NONE|RAIL|lar deposits haggle +56707|1173|82|4|26|27928.42|0.00|0.04|R|F|1993-02-10|1993-02-15|1993-02-18|DELIVER IN PERSON|SHIP|ly regular requests across the unusual, +56707|1267|5|5|35|40889.10|0.01|0.00|A|F|1993-01-16|1993-02-04|1993-02-07|TAKE BACK RETURN|AIR| cajole after the b +56707|948|17|6|13|24036.22|0.06|0.01|A|F|1992-12-31|1993-03-15|1993-01-30|NONE|RAIL|packages. carefully ir +56708|1014|50|1|9|8235.09|0.08|0.00|R|F|1992-12-30|1993-01-16|1993-01-06|NONE|RAIL|posits affix quickl +56708|1533|34|2|1|1434.53|0.05|0.00|A|F|1993-02-18|1993-01-25|1993-02-28|COLLECT COD|RAIL|ual requests are blith +56708|315|44|3|31|37674.61|0.07|0.03|A|F|1992-12-30|1993-01-06|1993-01-05|TAKE BACK RETURN|MAIL|uests. carefully bold ideas across the +56708|1439|57|4|48|64340.64|0.09|0.00|R|F|1993-03-01|1993-01-24|1993-03-03|COLLECT COD|RAIL|s pinto beans wake +56708|617|49|5|11|16693.71|0.09|0.07|R|F|1993-03-23|1993-01-08|1993-03-24|NONE|TRUCK|s cajole blit +56708|225|26|6|46|51760.12|0.07|0.04|R|F|1993-01-17|1993-02-22|1993-02-06|DELIVER IN PERSON|SHIP|regular accounts about +56708|442|43|7|30|40273.20|0.09|0.06|R|F|1993-04-03|1993-02-16|1993-05-01|DELIVER IN PERSON|REG AIR|blithely silent dependencies wake +56709|985|54|1|34|64123.32|0.00|0.04|N|O|1997-05-05|1997-05-17|1997-05-18|NONE|TRUCK| pending accounts. platelets c +56709|266|67|2|26|30322.76|0.01|0.07|N|O|1997-06-19|1997-05-21|1997-07-12|DELIVER IN PERSON|TRUCK|ly regular instructions. bli +56709|398|99|3|43|55830.77|0.10|0.05|N|O|1997-07-27|1997-06-18|1997-08-18|NONE|SHIP| even packages. +56710|1339|54|1|47|58295.51|0.00|0.08|A|F|1993-06-16|1993-07-02|1993-06-23|COLLECT COD|TRUCK|to beans are blithely. asymptotes along +56710|1036|42|2|11|10307.33|0.03|0.03|R|F|1993-08-08|1993-06-19|1993-08-18|TAKE BACK RETURN|REG AIR|ed requests. slyly even accounts are quick +56710|379|36|3|46|58851.02|0.08|0.03|R|F|1993-07-19|1993-06-25|1993-07-22|TAKE BACK RETURN|REG AIR| the regular request +56710|833|34|4|16|27741.28|0.04|0.08|R|F|1993-07-24|1993-07-03|1993-08-18|NONE|REG AIR| silent dugouts haggle furiously +56710|1130|67|5|49|50525.37|0.00|0.00|A|F|1993-05-23|1993-07-30|1993-05-28|DELIVER IN PERSON|TRUCK|. regular, final theodolites use +56710|842|9|6|31|54028.04|0.04|0.06|A|F|1993-08-22|1993-06-19|1993-08-28|COLLECT COD|TRUCK| blithely pending packages haggl +56711|1082|53|1|20|19661.60|0.09|0.04|R|F|1995-05-09|1995-05-03|1995-05-21|TAKE BACK RETURN|RAIL|lyly about the c +56711|274|56|2|18|21136.86|0.01|0.08|R|F|1995-05-28|1995-04-03|1995-06-12|DELIVER IN PERSON|RAIL|arefully specia +56711|807|8|3|16|27324.80|0.07|0.08|R|F|1995-02-14|1995-03-14|1995-03-09|COLLECT COD|FOB| courts. unusual instructions against th +56711|1244|45|4|41|46954.84|0.07|0.04|R|F|1995-03-12|1995-04-02|1995-03-29|COLLECT COD|REG AIR|ss the carefully pending deposits. sp +56736|1462|63|1|16|21815.36|0.02|0.08|N|O|1998-03-28|1998-03-26|1998-03-31|COLLECT COD|AIR|ithe requests. foxes are furiously. c +56736|297|79|2|41|49088.89|0.09|0.02|N|O|1998-02-28|1998-03-21|1998-03-06|TAKE BACK RETURN|MAIL|ncies. blithely regul +56736|367|68|3|31|39288.16|0.02|0.02|N|O|1998-04-21|1998-03-09|1998-05-12|TAKE BACK RETURN|MAIL|ctions above the reg +56736|231|32|4|18|20362.14|0.07|0.06|N|O|1998-01-25|1998-04-03|1998-01-27|TAKE BACK RETURN|MAIL| regular ac +56736|1045|16|5|17|16082.68|0.02|0.05|N|O|1998-04-28|1998-03-13|1998-05-17|DELIVER IN PERSON|SHIP|blithely unusual accounts w +56737|1282|94|1|2|2366.56|0.08|0.07|N|O|1997-08-19|1997-07-14|1997-09-15|NONE|TRUCK|c, regular pinto +56737|915|16|2|29|52661.39|0.00|0.02|N|O|1997-06-28|1997-06-28|1997-06-30|DELIVER IN PERSON|FOB|sleep accounts. regular packages wake +56737|617|49|3|13|19728.93|0.05|0.06|N|O|1997-05-25|1997-08-03|1997-06-15|DELIVER IN PERSON|SHIP|onic accounts sle +56737|709|10|4|18|28974.60|0.06|0.06|N|O|1997-08-08|1997-07-14|1997-09-06|NONE|SHIP|the carefully unusual foxes? ironic accoun +56737|1303|4|5|3|3612.90|0.10|0.04|N|O|1997-05-11|1997-08-02|1997-06-07|NONE|FOB|. quickly final a +56737|47|48|6|31|29358.24|0.03|0.06|N|O|1997-07-15|1997-07-28|1997-08-11|DELIVER IN PERSON|REG AIR| instructions. +56738|1275|76|1|48|56460.96|0.02|0.04|N|O|1996-06-25|1996-05-31|1996-07-10|NONE|SHIP|unts affix fluffily c +56738|694|26|2|10|15946.90|0.03|0.02|N|O|1996-08-07|1996-06-15|1996-09-02|COLLECT COD|FOB|express accounts. blithely pending braids +56738|1579|80|3|50|74028.50|0.07|0.00|N|O|1996-06-14|1996-06-16|1996-07-01|TAKE BACK RETURN|FOB|ular requests sleep sly +56738|1828|58|4|14|24217.48|0.02|0.00|N|O|1996-06-30|1996-05-13|1996-07-07|TAKE BACK RETURN|REG AIR|bove the fluffily bold packages. theodoli +56738|220|2|5|9|10081.98|0.05|0.01|N|O|1996-04-11|1996-05-29|1996-05-07|NONE|TRUCK|ithely even dolphins against the bold depo +56739|1720|5|1|50|81086.00|0.06|0.05|A|F|1993-04-19|1993-06-28|1993-05-07|TAKE BACK RETURN|SHIP| theodolites. quietly i +56739|1089|90|2|13|12871.04|0.09|0.03|A|F|1993-05-06|1993-05-26|1993-05-26|NONE|MAIL|efully even excuses boost slyly around +56739|88|89|3|22|21737.76|0.02|0.06|R|F|1993-05-26|1993-05-31|1993-06-10|NONE|SHIP|thely final pa +56739|850|84|4|16|28013.60|0.05|0.06|R|F|1993-04-23|1993-07-07|1993-05-11|DELIVER IN PERSON|SHIP|t the carefully regul +56739|1204|5|5|38|41997.60|0.08|0.07|R|F|1993-04-22|1993-06-03|1993-05-10|TAKE BACK RETURN|MAIL|detect blithely beside +56740|455|85|1|5|6777.25|0.06|0.07|R|F|1993-01-23|1992-11-17|1993-01-25|NONE|TRUCK|counts. fluffily express inst +56740|1428|29|2|37|49188.54|0.09|0.08|A|F|1992-12-23|1992-12-16|1992-12-30|TAKE BACK RETURN|SHIP|ar accounts. forges +56740|1084|85|3|9|8865.72|0.10|0.01|A|F|1992-10-27|1992-11-30|1992-11-05|TAKE BACK RETURN|REG AIR| kindle thinly across the fluffily s +56741|429|59|1|29|38553.18|0.10|0.08|N|O|1997-06-20|1997-05-10|1997-07-19|COLLECT COD|REG AIR|egrate quickly. sp +56741|957|58|2|18|33443.10|0.05|0.05|N|O|1997-06-29|1997-06-04|1997-07-15|COLLECT COD|TRUCK|r accounts. carefully ironic accounts subla +56742|61|37|1|21|20182.26|0.09|0.08|N|O|1996-10-01|1996-10-27|1996-10-20|DELIVER IN PERSON|FOB|y ironic deposits after the spe +56742|1187|96|2|23|25028.14|0.03|0.08|N|O|1996-11-02|1996-12-04|1996-11-24|COLLECT COD|REG AIR|deposits. pending, special accounts ha +56742|128|29|3|41|42152.92|0.06|0.00|N|O|1996-11-16|1996-11-15|1996-12-15|COLLECT COD|FOB|sts nag quickly +56743|1106|15|1|50|50355.00|0.07|0.04|N|O|1995-06-25|1995-09-01|1995-07-19|DELIVER IN PERSON|SHIP|cajole. thinly regular accounts +56743|739|4|2|25|40993.25|0.07|0.00|N|O|1995-07-14|1995-08-06|1995-08-04|TAKE BACK RETURN|REG AIR| the blithely final ins +56743|271|53|3|37|43336.99|0.06|0.07|N|O|1995-07-27|1995-08-28|1995-08-24|DELIVER IN PERSON|AIR| packages integrate quickly +56743|447|77|4|30|40423.20|0.03|0.06|N|O|1995-07-27|1995-09-19|1995-08-24|TAKE BACK RETURN|TRUCK|quickly even pinto beans! slyly f +56743|1597|78|5|8|11988.72|0.02|0.07|N|O|1995-09-13|1995-09-09|1995-09-20|COLLECT COD|SHIP|gular packages. c +56743|333|18|6|19|23433.27|0.01|0.02|N|O|1995-07-27|1995-09-19|1995-08-19|DELIVER IN PERSON|REG AIR|y. packages integrate slyly bold att +56743|1758|43|7|43|71369.25|0.05|0.06|N|O|1995-06-29|1995-08-12|1995-07-05|DELIVER IN PERSON|SHIP| final platelets affix. blithely +56768|399|100|1|15|19490.85|0.10|0.04|N|O|1995-10-10|1995-09-14|1995-10-17|DELIVER IN PERSON|REG AIR|e after the furiously expre +56768|1245|57|2|45|51580.80|0.07|0.03|N|O|1995-09-08|1995-10-21|1995-09-27|DELIVER IN PERSON|RAIL|egular pinto beans nag carefu +56768|252|34|3|5|5761.25|0.03|0.07|N|O|1995-10-25|1995-08-31|1995-11-10|COLLECT COD|REG AIR|s sleep fluffily carefully +56769|1090|26|1|34|33697.06|0.04|0.00|A|F|1993-12-24|1994-01-30|1994-01-05|COLLECT COD|MAIL| packages nag +56769|1965|54|2|6|11201.76|0.10|0.06|R|F|1994-03-15|1994-01-20|1994-04-07|TAKE BACK RETURN|AIR|ven theodolites +56770|1972|17|1|8|14991.76|0.06|0.07|N|O|1997-11-11|1997-12-18|1997-11-30|COLLECT COD|AIR| requests haggle ironic package +56770|1002|3|2|42|37926.00|0.07|0.01|N|O|1997-11-19|1998-01-08|1997-11-26|TAKE BACK RETURN|MAIL|nly against the carefully even packages. f +56770|207|89|3|4|4428.80|0.02|0.08|N|O|1997-11-20|1997-12-15|1997-11-29|NONE|MAIL|ke carefully sly multipl +56770|8|84|4|44|39952.00|0.04|0.06|N|O|1997-12-13|1998-01-04|1997-12-26|COLLECT COD|REG AIR|out the ironically final requests. quickly +56770|1528|29|5|18|25731.36|0.03|0.03|N|O|1997-11-03|1998-01-08|1997-11-23|NONE|RAIL|s are after the car +56770|1301|16|6|31|37271.30|0.07|0.01|N|O|1998-02-12|1997-12-20|1998-02-24|TAKE BACK RETURN|FOB|key players. regular, even reques +56771|383|68|1|8|10267.04|0.06|0.02|N|O|1997-06-24|1997-05-07|1997-07-14|COLLECT COD|SHIP|d sleep quickly. regular packages +56771|1588|89|2|50|74479.00|0.00|0.03|N|O|1997-04-14|1997-04-23|1997-04-30|DELIVER IN PERSON|TRUCK| use slyly around th +56771|1784|69|3|21|35401.38|0.10|0.02|N|O|1997-06-14|1997-06-10|1997-06-21|COLLECT COD|FOB|out the ideas. stealthily regular courts +56772|1946|35|1|16|29567.04|0.01|0.04|R|F|1993-04-27|1993-03-26|1993-05-16|COLLECT COD|REG AIR|al orbits. express foxes above the as +56772|1724|67|2|38|61777.36|0.09|0.07|A|F|1993-03-15|1993-04-06|1993-03-27|TAKE BACK RETURN|FOB|s affix pending deposit +56772|949|50|3|33|61048.02|0.10|0.00|A|F|1993-03-13|1993-02-14|1993-04-01|TAKE BACK RETURN|AIR|quests wak +56772|1900|1|4|48|86491.20|0.08|0.06|R|F|1993-03-12|1993-04-13|1993-04-10|TAKE BACK RETURN|TRUCK|al pearls. slyly ruthless accoun +56772|1969|58|5|30|56128.80|0.07|0.03|A|F|1993-03-22|1993-03-15|1993-04-01|COLLECT COD|TRUCK|ickly ironic deposits +56772|117|18|6|11|11188.21|0.06|0.04|R|F|1993-03-24|1993-03-18|1993-04-10|TAKE BACK RETURN|MAIL|final, express grouches; quickly ironic +56772|1899|86|7|35|63031.15|0.04|0.03|A|F|1993-03-04|1993-03-22|1993-03-08|NONE|RAIL|uthless ex +56773|341|70|1|30|37240.20|0.09|0.01|R|F|1993-01-21|1992-12-24|1993-01-29|DELIVER IN PERSON|SHIP|y unusual requests wake among the even +56773|1402|81|2|18|23461.20|0.01|0.01|R|F|1992-11-10|1993-01-01|1992-12-07|NONE|TRUCK|after the carefully bold deposits. furious +56774|1630|13|1|9|13784.67|0.06|0.07|N|O|1997-01-28|1997-02-24|1997-02-12|COLLECT COD|AIR|fully even accounts +56774|422|52|2|44|58186.48|0.06|0.07|N|O|1997-01-03|1997-01-15|1997-01-24|NONE|RAIL|lar asymptote +56774|1946|79|3|18|33262.92|0.04|0.08|N|O|1996-12-08|1997-01-15|1996-12-28|TAKE BACK RETURN|REG AIR|quickly about the fluf +56774|124|25|4|38|38916.56|0.04|0.04|N|O|1997-02-05|1997-01-23|1997-02-11|COLLECT COD|MAIL|ic packages wake quickly? carefully unus +56774|724|57|5|27|43867.44|0.03|0.04|N|O|1997-03-10|1997-02-20|1997-03-23|DELIVER IN PERSON|AIR|ses above the blithely thin pac +56774|1178|79|6|2|2158.34|0.06|0.05|N|O|1997-02-18|1997-01-21|1997-03-15|TAKE BACK RETURN|FOB|s. regular, special foxes n +56774|1216|91|7|35|39102.35|0.05|0.01|N|O|1997-01-19|1997-02-08|1997-02-05|COLLECT COD|SHIP|dolites are furiously against the re +56775|1768|69|1|25|41744.00|0.00|0.02|A|F|1995-02-05|1994-11-24|1995-02-06|COLLECT COD|AIR|ess instructions. furiously even exc +56800|989|92|1|11|20789.78|0.01|0.06|R|F|1993-05-17|1993-04-14|1993-05-21|NONE|TRUCK|es. furiou +56800|322|51|2|14|17112.48|0.09|0.02|R|F|1993-04-01|1993-03-07|1993-04-11|TAKE BACK RETURN|FOB|ymptotes. carefully pending dep +56800|1318|57|3|45|54868.95|0.03|0.06|A|F|1993-04-03|1993-04-29|1993-04-13|COLLECT COD|SHIP|en foxes about the e +56800|839|40|4|42|73072.86|0.04|0.01|A|F|1993-05-19|1993-03-05|1993-05-30|NONE|RAIL|ven dolphins. furiously unusual packag +56800|1966|67|5|38|70982.48|0.00|0.03|R|F|1993-04-22|1993-03-20|1993-05-11|DELIVER IN PERSON|TRUCK|inal dependencies integrate special d +56800|1092|98|6|11|10923.99|0.05|0.01|A|F|1993-04-02|1993-03-30|1993-04-04|TAKE BACK RETURN|SHIP|e blithely unusual ideas aff +56801|823|24|1|7|12066.74|0.03|0.05|N|O|1996-04-22|1996-05-24|1996-05-18|DELIVER IN PERSON|REG AIR|ly special deposits. blithely i +56801|43|94|2|13|12259.52|0.10|0.05|N|O|1996-06-07|1996-06-19|1996-06-13|DELIVER IN PERSON|SHIP|xes. quickl +56801|571|72|3|50|73578.50|0.08|0.07|N|O|1996-06-14|1996-05-01|1996-07-06|COLLECT COD|AIR|bout the deposits. always regular the +56801|922|23|4|15|27343.80|0.00|0.08|N|O|1996-04-11|1996-06-13|1996-04-26|COLLECT COD|MAIL|usly according to the quic +56801|893|27|5|37|66373.93|0.02|0.02|N|O|1996-03-26|1996-05-09|1996-04-17|COLLECT COD|RAIL|uctions. quic +56801|1304|5|6|23|27721.90|0.09|0.06|N|O|1996-05-27|1996-06-09|1996-06-01|COLLECT COD|FOB| carefully reg +56801|56|82|7|26|24857.30|0.05|0.03|N|O|1996-06-23|1996-06-11|1996-07-01|TAKE BACK RETURN|REG AIR|s. ironic foxes cajole fluffily final i +56802|595|26|1|43|64310.37|0.02|0.02|A|F|1992-09-26|1992-08-08|1992-09-28|NONE|FOB| express deposits. quickly ironic requ +56802|234|16|2|31|35161.13|0.02|0.05|R|F|1992-06-05|1992-07-08|1992-06-30|COLLECT COD|MAIL|blithely carefu +56802|1821|8|3|32|55130.24|0.00|0.03|A|F|1992-07-12|1992-08-28|1992-08-06|NONE|REG AIR| fluffily regular pa +56803|469|57|1|41|56147.86|0.10|0.08|A|F|1995-02-13|1995-01-31|1995-02-26|NONE|TRUCK| courts sleep furiousl +56803|767|32|2|31|51700.56|0.04|0.05|R|F|1995-03-31|1995-02-27|1995-04-24|DELIVER IN PERSON|FOB|ding requests against the slyly unusual +56803|1039|40|3|17|15980.51|0.01|0.02|A|F|1995-02-28|1995-01-18|1995-03-20|COLLECT COD|REG AIR|sleep accor +56803|1548|29|4|47|68128.38|0.06|0.03|R|F|1995-01-08|1995-01-19|1995-01-23|TAKE BACK RETURN|SHIP|structions wake +56803|730|95|5|29|47291.17|0.05|0.05|A|F|1995-01-26|1995-01-31|1995-02-08|TAKE BACK RETURN|MAIL|fully unusual deposits. carefully +56803|322|51|6|31|37891.92|0.04|0.04|R|F|1994-12-15|1995-02-13|1995-01-14|COLLECT COD|SHIP|ckages lose caref +56803|1982|27|7|9|16955.82|0.09|0.05|R|F|1995-02-06|1995-02-22|1995-02-16|COLLECT COD|TRUCK|e throughout t +56804|264|92|1|7|8149.82|0.05|0.04|N|O|1995-06-26|1995-05-24|1995-07-05|DELIVER IN PERSON|RAIL|r ideas use-- +56804|611|5|2|38|57441.18|0.10|0.05|A|F|1995-05-21|1995-05-13|1995-06-16|COLLECT COD|MAIL|ecial pinto beans sleep. bli +56804|1109|46|3|32|32323.20|0.00|0.03|R|F|1995-03-31|1995-05-08|1995-04-27|COLLECT COD|FOB|cajole fur +56804|165|18|4|36|38345.76|0.05|0.08|A|F|1995-05-20|1995-06-26|1995-05-29|NONE|TRUCK|xes. quickly ironic f +56804|890|57|5|13|23281.57|0.09|0.07|R|F|1995-05-27|1995-05-16|1995-05-29|TAKE BACK RETURN|RAIL|eposits affix atop the blithely s +56804|321|78|6|27|32975.64|0.00|0.06|R|F|1995-05-17|1995-05-05|1995-05-23|DELIVER IN PERSON|AIR|ieve careful +56805|1625|26|1|42|64118.04|0.04|0.07|A|F|1992-07-14|1992-07-17|1992-07-15|COLLECT COD|RAIL|ep carefully. blithely +56805|1412|13|2|45|59103.45|0.01|0.02|A|F|1992-06-24|1992-08-24|1992-07-18|TAKE BACK RETURN|SHIP|en requests. final pl +56805|1896|97|3|45|80905.05|0.02|0.05|R|F|1992-08-18|1992-08-06|1992-08-28|NONE|MAIL|fluffily busily ironi +56805|835|2|4|38|65961.54|0.04|0.03|R|F|1992-08-17|1992-08-30|1992-09-05|NONE|MAIL|nding accounts. final acco +56806|1491|31|1|41|57092.09|0.04|0.06|N|O|1997-11-29|1998-01-10|1997-11-30|TAKE BACK RETURN|RAIL| fluffily unusual foxes. deposit +56806|499|29|2|19|26590.31|0.03|0.05|N|O|1998-01-08|1997-12-01|1998-01-18|COLLECT COD|MAIL| asymptotes engage: excuses +56807|1541|82|1|3|4327.62|0.03|0.08|R|F|1994-05-17|1994-07-21|1994-06-16|DELIVER IN PERSON|TRUCK| foxes; fluffily bold +56807|762|59|2|42|69835.92|0.10|0.02|R|F|1994-07-10|1994-06-27|1994-07-16|NONE|TRUCK|press, special dependencies. packages sl +56807|1584|65|3|16|23769.28|0.04|0.01|R|F|1994-05-15|1994-06-27|1994-06-01|NONE|AIR|en dependenc +56832|601|33|1|48|72076.80|0.06|0.07|N|O|1997-05-21|1997-05-10|1997-05-24|COLLECT COD|TRUCK|y bold accounts. +56832|1670|71|2|35|55008.45|0.04|0.00|N|O|1997-05-25|1997-03-31|1997-06-13|COLLECT COD|AIR|ironic theodolites engage quickly bl +56832|915|50|3|20|36318.20|0.02|0.03|N|O|1997-05-26|1997-04-10|1997-06-06|TAKE BACK RETURN|FOB|packages wake. regular Tiresias +56833|615|9|1|8|12124.88|0.06|0.01|R|F|1994-10-29|1994-11-24|1994-10-31|TAKE BACK RETURN|RAIL|are after the qui +56833|1436|37|2|23|30760.89|0.07|0.00|R|F|1994-09-12|1994-11-23|1994-09-30|NONE|MAIL| beans cajole always among th +56833|1693|76|3|19|30299.11|0.00|0.01|R|F|1994-10-22|1994-11-26|1994-11-15|DELIVER IN PERSON|RAIL|efully ironic decoys. fluffily bold r +56833|196|23|4|20|21923.80|0.00|0.08|R|F|1994-09-26|1994-11-14|1994-10-02|TAKE BACK RETURN|RAIL|etect after t +56833|489|48|5|50|69474.00|0.07|0.01|R|F|1994-12-06|1994-10-14|1994-12-11|TAKE BACK RETURN|MAIL|ic foxes w +56834|837|4|1|20|34756.60|0.05|0.06|N|O|1995-07-21|1995-06-17|1995-08-09|NONE|SHIP|unusual requests. carefully fin +56834|1998|99|2|25|47499.75|0.03|0.06|N|O|1995-07-20|1995-06-16|1995-07-28|NONE|TRUCK|rnis. slyly spe +56834|730|63|3|12|19568.76|0.05|0.07|A|F|1995-05-22|1995-06-17|1995-06-14|DELIVER IN PERSON|MAIL|uickly pendi +56834|1066|72|4|44|42550.64|0.06|0.00|N|O|1995-08-16|1995-07-14|1995-09-11|COLLECT COD|SHIP|pinto beans. blithely +56835|1290|2|1|12|14295.48|0.07|0.07|R|F|1993-03-09|1993-04-10|1993-04-04|DELIVER IN PERSON|AIR|sly regular +56835|615|9|2|37|56077.57|0.03|0.02|R|F|1993-05-12|1993-04-13|1993-06-07|TAKE BACK RETURN|AIR|ending, ironic requests after the bli +56835|1422|23|3|41|54260.22|0.10|0.05|A|F|1993-03-22|1993-04-03|1993-04-04|DELIVER IN PERSON|TRUCK|. furiously ironic exc +56835|1990|23|4|16|30271.84|0.00|0.06|A|F|1993-04-17|1993-04-27|1993-05-09|NONE|RAIL| regular asymptotes +56835|383|40|5|11|14117.18|0.06|0.00|R|F|1993-03-12|1993-05-03|1993-03-18|TAKE BACK RETURN|TRUCK|s wake carefully according to the furiou +56836|810|77|1|30|51324.30|0.00|0.07|N|O|1996-10-22|1996-11-07|1996-10-30|TAKE BACK RETURN|RAIL|ely. regular requests abo +56836|710|75|2|9|14496.39|0.04|0.01|N|O|1996-11-19|1996-11-03|1996-12-11|COLLECT COD|AIR|totes cajole carefully about +56836|1934|79|3|49|89960.57|0.03|0.00|N|O|1996-10-02|1996-10-16|1996-10-25|COLLECT COD|FOB| blithely express soma +56836|297|79|4|40|47891.60|0.09|0.07|N|O|1996-11-28|1996-11-12|1996-12-01|TAKE BACK RETURN|FOB|ackages are above the blithely +56836|1032|33|5|47|43852.41|0.08|0.01|N|O|1996-10-06|1996-10-30|1996-10-23|NONE|MAIL|refully even packages impress furiously +56837|1447|26|1|13|17529.72|0.05|0.03|R|F|1993-12-27|1994-01-22|1994-01-24|COLLECT COD|TRUCK|usly even +56837|407|66|2|21|27455.40|0.06|0.03|A|F|1994-03-08|1994-02-02|1994-03-13|TAKE BACK RETURN|MAIL| the reques +56837|1566|67|3|14|20545.84|0.09|0.08|R|F|1994-04-08|1994-01-28|1994-05-04|DELIVER IN PERSON|RAIL|. quickly special sent +56838|702|35|1|7|11218.90|0.06|0.04|N|O|1995-09-30|1995-10-07|1995-10-09|TAKE BACK RETURN|RAIL|ccounts. pending dependencies sleep fur +56838|962|63|2|47|87559.12|0.10|0.01|N|O|1995-08-01|1995-09-29|1995-08-05|NONE|TRUCK|thely. even accounts +56839|322|23|1|39|47670.48|0.08|0.06|N|O|1998-01-15|1997-12-16|1998-02-11|DELIVER IN PERSON|REG AIR|uests after the ironic, i +56839|823|90|2|38|65505.16|0.02|0.03|N|O|1998-02-17|1998-01-18|1998-02-24|TAKE BACK RETURN|REG AIR| deposits shall haggle furiously carefu +56839|766|67|3|2|3333.52|0.07|0.04|N|O|1998-01-16|1998-01-27|1998-02-03|NONE|MAIL|gainst the dogge +56864|440|28|1|8|10723.52|0.05|0.03|N|O|1997-08-29|1997-10-27|1997-09-06|NONE|MAIL|excuses: final ideas use benea +56864|183|10|2|18|19497.24|0.10|0.00|N|O|1997-08-16|1997-10-11|1997-08-29|COLLECT COD|MAIL|es. express ideas cajo +56864|1545|46|3|28|40503.12|0.05|0.05|N|O|1997-11-25|1997-09-11|1997-12-22|NONE|REG AIR|kages use alongside of the instru +56864|729|30|4|15|24445.80|0.02|0.06|N|O|1997-10-17|1997-10-10|1997-10-21|DELIVER IN PERSON|MAIL|lly final ideas sleep blithely. +56865|243|98|1|46|52589.04|0.10|0.00|N|O|1997-08-04|1997-06-21|1997-08-23|DELIVER IN PERSON|MAIL|lms. regular, bold +56865|173|26|2|11|11804.87|0.07|0.01|N|O|1997-08-13|1997-05-21|1997-08-31|DELIVER IN PERSON|FOB|onic theodolites wake furio +56865|1816|60|3|23|39509.63|0.01|0.03|N|O|1997-07-29|1997-06-30|1997-08-22|NONE|RAIL| requests. asymptotes wake slyly regu +56865|1294|6|4|46|54983.34|0.08|0.01|N|O|1997-05-15|1997-06-06|1997-05-24|TAKE BACK RETURN|RAIL| quickly regular accounts wak +56866|815|15|1|23|39463.63|0.02|0.01|N|O|1997-12-15|1998-02-21|1997-12-27|NONE|RAIL|to beans doze slyly across the bli +56866|1311|26|2|46|55766.26|0.00|0.05|N|O|1998-03-08|1998-02-10|1998-04-05|NONE|MAIL| quickly requests +56866|223|5|3|15|16848.30|0.06|0.08|N|O|1998-01-26|1998-02-12|1998-02-23|DELIVER IN PERSON|SHIP|unts maintain. slyly final pint +56866|86|37|4|9|8874.72|0.10|0.01|N|O|1998-01-26|1998-03-08|1998-02-12|COLLECT COD|MAIL|fily ironic +56866|1138|39|5|50|51956.50|0.00|0.00|N|O|1998-04-02|1998-03-02|1998-04-22|TAKE BACK RETURN|TRUCK|ions. blithely final deposits +56866|1225|63|6|10|11262.20|0.05|0.06|N|O|1998-01-21|1998-01-26|1998-02-13|COLLECT COD|MAIL|lyly final, ironic frays. blithely +56867|1304|5|1|2|2410.60|0.03|0.08|N|O|1996-09-25|1996-11-03|1996-10-13|COLLECT COD|REG AIR|wake stealthily +56867|1289|27|2|18|21425.04|0.03|0.04|N|O|1996-11-23|1996-10-11|1996-11-26|DELIVER IN PERSON|REG AIR| slyly bold pinto beans. ironic instructi +56867|909|78|3|24|43437.60|0.10|0.04|N|O|1996-10-21|1996-11-01|1996-11-15|DELIVER IN PERSON|SHIP| requests nag quickly theod +56867|124|3|4|46|47109.52|0.09|0.01|N|O|1996-11-15|1996-10-02|1996-11-23|NONE|REG AIR|pending pinto be +56868|1542|43|1|42|60628.68|0.08|0.05|N|O|1996-01-12|1996-01-21|1996-01-18|DELIVER IN PERSON|TRUCK|y final instructions. slyly even packages t +56868|1368|45|2|3|3808.08|0.00|0.02|N|O|1996-03-24|1996-02-24|1996-04-21|DELIVER IN PERSON|TRUCK|efully blithely special accounts. car +56868|1435|53|3|27|36083.61|0.01|0.02|N|O|1996-03-06|1996-02-25|1996-03-10|COLLECT COD|SHIP|alongside of the slyly unus +56868|362|63|4|10|12623.60|0.06|0.08|N|O|1996-02-15|1996-02-23|1996-03-09|COLLECT COD|SHIP|aids. ironic accounts nag quickly flu +56868|243|25|5|44|50302.56|0.05|0.08|N|O|1995-12-09|1996-02-16|1996-01-01|COLLECT COD|SHIP|sits do snooze quickly among the bl +56868|869|70|6|47|83183.42|0.07|0.04|N|O|1996-03-22|1996-02-29|1996-04-17|NONE|FOB|arefully idle deposits cajole. f +56869|1024|95|1|6|5550.12|0.07|0.03|A|F|1993-09-30|1993-10-18|1993-10-10|TAKE BACK RETURN|RAIL|above the furiously regul +56869|1380|19|2|5|6406.90|0.00|0.05|A|F|1993-08-16|1993-09-16|1993-08-22|DELIVER IN PERSON|SHIP|sleep. platele +56870|1253|65|1|40|46170.00|0.07|0.05|A|F|1992-10-15|1992-11-05|1992-11-10|TAKE BACK RETURN|REG AIR| even requests wake. a +56870|878|12|2|9|16009.83|0.02|0.03|R|F|1992-10-04|1992-10-13|1992-10-10|COLLECT COD|TRUCK|lly ironic sheaves det +56870|206|88|3|32|35398.40|0.08|0.04|A|F|1992-11-16|1992-10-10|1992-12-08|DELIVER IN PERSON|FOB|uickly regular instructions; dolphins h +56871|5|81|1|20|18100.00|0.03|0.05|N|O|1998-02-27|1998-03-21|1998-03-19|DELIVER IN PERSON|TRUCK| the blithely special instructions. q +56896|1283|95|1|21|24869.88|0.01|0.01|N|O|1996-07-29|1996-07-25|1996-07-31|TAKE BACK RETURN|SHIP|ut the unusual accounts. regul +56896|1813|43|2|46|78881.26|0.10|0.03|N|O|1996-08-30|1996-08-12|1996-09-12|TAKE BACK RETURN|MAIL|dencies ru +56896|1554|55|3|20|29111.00|0.05|0.05|N|O|1996-09-06|1996-07-29|1996-09-24|DELIVER IN PERSON|MAIL|haggle fur +56896|1242|43|4|9|10289.16|0.01|0.00|N|O|1996-09-13|1996-06-29|1996-10-08|DELIVER IN PERSON|SHIP|usly unusual packages poach f +56897|1503|84|1|26|36517.00|0.00|0.07|N|O|1997-07-03|1997-07-21|1997-07-24|COLLECT COD|AIR| theodolites are slyly special accounts. br +56897|1701|44|2|8|12821.60|0.08|0.06|N|O|1997-10-09|1997-08-11|1997-10-15|NONE|REG AIR|s above th +56897|1296|34|3|9|10775.61|0.10|0.02|N|O|1997-06-28|1997-07-26|1997-07-24|TAKE BACK RETURN|MAIL|hely pending deposits abo +56897|447|6|4|5|6737.20|0.07|0.04|N|O|1997-10-07|1997-07-20|1997-10-27|COLLECT COD|AIR|unts. theodolites hagg +56897|1273|74|5|36|42273.72|0.02|0.03|N|O|1997-10-01|1997-08-28|1997-10-03|COLLECT COD|TRUCK|sits sleep express accoun +56897|1724|25|6|50|81286.00|0.00|0.03|N|O|1997-08-02|1997-08-08|1997-08-09|NONE|SHIP|into beans doze slyly unusual accoun +56897|1435|53|7|12|16037.16|0.07|0.08|N|O|1997-07-15|1997-07-23|1997-07-29|COLLECT COD|SHIP| the silent, regula +56898|1414|54|1|21|27623.61|0.00|0.02|N|O|1998-08-05|1998-09-08|1998-08-24|TAKE BACK RETURN|RAIL|uickly final pinto beans? +56898|272|27|2|35|41029.45|0.07|0.02|N|O|1998-11-17|1998-09-22|1998-12-15|COLLECT COD|MAIL|st the quickly pending dep +56898|613|7|3|22|33299.42|0.03|0.00|N|O|1998-09-30|1998-09-24|1998-10-23|NONE|REG AIR|except the special, regular grouc +56899|534|95|1|13|18648.89|0.03|0.03|A|F|1994-06-17|1994-07-21|1994-06-26|COLLECT COD|FOB|pinto beans. caref +56899|648|42|2|24|37167.36|0.09|0.01|R|F|1994-07-16|1994-07-27|1994-07-19|COLLECT COD|SHIP|y according to the furiously special +56899|1719|20|3|47|76173.37|0.01|0.02|R|F|1994-09-15|1994-06-27|1994-10-15|NONE|MAIL|ate quickly according to the slyly bold req +56900|383|84|1|40|51335.20|0.02|0.06|N|O|1996-03-23|1996-01-09|1996-03-27|DELIVER IN PERSON|MAIL|refully fi +56900|1416|17|2|37|48744.17|0.10|0.03|N|O|1996-02-04|1995-12-29|1996-03-01|TAKE BACK RETURN|REG AIR|ly special foxes. final pinto beans hag +56900|1547|68|3|6|8691.24|0.06|0.02|N|O|1995-12-13|1996-01-24|1996-01-05|COLLECT COD|SHIP| about the b +56900|1564|5|4|48|70346.88|0.08|0.06|N|O|1996-02-29|1996-01-02|1996-03-06|TAKE BACK RETURN|MAIL|slyly. blithely reg +56901|409|97|1|41|53685.40|0.07|0.08|R|F|1994-12-15|1994-11-14|1995-01-06|NONE|REG AIR|ages solve carefully among the slyly +56901|34|60|2|9|8406.27|0.00|0.08|A|F|1994-11-13|1994-11-08|1994-11-15|NONE|AIR|he carefully final escapades. unus +56901|407|8|3|47|61447.80|0.00|0.03|R|F|1994-12-02|1994-10-24|1994-12-28|DELIVER IN PERSON|TRUCK|. furiously unusual accounts a +56901|889|90|4|40|71595.20|0.00|0.00|A|F|1994-11-12|1994-10-18|1994-12-06|COLLECT COD|RAIL|cial deposits cajole instructions; carefull +56901|505|96|5|29|40759.50|0.00|0.01|A|F|1994-12-15|1994-10-15|1994-12-21|NONE|REG AIR|even pinto beans believe. unusual, final +56901|1053|59|6|10|9540.50|0.07|0.04|R|F|1994-12-26|1994-10-26|1994-12-27|COLLECT COD|AIR|the even, express +56901|1669|11|7|48|75391.68|0.04|0.03|A|F|1994-11-08|1994-11-05|1994-11-11|NONE|REG AIR|ickly silent requests wake slyly. fu +56902|252|53|1|19|21892.75|0.07|0.05|N|O|1997-01-25|1997-01-31|1997-02-03|NONE|REG AIR|ag slyly along the busi +56902|557|18|2|7|10202.85|0.00|0.08|N|O|1997-03-04|1996-12-20|1997-03-29|TAKE BACK RETURN|MAIL|tes. ironic +56902|143|70|3|31|32337.34|0.09|0.07|N|O|1997-01-24|1997-01-28|1997-02-01|DELIVER IN PERSON|TRUCK|ing, pending foxes. +56902|800|65|4|3|5102.40|0.02|0.03|N|O|1997-01-12|1996-12-26|1997-02-07|DELIVER IN PERSON|TRUCK|ly careful foxes boos +56902|58|9|5|45|43112.25|0.05|0.01|N|O|1996-11-13|1996-12-17|1996-11-14|DELIVER IN PERSON|FOB| quickly regular accounts. instructions +56902|97|23|6|2|1994.18|0.10|0.04|N|O|1997-01-17|1996-12-15|1997-02-03|COLLECT COD|MAIL| regular pa +56903|370|27|1|27|34299.99|0.06|0.01|N|O|1996-07-31|1996-07-26|1996-08-18|DELIVER IN PERSON|MAIL|e stealthily. furiou +56903|691|85|2|30|47750.70|0.00|0.08|N|O|1996-08-13|1996-07-15|1996-08-15|NONE|SHIP|y final attainments was ac +56903|202|30|3|20|22044.00|0.08|0.06|N|O|1996-05-31|1996-08-10|1996-06-25|TAKE BACK RETURN|MAIL|ular accounts haggle +56928|611|74|1|14|21162.54|0.03|0.05|N|O|1998-07-27|1998-07-14|1998-08-05|NONE|FOB| bold dolphins. slyly express somas alongs +56928|196|97|2|36|39462.84|0.02|0.08|N|O|1998-06-15|1998-08-18|1998-06-20|DELIVER IN PERSON|TRUCK| ironic accounts +56928|190|69|3|47|51238.93|0.05|0.05|N|O|1998-05-26|1998-08-22|1998-06-25|COLLECT COD|AIR|ow instructi +56928|791|56|4|27|45678.33|0.02|0.08|N|O|1998-06-15|1998-06-27|1998-07-05|COLLECT COD|FOB|tes sleep quickly evenly brave +56929|1360|37|1|41|51715.76|0.09|0.05|N|O|1995-12-11|1995-11-13|1995-12-18|DELIVER IN PERSON|SHIP| special, special dependencie +56929|246|1|2|6|6877.44|0.00|0.00|N|O|1995-12-05|1995-11-29|1995-12-23|DELIVER IN PERSON|RAIL|kly special accounts detec +56930|1819|49|1|19|32695.39|0.06|0.08|A|F|1992-10-16|1992-09-20|1992-11-06|COLLECT COD|AIR|arefully ironic accounts cajole. accoun +56930|1698|22|2|18|28794.42|0.06|0.06|R|F|1992-10-10|1992-11-10|1992-10-30|NONE|RAIL|ideas impress fluffily carefully silen +56930|1977|66|3|10|18789.70|0.00|0.08|R|F|1992-09-19|1992-10-31|1992-09-23|TAKE BACK RETURN|SHIP|silent theodolites. carefully ir +56930|1687|70|4|36|57192.48|0.05|0.08|R|F|1992-11-30|1992-09-24|1992-12-17|DELIVER IN PERSON|AIR| slyly over the +56930|1012|18|5|46|41998.46|0.03|0.00|A|F|1992-10-15|1992-09-18|1992-11-12|DELIVER IN PERSON|FOB| slyly express pinto beans ca +56930|477|78|6|36|49588.92|0.01|0.02|A|F|1992-11-12|1992-10-17|1992-12-06|NONE|AIR|gainst the expr +56930|7|33|7|48|43536.00|0.05|0.08|A|F|1992-09-03|1992-10-14|1992-09-21|TAKE BACK RETURN|TRUCK| furiously unu +56931|494|24|1|26|36256.74|0.04|0.04|R|F|1993-06-03|1993-03-11|1993-06-24|NONE|FOB|ironic accounts about the reque +56931|1780|23|2|45|75680.10|0.01|0.08|A|F|1993-05-13|1993-03-12|1993-06-01|COLLECT COD|AIR|ular deposits bre +56931|1747|90|3|29|47813.46|0.10|0.03|A|F|1993-05-18|1993-03-23|1993-06-04|DELIVER IN PERSON|FOB|uffily bold deposits wake blithely +56931|1808|95|4|22|37615.60|0.08|0.07|R|F|1993-05-12|1993-04-07|1993-05-18|NONE|RAIL|bout the fluffil +56932|471|30|1|19|26057.93|0.01|0.06|N|O|1998-07-14|1998-06-11|1998-08-07|DELIVER IN PERSON|RAIL|ar, ironic packages ca +56932|150|77|2|49|51457.35|0.03|0.05|N|O|1998-04-20|1998-05-02|1998-05-08|TAKE BACK RETURN|FOB|arefully. +56932|682|14|3|5|7913.40|0.01|0.05|N|O|1998-04-24|1998-05-27|1998-04-26|NONE|TRUCK|instructions cajole quickly alo +56933|989|90|1|29|54809.42|0.10|0.01|N|O|1998-06-30|1998-07-29|1998-07-22|TAKE BACK RETURN|FOB|sts wake dependencies. f +56933|3|29|2|38|34314.00|0.07|0.08|N|O|1998-08-31|1998-09-15|1998-09-29|TAKE BACK RETURN|TRUCK| are carefully quickly silent accounts +56933|1498|77|3|47|65776.03|0.09|0.00|N|O|1998-06-30|1998-09-04|1998-07-19|COLLECT COD|FOB|furiously final f +56933|41|92|4|4|3764.16|0.02|0.03|N|O|1998-09-27|1998-09-17|1998-10-05|NONE|RAIL|l pinto beans play. slyly fi +56933|1492|32|5|3|4180.47|0.04|0.03|N|O|1998-09-04|1998-08-20|1998-09-22|TAKE BACK RETURN|RAIL|ely regular packages a +56934|1772|99|1|43|71972.11|0.09|0.05|N|O|1998-01-29|1998-01-02|1998-02-27|DELIVER IN PERSON|REG AIR|ar, pending +56934|1266|4|2|4|4669.04|0.10|0.00|N|O|1998-01-21|1997-12-20|1998-01-23|TAKE BACK RETURN|REG AIR|lly ironic deposits. closely even ide +56934|1503|84|3|25|35112.50|0.02|0.04|N|O|1997-12-09|1998-01-02|1997-12-28|NONE|TRUCK|cross the p +56934|1085|56|4|14|13805.12|0.05|0.04|N|O|1998-01-15|1997-12-09|1998-01-20|COLLECT COD|RAIL|to the furio +56934|1551|72|5|19|27598.45|0.00|0.04|N|O|1998-02-20|1998-01-10|1998-03-15|TAKE BACK RETURN|TRUCK|dly ironic instructions +56935|1606|7|1|19|28644.40|0.08|0.06|R|F|1994-02-03|1994-03-17|1994-02-24|TAKE BACK RETURN|REG AIR|en, regular depos +56960|798|63|1|37|62855.23|0.01|0.08|A|F|1994-09-05|1994-09-22|1994-09-09|COLLECT COD|SHIP|y above the regular +56961|880|80|1|30|53426.40|0.01|0.04|N|O|1997-04-16|1997-04-14|1997-05-02|NONE|RAIL|eans use carefully. idly special pinto bea +56961|1804|34|2|32|54585.60|0.08|0.06|N|O|1997-02-18|1997-04-21|1997-03-06|DELIVER IN PERSON|TRUCK|inst the slowly even packages. quickly fin +56961|1494|73|3|2|2790.98|0.05|0.00|N|O|1997-04-28|1997-04-23|1997-05-09|TAKE BACK RETURN|REG AIR|n packages haggle furiously along the excus +56961|805|72|4|7|11940.60|0.10|0.02|N|O|1997-05-27|1997-03-26|1997-06-01|COLLECT COD|AIR|ctions haggle against the +56961|937|38|5|21|38596.53|0.06|0.05|N|O|1997-03-12|1997-03-13|1997-03-20|DELIVER IN PERSON|RAIL| pending accounts above the quickly special +56962|299|54|1|15|17989.35|0.05|0.06|R|F|1994-04-04|1994-03-01|1994-04-11|NONE|MAIL|ironic platel +56962|1901|2|2|1|1802.90|0.10|0.03|A|F|1994-04-06|1994-02-11|1994-04-20|NONE|TRUCK| ironic accounts cajole carefully ruthles +56962|1507|88|3|39|54931.50|0.05|0.00|R|F|1994-02-19|1994-02-13|1994-03-03|NONE|TRUCK|according to the excuses. carefully p +56962|316|45|4|21|25542.51|0.05|0.06|A|F|1994-01-14|1994-02-21|1994-01-18|NONE|REG AIR|ross the carefully regular requests. unusua +56962|232|87|5|16|18115.68|0.08|0.07|R|F|1994-04-27|1994-03-15|1994-05-24|DELIVER IN PERSON|RAIL| blithe ideas haggle c +56962|720|85|6|39|63208.08|0.02|0.01|A|F|1994-01-23|1994-03-09|1994-02-03|DELIVER IN PERSON|SHIP|gedly. slyly express packages +56962|560|61|7|14|20447.84|0.09|0.01|R|F|1994-02-27|1994-02-04|1994-03-25|DELIVER IN PERSON|SHIP|refully regular cour +56963|352|9|1|12|15028.20|0.09|0.00|N|O|1997-06-02|1997-05-02|1997-06-18|TAKE BACK RETURN|RAIL|ully ironic theodolit +56963|1799|26|2|26|44220.54|0.05|0.01|N|O|1997-06-02|1997-04-08|1997-06-20|TAKE BACK RETURN|SHIP|etimes according to the f +56963|1420|21|3|41|54178.22|0.07|0.07|N|O|1997-04-29|1997-05-03|1997-05-13|COLLECT COD|FOB|y bold theodolites. final, +56963|318|75|4|36|43859.16|0.01|0.04|N|O|1997-03-11|1997-04-13|1997-04-08|COLLECT COD|RAIL|thely ironic accounts lose bold, +56963|1386|25|5|5|6436.90|0.07|0.07|N|O|1997-06-02|1997-04-11|1997-06-30|COLLECT COD|AIR|sts. express ideas nod even, final dolphins +56963|258|59|6|21|24323.25|0.02|0.01|N|O|1997-06-22|1997-04-24|1997-07-21|DELIVER IN PERSON|FOB|cajole along the car +56964|191|70|1|40|43647.60|0.04|0.01|N|O|1998-01-29|1998-03-08|1998-02-07|NONE|AIR|quests boost enticingly f +56964|667|30|2|46|72112.36|0.10|0.06|N|O|1998-05-13|1998-04-04|1998-06-11|NONE|MAIL|lyly unusual foxes haggle daring +56964|939|40|3|36|66237.48|0.09|0.04|N|O|1998-03-22|1998-02-12|1998-04-16|COLLECT COD|TRUCK|quests. quickly even +56965|1750|77|1|5|8258.75|0.07|0.02|N|O|1997-10-22|1997-11-29|1997-10-31|NONE|SHIP| snooze furiously quickly ironic fox +56965|1292|30|2|8|9546.32|0.05|0.03|N|O|1997-10-19|1997-11-20|1997-10-28|TAKE BACK RETURN|AIR| theodolites ha +56965|1128|29|3|45|46310.40|0.01|0.02|N|O|1997-09-25|1997-11-15|1997-10-05|TAKE BACK RETURN|SHIP|ackages. reque +56965|852|53|4|34|59596.90|0.09|0.05|N|O|1997-12-04|1997-11-04|1997-12-11|DELIVER IN PERSON|RAIL|requests serve. furiously ir +56965|197|76|5|3|3291.57|0.00|0.06|N|O|1997-12-18|1997-10-31|1997-12-25|NONE|AIR|press, ironic foxes boost +56965|783|48|6|24|40410.72|0.09|0.06|N|O|1997-12-22|1997-10-10|1998-01-12|NONE|MAIL|egular accounts. unusual deposits use +56966|406|65|1|43|56175.20|0.10|0.08|N|O|1997-04-09|1997-03-01|1997-04-25|NONE|REG AIR| blithely about the quic +56966|735|68|2|43|70336.39|0.08|0.02|N|O|1997-01-01|1997-02-24|1997-01-19|TAKE BACK RETURN|MAIL|es sleep slyly. express asymptotes abo +56966|739|40|3|6|9838.38|0.05|0.02|N|O|1997-01-29|1997-01-27|1997-02-15|COLLECT COD|FOB|ccounts. pending frets wake blithel +56966|1228|3|4|4|4516.88|0.10|0.03|N|O|1997-01-22|1997-02-26|1997-02-10|TAKE BACK RETURN|FOB|ckly even de +56966|1049|20|5|15|14250.60|0.05|0.03|N|O|1997-01-08|1997-02-09|1997-01-29|TAKE BACK RETURN|AIR|latelets. permanently silent +56967|587|18|1|40|59503.20|0.00|0.00|A|F|1992-06-10|1992-05-08|1992-07-04|DELIVER IN PERSON|SHIP|lithe excuses cajole slyly express accoun +56967|1022|58|2|46|42458.92|0.08|0.07|A|F|1992-03-15|1992-05-06|1992-04-01|NONE|TRUCK| instructions. carefully bold acco +56967|1627|51|3|2|3057.24|0.06|0.03|R|F|1992-05-08|1992-05-23|1992-05-19|COLLECT COD|REG AIR|onic theodolites abo +56967|732|65|4|36|58778.28|0.09|0.07|R|F|1992-03-27|1992-04-02|1992-03-28|DELIVER IN PERSON|RAIL| quickly against the blit +56992|288|43|1|26|30895.28|0.00|0.05|A|F|1993-05-14|1993-06-15|1993-05-31|NONE|SHIP|eposits cajol +56992|746|11|2|43|70809.82|0.09|0.02|A|F|1993-05-28|1993-05-25|1993-05-30|COLLECT COD|RAIL|y even requests haggle fluffily b +56992|332|89|3|40|49293.20|0.04|0.05|A|F|1993-06-29|1993-07-01|1993-07-03|TAKE BACK RETURN|AIR|ost fluffily final Tires +56992|535|96|4|1|1435.53|0.01|0.05|R|F|1993-08-16|1993-07-01|1993-09-12|NONE|SHIP|accounts. carefully fi +56993|1327|42|1|19|23338.08|0.02|0.06|N|O|1998-06-01|1998-04-12|1998-06-10|NONE|MAIL| pending requests nag busily unusual, ironi +56993|1425|26|2|18|23875.56|0.01|0.01|N|O|1998-07-04|1998-06-03|1998-07-29|TAKE BACK RETURN|TRUCK|ys cajole final requests +56993|1613|96|3|32|48467.52|0.06|0.02|N|O|1998-03-18|1998-06-05|1998-04-06|NONE|SHIP|nto beans poach careful +56993|965|100|4|17|31721.32|0.02|0.03|N|O|1998-04-12|1998-04-16|1998-04-20|TAKE BACK RETURN|TRUCK|sly silent requests sleep furiously ironic +56994|1484|63|1|17|23553.16|0.00|0.06|N|O|1998-09-07|1998-07-08|1998-09-13|COLLECT COD|MAIL|y busy deposits along the blithely +56994|1573|54|2|50|73728.50|0.09|0.05|N|O|1998-08-13|1998-07-31|1998-08-17|COLLECT COD|TRUCK|ongside of t +56994|1946|91|3|27|49894.38|0.04|0.08|N|O|1998-07-16|1998-08-14|1998-08-15|TAKE BACK RETURN|MAIL|ong the carefully fin +56995|1176|77|1|39|42009.63|0.06|0.08|R|F|1994-10-28|1994-12-20|1994-11-04|TAKE BACK RETURN|AIR| regular deposi +56995|1635|18|2|19|29195.97|0.07|0.08|R|F|1994-12-29|1995-01-07|1994-12-31|TAKE BACK RETURN|REG AIR|c packages. final d +56995|1570|51|3|50|73578.50|0.07|0.03|R|F|1995-02-07|1994-11-30|1995-03-06|NONE|SHIP|refully bold theo +56995|1889|33|4|28|50144.64|0.05|0.01|R|F|1994-11-20|1994-12-02|1994-12-16|TAKE BACK RETURN|MAIL|eas sleep furiously blithely regular +56996|631|25|1|7|10721.41|0.07|0.07|N|O|1996-03-23|1996-06-12|1996-04-03|TAKE BACK RETURN|MAIL| carefully across the idly iron +56996|23|49|2|4|3692.08|0.03|0.04|N|O|1996-03-16|1996-04-20|1996-04-11|TAKE BACK RETURN|SHIP|ly ironic foxes. bold instructi +56996|1221|59|3|37|41522.14|0.02|0.03|N|O|1996-04-16|1996-04-28|1996-04-18|TAKE BACK RETURN|SHIP|arefully among the slyl +56996|1059|60|4|7|6720.35|0.09|0.04|N|O|1996-05-09|1996-05-23|1996-06-07|DELIVER IN PERSON|SHIP|y final excus +56996|762|59|5|2|3325.52|0.00|0.05|N|O|1996-06-25|1996-05-20|1996-07-18|DELIVER IN PERSON|AIR|sts cajole carefully! express +56997|153|54|1|11|11584.65|0.01|0.08|N|O|1996-05-29|1996-05-19|1996-06-10|TAKE BACK RETURN|SHIP|uriously reg +56998|82|83|1|30|29462.40|0.10|0.00|N|O|1998-02-04|1998-01-08|1998-02-09|TAKE BACK RETURN|MAIL|nusual foxes. +56999|683|84|1|4|6334.72|0.07|0.06|N|O|1997-07-31|1997-07-11|1997-08-14|COLLECT COD|FOB|d the busily express i +57024|1270|71|1|47|55049.69|0.01|0.00|N|O|1996-09-30|1996-12-02|1996-10-23|TAKE BACK RETURN|TRUCK|o beans. fluffily +57024|136|15|2|27|27975.51|0.01|0.08|N|O|1996-11-11|1996-11-30|1996-11-17|NONE|SHIP|sits-- carefully bold deposits whithout +57024|1442|82|3|14|18808.16|0.10|0.08|N|O|1996-11-06|1996-10-06|1996-11-14|TAKE BACK RETURN|SHIP| bold dinos. ironic, final foxes c +57024|1971|60|4|48|89902.56|0.09|0.08|N|O|1996-09-28|1996-11-11|1996-10-11|COLLECT COD|AIR|xpress requests. flu +57024|1251|89|5|25|28806.25|0.03|0.06|N|O|1996-10-28|1996-10-21|1996-11-07|NONE|REG AIR| theodolites use slyly. silent +57024|1518|19|6|17|24131.67|0.09|0.01|N|O|1996-12-02|1996-11-04|1996-12-16|NONE|SHIP|ve the iron +57024|657|20|7|9|14018.85|0.08|0.03|N|O|1996-10-10|1996-10-22|1996-10-31|TAKE BACK RETURN|SHIP| accounts. regular ac +57025|1890|20|1|17|30462.13|0.03|0.00|A|F|1992-08-25|1992-08-02|1992-08-26|DELIVER IN PERSON|AIR|ully silent excuses +57025|1230|42|2|9|10181.07|0.09|0.01|R|F|1992-08-09|1992-08-25|1992-09-03|TAKE BACK RETURN|SHIP|e furiously +57026|1115|16|1|17|17273.87|0.06|0.01|N|O|1998-09-07|1998-09-14|1998-09-08|COLLECT COD|SHIP|are quickly about the iro +57026|1343|58|2|10|12443.40|0.06|0.04|N|O|1998-10-05|1998-08-31|1998-10-28|NONE|RAIL|l ideas haggle furiously ag +57027|1740|25|1|44|72236.56|0.10|0.05|A|F|1995-02-17|1995-03-19|1995-03-16|DELIVER IN PERSON|RAIL|uriously bold, even packages. +57028|161|62|1|37|39262.92|0.08|0.03|R|F|1994-07-14|1994-09-30|1994-07-26|NONE|SHIP|s believe blith +57029|914|83|1|3|5444.73|0.06|0.07|R|F|1995-06-08|1995-05-21|1995-06-11|DELIVER IN PERSON|REG AIR|ts. bold accounts would unwind slyly bol +57029|1353|54|2|25|31358.75|0.09|0.05|R|F|1995-03-15|1995-04-22|1995-03-31|COLLECT COD|MAIL|ly. slyly ironic theodolites ca +57029|1543|84|3|22|31779.88|0.10|0.07|N|O|1995-06-24|1995-05-29|1995-07-07|NONE|SHIP|he slyly pending +57029|622|23|4|32|48723.84|0.07|0.05|A|F|1995-05-09|1995-05-24|1995-05-28|NONE|MAIL|furiously! furiously +57030|1387|64|1|37|47670.06|0.06|0.05|N|O|1998-06-12|1998-07-06|1998-06-27|TAKE BACK RETURN|FOB|. pending +57030|1072|8|2|48|46707.36|0.04|0.00|N|O|1998-07-11|1998-07-10|1998-07-18|COLLECT COD|FOB| regular ideas wake carefully package +57030|641|35|3|12|18499.68|0.05|0.08|N|O|1998-07-10|1998-07-23|1998-07-17|COLLECT COD|FOB|unts. special accounts wake finally. reg +57030|184|85|4|47|50956.46|0.02|0.07|N|O|1998-08-15|1998-06-13|1998-08-24|TAKE BACK RETURN|RAIL| ironic instructions. quickly regul +57030|1072|73|5|21|20434.47|0.02|0.01|N|O|1998-08-07|1998-07-15|1998-08-23|NONE|MAIL|ages wake carefully final platelets. +57030|198|77|6|39|42829.41|0.01|0.04|N|O|1998-09-04|1998-07-12|1998-09-09|DELIVER IN PERSON|AIR| carefully u +57031|362|19|1|22|27771.92|0.07|0.08|R|F|1992-08-13|1992-08-13|1992-08-23|NONE|AIR| even reques +57056|306|63|1|11|13269.30|0.03|0.00|R|F|1993-02-07|1992-12-20|1993-02-14|TAKE BACK RETURN|SHIP|d furiously final court +57056|629|30|2|13|19885.06|0.10|0.04|A|F|1992-12-21|1992-12-17|1992-12-28|TAKE BACK RETURN|TRUCK|ely regular dependencies wake blithel +57057|302|31|1|22|26450.60|0.00|0.01|R|F|1992-05-04|1992-05-29|1992-05-13|TAKE BACK RETURN|AIR|s detect quickl +57057|1888|75|2|1|1789.88|0.05|0.02|A|F|1992-07-15|1992-05-29|1992-08-09|DELIVER IN PERSON|AIR|ze bold, regul +57058|1537|78|1|23|33086.19|0.00|0.00|A|F|1992-06-06|1992-07-21|1992-06-21|DELIVER IN PERSON|MAIL|against the furiously fi +57058|1623|47|2|36|54886.32|0.06|0.04|R|F|1992-06-05|1992-07-04|1992-06-26|COLLECT COD|TRUCK|w deposits. final instr +57059|1005|6|1|25|22650.00|0.02|0.06|N|O|1995-06-22|1995-08-06|1995-07-15|TAKE BACK RETURN|RAIL|furiously ironic pinto +57059|13|64|2|36|32868.36|0.02|0.04|N|O|1995-09-27|1995-07-14|1995-10-13|COLLECT COD|RAIL|yly even fox +57059|1668|92|3|30|47089.80|0.00|0.03|N|O|1995-06-25|1995-08-16|1995-06-30|COLLECT COD|SHIP| silent reques +57060|581|42|1|20|29631.60|0.08|0.03|N|O|1997-06-14|1997-05-27|1997-07-12|COLLECT COD|MAIL|ct slyly. quickly ironic f +57060|1151|52|2|49|51555.35|0.06|0.06|N|O|1997-04-26|1997-05-06|1997-05-24|COLLECT COD|FOB|p carefully slyly express deposits. +57060|740|73|3|22|36096.28|0.08|0.08|N|O|1997-05-02|1997-06-23|1997-05-09|DELIVER IN PERSON|AIR|lithely bold packages are fluffily +57060|684|78|4|45|71310.60|0.04|0.05|N|O|1997-05-10|1997-06-22|1997-05-30|TAKE BACK RETURN|SHIP| blithely about the quickly final requests. +57060|1819|6|5|45|77436.45|0.01|0.01|N|O|1997-05-27|1997-05-07|1997-06-04|DELIVER IN PERSON|TRUCK|d carefully. eve +57061|1310|11|1|48|58142.88|0.04|0.01|A|F|1995-03-29|1995-02-21|1995-04-28|DELIVER IN PERSON|RAIL|final pinto beans. pending, express reques +57061|192|45|2|23|25120.37|0.00|0.05|R|F|1994-12-25|1995-02-08|1995-01-16|DELIVER IN PERSON|RAIL|jole. ironic ideas boost. regular, final +57061|746|11|3|22|36228.28|0.04|0.08|R|F|1994-12-30|1995-02-22|1995-01-22|NONE|MAIL|nic ideas cajole acc +57061|1141|14|4|6|6252.84|0.07|0.00|R|F|1995-02-16|1995-02-19|1995-02-21|NONE|TRUCK|gainst the silent sauternes. s +57061|814|48|5|24|41155.44|0.09|0.08|A|F|1995-03-02|1995-01-03|1995-04-01|DELIVER IN PERSON|MAIL| carefully express pac +57061|1717|2|6|34|55036.14|0.06|0.08|R|F|1995-01-04|1995-02-21|1995-01-18|DELIVER IN PERSON|REG AIR|lar sentiments boost quickly sly +57061|1966|11|7|11|20547.56|0.09|0.00|R|F|1995-03-11|1995-02-01|1995-04-10|NONE|MAIL|, even accounts integrate slyly across the +57062|1322|37|1|47|57496.04|0.08|0.01|N|O|1996-06-21|1996-08-14|1996-06-23|NONE|REG AIR| ironic accounts. slyly exp +57062|41|42|2|29|27290.16|0.04|0.02|N|O|1996-09-28|1996-08-17|1996-10-28|TAKE BACK RETURN|AIR| according to the final +57062|373|58|3|22|28014.14|0.02|0.04|N|O|1996-07-31|1996-08-12|1996-08-15|NONE|AIR|ut the iron +57062|176|55|4|34|36589.78|0.00|0.02|N|O|1996-09-16|1996-07-17|1996-09-24|TAKE BACK RETURN|TRUCK|ithe excuse +57062|486|74|5|14|19410.72|0.07|0.01|N|O|1996-09-11|1996-08-26|1996-09-21|NONE|REG AIR|s affix quickly over the expres +57062|688|82|6|11|17475.48|0.09|0.08|N|O|1996-06-10|1996-09-04|1996-06-22|DELIVER IN PERSON|REG AIR|lar ideas mold. furiously expre +57063|56|82|1|28|26769.40|0.09|0.03|N|O|1995-09-10|1995-07-19|1995-09-15|DELIVER IN PERSON|FOB|endencies. even foxes sleep quickly. fluffi +57063|1481|60|2|31|42856.88|0.07|0.06|N|O|1995-08-08|1995-07-30|1995-08-15|NONE|REG AIR| unusual requests. careful +57063|1440|80|3|2|2682.88|0.10|0.07|N|O|1995-09-09|1995-08-31|1995-10-08|NONE|MAIL|es wake quickly. blithely regul +57063|321|50|4|3|3663.96|0.06|0.08|N|O|1995-08-21|1995-08-21|1995-09-05|NONE|RAIL|lites. blithely regular asymptotes +57063|1808|9|5|50|85490.00|0.08|0.02|N|O|1995-09-10|1995-07-05|1995-10-04|NONE|TRUCK|he thinly ironic deposits sleep +57088|242|97|1|39|44547.36|0.04|0.00|N|O|1998-01-04|1997-10-30|1998-01-18|NONE|TRUCK|along the carefully special foxes ar +57088|598|29|2|41|61442.19|0.08|0.02|N|O|1997-11-20|1997-11-01|1997-11-30|NONE|FOB|n ideas are foxes. +57088|730|31|3|5|8153.65|0.03|0.08|N|O|1997-12-26|1997-10-24|1998-01-02|NONE|REG AIR|s at the quickly blithe acco +57088|755|56|4|38|62918.50|0.04|0.05|N|O|1998-01-09|1997-11-29|1998-02-02|COLLECT COD|SHIP|ackages integrate silent, bol +57088|589|80|5|14|20854.12|0.10|0.01|N|O|1997-09-13|1997-11-05|1997-09-24|DELIVER IN PERSON|TRUCK|ully ironic orbits. requests sleep +57088|1769|70|6|31|51793.56|0.02|0.06|N|O|1998-01-01|1997-12-09|1998-01-04|DELIVER IN PERSON|FOB|ar deposits are c +57088|449|8|7|22|29687.68|0.10|0.02|N|O|1998-01-01|1997-10-13|1998-01-31|DELIVER IN PERSON|FOB|. carefully ironic accoun +57089|1222|97|1|34|38189.48|0.10|0.05|A|F|1993-03-02|1993-01-30|1993-03-29|DELIVER IN PERSON|AIR|ular asymptotes use +57090|398|99|1|38|49338.82|0.10|0.04|R|F|1992-09-14|1992-09-09|1992-10-07|DELIVER IN PERSON|TRUCK|al, special foxes sl +57090|1825|26|2|40|69072.80|0.04|0.02|R|F|1992-11-10|1992-08-28|1992-11-21|NONE|FOB|n theodoli +57090|1003|74|3|11|9944.00|0.04|0.03|A|F|1992-11-02|1992-10-22|1992-11-03|COLLECT COD|MAIL|y regular requests. quickly regul +57090|498|86|4|31|43353.19|0.08|0.06|A|F|1992-11-01|1992-09-20|1992-11-24|DELIVER IN PERSON|AIR|lyly final pinto bea +57091|1344|21|1|36|44832.24|0.07|0.03|N|O|1995-12-11|1995-12-20|1995-12-28|TAKE BACK RETURN|FOB|ids. bold, special dolphins nag. evenly +57091|173|74|2|17|18243.89|0.10|0.04|N|O|1995-11-15|1996-01-11|1995-12-07|NONE|FOB|ages across the fluffily final re +57091|677|78|3|37|58373.79|0.00|0.05|N|O|1995-11-27|1995-12-11|1995-12-08|DELIVER IN PERSON|FOB|yly according t +57091|1392|31|4|36|46562.04|0.03|0.06|N|O|1995-11-10|1996-01-21|1995-11-17|COLLECT COD|FOB|y bold account +57091|1003|4|5|19|17176.00|0.04|0.06|N|O|1995-12-01|1995-12-26|1995-12-04|NONE|AIR|s. bold, ironic instructi +57092|358|59|1|26|32717.10|0.07|0.05|A|F|1993-07-14|1993-06-07|1993-08-03|DELIVER IN PERSON|TRUCK|ts hinder furious +57092|1615|16|2|44|66730.84|0.07|0.02|A|F|1993-08-22|1993-06-12|1993-09-01|COLLECT COD|MAIL|ly. slyly special requests haggle +57092|1520|41|3|10|14215.20|0.06|0.08|A|F|1993-08-01|1993-06-23|1993-08-06|NONE|TRUCK| regular instructions sleep furiousl +57093|750|51|1|8|13206.00|0.01|0.03|R|F|1992-07-30|1992-07-04|1992-08-24|NONE|AIR|r deposits. special packa +57093|1590|31|2|2|2983.18|0.00|0.01|R|F|1992-06-02|1992-06-24|1992-06-22|DELIVER IN PERSON|TRUCK|ts nag blithely amon +57093|895|95|3|26|46693.14|0.02|0.04|R|F|1992-06-10|1992-07-20|1992-06-29|NONE|MAIL|final, ironic instr +57093|1776|77|4|4|6711.08|0.08|0.04|A|F|1992-05-31|1992-06-18|1992-06-28|DELIVER IN PERSON|TRUCK|y express instructions +57093|1081|87|5|35|34372.80|0.04|0.07|A|F|1992-05-11|1992-07-12|1992-06-01|NONE|RAIL|yly regular theodolites against the blit +57093|954|23|6|1|1854.95|0.04|0.07|A|F|1992-05-19|1992-07-14|1992-06-15|NONE|RAIL|riously carefully specia +57094|1312|89|1|4|4853.24|0.02|0.01|N|O|1998-09-22|1998-10-13|1998-10-05|NONE|FOB|into beans. carefully pending +57094|1410|11|2|23|30162.43|0.01|0.03|N|O|1998-08-30|1998-09-09|1998-09-04|DELIVER IN PERSON|REG AIR|fily final packages haggle. furiously r +57094|1328|43|3|44|54090.08|0.02|0.08|N|O|1998-09-04|1998-10-07|1998-09-06|DELIVER IN PERSON|TRUCK|ar instructions. final accounts +57094|1363|78|4|17|21494.12|0.06|0.04|N|O|1998-10-11|1998-09-10|1998-11-06|DELIVER IN PERSON|AIR| slyly regular t +57095|936|37|1|4|7347.72|0.04|0.02|N|F|1995-06-07|1995-05-03|1995-06-21|TAKE BACK RETURN|TRUCK|quests sleep ca +57120|419|78|1|8|10555.28|0.01|0.03|N|O|1996-08-14|1996-07-18|1996-09-02|COLLECT COD|AIR|e silent accounts. ac +57120|1356|95|2|10|12573.50|0.06|0.00|N|O|1996-07-17|1996-07-15|1996-08-10|TAKE BACK RETURN|FOB|old dependencies. pending, ironic sauterne +57120|1303|18|3|20|24086.00|0.05|0.04|N|O|1996-10-03|1996-07-18|1996-10-10|COLLECT COD|MAIL|slyly final theo +57120|640|41|4|13|20028.32|0.01|0.04|N|O|1996-10-04|1996-07-26|1996-10-05|DELIVER IN PERSON|AIR| deposits sleep across the +57120|687|88|5|34|53981.12|0.00|0.08|N|O|1996-08-02|1996-08-22|1996-08-19|COLLECT COD|AIR|. regular foxes a +57121|1144|53|1|12|12541.68|0.04|0.02|N|O|1995-12-30|1996-02-03|1996-01-19|DELIVER IN PERSON|RAIL|ide the carefully ironic deposits +57121|1967|56|2|21|39248.16|0.00|0.00|N|O|1996-03-07|1996-01-10|1996-03-21|TAKE BACK RETURN|FOB| the final dependencies. regular, pendin +57121|935|36|3|14|25703.02|0.10|0.07|N|O|1996-03-10|1996-01-10|1996-03-24|COLLECT COD|TRUCK|, final dependen +57121|115|16|4|15|15226.65|0.06|0.01|N|O|1995-11-28|1995-12-29|1995-12-06|COLLECT COD|TRUCK|s detect regular, express asymptote +57121|160|39|5|50|53008.00|0.03|0.08|N|O|1996-02-29|1996-01-28|1996-03-05|DELIVER IN PERSON|TRUCK| haggle furiously ironic foxes. regular t +57122|1925|70|1|33|60288.36|0.00|0.08|N|O|1997-05-03|1997-04-27|1997-05-05|NONE|AIR|sleep furiously boldly final foxes. care +57123|522|53|1|50|71126.00|0.09|0.05|N|O|1997-08-22|1997-08-10|1997-08-29|TAKE BACK RETURN|MAIL|s haggle fluffily about t +57123|252|80|2|9|10370.25|0.04|0.03|N|O|1997-07-07|1997-08-02|1997-07-26|NONE|MAIL|c, final packages use blithely. fluff +57123|365|94|3|25|31634.00|0.07|0.01|N|O|1997-07-26|1997-07-03|1997-08-23|TAKE BACK RETURN|SHIP|quickly final pac +57123|1692|34|4|44|70122.36|0.02|0.06|N|O|1997-08-26|1997-07-22|1997-09-01|TAKE BACK RETURN|TRUCK|st across the even deposits. fur +57123|574|75|5|19|28016.83|0.06|0.04|N|O|1997-05-25|1997-06-25|1997-06-23|NONE|TRUCK|ic accounts. quickly +57123|1558|99|6|30|43786.50|0.06|0.07|N|O|1997-09-06|1997-07-11|1997-09-30|COLLECT COD|RAIL| packages. express, unusual deposits aff +57123|1945|78|7|12|22163.28|0.08|0.03|N|O|1997-06-06|1997-06-27|1997-06-23|NONE|TRUCK| platelets. blithely fluffy accounts sleep +57124|881|15|1|12|21382.56|0.00|0.03|N|O|1996-04-18|1996-04-15|1996-05-11|COLLECT COD|SHIP| bold, iron +57124|162|63|2|13|13808.08|0.03|0.06|N|O|1996-06-05|1996-04-29|1996-06-19|DELIVER IN PERSON|MAIL|lithely reg +57124|1417|18|3|21|27686.61|0.07|0.04|N|O|1996-03-05|1996-05-04|1996-03-27|DELIVER IN PERSON|SHIP|fluffily against the blithely ironic pinto +57124|1005|76|4|15|13590.00|0.04|0.07|N|O|1996-03-08|1996-04-24|1996-04-06|TAKE BACK RETURN|AIR|le blithel +57124|173|100|5|38|40780.46|0.03|0.07|N|O|1996-03-10|1996-05-29|1996-03-16|COLLECT COD|FOB|sleep. bold, pending depths sleep furi +57124|1324|25|6|43|52688.76|0.03|0.05|N|O|1996-03-22|1996-05-03|1996-03-31|TAKE BACK RETURN|FOB|ickly alongside of the slyly ironic requ +57125|59|85|1|40|38362.00|0.00|0.07|A|F|1993-07-07|1993-08-22|1993-07-12|TAKE BACK RETURN|FOB|lyly furiously express realms. final e +57125|783|84|2|2|3367.56|0.00|0.03|R|F|1993-07-26|1993-09-01|1993-07-31|NONE|SHIP| about the blithely special requests +57125|766|67|3|42|70003.92|0.00|0.07|R|F|1993-08-08|1993-07-17|1993-08-22|COLLECT COD|FOB|yers affix carefully sil +57125|1492|93|4|21|29263.29|0.01|0.00|A|F|1993-07-05|1993-08-13|1993-07-31|DELIVER IN PERSON|SHIP|carefully regular attainments affi +57125|927|28|5|40|73116.80|0.03|0.04|A|F|1993-07-01|1993-07-20|1993-07-09|NONE|FOB|ently expres +57125|299|100|6|33|39576.57|0.06|0.01|A|F|1993-08-10|1993-07-22|1993-08-26|DELIVER IN PERSON|MAIL|sly since the accounts. furiously +57125|1331|70|7|36|44363.88|0.07|0.06|A|F|1993-06-30|1993-08-02|1993-07-14|NONE|RAIL|nic requests haggle fur +57126|1071|42|1|39|37910.73|0.02|0.07|N|O|1998-06-10|1998-04-06|1998-06-21|COLLECT COD|TRUCK|ke deposits: bold deposits haggle f +57126|735|100|2|17|27807.41|0.08|0.08|N|O|1998-02-22|1998-04-14|1998-03-12|DELIVER IN PERSON|SHIP|s cajole blithe +57126|1319|20|3|43|52473.33|0.04|0.08|N|O|1998-04-04|1998-03-26|1998-04-14|DELIVER IN PERSON|RAIL|refully regular theodolites +57126|1088|59|4|4|3956.32|0.05|0.05|N|O|1998-05-05|1998-03-26|1998-05-30|DELIVER IN PERSON|REG AIR|iously ironic theodolites mold f +57126|1952|85|5|13|24101.35|0.03|0.05|N|O|1998-04-06|1998-03-26|1998-04-17|COLLECT COD|TRUCK|re slyly never express pinto beans. special +57127|71|72|1|47|45640.29|0.03|0.05|R|F|1993-04-24|1993-03-22|1993-04-26|DELIVER IN PERSON|MAIL|fully slyly final foxes: furiousl +57152|138|17|1|36|37372.68|0.03|0.05|A|F|1992-11-24|1992-11-27|1992-12-08|NONE|TRUCK|ent deposits: silently ironic foxes slee +57152|1382|59|2|42|53901.96|0.06|0.01|R|F|1992-12-05|1992-10-29|1992-12-16|DELIVER IN PERSON|AIR|deposits integrate carefully across the +57152|1684|8|3|22|34884.96|0.02|0.05|A|F|1992-11-08|1992-11-05|1992-11-11|DELIVER IN PERSON|AIR|nding depos +57152|979|48|4|6|11279.82|0.06|0.02|A|F|1992-12-30|1992-11-15|1993-01-21|COLLECT COD|FOB|against the final, silent asymp +57152|1407|86|5|1|1308.40|0.09|0.06|R|F|1992-11-30|1992-10-30|1992-12-16|NONE|AIR|olites wake against the final, sil +57153|1409|27|1|31|40622.40|0.08|0.00|R|F|1994-06-15|1994-07-09|1994-07-14|NONE|FOB| the slyly even excuses. a +57153|742|75|2|8|13141.92|0.07|0.07|A|F|1994-09-14|1994-08-21|1994-10-07|TAKE BACK RETURN|AIR|d platelets. final +57153|1607|90|3|22|33189.20|0.00|0.04|R|F|1994-09-21|1994-07-31|1994-09-24|NONE|SHIP|silently even platelets kindle +57154|98|24|1|7|6986.63|0.04|0.06|N|O|1996-12-26|1997-01-22|1997-01-02|TAKE BACK RETURN|MAIL| express pinto beans! r +57154|567|28|2|37|54299.72|0.02|0.06|N|O|1996-12-05|1997-01-14|1996-12-28|TAKE BACK RETURN|TRUCK|nt forges play furiously blithely b +57154|1250|88|3|23|26478.75|0.10|0.05|N|O|1997-03-02|1997-01-01|1997-03-05|NONE|MAIL| alongside of the quic +57155|834|35|1|38|65923.54|0.03|0.00|A|F|1994-09-18|1994-08-21|1994-10-07|DELIVER IN PERSON|REG AIR|s cajole furiously +57155|836|3|2|9|15631.47|0.05|0.05|A|F|1994-10-15|1994-09-09|1994-11-05|TAKE BACK RETURN|RAIL|ound the carefully exp +57155|86|37|3|30|29582.40|0.07|0.08|R|F|1994-10-15|1994-07-26|1994-10-22|COLLECT COD|SHIP|y pending theodolites. quickly f +57155|959|60|4|50|92997.50|0.05|0.02|R|F|1994-10-06|1994-08-26|1994-10-08|NONE|AIR|ackages. fluff +57156|1198|7|1|35|38471.65|0.01|0.04|N|O|1996-07-26|1996-07-16|1996-08-08|DELIVER IN PERSON|RAIL|equests across the +57157|1306|7|1|47|56743.10|0.08|0.04|A|F|1992-06-01|1992-05-05|1992-06-27|TAKE BACK RETURN|MAIL|l excuses nag carefully at the +57158|726|27|1|45|73202.40|0.02|0.01|N|O|1997-04-29|1997-03-14|1997-05-04|DELIVER IN PERSON|SHIP|he carefully silen +57159|617|49|1|23|34905.03|0.03|0.05|A|F|1993-04-14|1993-04-12|1993-05-14|DELIVER IN PERSON|RAIL|to the furi +57159|187|88|2|42|45661.56|0.00|0.04|R|F|1993-06-12|1993-03-18|1993-06-14|TAKE BACK RETURN|FOB|ep. furiously bold tithe +57159|1685|9|3|41|65053.88|0.08|0.05|A|F|1993-03-30|1993-05-11|1993-04-11|DELIVER IN PERSON|TRUCK| ironic asymptotes atop the +57159|516|7|4|37|52410.87|0.01|0.00|R|F|1993-05-09|1993-04-11|1993-05-24|TAKE BACK RETURN|TRUCK|fully regular requests; even instructions +57159|614|8|5|37|56040.57|0.00|0.03|R|F|1993-04-29|1993-04-02|1993-05-24|NONE|SHIP|ctions. fluffy Tires +57159|727|24|6|4|6510.88|0.08|0.07|A|F|1993-04-05|1993-04-10|1993-04-17|DELIVER IN PERSON|FOB|e. unusual escapades sleep w +57159|902|71|7|41|73918.90|0.07|0.07|R|F|1993-06-08|1993-03-20|1993-06-23|TAKE BACK RETURN|FOB| accounts nag slyl +57184|1342|57|1|10|12433.40|0.08|0.08|N|O|1998-03-23|1998-03-01|1998-04-05|NONE|RAIL| hang fluffily slyly c +57184|308|65|2|7|8458.10|0.01|0.08|N|O|1998-03-14|1998-02-27|1998-04-11|DELIVER IN PERSON|TRUCK|press, express theodolite +57184|255|37|3|41|47365.25|0.06|0.05|N|O|1998-03-11|1998-03-06|1998-04-03|NONE|MAIL|fily quick decoys wake +57184|1480|59|4|1|1381.48|0.00|0.05|N|O|1998-01-24|1998-04-16|1998-02-19|DELIVER IN PERSON|RAIL|ly about the thinly sil +57184|1833|63|5|7|12143.81|0.02|0.01|N|O|1998-05-06|1998-03-04|1998-05-15|COLLECT COD|AIR|ns. ironic accounts det +57184|900|100|6|11|19809.90|0.00|0.05|N|O|1998-04-14|1998-04-09|1998-04-22|NONE|FOB|r accounts. express, ironic a +57184|724|89|7|29|47116.88|0.10|0.01|N|O|1998-04-19|1998-02-27|1998-05-07|COLLECT COD|TRUCK|ring requests across the blith +57185|1520|1|1|29|41224.08|0.05|0.08|N|O|1995-07-25|1995-07-11|1995-08-20|TAKE BACK RETURN|FOB|o the unusual theodolite +57186|1370|9|1|49|62297.13|0.00|0.03|R|F|1993-08-01|1993-05-28|1993-08-29|TAKE BACK RETURN|TRUCK|lose, bold ideas integrate slyly sl +57187|857|91|1|28|49219.80|0.10|0.00|N|O|1998-03-27|1998-06-04|1998-04-24|TAKE BACK RETURN|MAIL|thely blithely bold theodoli +57187|1541|22|2|15|21638.10|0.06|0.06|N|O|1998-06-09|1998-05-10|1998-06-27|TAKE BACK RETURN|AIR| beans. speci +57187|1418|97|3|6|7916.46|0.01|0.03|N|O|1998-07-12|1998-05-29|1998-08-02|COLLECT COD|FOB|ke according t +57187|1227|2|4|10|11282.20|0.03|0.02|N|O|1998-03-26|1998-06-08|1998-04-14|DELIVER IN PERSON|AIR|ithely final foxes are blithely e +57188|190|69|1|6|6541.14|0.07|0.05|R|F|1994-05-31|1994-04-24|1994-06-15|TAKE BACK RETURN|FOB|s. furiously final notornis wake flu +57188|1045|16|2|44|41625.76|0.03|0.00|R|F|1994-05-25|1994-04-19|1994-05-28|TAKE BACK RETURN|MAIL|even dependenci +57188|145|72|3|18|18812.52|0.04|0.02|R|F|1994-07-06|1994-04-16|1994-07-08|DELIVER IN PERSON|SHIP|onic accounts sleep be +57189|1637|38|1|29|44620.27|0.10|0.00|R|F|1993-03-19|1993-02-15|1993-04-16|DELIVER IN PERSON|FOB|thely regular accounts. packages cajole sl +57190|1165|38|1|44|46911.04|0.08|0.06|A|F|1993-07-29|1993-08-01|1993-08-24|COLLECT COD|SHIP|y along the +57190|380|81|2|8|10243.04|0.05|0.00|R|F|1993-09-16|1993-07-24|1993-10-03|DELIVER IN PERSON|MAIL|tructions affix. carefully +57190|1747|32|3|36|59354.64|0.00|0.00|R|F|1993-07-25|1993-07-08|1993-08-22|COLLECT COD|TRUCK| blithely final theodolites sleep. iro +57191|931|34|1|44|80604.92|0.09|0.01|N|O|1997-02-25|1997-03-22|1997-03-13|COLLECT COD|REG AIR|. blithely regular pinto beans are depos +57191|423|53|2|30|39702.60|0.10|0.00|N|O|1997-01-21|1997-02-23|1997-01-23|NONE|AIR| beans. furiously +57191|27|53|3|23|21321.46|0.05|0.04|N|O|1997-01-29|1997-01-31|1997-02-08|DELIVER IN PERSON|TRUCK| furiously re +57191|97|48|4|6|5982.54|0.03|0.08|N|O|1997-02-09|1997-02-27|1997-02-17|TAKE BACK RETURN|RAIL| cajole across the silent, bold a +57191|1702|29|5|50|80185.00|0.10|0.04|N|O|1997-04-15|1997-03-21|1997-04-30|NONE|SHIP|s against the instructions. alwa +57191|844|45|6|4|6979.36|0.09|0.05|N|O|1997-02-11|1997-01-31|1997-02-17|COLLECT COD|TRUCK|luffily ironic packages poach slyl +57191|476|6|7|23|31658.81|0.09|0.03|N|O|1997-01-21|1997-03-21|1997-02-08|DELIVER IN PERSON|RAIL|theodolites poach above the carefu +57216|1118|19|1|40|40764.40|0.10|0.07|R|F|1993-10-17|1993-09-10|1993-10-27|DELIVER IN PERSON|SHIP|ing the furiously ironic inst +57216|350|51|2|36|45012.60|0.03|0.02|R|F|1993-11-10|1993-09-09|1993-12-09|NONE|RAIL| the quickly regular f +57216|1929|62|3|40|73236.80|0.09|0.07|A|F|1993-10-07|1993-09-22|1993-11-01|COLLECT COD|AIR|ly pending r +57216|364|93|4|16|20229.76|0.07|0.08|A|F|1993-09-03|1993-09-29|1993-09-20|NONE|RAIL|ial requests against the +57216|610|4|5|49|74019.89|0.04|0.00|A|F|1993-10-17|1993-10-08|1993-10-19|NONE|FOB|lly even foxes. slyly express packages are +57216|1823|53|6|42|72442.44|0.05|0.07|A|F|1993-08-26|1993-09-02|1993-09-18|NONE|AIR|oxes haggle about the furiously special w +57216|1106|43|7|46|46326.60|0.06|0.06|A|F|1993-10-07|1993-10-20|1993-11-05|DELIVER IN PERSON|MAIL|ts. final accounts above the final dug +57217|607|70|1|17|25629.20|0.09|0.01|R|F|1995-03-14|1995-02-21|1995-04-04|COLLECT COD|SHIP|ag. quickly ironic dependencies +57217|475|34|2|40|55018.80|0.07|0.01|R|F|1995-02-15|1995-04-14|1995-02-28|COLLECT COD|REG AIR|pinto beans snoo +57217|1684|8|3|27|42813.36|0.08|0.02|R|F|1995-03-18|1995-03-26|1995-03-28|DELIVER IN PERSON|FOB|refully pending deposits about the +57217|763|96|4|11|18301.36|0.07|0.00|A|F|1995-02-10|1995-02-23|1995-02-19|TAKE BACK RETURN|AIR|ges boost sl +57217|264|65|5|37|43077.62|0.10|0.06|R|F|1995-03-18|1995-04-02|1995-03-25|NONE|REG AIR|refully ironic accounts above the +57217|883|50|6|23|41029.24|0.03|0.08|A|F|1995-02-28|1995-03-26|1995-03-26|COLLECT COD|AIR|al requests wake unusual sentiments. sil +57218|764|61|1|22|36624.72|0.06|0.07|N|O|1997-09-23|1997-08-12|1997-09-28|COLLECT COD|MAIL|ar requests alongside of the furious +57218|1866|53|2|36|63642.96|0.02|0.08|N|O|1997-06-23|1997-07-21|1997-06-26|DELIVER IN PERSON|FOB|hely alongside of the carefully reg +57219|1537|38|1|46|66172.38|0.01|0.05|N|O|1995-11-09|1995-12-02|1995-11-28|COLLECT COD|MAIL| bold deposits amo +57219|1197|98|2|45|49418.55|0.06|0.06|N|O|1995-12-19|1995-12-19|1995-12-21|TAKE BACK RETURN|MAIL|re quietly along the even sh +57220|1589|30|1|17|25339.86|0.07|0.05|N|O|1995-12-07|1995-10-06|1995-12-22|COLLECT COD|MAIL|ly silent requests are along the +57220|1057|28|2|7|6706.35|0.07|0.08|N|O|1996-01-01|1995-10-22|1996-01-24|TAKE BACK RETURN|TRUCK|gage slyly bold dep +57220|1226|64|3|43|48470.46|0.05|0.02|N|O|1995-12-29|1995-10-19|1995-12-31|TAKE BACK RETURN|AIR|ress asymptotes. finally regular asymptot +57221|1720|21|1|4|6486.88|0.09|0.00|N|O|1997-12-23|1998-01-27|1998-01-20|NONE|TRUCK|ly. furiously ironic deposits sl +57222|403|62|1|28|36495.20|0.09|0.00|N|O|1996-12-28|1996-12-29|1996-12-31|COLLECT COD|SHIP|structions. ironic warthogs to t +57222|1009|10|2|3|2730.00|0.04|0.02|N|O|1997-02-18|1996-12-16|1997-02-25|DELIVER IN PERSON|FOB| daring, regular instructions. +57222|61|87|3|6|5766.36|0.01|0.02|N|O|1997-02-02|1996-12-27|1997-02-12|NONE|FOB| blithely ironic packages nag. fina +57222|1674|16|4|15|23635.05|0.00|0.04|N|O|1996-12-26|1996-12-19|1997-01-18|DELIVER IN PERSON|RAIL|the final instructions integrate +57222|1950|39|5|10|18519.50|0.05|0.05|N|O|1997-03-11|1997-01-27|1997-04-04|DELIVER IN PERSON|SHIP|lyly furiously regular theodoli +57222|684|47|6|1|1584.68|0.03|0.07|N|O|1997-01-20|1996-12-23|1997-02-04|COLLECT COD|MAIL|fully regular packages are regular the +57222|708|73|7|13|20913.10|0.08|0.00|N|O|1997-01-10|1996-12-10|1997-02-06|NONE|SHIP|even packages-- carefully fin +57223|1515|36|1|30|42495.30|0.10|0.05|N|O|1996-01-17|1996-02-27|1996-01-18|COLLECT COD|FOB|: furiously regular packages above +57248|258|40|1|26|30114.50|0.03|0.02|R|F|1994-12-13|1995-01-10|1995-01-05|DELIVER IN PERSON|TRUCK|usly final theodolites wake. blithely +57248|226|27|2|18|20271.96|0.03|0.03|A|F|1994-11-15|1994-12-18|1994-12-13|COLLECT COD|AIR|are according to the platelets. reg +57249|1577|18|1|14|20699.98|0.03|0.07|A|F|1993-10-01|1993-08-21|1993-10-25|COLLECT COD|TRUCK|are deposits. theodolites nag. flu +57249|982|85|2|44|82851.12|0.02|0.01|A|F|1993-08-02|1993-10-10|1993-08-20|DELIVER IN PERSON|REG AIR|lly ironic pin +57249|1160|33|3|45|47752.20|0.02|0.08|A|F|1993-10-25|1993-08-26|1993-11-24|DELIVER IN PERSON|TRUCK|ts. theodolites poach slyly after +57249|1539|20|4|36|51859.08|0.10|0.08|A|F|1993-08-14|1993-08-26|1993-09-04|TAKE BACK RETURN|REG AIR|ructions integrat +57249|187|88|5|49|53271.82|0.02|0.01|R|F|1993-10-07|1993-09-22|1993-10-20|TAKE BACK RETURN|REG AIR|ld, final instructions impress +57249|314|71|6|22|26714.82|0.06|0.03|A|F|1993-10-18|1993-10-18|1993-11-12|COLLECT COD|SHIP|nusual, regular th +57249|842|42|7|5|8714.20|0.08|0.00|R|F|1993-08-17|1993-08-29|1993-09-09|NONE|SHIP|deas wake furiously after the silent accou +57250|709|74|1|18|28974.60|0.05|0.06|N|O|1996-01-24|1996-03-10|1996-02-20|NONE|FOB|ronic deposits are slyly. bravely ironic +57250|1454|33|2|30|40663.50|0.04|0.04|N|O|1996-03-05|1996-02-23|1996-03-09|TAKE BACK RETURN|AIR| the fluff +57250|1776|77|3|27|45299.79|0.00|0.05|N|O|1996-02-06|1996-03-21|1996-02-27|COLLECT COD|TRUCK|y bold packages integrate quickly un +57251|1741|42|1|28|45996.72|0.03|0.02|N|O|1996-05-04|1996-06-21|1996-05-31|TAKE BACK RETURN|REG AIR| regular packages. slyly regular packages n +57252|996|65|1|6|11381.94|0.02|0.06|N|O|1998-01-17|1997-12-19|1998-02-14|COLLECT COD|REG AIR|ts. slyly regul +57252|1504|5|2|33|46381.50|0.08|0.00|N|O|1997-12-27|1997-11-18|1997-12-30|NONE|MAIL|e ironic, even pac +57252|1399|38|3|5|6501.95|0.04|0.03|N|O|1997-12-20|1997-12-19|1998-01-17|NONE|AIR|slyly after the accounts: d +57252|1085|91|4|44|43387.52|0.00|0.07|N|O|1997-11-03|1997-12-24|1997-11-23|NONE|SHIP|y final deposits. furious +57252|1677|19|5|19|29994.73|0.06|0.00|N|O|1997-11-15|1997-12-26|1997-11-26|DELIVER IN PERSON|TRUCK|y. ironic platelets are carefully fluf +57252|1557|78|6|17|24795.35|0.06|0.07|N|O|1997-10-28|1997-12-19|1997-11-04|NONE|SHIP|y final pinto +57252|754|19|7|11|18202.25|0.08|0.05|N|O|1997-11-02|1997-11-21|1997-11-12|TAKE BACK RETURN|MAIL|gged requests sleep against the +57253|113|66|1|9|9117.99|0.05|0.07|R|F|1994-05-02|1994-03-01|1994-05-07|TAKE BACK RETURN|MAIL|olphins. slyly regular +57253|1146|83|2|8|8377.12|0.09|0.08|A|F|1994-02-06|1994-02-08|1994-02-18|COLLECT COD|REG AIR| final deposits are carefull +57253|651|83|3|24|37239.60|0.08|0.07|A|F|1994-04-21|1994-02-10|1994-05-20|COLLECT COD|AIR|g to the slyly final excuses. pinto beans +57253|171|24|4|23|24636.91|0.02|0.06|R|F|1994-01-19|1994-03-09|1994-01-20|TAKE BACK RETURN|REG AIR|special accounts against the carefully even +57253|528|19|5|38|54283.76|0.10|0.08|R|F|1994-01-25|1994-03-10|1994-02-24|TAKE BACK RETURN|SHIP|iously regular asymptotes inte +57253|945|14|6|31|57224.14|0.01|0.05|R|F|1994-03-29|1994-03-31|1994-04-15|NONE|REG AIR|lithely against the requests. slyly +57253|1826|27|7|45|77751.90|0.07|0.08|A|F|1994-02-28|1994-02-15|1994-03-22|NONE|AIR|usly final depe +57254|1676|18|1|19|29975.73|0.06|0.08|N|O|1998-05-04|1998-05-07|1998-05-16|COLLECT COD|AIR|ons. carefully regular excu +57254|820|21|2|26|44741.32|0.02|0.06|N|O|1998-05-03|1998-05-14|1998-05-30|TAKE BACK RETURN|RAIL|luffily. slyly ironic +57254|1473|13|3|43|59102.21|0.09|0.03|N|O|1998-04-12|1998-04-12|1998-04-24|DELIVER IN PERSON|AIR|courts boost boldly. furiously e +57254|1568|9|4|21|30860.76|0.04|0.07|N|O|1998-05-18|1998-04-23|1998-05-20|COLLECT COD|AIR| the carefully +57254|508|99|5|23|32395.50|0.05|0.06|N|O|1998-06-13|1998-05-05|1998-06-23|COLLECT COD|REG AIR|beans. slyly iro +57254|576|37|6|41|60539.37|0.02|0.04|N|O|1998-05-12|1998-05-05|1998-05-15|TAKE BACK RETURN|SHIP|its unwind bl +57254|181|82|7|9|9730.62|0.03|0.06|N|O|1998-03-14|1998-04-26|1998-04-06|DELIVER IN PERSON|FOB| furiously regular theodolites +57255|590|21|1|23|34283.57|0.07|0.02|N|O|1998-01-23|1997-12-12|1998-02-14|NONE|MAIL|furious accounts. fluff +57255|1293|68|2|4|4777.16|0.02|0.04|N|O|1998-01-24|1997-11-22|1998-02-07|TAKE BACK RETURN|AIR| carefully pending tithes cajole furio +57255|1648|49|3|29|44939.56|0.00|0.04|N|O|1997-10-31|1997-11-08|1997-11-17|NONE|RAIL|final requests +57255|1804|91|4|28|47762.40|0.01|0.03|N|O|1997-12-26|1997-11-17|1997-12-30|NONE|SHIP|e carefully across +57255|1375|52|5|25|31909.25|0.05|0.02|N|O|1997-11-11|1997-12-28|1997-11-24|NONE|AIR|aggle pinto b +57280|201|29|1|23|25327.60|0.10|0.01|R|F|1992-02-17|1992-04-21|1992-03-13|TAKE BACK RETURN|MAIL|ffily past the blithely unusual deposits. s +57280|1646|88|2|44|68096.16|0.03|0.08|R|F|1992-05-16|1992-03-18|1992-05-24|NONE|AIR|of the furio +57280|1383|98|3|31|39815.78|0.06|0.05|A|F|1992-04-23|1992-03-03|1992-05-02|COLLECT COD|TRUCK|the slyly final dependencies. never unu +57281|875|75|1|23|40845.01|0.04|0.03|R|F|1993-08-06|1993-05-25|1993-09-02|DELIVER IN PERSON|TRUCK|the sometimes ironic r +57281|1419|59|2|44|58098.04|0.07|0.08|R|F|1993-06-01|1993-05-29|1993-06-14|COLLECT COD|REG AIR|ly bold dep +57281|174|53|3|46|49411.82|0.07|0.03|A|F|1993-07-15|1993-06-10|1993-08-02|COLLECT COD|TRUCK| according to the ironic dolphins. b +57282|162|63|1|21|22305.36|0.04|0.03|N|O|1997-02-07|1997-03-06|1997-02-27|COLLECT COD|REG AIR|he even, special packages sleep after th +57282|1659|60|2|48|74911.20|0.00|0.00|N|O|1997-03-22|1997-01-29|1997-04-20|DELIVER IN PERSON|RAIL|n, pending packages doubt blithely. quick +57282|854|54|3|30|52645.50|0.05|0.01|N|O|1997-04-07|1997-03-15|1997-04-21|DELIVER IN PERSON|FOB|posits are +57283|1812|99|1|42|71980.02|0.09|0.01|R|F|1994-05-19|1994-05-02|1994-06-18|COLLECT COD|AIR|phins nag blithely dar +57283|1662|86|2|29|45346.14|0.02|0.01|R|F|1994-04-21|1994-05-12|1994-04-30|DELIVER IN PERSON|RAIL|regular accounts nag slyly. iron +57283|371|72|3|3|3814.11|0.10|0.01|R|F|1994-06-09|1994-05-13|1994-07-09|COLLECT COD|RAIL|ress, sly ideas. furiousl +57284|1441|81|1|45|60409.80|0.08|0.07|N|O|1997-12-02|1997-11-29|1997-12-21|COLLECT COD|AIR| the unusual packages. quickly reg +57284|487|75|2|26|36074.48|0.00|0.07|N|O|1997-11-20|1997-10-31|1997-12-15|DELIVER IN PERSON|AIR|ay about the sl +57284|127|80|3|25|25678.00|0.02|0.04|N|O|1997-09-11|1997-10-23|1997-09-28|COLLECT COD|REG AIR|leep fluff +57284|998|1|4|1|1898.99|0.00|0.05|N|O|1997-11-21|1997-10-31|1997-12-08|TAKE BACK RETURN|REG AIR| express excuses. fi +57284|1383|22|5|5|6421.90|0.01|0.08|N|O|1998-01-03|1997-11-23|1998-01-17|DELIVER IN PERSON|SHIP|ly regular packages wake furiously quickl +57285|1855|42|1|13|22839.05|0.00|0.05|N|O|1998-02-03|1998-04-28|1998-02-09|TAKE BACK RETURN|FOB|furiously ironic requests. b +57285|797|62|2|12|20373.48|0.04|0.08|N|O|1998-06-01|1998-04-17|1998-06-27|TAKE BACK RETURN|FOB| blithely furiously even ideas; carefully +57285|1310|25|3|6|7267.86|0.05|0.07|N|O|1998-02-01|1998-03-31|1998-02-23|TAKE BACK RETURN|RAIL|quests use furiously ove +57285|1544|45|4|23|33247.42|0.03|0.08|N|O|1998-04-05|1998-03-12|1998-05-03|NONE|SHIP|tect quickly. furiously fl +57285|752|17|5|41|67762.75|0.07|0.04|N|O|1998-03-27|1998-04-08|1998-04-17|NONE|AIR|according to +57285|1484|63|6|33|45720.84|0.01|0.03|N|O|1998-05-15|1998-03-20|1998-06-13|TAKE BACK RETURN|TRUCK|t the furiously even instructions! quickly +57286|1230|68|1|7|7918.61|0.06|0.08|N|O|1996-06-05|1996-04-16|1996-06-08|NONE|MAIL|e fluffily slyl +57287|373|30|1|18|22920.66|0.04|0.08|N|O|1995-12-24|1996-01-25|1996-01-05|TAKE BACK RETURN|FOB|l, pending fra +57287|466|54|2|1|1366.46|0.03|0.08|N|O|1995-12-27|1996-01-25|1996-01-10|NONE|RAIL|ckages use-- even, silent in +57287|1257|32|3|23|26639.75|0.07|0.07|N|O|1996-01-07|1995-12-11|1996-01-09|DELIVER IN PERSON|SHIP|fully special deposits sleep carefully acco +57312|509|10|1|43|60608.50|0.06|0.02|A|F|1993-10-10|1993-09-18|1993-11-05|TAKE BACK RETURN|RAIL|ns affix quickly unusual, even packages. s +57313|547|38|1|19|27503.26|0.10|0.03|N|O|1997-10-05|1997-08-06|1997-11-03|DELIVER IN PERSON|REG AIR|resias wake carefully beneath the sly +57313|923|92|2|14|25534.88|0.00|0.02|N|O|1997-06-27|1997-08-23|1997-07-23|COLLECT COD|RAIL|its hinder after the slyly spec +57313|925|28|3|49|89470.08|0.00|0.03|N|O|1997-07-31|1997-07-25|1997-08-27|COLLECT COD|AIR|ckages. carefully thin theodolites +57313|1331|32|4|1|1232.33|0.09|0.05|N|O|1997-09-09|1997-08-07|1997-09-28|NONE|SHIP|ly ironic dependencies. slyly spe +57314|1826|70|1|18|31100.76|0.07|0.06|A|F|1993-10-20|1994-01-08|1993-10-29|DELIVER IN PERSON|AIR|nt instructions. unusual requests a +57314|946|15|2|24|44326.56|0.02|0.02|A|F|1993-12-19|1993-11-25|1994-01-02|COLLECT COD|MAIL|inly ironi +57314|1359|98|3|29|36550.15|0.01|0.03|R|F|1994-01-11|1993-12-04|1994-01-16|COLLECT COD|MAIL|as sleep carefu +57314|135|88|4|48|49686.24|0.05|0.00|R|F|1994-02-05|1993-12-17|1994-02-18|DELIVER IN PERSON|REG AIR|ly bold deposits. d +57314|691|92|5|44|70034.36|0.05|0.07|A|F|1993-11-07|1993-11-30|1993-11-28|DELIVER IN PERSON|AIR|s. furiously special foxes cajole after t +57314|1167|4|6|6|6408.96|0.10|0.00|R|F|1993-10-25|1993-12-09|1993-11-08|DELIVER IN PERSON|MAIL|s affix slyly ex +57314|1796|97|7|38|64516.02|0.06|0.01|R|F|1994-01-20|1993-11-19|1994-02-03|COLLECT COD|REG AIR|sts use during the slyly stea +57315|1585|66|1|1|1486.58|0.06|0.04|A|F|1994-07-08|1994-07-22|1994-07-17|NONE|FOB|bold dependencie +57316|691|54|1|34|54117.46|0.03|0.03|N|O|1996-11-20|1996-12-17|1996-12-20|NONE|MAIL| excuses. caref +57316|932|35|2|26|47656.18|0.02|0.01|N|O|1997-01-03|1996-12-26|1997-01-27|COLLECT COD|RAIL|ecial, iron +57316|753|50|3|27|44651.25|0.06|0.02|N|O|1996-10-07|1996-10-28|1996-10-08|NONE|REG AIR|usual dependencies +57316|468|98|4|19|26000.74|0.05|0.02|N|O|1996-11-22|1996-11-29|1996-12-06|NONE|MAIL| deposits according to the furiously reg +57316|1450|51|5|26|35137.70|0.03|0.02|N|O|1996-12-22|1996-11-15|1997-01-14|TAKE BACK RETURN|MAIL|y theodolites. even +57317|260|15|1|21|24365.46|0.08|0.06|N|O|1996-01-20|1996-01-28|1996-02-14|DELIVER IN PERSON|RAIL|totes sleep fluffily blithely regular +57318|1473|52|1|45|61851.15|0.01|0.05|A|F|1993-04-15|1993-03-30|1993-04-20|COLLECT COD|TRUCK| ironic accounts. carefully ironic packag +57318|1829|59|2|31|53655.42|0.03|0.03|R|F|1993-04-02|1993-03-16|1993-04-23|NONE|AIR|ackages. quickly express pin +57318|1344|21|3|10|12453.40|0.04|0.03|R|F|1993-02-15|1993-04-10|1993-03-13|TAKE BACK RETURN|RAIL|ously unusual requests. furio +57318|772|69|4|1|1672.77|0.06|0.08|A|F|1993-02-11|1993-03-27|1993-03-01|TAKE BACK RETURN|AIR|asymptotes wake furiously. furiously +57318|1260|98|5|16|18580.16|0.08|0.03|R|F|1993-03-28|1993-03-22|1993-04-19|NONE|REG AIR|ounts: blithe accounts wake +57318|885|19|6|32|57148.16|0.08|0.04|A|F|1993-03-14|1993-03-06|1993-04-09|TAKE BACK RETURN|REG AIR|l, ruthless theodolites are fluffi +57318|1654|78|7|13|20223.45|0.08|0.05|A|F|1993-03-17|1993-03-07|1993-04-01|NONE|FOB|ly unusual accounts are +57319|750|51|1|31|51173.25|0.07|0.00|R|F|1992-12-26|1992-12-09|1993-01-14|TAKE BACK RETURN|SHIP|equests. sl +57319|1170|71|2|43|46060.31|0.08|0.00|A|F|1992-12-03|1992-12-23|1992-12-30|TAKE BACK RETURN|MAIL| regular, unusual instructions x-ray b +57319|1157|58|3|19|20104.85|0.06|0.02|R|F|1992-12-09|1992-12-01|1993-01-01|DELIVER IN PERSON|FOB|furiously special +57319|1467|85|4|47|64317.62|0.03|0.07|R|F|1992-12-08|1992-12-21|1992-12-26|TAKE BACK RETURN|SHIP|onic ideas. speci +57319|309|38|5|15|18139.50|0.10|0.06|A|F|1992-11-17|1992-12-26|1992-11-19|NONE|SHIP|ckages. express, fina +57344|1953|98|1|38|70488.10|0.09|0.07|R|F|1993-12-23|1993-10-30|1994-01-15|DELIVER IN PERSON|AIR|ly against the never regular +57344|199|26|2|1|1099.19|0.06|0.05|A|F|1993-10-22|1993-11-05|1993-10-26|COLLECT COD|RAIL|s cajole. final, final packages are. fl +57345|536|67|1|39|56024.67|0.10|0.07|N|O|1998-08-18|1998-09-08|1998-08-20|COLLECT COD|RAIL|efully. slyly regular +57345|616|79|2|30|45498.30|0.05|0.04|N|O|1998-10-16|1998-10-07|1998-10-25|COLLECT COD|MAIL| requests. final reque +57345|1574|75|3|15|22133.55|0.01|0.03|N|O|1998-11-04|1998-10-04|1998-11-30|DELIVER IN PERSON|MAIL|tegrate beyond the thin, even no +57345|1617|100|4|8|12148.88|0.07|0.02|N|O|1998-08-31|1998-08-23|1998-09-26|COLLECT COD|SHIP| bold accounts. furi +57346|1131|68|1|22|22706.86|0.08|0.05|R|F|1992-05-10|1992-04-16|1992-05-19|COLLECT COD|RAIL|ly even excuses are regula +57346|573|34|2|20|29471.40|0.10|0.06|A|F|1992-04-16|1992-03-13|1992-05-11|TAKE BACK RETURN|MAIL|haggle above the regular f +57347|562|53|1|30|43876.80|0.02|0.03|N|O|1997-03-13|1997-01-08|1997-03-19|DELIVER IN PERSON|TRUCK|slyly pending packages wake sl +57347|1011|82|2|22|20064.22|0.02|0.05|N|O|1997-01-11|1997-01-28|1997-01-30|NONE|FOB|ar instructions. bold ins +57347|926|27|3|43|78557.56|0.02|0.06|N|O|1997-01-14|1997-01-16|1997-02-08|COLLECT COD|SHIP|ously regular requests. +57347|1439|57|4|35|46915.05|0.06|0.03|N|O|1997-03-10|1997-03-02|1997-04-04|COLLECT COD|MAIL|s. slyly ironic packages alongside of +57348|1376|91|1|22|28102.14|0.03|0.02|A|F|1993-05-26|1993-05-10|1993-06-08|TAKE BACK RETURN|REG AIR|ake after the +57348|965|100|2|39|72772.44|0.03|0.06|A|F|1993-07-15|1993-06-02|1993-08-11|COLLECT COD|FOB|ake furiously unusual, fina +57349|732|65|1|25|40818.25|0.02|0.05|R|F|1992-04-13|1992-07-05|1992-04-28|TAKE BACK RETURN|SHIP|pinto beans. qui +57349|1939|28|2|46|84682.78|0.06|0.08|A|F|1992-06-13|1992-07-09|1992-07-08|COLLECT COD|MAIL|y even deposits wake along +57349|611|43|3|23|34767.03|0.01|0.02|R|F|1992-05-25|1992-05-12|1992-06-13|COLLECT COD|FOB|ld pearls nag. special requests wak +57350|1578|59|1|33|48825.81|0.05|0.04|N|O|1995-09-21|1995-06-25|1995-10-08|NONE|AIR|. ironic dugou +57350|1417|35|2|38|50099.58|0.07|0.01|N|O|1995-08-19|1995-07-09|1995-08-29|TAKE BACK RETURN|TRUCK|leep. carefully +57350|1145|82|3|36|37661.04|0.08|0.03|N|O|1995-08-26|1995-07-20|1995-09-06|DELIVER IN PERSON|AIR|. accounts wake fluffily accord +57350|1828|15|4|12|20757.84|0.00|0.01|N|O|1995-08-08|1995-08-15|1995-08-10|TAKE BACK RETURN|MAIL|final theodolites +57350|637|31|5|22|33827.86|0.07|0.03|N|O|1995-09-18|1995-07-23|1995-10-14|COLLECT COD|FOB|ld instructions. pinto beans +57350|168|21|6|44|46999.04|0.08|0.05|N|O|1995-09-15|1995-08-21|1995-10-09|NONE|RAIL|packages haggle regular asymptotes. +57350|1513|94|7|1|1414.51|0.10|0.02|N|O|1995-06-25|1995-08-09|1995-07-17|DELIVER IN PERSON|MAIL|g furiously even platelets. slyl +57351|1344|21|1|31|38605.54|0.02|0.04|N|O|1996-04-15|1996-02-16|1996-05-08|NONE|RAIL|mong the furiously regular requests ar +57376|1864|65|1|42|74166.12|0.04|0.07|N|O|1995-09-07|1995-07-21|1995-10-01|COLLECT COD|AIR|into the quickly s +57376|1836|80|2|50|86891.50|0.02|0.01|N|O|1995-09-26|1995-09-06|1995-09-30|DELIVER IN PERSON|TRUCK|nal packages: f +57376|1910|11|3|34|61604.94|0.03|0.06|N|O|1995-06-29|1995-09-07|1995-07-05|NONE|TRUCK|tes sleep even deposits. +57376|1070|76|4|10|9710.70|0.01|0.08|N|O|1995-09-02|1995-08-04|1995-09-19|DELIVER IN PERSON|REG AIR|lites must are. carefu +57376|1869|56|5|44|77917.84|0.00|0.02|N|O|1995-10-12|1995-08-01|1995-10-16|TAKE BACK RETURN|MAIL|he ironic pinto beans. fluffi +57376|1991|92|6|26|49217.74|0.08|0.07|N|O|1995-10-02|1995-08-20|1995-10-14|COLLECT COD|MAIL|iously final deposits. ironic accounts c +57376|1556|37|7|34|49556.70|0.08|0.04|N|O|1995-07-19|1995-08-07|1995-07-27|NONE|FOB|kly ironic ac +57377|1892|79|1|11|19732.79|0.05|0.02|N|O|1998-06-20|1998-06-23|1998-07-04|COLLECT COD|REG AIR|lyly regular excuses nea +57377|1936|69|2|36|66165.48|0.10|0.06|N|O|1998-06-11|1998-06-21|1998-07-06|TAKE BACK RETURN|RAIL| the blithely final Tiresias affix +57378|1012|48|1|46|41998.46|0.10|0.02|R|F|1995-04-29|1995-02-03|1995-05-17|NONE|TRUCK|deposits engage quickly at the pending, th +57378|116|17|2|26|26418.86|0.10|0.03|A|F|1995-03-30|1995-02-27|1995-04-17|NONE|AIR|yly ironic +57378|923|58|3|5|9119.60|0.00|0.05|R|F|1994-12-30|1995-02-22|1995-01-13|COLLECT COD|AIR|nic sentim +57379|355|84|1|10|12553.50|0.02|0.01|A|F|1994-06-18|1994-08-31|1994-06-25|NONE|AIR|y never regular foxes. slyly even +57379|1260|35|2|14|16257.64|0.10|0.01|R|F|1994-09-24|1994-07-30|1994-09-29|DELIVER IN PERSON|SHIP|ully unusua +57380|1842|29|1|33|57546.72|0.08|0.06|N|O|1996-01-05|1995-12-16|1996-01-13|COLLECT COD|SHIP| the asympto +57380|588|79|2|40|59543.20|0.08|0.07|N|O|1996-02-05|1996-01-18|1996-02-11|TAKE BACK RETURN|SHIP| quickly express theodolites x-ray; +57380|1969|70|3|42|78580.32|0.08|0.06|N|O|1996-02-08|1995-12-05|1996-02-10|COLLECT COD|SHIP|egular, special accou +57380|1842|43|4|3|5231.52|0.06|0.05|N|O|1996-01-10|1996-01-15|1996-01-12|TAKE BACK RETURN|TRUCK|ly final ideas are among the furio +57380|1183|92|5|34|36862.12|0.08|0.05|N|O|1996-01-28|1995-12-30|1996-02-05|NONE|RAIL|equests integrate +57381|586|47|1|42|62436.36|0.01|0.08|A|F|1994-11-08|1994-09-09|1994-11-26|COLLECT COD|RAIL|al instructions. even, express accounts +57381|326|55|2|40|49052.80|0.02|0.05|R|F|1994-12-04|1994-10-26|1994-12-26|NONE|SHIP|ong the fu +57381|1746|73|3|30|49432.20|0.00|0.00|R|F|1994-11-18|1994-10-27|1994-12-12|NONE|SHIP|o the ironic, final de +57381|1055|56|4|21|20077.05|0.04|0.01|R|F|1994-10-01|1994-11-02|1994-10-31|TAKE BACK RETURN|SHIP| ironic deposits hinder blithely regul +57382|1326|3|1|11|13500.52|0.10|0.02|R|F|1994-07-22|1994-06-16|1994-08-06|NONE|REG AIR|uriously special as +57382|1654|96|2|45|70004.25|0.07|0.02|R|F|1994-07-17|1994-05-03|1994-08-12|NONE|TRUCK|lly silent dolphins. sly +57382|329|86|3|41|50402.12|0.08|0.01|A|F|1994-05-16|1994-04-26|1994-05-29|DELIVER IN PERSON|SHIP|ing theodolit +57383|1611|94|1|49|74117.89|0.10|0.05|R|F|1994-02-22|1994-02-07|1994-03-05|TAKE BACK RETURN|MAIL|even decoys nag furiously bold pinto bea +57383|1216|17|2|5|5586.05|0.07|0.05|R|F|1993-12-09|1994-01-04|1994-01-08|NONE|AIR|quests above the asy +57383|1022|28|3|24|22152.48|0.03|0.00|R|F|1994-03-09|1993-12-14|1994-04-07|DELIVER IN PERSON|REG AIR|kindle busily even sheaves +57383|776|41|4|2|3353.54|0.01|0.01|A|F|1994-01-21|1994-01-07|1994-01-30|NONE|TRUCK| carefully pending pa +57383|739|4|5|47|77067.31|0.04|0.06|A|F|1994-02-17|1994-01-18|1994-03-02|NONE|TRUCK| quickly dogged account +57383|1691|92|6|2|3185.38|0.09|0.07|A|F|1994-02-27|1994-01-23|1994-03-10|DELIVER IN PERSON|RAIL|al pinto beans. special theodolite +57383|1759|44|7|48|79716.00|0.01|0.02|R|F|1994-01-06|1994-01-28|1994-01-29|NONE|AIR|s may doubt ideas +57408|345|2|1|33|41096.22|0.09|0.01|N|O|1997-03-24|1997-05-11|1997-03-29|COLLECT COD|FOB|haggle furiously express requests. +57408|576|67|2|11|16242.27|0.07|0.02|N|O|1997-06-02|1997-04-04|1997-06-19|DELIVER IN PERSON|TRUCK|e express instructions. blithely +57408|565|56|3|40|58622.40|0.02|0.05|N|O|1997-04-20|1997-04-22|1997-05-07|TAKE BACK RETURN|RAIL|unts. blithely unusual i +57408|623|24|4|45|68562.90|0.05|0.02|N|O|1997-05-01|1997-04-02|1997-05-18|COLLECT COD|SHIP|riously regular packages. fur +57409|164|65|1|43|45758.88|0.00|0.08|R|F|1995-01-02|1995-02-04|1995-01-17|COLLECT COD|AIR|ymptotes. carefully ironic depos +57409|1855|56|2|37|65003.45|0.08|0.05|A|F|1994-12-10|1995-01-08|1994-12-22|NONE|TRUCK| fluffily even, +57409|1308|85|3|2|2418.60|0.07|0.03|R|F|1995-03-09|1995-01-21|1995-03-19|COLLECT COD|SHIP| x-ray-- furiously special pa +57409|1951|84|4|44|81529.80|0.06|0.00|A|F|1994-12-24|1995-01-13|1994-12-28|COLLECT COD|TRUCK|. instructions +57410|1757|84|1|24|39810.00|0.10|0.05|N|O|1998-04-02|1998-04-17|1998-04-19|COLLECT COD|RAIL|d to nag. slyly even foxes h +57410|1139|48|2|47|48886.11|0.08|0.08|N|O|1998-01-28|1998-04-15|1998-02-02|TAKE BACK RETURN|SHIP|y ironic dinos. +57410|1078|84|3|8|7832.56|0.06|0.02|N|O|1998-03-08|1998-04-05|1998-03-22|TAKE BACK RETURN|TRUCK|press asymptotes past +57410|1748|49|4|22|36294.28|0.04|0.00|N|O|1998-04-06|1998-03-23|1998-04-10|COLLECT COD|FOB|r requests print slyly +57410|457|87|5|25|33936.25|0.02|0.00|N|O|1998-04-17|1998-02-24|1998-04-30|DELIVER IN PERSON|REG AIR|nts. packages wake. carefully expr +57410|1019|55|6|25|23000.25|0.10|0.02|N|O|1998-05-12|1998-02-18|1998-05-20|DELIVER IN PERSON|AIR| the pending, busy deposits. +57411|1139|40|1|37|38484.81|0.04|0.02|N|O|1998-06-18|1998-06-24|1998-07-03|COLLECT COD|AIR| pending, bold pinto +57411|795|60|2|21|35611.59|0.06|0.02|N|O|1998-07-09|1998-07-21|1998-07-19|NONE|SHIP|deas. carefully silent accounts across the +57412|1546|67|1|23|33293.42|0.09|0.04|R|F|1994-10-24|1994-10-12|1994-11-14|TAKE BACK RETURN|REG AIR|requests. slyly express packa +57413|1535|56|1|32|45968.96|0.05|0.08|N|O|1998-10-19|1998-08-25|1998-10-20|COLLECT COD|TRUCK|sly even deposits detect fluffil +57413|731|64|2|45|73427.85|0.01|0.06|N|O|1998-10-10|1998-08-21|1998-10-17|NONE|RAIL|kly special pinto bean +57413|1015|51|3|43|39388.43|0.02|0.01|N|O|1998-09-17|1998-09-03|1998-10-17|TAKE BACK RETURN|MAIL|y unusual warhorses could have to use idly +57414|80|81|1|11|10780.88|0.03|0.04|R|F|1992-09-16|1992-08-11|1992-10-03|COLLECT COD|SHIP|xpress instructions haggle blithely a +57414|96|97|2|33|32870.97|0.09|0.06|R|F|1992-07-12|1992-08-08|1992-07-25|TAKE BACK RETURN|TRUCK|fter the quickly final epitaphs. +57415|1053|59|1|47|44840.35|0.09|0.03|A|F|1994-06-12|1994-06-17|1994-07-11|TAKE BACK RETURN|RAIL|ular packages above th +57415|805|39|2|7|11940.60|0.10|0.00|R|F|1994-05-01|1994-05-12|1994-05-12|COLLECT COD|TRUCK|s haggle flu +57415|886|86|3|47|83983.36|0.04|0.05|A|F|1994-05-15|1994-05-12|1994-06-09|DELIVER IN PERSON|REG AIR| pains. bold, unusual ideas sle +57440|927|28|1|16|29246.72|0.06|0.08|A|F|1993-09-11|1993-09-06|1993-10-11|TAKE BACK RETURN|MAIL|fily express packages. b +57440|583|44|2|28|41540.24|0.10|0.08|R|F|1993-09-06|1993-10-13|1993-09-10|DELIVER IN PERSON|FOB|rding to the special, ironic requests +57441|1323|24|1|47|57543.04|0.03|0.01|N|O|1996-07-30|1996-07-25|1996-08-14|NONE|AIR|lar deposits was carefully carefull +57441|1608|50|2|32|48307.20|0.06|0.06|N|O|1996-09-14|1996-08-23|1996-10-04|TAKE BACK RETURN|TRUCK|e quickly even foxes was along the slyly ir +57441|1347|86|3|23|28711.82|0.05|0.06|N|O|1996-07-15|1996-08-30|1996-08-08|COLLECT COD|RAIL|ously even deposits are quick +57441|1431|10|4|47|62624.21|0.08|0.00|N|O|1996-07-14|1996-09-07|1996-07-29|COLLECT COD|TRUCK|xcuses do ha +57441|1613|55|5|33|49982.13|0.09|0.04|N|O|1996-09-23|1996-08-21|1996-10-06|DELIVER IN PERSON|TRUCK|furiously pending packages +57442|56|82|1|35|33461.75|0.07|0.02|N|O|1996-12-18|1996-12-19|1997-01-12|NONE|REG AIR|fully bold requests. carefully regul +57442|1989|90|2|2|3781.96|0.07|0.06|N|O|1996-11-10|1996-12-21|1996-12-03|NONE|MAIL|tions above the foxes cajole furious +57442|597|28|3|12|17971.08|0.05|0.03|N|O|1997-01-28|1997-01-01|1997-02-25|COLLECT COD|AIR|der carefully regular accounts! care +57442|1356|71|4|49|61610.15|0.04|0.04|N|O|1997-02-18|1996-12-01|1997-02-26|DELIVER IN PERSON|FOB|deposits. fluffy instructions mold am +57442|1848|35|5|40|69993.60|0.04|0.03|N|O|1996-12-29|1997-01-14|1997-01-09|TAKE BACK RETURN|FOB|stealthy pearls. theodolites among the slyl +57443|1830|17|1|23|39832.09|0.03|0.03|N|O|1998-03-29|1998-01-17|1998-04-25|COLLECT COD|SHIP|atelets solve. regular, bold depos +57443|357|86|2|30|37720.50|0.08|0.07|N|O|1998-03-03|1998-02-22|1998-03-16|DELIVER IN PERSON|FOB|final platelets wake. furiously +57443|1841|71|3|38|66227.92|0.02|0.05|N|O|1998-04-09|1998-03-08|1998-05-07|NONE|RAIL| furiously +57444|864|65|1|9|15883.74|0.04|0.06|N|O|1995-08-24|1995-07-17|1995-08-30|NONE|RAIL|st alongside of the sl +57444|1870|100|2|42|74418.54|0.03|0.04|N|O|1995-08-29|1995-07-16|1995-09-12|TAKE BACK RETURN|MAIL|cajole. furiously ironic th +57445|602|96|1|49|73627.40|0.09|0.08|R|F|1994-09-10|1994-09-24|1994-09-22|TAKE BACK RETURN|MAIL|lithely ironi +57445|514|5|2|48|67896.48|0.04|0.01|R|F|1994-09-20|1994-09-19|1994-10-18|TAKE BACK RETURN|RAIL|ts nag slyly express multipliers. +57445|752|53|3|23|38013.25|0.07|0.04|R|F|1994-10-15|1994-09-06|1994-10-31|NONE|MAIL|g accounts? express accounts cajole. quickl +57445|325|10|4|23|28182.36|0.09|0.02|A|F|1994-08-24|1994-10-08|1994-08-28|NONE|SHIP|ng to the courts. caref +57446|1544|45|1|39|56376.06|0.03|0.02|N|O|1998-01-31|1998-02-25|1998-02-18|TAKE BACK RETURN|AIR|quests. depos +57446|1804|48|2|24|40939.20|0.06|0.04|N|O|1998-01-16|1997-12-28|1998-01-20|NONE|TRUCK|ly ironic foxes. slyly regular accounts na +57446|1155|56|3|3|3168.45|0.00|0.05|N|O|1998-03-14|1998-02-10|1998-04-04|NONE|FOB|ages. regular requests cajole careful +57446|157|58|4|49|51800.35|0.09|0.06|N|O|1998-01-11|1998-01-08|1998-02-02|DELIVER IN PERSON|AIR|ess warhorse +57447|40|16|1|2|1880.08|0.08|0.02|N|O|1995-07-07|1995-09-15|1995-07-13|TAKE BACK RETURN|SHIP|ests. final no +57447|1840|84|2|30|52255.20|0.02|0.07|N|O|1995-10-04|1995-09-24|1995-10-15|NONE|MAIL|inal deposits d +57447|437|25|3|38|50822.34|0.04|0.07|N|O|1995-07-20|1995-08-10|1995-07-25|DELIVER IN PERSON|RAIL|elets sleep slyly. carefull +57447|247|75|4|15|17208.60|0.08|0.06|N|O|1995-08-31|1995-08-06|1995-09-03|TAKE BACK RETURN|TRUCK|ly even accounts sleep according to the bli +57447|1562|63|5|17|24880.52|0.08|0.05|N|O|1995-09-24|1995-08-14|1995-09-27|TAKE BACK RETURN|RAIL|l ideas solve furiously agai +57447|1095|1|6|39|38847.51|0.08|0.06|N|O|1995-09-28|1995-08-27|1995-10-22|COLLECT COD|REG AIR|rding to the +57472|1964|9|1|23|42917.08|0.01|0.00|N|O|1998-08-19|1998-10-06|1998-09-03|TAKE BACK RETURN|AIR|lyly silent packages. furiously final +57472|823|24|2|29|49990.78|0.04|0.01|N|O|1998-09-06|1998-08-19|1998-09-13|DELIVER IN PERSON|RAIL|y final theodolites ca +57472|1800|27|3|36|61264.80|0.07|0.06|N|O|1998-08-17|1998-10-10|1998-09-15|COLLECT COD|AIR|requests. always regular acc +57472|1188|97|4|39|42478.02|0.07|0.07|N|O|1998-09-01|1998-10-04|1998-09-19|DELIVER IN PERSON|SHIP|accounts s +57472|1842|43|5|10|17438.40|0.02|0.03|N|O|1998-09-04|1998-09-05|1998-10-03|DELIVER IN PERSON|MAIL|en instructions use. +57472|1855|56|6|26|45678.10|0.04|0.01|N|O|1998-07-18|1998-09-28|1998-08-03|DELIVER IN PERSON|TRUCK| furiously even +57473|126|5|1|37|37966.44|0.05|0.02|A|F|1992-06-08|1992-05-10|1992-07-04|COLLECT COD|REG AIR|riously pending pinto beans +57474|433|92|1|10|13334.30|0.07|0.08|N|O|1996-07-16|1996-07-05|1996-07-23|NONE|FOB|into beans. packages x-ray carefully ex +57474|612|6|2|27|40840.47|0.03|0.02|N|O|1996-08-16|1996-08-11|1996-09-06|DELIVER IN PERSON|FOB|sily final +57475|870|4|1|37|65522.19|0.08|0.01|A|F|1994-01-10|1993-12-13|1994-01-27|DELIVER IN PERSON|TRUCK|d fluffily. blithel +57475|1801|45|2|36|61300.80|0.08|0.08|A|F|1994-01-26|1993-11-25|1994-02-23|TAKE BACK RETURN|FOB|ach carefully against t +57475|474|33|3|30|41234.10|0.09|0.05|A|F|1994-01-25|1994-01-02|1994-02-09|TAKE BACK RETURN|AIR|efully after the slyly regular theodolites. +57475|1640|64|4|10|15416.40|0.04|0.01|A|F|1993-10-29|1993-11-12|1993-11-24|NONE|RAIL|, final dep +57475|1442|82|5|33|44333.52|0.09|0.07|A|F|1994-01-27|1993-12-24|1994-02-07|COLLECT COD|FOB|nside the regular, ironic patterns. +57475|1255|30|6|30|34687.50|0.04|0.01|R|F|1993-10-17|1993-11-30|1993-11-14|TAKE BACK RETURN|REG AIR|ronic packages along the thin, silent +57475|830|30|7|13|22500.79|0.10|0.04|R|F|1994-01-13|1993-11-08|1994-02-12|COLLECT COD|FOB|ideas are furiously special accounts. depos +57476|1439|79|1|15|20106.45|0.05|0.08|A|F|1994-05-03|1994-05-10|1994-05-09|DELIVER IN PERSON|TRUCK|across the carefully blithe theod +57476|1415|55|2|18|23695.38|0.10|0.06|R|F|1994-04-05|1994-05-13|1994-05-05|DELIVER IN PERSON|REG AIR|uriously regular theodolites. blithel +57476|1355|70|3|19|23870.65|0.10|0.07|R|F|1994-03-23|1994-06-04|1994-04-20|TAKE BACK RETURN|RAIL|riously even pi +57476|1928|73|4|12|21959.04|0.00|0.04|A|F|1994-04-25|1994-05-15|1994-05-23|DELIVER IN PERSON|SHIP|ckages haggle slyly. foxes accordin +57477|565|66|1|23|33707.88|0.04|0.03|A|F|1993-11-18|1993-11-07|1993-12-04|COLLECT COD|SHIP| carefully besides t +57477|463|64|2|8|10907.68|0.01|0.06|A|F|1994-01-15|1993-10-27|1994-02-03|NONE|SHIP|aggle slyly furio +57477|130|31|3|19|19572.47|0.09|0.05|A|F|1993-11-25|1993-12-14|1993-12-14|TAKE BACK RETURN|TRUCK|inal requests. regular r +57477|1500|79|4|50|70075.00|0.10|0.03|R|F|1993-11-25|1993-12-01|1993-11-29|TAKE BACK RETURN|SHIP|kly silent asym +57477|936|5|5|6|11021.58|0.08|0.08|A|F|1993-11-18|1993-12-14|1993-12-04|COLLECT COD|MAIL|gle fluffily regular courts. regular as +57477|42|93|6|37|34855.48|0.06|0.07|A|F|1994-01-13|1993-12-20|1994-01-20|NONE|REG AIR|ckages. express requests al +57478|329|58|1|43|52860.76|0.06|0.06|R|F|1994-01-06|1993-11-16|1994-01-29|DELIVER IN PERSON|RAIL|ic, express din +57478|1078|79|2|15|14686.05|0.02|0.06|A|F|1993-10-16|1993-11-09|1993-11-01|NONE|AIR|cording to the +57478|542|33|3|39|56259.06|0.01|0.05|R|F|1993-11-14|1993-11-07|1993-12-11|TAKE BACK RETURN|RAIL|ely even dolphins +57478|1723|66|4|33|53615.76|0.09|0.02|R|F|1993-10-11|1993-11-30|1993-10-16|DELIVER IN PERSON|TRUCK|totes sleep b +57478|1863|7|5|46|81183.56|0.10|0.02|R|F|1993-11-27|1993-12-26|1993-11-30|DELIVER IN PERSON|SHIP|ccounts sleep across the fluffily ir +57478|1488|67|6|2|2778.96|0.08|0.01|R|F|1994-02-01|1993-11-11|1994-03-03|COLLECT COD|REG AIR|eas sleep blithely quickly final foxes. +57479|1935|36|1|28|51434.04|0.01|0.00|N|O|1995-07-04|1995-05-19|1995-07-16|COLLECT COD|FOB|around the ironically +57479|1143|52|2|2|2088.28|0.05|0.01|A|F|1995-03-20|1995-05-26|1995-04-19|NONE|RAIL|ly blithely ironic id +57479|1246|21|3|11|12619.64|0.03|0.04|N|O|1995-06-23|1995-04-19|1995-07-12|COLLECT COD|MAIL| the carefully pendin +57504|472|73|1|39|53526.33|0.06|0.03|A|F|1994-10-18|1994-10-02|1994-11-10|TAKE BACK RETURN|TRUCK|hely. slyly even d +57504|1641|83|2|28|43193.92|0.01|0.07|R|F|1994-08-16|1994-10-07|1994-08-17|TAKE BACK RETURN|FOB|uests boost. quickly final requests boost q +57505|1072|43|1|42|40868.94|0.01|0.02|N|O|1997-02-04|1997-02-04|1997-02-28|NONE|MAIL|g to the fluffily expre +57505|629|61|2|36|55066.32|0.03|0.07|N|O|1997-02-12|1996-12-31|1997-03-12|COLLECT COD|MAIL|l requests are final accounts. regular, r +57505|925|60|3|31|56603.52|0.10|0.01|N|O|1996-11-28|1997-01-30|1996-12-13|DELIVER IN PERSON|TRUCK| blithely final foxes against the depen +57505|321|50|4|50|61066.00|0.05|0.02|N|O|1997-03-16|1997-01-11|1997-04-03|COLLECT COD|FOB|ding platelets along the carefull +57506|503|94|1|40|56140.00|0.08|0.03|A|F|1994-02-17|1994-04-03|1994-02-25|COLLECT COD|SHIP|te inside the even packages? quickly pendin +57506|1027|98|2|36|33408.72|0.06|0.02|A|F|1994-05-29|1994-04-02|1994-06-28|NONE|FOB|unts. even id +57506|1772|73|3|25|41844.25|0.04|0.00|A|F|1994-04-06|1994-05-05|1994-04-29|NONE|AIR|e the boldly careful requests. bravely re +57506|374|59|4|20|25487.40|0.10|0.08|R|F|1994-05-19|1994-05-08|1994-06-05|DELIVER IN PERSON|MAIL|nal theodolites. quickly regular re +57506|566|27|5|26|38130.56|0.09|0.03|A|F|1994-04-10|1994-05-02|1994-04-21|DELIVER IN PERSON|MAIL|y carefully pending asymptotes. quickl +57507|1379|94|1|25|32009.25|0.08|0.07|A|F|1994-10-07|1994-08-29|1994-11-03|TAKE BACK RETURN|RAIL| print slyly even dolphins. regu +57507|130|9|2|4|4120.52|0.10|0.08|R|F|1994-08-31|1994-09-04|1994-09-17|COLLECT COD|MAIL|ges. fluffily bold forges sleep flu +57507|1791|76|3|26|44012.54|0.04|0.08|R|F|1994-10-19|1994-09-04|1994-11-16|DELIVER IN PERSON|TRUCK| ironic deposits +57507|1625|67|4|19|29005.78|0.09|0.07|A|F|1994-07-03|1994-09-24|1994-08-01|NONE|MAIL|o beans. regular accounts impr +57507|787|88|5|37|62447.86|0.06|0.03|R|F|1994-07-10|1994-08-15|1994-07-16|DELIVER IN PERSON|TRUCK|beans since the furiously unu +57507|962|97|6|30|55888.80|0.01|0.07|A|F|1994-08-17|1994-08-15|1994-09-15|COLLECT COD|SHIP|egular deposits wa +57508|1059|30|1|45|43202.25|0.02|0.02|N|O|1997-02-06|1997-03-30|1997-03-06|TAKE BACK RETURN|MAIL|ular deposits. quickly +57508|1066|67|2|37|35781.22|0.10|0.05|N|O|1997-05-03|1997-03-14|1997-05-28|TAKE BACK RETURN|SHIP|accounts against the quickly regular foxes +57508|1572|73|3|7|10314.99|0.03|0.03|N|O|1997-01-31|1997-03-14|1997-02-13|NONE|FOB|refully ca +57508|72|48|4|15|14581.05|0.06|0.00|N|O|1997-02-10|1997-03-30|1997-02-21|COLLECT COD|MAIL|yly blithe foxes. bold courts integrate +57508|1315|92|5|26|31624.06|0.03|0.07|N|O|1997-01-25|1997-03-19|1997-02-23|DELIVER IN PERSON|AIR|g the blithely regular instructions. +57508|38|39|6|1|938.03|0.10|0.05|N|O|1997-03-14|1997-03-04|1997-04-02|DELIVER IN PERSON|RAIL|tes nag about the slyly reg +57508|1340|79|7|3|3724.02|0.04|0.00|N|O|1997-05-05|1997-02-12|1997-05-24|COLLECT COD|SHIP|y regular dep +57509|672|4|1|36|56616.12|0.07|0.03|A|F|1994-06-20|1994-04-12|1994-07-19|NONE|SHIP|ronic deposits are. accounts affix quic +57509|918|21|2|49|89126.59|0.10|0.00|A|F|1994-02-26|1994-05-15|1994-03-09|COLLECT COD|REG AIR| cajole ironic de +57509|1265|3|3|10|11662.60|0.04|0.08|A|F|1994-03-12|1994-03-29|1994-04-05|NONE|REG AIR|ven platelets sleep flu +57509|1882|26|4|21|37461.48|0.09|0.01|R|F|1994-06-07|1994-04-25|1994-06-10|DELIVER IN PERSON|MAIL|ges sleep furiously +57509|1996|41|5|43|81613.57|0.09|0.00|A|F|1994-04-01|1994-04-26|1994-04-30|DELIVER IN PERSON|AIR| notornis use according to the carefu +57510|1166|67|1|13|13873.08|0.10|0.03|N|O|1996-01-19|1996-02-04|1996-02-05|TAKE BACK RETURN|AIR|ges sleep car +57510|1427|45|2|1|1328.42|0.08|0.03|N|O|1996-04-04|1996-03-06|1996-04-13|COLLECT COD|AIR|ilent packa +57510|1610|34|3|37|55929.57|0.08|0.01|N|O|1996-04-03|1996-02-20|1996-04-11|COLLECT COD|TRUCK|ely even foxes affix slyly ab +57510|1846|90|4|15|26217.60|0.01|0.01|N|O|1996-02-23|1996-02-07|1996-03-05|TAKE BACK RETURN|MAIL|ording to the furiously quiet acc +57510|1110|19|5|21|21233.31|0.05|0.04|N|O|1996-01-05|1996-01-23|1996-01-15|DELIVER IN PERSON|AIR|quests slee +57511|1856|100|1|28|49219.80|0.01|0.07|R|F|1995-01-04|1994-12-22|1995-01-05|COLLECT COD|REG AIR|l dependencies wake +57511|852|52|2|22|38562.70|0.03|0.03|A|F|1994-10-31|1994-11-06|1994-11-21|COLLECT COD|TRUCK|uffily final platelets +57511|325|82|3|1|1225.32|0.09|0.06|R|F|1994-11-24|1994-12-04|1994-12-12|NONE|TRUCK| furiously pending foxe +57511|60|61|4|10|9600.60|0.07|0.08|R|F|1994-12-16|1994-11-25|1995-01-11|DELIVER IN PERSON|FOB|ld platelets wake s +57511|1930|75|5|10|18319.30|0.09|0.05|A|F|1995-02-03|1994-11-06|1995-02-23|TAKE BACK RETURN|FOB| pending pinto beans. furiously expres +57536|460|48|1|45|61220.70|0.05|0.05|R|F|1992-11-11|1992-12-02|1992-12-07|TAKE BACK RETURN|FOB|the final, regular courts was about the +57537|1376|15|1|45|57481.65|0.03|0.03|A|F|1993-01-02|1992-12-02|1993-01-09|COLLECT COD|SHIP| regular excuses +57537|50|76|2|40|38002.00|0.00|0.07|A|F|1993-01-08|1992-11-29|1993-02-02|DELIVER IN PERSON|FOB|refully regular +57537|996|99|3|39|73982.61|0.07|0.00|R|F|1992-12-19|1992-11-04|1992-12-29|TAKE BACK RETURN|TRUCK|ts along the enticingly special reques +57537|1080|51|4|38|37281.04|0.06|0.07|R|F|1992-12-21|1992-10-25|1993-01-18|COLLECT COD|AIR|into beans. carefully final dependencie +57537|267|49|5|50|58363.00|0.05|0.04|R|F|1992-09-26|1992-12-18|1992-10-09|TAKE BACK RETURN|RAIL|ep quickly +57537|1722|7|6|27|43840.44|0.08|0.04|A|F|1992-12-12|1992-12-01|1992-12-20|NONE|FOB|ounts breach carefully along the specia +57538|1459|60|1|32|43534.40|0.01|0.05|R|F|1993-03-21|1993-05-13|1993-04-13|DELIVER IN PERSON|TRUCK|egular packages. final accounts aft +57538|1052|58|2|32|30497.60|0.10|0.04|A|F|1993-05-25|1993-05-10|1993-05-30|NONE|REG AIR|posits: dolphins are daringly. f +57538|928|31|3|47|85959.24|0.09|0.01|R|F|1993-03-14|1993-05-13|1993-03-20|TAKE BACK RETURN|TRUCK|ncies integrate above the even, p +57538|1535|76|4|13|18674.89|0.07|0.04|R|F|1993-03-13|1993-04-13|1993-04-12|NONE|SHIP|ts. blithely bold pi +57538|1858|2|5|50|87992.50|0.04|0.08|A|F|1993-03-21|1993-05-21|1993-03-27|TAKE BACK RETURN|MAIL| sublate. slyly even deposits sleep +57538|770|3|6|45|75184.65|0.00|0.06|R|F|1993-04-07|1993-04-15|1993-04-22|COLLECT COD|FOB|heodolites. ironic, regular p +57539|89|65|1|28|27694.24|0.07|0.03|R|F|1992-04-06|1992-03-31|1992-05-04|COLLECT COD|RAIL|osits must have to slee +57539|1921|22|2|21|38281.32|0.07|0.07|R|F|1992-05-27|1992-03-24|1992-06-04|COLLECT COD|RAIL|the furiously even deposits +57540|1333|72|1|33|40732.89|0.05|0.01|R|F|1992-07-26|1992-08-11|1992-07-27|NONE|MAIL|s cajole carefully final accounts. quickly +57540|464|94|2|9|12280.14|0.06|0.03|R|F|1992-09-29|1992-09-23|1992-10-12|NONE|MAIL|silent orbits ha +57540|616|10|3|13|19715.93|0.08|0.01|R|F|1992-07-06|1992-08-16|1992-07-13|NONE|RAIL|cial instructions. carefully iron +57540|1096|97|4|44|43871.96|0.08|0.00|R|F|1992-07-16|1992-09-20|1992-08-13|NONE|REG AIR|special de +57540|1846|47|5|26|45443.84|0.02|0.06|A|F|1992-07-23|1992-08-15|1992-08-14|COLLECT COD|AIR|s-- even requests sleep. +57541|821|22|1|18|30992.76|0.05|0.03|A|F|1992-03-31|1992-04-24|1992-04-30|COLLECT COD|RAIL| ideas? pending theodolites promise +57542|639|40|1|35|53887.05|0.02|0.07|A|F|1994-11-06|1994-10-17|1994-11-16|DELIVER IN PERSON|REG AIR|riously even warthogs. quickly entic +57542|595|96|2|9|13460.31|0.09|0.06|A|F|1994-09-23|1994-09-22|1994-10-09|COLLECT COD|FOB|despite the slyly expre +57542|1650|51|3|40|62066.00|0.00|0.05|R|F|1994-12-13|1994-11-20|1995-01-02|NONE|SHIP|ns. regular, i +57542|1042|13|4|42|39607.68|0.09|0.08|A|F|1994-11-16|1994-10-04|1994-11-27|DELIVER IN PERSON|AIR|ecial ideas. furiously bold asymptotes u +57543|717|82|1|48|77650.08|0.01|0.03|A|F|1992-05-14|1992-07-30|1992-05-25|COLLECT COD|REG AIR|furiously ironic pinto beans. furio +57543|124|25|2|9|9217.08|0.04|0.00|A|F|1992-08-04|1992-08-09|1992-08-14|NONE|FOB|eodolites above the caref +57543|1435|75|3|30|40092.90|0.08|0.04|R|F|1992-07-30|1992-07-30|1992-08-09|NONE|RAIL|uests wake carefully. carefully silen +57543|1180|81|4|45|48653.10|0.03|0.02|R|F|1992-08-23|1992-07-22|1992-09-22|NONE|REG AIR|e. ironic pinto bea +57543|1472|51|5|47|64553.09|0.03|0.03|A|F|1992-08-13|1992-07-17|1992-08-24|COLLECT COD|MAIL|ly quiet pac +57543|918|53|6|2|3637.82|0.04|0.03|A|F|1992-07-24|1992-07-23|1992-07-25|NONE|TRUCK|arefully brave packages sleep a +57543|774|39|7|23|38519.71|0.08|0.02|A|F|1992-07-21|1992-08-10|1992-08-18|COLLECT COD|REG AIR|nt excuses maintain blithely. thinly s +57568|802|69|1|23|39164.40|0.08|0.04|A|F|1993-10-17|1993-07-21|1993-10-19|DELIVER IN PERSON|TRUCK| never final theodolites. +57568|1867|97|2|18|31839.48|0.10|0.04|A|F|1993-07-30|1993-07-20|1993-08-16|DELIVER IN PERSON|REG AIR|. idle requests detect furiously bold requ +57568|1611|53|3|37|55966.57|0.07|0.07|A|F|1993-09-06|1993-09-11|1993-09-12|NONE|TRUCK| deposits. pending acc +57568|233|88|4|36|40796.28|0.10|0.07|R|F|1993-06-25|1993-08-09|1993-06-30|TAKE BACK RETURN|SHIP| the slyly unus +57568|142|69|5|16|16674.24|0.04|0.02|R|F|1993-07-01|1993-09-05|1993-07-07|COLLECT COD|REG AIR|oze. carefully even courts cajol +57568|1242|80|6|25|28581.00|0.03|0.05|R|F|1993-10-07|1993-08-14|1993-10-13|TAKE BACK RETURN|TRUCK|egular theodolites haggle blithely above +57569|907|76|1|34|61468.60|0.05|0.06|N|O|1997-02-26|1997-02-01|1997-03-25|DELIVER IN PERSON|FOB|yly special pinto beans detect blithely +57569|1620|44|2|7|10651.34|0.03|0.03|N|O|1997-04-14|1997-03-01|1997-05-08|NONE|TRUCK|stealthy packages i +57569|1160|69|3|8|8489.28|0.00|0.03|N|O|1997-04-09|1997-03-06|1997-05-07|DELIVER IN PERSON|SHIP| quickly alongside of +57570|1123|96|1|42|43013.04|0.10|0.04|R|F|1992-12-04|1992-11-21|1992-12-10|NONE|AIR|inal grouches are within the dep +57570|298|80|2|37|44336.73|0.10|0.05|A|F|1992-12-07|1992-11-12|1992-12-25|DELIVER IN PERSON|AIR|nag fluffily about th +57570|1319|20|3|13|15864.03|0.00|0.01|R|F|1992-10-27|1992-11-02|1992-11-24|NONE|SHIP|xes. slyly ironic package +57570|1632|33|4|6|9201.78|0.06|0.06|R|F|1992-11-21|1992-12-15|1992-12-20|NONE|FOB|l requests a +57570|370|99|5|3|3811.11|0.09|0.01|A|F|1992-11-01|1992-12-11|1992-11-28|DELIVER IN PERSON|REG AIR|w accounts try to +57570|345|30|6|14|17434.76|0.08|0.07|A|F|1992-12-09|1992-11-19|1992-12-21|COLLECT COD|MAIL|ake quickly above the quickly e +57571|1123|32|1|49|50181.88|0.01|0.03|R|F|1993-07-31|1993-09-12|1993-08-26|COLLECT COD|MAIL|quickly unusual ideas detect furious +57572|1516|17|1|45|63787.95|0.00|0.00|N|O|1995-08-11|1995-08-22|1995-08-23|COLLECT COD|REG AIR|s depths. pinto beans us +57572|1834|21|2|48|83319.84|0.05|0.08|N|O|1995-08-01|1995-10-09|1995-08-09|NONE|FOB|cross the sly +57572|666|29|3|33|51699.78|0.05|0.07|N|O|1995-09-06|1995-09-11|1995-10-04|NONE|REG AIR|ns haggle furiously against th +57572|1446|47|4|26|35033.44|0.07|0.06|N|O|1995-07-16|1995-08-18|1995-07-19|COLLECT COD|AIR|g packages. ironic pinto beans solve +57572|1696|79|5|12|19172.28|0.08|0.06|N|O|1995-10-03|1995-09-16|1995-10-30|DELIVER IN PERSON|TRUCK|the fluffily regular the +57572|1345|22|6|29|36143.86|0.04|0.06|N|O|1995-09-13|1995-08-18|1995-09-16|NONE|FOB|e carefully unusual +57573|1137|38|1|29|30105.77|0.03|0.02|N|O|1998-04-20|1998-02-19|1998-05-05|NONE|RAIL|ven ideas impress quietly bli +57574|1269|7|1|48|56172.48|0.10|0.02|A|F|1992-11-22|1992-10-07|1992-12-06|DELIVER IN PERSON|SHIP|slyly unusual ideas. furiously ironic +57574|487|46|2|46|63824.08|0.00|0.02|R|F|1992-09-15|1992-09-16|1992-09-22|TAKE BACK RETURN|RAIL|le quickly among t +57574|446|76|3|11|14810.84|0.07|0.06|R|F|1992-10-19|1992-10-03|1992-11-04|NONE|REG AIR|o sleep from the final platelets. acc +57574|736|1|4|3|4910.19|0.06|0.05|R|F|1992-11-08|1992-09-14|1992-12-07|TAKE BACK RETURN|AIR| pinto beans. blithely express foxes cajo +57574|1101|38|5|5|5010.50|0.01|0.05|A|F|1992-10-28|1992-09-13|1992-11-22|DELIVER IN PERSON|REG AIR|dolites sleep after the bl +57575|191|92|1|36|39282.84|0.10|0.07|N|O|1997-04-23|1997-04-14|1997-05-18|COLLECT COD|REG AIR|blithely about the permanent theodo +57575|1302|3|2|34|40912.20|0.01|0.03|N|O|1997-04-10|1997-05-25|1997-05-04|NONE|FOB|ckly daring i +57575|61|12|3|23|22104.38|0.06|0.07|N|O|1997-04-05|1997-04-27|1997-04-25|TAKE BACK RETURN|REG AIR|ole express packages. fluffily ironic d +57575|1689|13|4|15|23860.20|0.07|0.07|N|O|1997-03-12|1997-05-06|1997-03-22|TAKE BACK RETURN|MAIL|gular ideas. slyly pend +57600|1214|26|1|30|33456.30|0.04|0.04|R|F|1992-12-25|1993-02-06|1993-01-18|NONE|TRUCK| the even packages +57600|1668|69|2|23|36102.18|0.03|0.08|A|F|1993-02-24|1993-01-31|1993-03-08|COLLECT COD|RAIL|pinto beans need to serv +57600|254|55|3|46|53095.50|0.00|0.02|A|F|1993-02-15|1992-12-20|1993-03-11|DELIVER IN PERSON|RAIL| haggle thi +57600|795|60|4|39|66135.81|0.06|0.06|R|F|1993-02-17|1992-12-21|1993-03-17|DELIVER IN PERSON|MAIL| requests snooze above +57600|416|4|5|7|9214.87|0.10|0.01|R|F|1993-01-09|1993-01-17|1993-01-24|COLLECT COD|REG AIR| regular depo +57601|3|29|1|37|33411.00|0.06|0.00|A|F|1993-11-13|1994-01-06|1993-11-20|DELIVER IN PERSON|MAIL|sts nag across the slyly express r +57602|937|38|1|5|9189.65|0.09|0.01|R|F|1992-08-05|1992-08-02|1992-08-18|TAKE BACK RETURN|TRUCK|st against the +57602|923|92|2|48|87548.16|0.04|0.06|A|F|1992-05-31|1992-06-17|1992-06-21|NONE|TRUCK|onic accounts sle +57602|752|85|3|6|9916.50|0.01|0.03|A|F|1992-07-16|1992-07-26|1992-07-17|TAKE BACK RETURN|FOB|carefully even excus +57603|1058|29|1|50|47952.50|0.02|0.08|N|O|1997-08-25|1997-09-20|1997-08-27|NONE|MAIL|eposits wake quickly final pinto beans. bli +57603|234|16|2|50|56711.50|0.01|0.05|N|O|1997-07-06|1997-09-17|1997-08-01|COLLECT COD|SHIP|even, regular deposits. requests must d +57604|1949|38|1|11|20360.34|0.05|0.00|N|O|1997-12-03|1997-10-13|1997-12-23|NONE|SHIP|g to the furiously express packages. slyl +57604|1604|46|2|6|9033.60|0.02|0.00|N|O|1997-10-20|1997-10-26|1997-10-26|NONE|REG AIR| packages use even +57605|1214|15|1|21|23419.41|0.08|0.04|R|F|1994-07-13|1994-07-21|1994-07-24|NONE|TRUCK|iously special pinto beans +57605|1748|75|2|5|8248.70|0.03|0.00|A|F|1994-08-09|1994-07-06|1994-08-30|TAKE BACK RETURN|TRUCK|final deposits. fluffily silent d +57605|1477|78|3|9|12406.23|0.02|0.05|A|F|1994-06-05|1994-08-12|1994-06-19|NONE|SHIP|ins; final, silent accoun +57606|11|12|1|22|20042.22|0.00|0.04|R|F|1993-01-17|1993-03-12|1993-01-26|COLLECT COD|RAIL|efully even requests are in place of +57606|1017|88|2|45|41310.45|0.00|0.04|A|F|1993-04-01|1993-03-05|1993-04-17|NONE|FOB|efully final instructions +57606|799|64|3|12|20397.48|0.05|0.08|A|F|1993-03-13|1993-02-28|1993-03-22|TAKE BACK RETURN|FOB|nic excuses maintain. fluffily bold theo +57607|95|21|1|39|38808.51|0.09|0.02|N|O|1996-07-11|1996-08-22|1996-08-10|COLLECT COD|MAIL|eas. regula +57632|1236|11|1|21|23881.83|0.04|0.08|N|O|1996-05-14|1996-06-19|1996-06-10|TAKE BACK RETURN|FOB|iously according to the carefully eve +57632|86|87|2|13|12819.04|0.06|0.07|N|O|1996-05-11|1996-05-23|1996-05-16|TAKE BACK RETURN|AIR|ites wake f +57632|1320|35|3|9|10991.88|0.08|0.08|N|O|1996-07-12|1996-07-02|1996-07-25|TAKE BACK RETURN|AIR|wake slyly ironic de +57633|586|47|1|23|34191.34|0.04|0.06|A|F|1995-03-26|1995-03-14|1995-04-07|COLLECT COD|AIR|riously silent theodolites +57633|100|1|2|43|43004.30|0.06|0.02|N|F|1995-05-23|1995-04-24|1995-06-18|NONE|TRUCK|ts haggle furiously fluffily special excuse +57633|751|16|3|37|61114.75|0.03|0.07|A|F|1995-06-07|1995-04-03|1995-06-13|NONE|RAIL|ic theodolites. regular excu +57634|704|5|1|31|49745.70|0.06|0.01|N|O|1998-03-14|1998-02-22|1998-03-29|TAKE BACK RETURN|TRUCK|r deposits. express, +57634|302|87|2|33|39675.90|0.04|0.05|N|O|1998-03-11|1998-02-01|1998-03-30|NONE|SHIP|usual deposits sleep quickly regular pinto +57634|1439|79|3|4|5361.72|0.06|0.06|N|O|1997-12-11|1998-01-28|1998-01-06|TAKE BACK RETURN|RAIL|lites. blithely +57635|1872|73|1|2|3547.74|0.06|0.01|N|O|1996-11-17|1997-01-29|1996-12-03|TAKE BACK RETURN|MAIL|ggedly bold platelets. ironic packages wa +57635|506|37|2|1|1406.50|0.06|0.04|N|O|1997-01-06|1997-01-05|1997-02-01|COLLECT COD|SHIP|y express tithes +57635|1211|23|3|16|17795.36|0.08|0.04|N|O|1997-01-19|1997-01-10|1997-01-31|TAKE BACK RETURN|SHIP|the, regular dependencies above the +57635|1731|58|4|36|58778.28|0.01|0.05|N|O|1996-12-13|1997-01-15|1996-12-23|NONE|MAIL|d braids. p +57635|1784|27|5|46|77545.88|0.07|0.03|N|O|1996-11-20|1996-12-30|1996-12-03|COLLECT COD|AIR| special excuses. regular deposits +57635|18|94|6|2|1836.02|0.01|0.03|N|O|1997-01-04|1997-01-04|1997-01-18|DELIVER IN PERSON|TRUCK|its above the furious +57636|758|59|1|20|33175.00|0.04|0.07|N|O|1998-07-21|1998-06-20|1998-08-01|COLLECT COD|AIR| slyly expres +57636|1047|83|2|38|36025.52|0.06|0.05|N|O|1998-05-24|1998-06-27|1998-06-20|COLLECT COD|TRUCK|its. carefully express packages +57636|1702|29|3|37|59336.90|0.06|0.01|N|O|1998-05-13|1998-06-21|1998-05-20|COLLECT COD|SHIP|ar, permanent packages about the sauterne +57636|791|24|4|4|6767.16|0.04|0.03|N|O|1998-06-06|1998-05-24|1998-06-18|COLLECT COD|RAIL|es wake carefully. stealthy i +57637|29|80|1|43|39947.86|0.04|0.07|N|O|1998-11-09|1998-10-01|1998-12-01|DELIVER IN PERSON|REG AIR|s. unusual, express packages hag +57638|196|23|1|23|25212.37|0.02|0.03|R|F|1992-06-01|1992-05-26|1992-06-13|TAKE BACK RETURN|RAIL|inal pinto beans boost. quickly regular fox +57638|1466|84|2|42|57433.32|0.03|0.07|R|F|1992-07-12|1992-07-02|1992-08-03|COLLECT COD|AIR|ng the furiously ironic accoun +57638|141|42|3|18|18740.52|0.06|0.01|R|F|1992-04-29|1992-06-03|1992-05-13|TAKE BACK RETURN|AIR|beans alongside of the regular ideas wake +57638|841|42|4|23|40062.32|0.00|0.02|A|F|1992-07-22|1992-06-29|1992-08-10|NONE|SHIP| across the bold platelets. unusual, pendi +57638|629|30|5|43|65773.66|0.10|0.06|A|F|1992-08-11|1992-05-31|1992-09-02|COLLECT COD|MAIL|accounts wake slyl +57638|1741|26|6|43|70637.82|0.09|0.07|R|F|1992-04-25|1992-06-30|1992-05-06|DELIVER IN PERSON|MAIL| use furiou +57638|1734|19|7|10|16357.30|0.01|0.07|R|F|1992-07-21|1992-07-19|1992-08-05|TAKE BACK RETURN|TRUCK|. instructions across t +57639|276|4|1|45|52932.15|0.02|0.06|R|F|1993-08-28|1993-09-03|1993-09-22|NONE|FOB|t furiously. quickly regular packages +57639|45|46|2|24|22680.96|0.00|0.03|R|F|1993-08-02|1993-09-07|1993-08-18|COLLECT COD|RAIL| x-ray slyly packages. carefully fin +57639|1584|5|3|17|25254.86|0.09|0.01|R|F|1993-07-25|1993-10-04|1993-08-12|COLLECT COD|REG AIR|tructions doubt blithe +57639|1794|95|4|10|16957.90|0.02|0.07|R|F|1993-11-09|1993-09-16|1993-11-12|COLLECT COD|REG AIR| silent ac +57639|610|73|5|17|25680.37|0.04|0.00|A|F|1993-10-16|1993-09-19|1993-11-08|TAKE BACK RETURN|TRUCK| slow platelets +57639|621|84|6|28|42605.36|0.03|0.00|R|F|1993-08-15|1993-10-15|1993-08-25|COLLECT COD|AIR|lites; carefully even pinto bean +57664|961|96|1|31|57720.76|0.02|0.02|R|F|1994-01-30|1994-02-25|1994-02-10|NONE|FOB|g pinto beans. special id +57664|55|6|2|4|3820.20|0.09|0.05|A|F|1993-12-19|1994-02-15|1994-01-13|NONE|MAIL|ver ironic instructi +57664|653|47|3|13|20197.45|0.05|0.03|R|F|1994-03-30|1994-02-20|1994-04-05|NONE|FOB|eas use. furiously final pinto bea +57664|64|40|4|20|19281.20|0.00|0.01|R|F|1994-01-13|1994-01-08|1994-02-06|TAKE BACK RETURN|MAIL|ackages. requests cajole blithely pending +57664|799|64|5|21|35695.59|0.07|0.07|A|F|1993-12-09|1993-12-29|1993-12-11|TAKE BACK RETURN|SHIP|en requests. slyly regular depos +57665|1895|96|1|4|7187.56|0.03|0.01|R|F|1992-05-06|1992-05-26|1992-05-12|NONE|MAIL|snooze furiously +57665|442|72|2|43|57724.92|0.04|0.00|A|F|1992-06-22|1992-06-18|1992-06-25|DELIVER IN PERSON|FOB|pecial, even packages wake quickly. careful +57666|857|57|1|4|7031.40|0.05|0.02|A|F|1994-07-13|1994-07-16|1994-07-18|NONE|RAIL|are deposits-- carefully regular +57666|525|26|2|13|18531.76|0.05|0.02|A|F|1994-08-29|1994-07-19|1994-08-30|DELIVER IN PERSON|SHIP|lyly quickly special d +57666|1176|85|3|14|15080.38|0.05|0.03|A|F|1994-06-17|1994-08-12|1994-06-28|TAKE BACK RETURN|MAIL|s boost. furiously ironi +57666|1868|69|4|49|86723.14|0.04|0.07|R|F|1994-07-26|1994-07-24|1994-08-24|COLLECT COD|AIR|ven, final foxes. furiously ironic asymp +57666|622|54|5|27|41110.74|0.09|0.08|A|F|1994-09-09|1994-07-20|1994-09-19|COLLECT COD|AIR|rs haggle fluffily. +57667|631|32|1|20|30632.60|0.00|0.04|N|O|1996-08-14|1996-08-05|1996-09-06|NONE|RAIL| furiously furiously final d +57667|437|96|2|32|42797.76|0.03|0.08|N|O|1996-07-17|1996-07-08|1996-08-04|DELIVER IN PERSON|AIR|l requests use slyly regular accounts. brav +57667|1158|59|3|2|2118.30|0.01|0.04|N|O|1996-05-28|1996-08-10|1996-06-18|COLLECT COD|FOB|ut the qui +57667|1306|83|4|34|41048.20|0.03|0.07|N|O|1996-08-18|1996-07-03|1996-09-03|DELIVER IN PERSON|MAIL|ng the furiou +57667|6|57|5|6|5436.00|0.07|0.01|N|O|1996-07-25|1996-07-06|1996-08-04|NONE|AIR|. dependencies sleep ca +57667|315|16|6|33|40105.23|0.06|0.02|N|O|1996-07-01|1996-08-16|1996-07-10|TAKE BACK RETURN|TRUCK|o beans. finally slow dependencies h +57667|1803|4|7|27|46029.60|0.09|0.04|N|O|1996-09-15|1996-08-02|1996-10-15|TAKE BACK RETURN|AIR|g deposits cajole; ironic deposits un +57668|1130|31|1|6|6186.78|0.07|0.08|R|F|1992-04-02|1992-05-16|1992-04-14|COLLECT COD|AIR|ependencies nag slyly. f +57668|139|66|2|33|34291.29|0.02|0.08|A|F|1992-05-05|1992-05-01|1992-06-01|TAKE BACK RETURN|TRUCK|ithely. daringly even instructions affix f +57668|277|5|3|8|9418.16|0.01|0.06|A|F|1992-03-18|1992-05-06|1992-04-02|TAKE BACK RETURN|TRUCK| regular, unusual tithe +57669|1060|31|1|2|1922.12|0.03|0.03|R|F|1993-10-18|1993-11-03|1993-10-19|DELIVER IN PERSON|TRUCK|nal packages cajole +57669|1936|37|2|39|71679.27|0.07|0.00|R|F|1993-08-22|1993-10-30|1993-08-30|DELIVER IN PERSON|RAIL|into beans. sl +57669|1081|87|3|29|28480.32|0.10|0.05|A|F|1993-08-14|1993-10-27|1993-09-10|COLLECT COD|TRUCK| requests! fluffily fina +57669|1090|96|4|21|20812.89|0.00|0.06|A|F|1993-11-29|1993-10-29|1993-12-19|NONE|RAIL| was slyly blithely regular depos +57670|716|17|1|30|48501.30|0.08|0.06|R|F|1993-11-01|1993-12-28|1993-11-11|COLLECT COD|MAIL|ding packages. accounts wit +57670|1279|17|2|43|50751.61|0.05|0.05|A|F|1993-12-04|1994-01-01|1993-12-19|TAKE BACK RETURN|TRUCK|the express th +57670|758|59|3|14|23222.50|0.10|0.04|A|F|1993-10-16|1993-12-31|1993-11-14|DELIVER IN PERSON|FOB| requests haggle slyly aft +57670|1525|66|4|44|62766.88|0.04|0.08|R|F|1993-12-28|1993-12-08|1994-01-13|TAKE BACK RETURN|FOB|l packages cajole alongside o +57671|326|11|1|25|30658.00|0.06|0.03|A|F|1992-11-21|1993-01-05|1992-12-01|COLLECT COD|SHIP|arefully pending packages about the ironic +57671|940|43|2|34|62591.96|0.02|0.05|R|F|1993-02-05|1993-01-09|1993-03-03|TAKE BACK RETURN|REG AIR|y regular packag +57671|1433|51|3|43|57380.49|0.05|0.01|R|F|1993-01-06|1992-12-14|1993-01-15|COLLECT COD|FOB|ounts doze slyly +57671|686|49|4|22|34906.96|0.01|0.07|A|F|1993-01-05|1992-12-30|1993-01-16|DELIVER IN PERSON|SHIP|iously even accoun +57671|909|12|5|8|14479.20|0.10|0.06|A|F|1992-12-13|1993-01-04|1992-12-23|DELIVER IN PERSON|AIR|ithely pending theodolites. +57671|1915|48|6|39|70859.49|0.02|0.00|A|F|1993-01-06|1993-01-17|1993-01-23|TAKE BACK RETURN|RAIL|press accounts integrate against th +57696|1936|37|1|8|14703.44|0.05|0.04|N|O|1997-03-04|1997-04-14|1997-03-15|NONE|SHIP|le alongside of the careful +57696|484|85|2|25|34612.00|0.03|0.03|N|O|1997-03-06|1997-04-22|1997-03-21|DELIVER IN PERSON|RAIL|ss ideas cajo +57696|1305|20|3|38|45839.40|0.09|0.08|N|O|1997-03-27|1997-03-18|1997-04-08|DELIVER IN PERSON|MAIL| beans. even deposits at the iron +57696|1686|10|4|49|77796.32|0.06|0.07|N|O|1997-05-04|1997-03-28|1997-05-11|DELIVER IN PERSON|RAIL|de of the fluffily express asymptotes +57696|252|7|5|18|20740.50|0.03|0.06|N|O|1997-06-08|1997-05-13|1997-07-05|TAKE BACK RETURN|REG AIR|oggedly slyly final foxes. carefull +57696|1283|95|6|39|46186.92|0.10|0.06|N|O|1997-04-06|1997-03-30|1997-05-02|TAKE BACK RETURN|RAIL|sts nag against the special requests. f +57697|1071|42|1|24|23329.68|0.02|0.02|R|F|1995-03-01|1995-04-11|1995-03-14|NONE|SHIP|nding excuses doze. carefully regular +57697|1674|98|2|20|31513.40|0.04|0.07|R|F|1995-05-25|1995-04-16|1995-05-31|TAKE BACK RETURN|SHIP|al theodolites. sl +57697|481|69|3|26|35918.48|0.08|0.02|A|F|1995-03-12|1995-04-20|1995-03-29|DELIVER IN PERSON|TRUCK|yly before the special, +57697|1146|83|4|48|50262.72|0.01|0.01|R|F|1995-05-05|1995-03-18|1995-05-07|DELIVER IN PERSON|FOB|each. unusual, regular instructions pro +57697|1679|21|5|28|44258.76|0.09|0.02|A|F|1995-05-31|1995-04-18|1995-06-06|DELIVER IN PERSON|SHIP|uickly among the unusua +57697|224|79|6|30|33726.60|0.07|0.02|R|F|1995-03-13|1995-03-29|1995-04-05|TAKE BACK RETURN|TRUCK| blithely slyly even courts. dependen +57697|125|4|7|2|2050.24|0.10|0.08|R|F|1995-05-16|1995-04-24|1995-06-08|TAKE BACK RETURN|AIR|y about the closely bold packages. thinly f +57698|1664|88|1|17|26616.22|0.10|0.07|R|F|1992-05-03|1992-03-01|1992-06-02|DELIVER IN PERSON|SHIP| alongside of the slyly f +57698|1560|1|2|40|58462.40|0.03|0.00|R|F|1992-04-04|1992-03-27|1992-04-21|DELIVER IN PERSON|MAIL|special excuses. furi +57698|1818|19|3|1|1719.81|0.03|0.01|A|F|1992-03-17|1992-02-19|1992-04-09|TAKE BACK RETURN|FOB|wake quickly. furiousl +57698|1128|1|4|31|31902.72|0.05|0.07|R|F|1992-03-09|1992-03-03|1992-03-25|DELIVER IN PERSON|TRUCK| final requ +57698|774|39|5|44|73689.88|0.06|0.05|R|F|1992-01-11|1992-03-30|1992-02-10|COLLECT COD|AIR|ests cajole bli +57699|471|1|1|39|53487.33|0.05|0.00|A|F|1993-03-12|1992-12-11|1993-03-21|COLLECT COD|TRUCK| sleep against t +57699|1933|34|2|45|82571.85|0.01|0.07|R|F|1993-01-10|1992-12-25|1993-02-02|COLLECT COD|REG AIR|aggle fluffily slyly even theodolites. +57699|1517|58|3|30|42555.30|0.03|0.03|A|F|1992-11-13|1992-12-13|1992-11-24|DELIVER IN PERSON|FOB|excuses use along the bravely ironic p +57699|1330|31|4|42|51715.86|0.06|0.07|R|F|1992-11-17|1993-01-23|1992-12-02|COLLECT COD|RAIL|ckly regular +57699|289|44|5|40|47571.20|0.08|0.01|A|F|1992-12-15|1993-02-02|1993-01-06|DELIVER IN PERSON|AIR|ccounts above the deposits wake +57699|750|15|6|22|36316.50|0.03|0.04|R|F|1993-01-03|1993-01-01|1993-01-27|DELIVER IN PERSON|FOB|egular theodolites +57699|1999|44|7|32|60831.68|0.00|0.03|R|F|1993-03-04|1993-01-22|1993-03-28|COLLECT COD|REG AIR|sits across the furiously ironic +57700|1941|86|1|16|29487.04|0.02|0.02|N|O|1996-02-16|1996-01-12|1996-03-12|COLLECT COD|MAIL|ounts. blithely ev +57700|101|28|2|50|50055.00|0.05|0.05|N|O|1996-01-26|1996-02-07|1996-02-10|COLLECT COD|FOB|he unusual pearls. blithely special gifts +57701|1437|77|1|35|46845.05|0.08|0.02|N|O|1996-10-03|1996-08-14|1996-11-01|TAKE BACK RETURN|AIR|ly final accounts +57701|41|92|2|25|23526.00|0.04|0.02|N|O|1996-10-12|1996-07-29|1996-10-15|TAKE BACK RETURN|TRUCK|quickly bold deposits. foxes among the sil +57701|1326|65|3|29|35592.28|0.02|0.07|N|O|1996-07-06|1996-09-18|1996-07-27|TAKE BACK RETURN|RAIL|uickly express platelets are f +57701|1599|40|4|25|37514.75|0.00|0.02|N|O|1996-06-30|1996-09-10|1996-07-08|DELIVER IN PERSON|AIR| to the slyly fin +57701|1229|4|5|44|49729.68|0.00|0.04|N|O|1996-10-01|1996-08-29|1996-10-31|NONE|TRUCK|ing requests. patt +57701|1364|65|6|32|40491.52|0.02|0.07|N|O|1996-07-30|1996-08-18|1996-08-21|COLLECT COD|MAIL|s are regular theodolites. ca +57701|1106|7|7|32|32227.20|0.06|0.00|N|O|1996-09-20|1996-08-28|1996-10-04|TAKE BACK RETURN|MAIL| packages c +57702|580|71|1|38|56262.04|0.09|0.01|N|O|1996-10-18|1997-01-01|1996-11-09|NONE|REG AIR|nal reques +57702|1148|49|2|17|17835.38|0.08|0.06|N|O|1996-10-19|1996-12-25|1996-11-07|DELIVER IN PERSON|AIR| special r +57702|1212|87|3|35|38962.35|0.04|0.00|N|O|1996-12-02|1996-11-22|1996-12-08|NONE|FOB|into beans around the +57702|1319|58|4|39|47592.09|0.10|0.01|N|O|1997-01-28|1996-12-18|1997-02-23|TAKE BACK RETURN|SHIP|odolites affix quickly above the furious +57702|1375|52|5|18|22974.66|0.02|0.01|N|O|1996-10-18|1996-11-27|1996-11-12|DELIVER IN PERSON|FOB|nstructions along t +57702|1135|44|6|31|32120.03|0.01|0.04|N|O|1996-12-15|1997-01-06|1997-01-04|DELIVER IN PERSON|FOB|its. final, silent pack +57703|153|32|1|22|23169.30|0.05|0.01|A|F|1994-04-01|1994-03-31|1994-04-06|COLLECT COD|RAIL|quests dazzle. +57703|117|44|2|23|23393.53|0.02|0.05|R|F|1994-05-17|1994-04-29|1994-05-28|TAKE BACK RETURN|MAIL|eposits boost along the q +57728|1278|53|1|46|54246.42|0.10|0.04|N|O|1996-10-09|1996-08-11|1996-10-19|COLLECT COD|FOB|uickly even packages are fu +57729|1185|22|1|16|17378.88|0.00|0.04|N|O|1996-06-28|1996-07-07|1996-06-30|TAKE BACK RETURN|TRUCK|uriously final instructions: final +57729|830|97|2|20|34616.60|0.07|0.03|N|O|1996-06-24|1996-06-23|1996-07-07|DELIVER IN PERSON|TRUCK|e quickly slyly slow instr +57729|980|83|3|4|7523.92|0.03|0.08|N|O|1996-08-09|1996-06-27|1996-08-30|COLLECT COD|MAIL|ggle furio +57730|773|74|1|23|38496.71|0.06|0.07|N|O|1998-05-27|1998-05-04|1998-05-31|NONE|SHIP|sly express sentiments. blithely fi +57730|63|64|2|45|43337.70|0.02|0.03|N|O|1998-05-04|1998-05-01|1998-05-09|DELIVER IN PERSON|FOB|eaves. slow, unusual fo +57730|1996|85|3|5|9489.95|0.03|0.00|N|O|1998-03-25|1998-05-09|1998-04-05|TAKE BACK RETURN|AIR| the bold +57730|1525|46|4|1|1426.52|0.07|0.01|N|O|1998-05-16|1998-04-22|1998-06-02|COLLECT COD|REG AIR|ound the requests sleep furiously final d +57731|1197|98|1|48|52713.12|0.02|0.05|N|O|1997-02-23|1997-02-13|1997-03-18|TAKE BACK RETURN|SHIP|gular ideas nag carefully agains +57731|1273|85|2|48|56364.96|0.09|0.04|N|O|1997-04-19|1997-01-28|1997-05-05|TAKE BACK RETURN|FOB|symptotes. car +57731|632|26|3|9|13793.67|0.00|0.07|N|O|1997-02-09|1997-02-07|1997-02-10|COLLECT COD|RAIL| deposits +57731|1518|39|4|2|2839.02|0.04|0.00|N|O|1997-02-23|1997-02-05|1997-03-21|NONE|FOB|regular patt +57731|1595|36|5|35|52380.65|0.02|0.07|N|O|1997-02-16|1997-03-16|1997-03-18|TAKE BACK RETURN|FOB| along the ironic pains slee +57731|1962|63|6|36|67102.56|0.00|0.04|N|O|1997-01-13|1997-03-12|1997-02-10|NONE|MAIL|es. daring requests wake +57732|1124|25|1|36|36904.32|0.00|0.04|N|O|1996-06-12|1996-06-13|1996-06-22|NONE|SHIP|uickly regular requests solve furious +57732|273|1|2|31|36371.37|0.01|0.06|N|O|1996-04-25|1996-06-11|1996-05-10|NONE|RAIL|e special theodolites +57732|148|1|3|3|3144.42|0.00|0.03|N|O|1996-05-30|1996-06-12|1996-06-06|COLLECT COD|TRUCK|usual instruc +57732|717|50|4|17|27501.07|0.04|0.03|N|O|1996-05-17|1996-07-07|1996-06-08|NONE|TRUCK|egular accounts after the slyly ironic ide +57732|980|83|5|11|20690.78|0.10|0.05|N|O|1996-06-30|1996-07-07|1996-07-12|DELIVER IN PERSON|AIR|l requests. slyly unusual +57732|100|51|6|35|35003.50|0.09|0.07|N|O|1996-05-04|1996-05-31|1996-06-01|TAKE BACK RETURN|TRUCK|. carefully pending theodolites wake +57733|740|73|1|7|11485.18|0.03|0.00|N|O|1998-03-14|1998-05-15|1998-03-19|TAKE BACK RETURN|MAIL|accounts. furiously +57733|1814|1|2|50|85790.50|0.01|0.08|N|O|1998-03-17|1998-05-24|1998-03-26|DELIVER IN PERSON|TRUCK|r the fluffily final depths wake fluffily +57734|1584|85|1|35|51995.30|0.09|0.05|R|F|1994-11-22|1994-10-27|1994-12-20|DELIVER IN PERSON|REG AIR|taphs. ironic epitaphs abo +57734|354|11|2|28|35121.80|0.03|0.02|R|F|1994-12-04|1994-11-23|1994-12-27|NONE|RAIL|platelets boost according to the flu +57734|1622|5|3|42|63992.04|0.02|0.06|A|F|1994-10-01|1994-11-20|1994-10-17|TAKE BACK RETURN|TRUCK| detect furiously +57734|409|68|4|13|17022.20|0.03|0.02|R|F|1994-10-10|1994-12-12|1994-10-28|DELIVER IN PERSON|SHIP|lyly regular requests. ironic, r +57734|1985|18|5|41|77366.18|0.07|0.01|A|F|1994-12-05|1994-10-22|1994-12-22|COLLECT COD|FOB|unusual asymptotes. bo +57734|879|46|6|8|14238.96|0.06|0.02|R|F|1995-01-02|1994-10-21|1995-01-10|TAKE BACK RETURN|SHIP|to the pending foxes-- blithely regular i +57735|1160|69|1|9|9550.44|0.09|0.02|A|F|1992-08-16|1992-07-10|1992-08-23|TAKE BACK RETURN|SHIP|cross the slyly bold deposits. requests gr +57735|916|51|2|21|38155.11|0.04|0.01|A|F|1992-08-29|1992-07-15|1992-09-13|NONE|FOB|ly bold platelets are bl +57735|840|40|3|43|74856.12|0.08|0.05|R|F|1992-05-08|1992-07-23|1992-05-19|TAKE BACK RETURN|AIR|ding to the furiously regular reques +57735|1425|43|4|47|62341.74|0.09|0.00|A|F|1992-08-08|1992-07-10|1992-08-10|DELIVER IN PERSON|SHIP| carefully. blithely regular in +57735|408|9|5|14|18317.60|0.04|0.05|R|F|1992-07-28|1992-06-22|1992-08-18|TAKE BACK RETURN|FOB|ounts sleep quickly bl +57735|1252|53|6|50|57662.50|0.08|0.06|R|F|1992-08-20|1992-06-27|1992-09-03|NONE|AIR|uses. quickly silent pi +57760|53|29|1|45|42887.25|0.05|0.05|N|O|1995-07-30|1995-09-05|1995-08-06|COLLECT COD|SHIP|into the fu +57760|764|29|2|16|26636.16|0.03|0.03|N|O|1995-11-09|1995-08-17|1995-11-28|NONE|SHIP|ons use blithely alongside of the attai +57760|290|45|3|39|46421.31|0.06|0.05|N|O|1995-10-22|1995-09-03|1995-11-10|DELIVER IN PERSON|SHIP|pinto bean +57760|768|69|4|1|1668.76|0.09|0.04|N|O|1995-10-24|1995-09-09|1995-11-02|NONE|MAIL| foxes. furiously regular a +57761|974|9|1|46|86248.62|0.03|0.05|R|F|1994-10-09|1994-10-27|1994-11-06|TAKE BACK RETURN|MAIL|ate blithel +57762|1202|77|1|1|1103.20|0.10|0.06|R|F|1994-12-10|1995-01-16|1995-01-06|DELIVER IN PERSON|AIR|s detect. slyly ironic depo +57762|887|88|2|24|42909.12|0.00|0.04|A|F|1994-12-31|1995-02-06|1995-01-22|DELIVER IN PERSON|MAIL|al deposit +57762|804|38|3|39|66487.20|0.05|0.06|A|F|1995-01-15|1994-12-31|1995-01-18|NONE|AIR|ly into the slyly unusual tithes. silen +57762|1667|9|4|47|73727.02|0.04|0.02|R|F|1994-12-22|1995-01-21|1994-12-30|TAKE BACK RETURN|SHIP| slyly alongside of the +57762|1818|19|5|35|60193.35|0.04|0.00|R|F|1994-12-16|1995-01-19|1994-12-30|NONE|FOB|ithely ironic requests do wake ironic +57762|1531|52|6|30|42975.90|0.07|0.06|A|F|1995-01-04|1995-02-11|1995-01-10|NONE|MAIL|oost across the pending depos +57763|690|84|1|16|25451.04|0.01|0.07|N|O|1997-02-28|1996-12-24|1997-03-30|COLLECT COD|TRUCK|ckages. slyly silent +57763|442|1|2|12|16109.28|0.05|0.00|N|O|1996-12-10|1996-12-25|1996-12-13|TAKE BACK RETURN|SHIP|ar requests: un +57763|782|47|3|10|16827.80|0.02|0.00|N|O|1996-11-30|1997-01-23|1996-12-02|COLLECT COD|REG AIR|ctions are carefully. furiously final +57763|227|82|4|29|32689.38|0.07|0.00|N|O|1997-03-01|1997-01-10|1997-03-16|NONE|RAIL|y express instruction +57763|754|55|5|15|24821.25|0.06|0.00|N|O|1997-02-12|1996-12-17|1997-03-07|NONE|SHIP|inal, pending asymptotes nag car +57764|1943|76|1|26|47968.44|0.00|0.02|N|O|1997-03-12|1997-01-14|1997-04-08|NONE|TRUCK|ckages-- quickly regular notornis hinder ac +57764|1846|47|2|21|36704.64|0.08|0.00|N|O|1997-02-23|1997-02-10|1997-03-22|NONE|FOB|nal instructions s +57764|816|50|3|41|70389.21|0.08|0.04|N|O|1997-02-11|1997-02-17|1997-02-16|NONE|TRUCK|elets. regul +57764|1335|36|4|22|27199.26|0.10|0.08|N|O|1997-01-09|1997-02-18|1997-01-26|COLLECT COD|SHIP|kages: regu +57765|1825|26|1|24|41443.68|0.01|0.08|A|F|1994-10-22|1995-01-13|1994-11-12|DELIVER IN PERSON|MAIL|ronic theodolites. express accounts in +57765|1113|50|2|27|27380.97|0.01|0.01|R|F|1995-02-10|1994-12-24|1995-02-17|COLLECT COD|FOB|gular, even deposits +57765|747|48|3|30|49432.20|0.07|0.07|A|F|1995-01-12|1994-11-18|1995-02-10|DELIVER IN PERSON|AIR|r accounts +57765|217|18|4|6|6703.26|0.08|0.01|R|F|1994-11-28|1994-11-23|1994-12-07|TAKE BACK RETURN|SHIP|ly pending dol +57765|65|66|5|14|13510.84|0.03|0.03|A|F|1995-01-23|1994-11-20|1995-02-14|NONE|TRUCK|nal platelets wake fluffily even ideas. i +57765|1907|96|6|43|77782.70|0.03|0.07|R|F|1995-02-02|1994-12-22|1995-02-17|COLLECT COD|TRUCK|y final pains. slyly express deposits w +57766|1611|35|1|27|40840.47|0.08|0.05|A|F|1993-08-12|1993-06-28|1993-09-02|TAKE BACK RETURN|RAIL|sts are furiously ironic pint +57766|34|85|2|34|31757.02|0.09|0.00|A|F|1993-08-29|1993-06-10|1993-09-06|DELIVER IN PERSON|AIR|arefully final asymptotes. fluff +57766|169|22|3|38|40628.08|0.00|0.08|R|F|1993-07-19|1993-07-23|1993-08-06|TAKE BACK RETURN|REG AIR|uffily express theodolites. +57766|1336|13|4|22|27221.26|0.08|0.06|R|F|1993-05-12|1993-07-29|1993-05-15|DELIVER IN PERSON|FOB|egrate carefully. depende +57766|1645|87|5|36|55679.04|0.01|0.07|A|F|1993-07-02|1993-06-09|1993-07-04|DELIVER IN PERSON|SHIP|theodolites boost? regular pinto beans +57767|787|52|1|26|43882.28|0.07|0.02|R|F|1992-05-26|1992-06-18|1992-06-07|DELIVER IN PERSON|FOB|ual, pending dependencies nod dogged, even +57767|1238|50|2|14|15949.22|0.02|0.05|R|F|1992-07-23|1992-06-08|1992-08-20|NONE|SHIP|ual instruct +57767|1395|10|3|33|42780.87|0.05|0.05|R|F|1992-06-09|1992-05-20|1992-06-19|NONE|FOB|cial accounts are +57767|286|68|4|1|1186.28|0.04|0.03|A|F|1992-06-27|1992-05-30|1992-07-15|DELIVER IN PERSON|AIR|refully ironic dugouts detec +57767|769|34|5|41|68460.16|0.00|0.05|A|F|1992-06-17|1992-06-02|1992-06-22|NONE|AIR| detect doggedly iron +57767|353|38|6|49|61414.15|0.04|0.02|R|F|1992-05-17|1992-06-02|1992-06-14|DELIVER IN PERSON|REG AIR|pecial foxes engage. account +57792|1001|37|1|19|17138.00|0.06|0.01|N|O|1998-06-21|1998-08-16|1998-06-23|COLLECT COD|RAIL|usly. slyly pending theodolites around +57792|1409|49|2|5|6552.00|0.01|0.02|N|O|1998-09-08|1998-07-24|1998-10-07|TAKE BACK RETURN|MAIL|ave to are blithely. blithel +57792|1978|11|3|39|73318.83|0.02|0.05|N|O|1998-09-12|1998-07-18|1998-10-09|NONE|REG AIR|ccounts ca +57792|1151|52|4|16|16834.40|0.09|0.02|N|O|1998-06-06|1998-08-04|1998-06-23|DELIVER IN PERSON|REG AIR|ilent dolphin +57792|1086|87|5|50|49354.00|0.07|0.08|N|O|1998-06-10|1998-07-31|1998-06-19|TAKE BACK RETURN|SHIP| accounts. ironic deposits against the f +57792|1906|7|6|4|7231.60|0.10|0.06|N|O|1998-07-05|1998-06-27|1998-07-30|TAKE BACK RETURN|RAIL| ideas integrate alo +57793|604|98|1|26|39119.60|0.03|0.02|A|F|1992-12-28|1993-01-20|1992-12-31|COLLECT COD|TRUCK|against the furiously regular pinto beans +57793|1696|79|2|41|65505.29|0.05|0.03|R|F|1993-02-22|1992-12-16|1993-03-03|COLLECT COD|AIR|ickly even asympt +57793|1152|53|3|49|51604.35|0.04|0.00|R|F|1993-02-20|1993-01-18|1993-03-04|COLLECT COD|MAIL|counts are slyly ironic reques +57794|1084|90|1|19|18716.52|0.05|0.03|R|F|1994-11-16|1994-08-31|1994-11-26|DELIVER IN PERSON|SHIP|ct slyly above the slyly eve +57794|1973|74|2|6|11249.82|0.02|0.03|A|F|1994-09-28|1994-10-05|1994-10-22|COLLECT COD|RAIL|ully bold frets; carefully pe +57794|18|69|3|14|12852.14|0.05|0.01|A|F|1994-11-20|1994-09-20|1994-12-02|COLLECT COD|FOB|ironic frets need to wake blithely across +57794|1812|42|4|5|8569.05|0.08|0.07|R|F|1994-11-19|1994-08-29|1994-11-20|DELIVER IN PERSON|RAIL|l, ironic requests. quickly even r +57794|698|99|5|41|65546.29|0.08|0.05|A|F|1994-10-15|1994-10-04|1994-10-26|TAKE BACK RETURN|SHIP|s wake caref +57794|634|35|6|6|9207.78|0.02|0.07|R|F|1994-11-05|1994-10-14|1994-11-23|COLLECT COD|AIR|yly against the pin +57794|307|64|7|36|43462.80|0.06|0.02|A|F|1994-10-24|1994-09-12|1994-10-30|COLLECT COD|REG AIR|ainst the nev +57795|1120|57|1|49|50034.88|0.01|0.04|R|F|1994-09-30|1994-08-22|1994-10-20|DELIVER IN PERSON|FOB|nal requests. b +57795|1052|88|2|27|25732.35|0.03|0.06|R|F|1994-06-30|1994-09-05|1994-07-11|TAKE BACK RETURN|FOB|boost blithely furious +57795|548|9|3|30|43456.20|0.03|0.04|A|F|1994-10-10|1994-09-01|1994-10-28|DELIVER IN PERSON|SHIP|hely pending de +57796|1479|58|1|31|42794.57|0.03|0.04|N|O|1996-03-16|1996-05-16|1996-04-11|COLLECT COD|MAIL|e of the final, ironic fo +57796|1045|81|2|6|5676.24|0.01|0.04|N|O|1996-03-10|1996-04-03|1996-03-16|NONE|RAIL|s above the final platelets +57796|1023|59|3|23|21252.46|0.02|0.01|N|O|1996-03-09|1996-03-29|1996-04-06|DELIVER IN PERSON|TRUCK|nic requests wake +57797|1175|12|1|39|41970.63|0.00|0.07|N|O|1998-04-16|1998-05-05|1998-05-03|TAKE BACK RETURN|FOB|the careful requests. +57797|1885|86|2|2|3573.76|0.06|0.06|N|O|1998-03-27|1998-05-05|1998-03-29|TAKE BACK RETURN|TRUCK|nusual ideas are blithely furiously final +57797|1796|39|3|38|64516.02|0.03|0.07|N|O|1998-05-08|1998-04-10|1998-05-12|NONE|REG AIR|e. accounts haggle r +57797|1762|63|4|49|81524.24|0.05|0.08|N|O|1998-03-01|1998-04-12|1998-03-08|DELIVER IN PERSON|AIR|platelets cajole fur +57797|1515|96|5|28|39662.28|0.07|0.07|N|O|1998-04-02|1998-04-14|1998-04-29|DELIVER IN PERSON|SHIP|y along the depe +57798|1973|62|1|13|24374.61|0.02|0.03|R|F|1992-10-29|1992-10-16|1992-11-12|COLLECT COD|RAIL|wake fluffily above th +57798|23|99|2|38|35074.76|0.00|0.07|R|F|1992-10-30|1992-11-25|1992-11-17|COLLECT COD|FOB|excuses integrate blithely fl +57798|1524|65|3|42|59871.84|0.06|0.05|R|F|1992-11-11|1992-12-11|1992-12-01|NONE|RAIL|xes according t +57799|1561|82|1|24|35101.44|0.10|0.07|N|O|1995-10-24|1995-10-02|1995-11-14|COLLECT COD|REG AIR|elets boost ironi +57799|1940|73|2|46|84729.24|0.10|0.06|N|O|1995-12-05|1995-11-24|1995-12-26|NONE|REG AIR|excuses. regular theodoli +57799|699|100|3|9|14397.21|0.00|0.01|N|O|1995-11-13|1995-10-22|1995-11-23|TAKE BACK RETURN|MAIL|the furiously fluf +57799|568|69|4|19|27902.64|0.02|0.04|N|O|1995-09-02|1995-11-08|1995-10-01|DELIVER IN PERSON|REG AIR|ly pending br +57799|261|89|5|25|29031.50|0.04|0.04|N|O|1995-12-30|1995-11-14|1996-01-05|DELIVER IN PERSON|RAIL|lly. furiously pendin +57824|1995|96|1|5|9484.95|0.07|0.02|N|O|1998-01-07|1997-12-24|1998-01-17|COLLECT COD|MAIL|blithely regular frays. sly +57824|1420|21|2|35|46249.70|0.04|0.00|N|O|1998-01-04|1997-12-30|1998-01-08|DELIVER IN PERSON|SHIP|ages integrate furiou +57824|75|76|3|40|39002.80|0.04|0.06|N|O|1998-01-01|1998-01-03|1998-01-08|DELIVER IN PERSON|TRUCK|c packages +57825|881|81|1|50|89094.00|0.05|0.07|N|O|1998-05-07|1998-04-09|1998-05-31|TAKE BACK RETURN|MAIL|y final packages. quickly even dep +57825|1981|70|2|43|80968.14|0.06|0.02|N|O|1998-04-18|1998-05-11|1998-04-30|COLLECT COD|FOB|eposits. slyly final accoun +57825|682|14|3|42|66472.56|0.07|0.01|N|O|1998-05-20|1998-04-15|1998-06-05|DELIVER IN PERSON|TRUCK|onic theodolites wake +57826|298|99|1|25|29957.25|0.02|0.01|N|O|1998-04-07|1998-06-13|1998-04-29|COLLECT COD|AIR|ial foxes. blithely ironic n +57826|1620|62|2|6|9129.72|0.08|0.05|N|O|1998-04-14|1998-07-02|1998-04-19|COLLECT COD|MAIL|dencies. express theo +57826|1516|57|3|9|12757.59|0.08|0.03|N|O|1998-07-07|1998-07-03|1998-07-16|COLLECT COD|FOB|arefully regular +57826|230|85|4|43|48599.89|0.07|0.06|N|O|1998-06-26|1998-06-07|1998-07-16|TAKE BACK RETURN|FOB|epitaphs are dugouts. carefully final theod +57826|1055|26|5|33|31549.65|0.03|0.06|N|O|1998-07-20|1998-06-16|1998-07-23|TAKE BACK RETURN|RAIL|cajole furiously across the blit +57827|6|7|1|6|5436.00|0.02|0.02|R|F|1994-10-11|1994-08-09|1994-10-21|COLLECT COD|AIR|ounts are furiously. carefully even accoun +57827|1609|10|2|29|43807.40|0.07|0.00|R|F|1994-08-15|1994-09-21|1994-08-27|TAKE BACK RETURN|AIR|ackages. even deposits affix so +57827|1947|80|3|4|7395.76|0.07|0.02|R|F|1994-09-22|1994-09-02|1994-10-15|COLLECT COD|RAIL|blithely ev +57827|645|8|4|15|23184.60|0.07|0.02|A|F|1994-07-16|1994-08-25|1994-07-20|NONE|AIR|ly final asympto +57827|1337|52|5|40|49533.20|0.01|0.02|R|F|1994-09-11|1994-09-04|1994-09-23|TAKE BACK RETURN|AIR|uests. carefully ironic pinto bean +57827|439|27|6|23|30806.89|0.10|0.04|A|F|1994-07-22|1994-09-07|1994-07-28|TAKE BACK RETURN|FOB|ly fluffily unusual +57828|846|47|1|31|54152.04|0.02|0.02|N|O|1998-06-28|1998-08-18|1998-07-13|DELIVER IN PERSON|MAIL|xes boost a +57828|7|8|2|41|37187.00|0.10|0.07|N|O|1998-06-08|1998-08-12|1998-06-09|DELIVER IN PERSON|FOB|encies eat quickly slyly regu +57828|346|47|3|31|38636.54|0.05|0.07|N|O|1998-07-07|1998-08-22|1998-07-22|COLLECT COD|RAIL|iously thin +57828|318|47|4|45|54823.95|0.00|0.04|N|O|1998-08-31|1998-07-21|1998-09-12|COLLECT COD|SHIP|ers. carefully silent +57828|1761|46|5|38|63184.88|0.10|0.04|N|O|1998-06-01|1998-08-11|1998-06-02|COLLECT COD|SHIP|ites use fluff +57829|1243|44|1|29|33182.96|0.03|0.05|R|F|1994-03-10|1994-04-25|1994-03-28|DELIVER IN PERSON|REG AIR|fix slyly fluffily +57829|1147|56|2|14|14673.96|0.04|0.02|R|F|1994-06-18|1994-05-02|1994-06-28|TAKE BACK RETURN|RAIL|gular frays. theod +57829|1856|57|3|18|31641.30|0.05|0.03|A|F|1994-04-15|1994-04-26|1994-04-25|NONE|TRUCK|pendencies. carefully bold +57830|523|14|1|35|49823.20|0.01|0.08|N|O|1995-11-15|1995-10-10|1995-12-06|NONE|TRUCK|t the furiously ironic pinto +57830|346|47|2|47|58577.98|0.09|0.08|N|O|1995-10-07|1995-09-29|1995-10-27|TAKE BACK RETURN|SHIP|y final requests sleep stealthily sly pla +57831|482|41|1|33|45621.84|0.08|0.06|N|O|1996-11-05|1996-12-20|1996-11-21|COLLECT COD|RAIL|ctions wake-- blithely r +57831|1281|82|2|25|29557.00|0.09|0.04|N|O|1996-10-18|1996-12-12|1996-11-03|COLLECT COD|REG AIR|ole fluffily ironic ideas. sly +57831|550|81|3|46|66725.30|0.08|0.01|N|O|1996-12-18|1996-11-21|1997-01-14|NONE|REG AIR|sual courts are against the even, +57831|687|81|4|28|44455.04|0.07|0.06|N|O|1996-12-26|1996-12-19|1997-01-08|COLLECT COD|AIR|regular, final accounts across the ruthl +57856|699|31|1|21|33593.49|0.00|0.03|R|F|1994-06-09|1994-05-13|1994-06-17|COLLECT COD|RAIL|counts-- unusual, final deposits +57856|1775|18|2|9|15090.93|0.08|0.00|R|F|1994-03-21|1994-05-01|1994-04-12|TAKE BACK RETURN|REG AIR|es wake furiously packages. +57856|1109|82|3|3|3030.30|0.06|0.00|R|F|1994-05-07|1994-03-20|1994-05-18|NONE|MAIL|ounts cajole carefully slyly +57857|1381|82|1|27|34624.26|0.04|0.03|A|F|1993-08-23|1993-07-10|1993-08-31|DELIVER IN PERSON|REG AIR| slyly final theodolites cajole +57857|207|35|2|13|14393.60|0.01|0.02|A|F|1993-07-29|1993-07-06|1993-07-30|NONE|SHIP|re at the regular accounts. accounts are +57857|1818|19|3|38|65352.78|0.07|0.07|R|F|1993-06-16|1993-06-07|1993-06-30|TAKE BACK RETURN|TRUCK|l courts about the final theodol +57857|472|2|4|47|64506.09|0.01|0.06|R|F|1993-05-17|1993-07-28|1993-05-31|DELIVER IN PERSON|REG AIR|final theodolites integrate after the acc +57857|1955|56|5|25|46423.75|0.09|0.07|R|F|1993-07-15|1993-06-11|1993-08-06|COLLECT COD|FOB|uests nag alongside of the +57857|1984|17|6|24|45263.52|0.03|0.04|A|F|1993-08-12|1993-07-28|1993-08-30|NONE|FOB|he furiously regular platelets +57857|139|18|7|29|30134.77|0.00|0.03|R|F|1993-08-15|1993-07-26|1993-08-17|NONE|MAIL|ously ironic asy +57858|1550|31|1|45|65319.75|0.07|0.02|N|O|1996-02-06|1995-12-23|1996-03-07|COLLECT COD|MAIL| the account +57858|368|69|2|33|41855.88|0.09|0.05|N|O|1995-11-27|1995-12-11|1995-12-24|DELIVER IN PERSON|TRUCK|ickly silent, regular instructio +57858|1539|40|3|39|56180.67|0.01|0.08|N|O|1996-01-06|1996-01-20|1996-01-19|NONE|TRUCK|. quickly even theodoli +57858|1710|53|4|50|80585.50|0.04|0.03|N|O|1995-11-27|1996-01-19|1995-12-06|DELIVER IN PERSON|REG AIR|e slyly final requests nag carefu +57858|144|71|5|5|5220.70|0.09|0.00|N|O|1995-12-30|1995-12-06|1996-01-10|NONE|TRUCK|ions. fluffil +57859|597|28|1|8|11980.72|0.03|0.07|N|O|1997-08-16|1997-07-07|1997-09-01|DELIVER IN PERSON|TRUCK|d, ironic deposits. carefully r +57859|181|60|2|48|51896.64|0.10|0.00|N|O|1997-07-26|1997-07-09|1997-08-22|COLLECT COD|RAIL|p furiously carefully regular +57859|1402|81|3|25|32585.00|0.10|0.06|N|O|1997-06-23|1997-08-23|1997-07-15|NONE|MAIL|otes mold. requests sleep quickly qui +57859|767|100|4|31|51700.56|0.10|0.01|N|O|1997-06-13|1997-08-05|1997-07-06|TAKE BACK RETURN|REG AIR|aggle quickly quickly ironic escapades. s +57859|900|100|5|35|63031.50|0.02|0.02|N|O|1997-08-29|1997-07-04|1997-09-21|COLLECT COD|MAIL|eans besides the carefu +57859|1856|57|6|30|52735.50|0.10|0.04|N|O|1997-09-06|1997-07-06|1997-09-25|TAKE BACK RETURN|MAIL|ven, silent deposits boost according +57859|420|8|7|34|44894.28|0.02|0.02|N|O|1997-08-14|1997-08-17|1997-08-20|NONE|AIR|iously among the iro +57860|1730|31|1|19|31002.87|0.07|0.05|N|O|1997-04-12|1997-03-13|1997-04-26|DELIVER IN PERSON|FOB|ajole blithely along the furiously regular +57860|315|72|2|4|4861.24|0.07|0.03|N|O|1997-01-01|1997-03-06|1997-01-06|TAKE BACK RETURN|RAIL|es according to the slowly regular package +57860|1402|42|3|9|11730.60|0.02|0.01|N|O|1997-02-14|1997-02-23|1997-03-02|TAKE BACK RETURN|RAIL| integrate carefully qui +57860|1831|18|4|21|36389.43|0.08|0.01|N|O|1997-02-25|1997-01-29|1997-03-07|NONE|REG AIR| to the even +57860|1599|20|5|15|22508.85|0.09|0.02|N|O|1997-04-09|1997-02-28|1997-04-10|TAKE BACK RETURN|SHIP|express pinto +57861|1361|76|1|47|59330.92|0.00|0.06|R|F|1992-12-20|1993-01-15|1992-12-29|TAKE BACK RETURN|FOB|ncies was car +57861|241|23|2|42|47932.08|0.00|0.01|R|F|1992-12-03|1992-12-23|1992-12-31|TAKE BACK RETURN|TRUCK|ggle blith +57862|1833|77|1|5|8674.15|0.04|0.00|N|O|1996-05-06|1996-05-29|1996-05-25|NONE|MAIL|ggle across the carefully unusual +57862|1617|41|2|30|45558.30|0.06|0.03|N|O|1996-06-13|1996-06-16|1996-07-04|DELIVER IN PERSON|RAIL|ss the regular dolphins kindle slowly a +57862|1497|37|3|22|30766.78|0.04|0.01|N|O|1996-06-29|1996-06-19|1996-07-15|COLLECT COD|AIR|around the slyly unusual requests. i +57862|803|4|4|25|42595.00|0.00|0.02|N|O|1996-07-19|1996-07-07|1996-08-16|NONE|FOB|le furiously express, e +57863|1296|34|1|30|35918.70|0.03|0.05|A|F|1992-09-30|1992-08-25|1992-10-14|DELIVER IN PERSON|RAIL|ely pending packages are against the +57863|441|100|2|31|41584.64|0.02|0.03|A|F|1992-07-05|1992-07-19|1992-07-30|TAKE BACK RETURN|MAIL|: express requests around the regular +57888|466|67|1|20|27329.20|0.10|0.06|N|O|1997-03-09|1997-05-11|1997-04-07|NONE|REG AIR|ng requests haggle +57888|1767|94|2|22|36712.72|0.10|0.08|N|O|1997-05-15|1997-04-15|1997-06-05|NONE|MAIL|y pending deposits must h +57888|1217|29|3|11|12300.31|0.00|0.07|N|O|1997-07-01|1997-04-30|1997-07-26|COLLECT COD|MAIL|ely accord +57889|1344|21|1|25|31133.50|0.00|0.07|A|F|1993-05-27|1993-05-10|1993-06-08|TAKE BACK RETURN|RAIL|quickly silent theodolites +57889|1626|9|2|44|67215.28|0.09|0.07|A|F|1993-04-27|1993-06-09|1993-05-12|DELIVER IN PERSON|MAIL|counts are spec +57889|1789|90|3|36|60868.08|0.07|0.00|A|F|1993-08-01|1993-06-03|1993-08-18|DELIVER IN PERSON|FOB| slyly final f +57889|822|23|4|45|77526.90|0.10|0.01|A|F|1993-05-06|1993-05-22|1993-05-12|DELIVER IN PERSON|AIR|equests wake +57889|1061|97|5|7|6734.42|0.01|0.04|R|F|1993-05-29|1993-06-21|1993-06-18|NONE|AIR|s decoys wake furi +57889|1903|4|6|50|90245.00|0.02|0.05|A|F|1993-06-02|1993-06-12|1993-06-05|NONE|FOB|sual asymptotes haggle reg +57889|1668|10|7|3|4708.98|0.00|0.08|R|F|1993-04-23|1993-06-28|1993-05-01|TAKE BACK RETURN|FOB|blithely fluffily e +57890|36|12|1|29|27144.87|0.06|0.01|R|F|1994-05-04|1994-04-02|1994-05-09|NONE|MAIL|riously fina +57890|1103|40|2|37|37151.70|0.01|0.00|R|F|1994-04-07|1994-05-06|1994-05-06|NONE|RAIL|theodolites are. regu +57890|1781|82|3|33|55531.74|0.07|0.04|A|F|1994-06-09|1994-05-11|1994-07-04|COLLECT COD|RAIL|ular packages haggle pe +57890|719|84|4|31|50211.01|0.08|0.02|A|F|1994-04-07|1994-04-08|1994-04-17|DELIVER IN PERSON|RAIL|olites beyond the accounts wake blit +57891|384|69|1|36|46237.68|0.00|0.08|R|F|1994-04-02|1994-01-24|1994-04-30|NONE|FOB|ress frays boost fluffil +57891|235|36|2|36|40868.28|0.04|0.04|A|F|1994-03-16|1994-01-28|1994-03-24|COLLECT COD|MAIL| even, final +57891|89|90|3|25|24727.00|0.02|0.00|R|F|1994-03-23|1994-03-06|1994-04-13|DELIVER IN PERSON|MAIL|y ironic theodolites. +57891|1713|40|4|31|50056.01|0.06|0.03|A|F|1994-03-10|1994-01-18|1994-04-01|TAKE BACK RETURN|MAIL|heodolites are blithely. ironi +57892|820|54|1|40|68832.80|0.10|0.01|N|O|1997-02-16|1996-12-12|1997-03-13|NONE|FOB|l foxes. even gifts haggle +57892|683|84|2|9|14253.12|0.07|0.03|N|O|1997-01-17|1996-12-27|1997-02-08|DELIVER IN PERSON|RAIL|efully final pinto beans are fluffil +57892|559|20|3|43|62760.65|0.10|0.05|N|O|1996-11-14|1997-01-09|1996-11-22|TAKE BACK RETURN|SHIP|final packages haggle furiously furiou +57893|1818|62|1|39|67072.59|0.09|0.02|R|F|1993-11-30|1993-12-09|1993-12-23|NONE|AIR|e bold, unusual courts. regular deposi +57893|507|38|2|39|54892.50|0.10|0.00|R|F|1994-01-14|1994-01-01|1994-01-18|COLLECT COD|SHIP|gular dependencies. fluffily regular +57893|747|44|3|30|49432.20|0.05|0.03|R|F|1994-01-29|1993-12-26|1994-02-10|COLLECT COD|FOB|en, bold deposits dete +57894|1167|4|1|28|29908.48|0.06|0.07|R|F|1992-07-04|1992-06-14|1992-07-08|TAKE BACK RETURN|SHIP|ross the d +57894|1958|3|2|49|91137.55|0.01|0.05|A|F|1992-04-13|1992-05-28|1992-04-24|DELIVER IN PERSON|SHIP|en deposits +57894|1368|83|3|30|38080.80|0.06|0.08|A|F|1992-06-25|1992-05-31|1992-07-11|TAKE BACK RETURN|REG AIR|al accounts unwind. furious +57894|1056|92|4|46|44024.30|0.08|0.06|R|F|1992-07-04|1992-07-02|1992-07-07|DELIVER IN PERSON|REG AIR|xes haggle blithely. furiously pend +57895|1300|38|1|1|1201.30|0.03|0.08|N|O|1997-04-26|1997-03-29|1997-05-09|COLLECT COD|FOB|brave pinto bea +57895|1484|85|2|50|69274.00|0.05|0.07|N|O|1997-05-05|1997-04-07|1997-05-17|NONE|AIR|gular instructions. +57895|1066|67|3|48|46418.88|0.10|0.01|N|O|1997-03-28|1997-04-05|1997-04-17|TAKE BACK RETURN|RAIL|kages boost fluffily thinly silent theodo +57895|560|61|4|33|48198.48|0.04|0.05|N|O|1997-01-26|1997-03-08|1997-02-13|NONE|AIR|ess deposits. carefully exp +57895|1032|3|5|11|10263.33|0.07|0.03|N|O|1997-02-24|1997-04-06|1997-03-07|DELIVER IN PERSON|REG AIR|posits wake fu +57895|756|89|6|43|71240.25|0.07|0.08|N|O|1997-04-21|1997-03-17|1997-05-12|DELIVER IN PERSON|REG AIR| cajole quickly carefully fin +57920|777|10|1|47|78855.19|0.06|0.01|N|O|1997-03-23|1997-02-02|1997-03-31|NONE|MAIL|es wake slyly. furiously bold accounts al +57920|779|76|2|27|45353.79|0.07|0.01|N|O|1997-03-04|1997-03-03|1997-03-06|DELIVER IN PERSON|AIR|ccounts. furiously regular foxes was +57920|559|90|3|38|55462.90|0.02|0.00|N|O|1997-01-16|1997-02-25|1997-01-17|NONE|RAIL|wake around the fluffily exp +57920|521|82|4|17|24165.84|0.08|0.01|N|O|1997-02-20|1997-02-26|1997-03-17|DELIVER IN PERSON|AIR|ely unusual theodolite +57920|1659|42|5|48|74911.20|0.03|0.04|N|O|1997-03-24|1997-03-22|1997-04-23|COLLECT COD|SHIP|carefully above the blithely u +57920|1839|40|6|49|85300.67|0.10|0.02|N|O|1997-01-26|1997-03-02|1997-02-02|TAKE BACK RETURN|MAIL|he bold, ironic a +57921|83|9|1|14|13763.12|0.06|0.00|A|F|1993-10-14|1993-09-30|1993-10-23|DELIVER IN PERSON|REG AIR| fluffily express packages are warhorses +57921|428|29|2|29|38524.18|0.02|0.07|A|F|1993-11-17|1993-09-21|1993-11-26|DELIVER IN PERSON|REG AIR|into beans b +57921|1816|60|3|42|72148.02|0.02|0.07|R|F|1993-10-28|1993-10-28|1993-11-05|TAKE BACK RETURN|FOB| deposits. +57921|1708|9|4|38|61168.60|0.04|0.03|R|F|1993-12-02|1993-10-28|1993-12-18|NONE|SHIP|as. regular, even pinto beans are afte +57921|1921|54|5|19|34635.48|0.07|0.07|R|F|1993-10-18|1993-11-01|1993-10-22|TAKE BACK RETURN|REG AIR|uctions. quickly unusual plate +57921|1935|24|6|48|88172.64|0.07|0.08|R|F|1993-09-27|1993-11-12|1993-10-11|NONE|FOB| final packages. sl +57921|1209|47|7|25|27755.00|0.01|0.00|A|F|1993-08-24|1993-11-08|1993-09-06|TAKE BACK RETURN|RAIL|c pinto beans engage slyly. quic +57922|78|79|1|18|17605.26|0.05|0.03|R|F|1995-04-04|1995-04-04|1995-04-05|TAKE BACK RETURN|RAIL|fully regular accounts. instructions boo +57922|1897|98|2|40|71955.60|0.03|0.02|R|F|1995-03-28|1995-04-02|1995-04-26|DELIVER IN PERSON|REG AIR|ng the even requests. b +57923|1695|19|1|31|49497.39|0.06|0.02|A|F|1994-07-07|1994-05-25|1994-08-01|NONE|RAIL| regular deposits haggle above +57923|1441|59|2|50|67122.00|0.07|0.07|R|F|1994-04-03|1994-04-19|1994-04-07|TAKE BACK RETURN|TRUCK|grate idly after the +57923|430|31|3|42|55878.06|0.03|0.06|R|F|1994-07-12|1994-06-02|1994-07-17|NONE|TRUCK| nag furiously express, final theodolit +57924|1680|4|1|12|18980.16|0.09|0.03|N|O|1997-04-03|1997-05-13|1997-04-28|NONE|AIR| accounts. doggedly pending instructio +57924|49|75|2|1|949.04|0.02|0.02|N|O|1997-04-27|1997-06-11|1997-05-15|COLLECT COD|SHIP|fily alongside +57924|1720|5|3|45|72977.40|0.09|0.07|N|O|1997-04-30|1997-05-13|1997-05-02|DELIVER IN PERSON|FOB|ly even theodolites nag furiously after th +57924|323|24|4|36|44039.52|0.04|0.05|N|O|1997-06-17|1997-05-07|1997-06-30|NONE|MAIL|. carefull +57924|66|17|5|42|40574.52|0.06|0.01|N|O|1997-07-29|1997-06-20|1997-08-06|DELIVER IN PERSON|TRUCK|es sleep slyly along the c +57924|1398|75|6|48|62370.72|0.07|0.07|N|O|1997-05-12|1997-06-24|1997-05-17|COLLECT COD|TRUCK|fter the bold +57924|1762|5|7|5|8318.80|0.08|0.00|N|O|1997-07-05|1997-05-26|1997-08-04|NONE|RAIL|o the furiously special theodolite +57925|1664|47|1|9|14090.94|0.09|0.02|N|O|1997-07-07|1997-07-19|1997-07-16|DELIVER IN PERSON|RAIL|y regular asymptotes along the silent +57925|1976|77|2|24|45071.28|0.05|0.06|N|O|1997-06-09|1997-05-29|1997-06-18|NONE|FOB| ideas sleep carefully against the ir +57926|1404|5|1|7|9137.80|0.02|0.00|N|O|1998-08-03|1998-05-15|1998-08-16|NONE|FOB|ke slyly excuses. blithely special theod +57926|830|30|2|44|76156.52|0.06|0.02|N|O|1998-05-19|1998-07-10|1998-06-13|TAKE BACK RETURN|RAIL| deposits haggle after the regular packages +57926|644|76|3|43|66419.52|0.00|0.02|N|O|1998-08-01|1998-06-25|1998-08-15|NONE|FOB|e stealthily express asymptot +57926|1246|58|4|34|39006.16|0.06|0.01|N|O|1998-07-07|1998-05-25|1998-07-16|COLLECT COD|FOB|quickly unus +57926|1520|61|5|34|48331.68|0.08|0.06|N|O|1998-04-21|1998-05-22|1998-04-28|TAKE BACK RETURN|RAIL|l theodolites. slyly eve +57927|166|19|1|27|28786.32|0.04|0.02|R|F|1993-01-04|1993-02-17|1993-01-22|DELIVER IN PERSON|AIR|y ironic deposits nag carefully acr +57952|339|40|1|34|42137.22|0.05|0.05|N|O|1996-04-29|1996-06-13|1996-05-06|NONE|AIR|osits. deposits above the requests nag i +57952|1054|90|2|44|42022.20|0.03|0.05|N|O|1996-05-05|1996-06-20|1996-05-11|COLLECT COD|REG AIR|iously regula +57952|206|61|3|37|40929.40|0.07|0.01|N|O|1996-05-29|1996-07-09|1996-06-22|DELIVER IN PERSON|MAIL|ly. fluffily regular gifts +57952|258|59|4|5|5791.25|0.01|0.03|N|O|1996-08-13|1996-07-25|1996-09-01|COLLECT COD|AIR|symptotes about the even, ironic accounts i +57953|1262|37|1|49|56999.74|0.07|0.01|N|O|1997-02-03|1997-02-09|1997-02-08|NONE|RAIL| against the ex +57953|1368|83|2|16|20309.76|0.09|0.08|N|O|1997-03-03|1997-01-05|1997-03-11|TAKE BACK RETURN|FOB|olphins along the +57953|956|59|3|42|77991.90|0.04|0.07|N|O|1997-03-09|1997-01-24|1997-03-29|NONE|MAIL| blithely express asymptotes wake expres +57953|1954|43|4|29|53822.55|0.09|0.01|N|O|1997-01-25|1997-02-26|1997-01-27|COLLECT COD|FOB|cross the regular foxes. quickl +57953|1427|6|5|35|46494.70|0.02|0.03|N|O|1996-12-07|1997-01-31|1996-12-23|NONE|AIR|ounts haggle slowly ironic courts. sly +57954|1362|77|1|20|25267.20|0.06|0.00|N|O|1998-05-20|1998-07-26|1998-05-24|TAKE BACK RETURN|SHIP|ns cajole regular deposits. s +57954|1295|33|2|5|5981.45|0.00|0.00|N|O|1998-09-04|1998-06-28|1998-09-30|COLLECT COD|FOB|he slyly final theodolites. quickly +57954|11|62|3|11|10021.11|0.03|0.03|N|O|1998-06-18|1998-07-27|1998-07-13|COLLECT COD|FOB|ding deposits boost furious +57954|942|11|4|30|55288.20|0.04|0.08|N|O|1998-06-23|1998-07-11|1998-07-13|COLLECT COD|FOB| ironic, regular dependencies along +57954|908|9|5|41|74164.90|0.03|0.08|N|O|1998-07-13|1998-08-09|1998-08-07|NONE|TRUCK|ns. silent instructi +57954|766|99|6|35|58336.60|0.08|0.08|N|O|1998-09-06|1998-06-14|1998-10-04|DELIVER IN PERSON|RAIL|quests dazzle +57955|170|71|1|8|8561.36|0.07|0.04|N|O|1998-03-22|1998-02-09|1998-04-19|DELIVER IN PERSON|FOB|quests: ironic instructions cajole. care +57955|861|95|2|37|65188.82|0.09|0.04|N|O|1998-03-16|1998-01-28|1998-03-29|COLLECT COD|RAIL|ermanent pinto bea +57955|394|51|3|40|51775.60|0.01|0.03|N|O|1998-03-13|1998-03-01|1998-03-25|NONE|FOB|ly. furious +57956|574|5|1|22|32440.54|0.04|0.04|N|O|1998-09-30|1998-07-07|1998-10-21|TAKE BACK RETURN|FOB|y silent pack +57956|1801|31|2|23|39164.40|0.00|0.08|N|O|1998-06-28|1998-07-26|1998-07-02|DELIVER IN PERSON|SHIP|cuses. furiously even packages sleep +57956|1667|9|3|36|56471.76|0.09|0.07|N|O|1998-08-29|1998-08-12|1998-09-21|COLLECT COD|SHIP|nstructions. even de +57956|995|30|4|47|89111.53|0.02|0.00|N|O|1998-07-12|1998-07-24|1998-07-22|NONE|SHIP|n deposits. carefully specia +57957|1620|62|1|33|50213.46|0.09|0.00|N|O|1996-07-28|1996-06-19|1996-08-23|NONE|REG AIR| bold theodolites haggle blithely +57957|100|26|2|43|43004.30|0.01|0.07|N|O|1996-08-16|1996-06-23|1996-08-22|COLLECT COD|FOB|n deposits. +57957|1409|49|3|10|13104.00|0.02|0.07|N|O|1996-06-10|1996-06-21|1996-06-14|COLLECT COD|SHIP|ial foxes. carefully +57957|1552|73|4|12|17442.60|0.05|0.06|N|O|1996-07-14|1996-07-16|1996-07-17|TAKE BACK RETURN|FOB|lly ironic accounts sleep. quic +57957|1141|14|5|39|40643.46|0.06|0.08|N|O|1996-09-01|1996-07-24|1996-09-17|NONE|MAIL|lyly pending dependencies. even, i +57958|282|10|1|20|23645.60|0.08|0.05|R|F|1994-05-19|1994-05-05|1994-06-18|NONE|REG AIR| thrash quickly; car +57958|1555|56|2|9|13108.95|0.04|0.08|R|F|1994-03-18|1994-05-18|1994-04-01|DELIVER IN PERSON|RAIL|e blithely express requests. quick +57958|1799|100|3|14|23811.06|0.04|0.03|R|F|1994-04-15|1994-05-23|1994-05-10|TAKE BACK RETURN|REG AIR|ites. regular pin +57958|1153|62|4|31|32678.65|0.05|0.06|A|F|1994-06-01|1994-04-07|1994-07-01|NONE|MAIL|ggle carefully. +57959|1552|53|1|28|40699.40|0.08|0.05|N|O|1996-03-24|1996-03-09|1996-04-10|NONE|TRUCK|lets are carefully ex +57959|1670|94|2|39|61295.13|0.02|0.07|N|O|1996-04-08|1996-03-20|1996-05-07|DELIVER IN PERSON|RAIL|lyly even foxes haggle slyly. slyly +57959|1699|23|3|33|52822.77|0.06|0.01|N|O|1996-03-06|1996-02-11|1996-04-01|NONE|RAIL|s. blithely regular patterns use bo +57959|1497|37|4|11|15383.39|0.00|0.06|N|O|1996-02-24|1996-03-19|1996-02-29|TAKE BACK RETURN|MAIL|ing to the furiously +57959|1809|10|5|8|13686.40|0.04|0.08|N|O|1996-02-17|1996-03-26|1996-02-27|DELIVER IN PERSON|FOB|ccounts nag +57959|912|47|6|31|56200.21|0.05|0.06|N|O|1996-03-06|1996-02-15|1996-03-20|NONE|REG AIR|gular deposits wake ironic, regula +57984|1645|28|1|45|69598.80|0.10|0.08|A|F|1994-01-14|1993-11-07|1994-01-23|TAKE BACK RETURN|RAIL|ar requests wake furiously. blithely +57984|1228|29|2|50|56461.00|0.00|0.04|R|F|1993-11-14|1993-12-10|1993-12-04|DELIVER IN PERSON|MAIL|. slyly regular account +57984|587|18|3|41|60990.78|0.03|0.05|R|F|1993-12-24|1993-11-04|1994-01-04|COLLECT COD|MAIL|idle accounts. accounts +57984|1676|18|4|47|74150.49|0.08|0.00|A|F|1994-01-17|1993-11-18|1994-02-13|TAKE BACK RETURN|AIR|uses. blithely un +57985|23|24|1|8|7384.16|0.01|0.07|A|F|1992-06-14|1992-05-07|1992-06-21|NONE|FOB|ld sentiments +57985|1691|74|2|40|63707.60|0.02|0.04|A|F|1992-04-28|1992-05-19|1992-05-08|TAKE BACK RETURN|RAIL|ent requests affix about the foxes +57985|1282|83|3|18|21299.04|0.05|0.03|R|F|1992-05-20|1992-04-23|1992-05-28|COLLECT COD|SHIP| haggle about the slyly specia +57985|999|68|4|9|17099.91|0.09|0.04|A|F|1992-05-08|1992-05-12|1992-05-17|NONE|RAIL|heodolites. blithely even fox +57986|734|31|1|24|39233.52|0.09|0.07|A|F|1994-01-24|1993-12-28|1994-01-31|DELIVER IN PERSON|TRUCK|lly after the carefully ir +57986|1899|86|2|47|84641.83|0.06|0.08|A|F|1994-01-23|1994-01-21|1994-02-10|NONE|REG AIR|ously regular ideas. blithel +57986|320|49|3|9|10982.88|0.06|0.07|R|F|1994-01-26|1994-01-27|1994-02-08|TAKE BACK RETURN|RAIL|lyly bold requests. u +57986|725|58|4|43|69905.96|0.01|0.06|R|F|1993-11-03|1994-01-13|1993-11-15|TAKE BACK RETURN|SHIP|arefully final packages grow furi +57986|1315|92|5|45|54733.95|0.09|0.02|A|F|1993-11-08|1994-01-25|1993-11-17|TAKE BACK RETURN|RAIL| the quietly special the +57987|1447|65|1|9|12135.96|0.03|0.03|R|F|1995-01-13|1995-01-29|1995-01-31|NONE|FOB|ep carefully. f +57987|1711|96|2|34|54832.14|0.02|0.02|A|F|1995-04-07|1995-01-27|1995-04-29|TAKE BACK RETURN|SHIP| blithely +57988|671|3|1|50|78583.50|0.09|0.03|N|O|1996-03-01|1996-01-08|1996-03-30|DELIVER IN PERSON|MAIL|fully unusual +57988|419|49|2|42|55415.22|0.01|0.06|N|O|1996-02-08|1995-12-31|1996-03-03|COLLECT COD|FOB| express, final pinto beans. bl +57988|1177|86|3|35|37735.95|0.09|0.02|N|O|1996-01-27|1996-01-15|1996-01-30|TAKE BACK RETURN|AIR|promise. final dependencies nag +57988|153|54|4|48|50551.20|0.05|0.05|N|O|1996-03-14|1996-02-17|1996-03-22|NONE|RAIL|es above the fi +57988|1555|36|5|25|36413.75|0.06|0.03|N|O|1996-03-03|1996-02-15|1996-04-02|NONE|RAIL|e pending pinto beans +57989|1649|91|1|9|13955.76|0.04|0.08|N|O|1997-01-07|1996-11-05|1997-02-05|DELIVER IN PERSON|REG AIR|uses; slyly reg +57989|375|60|2|44|56116.28|0.01|0.07|N|O|1996-10-26|1996-12-05|1996-11-09|TAKE BACK RETURN|TRUCK| to the fluffy asymptotes cajole special +57989|1858|88|3|4|7039.40|0.00|0.06|N|O|1996-11-04|1996-11-15|1996-11-24|COLLECT COD|FOB| nod fluff +57990|925|26|1|18|32866.56|0.00|0.05|A|F|1994-12-14|1994-10-20|1995-01-02|DELIVER IN PERSON|FOB|ckages. unusual +57991|1156|29|1|1|1057.15|0.07|0.08|R|F|1993-02-24|1993-03-22|1993-03-11|NONE|TRUCK|ld, ruthles +57991|1719|20|2|45|72931.95|0.07|0.01|R|F|1993-04-30|1993-02-25|1993-05-18|DELIVER IN PERSON|REG AIR| blithely final requ +58016|1442|43|1|24|32242.56|0.10|0.07|A|F|1994-03-26|1994-06-11|1994-04-12|DELIVER IN PERSON|SHIP| carefully even excuses detect always c +58016|567|68|2|41|60169.96|0.07|0.01|R|F|1994-07-06|1994-05-24|1994-07-14|TAKE BACK RETURN|MAIL|hely final packa +58017|455|14|1|28|37952.60|0.00|0.02|N|O|1997-06-12|1997-07-06|1997-06-29|NONE|MAIL| ironic accounts +58017|211|12|2|41|45559.61|0.07|0.08|N|O|1997-07-11|1997-08-08|1997-07-22|NONE|MAIL|lithely final courts bo +58017|1624|7|3|43|65601.66|0.09|0.07|N|O|1997-07-10|1997-06-26|1997-07-12|COLLECT COD|TRUCK|usly regula +58018|1217|18|1|43|48083.03|0.08|0.02|N|O|1997-09-10|1997-07-26|1997-09-12|NONE|AIR|aggle carefully +58018|1111|12|2|10|10121.10|0.05|0.03|N|O|1997-07-01|1997-08-09|1997-07-23|NONE|SHIP| ideas wake finally furiousl +58018|1594|35|3|23|34398.57|0.02|0.05|N|O|1997-09-05|1997-07-25|1997-09-14|COLLECT COD|TRUCK|ctions eat except the quickl +58019|298|80|1|2|2396.58|0.10|0.04|A|F|1992-06-11|1992-03-19|1992-06-15|NONE|RAIL|uests. pending, ironic packages along t +58019|762|59|2|1|1662.76|0.03|0.01|R|F|1992-03-17|1992-04-09|1992-04-16|DELIVER IN PERSON|AIR|ravely along the regular requ +58019|702|67|3|21|33656.70|0.02|0.04|A|F|1992-05-25|1992-04-10|1992-06-20|DELIVER IN PERSON|REG AIR|s integrate quickly final +58020|1170|79|1|29|31063.93|0.06|0.04|R|F|1993-01-01|1992-12-30|1993-01-26|NONE|MAIL|the carefully fin +58020|1881|11|2|36|64183.68|0.03|0.07|R|F|1993-02-17|1992-12-29|1993-03-01|NONE|FOB|ions alongsid +58020|602|65|3|18|27046.80|0.03|0.04|A|F|1993-02-13|1993-02-04|1993-03-01|DELIVER IN PERSON|SHIP|nag quickly. ironic deposits was furious +58021|1946|35|1|43|79461.42|0.01|0.08|A|F|1992-11-02|1992-09-28|1992-11-11|DELIVER IN PERSON|AIR|g deposits? deposits sleep +58022|1599|40|1|45|67526.55|0.03|0.01|N|O|1996-07-23|1996-07-16|1996-08-15|TAKE BACK RETURN|AIR|nic foxes are slyly at the fi +58022|68|19|2|41|39690.46|0.05|0.02|N|O|1996-07-18|1996-06-29|1996-08-04|TAKE BACK RETURN|AIR|refully regular requests cajole flu +58022|1882|69|3|3|5351.64|0.06|0.08|N|O|1996-08-06|1996-05-22|1996-08-16|COLLECT COD|RAIL|refully. carefully unus +58022|1228|3|4|45|50814.90|0.10|0.00|N|O|1996-05-03|1996-06-16|1996-05-12|NONE|REG AIR|nding notornis. final epitaphs +58022|965|100|5|6|11195.76|0.08|0.05|N|O|1996-04-24|1996-05-29|1996-05-17|NONE|AIR|efully even instructions. +58023|939|40|1|34|62557.62|0.00|0.05|N|O|1996-10-08|1996-10-25|1996-10-13|TAKE BACK RETURN|TRUCK| requests haggle furiously amon +58023|1493|72|2|38|52990.62|0.10|0.02|N|O|1996-09-19|1996-10-31|1996-10-07|COLLECT COD|FOB|egular, final +58023|902|5|3|15|27043.50|0.09|0.05|N|O|1996-10-08|1996-11-04|1996-10-11|DELIVER IN PERSON|MAIL|ding to the +58023|1515|96|4|39|55243.89|0.01|0.07|N|O|1996-09-07|1996-09-15|1996-09-10|TAKE BACK RETURN|SHIP|s solve special ideas. deposits +58023|1334|49|5|7|8647.31|0.05|0.04|N|O|1996-12-10|1996-10-17|1996-12-16|DELIVER IN PERSON|AIR|ctions; instructions across the i +58048|1737|64|1|8|13109.84|0.00|0.06|N|O|1998-11-18|1998-09-13|1998-12-08|TAKE BACK RETURN|AIR|ly express, ironic deposits. regular pint +58048|1057|28|2|23|22035.15|0.09|0.01|N|O|1998-09-04|1998-09-28|1998-09-14|DELIVER IN PERSON|RAIL|gular ideas cajo +58048|822|89|3|49|84418.18|0.09|0.00|N|O|1998-08-10|1998-09-07|1998-08-16|DELIVER IN PERSON|REG AIR|fily final ideas wake. final, regul +58049|1904|49|1|43|77653.70|0.07|0.05|N|F|1995-06-17|1995-04-30|1995-07-17|DELIVER IN PERSON|REG AIR|l requests will have to +58049|1455|95|2|26|35267.70|0.03|0.05|A|F|1995-04-17|1995-05-01|1995-04-29|NONE|REG AIR|he unusual excu +58049|1333|34|3|32|39498.56|0.02|0.07|A|F|1995-03-21|1995-05-08|1995-03-28|COLLECT COD|MAIL|cial packages use slyly a +58049|514|15|4|2|2829.02|0.06|0.00|R|F|1995-04-22|1995-06-02|1995-05-12|COLLECT COD|FOB|ng requests doubt quickly unusual, blith +58049|1301|40|5|12|14427.60|0.09|0.02|A|F|1995-05-23|1995-05-10|1995-06-04|DELIVER IN PERSON|FOB|ke about the quickly final packages. caref +58049|836|3|6|7|12157.81|0.07|0.03|A|F|1995-05-13|1995-04-28|1995-05-23|TAKE BACK RETURN|REG AIR|ccounts grow dugouts-- ironic platelets +58049|200|53|7|40|44008.00|0.05|0.02|R|F|1995-03-24|1995-05-30|1995-04-12|COLLECT COD|MAIL| solve final foxe +58050|63|64|1|15|14445.90|0.01|0.06|A|F|1992-09-04|1992-06-15|1992-09-11|NONE|RAIL|ions after the bli +58051|774|71|1|21|35170.17|0.10|0.08|R|F|1992-05-09|1992-04-26|1992-05-14|DELIVER IN PERSON|SHIP|arefully. carefully final +58052|1108|17|1|10|10091.00|0.06|0.06|R|F|1992-07-29|1992-06-28|1992-08-12|TAKE BACK RETURN|REG AIR|. furiously ev +58052|1512|33|2|45|63607.95|0.10|0.04|A|F|1992-08-20|1992-07-15|1992-08-22|NONE|FOB|riously even, thin requests. slyly +58052|607|1|3|26|39197.60|0.07|0.06|A|F|1992-08-22|1992-07-22|1992-08-23|COLLECT COD|SHIP|gle furiously +58052|987|90|4|40|75519.20|0.10|0.07|A|F|1992-07-22|1992-07-16|1992-08-18|TAKE BACK RETURN|TRUCK|nag fluffily! slyly special gifts need +58052|750|47|5|37|61077.75|0.04|0.06|R|F|1992-05-09|1992-07-21|1992-05-19|COLLECT COD|TRUCK|ttainments cajole quietly blithely reg +58052|1643|26|6|20|30892.80|0.04|0.06|R|F|1992-07-25|1992-06-21|1992-08-10|NONE|RAIL|thrash furiously. +58053|615|78|1|10|15156.10|0.04|0.02|A|F|1993-03-03|1993-03-14|1993-03-12|TAKE BACK RETURN|AIR|ending requests. furiously pending foxes +58053|1142|51|2|42|43811.88|0.01|0.07|A|F|1993-03-29|1993-03-14|1993-04-05|COLLECT COD|TRUCK|usly whithout the +58053|189|68|3|22|23961.96|0.00|0.08|R|F|1993-03-26|1993-03-03|1993-04-19|DELIVER IN PERSON|TRUCK|ajole slyly regular fo +58053|279|34|4|34|40095.18|0.03|0.03|A|F|1993-05-07|1993-03-23|1993-05-19|NONE|AIR|haggle blithely against the pin +58054|642|5|1|38|58620.32|0.00|0.00|R|F|1995-01-23|1995-03-22|1995-02-08|DELIVER IN PERSON|SHIP|blithely even foxes c +58054|1677|19|2|50|78933.50|0.07|0.08|R|F|1995-02-14|1995-03-26|1995-03-03|DELIVER IN PERSON|SHIP|r epitaphs cajole carefully eve +58054|165|44|3|13|13847.08|0.10|0.05|A|F|1995-02-02|1995-03-19|1995-02-22|NONE|AIR|ular asymptotes boost. asymptotes use +58054|442|30|4|24|32218.56|0.00|0.00|R|F|1995-02-04|1995-03-23|1995-03-04|COLLECT COD|RAIL| beans are furio +58054|864|98|5|2|3529.72|0.01|0.07|A|F|1995-02-05|1995-02-04|1995-02-15|DELIVER IN PERSON|SHIP| across the bold foxes could sublate acr +58054|1063|69|6|45|43382.70|0.02|0.01|R|F|1995-03-17|1995-03-20|1995-03-28|DELIVER IN PERSON|REG AIR|s haggle carefully regul +58055|410|11|1|28|36691.48|0.09|0.08|N|O|1995-11-30|1996-01-15|1995-12-22|NONE|AIR|uriously even ideas play after t +58055|960|29|2|28|52106.88|0.01|0.06|N|O|1996-02-02|1995-12-27|1996-02-25|COLLECT COD|REG AIR|across the accounts. per +58055|1863|93|3|35|61770.10|0.01|0.04|N|O|1996-01-11|1995-12-13|1996-01-13|NONE|FOB|lyly regular ideas boost quickly blithely +58055|1981|14|4|25|47074.50|0.07|0.07|N|O|1995-12-30|1995-12-05|1996-01-05|NONE|RAIL|ole furiously. pending, final +58055|716|81|5|38|61434.98|0.05|0.07|N|O|1995-12-01|1996-01-25|1995-12-02|NONE|REG AIR|uriously alongsid +58055|1714|15|6|50|80785.50|0.05|0.02|N|O|1996-01-06|1995-12-01|1996-01-12|COLLECT COD|MAIL|the furiously ironic sheaves. blith +58080|1648|49|1|36|55787.04|0.10|0.03|N|O|1997-10-19|1997-12-22|1997-11-17|DELIVER IN PERSON|FOB|he fluffily pending accoun +58081|1784|27|1|9|15172.02|0.10|0.05|R|F|1992-04-28|1992-02-19|1992-05-21|NONE|REG AIR|quests about the regular, regular acco +58081|1184|57|2|40|43407.20|0.10|0.00|A|F|1992-04-15|1992-03-19|1992-05-15|COLLECT COD|RAIL|ding to the regular +58081|1166|75|3|8|8537.28|0.05|0.08|R|F|1992-02-16|1992-02-13|1992-03-12|TAKE BACK RETURN|MAIL|l foxes boost slyly silent deposits. final +58081|1869|13|4|39|69063.54|0.10|0.02|R|F|1992-04-20|1992-03-07|1992-05-10|DELIVER IN PERSON|MAIL|ges after the slyly furious +58082|1413|92|1|20|26288.20|0.09|0.08|N|O|1996-05-14|1996-04-15|1996-05-21|TAKE BACK RETURN|AIR|nic instruct +58082|164|91|2|44|46823.04|0.07|0.04|N|O|1996-02-01|1996-04-27|1996-02-23|NONE|SHIP|thely final excuses. c +58082|1015|51|3|14|12824.14|0.00|0.07|N|O|1996-04-15|1996-04-29|1996-05-12|TAKE BACK RETURN|AIR|arefully reg +58082|301|30|4|23|27629.90|0.02|0.06|N|O|1996-05-13|1996-02-29|1996-05-23|NONE|TRUCK|quests haggle agai +58083|919|22|1|27|49137.57|0.01|0.00|N|O|1997-09-04|1997-06-18|1997-09-22|DELIVER IN PERSON|REG AIR|ly unusual requests? fu +58083|557|88|2|35|51014.25|0.10|0.03|N|O|1997-06-13|1997-07-21|1997-06-26|COLLECT COD|FOB| thinly unusual packages. +58083|1493|11|3|44|61357.56|0.04|0.04|N|O|1997-05-07|1997-07-13|1997-05-20|COLLECT COD|SHIP|lites maintain even waters. final foxes a +58083|995|96|4|2|3791.98|0.00|0.08|N|O|1997-07-15|1997-06-12|1997-07-16|TAKE BACK RETURN|SHIP|latelets a +58083|1737|22|5|19|31135.87|0.08|0.04|N|O|1997-05-15|1997-08-01|1997-05-27|DELIVER IN PERSON|REG AIR|l accounts thrash along the furiously +58083|1409|88|6|34|44553.60|0.01|0.02|N|O|1997-08-13|1997-07-03|1997-09-08|COLLECT COD|SHIP|ages. blithely ironic ac +58083|1601|25|7|39|58601.40|0.04|0.03|N|O|1997-06-16|1997-07-20|1997-07-13|TAKE BACK RETURN|REG AIR|pecial accounts +58084|910|11|1|19|34407.29|0.06|0.07|A|F|1992-10-02|1992-09-21|1992-10-31|TAKE BACK RETURN|RAIL|bout the regular orbits. b +58084|894|61|2|19|34102.91|0.08|0.05|R|F|1992-11-21|1992-11-16|1992-12-07|DELIVER IN PERSON|FOB|lently bold gifts. sp +58084|1879|9|3|12|21370.44|0.01|0.08|R|F|1992-11-08|1992-09-30|1992-11-24|TAKE BACK RETURN|TRUCK| accounts run quickly silent th +58084|638|39|4|22|33849.86|0.00|0.04|R|F|1992-08-25|1992-11-05|1992-08-27|COLLECT COD|SHIP|ckly after +58084|1476|77|5|43|59231.21|0.01|0.02|A|F|1992-09-28|1992-09-20|1992-10-27|DELIVER IN PERSON|AIR| quickly about the final deposits. final, +58084|513|44|6|28|39578.28|0.00|0.03|A|F|1992-10-19|1992-10-23|1992-11-05|DELIVER IN PERSON|REG AIR|ckages cajo +58085|910|45|1|31|56138.21|0.00|0.05|N|O|1996-12-01|1996-11-16|1996-12-11|DELIVER IN PERSON|SHIP|sts. bold epit +58085|1497|15|2|39|54541.11|0.05|0.01|N|O|1996-11-21|1996-11-29|1996-12-08|TAKE BACK RETURN|SHIP| use accounts. +58085|805|5|3|10|17058.00|0.06|0.08|N|O|1996-09-28|1996-11-24|1996-10-24|COLLECT COD|AIR|y even instructions. final excu +58085|1612|95|4|9|13622.49|0.10|0.01|N|O|1996-11-06|1996-11-26|1996-11-25|TAKE BACK RETURN|MAIL|gular requests. c +58086|1781|8|1|8|13462.24|0.10|0.01|N|O|1995-07-04|1995-05-12|1995-07-18|NONE|AIR|furiously. blithely special d +58086|740|41|2|34|55785.16|0.08|0.02|R|F|1995-05-13|1995-05-18|1995-06-06|DELIVER IN PERSON|RAIL|nic reques +58086|854|88|3|34|59664.90|0.05|0.07|N|O|1995-07-04|1995-05-28|1995-07-25|COLLECT COD|AIR|ts. even, ironic cou +58086|731|64|4|2|3263.46|0.03|0.00|A|F|1995-03-13|1995-06-03|1995-04-03|NONE|TRUCK|hely even, silent ideas. final, bold pa +58087|274|29|1|32|37576.64|0.01|0.06|N|O|1996-04-26|1996-03-22|1996-05-14|NONE|AIR|dependencies haggle blithely +58087|682|83|2|3|4748.04|0.09|0.06|N|O|1996-04-24|1996-03-21|1996-05-10|COLLECT COD|AIR| asymptotes haggle quickly. quick +58087|408|67|3|16|20934.40|0.06|0.08|N|O|1996-02-19|1996-02-29|1996-03-03|COLLECT COD|MAIL|ular sheaves lose packa +58087|90|16|4|45|44554.05|0.03|0.00|N|O|1996-02-22|1996-03-29|1996-03-07|TAKE BACK RETURN|FOB|fluffily. blithely final accounts sl +58087|1308|23|5|43|51999.90|0.09|0.03|N|O|1996-04-21|1996-02-26|1996-04-28|DELIVER IN PERSON|RAIL|t the slyly reg +58087|475|63|6|8|11003.76|0.04|0.03|N|O|1996-03-30|1996-04-05|1996-04-04|COLLECT COD|REG AIR|ending instructions. +58087|598|99|7|45|67436.55|0.02|0.06|N|O|1996-03-31|1996-04-05|1996-04-23|NONE|SHIP| the carefully spe +58112|348|49|1|34|42443.56|0.10|0.00|N|O|1998-02-15|1998-03-04|1998-03-15|NONE|FOB|inal foxes hinder ab +58113|1828|15|1|39|67462.98|0.01|0.07|R|F|1992-02-14|1992-04-21|1992-02-20|COLLECT COD|SHIP|haggle slyly bo +58113|977|12|2|22|41315.34|0.10|0.01|R|F|1992-02-27|1992-04-20|1992-03-17|COLLECT COD|SHIP|to the furiously expre +58113|1063|69|3|27|26029.62|0.01|0.08|A|F|1992-04-01|1992-03-07|1992-04-06|DELIVER IN PERSON|REG AIR|. silent, ironic ideas x-ray furious +58113|1631|73|4|8|12261.04|0.02|0.02|R|F|1992-04-06|1992-03-04|1992-04-20|NONE|REG AIR| express requests. carefully +58113|1196|33|5|28|30721.32|0.04|0.08|A|F|1992-03-20|1992-04-01|1992-03-22|NONE|RAIL|row blithely bold ideas. furiously bold acc +58113|67|93|6|22|21275.32|0.02|0.08|A|F|1992-04-14|1992-03-07|1992-04-28|DELIVER IN PERSON|SHIP|cuses are blithely after the b +58114|596|87|1|8|11972.72|0.04|0.08|N|O|1998-01-26|1998-01-10|1998-02-10|TAKE BACK RETURN|FOB|c platelets. regular accounts wake +58114|601|95|2|27|40543.20|0.02|0.05|N|O|1998-01-10|1998-01-09|1998-01-25|COLLECT COD|RAIL| beans. blithely regular reque +58114|205|60|3|34|37576.80|0.06|0.07|N|O|1998-01-29|1997-12-31|1998-02-14|NONE|FOB|ove the careful, ironic dinos. +58115|1643|85|1|16|24714.24|0.04|0.06|N|O|1997-12-10|1997-12-29|1997-12-30|TAKE BACK RETURN|SHIP|nts doubt against the sly +58115|1419|37|2|43|56777.63|0.02|0.02|N|O|1997-12-28|1997-11-24|1998-01-17|TAKE BACK RETURN|MAIL|against the fluffily regular req +58116|1108|45|1|29|29263.90|0.10|0.08|R|F|1994-04-17|1994-06-06|1994-05-07|COLLECT COD|RAIL|r hockey players. fur +58116|1586|67|2|22|32726.76|0.01|0.06|A|F|1994-06-29|1994-05-12|1994-07-09|TAKE BACK RETURN|RAIL|ans cajole +58116|631|94|3|29|44417.27|0.00|0.07|A|F|1994-04-08|1994-06-16|1994-04-25|COLLECT COD|AIR|xpress instructions detec +58116|1495|96|4|16|22343.84|0.05|0.05|A|F|1994-06-06|1994-06-11|1994-06-13|DELIVER IN PERSON|SHIP|ut the ironic packages. blithely e +58116|1118|55|5|11|11210.21|0.00|0.08|A|F|1994-07-04|1994-05-19|1994-07-21|COLLECT COD|FOB|fily dogged deposits nag past the de +58116|1494|12|6|23|32096.27|0.07|0.08|A|F|1994-05-18|1994-06-27|1994-05-19|TAKE BACK RETURN|REG AIR| slyly special platelets +58116|1901|2|7|9|16226.10|0.03|0.01|R|F|1994-04-12|1994-05-03|1994-05-11|DELIVER IN PERSON|REG AIR|uickly bold requests +58117|747|12|1|5|8238.70|0.02|0.02|A|F|1995-03-27|1995-03-24|1995-04-24|TAKE BACK RETURN|FOB|asymptotes. foxe +58117|1820|50|2|8|13774.56|0.06|0.07|N|F|1995-06-14|1995-04-23|1995-07-04|NONE|FOB|even instructions are furiously a +58117|626|58|3|38|58011.56|0.05|0.06|A|F|1995-03-29|1995-05-03|1995-04-27|NONE|AIR|ses poach accor +58117|618|12|4|27|41002.47|0.07|0.07|A|F|1995-04-22|1995-05-07|1995-05-09|TAKE BACK RETURN|SHIP|luffily ironic asymptotes are slyly along t +58117|1007|13|5|3|2724.00|0.03|0.01|R|F|1995-03-25|1995-04-09|1995-04-22|COLLECT COD|TRUCK|ronic deposits cajole. final, pending i +58117|1992|81|6|49|92805.51|0.04|0.06|A|F|1995-03-29|1995-05-02|1995-04-21|TAKE BACK RETURN|SHIP|against the final ideas cajol +58118|307|36|1|47|56743.10|0.01|0.08|N|O|1997-12-21|1997-11-30|1997-12-23|NONE|TRUCK|ke after the fluffily ironic deposi +58118|555|56|2|31|45122.05|0.08|0.08|N|O|1997-10-11|1997-11-28|1997-10-13|COLLECT COD|REG AIR|efully slyly bold requests. ironic pack +58118|829|30|3|42|72652.44|0.06|0.00|N|O|1997-10-03|1997-11-05|1997-10-15|COLLECT COD|TRUCK|e sometimes final foxes cajole slyly ar +58118|1894|95|4|46|82610.94|0.01|0.05|N|O|1997-12-26|1997-10-24|1998-01-23|DELIVER IN PERSON|FOB|ly silent reque +58118|309|94|5|17|20558.10|0.02|0.02|N|O|1997-11-30|1997-11-26|1997-12-18|COLLECT COD|MAIL|quick instructions +58119|1442|60|1|16|21495.04|0.10|0.08|A|F|1992-10-28|1992-09-23|1992-11-03|COLLECT COD|MAIL|final excuses nag stealthily +58144|1576|57|1|41|60580.37|0.10|0.07|A|F|1995-02-06|1995-01-19|1995-03-05|TAKE BACK RETURN|SHIP|nst the furiously special requests. ex +58144|1721|64|2|49|79513.28|0.00|0.02|A|F|1995-01-14|1995-01-20|1995-02-10|COLLECT COD|MAIL| final accounts. express pinto bea +58144|111|38|3|5|5055.55|0.00|0.07|A|F|1994-12-22|1995-02-04|1995-01-18|NONE|SHIP|egrate. regular courts try to poach dogg +58144|235|63|4|44|49950.12|0.09|0.03|R|F|1995-02-08|1995-01-30|1995-03-08|TAKE BACK RETURN|RAIL|ites haggle carefully above +58144|1478|57|5|22|30348.34|0.07|0.01|A|F|1995-01-23|1995-01-19|1995-02-15|NONE|MAIL|he slyly regular excus +58145|1088|59|1|1|989.08|0.07|0.01|R|F|1992-06-28|1992-06-17|1992-07-08|NONE|REG AIR|es are blithel +58146|1858|59|1|10|17598.50|0.09|0.04|N|O|1997-04-04|1997-06-06|1997-04-21|DELIVER IN PERSON|REG AIR|deposits nag s +58146|549|80|2|31|44935.74|0.01|0.07|N|O|1997-05-03|1997-05-31|1997-05-09|NONE|FOB|e furiously ironic +58146|1130|3|3|47|48463.11|0.02|0.05|N|O|1997-07-10|1997-06-23|1997-07-30|NONE|MAIL|out the regular dolphi +58146|974|9|4|48|89998.56|0.09|0.00|N|O|1997-07-23|1997-06-03|1997-08-10|COLLECT COD|SHIP|ong the slyly bol +58146|1517|98|5|18|25533.18|0.07|0.06|N|O|1997-06-18|1997-06-17|1997-06-29|COLLECT COD|RAIL|ove the furiously regula +58146|9|10|6|2|1818.00|0.02|0.00|N|O|1997-06-08|1997-06-27|1997-06-28|TAKE BACK RETURN|FOB|e the carefully f +58146|295|50|7|15|17929.35|0.00|0.02|N|O|1997-06-17|1997-06-15|1997-07-17|NONE|AIR|the express r +58147|1906|39|1|46|83163.40|0.00|0.03|R|F|1994-06-04|1994-07-08|1994-06-21|COLLECT COD|TRUCK| blithely regular requests cajole after +58147|1965|66|2|35|65343.60|0.04|0.00|A|F|1994-08-31|1994-06-28|1994-09-25|TAKE BACK RETURN|MAIL|slyly unusual the +58148|822|23|1|24|41347.68|0.08|0.07|R|F|1993-01-16|1993-01-31|1993-02-07|NONE|SHIP|ar packages was except the careful +58148|1020|26|2|43|39603.86|0.06|0.01|R|F|1992-11-23|1993-02-05|1992-12-03|TAKE BACK RETURN|TRUCK|ironic courts cajole carefully against th +58149|1393|8|1|36|46598.04|0.07|0.03|N|O|1997-04-08|1997-06-03|1997-05-03|DELIVER IN PERSON|REG AIR|ld pinto beans. fu +58149|214|69|2|26|28969.46|0.02|0.06|N|O|1997-07-06|1997-04-20|1997-07-22|TAKE BACK RETURN|MAIL|es promise furiously +58149|235|36|3|18|20434.14|0.00|0.06|N|O|1997-04-15|1997-05-31|1997-04-26|TAKE BACK RETURN|MAIL|leep asymptotes +58149|1974|7|4|5|9379.85|0.05|0.00|N|O|1997-04-28|1997-04-27|1997-05-08|TAKE BACK RETURN|REG AIR|nside the slyly +58149|995|64|5|13|24647.87|0.07|0.01|N|O|1997-04-27|1997-04-26|1997-05-07|NONE|REG AIR|lar, bold platele +58149|1234|9|6|15|17028.45|0.07|0.04|N|O|1997-03-20|1997-05-25|1997-03-21|NONE|FOB|owly final excuses about the final, ironic +58150|1839|26|1|23|40039.09|0.02|0.04|R|F|1993-08-15|1993-06-28|1993-09-07|TAKE BACK RETURN|AIR|slyly special waters print across the spec +58150|721|18|2|11|17838.92|0.05|0.07|R|F|1993-07-17|1993-06-20|1993-08-06|NONE|FOB|ins sleep fluffily +58150|1934|23|3|10|18359.30|0.05|0.02|R|F|1993-08-11|1993-08-01|1993-08-15|NONE|FOB|ts cajole furi +58150|1792|35|4|27|45732.33|0.07|0.00|A|F|1993-06-01|1993-07-25|1993-07-01|COLLECT COD|SHIP|nts sleep ironic, ev +58150|525|16|5|35|49893.20|0.08|0.05|A|F|1993-07-16|1993-06-28|1993-07-22|TAKE BACK RETURN|FOB|s thrash blithely against +58150|175|76|6|15|16127.55|0.05|0.02|A|F|1993-07-11|1993-07-28|1993-08-05|NONE|FOB|across the careful +58150|112|13|7|40|40484.40|0.04|0.03|R|F|1993-08-26|1993-07-19|1993-09-08|COLLECT COD|TRUCK|blithely r +58151|1343|44|1|29|36085.86|0.07|0.02|A|F|1994-11-04|1994-11-28|1994-11-05|DELIVER IN PERSON|RAIL|ress tithes are quickly ironic pa +58151|814|14|2|42|72022.02|0.03|0.05|A|F|1994-10-02|1994-12-28|1994-10-12|NONE|SHIP|its. finally express packages hag +58151|702|67|3|38|60902.60|0.01|0.00|A|F|1994-12-02|1994-12-15|1994-12-08|TAKE BACK RETURN|RAIL|uests. blithely r +58151|1670|12|4|6|9430.02|0.10|0.03|A|F|1994-12-25|1994-12-13|1995-01-15|DELIVER IN PERSON|REG AIR|encies sleep alon +58151|159|12|5|10|10591.50|0.10|0.08|R|F|1994-11-29|1994-12-07|1994-12-15|TAKE BACK RETURN|TRUCK|ns cajole about the +58151|1555|56|6|49|71370.95|0.03|0.07|A|F|1994-11-02|1994-11-15|1994-11-28|NONE|MAIL| foxes. caref +58151|1493|33|7|47|65541.03|0.10|0.06|R|F|1994-12-26|1994-11-12|1995-01-06|COLLECT COD|FOB|yly final asymptotes. bold depe +58176|745|78|1|21|34560.54|0.04|0.07|A|F|1994-11-06|1994-10-29|1994-11-26|COLLECT COD|RAIL|ns wake quickly f +58176|1716|43|2|40|64708.40|0.01|0.01|R|F|1994-09-03|1994-09-10|1994-09-19|COLLECT COD|TRUCK|solve carefully quickly f +58177|1635|18|1|7|10756.41|0.03|0.08|A|F|1992-09-06|1992-10-17|1992-09-09|TAKE BACK RETURN|TRUCK|p despite the blithely +58177|1949|38|2|40|74037.60|0.01|0.00|R|F|1992-09-07|1992-11-02|1992-09-21|COLLECT COD|SHIP|usly blithely +58177|807|7|3|11|18785.80|0.01|0.01|A|F|1992-11-16|1992-11-16|1992-12-08|NONE|SHIP|ld excuses cajol +58177|920|89|4|32|58269.44|0.10|0.02|R|F|1992-10-31|1992-10-03|1992-11-06|DELIVER IN PERSON|MAIL|n deposits according to the +58178|1461|1|1|16|21799.36|0.09|0.07|R|F|1992-05-15|1992-03-08|1992-06-12|DELIVER IN PERSON|MAIL|ve the even, pending accounts nod accordi +58178|543|4|2|33|47636.82|0.02|0.04|A|F|1992-02-08|1992-02-22|1992-03-04|COLLECT COD|SHIP|blithely even deposits solve carefully acc +58178|1928|61|3|2|3659.84|0.05|0.07|A|F|1992-02-07|1992-04-07|1992-02-28|DELIVER IN PERSON|RAIL|ts use ironicall +58178|695|27|4|17|27126.73|0.03|0.00|R|F|1992-02-25|1992-02-26|1992-03-13|DELIVER IN PERSON|REG AIR|idly carefully unusual foxes. asymptote +58179|542|43|1|44|63471.76|0.04|0.00|N|O|1995-12-09|1995-11-30|1995-12-26|DELIVER IN PERSON|MAIL| the slyly express re +58179|883|17|2|22|39245.36|0.02|0.06|N|O|1995-11-24|1995-12-03|1995-12-09|DELIVER IN PERSON|SHIP|r, unusual theodolites. requests cajole. +58179|562|23|3|6|8775.36|0.05|0.01|N|O|1995-11-03|1995-10-26|1995-11-13|NONE|FOB|sts detect according to the b +58179|389|18|4|2|2578.76|0.07|0.06|N|O|1995-10-27|1995-10-24|1995-11-04|NONE|FOB|nic ideas after the final, final +58179|226|81|5|40|45048.80|0.05|0.05|N|O|1995-11-20|1995-10-22|1995-12-10|DELIVER IN PERSON|AIR|ly. final r +58180|1293|94|1|33|39411.57|0.07|0.02|N|O|1997-09-27|1997-09-16|1997-10-13|DELIVER IN PERSON|SHIP|promise furiously brave instructions. +58180|283|65|2|16|18932.48|0.02|0.02|N|O|1997-11-08|1997-10-03|1997-11-23|DELIVER IN PERSON|REG AIR| pearls. regular, even dolphins are car +58180|574|75|3|34|50135.38|0.08|0.00|N|O|1997-08-14|1997-09-23|1997-08-24|NONE|AIR|riously even instructions eat furiously r +58180|1585|66|4|44|65409.52|0.02|0.08|N|O|1997-09-13|1997-08-29|1997-09-22|DELIVER IN PERSON|RAIL|s boost along the quickly silent platelet +58180|1801|88|5|39|66409.20|0.02|0.03|N|O|1997-07-22|1997-08-21|1997-08-16|COLLECT COD|AIR|eposits. slyly even d +58180|68|19|6|47|45498.82|0.09|0.06|N|O|1997-09-15|1997-08-21|1997-10-05|NONE|SHIP|ng the furiously even packages cajole +58180|902|5|7|24|43269.60|0.01|0.04|N|O|1997-09-16|1997-09-02|1997-10-11|TAKE BACK RETURN|FOB|quickly final deposit +58181|1765|66|1|34|56669.84|0.03|0.00|A|F|1992-11-11|1992-12-16|1992-11-23|NONE|AIR|bout the furiously even accounts t +58181|1149|58|2|18|18902.52|0.03|0.04|A|F|1992-12-29|1992-12-22|1993-01-09|NONE|SHIP|totes use furio +58181|1540|21|3|6|8649.24|0.08|0.07|A|F|1993-01-26|1992-12-18|1993-01-28|DELIVER IN PERSON|RAIL|nic theodolit +58181|1377|16|4|33|42186.21|0.07|0.04|R|F|1993-01-23|1992-11-30|1993-02-01|COLLECT COD|SHIP|s the regular instructions. re +58181|793|26|5|43|72832.97|0.07|0.05|R|F|1992-10-21|1992-11-22|1992-11-18|COLLECT COD|RAIL|arefully final instructions. slyly c +58181|763|64|6|22|36602.72|0.07|0.07|A|F|1992-11-16|1993-01-05|1992-11-25|TAKE BACK RETURN|FOB|heodolites. furiously ironic excuses +58182|866|67|1|35|61840.10|0.04|0.05|A|F|1994-05-18|1994-04-07|1994-05-29|NONE|RAIL|s haggle about the always ev +58182|278|79|2|19|22387.13|0.02|0.00|A|F|1994-03-17|1994-04-01|1994-03-23|NONE|AIR|dogged deposi +58182|1820|21|3|43|74038.26|0.06|0.02|A|F|1994-04-05|1994-05-14|1994-04-13|NONE|SHIP| wake furiously +58183|1383|84|1|16|20550.08|0.05|0.08|A|F|1994-07-01|1994-05-31|1994-07-29|DELIVER IN PERSON|FOB|into beans are slyly against t +58208|24|50|1|49|45276.98|0.01|0.03|N|O|1998-09-05|1998-09-29|1998-09-18|COLLECT COD|FOB|kages. final de +58208|1631|73|2|41|62837.83|0.01|0.06|N|O|1998-08-14|1998-09-28|1998-09-09|TAKE BACK RETURN|AIR|beans haggle slyl +58208|177|4|3|32|34469.44|0.05|0.04|N|O|1998-07-16|1998-09-20|1998-08-08|COLLECT COD|MAIL|oost fluffily fluffily fin +58208|446|47|4|34|45778.96|0.04|0.06|N|O|1998-09-28|1998-10-06|1998-10-06|COLLECT COD|AIR|ns according to the hockey players +58208|786|19|5|32|53976.96|0.10|0.01|N|O|1998-08-09|1998-10-03|1998-08-20|TAKE BACK RETURN|TRUCK|yers. blithely ironic foxes sleep blit +58209|675|69|1|4|6302.68|0.02|0.03|R|F|1994-01-05|1993-12-05|1994-01-11|COLLECT COD|SHIP|gle alongside of the sp +58209|1603|4|2|44|66202.40|0.01|0.01|R|F|1993-11-26|1993-12-02|1993-12-19|COLLECT COD|FOB|cial account +58209|967|2|3|41|76586.36|0.05|0.04|A|F|1994-01-05|1993-11-26|1994-01-11|COLLECT COD|REG AIR|waters use blithely final realms. slyly ev +58209|838|38|4|2|3477.66|0.04|0.08|R|F|1994-01-11|1993-12-11|1994-02-05|TAKE BACK RETURN|RAIL|counts: quickly pe +58209|89|65|5|6|5934.48|0.03|0.04|R|F|1994-01-11|1993-12-23|1994-01-18|COLLECT COD|MAIL|d, regular pinto beans: +58209|1890|77|6|35|62716.15|0.05|0.02|A|F|1994-01-12|1993-12-24|1994-01-18|NONE|SHIP|packages. blithely regular packages a +58209|1910|55|7|28|50733.48|0.10|0.01|R|F|1993-11-04|1993-11-30|1993-11-07|COLLECT COD|AIR|s detect quickly after the regular, +58210|812|79|1|6|10276.86|0.09|0.04|R|F|1993-03-09|1993-01-13|1993-03-29|TAKE BACK RETURN|AIR|e slyly even foxes eat c +58210|1927|60|2|16|29262.72|0.07|0.03|A|F|1993-01-30|1993-02-14|1993-02-16|NONE|REG AIR|unts nod against the carefully speci +58210|1474|92|3|22|30260.34|0.08|0.04|A|F|1993-03-14|1993-01-09|1993-03-31|COLLECT COD|SHIP|furiously unusual requests mai +58210|605|6|4|7|10539.20|0.03|0.05|A|F|1992-12-26|1993-01-22|1993-01-25|NONE|FOB|ideas. ironic, express platelets aff +58211|1058|94|1|37|35484.85|0.03|0.04|N|O|1998-08-16|1998-07-05|1998-09-12|COLLECT COD|REG AIR| haggle careful +58211|192|19|2|3|3276.57|0.06|0.07|N|O|1998-07-02|1998-08-18|1998-07-03|TAKE BACK RETURN|SHIP|uests. foxes are slyly abo +58211|288|89|3|23|27330.44|0.10|0.03|N|O|1998-08-09|1998-08-18|1998-08-10|DELIVER IN PERSON|SHIP|ng the fluffily bold ideas play ironic +58211|576|7|4|44|64969.08|0.06|0.06|N|O|1998-07-11|1998-08-12|1998-07-12|TAKE BACK RETURN|REG AIR|hely furiously bold deposits. slyly u +58211|1252|27|5|2|2306.50|0.06|0.07|N|O|1998-08-02|1998-07-02|1998-08-23|NONE|TRUCK| dolphins +58212|877|44|1|30|53336.10|0.01|0.07|N|O|1997-02-08|1997-01-28|1997-03-08|DELIVER IN PERSON|FOB|cuses? slyly final deposits thrash sil +58212|734|99|2|31|50676.63|0.01|0.00|N|O|1997-01-29|1996-12-19|1997-02-23|COLLECT COD|AIR|counts. express, special packages about +58213|365|22|1|42|53145.12|0.04|0.01|N|O|1997-01-19|1996-12-23|1997-01-30|COLLECT COD|SHIP|press excuses are above the furiously care +58214|958|93|1|18|33461.10|0.08|0.08|N|O|1996-08-21|1996-07-10|1996-09-07|DELIVER IN PERSON|REG AIR|lithely bli +58214|222|23|2|42|47133.24|0.03|0.00|N|O|1996-09-05|1996-07-14|1996-09-22|TAKE BACK RETURN|AIR|s accounts. asymptotes about +58214|1138|39|3|6|6234.78|0.02|0.06|N|O|1996-08-22|1996-07-28|1996-09-07|NONE|TRUCK|usly even i +58214|1091|92|4|36|35715.24|0.05|0.08|N|O|1996-07-28|1996-08-21|1996-08-06|NONE|RAIL| are express packages. +58214|1036|42|5|32|29984.96|0.00|0.00|N|O|1996-10-08|1996-09-06|1996-11-02|COLLECT COD|REG AIR|slyly even exc +58214|1775|18|6|26|43596.02|0.07|0.07|N|O|1996-07-25|1996-08-08|1996-08-14|COLLECT COD|RAIL|pinto beans cajole f +58214|801|1|7|15|25527.00|0.00|0.06|N|O|1996-08-24|1996-08-02|1996-09-14|TAKE BACK RETURN|TRUCK|slyly even deposits: ironi +58215|434|64|1|49|65387.07|0.07|0.00|A|F|1993-01-25|1992-12-31|1993-02-08|COLLECT COD|TRUCK| pinto beans. caref +58215|1764|49|2|7|11660.32|0.03|0.02|A|F|1992-12-19|1992-11-26|1992-12-21|COLLECT COD|MAIL|sly pending requests affix fu +58240|407|8|1|15|19611.00|0.09|0.02|N|O|1997-04-09|1997-05-23|1997-04-10|DELIVER IN PERSON|REG AIR|lyly carefully ironic acco +58240|381|10|2|32|41004.16|0.00|0.01|N|O|1997-05-23|1997-05-20|1997-06-03|DELIVER IN PERSON|FOB|s around the pinto beans doze again +58240|498|28|3|31|43353.19|0.08|0.01|N|O|1997-06-20|1997-04-18|1997-07-20|DELIVER IN PERSON|TRUCK|y around the quickl +58240|358|87|4|2|2516.70|0.10|0.02|N|O|1997-04-10|1997-05-24|1997-04-14|TAKE BACK RETURN|SHIP|ously pending foxes haggle. fluffily ironi +58241|1179|80|1|37|39966.29|0.04|0.07|A|F|1993-11-22|1993-12-07|1993-11-29|NONE|REG AIR|ggle blithely ironic foxes. frays ac +58241|624|25|2|23|35066.26|0.07|0.02|A|F|1993-10-06|1993-12-01|1993-10-20|TAKE BACK RETURN|FOB|its are furiously ironic theodolites. ca +58241|1936|69|3|2|3675.86|0.08|0.04|A|F|1993-11-17|1993-11-09|1993-11-29|NONE|TRUCK|ously pending packages ab +58241|1045|46|4|41|38787.64|0.02|0.06|A|F|1993-10-07|1993-11-10|1993-11-02|NONE|REG AIR|careful deposits are +58241|1154|91|5|13|13716.95|0.08|0.02|R|F|1993-10-11|1993-11-23|1993-11-05|COLLECT COD|FOB|uriously final packages c +58241|192|71|6|19|20751.61|0.05|0.00|A|F|1993-09-15|1993-11-22|1993-10-10|DELIVER IN PERSON|SHIP|sits use; fur +58241|1989|90|7|7|13236.86|0.08|0.02|A|F|1993-10-15|1993-12-01|1993-10-24|COLLECT COD|AIR|even patterns boost carefully fluffily ca +58242|1396|35|1|27|35029.53|0.10|0.00|A|F|1994-08-26|1994-09-15|1994-08-31|NONE|TRUCK|oost carefully according to the +58242|271|99|2|26|30453.02|0.08|0.06|R|F|1994-09-17|1994-09-15|1994-10-07|COLLECT COD|RAIL|gular deposits boost carefully ac +58242|1598|99|3|19|28492.21|0.06|0.01|A|F|1994-10-06|1994-09-05|1994-10-29|COLLECT COD|TRUCK|nts use carefully +58243|66|42|1|8|7728.48|0.08|0.05|N|O|1997-11-19|1998-01-13|1997-11-20|DELIVER IN PERSON|MAIL| carefully regular deposits b +58244|820|54|1|38|65391.16|0.06|0.04|N|O|1998-01-01|1997-12-22|1998-01-18|DELIVER IN PERSON|REG AIR|s haggle f +58244|196|75|2|27|29597.13|0.02|0.03|N|O|1997-11-16|1997-11-09|1997-12-12|NONE|RAIL|y express dependencies. exc +58245|577|78|1|30|44327.10|0.01|0.06|N|O|1997-03-13|1997-03-02|1997-03-22|DELIVER IN PERSON|TRUCK|s haggle. even, pen +58245|1992|93|2|39|73865.61|0.04|0.01|N|O|1997-05-11|1997-03-07|1997-05-23|NONE|TRUCK|ckly pending gifts. requests above +58245|1686|28|3|45|71445.60|0.04|0.08|N|O|1997-05-02|1997-03-27|1997-05-23|TAKE BACK RETURN|FOB|nwind quickly among +58246|717|82|1|29|46913.59|0.01|0.02|A|F|1994-11-19|1994-09-05|1994-11-24|DELIVER IN PERSON|AIR|cording to +58247|523|14|1|1|1423.52|0.05|0.06|N|O|1995-12-03|1995-11-22|1995-12-15|COLLECT COD|TRUCK|gular, unusual requests are r +58247|1759|2|2|12|19929.00|0.01|0.01|N|O|1996-01-01|1995-12-13|1996-01-07|DELIVER IN PERSON|FOB|ly ironic somas +58247|1209|21|3|42|46628.40|0.04|0.03|N|O|1995-12-23|1995-11-25|1996-01-03|NONE|SHIP|regular dependencies! regular asymptotes +58247|404|92|4|28|36523.20|0.04|0.07|N|O|1995-10-04|1995-10-31|1995-11-03|COLLECT COD|SHIP|leep furiously among the pend +58247|1707|50|5|28|45043.60|0.02|0.02|N|O|1995-11-04|1995-10-29|1995-11-13|COLLECT COD|MAIL| ideas about the bold accounts are sl +58272|1698|81|1|44|70386.36|0.02|0.05|N|O|1996-06-19|1996-07-06|1996-06-23|COLLECT COD|MAIL|iously fluffy requests. expres +58272|607|8|2|41|61811.60|0.09|0.07|N|O|1996-08-02|1996-07-08|1996-08-11|DELIVER IN PERSON|RAIL|iously according to the furiousl +58272|127|6|3|28|28759.36|0.04|0.03|N|O|1996-07-13|1996-07-18|1996-07-19|NONE|RAIL|ular asymptotes. ironically f +58272|1565|6|4|21|30797.76|0.01|0.07|N|O|1996-05-28|1996-07-30|1996-06-10|COLLECT COD|RAIL|. packages boost slyly f +58272|1309|10|5|4|4841.20|0.10|0.08|N|O|1996-08-18|1996-07-20|1996-09-04|COLLECT COD|MAIL|nside the slyly regular packages hi +58272|1777|4|6|27|45326.79|0.10|0.08|N|O|1996-07-08|1996-07-10|1996-08-07|TAKE BACK RETURN|MAIL|he slyly even theodolites solve b +58273|905|40|1|14|25282.60|0.10|0.01|A|F|1993-08-24|1993-07-28|1993-09-08|NONE|TRUCK|g to the unusual, silent acc +58273|1325|64|2|19|23300.08|0.07|0.05|A|F|1993-09-13|1993-08-24|1993-09-21|TAKE BACK RETURN|FOB|quests. final, +58273|769|70|3|48|80148.48|0.10|0.07|R|F|1993-07-30|1993-09-13|1993-08-16|TAKE BACK RETURN|SHIP|special asymptotes wake blithely; idle +58273|496|97|4|1|1396.49|0.02|0.04|R|F|1993-07-27|1993-08-18|1993-08-13|NONE|AIR|t carefully fluff +58273|1250|62|5|3|3453.75|0.10|0.01|R|F|1993-07-31|1993-09-11|1993-08-08|TAKE BACK RETURN|FOB|e finally across the express, ironic d +58273|1938|27|6|46|84636.78|0.09|0.08|R|F|1993-08-30|1993-09-05|1993-09-09|DELIVER IN PERSON|RAIL|requests. bold pinto beans sleep s +58273|1260|98|7|24|27870.24|0.05|0.00|A|F|1993-08-31|1993-09-09|1993-09-22|NONE|SHIP|ges use slyly final, +58274|665|59|1|47|73586.02|0.06|0.04|N|O|1998-04-16|1998-04-26|1998-05-07|COLLECT COD|AIR|ns boost do +58275|531|22|1|27|38651.31|0.05|0.03|N|O|1997-02-17|1996-12-19|1997-03-16|COLLECT COD|TRUCK|according to the fluffily regular water +58275|1367|6|2|31|39319.16|0.00|0.02|N|O|1996-12-21|1996-12-23|1997-01-09|COLLECT COD|SHIP|furiously at the care +58275|733|98|3|46|75151.58|0.00|0.03|N|O|1997-01-18|1997-01-03|1997-01-23|DELIVER IN PERSON|REG AIR|y regular p +58276|1185|58|1|37|40188.66|0.08|0.01|N|O|1996-12-13|1996-11-26|1996-12-30|COLLECT COD|RAIL|s cajole silently +58276|563|24|2|7|10244.92|0.07|0.00|N|O|1996-09-15|1996-12-02|1996-09-28|TAKE BACK RETURN|AIR|among the slyly ironic instructions. re +58276|429|59|3|40|53176.80|0.08|0.00|N|O|1996-12-03|1996-11-21|1996-12-06|COLLECT COD|TRUCK|uffily permanent +58277|259|60|1|44|51007.00|0.08|0.01|R|F|1994-04-01|1994-04-06|1994-04-25|DELIVER IN PERSON|SHIP|ld packages acros +58277|62|88|2|36|34634.16|0.06|0.00|R|F|1994-02-23|1994-03-07|1994-03-06|NONE|FOB|structions. final pin +58277|814|81|3|3|5144.43|0.08|0.06|R|F|1994-05-18|1994-04-16|1994-06-17|TAKE BACK RETURN|FOB| express theodolites +58277|52|28|4|36|34273.80|0.09|0.07|A|F|1994-04-27|1994-04-20|1994-05-05|TAKE BACK RETURN|RAIL|ross the blithely regular patterns +58277|459|47|5|1|1359.45|0.08|0.00|R|F|1994-04-15|1994-04-18|1994-04-30|DELIVER IN PERSON|FOB|eans. slyly +58278|723|20|1|37|60077.64|0.04|0.01|A|F|1992-12-26|1992-11-14|1993-01-20|NONE|MAIL|c requests are slyly. furious +58278|527|88|2|22|31405.44|0.05|0.03|A|F|1992-09-23|1992-11-07|1992-10-21|NONE|AIR|uriously slyly express de +58278|1772|57|3|43|71972.11|0.02|0.03|A|F|1992-11-24|1992-10-31|1992-12-22|DELIVER IN PERSON|SHIP|cajole furiously. +58278|1253|91|4|17|19622.25|0.08|0.02|R|F|1992-11-05|1992-11-28|1992-12-01|DELIVER IN PERSON|REG AIR|e even accounts. blithely spe +58279|293|21|1|4|4773.16|0.06|0.06|A|F|1994-07-03|1994-06-23|1994-07-28|COLLECT COD|SHIP|y pending packages haggle accounts; car +58279|117|44|2|9|9153.99|0.01|0.00|R|F|1994-05-11|1994-06-30|1994-05-17|TAKE BACK RETURN|FOB|of the unusual requests affix bli +58279|1450|29|3|4|5405.80|0.02|0.05|A|F|1994-06-18|1994-06-11|1994-07-03|COLLECT COD|AIR| slyly final somas. unusual instructions +58279|272|54|4|12|14067.24|0.03|0.08|R|F|1994-08-01|1994-06-27|1994-08-30|TAKE BACK RETURN|RAIL|ngside of the slyly ev +58304|1895|25|1|43|77266.27|0.05|0.01|N|O|1996-05-16|1996-04-26|1996-06-08|TAKE BACK RETURN|TRUCK|d slyly above the even, fin +58304|326|55|2|2|2452.64|0.08|0.01|N|O|1996-03-08|1996-04-16|1996-03-31|COLLECT COD|REG AIR|pending theodolit +58305|962|97|1|39|72655.44|0.04|0.02|R|F|1994-09-25|1994-09-29|1994-10-02|NONE|TRUCK|pending dependencies-- fluf +58306|1882|12|1|42|74922.96|0.07|0.00|N|O|1996-09-07|1996-08-12|1996-09-09|TAKE BACK RETURN|SHIP|equests. slyly pending platelet +58306|249|4|2|10|11492.40|0.00|0.07|N|O|1996-10-10|1996-09-10|1996-10-15|DELIVER IN PERSON|MAIL|ffix furiously regular +58306|929|30|3|21|38428.32|0.02|0.03|N|O|1996-07-21|1996-08-27|1996-07-28|DELIVER IN PERSON|FOB|y after the furiously ironic packages. e +58306|1621|45|4|10|15226.20|0.08|0.01|N|O|1996-10-03|1996-07-21|1996-10-16|TAKE BACK RETURN|FOB|egular requests. f +58307|1623|6|1|13|19820.06|0.01|0.08|A|F|1995-01-14|1994-12-18|1995-01-30|DELIVER IN PERSON|FOB|ges. slyly quick esc +58307|312|97|2|34|41218.54|0.10|0.07|R|F|1995-01-09|1994-12-19|1995-01-30|NONE|TRUCK|dencies. furiously regular accoun +58307|1074|80|3|15|14626.05|0.04|0.07|R|F|1994-12-20|1995-01-08|1995-01-12|TAKE BACK RETURN|RAIL|al packages. regular theodolites along the +58307|1505|26|4|39|54853.50|0.01|0.06|R|F|1995-02-26|1995-01-24|1995-03-02|TAKE BACK RETURN|MAIL|carefully among the re +58308|6|82|1|28|25368.00|0.00|0.05|A|F|1993-09-17|1993-07-18|1993-10-07|TAKE BACK RETURN|AIR|iously even requests. caref +58308|1059|65|2|32|30721.60|0.02|0.02|A|F|1993-09-07|1993-06-25|1993-09-25|DELIVER IN PERSON|SHIP| bold foxes. furiously ironic accoun +58308|818|85|3|19|32657.39|0.02|0.01|A|F|1993-06-08|1993-06-27|1993-07-03|NONE|FOB|refully about the slyly regular de +58308|109|36|4|2|2018.20|0.02|0.05|A|F|1993-07-31|1993-07-12|1993-08-22|DELIVER IN PERSON|SHIP|bold deposits engage +58308|1495|13|5|16|22343.84|0.02|0.00|A|F|1993-07-21|1993-07-06|1993-08-16|DELIVER IN PERSON|TRUCK| ironic hockey players. c +58309|780|45|1|48|80677.44|0.03|0.01|N|O|1997-10-26|1997-09-02|1997-10-27|TAKE BACK RETURN|REG AIR|encies nag against the carefully expres +58309|559|20|2|18|26271.90|0.09|0.06|N|O|1997-11-14|1997-09-07|1997-12-14|DELIVER IN PERSON|RAIL|eep slyly. instructions cajole against t +58309|1843|87|3|44|76772.96|0.09|0.08|N|O|1997-09-14|1997-10-13|1997-10-09|COLLECT COD|RAIL|beans play +58309|1482|83|4|29|40120.92|0.00|0.04|N|O|1997-10-19|1997-10-13|1997-10-24|DELIVER IN PERSON|RAIL| requests wake furiously +58309|1030|36|5|44|40965.32|0.05|0.08|N|O|1997-10-30|1997-09-26|1997-11-26|DELIVER IN PERSON|RAIL|ly bold deposits +58310|25|1|1|26|24050.52|0.00|0.03|R|F|1994-05-21|1994-05-14|1994-05-23|COLLECT COD|SHIP|e blithely spe +58310|1737|22|2|13|21303.49|0.06|0.08|A|F|1994-04-13|1994-04-30|1994-04-15|DELIVER IN PERSON|REG AIR|e regular accou +58310|1836|23|3|25|43445.75|0.07|0.01|R|F|1994-03-04|1994-04-23|1994-03-21|DELIVER IN PERSON|TRUCK|nusual packages; slyly spe +58310|312|13|4|7|8486.17|0.04|0.02|R|F|1994-05-13|1994-04-12|1994-06-02|NONE|MAIL| use quickly across th +58310|1985|30|5|30|56609.40|0.01|0.00|A|F|1994-06-11|1994-05-18|1994-06-20|COLLECT COD|RAIL|e alongside of +58311|627|59|1|24|36662.88|0.07|0.08|N|O|1996-05-06|1996-07-28|1996-05-15|DELIVER IN PERSON|SHIP|ts. final, final accounts sleep a +58311|882|83|2|15|26743.20|0.03|0.08|N|O|1996-08-07|1996-07-15|1996-08-31|COLLECT COD|REG AIR| dogged packages inte +58311|169|96|3|17|18175.72|0.10|0.05|N|O|1996-06-12|1996-05-31|1996-07-01|TAKE BACK RETURN|MAIL|o beans int +58311|1335|50|4|15|18544.95|0.10|0.01|N|O|1996-07-17|1996-06-01|1996-07-23|DELIVER IN PERSON|MAIL|aringly special i +58311|745|46|5|12|19748.88|0.00|0.01|N|O|1996-07-31|1996-07-23|1996-08-04|TAKE BACK RETURN|FOB|lar requests against the express courts de +58336|23|24|1|34|31382.68|0.08|0.04|R|F|1994-09-23|1994-09-05|1994-10-18|NONE|MAIL|fily even ac +58336|205|33|2|29|32050.80|0.05|0.04|A|F|1994-10-21|1994-08-05|1994-10-26|NONE|FOB|y regular p +58336|132|85|3|19|19610.47|0.06|0.04|A|F|1994-10-30|1994-09-27|1994-11-20|COLLECT COD|REG AIR|ely. special foxes above the blith +58336|960|29|4|7|13026.72|0.05|0.03|A|F|1994-10-23|1994-08-28|1994-10-29|NONE|TRUCK| the accounts. ironic, even reque +58337|905|8|1|40|72236.00|0.08|0.07|R|F|1994-06-21|1994-07-11|1994-07-02|TAKE BACK RETURN|AIR|nding accounts. requests haggle ca +58337|1033|39|2|47|43899.41|0.09|0.08|R|F|1994-07-09|1994-07-27|1994-08-02|DELIVER IN PERSON|SHIP|quickly final requests +58337|863|97|3|22|38804.92|0.03|0.01|R|F|1994-06-02|1994-08-03|1994-06-07|TAKE BACK RETURN|FOB| express, regular accounts. +58338|196|49|1|35|38366.65|0.05|0.06|A|F|1992-08-14|1992-10-05|1992-08-16|COLLECT COD|RAIL|ithely pending ide +58338|1884|71|2|31|55362.28|0.02|0.01|A|F|1992-07-29|1992-09-24|1992-08-24|TAKE BACK RETURN|AIR| of the blithely unu +58339|712|77|1|24|38705.04|0.04|0.01|A|F|1994-09-25|1994-08-10|1994-10-03|COLLECT COD|TRUCK|ckly above the quickly ironic +58339|460|19|2|42|57139.32|0.02|0.01|A|F|1994-08-11|1994-08-09|1994-08-17|COLLECT COD|FOB|ress, special tithes +58339|1177|14|3|7|7547.19|0.01|0.01|A|F|1994-08-04|1994-07-14|1994-09-02|NONE|RAIL|s. carefully even braids sleep. blithely pe +58340|461|49|1|16|21783.36|0.05|0.03|R|F|1995-03-23|1995-03-25|1995-04-11|COLLECT COD|RAIL| blithely blithely final deposits-- sau +58340|458|88|2|33|44828.85|0.02|0.04|R|F|1995-03-05|1995-02-13|1995-03-25|DELIVER IN PERSON|AIR| requests. quickly final warho +58340|1713|40|3|41|66203.11|0.06|0.01|R|F|1995-01-30|1995-02-14|1995-02-06|COLLECT COD|TRUCK|quests. ironic foxes use slyly +58340|1782|9|4|34|57248.52|0.10|0.04|R|F|1995-03-06|1995-02-21|1995-04-01|COLLECT COD|SHIP|y even packages nag blithely ideas +58341|1800|85|1|2|3403.60|0.09|0.04|A|F|1995-04-18|1995-03-14|1995-04-30|COLLECT COD|MAIL|onic ideas. carefully +58342|498|28|1|4|5593.96|0.04|0.04|A|F|1995-05-17|1995-05-28|1995-06-03|TAKE BACK RETURN|TRUCK|ly against the slyly final instructions. +58342|357|14|2|34|42749.90|0.04|0.05|R|F|1995-04-13|1995-06-19|1995-04-23|TAKE BACK RETURN|MAIL|ly along the express pinto b +58342|1311|12|3|16|19396.96|0.02|0.00|R|F|1995-05-06|1995-05-02|1995-05-13|DELIVER IN PERSON|TRUCK|. slyly special theodol +58342|897|98|4|40|71915.60|0.10|0.06|A|F|1995-06-07|1995-06-05|1995-06-17|NONE|MAIL| even, bold pinto beans hinder furious +58342|719|20|5|13|21056.23|0.03|0.02|A|F|1995-04-20|1995-06-11|1995-05-03|TAKE BACK RETURN|MAIL|express foxes integrate. slyly final req +58342|1130|3|6|33|34027.29|0.02|0.04|N|F|1995-05-29|1995-05-11|1995-06-27|DELIVER IN PERSON|TRUCK|ounts! bold deposits are id +58342|1844|31|7|4|6983.36|0.10|0.06|N|O|1995-07-22|1995-06-18|1995-08-16|DELIVER IN PERSON|MAIL|fully regular packages +58343|1936|37|1|11|20217.23|0.00|0.08|R|F|1994-05-09|1994-03-26|1994-06-03|TAKE BACK RETURN|MAIL|ix carefully above the ironical +58343|865|99|2|20|35317.20|0.03|0.05|A|F|1994-03-17|1994-02-27|1994-04-10|NONE|MAIL|fluffily final re +58343|1953|42|3|29|53793.55|0.09|0.05|A|F|1994-03-01|1994-03-05|1994-03-10|DELIVER IN PERSON|SHIP|ravely special warthogs alongside of the s +58343|1940|85|4|2|3683.88|0.03|0.04|A|F|1994-02-12|1994-04-10|1994-02-23|TAKE BACK RETURN|AIR| dependencies wake +58343|1062|63|5|41|39485.46|0.04|0.06|A|F|1994-02-01|1994-04-05|1994-02-27|DELIVER IN PERSON|MAIL|ideas slee +58343|844|45|6|19|33151.96|0.09|0.05|R|F|1994-02-15|1994-02-17|1994-03-05|NONE|REG AIR|fully pending deposits. instru +58368|1566|87|1|35|51364.60|0.07|0.02|R|F|1992-10-08|1992-09-28|1992-10-24|TAKE BACK RETURN|AIR|ions sleep fluffily orbits. blithe +58368|825|92|2|7|12080.74|0.10|0.03|R|F|1992-10-16|1992-09-13|1992-10-22|TAKE BACK RETURN|AIR| ironic depos +58368|1245|83|3|31|35533.44|0.09|0.07|A|F|1992-10-10|1992-09-20|1992-10-27|TAKE BACK RETURN|REG AIR|ooze furiously quickly en +58368|1282|57|4|21|24848.88|0.01|0.01|R|F|1992-10-05|1992-09-05|1992-10-18|COLLECT COD|AIR|he blithely even accounts hag +58368|724|21|5|30|48741.60|0.00|0.03|A|F|1992-10-29|1992-09-18|1992-11-21|TAKE BACK RETURN|RAIL|s sleep slyly even +58368|1412|52|6|40|52536.40|0.04|0.08|A|F|1992-10-18|1992-08-17|1992-11-11|TAKE BACK RETURN|FOB|ly ironic accounts are b +58368|782|15|7|8|13462.24|0.05|0.06|A|F|1992-08-16|1992-09-02|1992-08-17|NONE|REG AIR|ets boost slyly. fi +58369|1397|74|1|14|18177.46|0.09|0.00|R|F|1992-10-31|1992-10-09|1992-11-03|TAKE BACK RETURN|SHIP|deposits. never fluffy r +58369|1609|10|2|45|67977.00|0.00|0.03|A|F|1992-09-19|1992-11-22|1992-09-26|TAKE BACK RETURN|AIR|d dependencies about the furiousl +58369|779|12|3|21|35275.17|0.10|0.08|R|F|1992-09-05|1992-11-15|1992-09-29|COLLECT COD|RAIL|refully regular ide +58370|31|32|1|41|38172.23|0.07|0.03|A|F|1992-06-15|1992-05-09|1992-07-06|DELIVER IN PERSON|MAIL|c requests wake. slyly +58370|1126|35|2|32|32867.84|0.04|0.06|R|F|1992-04-13|1992-05-06|1992-04-26|TAKE BACK RETURN|AIR|the ironic packages cajole around the fl +58370|1032|33|3|16|14928.48|0.10|0.00|A|F|1992-04-25|1992-05-30|1992-05-01|COLLECT COD|AIR|ideas are even, express +58370|1192|29|4|48|52473.12|0.04|0.08|A|F|1992-05-12|1992-06-20|1992-05-26|TAKE BACK RETURN|TRUCK|st furiously +58371|1153|26|1|48|50599.20|0.10|0.02|A|F|1993-06-15|1993-08-01|1993-06-19|COLLECT COD|AIR|es haggle +58371|1613|14|2|28|42409.08|0.02|0.06|A|F|1993-08-08|1993-07-22|1993-08-27|COLLECT COD|TRUCK|uffy excuses haggle. foxes above the the +58371|703|100|3|50|80185.00|0.00|0.06|A|F|1993-08-03|1993-08-02|1993-08-10|COLLECT COD|TRUCK|nto beans integrate carefull +58371|108|61|4|38|38307.80|0.07|0.06|A|F|1993-07-08|1993-08-01|1993-07-28|COLLECT COD|MAIL| ironic req +58371|944|79|5|7|12914.58|0.08|0.04|A|F|1993-05-27|1993-07-07|1993-06-12|COLLECT COD|FOB|lyly against the quickly regular accounts +58371|1563|64|6|45|65905.20|0.03|0.04|A|F|1993-05-27|1993-08-06|1993-06-21|COLLECT COD|FOB| even pinto beans. bold asympt +58371|862|29|7|41|72277.26|0.02|0.05|A|F|1993-06-23|1993-07-05|1993-07-10|DELIVER IN PERSON|SHIP|hely even foxes. furiously furious p +58372|579|80|1|11|16275.27|0.10|0.04|R|F|1995-05-01|1995-05-19|1995-05-16|TAKE BACK RETURN|MAIL|losely even platelets. even foxes s +58372|111|38|2|31|31344.41|0.03|0.03|N|F|1995-06-15|1995-05-21|1995-07-07|NONE|SHIP|quickly slyly special instr +58372|71|22|3|43|41756.01|0.03|0.04|N|O|1995-06-29|1995-06-13|1995-07-06|TAKE BACK RETURN|REG AIR|furiously ironic p +58372|497|27|4|26|36334.74|0.05|0.03|N|F|1995-05-28|1995-06-24|1995-06-19|NONE|MAIL|ven requests. stealthil +58372|925|60|5|21|38344.32|0.06|0.04|A|F|1995-04-21|1995-06-22|1995-05-10|DELIVER IN PERSON|MAIL|bold packages boost bli +58372|495|54|6|47|65588.03|0.08|0.04|R|F|1995-06-04|1995-05-14|1995-06-06|TAKE BACK RETURN|AIR|jole after the ironic, pending pi +58372|794|59|7|25|42369.75|0.02|0.02|N|O|1995-07-28|1995-05-24|1995-08-16|TAKE BACK RETURN|REG AIR|foxes-- carefully final foxes nag bli +58373|115|94|1|1|1015.11|0.05|0.08|N|O|1996-10-08|1996-11-11|1996-11-07|NONE|AIR|blithely pending +58374|1740|41|1|46|75520.04|0.08|0.05|N|O|1997-08-30|1997-09-09|1997-09-20|DELIVER IN PERSON|REG AIR|encies; slyly express r +58374|89|65|2|12|11868.96|0.02|0.05|N|O|1997-08-06|1997-08-17|1997-08-30|DELIVER IN PERSON|REG AIR|ackages cajole furiously b +58374|877|44|3|37|65781.19|0.00|0.04|N|O|1997-10-12|1997-09-21|1997-10-28|COLLECT COD|FOB|ly. sometimes silent courts af +58374|1368|69|4|50|63468.00|0.01|0.05|N|O|1997-10-13|1997-08-13|1997-10-28|TAKE BACK RETURN|MAIL|e slyly regular deposits. final, unus +58375|26|27|1|30|27780.60|0.05|0.07|N|O|1996-06-15|1996-06-01|1996-07-03|NONE|REG AIR| packages. qu +58375|761|26|2|9|14955.84|0.06|0.02|N|O|1996-04-09|1996-05-13|1996-04-21|COLLECT COD|RAIL|blithely ironic deposits sleep deposits: +58375|132|85|3|32|33028.16|0.08|0.03|N|O|1996-06-02|1996-05-22|1996-06-26|COLLECT COD|TRUCK|special pinto +58375|640|41|4|48|73950.72|0.02|0.08|N|O|1996-04-26|1996-06-10|1996-05-04|NONE|AIR|tructions across the regular +58375|587|78|5|42|62478.36|0.07|0.05|N|O|1996-05-25|1996-04-26|1996-06-06|DELIVER IN PERSON|AIR|s play slyly finally even deposi +58375|318|47|6|48|58478.88|0.08|0.04|N|O|1996-07-04|1996-06-21|1996-07-29|NONE|SHIP|al deposits haggle +58400|1667|9|1|25|39216.50|0.06|0.06|N|O|1998-03-21|1998-01-30|1998-04-19|NONE|AIR|usual ideas haggle quickly +58400|1015|21|2|16|14656.16|0.05|0.03|N|O|1998-02-15|1998-01-17|1998-02-18|DELIVER IN PERSON|SHIP|ding, final depend +58400|677|40|3|31|48907.77|0.00|0.00|N|O|1998-03-07|1998-01-29|1998-03-29|TAKE BACK RETURN|AIR|gle slyly inside the +58400|1653|54|4|35|54412.75|0.00|0.07|N|O|1998-01-02|1998-01-29|1998-01-30|NONE|TRUCK|ckly quickly even asympto +58401|1541|22|1|43|62029.22|0.03|0.00|N|O|1997-01-15|1997-03-04|1997-02-01|COLLECT COD|MAIL|. express foxes boost around the express +58401|1819|6|2|36|61949.16|0.00|0.04|N|O|1997-03-08|1997-03-01|1997-03-26|TAKE BACK RETURN|SHIP|ly unusual +58401|1283|21|3|13|15395.64|0.04|0.02|N|O|1997-03-28|1997-03-28|1997-04-26|DELIVER IN PERSON|RAIL| excuses believe f +58401|1992|93|4|41|77653.59|0.06|0.08|N|O|1997-04-18|1997-03-07|1997-04-22|DELIVER IN PERSON|SHIP|deposits. fluffily +58402|150|3|1|34|35705.10|0.03|0.07|N|O|1997-06-09|1997-04-09|1997-06-25|DELIVER IN PERSON|AIR|y unusual requests accordin +58402|878|45|2|48|85385.76|0.01|0.04|N|O|1997-04-07|1997-04-21|1997-04-10|DELIVER IN PERSON|FOB| fluffily aft +58403|49|50|1|27|25624.08|0.08|0.05|N|O|1996-03-01|1996-02-02|1996-03-22|NONE|SHIP|ular deposits are packag +58403|1246|21|2|45|51625.80|0.03|0.03|N|O|1996-03-24|1996-02-17|1996-03-26|NONE|MAIL| theodolite +58403|562|23|3|26|38026.56|0.07|0.04|N|O|1996-04-01|1996-02-04|1996-04-25|DELIVER IN PERSON|TRUCK|ckly unusual packages. sly +58403|1688|12|4|24|38152.32|0.00|0.01|N|O|1996-03-26|1996-03-05|1996-04-08|COLLECT COD|FOB| requests haggle +58403|273|28|5|2|2346.54|0.05|0.03|N|O|1996-02-07|1996-02-29|1996-03-01|NONE|RAIL|quests among the furiously reg +58404|48|24|1|24|22752.96|0.08|0.00|R|F|1994-02-26|1994-01-27|1994-03-20|NONE|REG AIR|ngside of the slyly even accounts. slyl +58404|1692|34|2|4|6374.76|0.02|0.08|R|F|1994-03-03|1994-02-24|1994-03-10|TAKE BACK RETURN|AIR| cajole above the +58405|357|58|1|2|2514.70|0.09|0.08|N|O|1998-10-30|1998-10-21|1998-11-10|DELIVER IN PERSON|AIR|slyly above the +58405|1076|77|2|2|1954.14|0.05|0.05|N|O|1998-10-12|1998-09-13|1998-10-17|DELIVER IN PERSON|TRUCK|en sheaves cajole quietly. slyly unusual du +58405|665|28|3|43|67323.38|0.02|0.08|N|O|1998-10-27|1998-09-15|1998-11-24|NONE|MAIL|e deposits. deposits cajol +58405|1145|46|4|49|51260.86|0.07|0.04|N|O|1998-08-16|1998-09-30|1998-09-10|COLLECT COD|FOB|after the accounts. ironic, spe +58405|1593|34|5|21|31386.39|0.07|0.03|N|O|1998-11-01|1998-09-05|1998-11-07|TAKE BACK RETURN|SHIP|sleep blithely carefully +58405|1346|47|6|6|7484.04|0.02|0.07|N|O|1998-11-21|1998-08-29|1998-12-21|NONE|REG AIR|n, even warthogs wake +58406|1001|37|1|17|15334.00|0.02|0.00|N|O|1996-09-11|1996-09-05|1996-09-13|TAKE BACK RETURN|MAIL| beans. theodolites mold quickly +58406|1540|41|2|31|44687.74|0.04|0.00|N|O|1996-07-17|1996-09-21|1996-07-25|DELIVER IN PERSON|RAIL|fily blithely +58406|907|76|3|33|59660.70|0.03|0.03|N|O|1996-08-23|1996-09-20|1996-09-07|COLLECT COD|MAIL| express packages nag quickly furiou +58407|1463|64|1|24|32747.04|0.08|0.05|N|F|1995-06-08|1995-07-24|1995-06-24|NONE|FOB|lyly regular requests? blithely fi +58407|907|10|2|19|34350.10|0.07|0.05|A|F|1995-05-11|1995-07-09|1995-05-18|TAKE BACK RETURN|MAIL|y pending requests. carefully regular ins +58432|425|84|1|8|10603.36|0.04|0.07|A|F|1994-06-07|1994-06-29|1994-06-13|COLLECT COD|TRUCK|h slyly pend +58432|220|2|2|5|5601.10|0.06|0.01|A|F|1994-06-27|1994-07-17|1994-07-15|DELIVER IN PERSON|AIR|elets sublate +58433|1549|90|1|12|17406.48|0.02|0.02|N|O|1995-09-18|1995-08-15|1995-10-01|DELIVER IN PERSON|FOB|onic packages nag. even, fina +58433|503|64|2|36|50526.00|0.03|0.08|N|O|1995-10-20|1995-09-07|1995-11-11|TAKE BACK RETURN|FOB| sleep along the boldl +58433|962|63|3|8|14903.68|0.05|0.05|N|O|1995-10-12|1995-09-24|1995-11-02|COLLECT COD|SHIP|furiously ironic waters +58433|1660|43|4|30|46849.80|0.09|0.03|N|O|1995-10-19|1995-09-15|1995-10-23|COLLECT COD|RAIL|y silent p +58433|157|58|5|19|20085.85|0.03|0.08|N|O|1995-07-10|1995-09-30|1995-07-28|DELIVER IN PERSON|TRUCK|t the regular accounts sleep fur +58433|1109|18|6|1|1010.10|0.07|0.06|N|O|1995-08-26|1995-08-10|1995-09-12|TAKE BACK RETURN|RAIL|sits sleep care +58434|20|21|1|40|36800.80|0.01|0.03|R|F|1994-03-14|1994-05-28|1994-04-03|TAKE BACK RETURN|FOB|e blithely final accounts. quickly +58434|467|55|2|6|8204.76|0.08|0.00|R|F|1994-07-01|1994-04-28|1994-07-25|NONE|TRUCK| final depe +58434|185|12|3|25|27129.50|0.08|0.01|A|F|1994-06-04|1994-06-05|1994-06-18|DELIVER IN PERSON|REG AIR|ndencies. bold ins +58435|1875|19|1|43|76405.41|0.08|0.00|R|F|1992-08-11|1992-06-17|1992-08-28|NONE|RAIL|ans. slyly eve +58435|914|17|2|25|45372.75|0.01|0.01|R|F|1992-07-18|1992-07-15|1992-08-12|TAKE BACK RETURN|AIR|ccounts. i +58435|1493|11|3|5|6972.45|0.10|0.08|R|F|1992-08-26|1992-06-22|1992-09-01|NONE|AIR|s. blithely unusual packag +58436|1216|91|1|15|16758.15|0.06|0.01|N|O|1997-05-30|1997-05-21|1997-06-14|TAKE BACK RETURN|REG AIR| theodolites nod furiously according +58436|385|86|2|2|2570.76|0.03|0.04|N|O|1997-04-23|1997-04-04|1997-05-06|NONE|SHIP|pecial foxes. slyly bold asymptotes us +58436|1879|80|3|4|7123.48|0.01|0.08|N|O|1997-06-19|1997-04-13|1997-06-24|DELIVER IN PERSON|TRUCK|. slyly ironic pea +58437|118|19|1|1|1018.11|0.09|0.07|N|O|1998-01-24|1998-01-05|1998-02-04|COLLECT COD|SHIP| slow pinto beans. ironic, +58437|1523|64|2|8|11396.16|0.06|0.04|N|O|1997-11-02|1997-12-09|1997-11-26|DELIVER IN PERSON|MAIL|blithely regular theodolites are along +58437|1082|88|3|28|27526.24|0.02|0.05|N|O|1998-01-27|1997-12-04|1998-02-18|TAKE BACK RETURN|FOB|y express escapades. slyly bold +58437|1117|90|4|17|17307.87|0.10|0.01|N|O|1998-02-01|1998-01-06|1998-02-15|COLLECT COD|FOB|s wake final, bold theodolites. deposits a +58437|1154|27|5|37|39040.55|0.07|0.08|N|O|1998-01-03|1997-11-18|1998-01-06|DELIVER IN PERSON|RAIL|ackages use after +58437|1177|14|6|20|21563.40|0.09|0.06|N|O|1997-11-07|1997-11-22|1997-11-13|TAKE BACK RETURN|FOB|ely final requests. slyly fi +58437|283|65|7|28|33131.84|0.07|0.04|N|O|1998-01-11|1997-12-29|1998-02-02|TAKE BACK RETURN|SHIP|ely silent pinto beans +58438|1837|67|1|17|29560.11|0.09|0.06|N|O|1996-03-09|1996-03-16|1996-03-29|TAKE BACK RETURN|FOB| pending dolphins grow silent theodolite +58438|307|36|2|2|2414.60|0.02|0.00|N|O|1996-02-18|1996-03-05|1996-03-06|TAKE BACK RETURN|AIR|al theodolites. regular platele +58438|1421|100|3|23|30415.66|0.09|0.03|N|O|1996-03-09|1996-03-30|1996-03-10|DELIVER IN PERSON|RAIL| must have to wake fluffily. unusual foxes +58438|1872|73|4|28|49668.36|0.04|0.05|N|O|1996-04-16|1996-04-10|1996-05-08|NONE|TRUCK|refully specia +58439|1037|8|1|38|35645.14|0.01|0.05|N|O|1996-05-05|1996-06-07|1996-05-14|COLLECT COD|TRUCK|kages sleep about the regular, p +58439|180|81|2|19|20523.42|0.08|0.04|N|O|1996-04-13|1996-05-16|1996-04-22|COLLECT COD|MAIL|fter the slyly final ideas. quickly +58439|902|5|3|27|48678.30|0.08|0.06|N|O|1996-04-09|1996-04-11|1996-05-08|COLLECT COD|REG AIR|nstructions haggle. furiou +58464|313|14|1|5|6066.55|0.05|0.03|N|O|1998-02-10|1998-01-04|1998-03-04|DELIVER IN PERSON|TRUCK|sly ironic depos +58464|1028|29|2|14|13006.28|0.05|0.00|N|O|1997-11-11|1998-01-29|1997-12-03|NONE|FOB|ifts. blithely bold req +58464|1333|10|3|43|53076.19|0.01|0.04|N|O|1997-12-04|1998-02-03|1998-01-02|NONE|AIR| accounts boost carefully. ironic, +58464|1326|65|4|36|44183.52|0.02|0.05|N|O|1998-02-10|1998-01-02|1998-03-11|TAKE BACK RETURN|FOB| among the slyly ex +58464|229|30|5|15|16938.30|0.08|0.02|N|O|1998-01-19|1997-12-23|1998-01-27|COLLECT COD|FOB|ng requests are fluffily furious excuses. b +58464|566|57|6|8|11732.48|0.04|0.08|N|O|1998-02-21|1998-01-22|1998-03-10|NONE|AIR|counts might nod about the blithely speci +58464|1522|43|7|26|37011.52|0.02|0.02|N|O|1998-02-15|1998-01-27|1998-03-12|DELIVER IN PERSON|REG AIR|regular asymptotes wake above the dar +58465|1871|1|1|5|8864.35|0.10|0.05|N|O|1998-05-26|1998-04-05|1998-06-07|TAKE BACK RETURN|AIR|the accounts boost furiously u +58465|1787|14|2|14|23642.92|0.06|0.04|N|O|1998-04-20|1998-05-15|1998-05-11|NONE|MAIL|eep around the furiously regular +58465|727|28|3|47|76502.84|0.06|0.08|N|O|1998-05-30|1998-05-07|1998-06-29|NONE|SHIP|en requests. silent instructions +58465|896|30|4|22|39531.58|0.05|0.08|N|O|1998-02-26|1998-03-31|1998-03-21|COLLECT COD|TRUCK|e. slyly unusual Tiresias nag slyly acro +58465|1497|15|5|33|46150.17|0.06|0.00|N|O|1998-02-20|1998-03-18|1998-03-14|DELIVER IN PERSON|RAIL|posits haggle carefull +58465|1045|81|6|24|22704.96|0.05|0.02|N|O|1998-04-02|1998-04-27|1998-04-29|COLLECT COD|SHIP|kages unwind. even deposits hang s +58465|614|8|7|13|19689.93|0.01|0.03|N|O|1998-06-13|1998-03-21|1998-06-17|NONE|RAIL| asymptotes acros +58466|414|2|1|49|64406.09|0.07|0.06|A|F|1993-12-17|1994-01-14|1993-12-29|DELIVER IN PERSON|MAIL|ependencies. deposits nag. ruthlessly sil +58466|1416|17|2|3|3952.23|0.08|0.08|A|F|1994-01-12|1993-12-10|1994-01-14|COLLECT COD|AIR|furiously regular braid +58467|296|24|1|6|7177.74|0.03|0.04|N|O|1996-03-25|1996-05-22|1996-03-27|COLLECT COD|MAIL|luffily unusual platelets print +58467|1796|39|2|24|40746.96|0.02|0.05|N|O|1996-04-16|1996-04-16|1996-05-02|NONE|MAIL|s about the unus +58467|1811|41|3|13|22266.53|0.00|0.01|N|O|1996-04-13|1996-04-06|1996-04-18|DELIVER IN PERSON|AIR|cuses. fluffily bold pinto beans pr +58467|742|43|4|48|78851.52|0.01|0.00|N|O|1996-06-15|1996-05-19|1996-06-29|TAKE BACK RETURN|MAIL|xes. regular, +58467|1626|68|5|50|76381.00|0.02|0.02|N|O|1996-05-21|1996-05-06|1996-06-10|NONE|RAIL|quickly even packages. iro +58467|1938|71|6|39|71757.27|0.07|0.05|N|O|1996-06-15|1996-05-06|1996-07-08|DELIVER IN PERSON|RAIL|ly regular ideas nag carefully. furious +58468|614|46|1|7|10602.27|0.05|0.02|R|F|1993-05-27|1993-06-26|1993-05-29|DELIVER IN PERSON|FOB|lyly. final, unusual a +58468|271|26|2|45|52707.15|0.02|0.04|A|F|1993-08-11|1993-06-26|1993-08-27|DELIVER IN PERSON|TRUCK| hinder after the furiously final pack +58468|620|52|3|21|31933.02|0.09|0.04|A|F|1993-05-20|1993-07-06|1993-05-23|DELIVER IN PERSON|RAIL|he instructio +58469|403|91|1|17|22157.80|0.08|0.03|N|O|1996-06-05|1996-06-03|1996-06-14|DELIVER IN PERSON|REG AIR|ound the fluffily regular accounts caj +58469|1713|56|2|47|75891.37|0.02|0.00|N|O|1996-05-30|1996-04-23|1996-06-27|TAKE BACK RETURN|MAIL|jole among the final, re +58469|345|30|3|39|48568.26|0.00|0.03|N|O|1996-06-25|1996-05-27|1996-07-03|DELIVER IN PERSON|MAIL|ual pinto beans. flu +58470|323|52|1|2|2446.64|0.05|0.06|N|O|1995-08-11|1995-08-31|1995-09-07|NONE|RAIL|yly even deposits are slyly. blithely pend +58470|193|46|2|35|38261.65|0.01|0.08|N|O|1995-09-01|1995-08-31|1995-09-18|TAKE BACK RETURN|TRUCK| furiously regular ideas cajole +58470|1153|26|3|37|39003.55|0.06|0.01|N|O|1995-09-11|1995-08-13|1995-10-03|TAKE BACK RETURN|SHIP|usly even sentiments sle +58470|434|64|4|26|34695.18|0.05|0.07|N|O|1995-08-01|1995-09-04|1995-08-30|DELIVER IN PERSON|MAIL|er the furi +58470|789|54|5|32|54072.96|0.02|0.05|N|O|1995-09-11|1995-08-27|1995-09-26|TAKE BACK RETURN|REG AIR|equests boost bl +58470|19|45|6|41|37679.41|0.00|0.07|N|O|1995-10-01|1995-07-28|1995-10-18|NONE|MAIL|st fluffily +58470|1072|73|7|50|48653.50|0.09|0.03|N|O|1995-07-09|1995-07-29|1995-08-02|NONE|SHIP| the daringly final exc +58471|485|15|1|40|55419.20|0.09|0.03|N|O|1997-04-13|1997-03-31|1997-04-25|DELIVER IN PERSON|TRUCK|g the final ideas. carefully slow p +58471|186|65|2|8|8689.44|0.00|0.07|N|O|1997-02-20|1997-03-28|1997-02-26|TAKE BACK RETURN|RAIL|r deposits alongside of the packag +58471|1650|74|3|1|1551.65|0.08|0.05|N|O|1997-04-30|1997-04-27|1997-05-19|TAKE BACK RETURN|RAIL|l accounts. +58471|444|32|4|6|8066.64|0.08|0.01|N|O|1997-03-30|1997-03-13|1997-04-01|DELIVER IN PERSON|AIR|egular instructions sleep furiously after +58471|934|37|5|41|75232.13|0.01|0.06|N|O|1997-04-09|1997-05-02|1997-05-06|NONE|TRUCK|ccounts are furiously across the unusual d +58471|909|44|6|33|59726.70|0.06|0.04|N|O|1997-06-05|1997-05-06|1997-07-01|DELIVER IN PERSON|REG AIR|ses. slyly daring braids use carefull +58471|340|25|7|30|37210.20|0.03|0.06|N|O|1997-02-16|1997-04-06|1997-03-16|DELIVER IN PERSON|AIR|e slyly special platelets wake +58496|484|14|1|47|65070.56|0.05|0.07|N|O|1995-07-29|1995-08-11|1995-08-25|NONE|SHIP|ing packages ha +58496|315|72|2|11|13368.41|0.03|0.06|N|O|1995-06-20|1995-08-08|1995-06-26|DELIVER IN PERSON|TRUCK|nusual pinto beans +58496|198|77|3|6|6589.14|0.09|0.07|N|O|1995-06-21|1995-08-26|1995-06-24|NONE|TRUCK|nding account +58496|1687|70|4|11|17475.48|0.05|0.02|N|O|1995-07-21|1995-07-12|1995-08-12|NONE|SHIP|ls are. blithely regu +58496|692|24|5|18|28668.42|0.04|0.04|N|O|1995-07-14|1995-08-06|1995-08-11|DELIVER IN PERSON|RAIL|onic realms. dependenc +58496|1913|2|6|13|23593.83|0.06|0.03|N|O|1995-09-11|1995-08-11|1995-10-09|DELIVER IN PERSON|SHIP|luffily express h +58496|1230|31|7|37|41855.51|0.05|0.02|N|O|1995-09-21|1995-09-08|1995-09-28|NONE|FOB|excuses lose ideas. quickly pe +58497|42|68|1|18|16956.72|0.05|0.03|N|O|1996-06-17|1996-06-15|1996-07-17|NONE|TRUCK|he express, regular braids sublate even de +58497|525|56|2|9|12829.68|0.00|0.04|N|O|1996-04-11|1996-06-12|1996-04-17|TAKE BACK RETURN|MAIL|kly blithely even deposits +58497|297|52|3|7|8381.03|0.04|0.01|N|O|1996-07-30|1996-07-01|1996-08-22|DELIVER IN PERSON|TRUCK|y across the furious +58497|1034|40|4|31|28985.93|0.04|0.07|N|O|1996-05-29|1996-06-20|1996-06-21|NONE|FOB|ts. carefull +58497|1935|36|5|11|20206.23|0.08|0.01|N|O|1996-04-13|1996-05-06|1996-04-17|NONE|FOB|re: furiously unusual asympt +58497|654|55|6|6|9327.90|0.01|0.04|N|O|1996-05-11|1996-06-02|1996-06-07|NONE|RAIL| pinto beans. slyly regular instruct +58497|1830|31|7|34|58882.22|0.03|0.04|N|O|1996-04-23|1996-05-18|1996-05-16|COLLECT COD|MAIL|tipliers haggle ironica +58498|51|27|1|33|31384.65|0.07|0.03|N|O|1998-11-10|1998-09-20|1998-11-27|DELIVER IN PERSON|RAIL| haggle according to the fluffily u +58498|1077|13|2|9|8802.63|0.05|0.03|N|O|1998-10-01|1998-09-06|1998-10-08|TAKE BACK RETURN|RAIL|ully unusual +58498|1545|26|3|34|49182.36|0.06|0.08|N|O|1998-09-11|1998-10-12|1998-09-20|COLLECT COD|TRUCK| accounts. ca +58498|1844|45|4|22|38408.48|0.02|0.03|N|O|1998-07-28|1998-09-28|1998-08-09|DELIVER IN PERSON|TRUCK|ly final pinto beans. depo +58499|815|16|1|19|32600.39|0.01|0.03|R|F|1992-08-24|1992-11-03|1992-09-21|NONE|FOB|fluffily regular accounts. brav +58499|944|45|2|41|75642.54|0.09|0.05|R|F|1992-09-08|1992-10-05|1992-09-28|COLLECT COD|AIR|accounts use furiously. bold, final dep +58500|675|38|1|19|29937.73|0.07|0.05|A|F|1995-04-08|1995-05-15|1995-04-18|COLLECT COD|MAIL|ts nag carefully. ent +58500|662|56|2|48|75007.68|0.04|0.03|R|F|1995-05-06|1995-04-13|1995-05-18|DELIVER IN PERSON|AIR|quests! deposits do +58501|843|43|1|46|80216.64|0.03|0.00|N|O|1996-08-04|1996-07-04|1996-08-30|DELIVER IN PERSON|REG AIR|y final packages. fluffily regular accounts +58501|1699|23|2|47|75232.43|0.08|0.05|N|O|1996-07-11|1996-06-17|1996-07-23|NONE|TRUCK| eat blithely-- quickly even pa +58501|645|77|3|37|57188.68|0.02|0.06|N|O|1996-05-31|1996-07-18|1996-06-12|DELIVER IN PERSON|MAIL|ly special asymptotes use always s +58501|1115|52|4|46|46741.06|0.07|0.06|N|O|1996-08-11|1996-07-25|1996-09-06|NONE|AIR|urts. specia +58501|814|81|5|41|70307.21|0.09|0.05|N|O|1996-06-24|1996-07-10|1996-07-12|TAKE BACK RETURN|REG AIR|st blithely despite the slyly regular p +58501|694|88|6|8|12757.52|0.04|0.06|N|O|1996-07-22|1996-08-06|1996-08-08|DELIVER IN PERSON|AIR|final accounts. some +58502|415|45|1|28|36831.48|0.04|0.07|A|F|1993-02-28|1993-03-20|1993-03-09|TAKE BACK RETURN|AIR| the final packages. blithely +58502|618|50|2|48|72893.28|0.09|0.06|A|F|1993-03-20|1993-04-24|1993-04-19|DELIVER IN PERSON|MAIL|es? fluffily final pearls hagg +58502|1991|24|3|20|37859.80|0.01|0.06|A|F|1993-05-08|1993-03-16|1993-05-12|TAKE BACK RETURN|FOB|ounts after the +58502|825|26|4|28|48322.96|0.03|0.00|A|F|1993-03-25|1993-05-11|1993-03-26|DELIVER IN PERSON|AIR|ests. theodolites sleep. ca +58502|1308|47|5|45|54418.50|0.00|0.07|R|F|1993-03-30|1993-04-14|1993-04-04|TAKE BACK RETURN|REG AIR|ans cajole. +58503|1091|27|1|33|32738.97|0.08|0.03|N|O|1996-11-25|1997-01-12|1996-12-23|NONE|REG AIR| against the sl +58528|118|71|1|47|47851.17|0.04|0.03|R|F|1993-12-29|1994-01-21|1994-01-06|TAKE BACK RETURN|TRUCK|n deposits according to the +58528|45|21|2|13|12285.52|0.08|0.04|A|F|1994-01-28|1994-01-11|1994-02-19|NONE|TRUCK|press deposit +58528|367|96|3|32|40555.52|0.07|0.02|R|F|1993-11-08|1994-01-04|1993-11-16|DELIVER IN PERSON|REG AIR|ly regular grouches +58528|999|34|4|26|49399.74|0.06|0.08|A|F|1993-11-28|1994-01-24|1993-12-02|DELIVER IN PERSON|FOB|sits haggle. blithely regular accounts +58528|1463|81|5|30|40933.80|0.09|0.00|R|F|1994-01-21|1993-11-29|1994-02-14|DELIVER IN PERSON|AIR| ironic courts +58528|863|64|6|19|33513.34|0.01|0.08|R|F|1993-12-06|1993-12-12|1993-12-31|COLLECT COD|FOB|quickly regular accoun +58529|789|22|1|25|42244.50|0.03|0.00|A|F|1995-02-05|1995-03-22|1995-02-07|TAKE BACK RETURN|SHIP|gular foxes must haggle sl +58530|129|30|1|26|26757.12|0.03|0.07|N|O|1996-03-16|1996-05-11|1996-03-25|TAKE BACK RETURN|REG AIR|s. asymptotes hinder according to the ca +58530|907|42|2|20|36158.00|0.09|0.05|N|O|1996-06-23|1996-05-23|1996-06-28|NONE|SHIP| permanent requests are over the +58530|749|46|3|36|59390.64|0.01|0.04|N|O|1996-03-24|1996-05-31|1996-04-10|NONE|RAIL|efully even instructions are +58531|1160|33|1|6|6366.96|0.07|0.05|N|O|1997-09-28|1997-10-25|1997-10-22|DELIVER IN PERSON|RAIL|en theodolites. +58531|52|78|2|23|21897.15|0.08|0.00|N|O|1997-10-08|1997-10-21|1997-10-09|COLLECT COD|TRUCK|ut the deposits. blithely unusual accounts +58532|1001|2|1|49|44198.00|0.05|0.01|N|O|1998-06-21|1998-07-06|1998-07-18|COLLECT COD|REG AIR|lar platelets hinder carefully beyon +58532|1791|34|2|23|38934.17|0.05|0.07|N|O|1998-06-07|1998-06-17|1998-06-19|NONE|RAIL|endencies integ +58533|366|95|1|46|58252.56|0.06|0.08|N|O|1997-10-20|1997-11-06|1997-10-22|NONE|AIR| regular request +58533|107|34|2|34|34241.40|0.10|0.06|N|O|1997-11-02|1997-12-03|1997-11-13|NONE|SHIP| foxes sleep al +58534|535|26|1|4|5742.12|0.04|0.08|N|O|1997-06-12|1997-07-29|1997-06-16|DELIVER IN PERSON|REG AIR|pending instructions. furiously special dep +58534|503|94|2|31|43508.50|0.00|0.01|N|O|1997-06-03|1997-08-12|1997-06-06|TAKE BACK RETURN|FOB|g frets. sile +58534|127|54|3|10|10271.20|0.07|0.02|N|O|1997-06-21|1997-08-03|1997-07-04|DELIVER IN PERSON|FOB| silent instructions. qu +58534|1985|30|4|26|49061.48|0.09|0.05|N|O|1997-06-28|1997-08-08|1997-07-12|DELIVER IN PERSON|FOB|haggle furiously blithely unusu +58534|482|41|5|5|6912.40|0.00|0.02|N|O|1997-09-06|1997-07-27|1997-09-20|COLLECT COD|SHIP|regularly quickly pendin +58534|775|72|6|5|8378.85|0.04|0.01|N|O|1997-07-25|1997-08-05|1997-08-11|NONE|REG AIR|yly. furiously exp +58534|1327|28|7|42|51589.44|0.02|0.04|N|O|1997-06-06|1997-07-22|1997-06-27|NONE|TRUCK|dolites ag +58535|496|84|1|33|46084.17|0.00|0.07|N|O|1997-08-18|1997-08-14|1997-08-27|DELIVER IN PERSON|MAIL|ix above the +58535|1852|96|2|50|87692.50|0.02|0.08|N|O|1997-10-04|1997-09-10|1997-10-23|TAKE BACK RETURN|TRUCK|ly silent instructions. quickly regular dep +58535|509|40|3|37|52151.50|0.04|0.08|N|O|1997-08-08|1997-08-18|1997-09-01|TAKE BACK RETURN|RAIL| blithely a +58535|865|99|4|45|79463.70|0.06|0.05|N|O|1997-08-21|1997-07-18|1997-08-28|DELIVER IN PERSON|RAIL|ly unusual theodolites are slyly quickl +58535|1446|25|5|23|30991.12|0.03|0.01|N|O|1997-07-12|1997-07-29|1997-07-13|NONE|FOB|ix? requests for the unusual foxes +58535|1179|16|6|32|34565.44|0.06|0.07|N|O|1997-10-11|1997-08-29|1997-10-30|NONE|SHIP|ic theodolites wake blithely regular reques +58560|1420|21|1|13|17178.46|0.02|0.02|N|O|1998-01-01|1997-11-19|1998-01-20|TAKE BACK RETURN|FOB|hely final ideas are according to +58561|1359|36|1|2|2520.70|0.07|0.07|N|O|1996-09-21|1996-09-19|1996-10-17|TAKE BACK RETURN|RAIL|s the final req +58561|1200|9|2|7|7708.40|0.04|0.04|N|O|1996-10-20|1996-08-21|1996-10-22|NONE|TRUCK|lyly regular accounts su +58561|1161|70|3|41|43548.56|0.06|0.01|N|O|1996-07-02|1996-08-03|1996-07-18|DELIVER IN PERSON|TRUCK|e slyly furiously final pinto beans. the +58561|1381|82|4|46|58989.48|0.05|0.00|N|O|1996-07-26|1996-08-20|1996-08-20|TAKE BACK RETURN|FOB|hely silent +58561|1253|91|5|16|18468.00|0.01|0.00|N|O|1996-07-29|1996-09-16|1996-08-09|TAKE BACK RETURN|REG AIR|y quiet ideas about t +58561|1060|61|6|29|27870.74|0.02|0.01|N|O|1996-07-17|1996-08-03|1996-08-08|COLLECT COD|REG AIR| requests affix quickly after +58562|1098|99|1|47|46957.23|0.09|0.00|A|F|1992-04-05|1992-04-12|1992-04-20|DELIVER IN PERSON|RAIL|e furiously ironic pinto bean +58562|172|25|2|25|26804.25|0.09|0.00|R|F|1992-05-29|1992-04-14|1992-06-04|TAKE BACK RETURN|AIR|posits. blithely regular +58562|937|38|3|38|69841.34|0.08|0.06|A|F|1992-05-19|1992-05-06|1992-06-10|TAKE BACK RETURN|FOB| even asymptotes. b +58562|1008|14|4|15|13635.00|0.10|0.00|A|F|1992-05-03|1992-04-29|1992-05-06|DELIVER IN PERSON|TRUCK| bold requests wak +58562|955|90|5|44|81661.80|0.02|0.02|A|F|1992-03-04|1992-05-13|1992-03-20|NONE|MAIL|l packages sleep slyly around the slyl +58563|959|28|1|20|37199.00|0.03|0.05|R|F|1995-06-08|1995-07-03|1995-06-14|TAKE BACK RETURN|RAIL|ate platelets. carefully pending asym +58564|1311|50|1|22|26670.82|0.09|0.00|R|F|1992-12-06|1993-01-31|1992-12-22|NONE|AIR|iously about the theodolites! final, +58564|1030|1|2|15|13965.45|0.06|0.08|A|F|1993-02-23|1993-02-01|1993-03-08|COLLECT COD|AIR| deposits. furiously unusual din +58564|1825|69|3|24|41443.68|0.03|0.06|A|F|1993-02-14|1992-12-23|1993-02-20|NONE|REG AIR|ual packages against the carefully ironic +58564|301|86|4|16|19220.80|0.10|0.00|A|F|1993-02-01|1992-12-17|1993-02-23|COLLECT COD|RAIL|l, final pinto beans +58565|214|96|1|31|34540.51|0.06|0.01|N|O|1996-12-11|1996-11-19|1997-01-07|COLLECT COD|TRUCK|s boost blith +58565|397|98|2|20|25947.80|0.02|0.06|N|O|1996-08-28|1996-10-20|1996-09-07|TAKE BACK RETURN|TRUCK|d, ironic requests sleep according to th +58565|1494|12|3|15|20932.35|0.06|0.00|N|O|1996-12-23|1996-09-29|1997-01-07|DELIVER IN PERSON|SHIP|thely ironic ideas. +58565|162|89|4|30|31864.80|0.08|0.08|N|O|1996-11-19|1996-10-30|1996-12-17|COLLECT COD|SHIP|n accounts s +58566|777|42|1|16|26844.32|0.09|0.06|N|O|1995-11-06|1995-10-21|1995-11-10|COLLECT COD|TRUCK|nly furiously final sen +58566|371|100|2|27|34326.99|0.04|0.07|N|O|1995-11-06|1995-10-31|1995-11-20|COLLECT COD|SHIP|according to the blithely pending +58566|1396|73|3|18|23353.02|0.09|0.07|N|O|1995-09-23|1995-10-16|1995-10-20|TAKE BACK RETURN|REG AIR|ut the carefully regular +58566|1401|41|4|18|23443.20|0.10|0.07|N|O|1995-11-30|1995-11-11|1995-12-09|TAKE BACK RETURN|TRUCK|ccounts. pending, specia +58566|194|21|5|42|45955.98|0.00|0.04|N|O|1995-10-07|1995-11-07|1995-10-21|DELIVER IN PERSON|RAIL|ions. furi +58566|1202|77|6|19|20960.80|0.01|0.02|N|O|1995-11-04|1995-10-17|1995-11-28|TAKE BACK RETURN|RAIL|express excus +58566|995|30|7|11|20855.89|0.06|0.04|N|O|1995-09-15|1995-11-18|1995-09-17|NONE|RAIL|ructions. regular, pending theodoli +58567|1122|31|1|9|9208.08|0.04|0.01|N|O|1996-07-15|1996-08-13|1996-08-06|DELIVER IN PERSON|MAIL|fily regular attainm +58592|1636|37|1|16|24602.08|0.03|0.03|N|F|1995-05-22|1995-03-28|1995-06-20|DELIVER IN PERSON|RAIL| upon the furiously special accounts. pend +58592|453|12|2|40|54138.00|0.09|0.06|R|F|1995-04-23|1995-04-24|1995-05-16|NONE|AIR|nto beans h +58592|1881|25|3|38|67749.44|0.00|0.03|A|F|1995-06-05|1995-05-04|1995-06-17|TAKE BACK RETURN|TRUCK|ove the final d +58593|1546|67|1|49|70929.46|0.06|0.01|N|O|1995-11-30|1995-10-15|1995-12-15|COLLECT COD|MAIL|y regular ideas cajole about the foxes. sp +58593|603|4|2|32|48115.20|0.07|0.05|N|O|1996-01-03|1995-11-21|1996-01-12|DELIVER IN PERSON|RAIL| even ideas +58593|1372|11|3|24|30560.88|0.09|0.04|N|O|1995-12-23|1995-11-09|1996-01-09|DELIVER IN PERSON|FOB|. regularly regular instructions are- +58593|1941|86|4|34|62659.96|0.03|0.01|N|O|1995-09-10|1995-12-02|1995-09-25|TAKE BACK RETURN|TRUCK|fluffily regular packages above the +58593|1706|33|5|32|51446.40|0.05|0.02|N|O|1995-11-12|1995-11-09|1995-11-18|DELIVER IN PERSON|SHIP|uickly final pac +58593|1931|32|6|9|16496.37|0.02|0.06|N|O|1996-01-02|1995-10-25|1996-01-15|NONE|REG AIR|ely regular excuses. bold +58593|1347|24|7|21|26215.14|0.10|0.05|N|O|1995-12-01|1995-11-27|1995-12-18|COLLECT COD|AIR| the furiously even plat +58594|878|79|1|10|17788.70|0.09|0.02|N|O|1998-08-07|1998-09-25|1998-08-12|DELIVER IN PERSON|MAIL|eans. quickly ironic attai +58595|579|70|1|46|68060.22|0.04|0.08|R|F|1993-10-03|1993-10-28|1993-10-30|NONE|REG AIR|re permanently ironic excuses +58595|1917|6|2|20|36378.20|0.09|0.02|A|F|1993-12-16|1993-11-25|1994-01-10|NONE|AIR|riously at th +58595|974|77|3|46|86248.62|0.07|0.08|A|F|1993-09-14|1993-11-17|1993-09-23|DELIVER IN PERSON|FOB|n accounts haggle; bold de +58596|1330|69|1|34|41865.22|0.02|0.01|N|O|1995-07-05|1995-08-02|1995-08-04|DELIVER IN PERSON|RAIL|blithely bold packages nag +58597|1918|63|1|19|34578.29|0.01|0.01|N|O|1997-05-22|1997-03-30|1997-05-27|TAKE BACK RETURN|TRUCK| bold instructions are furiously unusual, i +58597|1936|81|2|43|79030.99|0.10|0.02|N|O|1997-06-01|1997-04-20|1997-06-13|NONE|TRUCK|riously; final deposits haggle f +58597|287|15|3|14|16621.92|0.09|0.05|N|O|1997-04-26|1997-05-02|1997-05-20|DELIVER IN PERSON|REG AIR|thlessly express dep +58597|1405|84|4|39|50949.60|0.02|0.05|N|O|1997-05-17|1997-03-17|1997-05-20|TAKE BACK RETURN|RAIL|y quiet theodolites. quick +58597|1547|48|5|28|40559.12|0.05|0.00|N|O|1997-02-25|1997-03-12|1997-03-18|TAKE BACK RETURN|FOB|l accounts nag slyly regular +58597|1708|51|6|19|30584.30|0.06|0.02|N|O|1997-02-19|1997-03-15|1997-03-20|NONE|REG AIR|final accounts haggle furiously? slyl +58597|1316|55|7|16|19476.96|0.06|0.01|N|O|1997-02-19|1997-04-21|1997-02-20|NONE|FOB|cajole quickly ironic depo +58598|1563|64|1|41|60046.96|0.02|0.02|N|O|1995-09-22|1995-11-21|1995-10-09|NONE|AIR|o the blithely regular d +58598|1069|75|2|50|48503.00|0.04|0.06|N|O|1995-11-15|1995-10-24|1995-11-16|NONE|MAIL|ven accoun +58598|787|20|3|15|25316.70|0.01|0.04|N|O|1995-09-01|1995-10-15|1995-09-08|COLLECT COD|FOB|t closely foxes. final, pending foxes sleep +58598|1009|15|4|2|1820.00|0.10|0.03|N|O|1995-10-18|1995-10-02|1995-10-24|TAKE BACK RETURN|FOB|al accounts print bravely among th +58598|1442|82|5|6|8060.64|0.04|0.05|N|O|1995-10-18|1995-10-08|1995-10-31|DELIVER IN PERSON|RAIL|, final pinto beans +58598|1139|76|6|22|22882.86|0.04|0.07|N|O|1995-10-30|1995-09-28|1995-11-10|TAKE BACK RETURN|AIR|counts. slyly even dep +58599|797|62|1|35|59422.65|0.03|0.03|R|F|1993-05-05|1993-04-15|1993-05-08|TAKE BACK RETURN|TRUCK|ly final, final ideas: un +58599|1344|45|2|32|39850.88|0.09|0.05|A|F|1993-01-26|1993-04-07|1993-02-15|NONE|TRUCK|s use theodolites. slyly idle pac +58599|1347|48|3|49|61168.66|0.10|0.03|R|F|1993-02-27|1993-02-22|1993-03-01|DELIVER IN PERSON|FOB|s cajole according to +58599|1535|56|4|19|27294.07|0.05|0.04|R|F|1993-04-19|1993-03-05|1993-05-05|TAKE BACK RETURN|RAIL| beans cajole across t +58624|1317|18|1|28|34112.68|0.02|0.08|A|F|1994-10-05|1994-08-20|1994-10-30|COLLECT COD|REG AIR|packages. final instructions sleep. q +58625|778|75|1|16|26860.32|0.02|0.03|N|O|1996-01-04|1996-01-04|1996-01-05|DELIVER IN PERSON|TRUCK|posits. slowly pending packa +58625|247|75|2|17|19503.08|0.07|0.04|N|O|1995-12-02|1996-01-10|1995-12-25|DELIVER IN PERSON|TRUCK|ly busy deposits +58625|1425|65|3|8|10611.36|0.07|0.07|N|O|1996-02-29|1996-01-14|1996-03-07|TAKE BACK RETURN|AIR|packages. slyl +58625|521|52|4|19|27008.88|0.05|0.07|N|O|1996-01-04|1996-01-24|1996-01-22|TAKE BACK RETURN|SHIP|lly ironic ideas. +58625|426|14|5|11|14590.62|0.00|0.08|N|O|1996-03-17|1996-02-12|1996-04-12|TAKE BACK RETURN|AIR|nt deposits haggle furiously slow pinto be +58626|52|3|1|27|25705.35|0.07|0.03|N|O|1996-02-15|1996-02-19|1996-02-22|DELIVER IN PERSON|SHIP|furiously. blithely ironic packages sublat +58626|1207|8|2|12|13298.40|0.07|0.05|N|O|1996-02-20|1996-02-06|1996-02-22|DELIVER IN PERSON|REG AIR|ly even requests use blithe +58626|1757|42|3|42|69667.50|0.09|0.05|N|O|1996-01-26|1996-03-09|1996-02-07|NONE|MAIL|symptotes cajole-- fluffily f +58626|927|30|4|2|3655.84|0.06|0.06|N|O|1996-03-20|1996-02-03|1996-04-15|COLLECT COD|RAIL|y regular courts. packages ma +58626|883|83|5|16|28542.08|0.09|0.04|N|O|1996-01-30|1996-03-05|1996-02-23|NONE|AIR|ix blithely after the quickly enticing r +58626|1210|22|6|1|1111.21|0.07|0.04|N|O|1996-01-16|1996-01-31|1996-02-14|COLLECT COD|SHIP|rding to the slyly unusual reque +58627|185|38|1|28|30385.04|0.00|0.01|A|F|1994-03-21|1994-03-06|1994-04-01|NONE|AIR| after the ca +58627|51|52|2|24|22825.20|0.10|0.06|R|F|1994-03-06|1994-03-30|1994-03-18|COLLECT COD|AIR|packages about the +58627|57|33|3|21|20098.05|0.07|0.01|A|F|1994-03-17|1994-03-24|1994-04-10|DELIVER IN PERSON|AIR|its wake slyly quickly ironic instructi +58627|1034|5|4|32|29920.96|0.00|0.03|A|F|1994-03-29|1994-02-14|1994-04-23|NONE|TRUCK|ronic ideas. blithely bold courts haggle q +58627|835|2|5|29|50339.07|0.00|0.01|R|F|1994-03-28|1994-02-20|1994-04-23|TAKE BACK RETURN|AIR| theodolites: r +58627|352|81|6|1|1252.35|0.08|0.05|R|F|1994-04-16|1994-03-01|1994-05-05|TAKE BACK RETURN|FOB|the final pac +58628|255|10|1|22|25415.50|0.02|0.04|R|F|1994-05-15|1994-04-26|1994-06-11|DELIVER IN PERSON|SHIP| the furiously express theodolites. +58628|1077|78|2|26|25429.82|0.02|0.07|A|F|1994-04-12|1994-04-24|1994-05-06|NONE|REG AIR|carefully even foxes are f +58628|172|25|3|12|12866.04|0.00|0.07|R|F|1994-04-03|1994-06-12|1994-04-15|COLLECT COD|FOB|t above the slyly sp +58628|1498|16|4|24|33587.76|0.06|0.08|A|F|1994-04-18|1994-06-15|1994-04-27|TAKE BACK RETURN|RAIL| slyly asym +58629|1267|68|1|32|37384.32|0.08|0.03|A|F|1994-03-15|1994-04-17|1994-04-02|COLLECT COD|SHIP|cial ideas above +58629|554|15|2|2|2909.10|0.08|0.02|R|F|1994-03-31|1994-04-15|1994-04-10|COLLECT COD|REG AIR| across the ironic +58629|1935|24|3|36|66129.48|0.00|0.05|A|F|1994-06-16|1994-04-16|1994-06-27|NONE|AIR|lly according to the ironic notornis +58630|792|57|1|35|59247.65|0.02|0.04|N|O|1997-12-23|1998-01-15|1997-12-24|COLLECT COD|TRUCK|ross the carefu +58630|1094|95|2|22|21891.98|0.09|0.04|N|O|1998-01-11|1998-01-30|1998-02-04|COLLECT COD|TRUCK|kages. quickly special packages +58630|1565|46|3|11|16132.16|0.00|0.04|N|O|1998-03-15|1998-02-04|1998-03-17|TAKE BACK RETURN|SHIP|ts wake quickly +58630|765|98|4|22|36646.72|0.09|0.07|N|O|1998-02-19|1998-02-08|1998-03-16|TAKE BACK RETURN|REG AIR| ironic theodolites. carefu +58630|1732|59|5|9|14703.57|0.05|0.01|N|O|1997-12-07|1998-01-07|1998-01-05|COLLECT COD|AIR|ckly. accounts detect +58630|1318|33|6|44|53649.64|0.01|0.03|N|O|1998-03-05|1998-01-27|1998-04-04|NONE|FOB|counts. blithely pending +58630|695|89|7|4|6382.76|0.03|0.06|N|O|1997-12-01|1997-12-28|1997-12-08|NONE|TRUCK|thely final pi +58631|907|10|1|12|21694.80|0.05|0.00|N|O|1997-12-05|1997-12-03|1997-12-28|TAKE BACK RETURN|FOB|. slyly regular platelets sl +58631|595|96|2|23|34398.57|0.08|0.05|N|O|1997-11-01|1997-12-10|1997-11-29|NONE|FOB|iously express pinto be +58631|902|3|3|46|82933.40|0.09|0.06|N|O|1997-10-13|1997-12-05|1997-11-02|COLLECT COD|TRUCK| ideas. permanent ide +58631|860|61|4|18|31695.48|0.02|0.07|N|O|1997-10-20|1997-11-19|1997-11-03|TAKE BACK RETURN|RAIL|fully unusual acc +58656|691|92|1|47|74809.43|0.07|0.05|R|F|1994-02-02|1994-02-07|1994-02-28|COLLECT COD|TRUCK|ag after th +58656|1353|92|2|3|3763.05|0.04|0.05|R|F|1994-02-26|1994-02-09|1994-03-01|COLLECT COD|SHIP| pinto beans are abo +58656|1213|14|3|25|27855.25|0.01|0.07|A|F|1994-01-17|1994-01-26|1994-02-01|DELIVER IN PERSON|MAIL|en forges. +58656|1274|49|4|28|32907.56|0.02|0.08|A|F|1994-04-02|1994-02-27|1994-04-05|DELIVER IN PERSON|MAIL|sleep furiously above the ironically +58657|514|15|1|18|25461.18|0.09|0.04|R|F|1993-06-04|1993-06-24|1993-06-17|DELIVER IN PERSON|RAIL|refully even reque +58657|872|72|2|27|47867.49|0.05|0.08|R|F|1993-06-23|1993-05-29|1993-06-27|COLLECT COD|RAIL|haggle slyly +58657|641|73|3|36|55499.04|0.09|0.02|R|F|1993-07-08|1993-05-21|1993-08-07|TAKE BACK RETURN|RAIL|osits. slyly bold platele +58657|960|29|4|25|46524.00|0.02|0.08|A|F|1993-06-27|1993-05-09|1993-07-20|NONE|RAIL|cuses. hockey players +58657|1333|72|5|9|11108.97|0.09|0.06|R|F|1993-05-17|1993-05-13|1993-06-15|DELIVER IN PERSON|SHIP|st the express pac +58658|1656|98|1|6|9345.90|0.02|0.04|A|F|1992-09-11|1992-07-16|1992-09-17|COLLECT COD|REG AIR|p about the +58658|1655|79|2|14|21793.10|0.02|0.06|R|F|1992-07-31|1992-07-19|1992-08-04|DELIVER IN PERSON|AIR|y final deposits. carefully silent deposi +58658|1281|93|3|11|13005.08|0.00|0.02|A|F|1992-10-09|1992-08-19|1992-11-01|COLLECT COD|TRUCK|final, ironic packages haggle +58658|1860|4|4|31|54617.66|0.10|0.02|R|F|1992-10-05|1992-08-05|1992-10-11|DELIVER IN PERSON|AIR|ounts wake. +58658|398|99|5|17|22072.63|0.08|0.00|A|F|1992-09-09|1992-08-15|1992-10-04|COLLECT COD|RAIL|efully spe +58658|1047|18|6|21|19908.84|0.01|0.08|R|F|1992-09-19|1992-08-14|1992-10-17|COLLECT COD|TRUCK|nstructions use quickly. quickly +58659|315|16|1|28|34028.68|0.06|0.01|A|F|1993-12-07|1994-01-11|1993-12-24|COLLECT COD|RAIL|? carefully regu +58659|752|49|2|16|26444.00|0.09|0.06|R|F|1994-02-17|1993-12-12|1994-02-28|NONE|SHIP|y special requests wake quickly. doggedly +58659|1967|12|3|9|16820.64|0.10|0.06|R|F|1994-01-02|1994-01-11|1994-01-25|TAKE BACK RETURN|REG AIR|tes alongside of the fur +58659|1679|80|4|22|34774.74|0.04|0.03|A|F|1993-11-22|1994-01-08|1993-12-10|NONE|TRUCK|ending pin +58659|1216|91|5|9|10054.89|0.01|0.04|A|F|1993-12-28|1993-12-03|1994-01-16|NONE|AIR|lyly silent +58659|1611|12|6|43|65042.23|0.05|0.00|R|F|1994-01-29|1993-12-09|1994-02-13|COLLECT COD|AIR|refully final asymptotes shall believe fl +58660|728|29|1|33|53747.76|0.02|0.07|A|F|1994-05-17|1994-04-07|1994-06-16|NONE|RAIL|ependencies among the +58660|1641|83|2|7|10798.48|0.10|0.06|R|F|1994-04-16|1994-04-11|1994-04-18|COLLECT COD|FOB| slyly even req +58660|445|75|3|37|49781.28|0.07|0.06|R|F|1994-06-10|1994-04-28|1994-07-01|TAKE BACK RETURN|SHIP|the quickly express p +58660|460|90|4|25|34011.50|0.03|0.04|A|F|1994-06-07|1994-04-28|1994-06-14|COLLECT COD|SHIP|ily ironic r +58660|1440|80|5|21|28170.24|0.06|0.06|A|F|1994-03-05|1994-05-27|1994-03-18|TAKE BACK RETURN|REG AIR|nusual reques +58660|1931|20|6|6|10997.58|0.05|0.01|A|F|1994-04-15|1994-04-22|1994-04-29|DELIVER IN PERSON|TRUCK|olites affix bold, final reques +58660|1236|37|7|20|22744.60|0.01|0.05|R|F|1994-06-30|1994-05-12|1994-07-24|DELIVER IN PERSON|REG AIR|slyly final deposi +58661|1570|11|1|10|14715.70|0.06|0.08|N|O|1996-04-04|1996-02-20|1996-04-15|TAKE BACK RETURN|RAIL|tructions. pint +58661|1864|8|2|5|8829.30|0.03|0.07|N|O|1996-01-11|1996-02-10|1996-01-20|COLLECT COD|MAIL|. accounts +58661|987|56|3|32|60415.36|0.10|0.05|N|O|1996-02-12|1996-02-12|1996-02-19|DELIVER IN PERSON|REG AIR|oxes into the ironic requests are car +58661|6|82|4|25|22650.00|0.05|0.03|N|O|1996-01-01|1996-02-02|1996-01-02|DELIVER IN PERSON|SHIP|r, regular instructions. foxes eat permane +58661|561|62|5|41|59923.96|0.10|0.00|N|O|1995-12-23|1996-03-03|1996-01-17|TAKE BACK RETURN|SHIP|requests sleep quickly regular, pending +58662|1053|54|1|48|45794.40|0.00|0.06|N|O|1996-06-20|1996-04-18|1996-07-05|DELIVER IN PERSON|MAIL|es wake furiously ac +58662|962|63|2|43|80107.28|0.02|0.08|N|O|1996-07-16|1996-06-03|1996-07-25|COLLECT COD|FOB|althily regular deposits affix ruthlessly i +58662|1480|59|3|21|29011.08|0.05|0.00|N|O|1996-03-27|1996-05-23|1996-04-25|TAKE BACK RETURN|RAIL| slyly regular d +58662|848|15|4|9|15739.56|0.05|0.00|N|O|1996-06-07|1996-06-13|1996-06-20|NONE|REG AIR| slyly iron +58662|194|21|5|30|32825.70|0.10|0.01|N|O|1996-04-05|1996-06-07|1996-04-24|DELIVER IN PERSON|SHIP|osits could h +58662|600|31|6|7|10504.20|0.04|0.08|N|O|1996-05-26|1996-04-19|1996-06-15|TAKE BACK RETURN|REG AIR|uickly about the thinly busy accounts. idl +58662|1435|53|7|41|54793.63|0.01|0.04|N|O|1996-07-16|1996-06-04|1996-07-17|TAKE BACK RETURN|AIR|ong the furiously ir +58663|53|79|1|26|24779.30|0.05|0.08|N|O|1997-09-14|1997-10-21|1997-09-25|COLLECT COD|REG AIR|y enticing d +58663|976|11|2|41|76955.77|0.09|0.04|N|O|1997-10-12|1997-09-13|1997-10-19|NONE|REG AIR|haggle fluffily. even packages ea +58688|1877|78|1|39|69375.93|0.06|0.01|A|F|1994-07-17|1994-05-27|1994-08-01|TAKE BACK RETURN|SHIP|ronic foxe +58688|1652|76|2|49|76128.85|0.05|0.02|R|F|1994-06-18|1994-06-10|1994-07-11|COLLECT COD|REG AIR|uctions hagg +58688|1024|25|3|7|6475.14|0.06|0.07|A|F|1994-04-25|1994-06-26|1994-05-08|NONE|RAIL|boost. carefully pending r +58688|822|22|4|37|63744.34|0.10|0.02|R|F|1994-07-20|1994-06-25|1994-07-21|TAKE BACK RETURN|SHIP|ly ironic asymptotes. bold, bold requests +58688|270|52|5|2|2340.54|0.09|0.00|R|F|1994-05-25|1994-05-01|1994-05-27|NONE|TRUCK|unusual foxes integ +58689|1349|26|1|44|55014.96|0.05|0.01|N|O|1995-08-29|1995-10-13|1995-09-01|DELIVER IN PERSON|FOB|fily blithely ironic accounts. fu +58690|1062|68|1|40|38522.40|0.05|0.01|N|O|1996-02-15|1996-02-01|1996-02-19|NONE|AIR| quickly regular foxes grow; carefully s +58690|1784|85|2|45|75860.10|0.04|0.02|N|O|1995-12-04|1996-01-08|1995-12-06|TAKE BACK RETURN|SHIP|le. silent dependencies use slyly +58690|760|57|3|50|83038.00|0.10|0.07|N|O|1996-02-03|1996-02-02|1996-02-07|NONE|RAIL|nusual plate +58691|749|14|1|18|29695.32|0.04|0.02|N|O|1996-10-03|1996-09-28|1996-10-26|DELIVER IN PERSON|AIR|y blithely busy grouches. slyly furious +58691|96|72|2|47|46816.23|0.01|0.00|N|O|1996-08-27|1996-09-13|1996-09-23|DELIVER IN PERSON|SHIP| packages. instructio +58691|680|74|3|49|77453.32|0.06|0.05|N|O|1996-10-08|1996-11-06|1996-10-10|COLLECT COD|MAIL|atelets wake carefully furiou +58691|1822|23|4|38|65505.16|0.02|0.05|N|O|1996-11-24|1996-09-27|1996-11-27|COLLECT COD|MAIL|ions boost slowly slyly even +58691|132|33|5|14|14449.82|0.09|0.02|N|O|1996-10-18|1996-10-13|1996-10-31|NONE|MAIL|hely alongside of the slyly silent +58692|38|64|1|24|22512.72|0.07|0.05|N|O|1996-03-11|1996-02-23|1996-03-15|NONE|FOB|tions. carefully pending accounts +58693|287|69|1|29|34431.12|0.01|0.01|R|F|1994-11-08|1994-12-24|1994-11-17|NONE|TRUCK|posits are furiousl +58693|1309|48|2|25|30257.50|0.08|0.05|R|F|1994-12-03|1994-12-14|1994-12-15|TAKE BACK RETURN|SHIP|ic dependencies are according to +58693|35|36|3|38|35531.14|0.08|0.02|R|F|1995-02-15|1994-12-13|1995-03-06|TAKE BACK RETURN|SHIP|ccounts sleep blithely about the care +58693|1788|31|4|48|81109.44|0.05|0.03|R|F|1995-01-29|1995-01-07|1995-02-27|TAKE BACK RETURN|FOB|lly pending packages along the slyly i +58693|821|22|5|2|3443.64|0.03|0.07|R|F|1994-11-22|1994-12-06|1994-12-15|DELIVER IN PERSON|TRUCK|ously regul +58693|820|20|6|10|17208.20|0.04|0.06|A|F|1995-02-03|1995-01-01|1995-03-01|COLLECT COD|FOB|pending dependencies. final, special inst +58694|1169|78|1|25|26754.00|0.04|0.01|N|O|1996-11-25|1996-12-07|1996-12-20|COLLECT COD|AIR|fluffily. carefully fi +58694|1974|63|2|20|37519.40|0.03|0.05|N|O|1997-01-28|1996-12-03|1997-02-12|DELIVER IN PERSON|FOB|en foxes wake. silent, pending +58695|269|24|1|49|57293.74|0.04|0.01|A|F|1994-03-16|1994-04-01|1994-04-10|NONE|AIR|, ironic instructions integrate +58695|195|74|2|11|12047.09|0.04|0.08|R|F|1994-03-23|1994-03-29|1994-04-14|NONE|RAIL|odolites are furiously +58720|1745|30|1|22|36228.28|0.05|0.04|R|F|1993-03-26|1993-05-26|1993-03-29|DELIVER IN PERSON|FOB|ly ironic do +58720|1043|14|2|44|41537.76|0.01|0.06|R|F|1993-04-20|1993-05-09|1993-04-25|TAKE BACK RETURN|MAIL| final accounts. carefully final ideas +58720|186|13|3|9|9775.62|0.00|0.07|A|F|1993-05-24|1993-05-09|1993-05-25|COLLECT COD|FOB|slyly expres +58720|492|51|4|19|26457.31|0.01|0.06|A|F|1993-06-26|1993-04-10|1993-07-25|NONE|REG AIR|y even, bold accou +58721|720|53|1|23|37276.56|0.09|0.04|N|O|1995-07-03|1995-08-28|1995-07-25|DELIVER IN PERSON|TRUCK|oxes. slyly unusual instruct +58722|1937|82|1|31|57006.83|0.06|0.01|A|F|1992-12-31|1993-01-04|1993-01-04|COLLECT COD|FOB| the final a +58722|886|53|2|2|3573.76|0.06|0.01|R|F|1993-02-09|1993-01-03|1993-02-21|TAKE BACK RETURN|TRUCK|nal ideas wake unusual +58723|324|81|1|20|24486.40|0.03|0.03|N|O|1998-05-28|1998-04-21|1998-06-23|DELIVER IN PERSON|REG AIR|ve the finally +58723|1421|100|2|44|58186.48|0.02|0.04|N|O|1998-06-13|1998-04-30|1998-06-14|COLLECT COD|REG AIR|l deposits wake across the final ideas. i +58723|1252|90|3|3|3459.75|0.02|0.01|N|O|1998-05-25|1998-05-17|1998-06-09|NONE|RAIL|uffily fluffy foxes. slyly un +58723|1597|98|4|16|23977.44|0.02|0.01|N|O|1998-05-08|1998-03-29|1998-05-27|TAKE BACK RETURN|TRUCK|y regular deposits +58723|1978|11|5|26|48879.22|0.06|0.01|N|O|1998-04-29|1998-04-17|1998-05-02|COLLECT COD|RAIL|final dept +58724|514|45|1|31|43849.81|0.03|0.00|N|O|1997-12-25|1998-01-10|1998-01-16|COLLECT COD|FOB| the carefully iron +58724|1047|18|2|16|15168.64|0.06|0.07|N|O|1997-12-04|1997-11-26|1997-12-11|DELIVER IN PERSON|AIR|ccounts wake past the even dep +58725|563|54|1|7|10244.92|0.06|0.04|R|F|1993-07-19|1993-08-12|1993-08-08|DELIVER IN PERSON|SHIP|entiments kin +58725|1623|24|2|32|48787.84|0.01|0.06|A|F|1993-07-08|1993-06-22|1993-07-28|COLLECT COD|SHIP|tions use blithely b +58726|1134|35|1|22|22772.86|0.09|0.06|N|O|1996-06-01|1996-06-27|1996-06-10|TAKE BACK RETURN|AIR|yly. frets c +58726|733|98|2|4|6534.92|0.07|0.06|N|O|1996-05-02|1996-06-11|1996-05-18|DELIVER IN PERSON|FOB|uts. silent foxes sleep slyly packages? sl +58726|162|41|3|18|19118.88|0.09|0.01|N|O|1996-06-21|1996-05-27|1996-07-06|COLLECT COD|MAIL| ironic packages. regular deposit +58726|1625|8|4|26|39692.12|0.07|0.00|N|O|1996-06-23|1996-06-19|1996-06-25|NONE|RAIL| quickly quickly u +58727|995|96|1|20|37919.80|0.09|0.01|R|F|1994-10-29|1994-09-05|1994-11-08|COLLECT COD|MAIL|he special, ev +58727|1925|26|2|44|80384.48|0.05|0.05|R|F|1994-10-28|1994-08-06|1994-11-06|DELIVER IN PERSON|SHIP| ideas haggle above the blithely re +58752|1348|87|1|29|36230.86|0.10|0.04|A|F|1994-10-17|1994-09-26|1994-11-04|TAKE BACK RETURN|AIR|cajole furiou +58752|986|55|2|25|47174.50|0.09|0.08|R|F|1994-11-02|1994-09-25|1994-11-11|NONE|RAIL|arefully alongside of the accounts. furi +58752|733|30|3|27|44110.71|0.01|0.03|R|F|1994-10-31|1994-10-06|1994-11-17|DELIVER IN PERSON|SHIP|s affix dependencies: +58752|520|81|4|50|71026.00|0.01|0.02|R|F|1994-10-12|1994-09-26|1994-11-02|TAKE BACK RETURN|RAIL|ts about the final packages affi +58752|528|29|5|13|18570.76|0.02|0.02|R|F|1994-10-01|1994-09-17|1994-10-21|TAKE BACK RETURN|TRUCK|accounts. blithely pending requests coul +58752|1741|42|6|38|62424.12|0.00|0.06|R|F|1994-08-30|1994-09-26|1994-09-08|DELIVER IN PERSON|REG AIR|use final frays. f +58753|735|32|1|34|55614.82|0.03|0.03|N|O|1996-03-22|1996-03-13|1996-03-23|DELIVER IN PERSON|RAIL| quickly after the fluffily iro +58753|1272|73|2|14|16425.78|0.08|0.07|N|O|1996-04-04|1996-04-14|1996-04-08|TAKE BACK RETURN|FOB|deposits. ironic, special instructions +58753|790|23|3|27|45651.33|0.00|0.08|N|O|1996-04-01|1996-03-07|1996-04-28|TAKE BACK RETURN|TRUCK|eposits na +58753|1776|19|4|15|25166.55|0.01|0.06|N|O|1996-03-07|1996-03-04|1996-04-05|DELIVER IN PERSON|TRUCK|al deposits integrate about the fi +58753|364|93|5|6|7586.16|0.02|0.06|N|O|1996-05-19|1996-03-24|1996-05-31|TAKE BACK RETURN|RAIL|xpress deposits according to +58754|994|63|1|43|81484.57|0.09|0.03|N|O|1996-04-16|1996-03-27|1996-05-05|COLLECT COD|REG AIR|refully bold packages. regula +58754|1412|52|2|14|18387.74|0.00|0.05|N|O|1996-02-10|1996-03-19|1996-02-15|COLLECT COD|AIR|itaphs use iro +58754|1954|43|3|40|74238.00|0.06|0.01|N|O|1996-02-08|1996-02-22|1996-03-01|COLLECT COD|RAIL|ven asymptotes. even ideas cajole furiously +58754|601|64|4|10|15016.00|0.01|0.00|N|O|1996-04-18|1996-03-07|1996-05-07|DELIVER IN PERSON|FOB| final epitaphs. request +58754|1152|25|5|44|46338.60|0.04|0.05|N|O|1996-02-23|1996-02-29|1996-03-16|COLLECT COD|RAIL|tructions print furi +58755|218|73|1|10|11182.10|0.04|0.00|N|O|1995-12-29|1996-02-27|1996-01-25|TAKE BACK RETURN|AIR|larly. quick packages cajo +58755|1880|24|2|31|55238.28|0.02|0.02|N|O|1996-01-16|1996-01-21|1996-01-30|DELIVER IN PERSON|MAIL|onic instru +58755|791|88|3|7|11842.53|0.04|0.06|N|O|1996-03-10|1996-01-28|1996-03-29|TAKE BACK RETURN|TRUCK| the furiously silent depos +58755|330|15|4|10|12303.30|0.09|0.00|N|O|1996-03-05|1996-01-22|1996-03-18|NONE|MAIL| pinto beans haggle careful +58755|1689|72|5|44|69989.92|0.08|0.02|N|O|1996-02-17|1996-02-13|1996-03-11|COLLECT COD|REG AIR| regular theodolites? blithely +58756|1794|95|1|1|1695.79|0.08|0.08|N|O|1997-04-03|1997-03-03|1997-04-28|TAKE BACK RETURN|AIR|usly regular packages. blit +58756|644|45|2|11|16991.04|0.05|0.05|N|O|1997-02-01|1997-04-06|1997-03-01|TAKE BACK RETURN|REG AIR|heodolites haggle quickly acro +58756|1282|20|3|46|54430.88|0.01|0.02|N|O|1997-04-20|1997-03-25|1997-05-20|TAKE BACK RETURN|FOB| ideas doze slyly. dolp +58756|1529|10|4|28|40054.56|0.06|0.03|N|O|1997-04-20|1997-03-14|1997-05-11|TAKE BACK RETURN|FOB|riously even +58756|1683|25|5|4|6338.72|0.08|0.07|N|O|1997-02-22|1997-04-01|1997-03-23|NONE|FOB|s hinder. blithely even asymptotes hagg +58757|307|36|1|1|1207.30|0.01|0.07|R|F|1994-03-15|1994-03-16|1994-04-13|NONE|RAIL|ely silent pinto beans. enticing +58757|942|43|2|24|44230.56|0.07|0.00|A|F|1994-04-08|1994-02-23|1994-04-26|NONE|REG AIR|ze blithely. ironi +58757|932|1|3|5|9164.65|0.06|0.04|R|F|1994-03-18|1994-03-19|1994-04-12|TAKE BACK RETURN|REG AIR|ts integrate blithely regu +58757|1145|82|4|43|44984.02|0.07|0.00|R|F|1994-05-06|1994-03-15|1994-05-09|TAKE BACK RETURN|TRUCK| beans. braids hang after th +58757|1168|41|5|49|52388.84|0.03|0.07|A|F|1994-03-25|1994-04-13|1994-04-15|DELIVER IN PERSON|SHIP|counts. sly +58757|1564|65|6|38|55691.28|0.00|0.05|A|F|1994-01-23|1994-04-06|1994-01-30|COLLECT COD|SHIP|s x-ray blithely. regular acco +58757|1781|82|7|40|67311.20|0.07|0.08|A|F|1994-02-23|1994-03-13|1994-02-25|COLLECT COD|REG AIR|packages cajole a +58758|1059|60|1|19|18240.95|0.04|0.06|A|F|1993-12-25|1994-01-18|1994-01-21|TAKE BACK RETURN|AIR|eat. foxes are. fluffily unusu +58758|1861|48|2|45|79328.70|0.03|0.06|R|F|1993-12-10|1994-01-30|1993-12-16|DELIVER IN PERSON|TRUCK|. final atta +58759|127|28|1|28|28759.36|0.02|0.05|A|F|1994-05-07|1994-03-25|1994-05-25|DELIVER IN PERSON|FOB|g the carefully ironic cour +58759|1434|13|2|41|54752.63|0.04|0.01|A|F|1994-04-27|1994-02-27|1994-04-29|COLLECT COD|MAIL|ts boost fluffily unusual excuses +58759|393|94|3|9|11640.51|0.02|0.01|A|F|1994-04-04|1994-04-05|1994-04-05|COLLECT COD|REG AIR|instructions use slyly re +58759|1814|44|4|33|56621.73|0.07|0.01|A|F|1994-03-09|1994-03-28|1994-04-01|COLLECT COD|RAIL|lar ideas. even asymptotes wake +58759|226|54|5|47|52932.34|0.10|0.07|R|F|1994-02-20|1994-03-19|1994-03-05|COLLECT COD|RAIL|express foxes sleep sly +58759|493|94|6|4|5573.96|0.01|0.08|A|F|1994-02-16|1994-04-18|1994-02-24|TAKE BACK RETURN|MAIL|counts sleep blithely. express, pending re +58759|332|33|7|26|32040.58|0.01|0.03|R|F|1994-03-25|1994-03-23|1994-03-29|NONE|FOB|old. furiously bold courts after +58784|87|38|1|31|30599.48|0.09|0.06|A|F|1994-02-11|1994-03-10|1994-02-22|TAKE BACK RETURN|RAIL|furiously +58784|1747|90|2|37|61003.38|0.08|0.05|A|F|1994-01-30|1994-02-25|1994-02-17|NONE|RAIL|y. slyly iro +58784|335|92|3|34|42001.22|0.05|0.07|R|F|1994-02-25|1994-04-08|1994-03-03|NONE|REG AIR|s the regular the +58784|650|51|4|9|13955.85|0.10|0.00|R|F|1994-05-14|1994-03-09|1994-05-24|NONE|TRUCK|nic accounts. Tiresias +58784|607|70|5|29|43720.40|0.03|0.05|A|F|1994-04-23|1994-03-24|1994-05-21|COLLECT COD|RAIL|ond the ironic foxes kindle blit +58784|733|34|6|31|50645.63|0.10|0.03|R|F|1994-02-08|1994-03-17|1994-02-23|NONE|SHIP|ding to the furiously enticing ideas +58784|361|18|7|20|25227.20|0.06|0.00|R|F|1994-04-04|1994-03-06|1994-04-27|COLLECT COD|FOB|beans sleep blithely among the expr +58785|482|70|1|33|45621.84|0.01|0.06|N|O|1997-05-17|1997-07-07|1997-06-12|NONE|REG AIR|al ideas are. pinto beans among the ironi +58785|1726|27|2|5|8138.60|0.05|0.05|N|O|1997-04-22|1997-06-10|1997-05-19|COLLECT COD|REG AIR| silent tithes. ironic, +58785|588|19|3|18|26794.44|0.00|0.04|N|O|1997-06-28|1997-06-21|1997-07-17|NONE|SHIP|ccounts. express platel +58785|188|67|4|7|7617.26|0.10|0.02|N|O|1997-05-30|1997-06-23|1997-06-01|COLLECT COD|TRUCK|kly regular platelets. bold pinto be +58785|1768|69|5|48|80148.48|0.06|0.04|N|O|1997-07-31|1997-05-18|1997-08-22|DELIVER IN PERSON|FOB|inal, ironic reque +58785|1580|1|6|45|66671.10|0.04|0.07|N|O|1997-06-23|1997-05-28|1997-07-15|TAKE BACK RETURN|RAIL|ideas could hav +58786|590|81|1|32|47698.88|0.10|0.06|N|O|1996-04-21|1996-05-23|1996-05-06|TAKE BACK RETURN|MAIL| against the bold packages. carefu +58786|893|60|2|30|53816.70|0.00|0.08|N|O|1996-04-15|1996-05-16|1996-04-17|DELIVER IN PERSON|SHIP|r platelets! blithely regular theodolites +58786|1078|14|3|24|23497.68|0.02|0.04|N|O|1996-05-02|1996-04-20|1996-05-28|DELIVER IN PERSON|REG AIR|h the slyly even p +58786|909|44|4|47|85065.30|0.01|0.07|N|O|1996-06-14|1996-04-21|1996-06-27|COLLECT COD|REG AIR|s pinto beans. pending foxes nag +58786|1371|10|5|21|26719.77|0.00|0.07|N|O|1996-06-16|1996-04-01|1996-06-17|TAKE BACK RETURN|FOB|ly special theodolites. dependencies w +58786|366|51|6|11|13929.96|0.04|0.02|N|O|1996-05-19|1996-05-12|1996-06-08|DELIVER IN PERSON|TRUCK|t asymptotes. re +58787|1086|87|1|14|13819.12|0.06|0.08|N|O|1997-05-01|1997-06-19|1997-05-17|DELIVER IN PERSON|AIR|ic requests wake abo +58787|659|91|2|28|43670.20|0.01|0.04|N|O|1997-07-15|1997-06-10|1997-07-29|NONE|TRUCK|ts. furiously even +58787|624|18|3|27|41164.74|0.00|0.02|N|O|1997-05-19|1997-05-16|1997-05-20|COLLECT COD|TRUCK| theodolites. carefully unusual dependencie +58788|653|16|1|39|60592.35|0.09|0.00|A|F|1993-05-13|1993-04-21|1993-06-05|TAKE BACK RETURN|REG AIR|odolites. carefull +58788|1801|88|2|2|3405.60|0.10|0.00|R|F|1993-05-03|1993-04-10|1993-05-15|TAKE BACK RETURN|SHIP|nly final theodolites +58788|1241|79|3|25|28556.00|0.03|0.01|R|F|1993-03-11|1993-04-26|1993-03-13|DELIVER IN PERSON|TRUCK|eposits caj +58788|1323|24|4|34|41626.88|0.09|0.02|R|F|1993-03-30|1993-04-13|1993-04-10|DELIVER IN PERSON|FOB| carefully ironic not +58788|1450|68|5|25|33786.25|0.03|0.04|A|F|1993-04-08|1993-04-03|1993-04-12|NONE|MAIL|ecial epitaphs +58789|1110|19|1|20|20222.20|0.02|0.01|A|F|1993-11-20|1993-10-21|1993-12-11|TAKE BACK RETURN|AIR| ideas. regular, even instr +58789|893|27|2|41|73549.49|0.07|0.04|A|F|1993-10-23|1993-10-09|1993-11-03|COLLECT COD|RAIL|s. ironic, pending +58789|722|87|3|8|12981.76|0.08|0.05|A|F|1993-11-25|1993-11-04|1993-12-12|TAKE BACK RETURN|MAIL|jole. final, even instructions +58789|608|71|4|11|16594.60|0.04|0.08|A|F|1993-10-24|1993-10-14|1993-11-08|NONE|TRUCK|ular somas wake enticingly across the +58790|462|92|1|3|4087.38|0.07|0.05|N|O|1997-11-23|1997-11-23|1997-12-06|COLLECT COD|REG AIR|ckly unusual +58790|779|80|2|3|5039.31|0.05|0.01|N|O|1997-11-27|1997-10-04|1997-12-13|DELIVER IN PERSON|REG AIR|ptotes wake around the +58790|303|32|3|33|39708.90|0.05|0.01|N|O|1997-11-24|1997-11-21|1997-12-20|COLLECT COD|RAIL|y ironic depo +58790|852|53|4|44|77125.40|0.08|0.04|N|O|1997-10-12|1997-10-29|1997-10-27|DELIVER IN PERSON|AIR|tes haggle quickly fluffily regular +58790|1839|69|5|17|29594.11|0.08|0.01|N|O|1997-12-17|1997-11-05|1997-12-21|NONE|SHIP|ular pinto be +58790|1972|5|6|12|22487.64|0.04|0.00|N|O|1997-09-01|1997-10-20|1997-09-19|COLLECT COD|RAIL| nod. instructions detect slyly above the +58790|1949|50|7|17|31465.98|0.06|0.05|N|O|1997-10-29|1997-10-02|1997-11-11|COLLECT COD|RAIL|ending pinto beans cajole carefully car +58791|384|69|1|30|38531.40|0.08|0.00|N|O|1996-11-07|1996-10-29|1996-12-02|NONE|SHIP|nto beans play even, careful r +58791|342|43|2|47|58389.98|0.10|0.01|N|O|1996-12-24|1996-11-06|1997-01-17|NONE|MAIL|ages affix around the courts +58791|1532|53|3|9|12901.77|0.09|0.02|N|O|1996-11-19|1996-10-08|1996-12-18|COLLECT COD|SHIP|quickly after th +58816|1518|39|1|26|36907.26|0.09|0.04|N|O|1998-04-02|1998-02-15|1998-04-16|COLLECT COD|TRUCK|r, ironic requ +58816|684|16|2|31|49125.08|0.10|0.07|N|O|1998-03-20|1998-03-03|1998-04-10|TAKE BACK RETURN|REG AIR|r requests aft +58816|669|70|3|47|73774.02|0.02|0.04|N|O|1997-12-16|1998-03-11|1997-12-31|TAKE BACK RETURN|AIR|encies along the quickly express +58816|1607|31|4|29|43749.40|0.03|0.00|N|O|1998-02-16|1998-03-08|1998-02-17|TAKE BACK RETURN|TRUCK|lar, permanent pint +58816|147|26|5|31|32461.34|0.07|0.02|N|O|1998-02-01|1998-03-02|1998-02-24|COLLECT COD|SHIP| cajole blithely furious +58816|1725|68|6|21|34161.12|0.02|0.04|N|O|1997-12-29|1998-03-04|1998-01-21|TAKE BACK RETURN|MAIL|inal packages are slyly. dolphins around t +58816|1437|38|7|30|40152.90|0.09|0.06|N|O|1997-12-14|1998-03-06|1998-01-08|TAKE BACK RETURN|FOB|ven packag +58817|1148|57|1|26|27277.64|0.01|0.04|R|F|1995-05-25|1995-03-25|1995-06-05|NONE|MAIL|ckly regular dolphins. slyly final asy +58818|782|83|1|38|63945.64|0.01|0.08|R|F|1994-06-12|1994-06-27|1994-06-22|NONE|FOB|requests. carefully ironic platelet +58818|1916|49|2|25|45447.75|0.04|0.03|R|F|1994-06-07|1994-06-15|1994-06-10|COLLECT COD|AIR|ily even pinto beans det +58818|454|13|3|5|6772.25|0.03|0.00|R|F|1994-07-05|1994-05-21|1994-07-22|DELIVER IN PERSON|REG AIR|e. forges a +58818|646|78|4|34|52585.76|0.01|0.00|A|F|1994-07-01|1994-06-04|1994-07-15|TAKE BACK RETURN|MAIL|egular excuses. pendin +58818|1930|31|5|48|87932.64|0.08|0.06|R|F|1994-05-29|1994-06-19|1994-06-14|NONE|MAIL|ccording to the slyly bold theod +58818|287|42|6|19|22558.32|0.10|0.01|R|F|1994-05-28|1994-06-17|1994-06-14|COLLECT COD|FOB|l deposits sublate carefull +58819|1227|65|1|49|55282.78|0.09|0.07|A|F|1993-07-16|1993-08-18|1993-08-05|COLLECT COD|RAIL|ly ironic deposits. a +58819|1509|90|2|42|59241.00|0.04|0.06|A|F|1993-08-02|1993-08-19|1993-08-12|TAKE BACK RETURN|MAIL| fluffily. final theodolites are carefu +58819|882|83|3|44|78446.72|0.09|0.04|A|F|1993-07-29|1993-08-20|1993-08-24|COLLECT COD|MAIL| furiously regular foxes. +58819|189|42|4|32|34853.76|0.00|0.02|R|F|1993-07-18|1993-09-07|1993-08-12|NONE|AIR|aggle blithely wit +58819|1181|82|5|23|24890.14|0.01|0.00|R|F|1993-09-27|1993-08-16|1993-10-12|DELIVER IN PERSON|FOB|ccording to the expre +58819|1454|94|6|37|50151.65|0.01|0.00|R|F|1993-10-09|1993-07-21|1993-11-02|COLLECT COD|REG AIR| requests eat blithely. blithel +58820|1235|73|1|33|37495.59|0.08|0.02|R|F|1993-05-26|1993-04-12|1993-06-01|NONE|RAIL|ic foxes. +58820|438|97|2|5|6692.15|0.10|0.05|R|F|1993-04-30|1993-04-20|1993-05-22|DELIVER IN PERSON|TRUCK| ironic requests. furiously pending idea +58820|1129|66|3|35|36054.20|0.04|0.07|A|F|1993-04-03|1993-04-08|1993-04-11|NONE|TRUCK| wake. quickly final de +58820|755|88|4|14|23180.50|0.02|0.05|R|F|1993-05-07|1993-04-08|1993-05-27|COLLECT COD|AIR|regular packages sleep agains +58821|1427|67|1|31|41181.02|0.10|0.07|R|F|1993-06-04|1993-03-16|1993-06-21|NONE|SHIP|around the ruthlessly even pac +58821|1011|17|2|4|3648.04|0.00|0.04|R|F|1993-06-01|1993-04-03|1993-06-03|TAKE BACK RETURN|TRUCK|. carefully expres +58821|121|100|3|36|36760.32|0.05|0.02|R|F|1993-02-27|1993-05-11|1993-03-25|COLLECT COD|RAIL|ourts wake furiously alon +58822|703|100|1|40|64148.00|0.07|0.05|N|O|1995-11-02|1995-11-11|1995-11-18|DELIVER IN PERSON|FOB|ts play always care +58822|109|88|2|27|27245.70|0.01|0.08|N|O|1995-09-18|1995-09-29|1995-10-09|TAKE BACK RETURN|RAIL|pending packages haggle furiousl +58823|594|85|1|29|43343.11|0.00|0.03|N|O|1996-11-14|1996-11-23|1996-12-02|TAKE BACK RETURN|RAIL|lly ironic foxes. quickly even reques +58823|375|4|2|39|49739.43|0.05|0.03|N|O|1997-01-16|1996-12-10|1997-01-31|COLLECT COD|SHIP|slyly regular pa +58823|547|38|3|17|24608.18|0.09|0.01|N|O|1996-10-07|1996-10-27|1996-11-03|NONE|RAIL| slyly even packages. car +58848|521|12|1|14|19901.28|0.05|0.00|A|F|1993-09-15|1993-11-06|1993-10-01|COLLECT COD|REG AIR|blithely regular e +58848|631|94|2|4|6126.52|0.09|0.08|R|F|1993-11-01|1993-11-29|1993-11-29|COLLECT COD|MAIL|gainst the bold, express deposits +58848|474|75|3|1|1374.47|0.04|0.07|A|F|1993-09-18|1993-10-25|1993-10-18|DELIVER IN PERSON|MAIL|ck pinto beans across +58848|454|13|4|49|66368.05|0.01|0.05|R|F|1993-10-06|1993-10-04|1993-10-08|COLLECT COD|SHIP|aids wake slyly along the blithel +58848|621|15|5|25|38040.50|0.03|0.05|R|F|1993-09-16|1993-12-01|1993-10-09|NONE|AIR| carefully carefully express instructions. +58848|1082|53|6|4|3932.32|0.08|0.08|A|F|1993-12-20|1993-11-22|1994-01-19|NONE|TRUCK|final asymptotes about the pinto beans +58849|455|56|1|50|67772.50|0.02|0.08|R|F|1994-07-19|1994-07-13|1994-08-02|TAKE BACK RETURN|RAIL|ove the express depende +58849|1496|97|2|13|18167.37|0.08|0.00|R|F|1994-06-02|1994-06-11|1994-06-22|NONE|FOB|nto beans nag. +58849|1422|40|3|29|38379.18|0.10|0.03|R|F|1994-05-25|1994-07-27|1994-06-14|COLLECT COD|FOB|ts after the slyly final gifts hagg +58849|232|14|4|36|40760.28|0.00|0.00|R|F|1994-08-07|1994-07-14|1994-08-09|COLLECT COD|SHIP|uriously special +58850|1306|83|1|21|25353.30|0.03|0.00|N|O|1997-04-05|1997-03-09|1997-04-13|TAKE BACK RETURN|AIR| final dugouts. blithely idle p +58851|947|48|1|47|86853.18|0.07|0.01|A|F|1993-07-26|1993-09-06|1993-08-06|NONE|TRUCK|, bold accounts +58851|662|25|2|44|68757.04|0.05|0.07|R|F|1993-08-28|1993-08-31|1993-08-29|COLLECT COD|TRUCK|refully even packages wake slyly ir +58851|1633|57|3|17|26088.71|0.09|0.06|A|F|1993-06-10|1993-08-15|1993-07-06|DELIVER IN PERSON|REG AIR|he regular, bold instr +58851|334|35|4|34|41967.22|0.06|0.04|R|F|1993-07-28|1993-08-09|1993-08-24|NONE|AIR|ss the ironic depo +58851|1556|57|5|36|52471.80|0.01|0.05|R|F|1993-09-25|1993-08-25|1993-10-23|COLLECT COD|SHIP|grate according to th +58851|1852|53|6|13|22800.05|0.01|0.08|A|F|1993-07-27|1993-08-31|1993-08-07|DELIVER IN PERSON|FOB|s haggle blithely after the dep +58852|45|96|1|1|945.04|0.10|0.08|N|O|1998-07-18|1998-07-08|1998-08-02|NONE|SHIP|he quickly pending foxes- +58852|190|17|2|33|35976.27|0.06|0.05|N|O|1998-09-06|1998-07-08|1998-09-19|DELIVER IN PERSON|MAIL|ges wake bl +58853|310|11|1|32|38729.92|0.03|0.06|A|F|1992-08-27|1992-07-16|1992-09-02|DELIVER IN PERSON|REG AIR|bold, special excu +58854|1624|7|1|37|56447.94|0.09|0.02|A|F|1993-04-28|1993-06-05|1993-05-14|NONE|RAIL|regular, f +58854|229|11|2|39|44039.58|0.06|0.00|A|F|1993-06-23|1993-06-22|1993-06-29|TAKE BACK RETURN|RAIL|ages. carefully final packages g +58854|1471|50|3|45|61761.15|0.03|0.07|A|F|1993-05-11|1993-07-01|1993-05-25|DELIVER IN PERSON|RAIL|the deposits are according +58854|1475|54|4|5|6882.35|0.06|0.05|A|F|1993-07-12|1993-06-27|1993-07-24|TAKE BACK RETURN|REG AIR| dependencies are +58854|851|51|5|42|73577.70|0.05|0.07|R|F|1993-08-01|1993-06-20|1993-08-21|DELIVER IN PERSON|RAIL|permanent, bold ideas integrate +58855|218|73|1|36|40255.56|0.05|0.01|A|F|1994-02-12|1993-12-03|1994-03-08|DELIVER IN PERSON|MAIL|express pinto beans. +58855|1828|58|2|27|46705.14|0.05|0.03|R|F|1993-12-23|1993-12-21|1994-01-17|NONE|AIR|ly express requests are after t +58880|709|42|1|48|77265.60|0.00|0.00|A|F|1995-02-24|1995-02-12|1995-03-21|NONE|RAIL|s. slyly final asymp +58880|1549|30|2|12|17406.48|0.04|0.07|A|F|1995-04-07|1995-02-07|1995-04-27|NONE|RAIL|aggle quickly thinly final platelet +58880|1383|98|3|19|24403.22|0.08|0.01|A|F|1995-05-09|1995-02-19|1995-05-24|COLLECT COD|MAIL| unusual, pending depos +58880|992|27|4|47|88970.53|0.09|0.03|R|F|1995-02-14|1995-03-14|1995-03-15|NONE|FOB|inal accounts +58881|980|81|1|24|45143.52|0.06|0.02|N|O|1996-05-14|1996-04-29|1996-05-17|COLLECT COD|SHIP| accounts. furiously ironic deposits wak +58881|1597|18|2|48|71932.32|0.05|0.05|N|O|1996-04-12|1996-05-18|1996-04-30|COLLECT COD|RAIL|ithely blithely enticing theodolites. +58881|397|82|3|48|62274.72|0.06|0.05|N|O|1996-05-23|1996-05-24|1996-06-14|COLLECT COD|TRUCK|uses. fluffily ironi +58881|1724|9|4|17|27637.24|0.10|0.06|N|O|1996-04-17|1996-05-21|1996-05-05|COLLECT COD|REG AIR|ep carefully slyly express courts. blith +58881|1899|86|5|46|82840.94|0.04|0.04|N|O|1996-04-30|1996-05-23|1996-05-10|NONE|FOB| final deposits integrate furiously +58881|394|95|6|13|16827.07|0.01|0.06|N|O|1996-04-20|1996-04-29|1996-04-26|NONE|TRUCK|nic packages are slyly carefully +58881|201|83|7|9|9910.80|0.04|0.00|N|O|1996-05-25|1996-05-04|1996-06-22|COLLECT COD|MAIL|y furiously pending packages. furiously +58882|1318|95|1|2|2438.62|0.05|0.05|A|F|1994-04-17|1994-05-11|1994-04-19|DELIVER IN PERSON|FOB|rding to the entic +58882|390|47|2|21|27098.19|0.05|0.06|R|F|1994-06-01|1994-06-05|1994-06-30|NONE|TRUCK| regularly bold requests integrat +58883|1693|76|1|46|73355.74|0.07|0.07|A|F|1992-12-07|1992-10-04|1992-12-15|COLLECT COD|SHIP|nag blithely idle ideas. i +58883|1096|2|2|9|8973.81|0.03|0.08|R|F|1992-11-05|1992-09-14|1992-11-22|NONE|REG AIR|cial asymptotes. fluffily regular pattern +58883|1268|43|3|31|36247.06|0.08|0.02|A|F|1992-11-07|1992-10-08|1992-11-09|COLLECT COD|SHIP|. carefully bold accounts above the caref +58883|452|53|4|29|39221.05|0.10|0.03|A|F|1992-11-07|1992-10-13|1992-11-21|TAKE BACK RETURN|TRUCK|sts nag. bl +58883|1148|21|5|12|12589.68|0.04|0.07|R|F|1992-11-26|1992-10-10|1992-12-20|TAKE BACK RETURN|SHIP|ular packages. ironic theo +58883|783|16|6|17|28624.26|0.03|0.04|A|F|1992-12-08|1992-09-16|1992-12-17|NONE|FOB|kly. final, fi +58883|601|64|7|30|45048.00|0.04|0.00|A|F|1992-08-27|1992-09-20|1992-09-17|DELIVER IN PERSON|MAIL|elets. furiously r +58884|96|47|1|20|19921.80|0.10|0.04|A|F|1995-03-23|1995-06-09|1995-04-19|DELIVER IN PERSON|RAIL|t above the bold platelets. +58884|413|1|2|45|59103.45|0.09|0.05|A|F|1995-06-15|1995-05-05|1995-06-17|DELIVER IN PERSON|AIR|ven packages. +58884|1879|23|3|8|14246.96|0.08|0.01|R|F|1995-03-23|1995-05-27|1995-04-10|DELIVER IN PERSON|FOB|onic deposit +58884|450|38|4|7|9453.15|0.08|0.04|A|F|1995-05-26|1995-06-01|1995-06-12|DELIVER IN PERSON|SHIP|l requests! blithely ironic package +58885|1181|18|1|5|5410.90|0.01|0.01|A|F|1994-09-20|1994-10-23|1994-09-27|COLLECT COD|FOB|ions. quickly ironic acco +58885|927|28|2|27|49353.84|0.07|0.02|R|F|1994-11-03|1994-10-03|1994-12-03|TAKE BACK RETURN|REG AIR|symptotes. blithely +58885|575|66|3|31|45742.67|0.01|0.04|A|F|1994-10-06|1994-10-02|1994-10-26|DELIVER IN PERSON|TRUCK|ggedly ironic platelets cajole furio +58885|371|100|4|41|52126.17|0.06|0.03|A|F|1994-09-16|1994-10-02|1994-10-14|NONE|MAIL|bove the carefully even requests. i +58885|927|30|5|36|65805.12|0.01|0.08|R|F|1994-10-06|1994-10-31|1994-10-18|TAKE BACK RETURN|SHIP|inal accounts. sometimes regular theodoli +58885|1061|62|6|44|42330.64|0.04|0.08|A|F|1994-09-04|1994-10-27|1994-10-02|TAKE BACK RETURN|TRUCK|ily regular foxes. quickly even accounts c +58885|44|95|7|2|1888.08|0.08|0.06|A|F|1994-09-07|1994-10-02|1994-09-30|COLLECT COD|MAIL|e even, permanent deposits cajole quick +58886|1060|61|1|25|24026.50|0.02|0.02|N|O|1996-08-03|1996-10-12|1996-08-31|DELIVER IN PERSON|MAIL|wly unusual deposits are slyly +58886|1837|81|2|34|59120.22|0.07|0.05|N|O|1996-08-26|1996-10-05|1996-09-22|TAKE BACK RETURN|SHIP|luffily unusual packages breach fur +58886|989|24|3|42|79379.16|0.01|0.07|N|O|1996-09-08|1996-09-17|1996-09-27|NONE|MAIL|ely final pinto bea +58887|665|66|1|31|48535.46|0.05|0.00|N|O|1997-01-29|1997-01-08|1997-02-06|COLLECT COD|MAIL| final, regular packages. fluffily iro +58887|1997|98|2|29|55070.71|0.09|0.06|N|O|1997-01-10|1997-01-18|1997-01-18|NONE|MAIL|ke along the sometimes even patter +58887|761|58|3|16|26588.16|0.05|0.06|N|O|1997-02-02|1996-12-03|1997-02-08|TAKE BACK RETURN|FOB|ly ironic warhorses according to t +58887|1709|36|4|8|12885.60|0.06|0.00|N|O|1997-01-21|1996-12-02|1997-02-12|DELIVER IN PERSON|RAIL|atelets integrate fluffily express, reg +58912|899|100|1|27|48597.03|0.01|0.08|N|O|1997-10-19|1997-11-04|1997-11-01|DELIVER IN PERSON|REG AIR|even requests serve even +58912|519|10|2|18|25551.18|0.03|0.08|N|O|1997-12-20|1997-11-30|1998-01-17|DELIVER IN PERSON|AIR|ffily throughout +58912|495|54|3|40|55819.60|0.06|0.05|N|O|1997-12-20|1997-12-03|1998-01-12|NONE|FOB|into beans. sly +58912|1276|88|4|26|30609.02|0.06|0.04|N|O|1997-11-27|1997-10-27|1997-12-17|COLLECT COD|TRUCK|. carefully unusual packages wake slyly +58913|945|80|1|28|51686.32|0.02|0.02|A|F|1993-05-26|1993-07-07|1993-06-04|COLLECT COD|TRUCK|s boost furiously express plate +58913|1961|6|2|20|37259.20|0.06|0.00|A|F|1993-07-30|1993-07-23|1993-08-02|DELIVER IN PERSON|RAIL|lithely even ac +58913|741|42|3|16|26267.84|0.07|0.05|R|F|1993-09-04|1993-07-04|1993-09-11|NONE|AIR| across the slyly even requests. ide +58913|419|49|4|26|34304.66|0.04|0.05|R|F|1993-05-30|1993-07-31|1993-05-31|NONE|FOB|as detect fluffily furio +58913|1677|1|5|27|42624.09|0.09|0.02|R|F|1993-05-26|1993-08-05|1993-06-24|NONE|TRUCK|ven accounts wake quickl +58913|223|78|6|44|49421.68|0.02|0.03|A|F|1993-07-07|1993-08-03|1993-07-27|TAKE BACK RETURN|AIR|sly regular requests wake carefully entic +58914|1805|49|1|37|63151.60|0.05|0.03|R|F|1994-05-15|1994-06-11|1994-06-12|COLLECT COD|REG AIR|y ironic deposits are care +58914|1043|79|2|29|27377.16|0.02|0.02|R|F|1994-08-04|1994-05-17|1994-08-11|TAKE BACK RETURN|FOB|ongside of the f +58914|247|29|3|38|43595.12|0.01|0.06|A|F|1994-07-13|1994-06-28|1994-08-05|NONE|REG AIR|final packages. blithely ironic ideas ha +58914|1688|30|4|38|60407.84|0.03|0.00|R|F|1994-05-20|1994-05-24|1994-06-16|COLLECT COD|AIR|xes. slyly exp +58914|574|35|5|46|67830.22|0.06|0.06|R|F|1994-05-14|1994-06-28|1994-06-11|NONE|MAIL|bold dolphins are quietly ironic, reg +58915|1713|56|1|31|50056.01|0.09|0.03|A|F|1992-04-14|1992-02-20|1992-04-17|TAKE BACK RETURN|SHIP|e final, pend +58915|813|13|2|27|46272.87|0.03|0.01|R|F|1992-05-07|1992-03-08|1992-05-15|DELIVER IN PERSON|REG AIR|express, express platelets +58915|1632|15|3|40|61345.20|0.07|0.08|R|F|1992-01-27|1992-03-13|1992-02-20|NONE|FOB|pinto beans among +58916|1540|61|1|46|66310.84|0.03|0.08|N|O|1997-05-17|1997-04-20|1997-05-30|COLLECT COD|TRUCK|nts are furiously fi +58916|614|8|2|21|31806.81|0.01|0.08|N|O|1997-02-16|1997-04-23|1997-03-07|NONE|RAIL|g unusual deposits. pendin +58916|378|35|3|12|15340.44|0.05|0.02|N|O|1997-01-26|1997-03-27|1997-02-09|COLLECT COD|MAIL|s detect a +58916|2000|1|4|23|20746.00|0.08|0.06|N|O|1997-03-19|1997-04-06|1997-04-10|COLLECT COD|REG AIR|as. ironic account +58916|501|2|5|18|25227.00|0.04|0.01|N|O|1997-02-04|1997-03-06|1997-02-08|TAKE BACK RETURN|TRUCK|kly bold requests haggle ir +58916|1354|31|6|41|51469.35|0.05|0.03|N|O|1997-03-28|1997-02-22|1997-04-24|NONE|TRUCK|equests ac +58917|31|32|1|30|27930.90|0.04|0.01|A|F|1992-04-04|1992-05-22|1992-04-05|COLLECT COD|MAIL|long the accounts. dogged, +58917|960|29|2|6|11165.76|0.02|0.07|R|F|1992-03-06|1992-05-06|1992-03-09|DELIVER IN PERSON|SHIP|ages. enticing +58917|542|73|3|30|43276.20|0.00|0.04|R|F|1992-04-20|1992-04-10|1992-05-19|DELIVER IN PERSON|SHIP|leep quickly regular deposits: care +58917|1125|34|4|6|6156.72|0.02|0.05|A|F|1992-05-24|1992-05-01|1992-06-19|TAKE BACK RETURN|REG AIR|es across the slyly final dependenc +58917|388|17|5|4|5153.52|0.09|0.01|A|F|1992-03-22|1992-05-20|1992-03-25|DELIVER IN PERSON|REG AIR|y even theodolites dazzle according to the +58918|787|84|1|6|10126.68|0.05|0.01|A|F|1994-10-06|1994-08-09|1994-11-02|COLLECT COD|TRUCK|ackages alongside of t +58919|559|20|1|6|8757.30|0.06|0.00|N|O|1996-12-13|1996-12-12|1996-12-21|DELIVER IN PERSON|AIR| enticing packages cajole slyly +58919|1946|35|2|3|5543.82|0.10|0.00|N|O|1997-01-16|1996-12-12|1997-01-30|DELIVER IN PERSON|FOB|to beans. blithely ironic foxes +58919|34|10|3|17|15878.51|0.03|0.08|N|O|1997-02-05|1997-01-08|1997-03-07|COLLECT COD|FOB|s cajole after the regular d +58919|1282|20|4|14|16565.92|0.05|0.07|N|O|1997-01-16|1997-01-15|1997-02-12|TAKE BACK RETURN|FOB|e; theodolites sub +58919|1442|82|5|16|21495.04|0.03|0.00|N|O|1996-12-20|1997-01-17|1997-01-08|TAKE BACK RETURN|REG AIR|s haggle. requ +58919|191|18|6|42|45829.98|0.10|0.04|N|O|1996-11-03|1996-12-14|1996-11-04|NONE|TRUCK|the ruthless pinto beans. slyly unusual the +58944|168|69|1|41|43794.56|0.05|0.06|R|F|1994-07-19|1994-07-10|1994-08-15|DELIVER IN PERSON|TRUCK| cajole slyly. pending platelets u +58945|1576|17|1|33|48759.81|0.01|0.06|N|O|1998-01-24|1997-12-18|1998-02-12|COLLECT COD|MAIL|ts. excuses int +58945|1667|9|2|15|23529.90|0.07|0.01|N|O|1997-11-24|1997-12-28|1997-12-06|NONE|RAIL|furiously slyly regu +58945|1562|83|3|40|58542.40|0.02|0.05|N|O|1997-11-30|1998-01-10|1997-12-05|TAKE BACK RETURN|TRUCK|ly regular foxes. regular, +58946|1508|29|1|46|64837.00|0.10|0.05|N|O|1998-03-14|1998-03-14|1998-03-23|DELIVER IN PERSON|RAIL|ilent theod +58946|1489|29|2|33|45885.84|0.04|0.01|N|O|1998-02-27|1998-03-16|1998-03-19|DELIVER IN PERSON|RAIL|ffily silent asymptotes +58946|1674|98|3|15|23635.05|0.00|0.00|N|O|1998-03-23|1998-03-15|1998-04-07|NONE|RAIL|st the final accounts. s +58946|1309|24|4|26|31467.80|0.09|0.04|N|O|1998-03-05|1998-03-26|1998-03-09|NONE|AIR|ions haggle +58946|1679|3|5|50|79033.50|0.04|0.01|N|O|1998-04-11|1998-04-01|1998-04-20|TAKE BACK RETURN|FOB|ending requests wake. final +58946|625|88|6|6|9153.72|0.03|0.07|N|O|1998-03-24|1998-03-29|1998-04-20|TAKE BACK RETURN|FOB|cajole quickly e +58946|524|25|7|6|8547.12|0.00|0.08|N|O|1998-04-12|1998-02-18|1998-04-29|NONE|MAIL|ogged ideas. fluffily final foxes use car +58947|1314|91|1|13|15799.03|0.01|0.01|N|O|1996-01-26|1995-10-27|1996-02-19|DELIVER IN PERSON|SHIP|st the asymptotes impress furiously b +58947|395|24|2|6|7772.34|0.03|0.06|N|O|1995-10-07|1995-11-27|1995-10-22|TAKE BACK RETURN|SHIP|he ironically pending packages. +58947|1311|50|3|6|7273.86|0.03|0.01|N|O|1996-01-01|1995-11-17|1996-01-23|NONE|AIR|s lose. pending pack +58947|819|53|4|50|85990.50|0.06|0.00|N|O|1995-12-20|1995-12-20|1995-12-27|DELIVER IN PERSON|SHIP|s may thrash +58947|1471|50|5|38|52153.86|0.10|0.08|N|O|1995-10-13|1995-10-27|1995-11-12|NONE|TRUCK|ual packages +58947|341|42|6|8|9930.72|0.10|0.01|N|O|1996-01-20|1995-11-21|1996-01-29|TAKE BACK RETURN|RAIL|ronic deposits haggle +58947|879|46|7|43|76534.41|0.00|0.03|N|O|1995-11-13|1995-12-02|1995-12-12|TAKE BACK RETURN|MAIL|gular accounts use carefull +58948|939|8|1|24|44158.32|0.01|0.02|N|O|1997-01-25|1997-01-25|1997-02-24|DELIVER IN PERSON|FOB| the blithe +58948|143|70|2|50|52157.00|0.06|0.00|N|O|1996-11-05|1996-12-11|1996-12-02|COLLECT COD|REG AIR|y final deposits wake sly +58948|1791|92|3|15|25391.85|0.08|0.01|N|O|1997-03-02|1997-01-15|1997-03-22|DELIVER IN PERSON|MAIL| furiously +58948|140|41|4|34|35364.76|0.06|0.00|N|O|1996-12-08|1997-01-09|1996-12-21|COLLECT COD|FOB|tead of the blithely special dolphins. even +58948|1894|24|5|5|8979.45|0.08|0.02|N|O|1997-01-16|1996-12-02|1997-01-28|COLLECT COD|REG AIR|ies. careful +58949|770|67|1|42|70172.34|0.07|0.02|R|F|1993-03-06|1993-02-03|1993-03-17|COLLECT COD|MAIL|regular dolphins. slyly b +58949|444|45|2|12|16133.28|0.05|0.06|R|F|1993-03-27|1993-02-16|1993-04-23|COLLECT COD|RAIL| sleep. regularl +58949|1887|17|3|6|10733.28|0.02|0.03|R|F|1993-04-01|1993-01-23|1993-04-09|COLLECT COD|REG AIR|e blithely +58949|493|81|4|39|54346.11|0.03|0.06|R|F|1992-12-20|1993-01-27|1992-12-28|NONE|AIR|ven asymptotes. furio +58949|1078|79|5|15|14686.05|0.06|0.04|R|F|1993-04-06|1993-02-24|1993-05-01|NONE|FOB|ithely after the furiously silent pack +58949|1882|12|6|14|24974.32|0.02|0.08|A|F|1993-01-21|1993-03-14|1993-01-25|COLLECT COD|REG AIR|the slyly even frets. quickly +58949|1537|38|7|49|70487.97|0.04|0.07|R|F|1993-03-27|1993-03-14|1993-04-13|NONE|TRUCK|pendencies nod furiously ev +58950|1015|21|1|39|35724.39|0.02|0.01|R|F|1994-08-07|1994-07-08|1994-09-05|TAKE BACK RETURN|MAIL|riously pending dependencies n +58950|1120|21|2|47|47992.64|0.06|0.00|R|F|1994-05-15|1994-06-08|1994-05-19|TAKE BACK RETURN|FOB|round the +58951|1421|22|1|21|27770.82|0.04|0.05|N|O|1998-01-14|1998-02-16|1998-02-10|DELIVER IN PERSON|RAIL|ffily regular +58951|1441|81|2|25|33561.00|0.02|0.06|N|O|1998-02-01|1998-01-11|1998-02-14|TAKE BACK RETURN|AIR|y final foxes are slyly ac +58951|275|76|3|19|22330.13|0.05|0.05|N|O|1998-03-15|1998-01-07|1998-04-02|COLLECT COD|RAIL|mptotes. quickly express requests boos +58976|1586|87|1|28|41652.24|0.01|0.03|R|F|1993-12-28|1994-02-17|1994-01-17|COLLECT COD|MAIL|uriously. +58976|1163|36|2|28|29796.48|0.05|0.01|A|F|1993-11-30|1994-02-24|1993-12-14|COLLECT COD|RAIL|y slyly busy packages. accounts cajole e +58977|431|32|1|6|7988.58|0.09|0.01|A|F|1994-12-21|1995-01-03|1994-12-26|DELIVER IN PERSON|AIR|carefully pendi +58977|1614|15|2|23|34859.03|0.05|0.01|A|F|1995-02-04|1995-01-05|1995-02-12|COLLECT COD|REG AIR|ickly special deposits acco +58978|208|90|1|33|36570.60|0.10|0.01|A|F|1992-02-29|1992-04-22|1992-03-10|NONE|RAIL|to beans. fluffily reg +58978|1195|96|2|13|14250.47|0.07|0.04|A|F|1992-03-02|1992-04-01|1992-03-06|COLLECT COD|RAIL|al, ironic theodolites affi +58978|1715|58|3|5|8083.55|0.10|0.05|R|F|1992-03-09|1992-03-17|1992-03-26|NONE|TRUCK|uriously final request +58978|1379|56|4|11|14084.07|0.04|0.07|R|F|1992-04-03|1992-03-09|1992-04-20|TAKE BACK RETURN|RAIL|ns. regularly bold de +58978|1690|91|5|42|66850.98|0.06|0.02|R|F|1992-03-15|1992-03-21|1992-04-01|COLLECT COD|AIR|pendencies. platelets cajole slyly f +58978|996|99|6|24|45527.76|0.07|0.01|A|F|1992-04-20|1992-04-01|1992-05-17|NONE|FOB|efully across +58979|1251|63|1|44|50699.00|0.10|0.07|N|O|1997-10-25|1997-09-15|1997-11-22|TAKE BACK RETURN|MAIL|c foxes. fluffily pending deposits accordin +58979|343|28|2|17|21136.78|0.08|0.05|N|O|1997-07-10|1997-09-03|1997-08-01|COLLECT COD|REG AIR|to beans engage blithel +58980|742|75|1|36|59138.64|0.09|0.00|A|F|1994-12-23|1995-01-19|1994-12-26|NONE|FOB| quickly spe +58980|964|65|2|37|69003.52|0.00|0.08|R|F|1995-03-03|1995-01-06|1995-03-31|DELIVER IN PERSON|SHIP|ffix. furiou +58981|1804|48|1|11|18763.80|0.10|0.06|A|F|1995-04-26|1995-03-26|1995-05-06|TAKE BACK RETURN|FOB| accounts. carefully bold +58981|1357|58|2|32|40267.20|0.03|0.08|A|F|1995-04-18|1995-03-31|1995-04-27|NONE|FOB|l dependencies use blithely. even theo +58982|1609|51|1|20|30212.00|0.08|0.00|N|O|1998-04-17|1998-04-23|1998-05-01|TAKE BACK RETURN|REG AIR|lent ideas cajole evenly for the final +58982|108|35|2|40|40324.00|0.02|0.04|N|O|1998-05-26|1998-05-15|1998-06-25|DELIVER IN PERSON|MAIL| packages according to the account +58983|608|9|1|8|12068.80|0.09|0.06|N|O|1997-05-17|1997-04-23|1997-05-31|COLLECT COD|RAIL|e. excuses above the +58983|1015|21|2|33|30228.33|0.08|0.07|N|O|1997-02-13|1997-03-08|1997-03-02|DELIVER IN PERSON|MAIL| bold deposits about the qu +58983|891|25|3|26|46589.14|0.02|0.08|N|O|1997-04-17|1997-04-11|1997-04-23|TAKE BACK RETURN|REG AIR|ng the sly +58983|1351|90|4|26|32561.10|0.03|0.08|N|O|1997-04-21|1997-04-04|1997-04-22|COLLECT COD|REG AIR|ully unusual deposits nag furiousl +58983|47|48|5|4|3788.16|0.03|0.01|N|O|1997-04-18|1997-03-26|1997-05-15|DELIVER IN PERSON|FOB|kages sleep +58983|876|77|6|8|14214.96|0.03|0.08|N|O|1997-03-21|1997-04-06|1997-04-10|COLLECT COD|AIR|even requests against the re +58983|1069|75|7|30|29101.80|0.02|0.03|N|O|1997-03-18|1997-03-24|1997-04-10|DELIVER IN PERSON|AIR|ss waters use. +59008|1858|59|1|48|84472.80|0.02|0.02|A|F|1993-12-21|1993-11-20|1993-12-30|COLLECT COD|FOB|sly regular packages. fur +59008|526|87|2|37|52781.24|0.09|0.06|A|F|1994-01-10|1993-11-15|1994-01-27|COLLECT COD|TRUCK|usly around the flu +59008|1135|8|3|30|31083.90|0.09|0.05|R|F|1993-11-07|1993-11-28|1993-11-28|TAKE BACK RETURN|MAIL|uriously regular +59008|1038|74|4|13|12207.39|0.08|0.02|A|F|1993-10-24|1993-12-27|1993-11-12|COLLECT COD|SHIP|unusual pinto bean +59008|450|9|5|27|36462.15|0.02|0.04|A|F|1994-01-14|1993-11-29|1994-01-23|COLLECT COD|SHIP| carefully unusua +59009|1536|17|1|28|40250.84|0.04|0.05|N|O|1995-12-09|1996-02-14|1995-12-18|DELIVER IN PERSON|FOB|ithely. pending requests wak +59009|486|74|2|2|2772.96|0.03|0.06|N|O|1995-12-27|1996-01-28|1996-01-16|DELIVER IN PERSON|RAIL|osits. blithely special accounts a +59009|893|93|3|30|53816.70|0.07|0.06|N|O|1996-01-09|1996-01-15|1996-01-28|NONE|SHIP|r packages use quickly after the final de +59009|976|11|4|40|75078.80|0.03|0.02|N|O|1996-01-16|1996-01-19|1996-01-17|COLLECT COD|SHIP|hely express notornis cajo +59010|726|91|1|11|17893.92|0.00|0.01|A|F|1995-05-07|1995-05-19|1995-05-20|DELIVER IN PERSON|SHIP|ng the special requests. so +59010|950|51|2|11|20360.45|0.10|0.04|N|O|1995-07-26|1995-05-31|1995-08-16|TAKE BACK RETURN|MAIL|theodolites integrate instructio +59011|998|1|1|4|7595.96|0.10|0.01|N|O|1998-08-01|1998-07-05|1998-08-17|TAKE BACK RETURN|RAIL|quests. carefully special accounts +59011|1705|48|2|48|77121.60|0.06|0.07|N|O|1998-06-09|1998-07-07|1998-06-18|COLLECT COD|RAIL|he accounts. s +59012|1962|63|1|13|24231.48|0.02|0.06|A|F|1994-05-01|1994-04-02|1994-05-04|COLLECT COD|SHIP|cording to the +59012|1213|51|2|37|41225.77|0.09|0.04|R|F|1994-01-24|1994-04-12|1994-01-26|DELIVER IN PERSON|MAIL| even, ironic pinto +59012|1083|84|3|5|4920.40|0.06|0.01|A|F|1994-01-23|1994-03-20|1994-02-13|TAKE BACK RETURN|SHIP|bits doze slyly. pending, final foxes da +59012|401|60|4|4|5205.60|0.08|0.00|A|F|1994-02-25|1994-02-28|1994-03-16|DELIVER IN PERSON|TRUCK| bold, bold platelet +59013|1280|18|1|30|35438.40|0.06|0.06|N|O|1998-06-12|1998-05-29|1998-07-09|DELIVER IN PERSON|AIR|requests use blithely according to the +59013|1897|98|2|17|30581.13|0.02|0.07|N|O|1998-06-20|1998-05-03|1998-06-29|NONE|AIR|s mold furiously. r +59013|961|64|3|13|24205.48|0.06|0.03|N|O|1998-05-24|1998-04-27|1998-06-20|TAKE BACK RETURN|FOB|g ideas run. furiousl +59013|143|96|4|7|7301.98|0.01|0.06|N|O|1998-06-14|1998-06-14|1998-06-15|TAKE BACK RETURN|TRUCK|s haggle along the +59013|780|13|5|47|78996.66|0.03|0.06|N|O|1998-07-16|1998-06-13|1998-08-10|DELIVER IN PERSON|RAIL|sts. carefully ironic forges are quickly. +59013|716|13|6|14|22633.94|0.07|0.06|N|O|1998-06-25|1998-05-15|1998-06-28|DELIVER IN PERSON|RAIL|pending theodolites haggl +59014|164|43|1|33|35117.28|0.06|0.01|N|O|1996-07-22|1996-07-19|1996-08-13|NONE|TRUCK|y regular excuses boost furio +59014|187|66|2|7|7610.26|0.05|0.07|N|O|1996-08-06|1996-06-10|1996-08-24|DELIVER IN PERSON|AIR| after the packages. blithely ironi +59014|481|11|3|18|24866.64|0.08|0.02|N|O|1996-06-01|1996-06-17|1996-06-08|NONE|SHIP| express deposits haggle c +59014|1459|77|4|40|54418.00|0.10|0.03|N|O|1996-05-26|1996-06-20|1996-06-02|TAKE BACK RETURN|TRUCK|ously pending pac +59015|1392|69|1|27|34921.53|0.09|0.07|R|F|1992-09-24|1992-07-02|1992-10-06|NONE|REG AIR| furiously final ideas +59015|1353|68|2|13|16306.55|0.09|0.04|R|F|1992-09-15|1992-08-14|1992-09-23|COLLECT COD|REG AIR|into beans integrate across the bu +59015|552|13|3|1|1452.55|0.10|0.03|R|F|1992-09-01|1992-08-23|1992-09-07|TAKE BACK RETURN|REG AIR| express, ironic acc +59015|775|40|4|25|41894.25|0.05|0.06|R|F|1992-06-18|1992-07-05|1992-06-30|COLLECT COD|MAIL|e ironic accounts! carefully bold exc +59015|347|32|5|20|24946.80|0.03|0.06|A|F|1992-07-06|1992-08-13|1992-07-18|COLLECT COD|TRUCK|s cajole slyly eve +59015|913|16|6|15|27208.65|0.08|0.01|A|F|1992-09-15|1992-08-04|1992-10-02|NONE|RAIL|. furiously ironic +59015|21|22|7|36|33156.72|0.03|0.01|A|F|1992-06-25|1992-08-05|1992-07-04|TAKE BACK RETURN|SHIP|round the furiously pending so +59040|1843|87|1|29|50600.36|0.05|0.03|N|O|1996-05-19|1996-05-05|1996-06-05|TAKE BACK RETURN|TRUCK|ular instru +59041|244|99|1|18|20596.32|0.00|0.05|N|O|1997-01-12|1996-11-17|1997-01-27|TAKE BACK RETURN|SHIP|nt deposits wake slyly bold requests. spe +59041|334|35|2|34|41967.22|0.00|0.02|N|O|1997-01-12|1996-11-16|1997-01-14|DELIVER IN PERSON|REG AIR|doze blithely pending theodolites. quickly +59041|167|68|3|43|45887.88|0.08|0.00|N|O|1996-11-30|1996-11-12|1996-12-06|COLLECT COD|TRUCK|cording to the +59041|976|77|4|12|22523.64|0.00|0.03|N|O|1996-11-23|1996-12-02|1996-12-13|COLLECT COD|MAIL|r dependencies nag slyly above the qui +59041|454|84|5|15|20316.75|0.07|0.04|N|O|1996-11-17|1996-12-21|1996-11-24|NONE|TRUCK|lar Tiresias. carefully final acco +59041|657|20|6|11|17134.15|0.02|0.07|N|O|1997-01-18|1996-11-26|1997-02-12|COLLECT COD|REG AIR|telets cajole furious +59042|1287|88|1|50|59414.00|0.04|0.05|N|O|1995-09-29|1995-09-04|1995-10-08|NONE|AIR|ully ironic packages wake. blithely +59042|674|75|2|31|48814.77|0.09|0.00|N|O|1995-10-15|1995-09-16|1995-10-22|NONE|MAIL|ackages. fluffily speci +59043|73|49|1|15|14596.05|0.02|0.00|R|F|1994-04-21|1994-03-11|1994-05-16|TAKE BACK RETURN|MAIL| the furiously bold dependencie +59043|1310|87|2|35|42395.85|0.08|0.05|R|F|1994-04-10|1994-03-21|1994-04-25|COLLECT COD|MAIL| quickly regular asymptotes sleep across +59043|215|70|3|48|53530.08|0.03|0.02|A|F|1994-02-28|1994-03-15|1994-03-29|TAKE BACK RETURN|MAIL|latelets. requests cajole +59043|269|70|4|25|29231.50|0.07|0.08|A|F|1994-04-08|1994-02-14|1994-04-11|TAKE BACK RETURN|AIR|g epitaphs detect silently. special depo +59043|1386|63|5|45|57932.10|0.05|0.07|A|F|1994-02-28|1994-03-03|1994-03-08|TAKE BACK RETURN|REG AIR|uickly silent accounts. regular ideas are +59043|287|42|6|14|16621.92|0.09|0.00|R|F|1994-02-06|1994-03-28|1994-02-12|TAKE BACK RETURN|REG AIR|nic, bold asymptotes i +59043|1519|40|7|11|15625.61|0.04|0.00|R|F|1994-02-09|1994-02-28|1994-02-21|TAKE BACK RETURN|TRUCK|uickly bold packages: +59044|1292|30|1|43|51311.47|0.06|0.03|N|O|1995-10-24|1995-09-22|1995-11-18|NONE|TRUCK| according to the special accoun +59044|93|69|2|15|14896.35|0.09|0.00|N|O|1995-10-05|1995-10-08|1995-10-12|NONE|AIR|lithely quiet accounts try to boost along +59044|438|97|3|2|2676.86|0.08|0.05|N|O|1995-10-18|1995-09-08|1995-11-10|COLLECT COD|TRUCK|ncies along th +59044|446|34|4|9|12117.96|0.05|0.08|N|O|1995-10-12|1995-09-19|1995-10-22|DELIVER IN PERSON|TRUCK|ess requests use bli +59044|717|14|5|49|79267.79|0.05|0.05|N|O|1995-09-29|1995-08-26|1995-10-05|NONE|MAIL|beans boost above the furiously f +59045|16|67|1|3|2748.03|0.04|0.02|A|F|1995-05-11|1995-03-30|1995-06-04|TAKE BACK RETURN|FOB|ly. stealthy ideas wake +59045|977|12|2|9|16901.73|0.08|0.02|R|F|1995-03-11|1995-04-20|1995-04-03|TAKE BACK RETURN|MAIL|ly final requests. ideas cajole. blithely +59045|1734|19|3|43|70336.39|0.06|0.08|A|F|1995-06-02|1995-04-27|1995-06-12|TAKE BACK RETURN|AIR|ackages. bold foxes nag +59045|1158|31|4|28|29656.20|0.01|0.05|A|F|1995-05-17|1995-03-31|1995-05-28|TAKE BACK RETURN|TRUCK|tegrate quickly regular depend +59045|348|77|5|19|23718.46|0.08|0.03|A|F|1995-06-05|1995-04-11|1995-06-06|COLLECT COD|MAIL|slyly final, final theodo +59045|37|13|6|23|21551.69|0.06|0.01|R|F|1995-04-16|1995-04-20|1995-05-08|DELIVER IN PERSON|SHIP|egular packages integrat +59046|640|34|1|6|9243.84|0.06|0.02|N|O|1996-11-22|1996-12-11|1996-12-09|NONE|TRUCK|ackages. blithely unusual theodolite +59046|442|30|2|46|61752.24|0.08|0.01|N|O|1996-10-22|1996-12-17|1996-11-21|TAKE BACK RETURN|TRUCK| haggle slyly among the bl +59046|1756|83|3|41|67967.75|0.06|0.00|N|O|1996-11-02|1996-11-06|1996-11-04|DELIVER IN PERSON|SHIP|ets affix car +59046|1882|69|4|38|67787.44|0.05|0.03|N|O|1996-10-18|1996-11-18|1996-11-13|TAKE BACK RETURN|AIR|ges. final, bold depo +59047|135|14|1|3|3105.39|0.05|0.04|R|F|1995-05-09|1995-03-07|1995-06-01|TAKE BACK RETURN|AIR|g, silent deposits integrate at the furious +59047|866|100|2|37|65373.82|0.07|0.03|R|F|1995-05-28|1995-03-27|1995-06-03|DELIVER IN PERSON|TRUCK|y express pinto beans. braids sleep carefu +59047|1344|21|3|18|22416.12|0.09|0.01|R|F|1995-04-07|1995-04-01|1995-04-13|NONE|REG AIR|deas haggle blithely even pinto b +59047|1169|78|4|22|23543.52|0.08|0.03|R|F|1995-04-14|1995-04-09|1995-04-18|COLLECT COD|FOB|ronic instructions. even, final decoys mo +59047|1126|27|5|9|9244.08|0.04|0.07|R|F|1995-01-31|1995-03-21|1995-02-05|COLLECT COD|TRUCK|requests cajole slyly. special ac +59047|1374|89|6|24|30608.88|0.03|0.07|R|F|1995-04-20|1995-04-12|1995-05-18|NONE|FOB|s integrate furiousl +59072|814|15|1|15|25722.15|0.08|0.03|A|F|1994-06-18|1994-08-06|1994-07-10|COLLECT COD|FOB|al, pending packages cajole blithely dep +59072|1435|36|2|41|54793.63|0.01|0.01|R|F|1994-06-03|1994-08-03|1994-06-27|COLLECT COD|AIR|osits. even package +59072|1582|63|3|7|10385.06|0.05|0.02|R|F|1994-06-30|1994-07-01|1994-07-09|DELIVER IN PERSON|REG AIR| fluffily express deposits c +59072|1234|72|4|3|3405.69|0.05|0.00|R|F|1994-07-26|1994-08-01|1994-08-03|TAKE BACK RETURN|RAIL|y unusual accounts sleep blithely aga +59072|308|65|5|31|37457.30|0.10|0.01|R|F|1994-06-26|1994-08-02|1994-07-19|DELIVER IN PERSON|SHIP|always final requests bo +59072|150|77|6|9|9451.35|0.09|0.08|R|F|1994-08-11|1994-07-12|1994-08-15|NONE|TRUCK|es. daring, special requests wake flu +59072|620|83|7|35|53221.70|0.06|0.04|A|F|1994-06-06|1994-07-05|1994-06-26|TAKE BACK RETURN|AIR|he ideas. special packages boost +59073|460|61|1|16|21767.36|0.04|0.06|R|F|1993-06-15|1993-06-25|1993-07-02|DELIVER IN PERSON|FOB|ependencies. regular a +59074|118|45|1|21|21380.31|0.09|0.08|A|F|1993-11-29|1993-10-23|1993-11-30|DELIVER IN PERSON|SHIP| final packages; furiously specia +59074|1329|30|2|15|18454.80|0.04|0.01|A|F|1993-09-08|1993-11-09|1993-09-15|NONE|SHIP|s. pending foxes cajole furiously. +59074|1373|88|3|20|25487.40|0.06|0.03|A|F|1993-10-25|1993-10-30|1993-11-09|TAKE BACK RETURN|FOB|n packages. blithely unusual foxes +59074|1713|40|4|11|17761.81|0.05|0.07|A|F|1993-10-27|1993-10-28|1993-11-07|NONE|RAIL|ly regular packages detect blithel +59074|431|32|5|43|57251.49|0.04|0.05|A|F|1993-10-25|1993-10-04|1993-11-12|COLLECT COD|FOB|uffily ironic accounts-- furiousl +59075|793|58|1|41|69445.39|0.10|0.04|A|F|1992-05-30|1992-05-11|1992-06-18|COLLECT COD|REG AIR|deposits grow carefully ironic packages? fu +59075|706|71|2|31|49807.70|0.02|0.06|R|F|1992-03-03|1992-05-24|1992-03-18|TAKE BACK RETURN|SHIP|ording to the express packages. q +59075|1445|85|3|36|48471.84|0.06|0.08|R|F|1992-04-02|1992-03-31|1992-05-02|TAKE BACK RETURN|MAIL|ithely final pinto beans cajole always: +59076|1588|9|1|12|17874.96|0.04|0.07|N|O|1997-01-10|1997-02-28|1997-02-05|COLLECT COD|AIR|ly. slyly enticing dep +59076|56|7|2|20|19121.00|0.03|0.01|N|O|1997-04-03|1997-03-01|1997-04-24|TAKE BACK RETURN|REG AIR|xes. regular, final theodo +59077|1726|69|1|25|40693.00|0.07|0.05|N|O|1997-01-23|1997-01-27|1997-01-25|TAKE BACK RETURN|FOB|t deposits. slyly +59077|434|22|2|12|16013.16|0.03|0.00|N|O|1997-03-30|1997-01-23|1997-04-06|NONE|MAIL|deas cajole sly +59078|1289|90|1|17|20234.76|0.07|0.05|N|O|1996-12-01|1997-01-09|1996-12-14|TAKE BACK RETURN|FOB|slyly. blithely regular pin +59078|119|72|2|48|48917.28|0.00|0.01|N|O|1997-01-01|1997-01-07|1997-01-28|NONE|REG AIR|gainst the packages impress regular, fi +59078|1492|10|3|11|15328.39|0.05|0.07|N|O|1997-03-12|1997-01-03|1997-04-08|NONE|SHIP|ns. furiously pending accou +59078|737|70|4|32|52407.36|0.07|0.08|N|O|1997-03-29|1997-01-08|1997-04-24|COLLECT COD|TRUCK|s. slyly regular dinos haggle +59079|1391|30|1|2|2584.78|0.00|0.01|N|O|1995-11-12|1995-11-17|1995-11-16|NONE|MAIL|ns. pending foxes detect. +59079|1310|25|2|8|9690.48|0.02|0.02|N|O|1995-11-01|1995-12-15|1995-11-02|TAKE BACK RETURN|MAIL|thely regular foxes. b +59079|632|33|3|11|16858.93|0.03|0.03|N|O|1995-10-16|1995-11-23|1995-10-17|DELIVER IN PERSON|SHIP| ironic requests alongside of th +59104|1251|26|1|34|39176.50|0.09|0.01|R|F|1994-04-01|1994-04-20|1994-04-19|TAKE BACK RETURN|SHIP|ntiments. express, bold instructions use +59104|1363|2|2|11|13907.96|0.10|0.04|A|F|1994-02-22|1994-04-20|1994-03-08|DELIVER IN PERSON|RAIL|haggle slyly. caref +59104|1271|46|3|38|44546.26|0.10|0.01|A|F|1994-03-16|1994-03-29|1994-04-11|COLLECT COD|MAIL|asymptotes. slyly silent warhorses acro +59104|199|100|4|1|1099.19|0.08|0.05|R|F|1994-05-30|1994-03-23|1994-06-04|TAKE BACK RETURN|SHIP|s integrate according to +59104|74|75|5|26|25325.82|0.07|0.04|A|F|1994-06-14|1994-04-03|1994-06-20|COLLECT COD|MAIL| ironic dugouts are fluffily above th +59104|599|60|6|13|19494.67|0.03|0.06|R|F|1994-05-04|1994-05-11|1994-05-28|COLLECT COD|REG AIR|cross the slyly pending pinto beans +59104|1518|99|7|19|26970.69|0.01|0.04|R|F|1994-05-18|1994-05-05|1994-05-23|COLLECT COD|FOB|ounts. accounts slee +59105|620|14|1|38|57783.56|0.07|0.04|N|O|1997-01-16|1997-01-24|1997-02-03|DELIVER IN PERSON|REG AIR|inal packages. even deposits +59105|1295|96|2|18|21533.22|0.08|0.04|N|O|1997-02-22|1997-02-28|1997-03-16|NONE|TRUCK|y regular ideas. never even accou +59105|284|12|3|42|49739.76|0.01|0.08|N|O|1997-03-15|1997-01-20|1997-04-12|DELIVER IN PERSON|FOB|ven dependencies integrate s +59106|935|36|1|40|73437.20|0.02|0.02|N|O|1997-01-06|1997-01-03|1997-02-02|DELIVER IN PERSON|TRUCK|ross the ironic courts. bravel +59106|194|47|2|48|52521.12|0.00|0.06|N|O|1996-11-13|1996-12-29|1996-12-05|DELIVER IN PERSON|SHIP|ar instructio +59106|1462|63|3|38|51811.48|0.03|0.06|N|O|1996-10-28|1996-11-26|1996-11-04|TAKE BACK RETURN|SHIP|thely even ideas wake carefu +59106|1758|43|4|20|33195.00|0.08|0.00|N|O|1997-01-12|1996-12-05|1997-01-21|DELIVER IN PERSON|REG AIR|t the final, i +59106|1550|91|5|39|56610.45|0.02|0.03|N|O|1997-01-19|1996-12-28|1997-02-07|DELIVER IN PERSON|FOB|al theodolites affix doggedly. b +59106|964|65|6|43|80193.28|0.06|0.02|N|O|1997-01-10|1996-12-30|1997-01-11|NONE|FOB|ress instructions. furiously +59106|893|94|7|48|86106.72|0.10|0.08|N|O|1996-11-16|1996-11-27|1996-12-09|DELIVER IN PERSON|TRUCK|he permanently ironic +59107|182|35|1|7|7575.26|0.10|0.04|N|O|1998-03-14|1998-02-28|1998-03-24|DELIVER IN PERSON|SHIP| the slyly special grouches. blithe +59107|615|16|2|12|18187.32|0.02|0.08|N|O|1998-04-13|1998-02-02|1998-04-14|TAKE BACK RETURN|MAIL|equests. depths against the furi +59107|420|79|3|14|18485.88|0.02|0.00|N|O|1998-04-11|1998-02-12|1998-05-10|TAKE BACK RETURN|FOB|y. furiously even foxes sleep a +59107|373|30|4|36|45841.32|0.06|0.05|N|O|1998-02-18|1998-02-03|1998-03-20|NONE|FOB|usual requests cajole quickly. final accou +59107|1618|19|5|47|71421.67|0.08|0.07|N|O|1998-03-27|1998-02-04|1998-04-02|TAKE BACK RETURN|FOB|y regular requests sleep quickly above +59107|1356|33|6|9|11316.15|0.06|0.00|N|O|1998-04-09|1998-02-04|1998-04-27|DELIVER IN PERSON|FOB|quickly silent accou +59108|296|24|1|20|23925.80|0.02|0.02|N|O|1996-01-13|1995-11-14|1996-01-28|COLLECT COD|AIR|eep furiously furiously even gifts. +59108|1369|70|2|43|54625.48|0.09|0.02|N|O|1995-12-18|1995-12-30|1995-12-20|COLLECT COD|AIR|ackages across the final ac +59108|1975|20|3|39|73201.83|0.01|0.05|N|O|1995-11-20|1995-11-19|1995-11-22|COLLECT COD|AIR|ts. ironic, thin +59108|1382|59|4|38|48768.44|0.05|0.05|N|O|1995-12-26|1996-01-03|1995-12-29|COLLECT COD|MAIL| cajole blithely. slyly pending th +59108|1723|24|5|13|21121.36|0.07|0.07|N|O|1995-11-07|1995-12-13|1995-11-28|DELIVER IN PERSON|REG AIR|uickly fin +59108|12|88|6|21|19152.21|0.00|0.06|N|O|1995-11-16|1995-12-13|1995-11-27|DELIVER IN PERSON|SHIP| slyly. stealthily slow requests solve +59109|1838|25|1|41|71333.03|0.09|0.05|A|F|1994-05-21|1994-06-27|1994-06-15|NONE|SHIP|quests integrate fluffily un +59110|1756|41|1|19|31497.25|0.03|0.02|N|O|1998-03-24|1998-02-23|1998-04-23|COLLECT COD|MAIL|gular packages affix s +59110|598|99|2|31|46456.29|0.03|0.01|N|O|1998-02-13|1998-03-02|1998-02-27|COLLECT COD|RAIL|ke carefully around +59110|327|12|3|21|25773.72|0.03|0.07|N|O|1998-04-04|1998-02-05|1998-04-08|DELIVER IN PERSON|FOB|bout the blithe +59110|927|62|4|12|21935.04|0.06|0.03|N|O|1998-04-10|1998-03-18|1998-05-07|COLLECT COD|MAIL|refully abov +59111|765|98|1|33|54970.08|0.04|0.08|A|F|1994-06-16|1994-06-21|1994-06-26|TAKE BACK RETURN|FOB|ar, final platelets ar +59111|30|31|2|25|23250.75|0.08|0.07|R|F|1994-04-13|1994-06-04|1994-04-15|COLLECT COD|RAIL|lyly. fina +59136|640|3|1|22|33894.08|0.03|0.08|N|O|1997-06-29|1997-08-16|1997-07-03|NONE|SHIP|uickly pending foxes. theodolites ca +59136|1984|17|2|42|79211.16|0.03|0.02|N|O|1997-07-23|1997-07-28|1997-08-20|COLLECT COD|SHIP|n instructions detect slyly after the per +59136|691|54|3|15|23875.35|0.04|0.01|N|O|1997-06-30|1997-08-16|1997-07-04|TAKE BACK RETURN|TRUCK| final requests poach +59136|473|3|4|39|53565.33|0.00|0.03|N|O|1997-06-10|1997-06-27|1997-06-11|DELIVER IN PERSON|FOB|dolites haggle. f +59136|353|38|5|44|55147.40|0.06|0.00|N|O|1997-09-07|1997-06-28|1997-10-03|TAKE BACK RETURN|FOB|lthy dependencies sleep above the furiou +59136|1885|15|6|16|28590.08|0.04|0.07|N|O|1997-08-11|1997-08-25|1997-09-10|DELIVER IN PERSON|REG AIR|arefully regular platelets thras +59137|171|24|1|47|50344.99|0.06|0.03|A|F|1992-10-21|1992-09-18|1992-11-20|COLLECT COD|REG AIR|hely silent instructions. blithely +59137|1160|97|2|10|10611.60|0.10|0.02|A|F|1992-09-18|1992-08-12|1992-10-11|NONE|RAIL|s. blithely even foxes nag car +59137|244|26|3|41|46913.84|0.10|0.00|A|F|1992-07-10|1992-08-10|1992-07-27|DELIVER IN PERSON|RAIL|ironic platel +59138|1821|22|1|31|53407.42|0.02|0.01|N|O|1996-06-26|1996-09-09|1996-07-06|COLLECT COD|TRUCK|e slyly ruthless accounts. ca +59139|1181|54|1|27|29218.86|0.08|0.02|A|F|1995-04-16|1995-03-24|1995-04-17|TAKE BACK RETURN|REG AIR| blithely unusual notornis. ironic packag +59139|622|16|2|24|36542.88|0.02|0.01|A|F|1995-02-28|1995-03-06|1995-03-29|NONE|MAIL|e to wake. fluffily sp +59139|741|74|3|26|42685.24|0.06|0.04|A|F|1995-04-04|1995-03-03|1995-04-07|DELIVER IN PERSON|TRUCK|ts boost blithely above the quick +59140|1257|58|1|4|4633.00|0.01|0.04|N|O|1997-11-15|1997-11-20|1997-11-20|TAKE BACK RETURN|RAIL|e pending +59140|1756|83|2|25|41443.75|0.10|0.06|N|O|1997-11-06|1997-11-19|1997-12-06|TAKE BACK RETURN|RAIL|arefully fin +59140|1326|65|3|27|33137.64|0.08|0.07|N|O|1997-10-02|1997-10-01|1997-10-11|COLLECT COD|RAIL|instructions slee +59140|1098|34|4|38|37965.42|0.00|0.00|N|O|1997-10-18|1997-11-05|1997-11-12|TAKE BACK RETURN|TRUCK|t carefully carefully unu +59140|1210|11|5|41|45559.61|0.05|0.02|N|O|1997-10-04|1997-11-28|1997-10-25|NONE|REG AIR|haggle quickly among the ironic, special ac +59140|955|58|6|30|55678.50|0.03|0.05|N|O|1997-12-15|1997-10-18|1998-01-02|COLLECT COD|AIR|s cajole fluff +59141|443|73|1|14|18808.16|0.01|0.06|N|O|1996-04-02|1996-05-22|1996-04-25|DELIVER IN PERSON|RAIL|y slowly unusual deposits. final theodoli +59142|740|73|1|43|70551.82|0.02|0.05|R|F|1993-07-13|1993-07-18|1993-07-15|NONE|TRUCK| slyly instructions. express packag +59142|1232|70|2|37|41929.51|0.01|0.07|R|F|1993-05-15|1993-07-04|1993-06-01|DELIVER IN PERSON|SHIP|ins. slyly +59142|415|74|3|20|26308.20|0.06|0.06|A|F|1993-05-26|1993-06-30|1993-06-10|TAKE BACK RETURN|SHIP|ndencies are furiously e +59142|1499|100|4|20|28009.80|0.08|0.02|A|F|1993-07-30|1993-07-06|1993-08-01|COLLECT COD|SHIP|en ideas use. carefully unusual de +59143|1296|97|1|24|28734.96|0.02|0.04|N|O|1998-09-28|1998-09-01|1998-10-20|COLLECT COD|FOB|. ironic pinto beans wak +59143|225|7|2|21|23629.62|0.09|0.06|N|O|1998-08-11|1998-09-29|1998-09-06|TAKE BACK RETURN|RAIL|y express asymptotes. regular idea +59143|481|69|3|33|45588.84|0.08|0.01|N|O|1998-09-15|1998-10-12|1998-10-03|COLLECT COD|AIR|realms boost. +59143|1806|36|4|16|27324.80|0.09|0.07|N|O|1998-11-11|1998-09-18|1998-12-04|DELIVER IN PERSON|RAIL|luffily ironic requests affix. furiously +59168|1126|27|1|21|21569.52|0.00|0.05|A|F|1993-06-20|1993-08-11|1993-07-02|TAKE BACK RETURN|FOB|oss the slyly silent instructions. perma +59168|492|80|2|42|58484.58|0.05|0.04|A|F|1993-09-26|1993-07-28|1993-10-09|COLLECT COD|SHIP|lets use fluffily according to th +59168|651|45|3|13|20171.45|0.00|0.00|R|F|1993-07-08|1993-08-05|1993-07-09|DELIVER IN PERSON|REG AIR|bove the even +59168|1196|97|4|45|49373.55|0.08|0.08|A|F|1993-07-22|1993-09-03|1993-08-07|NONE|MAIL|he slyly regular deposits cajole f +59169|1922|11|1|4|7295.68|0.08|0.07|N|O|1997-07-10|1997-06-18|1997-07-26|DELIVER IN PERSON|FOB|regular ideas wake slyly final foxes. f +59169|722|55|2|4|6490.88|0.09|0.08|N|O|1997-07-19|1997-06-04|1997-07-25|DELIVER IN PERSON|RAIL|s the pending accounts. slyly regular pa +59169|1942|87|3|10|18439.40|0.04|0.05|N|O|1997-04-29|1997-07-03|1997-05-17|NONE|REG AIR|ts above the +59169|1415|94|4|17|22378.97|0.08|0.04|N|O|1997-04-08|1997-05-31|1997-04-09|COLLECT COD|REG AIR|inal excuses lose fluffily. slyly bold +59169|903|38|5|29|52313.10|0.03|0.01|N|O|1997-05-26|1997-05-29|1997-06-17|COLLECT COD|REG AIR|blithely unusual instructions +59169|1868|69|6|29|51325.94|0.01|0.02|N|O|1997-06-20|1997-06-16|1997-07-04|COLLECT COD|FOB| haggle quickly. regular requests wake brav +59170|1980|69|1|36|67751.28|0.04|0.04|A|F|1994-04-02|1994-04-30|1994-04-26|COLLECT COD|FOB|pending instructions sleep. finally re +59170|1106|7|2|26|26184.60|0.07|0.08|A|F|1994-05-15|1994-04-28|1994-06-09|NONE|TRUCK|sheaves above the furious +59170|318|3|3|44|53605.64|0.04|0.05|A|F|1994-04-03|1994-03-25|1994-05-01|NONE|TRUCK| packages are furiously among the +59170|851|51|4|37|64818.45|0.10|0.01|A|F|1994-03-24|1994-05-11|1994-04-20|NONE|TRUCK|onic deposit +59170|1862|92|5|18|31749.48|0.00|0.00|A|F|1994-05-05|1994-03-25|1994-06-03|DELIVER IN PERSON|SHIP|sts. busy pinto beans abo +59170|1664|88|6|39|61060.74|0.05|0.07|A|F|1994-05-22|1994-03-24|1994-06-10|TAKE BACK RETURN|TRUCK|ithely expre +59171|584|75|1|41|60867.78|0.04|0.06|N|O|1995-11-03|1995-10-15|1995-11-15|NONE|REG AIR| blithely pending deposits s +59171|1444|62|2|4|5381.76|0.01|0.01|N|O|1995-11-22|1995-11-19|1995-11-26|TAKE BACK RETURN|FOB| to the ironic platelets. daringly fin +59172|329|86|1|46|56548.72|0.02|0.01|N|O|1997-09-30|1997-09-11|1997-10-16|NONE|RAIL|ross the accounts inte +59172|84|60|2|25|24602.00|0.03|0.07|N|O|1997-09-05|1997-08-15|1997-09-06|COLLECT COD|AIR|structions across +59172|327|28|3|24|29455.68|0.03|0.08|N|O|1997-08-05|1997-08-28|1997-08-08|TAKE BACK RETURN|SHIP|the slyly final sentime +59172|1742|43|4|40|65749.60|0.10|0.08|N|O|1997-06-27|1997-07-22|1997-07-16|NONE|AIR|ic ideas nag blithely silent requests. +59173|1405|84|1|48|62707.20|0.04|0.08|R|F|1994-02-24|1994-03-13|1994-03-22|DELIVER IN PERSON|RAIL|upon the even dinos. unusual, regular inst +59173|1131|4|2|14|14449.82|0.00|0.05|A|F|1994-02-18|1994-03-16|1994-03-10|DELIVER IN PERSON|AIR|er the blithely final courts. s +59173|1692|34|3|21|33467.49|0.08|0.06|A|F|1994-03-09|1994-01-31|1994-04-06|NONE|AIR|uriously reg +59173|1916|49|4|13|23632.83|0.08|0.03|R|F|1994-04-07|1994-02-28|1994-04-25|COLLECT COD|RAIL|furiously regular accounts sleep. unusual +59173|543|74|5|5|7217.70|0.04|0.02|R|F|1994-02-18|1994-01-24|1994-03-05|NONE|REG AIR|lar, final instructions. carefully pen +59174|255|10|1|6|6931.50|0.06|0.08|A|F|1993-03-14|1993-02-22|1993-03-20|DELIVER IN PERSON|AIR| blithely across the slyly +59174|1780|23|2|47|79043.66|0.04|0.05|R|F|1993-03-14|1993-03-03|1993-03-26|TAKE BACK RETURN|FOB|ggle. quickly unusual pinto beans sl +59174|599|100|3|38|56984.42|0.08|0.03|A|F|1993-01-19|1993-02-18|1993-02-10|COLLECT COD|TRUCK|ut the final +59174|32|33|4|33|30756.99|0.07|0.01|A|F|1993-03-19|1993-04-02|1993-04-06|COLLECT COD|AIR|h carefully! furiously special accounts u +59175|536|67|1|27|38786.31|0.06|0.06|R|F|1994-05-13|1994-06-09|1994-06-07|DELIVER IN PERSON|TRUCK|accounts. quiet excuses arou +59200|452|53|1|47|63565.15|0.05|0.07|N|O|1996-03-31|1996-02-07|1996-04-19|DELIVER IN PERSON|MAIL|y about the furio +59200|1635|77|2|12|18439.56|0.01|0.01|N|O|1996-03-13|1996-01-19|1996-03-31|DELIVER IN PERSON|RAIL|usual theodolit +59200|421|80|3|37|48892.54|0.02|0.00|N|O|1996-02-01|1996-02-16|1996-02-06|DELIVER IN PERSON|REG AIR|quests. ideas haggle re +59201|1548|49|1|16|23192.64|0.04|0.08|N|O|1997-05-30|1997-07-09|1997-06-22|NONE|REG AIR|dependencies sleep around the furiously +59201|1287|99|2|48|57037.44|0.05|0.06|N|O|1997-06-24|1997-07-31|1997-07-20|NONE|SHIP|ies wake furiously regular +59201|1020|91|3|36|33156.72|0.05|0.03|N|O|1997-05-27|1997-07-29|1997-06-26|DELIVER IN PERSON|AIR|ding to the pending accounts. furio +59201|446|5|4|35|47125.40|0.02|0.06|N|O|1997-07-01|1997-07-26|1997-07-10|COLLECT COD|MAIL|ctions wake blithely above t +59201|1240|78|5|43|49073.32|0.03|0.05|N|O|1997-06-08|1997-07-25|1997-06-19|DELIVER IN PERSON|MAIL|special excuses alongsi +59201|908|77|6|44|79591.60|0.10|0.00|N|O|1997-06-30|1997-08-09|1997-07-10|DELIVER IN PERSON|RAIL|s above the carefully even deposits sl +59202|1656|39|1|6|9345.90|0.10|0.07|R|F|1993-01-01|1992-11-01|1993-01-23|NONE|RAIL|al accounts. requests nag blithely. careful +59202|1|52|2|41|36941.00|0.02|0.05|R|F|1992-09-17|1992-11-06|1992-10-16|DELIVER IN PERSON|SHIP|sts? slyly ironic acco +59202|1796|97|3|6|10186.74|0.01|0.08|A|F|1992-09-18|1992-11-28|1992-09-27|NONE|AIR| asymptotes. careful +59202|1137|46|4|9|9343.17|0.04|0.04|R|F|1992-09-20|1992-10-09|1992-10-04|TAKE BACK RETURN|REG AIR|rate carefully express accounts. carefu +59202|1462|63|5|34|46357.64|0.02|0.03|A|F|1992-09-12|1992-10-10|1992-09-22|COLLECT COD|REG AIR|hely regular sentiments. express +59202|596|57|6|45|67346.55|0.01|0.07|A|F|1992-11-18|1992-11-13|1992-12-11|TAKE BACK RETURN|RAIL| the special, ironic pinto beans. +59203|1179|16|1|9|9721.53|0.04|0.07|N|O|1995-08-18|1995-09-03|1995-08-21|COLLECT COD|RAIL|al pinto beans wake slyly +59203|882|16|2|30|53486.40|0.10|0.00|N|O|1995-07-10|1995-09-17|1995-07-18|NONE|AIR| regular accounts. unusual requests doze +59204|408|9|1|30|39252.00|0.00|0.08|A|F|1992-03-02|1992-05-27|1992-03-25|TAKE BACK RETURN|RAIL|d, regular accounts. furiou +59204|1465|66|2|46|62857.16|0.06|0.00|A|F|1992-06-28|1992-05-07|1992-06-29|NONE|FOB|players. fluffily special +59204|1062|63|3|37|35633.22|0.08|0.05|A|F|1992-05-05|1992-04-20|1992-05-16|COLLECT COD|SHIP|ly ironic sentiments impress c +59204|759|60|4|41|68049.75|0.01|0.08|R|F|1992-06-11|1992-04-12|1992-07-07|DELIVER IN PERSON|RAIL|gged packages haggle boldly according t +59204|1750|35|5|4|6607.00|0.10|0.01|A|F|1992-06-17|1992-04-04|1992-06-19|DELIVER IN PERSON|RAIL|le final packages. fluff +59205|813|47|1|1|1713.81|0.03|0.02|N|O|1996-02-09|1996-01-24|1996-02-28|TAKE BACK RETURN|AIR|dolites. ironically pending accounts +59205|798|63|2|13|22084.27|0.02|0.07|N|O|1996-01-20|1995-12-23|1996-02-05|TAKE BACK RETURN|TRUCK|d, regular packages haggle alongside +59205|23|74|3|41|37843.82|0.02|0.06|N|O|1996-02-19|1996-01-23|1996-03-05|NONE|MAIL| final packages. blithely unusual d +59206|402|32|1|17|22140.80|0.06|0.03|N|O|1995-11-12|1996-01-09|1995-12-04|DELIVER IN PERSON|RAIL|ent requests +59206|781|82|2|3|5045.34|0.08|0.08|N|O|1996-02-09|1995-12-01|1996-02-10|TAKE BACK RETURN|TRUCK|nstructions play blithely agai +59206|1741|68|3|9|14784.66|0.01|0.01|N|O|1995-12-26|1996-01-16|1996-01-20|DELIVER IN PERSON|REG AIR| quickly unu +59206|1744|45|4|19|31269.06|0.07|0.00|N|O|1995-11-08|1995-12-30|1995-11-22|DELIVER IN PERSON|SHIP|uickly ironic packages. +59206|1985|86|5|38|71705.24|0.10|0.06|N|O|1995-11-08|1995-11-22|1995-11-10|TAKE BACK RETURN|SHIP|jole. blithely final +59206|1950|83|6|18|33335.10|0.09|0.08|N|O|1996-02-18|1995-12-30|1996-03-12|NONE|REG AIR|lyly against the foxes. s +59207|1214|89|1|44|49069.24|0.09|0.04|A|F|1994-09-02|1994-08-13|1994-09-12|NONE|TRUCK|ironic ideas hag +59207|434|35|2|15|20016.45|0.10|0.06|A|F|1994-08-03|1994-07-17|1994-08-07|TAKE BACK RETURN|MAIL|eposits across the never final +59207|840|7|3|14|24371.76|0.07|0.02|R|F|1994-06-05|1994-07-21|1994-06-10|NONE|REG AIR|e regularly against the +59207|675|38|4|14|22059.38|0.08|0.07|R|F|1994-08-07|1994-07-03|1994-08-18|DELIVER IN PERSON|MAIL|ages sleep carefully silent +59207|181|34|5|5|5405.90|0.03|0.06|R|F|1994-09-07|1994-07-18|1994-09-18|TAKE BACK RETURN|MAIL| accounts across the quic +59232|1168|41|1|24|25659.84|0.01|0.05|R|F|1994-01-27|1994-02-03|1994-02-16|COLLECT COD|TRUCK|ole carefully final, +59232|722|23|2|32|51927.04|0.09|0.02|R|F|1994-04-18|1994-02-07|1994-05-07|TAKE BACK RETURN|TRUCK|xpress packages are blithely. quick +59232|1304|81|3|50|60265.00|0.08|0.07|A|F|1994-04-18|1994-03-03|1994-04-26|DELIVER IN PERSON|REG AIR|, special deposits cajole slyly +59232|1389|66|4|10|12903.80|0.02|0.07|R|F|1994-02-15|1994-02-22|1994-03-03|NONE|SHIP|counts integr +59232|89|15|5|5|4945.40|0.03|0.00|R|F|1994-01-06|1994-02-23|1994-01-24|TAKE BACK RETURN|MAIL|according to the slyly expre +59232|1450|90|6|33|44597.85|0.01|0.06|R|F|1994-04-08|1994-02-21|1994-04-14|TAKE BACK RETURN|SHIP|l packages cajole carefully about th +59233|1741|84|1|31|50924.94|0.07|0.00|A|F|1993-10-03|1993-11-02|1993-10-06|TAKE BACK RETURN|AIR|mes. ironic theodolites along +59233|576|67|2|24|35437.68|0.09|0.08|A|F|1993-11-03|1993-11-11|1993-11-11|TAKE BACK RETURN|TRUCK| patterns use slyly. slyly final courts +59233|632|26|3|26|39848.38|0.05|0.01|A|F|1993-12-17|1993-09-26|1994-01-11|NONE|RAIL|yly. pending deposits slee +59233|1699|23|4|7|11204.83|0.09|0.06|R|F|1993-11-30|1993-11-09|1993-12-30|DELIVER IN PERSON|RAIL| ironic foxes cajole quickly a +59233|267|95|5|28|32683.28|0.07|0.08|A|F|1993-11-13|1993-10-26|1993-11-24|TAKE BACK RETURN|REG AIR| even water +59233|1736|37|6|18|29479.14|0.06|0.02|R|F|1993-09-29|1993-11-07|1993-10-29|DELIVER IN PERSON|MAIL|alongside of th +59234|1854|84|1|37|64966.45|0.06|0.07|A|F|1992-08-07|1992-10-09|1992-08-26|COLLECT COD|SHIP|iously blithely final attainments. +59234|1749|50|2|13|21459.62|0.03|0.08|R|F|1992-11-13|1992-09-21|1992-12-10|COLLECT COD|TRUCK|s are furiously. even deposits are c +59234|1845|89|3|33|57645.72|0.03|0.03|R|F|1992-09-25|1992-10-21|1992-10-06|TAKE BACK RETURN|FOB|refully final requests. package +59235|634|35|1|31|47573.53|0.08|0.07|N|O|1998-03-02|1998-05-17|1998-03-05|DELIVER IN PERSON|FOB|gular theodolites. slyly ironic reque +59235|670|64|2|37|58114.79|0.07|0.05|N|O|1998-02-28|1998-05-10|1998-03-21|COLLECT COD|MAIL|equests. slyly express instructions sl +59236|179|6|1|11|11870.87|0.01|0.00|R|F|1992-03-16|1992-04-22|1992-04-04|NONE|TRUCK|n instructions. +59236|1366|67|2|12|15208.32|0.00|0.03|A|F|1992-06-13|1992-04-29|1992-07-02|DELIVER IN PERSON|TRUCK|nts serve carefully abo +59237|233|15|1|12|13598.76|0.06|0.02|A|F|1993-10-07|1993-09-17|1993-10-09|DELIVER IN PERSON|TRUCK|ly pending packages. packa +59237|1740|25|2|14|22984.36|0.10|0.01|A|F|1993-09-07|1993-10-06|1993-09-09|DELIVER IN PERSON|AIR|ourts. deposits upon the requests +59238|337|66|1|17|21034.61|0.02|0.03|A|F|1994-10-18|1994-12-07|1994-11-03|DELIVER IN PERSON|REG AIR|oxes alongside of the silent excuses +59238|39|90|2|8|7512.24|0.05|0.01|R|F|1994-12-11|1994-10-27|1995-01-05|TAKE BACK RETURN|FOB|nusual packag +59238|1521|22|3|12|17070.24|0.07|0.03|R|F|1994-12-26|1994-11-09|1994-12-28|DELIVER IN PERSON|SHIP|al requests sleep carefully ironic theo +59238|592|93|4|20|29851.80|0.07|0.00|A|F|1994-10-05|1994-10-30|1994-10-26|TAKE BACK RETURN|TRUCK| wake permanently. bli +59238|1156|65|5|28|29600.20|0.08|0.06|R|F|1994-12-28|1994-11-01|1995-01-18|DELIVER IN PERSON|SHIP|final, express theodolite +59239|461|20|1|22|29952.12|0.01|0.00|R|F|1993-02-26|1993-04-26|1993-03-03|DELIVER IN PERSON|REG AIR|fter the theodoli +59239|1103|76|2|22|22090.20|0.01|0.04|A|F|1993-03-23|1993-04-17|1993-04-09|COLLECT COD|TRUCK|ironic requests boost +59239|1742|69|3|37|60818.38|0.09|0.00|R|F|1993-04-20|1993-05-14|1993-05-03|COLLECT COD|AIR|rts nag slyly deposits. special deposits sl +59239|1217|18|4|49|54792.29|0.01|0.03|R|F|1993-03-12|1993-04-23|1993-04-05|COLLECT COD|AIR| nag! slyly final +59264|747|48|1|35|57670.90|0.02|0.03|A|F|1992-11-04|1992-10-27|1992-11-27|COLLECT COD|FOB|e. even pinto beans wake care +59264|1688|12|2|13|20665.84|0.05|0.07|R|F|1992-12-12|1992-11-15|1993-01-08|NONE|MAIL|e. quickly regular deposits between the fin +59265|1586|67|1|16|23801.28|0.05|0.01|N|O|1998-01-06|1998-01-03|1998-01-09|NONE|FOB|ans haggle accordin +59265|130|9|2|31|31934.03|0.08|0.05|N|O|1998-01-06|1997-12-04|1998-01-25|DELIVER IN PERSON|MAIL|. deposits integrate slowly above the q +59266|955|56|1|15|27839.25|0.06|0.08|N|O|1998-08-08|1998-07-27|1998-08-16|NONE|RAIL|deposits af +59266|1804|34|2|14|23881.20|0.06|0.05|N|O|1998-07-08|1998-07-24|1998-07-22|DELIVER IN PERSON|SHIP|refully final packages. +59266|1518|99|3|2|2839.02|0.07|0.04|N|O|1998-08-26|1998-08-11|1998-09-05|TAKE BACK RETURN|MAIL| regularly even instru +59266|1212|87|4|16|17811.36|0.10|0.08|N|O|1998-08-31|1998-09-10|1998-09-15|NONE|REG AIR|inal platelets. pending ideas boost quick +59266|1675|99|5|17|26803.39|0.06|0.06|N|O|1998-08-24|1998-08-27|1998-09-19|DELIVER IN PERSON|MAIL|e furiously above +59267|1028|99|1|19|17651.38|0.04|0.00|R|F|1995-05-25|1995-07-08|1995-06-10|NONE|RAIL|riously slyly +59267|1332|71|2|1|1233.33|0.09|0.03|A|F|1995-04-23|1995-05-24|1995-05-09|NONE|FOB|ly. ironic ideas +59267|362|63|3|12|15148.32|0.06|0.04|N|O|1995-08-08|1995-06-30|1995-09-04|TAKE BACK RETURN|REG AIR|final ideas haggle slyly across the even r +59267|822|89|4|43|74081.26|0.10|0.06|N|O|1995-06-23|1995-06-09|1995-07-02|DELIVER IN PERSON|FOB|kages boost carefully. slyly +59267|1464|65|5|35|47791.10|0.00|0.01|R|F|1995-04-21|1995-06-29|1995-04-22|TAKE BACK RETURN|AIR| beans. unusua +59268|1905|94|1|23|41558.70|0.06|0.03|N|F|1995-06-12|1995-05-05|1995-07-06|COLLECT COD|SHIP|thely fina +59269|2000|33|1|8|7216.00|0.07|0.02|N|O|1996-07-28|1996-06-21|1996-08-04|TAKE BACK RETURN|TRUCK| slyly regular courts. furiously +59269|1569|70|2|36|52940.16|0.00|0.06|N|O|1996-05-08|1996-07-29|1996-05-22|TAKE BACK RETURN|MAIL|accounts. enticin +59269|1086|57|3|10|9870.80|0.03|0.05|N|O|1996-06-01|1996-07-25|1996-06-30|TAKE BACK RETURN|TRUCK|xpress packages wak +59269|838|38|4|2|3477.66|0.10|0.06|N|O|1996-07-05|1996-07-28|1996-07-29|COLLECT COD|RAIL|dle about the slyly express +59269|1172|81|5|42|45073.14|0.04|0.07|N|O|1996-07-17|1996-06-27|1996-07-18|DELIVER IN PERSON|FOB|yly express deposits wake. fluffily +59269|1589|90|6|1|1490.58|0.09|0.07|N|O|1996-08-17|1996-07-08|1996-08-25|DELIVER IN PERSON|TRUCK|. blithely unusual sauternes are furiou +59269|727|28|7|16|26043.52|0.10|0.04|N|O|1996-05-07|1996-07-30|1996-05-16|NONE|REG AIR|posits wake blithely abou +59270|1181|18|1|4|4328.72|0.09|0.00|A|F|1993-02-19|1993-04-10|1993-02-20|TAKE BACK RETURN|TRUCK|losely quickly silent accounts: s +59270|277|32|2|2|2354.54|0.05|0.02|R|F|1993-01-24|1993-03-19|1993-02-08|DELIVER IN PERSON|RAIL|ly furiously even +59270|1538|39|3|15|21592.95|0.07|0.06|A|F|1993-02-20|1993-02-26|1993-03-15|DELIVER IN PERSON|REG AIR| requests throughout the slyly unusual +59270|1983|84|4|34|64089.32|0.08|0.06|A|F|1993-05-11|1993-03-05|1993-05-30|NONE|REG AIR|thlessly careful accounts. furio +59270|1935|68|5|36|66129.48|0.05|0.05|A|F|1993-04-27|1993-02-23|1993-05-17|COLLECT COD|REG AIR|pending dolphins. silent accounts kind +59270|636|68|6|22|33805.86|0.07|0.05|R|F|1993-04-05|1993-04-01|1993-05-02|TAKE BACK RETURN|AIR|ng the final, unus +59270|1889|90|7|24|42981.12|0.02|0.07|A|F|1993-03-08|1993-02-18|1993-03-30|COLLECT COD|AIR|usual accounts detect about t +59271|438|26|1|22|29445.46|0.08|0.03|N|O|1995-08-06|1995-06-30|1995-08-21|NONE|RAIL|packages snooze furiously. final foxes alo +59271|9|10|2|35|31815.00|0.02|0.03|N|O|1995-07-24|1995-06-21|1995-08-01|DELIVER IN PERSON|RAIL|instructions sleep a +59271|1926|15|3|18|32902.56|0.02|0.07|N|F|1995-06-12|1995-06-08|1995-07-03|TAKE BACK RETURN|MAIL|e slyly about the regular instr +59271|336|93|4|15|18544.95|0.08|0.01|N|F|1995-06-05|1995-07-01|1995-06-24|DELIVER IN PERSON|REG AIR|unts; furiously bold instructions wake +59271|31|82|5|19|17689.57|0.03|0.02|A|F|1995-05-15|1995-07-08|1995-06-01|TAKE BACK RETURN|MAIL|ular, unusual instructions boost according +59271|956|57|6|48|89133.60|0.01|0.07|N|F|1995-06-04|1995-05-30|1995-06-29|DELIVER IN PERSON|FOB|furiously ironic deposits boost carefully a +59271|526|17|7|34|48501.68|0.06|0.01|R|F|1995-05-18|1995-07-06|1995-06-03|COLLECT COD|FOB| nag quickly above the carefully special +59296|1736|37|1|18|29479.14|0.02|0.02|N|O|1997-11-11|1997-12-12|1997-11-15|NONE|MAIL|riously ruthless package +59296|1898|28|2|10|17998.90|0.01|0.01|N|O|1997-11-27|1997-12-27|1997-12-21|COLLECT COD|TRUCK|s wake furiously. idly pending reques +59297|1401|80|1|47|61212.80|0.05|0.05|R|F|1995-02-16|1995-02-22|1995-03-02|DELIVER IN PERSON|RAIL|y platelets. regular deposits detect car +59297|1361|62|2|29|36608.44|0.08|0.06|A|F|1995-03-03|1995-02-15|1995-03-24|DELIVER IN PERSON|TRUCK|into beans mold. carefull +59297|32|8|3|17|15844.51|0.02|0.03|R|F|1995-03-16|1995-03-05|1995-03-26|TAKE BACK RETURN|REG AIR|ly express deposits haggle blit +59297|1679|3|4|13|20548.71|0.02|0.05|R|F|1995-02-08|1995-02-28|1995-03-08|DELIVER IN PERSON|RAIL| deposits. slyly final +59297|1286|24|5|47|55802.16|0.01|0.03|A|F|1995-01-21|1995-01-15|1995-02-07|TAKE BACK RETURN|AIR|eposits across the stealthily regular +59297|1778|21|6|45|75589.65|0.02|0.07|R|F|1994-12-26|1995-02-14|1994-12-29|TAKE BACK RETURN|FOB| final deposits are slyly; packages about +59297|131|32|7|3|3093.39|0.03|0.07|R|F|1995-02-09|1995-02-08|1995-02-27|TAKE BACK RETURN|AIR|counts. blithely pending pinto bean +59298|184|37|1|24|26020.32|0.07|0.05|A|F|1994-08-24|1994-07-28|1994-09-19|NONE|RAIL|ly special platelets. +59299|1268|80|1|1|1169.26|0.05|0.04|N|O|1997-10-01|1997-09-29|1997-10-02|COLLECT COD|RAIL|structions among the quickly pending a +59299|1261|62|2|31|36030.06|0.00|0.00|N|O|1997-09-30|1997-10-06|1997-10-18|DELIVER IN PERSON|AIR|efully. regular, unusual Tiresias among the +59299|1350|27|3|30|37540.50|0.05|0.06|N|O|1997-08-25|1997-10-25|1997-09-05|NONE|FOB|unts cajole +59299|1915|48|4|24|43605.84|0.09|0.02|N|O|1997-11-09|1997-09-30|1997-11-23|COLLECT COD|FOB| final deposits haggle about the +59299|522|13|5|6|8535.12|0.08|0.08|N|O|1997-11-13|1997-10-26|1997-11-29|TAKE BACK RETURN|TRUCK|ornis. bold courts sleep carefully express +59300|1131|32|1|21|21674.73|0.10|0.04|N|O|1997-05-05|1997-05-08|1997-05-11|COLLECT COD|AIR|e along the ironic foxes. +59301|1042|13|1|35|33006.40|0.02|0.06|N|O|1997-03-06|1997-01-31|1997-03-22|NONE|MAIL|fy account +59301|1314|15|2|49|59550.19|0.10|0.01|N|O|1996-12-06|1996-12-05|1996-12-24|COLLECT COD|FOB|ng ideas amo +59301|742|7|3|6|9856.44|0.05|0.07|N|O|1997-01-24|1996-12-05|1997-01-25|DELIVER IN PERSON|AIR|s are quickly. fluffily regular +59301|61|87|4|19|18260.14|0.07|0.05|N|O|1997-01-10|1996-12-09|1997-02-02|COLLECT COD|TRUCK|to beans. accounts wake. silent, b +59301|1385|100|5|40|51455.20|0.08|0.04|N|O|1996-11-21|1996-12-24|1996-11-26|COLLECT COD|SHIP|xcuses. pend +59301|1131|32|6|11|11353.43|0.10|0.02|N|O|1997-01-16|1997-01-19|1997-01-17|DELIVER IN PERSON|AIR|old excuses. even asympt +59302|112|91|1|14|14169.54|0.03|0.03|N|O|1996-04-01|1996-04-01|1996-04-05|COLLECT COD|TRUCK|s engage carefully slyly regular deposi +59302|1319|34|2|26|31728.06|0.08|0.01|N|O|1996-04-07|1996-04-27|1996-04-25|DELIVER IN PERSON|REG AIR|unts. furiously spec +59302|818|85|3|43|73908.83|0.05|0.00|N|O|1996-04-06|1996-04-12|1996-04-12|NONE|AIR| wake slyly alongside o +59303|845|46|1|33|57612.72|0.06|0.01|N|O|1997-12-30|1998-02-06|1998-01-16|COLLECT COD|MAIL|quests. ironic instructions haggle inst +59303|947|48|2|27|49894.38|0.08|0.04|N|O|1998-03-16|1998-02-10|1998-04-15|DELIVER IN PERSON|TRUCK|requests are slyly. +59303|1959|92|3|42|78159.90|0.06|0.02|N|O|1997-12-16|1998-02-10|1998-01-09|COLLECT COD|TRUCK|s according to the accounts +59303|585|16|4|12|17826.96|0.05|0.00|N|O|1998-01-09|1998-02-13|1998-01-27|TAKE BACK RETURN|MAIL|ckages affix furiously. packages wake slyly +59303|345|46|5|18|22416.12|0.10|0.00|N|O|1998-03-07|1998-02-26|1998-03-30|TAKE BACK RETURN|RAIL|ges after the final r +59328|1605|29|1|4|6026.40|0.04|0.03|N|O|1997-05-30|1997-06-27|1997-06-03|COLLECT COD|SHIP|ironically regular p +59328|1587|8|2|37|55077.46|0.09|0.03|N|O|1997-04-25|1997-05-20|1997-05-08|TAKE BACK RETURN|SHIP|ructions about +59328|1179|16|3|5|5400.85|0.02|0.03|N|O|1997-07-25|1997-06-02|1997-08-10|NONE|MAIL|fully? furiously pending theodolites detect +59328|1955|44|4|45|83562.75|0.01|0.00|N|O|1997-05-08|1997-06-07|1997-05-13|NONE|SHIP|nic, ironic foxes hinder slyly +59329|1234|9|1|17|19298.91|0.03|0.01|R|F|1992-12-08|1993-01-07|1993-01-06|DELIVER IN PERSON|TRUCK| regular excuses al +59329|1656|98|2|22|34268.30|0.05|0.03|R|F|1993-02-02|1993-02-14|1993-02-24|COLLECT COD|TRUCK|c asymptotes boost carefully. blit +59329|1956|1|3|2|3715.90|0.03|0.05|R|F|1993-02-20|1993-03-01|1993-03-08|COLLECT COD|TRUCK|nticing deposits mold accounts +59329|978|47|4|19|35700.43|0.04|0.04|R|F|1992-12-20|1993-02-19|1993-01-01|TAKE BACK RETURN|RAIL|s boost furiously quietly r +59329|142|95|5|50|52107.00|0.06|0.06|A|F|1993-01-07|1993-02-19|1993-01-08|NONE|FOB|g attainments. blithe packages promise +59329|1487|27|6|32|44431.36|0.05|0.02|R|F|1993-02-20|1993-02-06|1993-02-21|DELIVER IN PERSON|REG AIR|usly ironic instructions are quick +59330|576|67|1|18|26578.26|0.00|0.08|A|F|1994-08-15|1994-09-25|1994-09-08|NONE|FOB|ly express packages wake slyl +59331|316|17|1|40|48652.40|0.06|0.00|N|O|1998-04-06|1998-06-02|1998-04-21|NONE|AIR|otes. bold accounts h +59331|1071|77|2|21|20413.47|0.06|0.05|N|O|1998-03-29|1998-05-05|1998-04-15|DELIVER IN PERSON|AIR|se slyly. ironic accounts according to the +59331|306|91|3|32|38601.60|0.08|0.03|N|O|1998-06-22|1998-04-12|1998-07-15|TAKE BACK RETURN|FOB|old instructions affix above t +59331|1533|14|4|30|43035.90|0.01|0.02|N|O|1998-04-30|1998-05-18|1998-05-05|COLLECT COD|AIR| regular foxes cajole blithely. unus +59331|1839|69|5|23|40039.09|0.08|0.01|N|O|1998-06-08|1998-05-05|1998-06-15|NONE|FOB|sits. pending excuses serv +59331|1809|53|6|14|23951.20|0.09|0.00|N|O|1998-07-07|1998-05-25|1998-07-15|NONE|FOB|l escapades wake slyly above the care +59332|917|52|1|13|23632.83|0.04|0.04|N|O|1996-03-21|1996-03-18|1996-03-27|TAKE BACK RETURN|RAIL| pending, bold patterns haggle busily +59332|1803|47|2|21|35800.80|0.09|0.03|N|O|1996-03-22|1996-02-23|1996-04-18|DELIVER IN PERSON|MAIL|aggle across the slyly special accounts. fu +59332|699|100|3|31|49590.39|0.02|0.04|N|O|1996-05-14|1996-03-13|1996-06-13|TAKE BACK RETURN|FOB|ironic, even deposits. bold, final p +59332|144|97|4|38|39677.32|0.06|0.08|N|O|1996-03-29|1996-03-18|1996-04-22|COLLECT COD|SHIP|egular foxes wake carefully. +59332|912|81|5|34|61638.94|0.02|0.06|N|O|1996-03-11|1996-04-04|1996-03-21|COLLECT COD|TRUCK|. furiously express pla +59332|960|61|6|26|48384.96|0.01|0.04|N|O|1996-03-31|1996-04-13|1996-04-01|COLLECT COD|FOB| sentiments. unusual theodolites poach +59333|11|37|1|43|39173.43|0.06|0.04|N|O|1998-03-07|1998-04-17|1998-03-29|TAKE BACK RETURN|TRUCK|o beans sleep furi +59333|1832|76|2|20|34676.60|0.05|0.06|N|O|1998-03-23|1998-04-23|1998-04-16|DELIVER IN PERSON|SHIP|. express instructions +59333|257|12|3|31|35874.75|0.10|0.07|N|O|1998-05-07|1998-03-17|1998-06-01|DELIVER IN PERSON|RAIL|packages affix blithely regular accounts +59334|514|5|1|39|55165.89|0.03|0.03|A|F|1995-02-10|1995-03-09|1995-03-12|COLLECT COD|TRUCK|riously final theodolites wake slyly +59334|1659|1|2|33|51501.45|0.09|0.05|A|F|1995-01-04|1995-03-10|1995-01-13|NONE|FOB|alongside of the regular, even a +59335|1170|71|1|9|9640.53|0.01|0.01|N|O|1998-03-12|1998-05-08|1998-03-28|DELIVER IN PERSON|TRUCK|egular deposits. blithely pending +59360|466|25|1|2|2732.92|0.00|0.04|R|F|1992-07-03|1992-09-11|1992-07-08|DELIVER IN PERSON|RAIL|ly even requests! foxes f +59360|1112|21|2|29|29380.19|0.04|0.08|R|F|1992-07-13|1992-07-26|1992-07-18|COLLECT COD|SHIP|ess, ironic instructions. furiously slow t +59360|1539|60|3|33|47537.49|0.07|0.00|A|F|1992-09-24|1992-09-14|1992-09-28|COLLECT COD|AIR|s. furiously ironic foxes after th +59361|1893|37|1|2|3589.78|0.09|0.06|R|F|1992-10-07|1992-10-03|1992-10-24|COLLECT COD|RAIL| deposits. quickly even courts nag aroun +59361|1430|48|2|15|19971.45|0.02|0.01|A|F|1992-11-29|1992-10-22|1992-12-04|DELIVER IN PERSON|FOB| pinto beans. regular deposits cajol +59361|708|41|3|10|16087.00|0.05|0.06|R|F|1992-11-22|1992-10-15|1992-12-13|NONE|AIR|coys. regular, pending ideas above t +59362|1887|31|1|4|7155.52|0.02|0.03|N|O|1996-08-18|1996-07-30|1996-08-20|COLLECT COD|REG AIR|quickly regular accounts sublate +59362|1639|22|2|8|12325.04|0.06|0.08|N|O|1996-07-13|1996-07-30|1996-07-19|TAKE BACK RETURN|SHIP| deposits use slyly final account +59362|1630|54|3|49|75049.87|0.06|0.02|N|O|1996-08-21|1996-06-04|1996-08-22|COLLECT COD|REG AIR|. slyly special deposits against t +59362|147|26|4|27|28272.78|0.10|0.08|N|O|1996-08-23|1996-06-08|1996-09-13|COLLECT COD|AIR| are blithely a +59362|1842|86|5|11|19182.24|0.03|0.03|N|O|1996-05-18|1996-07-28|1996-05-27|COLLECT COD|TRUCK|mptotes haggle fluffily bold deposits. +59363|1921|54|1|25|45573.00|0.06|0.04|A|F|1994-08-14|1994-06-08|1994-08-31|COLLECT COD|AIR|ven requests affix. express deposits sl +59363|1219|31|2|44|49289.24|0.06|0.04|A|F|1994-08-15|1994-06-23|1994-09-10|NONE|SHIP|cajole up the +59363|1330|45|3|23|28320.59|0.04|0.04|A|F|1994-06-24|1994-07-17|1994-07-23|COLLECT COD|AIR|kly. silent, final pl +59363|537|38|4|6|8625.18|0.00|0.02|R|F|1994-08-02|1994-07-27|1994-08-06|TAKE BACK RETURN|MAIL|l, regular th +59364|531|32|1|21|30062.13|0.10|0.03|N|O|1996-09-22|1996-09-27|1996-10-08|NONE|SHIP|sly express accounts cajole. sl +59365|501|62|1|33|46249.50|0.04|0.04|R|F|1994-12-17|1995-02-12|1994-12-19|TAKE BACK RETURN|TRUCK|ggle final, ironic foxes. ruth +59365|634|97|2|11|16880.93|0.03|0.08|R|F|1995-01-29|1995-01-26|1995-02-26|TAKE BACK RETURN|RAIL|furiously? blithely +59365|84|60|3|28|27554.24|0.03|0.07|R|F|1995-03-12|1995-02-24|1995-03-28|COLLECT COD|MAIL|c warhorses acr +59365|87|63|4|13|12832.04|0.00|0.05|A|F|1995-03-31|1995-02-20|1995-04-21|TAKE BACK RETURN|TRUCK|quickly final dependencies about the s +59365|223|78|5|21|23587.62|0.08|0.05|A|F|1995-01-06|1995-02-09|1995-01-12|TAKE BACK RETURN|MAIL|t the slyly unus +59365|504|95|6|9|12640.50|0.00|0.03|R|F|1995-03-02|1995-03-01|1995-03-31|DELIVER IN PERSON|SHIP|o beans. slyly +59366|1658|41|1|41|63945.65|0.08|0.08|N|O|1995-07-03|1995-06-26|1995-07-31|TAKE BACK RETURN|RAIL|arefully alongside of the accounts. re +59366|1384|61|2|44|56556.72|0.00|0.01|A|F|1995-05-13|1995-07-19|1995-06-11|DELIVER IN PERSON|FOB|ep alongside of the pearls. deposits use +59366|618|19|3|14|21260.54|0.07|0.04|N|O|1995-06-28|1995-06-14|1995-07-18|TAKE BACK RETURN|TRUCK|es. carefully regular dolphins sleep quic +59366|147|74|4|32|33508.48|0.08|0.08|R|F|1995-05-20|1995-06-13|1995-05-27|TAKE BACK RETURN|FOB|refully around the furiously regular pint +59366|1450|29|5|22|29731.90|0.06|0.01|A|F|1995-05-02|1995-05-24|1995-05-09|TAKE BACK RETURN|RAIL|slyly final dependencies wake ideas. sly +59367|1241|42|1|39|44547.36|0.05|0.04|N|O|1997-01-06|1996-11-20|1997-02-02|COLLECT COD|TRUCK|nts: fluffily +59367|1404|5|2|48|62659.20|0.00|0.05|N|O|1997-01-17|1996-11-07|1997-02-08|TAKE BACK RETURN|FOB|ackages are alwa +59367|425|13|3|20|26508.40|0.04|0.08|N|O|1997-01-11|1996-11-12|1997-02-05|DELIVER IN PERSON|TRUCK|ependencies. fluffi +59367|1158|67|4|12|12709.80|0.10|0.00|N|O|1996-10-08|1996-10-31|1996-10-09|TAKE BACK RETURN|FOB|ts are fluffily. slyly ironic accoun +59367|71|72|5|45|43698.15|0.03|0.08|N|O|1996-12-01|1996-11-25|1996-12-25|COLLECT COD|SHIP|e carefully reg +59367|332|33|6|44|54222.52|0.10|0.02|N|O|1996-12-04|1996-11-09|1996-12-15|TAKE BACK RETURN|FOB| affix: regularly speci +59392|1794|95|1|18|30524.22|0.06|0.05|A|F|1993-08-25|1993-08-03|1993-09-03|COLLECT COD|REG AIR|pending platelets wake furiously ironic p +59392|152|31|2|1|1052.15|0.08|0.03|R|F|1993-07-06|1993-07-28|1993-07-21|TAKE BACK RETURN|FOB|ggle slyly. bold deposits above the +59392|1125|26|3|15|15391.80|0.01|0.01|A|F|1993-10-21|1993-09-06|1993-11-15|DELIVER IN PERSON|MAIL| hockey pl +59392|1772|57|4|45|75319.65|0.03|0.01|R|F|1993-07-07|1993-08-10|1993-07-16|NONE|RAIL|pinto beans haggle +59392|1647|89|5|33|51105.12|0.00|0.07|R|F|1993-10-17|1993-07-27|1993-11-15|NONE|SHIP|hins. express requests nag fur +59392|487|17|6|21|29137.08|0.07|0.07|A|F|1993-07-14|1993-08-12|1993-07-20|COLLECT COD|REG AIR|ole blithely slyly ironic warthogs. expr +59393|1113|50|1|17|17239.87|0.03|0.02|R|F|1994-01-07|1993-12-23|1994-01-25|NONE|SHIP|quickly sp +59393|1701|2|2|49|78532.30|0.03|0.08|R|F|1994-01-20|1994-02-13|1994-01-29|TAKE BACK RETURN|AIR|fily. pinto beans about +59393|239|40|3|33|37594.59|0.03|0.04|R|F|1994-03-18|1993-12-25|1994-03-28|COLLECT COD|MAIL|e furiously ironic +59393|1188|25|4|25|27229.50|0.08|0.01|R|F|1994-01-19|1994-01-12|1994-02-18|NONE|AIR|ding to the final excuses; carefully unu +59393|572|33|5|50|73628.50|0.05|0.04|A|F|1993-12-10|1994-01-28|1993-12-13|COLLECT COD|MAIL|quests wake carefully. sl +59393|1313|28|6|10|12143.10|0.02|0.04|A|F|1994-01-31|1994-01-28|1994-02-21|NONE|TRUCK| accounts detect quickly specia +59394|1160|61|1|11|11672.76|0.05|0.00|N|O|1997-07-03|1997-08-03|1997-07-16|DELIVER IN PERSON|RAIL| unusual accounts detect quickly along the +59394|1463|64|2|27|36840.42|0.01|0.03|N|O|1997-09-04|1997-08-18|1997-09-26|NONE|AIR|ld requests-- regular, iro +59394|853|87|3|40|70154.00|0.04|0.04|N|O|1997-07-15|1997-08-02|1997-08-12|TAKE BACK RETURN|FOB| pending excuses do are blithely +59394|989|58|4|20|37799.60|0.10|0.03|N|O|1997-09-06|1997-09-16|1997-09-26|COLLECT COD|REG AIR|lar accounts use quickly up +59394|1472|51|5|25|34336.75|0.04|0.02|N|O|1997-07-28|1997-08-25|1997-08-19|NONE|MAIL|lyly ironic accounts was abov +59394|342|71|6|18|22362.12|0.04|0.07|N|O|1997-07-24|1997-08-01|1997-08-12|TAKE BACK RETURN|MAIL|pecial deposits-- flu +59395|923|58|1|17|31006.64|0.01|0.05|A|F|1992-05-23|1992-07-04|1992-05-28|COLLECT COD|FOB|egular requests. quickly unusual packages +59395|255|56|2|11|12707.75|0.06|0.00|A|F|1992-08-10|1992-06-17|1992-08-20|COLLECT COD|SHIP|nal theodolites snooze about the bold depos +59396|1673|74|1|50|78733.50|0.00|0.05|R|F|1995-01-12|1995-02-05|1995-01-31|COLLECT COD|MAIL|s are packages. blithely silent pinto bea +59396|1888|18|2|38|68015.44|0.06|0.01|R|F|1995-01-05|1995-01-30|1995-01-21|DELIVER IN PERSON|MAIL|dazzle furiously. even +59396|445|75|3|33|44399.52|0.07|0.06|A|F|1995-01-13|1995-01-28|1995-01-15|NONE|MAIL|ar, regular packages. regular, bold d +59396|856|90|4|26|45678.10|0.10|0.08|R|F|1995-01-09|1995-02-04|1995-02-06|COLLECT COD|REG AIR| quickly unusual packages lose fur +59396|1702|87|5|47|75373.90|0.10|0.02|A|F|1994-11-24|1995-02-11|1994-11-28|COLLECT COD|MAIL|s. theodolites wake bl +59397|1066|37|1|22|21275.32|0.02|0.02|N|O|1997-05-27|1997-05-02|1997-05-30|COLLECT COD|TRUCK|ogs affix slyly un +59397|635|36|2|37|56818.31|0.07|0.01|N|O|1997-03-30|1997-04-12|1997-04-15|NONE|REG AIR|cuses. permanently ironic ideas sl +59397|1937|26|3|16|29422.88|0.02|0.04|N|O|1997-04-01|1997-04-24|1997-04-27|TAKE BACK RETURN|SHIP|ts haggle blithely excuses! foxes wa +59397|64|65|4|27|26029.62|0.05|0.03|N|O|1997-04-09|1997-05-18|1997-04-21|NONE|MAIL|lly unusual requests. pen +59398|649|81|1|18|27893.52|0.02|0.05|N|O|1998-01-24|1998-03-02|1998-02-11|COLLECT COD|MAIL|ess platelets. enticing ideas cajole q +59399|1142|43|1|4|4172.56|0.05|0.07|N|O|1995-10-01|1995-09-23|1995-10-27|NONE|AIR|quests are blithely. +59399|1522|3|2|30|42705.60|0.05|0.07|N|O|1995-09-28|1995-09-24|1995-10-05|COLLECT COD|RAIL|s. carefully blithe accounts lo +59399|1621|22|3|36|54814.32|0.00|0.03|N|O|1995-07-20|1995-09-07|1995-08-15|COLLECT COD|RAIL|osits-- quic +59399|1754|55|4|48|79476.00|0.04|0.05|N|O|1995-08-15|1995-09-14|1995-08-25|COLLECT COD|REG AIR|e. blithely spe +59399|399|56|5|24|31185.36|0.07|0.04|N|O|1995-07-23|1995-08-04|1995-08-14|TAKE BACK RETURN|MAIL|carefully. fluffily pending a +59424|95|96|1|15|14926.35|0.07|0.00|N|O|1997-03-26|1997-02-13|1997-04-02|NONE|AIR|ccounts integrate. fur +59424|720|21|2|50|81036.00|0.08|0.06|N|O|1997-04-14|1997-02-08|1997-05-10|TAKE BACK RETURN|MAIL|g excuses sleep sly +59424|1888|18|3|27|48326.76|0.08|0.01|N|O|1997-03-19|1997-02-16|1997-03-27|TAKE BACK RETURN|REG AIR|fter the foxes. quickly iro +59424|1827|28|4|34|58779.88|0.08|0.08|N|O|1997-02-02|1997-02-06|1997-03-01|COLLECT COD|MAIL| deposits are quietly on the accounts. +59425|1684|85|1|34|53913.12|0.10|0.06|R|F|1992-08-20|1992-08-02|1992-08-26|COLLECT COD|SHIP|ously regular +59425|1528|29|2|35|50033.20|0.01|0.06|R|F|1992-07-21|1992-07-10|1992-08-12|COLLECT COD|AIR|nto beans. furiously regul +59425|1927|60|3|21|38407.32|0.07|0.06|A|F|1992-05-24|1992-08-13|1992-05-30|TAKE BACK RETURN|FOB|. blithely close deposits +59425|456|44|4|35|47475.75|0.06|0.08|R|F|1992-08-26|1992-07-26|1992-09-19|COLLECT COD|AIR|ironic courts cajole carefully above the +59425|372|29|5|26|33081.62|0.10|0.08|A|F|1992-07-15|1992-07-09|1992-07-25|COLLECT COD|TRUCK|the pending deposits wake carefully car +59426|461|49|1|33|44928.18|0.10|0.00|N|O|1996-02-20|1996-02-26|1996-03-21|COLLECT COD|FOB|e blithely. regular deposit +59426|1637|20|2|30|46158.90|0.04|0.04|N|O|1996-03-27|1996-03-15|1996-04-10|COLLECT COD|AIR|ar packages +59426|1906|95|3|18|32542.20|0.06|0.00|N|O|1996-03-20|1996-03-12|1996-04-08|DELIVER IN PERSON|REG AIR|t. slow, final packages are alongside of t +59426|898|65|4|48|86346.72|0.04|0.02|N|O|1996-03-31|1996-04-24|1996-04-17|NONE|SHIP|ts detect along the car +59427|603|97|1|24|36086.40|0.08|0.06|N|O|1996-11-02|1996-09-10|1996-11-03|NONE|AIR|y regular, bold deposits. fluffily unusu +59427|1401|80|2|11|14326.40|0.00|0.05|N|O|1996-11-10|1996-10-13|1996-11-18|TAKE BACK RETURN|MAIL|ual platelets sleep quietly above the e +59427|345|2|3|48|59776.32|0.03|0.07|N|O|1996-08-12|1996-10-02|1996-08-24|DELIVER IN PERSON|TRUCK|pades ought to haggle across the bo +59427|452|82|4|36|48688.20|0.10|0.04|N|O|1996-10-29|1996-09-09|1996-11-09|TAKE BACK RETURN|REG AIR|ackages; carefully sly req +59427|1282|57|5|14|16565.92|0.07|0.08|N|O|1996-11-21|1996-10-19|1996-11-29|NONE|SHIP|he ironic, ironic excuses +59427|697|29|6|20|31953.80|0.07|0.08|N|O|1996-09-02|1996-10-28|1996-09-08|TAKE BACK RETURN|RAIL|ular foxes. +59428|596|97|1|17|25442.03|0.00|0.04|A|F|1993-12-19|1993-11-18|1993-12-23|DELIVER IN PERSON|FOB| foxes are accord +59428|1325|64|2|43|52731.76|0.04|0.05|R|F|1993-12-19|1993-10-22|1993-12-25|NONE|REG AIR|ts was according to the bold, e +59428|1526|27|3|40|57100.80|0.07|0.07|A|F|1993-11-20|1993-11-03|1993-12-08|DELIVER IN PERSON|SHIP|kages. special packages above the quickly +59428|777|78|4|17|28522.09|0.10|0.03|R|F|1993-12-06|1993-10-28|1993-12-21|NONE|MAIL| slyly ironic accou +59428|65|91|5|27|26056.62|0.06|0.06|R|F|1993-11-28|1993-11-29|1993-12-25|NONE|MAIL|ly ironic packages about +59428|338|95|6|34|42103.22|0.10|0.03|A|F|1993-09-12|1993-11-24|1993-10-05|DELIVER IN PERSON|MAIL|lar foxes. final pinto bean +59428|490|78|7|37|51448.13|0.09|0.03|A|F|1993-10-05|1993-11-11|1993-10-09|TAKE BACK RETURN|MAIL|he furious +59429|966|69|1|46|85880.16|0.06|0.03|A|F|1994-04-01|1994-02-10|1994-04-26|DELIVER IN PERSON|AIR|eas. carefully regular theodolit +59429|1618|19|2|11|16715.71|0.00|0.04|R|F|1994-03-06|1994-02-04|1994-03-08|DELIVER IN PERSON|SHIP|und the blithely regular ideas +59430|428|87|1|5|6642.10|0.06|0.01|N|O|1997-11-21|1997-10-30|1997-12-01|DELIVER IN PERSON|AIR|ironic, daring exc +59430|219|74|2|23|25741.83|0.03|0.02|N|O|1997-11-12|1997-11-01|1997-12-03|DELIVER IN PERSON|REG AIR|requests engage. quickly bold gifts caj +59430|1147|84|3|21|22010.94|0.08|0.07|N|O|1997-10-15|1997-12-11|1997-11-12|DELIVER IN PERSON|REG AIR|lar Tiresias boost c +59431|172|25|1|16|17154.72|0.07|0.07|A|F|1993-04-08|1993-03-26|1993-05-07|DELIVER IN PERSON|RAIL|gular theodolites are +59431|331|32|2|1|1231.33|0.06|0.04|R|F|1993-05-02|1993-05-16|1993-05-25|TAKE BACK RETURN|TRUCK|d, even packages wake slyly alo +59431|1688|12|3|28|44511.04|0.09|0.07|R|F|1993-03-02|1993-05-06|1993-03-30|NONE|MAIL|gular ideas boost blithely. final pinto bea +59431|1741|68|4|32|52567.68|0.00|0.01|R|F|1993-06-22|1993-05-13|1993-06-28|COLLECT COD|REG AIR|side of the perm +59456|1862|63|1|7|12347.02|0.09|0.05|A|F|1992-01-20|1992-02-10|1992-02-07|COLLECT COD|REG AIR|blithely. daring, bold +59456|722|87|2|30|48681.60|0.01|0.02|A|F|1992-02-27|1992-02-27|1992-03-07|TAKE BACK RETURN|TRUCK| bold ideas. regular, +59456|752|85|3|23|38013.25|0.08|0.02|R|F|1992-01-11|1992-03-24|1992-01-27|TAKE BACK RETURN|TRUCK|c packages are quickly carefull +59456|242|24|4|3|3426.72|0.04|0.00|R|F|1992-01-24|1992-03-20|1992-02-22|DELIVER IN PERSON|FOB|long the carefully ironic d +59456|1999|32|5|33|62732.67|0.02|0.01|A|F|1992-02-03|1992-03-03|1992-02-08|DELIVER IN PERSON|RAIL|. silent pinto beans ar +59457|915|50|1|37|67188.67|0.05|0.00|N|O|1998-10-14|1998-10-18|1998-10-17|COLLECT COD|SHIP|ar dolphins. final f +59457|449|37|2|38|51278.72|0.08|0.04|N|O|1998-10-24|1998-10-02|1998-10-30|COLLECT COD|TRUCK| fluffily regular pinto bea +59457|434|93|3|10|13344.30|0.07|0.08|N|O|1998-08-22|1998-10-24|1998-08-26|DELIVER IN PERSON|RAIL|packages are about the fu +59457|1035|41|4|42|39313.26|0.05|0.03|N|O|1998-09-05|1998-10-15|1998-09-17|TAKE BACK RETURN|AIR|y furious ideas sleep fluf +59458|1305|82|1|5|6031.50|0.08|0.06|N|O|1998-05-14|1998-06-29|1998-06-01|TAKE BACK RETURN|FOB| asymptotes. regular instruct +59458|1857|44|2|12|21106.20|0.08|0.08|N|O|1998-08-01|1998-06-01|1998-08-07|DELIVER IN PERSON|TRUCK|instructions cajole furiously slyly ironic +59458|844|11|3|16|27917.44|0.10|0.03|N|O|1998-05-16|1998-06-02|1998-05-28|TAKE BACK RETURN|AIR|excuses. silent, careful platelets accordin +59458|1449|89|4|26|35111.44|0.06|0.00|N|O|1998-07-31|1998-07-03|1998-08-18|COLLECT COD|TRUCK|quickly even packages. slyly +59459|1310|25|1|7|8479.17|0.00|0.04|R|F|1994-03-28|1994-04-29|1994-04-22|NONE|FOB|equests affix against the pending +59459|1015|16|2|37|33892.37|0.05|0.08|A|F|1994-03-30|1994-05-01|1994-04-26|DELIVER IN PERSON|TRUCK|cajole. regular, bold platelets +59459|1602|26|3|3|4510.80|0.09|0.03|A|F|1994-02-18|1994-05-05|1994-02-22|DELIVER IN PERSON|MAIL|the furiou +59459|1023|94|4|42|38808.84|0.00|0.08|A|F|1994-04-16|1994-04-08|1994-05-06|COLLECT COD|RAIL| regular a +59460|1849|50|1|38|66531.92|0.03|0.05|N|O|1995-06-26|1995-07-04|1995-07-03|NONE|TRUCK|tes alongside of t +59460|1689|72|2|19|30222.92|0.01|0.04|N|O|1995-07-23|1995-05-27|1995-08-16|NONE|FOB|ckages wake carefully afte +59460|482|70|3|42|58064.16|0.00|0.04|N|O|1995-08-18|1995-05-31|1995-09-13|COLLECT COD|REG AIR|regular deposits. fur +59461|472|2|1|40|54898.80|0.05|0.03|N|O|1997-10-27|1997-12-15|1997-11-21|DELIVER IN PERSON|SHIP|se along the slyly spe +59461|1497|37|2|7|9789.43|0.08|0.01|N|O|1997-12-07|1997-11-29|1998-01-04|TAKE BACK RETURN|SHIP|fully regular asymptote +59462|1814|44|1|2|3431.62|0.01|0.01|N|O|1998-06-25|1998-05-24|1998-06-29|COLLECT COD|AIR|ifts cajole slyly. fur +59462|1535|36|2|16|22984.48|0.09|0.05|N|O|1998-04-29|1998-06-17|1998-05-04|COLLECT COD|MAIL|pinto beans. regul +59462|486|87|3|23|31889.04|0.04|0.01|N|O|1998-03-23|1998-05-25|1998-03-29|NONE|SHIP|use fluffily ironic asymptote +59462|1258|96|4|35|40573.75|0.03|0.08|N|O|1998-07-02|1998-06-10|1998-07-17|TAKE BACK RETURN|SHIP| bold deposits. silently bold fox +59462|884|18|5|2|3569.76|0.06|0.06|N|O|1998-06-11|1998-05-25|1998-06-19|COLLECT COD|RAIL|oost carefully. slyly regular accounts wake +59462|837|71|6|32|55610.56|0.06|0.06|N|O|1998-05-16|1998-06-04|1998-06-07|NONE|FOB|he blithely t +59462|640|34|7|11|16947.04|0.00|0.03|N|O|1998-06-17|1998-05-15|1998-06-30|TAKE BACK RETURN|REG AIR|unusual ideas a +59463|1140|13|1|21|21863.94|0.08|0.07|R|F|1994-02-13|1994-01-21|1994-03-04|NONE|MAIL|ove the deposits. bold, careful req +59463|870|70|2|14|24792.18|0.09|0.05|R|F|1994-02-19|1994-01-18|1994-02-21|NONE|RAIL|ly. special platelets wak +59463|444|74|3|27|36299.88|0.10|0.00|R|F|1993-11-23|1994-01-13|1993-12-19|TAKE BACK RETURN|TRUCK| deposits. carefully ev +59463|614|46|4|47|71186.67|0.04|0.03|A|F|1993-12-02|1993-12-17|1993-12-12|COLLECT COD|AIR|s. blithely even accounts detect slyly a +59488|1980|25|1|14|26347.72|0.10|0.06|N|O|1998-01-04|1998-01-02|1998-01-17|NONE|TRUCK|e furiously +59488|609|72|2|36|54345.60|0.04|0.03|N|O|1998-01-23|1997-11-20|1998-01-24|COLLECT COD|TRUCK|excuses. slyly even packages +59488|753|86|3|15|24806.25|0.09|0.07|N|O|1998-01-06|1997-12-24|1998-01-08|COLLECT COD|REG AIR| furiously pending packa +59489|1387|64|1|28|36074.64|0.10|0.05|A|F|1992-04-01|1992-03-09|1992-04-15|DELIVER IN PERSON|AIR|counts above the unusual requests wake b +59489|1341|80|2|40|49693.60|0.03|0.00|A|F|1992-03-15|1992-04-05|1992-03-28|TAKE BACK RETURN|MAIL|ely ironic dependen +59489|473|61|3|39|53565.33|0.01|0.08|R|F|1992-02-27|1992-04-11|1992-03-26|NONE|FOB|efully? theodolites are fluffil +59489|1037|43|4|29|27202.87|0.01|0.06|R|F|1992-04-03|1992-04-06|1992-04-15|DELIVER IN PERSON|FOB|orses nag quickly +59489|1216|17|5|50|55860.50|0.03|0.08|A|F|1992-04-16|1992-02-23|1992-05-15|DELIVER IN PERSON|MAIL|s packages. slyly special pinto beans +59490|1441|42|1|41|55040.04|0.08|0.04|R|F|1993-10-06|1993-08-30|1993-10-25|COLLECT COD|TRUCK|eodolites. final dolphins sle +59491|1228|29|1|14|15809.08|0.09|0.03|R|F|1992-04-14|1992-04-26|1992-04-19|NONE|AIR|uses wake doggedly alo +59491|613|76|2|44|66598.84|0.06|0.00|A|F|1992-05-27|1992-06-23|1992-06-22|NONE|REG AIR|unts; blithely even id +59491|1735|20|3|38|62195.74|0.04|0.06|R|F|1992-05-14|1992-04-24|1992-06-08|NONE|AIR|fluffily ironic excuses hagg +59491|1714|15|4|28|45239.88|0.02|0.03|R|F|1992-06-26|1992-06-02|1992-07-05|DELIVER IN PERSON|REG AIR|ironic pinto beans. fin +59491|1049|55|5|33|31351.32|0.03|0.00|A|F|1992-05-25|1992-05-21|1992-06-06|DELIVER IN PERSON|REG AIR|ges cajole regular pinto beans. furiously +59491|1785|28|6|1|1686.78|0.10|0.07|R|F|1992-04-30|1992-05-20|1992-05-07|TAKE BACK RETURN|SHIP|al deposits: regular decoys affix +59492|58|9|1|48|45986.40|0.02|0.02|A|F|1992-11-21|1993-01-20|1992-12-18|COLLECT COD|SHIP| furiously bold accounts +59492|347|4|2|19|23699.46|0.07|0.01|R|F|1993-01-02|1992-12-13|1993-01-16|DELIVER IN PERSON|RAIL|ts boost blithely quickly regu +59493|1905|6|1|4|7227.60|0.04|0.05|N|O|1996-05-23|1996-06-07|1996-06-14|COLLECT COD|FOB|iously silent packages? caref +59493|74|100|2|41|39936.87|0.08|0.04|N|O|1996-04-14|1996-05-26|1996-05-02|COLLECT COD|MAIL|gle quickly ironic, silent requests. +59493|729|30|3|19|30964.68|0.08|0.06|N|O|1996-03-23|1996-04-14|1996-03-29|DELIVER IN PERSON|AIR|row along the furiously stealthy pac +59494|993|94|1|37|70077.63|0.04|0.02|N|O|1997-05-26|1997-08-10|1997-06-05|COLLECT COD|MAIL| according to th +59494|1505|46|2|47|66105.50|0.10|0.07|N|O|1997-06-10|1997-06-25|1997-07-02|TAKE BACK RETURN|RAIL|ding hockey players cajole silent requ +59495|1138|11|1|5|5195.65|0.03|0.02|R|F|1993-01-05|1992-11-26|1993-02-03|TAKE BACK RETURN|TRUCK|r frays haggle. furio +59495|1375|52|2|29|37014.73|0.04|0.02|A|F|1993-02-01|1992-12-07|1993-03-01|TAKE BACK RETURN|RAIL|uests are furiously. regular requests cajol +59495|1959|4|3|50|93047.50|0.06|0.07|R|F|1992-10-18|1992-12-21|1992-10-27|TAKE BACK RETURN|AIR| regular packages. un +59495|1355|56|4|18|22614.30|0.08|0.06|A|F|1992-11-02|1993-01-03|1992-11-25|COLLECT COD|TRUCK|ffily pending co +59495|1296|97|5|30|35918.70|0.10|0.07|R|F|1992-12-12|1992-12-15|1992-12-16|COLLECT COD|FOB|usual requests cajole. regular depende +59520|106|85|1|25|25152.50|0.03|0.00|N|O|1997-07-01|1997-08-09|1997-07-21|TAKE BACK RETURN|SHIP|onic excus +59520|1892|93|2|22|39465.58|0.01|0.06|N|O|1997-06-07|1997-07-14|1997-06-12|TAKE BACK RETURN|SHIP|y ironic depen +59520|422|52|3|1|1322.42|0.03|0.05|N|O|1997-07-21|1997-08-12|1997-08-08|DELIVER IN PERSON|RAIL|y bold deposits cajole daringly about +59520|765|66|4|23|38312.48|0.04|0.03|N|O|1997-06-29|1997-08-19|1997-06-30|DELIVER IN PERSON|REG AIR|s. quickly enticing requests ma +59520|1937|26|5|27|49651.11|0.09|0.04|N|O|1997-06-06|1997-08-02|1997-06-29|TAKE BACK RETURN|MAIL|about the packa +59520|1228|66|6|23|25972.06|0.07|0.00|N|O|1997-08-30|1997-07-29|1997-09-23|COLLECT COD|MAIL|al requests arou +59520|602|96|7|2|3005.20|0.06|0.03|N|O|1997-06-17|1997-07-06|1997-07-01|COLLECT COD|REG AIR|eodolites. frays after the ironic pint +59521|676|8|1|25|39416.75|0.03|0.05|N|O|1996-02-05|1995-12-30|1996-02-27|COLLECT COD|TRUCK|hely even accounts. bold +59521|1420|99|2|25|33035.50|0.09|0.00|N|O|1995-10-11|1995-11-21|1995-10-29|DELIVER IN PERSON|TRUCK| blithely special pinto b +59522|1417|35|1|21|27686.61|0.05|0.00|A|F|1993-07-16|1993-09-27|1993-07-31|NONE|REG AIR|sts alongside of the specia +59522|1374|75|2|2|2550.74|0.09|0.06|R|F|1993-07-30|1993-08-16|1993-08-20|DELIVER IN PERSON|TRUCK|riously regular packages us +59523|878|45|1|27|48029.49|0.02|0.07|N|O|1995-10-19|1995-10-13|1995-11-06|COLLECT COD|RAIL|regular requ +59523|1515|96|2|48|67992.48|0.02|0.07|N|O|1995-09-28|1995-10-20|1995-10-01|DELIVER IN PERSON|RAIL|ctions solve against the thinly ironic +59524|1022|93|1|31|28613.62|0.03|0.03|A|F|1993-11-29|1993-09-11|1993-12-10|TAKE BACK RETURN|TRUCK|usly final dolphins. carefully +59524|144|23|2|20|20882.80|0.09|0.02|R|F|1993-09-14|1993-10-23|1993-09-25|TAKE BACK RETURN|AIR|ly silent ide +59524|125|26|3|40|41004.80|0.01|0.03|A|F|1993-09-11|1993-10-03|1993-10-01|COLLECT COD|REG AIR|s. slyly even de +59525|741|38|1|13|21342.62|0.07|0.04|N|O|1997-03-28|1997-02-17|1997-04-12|TAKE BACK RETURN|REG AIR|nst the dogged depo +59525|525|86|2|5|7127.60|0.00|0.02|N|O|1997-03-10|1997-03-11|1997-03-13|DELIVER IN PERSON|RAIL|into beans. careful +59525|1583|64|3|6|8907.48|0.10|0.00|N|O|1997-04-22|1997-02-23|1997-04-28|TAKE BACK RETURN|REG AIR|eans x-ray asym +59525|492|93|4|43|59877.07|0.10|0.05|N|O|1997-01-09|1997-03-03|1997-02-01|NONE|SHIP|y final attainments. ironic, ironic f +59525|960|63|5|12|22331.52|0.04|0.08|N|O|1997-03-15|1997-02-23|1997-03-19|TAKE BACK RETURN|AIR|al tithes sleep. ironically +59526|1614|15|1|13|19702.93|0.10|0.08|N|O|1998-04-14|1998-06-23|1998-05-05|NONE|FOB|olites along the excuses +59526|1655|38|2|43|66935.95|0.06|0.08|N|O|1998-06-26|1998-06-25|1998-07-20|COLLECT COD|MAIL|eposits haggle blithely regula +59527|772|5|1|10|16727.70|0.04|0.04|N|O|1998-11-10|1998-10-07|1998-11-15|TAKE BACK RETURN|TRUCK|ffily even gifts. even platelets boost c +59527|1763|48|2|37|61596.12|0.02|0.00|N|O|1998-11-09|1998-09-25|1998-11-23|COLLECT COD|SHIP|olites cajole bl +59527|261|16|3|21|24386.46|0.05|0.07|N|O|1998-09-01|1998-10-02|1998-09-19|NONE|RAIL|nic instructions run blithely exp +59527|1127|64|4|36|37012.32|0.07|0.04|N|O|1998-08-27|1998-09-15|1998-09-21|COLLECT COD|SHIP|y express attainments c +59527|156|35|5|37|39077.55|0.06|0.04|N|O|1998-08-05|1998-09-04|1998-08-13|DELIVER IN PERSON|AIR|s haggle. furious +59527|589|90|6|17|25322.86|0.09|0.02|N|O|1998-10-30|1998-09-09|1998-11-11|COLLECT COD|TRUCK|ously bold platelets. quick, regular +59527|1867|54|7|12|21226.32|0.06|0.02|N|O|1998-08-28|1998-09-16|1998-09-02|NONE|SHIP|nst the fluffily final deposi +59552|1977|10|1|39|73279.83|0.02|0.01|R|F|1993-03-31|1993-03-21|1993-04-01|DELIVER IN PERSON|FOB|ffily brave +59552|595|96|2|21|31407.39|0.09|0.08|R|F|1993-03-04|1993-02-19|1993-03-09|DELIVER IN PERSON|MAIL|eposits. quickly final instructions shall h +59552|1247|22|3|48|55115.52|0.05|0.00|R|F|1993-04-04|1993-04-14|1993-04-15|NONE|RAIL|ly unusual platelets use carefully +59552|522|83|4|5|7112.60|0.05|0.08|R|F|1993-01-28|1993-04-12|1993-02-24|NONE|REG AIR|fully slyly ironic asymptotes- +59552|290|45|5|23|27376.67|0.04|0.08|A|F|1993-01-19|1993-03-18|1993-02-11|NONE|REG AIR|al accounts sleep. fluffily silent ide +59553|233|15|1|27|30597.21|0.03|0.08|R|F|1994-03-10|1993-12-25|1994-03-20|NONE|FOB|ckly after the carefully pending +59553|416|4|2|24|31593.84|0.07|0.08|A|F|1994-01-27|1994-01-06|1994-02-14|COLLECT COD|SHIP| to the bold pint +59553|519|10|3|18|25551.18|0.02|0.02|A|F|1993-12-14|1994-02-02|1993-12-27|TAKE BACK RETURN|RAIL|gular requests snooze bl +59553|1708|93|4|31|49900.70|0.00|0.03|A|F|1994-02-05|1993-12-20|1994-03-04|TAKE BACK RETURN|RAIL|efully accounts. slyly regular requests eat +59553|933|34|5|23|42180.39|0.01|0.03|R|F|1994-01-18|1993-12-31|1994-01-31|NONE|SHIP|s cajole fluff +59553|1236|37|6|33|37528.59|0.00|0.03|A|F|1994-01-22|1993-12-31|1994-02-15|DELIVER IN PERSON|TRUCK|ajole slyly fina +59553|705|70|7|14|22479.80|0.05|0.00|A|F|1994-03-04|1993-12-24|1994-03-21|TAKE BACK RETURN|RAIL|press deposits wake across the +59554|1259|34|1|10|11602.50|0.07|0.07|N|O|1995-12-29|1996-02-13|1996-01-13|DELIVER IN PERSON|MAIL|sual depende +59554|16|42|2|42|38472.42|0.03|0.05|N|O|1996-02-09|1996-01-18|1996-02-24|NONE|REG AIR| accounts w +59554|1467|85|3|3|4105.38|0.06|0.08|N|O|1996-01-05|1995-12-29|1996-01-16|COLLECT COD|TRUCK|s cajole blithely u +59554|373|58|4|48|61121.76|0.09|0.04|N|O|1996-02-25|1996-02-03|1996-03-20|DELIVER IN PERSON|MAIL|wake slyly: fluffily pending instructions i +59554|328|13|5|8|9826.56|0.02|0.00|N|O|1995-12-20|1996-01-08|1996-01-04|DELIVER IN PERSON|TRUCK|y bold instructions. carefully pend +59554|1406|46|6|43|56218.20|0.09|0.03|N|O|1996-02-18|1996-01-06|1996-03-13|DELIVER IN PERSON|SHIP|usly ironic requests. quickly regular i +59554|1900|87|7|47|84689.30|0.10|0.05|N|O|1996-02-19|1996-01-26|1996-03-14|DELIVER IN PERSON|REG AIR|ly. special dependencies above +59555|62|63|1|1|962.06|0.07|0.04|N|O|1996-05-28|1996-03-13|1996-06-09|NONE|SHIP| dependencies use quickly even instructions +59555|707|8|2|41|65915.70|0.07|0.08|N|O|1996-02-13|1996-03-17|1996-02-27|DELIVER IN PERSON|REG AIR| blithely above the carefully bold re +59555|1984|85|3|17|32061.66|0.02|0.04|N|O|1996-02-24|1996-04-24|1996-03-19|NONE|SHIP|eans. deposits along the carefu +59555|666|98|4|22|34466.52|0.10|0.05|N|O|1996-02-04|1996-04-10|1996-02-13|DELIVER IN PERSON|RAIL| according to the special, even foxe +59555|509|10|5|18|25371.00|0.03|0.07|N|O|1996-05-04|1996-04-02|1996-05-14|NONE|REG AIR|ithely regular sauternes alongsid +59555|1621|45|6|35|53291.70|0.06|0.03|N|O|1996-03-25|1996-02-29|1996-04-14|TAKE BACK RETURN|AIR|kages. even deposits ar +59555|982|51|7|13|24478.74|0.09|0.08|N|O|1996-02-08|1996-03-11|1996-03-03|NONE|REG AIR| the final braids. final ac +59556|15|16|1|33|30195.33|0.04|0.05|R|F|1994-12-20|1995-01-30|1994-12-21|NONE|REG AIR|accounts. fi +59556|1326|65|2|34|41728.88|0.08|0.08|A|F|1995-01-06|1995-02-13|1995-01-09|DELIVER IN PERSON|REG AIR|the unusual instructions. +59556|893|27|3|38|68167.82|0.02|0.02|A|F|1995-01-20|1995-03-02|1995-02-01|TAKE BACK RETURN|AIR|sly blithe pinto beans. carefully express d +59557|479|38|1|11|15174.17|0.03|0.02|N|O|1997-09-28|1997-07-11|1997-10-12|TAKE BACK RETURN|TRUCK|es are silently alo +59557|1026|62|2|9|8343.18|0.08|0.03|N|O|1997-09-24|1997-08-08|1997-10-17|NONE|TRUCK| the express, +59557|1379|94|3|21|26887.77|0.06|0.00|N|O|1997-08-10|1997-07-31|1997-08-30|NONE|FOB|blithely against t +59557|1839|69|4|19|33075.77|0.02|0.06|N|O|1997-09-02|1997-08-08|1997-09-11|TAKE BACK RETURN|RAIL|lar pinto beans cajole blithel +59558|768|1|1|35|58406.60|0.08|0.06|A|F|1992-11-12|1992-10-14|1992-11-23|COLLECT COD|TRUCK| furiously unusual requests. regul +59558|13|39|2|3|2739.03|0.08|0.04|R|F|1992-09-01|1992-09-01|1992-09-15|COLLECT COD|RAIL| after the final, final instructions. furi +59558|1673|97|3|24|37792.08|0.07|0.00|A|F|1992-08-15|1992-09-24|1992-09-08|COLLECT COD|FOB|ncies cajole furiously alongside +59559|1428|68|1|41|54506.22|0.03|0.01|A|F|1993-11-22|1993-11-30|1993-12-18|NONE|RAIL|lent dugouts use blithely expr +59559|734|67|2|9|14712.57|0.06|0.01|R|F|1993-11-21|1993-12-02|1993-12-14|COLLECT COD|AIR|equests wake quickly blithely ev +59559|742|7|3|31|50924.94|0.02|0.03|R|F|1993-09-26|1993-11-03|1993-10-26|DELIVER IN PERSON|TRUCK|old deposits boost among t +59559|1291|3|4|22|26230.38|0.04|0.00|R|F|1993-10-13|1993-12-11|1993-10-21|DELIVER IN PERSON|RAIL|e fluffily acro +59559|1094|95|5|43|42788.87|0.04|0.03|R|F|1993-12-15|1993-12-17|1993-12-29|NONE|RAIL|ts use furiously. regular, ironic p +59584|1927|16|1|11|20118.12|0.07|0.03|R|F|1993-07-30|1993-08-01|1993-08-09|COLLECT COD|SHIP|l, express pa +59584|120|99|2|3|3060.36|0.06|0.01|A|F|1993-09-20|1993-08-03|1993-09-30|TAKE BACK RETURN|FOB|fully special accounts alo +59584|472|73|3|39|53526.33|0.09|0.02|R|F|1993-08-20|1993-07-29|1993-09-13|COLLECT COD|REG AIR|g requests. pinto +59584|806|6|4|2|3413.60|0.05|0.08|A|F|1993-09-23|1993-08-04|1993-10-16|DELIVER IN PERSON|AIR|lites. close pa +59584|24|100|5|18|16632.36|0.03|0.04|R|F|1993-09-23|1993-07-06|1993-10-09|NONE|MAIL|sts about the ironic pinto beans detect a +59584|116|95|6|40|40644.40|0.04|0.04|A|F|1993-06-23|1993-08-09|1993-07-23|NONE|RAIL|y bold excuses. even deposits aff +59584|1191|28|7|16|17475.04|0.10|0.00|R|F|1993-09-23|1993-08-10|1993-10-17|COLLECT COD|REG AIR|inal foxes unwind after the clos +59585|1373|74|1|36|45877.32|0.09|0.00|R|F|1993-01-18|1992-11-14|1993-02-01|NONE|RAIL|metimes at the slyly final instructions +59585|627|90|2|12|18331.44|0.07|0.08|A|F|1992-11-08|1992-11-15|1992-11-23|NONE|MAIL|e bravely sometimes +59585|530|21|3|36|51499.08|0.08|0.00|R|F|1992-09-28|1992-12-14|1992-10-10|NONE|SHIP| express ideas. slyly pending co +59585|1416|34|4|14|18443.74|0.02|0.08|R|F|1992-12-18|1992-11-08|1993-01-04|TAKE BACK RETURN|MAIL|ies haggle. slyly unusual +59585|1203|78|5|34|37542.80|0.03|0.02|A|F|1992-10-14|1992-11-18|1992-10-19|NONE|AIR| regular accounts. carefully express pa +59586|933|68|1|31|56851.83|0.10|0.00|R|F|1992-06-17|1992-06-06|1992-07-09|COLLECT COD|REG AIR|uriously furiously ironic requests. expr +59586|1982|71|2|25|47099.50|0.01|0.05|R|F|1992-04-01|1992-04-13|1992-04-12|NONE|FOB|ding foxes. th +59586|1131|68|3|49|50574.37|0.08|0.01|A|F|1992-04-20|1992-05-18|1992-04-25|COLLECT COD|MAIL|es. sentiments are blithely into the +59586|570|1|4|50|73528.50|0.08|0.04|R|F|1992-03-31|1992-05-16|1992-04-08|NONE|MAIL|iously regular frays across the special +59587|1410|28|1|7|9179.87|0.00|0.05|A|F|1993-11-27|1993-10-25|1993-12-17|NONE|REG AIR|deas. slyly even ideas +59588|537|68|1|46|66126.38|0.00|0.08|N|O|1995-07-15|1995-08-26|1995-07-27|NONE|FOB|cial, even accounts are bold, +59589|520|81|1|38|53979.76|0.06|0.05|R|F|1992-06-14|1992-05-22|1992-07-08|NONE|TRUCK| final excuses boost along +59589|482|12|2|15|20737.20|0.08|0.07|A|F|1992-06-07|1992-07-01|1992-06-16|COLLECT COD|MAIL|ake furiously. sheaves nag carefully qui +59590|779|44|1|32|53752.64|0.02|0.03|A|F|1993-05-06|1993-04-12|1993-05-12|TAKE BACK RETURN|REG AIR|es haggle fu +59590|1981|14|2|15|28244.70|0.09|0.05|A|F|1993-06-17|1993-05-12|1993-07-07|NONE|TRUCK|the express fox +59590|215|97|3|42|46838.82|0.05|0.03|R|F|1993-04-20|1993-04-20|1993-04-29|COLLECT COD|RAIL| packages. regular pinto beans wake blithel +59590|1295|7|4|25|29907.25|0.03|0.03|R|F|1993-03-28|1993-05-12|1993-04-04|DELIVER IN PERSON|REG AIR|the silently ironic deposits. even, fin +59590|666|67|5|33|51699.78|0.06|0.06|A|F|1993-04-15|1993-04-13|1993-05-14|COLLECT COD|SHIP|uctions haggle alongside of the unusual +59590|1339|16|6|28|34729.24|0.02|0.02|A|F|1993-05-27|1993-04-19|1993-06-08|NONE|AIR|e foxes; closely final excuses grow +59590|1517|38|7|14|19859.14|0.06|0.04|A|F|1993-03-22|1993-04-09|1993-04-15|COLLECT COD|FOB|tegrate. daringly bold deposi +59591|1196|5|1|49|53762.31|0.00|0.06|R|F|1994-12-15|1994-12-23|1994-12-24|TAKE BACK RETURN|AIR|uests sleep furiously. qui +59591|1877|7|2|18|32019.66|0.01|0.07|A|F|1994-12-13|1994-11-27|1995-01-04|TAKE BACK RETURN|REG AIR|unts print alo +59616|1115|24|1|49|49789.39|0.09|0.00|N|O|1997-06-04|1997-07-17|1997-07-01|NONE|MAIL|above the carefully fi +59616|1283|84|2|19|22501.32|0.06|0.00|N|O|1997-05-21|1997-07-03|1997-06-11|TAKE BACK RETURN|FOB|dencies. slyly final depths boost ideas. +59616|64|90|3|11|10604.66|0.02|0.01|N|O|1997-06-13|1997-07-01|1997-07-06|DELIVER IN PERSON|AIR|bold theodolites. quickly +59617|1764|65|1|14|23320.64|0.06|0.08|R|F|1993-05-26|1993-06-28|1993-06-09|COLLECT COD|FOB|lyly even packages are +59617|1530|31|2|14|20041.42|0.08|0.00|A|F|1993-08-08|1993-06-21|1993-08-18|COLLECT COD|TRUCK|al theodolites. ironic, even +59617|1646|29|3|30|46429.20|0.03|0.05|A|F|1993-08-25|1993-07-31|1993-09-17|COLLECT COD|REG AIR|ackages: even r +59617|1501|22|4|42|58905.00|0.03|0.00|R|F|1993-08-21|1993-07-02|1993-09-10|DELIVER IN PERSON|TRUCK|ing instruct +59617|1417|57|5|22|29005.02|0.07|0.01|A|F|1993-08-27|1993-07-11|1993-09-03|TAKE BACK RETURN|SHIP|thely alongside of the f +59618|494|82|1|2|2788.98|0.04|0.06|N|O|1997-02-21|1997-02-16|1997-02-23|COLLECT COD|SHIP|ial packages along the furiousl +59618|42|43|2|38|35797.52|0.00|0.08|N|O|1997-02-21|1997-03-22|1997-03-21|TAKE BACK RETURN|FOB|ing to the carefully regular r +59618|824|58|3|33|56919.06|0.00|0.01|N|O|1997-04-09|1997-03-14|1997-05-02|DELIVER IN PERSON|MAIL|uffily fluffily bold foxes. blithely ironi +59618|33|59|4|34|31723.02|0.10|0.04|N|O|1997-01-09|1997-02-22|1997-01-26|TAKE BACK RETURN|RAIL|uctions sleep along the fluffily i +59618|786|51|5|40|67471.20|0.07|0.01|N|O|1997-03-12|1997-03-11|1997-03-26|COLLECT COD|REG AIR|. ironic, ir +59618|1794|79|6|2|3391.58|0.06|0.08|N|O|1997-03-07|1997-02-14|1997-04-06|TAKE BACK RETURN|SHIP| sublate blithely pending reques +59618|1357|34|7|35|44042.25|0.08|0.08|N|O|1997-03-24|1997-03-27|1997-04-23|TAKE BACK RETURN|MAIL| pinto beans. carefully even id +59619|838|72|1|26|45209.58|0.08|0.05|A|F|1993-03-04|1993-03-23|1993-03-14|DELIVER IN PERSON|MAIL|old requests w +59619|1615|98|2|32|48531.52|0.07|0.01|R|F|1993-05-02|1993-04-09|1993-05-27|COLLECT COD|RAIL|y according to the silent grouche +59619|1857|58|3|45|79148.25|0.01|0.03|R|F|1993-04-23|1993-04-07|1993-04-28|NONE|MAIL|the regular, even ideas: speci +59620|830|97|1|27|46732.41|0.09|0.05|N|O|1998-07-01|1998-06-04|1998-07-17|TAKE BACK RETURN|TRUCK|out the quickly final inst +59620|457|45|2|19|25791.55|0.10|0.02|N|O|1998-08-18|1998-06-17|1998-08-20|DELIVER IN PERSON|REG AIR|y about the fluffily i +59620|329|58|3|25|30733.00|0.09|0.01|N|O|1998-05-27|1998-07-08|1998-06-17|COLLECT COD|SHIP|ily against the +59620|862|62|4|43|75802.98|0.04|0.07|N|O|1998-07-05|1998-07-25|1998-07-27|DELIVER IN PERSON|FOB|nic deposits. silent, unusual excuses +59620|36|37|5|5|4680.15|0.07|0.04|N|O|1998-06-06|1998-07-12|1998-06-26|TAKE BACK RETURN|FOB|ar instruc +59620|26|77|6|25|23150.50|0.01|0.04|N|O|1998-05-12|1998-06-19|1998-06-11|COLLECT COD|MAIL|y blithely ironic requests. slyly +59620|1731|16|7|12|19592.76|0.07|0.02|N|O|1998-05-01|1998-06-01|1998-05-09|COLLECT COD|AIR|ross the regular requests. express +59621|336|65|1|28|34617.24|0.04|0.05|N|O|1997-06-19|1997-07-01|1997-07-05|TAKE BACK RETURN|REG AIR|y slyly even accounts? unusual +59621|760|93|2|16|26572.16|0.06|0.05|N|O|1997-05-16|1997-05-31|1997-05-29|COLLECT COD|SHIP|deas. slyly ironic depo +59621|1162|99|3|20|21263.20|0.00|0.04|N|O|1997-08-09|1997-06-29|1997-08-12|TAKE BACK RETURN|SHIP|st the slyly fin +59621|788|21|4|1|1688.78|0.01|0.08|N|O|1997-06-27|1997-07-03|1997-06-28|DELIVER IN PERSON|AIR|heodolites sleep. slyly re +59621|552|13|5|39|56649.45|0.00|0.03|N|O|1997-05-22|1997-07-04|1997-06-16|NONE|SHIP|beans across the slowly pen +59621|947|16|6|10|18479.40|0.08|0.02|N|O|1997-08-21|1997-07-21|1997-08-22|COLLECT COD|SHIP|s. final, final packages x-ray accor +59622|1235|10|1|43|48857.89|0.05|0.04|N|O|1998-07-14|1998-07-13|1998-07-25|NONE|MAIL|s believe quietly furiously +59622|802|3|2|21|35758.80|0.02|0.01|N|O|1998-07-06|1998-06-08|1998-08-03|COLLECT COD|RAIL|ironic dep +59622|1620|44|3|49|74559.38|0.09|0.02|N|O|1998-06-04|1998-07-07|1998-06-13|TAKE BACK RETURN|TRUCK|iously pending deposits affix pin +59622|887|88|4|42|75090.96|0.09|0.05|N|O|1998-08-26|1998-06-21|1998-08-28|DELIVER IN PERSON|TRUCK|heodolites integrate fluffily. furiously sp +59622|960|29|5|48|89326.08|0.10|0.08|N|O|1998-05-17|1998-07-05|1998-05-21|COLLECT COD|MAIL|s haggle slyly special instructions. +59622|1580|81|6|13|19260.54|0.04|0.03|N|O|1998-06-19|1998-06-20|1998-06-26|DELIVER IN PERSON|REG AIR|l excuses among the r +59623|1223|35|1|14|15739.08|0.10|0.00|N|O|1997-06-02|1997-03-14|1997-06-26|DELIVER IN PERSON|RAIL|hely ironic escapades according to t +59623|291|19|2|29|34547.41|0.06|0.05|N|O|1997-05-16|1997-04-18|1997-06-02|DELIVER IN PERSON|REG AIR|y bold warthogs. ironic, regular instru +59623|968|37|3|20|37379.20|0.06|0.00|N|O|1997-02-18|1997-03-25|1997-03-08|TAKE BACK RETURN|RAIL| the blithely even instr +59623|185|38|4|27|29299.86|0.09|0.04|N|O|1997-05-31|1997-04-29|1997-06-23|TAKE BACK RETURN|TRUCK|ep furiously instruc +59623|50|1|5|44|41802.20|0.08|0.03|N|O|1997-03-13|1997-03-19|1997-03-19|NONE|SHIP|eep furiously +59623|1870|71|6|50|88593.50|0.02|0.01|N|O|1997-04-15|1997-05-07|1997-04-24|COLLECT COD|MAIL|sly ironic asymptotes can wake slyly acros +59623|1927|28|7|36|65841.12|0.05|0.04|N|O|1997-04-08|1997-04-23|1997-04-09|NONE|FOB|efully. fluffily silent instruc +59648|195|22|1|36|39426.84|0.01|0.08|N|O|1997-12-10|1997-10-02|1997-12-31|TAKE BACK RETURN|MAIL|riously special excuses wake car +59648|1920|53|2|47|85630.24|0.01|0.08|N|O|1997-10-06|1997-09-10|1997-10-31|TAKE BACK RETURN|FOB|about the carefully express accou +59648|1061|67|3|22|21165.32|0.02|0.05|N|O|1997-08-22|1997-09-23|1997-09-06|COLLECT COD|REG AIR|r deposits alongside of the bli +59649|940|9|1|43|79160.42|0.07|0.03|N|O|1997-07-26|1997-10-08|1997-08-07|DELIVER IN PERSON|RAIL|iously express theodolites-- even dolp +59649|982|17|2|31|58372.38|0.03|0.05|N|O|1997-07-23|1997-09-07|1997-08-20|NONE|MAIL|hins nag fluffily. a +59649|1120|57|3|13|13274.56|0.01|0.07|N|O|1997-10-26|1997-09-21|1997-11-23|NONE|SHIP|dependencies sol +59649|988|23|4|21|39668.58|0.06|0.02|N|O|1997-10-25|1997-08-23|1997-10-31|DELIVER IN PERSON|MAIL| final packages. quickly silent deposits th +59649|1387|64|5|34|43804.92|0.05|0.06|N|O|1997-08-10|1997-09-02|1997-08-14|NONE|RAIL|le across th +59649|476|77|6|1|1376.47|0.03|0.01|N|O|1997-08-19|1997-08-21|1997-09-08|NONE|TRUCK|ckly deposit +59649|479|9|7|30|41384.10|0.03|0.01|N|O|1997-11-10|1997-10-05|1997-11-17|TAKE BACK RETURN|FOB|pending accou +59650|679|80|1|12|18956.04|0.00|0.01|A|F|1993-04-25|1993-02-03|1993-05-09|COLLECT COD|TRUCK|riously. ironic foxes cajole +59650|956|91|2|7|12998.65|0.03|0.00|A|F|1993-03-04|1993-02-06|1993-04-02|DELIVER IN PERSON|AIR|y according to the pending foxe +59650|893|60|3|9|16145.01|0.09|0.05|A|F|1993-04-04|1993-02-13|1993-04-17|NONE|AIR|ieve slyly according to +59651|705|2|1|49|78679.30|0.08|0.01|R|F|1993-06-05|1993-07-10|1993-06-26|COLLECT COD|REG AIR|accounts believe blithel +59651|1877|21|2|42|74712.54|0.01|0.01|R|F|1993-09-02|1993-07-15|1993-09-16|NONE|MAIL|s. bold, furious idea +59651|1765|8|3|2|3333.52|0.08|0.02|R|F|1993-09-10|1993-07-03|1993-09-14|TAKE BACK RETURN|SHIP|telets during the ironic theodo +59651|1799|84|4|8|13606.32|0.09|0.06|A|F|1993-06-18|1993-07-10|1993-07-09|TAKE BACK RETURN|RAIL|fully pending ideas cajole slyly b +59652|518|79|1|46|65251.46|0.00|0.06|R|F|1995-03-13|1995-03-24|1995-04-05|DELIVER IN PERSON|MAIL| slyly special Tiresi +59653|248|30|1|42|48226.08|0.01|0.00|N|O|1997-05-19|1997-05-05|1997-06-04|COLLECT COD|REG AIR|o beans cajole quietly. blit +59653|1591|92|2|42|62688.78|0.00|0.01|N|O|1997-04-01|1997-05-10|1997-04-29|TAKE BACK RETURN|REG AIR| accounts are a +59653|701|2|3|21|33635.70|0.02|0.06|N|O|1997-07-19|1997-05-09|1997-08-14|TAKE BACK RETURN|FOB|ular dependencies cajole som +59653|1036|42|4|24|22488.72|0.06|0.07|N|O|1997-07-04|1997-05-01|1997-07-10|TAKE BACK RETURN|SHIP|carefully final +59653|1415|94|5|45|59238.45|0.10|0.00|N|O|1997-04-16|1997-05-29|1997-04-21|NONE|SHIP|blithely even foxes integrate careful +59653|218|19|6|12|13418.52|0.04|0.03|N|O|1997-04-12|1997-05-23|1997-04-18|DELIVER IN PERSON|FOB|. blithely regular accounts doubt. perm +59653|1437|38|7|1|1338.43|0.04|0.04|N|O|1997-05-26|1997-05-02|1997-06-24|DELIVER IN PERSON|RAIL|riously slyly ironic d +59654|295|96|1|47|56178.63|0.01|0.07|A|F|1994-03-08|1994-02-27|1994-03-13|TAKE BACK RETURN|MAIL| requests along +59654|897|31|2|5|8989.45|0.01|0.02|R|F|1994-03-03|1994-01-14|1994-04-02|COLLECT COD|REG AIR|g packages! even instructions about the in +59654|1359|98|3|26|32769.10|0.02|0.02|A|F|1994-04-02|1994-01-06|1994-04-10|TAKE BACK RETURN|RAIL|egular packages. even packages +59654|1723|66|4|49|79611.28|0.03|0.05|A|F|1994-01-07|1994-02-05|1994-01-10|COLLECT COD|FOB|to beans. +59654|716|49|5|4|6466.84|0.05|0.04|R|F|1994-01-17|1994-01-23|1994-02-03|TAKE BACK RETURN|SHIP|elieve unusual packages. reg +59654|1859|3|6|34|59868.90|0.08|0.00|A|F|1994-04-05|1994-01-13|1994-04-26|NONE|FOB|. ironic, pending plate +59655|1062|63|1|44|42374.64|0.10|0.07|A|F|1994-01-27|1993-11-27|1994-02-19|TAKE BACK RETURN|AIR|ual excuses. final a +59655|1549|30|2|2|2901.08|0.00|0.00|A|F|1994-01-26|1993-12-04|1994-02-03|TAKE BACK RETURN|REG AIR|deas detect slyly bol +59655|1472|51|3|36|49444.92|0.00|0.01|A|F|1993-11-11|1993-12-08|1993-11-20|TAKE BACK RETURN|RAIL|r instructions use +59680|984|19|1|48|90479.04|0.10|0.01|A|F|1992-07-27|1992-08-31|1992-08-22|TAKE BACK RETURN|REG AIR| quickly. slyly express requests sleep +59680|588|89|2|48|71451.84|0.10|0.00|A|F|1992-08-24|1992-09-15|1992-09-03|NONE|FOB|bout the requests. slyly blithe dep +59680|446|5|3|19|25582.36|0.05|0.06|A|F|1992-07-30|1992-08-01|1992-08-05|COLLECT COD|RAIL|. quickly special +59681|1056|27|1|31|29668.55|0.05|0.05|A|F|1994-07-23|1994-08-01|1994-08-01|TAKE BACK RETURN|REG AIR|ages boost furio +59681|1544|85|2|41|59267.14|0.02|0.07|R|F|1994-09-23|1994-08-12|1994-10-08|TAKE BACK RETURN|AIR|cording to the fina +59681|737|2|3|16|26203.68|0.09|0.05|R|F|1994-10-03|1994-08-06|1994-11-01|DELIVER IN PERSON|REG AIR|ss requests wa +59681|1743|86|4|50|82237.00|0.10|0.05|A|F|1994-07-28|1994-07-29|1994-08-12|DELIVER IN PERSON|FOB|lly ruthless theodolites. quickly regula +59681|1136|9|5|38|39410.94|0.03|0.06|A|F|1994-10-02|1994-08-12|1994-10-17|NONE|MAIL| accounts. ironically f +59681|430|89|6|28|37252.04|0.08|0.04|R|F|1994-07-19|1994-07-12|1994-07-23|NONE|SHIP|ias mold fluffily furiously even excuses +59681|1748|91|7|31|51141.94|0.07|0.00|A|F|1994-10-01|1994-08-27|1994-10-21|COLLECT COD|MAIL|s cajole carefully quietly even d +59682|1823|53|1|5|8624.10|0.07|0.00|N|O|1996-05-25|1996-05-30|1996-06-11|DELIVER IN PERSON|AIR|ickly. fluffily regular accounts maintai +59682|747|80|2|13|21420.62|0.03|0.08|N|O|1996-08-10|1996-06-21|1996-09-09|COLLECT COD|REG AIR|ckages against the express epitaphs +59683|1920|65|1|5|9109.60|0.09|0.03|A|F|1992-10-22|1992-12-19|1992-11-01|NONE|REG AIR|ly among the d +59683|779|12|2|30|50393.10|0.02|0.08|R|F|1992-11-18|1993-01-04|1992-12-15|NONE|REG AIR|cajole slyly t +59683|624|56|3|44|67083.28|0.00|0.04|R|F|1993-01-02|1992-12-19|1993-01-14|DELIVER IN PERSON|MAIL| ironic packages integrate carefull +59683|389|74|4|26|33523.88|0.10|0.03|A|F|1992-10-30|1992-11-13|1992-11-28|NONE|TRUCK|iments. dogged +59684|947|16|1|46|85005.24|0.07|0.05|R|F|1994-04-14|1994-02-24|1994-05-06|DELIVER IN PERSON|TRUCK|sly final deposits. +59684|1651|75|2|42|65211.30|0.02|0.04|A|F|1994-03-31|1994-02-19|1994-04-14|DELIVER IN PERSON|RAIL|furiously ironic deposits nag fur +59684|1255|56|3|24|27750.00|0.03|0.03|R|F|1994-03-23|1994-03-02|1994-03-30|TAKE BACK RETURN|MAIL|riously special accounts snooze furiousl +59684|737|38|4|13|21290.49|0.03|0.04|A|F|1994-04-23|1994-03-01|1994-05-12|DELIVER IN PERSON|MAIL| fluffily silent fox +59684|827|28|5|11|19006.02|0.08|0.08|A|F|1994-03-01|1994-02-21|1994-03-08|NONE|MAIL|old, silent +59684|1139|48|6|30|31203.90|0.01|0.01|A|F|1994-03-04|1994-03-13|1994-03-30|DELIVER IN PERSON|TRUCK|se furiously dolphins? quickly regular id +59684|675|7|7|40|63026.80|0.06|0.05|A|F|1994-04-18|1994-02-25|1994-05-16|NONE|MAIL|express pinto beans. even pa +59685|386|43|1|44|56600.72|0.07|0.00|R|F|1993-03-23|1993-02-06|1993-03-30|NONE|TRUCK|atelets. furiously sly dep +59685|1399|100|2|6|7802.34|0.03|0.01|A|F|1993-02-27|1993-02-14|1993-03-19|NONE|AIR|nal, final pinto beans. +59685|1083|19|3|36|35426.88|0.05|0.08|A|F|1993-03-10|1993-01-25|1993-04-04|DELIVER IN PERSON|REG AIR| slyly final accounts. express courts +59686|1555|36|1|5|7282.75|0.06|0.02|R|F|1995-03-28|1995-06-01|1995-04-18|DELIVER IN PERSON|FOB| slyly ironic a +59686|1255|93|2|6|6937.50|0.03|0.04|A|F|1995-04-29|1995-05-13|1995-05-28|TAKE BACK RETURN|SHIP|deposits haggle. final, silent t +59687|460|61|1|21|28569.66|0.03|0.01|N|O|1998-07-09|1998-06-19|1998-08-02|DELIVER IN PERSON|TRUCK|ecial, ironic deposits. ironic requests +59687|39|90|2|41|38500.23|0.08|0.05|N|O|1998-04-28|1998-06-24|1998-05-06|TAKE BACK RETURN|REG AIR| slyly regular instructions. carefully eve +59687|1171|80|3|23|24659.91|0.09|0.02|N|O|1998-07-08|1998-06-17|1998-07-16|TAKE BACK RETURN|RAIL|ully final instr +59687|1424|42|4|13|17230.46|0.03|0.04|N|O|1998-08-06|1998-06-20|1998-08-16|COLLECT COD|MAIL|requests wake b +59687|294|49|5|24|28662.96|0.03|0.07|N|O|1998-07-02|1998-07-07|1998-07-06|DELIVER IN PERSON|SHIP|ns nag stealthily bold requ +59687|1837|24|6|23|39993.09|0.03|0.03|N|O|1998-06-11|1998-05-31|1998-06-23|TAKE BACK RETURN|TRUCK|ow accounts are. sl +59712|379|64|1|26|33263.62|0.03|0.00|R|F|1993-08-31|1993-09-05|1993-09-24|DELIVER IN PERSON|TRUCK|xpress theod +59713|1780|65|1|34|57180.52|0.01|0.03|R|F|1993-06-03|1993-06-23|1993-06-11|NONE|TRUCK|ly final theodolites. regular Tiresias are +59713|1718|3|2|8|12957.68|0.01|0.02|A|F|1993-06-09|1993-07-03|1993-07-02|NONE|REG AIR|ithely silent accounts. slyly e +59713|288|70|3|30|35648.40|0.10|0.01|R|F|1993-08-31|1993-06-27|1993-09-03|DELIVER IN PERSON|SHIP|heodolites sleep ironic +59713|153|80|4|49|51604.35|0.01|0.01|R|F|1993-05-10|1993-06-18|1993-05-11|DELIVER IN PERSON|TRUCK| slyly ironic ideas wake before t +59713|1549|30|5|36|52219.44|0.09|0.05|R|F|1993-06-19|1993-06-25|1993-06-24|NONE|TRUCK| packages lose sly +59713|223|78|6|14|15725.08|0.00|0.08|A|F|1993-06-18|1993-07-21|1993-06-25|TAKE BACK RETURN|MAIL|iously special pinto beans +59714|1391|6|1|47|60742.33|0.08|0.08|R|F|1994-02-28|1994-02-06|1994-03-14|TAKE BACK RETURN|FOB|slyly after the ironic dolphins. +59714|1637|20|2|11|16924.93|0.03|0.01|A|F|1994-03-19|1994-02-05|1994-04-13|DELIVER IN PERSON|RAIL| carefully unusual accounts. furiously reg +59714|1187|96|3|43|46791.74|0.09|0.08|R|F|1994-02-16|1994-03-02|1994-02-28|NONE|SHIP|ronic instructions. +59714|959|62|4|41|76257.95|0.04|0.01|R|F|1994-01-13|1994-01-21|1994-01-14|COLLECT COD|SHIP|lets shall wake blithely ironic +59714|107|34|5|2|2014.20|0.02|0.01|R|F|1994-01-05|1994-02-23|1994-01-20|NONE|RAIL| final, furious fo +59714|343|72|6|22|27353.48|0.10|0.07|R|F|1993-12-21|1994-03-07|1993-12-23|DELIVER IN PERSON|REG AIR|carefully about the blithely final deposit +59715|1987|88|1|29|54780.42|0.07|0.00|N|O|1998-04-24|1998-06-23|1998-04-27|NONE|MAIL|sits haggle carefully; quickly ironic pack +59715|1728|55|2|47|76596.84|0.09|0.00|N|O|1998-07-08|1998-05-28|1998-07-12|COLLECT COD|TRUCK|g, ironic accounts +59715|85|86|3|40|39403.20|0.04|0.06|N|O|1998-04-22|1998-05-07|1998-05-04|DELIVER IN PERSON|REG AIR|ly. ironic, express dugouts along the +59715|1167|76|4|39|41658.24|0.09|0.02|N|O|1998-06-12|1998-06-15|1998-07-06|TAKE BACK RETURN|TRUCK|dolites are. carefully special platelet +59716|874|8|1|44|78094.28|0.02|0.04|N|O|1996-05-04|1996-05-02|1996-05-23|NONE|MAIL|es. slyly even requests +59716|852|53|2|23|40315.55|0.03|0.04|N|O|1996-05-16|1996-05-03|1996-06-15|NONE|RAIL|eful theodolites: ironic, sp +59716|34|85|3|19|17746.57|0.04|0.06|N|O|1996-05-12|1996-03-06|1996-05-27|NONE|REG AIR|en dolphins: furiously regular +59717|970|5|1|15|28064.55|0.08|0.07|N|O|1996-01-04|1996-02-07|1996-01-31|COLLECT COD|REG AIR|ies believe never doggedly regular p +59717|593|94|2|24|35846.16|0.04|0.01|N|O|1996-03-24|1996-02-23|1996-03-26|NONE|RAIL|inal sheaves sleep blithely. requests aroun +59717|1891|21|3|33|59165.37|0.03|0.04|N|O|1996-02-04|1996-01-21|1996-02-08|DELIVER IN PERSON|RAIL|ect carefully about t +59718|501|92|1|43|60264.50|0.04|0.01|R|F|1992-04-02|1992-03-26|1992-04-29|COLLECT COD|AIR| the fluffily regular packag +59718|50|76|2|23|21851.15|0.09|0.05|A|F|1992-01-27|1992-02-12|1992-02-05|NONE|AIR|ously ironic deposits. blith +59719|530|91|1|23|32902.19|0.07|0.05|N|O|1995-11-30|1996-02-25|1995-12-17|DELIVER IN PERSON|TRUCK|equests sleep blithely along +59719|995|96|2|13|24647.87|0.10|0.08|N|O|1996-01-08|1996-02-15|1996-01-29|COLLECT COD|MAIL|bold orbits. quickly final p +59719|10|86|3|18|16380.18|0.00|0.02|N|O|1996-01-25|1996-01-23|1996-02-11|NONE|TRUCK|of the slyly final epitaphs hagg +59744|986|21|1|15|28304.70|0.00|0.02|R|F|1995-02-15|1994-12-06|1995-03-10|DELIVER IN PERSON|REG AIR|oost furiously: carefully slow requests alo +59744|1348|63|2|3|3748.02|0.10|0.05|A|F|1995-02-06|1994-12-07|1995-02-17|NONE|MAIL|fluffily silent notor +59744|781|14|3|12|20181.36|0.08|0.02|A|F|1994-11-01|1995-01-21|1994-11-02|DELIVER IN PERSON|TRUCK|uriously regular foxes wake blithel +59744|595|26|4|21|31407.39|0.09|0.00|A|F|1995-01-05|1995-01-23|1995-01-25|DELIVER IN PERSON|RAIL|lyly special acc +59744|1525|26|5|26|37089.52|0.10|0.08|A|F|1995-01-14|1994-11-30|1995-01-27|COLLECT COD|AIR|foxes? bli +59745|1146|47|1|6|6282.84|0.07|0.04|R|F|1994-07-27|1994-07-09|1994-07-28|TAKE BACK RETURN|MAIL|hely ironic in +59745|1557|58|2|33|48132.15|0.06|0.06|A|F|1994-06-23|1994-06-23|1994-07-14|COLLECT COD|REG AIR|ly about the blithely bold deposit +59746|525|26|1|50|71276.00|0.00|0.04|N|O|1997-01-23|1996-11-23|1997-01-29|DELIVER IN PERSON|REG AIR|oxes cajole enticin +59747|425|84|1|39|51691.38|0.04|0.06|N|O|1996-03-23|1996-03-24|1996-04-11|DELIVER IN PERSON|REG AIR|ounts hang slyly. furiously eve +59747|30|81|2|50|46501.50|0.07|0.00|N|O|1996-01-26|1996-02-12|1996-01-31|DELIVER IN PERSON|SHIP|iously ironic theodolites. ironic re +59747|506|67|3|9|12658.50|0.04|0.00|N|O|1996-02-03|1996-02-13|1996-03-01|NONE|SHIP| express asymptotes. carefully p +59747|1049|85|4|23|21850.92|0.07|0.03|N|O|1996-01-12|1996-04-03|1996-01-23|TAKE BACK RETURN|RAIL|ages are care +59747|388|89|5|23|29632.74|0.03|0.00|N|O|1996-01-19|1996-02-27|1996-02-12|DELIVER IN PERSON|MAIL|ently silent gifts. carefully close f +59748|1264|39|1|14|16313.64|0.04|0.03|N|O|1997-11-16|1997-09-30|1997-12-09|DELIVER IN PERSON|RAIL|ss packages haggle fluffily after the +59748|1219|57|2|12|13442.52|0.00|0.05|N|O|1997-12-20|1997-10-12|1997-12-21|COLLECT COD|REG AIR|ithely ironic excuses cajole along +59748|1915|60|3|8|14535.28|0.10|0.06|N|O|1997-10-09|1997-10-10|1997-10-12|DELIVER IN PERSON|FOB|kages wake slyly furiously regul +59748|1675|17|4|10|15766.70|0.06|0.05|N|O|1997-09-14|1997-11-16|1997-10-05|NONE|TRUCK|courts. deposits might are furio +59748|465|24|5|8|10923.68|0.03|0.00|N|O|1997-11-14|1997-09-30|1997-11-18|DELIVER IN PERSON|FOB|iously regular packages impre +59749|238|93|1|45|51220.35|0.03|0.02|N|O|1998-05-05|1998-07-12|1998-05-07|COLLECT COD|AIR|carefully +59749|759|56|2|44|73029.00|0.07|0.08|N|O|1998-08-24|1998-06-27|1998-08-27|COLLECT COD|FOB|es. carefully unusual requests haggle sl +59749|1874|61|3|24|42620.88|0.06|0.05|N|O|1998-05-08|1998-06-22|1998-05-21|DELIVER IN PERSON|REG AIR|, bold accounts wa +59749|1823|10|4|37|63818.34|0.05|0.00|N|O|1998-05-23|1998-06-10|1998-06-09|NONE|REG AIR| silently ironic packages according to t +59750|1967|56|1|41|76627.36|0.05|0.05|A|F|1993-08-12|1993-08-16|1993-09-08|DELIVER IN PERSON|RAIL|nal excuses. furiously fin +59750|1897|27|2|6|10793.34|0.04|0.00|R|F|1993-07-29|1993-09-18|1993-08-02|NONE|AIR|uthlessly even ideas. carefully final +59750|258|86|3|37|42855.25|0.08|0.04|R|F|1993-10-09|1993-08-22|1993-11-01|DELIVER IN PERSON|RAIL|ructions cajole alongside of the blithely +59750|227|9|4|31|34943.82|0.04|0.04|A|F|1993-08-22|1993-09-09|1993-09-21|DELIVER IN PERSON|RAIL|grate carefully above the instructions +59750|1342|19|5|44|54706.96|0.03|0.01|R|F|1993-08-26|1993-08-12|1993-09-18|TAKE BACK RETURN|MAIL|ily against the silent theodolite +59750|407|8|6|11|14381.40|0.05|0.02|R|F|1993-07-20|1993-08-17|1993-07-21|DELIVER IN PERSON|TRUCK| ideas use carefull +59750|1368|7|7|10|12693.60|0.01|0.06|R|F|1993-09-28|1993-08-13|1993-10-23|COLLECT COD|REG AIR|ey players along th +59751|1715|58|1|19|30717.49|0.02|0.08|N|O|1998-02-11|1998-03-15|1998-03-11|TAKE BACK RETURN|SHIP|furiously regular pains. even +59751|226|8|2|35|39417.70|0.02|0.05|N|O|1998-04-27|1998-04-11|1998-05-07|NONE|RAIL| theodolites sleep. carefully ironic cou +59751|520|11|3|5|7102.60|0.01|0.07|N|O|1998-03-25|1998-03-30|1998-04-04|COLLECT COD|SHIP|ructions according to the dependencies wak +59751|1333|34|4|24|29623.92|0.07|0.07|N|O|1998-04-18|1998-04-14|1998-04-30|NONE|TRUCK| wake along the regular patt +59751|466|96|5|19|25962.74|0.08|0.03|N|O|1998-04-28|1998-03-23|1998-05-06|TAKE BACK RETURN|RAIL|ests cajole ruthless instructions. +59751|1586|67|6|45|66941.10|0.05|0.07|N|O|1998-03-09|1998-02-19|1998-03-27|DELIVER IN PERSON|REG AIR|gular deposits. b +59776|953|54|1|23|42640.85|0.09|0.07|R|F|1994-07-01|1994-05-02|1994-07-21|DELIVER IN PERSON|RAIL|the furiously final accounts. +59776|1749|76|2|36|59426.64|0.04|0.04|R|F|1994-05-03|1994-04-26|1994-05-13|NONE|AIR|ual gifts. blithely regular dependen +59776|1555|56|3|22|32044.10|0.09|0.07|A|F|1994-05-23|1994-04-25|1994-06-17|NONE|FOB| slyly ironic theodolites. furiously even +59776|31|57|4|39|36310.17|0.01|0.02|A|F|1994-06-10|1994-05-26|1994-06-18|TAKE BACK RETURN|REG AIR|ss the carefully unusual pea +59776|548|39|5|10|14485.40|0.02|0.03|R|F|1994-04-13|1994-04-12|1994-04-20|DELIVER IN PERSON|TRUCK|dolites solve q +59776|1527|68|6|42|59997.84|0.03|0.02|R|F|1994-04-11|1994-05-12|1994-04-22|NONE|MAIL|ole fluffily silent +59777|997|100|1|2|3795.98|0.02|0.05|R|F|1994-02-19|1994-02-20|1994-03-20|NONE|AIR|refully unusua +59777|752|17|2|6|9916.50|0.05|0.07|A|F|1994-02-24|1994-02-25|1994-03-05|NONE|RAIL|azzle? slyly +59777|1033|39|3|13|12142.39|0.05|0.00|R|F|1994-02-21|1994-03-04|1994-03-21|DELIVER IN PERSON|MAIL|counts. foxes cajole blithely. sl +59777|380|9|4|49|62738.62|0.08|0.08|A|F|1994-02-23|1994-02-24|1994-03-12|TAKE BACK RETURN|AIR|enly thin theodolites integrate bl +59778|1511|12|1|2|2825.02|0.01|0.01|N|O|1997-09-10|1997-09-08|1997-10-09|COLLECT COD|AIR|instructions n +59778|772|73|2|38|63565.26|0.05|0.01|N|O|1997-09-18|1997-08-12|1997-10-05|TAKE BACK RETURN|MAIL| requests. sometimes pen +59778|584|45|3|36|53444.88|0.02|0.07|N|O|1997-07-25|1997-07-14|1997-08-13|DELIVER IN PERSON|RAIL|refully regular accounts boos +59779|194|73|1|39|42673.41|0.09|0.05|A|F|1994-08-10|1994-06-21|1994-08-17|COLLECT COD|MAIL|yly unusual asymptotes +59779|1614|56|2|31|46983.91|0.03|0.07|A|F|1994-06-05|1994-06-17|1994-07-05|COLLECT COD|FOB|ajole according to the car +59779|234|35|3|37|41966.51|0.00|0.08|R|F|1994-07-01|1994-07-31|1994-07-12|NONE|AIR|odolites are blithely throughout the +59779|1229|4|4|13|14692.86|0.00|0.08|A|F|1994-07-08|1994-07-25|1994-08-01|DELIVER IN PERSON|TRUCK|ironic accounts. +59779|1539|20|5|29|41775.37|0.06|0.02|R|F|1994-06-17|1994-07-12|1994-07-16|COLLECT COD|SHIP|g blithely regular requests; express acco +59779|1296|97|6|26|31129.54|0.03|0.05|R|F|1994-07-06|1994-08-14|1994-07-18|TAKE BACK RETURN|FOB|final ideas. bold, ironic +59779|1304|5|7|45|54238.50|0.09|0.00|R|F|1994-08-04|1994-07-29|1994-08-30|TAKE BACK RETURN|RAIL|eposits wake according to the +59780|1298|73|1|40|47971.60|0.09|0.07|A|F|1993-05-30|1993-04-01|1993-06-21|TAKE BACK RETURN|AIR|oss the blithely even r +59780|1176|13|2|39|42009.63|0.09|0.00|A|F|1993-05-17|1993-04-08|1993-06-03|NONE|REG AIR|s cajole slyly fluffily ironic reque +59780|1783|68|3|37|62336.86|0.06|0.08|A|F|1993-04-01|1993-05-22|1993-04-23|DELIVER IN PERSON|RAIL|l accounts. slyly regular c +59781|1859|60|1|29|51064.65|0.07|0.00|A|F|1993-01-09|1993-02-06|1993-01-28|NONE|SHIP|haggle quick +59781|440|70|2|9|12063.96|0.01|0.03|R|F|1992-12-20|1993-03-05|1993-01-02|COLLECT COD|TRUCK|ccounts about the quie +59781|777|74|3|31|52010.87|0.09|0.01|A|F|1993-03-31|1993-02-03|1993-04-07|TAKE BACK RETURN|REG AIR|ckages. slyly final id +59781|1843|73|4|6|10469.04|0.01|0.04|A|F|1993-03-01|1993-02-23|1993-03-17|TAKE BACK RETURN|FOB|ticing deposits. +59781|1936|25|5|6|11027.58|0.05|0.04|R|F|1993-02-23|1993-01-13|1993-03-23|DELIVER IN PERSON|AIR|inst the regular pains. fu +59781|773|6|6|13|21759.01|0.08|0.04|A|F|1993-02-14|1993-02-08|1993-02-19|TAKE BACK RETURN|SHIP|ieve furiously. accounts about the bold rea +59781|95|21|7|36|35823.24|0.03|0.06|A|F|1992-12-16|1993-03-11|1993-01-15|COLLECT COD|MAIL|. blithely unusual theodolites a +59782|892|59|1|16|28686.24|0.03|0.06|N|O|1996-11-24|1996-10-14|1996-11-27|TAKE BACK RETURN|REG AIR|accounts alo +59782|807|41|2|25|42695.00|0.05|0.01|N|O|1996-11-22|1996-10-03|1996-11-25|COLLECT COD|FOB|inal pains detect carefully against +59782|1613|96|3|1|1514.61|0.02|0.06|N|O|1996-09-26|1996-09-16|1996-10-17|COLLECT COD|TRUCK|cajole quickly bold depths; slyly unusu +59782|144|71|4|9|9397.26|0.09|0.08|N|O|1996-11-28|1996-10-16|1996-12-04|COLLECT COD|REG AIR|ts cajole furiously after the +59782|1166|75|5|46|49089.36|0.09|0.05|N|O|1996-11-11|1996-10-01|1996-11-26|NONE|SHIP|should haggle f +59783|764|65|1|13|21641.88|0.05|0.02|R|F|1993-10-12|1993-10-27|1993-10-16|NONE|SHIP|al packages wake ironic, specia +59783|1911|56|2|22|39884.02|0.10|0.03|R|F|1993-10-11|1993-09-28|1993-10-17|TAKE BACK RETURN|SHIP|y express request +59783|174|53|3|30|32225.10|0.04|0.04|A|F|1993-09-03|1993-09-21|1993-09-14|COLLECT COD|SHIP|y across the furiously regular orbits. care +59808|1496|97|1|34|47514.66|0.07|0.03|N|O|1995-10-24|1995-09-26|1995-11-14|NONE|AIR|ully regular +59809|1755|82|1|23|38105.25|0.04|0.01|A|F|1995-05-17|1995-04-22|1995-05-26|DELIVER IN PERSON|RAIL|pending, final grouc +59809|1129|2|2|5|5150.60|0.10|0.08|N|O|1995-06-26|1995-04-10|1995-07-07|TAKE BACK RETURN|REG AIR|equests wake carefully furiously bold accou +59809|1857|1|3|41|72112.85|0.03|0.02|N|O|1995-07-05|1995-05-28|1995-07-21|DELIVER IN PERSON|RAIL|ess foxes use instructio +59810|221|3|1|49|54939.78|0.02|0.02|N|O|1998-09-04|1998-08-24|1998-10-04|NONE|SHIP|ly even pinto beans wak +59810|283|65|2|18|21299.04|0.01|0.02|N|O|1998-09-27|1998-09-06|1998-10-17|DELIVER IN PERSON|FOB|tes along the unusual a +59811|728|25|1|4|6514.88|0.10|0.05|N|O|1998-01-25|1998-03-20|1998-02-01|NONE|RAIL|to the iron +59811|1209|47|2|29|32195.80|0.03|0.01|N|O|1998-04-22|1998-02-23|1998-05-12|DELIVER IN PERSON|FOB| deposits are quickly slyly pending th +59811|1642|66|3|26|40134.64|0.05|0.01|N|O|1998-05-07|1998-03-20|1998-05-16|COLLECT COD|FOB|multipliers. decoys +59811|1654|96|4|28|43558.20|0.08|0.07|N|O|1998-03-29|1998-03-12|1998-04-17|DELIVER IN PERSON|AIR|ct alongside of th +59812|631|25|1|11|16847.93|0.01|0.01|N|O|1995-06-24|1995-07-28|1995-07-04|DELIVER IN PERSON|SHIP|s sleep blithely. quickly spe +59812|135|62|2|30|31053.90|0.09|0.08|N|O|1995-09-24|1995-08-21|1995-10-16|NONE|REG AIR|s haggle carefully above the fluffily eve +59812|728|93|3|7|11401.04|0.02|0.05|N|O|1995-09-16|1995-08-09|1995-09-30|DELIVER IN PERSON|FOB|thrash instead +59812|1988|33|4|19|35909.62|0.09|0.00|N|O|1995-10-18|1995-09-15|1995-10-27|COLLECT COD|TRUCK|use sometimes. regular, +59812|847|81|5|16|27965.44|0.08|0.08|N|O|1995-09-10|1995-08-30|1995-10-05|DELIVER IN PERSON|AIR|quickly bold, bold requests. reg +59813|427|86|1|33|43804.86|0.06|0.06|N|O|1996-07-26|1996-09-27|1996-08-03|TAKE BACK RETURN|AIR|t deposits affix above the pinto beans. bl +59813|1678|61|2|35|55288.45|0.05|0.06|N|O|1996-07-20|1996-09-11|1996-08-01|TAKE BACK RETURN|SHIP|ly pending +59813|408|9|3|41|53644.40|0.06|0.03|N|O|1996-10-08|1996-08-27|1996-11-07|COLLECT COD|FOB| blithely regular hockey pla +59813|1913|2|4|28|50817.48|0.04|0.00|N|O|1996-08-18|1996-09-04|1996-08-22|COLLECT COD|TRUCK| accounts haggle +59813|817|17|5|37|63558.97|0.10|0.08|N|O|1996-10-17|1996-10-04|1996-11-03|TAKE BACK RETURN|MAIL|gle furiously blithely sil +59813|1306|21|6|40|48292.00|0.09|0.07|N|O|1996-10-18|1996-08-19|1996-10-19|NONE|RAIL|ing to the furiously thi +59814|874|41|1|27|47921.49|0.05|0.05|R|F|1994-11-16|1994-12-26|1994-12-02|COLLECT COD|AIR|r foxes cajole slyly before +59814|768|69|2|1|1668.76|0.04|0.00|A|F|1994-11-17|1994-12-07|1994-11-21|COLLECT COD|MAIL|ions besides the furiously silent idea +59814|63|64|3|10|9630.60|0.06|0.02|R|F|1994-12-29|1994-10-31|1995-01-02|COLLECT COD|MAIL|nst the carefull +59814|120|99|4|10|10201.20|0.01|0.06|R|F|1994-12-20|1994-12-01|1994-12-31|NONE|AIR|ly express ideas +59814|393|94|5|40|51735.60|0.01|0.03|R|F|1994-12-21|1994-11-20|1995-01-04|DELIVER IN PERSON|SHIP|dolites. final, regular theo +59814|1431|32|6|10|13324.30|0.05|0.03|A|F|1994-12-27|1994-10-28|1995-01-03|NONE|TRUCK|fluffy pinto beans. dolphins are spec +59814|136|37|7|10|10361.30|0.02|0.04|A|F|1995-01-06|1994-11-12|1995-01-23|TAKE BACK RETURN|SHIP|cajole bold, stealthy r +59815|56|7|1|27|25813.35|0.00|0.07|R|F|1994-01-15|1994-03-08|1994-02-11|NONE|RAIL| express, final a +59815|822|22|2|4|6891.28|0.09|0.02|R|F|1994-01-16|1994-03-15|1994-01-27|DELIVER IN PERSON|SHIP|he furiously ironic +59815|1803|47|3|30|51144.00|0.04|0.05|A|F|1994-04-05|1994-02-05|1994-04-11|DELIVER IN PERSON|MAIL| carefully regular accounts. specia +59815|1505|26|4|40|56260.00|0.00|0.01|R|F|1994-04-04|1994-01-25|1994-04-28|NONE|MAIL|sly even pinto beans cajole dar +59815|1031|37|5|2|1864.06|0.10|0.00|R|F|1994-03-26|1994-01-17|1994-04-15|DELIVER IN PERSON|TRUCK|eve carefully idle +59840|169|96|1|13|13899.08|0.09|0.00|N|O|1997-10-11|1997-09-14|1997-11-07|TAKE BACK RETURN|FOB| the slyly bold e +59840|100|76|2|19|19001.90|0.09|0.07|N|O|1997-10-12|1997-09-16|1997-10-13|DELIVER IN PERSON|RAIL|are fluffil +59840|1857|1|3|6|10553.10|0.10|0.06|N|O|1997-10-07|1997-10-01|1997-10-09|NONE|AIR|y pending braids cajole f +59840|1663|87|4|37|57892.42|0.01|0.05|N|O|1997-10-01|1997-09-06|1997-10-30|COLLECT COD|TRUCK|hy theodolite +59841|106|33|1|43|43262.30|0.04|0.07|R|F|1993-09-25|1993-07-31|1993-10-04|COLLECT COD|MAIL|ns. blithely special ideas are +59841|1196|5|2|41|44984.79|0.00|0.07|R|F|1993-06-15|1993-07-06|1993-07-09|NONE|TRUCK|s detect along the fluffily +59841|560|51|3|39|56961.84|0.00|0.06|A|F|1993-09-07|1993-07-29|1993-09-23|NONE|SHIP|ly accounts-- +59841|297|98|4|50|59864.50|0.03|0.00|A|F|1993-08-28|1993-07-08|1993-09-24|NONE|SHIP|the careful +59841|965|100|5|49|91432.04|0.04|0.06|A|F|1993-06-19|1993-07-21|1993-06-27|TAKE BACK RETURN|TRUCK|atterns. dogged, bold theodolites above t +59841|517|78|6|47|66622.97|0.05|0.05|R|F|1993-07-24|1993-08-25|1993-08-01|TAKE BACK RETURN|SHIP|ending deposits. carefully bo +59842|195|74|1|17|18618.23|0.02|0.00|R|F|1992-06-10|1992-04-30|1992-06-21|DELIVER IN PERSON|TRUCK| are. furiously ironic +59842|983|52|2|2|3767.96|0.05|0.07|A|F|1992-06-20|1992-06-09|1992-07-05|NONE|SHIP|ilent accounts. bold deposit +59842|653|16|3|43|66806.95|0.01|0.02|R|F|1992-05-26|1992-04-23|1992-06-13|COLLECT COD|AIR|deas. ideas was above the +59843|824|91|1|31|53469.42|0.02|0.04|A|F|1995-03-21|1995-03-20|1995-04-13|DELIVER IN PERSON|TRUCK|rate above the ironic +59843|1235|73|2|28|31814.44|0.10|0.04|A|F|1995-03-05|1995-05-15|1995-03-12|NONE|REG AIR| after the fluf +59843|955|56|3|19|35263.05|0.09|0.02|R|F|1995-04-23|1995-05-01|1995-04-27|DELIVER IN PERSON|RAIL|press accounts are alongs +59843|1939|28|4|47|86523.71|0.01|0.05|R|F|1995-04-04|1995-03-17|1995-04-24|TAKE BACK RETURN|MAIL|lites are care +59843|671|65|5|4|6286.68|0.07|0.04|R|F|1995-05-01|1995-04-05|1995-05-24|COLLECT COD|MAIL|ular requests boost furiously carefull +59843|975|78|6|11|20635.67|0.07|0.08|A|F|1995-05-23|1995-05-05|1995-06-15|TAKE BACK RETURN|MAIL|nding deposits after the b +59844|626|20|1|40|61064.80|0.03|0.06|A|F|1993-09-24|1993-11-05|1993-10-24|DELIVER IN PERSON|MAIL| breach slyly fluffy, +59844|1943|88|2|4|7379.76|0.06|0.01|A|F|1993-09-05|1993-10-26|1993-10-03|COLLECT COD|SHIP|he slyly regular theodolite +59844|129|8|3|37|38077.44|0.10|0.02|A|F|1993-11-16|1993-09-23|1993-12-07|DELIVER IN PERSON|RAIL|eposits detect across the never dogged +59845|1097|98|1|12|11977.08|0.09|0.07|A|F|1995-01-06|1995-03-23|1995-01-15|COLLECT COD|AIR|ly even theodolit +59845|779|44|2|41|68870.57|0.10|0.08|A|F|1995-01-25|1995-02-01|1995-02-06|TAKE BACK RETURN|MAIL|ites. blithely +59845|1626|9|3|10|15276.20|0.03|0.07|A|F|1995-03-07|1995-02-13|1995-03-21|TAKE BACK RETURN|TRUCK|ructions sleep after the accounts. fu +59845|1518|99|4|41|58199.91|0.06|0.07|R|F|1995-02-19|1995-02-03|1995-03-19|TAKE BACK RETURN|REG AIR|es. platelets cajo +59845|423|82|5|9|11910.78|0.08|0.06|A|F|1995-01-22|1995-03-08|1995-02-16|NONE|RAIL|the furiously ironic pin +59845|150|51|6|48|50407.20|0.08|0.07|A|F|1995-02-24|1995-02-17|1995-03-25|NONE|SHIP|accounts wake around the blithely un +59845|255|83|7|43|49675.75|0.04|0.02|A|F|1995-01-23|1995-03-21|1995-01-26|DELIVER IN PERSON|TRUCK|sts are ab +59846|225|80|1|47|52885.34|0.02|0.07|N|O|1995-10-11|1995-11-19|1995-11-01|NONE|TRUCK| unusual, unusual depos +59846|512|43|2|32|45200.32|0.03|0.07|N|O|1995-09-11|1995-10-04|1995-10-05|DELIVER IN PERSON|SHIP|wake fluffily according to the furi +59846|946|47|3|19|35091.86|0.00|0.08|N|O|1995-10-28|1995-11-25|1995-11-08|COLLECT COD|REG AIR|efully bold d +59847|706|71|1|44|70694.80|0.01|0.02|A|F|1994-08-14|1994-05-26|1994-08-19|NONE|FOB|the furiously pending ideas sleep blithely +59847|1851|81|2|35|61349.75|0.08|0.01|A|F|1994-07-21|1994-06-06|1994-07-25|COLLECT COD|FOB|t the slyly regular Tiresias. bu +59847|1702|3|3|47|75373.90|0.09|0.04|A|F|1994-05-09|1994-05-19|1994-05-28|NONE|AIR|thy asymptotes? slyly ironic p +59872|626|58|1|21|32059.02|0.07|0.07|N|O|1996-11-14|1996-10-13|1996-11-23|TAKE BACK RETURN|FOB| use fluffily near the exp +59873|899|33|1|47|84594.83|0.01|0.05|R|F|1994-02-24|1994-03-25|1994-03-19|NONE|MAIL|ly above the blithely even accounts. +59873|1386|63|2|9|11586.42|0.06|0.00|A|F|1994-03-07|1994-05-02|1994-04-04|COLLECT COD|REG AIR|al depths among the ironic, dog +59873|349|78|3|45|56220.30|0.06|0.05|R|F|1994-03-20|1994-03-15|1994-04-03|TAKE BACK RETURN|SHIP|lar dolphins a +59873|648|80|4|35|54202.40|0.07|0.02|A|F|1994-02-22|1994-03-27|1994-02-26|TAKE BACK RETURN|TRUCK| the finally +59873|75|51|5|38|37052.66|0.01|0.02|A|F|1994-03-19|1994-04-22|1994-04-08|DELIVER IN PERSON|TRUCK| courts. fur +59873|535|96|6|46|66034.38|0.02|0.03|A|F|1994-04-14|1994-04-02|1994-05-05|COLLECT COD|FOB|symptotes sleep furiously af +59873|192|45|7|45|49148.55|0.02|0.03|A|F|1994-02-17|1994-04-08|1994-03-11|COLLECT COD|REG AIR|s regular requests. theodolites may +59874|1072|73|1|22|21407.54|0.08|0.05|R|F|1995-03-18|1995-04-02|1995-04-08|TAKE BACK RETURN|REG AIR|accounts. furiously thin dependencies +59874|1065|71|2|36|34778.16|0.03|0.08|R|F|1995-04-05|1995-03-01|1995-04-27|TAKE BACK RETURN|REG AIR| furiously +59874|1339|54|3|26|32248.58|0.08|0.02|A|F|1995-03-15|1995-03-26|1995-04-10|TAKE BACK RETURN|FOB|osits cajole stealthily furiou +59874|627|59|4|43|65687.66|0.04|0.00|A|F|1995-05-02|1995-03-29|1995-05-15|TAKE BACK RETURN|MAIL|lar theodolit +59875|1901|90|1|33|59495.70|0.04|0.06|N|O|1997-08-12|1997-06-18|1997-08-14|DELIVER IN PERSON|REG AIR|even deposits a +59875|12|63|2|13|11856.13|0.03|0.06|N|O|1997-07-28|1997-07-20|1997-08-24|COLLECT COD|SHIP|pecial, even h +59875|1778|21|3|2|3359.54|0.03|0.02|N|O|1997-05-07|1997-07-25|1997-05-24|TAKE BACK RETURN|RAIL|to the platelets integrate care +59875|1942|75|4|23|42410.62|0.04|0.01|N|O|1997-08-27|1997-07-01|1997-09-10|COLLECT COD|TRUCK|ests. bold requests ar +59875|1908|97|5|1|1809.90|0.04|0.04|N|O|1997-07-14|1997-07-08|1997-08-12|DELIVER IN PERSON|TRUCK| theodolites detect express package +59875|1239|51|6|2|2280.46|0.07|0.04|N|O|1997-07-08|1997-07-19|1997-07-15|COLLECT COD|SHIP|nts wake daringly furiously bold +59875|1073|74|7|32|31170.24|0.10|0.04|N|O|1997-07-26|1997-07-29|1997-08-05|TAKE BACK RETURN|FOB| sleep careful +59876|1414|32|1|49|64455.09|0.07|0.07|N|O|1996-10-02|1996-08-15|1996-10-14|COLLECT COD|REG AIR|gedly. always final foxe +59876|872|73|2|9|15955.83|0.02|0.04|N|O|1996-09-17|1996-08-23|1996-09-20|DELIVER IN PERSON|TRUCK|t closely about the blithely un +59876|170|49|3|21|22473.57|0.03|0.08|N|O|1996-09-05|1996-08-10|1996-09-13|DELIVER IN PERSON|RAIL|c ideas haggl +59877|689|21|1|31|49280.08|0.09|0.01|A|F|1993-09-22|1993-07-28|1993-10-11|NONE|RAIL| excuses! final, ir +59877|1571|92|2|35|51539.95|0.05|0.04|A|F|1993-07-26|1993-08-08|1993-08-16|TAKE BACK RETURN|SHIP| of the slyly ev +59878|319|20|1|37|45114.47|0.00|0.00|A|F|1992-09-18|1992-08-10|1992-10-09|TAKE BACK RETURN|SHIP| deposits. slyly regular courts +59878|1957|46|2|44|81793.80|0.07|0.01|A|F|1992-07-28|1992-08-25|1992-08-21|TAKE BACK RETURN|RAIL|use against the accounts. s +59878|1008|14|3|15|13635.00|0.05|0.06|A|F|1992-09-08|1992-07-20|1992-10-07|COLLECT COD|REG AIR|nal pinto beans. ideas cajole about +59878|1912|57|4|43|77998.13|0.06|0.04|R|F|1992-08-10|1992-08-12|1992-08-17|NONE|RAIL|y around the final packages. packages sl +59878|139|18|5|41|42604.33|0.00|0.00|R|F|1992-06-08|1992-08-24|1992-06-21|NONE|AIR|ly carefully unu +59879|1436|76|1|4|5349.72|0.09|0.08|R|F|1994-05-11|1994-04-22|1994-06-10|COLLECT COD|RAIL|inal theodolites. regular, express depos +59879|598|59|2|36|53949.24|0.04|0.01|R|F|1994-04-27|1994-06-01|1994-05-08|COLLECT COD|AIR|al ideas us +59904|1246|84|1|19|21797.56|0.05|0.02|A|F|1992-04-13|1992-05-13|1992-04-25|COLLECT COD|RAIL|r requests; furiously even de +59904|1320|35|2|38|46410.16|0.07|0.02|R|F|1992-05-05|1992-06-13|1992-05-29|TAKE BACK RETURN|FOB|y special accounts. slyly final theodo +59905|591|92|1|37|55188.83|0.05|0.08|R|F|1992-07-11|1992-06-19|1992-07-14|DELIVER IN PERSON|AIR|lyly thin warhorses cajole careful +59905|1640|41|2|7|10791.48|0.00|0.04|A|F|1992-06-15|1992-06-05|1992-07-09|DELIVER IN PERSON|AIR|to beans lose among the blithely final +59905|243|71|3|25|28581.00|0.07|0.01|A|F|1992-04-20|1992-06-30|1992-04-30|TAKE BACK RETURN|RAIL|kly bold dinos +59905|1115|52|4|2|2032.22|0.07|0.04|A|F|1992-07-01|1992-05-24|1992-07-03|TAKE BACK RETURN|RAIL|gle quickly +59905|1898|85|5|2|3599.78|0.10|0.00|R|F|1992-05-06|1992-07-01|1992-05-26|TAKE BACK RETURN|AIR|s. dependen +59905|205|33|6|16|17683.20|0.03|0.04|R|F|1992-05-15|1992-06-10|1992-05-24|DELIVER IN PERSON|REG AIR|ests. requests snooze. regular, regular fox +59905|1193|94|7|29|31731.51|0.01|0.08|A|F|1992-04-30|1992-05-19|1992-05-13|DELIVER IN PERSON|FOB|ake slyly along the +59906|565|56|1|9|13190.04|0.08|0.05|A|F|1993-08-27|1993-08-10|1993-09-22|COLLECT COD|TRUCK|y special pinto beans. furiously ir +59906|973|8|2|1|1873.97|0.05|0.00|R|F|1993-08-16|1993-07-07|1993-09-02|COLLECT COD|REG AIR|the requests. regular asymptotes affix fur +59906|1731|32|3|10|16327.30|0.01|0.08|A|F|1993-07-16|1993-06-24|1993-08-02|COLLECT COD|MAIL| thrash carefully slyly +59906|5|81|4|29|26245.00|0.04|0.08|A|F|1993-09-09|1993-07-05|1993-09-28|NONE|FOB|lar, express ins +59906|248|30|5|11|12630.64|0.10|0.08|A|F|1993-06-30|1993-06-24|1993-07-27|DELIVER IN PERSON|AIR|ccording to the furiously +59906|616|17|6|36|54597.96|0.00|0.01|A|F|1993-08-18|1993-07-25|1993-09-16|TAKE BACK RETURN|TRUCK| even, pending accounts cajole regular req +59906|740|41|7|35|57425.90|0.09|0.05|A|F|1993-06-24|1993-07-02|1993-06-30|NONE|MAIL|ermanent foxes haggle ironically alo +59907|937|72|1|48|88220.64|0.05|0.02|N|O|1997-03-30|1997-03-11|1997-04-10|COLLECT COD|SHIP|. quick instructions detect blithely furiou +59907|1105|14|2|41|41250.10|0.02|0.08|N|O|1997-02-27|1997-03-07|1997-03-02|DELIVER IN PERSON|REG AIR|. accounts after the blithely sile +59907|1427|67|3|19|25239.98|0.07|0.06|N|O|1997-01-20|1997-02-10|1997-01-29|NONE|AIR| sleep slyly ironic pint +59907|973|74|4|43|80580.71|0.07|0.04|N|O|1997-02-08|1997-03-25|1997-02-21|COLLECT COD|FOB|ts integrate qui +59908|1181|54|1|30|32465.40|0.03|0.07|R|F|1992-12-06|1992-11-08|1992-12-26|TAKE BACK RETURN|FOB| packages sleep f +59909|1365|4|1|14|17729.04|0.10|0.01|A|F|1992-09-21|1992-10-31|1992-10-18|COLLECT COD|RAIL|dencies integrate sl +59909|1432|72|2|11|14667.73|0.06|0.08|R|F|1992-09-17|1992-09-27|1992-10-13|NONE|RAIL|kly furiously pen +59909|422|23|3|36|47607.12|0.03|0.04|R|F|1992-09-13|1992-10-14|1992-10-01|TAKE BACK RETURN|RAIL|special accounts cajole quic +59909|1775|76|4|39|65394.03|0.06|0.06|R|F|1992-11-09|1992-10-16|1992-11-23|COLLECT COD|TRUCK|unts. ideas across the theodolites are b +59909|1139|48|5|3|3120.39|0.05|0.03|A|F|1992-12-02|1992-09-27|1992-12-16|NONE|REG AIR|y regular packages boost carefully fluffil +59909|1374|13|6|16|20405.92|0.01|0.02|R|F|1992-12-04|1992-09-27|1992-12-23|DELIVER IN PERSON|MAIL|al, final theodolites. furiously ironic +59909|29|80|7|15|13935.30|0.07|0.00|R|F|1992-08-09|1992-10-14|1992-08-21|DELIVER IN PERSON|RAIL|platelets. regular, final ideas h +59910|1084|90|1|34|33492.72|0.01|0.02|N|O|1995-09-01|1995-07-21|1995-09-03|TAKE BACK RETURN|FOB|round the requests. furiously special +59911|1641|24|1|40|61705.60|0.07|0.01|N|O|1995-12-28|1996-02-19|1995-12-29|TAKE BACK RETURN|FOB|deposits cajole after the slyly fina +59936|1384|99|1|22|28278.36|0.06|0.03|R|F|1993-02-19|1993-01-13|1993-03-03|COLLECT COD|RAIL|regular dependencies haggle slyly exp +59936|111|12|2|23|23255.53|0.02|0.00|R|F|1993-03-01|1993-02-15|1993-03-26|TAKE BACK RETURN|AIR|foxes. regular, ironic pinto bea +59936|1136|73|3|29|30076.77|0.03|0.06|A|F|1993-01-06|1993-01-04|1993-01-12|COLLECT COD|FOB|kages nag a +59937|1803|33|1|4|6819.20|0.08|0.04|R|F|1995-04-10|1995-02-21|1995-04-26|COLLECT COD|TRUCK|he quickly pending requests. dep +59938|1287|62|1|13|15447.64|0.01|0.01|N|O|1995-11-20|1995-09-16|1995-12-14|NONE|TRUCK|ithely bol +59938|268|50|2|19|22196.94|0.04|0.00|N|O|1995-11-12|1995-10-29|1995-11-13|TAKE BACK RETURN|FOB|ilent deposits are f +59938|1883|70|3|22|39267.36|0.01|0.02|N|O|1995-08-14|1995-10-26|1995-09-02|NONE|TRUCK|pecial, silent theodolites use slyly +59939|1171|8|1|32|34309.44|0.03|0.04|R|F|1993-10-11|1993-10-19|1993-10-24|COLLECT COD|MAIL| requests cajole +59939|1417|18|2|11|14502.51|0.06|0.08|R|F|1993-10-17|1993-10-19|1993-11-09|COLLECT COD|TRUCK| final realms. multipliers sleep careful +59939|1590|91|3|12|17899.08|0.08|0.04|A|F|1993-10-27|1993-11-30|1993-11-03|COLLECT COD|RAIL| regular requests grow ironic, bo +59939|375|4|4|33|42087.21|0.03|0.06|A|F|1993-10-22|1993-10-26|1993-10-26|COLLECT COD|SHIP|ironic the +59939|1236|74|5|8|9097.84|0.00|0.05|A|F|1993-11-11|1993-11-22|1993-12-03|DELIVER IN PERSON|REG AIR|slyly bold request +59940|1336|13|1|31|38357.23|0.00|0.04|A|F|1994-10-26|1994-10-30|1994-10-29|COLLECT COD|AIR|apades integrate f +59940|137|16|2|37|38373.81|0.02|0.07|R|F|1994-11-09|1994-12-05|1994-12-05|TAKE BACK RETURN|FOB|xes sleep blithel +59940|460|90|3|37|50337.02|0.03|0.04|R|F|1995-01-17|1994-11-05|1995-02-10|DELIVER IN PERSON|FOB| carefully ironic depo +59941|769|2|1|40|66790.40|0.07|0.07|A|F|1992-10-29|1993-01-13|1992-10-31|NONE|FOB|believe slyly u +59941|1597|18|2|22|32968.98|0.02|0.00|A|F|1992-11-15|1992-12-08|1992-11-16|TAKE BACK RETURN|SHIP|about the final +59942|868|35|1|10|17688.60|0.08|0.08|A|F|1994-05-12|1994-04-15|1994-05-17|COLLECT COD|AIR|usly unusual a +59942|288|70|2|46|54660.88|0.00|0.05|R|F|1994-06-07|1994-04-16|1994-06-27|COLLECT COD|FOB|ut the furiously e +59942|1282|57|3|26|30765.28|0.01|0.04|R|F|1994-03-18|1994-04-30|1994-04-12|DELIVER IN PERSON|FOB|sts. bold, regular packages along the packa +59942|1716|1|4|22|35589.62|0.06|0.07|A|F|1994-03-15|1994-04-08|1994-04-05|COLLECT COD|AIR|carefully across the do +59942|869|36|5|30|53095.80|0.09|0.04|R|F|1994-02-18|1994-04-11|1994-03-01|COLLECT COD|REG AIR|latelets. instructions sleep carefully b +59942|552|53|6|35|50839.25|0.01|0.00|A|F|1994-04-15|1994-04-11|1994-04-17|NONE|RAIL|ix furiously bli +59943|1565|6|1|9|13199.04|0.09|0.03|R|F|1993-07-12|1993-07-13|1993-08-09|TAKE BACK RETURN|FOB|s above the instructions sleep +59943|32|58|2|1|932.03|0.06|0.07|R|F|1993-07-27|1993-07-20|1993-08-01|COLLECT COD|RAIL|ests. carefully even dependencies run. bli +59943|699|31|3|29|46391.01|0.10|0.07|A|F|1993-07-30|1993-08-06|1993-08-06|TAKE BACK RETURN|REG AIR|nic packages nag blithely quickly re +59968|112|65|1|9|9108.99|0.07|0.04|N|O|1997-12-15|1998-01-08|1997-12-22|TAKE BACK RETURN|TRUCK|ly bold deposits sublate carefully +59968|1596|37|2|37|55410.83|0.10|0.02|N|O|1998-01-26|1997-12-07|1998-02-10|DELIVER IN PERSON|AIR|o sleep according to th +59969|1781|82|1|17|28607.26|0.09|0.08|R|F|1992-03-08|1992-02-22|1992-03-09|COLLECT COD|FOB|sublate blithely. fu +59969|230|31|2|2|2260.46|0.03|0.08|A|F|1992-01-30|1992-04-11|1992-02-11|COLLECT COD|FOB|thely regula +59969|1449|28|3|18|24307.92|0.02|0.07|R|F|1992-05-10|1992-02-23|1992-05-29|DELIVER IN PERSON|AIR|ngside of the furiously eve +59969|1463|81|4|18|24560.28|0.10|0.06|A|F|1992-03-26|1992-02-29|1992-04-09|NONE|REG AIR|fluffily above the requests. e +59969|108|87|5|47|47380.70|0.04|0.08|A|F|1992-05-05|1992-03-25|1992-05-20|NONE|SHIP|press accounts wake car +59969|1720|63|6|20|32434.40|0.10|0.06|A|F|1992-04-22|1992-03-02|1992-05-05|TAKE BACK RETURN|REG AIR|ites cajole above the fluffily regu +59969|1823|67|7|40|68992.80|0.08|0.01|R|F|1992-05-10|1992-04-03|1992-05-28|DELIVER IN PERSON|TRUCK|ly unusual epitaphs are ac +59970|1816|46|1|16|27484.96|0.10|0.05|N|O|1998-10-22|1998-10-06|1998-11-15|TAKE BACK RETURN|FOB|fully silent +59971|1470|88|1|9|12343.23|0.02|0.02|N|O|1995-08-06|1995-07-23|1995-08-29|COLLECT COD|TRUCK|nusual theodol +59971|1010|46|2|40|36440.40|0.06|0.06|N|O|1995-06-28|1995-07-25|1995-07-24|TAKE BACK RETURN|REG AIR|y ironic deposits according to the ironic +59971|622|16|3|34|51769.08|0.02|0.03|N|O|1995-08-21|1995-07-14|1995-09-18|NONE|MAIL|lar theodolites haggle furiously ab +59971|299|54|4|43|51569.47|0.01|0.08|N|F|1995-06-09|1995-08-09|1995-07-02|TAKE BACK RETURN|MAIL|ns. carefully e +59971|757|22|5|8|13262.00|0.07|0.05|N|O|1995-06-25|1995-08-10|1995-07-13|TAKE BACK RETURN|TRUCK|ove the ironic, unusual dolp +59971|882|16|6|20|35657.60|0.02|0.07|R|F|1995-06-10|1995-07-13|1995-06-17|TAKE BACK RETURN|REG AIR|eas. ruthlessly blithe +59971|1748|33|7|24|39593.76|0.10|0.02|N|O|1995-07-14|1995-08-07|1995-07-23|TAKE BACK RETURN|TRUCK|ent ideas sleep. carefully regular reque +59972|1813|57|1|28|48014.68|0.06|0.05|R|F|1995-02-08|1995-01-24|1995-02-19|COLLECT COD|RAIL|ly express reque +59972|645|39|2|32|49460.48|0.03|0.06|A|F|1995-02-06|1994-12-01|1995-02-23|DELIVER IN PERSON|TRUCK|e blithely. even, ironic reque +59973|738|35|1|33|54078.09|0.03|0.01|N|O|1996-02-16|1996-01-05|1996-02-27|NONE|TRUCK|bold accounts sleep reques +59973|1012|83|2|45|41085.45|0.04|0.08|N|O|1995-12-30|1995-12-26|1996-01-23|NONE|TRUCK| regular pack +59973|1050|21|3|23|21874.15|0.07|0.06|N|O|1995-12-30|1996-01-04|1996-01-12|DELIVER IN PERSON|REG AIR|eposits wa +59973|1128|1|4|37|38077.44|0.00|0.08|N|O|1996-03-11|1996-02-01|1996-04-07|TAKE BACK RETURN|TRUCK|tegrate fluffily. final, unu +59973|1983|16|5|10|18849.80|0.05|0.07|N|O|1996-02-09|1996-01-28|1996-02-23|DELIVER IN PERSON|TRUCK|press packages haggle c +59973|846|80|6|7|12227.88|0.06|0.00|N|O|1996-01-16|1995-12-26|1996-01-29|TAKE BACK RETURN|FOB|bold, bold instructions. unusu +59973|306|7|7|35|42220.50|0.01|0.00|N|O|1996-02-03|1996-01-18|1996-02-29|COLLECT COD|RAIL|. furiously final excuses sleep furio +59974|560|51|1|36|52580.16|0.10|0.07|N|O|1995-12-12|1996-02-11|1995-12-28|NONE|SHIP|eposits integrate slyly since the +59974|437|38|2|10|13374.30|0.10|0.05|N|O|1996-01-05|1996-02-29|1996-01-26|COLLECT COD|AIR|unts use slyly after the even, regular t +59975|496|26|1|6|8378.94|0.06|0.06|A|F|1994-03-15|1994-02-18|1994-04-06|DELIVER IN PERSON|REG AIR| ironic brai +59975|1924|25|2|27|49299.84|0.03|0.08|A|F|1994-01-04|1994-03-11|1994-02-02|DELIVER IN PERSON|AIR|cial foxes. foxes haggle at the +60000|292|93|1|45|53653.05|0.05|0.06|N|O|1995-07-13|1995-05-29|1995-08-10|TAKE BACK RETURN|MAIL|s dependencies. furiously unusual the +60000|1843|44|2|23|40131.32|0.05|0.03|N|O|1995-08-09|1995-06-08|1995-08-23|COLLECT COD|FOB| ideas about the permanent +60000|1057|63|3|45|43112.25|0.02|0.02|R|F|1995-05-15|1995-05-31|1995-06-03|COLLECT COD|SHIP|fully bold pinto beans alongside +60000|271|53|4|29|33966.83|0.02|0.01|N|O|1995-07-25|1995-06-07|1995-08-17|COLLECT COD|SHIP|ly final ideas boost s +60000|585|16|5|31|46052.98|0.00|0.05|N|O|1995-08-06|1995-07-18|1995-08-19|TAKE BACK RETURN|TRUCK|ly even instr +60000|836|3|6|45|78157.35|0.04|0.08|N|O|1995-07-23|1995-07-17|1995-07-24|DELIVER IN PERSON|TRUCK|ke final packages. carefully final fo diff --git a/src/test/singlenode_regress/data/lineitem_small.csv b/src/test/singlenode_regress/data/lineitem_small.csv new file mode 100644 index 00000000000..ca2dbd06efa --- /dev/null +++ b/src/test/singlenode_regress/data/lineitem_small.csv @@ -0,0 +1,2985 @@ +1|1552|93|1|17|24710.35|0.04|0.02|N|O|1996-03-13|1996-02-12|1996-03-22|DELIVER IN PERSON|TRUCK|egular courts above the +1|674|75|2|36|56688.12|0.09|0.06|N|O|1996-04-12|1996-02-28|1996-04-20|TAKE BACK RETURN|MAIL|ly final dependencies: slyly bold +1|637|38|3|8|12301.04|0.10|0.02|N|O|1996-01-29|1996-03-05|1996-01-31|TAKE BACK RETURN|REG AIR|riously. regular, express dep +1|22|48|4|28|25816.56|0.09|0.06|N|O|1996-04-21|1996-03-30|1996-05-16|NONE|AIR|lites. fluffily even de +1|241|23|5|24|27389.76|0.10|0.04|N|O|1996-03-30|1996-03-14|1996-04-01|NONE|FOB| pending foxes. slyly re +1|157|10|6|32|33828.80|0.07|0.02|N|O|1996-01-30|1996-02-07|1996-02-03|DELIVER IN PERSON|MAIL|arefully slyly ex +2|1062|33|1|38|36596.28|0.00|0.05|N|O|1997-01-28|1997-01-14|1997-02-02|TAKE BACK RETURN|RAIL|ven requests. deposits breach a +3|43|19|1|45|42436.80|0.06|0.00|R|F|1994-02-02|1994-01-04|1994-02-23|NONE|AIR|ongside of the furiously brave acco +3|191|70|2|49|53468.31|0.10|0.00|R|F|1993-11-09|1993-12-20|1993-11-24|TAKE BACK RETURN|RAIL| unusual accounts. eve +3|1285|60|3|27|32029.56|0.06|0.07|A|F|1994-01-16|1993-11-22|1994-01-23|DELIVER IN PERSON|SHIP|nal foxes wake. +3|294|22|4|2|2388.58|0.01|0.06|A|F|1993-12-04|1994-01-07|1994-01-01|NONE|TRUCK|y. fluffily pending d +3|1831|61|5|28|48519.24|0.04|0.00|R|F|1993-12-14|1994-01-10|1994-01-01|TAKE BACK RETURN|FOB|ages nag slyly pending +3|622|16|6|26|39588.12|0.10|0.02|A|F|1993-10-29|1993-12-18|1993-11-04|TAKE BACK RETURN|RAIL|ges sleep after the caref +4|881|81|1|30|53456.40|0.03|0.08|N|O|1996-01-10|1995-12-14|1996-01-18|DELIVER IN PERSON|REG AIR|- quickly regular packages sleep. idly +5|1086|87|1|15|14806.20|0.02|0.04|R|F|1994-10-31|1994-08-31|1994-11-20|NONE|AIR|ts wake furiously +5|1240|41|2|26|29672.24|0.07|0.08|R|F|1994-10-16|1994-09-25|1994-10-19|NONE|FOB|sts use slyly quickly special instruc +5|376|5|3|50|63818.50|0.08|0.03|A|F|1994-08-08|1994-10-13|1994-08-26|DELIVER IN PERSON|AIR|eodolites. fluffily unusual +6|1397|36|1|37|48040.43|0.08|0.03|A|F|1992-04-27|1992-05-15|1992-05-02|TAKE BACK RETURN|TRUCK|p furiously special foxes +7|1821|51|1|12|20673.84|0.07|0.03|N|O|1996-05-07|1996-03-13|1996-06-03|TAKE BACK RETURN|FOB|ss pinto beans wake against th +7|1453|93|2|9|12190.05|0.08|0.08|N|O|1996-02-01|1996-03-02|1996-02-19|TAKE BACK RETURN|SHIP|es. instructions +7|948|17|3|46|85051.24|0.10|0.07|N|O|1996-01-15|1996-03-27|1996-02-03|COLLECT COD|MAIL| unusual reques +7|1631|32|4|28|42913.64|0.03|0.04|N|O|1996-03-21|1996-04-08|1996-04-20|NONE|FOB|. slyly special requests haggl +7|1519|40|5|38|53979.38|0.08|0.01|N|O|1996-02-11|1996-02-24|1996-02-18|DELIVER IN PERSON|TRUCK|ns haggle carefully ironic deposits. bl +7|793|26|6|35|59282.65|0.06|0.03|N|O|1996-01-16|1996-02-23|1996-01-22|TAKE BACK RETURN|FOB|jole. excuses wake carefully alongside of +7|1573|54|7|5|7372.85|0.04|0.02|N|O|1996-02-10|1996-03-26|1996-02-13|NONE|FOB|ithely regula +32|828|95|1|28|48406.96|0.05|0.08|N|O|1995-10-23|1995-08-27|1995-10-26|TAKE BACK RETURN|TRUCK|sleep quickly. req +32|1980|25|2|32|60223.36|0.02|0.00|N|O|1995-08-14|1995-10-07|1995-08-27|COLLECT COD|AIR|lithely regular deposits. fluffily +32|442|72|3|2|2684.88|0.09|0.02|N|O|1995-08-07|1995-10-07|1995-08-23|DELIVER IN PERSON|AIR| express accounts wake according to the +32|28|79|4|4|3712.08|0.09|0.03|N|O|1995-08-04|1995-10-01|1995-09-03|NONE|REG AIR|e slyly final pac +32|859|93|5|44|77433.40|0.05|0.06|N|O|1995-08-28|1995-08-20|1995-09-14|DELIVER IN PERSON|AIR|symptotes nag according to the ironic depo +32|117|44|6|6|6102.66|0.04|0.03|N|O|1995-07-21|1995-09-23|1995-07-25|COLLECT COD|RAIL| gifts cajole carefully. +33|614|8|1|31|46952.91|0.09|0.04|A|F|1993-10-29|1993-12-19|1993-11-08|COLLECT COD|TRUCK|ng to the furiously ironic package +33|606|69|2|32|48211.20|0.02|0.05|A|F|1993-12-09|1994-01-04|1993-12-28|COLLECT COD|MAIL|gular theodolites +33|1375|14|3|5|6381.85|0.05|0.03|A|F|1993-12-09|1993-12-25|1993-12-23|TAKE BACK RETURN|AIR|. stealthily bold exc +33|340|41|4|41|50853.94|0.09|0.00|R|F|1993-11-09|1994-01-24|1993-11-11|TAKE BACK RETURN|MAIL|unusual packages doubt caref +34|884|18|1|13|23203.44|0.00|0.07|N|O|1998-10-23|1998-09-14|1998-11-06|NONE|REG AIR|nic accounts. deposits are alon +34|895|29|2|22|39509.58|0.08|0.06|N|O|1998-10-09|1998-10-16|1998-10-12|NONE|FOB|thely slyly p +34|1696|79|3|6|9586.14|0.02|0.06|N|O|1998-10-30|1998-09-20|1998-11-05|NONE|FOB|ar foxes sleep +35|5|31|1|24|21720.00|0.02|0.00|N|O|1996-02-21|1996-01-03|1996-03-18|TAKE BACK RETURN|FOB|, regular tithe +35|1620|62|2|34|51735.08|0.06|0.08|N|O|1996-01-22|1996-01-06|1996-01-27|DELIVER IN PERSON|RAIL|s are carefully against the f +35|1209|21|3|7|7771.40|0.06|0.04|N|O|1996-01-19|1995-12-22|1996-01-29|NONE|MAIL| the carefully regular +35|852|86|4|25|43821.25|0.06|0.05|N|O|1995-11-26|1995-12-25|1995-12-21|DELIVER IN PERSON|SHIP| quickly unti +35|1200|73|5|34|37440.80|0.08|0.06|N|O|1995-11-08|1996-01-15|1995-11-26|COLLECT COD|MAIL|. silent, unusual deposits boost +35|308|37|6|28|33832.40|0.03|0.02|N|O|1996-02-01|1995-12-24|1996-02-28|COLLECT COD|RAIL|ly alongside of +36|1198|99|1|42|46165.98|0.09|0.00|N|O|1996-02-03|1996-01-21|1996-02-23|COLLECT COD|SHIP| careful courts. special +37|227|55|1|40|45088.80|0.09|0.03|A|F|1992-07-21|1992-08-01|1992-08-15|NONE|REG AIR|luffily regular requests. slyly final acco +37|1268|43|2|39|45601.14|0.05|0.02|A|F|1992-07-02|1992-08-18|1992-07-28|TAKE BACK RETURN|RAIL|the final requests. ca +37|130|57|3|43|44295.59|0.05|0.08|A|F|1992-07-10|1992-07-06|1992-08-02|DELIVER IN PERSON|TRUCK|iously ste +38|1759|44|1|44|73073.00|0.04|0.02|N|O|1996-09-29|1996-11-17|1996-09-30|COLLECT COD|MAIL|s. blithely unusual theodolites am +39|24|100|1|44|40656.88|0.09|0.06|N|O|1996-11-14|1996-12-15|1996-12-12|COLLECT COD|RAIL|eodolites. careful +39|1866|96|2|26|45964.36|0.08|0.04|N|O|1996-11-04|1996-10-20|1996-11-20|NONE|FOB|ckages across the slyly silent +39|679|73|3|46|72664.82|0.06|0.08|N|O|1996-09-26|1996-12-19|1996-10-26|DELIVER IN PERSON|AIR|he carefully e +39|206|34|4|32|35398.40|0.07|0.05|N|O|1996-10-02|1996-12-19|1996-10-14|COLLECT COD|MAIL|heodolites sleep silently pending foxes. ac +39|546|7|5|43|62201.22|0.01|0.01|N|O|1996-10-17|1996-11-14|1996-10-26|COLLECT COD|MAIL|yly regular i +39|944|79|6|40|73797.60|0.06|0.05|N|O|1996-12-08|1996-10-22|1997-01-01|COLLECT COD|AIR|quickly ironic fox +64|860|61|1|21|36978.06|0.05|0.02|R|F|1994-09-30|1994-09-18|1994-10-26|DELIVER IN PERSON|REG AIR|ch slyly final, thin platelets. +65|597|58|1|26|38937.34|0.03|0.03|A|F|1995-04-20|1995-04-25|1995-05-13|NONE|TRUCK|pending deposits nag even packages. ca +65|739|4|2|22|36074.06|0.00|0.05|N|O|1995-07-17|1995-06-04|1995-07-19|COLLECT COD|FOB| ideas. special, r +65|14|40|3|21|19194.21|0.09|0.07|N|O|1995-07-06|1995-05-14|1995-07-31|DELIVER IN PERSON|RAIL|bove the even packages. accounts nag carefu +66|1152|89|1|31|32647.65|0.00|0.08|R|F|1994-02-19|1994-03-11|1994-02-20|TAKE BACK RETURN|RAIL|ut the unusual accounts sleep at the bo +66|1735|36|2|41|67105.93|0.04|0.07|A|F|1994-02-21|1994-03-01|1994-03-18|COLLECT COD|AIR| regular de +67|217|99|1|4|4468.84|0.09|0.04|N|O|1997-04-17|1997-01-31|1997-04-20|NONE|SHIP| cajole thinly expres +67|202|57|2|12|13226.40|0.09|0.05|N|O|1997-01-27|1997-02-21|1997-02-22|NONE|REG AIR| even packages cajole +67|1736|79|3|5|8188.65|0.03|0.07|N|O|1997-02-20|1997-02-12|1997-02-21|DELIVER IN PERSON|TRUCK|y unusual packages thrash pinto +67|876|77|4|44|78182.28|0.08|0.06|N|O|1997-03-18|1997-01-29|1997-04-13|DELIVER IN PERSON|RAIL|se quickly above the even, express reques +67|407|95|5|23|30070.20|0.05|0.07|N|O|1997-04-19|1997-02-14|1997-05-06|DELIVER IN PERSON|REG AIR|ly regular deposit +67|1784|27|6|29|48887.62|0.02|0.05|N|O|1997-01-25|1997-01-27|1997-01-27|DELIVER IN PERSON|FOB|ultipliers +68|71|97|1|3|2913.21|0.05|0.02|N|O|1998-07-04|1998-06-05|1998-07-21|NONE|RAIL|fully special instructions cajole. furious +68|1752|79|2|46|76072.50|0.02|0.05|N|O|1998-06-26|1998-06-07|1998-07-05|NONE|MAIL| requests are unusual, regular pinto +68|350|79|3|46|57516.10|0.04|0.05|N|O|1998-08-13|1998-07-08|1998-08-29|NONE|RAIL|egular dependencies affix ironically along +68|948|51|4|20|36978.80|0.07|0.01|N|O|1998-06-27|1998-05-23|1998-07-02|NONE|REG AIR| excuses integrate fluffily +68|828|62|5|27|46678.14|0.03|0.06|N|O|1998-06-19|1998-06-25|1998-06-29|DELIVER IN PERSON|SHIP|ccounts. deposits use. furiously +68|1026|62|6|30|27810.60|0.05|0.06|N|O|1998-08-11|1998-07-11|1998-08-14|NONE|RAIL|oxes are slyly blithely fin +68|1393|32|7|41|53069.99|0.09|0.08|N|O|1998-06-24|1998-06-27|1998-07-06|NONE|SHIP|eposits nag special ideas. furiousl +69|1153|90|1|48|50599.20|0.01|0.07|A|F|1994-08-17|1994-08-11|1994-09-08|NONE|TRUCK|regular epitaphs. carefully even ideas hag +69|1042|13|2|32|30177.28|0.08|0.06|A|F|1994-08-24|1994-08-17|1994-08-31|NONE|REG AIR|s sleep carefully bold, +69|1373|88|3|17|21664.29|0.09|0.00|A|F|1994-07-02|1994-07-07|1994-07-03|TAKE BACK RETURN|AIR|final, pending instr +69|376|33|4|3|3829.11|0.09|0.04|R|F|1994-06-06|1994-07-27|1994-06-15|NONE|MAIL| blithely final d +69|921|90|5|42|76520.64|0.07|0.04|R|F|1994-07-31|1994-07-26|1994-08-28|DELIVER IN PERSON|REG AIR|tect regular, speci +69|186|13|6|23|24982.14|0.05|0.00|A|F|1994-10-03|1994-08-06|1994-10-24|NONE|SHIP|nding accounts ca +70|642|5|1|8|12341.12|0.03|0.08|R|F|1994-01-12|1994-02-27|1994-01-14|TAKE BACK RETURN|FOB|ggle. carefully pending dependenc +70|1962|51|2|13|24231.48|0.06|0.06|A|F|1994-03-03|1994-02-13|1994-03-26|COLLECT COD|AIR|lyly special packag +70|1799|26|3|1|1700.79|0.03|0.05|R|F|1994-01-26|1994-03-05|1994-01-28|TAKE BACK RETURN|RAIL|quickly. fluffily unusual theodolites c +70|458|17|4|11|14942.95|0.01|0.05|A|F|1994-03-17|1994-03-17|1994-03-27|NONE|MAIL|alongside of the deposits. fur +70|372|29|5|37|47077.69|0.09|0.04|R|F|1994-02-13|1994-03-16|1994-02-21|COLLECT COD|MAIL|n accounts are. q +70|557|48|6|19|27693.45|0.06|0.03|A|F|1994-01-26|1994-02-17|1994-02-06|TAKE BACK RETURN|SHIP| packages wake pending accounts. +71|620|21|1|25|38015.50|0.09|0.07|N|O|1998-04-10|1998-04-22|1998-04-11|COLLECT COD|FOB|ckly. slyly +71|660|54|2|3|4681.98|0.09|0.07|N|O|1998-05-23|1998-04-03|1998-06-02|COLLECT COD|SHIP|y. pinto beans haggle after the +71|345|30|3|45|56040.30|0.00|0.07|N|O|1998-02-23|1998-03-20|1998-03-24|DELIVER IN PERSON|SHIP| ironic packages believe blithely a +71|967|2|4|33|61642.68|0.00|0.01|N|O|1998-04-12|1998-03-20|1998-04-15|NONE|FOB| serve quickly fluffily bold deposi +71|1033|69|5|39|36427.17|0.08|0.06|N|O|1998-01-29|1998-04-07|1998-02-18|DELIVER IN PERSON|RAIL|l accounts sleep across the pack +71|1957|46|6|34|63204.30|0.04|0.01|N|O|1998-03-05|1998-04-22|1998-03-30|DELIVER IN PERSON|TRUCK|s cajole. +96|1231|43|1|23|26041.29|0.10|0.06|A|F|1994-07-19|1994-06-29|1994-07-25|DELIVER IN PERSON|TRUCK|ep-- carefully reg +96|1354|55|2|30|37660.50|0.01|0.06|R|F|1994-06-03|1994-05-29|1994-06-22|DELIVER IN PERSON|TRUCK|e quickly even ideas. furiou +97|1195|32|1|13|14250.47|0.00|0.02|R|F|1993-04-01|1993-04-04|1993-04-08|NONE|TRUCK|ayers cajole against the furiously +97|496|26|2|37|51670.13|0.02|0.06|A|F|1993-04-13|1993-03-30|1993-04-14|DELIVER IN PERSON|SHIP|ic requests boost carefully quic +97|777|74|3|19|31877.63|0.06|0.08|R|F|1993-05-14|1993-03-05|1993-05-25|TAKE BACK RETURN|RAIL|gifts. furiously ironic packages cajole. +98|403|4|1|28|36495.20|0.06|0.07|A|F|1994-12-24|1994-10-25|1995-01-16|COLLECT COD|REG AIR| pending, regular accounts s +98|1098|4|2|1|999.09|0.00|0.00|A|F|1994-12-01|1994-12-12|1994-12-15|DELIVER IN PERSON|TRUCK|. unusual instructions against +98|448|49|3|14|18878.16|0.05|0.02|A|F|1994-12-30|1994-11-22|1995-01-27|COLLECT COD|AIR| cajole furiously. blithely ironic ideas +98|1672|73|4|10|15736.70|0.03|0.03|A|F|1994-10-23|1994-11-08|1994-11-09|COLLECT COD|RAIL| carefully. quickly ironic ideas +99|872|72|1|10|17728.70|0.02|0.01|A|F|1994-05-18|1994-06-03|1994-05-23|COLLECT COD|RAIL|kages. requ +99|1238|39|2|5|5696.15|0.02|0.07|R|F|1994-05-06|1994-05-28|1994-05-20|TAKE BACK RETURN|RAIL|ests cajole fluffily waters. blithe +99|1341|56|3|42|52178.28|0.02|0.02|A|F|1994-04-19|1994-05-18|1994-04-20|NONE|RAIL|kages are fluffily furiously ir +99|1084|20|4|36|35462.88|0.09|0.02|A|F|1994-07-04|1994-04-17|1994-07-30|DELIVER IN PERSON|AIR|slyly. slyly e +100|621|22|1|28|42605.36|0.04|0.05|N|O|1998-05-08|1998-05-13|1998-06-07|COLLECT COD|TRUCK|sts haggle. slowl +100|1160|97|2|22|23345.52|0.00|0.07|N|O|1998-06-24|1998-04-12|1998-06-29|DELIVER IN PERSON|SHIP|nto beans alongside of the fi +100|462|92|3|46|62673.16|0.03|0.04|N|O|1998-05-02|1998-04-10|1998-05-22|TAKE BACK RETURN|SHIP|ular accounts. even +100|381|38|4|14|17939.32|0.06|0.03|N|O|1998-05-22|1998-05-01|1998-06-03|COLLECT COD|MAIL|y. furiously ironic ideas gr +100|535|26|5|37|53114.61|0.05|0.00|N|O|1998-03-06|1998-04-16|1998-03-31|TAKE BACK RETURN|TRUCK|nd the quickly s +101|1183|92|1|49|53124.82|0.10|0.00|N|O|1996-06-21|1996-05-27|1996-06-29|DELIVER IN PERSON|REG AIR|ts-- final packages sleep furiousl +101|1634|58|2|36|55282.68|0.00|0.01|N|O|1996-05-19|1996-05-01|1996-06-04|DELIVER IN PERSON|AIR|tes. blithely pending dolphins x-ray f +101|1385|100|3|12|15436.56|0.06|0.02|N|O|1996-03-29|1996-04-20|1996-04-12|COLLECT COD|MAIL|. quickly regular +102|890|57|1|37|66262.93|0.06|0.00|N|O|1997-07-24|1997-08-02|1997-08-07|TAKE BACK RETURN|SHIP|ully across the ideas. final deposit +102|1693|17|2|34|54219.46|0.03|0.08|N|O|1997-08-09|1997-07-28|1997-08-26|TAKE BACK RETURN|SHIP|eposits cajole across +102|1824|68|3|25|43145.50|0.01|0.01|N|O|1997-07-31|1997-07-24|1997-08-17|NONE|RAIL|bits. ironic accoun +102|612|6|4|15|22689.15|0.07|0.07|N|O|1997-06-02|1997-07-13|1997-06-04|DELIVER IN PERSON|SHIP|final packages. carefully even excu +103|1947|80|1|6|11093.64|0.03|0.05|N|O|1996-10-11|1996-07-25|1996-10-28|NONE|FOB|cajole. carefully ex +103|105|32|2|37|37188.70|0.02|0.07|N|O|1996-09-17|1996-07-27|1996-09-20|TAKE BACK RETURN|MAIL|ies. quickly ironic requests use blithely +103|285|86|3|23|27261.44|0.01|0.04|N|O|1996-09-11|1996-09-18|1996-09-26|NONE|FOB|ironic accou +103|291|46|4|32|38121.28|0.01|0.07|N|O|1996-07-30|1996-08-06|1996-08-04|NONE|RAIL|kages doze. special, regular deposit +128|1069|5|1|38|36862.28|0.06|0.01|A|F|1992-09-01|1992-08-27|1992-10-01|TAKE BACK RETURN|FOB| cajole careful +129|29|55|1|46|42734.92|0.08|0.02|R|F|1993-02-15|1993-01-24|1993-03-05|COLLECT COD|TRUCK|uietly bold theodolites. fluffil +129|1852|53|2|36|63138.60|0.01|0.02|A|F|1992-11-25|1992-12-25|1992-12-09|TAKE BACK RETURN|REG AIR|packages are care +129|395|24|3|33|42747.87|0.04|0.06|A|F|1993-01-08|1993-02-14|1993-01-29|COLLECT COD|SHIP|sts nag bravely. fluffily +129|1352|29|4|34|42613.90|0.00|0.01|R|F|1993-01-29|1993-02-14|1993-02-10|COLLECT COD|MAIL|quests. express ideas +129|314|99|5|24|29143.44|0.06|0.00|A|F|1992-12-07|1993-01-02|1992-12-11|TAKE BACK RETURN|FOB|uests. foxes cajole slyly after the ca +129|771|68|6|22|36778.94|0.06|0.01|R|F|1993-02-15|1993-01-31|1993-02-24|COLLECT COD|SHIP|e. fluffily regular +129|1686|69|7|1|1587.68|0.05|0.04|R|F|1993-01-26|1993-01-08|1993-02-24|DELIVER IN PERSON|FOB|e carefully blithely bold dolp +130|1289|90|1|14|16663.92|0.08|0.05|A|F|1992-08-15|1992-07-25|1992-09-13|COLLECT COD|RAIL| requests. final instruction +130|18|44|2|48|44064.48|0.03|0.02|R|F|1992-07-01|1992-07-12|1992-07-24|NONE|AIR|lithely alongside of the regu +130|119|20|3|18|18343.98|0.04|0.08|A|F|1992-07-04|1992-06-14|1992-07-29|DELIVER IN PERSON|MAIL| slyly ironic decoys abou +130|1157|66|4|13|13755.95|0.09|0.02|R|F|1992-06-26|1992-07-29|1992-07-05|NONE|FOB| pending dolphins sleep furious +130|692|55|5|31|49373.39|0.06|0.05|R|F|1992-09-01|1992-07-18|1992-09-02|TAKE BACK RETURN|RAIL|thily about the ruth +131|1676|18|1|45|70995.15|0.10|0.02|R|F|1994-09-14|1994-09-02|1994-10-04|NONE|FOB|ironic, bold accounts. careful +131|443|2|2|50|67172.00|0.02|0.04|A|F|1994-09-17|1994-08-10|1994-09-21|NONE|SHIP|ending requests. final, ironic pearls slee +131|1891|35|3|4|7171.56|0.04|0.03|A|F|1994-09-20|1994-08-30|1994-09-23|COLLECT COD|REG AIR| are carefully slyly i +132|1405|45|1|18|23515.20|0.00|0.08|R|F|1993-07-10|1993-08-05|1993-07-13|NONE|TRUCK|ges. platelets wake furio +132|1191|92|2|43|46964.17|0.01|0.08|R|F|1993-09-01|1993-08-16|1993-09-22|NONE|TRUCK|y pending theodolites +132|1145|46|3|32|33476.48|0.04|0.04|A|F|1993-07-12|1993-08-05|1993-08-05|COLLECT COD|TRUCK|d instructions hagg +132|281|63|4|23|27169.44|0.10|0.00|A|F|1993-06-16|1993-08-27|1993-06-23|DELIVER IN PERSON|AIR|refully blithely bold acco +133|1035|71|1|27|25272.81|0.00|0.02|N|O|1997-12-21|1998-02-23|1997-12-27|TAKE BACK RETURN|MAIL|yly even gifts after the sl +133|1763|90|2|12|19977.12|0.02|0.06|N|O|1997-12-02|1998-01-15|1997-12-29|DELIVER IN PERSON|REG AIR|ts cajole fluffily quickly i +133|1174|83|3|29|31179.93|0.09|0.08|N|O|1998-02-28|1998-01-30|1998-03-09|DELIVER IN PERSON|RAIL| the carefully regular theodoli +133|899|99|4|11|19798.79|0.06|0.01|N|O|1998-03-21|1998-01-15|1998-04-04|DELIVER IN PERSON|REG AIR|e quickly across the dolphins +134|7|8|1|21|19047.00|0.00|0.03|A|F|1992-07-17|1992-07-08|1992-07-26|COLLECT COD|SHIP|s. quickly regular +134|1647|30|2|35|54202.40|0.06|0.07|A|F|1992-08-23|1992-06-01|1992-08-24|NONE|MAIL|ajole furiously. instructio +134|1883|70|3|26|46406.88|0.09|0.06|A|F|1992-06-20|1992-07-12|1992-07-16|NONE|RAIL| among the pending depos +134|1441|42|4|47|63094.68|0.05|0.00|A|F|1992-08-16|1992-07-06|1992-08-28|NONE|REG AIR|s! carefully unusual requests boost careful +134|352|53|5|12|15028.20|0.05|0.02|A|F|1992-07-03|1992-06-01|1992-07-11|COLLECT COD|TRUCK|nts are quic +134|1332|71|6|12|14799.96|0.00|0.00|A|F|1992-08-08|1992-07-07|1992-08-20|TAKE BACK RETURN|FOB|lyly regular pac +135|1083|84|1|47|46251.76|0.06|0.08|N|O|1996-02-18|1996-01-01|1996-02-25|COLLECT COD|RAIL|ctions wake slyly abo +135|1984|17|2|21|39605.58|0.00|0.07|N|O|1996-02-11|1996-01-12|1996-02-13|DELIVER IN PERSON|SHIP| deposits believe. furiously regular p +135|1576|97|3|33|48759.81|0.02|0.00|N|O|1996-01-03|1995-11-21|1996-02-01|TAKE BACK RETURN|MAIL|ptotes boost slowly care +135|671|3|4|34|53436.78|0.02|0.03|N|O|1996-01-12|1996-01-19|1996-02-05|NONE|TRUCK|counts doze against the blithely ironi +135|1363|40|5|20|25287.20|0.01|0.04|N|O|1996-01-25|1995-11-20|1996-02-09|NONE|MAIL|theodolites. quickly p +135|1150|59|6|13|13664.95|0.04|0.02|N|O|1995-11-12|1995-12-22|1995-11-17|NONE|FOB|nal ideas. final instr +160|148|1|1|36|37733.04|0.07|0.01|N|O|1997-03-11|1997-03-11|1997-03-20|COLLECT COD|MAIL|old, ironic deposits are quickly abov +160|864|98|2|22|38826.92|0.00|0.04|N|O|1997-02-18|1997-03-05|1997-03-05|COLLECT COD|RAIL|ncies about the request +160|201|56|3|34|37440.80|0.01|0.05|N|O|1997-01-31|1997-03-13|1997-02-14|NONE|FOB|st sleep even gifts. dependencies along +161|1029|35|1|19|17670.38|0.01|0.01|A|F|1994-12-13|1994-11-19|1994-12-26|DELIVER IN PERSON|TRUCK|, regular sheaves sleep along +162|1893|80|1|2|3589.78|0.02|0.01|N|O|1995-09-02|1995-06-17|1995-09-08|COLLECT COD|FOB|es! final somas integrate +163|1676|100|1|43|67839.81|0.01|0.00|N|O|1997-09-19|1997-11-19|1997-10-03|COLLECT COD|REG AIR|al, bold dependencies wake. iron +163|1208|9|2|13|14419.60|0.01|0.04|N|O|1997-11-11|1997-10-18|1997-12-07|DELIVER IN PERSON|TRUCK|inal requests. even pinto beans hag +163|369|98|3|27|34272.72|0.04|0.08|N|O|1997-12-26|1997-11-28|1998-01-05|COLLECT COD|REG AIR|ously express dependen +163|1927|72|4|5|9144.60|0.02|0.00|N|O|1997-11-17|1997-10-09|1997-12-05|DELIVER IN PERSON|TRUCK| must belie +163|1261|99|5|12|13947.12|0.10|0.00|N|O|1997-12-18|1997-10-26|1997-12-22|COLLECT COD|TRUCK|ly blithe accounts cajole +163|1909|98|6|20|36218.00|0.00|0.07|N|O|1997-09-27|1997-11-15|1997-10-07|TAKE BACK RETURN|FOB|tructions integrate b +164|914|49|1|26|47187.66|0.09|0.04|A|F|1993-01-04|1992-11-21|1993-01-07|NONE|RAIL|s. blithely special courts are blithel +164|185|38|2|24|26044.32|0.05|0.05|R|F|1992-12-22|1992-11-27|1993-01-06|NONE|AIR|side of the slyly unusual theodolites. f +164|1256|68|3|38|43975.50|0.03|0.06|R|F|1992-12-04|1992-11-23|1993-01-02|TAKE BACK RETURN|AIR|counts cajole fluffily regular packages. b +164|176|3|4|32|34437.44|0.05|0.01|R|F|1992-12-21|1992-12-23|1992-12-28|COLLECT COD|RAIL|ts wake again +164|1476|55|5|43|59231.21|0.06|0.01|R|F|1992-11-26|1993-01-03|1992-12-08|COLLECT COD|RAIL|y carefully regular dep +164|1089|90|6|27|26732.16|0.10|0.04|R|F|1992-12-23|1993-01-16|1993-01-10|DELIVER IN PERSON|AIR|ayers wake carefully a +164|31|57|7|23|21413.69|0.09|0.04|A|F|1992-11-03|1992-12-02|1992-11-12|NONE|REG AIR|ress packages haggle ideas. blithely spec +165|332|89|1|3|3696.99|0.01|0.08|R|F|1993-03-29|1993-03-06|1993-04-12|DELIVER IN PERSON|REG AIR|riously requests. depos +165|1617|41|2|43|65300.23|0.08|0.05|R|F|1993-02-27|1993-04-19|1993-03-03|DELIVER IN PERSON|TRUCK|jole slyly according +165|586|77|3|15|22298.70|0.00|0.05|R|F|1993-04-10|1993-03-29|1993-05-01|COLLECT COD|SHIP| bold packages mainta +165|1392|69|4|49|63376.11|0.07|0.06|A|F|1993-02-20|1993-04-02|1993-03-10|COLLECT COD|REG AIR|uses sleep slyly ruthlessly regular a +165|1551|92|5|27|39218.85|0.01|0.04|R|F|1993-04-27|1993-03-04|1993-05-13|NONE|MAIL|around the ironic, even orb +166|649|12|1|37|57336.68|0.09|0.03|N|O|1995-11-16|1995-10-17|1995-12-13|NONE|MAIL|lar frays wake blithely a +166|1664|65|2|13|20353.58|0.09|0.05|N|O|1995-11-09|1995-11-18|1995-11-14|COLLECT COD|SHIP|fully above the blithely fina +166|997|32|3|41|77817.59|0.07|0.03|N|O|1995-11-13|1995-11-07|1995-12-08|COLLECT COD|FOB|hily along the blithely pending fo +166|451|81|4|8|10811.60|0.05|0.02|N|O|1995-12-30|1995-11-29|1996-01-29|DELIVER IN PERSON|RAIL|e carefully bold +167|1012|13|1|28|25564.28|0.06|0.01|R|F|1993-02-19|1993-02-16|1993-03-03|DELIVER IN PERSON|TRUCK|sly during the u +167|1716|59|2|27|43678.17|0.09|0.00|R|F|1993-05-01|1993-03-31|1993-05-31|TAKE BACK RETURN|FOB|eans affix furiously-- packages +192|971|40|1|23|43055.31|0.00|0.00|N|O|1998-02-05|1998-02-06|1998-03-07|TAKE BACK RETURN|AIR|ly pending theodolites haggle quickly fluf +192|1614|38|2|20|30312.20|0.07|0.01|N|O|1998-03-13|1998-02-02|1998-03-31|TAKE BACK RETURN|REG AIR|tes. carefu +192|1103|76|3|15|15061.50|0.09|0.01|N|O|1998-01-30|1998-02-10|1998-02-23|TAKE BACK RETURN|TRUCK|he ironic requests haggle about +192|1964|97|4|2|3731.92|0.06|0.02|N|O|1998-03-06|1998-02-03|1998-03-24|COLLECT COD|SHIP|s. dependencies nag furiously alongside +192|830|97|5|25|43270.75|0.02|0.03|N|O|1998-02-15|1998-01-11|1998-03-17|COLLECT COD|TRUCK|. carefully regular +192|1411|51|6|45|59058.45|0.00|0.05|N|O|1998-03-11|1998-01-09|1998-04-03|NONE|MAIL|equests. ideas sleep idea +193|927|62|1|9|16451.28|0.06|0.06|A|F|1993-09-17|1993-10-08|1993-09-30|COLLECT COD|TRUCK|against the fluffily regular d +193|1540|61|2|15|21623.10|0.02|0.07|R|F|1993-11-22|1993-10-09|1993-12-05|TAKE BACK RETURN|SHIP|ffily. regular packages d +193|939|74|3|23|42318.39|0.06|0.05|A|F|1993-08-21|1993-10-11|1993-09-02|DELIVER IN PERSON|TRUCK|ly even accounts wake blithely bold +194|26|52|1|17|15742.34|0.05|0.04|R|F|1992-05-24|1992-05-22|1992-05-30|COLLECT COD|AIR| regular deposi +194|1836|80|2|1|1737.83|0.04|0.06|R|F|1992-04-30|1992-05-18|1992-05-23|NONE|REG AIR| regular theodolites. regular, iron +194|660|54|3|13|20288.58|0.08|0.08|A|F|1992-05-07|1992-06-18|1992-05-10|NONE|AIR|about the blit +194|1452|53|4|36|48724.20|0.00|0.05|R|F|1992-05-21|1992-05-18|1992-05-27|TAKE BACK RETURN|RAIL|pecial packages wake after the slyly r +194|562|23|5|8|11700.48|0.04|0.00|R|F|1992-07-06|1992-06-25|1992-07-11|COLLECT COD|FOB|uriously unusual excuses +194|1490|30|6|16|22263.84|0.06|0.03|A|F|1992-05-14|1992-06-14|1992-05-21|TAKE BACK RETURN|TRUCK|y regular requests. furious +194|1679|21|7|21|33194.07|0.02|0.01|R|F|1992-05-06|1992-05-20|1992-05-07|COLLECT COD|REG AIR|accounts detect quickly dogged +195|846|13|1|6|10481.04|0.04|0.02|A|F|1994-01-09|1994-03-27|1994-01-28|COLLECT COD|REG AIR|y, even deposits haggle carefully. bli +195|939|42|2|41|75437.13|0.05|0.07|A|F|1994-02-24|1994-02-11|1994-03-20|NONE|TRUCK|rts detect in place of t +195|855|89|3|34|59698.90|0.08|0.08|R|F|1994-01-31|1994-02-11|1994-02-12|NONE|TRUCK| cajole furiously bold i +195|855|89|4|41|71989.85|0.06|0.04|R|F|1994-03-14|1994-03-13|1994-04-09|COLLECT COD|RAIL|ggle fluffily foxes. fluffily ironic ex +196|1351|28|1|19|23794.65|0.03|0.02|R|F|1993-04-17|1993-05-27|1993-04-30|NONE|SHIP|sts maintain foxes. furiously regular p +196|99|25|2|15|14986.35|0.03|0.04|A|F|1993-07-05|1993-05-08|1993-07-06|TAKE BACK RETURN|SHIP|s accounts. furio +197|985|20|1|39|73553.22|0.02|0.04|N|O|1995-07-21|1995-07-01|1995-08-14|TAKE BACK RETURN|AIR|press accounts. daringly sp +197|1772|15|2|8|13390.16|0.09|0.02|A|F|1995-04-17|1995-07-01|1995-04-27|DELIVER IN PERSON|SHIP|y blithely even deposits. blithely fina +197|1559|100|3|17|24829.35|0.06|0.02|N|O|1995-08-02|1995-06-23|1995-08-03|COLLECT COD|REG AIR|ts. careful +197|180|33|4|25|27004.50|0.04|0.01|N|F|1995-06-13|1995-05-23|1995-06-24|TAKE BACK RETURN|FOB|s-- quickly final accounts +197|415|45|5|14|18415.74|0.09|0.01|R|F|1995-05-08|1995-05-24|1995-05-12|TAKE BACK RETURN|RAIL|use slyly slyly silent depo +197|1059|30|6|1|960.05|0.07|0.05|N|O|1995-07-15|1995-06-21|1995-08-11|COLLECT COD|RAIL| even, thin dependencies sno +198|561|62|1|33|48231.48|0.07|0.02|N|O|1998-01-05|1998-03-20|1998-01-10|TAKE BACK RETURN|TRUCK|carefully caref +198|153|80|2|20|21063.00|0.03|0.00|N|O|1998-01-15|1998-03-31|1998-01-25|DELIVER IN PERSON|FOB|carefully final escapades a +198|1481|60|3|15|20737.20|0.04|0.02|N|O|1998-04-12|1998-02-26|1998-04-15|COLLECT COD|MAIL|es. quickly pending deposits s +198|104|31|4|35|35143.50|0.08|0.02|N|O|1998-02-27|1998-03-23|1998-03-14|TAKE BACK RETURN|RAIL|ests nod quickly furiously sly pinto be +198|1020|21|5|33|30393.66|0.02|0.01|N|O|1998-03-22|1998-03-12|1998-04-14|DELIVER IN PERSON|SHIP|ending foxes acr +199|1321|36|1|50|61116.00|0.02|0.00|N|O|1996-06-12|1996-06-03|1996-07-04|DELIVER IN PERSON|MAIL|essly regular ideas boost sly +199|1340|41|2|30|37240.20|0.08|0.05|N|O|1996-03-27|1996-05-29|1996-04-14|NONE|TRUCK|ilent packages doze quickly. thinly +224|1502|3|1|16|22456.00|0.04|0.00|A|F|1994-08-01|1994-07-30|1994-08-27|DELIVER IN PERSON|MAIL|y unusual foxes +224|1087|23|2|34|33594.72|0.04|0.08|R|F|1994-07-13|1994-08-25|1994-07-31|COLLECT COD|TRUCK| carefully. final platelets +224|1900|30|3|41|73877.90|0.07|0.04|A|F|1994-09-01|1994-09-15|1994-09-02|TAKE BACK RETURN|SHIP|after the furiou +224|1664|47|4|12|18787.92|0.08|0.06|R|F|1994-10-12|1994-08-29|1994-10-20|DELIVER IN PERSON|MAIL|uriously regular packages. slyly fina +224|939|8|5|45|82796.85|0.07|0.07|R|F|1994-08-14|1994-09-02|1994-08-27|COLLECT COD|AIR|leep furiously regular requests. furiousl +224|501|92|6|4|5606.00|0.02|0.00|R|F|1994-09-08|1994-08-24|1994-10-04|DELIVER IN PERSON|FOB|tructions +225|1720|21|1|4|6486.88|0.09|0.07|N|O|1995-08-05|1995-08-19|1995-09-03|TAKE BACK RETURN|SHIP|ng the ironic packages. asymptotes among +225|1306|21|2|3|3621.90|0.00|0.08|N|O|1995-07-25|1995-07-08|1995-08-17|DELIVER IN PERSON|REG AIR| fluffily about the carefully bold a +225|1983|72|3|45|84824.10|0.06|0.01|N|O|1995-08-17|1995-08-20|1995-08-30|TAKE BACK RETURN|FOB|the slyly even platelets use aro +225|1461|1|4|24|32699.04|0.00|0.06|N|O|1995-09-23|1995-08-05|1995-10-16|COLLECT COD|MAIL|ironic accounts are final account +225|76|52|5|31|30258.17|0.04|0.06|N|O|1995-06-21|1995-07-24|1995-07-04|TAKE BACK RETURN|FOB|special platelets. quickly r +225|1319|34|6|12|14643.72|0.00|0.00|A|F|1995-06-04|1995-07-15|1995-06-08|COLLECT COD|MAIL| unusual requests. bus +225|1413|31|7|44|57834.04|0.10|0.06|N|O|1995-09-22|1995-08-16|1995-10-22|NONE|REG AIR|leep slyly +226|970|5|1|4|7483.88|0.00|0.00|R|F|1993-03-31|1993-04-30|1993-04-10|NONE|TRUCK|c foxes integrate carefully against th +226|1379|94|2|46|58897.02|0.06|0.01|A|F|1993-07-06|1993-04-24|1993-07-13|COLLECT COD|FOB|s. carefully bold accounts cajol +226|374|59|3|35|44602.95|0.09|0.03|A|F|1993-03-31|1993-05-18|1993-04-01|NONE|RAIL|osits cajole. final, even foxes a +226|407|95|4|45|58833.00|0.10|0.02|R|F|1993-04-17|1993-05-27|1993-05-11|DELIVER IN PERSON|AIR| carefully pending pi +226|1180|89|5|2|2162.36|0.07|0.02|R|F|1993-03-26|1993-04-13|1993-04-20|TAKE BACK RETURN|SHIP|al platelets. express somas +226|830|97|6|48|83079.84|0.02|0.00|A|F|1993-06-11|1993-05-15|1993-06-19|NONE|REG AIR|efully silent packages. final deposit +226|1180|89|7|14|15136.52|0.09|0.00|R|F|1993-05-20|1993-06-05|1993-05-27|COLLECT COD|MAIL|ep carefully regular accounts. ironic +227|1654|78|1|19|29557.35|0.05|0.06|N|O|1995-12-10|1996-01-30|1995-12-26|NONE|RAIL|s cajole furiously a +227|1742|69|2|24|39449.76|0.07|0.07|N|O|1996-02-03|1995-12-24|1996-02-12|COLLECT COD|SHIP|uses across the blithe dependencies cajol +228|41|67|1|3|2823.12|0.10|0.08|A|F|1993-05-20|1993-04-08|1993-05-26|DELIVER IN PERSON|SHIP|ckages. sly +229|836|3|1|20|34736.60|0.02|0.03|R|F|1994-01-11|1994-01-31|1994-01-26|DELIVER IN PERSON|REG AIR|le. instructions use across the quickly fin +229|1290|91|2|29|34547.41|0.07|0.00|A|F|1994-03-15|1994-03-02|1994-03-26|COLLECT COD|SHIP|s, final request +229|786|87|3|28|47229.84|0.02|0.02|R|F|1994-02-10|1994-02-02|1994-03-10|DELIVER IN PERSON|FOB| final, regular requests. platel +229|1770|55|4|3|5015.31|0.02|0.08|R|F|1994-03-22|1994-03-24|1994-04-04|DELIVER IN PERSON|REG AIR|posits. furiously regular theodol +229|1552|33|5|33|47967.15|0.03|0.06|R|F|1994-03-25|1994-02-11|1994-04-13|NONE|FOB| deposits; bold, ruthless theodolites +229|1054|90|6|29|27696.45|0.04|0.00|R|F|1994-01-14|1994-02-16|1994-01-22|NONE|FOB|uriously pending +230|1859|46|1|46|80999.10|0.09|0.00|R|F|1994-02-03|1994-01-15|1994-02-23|TAKE BACK RETURN|SHIP|old packages ha +230|1950|95|2|6|11111.70|0.03|0.08|A|F|1994-01-26|1994-01-25|1994-02-13|NONE|REG AIR| sleep furiously about the p +230|74|50|3|1|974.07|0.07|0.06|R|F|1994-01-22|1994-01-03|1994-02-05|TAKE BACK RETURN|RAIL|blithely unusual dolphins. bold, ex +230|92|18|4|44|43651.96|0.08|0.06|R|F|1994-02-09|1994-01-18|1994-03-11|NONE|MAIL|deposits integrate slyly sile +230|190|69|5|8|8721.52|0.09|0.06|R|F|1993-11-03|1994-01-20|1993-11-11|TAKE BACK RETURN|TRUCK|g the instructions. fluffil +230|340|25|6|8|9922.72|0.00|0.05|R|F|1993-11-21|1994-01-05|1993-12-19|TAKE BACK RETURN|FOB|nal ideas. silent, reg +231|1584|85|1|16|23769.28|0.04|0.08|R|F|1994-11-20|1994-10-29|1994-12-17|TAKE BACK RETURN|AIR|e furiously ironic pinto beans. +231|834|34|2|46|79802.18|0.04|0.05|R|F|1994-12-13|1994-12-02|1994-12-14|DELIVER IN PERSON|SHIP|affix blithely. bold requests among the f +231|1982|27|3|50|94199.00|0.09|0.01|A|F|1994-12-11|1994-12-14|1994-12-13|NONE|RAIL|onic packages haggle fluffily a +231|568|69|4|31|45525.36|0.08|0.02|A|F|1994-11-05|1994-12-27|1994-11-30|TAKE BACK RETURN|SHIP|iously special decoys wake q +256|883|17|1|22|39245.36|0.09|0.02|R|F|1994-01-12|1993-12-28|1994-01-26|COLLECT COD|FOB|ke quickly ironic, ironic deposits. reg +256|1184|57|2|40|43407.20|0.10|0.01|A|F|1993-11-30|1993-12-13|1993-12-02|NONE|FOB|nal theodolites. deposits cajole s +256|1292|67|3|45|53698.05|0.02|0.08|R|F|1994-01-14|1994-01-17|1994-02-10|COLLECT COD|SHIP| grouches. ideas wake quickly ar +257|1463|64|1|7|9551.22|0.05|0.02|N|O|1998-06-18|1998-05-15|1998-06-27|COLLECT COD|FOB|ackages sleep bold realms. f +258|1062|68|1|8|7704.48|0.00|0.07|R|F|1994-01-20|1994-03-21|1994-02-09|NONE|REG AIR|ully about the fluffily silent dependencies +258|1962|95|2|40|74558.40|0.10|0.01|A|F|1994-03-13|1994-02-23|1994-04-05|DELIVER IN PERSON|FOB|silent frets nod daringly busy, bold +258|1618|19|3|45|68382.45|0.07|0.07|R|F|1994-03-04|1994-02-13|1994-03-30|DELIVER IN PERSON|TRUCK|regular excuses-- fluffily ruthl +258|1330|69|4|31|38171.23|0.02|0.05|A|F|1994-04-20|1994-03-20|1994-04-28|COLLECT COD|REG AIR| slyly blithely special mul +258|360|89|5|25|31509.00|0.08|0.02|A|F|1994-04-13|1994-02-26|1994-04-29|TAKE BACK RETURN|TRUCK|leep pending packages. +258|1465|5|6|36|49192.56|0.09|0.04|A|F|1994-01-11|1994-03-04|1994-01-18|DELIVER IN PERSON|AIR|nic asymptotes. slyly silent r +259|988|89|1|14|26445.72|0.00|0.08|A|F|1993-12-17|1993-12-09|1993-12-31|COLLECT COD|SHIP|ons against the express acco +259|1620|62|2|14|21302.68|0.03|0.05|R|F|1993-11-10|1993-11-20|1993-11-17|DELIVER IN PERSON|FOB|ully even, regul +259|236|37|3|42|47721.66|0.09|0.00|R|F|1993-10-20|1993-11-18|1993-11-12|NONE|TRUCK|the slyly ironic pinto beans. fi +259|1954|87|4|3|5567.85|0.08|0.06|R|F|1993-10-04|1993-11-07|1993-10-14|TAKE BACK RETURN|SHIP|ng slyly at the accounts. +259|1923|12|5|6|10949.52|0.00|0.05|R|F|1993-12-05|1993-12-22|1993-12-21|COLLECT COD|TRUCK| requests sleep +260|1559|60|1|50|73027.50|0.07|0.08|N|O|1997-03-24|1997-02-09|1997-04-20|TAKE BACK RETURN|REG AIR|c deposits +260|1828|29|2|26|44975.32|0.02|0.07|N|O|1996-12-12|1997-02-06|1996-12-15|NONE|TRUCK|ld theodolites boost fl +260|413|1|3|27|35462.07|0.05|0.08|N|O|1997-03-23|1997-02-15|1997-04-22|TAKE BACK RETURN|RAIL|ions according to the +260|54|5|4|29|27667.45|0.10|0.06|N|O|1997-03-15|1997-01-14|1997-04-13|NONE|MAIL|fluffily even asymptotes. express wa +260|953|22|5|44|81573.80|0.01|0.05|N|O|1997-03-26|1997-02-03|1997-04-19|DELIVER IN PERSON|MAIL|above the blithely ironic instr +261|14|65|1|34|31076.34|0.05|0.08|R|F|1993-08-18|1993-09-24|1993-08-20|COLLECT COD|REG AIR|c packages. asymptotes da +261|657|58|2|20|31153.00|0.00|0.06|R|F|1993-10-21|1993-08-02|1993-11-04|DELIVER IN PERSON|RAIL|ites hinder +261|1740|25|3|28|45968.72|0.08|0.03|R|F|1993-07-24|1993-08-20|1993-08-05|COLLECT COD|AIR|ironic packages nag slyly. carefully fin +261|1185|22|4|49|53222.82|0.04|0.05|R|F|1993-09-12|1993-08-31|1993-10-07|COLLECT COD|SHIP|ions. bold accounts +261|605|99|5|49|73774.40|0.01|0.08|A|F|1993-09-29|1993-09-08|1993-10-01|COLLECT COD|SHIP| pinto beans haggle slyly furiously pending +261|970|5|6|20|37419.40|0.06|0.06|A|F|1993-10-15|1993-09-05|1993-11-07|NONE|AIR|ing to the special, ironic deposi +262|1912|13|1|39|70742.49|0.01|0.05|N|O|1996-01-15|1996-02-18|1996-01-28|COLLECT COD|RAIL|usual, regular requests +262|601|95|2|33|49552.80|0.09|0.03|N|O|1996-03-10|1996-01-31|1996-03-27|TAKE BACK RETURN|AIR|atelets sleep furiously. requests cajole. b +262|587|78|3|35|52065.30|0.05|0.08|N|O|1996-03-12|1996-02-14|1996-04-11|COLLECT COD|MAIL|lites cajole along the pending packag +263|240|68|1|22|25085.28|0.06|0.08|R|F|1994-08-24|1994-06-20|1994-09-09|NONE|FOB|efully express fo +263|846|13|2|9|15721.56|0.08|0.00|A|F|1994-07-21|1994-07-16|1994-08-08|TAKE BACK RETURN|TRUCK|lms wake bl +263|1429|47|3|50|66521.00|0.06|0.04|R|F|1994-08-18|1994-07-31|1994-08-22|NONE|TRUCK|re the packages. special +288|507|98|1|31|43632.50|0.00|0.03|N|O|1997-03-17|1997-04-28|1997-04-06|TAKE BACK RETURN|AIR|instructions wa +288|1164|1|2|49|52192.84|0.08|0.05|N|O|1997-04-19|1997-05-19|1997-05-18|TAKE BACK RETURN|TRUCK|ic excuses sleep always spe +288|989|90|3|36|68039.28|0.02|0.02|N|O|1997-02-22|1997-05-07|1997-03-07|TAKE BACK RETURN|TRUCK|yly pending excu +288|785|86|4|19|32029.82|0.07|0.07|N|O|1997-03-14|1997-04-04|1997-03-26|NONE|MAIL|deposits. blithely quick courts ar +288|1619|2|5|31|47138.91|0.10|0.04|N|O|1997-05-29|1997-04-24|1997-06-20|TAKE BACK RETURN|RAIL|ns. fluffily +289|1733|60|1|25|40868.25|0.07|0.05|N|O|1997-03-18|1997-05-05|1997-04-15|DELIVER IN PERSON|FOB|out the quickly bold theodol +289|1118|27|2|6|6114.66|0.06|0.05|N|O|1997-02-18|1997-05-08|1997-03-19|DELIVER IN PERSON|SHIP|d packages use fluffily furiously +289|170|23|3|44|47087.48|0.10|0.08|N|O|1997-06-05|1997-04-20|1997-07-02|COLLECT COD|MAIL|ly ironic foxes. asymptotes +289|395|24|4|48|62178.72|0.01|0.08|N|O|1997-03-14|1997-03-30|1997-03-24|DELIVER IN PERSON|RAIL|sits cajole. bold pinto beans x-ray fl +289|463|93|5|13|17724.98|0.10|0.03|N|O|1997-06-08|1997-04-06|1997-06-18|TAKE BACK RETURN|REG AIR|ts. quickly bold deposits alongside +290|54|5|1|35|33391.75|0.01|0.02|R|F|1994-04-01|1994-02-05|1994-04-27|NONE|MAIL|ove the final foxes detect slyly fluffily +290|1290|28|2|2|2382.58|0.05|0.04|A|F|1994-01-30|1994-02-13|1994-02-21|TAKE BACK RETURN|TRUCK|. permanently furious reques +290|19|45|3|5|4595.05|0.03|0.05|A|F|1994-01-19|1994-02-24|1994-01-27|NONE|MAIL|ans integrate. requests sleep. fur +290|1238|76|4|23|26202.29|0.05|0.08|R|F|1994-03-14|1994-02-21|1994-04-09|NONE|AIR|refully unusual packages. +291|1226|38|1|21|23671.62|0.05|0.07|A|F|1994-05-26|1994-05-10|1994-06-23|COLLECT COD|TRUCK|y quickly regular theodolites. final t +291|1374|75|2|19|24232.03|0.08|0.02|R|F|1994-06-14|1994-04-25|1994-06-19|NONE|REG AIR|e. ruthlessly final accounts after the +291|609|72|3|30|45288.00|0.10|0.02|R|F|1994-03-22|1994-04-30|1994-03-24|DELIVER IN PERSON|FOB| fluffily regular deposits. quickl +292|1536|37|1|8|11500.24|0.10|0.03|R|F|1992-02-18|1992-03-30|1992-03-18|DELIVER IN PERSON|RAIL|sily bold deposits alongside of the ex +292|993|94|2|24|45455.76|0.08|0.04|R|F|1992-03-24|1992-03-06|1992-04-20|COLLECT COD|TRUCK| bold, pending theodolites u +293|90|66|1|14|13861.26|0.02|0.05|R|F|1992-10-19|1992-12-23|1992-11-10|DELIVER IN PERSON|SHIP|es. packages above the +293|1865|66|2|11|19435.46|0.10|0.04|R|F|1992-12-24|1992-12-01|1993-01-12|COLLECT COD|MAIL| affix carefully quickly special idea +293|1173|82|3|13|13964.21|0.04|0.02|A|F|1992-12-17|1992-12-26|1992-12-22|COLLECT COD|RAIL| wake after the quickly even deposits. bli +294|597|88|1|31|46425.29|0.00|0.01|R|F|1993-08-06|1993-08-19|1993-08-13|TAKE BACK RETURN|AIR|le fluffily along the quick +295|1976|21|1|29|54461.13|0.02|0.07|A|F|1994-11-09|1994-12-08|1994-12-07|COLLECT COD|MAIL|inst the carefully ironic pinto beans. blit +295|914|17|2|26|47187.66|0.04|0.03|R|F|1994-12-13|1994-11-30|1995-01-06|DELIVER IN PERSON|AIR|ts above the slyly regular requests x-ray q +295|153|80|3|8|8425.20|0.10|0.07|R|F|1995-01-13|1994-11-17|1995-01-25|NONE|TRUCK| final instructions h +295|607|39|4|26|39197.60|0.10|0.04|A|F|1995-01-12|1994-11-22|1995-01-22|DELIVER IN PERSON|MAIL| carefully iron +320|45|21|1|30|28351.20|0.05|0.01|N|O|1997-12-04|1998-01-21|1997-12-13|NONE|RAIL| ironic, final accounts wake quick de +320|1922|67|2|13|23710.96|0.03|0.00|N|O|1997-12-16|1997-12-26|1997-12-17|TAKE BACK RETURN|AIR|he furiously regular pinto beans. car +321|4|80|1|21|18984.00|0.01|0.08|A|F|1993-07-18|1993-04-24|1993-08-13|TAKE BACK RETURN|REG AIR|hockey players sleep slyly sl +321|1405|84|2|41|53562.40|0.08|0.07|R|F|1993-06-21|1993-06-07|1993-07-09|NONE|REG AIR|special packages shall have to doze blit +322|1525|6|1|12|17118.24|0.08|0.07|A|F|1992-06-29|1992-05-30|1992-07-11|NONE|AIR|ular theodolites promise qu +322|437|38|2|48|64196.64|0.02|0.07|A|F|1992-06-11|1992-06-16|1992-06-26|COLLECT COD|RAIL|dolites detect qu +322|127|6|3|20|20542.40|0.04|0.01|R|F|1992-04-26|1992-05-04|1992-05-22|DELIVER IN PERSON|MAIL|ckly toward +322|1833|77|4|10|17348.30|0.06|0.03|R|F|1992-04-12|1992-05-13|1992-04-14|DELIVER IN PERSON|AIR| deposits grow slyly according to th +322|117|96|5|35|35598.85|0.07|0.06|A|F|1992-07-17|1992-05-03|1992-08-14|TAKE BACK RETURN|RAIL|egular accounts cajole carefully. even d +322|334|91|6|3|3702.99|0.08|0.05|A|F|1992-07-03|1992-05-10|1992-07-28|NONE|AIR|ending, ironic deposits along the blith +322|375|60|7|5|6376.85|0.01|0.02|A|F|1992-04-15|1992-05-12|1992-04-26|COLLECT COD|REG AIR| special grouches sleep quickly instructio +323|1637|61|1|50|76931.50|0.05|0.04|A|F|1994-04-20|1994-04-25|1994-05-12|DELIVER IN PERSON|REG AIR|cial requests +323|952|87|2|18|33353.10|0.06|0.07|R|F|1994-04-13|1994-06-02|1994-05-10|DELIVER IN PERSON|TRUCK|posits cajole furiously pinto beans. +323|1428|29|3|9|11964.78|0.07|0.04|A|F|1994-06-26|1994-06-10|1994-07-13|COLLECT COD|TRUCK|nic accounts. regular, regular pack +324|1995|84|1|26|49321.74|0.07|0.01|R|F|1992-04-19|1992-05-28|1992-05-12|DELIVER IN PERSON|RAIL|ross the slyly regular s +325|1588|9|1|34|50645.72|0.09|0.04|A|F|1993-10-28|1993-12-13|1993-11-17|TAKE BACK RETURN|MAIL|ly bold deposits. always iron +325|1852|96|2|5|8769.25|0.07|0.08|A|F|1994-01-02|1994-01-05|1994-01-04|TAKE BACK RETURN|MAIL| theodolites. +325|188|15|3|35|38086.30|0.07|0.07|A|F|1993-12-06|1994-01-03|1993-12-26|DELIVER IN PERSON|REG AIR|packages wa +326|1791|76|1|41|69404.39|0.06|0.03|N|O|1995-08-30|1995-07-09|1995-09-12|DELIVER IN PERSON|TRUCK|ily quickly bold ideas. +326|195|22|2|38|41617.22|0.02|0.08|N|O|1995-09-12|1995-08-23|1995-09-14|COLLECT COD|RAIL|es sleep slyly. carefully regular inst +326|1838|25|3|25|43495.75|0.03|0.04|N|O|1995-08-03|1995-07-27|1995-08-16|NONE|AIR|ily furiously unusual accounts. +326|849|16|4|5|8749.20|0.03|0.08|N|O|1995-07-29|1995-07-13|1995-08-12|NONE|REG AIR|deas sleep according to the sometimes spe +326|346|3|5|31|38636.54|0.04|0.08|N|O|1995-09-27|1995-07-06|1995-10-22|NONE|TRUCK|cies sleep quick +326|1568|89|6|41|60251.96|0.02|0.00|N|O|1995-07-05|1995-07-23|1995-07-20|TAKE BACK RETURN|REG AIR|to beans wake before the furiously re +326|422|52|7|47|62153.74|0.04|0.04|N|O|1995-09-16|1995-07-04|1995-10-04|NONE|REG AIR| special accounts sleep +327|1436|54|1|16|21398.88|0.03|0.01|N|O|1995-07-05|1995-06-07|1995-07-09|TAKE BACK RETURN|TRUCK|cial ideas sleep af +327|418|48|2|9|11865.69|0.09|0.05|A|F|1995-05-24|1995-07-11|1995-06-05|NONE|AIR| asymptotes are fu +352|638|39|1|17|26156.71|0.07|0.05|R|F|1994-06-02|1994-05-31|1994-06-29|NONE|FOB|pending deposits sleep furiously +353|1194|67|1|41|44902.79|0.00|0.06|A|F|1994-03-25|1994-03-31|1994-03-30|DELIVER IN PERSON|AIR|refully final theodoli +353|1476|77|2|29|39946.63|0.09|0.00|A|F|1994-01-11|1994-03-19|1994-02-09|COLLECT COD|FOB|ctions impr +353|1344|59|3|12|14944.08|0.06|0.01|R|F|1994-01-02|1994-03-26|1994-01-19|DELIVER IN PERSON|RAIL|g deposits cajole +353|771|36|4|46|76901.42|0.00|0.04|A|F|1994-04-14|1994-01-31|1994-05-05|DELIVER IN PERSON|FOB| ironic dolphins +353|1169|42|5|9|9631.44|0.02|0.02|A|F|1994-03-15|1994-03-20|1994-03-18|TAKE BACK RETURN|RAIL|ual accounts! carefu +353|1027|28|6|39|36192.78|0.02|0.05|A|F|1994-01-15|1994-03-30|1994-02-01|NONE|MAIL|losely quickly even accounts. c +354|495|25|1|14|19536.86|0.08|0.04|N|O|1996-04-12|1996-06-03|1996-05-08|NONE|SHIP|quickly regular grouches will eat. careful +354|1939|72|2|24|44182.32|0.01|0.01|N|O|1996-05-08|1996-05-17|1996-06-07|DELIVER IN PERSON|AIR|y silent requests. regular, even accounts +354|582|83|3|50|74129.00|0.08|0.05|N|O|1996-03-21|1996-05-20|1996-04-04|COLLECT COD|TRUCK|to beans s +354|1067|73|4|7|6776.42|0.06|0.01|N|O|1996-05-07|1996-04-18|1996-05-24|NONE|MAIL|ously idly ironic accounts-- quickl +354|306|7|5|18|21713.40|0.04|0.08|N|O|1996-03-31|1996-05-13|1996-04-27|DELIVER IN PERSON|RAIL| about the carefully unusual +354|611|43|6|36|54417.96|0.03|0.02|N|O|1996-03-19|1996-05-29|1996-03-30|NONE|AIR|onic requests thrash bold g +354|47|98|7|14|13258.56|0.01|0.07|N|O|1996-07-06|1996-06-08|1996-07-10|TAKE BACK RETURN|MAIL|t thinly above the ironic, +355|1140|13|1|31|32275.34|0.09|0.07|A|F|1994-07-13|1994-08-18|1994-07-18|DELIVER IN PERSON|FOB|y unusual, ironic +355|961|64|2|41|76340.36|0.05|0.00|A|F|1994-08-15|1994-07-19|1994-09-06|DELIVER IN PERSON|TRUCK| deposits. carefully r +356|453|54|1|4|5413.80|0.10|0.01|A|F|1994-07-28|1994-08-01|1994-08-04|DELIVER IN PERSON|REG AIR| the dependencies nod unusual, final ac +356|1075|46|2|48|46851.36|0.02|0.03|R|F|1994-08-12|1994-07-31|1994-08-26|NONE|FOB|unusual packages. furiously +356|1181|18|3|35|37876.30|0.08|0.07|R|F|1994-10-14|1994-07-31|1994-10-23|COLLECT COD|TRUCK|s. unusual, final +356|554|15|4|41|59636.55|0.07|0.05|A|F|1994-09-28|1994-09-20|1994-10-07|COLLECT COD|SHIP| according to the express foxes will +356|1243|55|5|37|42336.88|0.05|0.03|A|F|1994-07-15|1994-08-24|1994-08-09|DELIVER IN PERSON|FOB|ndencies are since the packag +357|1132|33|1|26|26861.38|0.06|0.03|N|O|1996-12-28|1996-11-26|1997-01-13|NONE|FOB| carefully pending accounts use a +357|1859|3|2|36|63390.60|0.07|0.06|N|O|1996-12-28|1996-11-13|1997-01-24|DELIVER IN PERSON|AIR|d the carefully even requests. +357|1649|32|3|32|49620.48|0.05|0.07|N|O|1997-01-28|1996-12-29|1997-02-14|NONE|MAIL|y above the carefully final accounts +358|1901|46|1|41|73918.90|0.06|0.01|A|F|1993-11-18|1993-11-14|1993-11-28|NONE|TRUCK|ely frets. furious deposits sleep +358|1900|30|2|32|57660.80|0.05|0.08|A|F|1993-10-18|1993-12-12|1993-10-31|NONE|TRUCK|y final foxes sleep blithely sl +358|1688|71|3|40|63587.20|0.09|0.01|A|F|1993-12-05|1993-11-04|1994-01-01|COLLECT COD|MAIL|ng the ironic theo +358|966|35|4|15|28004.40|0.08|0.08|A|F|1993-10-04|1993-12-17|1993-10-23|TAKE BACK RETURN|MAIL|out the blithely ironic deposits slee +358|287|69|5|18|21371.04|0.01|0.02|R|F|1993-10-07|1993-11-01|1993-10-26|COLLECT COD|SHIP|olphins haggle ironic accounts. f +358|1613|14|6|32|48467.52|0.03|0.05|R|F|1993-12-21|1993-11-06|1994-01-17|DELIVER IN PERSON|RAIL|lyly express deposits +358|830|97|7|45|77887.35|0.05|0.02|A|F|1993-12-08|1993-10-29|1993-12-30|NONE|REG AIR|to beans. regular, unusual deposits sl +359|1660|61|1|30|46849.80|0.00|0.08|A|F|1995-01-06|1995-02-20|1995-01-20|TAKE BACK RETURN|AIR|uses detect spec +359|112|65|2|18|18217.98|0.00|0.03|A|F|1995-01-27|1995-03-18|1995-01-31|DELIVER IN PERSON|RAIL|unusual warthogs. ironically sp +359|1315|54|3|17|20677.27|0.07|0.06|A|F|1995-01-31|1995-03-18|1995-02-10|COLLECT COD|SHIP|sts according to the blithely +359|900|34|4|38|68434.20|0.10|0.08|R|F|1995-03-30|1995-01-20|1995-04-25|DELIVER IN PERSON|RAIL|g furiously. regular, sile +359|1673|56|5|11|17321.37|0.01|0.03|A|F|1995-02-15|1995-01-27|1995-02-18|NONE|FOB|rets wake blithely. slyly final dep +359|1827|57|6|23|39762.86|0.04|0.07|R|F|1995-01-31|1995-03-11|1995-02-16|DELIVER IN PERSON|REG AIR|ic courts snooze quickly furiously final fo +384|1785|70|1|38|64097.64|0.07|0.01|R|F|1992-06-02|1992-04-18|1992-06-10|DELIVER IN PERSON|TRUCK|totes cajole blithely against the even +384|634|66|2|49|75196.87|0.09|0.07|A|F|1992-04-01|1992-04-25|1992-04-18|COLLECT COD|AIR|refully carefully ironic instructions. bl +384|1816|3|3|11|18895.91|0.02|0.08|A|F|1992-04-02|1992-04-21|1992-04-15|COLLECT COD|MAIL|ash carefully +384|921|90|4|11|20041.12|0.00|0.06|R|F|1992-06-24|1992-05-29|1992-07-22|COLLECT COD|TRUCK|nic excuses are furiously above the blith +384|1315|30|5|14|17028.34|0.08|0.06|R|F|1992-06-14|1992-05-29|1992-07-05|DELIVER IN PERSON|TRUCK|ckages are slyly after the slyly specia +385|1665|7|1|7|10966.62|0.05|0.06|N|O|1996-05-23|1996-05-09|1996-06-06|DELIVER IN PERSON|REG AIR| special asymptote +385|531|92|2|46|65850.38|0.08|0.07|N|O|1996-03-29|1996-05-17|1996-04-18|NONE|REG AIR|lthily ironic f +386|1525|46|1|39|55634.28|0.10|0.07|A|F|1995-05-10|1995-02-28|1995-05-25|NONE|SHIP|hely. carefully regular accounts hag +386|682|76|2|16|25322.88|0.06|0.01|A|F|1995-04-12|1995-04-18|1995-05-11|DELIVER IN PERSON|MAIL|lithely fluffi +386|1301|2|3|37|44485.10|0.09|0.04|A|F|1995-05-23|1995-03-01|1995-05-25|TAKE BACK RETURN|MAIL|ending pearls breach fluffily. slyly pen +387|1367|44|1|1|1268.36|0.08|0.03|N|O|1997-05-06|1997-04-23|1997-05-10|NONE|SHIP| pinto beans wake furiously carefu +387|1528|29|2|42|60039.84|0.07|0.05|N|O|1997-05-25|1997-02-25|1997-05-29|DELIVER IN PERSON|RAIL|lithely final theodolites. +387|964|33|3|40|74598.40|0.09|0.02|N|O|1997-03-08|1997-04-18|1997-03-31|COLLECT COD|TRUCK| quickly ironic platelets are slyly. fluff +387|560|61|4|19|27750.64|0.08|0.00|N|O|1997-03-14|1997-04-21|1997-04-04|NONE|REG AIR|gular dependencies +387|1484|24|5|32|44335.36|0.08|0.06|N|O|1997-05-02|1997-04-11|1997-05-11|DELIVER IN PERSON|TRUCK|gle. silent, fur +388|326|11|1|42|51505.44|0.05|0.06|R|F|1993-02-21|1993-02-26|1993-03-15|COLLECT COD|FOB|accounts sleep furiously +388|1279|80|2|46|54292.42|0.07|0.01|A|F|1993-03-22|1993-01-26|1993-03-24|COLLECT COD|FOB|to beans nag about the careful reque +388|645|8|3|40|61825.60|0.06|0.01|A|F|1992-12-24|1993-01-28|1993-01-19|TAKE BACK RETURN|REG AIR|quests against the carefully unusual epi +389|1893|37|1|2|3589.78|0.09|0.00|R|F|1994-04-13|1994-04-10|1994-04-25|TAKE BACK RETURN|RAIL|fts. courts eat blithely even dependenc +390|1066|2|1|10|9670.60|0.02|0.05|N|O|1998-05-26|1998-07-06|1998-06-23|TAKE BACK RETURN|SHIP| requests. final accounts x-ray beside the +390|1234|46|2|17|19298.91|0.09|0.06|N|O|1998-06-07|1998-06-14|1998-07-07|COLLECT COD|SHIP|ending, pending pinto beans wake slyl +390|1833|20|3|46|79802.18|0.07|0.04|N|O|1998-06-06|1998-05-20|1998-06-14|DELIVER IN PERSON|SHIP|cial excuses. bold, pending packages +390|1420|21|4|42|55499.64|0.01|0.05|N|O|1998-06-06|1998-06-22|1998-07-05|COLLECT COD|SHIP|counts nag across the sly, sil +390|1277|15|5|13|15317.51|0.02|0.06|N|O|1998-07-08|1998-05-10|1998-07-18|DELIVER IN PERSON|SHIP|sleep carefully idle packages. blithely +390|1247|22|6|11|12630.64|0.09|0.06|N|O|1998-05-05|1998-05-15|1998-06-01|DELIVER IN PERSON|SHIP|according to the foxes are furiously +390|850|50|7|24|42020.40|0.05|0.02|N|O|1998-04-18|1998-05-19|1998-04-28|TAKE BACK RETURN|AIR|y. enticingly final depos +391|1216|91|1|14|15640.94|0.09|0.02|R|F|1995-02-11|1995-02-03|1995-02-13|TAKE BACK RETURN|TRUCK| escapades sleep furiously about +416|936|71|1|25|45923.25|0.00|0.05|A|F|1993-10-11|1993-11-26|1993-10-21|DELIVER IN PERSON|TRUCK|y final theodolites about +416|1109|18|2|22|22222.20|0.10|0.00|R|F|1993-12-27|1993-12-17|1994-01-09|COLLECT COD|RAIL|rint blithely above the pending sentim +416|1742|85|3|25|41093.50|0.07|0.01|R|F|1993-10-16|1993-12-03|1993-10-29|NONE|AIR|ses boost after the bold requests. +417|396|97|1|39|50559.21|0.01|0.02|A|F|1994-05-31|1994-05-02|1994-06-06|NONE|SHIP|y regular requests wake along +417|693|56|2|18|28686.42|0.00|0.01|R|F|1994-03-29|1994-04-10|1994-04-26|TAKE BACK RETURN|FOB|- final requests sle +417|442|72|3|41|55040.04|0.10|0.01|R|F|1994-04-11|1994-03-08|1994-05-06|COLLECT COD|RAIL|tes. regular requests across the +417|1311|12|4|2|2424.62|0.01|0.03|R|F|1994-02-13|1994-04-19|1994-03-15|DELIVER IN PERSON|SHIP|uriously bol +418|186|13|1|31|33671.58|0.00|0.03|N|F|1995-06-05|1995-06-18|1995-06-26|COLLECT COD|FOB|final theodolites. fluffil +418|11|37|2|1|911.01|0.04|0.07|N|O|1995-06-23|1995-06-16|1995-07-23|DELIVER IN PERSON|AIR|regular, silent pinto +418|349|78|3|3|3748.02|0.04|0.06|N|O|1995-06-29|1995-07-12|1995-07-01|COLLECT COD|AIR|ly furiously regular w +419|1527|8|1|33|47141.16|0.05|0.02|N|O|1996-11-06|1996-12-25|1996-11-20|TAKE BACK RETURN|TRUCK|y above the bli +419|642|5|2|32|49364.48|0.01|0.06|N|O|1996-12-04|1996-12-04|1996-12-24|COLLECT COD|SHIP|blithely regular requests. special pinto +419|705|38|3|15|24085.50|0.07|0.04|N|O|1996-12-17|1996-11-28|1996-12-19|TAKE BACK RETURN|REG AIR| sleep final, regular theodolites. fluffi +419|88|64|4|15|14821.20|0.01|0.02|N|O|1997-01-09|1996-12-22|1997-01-25|COLLECT COD|FOB|of the careful, thin theodolites. quickly s +419|1485|64|5|17|23570.16|0.01|0.00|N|O|1997-01-13|1996-12-20|1997-02-01|COLLECT COD|REG AIR|lar dependencies: carefully regu +420|1009|80|1|5|4550.00|0.04|0.03|N|O|1995-11-04|1996-01-02|1995-11-30|NONE|REG AIR|cajole blit +420|1611|35|2|22|33277.42|0.05|0.04|N|O|1996-01-25|1995-12-16|1996-02-03|TAKE BACK RETURN|AIR|ly against the blithely re +420|476|35|3|45|61941.15|0.09|0.08|N|O|1996-01-14|1996-01-01|1996-01-26|COLLECT COD|FOB| final accounts. furiously express forges +420|748|49|4|12|19784.88|0.08|0.08|N|O|1996-02-05|1996-01-03|1996-02-12|TAKE BACK RETURN|REG AIR|c instructions are +420|730|95|5|37|60337.01|0.02|0.00|N|O|1995-11-16|1995-12-13|1995-11-19|DELIVER IN PERSON|SHIP|rbits. bold requests along the quickl +420|1238|50|6|40|45569.20|0.01|0.05|N|O|1995-11-26|1995-12-26|1995-12-20|TAKE BACK RETURN|FOB| after the special +420|160|61|7|39|41346.24|0.00|0.08|N|O|1995-12-09|1995-12-16|1995-12-31|DELIVER IN PERSON|REG AIR|s. ironic waters about the car +421|1331|32|1|1|1232.33|0.02|0.07|R|F|1992-05-29|1992-04-27|1992-06-09|NONE|TRUCK|oldly busy deposit +422|1519|60|1|25|35512.75|0.10|0.07|N|O|1997-07-01|1997-08-17|1997-07-09|DELIVER IN PERSON|SHIP|carefully bold theodolit +422|1707|50|2|10|16087.00|0.02|0.03|N|O|1997-06-15|1997-08-04|1997-07-08|TAKE BACK RETURN|AIR|he furiously ironic theodolite +422|1760|87|3|46|76440.96|0.09|0.00|N|O|1997-06-21|1997-07-14|1997-06-27|DELIVER IN PERSON|RAIL| ideas. qu +422|1617|41|4|25|37965.25|0.10|0.04|N|O|1997-08-24|1997-07-09|1997-09-22|NONE|FOB|ep along the furiousl +423|1319|96|1|27|32948.37|0.06|0.03|N|O|1996-08-20|1996-08-01|1996-08-23|TAKE BACK RETURN|SHIP|ccounts. blithely regular pack +448|1252|53|1|4|4613.00|0.00|0.04|N|O|1995-11-25|1995-10-20|1995-11-26|TAKE BACK RETURN|MAIL|nts thrash quickly among the b +448|1724|51|2|46|74783.12|0.05|0.00|N|O|1995-08-31|1995-09-30|1995-09-09|COLLECT COD|SHIP| to the fluffily ironic packages. +448|269|24|3|35|40924.10|0.10|0.08|N|O|1995-09-27|1995-11-19|1995-10-20|COLLECT COD|REG AIR|ses nag quickly quickly ir +448|1691|92|4|8|12741.52|0.10|0.00|N|O|1995-11-02|1995-10-16|1995-11-15|COLLECT COD|TRUCK|ounts wake blithely. furiously pending +448|1373|74|5|23|29310.51|0.02|0.05|N|O|1995-09-26|1995-11-02|1995-10-17|NONE|SHIP|ious, final gifts +449|1520|1|1|12|17058.24|0.02|0.08|N|O|1995-11-06|1995-08-25|1995-11-18|TAKE BACK RETURN|SHIP|ly. blithely ironic +449|1085|91|2|4|3944.32|0.10|0.06|N|O|1995-10-27|1995-09-14|1995-11-21|DELIVER IN PERSON|FOB|are fluffily. requests are furiously +449|100|1|3|3|3000.30|0.07|0.08|N|O|1995-07-28|1995-09-11|1995-08-01|NONE|RAIL| bold deposits. express theodolites haggle +449|1577|58|4|22|32528.54|0.07|0.00|N|O|1995-08-17|1995-09-04|1995-09-10|COLLECT COD|FOB|furiously final theodolites eat careful +450|1616|40|1|42|63739.62|0.03|0.00|N|F|1995-06-07|1995-05-29|1995-06-23|TAKE BACK RETURN|SHIP|y asymptotes. regular depen +450|1063|64|2|5|4820.30|0.03|0.02|A|F|1995-04-02|1995-05-06|1995-04-13|TAKE BACK RETURN|TRUCK|the pinto bea +450|1426|5|3|32|42477.44|0.06|0.03|N|O|1995-07-02|1995-04-25|1995-07-30|TAKE BACK RETURN|SHIP| accounts nod fluffily even, pending +450|563|54|4|40|58542.40|0.05|0.03|R|F|1995-03-20|1995-05-25|1995-04-14|NONE|RAIL|ve. asymptote +450|781|82|5|2|3363.56|0.09|0.00|A|F|1995-03-11|1995-05-21|1995-03-16|COLLECT COD|AIR|y even pinto beans; qui +450|1528|69|6|33|47174.16|0.08|0.05|R|F|1995-05-18|1995-05-22|1995-05-23|TAKE BACK RETURN|REG AIR|ily carefully final depo +451|1296|71|1|36|43102.44|0.02|0.06|N|O|1998-06-18|1998-08-14|1998-06-20|TAKE BACK RETURN|AIR|rges can haggle carefully ironic, dogged +451|321|78|2|42|51295.44|0.05|0.01|N|O|1998-08-01|1998-08-05|1998-08-30|DELIVER IN PERSON|TRUCK|express excuses. blithely ironic pin +451|862|63|3|1|1762.86|0.07|0.05|N|O|1998-07-13|1998-07-03|1998-08-04|DELIVER IN PERSON|AIR| carefully ironic packages solve furiously +451|766|63|4|28|46669.28|0.04|0.05|N|O|1998-06-16|1998-07-09|1998-06-17|DELIVER IN PERSON|SHIP| theodolites. even cou +452|1147|48|1|2|2096.28|0.04|0.03|N|O|1997-12-26|1998-01-03|1998-01-12|COLLECT COD|FOB|y express instru +453|1980|69|1|45|84689.10|0.01|0.00|N|O|1997-06-30|1997-08-20|1997-07-19|COLLECT COD|REG AIR|ifts wake carefully. +453|1752|79|2|38|62842.50|0.08|0.04|N|O|1997-06-30|1997-07-08|1997-07-16|DELIVER IN PERSON|REG AIR| furiously f +453|132|85|3|38|39220.94|0.10|0.01|N|O|1997-08-10|1997-07-24|1997-09-07|NONE|SHIP|sts cajole. furiously un +453|958|59|4|45|83652.75|0.10|0.01|N|O|1997-09-18|1997-06-29|1997-10-14|TAKE BACK RETURN|AIR|ironic foxes. slyly pending depos +453|258|86|5|32|37064.00|0.04|0.01|N|O|1997-07-15|1997-06-27|1997-07-18|NONE|REG AIR|s. fluffily bold packages cajole. unu +453|944|79|6|28|51658.32|0.07|0.07|N|O|1997-08-16|1997-08-12|1997-08-27|NONE|MAIL|final dependencies. slyly special pl +454|1176|85|1|24|25852.08|0.06|0.01|N|O|1996-04-26|1996-03-23|1996-05-20|NONE|TRUCK|le. deposits after the ideas nag unusual pa +455|1565|86|1|42|61595.52|0.10|0.02|N|O|1997-01-26|1997-01-10|1997-02-22|DELIVER IN PERSON|REG AIR|around the quickly blit +455|273|74|2|44|51623.88|0.05|0.08|N|O|1997-01-17|1997-02-22|1997-02-12|TAKE BACK RETURN|TRUCK| accounts sleep slyly ironic asymptote +455|484|43|3|45|62301.60|0.04|0.06|N|O|1996-12-20|1997-01-31|1997-01-07|TAKE BACK RETURN|SHIP|thrash ironically regular packages. qui +455|1701|28|4|11|17629.70|0.01|0.02|N|O|1997-03-15|1997-02-14|1997-03-26|DELIVER IN PERSON|MAIL|g deposits against the slyly idle foxes u +480|522|23|1|22|31295.44|0.04|0.02|A|F|1993-06-16|1993-07-28|1993-07-09|NONE|MAIL|into beans cajole furiously. accounts s +481|187|66|1|17|18482.06|0.07|0.05|A|F|1992-10-21|1992-12-09|1992-11-19|DELIVER IN PERSON|MAIL|. quickly final accounts among the +481|207|8|2|19|21036.80|0.08|0.01|R|F|1993-01-09|1992-11-27|1993-01-14|TAKE BACK RETURN|AIR|p blithely after t +481|1858|59|3|42|73913.70|0.08|0.08|A|F|1992-11-27|1992-11-11|1992-12-08|COLLECT COD|RAIL|mptotes are furiously among the iron +481|811|78|4|11|18829.91|0.05|0.06|A|F|1993-01-12|1992-11-17|1993-02-05|NONE|FOB|eful attai +481|1120|93|5|31|31654.72|0.05|0.01|A|F|1993-01-15|1992-12-31|1993-01-21|DELIVER IN PERSON|AIR|usly final packages believe. quick +482|1374|75|1|32|40811.84|0.00|0.02|N|O|1996-05-22|1996-05-14|1996-05-29|NONE|SHIP|usual deposits affix against +482|1214|26|2|1|1115.21|0.05|0.08|N|O|1996-05-29|1996-05-20|1996-05-31|COLLECT COD|AIR|es. quickly ironic escapades sleep furious +482|612|75|3|31|46890.91|0.04|0.03|N|O|1996-06-01|1996-05-06|1996-06-17|NONE|MAIL| blithe pin +482|1959|60|4|8|14887.60|0.02|0.05|N|O|1996-04-19|1996-05-05|1996-04-21|NONE|TRUCK|tructions near the final, regular ideas de +482|383|40|5|46|59035.48|0.01|0.06|N|O|1996-07-19|1996-06-05|1996-08-10|NONE|MAIL|furiously thin realms. final, fina +482|787|88|6|19|32067.82|0.04|0.00|N|O|1996-03-27|1996-04-25|1996-04-15|NONE|FOB|ts hinder carefully silent requests +483|327|56|1|8|9818.56|0.00|0.08|N|O|1995-08-22|1995-08-23|1995-09-18|COLLECT COD|RAIL|osits. carefully fin +483|798|99|2|23|39072.17|0.04|0.06|N|O|1995-07-20|1995-08-11|1995-08-04|DELIVER IN PERSON|MAIL|requests was quickly against th +483|878|12|3|9|16009.83|0.04|0.03|N|O|1995-09-10|1995-09-02|1995-09-13|NONE|AIR| carefully express ins +484|302|59|1|49|58912.70|0.10|0.02|N|O|1997-03-06|1997-02-28|1997-03-23|COLLECT COD|TRUCK|ven accounts +484|320|5|2|45|54914.40|0.06|0.07|N|O|1997-04-09|1997-03-20|1997-04-19|DELIVER IN PERSON|TRUCK|usly final excuses boost slyly blithe +484|1834|78|3|50|86791.50|0.06|0.05|N|O|1997-01-24|1997-03-27|1997-02-22|DELIVER IN PERSON|MAIL|uctions wake. final, silent requests haggle +484|1649|50|4|22|34114.08|0.07|0.03|N|O|1997-04-29|1997-03-26|1997-05-17|TAKE BACK RETURN|SHIP|es are pending instructions. furiously unu +484|764|29|5|48|79908.48|0.00|0.05|N|O|1997-03-05|1997-02-08|1997-03-22|TAKE BACK RETURN|MAIL|l, bold packages? even mult +484|969|4|6|10|18699.60|0.01|0.08|N|O|1997-04-06|1997-02-14|1997-04-16|COLLECT COD|FOB|x fluffily carefully regular +485|1496|97|1|50|69874.50|0.01|0.00|N|O|1997-03-28|1997-05-26|1997-04-18|TAKE BACK RETURN|MAIL|iously quick excuses. carefully final f +485|280|35|2|40|47211.20|0.08|0.01|N|O|1997-04-29|1997-05-08|1997-04-30|TAKE BACK RETURN|TRUCK|al escapades +485|1369|84|3|22|27947.92|0.00|0.05|N|O|1997-04-06|1997-04-27|1997-05-01|DELIVER IN PERSON|TRUCK|refully final notornis haggle according +486|755|56|1|36|59607.00|0.00|0.01|N|O|1996-06-25|1996-05-06|1996-07-07|COLLECT COD|AIR|deposits around the quickly regular packa +486|671|72|2|40|62866.80|0.03|0.08|N|O|1996-05-21|1996-06-06|1996-06-07|COLLECT COD|SHIP|ts nag quickly among the slyl +486|1360|99|3|26|32795.36|0.04|0.03|N|O|1996-03-16|1996-05-25|1996-03-31|NONE|RAIL|forges along the +486|719|84|4|38|61548.98|0.08|0.05|N|O|1996-05-07|1996-04-26|1996-05-26|TAKE BACK RETURN|TRUCK| blithely final pinto +486|281|63|5|3|3543.84|0.07|0.05|N|O|1996-07-07|1996-04-20|1996-07-23|DELIVER IN PERSON|RAIL|ccounts ha +486|466|96|6|46|62857.16|0.00|0.03|N|O|1996-04-18|1996-05-02|1996-04-20|COLLECT COD|AIR|theodolites eat carefully furious +487|919|20|1|47|85535.77|0.06|0.06|R|F|1992-09-30|1992-10-08|1992-10-24|NONE|TRUCK|tions. blithely reg +487|821|22|2|2|3443.64|0.02|0.06|R|F|1992-10-19|1992-11-04|1992-11-11|COLLECT COD|TRUCK|oss the unusual pinto beans. reg +512|1889|33|1|19|34026.72|0.08|0.05|N|O|1995-07-12|1995-07-11|1995-08-04|COLLECT COD|MAIL| sleep. requests alongside of the fluff +512|229|84|2|37|41781.14|0.01|0.04|N|O|1995-06-20|1995-07-05|1995-07-16|NONE|RAIL|nic depths cajole? blithely b +512|1795|96|3|40|67871.60|0.05|0.02|N|O|1995-07-06|1995-07-08|1995-07-08|COLLECT COD|TRUCK|quests are da +512|825|92|4|10|17258.20|0.09|0.02|N|O|1995-09-16|1995-07-29|1995-10-07|NONE|AIR|xes. pinto beans cajole carefully; +512|642|43|5|6|9255.84|0.03|0.05|R|F|1995-06-10|1995-06-21|1995-06-16|DELIVER IN PERSON|FOB|en ideas haggle +512|321|50|6|12|14655.84|0.04|0.00|R|F|1995-05-21|1995-08-03|1995-06-09|COLLECT COD|FOB|old furiously express deposits. specia +512|508|39|7|2|2817.00|0.09|0.08|N|O|1995-06-19|1995-08-13|1995-06-24|NONE|TRUCK|e slyly silent accounts serve with +513|618|12|1|20|30372.20|0.09|0.07|N|O|1995-07-12|1995-05-31|1995-07-31|NONE|AIR|efully ironic ideas doze slyl +513|1217|29|2|44|49201.24|0.01|0.01|N|O|1995-07-14|1995-07-14|1995-08-12|NONE|MAIL|kages sleep boldly ironic theodolites. acco +514|788|21|1|21|35464.38|0.06|0.02|N|O|1996-06-09|1996-05-15|1996-07-07|DELIVER IN PERSON|RAIL|s sleep quickly blithely +514|1175|12|2|34|36589.78|0.08|0.02|N|O|1996-04-14|1996-06-03|1996-04-23|COLLECT COD|REG AIR|ily even patterns. bold, silent instruc +514|129|56|3|6|6174.72|0.06|0.01|N|O|1996-05-30|1996-06-04|1996-06-28|COLLECT COD|SHIP|as haggle blithely; quickly s +514|1154|55|4|43|45371.45|0.00|0.08|N|O|1996-06-07|1996-05-14|1996-07-01|TAKE BACK RETURN|FOB|thely regular +515|1041|77|1|10|9420.40|0.03|0.02|A|F|1993-10-04|1993-11-03|1993-10-08|NONE|FOB|ar deposits th +515|1477|56|2|38|52381.86|0.10|0.07|A|F|1993-09-19|1993-11-12|1993-10-03|DELIVER IN PERSON|SHIP|ays. furiously express requests haggle furi +515|1822|52|3|11|18962.02|0.00|0.02|R|F|1993-09-04|1993-10-02|1993-09-05|DELIVER IN PERSON|FOB|ly pending accounts haggle blithel +515|1087|88|4|34|33594.72|0.09|0.03|R|F|1993-10-03|1993-10-26|1993-10-15|DELIVER IN PERSON|REG AIR|ic dependencie +515|1309|48|5|32|38729.60|0.01|0.07|R|F|1993-10-10|1993-10-08|1993-11-02|TAKE BACK RETURN|FOB|r sauternes boost. final theodolites wake a +515|1087|58|6|25|24702.00|0.04|0.08|R|F|1993-11-14|1993-11-07|1993-12-03|DELIVER IN PERSON|MAIL|e packages engag +516|250|5|1|11|12652.75|0.01|0.06|N|O|1998-05-02|1998-05-23|1998-05-12|DELIVER IN PERSON|FOB|ongside of the blithely final reque +517|446|47|1|28|37700.32|0.03|0.02|N|O|1997-04-30|1997-05-18|1997-05-17|COLLECT COD|MAIL| requests. special, fi +517|1554|95|2|15|21833.25|0.02|0.00|N|O|1997-04-09|1997-06-26|1997-05-01|NONE|TRUCK| slyly. express requests ar +517|410|40|3|9|11793.69|0.04|0.00|N|O|1997-05-03|1997-06-16|1997-05-24|COLLECT COD|SHIP| slyly stealthily express instructions. +517|1322|23|4|11|13456.52|0.06|0.02|N|O|1997-06-20|1997-06-01|1997-06-27|NONE|REG AIR|ly throughout the fu +517|234|89|5|23|26087.29|0.00|0.01|N|O|1997-04-19|1997-05-07|1997-05-12|COLLECT COD|RAIL| kindle. furiously bold requests mus +518|1648|49|1|30|46489.20|0.07|0.05|N|O|1998-02-18|1998-03-27|1998-03-16|COLLECT COD|TRUCK|slyly by the packages. carefull +518|832|32|2|23|39855.09|0.05|0.07|N|O|1998-02-20|1998-05-05|1998-03-11|COLLECT COD|TRUCK| special requests. fluffily ironic re +518|1332|9|3|12|14799.96|0.01|0.06|N|O|1998-03-08|1998-03-31|1998-04-06|NONE|AIR| packages thrash slyly +518|1220|21|4|46|51576.12|0.07|0.02|N|O|1998-04-07|1998-04-17|1998-04-29|NONE|MAIL|. blithely even ideas cajole furiously. b +518|701|2|5|16|25627.20|0.01|0.01|N|O|1998-03-15|1998-03-24|1998-04-08|NONE|MAIL|use quickly expre +518|1964|53|6|39|72772.44|0.09|0.08|N|O|1998-02-26|1998-03-17|1998-03-21|DELIVER IN PERSON|FOB| the bold, special deposits are carefully +518|1860|4|7|48|84569.28|0.03|0.07|N|O|1998-03-06|1998-04-22|1998-03-14|NONE|FOB| slyly final platelets; quickly even deposi +519|1590|71|1|1|1491.59|0.07|0.07|N|O|1997-12-01|1998-01-26|1997-12-23|COLLECT COD|REG AIR|bold requests believe furiou +519|30|31|2|38|35341.14|0.05|0.08|N|O|1998-02-19|1997-12-15|1998-03-19|DELIVER IN PERSON|FOB|gular excuses detect quickly furiously +519|1059|30|3|19|18240.95|0.00|0.02|N|O|1998-01-09|1998-01-03|1998-02-06|COLLECT COD|AIR|asymptotes. p +519|463|51|4|27|36813.42|0.08|0.06|N|O|1997-11-20|1997-12-06|1997-12-16|DELIVER IN PERSON|REG AIR|le. even, final dependencies +519|91|42|5|13|12884.17|0.06|0.08|N|O|1998-02-06|1997-12-02|1998-03-03|TAKE BACK RETURN|TRUCK|c accounts wake along the ironic so +519|1510|91|6|3|4234.53|0.04|0.00|N|O|1998-02-01|1998-01-25|1998-02-27|TAKE BACK RETURN|FOB|erve blithely blithely ironic asymp +544|1385|86|1|47|60459.86|0.08|0.06|R|F|1993-03-14|1993-03-27|1993-03-27|COLLECT COD|SHIP|ecial pains. deposits grow foxes. +545|1696|97|1|4|6390.76|0.02|0.00|N|O|1996-02-23|1995-12-16|1996-03-21|DELIVER IN PERSON|FOB|, ironic grouches cajole over +545|1702|87|2|18|28866.60|0.00|0.00|N|O|1996-02-21|1996-01-17|1996-02-26|NONE|RAIL|al, final packages affix. even a +546|846|46|1|16|27949.44|0.08|0.02|N|O|1997-02-04|1996-12-30|1997-02-25|DELIVER IN PERSON|TRUCK|de of the orbits. sometimes regula +547|708|73|1|44|70782.80|0.08|0.08|N|O|1996-10-18|1996-08-17|1996-10-27|TAKE BACK RETURN|FOB|thely express dependencies. qu +547|1364|41|2|48|60737.28|0.01|0.04|N|O|1996-10-21|1996-08-04|1996-11-20|COLLECT COD|SHIP|thely specia +547|1814|1|3|3|5147.43|0.05|0.02|N|O|1996-09-04|1996-08-01|1996-09-21|COLLECT COD|SHIP|pinto beans. ironi +548|1966|67|1|2|3735.92|0.06|0.05|A|F|1994-11-26|1994-11-06|1994-12-06|COLLECT COD|MAIL|ests haggle quickly eve +548|47|48|2|6|5682.24|0.00|0.08|A|F|1995-01-18|1994-12-08|1995-02-10|NONE|TRUCK|sits wake furiously regular +548|2|78|3|21|18942.00|0.03|0.08|A|F|1995-01-13|1994-12-18|1995-01-25|NONE|AIR|ideas. special accounts above the furiou +548|568|59|4|21|30839.76|0.08|0.03|A|F|1994-10-27|1994-12-04|1994-11-21|DELIVER IN PERSON|AIR| engage quickly. regular theo +548|930|33|5|19|34787.67|0.00|0.02|A|F|1994-09-24|1994-11-24|1994-10-01|DELIVER IN PERSON|MAIL|courts boost care +548|1528|9|6|32|45744.64|0.06|0.04|A|F|1994-12-16|1994-11-20|1994-12-29|NONE|REG AIR|c instruction +549|1951|40|1|18|33353.10|0.07|0.04|R|F|1992-10-19|1992-08-12|1992-11-13|COLLECT COD|REG AIR|furiously according to the ironic, regular +549|1888|89|2|38|68015.44|0.07|0.05|A|F|1992-08-17|1992-08-28|1992-09-05|COLLECT COD|RAIL|the regular, furious excuses. carefu +549|653|54|3|36|55931.40|0.08|0.04|R|F|1992-09-11|1992-10-11|1992-09-12|DELIVER IN PERSON|AIR|ts against the ironic, even theodolites eng +549|202|84|4|18|19839.60|0.09|0.01|A|F|1992-07-31|1992-09-11|1992-08-08|NONE|RAIL|ely regular accounts above the +549|235|17|5|38|43138.74|0.06|0.02|R|F|1992-08-23|1992-08-12|1992-08-25|COLLECT COD|REG AIR|eposits. carefully regular depos +550|1904|49|1|31|55982.90|0.04|0.02|N|O|1995-10-24|1995-09-27|1995-11-04|COLLECT COD|AIR|thely silent packages. unusual +551|238|66|1|8|9105.84|0.08|0.02|N|O|1995-07-29|1995-07-18|1995-08-02|NONE|REG AIR| wake quickly slyly pending platel +551|1589|70|2|20|29811.60|0.00|0.07|N|O|1995-09-18|1995-08-25|1995-10-11|COLLECT COD|TRUCK|r ideas. final, even ideas hinder alongside +551|1611|94|3|16|24201.76|0.07|0.06|N|O|1995-07-29|1995-08-19|1995-08-10|COLLECT COD|MAIL|y along the carefully ex +576|865|32|1|2|3531.72|0.07|0.01|N|O|1997-05-15|1997-06-30|1997-05-28|NONE|RAIL|ccounts along the ac +576|331|88|2|6|7387.98|0.06|0.05|N|O|1997-05-15|1997-07-26|1997-06-03|DELIVER IN PERSON|TRUCK|al deposits. slyly even sauternes a +576|366|95|3|6|7598.16|0.08|0.07|N|O|1997-08-28|1997-06-16|1997-09-25|DELIVER IN PERSON|FOB|ts. ironic multipliers +576|1377|54|4|5|6391.85|0.03|0.07|N|O|1997-06-11|1997-06-17|1997-07-05|NONE|REG AIR|l foxes boost slyly. accounts af +577|259|14|1|25|28981.25|0.06|0.01|A|F|1995-04-09|1995-02-20|1995-05-09|TAKE BACK RETURN|AIR|ve slyly of the frets. careful +577|633|96|2|14|21470.82|0.08|0.03|R|F|1995-03-19|1995-02-25|1995-04-09|DELIVER IN PERSON|RAIL|l accounts wake deposits. ironic packa +578|1556|57|1|40|58302.00|0.02|0.08|N|O|1997-02-10|1997-03-18|1997-02-11|NONE|SHIP|usly even platel +578|1871|58|2|23|40776.01|0.05|0.08|N|O|1997-03-06|1997-03-03|1997-03-20|TAKE BACK RETURN|FOB|nstructions. ironic deposits +579|1507|88|1|9|12676.50|0.00|0.05|N|O|1998-06-20|1998-04-28|1998-07-19|DELIVER IN PERSON|RAIL|e ironic, express deposits are furiously +579|322|79|2|39|47670.48|0.02|0.01|N|O|1998-06-21|1998-06-03|1998-06-26|COLLECT COD|REG AIR|ncies. furiously final r +579|591|52|3|6|8949.54|0.03|0.00|N|O|1998-04-24|1998-05-03|1998-05-08|TAKE BACK RETURN|TRUCK|ickly final requests-- bold accou +579|62|88|4|41|39444.46|0.04|0.05|N|O|1998-05-28|1998-05-01|1998-06-04|COLLECT COD|REG AIR|bold, express requests sublate slyly. blith +579|127|54|5|28|28759.36|0.00|0.03|N|O|1998-07-10|1998-05-24|1998-07-19|NONE|RAIL|ic ideas until th +579|1668|10|6|5|7848.30|0.05|0.08|N|O|1998-05-02|1998-04-25|1998-05-05|COLLECT COD|REG AIR|refully silent ideas cajole furious +580|850|50|1|33|57778.05|0.03|0.05|N|O|1997-10-11|1997-09-19|1997-10-16|TAKE BACK RETURN|FOB|y express theodolites cajole carefully +580|1734|35|2|31|50707.63|0.04|0.08|N|O|1997-10-04|1997-09-08|1997-10-15|COLLECT COD|FOB|ose alongside of the sl +580|1845|89|3|19|33189.96|0.04|0.04|N|O|1997-07-23|1997-09-21|1997-08-15|NONE|FOB|mong the special packag +581|634|97|1|41|62919.83|0.09|0.07|N|O|1997-05-26|1997-04-06|1997-06-10|TAKE BACK RETURN|MAIL|nts. quickly +581|926|61|2|14|25576.88|0.06|0.08|N|O|1997-05-17|1997-04-14|1997-06-08|NONE|MAIL|. deposits s +581|1002|73|3|49|44247.00|0.10|0.02|N|O|1997-02-27|1997-04-24|1997-03-10|TAKE BACK RETURN|MAIL|. slyly regular pinto beans acr +581|750|15|4|30|49522.50|0.10|0.08|N|O|1997-06-19|1997-05-21|1997-06-22|TAKE BACK RETURN|TRUCK| regular ideas grow furio +582|565|56|1|7|10258.92|0.07|0.00|N|O|1997-11-16|1997-11-29|1997-12-10|TAKE BACK RETURN|FOB|ithely unusual t +582|503|4|2|49|68771.50|0.05|0.03|N|O|1997-12-17|1998-01-12|1997-12-31|COLLECT COD|REG AIR|nts according to the furiously regular pin +582|1404|83|3|42|54826.80|0.07|0.00|N|O|1997-11-15|1997-12-21|1997-12-03|COLLECT COD|SHIP|iously beside the silent de +582|1678|79|4|36|56868.12|0.06|0.01|N|O|1997-12-09|1997-11-27|1997-12-26|TAKE BACK RETURN|SHIP|lar requests. quickly +583|1444|45|1|1|1345.44|0.07|0.07|N|O|1997-06-17|1997-04-29|1997-06-28|NONE|TRUCK| regular, regular ideas. even, bra +583|1197|34|2|47|51614.93|0.10|0.06|N|O|1997-07-14|1997-05-12|1997-08-11|DELIVER IN PERSON|AIR|nts are fluffily. furiously even re +583|1295|33|3|34|40673.86|0.01|0.02|N|O|1997-05-11|1997-04-24|1997-06-03|DELIVER IN PERSON|MAIL|express req +583|1413|31|4|33|43375.53|0.10|0.01|N|O|1997-05-28|1997-04-25|1997-06-24|NONE|AIR|kages cajole slyly across the +583|1886|16|5|13|23242.44|0.04|0.06|N|O|1997-06-23|1997-05-29|1997-07-08|COLLECT COD|TRUCK|y sly theodolites. ironi +608|1536|57|1|19|27313.07|0.08|0.06|N|O|1996-04-19|1996-05-02|1996-05-03|DELIVER IN PERSON|RAIL|ideas. the +608|1974|63|2|40|75038.80|0.03|0.01|N|O|1996-05-21|1996-04-11|1996-06-02|NONE|AIR| alongside of the regular tithes. sly +609|656|88|1|21|32689.65|0.01|0.05|R|F|1994-08-24|1994-08-23|1994-08-27|DELIVER IN PERSON|FOB|de of the special warthogs. excu +610|1108|81|1|49|49445.90|0.10|0.07|N|O|1995-08-29|1995-10-26|1995-09-12|TAKE BACK RETURN|SHIP|ular instruc +610|679|73|2|11|17376.37|0.07|0.08|N|O|1995-10-31|1995-10-25|1995-11-18|NONE|MAIL|blithely final +610|1177|78|3|26|28032.42|0.09|0.04|N|O|1995-11-22|1995-09-09|1995-12-04|TAKE BACK RETURN|AIR|cross the furiously even theodolites sl +610|1853|97|4|17|29832.45|0.03|0.03|N|O|1995-11-01|1995-10-30|1995-11-04|COLLECT COD|FOB|p quickly instead of the slyly pending foxe +610|1458|59|5|39|53018.55|0.08|0.05|N|O|1995-10-30|1995-10-21|1995-11-11|TAKE BACK RETURN|REG AIR|counts. ironic warhorses are +610|944|79|6|5|9224.70|0.00|0.07|N|O|1995-08-11|1995-10-22|1995-08-26|TAKE BACK RETURN|FOB|n pinto beans. iro +610|1893|80|7|27|48462.03|0.06|0.03|N|O|1995-09-02|1995-09-19|1995-09-15|NONE|REG AIR| ironic pinto beans haggle. blithe +611|169|48|1|39|41697.24|0.05|0.06|R|F|1993-05-06|1993-04-09|1993-05-22|TAKE BACK RETURN|SHIP|nto beans +611|807|8|2|1|1707.80|0.08|0.07|R|F|1993-05-17|1993-02-26|1993-06-15|DELIVER IN PERSON|MAIL|ts. pending platelets aff +611|1196|33|3|39|42790.41|0.09|0.02|A|F|1993-03-10|1993-03-10|1993-03-17|TAKE BACK RETURN|TRUCK|the evenly bold requests. furious +612|1850|37|1|5|8759.25|0.07|0.00|R|F|1992-11-08|1992-11-20|1992-12-03|TAKE BACK RETURN|RAIL|structions. q +612|1949|94|2|28|51826.32|0.07|0.06|R|F|1993-01-02|1992-12-11|1993-01-30|DELIVER IN PERSON|TRUCK|regular instructions affix bl +612|662|25|3|49|76570.34|0.00|0.08|A|F|1993-01-08|1992-11-25|1993-01-17|TAKE BACK RETURN|REG AIR|theodolite +612|390|19|4|28|36130.92|0.05|0.00|A|F|1992-11-12|1992-12-05|1992-12-02|TAKE BACK RETURN|REG AIR|lyly regular asym +612|878|12|5|1|1778.87|0.08|0.04|R|F|1992-12-18|1992-12-13|1992-12-20|TAKE BACK RETURN|FOB| requests. +612|1883|13|6|33|58901.04|0.10|0.03|R|F|1992-11-30|1992-12-01|1992-12-12|COLLECT COD|MAIL|bove the blithely even ideas. careful +613|901|4|1|17|30632.30|0.06|0.06|N|O|1995-09-23|1995-08-04|1995-10-15|NONE|SHIP|ar dependencie +613|784|81|2|6|10108.68|0.05|0.05|N|O|1995-08-05|1995-08-09|1995-08-08|TAKE BACK RETURN|MAIL|y ironic deposits eat +613|1851|95|3|3|5258.55|0.03|0.01|N|O|1995-09-27|1995-09-11|1995-10-05|NONE|TRUCK|ccounts cajole. +613|1584|85|4|7|10399.06|0.02|0.04|N|O|1995-09-07|1995-08-02|1995-09-16|DELIVER IN PERSON|MAIL|ously blithely final pinto beans. regula +614|1942|31|1|21|38722.74|0.00|0.03|R|F|1993-03-29|1993-01-06|1993-04-16|TAKE BACK RETURN|TRUCK|arefully. slyly express packag +614|1869|13|2|48|85001.28|0.07|0.07|A|F|1993-03-09|1993-01-19|1993-03-19|DELIVER IN PERSON|SHIP|riously special excuses haggle along the +614|1670|94|3|43|67581.81|0.05|0.00|A|F|1993-03-07|1993-02-22|1993-03-18|DELIVER IN PERSON|SHIP| express accounts wake. slyly ironic ins +614|1470|88|4|14|19200.58|0.04|0.06|A|F|1992-12-03|1993-02-14|1992-12-27|DELIVER IN PERSON|SHIP|ular packages haggle about the pack +614|1954|99|5|30|55678.50|0.08|0.07|R|F|1993-01-16|1993-02-08|1993-02-12|TAKE BACK RETURN|FOB|tructions are f +614|1363|40|6|48|60689.28|0.04|0.08|A|F|1992-12-14|1993-01-22|1993-01-11|NONE|TRUCK| regular platelets cajole quickly eve +615|1046|47|1|36|34093.44|0.10|0.01|A|F|1992-06-01|1992-07-14|1992-06-27|NONE|FOB| packages. carefully final pinto bea +640|930|33|1|49|89715.57|0.09|0.02|R|F|1993-03-27|1993-04-17|1993-04-15|NONE|RAIL|s haggle slyly +640|5|31|2|40|36200.00|0.09|0.05|A|F|1993-05-11|1993-04-11|1993-05-15|COLLECT COD|TRUCK|oach according to the bol +640|1795|22|3|22|37329.38|0.05|0.07|A|F|1993-05-07|1993-04-14|1993-05-21|TAKE BACK RETURN|TRUCK|osits across the slyly regular theodo +640|315|16|4|45|54688.95|0.07|0.07|R|F|1993-04-15|1993-04-23|1993-04-21|DELIVER IN PERSON|REG AIR|ong the qui +641|1252|64|1|18|20758.50|0.01|0.08|R|F|1993-10-17|1993-10-11|1993-10-29|DELIVER IN PERSON|AIR|p blithely bold packages. quick +641|995|30|2|1|1895.99|0.09|0.02|R|F|1993-12-03|1993-10-28|1993-12-26|TAKE BACK RETURN|RAIL| nag across the regular foxes. +641|944|79|3|40|73797.60|0.05|0.06|R|F|1993-11-22|1993-10-20|1993-12-11|DELIVER IN PERSON|REG AIR|lets. furiously regular requests cajo +641|701|66|4|25|40042.50|0.03|0.02|A|F|1993-12-04|1993-11-18|1993-12-18|TAKE BACK RETURN|FOB|d, regular d +641|38|89|5|41|38459.23|0.07|0.04|R|F|1993-11-29|1993-10-27|1993-12-04|TAKE BACK RETURN|FOB| asymptotes are quickly. bol +642|537|38|1|26|37375.78|0.10|0.03|A|F|1994-04-16|1994-02-01|1994-04-27|COLLECT COD|REG AIR|quests according to the unu +643|123|2|1|28|28647.36|0.00|0.08|A|F|1995-04-13|1995-05-12|1995-04-14|TAKE BACK RETURN|TRUCK|ly regular requests nag sly +643|502|3|2|48|67320.00|0.01|0.02|N|O|1995-07-10|1995-06-07|1995-08-01|NONE|FOB|ly ironic accounts +643|1625|67|3|23|35112.26|0.05|0.03|N|O|1995-07-09|1995-05-18|1995-07-31|COLLECT COD|RAIL|sits are carefully according to the e +643|448|36|4|39|52589.16|0.08|0.04|A|F|1995-06-08|1995-06-16|1995-06-13|COLLECT COD|RAIL| the pains. carefully s +643|1895|82|5|47|84453.83|0.10|0.03|R|F|1995-04-05|1995-06-14|1995-04-26|DELIVER IN PERSON|RAIL|y against +644|1332|71|1|46|56733.18|0.02|0.01|A|F|1992-05-20|1992-06-14|1992-06-14|DELIVER IN PERSON|RAIL| special requests was sometimes expre +644|1299|11|2|11|13203.19|0.05|0.02|A|F|1992-08-20|1992-07-21|1992-09-11|TAKE BACK RETURN|TRUCK|ealthy pinto beans use carefu +644|1001|72|3|44|39688.00|0.04|0.04|R|F|1992-08-17|1992-07-26|1992-08-20|COLLECT COD|REG AIR|iously ironic pinto beans. bold packa +644|798|95|4|7|11891.53|0.01|0.02|A|F|1992-05-18|1992-07-01|1992-06-07|COLLECT COD|RAIL| regular requests are blithely. slyly +644|493|94|5|23|32050.27|0.02|0.04|R|F|1992-07-31|1992-07-28|1992-08-13|DELIVER IN PERSON|TRUCK|uctions nag quickly alongside of t +644|850|50|6|33|57778.05|0.00|0.07|R|F|1992-08-26|1992-07-27|1992-08-28|NONE|AIR|ages sleep. bold, bo +644|503|34|7|38|53333.00|0.08|0.06|R|F|1992-05-17|1992-07-10|1992-06-06|TAKE BACK RETURN|MAIL| packages. blithely slow accounts nag quic +645|1597|38|1|33|49453.47|0.01|0.02|A|F|1994-12-09|1995-02-21|1995-01-03|NONE|TRUCK|heodolites b +645|1695|96|2|47|75044.43|0.07|0.05|R|F|1995-02-16|1995-02-15|1995-02-25|COLLECT COD|TRUCK|hely regular instructions alon +645|693|56|3|46|73309.74|0.10|0.01|A|F|1995-01-04|1995-02-21|1995-01-21|COLLECT COD|REG AIR| regular dependencies across the speci +645|955|24|4|49|90941.55|0.05|0.03|R|F|1995-01-24|1995-01-06|1995-02-17|NONE|TRUCK|y. slyly iron +645|48|74|5|43|40765.72|0.06|0.02|A|F|1995-02-12|1995-02-27|1995-03-06|TAKE BACK RETURN|REG AIR| furiously accounts. slyly +645|337|94|6|18|22271.94|0.10|0.08|A|F|1995-03-02|1995-02-08|1995-03-03|COLLECT COD|RAIL|ep. slyly even +645|271|72|7|9|10541.43|0.03|0.03|A|F|1994-12-25|1995-01-04|1995-01-15|COLLECT COD|REG AIR|special deposits. regular, final th +646|1090|96|1|31|30723.79|0.00|0.05|R|F|1994-12-17|1995-02-16|1995-01-04|COLLECT COD|MAIL|ag furiousl +646|1268|69|2|1|1169.26|0.07|0.01|A|F|1994-12-05|1995-01-07|1994-12-31|TAKE BACK RETURN|MAIL|t blithely regular deposits. quic +646|298|53|3|24|28758.96|0.06|0.02|A|F|1995-02-20|1994-12-30|1995-03-16|TAKE BACK RETURN|TRUCK|regular accounts haggle dog +646|988|57|4|34|64225.32|0.01|0.00|R|F|1994-12-28|1994-12-27|1994-12-31|COLLECT COD|SHIP|slow accounts. fluffily idle instructions +646|892|59|5|17|30479.13|0.04|0.01|A|F|1994-12-31|1994-12-26|1995-01-01|DELIVER IN PERSON|REG AIR|inal packages haggle carefully +646|1145|18|6|40|41845.60|0.10|0.01|R|F|1995-01-01|1995-01-13|1995-01-11|COLLECT COD|TRUCK|ronic packages sleep across th +647|164|91|1|41|43630.56|0.08|0.08|N|O|1997-11-19|1997-09-24|1997-12-15|COLLECT COD|REG AIR|r instructions. quickly unusu +647|1122|95|2|5|5115.60|0.10|0.00|N|O|1997-09-25|1997-09-22|1997-10-25|TAKE BACK RETURN|AIR|ly express packages haggle caref +647|1529|10|3|15|21457.80|0.08|0.00|N|O|1997-09-23|1997-10-09|1997-10-21|NONE|MAIL|ve the even, bold foxes sleep +672|1722|23|1|41|66572.52|0.06|0.06|R|F|1994-06-20|1994-07-03|1994-06-22|COLLECT COD|REG AIR| dependencies in +672|1897|98|2|9|16190.01|0.03|0.04|R|F|1994-06-25|1994-06-06|1994-07-19|TAKE BACK RETURN|TRUCK|haggle carefully carefully reg +672|1424|42|3|35|46389.70|0.02|0.01|R|F|1994-07-13|1994-06-04|1994-07-14|COLLECT COD|RAIL| dependencies haggle quickly. theo +673|705|70|1|22|35325.40|0.03|0.02|R|F|1994-03-15|1994-04-27|1994-03-29|TAKE BACK RETURN|TRUCK| the regular, even requests. carefully fin +674|1014|50|1|23|21045.23|0.06|0.07|A|F|1992-10-25|1992-10-15|1992-11-03|COLLECT COD|SHIP|ve the quickly even deposits. blithe +674|583|44|2|4|5934.32|0.02|0.07|R|F|1992-10-05|1992-11-22|1992-10-22|NONE|RAIL|ly express pinto beans sleep car +675|1565|86|1|1|1466.56|0.04|0.08|N|O|1997-11-27|1997-09-30|1997-12-12|DELIVER IN PERSON|REG AIR|ide of the slyly regular packages. unus +675|1367|82|2|35|44392.60|0.08|0.07|N|O|1997-08-19|1997-10-16|1997-09-17|DELIVER IN PERSON|REG AIR|s. furiously expre +675|1759|2|3|34|56465.50|0.10|0.04|N|O|1997-11-17|1997-10-07|1997-11-27|NONE|FOB|y final accounts unwind around the +675|993|96|4|15|28409.85|0.09|0.05|N|O|1997-10-18|1997-09-28|1997-11-13|COLLECT COD|TRUCK|posits after the furio +675|47|73|5|46|43563.84|0.09|0.05|N|O|1997-09-18|1997-10-14|1997-10-01|DELIVER IN PERSON|AIR| deposits along the express foxes +676|510|1|1|9|12694.59|0.09|0.02|N|O|1997-04-03|1997-02-02|1997-04-08|COLLECT COD|REG AIR|aintain sl +676|777|74|2|20|33555.40|0.07|0.07|N|O|1997-02-02|1997-02-01|1997-02-11|NONE|REG AIR|riously around the blithely +676|1624|25|3|35|53396.70|0.05|0.01|N|O|1996-12-30|1997-01-13|1997-01-19|DELIVER IN PERSON|RAIL|into beans. blithe +676|729|26|4|24|39113.28|0.01|0.06|N|O|1997-02-05|1997-01-16|1997-03-07|TAKE BACK RETURN|TRUCK|ress, regular dep +676|1652|76|5|31|48163.15|0.01|0.06|N|O|1997-02-06|1997-02-28|1997-03-08|COLLECT COD|TRUCK|ial deposits cajo +676|760|61|6|33|54805.08|0.09|0.05|N|O|1997-03-02|1997-02-22|1997-03-19|TAKE BACK RETURN|TRUCK|as wake slyly furiously close pinto b +676|1422|1|7|11|14557.62|0.07|0.02|N|O|1997-03-09|1997-03-06|1997-03-31|TAKE BACK RETURN|MAIL|he final acco +677|590|21|1|32|47698.88|0.04|0.08|R|F|1994-01-06|1994-01-31|1994-02-02|NONE|RAIL|slyly final +677|1674|75|2|39|61451.13|0.00|0.07|R|F|1993-12-19|1994-02-11|1994-01-05|TAKE BACK RETURN|SHIP|ges. furiously regular packages use +677|233|34|3|46|52128.58|0.01|0.02|R|F|1993-12-02|1994-02-12|1993-12-06|COLLECT COD|RAIL|ng theodolites. furiously unusual theodo +677|1477|95|4|1|1378.47|0.06|0.05|R|F|1993-12-01|1994-01-14|1993-12-26|DELIVER IN PERSON|MAIL|ly. regular +677|1497|15|5|25|34962.25|0.00|0.05|A|F|1994-03-12|1994-02-02|1994-03-28|DELIVER IN PERSON|AIR| packages integrate blithely +678|1456|57|1|20|27149.00|0.05|0.08|R|F|1993-06-21|1993-04-07|1993-07-10|TAKE BACK RETURN|MAIL|furiously express excuses. foxes eat fu +678|366|51|2|22|27859.92|0.01|0.02|A|F|1993-05-10|1993-04-29|1993-06-08|NONE|REG AIR|de of the carefully even requests. bl +678|1425|65|3|16|21222.72|0.06|0.02|R|F|1993-03-20|1993-04-13|1993-04-16|DELIVER IN PERSON|REG AIR|equests cajole around the carefully regular +678|1981|82|4|48|90383.04|0.08|0.08|R|F|1993-02-28|1993-04-04|1993-03-24|NONE|REG AIR|ithely. slyly express foxes +678|975|76|5|16|30015.52|0.06|0.04|R|F|1993-03-09|1993-04-18|1993-04-07|NONE|AIR| about the +678|429|30|6|11|14623.62|0.09|0.00|R|F|1993-04-28|1993-05-16|1993-05-11|COLLECT COD|TRUCK|ess deposits dazzle f +679|1918|19|1|9|16379.19|0.09|0.00|N|O|1995-12-20|1996-01-27|1996-01-07|COLLECT COD|REG AIR|leep slyly. entici +704|1900|1|1|40|72076.00|0.05|0.05|N|O|1997-01-30|1997-01-10|1997-02-20|COLLECT COD|AIR|ggle quickly. r +704|39|40|2|14|13146.42|0.07|0.08|N|O|1997-02-02|1996-12-26|1997-02-19|DELIVER IN PERSON|REG AIR|ve the quickly final forges. furiously p +705|1884|28|1|46|82150.48|0.05|0.06|N|O|1997-04-18|1997-05-06|1997-05-05|DELIVER IN PERSON|SHIP|ss deposits. ironic packa +705|1163|72|2|35|37245.60|0.10|0.04|N|O|1997-03-25|1997-03-20|1997-04-23|TAKE BACK RETURN|FOB|carefully ironic accounts +706|1967|12|1|23|42986.08|0.05|0.00|N|O|1995-12-06|1995-12-02|1995-12-16|COLLECT COD|SHIP|ckey players. requests above the +707|1548|49|1|34|49284.36|0.01|0.02|R|F|1994-12-08|1995-01-15|1995-01-02|NONE|RAIL| dependencies +707|427|57|2|22|29203.24|0.00|0.06|A|F|1995-01-12|1994-12-28|1995-01-16|DELIVER IN PERSON|REG AIR| kindle ironically +708|1239|51|1|3|3420.69|0.05|0.02|N|O|1998-10-09|1998-09-22|1998-11-07|COLLECT COD|FOB|e slyly pending foxes. +708|1792|93|2|19|32182.01|0.06|0.00|N|O|1998-10-28|1998-09-23|1998-11-25|COLLECT COD|SHIP| requests. even, thin ideas +708|1213|25|3|33|36768.93|0.09|0.06|N|O|1998-09-10|1998-09-20|1998-09-22|COLLECT COD|RAIL|s boost carefully ruthless theodolites. f +708|552|53|4|5|7262.75|0.07|0.07|N|O|1998-07-22|1998-08-15|1998-07-28|TAKE BACK RETURN|REG AIR|c pinto beans nag after the account +708|1425|43|5|36|47751.12|0.08|0.01|N|O|1998-07-16|1998-09-04|1998-08-11|NONE|SHIP|ests. even, regular hockey p +708|224|6|6|7|7869.54|0.10|0.03|N|O|1998-08-16|1998-08-15|1998-09-10|COLLECT COD|REG AIR|lly express ac +709|863|30|1|7|12347.02|0.00|0.00|N|O|1998-06-14|1998-06-08|1998-06-18|TAKE BACK RETURN|RAIL| special orbits cajole +709|1973|18|2|15|28124.55|0.08|0.00|N|O|1998-07-10|1998-06-26|1998-08-09|NONE|RAIL|ily regular deposits. sauternes was accor +709|1685|27|3|10|15866.80|0.01|0.02|N|O|1998-06-04|1998-06-30|1998-06-11|NONE|REG AIR|ts cajole boldly +709|1073|74|4|40|38962.80|0.10|0.08|N|O|1998-08-12|1998-06-20|1998-08-20|DELIVER IN PERSON|RAIL|ggle fluffily carefully ironic +710|1622|46|1|47|71610.14|0.06|0.08|A|F|1993-01-18|1993-03-24|1993-01-24|TAKE BACK RETURN|MAIL|usual ideas into th +710|1930|31|2|38|69613.34|0.07|0.02|R|F|1993-04-18|1993-03-12|1993-05-15|COLLECT COD|FOB|sts boost fluffily aft +710|1390|5|3|7|9039.73|0.04|0.06|R|F|1993-01-20|1993-03-28|1993-02-15|TAKE BACK RETURN|REG AIR|xpress, special ideas. bl +710|894|95|4|25|44872.25|0.00|0.05|R|F|1993-03-31|1993-02-05|1993-04-22|COLLECT COD|FOB|eas detect do +710|1855|42|5|12|21082.20|0.01|0.02|A|F|1993-02-18|1993-02-27|1993-03-07|DELIVER IN PERSON|MAIL|ions. slyly express theodolites al +710|1137|46|6|21|21800.73|0.04|0.06|R|F|1993-03-22|1993-03-05|1993-03-27|DELIVER IN PERSON|SHIP|es. furiously p +710|1593|14|7|46|68751.14|0.03|0.07|R|F|1993-04-16|1993-03-27|1993-05-05|COLLECT COD|MAIL|ges use; blithely pending excuses inte +711|1458|98|1|2|2718.90|0.10|0.04|R|F|1993-12-01|1993-12-09|1993-12-16|DELIVER IN PERSON|REG AIR|ely across t +711|1026|97|2|27|25029.54|0.00|0.08|A|F|1993-10-02|1993-10-26|1993-10-08|DELIVER IN PERSON|MAIL|slyly. ironic asy +711|1271|46|3|46|53924.42|0.10|0.00|R|F|1993-12-26|1993-11-19|1994-01-21|TAKE BACK RETURN|MAIL|deposits. permanen +711|1277|78|4|20|23565.40|0.09|0.00|A|F|1994-01-17|1993-11-10|1994-01-31|DELIVER IN PERSON|TRUCK|kly regular acco +736|1574|75|1|46|67876.22|0.05|0.01|N|O|1998-07-16|1998-09-01|1998-08-09|NONE|AIR|uctions cajole +736|795|96|2|23|39003.17|0.02|0.05|N|O|1998-10-08|1998-08-27|1998-10-19|TAKE BACK RETURN|AIR|k accounts are carefully +736|567|58|3|13|19078.28|0.00|0.03|N|O|1998-08-16|1998-07-26|1998-08-19|DELIVER IN PERSON|FOB|st furiously among the +736|979|82|4|14|26319.58|0.06|0.04|N|O|1998-10-04|1998-08-14|1998-10-16|COLLECT COD|REG AIR|nstructions. +736|1681|64|5|32|50645.76|0.04|0.03|N|O|1998-07-30|1998-08-22|1998-08-12|DELIVER IN PERSON|RAIL|iously final accoun +737|1819|49|1|12|20649.72|0.01|0.01|R|F|1992-04-28|1992-06-30|1992-05-08|COLLECT COD|RAIL|posits after the slyly bold du +738|1973|62|1|34|63748.98|0.00|0.06|R|F|1993-06-09|1993-04-15|1993-07-09|TAKE BACK RETURN|TRUCK|s against the ironic exc +738|1871|72|2|4|7091.48|0.00|0.03|A|F|1993-06-20|1993-04-08|1993-07-09|NONE|AIR|ar packages. fluffily bo +738|1697|98|3|23|36769.87|0.04|0.08|A|F|1993-03-17|1993-04-02|1993-04-05|TAKE BACK RETURN|SHIP|nic, final excuses promise quickly regula +738|1408|26|4|12|15712.80|0.04|0.08|A|F|1993-06-16|1993-05-05|1993-06-22|NONE|SHIP|ove the slyly regular p +738|1749|34|5|30|49522.20|0.02|0.00|A|F|1993-06-12|1993-05-29|1993-06-25|NONE|AIR|ecial instructions haggle blithely regula +739|845|79|1|28|48883.52|0.00|0.03|N|O|1998-06-03|1998-08-04|1998-06-29|TAKE BACK RETURN|RAIL|elets about the pe +739|36|62|2|50|46801.50|0.07|0.06|N|O|1998-08-26|1998-07-16|1998-09-02|COLLECT COD|MAIL|ndencies. blith +739|488|47|3|12|16661.76|0.05|0.00|N|O|1998-08-20|1998-07-24|1998-08-22|NONE|MAIL|le slyly along the close i +739|435|23|4|47|62765.21|0.09|0.07|N|O|1998-08-12|1998-07-09|1998-08-28|NONE|REG AIR|deas according to the theodolites sn +739|1876|6|5|30|53336.10|0.07|0.06|N|O|1998-06-19|1998-08-26|1998-07-02|DELIVER IN PERSON|REG AIR|above the even deposits. ironic requests +740|13|89|1|22|20086.22|0.10|0.02|N|O|1995-07-24|1995-09-11|1995-08-11|TAKE BACK RETURN|FOB|odolites cajole ironic, pending instruc +740|653|47|2|35|54377.75|0.00|0.00|N|O|1995-09-06|1995-08-22|1995-10-02|NONE|TRUCK|p quickly. fu +740|1981|82|3|29|54606.42|0.06|0.05|N|O|1995-10-26|1995-09-17|1995-10-29|DELIVER IN PERSON|FOB|ntly bold pinto beans sleep quickl +741|1865|52|1|25|44171.50|0.03|0.06|N|O|1998-07-15|1998-08-27|1998-08-12|DELIVER IN PERSON|MAIL|accounts. blithely bold pa +741|904|73|2|22|39707.80|0.09|0.01|N|O|1998-09-07|1998-09-28|1998-09-12|COLLECT COD|AIR|ven deposits about the regular, ironi +742|1014|15|1|46|42090.46|0.04|0.08|A|F|1995-03-12|1995-03-20|1995-03-16|TAKE BACK RETURN|SHIP|e slyly bold deposits cajole according to +742|954|89|2|15|27824.25|0.08|0.05|A|F|1995-02-26|1995-03-20|1995-03-03|NONE|SHIP|blithely unusual pinto +742|1016|52|3|24|22008.24|0.08|0.08|A|F|1995-02-12|1995-03-12|1995-02-14|DELIVER IN PERSON|SHIP|affix slyly. furiously i +742|1919|64|4|16|29134.56|0.01|0.05|A|F|1995-01-15|1995-02-25|1995-01-24|COLLECT COD|AIR|eodolites haggle carefully regul +742|1001|37|5|48|43296.00|0.09|0.08|R|F|1995-03-24|1995-01-23|1995-04-08|TAKE BACK RETURN|TRUCK| platelets +742|1920|53|6|49|89274.08|0.02|0.07|A|F|1995-01-13|1995-02-13|1995-01-26|TAKE BACK RETURN|RAIL| carefully bold foxes sle +743|1915|4|1|21|38155.11|0.01|0.04|N|O|1996-10-26|1996-11-05|1996-11-11|COLLECT COD|MAIL|d requests. packages afte +768|1959|60|1|39|72577.05|0.06|0.08|N|O|1996-09-25|1996-10-27|1996-10-20|NONE|SHIP|out the ironic +768|179|80|2|2|2158.34|0.00|0.04|N|O|1996-11-13|1996-10-03|1996-11-25|DELIVER IN PERSON|SHIP|ular courts. slyly dogged accou +768|60|11|3|30|28801.80|0.06|0.05|N|O|1996-09-22|1996-11-03|1996-10-13|NONE|MAIL| furiously fluffy pinto beans haggle along +768|245|27|4|37|42373.88|0.10|0.00|N|O|1996-10-02|1996-09-23|1996-10-14|TAKE BACK RETURN|REG AIR|ending requests across the quickly +768|465|24|5|47|64176.62|0.06|0.05|N|O|1996-11-28|1996-10-30|1996-12-12|NONE|TRUCK|foxes. slyly ironic deposits a +768|1117|90|6|43|43778.73|0.10|0.06|N|O|1996-09-22|1996-11-03|1996-10-22|TAKE BACK RETURN|AIR|sual ideas wake quickly +768|481|82|7|33|45588.84|0.01|0.04|N|O|1996-09-06|1996-09-29|1996-10-01|COLLECT COD|RAIL|sly ironic instructions. excuses can hagg +769|1751|94|1|36|59499.00|0.02|0.02|A|F|1993-10-01|1993-08-07|1993-10-15|NONE|AIR|es. furiously iro +769|1591|32|2|4|5970.36|0.01|0.04|R|F|1993-06-25|1993-08-12|1993-07-15|DELIVER IN PERSON|FOB| ideas. even +770|1802|46|1|39|66448.20|0.09|0.06|N|O|1998-07-19|1998-08-09|1998-08-04|NONE|REG AIR|osits. foxes cajole +770|533|64|2|25|35838.25|0.03|0.02|N|O|1998-05-26|1998-07-23|1998-06-04|TAKE BACK RETURN|AIR| deposits dazzle fluffily alongside of +771|70|46|1|12|11640.84|0.10|0.08|N|O|1995-07-18|1995-08-02|1995-08-07|COLLECT COD|TRUCK|carefully. pending in +771|1606|48|2|38|57288.80|0.03|0.08|N|O|1995-07-22|1995-09-10|1995-07-29|TAKE BACK RETURN|REG AIR| quickly final requests are final packages. +771|64|65|3|14|13496.84|0.02|0.05|N|O|1995-07-31|1995-08-13|1995-08-07|DELIVER IN PERSON|AIR|r, final packages are slyly iro +771|413|14|4|7|9193.87|0.06|0.02|N|O|1995-06-18|1995-08-31|1995-06-20|NONE|REG AIR|theodolites after the fluffily express +771|775|72|5|13|21785.01|0.09|0.01|N|O|1995-08-10|1995-08-21|1995-08-30|NONE|FOB|packages affix slyly about the quickly +771|820|20|6|23|39578.86|0.08|0.03|N|O|1995-06-19|1995-09-07|1995-07-09|COLLECT COD|FOB|cajole besides the quickly ironic pin +772|527|18|1|35|49963.20|0.10|0.06|R|F|1993-07-05|1993-06-05|1993-08-02|NONE|SHIP|kly thin packages wake slowly +772|831|98|2|10|17318.30|0.05|0.01|R|F|1993-05-20|1993-05-19|1993-06-15|DELIVER IN PERSON|MAIL| deposits cajole carefully instructions. t +772|852|53|3|35|61349.75|0.03|0.04|R|F|1993-04-18|1993-06-13|1993-05-01|COLLECT COD|MAIL|ng ideas. special packages haggle alon +772|1799|26|4|10|17007.90|0.08|0.02|A|F|1993-05-17|1993-06-09|1993-05-29|COLLECT COD|AIR|o the furiously final deposits. furi +772|537|38|5|42|60376.26|0.02|0.07|A|F|1993-06-09|1993-07-16|1993-06-12|DELIVER IN PERSON|MAIL| express foxes abo +773|994|95|1|5|9474.95|0.06|0.04|A|F|1993-11-21|1993-12-19|1993-12-21|COLLECT COD|MAIL|ar requests. regular, thin packages u +773|101|28|2|31|31034.10|0.02|0.06|A|F|1993-12-30|1993-11-02|1994-01-01|TAKE BACK RETURN|MAIL|e slyly unusual deposit +773|1501|22|3|39|54697.50|0.06|0.05|A|F|1994-01-04|1993-12-23|1994-01-26|DELIVER IN PERSON|FOB|quickly eve +773|281|36|4|28|33075.84|0.10|0.06|R|F|1994-01-19|1993-11-05|1994-01-23|NONE|TRUCK|he furiously slow deposits. +773|1331|32|5|9|11090.97|0.09|0.02|R|F|1993-10-09|1993-12-25|1993-11-04|TAKE BACK RETURN|FOB|ent orbits haggle fluffily after the +773|396|97|6|43|55744.77|0.07|0.03|A|F|1993-11-06|1993-11-20|1993-11-08|TAKE BACK RETURN|SHIP|furiously bold dependencies. blithel +774|1827|28|1|49|84712.18|0.08|0.03|N|O|1995-12-06|1996-01-07|1995-12-14|DELIVER IN PERSON|SHIP|ess accounts are carefully +774|161|14|2|3|3183.48|0.10|0.06|N|O|1996-02-13|1996-01-14|1996-03-04|COLLECT COD|FOB| slyly even courts nag blith +774|1479|97|3|34|46935.98|0.02|0.07|N|O|1996-03-16|1996-01-03|1996-03-22|COLLECT COD|FOB|lar excuses are furiously final instr +774|150|51|4|8|8401.20|0.00|0.02|N|O|1996-01-24|1996-01-15|1996-02-13|COLLECT COD|RAIL|ully ironic requests c +774|1762|89|5|44|73205.44|0.09|0.07|N|O|1996-02-29|1996-01-16|1996-03-06|NONE|REG AIR|s according to the deposits unwind ca +774|1199|100|6|2|2200.38|0.07|0.03|N|O|1995-12-11|1996-02-10|1995-12-14|TAKE BACK RETURN|SHIP|accounts; slyly regular +775|317|74|1|16|19476.96|0.10|0.06|N|F|1995-05-23|1995-05-07|1995-06-19|NONE|TRUCK|un quickly slyly +775|1733|60|2|21|34329.33|0.01|0.06|R|F|1995-05-01|1995-06-02|1995-05-13|DELIVER IN PERSON|FOB| quickly sile +775|1071|77|3|20|19441.40|0.01|0.08|N|F|1995-06-17|1995-05-22|1995-07-13|COLLECT COD|AIR|en dependencies nag slowly +800|719|84|1|38|61548.98|0.00|0.05|N|O|1998-07-21|1998-09-25|1998-08-07|TAKE BACK RETURN|TRUCK|according to the bold, final dependencies +800|843|77|2|21|36620.64|0.04|0.05|N|O|1998-07-23|1998-10-01|1998-08-20|TAKE BACK RETURN|RAIL|ckly even requests after the carefully r +800|1751|36|3|26|42971.50|0.01|0.02|N|O|1998-07-23|1998-10-08|1998-07-25|DELIVER IN PERSON|FOB|bove the pending requests. +801|52|28|1|13|12376.65|0.10|0.02|R|F|1992-04-25|1992-04-24|1992-05-16|COLLECT COD|RAIL|s are fluffily stealthily expres +801|947|16|2|21|38806.74|0.05|0.02|A|F|1992-03-14|1992-04-01|1992-04-05|COLLECT COD|AIR|wake silently furiously idle deposits. +801|27|28|3|21|19467.42|0.05|0.03|A|F|1992-04-25|1992-03-20|1992-05-04|COLLECT COD|REG AIR|cial, special packages. +801|1636|60|4|12|18451.56|0.08|0.04|A|F|1992-06-06|1992-04-14|1992-06-12|TAKE BACK RETURN|RAIL|s. ironic pinto b +801|732|29|5|45|73472.85|0.01|0.06|R|F|1992-03-22|1992-03-22|1992-03-25|COLLECT COD|REG AIR| even asymptotes +801|1219|57|6|10|11202.10|0.08|0.01|A|F|1992-06-05|1992-05-15|1992-06-21|DELIVER IN PERSON|MAIL|al accounts. carefully regular foxes wake +801|257|12|7|11|12729.75|0.01|0.03|A|F|1992-05-09|1992-04-19|1992-05-15|DELIVER IN PERSON|REG AIR|y special pinto beans cajole +802|1426|5|1|40|53096.80|0.08|0.08|A|F|1995-01-07|1995-04-03|1995-01-23|DELIVER IN PERSON|RAIL|y bold accou +802|1328|29|2|34|41796.88|0.08|0.06|A|F|1995-03-01|1995-03-15|1995-03-12|COLLECT COD|AIR|instructions cajole carefully. quietl +802|1310|11|3|44|53297.64|0.07|0.04|R|F|1995-01-09|1995-02-04|1995-01-18|TAKE BACK RETURN|SHIP|rmanently idly special requ +802|1566|47|4|18|26416.08|0.09|0.02|R|F|1995-03-06|1995-02-07|1995-03-19|TAKE BACK RETURN|RAIL|y regular requests engage furiously final d +802|1318|19|5|19|23166.89|0.08|0.06|A|F|1995-04-01|1995-02-20|1995-04-23|DELIVER IN PERSON|REG AIR|old, furious +803|535|96|1|8|11484.24|0.07|0.01|N|O|1997-08-04|1997-06-19|1997-08-12|NONE|SHIP|ronic theodo +803|988|89|2|21|39668.58|0.08|0.06|N|O|1997-08-25|1997-06-30|1997-09-10|TAKE BACK RETURN|AIR|ironic packages cajole slyly. un +804|1253|54|1|30|34627.50|0.08|0.04|A|F|1993-03-29|1993-05-07|1993-04-14|COLLECT COD|REG AIR|ehind the quietly regular pac +804|1984|17|2|2|3771.96|0.02|0.00|A|F|1993-06-23|1993-04-30|1993-06-25|NONE|TRUCK|slyly silent +804|756|21|3|44|72897.00|0.04|0.05|R|F|1993-07-06|1993-04-13|1993-07-28|DELIVER IN PERSON|TRUCK|ly final deposits? special +804|376|33|4|21|26803.77|0.01|0.00|A|F|1993-04-12|1993-06-06|1993-04-20|DELIVER IN PERSON|RAIL|ular, ironic foxes. quickly even accounts +805|1979|24|1|25|47024.25|0.07|0.06|N|O|1995-08-05|1995-09-30|1995-08-06|NONE|AIR|ide of the pending, sly requests. quickly f +805|567|98|2|29|42559.24|0.07|0.01|N|O|1995-08-24|1995-08-15|1995-09-16|TAKE BACK RETURN|AIR|dolites according to the slyly f +805|465|66|3|12|16385.52|0.01|0.06|N|O|1995-07-13|1995-09-27|1995-08-02|TAKE BACK RETURN|REG AIR| regular foxes. furio +805|754|87|4|26|43023.50|0.08|0.07|N|O|1995-08-28|1995-09-24|1995-09-11|TAKE BACK RETURN|RAIL|. ironic deposits sleep across +806|1048|54|1|1|949.04|0.04|0.07|N|O|1996-07-14|1996-09-12|1996-07-25|COLLECT COD|RAIL|ar accounts? pending, pending foxes a +806|1598|79|2|22|32990.98|0.08|0.02|N|O|1996-10-03|1996-08-11|1996-10-20|DELIVER IN PERSON|REG AIR|fily pending +806|904|39|3|4|7219.60|0.04|0.03|N|O|1996-08-09|1996-09-18|1996-08-13|COLLECT COD|TRUCK|eans. quickly ironic ideas +807|1166|75|1|49|52290.84|0.00|0.00|R|F|1993-12-05|1994-01-13|1993-12-25|COLLECT COD|REG AIR| furiously according to the un +807|1549|30|2|49|71076.46|0.01|0.06|A|F|1994-01-17|1994-01-24|1994-01-22|COLLECT COD|TRUCK|y regular requests haggle. +807|1803|33|3|48|81830.40|0.07|0.07|A|F|1994-01-08|1994-02-02|1994-01-15|DELIVER IN PERSON|SHIP|kly across the f +807|793|94|4|10|16937.90|0.09|0.00|R|F|1994-01-19|1994-02-12|1994-01-28|NONE|TRUCK|furiously final depths sleep a +807|1425|4|5|30|39792.60|0.02|0.01|R|F|1994-01-19|1994-01-09|1994-01-27|NONE|RAIL|cial accoun +807|117|96|6|11|11188.21|0.02|0.04|R|F|1994-03-25|1994-01-26|1994-04-14|NONE|FOB|unts above the slyly final ex +807|2|53|7|19|17138.00|0.08|0.05|A|F|1994-02-10|1994-02-20|1994-03-06|NONE|SHIP|ns haggle quickly across the furi +832|1030|66|1|45|41896.35|0.01|0.02|A|F|1992-05-08|1992-06-06|1992-06-04|COLLECT COD|MAIL|foxes engage slyly alon +832|475|34|2|24|33011.28|0.05|0.06|A|F|1992-06-15|1992-07-14|1992-06-17|NONE|TRUCK|ully. carefully speci +833|536|37|1|1|1436.53|0.04|0.04|R|F|1994-04-26|1994-04-05|1994-04-29|COLLECT COD|MAIL|ffily ironic theodolites +833|1119|56|2|38|38764.18|0.05|0.05|A|F|1994-04-05|1994-04-21|1994-05-01|COLLECT COD|TRUCK| platelets promise furiously. +833|1612|36|3|9|13622.49|0.05|0.07|A|F|1994-02-28|1994-04-26|1994-03-20|TAKE BACK RETURN|FOB|ecial, even requests. even, bold instructi +834|1442|82|1|36|48363.84|0.06|0.04|R|F|1994-06-28|1994-07-25|1994-07-07|TAKE BACK RETURN|SHIP|ccounts haggle after the furiously +834|70|21|2|11|10670.77|0.03|0.00|A|F|1994-09-18|1994-08-03|1994-10-02|DELIVER IN PERSON|TRUCK|inst the regular packa +835|1065|36|1|33|31879.98|0.09|0.06|N|O|1995-11-01|1995-12-02|1995-11-24|DELIVER IN PERSON|RAIL|onic instructions among the carefully iro +835|1846|33|2|28|48939.52|0.02|0.02|N|O|1995-12-27|1995-12-11|1996-01-21|NONE|SHIP| fluffily furious pinto beans +836|1880|10|1|6|10691.28|0.09|0.03|N|O|1996-12-09|1997-01-31|1996-12-29|COLLECT COD|TRUCK|fully bold theodolites are daringly across +836|836|36|2|18|31262.94|0.03|0.05|N|O|1997-02-27|1997-02-11|1997-03-22|NONE|REG AIR|y pending packages use alon +836|1407|47|3|46|60186.40|0.05|0.07|N|O|1997-03-21|1997-02-06|1997-04-05|NONE|REG AIR|boldly final pinto beans haggle furiously +837|566|97|1|39|57195.84|0.03|0.08|A|F|1994-07-22|1994-08-10|1994-08-11|NONE|RAIL|ecial pinto bea +837|874|74|2|24|42596.88|0.08|0.00|R|F|1994-06-27|1994-09-02|1994-07-27|DELIVER IN PERSON|FOB|p carefully. theodolites use. bold courts a +838|1338|77|1|20|24786.60|0.10|0.07|N|O|1998-04-11|1998-03-25|1998-04-19|COLLECT COD|TRUCK| furiously final ideas. slow, bold +838|283|84|2|27|31948.56|0.05|0.07|N|O|1998-02-15|1998-04-03|1998-02-20|DELIVER IN PERSON|SHIP| pending pinto beans haggle about t +838|948|83|3|23|42525.62|0.10|0.07|N|O|1998-03-26|1998-04-17|1998-04-02|COLLECT COD|AIR|ets haggle furiously furiously regular r +838|432|33|4|18|23983.74|0.09|0.00|N|O|1998-03-28|1998-04-06|1998-03-31|TAKE BACK RETURN|AIR|hely unusual foxes. furio +839|1571|92|1|23|33869.11|0.07|0.02|N|O|1995-10-17|1995-11-03|1995-11-04|COLLECT COD|AIR|ng ideas haggle accord +839|1884|85|2|47|83936.36|0.08|0.00|N|O|1995-10-17|1995-11-06|1995-11-10|NONE|AIR|refully final excuses about +864|1297|35|1|34|40741.86|0.03|0.04|N|O|1997-12-16|1997-10-23|1998-01-12|TAKE BACK RETURN|SHIP|gside of the furiously special +864|980|49|2|7|13166.86|0.01|0.02|N|O|1997-11-13|1997-10-07|1997-12-13|TAKE BACK RETURN|MAIL|ven requests should sleep along +864|794|27|3|34|57622.86|0.03|0.00|N|O|1997-09-14|1997-11-04|1997-09-21|TAKE BACK RETURN|REG AIR|to the furiously ironic platelets! +865|1973|18|1|16|29999.52|0.07|0.03|R|F|1993-08-24|1993-06-26|1993-08-28|TAKE BACK RETURN|TRUCK|y even accounts. quickly bold decoys +865|192|45|2|3|3276.57|0.02|0.05|A|F|1993-07-17|1993-07-14|1993-08-01|NONE|MAIL|fully regular the +865|861|28|3|15|26427.90|0.00|0.06|R|F|1993-07-05|1993-06-25|1993-07-26|NONE|SHIP| deposits sleep quickl +865|1684|8|4|34|53913.12|0.09|0.06|A|F|1993-05-09|1993-07-28|1993-05-18|DELIVER IN PERSON|REG AIR|furiously fluffily unusual account +866|1358|59|1|5|6296.75|0.08|0.00|R|F|1993-01-22|1993-01-14|1993-02-07|TAKE BACK RETURN|AIR|tegrate fluffily. carefully f +867|1388|89|1|7|9025.66|0.04|0.07|A|F|1994-02-19|1993-12-25|1994-02-25|DELIVER IN PERSON|TRUCK|pendencies-- slyly unusual packages hagg +868|1680|81|1|8|12653.44|0.06|0.03|R|F|1992-10-07|1992-08-01|1992-10-16|NONE|MAIL|l deposits. blithely regular pint +868|287|42|2|13|15434.64|0.05|0.07|R|F|1992-07-25|1992-08-26|1992-08-04|NONE|AIR|gged instructi +868|675|38|3|19|29937.73|0.09|0.06|R|F|1992-06-22|1992-08-27|1992-07-04|COLLECT COD|SHIP|lyly ironic platelets wake. rut +868|1211|86|4|43|47825.03|0.02|0.04|A|F|1992-07-02|1992-07-22|1992-07-21|COLLECT COD|SHIP|kly silent deposits wake dar +868|245|27|5|27|30921.48|0.04|0.01|R|F|1992-08-01|1992-08-25|1992-08-12|TAKE BACK RETURN|RAIL|oss the fluffily unusual pinto +868|1243|44|6|19|21740.56|0.02|0.05|R|F|1992-09-20|1992-07-18|1992-10-04|NONE|FOB|ely even deposits lose blithe +869|623|55|1|27|41137.74|0.07|0.07|N|O|1997-01-30|1997-02-17|1997-02-26|TAKE BACK RETURN|TRUCK|uffily even excuses? slyly even deposits +869|461|91|2|36|49012.56|0.04|0.01|N|O|1997-05-03|1997-03-17|1997-05-24|NONE|RAIL|ong the furiously bold instructi +870|492|80|1|36|50129.64|0.04|0.07|A|F|1993-10-18|1993-09-16|1993-11-15|COLLECT COD|MAIL|fily. furiously final accounts are +870|1859|60|2|5|8804.25|0.06|0.05|A|F|1993-08-13|1993-09-11|1993-08-24|COLLECT COD|FOB|e slyly excuses. ironi +871|964|65|1|48|89518.08|0.10|0.03|N|O|1996-02-25|1996-02-09|1996-03-18|NONE|AIR|coys dazzle slyly slow notornis. f +871|546|7|2|47|67987.38|0.07|0.03|N|O|1995-12-25|1996-02-01|1996-01-24|TAKE BACK RETURN|RAIL|ss, final dep +871|1080|86|3|13|12754.04|0.09|0.01|N|O|1996-01-25|1996-01-24|1996-02-03|NONE|REG AIR| haggle furiou +871|1900|1|4|29|52255.10|0.06|0.07|N|O|1995-11-16|1996-01-27|1995-12-16|DELIVER IN PERSON|RAIL|ests are carefu +871|1275|50|5|8|9410.16|0.00|0.01|N|O|1995-11-25|1996-01-12|1995-12-12|DELIVER IN PERSON|AIR|lar ideas-- slyly even accou +871|1425|43|6|26|34486.92|0.00|0.06|N|O|1996-02-07|1996-01-05|1996-02-25|COLLECT COD|AIR|symptotes use quickly near the +871|1734|19|7|4|6542.92|0.00|0.07|N|O|1996-03-09|1996-01-20|1996-03-26|COLLECT COD|FOB|l, regular dependencies w +896|387|88|1|47|60506.86|0.07|0.08|R|F|1993-05-28|1993-05-15|1993-06-15|DELIVER IN PERSON|TRUCK|ly even pinto beans integrate. b +896|1977|10|2|10|18789.70|0.03|0.07|A|F|1993-07-07|1993-06-03|1993-07-24|COLLECT COD|SHIP| quickly even theodolites. carefully regu +896|20|96|3|7|6440.14|0.09|0.02|A|F|1993-05-02|1993-05-24|1993-05-31|DELIVER IN PERSON|MAIL| requests +896|1517|18|4|11|15603.61|0.08|0.04|A|F|1993-05-19|1993-05-22|1993-06-08|COLLECT COD|MAIL|the multipliers sleep +896|1875|5|5|34|60413.58|0.00|0.05|R|F|1993-05-21|1993-06-01|1993-05-23|NONE|TRUCK|ular, close requests cajo +896|1769|54|6|44|73513.44|0.09|0.08|R|F|1993-05-19|1993-04-14|1993-06-02|DELIVER IN PERSON|FOB|lar, pending packages. deposits are q +896|1089|25|7|11|10890.88|0.01|0.07|A|F|1993-05-01|1993-04-09|1993-05-06|TAKE BACK RETURN|FOB|rding to the pinto beans wa +897|905|74|1|15|27088.50|0.07|0.04|R|F|1995-05-25|1995-05-09|1995-06-07|COLLECT COD|REG AIR|r ideas. slyly spec +897|1832|62|2|26|45079.58|0.05|0.08|N|O|1995-07-01|1995-06-10|1995-07-14|COLLECT COD|MAIL|tions sleep according to the special +897|1258|96|3|13|15070.25|0.07|0.00|A|F|1995-03-30|1995-05-17|1995-04-21|TAKE BACK RETURN|MAIL|bold accounts mold carefully! braids +897|1012|83|4|2|1826.02|0.08|0.08|R|F|1995-05-22|1995-05-07|1995-06-16|COLLECT COD|RAIL|into beans. slyly special fox +898|1602|3|1|9|13532.40|0.07|0.08|A|F|1993-07-04|1993-07-09|1993-07-25|NONE|AIR|e slyly across the blithe +898|1786|13|2|37|62447.86|0.03|0.05|A|F|1993-08-17|1993-08-04|1993-09-01|DELIVER IN PERSON|REG AIR|packages sleep furiously +898|483|71|3|11|15218.28|0.01|0.00|A|F|1993-09-13|1993-08-31|1993-09-25|TAKE BACK RETURN|MAIL|etly bold accounts +898|1922|11|4|36|65661.12|0.04|0.07|R|F|1993-08-04|1993-07-25|1993-08-23|DELIVER IN PERSON|REG AIR| after the carefully +899|601|33|1|18|27028.80|0.04|0.05|N|O|1998-08-06|1998-05-09|1998-09-05|DELIVER IN PERSON|AIR|re daring, pending deposits. blit +899|461|91|2|25|34036.50|0.00|0.07|N|O|1998-07-21|1998-05-12|1998-08-16|NONE|REG AIR|rly final sentiments. bold pinto beans +899|850|50|3|4|7003.40|0.09|0.05|N|O|1998-06-02|1998-06-28|1998-06-14|TAKE BACK RETURN|REG AIR|ter the carefully regular deposits are agai +899|1798|83|4|14|23797.06|0.05|0.03|N|O|1998-05-21|1998-05-28|1998-06-03|TAKE BACK RETURN|FOB|ades impress carefully +899|708|73|5|4|6434.80|0.06|0.02|N|O|1998-04-11|1998-05-14|1998-04-27|NONE|TRUCK|ges. blithe, ironic waters cajole care +899|1191|28|6|47|51332.93|0.00|0.04|N|O|1998-04-14|1998-05-30|1998-05-13|DELIVER IN PERSON|TRUCK|furiously final foxes after the s +899|135|88|7|11|11386.43|0.02|0.08|N|O|1998-06-03|1998-06-15|1998-06-20|COLLECT COD|REG AIR|t the ironic +900|1986|31|1|44|83071.12|0.01|0.06|R|F|1994-12-15|1994-12-03|1994-12-27|COLLECT COD|MAIL| detect quick +900|1147|48|2|48|50310.72|0.08|0.04|A|F|1994-12-22|1994-11-08|1995-01-19|COLLECT COD|TRUCK|cial pinto beans nag +900|742|43|3|24|39425.76|0.03|0.00|R|F|1994-10-21|1994-12-25|1994-10-22|TAKE BACK RETURN|SHIP|-ray furiously un +901|212|40|1|36|40039.56|0.01|0.01|N|O|1998-08-11|1998-10-09|1998-08-27|DELIVER IN PERSON|REG AIR|. accounts are care +901|453|54|2|2|2706.90|0.09|0.02|N|O|1998-10-25|1998-09-27|1998-11-01|DELIVER IN PERSON|AIR|d foxes use slyly +901|427|57|3|37|49114.54|0.04|0.08|N|O|1998-11-01|1998-09-13|1998-11-05|NONE|AIR|ickly final deposits +901|178|79|4|11|11859.87|0.00|0.06|N|O|1998-11-13|1998-10-19|1998-11-14|TAKE BACK RETURN|TRUCK|ourts among the quickly expre +902|1106|7|1|3|3021.30|0.06|0.00|R|F|1994-10-01|1994-10-25|1994-10-28|COLLECT COD|MAIL|into beans thrash blithely about the flu +902|1173|10|2|8|8593.36|0.06|0.07|R|F|1994-10-25|1994-09-20|1994-11-07|COLLECT COD|RAIL| orbits al +902|1649|32|3|24|37215.36|0.02|0.05|R|F|1994-11-08|1994-10-12|1994-11-26|NONE|FOB|. blithely even accounts poach furiously i +903|644|38|1|27|41705.28|0.04|0.03|N|O|1995-09-18|1995-09-20|1995-10-02|TAKE BACK RETURN|SHIP|lly pending foxes. furiously +903|89|15|2|35|34617.80|0.06|0.05|N|O|1995-09-18|1995-08-21|1995-10-12|TAKE BACK RETURN|TRUCK|rets wake fin +903|83|9|3|33|32441.64|0.02|0.03|N|O|1995-09-24|1995-09-01|1995-10-12|COLLECT COD|MAIL|ely ironic packages wake blithely +903|555|16|4|9|13099.95|0.09|0.00|N|O|1995-10-06|1995-09-14|1995-10-24|NONE|TRUCK|he slyly ev +903|411|12|5|1|1311.41|0.04|0.00|N|O|1995-10-22|1995-09-13|1995-11-03|NONE|AIR|y final platelets sublate among the +903|1671|72|6|13|20444.71|0.07|0.02|N|O|1995-09-11|1995-10-04|1995-10-03|COLLECT COD|SHIP|sleep along the final +928|1682|83|1|29|45926.72|0.07|0.02|R|F|1995-05-17|1995-05-12|1995-05-21|NONE|REG AIR|ly alongside of the s +928|478|66|2|24|33083.28|0.05|0.08|A|F|1995-04-06|1995-05-08|1995-04-24|DELIVER IN PERSON|AIR|s the furiously regular warthogs im +928|1518|59|3|46|65297.46|0.08|0.00|A|F|1995-05-09|1995-04-09|1995-06-01|DELIVER IN PERSON|REG AIR| beans sleep against the carefully ir +928|514|5|4|43|60823.93|0.10|0.05|A|F|1995-04-14|1995-04-21|1995-05-09|NONE|REG AIR|blithely. express, silent requests doze at +928|118|19|5|38|38688.18|0.02|0.08|N|F|1995-06-08|1995-04-15|1995-06-30|TAKE BACK RETURN|SHIP|xpress grouc +928|541|42|6|50|72077.00|0.05|0.00|N|F|1995-06-07|1995-04-15|1995-07-01|DELIVER IN PERSON|TRUCK| slyly slyly special request +928|104|31|7|11|11045.10|0.00|0.01|A|F|1995-04-29|1995-04-16|1995-04-30|NONE|AIR|longside of +929|1287|62|1|45|53472.60|0.09|0.01|R|F|1993-01-24|1992-12-06|1993-02-16|DELIVER IN PERSON|REG AIR|ges haggle careful +929|1743|86|2|44|72368.56|0.02|0.00|A|F|1992-10-09|1992-11-20|1992-10-22|DELIVER IN PERSON|SHIP|s. excuses cajole. carefully regu +929|731|32|3|14|22844.22|0.06|0.07|A|F|1992-10-21|1992-11-17|1992-11-15|NONE|FOB|gainst the +929|1017|53|4|7|6426.07|0.06|0.01|A|F|1992-12-24|1992-12-19|1993-01-08|TAKE BACK RETURN|TRUCK|ithely. slyly c +930|449|37|1|36|48579.84|0.10|0.04|R|F|1994-12-21|1995-02-20|1994-12-24|COLLECT COD|RAIL|quickly regular pinto beans sle +930|173|52|2|47|50438.99|0.08|0.00|A|F|1995-03-20|1995-02-04|1995-04-04|DELIVER IN PERSON|AIR|ackages. fluffily e +930|643|37|3|10|15436.40|0.07|0.08|A|F|1994-12-18|1995-01-27|1995-01-16|COLLECT COD|AIR|ckly regular requests: regular instructions +930|997|32|4|21|39857.79|0.06|0.02|A|F|1995-02-16|1995-03-03|1995-03-13|DELIVER IN PERSON|SHIP|foxes. regular deposits integrate carefu +930|1633|57|5|50|76731.50|0.03|0.06|A|F|1995-04-03|1995-01-29|1995-04-22|COLLECT COD|MAIL| excuses among the furiously express ideas +930|1446|64|6|10|13474.40|0.00|0.04|A|F|1995-02-09|1995-02-17|1995-02-16|NONE|SHIP|blithely bold i +930|1662|45|7|30|46909.80|0.07|0.08|R|F|1995-01-20|1995-02-28|1995-02-04|TAKE BACK RETURN|RAIL|g accounts sleep along the platelets. +931|398|99|1|18|23371.02|0.00|0.05|A|F|1993-04-04|1993-01-11|1993-04-13|NONE|RAIL|slyly ironic re +931|168|47|2|10|10681.60|0.05|0.07|A|F|1993-03-01|1993-01-09|1993-03-07|TAKE BACK RETURN|SHIP|ajole quickly. slyly sil +931|1461|79|3|48|65398.08|0.01|0.08|A|F|1993-02-03|1993-03-02|1993-02-09|TAKE BACK RETURN|FOB|ep alongside of the fluffy +931|814|81|4|38|65162.78|0.08|0.08|A|F|1993-03-06|1993-02-24|1993-03-27|DELIVER IN PERSON|RAIL|usly final packages integrate carefully +932|438|68|1|41|54875.63|0.01|0.05|N|O|1997-06-05|1997-07-22|1997-06-26|COLLECT COD|RAIL|foxes. ironic pl +933|483|71|1|23|31820.04|0.02|0.04|R|F|1992-08-13|1992-09-18|1992-08-25|DELIVER IN PERSON|MAIL| the furiously bold dinos. sly +933|122|23|2|27|27597.24|0.02|0.01|R|F|1992-10-03|1992-10-02|1992-10-26|DELIVER IN PERSON|RAIL|ests. express +933|992|27|3|26|49217.74|0.05|0.00|A|F|1992-11-09|1992-11-03|1992-11-16|DELIVER IN PERSON|AIR| the deposits affix slyly after t +934|1179|52|1|18|19443.06|0.07|0.01|N|O|1996-09-10|1996-09-20|1996-09-25|COLLECT COD|RAIL|y unusual requests dazzle above t +935|275|3|1|23|27031.21|0.05|0.00|N|O|1997-11-11|1997-11-22|1997-11-29|COLLECT COD|REG AIR|ular accounts about +935|646|40|2|23|35572.72|0.02|0.01|N|O|1998-01-11|1997-11-25|1998-02-05|COLLECT COD|TRUCK|hes haggle furiously dolphins. qu +935|1341|80|3|36|44724.24|0.06|0.00|N|O|1997-11-05|1997-12-05|1997-11-25|TAKE BACK RETURN|AIR|leep about the exp +935|572|33|4|13|19143.41|0.08|0.04|N|O|1998-01-13|1997-11-30|1998-02-08|DELIVER IN PERSON|TRUCK|ld platelet +935|122|49|5|8|8176.96|0.02|0.05|N|O|1998-01-12|1997-11-02|1998-02-05|NONE|TRUCK|cept the quickly regular p +935|583|74|6|1|1483.58|0.01|0.08|N|O|1997-12-14|1997-11-22|1998-01-08|DELIVER IN PERSON|TRUCK| instructions. ironic acc +960|1070|6|1|1|971.07|0.07|0.00|A|F|1994-12-24|1994-10-26|1995-01-20|DELIVER IN PERSON|AIR|y ironic packages. quickly even +960|1163|72|2|25|26604.00|0.06|0.08|R|F|1994-12-01|1994-10-29|1994-12-27|DELIVER IN PERSON|RAIL|ts. fluffily regular requests +960|1748|75|3|32|52791.68|0.01|0.08|R|F|1995-01-19|1994-12-17|1995-02-04|DELIVER IN PERSON|FOB|around the blithe, even pl +961|1180|53|1|7|7568.26|0.10|0.00|N|O|1995-07-23|1995-07-20|1995-08-11|TAKE BACK RETURN|RAIL|usual dolphins. ironic pearls sleep blit +961|905|6|2|18|32506.20|0.09|0.05|N|O|1995-07-01|1995-08-14|1995-07-04|DELIVER IN PERSON|AIR|rmanent foxes haggle speci +961|970|71|3|42|78580.74|0.06|0.01|N|O|1995-08-24|1995-08-21|1995-09-10|TAKE BACK RETURN|SHIP|ests do cajole blithely. furiously bo +961|335|64|4|29|35824.57|0.00|0.07|N|F|1995-06-10|1995-08-20|1995-06-26|TAKE BACK RETURN|TRUCK|l accounts use blithely against the +961|253|54|5|38|43823.50|0.03|0.05|N|O|1995-08-21|1995-07-19|1995-08-27|NONE|RAIL|he blithely special requests. furiousl +961|1970|71|6|30|56159.10|0.09|0.03|N|O|1995-07-06|1995-07-20|1995-07-26|DELIVER IN PERSON|MAIL|warhorses slee +962|566|67|1|36|52796.16|0.01|0.03|R|F|1994-08-09|1994-07-10|1994-09-02|COLLECT COD|TRUCK|al foxes. iron +962|353|82|2|27|33840.45|0.09|0.02|A|F|1994-05-11|1994-07-10|1994-06-03|TAKE BACK RETURN|SHIP|y slyly express deposits. final i +962|797|98|3|3|5093.37|0.07|0.08|A|F|1994-05-08|1994-07-06|1994-06-02|DELIVER IN PERSON|FOB|ag furiously. even pa +962|564|95|4|20|29291.20|0.04|0.02|R|F|1994-08-26|1994-06-27|1994-09-11|DELIVER IN PERSON|SHIP| deposits use fluffily according to +962|1520|1|5|12|17058.24|0.02|0.00|A|F|1994-06-09|1994-06-07|1994-06-11|COLLECT COD|TRUCK|across the furiously regular escapades daz +962|1874|61|6|5|8879.35|0.02|0.05|A|F|1994-08-29|1994-07-15|1994-09-19|COLLECT COD|TRUCK|efully bold packages run slyly caref +963|1932|65|1|7|12837.51|0.01|0.00|R|F|1994-09-12|1994-07-18|1994-09-17|DELIVER IN PERSON|REG AIR|s. slyly regular depe +963|975|10|2|48|90046.56|0.10|0.06|R|F|1994-08-25|1994-08-12|1994-09-21|DELIVER IN PERSON|RAIL|ages. quickly express deposits cajole pe +964|1990|91|1|39|73787.61|0.04|0.01|N|O|1995-06-21|1995-07-24|1995-06-24|NONE|AIR|se furiously regular instructions. blith +964|1123|24|2|1|1024.12|0.02|0.05|N|O|1995-08-20|1995-07-29|1995-09-10|DELIVER IN PERSON|REG AIR|unts. quickly even platelets s +964|568|99|3|49|71959.44|0.01|0.03|N|O|1995-09-06|1995-08-10|1995-10-05|NONE|MAIL|ounts. blithely regular packag +964|546|77|4|44|63647.76|0.05|0.02|N|O|1995-09-18|1995-08-02|1995-10-17|TAKE BACK RETURN|TRUCK|ronic deposit +965|1073|9|1|20|19481.40|0.04|0.05|N|F|1995-06-16|1995-07-20|1995-07-06|COLLECT COD|MAIL|kly. carefully pending requ +965|171|24|2|23|24636.91|0.06|0.08|N|O|1995-07-12|1995-07-08|1995-08-11|COLLECT COD|MAIL|ld kindle carefully across th +966|1794|21|1|19|32220.01|0.07|0.01|N|O|1998-05-26|1998-07-15|1998-05-29|COLLECT COD|FOB|efully final pinto beans. quickly +966|1166|39|2|42|44820.72|0.02|0.06|N|O|1998-06-28|1998-06-20|1998-07-05|NONE|TRUCK|tions boost furiously car +966|213|68|3|42|46754.82|0.06|0.08|N|O|1998-06-15|1998-06-08|1998-07-05|NONE|RAIL|sly ironic asymptotes hagg +966|42|18|4|20|18840.80|0.04|0.01|N|O|1998-07-19|1998-07-15|1998-07-27|NONE|TRUCK|pecial ins +967|590|51|1|41|61114.19|0.05|0.05|R|F|1992-09-21|1992-08-15|1992-10-21|NONE|MAIL|ld foxes wake closely special +967|845|45|2|4|6983.36|0.01|0.02|A|F|1992-07-15|1992-07-27|1992-07-18|DELIVER IN PERSON|REG AIR|platelets hang carefully along +967|1316|55|3|10|12173.10|0.00|0.02|A|F|1992-09-18|1992-08-06|1992-09-19|DELIVER IN PERSON|MAIL|old pinto beans alongside of the exp +967|1477|95|4|49|67545.03|0.01|0.04|A|F|1992-09-28|1992-09-15|1992-10-14|NONE|SHIP|the slyly even ideas. carefully even +967|169|96|5|41|43835.56|0.08|0.04|A|F|1992-07-23|1992-08-07|1992-08-13|TAKE BACK RETURN|FOB|efully special ide +967|1054|90|6|17|16235.85|0.05|0.06|A|F|1992-10-02|1992-08-19|1992-10-25|NONE|MAIL|y ironic foxes caj +967|1609|92|7|18|27190.80|0.00|0.02|A|F|1992-10-06|1992-08-05|1992-10-15|DELIVER IN PERSON|RAIL|ngage blith +992|600|91|1|14|21008.40|0.10|0.03|N|O|1998-01-29|1997-12-29|1998-02-18|TAKE BACK RETURN|MAIL|the unusual, even dependencies affix fluff +992|380|81|2|34|43532.92|0.02|0.00|N|O|1997-11-29|1998-01-21|1997-11-30|NONE|RAIL|s use silently. blithely regular ideas b +992|1048|49|3|30|28471.20|0.10|0.00|N|O|1997-12-15|1998-02-02|1998-01-12|NONE|SHIP|nic instructions n +992|473|3|4|21|28842.87|0.06|0.06|N|O|1997-11-13|1997-12-28|1997-12-10|NONE|TRUCK|fily. quickly special deposit +992|911|46|5|7|12683.37|0.09|0.05|N|O|1997-11-30|1997-12-24|1997-12-16|DELIVER IN PERSON|TRUCK|ideas haggle. special theodolit +992|742|39|6|41|67352.34|0.10|0.01|N|O|1997-11-14|1998-02-04|1997-11-23|TAKE BACK RETURN|AIR|eodolites cajole across the accounts. +993|1745|88|1|33|54342.42|0.01|0.05|N|O|1996-01-03|1995-11-28|1996-01-23|DELIVER IN PERSON|AIR| the deposits affix agains +993|22|48|2|28|25816.56|0.06|0.08|N|O|1995-10-24|1995-11-20|1995-11-06|DELIVER IN PERSON|RAIL|lites. even theodolite +993|400|57|3|10|13004.00|0.03|0.08|N|O|1995-12-17|1995-11-13|1995-12-20|NONE|RAIL|encies wake fur +993|1908|97|4|40|72396.00|0.01|0.01|N|O|1995-11-16|1995-11-01|1995-12-05|TAKE BACK RETURN|RAIL|gle above the furiously +993|1455|56|5|33|44762.85|0.09|0.08|N|O|1995-09-28|1995-10-24|1995-10-03|COLLECT COD|RAIL|fluffily. quiet excuses sleep furiously sly +993|1370|85|6|35|44497.95|0.04|0.02|N|O|1995-10-26|1995-10-20|1995-11-05|DELIVER IN PERSON|FOB|es. ironic, ironic requests +993|50|26|7|15|14250.75|0.09|0.03|N|O|1995-09-27|1995-10-21|1995-10-17|DELIVER IN PERSON|MAIL|sits. pending pinto beans haggle? ca +994|645|46|1|4|6182.56|0.07|0.03|R|F|1994-07-05|1994-05-21|1994-07-20|COLLECT COD|SHIP|aggle carefully acc +994|92|18|2|11|10912.99|0.01|0.00|R|F|1994-05-03|1994-06-10|1994-05-22|NONE|AIR|ular accounts sleep +994|308|93|3|5|6041.50|0.08|0.08|A|F|1994-06-24|1994-06-14|1994-06-26|NONE|MAIL|ainst the pending requests. packages sl +994|1305|20|4|25|30157.50|0.10|0.00|A|F|1994-06-03|1994-06-02|1994-06-06|COLLECT COD|RAIL|usual pinto beans. +995|1723|50|1|15|24370.80|0.08|0.05|N|O|1995-06-30|1995-08-04|1995-07-27|NONE|REG AIR|uses. fluffily fina +995|1288|26|2|28|33299.84|0.08|0.03|N|F|1995-06-12|1995-07-20|1995-06-19|DELIVER IN PERSON|SHIP|pades. quick, final frays use flu +995|1651|34|3|45|69869.25|0.00|0.05|N|O|1995-08-02|1995-07-21|1995-08-03|DELIVER IN PERSON|SHIP|lar packages detect blithely above t +995|658|21|4|25|38966.25|0.01|0.08|N|O|1995-09-08|1995-08-05|1995-09-28|NONE|TRUCK|lyly even +995|232|33|5|18|20380.14|0.06|0.03|N|O|1995-07-03|1995-07-29|1995-07-22|TAKE BACK RETURN|AIR| even accounts unwind c +996|1724|9|1|43|69905.96|0.03|0.06|N|O|1998-03-27|1998-03-25|1998-04-06|COLLECT COD|SHIP| the blithely ironic foxes. slyly silent d +997|1627|28|1|11|16814.82|0.00|0.02|N|O|1997-06-16|1997-07-21|1997-07-14|DELIVER IN PERSON|TRUCK|p furiously according to t +997|475|76|2|17|23382.99|0.03|0.00|N|O|1997-07-28|1997-07-26|1997-08-20|DELIVER IN PERSON|SHIP|aggle quickly furiously +998|100|76|1|22|22002.20|0.04|0.05|A|F|1994-12-03|1995-02-17|1994-12-19|TAKE BACK RETURN|RAIL|lites. qui +998|1805|92|2|7|11947.60|0.10|0.05|R|F|1995-03-24|1995-01-18|1995-04-03|NONE|MAIL|nic deposits. even asym +998|1418|58|3|30|39582.30|0.05|0.07|A|F|1994-12-02|1995-01-23|1994-12-23|NONE|SHIP|lyly idle Tir +998|102|55|4|6|6012.60|0.09|0.05|R|F|1995-03-20|1994-12-27|1995-04-13|DELIVER IN PERSON|MAIL|refully accounts. carefully express ac +998|725|90|5|1|1625.72|0.04|0.00|R|F|1995-01-05|1995-01-06|1995-01-13|NONE|SHIP|es sleep. regular dependencies use bl +999|601|95|1|34|51054.40|0.00|0.08|R|F|1993-10-30|1993-10-17|1993-10-31|TAKE BACK RETURN|SHIP|its. daringly final instruc +999|1988|33|2|41|77489.18|0.08|0.01|A|F|1993-10-16|1993-12-04|1993-11-03|DELIVER IN PERSON|REG AIR|us depths. carefully ironic instruc +999|1172|45|3|15|16097.55|0.07|0.06|A|F|1993-12-12|1993-10-18|1994-01-08|COLLECT COD|REG AIR|y ironic requests. carefully regu +999|27|28|4|10|9270.20|0.05|0.02|A|F|1993-11-23|1993-12-02|1993-11-29|NONE|MAIL|efully pending +999|184|85|5|3|3252.54|0.03|0.00|R|F|1993-09-17|1993-10-22|1993-10-13|NONE|FOB|nic, pending ideas. bl +999|1810|40|6|37|63336.97|0.00|0.04|R|F|1994-01-03|1993-10-28|1994-01-12|DELIVER IN PERSON|TRUCK|ckly slyly unusual packages: packages hagg +1024|1981|70|1|49|92266.02|0.03|0.05|N|O|1998-03-06|1998-01-26|1998-03-29|TAKE BACK RETURN|FOB|ts. asymptotes nag fur +1024|1254|29|2|34|39278.50|0.00|0.01|N|O|1998-01-06|1998-02-05|1998-01-26|COLLECT COD|SHIP|des the slyly even +1024|436|24|3|28|37420.04|0.04|0.01|N|O|1998-03-04|1998-03-12|1998-03-15|TAKE BACK RETURN|TRUCK|e blithely regular pi +1024|1833|77|4|13|22552.79|0.02|0.04|N|O|1998-04-11|1998-02-26|1998-04-18|NONE|FOB|e slyly around the slyly special instructi +1024|209|91|5|49|54350.80|0.02|0.04|N|O|1998-02-27|1998-03-10|1998-03-27|COLLECT COD|FOB| carefully bold +1025|1494|95|1|36|50237.64|0.03|0.04|A|F|1995-05-15|1995-07-05|1995-06-10|COLLECT COD|FOB|e unusual, regular instr +1025|683|84|2|23|36424.64|0.08|0.03|N|F|1995-06-02|1995-07-29|1995-06-23|COLLECT COD|RAIL| regular platelets nag carefu +1025|225|80|3|25|28130.50|0.06|0.05|R|F|1995-05-29|1995-06-21|1995-06-13|DELIVER IN PERSON|REG AIR|xpress foxes. furiousl +1026|373|58|1|36|45841.32|0.10|0.02|N|O|1997-06-14|1997-07-20|1997-06-23|NONE|SHIP|st the ide +1026|369|26|2|6|7616.16|0.10|0.08|N|O|1997-07-07|1997-08-16|1997-07-14|TAKE BACK RETURN|TRUCK|to beans. special, regular packages hagg +1027|1560|41|1|43|62847.08|0.07|0.08|R|F|1992-06-17|1992-08-28|1992-07-10|DELIVER IN PERSON|MAIL|oxes. carefully regular deposits +1027|1125|98|2|20|20522.40|0.01|0.02|A|F|1992-06-08|1992-08-29|1992-06-14|NONE|TRUCK|ar excuses eat f +1027|1257|69|3|2|2316.50|0.01|0.02|R|F|1992-08-28|1992-07-09|1992-09-10|NONE|FOB|s. quickly unusual waters inside +1027|993|96|4|13|24621.87|0.08|0.01|R|F|1992-08-22|1992-07-10|1992-09-12|DELIVER IN PERSON|RAIL|ily ironic ideas use +1027|1355|94|5|22|27639.70|0.02|0.00|A|F|1992-09-03|1992-08-14|1992-10-01|DELIVER IN PERSON|FOB|the furiously express ex +1027|1050|86|6|10|9510.50|0.06|0.08|R|F|1992-08-28|1992-08-06|1992-09-03|COLLECT COD|REG AIR|ilent, express foxes near the blithely sp +1028|1279|17|1|2|2360.54|0.09|0.03|A|F|1994-01-10|1994-03-22|1994-01-26|COLLECT COD|FOB|s alongside of the regular asymptotes sleep +1028|1119|92|2|39|39784.29|0.06|0.05|R|F|1994-02-18|1994-03-22|1994-03-06|TAKE BACK RETURN|MAIL| final dependencies affix a +1028|996|65|3|8|15175.92|0.03|0.07|A|F|1994-02-14|1994-03-28|1994-02-22|NONE|AIR|e carefully final packages. furiously fi +1028|313|42|4|26|31546.06|0.07|0.02|A|F|1994-03-18|1994-02-08|1994-03-19|TAKE BACK RETURN|RAIL|ronic platelets. carefully f +1028|286|68|5|27|32029.56|0.00|0.04|A|F|1994-04-03|1994-02-07|1994-04-26|NONE|REG AIR|ial accounts nag. slyly +1028|252|80|6|39|44937.75|0.03|0.02|A|F|1994-02-27|1994-02-16|1994-03-02|DELIVER IN PERSON|AIR|c theodoli +1028|310|67|7|22|26626.82|0.03|0.00|R|F|1994-04-24|1994-02-27|1994-05-08|NONE|REG AIR| Tiresias alongside of the carefully spec +1029|1362|1|1|45|56851.20|0.05|0.07|R|F|1994-07-21|1994-08-30|1994-07-29|TAKE BACK RETURN|FOB|sits boost blithely +1030|644|38|1|17|26258.88|0.06|0.06|R|F|1994-10-13|1994-08-01|1994-11-10|DELIVER IN PERSON|RAIL|ly. carefully even packages dazz +1031|456|57|1|15|20346.75|0.10|0.08|A|F|1994-11-07|1994-10-29|1994-11-09|TAKE BACK RETURN|FOB|about the carefully bold a +1031|1648|90|2|28|43389.92|0.05|0.01|A|F|1994-12-10|1994-10-29|1994-12-18|COLLECT COD|FOB|ly ironic accounts across the q +1031|1870|100|3|27|47840.49|0.07|0.02|R|F|1994-09-20|1994-10-18|1994-10-10|DELIVER IN PERSON|SHIP|gular deposits cajole. blithely unus +1031|872|39|4|7|12410.09|0.03|0.03|R|F|1994-12-07|1994-11-11|1994-12-30|COLLECT COD|FOB|r instructions. car +1031|1902|35|5|44|79371.60|0.01|0.07|R|F|1994-11-20|1994-11-24|1994-12-11|NONE|AIR|re slyly above the furio +1056|1210|48|1|37|41114.77|0.04|0.06|R|F|1995-02-18|1995-04-01|1995-03-20|NONE|TRUCK| special packages. qui +1057|1923|68|1|29|52922.68|0.10|0.01|A|F|1992-05-05|1992-05-05|1992-06-03|TAKE BACK RETURN|SHIP|es wake according to the q +1057|1681|23|2|11|17409.48|0.00|0.02|R|F|1992-03-31|1992-04-18|1992-04-18|COLLECT COD|AIR|yly final theodolites. furi +1057|842|9|3|21|36599.64|0.03|0.04|A|F|1992-02-28|1992-05-01|1992-03-10|NONE|REG AIR|ar orbits boost bli +1057|1819|6|4|20|34416.20|0.06|0.03|R|F|1992-03-02|1992-05-19|1992-03-13|DELIVER IN PERSON|TRUCK|s wake bol +1057|965|68|5|7|13061.72|0.06|0.05|R|F|1992-06-05|1992-04-30|1992-06-20|NONE|TRUCK|y slyly express theodolites. slyly bo +1057|515|76|6|19|26894.69|0.04|0.07|A|F|1992-05-31|1992-05-09|1992-06-02|DELIVER IN PERSON|FOB|r-- packages haggle alon +1058|1396|11|1|24|31137.36|0.08|0.04|A|F|1993-07-09|1993-05-28|1993-07-22|DELIVER IN PERSON|TRUCK|fully ironic accounts. express accou +1058|881|81|2|5|8909.40|0.04|0.07|R|F|1993-05-11|1993-05-29|1993-05-27|COLLECT COD|TRUCK|refully even requests boost along +1058|893|94|3|44|78931.16|0.10|0.01|R|F|1993-06-26|1993-06-21|1993-07-20|COLLECT COD|TRUCK|uriously f +1058|42|18|4|25|23551.00|0.09|0.01|A|F|1993-05-27|1993-06-10|1993-06-20|TAKE BACK RETURN|MAIL| the final requests believe carefully +1059|1776|77|1|16|26844.32|0.07|0.02|A|F|1994-04-24|1994-03-31|1994-04-28|DELIVER IN PERSON|SHIP|y ironic pinto +1059|289|71|2|7|8324.96|0.07|0.06|R|F|1994-03-30|1994-04-01|1994-04-24|DELIVER IN PERSON|MAIL|the furiously silent excuses are e +1059|880|14|3|45|80139.60|0.00|0.02|R|F|1994-06-10|1994-05-08|1994-06-21|COLLECT COD|RAIL|riously even theodolites. slyly regula +1059|1098|4|4|26|25976.34|0.09|0.01|A|F|1994-03-17|1994-04-18|1994-03-26|DELIVER IN PERSON|TRUCK|ar pinto beans at the furiously +1059|1381|20|5|37|47448.06|0.09|0.04|R|F|1994-03-31|1994-05-08|1994-04-06|COLLECT COD|RAIL| packages lose in place of the slyly unusu +1059|1893|37|6|50|89744.50|0.00|0.03|A|F|1994-06-15|1994-05-11|1994-06-29|NONE|MAIL|s impress furiously about +1059|1222|23|7|13|14601.86|0.01|0.03|R|F|1994-06-12|1994-05-11|1994-07-02|COLLECT COD|TRUCK|usly regular theodo +1060|1955|88|1|8|14855.60|0.07|0.04|R|F|1993-05-21|1993-05-06|1993-06-10|DELIVER IN PERSON|FOB|iously. furiously regular in +1060|77|53|2|26|25403.82|0.06|0.08|R|F|1993-04-12|1993-04-01|1993-04-20|DELIVER IN PERSON|TRUCK|counts; even deposits are carefull +1060|1632|74|3|11|16869.93|0.01|0.07|A|F|1993-05-13|1993-05-08|1993-05-17|TAKE BACK RETURN|MAIL|e regular deposits: re +1060|1099|5|4|16|16001.44|0.03|0.06|A|F|1993-06-15|1993-04-18|1993-07-05|COLLECT COD|SHIP|ccounts. foxes maintain care +1060|529|90|5|1|1429.52|0.04|0.06|A|F|1993-06-19|1993-05-10|1993-06-21|COLLECT COD|RAIL|posits detect carefully abo +1060|714|47|6|26|41982.46|0.01|0.03|A|F|1993-02-28|1993-04-01|1993-03-09|TAKE BACK RETURN|FOB|quickly abo +1060|1202|77|7|36|39715.20|0.09|0.01|R|F|1993-03-14|1993-03-24|1993-04-02|TAKE BACK RETURN|FOB|r the quickly +1061|1501|82|1|7|9817.50|0.04|0.04|N|O|1998-08-09|1998-08-12|1998-08-16|COLLECT COD|FOB|es are slyly expr +1061|1186|23|2|2|2174.36|0.06|0.02|N|O|1998-08-15|1998-08-05|1998-08-24|COLLECT COD|MAIL|. regular accounts impre +1061|1102|75|3|26|26080.60|0.08|0.02|N|O|1998-06-18|1998-07-25|1998-06-24|TAKE BACK RETURN|AIR|ave to slee +1061|1354|55|4|41|51469.35|0.00|0.05|N|O|1998-06-29|1998-07-02|1998-07-27|NONE|MAIL|s are. ironic theodolites cajole. dep +1061|1301|2|5|50|60115.00|0.04|0.08|N|O|1998-05-25|1998-07-22|1998-06-22|COLLECT COD|AIR|nding excuses are around the e +1061|1435|75|6|35|46775.05|0.09|0.05|N|O|1998-07-05|1998-07-07|1998-07-30|TAKE BACK RETURN|MAIL|ending requests nag careful +1062|1361|62|1|38|47969.68|0.00|0.01|N|O|1997-01-27|1997-03-07|1997-02-16|DELIVER IN PERSON|TRUCK|deas. pending acc +1063|951|20|1|42|77781.90|0.03|0.02|A|F|1994-07-10|1994-05-25|1994-07-26|NONE|RAIL|tructions about the blithely ex +1088|1069|70|1|30|29101.80|0.07|0.03|A|F|1992-05-22|1992-06-25|1992-06-11|TAKE BACK RETURN|SHIP|long the packages snooze careful +1088|369|54|2|11|13962.96|0.06|0.00|A|F|1992-08-30|1992-07-25|1992-09-10|TAKE BACK RETURN|AIR|inal requests. fluffily express theod +1088|1804|48|3|5|8529.00|0.03|0.07|A|F|1992-07-01|1992-07-25|1992-07-02|NONE|AIR|refully ironic packages. r +1088|1240|41|4|3|3423.72|0.09|0.03|A|F|1992-06-15|1992-08-02|1992-06-18|DELIVER IN PERSON|MAIL|pecial theodolites +1089|1501|22|1|47|65917.50|0.05|0.06|N|O|1996-06-26|1996-06-25|1996-07-11|NONE|TRUCK|aggle furiously among the bravely eve +1089|500|30|2|35|49017.50|0.03|0.00|N|O|1996-08-14|1996-07-10|1996-08-26|NONE|TRUCK|ly express deposits haggle +1089|252|53|3|23|26501.75|0.10|0.05|N|O|1996-06-24|1996-07-25|1996-07-20|DELIVER IN PERSON|AIR|g dolphins. deposits integrate. s +1089|1405|23|4|1|1306.40|0.01|0.03|N|O|1996-07-08|1996-07-07|1996-07-17|COLLECT COD|RAIL|n courts among the caref +1090|216|17|1|5|5581.05|0.02|0.05|N|O|1998-02-19|1997-12-25|1998-02-24|DELIVER IN PERSON|AIR|s above the +1090|1125|98|2|28|28731.36|0.08|0.08|N|O|1998-02-20|1998-01-03|1998-03-19|NONE|FOB|s cajole above the regular +1091|373|74|1|40|50934.80|0.10|0.06|N|O|1996-12-17|1996-10-14|1996-12-24|TAKE BACK RETURN|REG AIR|platelets. regular packag +1092|1835|36|1|48|83367.84|0.04|0.04|N|O|1995-06-25|1995-04-06|1995-07-18|DELIVER IN PERSON|AIR|unusual accounts. fluffi +1092|1527|48|2|1|1428.52|0.01|0.06|A|F|1995-03-10|1995-04-21|1995-04-06|COLLECT COD|RAIL|lent, pending requests-- requests nag accor +1092|1608|91|3|28|42268.80|0.05|0.08|R|F|1995-04-08|1995-05-01|1995-05-02|DELIVER IN PERSON|FOB|affix carefully. u +1092|852|53|4|2|3505.70|0.05|0.07|R|F|1995-04-09|1995-05-12|1995-05-03|TAKE BACK RETURN|TRUCK|ans. slyly eve +1093|870|37|1|7|12396.09|0.04|0.02|N|O|1997-11-24|1997-09-23|1997-11-25|TAKE BACK RETURN|SHIP|bold deposits. blithely ironic depos +1093|1763|90|2|37|61596.12|0.08|0.04|N|O|1997-11-06|1997-10-08|1997-11-22|COLLECT COD|FOB|le furiously across the carefully sp +1093|605|6|3|34|51190.40|0.01|0.06|N|O|1997-11-07|1997-09-06|1997-11-28|TAKE BACK RETURN|REG AIR|sits. express accounts play carefully. bol +1094|1145|46|1|9|9415.26|0.07|0.06|N|O|1997-12-28|1998-03-16|1998-01-18|DELIVER IN PERSON|AIR|as. slyly pe +1095|1361|100|1|33|41657.88|0.01|0.02|N|O|1995-10-03|1995-09-22|1995-10-13|NONE|MAIL|slyly around the iron +1095|1360|75|2|24|30272.64|0.04|0.06|N|O|1995-08-24|1995-10-20|1995-09-09|COLLECT COD|TRUCK|packages nod furiously above the carefully +1095|1553|94|3|13|18909.15|0.06|0.01|N|O|1995-08-24|1995-10-19|1995-09-02|TAKE BACK RETURN|REG AIR|ously even accounts. slyly bold a +1095|1344|59|4|28|34869.52|0.08|0.03|N|O|1995-09-20|1995-11-18|1995-10-02|DELIVER IN PERSON|SHIP| regular pac +1095|1118|27|5|40|40764.40|0.09|0.03|N|O|1995-10-18|1995-11-14|1995-11-09|NONE|MAIL| bold accounts haggle slyly furiously even +1095|1804|48|6|37|63114.60|0.07|0.08|N|O|1995-10-04|1995-11-13|1995-10-12|NONE|SHIP|. quickly even dolphins sle +1120|1780|23|1|10|16817.80|0.08|0.05|N|O|1997-12-17|1998-01-21|1997-12-23|DELIVER IN PERSON|MAIL|dependencies. blithel +1120|191|92|2|49|53468.31|0.01|0.07|N|O|1998-01-03|1998-02-02|1998-01-09|TAKE BACK RETURN|RAIL|heodolites. quick re +1120|755|88|3|21|34770.75|0.06|0.01|N|O|1998-01-11|1998-02-04|1998-01-19|COLLECT COD|REG AIR|s: fluffily even packages c +1120|457|16|4|22|29863.90|0.09|0.08|N|O|1997-11-15|1998-01-25|1997-12-07|TAKE BACK RETURN|REG AIR|ons. slyly silent requests sleep silent +1120|825|26|5|10|17258.20|0.07|0.08|N|O|1997-11-10|1998-02-01|1997-11-28|TAKE BACK RETURN|AIR|ages haggle furiously +1121|1678|2|1|42|66346.14|0.04|0.05|N|O|1997-03-05|1997-03-18|1997-03-14|DELIVER IN PERSON|SHIP|nts are slyly special packages. f +1121|1603|45|2|27|40624.20|0.08|0.00|N|O|1997-05-08|1997-03-28|1997-05-14|NONE|MAIL|ly ironic accounts cajole slyly abou +1121|1569|10|3|10|14705.60|0.00|0.04|N|O|1997-04-17|1997-03-18|1997-05-02|TAKE BACK RETURN|RAIL|dencies. quickly regular theodolites n +1121|1653|77|4|29|45084.85|0.02|0.01|N|O|1997-03-07|1997-04-02|1997-04-01|DELIVER IN PERSON|REG AIR| use furiously. quickly silent package +1121|298|53|5|47|56319.63|0.09|0.03|N|O|1997-04-27|1997-03-28|1997-05-14|COLLECT COD|FOB|ly idle, i +1121|1995|96|6|50|94849.50|0.06|0.03|N|O|1997-04-21|1997-02-16|1997-04-25|NONE|TRUCK|odolites. slyly even accounts +1121|791|88|7|37|62596.23|0.06|0.01|N|O|1997-02-27|1997-03-04|1997-03-02|COLLECT COD|RAIL|special packages. fluffily final requests s +1122|912|15|1|8|14503.28|0.10|0.06|N|O|1997-02-02|1997-04-03|1997-02-22|TAKE BACK RETURN|RAIL|c foxes are along the slyly r +1122|1818|5|2|29|49874.49|0.05|0.04|N|O|1997-05-07|1997-04-07|1997-05-15|COLLECT COD|SHIP|ptotes. quickl +1122|1465|83|3|25|34161.50|0.09|0.01|N|O|1997-03-21|1997-03-03|1997-04-07|TAKE BACK RETURN|RAIL|d furiously. pinto +1122|1057|93|4|40|38322.00|0.08|0.08|N|O|1997-02-07|1997-03-25|1997-02-25|NONE|REG AIR|packages sleep after the asym +1122|1504|5|5|15|21082.50|0.05|0.03|N|O|1997-04-15|1997-03-15|1997-05-07|COLLECT COD|SHIP|olve blithely regular, +1122|1619|43|6|24|36494.64|0.04|0.01|N|O|1997-03-08|1997-02-20|1997-04-05|NONE|RAIL|blithely requests. slyly pending r +1122|3|54|7|38|34314.00|0.00|0.08|N|O|1997-01-23|1997-04-02|1997-02-16|NONE|TRUCK|t theodolites sleep. even, ironic +1123|112|91|1|10|10121.10|0.05|0.08|N|O|1996-11-12|1996-10-04|1996-11-30|NONE|MAIL|ckages are above the depths. slyly ir +1123|1776|19|2|39|65433.03|0.03|0.08|N|O|1996-08-25|1996-10-21|1996-09-04|DELIVER IN PERSON|REG AIR|rding to the furiously ironic requests: r +1123|1009|45|3|38|34580.00|0.03|0.08|N|O|1996-09-23|1996-10-04|1996-09-27|DELIVER IN PERSON|FOB| blithely carefully unusual reques +1124|1978|11|1|1|1879.97|0.09|0.08|N|O|1998-10-06|1998-10-02|1998-10-30|NONE|REG AIR| instructions cajole qu +1124|54|5|2|13|12402.65|0.05|0.04|N|O|1998-09-05|1998-10-03|1998-09-30|DELIVER IN PERSON|SHIP|t the slyly +1124|923|58|3|35|63837.20|0.10|0.05|N|O|1998-11-25|1998-10-08|1998-12-25|TAKE BACK RETURN|AIR|ut the slyly bold pinto beans; fi +1124|492|93|4|25|34812.25|0.08|0.05|N|O|1998-08-05|1998-10-14|1998-08-11|NONE|MAIL|ggle slyly according +1124|749|82|5|33|54441.42|0.05|0.04|N|O|1998-10-19|1998-09-17|1998-10-26|TAKE BACK RETURN|SHIP|eposits sleep slyly. stealthily f +1124|268|23|6|43|50235.18|0.01|0.03|N|O|1998-09-19|1998-10-28|1998-10-10|COLLECT COD|MAIL|across the +1124|942|43|7|1|1842.94|0.09|0.01|N|O|1998-10-07|1998-08-31|1998-10-12|NONE|TRUCK|ly bold accou +1125|1321|98|1|4|4889.28|0.08|0.02|A|F|1994-12-10|1994-12-28|1994-12-30|NONE|MAIL| quickly express packages a +1125|1378|79|2|24|30704.88|0.10|0.03|R|F|1995-01-31|1994-12-02|1995-02-20|COLLECT COD|AIR|es about the slyly s +1125|1211|49|3|26|28917.46|0.05|0.04|A|F|1995-02-24|1995-01-18|1995-03-05|COLLECT COD|TRUCK|l instruction +1125|979|48|4|29|54519.13|0.06|0.00|A|F|1994-11-29|1994-12-20|1994-12-10|DELIVER IN PERSON|RAIL| platelets wake against the carefully i +1126|351|36|1|44|55059.40|0.08|0.03|N|O|1998-05-07|1998-04-02|1998-05-29|NONE|TRUCK|es. carefully special +1126|572|33|2|7|10307.99|0.06|0.01|N|O|1998-05-02|1998-03-22|1998-05-21|COLLECT COD|MAIL|ons. final, unusual +1126|1467|46|3|14|19158.44|0.07|0.07|N|O|1998-04-17|1998-04-15|1998-05-12|DELIVER IN PERSON|TRUCK|nstructions. blithe +1127|426|56|1|35|46424.70|0.02|0.03|N|O|1995-11-25|1995-11-03|1995-12-17|NONE|TRUCK|l instructions boost blithely according +1127|1098|69|2|38|37965.42|0.09|0.05|N|O|1995-11-07|1995-11-11|1995-11-26|DELIVER IN PERSON|RAIL|. never final packages boost acro +1127|197|98|3|29|31818.51|0.09|0.07|N|O|1995-09-20|1995-11-21|1995-10-11|DELIVER IN PERSON|REG AIR|y. blithely r +1127|1744|45|4|7|11520.18|0.07|0.05|N|O|1995-11-05|1995-11-02|1995-11-11|DELIVER IN PERSON|FOB| idly pending pains +1152|87|88|1|23|22702.84|0.06|0.04|A|F|1994-10-14|1994-10-22|1994-10-21|DELIVER IN PERSON|MAIL|equests alongside of the unusual +1152|997|32|2|25|47449.75|0.04|0.08|R|F|1994-10-20|1994-09-18|1994-10-28|DELIVER IN PERSON|REG AIR|efully ironic accounts. sly instructions wa +1152|419|49|3|6|7916.46|0.07|0.03|A|F|1994-12-07|1994-11-05|1994-12-25|DELIVER IN PERSON|FOB|p furiously; packages above th +1153|851|51|1|15|26277.75|0.00|0.08|N|O|1996-04-24|1996-07-17|1996-04-29|TAKE BACK RETURN|SHIP|uctions boost fluffily according to +1153|1690|32|2|50|79584.50|0.00|0.07|N|O|1996-06-27|1996-07-13|1996-07-05|COLLECT COD|REG AIR|ronic asymptotes nag slyly. +1153|434|35|3|25|33360.75|0.00|0.05|N|O|1996-06-18|1996-06-28|1996-07-09|NONE|TRUCK| theodolites +1153|912|13|4|43|77955.13|0.01|0.00|N|O|1996-06-09|1996-06-01|1996-07-04|DELIVER IN PERSON|MAIL|special instructions are. unusual, final du +1153|1413|92|5|45|59148.45|0.00|0.02|N|O|1996-06-18|1996-06-20|1996-07-03|TAKE BACK RETURN|AIR|oss the ex +1153|1354|55|6|26|32639.10|0.02|0.03|N|O|1996-08-16|1996-07-12|1996-09-08|NONE|MAIL|kages haggle carefully. f +1153|1919|64|7|5|9104.55|0.02|0.03|N|O|1996-05-03|1996-06-12|1996-05-28|TAKE BACK RETURN|FOB|special excuses promi +1154|1428|68|1|31|41212.02|0.06|0.06|A|F|1992-04-17|1992-04-26|1992-05-17|COLLECT COD|AIR|ithely. final, blithe +1154|1475|93|2|50|68823.50|0.07|0.06|A|F|1992-04-22|1992-04-21|1992-05-01|NONE|TRUCK|ove the furiously bold Tires +1154|962|65|3|5|9314.80|0.09|0.04|A|F|1992-06-07|1992-05-07|1992-07-05|DELIVER IN PERSON|MAIL|the furiously +1154|6|7|4|35|31710.00|0.00|0.07|A|F|1992-03-30|1992-04-02|1992-04-21|DELIVER IN PERSON|TRUCK|the carefully regular pinto beans boost +1154|355|84|5|18|22596.30|0.02|0.03|A|F|1992-02-26|1992-03-24|1992-03-20|TAKE BACK RETURN|REG AIR|y regular excuses cajole blithely. fi +1154|1952|97|6|50|92697.50|0.06|0.03|A|F|1992-03-04|1992-04-01|1992-04-01|TAKE BACK RETURN|TRUCK| even, special +1155|694|95|1|4|6378.76|0.09|0.05|N|O|1997-10-19|1997-12-09|1997-11-02|DELIVER IN PERSON|SHIP|ic foxes according to the carefully final +1155|1958|47|2|39|72538.05|0.08|0.05|N|O|1998-01-29|1998-01-03|1998-02-01|COLLECT COD|TRUCK|ckly final pinto beans was. +1155|1468|8|3|23|31497.58|0.08|0.03|N|O|1997-11-24|1997-11-28|1997-12-06|DELIVER IN PERSON|FOB|ly unusual packages. iro +1155|1393|94|4|12|15532.68|0.01|0.06|N|O|1997-11-01|1998-01-03|1997-11-19|DELIVER IN PERSON|RAIL|packages do +1155|44|20|5|49|46257.96|0.04|0.08|N|O|1997-12-07|1997-12-30|1997-12-08|NONE|AIR|ccounts are alongside of t +1156|867|34|1|15|26517.90|0.07|0.06|N|O|1996-12-21|1997-01-03|1997-01-10|TAKE BACK RETURN|AIR|the furiously pen +1156|325|26|2|21|25731.72|0.02|0.08|N|O|1996-11-07|1997-01-14|1996-12-03|NONE|AIR|dolphins. fluffily ironic packages sleep re +1156|112|91|3|29|29351.19|0.09|0.06|N|O|1997-01-24|1996-12-26|1997-02-04|DELIVER IN PERSON|TRUCK|ts sleep sly +1156|1715|16|4|42|67901.82|0.02|0.00|N|O|1997-01-18|1997-01-12|1997-02-13|NONE|REG AIR|s. quickly bold pains are +1156|738|71|5|49|80297.77|0.04|0.01|N|O|1996-11-16|1996-12-02|1996-12-05|COLLECT COD|AIR|ithely unusual in +1156|1941|74|6|42|77403.48|0.02|0.06|N|O|1997-01-27|1997-01-09|1997-01-28|DELIVER IN PERSON|MAIL|even requests boost ironic deposits. pe +1156|462|50|7|20|27249.20|0.08|0.07|N|O|1997-01-01|1997-01-06|1997-01-16|COLLECT COD|MAIL|deposits sleep bravel +1157|482|41|1|16|22119.68|0.06|0.00|N|O|1998-04-12|1998-03-09|1998-04-23|DELIVER IN PERSON|MAIL|tions hang +1157|821|88|2|4|6887.28|0.10|0.05|N|O|1998-02-24|1998-03-30|1998-03-24|DELIVER IN PERSON|SHIP|ounts. ironic deposits +1157|480|68|3|8|11043.84|0.02|0.00|N|O|1998-03-25|1998-03-16|1998-03-29|NONE|REG AIR|blithely even pa +1157|770|71|4|46|76855.42|0.07|0.08|N|O|1998-04-19|1998-03-13|1998-04-23|NONE|FOB|slyly regular excuses. accounts +1157|1599|80|5|14|21008.26|0.03|0.03|N|O|1998-04-17|1998-03-03|1998-05-01|NONE|FOB|theodolites. fluffily re +1158|443|73|1|5|6717.20|0.02|0.04|N|O|1996-10-20|1996-07-30|1996-11-14|COLLECT COD|AIR|symptotes along the care +1158|1561|82|2|23|33638.88|0.00|0.08|N|O|1996-10-21|1996-08-19|1996-10-31|COLLECT COD|MAIL|ularly ironic requests use care +1159|1081|82|1|39|38301.12|0.01|0.00|A|F|1992-11-20|1992-10-28|1992-12-18|TAKE BACK RETURN|FOB| blithely express reques +1159|955|24|2|7|12991.65|0.08|0.00|A|F|1992-11-25|1992-10-27|1992-12-20|NONE|AIR|olve somet +1159|975|10|3|11|20635.67|0.10|0.03|R|F|1992-12-09|1992-12-07|1992-12-18|DELIVER IN PERSON|MAIL|h furiousl +1184|468|98|1|27|36948.42|0.01|0.00|N|O|1998-01-10|1997-12-02|1998-02-06|TAKE BACK RETURN|REG AIR|s wake fluffily. fl +1184|1467|46|2|4|5473.84|0.04|0.03|N|O|1997-12-25|1998-01-24|1998-01-18|DELIVER IN PERSON|RAIL| express packages. slyly expres +1184|1640|41|3|7|10791.48|0.05|0.00|N|O|1998-02-14|1998-01-06|1998-03-11|COLLECT COD|TRUCK|ckly warthogs. blithely bold foxes hag +1184|1256|68|4|3|3471.75|0.02|0.05|N|O|1998-01-15|1997-12-19|1998-02-02|NONE|REG AIR|ar packages. final packages cajol +1185|720|85|1|8|12965.76|0.01|0.06|A|F|1992-12-05|1992-10-05|1992-12-28|DELIVER IN PERSON|MAIL|ely according to the furiously regular r +1185|308|9|2|28|33832.40|0.07|0.06|A|F|1992-09-24|1992-10-07|1992-10-10|DELIVER IN PERSON|REG AIR|ke. slyly regular t +1185|1894|38|3|12|21550.68|0.05|0.06|R|F|1992-10-12|1992-09-26|1992-11-11|NONE|REG AIR|instructions. daringly pend +1186|25|26|1|28|25900.56|0.08|0.07|N|O|1996-12-08|1996-10-17|1996-12-15|TAKE BACK RETURN|TRUCK|ffily spec +1186|912|81|2|11|19942.01|0.07|0.05|N|O|1996-10-03|1996-10-21|1996-10-17|DELIVER IN PERSON|AIR|s haggle furiously; slyl +1186|1008|9|3|20|18180.00|0.07|0.07|N|O|1996-08-20|1996-10-23|1996-09-05|COLLECT COD|FOB|ely alongside of the blithel +1186|1060|61|4|27|25948.62|0.06|0.04|N|O|1996-10-08|1996-11-06|1996-10-09|TAKE BACK RETURN|SHIP|accounts. express, e +1187|1778|5|1|29|48713.33|0.01|0.04|R|F|1992-12-10|1993-02-09|1992-12-29|TAKE BACK RETURN|RAIL|riously express ac +1187|1305|44|2|15|18094.50|0.03|0.04|A|F|1992-12-22|1993-01-13|1993-01-01|NONE|TRUCK|ests. foxes wake. carefu +1187|773|6|3|40|66950.80|0.08|0.06|R|F|1993-03-05|1992-12-31|1993-03-12|NONE|TRUCK|ar, brave deposits nag blithe +1188|1150|87|1|2|2102.30|0.00|0.04|N|O|1996-05-22|1996-05-23|1996-06-06|COLLECT COD|RAIL|its breach blit +1188|1121|22|2|9|9199.08|0.01|0.08|N|O|1996-08-04|1996-06-04|1996-08-19|NONE|REG AIR|ow carefully ironic d +1188|1788|89|3|41|69280.98|0.07|0.04|N|O|1996-06-29|1996-05-21|1996-07-21|TAKE BACK RETURN|TRUCK|althy packages. fluffily unusual ideas h +1189|507|8|1|23|32372.50|0.06|0.00|R|F|1994-07-25|1994-06-07|1994-08-02|COLLECT COD|FOB|s. fluffy Tiresias run quickly. bra +1189|1049|55|2|32|30401.28|0.09|0.02|R|F|1994-05-06|1994-07-03|1994-05-15|TAKE BACK RETURN|FOB|e regular deposits. quickly quiet deposi +1189|566|97|3|22|32264.32|0.05|0.03|R|F|1994-06-09|1994-06-29|1994-06-23|DELIVER IN PERSON|TRUCK|quickly unusual platelets lose forges. ca +1190|838|38|1|32|55642.56|0.07|0.06|N|O|1997-05-08|1997-04-17|1997-06-01|COLLECT COD|FOB|y final packages? slyly even +1191|483|13|1|29|40120.92|0.00|0.04|N|O|1996-01-24|1996-01-28|1996-02-17|COLLECT COD|AIR| regular pin +1216|970|73|1|8|14967.76|0.03|0.04|R|F|1993-02-01|1993-03-06|1993-02-08|TAKE BACK RETURN|TRUCK| of the carefully express +1216|741|38|2|48|78803.52|0.10|0.01|R|F|1993-01-17|1993-02-01|1993-02-13|COLLECT COD|SHIP|symptotes use against th +1216|418|19|3|18|23731.38|0.00|0.03|A|F|1993-01-20|1993-01-28|1993-02-02|COLLECT COD|MAIL|y final packages nod +1217|592|53|1|45|67166.55|0.07|0.02|A|F|1992-07-01|1992-06-23|1992-07-06|COLLECT COD|AIR|riously close ideas +1218|1391|30|1|16|20678.24|0.04|0.07|A|F|1994-06-26|1994-08-07|1994-06-30|TAKE BACK RETURN|FOB|ven realms be +1218|934|69|2|41|75232.13|0.06|0.06|R|F|1994-08-04|1994-08-05|1994-08-11|TAKE BACK RETURN|SHIP|dolphins. theodolites beyond th +1218|479|67|3|44|60696.68|0.07|0.06|A|F|1994-10-05|1994-09-03|1994-10-30|COLLECT COD|TRUCK|thely ironic accounts wake slyly +1218|414|44|4|1|1314.41|0.01|0.08|R|F|1994-09-15|1994-09-07|1994-10-03|COLLECT COD|TRUCK|press furio +1219|1319|96|1|6|7321.86|0.08|0.04|N|O|1995-11-13|1995-12-24|1995-11-18|NONE|MAIL|pecial, ironic requ +1219|1286|24|2|4|4749.12|0.01|0.04|N|O|1995-11-24|1995-11-22|1995-12-07|TAKE BACK RETURN|SHIP|lly quick requests. blithely even h +1220|1690|14|1|25|39792.25|0.10|0.03|N|O|1996-10-15|1996-11-07|1996-11-06|COLLECT COD|REG AIR| regular orbi +1220|1598|79|2|36|53985.24|0.01|0.02|N|O|1996-12-10|1996-11-14|1997-01-07|COLLECT COD|SHIP|ar packages. blithely final acc +1220|369|70|3|3|3808.08|0.08|0.06|N|O|1996-09-06|1996-11-03|1996-09-10|COLLECT COD|REG AIR| final theodolites. blithely silent +1220|52|3|4|36|34273.80|0.07|0.03|N|O|1996-12-12|1996-10-03|1996-12-15|TAKE BACK RETURN|TRUCK|unusual, silent pinto beans aga +1220|490|49|5|25|34762.25|0.03|0.08|N|O|1996-09-11|1996-10-09|1996-09-25|DELIVER IN PERSON|RAIL|packages affi +1221|801|35|1|43|73177.40|0.05|0.05|R|F|1992-06-22|1992-07-15|1992-07-20|DELIVER IN PERSON|FOB|y slyly above the slyly unusual ideas +1221|1695|96|2|12|19160.28|0.00|0.08|R|F|1992-08-07|1992-06-24|1992-08-13|COLLECT COD|AIR|yly ironic +1221|683|46|3|3|4751.04|0.10|0.08|R|F|1992-07-01|1992-06-04|1992-07-27|COLLECT COD|TRUCK|ing to the fluffily +1221|1198|7|4|41|45066.79|0.06|0.02|A|F|1992-04-28|1992-07-02|1992-05-19|NONE|RAIL|ns. bold deposit +1221|1077|13|5|13|12714.91|0.10|0.00|R|F|1992-08-01|1992-06-29|1992-08-27|TAKE BACK RETURN|AIR|ajole furiously. blithely expres +1221|843|44|6|7|12206.88|0.08|0.06|A|F|1992-06-27|1992-06-16|1992-07-23|TAKE BACK RETURN|RAIL|xpress accounts +1222|713|10|1|12|19364.52|0.09|0.02|A|F|1993-02-12|1993-03-14|1993-03-12|TAKE BACK RETURN|RAIL|s print permanently unusual packages. +1222|1587|28|2|12|17862.96|0.08|0.01|A|F|1993-05-05|1993-03-27|1993-05-18|TAKE BACK RETURN|REG AIR| furiously bold instructions +1222|76|2|3|26|25377.82|0.02|0.08|R|F|1993-02-13|1993-03-20|1993-02-22|TAKE BACK RETURN|MAIL|, even accounts are ironic +1223|995|96|1|28|53087.72|0.10|0.06|N|O|1996-08-07|1996-07-24|1996-08-13|TAKE BACK RETURN|MAIL| quickly ironic requests. furious +1248|1631|32|1|45|68968.35|0.00|0.08|A|F|1992-04-17|1992-03-31|1992-05-13|NONE|RAIL|ter the pending pl +1248|1503|44|2|37|51966.50|0.06|0.06|R|F|1992-01-26|1992-02-05|1992-02-13|COLLECT COD|TRUCK|. final requests integrate quickly. blit +1248|554|45|3|26|37818.30|0.09|0.06|A|F|1992-01-16|1992-03-01|1992-02-06|TAKE BACK RETURN|AIR| ironic dependen +1248|1552|53|4|49|71223.95|0.02|0.01|A|F|1992-04-24|1992-02-18|1992-05-03|TAKE BACK RETURN|AIR|beans run quickly according to the carefu +1248|1215|53|5|20|22324.20|0.08|0.00|A|F|1992-03-12|1992-03-23|1992-04-07|TAKE BACK RETURN|AIR|nal foxes cajole carefully slyl +1248|615|78|6|30|45468.30|0.10|0.01|R|F|1992-02-01|1992-03-24|1992-02-08|TAKE BACK RETURN|MAIL|fily special foxes kindle am +1249|582|43|1|49|72646.42|0.07|0.05|A|F|1994-03-03|1994-02-28|1994-03-08|NONE|RAIL|ffily express theodo +1250|11|12|1|15|13665.15|0.10|0.06|A|F|1992-11-05|1992-12-17|1992-12-03|TAKE BACK RETURN|SHIP| regular, i +1251|34|35|1|37|34559.11|0.08|0.08|N|O|1997-12-21|1998-01-12|1997-12-26|COLLECT COD|AIR|. furiously +1251|780|81|2|36|60508.08|0.07|0.04|N|O|1997-11-29|1998-01-07|1997-12-03|TAKE BACK RETURN|RAIL|y ironic Tiresias are slyly furio +1251|988|91|3|37|69892.26|0.09|0.02|N|O|1998-01-11|1997-12-01|1998-01-23|DELIVER IN PERSON|RAIL|finally bold requests +1251|1499|17|4|7|9803.43|0.07|0.00|N|O|1998-01-08|1997-12-27|1998-01-18|COLLECT COD|MAIL|riously pe +1251|1875|62|5|1|1776.87|0.02|0.03|N|O|1997-12-08|1998-01-06|1998-01-01|DELIVER IN PERSON|REG AIR| use quickly final packages. iron +1252|865|99|1|13|22956.18|0.10|0.01|N|O|1997-09-07|1997-09-12|1997-10-01|COLLECT COD|REG AIR|sts dazzle +1252|1109|82|2|27|27272.70|0.00|0.08|N|O|1997-10-22|1997-10-10|1997-11-10|TAKE BACK RETURN|REG AIR|packages hag +1252|392|93|3|19|24555.41|0.07|0.02|N|O|1997-10-13|1997-10-23|1997-10-18|NONE|AIR|ts wake carefully-- packages sleep. quick +1252|912|47|4|11|19942.01|0.10|0.01|N|O|1997-10-16|1997-09-22|1997-10-28|COLLECT COD|AIR|s are. slyly final requests among the +1252|788|89|5|26|43908.28|0.05|0.05|N|O|1997-08-05|1997-10-24|1997-08-07|DELIVER IN PERSON|SHIP|onic pinto beans haggle furiously +1253|1800|27|1|14|23825.20|0.00|0.06|R|F|1993-04-03|1993-04-16|1993-04-27|TAKE BACK RETURN|MAIL|lar foxes sleep furiously final, final pack +1253|540|1|2|13|18727.02|0.01|0.06|A|F|1993-03-05|1993-04-26|1993-03-08|DELIVER IN PERSON|FOB|al packages +1253|694|95|3|22|35083.18|0.05|0.06|A|F|1993-02-23|1993-04-06|1993-03-07|TAKE BACK RETURN|SHIP|telets cajole alongside of the final reques +1253|1756|41|4|23|38128.25|0.09|0.02|R|F|1993-04-18|1993-04-18|1993-05-07|COLLECT COD|FOB| the slyly silent re +1253|1140|77|5|19|19781.66|0.05|0.05|A|F|1993-04-01|1993-04-22|1993-04-14|TAKE BACK RETURN|AIR|al pinto bea +1254|1924|69|1|6|10955.52|0.08|0.01|N|O|1996-02-02|1996-03-21|1996-02-29|NONE|REG AIR|lithely even deposits eat! +1254|1995|84|2|47|89158.53|0.05|0.06|N|O|1996-03-07|1996-02-20|1996-04-05|COLLECT COD|MAIL| platelets cajol +1254|1345|46|3|35|43621.90|0.05|0.06|N|O|1996-04-08|1996-02-29|1996-04-18|DELIVER IN PERSON|FOB|ckages boost. furious warhorses cajole +1255|1919|64|1|12|21850.92|0.00|0.02|A|F|1994-08-17|1994-06-29|1994-09-04|TAKE BACK RETURN|REG AIR| regular, express accounts are +1255|1938|71|2|46|84636.78|0.07|0.05|R|F|1994-07-06|1994-07-14|1994-08-05|NONE|MAIL|ons nag qui +1280|1287|62|1|17|20200.76|0.01|0.01|A|F|1993-02-04|1993-04-10|1993-02-07|NONE|FOB|ructions integrate across the th +1280|1884|14|2|6|10715.28|0.05|0.06|R|F|1993-03-30|1993-02-16|1993-04-18|DELIVER IN PERSON|AIR|gular deposits +1280|322|79|3|13|15890.16|0.03|0.02|R|F|1993-03-06|1993-03-11|1993-03-18|DELIVER IN PERSON|TRUCK|blithely final accounts use evenly +1280|1748|75|4|5|8248.70|0.06|0.03|R|F|1993-02-03|1993-02-11|1993-02-23|DELIVER IN PERSON|AIR|beans haggle. quickly bold instructions h +1280|520|51|5|24|34092.48|0.07|0.02|R|F|1993-03-20|1993-03-01|1993-04-09|COLLECT COD|RAIL|y pending orbits boost after the slyly +1280|653|16|6|9|13982.85|0.00|0.05|R|F|1993-04-18|1993-03-28|1993-05-04|DELIVER IN PERSON|FOB|usual accou +1280|916|19|7|19|34521.29|0.02|0.06|A|F|1993-02-07|1993-02-28|1993-02-12|NONE|TRUCK|lyly along the furiously regular +1281|1379|18|1|33|42252.21|0.07|0.08|R|F|1995-02-01|1995-01-18|1995-03-03|NONE|REG AIR|dencies. thinly final pinto beans wake +1281|64|15|2|37|35670.22|0.08|0.03|A|F|1995-03-19|1995-02-02|1995-03-27|NONE|AIR|ounts detect +1281|937|6|3|2|3675.86|0.05|0.06|A|F|1994-12-27|1995-01-26|1995-01-21|TAKE BACK RETURN|FOB|ly unusual requests. final reques +1281|1531|72|4|38|54436.14|0.04|0.06|R|F|1995-03-28|1995-01-11|1995-04-14|TAKE BACK RETURN|MAIL| ideas-- blithely regular +1281|1514|55|5|13|18401.63|0.03|0.07|A|F|1995-02-06|1995-02-13|1995-02-18|DELIVER IN PERSON|TRUCK|fully final platelets wa +1281|493|81|6|4|5573.96|0.07|0.04|R|F|1995-03-15|1995-02-21|1995-03-20|NONE|SHIP|ggle against the even requests. requests +1281|779|76|7|43|72230.11|0.10|0.02|R|F|1995-01-28|1995-02-08|1995-02-10|DELIVER IN PERSON|AIR|final accounts. final packages slee +1282|225|26|1|14|15753.08|0.04|0.02|R|F|1992-06-29|1992-04-05|1992-07-21|TAKE BACK RETURN|REG AIR|ecial deposit +1282|292|47|2|10|11922.90|0.09|0.06|R|F|1992-04-10|1992-04-16|1992-05-01|DELIVER IN PERSON|SHIP|r theodolite +1282|1596|97|3|19|28454.21|0.01|0.03|R|F|1992-05-07|1992-04-07|1992-05-13|NONE|RAIL|ts x-ray across the furi +1282|584|85|4|19|28207.02|0.00|0.05|A|F|1992-06-20|1992-04-17|1992-07-05|DELIVER IN PERSON|REG AIR|nto beans. carefully close theodo +1283|927|30|1|47|85912.24|0.05|0.03|N|O|1996-10-21|1996-10-29|1996-11-12|DELIVER IN PERSON|TRUCK|even instructions boost slyly blithely +1283|1054|25|2|1|955.05|0.00|0.08|N|O|1996-10-07|1996-10-12|1996-10-08|NONE|RAIL|d the sauternes. slyly ev +1283|1371|86|3|18|22902.66|0.02|0.01|N|O|1996-10-14|1996-11-07|1996-10-22|DELIVER IN PERSON|AIR|equests use along the fluff +1283|1920|65|4|40|72876.80|0.07|0.03|N|O|1996-11-09|1996-11-23|1996-11-28|NONE|MAIL|riously. even, ironic instructions after +1283|1235|73|5|43|48857.89|0.01|0.04|N|O|1996-09-29|1996-11-19|1996-10-26|TAKE BACK RETURN|RAIL|requests sleep slyly about the +1283|76|52|6|30|29282.10|0.06|0.07|N|O|1996-11-22|1996-11-22|1996-12-15|COLLECT COD|TRUCK|t the fluffily +1283|1963|64|7|21|39164.16|0.04|0.03|N|O|1996-09-12|1996-10-02|1996-10-12|NONE|REG AIR|fully regular +1284|1775|60|1|49|82161.73|0.00|0.06|N|O|1996-04-11|1996-03-04|1996-04-16|NONE|MAIL|lar packages. special packages ac +1284|54|55|2|4|3816.20|0.07|0.06|N|O|1996-02-29|1996-02-11|1996-03-01|TAKE BACK RETURN|TRUCK| regular asymptotes. +1284|1326|27|3|39|47865.48|0.08|0.00|N|O|1996-01-11|1996-02-07|1996-02-05|COLLECT COD|MAIL|even accoun +1284|583|84|4|1|1483.58|0.01|0.07|N|O|1996-04-28|1996-04-02|1996-05-08|DELIVER IN PERSON|SHIP|al packages use carefully express de +1284|334|35|5|9|11108.97|0.05|0.06|N|O|1996-03-03|1996-03-19|1996-04-01|DELIVER IN PERSON|REG AIR|after the pending +1285|216|17|1|12|13394.52|0.00|0.06|A|F|1992-06-21|1992-08-16|1992-07-12|COLLECT COD|MAIL|ss foxes. blithe theodolites cajole slyly +1285|1423|63|2|45|59598.90|0.01|0.02|R|F|1992-09-05|1992-08-08|1992-10-02|COLLECT COD|REG AIR| special requests haggle blithely. +1285|1882|12|3|4|7135.52|0.09|0.06|A|F|1992-07-20|1992-08-17|1992-07-26|DELIVER IN PERSON|FOB|l packages sleep slyly quiet i +1285|1875|19|4|39|69297.93|0.05|0.01|A|F|1992-09-15|1992-08-05|1992-10-05|DELIVER IN PERSON|TRUCK|uctions. car +1285|836|3|5|33|57315.39|0.00|0.08|R|F|1992-09-08|1992-08-25|1992-09-16|NONE|SHIP|ites affix +1286|1771|72|1|49|81965.73|0.08|0.01|R|F|1993-06-24|1993-08-12|1993-06-26|DELIVER IN PERSON|SHIP|gged accoun +1286|483|13|2|48|66407.04|0.01|0.04|A|F|1993-07-11|1993-07-11|1993-08-01|COLLECT COD|TRUCK|unts alongs +1286|1886|73|3|11|19666.68|0.03|0.04|R|F|1993-08-08|1993-07-30|1993-09-05|DELIVER IN PERSON|FOB| slyly even packages. requ +1286|1838|39|4|37|64373.71|0.00|0.02|R|F|1993-05-27|1993-07-11|1993-06-01|COLLECT COD|SHIP|lyly ironic pinto beans cajole furiously s +1286|1641|65|5|14|21596.96|0.00|0.01|R|F|1993-05-23|1993-08-09|1993-06-01|NONE|REG AIR|blithely bo +1286|1460|78|6|41|55819.86|0.04|0.05|R|F|1993-08-02|1993-08-06|1993-08-07|TAKE BACK RETURN|FOB| the furiously expre +1287|1732|17|1|35|57180.55|0.09|0.06|A|F|1994-09-07|1994-09-12|1994-09-30|TAKE BACK RETURN|FOB|s wake unusual grou +1287|946|15|2|10|18469.40|0.08|0.03|R|F|1994-07-08|1994-08-28|1994-07-10|TAKE BACK RETURN|RAIL|thely alongside of the unusual, ironic pa +1287|3|4|3|30|27090.00|0.00|0.07|R|F|1994-07-12|1994-09-23|1994-08-07|NONE|RAIL|ar packages. even, even +1287|617|11|4|10|15176.10|0.01|0.05|A|F|1994-09-03|1994-08-12|1994-09-16|TAKE BACK RETURN|REG AIR|ding, regular accounts +1287|1790|75|5|21|35527.59|0.06|0.02|A|F|1994-10-06|1994-09-25|1994-10-16|TAKE BACK RETURN|TRUCK|y quickly bold theodoli +1287|205|60|6|26|28735.20|0.03|0.08|R|F|1994-10-03|1994-09-27|1994-10-30|DELIVER IN PERSON|RAIL|egular foxes. theodolites nag along t +1312|807|74|1|9|15370.20|0.04|0.08|R|F|1994-07-19|1994-06-29|1994-07-24|TAKE BACK RETURN|MAIL|. furiously +1312|1360|61|2|28|35318.08|0.06|0.06|A|F|1994-09-09|1994-08-01|1994-10-02|TAKE BACK RETURN|FOB|uriously final frays should use quick +1312|1730|57|3|18|29371.14|0.03|0.07|A|F|1994-09-13|1994-07-08|1994-09-22|TAKE BACK RETURN|MAIL|. slyly ironic +1313|514|5|1|48|67896.48|0.01|0.03|A|F|1994-12-20|1994-10-29|1995-01-07|COLLECT COD|MAIL|s are quick +1314|1978|23|1|5|9399.85|0.03|0.01|A|F|1994-05-26|1994-08-06|1994-05-31|TAKE BACK RETURN|AIR|equests nag across the furious +1314|1094|65|2|39|38808.51|0.01|0.03|R|F|1994-08-09|1994-06-14|1994-08-31|TAKE BACK RETURN|TRUCK| unusual accounts slee +1314|410|11|3|11|14414.51|0.01|0.04|A|F|1994-05-16|1994-07-30|1994-05-31|COLLECT COD|REG AIR|tegrate furious +1315|956|91|1|27|50137.65|0.01|0.03|N|O|1998-07-04|1998-06-13|1998-07-28|NONE|SHIP|latelets. fluffily ironic account +1315|158|37|2|15|15872.25|0.05|0.01|N|O|1998-07-12|1998-06-10|1998-08-07|COLLECT COD|AIR|. foxes integrate carefully special +1315|1672|96|3|25|39341.75|0.01|0.08|N|O|1998-06-26|1998-06-10|1998-07-06|TAKE BACK RETURN|FOB|lites. unusual foxes affi +1315|1610|34|4|19|28720.59|0.02|0.05|N|O|1998-07-05|1998-05-23|1998-08-04|TAKE BACK RETURN|SHIP|nal, regular warhorses about the fu +1315|1586|27|5|32|47602.56|0.10|0.05|N|O|1998-03-30|1998-06-12|1998-04-25|NONE|SHIP|neath the final p +1316|1265|40|1|46|53647.96|0.05|0.04|A|F|1994-01-13|1994-01-24|1994-02-03|COLLECT COD|TRUCK|ges haggle of the +1316|782|15|2|15|25241.70|0.02|0.01|R|F|1994-03-12|1994-03-02|1994-03-14|COLLECT COD|FOB|se. furiously final depo +1316|1973|74|3|33|61874.01|0.10|0.06|R|F|1994-03-31|1994-01-23|1994-04-20|TAKE BACK RETURN|AIR|manently; blithely special deposits +1316|651|14|4|15|23274.75|0.00|0.06|R|F|1993-12-17|1994-02-04|1993-12-20|NONE|RAIL|fully express dugouts. furiously silent ide +1316|408|9|5|40|52336.00|0.01|0.03|R|F|1994-02-04|1994-02-09|1994-02-27|NONE|REG AIR|l dugouts. co +1316|34|60|6|7|6538.21|0.05|0.04|A|F|1993-12-09|1994-01-12|1993-12-30|TAKE BACK RETURN|MAIL|. furiously even accounts a +1316|1621|45|7|8|12180.96|0.10|0.04|A|F|1994-03-26|1994-02-08|1994-04-19|NONE|SHIP|packages against the express requests wa +1317|1338|39|1|34|42137.22|0.08|0.04|N|O|1995-08-13|1995-08-08|1995-09-10|COLLECT COD|RAIL|deposits boost thinly blithely final id +1317|1596|17|2|7|10483.13|0.05|0.01|A|F|1995-06-08|1995-08-03|1995-06-16|TAKE BACK RETURN|SHIP| pinto beans according to the final, pend +1317|1572|73|3|26|38312.82|0.01|0.02|N|O|1995-07-13|1995-06-26|1995-08-06|COLLECT COD|RAIL|leep along th +1317|1052|58|4|35|33356.75|0.05|0.02|N|O|1995-07-16|1995-07-07|1995-07-22|TAKE BACK RETURN|FOB|r packages impress blithely car +1317|1495|13|5|36|50273.64|0.02|0.00|N|O|1995-09-03|1995-07-06|1995-09-04|DELIVER IN PERSON|AIR| deposits. quic +1318|1137|46|1|24|24915.12|0.08|0.06|N|O|1998-09-27|1998-09-15|1998-10-12|TAKE BACK RETURN|AIR|ual, unusual packages. fluffy, iro +1318|459|89|2|26|35345.70|0.01|0.03|N|O|1998-09-26|1998-08-09|1998-10-07|DELIVER IN PERSON|FOB|ly. regular, u +1318|1284|22|3|31|36743.68|0.01|0.04|N|O|1998-08-25|1998-07-31|1998-08-31|COLLECT COD|AIR|ve the carefully expr +1319|610|73|1|21|31722.81|0.03|0.04|N|O|1996-10-05|1996-12-02|1996-10-28|COLLECT COD|FOB|s: carefully express +1319|367|24|2|12|15208.32|0.09|0.05|N|O|1996-11-05|1996-12-12|1996-11-29|DELIVER IN PERSON|TRUCK|packages integrate furiously. expres +1344|1401|80|1|15|19536.00|0.10|0.07|A|F|1992-06-22|1992-06-24|1992-06-23|TAKE BACK RETURN|MAIL|rding to the blithely ironic theodolite +1344|1899|86|2|29|52225.81|0.09|0.00|A|F|1992-07-17|1992-06-07|1992-07-21|NONE|REG AIR|ffily quiet foxes wake blithely. slyly +1345|1972|73|1|49|91824.53|0.08|0.00|A|F|1992-12-27|1993-01-23|1993-01-06|NONE|FOB|sly. furiously final accounts are blithely +1345|113|66|2|37|37485.07|0.10|0.07|A|F|1992-11-27|1992-12-11|1992-12-07|COLLECT COD|FOB|e slyly express requests. ironic accounts c +1345|567|68|3|31|45494.36|0.08|0.07|R|F|1992-12-02|1992-12-29|1992-12-14|COLLECT COD|REG AIR|. slyly silent accounts sublat +1346|1591|32|1|29|43285.11|0.07|0.05|A|F|1992-08-18|1992-09-15|1992-09-17|TAKE BACK RETURN|REG AIR|the pinto +1346|1245|46|2|48|55019.52|0.06|0.03|A|F|1992-09-28|1992-07-22|1992-10-13|TAKE BACK RETURN|REG AIR| along the carefully spec +1346|539|40|3|13|18713.89|0.10|0.04|A|F|1992-07-22|1992-08-10|1992-08-06|NONE|SHIP|arefully brave deposits into the slyly iro +1346|1236|37|4|6|6823.38|0.02|0.02|R|F|1992-09-13|1992-07-21|1992-09-27|TAKE BACK RETURN|AIR|inst the furiously final theodolites. caref +1346|1861|62|5|30|52885.80|0.01|0.07|R|F|1992-10-01|1992-07-22|1992-10-24|NONE|SHIP| nag blithely. unusual, ru +1346|151|30|6|45|47301.75|0.02|0.04|A|F|1992-09-11|1992-08-06|1992-09-12|COLLECT COD|FOB|press deposits. +1347|802|2|1|45|76626.00|0.02|0.05|N|O|1997-08-24|1997-09-03|1997-09-08|COLLECT COD|AIR|ages wake around t +1347|1424|3|2|34|45064.28|0.07|0.04|N|O|1997-06-25|1997-09-08|1997-07-24|COLLECT COD|FOB|r packages. f +1347|1849|50|3|23|40269.32|0.03|0.04|N|O|1997-07-31|1997-08-25|1997-08-21|COLLECT COD|SHIP|ronic pinto beans. express reques +1347|1121|58|4|28|28619.36|0.01|0.00|N|O|1997-07-30|1997-07-22|1997-08-18|TAKE BACK RETURN|FOB|foxes after the blithely special i +1347|642|43|5|9|13883.76|0.01|0.03|N|O|1997-08-28|1997-09-16|1997-09-26|DELIVER IN PERSON|AIR| detect blithely above the fina +1347|1524|5|6|21|29935.92|0.06|0.04|N|O|1997-10-10|1997-08-16|1997-11-02|NONE|FOB|g pinto beans affix car +1347|503|94|7|10|14035.00|0.02|0.07|N|O|1997-07-04|1997-07-23|1997-07-05|DELIVER IN PERSON|SHIP|y ironic pin +1348|943|78|1|13|23971.22|0.01|0.01|N|O|1998-04-28|1998-06-05|1998-05-12|TAKE BACK RETURN|SHIP| blithely r +1348|220|2|2|41|45929.02|0.07|0.03|N|O|1998-05-02|1998-05-26|1998-05-09|COLLECT COD|RAIL|kages. platelets about the ca +1348|1983|84|3|40|75399.20|0.07|0.05|N|O|1998-08-14|1998-07-10|1998-08-27|COLLECT COD|AIR|fter the regu +1348|976|45|4|2|3753.94|0.01|0.04|N|O|1998-05-30|1998-06-20|1998-06-05|COLLECT COD|MAIL|lly final packages use fluffily express ac +1349|1806|50|1|1|1707.80|0.06|0.03|N|O|1998-01-07|1998-01-14|1998-02-03|COLLECT COD|REG AIR| express inst +1349|1177|14|2|45|48517.65|0.03|0.02|N|O|1997-12-24|1998-01-17|1997-12-28|NONE|AIR| ironic, unusual deposits wake carefu +1350|537|98|1|21|30188.13|0.04|0.04|A|F|1993-12-17|1993-10-17|1993-12-25|COLLECT COD|REG AIR|lyly above the evenly +1350|437|38|2|32|42797.76|0.03|0.00|R|F|1993-11-18|1993-09-30|1993-12-16|COLLECT COD|MAIL|ic, final +1351|1073|74|1|25|24351.75|0.06|0.04|N|O|1998-06-02|1998-05-25|1998-06-22|COLLECT COD|SHIP|iously regul +1376|1686|28|1|22|34928.96|0.01|0.03|N|O|1997-08-05|1997-07-08|1997-09-03|NONE|REG AIR|inst the final, pending +1377|1536|57|1|5|7187.65|0.06|0.05|N|O|1998-05-06|1998-07-08|1998-06-01|TAKE BACK RETURN|FOB| final, final grouches. accoun +1377|326|55|2|3|3678.96|0.10|0.04|N|O|1998-04-30|1998-07-02|1998-05-14|DELIVER IN PERSON|REG AIR|yly enticing requ +1377|834|1|3|26|45105.58|0.07|0.07|N|O|1998-05-28|1998-06-11|1998-06-25|COLLECT COD|SHIP|egular deposits. quickly regular acco +1377|1201|13|4|39|42985.80|0.00|0.03|N|O|1998-07-27|1998-07-18|1998-08-13|DELIVER IN PERSON|SHIP|e ironic, regular requests. carefully +1377|323|52|5|19|23243.08|0.10|0.00|N|O|1998-06-20|1998-06-27|1998-07-20|NONE|AIR|ught to are bold foxes +1377|1538|59|6|17|24472.01|0.03|0.04|N|O|1998-06-19|1998-07-20|1998-07-14|NONE|REG AIR|s must have to mold b +1378|1961|50|1|34|63340.64|0.09|0.07|N|O|1996-07-08|1996-04-23|1996-07-09|COLLECT COD|RAIL|le furiously slyly final accounts. careful +1378|1234|72|2|18|20434.14|0.05|0.02|N|O|1996-06-19|1996-05-16|1996-06-21|DELIVER IN PERSON|RAIL| theodolites. i +1378|729|30|3|11|17926.92|0.10|0.03|N|O|1996-06-07|1996-05-09|1996-07-05|COLLECT COD|TRUCK| blithely express hoc +1378|1707|8|4|12|19304.40|0.02|0.06|N|O|1996-06-16|1996-05-23|1996-07-09|COLLECT COD|SHIP|notornis. b +1378|1553|54|5|9|13090.95|0.06|0.05|N|O|1996-04-20|1996-04-13|1996-05-09|COLLECT COD|REG AIR|e carefully. carefully iron +1378|1935|80|6|29|53270.97|0.05|0.05|N|O|1996-04-15|1996-04-23|1996-05-14|NONE|REG AIR|ual packages are furiously blith +1379|729|62|1|13|21186.36|0.04|0.01|N|O|1998-06-08|1998-07-13|1998-06-16|NONE|AIR|ully across the furiously iron +1379|1172|9|2|50|53658.50|0.07|0.08|N|O|1998-08-31|1998-07-13|1998-09-02|TAKE BACK RETURN|FOB|olphins. ca +1379|124|51|3|24|24578.88|0.05|0.02|N|O|1998-07-06|1998-07-09|1998-07-29|DELIVER IN PERSON|MAIL|ages cajole carefully idly express re +1380|1482|61|1|6|8300.88|0.00|0.04|N|O|1996-08-06|1996-10-01|1996-08-14|NONE|RAIL|e foxes. slyly specia +1380|1408|87|2|40|52376.00|0.02|0.02|N|O|1996-10-01|1996-08-14|1996-10-20|COLLECT COD|RAIL|ly final frets. ironic, +1380|778|79|3|15|25181.55|0.05|0.02|N|O|1996-07-14|1996-08-12|1996-08-03|NONE|FOB|riously ironic foxes aff +1380|608|40|4|33|49783.80|0.04|0.07|N|O|1996-08-23|1996-10-01|1996-09-18|TAKE BACK RETURN|SHIP|e ironic, even excuses haggle +1381|1431|71|1|47|62624.21|0.08|0.04|N|O|1998-09-22|1998-08-12|1998-10-12|DELIVER IN PERSON|AIR|ly ironic deposits +1381|332|61|2|12|14787.96|0.07|0.08|N|O|1998-08-13|1998-08-12|1998-08-28|TAKE BACK RETURN|AIR| furiously regular package +1382|1614|15|1|18|27280.98|0.08|0.03|R|F|1993-08-30|1993-10-19|1993-09-03|DELIVER IN PERSON|AIR|hely regular deposits. fluffy s +1382|1809|10|2|29|49613.20|0.08|0.04|A|F|1993-10-08|1993-11-11|1993-10-10|COLLECT COD|FOB| haggle: closely even asymptot +1382|1779|64|3|43|72273.11|0.10|0.04|A|F|1993-09-02|1993-10-06|1993-09-15|DELIVER IN PERSON|AIR|ress deposits. slyly ironic foxes are blit +1382|1806|36|4|11|18785.80|0.04|0.04|R|F|1993-09-17|1993-09-29|1993-09-21|NONE|SHIP|furiously unusual packages play quickly +1382|1562|63|5|31|45370.36|0.07|0.03|R|F|1993-10-26|1993-10-15|1993-11-09|TAKE BACK RETURN|FOB|hely regular dependencies. f +1382|99|50|6|38|37965.42|0.07|0.07|R|F|1993-11-17|1993-09-28|1993-11-20|COLLECT COD|SHIP|ake pending pinto beans. s +1382|228|29|7|5|5641.10|0.07|0.01|R|F|1993-10-02|1993-09-29|1993-10-12|DELIVER IN PERSON|REG AIR|ter the carefully final excuses. blit +1383|1929|62|1|14|25632.88|0.07|0.06|A|F|1993-08-25|1993-07-09|1993-09-12|DELIVER IN PERSON|RAIL|ole carefully silent requests. car +1383|1602|44|2|19|28568.40|0.06|0.04|R|F|1993-05-24|1993-07-07|1993-06-14|NONE|AIR|lyly unusual accounts sle +1408|1480|98|1|29|40062.92|0.03|0.04|N|O|1998-03-12|1998-02-14|1998-03-17|COLLECT COD|MAIL|en accounts grow furiousl +1408|1724|9|2|7|11380.04|0.05|0.06|N|O|1998-01-14|1998-03-21|1998-01-29|COLLECT COD|AIR|fully final instructions. theodolites ca +1408|756|89|3|11|18224.25|0.00|0.03|N|O|1998-04-04|1998-01-29|1998-04-18|NONE|REG AIR|y even accounts thrash care +1408|1471|11|4|20|27449.40|0.06|0.00|N|O|1998-04-21|1998-01-25|1998-05-12|DELIVER IN PERSON|TRUCK| blithely fluffi +1408|1697|98|5|41|65546.29|0.02|0.06|N|O|1998-02-25|1998-02-03|1998-03-13|COLLECT COD|REG AIR|ep along the fina +1408|1335|50|6|42|51925.86|0.05|0.08|N|O|1998-01-30|1998-02-07|1998-02-18|TAKE BACK RETURN|REG AIR|even packages. even accounts cajole +1408|546|47|7|26|37610.04|0.00|0.00|N|O|1998-03-19|1998-03-14|1998-04-01|COLLECT COD|RAIL|ic foxes ca +1409|989|24|1|23|43469.54|0.01|0.03|A|F|1993-04-18|1993-02-25|1993-05-06|DELIVER IN PERSON|FOB|ions. slyly ironic packages wake quick +1409|645|8|2|36|55643.04|0.09|0.02|A|F|1993-01-27|1993-01-31|1993-02-07|COLLECT COD|FOB|ncies sleep carefully r +1409|1591|92|3|17|25374.03|0.07|0.00|R|F|1993-04-15|1993-03-01|1993-04-29|NONE|REG AIR|pending accounts poach. care +1410|1203|78|1|15|16563.00|0.06|0.05|N|O|1997-05-25|1997-07-08|1997-06-15|NONE|SHIP| bold packages are fluf +1410|1783|26|2|18|30326.04|0.03|0.00|N|O|1997-06-03|1997-05-17|1997-06-07|TAKE BACK RETURN|RAIL|gle furiously fluffily regular requests +1410|1082|53|3|37|36373.96|0.02|0.01|N|O|1997-04-17|1997-06-18|1997-04-19|COLLECT COD|TRUCK|to beans b +1410|1876|6|4|22|39113.14|0.10|0.00|N|O|1997-07-31|1997-05-17|1997-08-19|TAKE BACK RETURN|RAIL|gular account +1410|659|53|5|25|38991.25|0.09|0.02|N|O|1997-05-07|1997-07-10|1997-05-16|NONE|REG AIR|unts haggle against the furiously fina +1411|164|43|1|9|9577.44|0.06|0.04|A|F|1995-03-08|1995-03-04|1995-03-11|DELIVER IN PERSON|AIR|accounts. furiou +1411|1065|66|2|26|25117.56|0.02|0.02|A|F|1995-04-12|1995-01-24|1995-05-03|TAKE BACK RETURN|TRUCK|c packages. +1411|261|16|3|37|42966.62|0.00|0.06|A|F|1995-02-27|1995-03-02|1995-03-24|NONE|MAIL|d excuses. furiously final pear +1411|2000|89|4|20|18040.00|0.01|0.03|R|F|1995-04-06|1995-03-16|1995-04-17|COLLECT COD|FOB|s against the +1411|829|96|5|46|79571.72|0.08|0.05|A|F|1995-04-03|1995-01-20|1995-04-05|DELIVER IN PERSON|REG AIR|ly daring instructions +1411|762|27|6|30|49882.80|0.09|0.04|A|F|1995-01-12|1995-02-01|1995-01-23|DELIVER IN PERSON|MAIL|ious foxes wake courts. caref +1412|572|33|1|37|54485.09|0.06|0.01|A|F|1993-04-10|1993-04-19|1993-04-12|DELIVER IN PERSON|RAIL|hely express excuses are +1412|1551|32|2|20|29051.00|0.10|0.05|A|F|1993-07-04|1993-05-18|1993-07-22|DELIVER IN PERSON|REG AIR|odolites sleep ironically +1412|227|82|3|2|2254.44|0.10|0.07|R|F|1993-04-01|1993-05-03|1993-04-12|DELIVER IN PERSON|REG AIR|s among the requests are a +1412|1662|63|4|11|17200.26|0.05|0.07|R|F|1993-05-27|1993-05-30|1993-06-07|DELIVER IN PERSON|MAIL|en packages. regular packages dete +1412|1577|18|5|11|16264.27|0.08|0.06|A|F|1993-03-30|1993-05-25|1993-04-21|NONE|FOB|se slyly. special, unusual accounts nag bl +1413|1780|81|1|18|30272.04|0.08|0.05|N|O|1997-10-11|1997-08-17|1997-10-25|NONE|FOB|yly bold packages haggle quickly acr +1413|1643|67|2|49|75687.36|0.07|0.06|N|O|1997-08-28|1997-08-23|1997-09-12|DELIVER IN PERSON|MAIL|nstructions br +1413|416|46|3|6|7898.46|0.04|0.02|N|O|1997-09-07|1997-07-30|1997-09-21|TAKE BACK RETURN|MAIL|lithely excuses. f +1414|373|58|1|39|49661.43|0.10|0.03|N|O|1995-09-22|1995-09-30|1995-10-07|NONE|MAIL|quickly aro +1414|1065|66|2|4|3864.24|0.02|0.05|N|O|1995-09-16|1995-11-01|1995-10-02|COLLECT COD|AIR| haggle quickly +1415|1483|84|1|25|34612.00|0.06|0.00|A|F|1994-09-03|1994-07-12|1994-09-13|DELIVER IN PERSON|RAIL|ect never fluff +1440|1923|12|1|3|5474.76|0.06|0.01|N|O|1995-10-30|1995-10-17|1995-11-08|COLLECT COD|SHIP|instructions boost. fluffily regul +1440|1138|47|2|46|47799.98|0.02|0.03|N|O|1995-09-21|1995-10-19|1995-10-19|NONE|RAIL|blithely even instructions. +1441|1432|11|1|5|6667.15|0.04|0.01|N|O|1997-05-17|1997-05-11|1997-05-30|COLLECT COD|MAIL|egular courts. fluffily even grouches +1441|1767|10|2|5|8343.80|0.02|0.05|N|O|1997-04-25|1997-04-16|1997-05-23|COLLECT COD|FOB|he quickly enticing pac +1441|1178|51|3|14|15108.38|0.01|0.03|N|O|1997-06-30|1997-04-29|1997-07-24|DELIVER IN PERSON|REG AIR|special requests ha +1441|1599|40|4|37|55521.83|0.01|0.00|N|O|1997-04-26|1997-04-27|1997-04-29|NONE|REG AIR|accounts. slyly special dolphins b +1441|714|11|5|34|54900.14|0.09|0.00|N|O|1997-06-12|1997-05-11|1997-06-29|TAKE BACK RETURN|RAIL|e carefully. blithely ironic dep +1441|244|99|6|15|17163.60|0.09|0.08|N|O|1997-05-21|1997-05-06|1997-06-04|NONE|REG AIR| dependencies-- cour +1441|958|61|7|50|92947.50|0.03|0.01|N|O|1997-06-07|1997-05-12|1997-06-08|NONE|SHIP| requests. blithely e +1442|251|6|1|8|9210.00|0.05|0.01|A|F|1994-10-31|1994-09-04|1994-11-25|COLLECT COD|AIR|c deposits haggle after the even +1443|337|66|1|47|58154.51|0.04|0.06|N|O|1997-02-05|1997-02-02|1997-03-03|NONE|RAIL|carefully ironic requests sl +1444|1696|20|1|42|67102.98|0.01|0.02|R|F|1994-12-22|1995-03-03|1994-12-31|NONE|SHIP|ly bold packages boost regular ideas. spe +1444|567|28|2|34|49897.04|0.04|0.08|A|F|1995-02-22|1995-02-15|1995-03-19|TAKE BACK RETURN|AIR|y. doggedly pend +1444|1548|89|3|34|49284.36|0.02|0.07|R|F|1994-12-17|1995-01-12|1995-01-03|COLLECT COD|AIR|ular accounts +1444|1188|61|4|6|6535.08|0.06|0.03|A|F|1995-01-07|1995-03-05|1995-01-17|COLLECT COD|RAIL|al accounts. br +1444|192|93|5|35|38226.65|0.02|0.05|A|F|1995-02-25|1995-03-05|1995-03-24|DELIVER IN PERSON|SHIP|aggle furiou +1444|323|80|6|42|51379.44|0.00|0.02|A|F|1994-12-16|1995-02-18|1994-12-22|DELIVER IN PERSON|RAIL|ss requests. ironic ideas wake above +1444|820|21|7|12|20649.84|0.00|0.03|R|F|1994-12-23|1995-01-15|1995-01-13|COLLECT COD|TRUCK|ly among the bol +1445|994|95|1|24|45479.76|0.01|0.00|A|F|1995-02-21|1995-02-22|1995-03-18|DELIVER IN PERSON|SHIP|al accounts use furiously a +1445|669|70|2|48|75343.68|0.10|0.02|A|F|1995-02-28|1995-03-16|1995-03-12|COLLECT COD|MAIL|. final ideas are carefully dar +1445|1912|57|3|7|12697.37|0.10|0.04|A|F|1995-04-25|1995-02-25|1995-05-10|NONE|SHIP|structions: slyly regular re +1445|279|61|4|17|20047.59|0.04|0.07|A|F|1995-04-02|1995-04-04|1995-05-01|COLLECT COD|FOB|ges. furiously regular pint +1445|1345|84|5|24|29912.16|0.10|0.06|R|F|1995-04-23|1995-02-16|1995-05-18|NONE|REG AIR|rate after the carefully reg +1445|1671|72|6|39|61334.13|0.03|0.02|A|F|1995-02-05|1995-02-20|1995-02-06|NONE|MAIL|ully unusual reques +1446|719|20|1|31|50211.01|0.10|0.02|N|O|1998-05-01|1998-05-17|1998-05-30|NONE|REG AIR|. slyly reg +1447|1661|44|1|19|29690.54|0.06|0.04|A|F|1993-01-31|1992-12-07|1993-02-04|COLLECT COD|MAIL|. quickly ironic +1447|311|68|2|6|7267.86|0.01|0.05|A|F|1992-10-24|1992-12-10|1992-11-05|DELIVER IN PERSON|AIR|as! regular packages poach above the +1447|387|72|3|9|11586.42|0.04|0.00|R|F|1992-11-15|1993-01-07|1992-11-29|DELIVER IN PERSON|MAIL|counts wake s +1447|218|100|4|8|8945.68|0.09|0.08|R|F|1992-11-20|1993-01-12|1992-12-14|COLLECT COD|FOB|ost carefully +1447|1295|96|5|23|27514.67|0.02|0.07|A|F|1992-12-07|1992-12-25|1993-01-06|TAKE BACK RETURN|AIR| dazzle quickly deposits. f +1447|1996|85|6|41|77817.59|0.08|0.02|R|F|1993-01-06|1993-01-05|1993-01-13|TAKE BACK RETURN|MAIL|rts boost s +1472|73|49|1|36|35030.52|0.04|0.05|N|O|1996-11-06|1996-11-13|1996-11-12|COLLECT COD|SHIP|riously silent deposits to the pending d +1472|1321|98|2|26|31780.32|0.03|0.05|N|O|1996-11-08|1996-11-13|1996-12-02|DELIVER IN PERSON|FOB|ic packages w +1472|6|82|3|6|5436.00|0.08|0.01|N|O|1996-10-24|1996-11-19|1996-11-23|COLLECT COD|FOB|onic theodolites hinder slyly slyly r +1473|535|96|1|50|71776.50|0.04|0.03|N|O|1997-05-05|1997-05-20|1997-05-09|NONE|TRUCK|requests wake express deposits. special, ir +1473|675|69|2|32|50421.44|0.00|0.08|N|O|1997-04-18|1997-05-12|1997-05-10|DELIVER IN PERSON|REG AIR|out the packages lose furiously ab +1474|150|29|1|5|5250.75|0.05|0.04|A|F|1995-04-22|1995-02-20|1995-05-06|COLLECT COD|SHIP|ully final a +1474|1227|65|2|30|33846.60|0.04|0.02|A|F|1995-03-23|1995-02-11|1995-04-17|DELIVER IN PERSON|TRUCK|usly. evenly express +1474|911|80|3|18|32614.38|0.06|0.02|A|F|1995-01-23|1995-03-28|1995-02-03|NONE|RAIL|after the special +1475|1680|4|1|15|23725.20|0.08|0.06|N|O|1998-02-12|1997-12-17|1998-03-02|TAKE BACK RETURN|SHIP|xpress requests haggle after the final, fi +1475|1173|74|2|18|19335.06|0.07|0.00|N|O|1998-03-08|1998-01-18|1998-03-10|TAKE BACK RETURN|AIR|al deposits use. ironic packages along the +1475|1440|80|3|30|40243.20|0.03|0.02|N|O|1998-03-11|1997-12-30|1998-03-15|COLLECT COD|REG AIR| regular theodolites mold across th +1475|1870|71|4|50|88593.50|0.03|0.05|N|O|1997-12-14|1997-12-13|1997-12-21|COLLECT COD|AIR|. slyly bold re +1475|315|72|5|33|40105.23|0.01|0.06|N|O|1998-01-02|1998-01-27|1998-01-11|NONE|FOB|quickly fluffy +1475|494|24|6|12|16733.88|0.04|0.04|N|O|1998-01-09|1997-12-30|1998-01-23|NONE|TRUCK|arefully-- excuses sublate +1475|1118|19|7|23|23439.53|0.02|0.00|N|O|1998-02-13|1998-02-05|1998-03-08|NONE|TRUCK|hely regular hocke +1476|306|35|1|20|24126.00|0.02|0.03|N|O|1996-08-11|1996-09-18|1996-08-26|TAKE BACK RETURN|AIR|. bold deposits are carefully amo +1477|720|85|1|31|50242.32|0.00|0.06|N|O|1997-12-16|1997-09-30|1997-12-17|COLLECT COD|RAIL| requests. fluffily final +1477|1097|3|2|8|7984.72|0.09|0.05|N|O|1997-10-25|1997-10-18|1997-11-16|COLLECT COD|MAIL|ironic realms wake unusual, even ac +1477|1245|46|3|42|48142.08|0.06|0.00|N|O|1997-11-02|1997-11-02|1997-11-20|DELIVER IN PERSON|SHIP|lithely after the ir +1477|1063|64|4|32|30849.92|0.05|0.08|N|O|1997-09-12|1997-10-26|1997-10-12|TAKE BACK RETURN|AIR|; quickly regula +1477|1149|50|5|41|43055.74|0.04|0.06|N|O|1997-12-16|1997-10-31|1998-01-12|DELIVER IN PERSON|REG AIR|y. final pearls kindle. accounts +1477|690|53|6|49|77943.81|0.06|0.00|N|O|1997-11-18|1997-11-06|1997-11-27|COLLECT COD|FOB|ise according to the sly, bold p +1477|1191|28|7|33|36042.27|0.06|0.00|N|O|1997-11-12|1997-11-06|1997-11-24|DELIVER IN PERSON|TRUCK|yly regular p +1478|337|38|1|21|25983.93|0.00|0.06|N|O|1997-09-20|1997-10-25|1997-10-06|TAKE BACK RETURN|MAIL| fluffily pending acc +1479|1489|29|1|33|45885.84|0.10|0.01|N|O|1996-03-12|1996-02-28|1996-03-31|DELIVER IN PERSON|FOB| carefully special courts affix. fluff +1504|814|48|1|42|72022.02|0.02|0.03|R|F|1992-10-18|1992-10-14|1992-11-10|TAKE BACK RETURN|FOB|ep. carefully ironic excuses haggle quickl +1504|1024|30|2|22|20350.44|0.04|0.03|A|F|1992-09-09|1992-10-29|1992-09-10|NONE|REG AIR| accounts sleep. furiou +1504|1772|15|3|9|15063.93|0.07|0.02|R|F|1992-11-02|1992-10-12|1992-11-15|TAKE BACK RETURN|RAIL|y slyly regular courts. +1504|1141|14|4|10|10421.40|0.04|0.07|A|F|1992-09-22|1992-10-22|1992-10-13|TAKE BACK RETURN|TRUCK|final theodolites. furiously e +1504|198|77|5|7|7687.33|0.02|0.00|R|F|1992-11-20|1992-11-23|1992-12-13|COLLECT COD|MAIL|y final packa +1505|1199|72|1|4|4400.76|0.09|0.00|A|F|1992-12-14|1992-11-11|1993-01-02|COLLECT COD|SHIP|side of the s +1505|1228|66|2|50|56461.00|0.00|0.02|R|F|1992-11-22|1992-09-24|1992-11-26|TAKE BACK RETURN|FOB|lyly special platelets. requests ar +1506|1321|22|1|46|56226.72|0.04|0.05|R|F|1993-01-18|1992-11-11|1993-02-09|COLLECT COD|REG AIR|sits whithout the blithely ironic packages +1506|1139|48|2|30|31203.90|0.07|0.02|A|F|1992-11-22|1992-10-25|1992-12-04|DELIVER IN PERSON|FOB|deposits cajole +1506|1907|52|3|28|50649.20|0.10|0.06|A|F|1992-09-22|1992-11-19|1992-10-09|TAKE BACK RETURN|AIR| unwind carefully: theodolit +1506|278|33|4|37|43595.99|0.00|0.03|R|F|1992-11-04|1992-12-01|1992-11-23|TAKE BACK RETURN|TRUCK|carefully bold dolphins. accounts su +1506|1948|37|5|15|27749.10|0.05|0.00|R|F|1992-09-24|1992-11-11|1992-10-05|NONE|REG AIR| carefully fluffy packages-- caref +1506|496|55|6|38|53066.62|0.05|0.02|R|F|1992-12-02|1992-12-19|1992-12-29|NONE|REG AIR|xpress, regular excuse +1506|1681|64|7|4|6330.72|0.07|0.00|R|F|1993-01-03|1992-12-06|1993-01-05|COLLECT COD|REG AIR|posits. furiou +1507|671|34|1|25|39291.75|0.01|0.08|R|F|1994-01-07|1994-01-06|1994-01-11|NONE|RAIL|xes. slyly busy de +1507|400|29|2|33|42913.20|0.04|0.02|A|F|1993-10-29|1993-12-23|1993-11-14|DELIVER IN PERSON|REG AIR| asymptotes nag furiously above t +1507|858|92|3|39|68595.15|0.03|0.07|R|F|1993-11-04|1993-12-16|1993-12-03|TAKE BACK RETURN|REG AIR|ly even instructions. +1508|504|95|1|16|22472.00|0.02|0.06|N|O|1998-06-21|1998-05-30|1998-07-11|COLLECT COD|MAIL|riously across the ironic, unusua +1508|249|4|2|20|22984.80|0.06|0.01|N|O|1998-04-17|1998-06-11|1998-05-17|DELIVER IN PERSON|MAIL|nic platelets. carefully final fra +1508|922|25|3|43|78385.56|0.01|0.02|N|O|1998-06-01|1998-06-24|1998-06-03|TAKE BACK RETURN|TRUCK|ndencies h +1508|1472|90|4|1|1373.47|0.02|0.02|N|O|1998-07-13|1998-06-03|1998-07-17|TAKE BACK RETURN|AIR|s the blithely bold instruction +1508|1347|24|5|29|36201.86|0.02|0.00|N|O|1998-08-03|1998-07-08|1998-08-22|COLLECT COD|RAIL|r instructions. carefully +1508|27|3|6|5|4635.10|0.06|0.08|N|O|1998-05-22|1998-07-06|1998-06-04|COLLECT COD|REG AIR|cording to the furiously ironic depe +1508|1170|71|7|38|40704.46|0.03|0.06|N|O|1998-04-30|1998-06-23|1998-05-18|DELIVER IN PERSON|RAIL|tes wake furiously regular w +1509|272|27|1|14|16411.78|0.04|0.01|A|F|1993-10-04|1993-09-25|1993-10-21|NONE|TRUCK|nal realms +1509|109|10|2|46|46418.60|0.08|0.02|A|F|1993-10-15|1993-10-04|1993-11-01|TAKE BACK RETURN|FOB|uriously regula +1509|1063|64|3|17|16389.02|0.06|0.05|A|F|1993-07-25|1993-08-28|1993-08-19|DELIVER IN PERSON|AIR| furiously. blithely regular ideas haggle c +1509|195|22|4|11|12047.09|0.03|0.08|R|F|1993-11-04|1993-10-03|1993-11-14|TAKE BACK RETURN|FOB|ily ironic packages nod carefully. +1509|896|96|5|37|66484.93|0.01|0.08|A|F|1993-08-31|1993-09-10|1993-09-24|NONE|FOB|he slyly even deposits wake a +1509|1864|94|6|31|54741.66|0.04|0.03|A|F|1993-07-14|1993-08-21|1993-08-06|COLLECT COD|SHIP|ic deposits cajole carefully. quickly bold +1509|1562|43|7|27|39516.12|0.01|0.01|A|F|1993-09-29|1993-09-08|1993-10-04|TAKE BACK RETURN|FOB|lithely after the +1510|975|78|1|11|20635.67|0.09|0.04|N|O|1996-09-23|1996-12-03|1996-10-01|DELIVER IN PERSON|RAIL|e of the unusual accounts. stealthy deposit +1510|831|31|2|24|41563.92|0.05|0.04|N|O|1996-10-07|1996-10-22|1996-11-03|DELIVER IN PERSON|REG AIR|yly brave theod +1510|1900|44|3|36|64868.40|0.07|0.02|N|O|1996-10-02|1996-11-23|1996-10-05|NONE|SHIP|old deposits along the carefully +1510|1815|45|4|8|13734.48|0.01|0.08|N|O|1996-10-26|1996-11-07|1996-10-30|TAKE BACK RETURN|RAIL|blithely express +1510|585|86|5|27|40110.66|0.08|0.06|N|O|1996-10-20|1996-12-05|1996-11-02|NONE|MAIL|he blithely regular req +1510|137|38|6|3|3111.39|0.05|0.02|N|O|1996-10-31|1996-12-03|1996-11-13|COLLECT COD|RAIL|along the slyly regular pin +1510|215|70|7|50|55760.50|0.04|0.05|N|O|1996-11-01|1996-10-17|1996-11-28|NONE|MAIL|even packages. carefully regular fo +1511|972|75|1|29|54316.13|0.01|0.04|N|O|1997-03-17|1997-02-11|1997-03-27|DELIVER IN PERSON|AIR|s cajole furiously against +1511|618|81|2|32|48595.52|0.04|0.01|N|O|1997-01-06|1997-03-21|1997-01-26|TAKE BACK RETURN|REG AIR| deposits. carefully ironi +1536|1938|39|1|5|9199.65|0.08|0.03|N|O|1997-02-08|1997-03-11|1997-03-02|COLLECT COD|MAIL|requests sleep pe +1537|175|2|1|17|18277.89|0.01|0.03|A|F|1992-04-12|1992-04-19|1992-04-13|NONE|TRUCK|he regular pack +1537|1784|69|2|50|84289.00|0.08|0.00|R|F|1992-05-30|1992-05-14|1992-06-23|TAKE BACK RETURN|MAIL|special packages haggle slyly at the silent +1537|125|26|3|44|45105.28|0.05|0.04|R|F|1992-04-01|1992-03-31|1992-04-21|NONE|TRUCK|lar courts. +1537|1397|36|4|3|3895.17|0.08|0.07|R|F|1992-03-20|1992-04-14|1992-03-21|TAKE BACK RETURN|SHIP|s, final ideas detect sl +1538|1018|54|1|32|29408.32|0.05|0.05|N|O|1995-07-08|1995-07-29|1995-08-01|TAKE BACK RETURN|RAIL|uses maintain blithely. fluffily +1538|1918|19|2|27|49137.57|0.05|0.01|N|O|1995-09-19|1995-08-03|1995-09-24|DELIVER IN PERSON|TRUCK|ngly even packag +1538|1298|10|3|36|43174.44|0.08|0.04|N|O|1995-07-11|1995-09-10|1995-07-26|DELIVER IN PERSON|MAIL|al deposits mo +1538|1038|44|4|28|26292.84|0.10|0.04|N|O|1995-09-19|1995-08-27|1995-10-10|COLLECT COD|RAIL|bout the fluffily unusual +1538|1774|59|5|13|21785.01|0.01|0.05|N|O|1995-06-26|1995-07-30|1995-07-25|NONE|SHIP|ly. packages sleep f +1538|1273|11|6|42|49319.34|0.08|0.08|N|O|1995-10-10|1995-09-12|1995-11-08|DELIVER IN PERSON|TRUCK|equests cajole blithely +1539|1958|47|1|21|39058.95|0.08|0.02|R|F|1995-04-19|1995-05-10|1995-04-27|COLLECT COD|TRUCK|ounts haggle. busy +1539|860|27|2|11|19369.46|0.01|0.08|A|F|1995-05-27|1995-04-13|1995-06-10|TAKE BACK RETURN|TRUCK|ly express requests. furiously +1539|675|38|3|7|11029.69|0.09|0.04|R|F|1995-05-14|1995-04-16|1995-05-30|DELIVER IN PERSON|AIR|. fluffily reg +1540|1724|51|1|38|61777.36|0.03|0.01|R|F|1992-09-30|1992-10-27|1992-10-12|TAKE BACK RETURN|SHIP| final grouches bo +1540|600|91|2|35|52521.00|0.02|0.07|R|F|1992-10-31|1992-09-04|1992-11-05|TAKE BACK RETURN|SHIP|e blithely a +1540|72|23|3|25|24301.75|0.08|0.04|R|F|1992-11-15|1992-10-24|1992-12-14|DELIVER IN PERSON|SHIP|ironic deposits amo +1540|247|29|4|6|6883.44|0.09|0.03|R|F|1992-08-28|1992-09-17|1992-09-14|COLLECT COD|MAIL|ing to the slyly express asymptote +1540|870|4|5|27|47813.49|0.10|0.08|R|F|1992-12-02|1992-10-18|1992-12-31|NONE|SHIP|carefully final packages; b +1541|634|66|1|44|67523.72|0.10|0.05|N|O|1995-08-24|1995-07-13|1995-08-26|TAKE BACK RETURN|MAIL|o beans boost fluffily abou +1541|257|58|2|8|9258.00|0.10|0.08|N|F|1995-06-05|1995-08-07|1995-06-21|TAKE BACK RETURN|TRUCK|y pending packages. blithely fi +1542|578|79|1|37|54707.09|0.07|0.06|A|F|1993-12-15|1993-10-17|1994-01-07|TAKE BACK RETURN|REG AIR|e blithely unusual accounts. quic +1542|25|51|2|12|11100.24|0.09|0.06|R|F|1993-10-29|1993-11-02|1993-11-09|TAKE BACK RETURN|RAIL|carefully +1542|56|57|3|18|17208.90|0.05|0.05|R|F|1993-10-17|1993-11-15|1993-10-26|TAKE BACK RETURN|FOB|pending instr +1542|1427|67|4|21|27896.82|0.01|0.05|R|F|1993-10-13|1993-12-13|1993-11-12|NONE|RAIL|y pending foxes nag blithely +1542|1550|71|5|46|66771.30|0.00|0.00|R|F|1993-09-28|1993-11-03|1993-10-15|COLLECT COD|FOB|ial instructions. ironically +1543|709|74|1|34|54729.80|0.02|0.08|N|O|1997-05-25|1997-03-30|1997-06-04|NONE|AIR|ic requests are ac +1543|1145|82|2|6|6276.84|0.09|0.01|N|O|1997-04-16|1997-05-20|1997-05-16|DELIVER IN PERSON|MAIL| among the carefully bold or +1543|661|62|3|42|65589.72|0.06|0.01|N|O|1997-05-26|1997-03-30|1997-06-12|DELIVER IN PERSON|FOB|its sleep until the fur +1543|1886|73|4|42|75090.96|0.05|0.06|N|O|1997-04-11|1997-04-11|1997-04-23|TAKE BACK RETURN|MAIL|xpress instructions. regular acc +1543|399|100|5|9|11694.51|0.08|0.06|N|O|1997-03-14|1997-05-19|1997-03-26|DELIVER IN PERSON|FOB|ravely special requests +1543|488|76|6|3|4165.44|0.10|0.04|N|O|1997-03-29|1997-05-10|1997-04-22|COLLECT COD|MAIL|sleep along the furiou +1543|678|10|7|3|4736.01|0.00|0.02|N|O|1997-03-22|1997-04-06|1997-03-30|NONE|AIR|quickly. final accounts haggle slyl +1568|894|28|1|36|64616.04|0.02|0.03|N|O|1997-05-31|1997-04-22|1997-06-21|TAKE BACK RETURN|RAIL|platelets-- furiously sly excu +1568|90|16|2|46|45544.14|0.04|0.00|N|O|1997-04-06|1997-04-08|1997-04-23|TAKE BACK RETURN|MAIL|g the blithely even acco +1569|745|42|1|5|8228.70|0.07|0.00|N|O|1998-04-16|1998-06-21|1998-04-18|COLLECT COD|REG AIR| packages. ironic, even excuses a +1569|388|89|2|16|20614.08|0.01|0.08|N|O|1998-04-26|1998-06-16|1998-05-26|COLLECT COD|MAIL|deposits. blithely final asymptotes ac +1569|489|90|3|43|59747.64|0.10|0.03|N|O|1998-06-05|1998-05-31|1998-06-28|DELIVER IN PERSON|FOB| instructions. +1569|692|93|4|30|47780.70|0.02|0.03|N|O|1998-07-19|1998-06-04|1998-08-10|NONE|SHIP|packages. excuses lose evenly carefully reg +1570|1827|71|1|25|43220.50|0.00|0.06|N|O|1998-05-03|1998-06-02|1998-06-02|DELIVER IN PERSON|REG AIR|its. slyly regular sentiments +1570|851|18|2|7|12262.95|0.05|0.05|N|O|1998-07-10|1998-06-01|1998-07-23|TAKE BACK RETURN|MAIL|requests boost quickly re +1571|514|15|1|47|66481.97|0.00|0.05|R|F|1992-12-07|1993-02-24|1993-01-01|TAKE BACK RETURN|REG AIR|ng to the fluffily unusual +1571|1828|58|2|6|10378.92|0.03|0.00|A|F|1993-01-08|1993-02-13|1993-02-07|COLLECT COD|SHIP| special, ironic depo +1571|581|12|3|18|26668.44|0.05|0.08|A|F|1993-01-09|1993-01-12|1993-01-31|COLLECT COD|AIR| pending grouches +1571|1004|40|4|48|43440.00|0.05|0.05|A|F|1992-12-28|1993-01-04|1993-01-04|DELIVER IN PERSON|RAIL|slyly pending p +1571|416|75|5|10|13164.10|0.03|0.06|R|F|1992-12-12|1993-02-13|1992-12-29|DELIVER IN PERSON|AIR|lets. carefully regular ideas wake +1571|333|18|6|24|29599.92|0.05|0.07|A|F|1993-03-22|1993-01-31|1993-04-09|NONE|TRUCK|warthogs wake carefully acro +1572|237|38|1|41|46626.43|0.02|0.00|N|O|1996-05-16|1996-04-09|1996-05-28|TAKE BACK RETURN|REG AIR|. pinto beans alongside +1572|924|27|2|10|18249.20|0.04|0.06|N|O|1996-05-17|1996-03-26|1996-05-19|NONE|AIR| accounts affix slyly. +1573|1854|55|1|5|8779.25|0.05|0.01|A|F|1993-04-24|1993-03-13|1993-05-17|TAKE BACK RETURN|MAIL|ymptotes could u +1573|307|8|2|17|20524.10|0.00|0.06|R|F|1993-02-24|1993-02-16|1993-03-08|TAKE BACK RETURN|TRUCK|carefully regular deposits. +1573|823|24|3|16|27581.12|0.04|0.03|A|F|1993-03-15|1993-03-16|1993-03-31|COLLECT COD|AIR|ely. furiously final requests wake slyl +1573|1938|27|4|11|20239.23|0.09|0.01|R|F|1993-03-23|1993-03-24|1993-04-12|TAKE BACK RETURN|RAIL|nently pending +1573|1369|46|5|7|8892.52|0.00|0.01|R|F|1993-01-30|1993-03-14|1993-02-27|DELIVER IN PERSON|SHIP|eodolites sleep slyly. slyly f +1573|1531|52|6|30|42975.90|0.03|0.01|A|F|1992-12-29|1993-03-06|1993-01-02|DELIVER IN PERSON|TRUCK|. blithely even theodolites boos +1574|478|66|1|41|56517.27|0.06|0.02|N|O|1997-03-08|1997-02-09|1997-04-01|COLLECT COD|AIR|s. slyly regular depen +1574|1904|37|2|50|90295.00|0.00|0.05|N|O|1996-12-14|1997-02-14|1996-12-16|TAKE BACK RETURN|FOB|le regular, regular foxes. blithely e +1574|541|72|3|25|36038.50|0.06|0.02|N|O|1997-01-16|1997-02-14|1997-02-12|DELIVER IN PERSON|TRUCK|ly silent accounts. +1574|1909|98|4|6|10865.40|0.03|0.05|N|O|1997-02-24|1997-02-03|1997-03-01|NONE|AIR|e silent, final packages. speci +1574|1084|55|5|6|5910.48|0.05|0.05|N|O|1997-02-09|1997-03-02|1997-02-14|COLLECT COD|MAIL|nic, final ideas snooze. +1574|48|24|6|42|39817.68|0.07|0.01|N|O|1996-12-19|1997-01-13|1996-12-28|NONE|FOB|o beans according t +1574|1358|35|7|14|17630.90|0.04|0.01|N|O|1996-12-30|1997-01-19|1997-01-20|NONE|AIR|ily bold a +1575|285|86|1|42|49781.76|0.05|0.08|N|O|1995-10-21|1995-11-25|1995-10-24|DELIVER IN PERSON|RAIL|ly pending pinto beans. +1575|353|10|2|39|48880.65|0.00|0.06|N|O|1995-10-30|1995-10-15|1995-11-10|COLLECT COD|TRUCK| ironic requests snooze ironic, regular acc +1575|19|45|3|12|11028.12|0.01|0.05|N|O|1995-12-27|1995-11-11|1996-01-23|TAKE BACK RETURN|AIR| bold accounts. furi +1575|1102|11|4|39|39120.90|0.07|0.00|N|O|1995-09-23|1995-11-05|1995-09-25|TAKE BACK RETURN|TRUCK| after the unusual asym +1575|823|57|5|10|17238.20|0.09|0.00|N|O|1996-01-10|1995-11-20|1996-01-13|DELIVER IN PERSON|RAIL|k excuses. pinto beans wake a +1575|1777|4|6|14|23502.78|0.08|0.06|N|O|1995-10-31|1995-12-06|1995-11-30|NONE|AIR|beans breach among the furiously specia +1575|1170|7|7|48|51416.16|0.08|0.04|N|O|1995-11-19|1995-10-25|1995-12-07|DELIVER IN PERSON|TRUCK|cies. regu +1600|1715|42|1|20|32334.20|0.02|0.01|R|F|1993-06-16|1993-04-23|1993-07-02|COLLECT COD|FOB|pths sleep blithely about the +1600|432|20|2|48|63956.64|0.07|0.02|R|F|1993-04-17|1993-04-14|1993-05-03|DELIVER IN PERSON|FOB|furiously silent foxes could wake. car +1600|385|42|3|8|10283.04|0.04|0.07|R|F|1993-03-07|1993-04-22|1993-03-26|TAKE BACK RETURN|FOB|cajole furiously fluf +1600|685|17|4|25|39642.00|0.00|0.06|A|F|1993-05-25|1993-04-07|1993-06-05|TAKE BACK RETURN|REG AIR|press packages. ironic excuses bo +1600|1461|62|5|30|40873.80|0.03|0.08|R|F|1993-06-03|1993-05-03|1993-06-07|DELIVER IN PERSON|RAIL|al escapades alongside of the depo +1601|1662|63|1|6|9381.96|0.00|0.00|A|F|1994-10-19|1994-09-28|1994-10-23|COLLECT COD|SHIP| bold sheaves. furiously per +1601|1744|71|2|50|82287.00|0.03|0.02|R|F|1994-12-24|1994-10-23|1995-01-11|COLLECT COD|FOB|ideas doubt +1601|899|33|3|14|25198.46|0.04|0.08|R|F|1994-09-17|1994-11-22|1994-10-03|DELIVER IN PERSON|RAIL|he special, fin +1602|1829|30|1|4|6923.28|0.08|0.06|R|F|1993-10-31|1993-09-05|1993-11-21|NONE|RAIL|y. even excuses +1603|382|67|1|1|1282.38|0.08|0.00|R|F|1993-08-17|1993-09-04|1993-08-22|TAKE BACK RETURN|REG AIR|d accounts. special warthogs use fur +1603|653|85|2|29|45055.85|0.06|0.08|A|F|1993-09-28|1993-09-20|1993-10-28|NONE|SHIP|ses wake furiously. theodolite +1604|416|17|1|15|19746.15|0.09|0.08|R|F|1993-09-22|1993-09-03|1993-09-29|TAKE BACK RETURN|MAIL| instructions haggle +1604|1405|84|2|37|48336.80|0.06|0.06|A|F|1993-08-22|1993-09-21|1993-09-10|COLLECT COD|SHIP|requests. blithely ironic somas s +1604|1133|70|3|19|19648.47|0.09|0.07|A|F|1993-10-15|1993-10-04|1993-11-09|COLLECT COD|RAIL| ideas. bol +1604|1743|28|4|15|24671.10|0.03|0.00|R|F|1993-09-10|1993-08-31|1993-09-30|TAKE BACK RETURN|RAIL|ending realms along the special, p +1604|201|83|5|23|25327.60|0.08|0.05|A|F|1993-10-11|1993-08-30|1993-10-18|DELIVER IN PERSON|RAIL|en requests. blithely fin +1605|1419|37|1|47|62059.27|0.00|0.01|N|O|1998-04-29|1998-06-12|1998-05-20|DELIVER IN PERSON|AIR|. carefully r +1605|1797|24|2|18|30578.22|0.10|0.00|N|O|1998-05-13|1998-06-17|1998-06-03|COLLECT COD|REG AIR|ly regular foxes wake carefully. bol +1605|586|87|3|39|57976.62|0.02|0.03|N|O|1998-07-12|1998-06-05|1998-08-09|DELIVER IN PERSON|MAIL|nal dependencies-- quickly final frets acc +1605|1826|56|4|25|43195.50|0.06|0.02|N|O|1998-05-26|1998-06-14|1998-06-05|COLLECT COD|AIR|ole carefully car +1606|1141|42|1|21|21884.94|0.04|0.00|N|O|1997-06-02|1997-07-02|1997-06-27|DELIVER IN PERSON|RAIL| pending theodolites prom +1606|1736|21|2|35|57320.55|0.00|0.02|N|O|1997-06-20|1997-06-19|1997-06-22|COLLECT COD|TRUCK|carefully sil +1606|995|98|3|23|43607.77|0.00|0.06|N|O|1997-04-19|1997-06-26|1997-04-30|NONE|MAIL|ously final requests. slowly ironic ex +1606|963|98|4|20|37279.20|0.02|0.04|N|O|1997-05-01|1997-05-26|1997-05-28|TAKE BACK RETURN|TRUCK|fily carefu +1606|702|67|5|14|22437.80|0.10|0.01|N|O|1997-05-19|1997-07-05|1997-06-10|COLLECT COD|FOB|structions haggle f +1607|1892|22|1|2|3587.78|0.02|0.00|N|O|1996-01-11|1996-02-15|1996-01-19|DELIVER IN PERSON|MAIL|packages haggle. regular requests boost s +1607|1190|27|2|37|40374.03|0.05|0.02|N|O|1996-02-27|1996-02-18|1996-03-16|NONE|AIR|alongside +1607|1227|28|3|39|44000.58|0.00|0.00|N|O|1996-02-01|1996-02-12|1996-02-16|NONE|FOB|uches cajole. accounts ar +1607|756|89|4|34|56329.50|0.05|0.06|N|O|1996-01-06|1996-02-24|1996-01-10|DELIVER IN PERSON|SHIP| quickly above the +1607|1780|23|5|48|80725.44|0.00|0.05|N|O|1996-02-22|1996-02-13|1996-03-09|TAKE BACK RETURN|MAIL|ular forges. deposits a +1632|1906|39|1|47|84971.30|0.08|0.00|N|O|1997-01-25|1997-02-09|1997-02-19|TAKE BACK RETURN|RAIL|g to the closely special no +1632|1480|98|2|14|19340.72|0.08|0.05|N|O|1997-01-15|1997-02-25|1997-01-28|NONE|RAIL|oxes. deposits nag slyly along the slyly +1632|1762|47|3|47|78196.72|0.03|0.04|N|O|1997-01-29|1997-03-03|1997-02-21|NONE|MAIL|sts. blithely regular +1632|562|53|4|33|48264.48|0.09|0.02|N|O|1997-04-01|1997-02-24|1997-04-29|TAKE BACK RETURN|REG AIR|ructions! slyly +1632|1411|29|5|43|56433.63|0.10|0.03|N|O|1997-02-24|1997-02-19|1997-03-25|DELIVER IN PERSON|FOB|ts. blithe, bold ideas cajo +1633|1780|65|1|35|58862.30|0.01|0.02|N|O|1996-01-09|1995-12-02|1996-01-21|COLLECT COD|REG AIR|ly against the dolph +1633|42|43|2|15|14130.60|0.00|0.05|N|O|1995-12-13|1995-11-13|1996-01-04|TAKE BACK RETURN|FOB|ges wake fluffil +1634|471|72|1|21|28800.87|0.00|0.00|N|O|1996-10-04|1996-10-22|1996-11-01|NONE|MAIL|counts alo +1634|1717|18|2|44|71223.24|0.05|0.01|N|O|1996-09-17|1996-11-09|1996-10-03|COLLECT COD|SHIP|requests affix slyly. quickly even pack +1634|186|87|3|21|22809.78|0.06|0.07|N|O|1996-11-16|1996-10-21|1996-11-27|NONE|TRUCK|y along the excuses. +1634|675|69|4|17|26786.39|0.08|0.07|N|O|1996-10-29|1996-10-15|1996-11-02|TAKE BACK RETURN|SHIP|cial, bold platelets alongside of the f +1634|760|61|5|2|3321.52|0.07|0.04|N|O|1996-11-22|1996-10-28|1996-12-17|NONE|SHIP|ly. carefully regular asymptotes wake +1634|1697|39|6|11|17585.59|0.01|0.08|N|O|1996-10-04|1996-12-06|1996-10-14|DELIVER IN PERSON|SHIP|final requests +1634|125|52|7|35|35879.20|0.06|0.02|N|O|1996-11-25|1996-11-25|1996-12-12|TAKE BACK RETURN|RAIL|cies. regular, special de +1635|702|35|1|3|4808.10|0.06|0.08|N|O|1997-03-13|1997-03-25|1997-03-27|COLLECT COD|FOB| quickly ironic r +1635|891|92|2|8|14335.12|0.04|0.05|N|O|1997-04-30|1997-04-21|1997-05-09|DELIVER IN PERSON|AIR|ravely carefully express +1635|1138|39|3|20|20782.60|0.07|0.01|N|O|1997-05-19|1997-04-01|1997-06-17|TAKE BACK RETURN|FOB|oost according to the carefully even accou +1635|761|58|4|40|66470.40|0.01|0.04|N|O|1997-02-25|1997-03-20|1997-03-12|TAKE BACK RETURN|RAIL|uriously up the ironic deposits. slyly i +1636|841|41|1|2|3483.68|0.09|0.03|N|O|1997-09-26|1997-08-22|1997-10-05|NONE|TRUCK|nal foxes cajole above the blithely reg +1636|1690|91|2|45|71626.05|0.03|0.01|N|O|1997-07-14|1997-08-08|1997-07-27|COLLECT COD|RAIL|ely express reque +1636|1079|15|3|24|23521.68|0.07|0.08|N|O|1997-10-07|1997-08-12|1997-11-04|TAKE BACK RETURN|MAIL|e carefully unusual ideas are f +1636|1524|65|4|43|61297.36|0.06|0.00|N|O|1997-08-23|1997-08-10|1997-09-17|NONE|REG AIR|blithely special r +1636|184|37|5|22|23851.96|0.05|0.02|N|O|1997-07-22|1997-08-18|1997-08-03|COLLECT COD|AIR|ular, regu +1636|630|62|6|34|52041.42|0.10|0.01|N|O|1997-08-11|1997-09-09|1997-08-23|NONE|TRUCK|ular depos +1636|1131|4|7|7|7224.91|0.04|0.00|N|O|1997-07-28|1997-09-10|1997-07-31|NONE|MAIL|ronic instructions. final +1637|858|59|1|49|86183.65|0.02|0.03|N|F|1995-06-08|1995-04-19|1995-07-01|COLLECT COD|REG AIR|. blithely i +1637|723|88|2|1|1623.72|0.10|0.02|A|F|1995-02-14|1995-03-26|1995-03-09|TAKE BACK RETURN|AIR|ly final pinto beans. furiously +1637|217|72|3|10|11172.10|0.02|0.05|R|F|1995-02-21|1995-03-17|1995-03-11|NONE|AIR|uriously? blithely even sauternes wake. +1637|927|62|4|42|76772.64|0.06|0.01|A|F|1995-03-18|1995-04-24|1995-03-31|COLLECT COD|SHIP|blithely a +1637|41|67|5|25|23526.00|0.05|0.00|R|F|1995-06-07|1995-03-26|1995-06-08|COLLECT COD|RAIL| haggle carefully silent accou +1637|1088|59|6|38|37585.04|0.02|0.08|R|F|1995-03-20|1995-05-05|1995-04-14|DELIVER IN PERSON|SHIP|even, pending foxes nod regular +1637|518|49|7|21|29788.71|0.07|0.08|A|F|1995-04-30|1995-04-30|1995-05-05|COLLECT COD|SHIP|ly ironic theodolites use b +1638|59|60|1|46|44116.30|0.03|0.02|N|O|1997-10-16|1997-10-28|1997-11-09|COLLECT COD|MAIL|otes haggle before the slyly bold instructi +1638|1490|91|2|30|41744.70|0.00|0.04|N|O|1997-12-05|1997-09-17|1997-12-06|NONE|REG AIR|s cajole boldly bold requests. closely +1638|302|31|3|5|6011.50|0.08|0.07|N|O|1997-10-15|1997-11-01|1997-11-08|DELIVER IN PERSON|FOB|xcuses sleep furiou +1638|560|51|4|19|27750.64|0.00|0.08|N|O|1997-10-15|1997-10-27|1997-11-03|DELIVER IN PERSON|MAIL| quickly expres +1638|1429|8|5|25|33260.50|0.05|0.03|N|O|1997-10-06|1997-09-30|1997-11-02|DELIVER IN PERSON|REG AIR|gle final, ironic pinto beans. +1638|1545|26|6|46|66540.84|0.07|0.08|N|O|1997-08-20|1997-10-10|1997-09-09|COLLECT COD|AIR|ckages are carefully even instru +1639|1865|66|1|24|42404.64|0.07|0.00|N|O|1995-08-24|1995-10-06|1995-08-31|COLLECT COD|REG AIR| the regular packages. courts dou +1639|430|89|2|38|50556.34|0.01|0.04|N|O|1995-08-23|1995-11-09|1995-08-29|TAKE BACK RETURN|FOB|y regular packages. b +1639|1704|89|3|41|65833.70|0.04|0.02|N|O|1995-12-19|1995-11-11|1996-01-12|DELIVER IN PERSON|FOB|structions w +1664|1174|47|1|48|51608.16|0.04|0.02|N|O|1996-06-21|1996-05-01|1996-07-19|TAKE BACK RETURN|RAIL| use. ironic deposits integrate. slyly unu +1664|1722|7|2|30|48711.60|0.06|0.05|N|O|1996-04-04|1996-05-04|1996-05-03|COLLECT COD|FOB|ess multip +1664|1509|10|3|10|14105.00|0.00|0.06|N|O|1996-04-10|1996-05-13|1996-05-07|TAKE BACK RETURN|RAIL|instructions up the acc +1664|1543|84|4|35|50558.90|0.00|0.04|N|O|1996-03-06|1996-05-16|1996-03-09|DELIVER IN PERSON|REG AIR|y regular ide +1664|568|69|5|9|13217.04|0.07|0.04|N|O|1996-04-15|1996-05-14|1996-05-11|DELIVER IN PERSON|TRUCK|ges. fluffil +1664|1402|42|6|40|52136.00|0.09|0.07|N|O|1996-04-02|1996-04-22|1996-04-17|COLLECT COD|REG AIR|se blithely unusual pains. carefully +1665|465|53|1|4|5461.84|0.02|0.03|A|F|1994-09-01|1994-06-07|1994-09-12|DELIVER IN PERSON|TRUCK|ely final requests. requests +1665|771|68|2|1|1671.77|0.03|0.05|R|F|1994-05-22|1994-07-06|1994-05-24|TAKE BACK RETURN|TRUCK|sly final p +1666|1844|74|1|30|52375.20|0.04|0.03|N|O|1995-10-28|1995-11-30|1995-11-18|TAKE BACK RETURN|AIR| breach evenly final accounts. r +1666|640|3|2|20|30812.80|0.01|0.00|N|O|1996-01-27|1995-12-12|1996-01-31|NONE|REG AIR|uietly regular foxes wake quick +1666|1335|50|3|31|38326.23|0.05|0.07|N|O|1996-02-11|1996-01-11|1996-02-28|COLLECT COD|RAIL|ding to the express, bold accounts. fu +1666|1689|31|4|41|65217.88|0.06|0.08|N|O|1995-11-29|1996-01-04|1995-12-24|NONE|TRUCK|ly regular excuses; regular ac +1667|203|85|1|6|6619.20|0.04|0.02|N|O|1997-12-07|1997-11-16|1998-01-02|COLLECT COD|FOB|riously busy requests. blithely final a +1667|212|67|2|29|32254.09|0.06|0.07|N|O|1997-10-15|1997-11-09|1997-11-11|TAKE BACK RETURN|MAIL|l accounts. furiously final courts h +1667|950|19|3|48|88845.60|0.05|0.01|N|O|1998-01-27|1998-01-06|1998-02-09|TAKE BACK RETURN|SHIP|tes sleep furiously. carefully eve +1667|582|73|4|24|35581.92|0.04|0.01|N|O|1997-10-14|1997-12-01|1997-11-09|TAKE BACK RETURN|MAIL|hrash final requests. care +1667|1944|77|5|2|3691.88|0.07|0.00|N|O|1997-12-17|1997-11-22|1998-01-16|NONE|SHIP|pecial requests hag +1667|478|66|6|6|8270.82|0.01|0.03|N|O|1998-01-21|1997-12-19|1998-01-28|NONE|TRUCK| nag quickly above th +1667|400|29|7|19|24707.60|0.09|0.03|N|O|1998-01-23|1997-11-24|1998-01-26|DELIVER IN PERSON|SHIP|around the pinto beans. express, special +1668|1317|56|1|8|9746.48|0.06|0.01|N|O|1997-07-23|1997-10-09|1997-08-06|DELIVER IN PERSON|FOB|arefully regular tithes! slyl +1668|10|86|2|25|22750.25|0.01|0.06|N|O|1997-08-08|1997-09-28|1997-09-01|NONE|TRUCK|y ironic requests. bold, final ideas a +1668|742|75|3|42|68995.08|0.08|0.01|N|O|1997-08-09|1997-09-08|1997-08-31|NONE|FOB|ole carefully excuses. final +1668|1908|41|4|9|16289.10|0.05|0.03|N|O|1997-10-17|1997-09-05|1997-11-01|COLLECT COD|RAIL|wake furiously even instructions. sil +1668|1280|81|5|25|29532.00|0.01|0.02|N|O|1997-10-08|1997-09-20|1997-10-11|DELIVER IN PERSON|REG AIR|even platelets across the silent +1668|100|26|6|38|38003.80|0.07|0.01|N|O|1997-08-26|1997-09-17|1997-09-05|DELIVER IN PERSON|TRUCK|ep slyly across the furi +1669|784|85|1|24|40434.72|0.04|0.08|N|O|1997-09-04|1997-07-30|1997-09-20|DELIVER IN PERSON|RAIL| regular, final deposits use quick +1670|315|72|1|41|49827.71|0.07|0.01|N|O|1997-07-19|1997-08-20|1997-07-23|DELIVER IN PERSON|TRUCK|thely according to the sly +1670|1214|15|2|10|11152.10|0.07|0.03|N|O|1997-09-14|1997-08-16|1997-09-23|NONE|SHIP|fily special ideas +1670|1853|40|3|41|71948.85|0.07|0.07|N|O|1997-07-19|1997-08-05|1997-07-26|COLLECT COD|SHIP|al gifts. speci +1671|1489|68|1|21|29200.08|0.02|0.07|N|O|1996-07-28|1996-09-28|1996-08-08|TAKE BACK RETURN|AIR|s accounts slee +1671|952|55|2|4|7411.80|0.05|0.00|N|O|1996-08-30|1996-09-19|1996-09-23|DELIVER IN PERSON|TRUCK|lyly regular ac +1671|1236|11|3|11|12509.53|0.06|0.08|N|O|1996-09-16|1996-10-21|1996-09-18|NONE|SHIP|tes sleep blithely +1671|1774|59|4|5|8378.85|0.00|0.00|N|O|1996-11-14|1996-10-20|1996-11-25|TAKE BACK RETURN|FOB|luffily regular deposits +1671|1266|67|5|12|14007.12|0.07|0.04|N|O|1996-11-17|1996-09-02|1996-12-17|COLLECT COD|RAIL|special, ironic +1671|1963|8|6|46|85788.16|0.08|0.05|N|O|1996-09-13|1996-10-14|1996-09-28|TAKE BACK RETURN|REG AIR|. slyly bold instructions boost. furiousl +1696|155|8|1|8|8441.20|0.04|0.02|N|O|1998-04-28|1998-02-07|1998-05-10|NONE|TRUCK|the blithely +1696|1384|23|2|13|16709.94|0.08|0.06|N|O|1998-03-01|1998-03-25|1998-03-24|TAKE BACK RETURN|TRUCK|tructions play slyly q +1696|12|38|3|19|17328.19|0.08|0.05|N|O|1998-05-03|1998-03-13|1998-05-28|TAKE BACK RETURN|REG AIR|its maintain alongside of the f +1696|1928|29|4|21|38428.32|0.05|0.00|N|O|1998-05-04|1998-02-18|1998-05-07|NONE|MAIL|y players sleep along the final, pending +1696|938|7|5|43|79073.99|0.03|0.06|N|O|1998-02-14|1998-03-29|1998-02-20|COLLECT COD|FOB|arefully regular dep +1697|745|78|1|6|9874.44|0.05|0.00|N|O|1997-01-28|1996-11-27|1997-01-31|NONE|FOB|accounts breach slyly even de +1697|1035|71|2|24|22464.72|0.00|0.08|N|O|1996-12-29|1996-12-19|1997-01-10|NONE|SHIP|ts cajole carefully above the carefully +1697|1237|75|3|27|30732.21|0.06|0.00|N|O|1997-01-20|1996-12-02|1997-02-05|COLLECT COD|MAIL|ly regular packages across the silent, b +1697|931|32|4|49|89764.57|0.08|0.04|N|O|1996-12-07|1997-01-02|1996-12-31|COLLECT COD|TRUCK|lar foxes. fluffily furious ideas doubt qu +1697|349|78|5|19|23737.46|0.03|0.07|N|O|1997-01-08|1996-11-12|1997-01-11|DELIVER IN PERSON|FOB|ons? special, special accounts after +1698|966|67|1|44|82146.24|0.05|0.05|N|O|1997-05-16|1997-07-05|1997-05-27|NONE|RAIL|ts wake slyly after t +1698|922|57|2|6|10937.52|0.08|0.00|N|O|1997-08-21|1997-06-08|1997-09-03|DELIVER IN PERSON|RAIL| pending packages affix ne +1698|206|34|3|22|24336.40|0.03|0.04|N|O|1997-08-07|1997-05-28|1997-08-24|DELIVER IN PERSON|TRUCK|oward the furiously iro +1698|1120|57|4|19|19401.28|0.00|0.07|N|O|1997-07-04|1997-06-21|1997-08-01|NONE|RAIL| fluffily e +1698|525|26|5|37|52744.24|0.00|0.03|N|O|1997-05-16|1997-05-29|1997-05-27|NONE|AIR|ly regular ideas. deposit +1698|1659|60|6|15|23409.75|0.10|0.01|N|O|1997-07-20|1997-06-07|1997-07-21|TAKE BACK RETURN|RAIL|final ideas. even, ironic +1699|374|31|1|50|63718.50|0.00|0.06|A|F|1994-03-26|1994-03-23|1994-04-20|NONE|FOB|to the final requests are carefully silent +1699|1349|50|2|17|21255.78|0.07|0.02|R|F|1994-01-12|1994-03-12|1994-02-08|NONE|AIR|haggle blithely slyly +1700|1398|75|1|38|49376.82|0.04|0.04|N|O|1996-10-03|1996-07-27|1996-10-22|NONE|RAIL|ular dependencies engage slyly +1700|1560|61|2|49|71616.44|0.04|0.00|N|O|1996-09-26|1996-07-28|1996-10-16|NONE|TRUCK|kly even dependencies haggle fluffi +1701|1495|13|1|47|65635.03|0.08|0.05|R|F|1992-05-25|1992-06-29|1992-06-15|NONE|RAIL|slyly final requests cajole requests. f +1701|531|32|2|2|2863.06|0.01|0.04|R|F|1992-06-24|1992-07-12|1992-06-29|COLLECT COD|SHIP|ween the pending, final accounts. +1701|347|76|3|26|32430.84|0.10|0.06|R|F|1992-06-04|1992-07-11|1992-07-04|DELIVER IN PERSON|FOB| accounts. blithely pending pinto be +1702|670|64|1|19|29842.73|0.02|0.01|N|F|1995-06-02|1995-06-30|1995-06-29|NONE|REG AIR|ies haggle blith +1702|298|26|2|38|45535.02|0.00|0.00|N|O|1995-09-01|1995-06-10|1995-09-10|DELIVER IN PERSON|REG AIR|as believe blithely. bo +1702|1945|46|3|46|84959.24|0.00|0.08|N|O|1995-07-14|1995-06-30|1995-07-20|NONE|FOB|y even foxes. carefully final dependencies +1702|921|22|4|28|51013.76|0.07|0.05|R|F|1995-06-10|1995-07-26|1995-06-16|TAKE BACK RETURN|AIR|nts haggle along the packa +1702|881|82|5|34|60583.92|0.01|0.06|N|O|1995-07-04|1995-06-08|1995-07-28|DELIVER IN PERSON|AIR|y careful packages; dogged acco +1702|416|46|6|28|36859.48|0.10|0.00|N|O|1995-08-14|1995-07-31|1995-09-08|COLLECT COD|RAIL|ackages sleep. furiously even excuses snooz +1703|1655|97|1|36|56039.40|0.09|0.01|R|F|1993-04-22|1993-03-05|1993-04-24|DELIVER IN PERSON|SHIP|riously express +1703|1362|39|2|35|44217.60|0.01|0.08|R|F|1993-04-14|1993-03-31|1993-04-27|NONE|RAIL|he carefully +1703|1235|36|3|48|54539.04|0.06|0.02|R|F|1993-02-07|1993-04-20|1993-02-24|TAKE BACK RETURN|AIR|ggle slyly furiously regular theodol +1728|1253|28|1|1|1154.25|0.07|0.04|N|O|1996-09-16|1996-08-19|1996-09-18|COLLECT COD|FOB|lly. carefully ex +1728|1044|80|2|23|21735.92|0.05|0.02|N|O|1996-09-08|1996-07-24|1996-09-20|NONE|FOB|ns. pending, final ac +1728|1641|65|3|44|67876.16|0.08|0.07|N|O|1996-07-31|1996-06-22|1996-08-06|COLLECT COD|FOB|ide of the slyly blithe +1728|264|65|4|34|39584.84|0.08|0.05|N|O|1996-08-28|1996-07-20|1996-09-12|DELIVER IN PERSON|MAIL|special req +1728|1981|70|5|31|58372.38|0.09|0.02|N|O|1996-07-26|1996-06-28|1996-08-14|NONE|REG AIR|kly sly theodolites. +1729|1570|71|1|12|17658.84|0.08|0.04|A|F|1992-08-11|1992-07-24|1992-08-16|COLLECT COD|RAIL|y pending packages detect. carefully re +1730|1655|97|1|41|63822.65|0.01|0.03|N|O|1998-08-11|1998-08-29|1998-09-02|TAKE BACK RETURN|TRUCK| instructions. unusual, even Tiresi +1730|1614|15|2|15|22734.15|0.07|0.04|N|O|1998-09-07|1998-09-12|1998-09-30|TAKE BACK RETURN|AIR|pinto beans cajole. bravely bold +1730|1611|53|3|9|13613.49|0.10|0.00|N|O|1998-09-18|1998-09-15|1998-09-21|DELIVER IN PERSON|FOB|gular dependencies wake. blithely final e +1730|95|71|4|40|39803.60|0.02|0.03|N|O|1998-10-02|1998-10-06|1998-10-03|NONE|SHIP|ven dinos slee +1730|1403|82|5|43|56089.20|0.04|0.06|N|O|1998-10-26|1998-10-22|1998-11-02|DELIVER IN PERSON|TRUCK|ng deposits cajo +1731|1840|41|1|36|62706.24|0.10|0.00|N|O|1996-04-18|1996-04-03|1996-04-29|TAKE BACK RETURN|MAIL|ngside of the even instruct +1731|1383|60|2|7|8990.66|0.04|0.07|N|O|1996-04-11|1996-02-13|1996-04-30|DELIVER IN PERSON|REG AIR|fily quick asymptotes +1731|510|41|3|50|70525.50|0.05|0.04|N|O|1996-01-14|1996-03-13|1996-01-29|COLLECT COD|RAIL|ly slyly speci +1731|1959|92|4|23|42801.85|0.10|0.04|N|O|1996-04-22|1996-02-25|1996-05-16|TAKE BACK RETURN|RAIL|rays? bold, express pac +1731|524|25|5|37|52707.24|0.10|0.05|N|O|1996-04-30|1996-03-17|1996-05-27|TAKE BACK RETURN|RAIL| beans use furiously slyly b +1731|1235|47|6|41|46585.43|0.03|0.08|N|O|1996-04-05|1996-02-28|1996-05-01|TAKE BACK RETURN|RAIL|haggle across the blithely ironi +1732|44|45|1|50|47202.00|0.02|0.01|R|F|1993-12-05|1994-01-23|1993-12-20|TAKE BACK RETURN|FOB|fily final asymptotes according +1732|982|83|2|36|67787.28|0.01|0.03|A|F|1994-03-15|1994-02-09|1994-04-02|DELIVER IN PERSON|TRUCK|ve the accounts. slowly ironic multip +1732|1609|92|3|41|61934.60|0.00|0.04|R|F|1994-02-20|1994-01-07|1994-02-27|TAKE BACK RETURN|AIR|quests sublate against the silent +1732|1513|14|4|9|12730.59|0.04|0.04|A|F|1994-02-25|1994-01-29|1994-03-16|TAKE BACK RETURN|FOB|ular platelets. deposits wak +1732|1689|31|5|25|39767.00|0.02|0.05|A|F|1994-02-15|1994-01-07|1994-02-21|COLLECT COD|REG AIR|nag slyly. even, special de +1732|730|27|6|16|26091.68|0.01|0.05|R|F|1994-01-07|1994-01-02|1994-01-25|COLLECT COD|SHIP|ix carefully at the furiously regular pac +1733|1105|42|1|41|41250.10|0.08|0.01|N|O|1996-06-13|1996-07-08|1996-07-07|TAKE BACK RETURN|AIR|ess notornis. fur +1733|240|22|2|16|18243.84|0.00|0.04|N|O|1996-08-28|1996-07-25|1996-09-27|COLLECT COD|MAIL|slyly express deposits sleep abo +1733|1197|6|3|29|31847.51|0.10|0.06|N|O|1996-07-16|1996-08-08|1996-07-28|NONE|TRUCK|ns detect among the special accounts. qu +1733|1356|33|4|38|47779.30|0.01|0.03|N|O|1996-08-26|1996-07-23|1996-08-28|NONE|FOB| deposits +1733|336|93|5|22|27199.26|0.06|0.07|N|O|1996-07-16|1996-07-24|1996-07-30|COLLECT COD|AIR|gainst the final deposits. carefully final +1733|655|56|6|9|14000.85|0.06|0.08|N|O|1996-05-25|1996-07-23|1996-06-10|COLLECT COD|TRUCK|ven foxes was according to t +1733|1459|38|7|13|17685.85|0.02|0.03|N|O|1996-08-03|1996-08-02|1996-08-18|NONE|MAIL|olites sleep furious +1734|1549|90|1|38|55120.52|0.03|0.03|R|F|1994-08-09|1994-09-07|1994-08-12|COLLECT COD|FOB|ts doubt b +1734|1178|15|2|4|4316.68|0.06|0.03|A|F|1994-08-20|1994-07-17|1994-08-25|DELIVER IN PERSON|AIR|final warhorses. +1735|1555|56|1|43|62631.65|0.02|0.06|A|F|1993-01-14|1993-03-25|1993-02-02|DELIVER IN PERSON|FOB|iously after the +1735|1386|25|2|49|63081.62|0.03|0.04|A|F|1992-12-31|1993-02-03|1993-01-25|TAKE BACK RETURN|TRUCK|y express accounts above the exp +1760|955|24|1|38|70526.10|0.09|0.03|N|O|1996-06-15|1996-06-29|1996-07-11|NONE|MAIL|tions. blithely regular orbits against the +1760|73|74|2|3|2919.21|0.00|0.06|N|O|1996-07-18|1996-07-01|1996-08-01|NONE|RAIL|lyly bold dolphins haggle carefully. sl +1760|1369|46|3|44|55895.84|0.05|0.01|N|O|1996-06-11|1996-06-16|1996-07-02|COLLECT COD|REG AIR|instructions poach slyly ironic theodolites +1761|511|2|1|33|46579.83|0.09|0.03|R|F|1994-01-03|1994-01-23|1994-01-31|NONE|FOB|s. excuses a +1761|512|13|2|37|52262.87|0.02|0.07|R|F|1994-02-17|1994-03-08|1994-03-16|NONE|RAIL| integrate. quickly unusual +1761|490|20|3|37|51448.13|0.06|0.04|R|F|1994-01-02|1994-03-12|1994-01-25|DELIVER IN PERSON|TRUCK|regular packages wake after +1761|726|23|4|49|79709.28|0.06|0.07|R|F|1994-01-08|1994-03-03|1994-02-05|TAKE BACK RETURN|FOB|y even packages promise +1761|1569|10|5|37|54410.72|0.03|0.04|R|F|1994-04-24|1994-03-14|1994-04-29|TAKE BACK RETURN|MAIL|express requests print blithely around the +1761|235|17|6|12|13622.76|0.01|0.05|A|F|1994-04-16|1994-03-08|1994-04-21|DELIVER IN PERSON|AIR| sleep furiously. deposits are acco +1761|9|60|7|13|11817.00|0.03|0.08|R|F|1994-03-06|1994-03-18|1994-03-22|DELIVER IN PERSON|TRUCK|ons boost fu +1762|253|8|1|15|17298.75|0.04|0.08|A|F|1994-12-18|1994-10-29|1995-01-17|TAKE BACK RETURN|REG AIR|old packages thrash. care +1762|496|55|2|39|54463.11|0.10|0.02|A|F|1994-09-12|1994-11-09|1994-10-08|DELIVER IN PERSON|MAIL| ironic platelets sleep along t +1762|319|48|3|7|8535.17|0.05|0.01|R|F|1994-09-03|1994-10-02|1994-09-10|NONE|REG AIR|uickly express packages wake slyly-- regul +1762|1442|82|4|24|32242.56|0.03|0.03|A|F|1994-11-30|1994-11-02|1994-12-20|NONE|REG AIR|accounts solve alongside of the fluffily +1762|75|76|5|49|47778.43|0.08|0.05|A|F|1994-10-20|1994-11-02|1994-11-10|TAKE BACK RETURN|SHIP| packages sleep fluffily pen +1762|935|4|6|35|64257.55|0.05|0.05|A|F|1994-11-25|1994-10-21|1994-11-28|COLLECT COD|AIR|ind quickly. accounts ca +1762|730|63|7|47|76644.31|0.03|0.01|A|F|1994-11-02|1994-10-07|1994-11-08|NONE|SHIP| blithely brave +1763|118|71|1|22|22398.42|0.09|0.06|N|O|1997-01-17|1997-01-15|1997-02-03|TAKE BACK RETURN|SHIP|ld. fluffily final ideas boos +1763|1565|6|2|43|63062.08|0.04|0.04|N|O|1996-11-04|1996-12-09|1996-11-28|DELIVER IN PERSON|FOB|r deposits integrate blithely pending, quic +1763|242|70|3|16|18275.84|0.06|0.02|N|O|1996-12-12|1996-12-04|1996-12-25|DELIVER IN PERSON|RAIL|ously pending asymptotes a +1763|602|96|4|44|66114.40|0.04|0.05|N|O|1996-12-04|1997-01-06|1996-12-25|DELIVER IN PERSON|REG AIR| instructions need to integrate deposits. +1763|1466|6|5|13|17776.98|0.03|0.05|N|O|1996-11-23|1997-01-24|1996-12-05|TAKE BACK RETURN|SHIP|s sleep carefully. fluffily unusua +1763|1421|22|6|3|3967.26|0.05|0.03|N|O|1996-12-10|1996-12-06|1997-01-04|TAKE BACK RETURN|FOB|ut the slyly pending deposi +1763|1840|70|7|2|3483.68|0.05|0.07|N|O|1997-02-27|1996-12-04|1997-03-27|COLLECT COD|FOB|even pinto beans snooze fluffi +1764|1203|4|1|20|22084.00|0.09|0.02|A|F|1992-06-09|1992-05-22|1992-07-06|COLLECT COD|MAIL|y quickly regular packages. car +1764|665|28|2|3|4696.98|0.07|0.07|R|F|1992-05-13|1992-06-07|1992-05-26|COLLECT COD|RAIL|es wake slowly. +1764|772|69|3|27|45164.79|0.07|0.04|A|F|1992-05-06|1992-05-11|1992-05-23|COLLECT COD|TRUCK|ly final foxes wake blithely even requests +1765|1606|7|1|36|54273.60|0.08|0.04|N|O|1996-03-02|1996-02-17|1996-03-14|DELIVER IN PERSON|SHIP|he blithely pending accou +1766|868|69|1|32|56603.52|0.08|0.01|N|O|1997-01-08|1996-11-11|1997-01-31|TAKE BACK RETURN|AIR|ess accounts. stealthily ironic accou +1766|340|69|2|12|14884.08|0.05|0.01|N|O|1996-10-28|1996-12-18|1996-11-15|DELIVER IN PERSON|AIR|heodolites above the final, regular acc +1766|1108|17|3|1|1009.10|0.10|0.02|N|O|1997-01-21|1997-01-07|1997-02-19|NONE|TRUCK|ly blithely pending accounts. reg +1767|250|5|1|32|36808.00|0.08|0.04|A|F|1995-05-22|1995-05-14|1995-05-23|COLLECT COD|SHIP|to the bravely ironic requests i +1767|415|3|2|1|1315.41|0.09|0.05|N|O|1995-06-23|1995-05-25|1995-07-03|TAKE BACK RETURN|RAIL|ing to the slyly fin +1767|1740|41|3|24|39401.76|0.06|0.03|R|F|1995-03-16|1995-04-29|1995-04-11|DELIVER IN PERSON|RAIL|luffy theodolites need to detect furi +1767|224|52|4|50|56211.00|0.01|0.02|R|F|1995-05-29|1995-04-14|1995-06-15|NONE|REG AIR|y unusual foxe +1767|516|47|5|40|56660.40|0.06|0.00|R|F|1995-04-16|1995-05-06|1995-04-21|TAKE BACK RETURN|AIR|ep. accounts nag blithely fu +1792|872|39|1|9|15955.83|0.09|0.04|R|F|1994-02-28|1993-12-11|1994-03-12|TAKE BACK RETURN|AIR|final packages s +1792|87|63|2|5|4935.40|0.04|0.02|R|F|1994-02-13|1994-01-03|1994-02-28|DELIVER IN PERSON|TRUCK|ely regular accounts are slyly. pending, bo +1792|82|8|3|8|7856.64|0.01|0.04|A|F|1994-02-21|1994-01-26|1994-02-27|DELIVER IN PERSON|RAIL|nts. fluffily special instructions integr +1792|1902|47|4|45|81175.50|0.00|0.01|A|F|1994-02-27|1993-12-24|1994-03-07|DELIVER IN PERSON|MAIL|ests are. ironic, regular asy +1792|1988|77|5|35|66149.30|0.06|0.05|R|F|1994-01-31|1994-01-20|1994-02-17|NONE|FOB|e against the quic +1793|472|2|1|29|39801.63|0.01|0.06|R|F|1992-10-24|1992-09-20|1992-11-23|NONE|MAIL|ar excuses. +1793|1252|64|2|4|4613.00|0.07|0.05|A|F|1992-07-28|1992-08-26|1992-08-21|COLLECT COD|RAIL|nic foxes along the even +1793|1301|40|3|6|7213.80|0.01|0.05|R|F|1992-09-21|1992-09-05|1992-10-01|DELIVER IN PERSON|REG AIR|uctions; depo +1793|1177|86|4|4|4312.68|0.00|0.08|R|F|1992-09-27|1992-09-21|1992-10-07|DELIVER IN PERSON|AIR|equests nod ac +1793|246|47|5|42|48142.08|0.03|0.03|A|F|1992-10-13|1992-10-02|1992-11-06|NONE|RAIL|uctions sleep carefully special, fl +1794|1674|75|1|36|56724.12|0.09|0.08|N|O|1997-11-07|1997-11-01|1997-11-18|TAKE BACK RETURN|FOB|ely fluffily ironi +1794|946|15|2|3|5540.82|0.02|0.03|N|O|1997-11-15|1997-12-16|1997-11-20|DELIVER IN PERSON|FOB| sentiments according to the q +1794|1162|63|3|23|24452.68|0.08|0.04|N|O|1997-10-13|1997-11-30|1997-10-28|TAKE BACK RETURN|AIR|usly unusual theodolites doze about +1794|847|14|4|34|59426.56|0.06|0.08|N|O|1997-09-29|1997-11-13|1997-10-07|TAKE BACK RETURN|SHIP|rs above the accoun +1794|1165|38|5|47|50109.52|0.10|0.06|N|O|1998-01-15|1997-11-30|1998-02-14|DELIVER IN PERSON|TRUCK| haggle slyly. furiously express orbit +1794|902|37|6|37|66707.30|0.01|0.01|N|O|1998-01-12|1997-12-21|1998-01-17|DELIVER IN PERSON|MAIL|ackages. pinto +1795|1362|63|1|44|55587.84|0.08|0.08|A|F|1994-04-28|1994-05-24|1994-05-27|NONE|AIR|ites sleep carefully slyly p +1795|1132|33|2|34|35126.42|0.08|0.00|A|F|1994-04-24|1994-06-01|1994-05-08|DELIVER IN PERSON|SHIP|closely regular instructions wake. +1795|1676|100|3|25|39441.75|0.07|0.01|A|F|1994-05-18|1994-05-22|1994-05-20|TAKE BACK RETURN|RAIL|he always express accounts ca +1795|1249|61|4|32|36807.68|0.03|0.06|R|F|1994-05-10|1994-04-21|1994-05-17|DELIVER IN PERSON|SHIP| asymptotes across the bold, +1795|1624|48|5|11|16781.82|0.08|0.02|R|F|1994-06-19|1994-04-24|1994-07-02|TAKE BACK RETURN|TRUCK|slyly. special pa +1796|99|100|1|28|27974.52|0.08|0.04|A|F|1992-12-01|1993-01-01|1992-12-24|DELIVER IN PERSON|FOB|y quickly ironic accounts. +1796|1849|36|2|8|14006.72|0.00|0.08|R|F|1993-01-07|1993-01-04|1993-01-10|NONE|SHIP|slyly bold accounts are furiously agains +1797|307|36|1|17|20524.10|0.01|0.02|N|O|1996-08-06|1996-07-11|1996-08-29|NONE|TRUCK| cajole carefully. unusual Tiresias e +1797|1443|83|2|16|21511.04|0.01|0.00|N|O|1996-06-03|1996-07-21|1996-06-07|NONE|FOB|o beans wake regular accounts. blit +1797|118|71|3|21|21380.31|0.02|0.01|N|O|1996-08-05|1996-08-05|1996-08-06|DELIVER IN PERSON|AIR|ns. regular, regular deposit +1798|1089|90|1|43|42573.44|0.01|0.08|N|O|1997-08-27|1997-10-23|1997-09-09|DELIVER IN PERSON|MAIL|ld packages sleep furiously. depend +1799|512|43|1|8|11300.08|0.04|0.08|R|F|1994-06-14|1994-05-27|1994-06-27|TAKE BACK RETURN|MAIL|ealms upon the special, ironic waters +1799|264|46|2|42|48898.92|0.02|0.02|R|F|1994-04-05|1994-04-28|1994-04-09|DELIVER IN PERSON|FOB|es pending +1824|1197|6|1|45|49418.55|0.03|0.02|R|F|1994-08-21|1994-06-21|1994-09-19|NONE|RAIL|ent Tiresias. quickly express +1824|682|76|2|40|63307.20|0.10|0.03|A|F|1994-05-08|1994-07-24|1994-06-06|NONE|FOB|es mold furiously final instructions. s +1825|1551|32|1|43|62459.65|0.05|0.05|A|F|1994-02-18|1994-02-19|1994-03-02|TAKE BACK RETURN|RAIL| accounts breach fluffily spe +1825|1474|14|2|39|53643.33|0.00|0.00|R|F|1994-04-01|1994-01-12|1994-04-21|DELIVER IN PERSON|REG AIR|ual, bold ideas haggle above the quickly ir +1825|164|17|3|7|7449.12|0.04|0.03|A|F|1994-01-02|1994-01-30|1994-01-30|TAKE BACK RETURN|REG AIR|fully ironic requests. requests cajole ex +1825|1203|78|4|23|25396.60|0.05|0.01|R|F|1994-01-08|1994-02-08|1994-01-19|NONE|MAIL| wake express, even r +1825|1779|80|5|33|55465.41|0.04|0.04|A|F|1993-12-07|1994-03-01|1993-12-16|TAKE BACK RETURN|RAIL|about the ne +1826|267|49|1|4|4669.04|0.06|0.00|R|F|1992-07-05|1992-06-12|1992-08-04|DELIVER IN PERSON|MAIL|alongside of the quickly unusual re +1826|672|66|2|9|14154.03|0.07|0.07|R|F|1992-07-12|1992-07-11|1992-07-15|DELIVER IN PERSON|TRUCK| blithely special +1826|1753|80|3|14|23166.50|0.05|0.01|A|F|1992-04-28|1992-05-31|1992-05-25|COLLECT COD|TRUCK|uriously bold pinto beans are carefully ag +1826|1799|84|4|6|10204.74|0.05|0.04|R|F|1992-06-30|1992-05-17|1992-07-30|DELIVER IN PERSON|RAIL|kages. blithely silent +1826|1347|62|5|46|57423.64|0.05|0.06|R|F|1992-05-02|1992-06-25|1992-05-26|TAKE BACK RETURN|FOB|ously? quickly pe +1826|1074|45|6|43|41928.01|0.02|0.03|A|F|1992-07-28|1992-06-14|1992-08-03|NONE|MAIL|ss tithes use even ideas. fluffily final t +1827|895|95|1|47|84406.83|0.00|0.01|N|O|1996-08-01|1996-08-07|1996-08-23|TAKE BACK RETURN|RAIL|. pending courts about the even e +1827|1531|12|2|48|68761.44|0.03|0.05|N|O|1996-08-28|1996-09-15|1996-09-01|COLLECT COD|RAIL|oxes. special, final asymptote +1827|1999|100|3|37|70336.63|0.01|0.07|N|O|1996-07-20|1996-08-18|1996-08-08|DELIVER IN PERSON|REG AIR|ously ironic theodolites serve quickly af +1827|1265|77|4|4|4665.04|0.04|0.04|N|O|1996-07-22|1996-09-10|1996-08-11|DELIVER IN PERSON|RAIL|special requests. blithely +1827|796|29|5|24|40722.96|0.00|0.08|N|O|1996-08-07|1996-09-01|1996-09-04|DELIVER IN PERSON|SHIP|al gifts! re +1827|205|6|6|7|7736.40|0.10|0.02|N|O|1996-08-28|1996-08-07|1996-08-31|DELIVER IN PERSON|AIR|egular foxes +1827|60|61|7|38|36482.28|0.05|0.01|N|O|1996-10-17|1996-08-29|1996-11-07|TAKE BACK RETURN|SHIP| blithely. express, bo +1828|996|99|1|33|62600.67|0.05|0.04|R|F|1994-06-27|1994-06-10|1994-07-24|COLLECT COD|FOB|s boost carefully. pending d +1828|125|4|2|40|41004.80|0.08|0.07|R|F|1994-05-05|1994-07-02|1994-05-19|COLLECT COD|REG AIR|s use above the quietly fin +1828|1959|60|3|11|20470.45|0.07|0.08|R|F|1994-07-21|1994-05-28|1994-08-13|DELIVER IN PERSON|FOB| wake blithely +1828|78|29|4|45|44013.15|0.02|0.05|R|F|1994-05-15|1994-05-29|1994-05-28|COLLECT COD|RAIL| accounts run slyly +1828|782|79|5|14|23558.92|0.01|0.08|A|F|1994-05-20|1994-06-02|1994-05-25|TAKE BACK RETURN|SHIP|. final packages along the carefully bold +1829|1500|40|1|12|16818.00|0.05|0.06|A|F|1994-08-23|1994-07-13|1994-09-04|DELIVER IN PERSON|FOB|ges wake furiously express pinto +1829|47|48|2|11|10417.44|0.04|0.05|A|F|1994-05-18|1994-06-13|1994-06-07|COLLECT COD|MAIL|ding orbits +1829|1036|7|3|49|45914.47|0.09|0.08|A|F|1994-08-26|1994-08-01|1994-09-16|NONE|TRUCK|ound the quickly +1829|1530|31|4|14|20041.42|0.03|0.06|A|F|1994-08-15|1994-06-08|1994-08-30|TAKE BACK RETURN|AIR|regular deposits alongside of the flu +1829|1658|100|5|6|9357.90|0.02|0.07|A|F|1994-08-09|1994-08-05|1994-09-05|DELIVER IN PERSON|MAIL|s haggle! slyl +1829|1147|56|6|36|37733.04|0.09|0.04|R|F|1994-06-10|1994-06-23|1994-06-22|NONE|FOB|ackages-- express requests sleep; pen +1830|1196|33|1|38|41693.22|0.00|0.07|R|F|1995-04-20|1995-05-22|1995-04-24|TAKE BACK RETURN|TRUCK|ely even a +1830|245|73|2|9|10307.16|0.05|0.07|R|F|1995-03-09|1995-05-24|1995-03-14|NONE|SHIP|st furiously among +1830|811|45|3|36|61625.16|0.07|0.07|R|F|1995-04-21|1995-04-14|1995-05-10|DELIVER IN PERSON|SHIP| slowly unusual orbits. carefull +1831|1352|91|1|9|11280.15|0.02|0.03|A|F|1993-12-17|1994-01-27|1993-12-26|NONE|TRUCK|mptotes. furiously regular dolphins al +1831|471|72|2|9|12343.23|0.07|0.06|R|F|1994-03-22|1994-01-07|1994-04-06|COLLECT COD|MAIL|ent deposits. regular saute +1831|1150|59|3|17|17869.55|0.02|0.08|R|F|1994-01-18|1994-02-12|1994-01-30|TAKE BACK RETURN|MAIL|s boost ironic foxe +1831|942|11|4|23|42387.62|0.06|0.02|R|F|1993-12-21|1994-02-08|1994-01-04|NONE|SHIP|ests. express pinto beans abou +1856|550|11|1|10|14505.50|0.05|0.07|R|F|1992-05-11|1992-05-20|1992-06-02|TAKE BACK RETURN|FOB|he furiously even theodolites. account +1856|970|39|2|47|87935.59|0.07|0.07|R|F|1992-03-22|1992-06-09|1992-04-17|DELIVER IN PERSON|FOB|ingly blithe theodolites. slyly pending +1856|1166|75|3|20|21343.20|0.04|0.06|R|F|1992-05-04|1992-05-06|1992-05-11|DELIVER IN PERSON|MAIL|ost carefully. slyly bold accounts +1856|1493|94|4|22|30678.78|0.08|0.02|A|F|1992-05-02|1992-05-26|1992-05-20|TAKE BACK RETURN|REG AIR|platelets detect slyly regular packages. ca +1856|1897|98|5|14|25184.46|0.01|0.01|A|F|1992-04-14|1992-05-02|1992-05-11|COLLECT COD|SHIP|ans are even requests. deposits caj +1856|227|9|6|36|40579.92|0.03|0.05|A|F|1992-06-19|1992-05-12|1992-06-28|TAKE BACK RETURN|TRUCK|ly even foxes kindle blithely even realm +1856|1299|11|7|42|50412.18|0.04|0.00|R|F|1992-05-23|1992-06-06|1992-06-19|COLLECT COD|RAIL|usly final deposits +1857|1739|40|1|15|24610.95|0.10|0.03|R|F|1993-04-05|1993-02-28|1993-04-13|COLLECT COD|RAIL|egular, regular inst +1857|1664|6|2|40|62626.40|0.10|0.00|R|F|1993-02-15|1993-03-08|1993-02-21|NONE|AIR|slyly close d +1857|1190|27|3|8|8729.52|0.01|0.07|R|F|1993-01-27|1993-04-04|1993-02-20|TAKE BACK RETURN|AIR|slyly about the fluffily silent req +1857|997|66|4|41|77817.59|0.07|0.07|A|F|1993-04-16|1993-02-16|1993-04-18|NONE|REG AIR| the slyly +1858|140|67|1|33|34324.62|0.01|0.02|N|O|1997-12-28|1998-02-03|1998-01-13|NONE|RAIL|tect along the slyly final +1859|750|51|1|18|29713.50|0.10|0.00|N|O|1997-08-08|1997-06-30|1997-08-26|TAKE BACK RETURN|SHIP|e carefully a +1859|1878|8|2|36|64075.32|0.02|0.01|N|O|1997-05-05|1997-07-08|1997-05-25|TAKE BACK RETURN|REG AIR|regular requests. carefully unusual theo +1859|1578|99|3|5|7397.85|0.06|0.03|N|O|1997-06-20|1997-05-20|1997-07-19|TAKE BACK RETURN|AIR|across the p +1859|1909|10|4|21|38028.90|0.00|0.03|N|O|1997-08-06|1997-05-29|1997-08-26|TAKE BACK RETURN|REG AIR|lar packages wake quickly exp +1859|454|84|5|11|14898.95|0.06|0.06|N|O|1997-07-15|1997-06-05|1997-07-29|TAKE BACK RETURN|SHIP|ffily ironic pac +1859|1044|80|6|12|11340.48|0.08|0.03|N|O|1997-05-22|1997-06-08|1997-06-07|COLLECT COD|TRUCK|es. unusual, silent request +1860|1130|31|1|9|9280.17|0.04|0.04|N|O|1996-08-03|1996-05-31|1996-08-04|DELIVER IN PERSON|TRUCK|c realms print carefully car +1861|671|34|1|7|11001.69|0.08|0.05|A|F|1994-01-14|1994-04-03|1994-01-16|COLLECT COD|RAIL|s foxes. slyly +1861|268|69|2|31|36216.06|0.10|0.05|R|F|1994-01-29|1994-03-07|1994-02-15|TAKE BACK RETURN|RAIL|arefully unusual +1861|237|65|3|23|26156.29|0.00|0.08|A|F|1994-04-09|1994-03-04|1994-04-11|DELIVER IN PERSON|MAIL|in packages sleep silent dolphins; sly +1861|1152|61|4|38|40019.70|0.10|0.05|R|F|1994-02-26|1994-02-05|1994-03-01|NONE|RAIL|pending deposits cajole quic +1861|152|5|5|2|2104.30|0.03|0.08|R|F|1994-04-26|1994-03-15|1994-05-15|TAKE BACK RETURN|MAIL|e final, regular requests. carefully +1862|297|25|1|41|49088.89|0.10|0.00|N|O|1998-06-05|1998-05-17|1998-07-04|COLLECT COD|FOB| carefully along +1862|1655|56|2|37|57596.05|0.06|0.02|N|O|1998-04-15|1998-05-15|1998-05-14|TAKE BACK RETURN|MAIL|l deposits. carefully even dep +1862|1040|46|3|26|24467.04|0.02|0.01|N|O|1998-03-25|1998-05-17|1998-04-17|TAKE BACK RETURN|TRUCK|g carefully: thinly ironic deposits af +1863|625|57|1|48|73229.76|0.09|0.04|A|F|1993-10-10|1993-12-09|1993-10-19|NONE|FOB|ans hinder furiou +1863|1570|51|2|48|70635.36|0.04|0.08|A|F|1993-11-08|1993-11-05|1993-12-08|COLLECT COD|AIR|onic theodolites alongside of the pending a +1888|977|12|1|27|50705.19|0.03|0.06|R|F|1994-02-13|1994-01-16|1994-02-25|NONE|REG AIR|. carefully special dolphins sle +1888|735|36|2|38|62157.74|0.03|0.03|R|F|1993-11-29|1994-01-16|1993-12-08|TAKE BACK RETURN|TRUCK|dazzle carefull +1888|797|98|3|49|83191.71|0.07|0.05|A|F|1994-02-27|1994-01-14|1994-03-28|DELIVER IN PERSON|FOB|lar accounts haggle carefu +1888|186|87|4|9|9775.62|0.01|0.04|A|F|1994-02-09|1994-01-22|1994-02-19|NONE|AIR| packages are blithely. carefu +1888|1596|97|5|4|5990.36|0.03|0.06|R|F|1993-12-28|1993-12-19|1994-01-11|COLLECT COD|FOB|lphins. ironically special theodolit +1888|526|87|6|48|68472.96|0.08|0.08|R|F|1994-02-28|1993-12-16|1994-03-15|COLLECT COD|TRUCK|ar ideas cajole. regular p +1888|1664|6|7|50|78283.00|0.04|0.07|R|F|1993-12-22|1994-01-10|1994-01-06|DELIVER IN PERSON|FOB|ependencies affix blithely regular warhors +1889|1512|33|1|41|57953.91|0.10|0.02|N|O|1997-06-15|1997-05-10|1997-07-08|NONE|AIR|s! furiously pending r +1889|1717|18|2|13|21043.23|0.05|0.00|N|O|1997-06-12|1997-04-28|1997-06-23|NONE|REG AIR|to the regular accounts. carefully express +1889|1372|49|3|36|45841.32|0.05|0.07|N|O|1997-05-19|1997-06-14|1997-05-23|NONE|SHIP|l pinto beans kindle +1889|1677|60|4|5|7893.35|0.02|0.07|N|O|1997-06-26|1997-06-09|1997-07-21|COLLECT COD|AIR|ording to the blithely silent r +1890|1403|43|1|26|33914.40|0.03|0.07|N|O|1997-04-02|1997-03-13|1997-04-22|DELIVER IN PERSON|FOB|ngage. slyly ironic +1890|995|96|2|43|81527.57|0.07|0.03|N|O|1996-12-30|1997-01-31|1997-01-19|DELIVER IN PERSON|FOB|p ironic, express accounts. fu +1890|589|80|3|24|35749.92|0.06|0.04|N|O|1997-02-09|1997-02-10|1997-02-12|COLLECT COD|MAIL|is wake carefully above the even id +1890|673|74|4|43|67667.81|0.09|0.04|N|O|1997-04-08|1997-02-19|1997-04-30|TAKE BACK RETURN|FOB|lyly. instructions across the furiously +1890|1212|13|5|45|50094.45|0.08|0.05|N|O|1997-04-15|1997-03-16|1997-04-19|COLLECT COD|FOB|he carefully regular sauternes. ironic fret +1890|1808|52|6|16|27356.80|0.08|0.02|N|O|1997-02-13|1997-02-18|1997-03-12|TAKE BACK RETURN|TRUCK|ged pinto beans. regular, regular id +1890|1203|15|7|10|11042.00|0.01|0.04|N|O|1996-12-24|1997-02-19|1997-01-01|DELIVER IN PERSON|AIR|. even, unusual inst +1891|761|62|1|45|74779.20|0.07|0.04|A|F|1994-12-20|1995-01-16|1995-01-05|NONE|RAIL|ests along +1891|1831|75|2|18|31190.94|0.06|0.00|A|F|1995-01-24|1995-01-29|1995-02-14|NONE|RAIL| foxes above the carefu +1891|1972|73|3|15|28109.55|0.03|0.00|R|F|1995-03-11|1995-03-05|1995-03-18|TAKE BACK RETURN|MAIL| accounts are furiou +1892|1128|65|1|48|49397.76|0.02|0.01|A|F|1994-06-16|1994-06-16|1994-06-28|NONE|RAIL|tornis detect regul +1892|421|9|2|35|46249.70|0.04|0.08|R|F|1994-04-05|1994-05-09|1994-05-03|NONE|MAIL|hes nod furiously around the instruc +1892|1333|10|3|37|45670.21|0.10|0.03|R|F|1994-04-11|1994-06-04|1994-04-24|TAKE BACK RETURN|SHIP|nts. slyly regular asymptot +1892|1970|15|4|14|26207.58|0.06|0.07|R|F|1994-04-08|1994-06-12|1994-04-27|DELIVER IN PERSON|FOB|furiously about the furiously +1893|983|18|1|43|81011.14|0.10|0.00|N|O|1998-01-25|1998-01-06|1998-02-14|COLLECT COD|SHIP|he carefully regular +1893|1474|75|2|49|67398.03|0.03|0.05|N|O|1998-01-19|1998-01-28|1998-02-02|TAKE BACK RETURN|FOB|y final foxes bo +1893|442|43|3|3|4027.32|0.03|0.02|N|O|1998-02-10|1998-01-18|1998-02-25|DELIVER IN PERSON|MAIL|gular, even ideas. fluffily bol +1893|1007|78|4|18|16344.00|0.07|0.06|N|O|1998-01-24|1998-01-12|1998-02-13|TAKE BACK RETURN|RAIL|g packages. fluffily final reques +1893|521|22|5|6|8529.12|0.10|0.02|N|O|1998-01-23|1997-12-22|1998-02-09|DELIVER IN PERSON|TRUCK|ar accounts use. daringly ironic packag +1894|1683|84|1|40|63387.20|0.03|0.07|R|F|1992-06-07|1992-05-11|1992-07-01|DELIVER IN PERSON|FOB|ily furiously bold packages. flu +1895|1602|26|1|43|64654.80|0.09|0.07|R|F|1994-07-26|1994-07-19|1994-08-11|NONE|AIR| carefully eve +1920|954|55|1|24|44518.80|0.04|0.05|N|O|1998-09-27|1998-08-23|1998-10-15|DELIVER IN PERSON|AIR|thely. bold, pend +1920|508|69|2|31|43663.50|0.05|0.06|N|O|1998-08-01|1998-08-30|1998-08-17|COLLECT COD|SHIP|lly. ideas wa +1920|172|99|3|6|6433.02|0.01|0.05|N|O|1998-10-01|1998-08-20|1998-10-24|COLLECT COD|SHIP|l ideas boost slyly pl +1920|834|35|4|50|86741.50|0.09|0.06|N|O|1998-10-03|1998-08-04|1998-10-29|DELIVER IN PERSON|MAIL|e blithely unusual foxes. brave packages +1920|338|23|5|14|17336.62|0.08|0.05|N|O|1998-10-22|1998-08-10|1998-10-27|DELIVER IN PERSON|AIR|ickly ironic d +1921|207|62|1|9|9964.80|0.08|0.00|R|F|1994-02-01|1994-03-20|1994-03-01|DELIVER IN PERSON|FOB|to beans. even excuses integrate specia +1921|1397|36|2|21|27266.19|0.02|0.06|R|F|1994-02-08|1994-03-28|1994-02-15|COLLECT COD|FOB|ckly regula +1921|709|10|3|27|43461.90|0.00|0.04|A|F|1994-04-26|1994-04-07|1994-04-30|TAKE BACK RETURN|FOB|ing pinto beans above the pend +1922|98|49|1|13|12975.17|0.05|0.03|N|O|1996-10-24|1996-09-21|1996-11-15|NONE|SHIP|quests. furiously +1923|362|63|1|9|11361.24|0.01|0.08|N|O|1997-08-29|1997-09-13|1997-09-07|NONE|FOB|lites. ironic instructions integrate bravel +1923|1774|17|2|23|38542.71|0.07|0.05|N|O|1997-09-08|1997-08-11|1997-09-14|TAKE BACK RETURN|MAIL|aggle carefully. furiously permanent +1923|1797|98|3|11|18686.69|0.03|0.03|N|O|1997-07-12|1997-09-04|1997-08-01|TAKE BACK RETURN|REG AIR|ages wake slyly about the furiously regular +1923|1927|72|4|49|89617.08|0.06|0.05|N|O|1997-07-21|1997-08-08|1997-07-26|NONE|AIR|de of the carefully expre +1923|1831|18|5|25|43320.75|0.10|0.08|N|O|1997-08-18|1997-08-20|1997-09-12|DELIVER IN PERSON|TRUCK|the ideas: slyly pendin +1923|370|99|6|50|63518.50|0.03|0.03|N|O|1997-11-04|1997-08-08|1997-11-25|NONE|TRUCK|uickly along the bold courts. bold the +1924|726|23|1|7|11387.04|0.06|0.07|N|O|1997-01-01|1996-12-02|1997-01-08|COLLECT COD|SHIP|osits. even accounts nag furious +1924|174|53|2|47|50485.99|0.02|0.06|N|O|1996-11-24|1996-10-18|1996-12-13|COLLECT COD|REG AIR|silent requests cajole blithely final pack +1924|568|69|3|40|58742.40|0.04|0.08|N|O|1996-10-31|1996-11-30|1996-11-21|NONE|REG AIR|ains sleep carefully +1924|332|89|4|31|38202.23|0.03|0.03|N|O|1996-09-20|1996-10-19|1996-10-19|DELIVER IN PERSON|SHIP| the slyly regular foxes. ruthle +1924|355|12|5|17|21340.95|0.04|0.05|N|O|1996-12-31|1996-11-12|1997-01-25|COLLECT COD|TRUCK|e carefully theodolites. ironically ironic +1924|758|55|6|15|24881.25|0.02|0.04|N|O|1997-01-04|1996-11-13|1997-01-27|NONE|SHIP|he package +1924|396|97|7|21|27224.19|0.09|0.03|N|O|1996-09-21|1996-11-12|1996-10-02|TAKE BACK RETURN|AIR| blithely reg +1925|1838|25|1|50|86991.50|0.01|0.02|R|F|1992-04-12|1992-04-23|1992-05-08|TAKE BACK RETURN|TRUCK|usual pinto +1925|1343|58|2|35|43551.90|0.06|0.06|R|F|1992-05-11|1992-04-10|1992-05-14|TAKE BACK RETURN|AIR|counts. carefully ironic packages boost ab +1925|1151|88|3|40|42086.00|0.08|0.08|A|F|1992-05-17|1992-05-20|1992-06-08|TAKE BACK RETURN|AIR|e carefully regul +1925|298|26|4|17|20370.93|0.06|0.02|R|F|1992-05-18|1992-04-06|1992-06-16|TAKE BACK RETURN|MAIL|instructions sleep. pinto bea +1926|504|35|1|24|33708.00|0.06|0.05|N|O|1996-05-04|1996-03-14|1996-06-01|DELIVER IN PERSON|RAIL|e theodolites. +1926|1051|87|2|29|27609.45|0.09|0.08|N|O|1996-02-26|1996-03-14|1996-03-14|TAKE BACK RETURN|TRUCK|es. dependencies according to the fl +1926|1777|4|3|10|16787.70|0.02|0.03|N|O|1996-05-23|1996-03-02|1996-06-04|NONE|AIR|usly bold accounts. express accounts +1926|678|79|4|13|20522.71|0.04|0.02|N|O|1996-04-26|1996-04-13|1996-05-08|DELIVER IN PERSON|MAIL|eans wake bli +1926|400|57|5|29|37711.60|0.06|0.00|N|O|1996-02-29|1996-03-13|1996-03-24|DELIVER IN PERSON|MAIL|hily unusual packages are fluffily am +1927|679|42|1|3|4739.01|0.00|0.05|N|O|1995-10-06|1995-12-08|1995-11-05|COLLECT COD|FOB|ccounts affi +1927|725|90|2|15|24385.80|0.08|0.08|N|O|1995-12-25|1995-12-26|1995-12-31|COLLECT COD|RAIL| carefully regular requests sleep car +1927|648|42|3|6|9291.84|0.05|0.05|N|O|1995-11-29|1995-11-20|1995-12-08|TAKE BACK RETURN|TRUCK|furiously even wat +1952|521|82|1|7|9950.64|0.04|0.05|A|F|1994-05-06|1994-06-11|1994-05-12|NONE|RAIL|about the express, even requ +1952|1417|96|2|6|7910.46|0.06|0.05|A|F|1994-05-09|1994-05-21|1994-05-26|DELIVER IN PERSON|AIR|packages haggle. +1953|1277|89|1|25|29456.75|0.07|0.06|A|F|1994-01-07|1994-01-28|1994-01-29|TAKE BACK RETURN|RAIL|ular, regular i +1953|139|40|2|35|36369.55|0.06|0.06|R|F|1994-02-03|1994-02-25|1994-02-14|DELIVER IN PERSON|FOB|among the fur +1954|1513|94|1|31|43849.81|0.06|0.06|N|O|1997-08-18|1997-07-07|1997-09-03|DELIVER IN PERSON|RAIL|against the packages. bold, ironic e +1954|1812|99|2|1|1713.81|0.03|0.01|N|O|1997-09-16|1997-07-08|1997-10-07|COLLECT COD|MAIL|te. furiously final deposits hag +1954|1987|76|3|11|20778.78|0.07|0.07|N|O|1997-08-07|1997-07-23|1997-08-25|DELIVER IN PERSON|TRUCK|y carefully ironi +1954|1583|64|4|12|17814.96|0.02|0.08|N|O|1997-07-19|1997-07-04|1997-08-06|COLLECT COD|AIR|ongside of the slyly unusual requests. reg +1954|1698|81|5|29|46391.01|0.08|0.08|N|O|1997-08-25|1997-07-15|1997-09-02|DELIVER IN PERSON|RAIL|use thinly furiously regular asy +1954|1763|64|6|13|21641.88|0.00|0.07|N|O|1997-06-15|1997-08-22|1997-06-20|TAKE BACK RETURN|MAIL|y ironic instructions cajole +1954|1935|36|7|49|90009.57|0.05|0.06|N|O|1997-06-04|1997-08-29|1997-06-14|COLLECT COD|TRUCK|eans. final pinto beans sleep furiousl +1955|1361|100|1|32|40395.52|0.02|0.02|A|F|1992-07-05|1992-06-29|1992-08-03|TAKE BACK RETURN|TRUCK|g to the carefully sile +1955|171|50|2|2|2142.34|0.03|0.01|R|F|1992-07-06|1992-07-06|1992-08-01|COLLECT COD|TRUCK|ickly aroun +1955|1577|18|3|41|60621.37|0.08|0.06|A|F|1992-08-01|1992-06-04|1992-08-07|COLLECT COD|AIR| carefully against the furiously reg +1955|83|34|4|16|15729.28|0.03|0.07|A|F|1992-04-30|1992-06-23|1992-05-23|TAKE BACK RETURN|FOB|odolites eat s +1955|1585|86|5|11|16352.38|0.09|0.01|A|F|1992-06-03|1992-07-04|1992-06-07|NONE|REG AIR|ously quickly pendi +1956|1764|65|1|8|13326.08|0.02|0.04|A|F|1992-12-25|1992-11-24|1993-01-12|TAKE BACK RETURN|AIR|efully about the ironic, ironic de +1956|1030|66|2|16|14896.48|0.00|0.05|R|F|1992-11-11|1992-11-11|1992-11-30|NONE|FOB|es cajole blithely. pen +1956|1390|29|3|39|50364.21|0.08|0.02|A|F|1992-09-24|1992-11-26|1992-10-15|DELIVER IN PERSON|REG AIR|r theodolites sleep above the b +1956|283|84|4|11|13016.08|0.10|0.00|A|F|1992-12-19|1992-10-29|1993-01-07|TAKE BACK RETURN|AIR| the braids slee +1956|1549|30|5|16|23208.64|0.08|0.02|R|F|1992-09-28|1992-10-21|1992-09-30|TAKE BACK RETURN|FOB| wake after the +1957|783|16|1|50|84189.00|0.09|0.05|N|O|1998-08-08|1998-09-28|1998-08-27|COLLECT COD|FOB|gainst the re +1957|1181|18|2|31|33547.58|0.10|0.08|N|O|1998-08-13|1998-08-31|1998-08-16|NONE|REG AIR|express packages maintain fluffi +1958|721|86|1|9|14595.48|0.01|0.05|N|O|1995-12-08|1995-12-17|1995-12-18|DELIVER IN PERSON|REG AIR|ickly. slyly bold +1958|1751|52|2|29|47929.75|0.05|0.06|N|O|1996-01-19|1995-12-05|1996-02-14|COLLECT COD|SHIP|d pinto beans +1958|1018|19|3|4|3676.04|0.04|0.02|N|O|1995-10-24|1995-12-09|1995-10-28|DELIVER IN PERSON|AIR|he slyly even dependencies +1958|827|94|4|38|65657.16|0.09|0.07|N|O|1995-10-09|1995-11-26|1995-11-05|COLLECT COD|TRUCK|yly. slyly regular courts use silentl +1958|1010|16|5|31|28241.31|0.08|0.01|N|O|1995-10-31|1995-11-12|1995-11-07|TAKE BACK RETURN|TRUCK|r deposits c +1958|162|15|6|44|46735.04|0.08|0.04|N|O|1995-12-17|1995-11-30|1996-01-15|TAKE BACK RETURN|RAIL|c theodolites after the unusual deposit +1958|384|69|7|29|37247.02|0.02|0.05|N|O|1995-10-14|1995-11-06|1995-11-01|NONE|REG AIR|final requests nag according to the +1959|1687|88|1|46|73079.28|0.04|0.00|N|O|1997-05-05|1997-03-03|1997-05-24|TAKE BACK RETURN|AIR| furiously ex +1959|1195|68|2|15|16442.85|0.08|0.07|N|O|1997-01-20|1997-02-18|1997-02-08|DELIVER IN PERSON|MAIL| quickly sp +1984|521|12|1|45|63968.40|0.03|0.04|N|O|1998-04-09|1998-06-11|1998-05-01|COLLECT COD|AIR|p. quickly final ideas sle +1984|700|63|2|35|56024.50|0.01|0.07|N|O|1998-05-18|1998-05-04|1998-06-01|COLLECT COD|RAIL|tes. quickly pending packages haggle boldl +1985|272|54|1|33|38684.91|0.10|0.03|R|F|1994-12-04|1994-11-01|1994-12-05|DELIVER IN PERSON|FOB|s are express packages. pendin +1985|204|32|2|50|55210.00|0.04|0.02|R|F|1994-09-30|1994-10-18|1994-10-12|COLLECT COD|AIR|ate carefully. carefully +1985|1333|72|3|20|24686.60|0.07|0.03|R|F|1994-10-29|1994-11-12|1994-11-27|NONE|TRUCK|regular requests. furiously express +1985|1982|83|4|30|56519.40|0.05|0.07|R|F|1994-09-06|1994-10-10|1994-09-26|NONE|RAIL|uickly. instr +1985|1239|77|5|42|47889.66|0.05|0.05|R|F|1994-10-25|1994-11-03|1994-11-19|DELIVER IN PERSON|SHIP| patterns? final requests after the sp +1985|197|50|6|2|2194.38|0.02|0.00|A|F|1994-11-25|1994-10-09|1994-12-25|TAKE BACK RETURN|FOB| silent inst +1986|915|16|1|12|21790.92|0.06|0.05|A|F|1994-08-17|1994-06-28|1994-09-02|COLLECT COD|RAIL|sleep furiously fluffily final +1986|1047|83|2|10|9480.40|0.10|0.03|R|F|1994-05-14|1994-06-21|1994-06-02|COLLECT COD|REG AIR|yly into the carefully even +1986|628|60|3|14|21400.68|0.04|0.02|R|F|1994-07-14|1994-06-19|1994-08-08|NONE|SHIP|the packages. pending, unusual +1987|151|30|1|7|7358.05|0.03|0.03|A|F|1994-07-30|1994-07-06|1994-08-29|NONE|REG AIR| regular a +1988|711|76|1|36|58021.56|0.09|0.04|N|O|1996-01-21|1995-11-24|1996-01-27|NONE|RAIL|gular theodolites. +1988|1985|18|2|19|35852.62|0.08|0.08|N|O|1996-02-03|1995-12-10|1996-02-14|COLLECT COD|FOB|lly about the slyly thin instructions. f +1988|538|29|3|8|11508.24|0.06|0.01|N|O|1995-10-20|1995-11-11|1995-11-18|DELIVER IN PERSON|AIR|le quickly ac +1988|357|86|4|27|33948.45|0.08|0.00|N|O|1996-01-27|1995-12-24|1996-02-24|TAKE BACK RETURN|TRUCK|uests. regular requests are according to t +1988|782|47|5|26|43752.28|0.08|0.04|N|O|1996-01-25|1995-12-15|1996-01-26|COLLECT COD|SHIP| ironic dolphins haggl +1988|860|60|6|9|15847.74|0.08|0.03|N|O|1995-12-26|1996-01-02|1996-01-25|DELIVER IN PERSON|MAIL|lar platelets. slyly ironic packa +1989|99|75|1|47|46957.23|0.10|0.02|R|F|1994-06-21|1994-05-27|1994-06-22|TAKE BACK RETURN|REG AIR|final deposits s +1990|1010|11|1|46|41906.46|0.01|0.07|R|F|1994-12-29|1995-03-14|1995-01-13|NONE|TRUCK|ar sentiments. +1991|1091|27|1|39|38691.51|0.06|0.02|A|F|1993-01-01|1992-11-29|1993-01-10|TAKE BACK RETURN|TRUCK|ckages? carefully bold depos +1991|529|60|2|49|70046.48|0.08|0.06|R|F|1992-10-19|1992-11-29|1992-10-25|NONE|SHIP|nd the ideas affi +1991|1736|37|3|6|9826.38|0.02|0.01|A|F|1992-11-02|1992-10-08|1992-11-14|TAKE BACK RETURN|REG AIR|hes nag slyly +1991|1374|51|4|6|7652.22|0.10|0.06|A|F|1992-11-21|1992-11-03|1992-11-27|NONE|RAIL|uickly blithely final de +1991|594|25|5|49|73234.91|0.06|0.00|R|F|1992-09-10|1992-11-30|1992-10-07|NONE|AIR|quests cajole blithely +2016|1461|1|1|2|2724.92|0.02|0.07|N|O|1996-10-12|1996-11-09|1996-10-31|DELIVER IN PERSON|TRUCK|carefully according to the +2016|627|21|2|15|22914.30|0.04|0.05|N|O|1996-09-24|1996-10-05|1996-10-21|TAKE BACK RETURN|MAIL|uests haggle carefully furiously regul +2016|1215|53|3|8|8929.68|0.09|0.02|N|O|1996-09-19|1996-10-21|1996-10-13|TAKE BACK RETURN|SHIP|mptotes haggle ideas. packages wake flu +2017|1026|27|1|49|45423.98|0.10|0.06|N|O|1998-05-26|1998-07-01|1998-06-06|COLLECT COD|TRUCK| after the unusual instructions. sly +2017|701|2|2|14|22423.80|0.07|0.04|N|O|1998-06-28|1998-06-15|1998-07-11|NONE|TRUCK|ily final w +2017|835|2|3|11|19094.13|0.05|0.02|N|O|1998-05-22|1998-07-13|1998-05-26|TAKE BACK RETURN|TRUCK|gside of the slyly dogged dolp +2018|1943|44|1|2|3689.88|0.02|0.07|N|O|1995-06-25|1995-06-20|1995-07-04|NONE|TRUCK|ly ironic accounts against the slyly sly +2018|1282|83|2|23|27215.44|0.05|0.01|R|F|1995-05-05|1995-05-12|1995-05-22|TAKE BACK RETURN|RAIL|ingly even theodolites s +2019|33|84|1|31|28923.93|0.07|0.03|R|F|1992-11-18|1992-12-26|1992-11-24|DELIVER IN PERSON|FOB|l ideas across the slowl +2019|519|80|2|18|25551.18|0.04|0.03|R|F|1993-01-24|1992-12-22|1993-02-02|NONE|MAIL|are carefully furiously regular requ +2020|336|21|1|50|61816.50|0.06|0.01|R|F|1993-07-12|1993-08-28|1993-08-02|COLLECT COD|TRUCK|ts against the pending ideas serve along +2020|1757|84|2|40|66350.00|0.09|0.00|A|F|1993-10-17|1993-09-14|1993-10-29|TAKE BACK RETURN|RAIL|ently across the +2020|139|18|3|30|31173.90|0.07|0.04|A|F|1993-09-08|1993-08-11|1993-09-29|TAKE BACK RETURN|AIR|ly about the blithely ironic foxes. bold +2020|609|72|4|27|40759.20|0.05|0.06|A|F|1993-07-14|1993-09-02|1993-08-03|NONE|FOB|e of the bold foxes haggle +2021|848|48|1|7|12241.88|0.08|0.04|N|O|1995-10-17|1995-09-29|1995-10-20|NONE|MAIL| accounts boost blithely. blithely reg +2021|1653|36|2|19|29538.35|0.04|0.05|N|O|1995-08-14|1995-09-05|1995-08-23|NONE|RAIL| above the slyly fl +2022|1685|27|1|38|60293.84|0.00|0.08|R|F|1992-07-05|1992-04-20|1992-07-13|TAKE BACK RETURN|REG AIR| against the express accounts wake ca +2022|548|79|2|38|55044.52|0.05|0.04|R|F|1992-06-17|1992-05-15|1992-06-28|COLLECT COD|SHIP|instructions dazzle carefull +2022|489|90|3|48|66695.04|0.10|0.02|A|F|1992-06-14|1992-06-04|1992-07-12|DELIVER IN PERSON|SHIP|counts. slyly enticing accounts are during +2022|1814|15|4|16|27452.96|0.05|0.03|R|F|1992-06-23|1992-05-22|1992-07-07|NONE|TRUCK|ages wake slyly care +2022|995|96|5|36|68255.64|0.05|0.02|R|F|1992-03-24|1992-05-07|1992-04-13|NONE|MAIL|ly after the foxes. regular, final inst +2022|1282|94|6|20|23665.60|0.08|0.08|A|F|1992-03-31|1992-04-17|1992-04-02|NONE|SHIP|r deposits kindle +2022|772|73|7|13|21746.01|0.06|0.08|R|F|1992-04-04|1992-05-30|1992-04-21|NONE|FOB| orbits haggle fluffily fl +2023|1263|75|1|9|10478.34|0.05|0.04|R|F|1992-06-04|1992-06-30|1992-06-10|NONE|AIR|ly regular pinto beans poa +2023|378|63|2|2|2556.74|0.01|0.00|R|F|1992-08-27|1992-07-16|1992-08-29|DELIVER IN PERSON|RAIL|ing packages. fluffily silen +2023|186|39|3|25|27154.50|0.10|0.03|A|F|1992-07-19|1992-07-07|1992-08-15|NONE|REG AIR| wake furiously among the slyly final +2023|1849|36|4|9|15757.56|0.02|0.00|A|F|1992-07-23|1992-07-04|1992-08-20|TAKE BACK RETURN|AIR|nts maintain blithely alongside of the +2023|195|74|5|22|24094.18|0.04|0.06|A|F|1992-06-15|1992-07-13|1992-06-21|TAKE BACK RETURN|SHIP|ronic attainments. +2023|429|17|6|29|38553.18|0.02|0.06|A|F|1992-08-29|1992-07-28|1992-09-18|COLLECT COD|RAIL|usual instructions. bli +2023|1340|79|7|50|62067.00|0.00|0.03|R|F|1992-06-20|1992-07-04|1992-06-23|DELIVER IN PERSON|FOB|its! carefully ex +2048|343|72|1|7|8703.38|0.06|0.01|R|F|1993-12-07|1994-01-31|1994-01-05|TAKE BACK RETURN|REG AIR|lent platelets boost deposits. carefully sp +2048|74|50|2|5|4870.35|0.04|0.04|A|F|1994-01-18|1994-02-01|1994-01-29|TAKE BACK RETURN|TRUCK|affix carefully against +2048|1006|7|3|12|10884.00|0.01|0.05|R|F|1994-01-28|1994-01-19|1994-02-08|NONE|AIR| even theodoli +2048|963|66|4|11|20503.56|0.10|0.03|R|F|1993-12-20|1994-01-19|1994-01-04|TAKE BACK RETURN|MAIL|totes. idly ironic packages nag +2049|1881|82|1|25|44572.00|0.08|0.00|N|O|1996-03-31|1996-02-29|1996-04-15|DELIVER IN PERSON|MAIL| excuses above the +2049|347|76|2|31|38667.54|0.10|0.05|N|O|1995-12-25|1996-02-25|1995-12-29|TAKE BACK RETURN|MAIL| packages are slyly alongside +2049|666|98|3|18|28199.88|0.05|0.05|N|O|1996-01-09|1996-01-22|1996-01-25|TAKE BACK RETURN|AIR| sleep fluffily. dependencies use never +2049|55|56|4|39|37246.95|0.02|0.05|N|O|1996-01-17|1996-01-21|1996-02-03|TAKE BACK RETURN|MAIL|the even pinto beans +2049|1253|91|5|30|34627.50|0.04|0.06|N|O|1995-12-16|1996-02-04|1995-12-22|NONE|TRUCK|ial accounts are among the furiously perma +2049|831|98|6|17|29441.11|0.07|0.00|N|O|1996-02-04|1996-03-01|1996-02-24|NONE|FOB|al, regular foxes. pending, +2050|727|92|1|47|76502.84|0.05|0.03|A|F|1994-08-25|1994-07-18|1994-09-15|DELIVER IN PERSON|TRUCK|tside the blithely pending packages eat f +2050|1516|17|2|48|68040.48|0.05|0.01|A|F|1994-09-30|1994-08-23|1994-10-29|COLLECT COD|AIR| final packages. pinto +2050|1121|22|3|41|41906.92|0.10|0.04|A|F|1994-06-08|1994-08-27|1994-06-23|NONE|AIR| final theodolites. depende +2050|316|1|4|11|13379.41|0.02|0.01|A|F|1994-07-27|1994-08-18|1994-08-02|DELIVER IN PERSON|REG AIR|ns. bold, final ideas cajole among the fi +2050|1679|80|5|16|25290.72|0.07|0.01|R|F|1994-08-17|1994-07-28|1994-09-05|DELIVER IN PERSON|REG AIR|al accounts. closely even +2050|485|44|6|29|40178.92|0.00|0.05|A|F|1994-09-23|1994-08-01|1994-10-23|TAKE BACK RETURN|MAIL|oxes alongsid +2050|473|3|7|25|34336.75|0.10|0.00|R|F|1994-08-18|1994-07-04|1994-09-04|TAKE BACK RETURN|RAIL|y according to +2051|243|44|1|43|49159.32|0.08|0.04|N|O|1996-04-22|1996-06-16|1996-04-28|COLLECT COD|RAIL|ounts sleep fluffily even requ +2051|1294|95|2|48|57373.92|0.01|0.02|N|O|1996-05-04|1996-06-14|1996-05-19|NONE|TRUCK|unts. pending platelets believe about +2052|679|11|1|50|78983.50|0.09|0.08|R|F|1992-06-22|1992-06-03|1992-07-19|DELIVER IN PERSON|AIR|wake after the decoy +2052|1349|88|2|35|43761.90|0.09|0.05|A|F|1992-05-29|1992-05-24|1992-06-11|NONE|TRUCK|ts according t +2052|423|11|3|16|21174.72|0.01|0.08|A|F|1992-06-30|1992-07-09|1992-07-12|NONE|SHIP|y final deposits cajole according +2052|960|61|4|47|87465.12|0.08|0.01|A|F|1992-06-18|1992-05-16|1992-07-02|TAKE BACK RETURN|REG AIR|final requests. stealt +2053|1007|43|1|20|18160.00|0.09|0.00|A|F|1995-04-25|1995-04-12|1995-05-13|NONE|TRUCK|ly ironic foxes haggle slyly speci +2053|323|24|2|34|41592.88|0.07|0.00|A|F|1995-03-15|1995-03-20|1995-04-09|TAKE BACK RETURN|TRUCK|ions. unusual dependencies +2053|643|6|3|46|71007.44|0.01|0.03|R|F|1995-04-01|1995-04-02|1995-04-18|NONE|RAIL|tions. furiously even requests hagg +2053|1210|48|4|31|34447.51|0.06|0.08|R|F|1995-03-23|1995-03-13|1995-04-16|DELIVER IN PERSON|SHIP|ts. fluffily final mul +2054|1124|25|1|11|11276.32|0.03|0.05|R|F|1992-08-13|1992-08-26|1992-08-22|NONE|AIR|ular accou +2054|1194|67|2|31|33950.89|0.05|0.08|A|F|1992-08-18|1992-09-04|1992-08-24|NONE|FOB|se bold, regular accounts. unusual depos +2054|1210|11|3|32|35558.72|0.06|0.00|A|F|1992-06-23|1992-07-08|1992-07-22|NONE|FOB| packages thrash. carefully final +2054|1740|25|4|14|22984.36|0.10|0.05|R|F|1992-06-25|1992-09-05|1992-07-14|DELIVER IN PERSON|SHIP|uickly final +2054|60|11|5|40|38402.40|0.08|0.06|R|F|1992-06-23|1992-08-09|1992-07-04|TAKE BACK RETURN|RAIL|n pinto beans. ironic courts are iro +2054|1335|74|6|17|21017.61|0.08|0.01|A|F|1992-06-09|1992-08-28|1992-06-16|NONE|AIR|ges nag acc +2054|104|83|7|4|4016.40|0.00|0.08|R|F|1992-08-12|1992-08-31|1992-08-15|DELIVER IN PERSON|AIR|lyly careful requests wake fl +2055|445|46|1|15|20181.60|0.04|0.06|A|F|1993-09-15|1993-10-06|1993-10-07|NONE|REG AIR|furiously bold +2055|83|84|2|15|14746.20|0.06|0.05|R|F|1993-10-30|1993-11-21|1993-11-22|COLLECT COD|RAIL|gular foxes. b +2055|1344|83|3|12|14944.08|0.00|0.02|A|F|1993-10-26|1993-11-23|1993-11-22|COLLECT COD|TRUCK|al pains. acco +2055|1338|77|4|16|19829.28|0.02|0.02|A|F|1993-11-16|1993-11-12|1993-11-28|NONE|TRUCK|arefully daringly regular accounts. +2080|69|45|1|5|4845.30|0.08|0.05|R|F|1993-08-26|1993-08-07|1993-09-02|DELIVER IN PERSON|TRUCK|refully unusual theo +2080|1970|15|2|39|73006.83|0.07|0.04|A|F|1993-08-22|1993-09-09|1993-08-23|COLLECT COD|FOB|ic deposits haggle slyly carefully eve +2081|885|85|1|26|46432.88|0.03|0.08|N|O|1997-10-21|1997-10-03|1997-11-10|NONE|FOB|among the slyly express accounts. silen +2081|1484|63|2|13|18011.24|0.07|0.05|N|O|1997-08-23|1997-08-22|1997-09-09|TAKE BACK RETURN|MAIL|fter the even deposi +2081|130|83|3|32|32964.16|0.09|0.07|N|O|1997-09-05|1997-09-26|1997-10-03|TAKE BACK RETURN|SHIP|e. final, regular dependencies sleep slyly! +2081|847|48|4|23|40200.32|0.03|0.08|N|O|1997-07-06|1997-09-11|1997-07-21|TAKE BACK RETURN|MAIL|ual requests wake blithely above the +2081|1122|59|5|19|19439.28|0.02|0.06|N|O|1997-10-01|1997-08-12|1997-10-18|COLLECT COD|SHIP|s affix sometimes express requests. quickly +2081|1416|56|6|31|40839.71|0.03|0.06|N|O|1997-09-19|1997-09-13|1997-09-27|NONE|AIR| silent, spe +2082|745|42|1|36|59246.64|0.00|0.00|R|F|1995-01-20|1995-03-18|1995-01-31|COLLECT COD|MAIL|haggle furiously silent pinto beans +2082|1046|17|2|12|11364.48|0.08|0.05|A|F|1995-01-27|1995-02-11|1995-02-07|NONE|FOB| ironic instructions. carefull +2083|240|95|1|37|42188.88|0.07|0.00|R|F|1993-09-07|1993-09-30|1993-09-18|TAKE BACK RETURN|MAIL|ng the special foxes wake packages. f +2084|1812|42|1|42|71980.02|0.03|0.05|A|F|1993-03-29|1993-05-05|1993-04-22|COLLECT COD|REG AIR|y fluffily even foxes. +2084|1799|42|2|23|39118.17|0.09|0.08|A|F|1993-06-05|1993-05-26|1993-06-06|DELIVER IN PERSON|AIR|es against +2084|1354|69|3|37|46447.95|0.07|0.05|A|F|1993-07-16|1993-04-20|1993-08-06|NONE|AIR|y careful courts. +2084|938|41|4|9|16550.37|0.02|0.02|A|F|1993-03-18|1993-06-08|1993-03-30|NONE|TRUCK|heaves boost slyly after the pla +2084|269|51|5|28|32739.28|0.07|0.02|R|F|1993-05-04|1993-05-14|1993-05-31|COLLECT COD|TRUCK|cajole quickly carefu +2084|1150|87|6|15|15767.25|0.09|0.04|A|F|1993-06-23|1993-04-25|1993-07-23|COLLECT COD|SHIP|tithes. bravely pendi +2084|1935|80|7|34|62455.62|0.09|0.02|R|F|1993-06-20|1993-05-28|1993-06-25|DELIVER IN PERSON|RAIL| carefully ironic requests. fluffil +2085|402|32|1|45|58608.00|0.00|0.07|R|F|1994-02-27|1994-01-11|1994-03-29|TAKE BACK RETURN|MAIL|. carefully e +2086|599|100|1|22|32990.98|0.03|0.07|R|F|1994-12-04|1994-12-16|1994-12-20|DELIVER IN PERSON|RAIL|idly busy acc +2086|1410|28|2|32|41965.12|0.04|0.06|A|F|1994-11-15|1995-01-05|1994-12-09|TAKE BACK RETURN|TRUCK|e carefully along th +2086|1050|51|3|44|41846.20|0.02|0.01|A|F|1994-12-04|1994-11-30|1994-12-21|DELIVER IN PERSON|FOB|latelets s +2086|839|6|4|27|46975.41|0.02|0.00|A|F|1994-11-04|1995-01-14|1994-11-25|COLLECT COD|REG AIR|theodolites haggle blithely blithe p +2086|1551|32|5|33|47934.15|0.04|0.00|A|F|1995-02-06|1994-11-25|1995-02-15|NONE|SHIP| slyly regular foxes. un +2086|1992|81|6|20|37879.80|0.01|0.03|R|F|1994-11-30|1994-12-28|1994-12-07|COLLECT COD|FOB|lithely ironic acc +2086|1560|81|7|7|10230.92|0.04|0.05|R|F|1994-12-27|1994-12-10|1995-01-05|COLLECT COD|RAIL| beans haggle car +2087|1267|68|1|1|1168.26|0.05|0.04|N|O|1998-03-27|1998-03-24|1998-04-18|DELIVER IN PERSON|REG AIR|the quickly idle acco +2087|1673|97|2|46|72434.82|0.10|0.03|N|O|1998-02-24|1998-04-02|1998-03-04|DELIVER IN PERSON|AIR|ter the dolphins. +2087|618|19|3|1|1518.61|0.02|0.05|N|O|1998-05-27|1998-04-11|1998-06-12|COLLECT COD|REG AIR|hely final acc +2087|588|79|4|6|8931.48|0.03|0.08|N|O|1998-04-23|1998-03-27|1998-05-18|DELIVER IN PERSON|REG AIR|dazzle after the slyly si +2112|701|2|1|18|28830.60|0.02|0.05|N|O|1997-05-02|1997-03-16|1997-05-25|TAKE BACK RETURN|TRUCK|lphins solve ideas. even, special reque +2113|1228|66|1|40|45168.80|0.04|0.06|N|O|1998-01-16|1997-12-11|1998-02-06|TAKE BACK RETURN|TRUCK|bout the quickly ironic t +2113|1113|22|2|24|24338.64|0.03|0.02|N|O|1998-02-19|1998-01-08|1998-03-16|COLLECT COD|MAIL|kly regular accounts hinder about the +2114|1675|76|1|50|78833.50|0.05|0.05|A|F|1995-02-05|1995-03-18|1995-02-13|COLLECT COD|RAIL|pecial pinto bean +2114|1851|38|2|26|45574.10|0.02|0.02|A|F|1995-04-30|1995-04-16|1995-05-28|NONE|SHIP|ar asymptotes sleep +2114|1618|60|3|25|37990.25|0.07|0.01|A|F|1995-02-15|1995-03-13|1995-02-22|COLLECT COD|AIR|unts. regular, express accounts wake. b +2115|1952|97|1|27|50056.65|0.06|0.03|N|O|1998-09-01|1998-07-29|1998-09-04|NONE|AIR|de of the carefully bold accounts +2115|1831|61|2|43|74511.69|0.06|0.02|N|O|1998-07-14|1998-07-25|1998-07-24|COLLECT COD|FOB| carefully pending requests alongs +2115|509|100|3|3|4228.50|0.03|0.04|N|O|1998-07-23|1998-07-30|1998-08-14|DELIVER IN PERSON|FOB|quickly ironic dolphin +2115|482|83|4|47|64976.56|0.06|0.07|N|O|1998-08-29|1998-07-30|1998-09-05|TAKE BACK RETURN|REG AIR|regular accounts integrate brav +2115|1990|23|5|13|24595.87|0.04|0.00|N|O|1998-08-07|1998-08-06|1998-08-13|DELIVER IN PERSON|REG AIR|into beans. even accounts abou +2116|1301|2|1|2|2404.60|0.00|0.02|R|F|1994-10-16|1994-11-24|1994-11-09|DELIVER IN PERSON|TRUCK|r theodolites use blithely about the ir +2116|1394|95|2|47|60883.33|0.10|0.06|R|F|1994-09-01|1994-11-18|1994-09-25|COLLECT COD|MAIL|iously ironic dependencies around the iro +2116|1833|77|3|11|19083.13|0.03|0.05|R|F|1994-09-15|1994-10-21|1994-09-21|NONE|FOB| pinto beans. final, final sauternes play +2117|1646|29|1|36|55715.04|0.10|0.01|N|O|1997-08-06|1997-07-15|1997-08-07|DELIVER IN PERSON|SHIP|ronic accounts wake +2117|602|96|2|19|28549.40|0.04|0.00|N|O|1997-07-30|1997-06-18|1997-08-13|DELIVER IN PERSON|REG AIR|s between the slyly regula +2117|575|36|3|43|63449.51|0.04|0.03|N|O|1997-06-27|1997-06-12|1997-07-22|DELIVER IN PERSON|SHIP| foxes sleep furiously +2117|906|75|4|24|43365.60|0.00|0.07|N|O|1997-06-15|1997-05-27|1997-06-18|COLLECT COD|SHIP|thely slyly pending platelets. ironic, +2117|1468|69|5|3|4108.38|0.02|0.05|N|O|1997-05-05|1997-07-20|1997-05-26|TAKE BACK RETURN|TRUCK|tes cajole +2117|2|28|6|27|24354.00|0.09|0.08|N|O|1997-06-30|1997-06-27|1997-07-11|TAKE BACK RETURN|REG AIR| the carefully ironic ideas +2118|1596|97|1|24|35942.16|0.10|0.03|N|O|1997-01-06|1996-12-14|1997-01-14|TAKE BACK RETURN|RAIL|about the slyly bold depende +2118|1833|34|2|4|6939.32|0.08|0.01|N|O|1996-10-25|1996-11-10|1996-11-22|COLLECT COD|AIR|theodolites affix according +2118|1444|62|3|11|14799.84|0.05|0.04|N|O|1996-12-23|1996-12-20|1997-01-01|COLLECT COD|RAIL|y ironic accounts sleep upon the packages. +2119|1018|89|1|36|33084.36|0.04|0.00|N|O|1996-11-10|1996-10-25|1996-12-03|TAKE BACK RETURN|RAIL|ly bold foxes. ironic accoun +2144|915|18|1|33|59925.03|0.00|0.07|R|F|1994-04-04|1994-06-20|1994-04-23|NONE|AIR| ironic excuses haggle final dependencies. +2144|509|40|2|46|64837.00|0.03|0.08|R|F|1994-04-08|1994-04-29|1994-05-07|COLLECT COD|SHIP| foxes haggle blithel +2144|35|86|3|29|27115.87|0.00|0.07|R|F|1994-05-03|1994-05-16|1994-06-01|DELIVER IN PERSON|FOB|ns wake carefully carefully ironic +2144|1572|73|4|10|14735.70|0.00|0.04|R|F|1994-06-16|1994-05-03|1994-07-05|COLLECT COD|AIR| furiously unusual ideas. carefull +2145|774|7|1|13|21772.01|0.04|0.05|A|F|1992-11-12|1992-12-13|1992-12-07|TAKE BACK RETURN|MAIL|alongside of the slyly final +2145|1539|60|2|6|8643.18|0.05|0.01|A|F|1992-10-10|1992-11-29|1992-10-14|NONE|AIR|s. fluffily express accounts sleep. slyl +2146|569|100|1|42|61721.52|0.10|0.01|A|F|1992-09-21|1992-11-02|1992-09-23|NONE|AIR|ns according to the doggedly +2146|1567|8|2|6|8811.36|0.07|0.05|A|F|1993-01-03|1992-10-24|1993-01-24|DELIVER IN PERSON|RAIL|ing to the requests. dependencies boost +2146|244|26|3|14|16019.36|0.03|0.01|R|F|1992-09-16|1992-10-16|1992-09-20|COLLECT COD|SHIP|ecial, express a +2146|260|42|4|31|35968.06|0.02|0.00|A|F|1993-01-04|1992-10-24|1993-01-15|DELIVER IN PERSON|TRUCK|lly even deposit +2146|1686|10|5|28|44455.04|0.02|0.05|R|F|1993-01-03|1992-10-17|1993-01-08|COLLECT COD|MAIL|r accounts sleep furio +2146|702|99|6|32|51286.40|0.07|0.03|R|F|1993-01-10|1992-10-19|1993-02-05|COLLECT COD|TRUCK|y regular foxes wake among the final +2146|243|44|7|39|44586.36|0.07|0.06|R|F|1993-01-05|1992-11-06|1993-01-14|DELIVER IN PERSON|TRUCK|uickly regular excuses detect. regular c +2147|288|43|1|50|59414.00|0.04|0.06|R|F|1992-11-18|1992-11-30|1992-11-30|NONE|RAIL|al accounts. even, even foxes wake +2147|1007|8|2|4|3632.00|0.01|0.04|A|F|1992-09-27|1992-11-15|1992-10-22|NONE|AIR|mong the blithely special +2147|435|94|3|34|45404.62|0.10|0.04|R|F|1992-11-29|1992-11-08|1992-12-22|TAKE BACK RETURN|REG AIR|egular deposits hang car +2147|103|56|4|11|11034.10|0.06|0.07|A|F|1992-09-27|1992-11-16|1992-10-16|NONE|AIR| the fluffily +2148|1160|69|1|21|22284.36|0.09|0.01|R|F|1995-05-28|1995-05-26|1995-06-15|NONE|FOB|deposits ag +2149|183|62|1|12|12998.16|0.05|0.07|R|F|1993-06-01|1993-05-06|1993-06-11|TAKE BACK RETURN|TRUCK|riously bl +2149|990|91|2|10|18909.90|0.06|0.01|R|F|1993-06-09|1993-04-17|1993-06-16|DELIVER IN PERSON|TRUCK|eposits sleep above +2149|487|46|3|47|65211.56|0.00|0.04|R|F|1993-06-27|1993-05-12|1993-07-11|COLLECT COD|AIR|hely final depo +2149|1282|57|4|18|21299.04|0.06|0.00|A|F|1993-04-05|1993-05-11|1993-04-23|DELIVER IN PERSON|REG AIR|uriously final pac +2149|594|55|5|22|32880.98|0.06|0.04|R|F|1993-05-24|1993-04-23|1993-06-20|TAKE BACK RETURN|SHIP|ptotes sleep along the blithely ir +2150|779|44|1|26|43674.02|0.00|0.03|A|F|1994-06-21|1994-08-05|1994-06-23|NONE|TRUCK|. always unusual packages +2150|178|57|2|29|31266.93|0.04|0.03|A|F|1994-09-02|1994-08-04|1994-10-02|TAKE BACK RETURN|RAIL|y ironic theodolites. foxes ca +2150|1068|39|3|29|28102.74|0.04|0.08|R|F|1994-06-10|1994-07-31|1994-06-26|COLLECT COD|RAIL|arefully final att +2150|538|29|4|39|56102.67|0.05|0.02|R|F|1994-07-31|1994-08-17|1994-08-11|TAKE BACK RETURN|TRUCK|ess accounts nag. unusual asymptotes haggl +2150|1825|26|5|35|60438.70|0.01|0.01|A|F|1994-09-27|1994-08-17|1994-10-13|COLLECT COD|RAIL|refully pending dependen +2150|64|90|6|12|11568.72|0.09|0.03|A|F|1994-08-27|1994-08-22|1994-09-18|COLLECT COD|AIR|press platelets haggle until the slyly fi +2151|1670|94|1|23|36148.41|0.06|0.02|N|O|1996-11-20|1996-12-17|1996-11-30|DELIVER IN PERSON|AIR| silent dependencies about the slyl +2151|145|72|2|29|30309.06|0.00|0.02|N|O|1997-03-04|1996-12-27|1997-03-21|TAKE BACK RETURN|SHIP| bold packages acro +2151|1649|32|3|49|75981.36|0.07|0.01|N|O|1997-01-20|1997-02-09|1997-02-18|NONE|FOB| packages. f +2151|177|30|4|28|30160.76|0.10|0.08|N|O|1996-12-11|1996-12-26|1996-12-12|DELIVER IN PERSON|AIR|y special packages. carefully ironic instru +2176|1903|92|1|38|68586.20|0.02|0.08|R|F|1992-11-29|1993-01-14|1992-12-22|DELIVER IN PERSON|REG AIR|lithely ironic pinto beans. furious +2176|942|11|2|14|25801.16|0.00|0.06|A|F|1992-11-17|1993-01-07|1992-12-03|DELIVER IN PERSON|SHIP|ely ironic platelets +2176|1595|96|3|25|37414.75|0.02|0.02|R|F|1993-02-23|1993-01-05|1993-03-07|COLLECT COD|RAIL| ruthless deposits according to the ent +2176|1423|2|4|2|2648.84|0.05|0.06|A|F|1993-02-26|1993-01-08|1993-03-23|DELIVER IN PERSON|AIR|s pinto beans +2177|1286|87|1|45|53427.60|0.02|0.01|N|O|1997-02-11|1997-02-27|1997-02-17|NONE|SHIP|. theodolites haggle carefu +2177|1385|24|2|27|34732.26|0.04|0.08|N|O|1997-01-29|1997-03-20|1997-02-04|DELIVER IN PERSON|SHIP|even, regula +2177|801|35|3|23|39141.40|0.07|0.05|N|O|1997-01-28|1997-03-02|1997-02-13|DELIVER IN PERSON|AIR|he silent foxes. iro +2177|550|81|4|34|49318.70|0.05|0.07|N|O|1997-02-03|1997-04-10|1997-02-21|COLLECT COD|REG AIR|tes are doggedly quickly +2177|565|56|5|46|67415.76|0.09|0.05|N|O|1997-05-10|1997-02-23|1997-05-28|COLLECT COD|RAIL|ending asymptotes. +2177|1217|55|6|11|12300.31|0.02|0.04|N|O|1997-03-20|1997-03-07|1997-04-09|DELIVER IN PERSON|MAIL|gainst the ca +2178|1562|43|1|15|21953.40|0.10|0.01|N|O|1997-03-27|1997-03-10|1997-04-18|NONE|REG AIR|l accounts. quickly expr +2178|159|86|2|27|28597.05|0.01|0.02|N|O|1997-02-26|1997-02-19|1997-03-25|NONE|MAIL| across the ironic reques +2178|49|25|3|40|37961.60|0.00|0.03|N|O|1997-03-17|1997-02-09|1997-04-15|COLLECT COD|RAIL|foxes are slowly regularly specia +2178|777|74|4|3|5033.31|0.07|0.07|N|O|1997-04-07|1997-01-23|1997-04-18|COLLECT COD|MAIL| permanentl +2179|1295|70|1|22|26318.38|0.05|0.08|N|O|1996-11-16|1996-11-03|1996-11-25|DELIVER IN PERSON|FOB|lphins cajole acr +2179|1381|20|2|20|25647.60|0.03|0.01|N|O|1996-09-30|1996-11-10|1996-10-30|NONE|REG AIR|ncies. fin +2179|1034|5|3|5|4675.15|0.03|0.02|N|O|1996-11-09|1996-10-08|1996-11-11|DELIVER IN PERSON|REG AIR|ts haggle blithely. ironic, careful theodol +2179|53|29|4|24|22873.20|0.04|0.04|N|O|1996-10-26|1996-11-05|1996-11-16|COLLECT COD|RAIL| cajole carefully. +2179|1074|80|5|7|6825.49|0.00|0.02|N|O|1996-10-24|1996-11-14|1996-11-21|TAKE BACK RETURN|RAIL|gular dependencies. ironic packages haggle +2180|152|5|1|31|32616.65|0.06|0.04|N|O|1996-10-20|1996-11-21|1996-11-06|COLLECT COD|REG AIR|n requests are furiously at the quickly +2180|1923|56|2|39|71171.88|0.01|0.00|N|O|1997-01-03|1996-10-29|1997-01-25|NONE|RAIL|ep furiously furiously final request +2180|1970|15|3|24|44927.28|0.03|0.00|N|O|1997-01-03|1996-10-24|1997-01-19|NONE|SHIP|uriously f +2180|1103|40|4|47|47192.70|0.07|0.02|N|O|1996-09-23|1996-12-08|1996-10-12|NONE|FOB|pending, regular ideas. iron +2180|1429|47|5|23|30599.66|0.02|0.06|N|O|1996-11-08|1996-10-25|1996-11-28|NONE|TRUCK|ggle alongside of the fluffily speci +2180|542|43|6|48|69241.92|0.09|0.03|N|O|1996-12-30|1996-11-22|1997-01-16|DELIVER IN PERSON|RAIL|nic instructions haggle careful +2181|1779|80|1|4|6723.08|0.05|0.04|N|O|1995-09-25|1995-11-12|1995-09-28|COLLECT COD|FOB|tes. slyly silent packages use along th +2181|878|45|2|46|81828.02|0.00|0.02|N|O|1995-11-28|1995-10-17|1995-12-26|COLLECT COD|AIR|osits. final packages sleep +2181|908|9|3|15|27133.50|0.08|0.05|N|O|1995-10-05|1995-10-27|1995-11-03|DELIVER IN PERSON|FOB|e above the fluffily regul +2181|547|8|4|28|40531.12|0.04|0.05|N|O|1995-12-21|1995-10-23|1996-01-04|TAKE BACK RETURN|AIR|s excuses sleep car +2181|958|59|5|9|16730.55|0.06|0.07|N|O|1996-01-05|1995-12-05|1996-01-08|COLLECT COD|TRUCK|ward the quietly even requests. ir +2182|1317|32|1|27|32894.37|0.02|0.07|R|F|1994-05-10|1994-07-04|1994-06-04|DELIVER IN PERSON|SHIP|en platele +2182|1898|28|2|3|5399.67|0.05|0.03|R|F|1994-04-20|1994-07-04|1994-04-24|TAKE BACK RETURN|SHIP|y bold theodolites wi +2182|934|69|3|34|62387.62|0.02|0.03|R|F|1994-05-28|1994-06-02|1994-06-10|COLLECT COD|MAIL| slow tithes. ironi +2182|61|37|4|12|11532.72|0.04|0.07|A|F|1994-05-08|1994-06-02|1994-05-09|COLLECT COD|REG AIR|ments are fu +2182|1789|32|5|37|62558.86|0.06|0.02|A|F|1994-04-08|1994-06-29|1994-04-18|TAKE BACK RETURN|TRUCK|ges. blithely ironic +2183|707|40|1|29|46623.30|0.05|0.01|N|O|1996-07-21|1996-08-24|1996-08-15|TAKE BACK RETURN|RAIL|ly unusual deposits sleep carefully +2183|511|12|2|25|35287.75|0.06|0.02|N|O|1996-07-06|1996-08-21|1996-08-05|NONE|RAIL|he quickly f +2208|573|34|1|48|70731.36|0.08|0.07|A|F|1995-05-13|1995-06-30|1995-05-20|COLLECT COD|MAIL|sits. idly permanent request +2208|968|71|2|11|20558.56|0.08|0.01|A|F|1995-05-06|1995-07-19|1995-05-22|COLLECT COD|TRUCK|ding waters lose. furiously regu +2208|734|67|3|41|67023.93|0.08|0.02|N|O|1995-08-18|1995-06-19|1995-09-05|COLLECT COD|RAIL|nd the furious, express dependencies. +2208|424|12|4|50|66221.00|0.07|0.07|N|F|1995-06-11|1995-05-31|1995-06-29|TAKE BACK RETURN|FOB|al foxes will hav +2208|296|24|5|43|51440.47|0.03|0.06|A|F|1995-05-10|1995-06-02|1995-06-09|TAKE BACK RETURN|MAIL|es. accounts cajole. fi +2208|1663|87|6|18|28163.88|0.02|0.08|R|F|1995-06-06|1995-06-10|1995-06-11|TAKE BACK RETURN|TRUCK|packages are quickly bold de +2208|62|13|7|45|43292.70|0.00|0.08|A|F|1995-05-05|1995-06-10|1995-05-11|NONE|SHIP|e fluffily regular theodolites caj +2209|227|82|1|40|45088.80|0.05|0.01|R|F|1992-11-01|1992-09-25|1992-11-08|DELIVER IN PERSON|SHIP|ully special sheaves serve +2209|1028|29|2|10|9290.20|0.00|0.02|R|F|1992-09-02|1992-09-24|1992-09-21|DELIVER IN PERSON|AIR|players. carefully reg +2209|636|99|3|11|16902.93|0.01|0.01|A|F|1992-07-12|1992-08-24|1992-08-10|DELIVER IN PERSON|REG AIR|express, regular pinto be +2209|1809|53|4|39|66721.20|0.08|0.07|R|F|1992-11-04|1992-09-02|1992-11-11|TAKE BACK RETURN|MAIL|ly around the final packages. deposits ca +2209|1234|46|5|24|27245.52|0.08|0.06|R|F|1992-08-09|1992-08-18|1992-08-25|COLLECT COD|AIR| along the bol +2209|1775|60|6|7|11737.39|0.09|0.07|A|F|1992-08-18|1992-09-09|1992-09-12|DELIVER IN PERSON|AIR| quickly regular pack +2210|778|43|1|36|60435.72|0.10|0.00|A|F|1992-03-04|1992-03-24|1992-03-21|DELIVER IN PERSON|AIR| requests wake enticingly final +2211|479|38|1|25|34486.75|0.04|0.01|A|F|1994-10-09|1994-08-04|1994-11-03|TAKE BACK RETURN|RAIL|deas. carefully special theodolites along +2211|1398|37|2|40|51975.60|0.09|0.06|A|F|1994-09-30|1994-09-10|1994-10-26|NONE|MAIL|posits among the express dolphins +2211|1599|20|3|25|37514.75|0.00|0.07|A|F|1994-08-13|1994-08-17|1994-08-16|NONE|AIR|ly regular, express +2211|848|15|4|23|40223.32|0.03|0.02|R|F|1994-10-05|1994-09-13|1994-10-17|DELIVER IN PERSON|AIR|ependencies +2211|1344|83|5|3|3736.02|0.02|0.04|A|F|1994-08-28|1994-09-10|1994-09-06|TAKE BACK RETURN|SHIP|pendencies after the regular f +2211|1862|63|6|18|31749.48|0.05|0.08|A|F|1994-08-31|1994-09-07|1994-09-22|NONE|TRUCK|c grouches. slyly express pinto +2211|782|15|7|3|5048.34|0.06|0.05|R|F|1994-09-21|1994-08-10|1994-10-19|TAKE BACK RETURN|RAIL|y slyly final +2212|709|74|1|18|28974.60|0.07|0.06|R|F|1994-06-22|1994-06-18|1994-06-25|TAKE BACK RETURN|FOB| cajole. final, pending ideas should are bl +2213|1172|81|1|20|21463.40|0.01|0.00|A|F|1993-01-21|1993-04-14|1993-01-29|COLLECT COD|REG AIR|iously express accounts; +2213|597|98|2|4|5990.36|0.09|0.05|R|F|1993-04-15|1993-04-15|1993-05-05|COLLECT COD|SHIP| affix carefully furiously +2213|696|90|3|1|1596.69|0.05|0.05|A|F|1993-04-25|1993-04-06|1993-04-28|TAKE BACK RETURN|AIR|s along the ironic reques +2213|1733|18|4|39|63754.47|0.09|0.05|A|F|1993-05-12|1993-04-07|1993-05-23|TAKE BACK RETURN|SHIP|the blithely +2213|380|37|5|43|55056.34|0.04|0.03|A|F|1993-04-18|1993-03-11|1993-05-11|TAKE BACK RETURN|RAIL|r packages are along the carefully bol +2213|477|7|6|41|56476.27|0.01|0.00|R|F|1993-01-31|1993-03-31|1993-02-28|COLLECT COD|FOB| carefully pend +2213|639|33|7|3|4618.89|0.02|0.04|A|F|1993-03-09|1993-03-17|1993-04-07|TAKE BACK RETURN|AIR|o wake. ironic platel +2214|757|22|1|27|44759.25|0.04|0.04|N|O|1998-05-31|1998-06-07|1998-06-19|DELIVER IN PERSON|REG AIR|x fluffily along the even packages-- +2214|1940|41|2|50|92097.00|0.00|0.02|N|O|1998-07-06|1998-06-16|1998-07-16|TAKE BACK RETURN|MAIL|accounts. blith +2214|1125|62|3|42|43097.04|0.04|0.08|N|O|1998-05-26|1998-07-13|1998-06-22|COLLECT COD|FOB|ons. deposi +2214|1954|43|4|22|40830.90|0.01|0.01|N|O|1998-05-30|1998-07-02|1998-06-09|DELIVER IN PERSON|RAIL|t the blithely +2215|721|18|1|33|53516.76|0.00|0.00|N|O|1996-07-19|1996-08-10|1996-07-30|COLLECT COD|RAIL|dolites cajole b +2215|326|55|2|30|36789.60|0.01|0.00|N|O|1996-08-15|1996-09-10|1996-08-25|NONE|FOB|ckages caj +2215|567|98|3|30|44026.80|0.07|0.03|N|O|1996-09-09|1996-07-20|1996-09-28|COLLECT COD|TRUCK|against the carefu +2215|1452|92|4|20|27069.00|0.02|0.02|N|O|1996-09-09|1996-08-10|1996-09-19|NONE|MAIL| unusual deposits haggle carefully. ide +2240|1639|81|1|6|9243.78|0.01|0.00|A|F|1992-06-23|1992-05-17|1992-07-20|COLLECT COD|AIR|ymptotes boost. furiously bold p +2240|279|61|2|37|43632.99|0.03|0.07|R|F|1992-03-16|1992-05-31|1992-04-05|COLLECT COD|FOB| quickly after the packages? blithely si +2240|522|13|3|39|55478.28|0.08|0.06|A|F|1992-05-22|1992-05-10|1992-06-08|NONE|FOB|y orbits. final depos +2240|859|26|4|10|17598.50|0.09|0.00|A|F|1992-05-25|1992-04-14|1992-06-23|DELIVER IN PERSON|REG AIR|are across the ironic packages. +2240|1606|48|5|29|43720.40|0.02|0.06|A|F|1992-03-29|1992-05-08|1992-04-09|COLLECT COD|MAIL|lyly even ideas w +2240|808|9|6|32|54681.60|0.06|0.06|R|F|1992-04-11|1992-04-18|1992-04-22|NONE|MAIL|ss thinly deposits. blithely bold package +2240|776|41|7|24|40242.48|0.04|0.05|R|F|1992-05-13|1992-04-09|1992-05-14|DELIVER IN PERSON|FOB|ng the silent accounts. slyly ironic t +2241|41|42|1|25|23526.00|0.00|0.08|R|F|1993-08-11|1993-07-23|1993-09-01|DELIVER IN PERSON|MAIL| final deposits use fluffily. even f +2241|1947|36|2|38|70259.72|0.04|0.06|A|F|1993-08-04|1993-07-31|1993-08-06|TAKE BACK RETURN|TRUCK| silent, unusual d +2241|967|36|3|48|89662.08|0.08|0.04|A|F|1993-05-14|1993-07-30|1993-05-26|TAKE BACK RETURN|RAIL|ss accounts engage furiously. slyly even re +2241|1664|47|4|19|29747.54|0.10|0.00|A|F|1993-06-01|1993-08-05|1993-06-07|TAKE BACK RETURN|TRUCK| are furiously quickl +2241|815|16|5|2|3431.62|0.04|0.03|A|F|1993-08-16|1993-08-02|1993-08-24|NONE|REG AIR|, express deposits. pear +2241|1155|28|6|22|23235.30|0.02|0.08|R|F|1993-08-13|1993-06-15|1993-08-16|DELIVER IN PERSON|TRUCK|, ironic depen +2241|1416|17|7|9|11856.69|0.09|0.03|A|F|1993-05-14|1993-07-12|1993-05-29|NONE|AIR|lyly final +2242|1221|22|1|15|16833.30|0.09|0.08|N|O|1997-08-04|1997-09-21|1997-08-11|COLLECT COD|FOB|its. carefully express packages cajole. bli +2243|1270|71|1|10|11712.70|0.04|0.06|N|O|1995-07-26|1995-07-18|1995-08-03|NONE|RAIL|express, daring foxes affix fur +2244|501|62|1|3|4204.50|0.02|0.02|A|F|1993-04-30|1993-03-15|1993-05-19|TAKE BACK RETURN|FOB| beans for the regular platel +2244|1925|14|2|16|29230.72|0.01|0.06|R|F|1993-02-12|1993-03-09|1993-02-28|COLLECT COD|FOB|rate around the reques +2245|757|58|1|44|72941.00|0.03|0.03|A|F|1993-06-12|1993-06-10|1993-06-16|NONE|TRUCK|refully even sheaves +2245|737|2|2|28|45856.44|0.05|0.03|R|F|1993-08-19|1993-07-27|1993-09-04|COLLECT COD|TRUCK|e requests sleep furiou +2245|854|88|3|33|57910.05|0.03|0.01|R|F|1993-06-26|1993-06-11|1993-07-17|TAKE BACK RETURN|AIR|ing to the carefully ruthless accounts +2245|1885|86|4|14|25016.32|0.02|0.04|R|F|1993-05-06|1993-07-21|1993-05-19|DELIVER IN PERSON|RAIL|nts. always unusual dep +2245|793|90|5|33|55895.07|0.03|0.07|R|F|1993-06-16|1993-06-05|1993-07-07|NONE|MAIL| across the express reques +2246|524|25|1|22|31339.44|0.02|0.01|N|O|1996-07-25|1996-08-03|1996-08-24|DELIVER IN PERSON|SHIP|ructions wake carefully fina +2246|1031|32|2|43|40077.29|0.07|0.06|N|O|1996-08-25|1996-08-23|1996-09-19|DELIVER IN PERSON|AIR|ainst the ironic theodolites haggle fi +2246|172|51|3|11|11793.87|0.10|0.00|N|O|1996-06-21|1996-07-24|1996-07-18|TAKE BACK RETURN|TRUCK|quests alongside o +2246|1628|52|4|13|19885.06|0.08|0.05|N|O|1996-09-15|1996-07-21|1996-10-08|DELIVER IN PERSON|AIR|equests. fluffily special epitaphs use +2247|1720|63|1|12|19460.64|0.02|0.07|A|F|1992-09-06|1992-09-18|1992-09-26|NONE|MAIL|final accounts. requests across the furiou +2272|900|1|1|18|32416.20|0.04|0.00|R|F|1993-08-01|1993-07-06|1993-08-25|NONE|MAIL|ons along the blithely e +2272|335|20|2|40|49413.20|0.07|0.00|A|F|1993-04-25|1993-07-12|1993-05-15|DELIVER IN PERSON|FOB|lithely ir +2272|555|86|3|36|52399.80|0.03|0.02|A|F|1993-05-25|1993-05-23|1993-06-09|TAKE BACK RETURN|RAIL|about the ironic packages; quickly iron +2272|1377|16|4|30|38351.10|0.09|0.07|A|F|1993-07-27|1993-05-15|1993-08-13|NONE|RAIL|quests at the foxes haggle evenly pack +2272|759|56|5|12|19917.00|0.03|0.03|A|F|1993-04-19|1993-05-14|1993-04-23|NONE|RAIL| accounts cajole. quickly b +2273|1836|23|1|34|59086.22|0.02|0.03|N|O|1997-01-08|1997-02-02|1997-01-23|COLLECT COD|MAIL| furiously carefully bold de +2273|847|14|2|35|61174.40|0.00|0.05|N|O|1997-01-02|1997-01-19|1997-01-14|NONE|REG AIR|arefully f +2273|942|11|3|8|14743.52|0.00|0.04|N|O|1996-12-15|1997-02-27|1997-01-10|NONE|FOB|dependencies. slyly ir +2273|1609|33|4|20|30212.00|0.06|0.04|N|O|1997-03-05|1997-02-25|1997-04-01|NONE|RAIL|cuses. quickly enticing requests wake +2273|1611|35|5|18|27226.98|0.07|0.00|N|O|1996-12-16|1997-01-21|1997-01-03|COLLECT COD|TRUCK| beans. doggedly final packages wake +2273|1544|65|6|16|23128.64|0.10|0.03|N|O|1997-01-10|1997-02-03|1997-02-01|TAKE BACK RETURN|RAIL|furiously above the ironic requests. +2273|195|96|7|7|7666.33|0.05|0.05|N|O|1997-02-19|1997-01-22|1997-02-21|TAKE BACK RETURN|TRUCK|ts. furiou +2274|111|38|1|18|18199.98|0.04|0.03|R|F|1993-09-06|1993-12-03|1993-09-22|COLLECT COD|SHIP|usly final re +2274|1106|79|2|23|23163.30|0.04|0.03|R|F|1993-10-28|1993-11-03|1993-11-05|NONE|MAIL|kly special warhorse +2274|1288|89|3|18|21407.04|0.03|0.06|R|F|1993-09-28|1993-11-22|1993-10-12|DELIVER IN PERSON|SHIP| express packages. even accounts hagg +2275|332|89|1|30|36969.90|0.08|0.05|R|F|1993-01-10|1992-11-21|1993-01-22|NONE|REG AIR|re slyly slyly special idea +2275|904|73|2|11|19853.90|0.08|0.03|A|F|1993-01-16|1992-12-10|1993-01-25|COLLECT COD|REG AIR|ost across the never express instruction +2276|1182|91|1|5|5415.90|0.07|0.08|N|O|1996-05-09|1996-06-18|1996-05-13|DELIVER IN PERSON|FOB|ias instea +2276|1349|64|2|13|16254.42|0.08|0.04|N|O|1996-07-24|1996-06-18|1996-08-16|COLLECT COD|RAIL|arefully ironic foxes cajole q +2276|1710|11|3|27|43516.17|0.07|0.08|N|O|1996-07-30|1996-06-10|1996-07-31|DELIVER IN PERSON|RAIL|the carefully unusual accoun +2276|1081|87|4|38|37319.04|0.06|0.03|N|O|1996-07-07|1996-06-28|1996-07-17|COLLECT COD|RAIL|ans. pinto beans boost c +2276|1525|46|5|50|71326.00|0.03|0.05|N|O|1996-07-13|1996-06-25|1996-07-22|DELIVER IN PERSON|REG AIR| accounts dete +2276|51|77|6|4|3804.20|0.10|0.03|N|O|1996-07-05|1996-06-30|1996-08-04|COLLECT COD|FOB|s. deposits +2277|1369|70|1|38|48273.68|0.03|0.07|R|F|1995-04-23|1995-03-25|1995-05-20|TAKE BACK RETURN|TRUCK|fully bold +2277|80|6|2|2|1960.16|0.10|0.08|A|F|1995-02-01|1995-02-04|1995-03-02|TAKE BACK RETURN|AIR|endencies sleep idly pending p +2277|1979|24|3|4|7523.88|0.05|0.06|R|F|1995-04-27|1995-03-16|1995-04-29|TAKE BACK RETURN|SHIP|. quickly unusual deposi +2277|1585|66|4|31|46083.98|0.02|0.00|R|F|1995-03-07|1995-03-19|1995-03-26|TAKE BACK RETURN|MAIL|ic instructions detect ru +2278|443|73|1|36|48363.84|0.04|0.05|N|O|1998-06-04|1998-06-06|1998-06-30|NONE|TRUCK|y ironic pinto beans br +2278|449|79|2|50|67472.00|0.02|0.00|N|O|1998-08-09|1998-07-08|1998-09-05|DELIVER IN PERSON|RAIL|into beans. blit +2278|964|99|3|22|41029.12|0.03|0.00|N|O|1998-05-15|1998-07-14|1998-06-04|TAKE BACK RETURN|REG AIR|ep regular accounts. blithely even +2279|137|38|1|12|12445.56|0.07|0.08|A|F|1993-05-10|1993-03-25|1993-06-02|COLLECT COD|REG AIR|lets across the excuses nag quickl +2279|410|11|2|38|49795.58|0.08|0.07|R|F|1993-06-09|1993-04-06|1993-06-26|COLLECT COD|TRUCK|s above the furiously express dep +2279|35|61|3|3|2805.09|0.09|0.04|A|F|1993-05-31|1993-05-07|1993-06-05|COLLECT COD|REG AIR|ing foxes above the even accounts use slyly +2279|512|3|4|42|59325.42|0.02|0.00|R|F|1993-02-28|1993-04-25|1993-03-02|TAKE BACK RETURN|REG AIR| above the furiously ironic deposits. +2279|1689|31|5|9|14316.12|0.05|0.04|R|F|1993-05-21|1993-03-29|1993-06-17|DELIVER IN PERSON|MAIL|ns cajole after the final platelets. s +2279|1462|41|6|12|16361.52|0.02|0.00|R|F|1993-05-04|1993-04-26|1993-05-28|DELIVER IN PERSON|FOB|ccounts. slyl +2279|1190|99|7|32|34918.08|0.05|0.05|A|F|1993-04-20|1993-05-22|1993-05-18|DELIVER IN PERSON|RAIL|re quickly. furiously ironic ide +2304|1995|40|1|42|79673.58|0.00|0.01|A|F|1994-01-20|1994-03-04|1994-02-05|COLLECT COD|RAIL|quests are blithely alongside of +2304|182|61|2|48|51944.64|0.00|0.00|R|F|1994-02-12|1994-02-16|1994-03-10|COLLECT COD|REG AIR| deposits cajole blithely e +2304|480|81|3|3|4141.44|0.00|0.05|R|F|1994-03-19|1994-03-04|1994-03-20|DELIVER IN PERSON|AIR|l excuses after the ev +2305|1740|83|1|3|4925.22|0.00|0.01|A|F|1993-03-24|1993-04-05|1993-03-29|NONE|AIR|kages haggle quickly across the blithely +2305|591|22|2|39|58172.01|0.07|0.00|R|F|1993-04-16|1993-04-17|1993-04-22|COLLECT COD|MAIL|ms after the foxes +2305|1011|12|3|32|29184.32|0.03|0.06|A|F|1993-04-02|1993-03-18|1993-04-03|NONE|AIR| haggle caref +2305|1115|16|4|17|17273.87|0.00|0.05|A|F|1993-02-21|1993-03-30|1993-03-19|TAKE BACK RETURN|MAIL| carefully alongside of +2305|1544|65|5|26|37584.04|0.06|0.07|A|F|1993-05-14|1993-02-28|1993-06-04|NONE|SHIP|arefully final theodo +2305|510|1|6|7|9873.57|0.06|0.00|R|F|1993-05-15|1993-04-25|1993-06-09|DELIVER IN PERSON|RAIL|gular deposits boost about the foxe +2306|1958|47|1|50|92997.50|0.09|0.01|N|O|1995-07-27|1995-09-26|1995-08-06|DELIVER IN PERSON|FOB|y quickly +2306|1486|65|2|39|54111.72|0.04|0.00|N|O|1995-09-07|1995-09-13|1995-10-03|COLLECT COD|SHIP|f the slyly unusual accounts. furiousl +2306|1777|4|3|35|58756.95|0.01|0.07|N|O|1995-08-18|1995-08-30|1995-08-20|TAKE BACK RETURN|RAIL|raids along the furiously unusual asympto +2306|1190|27|4|21|22914.99|0.06|0.01|N|O|1995-10-07|1995-09-18|1995-10-17|COLLECT COD|MAIL| ironic pinto +2306|1418|58|5|42|55415.22|0.04|0.07|N|O|1995-09-05|1995-08-25|1995-09-28|COLLECT COD|MAIL|furiously final acco +2306|1236|37|6|29|32979.67|0.00|0.03|N|O|1995-11-01|1995-09-01|1995-11-22|DELIVER IN PERSON|REG AIR|uld have to mold. s +2306|1754|81|7|19|31459.25|0.07|0.01|N|O|1995-11-17|1995-09-06|1995-11-30|DELIVER IN PERSON|AIR|tainments nag furiously carefull +2307|1414|54|1|24|31569.84|0.10|0.05|R|F|1993-10-07|1993-08-05|1993-10-20|COLLECT COD|AIR|stealthily special packages nag a +2307|1396|35|2|2|2594.78|0.01|0.00|A|F|1993-09-21|1993-08-22|1993-10-03|COLLECT COD|SHIP|ously. furiously furious requ +2307|334|63|3|7|8640.31|0.07|0.04|R|F|1993-08-03|1993-09-04|1993-08-28|DELIVER IN PERSON|AIR|ven instructions wake fluffily +2307|1644|45|4|19|29367.16|0.08|0.06|R|F|1993-10-23|1993-09-09|1993-11-09|TAKE BACK RETURN|TRUCK|olites haggle furiously around the +2307|1427|28|5|7|9298.94|0.01|0.06|R|F|1993-09-01|1993-08-08|1993-09-29|NONE|AIR| packages cajo +2308|1176|77|1|24|25852.08|0.06|0.04|R|F|1993-02-23|1992-12-24|1993-03-10|NONE|MAIL|ts sleep. busy excuses along the s +2308|557|18|2|36|52471.80|0.05|0.06|A|F|1992-11-11|1992-11-27|1992-11-23|NONE|MAIL|ong the pending hockey players. blithe +2309|1699|82|1|14|22409.66|0.10|0.03|N|O|1996-01-01|1995-10-22|1996-01-23|NONE|AIR|asymptotes. furiously pending acco +2309|1683|25|2|1|1584.68|0.01|0.05|N|O|1995-12-08|1995-11-03|1995-12-31|COLLECT COD|RAIL|eposits alongside of the final re +2309|148|1|3|5|5240.70|0.01|0.00|N|O|1995-12-10|1995-10-29|1996-01-06|TAKE BACK RETURN|SHIP|s. requests wake blithely specia +2309|1381|58|4|46|58989.48|0.08|0.04|N|O|1995-10-02|1995-10-30|1995-10-30|NONE|REG AIR|sly according to the carefully +2309|1363|78|5|9|11379.24|0.00|0.07|N|O|1995-12-21|1995-10-10|1996-01-20|COLLECT COD|AIR|ding, unusual instructions. dep +2309|1949|38|6|21|38869.74|0.09|0.00|N|O|1995-11-05|1995-11-07|1995-11-22|NONE|AIR|unts around the dolphins ar +2309|1378|17|7|48|61409.76|0.03|0.05|N|O|1995-10-21|1995-11-21|1995-11-09|NONE|MAIL|ccounts. id +2310|579|10|1|36|53264.52|0.03|0.03|N|O|1996-10-09|1996-10-28|1996-10-29|TAKE BACK RETURN|RAIL|iously against the slyly special accounts +2310|1705|6|2|6|9640.20|0.07|0.01|N|O|1996-11-08|1996-12-09|1996-12-07|COLLECT COD|REG AIR|e slyly about the quickly ironic theodo +2310|411|99|3|48|62947.68|0.08|0.02|N|O|1996-10-04|1996-11-20|1996-10-25|TAKE BACK RETURN|FOB|ep slyly alongside of the +2311|1401|41|1|18|23443.20|0.01|0.01|N|F|1995-06-11|1995-06-18|1995-07-02|NONE|FOB| fluffily even patterns haggle blithely. re +2311|1216|91|2|49|54743.29|0.09|0.02|R|F|1995-05-14|1995-07-11|1995-05-20|COLLECT COD|FOB|ideas sleep +2311|538|39|3|15|21577.95|0.08|0.04|N|O|1995-06-23|1995-06-06|1995-07-09|COLLECT COD|AIR|ve the blithely pending accounts. furio +2311|898|65|4|42|75553.38|0.01|0.06|R|F|1995-06-03|1995-06-27|1995-06-11|DELIVER IN PERSON|MAIL|gle furiously. bold +2311|465|24|5|1|1365.46|0.05|0.02|A|F|1995-06-07|1995-06-20|1995-06-10|NONE|AIR|ptotes. furiously regular theodolite +2311|120|73|6|32|32643.84|0.01|0.03|N|O|1995-07-19|1995-06-26|1995-07-26|NONE|RAIL|sts along the slyly +2336|1922|67|1|20|36478.40|0.01|0.03|N|O|1996-03-12|1996-02-25|1996-03-18|NONE|REG AIR|across the fi +2337|448|78|1|49|66073.56|0.06|0.05|N|O|1997-08-08|1997-08-15|1997-08-31|TAKE BACK RETURN|FOB| along the packages. furiously p +2338|511|72|1|30|42345.30|0.07|0.06|N|O|1997-12-10|1997-10-15|1997-12-11|TAKE BACK RETURN|REG AIR|ould have to nag quickly +2339|1916|17|1|22|39994.02|0.03|0.03|A|F|1994-01-06|1994-03-06|1994-01-10|NONE|FOB| furiously above +2339|298|26|2|28|33552.12|0.00|0.00|R|F|1994-01-25|1994-01-22|1994-01-28|DELIVER IN PERSON|RAIL|e bold, even packag +2339|1168|41|3|13|13899.08|0.06|0.08|R|F|1994-03-10|1994-02-18|1994-03-20|TAKE BACK RETURN|REG AIR|ges. blithely special depend +2340|1378|93|1|9|11514.33|0.08|0.02|N|O|1996-05-01|1996-02-24|1996-05-16|COLLECT COD|RAIL|. carefully ironic +2340|1930|75|2|21|38470.53|0.06|0.02|N|O|1996-01-17|1996-03-04|1996-01-29|DELIVER IN PERSON|SHIP| asymptotes. unusual theo +2341|461|20|1|12|16337.52|0.08|0.03|R|F|1993-06-06|1993-07-08|1993-06-17|DELIVER IN PERSON|FOB|. quickly final deposits sl +2341|704|69|2|37|59373.90|0.07|0.08|A|F|1993-09-23|1993-07-25|1993-10-14|DELIVER IN PERSON|RAIL|was blithel +2341|1946|35|3|8|14783.52|0.03|0.07|R|F|1993-06-08|1993-07-09|1993-06-10|COLLECT COD|FOB|ns affix above the iron +2342|412|100|1|12|15748.92|0.00|0.08|N|O|1996-07-31|1996-07-26|1996-08-14|NONE|TRUCK|print blithely even deposits. carefull +2342|1165|2|2|24|25587.84|0.10|0.06|N|O|1996-09-30|1996-07-22|1996-10-28|TAKE BACK RETURN|AIR|nstructions c +2342|1700|1|3|50|80085.00|0.10|0.01|N|O|1996-08-28|1996-07-18|1996-09-22|COLLECT COD|RAIL|cial asymptotes pr +2342|359|60|4|1|1259.35|0.04|0.06|N|O|1996-08-31|1996-08-09|1996-09-07|DELIVER IN PERSON|REG AIR|ffily. unusual pinto beans wake c +2342|268|96|5|22|25701.72|0.08|0.01|N|O|1996-08-10|1996-08-02|1996-08-31|DELIVER IN PERSON|AIR|s. ironic +2343|1099|100|1|27|27002.43|0.00|0.00|N|O|1995-11-10|1995-11-17|1995-12-10|TAKE BACK RETURN|SHIP|old theodolites. +2343|656|50|2|35|54482.75|0.03|0.06|N|O|1995-10-24|1995-11-09|1995-10-26|COLLECT COD|TRUCK|ges haggle furiously carefully regular req +2343|1788|15|3|21|35485.38|0.00|0.03|N|O|1995-09-07|1995-10-26|1995-10-07|TAKE BACK RETURN|RAIL|osits. unusual theodolites boost furio +2368|1520|21|1|16|22744.32|0.04|0.03|R|F|1993-10-31|1993-10-22|1993-11-06|NONE|REG AIR|telets wake carefully iro +2368|131|32|2|32|32996.16|0.03|0.00|R|F|1993-09-23|1993-10-07|1993-09-27|COLLECT COD|TRUCK|gular courts use blithely around the +2368|1489|29|3|39|54228.72|0.08|0.03|R|F|1993-09-03|1993-09-20|1993-09-28|COLLECT COD|RAIL|ng the doggedly ironic requests are blithe +2368|1559|80|4|17|24829.35|0.10|0.08|A|F|1993-10-03|1993-09-27|1993-10-05|NONE|FOB|fily. slyly final ideas alongside o +2369|239|21|1|30|34176.90|0.05|0.04|N|O|1997-04-23|1997-02-12|1997-05-21|COLLECT COD|REG AIR|pecial deposits sleep. blithely unusual w +2369|1685|86|2|47|74573.96|0.10|0.02|N|O|1997-01-02|1997-02-18|1997-01-13|COLLECT COD|RAIL| to the regular dep +2370|451|81|1|3|4054.35|0.03|0.07|R|F|1994-03-24|1994-03-26|1994-04-15|COLLECT COD|SHIP|ly regular Tiresia +2370|11|37|2|24|21864.24|0.00|0.05|A|F|1994-05-15|1994-04-09|1994-06-12|NONE|REG AIR|final depen +2370|609|10|3|32|48307.20|0.05|0.02|A|F|1994-04-24|1994-03-03|1994-05-15|DELIVER IN PERSON|MAIL|ies since the final deposits +2370|51|27|4|21|19972.05|0.04|0.01|R|F|1994-02-01|1994-02-19|1994-02-09|TAKE BACK RETURN|MAIL|ecial dependencies must have to +2371|1587|68|1|37|55077.46|0.05|0.05|N|O|1998-02-11|1998-03-24|1998-02-27|DELIVER IN PERSON|TRUCK|s boost fluffil +2371|342|71|2|21|26089.14|0.00|0.05|N|O|1998-04-14|1998-02-14|1998-04-18|COLLECT COD|AIR|gle furiously regu +2371|1006|42|3|11|9977.00|0.05|0.02|N|O|1998-02-25|1998-04-06|1998-03-23|TAKE BACK RETURN|TRUCK|requests. regular pinto beans wake. car +2371|421|80|4|33|43606.86|0.05|0.08|N|O|1998-03-30|1998-02-06|1998-04-05|DELIVER IN PERSON|AIR|deas are. express r +2371|1646|29|5|22|34048.08|0.02|0.05|N|O|1998-03-26|1998-03-19|1998-04-16|DELIVER IN PERSON|REG AIR|y daring accounts. regular ins +2371|851|52|6|39|68322.15|0.05|0.03|N|O|1998-04-01|1998-03-13|1998-04-27|NONE|REG AIR|tructions. regular, stealthy packages wak +2371|358|87|7|32|40267.20|0.07|0.07|N|O|1998-02-15|1998-04-03|1998-02-23|NONE|REG AIR|the ruthless accounts. +2372|427|28|1|42|55751.64|0.08|0.02|N|O|1998-01-04|1998-01-02|1998-02-02|COLLECT COD|REG AIR|lar packages. regular +2372|24|100|2|17|15708.34|0.07|0.01|N|O|1997-12-17|1998-01-17|1997-12-25|NONE|RAIL|xcuses. slyly ironic theod +2372|1634|17|3|12|18427.56|0.04|0.04|N|O|1998-03-21|1997-12-21|1998-04-12|DELIVER IN PERSON|SHIP|lyly according to +2372|1217|92|4|4|4472.84|0.00|0.07|N|O|1997-12-14|1997-12-28|1997-12-16|TAKE BACK RETURN|REG AIR|e carefully blithely even epitaphs. r +2372|195|48|5|5|5475.95|0.02|0.04|N|O|1998-02-08|1998-01-18|1998-03-02|TAKE BACK RETURN|RAIL|ets against the +2372|1885|15|6|11|19655.68|0.02|0.06|N|O|1998-02-14|1998-01-18|1998-03-10|TAKE BACK RETURN|FOB| silent, pending de +2372|561|62|7|19|27769.64|0.01|0.06|N|O|1997-12-26|1998-02-19|1998-01-02|COLLECT COD|SHIP| beans haggle sometimes +2373|1901|34|1|17|30649.30|0.02|0.01|R|F|1994-03-29|1994-05-19|1994-04-20|COLLECT COD|AIR|auternes. blithely even pinto bea +2373|1353|68|2|3|3763.05|0.08|0.08|R|F|1994-05-15|1994-06-10|1994-06-04|COLLECT COD|TRUCK|dependencies wake ironical +2373|1409|49|3|29|38001.60|0.05|0.02|A|F|1994-06-01|1994-05-14|1994-06-17|NONE|TRUCK|yly silent ideas affix furiousl +2373|907|10|4|5|9039.50|0.10|0.01|R|F|1994-06-02|1994-05-03|1994-06-21|NONE|REG AIR|uffily blithely ironic requests +2374|1172|9|1|41|43999.97|0.07|0.00|A|F|1994-01-27|1993-12-11|1994-02-12|TAKE BACK RETURN|RAIL|heodolites. requests +2374|1598|19|2|24|35990.16|0.07|0.08|A|F|1994-02-02|1994-01-12|1994-02-04|DELIVER IN PERSON|TRUCK|. requests are above t +2374|607|70|3|2|3015.20|0.06|0.02|R|F|1993-12-30|1994-01-24|1994-01-02|COLLECT COD|FOB|, unusual ideas. deposits cajole quietl +2374|740|41|4|28|45940.72|0.04|0.08|R|F|1994-02-19|1993-12-16|1994-03-15|COLLECT COD|MAIL|ets cajole fu +2374|4|5|5|25|22600.00|0.08|0.00|A|F|1993-11-26|1993-12-15|1993-12-10|COLLECT COD|RAIL|refully pending d +2375|1673|74|1|3|4724.01|0.02|0.08|N|O|1997-02-14|1996-12-25|1997-02-22|COLLECT COD|RAIL|slyly across the furiously e +2375|1313|52|2|9|10928.79|0.09|0.02|N|O|1997-02-17|1996-12-27|1997-02-27|DELIVER IN PERSON|MAIL|ly against the packages. bold pinto bean +2375|465|95|3|26|35501.96|0.02|0.06|N|O|1997-03-18|1997-02-02|1997-03-29|TAKE BACK RETURN|TRUCK|rate across the +2375|49|75|4|5|4745.20|0.01|0.00|N|O|1997-01-31|1997-01-25|1997-02-22|COLLECT COD|REG AIR|final packages cajole according to the furi +2375|873|73|5|42|74502.54|0.01|0.08|N|O|1997-01-24|1997-02-15|1997-02-07|DELIVER IN PERSON|FOB|apades. idea +2375|1256|57|6|20|23145.00|0.09|0.08|N|O|1996-12-01|1996-12-26|1996-12-19|TAKE BACK RETURN|SHIP|ckages! blithely enticing deposi +2400|1026|62|1|48|44496.96|0.01|0.02|N|O|1998-10-07|1998-08-30|1998-11-03|DELIVER IN PERSON|MAIL|fore the car +2400|900|34|2|1|1800.90|0.04|0.07|N|O|1998-08-18|1998-09-12|1998-09-11|NONE|MAIL|silent deposits serve furious +2400|526|17|3|23|32809.96|0.02|0.08|N|O|1998-08-05|1998-08-28|1998-08-30|NONE|SHIP|tions. fluffily ironic platelets cajole c +2400|169|48|4|23|24590.68|0.09|0.04|N|O|1998-10-04|1998-10-04|1998-10-31|NONE|RAIL|ages lose carefully around the regula +2401|1817|61|1|39|67033.59|0.00|0.03|N|O|1997-09-29|1997-10-21|1997-10-17|DELIVER IN PERSON|FOB|ould affix +2401|23|74|2|49|45227.98|0.05|0.07|N|O|1997-09-02|1997-09-11|1997-09-13|TAKE BACK RETURN|AIR|lites cajole carefully +2402|856|90|1|43|75544.55|0.03|0.08|N|O|1996-09-17|1996-11-20|1996-09-22|DELIVER IN PERSON|RAIL|slyly slyly blithe sheaves +2402|1514|35|2|24|33972.24|0.02|0.05|N|O|1996-11-21|1996-10-19|1996-11-29|DELIVER IN PERSON|SHIP|as; blithely ironic requ +2403|829|29|1|34|58813.88|0.04|0.07|N|O|1998-05-30|1998-06-19|1998-06-05|NONE|REG AIR| slyly bold re +2403|1520|41|2|19|27008.88|0.08|0.07|N|O|1998-04-20|1998-07-02|1998-05-13|DELIVER IN PERSON|FOB|sits. ironic in +2403|1925|26|3|27|49326.84|0.05|0.03|N|O|1998-07-27|1998-07-08|1998-08-03|NONE|SHIP|deposits sleep slyly special theodolit +2403|305|6|4|30|36159.00|0.05|0.06|N|O|1998-08-08|1998-06-17|1998-08-20|NONE|TRUCK|ackages sleep furiously pendin +2404|1468|47|1|36|49300.56|0.07|0.00|N|O|1997-03-27|1997-05-16|1997-04-06|COLLECT COD|REG AIR|s nag furi +2404|357|86|2|1|1257.35|0.02|0.04|N|O|1997-05-22|1997-06-06|1997-05-28|DELIVER IN PERSON|MAIL|from the final orbits? even pinto beans hag +2404|174|27|3|41|44040.97|0.02|0.06|N|O|1997-06-12|1997-05-03|1997-07-12|NONE|AIR| dolphins are +2404|567|68|4|19|27883.64|0.09|0.03|N|O|1997-05-07|1997-05-24|1997-05-24|TAKE BACK RETURN|SHIP|cuses. quickly even in +2404|31|82|5|18|16758.54|0.00|0.04|N|O|1997-06-25|1997-05-06|1997-07-02|NONE|RAIL|packages. even requests according to +2405|886|53|1|18|32163.84|0.09|0.07|N|O|1997-01-23|1997-03-10|1997-02-03|COLLECT COD|REG AIR|carefully ironic accounts. slyly +2405|262|44|2|30|34867.80|0.10|0.08|N|O|1997-03-24|1997-03-10|1997-04-14|TAKE BACK RETURN|AIR|y final deposits are slyly caref +2405|162|63|3|49|52045.84|0.00|0.06|N|O|1996-12-24|1997-03-23|1997-01-01|TAKE BACK RETURN|FOB|cial requests. ironic, regu +2405|1768|11|4|23|38404.48|0.08|0.05|N|O|1996-12-28|1997-01-29|1997-01-07|NONE|AIR|t wake blithely blithely regular idea +2406|1691|15|1|18|28668.42|0.07|0.05|N|O|1997-02-17|1996-12-25|1997-02-19|COLLECT COD|MAIL|azzle furiously careful +2406|405|35|2|40|52216.00|0.02|0.07|N|O|1997-01-09|1996-12-02|1997-01-16|NONE|SHIP|gular accounts caj +2406|491|92|3|16|22263.84|0.07|0.03|N|O|1996-10-31|1996-11-28|1996-11-08|TAKE BACK RETURN|SHIP| special accou +2406|1451|30|4|34|45983.30|0.07|0.06|N|O|1996-12-01|1996-12-07|1996-12-16|NONE|AIR|hinly even accounts are slyly q +2406|1870|14|5|25|44296.75|0.08|0.02|N|O|1996-12-03|1996-12-14|1996-12-26|COLLECT COD|MAIL|al, regular in +2406|583|44|6|22|32638.76|0.05|0.02|N|O|1996-11-22|1997-01-17|1996-12-15|NONE|TRUCK|hely even foxes unwind furiously aga +2406|595|86|7|30|44867.70|0.07|0.07|N|O|1997-01-17|1997-01-12|1997-01-22|TAKE BACK RETURN|TRUCK| final pinto beans han +2407|631|63|1|14|21442.82|0.04|0.02|N|O|1998-10-10|1998-08-25|1998-10-27|NONE|FOB|l dependencies s +2407|1652|53|2|9|13982.85|0.07|0.05|N|O|1998-08-06|1998-08-11|1998-08-20|TAKE BACK RETURN|TRUCK|ts. special deposits are closely. +2407|1303|4|3|39|46967.70|0.02|0.02|N|O|1998-08-20|1998-09-12|1998-08-22|DELIVER IN PERSON|MAIL|iously final deposits solv +2407|905|74|4|10|18059.00|0.01|0.07|N|O|1998-08-14|1998-09-10|1998-08-29|COLLECT COD|FOB| pending instructions. theodolites x- +2407|1976|65|5|14|26291.58|0.04|0.05|N|O|1998-09-24|1998-08-18|1998-10-06|DELIVER IN PERSON|FOB|tructions wake stealt +2407|703|100|6|18|28866.60|0.04|0.01|N|O|1998-10-03|1998-08-30|1998-10-19|TAKE BACK RETURN|MAIL| wake carefully. fluffily +2407|1609|92|7|7|10574.20|0.07|0.03|N|O|1998-09-11|1998-08-15|1998-09-30|TAKE BACK RETURN|MAIL|totes are carefully accordin +2432|494|53|1|30|41834.70|0.03|0.02|N|O|1996-09-05|1996-10-10|1996-10-05|TAKE BACK RETURN|TRUCK| requests wake alongside of +2432|1618|19|2|8|12156.88|0.07|0.01|N|O|1996-10-16|1996-10-01|1996-11-13|COLLECT COD|RAIL|s about the bold, close deposit +2432|1089|25|3|13|12871.04|0.07|0.06|N|O|1996-09-03|1996-10-10|1996-10-03|NONE|RAIL|arefully about the caref +2432|125|26|4|14|14351.68|0.00|0.06|N|O|1996-08-18|1996-09-04|1996-08-27|TAKE BACK RETURN|RAIL|riously regular packages. p +2433|868|69|1|39|68985.54|0.01|0.04|R|F|1994-11-20|1994-09-23|1994-12-10|DELIVER IN PERSON|SHIP|ly final asy +2433|1334|11|2|20|24706.60|0.05|0.06|A|F|1994-12-09|1994-10-20|1994-12-15|COLLECT COD|REG AIR|lithely blithely final ide +2433|1564|45|3|38|55691.28|0.08|0.03|A|F|1994-10-15|1994-10-23|1994-11-06|DELIVER IN PERSON|SHIP|. slyly regular requests sle +2433|1203|41|4|43|47480.60|0.01|0.05|A|F|1994-10-16|1994-10-23|1994-11-08|DELIVER IN PERSON|RAIL|ular requests. slyly even pa +2433|1072|8|5|3|2919.21|0.06|0.02|A|F|1994-11-08|1994-09-24|1994-11-17|COLLECT COD|AIR|usly pending depos +2434|945|46|1|1|1845.94|0.01|0.06|N|O|1997-08-02|1997-05-28|1997-08-19|TAKE BACK RETURN|MAIL| furiously express packages. ironic, pend +2434|1268|80|2|39|45601.14|0.09|0.05|N|O|1997-06-10|1997-06-08|1997-07-03|COLLECT COD|RAIL|r deposits sleep furiou +2434|1295|7|3|28|33496.12|0.02|0.05|N|O|1997-06-28|1997-06-26|1997-07-15|COLLECT COD|RAIL|ven theodolites around the slyly +2434|1672|73|4|49|77109.83|0.00|0.05|N|O|1997-08-08|1997-07-23|1997-08-27|DELIVER IN PERSON|FOB| after the requests haggle bold, fina +2435|389|90|1|8|10315.04|0.08|0.03|A|F|1993-06-08|1993-04-04|1993-06-29|COLLECT COD|SHIP|e fluffily quickly final accounts. care +2435|484|43|2|43|59532.64|0.03|0.08|A|F|1993-03-27|1993-05-20|1993-04-18|DELIVER IN PERSON|TRUCK|alongside of the s +2435|115|68|3|24|24362.64|0.07|0.08|R|F|1993-03-14|1993-05-20|1993-03-26|DELIVER IN PERSON|SHIP|s. carefully regular d +2435|1559|100|4|22|32132.10|0.02|0.05|R|F|1993-05-23|1993-04-14|1993-06-04|NONE|SHIP|e final, final deposits. carefully regular +2435|717|50|5|3|4853.13|0.07|0.07|R|F|1993-06-01|1993-03-25|1993-06-27|DELIVER IN PERSON|FOB| final accounts ar +2435|456|15|6|17|23059.65|0.02|0.02|A|F|1993-06-05|1993-05-05|1993-06-14|NONE|TRUCK|cajole aft +2435|1207|82|7|8|8865.60|0.07|0.02|R|F|1993-05-03|1993-04-02|1993-05-17|COLLECT COD|SHIP|ng the fluffily special foxes nag +2436|1541|42|1|48|69241.92|0.04|0.02|N|O|1995-10-22|1995-10-22|1995-11-16|DELIVER IN PERSON|FOB|he furiously +2436|1166|75|2|18|19208.88|0.05|0.03|N|O|1995-10-14|1995-11-21|1995-11-12|TAKE BACK RETURN|TRUCK|y ironic accounts. furiously even packa +2436|1637|79|3|6|9231.78|0.06|0.08|N|O|1995-10-25|1995-11-30|1995-11-24|DELIVER IN PERSON|RAIL|odolites. ep +2437|937|72|1|46|84544.78|0.07|0.04|A|F|1993-08-12|1993-06-16|1993-08-29|NONE|RAIL|e of the bold, dogged requests +2437|1894|38|2|26|46693.14|0.00|0.04|A|F|1993-06-25|1993-05-22|1993-07-07|DELIVER IN PERSON|REG AIR|lyly regular accounts. +2437|18|69|3|23|21114.23|0.01|0.00|A|F|1993-08-15|1993-06-28|1993-08-23|TAKE BACK RETURN|SHIP|s deposits. pendi +2437|1158|95|4|12|12709.80|0.03|0.08|A|F|1993-04-27|1993-07-01|1993-05-18|TAKE BACK RETURN|FOB|thely regular deposits. ironic fray +2437|167|46|5|29|30947.64|0.02|0.06|A|F|1993-05-12|1993-06-10|1993-05-25|NONE|FOB|ress dolphins. furiously fin +2437|186|13|6|10|10861.80|0.10|0.06|A|F|1993-05-20|1993-06-23|1993-05-22|TAKE BACK RETURN|MAIL|unts. even, ironic pl +2438|1645|28|1|45|69598.80|0.01|0.00|A|F|1993-10-27|1993-09-24|1993-11-02|COLLECT COD|REG AIR|en theodolites w +2438|128|29|2|31|31871.72|0.08|0.01|R|F|1993-10-16|1993-08-31|1993-11-10|COLLECT COD|REG AIR|t. slyly ironic sh +2438|675|7|3|10|15756.70|0.10|0.00|R|F|1993-08-18|1993-08-28|1993-09-08|NONE|SHIP|engage car +2438|1605|88|4|27|40678.20|0.01|0.02|R|F|1993-07-27|1993-10-01|1993-08-06|TAKE BACK RETURN|FOB|inal accounts. slyly final reques +2438|1658|41|5|28|43670.20|0.07|0.06|R|F|1993-11-05|1993-08-22|1993-11-22|TAKE BACK RETURN|TRUCK|ctions. bli +2438|1485|25|6|23|31889.04|0.09|0.02|R|F|1993-10-06|1993-08-17|1993-10-16|DELIVER IN PERSON|MAIL|ely; blithely special pinto beans breach +2438|1826|13|7|46|79479.72|0.02|0.05|R|F|1993-10-27|1993-08-30|1993-11-14|COLLECT COD|SHIP| ironic requests cajole f +2439|1631|14|1|2|3065.26|0.09|0.03|N|O|1997-04-14|1997-06-11|1997-05-09|COLLECT COD|MAIL|courts boos +2439|1435|36|2|5|6682.15|0.07|0.01|N|O|1997-04-23|1997-04-26|1997-04-28|DELIVER IN PERSON|FOB|ites. furiously +2439|1947|92|3|33|61015.02|0.08|0.05|N|O|1997-06-01|1997-05-15|1997-06-07|TAKE BACK RETURN|FOB|asymptotes wake packages-- furiously +2464|484|72|1|10|13844.80|0.05|0.03|N|O|1998-02-04|1997-12-29|1998-02-16|TAKE BACK RETURN|RAIL|slyly final pinto bean +2464|1005|76|2|20|18120.00|0.01|0.07|N|O|1997-12-26|1998-01-02|1998-01-24|DELIVER IN PERSON|FOB|sts. slyly close ideas shall h +2465|672|35|1|27|42462.09|0.05|0.02|N|O|1995-09-05|1995-09-07|1995-09-17|DELIVER IN PERSON|FOB|posits boost carefully unusual instructio +2465|507|98|2|34|47855.00|0.02|0.05|N|O|1995-10-02|1995-08-04|1995-10-09|COLLECT COD|RAIL|posits wake. regular package +2465|311|68|3|8|9690.48|0.10|0.00|N|O|1995-10-16|1995-08-26|1995-11-07|TAKE BACK RETURN|FOB|s across the express deposits wak +2465|1478|96|4|45|62076.15|0.03|0.01|N|O|1995-09-27|1995-08-25|1995-10-06|NONE|TRUCK|y silent foxes. final pinto beans above +2465|468|98|5|50|68423.00|0.01|0.04|N|O|1995-09-01|1995-09-06|1995-09-18|TAKE BACK RETURN|TRUCK|the pending th +2465|1236|37|6|20|22744.60|0.03|0.03|N|O|1995-08-16|1995-08-13|1995-09-02|COLLECT COD|FOB|uriously? furiously ironic excu +2466|1854|84|1|16|28093.60|0.00|0.02|R|F|1994-04-20|1994-04-20|1994-05-09|COLLECT COD|FOB|to beans sl +2466|1047|83|2|10|9480.40|0.00|0.00|A|F|1994-05-08|1994-04-06|1994-06-05|DELIVER IN PERSON|AIR|sly regular deposits. regular, regula +2466|132|85|3|29|29931.77|0.10|0.07|A|F|1994-06-11|1994-04-27|1994-07-10|DELIVER IN PERSON|FOB|ckages. bold requests nag carefully. +2466|104|57|4|29|29118.90|0.04|0.04|A|F|1994-04-01|1994-04-20|1994-04-23|DELIVER IN PERSON|MAIL|es boost fluffily ab +2466|788|89|5|30|50663.40|0.02|0.01|A|F|1994-04-11|1994-05-02|1994-05-02|DELIVER IN PERSON|REG AIR|. fluffily even pinto beans are idly. f +2466|1727|12|6|19|30945.68|0.10|0.07|R|F|1994-06-12|1994-04-18|1994-07-12|NONE|MAIL|ccounts cajole a +2466|1543|64|7|35|50558.90|0.10|0.00|A|F|1994-06-01|1994-05-27|1994-06-21|COLLECT COD|AIR| packages detect carefully: ironically sl +2467|1329|44|1|7|8612.24|0.00|0.00|N|O|1995-07-28|1995-10-04|1995-08-27|NONE|REG AIR|gular packages cajole +2468|936|5|1|46|84498.78|0.00|0.04|N|O|1997-07-16|1997-08-09|1997-08-07|COLLECT COD|SHIP|unusual theodolites su +2468|206|61|2|43|47566.60|0.00|0.04|N|O|1997-08-17|1997-08-21|1997-08-30|DELIVER IN PERSON|FOB|uriously eve +2468|1942|43|3|44|81133.36|0.00|0.03|N|O|1997-10-01|1997-08-02|1997-10-09|TAKE BACK RETURN|RAIL|egular, silent sheave +2468|817|18|4|5|8589.05|0.08|0.00|N|O|1997-06-28|1997-08-02|1997-07-22|NONE|MAIL| sleep fluffily acc +2468|1584|25|5|18|26740.44|0.07|0.00|N|O|1997-07-25|1997-08-26|1997-08-14|DELIVER IN PERSON|REG AIR|cies. fluffily r +2469|1657|81|1|11|17145.15|0.00|0.04|N|O|1997-02-09|1997-01-26|1997-02-16|NONE|TRUCK|ies wake carefully b +2469|1134|7|2|16|16562.08|0.07|0.06|N|O|1997-02-19|1997-02-04|1997-03-18|NONE|MAIL|ing asymptotes +2469|103|30|3|48|48148.80|0.05|0.06|N|O|1997-01-11|1997-01-03|1997-01-15|TAKE BACK RETURN|AIR|riously even theodolites u +2469|879|79|4|35|62295.45|0.06|0.06|N|O|1997-02-04|1997-02-02|1997-02-17|DELIVER IN PERSON|RAIL|ld packages haggle regular frets. fluffily +2469|1207|19|5|30|33246.00|0.09|0.01|N|O|1996-12-21|1997-01-29|1997-01-02|COLLECT COD|SHIP| accounts. regular theodolites affix fu +2469|1031|32|6|49|45669.47|0.02|0.02|N|O|1997-03-03|1996-12-26|1997-03-13|NONE|AIR| requests are car +2469|1263|75|7|8|9314.08|0.02|0.00|N|O|1997-03-15|1997-01-20|1997-04-13|NONE|TRUCK|s. regular +2470|1095|66|1|12|11953.08|0.06|0.06|N|O|1997-07-12|1997-05-24|1997-07-17|TAKE BACK RETURN|FOB|l accounts. deposits nag daringly. express, +2470|1000|3|2|50|45050.00|0.03|0.03|N|O|1997-06-02|1997-06-01|1997-06-09|COLLECT COD|AIR| packages +2470|640|72|3|10|15406.40|0.05|0.08|N|O|1997-06-20|1997-06-19|1997-06-24|TAKE BACK RETURN|FOB| ironic requests a +2470|1611|12|4|30|45378.30|0.04|0.08|N|O|1997-08-04|1997-07-13|1997-08-14|DELIVER IN PERSON|AIR|s across the furiously fina +2471|839|40|1|37|64373.71|0.05|0.01|N|O|1998-05-28|1998-04-17|1998-06-08|COLLECT COD|TRUCK|ounts mold blithely carefully express depo +2496|1402|42|1|38|49529.20|0.02|0.07|R|F|1994-03-26|1994-04-06|1994-04-23|COLLECT COD|RAIL| bold accounts. furi +2496|227|28|2|39|43961.58|0.03|0.00|R|F|1994-03-23|1994-02-18|1994-04-10|TAKE BACK RETURN|FOB|arefully special dependencies abo +2496|1886|73|3|36|64363.68|0.09|0.04|R|F|1994-03-27|1994-03-15|1994-04-17|TAKE BACK RETURN|SHIP|ully ironic f +2496|233|61|4|30|33996.90|0.04|0.01|A|F|1994-01-27|1994-03-11|1994-01-31|DELIVER IN PERSON|RAIL|ake. ironic foxes cajole quickly. fu +2497|111|90|1|34|34377.74|0.02|0.03|R|F|1992-09-02|1992-10-19|1992-09-12|COLLECT COD|AIR|ronic accounts. p +2497|769|2|2|15|25046.40|0.09|0.02|A|F|1992-12-23|1992-11-20|1993-01-18|DELIVER IN PERSON|SHIP|sly against the +2497|336|93|3|28|34617.24|0.02|0.08|A|F|1992-12-02|1992-11-21|1992-12-04|DELIVER IN PERSON|REG AIR|ouches. special, regular requests +2497|1439|40|4|48|64340.64|0.06|0.05|A|F|1992-09-29|1992-11-13|1992-10-19|TAKE BACK RETURN|AIR| even, regular requests across +2497|1749|92|5|28|46220.72|0.04|0.05|A|F|1992-11-10|1992-09-30|1992-11-18|DELIVER IN PERSON|MAIL|hely bold ideas. unusual instructions ac +2497|706|7|6|19|30527.30|0.05|0.08|A|F|1992-11-10|1992-11-20|1992-12-05|TAKE BACK RETURN|TRUCK| instructions? carefully daring accounts +2498|1423|41|1|48|63572.16|0.10|0.01|R|F|1993-11-25|1994-01-09|1993-12-24|DELIVER IN PERSON|RAIL|onic requests wake +2499|1494|73|1|15|20932.35|0.04|0.06|N|O|1995-12-21|1995-12-06|1996-01-19|DELIVER IN PERSON|FOB| slyly across the slyly +2499|451|81|2|48|64869.60|0.09|0.03|N|O|1995-10-14|1995-12-12|1995-11-11|DELIVER IN PERSON|AIR|ronic ideas cajole quickly requests. caref +2499|1321|60|3|31|37891.92|0.09|0.05|N|O|1995-12-09|1995-10-28|1996-01-05|COLLECT COD|AIR|to beans across the carefully ironic theodo +2499|1585|26|4|39|57976.62|0.06|0.02|N|O|1995-10-26|1995-10-27|1995-11-07|TAKE BACK RETURN|SHIP|otes sublat +2499|1292|67|5|6|7159.74|0.02|0.01|N|O|1995-11-19|1995-12-14|1995-12-08|NONE|SHIP|cording to the +2499|1186|23|6|12|13046.16|0.04|0.05|N|O|1995-11-18|1995-12-13|1995-11-23|COLLECT COD|REG AIR|le furiously along the r +2500|1913|14|1|40|72596.40|0.00|0.02|A|F|1992-09-02|1992-09-30|1992-09-06|DELIVER IN PERSON|SHIP|efully unusual dolphins s +2500|363|64|2|34|42954.24|0.06|0.02|R|F|1992-10-03|1992-11-11|1992-10-29|DELIVER IN PERSON|TRUCK| stealthy a +2500|793|26|3|41|69445.39|0.02|0.00|R|F|1992-09-02|1992-11-11|1992-09-06|DELIVER IN PERSON|RAIL|s could have to integrate after the +2500|682|14|4|17|26905.56|0.01|0.02|A|F|1992-09-30|1992-10-16|1992-10-05|DELIVER IN PERSON|REG AIR|encies-- ironic, even packages +2501|835|35|1|4|6943.32|0.10|0.06|N|O|1997-07-17|1997-07-27|1997-07-22|COLLECT COD|RAIL|quests. furiously final +2501|1060|31|2|33|31714.98|0.01|0.04|N|O|1997-07-14|1997-08-09|1997-07-26|NONE|MAIL|leep furiously packages. even sauternes +2501|719|52|3|20|32394.20|0.10|0.06|N|O|1997-09-23|1997-07-01|1997-10-03|DELIVER IN PERSON|RAIL|equests. furiou +2501|575|66|4|26|38364.82|0.09|0.01|N|O|1997-07-15|1997-08-15|1997-07-28|DELIVER IN PERSON|SHIP|c accounts. express, iron +2502|1622|23|1|33|50279.46|0.10|0.06|R|F|1993-08-12|1993-07-22|1993-09-04|COLLECT COD|REG AIR|have to print +2503|1226|1|1|33|37198.26|0.06|0.01|R|F|1993-07-06|1993-08-14|1993-08-02|NONE|SHIP|nal courts integrate according to the +2503|641|35|2|28|43165.92|0.06|0.01|R|F|1993-08-08|1993-08-31|1993-08-10|NONE|SHIP|s wake quickly slyly +2503|454|55|3|50|67722.50|0.09|0.01|A|F|1993-09-22|1993-08-17|1993-09-29|DELIVER IN PERSON|TRUCK|s around the slyly +2503|901|4|4|27|48651.30|0.09|0.00|A|F|1993-07-12|1993-07-24|1993-07-22|DELIVER IN PERSON|TRUCK|lly even p +2503|477|7|5|3|4132.41|0.04|0.02|A|F|1993-07-10|1993-09-17|1993-07-19|TAKE BACK RETURN|TRUCK|s cajole. slyly close courts nod f +2503|1278|53|6|39|45991.53|0.05|0.05|R|F|1993-10-11|1993-09-09|1993-10-16|NONE|MAIL|d carefully fluffily +2503|186|39|7|17|18465.06|0.09|0.08|R|F|1993-09-04|1993-07-31|1993-09-23|DELIVER IN PERSON|SHIP|c accounts haggle blithel +2528|2|3|1|10|9020.00|0.02|0.03|R|F|1994-12-12|1994-12-29|1994-12-28|COLLECT COD|REG AIR|ely. fluffily even re +2528|735|100|2|13|21264.49|0.00|0.03|A|F|1994-11-27|1995-01-20|1994-12-03|TAKE BACK RETURN|REG AIR|ggle furiously. slyly final asympt +2528|1744|45|3|35|57600.90|0.10|0.00|R|F|1994-12-19|1995-02-04|1995-01-15|NONE|MAIL|, even excuses. even, +2528|642|74|4|37|57077.68|0.00|0.01|A|F|1994-12-25|1995-02-02|1994-12-31|COLLECT COD|AIR|ng the pending excuses haggle after the bl +2529|1307|22|1|4|4833.20|0.07|0.07|N|O|1996-10-19|1996-11-18|1996-10-24|DELIVER IN PERSON|SHIP|al dependencies haggle slyly alongsi +2530|204|5|1|9|9937.80|0.09|0.03|R|F|1994-05-10|1994-04-30|1994-05-24|TAKE BACK RETURN|REG AIR|lyly ironic +2530|924|27|2|42|76646.64|0.04|0.08|R|F|1994-03-27|1994-05-20|1994-03-29|NONE|RAIL|ng platelets wake s +2530|1079|15|3|8|7840.56|0.10|0.08|A|F|1994-05-02|1994-05-08|1994-05-24|DELIVER IN PERSON|MAIL|ial asymptotes snooze slyly regular +2531|1478|96|1|9|12415.23|0.03|0.07|N|O|1996-07-27|1996-07-03|1996-08-01|DELIVER IN PERSON|AIR|t the dogged, un +2531|1570|51|2|3|4414.71|0.07|0.06|N|O|1996-07-20|1996-06-20|1996-08-10|NONE|MAIL|he quickly ev +2531|860|27|3|20|35217.20|0.06|0.04|N|O|1996-07-18|1996-06-25|1996-07-29|TAKE BACK RETURN|TRUCK|into beans. furious +2531|1909|42|4|36|65192.40|0.08|0.01|N|O|1996-06-11|1996-07-26|1996-06-27|NONE|MAIL|y ironic, bold packages. blithely e +2531|559|90|5|28|40867.40|0.03|0.07|N|O|1996-07-06|1996-07-31|1996-07-19|TAKE BACK RETURN|REG AIR|its. busily +2531|1444|62|6|46|61890.24|0.10|0.08|N|O|1996-07-03|1996-06-27|1996-07-12|TAKE BACK RETURN|REG AIR|e final, bold pains. ir +2532|527|28|1|3|4282.56|0.06|0.07|N|O|1995-12-14|1995-11-28|1995-12-15|COLLECT COD|FOB|unusual sentiments. even pinto +2532|1598|19|2|33|49486.47|0.06|0.05|N|O|1995-11-23|1996-01-04|1995-12-16|DELIVER IN PERSON|TRUCK|rve carefully slyly ironic accounts! fluf +2532|1343|58|3|1|1244.34|0.00|0.06|N|O|1996-01-27|1995-11-23|1996-01-29|DELIVER IN PERSON|REG AIR|ely final ideas cajole despite the ca +2532|776|9|4|50|83838.50|0.02|0.02|N|O|1995-11-13|1996-01-01|1995-11-26|NONE|TRUCK|yly after the fluffily regul +2532|1131|4|5|9|9289.17|0.09|0.04|N|O|1995-11-30|1995-11-23|1995-12-12|DELIVER IN PERSON|TRUCK|cial ideas haggle slyly pending request +2532|1493|94|6|20|27889.80|0.09|0.05|N|O|1995-12-02|1995-11-26|1995-12-08|TAKE BACK RETURN|AIR|er the slyly pending +2533|536|97|1|36|51715.08|0.06|0.04|N|O|1997-06-10|1997-04-28|1997-07-01|NONE|REG AIR|ss requests sleep neve +2533|1971|16|2|5|9364.85|0.10|0.04|N|O|1997-05-26|1997-06-02|1997-06-24|NONE|FOB|ccounts. ironic, special accounts boo +2533|1830|60|3|37|64077.71|0.00|0.08|N|O|1997-05-10|1997-04-26|1997-05-28|COLLECT COD|SHIP| haggle carefully +2533|294|22|4|17|20302.93|0.06|0.02|N|O|1997-05-23|1997-05-10|1997-06-18|NONE|FOB|ackages. blith +2533|1256|94|5|38|43975.50|0.09|0.00|N|O|1997-05-10|1997-06-02|1997-05-28|TAKE BACK RETURN|REG AIR|of the regular accounts. even packages caj +2533|1834|35|6|20|34716.60|0.05|0.08|N|O|1997-07-04|1997-04-30|1997-07-05|COLLECT COD|FOB|thless excuses are b +2533|938|7|7|14|25745.02|0.06|0.04|N|O|1997-07-06|1997-05-08|1997-08-03|COLLECT COD|FOB|ut the pending, special depos +2534|1386|1|1|29|37334.02|0.07|0.07|N|O|1996-08-09|1996-09-29|1996-08-11|COLLECT COD|TRUCK|ugouts haggle slyly. final +2534|268|23|2|49|57244.74|0.08|0.08|N|O|1996-09-01|1996-08-20|1996-09-06|NONE|SHIP|sometimes regular requests. blithely unus +2534|9|35|3|50|45450.00|0.10|0.06|N|O|1996-09-25|1996-10-07|1996-10-09|TAKE BACK RETURN|AIR|ideas. deposits use. slyly regular pa +2534|743|40|4|43|70680.82|0.09|0.02|N|O|1996-10-25|1996-09-30|1996-11-05|TAKE BACK RETURN|REG AIR|ngly final depos +2534|1649|32|5|14|21708.96|0.05|0.02|N|O|1996-08-12|1996-09-26|1996-08-28|COLLECT COD|MAIL|eposits doze quickly final +2534|1160|97|6|12|12733.92|0.02|0.02|N|O|1996-07-29|1996-10-12|1996-08-14|TAKE BACK RETURN|AIR|sual depos +2534|1726|69|7|17|27671.24|0.02|0.07|N|O|1996-07-22|1996-09-15|1996-08-03|NONE|SHIP|riously regular +2535|1981|70|1|5|9414.90|0.06|0.01|A|F|1993-09-07|1993-07-25|1993-09-29|DELIVER IN PERSON|REG AIR|, unusual reque +2535|381|10|2|12|15376.56|0.08|0.05|A|F|1993-07-17|1993-08-17|1993-07-31|TAKE BACK RETURN|FOB|uses sleep among the packages. excuses +2535|531|32|3|5|7157.65|0.09|0.06|R|F|1993-07-28|1993-08-14|1993-08-11|DELIVER IN PERSON|SHIP| across the express requests. silent, eve +2535|1593|74|4|19|28397.21|0.01|0.02|A|F|1993-06-01|1993-08-01|1993-06-19|DELIVER IN PERSON|FOB|ructions. final requests +2535|1738|23|5|25|40993.25|0.07|0.04|A|F|1993-07-19|1993-08-07|1993-07-27|NONE|REG AIR|ions believe ab +2560|1689|90|1|41|65217.88|0.07|0.01|R|F|1992-10-23|1992-11-11|1992-11-22|NONE|SHIP| after the accounts. regular foxes are be +2560|38|89|2|27|25326.81|0.00|0.01|R|F|1992-12-03|1992-11-16|1992-12-30|NONE|MAIL| against the carefully +2560|460|48|3|31|42174.26|0.01|0.05|A|F|1992-11-14|1992-10-14|1992-12-11|DELIVER IN PERSON|AIR|to beans. blithely regular Tiresias int +2560|712|77|4|36|58057.56|0.01|0.02|A|F|1992-10-18|1992-10-30|1992-11-05|TAKE BACK RETURN|MAIL|accounts alongside of the excuses are +2560|419|7|5|9|11874.69|0.04|0.02|A|F|1992-10-23|1992-10-29|1992-11-02|COLLECT COD|REG AIR| deposits affix quickly. unusual, eve +2560|1076|77|6|13|12701.91|0.03|0.06|A|F|1992-09-07|1992-10-21|1992-09-24|COLLECT COD|FOB|slyly final accoun +2561|246|1|1|32|36679.68|0.02|0.01|N|O|1998-01-05|1997-12-28|1998-01-26|DELIVER IN PERSON|REG AIR|bold packages wake slyly. slyly +2561|971|40|2|5|9359.85|0.07|0.04|N|O|1997-12-27|1998-01-23|1998-01-13|TAKE BACK RETURN|AIR|p ironic, regular pinto beans. +2561|1726|27|3|47|76502.84|0.04|0.02|N|O|1997-11-19|1998-01-21|1997-12-03|DELIVER IN PERSON|REG AIR|larly pending t +2561|1076|77|4|39|38105.73|0.08|0.06|N|O|1998-01-20|1997-12-16|1998-02-05|TAKE BACK RETURN|MAIL|equests are furiously against the +2561|1500|79|5|2|2803.00|0.04|0.08|N|O|1998-03-14|1998-01-21|1998-03-27|DELIVER IN PERSON|TRUCK|s are. silently silent foxes sleep about +2561|503|64|6|14|19649.00|0.02|0.03|N|O|1998-03-07|1998-02-04|1998-03-21|COLLECT COD|RAIL|ep unusual, ironic accounts +2562|523|14|1|28|39858.56|0.04|0.03|R|F|1992-10-04|1992-09-24|1992-10-09|COLLECT COD|MAIL|ans haggle special, special packages. +2562|1473|74|2|1|1374.47|0.01|0.06|R|F|1992-10-16|1992-09-18|1992-10-17|NONE|TRUCK| slyly final ideas haggle car +2562|656|57|3|25|38916.25|0.05|0.03|A|F|1992-11-23|1992-10-08|1992-12-19|DELIVER IN PERSON|REG AIR| accounts-- silent, unusual ideas a +2562|1472|51|4|37|50818.39|0.08|0.03|R|F|1992-10-29|1992-10-06|1992-11-09|COLLECT COD|FOB|. slyly regular ideas according to the fl +2562|1591|32|5|29|43285.11|0.05|0.08|A|F|1992-11-01|1992-09-29|1992-11-13|TAKE BACK RETURN|MAIL|eep against the furiously r +2562|497|27|6|17|23757.33|0.01|0.06|A|F|1992-10-15|1992-10-08|1992-10-26|DELIVER IN PERSON|TRUCK|lar pinto beans. blithely ev +2563|644|76|1|10|15446.40|0.07|0.04|A|F|1994-01-26|1993-12-19|1994-01-28|DELIVER IN PERSON|AIR|tealthily abo +2563|1668|51|2|28|43950.48|0.04|0.03|R|F|1994-03-17|1994-02-04|1994-04-13|TAKE BACK RETURN|RAIL|hely regular depe +2563|1185|94|3|39|42361.02|0.07|0.00|R|F|1994-02-10|1993-12-31|1994-02-19|COLLECT COD|FOB|lent requests should integrate; carefully e +2563|891|91|4|50|89594.50|0.01|0.01|A|F|1994-01-26|1994-01-03|1994-02-09|DELIVER IN PERSON|SHIP|ly regular, regular excuses. bold plate +2563|150|51|5|42|44106.30|0.06|0.08|R|F|1994-02-21|1994-02-14|1994-03-04|DELIVER IN PERSON|AIR|ymptotes nag furiously slyly even inst +2563|1209|10|6|5|5551.00|0.10|0.00|R|F|1993-12-27|1993-12-19|1994-01-02|DELIVER IN PERSON|REG AIR| the quickly final theodolite +2564|1113|14|1|4|4056.44|0.02|0.00|R|F|1994-11-12|1994-10-29|1994-12-04|NONE|MAIL|y express requests sleep furi +2565|1437|38|1|42|56214.06|0.04|0.08|N|O|1998-04-07|1998-04-02|1998-05-04|NONE|AIR|ngly silent +2565|1889|90|2|26|46562.88|0.05|0.08|N|O|1998-05-07|1998-04-09|1998-05-15|DELIVER IN PERSON|TRUCK| pinto beans about the slyly regula +2565|1144|53|3|34|35534.76|0.06|0.06|N|O|1998-03-19|1998-04-12|1998-04-17|DELIVER IN PERSON|SHIP|nstructions was carefu +2565|163|42|4|25|26579.00|0.10|0.08|N|O|1998-06-27|1998-05-20|1998-07-13|DELIVER IN PERSON|RAIL|, express accounts. final id +2565|755|56|5|26|43049.50|0.08|0.03|N|O|1998-03-05|1998-04-11|1998-03-11|TAKE BACK RETURN|AIR|ites wake. ironic acco +2565|1402|81|6|48|62563.20|0.08|0.07|N|O|1998-06-18|1998-05-06|1998-07-13|DELIVER IN PERSON|TRUCK|r instructions sleep qui +2566|1473|13|1|19|26114.93|0.06|0.07|R|F|1992-12-21|1992-11-24|1992-12-22|DELIVER IN PERSON|MAIL|ests. silent +2566|1805|35|2|42|71685.60|0.08|0.02|R|F|1992-12-20|1992-12-22|1992-12-29|COLLECT COD|MAIL|ously ironic accounts +2566|227|55|3|18|20289.96|0.09|0.02|A|F|1992-11-16|1992-12-24|1992-12-16|COLLECT COD|FOB| braids according t +2566|415|45|4|3|3946.23|0.05|0.02|A|F|1992-11-04|1992-12-30|1992-12-04|TAKE BACK RETURN|FOB|ckages are ironic Tiresias. furious +2566|213|14|5|9|10018.89|0.04|0.03|R|F|1992-12-14|1992-12-28|1992-12-16|NONE|FOB|blithely bold accounts? quickl +2566|1275|13|6|1|1176.27|0.07|0.03|A|F|1992-10-28|1992-11-20|1992-11-22|TAKE BACK RETURN|AIR|theodolites wake pending +2567|258|40|1|39|45171.75|0.03|0.04|N|O|1998-05-10|1998-05-10|1998-05-21|NONE|SHIP|ns. furiously final dependencies cajo +2567|1119|20|2|50|51005.50|0.06|0.05|N|O|1998-05-05|1998-04-18|1998-05-09|DELIVER IN PERSON|TRUCK|. carefully pending foxes are furi +2567|517|48|3|6|8505.06|0.03|0.06|N|O|1998-04-21|1998-04-14|1998-05-11|NONE|RAIL|s cajole regular, final acco +2567|1576|17|4|50|73878.50|0.05|0.03|N|O|1998-03-27|1998-05-25|1998-04-23|DELIVER IN PERSON|FOB|pinto beans? r +2567|804|4|5|46|78420.80|0.07|0.02|N|O|1998-06-02|1998-04-30|1998-06-13|COLLECT COD|AIR|efully pending epitaphs. carefully reg +2567|995|64|6|32|60671.68|0.01|0.07|N|O|1998-05-24|1998-04-30|1998-06-14|NONE|RAIL| the even, iro +2567|1344|21|7|43|53549.62|0.06|0.02|N|O|1998-05-11|1998-04-15|1998-05-29|NONE|RAIL|requests. final courts cajole +2592|897|98|1|7|12585.23|0.10|0.04|R|F|1993-03-13|1993-04-25|1993-04-01|NONE|REG AIR| carefully special theodolites integrate +2592|657|51|2|2|3115.30|0.10|0.00|A|F|1993-03-24|1993-04-05|1993-04-16|DELIVER IN PERSON|RAIL|side of the b +2593|1041|47|1|37|34855.48|0.08|0.06|R|F|1993-12-14|1993-10-08|1994-01-04|NONE|SHIP|s wake bravel +2593|892|92|2|28|50200.92|0.08|0.03|A|F|1993-10-30|1993-10-18|1993-11-06|DELIVER IN PERSON|SHIP|y even escapades shall +2593|1271|9|3|6|7033.62|0.04|0.05|A|F|1993-11-28|1993-10-04|1993-12-28|TAKE BACK RETURN|REG AIR|ular packages. re +2593|1601|43|4|44|66114.40|0.02|0.08|A|F|1993-09-05|1993-10-23|1993-09-29|NONE|RAIL|ents impress furiously; unusual theodoli +2593|35|36|5|3|2805.09|0.03|0.00|A|F|1993-12-16|1993-11-01|1993-12-29|COLLECT COD|SHIP|the furiously +2593|1746|47|6|1|1647.74|0.08|0.08|A|F|1993-11-23|1993-10-25|1993-12-04|DELIVER IN PERSON|RAIL| accounts wake slyly +2593|1914|3|7|11|19975.01|0.00|0.07|R|F|1993-11-01|1993-11-19|1993-11-28|TAKE BACK RETURN|RAIL|express packages sleep bold re +2594|715|16|1|7|11309.97|0.06|0.02|R|F|1993-03-26|1993-03-05|1993-04-24|DELIVER IN PERSON|FOB|arls cajole +2594|1232|70|2|13|14731.99|0.10|0.05|R|F|1993-02-06|1993-03-01|1993-02-23|TAKE BACK RETURN|TRUCK|fully special accounts use courts +2594|1255|93|3|24|27750.00|0.03|0.00|A|F|1993-01-31|1993-03-10|1993-02-04|COLLECT COD|REG AIR|lar accounts sleep fur +2594|1440|19|4|46|61706.24|0.00|0.08|R|F|1993-04-17|1993-03-06|1993-04-21|TAKE BACK RETURN|SHIP|beans. instructions across t +2595|610|11|1|42|63445.62|0.08|0.02|N|O|1996-03-24|1996-01-28|1996-04-10|DELIVER IN PERSON|MAIL|ggle furiou +2595|871|5|2|30|53156.10|0.05|0.01|N|O|1996-03-05|1996-02-23|1996-03-19|NONE|AIR|ctions. regula +2595|234|89|3|19|21550.37|0.01|0.05|N|O|1995-12-23|1996-03-02|1996-01-17|COLLECT COD|MAIL|ns are neve +2595|1588|9|4|29|43197.82|0.07|0.05|N|O|1996-01-01|1996-02-13|1996-01-18|TAKE BACK RETURN|RAIL|ronic accounts haggle carefully fin +2595|851|18|5|30|52555.50|0.09|0.07|N|O|1996-03-16|1996-01-31|1996-04-05|TAKE BACK RETURN|FOB|. final orbits cajole +2595|819|19|6|31|53314.11|0.06|0.04|N|O|1996-02-07|1996-02-10|1996-03-05|DELIVER IN PERSON|AIR|tipliers w +2596|1695|19|1|6|9580.14|0.05|0.01|N|O|1996-12-15|1996-11-02|1996-12-29|TAKE BACK RETURN|TRUCK|ily special re +2596|1389|66|2|43|55486.34|0.07|0.03|N|O|1996-09-03|1996-10-26|1996-09-15|NONE|FOB|ial packages haggl +2596|385|14|3|19|24422.22|0.10|0.00|N|O|1996-09-02|1996-11-03|1996-09-06|COLLECT COD|AIR|ias mold! sp +2596|1043|44|4|10|9440.40|0.06|0.05|N|O|1996-08-25|1996-11-05|1996-09-13|DELIVER IN PERSON|REG AIR| instructions shall have +2597|838|5|1|24|41731.92|0.07|0.00|A|F|1993-05-15|1993-03-06|1993-05-25|TAKE BACK RETURN|FOB|pending packages. enticingly fi +2598|70|46|1|12|11640.84|0.00|0.01|N|O|1996-06-17|1996-04-12|1996-06-24|COLLECT COD|TRUCK|express packages nag sly +2598|1471|89|2|40|54898.80|0.07|0.02|N|O|1996-05-11|1996-05-19|1996-06-08|TAKE BACK RETURN|AIR|the enticing +2598|1038|9|3|4|3756.12|0.03|0.03|N|O|1996-05-23|1996-05-13|1996-05-25|COLLECT COD|AIR| across the furiously fi +2598|221|76|4|19|21303.18|0.02|0.00|N|O|1996-04-09|1996-05-30|1996-04-17|TAKE BACK RETURN|RAIL|nic packages. even accounts +2598|1060|66|5|12|11532.72|0.01|0.08|N|O|1996-04-14|1996-04-24|1996-04-21|TAKE BACK RETURN|REG AIR|eposits cajol +2599|1008|44|1|11|9999.00|0.08|0.08|N|O|1997-02-01|1996-12-14|1997-02-27|TAKE BACK RETURN|FOB| express accoun +2599|414|73|2|26|34174.66|0.03|0.04|N|O|1996-11-08|1996-12-21|1996-11-24|TAKE BACK RETURN|AIR|nag carefully +2599|989|90|3|29|54809.42|0.09|0.03|N|O|1997-01-10|1996-12-10|1997-02-02|COLLECT COD|RAIL|ly express dolphins. special, +2624|625|88|1|15|22884.30|0.03|0.07|N|O|1997-02-28|1997-02-19|1997-03-21|DELIVER IN PERSON|AIR|le. quickly pending requests +2624|1887|88|2|12|21466.56|0.07|0.00|N|O|1997-02-24|1997-02-22|1997-02-27|DELIVER IN PERSON|SHIP|er the quickly unu +2625|194|95|1|42|45955.98|0.02|0.04|R|F|1992-10-18|1992-11-17|1992-10-23|DELIVER IN PERSON|AIR| even accounts haggle furiously +2626|215|97|1|45|50184.45|0.09|0.04|N|O|1995-11-22|1995-11-01|1995-11-23|NONE|AIR|deposits wake blithely according to +2626|1744|71|2|2|3291.48|0.05|0.07|N|O|1995-10-19|1995-11-09|1995-10-24|TAKE BACK RETURN|FOB|uffy accounts haggle furiously above +2626|1534|75|3|40|57421.20|0.05|0.07|N|O|1995-09-28|1995-12-03|1995-10-10|NONE|REG AIR|eans. ironic deposits haggle. depo +2627|1306|21|1|28|33804.40|0.09|0.02|R|F|1992-05-14|1992-05-09|1992-05-31|COLLECT COD|SHIP|ggedly final excuses nag packages. f +2628|1059|95|1|44|42242.20|0.07|0.03|R|F|1994-01-11|1994-01-14|1994-01-13|DELIVER IN PERSON|SHIP|lyly final, pending ide +2628|1055|91|2|14|13384.70|0.01|0.03|A|F|1994-01-28|1993-11-30|1994-02-20|TAKE BACK RETURN|SHIP|g the furiously unusual pi +2628|639|33|3|42|64664.46|0.00|0.00|A|F|1993-11-20|1994-01-04|1993-12-19|DELIVER IN PERSON|TRUCK|ld notornis alongside +2628|941|76|4|23|42364.62|0.08|0.04|A|F|1993-10-27|1994-01-08|1993-11-12|DELIVER IN PERSON|TRUCK|usual packages sleep about the fina +2628|900|34|5|50|90045.00|0.07|0.01|A|F|1994-01-13|1993-12-11|1994-01-14|NONE|AIR|posits serve carefully toward +2629|1179|80|1|6|6481.02|0.06|0.05|N|O|1998-06-10|1998-05-29|1998-06-13|DELIVER IN PERSON|SHIP|dolites hinder bli +2629|1231|43|2|31|35099.13|0.08|0.03|N|O|1998-05-24|1998-05-26|1998-06-10|COLLECT COD|AIR|ate blithely bold, regular deposits. bold +2629|1275|76|3|29|34111.83|0.08|0.07|N|O|1998-07-09|1998-06-17|1998-07-12|TAKE BACK RETURN|AIR|eposits serve unusual, express i +2629|694|88|4|33|52624.77|0.06|0.03|N|O|1998-05-29|1998-05-14|1998-05-30|NONE|TRUCK|es. slowly express accounts are along the +2630|285|40|1|46|54522.88|0.05|0.03|R|F|1992-11-05|1992-12-17|1992-12-05|TAKE BACK RETURN|MAIL|uests cajole. e +2630|563|24|2|8|11708.48|0.09|0.07|A|F|1992-11-16|1993-01-01|1992-12-07|DELIVER IN PERSON|TRUCK|indle fluffily silent, ironic pi +2630|1727|12|3|45|73292.40|0.08|0.07|A|F|1993-01-04|1993-01-11|1993-01-09|NONE|FOB|edly express ideas. carefully final +2630|1616|99|4|29|44010.69|0.08|0.07|A|F|1992-12-03|1993-01-04|1992-12-12|DELIVER IN PERSON|SHIP|efully unusual dependencies. even i +2631|1217|55|1|42|46964.82|0.00|0.03|A|F|1994-01-04|1993-12-01|1994-01-16|TAKE BACK RETURN|SHIP|ect carefully at the furiously final the +2631|666|29|2|4|6266.64|0.07|0.06|R|F|1993-11-03|1993-12-17|1993-11-05|COLLECT COD|AIR|special theodolites. a +2631|1179|88|3|15|16202.55|0.06|0.05|A|F|1993-09-30|1993-11-06|1993-10-13|DELIVER IN PERSON|SHIP|y. furiously even pinto be +2656|1807|51|1|10|17088.00|0.02|0.06|R|F|1993-06-28|1993-07-04|1993-07-12|TAKE BACK RETURN|TRUCK|s nag regularly about the deposits. slyly +2656|1369|70|2|38|48273.68|0.07|0.02|A|F|1993-06-25|1993-06-04|1993-07-24|NONE|RAIL|structions wake along the furio +2656|13|39|3|19|17347.19|0.03|0.02|R|F|1993-08-03|1993-07-25|1993-08-20|TAKE BACK RETURN|MAIL|ts serve deposi +2656|1093|29|4|40|39763.60|0.05|0.04|R|F|1993-06-09|1993-07-24|1993-06-21|DELIVER IN PERSON|RAIL|refully final pearls. final ideas wake. qu +2657|1144|81|1|22|22993.08|0.02|0.03|N|O|1995-12-08|1995-12-28|1995-12-21|TAKE BACK RETURN|MAIL|r ideas. furiously special dolphins +2657|1649|32|2|15|23259.60|0.08|0.05|N|O|1995-12-09|1995-12-16|1995-12-18|NONE|RAIL|ole carefully above the ironic ideas. b +2657|783|16|3|25|42094.50|0.02|0.04|N|O|1995-10-21|1995-12-12|1995-11-09|COLLECT COD|FOB|lly pinto beans. final +2657|549|40|4|11|15944.94|0.04|0.08|N|O|1995-11-19|1995-12-11|1995-11-24|COLLECT COD|TRUCK|ckly enticing requests. fur +2657|777|78|5|42|70466.34|0.06|0.03|N|O|1996-01-23|1995-11-22|1996-01-25|COLLECT COD|RAIL|ckly slyly even accounts. platelets x-ray +2657|1932|21|6|31|56851.83|0.01|0.03|N|O|1995-11-10|1995-11-27|1995-12-06|COLLECT COD|RAIL|re blithely +2658|1312|13|1|41|49745.71|0.05|0.04|N|O|1995-11-07|1995-11-04|1995-12-04|NONE|MAIL|eposits. furiously final theodolite +2658|286|14|2|22|26098.16|0.08|0.05|N|O|1995-11-12|1995-11-18|1995-11-14|DELIVER IN PERSON|TRUCK|ts cajole. pending packages affix +2658|179|32|3|13|14029.21|0.07|0.06|N|O|1995-10-24|1995-12-12|1995-11-14|COLLECT COD|FOB|s kindle blithely regular accounts. +2658|920|89|4|22|40060.24|0.04|0.04|N|O|1995-12-02|1995-11-03|1995-12-26|DELIVER IN PERSON|SHIP| dependencies. blithely pending foxes abou +2658|68|69|5|45|43562.70|0.03|0.01|N|O|1995-11-02|1995-11-08|1995-11-29|DELIVER IN PERSON|MAIL|e special requests. quickly ex +2658|1468|8|6|27|36975.42|0.05|0.07|N|O|1995-09-26|1995-12-08|1995-09-30|NONE|AIR|ecial packages use abov +2659|418|6|1|28|36915.48|0.08|0.05|A|F|1994-03-17|1994-01-24|1994-03-19|NONE|FOB|idle tithes +2659|423|11|2|21|27791.82|0.00|0.00|A|F|1993-12-23|1994-02-10|1994-01-17|DELIVER IN PERSON|RAIL|y beyond the furiously even co +2659|1346|61|3|24|29936.16|0.04|0.03|R|F|1994-03-28|1994-02-20|1994-04-05|DELIVER IN PERSON|REG AIR| haggle carefully +2659|1181|54|4|2|2164.36|0.00|0.08|R|F|1994-02-19|1994-03-12|1994-02-21|NONE|MAIL|sts above the fluffily express fo +2659|62|38|5|9|8658.54|0.08|0.03|A|F|1994-02-07|1994-03-17|1994-03-04|DELIVER IN PERSON|AIR|ly final packages sleep ac +2660|478|66|1|17|23433.99|0.00|0.05|N|O|1995-08-18|1995-09-13|1995-09-17|NONE|SHIP|al pinto beans wake after the furious +2661|1772|73|1|31|51886.87|0.03|0.02|N|O|1997-04-07|1997-03-10|1997-04-23|TAKE BACK RETURN|AIR|e ironicall +2661|1025|96|2|22|20372.44|0.08|0.02|N|O|1997-03-14|1997-03-17|1997-04-08|COLLECT COD|REG AIR| foxes affix quickly ironic request +2661|662|94|3|11|17189.26|0.00|0.08|N|O|1997-04-14|1997-02-11|1997-05-05|TAKE BACK RETURN|FOB|equests are a +2661|1362|39|4|41|51797.76|0.06|0.02|N|O|1997-03-06|1997-03-27|1997-03-15|DELIVER IN PERSON|AIR|iously ironically ironic requests. +2662|1017|53|1|43|39474.43|0.09|0.07|N|O|1996-11-24|1996-11-04|1996-12-08|NONE|RAIL|. slyly specia +2662|1275|76|2|8|9410.16|0.02|0.07|N|O|1996-09-10|1996-10-09|1996-09-21|TAKE BACK RETURN|REG AIR|ajole carefully. sp +2662|11|37|3|6|5466.06|0.02|0.00|N|O|1996-11-30|1996-09-20|1996-12-03|DELIVER IN PERSON|REG AIR|olites cajole quickly along the b +2662|298|99|4|34|40741.86|0.06|0.07|N|O|1996-10-04|1996-11-05|1996-10-19|NONE|SHIP|ding theodolites use carefully. p +2663|1133|42|1|35|36194.55|0.02|0.01|N|O|1995-12-11|1995-10-16|1996-01-07|TAKE BACK RETURN|REG AIR|tect. slyly fina +2688|178|31|1|45|48517.65|0.08|0.08|R|F|1992-05-21|1992-04-14|1992-05-28|NONE|FOB|sits run carefully +2688|145|46|2|46|48076.44|0.01|0.01|R|F|1992-05-24|1992-04-01|1992-05-26|COLLECT COD|TRUCK|elets. regular reque +2688|889|23|3|30|53696.40|0.05|0.04|A|F|1992-04-18|1992-03-18|1992-05-18|TAKE BACK RETURN|RAIL|ithely final +2688|245|73|4|3|3435.72|0.00|0.03|R|F|1992-02-04|1992-03-18|1992-02-24|DELIVER IN PERSON|RAIL|e fluffily +2688|585|86|5|22|32682.76|0.02|0.05|R|F|1992-02-09|1992-04-09|1992-02-11|DELIVER IN PERSON|RAIL|press, ironic excuses wake carefully id +2688|1483|84|6|42|58148.16|0.01|0.01|R|F|1992-04-29|1992-04-04|1992-05-17|TAKE BACK RETURN|FOB|lly even account +2689|58|9|1|45|43112.25|0.02|0.04|R|F|1992-04-29|1992-06-22|1992-04-30|COLLECT COD|SHIP|e quickly. carefully silent +2690|1391|68|1|44|56865.16|0.05|0.06|N|O|1996-05-30|1996-05-19|1996-06-26|NONE|REG AIR|ly alongside of th +2690|510|11|2|50|70525.50|0.03|0.03|N|O|1996-06-13|1996-05-22|1996-06-14|DELIVER IN PERSON|MAIL| doubt careful +2690|1245|46|3|45|51580.80|0.02|0.07|N|O|1996-05-23|1996-06-02|1996-05-29|DELIVER IN PERSON|MAIL|ounts. slyly regular dependencies wa +2690|1945|46|4|12|22163.28|0.04|0.07|N|O|1996-07-18|1996-06-03|1996-07-25|NONE|AIR|nal, regular atta +2690|852|52|5|30|52585.50|0.01|0.08|N|O|1996-05-20|1996-06-01|1996-06-04|TAKE BACK RETURN|SHIP|d accounts above the express req +2690|1881|11|6|3|5348.64|0.07|0.01|N|O|1996-07-04|1996-05-28|1996-07-06|TAKE BACK RETURN|RAIL|. final reques +2690|787|84|7|35|59072.30|0.05|0.06|N|O|1996-07-25|1996-05-14|1996-08-03|COLLECT COD|FOB|y silent pinto be +2691|906|41|1|11|19875.90|0.04|0.07|R|F|1992-06-21|1992-06-08|1992-07-09|COLLECT COD|FOB|leep alongside of the accounts. slyly ironi +2691|478|66|2|2|2756.94|0.00|0.07|R|F|1992-05-10|1992-06-04|1992-05-11|TAKE BACK RETURN|TRUCK|s cajole at the blithely ironic warthog +2691|1613|14|3|16|24233.76|0.09|0.03|R|F|1992-06-11|1992-07-29|1992-06-29|NONE|RAIL|bove the even foxes. unusual theodoli +2691|1658|41|4|1|1559.65|0.08|0.00|A|F|1992-08-11|1992-06-07|1992-08-16|NONE|SHIP|egular instructions b +2692|162|89|1|3|3186.48|0.10|0.04|N|O|1998-02-25|1998-01-29|1998-03-27|TAKE BACK RETURN|MAIL|equests. bold, even foxes haggle slyl +2692|1136|9|2|21|21779.73|0.03|0.05|N|O|1998-03-11|1998-02-11|1998-03-19|NONE|SHIP|posits. final, express requests nag furi +2693|87|88|1|26|25664.08|0.04|0.00|N|O|1996-09-14|1996-10-07|1996-10-03|COLLECT COD|MAIL|cajole alo +2693|1019|20|2|43|39560.43|0.03|0.04|N|O|1996-10-24|1996-10-24|1996-11-03|TAKE BACK RETURN|TRUCK|as are according to th +2694|1526|67|1|30|42825.60|0.02|0.06|N|O|1996-06-20|1996-06-01|1996-07-15|NONE|TRUCK|oxes. never iro +2694|1569|50|2|35|51469.60|0.07|0.03|N|O|1996-05-24|1996-06-01|1996-05-25|NONE|RAIL|atelets past the furiously final deposits +2694|181|8|3|15|16217.70|0.08|0.02|N|O|1996-06-30|1996-05-01|1996-07-25|TAKE BACK RETURN|REG AIR|e blithely even platelets. special wa +2694|195|74|4|12|13142.28|0.00|0.05|N|O|1996-04-24|1996-04-22|1996-05-14|DELIVER IN PERSON|RAIL|foxes atop the hockey pla +2694|1072|73|5|10|9730.70|0.08|0.08|N|O|1996-06-23|1996-05-28|1996-06-27|COLLECT COD|REG AIR|fluffily fluffy accounts. even packages hi +2695|1833|20|1|21|36431.43|0.07|0.00|N|O|1996-10-04|1996-11-02|1996-10-21|NONE|MAIL|y regular pinto beans. evenly regular packa +2695|189|68|2|44|47923.92|0.09|0.07|N|O|1996-10-05|1996-10-10|1996-11-01|NONE|MAIL|ts. busy platelets boost +2695|1435|14|3|21|28065.03|0.02|0.07|N|O|1996-09-13|1996-09-25|1996-10-13|NONE|TRUCK|s. furiously ironic platelets ar +2695|574|5|4|16|23593.12|0.08|0.08|N|O|1996-11-16|1996-10-05|1996-11-22|NONE|TRUCK|its. theodolites sleep slyly +2695|853|53|5|40|70154.00|0.02|0.03|N|O|1996-11-02|1996-10-26|1996-11-14|NONE|FOB|ructions. pending +2720|445|46|1|5|6727.20|0.10|0.06|A|F|1993-06-24|1993-08-08|1993-07-08|NONE|FOB|ously ironic foxes thrash +2720|167|68|2|42|44820.72|0.09|0.03|R|F|1993-07-25|1993-07-23|1993-08-23|COLLECT COD|REG AIR|fter the inst +2720|1191|92|3|50|54609.50|0.10|0.02|A|F|1993-08-10|1993-07-29|1993-09-06|NONE|SHIP|l requests. deposits nag furiously +2720|1090|26|4|49|48563.41|0.06|0.02|A|F|1993-07-09|1993-07-14|1993-07-13|NONE|REG AIR| accounts. fluffily bold pack +2720|1209|47|5|27|29975.40|0.04|0.00|R|F|1993-06-29|1993-08-06|1993-07-28|NONE|TRUCK|eas. carefully regular +2721|1825|69|1|49|84614.18|0.00|0.08|N|O|1996-02-14|1996-04-26|1996-03-02|DELIVER IN PERSON|AIR|ounts poach carefu +2721|27|28|2|2|1854.04|0.02|0.05|N|O|1996-02-13|1996-03-14|1996-02-28|TAKE BACK RETURN|TRUCK| slyly final requests against +2722|1239|51|1|21|23944.83|0.09|0.01|A|F|1994-07-29|1994-06-26|1994-08-09|NONE|RAIL|e carefully around the furiously ironic pac +2722|1458|59|2|15|20391.75|0.05|0.03|R|F|1994-07-02|1994-06-01|1994-07-13|COLLECT COD|AIR|refully final asympt +2722|338|67|3|16|19813.28|0.04|0.06|R|F|1994-05-25|1994-06-09|1994-05-26|NONE|MAIL|ts besides the fluffy, +2723|127|54|1|47|48274.64|0.09|0.07|N|O|1995-12-05|1995-11-19|1995-12-11|TAKE BACK RETURN|AIR|furiously r +2723|320|77|2|10|12203.20|0.06|0.08|N|O|1995-11-27|1995-11-29|1995-12-12|DELIVER IN PERSON|MAIL|al, special r +2723|1618|60|3|2|3039.22|0.10|0.01|N|O|1995-11-09|1995-11-10|1995-11-14|TAKE BACK RETURN|FOB| courts boost quickly about th +2723|813|80|4|12|20565.72|0.01|0.05|N|O|1995-12-24|1995-11-15|1996-01-17|DELIVER IN PERSON|RAIL|bold foxes are bold packages. regular, fin +2723|1281|82|5|40|47291.20|0.09|0.05|N|O|1995-11-17|1995-11-22|1995-11-18|TAKE BACK RETURN|MAIL|unwind fluffily carefully regular realms. +2724|914|49|1|47|85300.77|0.09|0.01|A|F|1994-11-23|1994-11-13|1994-12-03|COLLECT COD|TRUCK|unusual patterns nag. special p +2724|1470|71|2|21|28800.87|0.09|0.02|A|F|1994-11-25|1994-10-15|1994-12-07|COLLECT COD|RAIL|as. carefully regular dependencies wak +2724|499|58|3|22|30788.78|0.04|0.06|A|F|1994-09-19|1994-11-18|1994-10-17|TAKE BACK RETURN|TRUCK|express fo +2724|345|2|4|1|1245.34|0.07|0.03|A|F|1994-12-26|1994-11-27|1995-01-07|NONE|MAIL|lyly carefully blithe theodolites-- pl +2724|1481|60|5|29|40091.92|0.05|0.06|A|F|1995-01-10|1994-11-17|1995-02-04|COLLECT COD|MAIL|l requests hagg +2725|1176|13|1|23|24774.91|0.10|0.08|R|F|1994-08-25|1994-06-22|1994-08-28|TAKE BACK RETURN|REG AIR|y regular deposits. brave foxes +2725|49|75|2|41|38910.64|0.01|0.00|R|F|1994-07-05|1994-06-29|1994-08-02|DELIVER IN PERSON|TRUCK|ns sleep furiously c +2725|1884|14|3|15|26788.20|0.07|0.03|R|F|1994-08-06|1994-08-09|1994-08-15|TAKE BACK RETURN|AIR|? furiously regular a +2726|7|58|1|50|45350.00|0.00|0.06|R|F|1993-03-04|1993-01-29|1993-03-28|COLLECT COD|TRUCK| furiously bold theodolites +2727|1510|91|1|3|4234.53|0.03|0.01|N|O|1998-06-18|1998-06-06|1998-06-23|NONE|RAIL| the carefully regular foxes u +2752|308|65|1|41|49540.30|0.02|0.05|A|F|1994-03-02|1994-01-31|1994-03-06|DELIVER IN PERSON|AIR|tructions hag +2752|69|20|2|29|28102.74|0.02|0.04|R|F|1994-01-22|1994-01-08|1994-01-28|COLLECT COD|TRUCK|gly blithely re +2752|551|52|3|4|5806.20|0.08|0.00|A|F|1993-12-14|1994-02-13|1994-01-05|DELIVER IN PERSON|TRUCK|telets haggle. regular, final +2752|232|14|4|40|45289.20|0.09|0.06|A|F|1994-01-24|1994-01-18|1994-02-22|DELIVER IN PERSON|MAIL|into beans are after the sly +2752|1260|35|5|22|25547.72|0.03|0.04|A|F|1994-03-20|1994-02-08|1994-04-01|TAKE BACK RETURN|TRUCK|equests nag. regular dependencies are furio +2752|1694|18|6|21|33509.49|0.09|0.05|R|F|1994-01-01|1994-01-24|1994-01-24|COLLECT COD|SHIP| along the quickly +2752|1990|91|7|38|71895.62|0.08|0.00|R|F|1994-02-23|1993-12-23|1994-03-24|DELIVER IN PERSON|SHIP|es boost. slyly silent ideas +2753|129|8|1|6|6174.72|0.10|0.04|A|F|1993-12-30|1994-01-28|1994-01-29|COLLECT COD|TRUCK|s accounts +2753|471|59|2|40|54858.80|0.03|0.05|A|F|1994-01-06|1994-02-13|1994-02-03|DELIVER IN PERSON|SHIP|latelets kindle slyly final depos +2753|887|54|3|30|53636.40|0.00|0.07|A|F|1994-01-26|1994-01-29|1994-02-02|NONE|RAIL|ans wake fluffily blithely iro +2753|309|38|4|7|8465.10|0.07|0.03|R|F|1994-02-11|1994-01-22|1994-03-10|DELIVER IN PERSON|AIR|xpress ideas detect b +2753|1369|70|5|36|45732.96|0.04|0.08|R|F|1994-03-15|1994-01-03|1994-04-03|DELIVER IN PERSON|SHIP|gle slyly final c +2753|493|94|6|17|23689.33|0.01|0.08|A|F|1994-03-08|1994-01-17|1994-03-11|TAKE BACK RETURN|REG AIR| carefully bold deposits sublate s +2753|1472|73|7|20|27469.40|0.01|0.06|R|F|1994-02-24|1994-02-04|1994-03-23|DELIVER IN PERSON|FOB| express pack +2754|1481|21|1|4|5529.92|0.05|0.08|A|F|1994-07-13|1994-05-15|1994-08-02|NONE|REG AIR|blithely silent requests. regular depo +2754|1767|94|2|19|31706.44|0.01|0.07|A|F|1994-06-27|1994-05-06|1994-06-28|NONE|FOB|latelets hag +2755|915|50|1|19|34502.29|0.10|0.00|R|F|1992-02-11|1992-03-15|1992-02-14|TAKE BACK RETURN|MAIL|furiously special deposits +2755|235|90|2|11|12487.53|0.03|0.08|A|F|1992-04-12|1992-05-07|1992-04-21|COLLECT COD|RAIL|egular excuses sleep carefully. +2755|638|70|3|21|32311.23|0.08|0.04|R|F|1992-02-13|1992-04-20|1992-03-02|NONE|AIR|furious re +2755|1301|16|4|5|6011.50|0.01|0.00|A|F|1992-02-27|1992-04-07|1992-03-09|TAKE BACK RETURN|AIR|e the furi +2755|1151|52|5|48|50503.20|0.05|0.06|R|F|1992-03-22|1992-03-10|1992-04-14|DELIVER IN PERSON|MAIL|yly even epitaphs for the +2756|1173|74|1|35|37595.95|0.03|0.02|R|F|1994-06-08|1994-06-01|1994-06-21|TAKE BACK RETURN|AIR| deposits grow bold sheaves; iro +2756|793|58|2|47|79608.13|0.06|0.01|R|F|1994-05-10|1994-05-25|1994-05-13|NONE|AIR|e final, f +2756|1049|85|3|31|29451.24|0.01|0.07|A|F|1994-07-27|1994-07-06|1994-08-22|TAKE BACK RETURN|TRUCK|en instructions use quickly. +2756|718|51|4|30|48561.30|0.00|0.04|A|F|1994-06-05|1994-06-30|1994-06-14|DELIVER IN PERSON|TRUCK|ular packages. regular deposi +2757|1474|14|1|26|35762.22|0.07|0.00|N|O|1995-08-19|1995-10-02|1995-09-06|DELIVER IN PERSON|MAIL|around the blithely +2757|219|47|2|12|13430.52|0.07|0.08|N|O|1995-08-01|1995-09-04|1995-08-08|TAKE BACK RETURN|SHIP| regular, eve +2757|728|61|3|17|27688.24|0.10|0.04|N|O|1995-09-06|1995-09-27|1995-09-22|DELIVER IN PERSON|AIR|er the furiously silent +2757|1392|69|4|25|32334.75|0.08|0.01|N|O|1995-11-09|1995-09-12|1995-11-23|NONE|AIR|uickly regular +2757|697|60|5|14|22367.66|0.04|0.05|N|O|1995-09-01|1995-08-24|1995-09-03|TAKE BACK RETURN|SHIP|special deposits u +2758|1209|84|1|20|22204.00|0.02|0.04|N|O|1998-07-27|1998-09-10|1998-08-21|TAKE BACK RETURN|AIR|ptotes sleep furiously +2758|229|57|2|17|19196.74|0.10|0.06|N|O|1998-09-25|1998-10-03|1998-10-25|NONE|MAIL| accounts! qui +2758|256|11|3|1|1156.25|0.06|0.02|N|O|1998-10-09|1998-09-15|1998-10-16|NONE|TRUCK|ake furious +2759|590|81|1|10|14905.90|0.10|0.03|R|F|1993-12-14|1994-01-08|1994-01-01|COLLECT COD|FOB|s. busily ironic theodo +2759|1127|100|2|37|38040.44|0.00|0.06|R|F|1994-03-05|1994-02-22|1994-03-18|DELIVER IN PERSON|REG AIR|lar Tiresias affix ironically carefully sp +2759|1117|90|3|11|11199.21|0.03|0.08|A|F|1994-01-24|1994-01-16|1994-02-21|DELIVER IN PERSON|TRUCK|hely regular +2759|228|83|4|31|34974.82|0.02|0.05|A|F|1994-01-11|1994-01-15|1994-01-23|NONE|SHIP|ithely aft +2784|324|81|1|45|55094.40|0.03|0.01|N|O|1998-02-15|1998-04-07|1998-02-26|COLLECT COD|AIR|yly along the asymptotes. reque +2784|536|37|2|23|33040.19|0.03|0.05|N|O|1998-03-28|1998-02-07|1998-04-17|DELIVER IN PERSON|AIR|uests lose after +2784|1748|33|3|40|65989.60|0.07|0.01|N|O|1998-04-28|1998-03-19|1998-05-03|DELIVER IN PERSON|TRUCK|deas nag furiously never unusual +2784|281|82|4|3|3543.84|0.04|0.03|N|O|1998-01-19|1998-04-05|1998-02-05|TAKE BACK RETURN|AIR|n packages. foxes haggle quickly sile +2785|991|60|1|34|64327.66|0.08|0.06|N|O|1995-08-07|1995-09-09|1995-09-05|NONE|RAIL|ly final packages haggl +2785|1098|4|2|37|36966.33|0.08|0.04|N|O|1995-07-25|1995-09-12|1995-08-06|DELIVER IN PERSON|TRUCK|tructions. furiously +2785|646|40|3|33|51039.12|0.08|0.06|N|O|1995-10-16|1995-08-24|1995-11-02|DELIVER IN PERSON|MAIL|fter the furiously final p +2785|472|31|4|34|46663.98|0.00|0.02|N|O|1995-09-16|1995-09-09|1995-10-11|COLLECT COD|SHIP|kages wake carefully silent +2786|1356|71|1|15|18860.25|0.03|0.04|A|F|1992-05-19|1992-05-08|1992-05-28|COLLECT COD|TRUCK|low deposits are ironic +2786|502|93|2|42|58905.00|0.10|0.04|R|F|1992-05-15|1992-04-22|1992-05-30|DELIVER IN PERSON|AIR|unts are against the furious +2786|1554|35|3|41|59677.55|0.04|0.05|R|F|1992-07-01|1992-06-04|1992-07-13|COLLECT COD|RAIL|ix requests. bold requests a +2786|227|28|4|24|27053.28|0.05|0.02|A|F|1992-04-04|1992-06-09|1992-05-02|DELIVER IN PERSON|MAIL|ans. slyly unusual platelets detect. unus +2786|495|54|5|43|60006.07|0.06|0.03|R|F|1992-04-22|1992-05-13|1992-04-29|NONE|RAIL|ons. theodolites after +2786|1613|55|6|21|31806.81|0.08|0.00|A|F|1992-05-03|1992-05-01|1992-05-14|COLLECT COD|AIR|slow instructi +2787|325|10|1|4|4901.28|0.04|0.04|N|O|1996-01-26|1995-11-26|1996-02-20|TAKE BACK RETURN|SHIP|ts. instructions nag furiously according +2788|1762|63|1|16|26620.16|0.06|0.06|A|F|1994-10-04|1994-11-25|1994-10-18|DELIVER IN PERSON|AIR| requests wake carefully. carefully si +2789|1625|49|1|16|24425.92|0.03|0.02|N|O|1998-04-18|1998-05-25|1998-05-12|DELIVER IN PERSON|REG AIR|o beans use carefully +2789|229|30|2|41|46298.02|0.02|0.05|N|O|1998-03-20|1998-05-15|1998-03-21|COLLECT COD|MAIL|d packages-- fluffily specia +2789|1759|44|3|33|54804.75|0.06|0.02|N|O|1998-04-21|1998-05-02|1998-04-30|COLLECT COD|TRUCK|deposits. ironic +2789|160|13|4|47|49827.52|0.02|0.04|N|O|1998-03-29|1998-05-05|1998-04-07|NONE|RAIL|usly busy packages wake against the unusual +2789|1967|100|5|23|42986.08|0.02|0.07|N|O|1998-03-25|1998-05-10|1998-04-24|COLLECT COD|RAIL|cording to the careful de +2789|1437|38|6|16|21414.88|0.07|0.03|N|O|1998-05-11|1998-05-08|1998-05-24|TAKE BACK RETURN|RAIL|d the carefully iron +2789|1323|100|7|42|51421.44|0.01|0.00|N|O|1998-04-28|1998-05-17|1998-05-24|TAKE BACK RETURN|AIR|ending packages shoul +2790|1843|44|1|27|47110.68|0.06|0.08|R|F|1994-09-04|1994-09-27|1994-09-16|TAKE BACK RETURN|MAIL|ilent packages cajole. quickly ironic requ +2790|1170|7|2|50|53558.50|0.00|0.06|A|F|1994-12-08|1994-11-17|1994-12-19|NONE|RAIL|fter the regular ideas. f +2790|1832|19|3|19|32942.77|0.06|0.00|R|F|1994-10-23|1994-10-03|1994-10-26|TAKE BACK RETURN|RAIL|uffily even excuses. furiously thin +2790|1965|66|4|24|44807.04|0.07|0.01|A|F|1994-12-04|1994-10-10|1994-12-25|NONE|MAIL|ments. slyly f +2790|1480|81|5|11|15196.28|0.08|0.03|A|F|1994-09-28|1994-11-14|1994-10-04|TAKE BACK RETURN|AIR|lar requests poach slyly foxes +2790|727|60|6|13|21160.36|0.08|0.00|R|F|1994-09-20|1994-10-10|1994-10-20|COLLECT COD|SHIP|n deposits according to the regul +2790|40|16|7|32|30081.28|0.08|0.02|A|F|1994-09-25|1994-10-26|1994-10-01|NONE|SHIP|ully pending +2791|587|88|1|49|72891.42|0.10|0.04|A|F|1995-01-11|1994-11-10|1995-02-08|COLLECT COD|MAIL| accounts sleep at the bold, regular pinto +2791|629|30|2|4|6118.48|0.10|0.08|A|F|1995-01-02|1994-12-28|1995-01-29|NONE|SHIP|slyly bold packages boost. slyly +2791|1323|62|3|44|53870.08|0.08|0.06|R|F|1994-11-17|1994-11-12|1994-12-14|NONE|FOB|heodolites use furio +2791|1559|80|4|24|35053.20|0.04|0.02|R|F|1995-01-30|1994-11-20|1995-02-08|DELIVER IN PERSON|TRUCK|ilent forges. quickly special pinto beans +2791|1046|52|5|8|7576.32|0.02|0.04|R|F|1995-01-30|1994-11-24|1995-02-13|NONE|FOB|se. close ideas alongs +2791|745|42|6|9|14811.66|0.08|0.02|R|F|1994-11-19|1994-12-14|1994-12-10|TAKE BACK RETURN|AIR|pendencies. blithely bold patterns acr +2791|287|69|7|26|30869.28|0.06|0.03|R|F|1995-02-06|1994-12-07|1995-02-23|DELIVER IN PERSON|AIR|uriously special instructio +2816|583|84|1|33|48958.14|0.00|0.07|R|F|1994-10-19|1994-11-10|1994-11-09|NONE|REG AIR|s; slyly even theodo +2816|1414|15|2|4|5261.64|0.05|0.04|R|F|1994-12-11|1994-12-07|1995-01-03|NONE|FOB|. blithely pending id +2816|1205|43|3|4|4424.80|0.02|0.06|R|F|1994-12-12|1994-12-05|1994-12-30|NONE|RAIL| requests print above the final deposits +2817|596|27|1|25|37414.75|0.07|0.01|R|F|1994-04-21|1994-06-20|1994-05-07|DELIVER IN PERSON|FOB|doze blithely. +2817|313|42|2|5|6066.55|0.03|0.04|A|F|1994-05-07|1994-05-31|1994-05-12|TAKE BACK RETURN|AIR|furiously unusual theodolites use furiou +2817|1712|39|3|35|56479.85|0.01|0.07|A|F|1994-05-20|1994-06-03|1994-05-22|COLLECT COD|FOB|gular foxes +2817|1609|10|4|4|6042.40|0.00|0.05|R|F|1994-06-04|1994-06-11|1994-06-10|NONE|TRUCK|n accounts wake across the fluf +2818|1204|16|1|12|13262.40|0.10|0.03|A|F|1995-02-01|1995-03-10|1995-02-16|NONE|AIR|lms. quickly bold asymp +2818|1988|77|2|22|41579.56|0.06|0.07|R|F|1995-02-28|1995-03-10|1995-03-06|TAKE BACK RETURN|RAIL|egrate toward the carefully iron +2818|443|44|3|11|14777.84|0.01|0.06|R|F|1995-02-18|1995-02-11|1995-03-19|TAKE BACK RETURN|TRUCK|ggle across the carefully blithe +2818|398|83|4|32|41548.48|0.08|0.08|R|F|1995-02-04|1995-03-05|1995-02-18|COLLECT COD|REG AIR|arefully! ac +2818|174|53|5|42|45115.14|0.08|0.04|A|F|1995-02-12|1995-02-19|1995-03-13|COLLECT COD|MAIL|ar accounts wake carefully a +2818|907|10|6|7|12655.30|0.06|0.03|R|F|1995-03-24|1995-03-09|1995-04-06|TAKE BACK RETURN|TRUCK|ly according to the r +2819|691|92|1|17|27058.73|0.08|0.08|A|F|1994-07-16|1994-07-15|1994-07-17|TAKE BACK RETURN|RAIL|en deposits above the f +2819|665|59|2|12|18787.92|0.03|0.08|R|F|1994-07-18|1994-06-24|1994-07-28|NONE|MAIL| regular, regular a +2819|50|26|3|28|26601.40|0.03|0.08|R|F|1994-05-09|1994-07-02|1994-05-15|NONE|RAIL|ckages sublate carefully closely regular +2819|1529|30|4|5|7152.60|0.00|0.02|R|F|1994-05-29|1994-06-12|1994-06-28|NONE|TRUCK| fluffily unusual foxes sleep caref +2819|1992|81|5|6|11363.94|0.03|0.01|A|F|1994-07-22|1994-08-02|1994-07-29|NONE|REG AIR|eas after the carefully express pack +2820|1732|59|1|23|37575.79|0.04|0.08|R|F|1994-07-10|1994-08-08|1994-07-21|NONE|MAIL| was furiously. deposits among the ironic +2820|1258|70|2|33|38255.25|0.08|0.06|A|F|1994-07-07|1994-08-17|1994-08-02|DELIVER IN PERSON|AIR|carefully even pinto beans. +2820|1401|19|3|38|49491.20|0.03|0.08|A|F|1994-09-10|1994-08-07|1994-10-07|TAKE BACK RETURN|MAIL|ests despite the carefully unusual a +2820|1963|8|4|40|74598.40|0.06|0.06|A|F|1994-08-08|1994-07-30|1994-08-21|TAKE BACK RETURN|REG AIR|g multipliers. final c +2821|1809|39|1|4|6843.20|0.00|0.00|A|F|1993-09-15|1993-10-02|1993-09-17|TAKE BACK RETURN|TRUCK|nding foxes. +2821|712|77|2|4|6450.84|0.09|0.00|A|F|1993-11-19|1993-09-20|1993-11-27|TAKE BACK RETURN|TRUCK|ual multipliers. final deposits cajol +2821|1637|20|3|27|41543.01|0.01|0.01|A|F|1993-11-27|1993-10-11|1993-12-08|COLLECT COD|TRUCK|requests. blit +2822|1508|49|1|39|54970.50|0.04|0.02|R|F|1993-09-11|1993-08-29|1993-09-18|NONE|MAIL|kly about the sly +2823|858|92|1|45|79148.25|0.03|0.04|N|O|1995-12-28|1995-11-27|1996-01-02|DELIVER IN PERSON|SHIP|furiously special idea +2823|1597|78|2|18|26974.62|0.00|0.03|N|O|1995-11-11|1995-10-30|1995-12-08|TAKE BACK RETURN|TRUCK| final deposits. furiously regular foxes u +2823|1853|97|3|11|19303.35|0.07|0.02|N|O|1995-12-10|1995-11-24|1995-12-21|DELIVER IN PERSON|SHIP|bold requests nag blithely s +2823|1389|66|4|48|61938.24|0.09|0.03|N|O|1995-11-21|1995-10-30|1995-11-27|NONE|SHIP|ously busily slow excus +2823|990|59|5|18|34037.82|0.04|0.06|N|O|1995-11-09|1995-10-30|1995-11-19|NONE|AIR|eas. decoys cajole deposi +2823|1225|100|6|20|22524.40|0.07|0.00|N|O|1995-11-13|1995-12-06|1995-12-07|NONE|MAIL|its sleep between the unusual, ironic pac +2823|851|51|7|12|21022.20|0.02|0.04|N|O|1995-12-22|1995-11-20|1996-01-13|NONE|REG AIR|the slyly ironic dolphins; fin +2848|643|75|1|44|67920.16|0.01|0.05|R|F|1992-04-14|1992-05-09|1992-04-19|DELIVER IN PERSON|MAIL|ions. slyly express instructions n +2848|1645|46|2|8|12373.12|0.07|0.01|A|F|1992-03-21|1992-05-18|1992-04-07|DELIVER IN PERSON|TRUCK|. silent, final ideas sublate packages. ir +2848|1374|13|3|8|10202.96|0.07|0.08|A|F|1992-06-20|1992-04-12|1992-07-09|NONE|SHIP|sly regular foxes. +2848|1250|51|4|34|39142.50|0.02|0.08|A|F|1992-03-15|1992-04-24|1992-04-12|TAKE BACK RETURN|RAIL|ts along the blithely regu +2848|1942|87|5|18|33190.92|0.07|0.03|R|F|1992-04-10|1992-06-01|1992-05-05|DELIVER IN PERSON|TRUCK|osits haggle. stealthily ironic packa +2849|1539|80|1|16|23048.48|0.09|0.08|N|O|1996-05-20|1996-07-23|1996-06-18|NONE|TRUCK|. furiously regular requ +2849|1869|56|2|39|69063.54|0.10|0.03|N|O|1996-05-22|1996-07-18|1996-06-05|TAKE BACK RETURN|SHIP|s sleep furiously silently regul +2849|599|100|3|24|35990.16|0.01|0.05|N|O|1996-06-12|1996-07-10|1996-06-27|TAKE BACK RETURN|AIR|e slyly even asymptotes. slo +2849|543|34|4|48|69289.92|0.05|0.02|N|O|1996-05-03|1996-06-05|1996-05-28|NONE|AIR|mong the carefully regular theodol +2849|273|28|5|30|35198.10|0.10|0.06|N|O|1996-08-24|1996-07-08|1996-09-03|TAKE BACK RETURN|SHIP|ly. carefully silent +2849|687|81|6|30|47630.40|0.06|0.07|N|O|1996-06-20|1996-07-23|1996-07-06|NONE|FOB|yly furiously even id +2850|970|73|1|43|80451.71|0.02|0.05|N|O|1997-01-11|1996-11-03|1997-02-01|COLLECT COD|REG AIR|unusual accounts +2850|1093|99|2|30|29822.70|0.09|0.01|N|O|1996-12-14|1996-11-29|1997-01-03|COLLECT COD|AIR|even ideas. busy pinto beans sleep above t +2850|1048|49|3|49|46502.96|0.09|0.04|N|O|1996-10-07|1996-12-12|1996-10-12|TAKE BACK RETURN|MAIL| slyly unusual req +2850|1984|17|4|4|7543.92|0.04|0.04|N|O|1996-10-28|1996-12-26|1996-11-07|COLLECT COD|RAIL|al deposits cajole carefully quickly +2851|1475|15|1|8|11011.76|0.09|0.03|N|O|1997-11-12|1997-11-22|1997-12-11|NONE|REG AIR|y special theodolites. carefully +2852|1762|47|1|6|9982.56|0.01|0.01|R|F|1993-03-02|1993-04-11|1993-03-11|TAKE BACK RETURN|RAIL| accounts above the furiously un +2852|401|89|2|24|31233.60|0.05|0.07|R|F|1993-01-18|1993-03-13|1993-02-14|DELIVER IN PERSON|MAIL| the blithe +2852|1635|59|3|29|44562.27|0.09|0.05|R|F|1993-04-21|1993-03-22|1993-05-02|COLLECT COD|SHIP|lyly ironi +2852|992|61|4|12|22715.88|0.08|0.02|A|F|1993-02-25|1993-03-24|1993-03-07|TAKE BACK RETURN|TRUCK|le. request +2852|1532|73|5|28|40138.84|0.05|0.03|R|F|1993-02-08|1993-03-30|1993-02-11|NONE|MAIL|e accounts. caref +2853|1389|28|1|14|18065.32|0.07|0.05|R|F|1994-05-16|1994-07-01|1994-05-27|NONE|TRUCK|oach slyly along t +2853|1331|46|2|26|32040.58|0.06|0.01|R|F|1994-06-26|1994-06-05|1994-07-02|TAKE BACK RETURN|MAIL|dolphins wake slyly. blith +2853|1727|70|3|40|65148.80|0.06|0.04|A|F|1994-08-06|1994-06-24|1994-08-29|NONE|RAIL|lyly. pearls cajole. final accounts ca +2853|1313|28|4|20|24286.20|0.02|0.04|A|F|1994-08-30|1994-06-16|1994-09-06|TAKE BACK RETURN|TRUCK|e slyly silent foxes. express deposits sno +2853|359|16|5|1|1259.35|0.08|0.05|R|F|1994-09-01|1994-06-27|1994-09-12|TAKE BACK RETURN|FOB|refully slyly quick packages. final c +2854|1802|32|1|46|78374.80|0.00|0.04|A|F|1994-09-22|1994-08-02|1994-09-30|COLLECT COD|AIR|. furiously regular deposits across th +2854|876|77|2|29|51529.23|0.09|0.07|R|F|1994-07-06|1994-08-26|1994-07-09|COLLECT COD|SHIP|y slyly ironic accounts. foxes haggle slyl +2854|1592|33|3|20|29871.80|0.08|0.01|R|F|1994-09-18|1994-08-03|1994-10-12|COLLECT COD|AIR|rs impress after the deposits. +2854|1695|96|4|34|54287.46|0.06|0.03|A|F|1994-09-06|1994-08-07|1994-09-22|NONE|REG AIR|age carefully +2854|1014|15|5|7|6405.07|0.03|0.06|A|F|1994-09-23|1994-08-14|1994-10-10|DELIVER IN PERSON|REG AIR| the pending +2854|178|5|6|13|14016.21|0.04|0.03|R|F|1994-09-15|1994-08-18|1994-09-19|DELIVER IN PERSON|SHIP| excuses wak +2855|323|80|1|50|61166.00|0.03|0.07|A|F|1993-05-20|1993-06-28|1993-06-16|TAKE BACK RETURN|TRUCK|beans. deposits +2880|341|98|1|40|49653.60|0.09|0.00|A|F|1992-05-26|1992-06-01|1992-05-31|COLLECT COD|TRUCK|even requests. quick +2880|1389|4|2|26|33549.88|0.07|0.07|R|F|1992-04-12|1992-04-15|1992-04-28|NONE|RAIL|ully among the regular warthogs +2880|1145|82|3|42|43937.88|0.01|0.01|R|F|1992-06-17|1992-05-29|1992-07-11|NONE|REG AIR|ions. carefully final accounts are unusual, +2880|177|4|4|46|49549.82|0.02|0.02|A|F|1992-04-21|1992-06-05|1992-05-16|COLLECT COD|RAIL|eep quickly according to t +2881|1794|37|1|16|27132.64|0.02|0.06|A|F|1992-06-21|1992-06-27|1992-07-03|TAKE BACK RETURN|TRUCK|usly bold +2881|92|93|2|1|992.09|0.09|0.03|A|F|1992-05-13|1992-07-21|1992-05-18|COLLECT COD|MAIL|final theodolites. quickly +2881|921|90|3|21|38260.32|0.07|0.03|A|F|1992-05-28|1992-07-03|1992-06-02|TAKE BACK RETURN|SHIP|hely express Tiresias. final dependencies +2881|1399|14|4|7|9102.73|0.06|0.01|R|F|1992-08-03|1992-07-10|1992-08-27|NONE|REG AIR|ironic packages are carefully final ac +2882|38|64|1|14|13132.42|0.09|0.02|N|O|1995-09-28|1995-11-11|1995-10-18|TAKE BACK RETURN|MAIL|kly. even requests w +2882|411|99|2|30|39342.30|0.00|0.00|N|O|1995-10-15|1995-10-13|1995-10-25|NONE|REG AIR|among the furiously even theodolites. regu +2882|1970|15|3|29|54287.13|0.10|0.08|N|O|1995-09-10|1995-11-01|1995-10-02|NONE|TRUCK|kages. furiously ironic +2882|773|70|4|27|45191.79|0.06|0.02|N|O|1995-09-04|1995-11-11|1995-09-12|DELIVER IN PERSON|MAIL|rding to the regu +2882|1339|40|5|32|39690.56|0.07|0.03|N|O|1995-10-21|1995-11-10|1995-11-01|COLLECT COD|RAIL|sts. quickly regular e +2882|865|66|6|47|82995.42|0.06|0.03|N|O|1995-09-13|1995-09-21|1995-09-14|NONE|REG AIR|l, special +2883|1|27|1|33|29733.00|0.08|0.07|R|F|1995-02-26|1995-03-04|1995-03-01|NONE|RAIL|s. final i +2883|1244|45|2|27|30921.48|0.00|0.02|A|F|1995-03-12|1995-03-10|1995-04-04|TAKE BACK RETURN|REG AIR|s. brave pinto beans nag furiously +2883|1887|17|3|47|84077.36|0.05|0.04|R|F|1995-01-29|1995-04-19|1995-02-05|DELIVER IN PERSON|SHIP|ep carefully ironic +2883|975|78|4|23|43147.31|0.00|0.02|R|F|1995-02-03|1995-03-17|1995-02-19|TAKE BACK RETURN|AIR| even requests cajole. special, regular +2883|1945|34|5|36|66489.84|0.07|0.06|A|F|1995-05-02|1995-03-14|1995-05-30|COLLECT COD|MAIL|ests detect slyly special packages +2884|705|6|1|41|65833.70|0.03|0.00|N|O|1998-01-02|1997-12-17|1998-01-20|DELIVER IN PERSON|TRUCK|ep. slyly even accounts a +2884|1452|70|2|25|33836.25|0.09|0.08|N|O|1998-01-18|1997-12-06|1998-02-16|TAKE BACK RETURN|MAIL|onic theodolites with the instructi +2884|252|53|3|8|9218.00|0.08|0.08|N|O|1997-11-30|1997-11-28|1997-12-14|COLLECT COD|TRUCK|pending accounts about +2885|31|82|1|6|5586.18|0.10|0.01|A|F|1993-01-05|1992-12-12|1993-01-19|COLLECT COD|FOB|ctions solve. slyly regular requests n +2885|1120|21|2|4|4084.48|0.07|0.00|A|F|1992-10-09|1992-12-17|1992-11-04|TAKE BACK RETURN|SHIP| pending packages wake. +2885|8|59|3|45|40860.00|0.10|0.04|A|F|1992-12-24|1992-10-30|1993-01-04|NONE|SHIP|ess ideas. regular, silen +2885|314|71|4|15|18214.65|0.03|0.04|R|F|1992-10-31|1992-11-24|1992-11-21|DELIVER IN PERSON|MAIL|odolites. boldly pending packages han +2885|1742|85|5|43|70680.82|0.06|0.00|R|F|1992-11-17|1992-10-30|1992-12-04|DELIVER IN PERSON|SHIP|cial deposits use bold +2885|1897|27|6|5|8994.45|0.01|0.02|R|F|1993-01-06|1992-11-13|1993-02-05|TAKE BACK RETURN|TRUCK|s. slyly express th +2885|493|81|7|40|55739.60|0.05|0.03|A|F|1992-09-23|1992-11-15|1992-10-07|TAKE BACK RETURN|AIR| express depos +2886|598|99|1|1|1498.59|0.09|0.05|A|F|1995-02-01|1994-12-18|1995-02-28|COLLECT COD|REG AIR|eposits fr +2886|1839|40|2|38|66151.54|0.02|0.04|A|F|1995-01-21|1995-01-08|1995-01-30|NONE|SHIP|old requests along the fur +2886|630|24|3|2|3061.26|0.04|0.07|A|F|1994-11-18|1995-01-31|1994-12-05|COLLECT COD|REG AIR|ar theodolites. e +2886|1300|12|4|46|55259.80|0.03|0.08|A|F|1995-02-02|1995-01-26|1995-02-15|TAKE BACK RETURN|SHIP|ously final packages sleep blithely regular +2887|656|19|1|11|17123.15|0.06|0.00|N|O|1997-07-08|1997-07-17|1997-07-15|COLLECT COD|SHIP|ackages. unusual, speci +2887|1116|53|2|17|17290.87|0.00|0.08|N|O|1997-08-31|1997-07-04|1997-09-17|DELIVER IN PERSON|SHIP|fily final packages. regula +2912|1215|90|1|8|8929.68|0.06|0.04|A|F|1992-04-09|1992-04-19|1992-04-26|NONE|RAIL|hs cajole over the slyl +2912|1146|83|2|18|18848.52|0.00|0.08|R|F|1992-03-13|1992-04-19|1992-03-30|TAKE BACK RETURN|RAIL|unts cajole reg +2913|1228|40|1|39|44039.58|0.06|0.04|N|O|1997-08-28|1997-09-27|1997-09-02|TAKE BACK RETURN|AIR|. final packages a +2913|218|100|2|22|24600.62|0.10|0.07|N|O|1997-09-18|1997-08-11|1997-10-02|COLLECT COD|MAIL|riously pending realms. blithely even pac +2913|1654|78|3|17|26446.05|0.07|0.04|N|O|1997-10-21|1997-09-25|1997-11-20|NONE|FOB|requests doze quickly. furious +2913|1426|27|4|5|6637.10|0.10|0.07|N|O|1997-10-07|1997-08-25|1997-10-09|TAKE BACK RETURN|RAIL|haggle. even, bold instructi +2913|149|76|5|13|13638.82|0.03|0.01|N|O|1997-10-02|1997-08-20|1997-10-26|COLLECT COD|MAIL|inos are carefully alongside of the bol +2913|1678|61|6|35|55288.45|0.06|0.08|N|O|1997-08-30|1997-08-21|1997-09-03|COLLECT COD|MAIL|es. quickly even braids against +2914|657|58|1|22|34268.30|0.05|0.06|R|F|1993-05-11|1993-04-09|1993-05-22|DELIVER IN PERSON|FOB| carefully about the fluffily ironic gifts +2914|1622|5|2|25|38090.50|0.03|0.04|A|F|1993-05-14|1993-04-04|1993-05-22|NONE|SHIP|cross the carefully even accounts. +2914|346|75|3|4|4985.36|0.00|0.05|R|F|1993-06-11|1993-04-09|1993-06-14|TAKE BACK RETURN|SHIP|s integrate. bold deposits sleep req +2914|1204|5|4|9|9946.80|0.06|0.01|R|F|1993-06-17|1993-05-26|1993-06-19|NONE|REG AIR|s. carefully final foxes ar +2915|1742|85|1|28|46024.72|0.10|0.02|R|F|1994-04-17|1994-06-09|1994-05-10|NONE|MAIL|yly special +2915|934|3|2|12|22019.16|0.00|0.03|A|F|1994-07-18|1994-06-11|1994-07-27|TAKE BACK RETURN|RAIL|accounts. slyly final +2915|1355|94|3|15|18845.25|0.07|0.00|A|F|1994-05-01|1994-06-12|1994-05-15|DELIVER IN PERSON|TRUCK|al requests haggle furiousl +2915|802|36|4|43|73220.40|0.06|0.05|R|F|1994-06-02|1994-05-24|1994-06-06|DELIVER IN PERSON|SHIP|into beans dazzle alongside of +2916|826|60|1|21|36263.22|0.06|0.04|N|O|1996-03-11|1996-02-21|1996-03-30|NONE|REG AIR|uickly express ideas over the slyly even +2917|927|28|1|36|65805.12|0.10|0.01|N|O|1998-04-07|1998-02-23|1998-05-01|DELIVER IN PERSON|RAIL|usly ironic d +2917|208|9|2|20|22164.00|0.06|0.03|N|O|1997-12-31|1998-01-22|1998-01-12|NONE|MAIL|slyly even ideas wa +2917|894|94|3|4|7179.56|0.02|0.07|N|O|1998-01-10|1998-01-18|1998-02-08|TAKE BACK RETURN|REG AIR|s. unusual instruct +2917|1669|93|4|5|7853.30|0.05|0.01|N|O|1997-12-16|1998-01-26|1998-01-07|NONE|RAIL|bove the furiously silent packages. pend +2917|405|93|5|37|48299.80|0.04|0.01|N|O|1997-12-12|1998-02-03|1997-12-23|COLLECT COD|RAIL|dependencies. express +2917|1940|73|6|7|12893.58|0.05|0.01|N|O|1998-03-21|1998-03-03|1998-03-25|NONE|REG AIR|ly about the regular accounts. carefully pe +2918|775|40|1|24|40218.48|0.10|0.03|N|O|1996-12-20|1996-10-28|1996-12-26|DELIVER IN PERSON|FOB| quickly. express requests haggle careful +2919|1014|50|1|2|1830.02|0.03|0.05|R|F|1993-12-28|1994-02-23|1994-01-18|COLLECT COD|TRUCK|re slyly. regular ideas detect furiousl +2919|1203|15|2|49|54105.80|0.07|0.02|R|F|1993-12-16|1994-02-28|1993-12-19|COLLECT COD|FOB|hely final inst +2919|456|44|3|44|59683.80|0.07|0.07|A|F|1994-04-01|1994-01-12|1994-04-07|TAKE BACK RETURN|TRUCK|final ideas haggle carefully fluff +2919|1015|51|4|44|40304.44|0.00|0.05|R|F|1994-02-04|1994-02-03|1994-03-02|TAKE BACK RETURN|AIR|es doze around the furiously +2944|1199|100|1|44|48408.36|0.08|0.05|N|O|1997-12-25|1997-10-28|1998-01-21|COLLECT COD|AIR|ickly special theodolit +2944|418|48|2|44|58010.04|0.06|0.02|N|O|1997-10-28|1997-11-22|1997-11-10|NONE|SHIP|ickly. regular requests haggle. idea +2944|1697|21|3|2|3197.38|0.06|0.07|N|O|1997-12-13|1997-12-01|1998-01-08|DELIVER IN PERSON|REG AIR|luffily expr +2944|164|43|4|23|24475.68|0.02|0.03|N|O|1998-01-12|1997-12-03|1998-01-17|TAKE BACK RETURN|MAIL| excuses? regular platelets e +2944|743|8|5|18|29587.32|0.10|0.01|N|O|1998-01-07|1997-10-26|1998-01-27|TAKE BACK RETURN|FOB| furiously slyl +2944|593|84|6|17|25391.03|0.00|0.03|N|O|1997-10-18|1997-11-27|1997-10-29|TAKE BACK RETURN|SHIP|slyly final dolphins sleep silent the +2944|893|27|7|7|12557.23|0.01|0.06|N|O|1997-10-30|1997-11-03|1997-11-03|DELIVER IN PERSON|FOB|fluffily blithely express pea +2945|590|91|1|37|55151.83|0.00|0.02|N|O|1996-02-10|1996-03-20|1996-02-12|COLLECT COD|SHIP|l instructions. regular, regular +2945|713|46|2|30|48411.30|0.05|0.01|N|O|1996-01-19|1996-02-11|1996-01-26|NONE|TRUCK|ular instructions +2945|1262|63|3|28|32571.28|0.06|0.02|N|O|1996-03-17|1996-03-13|1996-04-15|COLLECT COD|FOB|le slyly along the eve +2945|1879|80|4|34|60549.58|0.08|0.06|N|O|1996-02-03|1996-03-17|1996-02-29|COLLECT COD|REG AIR|at the unusual theodolite +2945|1723|50|5|10|16247.20|0.09|0.05|N|O|1996-03-13|1996-03-10|1996-04-06|COLLECT COD|FOB|thely. final courts could hang qu +2945|962|97|6|45|83833.20|0.07|0.00|N|O|1996-03-01|1996-03-25|1996-03-08|TAKE BACK RETURN|MAIL|ainst the final packages +2945|513|44|7|47|66434.97|0.07|0.05|N|O|1996-01-05|1996-02-11|1996-01-12|DELIVER IN PERSON|MAIL|quests use +2946|92|43|1|25|24802.25|0.05|0.02|N|O|1996-05-06|1996-04-23|1996-05-16|DELIVER IN PERSON|SHIP|ic deposits. furiously +2946|932|33|2|48|87980.64|0.03|0.07|N|O|1996-06-02|1996-03-31|1996-06-16|COLLECT COD|TRUCK|oss the platelets. furi +2946|30|56|3|35|32551.05|0.03|0.00|N|O|1996-03-15|1996-04-02|1996-03-26|NONE|REG AIR| sublate along the fluffily iron +2947|100|1|1|37|37003.70|0.09|0.07|N|O|1995-08-09|1995-07-05|1995-08-20|DELIVER IN PERSON|RAIL|e accounts: expres +2947|1853|97|2|10|17548.50|0.09|0.07|A|F|1995-06-07|1995-06-26|1995-06-08|NONE|MAIL|lly special +2948|1175|76|1|48|51656.16|0.00|0.04|R|F|1994-08-29|1994-10-23|1994-09-23|NONE|TRUCK|unusual excuses use about the +2948|918|19|2|49|89126.59|0.04|0.07|R|F|1994-12-16|1994-11-08|1995-01-07|DELIVER IN PERSON|MAIL|ress requests. furiously blithe foxes +2949|202|30|1|4|4408.80|0.06|0.06|A|F|1994-06-07|1994-06-17|1994-07-04|TAKE BACK RETURN|REG AIR|gular pinto beans wake alongside of the reg diff --git a/src/test/singlenode_regress/data/location1.csv b/src/test/singlenode_regress/data/location1.csv new file mode 100644 index 00000000000..d00491fd7e5 --- /dev/null +++ b/src/test/singlenode_regress/data/location1.csv @@ -0,0 +1 @@ +1 diff --git a/src/test/singlenode_regress/data/location2.csv b/src/test/singlenode_regress/data/location2.csv new file mode 100644 index 00000000000..0cfbf08886f --- /dev/null +++ b/src/test/singlenode_regress/data/location2.csv @@ -0,0 +1 @@ +2 diff --git a/src/test/singlenode_regress/data/location3.csv b/src/test/singlenode_regress/data/location3.csv new file mode 100644 index 00000000000..00750edc07d --- /dev/null +++ b/src/test/singlenode_regress/data/location3.csv @@ -0,0 +1 @@ +3 diff --git a/src/test/singlenode_regress/data/mpp17980.data b/src/test/singlenode_regress/data/mpp17980.data new file mode 100644 index 00000000000..cc922ff884c --- /dev/null +++ b/src/test/singlenode_regress/data/mpp17980.data @@ -0,0 +1,18 @@ +1,1,1 +1,2,2 +1,2,3 +1,3,4 +1,2,3 +1,1,1 +1,2,3 +1,2,3 +1,1,1 +1,1,1 +1,2,2 +1,2,3 +1,3,4 +1,2,3 +1,1,1 +1,2,3 +1,2,3 +1,1,1 diff --git a/src/test/singlenode_regress/data/nation.csv b/src/test/singlenode_regress/data/nation.csv new file mode 100644 index 00000000000..ee71b02ea29 --- /dev/null +++ b/src/test/singlenode_regress/data/nation.csv @@ -0,0 +1,25 @@ +0|ALGERIA|0| haggle. carefully final deposits detect slyly agai +1|ARGENTINA|1|al foxes promise slyly according to the regular accounts. bold requests alon +2|BRAZIL|1|y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special +3|CANADA|1|eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold +4|EGYPT|4|y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d +5|ETHIOPIA|0|ven packages wake quickly. regu +6|FRANCE|3|refully final requests. regular, ironi +7|GERMANY|3|l platelets. regular accounts x-ray: unusual, regular acco +8|INDIA|2|ss excuses cajole slyly across the packages. deposits print aroun +9|INDONESIA|2| slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull +10|IRAN|4|efully alongside of the slyly final dependencies. +11|IRAQ|4|nic deposits boost atop the quickly final requests? quickly regula +12|JAPAN|2|ously. final, express gifts cajole a +13|JORDAN|4|ic deposits are blithely about the carefully regular pa +14|KENYA|0| pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t +15|MOROCCO|0|rns. blithely bold courts among the closely regular packages use furiously bold platelets? +16|MOZAMBIQUE|0|s. ironic, unusual asymptotes wake blithely r +17|PERU|1|platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun +18|CHINA|2|c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos +19|ROMANIA|3|ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account +20|SAUDI ARABIA|4|ts. silent requests haggle. closely express packages sleep across the blithely +21|VIETNAM|2|hely enticingly express accounts. even, final +22|RUSSIA|3| requests against the platelets use never according to the quickly regular pint +23|UNITED KINGDOM|3|eans boost carefully special requests. accounts are. carefull +24|UNITED STATES|1|y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be diff --git a/src/test/singlenode_regress/data/nation.tbl b/src/test/singlenode_regress/data/nation.tbl new file mode 100644 index 00000000000..ee71b02ea29 --- /dev/null +++ b/src/test/singlenode_regress/data/nation.tbl @@ -0,0 +1,25 @@ +0|ALGERIA|0| haggle. carefully final deposits detect slyly agai +1|ARGENTINA|1|al foxes promise slyly according to the regular accounts. bold requests alon +2|BRAZIL|1|y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special +3|CANADA|1|eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold +4|EGYPT|4|y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d +5|ETHIOPIA|0|ven packages wake quickly. regu +6|FRANCE|3|refully final requests. regular, ironi +7|GERMANY|3|l platelets. regular accounts x-ray: unusual, regular acco +8|INDIA|2|ss excuses cajole slyly across the packages. deposits print aroun +9|INDONESIA|2| slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull +10|IRAN|4|efully alongside of the slyly final dependencies. +11|IRAQ|4|nic deposits boost atop the quickly final requests? quickly regula +12|JAPAN|2|ously. final, express gifts cajole a +13|JORDAN|4|ic deposits are blithely about the carefully regular pa +14|KENYA|0| pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t +15|MOROCCO|0|rns. blithely bold courts among the closely regular packages use furiously bold platelets? +16|MOZAMBIQUE|0|s. ironic, unusual asymptotes wake blithely r +17|PERU|1|platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun +18|CHINA|2|c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos +19|ROMANIA|3|ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account +20|SAUDI ARABIA|4|ts. silent requests haggle. closely express packages sleep across the blithely +21|VIETNAM|2|hely enticingly express accounts. even, final +22|RUSSIA|3| requests against the platelets use never according to the quickly regular pint +23|UNITED KINGDOM|3|eans boost carefully special requests. accounts are. carefull +24|UNITED STATES|1|y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be diff --git a/src/test/singlenode_regress/data/onek.data b/src/test/singlenode_regress/data/onek.data new file mode 100644 index 00000000000..1605bbec8d5 --- /dev/null +++ b/src/test/singlenode_regress/data/onek.data @@ -0,0 +1,1000 @@ +147 0 1 3 7 7 7 47 147 147 147 14 15 RFAAAA AAAAAA AAAAxx +931 1 1 3 1 11 1 31 131 431 931 2 3 VJAAAA BAAAAA HHHHxx +714 2 0 2 4 14 4 14 114 214 714 8 9 MBAAAA CAAAAA OOOOxx +711 3 1 3 1 11 1 11 111 211 711 2 3 JBAAAA DAAAAA VVVVxx +883 4 1 3 3 3 3 83 83 383 883 6 7 ZHAAAA EAAAAA AAAAxx +439 5 1 3 9 19 9 39 39 439 439 18 19 XQAAAA FAAAAA HHHHxx +670 6 0 2 0 10 0 70 70 170 670 0 1 UZAAAA GAAAAA OOOOxx +543 7 1 3 3 3 3 43 143 43 543 6 7 XUAAAA HAAAAA VVVVxx +425 8 1 1 5 5 5 25 25 425 425 10 11 JQAAAA IAAAAA AAAAxx +800 9 0 0 0 0 0 0 0 300 800 0 1 UEAAAA JAAAAA HHHHxx +489 10 1 1 9 9 9 89 89 489 489 18 19 VSAAAA KAAAAA OOOOxx +494 11 0 2 4 14 4 94 94 494 494 8 9 ATAAAA LAAAAA VVVVxx +880 12 0 0 0 0 0 80 80 380 880 0 1 WHAAAA MAAAAA AAAAxx +611 13 1 3 1 11 1 11 11 111 611 2 3 NXAAAA NAAAAA HHHHxx +226 14 0 2 6 6 6 26 26 226 226 12 13 SIAAAA OAAAAA OOOOxx +774 15 0 2 4 14 4 74 174 274 774 8 9 UDAAAA PAAAAA VVVVxx +298 16 0 2 8 18 8 98 98 298 298 16 17 MLAAAA QAAAAA AAAAxx +682 17 0 2 2 2 2 82 82 182 682 4 5 GAAAAA RAAAAA HHHHxx +864 18 0 0 4 4 4 64 64 364 864 8 9 GHAAAA SAAAAA OOOOxx +183 19 1 3 3 3 3 83 183 183 183 6 7 BHAAAA TAAAAA VVVVxx +885 20 1 1 5 5 5 85 85 385 885 10 11 BIAAAA UAAAAA AAAAxx +997 21 1 1 7 17 7 97 197 497 997 14 15 JMAAAA VAAAAA HHHHxx +966 22 0 2 6 6 6 66 166 466 966 12 13 ELAAAA WAAAAA OOOOxx +389 23 1 1 9 9 9 89 189 389 389 18 19 ZOAAAA XAAAAA VVVVxx +846 24 0 2 6 6 6 46 46 346 846 12 13 OGAAAA YAAAAA AAAAxx +206 25 0 2 6 6 6 6 6 206 206 12 13 YHAAAA ZAAAAA HHHHxx +239 26 1 3 9 19 9 39 39 239 239 18 19 FJAAAA ABAAAA OOOOxx +365 27 1 1 5 5 5 65 165 365 365 10 11 BOAAAA BBAAAA VVVVxx +204 28 0 0 4 4 4 4 4 204 204 8 9 WHAAAA CBAAAA AAAAxx +690 29 0 2 0 10 0 90 90 190 690 0 1 OAAAAA DBAAAA HHHHxx +69 30 1 1 9 9 9 69 69 69 69 18 19 RCAAAA EBAAAA OOOOxx +358 31 0 2 8 18 8 58 158 358 358 16 17 UNAAAA FBAAAA VVVVxx +269 32 1 1 9 9 9 69 69 269 269 18 19 JKAAAA GBAAAA AAAAxx +663 33 1 3 3 3 3 63 63 163 663 6 7 NZAAAA HBAAAA HHHHxx +608 34 0 0 8 8 8 8 8 108 608 16 17 KXAAAA IBAAAA OOOOxx +398 35 0 2 8 18 8 98 198 398 398 16 17 IPAAAA JBAAAA VVVVxx +330 36 0 2 0 10 0 30 130 330 330 0 1 SMAAAA KBAAAA AAAAxx +529 37 1 1 9 9 9 29 129 29 529 18 19 JUAAAA LBAAAA HHHHxx +555 38 1 3 5 15 5 55 155 55 555 10 11 JVAAAA MBAAAA OOOOxx +746 39 0 2 6 6 6 46 146 246 746 12 13 SCAAAA NBAAAA VVVVxx +558 40 0 2 8 18 8 58 158 58 558 16 17 MVAAAA OBAAAA AAAAxx +574 41 0 2 4 14 4 74 174 74 574 8 9 CWAAAA PBAAAA HHHHxx +343 42 1 3 3 3 3 43 143 343 343 6 7 FNAAAA QBAAAA OOOOxx +120 43 0 0 0 0 0 20 120 120 120 0 1 QEAAAA RBAAAA VVVVxx +461 44 1 1 1 1 1 61 61 461 461 2 3 TRAAAA SBAAAA AAAAxx +754 45 0 2 4 14 4 54 154 254 754 8 9 ADAAAA TBAAAA HHHHxx +772 46 0 0 2 12 2 72 172 272 772 4 5 SDAAAA UBAAAA OOOOxx +749 47 1 1 9 9 9 49 149 249 749 18 19 VCAAAA VBAAAA VVVVxx +386 48 0 2 6 6 6 86 186 386 386 12 13 WOAAAA WBAAAA AAAAxx +9 49 1 1 9 9 9 9 9 9 9 18 19 JAAAAA XBAAAA HHHHxx +771 50 1 3 1 11 1 71 171 271 771 2 3 RDAAAA YBAAAA OOOOxx +470 51 0 2 0 10 0 70 70 470 470 0 1 CSAAAA ZBAAAA VVVVxx +238 52 0 2 8 18 8 38 38 238 238 16 17 EJAAAA ACAAAA AAAAxx +86 53 0 2 6 6 6 86 86 86 86 12 13 IDAAAA BCAAAA HHHHxx +56 54 0 0 6 16 6 56 56 56 56 12 13 ECAAAA CCAAAA OOOOxx +767 55 1 3 7 7 7 67 167 267 767 14 15 NDAAAA DCAAAA VVVVxx +363 56 1 3 3 3 3 63 163 363 363 6 7 ZNAAAA ECAAAA AAAAxx +655 57 1 3 5 15 5 55 55 155 655 10 11 FZAAAA FCAAAA HHHHxx +394 58 0 2 4 14 4 94 194 394 394 8 9 EPAAAA GCAAAA OOOOxx +223 59 1 3 3 3 3 23 23 223 223 6 7 PIAAAA HCAAAA VVVVxx +946 60 0 2 6 6 6 46 146 446 946 12 13 KKAAAA ICAAAA AAAAxx +863 61 1 3 3 3 3 63 63 363 863 6 7 FHAAAA JCAAAA HHHHxx +913 62 1 1 3 13 3 13 113 413 913 6 7 DJAAAA KCAAAA OOOOxx +737 63 1 1 7 17 7 37 137 237 737 14 15 JCAAAA LCAAAA VVVVxx +65 64 1 1 5 5 5 65 65 65 65 10 11 NCAAAA MCAAAA AAAAxx +251 65 1 3 1 11 1 51 51 251 251 2 3 RJAAAA NCAAAA HHHHxx +686 66 0 2 6 6 6 86 86 186 686 12 13 KAAAAA OCAAAA OOOOxx +971 67 1 3 1 11 1 71 171 471 971 2 3 JLAAAA PCAAAA VVVVxx +775 68 1 3 5 15 5 75 175 275 775 10 11 VDAAAA QCAAAA AAAAxx +577 69 1 1 7 17 7 77 177 77 577 14 15 FWAAAA RCAAAA HHHHxx +830 70 0 2 0 10 0 30 30 330 830 0 1 YFAAAA SCAAAA OOOOxx +787 71 1 3 7 7 7 87 187 287 787 14 15 HEAAAA TCAAAA VVVVxx +898 72 0 2 8 18 8 98 98 398 898 16 17 OIAAAA UCAAAA AAAAxx +588 73 0 0 8 8 8 88 188 88 588 16 17 QWAAAA VCAAAA HHHHxx +872 74 0 0 2 12 2 72 72 372 872 4 5 OHAAAA WCAAAA OOOOxx +397 75 1 1 7 17 7 97 197 397 397 14 15 HPAAAA XCAAAA VVVVxx +51 76 1 3 1 11 1 51 51 51 51 2 3 ZBAAAA YCAAAA AAAAxx +381 77 1 1 1 1 1 81 181 381 381 2 3 ROAAAA ZCAAAA HHHHxx +632 78 0 0 2 12 2 32 32 132 632 4 5 IYAAAA ADAAAA OOOOxx +31 79 1 3 1 11 1 31 31 31 31 2 3 FBAAAA BDAAAA VVVVxx +855 80 1 3 5 15 5 55 55 355 855 10 11 XGAAAA CDAAAA AAAAxx +699 81 1 3 9 19 9 99 99 199 699 18 19 XAAAAA DDAAAA HHHHxx +562 82 0 2 2 2 2 62 162 62 562 4 5 QVAAAA EDAAAA OOOOxx +681 83 1 1 1 1 1 81 81 181 681 2 3 FAAAAA FDAAAA VVVVxx +585 84 1 1 5 5 5 85 185 85 585 10 11 NWAAAA GDAAAA AAAAxx +35 85 1 3 5 15 5 35 35 35 35 10 11 JBAAAA HDAAAA HHHHxx +962 86 0 2 2 2 2 62 162 462 962 4 5 ALAAAA IDAAAA OOOOxx +282 87 0 2 2 2 2 82 82 282 282 4 5 WKAAAA JDAAAA VVVVxx +254 88 0 2 4 14 4 54 54 254 254 8 9 UJAAAA KDAAAA AAAAxx +514 89 0 2 4 14 4 14 114 14 514 8 9 UTAAAA LDAAAA HHHHxx +406 90 0 2 6 6 6 6 6 406 406 12 13 QPAAAA MDAAAA OOOOxx +544 91 0 0 4 4 4 44 144 44 544 8 9 YUAAAA NDAAAA VVVVxx +704 92 0 0 4 4 4 4 104 204 704 8 9 CBAAAA ODAAAA AAAAxx +948 93 0 0 8 8 8 48 148 448 948 16 17 MKAAAA PDAAAA HHHHxx +412 94 0 0 2 12 2 12 12 412 412 4 5 WPAAAA QDAAAA OOOOxx +200 95 0 0 0 0 0 0 0 200 200 0 1 SHAAAA RDAAAA VVVVxx +583 96 1 3 3 3 3 83 183 83 583 6 7 LWAAAA SDAAAA AAAAxx +486 97 0 2 6 6 6 86 86 486 486 12 13 SSAAAA TDAAAA HHHHxx +666 98 0 2 6 6 6 66 66 166 666 12 13 QZAAAA UDAAAA OOOOxx +436 99 0 0 6 16 6 36 36 436 436 12 13 UQAAAA VDAAAA VVVVxx +842 100 0 2 2 2 2 42 42 342 842 4 5 KGAAAA WDAAAA AAAAxx +99 101 1 3 9 19 9 99 99 99 99 18 19 VDAAAA XDAAAA HHHHxx +656 102 0 0 6 16 6 56 56 156 656 12 13 GZAAAA YDAAAA OOOOxx +673 103 1 1 3 13 3 73 73 173 673 6 7 XZAAAA ZDAAAA VVVVxx +371 104 1 3 1 11 1 71 171 371 371 2 3 HOAAAA AEAAAA AAAAxx +869 105 1 1 9 9 9 69 69 369 869 18 19 LHAAAA BEAAAA HHHHxx +569 106 1 1 9 9 9 69 169 69 569 18 19 XVAAAA CEAAAA OOOOxx +616 107 0 0 6 16 6 16 16 116 616 12 13 SXAAAA DEAAAA VVVVxx +612 108 0 0 2 12 2 12 12 112 612 4 5 OXAAAA EEAAAA AAAAxx +505 109 1 1 5 5 5 5 105 5 505 10 11 LTAAAA FEAAAA HHHHxx +922 110 0 2 2 2 2 22 122 422 922 4 5 MJAAAA GEAAAA OOOOxx +221 111 1 1 1 1 1 21 21 221 221 2 3 NIAAAA HEAAAA VVVVxx +388 112 0 0 8 8 8 88 188 388 388 16 17 YOAAAA IEAAAA AAAAxx +567 113 1 3 7 7 7 67 167 67 567 14 15 VVAAAA JEAAAA HHHHxx +58 114 0 2 8 18 8 58 58 58 58 16 17 GCAAAA KEAAAA OOOOxx +316 115 0 0 6 16 6 16 116 316 316 12 13 EMAAAA LEAAAA VVVVxx +659 116 1 3 9 19 9 59 59 159 659 18 19 JZAAAA MEAAAA AAAAxx +501 117 1 1 1 1 1 1 101 1 501 2 3 HTAAAA NEAAAA HHHHxx +815 118 1 3 5 15 5 15 15 315 815 10 11 JFAAAA OEAAAA OOOOxx +638 119 0 2 8 18 8 38 38 138 638 16 17 OYAAAA PEAAAA VVVVxx +696 120 0 0 6 16 6 96 96 196 696 12 13 UAAAAA QEAAAA AAAAxx +734 121 0 2 4 14 4 34 134 234 734 8 9 GCAAAA REAAAA HHHHxx +237 122 1 1 7 17 7 37 37 237 237 14 15 DJAAAA SEAAAA OOOOxx +816 123 0 0 6 16 6 16 16 316 816 12 13 KFAAAA TEAAAA VVVVxx +917 124 1 1 7 17 7 17 117 417 917 14 15 HJAAAA UEAAAA AAAAxx +844 125 0 0 4 4 4 44 44 344 844 8 9 MGAAAA VEAAAA HHHHxx +657 126 1 1 7 17 7 57 57 157 657 14 15 HZAAAA WEAAAA OOOOxx +952 127 0 0 2 12 2 52 152 452 952 4 5 QKAAAA XEAAAA VVVVxx +519 128 1 3 9 19 9 19 119 19 519 18 19 ZTAAAA YEAAAA AAAAxx +792 129 0 0 2 12 2 92 192 292 792 4 5 MEAAAA ZEAAAA HHHHxx +275 130 1 3 5 15 5 75 75 275 275 10 11 PKAAAA AFAAAA OOOOxx +319 131 1 3 9 19 9 19 119 319 319 18 19 HMAAAA BFAAAA VVVVxx +487 132 1 3 7 7 7 87 87 487 487 14 15 TSAAAA CFAAAA AAAAxx +945 133 1 1 5 5 5 45 145 445 945 10 11 JKAAAA DFAAAA HHHHxx +584 134 0 0 4 4 4 84 184 84 584 8 9 MWAAAA EFAAAA OOOOxx +765 135 1 1 5 5 5 65 165 265 765 10 11 LDAAAA FFAAAA VVVVxx +814 136 0 2 4 14 4 14 14 314 814 8 9 IFAAAA GFAAAA AAAAxx +359 137 1 3 9 19 9 59 159 359 359 18 19 VNAAAA HFAAAA HHHHxx +548 138 0 0 8 8 8 48 148 48 548 16 17 CVAAAA IFAAAA OOOOxx +811 139 1 3 1 11 1 11 11 311 811 2 3 FFAAAA JFAAAA VVVVxx +531 140 1 3 1 11 1 31 131 31 531 2 3 LUAAAA KFAAAA AAAAxx +104 141 0 0 4 4 4 4 104 104 104 8 9 AEAAAA LFAAAA HHHHxx +33 142 1 1 3 13 3 33 33 33 33 6 7 HBAAAA MFAAAA OOOOxx +404 143 0 0 4 4 4 4 4 404 404 8 9 OPAAAA NFAAAA VVVVxx +995 144 1 3 5 15 5 95 195 495 995 10 11 HMAAAA OFAAAA AAAAxx +408 145 0 0 8 8 8 8 8 408 408 16 17 SPAAAA PFAAAA HHHHxx +93 146 1 1 3 13 3 93 93 93 93 6 7 PDAAAA QFAAAA OOOOxx +794 147 0 2 4 14 4 94 194 294 794 8 9 OEAAAA RFAAAA VVVVxx +833 148 1 1 3 13 3 33 33 333 833 6 7 BGAAAA SFAAAA AAAAxx +615 149 1 3 5 15 5 15 15 115 615 10 11 RXAAAA TFAAAA HHHHxx +333 150 1 1 3 13 3 33 133 333 333 6 7 VMAAAA UFAAAA OOOOxx +357 151 1 1 7 17 7 57 157 357 357 14 15 TNAAAA VFAAAA VVVVxx +999 152 1 3 9 19 9 99 199 499 999 18 19 LMAAAA WFAAAA AAAAxx +515 153 1 3 5 15 5 15 115 15 515 10 11 VTAAAA XFAAAA HHHHxx +685 154 1 1 5 5 5 85 85 185 685 10 11 JAAAAA YFAAAA OOOOxx +692 155 0 0 2 12 2 92 92 192 692 4 5 QAAAAA ZFAAAA VVVVxx +627 156 1 3 7 7 7 27 27 127 627 14 15 DYAAAA AGAAAA AAAAxx +654 157 0 2 4 14 4 54 54 154 654 8 9 EZAAAA BGAAAA HHHHxx +115 158 1 3 5 15 5 15 115 115 115 10 11 LEAAAA CGAAAA OOOOxx +75 159 1 3 5 15 5 75 75 75 75 10 11 XCAAAA DGAAAA VVVVxx +14 160 0 2 4 14 4 14 14 14 14 8 9 OAAAAA EGAAAA AAAAxx +148 161 0 0 8 8 8 48 148 148 148 16 17 SFAAAA FGAAAA HHHHxx +201 162 1 1 1 1 1 1 1 201 201 2 3 THAAAA GGAAAA OOOOxx +862 163 0 2 2 2 2 62 62 362 862 4 5 EHAAAA HGAAAA VVVVxx +634 164 0 2 4 14 4 34 34 134 634 8 9 KYAAAA IGAAAA AAAAxx +589 165 1 1 9 9 9 89 189 89 589 18 19 RWAAAA JGAAAA HHHHxx +142 166 0 2 2 2 2 42 142 142 142 4 5 MFAAAA KGAAAA OOOOxx +545 167 1 1 5 5 5 45 145 45 545 10 11 ZUAAAA LGAAAA VVVVxx +983 168 1 3 3 3 3 83 183 483 983 6 7 VLAAAA MGAAAA AAAAxx +87 169 1 3 7 7 7 87 87 87 87 14 15 JDAAAA NGAAAA HHHHxx +335 170 1 3 5 15 5 35 135 335 335 10 11 XMAAAA OGAAAA OOOOxx +915 171 1 3 5 15 5 15 115 415 915 10 11 FJAAAA PGAAAA VVVVxx +286 172 0 2 6 6 6 86 86 286 286 12 13 ALAAAA QGAAAA AAAAxx +361 173 1 1 1 1 1 61 161 361 361 2 3 XNAAAA RGAAAA HHHHxx +97 174 1 1 7 17 7 97 97 97 97 14 15 TDAAAA SGAAAA OOOOxx +98 175 0 2 8 18 8 98 98 98 98 16 17 UDAAAA TGAAAA VVVVxx +377 176 1 1 7 17 7 77 177 377 377 14 15 NOAAAA UGAAAA AAAAxx +525 177 1 1 5 5 5 25 125 25 525 10 11 FUAAAA VGAAAA HHHHxx +448 178 0 0 8 8 8 48 48 448 448 16 17 GRAAAA WGAAAA OOOOxx +154 179 0 2 4 14 4 54 154 154 154 8 9 YFAAAA XGAAAA VVVVxx +866 180 0 2 6 6 6 66 66 366 866 12 13 IHAAAA YGAAAA AAAAxx +741 181 1 1 1 1 1 41 141 241 741 2 3 NCAAAA ZGAAAA HHHHxx +172 182 0 0 2 12 2 72 172 172 172 4 5 QGAAAA AHAAAA OOOOxx +843 183 1 3 3 3 3 43 43 343 843 6 7 LGAAAA BHAAAA VVVVxx +378 184 0 2 8 18 8 78 178 378 378 16 17 OOAAAA CHAAAA AAAAxx +804 185 0 0 4 4 4 4 4 304 804 8 9 YEAAAA DHAAAA HHHHxx +596 186 0 0 6 16 6 96 196 96 596 12 13 YWAAAA EHAAAA OOOOxx +77 187 1 1 7 17 7 77 77 77 77 14 15 ZCAAAA FHAAAA VVVVxx +572 188 0 0 2 12 2 72 172 72 572 4 5 AWAAAA GHAAAA AAAAxx +444 189 0 0 4 4 4 44 44 444 444 8 9 CRAAAA HHAAAA HHHHxx +47 190 1 3 7 7 7 47 47 47 47 14 15 VBAAAA IHAAAA OOOOxx +274 191 0 2 4 14 4 74 74 274 274 8 9 OKAAAA JHAAAA VVVVxx +40 192 0 0 0 0 0 40 40 40 40 0 1 OBAAAA KHAAAA AAAAxx +339 193 1 3 9 19 9 39 139 339 339 18 19 BNAAAA LHAAAA HHHHxx +13 194 1 1 3 13 3 13 13 13 13 6 7 NAAAAA MHAAAA OOOOxx +878 195 0 2 8 18 8 78 78 378 878 16 17 UHAAAA NHAAAA VVVVxx +53 196 1 1 3 13 3 53 53 53 53 6 7 BCAAAA OHAAAA AAAAxx +939 197 1 3 9 19 9 39 139 439 939 18 19 DKAAAA PHAAAA HHHHxx +928 198 0 0 8 8 8 28 128 428 928 16 17 SJAAAA QHAAAA OOOOxx +886 199 0 2 6 6 6 86 86 386 886 12 13 CIAAAA RHAAAA VVVVxx +267 200 1 3 7 7 7 67 67 267 267 14 15 HKAAAA SHAAAA AAAAxx +105 201 1 1 5 5 5 5 105 105 105 10 11 BEAAAA THAAAA HHHHxx +312 202 0 0 2 12 2 12 112 312 312 4 5 AMAAAA UHAAAA OOOOxx +552 203 0 0 2 12 2 52 152 52 552 4 5 GVAAAA VHAAAA VVVVxx +918 204 0 2 8 18 8 18 118 418 918 16 17 IJAAAA WHAAAA AAAAxx +114 205 0 2 4 14 4 14 114 114 114 8 9 KEAAAA XHAAAA HHHHxx +805 206 1 1 5 5 5 5 5 305 805 10 11 ZEAAAA YHAAAA OOOOxx +875 207 1 3 5 15 5 75 75 375 875 10 11 RHAAAA ZHAAAA VVVVxx +225 208 1 1 5 5 5 25 25 225 225 10 11 RIAAAA AIAAAA AAAAxx +495 209 1 3 5 15 5 95 95 495 495 10 11 BTAAAA BIAAAA HHHHxx +150 210 0 2 0 10 0 50 150 150 150 0 1 UFAAAA CIAAAA OOOOxx +759 211 1 3 9 19 9 59 159 259 759 18 19 FDAAAA DIAAAA VVVVxx +149 212 1 1 9 9 9 49 149 149 149 18 19 TFAAAA EIAAAA AAAAxx +480 213 0 0 0 0 0 80 80 480 480 0 1 MSAAAA FIAAAA HHHHxx +1 214 1 1 1 1 1 1 1 1 1 2 3 BAAAAA GIAAAA OOOOxx +557 215 1 1 7 17 7 57 157 57 557 14 15 LVAAAA HIAAAA VVVVxx +295 216 1 3 5 15 5 95 95 295 295 10 11 JLAAAA IIAAAA AAAAxx +854 217 0 2 4 14 4 54 54 354 854 8 9 WGAAAA JIAAAA HHHHxx +420 218 0 0 0 0 0 20 20 420 420 0 1 EQAAAA KIAAAA OOOOxx +414 219 0 2 4 14 4 14 14 414 414 8 9 YPAAAA LIAAAA VVVVxx +758 220 0 2 8 18 8 58 158 258 758 16 17 EDAAAA MIAAAA AAAAxx +879 221 1 3 9 19 9 79 79 379 879 18 19 VHAAAA NIAAAA HHHHxx +332 222 0 0 2 12 2 32 132 332 332 4 5 UMAAAA OIAAAA OOOOxx +78 223 0 2 8 18 8 78 78 78 78 16 17 ADAAAA PIAAAA VVVVxx +851 224 1 3 1 11 1 51 51 351 851 2 3 TGAAAA QIAAAA AAAAxx +592 225 0 0 2 12 2 92 192 92 592 4 5 UWAAAA RIAAAA HHHHxx +979 226 1 3 9 19 9 79 179 479 979 18 19 RLAAAA SIAAAA OOOOxx +989 227 1 1 9 9 9 89 189 489 989 18 19 BMAAAA TIAAAA VVVVxx +752 228 0 0 2 12 2 52 152 252 752 4 5 YCAAAA UIAAAA AAAAxx +214 229 0 2 4 14 4 14 14 214 214 8 9 GIAAAA VIAAAA HHHHxx +453 230 1 1 3 13 3 53 53 453 453 6 7 LRAAAA WIAAAA OOOOxx +540 231 0 0 0 0 0 40 140 40 540 0 1 UUAAAA XIAAAA VVVVxx +597 232 1 1 7 17 7 97 197 97 597 14 15 ZWAAAA YIAAAA AAAAxx +356 233 0 0 6 16 6 56 156 356 356 12 13 SNAAAA ZIAAAA HHHHxx +720 234 0 0 0 0 0 20 120 220 720 0 1 SBAAAA AJAAAA OOOOxx +367 235 1 3 7 7 7 67 167 367 367 14 15 DOAAAA BJAAAA VVVVxx +762 236 0 2 2 2 2 62 162 262 762 4 5 IDAAAA CJAAAA AAAAxx +986 237 0 2 6 6 6 86 186 486 986 12 13 YLAAAA DJAAAA HHHHxx +924 238 0 0 4 4 4 24 124 424 924 8 9 OJAAAA EJAAAA OOOOxx +779 239 1 3 9 19 9 79 179 279 779 18 19 ZDAAAA FJAAAA VVVVxx +684 240 0 0 4 4 4 84 84 184 684 8 9 IAAAAA GJAAAA AAAAxx +413 241 1 1 3 13 3 13 13 413 413 6 7 XPAAAA HJAAAA HHHHxx +479 242 1 3 9 19 9 79 79 479 479 18 19 LSAAAA IJAAAA OOOOxx +731 243 1 3 1 11 1 31 131 231 731 2 3 DCAAAA JJAAAA VVVVxx +409 244 1 1 9 9 9 9 9 409 409 18 19 TPAAAA KJAAAA AAAAxx +372 245 0 0 2 12 2 72 172 372 372 4 5 IOAAAA LJAAAA HHHHxx +139 246 1 3 9 19 9 39 139 139 139 18 19 JFAAAA MJAAAA OOOOxx +717 247 1 1 7 17 7 17 117 217 717 14 15 PBAAAA NJAAAA VVVVxx +539 248 1 3 9 19 9 39 139 39 539 18 19 TUAAAA OJAAAA AAAAxx +318 249 0 2 8 18 8 18 118 318 318 16 17 GMAAAA PJAAAA HHHHxx +208 250 0 0 8 8 8 8 8 208 208 16 17 AIAAAA QJAAAA OOOOxx +797 251 1 1 7 17 7 97 197 297 797 14 15 REAAAA RJAAAA VVVVxx +661 252 1 1 1 1 1 61 61 161 661 2 3 LZAAAA SJAAAA AAAAxx +50 253 0 2 0 10 0 50 50 50 50 0 1 YBAAAA TJAAAA HHHHxx +102 254 0 2 2 2 2 2 102 102 102 4 5 YDAAAA UJAAAA OOOOxx +484 255 0 0 4 4 4 84 84 484 484 8 9 QSAAAA VJAAAA VVVVxx +108 256 0 0 8 8 8 8 108 108 108 16 17 EEAAAA WJAAAA AAAAxx +140 257 0 0 0 0 0 40 140 140 140 0 1 KFAAAA XJAAAA HHHHxx +996 258 0 0 6 16 6 96 196 496 996 12 13 IMAAAA YJAAAA OOOOxx +687 259 1 3 7 7 7 87 87 187 687 14 15 LAAAAA ZJAAAA VVVVxx +241 260 1 1 1 1 1 41 41 241 241 2 3 HJAAAA AKAAAA AAAAxx +923 261 1 3 3 3 3 23 123 423 923 6 7 NJAAAA BKAAAA HHHHxx +500 262 0 0 0 0 0 0 100 0 500 0 1 GTAAAA CKAAAA OOOOxx +536 263 0 0 6 16 6 36 136 36 536 12 13 QUAAAA DKAAAA VVVVxx +490 264 0 2 0 10 0 90 90 490 490 0 1 WSAAAA EKAAAA AAAAxx +773 265 1 1 3 13 3 73 173 273 773 6 7 TDAAAA FKAAAA HHHHxx +19 266 1 3 9 19 9 19 19 19 19 18 19 TAAAAA GKAAAA OOOOxx +534 267 0 2 4 14 4 34 134 34 534 8 9 OUAAAA HKAAAA VVVVxx +941 268 1 1 1 1 1 41 141 441 941 2 3 FKAAAA IKAAAA AAAAxx +477 269 1 1 7 17 7 77 77 477 477 14 15 JSAAAA JKAAAA HHHHxx +173 270 1 1 3 13 3 73 173 173 173 6 7 RGAAAA KKAAAA OOOOxx +113 271 1 1 3 13 3 13 113 113 113 6 7 JEAAAA LKAAAA VVVVxx +526 272 0 2 6 6 6 26 126 26 526 12 13 GUAAAA MKAAAA AAAAxx +727 273 1 3 7 7 7 27 127 227 727 14 15 ZBAAAA NKAAAA HHHHxx +302 274 0 2 2 2 2 2 102 302 302 4 5 QLAAAA OKAAAA OOOOxx +789 275 1 1 9 9 9 89 189 289 789 18 19 JEAAAA PKAAAA VVVVxx +447 276 1 3 7 7 7 47 47 447 447 14 15 FRAAAA QKAAAA AAAAxx +884 277 0 0 4 4 4 84 84 384 884 8 9 AIAAAA RKAAAA HHHHxx +718 278 0 2 8 18 8 18 118 218 718 16 17 QBAAAA SKAAAA OOOOxx +818 279 0 2 8 18 8 18 18 318 818 16 17 MFAAAA TKAAAA VVVVxx +466 280 0 2 6 6 6 66 66 466 466 12 13 YRAAAA UKAAAA AAAAxx +131 281 1 3 1 11 1 31 131 131 131 2 3 BFAAAA VKAAAA HHHHxx +503 282 1 3 3 3 3 3 103 3 503 6 7 JTAAAA WKAAAA OOOOxx +364 283 0 0 4 4 4 64 164 364 364 8 9 AOAAAA XKAAAA VVVVxx +934 284 0 2 4 14 4 34 134 434 934 8 9 YJAAAA YKAAAA AAAAxx +542 285 0 2 2 2 2 42 142 42 542 4 5 WUAAAA ZKAAAA HHHHxx +146 286 0 2 6 6 6 46 146 146 146 12 13 QFAAAA ALAAAA OOOOxx +652 287 0 0 2 12 2 52 52 152 652 4 5 CZAAAA BLAAAA VVVVxx +566 288 0 2 6 6 6 66 166 66 566 12 13 UVAAAA CLAAAA AAAAxx +788 289 0 0 8 8 8 88 188 288 788 16 17 IEAAAA DLAAAA HHHHxx +168 290 0 0 8 8 8 68 168 168 168 16 17 MGAAAA ELAAAA OOOOxx +736 291 0 0 6 16 6 36 136 236 736 12 13 ICAAAA FLAAAA VVVVxx +795 292 1 3 5 15 5 95 195 295 795 10 11 PEAAAA GLAAAA AAAAxx +103 293 1 3 3 3 3 3 103 103 103 6 7 ZDAAAA HLAAAA HHHHxx +763 294 1 3 3 3 3 63 163 263 763 6 7 JDAAAA ILAAAA OOOOxx +256 295 0 0 6 16 6 56 56 256 256 12 13 WJAAAA JLAAAA VVVVxx +63 296 1 3 3 3 3 63 63 63 63 6 7 LCAAAA KLAAAA AAAAxx +702 297 0 2 2 2 2 2 102 202 702 4 5 ABAAAA LLAAAA HHHHxx +390 298 0 2 0 10 0 90 190 390 390 0 1 APAAAA MLAAAA OOOOxx +116 299 0 0 6 16 6 16 116 116 116 12 13 MEAAAA NLAAAA VVVVxx +354 300 0 2 4 14 4 54 154 354 354 8 9 QNAAAA OLAAAA AAAAxx +162 301 0 2 2 2 2 62 162 162 162 4 5 GGAAAA PLAAAA HHHHxx +71 302 1 3 1 11 1 71 71 71 71 2 3 TCAAAA QLAAAA OOOOxx +916 303 0 0 6 16 6 16 116 416 916 12 13 GJAAAA RLAAAA VVVVxx +565 304 1 1 5 5 5 65 165 65 565 10 11 TVAAAA SLAAAA AAAAxx +509 305 1 1 9 9 9 9 109 9 509 18 19 PTAAAA TLAAAA HHHHxx +20 306 0 0 0 0 0 20 20 20 20 0 1 UAAAAA ULAAAA OOOOxx +813 307 1 1 3 13 3 13 13 313 813 6 7 HFAAAA VLAAAA VVVVxx +80 308 0 0 0 0 0 80 80 80 80 0 1 CDAAAA WLAAAA AAAAxx +400 309 0 0 0 0 0 0 0 400 400 0 1 KPAAAA XLAAAA HHHHxx +888 310 0 0 8 8 8 88 88 388 888 16 17 EIAAAA YLAAAA OOOOxx +825 311 1 1 5 5 5 25 25 325 825 10 11 TFAAAA ZLAAAA VVVVxx +401 312 1 1 1 1 1 1 1 401 401 2 3 LPAAAA AMAAAA AAAAxx +158 313 0 2 8 18 8 58 158 158 158 16 17 CGAAAA BMAAAA HHHHxx +973 314 1 1 3 13 3 73 173 473 973 6 7 LLAAAA CMAAAA OOOOxx +324 315 0 0 4 4 4 24 124 324 324 8 9 MMAAAA DMAAAA VVVVxx +873 316 1 1 3 13 3 73 73 373 873 6 7 PHAAAA EMAAAA AAAAxx +676 317 0 0 6 16 6 76 76 176 676 12 13 AAAAAA FMAAAA HHHHxx +199 318 1 3 9 19 9 99 199 199 199 18 19 RHAAAA GMAAAA OOOOxx +304 319 0 0 4 4 4 4 104 304 304 8 9 SLAAAA HMAAAA VVVVxx +338 320 0 2 8 18 8 38 138 338 338 16 17 ANAAAA IMAAAA AAAAxx +743 321 1 3 3 3 3 43 143 243 743 6 7 PCAAAA JMAAAA HHHHxx +730 322 0 2 0 10 0 30 130 230 730 0 1 CCAAAA KMAAAA OOOOxx +130 323 0 2 0 10 0 30 130 130 130 0 1 AFAAAA LMAAAA VVVVxx +224 324 0 0 4 4 4 24 24 224 224 8 9 QIAAAA MMAAAA AAAAxx +216 325 0 0 6 16 6 16 16 216 216 12 13 IIAAAA NMAAAA HHHHxx +2 326 0 2 2 2 2 2 2 2 2 4 5 CAAAAA OMAAAA OOOOxx +836 327 0 0 6 16 6 36 36 336 836 12 13 EGAAAA PMAAAA VVVVxx +443 328 1 3 3 3 3 43 43 443 443 6 7 BRAAAA QMAAAA AAAAxx +777 329 1 1 7 17 7 77 177 277 777 14 15 XDAAAA RMAAAA HHHHxx +126 330 0 2 6 6 6 26 126 126 126 12 13 WEAAAA SMAAAA OOOOxx +117 331 1 1 7 17 7 17 117 117 117 14 15 NEAAAA TMAAAA VVVVxx +633 332 1 1 3 13 3 33 33 133 633 6 7 JYAAAA UMAAAA AAAAxx +310 333 0 2 0 10 0 10 110 310 310 0 1 YLAAAA VMAAAA HHHHxx +622 334 0 2 2 2 2 22 22 122 622 4 5 YXAAAA WMAAAA OOOOxx +268 335 0 0 8 8 8 68 68 268 268 16 17 IKAAAA XMAAAA VVVVxx +384 336 0 0 4 4 4 84 184 384 384 8 9 UOAAAA YMAAAA AAAAxx +460 337 0 0 0 0 0 60 60 460 460 0 1 SRAAAA ZMAAAA HHHHxx +475 338 1 3 5 15 5 75 75 475 475 10 11 HSAAAA ANAAAA OOOOxx +624 339 0 0 4 4 4 24 24 124 624 8 9 AYAAAA BNAAAA VVVVxx +826 340 0 2 6 6 6 26 26 326 826 12 13 UFAAAA CNAAAA AAAAxx +680 341 0 0 0 0 0 80 80 180 680 0 1 EAAAAA DNAAAA HHHHxx +306 342 0 2 6 6 6 6 106 306 306 12 13 ULAAAA ENAAAA OOOOxx +896 343 0 0 6 16 6 96 96 396 896 12 13 MIAAAA FNAAAA VVVVxx +30 344 0 2 0 10 0 30 30 30 30 0 1 EBAAAA GNAAAA AAAAxx +576 345 0 0 6 16 6 76 176 76 576 12 13 EWAAAA HNAAAA HHHHxx +551 346 1 3 1 11 1 51 151 51 551 2 3 FVAAAA INAAAA OOOOxx +639 347 1 3 9 19 9 39 39 139 639 18 19 PYAAAA JNAAAA VVVVxx +975 348 1 3 5 15 5 75 175 475 975 10 11 NLAAAA KNAAAA AAAAxx +882 349 0 2 2 2 2 82 82 382 882 4 5 YHAAAA LNAAAA HHHHxx +160 350 0 0 0 0 0 60 160 160 160 0 1 EGAAAA MNAAAA OOOOxx +522 351 0 2 2 2 2 22 122 22 522 4 5 CUAAAA NNAAAA VVVVxx +620 352 0 0 0 0 0 20 20 120 620 0 1 WXAAAA ONAAAA AAAAxx +719 353 1 3 9 19 9 19 119 219 719 18 19 RBAAAA PNAAAA HHHHxx +88 354 0 0 8 8 8 88 88 88 88 16 17 KDAAAA QNAAAA OOOOxx +614 355 0 2 4 14 4 14 14 114 614 8 9 QXAAAA RNAAAA VVVVxx +54 356 0 2 4 14 4 54 54 54 54 8 9 CCAAAA SNAAAA AAAAxx +209 357 1 1 9 9 9 9 9 209 209 18 19 BIAAAA TNAAAA HHHHxx +67 358 1 3 7 7 7 67 67 67 67 14 15 PCAAAA UNAAAA OOOOxx +809 359 1 1 9 9 9 9 9 309 809 18 19 DFAAAA VNAAAA VVVVxx +982 360 0 2 2 2 2 82 182 482 982 4 5 ULAAAA WNAAAA AAAAxx +817 361 1 1 7 17 7 17 17 317 817 14 15 LFAAAA XNAAAA HHHHxx +187 362 1 3 7 7 7 87 187 187 187 14 15 FHAAAA YNAAAA OOOOxx +992 363 0 0 2 12 2 92 192 492 992 4 5 EMAAAA ZNAAAA VVVVxx +580 364 0 0 0 0 0 80 180 80 580 0 1 IWAAAA AOAAAA AAAAxx +658 365 0 2 8 18 8 58 58 158 658 16 17 IZAAAA BOAAAA HHHHxx +222 366 0 2 2 2 2 22 22 222 222 4 5 OIAAAA COAAAA OOOOxx +667 367 1 3 7 7 7 67 67 167 667 14 15 RZAAAA DOAAAA VVVVxx +715 368 1 3 5 15 5 15 115 215 715 10 11 NBAAAA EOAAAA AAAAxx +990 369 0 2 0 10 0 90 190 490 990 0 1 CMAAAA FOAAAA HHHHxx +22 370 0 2 2 2 2 22 22 22 22 4 5 WAAAAA GOAAAA OOOOxx +362 371 0 2 2 2 2 62 162 362 362 4 5 YNAAAA HOAAAA VVVVxx +376 372 0 0 6 16 6 76 176 376 376 12 13 MOAAAA IOAAAA AAAAxx +246 373 0 2 6 6 6 46 46 246 246 12 13 MJAAAA JOAAAA HHHHxx +300 374 0 0 0 0 0 0 100 300 300 0 1 OLAAAA KOAAAA OOOOxx +231 375 1 3 1 11 1 31 31 231 231 2 3 XIAAAA LOAAAA VVVVxx +151 376 1 3 1 11 1 51 151 151 151 2 3 VFAAAA MOAAAA AAAAxx +29 377 1 1 9 9 9 29 29 29 29 18 19 DBAAAA NOAAAA HHHHxx +297 378 1 1 7 17 7 97 97 297 297 14 15 LLAAAA OOAAAA OOOOxx +403 379 1 3 3 3 3 3 3 403 403 6 7 NPAAAA POAAAA VVVVxx +716 380 0 0 6 16 6 16 116 216 716 12 13 OBAAAA QOAAAA AAAAxx +260 381 0 0 0 0 0 60 60 260 260 0 1 AKAAAA ROAAAA HHHHxx +170 382 0 2 0 10 0 70 170 170 170 0 1 OGAAAA SOAAAA OOOOxx +285 383 1 1 5 5 5 85 85 285 285 10 11 ZKAAAA TOAAAA VVVVxx +82 384 0 2 2 2 2 82 82 82 82 4 5 EDAAAA UOAAAA AAAAxx +958 385 0 2 8 18 8 58 158 458 958 16 17 WKAAAA VOAAAA HHHHxx +175 386 1 3 5 15 5 75 175 175 175 10 11 TGAAAA WOAAAA OOOOxx +671 387 1 3 1 11 1 71 71 171 671 2 3 VZAAAA XOAAAA VVVVxx +822 388 0 2 2 2 2 22 22 322 822 4 5 QFAAAA YOAAAA AAAAxx +573 389 1 1 3 13 3 73 173 73 573 6 7 BWAAAA ZOAAAA HHHHxx +723 390 1 3 3 3 3 23 123 223 723 6 7 VBAAAA APAAAA OOOOxx +195 391 1 3 5 15 5 95 195 195 195 10 11 NHAAAA BPAAAA VVVVxx +197 392 1 1 7 17 7 97 197 197 197 14 15 PHAAAA CPAAAA AAAAxx +755 393 1 3 5 15 5 55 155 255 755 10 11 BDAAAA DPAAAA HHHHxx +42 394 0 2 2 2 2 42 42 42 42 4 5 QBAAAA EPAAAA OOOOxx +897 395 1 1 7 17 7 97 97 397 897 14 15 NIAAAA FPAAAA VVVVxx +309 396 1 1 9 9 9 9 109 309 309 18 19 XLAAAA GPAAAA AAAAxx +724 397 0 0 4 4 4 24 124 224 724 8 9 WBAAAA HPAAAA HHHHxx +474 398 0 2 4 14 4 74 74 474 474 8 9 GSAAAA IPAAAA OOOOxx +345 399 1 1 5 5 5 45 145 345 345 10 11 HNAAAA JPAAAA VVVVxx +678 400 0 2 8 18 8 78 78 178 678 16 17 CAAAAA KPAAAA AAAAxx +757 401 1 1 7 17 7 57 157 257 757 14 15 DDAAAA LPAAAA HHHHxx +600 402 0 0 0 0 0 0 0 100 600 0 1 CXAAAA MPAAAA OOOOxx +184 403 0 0 4 4 4 84 184 184 184 8 9 CHAAAA NPAAAA VVVVxx +155 404 1 3 5 15 5 55 155 155 155 10 11 ZFAAAA OPAAAA AAAAxx +136 405 0 0 6 16 6 36 136 136 136 12 13 GFAAAA PPAAAA HHHHxx +889 406 1 1 9 9 9 89 89 389 889 18 19 FIAAAA QPAAAA OOOOxx +95 407 1 3 5 15 5 95 95 95 95 10 11 RDAAAA RPAAAA VVVVxx +549 408 1 1 9 9 9 49 149 49 549 18 19 DVAAAA SPAAAA AAAAxx +81 409 1 1 1 1 1 81 81 81 81 2 3 DDAAAA TPAAAA HHHHxx +679 410 1 3 9 19 9 79 79 179 679 18 19 DAAAAA UPAAAA OOOOxx +27 411 1 3 7 7 7 27 27 27 27 14 15 BBAAAA VPAAAA VVVVxx +748 412 0 0 8 8 8 48 148 248 748 16 17 UCAAAA WPAAAA AAAAxx +107 413 1 3 7 7 7 7 107 107 107 14 15 DEAAAA XPAAAA HHHHxx +870 414 0 2 0 10 0 70 70 370 870 0 1 MHAAAA YPAAAA OOOOxx +848 415 0 0 8 8 8 48 48 348 848 16 17 QGAAAA ZPAAAA VVVVxx +764 416 0 0 4 4 4 64 164 264 764 8 9 KDAAAA AQAAAA AAAAxx +535 417 1 3 5 15 5 35 135 35 535 10 11 PUAAAA BQAAAA HHHHxx +211 418 1 3 1 11 1 11 11 211 211 2 3 DIAAAA CQAAAA OOOOxx +625 419 1 1 5 5 5 25 25 125 625 10 11 BYAAAA DQAAAA VVVVxx +96 420 0 0 6 16 6 96 96 96 96 12 13 SDAAAA EQAAAA AAAAxx +828 421 0 0 8 8 8 28 28 328 828 16 17 WFAAAA FQAAAA HHHHxx +229 422 1 1 9 9 9 29 29 229 229 18 19 VIAAAA GQAAAA OOOOxx +602 423 0 2 2 2 2 2 2 102 602 4 5 EXAAAA HQAAAA VVVVxx +742 424 0 2 2 2 2 42 142 242 742 4 5 OCAAAA IQAAAA AAAAxx +451 425 1 3 1 11 1 51 51 451 451 2 3 JRAAAA JQAAAA HHHHxx +991 426 1 3 1 11 1 91 191 491 991 2 3 DMAAAA KQAAAA OOOOxx +301 427 1 1 1 1 1 1 101 301 301 2 3 PLAAAA LQAAAA VVVVxx +510 428 0 2 0 10 0 10 110 10 510 0 1 QTAAAA MQAAAA AAAAxx +299 429 1 3 9 19 9 99 99 299 299 18 19 NLAAAA NQAAAA HHHHxx +961 430 1 1 1 1 1 61 161 461 961 2 3 ZKAAAA OQAAAA OOOOxx +3 431 1 3 3 3 3 3 3 3 3 6 7 DAAAAA PQAAAA VVVVxx +106 432 0 2 6 6 6 6 106 106 106 12 13 CEAAAA QQAAAA AAAAxx +591 433 1 3 1 11 1 91 191 91 591 2 3 TWAAAA RQAAAA HHHHxx +700 434 0 0 0 0 0 0 100 200 700 0 1 YAAAAA SQAAAA OOOOxx +841 435 1 1 1 1 1 41 41 341 841 2 3 JGAAAA TQAAAA VVVVxx +829 436 1 1 9 9 9 29 29 329 829 18 19 XFAAAA UQAAAA AAAAxx +508 437 0 0 8 8 8 8 108 8 508 16 17 OTAAAA VQAAAA HHHHxx +750 438 0 2 0 10 0 50 150 250 750 0 1 WCAAAA WQAAAA OOOOxx +665 439 1 1 5 5 5 65 65 165 665 10 11 PZAAAA XQAAAA VVVVxx +157 440 1 1 7 17 7 57 157 157 157 14 15 BGAAAA YQAAAA AAAAxx +694 441 0 2 4 14 4 94 94 194 694 8 9 SAAAAA ZQAAAA HHHHxx +176 442 0 0 6 16 6 76 176 176 176 12 13 UGAAAA ARAAAA OOOOxx +950 443 0 2 0 10 0 50 150 450 950 0 1 OKAAAA BRAAAA VVVVxx +970 444 0 2 0 10 0 70 170 470 970 0 1 ILAAAA CRAAAA AAAAxx +496 445 0 0 6 16 6 96 96 496 496 12 13 CTAAAA DRAAAA HHHHxx +429 446 1 1 9 9 9 29 29 429 429 18 19 NQAAAA ERAAAA OOOOxx +907 447 1 3 7 7 7 7 107 407 907 14 15 XIAAAA FRAAAA VVVVxx +72 448 0 0 2 12 2 72 72 72 72 4 5 UCAAAA GRAAAA AAAAxx +186 449 0 2 6 6 6 86 186 186 186 12 13 EHAAAA HRAAAA HHHHxx +713 450 1 1 3 13 3 13 113 213 713 6 7 LBAAAA IRAAAA OOOOxx +432 451 0 0 2 12 2 32 32 432 432 4 5 QQAAAA JRAAAA VVVVxx +735 452 1 3 5 15 5 35 135 235 735 10 11 HCAAAA KRAAAA AAAAxx +516 453 0 0 6 16 6 16 116 16 516 12 13 WTAAAA LRAAAA HHHHxx +964 454 0 0 4 4 4 64 164 464 964 8 9 CLAAAA MRAAAA OOOOxx +840 455 0 0 0 0 0 40 40 340 840 0 1 IGAAAA NRAAAA VVVVxx +550 456 0 2 0 10 0 50 150 50 550 0 1 EVAAAA ORAAAA AAAAxx +360 457 0 0 0 0 0 60 160 360 360 0 1 WNAAAA PRAAAA HHHHxx +827 458 1 3 7 7 7 27 27 327 827 14 15 VFAAAA QRAAAA OOOOxx +959 459 1 3 9 19 9 59 159 459 959 18 19 XKAAAA RRAAAA VVVVxx +454 460 0 2 4 14 4 54 54 454 454 8 9 MRAAAA SRAAAA AAAAxx +819 461 1 3 9 19 9 19 19 319 819 18 19 NFAAAA TRAAAA HHHHxx +745 462 1 1 5 5 5 45 145 245 745 10 11 RCAAAA URAAAA OOOOxx +279 463 1 3 9 19 9 79 79 279 279 18 19 TKAAAA VRAAAA VVVVxx +426 464 0 2 6 6 6 26 26 426 426 12 13 KQAAAA WRAAAA AAAAxx +70 465 0 2 0 10 0 70 70 70 70 0 1 SCAAAA XRAAAA HHHHxx +637 466 1 1 7 17 7 37 37 137 637 14 15 NYAAAA YRAAAA OOOOxx +417 467 1 1 7 17 7 17 17 417 417 14 15 BQAAAA ZRAAAA VVVVxx +586 468 0 2 6 6 6 86 186 86 586 12 13 OWAAAA ASAAAA AAAAxx +314 469 0 2 4 14 4 14 114 314 314 8 9 CMAAAA BSAAAA HHHHxx +101 470 1 1 1 1 1 1 101 101 101 2 3 XDAAAA CSAAAA OOOOxx +205 471 1 1 5 5 5 5 5 205 205 10 11 XHAAAA DSAAAA VVVVxx +969 472 1 1 9 9 9 69 169 469 969 18 19 HLAAAA ESAAAA AAAAxx +217 473 1 1 7 17 7 17 17 217 217 14 15 JIAAAA FSAAAA HHHHxx +281 474 1 1 1 1 1 81 81 281 281 2 3 VKAAAA GSAAAA OOOOxx +984 475 0 0 4 4 4 84 184 484 984 8 9 WLAAAA HSAAAA VVVVxx +366 476 0 2 6 6 6 66 166 366 366 12 13 COAAAA ISAAAA AAAAxx +483 477 1 3 3 3 3 83 83 483 483 6 7 PSAAAA JSAAAA HHHHxx +838 478 0 2 8 18 8 38 38 338 838 16 17 GGAAAA KSAAAA OOOOxx +64 479 0 0 4 4 4 64 64 64 64 8 9 MCAAAA LSAAAA VVVVxx +981 480 1 1 1 1 1 81 181 481 981 2 3 TLAAAA MSAAAA AAAAxx +538 481 0 2 8 18 8 38 138 38 538 16 17 SUAAAA NSAAAA HHHHxx +39 482 1 3 9 19 9 39 39 39 39 18 19 NBAAAA OSAAAA OOOOxx +60 483 0 0 0 0 0 60 60 60 60 0 1 ICAAAA PSAAAA VVVVxx +874 484 0 2 4 14 4 74 74 374 874 8 9 QHAAAA QSAAAA AAAAxx +955 485 1 3 5 15 5 55 155 455 955 10 11 TKAAAA RSAAAA HHHHxx +347 486 1 3 7 7 7 47 147 347 347 14 15 JNAAAA SSAAAA OOOOxx +227 487 1 3 7 7 7 27 27 227 227 14 15 TIAAAA TSAAAA VVVVxx +44 488 0 0 4 4 4 44 44 44 44 8 9 SBAAAA USAAAA AAAAxx +446 489 0 2 6 6 6 46 46 446 446 12 13 ERAAAA VSAAAA HHHHxx +605 490 1 1 5 5 5 5 5 105 605 10 11 HXAAAA WSAAAA OOOOxx +570 491 0 2 0 10 0 70 170 70 570 0 1 YVAAAA XSAAAA VVVVxx +895 492 1 3 5 15 5 95 95 395 895 10 11 LIAAAA YSAAAA AAAAxx +760 493 0 0 0 0 0 60 160 260 760 0 1 GDAAAA ZSAAAA HHHHxx +428 494 0 0 8 8 8 28 28 428 428 16 17 MQAAAA ATAAAA OOOOxx +628 495 0 0 8 8 8 28 28 128 628 16 17 EYAAAA BTAAAA VVVVxx +933 496 1 1 3 13 3 33 133 433 933 6 7 XJAAAA CTAAAA AAAAxx +263 497 1 3 3 3 3 63 63 263 263 6 7 DKAAAA DTAAAA HHHHxx +729 498 1 1 9 9 9 29 129 229 729 18 19 BCAAAA ETAAAA OOOOxx +860 499 0 0 0 0 0 60 60 360 860 0 1 CHAAAA FTAAAA VVVVxx +76 500 0 0 6 16 6 76 76 76 76 12 13 YCAAAA GTAAAA AAAAxx +293 501 1 1 3 13 3 93 93 293 293 6 7 HLAAAA HTAAAA HHHHxx +296 502 0 0 6 16 6 96 96 296 296 12 13 KLAAAA ITAAAA OOOOxx +124 503 0 0 4 4 4 24 124 124 124 8 9 UEAAAA JTAAAA VVVVxx +568 504 0 0 8 8 8 68 168 68 568 16 17 WVAAAA KTAAAA AAAAxx +337 505 1 1 7 17 7 37 137 337 337 14 15 ZMAAAA LTAAAA HHHHxx +464 506 0 0 4 4 4 64 64 464 464 8 9 WRAAAA MTAAAA OOOOxx +582 507 0 2 2 2 2 82 182 82 582 4 5 KWAAAA NTAAAA VVVVxx +207 508 1 3 7 7 7 7 7 207 207 14 15 ZHAAAA OTAAAA AAAAxx +518 509 0 2 8 18 8 18 118 18 518 16 17 YTAAAA PTAAAA HHHHxx +513 510 1 1 3 13 3 13 113 13 513 6 7 TTAAAA QTAAAA OOOOxx +127 511 1 3 7 7 7 27 127 127 127 14 15 XEAAAA RTAAAA VVVVxx +396 512 0 0 6 16 6 96 196 396 396 12 13 GPAAAA STAAAA AAAAxx +781 513 1 1 1 1 1 81 181 281 781 2 3 BEAAAA TTAAAA HHHHxx +233 514 1 1 3 13 3 33 33 233 233 6 7 ZIAAAA UTAAAA OOOOxx +709 515 1 1 9 9 9 9 109 209 709 18 19 HBAAAA VTAAAA VVVVxx +325 516 1 1 5 5 5 25 125 325 325 10 11 NMAAAA WTAAAA AAAAxx +143 517 1 3 3 3 3 43 143 143 143 6 7 NFAAAA XTAAAA HHHHxx +824 518 0 0 4 4 4 24 24 324 824 8 9 SFAAAA YTAAAA OOOOxx +122 519 0 2 2 2 2 22 122 122 122 4 5 SEAAAA ZTAAAA VVVVxx +10 520 0 2 0 10 0 10 10 10 10 0 1 KAAAAA AUAAAA AAAAxx +41 521 1 1 1 1 1 41 41 41 41 2 3 PBAAAA BUAAAA HHHHxx +618 522 0 2 8 18 8 18 18 118 618 16 17 UXAAAA CUAAAA OOOOxx +161 523 1 1 1 1 1 61 161 161 161 2 3 FGAAAA DUAAAA VVVVxx +801 524 1 1 1 1 1 1 1 301 801 2 3 VEAAAA EUAAAA AAAAxx +768 525 0 0 8 8 8 68 168 268 768 16 17 ODAAAA FUAAAA HHHHxx +642 526 0 2 2 2 2 42 42 142 642 4 5 SYAAAA GUAAAA OOOOxx +803 527 1 3 3 3 3 3 3 303 803 6 7 XEAAAA HUAAAA VVVVxx +317 528 1 1 7 17 7 17 117 317 317 14 15 FMAAAA IUAAAA AAAAxx +938 529 0 2 8 18 8 38 138 438 938 16 17 CKAAAA JUAAAA HHHHxx +649 530 1 1 9 9 9 49 49 149 649 18 19 ZYAAAA KUAAAA OOOOxx +738 531 0 2 8 18 8 38 138 238 738 16 17 KCAAAA LUAAAA VVVVxx +344 532 0 0 4 4 4 44 144 344 344 8 9 GNAAAA MUAAAA AAAAxx +399 533 1 3 9 19 9 99 199 399 399 18 19 JPAAAA NUAAAA HHHHxx +609 534 1 1 9 9 9 9 9 109 609 18 19 LXAAAA OUAAAA OOOOxx +677 535 1 1 7 17 7 77 77 177 677 14 15 BAAAAA PUAAAA VVVVxx +478 536 0 2 8 18 8 78 78 478 478 16 17 KSAAAA QUAAAA AAAAxx +452 537 0 0 2 12 2 52 52 452 452 4 5 KRAAAA RUAAAA HHHHxx +261 538 1 1 1 1 1 61 61 261 261 2 3 BKAAAA SUAAAA OOOOxx +449 539 1 1 9 9 9 49 49 449 449 18 19 HRAAAA TUAAAA VVVVxx +433 540 1 1 3 13 3 33 33 433 433 6 7 RQAAAA UUAAAA AAAAxx +5 541 1 1 5 5 5 5 5 5 5 10 11 FAAAAA VUAAAA HHHHxx +664 542 0 0 4 4 4 64 64 164 664 8 9 OZAAAA WUAAAA OOOOxx +887 543 1 3 7 7 7 87 87 387 887 14 15 DIAAAA XUAAAA VVVVxx +546 544 0 2 6 6 6 46 146 46 546 12 13 AVAAAA YUAAAA AAAAxx +253 545 1 1 3 13 3 53 53 253 253 6 7 TJAAAA ZUAAAA HHHHxx +235 546 1 3 5 15 5 35 35 235 235 10 11 BJAAAA AVAAAA OOOOxx +258 547 0 2 8 18 8 58 58 258 258 16 17 YJAAAA BVAAAA VVVVxx +621 548 1 1 1 1 1 21 21 121 621 2 3 XXAAAA CVAAAA AAAAxx +998 549 0 2 8 18 8 98 198 498 998 16 17 KMAAAA DVAAAA HHHHxx +236 550 0 0 6 16 6 36 36 236 236 12 13 CJAAAA EVAAAA OOOOxx +537 551 1 1 7 17 7 37 137 37 537 14 15 RUAAAA FVAAAA VVVVxx +769 552 1 1 9 9 9 69 169 269 769 18 19 PDAAAA GVAAAA AAAAxx +921 553 1 1 1 1 1 21 121 421 921 2 3 LJAAAA HVAAAA HHHHxx +951 554 1 3 1 11 1 51 151 451 951 2 3 PKAAAA IVAAAA OOOOxx +240 555 0 0 0 0 0 40 40 240 240 0 1 GJAAAA JVAAAA VVVVxx +644 556 0 0 4 4 4 44 44 144 644 8 9 UYAAAA KVAAAA AAAAxx +352 557 0 0 2 12 2 52 152 352 352 4 5 ONAAAA LVAAAA HHHHxx +613 558 1 1 3 13 3 13 13 113 613 6 7 PXAAAA MVAAAA OOOOxx +784 559 0 0 4 4 4 84 184 284 784 8 9 EEAAAA NVAAAA VVVVxx +61 560 1 1 1 1 1 61 61 61 61 2 3 JCAAAA OVAAAA AAAAxx +144 561 0 0 4 4 4 44 144 144 144 8 9 OFAAAA PVAAAA HHHHxx +94 562 0 2 4 14 4 94 94 94 94 8 9 QDAAAA QVAAAA OOOOxx +270 563 0 2 0 10 0 70 70 270 270 0 1 KKAAAA RVAAAA VVVVxx +942 564 0 2 2 2 2 42 142 442 942 4 5 GKAAAA SVAAAA AAAAxx +756 565 0 0 6 16 6 56 156 256 756 12 13 CDAAAA TVAAAA HHHHxx +321 566 1 1 1 1 1 21 121 321 321 2 3 JMAAAA UVAAAA OOOOxx +36 567 0 0 6 16 6 36 36 36 36 12 13 KBAAAA VVAAAA VVVVxx +232 568 0 0 2 12 2 32 32 232 232 4 5 YIAAAA WVAAAA AAAAxx +430 569 0 2 0 10 0 30 30 430 430 0 1 OQAAAA XVAAAA HHHHxx +177 570 1 1 7 17 7 77 177 177 177 14 15 VGAAAA YVAAAA OOOOxx +220 571 0 0 0 0 0 20 20 220 220 0 1 MIAAAA ZVAAAA VVVVxx +109 572 1 1 9 9 9 9 109 109 109 18 19 FEAAAA AWAAAA AAAAxx +419 573 1 3 9 19 9 19 19 419 419 18 19 DQAAAA BWAAAA HHHHxx +135 574 1 3 5 15 5 35 135 135 135 10 11 FFAAAA CWAAAA OOOOxx +610 575 0 2 0 10 0 10 10 110 610 0 1 MXAAAA DWAAAA VVVVxx +956 576 0 0 6 16 6 56 156 456 956 12 13 UKAAAA EWAAAA AAAAxx +626 577 0 2 6 6 6 26 26 126 626 12 13 CYAAAA FWAAAA HHHHxx +375 578 1 3 5 15 5 75 175 375 375 10 11 LOAAAA GWAAAA OOOOxx +976 579 0 0 6 16 6 76 176 476 976 12 13 OLAAAA HWAAAA VVVVxx +152 580 0 0 2 12 2 52 152 152 152 4 5 WFAAAA IWAAAA AAAAxx +308 581 0 0 8 8 8 8 108 308 308 16 17 WLAAAA JWAAAA HHHHxx +445 582 1 1 5 5 5 45 45 445 445 10 11 DRAAAA KWAAAA OOOOxx +326 583 0 2 6 6 6 26 126 326 326 12 13 OMAAAA LWAAAA VVVVxx +422 584 0 2 2 2 2 22 22 422 422 4 5 GQAAAA MWAAAA AAAAxx +972 585 0 0 2 12 2 72 172 472 972 4 5 KLAAAA NWAAAA HHHHxx +45 586 1 1 5 5 5 45 45 45 45 10 11 TBAAAA OWAAAA OOOOxx +725 587 1 1 5 5 5 25 125 225 725 10 11 XBAAAA PWAAAA VVVVxx +753 588 1 1 3 13 3 53 153 253 753 6 7 ZCAAAA QWAAAA AAAAxx +493 589 1 1 3 13 3 93 93 493 493 6 7 ZSAAAA RWAAAA HHHHxx +601 590 1 1 1 1 1 1 1 101 601 2 3 DXAAAA SWAAAA OOOOxx +463 591 1 3 3 3 3 63 63 463 463 6 7 VRAAAA TWAAAA VVVVxx +303 592 1 3 3 3 3 3 103 303 303 6 7 RLAAAA UWAAAA AAAAxx +59 593 1 3 9 19 9 59 59 59 59 18 19 HCAAAA VWAAAA HHHHxx +595 594 1 3 5 15 5 95 195 95 595 10 11 XWAAAA WWAAAA OOOOxx +807 595 1 3 7 7 7 7 7 307 807 14 15 BFAAAA XWAAAA VVVVxx +424 596 0 0 4 4 4 24 24 424 424 8 9 IQAAAA YWAAAA AAAAxx +521 597 1 1 1 1 1 21 121 21 521 2 3 BUAAAA ZWAAAA HHHHxx +341 598 1 1 1 1 1 41 141 341 341 2 3 DNAAAA AXAAAA OOOOxx +571 599 1 3 1 11 1 71 171 71 571 2 3 ZVAAAA BXAAAA VVVVxx +165 600 1 1 5 5 5 65 165 165 165 10 11 JGAAAA CXAAAA AAAAxx +908 601 0 0 8 8 8 8 108 408 908 16 17 YIAAAA DXAAAA HHHHxx +351 602 1 3 1 11 1 51 151 351 351 2 3 NNAAAA EXAAAA OOOOxx +334 603 0 2 4 14 4 34 134 334 334 8 9 WMAAAA FXAAAA VVVVxx +636 604 0 0 6 16 6 36 36 136 636 12 13 MYAAAA GXAAAA AAAAxx +138 605 0 2 8 18 8 38 138 138 138 16 17 IFAAAA HXAAAA HHHHxx +438 606 0 2 8 18 8 38 38 438 438 16 17 WQAAAA IXAAAA OOOOxx +391 607 1 3 1 11 1 91 191 391 391 2 3 BPAAAA JXAAAA VVVVxx +395 608 1 3 5 15 5 95 195 395 395 10 11 FPAAAA KXAAAA AAAAxx +502 609 0 2 2 2 2 2 102 2 502 4 5 ITAAAA LXAAAA HHHHxx +85 610 1 1 5 5 5 85 85 85 85 10 11 HDAAAA MXAAAA OOOOxx +786 611 0 2 6 6 6 86 186 286 786 12 13 GEAAAA NXAAAA VVVVxx +619 612 1 3 9 19 9 19 19 119 619 18 19 VXAAAA OXAAAA AAAAxx +440 613 0 0 0 0 0 40 40 440 440 0 1 YQAAAA PXAAAA HHHHxx +949 614 1 1 9 9 9 49 149 449 949 18 19 NKAAAA QXAAAA OOOOxx +691 615 1 3 1 11 1 91 91 191 691 2 3 PAAAAA RXAAAA VVVVxx +348 616 0 0 8 8 8 48 148 348 348 16 17 KNAAAA SXAAAA AAAAxx +506 617 0 2 6 6 6 6 106 6 506 12 13 MTAAAA TXAAAA HHHHxx +192 618 0 0 2 12 2 92 192 192 192 4 5 KHAAAA UXAAAA OOOOxx +369 619 1 1 9 9 9 69 169 369 369 18 19 FOAAAA VXAAAA VVVVxx +311 620 1 3 1 11 1 11 111 311 311 2 3 ZLAAAA WXAAAA AAAAxx +273 621 1 1 3 13 3 73 73 273 273 6 7 NKAAAA XXAAAA HHHHxx +770 622 0 2 0 10 0 70 170 270 770 0 1 QDAAAA YXAAAA OOOOxx +191 623 1 3 1 11 1 91 191 191 191 2 3 JHAAAA ZXAAAA VVVVxx +90 624 0 2 0 10 0 90 90 90 90 0 1 MDAAAA AYAAAA AAAAxx +163 625 1 3 3 3 3 63 163 163 163 6 7 HGAAAA BYAAAA HHHHxx +350 626 0 2 0 10 0 50 150 350 350 0 1 MNAAAA CYAAAA OOOOxx +55 627 1 3 5 15 5 55 55 55 55 10 11 DCAAAA DYAAAA VVVVxx +488 628 0 0 8 8 8 88 88 488 488 16 17 USAAAA EYAAAA AAAAxx +215 629 1 3 5 15 5 15 15 215 215 10 11 HIAAAA FYAAAA HHHHxx +732 630 0 0 2 12 2 32 132 232 732 4 5 ECAAAA GYAAAA OOOOxx +688 631 0 0 8 8 8 88 88 188 688 16 17 MAAAAA HYAAAA VVVVxx +520 632 0 0 0 0 0 20 120 20 520 0 1 AUAAAA IYAAAA AAAAxx +62 633 0 2 2 2 2 62 62 62 62 4 5 KCAAAA JYAAAA HHHHxx +423 634 1 3 3 3 3 23 23 423 423 6 7 HQAAAA KYAAAA OOOOxx +242 635 0 2 2 2 2 42 42 242 242 4 5 IJAAAA LYAAAA VVVVxx +193 636 1 1 3 13 3 93 193 193 193 6 7 LHAAAA MYAAAA AAAAxx +648 637 0 0 8 8 8 48 48 148 648 16 17 YYAAAA NYAAAA HHHHxx +459 638 1 3 9 19 9 59 59 459 459 18 19 RRAAAA OYAAAA OOOOxx +196 639 0 0 6 16 6 96 196 196 196 12 13 OHAAAA PYAAAA VVVVxx +476 640 0 0 6 16 6 76 76 476 476 12 13 ISAAAA QYAAAA AAAAxx +903 641 1 3 3 3 3 3 103 403 903 6 7 TIAAAA RYAAAA HHHHxx +974 642 0 2 4 14 4 74 174 474 974 8 9 MLAAAA SYAAAA OOOOxx +603 643 1 3 3 3 3 3 3 103 603 6 7 FXAAAA TYAAAA VVVVxx +12 644 0 0 2 12 2 12 12 12 12 4 5 MAAAAA UYAAAA AAAAxx +599 645 1 3 9 19 9 99 199 99 599 18 19 BXAAAA VYAAAA HHHHxx +914 646 0 2 4 14 4 14 114 414 914 8 9 EJAAAA WYAAAA OOOOxx +7 647 1 3 7 7 7 7 7 7 7 14 15 HAAAAA XYAAAA VVVVxx +213 648 1 1 3 13 3 13 13 213 213 6 7 FIAAAA YYAAAA AAAAxx +174 649 0 2 4 14 4 74 174 174 174 8 9 SGAAAA ZYAAAA HHHHxx +392 650 0 0 2 12 2 92 192 392 392 4 5 CPAAAA AZAAAA OOOOxx +674 651 0 2 4 14 4 74 74 174 674 8 9 YZAAAA BZAAAA VVVVxx +650 652 0 2 0 10 0 50 50 150 650 0 1 AZAAAA CZAAAA AAAAxx +8 653 0 0 8 8 8 8 8 8 8 16 17 IAAAAA DZAAAA HHHHxx +492 654 0 0 2 12 2 92 92 492 492 4 5 YSAAAA EZAAAA OOOOxx +322 655 0 2 2 2 2 22 122 322 322 4 5 KMAAAA FZAAAA VVVVxx +315 656 1 3 5 15 5 15 115 315 315 10 11 DMAAAA GZAAAA AAAAxx +380 657 0 0 0 0 0 80 180 380 380 0 1 QOAAAA HZAAAA HHHHxx +353 658 1 1 3 13 3 53 153 353 353 6 7 PNAAAA IZAAAA OOOOxx +892 659 0 0 2 12 2 92 92 392 892 4 5 IIAAAA JZAAAA VVVVxx +932 660 0 0 2 12 2 32 132 432 932 4 5 WJAAAA KZAAAA AAAAxx +993 661 1 1 3 13 3 93 193 493 993 6 7 FMAAAA LZAAAA HHHHxx +859 662 1 3 9 19 9 59 59 359 859 18 19 BHAAAA MZAAAA OOOOxx +806 663 0 2 6 6 6 6 6 306 806 12 13 AFAAAA NZAAAA VVVVxx +145 664 1 1 5 5 5 45 145 145 145 10 11 PFAAAA OZAAAA AAAAxx +373 665 1 1 3 13 3 73 173 373 373 6 7 JOAAAA PZAAAA HHHHxx +418 666 0 2 8 18 8 18 18 418 418 16 17 CQAAAA QZAAAA OOOOxx +865 667 1 1 5 5 5 65 65 365 865 10 11 HHAAAA RZAAAA VVVVxx +462 668 0 2 2 2 2 62 62 462 462 4 5 URAAAA SZAAAA AAAAxx +24 669 0 0 4 4 4 24 24 24 24 8 9 YAAAAA TZAAAA HHHHxx +920 670 0 0 0 0 0 20 120 420 920 0 1 KJAAAA UZAAAA OOOOxx +672 671 0 0 2 12 2 72 72 172 672 4 5 WZAAAA VZAAAA VVVVxx +92 672 0 0 2 12 2 92 92 92 92 4 5 ODAAAA WZAAAA AAAAxx +721 673 1 1 1 1 1 21 121 221 721 2 3 TBAAAA XZAAAA HHHHxx +646 674 0 2 6 6 6 46 46 146 646 12 13 WYAAAA YZAAAA OOOOxx +910 675 0 2 0 10 0 10 110 410 910 0 1 AJAAAA ZZAAAA VVVVxx +909 676 1 1 9 9 9 9 109 409 909 18 19 ZIAAAA AABAAA AAAAxx +630 677 0 2 0 10 0 30 30 130 630 0 1 GYAAAA BABAAA HHHHxx +482 678 0 2 2 2 2 82 82 482 482 4 5 OSAAAA CABAAA OOOOxx +559 679 1 3 9 19 9 59 159 59 559 18 19 NVAAAA DABAAA VVVVxx +853 680 1 1 3 13 3 53 53 353 853 6 7 VGAAAA EABAAA AAAAxx +141 681 1 1 1 1 1 41 141 141 141 2 3 LFAAAA FABAAA HHHHxx +266 682 0 2 6 6 6 66 66 266 266 12 13 GKAAAA GABAAA OOOOxx +835 683 1 3 5 15 5 35 35 335 835 10 11 DGAAAA HABAAA VVVVxx +164 684 0 0 4 4 4 64 164 164 164 8 9 IGAAAA IABAAA AAAAxx +629 685 1 1 9 9 9 29 29 129 629 18 19 FYAAAA JABAAA HHHHxx +203 686 1 3 3 3 3 3 3 203 203 6 7 VHAAAA KABAAA OOOOxx +411 687 1 3 1 11 1 11 11 411 411 2 3 VPAAAA LABAAA VVVVxx +930 688 0 2 0 10 0 30 130 430 930 0 1 UJAAAA MABAAA AAAAxx +435 689 1 3 5 15 5 35 35 435 435 10 11 TQAAAA NABAAA HHHHxx +563 690 1 3 3 3 3 63 163 63 563 6 7 RVAAAA OABAAA OOOOxx +960 691 0 0 0 0 0 60 160 460 960 0 1 YKAAAA PABAAA VVVVxx +733 692 1 1 3 13 3 33 133 233 733 6 7 FCAAAA QABAAA AAAAxx +967 693 1 3 7 7 7 67 167 467 967 14 15 FLAAAA RABAAA HHHHxx +668 694 0 0 8 8 8 68 68 168 668 16 17 SZAAAA SABAAA OOOOxx +994 695 0 2 4 14 4 94 194 494 994 8 9 GMAAAA TABAAA VVVVxx +129 696 1 1 9 9 9 29 129 129 129 18 19 ZEAAAA UABAAA AAAAxx +954 697 0 2 4 14 4 54 154 454 954 8 9 SKAAAA VABAAA HHHHxx +68 698 0 0 8 8 8 68 68 68 68 16 17 QCAAAA WABAAA OOOOxx +79 699 1 3 9 19 9 79 79 79 79 18 19 BDAAAA XABAAA VVVVxx +121 700 1 1 1 1 1 21 121 121 121 2 3 REAAAA YABAAA AAAAxx +740 701 0 0 0 0 0 40 140 240 740 0 1 MCAAAA ZABAAA HHHHxx +902 702 0 2 2 2 2 2 102 402 902 4 5 SIAAAA ABBAAA OOOOxx +695 703 1 3 5 15 5 95 95 195 695 10 11 TAAAAA BBBAAA VVVVxx +455 704 1 3 5 15 5 55 55 455 455 10 11 NRAAAA CBBAAA AAAAxx +89 705 1 1 9 9 9 89 89 89 89 18 19 LDAAAA DBBAAA HHHHxx +893 706 1 1 3 13 3 93 93 393 893 6 7 JIAAAA EBBAAA OOOOxx +202 707 0 2 2 2 2 2 2 202 202 4 5 UHAAAA FBBAAA VVVVxx +132 708 0 0 2 12 2 32 132 132 132 4 5 CFAAAA GBBAAA AAAAxx +782 709 0 2 2 2 2 82 182 282 782 4 5 CEAAAA HBBAAA HHHHxx +512 710 0 0 2 12 2 12 112 12 512 4 5 STAAAA IBBAAA OOOOxx +857 711 1 1 7 17 7 57 57 357 857 14 15 ZGAAAA JBBAAA VVVVxx +248 712 0 0 8 8 8 48 48 248 248 16 17 OJAAAA KBBAAA AAAAxx +858 713 0 2 8 18 8 58 58 358 858 16 17 AHAAAA LBBAAA HHHHxx +527 714 1 3 7 7 7 27 127 27 527 14 15 HUAAAA MBBAAA OOOOxx +450 715 0 2 0 10 0 50 50 450 450 0 1 IRAAAA NBBAAA VVVVxx +712 716 0 0 2 12 2 12 112 212 712 4 5 KBAAAA OBBAAA AAAAxx +153 717 1 1 3 13 3 53 153 153 153 6 7 XFAAAA PBBAAA HHHHxx +587 718 1 3 7 7 7 87 187 87 587 14 15 PWAAAA QBBAAA OOOOxx +593 719 1 1 3 13 3 93 193 93 593 6 7 VWAAAA RBBAAA VVVVxx +249 720 1 1 9 9 9 49 49 249 249 18 19 PJAAAA SBBAAA AAAAxx +128 721 0 0 8 8 8 28 128 128 128 16 17 YEAAAA TBBAAA HHHHxx +675 722 1 3 5 15 5 75 75 175 675 10 11 ZZAAAA UBBAAA OOOOxx +929 723 1 1 9 9 9 29 129 429 929 18 19 TJAAAA VBBAAA VVVVxx +156 724 0 0 6 16 6 56 156 156 156 12 13 AGAAAA WBBAAA AAAAxx +415 725 1 3 5 15 5 15 15 415 415 10 11 ZPAAAA XBBAAA HHHHxx +28 726 0 0 8 8 8 28 28 28 28 16 17 CBAAAA YBBAAA OOOOxx +18 727 0 2 8 18 8 18 18 18 18 16 17 SAAAAA ZBBAAA VVVVxx +255 728 1 3 5 15 5 55 55 255 255 10 11 VJAAAA ACBAAA AAAAxx +793 729 1 1 3 13 3 93 193 293 793 6 7 NEAAAA BCBAAA HHHHxx +554 730 0 2 4 14 4 54 154 54 554 8 9 IVAAAA CCBAAA OOOOxx +467 731 1 3 7 7 7 67 67 467 467 14 15 ZRAAAA DCBAAA VVVVxx +410 732 0 2 0 10 0 10 10 410 410 0 1 UPAAAA ECBAAA AAAAxx +651 733 1 3 1 11 1 51 51 151 651 2 3 BZAAAA FCBAAA HHHHxx +287 734 1 3 7 7 7 87 87 287 287 14 15 BLAAAA GCBAAA OOOOxx +640 735 0 0 0 0 0 40 40 140 640 0 1 QYAAAA HCBAAA VVVVxx +245 736 1 1 5 5 5 45 45 245 245 10 11 LJAAAA ICBAAA AAAAxx +21 737 1 1 1 1 1 21 21 21 21 2 3 VAAAAA JCBAAA HHHHxx +83 738 1 3 3 3 3 83 83 83 83 6 7 FDAAAA KCBAAA OOOOxx +228 739 0 0 8 8 8 28 28 228 228 16 17 UIAAAA LCBAAA VVVVxx +323 740 1 3 3 3 3 23 123 323 323 6 7 LMAAAA MCBAAA AAAAxx +594 741 0 2 4 14 4 94 194 94 594 8 9 WWAAAA NCBAAA HHHHxx +528 742 0 0 8 8 8 28 128 28 528 16 17 IUAAAA OCBAAA OOOOxx +276 743 0 0 6 16 6 76 76 276 276 12 13 QKAAAA PCBAAA VVVVxx +598 744 0 2 8 18 8 98 198 98 598 16 17 AXAAAA QCBAAA AAAAxx +635 745 1 3 5 15 5 35 35 135 635 10 11 LYAAAA RCBAAA HHHHxx +868 746 0 0 8 8 8 68 68 368 868 16 17 KHAAAA SCBAAA OOOOxx +290 747 0 2 0 10 0 90 90 290 290 0 1 ELAAAA TCBAAA VVVVxx +468 748 0 0 8 8 8 68 68 468 468 16 17 ASAAAA UCBAAA AAAAxx +689 749 1 1 9 9 9 89 89 189 689 18 19 NAAAAA VCBAAA HHHHxx +799 750 1 3 9 19 9 99 199 299 799 18 19 TEAAAA WCBAAA OOOOxx +210 751 0 2 0 10 0 10 10 210 210 0 1 CIAAAA XCBAAA VVVVxx +346 752 0 2 6 6 6 46 146 346 346 12 13 INAAAA YCBAAA AAAAxx +957 753 1 1 7 17 7 57 157 457 957 14 15 VKAAAA ZCBAAA HHHHxx +905 754 1 1 5 5 5 5 105 405 905 10 11 VIAAAA ADBAAA OOOOxx +523 755 1 3 3 3 3 23 123 23 523 6 7 DUAAAA BDBAAA VVVVxx +899 756 1 3 9 19 9 99 99 399 899 18 19 PIAAAA CDBAAA AAAAxx +867 757 1 3 7 7 7 67 67 367 867 14 15 JHAAAA DDBAAA HHHHxx +11 758 1 3 1 11 1 11 11 11 11 2 3 LAAAAA EDBAAA OOOOxx +320 759 0 0 0 0 0 20 120 320 320 0 1 IMAAAA FDBAAA VVVVxx +766 760 0 2 6 6 6 66 166 266 766 12 13 MDAAAA GDBAAA AAAAxx +84 761 0 0 4 4 4 84 84 84 84 8 9 GDAAAA HDBAAA HHHHxx +507 762 1 3 7 7 7 7 107 7 507 14 15 NTAAAA IDBAAA OOOOxx +471 763 1 3 1 11 1 71 71 471 471 2 3 DSAAAA JDBAAA VVVVxx +517 764 1 1 7 17 7 17 117 17 517 14 15 XTAAAA KDBAAA AAAAxx +234 765 0 2 4 14 4 34 34 234 234 8 9 AJAAAA LDBAAA HHHHxx +988 766 0 0 8 8 8 88 188 488 988 16 17 AMAAAA MDBAAA OOOOxx +473 767 1 1 3 13 3 73 73 473 473 6 7 FSAAAA NDBAAA VVVVxx +66 768 0 2 6 6 6 66 66 66 66 12 13 OCAAAA ODBAAA AAAAxx +530 769 0 2 0 10 0 30 130 30 530 0 1 KUAAAA PDBAAA HHHHxx +834 770 0 2 4 14 4 34 34 334 834 8 9 CGAAAA QDBAAA OOOOxx +894 771 0 2 4 14 4 94 94 394 894 8 9 KIAAAA RDBAAA VVVVxx +481 772 1 1 1 1 1 81 81 481 481 2 3 NSAAAA SDBAAA AAAAxx +280 773 0 0 0 0 0 80 80 280 280 0 1 UKAAAA TDBAAA HHHHxx +705 774 1 1 5 5 5 5 105 205 705 10 11 DBAAAA UDBAAA OOOOxx +218 775 0 2 8 18 8 18 18 218 218 16 17 KIAAAA VDBAAA VVVVxx +560 776 0 0 0 0 0 60 160 60 560 0 1 OVAAAA WDBAAA AAAAxx +123 777 1 3 3 3 3 23 123 123 123 6 7 TEAAAA XDBAAA HHHHxx +289 778 1 1 9 9 9 89 89 289 289 18 19 DLAAAA YDBAAA OOOOxx +189 779 1 1 9 9 9 89 189 189 189 18 19 HHAAAA ZDBAAA VVVVxx +541 780 1 1 1 1 1 41 141 41 541 2 3 VUAAAA AEBAAA AAAAxx +876 781 0 0 6 16 6 76 76 376 876 12 13 SHAAAA BEBAAA HHHHxx +504 782 0 0 4 4 4 4 104 4 504 8 9 KTAAAA CEBAAA OOOOxx +643 783 1 3 3 3 3 43 43 143 643 6 7 TYAAAA DEBAAA VVVVxx +73 784 1 1 3 13 3 73 73 73 73 6 7 VCAAAA EEBAAA AAAAxx +465 785 1 1 5 5 5 65 65 465 465 10 11 XRAAAA FEBAAA HHHHxx +861 786 1 1 1 1 1 61 61 361 861 2 3 DHAAAA GEBAAA OOOOxx +355 787 1 3 5 15 5 55 155 355 355 10 11 RNAAAA HEBAAA VVVVxx +441 788 1 1 1 1 1 41 41 441 441 2 3 ZQAAAA IEBAAA AAAAxx +219 789 1 3 9 19 9 19 19 219 219 18 19 LIAAAA JEBAAA HHHHxx +839 790 1 3 9 19 9 39 39 339 839 18 19 HGAAAA KEBAAA OOOOxx +271 791 1 3 1 11 1 71 71 271 271 2 3 LKAAAA LEBAAA VVVVxx +212 792 0 0 2 12 2 12 12 212 212 4 5 EIAAAA MEBAAA AAAAxx +904 793 0 0 4 4 4 4 104 404 904 8 9 UIAAAA NEBAAA HHHHxx +244 794 0 0 4 4 4 44 44 244 244 8 9 KJAAAA OEBAAA OOOOxx +751 795 1 3 1 11 1 51 151 251 751 2 3 XCAAAA PEBAAA VVVVxx +944 796 0 0 4 4 4 44 144 444 944 8 9 IKAAAA QEBAAA AAAAxx +305 797 1 1 5 5 5 5 105 305 305 10 11 TLAAAA REBAAA HHHHxx +617 798 1 1 7 17 7 17 17 117 617 14 15 TXAAAA SEBAAA OOOOxx +891 799 1 3 1 11 1 91 91 391 891 2 3 HIAAAA TEBAAA VVVVxx +653 800 1 1 3 13 3 53 53 153 653 6 7 DZAAAA UEBAAA AAAAxx +845 801 1 1 5 5 5 45 45 345 845 10 11 NGAAAA VEBAAA HHHHxx +936 802 0 0 6 16 6 36 136 436 936 12 13 AKAAAA WEBAAA OOOOxx +91 803 1 3 1 11 1 91 91 91 91 2 3 NDAAAA XEBAAA VVVVxx +442 804 0 2 2 2 2 42 42 442 442 4 5 ARAAAA YEBAAA AAAAxx +498 805 0 2 8 18 8 98 98 498 498 16 17 ETAAAA ZEBAAA HHHHxx +987 806 1 3 7 7 7 87 187 487 987 14 15 ZLAAAA AFBAAA OOOOxx +194 807 0 2 4 14 4 94 194 194 194 8 9 MHAAAA BFBAAA VVVVxx +927 808 1 3 7 7 7 27 127 427 927 14 15 RJAAAA CFBAAA AAAAxx +607 809 1 3 7 7 7 7 7 107 607 14 15 JXAAAA DFBAAA HHHHxx +119 810 1 3 9 19 9 19 119 119 119 18 19 PEAAAA EFBAAA OOOOxx +182 811 0 2 2 2 2 82 182 182 182 4 5 AHAAAA FFBAAA VVVVxx +606 812 0 2 6 6 6 6 6 106 606 12 13 IXAAAA GFBAAA AAAAxx +849 813 1 1 9 9 9 49 49 349 849 18 19 RGAAAA HFBAAA HHHHxx +34 814 0 2 4 14 4 34 34 34 34 8 9 IBAAAA IFBAAA OOOOxx +683 815 1 3 3 3 3 83 83 183 683 6 7 HAAAAA JFBAAA VVVVxx +134 816 0 2 4 14 4 34 134 134 134 8 9 EFAAAA KFBAAA AAAAxx +331 817 1 3 1 11 1 31 131 331 331 2 3 TMAAAA LFBAAA HHHHxx +808 818 0 0 8 8 8 8 8 308 808 16 17 CFAAAA MFBAAA OOOOxx +703 819 1 3 3 3 3 3 103 203 703 6 7 BBAAAA NFBAAA VVVVxx +669 820 1 1 9 9 9 69 69 169 669 18 19 TZAAAA OFBAAA AAAAxx +264 821 0 0 4 4 4 64 64 264 264 8 9 EKAAAA PFBAAA HHHHxx +277 822 1 1 7 17 7 77 77 277 277 14 15 RKAAAA QFBAAA OOOOxx +877 823 1 1 7 17 7 77 77 377 877 14 15 THAAAA RFBAAA VVVVxx +783 824 1 3 3 3 3 83 183 283 783 6 7 DEAAAA SFBAAA AAAAxx +791 825 1 3 1 11 1 91 191 291 791 2 3 LEAAAA TFBAAA HHHHxx +171 826 1 3 1 11 1 71 171 171 171 2 3 PGAAAA UFBAAA OOOOxx +564 827 0 0 4 4 4 64 164 64 564 8 9 SVAAAA VFBAAA VVVVxx +230 828 0 2 0 10 0 30 30 230 230 0 1 WIAAAA WFBAAA AAAAxx +881 829 1 1 1 1 1 81 81 381 881 2 3 XHAAAA XFBAAA HHHHxx +890 830 0 2 0 10 0 90 90 390 890 0 1 GIAAAA YFBAAA OOOOxx +374 831 0 2 4 14 4 74 174 374 374 8 9 KOAAAA ZFBAAA VVVVxx +697 832 1 1 7 17 7 97 97 197 697 14 15 VAAAAA AGBAAA AAAAxx +4 833 0 0 4 4 4 4 4 4 4 8 9 EAAAAA BGBAAA HHHHxx +385 834 1 1 5 5 5 85 185 385 385 10 11 VOAAAA CGBAAA OOOOxx +739 835 1 3 9 19 9 39 139 239 739 18 19 LCAAAA DGBAAA VVVVxx +623 836 1 3 3 3 3 23 23 123 623 6 7 ZXAAAA EGBAAA AAAAxx +547 837 1 3 7 7 7 47 147 47 547 14 15 BVAAAA FGBAAA HHHHxx +532 838 0 0 2 12 2 32 132 32 532 4 5 MUAAAA GGBAAA OOOOxx +383 839 1 3 3 3 3 83 183 383 383 6 7 TOAAAA HGBAAA VVVVxx +181 840 1 1 1 1 1 81 181 181 181 2 3 ZGAAAA IGBAAA AAAAxx +327 841 1 3 7 7 7 27 127 327 327 14 15 PMAAAA JGBAAA HHHHxx +701 842 1 1 1 1 1 1 101 201 701 2 3 ZAAAAA KGBAAA OOOOxx +111 843 1 3 1 11 1 11 111 111 111 2 3 HEAAAA LGBAAA VVVVxx +977 844 1 1 7 17 7 77 177 477 977 14 15 PLAAAA MGBAAA AAAAxx +431 845 1 3 1 11 1 31 31 431 431 2 3 PQAAAA NGBAAA HHHHxx +456 846 0 0 6 16 6 56 56 456 456 12 13 ORAAAA OGBAAA OOOOxx +368 847 0 0 8 8 8 68 168 368 368 16 17 EOAAAA PGBAAA VVVVxx +32 848 0 0 2 12 2 32 32 32 32 4 5 GBAAAA QGBAAA AAAAxx +125 849 1 1 5 5 5 25 125 125 125 10 11 VEAAAA RGBAAA HHHHxx +847 850 1 3 7 7 7 47 47 347 847 14 15 PGAAAA SGBAAA OOOOxx +485 851 1 1 5 5 5 85 85 485 485 10 11 RSAAAA TGBAAA VVVVxx +387 852 1 3 7 7 7 87 187 387 387 14 15 XOAAAA UGBAAA AAAAxx +288 853 0 0 8 8 8 88 88 288 288 16 17 CLAAAA VGBAAA HHHHxx +919 854 1 3 9 19 9 19 119 419 919 18 19 JJAAAA WGBAAA OOOOxx +393 855 1 1 3 13 3 93 193 393 393 6 7 DPAAAA XGBAAA VVVVxx +953 856 1 1 3 13 3 53 153 453 953 6 7 RKAAAA YGBAAA AAAAxx +798 857 0 2 8 18 8 98 198 298 798 16 17 SEAAAA ZGBAAA HHHHxx +940 858 0 0 0 0 0 40 140 440 940 0 1 EKAAAA AHBAAA OOOOxx +198 859 0 2 8 18 8 98 198 198 198 16 17 QHAAAA BHBAAA VVVVxx +25 860 1 1 5 5 5 25 25 25 25 10 11 ZAAAAA CHBAAA AAAAxx +190 861 0 2 0 10 0 90 190 190 190 0 1 IHAAAA DHBAAA HHHHxx +820 862 0 0 0 0 0 20 20 320 820 0 1 OFAAAA EHBAAA OOOOxx +15 863 1 3 5 15 5 15 15 15 15 10 11 PAAAAA FHBAAA VVVVxx +427 864 1 3 7 7 7 27 27 427 427 14 15 LQAAAA GHBAAA AAAAxx +349 865 1 1 9 9 9 49 149 349 349 18 19 LNAAAA HHBAAA HHHHxx +785 866 1 1 5 5 5 85 185 285 785 10 11 FEAAAA IHBAAA OOOOxx +340 867 0 0 0 0 0 40 140 340 340 0 1 CNAAAA JHBAAA VVVVxx +292 868 0 0 2 12 2 92 92 292 292 4 5 GLAAAA KHBAAA AAAAxx +17 869 1 1 7 17 7 17 17 17 17 14 15 RAAAAA LHBAAA HHHHxx +985 870 1 1 5 5 5 85 185 485 985 10 11 XLAAAA MHBAAA OOOOxx +645 871 1 1 5 5 5 45 45 145 645 10 11 VYAAAA NHBAAA VVVVxx +631 872 1 3 1 11 1 31 31 131 631 2 3 HYAAAA OHBAAA AAAAxx +761 873 1 1 1 1 1 61 161 261 761 2 3 HDAAAA PHBAAA HHHHxx +707 874 1 3 7 7 7 7 107 207 707 14 15 FBAAAA QHBAAA OOOOxx +776 875 0 0 6 16 6 76 176 276 776 12 13 WDAAAA RHBAAA VVVVxx +856 876 0 0 6 16 6 56 56 356 856 12 13 YGAAAA SHBAAA AAAAxx +978 877 0 2 8 18 8 78 178 478 978 16 17 QLAAAA THBAAA HHHHxx +710 878 0 2 0 10 0 10 110 210 710 0 1 IBAAAA UHBAAA OOOOxx +604 879 0 0 4 4 4 4 4 104 604 8 9 GXAAAA VHBAAA VVVVxx +291 880 1 3 1 11 1 91 91 291 291 2 3 FLAAAA WHBAAA AAAAxx +747 881 1 3 7 7 7 47 147 247 747 14 15 TCAAAA XHBAAA HHHHxx +837 882 1 1 7 17 7 37 37 337 837 14 15 FGAAAA YHBAAA OOOOxx +722 883 0 2 2 2 2 22 122 222 722 4 5 UBAAAA ZHBAAA VVVVxx +925 884 1 1 5 5 5 25 125 425 925 10 11 PJAAAA AIBAAA AAAAxx +49 885 1 1 9 9 9 49 49 49 49 18 19 XBAAAA BIBAAA HHHHxx +832 886 0 0 2 12 2 32 32 332 832 4 5 AGAAAA CIBAAA OOOOxx +336 887 0 0 6 16 6 36 136 336 336 12 13 YMAAAA DIBAAA VVVVxx +185 888 1 1 5 5 5 85 185 185 185 10 11 DHAAAA EIBAAA AAAAxx +434 889 0 2 4 14 4 34 34 434 434 8 9 SQAAAA FIBAAA HHHHxx +284 890 0 0 4 4 4 84 84 284 284 8 9 YKAAAA GIBAAA OOOOxx +812 891 0 0 2 12 2 12 12 312 812 4 5 GFAAAA HIBAAA VVVVxx +810 892 0 2 0 10 0 10 10 310 810 0 1 EFAAAA IIBAAA AAAAxx +252 893 0 0 2 12 2 52 52 252 252 4 5 SJAAAA JIBAAA HHHHxx +965 894 1 1 5 5 5 65 165 465 965 10 11 DLAAAA KIBAAA OOOOxx +110 895 0 2 0 10 0 10 110 110 110 0 1 GEAAAA LIBAAA VVVVxx +698 896 0 2 8 18 8 98 98 198 698 16 17 WAAAAA MIBAAA AAAAxx +283 897 1 3 3 3 3 83 83 283 283 6 7 XKAAAA NIBAAA HHHHxx +533 898 1 1 3 13 3 33 133 33 533 6 7 NUAAAA OIBAAA OOOOxx +662 899 0 2 2 2 2 62 62 162 662 4 5 MZAAAA PIBAAA VVVVxx +329 900 1 1 9 9 9 29 129 329 329 18 19 RMAAAA QIBAAA AAAAxx +250 901 0 2 0 10 0 50 50 250 250 0 1 QJAAAA RIBAAA HHHHxx +407 902 1 3 7 7 7 7 7 407 407 14 15 RPAAAA SIBAAA OOOOxx +823 903 1 3 3 3 3 23 23 323 823 6 7 RFAAAA TIBAAA VVVVxx +852 904 0 0 2 12 2 52 52 352 852 4 5 UGAAAA UIBAAA AAAAxx +871 905 1 3 1 11 1 71 71 371 871 2 3 NHAAAA VIBAAA HHHHxx +118 906 0 2 8 18 8 18 118 118 118 16 17 OEAAAA WIBAAA OOOOxx +912 907 0 0 2 12 2 12 112 412 912 4 5 CJAAAA XIBAAA VVVVxx +458 908 0 2 8 18 8 58 58 458 458 16 17 QRAAAA YIBAAA AAAAxx +926 909 0 2 6 6 6 26 126 426 926 12 13 QJAAAA ZIBAAA HHHHxx +328 910 0 0 8 8 8 28 128 328 328 16 17 QMAAAA AJBAAA OOOOxx +980 911 0 0 0 0 0 80 180 480 980 0 1 SLAAAA BJBAAA VVVVxx +259 912 1 3 9 19 9 59 59 259 259 18 19 ZJAAAA CJBAAA AAAAxx +900 913 0 0 0 0 0 0 100 400 900 0 1 QIAAAA DJBAAA HHHHxx +137 914 1 1 7 17 7 37 137 137 137 14 15 HFAAAA EJBAAA OOOOxx +159 915 1 3 9 19 9 59 159 159 159 18 19 DGAAAA FJBAAA VVVVxx +243 916 1 3 3 3 3 43 43 243 243 6 7 JJAAAA GJBAAA AAAAxx +472 917 0 0 2 12 2 72 72 472 472 4 5 ESAAAA HJBAAA HHHHxx +796 918 0 0 6 16 6 96 196 296 796 12 13 QEAAAA IJBAAA OOOOxx +382 919 0 2 2 2 2 82 182 382 382 4 5 SOAAAA JJBAAA VVVVxx +911 920 1 3 1 11 1 11 111 411 911 2 3 BJAAAA KJBAAA AAAAxx +179 921 1 3 9 19 9 79 179 179 179 18 19 XGAAAA LJBAAA HHHHxx +778 922 0 2 8 18 8 78 178 278 778 16 17 YDAAAA MJBAAA OOOOxx +405 923 1 1 5 5 5 5 5 405 405 10 11 PPAAAA NJBAAA VVVVxx +265 924 1 1 5 5 5 65 65 265 265 10 11 FKAAAA OJBAAA AAAAxx +556 925 0 0 6 16 6 56 156 56 556 12 13 KVAAAA PJBAAA HHHHxx +16 926 0 0 6 16 6 16 16 16 16 12 13 QAAAAA QJBAAA OOOOxx +706 927 0 2 6 6 6 6 106 206 706 12 13 EBAAAA RJBAAA VVVVxx +497 928 1 1 7 17 7 97 97 497 497 14 15 DTAAAA SJBAAA AAAAxx +708 929 0 0 8 8 8 8 108 208 708 16 17 GBAAAA TJBAAA HHHHxx +46 930 0 2 6 6 6 46 46 46 46 12 13 UBAAAA UJBAAA OOOOxx +901 931 1 1 1 1 1 1 101 401 901 2 3 RIAAAA VJBAAA VVVVxx +416 932 0 0 6 16 6 16 16 416 416 12 13 AQAAAA WJBAAA AAAAxx +307 933 1 3 7 7 7 7 107 307 307 14 15 VLAAAA XJBAAA HHHHxx +166 934 0 2 6 6 6 66 166 166 166 12 13 KGAAAA YJBAAA OOOOxx +178 935 0 2 8 18 8 78 178 178 178 16 17 WGAAAA ZJBAAA VVVVxx +499 936 1 3 9 19 9 99 99 499 499 18 19 FTAAAA AKBAAA AAAAxx +257 937 1 1 7 17 7 57 57 257 257 14 15 XJAAAA BKBAAA HHHHxx +342 938 0 2 2 2 2 42 142 342 342 4 5 ENAAAA CKBAAA OOOOxx +850 939 0 2 0 10 0 50 50 350 850 0 1 SGAAAA DKBAAA VVVVxx +313 940 1 1 3 13 3 13 113 313 313 6 7 BMAAAA EKBAAA AAAAxx +831 941 1 3 1 11 1 31 31 331 831 2 3 ZFAAAA FKBAAA HHHHxx +57 942 1 1 7 17 7 57 57 57 57 14 15 FCAAAA GKBAAA OOOOxx +37 943 1 1 7 17 7 37 37 37 37 14 15 LBAAAA HKBAAA VVVVxx +511 944 1 3 1 11 1 11 111 11 511 2 3 RTAAAA IKBAAA AAAAxx +578 945 0 2 8 18 8 78 178 78 578 16 17 GWAAAA JKBAAA HHHHxx +100 946 0 0 0 0 0 0 100 100 100 0 1 WDAAAA KKBAAA OOOOxx +935 947 1 3 5 15 5 35 135 435 935 10 11 ZJAAAA LKBAAA VVVVxx +821 948 1 1 1 1 1 21 21 321 821 2 3 PFAAAA MKBAAA AAAAxx +294 949 0 2 4 14 4 94 94 294 294 8 9 ILAAAA NKBAAA HHHHxx +575 950 1 3 5 15 5 75 175 75 575 10 11 DWAAAA OKBAAA OOOOxx +272 951 0 0 2 12 2 72 72 272 272 4 5 MKAAAA PKBAAA VVVVxx +491 952 1 3 1 11 1 91 91 491 491 2 3 XSAAAA QKBAAA AAAAxx +43 953 1 3 3 3 3 43 43 43 43 6 7 RBAAAA RKBAAA HHHHxx +167 954 1 3 7 7 7 67 167 167 167 14 15 LGAAAA SKBAAA OOOOxx +457 955 1 1 7 17 7 57 57 457 457 14 15 PRAAAA TKBAAA VVVVxx +647 956 1 3 7 7 7 47 47 147 647 14 15 XYAAAA UKBAAA AAAAxx +180 957 0 0 0 0 0 80 180 180 180 0 1 YGAAAA VKBAAA HHHHxx +48 958 0 0 8 8 8 48 48 48 48 16 17 WBAAAA WKBAAA OOOOxx +553 959 1 1 3 13 3 53 153 53 553 6 7 HVAAAA XKBAAA VVVVxx +188 960 0 0 8 8 8 88 188 188 188 16 17 GHAAAA YKBAAA AAAAxx +262 961 0 2 2 2 2 62 62 262 262 4 5 CKAAAA ZKBAAA HHHHxx +728 962 0 0 8 8 8 28 128 228 728 16 17 ACAAAA ALBAAA OOOOxx +581 963 1 1 1 1 1 81 181 81 581 2 3 JWAAAA BLBAAA VVVVxx +937 964 1 1 7 17 7 37 137 437 937 14 15 BKAAAA CLBAAA AAAAxx +370 965 0 2 0 10 0 70 170 370 370 0 1 GOAAAA DLBAAA HHHHxx +590 966 0 2 0 10 0 90 190 90 590 0 1 SWAAAA ELBAAA OOOOxx +421 967 1 1 1 1 1 21 21 421 421 2 3 FQAAAA FLBAAA VVVVxx +693 968 1 1 3 13 3 93 93 193 693 6 7 RAAAAA GLBAAA AAAAxx +906 969 0 2 6 6 6 6 106 406 906 12 13 WIAAAA HLBAAA HHHHxx +802 970 0 2 2 2 2 2 2 302 802 4 5 WEAAAA ILBAAA OOOOxx +38 971 0 2 8 18 8 38 38 38 38 16 17 MBAAAA JLBAAA VVVVxx +790 972 0 2 0 10 0 90 190 290 790 0 1 KEAAAA KLBAAA AAAAxx +726 973 0 2 6 6 6 26 126 226 726 12 13 YBAAAA LLBAAA HHHHxx +23 974 1 3 3 3 3 23 23 23 23 6 7 XAAAAA MLBAAA OOOOxx +641 975 1 1 1 1 1 41 41 141 641 2 3 RYAAAA NLBAAA VVVVxx +524 976 0 0 4 4 4 24 124 24 524 8 9 EUAAAA OLBAAA AAAAxx +169 977 1 1 9 9 9 69 169 169 169 18 19 NGAAAA PLBAAA HHHHxx +6 978 0 2 6 6 6 6 6 6 6 12 13 GAAAAA QLBAAA OOOOxx +943 979 1 3 3 3 3 43 143 443 943 6 7 HKAAAA RLBAAA VVVVxx +26 980 0 2 6 6 6 26 26 26 26 12 13 ABAAAA SLBAAA AAAAxx +469 981 1 1 9 9 9 69 69 469 469 18 19 BSAAAA TLBAAA HHHHxx +968 982 0 0 8 8 8 68 168 468 968 16 17 GLAAAA ULBAAA OOOOxx +947 983 1 3 7 7 7 47 147 447 947 14 15 LKAAAA VLBAAA VVVVxx +133 984 1 1 3 13 3 33 133 133 133 6 7 DFAAAA WLBAAA AAAAxx +52 985 0 0 2 12 2 52 52 52 52 4 5 ACAAAA XLBAAA HHHHxx +660 986 0 0 0 0 0 60 60 160 660 0 1 KZAAAA YLBAAA OOOOxx +780 987 0 0 0 0 0 80 180 280 780 0 1 AEAAAA ZLBAAA VVVVxx +963 988 1 3 3 3 3 63 163 463 963 6 7 BLAAAA AMBAAA AAAAxx +561 989 1 1 1 1 1 61 161 61 561 2 3 PVAAAA BMBAAA HHHHxx +402 990 0 2 2 2 2 2 2 402 402 4 5 MPAAAA CMBAAA OOOOxx +437 991 1 1 7 17 7 37 37 437 437 14 15 VQAAAA DMBAAA VVVVxx +112 992 0 0 2 12 2 12 112 112 112 4 5 IEAAAA EMBAAA AAAAxx +247 993 1 3 7 7 7 47 47 247 247 14 15 NJAAAA FMBAAA HHHHxx +579 994 1 3 9 19 9 79 179 79 579 18 19 HWAAAA GMBAAA OOOOxx +379 995 1 3 9 19 9 79 179 379 379 18 19 POAAAA HMBAAA VVVVxx +74 996 0 2 4 14 4 74 74 74 74 8 9 WCAAAA IMBAAA AAAAxx +744 997 0 0 4 4 4 44 144 244 744 8 9 QCAAAA JMBAAA HHHHxx +0 998 0 0 0 0 0 0 0 0 0 0 1 AAAAAA KMBAAA OOOOxx +278 999 0 2 8 18 8 78 78 278 278 16 17 SKAAAA LMBAAA VVVVxx diff --git a/src/test/singlenode_regress/data/order.csv b/src/test/singlenode_regress/data/order.csv new file mode 100644 index 00000000000..9ed9f636fec --- /dev/null +++ b/src/test/singlenode_regress/data/order.csv @@ -0,0 +1,13502 @@ +5987|637|O|175766.07|1996-08-03|1-URGENT|Clerk#000000464|0| ideas. quietly final accounts haggle blithely pending escapade +5988|293|F|63006.40|1993-11-22|4-NOT SPECIFIED|Clerk#000000867|0|fully express accounts. final pi +5989|710|O|351029.36|1995-10-15|3-MEDIUM|Clerk#000000028|0|aggle furiously final Tiresias. quickly ironi +5990|649|F|171275.64|1993-04-08|1-URGENT|Clerk#000000831|0|packages. ideas use besides the car +5991|1418|F|47884.84|1994-05-06|2-HIGH|Clerk#000000356|0|ep carefully requests. bold ac +6016|217|F|97868.02|1992-01-21|2-HIGH|Clerk#000000119|0|s requests detect. even accounts are slyly ironic deposits. s +6017|487|F|144069.95|1995-01-31|1-URGENT|Clerk#000000714|0|lly unusual accounts wake final, regul +6018|833|F|21700.13|1992-08-19|5-LOW|Clerk#000000919|0|lly final courts should have t +6019|568|F|35683.15|1993-08-06|5-LOW|Clerk#000000153|0|furiously along the carefully ironic packages. quickly spec +6020|73|F|324458.58|1994-09-22|3-MEDIUM|Clerk#000000422|0|ckages. blithely pend +6021|685|O|217068.20|1997-11-06|5-LOW|Clerk#000000637|0|ckages-- furiously express pinto beans +6022|13|F|304442.62|1995-02-13|1-URGENT|Clerk#000000899|0|al dependencies affix according to the +6023|1111|O|223643.68|1998-04-10|4-NOT SPECIFIED|Clerk#000000373|0|en packages unwind unus +6048|1366|O|145836.84|1996-04-13|5-LOW|Clerk#000000456|0|ress excuses wake final excuses. quic +6049|446|O|202122.63|1998-03-10|3-MEDIUM|Clerk#000000242|0|ve the furiously ironic instructions. carefully thin packages integrate a +6050|1339|F|168613.74|1993-03-29|5-LOW|Clerk#000000860|0|platelets. final asympt +6051|538|O|257453.48|1998-05-13|3-MEDIUM|Clerk#000000077|0|ly regular asymptotes cajole slyly above the blithely regu +6052|841|F|75561.24|1993-04-16|1-URGENT|Clerk#000000812|0|ular pinto beans haggle fluffily silent accounts. blithely final forges wake +6053|1342|F|74179.94|1993-12-12|3-MEDIUM|Clerk#000000262|0|ts about the bold, even pinto beans detect fluffily about th +6054|16|O|122472.87|1995-09-09|5-LOW|Clerk#000000610|0|ymptotes haggle among the slyly brave foxes. pending instruc +6055|955|O|189694.43|1996-11-11|1-URGENT|Clerk#000000643|0|quests grow carefully. ironic requests haggle furiously blithely regular +6080|424|O|68924.97|1996-06-05|4-NOT SPECIFIED|Clerk#000000321|0|kly express deposits. regular deposits cajole carefully sly, express asymptote +6081|1406|O|198298.89|1997-11-05|1-URGENT|Clerk#000000663|0|refully final grouches. ironic, regular packages are. quickly final p +6082|1387|O|110494.23|1996-03-03|1-URGENT|Clerk#000000820|0|etect furiously furiously +6083|1214|O|96646.65|1996-07-16|5-LOW|Clerk#000000462|0|sits affix quickly above the final instructions. carefully regular accounts d +6084|620|O|114526.08|1996-12-17|2-HIGH|Clerk#000000797|0|ing deposits should use. furiously silen +6085|553|O|41700.15|1998-02-09|3-MEDIUM|Clerk#000000340|0|s according to the carefully even pinto beans cajole +6086|659|O|236234.94|1995-09-23|1-URGENT|Clerk#000000743|0|ely regular pinto beans. even platelets boost furiously +6087|736|O|292400.53|1998-01-10|2-HIGH|Clerk#000000829|0| carefully express requests. pending, express packag +6112|58|F|157784.88|1994-08-24|3-MEDIUM|Clerk#000000021|0|above the carefully thi +6113|575|O|241087.35|1998-07-16|4-NOT SPECIFIED|Clerk#000000806|0| affix quickly. slyly bold requests sleep slyly sometimes e +6114|850|O|136395.05|1998-04-12|5-LOW|Clerk#000000282|0|osits. never ironic pint +6115|1441|F|247369.15|1993-09-12|3-MEDIUM|Clerk#000000363|0|iously around the final requests. fl +6116|1348|F|211977.10|1994-03-21|3-MEDIUM|Clerk#000000605|0|ly despite the slyly final instructions. dinos cajole grouches. furiously r +6117|167|F|183526.40|1992-12-22|1-URGENT|Clerk#000000763|0|always. special dec +6118|1270|O|170763.15|1997-03-26|5-LOW|Clerk#000000720|0|equests wake blithely fluffily ironic deposits. a +6119|1093|F|79171.18|1992-07-04|2-HIGH|Clerk#000000354|0|s wake above the blithely idle accounts. pending, regular package +6144|244|F|115377.95|1994-06-22|1-URGENT|Clerk#000000444|0|es against the carefully express +6145|856|O|26852.63|1998-04-12|5-LOW|Clerk#000000211|0|ts boost carefully furiously express deposi +6146|160|O|92229.34|1995-12-01|5-LOW|Clerk#000000362|0|ges except the blithely express somas hag +6147|869|O|182519.92|1995-10-02|1-URGENT|Clerk#000000134|0|carefully special acco +6148|445|O|92042.57|1995-12-25|3-MEDIUM|Clerk#000000291|0|lent deposits. depen +6149|623|O|1864.64|1996-11-17|5-LOW|Clerk#000000964|0|sts until the furiou +6150|886|F|250974.95|1992-10-02|1-URGENT|Clerk#000000064|0| carefully final foxes. carefully silent depo +6151|370|F|60686.70|1993-07-12|1-URGENT|Clerk#000000807|0|s are ironically. ironic br +6176|115|O|79069.17|1996-11-11|5-LOW|Clerk#000000531|0|ly special foxes near +6177|1097|O|137708.62|1997-06-30|4-NOT SPECIFIED|Clerk#000000539|0|cajole slyly at the thin theodolites. furiously final courts +6178|650|O|58530.98|1995-08-09|2-HIGH|Clerk#000000817|0|s affix fluffily enticingly final dependencies. multipliers are final, +6179|1231|F|229557.30|1994-06-03|4-NOT SPECIFIED|Clerk#000000741|0|tes according to the furiously special packages are +6180|398|F|121314.01|1995-04-12|3-MEDIUM|Clerk#000000807|0|s after the regular, unusual accounts nag pinto beans. pend +6181|499|O|44313.40|1996-05-15|2-HIGH|Clerk#000000441|0|the furiously even deposits use slyly ironic deposits. blithely special fox +6182|1465|F|272647.03|1992-07-22|5-LOW|Clerk#000000149|0|s are carefully. even, final requests cajole. regular, bold +6183|338|F|219611.42|1992-06-16|3-MEDIUM|Clerk#000000157|0|s. deposits boost furiously caref +6208|622|O|97758.39|1996-10-06|4-NOT SPECIFIED|Clerk#000000526|0|jole. slow instructio +6209|1084|O|139391.54|1996-08-03|4-NOT SPECIFIED|Clerk#000000335|0|ly regular orbits. carefully quiet orbits sleep furiously furi +6210|686|O|221058.76|1996-11-06|5-LOW|Clerk#000000351|0|le slyly slyly silent courts. sentime +6211|1294|F|147948.12|1994-11-24|1-URGENT|Clerk#000000850|0| ironic accounts may hinder across the car +6212|115|O|37842.28|1996-05-01|3-MEDIUM|Clerk#000000786|0| are furiously above the even, silent deposits. carefully +6213|1067|O|59338.89|1995-07-25|5-LOW|Clerk#000000337|0|always pending deposits. quickly pending fox +6214|148|O|3941.84|1996-07-03|3-MEDIUM|Clerk#000000711|0|ously bold forges. carefully even theodolites sublate slyly depo +6215|619|O|334919.60|1996-11-24|4-NOT SPECIFIED|Clerk#000000550|0|quests cajole slyly carefully regular ideas. careful +6240|1202|O|194944.85|1998-06-03|1-URGENT|Clerk#000000407|0|carefully above the asymptotes. fluffily express courts sleep slyly above t +6241|136|F|87037.94|1994-12-30|5-LOW|Clerk#000000353|0|dencies snooze furiously above the blithely ironic p +6242|472|O|199497.95|1997-12-02|3-MEDIUM|Clerk#000000172|0|sits cajole blithely. pending accounts along the brave pinto beans will hav +6243|241|F|81333.16|1994-09-28|4-NOT SPECIFIED|Clerk#000000358|0|lent attainments? ironic, even dolphins above the furiously final inst +6244|1423|F|60185.35|1993-08-19|2-HIGH|Clerk#000000549|0|ic packages. regular platelets believe furiously foxes. blithely pen +6245|733|O|99101.88|1997-11-10|3-MEDIUM|Clerk#000000167|0|oxes cajole final foxes? ruthlessly special pinto beans boost against the foxe +6246|712|F|245217.34|1994-10-22|4-NOT SPECIFIED|Clerk#000000229|0|equests wake busily bold theodolites. even instruc +6247|466|O|51480.94|1996-11-22|3-MEDIUM|Clerk#000000324|0|dle, even accounts. ca +6272|898|F|228876.91|1993-02-28|2-HIGH|Clerk#000000434|0| packages boost quickly even, even excuses! slyly ironic instruction +6273|43|F|30827.17|1995-02-06|1-URGENT|Clerk#000000206|0|above the fluffily regular accounts! furiously ironic ideas sleep regular +6274|79|O|218754.47|1995-07-15|4-NOT SPECIFIED|Clerk#000000061|0|packages. carefully express deposits dazzle quickly fur +6275|116|O|215131.20|1996-12-24|1-URGENT|Clerk#000000818|0| pinto beans cajole. quickly unusual ideas caj +6276|736|P|188453.84|1995-05-08|5-LOW|Clerk#000000914|0|he always express platelets. spe +6277|563|O|127760.48|1997-01-28|3-MEDIUM|Clerk#000000104|0|furiously regular dolphins use quickly around the +6278|337|F|160399.31|1992-01-05|2-HIGH|Clerk#000000042|0|ironic deposits sleep carefully at the fluffily regular acc +6279|1109|F|74788.10|1993-01-30|1-URGENT|Clerk#000000519|0|about the regular frays. blithely regular courts wake +6304|560|O|124120.12|1995-08-12|2-HIGH|Clerk#000000628|0|jole slyly around the dogged ideas. slyly regular dependencies are blithely. +6305|79|O|218216.09|1997-01-16|4-NOT SPECIFIED|Clerk#000000759|0|p regular, quiet foxes. furiously unusual pac +6306|13|O|24140.16|1998-05-04|4-NOT SPECIFIED|Clerk#000000005|0|s haggle fluffily carefully pe +6307|23|O|47944.47|1997-11-06|4-NOT SPECIFIED|Clerk#000000287|0| above the regular, even asymptotes. iron +6308|895|O|40723.24|1997-07-11|2-HIGH|Clerk#000000231|0|und the fluffily bold packages. blithely final plat +6309|1300|F|218103.18|1993-06-10|3-MEDIUM|Clerk#000000476|0|efully alongside of the quickly special requests. qu +6310|712|F|271339.83|1994-05-04|4-NOT SPECIFIED|Clerk#000000272|0|silent packages are carefully. packages +6311|622|F|42859.41|1993-02-11|3-MEDIUM|Clerk#000000844|0|ndencies cajole furiously alongside of the regular grouches. p +6336|1312|O|75041.38|1995-08-29|2-HIGH|Clerk#000000875|0|solve blithely blithely regular instructions! blithely final req +6337|1159|O|201043.71|1995-09-01|4-NOT SPECIFIED|Clerk#000000301|0|r ideas boost. even, unusual pint +6338|1480|F|126794.13|1992-02-25|5-LOW|Clerk#000000413|0|lent deposits boost doggedly afte +6339|1156|F|138811.00|1992-12-12|1-URGENT|Clerk#000000413|0|. blithely unusual platelets kindl +6340|232|O|217548.67|1996-10-09|3-MEDIUM|Clerk#000000638|0|requests sleep carefully. slyly bold pac +6341|1270|O|178632.66|1996-06-08|3-MEDIUM|Clerk#000000910|0| grow alongside of the ironically ironic foxes. ironically final acc +6342|287|O|187784.60|1997-11-25|1-URGENT|Clerk#000000859|0|ickly after the furiou +6343|743|O|289069.48|1998-03-18|4-NOT SPECIFIED|Clerk#000000072|0|ccounts wake permanently. dependencies nag carefully across the quickly fina +6368|515|F|175352.65|1994-02-23|4-NOT SPECIFIED|Clerk#000000262|0| bold accounts. blithely even pinto beans hinder furiously slyly +6369|850|F|196618.52|1994-12-20|2-HIGH|Clerk#000000414|0|nto beans affix fluffily depe +6370|1204|F|57253.82|1992-12-30|3-MEDIUM|Clerk#000000281|0|press asymptotes. express, ironic account +6371|838|F|179096.82|1993-04-02|3-MEDIUM|Clerk#000000237|0|sly ironic forges. carefully final accounts use. blithely even theodolites hag +6372|517|F|159295.25|1994-02-27|4-NOT SPECIFIED|Clerk#000000852|0|unusual pinto beans. slyly regular accounts nag across the regular deposits +6373|385|F|178234.19|1992-01-24|4-NOT SPECIFIED|Clerk#000000432|0|ts among the foxes cajole arou +6374|898|O|155144.63|1995-08-08|1-URGENT|Clerk#000000058|0|ickly. furiously final packages +6375|217|O|271720.48|1997-11-13|4-NOT SPECIFIED|Clerk#000000466|0|beans integrate ironically. foxes poach quickly. depos +6400|823|F|106659.06|1994-01-24|3-MEDIUM|Clerk#000000166|0|nag slyly pending, express pains. fina +6401|1273|O|144203.63|1997-04-23|5-LOW|Clerk#000000941|0|ly. accounts are. packages are about the regular theodolites. blit +6402|395|P|215754.02|1995-04-24|5-LOW|Clerk#000000978|0|slyly regular requests sleep blit +6403|280|F|94578.04|1995-02-12|5-LOW|Clerk#000000816|0|r theodolites. final +6404|319|O|61110.56|1996-07-07|2-HIGH|Clerk#000000095|0| to the furiously express theodolites cajole furiously fluf +6405|1100|O|37656.00|1997-05-12|2-HIGH|Clerk#000000379|0|hely final deposits about the dol +6406|244|F|104536.06|1994-08-15|1-URGENT|Clerk#000000996|0|nal, unusual foxes ca +6407|847|O|106491.85|1995-07-25|2-HIGH|Clerk#000000873|0|packages. blithely regular platelets boost furiously slyly final plate +6432|304|O|181270.70|1995-11-11|1-URGENT|Clerk#000000116|0| slyly final deposits. carefully regular asympto +6433|766|O|287192.21|1995-11-23|3-MEDIUM|Clerk#000000494|0|ronic ideas cajole carefully express dolphins. carefully final ideas s +6434|976|F|180859.67|1994-06-08|2-HIGH|Clerk#000000643|0|lphins haggle quickly +6435|1138|O|269746.89|1996-06-01|1-URGENT|Clerk#000000355|0|es breach carefully. ideas nag. slyly regular packages a +6436|1046|F|17014.61|1992-03-02|5-LOW|Clerk#000000858|0|unusual theodolites. slyly final requests inte +6437|1162|F|198960.61|1994-02-04|1-URGENT|Clerk#000000328|0|carefully above the +6438|1084|F|119623.94|1993-05-17|4-NOT SPECIFIED|Clerk#000000814|0|ckages wake carefully according to th +6439|988|O|229454.16|1995-07-03|3-MEDIUM|Clerk#000000611|0|theodolites along the carefully final deposits wake furiously +6464|160|F|169920.37|1994-05-29|3-MEDIUM|Clerk#000000601|0| final theodolites after the silent accounts may hagg +6465|943|O|214899.89|1995-08-13|5-LOW|Clerk#000000713|0|s wake slyly carefully +6466|169|O|42804.39|1997-04-06|1-URGENT|Clerk#000000289|0|eep about the furiously special accounts +6467|754|O|56503.77|1998-03-02|4-NOT SPECIFIED|Clerk#000000510|0|osits. fluffily final packages boost by the +6468|1054|O|30752.09|1996-09-09|5-LOW|Clerk#000000215|0|e carefully regular courts. special packages integrate furiously across +6469|746|O|275767.20|1996-03-09|3-MEDIUM|Clerk#000000974|0|ckages use carefully careful +6470|62|O|300362.24|1995-09-11|5-LOW|Clerk#000000421|0|yly among the blithely careful dolphins. ironic account +6471|952|O|283397.96|1998-03-01|5-LOW|Clerk#000000775|0|egular platelets cajole quickly +6496|443|O|213862.90|1995-06-30|1-URGENT|Clerk#000000015|0| pending deposits cajole around +6497|452|O|47029.15|1997-10-02|3-MEDIUM|Clerk#000000430|0|tions wake furiously fluffily enticing platele +6498|1229|F|82192.11|1994-03-18|3-MEDIUM|Clerk#000000987|0|e. even accounts past +6499|118|O|94392.60|1995-05-09|1-URGENT|Clerk#000000647|0|sly. accounts with the slyly final asymptotes are furiously regular pac +6500|772|F|116920.53|1992-10-13|1-URGENT|Clerk#000000203|0|ainst the quickly ironic dependencies. carefully i +6501|34|F|169372.97|1992-01-14|2-HIGH|Clerk#000000637|0|posits sleep furiously. furiously regu +6502|1364|O|132481.49|1995-08-21|3-MEDIUM|Clerk#000000528|0| whithout the furio +6503|200|O|126966.13|1997-07-09|5-LOW|Clerk#000000528|0|e the express reques +6528|1127|F|174394.90|1993-02-04|2-HIGH|Clerk#000000133|0|ven deposits. ironic, final +6529|541|F|180161.70|1992-11-27|3-MEDIUM|Clerk#000000591|0|t. close accounts nag slyly according to +6530|64|O|7676.10|1997-08-05|1-URGENT|Clerk#000000912|0|the furiously sly depende +6531|593|F|200954.37|1993-07-18|2-HIGH|Clerk#000000947|0|ly special excuses sleep after the r +6532|4|O|129232.21|1996-02-18|1-URGENT|Clerk#000000046|0|al excuses wake special +6533|79|O|204973.10|1998-03-05|3-MEDIUM|Clerk#000000114|0|s kindle busily requests. ironic, pending depos +6534|970|O|31457.22|1997-04-20|1-URGENT|Clerk#000000668|0|ideas print slyly at t +6535|244|F|207170.87|1992-06-13|1-URGENT|Clerk#000000650|0|s. ironic, even theodolites haggle +6560|1204|F|318034.04|1995-01-05|5-LOW|Clerk#000000328|0|ven packages. deposits wake furiously enticingly regular theodolites; un +6561|1402|F|200779.81|1994-05-19|2-HIGH|Clerk#000000813|0| have to are furiously furiously even deposits. carefu +6562|643|F|221812.30|1994-12-21|1-URGENT|Clerk#000000616|0|ely ironic, permanent deposits. blithely busy grouches wak +6563|1055|F|94449.31|1992-11-06|5-LOW|Clerk#000000666|0|he fluffily final requests s +6564|565|F|150871.17|1995-01-22|5-LOW|Clerk#000000777|0|nic forges! quickly unusual packages haggle. blithely reg +6565|277|O|262344.82|1997-02-25|4-NOT SPECIFIED|Clerk#000000657|0|final dependencies. blithely express pinto +6566|1369|P|175594.82|1995-05-22|1-URGENT|Clerk#000000218|0|al notornis. blithely express pac +6567|1294|O|53318.58|1997-07-22|2-HIGH|Clerk#000000402|0| deposits haggle. slyly fluffy dependencies sleep carefully packages. +6592|221|F|240055.49|1994-12-02|5-LOW|Clerk#000000213|0|he slyly final somas. slyly final accounts above +6593|293|O|123753.91|1997-05-16|2-HIGH|Clerk#000000678|0|ular deposits cajole furiously. doggedly regular accounts c +6594|1288|O|205591.26|1996-08-23|1-URGENT|Clerk#000000712|0|final deposits above the stealthily even packages +6595|881|F|24750.02|1992-10-03|1-URGENT|Clerk#000000220|0|onic, even dependencies sleep +6596|1120|O|169485.95|1995-07-22|5-LOW|Clerk#000000106|0|rough the blithely even pinto beans. quickl +6597|1189|O|100902.30|1998-06-27|5-LOW|Clerk#000000392|0| furiously about the slyly spec +6598|109|F|66566.87|1992-05-08|3-MEDIUM|Clerk#000000691|0|ts. quickly ironic p +6599|599|O|214143.21|1998-04-17|5-LOW|Clerk#000000365|0| x-ray fluffily according to the fu +6624|1130|O|44018.37|1997-08-18|1-URGENT|Clerk#000000553|0|e fluffily according to the ideas +6625|1345|F|15961.57|1993-08-16|2-HIGH|Clerk#000000228|0|rious theodolites against +6626|575|F|104789.96|1994-05-07|1-URGENT|Clerk#000000213|0|ans. carefully even dolphins +6627|967|P|86219.59|1995-03-26|5-LOW|Clerk#000000603|0| the instructions. blithely eve +6628|448|F|137905.54|1994-04-28|3-MEDIUM|Clerk#000000644|0|uests detect. blithel +6629|1094|F|198981.29|1994-01-26|1-URGENT|Clerk#000000153|0|s deposits. blithely special Tiresias thrash +6630|800|O|324687.23|1996-12-05|2-HIGH|Clerk#000000006|0|carefully even asymptotes. furiously bold platelets are along +6631|481|O|214850.36|1995-09-06|3-MEDIUM|Clerk#000000819|0|ithely. even frets around the regula +6656|754|F|229247.93|1994-05-16|1-URGENT|Clerk#000000497|0| multipliers grow furiously. blithely express courts integr +6657|463|F|41401.44|1992-01-03|4-NOT SPECIFIED|Clerk#000000820|0|ously among the blithely pending dependencies. blithely pending theo +6658|1486|O|42751.67|1996-06-29|5-LOW|Clerk#000000453|0|uests sleep furiously regular pinto beans. carefully even foxes boost fur +6659|164|O|78331.25|1998-01-12|4-NOT SPECIFIED|Clerk#000000467|0|e. carefully unusual deposits use s +6660|1477|O|126082.62|1998-05-06|5-LOW|Clerk#000000336|0|ckly regular packages. sometimes ironic platelets are at the care +6661|31|F|60572.38|1993-04-17|5-LOW|Clerk#000000669|0|e regularly ironic packages. pending, regular instructions haggle +6662|214|O|136940.91|1995-11-23|4-NOT SPECIFIED|Clerk#000000319|0|nts nag furiously fluffily +6663|577|F|129944.60|1995-02-03|2-HIGH|Clerk#000000141|0|posits wake slyly slyly i +6688|1187|O|123509.63|1997-02-24|1-URGENT|Clerk#000000987|0|ly after the fluffily regular accounts. blithely ironic deposits along the +6689|757|O|62749.57|1997-06-02|1-URGENT|Clerk#000000571|0| ideas wake fluffily along the unusual, si +6690|169|O|194895.17|1996-06-26|2-HIGH|Clerk#000000648|0|eans sleep fluffily about the even requests. carefully unusual foxes eat +6691|1435|F|252217.93|1994-06-10|5-LOW|Clerk#000000191|0|d grouches haggle fluffily around the furiou +6692|248|O|281826.95|1996-09-23|3-MEDIUM|Clerk#000000573|0|pendencies wake carefully final braids. ironic packages are en +6693|73|F|257921.91|1992-05-25|1-URGENT|Clerk#000000232|0|lithely unusual orbits. furiously pending pinto beans use quickl +6694|604|F|94148.46|1992-09-01|2-HIGH|Clerk#000000954|0|platelets haggle carefully. regular instructions snooze carefully after the e +6695|170|F|305558.38|1992-06-28|5-LOW|Clerk#000000877|0|oost slyly. express pinto beans along the carefully iron +6720|1021|F|229026.45|1993-09-10|4-NOT SPECIFIED|Clerk#000000753|0| instructions affix. final ideas nag slyly furiously ironic accounts. depos +6721|994|O|141550.73|1996-11-29|4-NOT SPECIFIED|Clerk#000000272|0|ove the blithely final +6722|514|O|306885.73|1996-06-26|2-HIGH|Clerk#000000323|0|lly express courts wake sl +6723|343|O|260879.33|1998-06-02|1-URGENT|Clerk#000000984|0|lyly carefully final deposits. slyly regular plate +6724|934|O|112167.53|1995-10-25|3-MEDIUM|Clerk#000000009|0|o beans. furiously bold asymptotes wake slyly alongside of the slyly final ex +6725|751|O|118325.79|1995-10-15|5-LOW|Clerk#000000149|0|lly furiously even ideas? slyly regular deposits above the furious +6726|1094|F|249203.01|1993-11-29|4-NOT SPECIFIED|Clerk#000000246|0|iously pending accounts. slyly even packages eat. blithely ironic deposi +6727|959|F|258802.80|1994-08-30|5-LOW|Clerk#000000832|0|kly pending deposits affix fluffily along t +6752|1252|O|52555.16|1996-10-18|3-MEDIUM|Clerk#000000927|0|sits. evenly special instructions are furiously alongside of the regu +6753|121|F|134951.81|1993-09-27|5-LOW|Clerk#000000184|0|lites detect fluffily regular deposits. ironic packages cajole after +6754|1261|O|110732.98|1995-08-12|2-HIGH|Clerk#000000648|0|usly ironic deposits sleep. regular, regular packages so +6755|1105|O|27478.50|1995-05-02|2-HIGH|Clerk#000000454|0|ully above the asymptotes. even accounts haggle fluf +6756|1141|F|239788.08|1993-08-25|4-NOT SPECIFIED|Clerk#000000710|0| busily pending theodolites sublate along the platelets. pains sno +6757|952|F|275727.59|1992-02-02|3-MEDIUM|Clerk#000000228|0|he carefully even gifts. blithely furious asymptotes +6758|535|F|7424.24|1994-05-19|3-MEDIUM|Clerk#000000269|0|y ironic requests. carefully regular accounts are slyly. carefully unusual f +6759|1492|O|122276.33|1996-06-30|3-MEDIUM|Clerk#000000488|0|. accounts sleep blith +6784|1288|O|7653.34|1997-05-15|4-NOT SPECIFIED|Clerk#000000101|0|nusual accounts use +6785|950|F|86378.06|1992-05-07|3-MEDIUM|Clerk#000000144|0|final accounts. bold re +6786|904|O|242931.78|1997-08-13|4-NOT SPECIFIED|Clerk#000000602|0|he blithely even pinto +6787|116|O|70119.00|1995-06-03|1-URGENT|Clerk#000000497|0|ss deposits nag carefully pending requests. slyly regular deposits kindle furi +6788|548|O|134597.80|1995-08-05|4-NOT SPECIFIED|Clerk#000000992|0|platelets on the grouches cajole above the theodolites. carefully e +6789|1028|O|160758.15|1998-04-23|2-HIGH|Clerk#000000552|0|haggle furiously. ironic pinto beans among the fluffily regular requests engag +6790|182|F|30025.74|1995-04-27|2-HIGH|Clerk#000000920|0|refully express theodolites +6791|154|F|122256.75|1995-02-02|3-MEDIUM|Clerk#000000780|0|slyly regular packages +6816|1348|O|42541.67|1998-02-13|4-NOT SPECIFIED|Clerk#000000890|0|d, special frets. slyly regular deposits about the frets haggle s +6817|661|O|292938.51|1996-12-07|1-URGENT|Clerk#000000647|0|ld waters haggle. da +6818|953|O|163412.53|1996-02-27|1-URGENT|Clerk#000000543|0|riously furiously pending ideas. instructions maintain slyly un +6819|1441|O|235624.49|1998-03-01|2-HIGH|Clerk#000000767|0| final deposits wake blithely to the quickly pending +6820|853|O|113728.76|1995-07-06|5-LOW|Clerk#000001000|0|y unusual accounts: carefully ironic pinto beans cajole. ca +6821|1258|O|87530.96|1997-10-02|2-HIGH|Clerk#000000256|0|lly accounts. fluffily enticing requests across the slyly pending p +6822|247|O|178970.33|1997-06-22|2-HIGH|Clerk#000000462|0|furiously accounts? express, ironic instr +6823|628|F|211124.74|1994-07-22|4-NOT SPECIFIED|Clerk#000000369|0|lly express pinto beans run carefully. bo +6848|730|F|183927.82|1993-09-14|2-HIGH|Clerk#000000602|0|lphins wake slyly about the special excus +6849|445|O|142248.89|1998-01-26|1-URGENT|Clerk#000000473|0|instructions boost; careful +6850|169|F|147664.90|1993-02-12|2-HIGH|Clerk#000000292|0|ding instructions sleep slyly. s +6851|403|O|88576.15|1997-06-30|1-URGENT|Clerk#000000654|0|are furiously regular waters. slyly final requests are carefully +6852|712|O|29383.67|1997-06-26|5-LOW|Clerk#000000604|0|ross the slyly specia +6853|119|O|46538.98|1997-02-17|3-MEDIUM|Clerk#000000203|0|he even instructions. slyly express accounts use pending +6854|835|F|269589.69|1994-01-07|3-MEDIUM|Clerk#000000312|0|ajole furiously during the carefully ironic deposits-- b +6855|106|O|85204.50|1995-08-28|2-HIGH|Clerk#000000302|0| slyly regular instructions thrash furiously +6880|25|F|153159.46|1994-05-26|3-MEDIUM|Clerk#000000849|0|ently quiet requests breach insid +6881|1129|F|40831.09|1994-03-23|5-LOW|Clerk#000000327|0|ites cajole fluffily about the express th +6882|178|O|422359.65|1997-04-09|1-URGENT|Clerk#000000974|0|y dolphins. furiously ironic asymptotes s +6883|287|O|257510.95|1997-07-13|1-URGENT|Clerk#000000096|0|ackages; blithely regular p +6884|1168|F|238638.55|1994-01-16|5-LOW|Clerk#000000138|0|he regular, special a +6885|922|F|158930.07|1992-06-20|5-LOW|Clerk#000000502|0|eans according to the furiously close foxes boost furiously unusua +6886|1006|F|149349.34|1992-01-20|2-HIGH|Clerk#000000116|0|g, brave deposits wake alongside of the blithely brave courts: blithely blithe +6887|838|O|195359.79|1995-08-27|4-NOT SPECIFIED|Clerk#000000614|0|re carefully. daringly regular packages above the regular +6912|764|O|20282.99|1995-12-11|4-NOT SPECIFIED|Clerk#000000291|0|equests. unusual, regular accou +6913|350|F|107234.73|1992-11-21|4-NOT SPECIFIED|Clerk#000000572|0|nst the deposits. even, silent theodolites sleep about the ironical +6914|700|F|78800.48|1993-12-10|3-MEDIUM|Clerk#000000135|0|lar theodolites across th +6915|961|O|64093.61|1996-02-06|4-NOT SPECIFIED|Clerk#000000879|0|ss the slyly unusual packages. ironic, pending pinto beans was slyly +6916|866|F|114566.02|1993-06-05|5-LOW|Clerk#000000104|0|ding accounts. even requests play blithely according to the fi +6917|184|O|95425.90|1998-07-28|4-NOT SPECIFIED|Clerk#000000887|0|carefully express theodolites. regular, express accounts mai +6918|776|O|213108.95|1995-07-02|1-URGENT|Clerk#000000120|0|iously unusual packages wake carefully about the +6919|530|O|176310.25|1998-05-01|1-URGENT|Clerk#000000350|0| deposits use furiously pending ins +6944|685|F|9109.07|1992-03-03|5-LOW|Clerk#000000504|0|st blithely carefully even sheaves. slyly even frets amon +6945|683|F|8246.16|1995-04-29|1-URGENT|Clerk#000000954|0|theodolites. carefully ruthless deposits breach blithely. slyl +6946|667|O|74835.66|1997-06-20|5-LOW|Clerk#000000539|0| ironic deposits. boldly regular requests affix q +6947|1279|O|78496.57|1995-07-20|1-URGENT|Clerk#000000010|0|he ideas. deposits nag thinly. accounts against the +6948|1112|F|271047.14|1993-12-10|4-NOT SPECIFIED|Clerk#000000191|0|s. furiously regular platelets abo +6949|740|F|122494.25|1992-04-29|4-NOT SPECIFIED|Clerk#000000274|0|osits lose in place of the pending, bold requests. carefully eve +6950|1264|F|22935.52|1992-03-27|5-LOW|Clerk#000000389|0|wake slyly about the furiously regular requests. blithely even packages hagg +6951|442|O|7938.42|1996-08-24|4-NOT SPECIFIED|Clerk#000000570|0|lyly unusual accounts. exp +6976|940|F|166669.88|1993-10-13|4-NOT SPECIFIED|Clerk#000000677|0|fily above the even +6977|979|F|181961.66|1994-12-05|4-NOT SPECIFIED|Clerk#000000900|0|egular packages! bold foxes detect. slyly regular deposits nag quickly. +6978|280|F|153317.07|1993-12-10|2-HIGH|Clerk#000000984|0|are quickly beneath the furiously even platelets. +6979|325|F|103347.14|1994-02-28|1-URGENT|Clerk#000000342|0| hang around the final, +6980|2|F|170842.93|1993-02-19|4-NOT SPECIFIED|Clerk#000000518|0|ly regular dependencies. bold requests nag daringly silent p +6981|128|O|126983.88|1998-06-14|1-URGENT|Clerk#000000264|0|ts thrash. packages sleep +6982|172|O|130026.64|1995-11-17|4-NOT SPECIFIED|Clerk#000000912|0|ing theodolites cajole blithely according to the bold asymptotes; regu +6983|1081|O|60438.39|1998-02-19|4-NOT SPECIFIED|Clerk#000000713|0|accounts. blithely bold packages cajole blithely furiously pending a +7008|1349|F|54587.51|1992-10-20|2-HIGH|Clerk#000000302|0|g packages use. express, final p +7009|1135|O|117528.78|1995-11-29|2-HIGH|Clerk#000000361|0|omas over the regular requests haggle carefully above +7010|1318|O|42176.81|1998-05-19|5-LOW|Clerk#000000826|0|lyly final pinto bea +7011|364|O|49725.65|1997-12-29|5-LOW|Clerk#000000967|0| bold foxes. ironic +7012|1396|O|3089.77|1998-04-17|1-URGENT|Clerk#000000170|0|odolites. closely silent dependencies +7013|1406|O|115173.04|1997-04-10|5-LOW|Clerk#000000979|0|usly. quickly even deposits according to the bold theodolit +7014|68|O|141678.22|1996-06-20|3-MEDIUM|Clerk#000000102|0|s the fluffily even dependencies could impress car +7015|868|F|284222.74|1993-10-13|4-NOT SPECIFIED|Clerk#000000251|0|foxes nag accounts. furiously regular asymptotes about the +7040|565|O|93413.21|1996-06-15|2-HIGH|Clerk#000000349|0|. carefully final deposits wa +7041|160|O|102566.21|1997-09-10|4-NOT SPECIFIED|Clerk#000000464|0|aggle according to the accounts. slyly final deposits +7042|359|F|208635.44|1992-01-09|3-MEDIUM|Clerk#000000498|0|es. carefully ironic packages after the +7043|364|F|19225.31|1994-01-26|1-URGENT|Clerk#000000665|0| special instructions integrate slyly quickly unusual instructions. slyly +7044|1313|F|92369.50|1994-08-13|5-LOW|Clerk#000000095|0| deposits. doggedly unusual requests +7045|241|O|241923.13|1997-08-14|3-MEDIUM|Clerk#000000083|0| hinder slyly. slyly ironic requests use slyly. final +7046|865|O|261029.84|1996-01-22|1-URGENT|Clerk#000000681|0|. unusual deposits engage slyly. blithely special frays instead +7047|1106|O|253334.24|1996-11-28|3-MEDIUM|Clerk#000000263|0| slyly express accounts use carefully. even dinos ha +7072|1105|F|73978.59|1992-02-05|1-URGENT|Clerk#000000061|0|e slyly pending pinto beans nag carefully regular accounts. careful +7073|179|O|126255.22|1997-10-04|5-LOW|Clerk#000000782|0|ructions. even, bold accounts after the carefully regular acc +7074|1126|F|73760.13|1993-05-26|1-URGENT|Clerk#000000244|0|. quickly regular dep +7075|1093|O|298334.39|1995-10-11|5-LOW|Clerk#000000632|0|requests boost closely slyly regular excuses. slyly silent pinto +7076|1402|O|99207.59|1995-12-12|2-HIGH|Clerk#000000724|0| enticingly regular dependencies. unusual forges wak +7077|562|O|260327.94|1995-12-22|2-HIGH|Clerk#000000839|0|ecial theodolites integrate blithely. carefully regular +7078|665|F|139770.35|1993-04-12|2-HIGH|Clerk#000000979|0|s. carefully regular deposits cajole blithe +7079|488|F|369844.66|1993-02-09|3-MEDIUM|Clerk#000000597|0|refully blithely even theodolites. slyly +7104|1384|O|29906.00|1996-12-31|5-LOW|Clerk#000000432|0|osits around the deposits wake +7105|65|F|133136.73|1993-06-22|5-LOW|Clerk#000000966|0|heodolites. requests use blithely sometimes unusual deposits. fluffi +7106|1147|F|286241.44|1992-05-11|5-LOW|Clerk#000000946|0|he fluffily ironic packages. quickly +7107|908|F|286134.31|1992-01-05|4-NOT SPECIFIED|Clerk#000000510|0| pending grouches use furiously afte +7108|103|O|101943.78|1996-03-24|3-MEDIUM|Clerk#000000819|0|its sleep blithely furiously express multipliers. even package +7109|1405|O|121549.31|1996-06-24|4-NOT SPECIFIED|Clerk#000000703|0|mptotes. regular, final foxes boost slyly. quickly final ideas sleep furio +7110|724|O|59862.37|1995-08-08|5-LOW|Clerk#000000689|0|y quietly ironic deposits. bold deposits print slyly carefull +7111|1351|O|88984.08|1996-11-03|2-HIGH|Clerk#000000584|0|. final, express platelets nag furiously. regul +7136|352|F|314217.89|1994-03-23|2-HIGH|Clerk#000000954|0| wake thinly fluffily even +7137|1064|O|50787.32|1995-07-30|5-LOW|Clerk#000000334|0|ully special requests nag accounts. slyly regular depende +7138|1351|O|192115.66|1998-05-09|1-URGENT|Clerk#000000696|0|usual, sly instructions. slyly r +7139|1420|O|33497.59|1996-06-25|1-URGENT|Clerk#000000003|0|ffily blithely even pinto beans. de +7140|1198|F|71863.99|1994-02-09|3-MEDIUM|Clerk#000000172|0|ts sleep among the furiously express accounts. furiously unusua +7141|5|O|271505.25|1996-07-19|5-LOW|Clerk#000000400|0|ns sleep blithely. blithely ironi +7142|1456|O|165343.16|1995-07-22|1-URGENT|Clerk#000000232|0|ove the fluffily bold instructions. permanent hockey playe +7143|403|O|1952.69|1997-10-23|4-NOT SPECIFIED|Clerk#000000928|0|oxes? carefully regular ideas +7168|613|O|318482.19|1997-12-18|3-MEDIUM|Clerk#000000023|0|ending deposits. even depths along the even sentiments integrate carefull +7169|107|F|203088.44|1993-03-27|3-MEDIUM|Clerk#000000971|0|final dependencies cajole. d +7170|31|O|145617.42|1997-10-31|4-NOT SPECIFIED|Clerk#000000422|0|r packages nag furiously. fluffily ir +7171|377|F|283904.20|1995-02-14|3-MEDIUM|Clerk#000000548|0|arefully regular deposits are closely express +7172|134|O|115210.20|1997-10-25|5-LOW|Clerk#000000681|0|gged somas above the theodolites h +7173|157|F|35145.43|1992-08-09|2-HIGH|Clerk#000000132|0|inal platelets nag: ru +7174|1288|F|81390.71|1992-03-11|4-NOT SPECIFIED|Clerk#000000619|0|ons use quickly. blithely iro +7175|1276|F|14694.14|1993-02-08|1-URGENT|Clerk#000000592|0|deposits. evenly regular packages w +7200|691|F|227234.47|1993-09-12|5-LOW|Clerk#000000727|0|l, special foxes. furi +7201|1160|O|39924.41|1996-04-13|2-HIGH|Clerk#000000986|0| doggedly. tithes thrash furiously; theodolites wak +7202|1006|O|168054.10|1996-06-02|3-MEDIUM|Clerk#000000187|0|ckages grow carefully fluffily bold pinto beans. platelet +7203|1127|F|111889.18|1994-01-09|2-HIGH|Clerk#000000418|0|lithely silent requests integrate around the furiously expre +7204|1078|O|138353.63|1996-01-08|1-URGENT|Clerk#000000886|0|e ironic, ironic frets. bold requests haggle qui +7205|1006|F|222143.11|1994-07-16|4-NOT SPECIFIED|Clerk#000000269|0|requests. regular, final packages cajole slyly platelets; slyly ironic reque +7206|352|F|5135.00|1994-02-20|2-HIGH|Clerk#000000914|0|ndencies cajole. fin +7207|1228|O|97689.40|1998-02-22|4-NOT SPECIFIED|Clerk#000000855|0| dependencies nod blithely among the fluff +7232|761|O|94263.43|1998-03-29|1-URGENT|Clerk#000000047|0|ic asymptotes affix quickly after the carefully +7233|347|O|72397.50|1996-11-10|5-LOW|Clerk#000000362|0|dencies detect furiously along the busily brave gifts. special, final th +7234|103|O|6138.55|1998-06-11|2-HIGH|Clerk#000000425|0|ourts sleep along the special, final th +7235|1427|O|88501.58|1996-09-25|4-NOT SPECIFIED|Clerk#000000739|0|the furiously unusual accounts cajole about the +7236|271|F|166748.09|1993-01-03|3-MEDIUM|Clerk#000000443|0|e; blithely special requests thrash carefu +7237|1052|O|60900.52|1998-01-16|4-NOT SPECIFIED|Clerk#000000791|0| unusual instructions. quickly regular ideas b +7238|1009|O|179643.27|1998-03-05|4-NOT SPECIFIED|Clerk#000000940|0|after the silent forges. carefully even accounts +7239|287|O|80555.08|1995-06-30|3-MEDIUM|Clerk#000000671|0|odolites doze blithely alongside of the even packages. regular, unusual acc +7264|334|O|159381.47|1998-03-22|4-NOT SPECIFIED|Clerk#000000487|0| packages. special theodolites around the excuses maintain car +7265|596|O|49157.20|1995-11-18|2-HIGH|Clerk#000000356|0| regular pinto beans integrate silently ca +7266|527|O|98618.40|1996-07-20|4-NOT SPECIFIED|Clerk#000000549|0|uriously final platelets. +7267|1462|F|283812.08|1992-08-29|2-HIGH|Clerk#000000741|0|al theodolites. dolphins kindle across the regular f +7268|1475|O|58018.02|1996-10-24|3-MEDIUM|Clerk#000000047|0|lets. dinos poach alongside of the regular, special +7269|299|F|52359.29|1994-09-15|3-MEDIUM|Clerk#000000017|0|cajole blithely above the express, +7270|1166|O|249254.32|1998-02-02|1-URGENT|Clerk#000000223|0|ven foxes across the slyly regular instructions boost slyly +7271|56|O|118293.79|1998-07-29|3-MEDIUM|Clerk#000000732|0|he express instruct +7296|1493|O|12543.71|1996-10-22|2-HIGH|Clerk#000000394|0|ges alongside of the quickly pending requests sleep +7297|1381|F|245963.94|1994-09-15|2-HIGH|Clerk#000000814|0|efully. regular, unusual foxes nag despite +7298|841|O|123582.35|1997-07-11|4-NOT SPECIFIED|Clerk#000000427|0|ns. blithely express dependencies wake +7299|1369|F|94649.91|1992-02-19|1-URGENT|Clerk#000000065|0|ecial deposits boost. packages snooz +7300|430|F|251924.15|1994-03-20|2-HIGH|Clerk#000000942|0| final accounts. packages eat. +7301|1499|F|35717.11|1993-12-29|5-LOW|Clerk#000000143|0|uriously bold requests. blit +7302|155|P|80646.53|1995-03-31|1-URGENT|Clerk#000000269|0|quickly bold platelets. unusual deposits kindle carefully among the re +7303|1429|F|82758.56|1993-06-19|2-HIGH|Clerk#000000989|0|ave to wake carefully final excuses. pending accounts boost. bl +7328|1183|O|230918.09|1998-04-19|2-HIGH|Clerk#000000310|0|efully even pinto beans affix. slyly qui +7329|664|O|175481.29|1996-10-04|4-NOT SPECIFIED|Clerk#000000028|0|ins are along the instructions. slyly unusual orbits are. carefully p +7330|163|O|238668.69|1998-07-13|3-MEDIUM|Clerk#000000202|0|ingly final accounts. regul +7331|236|O|204863.67|1996-07-22|3-MEDIUM|Clerk#000000473|0|sts cajole slyly special, ironic accounts. blithely silent noto +7332|464|O|110168.52|1996-08-16|2-HIGH|Clerk#000000203|0|haggle against the quickly ruthless platelets. carefully final fo +7333|721|O|74940.03|1996-09-14|5-LOW|Clerk#000000730|0|al pinto beans: express theodolites haggle bl +7334|1442|O|101409.77|1997-08-06|4-NOT SPECIFIED|Clerk#000000487|0|nal, even deposits. regular accounts sleep. furiously pendi +7335|86|F|231080.58|1993-05-30|5-LOW|Clerk#000000296|0|express, regular asymptotes haggle fluffily fluffily unusual accou +7360|535|O|54437.42|1997-10-24|2-HIGH|Clerk#000000934|0|hs across the slyly final pinto beans are fluffily alongside of +7361|400|F|268348.27|1994-10-09|2-HIGH|Clerk#000000939|0|ly. blithely unusual theodolites haggle carefully after the +7362|745|F|63117.51|1994-11-11|2-HIGH|Clerk#000000300|0|ven packages haggle never alo +7363|1241|F|53633.18|1993-11-10|3-MEDIUM|Clerk#000000225|0|posits; special theodolites from the furiously regular accounts wake +7364|118|F|109536.28|1994-05-09|2-HIGH|Clerk#000000133|0|waters might promise. carefully ironic dependencies boost slyly even deposits +7365|53|O|179979.19|1998-03-04|1-URGENT|Clerk#000000325|0|haggle bravely! slyly even requests sleep carefully careful +7366|49|F|76731.72|1994-03-15|2-HIGH|Clerk#000000668|0|counts maintain carefully furiously regular accounts. slyly even pinto be +7367|1340|O|119545.34|1995-06-06|5-LOW|Clerk#000000670|0|efully special packages. furiously regular foxes use fluffily after t +7392|1228|O|185493.77|1996-04-15|1-URGENT|Clerk#000000242|0|s doze even requests. express instructions boost at the carefully p +7393|178|O|215326.80|1995-12-23|5-LOW|Clerk#000000879|0|furiously express instructions sleep ca +7394|949|O|89976.92|1998-07-03|3-MEDIUM|Clerk#000000883|0|ly according to the even, final foxes. quick +7395|1244|O|197627.24|1998-01-21|4-NOT SPECIFIED|Clerk#000000095|0|lar, ironic asymptotes wake quickly ironically ironic +7396|256|O|86508.21|1998-01-03|3-MEDIUM|Clerk#000000729|0|beans. requests above the requests nag slyly slyly ironic deposits. special, f +7397|1258|F|12715.02|1994-05-20|3-MEDIUM|Clerk#000000187|0| silent, express req +7398|335|F|150625.12|1994-06-02|4-NOT SPECIFIED|Clerk#000000572|0| across the final pack +7399|55|O|224943.52|1997-08-11|4-NOT SPECIFIED|Clerk#000000396|0|yly bold pinto beans. express pinto beans sleep aro +7424|986|O|9429.20|1998-05-16|4-NOT SPECIFIED|Clerk#000000430|0| above the furiously ironic theodolites haggle final foxes. fluffil +7425|1253|O|104849.15|1997-08-28|5-LOW|Clerk#000000984|0| carefully special packages. blithely regular accounts +7426|466|F|15242.29|1995-01-17|2-HIGH|Clerk#000000643|0|er the slyly express dependencies. quickly ironic deposits impress. boldly i +7427|73|F|235867.69|1992-12-16|4-NOT SPECIFIED|Clerk#000000606|0|ages cajole slyly unu +7428|1133|O|100624.72|1997-08-08|5-LOW|Clerk#000000596|0|cial dolphins cajole fluffily. silent asymptotes boost busily even, un +7429|874|F|149569.06|1993-05-27|4-NOT SPECIFIED|Clerk#000000854|0|e ironic accounts wake fluffily against the ironic foxes. fu +7430|568|F|98253.22|1993-06-09|3-MEDIUM|Clerk#000000755|0|es. blithely pending foxes are accounts. silent, perm +7431|1093|F|117725.18|1994-05-02|3-MEDIUM|Clerk#000000713|0|g Tiresias. ironic requests wake carefully according to th +7456|199|O|176958.89|1997-03-05|1-URGENT|Clerk#000000610|0| carefully ironic dependencies. blithely regular deposits +7457|670|F|189620.33|1993-10-01|4-NOT SPECIFIED|Clerk#000000892|0|permanently across the car +7458|1318|F|117932.50|1992-04-05|1-URGENT|Clerk#000000242|0|onic requests integrate along the express requests. specia +7459|178|O|64499.40|1997-06-05|3-MEDIUM|Clerk#000000380|0| are. quickly bold theodolites among the furiously +7460|391|O|31406.84|1996-05-11|1-URGENT|Clerk#000000649|0| accounts. unusual theodolites cajole blithely. slyly even requ +7461|1189|F|163715.23|1994-01-13|5-LOW|Clerk#000000683|0|uickly unusual requests cajole. th +7462|128|F|155774.84|1995-02-21|2-HIGH|Clerk#000000268|0| the slyly special requests +7463|275|O|189720.77|1997-08-10|3-MEDIUM|Clerk#000000903|0|l gifts sleep carefully. special sauternes are theodolites. accoun +7488|1021|F|178638.09|1992-05-04|1-URGENT|Clerk#000000653|0|al accounts are furio +7489|59|F|97612.21|1993-10-01|1-URGENT|Clerk#000000342|0|the blithely furious theodolites. f +7490|43|F|136028.72|1994-10-26|4-NOT SPECIFIED|Clerk#000000776|0|manent requests. even frays wake unusual foxes. slyly ironic re +7491|1477|O|124652.28|1998-04-21|1-URGENT|Clerk#000000107|0|tect. silent, regular deposits according to th +7492|511|O|64295.07|1996-06-26|5-LOW|Clerk#000000810|0|f the pending deposits. express, ironic deposits +7493|205|F|73649.68|1994-12-18|2-HIGH|Clerk#000000279|0|riously even instructions haggle agains +7494|1231|O|68212.31|1996-04-02|4-NOT SPECIFIED|Clerk#000000244|0|fily express packages. blithely regular requests across +7495|188|F|27019.30|1994-11-06|5-LOW|Clerk#000000952|0|special dolphins. ironic, even theodoli +7520|266|O|165888.59|1997-01-15|4-NOT SPECIFIED|Clerk#000000061|0|sly regular accounts sleep carefully. final theodolites wake fur +7521|869|P|100396.59|1995-02-28|5-LOW|Clerk#000000142|0|requests affix ironic requests. carefully ironic asymptotes are sly +7522|445|O|230400.81|1996-12-09|5-LOW|Clerk#000000211|0|. pending, ironic accounts maintain fluffily slowly reg +7523|1489|O|344628.33|1997-04-08|4-NOT SPECIFIED|Clerk#000000800|0| ironic foxes. closely bold deposits sleep. regular, final instructi +7524|604|F|144076.95|1992-07-19|5-LOW|Clerk#000000392|0|d. final packages are carefully ironic, even accounts. furiously fina +7525|479|O|73105.68|1997-03-12|2-HIGH|Clerk#000000481|0|even deposits sleep care +7526|899|O|57948.99|1996-12-20|3-MEDIUM|Clerk#000000848|0|. carefully special courts haggle pending ideas. express packages thrash a +7527|392|F|88319.30|1994-12-12|3-MEDIUM|Clerk#000000871|0|ld accounts. final packages are quickly ac +7552|820|F|62145.02|1992-09-11|1-URGENT|Clerk#000000996|0|refully furiously final deposits. platelets cajole slyly regular i +7553|518|F|287587.60|1993-05-08|3-MEDIUM|Clerk#000000941|0|ke furiously among the platelets. blithely unusual ideas +7554|817|O|28159.32|1996-06-29|4-NOT SPECIFIED|Clerk#000000642|0| regular, unusual sentiments. silent, pending frays along the ca +7555|790|O|159986.96|1996-01-13|2-HIGH|Clerk#000000382|0|ully silent ideas nag. fluffily r +7556|76|F|51694.83|1993-11-11|4-NOT SPECIFIED|Clerk#000000950|0|efully instructions. caref +7557|745|O|23739.57|1997-07-03|5-LOW|Clerk#000000651|0|s. carefully furious packages according to th +7558|940|F|79830.13|1993-12-11|2-HIGH|Clerk#000000733|0|the express accounts. even deposits across the ideas use on the careful +7559|992|F|279551.62|1993-10-13|1-URGENT|Clerk#000000404|0|express pinto beans. carefully even foxes +7584|941|O|138535.61|1997-04-14|4-NOT SPECIFIED|Clerk#000000644|0|inal packages. carefully even accou +7585|334|P|156254.00|1995-05-20|2-HIGH|Clerk#000000703|0|affix quickly up the slyly bold pinto +7586|313|O|101318.92|1995-07-10|1-URGENT|Clerk#000000821|0|lar pinto beans. slyly final ideas nod blithe +7587|227|F|29101.74|1992-02-16|5-LOW|Clerk#000000290|0|re carefully since the slyly unusual instructions. final, special packages are +7588|1447|F|118979.66|1992-12-23|3-MEDIUM|Clerk#000000674|0|ar requests. ironic accounts accor +7589|1246|O|261161.81|1997-04-20|4-NOT SPECIFIED|Clerk#000000710|0|ts. even, even foxes around the carefully f +7590|112|O|148380.44|1998-04-18|4-NOT SPECIFIED|Clerk#000000290|0|ously final theodolites wake. unusual platelets haggle. blithely +7591|116|F|248793.57|1993-05-13|3-MEDIUM|Clerk#000000824|0|gle furiously against the special, unusual instructions. furiously unusual dep +7616|337|F|71450.67|1993-10-06|1-URGENT|Clerk#000000828|0| packages. furiously express deposi +7617|680|O|316455.37|1998-06-15|2-HIGH|Clerk#000000262|0|jole. ironic deposits sleep. deposits +7618|883|F|297074.70|1992-01-04|2-HIGH|Clerk#000000782|0|ly furiously unusual foxes. slyly pending foxes sleep? permanently special req +7619|790|F|75320.49|1993-10-09|4-NOT SPECIFIED|Clerk#000000388|0|nic platelets affix slyly. special t +7620|1073|F|3508.43|1994-06-21|2-HIGH|Clerk#000000607|0|g furiously according +7621|17|O|85925.77|1997-04-02|2-HIGH|Clerk#000000682|0|blithely bold deposits sleep quickly among the final, ironic inst +7622|376|O|93193.92|1998-01-21|3-MEDIUM|Clerk#000000191|0|ely ironic theodolites. permanent, regu +7623|1282|F|166037.50|1994-10-29|1-URGENT|Clerk#000000292|0|ake quickly permanent theodolites; even, silent accounts u +7648|1322|O|15686.40|1997-06-02|5-LOW|Clerk#000000469|0|e fluffily. packages about the slyly special dol +7649|269|O|157318.46|1995-07-15|5-LOW|Clerk#000000256|0|s. even, silent sheaves must kindle about the +7650|1426|F|65602.15|1995-04-06|1-URGENT|Clerk#000000890|0|xes. furiously ironic pinto beans wake blithely above the even, regular t +7651|1066|F|61134.81|1995-01-16|3-MEDIUM|Clerk#000000657|0|kages are doggedly deposits +7652|1312|F|49951.97|1994-01-23|3-MEDIUM|Clerk#000000018|0|beans use slyly express deposits. blithely bold foxes boost +7653|1306|F|159466.80|1992-02-28|3-MEDIUM|Clerk#000000964|0|olites haggle according to the furiousl +7654|908|F|176363.63|1993-02-11|2-HIGH|Clerk#000000173|0|al tithes in place of +7655|280|F|56494.41|1993-02-13|2-HIGH|Clerk#000000671|0|s impress among the ironically regular courts. theodolites wak +7680|1318|P|315518.21|1995-04-09|4-NOT SPECIFIED|Clerk#000000501|0|. stealthy asymptotes use carefully carefully regular +7681|1030|F|57896.71|1993-12-19|5-LOW|Clerk#000000962|0|ic foxes? express packages according to the slyly special +7682|1273|O|54290.21|1997-10-11|5-LOW|Clerk#000000083|0|ests. dugouts after the slyly regular packages wake carefully final d +7683|535|O|190907.97|1998-02-26|1-URGENT|Clerk#000000430|0|ly final deposits nod caref +7684|1145|F|205028.96|1992-01-20|3-MEDIUM|Clerk#000000068|0|its. packages sleep along the quic +7685|451|O|206562.01|1998-02-21|2-HIGH|Clerk#000000770|0|y final accounts. thin r +7686|388|F|138502.95|1994-06-12|4-NOT SPECIFIED|Clerk#000000999|0| packages haggle? ironi +7687|1483|F|317911.54|1993-03-04|3-MEDIUM|Clerk#000000626|0|heodolites. blithely stealthy +7712|1471|O|50722.32|1996-10-21|5-LOW|Clerk#000000970|0|requests nod quickly along the quickly pendi +7713|158|O|35940.01|1996-03-09|3-MEDIUM|Clerk#000000825|0|l ideas haggle slyly according to the fluffily final packag +7714|832|O|160148.54|1996-06-17|5-LOW|Clerk#000000993|0| waters. slyly even deposits nag furiously expres +7715|431|F|150022.63|1993-08-12|2-HIGH|Clerk#000000841|0|usual pinto beans. blithely spe +7716|1438|O|164955.70|1995-12-23|5-LOW|Clerk#000000401|0|efully special foxes. furiously idle courts c +7717|772|O|175777.82|1996-08-29|4-NOT SPECIFIED|Clerk#000000664|0|. foxes across the slyly pending packages nod carefu +7718|988|O|172489.22|1998-01-23|4-NOT SPECIFIED|Clerk#000000322|0|out the platelets. blithely final ideas wake quickly. furiously special +7719|425|F|6449.02|1994-03-22|5-LOW|Clerk#000000602|0|carefully regular ideas sleep against the pinto beans. asymptotes b +7744|1090|F|208113.74|1994-11-18|5-LOW|Clerk#000000779|0| ironic depths affi +7745|1292|F|220449.51|1994-03-03|1-URGENT|Clerk#000000758|0|ly pending platelets acros +7746|649|F|187780.53|1993-12-06|3-MEDIUM|Clerk#000000911|0|platelets. carefully sp +7747|364|F|41699.37|1992-04-25|2-HIGH|Clerk#000000228|0|ular deposits nag quickly. blithel +7748|961|O|43069.56|1998-02-03|4-NOT SPECIFIED|Clerk#000000319|0|nding, even requests. thinly final instructions boost carefully. blithely +7749|548|F|201965.23|1993-09-22|2-HIGH|Clerk#000000082|0|enticingly regular platelets nag furiously. e +7750|1418|F|116587.38|1992-12-25|4-NOT SPECIFIED|Clerk#000000948|0|sly even deposits! regular +7751|718|F|121258.42|1992-12-24|4-NOT SPECIFIED|Clerk#000000499|0|ronic deposits across the foxes affix furiously packages. blithely regula +7776|1093|F|164940.56|1994-03-15|3-MEDIUM|Clerk#000000753|0|lithely after the b +7777|1094|O|88101.44|1998-02-17|1-URGENT|Clerk#000000270|0| beans haggle carefully according to the furiously regular platelets. carefull +7778|710|F|137949.52|1994-11-25|4-NOT SPECIFIED|Clerk#000000002|0|gular warthogs after the express, pending d +7779|1000|O|160062.01|1995-04-22|3-MEDIUM|Clerk#000000276|0| special foxes. evenly quick foxes sleep furiou +7780|1027|O|40447.12|1998-02-17|5-LOW|Clerk#000000180|0|inal theodolites. slyly special depend +7781|1249|O|24930.42|1998-05-25|1-URGENT|Clerk#000000520|0| dogged accounts believe. accou +7782|154|F|147097.62|1994-07-03|1-URGENT|Clerk#000000770|0|e thinly even requests. furiously unusual foxes cajole against the +7783|1307|F|185258.69|1992-01-13|3-MEDIUM|Clerk#000000657|0|posits. even, final deposits alon +7808|1243|O|65078.98|1995-12-19|1-URGENT|Clerk#000000161|0|usly according to the carefully regular foxes. ironic +7809|1045|O|59310.85|1996-10-01|5-LOW|Clerk#000000861|0|ake furiously. unusual theod +7810|1099|O|184658.94|1997-03-04|4-NOT SPECIFIED|Clerk#000000706|0|lithely even foxes sleep. final instructions maintain carefully. +7811|250|O|122337.95|1996-03-19|3-MEDIUM|Clerk#000000805|0|l asymptotes. slyly pending grouches use furiously. fluffily special +7812|349|P|303299.08|1995-04-21|5-LOW|Clerk#000000298|0|uests sleep furiously. bold packages among the packages haggle slyly above t +7813|1348|F|66000.94|1994-02-11|1-URGENT|Clerk#000000046|0|ckly regular theodo +7814|511|O|23275.83|1995-07-12|5-LOW|Clerk#000000449|0|posits! packages across the +7815|340|F|22484.50|1994-01-23|1-URGENT|Clerk#000000309|0|g asymptotes. slyly speci +7840|649|F|161931.89|1995-01-09|5-LOW|Clerk#000000720|0|beans; carefully spe +7841|1489|F|212170.20|1992-05-21|4-NOT SPECIFIED|Clerk#000000301|0|ely. even orbits cajo +7842|14|F|95548.17|1994-09-30|2-HIGH|Clerk#000000255|0|gged instructions after the furiou +7843|400|O|204256.37|1995-05-24|4-NOT SPECIFIED|Clerk#000000994|0|ld foxes boost along the furiously regular pinto +7844|1493|O|120392.03|1996-09-08|3-MEDIUM|Clerk#000000192|0|e of the carefully unusual packages will have to are carefully +7845|635|F|197653.20|1994-12-14|1-URGENT|Clerk#000000671|0|unts cajole furiously. blithely bold platelets cajole. furiously +7846|496|O|129553.64|1995-06-26|5-LOW|Clerk#000000343|0|accounts. furiously regular accounts among the careful packages haggle qu +7847|625|O|135834.57|1995-07-04|4-NOT SPECIFIED|Clerk#000000170|0|ial foxes. regular pack +7872|868|F|158737.95|1992-10-23|2-HIGH|Clerk#000000329|0|althily regular packages. regular, ironic packages nag carefully +7873|43|F|254547.40|1992-06-26|1-URGENT|Clerk#000000491|0|ic packages. final packages grow regular pack +7874|329|O|117428.70|1998-06-18|4-NOT SPECIFIED|Clerk#000000034|0|tegrate carefully according to the furiously regu +7875|439|F|129890.58|1993-02-10|5-LOW|Clerk#000000128|0|ve the even, bold packages sleep blithely according to the sly +7876|1351|O|102524.01|1996-08-28|5-LOW|Clerk#000000231|0|s. special, ironic requests at the slyly express instructions affix quickly +7877|130|O|290048.51|1996-03-08|2-HIGH|Clerk#000000510|0|ironic requests haggle about the slyly unusual +7878|1381|P|225551.36|1995-05-02|5-LOW|Clerk#000000455|0|fily regular deposits. sl +7879|1234|F|155357.84|1994-07-31|3-MEDIUM|Clerk#000000406|0|onic realms cajole after the carefully sly theod +7904|1478|F|102440.45|1993-05-28|5-LOW|Clerk#000000508|0|ial deposits sleep deposits. furiously silent theodolites after the regu +7905|976|F|191618.80|1994-06-04|5-LOW|Clerk#000000601|0|oost final, unusual foxes. ideas serve +7906|818|F|151071.92|1994-10-18|3-MEDIUM|Clerk#000000081|0| accounts sleep closely along the special depende +7907|565|O|155518.59|1996-10-10|5-LOW|Clerk#000000418|0|ly even requests wake slyly along the blithely regular packages. sl +7908|1297|O|301641.88|1996-10-14|1-URGENT|Clerk#000000839|0|ly express deposits wake fluffily around the final, ironic ideas. furio +7909|778|F|55141.97|1994-01-04|2-HIGH|Clerk#000000720|0|carefully silent deposits; blithely special braids +7910|448|F|269228.29|1993-04-21|1-URGENT|Clerk#000000814|0|ly final requests are. slow +7911|1087|O|94477.06|1997-09-02|1-URGENT|Clerk#000000573|0|ajole blithely on the busy, even asymptotes. carefully ironic pi +7936|989|F|87882.15|1993-04-06|5-LOW|Clerk#000000084|0| even packages: quickly re +7937|1045|F|63238.76|1993-04-02|5-LOW|Clerk#000000950|0|cial instructions. carefully ironic packages wake. slyl +7938|706|F|161418.44|1993-03-14|3-MEDIUM|Clerk#000000148|0|ounts haggle furiously +7939|410|O|126008.82|1996-11-03|2-HIGH|Clerk#000000161|0| slyly close ideas. carefully ironic accounts kindle fluff +7940|1261|O|16935.55|1996-03-08|3-MEDIUM|Clerk#000000135|0|lly even excuses integ +7941|1360|F|77591.80|1992-03-24|5-LOW|Clerk#000000310|0|use carefully even requests. express multipliers among the re +7942|724|F|100001.57|1994-04-20|3-MEDIUM|Clerk#000000207|0|otes. furiously pending deposits cajole along the f +7943|1241|O|48316.56|1996-08-28|3-MEDIUM|Clerk#000000120|0|usly regular pinto beans affix furiously. s +7968|374|F|216059.03|1993-09-16|5-LOW|Clerk#000000491|0|ilent, silent pinto beans amon +7969|328|O|150220.78|1998-08-02|4-NOT SPECIFIED|Clerk#000000027|0|uriously regular instructions. slyly fin +7970|394|O|84237.61|1996-10-10|5-LOW|Clerk#000000124|0|y stealthy, final instructions. unusual accounts sleep furiousl +7971|286|F|141090.99|1994-06-03|4-NOT SPECIFIED|Clerk#000000934|0|osits use slyly according to the regular th +7972|1018|O|234330.59|1998-05-14|4-NOT SPECIFIED|Clerk#000000240|0|ackages use. ironic, regular deposits detect carefully. eve +7973|932|F|81058.16|1992-01-21|5-LOW|Clerk#000000539|0|ully special packages sleep after the careful +7974|1337|F|56560.76|1992-06-03|5-LOW|Clerk#000000048|0|xes. slyly special requests wake slyly +7975|145|O|43294.36|1997-03-06|3-MEDIUM|Clerk#000000919|0|ending deposits. special, i +8000|154|F|231836.02|1993-09-20|5-LOW|Clerk#000000994|0|ctions cajole furious +8001|1261|F|247061.30|1993-11-20|2-HIGH|Clerk#000000699|0|ts cajole quickly final sentiments. fluffily regular courts un +8002|22|F|181048.04|1993-03-14|4-NOT SPECIFIED|Clerk#000000581|0|aringly final deposits haggle around the bl +8003|1309|O|291801.32|1995-10-24|2-HIGH|Clerk#000000792|0|hely. carefully final foxes wake furiously. final packages u +8004|923|P|287606.85|1995-05-12|1-URGENT|Clerk#000000044|0|e slyly regular theodolites boost furiously against the quickly even p +8005|235|F|281139.31|1992-04-06|1-URGENT|Clerk#000000957|0|uriously express depo +8006|770|P|271954.06|1995-06-04|3-MEDIUM|Clerk#000000804|0|ckages across the quickly final foxes are after the even, special foxe +8007|238|F|242424.56|1992-02-12|5-LOW|Clerk#000000407|0|e furiously blithely ironic accounts. furiously expres +8032|133|F|41749.97|1994-12-30|1-URGENT|Clerk#000000716|0|lithely unusual theodolites +8033|140|F|93186.44|1992-04-25|2-HIGH|Clerk#000000810|0|ular, special pinto +8034|739|F|156332.91|1992-01-20|2-HIGH|Clerk#000000998|0|ckly regular requests use slyly +8035|913|F|200745.50|1992-03-02|3-MEDIUM|Clerk#000000730|0|s use slyly around the ironic attainments! furiously p +8036|226|O|219548.13|1997-04-14|1-URGENT|Clerk#000000364|0|regular requests alongside of the b +8037|1171|O|149133.82|1996-03-12|1-URGENT|Clerk#000000301|0|ymptotes kindle fluffily special instructi +8038|1006|F|117874.75|1992-10-27|1-URGENT|Clerk#000000256|0|sits. furiously ironic foxes are fluffily. care +8039|238|F|85406.49|1992-08-24|3-MEDIUM|Clerk#000000533|0|ly. quickly bold accounts engage carefully even, even instruction +8064|665|P|170347.71|1995-05-13|2-HIGH|Clerk#000000179|0| dependencies engage ev +8065|1141|F|209731.15|1992-10-22|3-MEDIUM|Clerk#000000165|0|egular foxes along the regular, even asymptotes use slyly ironic ins +8066|364|O|190993.28|1997-02-01|2-HIGH|Clerk#000000871|0|olites wake above the blithely regular instructions. ironic ideas shall +8067|49|F|98316.00|1992-02-04|2-HIGH|Clerk#000000485|0| across the regular deposits boost blithely carefully exp +8068|1330|O|282560.19|1996-08-12|3-MEDIUM|Clerk#000000623|0|final pinto beans. slyly unusual requests nag quickly f +8069|131|F|135513.80|1994-08-09|1-URGENT|Clerk#000000875|0|nal requests. regular excuses wake furiously. furiously ironic requests s +8070|1003|F|341050.25|1992-01-29|3-MEDIUM|Clerk#000000293|0|ar accounts wake furiously furiously express packages. +8071|1136|O|122558.76|1996-04-08|5-LOW|Clerk#000000394|0|ickly unusual accounts poach. theodolites use ruthlessly. bli +8096|1225|O|96439.20|1996-11-06|2-HIGH|Clerk#000000663|0|xpress pinto beans cajole fluffily. bold dolphins sleep q +8097|502|F|150011.65|1993-12-10|3-MEDIUM|Clerk#000000596|0|luffy instructions. express, ironic gifts haggle blithely +8098|403|O|103743.03|1997-11-04|1-URGENT|Clerk#000000372|0|ly dogged ideas. furiously even platelets haggle. blithely sp +8099|121|O|18062.78|1996-01-09|2-HIGH|Clerk#000000211|0|ular deposits. packages +8100|332|O|288090.74|1997-01-15|4-NOT SPECIFIED|Clerk#000000225|0|doubt slyly even theod +8101|80|F|168588.47|1993-03-05|3-MEDIUM|Clerk#000000889|0|y final platelets. regular deposits are +8102|1333|O|256472.97|1997-06-05|3-MEDIUM|Clerk#000000225|0|bout the unusual theod +8103|1373|F|172014.50|1994-11-03|5-LOW|Clerk#000000327|0|s. blithely regular theodolites affix slyly careful excuses. b +8128|1198|O|94403.26|1996-10-04|2-HIGH|Clerk#000000855|0|nto beans are after the even, regular i +8129|196|O|153308.63|1998-01-05|4-NOT SPECIFIED|Clerk#000000692|0|fully. fluffy packages wake above the +8130|889|F|61455.98|1992-05-14|1-URGENT|Clerk#000000138|0|s. deposits mold slyly. blit +8131|508|F|21982.04|1993-05-04|1-URGENT|Clerk#000000598|0|blithely ironic, ironic sentiments +8132|515|F|276419.24|1994-05-15|5-LOW|Clerk#000000626|0|hless requests nag blit +8133|1376|F|216408.80|1995-02-27|3-MEDIUM|Clerk#000000279|0|hely regular ideas wake fu +8134|1387|O|174401.25|1997-11-15|3-MEDIUM|Clerk#000000355|0|times ironic packages haggle alon +8135|1270|O|120243.29|1995-06-27|4-NOT SPECIFIED|Clerk#000000445|0|he express dependencies. express pinto beans haggle deposits. carefully bold +8160|545|O|143255.31|1996-04-23|5-LOW|Clerk#000000352|0|quickly ironic pinto beans nag slyly iro +8161|364|F|16290.71|1994-06-04|2-HIGH|Clerk#000000046|0|ccounts detect about the even, special dependencies. qu +8162|715|F|275405.37|1994-10-08|3-MEDIUM|Clerk#000000518|0|ke fluffily after the slyly express pinto beans; furiously ironic packages +8163|475|O|170809.67|1997-02-05|4-NOT SPECIFIED|Clerk#000000105|0|oxes must haggle blithely final pack +8164|1256|F|226268.74|1994-09-15|2-HIGH|Clerk#000000999|0|uick Tiresias haggle fluffily regular deposits. blithely silent req +8165|223|F|230848.54|1994-10-16|5-LOW|Clerk#000000180|0|nusual, unusual pinto beans wake slyly against the fluff +8166|553|O|339654.01|1997-02-06|4-NOT SPECIFIED|Clerk#000000763|0| blithely idle ideas affix careful +8167|805|F|103238.73|1992-08-05|1-URGENT|Clerk#000000193|0|ular asymptotes use carefully even requests. quickly ironic +8192|340|F|67515.90|1995-01-07|3-MEDIUM|Clerk#000000140|0|usly even requests. +8193|19|O|220727.61|1997-08-09|2-HIGH|Clerk#000000878|0|pecial foxes. carefully regular requests sleep furiou +8194|340|O|55935.05|1996-01-01|3-MEDIUM|Clerk#000000216|0|se slyly quickly regular instructions. slyly special +8195|283|F|203192.77|1995-01-07|3-MEDIUM|Clerk#000000778|0|y final packages cajole carefully ironic excuses. even as +8196|967|O|260031.40|1997-08-30|1-URGENT|Clerk#000000661|0|lly across the regu +8197|1499|O|158353.88|1998-01-07|2-HIGH|Clerk#000000473|0|dle carefully. slyly ironic package +8198|98|O|82848.62|1997-05-05|3-MEDIUM|Clerk#000000125|0|lar packages. pending, regular request +8199|488|O|31520.70|1997-03-30|4-NOT SPECIFIED|Clerk#000000612|0|es haggle at the slyly iro +8224|37|F|122435.70|1992-02-08|4-NOT SPECIFIED|Clerk#000000811|0|tes after the blithely slow requests print blithely regular, unusual theod +8225|253|F|220748.24|1993-09-02|1-URGENT|Clerk#000000410|0|latelets are. final, final pinto beans wake furiously at th +8226|305|O|159211.54|1995-12-30|4-NOT SPECIFIED|Clerk#000000909|0|s the quickly regular requests. blithely iro +8227|160|F|271343.24|1993-01-11|4-NOT SPECIFIED|Clerk#000000346|0|ual, regular pinto beans. furiously unusual requests wak +8228|532|F|53045.92|1993-07-27|4-NOT SPECIFIED|Clerk#000000385|0| deposits along the furiously unusual foxes detect fur +8229|1204|F|216239.48|1994-12-08|3-MEDIUM|Clerk#000000369|0|ests detect along the e +8230|1051|O|167776.59|1996-08-09|5-LOW|Clerk#000000860|0|ly special accounts are fluffily ironic requests. fluffily express package +8231|904|F|142053.39|1992-10-19|1-URGENT|Clerk#000000743|0|quickly pending instructions alongside of th +8256|1399|F|210209.94|1992-08-06|3-MEDIUM|Clerk#000000307|0|egular patterns. fluffily unusu +8257|350|F|221674.86|1994-03-23|5-LOW|Clerk#000000100|0| ironic, unusual deposi +8258|890|F|162418.84|1994-03-02|2-HIGH|Clerk#000000338|0|c ideas. silent, unusual dependencies wake furiously acco +8259|1142|F|52519.43|1994-04-19|3-MEDIUM|Clerk#000000035|0|he final packages. sometimes final reques +8260|5|F|29999.18|1993-05-09|2-HIGH|Clerk#000000448|0| carefully special excuses about the slyly express f +8261|1157|F|125698.35|1994-04-13|1-URGENT|Clerk#000000889|0|aringly unusual packages are fu +8262|730|O|179721.67|1998-05-17|4-NOT SPECIFIED|Clerk#000000582|0|the requests sleep fluffily final dugouts. final foxes +8263|628|F|120521.62|1995-01-27|1-URGENT|Clerk#000000986|0|ly quickly ironic foxes. thinly careful packages haggle furiousl +8288|1420|O|179794.59|1995-05-10|1-URGENT|Clerk#000000375|0|ar instructions. slyly regular packages cajole blithe +8289|943|F|167084.20|1992-10-29|5-LOW|Clerk#000000610|0|ironic requests up the slyly regular accounts wake blithely among the blithe +8290|734|F|128757.62|1994-12-10|1-URGENT|Clerk#000000202|0|ajole tithes. even excuses integrate blithely. fluffily +8291|343|F|57075.78|1992-05-29|5-LOW|Clerk#000000176|0|posits above the unusual requests maintain deposits? theodolites during the f +8292|740|F|144113.86|1993-02-02|4-NOT SPECIFIED|Clerk#000000112|0|uests are carefully quick requests. careful +8293|1109|F|140844.51|1992-08-11|5-LOW|Clerk#000000492|0|ly ironic accounts wake along the carefully pen +8294|8|F|74088.36|1992-06-21|3-MEDIUM|Clerk#000000491|0| dolphins. regular ideas nag carefully. blithely pendi +8295|976|F|268571.47|1994-04-02|2-HIGH|Clerk#000000102|0|ly ironic pinto beans wake against the quickly final pinto be +8320|640|F|180122.29|1994-09-20|4-NOT SPECIFIED|Clerk#000000167|0|thely final pinto beans. quickly even instructions use b +8321|337|F|218824.78|1993-11-11|4-NOT SPECIFIED|Clerk#000000673|0|quickly final requests use slyly regular packages. pinto beans na +8322|421|O|142212.83|1996-03-25|2-HIGH|Clerk#000000871|0| blithely among the pending deposits. busily even ac +8323|532|O|186796.15|1995-09-07|2-HIGH|Clerk#000000625|0|ously unusual packages nag furiously. unusual id +8324|986|F|125734.10|1994-09-02|2-HIGH|Clerk#000000635|0|equests along the furiously ironic packages boost around the pending pac +8325|739|F|45840.85|1994-01-15|1-URGENT|Clerk#000000284|0|e. regular deposits nag carefully al +8326|1222|O|76551.65|1996-02-27|5-LOW|Clerk#000000473|0|e. slyly pending accounts cajole carefully +8327|1150|O|81707.28|1997-11-08|4-NOT SPECIFIED|Clerk#000000014|0|fully bold depths sleep quickly brave instructions. ironi +8352|697|F|63077.46|1993-07-11|2-HIGH|Clerk#000000492|0| accounts wake fluffily. express, ev +8353|418|F|169723.64|1994-05-16|3-MEDIUM|Clerk#000000510|0|usly. blithely even epitaphs in plac +8354|634|O|974.04|1996-09-15|3-MEDIUM|Clerk#000000495|0|ngage slyly requests. unusual waters in pla +8355|1180|O|229870.71|1997-11-20|1-URGENT|Clerk#000000481|0|gainst the furiousl +8356|889|O|42879.87|1995-03-31|2-HIGH|Clerk#000000520|0|es sleep blithely even theodolites. quickly ironic realms are +8357|742|O|125033.83|1997-08-29|1-URGENT|Clerk#000000640|0|gside of the slyly ironic theodolites. bold pa +8358|532|O|162649.16|1997-01-05|5-LOW|Clerk#000000077|0|nding deposits. never unusual accounts along +8359|374|F|140816.52|1992-05-17|5-LOW|Clerk#000000713|0|unusual, pending packages sleep slyly furiously fina +8384|451|F|174154.66|1993-05-06|2-HIGH|Clerk#000000790|0|ions in place of the slyly +8385|806|O|179076.89|1997-06-28|3-MEDIUM|Clerk#000000702|0|otes wake slyly. unusual pack +8386|391|O|174298.83|1998-02-17|1-URGENT|Clerk#000000919|0|sly bold requests. quickly even deposits nag qu +8387|1441|F|221043.72|1993-03-21|4-NOT SPECIFIED|Clerk#000000392|0|final multipliers wake-- pending, regular platelets doze slyly regular deposi +8388|877|F|241856.63|1992-02-24|5-LOW|Clerk#000000930|0|integrate across the furiously express packages. express, p +8389|607|F|158385.44|1994-04-23|3-MEDIUM|Clerk#000000097|0|ies boost. regular, final deposits nag +8390|671|F|105700.25|1992-04-22|3-MEDIUM|Clerk#000000862|0|iously across the bli +8391|53|O|233622.19|1995-08-29|2-HIGH|Clerk#000000188|0|lar instructions. ironically special Tiresias are f +8416|109|F|305632.28|1993-08-07|5-LOW|Clerk#000000804|0|usly ironic accounts must have to sleep pending, final req +8417|1081|O|85524.83|1997-08-23|5-LOW|Clerk#000000651|0|e to detect furiously against the furiously even dolphin +8418|109|O|13001.76|1996-10-15|2-HIGH|Clerk#000000987|0|ealthy requests. blithely ironic dependencies aff +8419|1174|O|291300.34|1995-09-30|1-URGENT|Clerk#000000569|0|ully regular dependencies according to +8420|1412|O|1105.14|1997-06-19|3-MEDIUM|Clerk#000000191|0|press pinto beans. slyly even ideas sleep quickly +8421|589|O|278980.26|1997-03-22|1-URGENT|Clerk#000000102|0| fluffily final foxe +8422|178|F|290126.24|1994-04-15|3-MEDIUM|Clerk#000000061|0|jole carefully over the carefully pending ideas. forges use fluff +8423|904|O|139719.54|1996-12-08|2-HIGH|Clerk#000000794|0| are furiously even dependencies. even deposits hag +8448|623|O|53362.81|1995-10-07|2-HIGH|Clerk#000000472|0|t haggle at the slyly even packages. slyly thin frays sleep bl +8449|1456|O|128351.07|1996-10-11|1-URGENT|Clerk#000000329|0|kages. blithely unusual deposits play. +8450|1036|F|54318.72|1992-04-14|4-NOT SPECIFIED|Clerk#000000910|0|ly after the fluffily ironic packages. pending theodolites wake. blithely regu +8451|325|O|63961.78|1995-12-14|3-MEDIUM|Clerk#000000719|0|ions. slyly regular deposits haggle alongsi +8452|1393|F|227228.93|1992-07-30|4-NOT SPECIFIED|Clerk#000000951|0|ealms sleep blithely. carefully silent requests print furiously. +8453|470|O|104045.76|1997-09-04|1-URGENT|Clerk#000000494|0|among the carefully express requests. even requests among the furiously +8454|340|F|202991.73|1992-08-16|3-MEDIUM|Clerk#000000481|0|es are fluffily. sile +8455|664|F|77528.00|1994-08-21|3-MEDIUM|Clerk#000000666|0|sly-- special ideas above the fluffily bold deposits affix carefully +8480|1498|F|261895.37|1995-01-30|2-HIGH|Clerk#000000528|0|iously final Tiresias. even theodolites sublate above th +8481|388|O|30784.93|1998-04-08|5-LOW|Clerk#000000448|0|es. thinly regular th +8482|583|O|135723.94|1997-03-16|4-NOT SPECIFIED|Clerk#000000579|0|y even courts cajole caref +8483|587|O|89197.14|1995-10-31|3-MEDIUM|Clerk#000000968|0|uriously across the instructions. special, regular pinto +8484|1450|O|128127.80|1995-09-05|4-NOT SPECIFIED|Clerk#000000789|0|even dependencies sleep ab +8485|1393|O|54738.78|1997-09-02|2-HIGH|Clerk#000000151|0|ular accounts nag slyly. slyly regular in +8486|802|O|81106.42|1997-01-21|3-MEDIUM|Clerk#000000212|0|riously even accounts impress furiously am +8487|866|O|213906.32|1997-01-05|2-HIGH|Clerk#000000756|0|are fluffily about the packages +8512|958|F|61029.26|1994-06-24|3-MEDIUM|Clerk#000000297|0|fully regular accounts integrate carefully during the final, even depe +8513|394|O|123794.37|1995-07-16|5-LOW|Clerk#000000810|0|ns after the carefully dogged accounts haggle furiously slyly unu +8514|697|O|253595.31|1996-02-14|1-URGENT|Clerk#000000904|0|ts integrate idle theodolites. deposits wak +8515|1012|F|209946.93|1993-12-22|1-URGENT|Clerk#000000552|0|riously according to the furiously final ideas. quick +8516|107|O|377636.63|1996-04-08|5-LOW|Clerk#000000199|0|cial, final deposits nag quickly after the furiou +8517|1133|O|242957.93|1997-03-12|5-LOW|Clerk#000000516|0|blithely final accounts. furiously permanent accounts +8518|655|O|69419.36|1998-05-04|3-MEDIUM|Clerk#000000190|0|to the finally bold dependencies. boldly regular platelets use above t +8519|583|O|232835.39|1996-08-25|3-MEDIUM|Clerk#000000145|0|long the slyly expres +8544|1441|F|37882.09|1993-02-13|5-LOW|Clerk#000000503|0|g the furiously final requests wake quickly +8545|584|F|283891.47|1994-06-18|5-LOW|Clerk#000000139|0| the final pinto beans are along the foxes. slyly +8546|109|F|134645.20|1992-04-02|2-HIGH|Clerk#000000137|0|sits are carefully silent pinto +8547|1211|O|227156.42|1996-12-23|5-LOW|Clerk#000000043|0|ts nag blithely unusual deposits. never ironic instructions affix ca +8548|1256|O|122661.18|1997-08-05|1-URGENT|Clerk#000000314|0|accounts across the regul +8549|457|O|272315.84|1997-09-29|3-MEDIUM|Clerk#000000446|0|e carefully according to +8550|89|F|197082.34|1993-02-04|4-NOT SPECIFIED|Clerk#000000359|0|pths. ironic accounts wake quickly after the final ex +8551|16|F|172327.66|1994-07-30|1-URGENT|Clerk#000000502|0| accounts mold fluffily about the s +8576|691|F|100213.40|1994-01-10|2-HIGH|Clerk#000000716|0|ts. fluffily final asympto +8577|31|O|329481.67|1996-11-09|5-LOW|Clerk#000000694|0|manently quickly stealthy +8578|1462|O|180645.29|1995-09-03|2-HIGH|Clerk#000000535|0|ep carefully according to the furiously express reque +8579|1408|O|174615.88|1997-09-09|2-HIGH|Clerk#000000655|0|packages nag. fluffily regular foxes cajole final, even pa +8580|772|F|148362.99|1995-03-23|2-HIGH|Clerk#000000824|0| deposits. ironic deposits integrate carefully qui +8581|44|F|161372.66|1993-07-06|1-URGENT|Clerk#000000348|0| ideas thrash furiously above the ironic ideas. bold accounts serve. a +8582|664|F|245231.90|1993-11-21|5-LOW|Clerk#000000612|0|totes. carefully final packages haggle slyly after the pe +8583|526|F|104729.09|1993-06-13|1-URGENT|Clerk#000000650|0|final platelets. evenly express excuses cajole: slyly regular ideas +8608|1003|O|139751.37|1996-04-11|3-MEDIUM|Clerk#000000128|0|lithely regular packages. even deposits cajole furiously? blithely final wa +8609|1258|F|144954.53|1992-04-15|1-URGENT|Clerk#000000788|0|. slyly final foxes nag. +8610|697|F|248902.39|1994-05-09|5-LOW|Clerk#000000750|0|ts. unusual asymptotes wake a +8611|638|O|71589.34|1996-05-08|2-HIGH|Clerk#000000630|0|e furiously even instructions. fluffily regular requests +8612|1021|O|90055.13|1996-08-11|2-HIGH|Clerk#000000478|0|y according to the carefully quick deposits. special, ironic platelets sleep f +8613|1213|F|99114.70|1993-09-26|3-MEDIUM|Clerk#000000545|0|ake carefully among the platelets. quick +8614|1192|F|133083.87|1994-06-05|5-LOW|Clerk#000000741|0|deposits: blithely special dolphins wake according to the +8615|43|O|80333.48|1996-06-29|4-NOT SPECIFIED|Clerk#000000329|0|kly final packages sleep slyly regular dolphins. blit +8640|1217|F|30130.90|1993-09-12|2-HIGH|Clerk#000000221|0| blithely on the fluffily even pint +8641|343|F|122416.58|1995-03-24|5-LOW|Clerk#000000848|0| quickly slyly bold accounts. pending, special accounts boost. final, unus +8642|499|F|54430.93|1993-01-17|2-HIGH|Clerk#000000989|0|ironic platelets serve carefully alongside of the +8643|1151|O|21057.31|1998-06-29|4-NOT SPECIFIED|Clerk#000000343|0|packages use pending, quiet packages. express theodoli +8644|1225|F|107598.10|1994-07-08|4-NOT SPECIFIED|Clerk#000000508|0|the slyly regular ideas. even instructions are s +8645|625|O|294419.31|1996-10-27|3-MEDIUM|Clerk#000000144|0|special packages cajole along the bold, silent ideas. fluffily b +8646|1084|F|109026.68|1994-04-10|2-HIGH|Clerk#000000320|0|lyly according to the idly silent instructions. ironic accounts cajole; +8647|1102|F|60191.34|1993-11-14|3-MEDIUM|Clerk#000000996|0|accounts. fluffily +8672|163|F|61453.17|1993-05-27|4-NOT SPECIFIED|Clerk#000000195|0|cial requests: carefully final +8673|1112|O|180643.81|1996-02-14|4-NOT SPECIFIED|Clerk#000000241|0|dolites. regular, silent instr +8674|1384|O|83994.63|1997-02-12|5-LOW|Clerk#000000213|0|inst the ironic, special instructions. r +8675|697|O|92813.75|1997-10-05|5-LOW|Clerk#000000455|0|y pending, regular ideas. unusual, ironic fr +8676|1052|O|32294.74|1996-04-02|5-LOW|Clerk#000000585|0|pecial escapades. carefully re +8677|476|F|42009.81|1992-10-08|2-HIGH|Clerk#000000041|0|ly. furiously ironic accounts hag +8678|298|F|142413.44|1992-10-01|5-LOW|Clerk#000000093|0|grouches. ironic id +8679|569|F|122926.86|1992-05-07|3-MEDIUM|Clerk#000000898|0| are quickly. accounts haggle. dolphins b +8704|553|O|278121.42|1995-07-01|3-MEDIUM|Clerk#000000625|0|furiously bold packages according t +8705|1471|O|102340.60|1996-03-18|1-URGENT|Clerk#000000553|0|al packages. fluffily pending theodolites around the +8706|334|O|304143.15|1996-07-06|1-URGENT|Clerk#000000937|0|as cajole against the blithe packages. express requests nag quickly. slyl +8707|977|O|175711.26|1997-12-04|1-URGENT|Clerk#000000011|0|xpress ideas breach slyly for the car +8708|1217|O|164222.66|1997-11-27|1-URGENT|Clerk#000000627|0|ly after the quickly dogged requests. furiously bold accounts along +8709|487|F|277334.28|1994-03-09|2-HIGH|Clerk#000000862|0|s. blithely regular foxes boost blithely special excuses. ca +8710|967|F|132480.14|1994-01-05|1-URGENT|Clerk#000000837|0|final packages cajole. slyly ironi +8711|1186|O|222273.92|1997-03-19|5-LOW|Clerk#000000502|0|ide of the final pinto beans. regular, regular platelets +8736|334|F|230102.63|1993-09-07|3-MEDIUM|Clerk#000000423|0|jole along the express instructions. final asympto +8737|826|O|129651.70|1998-01-05|3-MEDIUM|Clerk#000000554|0|etect quickly. furiously final deposits haggle carefully blithe, final +8738|283|O|51403.75|1998-01-28|5-LOW|Clerk#000000053|0| the furiously special pinto beans nag against the regular depe +8739|391|O|94838.63|1998-07-01|2-HIGH|Clerk#000000382|0|tions boost about the furiously pending requests. quickl +8740|1198|O|170142.70|1998-06-23|3-MEDIUM|Clerk#000000145|0|uickly pending instructions. special, fin +8741|763|O|165667.82|1997-09-03|1-URGENT|Clerk#000000272|0|egular requests. carefully regular foxes aga +8742|544|O|171723.41|1997-08-18|3-MEDIUM|Clerk#000000940|0| express requests. ironic requests wake quickly i +8743|550|O|196366.97|1995-08-01|2-HIGH|Clerk#000000400|0|ironic deposits nag furiously express requests. carefully regular depos +8768|1193|O|125841.91|1995-08-19|2-HIGH|Clerk#000000809|0|ly slyly even accounts. deposits around the blithely even asymp +8769|496|O|113375.48|1997-05-22|4-NOT SPECIFIED|Clerk#000000008|0|slyly unusual ideas. special +8770|160|O|130576.68|1996-07-10|4-NOT SPECIFIED|Clerk#000000231|0|r dependencies are slyly ironic, regular dep +8771|1213|F|110782.95|1992-03-19|2-HIGH|Clerk#000000635|0|structions. blithely final asymp +8772|283|F|12140.34|1992-02-14|1-URGENT|Clerk#000000294|0|ully final waters snooze slyly carefully even dolphins. furiou +8773|1364|O|54551.24|1995-10-23|1-URGENT|Clerk#000000886|0|above the fluffily fin +8774|1448|O|257643.82|1996-04-15|4-NOT SPECIFIED|Clerk#000000626|0|eep fluffily pending packages. carefully expre +8775|823|F|62311.18|1995-02-04|1-URGENT|Clerk#000000167|0|ic dependencies! regular foxes nag carefu +8800|1261|F|12400.99|1992-11-24|5-LOW|Clerk#000000722|0|ely special deposits among the fluffily p +8801|238|F|221609.61|1992-08-11|5-LOW|Clerk#000000030|0|into beans boost carefully even foxes. blithely regular accounts after +8802|1222|F|108992.67|1995-02-01|3-MEDIUM|Clerk#000000223|0|s pinto beans sleep blith +8803|880|F|181360.74|1992-12-21|4-NOT SPECIFIED|Clerk#000000834|0|aintain against the slyly u +8804|1340|O|229115.35|1997-11-21|3-MEDIUM|Clerk#000000258|0|ctions. slyly regular requests sublate blithe +8805|871|O|361167.24|1996-07-28|5-LOW|Clerk#000000521|0|al gifts boost slyly unusual escapades? fluffily pending deposits lo +8806|764|O|164043.86|1996-04-01|3-MEDIUM|Clerk#000000504|0|he instructions. quickly un +8807|1471|F|121146.76|1993-02-26|5-LOW|Clerk#000000898|0|ding pinto beans. special requests c +8832|511|F|124326.01|1992-02-03|5-LOW|Clerk#000000399|0|ts. busily even realms wak +8833|395|F|118461.89|1992-05-05|5-LOW|Clerk#000000241|0|e quickly ironic theodolites wake above the bold platelets. fluffily regular +8834|265|F|152152.97|1993-11-09|2-HIGH|Clerk#000000648|0|e blithely. fluffily pending excuses across the furiously final th +8835|472|F|139954.19|1994-10-14|1-URGENT|Clerk#000000400|0|sits. regular, special request +8836|604|O|278467.46|1996-10-20|3-MEDIUM|Clerk#000000419|0|ar pinto beans. asymptotes wake. evenly final theodolites haggle careful +8837|1430|O|93402.28|1997-02-19|4-NOT SPECIFIED|Clerk#000000732|0|eposits? theodolites +8838|109|O|77994.27|1997-09-19|2-HIGH|Clerk#000000393|0|ts are. even pinto beans at the f +8839|929|F|41153.67|1995-04-12|1-URGENT|Clerk#000000998|0|ully express accounts about the carefully ironic dolphins hag +8864|814|O|64727.16|1997-02-14|5-LOW|Clerk#000000260|0|r accounts according to the regular +8865|634|F|10901.96|1993-05-04|1-URGENT|Clerk#000000333|0|ole slyly carefully unusual theodolites. ironic +8866|1312|O|210315.07|1998-02-27|2-HIGH|Clerk#000000622|0|ously furiously even packages. even, unusual pinto beans haggle quickl +8867|46|O|274140.91|1996-12-23|5-LOW|Clerk#000000695|0|accounts haggle fluffily around the fluffily ir +8868|376|F|168785.62|1994-01-29|5-LOW|Clerk#000000453|0|he furiously final requests. fluffily bold accounts beside the idle, pending +8869|520|F|197739.53|1993-05-21|4-NOT SPECIFIED|Clerk#000000681|0|olites. furiously unusual frays +8870|1180|F|89187.15|1993-03-06|4-NOT SPECIFIED|Clerk#000000738|0|s are quickly regular deposit +8871|787|F|37073.58|1993-10-21|4-NOT SPECIFIED|Clerk#000000899|0|y express ideas boost slyly. furiously bold theodolites are silently carefully +8896|88|O|50827.57|1997-01-15|3-MEDIUM|Clerk#000000552|0|ld platelets. quickly +8897|1072|O|296564.68|1997-09-09|2-HIGH|Clerk#000000448|0|posits sleep above the even, ironic theodolites. +8898|1126|O|88542.53|1996-08-31|3-MEDIUM|Clerk#000000346|0|iously special warthogs haggle above the furiously +8899|875|F|112315.30|1993-08-11|1-URGENT|Clerk#000000251|0|he express, special requests breach furiously deposits. furiously final depend +8900|577|O|254301.05|1996-03-31|4-NOT SPECIFIED|Clerk#000000465|0|packages are blithely blithely express courts. even attainments ought to ca +8901|1078|O|54431.11|1995-08-21|5-LOW|Clerk#000000939|0|. blithely ironic sauternes boost sly +8902|569|O|14629.58|1995-06-20|2-HIGH|Clerk#000000550|0|ove the regular, bol +8903|40|F|115961.79|1994-08-05|4-NOT SPECIFIED|Clerk#000000063|0|t slyly among the special ideas. final theodolites about the blithel +8928|169|F|19526.74|1994-11-06|3-MEDIUM|Clerk#000000446|0|y bold pinto beans: final requests boost blithel +8929|794|O|136368.32|1997-09-18|4-NOT SPECIFIED|Clerk#000000902|0|ar deposits. furiousl +8930|707|F|57492.94|1994-05-20|3-MEDIUM|Clerk#000000290|0|symptotes boost carefully express gifts; ruthlessly si +8931|631|O|98532.53|1996-05-27|4-NOT SPECIFIED|Clerk#000000154|0|bold requests wake slyly furiously special +8932|1225|F|1794.34|1993-04-24|3-MEDIUM|Clerk#000000431|0|xes? regular accounts haggle quickly slyly even platelets. ir +8933|179|F|38107.73|1993-10-08|2-HIGH|Clerk#000000815|0|efully special packages. carefully regular deposits are within the fur +8934|620|O|238778.60|1996-09-19|3-MEDIUM|Clerk#000000189|0| final deposits sle +8935|988|O|90710.57|1998-03-23|5-LOW|Clerk#000000313|0|among the furious packages. slyly close escapades boost slyly acr +8960|433|F|157643.76|1993-06-06|3-MEDIUM|Clerk#000000354|0|he regular, special gr +8961|1109|O|163478.46|1995-06-29|5-LOW|Clerk#000000985|0|regular dolphins. unusual, bold requests use evenly slowly unusual multi +8962|355|O|67997.64|1997-05-09|5-LOW|Clerk#000000326|0|quickly express foxes +8963|1411|O|125975.40|1997-03-21|3-MEDIUM|Clerk#000000265|0|carefully after the slyly final warthogs. packages haggle according to the ir +8964|740|O|149351.10|1998-02-11|2-HIGH|Clerk#000000079|0|efully regular deposits. quickly even packages +8965|731|F|96898.03|1993-10-04|4-NOT SPECIFIED|Clerk#000000247|0|refully regular accou +8966|1225|O|189132.32|1996-05-09|4-NOT SPECIFIED|Clerk#000000130|0|furiously blithely ir +8967|452|O|65909.64|1995-07-13|5-LOW|Clerk#000000372|0| decoys. final ideas haggle slyly regular, ironic +8992|868|F|180372.33|1993-11-13|2-HIGH|Clerk#000000114|0|even sentiments wake furiously regular dolphins. ironic warthogs haggle qui +8993|784|P|68904.97|1995-05-29|3-MEDIUM|Clerk#000000279|0|to beans can sleep. silent accounts nag blithe +8994|1001|F|214292.33|1994-04-08|5-LOW|Clerk#000000890|0| carefully even request +8995|1132|O|198974.82|1995-05-18|2-HIGH|Clerk#000000975|0|counts? furiously bold theodolites nag slyly. blithely ironic platelets alo +8996|1492|P|155434.15|1995-06-03|5-LOW|Clerk#000000992|0| accounts. final deposits unwind fu +8997|607|F|147614.36|1994-07-02|5-LOW|Clerk#000000404|0|lithely. express, ironic pearls nag permanently. +8998|80|F|147264.16|1993-01-04|5-LOW|Clerk#000000733|0| fluffily pending sauternes cajo +8999|1175|F|113671.53|1994-06-13|2-HIGH|Clerk#000000097|0|ly even foxes. slyly express a +9024|1469|F|298241.36|1992-06-03|3-MEDIUM|Clerk#000000901|0|ar the theodolites. fluffily stealthy requests among the quickly regular asy +9025|739|F|97454.69|1994-05-20|5-LOW|Clerk#000000379|0|ording to the quickly regular ideas integrate above the sly platelets. sly +9026|677|O|63256.87|1996-07-24|5-LOW|Clerk#000000320|0|ironic escapades would wake carefully +9027|514|O|155500.43|1995-09-03|5-LOW|Clerk#000000918|0| sleep carefully with th +9028|1475|F|63063.84|1993-12-22|5-LOW|Clerk#000000364|0| the regular packages. daringly even f +9029|1213|F|78703.86|1992-11-20|3-MEDIUM|Clerk#000000965|0| excuses nag quickly carefully unusual excuse +9030|535|O|225136.87|1998-07-14|3-MEDIUM|Clerk#000000872|0|foxes according to the furiously silent excuses could haggle unusual d +9031|1379|F|270589.18|1993-12-27|5-LOW|Clerk#000000890|0|r packages. slyly express ideas +9056|121|O|170074.18|1996-08-08|3-MEDIUM|Clerk#000000117|0|was carefully after the furiously bold dug +9057|71|F|320227.49|1994-11-05|1-URGENT|Clerk#000000539|0| fluffily quickly ironic packages. furiously ironic accounts a +9058|403|F|63464.13|1993-06-29|2-HIGH|Clerk#000000376|0|ealthily special deposits. quickly regular requests wake silently. fur +9059|926|O|187590.77|1996-08-01|2-HIGH|Clerk#000000725|0|ar pinto beans sleep special +9060|463|O|45295.71|1996-06-09|1-URGENT|Clerk#000000438|0|iously. slyly regular dol +9061|325|O|66191.69|1996-01-15|2-HIGH|Clerk#000000428|0|silent excuses! slyl +9062|1102|P|212710.32|1995-03-21|2-HIGH|Clerk#000000201|0|sts cajole slyly according to the carefully slow foxes. furio +9063|1399|O|51019.90|1997-02-12|2-HIGH|Clerk#000000323|0|ffily regular grouche +9088|610|F|224148.01|1994-06-23|1-URGENT|Clerk#000000975|0|ter the blithely final deposits. furiously +9089|370|F|39118.01|1993-05-24|1-URGENT|Clerk#000000538|0|d platelets are deposits. pinto beans cajole boldly. +9090|775|O|9848.22|1996-11-21|4-NOT SPECIFIED|Clerk#000000699|0|cial theodolites at the evenl +9091|679|F|242198.88|1993-11-12|2-HIGH|Clerk#000000426|0|final packages wake carefully. +9092|664|F|202836.36|1994-07-25|4-NOT SPECIFIED|Clerk#000000144|0| slyly final waters. special packages solve +9093|619|O|19431.49|1995-12-10|3-MEDIUM|Clerk#000000333|0|even accounts. special, +9094|1430|O|46784.32|1998-05-27|3-MEDIUM|Clerk#000000805|0|es boost slyly after the platelets. shea +9095|220|O|49946.10|1995-06-11|2-HIGH|Clerk#000000621|0|riously regular accounts wake slyly special theodolites. asymptotes use f +9120|1010|F|128719.48|1992-06-22|3-MEDIUM|Clerk#000000252|0|ly ironic realms. furio +9121|434|O|94637.46|1996-07-05|5-LOW|Clerk#000000930|0| final dependencies. carefully even excuses after the +9122|79|O|234630.52|1996-12-14|4-NOT SPECIFIED|Clerk#000000991|0|across the carefull +9123|367|F|64575.87|1993-06-27|1-URGENT|Clerk#000000988|0|wake carefully pendin +9124|559|O|173690.73|1995-10-17|5-LOW|Clerk#000000381|0|nstructions after the c +9125|151|O|195514.25|1998-05-30|2-HIGH|Clerk#000000591|0|kages around the fluffily bold f +9126|371|F|106144.91|1994-11-18|3-MEDIUM|Clerk#000000319|0|deposits boost carefully against the fluffily final instructions. i +9127|611|O|79003.80|1995-10-11|4-NOT SPECIFIED|Clerk#000000628|0|ress packages across the furio +9152|1210|F|129410.55|1993-08-21|4-NOT SPECIFIED|Clerk#000000612|0|nto beans! final instructions nag slyly. slyly ironic foxes nag blith +9153|1147|O|210245.80|1997-07-19|4-NOT SPECIFIED|Clerk#000000488|0|uffily express instructions haggle carefully. quickly fluffy th +9154|1|O|357345.46|1997-06-23|4-NOT SPECIFIED|Clerk#000000328|0|y ironic packages cajole. blithely final depende +9155|355|F|83263.25|1992-08-31|1-URGENT|Clerk#000000253|0|ickly regular requests sleep alongside of the car +9156|154|F|135183.22|1994-02-07|1-URGENT|Clerk#000000387|0|deposits. dependencies wake ca +9157|595|F|52660.33|1992-06-20|5-LOW|Clerk#000000736|0|requests detect furiously special, silent packages. carefu +9158|271|F|96814.40|1995-04-25|4-NOT SPECIFIED|Clerk#000000195|0|ecial, even packages. even foxes print. regu +9159|1135|O|99594.61|1995-07-26|1-URGENT|Clerk#000000892|0|xcuses. quickly ironic deposits wake alongside of the quickly pending p +9184|1156|O|56334.07|1997-07-19|1-URGENT|Clerk#000000086|0|blithely final packages haggle according to the slyly quick pack +9185|145|F|64122.78|1994-06-16|2-HIGH|Clerk#000000951|0|leep carefully blithely regular orbits. blithely regular foxes cajol +9186|457|F|167929.61|1992-03-30|5-LOW|Clerk#000000044|0|lar, silent asymptotes haggl +9187|769|F|212469.45|1994-08-22|2-HIGH|Clerk#000000985|0|lithely ironic theodolites. furiously ironic instructions print along +9188|619|O|224857.18|1998-01-25|1-URGENT|Clerk#000000765|0|aggle quickly above the accounts. excuses +9189|1069|O|109530.95|1996-12-02|3-MEDIUM|Clerk#000000501|0|r waters haggle furiously fluffily ironic id +9190|460|O|272754.44|1998-03-03|2-HIGH|Clerk#000000196|0|side of the permanently ironic courts unwind +9191|535|O|21182.03|1996-03-24|3-MEDIUM|Clerk#000000095|0|final packages wake carefully. +9216|643|O|147294.33|1995-04-15|3-MEDIUM|Clerk#000000320|0|its nag regular deposits. slyly even reques +9217|1489|O|117161.58|1997-05-26|1-URGENT|Clerk#000000051|0| above the blithely regular d +9218|241|O|31407.74|1997-12-10|4-NOT SPECIFIED|Clerk#000000795|0|hely regular foxes are alongside of the furiously regular deposit +9219|412|F|205446.61|1994-09-29|5-LOW|Clerk#000000382|0|nst the furiously regular dinos. regular asymptotes against the slyly fina +9220|482|O|992.46|1998-04-07|1-URGENT|Clerk#000000880|0|y bravely ironic deposits. furiously unusual sentiments about the fluffily ir +9221|85|F|273797.07|1995-01-04|5-LOW|Clerk#000000240|0|ess accounts sleep carefully. carefully final pinto beans sleep f +9222|211|F|258460.61|1994-02-11|2-HIGH|Clerk#000000148|0|ding to the instructions. regular requests nag f +9223|304|O|215658.19|1997-08-05|4-NOT SPECIFIED|Clerk#000000785|0|ully according to the blithely +9248|1163|F|110964.49|1994-12-24|4-NOT SPECIFIED|Clerk#000000259|0|ids cajole regular, regular dependencies. deposits along the dolphi +9249|1348|F|161815.08|1993-05-20|2-HIGH|Clerk#000000756|0|slyly pending accounts. packages wake c +9250|1345|F|85572.38|1992-08-14|1-URGENT|Clerk#000000535|0|y final packages; carefully pendi +9251|323|F|29910.23|1993-08-30|3-MEDIUM|Clerk#000000374|0|ld requests. deposits use blithely ruthlessly unusual packages. fluffil +9252|412|O|89891.37|1997-12-11|2-HIGH|Clerk#000000454|0|encies affix slyly perma +9253|818|F|255856.03|1992-01-31|1-URGENT|Clerk#000000307|0|es. sometimes regular grouches wa +9254|1276|F|56365.27|1993-05-15|3-MEDIUM|Clerk#000000761|0|r deposits. quickly bold requests use- +9255|472|O|153124.60|1995-12-08|4-NOT SPECIFIED|Clerk#000000476|0|y bold asymptotes-- carefully +9280|1223|O|275205.91|1998-06-12|5-LOW|Clerk#000000022|0|beans alongside of the fluffily express asymptotes integrate +9281|904|F|173278.28|1992-02-24|1-URGENT|Clerk#000000530|0|eep furiously according to the requests; ideas integrate +9282|79|O|34765.35|1995-11-26|4-NOT SPECIFIED|Clerk#000000824|0|ses? carefully express platelets sleep blithely against the blithely specia +9283|1255|F|7798.12|1994-06-03|3-MEDIUM|Clerk#000000859|0|ully even platelets. silent packages +9284|661|F|56207.47|1994-06-14|4-NOT SPECIFIED|Clerk#000000544|0| furiously across the final deposits. quickly ironic requests accordin +9285|1012|F|118683.77|1994-01-03|1-URGENT|Clerk#000000553|0|sts. express accounts snooze; furiously final +9286|505|P|155839.92|1995-04-04|1-URGENT|Clerk#000000557|0|ake. carefully bold packages promise with the +9287|790|O|13525.92|1998-01-02|4-NOT SPECIFIED|Clerk#000000636|0|ously unusual packages. regular foxes detect. blithely slow ideas sl +9312|920|F|226584.81|1992-05-19|4-NOT SPECIFIED|Clerk#000000897|0|ckly slyly regular packages. unusual packages are. regular +9313|1348|O|222818.15|1996-04-06|3-MEDIUM|Clerk#000000926|0|s wake slyly against the slyly express packages. ironic packages +9314|1313|F|14188.37|1995-02-15|4-NOT SPECIFIED|Clerk#000000907|0|eas. blithely regular asymptotes sleep carefully across the slyly even +9315|587|O|16012.39|1998-03-17|3-MEDIUM|Clerk#000000559|0|ackages are furiously alongside of the slyly regular theodolite +9316|1393|O|225240.88|1995-09-18|4-NOT SPECIFIED|Clerk#000000363|0|inal pinto beans haggle c +9317|100|F|156751.98|1994-03-15|4-NOT SPECIFIED|Clerk#000000347|0|aves across the unusual, regular sauternes wake +9318|1463|F|109251.02|1992-07-28|1-URGENT|Clerk#000000738|0|ss courts across the slyly silent foxes are regular, final pac +9319|880|F|104039.47|1992-09-11|1-URGENT|Clerk#000000155|0|. fluffily ironic instructions detect +9344|664|O|348335.72|1995-12-07|5-LOW|Clerk#000000961|0|ial deposits nag blithely alongside of the caref +9345|1376|O|163627.01|1996-01-22|4-NOT SPECIFIED|Clerk#000000126|0|out the daringly ironic packages affix furiously fluffi +9346|917|O|173943.50|1996-10-09|4-NOT SPECIFIED|Clerk#000000088|0|furiously final packages integrate stealthily expres +9347|673|F|162913.90|1992-08-10|5-LOW|Clerk#000000268|0|he gifts. slyly permanent requests +9348|658|O|120413.73|1996-06-07|5-LOW|Clerk#000000416|0|ackages. carefully ironic pinto beans about the close accoun +9349|1414|O|217101.05|1997-08-29|4-NOT SPECIFIED|Clerk#000000804|0|. fluffily final accounts haggle; furiously reg +9350|145|F|255516.01|1992-11-01|1-URGENT|Clerk#000000253|0|ackages doze evenly across the foxes. quickly ironic reques +9351|898|O|81166.06|1996-05-17|5-LOW|Clerk#000000430|0|ven dependencies. furiously ironic dependencies promise along the slyly +9376|835|O|145196.26|1997-07-24|2-HIGH|Clerk#000000348|0|ng the carefully pending ac +9377|340|F|9021.26|1993-04-22|2-HIGH|Clerk#000000466|0|ers above the carefull +9378|457|O|115914.73|1997-10-16|1-URGENT|Clerk#000000014|0|ultipliers wake furiously never special deposits! +9379|350|F|152004.78|1992-01-04|1-URGENT|Clerk#000000764|0|nusual deposits. furiously final packages wake evenly even tithes. qu +9380|887|F|167911.91|1994-08-26|1-URGENT|Clerk#000000962|0| deposits boost along the carefully ironic deposits. express requests use. +9381|1184|O|94270.85|1995-12-18|4-NOT SPECIFIED|Clerk#000000215|0|y final Tiresias are. requests +9382|337|O|150840.29|1996-02-19|1-URGENT|Clerk#000000308|0|l accounts. furiously ironic deposits use. +9383|140|F|180583.64|1994-03-17|4-NOT SPECIFIED|Clerk#000000237|0|uffily final pinto beans cajole ca +9408|184|F|11891.10|1992-10-21|3-MEDIUM|Clerk#000000664|0|xes cajole carefully furiously final pains. carefully express accou +9409|970|F|155483.25|1992-05-06|1-URGENT|Clerk#000000300|0|ly express platelets above the sl +9410|787|O|88246.41|1997-07-18|5-LOW|Clerk#000000985|0|theodolites solve fluffily. blithely iron +9411|661|F|55576.82|1995-02-07|2-HIGH|Clerk#000000594|0|rses. furiously regular requests haggl +9412|1216|O|245785.65|1998-07-14|2-HIGH|Clerk#000000016|0|requests. carefully regular packages play carefully pending dependencies. ca +9413|148|O|150237.99|1995-07-13|5-LOW|Clerk#000000202|0|latelets are blithely requests. ironic packages boost slyly across t +9414|1333|F|98169.43|1993-09-10|3-MEDIUM|Clerk#000000661|0|above the slyly ironic +9415|1049|F|241463.63|1992-08-24|1-URGENT|Clerk#000000311|0|ccounts boost blithely. final +9440|643|F|4331.68|1994-06-08|5-LOW|Clerk#000000711|0| requests. regular, final pinto beans are. furiously regular accounts det +9441|334|O|3216.31|1997-06-18|4-NOT SPECIFIED|Clerk#000000381|0|iously final deposits. express, regular waters haggle sl +9442|1267|F|103119.65|1993-03-11|4-NOT SPECIFIED|Clerk#000000948|0|hely special courts. furiously final foxes sleep quickly. quick, +9443|304|O|166940.25|1997-05-07|4-NOT SPECIFIED|Clerk#000000317|0|y along the carefully reg +9444|106|O|36255.65|1996-07-18|2-HIGH|Clerk#000000387|0| quickly. always silent platelets must sleep f +9445|928|O|76754.58|1997-11-14|4-NOT SPECIFIED|Clerk#000000394|0|as. slyly ironic deposits along +9446|1358|O|216362.20|1997-12-29|1-URGENT|Clerk#000000173|0|ake pinto beans. slyly f +9447|1162|O|79483.65|1995-06-19|2-HIGH|Clerk#000000115|0|theodolites haggle carefully instructio +9472|481|O|44176.66|1995-06-17|1-URGENT|Clerk#000000979|0|bove the quickly final deposits are carefully +9473|23|F|212682.92|1992-10-12|4-NOT SPECIFIED|Clerk#000000541|0|ts sleep above the accounts. slyly final deposits are regularly. r +9474|133|P|246662.69|1995-05-12|3-MEDIUM|Clerk#000000710|0|ely final requests: dependencies cajole slyly. slyly +9475|1442|O|206441.11|1996-11-22|2-HIGH|Clerk#000000233|0| notornis. ironically even instructions en +9476|1283|F|177524.44|1994-05-26|4-NOT SPECIFIED|Clerk#000000088|0|e slyly final requests might integrate carefully against the slyly express p +9477|170|O|269394.57|1998-03-19|3-MEDIUM|Clerk#000000812|0|lites along the even deposits use bold pinto beans. regular requests +9478|940|F|173044.15|1994-03-29|2-HIGH|Clerk#000000033|0|ound the blithely express instructions. furiously +9479|1373|F|76316.92|1994-09-22|3-MEDIUM|Clerk#000000047|0|ter the carefully ironic +9504|736|F|171165.10|1992-11-26|3-MEDIUM|Clerk#000000902|0|among the quickly bold deposits haggle exp +9505|316|F|283831.70|1992-06-08|2-HIGH|Clerk#000000873|0|hely ironic asymptot +9506|1232|F|47720.50|1994-02-11|4-NOT SPECIFIED|Clerk#000000441|0|carefully ironic accou +9507|517|F|34161.51|1994-11-30|5-LOW|Clerk#000000438|0|press pinto beans are slyly. final packages cajole. quickly regular excus +9508|448|O|235237.15|1996-04-22|5-LOW|Clerk#000000312|0|ss attainments slee +9509|37|F|224330.32|1992-10-08|4-NOT SPECIFIED|Clerk#000000350|0|iously final instructions sleep fu +9510|235|O|93930.42|1996-11-20|5-LOW|Clerk#000000302|0|packages sleep furiously. bold theodolites haggle slyly. ironic, +9511|1141|O|96086.28|1996-08-01|5-LOW|Clerk#000000555|0|out the packages may +9536|1138|O|105639.69|1997-08-20|4-NOT SPECIFIED|Clerk#000000224|0|. slyly even ideas doubt slyly. slowly regular orbits cajole. fur +9537|806|F|249384.96|1995-02-14|4-NOT SPECIFIED|Clerk#000000203|0| packages. final, regular foxes haggle bli +9538|1399|F|32388.43|1994-03-11|4-NOT SPECIFIED|Clerk#000000040|0|ly. slyly final accounts nag carefully regular ideas. blithely ironic theodo +9539|262|O|26683.19|1995-11-15|2-HIGH|Clerk#000000917|0|iously ironic deposits affix furiously alongside of the slyly even foxes. even +9540|784|F|96163.55|1994-06-11|1-URGENT|Clerk#000000048|0|t above the stealthily bold theodolites +9541|598|F|105885.33|1992-03-26|4-NOT SPECIFIED|Clerk#000000840|0|xcuses dazzle furiously regular the +9542|1147|O|121584.41|1995-12-16|2-HIGH|Clerk#000000349|0|theodolites. blithely pendin +9543|850|F|145441.29|1992-05-10|1-URGENT|Clerk#000000187|0| unusual warhorses cajole +9568|619|F|80658.16|1993-03-08|4-NOT SPECIFIED|Clerk#000000270|0|ng the quickly unusual pinto beans sublate blithely ca +9569|1264|O|210401.62|1997-11-01|2-HIGH|Clerk#000000856|0|pecial deposits after the final, pending packages wake carefully +9570|1435|O|79124.61|1996-06-04|2-HIGH|Clerk#000000397|0|ccounts. foxes nag special, special theodolites +9571|1366|O|58131.32|1996-04-30|4-NOT SPECIFIED|Clerk#000000263|0| furiously express requests. even requests are. carefully final a +9572|49|O|85669.13|1998-03-28|4-NOT SPECIFIED|Clerk#000000452|0|atelets. slyly regular requests nag quickly ev +9573|1361|F|140154.64|1992-06-14|3-MEDIUM|Clerk#000000250|0|ix carefully busily unusual deposits. thin excuses haggle quickly. quickly +9574|790|O|145838.53|1995-07-31|3-MEDIUM|Clerk#000000814|0|efully regular platelets. pending packages unwind carefully among the fur +9575|916|F|27475.15|1992-03-31|5-LOW|Clerk#000000133|0|nts haggle busily unusual, even packages. regular packages u +9600|536|F|99615.09|1993-11-08|4-NOT SPECIFIED|Clerk#000000467|0|he unusual, ironic requests nag furiously ironic accounts +9601|1435|O|143520.49|1996-03-20|1-URGENT|Clerk#000000677|0|ugh the slyly regular requests. furiously even pinto beans are blithely slyl +9602|1481|F|193843.49|1992-11-11|1-URGENT|Clerk#000000086|0| across the slyly ironic ideas. carefully unusual requests +9603|1204|O|315928.32|1998-01-09|5-LOW|Clerk#000000191|0|ng the quickly special requests caj +9604|620|O|48743.62|1996-06-25|2-HIGH|Clerk#000000414|0|usly ironic theodolites! blithely final ideas +9605|1220|F|113112.29|1992-12-26|4-NOT SPECIFIED|Clerk#000000777|0|yly bold pinto beans are furiously packages. slyly express courts play +9606|152|F|149838.50|1994-07-28|4-NOT SPECIFIED|Clerk#000000474|0| above the always regular pinto beans. special, unusual accounts grow. pending +9607|643|O|44978.35|1995-12-18|1-URGENT|Clerk#000000752|0| ironic requests are carefully. silent +9632|1429|F|146044.97|1992-01-17|5-LOW|Clerk#000000857|0|y ironic theodolites are silent foxes. blithely final plate +9633|1336|O|191021.09|1995-09-12|4-NOT SPECIFIED|Clerk#000000918|0|ns around the slyly ironic pinto beans cajole carefully ironic depths. careful +9634|958|O|314926.50|1998-01-13|2-HIGH|Clerk#000000166|0| carefully. slyly ironic courts mold. ironic +9635|847|F|168349.65|1994-04-14|1-URGENT|Clerk#000000127|0|the quickly ironic ideas sleep at the quickly +9636|304|O|109568.95|1997-01-30|1-URGENT|Clerk#000000263|0|lar foxes are requests. quickly even pinto be +9637|1411|F|112613.87|1994-01-04|5-LOW|Clerk#000000953|0|s. furiously final requests believe furiously against the brave +9638|1126|O|112055.66|1996-06-08|2-HIGH|Clerk#000000953|0|requests after the furiously unusual accounts integrate slyly u +9639|722|F|244899.69|1993-09-06|4-NOT SPECIFIED|Clerk#000000666|0|press, express pinto +9664|310|F|105001.15|1993-04-08|2-HIGH|Clerk#000000715|0|ccounts across the slyly ironic pinto be +9665|1067|F|81734.81|1994-04-24|5-LOW|Clerk#000000277|0|sleep furiously carefully ironic foxes. pinto beans wake. final deposits caj +9666|221|O|240666.92|1996-05-09|1-URGENT|Clerk#000000511|0|ss the fluffily express tithes. +9667|1102|O|208860.66|1996-02-24|3-MEDIUM|Clerk#000000142|0|nal instructions. special accounts along the regular +9668|847|F|77447.46|1994-09-07|5-LOW|Clerk#000000469|0|refully ironic accounts. furiously bold packages a +9669|619|F|79738.94|1994-04-23|3-MEDIUM|Clerk#000000297|0|deposits promise blithely ironic theodolites. fluffily bold requests +9670|1387|O|200921.16|1997-11-08|3-MEDIUM|Clerk#000000035|0|unts? furiously express deposits are blithely. regular, special forges sle +9671|136|O|157241.36|1995-09-13|2-HIGH|Clerk#000000417|0|ages boost slyly against the furiously +9696|575|F|211382.08|1995-02-20|4-NOT SPECIFIED|Clerk#000000971|0|xpress requests would are pinto beans. +9697|164|F|174800.10|1995-01-27|3-MEDIUM|Clerk#000000432|0|courts are. even platelets was alongside of +9698|1487|O|7676.88|1995-08-07|2-HIGH|Clerk#000000040|0| around the quickly bold packages sle +9699|875|F|10782.39|1995-03-12|3-MEDIUM|Clerk#000000853|0|kly regular platelets. slyly silent accounts alongside of the blithely r +9700|544|O|266611.98|1995-08-09|1-URGENT|Clerk#000000137|0|althy pinto beans wake blithely. qui +9701|112|F|277385.28|1993-02-28|5-LOW|Clerk#000000399|0|bold deposits cajole furiously bold requests. even excuses +9702|1201|O|182347.71|1996-08-22|3-MEDIUM|Clerk#000000852|0|tions haggle slyly among the ironic theodolites. blithel +9703|1126|F|28954.25|1994-10-07|5-LOW|Clerk#000000101|0|realms wake. express, ironic accou +9728|826|F|39398.24|1993-07-03|5-LOW|Clerk#000000647|0|ng requests. fluffily enticing re +9729|970|O|162532.59|1996-07-06|3-MEDIUM|Clerk#000000148|0|ndencies about the care +9730|143|O|278148.33|1997-03-04|5-LOW|Clerk#000000743|0| final dependencies doze furiously slyly silent ideas? furiousl +9731|283|F|21613.76|1993-10-21|5-LOW|Clerk#000000586|0| dolphins nag slyly even deposits-- blithely +9732|820|P|69634.87|1995-03-14|4-NOT SPECIFIED|Clerk#000000599|0|f the special, even instructions. carefully final requests use along the +9733|1000|F|72374.84|1994-03-18|4-NOT SPECIFIED|Clerk#000000997|0|n dolphins haggle. slyly express accounts wake carefully final asymptotes. qui +9734|835|O|124297.04|1997-02-03|1-URGENT|Clerk#000000086|0|equests affix quietly bold deposits. dependencies affix among the quietly +9735|337|O|115276.76|1997-06-28|4-NOT SPECIFIED|Clerk#000000454|0|nic foxes. accounts detect fur +9760|1181|O|158777.10|1998-04-14|5-LOW|Clerk#000000207|0|anent accounts. accounts sleep carefully slyl +9761|433|F|70880.34|1992-01-23|4-NOT SPECIFIED|Clerk#000000468|0| permanent requests. furious requests nag blithely about the q +9762|1492|F|238951.03|1994-01-04|2-HIGH|Clerk#000000861|0|ic requests cajole quickly unusual accounts. regular foxes are blithely. in +9763|1492|O|132201.56|1995-08-14|3-MEDIUM|Clerk#000000374|0| requests detect carefull +9764|1256|F|56685.16|1992-12-30|1-URGENT|Clerk#000000289|0|nts. platelets wake blithe +9765|1153|F|45183.21|1992-10-13|5-LOW|Clerk#000000364|0|ts. even pinto beans haggle alongside of the theodolites. +9766|235|F|165508.82|1992-08-15|1-URGENT|Clerk#000000265|0|s excuses cajole quickly. regul +9767|973|F|46852.11|1994-06-28|5-LOW|Clerk#000000546|0|asymptotes hinder blithely after the busily final fo +9792|1114|O|171667.54|1995-07-24|5-LOW|Clerk#000000929|0| the special accounts. carefully special ideas mainta +9793|1198|F|80712.82|1992-04-04|3-MEDIUM|Clerk#000000770|0| carefully ironic courts haggle evenly. carefully final requests ca +9794|505|F|216443.67|1992-03-25|4-NOT SPECIFIED|Clerk#000000852|0|dolites grow furiously fluffily final requests. blithely special +9795|370|O|215242.29|1998-02-04|3-MEDIUM|Clerk#000000481|0|ng the furiously iron +9796|1052|F|246896.17|1993-09-11|1-URGENT|Clerk#000000150|0|lyly regular packages. furio +9797|43|F|209264.66|1993-09-13|1-URGENT|Clerk#000000296|0|packages. blithe requests affix quickly carefully unusual ideas. blithe +9798|1135|O|23604.81|1996-03-09|1-URGENT|Clerk#000000485|0|ial deposits. accounts detect dependencies. silent accounts cajole flu +9799|461|O|152265.02|1996-04-07|4-NOT SPECIFIED|Clerk#000000526|0|ully final requests cajole carefully according to t +9824|472|F|240691.30|1995-01-23|1-URGENT|Clerk#000000653|0|furiously even theodolites impress even, special asymptotes. idle ideas dazzl +9825|28|O|93645.30|1996-04-09|1-URGENT|Clerk#000000990|0|rding to the pending +9826|698|F|105223.73|1992-03-23|3-MEDIUM|Clerk#000000777|0|deas haggle slyly final reques +9827|1289|O|36448.45|1998-07-04|4-NOT SPECIFIED|Clerk#000000085|0|e unusual dependencies. regular accounts alongside of the quickly regular f +9828|1306|F|269649.39|1992-04-25|3-MEDIUM|Clerk#000000355|0| deposits are carefully bold notornis. blith +9829|1379|O|6613.63|1995-12-09|1-URGENT|Clerk#000000004|0|ke across the requests. silently final foxes wake never amo +9830|493|O|202703.99|1997-09-08|2-HIGH|Clerk#000000191|0|final packages are furiously beside the quickly final e +9831|790|O|86410.08|1996-06-20|4-NOT SPECIFIED|Clerk#000000010|0|mas above the even instructions haggle ironical +9856|802|F|236403.75|1993-05-30|3-MEDIUM|Clerk#000000278|0|usual tithes against the express requests sleep across t +9857|172|F|158381.98|1993-05-12|2-HIGH|Clerk#000000627|0|ons haggle quickly above the blithely regular sauternes. slyly express instru +9858|1399|O|103920.84|1997-12-08|3-MEDIUM|Clerk#000000432|0|e of the fluffily final packa +9859|475|O|247788.34|1996-07-28|3-MEDIUM|Clerk#000000989|0|xes boost slyly. furiously regul +9860|623|F|151734.45|1993-10-11|1-URGENT|Clerk#000000345|0|carefully. ironic ideas haggle theodolites. quickly speci +9861|1477|F|66189.04|1992-10-29|5-LOW|Clerk#000000113|0|le after the unusual deposits. even acc +9862|10|O|193015.83|1997-10-10|2-HIGH|Clerk#000000168|0|among the instructions was after the slyly special packages. final, final hoc +9863|247|O|362398.22|1995-09-05|1-URGENT|Clerk#000000473|0|urts nag finally even, stealthy instructions. quickly final ideas +9888|1319|F|74228.41|1994-09-13|5-LOW|Clerk#000000434|0|g to the carefully final foxes. fur +9889|82|F|35362.96|1994-09-09|3-MEDIUM|Clerk#000000786|0|lly atop the foxes. doggedly final packages integrate thin +9890|731|P|87423.78|1995-02-22|2-HIGH|Clerk#000000168|0|uickly silent theodolites. pe +9891|1093|P|61268.10|1995-06-09|1-URGENT|Clerk#000000544|0|ut the theodolites. bold, even grouches across t +9892|691|F|16104.32|1992-07-17|3-MEDIUM|Clerk#000000387|0|ts. blithe deposits wake carefully carefully +9893|412|F|105380.78|1994-08-17|3-MEDIUM|Clerk#000000931|0|y special dependencies run +9894|851|F|100473.64|1994-03-19|2-HIGH|Clerk#000000424|0| asymptotes along the regular, bold instructions eat quickly again +9895|142|F|245503.17|1993-04-21|5-LOW|Clerk#000000965|0|lithely. furiously even pinto beans h +9920|1073|O|75014.21|1996-06-06|1-URGENT|Clerk#000000007|0|ites. special requests believe against the furiously regular requests. furiou +9921|1379|P|143610.80|1995-05-15|5-LOW|Clerk#000000936|0|r, blithe deposits. furiously bold +9922|802|P|186264.65|1995-04-04|4-NOT SPECIFIED|Clerk#000000131|0|ajole blithely across the unusual, unusual packages. car +9923|1217|F|223804.09|1994-10-06|2-HIGH|Clerk#000000818|0|instructions use slyl +9924|799|O|192545.87|1997-05-09|4-NOT SPECIFIED|Clerk#000000639|0|onic excuses wake slyly +9925|52|F|296109.93|1992-01-31|1-URGENT|Clerk#000000751|0|ve the always ironic pinto bean +9926|254|F|225023.94|1994-10-12|2-HIGH|Clerk#000000090|0|sits believe carefully ironic pinto beans. sl +9927|13|O|238640.42|1995-08-17|2-HIGH|Clerk#000000388|0|sts sleep regular, dogged packages. s +9952|521|F|87414.24|1992-05-02|2-HIGH|Clerk#000000549|0|ully about the daringly pending idea +9953|946|F|18034.69|1995-02-28|2-HIGH|Clerk#000000364|0|iresias. furiously bold deposits wake. furiously +9954|19|F|207935.24|1994-06-20|4-NOT SPECIFIED|Clerk#000000651|0| furiously express packages. slyly ironic packages nag sly +9955|1010|O|188555.97|1995-09-05|1-URGENT|Clerk#000000588|0|gainst the quickly regular deposits. carefully final accounts are furiously +9956|530|F|38746.89|1993-03-17|2-HIGH|Clerk#000000001|0|s? ironic foxes wake even, ironic de +9957|1465|F|64682.58|1993-12-01|4-NOT SPECIFIED|Clerk#000000874|0| unusual sauternes. fluffily e +9958|764|F|192897.71|1993-11-26|4-NOT SPECIFIED|Clerk#000000199|0| idle depths. quickly even pearls are express theodolites. final pint +9959|689|O|19023.25|1995-09-25|3-MEDIUM|Clerk#000000755|0|y special deposits. slyly final deposits against +9984|376|O|232843.69|1998-07-10|1-URGENT|Clerk#000000161|0|ronic packages-- final packages boost! even, express frets boo +9985|1207|F|82406.34|1993-08-08|5-LOW|Clerk#000000636|0|ing depths boost about the even depo +9986|289|O|150409.70|1997-09-22|3-MEDIUM|Clerk#000000913|0|the ruthlessly regular courts. ironic pack +9987|997|O|241701.18|1995-11-28|5-LOW|Clerk#000000308|0|ding to the regular foxes dazzle slyly f +9988|1372|O|139134.68|1997-12-05|4-NOT SPECIFIED|Clerk#000000015|0|d, final foxes. fluffily even sheaves w +9989|1210|F|113256.41|1993-06-22|3-MEDIUM|Clerk#000000298|0| bold orbits. pinto beans haggle carefully unusual accounts. furiously final +9990|391|F|80673.96|1992-03-28|2-HIGH|Clerk#000000466|0|y express foxes. blithely +9991|823|O|88850.20|1996-06-10|2-HIGH|Clerk#000000542|0|foxes nag fluffily packages. b +10016|1295|F|29180.26|1993-02-02|1-URGENT|Clerk#000000546|0|ptotes. platelets across the blithely regular accounts us +10017|811|O|100168.42|1998-04-09|4-NOT SPECIFIED|Clerk#000000617|0|ly accounts. carefully regular pinto beans wake according to th +10018|307|F|85330.56|1993-06-10|3-MEDIUM|Clerk#000000855|0|ld accounts above the bold, regular requests ha +10019|919|F|169596.33|1994-07-19|4-NOT SPECIFIED|Clerk#000000887|0|ests are carefully blithely ironic instructi +10020|469|O|99184.61|1998-04-08|3-MEDIUM|Clerk#000000162|0|yly against the final warth +10021|1282|F|50708.88|1992-08-01|4-NOT SPECIFIED|Clerk#000000321|0|ide of the slyly even Tiresias. carefully express fox +10022|929|F|71058.00|1994-03-05|5-LOW|Clerk#000000445|0|nto beans. furiously silent deposits nag. bold requests are ironic +10023|1204|O|107965.02|1996-12-02|1-URGENT|Clerk#000000596|0|onically even packages haggle among the slyly brave pin +10048|803|F|63327.47|1994-05-16|4-NOT SPECIFIED|Clerk#000000893|0|nt pinto beans are. ironi +10049|683|O|169774.94|1997-07-23|1-URGENT|Clerk#000000648|0|ly special forges. blithely bo +10050|1046|O|151895.89|1996-09-03|2-HIGH|Clerk#000000530|0|bove the permanently regular multipliers. special req +10051|661|O|168753.53|1996-05-25|2-HIGH|Clerk#000000804|0|ly. quickly unusual de +10052|763|F|195461.73|1994-09-08|4-NOT SPECIFIED|Clerk#000000488|0|carefully final packages. ironic foxes cajo +10053|1441|F|152632.75|1992-01-11|2-HIGH|Clerk#000000508|0|ual deposits haggle against the furiously final realms. b +10054|665|O|111854.62|1995-04-29|2-HIGH|Clerk#000000093|0|furiously regular platele +10055|1276|O|108949.78|1996-02-29|5-LOW|Clerk#000000508|0|e bravely bold notornis. carefully reg +10080|109|F|219815.04|1993-02-13|5-LOW|Clerk#000000362|0|carefully blithely express epitaph +10081|493|F|267898.00|1993-08-08|4-NOT SPECIFIED|Clerk#000000097|0|eans would sleep. carefully iro +10082|1264|F|216021.80|1994-08-31|4-NOT SPECIFIED|Clerk#000000049|0|ayers use special excuses. special req +10083|565|O|55168.12|1995-09-26|5-LOW|Clerk#000000949|0|t the brave decoys sleep regularly among the iron +10084|1424|O|5317.21|1997-07-08|1-URGENT|Clerk#000000088|0|grow blithely packages. slyly final requests cajole; accounts +10085|518|O|224630.63|1996-03-31|4-NOT SPECIFIED|Clerk#000000074|0|o beans wake against the blithely final accounts. fluffily silent f +10086|397|O|51011.55|1995-05-16|5-LOW|Clerk#000000728|0|its wake alongside of the f +10087|404|O|78013.94|1997-03-31|2-HIGH|Clerk#000000001|0|ounts integrate despite the regular ideas. furiously quiet idea +10112|223|F|35243.42|1993-12-21|5-LOW|Clerk#000000586|0| deposits. furiously even asymptotes alongside of the slyly regular +10113|56|F|193866.35|1994-06-13|1-URGENT|Clerk#000000094|0|e quickly. regular accounts boost bravely regular instructions. quickly fina +10114|1064|F|46899.44|1993-02-09|1-URGENT|Clerk#000000757|0|al requests. quickly express de +10115|799|O|144986.20|1998-07-07|2-HIGH|Clerk#000000530|0|even accounts. express ideas +10116|118|O|222761.53|1997-03-26|5-LOW|Clerk#000000991|0|mptotes. carefully express depo +10117|734|F|130230.17|1993-11-17|3-MEDIUM|Clerk#000000343|0|ilent theodolites sleep furiously +10118|742|F|24563.35|1994-04-11|1-URGENT|Clerk#000000431|0|ithely pending foxes integrate across the fin +10119|509|O|51762.72|1996-07-11|3-MEDIUM|Clerk#000000868|0|ar depths. slyly sly theodolites sleep slyly. furiously bold foxes integrate +10144|311|F|235400.84|1995-01-03|1-URGENT|Clerk#000000751|0|ironic accounts cajole blithely around the blithe deposits. ir +10145|646|P|302026.89|1995-05-25|5-LOW|Clerk#000000550|0|y unusual deposits sleep furiously i +10146|994|F|237459.34|1994-05-02|5-LOW|Clerk#000000653|0|hin gifts nag. furiously pending deposits after the sly frets sl +10147|1166|F|203640.84|1993-10-10|2-HIGH|Clerk#000000212|0|ilently ironic pinto beans. +10148|1462|F|140605.75|1994-03-26|5-LOW|Clerk#000000334|0|the bold ideas are carefully ruthlessly special pac +10149|26|F|169118.62|1994-09-24|2-HIGH|Clerk#000000681|0|final sentiments. slyly special bra +10150|1325|F|291469.33|1992-04-30|1-URGENT|Clerk#000000802|0|r the requests sleep s +10151|589|F|10295.06|1992-01-15|1-URGENT|Clerk#000000645|0|ideas. deposits haggle quickly accounts; f +10176|985|O|102621.47|1996-08-26|3-MEDIUM|Clerk#000000456|0|unts. bold accounts are carefully according to the quickly p +10177|568|O|209213.44|1996-06-29|3-MEDIUM|Clerk#000000221|0|nstructions; bold, regular attainments among th +10178|1148|F|46311.36|1993-12-15|4-NOT SPECIFIED|Clerk#000000756|0|ray across the ironic, final dependencies. +10179|1157|O|153533.06|1996-04-30|4-NOT SPECIFIED|Clerk#000000803|0|sly bold packages haggle about the the +10180|712|O|76230.32|1997-03-10|1-URGENT|Clerk#000000743|0|ke blithely carefully even packag +10181|874|O|46249.63|1996-02-13|3-MEDIUM|Clerk#000000866|0|, pending deposits. express +10182|268|F|199446.10|1994-05-25|5-LOW|Clerk#000000304|0|s. slyly final pinto beans wake a +10183|250|F|110520.40|1994-11-25|1-URGENT|Clerk#000000534|0| dependencies. blithely pending requests about the furiously regular pac +10208|1028|O|286549.53|1996-08-26|3-MEDIUM|Clerk#000000259|0| ideas. slow, ironic instructions doze furiou +10209|1210|F|400191.77|1993-11-30|3-MEDIUM|Clerk#000000153|0|ts wake. slyly blithe +10210|937|O|148557.25|1995-06-24|4-NOT SPECIFIED|Clerk#000000573|0|ts. furiously bold ideas about the furiously bold pac +10211|797|O|192242.04|1997-07-29|4-NOT SPECIFIED|Clerk#000000363|0| careful theodolites. special accounts caj +10212|1471|F|126475.34|1993-05-24|5-LOW|Clerk#000000011|0|uickly according to the pending pinto beans. instructions brea +10213|1288|F|42898.55|1995-02-18|2-HIGH|Clerk#000000845|0|ly ironic dependencies. final excuses acros +10214|913|O|145287.98|1996-01-30|2-HIGH|Clerk#000000991|0|encies after the deposits sleep furiously bold packages. even deposits +10215|1031|O|156012.73|1996-08-17|1-URGENT|Clerk#000000770|0|pecial instructions. fluffily regular packa +10240|691|F|41343.99|1994-05-16|4-NOT SPECIFIED|Clerk#000000109|0|al accounts are along the unusual packages. unusual, even platelets use slyl +10241|271|O|54454.72|1997-09-30|5-LOW|Clerk#000000366|0|y unusual asymptotes. regular dependencies wake fluffily about the +10242|101|F|193761.97|1993-12-13|3-MEDIUM|Clerk#000000234|0|s was slyly alongside of the deposits. +10243|385|O|72189.37|1995-12-25|2-HIGH|Clerk#000000844|0|nic requests. boldly regular deposits haggle blithely. orbits integrate +10244|298|O|129419.40|1996-04-04|3-MEDIUM|Clerk#000000459|0|lent pinto beans. furiously iro +10245|587|F|268471.58|1995-02-14|3-MEDIUM|Clerk#000000785|0| beans. foxes haggle around the car +10246|1231|O|188201.88|1997-06-19|1-URGENT|Clerk#000000571|0|s. blithely unusual packages affix according to the hockey players. regular +10247|866|F|187970.24|1993-01-11|3-MEDIUM|Clerk#000000646|0|fully after the carefully pending requests. even, pending ideas alongside +10272|730|F|303855.22|1994-01-18|3-MEDIUM|Clerk#000000680|0| blithely express accounts. slyly regular pinto beans use slyly. +10273|112|O|272748.60|1998-04-24|1-URGENT|Clerk#000000303|0|n, ironic packages. slyly close accounts sleep. blithe +10274|1369|F|50775.14|1993-12-10|1-URGENT|Clerk#000000939|0|sits. fluffily bold requests cajole accounts +10275|83|O|78422.44|1997-05-16|5-LOW|Clerk#000000202|0|fts at the furiously express accounts are whithout the slyly slow deposits. f +10276|1463|O|264683.22|1996-02-24|3-MEDIUM|Clerk#000000706|0|y even deposits. even accounts nag among the ironic asymptotes. req +10277|538|F|139188.55|1994-04-08|3-MEDIUM|Clerk#000000655|0|counts sleep around the special +10278|359|O|162008.27|1995-09-13|5-LOW|Clerk#000000697|0|le quickly. pending, bold theo +10279|1223|O|227770.72|1996-09-22|5-LOW|Clerk#000000051|0|nal deposits. fluffily silent ideas are across the +10304|814|O|302630.21|1995-11-11|3-MEDIUM|Clerk#000000230|0|l deposits nag pending, regular attainments. ironic ideas detect. unusu +10305|25|F|153676.38|1994-07-08|5-LOW|Clerk#000000429|0|phins use furiously about the quickly bold id +10306|152|F|91506.19|1993-07-22|5-LOW|Clerk#000000345|0| slyly never final requests. perm +10307|298|O|230682.65|1998-01-28|4-NOT SPECIFIED|Clerk#000000488|0|yly ironic foxes. quickly regular +10308|413|P|278555.38|1995-04-21|2-HIGH|Clerk#000001000|0|are above the furiously final deposits. special packages nag s +10309|1312|F|215890.35|1994-11-22|5-LOW|Clerk#000000622|0| above the carefully bold packages. carefully even pinto beans mai +10310|1027|F|213874.91|1994-02-06|5-LOW|Clerk#000000645|0| accounts kindle qu +10311|52|F|5195.95|1992-08-18|2-HIGH|Clerk#000000147|0|ntegrate carefully above the regular pinto beans. quick +10336|1358|O|57610.67|1997-06-15|4-NOT SPECIFIED|Clerk#000000519|0|. carefully special pinto beans are ironic accounts. foxes +10337|1360|O|63068.37|1996-03-19|3-MEDIUM|Clerk#000000499|0|ly silent instructions wake qui +10338|1213|O|100334.47|1995-07-15|4-NOT SPECIFIED|Clerk#000000964|0|gular packages. slyly even packages haggle furious +10339|154|O|116081.18|1995-10-12|5-LOW|Clerk#000000585|0|ts. always ironic deposits haggle thinly. +10340|1486|O|243706.09|1995-06-23|2-HIGH|Clerk#000000064|0|hely final warthogs detect blithely regular pa +10341|1276|F|250921.23|1992-12-22|2-HIGH|Clerk#000000964|0|efully final packages cajole f +10342|638|O|273325.12|1995-11-23|3-MEDIUM|Clerk#000000277|0|theodolites. carefully regul +10343|91|F|44177.42|1992-03-27|4-NOT SPECIFIED|Clerk#000000600|0|ackages. carefully pending idea +10368|508|O|64465.48|1996-06-25|3-MEDIUM|Clerk#000000722|0|carefully special theodolites doze. fluffily ironic pinto be +10369|1397|O|120738.63|1995-11-10|5-LOW|Clerk#000000636|0| deposits are quickly; regular requests nag carefully regular i +10370|839|F|112585.48|1994-04-28|4-NOT SPECIFIED|Clerk#000000084|0|thrash. accounts boost never quickly final ac +10371|1022|F|204611.98|1994-09-17|2-HIGH|Clerk#000000231|0|nding requests. ideas af +10372|1241|O|101993.71|1995-06-28|4-NOT SPECIFIED|Clerk#000000276|0|sleep after the carefully ironic platelets. regular, unusual deposits wake qui +10373|671|F|254861.41|1993-06-26|1-URGENT|Clerk#000000681|0|cajole blithely final foxes. carefully +10374|337|F|28405.59|1993-07-23|5-LOW|Clerk#000000885|0|ing courts? carefully unusual ideas +10375|814|O|55990.35|1997-01-08|2-HIGH|Clerk#000000384|0|ending deposits. special, regular tith +10400|230|O|214820.02|1996-10-24|2-HIGH|Clerk#000000375|0|cing accounts sleep slyly regu +10401|1405|O|15159.38|1998-07-20|4-NOT SPECIFIED|Clerk#000000351|0|ts x-ray? slyly unusual a +10402|7|O|69976.43|1997-12-20|1-URGENT|Clerk#000000487|0|ing pinto beans for the carefully regular +10403|820|O|273217.58|1996-05-21|5-LOW|Clerk#000000523|0|ounts. carefully special accounts grow +10404|1255|O|148128.43|1998-03-29|1-URGENT|Clerk#000000142|0|uffy foxes about the qui +10405|929|O|156274.53|1998-01-04|4-NOT SPECIFIED|Clerk#000000343|0|uriously final dolphins. sly +10406|46|O|143470.97|1996-02-29|4-NOT SPECIFIED|Clerk#000000923|0| the slyly express deposits. deposits +10407|442|O|72476.48|1996-03-26|4-NOT SPECIFIED|Clerk#000000011|0|onic foxes. asymptotes across the ironi +10432|1231|F|167753.06|1992-01-06|5-LOW|Clerk#000000429|0|thely bold pinto bea +10433|1295|F|19194.57|1993-02-20|2-HIGH|Clerk#000000566|0|ajole blithely. furiously re +10434|781|F|63237.89|1994-12-24|2-HIGH|Clerk#000000939|0| blithely regular ideas are deposits. requests nod slyly final r +10435|1195|F|185835.34|1993-08-11|3-MEDIUM|Clerk#000000660|0|te. slyly final theodolites are after th +10436|916|F|32528.92|1995-01-03|5-LOW|Clerk#000001000|0|lthily special asymptotes. blithely pending deposits after the unusual, e +10437|305|F|64469.14|1994-08-19|1-URGENT|Clerk#000000098|0|inal requests about the regular, +10438|715|F|189906.48|1992-12-03|5-LOW|Clerk#000000148|0|tect among the blithely +10439|940|F|300103.82|1992-03-29|4-NOT SPECIFIED|Clerk#000000626|0|nal, even requests h +10464|233|F|41683.39|1994-08-11|1-URGENT|Clerk#000000752|0|e slyly after the platelets; furiously even ac +10465|79|O|289512.24|1997-04-10|4-NOT SPECIFIED|Clerk#000000791|0|ic tithes sleep carefully across the furiously ironic ideas. sl +10466|616|F|147826.40|1992-12-26|2-HIGH|Clerk#000000899|0|thely even ideas cajole quickly across the carefu +10467|1088|O|200254.31|1997-03-12|4-NOT SPECIFIED|Clerk#000000125|0|ffily unusual deposits. carefully regular asymptotes use fur +10468|574|F|50946.66|1994-12-12|2-HIGH|Clerk#000000429|0|osits wake-- quickly pending foxes alongside of the slyly even +10469|622|O|89980.03|1996-09-03|2-HIGH|Clerk#000000913|0|hely unusual, unusual accounts. furiously fi +10470|184|F|321900.81|1992-05-05|5-LOW|Clerk#000000632|0|even, ironic accounts among the bold theodolites use across the ste +10471|262|F|309852.68|1992-10-10|2-HIGH|Clerk#000000590|0|lites wake doggedly accounts. blithely final deposits sleep evenly. +10496|400|O|66825.60|1997-02-20|2-HIGH|Clerk#000000907|0|iously regular requests. furiously slow hockey players are quickly even ac +10497|119|O|103079.38|1996-06-22|3-MEDIUM|Clerk#000000423|0|ar hockey players sleep furiously until the furious +10498|1081|F|146950.27|1993-10-24|5-LOW|Clerk#000000424|0|lithely bold packages. re +10499|872|F|186269.45|1993-11-17|4-NOT SPECIFIED|Clerk#000000065|0|es haggle slyly even instructions. ironica +10500|998|F|26808.34|1994-01-24|2-HIGH|Clerk#000000179|0| packages wake quickly pearls. slyly even deposits haggle blithe +10501|911|O|227512.69|1998-07-03|3-MEDIUM|Clerk#000000977|0|equests. packages nag slyly. quickly even accounts toward the ironic +10502|1462|F|177583.01|1993-05-15|4-NOT SPECIFIED|Clerk#000000530|0|tructions alongside of the blithely bold foxes could have to sleep slyly a +10503|853|O|150884.39|1996-06-09|5-LOW|Clerk#000000028|0|eodolites play against the pending accounts. special packages are slyly ab +10528|166|F|127054.41|1994-09-14|3-MEDIUM|Clerk#000000724|0|press pinto beans. express theodolites do cajole furiously. slyly f +10529|692|O|141709.31|1997-10-18|1-URGENT|Clerk#000000573|0|yly. doggedly final epitaphs haggle among the flu +10530|1276|F|120484.95|1994-01-28|3-MEDIUM|Clerk#000000879|0|ounts. blithely unus +10531|55|F|176261.61|1992-03-19|2-HIGH|Clerk#000000021|0|regular somas. fluffily special instructions doze blithely. quick +10532|1337|O|318050.97|1997-11-28|5-LOW|Clerk#000000805|0|ly slyly bold accounts. carefully express theodolites nag +10533|961|O|186070.73|1998-05-01|3-MEDIUM|Clerk#000000778|0| nag busily bold dependencies. special, ironic p +10534|1070|F|4438.69|1993-04-19|4-NOT SPECIFIED|Clerk#000000973|0|ly according to the slyly r +10535|1225|O|249751.99|1995-05-28|5-LOW|Clerk#000000967|0|lyly unusual frets nag alongsi +10560|91|O|185333.40|1997-07-29|1-URGENT|Clerk#000000157|0|lar requests among the blithely regular packages doze unusual requests; +10561|718|O|219244.25|1997-04-27|5-LOW|Clerk#000000435|0|r requests. even, even deposits b +10562|1246|F|297373.68|1994-11-12|4-NOT SPECIFIED|Clerk#000000034|0|ests across the courts print r +10563|2|F|143707.70|1993-09-30|1-URGENT|Clerk#000000889|0|etect after the pending requests. packa +10564|1019|O|77547.24|1996-03-14|4-NOT SPECIFIED|Clerk#000000362|0|ests. final, express foxes are slyly regular ideas. darin +10565|613|O|138255.60|1997-08-17|1-URGENT|Clerk#000000126|0| slyly unusual deposits after the carefully +10566|578|O|220319.71|1995-08-20|4-NOT SPECIFIED|Clerk#000000541|0|s sleep blithely permanently even ideas. bl +10567|328|F|104838.06|1992-03-30|2-HIGH|Clerk#000000046|0|y even pinto beans cajole bold instructions. carefully sly wate +10592|778|O|84645.88|1995-11-04|2-HIGH|Clerk#000000435|0|as-- ironic packages +10593|1123|F|160662.68|1992-02-13|2-HIGH|Clerk#000000573|0|excuses after the fina +10594|214|O|6650.94|1996-03-21|3-MEDIUM|Clerk#000000126|0|ly express asymptotes against th +10595|818|O|23233.65|1997-11-22|3-MEDIUM|Clerk#000000425|0|gular excuses. slowly ca +10596|308|O|106243.04|1997-03-31|5-LOW|Clerk#000000662|0|oss the furiously regular theodolit +10597|619|O|67904.94|1996-09-13|2-HIGH|Clerk#000000040|0|ch. bold ideas about the deposits wake fluffily +10598|461|F|19331.61|1992-03-08|4-NOT SPECIFIED|Clerk#000000682|0|e among the fluffily regular deposits. slyly final requests haggle furious +10599|194|O|142776.50|1997-07-21|4-NOT SPECIFIED|Clerk#000000559|0|ly regular requests wake regular instructions. pending, pending dolphins +10624|1288|F|192178.14|1994-12-21|1-URGENT|Clerk#000000666|0|re furiously along the slyly final ideas. carefu +10625|259|O|233381.66|1996-01-30|1-URGENT|Clerk#000000688|0|. pending deposits above the car +10626|997|O|19103.82|1995-12-14|3-MEDIUM|Clerk#000000656|0| regular deposits cajo +10627|127|F|210497.85|1993-02-25|5-LOW|Clerk#000000236|0|s. unusual instructions are. furiously express requests a +10628|1429|O|5714.19|1998-06-28|4-NOT SPECIFIED|Clerk#000000437|0|etimes quickly final packa +10629|650|F|55072.00|1994-09-12|1-URGENT|Clerk#000000229|0|endencies wake. accounts are carefully. a +10630|313|F|143006.19|1993-02-05|3-MEDIUM|Clerk#000000607|0|iously special instruct +10631|1243|F|258430.09|1993-05-27|1-URGENT|Clerk#000000844|0|affix blithely blithely regular dinos. furiously blithe instructions ar +10656|371|O|96681.23|1995-10-25|1-URGENT|Clerk#000000233|0| accounts use never blithely bold deposits. i +10657|734|F|91096.35|1993-09-26|3-MEDIUM|Clerk#000000502|0|ts wake. bold packages cajole fluffily according to the furi +10658|1199|F|117872.35|1994-08-28|5-LOW|Clerk#000000204|0|xes cajole thinly ironic requests. theodolites +10659|397|F|290769.79|1994-05-15|1-URGENT|Clerk#000000587|0| slyly across the bold request +10660|469|O|135068.75|1998-05-01|2-HIGH|Clerk#000000352|0|onic depths? furiously +10661|179|F|90250.70|1994-01-24|4-NOT SPECIFIED|Clerk#000000986|0| about the final foxes. eve +10662|1420|P|157252.72|1995-05-13|5-LOW|Clerk#000000241|0|tain blithely quickly regular pinto beans. furiously bold deposits +10663|317|F|153682.58|1994-05-24|2-HIGH|Clerk#000000137|0|s above the furiously final foxes nag idly requests. caref +10688|4|F|43453.24|1992-05-13|3-MEDIUM|Clerk#000000226|0|ly ironic instructions lose quickly alongside of the carefully +10689|203|O|99242.62|1996-07-23|5-LOW|Clerk#000000436|0|usly. furiously ironic instructions wak +10690|103|O|54775.41|1997-12-15|5-LOW|Clerk#000000041|0|ltipliers cajole slyly busy accounts. express theodolites af +10691|664|F|87254.45|1995-03-14|3-MEDIUM|Clerk#000000536|0|al decoys among the carefull +10692|187|F|158201.74|1994-07-27|5-LOW|Clerk#000000832|0|orbits. asymptotes cajole. furiously eve +10693|1030|F|43518.47|1995-04-17|4-NOT SPECIFIED|Clerk#000000797|0|s. slyly regular accounts are among the slyly regular sentiments. +10694|1423|O|183151.32|1997-12-05|2-HIGH|Clerk#000000812|0|olites. quickly bold package +10695|1456|P|93566.64|1995-05-03|2-HIGH|Clerk#000000039|0| asymptotes. quickly unus +10720|736|O|89368.05|1998-03-31|2-HIGH|Clerk#000000597|0|ccounts sleep bold, even theodol +10721|781|O|107381.35|1996-02-27|5-LOW|Clerk#000000599|0|haggle slyly blithely even instructions. quickly even dolphins wa +10722|79|F|218680.31|1995-01-20|4-NOT SPECIFIED|Clerk#000000743|0|ding instructions print. f +10723|1040|O|69126.13|1998-05-21|3-MEDIUM|Clerk#000000144|0| bold accounts. carefully busy platelets sleep fluffily. spe +10724|1492|F|215958.98|1994-09-14|2-HIGH|Clerk#000000165|0|furiously regular dolphins. regular foxes along the daringly express +10725|1444|O|77193.41|1998-04-09|5-LOW|Clerk#000000505|0| carefully unusual sauternes after the fluffily regular foxes use pending, +10726|164|F|215356.45|1993-04-25|4-NOT SPECIFIED|Clerk#000000210|0| regular dependencies. quickly spe +10727|496|F|311532.26|1992-08-05|5-LOW|Clerk#000000396|0|nusual pinto beans. special, pending requests breach slyly fina +10752|199|O|223930.05|1995-09-11|1-URGENT|Clerk#000000610|0|ic accounts. carefully ironic courts against the caref +10753|1430|F|20768.66|1994-05-02|1-URGENT|Clerk#000000218|0|ously ironic packag +10754|1061|F|229997.58|1993-03-18|5-LOW|Clerk#000000827|0|r pinto beans sleep even +10755|1435|F|132981.98|1993-07-15|1-URGENT|Clerk#000000257|0|se furiously excuses. always unusual packages above the furiously unusual de +10756|1087|F|40769.85|1992-04-15|2-HIGH|Clerk#000000994|0| even, express platelets nag above +10757|128|O|92703.05|1998-06-06|4-NOT SPECIFIED|Clerk#000001000|0|patterns haggle quickly across the bravely +10758|368|O|136484.05|1996-11-15|2-HIGH|Clerk#000000209|0|es. pinto beans sleep carefully final +10759|34|O|54534.36|1996-09-22|4-NOT SPECIFIED|Clerk#000000258|0| boost evenly final pinto beans. +10784|1396|F|184632.93|1993-07-06|4-NOT SPECIFIED|Clerk#000000982|0|en packages sleep. final foxes detec +10785|148|F|1508.63|1992-06-26|3-MEDIUM|Clerk#000000948|0|iously unusual packages use quickly furiously +10786|154|O|70962.05|1995-08-06|3-MEDIUM|Clerk#000000705|0| ironic, special theodolites caj +10787|1117|O|372954.40|1997-02-12|2-HIGH|Clerk#000000133|0|ckages could have to wake blithely above the final requests. furiously +10788|4|O|147767.08|1997-01-15|3-MEDIUM|Clerk#000000905|0|esides the slyly ironic dependencies. ironic foxes cajole fur +10789|1378|F|93918.24|1993-08-24|4-NOT SPECIFIED|Clerk#000000463|0|s unwind blithely agains +10790|113|F|77512.26|1994-12-15|5-LOW|Clerk#000000381|0|ly alongside of the express, regular foxes. req +10791|319|O|173850.27|1995-08-20|4-NOT SPECIFIED|Clerk#000000131|0|efully special pinto beans dazzle fluffily according to the express, silen +10816|1303|O|45628.88|1996-01-11|2-HIGH|Clerk#000000003|0|after the final, spe +10817|712|O|213714.56|1996-12-09|1-URGENT|Clerk#000000852|0|final ideas across the +10818|157|O|245383.91|1998-05-07|2-HIGH|Clerk#000000735|0|ids nag carefully against the final deposit +10819|571|F|79971.29|1993-08-25|1-URGENT|Clerk#000000144|0|ncies use furiously alongside of the fluffily final instructions. quickly re +10820|661|O|220224.56|1995-12-28|4-NOT SPECIFIED|Clerk#000000630|0|ecial ideas. silently unusual somas are blith +10821|590|O|179780.96|1996-05-13|2-HIGH|Clerk#000000856|0| the furiously final excuses. blithely final pack +10822|1186|F|19208.70|1993-12-01|5-LOW|Clerk#000000046|0|hely regular requests. carefully silent instructions use slyly f +10823|391|F|109958.79|1992-06-13|5-LOW|Clerk#000000869|0|blithely boldly pending deposits. silent hockey players acros +10848|841|O|67233.17|1996-10-26|3-MEDIUM|Clerk#000000131|0| according to the boldly final accounts. slyly bold asymptotes detect qui +10849|56|O|309269.38|1997-01-31|1-URGENT|Clerk#000000279|0|y even requests. blithely silent theodolites cajole carefully ev +10850|1052|O|78474.67|1996-09-23|2-HIGH|Clerk#000000055|0|its cajole quickly. permanently even pinto beans dazz +10851|1201|F|256653.25|1994-04-07|2-HIGH|Clerk#000000841|0|ffix blithely blithely even dugouts? quickly re +10852|559|F|290873.68|1993-10-27|2-HIGH|Clerk#000000623|0|oxes. carefully final pinto be +10853|275|F|68787.35|1994-01-06|4-NOT SPECIFIED|Clerk#000000276|0|ronic dugouts wake s +10854|917|O|4885.38|1998-06-20|2-HIGH|Clerk#000000219|0|old, ironic dependencies. fluffily bold excuses shall have to integrate amon +10855|608|O|227086.67|1997-07-16|1-URGENT|Clerk#000000149|0|fully unusual pinto beans sleep sl +10880|278|F|40046.10|1992-05-23|4-NOT SPECIFIED|Clerk#000000553|0|e furiously bold deposits. slyly spe +10881|1001|F|235385.68|1994-02-16|1-URGENT|Clerk#000000872|0|quickly final pinto beans engage quickly pending, final +10882|1462|O|103982.52|1998-06-02|5-LOW|Clerk#000000949|0|gouts sleep fluffily according to the dep +10883|226|O|118687.62|1998-02-03|5-LOW|Clerk#000000759|0|sly silent accounts. carefully express pinto bean +10884|749|F|193592.93|1994-11-26|5-LOW|Clerk#000000802|0| express, regular accounts nag furiously! platele +10885|991|O|253167.35|1998-04-18|5-LOW|Clerk#000000893|0|thely ironic accounts sleep carefully depo +10886|1312|F|275313.31|1994-08-24|1-URGENT|Clerk#000000422|0|along the final epitaphs dazzle carefull +10887|436|O|50293.15|1995-05-26|4-NOT SPECIFIED|Clerk#000000575|0|ag against the dependencies. furiously regular foxes sleep fu +10912|293|O|243339.25|1996-12-25|1-URGENT|Clerk#000000579|0|odolites wake sometimes on the unusual deposits. epitaphs cajole b +10913|514|F|125458.51|1993-02-07|5-LOW|Clerk#000000114|0|ches are blithely around t +10914|689|F|213268.60|1995-01-23|4-NOT SPECIFIED|Clerk#000000582|0| quickly regular packages above the furiously bold pl +10915|1357|F|178357.32|1993-11-11|5-LOW|Clerk#000000649|0|bold packages nag. furiously regular excu +10916|328|P|253026.49|1995-03-11|3-MEDIUM|Clerk#000000047|0|pinto beans cajole furiously according to the dependencies. fi +10917|251|F|127026.23|1992-02-11|1-URGENT|Clerk#000000078|0|beans across the regular theodolites affix silent instructions. even deposits +10918|1030|O|80094.04|1995-10-16|3-MEDIUM|Clerk#000000874|0|structions. ironic, express dep +10919|1339|F|56302.36|1993-03-28|2-HIGH|Clerk#000000180|0|press requests haggle blithely. blithely +10944|319|O|129953.86|1995-11-13|2-HIGH|Clerk#000000077|0|ily unusual requests. special instruct +10945|248|F|168422.71|1992-01-04|3-MEDIUM|Clerk#000000296|0|ages are. final, silent deposits haggle quickly! ironic +10946|1147|O|332313.82|1997-03-22|3-MEDIUM|Clerk#000000975|0|nal deposits detect among the quickly +10947|1070|O|135370.80|1996-01-07|2-HIGH|Clerk#000000347|0|ar excuses x-ray fluffily a +10948|670|F|223943.13|1992-08-14|3-MEDIUM|Clerk#000000489|0|nic grouches detect stealthily fluffily even de +10949|331|F|112812.10|1994-03-31|3-MEDIUM|Clerk#000000874|0|luffily even grouches. regular notornis against the sl +10950|767|O|37856.60|1997-06-11|3-MEDIUM|Clerk#000000015|0|y carefully pending packages. silent accounts nod careful +10951|1159|F|175198.95|1992-11-07|4-NOT SPECIFIED|Clerk#000000619|0|dependencies. sometimes pending foxes cajole. quickly +10976|685|F|186488.10|1992-10-02|4-NOT SPECIFIED|Clerk#000000282|0| deposits: brave, ironic packages maintain fluffily about the regular +10977|757|O|99211.94|1998-06-04|2-HIGH|Clerk#000000089|0|rious accounts about the regular excuses wake ironically special r +10978|1346|F|106794.18|1994-04-02|1-URGENT|Clerk#000000546|0|cial multipliers wake pending, pending theodolites: blithe +10979|1267|O|166156.36|1995-10-05|3-MEDIUM|Clerk#000000527|0|ans cajole carefully. regular pinto be +10980|754|O|75950.23|1996-07-29|4-NOT SPECIFIED|Clerk#000000818|0| ironic, stealthy patterns detect +10981|919|F|235684.93|1993-05-15|2-HIGH|Clerk#000000341|0|ly bold attainments nag! furiously special acco +10982|739|F|199304.65|1992-12-11|4-NOT SPECIFIED|Clerk#000000481|0|tithes use slyly silent, unusual a +10983|599|O|106734.94|1997-02-06|1-URGENT|Clerk#000000299|0|sts sleep of the regular foxes. permanent re +11008|523|F|222231.62|1994-02-25|1-URGENT|Clerk#000000927|0|ickly regular deposits detect fluffily: caref +11009|1303|O|65554.60|1997-03-05|3-MEDIUM|Clerk#000000515|0|deposits are blithely furio +11010|440|O|163532.15|1997-03-22|4-NOT SPECIFIED|Clerk#000000659|0|ithely-- express, final ideas sleep slyly to the blithely express reque +11011|14|F|248409.17|1992-05-14|2-HIGH|Clerk#000000948|0|luffily even warhors +11012|1420|O|114085.80|1998-04-07|1-URGENT|Clerk#000000771|0|ze fluffily quickly sly excuses. quickly pending frays haggle accordin +11013|395|F|2591.65|1994-04-18|2-HIGH|Clerk#000000759|0|ng deposits nag. special deposits sublate furio +11014|319|F|150733.48|1993-09-08|2-HIGH|Clerk#000000934|0|yly regular depths. re +11015|514|O|132711.70|1997-09-16|5-LOW|Clerk#000000216|0|its cajole against the unusual ideas? sly deposits boost fluffily. furiously +11040|82|O|211495.01|1995-10-24|4-NOT SPECIFIED|Clerk#000000003|0|arefully pending dolphins print brave +11041|1306|O|128785.82|1997-03-30|4-NOT SPECIFIED|Clerk#000000892|0|instructions. blithely pending packages solve of the furiously ironic requests +11042|857|O|223492.72|1998-05-07|4-NOT SPECIFIED|Clerk#000000677|0|ccounts. quickly unusual pinto beans nag enticingly a +11043|820|F|102166.94|1995-02-20|1-URGENT|Clerk#000000196|0|dolphins. accounts are f +11044|164|F|68884.04|1992-06-25|3-MEDIUM|Clerk#000000861|0|he deposits hinder above the furiously express excuses. silent depo +11045|556|F|226703.02|1992-03-26|3-MEDIUM|Clerk#000000216|0|uriously ironic asy +11046|1411|O|337558.78|1997-06-17|5-LOW|Clerk#000000454|0|lly special theodolites use furiously. carefully +11047|175|F|70365.24|1993-12-11|5-LOW|Clerk#000000223|0|. pending accounts alongside o +11072|265|O|207339.71|1996-07-14|2-HIGH|Clerk#000000804|0|osits: pending requests sleep quietly silently unusual deposits. special fo +11073|548|F|177610.35|1994-12-02|4-NOT SPECIFIED|Clerk#000000009|0|ing deposits-- slyly express dolphins detect fluffily ironic dep +11074|709|O|302642.18|1995-06-10|2-HIGH|Clerk#000000449|0|t the special asymptotes. furiously even dolphins sleep quickly ir +11075|1244|O|215012.92|1996-03-05|5-LOW|Clerk#000000379|0|efully furiously special pinto beans. fluffily unusual acc +11076|1012|F|54498.05|1994-08-18|1-URGENT|Clerk#000000361|0|lyly special notornis. bold requests haggle careful +11077|610|F|76484.04|1994-03-21|5-LOW|Clerk#000000024|0|gularly pending deposits. quick +11078|1301|F|103896.23|1992-05-28|2-HIGH|Clerk#000000227|0|ag. ironic, unusual accounts nag fluffily across the ironic, final ideas. car +11079|218|O|98046.49|1997-08-11|3-MEDIUM|Clerk#000000507|0|tainments affix doggedly slyly special asymptotes. +11104|1315|O|51132.08|1998-07-07|4-NOT SPECIFIED|Clerk#000000062|0|s cajole slyly alon +11105|1124|O|20773.48|1995-11-30|4-NOT SPECIFIED|Clerk#000000769|0|blithely about the closely silent foxes. blithely r +11106|1175|P|59390.31|1995-04-01|2-HIGH|Clerk#000000828|0|fter the quickly bold theodolites are blithely across +11107|445|O|64188.60|1995-10-24|5-LOW|Clerk#000000896|0|ymptotes. escapades use slyly? slyly b +11108|1186|F|238113.15|1992-08-17|4-NOT SPECIFIED|Clerk#000000137|0|ond the carefully unusual courts. regul +11109|664|F|5341.59|1995-03-16|3-MEDIUM|Clerk#000000578|0|. silent platelets haggle slyly. quickly ironic asymptotes +11110|757|O|153722.23|1996-06-23|4-NOT SPECIFIED|Clerk#000000243|0|es are quickly alongside of the spe +11111|631|F|121957.72|1995-01-18|3-MEDIUM|Clerk#000000301|0|nic deposits affix quickly regula +11136|1313|F|60530.16|1993-11-14|4-NOT SPECIFIED|Clerk#000000987|0|ular foxes haggle against the unusual frays. i +11137|668|F|204264.90|1992-11-30|2-HIGH|Clerk#000000515|0|bout the final accounts. regular ideas cajole slyly. blithely sly d +11138|181|F|162678.89|1995-02-27|4-NOT SPECIFIED|Clerk#000000983|0|d platelets. carefully ironic packages alongside of the carefully +11139|883|O|115264.28|1998-05-17|5-LOW|Clerk#000000891|0|the furiously silent i +11140|988|O|194048.42|1997-07-26|1-URGENT|Clerk#000000117|0|. fluffily busy sauternes cajole slyly above the quickly express excuses. exp +11141|1030|O|72800.37|1998-01-17|1-URGENT|Clerk#000000084|0|ckages. carefully regul +11142|1375|O|395039.05|1997-10-03|4-NOT SPECIFIED|Clerk#000000457|0| even accounts sublate carefully +11143|97|F|172537.11|1992-11-27|5-LOW|Clerk#000000613|0|unusual instructions. q +11168|1441|F|74602.03|1992-10-22|1-URGENT|Clerk#000000585|0|es. even patterns use fluff +11169|1222|F|121781.45|1993-05-22|3-MEDIUM|Clerk#000000536|0|eodolites wake. fluffily express packages +11170|736|O|152992.55|1997-07-30|1-URGENT|Clerk#000000832|0|eyond the furiously regular pinto beans. car +11171|730|O|104672.68|1995-07-17|1-URGENT|Clerk#000000792|0|l deposits promise according to the express deposits. fluffily final r +11172|1076|O|166824.37|1997-12-30|1-URGENT|Clerk#000000187|0|ructions. furiously pending dependencies wake. deposits +11173|319|F|179045.62|1992-03-31|1-URGENT|Clerk#000000815|0|e ironically silent deposits wake blithely across the regular instructions +11174|1315|F|149433.95|1994-04-10|3-MEDIUM|Clerk#000000321|0|se about the pending, special decoys-- fluffily express +11175|1421|O|44114.12|1998-02-26|2-HIGH|Clerk#000000812|0| slyly even deposits are blithely; packages integrate furiously. bravely ironi +11200|956|O|113819.40|1997-02-07|1-URGENT|Clerk#000000417|0|ajole. silent requests boost carefully blithely thin multiplier +11201|632|O|3297.46|1996-12-08|3-MEDIUM|Clerk#000000746|0|ns cajole after the pending pinto beans. carefully ironic requests wake r +11202|1168|F|157836.48|1992-03-18|3-MEDIUM|Clerk#000000614|0|wake daringly. carefully regular account +11203|1498|O|84795.43|1996-06-15|2-HIGH|Clerk#000000010|0|al instructions haggle slyly. fu +11204|1249|O|29604.53|1998-07-25|2-HIGH|Clerk#000000752|0| express requests. slyly special packages cajole fluffily; quickly ironi +11205|1294|O|93334.58|1996-09-15|1-URGENT|Clerk#000000800|0|ckages. furiously final packages ac +11206|379|F|209373.08|1994-12-29|5-LOW|Clerk#000000139|0|ending packages cajole busily. slyly +11207|1213|O|84129.92|1996-04-03|2-HIGH|Clerk#000000354|0|ress accounts haggle permanently about the furiously unusua +11232|661|O|77549.43|1996-02-01|1-URGENT|Clerk#000000676|0|fully regular accounts. final, unusual deposits sleep eve +11233|680|O|96728.84|1995-08-31|4-NOT SPECIFIED|Clerk#000000820|0|lphins. carefully ironic ideas use after the quickly unusual a +11234|1153|F|117092.84|1993-03-01|4-NOT SPECIFIED|Clerk#000000291|0|e slyly across the carefully even requests. slyly +11235|590|O|278256.83|1996-04-03|4-NOT SPECIFIED|Clerk#000000495|0|ackages solve carefully furiously final accounts. fluf +11236|223|F|210654.72|1993-10-31|2-HIGH|Clerk#000000792|0|ess pinto beans. foxes b +11237|1423|O|155158.38|1996-06-16|4-NOT SPECIFIED|Clerk#000000627|0|e the carefully special ideas inte +11238|535|O|126764.00|1996-07-23|1-URGENT|Clerk#000000809|0|gular foxes run after the even instructions. regular instructions wake. unu +11239|475|F|310241.51|1992-02-10|1-URGENT|Clerk#000000240|0|e regular, even excuses. +11264|676|O|152483.91|1996-09-02|4-NOT SPECIFIED|Clerk#000000227|0|usly silent deposits. carefully unusual asymptotes ha +11265|905|O|88998.81|1997-05-20|3-MEDIUM|Clerk#000000427|0|ias. carefully pending platel +11266|292|O|13609.27|1997-08-10|4-NOT SPECIFIED|Clerk#000000315|0|lets nag about the carefully special packages. ironic sheaves +11267|548|F|45572.31|1992-02-15|5-LOW|Clerk#000000096|0| wake slyly even deposits. c +11268|43|O|189596.87|1998-06-30|1-URGENT|Clerk#000000130|0|ptotes are blithely slyly silen +11269|199|F|256118.53|1992-05-27|5-LOW|Clerk#000000752|0|ath the decoys. final excuses must have to wake. ironic asymptotes wake q +11270|160|O|197781.66|1995-07-01|2-HIGH|Clerk#000000757|0|ily pending theodolites a +11271|745|O|255335.88|1995-10-19|2-HIGH|Clerk#000000144|0|sts. furiously ironic foxes wake ca +11296|832|F|378166.33|1992-01-10|1-URGENT|Clerk#000000966|0|s-- ironic, unusual requests haggle furiously. carefully special depend +11297|694|F|109722.85|1993-01-09|4-NOT SPECIFIED|Clerk#000000247|0|hely. express escapades kindle blithely. even requests wake +11298|805|O|228663.94|1998-01-03|2-HIGH|Clerk#000000160|0| blithely express ideas sleep slyly ruthl +11299|50|F|253114.92|1993-11-13|4-NOT SPECIFIED|Clerk#000000885|0|ns haggle bravely alongside of the fluffily express requests. +11300|346|O|77247.48|1996-07-10|5-LOW|Clerk#000000697|0|he final platelets. blithely even theodolites along the car +11301|1358|F|191271.29|1992-03-23|3-MEDIUM|Clerk#000000321|0|hes detect fluffily ironic requests. deposits br +11302|451|F|243997.09|1994-03-02|5-LOW|Clerk#000000492|0|. never ironic requests sleep furiousl +11303|388|F|92968.88|1992-03-30|5-LOW|Clerk#000000788|0|he slyly pending requests. final deposits +11328|466|F|18702.67|1992-03-21|1-URGENT|Clerk#000000101|0|theodolites. blithely pending accounts above the carefully +11329|1285|O|272307.07|1995-08-05|1-URGENT|Clerk#000000903|0|on the daringly express instructions. fluf +11330|281|F|3817.37|1992-03-28|5-LOW|Clerk#000000429|0|he slyly ironic ideas are q +11331|179|O|18118.60|1996-01-21|3-MEDIUM|Clerk#000000616|0|platelets wake carefully ruthless requests. silent deposits believe +11332|422|F|213792.99|1994-11-17|5-LOW|Clerk#000000572|0|o the unusual foxes-- ironic requests wake slyly enticingly re +11333|103|F|15730.53|1994-06-10|2-HIGH|Clerk#000000914|0|excuses cajole blithely against the slyly express r +11334|245|O|343561.63|1997-07-29|3-MEDIUM|Clerk#000000843|0|ronic deposits haggle fu +11335|871|F|133549.00|1994-10-22|2-HIGH|Clerk#000000669|0|ealms. theodolites maintain. regular, even instructions against t +11360|886|O|67314.59|1997-09-07|1-URGENT|Clerk#000000561|0|. slyly regular deposits lose +11361|442|F|251600.98|1994-09-28|1-URGENT|Clerk#000000345|0| final requests boost never pinto beans. special accounts are slyly unusual t +11362|1042|F|250063.55|1992-09-11|5-LOW|Clerk#000000922|0|ly blithe deposits cajole blithely slyly silent deposits. regular +11363|1358|O|163511.72|1998-02-09|5-LOW|Clerk#000000844|0| silent pinto beans haggle al +11364|163|O|107551.91|1997-03-11|1-URGENT|Clerk#000000582|0|sts wake fluffily about the slyly special accounts. qu +11365|1214|O|211938.69|1997-08-29|3-MEDIUM|Clerk#000000520|0|de of the blithely final requests. fluffily regular dolphin +11366|863|F|12711.31|1992-06-08|3-MEDIUM|Clerk#000000993|0|lites nag blithely un +11367|418|F|18148.48|1994-12-17|1-URGENT|Clerk#000000566|0| carefully regular deposits. bold theodolites haggle. enticingly final fo +11392|1340|F|135223.44|1994-09-06|5-LOW|Clerk#000000607|0|tect blithely across the express dependencies. instructions after the slyly re +11393|1150|F|138539.25|1992-03-19|5-LOW|Clerk#000000022|0|al packages. carefully speci +11394|1255|O|181795.18|1998-03-06|2-HIGH|Clerk#000000559|0| deposits! fluffily sp +11395|940|O|46826.01|1997-08-26|1-URGENT|Clerk#000000306|0|beans nag carefully even sentiments-- express platelets +11396|1273|F|107605.76|1992-07-22|1-URGENT|Clerk#000000265|0|ously regular accounts haggle +11397|757|O|55531.65|1996-10-29|5-LOW|Clerk#000000603|0|oss the regular pac +11398|587|F|258130.52|1992-08-07|2-HIGH|Clerk#000000407|0|f the theodolites are fu +11399|346|F|39653.25|1994-04-19|5-LOW|Clerk#000000460|0|ffily furiously even pa +11424|343|F|58887.47|1993-04-03|4-NOT SPECIFIED|Clerk#000000547|0|s. quickly final requests around the slyly unusual dependencies cajol +11425|1123|O|156058.42|1995-06-23|1-URGENT|Clerk#000000336|0|arefully special requests cajole bravely fluffy pinto beans. ironic +11426|1357|F|94572.71|1994-05-08|3-MEDIUM|Clerk#000000066|0|ilent notornis boost blithely quickly even pinto beans. carefully speci +11427|427|F|306906.43|1993-11-25|3-MEDIUM|Clerk#000000401|0|y slyly brave excuses. slow packages sleep quickl +11428|628|F|7046.94|1992-01-22|3-MEDIUM|Clerk#000000926|0|ep slyly even, unusual packages. spe +11429|1192|F|145545.35|1993-03-04|5-LOW|Clerk#000000765|0| bold courts sleep blithely. regular, even r +11430|1342|O|3641.35|1998-01-05|5-LOW|Clerk#000000817|0|tions breach. regular, express pinto beans wake across the carefully +11431|10|F|230289.60|1992-08-02|2-HIGH|Clerk#000000055|0|press ideas use slyly regular pinto beans. furiously +11456|271|F|53466.58|1993-04-13|5-LOW|Clerk#000000209|0|ar foxes against the quickly special th +11457|1430|O|232660.01|1995-12-14|1-URGENT|Clerk#000000294|0|the slyly quiet ideas. idly final deposits nag. carefully regu +11458|1468|O|201085.02|1998-04-02|5-LOW|Clerk#000000402|0|l pinto beans cajole carefully +11459|325|O|230925.13|1996-07-15|4-NOT SPECIFIED|Clerk#000000852|0|ular requests use blithely. quickly special packages boost furiously. deposits +11460|763|F|51498.95|1993-08-25|2-HIGH|Clerk#000000014|0| brave dependencies nag. blithely final foxe +11461|1049|O|80204.90|1996-05-01|1-URGENT|Clerk#000000630|0|ymptotes. packages haggle whithout the evenly final requests. req +11462|226|O|164290.80|1996-08-25|2-HIGH|Clerk#000000210|0|grouches. closely dogged deposits sleep. special, pending packages slee +11463|140|O|258622.38|1997-12-28|3-MEDIUM|Clerk#000000886|0|ular deposits. slyly final attainments detect careful +11488|751|F|92903.96|1993-08-23|4-NOT SPECIFIED|Clerk#000000119|0|ickly final requests. furiously even attainments sleep fluffily slyly regu +11489|929|O|100935.67|1996-09-19|4-NOT SPECIFIED|Clerk#000000155|0|ions. ironic foxes wake. regular platelets cajole slyly close +11490|745|O|66256.76|1996-09-27|1-URGENT|Clerk#000000489|0|quests affix according to the special p +11491|158|F|242695.19|1993-08-18|5-LOW|Clerk#000000329|0|cial foxes across the final packag +11492|478|O|141195.82|1997-03-06|2-HIGH|Clerk#000000708|0|ely regular instructions was fluffily among the fluffil +11493|1486|O|63852.92|1995-10-21|1-URGENT|Clerk#000000543|0|e blithely regular accounts +11494|1484|O|90512.73|1997-07-20|3-MEDIUM|Clerk#000000486|0|s. blithely unusual pi +11495|1048|O|43956.73|1995-07-05|2-HIGH|Clerk#000000684|0|y bold accounts cajo +11520|1217|F|111920.94|1994-09-28|3-MEDIUM|Clerk#000000106|0|courts. carefully final requests along the carefully final +11521|55|O|19730.00|1996-09-09|1-URGENT|Clerk#000000010|0| express platelets according to the iro +11522|47|F|21454.81|1993-09-16|5-LOW|Clerk#000000121|0|ual foxes x-ray carefully alo +11523|355|O|210039.66|1998-07-27|4-NOT SPECIFIED|Clerk#000000008|0|y: fluffily regular instructions sleep quickly enticing orbits. carefully un +11524|766|O|7445.25|1995-12-14|5-LOW|Clerk#000000943|0|encies. foxes detect around the final, even theodolites. special depos +11525|1495|O|169021.86|1997-03-20|1-URGENT|Clerk#000000159|0|ong the ironic accounts are slyly furiously pending dependencies. even exc +11526|466|O|124012.92|1998-02-23|5-LOW|Clerk#000000798|0|ickly regular packages use slyly ironic, +11527|1108|F|46961.88|1994-07-03|3-MEDIUM|Clerk#000000187|0|ously final packages was slyly above the bli +11552|1421|F|34742.82|1992-12-15|1-URGENT|Clerk#000000960|0|g, dogged notornis. carefully even instructions across the furiou +11553|196|F|207629.22|1994-04-19|3-MEDIUM|Clerk#000000467|0|s thrash blithely carefully ironic requests. quickl +11554|344|O|269777.97|1998-06-07|2-HIGH|Clerk#000000746|0| platelets are fluffily above the ironic theodolites. slyly pending +11555|1318|O|242411.22|1996-05-26|3-MEDIUM|Clerk#000000308|0|hinly bold deposits detect along the courts. express theodo +11556|707|O|237841.53|1996-03-03|5-LOW|Clerk#000000790|0|around the furiously ironic courts. blithely unusual deposits cajo +11557|1412|O|39415.83|1997-04-12|5-LOW|Clerk#000000522|0|ily. fluffily dogged asymptotes wake slyly regular grouches. a +11558|61|F|47438.62|1994-03-28|2-HIGH|Clerk#000000181|0| the slyly final excuses. +11559|931|O|54171.71|1995-09-26|1-URGENT|Clerk#000000582|0| pending excuses; carefully final dependencies +11584|643|F|350276.97|1994-11-23|3-MEDIUM|Clerk#000000150|0|l pinto beans haggle bold packages. fina +11585|895|F|59671.89|1994-03-16|3-MEDIUM|Clerk#000000105|0|g to the slyly unusual deposits. bold, final requests boost f +11586|1013|F|24377.52|1993-11-17|4-NOT SPECIFIED|Clerk#000000180|0|ously special packages solve carefully above th +11587|220|O|149730.78|1998-03-05|4-NOT SPECIFIED|Clerk#000000103|0| the slyly regular platelets. silently final packages may nag. foxes accordi +11588|1396|O|187668.87|1997-10-30|5-LOW|Clerk#000000492|0|ep. final, even excuses dazzle about the carefully special req +11589|1315|F|106954.20|1992-05-19|4-NOT SPECIFIED|Clerk#000000420|0|y express foxes shall have to cajole about the quickly unusu +11590|883|O|251411.55|1996-04-15|2-HIGH|Clerk#000000744|0|dolites sleep across the carefully regular depo +11591|269|F|108716.86|1993-01-21|2-HIGH|Clerk#000000691|0|pinto beans. bold deposits a +11616|403|O|261053.80|1996-08-02|2-HIGH|Clerk#000000003|0|cording to the express +11617|1459|F|186543.96|1994-12-11|4-NOT SPECIFIED|Clerk#000000519|0|etect blithely pending +11618|356|O|126867.40|1998-02-04|1-URGENT|Clerk#000000594|0|s kindle fluffily after +11619|55|O|42866.58|1998-07-12|2-HIGH|Clerk#000000245|0|ress instructions. ideas solve carefully special requests. patterns p +11620|353|O|115080.33|1997-07-22|4-NOT SPECIFIED|Clerk#000000961|0|ies nag slyly along +11621|964|O|233849.43|1995-11-11|5-LOW|Clerk#000000316|0|pinto beans. ruthless pinto beans haggle. slyly regular +11622|349|O|169440.18|1996-04-27|4-NOT SPECIFIED|Clerk#000000006|0| never instructions. express Tiresias boost. unusual, even pinto bean +11623|715|O|335923.49|1995-12-16|2-HIGH|Clerk#000000827|0|atelets cajole quietly final requests. slyly final courts are ironic, final +11648|949|P|223995.17|1995-04-10|5-LOW|Clerk#000000916|0| cajole carefully alon +11649|718|O|336620.13|1996-06-30|5-LOW|Clerk#000000666|0|kly even pinto beans cajole fu +11650|667|F|153010.80|1992-09-25|4-NOT SPECIFIED|Clerk#000000444|0|ccording to the ironic, regular excuses are +11651|689|F|66834.76|1995-02-23|3-MEDIUM|Clerk#000000982|0|sly furious sheaves. regular requests c +11652|1442|O|228052.10|1995-11-11|4-NOT SPECIFIED|Clerk#000000098|0|uriously bold foxes promise among the blithely ironic packages. fluffily regu +11653|314|O|191078.29|1997-07-05|2-HIGH|Clerk#000000533|0|kages doubt according to the final theodolites. furiously regular +11654|791|F|115033.02|1993-09-28|4-NOT SPECIFIED|Clerk#000000756|0|onic waters. carefully even packages haggle f +11655|910|O|184768.86|1998-06-27|1-URGENT|Clerk#000000614|0|slyly special asymptotes. final, unusual requests engage carefully pe +11680|1187|F|288910.60|1994-09-05|3-MEDIUM|Clerk#000000731|0|pecial asymptotes. final platelets cajole among the ironic pinto beans. pla +11681|857|F|246493.05|1992-10-17|1-URGENT|Clerk#000000485|0|final packages. carefully final accounts affi +11682|5|F|153588.74|1993-07-05|5-LOW|Clerk#000000852|0|s grow slyly. express, fin +11683|209|F|183381.18|1992-02-08|4-NOT SPECIFIED|Clerk#000000583|0|to beans cajole. furiously even frets detect. unusual pinto beans are +11684|323|F|282136.80|1992-07-28|2-HIGH|Clerk#000000986|0|instructions. final, even packages throughout the epi +11685|445|O|254981.92|1997-03-19|3-MEDIUM|Clerk#000000641|0|leep slyly unusual foxes. blithely even ideas through the t +11686|1039|F|169100.57|1994-01-28|4-NOT SPECIFIED|Clerk#000000169|0|ts wake furiously. accounts about the regular ideas are furiously +11687|1025|O|182611.71|1995-12-26|2-HIGH|Clerk#000000390|0|fluffily ideas. blithely pending packages lose blithely. slyly +11712|173|F|117391.91|1994-04-27|5-LOW|Clerk#000000376|0|special excuses. final accounts use. dependencies detect by the carefu +11713|1397|F|124407.44|1993-12-25|4-NOT SPECIFIED|Clerk#000000481|0|nic packages. unusual, unusual Ti +11714|1250|F|170165.48|1994-08-05|1-URGENT|Clerk#000000877|0|sts could have to wake ironic dependencies. furiously regul +11715|863|F|67076.38|1994-09-07|2-HIGH|Clerk#000000106|0|xpress foxes. pinto beans above the express deposits are final foxes. furio +11716|481|F|178602.59|1993-10-12|3-MEDIUM|Clerk#000000021|0|sly ironic packages haggle blithely around the unusual accounts. slyly re +11717|413|O|153316.94|1998-03-19|5-LOW|Clerk#000000185|0|furiously regular waters +11718|688|F|35335.31|1994-12-19|3-MEDIUM|Clerk#000000131|0|ly regular asymptotes. decoys integrate slyly among the bo +11719|1147|F|240503.39|1995-02-06|4-NOT SPECIFIED|Clerk#000000307|0|hely slyly special instr +11744|127|O|183922.62|1996-07-05|1-URGENT|Clerk#000000197|0|pecial packages above the furio +11745|25|F|147334.29|1992-07-20|2-HIGH|Clerk#000000549|0|lar ideas. slyly expre +11746|5|O|177360.54|1998-04-29|3-MEDIUM|Clerk#000000038|0|heodolites. final asymptotes was above the furiously final pin +11747|460|F|46484.18|1993-02-26|3-MEDIUM|Clerk#000000537|0|. requests use across +11748|733|F|43216.31|1994-06-04|4-NOT SPECIFIED|Clerk#000000147|0|uffily regular accounts cajole blithely alongside of the furiously pending p +11749|818|O|75180.45|1998-02-17|5-LOW|Clerk#000000819|0| excuses boost against the final pai +11750|823|O|117385.37|1997-03-05|2-HIGH|Clerk#000000801|0| furiously packages. carefully silent instruc +11751|1282|O|150450.18|1996-05-23|1-URGENT|Clerk#000000605|0|uickly express pinto beans. blithely bold foxes use above the dep +11776|386|F|90162.21|1992-02-25|5-LOW|Clerk#000000548|0|ck theodolites integrate furiously along the bold deposits. even, pending +11777|271|F|56387.90|1994-12-26|5-LOW|Clerk#000000292|0|g dependencies; quickly dogged courts wake quick +11778|217|O|102865.25|1997-03-28|5-LOW|Clerk#000000253|0|ss the final, unusual packages. quickly quick theodolites haggle. slyl +11779|1045|F|183456.75|1993-06-30|4-NOT SPECIFIED|Clerk#000000740|0|according to the care +11780|28|F|129283.92|1993-09-22|1-URGENT|Clerk#000000793|0|ove the regular theodolites are furiously regular notornis. +11781|1484|O|147766.37|1996-04-16|5-LOW|Clerk#000000619|0|s. final, final deposi +11782|427|F|163855.06|1992-07-29|5-LOW|Clerk#000000609|0|bold, unusual requests are slyly against the quickly bold dependencies. s +11783|1498|O|22953.13|1998-04-03|1-URGENT|Clerk#000000028|0|. regular theodolites snooze furiou +11808|874|F|60831.20|1992-08-01|4-NOT SPECIFIED|Clerk#000000710|0|could detect quickly unusu +11809|556|O|161697.76|1996-04-25|2-HIGH|Clerk#000000617|0|old realms alongside of the special dugouts use along the fluffily iro +11810|647|F|77198.94|1992-04-23|1-URGENT|Clerk#000000804|0| final requests boost among the furiously bold accounts. final +11811|527|F|7385.35|1992-10-28|2-HIGH|Clerk#000000940|0| packages haggle furiously pend +11812|940|F|17214.00|1993-06-03|3-MEDIUM|Clerk#000000844|0|y regular accounts. regular, pending requests print careful +11813|376|F|211762.16|1994-02-10|1-URGENT|Clerk#000000813|0|ly regular instructions. quickly ironi +11814|121|F|198422.64|1993-01-26|2-HIGH|Clerk#000000404|0|final ideas sleep sometimes deposits. final, final foxes boost fu +11815|1396|O|199250.12|1995-09-13|5-LOW|Clerk#000000342|0|counts use according to the bli +11840|596|F|283439.67|1994-08-15|1-URGENT|Clerk#000000466|0|ggle slowly across the sly +11841|727|F|158024.06|1993-04-21|3-MEDIUM|Clerk#000000521|0|s sleep carefully unusual ac +11842|1414|O|90262.04|1996-04-08|4-NOT SPECIFIED|Clerk#000000566|0|furiously unusual platelets. express requests +11843|730|F|211984.66|1994-07-18|3-MEDIUM|Clerk#000000747|0|g requests snooze care +11844|121|O|86777.18|1997-01-18|2-HIGH|Clerk#000000609|0|ular deposits haggle +11845|887|O|125342.31|1997-03-29|1-URGENT|Clerk#000000902|0|ts. final accounts detect furiously bold foxes. carefully regular packages h +11846|1046|F|51318.21|1993-04-21|5-LOW|Clerk#000000688|0|uriously ironic packages cajole furiously express, even ideas. ironic ideas +11847|1007|O|94551.77|1997-10-02|2-HIGH|Clerk#000000860|0|ely pending deposits haggle furiously across the pending +11872|145|F|75770.24|1994-07-25|5-LOW|Clerk#000000620|0| courts across the furiously +11873|863|O|21009.93|1996-04-06|4-NOT SPECIFIED|Clerk#000000322|0|press, final deposits da +11874|481|F|221467.60|1992-09-10|3-MEDIUM|Clerk#000000163|0|r the slyly bold deposits wake about the c +11875|698|F|98592.08|1992-08-21|3-MEDIUM|Clerk#000000300|0|. quickly special asymptotes after the slowly final pa +11876|611|O|130732.20|1995-07-04|2-HIGH|Clerk#000000325|0| to the quickly even pains: always +11877|268|F|122384.64|1993-05-24|4-NOT SPECIFIED|Clerk#000000312|0|ly above the unusua +11878|1349|F|92047.44|1993-02-25|4-NOT SPECIFIED|Clerk#000000041|0|ole blithely fluffy, unusua +11879|1057|F|185103.30|1993-06-20|2-HIGH|Clerk#000000371|0|to the special excuses detect carefully carefully express accounts. carefully +11904|415|O|279468.40|1997-12-02|4-NOT SPECIFIED|Clerk#000000924|0|accounts. platelets k +11905|343|O|101799.49|1997-07-04|5-LOW|Clerk#000000543|0|thely regular foxes. fluffily regular pinto beans i +11906|524|O|325004.58|1996-12-15|5-LOW|Clerk#000000929|0|deas cajole quickly? blithely final dolphins boost. blithely final deposits wa +11907|1327|F|127812.95|1993-08-24|5-LOW|Clerk#000000062|0|osits above the quickly ironic instructions are carefully after t +11908|1063|F|180189.92|1993-05-26|4-NOT SPECIFIED|Clerk#000000456|0|atelets across the express deposits kindle evenly unu +11909|868|F|51603.50|1994-11-25|4-NOT SPECIFIED|Clerk#000000012|0|lithely unusual accounts aga +11910|644|O|102331.93|1995-06-16|2-HIGH|Clerk#000000664|0|uriously final ideas cajole furi +11911|355|F|219307.51|1993-11-11|1-URGENT|Clerk#000000563|0| requests try to wake according to the carefully regular deposit +11936|749|O|167898.60|1995-09-16|1-URGENT|Clerk#000000869|0|ns wake blithely even, express theodolites; final +11937|1424|O|159471.41|1998-06-27|1-URGENT|Clerk#000000941|0|ic deposits sleep carefully special, regular foxes. special theo +11938|67|O|161199.79|1998-07-25|1-URGENT|Clerk#000000911|0|iously above the reg +11939|1333|O|84765.05|1996-10-01|2-HIGH|Clerk#000000610|0|iously regular dinos cajole furiously foxes. blithely regular foxes acr +11940|683|O|149688.34|1998-05-30|2-HIGH|Clerk#000000152|0|ular ideas cajole quickly +11941|659|F|157391.90|1993-06-25|1-URGENT|Clerk#000000392|0| instructions. carefully final theodolites wake quickly. carefully iro +11942|1324|F|43794.61|1994-05-09|1-URGENT|Clerk#000000317|0|ely bold accounts are carefully alongside of the unusual packages. slyly eve +11943|244|F|235683.21|1993-04-08|5-LOW|Clerk#000000724|0|requests haggle quickly about the carefully +11968|311|F|43428.32|1995-03-17|5-LOW|Clerk#000000526|0|g frets was above the fur +11969|449|F|270998.74|1992-01-20|4-NOT SPECIFIED|Clerk#000000641|0|efully. blithely pending deposits haggle regular, regular +11970|937|O|255762.04|1998-05-24|1-URGENT|Clerk#000000885|0|cial pinto beans. blithely expres +11971|1351|O|119482.38|1997-03-21|2-HIGH|Clerk#000000026|0|slyly regular requests lose quickly: depen +11972|1396|F|147645.78|1994-01-04|4-NOT SPECIFIED|Clerk#000000751|0|riously silent gifts affix slyl +11973|631|F|158758.99|1994-03-04|4-NOT SPECIFIED|Clerk#000000545|0| regular theodolites use carefully pen +11974|1366|F|88216.78|1992-10-09|4-NOT SPECIFIED|Clerk#000000595|0|slyly unusual accounts according to the blithely ironic ideas boost furio +11975|322|O|230472.15|1995-04-14|1-URGENT|Clerk#000000551|0|on the bold ideas cajole across the f +12000|1150|F|89148.77|1994-05-13|4-NOT SPECIFIED|Clerk#000000683|0|s against the furiously ironic grouches sleep according to the e +12001|739|F|138635.75|1994-07-07|2-HIGH|Clerk#000000863|0|old, even theodolites. regular, special theodolites use furio +12002|826|F|79579.51|1993-11-30|3-MEDIUM|Clerk#000000431|0| regular packages wake qui +12003|1205|O|16311.25|1998-05-24|1-URGENT|Clerk#000000708|0|s along the quickly regular instructions haggle carefully furiously u +12004|656|F|74814.13|1994-12-05|3-MEDIUM|Clerk#000000633|0|nis against the slyly specia +12005|1102|F|250917.29|1992-06-25|4-NOT SPECIFIED|Clerk#000000904|0| after the ironic, unusua +12006|944|O|129075.40|1997-06-02|4-NOT SPECIFIED|Clerk#000000501|0|n packages. carefully ironic accounts are after the pending platele +12007|613|F|239431.45|1994-09-28|4-NOT SPECIFIED|Clerk#000000363|0|even requests wake carefully unusual packages. quickly +12032|902|O|102348.27|1997-08-10|4-NOT SPECIFIED|Clerk#000000349|0| after the even, regular instructions. blithe tithes use furiously. b +12033|334|F|214360.53|1992-09-12|2-HIGH|Clerk#000000274|0| bold pearls haggle. carefully ironic pinto beans cajole. blit +12034|121|O|88674.23|1996-12-08|2-HIGH|Clerk#000000363|0|ges. deposits sleep slyly. ideas sleep +12035|1010|O|245999.17|1996-11-09|5-LOW|Clerk#000000963|0|furiously special instructions. pending deposits nod. blithely unusual pint +12036|838|O|241236.07|1998-01-16|5-LOW|Clerk#000000041|0|ic requests. unusual pinto beans sleep fluffily about the furiously regular +12037|1462|O|139739.68|1995-07-01|5-LOW|Clerk#000000375|0|pending foxes shall cajol +12038|164|O|59423.94|1995-11-10|2-HIGH|Clerk#000000587|0|ironic asymptotes mainta +12039|1252|F|303373.40|1993-06-17|2-HIGH|Clerk#000000765|0|packages integrate c +12064|38|F|133067.27|1992-09-16|5-LOW|Clerk#000000994|0| blithely quickly pending t +12065|557|O|60068.73|1997-01-30|4-NOT SPECIFIED|Clerk#000000064|0|the final deposits boost pending deposits. pending +12066|1066|F|187325.65|1995-02-07|3-MEDIUM|Clerk#000000084|0|heodolites cajole a +12067|257|F|227467.91|1993-02-05|1-URGENT|Clerk#000000019|0|requests. quickly regular packages run f +12068|1231|O|20347.58|1996-05-08|2-HIGH|Clerk#000000402|0|ctions. furiously even accounts +12069|1381|O|235666.55|1995-11-08|2-HIGH|Clerk#000000460|0|ong the pinto beans. deposits among the excuses cajole +12070|746|O|256785.35|1998-05-23|5-LOW|Clerk#000000287|0|bold pinto beans hagg +12071|956|O|100260.23|1998-06-26|1-URGENT|Clerk#000000205|0|ly bold multipliers cajole quickly re +12096|1004|F|257237.41|1992-09-20|3-MEDIUM|Clerk#000000156|0|hely final requests kindle among the regular foxes. orb +12097|118|F|156644.02|1993-11-10|1-URGENT|Clerk#000000239|0|out the slyly regular theodolites. regularly reg +12098|1325|F|34956.25|1993-05-01|2-HIGH|Clerk#000000214|0| carefully ironic, express deposits. ideas are slyly a +12099|112|F|230209.47|1994-09-12|1-URGENT|Clerk#000000042|0|furiously regular accounts haggle quic +12100|1298|O|62857.66|1996-03-15|2-HIGH|Clerk#000000518|0|ress frays use blithely pending requests-- quickly regular somas acros +12101|754|F|103072.24|1995-01-07|1-URGENT|Clerk#000000853|0|fily regular packages w +12102|1264|O|208734.50|1995-11-18|3-MEDIUM|Clerk#000000981|0|eposits are blithely along +12103|229|O|169239.68|1996-11-25|3-MEDIUM|Clerk#000000605|0|ironic foxes. quickly brave pinto beans +12128|1192|O|163301.92|1997-06-27|4-NOT SPECIFIED|Clerk#000000102|0|yly across the furiously ironic accounts. carefully special real +12129|418|F|117561.31|1992-12-26|3-MEDIUM|Clerk#000000119|0|dencies cajole furiously about the +12130|1261|O|157170.80|1995-12-10|4-NOT SPECIFIED|Clerk#000000894|0|according to the even, regular packages. furiously unusual pinto beans wake +12131|1172|O|285746.20|1998-06-29|3-MEDIUM|Clerk#000000074|0|ironic ideas. blithely unus +12132|1277|O|271963.86|1996-09-06|1-URGENT|Clerk#000000831|0|ptotes boost permanently. carefully unusual instr +12133|361|F|52225.60|1992-04-15|1-URGENT|Clerk#000000634|0|st after the furiously special +12134|355|O|56547.11|1996-05-31|3-MEDIUM|Clerk#000000868|0|blithely blithely regular theodolites. slyly even packages nag slyly slyly e +12135|1420|O|268120.03|1995-10-10|5-LOW|Clerk#000000246|0|ual excuses alongside of th +12160|1423|F|67966.80|1993-12-13|5-LOW|Clerk#000000707|0|ully about the furiously ironic braids-- carefully en +12161|1307|O|215072.11|1997-03-15|4-NOT SPECIFIED|Clerk#000000382|0|le blithely across the blithely slow fox +12162|1222|O|47989.76|1997-03-18|3-MEDIUM|Clerk#000000066|0| players according to the fluffily ironic dolphins cajole slyly spe +12163|88|O|205826.29|1997-07-20|5-LOW|Clerk#000000951|0|se furiously carefully special pinto beans. blithely special +12164|1313|F|180895.16|1993-10-17|1-URGENT|Clerk#000000148|0|ests. instructions haggle blithely express dependencies. furiously bold war +12165|1489|F|153853.42|1994-04-11|5-LOW|Clerk#000000091|0|nic pinto beans boost carefully +12166|62|F|18006.96|1995-03-15|4-NOT SPECIFIED|Clerk#000000469|0|of the slyly even pinto bean +12167|91|O|60173.82|1998-05-31|1-URGENT|Clerk#000000618|0|counts. bravely special pac +12192|277|F|27209.81|1994-10-19|1-URGENT|Clerk#000000387|0| bold ideas boost slyly slyly final frays. carefully unusual pinto b +12193|802|O|159382.08|1996-07-28|3-MEDIUM|Clerk#000000559|0|y. blithely final pinto beans according to the theodolites haggle care +12194|271|F|59806.63|1995-03-02|1-URGENT|Clerk#000000922|0|atelets haggle among the regular accounts. furiously even plate +12195|73|O|108946.27|1997-04-27|4-NOT SPECIFIED|Clerk#000000947|0|iously silent foxes eat carefull +12196|1261|F|83958.83|1993-06-03|4-NOT SPECIFIED|Clerk#000000284|0|e furiously ironic ideas affix fluffily above the quickly +12197|577|O|206318.73|1997-06-27|2-HIGH|Clerk#000000976|0|ular packages affix upon the slyly +12198|1300|F|59977.08|1993-02-28|3-MEDIUM|Clerk#000000917|0| ironic deposits. furiously express escapades detect +12199|520|O|103350.42|1995-12-15|5-LOW|Clerk#000000478|0|he ironic accounts. ideas detect. slyly final packa +12224|646|F|212674.36|1994-12-13|2-HIGH|Clerk#000000672|0|. slyly final accounts boost. blithely express deposits haggle sl +12225|656|O|188067.32|1997-01-29|2-HIGH|Clerk#000000903|0|ons. blithely bold requests are carefu +12226|1348|O|120809.59|1998-04-01|5-LOW|Clerk#000000415|0| across the final instructi +12227|1282|O|210133.42|1998-06-27|3-MEDIUM|Clerk#000000980|0| packages. quickly ironic accounts affix quickly. ironic, even packages +12228|226|F|276130.19|1994-06-26|4-NOT SPECIFIED|Clerk#000000474|0|fully regular excuses? ironic foxes are across the dogge +12229|1250|O|106159.32|1996-07-24|1-URGENT|Clerk#000000293|0|ptotes boost slyly even accounts. +12230|712|O|161632.17|1998-04-05|2-HIGH|Clerk#000000383|0|s. regular foxes breach regularly pending theodo +12231|1021|O|243683.82|1997-07-30|4-NOT SPECIFIED|Clerk#000000012|0|sual sauternes use across the bold theodolites. req +12256|532|F|146646.67|1992-12-19|3-MEDIUM|Clerk#000000238|0|iously alongside of the +12257|149|O|128270.26|1996-04-17|2-HIGH|Clerk#000000278|0|y above the unusual foxes. slyly even accounts haggl +12258|1408|F|300041.05|1994-12-01|5-LOW|Clerk#000000878|0|ing foxes boost. stealthy +12259|250|F|173853.14|1993-02-15|2-HIGH|Clerk#000000282|0| boost about the carefully ironic ideas. fluffily iron +12260|496|F|172336.18|1992-11-26|3-MEDIUM|Clerk#000000484|0|s along the slyly ruthless pinto beans haggle about the +12261|1126|F|362237.85|1993-10-24|5-LOW|Clerk#000000279|0|ccounts use quickly about the furiously bold foxes. furiously final +12262|1441|O|139469.07|1995-12-11|5-LOW|Clerk#000000886|0|efully. slyly final theodolit +12263|550|O|161275.31|1995-07-07|2-HIGH|Clerk#000000566|0|ts sleep across the carefully bold instruc +12288|1153|O|125448.87|1996-11-06|1-URGENT|Clerk#000000183|0|slyly regular deposits above the foxes are at the packages- +12289|421|O|128835.39|1995-12-25|5-LOW|Clerk#000000269|0| even deposits. ironic, regular deposits haggle blith +12290|1304|O|103022.30|1995-07-10|3-MEDIUM|Clerk#000000947|0|ully pending instructions boost slyly furiously +12291|740|O|19328.06|1998-03-23|1-URGENT|Clerk#000000074|0|al deposits. warhorses inte +12292|739|F|176370.50|1992-06-03|4-NOT SPECIFIED|Clerk#000000375|0|sometimes final foxes after the qui +12293|329|O|102326.14|1995-06-19|2-HIGH|Clerk#000000103|0| quietly ironic instructions sleep carefully furiously iro +12294|784|O|182534.50|1995-07-06|5-LOW|Clerk#000000583|0|ns run about the qui +12295|883|F|84218.70|1993-11-10|5-LOW|Clerk#000000955|0|ost around the slowly iron +12320|298|O|118435.28|1995-12-21|1-URGENT|Clerk#000000356|0|o beans wake carefully theodolites. final gifts haggle quickly +12321|79|F|12511.06|1994-04-04|3-MEDIUM|Clerk#000000705|0|uriously ironic deposits cajole furiously doggedly ironic depend +12322|856|P|42466.03|1995-05-12|1-URGENT|Clerk#000000760|0| the special instructions detect fluffily ac +12323|926|P|139824.58|1995-04-03|4-NOT SPECIFIED|Clerk#000000019|0|ts detect above the even dep +12324|1033|O|202248.40|1998-08-02|3-MEDIUM|Clerk#000000746|0|ending theodolites try to thrash. regular deposits about the fluffily pending +12325|973|F|70150.43|1995-01-05|1-URGENT|Clerk#000000440|0|packages are final p +12326|506|F|181528.08|1995-02-03|1-URGENT|Clerk#000000765|0|ccounts are fluffily carefu +12327|166|O|39113.28|1998-04-23|4-NOT SPECIFIED|Clerk#000000969|0|tions haggle carefully slyly +12352|1466|F|331745.34|1992-03-24|3-MEDIUM|Clerk#000000997|0|eas. regular instructions need to boost slyly re +12353|595|O|219706.88|1996-04-13|4-NOT SPECIFIED|Clerk#000000312|0|ependencies. special dependencies nag quickly even packages. slyly final de +12354|1243|O|54975.46|1997-01-21|5-LOW|Clerk#000000859|0|g to the carefully pending excuses cajole +12355|178|P|286003.34|1995-05-29|4-NOT SPECIFIED|Clerk#000000081|0|arhorses. close, final foxes are slyly +12356|656|F|121696.19|1992-10-19|1-URGENT|Clerk#000000540|0|ges haggle quickly! blithely careful courts impress alongside of the bold fox +12357|154|O|90986.72|1995-08-23|2-HIGH|Clerk#000000169|0|instructions poach furiously final requests. quickly express depo +12358|880|O|231011.45|1996-10-10|2-HIGH|Clerk#000000335|0| blithely pending ideas. quickly ironic pinto b +12359|1400|O|215672.79|1997-05-29|4-NOT SPECIFIED|Clerk#000000382|0| express packages grow above the blithely even foxes: +12384|1168|O|213609.26|1998-08-02|3-MEDIUM|Clerk#000000311|0|gle. furiously unus +12385|821|F|92862.99|1992-11-24|5-LOW|Clerk#000000324|0|sts use furiously. ironi +12386|424|F|314497.24|1992-03-21|3-MEDIUM|Clerk#000000709|0|e fluffily ironic dolphins. quick +12387|638|O|52638.42|1997-07-03|2-HIGH|Clerk#000000051|0|o the quickly regular requests use slyly unusual theodolites. +12388|952|O|331123.13|1997-10-16|4-NOT SPECIFIED|Clerk#000000611|0|boost furiously furiously final accounts. slyly regular deposits are am +12389|653|F|242568.31|1994-08-05|3-MEDIUM|Clerk#000000139|0|s boost according to the slyly even dolphins. final depend +12390|1285|O|49792.77|1996-06-24|3-MEDIUM|Clerk#000000421|0|posits doze blithely. fluffily ironic d +12391|1000|O|94747.78|1998-07-01|5-LOW|Clerk#000000433|0|cies are blithely. furious +12416|1150|F|9933.08|1993-06-26|1-URGENT|Clerk#000000400|0|ow ideas cajole furiou +12417|1081|F|230795.43|1993-10-25|1-URGENT|Clerk#000000152|0|requests. furiously express instructions haggle. e +12418|1300|F|124402.47|1992-02-19|4-NOT SPECIFIED|Clerk#000000547|0|tructions. foxes nag furiously abo +12419|982|O|268861.58|1995-10-16|1-URGENT|Clerk#000000104|0|y. furiously final sauternes sleep slyly above the pending +12420|1489|F|179274.43|1993-12-27|3-MEDIUM|Clerk#000000798|0|ackages cajole permanently. blithely quick packages alongs +12421|673|O|212213.47|1995-11-02|1-URGENT|Clerk#000000203|0|pending theodolites wake: ironic, express platelets cajole furiously. +12422|575|P|217235.25|1995-05-22|3-MEDIUM|Clerk#000000349|0|ssly pending requests cajole quietly final i +12423|986|F|90571.46|1992-07-18|1-URGENT|Clerk#000000742|0|nic courts haggle carefully finally regular requests. depo +12448|511|O|158476.25|1995-11-09|1-URGENT|Clerk#000000711|0|he quickly pending accounts. ironic +12449|461|F|133597.11|1993-02-01|3-MEDIUM|Clerk#000000312|0|s hinder carefully across the iro +12450|1321|F|41643.96|1994-03-13|4-NOT SPECIFIED|Clerk#000000550|0|kages use quickly final accounts. carefully regular packages integrate blithe +12451|1150|F|298853.62|1993-04-20|5-LOW|Clerk#000000319|0|uriously even ideas hagg +12452|364|F|173339.75|1993-12-08|3-MEDIUM|Clerk#000000867|0|indle furiously near the quickly regular accounts: silent, +12453|1213|F|180966.45|1994-01-14|5-LOW|Clerk#000000085|0|ic ideas promise. slyly ironic pinto beans above the dinos wake quickly bold +12454|217|O|42464.91|1997-03-21|1-URGENT|Clerk#000000910|0|ic, regular deposits are against the carefully unusual accounts. e +12455|292|F|216570.72|1992-09-04|4-NOT SPECIFIED|Clerk#000000594|0|nusual asymptotes. regular ideas haggle blithely across the ironic ideas. +12480|320|F|122198.33|1994-07-08|3-MEDIUM|Clerk#000000055|0|ructions wake fluffily fluffily final gifts! furiou +12481|271|O|85849.06|1995-07-11|1-URGENT|Clerk#000000785|0|uests sleep furiously bold deposits. blithely express acc +12482|998|O|153413.61|1996-01-08|5-LOW|Clerk#000000311|0|y express dependencies along the f +12483|124|F|153915.13|1993-08-05|1-URGENT|Clerk#000000652|0|cial ideas sleep furiously against the final, regular re +12484|1027|O|184195.36|1995-08-22|3-MEDIUM|Clerk#000000268|0|olphins. blithely ironic platelets s +12485|188|F|209369.25|1993-08-08|1-URGENT|Clerk#000000994|0|tions along the ideas +12486|1286|P|184001.37|1995-02-21|2-HIGH|Clerk#000000206|0| deposits; quickly ironic packages use stealthily about the qui +12487|401|F|41222.94|1994-11-30|2-HIGH|Clerk#000000575|0|xes. requests sleep carefully +12512|1402|O|106021.12|1996-04-02|2-HIGH|Clerk#000000813|0|nal foxes are fluffily. foxes snooze about the ironi +12513|419|O|62011.18|1997-09-03|5-LOW|Clerk#000000422|0| wake final, special requests. express instructions cajole after the furi +12514|1495|F|38477.49|1994-04-25|2-HIGH|Clerk#000000120|0|c courts doubt express, bo +12515|1459|F|128077.61|1993-05-14|3-MEDIUM|Clerk#000000624|0|kly special accounts. blithely regular packages boost slyly packages. pl +12516|1373|F|112837.28|1994-05-25|5-LOW|Clerk#000000087|0|y after the quickly unusual gifts. fluffily exp +12517|1303|O|84279.32|1997-02-01|5-LOW|Clerk#000000162|0|packages. express packages impress furiously even, bold theodolite +12518|1082|F|153987.45|1993-07-23|5-LOW|Clerk#000000194|0|ultipliers serve furiously a +12519|913|F|187489.35|1994-01-01|2-HIGH|Clerk#000000387|0|ependencies. carefully unusual deposits use finally ironic deposits. e +12544|440|F|62982.76|1994-03-04|5-LOW|Clerk#000000600|0|thely above the even +12545|175|O|74242.81|1996-07-01|1-URGENT|Clerk#000000472|0|ly. carefully silent excuses use carefully around the reg +12546|217|O|89344.66|1996-02-08|4-NOT SPECIFIED|Clerk#000000547|0|ounts mold. blithely stealthy depths haggle blithely blithe +12547|1141|O|205195.87|1998-04-14|2-HIGH|Clerk#000000729|0|odolites? blithely ir +12548|145|O|209786.08|1997-11-20|4-NOT SPECIFIED|Clerk#000000517|0|s excuses x-ray against +12549|28|O|100471.72|1997-06-03|1-URGENT|Clerk#000000845|0|he furiously regular pint +12550|878|F|39446.33|1993-03-09|4-NOT SPECIFIED|Clerk#000000282|0|as. blithely ironic pinto beans wake. slyly bold deposits detect blithely alon +12551|790|F|176659.70|1992-06-12|5-LOW|Clerk#000000090|0| slyly alongside of the special waters. asymptotes outside the pend +12576|1057|F|33914.11|1993-01-26|4-NOT SPECIFIED|Clerk#000000762|0|n decoys behind the carefully final requests +12577|616|O|134783.72|1998-05-18|4-NOT SPECIFIED|Clerk#000000586|0|special instruction +12578|1207|O|255196.69|1996-11-15|2-HIGH|Clerk#000000150|0|p slyly furious foxes. slyly pending a +12579|193|O|47191.62|1995-06-17|4-NOT SPECIFIED|Clerk#000000536|0|y silent pinto beans-- ironic deposits affix. furiously fina +12580|589|F|41858.68|1993-01-14|5-LOW|Clerk#000000373|0|y bold theodolites above the carefully regular +12581|823|F|106379.64|1994-10-21|2-HIGH|Clerk#000000582|0| final requests after the final patterns wake blithel +12582|538|F|22603.80|1993-01-22|4-NOT SPECIFIED|Clerk#000000671|0| ironic packages against the requests slee +12583|943|O|42860.56|1996-01-18|5-LOW|Clerk#000000676|0|yly fluffily even accounts. quickly careful asymptotes boost. ironic, bo +12608|301|F|61932.81|1993-03-08|1-URGENT|Clerk#000000087|0| have to nag quietly among the carefully bold pinto beans. expres +12609|805|O|128069.23|1996-01-17|3-MEDIUM|Clerk#000000207|0|l requests haggle furiously +12610|85|F|10061.76|1993-07-17|5-LOW|Clerk#000000952|0| bold theodolites engage blithely against th +12611|41|O|185736.53|1995-10-16|3-MEDIUM|Clerk#000000579|0|ckly carefully regular deposits +12612|1444|F|185433.93|1993-12-22|5-LOW|Clerk#000000381|0| accounts. furiously ironic requests along the final, ruthless accounts cajol +12613|328|F|116318.24|1993-04-11|3-MEDIUM|Clerk#000000550|0|lithely express ins +12614|670|O|273057.78|1996-02-28|3-MEDIUM|Clerk#000000387|0|wake. quickly stealthy foxes affix slyly ironic requests. +12615|118|F|20866.10|1995-03-06|4-NOT SPECIFIED|Clerk#000000993|0|old packages. accounts use slyly after the foxes. +12640|413|O|76597.62|1998-07-20|2-HIGH|Clerk#000000081|0|ites. slyly express deposits integrate fluffily. ironic courts abo +12641|1097|F|239626.14|1995-02-23|5-LOW|Clerk#000000617|0|its wake according to the slyly unusual excuses. even patterns are carefully +12642|1243|F|247694.31|1994-04-28|1-URGENT|Clerk#000000015|0|symptotes thrash blithely above the furiously regular accounts. q +12643|322|F|124302.25|1993-03-20|5-LOW|Clerk#000000486|0| slyly silent requests. qui +12644|1159|F|150689.23|1992-02-01|2-HIGH|Clerk#000000394|0| the final instructions. blithely ironic asymptotes boost carefully regular +12645|250|F|231538.56|1994-07-07|5-LOW|Clerk#000000705|0|de of the blithely regular accounts use slyly final accounts. fluff +12646|1334|F|116946.28|1993-02-18|1-URGENT|Clerk#000000155|0|regular ideas. slyly ironic re +12647|1198|O|38285.07|1997-02-27|4-NOT SPECIFIED|Clerk#000000190|0|. regular theodolites sleep after the care +12672|257|F|37187.79|1994-07-07|4-NOT SPECIFIED|Clerk#000000963|0|es are carefully blithely unusual dugouts. regular, i +12673|62|F|21911.85|1994-06-12|1-URGENT|Clerk#000000435|0|ffily. express accounts sleep slyly regular deposit +12674|586|F|96952.15|1992-07-05|5-LOW|Clerk#000000811|0|xcuses. express deposits wake quickl +12675|679|F|155533.85|1994-01-28|3-MEDIUM|Clerk#000000921|0|r theodolites. furiously pending gifts alongside +12676|839|F|5884.55|1994-01-16|2-HIGH|Clerk#000000960|0|ake slyly special deposits. slyly un +12677|190|O|187187.63|1996-05-25|5-LOW|Clerk#000000500|0|ely above the furiously silent accounts; carefully regular depend +12678|844|O|77831.02|1998-01-26|5-LOW|Clerk#000000395|0|around the blithely slow packages nag quickly express packages. carefully +12679|1117|O|75859.23|1997-06-22|2-HIGH|Clerk#000000326|0|s. furiously pending deposits sleep furiously a +12704|439|F|143027.03|1993-02-10|5-LOW|Clerk#000000553|0|ackages sleep. pinto beans haggle furiously. quickly final dolphins use blit +12705|295|F|74933.03|1994-09-16|5-LOW|Clerk#000000983|0|grow above the fluffily final packages. slyly pending ideas nag furiou +12706|458|F|157344.88|1994-11-21|1-URGENT|Clerk#000000997|0|ing instructions. deposits cajole. slyly sp +12707|1219|F|253413.30|1993-05-30|2-HIGH|Clerk#000000820|0|ffix furiously according to the final, ironic dolphin +12708|172|F|262921.58|1993-01-08|5-LOW|Clerk#000000882|0|ly ironic deposits. quickly final sentiments cajole car +12709|268|O|74462.32|1996-05-11|5-LOW|Clerk#000000991|0|hely alongside of the a +12710|1169|F|305191.71|1993-08-18|1-URGENT|Clerk#000000329|0|es wake furiously ironic accounts. fluffily ironic pinto bea +12711|85|F|80711.39|1992-02-20|1-URGENT|Clerk#000000326|0|usual instructions. pending, final deposits use. +12736|751|F|346186.75|1993-03-09|5-LOW|Clerk#000000385|0|ithely express deposits. pinto beans n +12737|1187|F|320360.43|1994-05-04|1-URGENT|Clerk#000000047|0|ly regular dinos affix slyly. ironic, quick packages boost carefully. specia +12738|1334|O|182506.16|1998-06-12|2-HIGH|Clerk#000000613|0|sts boost: carefully even decoys integrate against the furiously reg +12739|772|F|56336.51|1992-03-02|4-NOT SPECIFIED|Clerk#000000078|0|side the bold, express depend +12740|439|O|61728.22|1997-06-05|2-HIGH|Clerk#000000643|0| the special deposits ca +12741|1348|F|162616.34|1992-07-20|4-NOT SPECIFIED|Clerk#000000800|0| of the instructions. furiou +12742|748|O|36355.83|1997-06-07|5-LOW|Clerk#000000591|0|always final sauternes. carefully regula +12743|695|F|101594.83|1993-06-24|2-HIGH|Clerk#000000015|0|inal foxes cajole quickly. bli +12768|1202|F|121309.88|1994-04-09|1-URGENT|Clerk#000000642|0|sly even accounts haggle slyly. blithely pending epitaphs boost. carefully f +12769|1057|F|29166.32|1992-01-08|4-NOT SPECIFIED|Clerk#000000590|0|blithely across the furiously express foxes; slyly silent pa +12770|1415|F|129333.56|1993-04-18|4-NOT SPECIFIED|Clerk#000000243|0|bove the special, regular ideas. final pinto beans grow? iro +12771|451|F|203114.43|1994-01-18|1-URGENT|Clerk#000000548|0|counts. furiously final dependencies sleep. fluffi +12772|1451|P|221390.02|1995-05-12|4-NOT SPECIFIED|Clerk#000000248|0|ual requests wake quickly even pinto +12773|817|F|304639.93|1995-01-12|5-LOW|Clerk#000000670|0|s, pending ideas. fluffily ironic deposits cajole blithely furiously unusual +12774|1108|F|60657.84|1992-10-10|1-URGENT|Clerk#000000067|0|ounts. quickly final requests +12775|979|O|127678.72|1996-10-15|5-LOW|Clerk#000000553|0|s the quickly unusual +12800|11|F|302431.56|1993-05-23|5-LOW|Clerk#000000898|0|. slyly final accounts cajole i +12801|1412|O|226079.43|1997-08-28|3-MEDIUM|Clerk#000000582|0|bove the fluffily express asymptot +12802|1481|O|233609.74|1998-03-02|1-URGENT|Clerk#000000774|0|ounts. special, pending ideas cajole pe +12803|392|F|27391.77|1993-02-26|4-NOT SPECIFIED|Clerk#000000876|0|sly final accounts use slyly final accounts. blithe +12804|734|F|358058.27|1992-05-26|3-MEDIUM|Clerk#000000544|0|l packages boost quickly ironic, +12805|478|O|76234.32|1996-12-11|3-MEDIUM|Clerk#000000035|0| to the quickly special platelets? +12806|526|O|208746.01|1995-12-25|4-NOT SPECIFIED|Clerk#000000181|0|s about the slyly regular pinto beans nag +12807|391|O|34178.61|1998-01-16|5-LOW|Clerk#000000393|0|uffily final accounts wake fur +12832|362|F|66392.28|1994-12-11|3-MEDIUM|Clerk#000000566|0|unts are after the regular packages. furiously pending +12833|1285|O|102301.35|1998-06-14|5-LOW|Clerk#000000773|0|nts. even, pending foxes are +12834|757|O|263553.51|1996-11-03|4-NOT SPECIFIED|Clerk#000000370|0|ns. unusual ideas are. somas b +12835|370|O|142811.34|1997-01-20|4-NOT SPECIFIED|Clerk#000000894|0|ges. slyly final id +12836|1057|O|222420.89|1996-04-18|3-MEDIUM|Clerk#000000728|0|es sleep furiously against the quickly even inst +12837|590|F|112787.85|1992-12-03|3-MEDIUM|Clerk#000000431|0|ter the slowly unusual foxes. blithely express pinto beans haggle. furiou +12838|112|O|104930.86|1998-07-01|1-URGENT|Clerk#000000424|0|fully ironic foxes. quickly pending accounts about the fin +12839|1424|O|178226.93|1998-01-08|3-MEDIUM|Clerk#000001000|0|ng pinto beans. unusual theodolites engag +12864|647|F|142470.94|1994-05-17|2-HIGH|Clerk#000000620|0| the ironic, silent foxes. special +12865|1271|O|244542.24|1997-05-23|5-LOW|Clerk#000000362|0|requests boost slyly carefully even instructions. carefully regular packages c +12866|1433|O|165429.43|1997-01-17|3-MEDIUM|Clerk#000000996|0|y regular requests play carefully against the always final +12867|59|F|197098.68|1995-03-12|4-NOT SPECIFIED|Clerk#000000638|0|lar platelets. blithely unusual deposits cajole carefully s +12868|1042|P|229577.12|1995-03-02|1-URGENT|Clerk#000000993|0|ns sleep above the carefully ex +12869|1396|F|131379.62|1994-01-26|4-NOT SPECIFIED|Clerk#000000871|0|s the pending foxes: fluffily regular requests wake slyly against the slyl +12870|1366|F|51595.17|1993-07-28|1-URGENT|Clerk#000000157|0| furiously dogged theodolites. regular requests among the blithely +12871|1174|O|194923.17|1995-10-05|4-NOT SPECIFIED|Clerk#000000646|0|ally ironic packages. blithely regular asymptotes are a +12896|370|O|321570.67|1996-12-22|1-URGENT|Clerk#000000337|0|nic theodolites. slyly even pinto beans use quickly. care +12897|1169|O|153229.93|1995-07-19|4-NOT SPECIFIED|Clerk#000000854|0|ost carefully regular packages. blithely +12898|1045|F|44854.49|1994-09-17|3-MEDIUM|Clerk#000000873|0|packages maintain carefully after +12899|868|O|40541.89|1996-04-07|4-NOT SPECIFIED|Clerk#000000006|0|efully pending ideas cajole fluf +12900|220|F|41268.96|1993-05-04|2-HIGH|Clerk#000000285|0|s. even requests sleep carefully blithely unusual ac +12901|1283|F|302296.36|1994-05-06|2-HIGH|Clerk#000000994|0|ely final requests. fu +12902|640|F|321334.39|1993-10-30|4-NOT SPECIFIED|Clerk#000000254|0|y regular deposits. regular instructions sleep +12903|301|F|89081.29|1994-09-26|1-URGENT|Clerk#000000914|0|wake furiously fluffily bold dolphins. blithely regular pinto beans sle +12928|634|F|258054.14|1994-03-28|2-HIGH|Clerk#000000465|0|ng slyly after the final requests. furiously special +12929|917|F|138543.10|1993-08-31|1-URGENT|Clerk#000000397|0|g the blithely bold asymptotes. pending dependencies +12930|1072|O|10854.39|1995-11-25|2-HIGH|Clerk#000000162|0|es cajole alongside of the fluffily pending dependencies. regular +12931|775|F|72091.62|1992-04-25|3-MEDIUM|Clerk#000000196|0|final foxes boost across the slyly pending dependencies. even, +12932|238|O|151284.17|1997-08-27|3-MEDIUM|Clerk#000000787|0|ackages. foxes cajole blithely regular +12933|173|O|253181.34|1998-02-17|3-MEDIUM|Clerk#000000224|0|haggle according to +12934|623|F|273516.60|1994-03-06|4-NOT SPECIFIED|Clerk#000000441|0|sual, pending dependencies among +12935|509|F|69433.26|1994-05-10|3-MEDIUM|Clerk#000000549|0|gouts at the even packages cajole slyly final packages. slyly enticin +12960|1243|F|132107.73|1993-10-10|2-HIGH|Clerk#000000340|0|ng theodolites haggle after the final id +12961|1144|F|133684.91|1994-12-13|2-HIGH|Clerk#000000913|0|rding to the enticing, final foxes use blithely furiou +12962|1111|O|130541.81|1995-10-29|1-URGENT|Clerk#000000488|0|. accounts breach carefully blithely ironic deposits. +12963|1232|O|72621.23|1998-07-08|3-MEDIUM|Clerk#000000546|0|uriously regular deposits wake slowly along t +12964|556|O|228128.18|1998-01-13|2-HIGH|Clerk#000000980|0|ronic instructions. quickly regular a +12965|964|F|107134.13|1993-06-26|3-MEDIUM|Clerk#000000650|0|ate slyly against the carefully final packages. furiously final requests alo +12966|224|O|51608.06|1997-10-11|5-LOW|Clerk#000000252|0|ly furiously final packages. carefully regular packages integrate quic +12967|1147|F|9777.25|1993-09-22|2-HIGH|Clerk#000000650|0|gly final deposits are slyly carefully ironic cour +12992|139|O|199084.84|1997-02-25|5-LOW|Clerk#000000099|0|xpress theodolites use across the un +12993|1348|O|46875.17|1998-05-14|5-LOW|Clerk#000000435|0| across the depths. idle, final accounts lose furiously regular, +12994|1451|F|54188.56|1994-11-18|5-LOW|Clerk#000000557|0|ily among the slyly unusual deposits. quickly pending acco +12995|1162|O|200689.05|1996-07-29|3-MEDIUM|Clerk#000000027|0|ts except the quickly express request +12996|967|O|107497.47|1995-12-05|4-NOT SPECIFIED|Clerk#000000531|0|ccounts. blithely ironic pinto beans cajol +12997|520|O|23304.56|1996-05-27|1-URGENT|Clerk#000000085|0|accounts boost. final asymptotes affix blithely fluff +12998|799|O|25952.72|1996-10-03|2-HIGH|Clerk#000000213|0|instructions sleep. express, final patterns detect furiously. furi +12999|940|F|216567.07|1993-04-04|2-HIGH|Clerk#000000745|0|nusual foxes. express accounts sublate q +13024|664|F|58015.05|1992-03-14|3-MEDIUM|Clerk#000000700|0| bold requests nag quickly. d +13025|158|O|138165.03|1998-01-28|2-HIGH|Clerk#000000785|0|lly regular instructions serve. special deposits against the careful +13026|1126|O|194927.69|1997-04-01|2-HIGH|Clerk#000000050|0| bold ideas! express ideas across the furiously dogged theodolites use bold, +13027|955|F|160057.71|1992-01-16|1-URGENT|Clerk#000000236|0|ongside of the ideas wak +13028|685|F|231028.06|1994-04-09|1-URGENT|Clerk#000000687|0|regular platelets a +13029|340|O|177062.13|1997-11-11|3-MEDIUM|Clerk#000000699|0|riously above the blithely f +13030|1459|F|146978.50|1994-07-23|3-MEDIUM|Clerk#000000878|0|hely ironic packages are slyly regular ideas. quickly final pack +13031|7|F|237595.83|1992-12-05|5-LOW|Clerk#000000325|0|s are furiously. busy requests haggle furiously pinto beans. asymptotes are. +13056|437|F|193618.95|1994-04-23|4-NOT SPECIFIED|Clerk#000000174|0|ounts. quickly regular packages above the furiously unusual sauternes ha +13057|67|O|102973.85|1997-12-16|1-URGENT|Clerk#000000125|0|y. final requests breach furiously. regular deposits engage. +13058|1156|O|12461.38|1997-03-26|1-URGENT|Clerk#000000685|0|ly! special instructions sleep furiously throughout the deposits. +13059|136|O|197435.35|1997-05-31|5-LOW|Clerk#000000463|0| requests. blithely special +13060|1345|O|272394.13|1997-02-06|4-NOT SPECIFIED|Clerk#000000724|0|ously above the pending, special theodolites. dolphins ar +13061|821|O|76034.36|1997-09-17|1-URGENT|Clerk#000000937|0|regular deposits. s +13062|1291|O|63228.29|1996-05-03|2-HIGH|Clerk#000000216|0|s asymptotes cajole carefully regular depen +13063|1412|O|318204.60|1997-01-15|5-LOW|Clerk#000000506|0|packages are slyly fluffil +13088|1460|F|261581.56|1993-04-23|4-NOT SPECIFIED|Clerk#000000089|0|s. even, final packages on the carefully regular platelets cajole quick +13089|1403|O|277440.38|1995-12-15|4-NOT SPECIFIED|Clerk#000000502|0|e slyly ironic pinto beans. blithely express accounts boost. pen +13090|130|F|146458.92|1993-07-27|4-NOT SPECIFIED|Clerk#000000717|0|packages impress quickly across the fluffily regul +13091|856|F|200741.15|1994-11-16|3-MEDIUM|Clerk#000000786|0|ironic requests nag furiously stealthy pinto beans. slyly even pains +13092|1430|O|142733.13|1998-06-24|1-URGENT|Clerk#000000241|0|eans haggle furiously about the slyly daring deposi +13093|1132|O|144898.05|1996-05-05|2-HIGH|Clerk#000000244|0| slyly even sheaves haggl +13094|1129|F|64336.85|1993-08-19|4-NOT SPECIFIED|Clerk#000000376|0|theodolites serve around the slyly special accounts. instruc +13095|1454|O|282335.80|1996-07-22|1-URGENT|Clerk#000000837|0|ve theodolites detect according to the slyly special grouches. un +13120|1039|F|90929.21|1994-12-15|5-LOW|Clerk#000000149|0| to the quickly express requests nag carefully stealthily regular requ +13121|878|F|190958.73|1993-03-08|2-HIGH|Clerk#000000148|0|cross the blithely ironic the +13122|242|F|164977.59|1994-09-24|2-HIGH|Clerk#000000229|0|t blithely furiously special accounts. carefully regular +13123|841|O|208768.85|1998-07-03|2-HIGH|Clerk#000000231|0|fter the slyly speci +13124|10|F|57676.34|1993-12-18|3-MEDIUM|Clerk#000000862|0|ggle quickly according to the carefully even pac +13125|355|F|190034.02|1993-12-14|4-NOT SPECIFIED|Clerk#000000302|0|ly quickly final ideas. carefully bold ideas slee +13126|956|O|131328.54|1995-10-20|4-NOT SPECIFIED|Clerk#000000919|0|ithely bold foxes wake. accounts according to the quickly ev +13127|1165|F|38692.83|1993-08-01|3-MEDIUM|Clerk#000000178|0|cording to the ironic asymptotes sleep care +13152|850|F|283938.70|1994-02-15|2-HIGH|Clerk#000000367|0|ts. blithely final instructions sleep quickly final requ +13153|1144|O|165659.63|1996-11-06|1-URGENT|Clerk#000000666|0|refully across the carefully careful notornis. qu +13154|520|O|286298.87|1997-10-22|5-LOW|Clerk#000000557|0|foxes? quickly blithe ideas nag slyly. blithely regular packages cajole. fluff +13155|1079|O|190720.20|1996-06-18|1-URGENT|Clerk#000000727|0|ns play. express requests cajole quickly theodolites. carefully furious dino +13156|1283|O|180693.69|1995-10-06|5-LOW|Clerk#000000482|0| about the carefully regular a +13157|656|F|277209.62|1992-02-12|3-MEDIUM|Clerk#000000655|0|regular requests wake. never special ac +13158|134|F|198301.99|1992-11-21|1-URGENT|Clerk#000000638|0|ns promise slyly even requests. carefully ironic packages haggle +13159|784|O|175684.88|1996-12-02|1-URGENT|Clerk#000000262|0|efully among the blithely regular instructions. carefu +13184|472|O|21843.01|1998-03-28|4-NOT SPECIFIED|Clerk#000000845|0|ilent deposits haggle furiously about the silent deposits. +13185|805|O|300236.26|1997-07-15|5-LOW|Clerk#000000862|0|ly even tithes sleep daringly. unusual, ironic accou +13186|556|O|206062.94|1996-09-18|2-HIGH|Clerk#000000427|0|ckly pending accounts. quick +13187|923|F|78566.07|1993-12-09|2-HIGH|Clerk#000000421|0|ns haggle slyly. slyly pending instructions at the carefully final +13188|1436|O|95591.25|1998-07-20|3-MEDIUM|Clerk#000000061|0|ckey players. accounts haggle fluffily against the foxes. unusual, expre +13189|94|F|2361.93|1995-04-05|1-URGENT|Clerk#000000002|0|l deposits above the pending pinto beans are +13190|136|O|24775.00|1998-05-04|4-NOT SPECIFIED|Clerk#000000173|0|furiously express accounts. carefully i +13191|214|O|331578.75|1997-12-24|5-LOW|Clerk#000000080|0|regular accounts at the blithely even sh +13216|1075|F|97503.77|1992-04-14|3-MEDIUM|Clerk#000000901|0|e furiously express pinto beans. unusual deposits are. even instructio +13217|946|O|67106.36|1997-09-25|5-LOW|Clerk#000000659|0|se dependencies nag blithely after the blithely regular ideas. +13218|1438|F|210525.16|1994-05-17|2-HIGH|Clerk#000000715|0|ccounts. slyly pending instru +13219|535|O|190074.19|1997-10-15|2-HIGH|Clerk#000000251|0|s. regular, special platelets wake. unusual, even +13220|1480|O|134628.97|1998-07-31|1-URGENT|Clerk#000000586|0|refully final platelets: accounts of the busily special +13221|946|O|106536.33|1995-10-15|4-NOT SPECIFIED|Clerk#000000459|0|lthy accounts around the +13222|1363|O|93525.50|1997-05-04|4-NOT SPECIFIED|Clerk#000000435|0|quests. furiously silent packages +13223|352|O|45917.67|1996-08-08|4-NOT SPECIFIED|Clerk#000000713|0| slyly blithely regular requests. furiously regular multipliers wake +13248|892|O|39800.14|1997-02-02|3-MEDIUM|Clerk#000000920|0|eans use. even packages eat after the ca +13249|569|O|222028.79|1997-07-18|5-LOW|Clerk#000000660|0|nstructions nag blithely quick +13250|1325|O|141857.68|1997-08-18|3-MEDIUM|Clerk#000000150|0|sts about the final requests a +13251|982|O|123168.81|1997-03-28|1-URGENT|Clerk#000000928|0|cording to the blithely silent deposit +13252|1309|F|163473.91|1994-03-23|4-NOT SPECIFIED|Clerk#000000026|0|n ideas must boost blithely. expre +13253|790|O|277363.52|1996-10-28|2-HIGH|Clerk#000000767|0|refully even packages print. blithely bold deposits boost fluffily +13254|1066|O|204264.00|1998-02-23|3-MEDIUM|Clerk#000000890|0|blithely silent packages. fin +13255|1115|F|113899.92|1993-07-18|3-MEDIUM|Clerk#000000993|0|metimes across the even deposits. pending accounts affix blithely furi +13280|314|F|236922.45|1994-09-12|2-HIGH|Clerk#000000073|0|pinto beans promise carefully final requests. r +13281|1480|F|164425.24|1992-04-23|1-URGENT|Clerk#000000327|0|slyly. regularly ironic deposits haggle bli +13282|817|F|153262.10|1992-05-10|5-LOW|Clerk#000000436|0|luffily express foxes +13283|946|O|129981.62|1997-12-29|4-NOT SPECIFIED|Clerk#000000842|0|dependencies? quickly quick deposits cajol +13284|851|F|136289.59|1992-08-13|2-HIGH|Clerk#000000186|0|equests. slyly final de +13285|406|O|8165.39|1995-05-17|4-NOT SPECIFIED|Clerk#000000312|0|r packages. silent, even +13286|1114|O|81226.73|1995-10-12|2-HIGH|Clerk#000000186|0|osits. slyly express requests promise quickly. bold, final asymptote +13287|895|O|168246.03|1997-03-10|3-MEDIUM|Clerk#000000335|0|e theodolites. blithely even deposits dazzle care +13312|1324|O|80963.75|1996-11-04|1-URGENT|Clerk#000000904|0|final accounts wake slyl +13313|1438|F|254146.32|1994-07-17|4-NOT SPECIFIED|Clerk#000000036|0|d platelets. slyly express requests print carefully across the quickl +13314|412|F|226838.60|1994-05-14|2-HIGH|Clerk#000000842|0|ajole stealthily even deposits. furiously express foxes was evenly r +13315|449|O|192954.51|1996-10-16|2-HIGH|Clerk#000000759|0|thinly ironic accoun +13316|1316|F|42308.46|1992-10-23|5-LOW|Clerk#000000555|0|tain even, pending instructions. quickly pending pinto beans sleep against the +13317|865|O|43720.88|1996-04-12|3-MEDIUM|Clerk#000000096|0|ggedly unusual packages along the carefully final +13318|325|O|247805.76|1997-06-11|4-NOT SPECIFIED|Clerk#000000381|0|ounts. sometimes ironic packages sleep stealthily. slyly regular accounts are +13319|425|O|138467.85|1996-01-19|1-URGENT|Clerk#000000158|0|ecial excuses boost. carefully regular asymptotes was acco +13344|367|O|90946.06|1997-03-27|4-NOT SPECIFIED|Clerk#000000924|0|de the quickly regular excuses. blithely express packages nod fur +13345|1339|F|136543.60|1992-09-03|4-NOT SPECIFIED|Clerk#000000876|0|thely special dolphins. slyly regular foxes sleep carefull +13346|1012|F|244898.42|1992-11-16|5-LOW|Clerk#000000594|0|thely bold foxes sleep final reque +13347|560|F|250026.98|1993-04-24|4-NOT SPECIFIED|Clerk#000000933|0|uriously against the carefully final foxes. carefully +13348|1267|F|94270.40|1993-11-08|3-MEDIUM|Clerk#000000878|0|ns doubt fluffily across the requests. even theodolites around the fluffi +13349|1454|F|91069.45|1994-09-20|2-HIGH|Clerk#000000916|0|usual courts haggle ruthlessly. final deposi +13350|1307|O|246713.06|1998-05-06|2-HIGH|Clerk#000000152|0|gular requests cajole quickl +13351|709|F|203403.50|1993-05-07|3-MEDIUM|Clerk#000000892|0|eposits haggle slowly alongside of +13376|1456|F|245552.88|1992-10-10|3-MEDIUM|Clerk#000000807|0| deposits. furiously regular packages unwind slyly bl +13377|394|O|60077.37|1995-07-19|2-HIGH|Clerk#000000094|0|ily along the bold deposits. carefully unusual accounts use quickl +13378|1151|F|207411.39|1994-09-22|5-LOW|Clerk#000000729|0|nis integrate; deposits wake bravely special frets. furiously expre +13379|286|F|107484.04|1993-11-08|5-LOW|Clerk#000000398|0|hely special dependencies. carefully unusual deposits are regularly. b +13380|934|F|129938.34|1994-07-16|1-URGENT|Clerk#000000683|0|ffy deposits haggle blithely. bold deposits amon +13381|1109|O|102850.64|1995-08-18|3-MEDIUM|Clerk#000000835|0|s platelets nod carefully. final, unusual deposits nag blith +13382|1207|O|64313.96|1995-11-02|4-NOT SPECIFIED|Clerk#000000427|0|kages. regular packages boost slyly alongside +13383|1346|F|165841.68|1992-06-16|4-NOT SPECIFIED|Clerk#000000258|0|pecial ideas boost stealthily about the regular, express pinto bean +13408|1370|F|211990.67|1994-02-15|5-LOW|Clerk#000000772|0| since the pinto beans. furiously pending accounts ru +13409|1279|F|46643.47|1993-07-14|4-NOT SPECIFIED|Clerk#000000002|0|n dependencies detect furi +13410|592|F|71187.66|1993-06-07|4-NOT SPECIFIED|Clerk#000000922|0|lly ironic braids are. quickly final gifts haggle si +13411|1376|F|130230.72|1994-04-13|2-HIGH|Clerk#000000179|0|l foxes. silent theodolit +13412|1240|O|115408.80|1997-07-12|1-URGENT|Clerk#000000124|0|lithely slow packages. packages past the ru +13413|473|F|231772.27|1993-01-30|1-URGENT|Clerk#000000565|0|ironic instructions. special instructions boost quick +13414|1333|O|143244.82|1995-07-07|3-MEDIUM|Clerk#000000693|0|across the blithely regular +13415|1222|O|271662.08|1997-05-31|2-HIGH|Clerk#000000851|0|ully. packages haggle slyly around the +13440|865|F|24449.73|1993-10-14|4-NOT SPECIFIED|Clerk#000000189|0|fily ironic accounts. quietly regular deposits among th +13441|1282|O|60048.20|1995-08-31|1-URGENT|Clerk#000000983|0|tes. blithely regular packages wake enticingly. quickly da +13442|238|O|138794.82|1997-08-06|4-NOT SPECIFIED|Clerk#000000830|0|p quickly fluffily +13443|545|F|216308.57|1993-10-07|3-MEDIUM|Clerk#000000379|0|uriously silent packages nag. ideas cajole quickly carefully regula +13444|176|F|304179.27|1992-01-06|2-HIGH|Clerk#000000199|0|. forges are carefully. furiously final packages are blithely ironic the +13445|682|O|21693.67|1997-12-24|4-NOT SPECIFIED|Clerk#000000599|0|quickly. excuses cajole. idly express packages cajole blithely pending pinto b +13446|484|O|55646.82|1996-02-29|1-URGENT|Clerk#000000050|0|lly regular requests. blithely express excuses integra +13447|244|F|72392.32|1993-01-09|2-HIGH|Clerk#000000925|0|ts. blithely ironic ideas accord +13472|814|O|69332.61|1995-10-27|1-URGENT|Clerk#000000454|0|uests. regular asymptotes haggle quickly aro +13473|655|O|192774.21|1996-03-22|5-LOW|Clerk#000000655|0|usual pinto beans haggle blithely at the carefully regular p +13474|1069|O|101285.14|1997-06-09|3-MEDIUM|Clerk#000000912|0|out the bold instructions. requests a +13475|1403|F|295575.64|1994-06-06|1-URGENT|Clerk#000000426|0|ake among the quickly express depo +13476|1459|F|264702.77|1993-10-17|4-NOT SPECIFIED|Clerk#000000203|0|r, permanent accounts. ironic, ironic packages dazzle at the +13477|1276|O|143935.11|1997-11-23|3-MEDIUM|Clerk#000000242|0|express instructions. regular ideas +13478|325|O|167211.22|1998-01-04|2-HIGH|Clerk#000000849|0|ajole ironic, stealthy theodolites. d +13479|1217|F|170168.00|1994-12-05|2-HIGH|Clerk#000000469|0|s the furiously regular accounts. blithely +13504|1495|O|126515.95|1997-06-18|2-HIGH|Clerk#000000486|0|ngly after the pending accounts. final instr +13505|286|O|219315.83|1997-06-03|3-MEDIUM|Clerk#000000880|0|sly against the furiously regular packages. care +13506|1099|O|111048.07|1995-07-22|5-LOW|Clerk#000000974|0|. slyly ironic requests among the +13507|923|F|117398.65|1992-12-30|3-MEDIUM|Clerk#000000127|0|. bold deposits affix furiously. furiously ironi +13508|802|O|2962.11|1997-04-17|4-NOT SPECIFIED|Clerk#000000951|0|accounts. blithely eve +13509|946|O|68465.06|1996-10-07|2-HIGH|Clerk#000000562|0|p. dolphins are. regular reques +13510|710|O|80383.62|1997-10-15|3-MEDIUM|Clerk#000000723|0|tions. slyly ironic in +13511|467|O|134751.21|1998-01-03|4-NOT SPECIFIED|Clerk#000000611|0|ly regular foxes are slyly furiously bold deposits. furiously fin +13536|316|F|192964.26|1994-08-19|3-MEDIUM|Clerk#000000262|0|posits. blithely final i +13537|430|F|26435.99|1993-05-31|5-LOW|Clerk#000000623|0|telets haggle carefully. quickly regular frays are! slyly regular pla +13538|782|O|65147.01|1997-02-01|2-HIGH|Clerk#000000598|0|lly alongside of the pending, unusual reque +13539|1231|O|190664.21|1997-02-13|3-MEDIUM|Clerk#000000022|0|ding dolphins use. final pinto beans +13540|460|F|277929.48|1993-05-24|2-HIGH|Clerk#000000994|0|. blithely even asymptotes poach blithely alongside of the doggedly un +13541|634|O|53890.86|1996-07-29|4-NOT SPECIFIED|Clerk#000000094|0| the furiously quick accounts. final packages nag +13542|1016|F|302527.26|1994-03-09|5-LOW|Clerk#000000170|0|ts are until the furiously +13543|790|F|24097.46|1992-08-09|3-MEDIUM|Clerk#000000636|0|l dependencies nag against the packages. expr +13568|31|F|81474.17|1993-05-07|5-LOW|Clerk#000000024|0|sts. carefully bold dolphins cajole across the even requ +13569|839|P|187147.11|1995-04-11|1-URGENT|Clerk#000000973|0|s? regular platelets cajole above the furiousl +13570|1468|F|226767.02|1992-12-03|4-NOT SPECIFIED|Clerk#000000602|0|e of the theodolites. slyly pending deposits between the regula +13571|1231|O|142142.08|1998-06-04|5-LOW|Clerk#000000452|0|ites? carefully regular +13572|1498|F|115177.91|1992-05-18|1-URGENT|Clerk#000000144|0|inal requests are regularly against th +13573|898|O|78389.93|1997-04-23|5-LOW|Clerk#000000144|0| slyly final packages. carefully e +13574|151|O|72886.11|1997-11-14|1-URGENT|Clerk#000000472|0|y above the fluffily final instructions. express +13575|349|F|92113.36|1992-08-30|1-URGENT|Clerk#000000008|0|! express, express instruct +13600|1129|F|124567.73|1993-07-11|4-NOT SPECIFIED|Clerk#000000910|0|lites boost furiously after the quickly ironic packages. carefully fina +13601|8|F|256717.52|1992-08-17|5-LOW|Clerk#000000608|0| ironic, special foxes- +13602|1348|F|284393.60|1994-01-14|5-LOW|Clerk#000000312|0|nusual packages cajole stealthily regular accounts. regular, +13603|496|O|198335.91|1997-06-09|4-NOT SPECIFIED|Clerk#000000777|0|nic deposits? blithely ironic packages do nag +13604|1141|F|280511.75|1994-02-03|4-NOT SPECIFIED|Clerk#000000798|0|p stealthily. requests thrash carefully. accounts wake furiously afte +13605|1388|O|201717.90|1996-06-14|3-MEDIUM|Clerk#000000099|0| regular depths use furiou +13606|160|F|209589.77|1994-04-27|4-NOT SPECIFIED|Clerk#000000310|0|eas. unusual courts haggle slyly ruthless realms. even, unusua +13607|358|F|210043.39|1993-11-19|1-URGENT|Clerk#000000366|0|es mold. blithely express packages integrate after the bold pinto beans. b +13632|1084|F|264841.12|1994-03-11|3-MEDIUM|Clerk#000000635|0|quickly special ideas use bravely bold, bold packag +13633|1373|F|173408.51|1992-04-04|4-NOT SPECIFIED|Clerk#000000419|0|ifts cajole quickly +13634|869|P|43165.51|1995-04-19|2-HIGH|Clerk#000000538|0|ain carefully according to t +13635|269|F|121071.76|1994-05-02|1-URGENT|Clerk#000000172|0|uctions thrash quickly. furiously regular requests about the n +13636|107|F|171401.11|1994-01-23|5-LOW|Clerk#000000855|0|gular ideas wake among th +13637|188|O|66820.97|1995-12-11|1-URGENT|Clerk#000000074|0| quickly ironic requests. care +13638|1361|O|327915.84|1995-10-01|2-HIGH|Clerk#000000261|0| ironic requests haggle quickly ironic packages. final +13639|1009|O|126608.97|1997-06-13|2-HIGH|Clerk#000000848|0|s cajole slyly doggedly ironic asymptotes. ca +13664|814|O|292106.85|1995-12-16|3-MEDIUM|Clerk#000000542|0|ely bold theodolites nag. pinto beans above the p +13665|1039|O|181151.79|1996-04-08|1-URGENT|Clerk#000000591|0|as wake even, pending requests +13666|445|F|59180.35|1992-03-03|4-NOT SPECIFIED|Clerk#000000031|0| the packages. ironi +13667|1216|O|208665.97|1996-12-04|2-HIGH|Clerk#000000893|0| ruthless ideas poach ironically-- unusual +13668|878|F|218731.00|1992-02-25|1-URGENT|Clerk#000000198|0|press ideas. blithely unusual instructions are blithely. carefully final pac +13669|454|O|178957.15|1996-08-15|3-MEDIUM|Clerk#000000955|0| instructions could have to cajol +13670|226|F|153065.25|1992-05-24|1-URGENT|Clerk#000000988|0|s haggle at the even platelets. even +13671|1291|O|218819.92|1996-07-14|1-URGENT|Clerk#000000321|0| blithely regular requests. furiously special idea +13696|722|O|118614.92|1997-08-28|5-LOW|Clerk#000000882|0|ag fluffily carefully even theodolite +13697|1457|O|103807.36|1998-04-06|4-NOT SPECIFIED|Clerk#000000473|0|st the blithely unusual foxes cajole fluf +13698|1483|F|155040.76|1994-08-05|4-NOT SPECIFIED|Clerk#000000640|0|iously bold deposits are carefully blithely unusual +13699|577|O|22846.00|1997-04-08|4-NOT SPECIFIED|Clerk#000000746|0|. ironically ironic foxes among the f +13700|1063|F|20210.10|1992-02-14|1-URGENT|Clerk#000000801|0|heodolites cajole blithely. blithely unusual de +13701|1270|O|222424.50|1998-05-18|2-HIGH|Clerk#000000270|0|final accounts wake furiously among the regular foxes. slyly bold t +13702|1132|O|51969.64|1995-09-11|5-LOW|Clerk#000000834|0|round the fluffily silen +13703|236|O|219200.99|1996-12-29|5-LOW|Clerk#000000778|0| quickly furiously regular accou +13728|4|O|123722.52|1995-12-11|2-HIGH|Clerk#000000094|0|theodolites. ironic deposits boost among the slyly regular instru +13729|79|F|88426.57|1994-01-02|4-NOT SPECIFIED|Clerk#000000866|0|y regular platelets +13730|952|F|36769.57|1995-05-10|2-HIGH|Clerk#000000826|0|- quickly even pinto beans boost fluffily ironic, even requests. ironic, u +13731|1475|F|209159.47|1993-05-10|4-NOT SPECIFIED|Clerk#000000549|0|beans detect boldly. sheaves after the eve +13732|605|F|166563.09|1992-11-28|1-URGENT|Clerk#000000599|0|uriously regular courts +13733|100|O|328307.40|1998-01-03|5-LOW|Clerk#000000431|0|e quickly express foxes. blithely ironic instructio +13734|124|O|156502.58|1996-08-14|2-HIGH|Clerk#000000344|0|n deposits should have to thrash fluffily quickly regu +13735|58|F|130804.16|1994-05-22|3-MEDIUM|Clerk#000000589|0|ccounts are slyly blithely final accounts. furiously final accounts w +13760|964|O|130352.76|1996-06-03|5-LOW|Clerk#000000053|0|s wake. blithely bold dependencies +13761|169|F|199387.32|1994-10-18|5-LOW|Clerk#000000226|0|ainst the quickly regular accounts. quickly en +13762|1337|F|210739.37|1993-06-22|3-MEDIUM|Clerk#000000053|0|re blithely ideas. blithely regular ideas haggle above the foxe +13763|1142|O|164241.80|1997-06-27|3-MEDIUM|Clerk#000000027|0|as affix carefully express ideas. carefully ironic asymptotes unwin +13764|598|O|122061.97|1995-07-14|3-MEDIUM|Clerk#000000236|0|ronic deposits? furiously re +13765|715|F|156724.02|1994-04-06|4-NOT SPECIFIED|Clerk#000000969|0|ronic theodolites will have to haggle except the slyl +13766|1387|F|45293.38|1992-10-19|1-URGENT|Clerk#000000274|0|boost unusual accounts. regular reques +13767|923|F|211468.27|1993-08-27|2-HIGH|Clerk#000000679|0|. thinly express dolphins sleep; slyly final instr +13792|1366|O|48602.86|1996-02-04|4-NOT SPECIFIED|Clerk#000000980|0|y slyly final foxes. slyly even ideas affix furiously dependencies. caref +13793|904|O|18039.82|1995-09-18|2-HIGH|Clerk#000000222|0|e blithely above the slyly pending ideas. furiously furious pl +13794|587|F|234351.58|1994-01-05|1-URGENT|Clerk#000000119|0|ages cajole furiously alongside of the slyly express ideas- +13795|1406|P|233445.40|1995-04-11|4-NOT SPECIFIED|Clerk#000000673|0|ld dolphins cajole quickly unusual instructions. +13796|1004|O|245467.47|1997-06-22|4-NOT SPECIFIED|Clerk#000000344|0|special deposits wake +13797|272|O|227061.71|1996-08-26|1-URGENT|Clerk#000000379|0|usly silent theodolites wake slyly across +13798|1298|O|123932.29|1996-02-12|1-URGENT|Clerk#000000778|0|fluffily special, bol +13799|994|F|142646.96|1993-12-02|1-URGENT|Clerk#000000945|0|g according to the regularly even requests. carefully bold accoun +13824|1096|F|115028.49|1994-12-28|5-LOW|Clerk#000000604|0|equests. slow, sly ideas cajole fu +13825|56|F|174217.02|1994-03-22|2-HIGH|Clerk#000000038|0|ests. slyly express pin +13826|232|O|160230.62|1997-02-22|3-MEDIUM|Clerk#000000053|0|ost packages. slyly pending requests are c +13827|479|F|44465.43|1993-06-21|5-LOW|Clerk#000000455|0|busily close requests. ironic, even pinto beans use furiously requests. c +13828|985|F|85589.73|1994-07-13|1-URGENT|Clerk#000000682|0| unusual instructions sleep quickly. packages +13829|1075|O|188654.94|1996-09-22|3-MEDIUM|Clerk#000000010|0|raids alongside of the quick +13830|598|F|169613.65|1994-12-22|2-HIGH|Clerk#000000693|0|impress. even, special requests alongside of the instructions cajole fu +13831|740|O|234924.78|1996-04-17|1-URGENT|Clerk#000000204|0|efully unusual theodolites s +13856|1156|O|154144.16|1997-11-28|4-NOT SPECIFIED|Clerk#000000601|0| special theodolites cajole fluffi +13857|275|O|9265.55|1995-08-15|1-URGENT|Clerk#000000012|0|uses boost furiously even +13858|1105|F|44168.23|1994-07-13|2-HIGH|Clerk#000000003|0| fluffily even, regular accounts. furiously permanent dependencies are. slyl +13859|221|O|228467.72|1997-01-09|4-NOT SPECIFIED|Clerk#000000630|0|; enticingly ironic deposits detect along the blithely bold +13860|454|F|61875.64|1994-09-25|3-MEDIUM|Clerk#000000878|0|ccounts nod carefully. express requests whithout the slyly regular in +13861|1249|F|223838.87|1993-08-12|2-HIGH|Clerk#000000153|0|ng requests. quickly ironic packages around th +13862|1240|O|233858.28|1997-09-03|3-MEDIUM|Clerk#000000838|0|odolites integrate carefully unusual requests. sly ideas are +13863|1399|F|132450.97|1992-05-31|2-HIGH|Clerk#000000471|0|y special deposits boost ca +13888|733|F|6632.13|1993-05-04|3-MEDIUM|Clerk#000000635|0|ly regular pinto beans boost about the sheav +13889|848|O|73735.52|1995-09-05|3-MEDIUM|Clerk#000000379|0|ng the silent foxes. even, quiet patterns about th +13890|34|O|50473.48|1996-05-25|5-LOW|Clerk#000000263|0|eposits along the fluffily final accounts wake final, pending foxe +13891|508|O|62430.54|1996-07-05|4-NOT SPECIFIED|Clerk#000000147|0|es are slyly. special packages use slyly against the theodolites. pa +13892|1013|F|216407.28|1992-04-28|2-HIGH|Clerk#000000365|0|ithely ironic packages sleep after the ruthless instructions. quickly dogged t +13893|289|O|132790.59|1998-04-12|2-HIGH|Clerk#000000931|0| blithely regular, unusual dep +13894|1246|F|125452.99|1992-04-11|3-MEDIUM|Clerk#000000524|0|y pending hockey players cajole fluffily special sentiments. closely ironic +13895|671|F|225938.31|1993-11-21|2-HIGH|Clerk#000000381|0|across the fluffily even accounts. carefully silent ideas wake. blithe +13920|37|F|155193.67|1994-10-10|1-URGENT|Clerk#000000060|0| unusual deposits sleep blithely +13921|49|O|152288.97|1997-08-19|4-NOT SPECIFIED|Clerk#000000358|0|elets doubt against the slyly final +13922|241|O|252983.77|1995-08-03|2-HIGH|Clerk#000000301|0|requests use ironic de +13923|1000|F|155909.13|1992-07-09|2-HIGH|Clerk#000000189|0|s. regular packages +13924|328|F|3658.90|1994-12-20|2-HIGH|Clerk#000000251|0|haggle quickly ironic platelets. even tithes wake blit +13925|73|O|162158.06|1997-01-06|1-URGENT|Clerk#000000303|0|uriously ironic accounts around the never regular packages +13926|49|O|52124.55|1997-07-13|4-NOT SPECIFIED|Clerk#000000881|0|ages haggle furiously bold, final accounts. special foxes +13927|562|F|121815.82|1994-08-27|5-LOW|Clerk#000000534|0|lar, silent packages wake quickly +13952|571|O|115051.12|1997-04-25|4-NOT SPECIFIED|Clerk#000000896|0|ly ironic pinto beans. furiously even accounts haggle carefully accordi +13953|388|O|233895.85|1995-06-01|1-URGENT|Clerk#000000337|0|riously deposits. blithely +13954|775|O|132924.82|1996-05-02|5-LOW|Clerk#000000809|0|t furiously above the final requ +13955|1409|O|161957.19|1998-05-12|2-HIGH|Clerk#000000359|0|ar foxes. packages nag blithely fina +13956|716|P|107050.72|1995-03-13|1-URGENT|Clerk#000000062|0|e final deposits are according to the regula +13957|475|O|176779.20|1995-07-22|4-NOT SPECIFIED|Clerk#000000019|0|mpress carefully slyly even requests. blithely pending t +13958|616|F|52000.53|1993-01-24|5-LOW|Clerk#000000863|0|ly. carefully special accounts among the slyly express requests sleep afte +13959|451|F|99030.36|1994-04-05|3-MEDIUM|Clerk#000000952|0|efully bold requests above the busy, express deposits use express p +13984|401|F|197913.83|1992-09-25|5-LOW|Clerk#000000750|0|final, special foxes. carefully express theodolites boost ne +13985|397|O|174830.89|1998-06-14|2-HIGH|Clerk#000000876|0|old accounts wake instructions. furiously ironic requests use quickly. quickl +13986|1333|O|103675.53|1995-10-12|2-HIGH|Clerk#000000793|0|riously final foxes. fur +13987|643|O|64387.39|1998-04-14|4-NOT SPECIFIED|Clerk#000000268|0|es. furiously even +13988|53|F|114321.03|1992-08-02|4-NOT SPECIFIED|Clerk#000000556|0|le daring packages. final, final escapades cajole expre +13989|1480|O|189523.80|1997-07-06|5-LOW|Clerk#000000996|0|ate about the bold, express packages. closely brave accou +13990|751|O|143454.90|1998-02-07|1-URGENT|Clerk#000000683|0| slyly according to the furiously spe +13991|1204|F|261061.37|1992-03-07|2-HIGH|Clerk#000000245|0|nic, special accounts. quickly pending accounts wake +14016|1145|F|201366.56|1992-07-12|5-LOW|Clerk#000000150|0|ymptotes: packages around the +14017|1033|F|142714.54|1994-03-08|2-HIGH|Clerk#000000238|0|unusual deposits sleep furiously +14018|367|F|101182.03|1993-06-07|2-HIGH|Clerk#000000376|0|uctions. pending instructions cajole about th +14019|184|O|216427.67|1997-09-08|1-URGENT|Clerk#000000961|0|tect fluffily final pac +14020|841|O|75424.30|1998-01-29|2-HIGH|Clerk#000000275|0|aggle quickly along the blithely bold ins +14021|62|P|206447.05|1995-03-08|2-HIGH|Clerk#000000467|0|sly. carefully regular +14022|685|F|71271.43|1995-02-14|2-HIGH|Clerk#000000732|0|es. quickly express deposits nag across the iron +14023|787|F|127450.06|1993-02-21|4-NOT SPECIFIED|Clerk#000000349|0|ironic, regular dugouts +14048|1016|F|221205.20|1993-05-18|4-NOT SPECIFIED|Clerk#000000548|0|s. blithely even asy +14049|952|O|70228.24|1996-01-29|5-LOW|Clerk#000000189|0|yly express epitaphs are slyly express depo +14050|88|O|161689.12|1997-08-22|5-LOW|Clerk#000000283|0|en courts. carefully express packages +14051|599|F|22238.93|1993-09-17|4-NOT SPECIFIED|Clerk#000000098|0|ss blithely among the closely r +14052|1190|F|23078.95|1995-02-07|4-NOT SPECIFIED|Clerk#000000647|0|mong the regular foxes boost blithely special pinto beans. furious +14053|1453|F|25549.20|1993-02-09|2-HIGH|Clerk#000000597|0| carefully ironic courts sleep quickly pending, pending packag +14054|517|O|285667.97|1996-01-11|4-NOT SPECIFIED|Clerk#000000890|0|unusual waters above the dependencies cajole r +14055|904|F|90239.70|1994-09-02|2-HIGH|Clerk#000000825|0|ounts. carefully final somas unwind fluffily. +14080|791|O|62517.87|1998-05-29|4-NOT SPECIFIED|Clerk#000000106|0|nic packages use final, bold +14081|895|F|114279.17|1993-10-07|2-HIGH|Clerk#000000857|0|uests. fluffily final packages wake slow, ironic dep +14082|875|O|48224.95|1998-05-08|4-NOT SPECIFIED|Clerk#000000700|0|bove the sometimes even deposits. ruthlessly unusual deposit +14083|464|F|11732.48|1994-08-16|4-NOT SPECIFIED|Clerk#000000420|0| quickly ruthless a +14084|647|O|303760.75|1995-08-03|4-NOT SPECIFIED|Clerk#000000160|0|luffily above the final packages. requests +14085|895|F|136353.74|1994-02-05|2-HIGH|Clerk#000000503|0|eas boost carefully evenly pending requests-- furiously thin accounts +14086|346|F|54201.92|1993-10-21|5-LOW|Clerk#000000289|0|ial deposits sleep. express requests nag carefull +14087|275|O|208589.10|1997-02-12|5-LOW|Clerk#000000927|0|dependencies. quickly ironic frets above the fluffily ironic accounts use +14112|112|F|20742.84|1994-07-25|5-LOW|Clerk#000000463|0|ickly dogged accounts breach doggedly +14113|835|O|27091.83|1995-08-05|2-HIGH|Clerk#000000885|0|; carefully pending accounts use among the pending packag +14114|895|F|171306.58|1994-04-07|1-URGENT|Clerk#000000397|0|beans play regular, ironic deposits. instructio +14115|46|F|68488.60|1994-08-15|4-NOT SPECIFIED|Clerk#000000493|0|ckages sleep across the regular, silent pinto beans. bold, un +14116|1291|O|192210.86|1995-10-10|2-HIGH|Clerk#000000065|0|. carefully bold ideas sleep. carefully bold idea +14117|1297|F|281939.12|1993-08-26|4-NOT SPECIFIED|Clerk#000000480|0|uickly ironic ideas boost among the furiously pending deposits. +14118|385|F|41143.91|1993-05-23|4-NOT SPECIFIED|Clerk#000000730|0| toward the express, unusual instructions sleep accordin +14119|482|F|203405.63|1993-06-01|5-LOW|Clerk#000000989|0|osits. furiously pending accounts across the slyly +14144|301|O|308016.67|1997-04-26|1-URGENT|Clerk#000000089|0|nusual instructions sleep. blithely silent requests thr +14145|7|O|270751.41|1997-04-17|1-URGENT|Clerk#000000920|0|x carefully ideas. evenly silent +14146|592|O|108225.88|1996-01-03|3-MEDIUM|Clerk#000000968|0|xpress accounts. even packages about the pen +14147|728|F|262030.95|1993-03-08|4-NOT SPECIFIED|Clerk#000000152|0|, special epitaphs haggle a +14148|965|O|130798.36|1998-04-30|3-MEDIUM|Clerk#000000188|0|ag carefully special foxes. carefully unus +14149|73|O|157174.97|1998-01-28|1-URGENT|Clerk#000000303|0|ests. ironic, special pinto beans try to print slyly along the pending +14150|89|F|196189.74|1994-02-09|2-HIGH|Clerk#000000695|0|y ironic accounts haggle across the furi +14151|1418|O|286984.16|1997-06-06|4-NOT SPECIFIED|Clerk#000000278|0|special accounts. blithely express deposits cajole slyly slyly ex +14176|991|F|141050.11|1994-03-13|5-LOW|Clerk#000000407|0|eodolites. slyly final platelets ca +14177|565|F|112612.65|1992-04-03|5-LOW|Clerk#000000442|0|nooze carefully slyly final packages. platelets about the q +14178|391|F|11236.45|1995-01-01|4-NOT SPECIFIED|Clerk#000000246|0| quick accounts nag carefully. regular accounts could +14179|458|O|384265.43|1997-09-07|1-URGENT|Clerk#000000053|0|about the bold, final pinto bean +14180|292|O|187330.32|1997-05-25|3-MEDIUM|Clerk#000000478|0|out the carefully regular accoun +14181|94|O|226844.98|1998-02-13|3-MEDIUM|Clerk#000000106|0|efully even depende +14182|934|F|68283.44|1994-06-23|5-LOW|Clerk#000000791|0|arefully. sentiments integrate +14183|875|O|85725.94|1997-03-17|5-LOW|Clerk#000000052|0| final requests detect slyly at the +14208|385|O|121214.10|1995-05-01|4-NOT SPECIFIED|Clerk#000000758|0|sly slyly silent requests. carefully special accounts sleep +14209|1025|O|137491.26|1996-11-04|2-HIGH|Clerk#000000211|0|leep slyly against the carefully bold dolphins. +14210|25|F|23549.76|1992-06-27|4-NOT SPECIFIED|Clerk#000000356|0|atelets nag carefully final foxes. ironic, silent +14211|1202|F|189400.90|1994-02-13|4-NOT SPECIFIED|Clerk#000000937|0|the blithely bold deposits are according to the accounts. f +14212|806|F|196439.01|1992-02-17|1-URGENT|Clerk#000000384|0| packages affix special deposits? carefully special pinto bean +14213|478|F|50949.10|1993-12-28|1-URGENT|Clerk#000000959|0|, careful platelets abo +14214|79|O|128802.82|1997-08-15|1-URGENT|Clerk#000000891|0|thely unusual pinto beans against the blithely special warhorses hagg +14215|1408|F|50568.60|1992-07-14|3-MEDIUM|Clerk#000000823|0|ounts haggle furiously. special gifts am +14240|689|F|210064.90|1992-02-18|2-HIGH|Clerk#000000728|0|sly. express, unusual asymptotes across the never fin +14241|928|F|153112.39|1992-06-15|1-URGENT|Clerk#000000866|0|c packages. instructions a +14242|913|P|115246.93|1995-05-09|2-HIGH|Clerk#000000927|0|d have to haggle according +14243|1073|O|63765.25|1997-02-15|3-MEDIUM|Clerk#000000943|0|sly ironic foxes nag carefully along t +14244|205|O|53072.12|1998-03-05|5-LOW|Clerk#000000139|0|press excuses doubt permanently. +14245|1309|F|73717.72|1993-02-12|1-URGENT|Clerk#000000975|0|furiously final foxes boost silent, final requests. slyly unusual deposi +14246|289|O|133280.40|1997-10-10|4-NOT SPECIFIED|Clerk#000000806|0| bold pinto beans. regular accounts +14247|671|O|219431.33|1995-08-17|1-URGENT|Clerk#000000531|0|ests haggle furiously about the pa +14272|1348|F|97840.61|1992-02-13|3-MEDIUM|Clerk#000000075|0|ses. blithely final deposits are. stealthy accounts engage. slyly +14273|1033|O|90555.37|1996-03-13|5-LOW|Clerk#000000938|0| special foxes lose quickly; fina +14274|565|F|244782.98|1994-01-07|4-NOT SPECIFIED|Clerk#000000564|0|nt requests are furiously furiously daring accounts. even +14275|1412|F|168905.36|1993-06-14|5-LOW|Clerk#000000789|0|furiously. slyly pending packages sublate furious +14276|499|F|241009.94|1994-06-19|3-MEDIUM|Clerk#000000149|0|ly bold requests haggle slyly according to the closely +14277|946|O|116805.58|1998-02-14|4-NOT SPECIFIED|Clerk#000000951|0|eep. thin theodolites are bl +14278|559|O|266421.62|1998-06-03|2-HIGH|Clerk#000000768|0|jole slyly ironic theodolites. carefully even deposi +14279|1117|O|157844.27|1998-02-09|2-HIGH|Clerk#000000441|0| after the furiously unusual realms. +14304|788|O|215723.64|1997-11-13|3-MEDIUM|Clerk#000000488|0|egular requests affix. even requ +14305|1427|O|80794.79|1996-07-23|1-URGENT|Clerk#000000396|0|mas cajole above the +14306|587|F|27239.18|1993-10-30|4-NOT SPECIFIED|Clerk#000000981|0|furiously regular e +14307|484|O|178901.14|1997-06-24|1-URGENT|Clerk#000000255|0| deposits wake. regular, special excuses us +14308|5|O|132817.36|1997-08-11|3-MEDIUM|Clerk#000000354|0|iously. packages wake according to the furio +14309|1382|F|103342.31|1994-01-31|1-URGENT|Clerk#000000753|0|s haggle furiously against the carefully final asymptotes. blith +14310|1393|O|59609.50|1997-09-13|5-LOW|Clerk#000000627|0|p furiously evenly final requests. even, ironic excuses are +14311|1412|F|46918.86|1994-08-02|1-URGENT|Clerk#000000916|0|nic pinto beans along the enticingly final reque +14336|760|F|172716.15|1994-11-19|2-HIGH|Clerk#000000699|0|eodolites cajole carefully. quickly ironic foxes about the fluffily ironic +14337|299|O|280177.62|1997-10-09|4-NOT SPECIFIED|Clerk#000000949|0| special ideas into the silently quick dep +14338|752|F|97316.04|1993-02-01|5-LOW|Clerk#000000658|0|l accounts. quickly special packages h +14339|1199|O|209018.11|1997-07-23|4-NOT SPECIFIED|Clerk#000000303|0|ar theodolites after the express, final pinto beans engage car +14340|391|O|222337.16|1995-10-13|5-LOW|Clerk#000000386|0|theodolites. furiously ironic pinto beans are busily +14341|667|F|197341.53|1993-09-03|4-NOT SPECIFIED|Clerk#000000669|0|lphins cajole furiously after the c +14342|160|F|137933.49|1994-04-28|5-LOW|Clerk#000000040|0| haggle quickly. bold excuses against the regular re +14343|1408|O|58414.89|1996-02-25|3-MEDIUM|Clerk#000000792|0| unusual deposits wake slyly even, even packages. slyly final depe +14368|676|O|121598.53|1995-09-11|2-HIGH|Clerk#000000228|0|ly express requests affix furiously. ironically final asymptotes according +14369|1357|O|272333.98|1996-11-26|1-URGENT|Clerk#000000063|0|sublate quickly furiously bold asymptot +14370|958|O|163080.52|1997-05-03|2-HIGH|Clerk#000000475|0|ly regular accounts. fluffil +14371|1192|F|116441.72|1993-06-23|2-HIGH|Clerk#000000831|0|. carefully express packages at th +14372|523|F|166914.23|1992-10-24|1-URGENT|Clerk#000000449|0|y. ironic deposits sleep? finally special pinto bean +14373|511|F|53131.83|1993-09-18|3-MEDIUM|Clerk#000000099|0|nto beans. fluffy requests affix bravely fluffily iron +14374|1180|O|121655.04|1995-05-17|1-URGENT|Clerk#000000237|0|ross the blithely final deposits. asymptotes are. slyl +14375|733|F|140929.00|1993-02-01|3-MEDIUM|Clerk#000000046|0|ans sleep. blithely regular foxes cajole before the ironic packa +14400|632|F|262307.57|1994-02-05|3-MEDIUM|Clerk#000000479|0|uests. furiously unusual platelets hinder final packages. bold +14401|1489|O|156911.31|1995-08-05|4-NOT SPECIFIED|Clerk#000000059|0|ly carefully even instructions. epitaphs solve instructions! bli +14402|838|F|109228.63|1993-10-15|3-MEDIUM|Clerk#000000672|0|azzle slyly. carefully regular instructions affix carefully deposits. careful +14403|241|O|120881.79|1998-03-02|4-NOT SPECIFIED|Clerk#000000202|0|hely packages. blithely pending dependencies wake furiously +14404|7|O|354885.81|1996-11-03|5-LOW|Clerk#000000657|0| the furiously unus +14405|269|O|94417.57|1996-04-24|5-LOW|Clerk#000000460|0| beans until the final, regular theodolites +14406|409|F|194997.99|1993-03-09|3-MEDIUM|Clerk#000000623|0|s. excuses boost bl +14407|952|F|21880.64|1993-11-05|2-HIGH|Clerk#000000124|0|cajole ruthless theodolites. carefully ironic req +14432|1226|O|44225.65|1996-11-12|4-NOT SPECIFIED|Clerk#000000784|0|re carefully against the fluffily final theodolites. furiously unusual d +14433|1082|O|203663.86|1996-05-13|2-HIGH|Clerk#000000011|0|es. furiously final deposits wake b +14434|1015|F|171433.55|1995-02-16|4-NOT SPECIFIED|Clerk#000000769|0|he unusual pinto beans. special realms cajole. quietly blith +14435|269|F|190900.78|1992-12-02|4-NOT SPECIFIED|Clerk#000000308|0|quests nag. final platelets haggle among the st +14436|658|F|231251.51|1994-03-13|5-LOW|Clerk#000000906|0|regular requests run furiously. unusual, +14437|721|F|285484.64|1994-05-15|1-URGENT|Clerk#000000348|0|refully even excuses alongside of the packages are busily final +14438|1117|O|107298.91|1995-08-23|3-MEDIUM|Clerk#000000059|0| the silent ideas wake after the express requests. unusual, final inst +14439|523|F|4033.74|1992-08-31|2-HIGH|Clerk#000000944|0|riously even courts. ev +14464|1429|O|43902.48|1998-01-23|5-LOW|Clerk#000000197|0| blithely. special deposits +14465|617|F|108913.02|1994-06-12|2-HIGH|Clerk#000000816|0|ndencies nag against the furiously special pin +14466|353|O|19731.95|1996-05-22|3-MEDIUM|Clerk#000000795|0|lithely after the slyly special deposits-- quickly regular gifts acros +14467|1126|O|160773.46|1996-05-31|4-NOT SPECIFIED|Clerk#000000927|0|regular, brave foxes +14468|716|O|60718.43|1998-07-13|3-MEDIUM|Clerk#000000164|0|g pinto beans after the special accounts sleep carefully after the regula +14469|1076|O|82731.79|1997-02-01|2-HIGH|Clerk#000000837|0|ep regular, final accounts? fluffily pending the +14470|949|F|140145.86|1995-01-25|3-MEDIUM|Clerk#000000018|0| asymptotes cajole carefully final a +14471|94|P|324194.82|1995-05-27|4-NOT SPECIFIED|Clerk#000001000|0|l pinto beans ought to nag carefully carefully ironic foxes. +14496|1153|O|206156.59|1996-04-11|3-MEDIUM|Clerk#000000350|0|g theodolites eat c +14497|1492|F|130424.80|1992-05-21|3-MEDIUM|Clerk#000000053|0|symptotes. slyly fluffy excuses ought to wake according to the slyly even de +14498|115|O|172949.99|1996-10-05|3-MEDIUM|Clerk#000000709|0| deposits! quickly pend +14499|361|F|306903.43|1993-11-15|5-LOW|Clerk#000000358|0|packages. carefully final ide +14500|1222|O|100773.58|1995-06-25|4-NOT SPECIFIED|Clerk#000000451|0| slyly regular ideas haggle slyly unusual packages. quickly unusual pinto +14501|607|O|83186.27|1997-08-31|2-HIGH|Clerk#000000826|0|e ideas. ironic deposits sleep according to the blithely ironi +14502|799|O|87836.22|1996-07-21|2-HIGH|Clerk#000000875|0| furiously ironic deposits cajole around the carefully silent accounts. expre +14503|671|F|198098.70|1995-02-06|4-NOT SPECIFIED|Clerk#000000519|0|ely regular depths haggle carefull +14528|334|F|155412.29|1994-06-16|1-URGENT|Clerk#000000568|0|gle instead of the carefully pending pinto beans. express, ex +14529|1372|F|193341.12|1993-09-21|5-LOW|Clerk#000000521|0|arefully unusual packages haggle carefully slyly final pinto beans. exp +14530|133|F|240313.77|1994-04-07|2-HIGH|Clerk#000000444|0|eodolites may wake final requests. furious +14531|1331|O|222583.58|1997-06-11|2-HIGH|Clerk#000000003|0|across the blithely even instructions. carefull +14532|1252|O|15069.98|1996-04-17|5-LOW|Clerk#000000906|0|ep furiously according to the quickly final deposits. reg +14533|43|O|161212.58|1996-05-06|4-NOT SPECIFIED|Clerk#000000394|0|ans alongside of the carefully ironic re +14534|1414|F|248752.30|1993-07-19|3-MEDIUM|Clerk#000000324|0|furiously. silent foxes boost finally. dependencies among the furiously fi +14535|1306|F|95671.80|1993-10-02|4-NOT SPECIFIED|Clerk#000000983|0|thely unusual accounts are fluffi +14560|1258|O|33048.76|1997-12-15|3-MEDIUM|Clerk#000000587|0|ckages grow furiously-- carefully final foxes according +14561|697|O|274551.87|1998-06-29|3-MEDIUM|Clerk#000000840|0|onic accounts. even, express excuses cajole carefully. bl +14562|973|O|150256.16|1996-07-20|5-LOW|Clerk#000000189|0|ve the blithely even dependencies-- quickly busy realms wake quickly. permane +14563|568|O|236613.87|1995-12-03|1-URGENT|Clerk#000000904|0|quests. quickly even theodolites nag blit +14564|520|F|1358.25|1993-05-22|4-NOT SPECIFIED|Clerk#000000799|0|carefully even deposits. furiously express acco +14565|1301|O|50022.91|1997-11-23|1-URGENT|Clerk#000000409|0| special foxes. blithely ironic ideas sleep carefully quietly final instruct +14566|1480|O|221337.42|1996-10-25|3-MEDIUM|Clerk#000000118|0|ns? slyly regular theodolites haggle quickly. fluffily bol +14567|1060|O|176372.95|1996-10-18|1-URGENT|Clerk#000000527|0|efully blithe excuses. slyly regular ideas promise. escapad +14592|926|O|93588.02|1995-07-06|3-MEDIUM|Clerk#000000402|0|ts affix alongside of the blithely ironic pinto beans. +14593|184|O|61820.82|1998-01-23|1-URGENT|Clerk#000000880|0| dependencies. slyly +14594|143|F|16529.84|1993-09-07|3-MEDIUM|Clerk#000000022|0| across the carefull +14595|202|O|32654.01|1997-12-03|3-MEDIUM|Clerk#000000854|0|kages. asymptotes dazzle. final, bold pinto be +14596|1198|F|167802.21|1994-01-11|1-URGENT|Clerk#000000754|0| even accounts above the furiously brave dep +14597|1192|F|293673.06|1993-08-31|1-URGENT|Clerk#000000768|0|haggle ironic, quick accounts. quickly special foxes nag slyly above the furi +14598|898|O|171449.52|1998-02-10|4-NOT SPECIFIED|Clerk#000000229|0|slyly even deposits are carefully. final, pe +14599|814|F|13810.80|1992-05-09|2-HIGH|Clerk#000000704|0|ke final theodolites +14624|1177|O|210247.47|1998-04-17|4-NOT SPECIFIED|Clerk#000000014|0|heodolites. quickly regular theodolites haggle ag +14625|1075|F|2059.98|1992-02-12|1-URGENT|Clerk#000000491|0|instructions play blithely? silent excuses snooze quick +14626|1453|O|118335.57|1997-08-12|3-MEDIUM|Clerk#000000450|0|egular platelets are. even requ +14627|679|F|212366.75|1994-02-05|3-MEDIUM|Clerk#000000520|0|quickly according to the b +14628|668|F|75317.77|1993-06-07|3-MEDIUM|Clerk#000000076|0|accounts hang furiously. furiously regular theodolites +14629|1469|F|78503.51|1993-01-08|2-HIGH|Clerk#000000344|0|uests sleep quickly. furiously ironic accounts against the quickly ironic id +14630|277|F|189160.54|1992-10-17|5-LOW|Clerk#000000575|0| theodolites. carefully +14631|1291|O|34502.66|1997-04-14|2-HIGH|Clerk#000000022|0|ly above the pendin +14656|1|O|28599.83|1997-11-18|2-HIGH|Clerk#000000270|0|uests. blithely even platelet +14657|370|F|116160.53|1994-02-28|1-URGENT|Clerk#000000756|0|ly across the ironic, ironic instructions. bold ideas +14658|1381|F|48274.02|1994-04-07|1-URGENT|Clerk#000000175|0|kly regular requests? regular theod +14659|25|O|145504.68|1998-02-10|3-MEDIUM|Clerk#000000260|0|l, ironic attainment +14660|899|O|139267.14|1997-05-24|4-NOT SPECIFIED|Clerk#000000605|0|c pinto beans. fluff +14661|1468|F|38295.53|1993-01-25|4-NOT SPECIFIED|Clerk#000000429|0| believe. silent packages haggle express instructio +14662|1330|O|200128.12|1995-11-17|2-HIGH|Clerk#000000988|0|efully pending accounts about the bold +14663|592|F|42406.05|1992-11-17|1-URGENT|Clerk#000000596|0|ietly above the packages. regular frets haggle slyly blithely regular pinto b +14688|427|O|127535.78|1997-02-18|5-LOW|Clerk#000000822|0|unusual, bold deposits. furiously bold ideas cajole fluffily ironic theodo +14689|226|O|68912.05|1998-07-31|2-HIGH|Clerk#000000100|0|quickly regular realms are along the carefully spe +14690|935|O|41205.72|1997-05-24|1-URGENT|Clerk#000000342|0|ic packages affix sly +14691|1381|O|81185.28|1998-04-11|5-LOW|Clerk#000000211|0|ffily even instructions use blithely. careful +14692|478|O|53591.54|1996-02-27|5-LOW|Clerk#000000309|0|xpress deposits wake slyly after the deposits. slyly re +14693|67|F|246072.95|1995-01-10|1-URGENT|Clerk#000000039|0|to beans. Tiresias above the special, bold packages sleep +14694|379|O|318967.92|1998-07-28|1-URGENT|Clerk#000000742|0|nic pinto beans sleep blithely pending, unusual somas. blithely ironic id +14695|1406|F|205288.40|1992-09-06|2-HIGH|Clerk#000000475|0|. ideas boost carefully around the even, final instruc +14720|401|F|171435.70|1993-09-05|3-MEDIUM|Clerk#000000354|0|ongside of the quickly final excuses sleep quickly dolphins. dinos +14721|1087|O|166081.83|1997-05-05|4-NOT SPECIFIED|Clerk#000000701|0|instructions haggle slyly. +14722|742|O|264702.15|1997-05-28|5-LOW|Clerk#000000048|0|blithely bold requests ar +14723|1282|O|40317.37|1997-01-04|5-LOW|Clerk#000000822|0|ic deposits affix carefully above th +14724|1396|O|41941.26|1995-11-18|1-URGENT|Clerk#000000886|0|bold dependencies about the busy instructions haggle regular ins +14725|569|O|261801.45|1995-06-17|2-HIGH|Clerk#000000177|0|ng asymptotes. final, ironic accounts cajole after +14726|1279|F|93802.35|1992-01-09|5-LOW|Clerk#000000590|0| foxes. deposits cajole blithely even grouches. b +14727|316|F|102382.66|1992-07-20|3-MEDIUM|Clerk#000000383|0|structions. daringly even packages wake slyly final requests. c +14752|1051|F|31543.83|1994-01-30|5-LOW|Clerk#000000802|0|. carefully regular pinto beans grow idly abou +14753|1118|O|45387.36|1997-01-05|1-URGENT|Clerk#000000855|0|n deposits across the +14754|86|O|112289.25|1996-06-23|3-MEDIUM|Clerk#000000283|0|ns. quickly ironic packages sleep furiously fluffily unusual excuses. de +14755|592|F|358175.60|1993-01-06|2-HIGH|Clerk#000000867|0|egular requests sleep careful packages. quickly r +14756|328|F|132718.02|1994-09-01|5-LOW|Clerk#000000491|0|olites. ironic, final instructions pro +14757|1420|O|55954.21|1997-12-24|4-NOT SPECIFIED|Clerk#000000011|0|ggle furiously. carefully special packages are c +14758|1225|F|37812.49|1993-10-27|2-HIGH|Clerk#000000687|0|ages nag about the furio +14759|70|O|40915.46|1997-01-05|3-MEDIUM|Clerk#000000034|0|he dolphins. ruthlessly regular packages play carefully. f +14784|1036|F|188067.67|1992-03-15|3-MEDIUM|Clerk#000000479|0|lyly final theodoli +14785|1249|F|107683.78|1994-10-10|2-HIGH|Clerk#000000446|0| slyly about the quickly sp +14786|1255|O|34058.87|1997-04-08|2-HIGH|Clerk#000000656|0|e carefully special deposits can nag blithely express, express accounts +14787|578|O|135287.72|1998-07-19|5-LOW|Clerk#000000522|0|deas against the blithely r +14788|1192|O|51229.59|1997-10-23|1-URGENT|Clerk#000000647|0|e the slyly pending deposits. c +14789|451|F|214256.97|1993-11-30|4-NOT SPECIFIED|Clerk#000000616|0|st furiously about the ca +14790|613|O|270163.54|1996-08-21|2-HIGH|Clerk#000000347|0|p. regular deposits wake. final n +14791|289|F|86492.66|1993-02-15|3-MEDIUM|Clerk#000000770|0|ideas wake blithely regularly regular requests. s +14816|508|F|89977.38|1993-07-15|4-NOT SPECIFIED|Clerk#000000721|0| requests. slyly even requests haggle? unusual, regula +14817|235|F|138541.57|1992-07-28|3-MEDIUM|Clerk#000000963|0|arefully unusual dolphins. furiously final accounts above the slyly +14818|643|O|182026.46|1996-11-18|4-NOT SPECIFIED|Clerk#000000588|0|totes. bold, final requests are according to the deposits. quickly regular +14819|473|F|141776.24|1993-01-26|4-NOT SPECIFIED|Clerk#000000641|0| permanent deposits. blithely final warthogs x-ray blithely slyly ir +14820|1135|F|160021.51|1992-01-10|2-HIGH|Clerk#000000090|0|posits. regular pinto beans detect carefully at the final pinto beans. unu +14821|1435|O|322002.95|1998-06-12|2-HIGH|Clerk#000000630|0|n packages are furiously ironic ideas. d +14822|473|O|182443.15|1996-03-26|2-HIGH|Clerk#000000675|0|es. even, special request +14823|832|F|190065.85|1994-02-13|5-LOW|Clerk#000000844|0| slyly final accounts: packages integrate quickly along the packages +14848|256|O|115009.62|1996-10-17|5-LOW|Clerk#000000567|0|warthogs use furiously across the +14849|739|O|82597.02|1997-02-07|3-MEDIUM|Clerk#000000123|0| cajole fluffily against the final, reg +14850|1348|O|227401.85|1997-12-04|1-URGENT|Clerk#000000960|0| quickly regular braids. ironic, regular accounts are carefully +14851|175|F|229811.50|1992-05-12|4-NOT SPECIFIED|Clerk#000000075|0|. blithely regular requests wake blithely after the furiously final accou +14852|1060|O|34634.76|1995-12-25|3-MEDIUM|Clerk#000000907|0|ages haggle accounts. careful, ironic excuses sleep quickly dogged asymptotes +14853|458|O|152920.35|1996-09-10|5-LOW|Clerk#000000036|0|ding instructions about the quickly pending requests sleep quickly iro +14854|472|F|75626.15|1993-04-29|5-LOW|Clerk#000000872|0|ronic pinto beans? even deposits nag c +14855|836|F|141609.96|1993-05-01|4-NOT SPECIFIED|Clerk#000000655|0|nent accounts sleep dependencies. furiously regular ideas ca +14880|1210|O|209395.33|1997-11-23|4-NOT SPECIFIED|Clerk#000000545|0|equests above the foxes wake blithely about the packages: ironic ex +14881|23|O|126051.68|1996-10-20|2-HIGH|Clerk#000000826|0|ades past the fluffily ironic foxes m +14882|833|O|89650.26|1997-02-13|1-URGENT|Clerk#000000353|0|y against the slyly ironic accounts. blithely silent acc +14883|865|P|148947.38|1995-05-07|5-LOW|Clerk#000000543|0|detect blithely: carefully regular asymptotes caj +14884|1450|O|278225.35|1995-09-28|2-HIGH|Clerk#000000481|0| carefully ironic multipliers. furiously final deposits +14885|19|O|261263.74|1997-09-21|5-LOW|Clerk#000000462|0|p slyly regular excu +14886|337|F|84441.18|1994-06-23|3-MEDIUM|Clerk#000000757|0|slyly above the deposi +14887|245|O|124720.14|1996-03-25|2-HIGH|Clerk#000000176|0|he pinto beans boost slyly regular deposits. fi +14912|752|F|28125.10|1993-11-07|1-URGENT|Clerk#000000924|0| ideas cajole slyly around the ironic, bold asymptotes. +14913|1411|F|178192.17|1994-02-15|2-HIGH|Clerk#000000823|0|gainst the carefully final orbits hang furiously above t +14914|1199|O|191598.59|1998-02-08|1-URGENT|Clerk#000000536|0|e carefully carefully ironic requests: never final packag +14915|811|O|59911.87|1996-09-10|4-NOT SPECIFIED|Clerk#000000708|0| accounts are above the enticingly express pin +14916|380|F|72290.87|1994-02-28|5-LOW|Clerk#000000656|0|al requests solve slyly above the never express requests. furious +14917|1148|O|280961.18|1998-01-13|1-URGENT|Clerk#000000974|0|as would use fluffily after the +14918|884|O|68255.07|1997-06-01|5-LOW|Clerk#000000674|0|ets. bold, pending deposits sleep. foxes wake +14919|838|O|36633.03|1996-09-10|2-HIGH|Clerk#000000455|0|as. carefully final ideas cajole finally blithely express foxes. slow +14944|535|O|119586.69|1997-10-14|2-HIGH|Clerk#000000962|0|lly. even instructions against +14945|68|O|210519.05|1996-03-30|1-URGENT|Clerk#000000467|0|nts? fluffily bold grouches after +14946|580|O|100402.47|1996-11-12|1-URGENT|Clerk#000000116|0|ffily bold dependencies wake. furiously regular instructions aro +14947|4|O|165118.45|1995-07-30|5-LOW|Clerk#000000192|0| the quickly final platelets. quickly special theodolites haggle agains +14948|686|P|128640.22|1995-05-29|3-MEDIUM|Clerk#000000807|0|ing foxes snooze carefully. carefully bold +14949|340|F|154205.18|1993-11-01|1-URGENT|Clerk#000000234|0|osits wake alongside of +14950|1415|F|131858.34|1993-09-27|5-LOW|Clerk#000000304|0|furiously unusual foxes was furiously after the slyly even +14951|304|O|226085.18|1995-05-18|3-MEDIUM|Clerk#000000031|0|en, pending ideas. slyly bold depo +14976|88|O|187847.61|1995-07-23|2-HIGH|Clerk#000000837|0|dly even sauternes-- pending +14977|1475|O|67659.68|1997-11-19|3-MEDIUM|Clerk#000000902|0|ide of the slyly iron +14978|176|F|106372.86|1993-05-28|1-URGENT|Clerk#000000103|0|ts integrate fluffily. quickly unu +14979|934|O|90251.38|1996-06-19|4-NOT SPECIFIED|Clerk#000000519|0|bold ideas. final theodolites wake s +14980|1168|F|187807.67|1992-07-15|1-URGENT|Clerk#000000428|0|e always regular ideas. carefully final +14981|679|F|278178.31|1993-10-27|3-MEDIUM|Clerk#000000086|0| carefully even deposits along the even accounts wake quickly alongs +14982|1462|F|3197.07|1994-03-10|1-URGENT|Clerk#000000407|0|even notornis alongside of the pending packages boost quickl +14983|1009|F|238224.37|1994-02-12|2-HIGH|Clerk#000000055|0|s detect fluffily. fluffily final theodolites haggle blithely special +15008|965|O|42487.73|1997-12-06|3-MEDIUM|Clerk#000000718|0|ly careful packages haggle carefully. carefully unusual accounts doze sl +15009|1160|O|162376.16|1995-12-22|4-NOT SPECIFIED|Clerk#000000176|0|deas affix blithely. regular requests nag +15010|1151|F|175917.52|1993-11-23|5-LOW|Clerk#000000662|0|ounts. furiously regular +15011|1318|F|117642.93|1994-09-04|3-MEDIUM|Clerk#000000545|0|ickly bold ideas. final, regular forges wake +15012|1417|F|35675.73|1993-02-08|3-MEDIUM|Clerk#000000890|0|ly ironic instructions sleep furious +15013|1360|F|82310.25|1992-04-16|1-URGENT|Clerk#000000297|0|nst the ironic attainments. quickly ironic esc +15014|1282|F|151173.42|1993-02-11|3-MEDIUM|Clerk#000000766|0|ect carefully along the quickly unusual pinto beans. blithely express the +15015|1321|F|52032.41|1993-11-26|2-HIGH|Clerk#000000243|0| detect carefully furiously ironic packages. ir +15040|697|F|191918.16|1994-12-05|5-LOW|Clerk#000000691|0|special decoys-- accounts a +15041|1463|O|225501.83|1998-03-16|5-LOW|Clerk#000000231|0|ding packages according to the ironic deposits sleep blithely carefully even +15042|757|O|89493.80|1996-03-18|4-NOT SPECIFIED|Clerk#000000267|0|ke fluffily! silent, pending requests boost. always regular packages +15043|971|F|198367.20|1992-09-28|2-HIGH|Clerk#000000626|0|s the blithely regular requests. furiou +15044|1106|F|72322.74|1992-03-07|5-LOW|Clerk#000000743|0|packages across the quickly special tithes use silent excuses. blithely e +15045|434|F|238543.12|1993-08-21|4-NOT SPECIFIED|Clerk#000000836|0| the slyly unusual instructions. deposits integrate slyly. daring, +15046|577|O|239624.05|1997-09-07|3-MEDIUM|Clerk#000000018|0|ent accounts. furiously pending theodolites among the slyly furious warthog +15047|775|F|60470.55|1992-07-23|3-MEDIUM|Clerk#000000342|0|posits detect carefully. carefully final packages integrate. slyly unusual ide +15072|1411|O|284726.05|1997-02-26|1-URGENT|Clerk#000000217|0|age against the quickly ironic pains. carefully thin +15073|74|F|78728.25|1992-01-26|3-MEDIUM|Clerk#000000951|0|ts nag near the pending, bold accounts! pinto beans b +15074|580|F|127637.62|1994-11-29|4-NOT SPECIFIED|Clerk#000000239|0|ess accounts might sleep carefully. final, ironic accounts boost car +15075|133|F|215736.81|1994-10-05|3-MEDIUM|Clerk#000000851|0|kages cajole final asymptotes. express accounts across the requests haggle +15076|568|O|27979.41|1996-04-14|1-URGENT|Clerk#000000626|0|requests. furiously ironic instructions according to the +15077|1378|O|273942.93|1997-05-13|1-URGENT|Clerk#000000901|0|ages. regular, express theodolites among the slyly special plat +15078|28|F|234964.60|1993-11-10|2-HIGH|Clerk#000000880|0|deposits haggle carefull +15079|187|F|253115.90|1993-01-16|3-MEDIUM|Clerk#000000778|0|tes according to the ideas cajole according to the +15104|1103|F|24852.55|1992-03-30|3-MEDIUM|Clerk#000000321|0|odolites. regular, unusual accounts maintain car +15105|1351|F|11659.54|1994-11-04|5-LOW|Clerk#000000893|0|special accounts wake about the blithely regular pint +15106|430|F|216226.87|1995-01-28|4-NOT SPECIFIED|Clerk#000000358|0|owly unusual request +15107|1238|O|247358.66|1996-06-03|5-LOW|Clerk#000000996|0|requests above the furiously even instructions use alw +15108|1316|F|199162.26|1994-08-28|2-HIGH|Clerk#000000906|0|lithely final multiplier +15109|422|F|279500.42|1993-12-15|4-NOT SPECIFIED|Clerk#000000527|0|al requests. furiously special deposits dazzle slyly blithely express epit +15110|1397|F|59954.80|1993-08-09|1-URGENT|Clerk#000000176|0| the blithely final platelets. final, bold foxes serve blithe +15111|47|F|151893.26|1994-12-18|4-NOT SPECIFIED|Clerk#000000687|0|s cajole carefully deposits? furiou +15136|1157|O|93110.85|1996-01-03|2-HIGH|Clerk#000000901|0|around the slyly ironic foxes. quickly even packages wake. bold, regular reque +15137|776|O|100326.73|1996-04-13|4-NOT SPECIFIED|Clerk#000000602|0|fter the regular accounts ar +15138|767|F|37791.24|1995-02-21|2-HIGH|Clerk#000000004|0|lithely about the blithely dogged deposits. pending, special deposits a +15139|970|F|138795.76|1994-11-20|2-HIGH|Clerk#000000173|0|osits nag carefully regular platelets +15140|382|O|343706.27|1996-11-01|2-HIGH|Clerk#000000066|0|ost furiously along the furiously special foxes. blithely regular depos +15141|379|F|140774.60|1992-01-08|3-MEDIUM|Clerk#000000887|0|nding orbits about the asymptotes boos +15142|146|F|98203.37|1992-04-05|4-NOT SPECIFIED|Clerk#000000066|0| the final excuses. blithely bold pack +15143|103|O|149306.91|1998-05-24|5-LOW|Clerk#000000200|0|nding accounts haggle fluffily about the carefully +15168|565|O|85928.15|1996-05-09|4-NOT SPECIFIED|Clerk#000000454|0|nal packages wake slyly even foxes. slyly special instructions sleep careful +15169|44|O|101402.01|1996-04-11|1-URGENT|Clerk#000000825|0|ronic instructions sleep. carefully ironic platelets past the unusual +15170|1376|F|78194.62|1994-03-19|1-URGENT|Clerk#000000226|0|uffily regular pinto bea +15171|457|O|42951.65|1996-08-09|5-LOW|Clerk#000000883|0|riously even accounts cajole carefully carefully even dugouts. quick +15172|98|O|117624.97|1995-06-21|2-HIGH|Clerk#000000939|0|y regular deposits sleep furiously bold deposits. bold, pending deposits +15173|598|F|207736.74|1992-03-06|2-HIGH|Clerk#000000610|0|o the carefully silent excuses. blithely +15174|16|F|73348.55|1992-11-07|2-HIGH|Clerk#000000072|0| furiously ironic instructions about the ca +15175|1066|F|72913.19|1992-06-29|5-LOW|Clerk#000000397|0| fluffily unusual instructions on the packages integrate furiously bo +15200|1385|F|37232.84|1994-05-02|3-MEDIUM|Clerk#000000853|0|de of the regular, even pinto beans. packages use slyly. pending, expre +15201|944|O|109336.09|1995-06-07|4-NOT SPECIFIED|Clerk#000000511|0|y fluffily after the fluffily ironic foxes. carefully pe +15202|1355|F|371804.24|1993-07-10|2-HIGH|Clerk#000000810|0|ounts cajole furiously. special platelets across the +15203|130|O|62666.07|1996-08-24|1-URGENT|Clerk#000000946|0|ests. enticing, special accounts sleep carefully furiously +15204|1157|F|14431.88|1993-05-11|2-HIGH|Clerk#000000686|0|nding deposits according to the re +15205|1427|P|313331.85|1995-03-18|2-HIGH|Clerk#000000950|0|ideas. slyly regular dependencies detect slyly. +15206|1157|F|208549.38|1993-11-05|5-LOW|Clerk#000000470|0|ly special accounts use. finally final deposits +15207|103|F|131209.56|1992-10-07|2-HIGH|Clerk#000000375|0| silent foxes are carefully express foxes. fluf +15232|1009|O|38488.10|1997-01-15|1-URGENT|Clerk#000000254|0|ly regular accounts. unusual, pending packages cajole +15233|1147|F|223227.94|1993-01-01|2-HIGH|Clerk#000000199|0|luffily according to the requests. final pint +15234|1453|F|162914.64|1993-03-13|4-NOT SPECIFIED|Clerk#000000352|0|r instructions. express, regular depo +15235|1400|O|126635.32|1996-01-01|5-LOW|Clerk#000000266|0| fluffily final pinto beans along the fluffily final pl +15236|790|F|158242.11|1992-04-10|4-NOT SPECIFIED|Clerk#000000440|0|leep among the final packages. slyly regula +15237|1232|O|39929.09|1997-04-06|5-LOW|Clerk#000000996|0|ackages haggle quickly against the a +15238|611|O|92922.15|1997-03-07|5-LOW|Clerk#000000190|0|gular accounts are along +15239|1297|O|165395.86|1997-04-23|3-MEDIUM|Clerk#000000775|0|theodolites sleep carefully above +15264|568|O|152879.11|1995-11-18|3-MEDIUM|Clerk#000000443|0|r frays doze quickly. furiously regular dolphins are blithely. sly +15265|412|O|160798.75|1996-03-02|2-HIGH|Clerk#000000897|0|he slyly regular braids are about the accounts. brave dependencies sleep furi +15266|1447|F|193052.67|1992-12-31|4-NOT SPECIFIED|Clerk#000000223|0|en requests through +15267|1306|O|9526.68|1996-03-15|4-NOT SPECIFIED|Clerk#000000232|0|ose pinto beans. unusual s +15268|1483|O|39867.32|1996-07-25|4-NOT SPECIFIED|Clerk#000000796|0| believe slyly. slyly ironic instructions nod blithely special requests. i +15269|313|O|118868.05|1996-09-04|4-NOT SPECIFIED|Clerk#000000425|0|s. even packages above the blithely special theodolites wake above the final d +15270|1357|F|56410.87|1994-02-01|4-NOT SPECIFIED|Clerk#000000934|0|thely silent instructions wa +15271|1403|F|307957.76|1993-07-26|1-URGENT|Clerk#000000468|0|sublate carefully alongside of the regularly pending reques +15296|274|F|106535.18|1992-08-08|4-NOT SPECIFIED|Clerk#000000870|0|gular frays cajole carefully. carefully final warthogs solve fluffily +15297|202|O|201763.10|1996-07-19|4-NOT SPECIFIED|Clerk#000000568|0|efully according to the furiously iro +15298|1426|O|158200.65|1995-09-04|2-HIGH|Clerk#000000794|0|usly. ironic foxes cajole +15299|88|O|76002.05|1996-05-06|2-HIGH|Clerk#000000436|0|pending deposits mold quickly along the quick +15300|964|F|215075.08|1995-02-09|2-HIGH|Clerk#000000147|0|ndencies haggle carefully ironic asymptotes. carefully pending pla +15301|925|F|69864.88|1994-12-27|4-NOT SPECIFIED|Clerk#000000258|0|regular multipliers are. ironic asymptotes sleep bravely along the unu +15302|673|O|219603.74|1996-07-10|4-NOT SPECIFIED|Clerk#000000097|0|foxes. busily express dolphins wake carefully even instructions! +15303|949|F|209476.70|1993-09-14|1-URGENT|Clerk#000000085|0| use after the fluffily even deposits. ideas alongside of the i +15328|1499|O|72202.04|1997-01-06|1-URGENT|Clerk#000000750|0|carefully slyly pending foxes. bold requests sleep carefully i +15329|598|F|120076.34|1992-04-28|2-HIGH|Clerk#000000348|0|express attainments nag blithely blithely unusual deposits. r +15330|499|F|31526.91|1993-05-09|3-MEDIUM|Clerk#000000991|0|furiously. carefully ironic packages unwind after the furiou +15331|1369|O|224985.64|1997-07-08|3-MEDIUM|Clerk#000000827|0|ly according to the escapades. furiously ironic +15332|1420|F|67166.79|1993-05-31|4-NOT SPECIFIED|Clerk#000000451|0|r instructions run slyly f +15333|511|O|254832.54|1996-02-11|5-LOW|Clerk#000000556|0|ckly pending instructions. slow, regular packages solve special the +15334|1246|O|303093.32|1996-02-08|4-NOT SPECIFIED|Clerk#000000927|0|o the slyly even requests. furiously unusual plate +15335|1346|F|175169.57|1993-09-18|3-MEDIUM|Clerk#000000071|0|ccounts after the fluffily silent i +15360|1075|O|97332.65|1997-11-10|4-NOT SPECIFIED|Clerk#000000208|0| unusual theodolites cajole? carefully +15361|1141|F|51125.15|1994-11-24|1-URGENT|Clerk#000000239|0| along the express, +15362|383|F|54582.89|1993-12-03|1-URGENT|Clerk#000000615|0|fully pending requests unwind accounts. express, furi +15363|1319|O|88125.92|1997-07-07|5-LOW|Clerk#000000068|0|ggle final, even courts. furiously even packages engag +15364|416|O|152719.67|1998-01-15|4-NOT SPECIFIED|Clerk#000000298|0|equests wake quietly according to the express accounts. carefully pending +15365|1120|O|163642.24|1998-01-12|1-URGENT|Clerk#000000018|0|furiously silent packages around the furiously special requests ha +15366|1070|F|79586.68|1993-12-24|1-URGENT|Clerk#000000414|0|al foxes run. hockey players affi +15367|20|F|22827.57|1992-03-16|1-URGENT|Clerk#000000978|0|ns? carefully special requests maintain carefully around the slyly f +15392|101|F|35156.58|1993-05-11|5-LOW|Clerk#000000216|0|p among the packages. daring deposits integrate above the furiously regul +15393|421|O|44817.69|1997-11-29|3-MEDIUM|Clerk#000000320|0| deposits use slyly slyly final sheaves. regul +15394|1282|O|106355.90|1996-09-07|5-LOW|Clerk#000000510|0|are slyly blithely express instructions. bold, i +15395|4|O|37002.64|1996-05-14|3-MEDIUM|Clerk#000000290|0|idly requests. even accounts hinder ironic packages. furi +15396|1489|O|161165.50|1997-12-06|1-URGENT|Clerk#000000010|0|ests. slyly express accounts +15397|881|F|341782.09|1993-02-07|1-URGENT|Clerk#000000993|0|ilent accounts cajole furiously requests. unusual, regula +15398|811|F|61130.69|1993-11-14|4-NOT SPECIFIED|Clerk#000000181|0| the ironic, enticing packages sleep ironic excuses. slyly si +15399|1399|F|226205.72|1992-05-14|1-URGENT|Clerk#000000200|0|leep slyly. pending, silent platelets about the carefully final pinto bea +15424|211|O|39483.89|1997-08-16|4-NOT SPECIFIED|Clerk#000000451|0| quickly furious packages. requests around the escapades use slyly ironic +15425|418|O|136165.56|1995-07-26|5-LOW|Clerk#000000362|0|the foxes wake carefully carefully final packages. care +15426|814|O|152426.65|1997-01-26|2-HIGH|Clerk#000000903|0|e furiously final pinto beans must have +15427|25|O|119692.58|1995-12-16|3-MEDIUM|Clerk#000000907|0|cross the blithely stealthy ideas. slyly ironic deposits use fluffi +15428|676|F|204818.17|1995-02-10|1-URGENT|Clerk#000000548|0|ide the furiously ironic +15429|628|O|172950.33|1997-03-20|4-NOT SPECIFIED|Clerk#000000832|0|ns integrate according to the fin +15430|1213|O|19020.43|1998-03-16|2-HIGH|Clerk#000000158|0|counts integrate boldly after the car +15431|790|F|227132.32|1992-07-10|4-NOT SPECIFIED|Clerk#000000004|0|the unusual, express instructions-- regularly special do +15456|848|F|144646.37|1993-10-20|4-NOT SPECIFIED|Clerk#000000279|0|ial excuses haggle requests. unusual pinto b +15457|916|O|99137.97|1996-11-15|2-HIGH|Clerk#000000554|0|ecial orbits. blithe +15458|634|O|165777.68|1997-05-25|1-URGENT|Clerk#000000002|0|quickly silent instru +15459|532|F|112481.63|1994-10-05|5-LOW|Clerk#000000828|0|tions boost blithely. quickly bold courts nod slyly final dolphins! +15460|727|O|20362.18|1997-05-31|3-MEDIUM|Clerk#000000042|0| carefully regular pinto beans would wake furiously +15461|730|F|60974.16|1992-12-18|1-URGENT|Clerk#000000058|0|nto beans about the furi +15462|452|F|106651.76|1995-02-27|1-URGENT|Clerk#000000731|0|osits after the orbits +15463|889|F|216055.59|1993-07-25|5-LOW|Clerk#000000374|0|jole slyly ironic theodolites. requests lose furiously. ca +15488|224|O|182948.10|1997-02-23|3-MEDIUM|Clerk#000000621|0| even accounts integrate furiously after the special foxes. blithely f +15489|289|O|35698.99|1996-02-11|2-HIGH|Clerk#000000925|0|detect. quickly unusual requests across the regular deposits a +15490|388|O|69734.05|1997-09-13|5-LOW|Clerk#000000129|0| serve according to the ruthlessly furious acco +15491|1471|F|187571.21|1992-01-19|3-MEDIUM|Clerk#000000851|0|pinto beans are fluffily eve +15492|985|F|63786.62|1992-03-07|1-URGENT|Clerk#000000961|0|rding to the furiously regular deposits can use furiously even sentiments. si +15493|1343|O|291800.87|1996-10-25|3-MEDIUM|Clerk#000000766|0|deas. even, even packages snooze-- deposits among the carefull +15494|157|O|132312.36|1997-06-08|2-HIGH|Clerk#000000090|0|ly final deposits. quickly even requests sleep +15495|959|O|156677.84|1998-02-18|4-NOT SPECIFIED|Clerk#000000131|0|instructions boost carefully among the fur +15520|685|O|281680.80|1997-08-23|4-NOT SPECIFIED|Clerk#000000926|0|f the ruthlessly bold c +15521|301|O|48374.65|1997-02-07|4-NOT SPECIFIED|Clerk#000000149|0|elets. quickly express fox +15522|988|F|127624.35|1994-06-11|1-URGENT|Clerk#000000640|0|ts. furiously final accounts do haggle. quickly regular +15523|1324|O|174823.18|1998-04-16|4-NOT SPECIFIED|Clerk#000000119|0|sly. blithely express platelets haggle. slyly ironic +15524|685|F|34658.25|1992-05-12|3-MEDIUM|Clerk#000000089|0|arefully even requests. furiously ironic ideas wa +15525|364|O|32297.87|1997-06-30|4-NOT SPECIFIED|Clerk#000000248|0|lyly ironic accounts besides the bli +15526|682|O|40905.22|1997-02-02|1-URGENT|Clerk#000000167|0|s! quickly thin packages grow slyly +15527|103|O|80855.79|1998-06-14|1-URGENT|Clerk#000000425|0| after the carefully unusual accounts. carefull +15552|101|O|316859.81|1996-04-21|2-HIGH|Clerk#000000263|0|accounts. regular, even packages boost carefully furiously bold i +15553|379|O|78528.22|1995-12-14|1-URGENT|Clerk#000000063|0|side of the regular, regular sentiments. final multipliers i +15554|43|F|113893.08|1992-01-26|2-HIGH|Clerk#000000460|0|thely bold packages. ironic packages +15555|130|O|83136.66|1997-08-03|5-LOW|Clerk#000000100|0|elets nag around the express, ironic acc +15556|983|F|195781.54|1992-06-14|1-URGENT|Clerk#000000920|0|olites. express, even foxes around the unusual packag +15557|964|F|85253.26|1992-01-30|1-URGENT|Clerk#000000287|0|nts up the pending packages cajole fluffily according to the +15558|80|O|291391.93|1997-10-07|2-HIGH|Clerk#000000011|0|ely. carefully regular dependencies mold furiously slyly special +15559|67|O|75455.68|1998-03-16|2-HIGH|Clerk#000000799|0|sleep along the slyly unusual dependencies. idle, regular accounts wake +15584|1339|O|42499.88|1997-01-18|1-URGENT|Clerk#000000156|0|the blithely unusual ideas. ironic accounts cajole alongside of the carefull +15585|523|O|103339.30|1996-12-04|5-LOW|Clerk#000000186|0|as wake blithely. bold +15586|359|F|91069.38|1994-12-14|1-URGENT|Clerk#000000251|0|g slyly. blithely ironic tithes +15587|211|O|250330.86|1997-03-23|3-MEDIUM|Clerk#000000657|0|uests are. regular d +15588|575|O|121783.39|1997-03-31|1-URGENT|Clerk#000000188|0|en, unusual notornis. regular epitaphs +15589|1019|F|56087.04|1994-10-13|4-NOT SPECIFIED|Clerk#000000882|0|to the closely regular gifts. exp +15590|1468|O|136617.15|1997-06-28|1-URGENT|Clerk#000000431|0|kly unusual foxes serve quickly. slyl +15591|1156|F|195117.86|1992-06-07|1-URGENT|Clerk#000000269|0|ng to the ironic foxes! final, bold asymptotes sublate ironic, st +15616|14|F|156741.85|1992-03-24|1-URGENT|Clerk#000000322|0|ep ruthlessly. blithely ironic pinto beans +15617|292|F|36879.26|1992-08-03|4-NOT SPECIFIED|Clerk#000000260|0|riously ironic forges wake blithely furiously ironic requests. special d +15618|1483|F|209522.16|1993-08-05|3-MEDIUM|Clerk#000000247|0|eposits. slyly ironic theodolites boost blithely-- pending re +15619|143|O|310529.75|1995-06-29|5-LOW|Clerk#000000088|0|ent attainments cajole +15620|217|O|42622.18|1997-07-31|2-HIGH|Clerk#000000071|0|hins cajole alongside of the accounts. +15621|49|O|172302.66|1995-09-25|1-URGENT|Clerk#000000388|0|ironic ideas nag carefully. iron +15622|299|O|215608.46|1995-08-26|2-HIGH|Clerk#000000570|0|e outside the carefully ironic pinto beans. daringly ir +15623|343|F|4425.23|1993-05-04|1-URGENT|Clerk#000000571|0|he bold, unusual pinto beans. carefully regular +15648|526|O|266660.28|1996-03-09|1-URGENT|Clerk#000000373|0| packages integrate? express accounts wake furiou +15649|832|O|74544.01|1997-08-12|1-URGENT|Clerk#000000615|0|xpress notornis nag blithely across the silent theodolites. carefull +15650|901|O|119356.48|1996-09-28|3-MEDIUM|Clerk#000000360|0|ly silent deposits! ironic, unusual packages +15651|1486|F|78566.71|1992-10-05|1-URGENT|Clerk#000000592|0|final requests. quickly bold accounts across the blithely express foxes slee +15652|289|F|60869.77|1993-01-25|1-URGENT|Clerk#000000260|0| nag. blithely unusual dependencies nag furiously carefully p +15653|769|O|105924.44|1996-05-30|3-MEDIUM|Clerk#000000945|0|y even accounts. asymptotes haggle carefully. carefully ironic id +15654|1318|F|190626.19|1994-10-03|4-NOT SPECIFIED|Clerk#000000755|0|ccounts. fluffily final +15655|1372|O|219090.23|1996-11-23|5-LOW|Clerk#000000289|0|unusual ideas. carefully quiet dolphins at the quiet pa +15680|1327|O|71189.56|1998-01-20|4-NOT SPECIFIED|Clerk#000000392|0|o beans. quickly express dependencies co +15681|998|O|128346.65|1995-06-29|2-HIGH|Clerk#000000112|0|onic foxes serve slyly. +15682|1015|O|142070.26|1996-02-25|2-HIGH|Clerk#000000452|0|sits hinder slyly slyly final packages. regular, daring requests wake speci +15683|278|F|56977.11|1992-04-20|2-HIGH|Clerk#000000083|0|use furiously above the even requests. fluffily regul +15684|641|O|236221.13|1996-05-06|3-MEDIUM|Clerk#000000680|0|ys even deposits dazzle. furiously ironic deposits according to the +15685|1276|O|273349.88|1996-10-27|1-URGENT|Clerk#000000838|0|nic instructions unwind instructions. carefully f +15686|680|O|182365.21|1996-10-26|3-MEDIUM|Clerk#000000436|0|deas nod behind the final +15687|52|F|196432.28|1992-04-10|1-URGENT|Clerk#000000824|0|p slowly: furiously unusual accounts sleep around the daring +15712|31|F|164903.09|1992-12-05|2-HIGH|Clerk#000000310|0|unusual accounts. blithely regular deposits sleep quickly packages. +15713|766|O|113560.05|1996-01-21|3-MEDIUM|Clerk#000000740|0|hall nag blithely arou +15714|1378|O|153680.55|1995-07-06|2-HIGH|Clerk#000000586|0|regular accounts haggle along the stealthy +15715|1031|F|175655.24|1992-10-16|1-URGENT|Clerk#000000259|0|ing deposits boost carefully along th +15716|1372|O|161027.41|1996-07-29|5-LOW|Clerk#000000170|0|alongside of the ironic requests? carefully pending c +15717|1306|O|136280.88|1998-03-10|4-NOT SPECIFIED|Clerk#000000733|0|mong the accounts; carefully final foxes haggl +15718|1154|F|101691.07|1994-01-28|1-URGENT|Clerk#000000672|0|yly bold dependencies use bl +15719|254|F|118051.13|1995-01-19|1-URGENT|Clerk#000000834|0|ts are furiously across the furiously express platelets. deposits ha +15744|1213|F|58527.85|1993-03-22|1-URGENT|Clerk#000000939|0|ily ironic pinto beans. ironic, unusual instructions n +15745|653|F|159320.24|1992-07-03|3-MEDIUM|Clerk#000000914|0|le carefully daringly special excuses. thinly ironic theodolites nag. even ide +15746|919|O|102859.55|1998-01-15|5-LOW|Clerk#000000545|0|nding foxes dazzle furiously after +15747|1261|O|175818.31|1996-03-22|4-NOT SPECIFIED|Clerk#000000274|0|along the blithely express platelets. final ideas doubt. furiously even depos +15748|892|F|188408.89|1994-12-13|2-HIGH|Clerk#000000744|0|ously bold deposits. blithely ironic dependencies ha +15749|1457|O|52473.17|1997-10-02|5-LOW|Clerk#000000622|0|s across the ironic accounts sleep caref +15750|214|O|55308.61|1997-05-25|3-MEDIUM|Clerk#000000800|0|riously regular, pending accounts. quickly ironic +15751|395|F|83039.56|1994-08-16|1-URGENT|Clerk#000000063|0|ounts above the furiously ironic multipliers hag +15776|830|O|121879.91|1997-12-01|5-LOW|Clerk#000000571|0|o beans. final instructions about the furiously pending p +15777|589|F|9177.88|1994-12-29|4-NOT SPECIFIED|Clerk#000000142|0|n, ironic packages. even, special +15778|1177|F|200411.05|1993-05-07|2-HIGH|Clerk#000000593|0|s after the regular sentiments +15779|1003|O|405401.76|1998-02-24|3-MEDIUM|Clerk#000000633|0|ver permanent accounts haggle ironically along the slyly regular deposi +15780|1117|P|134882.28|1995-04-14|1-URGENT|Clerk#000000821|0|carefully even packages. regular excuses are carefully slyly final +15781|413|F|143460.74|1992-09-04|2-HIGH|Clerk#000000169|0|attainments. carefully regular theodolites are blithely among the fu +15782|553|F|220601.22|1992-03-31|2-HIGH|Clerk#000000892|0|ly regular theodolites. excuses acros +15783|101|O|71022.58|1997-07-03|4-NOT SPECIFIED|Clerk#000000804|0|e quickly across the quickly regul +15808|943|F|229642.91|1993-12-15|1-URGENT|Clerk#000000644|0|ross the final requests. furiously sp +15809|1111|O|38247.56|1995-09-07|3-MEDIUM|Clerk#000000143|0|xes against the blithely regular foxes print +15810|1349|F|265870.31|1993-06-13|2-HIGH|Clerk#000000980|0|instructions. fluffily silent instructions use blithely. fluffil +15811|382|O|79237.54|1998-07-31|5-LOW|Clerk#000000071|0| ironic, regular instructio +15812|914|O|128590.52|1997-10-13|1-URGENT|Clerk#000000482|0|uests run about the blithely pending theodolites. +15813|526|O|62159.22|1998-07-13|3-MEDIUM|Clerk#000000317|0|efully requests. blithely bold idea +15814|1177|O|137657.85|1996-08-18|1-URGENT|Clerk#000000759|0|to the carefully final theodolites! ironic, dogged instructions +15815|1351|F|142186.85|1994-05-02|1-URGENT|Clerk#000000564|0|ularly special requests. furio +15840|281|O|195793.91|1998-01-17|1-URGENT|Clerk#000000624|0|equests are furiously according to the +15841|877|O|112874.49|1996-06-10|1-URGENT|Clerk#000000469|0|l theodolites. boldly even accounts across the pending deposits may +15842|1177|F|117057.52|1993-05-22|3-MEDIUM|Clerk#000000730|0|toward the regular asymptotes. quickly +15843|362|O|181575.89|1995-11-10|1-URGENT|Clerk#000000265|0| cajole quickly after the furiously fina +15844|314|F|29631.80|1993-03-02|1-URGENT|Clerk#000000427|0|against the asymptotes. f +15845|589|O|172044.11|1996-11-23|5-LOW|Clerk#000000915|0|n foxes sleep slyly among the foxes. slyly ironic dependencies s +15846|47|F|118713.85|1993-05-05|2-HIGH|Clerk#000000208|0| ironic requests sleep carefully even instructions. quickly silent t +15847|805|O|287838.96|1996-07-09|2-HIGH|Clerk#000000750|0|y special packages ki +15872|188|F|101969.67|1992-10-31|4-NOT SPECIFIED|Clerk#000000210|0|nusual instructions. blithely silent accoun +15873|1360|F|17611.75|1994-07-18|4-NOT SPECIFIED|Clerk#000000016|0|sly quick packages sleep slyly evenly final packages. furiously eve +15874|436|O|90057.48|1996-05-07|1-URGENT|Clerk#000000625|0|ly across the quickly pending pinto bean +15875|809|O|161658.46|1996-09-01|3-MEDIUM|Clerk#000000367|0|al accounts. even foxes may a +15876|1120|F|99656.75|1995-01-25|1-URGENT|Clerk#000000534|0| bold packages. accounts cajole. quickly ironic acc +15877|1279|O|98433.82|1996-02-29|2-HIGH|Clerk#000000637|0| ironic foxes: regular foxes lose +15878|11|F|227188.36|1993-11-05|2-HIGH|Clerk#000000172|0|ss theodolites boost blithely. quickly ironic accounts wake furious +15879|574|O|167029.09|1997-07-04|5-LOW|Clerk#000000066|0|y regular accounts. carefully ironic pl +15904|464|F|176963.78|1994-10-28|4-NOT SPECIFIED|Clerk#000000851|0|tes haggle fluffily at the furiously express requests. silent accounts +15905|439|F|12230.85|1993-06-04|4-NOT SPECIFIED|Clerk#000000440|0|l excuses. regular packages detect across the furio +15906|676|F|133424.17|1993-09-28|5-LOW|Clerk#000000014|0|carefully even foxes wake furiously among the instructions. carefully regula +15907|1271|P|235721.21|1995-04-12|2-HIGH|Clerk#000000279|0|n dependencies after the +15908|316|O|211683.50|1996-01-23|1-URGENT|Clerk#000000711|0|y blithely express accounts. packages caj +15909|326|O|178275.55|1996-12-13|2-HIGH|Clerk#000000102|0| believe. carefully final pinto beans grow carefully blithely fur +15910|841|O|150833.59|1997-08-23|3-MEDIUM|Clerk#000000207|0| beans. blithely bold dependencies x-ray carefully blit +15911|1199|O|40111.96|1995-09-15|1-URGENT|Clerk#000000832|0|y special packages. iro +15936|530|O|198879.48|1996-09-06|3-MEDIUM|Clerk#000000506|0|ages are quickly re +15937|205|F|73678.46|1992-11-07|5-LOW|Clerk#000000248|0| the slyly unusual pinto beans. special d +15938|1109|O|164407.22|1996-04-30|3-MEDIUM|Clerk#000000933|0|ke blithely blithely express requests. +15939|898|O|180369.15|1997-02-08|1-URGENT|Clerk#000000514|0|ng the furiously pending theodolites wake carefully deposits. +15940|685|F|106564.93|1992-01-27|1-URGENT|Clerk#000000634|0|quickly express accounts. finally eve +15941|101|O|164221.48|1995-12-11|4-NOT SPECIFIED|Clerk#000000845|0|longside of the furiously special dolphins. slyly unusual accoun +15942|745|F|127793.36|1993-08-11|3-MEDIUM|Clerk#000000579|0|al theodolites. special packages promise slyly f +15943|188|F|78414.26|1992-02-03|1-URGENT|Clerk#000000764|0| ironic theodolites nag f +15968|976|O|107433.15|1997-04-30|2-HIGH|Clerk#000000542|0| even deposits. blithely +15969|1466|F|56905.94|1993-08-03|5-LOW|Clerk#000000850|0|lly pending ideas. even ideas wake pending pac +15970|869|O|149793.55|1995-09-22|4-NOT SPECIFIED|Clerk#000000311|0|ss dependencies affix. furious +15971|1150|F|232731.19|1994-08-15|2-HIGH|Clerk#000000975|0|ests wake carefully. regularly unusua +15972|532|O|71540.28|1995-08-10|4-NOT SPECIFIED|Clerk#000000492|0|heodolites. quickly bold no +15973|490|O|102944.47|1997-07-22|5-LOW|Clerk#000000655|0|. regular packages would wake about t +15974|1093|O|103869.83|1995-04-30|2-HIGH|Clerk#000000071|0|egular accounts against the final, busy accounts haggle according to the foxes +15975|925|O|235041.80|1998-01-21|5-LOW|Clerk#000000310|0|e. regular dependencies cajole closely qui +16000|734|O|159541.75|1997-12-17|3-MEDIUM|Clerk#000000782|0|. regular instructions sleep qui +16001|20|O|160988.94|1996-05-01|1-URGENT|Clerk#000000090|0|. even, regular dependencies nag slyly across the quickly ironic accounts. c +16002|124|O|57342.22|1998-03-05|4-NOT SPECIFIED|Clerk#000000253|0|old, regular pinto beans affix against the deposits. blithely pendi +16003|130|O|312518.45|1997-12-21|4-NOT SPECIFIED|Clerk#000000760|0|sly stealthy requests. +16004|173|O|58091.71|1997-01-25|3-MEDIUM|Clerk#000000068|0|ent instructions boost furiously. quickly e +16005|857|F|317329.15|1992-12-25|4-NOT SPECIFIED|Clerk#000000815|0|unusual ideas sleep furio +16006|610|O|203802.58|1997-02-08|2-HIGH|Clerk#000000178|0|r the even theodolites. care +16007|154|F|180194.94|1994-04-25|2-HIGH|Clerk#000000106|0|nic escapades along the quickly +16032|928|F|230125.49|1994-12-06|5-LOW|Clerk#000000055|0|hlessly ironic forges-- blithely even pinto beans caj +16033|187|O|144579.01|1996-04-27|5-LOW|Clerk#000000316|0|fluffily pending requests nag. fluffily express packages affix +16034|988|O|164823.45|1997-08-05|2-HIGH|Clerk#000000617|0|. slyly silent instructions haggle. deposits detect fluffily a +16035|1078|F|92425.45|1993-04-22|3-MEDIUM|Clerk#000000130|0|g the foxes. ironic deposits haggle above the blithely even requests. regular +16036|808|F|256206.81|1992-01-06|3-MEDIUM|Clerk#000000350|0|le. express pinto beans play. +16037|496|O|99277.41|1998-04-19|5-LOW|Clerk#000000883|0|l packages. slyly r +16038|635|O|120137.47|1998-06-17|3-MEDIUM|Clerk#000000906|0|ges sleep carefully across the instruction +16039|500|F|229102.33|1992-05-17|2-HIGH|Clerk#000000725|0|aggle blithely final, +16064|19|F|117804.21|1992-01-05|3-MEDIUM|Clerk#000000209|0|egular deposits. quiet, unusual dolphins after +16065|1369|F|51761.67|1993-07-21|2-HIGH|Clerk#000000837|0|slyly even instructions. slyly regular waters sleep above the blit +16066|1342|O|61250.37|1998-05-30|4-NOT SPECIFIED|Clerk#000000335|0|ggle furiously regular excuses. furiously unusual platelets +16067|20|O|152140.70|1996-09-29|1-URGENT|Clerk#000000973|0|kages according to +16068|581|F|73228.58|1992-11-12|3-MEDIUM|Clerk#000000772|0|ide of the slyly ironic ideas use slyly abov +16069|472|F|92672.41|1993-08-06|3-MEDIUM|Clerk#000000673|0|ounts sleep furiously among the carefully sp +16070|1171|F|87366.53|1992-06-04|4-NOT SPECIFIED|Clerk#000000253|0|nal packages cajole regularly across the bold foxes. furiously unusual +16071|70|F|59728.46|1992-09-01|5-LOW|Clerk#000000911|0|the furiously even packages. fluffily regular +16096|1106|F|229743.16|1995-01-20|2-HIGH|Clerk#000000727|0|ealthy excuses cajole around the carefully silent platelets. q +16097|1057|O|133691.66|1996-08-24|2-HIGH|Clerk#000000652|0|longside of the bold excuses. brave foxes +16098|376|F|234458.55|1992-07-22|5-LOW|Clerk#000000500|0|und the final courts. requests sl +16099|1169|O|148378.67|1998-01-17|2-HIGH|Clerk#000000743|0|egrate pending, pending deposits. ironic requests detect blithely +16100|1171|P|228928.25|1995-03-08|3-MEDIUM|Clerk#000000057|0|y across the regular accounts. bold requests boost furiously. i +16101|193|F|54659.32|1992-08-26|5-LOW|Clerk#000000621|0|sly. pending, regular foxes wake quietly even ideas. +16102|68|F|88731.96|1994-12-14|4-NOT SPECIFIED|Clerk#000000749|0|lly. furiously regula +16103|787|F|370957.42|1992-07-16|4-NOT SPECIFIED|Clerk#000000869|0|ubt furiously above the unusual deposits: fluffily even accounts boost acro +16128|988|P|93414.82|1995-05-09|2-HIGH|Clerk#000000902|0|rnes. final asymptotes are. quickly pending instructions kindle busi +16129|2|O|50178.44|1998-05-18|5-LOW|Clerk#000000958|0|es sleep slyly regular accounts. regular dolphi +16130|844|O|224393.66|1996-06-22|5-LOW|Clerk#000000072|0|l, even sentiments haggle about the regular packages. re +16131|154|O|248011.34|1997-11-15|4-NOT SPECIFIED|Clerk#000000985|0|arefully bold requests. furiously regular gifts are after +16132|668|F|71232.99|1992-10-28|3-MEDIUM|Clerk#000000490|0|ymptotes haggle quickly. qu +16133|1028|F|144284.02|1994-09-26|1-URGENT|Clerk#000000083|0|s the pending accounts poach accounts. carefully regular pack +16134|529|F|225774.60|1992-11-20|2-HIGH|Clerk#000000407|0|ular theodolites wake furiously carefully spec +16135|541|F|38177.17|1993-05-12|2-HIGH|Clerk#000000844|0|s are carefully along the furi +16160|581|O|68208.79|1995-07-24|1-URGENT|Clerk#000000800|0|eodolites use blithely. slyly special foxes are blit +16161|1181|F|189873.14|1992-07-29|3-MEDIUM|Clerk#000000551|0| beans. special requests use ca +16162|197|F|125898.28|1993-05-26|1-URGENT|Clerk#000000749|0|instructions cajole after the carefully regular requests; ironic instruc +16163|1087|O|93556.62|1997-05-23|1-URGENT|Clerk#000000630|0|ronic theodolites haggle. fluffily pending asymptotes sleep. doggedly b +16164|985|F|130804.43|1992-01-04|5-LOW|Clerk#000000057|0| carefully instructions. unusual attainment +16165|676|F|120890.57|1993-07-23|4-NOT SPECIFIED|Clerk#000000666|0|re regular pinto beans! quick accounts wake. furiously bold packages +16166|706|F|62134.15|1993-02-01|1-URGENT|Clerk#000000136|0|ual pinto beans. special warthogs haggl +16167|674|O|157955.28|1997-11-16|5-LOW|Clerk#000000123|0|uffily ironic packages. carefully special foxes wake carefully f +16192|1327|O|245046.67|1997-07-03|3-MEDIUM|Clerk#000000774|0|n. furiously even accounts wake +16193|532|F|219629.62|1992-04-10|4-NOT SPECIFIED|Clerk#000000925|0|ly unusual dolphins cajole slyly slyly unusual depen +16194|469|F|175826.89|1993-10-08|4-NOT SPECIFIED|Clerk#000000863|0| regular packages promise deposits. de +16195|352|F|58402.16|1992-06-05|4-NOT SPECIFIED|Clerk#000000289|0|ly ironic ideas: furiously +16196|814|F|128009.00|1994-10-21|2-HIGH|Clerk#000000639|0|ns. furiously regular packag +16197|1072|F|172310.38|1992-10-27|1-URGENT|Clerk#000000264|0| carefully bold accounts. re +16198|782|O|65402.53|1998-07-04|4-NOT SPECIFIED|Clerk#000000302|0|elets use after the pending, even accounts-- +16199|100|O|291936.70|1996-08-28|1-URGENT|Clerk#000000306|0| theodolites. furiously ironic deposits believe furiously ironic requests. bl +16224|907|O|149289.97|1997-09-21|3-MEDIUM|Clerk#000000747|0|s alongside of the furious +16225|1402|F|73268.13|1994-05-29|1-URGENT|Clerk#000000665|0|jole carefully after the fluffily final accounts. quickly regular multiplie +16226|254|O|55169.12|1997-01-30|1-URGENT|Clerk#000000955|0| carefully regular packages should have to are ac +16227|1261|F|62535.93|1994-09-18|3-MEDIUM|Clerk#000000139|0|s use against the furiously special dolphins. ironic packages run carefully +16228|17|O|154021.22|1997-10-27|2-HIGH|Clerk#000000546|0| at the even, special foxes. bold deposits +16229|1297|F|211975.90|1994-03-30|2-HIGH|Clerk#000000231|0|ely final pinto beans. dependencies +16230|1123|F|290390.23|1993-02-28|5-LOW|Clerk#000000340|0|e slyly quickly quick so +16231|1052|F|227134.99|1992-09-05|5-LOW|Clerk#000000479|0|refully bold theodolites use carefully requests? evenly unusual ac +16256|553|O|126476.16|1997-10-08|4-NOT SPECIFIED|Clerk#000000274|0|y ironic multipliers. theodolites detect +16257|13|F|118427.12|1992-05-06|4-NOT SPECIFIED|Clerk#000000666|0|ctions around the unusual instructions sleep carefully blithely final de +16258|1396|O|80425.56|1995-07-07|3-MEDIUM|Clerk#000000138|0|ly even asymptotes sleep along the final instructions. dependencies +16259|367|O|155616.73|1996-06-18|3-MEDIUM|Clerk#000000574|0|symptotes after the even, bold requests cajole furiously carefully regular pa +16260|781|O|50156.58|1995-11-14|2-HIGH|Clerk#000000002|0|ges detect carefully ironic dependencies. carefully regular requests cajole +16261|713|F|173581.43|1993-10-05|5-LOW|Clerk#000000722|0|lets cajole quickly express +16262|533|F|328049.60|1995-01-02|5-LOW|Clerk#000000036|0|ly final theodolites. carefully final deposi +16263|1123|O|206863.33|1997-11-05|3-MEDIUM|Clerk#000000732|0|ounts about the quickly regular instructions are quickly after the b +16288|220|O|165721.76|1996-03-01|5-LOW|Clerk#000000550|0|phins are quickly. bold, regular deposits haggle. slow +16289|1118|F|238672.90|1993-07-18|2-HIGH|Clerk#000000497|0|olphins was final, silent requests. bl +16290|898|O|130066.90|1996-09-17|4-NOT SPECIFIED|Clerk#000000294|0|ide of the bold hockey players. fur +16291|572|P|52211.01|1995-04-09|4-NOT SPECIFIED|Clerk#000000232|0|he boldly even foxes affix according to the quickly ironic accounts. fi +16292|86|O|349874.14|1997-11-22|1-URGENT|Clerk#000000957|0|ly furiously final asymptotes. permanent platelets cajole fur +16293|1342|O|173688.85|1997-09-03|2-HIGH|Clerk#000000407|0| express foxes after the +16294|853|O|235290.23|1996-12-21|5-LOW|Clerk#000000168|0|nal deposits will haggle caref +16295|770|F|20931.69|1992-12-07|3-MEDIUM|Clerk#000000797|0| to sleep blithely special court +16320|982|O|127782.84|1995-10-21|4-NOT SPECIFIED|Clerk#000000024|0|tect busily. special pinto beans sleep slyly. instructions al +16321|280|F|39796.05|1994-10-02|4-NOT SPECIFIED|Clerk#000000965|0|instructions. deposits along the fluffily bold requests doubt fluffily +16322|1300|F|119095.57|1994-12-20|5-LOW|Clerk#000000068|0|s sleep against the blithely idle theodoli +16323|1324|O|243736.62|1996-07-25|2-HIGH|Clerk#000000216|0|luffily express dolphins. boldly regular a +16324|1396|O|95848.57|1998-02-27|1-URGENT|Clerk#000000286|0|e blithely unusual +16325|596|O|11721.09|1997-08-08|4-NOT SPECIFIED|Clerk#000000784|0|re. brave, ironic package +16326|232|F|323230.86|1993-05-11|2-HIGH|Clerk#000000203|0|lly! bold packages kindle. slyly bold platelets sleep. express excuse +16327|692|F|46051.07|1993-12-23|1-URGENT|Clerk#000000838|0|o the express ideas; unusual theodolites detect carefully carefully e +16352|223|F|181444.05|1992-07-31|3-MEDIUM|Clerk#000000822|0| detect furiously slyly +16353|233|O|150799.84|1997-04-08|1-URGENT|Clerk#000000989|0|deposits maintain. furiously final requests doubt quickly carefully express +16354|916|O|106049.67|1997-08-25|4-NOT SPECIFIED|Clerk#000000092|0|onic packages use carefully. blithely fin +16355|521|O|284743.97|1998-04-13|4-NOT SPECIFIED|Clerk#000000205|0|ously thin deposits. carefully pending deposits cajole among the furiou +16356|1043|O|272351.23|1995-08-03|1-URGENT|Clerk#000000016|0|instructions. carefully silent dependencies around t +16357|715|F|52749.00|1993-01-28|4-NOT SPECIFIED|Clerk#000000846|0| platelets are idly above the furiously express packages. quickly special depo +16358|319|F|60662.00|1993-12-26|4-NOT SPECIFIED|Clerk#000000125|0|ly. ironic, bold requests among the accounts affix sometimes express requests +16359|758|F|202543.29|1992-05-15|1-URGENT|Clerk#000000584|0| the blithely ironic accounts: slyly pendi +16384|613|O|19455.92|1997-08-14|2-HIGH|Clerk#000000375|0|round the carefully ironic accounts doze silent, final theodolite +16385|92|F|26170.83|1994-06-28|4-NOT SPECIFIED|Clerk#000000051|0|unts. furiously fina +16386|1126|O|166693.09|1996-12-23|3-MEDIUM|Clerk#000000692|0|jole quickly against the regular accounts. final, regular notornis are depo +16387|1043|O|72432.33|1998-03-08|5-LOW|Clerk#000000438|0|ts detect slyly around the slyly pending requests. furious +16388|602|O|62231.15|1995-07-21|3-MEDIUM|Clerk#000000259|0|requests haggle even, unusual deposits. closely ironic do +16389|1118|O|107616.27|1996-04-17|1-URGENT|Clerk#000000024|0|structions after the unusual, special id +16390|820|F|15145.02|1992-03-25|3-MEDIUM|Clerk#000000942|0|cies. fluffily ironic foxes among the carefully ironic pinto beans cajole +16391|1063|O|247388.82|1997-01-19|4-NOT SPECIFIED|Clerk#000000193|0|. somas wake carefully sometimes bold accounts. pack +16416|920|O|44988.32|1995-08-10|3-MEDIUM|Clerk#000000940|0|ress accounts unwind fluffily. ideas cajole even pinto beans. carefu +16417|167|O|200302.17|1997-03-14|2-HIGH|Clerk#000000500|0|ual sauternes are blithely aft +16418|1024|O|135131.91|1996-02-20|3-MEDIUM|Clerk#000000183|0| blithely. final packages use reg +16419|1298|F|49023.64|1994-08-05|4-NOT SPECIFIED|Clerk#000000316|0|y final dolphins. blithely pending pearls boo +16420|595|O|156834.41|1996-04-11|3-MEDIUM|Clerk#000000511|0|fix quickly furiously final instructions. furiously ironic foxes solve qu +16421|556|O|64096.54|1998-06-07|5-LOW|Clerk#000000863|0|o beans against the fluffily regular theodolites cajole s +16422|250|O|243816.13|1995-10-10|1-URGENT|Clerk#000000918|0| regular requests. unusual instructions affix after the thin, ex +16423|200|F|105542.13|1992-08-06|3-MEDIUM|Clerk#000000675|0|arefully ironic foxes cajole furio +16448|205|F|131678.37|1992-04-29|5-LOW|Clerk#000000536|0|nments. carefully fina +16449|1045|F|175552.99|1993-11-09|4-NOT SPECIFIED|Clerk#000000801|0|ously bold accounts. final theodolites poach quickly across the slyly ruth +16450|458|O|192462.37|1995-05-16|3-MEDIUM|Clerk#000000912|0|counts. blithely regular fr +16451|781|F|142886.72|1994-07-23|4-NOT SPECIFIED|Clerk#000000831|0|y bold foxes. unusual packages ca +16452|37|F|138530.91|1992-08-24|3-MEDIUM|Clerk#000000307|0|ven packages unwind slyly thinly quick deposits. final, regular pinto +16453|1138|F|319176.79|1993-11-18|1-URGENT|Clerk#000000910|0|ests x-ray. quickly special theodolites haggle. accounts engage. idea +16454|499|F|243925.11|1992-05-12|3-MEDIUM|Clerk#000000971|0| cajole furiously. regular, final deposits use blit +16455|1385|F|72292.01|1992-02-26|5-LOW|Clerk#000000672|0|ly brave pinto beans. carefully regular accounts are +16480|718|F|290346.88|1994-12-07|4-NOT SPECIFIED|Clerk#000000980|0| the slyly even deposits detec +16481|1456|F|77897.52|1995-02-19|5-LOW|Clerk#000000309|0|ove the furiously regular packages. pending, stealthy pinto beans a +16482|608|F|24696.86|1992-05-01|1-URGENT|Clerk#000000633|0|aggle enticingly express accounts. bl +16483|1295|O|70307.92|1996-11-05|1-URGENT|Clerk#000000153|0|posits haggle enticingly regular requests. blit +16484|67|O|50091.35|1995-03-15|1-URGENT|Clerk#000000325|0| packages haggle. carefully daring pinto beans wake whithout the +16485|1118|O|121505.25|1996-09-04|3-MEDIUM|Clerk#000000188|0| slyly express pinto beans wake. blit +16486|533|F|46866.87|1992-05-30|3-MEDIUM|Clerk#000000205|0| deposits according to the carefully unu +16487|1217|O|154872.06|1996-11-26|5-LOW|Clerk#000000757|0|althily along the slyly pending packages-- special warhorses cajole carefully +16512|115|F|54275.34|1993-04-18|2-HIGH|Clerk#000000477|0|the blithely bold pinto beans haggle furiously finally bold accounts. fur +16513|850|F|96354.73|1993-09-04|1-URGENT|Clerk#000000523|0|ages. even dependencies boost regular accounts. even, regular packages +16514|1006|O|193653.14|1997-05-08|1-URGENT|Clerk#000000894|0|onic accounts haggle blithely regular in +16515|1133|O|251681.75|1996-01-18|1-URGENT|Clerk#000000942|0| bold accounts boost. packages cajole sly +16516|1006|O|160441.28|1997-11-05|3-MEDIUM|Clerk#000000845|0|ep. blithely bold ideas dazzle carefully even packages. accounts integrate abo +16517|943|F|68475.74|1994-10-17|2-HIGH|Clerk#000000242|0|. furiously even pack +16518|745|F|104725.12|1992-09-30|1-URGENT|Clerk#000000333|0|eas are against the carefully special foxes. permanently specia +16519|1204|O|148809.81|1995-06-11|3-MEDIUM|Clerk#000000002|0| the quickly special orbits nag +16544|553|O|227976.65|1998-02-19|1-URGENT|Clerk#000000405|0|the furiously silent accounts. ironic packages about the +16545|1150|F|172316.62|1993-05-10|4-NOT SPECIFIED|Clerk#000000442|0| along the special theodolites. bl +16546|211|F|8752.42|1992-06-25|5-LOW|Clerk#000000447|0|integrate slowly ironic deposits. fluffily regular dinos are sheave +16547|467|F|238378.01|1994-02-19|4-NOT SPECIFIED|Clerk#000000205|0|blithely regular requests across the finally r +16548|10|F|158826.22|1992-02-06|4-NOT SPECIFIED|Clerk#000000851|0|lites haggle slyly. slyly silent accounts +16549|352|O|24855.77|1997-05-23|5-LOW|Clerk#000000937|0|ickly pending deposits along the instructions are furiously a +16550|128|O|233316.61|1996-08-10|3-MEDIUM|Clerk#000000667|0|inal attainments around the enticingly stealthy +16551|127|F|205765.93|1992-11-28|4-NOT SPECIFIED|Clerk#000000351|0|among the even, even requests. even deposits cajole quickly deposits. bold in +16576|980|O|140854.80|1996-11-08|4-NOT SPECIFIED|Clerk#000000296|0|even deposits. unusual, ironic sautern +16577|512|O|216841.35|1997-01-30|1-URGENT|Clerk#000000241|0|ts. never express packages wake carefully under the carefully reg +16578|283|O|147987.30|1995-10-18|5-LOW|Clerk#000000555|0|ructions. slyly regular ideas haggle b +16579|572|F|122365.64|1993-12-13|4-NOT SPECIFIED|Clerk#000000729|0|ven instructions. ironic, regular deposits +16580|238|F|279787.11|1992-02-08|1-URGENT|Clerk#000000982|0| furiously carefully regular deposits. quickly busy instruction +16581|190|O|67550.39|1997-07-10|4-NOT SPECIFIED|Clerk#000000238|0|he fluffily express packages. regular asymptotes cajole agai +16582|1054|O|114145.42|1995-10-02|1-URGENT|Clerk#000000454|0|even pinto beans integrate f +16583|953|O|155989.32|1997-10-30|4-NOT SPECIFIED|Clerk#000000003|0|lithely against the blithely r +16608|1288|O|272437.20|1996-09-29|1-URGENT|Clerk#000000018|0|regular accounts sleep furiously. blithely bold pinto beans are slyly. furio +16609|746|O|165861.08|1996-12-08|3-MEDIUM|Clerk#000000057|0| above the final, unusual instructions: furiously regular pinto +16610|34|F|210171.81|1994-10-11|2-HIGH|Clerk#000000100|0|s. carefully final deposit +16611|650|O|284449.26|1995-10-24|2-HIGH|Clerk#000000503|0|es cajole among the pending foxes. furiously even pinto b +16612|280|F|202375.31|1994-02-14|2-HIGH|Clerk#000000768|0|ully ironic asymptotes. pending +16613|448|F|236960.69|1993-12-25|2-HIGH|Clerk#000000832|0|l accounts. pending foxes run according to the slyly regula +16614|1102|O|154699.78|1997-09-17|1-URGENT|Clerk#000000380|0|es use slyly through the ruthless courts. +16615|617|O|140109.26|1997-03-17|3-MEDIUM|Clerk#000000677|0|oxes haggle express platelets. express deposits nag furiou +16640|241|F|127424.59|1993-07-28|5-LOW|Clerk#000000471|0|ickly bold ideas. furiously silent deposits haggle furiously. ironic +16641|89|F|132529.61|1993-05-11|2-HIGH|Clerk#000000217|0|ounts cajole slyly. permanently re +16642|622|F|46595.21|1995-03-03|4-NOT SPECIFIED|Clerk#000000592|0|sleep bold platelets. ironic dolphins boost stealthily packages. fluffil +16643|886|F|100658.79|1993-04-12|5-LOW|Clerk#000000269|0|s kindle across the boldly expres +16644|808|O|114775.13|1998-06-03|2-HIGH|Clerk#000000109|0|quests around the slowly bold pinto beans cajole carefully final frays. packa +16645|940|F|37283.01|1994-08-28|2-HIGH|Clerk#000000816|0|eans. quickly express requests detect slyly fluffily +16646|557|O|201553.00|1995-08-08|4-NOT SPECIFIED|Clerk#000000749|0|al packages are slyly among the blithely pe +16647|821|O|222418.84|1998-01-15|5-LOW|Clerk#000000653|0|ckages. carefully final accounts use blithely idle deposit +16672|242|O|12222.88|1997-03-03|1-URGENT|Clerk#000000080|0| the ironic foxes. +16673|208|O|68201.36|1996-02-03|2-HIGH|Clerk#000000350|0|d requests solve bold pearls. quickly +16674|31|P|251599.77|1995-04-30|5-LOW|Clerk#000000544|0|al ideas. slyly ironic a +16675|661|O|209152.88|1998-05-23|5-LOW|Clerk#000000698|0|ckly regular theodolit +16676|1396|F|202090.89|1994-03-20|2-HIGH|Clerk#000000271|0|sual accounts. ironically final foxes along +16677|409|F|210216.09|1992-09-06|1-URGENT|Clerk#000000251|0|ess asymptotes. packages sleep quickly even dependencies. pending the +16678|422|O|20491.02|1996-06-24|2-HIGH|Clerk#000000732|0|blithe dependencies alongside of the fluffily special theodo +16679|122|F|227943.38|1994-11-09|5-LOW|Clerk#000000759|0|al, special deposits along the quickly final packages are care +16704|670|F|56162.04|1994-09-10|5-LOW|Clerk#000000930|0|counts. fluffily special ti +16705|943|O|51031.26|1997-12-13|5-LOW|Clerk#000000469|0|ven packages. express requests +16706|1435|F|313845.06|1992-06-28|2-HIGH|Clerk#000000241|0| furiously express ideas use +16707|112|O|63421.71|1998-05-30|4-NOT SPECIFIED|Clerk#000000464|0|accounts. slyly furious acc +16708|1415|O|166590.29|1996-08-31|5-LOW|Clerk#000000025|0|lithely bold accounts wake carefully furiously idle +16709|797|F|194592.90|1992-10-07|2-HIGH|Clerk#000000645|0|ly about the slyly regular theodolites. stealthy, final accounts haggle spe +16710|304|O|4541.00|1995-04-25|2-HIGH|Clerk#000000307|0|. carefully pending packages sleep regular instructi +16711|1489|F|222985.61|1992-04-26|4-NOT SPECIFIED|Clerk#000000203|0|nts sleep carefully about +16736|286|O|295316.65|1997-10-24|2-HIGH|Clerk#000000066|0|es sleep slyly blithely regular +16737|626|O|37160.38|1995-06-21|4-NOT SPECIFIED|Clerk#000000361|0|al instructions. carefully final packages wake bold, pending re +16738|1267|F|137729.65|1993-11-27|5-LOW|Clerk#000000842|0|equests haggle slyly. quickly regular excuses boost. blithe +16739|92|O|83614.20|1997-03-26|5-LOW|Clerk#000000913|0|uests wake alongside of the s +16740|271|F|96273.34|1992-03-01|5-LOW|Clerk#000000031|0|theodolites. blithely unusual deposits eat. even foxes wake about +16741|460|F|43265.05|1993-10-01|3-MEDIUM|Clerk#000000711|0| across the dependencies. final +16742|53|F|82738.04|1993-05-23|4-NOT SPECIFIED|Clerk#000000676|0|l accounts wake slyly. ir +16743|1391|O|191282.64|1996-10-06|3-MEDIUM|Clerk#000000791|0|ly up the slyly reg +16768|1195|F|304247.49|1994-07-26|2-HIGH|Clerk#000000882|0|lites cajole furiously after the s +16769|595|O|205396.77|1997-10-02|2-HIGH|Clerk#000000038|0|courts haggle blithe +16770|884|F|32625.96|1994-01-07|1-URGENT|Clerk#000000186|0|s-- quickly pending requests boost blithely deposits. +16771|1318|F|67254.65|1994-09-29|2-HIGH|Clerk#000000715|0|. furiously special foxes use blithely ironic accounts. express accounts sleep +16772|784|F|212195.00|1992-12-27|2-HIGH|Clerk#000000650|0|lar requests use under +16773|1472|O|9257.61|1996-12-05|5-LOW|Clerk#000000500|0|al deposits integrate furiously. fu +16774|481|O|147205.28|1998-01-14|2-HIGH|Clerk#000000336|0|onic instructions wake blithely regular dependencie +16775|224|F|132260.87|1992-11-23|5-LOW|Clerk#000000697|0|counts haggle blithely. packages sleep slyly. slyly regular requests d +16800|1336|P|120721.41|1995-06-06|2-HIGH|Clerk#000000878|0| fluffily bold platelets-- slyly even theodolites upon th +16801|655|O|124977.61|1996-08-30|1-URGENT|Clerk#000000566|0|nding packages. furiously un +16802|136|P|257997.58|1995-04-21|3-MEDIUM|Clerk#000000374|0|bold sauternes eat sometimes. final +16803|590|O|81548.61|1995-09-05|3-MEDIUM|Clerk#000000367|0|ounts. foxes after the ironic ideas a +16804|1301|F|108560.59|1992-03-11|2-HIGH|Clerk#000000497|0|sly even depths hagg +16805|599|O|159824.07|1995-12-31|5-LOW|Clerk#000000070|0|slyly regular pinto beans mold iron +16806|161|F|233295.54|1993-06-18|2-HIGH|Clerk#000000534|0|ng requests; slyly regular foxes through the fluffily ironic i +16807|631|F|152136.99|1992-01-16|3-MEDIUM|Clerk#000000655|0| the ironic foxes. final deposits cajole quickly furiously iron +16832|1310|F|25415.00|1993-01-06|3-MEDIUM|Clerk#000000824|0|quests boost furiously asymptote +16833|1099|O|163843.69|1997-10-14|1-URGENT|Clerk#000000198|0| slow platelets alongside of +16834|116|F|112551.47|1993-10-24|5-LOW|Clerk#000000153|0|eposits hinder regular foxes. blithely pending accounts integrate carefully +16835|218|F|110255.86|1994-02-09|1-URGENT|Clerk#000000947|0| fluffily ironic foxes haggle slyly. regular, pending i +16836|571|F|60404.12|1993-10-19|1-URGENT|Clerk#000000385|0|ave to haggle furiously blit +16837|1234|F|34044.89|1995-01-22|4-NOT SPECIFIED|Clerk#000000750|0|le furiously after the finally final instruc +16838|337|F|178155.83|1994-04-29|1-URGENT|Clerk#000000849|0|es detect slyly about the fu +16839|1403|F|51519.36|1993-05-21|2-HIGH|Clerk#000000728|0|xes detect blithely furiously unusual deposits. fluffily final deposits are r +16864|281|F|74623.35|1992-10-30|4-NOT SPECIFIED|Clerk#000000902|0|ate evenly after the instructions. regular, regular accounts are carefu +16865|724|O|55924.66|1996-03-22|2-HIGH|Clerk#000000139|0|ly. quickly even deposits are special, furious pin +16866|1183|F|71627.98|1992-02-07|4-NOT SPECIFIED|Clerk#000000600|0|lites nod carefully blithely pending accounts. packages +16867|1121|F|94295.60|1992-12-05|4-NOT SPECIFIED|Clerk#000000533|0|uests sleep blithely +16868|802|O|199110.58|1998-07-29|2-HIGH|Clerk#000000372|0|ions. ironic requests +16869|214|O|172054.82|1998-01-13|1-URGENT|Clerk#000000374|0|ts sleep slyly stealthily final pinto beans. slyly final packages detect +16870|1162|F|158725.53|1994-01-11|5-LOW|Clerk#000000072|0|g. requests above the +16871|946|F|107915.25|1994-07-15|5-LOW|Clerk#000000762|0|leep. foxes nag slyly: blithely even theodolites cajole around the c +16896|728|O|166766.72|1997-04-25|5-LOW|Clerk#000000814|0|al ideas boost slyly. dolphins wake regular, regular pinto beans. spec +16897|754|F|181764.22|1992-06-16|4-NOT SPECIFIED|Clerk#000000554|0| regular packages cajole blithely. bold +16898|1181|O|84688.31|1995-10-29|5-LOW|Clerk#000000091|0|quests. deposits cajole across the iro +16899|832|O|70481.32|1998-06-23|1-URGENT|Clerk#000000733|0| eat carefully. pending foxes x-ray fluffily according to the +16900|1105|O|114796.75|1998-05-26|3-MEDIUM|Clerk#000000251|0|blithely. slyly reg +16901|1247|F|87095.83|1993-12-07|4-NOT SPECIFIED|Clerk#000000370|0|sts. slyly pending accounts about the carefully final instructions run s +16902|1060|O|156257.66|1997-01-28|5-LOW|Clerk#000000796|0|f the final pinto beans. ironic, +16903|343|O|209243.77|1997-07-27|3-MEDIUM|Clerk#000000249|0| dependencies. asymptotes sleep furiously. carefully e +16928|1156|O|265110.78|1998-06-17|2-HIGH|Clerk#000000765|0|l foxes. slow theodolites alongside of the ironic forges cajole sl +16929|971|F|34012.74|1994-08-03|4-NOT SPECIFIED|Clerk#000000175|0|y even deposits nag carefully. courts boost furiously against the excus +16930|1304|F|43306.39|1992-10-20|2-HIGH|Clerk#000000376|0|phins! slyly express instructions are blith +16931|41|O|256037.85|1997-10-09|1-URGENT|Clerk#000000659|0|e packages. express requests are regular, special depende +16932|947|F|209360.71|1993-04-16|1-URGENT|Clerk#000000749|0|pinto beans. carefully regular deposits affix slyly about the ca +16933|1090|F|68351.71|1994-10-14|5-LOW|Clerk#000000431|0|usly even requests thrash final, bold foxes. furiously eve +16934|1211|O|128612.10|1997-07-13|1-URGENT|Clerk#000000811|0|ess pinto beans. silent c +16935|937|F|169354.83|1992-12-16|4-NOT SPECIFIED|Clerk#000000439|0|ounts are carefully final accounts. carefully final packages cajole +16960|1460|F|128224.65|1992-05-24|2-HIGH|Clerk#000000213|0|ways at the furiously even requests. furiously dogged instructions acros +16961|565|F|55094.11|1994-01-07|4-NOT SPECIFIED|Clerk#000000273|0|egular pinto beans to the blithely final requests sleep carefully bold pinto +16962|448|O|275028.18|1996-09-12|3-MEDIUM|Clerk#000000812|0| even, regular deposits across the slyly bold instruct +16963|1207|O|163206.71|1996-05-04|3-MEDIUM|Clerk#000000666|0|ld packages after the even, express de +16964|197|O|7496.30|1995-10-30|1-URGENT|Clerk#000000597|0| are about the fluffily unusual accounts. final courts along th +16965|1246|O|314306.86|1996-12-24|3-MEDIUM|Clerk#000000869|0|onic pinto beans. quickly ironic accounts +16966|466|F|155882.67|1994-09-25|5-LOW|Clerk#000000496|0|ven ideas. slowly silent dolphins wake slyly. dependenc +16967|280|O|214691.14|1995-08-20|5-LOW|Clerk#000000255|0|p deposits-- final, f +16992|268|F|38076.30|1993-12-13|2-HIGH|Clerk#000000379|0|e carefully above the fluffily special accounts? +16993|928|O|200243.86|1995-11-17|3-MEDIUM|Clerk#000000683|0| deposits. fluffily even asym +16994|854|O|45010.39|1996-03-28|1-URGENT|Clerk#000000813|0|packages. furiously final deposits haggle carefully +16995|529|F|41878.60|1993-12-19|4-NOT SPECIFIED|Clerk#000000044|0|ts. furiously pending theodolites wake blithely along the fur +16996|1142|F|135172.14|1992-02-05|5-LOW|Clerk#000000108|0| according to the iro +16997|580|O|57702.90|1997-08-04|3-MEDIUM|Clerk#000000194|0|ironic theodolites nag fluffily across the careful +16998|1352|O|206143.87|1996-03-28|5-LOW|Clerk#000000853|0|ctions wake carefully against the quickly unusual packages. blithely f +16999|265|F|142083.60|1994-01-20|1-URGENT|Clerk#000000467|0|ses. even, ironic accounts mus +17024|223|F|118484.50|1994-10-14|3-MEDIUM|Clerk#000000235|0|notornis haggle carefully. blithely brave orbits detect quickly. bold pa +17025|472|O|50444.21|1996-11-17|1-URGENT|Clerk#000000676|0| the final gifts cajole enticingly pendi +17026|403|O|291416.08|1996-06-10|3-MEDIUM|Clerk#000000163|0|eposits. even platelets haggle carefully furiously fin +17027|1282|O|212101.46|1995-11-27|2-HIGH|Clerk#000000118|0|riously along the quickly ironic platelets. furiously s +17028|382|F|195247.49|1994-10-16|2-HIGH|Clerk#000000258|0|ounts wake carefully after the sly +17029|181|O|176603.76|1997-10-06|4-NOT SPECIFIED|Clerk#000000422|0|olites wake blithely. furiously even accounts wake furiously. blithe +17030|430|O|251746.94|1997-07-26|3-MEDIUM|Clerk#000000855|0|y unusual packages sleep caref +17031|694|O|43599.02|1996-09-24|5-LOW|Clerk#000000746|0|ironic accounts. carefully close pinto beans integrate regular pinto bea +17056|19|O|267380.45|1998-07-24|1-URGENT|Clerk#000000533|0| furiously ironic foxes haggle bold packages? +17057|22|O|38400.72|1995-05-17|3-MEDIUM|Clerk#000000743|0|asymptotes. theodolites against the carefully bold accounts nag blith +17058|392|F|142333.70|1995-01-02|2-HIGH|Clerk#000001000|0|ending accounts haggle carefully. never even depos +17059|670|O|75411.81|1998-04-06|3-MEDIUM|Clerk#000000202|0|egular, regular deposits wake slyly +17060|1456|O|51995.85|1997-06-08|5-LOW|Clerk#000000780|0|dolites are against the special instructions. regular req +17061|1015|F|111052.02|1992-10-31|1-URGENT|Clerk#000000148|0|oxes cajole. furiously bold foxes use! ironic +17062|130|O|78006.44|1997-09-10|2-HIGH|Clerk#000000353|0|- carefully bold platelets haggle carefully slyl +17063|1370|O|204798.66|1997-07-27|5-LOW|Clerk#000000010|0|the carefully ironic ideas cajole +17088|1189|F|18841.50|1992-03-03|3-MEDIUM|Clerk#000000571|0|ages use quickly quickly even accou +17089|1048|O|130157.54|1997-06-17|5-LOW|Clerk#000000365|0|en deposits against the quickly +17090|886|F|146178.20|1993-04-29|5-LOW|Clerk#000000412|0|nstructions sleep blithely quickly silent depo +17091|1049|F|163458.55|1992-07-22|3-MEDIUM|Clerk#000000422|0|ackages are around the ruthlessly even packages. silent +17092|710|O|233355.06|1996-09-29|1-URGENT|Clerk#000000474|0|olphins. quickly silent platelets hang. even, regular packages slee +17093|232|F|120243.37|1992-02-12|4-NOT SPECIFIED|Clerk#000000236|0|nts detect carefully across the slyly even deposits. ironicall +17094|220|O|250032.42|1996-07-04|2-HIGH|Clerk#000000333|0|thrash at the unusual foxes: express, regular deposits boost. carefully f +17095|1234|O|126179.44|1997-08-07|2-HIGH|Clerk#000000136|0| within the slyly sile +17120|448|O|55051.16|1997-12-05|4-NOT SPECIFIED|Clerk#000000695|0|ht to sleep slyly requests. furio +17121|1402|O|172010.27|1997-02-26|2-HIGH|Clerk#000000177|0|eans. slyly ironic theodolites cajole +17122|121|O|112102.66|1996-09-25|4-NOT SPECIFIED|Clerk#000000220|0| to the carefully final requests sleep slyly regular pin +17123|1216|F|175256.67|1993-10-06|2-HIGH|Clerk#000000390|0|uests are slyly about the carefully ironic requests; quickly spec +17124|598|F|176170.05|1994-10-26|1-URGENT|Clerk#000000917|0|among the furiously express instructi +17125|1093|O|184520.56|1996-08-11|5-LOW|Clerk#000000312|0|riously regular theodolites are pending, express +17126|410|F|64062.55|1992-12-17|5-LOW|Clerk#000000023|0| deposits wake carefully regular accoun +17127|1492|O|180476.75|1996-12-21|4-NOT SPECIFIED|Clerk#000000886|0|ick foxes. slyly stealthy theodolites bo +17152|866|F|166387.17|1992-03-13|2-HIGH|Clerk#000000076|0|equests! stealthy ideas boost. slyly final deposits wa +17153|782|O|282441.78|1996-08-02|5-LOW|Clerk#000000317|0| requests nag slyly around the furiously iro +17154|671|O|42197.07|1998-06-06|2-HIGH|Clerk#000000826|0|pecial dependencies integrate bl +17155|1379|F|258324.96|1994-01-29|3-MEDIUM|Clerk#000000208|0|lyly express accounts against the requests use furiously eve +17156|1471|O|187014.68|1998-01-28|3-MEDIUM|Clerk#000000629|0|platelets. furiously silent theodolites are. quickly regular reque +17157|344|F|70759.71|1992-09-20|5-LOW|Clerk#000000054|0|ounts. ironically regular accoun +17158|946|F|40065.66|1993-04-05|4-NOT SPECIFIED|Clerk#000000716|0|atelets. pending asymptotes haggle quickly among the blithely ironic e +17159|203|O|119621.16|1996-08-14|1-URGENT|Clerk#000000247|0|ts: quickly even accounts cajol +17184|1403|O|82759.42|1997-02-21|2-HIGH|Clerk#000000882|0| ruthless excuses play carefully final requests. +17185|1321|F|83985.22|1994-10-31|4-NOT SPECIFIED|Clerk#000000439|0|xpress patterns. quickly unusual dependencies grow furiously about th +17186|1429|F|198458.96|1994-01-27|3-MEDIUM|Clerk#000000338|0|ns run carefully permanent packages. slyly pendin +17187|328|F|244656.67|1992-09-24|2-HIGH|Clerk#000000370|0|olites promise quickly near the carefully final excuses. slyly regular deposi +17188|98|O|149246.11|1998-01-11|2-HIGH|Clerk#000000618|0|y. regular accounts beside the furiously final instruct +17189|1081|O|124596.56|1995-10-28|2-HIGH|Clerk#000000319|0|pinto beans. foxes haggle carefully special, bold braids +17190|298|O|143101.43|1996-05-28|4-NOT SPECIFIED|Clerk#000000042|0|ong the bold reques +17191|1439|P|152005.25|1995-04-20|2-HIGH|Clerk#000000080|0|packages cajole slyly +17216|512|F|113618.65|1992-05-28|3-MEDIUM|Clerk#000000737|0|nal foxes. carefully eve +17217|994|F|5844.11|1994-08-13|3-MEDIUM|Clerk#000000438|0|ts wake carefully across the reg +17218|998|F|47003.67|1992-07-24|1-URGENT|Clerk#000000007|0|e carefully along the express, ironic accounts! slyly unusual asympto +17219|286|O|106206.96|1996-01-11|2-HIGH|Clerk#000000943|0|al packages across the bold packages run among the furiously silent platelet +17220|442|O|75976.68|1996-11-20|1-URGENT|Clerk#000000817|0|ove the quickly special pinto beans. silent, express theodol +17221|766|F|88687.34|1994-07-17|5-LOW|Clerk#000000985|0|e carefully slyly even requests. express, final asymptotes nag blithely. blit +17222|212|F|44604.86|1993-03-26|4-NOT SPECIFIED|Clerk#000000181|0|even deposits boost blithely even platelets. slyly silent pa +17223|151|F|28330.42|1994-07-17|1-URGENT|Clerk#000000830|0| regular theodolites. fluffily pending deposits abo +17248|1399|O|57320.80|1996-08-31|3-MEDIUM|Clerk#000000899|0|y special requests. express instructions according to the even deposits a +17249|406|F|321444.32|1993-09-26|5-LOW|Clerk#000000081|0|ey players. ironic, ironic instructions are about the blithely pending +17250|1222|F|148519.41|1994-09-21|3-MEDIUM|Clerk#000000960|0|ly. blithely silent packages affix furiously across the express foxes. ironi +17251|421|F|117356.10|1994-10-28|4-NOT SPECIFIED|Clerk#000000579|0|. closely special deposits after the pinto beans are across +17252|1345|P|267460.60|1995-04-30|4-NOT SPECIFIED|Clerk#000000178|0|bove the unusual, ironic pinto beans. silent patterns sub +17253|46|O|168535.55|1995-08-18|1-URGENT|Clerk#000000946|0|to the quickly unusu +17254|953|O|102598.95|1996-10-03|2-HIGH|Clerk#000000959|0|asymptotes engage quickly gifts. request +17255|394|F|47992.66|1993-07-15|4-NOT SPECIFIED|Clerk#000000574|0|ages cajole fluffily bold deposits. ev +17280|478|O|68427.86|1996-06-28|5-LOW|Clerk#000000249|0|ke carefully. silent accounts impress. regular, pendi +17281|1039|F|104531.57|1992-04-01|4-NOT SPECIFIED|Clerk#000000961|0|hely express packages. even, final dependenci +17282|1415|F|88052.32|1994-11-19|5-LOW|Clerk#000000355|0|the blithely unusual accounts. carefully even requests haggle +17283|329|O|136127.55|1995-09-15|4-NOT SPECIFIED|Clerk#000000270|0|egrate ironic, pending accounts. furiously regular requests throughout the +17284|1411|F|12936.89|1994-10-01|1-URGENT|Clerk#000000584|0|le permanently final dependencies. furiousl +17285|577|F|92982.15|1992-02-22|4-NOT SPECIFIED|Clerk#000000019|0|y even accounts. carefully final forges integrate ironic, dogged +17286|436|F|237574.41|1993-09-22|2-HIGH|Clerk#000000373|0|ietly quickly unusual deposits. finally regular theodolites subla +17287|118|O|124050.90|1995-04-06|2-HIGH|Clerk#000000759|0|ending deposits. blithely +17312|1454|O|144774.69|1995-05-21|4-NOT SPECIFIED|Clerk#000000656|0|aggle along the carefully unusual theodolites. furiously unusu +17313|949|F|185581.27|1994-05-08|2-HIGH|Clerk#000000372|0|lites. carefully regular accounts haggle carefully boldly fl +17314|259|O|65534.70|1996-03-25|1-URGENT|Clerk#000000803|0|ongside of the furiously daring pinto beans ought to are pinto bea +17315|1267|F|263348.93|1994-04-23|5-LOW|Clerk#000000423|0|r the bold, final requests. quickly regular foxes sublate reg +17316|368|F|55643.84|1993-01-07|3-MEDIUM|Clerk#000000695|0|sts sleep according to t +17317|506|F|140670.75|1994-12-04|4-NOT SPECIFIED|Clerk#000000711|0|leep carefully brav +17318|136|O|249802.88|1997-06-15|3-MEDIUM|Clerk#000000236|0|riously blithe accounts breach quickly +17319|551|F|7995.45|1994-02-07|4-NOT SPECIFIED|Clerk#000000950|0|long the regular, special deposits. slyly regular deposit +17344|1460|F|221781.77|1993-07-20|1-URGENT|Clerk#000000350|0|sly idle requests. even, ironic deposits +17345|853|O|145268.14|1995-08-03|1-URGENT|Clerk#000000278|0|en, even deposits. ironic, even accounts +17346|583|O|57664.84|1995-03-08|3-MEDIUM|Clerk#000000235|0|l instructions cajole slyly. special, special foxes haggle at the e +17347|997|O|146576.27|1998-03-27|1-URGENT|Clerk#000000955|0|, pending requests. carefully ironic packages print furiously sl +17348|1259|O|35086.73|1997-06-21|5-LOW|Clerk#000000083|0| theodolites. packages integr +17349|517|O|98829.22|1996-05-21|4-NOT SPECIFIED|Clerk#000000219|0|lithely final dolphins. regular wat +17350|551|O|62935.14|1996-05-03|2-HIGH|Clerk#000000884|0|the slyly special accounts. busi +17351|1370|F|53999.62|1994-04-26|5-LOW|Clerk#000000177|0|ts are furiously ideas +17376|1175|O|242082.95|1995-12-05|2-HIGH|Clerk#000000197|0|ccounts. regular, final requests use among the regular packages +17377|914|O|56119.99|1995-10-29|5-LOW|Clerk#000000306|0|the stealthy, unusual pinto beans detect +17378|569|O|217779.82|1996-07-08|1-URGENT|Clerk#000000430|0|the ruthlessly ironic requests sha +17379|473|O|127710.83|1995-08-15|1-URGENT|Clerk#000000708|0|special instructions nag final excuses. b +17380|328|O|256480.65|1998-02-14|2-HIGH|Clerk#000000489|0|edly regular Tiresias. blithely express packages boo +17381|922|F|141295.02|1993-08-15|2-HIGH|Clerk#000000411|0|ully. final instructions after the stealthily even packages wake fluffily r +17382|422|O|112373.31|1995-07-05|4-NOT SPECIFIED|Clerk#000000484|0|nal instructions run furiously regular deposits. carefully quiet dugouts +17383|1498|O|268606.09|1996-03-29|3-MEDIUM|Clerk#000000052|0| wake carefully about the asymptotes. blithely close instructions alo +17408|1447|F|145954.22|1994-05-28|4-NOT SPECIFIED|Clerk#000000704|0| about the blithely pending theod +17409|770|F|230159.95|1993-08-18|4-NOT SPECIFIED|Clerk#000000423|0|ccounts are furiously silent excuses. request +17410|449|F|115603.10|1993-09-02|5-LOW|Clerk#000000790|0|ests. deposits cajole always. blithely even package +17411|721|F|128516.04|1994-08-22|4-NOT SPECIFIED|Clerk#000000918|0|nusual instructions sleep. carefully pending depths nag carefully accor +17412|1294|O|96884.33|1997-11-27|5-LOW|Clerk#000000527|0|lyly across the quickly pending +17413|356|O|67325.87|1996-01-28|4-NOT SPECIFIED|Clerk#000000637|0|regular deposits. stea +17414|166|F|263868.51|1992-06-30|2-HIGH|Clerk#000000398|0|ithely ironic asymp +17415|1036|O|134825.51|1996-09-18|2-HIGH|Clerk#000000148|0|. furiously even asymptotes wake carefully according to t +17440|145|F|176004.76|1995-01-24|4-NOT SPECIFIED|Clerk#000000206|0| sleep fluffily along the carefully ironic accounts. quickly ironic courts +17441|79|F|32057.12|1993-08-02|3-MEDIUM|Clerk#000000049|0| slyly bold requests above the regular notornis ca +17442|751|F|13758.87|1994-01-04|5-LOW|Clerk#000000196|0|uctions affix slyly according to the furiously special deposits. furiously clo +17443|898|O|215904.11|1998-03-29|5-LOW|Clerk#000000155|0|carefully close pinto b +17444|581|F|108777.08|1994-03-23|3-MEDIUM|Clerk#000000893|0|ep. regular excuses boost quickly fluffily even accounts. ironically ironic pa +17445|844|O|109044.61|1995-08-22|4-NOT SPECIFIED|Clerk#000000667|0|nic, bold deposits wake slyly express packages. deposits impress blith +17446|1253|F|76788.33|1994-06-10|1-URGENT|Clerk#000000560|0|tructions use furiously fl +17447|187|F|69076.57|1992-05-19|5-LOW|Clerk#000000141|0|ld, unusual requests. silent pinto beans haggle slyly alongside of the +17472|460|O|103655.58|1995-07-02|4-NOT SPECIFIED|Clerk#000000303|0|rint except the somet +17473|1279|O|79566.82|1998-04-03|2-HIGH|Clerk#000000964|0|y unusual braids. slyly regular packages cajole carefully; regul +17474|1322|O|63211.29|1997-02-15|5-LOW|Clerk#000000392|0|efully regular platel +17475|862|F|218641.53|1993-09-12|5-LOW|Clerk#000000066|0|ully pending accounts detect quickly along t +17476|535|O|115378.37|1996-05-29|1-URGENT|Clerk#000000047|0|ts about the furiously final accounts caj +17477|13|O|111232.04|1997-03-03|2-HIGH|Clerk#000000649|0|ng to the ironic deposits-- even requests are quickly a +17478|236|O|87638.24|1996-11-24|3-MEDIUM|Clerk#000000625|0|even ideas boost platelets. furiously ironic dugouts shall have to unw +17479|1442|O|103534.27|1998-03-30|5-LOW|Clerk#000000405|0|nticing dolphins. thin, regular requests nag. ironic, regular accoun +17504|796|F|134616.90|1994-08-21|5-LOW|Clerk#000000756|0|accounts. fluffily ironic packages cajole slyly about the carefu +17505|391|O|118128.06|1996-02-20|1-URGENT|Clerk#000000189|0| pinto beans. daringly ironic pinto beans cajole. blithe +17506|1228|F|106869.47|1993-03-01|5-LOW|Clerk#000000351|0|ly final deposits wake across the express instructions. express instruct +17507|1169|F|260289.27|1992-06-13|3-MEDIUM|Clerk#000000859|0| fluffily pending theodolites wake carefully ruthless +17508|1400|F|131921.49|1992-06-28|5-LOW|Clerk#000000652|0|s wake regular requests. regul +17509|1069|O|161033.99|1995-08-31|3-MEDIUM|Clerk#000000290|0| excuses. special multipli +17510|895|F|15773.31|1992-10-31|1-URGENT|Clerk#000000397|0|hs haggle blithely at the fluffy, special packages. blithely regular foxes alo +17511|1333|O|12143.99|1995-11-25|5-LOW|Clerk#000000824|0|press instructions are carefully regular accounts. pending accounts +17536|719|O|320696.16|1997-11-04|1-URGENT|Clerk#000000908|0|ven packages use carefully furiously unusual accounts. +17537|334|O|219228.23|1998-07-02|5-LOW|Clerk#000000184|0|heodolites doze blithely theodolites. final instructions use q +17538|1243|F|144783.68|1994-09-16|4-NOT SPECIFIED|Clerk#000000446|0|sly quickly final accounts. furiously final deposits sleep-- final, +17539|1381|O|137696.63|1995-09-16|4-NOT SPECIFIED|Clerk#000000608|0|ng the even foxes detect slyly about the closely express packages. +17540|866|F|101562.03|1992-01-11|5-LOW|Clerk#000000084|0|s sleep across the blith +17541|679|F|141739.22|1993-01-29|2-HIGH|Clerk#000000376|0| the fluffily regular requests? carefully unusual dinos across +17542|1130|F|74445.87|1993-09-01|5-LOW|Clerk#000000257|0|ar dependencies eat final accounts. bli +17543|56|F|109343.12|1992-05-26|1-URGENT|Clerk#000000722|0|odolites snooze carefully. furiously p +17568|1468|F|309580.83|1993-10-09|4-NOT SPECIFIED|Clerk#000000242|0| slyly final asymptotes sublate. regular pinto beans run blithely blithely eve +17569|1376|O|193316.64|1997-07-15|4-NOT SPECIFIED|Clerk#000000946|0|xes sleep. carefully even hockey players so +17570|625|O|172182.98|1996-09-14|5-LOW|Clerk#000000801|0| slyly express packages. fluf +17571|358|F|408345.74|1992-03-16|4-NOT SPECIFIED|Clerk#000000503|0|ckages. blithely silent requests use quickly final packages. somas mainta +17572|1297|O|35445.34|1998-04-18|4-NOT SPECIFIED|Clerk#000000059|0|bold theodolites. ent +17573|1372|O|161566.55|1995-09-05|5-LOW|Clerk#000000353|0|final packages across the fur +17574|328|O|27609.18|1997-09-30|1-URGENT|Clerk#000000659|0|ly regular pinto beans haggl +17575|994|O|9435.02|1998-05-26|2-HIGH|Clerk#000000399|0|blithely final instructio +17600|43|O|236935.69|1995-10-05|3-MEDIUM|Clerk#000000842|0|terns. slyly special packages after the accounts run blithely al +17601|1420|O|41776.15|1998-02-26|2-HIGH|Clerk#000000357|0|uick requests sleep. slyly reg +17602|383|F|19365.87|1992-02-22|1-URGENT|Clerk#000000672|0| regular, regular deposits wake blithely carefully final +17603|479|O|112986.93|1997-12-28|1-URGENT|Clerk#000000454|0|ironic packages. quickly ironic foxes doubt slyly slyly regular accounts. fi +17604|199|O|34088.07|1997-10-09|3-MEDIUM|Clerk#000000424|0|tions wake. even deposits sleep quickly ca +17605|1423|O|298288.14|1998-01-11|4-NOT SPECIFIED|Clerk#000000230|0|ndencies. fluffily even deposits cajole bold +17606|1192|O|68967.20|1996-12-02|4-NOT SPECIFIED|Clerk#000000785|0|en sentiments. furiously ironic accounts abou +17607|1039|F|45842.02|1992-02-17|1-URGENT|Clerk#000000026|0|yly unusual deposits under the blithely ironic ideas engage sly +17632|784|F|197414.30|1993-02-22|3-MEDIUM|Clerk#000000436|0|es should have to sleep. pending, regular attainments nag carefully. +17633|413|F|258950.16|1992-11-23|2-HIGH|Clerk#000000764|0|as. regular excuses cajole slyly unu +17634|1054|F|95835.41|1992-07-22|2-HIGH|Clerk#000000109|0|refully packages. quickly final platelets +17635|614|F|319868.88|1992-02-06|4-NOT SPECIFIED|Clerk#000000145|0|lites. blithely regular instructions sleep slyly against the warthogs. +17636|761|F|225734.11|1994-02-05|5-LOW|Clerk#000000951|0|rls alongside of the ironic, regular dolphins haggle on the quic +17637|1079|F|107869.98|1992-08-23|3-MEDIUM|Clerk#000000263|0|ly express theodolites are quickly +17638|1051|O|73106.63|1995-09-21|3-MEDIUM|Clerk#000000807|0|riously special account +17639|232|O|86053.52|1997-09-01|5-LOW|Clerk#000000633|0|ans. furiously regu +17664|608|O|155648.03|1998-07-07|2-HIGH|Clerk#000000418|0|xpress asymptotes are never. carefully +17665|725|O|184773.34|1996-03-09|2-HIGH|Clerk#000000634|0|nic instructions are slyly sl +17666|316|F|159874.19|1993-09-09|3-MEDIUM|Clerk#000000979|0| requests sleep blithel +17667|1445|O|81182.23|1998-06-22|2-HIGH|Clerk#000000459|0|lly pending theodolites believe alongside of the th +17668|10|F|322342.37|1994-11-26|3-MEDIUM|Clerk#000000511|0|posits. final, express warhorses detect by the blithely regular +17669|916|F|87333.95|1994-04-30|2-HIGH|Clerk#000000537|0|foxes. accounts are ironic, pe +17670|1202|F|172127.70|1994-08-26|3-MEDIUM|Clerk#000000943|0| pinto beans. special pinto beans during the final accounts lose slyly +17671|862|F|52731.04|1992-08-24|2-HIGH|Clerk#000000597|0| packages wake. regular pin +17696|550|O|76475.34|1997-06-06|1-URGENT|Clerk#000000879|0|deposits haggle always among the accounts. blithe +17697|1478|F|320623.44|1993-11-19|1-URGENT|Clerk#000000252|0| ironic accounts wake silently. instructions cajole blithely. ca +17698|298|F|176844.01|1992-05-14|2-HIGH|Clerk#000000021|0| final packages. carefully pending packages haggle slyly. carefu +17699|1439|O|272222.64|1997-09-19|4-NOT SPECIFIED|Clerk#000000522|0|even accounts are. +17700|439|F|205683.84|1992-10-28|1-URGENT|Clerk#000000180|0|s. furiously ironic packa +17701|466|F|262271.91|1992-05-22|1-URGENT|Clerk#000000522|0|somas are quickly even, +17702|686|F|255332.95|1992-04-14|2-HIGH|Clerk#000000175|0|are blithely about the ironic, even deposits. fluffily bold esca +17703|385|O|134584.09|1996-05-03|5-LOW|Clerk#000000701|0| the slyly regular excuses wake accounts. unusual, expr +17728|94|O|25936.18|1998-03-30|4-NOT SPECIFIED|Clerk#000000004|0|nal foxes haggle furiously along the carefu +17729|1255|F|176175.01|1993-04-23|3-MEDIUM|Clerk#000000037|0|endencies integrate furiously. dogged requests detect even, f +17730|655|O|57936.62|1998-02-06|2-HIGH|Clerk#000000437|0|even deposits. blithely express packages cajole quickly regula +17731|943|O|119189.12|1997-11-20|2-HIGH|Clerk#000000977|0|s haggle quickly above the ironic instru +17732|802|O|127322.61|1997-02-07|1-URGENT|Clerk#000000710|0|efully pending packages by the c +17733|845|O|195799.18|1996-06-03|4-NOT SPECIFIED|Clerk#000000164|0|lites x-ray quickly +17734|38|O|2011.15|1996-07-27|3-MEDIUM|Clerk#000000343|0|ully final foxes use care +17735|917|F|236195.31|1992-07-13|5-LOW|Clerk#000000732|0|equests haggle slyly +17760|946|F|165005.85|1992-06-05|4-NOT SPECIFIED|Clerk#000000093|0|uriously final pinto beans wake furiously +17761|778|F|177002.32|1993-07-05|1-URGENT|Clerk#000000137|0|beans cajole slyly; quickly ironic cou +17762|274|O|251183.38|1998-02-17|2-HIGH|Clerk#000000696|0|ing theodolites. regular theodolites use blithely. +17763|1337|O|146957.02|1997-05-03|3-MEDIUM|Clerk#000000950|0|ages wake blithely: deposits boost across t +17764|466|F|99188.60|1994-09-17|5-LOW|Clerk#000000302|0|sly final courts. regular, +17765|571|O|258240.96|1995-09-16|4-NOT SPECIFIED|Clerk#000000518|0|s detect slyly. ideas sleep slyly since the daring frets. silently even i +17766|724|O|44930.34|1996-10-03|4-NOT SPECIFIED|Clerk#000000141|0|sits poach quickly. regular +17767|22|O|35227.07|1996-11-27|4-NOT SPECIFIED|Clerk#000000406|0|onic requests. furiousl +17792|821|O|269656.27|1996-11-18|2-HIGH|Clerk#000000292|0|es. silent, special foxes sleep along the final requests. regular id +17793|481|O|89156.07|1996-06-29|3-MEDIUM|Clerk#000000622|0| ruthlessly. furiously regular requests within +17794|1171|F|243785.14|1994-04-04|3-MEDIUM|Clerk#000000511|0|blithely even ideas. eve +17795|1312|F|242723.46|1994-04-02|3-MEDIUM|Clerk#000000093|0|ic, special deposits are. carefully special dependencies after th +17796|1255|P|128132.04|1995-04-28|2-HIGH|Clerk#000000985|0| quickly special sentiments. express deposits across the blithely ex +17797|196|F|94130.03|1992-07-11|5-LOW|Clerk#000000333|0|ending deposits. final deposits boost slyly along the regular ac +17798|1433|F|181910.60|1992-10-24|4-NOT SPECIFIED|Clerk#000000642|0|believe fluffily above the +17799|430|F|74674.34|1992-09-21|3-MEDIUM|Clerk#000000652|0|lar theodolites wake q +17824|682|O|77337.09|1996-05-23|4-NOT SPECIFIED|Clerk#000000078|0| furiously regular pac +17825|1019|F|288400.93|1993-01-14|4-NOT SPECIFIED|Clerk#000000680|0|ironic ideas. furiously final asym +17826|301|F|172517.78|1992-07-01|2-HIGH|Clerk#000000888|0|ess deposits are furiously. carefully +17827|832|O|197888.82|1996-08-28|1-URGENT|Clerk#000000777|0|doggedly regular dependencies c +17828|658|O|300118.48|1996-01-05|3-MEDIUM|Clerk#000000495|0|s. slyly special dolphins are according to the requests. t +17829|722|F|118657.47|1994-03-12|5-LOW|Clerk#000000225|0|s wake slyly after the carefully ironic pinto beans. carefully expres +17830|184|O|60398.49|1996-09-18|2-HIGH|Clerk#000000663|0|uriously even deposits +17831|1138|F|209150.00|1992-10-26|1-URGENT|Clerk#000000005|0|. slyly express ideas +17856|1222|O|73447.28|1996-11-23|1-URGENT|Clerk#000000100|0|e silent foxes. even deposits along the slyly final requests wake fluffily r +17857|697|O|195852.17|1997-06-03|2-HIGH|Clerk#000000642|0|es haggle after the pending, bold accounts. furiously ironic foxes against the +17858|1249|F|208302.40|1993-09-26|3-MEDIUM|Clerk#000000843|0|arthogs upon the asymptotes det +17859|583|F|159945.82|1993-05-27|1-URGENT|Clerk#000000907|0|row final requests. deposits use according +17860|980|P|252914.07|1995-04-07|1-URGENT|Clerk#000000280|0|ets after the regular epitaphs use quickly pending packages. carefull +17861|509|O|94718.97|1996-10-29|1-URGENT|Clerk#000000152|0|ending accounts about the requests wa +17862|8|F|197230.45|1992-05-08|4-NOT SPECIFIED|Clerk#000000814|0|es. regular, regular accounts acc +17863|205|O|7733.64|1996-05-21|2-HIGH|Clerk#000000644|0|the final, regular requests. ironic platelets haggle quickly from +17888|349|O|81797.00|1995-12-21|3-MEDIUM|Clerk#000000455|0|jole finally quickly even requests. slyly final deposits across th +17889|1439|F|116079.20|1992-08-07|1-URGENT|Clerk#000000368|0|ly. thinly final accounts use q +17890|367|O|47317.62|1995-10-18|4-NOT SPECIFIED|Clerk#000000727|0|ions. carefully special frays +17891|743|F|123351.12|1995-01-07|1-URGENT|Clerk#000000395|0| slyly final asymptotes abo +17892|1117|O|180098.64|1996-08-17|1-URGENT|Clerk#000000260|0| dolphins. blithely regular instructions sleep fluffily. +17893|1342|F|49713.19|1992-03-23|5-LOW|Clerk#000000054|0|re slyly in place of the blithely express deposits. packages wake about t +17894|751|F|84724.01|1992-12-21|3-MEDIUM|Clerk#000000053|0|kages. carefully pending ideas sleep carefully carefully +17895|194|O|199667.80|1996-08-13|2-HIGH|Clerk#000000339|0|osits run along the s +17920|394|O|278601.15|1998-02-03|1-URGENT|Clerk#000000570|0|uests. slyly regular accounts cajole qu +17921|1061|O|176623.22|1998-07-28|3-MEDIUM|Clerk#000000970|0|equests sleep carefully arou +17922|772|F|30320.54|1994-10-02|2-HIGH|Clerk#000000277|0|f the requests. final, ironic dugouts was. special foxes +17923|224|O|150267.30|1998-07-05|5-LOW|Clerk#000000683|0|fully ironic foxes. unusual, ironi +17924|475|O|227410.94|1995-08-27|1-URGENT|Clerk#000000015|0|gular pinto beans was even accounts! +17925|1315|F|16077.82|1992-09-25|1-URGENT|Clerk#000000294|0|sits are quickly slyly ironic accounts. slyly regular accounts wake sly +17926|1087|O|150348.49|1995-11-11|1-URGENT|Clerk#000000250|0|es believe after the furiously sly accou +17927|208|F|81264.00|1994-08-10|3-MEDIUM|Clerk#000000868|0|es. fluffily special deposits sleep. regular, express courts after the iron +17952|334|F|88167.25|1993-10-12|3-MEDIUM|Clerk#000000016|0|fluffily final epitaphs haggle slyly pending accounts. requ +17953|955|F|195036.40|1992-08-21|2-HIGH|Clerk#000000464|0|latelets nag carefully carefully final requests. slyly reg +17954|1111|F|75612.48|1992-11-12|2-HIGH|Clerk#000000886|0|theodolites against the carefully thin requests +17955|1060|O|149531.93|1998-07-22|5-LOW|Clerk#000000708|0|accounts boost slyly blithely speci +17956|641|F|140215.26|1993-08-06|1-URGENT|Clerk#000000103|0|ests. ironic, regular grouches nag r +17957|971|F|52019.18|1993-12-10|4-NOT SPECIFIED|Clerk#000000907|0| promise. quickly even d +17958|764|O|211111.74|1995-08-12|5-LOW|Clerk#000000258|0|ly express foxes. accounts sleep. slyly silent packages wake slyly +17959|40|F|77247.66|1992-09-10|3-MEDIUM|Clerk#000000373|0| x-ray. carefully regular accounts wake above the slyl +17984|413|O|233403.14|1997-05-18|2-HIGH|Clerk#000000551|0|uriously. accounts cajole quickly against the carefully final accounts. even i +17985|1355|P|150572.48|1995-04-13|3-MEDIUM|Clerk#000000959|0|s after the slyly careful instructions haggle after the carefully ir +17986|673|F|166187.06|1992-04-06|4-NOT SPECIFIED|Clerk#000000044|0|nag slyly ironic account +17987|97|F|53790.79|1994-08-07|3-MEDIUM|Clerk#000000496|0|cial accounts sleep; furiously pending pinto beans bo +17988|1240|F|288662.86|1993-09-23|5-LOW|Clerk#000000290|0|ts wake about the even dependencies. furiously pending accounts cajole at th +17989|364|F|133669.05|1994-01-17|4-NOT SPECIFIED|Clerk#000000547|0|ously express excuses. even theodolit +17990|458|O|218031.58|1998-03-18|3-MEDIUM|Clerk#000000340|0|ounts wake final foxe +17991|92|O|20732.51|1998-07-09|4-NOT SPECIFIED|Clerk#000000636|0| the quickly express accounts. iron +18016|403|O|174070.99|1996-03-19|1-URGENT|Clerk#000000629|0|ly. quickly ironic excuses are furiously. carefully ironic pack +18017|958|F|203091.02|1993-03-26|1-URGENT|Clerk#000000830|0|sleep quickly bold requests. slyly pending pinto beans haggle in pla +18018|364|O|48044.28|1997-12-04|2-HIGH|Clerk#000000460|0|ecial ideas. foxes acr +18019|1199|O|182007.70|1997-04-23|3-MEDIUM|Clerk#000000277|0|oxes are by the careful, pending pinto beans. ir +18020|1255|O|192561.35|1995-12-29|1-URGENT|Clerk#000000312|0|sits nag slowly ironic foxes. furiously bold depos +18021|526|F|102415.42|1994-03-19|4-NOT SPECIFIED|Clerk#000000246|0|old frays. requests outside the slyly silent +18022|533|O|36680.12|1996-05-17|5-LOW|Clerk#000000903|0| packages. slyly ironic requests integrate fluffily. +18023|331|F|60757.15|1995-02-25|3-MEDIUM|Clerk#000000895|0| warthogs among the carefully bold re +18048|1312|F|205552.42|1994-07-16|1-URGENT|Clerk#000000578|0|ully stealthy accounts nag furiously. express requests wake sl +18049|766|F|180924.04|1994-08-14|3-MEDIUM|Clerk#000000325|0|le accounts. slyly pending instructions wa +18050|1067|O|243802.84|1996-01-11|2-HIGH|Clerk#000000394|0|s integrate blithely +18051|388|O|150421.81|1998-02-09|3-MEDIUM|Clerk#000000952|0|final, even dependencies agains +18052|68|O|166082.65|1997-11-04|1-URGENT|Clerk#000000941|0|ar ideas. regular, unu +18053|562|O|190517.78|1997-08-23|1-URGENT|Clerk#000000113|0|packages nod deposits. +18054|1349|O|45950.50|1995-08-30|4-NOT SPECIFIED|Clerk#000000451|0|furiously regular deposits hag +18055|115|F|228800.09|1993-02-05|1-URGENT|Clerk#000000358|0|even Tiresias boost blithely. furiously final deposits cajol +18080|1028|F|177638.53|1994-06-23|2-HIGH|Clerk#000000370|0|use furiously slyly +18081|809|O|63779.18|1996-10-02|1-URGENT|Clerk#000000154|0| whithout the even asymp +18082|727|O|22936.59|1998-07-06|4-NOT SPECIFIED|Clerk#000000371|0| pending instructions. slyly pending grouches wake. final +18083|440|F|84977.76|1994-03-13|4-NOT SPECIFIED|Clerk#000000608|0|out the unusual ideas; stealthy, brave ideas wake carefully expres +18084|650|O|233227.17|1996-08-22|2-HIGH|Clerk#000000069|0|ely after the blithely pending accounts. hocke +18085|571|O|126586.16|1995-09-26|2-HIGH|Clerk#000000831|0|ites. final foxes unwind furiously abou +18086|1348|O|232026.35|1998-05-24|2-HIGH|Clerk#000000017|0|y. daringly special pinto be +18087|1475|F|213962.99|1993-04-01|5-LOW|Clerk#000000149|0|ily final deposits are slyly blithely ironic de +18112|1097|F|171265.58|1992-03-17|4-NOT SPECIFIED|Clerk#000000037|0|sleep bravely. carefully final theodolites wake furiously. foxes wake quick +18113|368|F|186953.33|1992-08-29|4-NOT SPECIFIED|Clerk#000000521|0|e slyly blithely pending accounts: regular, r +18114|671|O|107662.60|1996-11-14|3-MEDIUM|Clerk#000000054|0|riously ironic ideas against the furiously regular courts are +18115|778|F|54477.37|1993-07-08|1-URGENT|Clerk#000000837|0| poach. furiously ironic packages wake +18116|136|P|174558.83|1995-05-07|2-HIGH|Clerk#000000018|0|usly special foxes. unusu +18117|584|F|131451.69|1994-02-07|5-LOW|Clerk#000000810|0|tions sleep about the furiously close packages. fluffi +18118|463|O|200740.81|1997-03-03|2-HIGH|Clerk#000000078|0|ily after the fluffil +18119|632|F|143138.42|1994-06-25|5-LOW|Clerk#000000971|0|. ironic, final Tiresias sleep blithely fluffily final acco +18144|976|O|168158.81|1995-06-08|1-URGENT|Clerk#000000973|0|es across the quickly regular excuses boost foxes. re +18145|418|F|163965.05|1993-09-05|3-MEDIUM|Clerk#000000840|0| above the ironic, ruthless instructions. blithely ironi +18146|1483|O|29116.46|1997-10-14|2-HIGH|Clerk#000000350|0|g fluffily. excuses breach fluffily after the furiou +18147|190|F|131707.06|1994-07-18|4-NOT SPECIFIED|Clerk#000000954|0|ter the special asymptotes. ideas after the unusual frets caj +18148|1258|O|16236.69|1996-08-04|2-HIGH|Clerk#000000730|0|-- carefully ironic accounts are bravely. express theodolites among the bol +18149|955|O|250650.32|1997-01-15|3-MEDIUM|Clerk#000000571|0|ests cajole requests. bold dugout +18150|1315|O|209491.14|1997-04-13|4-NOT SPECIFIED|Clerk#000000977|0|thely regular instructions are. even requests use slyly. special accoun +18151|20|O|276303.00|1996-01-05|4-NOT SPECIFIED|Clerk#000000066|0|ackages after the furiously regular accounts haggle ironic, expre +18176|160|O|42412.00|1996-05-30|1-URGENT|Clerk#000000005|0|slyly pending platelets about +18177|169|F|153852.70|1994-02-23|2-HIGH|Clerk#000000323|0|ly regular requests was slyly across the furiously ironi +18178|262|F|112837.92|1994-11-03|5-LOW|Clerk#000000315|0| special dinos. express +18179|1096|F|225060.98|1994-08-02|4-NOT SPECIFIED|Clerk#000000797|0|he carefully unusual accounts. slyly regular theodolites are silentl +18180|1006|F|56552.67|1992-01-10|2-HIGH|Clerk#000000081|0|ffix carefully regular packages. blithely fi +18181|1286|O|88430.59|1996-03-12|1-URGENT|Clerk#000000881|0|nwind. final waters shall haggle sl +18182|1012|P|254337.04|1995-04-11|3-MEDIUM|Clerk#000000342|0|arhorses above the bold pinto beans use final packag +18183|1402|O|37495.91|1996-12-14|1-URGENT|Clerk#000000571|0|egular packages against the +18208|883|F|250068.33|1992-04-02|4-NOT SPECIFIED|Clerk#000000191|0|iously ironic accounts on the eve +18209|224|O|150503.14|1996-02-26|3-MEDIUM|Clerk#000000463|0|thely even platelets cajole quickly across th +18210|1169|F|296761.32|1993-08-07|4-NOT SPECIFIED|Clerk#000000697|0|re carefully against the even ideas. pinto beans according t +18211|110|O|241497.60|1996-07-31|3-MEDIUM|Clerk#000000363|0|e slyly furiously final ideas. special platelets wake carefully ac +18212|709|O|290225.34|1997-07-20|5-LOW|Clerk#000000630|0|fily. carefully ironic +18213|1090|F|125951.67|1993-09-11|3-MEDIUM|Clerk#000000877|0|ss instructions. quickly pending theodolites across +18214|662|O|35961.14|1996-01-13|4-NOT SPECIFIED|Clerk#000000707|0|. pending packages +18215|455|F|108595.79|1993-09-20|3-MEDIUM|Clerk#000000609|0|ding requests. even deposits are blithely f +18240|1328|O|90350.26|1997-11-10|5-LOW|Clerk#000000647|0|arefully ironic instructions. slyly pending theodolites haggle inst +18241|1238|F|166921.49|1993-07-28|5-LOW|Clerk#000000426|0|press requests above the carefully express ideas use blithely slyly regular +18242|221|F|93242.84|1994-10-31|3-MEDIUM|Clerk#000000981|0|r instructions about the regular accounts detect blithely among the quickly r +18243|532|O|46390.90|1997-07-27|1-URGENT|Clerk#000000407|0| ideas. carefully e +18244|1222|F|95611.93|1995-02-12|1-URGENT|Clerk#000000254|0| deposits haggle blithely blithely fluffy requests. sometimes +18245|533|F|51626.89|1993-06-05|2-HIGH|Clerk#000000383|0|t slyly blithely regular deposits. accounts acc +18246|523|O|113995.32|1997-06-05|1-URGENT|Clerk#000000639|0|e depths. regular, express ide +18247|1141|F|75927.62|1994-11-06|4-NOT SPECIFIED|Clerk#000000808|0|onic, ironic ideas nag furiously. furiously regular instruction +18272|1282|O|99252.93|1998-06-17|2-HIGH|Clerk#000000040|0|requests. even ideas around the regular deposits cajol +18273|110|O|211314.65|1995-09-16|5-LOW|Clerk#000000208|0| use slyly. slyly special deposits hinder ca +18274|272|F|16172.32|1993-09-15|5-LOW|Clerk#000000678|0|er the pending pinto beans cajole blithely regularly express deposits: u +18275|206|F|209650.53|1992-01-11|5-LOW|Clerk#000000424|0|instructions. ironic sentiments sl +18276|1129|O|248032.90|1996-12-30|3-MEDIUM|Clerk#000000932|0|ves cajole. ironic requests are. asym +18277|481|O|115652.48|1998-03-03|4-NOT SPECIFIED|Clerk#000000154|0|ly between the unusual pinto beans. furiously silent ideas ha +18278|845|O|34912.16|1996-03-20|4-NOT SPECIFIED|Clerk#000000363|0|lar, final gifts integrate according to the slyly ruthless requ +18279|334|F|185640.10|1994-02-27|3-MEDIUM|Clerk#000000915|0|r deposits mold blithely about the furiously unusual theodoli +18304|1426|F|304078.71|1992-07-08|2-HIGH|Clerk#000000585|0|into beans kindle blithely furiously express theodolites! careful +18305|1066|O|116022.68|1997-08-17|3-MEDIUM|Clerk#000000605|0|-- dependencies above the regular, ironic ide +18306|796|O|56184.43|1996-06-06|5-LOW|Clerk#000000333|0| across the silent package +18307|10|F|158346.75|1993-02-03|5-LOW|Clerk#000000033|0| express sheaves would hinder above the slyly even deposits. +18308|778|F|218514.66|1994-10-10|4-NOT SPECIFIED|Clerk#000000315|0|ording to the even instructio +18309|434|O|51954.58|1996-02-13|5-LOW|Clerk#000000985|0| integrate special foxes. blithely si +18310|1324|F|3389.08|1993-06-12|1-URGENT|Clerk#000000327|0|ress ideas. furiously regular ideas along the stealthy requests use along +18311|181|O|136099.49|1998-03-20|4-NOT SPECIFIED|Clerk#000000734|0|al excuses. furiously ironic asymptotes above the depos +18336|763|F|156603.36|1994-04-25|4-NOT SPECIFIED|Clerk#000000840|0| unusual foxes promise special, express +18337|1453|F|80326.65|1994-02-26|1-URGENT|Clerk#000000889|0|ake carefully. careful +18338|1331|F|246235.10|1994-05-18|3-MEDIUM|Clerk#000000928|0|regular waters nag furiously. blithely silent packages are express deposits +18339|692|O|54697.21|1997-11-03|1-URGENT|Clerk#000000046|0|kly according to the permanently bold excuses. carefully unusual accounts s +18340|844|O|238778.86|1995-06-18|3-MEDIUM|Clerk#000000700|0|ic pinto beans according to the blithely daring theodo +18341|1183|F|52244.90|1993-07-19|1-URGENT|Clerk#000000423|0|lyly pending deposits ab +18342|949|O|185178.92|1996-11-19|1-URGENT|Clerk#000000014|0|lithely. final, ironic deposits eat carefully slyly even theo +18343|1009|O|11283.59|1998-04-08|3-MEDIUM|Clerk#000000724|0|refully fluffy excuses print carefully. quickly ironic request +18368|169|F|72408.01|1992-12-01|4-NOT SPECIFIED|Clerk#000000848|0|e. furiously pending pinto beans wake spe +18369|532|O|44794.49|1998-01-26|2-HIGH|Clerk#000000509|0|ould have to are slyly after the thinly bold depths. thinly unusual req +18370|49|F|132889.48|1995-01-14|5-LOW|Clerk#000000208|0|the regular pinto beans. even, regular foxes across +18371|349|F|42060.09|1994-09-19|3-MEDIUM|Clerk#000000066|0|lyly theodolites. blithely final inst +18372|946|O|136967.99|1995-10-18|2-HIGH|Clerk#000000050|0|arefully about the ironic, unusual packages. furiously ironic re +18373|208|F|7474.10|1992-04-13|1-URGENT|Clerk#000000427|0|e blithely carefully final pinto beans. blithely silent theodolite +18374|1442|F|142266.41|1992-10-01|5-LOW|Clerk#000000354|0| ironic deposits are carefully blith +18375|599|O|141948.32|1995-09-23|5-LOW|Clerk#000000508|0|equests. blithely express +18400|856|O|127969.78|1995-12-07|4-NOT SPECIFIED|Clerk#000000771|0|t quickly against the furiously unusual pa +18401|1210|O|75236.22|1996-10-05|3-MEDIUM|Clerk#000000415|0|s nag furiously. patterns about the fluffily even +18402|910|F|273368.68|1994-08-30|5-LOW|Clerk#000000698|0|pendencies. packages +18403|1247|O|78273.51|1996-11-03|1-URGENT|Clerk#000000139|0|gular foxes doubt upon the furiously final accounts. regular ideas are +18404|418|O|41192.34|1998-04-02|4-NOT SPECIFIED|Clerk#000000117|0|e deposits. even requests about the +18405|976|F|179399.51|1994-01-08|3-MEDIUM|Clerk#000000017|0|earls atop the slyly ironic instructions wake blithely final ideas. doggedly +18406|620|F|73456.61|1994-04-15|2-HIGH|Clerk#000000633|0|even packages are slyly about the furiously ironic reque +18407|916|F|25505.35|1992-10-23|2-HIGH|Clerk#000000995|0|s are. fluffily pending accounts affix final, regular +18432|1352|F|246330.37|1995-03-13|2-HIGH|Clerk#000000065|0|ly. blithely express packages integrate +18433|163|O|129815.16|1998-04-15|4-NOT SPECIFIED|Clerk#000000573|0|g the quickly unusual packages. reg +18434|985|O|134633.55|1997-07-03|5-LOW|Clerk#000000245|0|heodolites wake according to the blithely final foxes. s +18435|7|O|181756.27|1996-03-16|5-LOW|Clerk#000000988|0|nusual excuses sleep across the even packages. regular excuses affix. f +18436|1315|O|156749.21|1995-12-08|5-LOW|Clerk#000000847|0|nly. blithely unusu +18437|898|F|31346.71|1994-05-22|5-LOW|Clerk#000000033|0|. final packages sleep! quickly regular theod +18438|844|O|265176.00|1996-08-05|2-HIGH|Clerk#000000725|0|ages. slowly bold deposits haggle across the blithely ex +18439|1315|O|248110.94|1998-06-07|1-URGENT|Clerk#000000577|0|es. regular deposits wake furiously unusual deposits: quickly final instru +18464|1313|F|151597.68|1992-03-29|2-HIGH|Clerk#000000633|0|. final accounts across the blithely regular +18465|1378|F|198232.02|1993-04-16|2-HIGH|Clerk#000000100|0|sts. carefully final foxes wake carefully. +18466|1123|F|202306.18|1992-05-22|5-LOW|Clerk#000000919|0|attainments. blithely special accounts haggle sly +18467|854|F|11099.08|1992-12-05|5-LOW|Clerk#000000034|0|ly special instructions. bl +18468|1417|F|121756.25|1993-12-09|1-URGENT|Clerk#000000832|0|g to the furiously ironic instructions wake furiousl +18469|1015|O|160122.54|1998-06-26|4-NOT SPECIFIED|Clerk#000000550|0|unusual requests cajole quickly ironic instructions. pending theodoli +18470|1391|O|111829.87|1998-03-25|3-MEDIUM|Clerk#000000296|0|ar accounts. slyly final excuses doze furiously bold excuses: +18471|217|F|239226.82|1994-02-20|4-NOT SPECIFIED|Clerk#000000334|0|kages whithout the special, regular deposits are carefully furiousl +18496|65|F|149265.96|1994-05-16|2-HIGH|Clerk#000000471|0|riously regular courts cajole fluffily. carefully bold deposits det +18497|838|O|58125.20|1997-06-15|1-URGENT|Clerk#000000670|0|d courts are regular, regular accounts. furious +18498|184|O|137898.67|1996-11-15|4-NOT SPECIFIED|Clerk#000000421|0|r pinto beans! express, special +18499|1255|O|82058.53|1997-06-28|2-HIGH|Clerk#000000993|0|ound the dolphins. slyly regula +18500|88|F|172210.73|1992-02-12|3-MEDIUM|Clerk#000000084|0| pinto beans wake closely after the even dependencies. furiously ironic pla +18501|1066|O|49459.99|1996-12-07|2-HIGH|Clerk#000000797|0|ecial waters are fluffily about the slyly +18502|1192|O|118614.58|1997-01-24|1-URGENT|Clerk#000000890|0|sleep furiously. blithely regular accounts w +18503|1142|P|267814.71|1995-05-06|4-NOT SPECIFIED|Clerk#000000619|0|ts. blithely regular packages cajole. quickly express reque +18528|898|P|230497.20|1995-05-01|1-URGENT|Clerk#000000154|0|use blithely blithely pending instructions. busy, ir +18529|1255|O|55360.23|1996-08-25|4-NOT SPECIFIED|Clerk#000000473|0|e slyly among the slyly regular instru +18530|1472|F|111217.98|1995-01-01|4-NOT SPECIFIED|Clerk#000000420|0|rses wake blithely; carefully final pinto +18531|367|F|50540.92|1992-10-30|1-URGENT|Clerk#000000527|0|slyly. fluffily express dolphins +18532|1043|O|213720.01|1995-10-21|4-NOT SPECIFIED|Clerk#000000889|0|he special, silent pinto beans. dolphins above the furiously pending reques +18533|1489|F|130840.40|1994-11-07|4-NOT SPECIFIED|Clerk#000000485|0| furiously special platelets; quic +18534|1225|O|82504.37|1995-12-31|5-LOW|Clerk#000000185|0| pinto beans. special deposits across the sl +18535|1042|O|75105.90|1996-08-03|2-HIGH|Clerk#000000209|0|onic pinto beans cajole along the silent, final sauternes. fluffily regul +18560|1411|F|54223.61|1993-08-14|3-MEDIUM|Clerk#000000840|0|kly silent instructions across the furious +18561|364|F|213924.51|1994-01-10|4-NOT SPECIFIED|Clerk#000000334|0| above the quickly silent pinto beans use blithely furiously +18562|418|O|77730.47|1995-12-21|1-URGENT|Clerk#000000977|0| furiously ironic packages. +18563|364|O|156419.69|1996-10-04|1-URGENT|Clerk#000000729|0|lar packages. ironic, special packages cajole among +18564|221|O|191610.45|1996-03-18|2-HIGH|Clerk#000000955|0|s the furiously even pinto beans. carefully regular account +18565|1387|F|58510.19|1992-11-05|5-LOW|Clerk#000000820|0|gular requests; carefully pending ideas may hinder above the quickly i +18566|239|O|127688.83|1996-07-20|5-LOW|Clerk#000000766|0|ly above the slyly unusual deposits. attainments wake busily bold, unusu +18567|1034|O|69994.55|1997-02-10|5-LOW|Clerk#000000891|0|lms wake according to the t +18592|680|F|193894.85|1992-10-01|1-URGENT|Clerk#000000435|0|requests! pinto beans from the bold platelets sle +18593|1220|O|248768.17|1995-09-23|2-HIGH|Clerk#000000168|0| regular pinto beans. fluffily bold accounts cajole among the slyly final ac +18594|1111|O|145464.32|1997-12-15|1-URGENT|Clerk#000000849|0|ly ironic pinto beans sleep final pinto beans. +18595|94|F|156991.55|1994-02-01|1-URGENT|Clerk#000000226|0|ns. regular deposits wake quickly; slyly pending de +18596|854|F|218727.09|1992-10-03|5-LOW|Clerk#000000800|0|ake furiously carefully regular packages. silent ideas cajole even theodolit +18597|1430|F|275195.35|1993-09-27|3-MEDIUM|Clerk#000000477|0|ve the sometimes special packages. sl +18598|299|F|147055.29|1993-08-07|1-URGENT|Clerk#000000639|0|ely. ironic courts use fluffily ironic orbits. reque +18599|634|F|151331.08|1994-03-22|2-HIGH|Clerk#000000500|0| accounts among the furiou +18624|950|O|233705.62|1995-07-27|2-HIGH|Clerk#000000104|0|ndencies are up the boldly even ideas. deposits ar +18625|1489|F|283425.83|1992-01-06|1-URGENT|Clerk#000000512|0|its use furiously abou +18626|1355|F|140536.64|1994-02-18|1-URGENT|Clerk#000000933|0|ically even ideas; fina +18627|1316|F|145210.54|1993-12-21|3-MEDIUM|Clerk#000000782|0|reach final instructions. care +18628|442|F|30634.17|1992-08-24|3-MEDIUM|Clerk#000000247|0|sly ironic excuses are carefully +18629|1042|F|154273.04|1994-10-31|3-MEDIUM|Clerk#000000505|0|uriously slow courts wake quickly carefully e +18630|1453|O|42639.85|1997-12-09|4-NOT SPECIFIED|Clerk#000000089|0| blithely. regular, regular dependencies alongside of +18631|148|O|23231.22|1995-09-15|3-MEDIUM|Clerk#000000483|0|t unusual, final requests. excuses cajole alongside of the ironi +18656|296|O|102848.18|1998-07-13|5-LOW|Clerk#000000863|0|rts cajole slyly blithely final accounts. fl +18657|529|O|224908.63|1997-02-15|4-NOT SPECIFIED|Clerk#000000082|0|olites cajole carefully according to the regular grouches: ironic dep +18658|934|O|221743.18|1997-05-06|5-LOW|Clerk#000000328|0|packages eat quickly ironic dolphins. slyly special asymptotes haggle +18659|352|O|162253.22|1996-02-17|2-HIGH|Clerk#000000682|0|nic requests haggle ironic dol +18660|683|O|261926.68|1998-02-06|1-URGENT|Clerk#000000483|0| boost carefully fluffily even packa +18661|1424|F|15962.42|1992-09-09|5-LOW|Clerk#000000712|0|ts thrash. carefully unusual packages nag carefully again +18662|838|O|40860.98|1996-04-09|3-MEDIUM|Clerk#000000351|0| wake pinto beans. multipliers according to +18663|163|O|234901.85|1995-07-16|4-NOT SPECIFIED|Clerk#000000101|0|the carefully bold theodolites. instructions integrate slyly close depos +18688|1343|P|273024.36|1995-03-06|4-NOT SPECIFIED|Clerk#000000065|0|its nag fluffily blithely ironic excuses. +18689|1010|F|259954.42|1994-12-25|4-NOT SPECIFIED|Clerk#000000813|0|jole even theodolites. slyly regular packages above the slyly i +18690|1337|O|267388.26|1997-09-30|4-NOT SPECIFIED|Clerk#000000048|0|ut the foxes. regula +18691|664|O|182946.91|1996-12-14|5-LOW|Clerk#000000013|0|ironic epitaphs dazzle slyly along the quickly ironic dolphins. furi +18692|505|O|120549.56|1996-06-06|4-NOT SPECIFIED|Clerk#000000581|0|c, regular accounts cajole ironic e +18693|898|O|189452.56|1996-07-27|4-NOT SPECIFIED|Clerk#000000210|0|longside of the furiously pending pi +18694|283|O|74012.94|1998-05-18|5-LOW|Clerk#000000763|0|s. ironically even requests promise quickly ex +18695|161|O|81704.64|1996-10-05|5-LOW|Clerk#000000390|0|ully regular deposits sleep fur +18720|598|O|303231.42|1996-03-03|2-HIGH|Clerk#000000122|0| about the slyly final +18721|578|F|11067.59|1993-06-13|1-URGENT|Clerk#000000302|0|eodolites. ironically bold ideas are furiously final ideas. blithely pend +18722|785|F|87209.74|1993-07-17|4-NOT SPECIFIED|Clerk#000000692|0|ns serve toward the slyly final pinto beans. carefully even reque +18723|451|F|191908.50|1994-08-13|3-MEDIUM|Clerk#000000526|0| decoys use thinly furiously special excuses. ironic packages will are furious +18724|536|F|95300.95|1993-02-09|3-MEDIUM|Clerk#000000938|0|ts. slowly even packages sleep. requests boost slyly. furiously regul +18725|5|F|114060.99|1992-11-22|2-HIGH|Clerk#000000569|0|y bold pinto beans. even decoys wake furiously. carefully regu +18726|1330|F|202558.45|1994-09-29|1-URGENT|Clerk#000000666|0|slyly-- ironic ideas believe abou +18727|745|O|104750.18|1997-02-07|4-NOT SPECIFIED|Clerk#000000703|0|nag slyly fluffily silent accounts. furiously iron +18752|1468|O|23238.24|1995-04-22|1-URGENT|Clerk#000000936|0|s. ideas around the carefully ironic pinto beans m +18753|175|F|217837.16|1994-08-01|3-MEDIUM|Clerk#000000119|0|slyly slyly express ideas. evenly bold ideas wake c +18754|979|F|247120.22|1994-09-26|4-NOT SPECIFIED|Clerk#000000362|0|as haggle slyly final foxes. carefully +18755|16|O|114969.72|1997-02-15|3-MEDIUM|Clerk#000000704|0|ts. carefully special frets wake slyly +18756|1483|F|11776.97|1992-04-04|2-HIGH|Clerk#000000835|0|ke fluffily. carefully pending dept +18757|161|F|151378.53|1992-05-23|5-LOW|Clerk#000000145|0|s: ironic packages solve +18758|1405|F|109926.11|1993-04-21|4-NOT SPECIFIED|Clerk#000000178|0|quickly regular requests. final deposits sleep across the quickly regular +18759|1076|O|21360.32|1996-05-21|1-URGENT|Clerk#000000704|0|efully among the pinto beans. carefully even ideas +18784|1303|F|58551.30|1992-08-10|5-LOW|Clerk#000000837|0|posits run against the slyly regular excuses. foxes engage furiousl +18785|853|F|101575.11|1994-07-04|2-HIGH|Clerk#000000719|0|wake carefully bold pinto beans. blithely express instruction +18786|1378|O|218860.29|1997-04-03|5-LOW|Clerk#000000557|0| special pinto beans integrate evenly. blithely unusual +18787|731|F|140395.66|1994-10-18|5-LOW|Clerk#000000704|0|y unusual deposits sleep finally according to the regular, bold accou +18788|1457|F|162530.39|1994-10-03|4-NOT SPECIFIED|Clerk#000000184|0|inst the silently unusua +18789|742|P|252777.51|1995-03-17|2-HIGH|Clerk#000000395|0| are slyly! quickly final pinto beans sleep slyly bold requests. requests +18790|23|F|72860.79|1994-02-12|2-HIGH|Clerk#000000274|0|kly blithely pending excuses. furiously ironic foxes n +18791|1130|F|37743.26|1993-09-03|2-HIGH|Clerk#000000288|0|eans. pinto beans grow quickly quickly regular request +18816|289|F|262485.42|1994-02-25|1-URGENT|Clerk#000000157|0| haggle after the ironic foxes. ironic instructions haggle slyly fin +18817|905|O|134213.68|1996-11-13|5-LOW|Clerk#000000199|0|lar pinto beans haggle quietly carefully ironic platelets. deposit +18818|1235|O|87076.54|1997-09-09|2-HIGH|Clerk#000000621|0|ounts. deposits are pinto beans. quickly quiet accounts doubt +18819|244|F|320533.24|1994-02-26|5-LOW|Clerk#000000325|0|e the ironic deposits sleep since the furiously express idea +18820|1016|F|168451.41|1995-02-12|3-MEDIUM|Clerk#000000329|0|even requests grow carefully quickly ironic deposits. furiously sil +18821|512|O|208491.40|1996-02-24|2-HIGH|Clerk#000000331|0|ix furiously alongside of the carefully express requests. dependencie +18822|65|F|155357.92|1993-12-22|5-LOW|Clerk#000000118|0|g to the ironic, idl +18823|1244|F|58219.49|1992-10-07|5-LOW|Clerk#000000494|0|sly final pinto beans are slyly according to the theodolites. final +18848|632|O|123886.57|1998-03-30|2-HIGH|Clerk#000000530|0|ly regular dolphins; slyly regular instructions are boldly along the p +18849|1264|F|181140.10|1992-08-06|2-HIGH|Clerk#000000809|0| warthogs cajole furiously blithely bold packages. carefully pending packag +18850|1129|F|182945.90|1993-05-28|4-NOT SPECIFIED|Clerk#000000912|0|ing to the carefully ironic pinto beans. blithely regular +18851|1223|F|177122.50|1992-12-17|1-URGENT|Clerk#000000515|0|he special, final ideas. slyly ironic foxes wake blithely above the fluf +18852|1024|O|110322.38|1995-09-20|2-HIGH|Clerk#000000569|0|, silent platelets. express, silent f +18853|946|F|187270.44|1993-01-18|1-URGENT|Clerk#000000046|0|sts. courts haggle furiously. even, enticing depo +18854|520|O|96911.02|1997-03-22|4-NOT SPECIFIED|Clerk#000000577|0|even pinto beans. blithely even excuses cajole carefully carefully pendin +18855|287|F|215764.36|1994-09-16|2-HIGH|Clerk#000000430|0|s. final packages are en +18880|1300|F|172408.37|1994-10-25|4-NOT SPECIFIED|Clerk#000000470|0|ts cajole blithely slyly final deposits. blithely bold ideas grow along t +18881|1286|O|150716.15|1998-03-25|1-URGENT|Clerk#000000620|0|refully special instructions are bold, final deposits. dolphins +18882|307|O|221263.83|1998-01-17|2-HIGH|Clerk#000000145|0|dolites sleep slyly about the special, final theodolites. pending deposits +18883|1148|O|95902.50|1996-07-06|5-LOW|Clerk#000000889|0|ular requests affix carefully regular, ironic deposits. final +18884|719|O|199773.68|1995-06-25|4-NOT SPECIFIED|Clerk#000000509|0|eas. carefully pending accounts are after the packages. silent, bold req +18885|1237|O|290930.91|1998-05-24|5-LOW|Clerk#000000792|0|tions try to haggle quietly slyly ir +18886|184|F|222195.84|1992-01-28|3-MEDIUM|Clerk#000000672|0|inal requests haggle slyly brave pla +18887|211|F|126391.97|1993-12-06|4-NOT SPECIFIED|Clerk#000000155|0|equests nag. blithely quiet packages doubt slyly. slowly final depo +18912|1156|O|175035.14|1997-05-21|1-URGENT|Clerk#000000513|0|ial foxes. furiously express instruction +18913|1028|O|157183.44|1998-06-12|3-MEDIUM|Clerk#000000467|0|lly among the fluffily even de +18914|155|F|23360.96|1993-09-26|3-MEDIUM|Clerk#000000464|0| regular Tiresias nag a +18915|250|F|1068.25|1994-02-18|1-URGENT|Clerk#000000107|0|odolites are. regular, +18916|1366|O|96118.49|1996-01-13|2-HIGH|Clerk#000000267|0|ld accounts eat furiously furiously express packages. bold, regular deposits +18917|892|F|34232.10|1992-05-04|1-URGENT|Clerk#000000427|0|regular accounts. pending, ironic pinto beans wake slyly furi +18918|439|F|48426.44|1992-10-28|4-NOT SPECIFIED|Clerk#000000766|0|ag carefully accounts. instr +18919|361|F|41666.42|1994-06-29|5-LOW|Clerk#000000746|0|round the carefully regular deposits hag +18944|523|O|175577.85|1996-10-28|2-HIGH|Clerk#000000237|0|ys. blithely ironic accounts nag above the theodolites. slyly ironic braids wa +18945|577|F|212917.58|1994-01-18|3-MEDIUM|Clerk#000000835|0|ly according to the f +18946|748|F|51006.08|1993-05-05|1-URGENT|Clerk#000000480|0|re carefully. asymptotes wake. furiously pending i +18947|1252|O|149287.22|1997-07-13|2-HIGH|Clerk#000000113|0|le fluffily slyly special forges. regular deposits about the fu +18948|1348|O|140034.89|1996-09-02|4-NOT SPECIFIED|Clerk#000000729|0|sly regular dependencies according to the blit +18949|892|O|244212.94|1998-03-05|4-NOT SPECIFIED|Clerk#000000341|0|thin, final instructions! ironic packages wake quickly +18950|1190|F|35602.60|1992-02-28|5-LOW|Clerk#000000847|0|nstructions. fluffily regular instructions about the fluffily bold accounts n +18951|1201|O|156690.18|1995-06-30|1-URGENT|Clerk#000000117|0|ounts are furiously slyly ir +18976|1415|O|126476.16|1996-07-09|4-NOT SPECIFIED|Clerk#000000593|0|e. carefully sly dolphins wake quickly. even pinto beans wake carefully p +18977|661|O|151224.89|1997-11-29|2-HIGH|Clerk#000000288|0|al foxes haggle never carefully special requests. +18978|1478|F|126832.22|1992-08-23|5-LOW|Clerk#000000320|0|. furiously express +18979|412|O|258527.26|1998-05-16|1-URGENT|Clerk#000000530|0|instructions about the ironic, express re +18980|622|F|222618.51|1993-04-16|5-LOW|Clerk#000000008|0|deposits boost. final deposits cajole ironic, daring theodolites. final pa +18981|766|O|133086.44|1996-01-25|4-NOT SPECIFIED|Clerk#000000097|0|ly across the express packa +18982|961|O|88538.07|1998-03-16|3-MEDIUM|Clerk#000000734|0|n theodolites boost finally reg +18983|742|F|11195.00|1992-08-01|1-URGENT|Clerk#000000946|0|encies. pending, final packages lose s +19008|1456|O|26079.38|1996-12-01|3-MEDIUM|Clerk#000000835|0|al theodolites. furiously ironic a +19009|991|F|2164.57|1992-03-28|1-URGENT|Clerk#000000892|0|s use quickly. sheav +19010|1115|F|261464.24|1994-06-08|5-LOW|Clerk#000000872|0| deposits above the unu +19011|1204|O|71875.00|1997-01-27|3-MEDIUM|Clerk#000000711|0|s. excuses according to the ironic p +19012|1261|F|60470.79|1993-02-25|5-LOW|Clerk#000000691|0|. quickly dogged deposits run ironic instruc +19013|1216|O|19954.18|1997-10-11|2-HIGH|Clerk#000000302|0|ges may use carefully regular, close courts. carefully ironic +19014|1046|O|227351.00|1997-09-23|5-LOW|Clerk#000000340|0|r dependencies haggle quickly bold accounts; pending dependencies +19015|751|O|116378.46|1998-01-21|2-HIGH|Clerk#000000346|0|regular requests sleep slyly blith +19040|298|O|222139.06|1995-12-20|2-HIGH|Clerk#000000249|0|l requests poach slyly across the pend +19041|994|O|232083.55|1995-07-27|5-LOW|Clerk#000000289|0| across the busy de +19042|520|F|277272.83|1994-03-02|1-URGENT|Clerk#000000014|0| bold accounts believe furiously regular dependencies. carefu +19043|622|O|40149.03|1995-12-22|3-MEDIUM|Clerk#000000119|0|ly silent instruction +19044|29|F|180042.57|1992-04-12|5-LOW|Clerk#000000134|0|inal courts. blithely bold pinto beans alon +19045|1006|P|149646.83|1995-05-22|2-HIGH|Clerk#000000793|0|efully regular instructions sleep across the regular request +19046|298|F|75609.39|1993-04-05|2-HIGH|Clerk#000000401|0|nding requests. excuses +19047|574|F|225487.69|1994-01-29|2-HIGH|Clerk#000000036|0|ake. instructions integrate along the furiously unus +19072|1018|O|148650.74|1997-11-07|1-URGENT|Clerk#000000680|0|lly final foxes affix furiously at the quickly silent requests. +19073|256|F|215415.88|1994-06-25|4-NOT SPECIFIED|Clerk#000000868|0| accounts detect fu +19074|1462|F|121851.72|1992-06-26|1-URGENT|Clerk#000000245|0|ing requests doze blithely furiously ironic pinto beans: carefully ironic +19075|1282|F|186963.74|1994-09-27|1-URGENT|Clerk#000000905|0|jole across the regular foxes? fluffily ironic excu +19076|1318|O|81101.27|1997-01-02|5-LOW|Clerk#000000885|0|quests use along the quickly ironic accoun +19077|1162|O|139571.09|1996-01-08|4-NOT SPECIFIED|Clerk#000000654|0|boost ruthlessly. excuses haggle slyly +19078|1231|F|116129.80|1994-07-28|1-URGENT|Clerk#000000357|0|to beans wake. special asymptotes print furious +19079|1033|O|123386.05|1998-03-19|5-LOW|Clerk#000000395|0|gle furiously. regular, regular accounts about the ruthlessly final pa +19104|1148|F|134634.08|1993-08-11|2-HIGH|Clerk#000000703|0|unts sleep. final deposits can sleep quickly against the +19105|841|F|130263.74|1994-10-29|2-HIGH|Clerk#000000727|0|ons are slyly quickly special notornis. regular p +19106|1375|P|40929.29|1995-04-04|4-NOT SPECIFIED|Clerk#000001000|0|accounts. slyly furious acc +19107|55|O|113059.91|1997-07-06|4-NOT SPECIFIED|Clerk#000000252|0|ully pending excuses affix carefully. regular pinto beans after t +19108|728|O|136321.74|1995-10-25|1-URGENT|Clerk#000000360|0|ithely final requests boost after the unusu +19109|200|F|18434.34|1992-09-01|1-URGENT|Clerk#000000798|0|es. regular deposits boost quickly across the fur +19110|1225|O|78323.05|1996-06-13|1-URGENT|Clerk#000000368|0| are carefully according to the ruthless exc +19111|664|F|281086.55|1994-10-05|5-LOW|Clerk#000000410|0|e fluffily final sheaves. carefully ironic theodolites detect quickly +19136|691|F|24810.87|1993-08-05|4-NOT SPECIFIED|Clerk#000000151|0|en theodolites cajole quickly above the blithe deposits. slyly regular id +19137|646|O|91374.21|1995-08-31|1-URGENT|Clerk#000000569|0|ic dependencies are pending, sly pinto beans. final, pen +19138|1231|O|173183.28|1995-09-06|5-LOW|Clerk#000000992|0|hely ironic realms sleep. carefully regular excus +19139|1066|F|190191.87|1993-12-04|4-NOT SPECIFIED|Clerk#000000748|0|unts. quickly final packages sleep. furiou +19140|1052|F|287689.60|1994-10-01|3-MEDIUM|Clerk#000000120|0|arefully slyly furious dependencies. blithely special theodolites a +19141|1084|F|17459.14|1992-10-28|4-NOT SPECIFIED|Clerk#000000310|0|refully regular deposits haggle according to the f +19142|178|O|311129.11|1996-09-19|5-LOW|Clerk#000000821|0|sual packages sleep slyly eve +19143|370|F|112529.56|1992-11-05|2-HIGH|Clerk#000000075|0|ly ironic deposits haggle qui +19168|544|O|119263.00|1997-02-23|5-LOW|Clerk#000000573|0|ding to the quickly pending foxes. final, regular packa +19169|583|O|262053.29|1997-05-09|4-NOT SPECIFIED|Clerk#000000193|0|the special asymptotes. blithely even packages believe furi +19170|1120|O|44222.02|1997-05-04|4-NOT SPECIFIED|Clerk#000000113|0|wake according to the slyly silent ideas. furiously final depos +19171|985|O|160644.33|1996-08-25|1-URGENT|Clerk#000000900|0|even ideas. quickly bold packages nag. +19172|542|O|310108.25|1996-02-23|4-NOT SPECIFIED|Clerk#000000878|0|e special foxes. carefully final hockey players throughou +19173|355|O|25848.69|1995-10-20|4-NOT SPECIFIED|Clerk#000000835|0|pending packages nag alongside of the quickly even r +19174|908|F|319481.04|1993-07-17|3-MEDIUM|Clerk#000000140|0|he slyly even packages. packages engage furiously final +19175|1447|F|153203.19|1994-08-20|5-LOW|Clerk#000000097|0|lithe accounts integrate furiously regular requests. requests unwind. pack +19200|43|O|212688.35|1997-07-27|4-NOT SPECIFIED|Clerk#000000951|0| blithely final realms engage. carefully unusual +19201|325|O|261234.97|1996-06-05|3-MEDIUM|Clerk#000000208|0|sts solve theodolites. slyly pending warthogs doubt: reque +19202|139|O|6545.69|1998-07-16|1-URGENT|Clerk#000000402|0|cross the furiously +19203|1019|O|91639.66|1996-08-05|4-NOT SPECIFIED|Clerk#000000829|0|s. blithely unusual foxes integrat +19204|493|F|175634.94|1994-09-19|3-MEDIUM|Clerk#000000896|0|into beans sleep. sil +19205|584|F|240152.61|1993-07-27|3-MEDIUM|Clerk#000000951|0| slyly silent packages against the slyly +19206|217|F|191557.53|1993-03-31|5-LOW|Clerk#000000641|0|ions. patterns are slyly above the +19207|97|F|185300.10|1992-03-16|4-NOT SPECIFIED|Clerk#000000003|0|lly between the quickly pending ideas. +19232|535|F|167422.98|1994-07-13|5-LOW|Clerk#000000454|0|es lose slyly alongside of the pen +19233|1408|F|7626.44|1994-12-07|4-NOT SPECIFIED|Clerk#000000079|0|cies nag carefully. ideas haggle along the b +19234|460|F|140531.53|1994-01-25|2-HIGH|Clerk#000000917|0|sits are slyly along the slyly silent multipliers. caref +19235|1465|O|118603.64|1996-03-23|2-HIGH|Clerk#000000571|0|ies boost slyly blithely final theodolites. carefully regular packages w +19236|991|O|214774.42|1998-02-04|3-MEDIUM|Clerk#000000493|0|ully regular requests could thrash quickly besi +19237|70|P|218171.20|1995-04-08|4-NOT SPECIFIED|Clerk#000000800|0|r excuses. regular deposits are final deposits. fluffily +19238|1396|O|227149.69|1997-03-15|4-NOT SPECIFIED|Clerk#000000612|0|ses. slyly ruthless asymptotes after the blithely ironic pac +19239|770|O|53691.25|1996-05-05|1-URGENT|Clerk#000000661|0|rets. boldly ironic foxes serve blithely +19264|226|O|217968.20|1995-09-30|2-HIGH|Clerk#000000508|0|l foxes. regular deposits after the express, final pa +19265|1135|O|257497.98|1996-12-18|4-NOT SPECIFIED|Clerk#000000436|0|into beans cajole against the quickly unusual packages. slowly express +19266|1334|O|196522.70|1997-08-17|1-URGENT|Clerk#000000561|0|ding deposits. packages cajole +19267|40|O|18912.43|1998-02-26|2-HIGH|Clerk#000000111|0|refully careful depo +19268|415|O|222259.40|1998-03-27|2-HIGH|Clerk#000000836|0|telets. slyly bold pa +19269|256|O|94400.63|1998-07-28|1-URGENT|Clerk#000000105|0|dependencies. fluffily express foxes +19270|400|O|219005.49|1997-11-19|2-HIGH|Clerk#000000524|0|ts are fluffily quickly final pearls. final, final dugouts beyond th +19271|742|O|126901.19|1996-11-21|5-LOW|Clerk#000000488|0|ing deposits haggle above the carefully close grouches. +19296|794|F|228462.46|1993-04-11|2-HIGH|Clerk#000000182|0|equests. ruthlessly bold requests against the ironically express instructions +19297|310|O|110531.61|1996-04-18|4-NOT SPECIFIED|Clerk#000000278|0|hely pending platelets. unusual deposits wake furiously across +19298|1129|O|205257.80|1997-08-22|4-NOT SPECIFIED|Clerk#000000698|0|o the carefully regular packages. flu +19299|49|F|270796.42|1994-03-19|4-NOT SPECIFIED|Clerk#000000014|0|ntegrate final, even pinto beans. bold packages haggle slyly. a +19300|1015|F|171965.23|1994-12-17|1-URGENT|Clerk#000000755|0|oxes cajole. slyly silent instructions c +19301|94|F|151222.05|1992-04-03|4-NOT SPECIFIED|Clerk#000000853|0|ost instead of the ironic accounts. fluffily even deposits above the entici +19302|214|O|132490.88|1998-06-26|3-MEDIUM|Clerk#000000333|0|gular accounts. pending deposits haggle? slyl +19303|1310|F|163909.27|1993-02-03|1-URGENT|Clerk#000000820|0|y ironic packages breach blithely. ironic dolphins believe silently. blithely +19328|1321|O|205733.74|1997-09-30|2-HIGH|Clerk#000000657|0|arefully about the instructions-- regul +19329|581|F|68368.03|1993-03-08|4-NOT SPECIFIED|Clerk#000000887|0|lly regular theodolites. slyly even hockey pl +19330|223|O|202472.16|1997-04-30|4-NOT SPECIFIED|Clerk#000000341|0|cial deposits nag fluff +19331|1457|O|61911.43|1997-04-18|1-URGENT|Clerk#000000521|0|haggle fluffily requests. q +19332|1273|F|259613.14|1992-02-29|2-HIGH|Clerk#000000678|0|instructions nag beyond the furiously regular pin +19333|403|F|183007.16|1993-04-20|3-MEDIUM|Clerk#000000582|0| the unusual, special somas. blithely regu +19334|1154|O|134521.05|1997-08-11|3-MEDIUM|Clerk#000000563|0|iresias impress furiously unusual accounts! slyly pending acc +19335|730|O|162845.86|1997-09-11|2-HIGH|Clerk#000000353|0|thrash blithely across the fluffily ironic deposits. regular accounts un +19360|778|O|82917.05|1996-10-17|3-MEDIUM|Clerk#000000422|0|the ironic multipliers haggle quickly blithely express ideas. slyly even in +19361|1358|F|268055.12|1992-09-24|5-LOW|Clerk#000000989|0|sly quickly ironic accounts. carefully ironic packages en +19362|712|O|110525.18|1997-08-07|2-HIGH|Clerk#000000852|0|cajole furiously busy reques +19363|341|O|276702.99|1995-07-06|2-HIGH|Clerk#000000467|0|ges are slyly. slyly regular instructions nag above the platelets. flu +19364|1186|O|72528.39|1997-10-17|4-NOT SPECIFIED|Clerk#000000387|0|tructions are furiously along th +19365|439|F|165632.83|1995-01-17|3-MEDIUM|Clerk#000000390|0| thrash. enticing instructions n +19366|1156|F|155100.99|1992-05-02|4-NOT SPECIFIED|Clerk#000000297|0|g the regular deposits are carefully about the iron +19367|1237|F|83308.06|1994-04-21|2-HIGH|Clerk#000000731|0|lyly unusual excuses sleep according to the blithely express deposits. c +19392|700|O|27210.83|1997-01-14|1-URGENT|Clerk#000000394|0|eposits wake quietly. fluffily final dolphins boost en +19393|553|F|40867.36|1995-01-15|2-HIGH|Clerk#000000775|0|even dependencies boost carefully about the furiously regular packages. final +19394|1150|F|140980.84|1992-12-26|3-MEDIUM|Clerk#000000379|0|ending packages. even ideas boost furiously blithely pending p +19395|565|O|50881.66|1995-09-15|5-LOW|Clerk#000000195|0|s. carefully dogged instructions sleep carefully regular, thin requests. +19396|542|O|44539.47|1998-07-12|3-MEDIUM|Clerk#000000962|0| quickly final instructions. ironic +19397|232|O|144870.11|1997-07-17|2-HIGH|Clerk#000000412|0|y. special pinto beans play fluffily blith +19398|592|F|225100.47|1994-08-03|2-HIGH|Clerk#000000759|0|. blithely special foxe +19399|715|F|68973.06|1994-01-27|5-LOW|Clerk#000000809|0|uickly final packages. regular, bold dependencies al +19424|652|P|173774.28|1995-04-10|4-NOT SPECIFIED|Clerk#000000732|0|arhorses. furiously even warthogs +19425|1235|F|133350.02|1992-09-25|4-NOT SPECIFIED|Clerk#000000537|0| deposits against the slyly regular packages cajole quickly furiously final d +19426|878|O|158688.09|1997-11-09|1-URGENT|Clerk#000000930|0| pending, special excuses. stealthy inst +19427|853|O|108979.72|1998-05-19|2-HIGH|Clerk#000000626|0|ultipliers sleep blithely across the instructions. slyly pending theod +19428|1237|F|52093.63|1993-05-05|3-MEDIUM|Clerk#000000813|0|ns cajole sometimes even, ironic theodolites. furiously even reque +19429|1318|F|213337.82|1994-08-25|4-NOT SPECIFIED|Clerk#000000329|0|ts boost except the furiously express ideas. fluffily express acc +19430|583|F|130429.17|1993-11-14|1-URGENT|Clerk#000000060|0| blithely carefully pending packages. slyly pending accounts detect furious +19431|415|F|164591.97|1994-05-24|4-NOT SPECIFIED|Clerk#000000104|0|uriously ironic foxes. slyly special i +19456|1202|O|233433.07|1996-07-06|5-LOW|Clerk#000000600|0| dinos haggle quickly. silent, final requests wake blithely. sl +19457|250|F|117171.06|1994-07-13|2-HIGH|Clerk#000000810|0|nic dependencies wake alongside of the deposit +19458|178|O|165911.36|1996-05-25|2-HIGH|Clerk#000000410|0|nto beans haggle abou +19459|1073|O|48324.32|1996-08-26|2-HIGH|Clerk#000000470|0|fully regular instructions; carefully special theodolites believe agai +19460|196|O|304523.22|1997-12-17|2-HIGH|Clerk#000000846|0| slyly regular requests. +19461|1495|O|244996.73|1998-07-31|3-MEDIUM|Clerk#000000756|0| permanently among the permanently ironic foxes. even courts +19462|346|O|123266.58|1995-09-21|3-MEDIUM|Clerk#000000605|0|. carefully bold requests wake quickly. quick accounts +19463|1144|O|11098.04|1996-04-19|5-LOW|Clerk#000000605|0|even deposits haggle fluffily regular deposits. blithel +19488|511|O|263629.02|1998-07-10|1-URGENT|Clerk#000000627|0|its. blithely final requests are ironic instructions. unusual, even deposits +19489|646|O|183934.54|1998-04-02|4-NOT SPECIFIED|Clerk#000000532|0|inder fluffily past the evenly ironic foxes. furiously even instructions along +19490|89|O|75242.90|1996-08-18|1-URGENT|Clerk#000000639|0|ongside of the blit +19491|367|F|26220.00|1993-10-19|3-MEDIUM|Clerk#000000988|0|arefully according to +19492|1165|F|276768.18|1993-12-13|2-HIGH|Clerk#000000901|0|uests are. packages wake carefully: quickly special packages slee +19493|1087|F|118711.44|1994-02-03|1-URGENT|Clerk#000000525|0|eposits haggle always furiously final packages. +19494|262|F|46942.87|1993-01-13|2-HIGH|Clerk#000000470|0|even deposits boost. unusual, bold packa +19495|1321|O|90336.49|1998-01-18|3-MEDIUM|Clerk#000000394|0| run carefully around the slyly i +19520|245|F|52452.86|1992-05-02|5-LOW|Clerk#000000257|0| of the slyly close foxes. fluffily final acco +19521|509|F|122359.18|1994-11-24|4-NOT SPECIFIED|Clerk#000000634|0|ect furiously. enticing +19522|1309|F|78824.19|1994-10-21|3-MEDIUM|Clerk#000000556|0|ts about the quickly ironic requests wake carefully along t +19523|725|O|102950.58|1995-12-01|2-HIGH|Clerk#000000725|0|sleep slyly above the furiously ironic theodolites. final pint +19524|1267|F|179255.39|1993-01-15|1-URGENT|Clerk#000000772|0|lithely beneath the fu +19525|1237|O|198700.63|1997-12-03|3-MEDIUM|Clerk#000000949|0|ully. ruthlessly regular instructions cajole sl +19526|1003|F|18785.97|1994-09-23|5-LOW|Clerk#000000847|0|are blithely. ideas sleep slyly express requests. re +19527|158|O|144871.02|1996-06-09|3-MEDIUM|Clerk#000000506|0|ng the carefully regular ideas cajole blithely across the furiously un +19552|1018|O|46933.60|1996-09-17|5-LOW|Clerk#000000089|0|posits boost finally: accounts nag doggedly across +19553|1000|O|74331.45|1997-02-10|2-HIGH|Clerk#000000283|0|ts wake fluffily against the ironic, unusual instructions. bold, +19554|857|F|260997.79|1995-04-15|1-URGENT|Clerk#000000492|0|pendencies? ironic, pending requests across the bravely ironic foxes wake furi +19555|943|F|169943.03|1993-02-12|5-LOW|Clerk#000000012|0|integrate fluffily evenly +19556|260|F|224577.89|1993-12-31|4-NOT SPECIFIED|Clerk#000000743|0|. ironic foxes sleep +19557|622|O|336227.33|1995-10-31|5-LOW|Clerk#000000331|0|capades sleep slyly regular deposits. blithely bold foxes cajole among the spe +19558|1225|F|106377.86|1995-02-26|5-LOW|Clerk#000000769|0|nic accounts cajole slyly. furiously even accounts boost b +19559|551|F|298933.06|1993-04-16|2-HIGH|Clerk#000000945|0|warthogs. daring instr +19584|1387|F|156672.62|1994-04-17|1-URGENT|Clerk#000000008|0|the carefully regular excuses sleep fluffily final sheav +19585|1291|O|120634.37|1997-08-19|4-NOT SPECIFIED|Clerk#000000739|0|furiously unusual asymptotes. +19586|481|F|5313.08|1992-11-02|4-NOT SPECIFIED|Clerk#000000964|0|ructions eat never. furi +19587|1264|F|236845.58|1994-08-25|5-LOW|Clerk#000000306|0|sts against the courts cajo +19588|643|O|154113.40|1995-06-20|2-HIGH|Clerk#000000464|0|ding requests use furiously fluffi +19589|980|F|68978.42|1992-08-16|3-MEDIUM|Clerk#000000454|0|n packages affix ac +19590|346|O|21705.81|1997-12-01|4-NOT SPECIFIED|Clerk#000000162|0|y regular packages. unusual, bold accounts b +19591|1276|O|72029.00|1998-01-31|1-URGENT|Clerk#000000656|0| regular ideas. carefull +19616|214|O|365518.53|1995-12-23|2-HIGH|Clerk#000000695|0|fter the requests. quiet asymptotes about the +19617|62|F|79304.78|1992-01-21|5-LOW|Clerk#000000973|0|g the furiously ironic escapades. quickly quiet fo +19618|1432|O|172568.50|1998-05-11|1-URGENT|Clerk#000000633|0|le furiously above the theodolites. +19619|964|O|85385.57|1996-05-30|1-URGENT|Clerk#000000001|0|ments impress. carefully final foxes doubt fluff +19620|743|O|134498.06|1997-04-27|3-MEDIUM|Clerk#000000611|0|al accounts mold slyly. regular, fi +19621|1318|O|242366.68|1995-09-08|1-URGENT|Clerk#000000614|0|ag blithely. fluffily special deposits against the eve +19622|593|O|57257.18|1997-08-28|4-NOT SPECIFIED|Clerk#000000752|0|yly furiously ironic packages. regular requests use final sheaves +19623|214|F|260142.06|1992-02-24|1-URGENT|Clerk#000000530|0|ending notornis nag blithely. ironic, even ideas haggle fluf +19648|1486|O|292702.60|1996-10-18|1-URGENT|Clerk#000000204|0|structions. final, bold pinto beans nag final accounts. fluffy, eve +19649|514|P|157757.77|1995-05-05|2-HIGH|Clerk#000000139|0|efully regular requ +19650|569|F|89519.98|1994-07-03|2-HIGH|Clerk#000000605|0|about the slyly regular platelets hag +19651|701|O|317248.47|1996-11-23|5-LOW|Clerk#000000807|0|lyly ironic packages haggle slyly at the ironic theodolites. slyly ironic fr +19652|409|F|243401.35|1992-06-03|1-URGENT|Clerk#000000734|0|slyly regular courts. silent multi +19653|724|F|233571.84|1992-09-12|4-NOT SPECIFIED|Clerk#000000737|0|c theodolites cajole about the bold accounts. carefully bold sentiments caj +19654|734|F|125460.42|1995-01-10|2-HIGH|Clerk#000000646|0|nts. tithes sleep accordin +19655|370|F|54725.32|1994-01-12|2-HIGH|Clerk#000000116|0|hely regular deposits. blithely ironic de +19680|559|F|168674.96|1992-09-20|4-NOT SPECIFIED|Clerk#000000836|0|se furiously ironic accounts. +19681|973|O|166361.38|1997-12-25|4-NOT SPECIFIED|Clerk#000000854|0|r excuses. regular requests boost ironically. quickly +19682|386|O|224993.31|1997-02-15|1-URGENT|Clerk#000000353|0|ts. pinto beans around the carefully r +19683|371|F|29137.19|1994-02-07|3-MEDIUM|Clerk#000000965|0|bt furiously special deposits. bold, regular asymptot +19684|404|F|150614.39|1993-09-02|4-NOT SPECIFIED|Clerk#000000707|0|final deposits haggle furiously slyly silent dependencies. frets a +19685|962|O|57288.24|1997-10-03|2-HIGH|Clerk#000000237|0|gular accounts cajole regularly among the express, +19686|968|F|117040.13|1993-08-16|3-MEDIUM|Clerk#000000563|0|cial instructions sleep quickly blithely silent sheaves. slyly unusual re +19687|965|F|243567.90|1993-08-14|3-MEDIUM|Clerk#000000157|0|ackages affix across +19712|430|O|137640.78|1998-01-07|4-NOT SPECIFIED|Clerk#000000370|0|nooze quickly slyly +19713|1058|O|42571.72|1996-07-28|3-MEDIUM|Clerk#000000868|0|rts; fluffily special pint +19714|1477|F|261040.64|1993-09-10|1-URGENT|Clerk#000000544|0|de of the deposits breach carefully final epitaphs. quickl +19715|1046|F|17551.66|1992-01-23|1-URGENT|Clerk#000000015|0|-ray among the accounts. blithely even gifts thrash against the carefu +19716|1232|F|82143.55|1994-09-30|5-LOW|Clerk#000000967|0|ress dolphins use after the ironic pl +19717|1075|O|110574.29|1998-07-24|5-LOW|Clerk#000000964|0|carefully special platelets. carefully ironic depths +19718|1174|F|97096.04|1992-06-25|5-LOW|Clerk#000000095|0|tainments according to t +19719|1294|O|123562.95|1996-05-03|5-LOW|Clerk#000000486|0|bove the quickly fin +19744|1045|F|193448.51|1993-03-15|3-MEDIUM|Clerk#000000853|0|cajole after the slyly final dino +19745|382|F|253720.42|1992-12-19|2-HIGH|Clerk#000000845|0| careful, bold excuses among the blith +19746|125|O|58368.50|1998-07-30|3-MEDIUM|Clerk#000000565|0|ole furiously according to the slyly pending theodolites. carefully ironic +19747|818|O|248014.52|1996-08-07|3-MEDIUM|Clerk#000000796|0|ole quickly across the furiously ironic ideas +19748|137|F|96721.74|1993-08-05|4-NOT SPECIFIED|Clerk#000000286|0|bold, express ideas sleep b +19749|484|O|148061.58|1997-04-01|2-HIGH|Clerk#000000560|0|s cajole slyly even escapades. furiously ironic packages haggle slyly. bli +19750|238|F|114288.34|1994-08-12|3-MEDIUM|Clerk#000000847|0| wake ironic packages. blithely unusual instruction +19751|448|O|232232.98|1996-09-03|5-LOW|Clerk#000000167|0|nag. idle, regular packages about the deposits +19776|22|O|139135.96|1996-04-29|1-URGENT|Clerk#000000647|0|dolites. blithely unusual epitaphs hang. unusual, silent foxes are slyly acr +19777|1262|F|126454.46|1992-10-20|4-NOT SPECIFIED|Clerk#000000561|0|lar instructions. quickly ironic packages cajole carefully among +19778|184|F|213954.98|1992-10-02|1-URGENT|Clerk#000000691|0| beans. carefully pendin +19779|416|F|125569.18|1994-05-27|2-HIGH|Clerk#000000992|0|ding ideas. ironic deposits sl +19780|1073|F|174041.67|1995-02-05|2-HIGH|Clerk#000000301|0|e the slyly regular requests. slyly +19781|1148|O|91283.77|1996-10-19|1-URGENT|Clerk#000000523|0|e of the fluffily fluffy accounts. quickly +19782|145|F|149865.48|1992-10-19|5-LOW|Clerk#000000067|0|s print blithely against t +19783|1259|F|202339.87|1992-09-26|4-NOT SPECIFIED|Clerk#000000956|0|tes cajole blithely requests. blithely unusual dependencies sleep +19808|325|O|219570.78|1996-07-08|1-URGENT|Clerk#000000676|0|ording to the final packa +19809|1213|O|195645.19|1997-08-09|2-HIGH|Clerk#000000101|0|ly final requests. d +19810|154|O|4786.25|1998-02-18|5-LOW|Clerk#000000252|0|ing to the fluffily regular packages nag furiou +19811|1300|O|335769.55|1995-08-09|5-LOW|Clerk#000000395|0| regular instructions cajole sly +19812|619|F|223484.68|1993-04-03|5-LOW|Clerk#000000598|0|cies thrash slyly toward the slyly pending +19813|979|F|189157.63|1993-03-03|1-URGENT|Clerk#000000373|0| special pinto beans use. quickly express reque +19814|199|F|7078.73|1995-04-26|3-MEDIUM|Clerk#000000895|0| theodolites about the slyly final requests are blithely unusual pl +19815|640|F|224555.42|1993-03-26|4-NOT SPECIFIED|Clerk#000000379|0|nts nag blithely even ideas. fluffily regular theodolites +19840|1369|F|109981.13|1993-05-25|1-URGENT|Clerk#000000921|0| haggle quickly furiously regular accounts. express theodolites around the sl +19841|7|F|250754.50|1993-12-27|5-LOW|Clerk#000000510|0| packages haggle busily even pinto beans! braids haggle busily +19842|772|O|290908.03|1996-07-17|4-NOT SPECIFIED|Clerk#000000960|0|s. slyly regular accounts are quickly furiously final instructions? +19843|703|F|207746.39|1993-07-30|3-MEDIUM|Clerk#000000562|0|ges kindle carefully. unusual accoun +19844|1325|O|254697.02|1996-04-21|5-LOW|Clerk#000000965|0|osits engage quickly. +19845|1001|F|147600.90|1994-07-16|3-MEDIUM|Clerk#000000541|0|final ideas wake between the pending, regular accounts. bold deposits nag bli +19846|241|O|309343.14|1996-11-16|5-LOW|Clerk#000000386|0|e quickly thin forges can a +19847|1492|F|132930.29|1993-02-11|2-HIGH|Clerk#000000451|0|ns about the final, final instructions kindle +19872|1426|O|40711.18|1998-03-21|5-LOW|Clerk#000000147|0|mptotes. packages breach slyly across the pending foxes. instruc +19873|1045|F|80457.39|1992-11-21|4-NOT SPECIFIED|Clerk#000000908|0|heodolites haggle carefully against the slyly final ideas! blithe +19874|866|F|128244.80|1992-06-09|2-HIGH|Clerk#000000767|0|ly ironic instructions haggle slo +19875|583|O|331873.86|1996-12-30|2-HIGH|Clerk#000000281|0|uriously final accounts cajole slyly. fluffily even epitaphs cajole aga +19876|613|O|163397.63|1998-07-31|1-URGENT|Clerk#000000186|0|olites. silent, ironic theodolites detect some +19877|1001|O|262459.17|1998-06-24|5-LOW|Clerk#000000390|0|as haggle fluffily brav +19878|278|O|132345.24|1998-01-10|4-NOT SPECIFIED|Clerk#000000542|0|g dolphins. slyly special ideas cajole acc +19879|1415|F|134662.47|1994-10-10|1-URGENT|Clerk#000000702|0| ideas. carefully even somas +19904|599|O|268586.01|1998-02-24|3-MEDIUM|Clerk#000000318|0|riously special deposits use closely. bold instructi +19905|343|F|296909.07|1992-08-13|1-URGENT|Clerk#000000783|0|the final notornis. carefully final foxes sleep +19906|158|F|167060.80|1994-04-11|2-HIGH|Clerk#000000918|0|x slyly across the ironic, even +19907|800|O|214038.61|1998-06-17|3-MEDIUM|Clerk#000000826|0|bold instructions cajole slyly furiously ironic pa +19908|895|F|191021.40|1993-01-05|1-URGENT|Clerk#000000314|0|t forges are slyly about the regular packages. platele +19909|322|O|151242.75|1996-09-25|2-HIGH|Clerk#000000397|0| special pinto beans. slyly i +19910|338|P|176683.37|1995-05-04|1-URGENT|Clerk#000000893|0|ress theodolites thrash. f +19911|1471|O|234902.52|1995-10-07|2-HIGH|Clerk#000000719|0| furiously fluffy requests. ruthless pearls haggle bra +19936|802|F|206362.25|1992-11-14|1-URGENT|Clerk#000000507|0| asymptotes above the regularly +19937|1129|O|39227.80|1998-07-24|4-NOT SPECIFIED|Clerk#000000396|0|ix! blithely unusual packages nag carefully. slyly ev +19938|329|P|302503.02|1995-03-23|2-HIGH|Clerk#000000531|0|luffily. even packages try to snooze quickly against the slyly +19939|226|O|163513.03|1997-03-28|3-MEDIUM|Clerk#000000235|0|hould cajole slyly dependencies. boldly +19940|1244|O|148553.55|1996-07-01|5-LOW|Clerk#000000482|0|ecial attainments affix along the quickly even requests. dep +19941|1054|F|190942.54|1993-11-26|4-NOT SPECIFIED|Clerk#000000972|0|le across the carefully pending deposits. silent packages are. dogged de +19942|503|O|70875.20|1998-04-15|2-HIGH|Clerk#000000011|0|ly. regular deposits are quickly furiously special platelets. furiously +19943|40|F|42347.52|1994-11-25|1-URGENT|Clerk#000000985|0|nusual requests nag hockey players. deposits boost doggedly i +19968|136|O|359373.75|1997-12-07|4-NOT SPECIFIED|Clerk#000000765|0|ideas cajole carefully. braids integrate carefully regular pl +19969|1022|O|97909.45|1997-05-21|3-MEDIUM|Clerk#000000487|0|even pinto beans integrate furiously ironically +19970|1469|O|229154.06|1996-11-19|2-HIGH|Clerk#000000762|0|o beans believe furiously. carefully even requests sleep furiously aft +19971|109|O|254519.96|1996-06-27|4-NOT SPECIFIED|Clerk#000000265|0|furiously unusual, final theodolites. final requ +19972|65|F|127283.09|1992-06-17|1-URGENT|Clerk#000000581|0|r epitaphs. pending instructions cajol +19973|163|O|58906.92|1996-01-14|5-LOW|Clerk#000000607|0|pecial pinto beans wake evenly since the carefully even pinto bean +19974|989|F|182874.04|1993-11-04|2-HIGH|Clerk#000000678|0|ies sleep regularly ideas. ideas sleep. furiously +19975|1255|F|163658.94|1994-04-11|4-NOT SPECIFIED|Clerk#000000026|0|e quickly according to +20000|925|O|68690.22|1996-07-24|2-HIGH|Clerk#000000936|0|gular dependencies after the +20001|631|F|71375.57|1992-10-25|3-MEDIUM|Clerk#000000197|0|eans haggle. fluffily final deposits above the special acco +20002|484|F|73361.40|1992-08-13|3-MEDIUM|Clerk#000000519|0|e accounts. daring, express foxes sleep furiously quiet +20003|1162|F|185964.10|1992-01-31|3-MEDIUM|Clerk#000000074|0|d packages doubt furiously. theodolites are slyly closely regular +20004|341|O|200100.17|1996-06-12|1-URGENT|Clerk#000000781|0|ix blithely along the slyly final excuses. fluffily bold dependencies c +20005|470|O|129540.39|1998-01-26|1-URGENT|Clerk#000000346|0|ep blithely along the re +20006|1073|O|289161.64|1996-06-15|4-NOT SPECIFIED|Clerk#000000091|0|kly final deposits! regular requests about the express, regular p +20007|1399|F|33811.91|1994-08-06|4-NOT SPECIFIED|Clerk#000000541|0|nto beans wake. carefully express packages according t +20032|656|F|150302.35|1992-11-06|3-MEDIUM|Clerk#000000342|0|kly above the enticing, ironic excuses: final w +20033|40|F|62499.54|1993-05-22|1-URGENT|Clerk#000000973|0|ial instructions boost fur +20034|530|O|67646.03|1996-07-03|1-URGENT|Clerk#000000563|0|tructions integrate alongsid +20035|1432|O|41557.21|1996-04-12|1-URGENT|Clerk#000000007|0|ve along the instructions! permanent, even accou +20036|308|F|209279.84|1993-12-06|4-NOT SPECIFIED|Clerk#000000570|0|cial packages. carefully iro +20037|916|F|239323.29|1994-01-11|5-LOW|Clerk#000000757|0|reach blithely carefully ironic deposits. dolphins thrash slyly ideas. blithe +20038|1141|F|153533.56|1993-02-27|5-LOW|Clerk#000000685|0|ously regular accou +20039|1081|O|83494.29|1998-04-06|2-HIGH|Clerk#000000419|0|ously express dolphins. carefully bold pinto beans are always. +20064|1300|O|18548.31|1998-01-01|5-LOW|Clerk#000000338|0|e unusual courts. careful +20065|436|O|130173.03|1998-07-20|2-HIGH|Clerk#000000888|0|ins. carefully express asymptotes believe among the quickly i +20066|685|F|236157.84|1992-09-03|1-URGENT|Clerk#000000694|0| sleep. always even theodolites cajole alon +20067|385|O|44618.12|1995-08-19|1-URGENT|Clerk#000000643|0| even pinto beans are furiously according to the carefully unu +20068|241|P|134754.79|1995-03-01|1-URGENT|Clerk#000000967|0|s. final platelets cajole according to the special packages. +20069|635|F|82249.71|1994-09-27|1-URGENT|Clerk#000000748|0|. slyly final packages detect furiously about the regular, express package +20070|1021|O|159637.65|1996-03-24|4-NOT SPECIFIED|Clerk#000000197|0|luffily unusual forges wake carefully fluffily even ideas. regular +20071|490|O|211900.52|1995-09-18|3-MEDIUM|Clerk#000000301|0|he final pinto bean +20096|1363|F|169055.89|1992-08-20|5-LOW|Clerk#000000838|0|the furiously ruthless d +20097|1318|O|129305.08|1996-04-29|1-URGENT|Clerk#000000707|0|rmanently regular pinto beans above the slyly enticing attainments breach furi +20098|817|O|173656.41|1995-12-09|3-MEDIUM|Clerk#000000319|0|press instructions. final deposits sleep according to the unusual +20099|202|O|231612.67|1997-09-28|2-HIGH|Clerk#000000857|0|xes. pinto beans eat against the slyly final instruc +20100|887|F|85033.59|1994-04-01|1-URGENT|Clerk#000000929|0|nal pinto beans hinder carefully regular reque +20101|925|O|68775.59|1996-05-14|5-LOW|Clerk#000000897|0|odolites affix slyly above the blithely blithe pac +20102|622|O|59354.01|1995-06-06|2-HIGH|Clerk#000000041|0|usly final instructions. slyly pending pinto beans should have to solve care +20103|844|F|334472.37|1993-02-12|3-MEDIUM|Clerk#000000877|0| slyly unusual foxes boost furiously about the final, ironi +20128|427|F|234779.54|1994-09-01|4-NOT SPECIFIED|Clerk#000000221|0|. bold accounts above the unusual requests nag ideas. slyly +20129|944|O|7319.98|1997-06-03|3-MEDIUM|Clerk#000000124|0|eep quickly. blithely express dinos nag blithely. fluf +20130|379|F|46767.94|1992-06-12|3-MEDIUM|Clerk#000000093|0|e escapades. ironic requests grow about the furiously even pinto beans. +20131|1465|F|67984.41|1992-10-04|1-URGENT|Clerk#000000271|0|g asymptotes thrash carefully fluffil +20132|877|F|36578.22|1993-05-18|5-LOW|Clerk#000000444|0|ial pinto beans. special, express pinto beans +20133|1448|F|122442.85|1994-09-13|5-LOW|Clerk#000000297|0|special accounts cajole furiously quick pinto beans. fl +20134|160|P|166051.12|1995-03-13|5-LOW|Clerk#000000647|0| according to the final asymptotes. carefully silent de +20135|1372|F|174682.05|1994-07-01|1-URGENT|Clerk#000000884|0|s. quickly unusual platelets cajole slyly according to t +20160|1376|O|187738.27|1995-10-23|5-LOW|Clerk#000000620|0|ing, final requests. deposits boost furiously. regular, special excuses +20161|436|F|59115.09|1995-02-22|4-NOT SPECIFIED|Clerk#000000851|0|n pinto beans. package +20162|598|F|141239.30|1994-02-09|3-MEDIUM|Clerk#000000905|0| final, final asymptotes integrate blithely. special, express platelets hagg +20163|931|O|51413.58|1998-04-22|5-LOW|Clerk#000000907|0| platelets along the slyly final hockey players boost furiously after the +20164|430|O|196778.65|1996-07-21|5-LOW|Clerk#000000095|0|e packages across the ideas nag carefully according +20165|961|O|68132.85|1996-02-12|4-NOT SPECIFIED|Clerk#000000909|0|structions! carefully bold pi +20166|409|F|146049.96|1994-03-05|5-LOW|Clerk#000000236|0|r packages along th +20167|1090|F|60274.25|1992-08-02|5-LOW|Clerk#000000518|0|equests cajole carefully along the f +20192|1159|F|141916.49|1993-10-07|5-LOW|Clerk#000000889|0|fully bold dependencies dazzle above the slyly unusual foxes: excuses detec +20193|229|F|242361.58|1993-11-08|3-MEDIUM|Clerk#000000575|0|olites. slyly unusual requests wak +20194|1237|F|150483.50|1992-03-14|2-HIGH|Clerk#000000736|0|ingly special accounts haggle slyly desp +20195|10|O|99067.93|1998-08-02|1-URGENT|Clerk#000000423|0|gular accounts. slyly bold +20196|1078|O|98153.34|1996-05-13|4-NOT SPECIFIED|Clerk#000000936|0|nic requests eat furiously across the blithely regular accounts. furiou +20197|968|F|192070.98|1994-04-27|4-NOT SPECIFIED|Clerk#000000766|0|final instructions. carefully final +20198|956|O|137968.41|1995-06-11|4-NOT SPECIFIED|Clerk#000000440|0|the express accounts engage quickly furiously special realm +20199|293|F|162983.54|1994-04-27|1-URGENT|Clerk#000000933|0|lar foxes alongside of the quickly even dolphi +20224|1408|F|56301.28|1994-07-21|3-MEDIUM|Clerk#000000388|0| courts. slyly pending pinto beans hinder fluffily. blithely +20225|599|F|187197.94|1993-07-27|5-LOW|Clerk#000000167|0|ckages lose quickly regular foxes. platelets use among the bold instructi +20226|1223|F|51280.98|1994-02-03|1-URGENT|Clerk#000000827|0|ven packages affix careful +20227|1153|P|89625.36|1995-05-07|3-MEDIUM|Clerk#000000431|0|hely ironic pearls. final, ev +20228|850|O|57285.40|1997-12-31|2-HIGH|Clerk#000000052|0|ar requests! blithely even foxes haggle carefully furiously sil +20229|1445|F|193971.95|1994-10-31|5-LOW|Clerk#000000881|0|iously silent accounts nag evenly s +20230|28|O|41990.79|1996-10-23|2-HIGH|Clerk#000000722|0| foxes: final requests above the pending f +20231|578|O|146118.83|1995-07-29|4-NOT SPECIFIED|Clerk#000000756|0|es against the slyly final deposits sleep carefully against t +20256|490|F|53981.75|1992-02-01|5-LOW|Clerk#000000649|0|e bold packages lose about the carefully pending theodolites. +20257|2|O|181875.60|1996-03-04|4-NOT SPECIFIED|Clerk#000000317|0|e quickly. foxes sleep fur +20258|184|O|31677.40|1997-09-30|3-MEDIUM|Clerk#000000890|0|s cajole blithely across the +20259|764|O|92607.44|1995-05-25|1-URGENT|Clerk#000000788|0| slyly special theodolites. carefully ex +20260|1411|O|3339.77|1997-10-29|2-HIGH|Clerk#000000589|0|ole special, final ex +20261|1397|F|94917.01|1994-05-21|3-MEDIUM|Clerk#000000213|0|sly. special ideas according to the platelets sleep furiously above +20262|1439|F|218023.84|1994-12-27|4-NOT SPECIFIED|Clerk#000000877|0|deas. requests engage quickly. final packages sleep along the quietl +20263|250|F|205435.87|1994-11-15|3-MEDIUM|Clerk#000000889|0|ions. blithely regular excuses sleep quickly. enticingly special instructions +20288|1343|O|27128.45|1996-08-21|2-HIGH|Clerk#000000240|0|c packages use alongs +20289|775|O|178637.14|1997-06-23|1-URGENT|Clerk#000000117|0|pending dependencies. fina +20290|1375|O|260492.30|1997-11-02|2-HIGH|Clerk#000000394|0|y final deposits breach enticingly bold dolphins. unusual ideas cajol +20291|748|O|58497.64|1997-03-29|2-HIGH|Clerk#000000859|0|ickly according to the packages. bold requests lose furiously along +20292|766|F|346261.93|1992-11-09|3-MEDIUM|Clerk#000000056|0|the bold, final accounts inte +20293|668|O|180794.72|1997-12-25|2-HIGH|Clerk#000000990|0|riously alongside of the furiously even courts. carefully even instru +20294|128|F|100845.27|1993-01-01|4-NOT SPECIFIED|Clerk#000000375|0|regular, even requests; express pinto beans use fluffily alongside of the blit +20295|1436|F|34139.06|1993-02-15|4-NOT SPECIFIED|Clerk#000000912|0| beans serve above the silent, +20320|487|O|229280.08|1996-12-03|1-URGENT|Clerk#000000741|0|lent deposits. furiously +20321|341|O|87174.25|1996-09-02|2-HIGH|Clerk#000000359|0|s the slyly final foxes. packages nag furiously. carefully f +20322|1174|F|185911.87|1994-06-29|1-URGENT|Clerk#000000292|0| are evenly. slyly reg +20323|334|O|83147.32|1995-05-08|3-MEDIUM|Clerk#000000386|0|aggle blithely against the courts. fluffily unusual acc +20324|653|O|116358.87|1995-06-17|1-URGENT|Clerk#000000590|0|arefully express deposits are slyly. acco +20325|1342|F|266905.83|1993-07-04|1-URGENT|Clerk#000000923|0|ording to the ironic deposits. slyly even patterns agains +20326|959|O|115220.26|1995-11-26|3-MEDIUM|Clerk#000000791|0|y close, ironic packages. carefully bold foxes sleep daringly a +20327|1103|O|130283.70|1996-05-29|4-NOT SPECIFIED|Clerk#000000862|0|ctions. carefully permanent packa +20352|818|O|178225.28|1998-02-16|2-HIGH|Clerk#000000484|0|ithely even platelets nag furiously fluffily pending theodolites. +20353|1237|O|125201.78|1997-07-05|4-NOT SPECIFIED|Clerk#000000555|0| courts. blithely eve +20354|460|F|297050.83|1992-09-20|1-URGENT|Clerk#000000477|0|s the even, even requests. slyly regular deposits sleep furious +20355|355|F|67477.94|1993-05-20|5-LOW|Clerk#000000909|0| wake furiously across the slyly regular theodolite +20356|595|O|105543.36|1995-09-20|3-MEDIUM|Clerk#000000924|0|g the furiously ironic requests. e +20357|20|O|73454.28|1996-10-31|5-LOW|Clerk#000000663|0| packages. requests integrate above the furiously reg +20358|578|O|79035.84|1997-03-15|2-HIGH|Clerk#000000340|0|ckages across the slyly regu +20359|823|F|78508.35|1994-11-02|5-LOW|Clerk#000000502|0| depths. blithely s +20384|71|O|186982.79|1995-10-26|5-LOW|Clerk#000000174|0| furiously even, regular requests. fluffily ironic packages nag furiously bra +20385|1115|O|285556.50|1996-07-23|4-NOT SPECIFIED|Clerk#000000558|0|g the carefully final theodolites. quickly even packages detect s +20386|4|F|78070.68|1993-02-28|1-URGENT|Clerk#000000964|0|pending ideas? bold accounts dazzle carefully final r +20387|751|O|106114.40|1997-05-19|5-LOW|Clerk#000000416|0|xpress Tiresias lose ironic frets. express, regu +20388|1156|O|157733.06|1996-04-24|2-HIGH|Clerk#000000176|0|ts detect. slyly special theodolites against the daring +20389|1126|F|201387.81|1994-08-12|2-HIGH|Clerk#000000442|0|usly bold platelets. pinto beans haggle above the +20390|256|F|156099.12|1994-09-01|4-NOT SPECIFIED|Clerk#000000821|0| dolphins use carefully. +20391|581|F|46511.06|1994-01-29|2-HIGH|Clerk#000000437|0|nding deposits sleep quickly quickly ironic requests. carefully regular de +20416|908|O|286731.78|1996-06-17|4-NOT SPECIFIED|Clerk#000000415|0|ly special accounts sleep ironic requests. furiously dogged instr +20417|991|F|57528.68|1992-02-02|4-NOT SPECIFIED|Clerk#000000809|0| beans. final pinto beans use blithely since the quietly even attainments. +20418|1138|O|173428.61|1997-09-11|2-HIGH|Clerk#000000646|0| express requests snooze carefully. ideas instead of the slyly special platel +20419|733|O|59893.64|1997-09-23|5-LOW|Clerk#000000078|0|equests are carefully against the furiously pending packages. quickly even r +20420|1147|O|80397.29|1997-06-22|1-URGENT|Clerk#000000242|0|st after the final instructions. blithely even accounts after the even, pe +20421|1150|O|88855.08|1998-05-16|1-URGENT|Clerk#000000667|0|pinto beans engage carefully. blithely express requests detect abou +20422|1075|F|107636.01|1994-01-27|2-HIGH|Clerk#000000994|0| deposits run. furiously even reques +20423|1442|O|178227.35|1997-11-08|2-HIGH|Clerk#000000100|0|carefully ironic theod +20448|94|O|83771.01|1995-08-03|1-URGENT|Clerk#000000839|0|ep above the final foxes. ironic, pend +20449|427|F|224239.28|1993-01-04|3-MEDIUM|Clerk#000000115|0|after the slyly even ide +20450|74|F|63300.18|1992-12-08|1-URGENT|Clerk#000000304|0|p above the bold packages. even deposits across the pending, ruthles +20451|839|F|185164.22|1992-05-26|1-URGENT|Clerk#000000443|0|ven requests nag ironic theodolites. regular, pending accounts according +20452|992|F|38376.09|1995-01-06|1-URGENT|Clerk#000000871|0|final, pending requests. even, silent do +20453|859|P|179192.43|1995-03-11|3-MEDIUM|Clerk#000000577|0|counts sleep according to the quickly express e +20454|58|F|56644.46|1995-04-05|2-HIGH|Clerk#000000579|0|ncies. furiously silent p +20455|182|F|231783.76|1993-06-29|1-URGENT|Clerk#000000542|0|ove the furiously ironi +20480|488|F|190528.78|1994-01-30|3-MEDIUM|Clerk#000000932|0|ial, even requests use slowly about the foxes. even p +20481|958|O|85979.61|1997-11-10|5-LOW|Clerk#000000209|0|ular platelets cajole quickly above the slyly ironic asymptote +20482|1132|O|226156.58|1995-07-19|3-MEDIUM|Clerk#000000194|0|arefully. fluffily reg +20483|1483|F|106205.74|1993-01-10|5-LOW|Clerk#000000072|0| packages among the carefully unusual theodolites sleep instructions. fluffil +20484|1117|F|150565.68|1994-01-30|1-URGENT|Clerk#000000475|0|ets across the pending, silent accounts a +20485|1189|O|164019.30|1996-11-26|2-HIGH|Clerk#000000068|0|courts. slow requests sleep bravely final platelets. idle, unusual foxes +20486|1216|F|210783.19|1995-03-06|2-HIGH|Clerk#000000162|0| ironic packages sleep besides the instructions. slyly express de +20487|268|O|169568.44|1996-06-09|5-LOW|Clerk#000000699|0|ve furiously among the never pending packages. permanently special fo +20512|326|O|254135.81|1995-11-05|5-LOW|Clerk#000000994|0|ly unusual requests are. blithely unusual requests cajole. express d +20513|328|F|201247.72|1994-07-08|2-HIGH|Clerk#000000144|0|ins integrate slyly quickly fin +20514|184|O|133488.56|1998-05-12|4-NOT SPECIFIED|Clerk#000000140|0|ithely even packages sleep carefully fluffily regular deposits. +20515|559|O|23322.74|1995-11-16|2-HIGH|Clerk#000000692|0| slyly express dolphins impress after the slyly ironic pinto beans. blithely +20516|1318|O|44782.26|1996-02-26|4-NOT SPECIFIED|Clerk#000000701|0|tructions. quickly regular warthogs haggle slyly across the fluffily ir +20517|262|F|201727.67|1993-09-16|5-LOW|Clerk#000000707|0| pinto beans lose blithely after the closely regular theodolites. special requ +20518|794|F|117511.15|1994-10-06|1-URGENT|Clerk#000000801|0|ut the quickly final dolphins. courts c +20519|1340|F|175053.84|1994-04-11|2-HIGH|Clerk#000000160|0|egular theodolites sleep quickly accou +20544|604|O|70488.13|1998-01-07|2-HIGH|Clerk#000000151|0|counts. slyly ironic deposits daz +20545|1177|F|141270.50|1993-10-10|4-NOT SPECIFIED|Clerk#000000947|0|carefully final deposits. quickly regular accounts are slyly after the furio +20546|379|F|117363.19|1994-12-13|3-MEDIUM|Clerk#000000478|0|etect furiously according to the ironic, pending requests. final +20547|808|F|31554.35|1993-08-27|2-HIGH|Clerk#000000951|0| deposits. bold platelets integrate after th +20548|730|F|281701.67|1994-05-03|4-NOT SPECIFIED|Clerk#000000170|0|c ideas affix blithely across the ironically pending p +20549|142|F|35207.39|1994-01-13|4-NOT SPECIFIED|Clerk#000000771|0|ites. ironic, even excuses would are carefully +20550|919|O|58080.57|1998-05-09|5-LOW|Clerk#000000236|0|blithely. ironic warhorses wake slyl +20551|121|O|260907.51|1996-04-26|1-URGENT|Clerk#000000048|0|arefully about the packages. silent packages around the si +20576|1279|F|281135.58|1993-09-25|3-MEDIUM|Clerk#000000666|0|arefully ironic fox +20577|712|F|183257.32|1993-02-10|1-URGENT|Clerk#000000134|0|ickly according to the accounts. even requ +20578|220|O|212124.98|1997-06-12|4-NOT SPECIFIED|Clerk#000000172|0|s. quickly even deposits haggle slyly about the final theodolites-- iron +20579|304|F|104993.42|1992-10-02|3-MEDIUM|Clerk#000000749|0|al, final packages +20580|847|O|95823.01|1995-09-10|4-NOT SPECIFIED|Clerk#000000572|0|odolites; furiously express packages cajole care +20581|1069|O|2794.65|1996-10-02|3-MEDIUM|Clerk#000000476|0|totes sleep quickly along the slyly unusual foxes-- blithely silent pack +20582|1445|O|206473.36|1997-05-07|4-NOT SPECIFIED|Clerk#000000765|0|etect slyly according to the carefully regular epitaphs +20583|1427|O|11343.80|1997-04-08|4-NOT SPECIFIED|Clerk#000000973|0| haggle blithely. furious +20608|1199|O|185798.33|1998-03-23|4-NOT SPECIFIED|Clerk#000000292|0|ss the bold instructions wake +20609|598|F|42236.21|1992-10-15|1-URGENT|Clerk#000000697|0| deposits cajole blithely against the quietly special pinto +20610|14|O|185397.75|1997-11-13|2-HIGH|Clerk#000000179|0|es was furiously after the quickly pending pinto +20611|1321|O|19750.39|1996-03-25|1-URGENT|Clerk#000000505|0|across the carefully bold epitaphs. blithely regular frets boost. +20612|607|O|254968.37|1996-11-23|4-NOT SPECIFIED|Clerk#000000975|0|yly careful accounts +20613|433|F|20449.04|1992-09-23|5-LOW|Clerk#000000019|0| foxes. blithely even theodolites integrate behind the +20614|743|F|99401.82|1994-05-19|4-NOT SPECIFIED|Clerk#000000642|0|he theodolites along the carefully ironic theodolites cajole carefully furiou +20615|310|F|165574.34|1992-04-16|3-MEDIUM|Clerk#000000041|0|ons? carefully pendin +20640|751|O|247416.34|1997-12-07|4-NOT SPECIFIED|Clerk#000000955|0| packages cajole asymptotes. slyly even accounts +20641|1292|F|193273.52|1995-02-20|5-LOW|Clerk#000000863|0|ending accounts affix blithely carefully regular theodolite +20642|1118|F|304032.02|1992-05-20|2-HIGH|Clerk#000000416|0|usly. slyly express accounts use across the bold accounts. +20643|1330|O|92783.67|1995-08-22|4-NOT SPECIFIED|Clerk#000000924|0|he slyly enticing requests. slyly unusual packages nag abo +20644|1345|O|60981.44|1995-06-23|5-LOW|Clerk#000000855|0|gular foxes are slyly across the excuses. final, pending requests are fluffily +20645|601|F|18887.63|1992-03-11|5-LOW|Clerk#000000073|0|ructions lose. blithely +20646|1384|F|203783.06|1995-03-31|3-MEDIUM|Clerk#000000911|0|g to the dogged, final accounts. quickly regular accounts sublate. pend +20647|1117|O|28920.80|1998-02-23|5-LOW|Clerk#000000696|0|hily slow dependencies. busily e +20672|1159|F|73911.88|1993-06-01|1-URGENT|Clerk#000000100|0| permanent grouches must sleep bli +20673|301|O|248508.34|1996-05-18|1-URGENT|Clerk#000000341|0|e the express notornis. slyly silent gifts are permanently across the +20674|295|F|128149.37|1993-12-09|2-HIGH|Clerk#000000812|0|furiously ironic, pending deposits. furiously express packages caj +20675|1198|F|107863.55|1993-04-10|2-HIGH|Clerk#000000449|0| requests. slyly regular ideas across the qu +20676|868|F|305338.87|1992-11-23|5-LOW|Clerk#000000580|0|s instructions. ironic, special requ +20677|404|O|193174.86|1996-11-21|3-MEDIUM|Clerk#000000752|0|lar deposits. final accounts print blithely +20678|1456|O|122307.84|1997-02-12|4-NOT SPECIFIED|Clerk#000000612|0|ages-- quickly unusual sheaves above the even requests mold blithely iro +20679|715|F|280250.19|1993-08-15|3-MEDIUM|Clerk#000000648|0|counts boost carefully across the carefully final asymptotes. slyly ir +20704|473|F|164373.12|1993-02-11|5-LOW|Clerk#000000847|0|posits. blithely unusual requests affix furiously against t +20705|157|O|174259.85|1998-05-27|3-MEDIUM|Clerk#000000774|0|y according to the slyly ironic tithes: express foxe +20706|1313|F|21134.36|1994-07-13|2-HIGH|Clerk#000000981|0|final, ironic requests. express deposits snooze across the even, even Tir +20707|1213|O|35845.89|1996-03-25|2-HIGH|Clerk#000000176|0|ges. slyly regular ideas integrate ca +20708|1009|F|217420.81|1992-01-11|5-LOW|Clerk#000000321|0|accounts. sentiments sleep. blithely final pi +20709|172|F|255932.37|1994-08-12|2-HIGH|Clerk#000000291|0|ect blithely. even, ironic theodolites promise aga +20710|499|F|134000.16|1994-11-30|2-HIGH|Clerk#000000625|0| carefully final packag +20711|1085|F|96500.98|1994-01-20|1-URGENT|Clerk#000000987|0|luffily special Tiresias are closely enticingly regular foxes. unusual, ir +20736|1058|O|56695.30|1995-09-22|4-NOT SPECIFIED|Clerk#000000703|0|atelets hinder among the regular asym +20737|38|O|213621.09|1995-12-26|3-MEDIUM|Clerk#000000142|0|e express accounts. enticingly bold accounts boost slyl +20738|565|F|253526.04|1992-09-03|3-MEDIUM|Clerk#000000394|0|xpress requests. blithely unusu +20739|1382|O|161850.81|1997-03-21|2-HIGH|Clerk#000000619|0|gedly. carefully final ideas sublate quickly. quickly ironic +20740|283|F|258345.85|1993-01-11|1-URGENT|Clerk#000000255|0|alongside of the even foxes. accounts was +20741|1480|F|208567.62|1993-10-31|5-LOW|Clerk#000000661|0|s! slyly bold deposits haggle. dependenc +20742|1369|F|138369.07|1992-01-01|4-NOT SPECIFIED|Clerk#000000913|0|dolites. special, pending courts about the silent req +20743|145|O|173867.58|1995-12-16|2-HIGH|Clerk#000000696|0| pinto beans above the slyly silent +20768|1094|F|149296.48|1992-10-18|4-NOT SPECIFIED|Clerk#000000721|0|ounts sleep boldly ironic requests. c +20769|1124|O|132072.66|1998-07-04|5-LOW|Clerk#000000860|0|ackages sublate accounts. quickly regular pinto beans after +20770|943|F|79974.06|1993-06-23|3-MEDIUM|Clerk#000000265|0|accounts. furiously final accounts cajole carefully blithel +20771|175|O|92123.77|1996-02-26|3-MEDIUM|Clerk#000000763|0|ual packages sleep. furiously special ideas sleep furiously above the bl +20772|1412|F|79878.93|1993-06-04|1-URGENT|Clerk#000000281|0|ly unusual theodolites! slyly final accounts use slyly. sly +20773|466|F|73952.96|1994-03-06|4-NOT SPECIFIED|Clerk#000000707|0|t slyly. blithely ironic pinto beans impress furiously regular instructio +20774|85|F|59909.38|1994-08-30|3-MEDIUM|Clerk#000000726|0|d the slyly express +20775|382|F|50469.47|1993-01-31|5-LOW|Clerk#000000535|0|gside of the unusual courts. foxes +20800|1219|F|28760.34|1994-08-06|3-MEDIUM|Clerk#000000771|0|yly regular ideas. blithely express dependencies according to the q +20801|1021|O|237954.74|1997-03-23|5-LOW|Clerk#000000669|0|ke carefully at the blithely unusual accounts. silently e +20802|1441|O|28558.95|1995-09-20|5-LOW|Clerk#000000489|0|st slyly furious theodolites. car +20803|52|F|64816.45|1992-02-21|1-URGENT|Clerk#000000378|0|slyly at the furiously express pinto bea +20804|814|O|230761.46|1995-11-27|5-LOW|Clerk#000000816|0|e fluffily regular instru +20805|1318|F|192067.09|1995-01-11|2-HIGH|Clerk#000000739|0|s boost slyly blithely regular +20806|1403|O|211960.28|1996-10-08|2-HIGH|Clerk#000000397|0|. regular ideas are car +20807|704|F|116393.38|1992-07-22|4-NOT SPECIFIED|Clerk#000000958|0|es. furiously regular packages after the platelets are quickly along the +20832|1018|F|109594.76|1993-07-31|4-NOT SPECIFIED|Clerk#000000492|0|: furiously express packages about the slyly regula +20833|370|O|53892.64|1998-07-07|2-HIGH|Clerk#000000925|0|uctions boost. furiously ironic depend +20834|1168|F|37346.39|1992-01-15|3-MEDIUM|Clerk#000000830|0|ckages wake quickly across the blithely regular instructions. sly +20835|874|O|156061.58|1996-01-20|3-MEDIUM|Clerk#000000247|0| the bravely quiet pa +20836|406|O|45219.37|1998-06-08|3-MEDIUM|Clerk#000000760|0|oach ideas. slyly regular depen +20837|751|F|72778.89|1994-02-03|5-LOW|Clerk#000000015|0|structions are quickly after the ironic, regular deposits! regular +20838|994|F|350071.83|1994-04-11|4-NOT SPECIFIED|Clerk#000000816|0|ully regular accounts wake pending, ironic pinto beans. furiously +20839|1394|O|69386.72|1998-06-05|5-LOW|Clerk#000000673|0|ar pearls was. final dep +20864|833|O|276459.49|1995-12-07|2-HIGH|Clerk#000000858|0|inal courts integrate blithely bold requests. blithely special foxes wake. +20865|518|O|360459.63|1997-12-19|2-HIGH|Clerk#000000419|0|ely permanent pinto bea +20866|1435|P|230497.02|1995-03-28|2-HIGH|Clerk#000000806|0|ons. even decoys are daringly according to the carefully final r +20867|343|O|121856.25|1996-10-31|2-HIGH|Clerk#000000785|0|cial deposits. special ins +20868|544|F|33616.41|1993-10-10|5-LOW|Clerk#000000107|0|tions boost quickly-- furiou +20869|1430|O|12939.51|1996-09-14|5-LOW|Clerk#000000883|0|ag slyly. instructi +20870|814|F|175190.47|1994-08-15|3-MEDIUM|Clerk#000000774|0|lites. furiously regular pearls cajole blithely after the slyly ironic reque +20871|517|F|80501.34|1993-10-07|4-NOT SPECIFIED|Clerk#000000832|0|egular packages hag +20896|1016|F|27291.04|1993-01-20|3-MEDIUM|Clerk#000000674|0|refully idle platelets use quietly. furiously r +20897|530|P|130068.41|1995-03-16|5-LOW|Clerk#000000350|0|asymptotes according to the express requests was darin +20898|290|O|121082.38|1995-10-31|3-MEDIUM|Clerk#000000346|0|le fluffily along the sometimes ironic requests. bli +20899|994|F|97123.57|1993-04-13|5-LOW|Clerk#000000902|0|ironic packages nag furiously furiously express idea +20900|823|F|33953.19|1993-11-25|5-LOW|Clerk#000000407|0|the packages detect quickly ironic packages. special ideas sleep quickly furio +20901|173|F|79218.93|1995-03-21|2-HIGH|Clerk#000000455|0|iously according to the slyly bold requests. ironic, silent acc +20902|25|O|142880.93|1997-01-06|2-HIGH|Clerk#000000510|0|along the ironic, bold excuses are silent +20903|589|F|104107.74|1994-05-21|2-HIGH|Clerk#000000634|0|ndencies are. even dependencies wake slyly inside the regular +20928|1270|P|125249.62|1995-04-17|2-HIGH|Clerk#000000091|0|ironic platelets x-ray furiou +20929|850|O|79744.73|1997-12-26|2-HIGH|Clerk#000000663|0|gular sheaves are furiously alongside of +20930|769|O|140745.61|1996-05-24|5-LOW|Clerk#000000471|0|silent asymptotes affix finally above the slow somas. ironic, ironic r +20931|742|F|178237.90|1995-01-28|4-NOT SPECIFIED|Clerk#000000134|0|ggle furiously according to the quickly pending accoun +20932|668|F|273723.61|1992-07-30|2-HIGH|Clerk#000000840|0|thinly. regular deposits snooze furiously beside the quickly ironic accounts +20933|643|F|219531.53|1992-08-27|2-HIGH|Clerk#000000508|0|ar depths are carefully. blithely pen +20934|79|F|169997.86|1993-01-21|1-URGENT|Clerk#000000449|0|posits according to the fluffily express instructions sleep thinly iro +20935|997|O|77170.04|1996-04-01|1-URGENT|Clerk#000000140|0|oxes. slyly unusual +20960|1258|O|71875.18|1995-11-19|5-LOW|Clerk#000000247|0|olites. even deposits are quickly regular packages. furiously even ideas d +20961|667|F|258687.35|1993-01-15|4-NOT SPECIFIED|Clerk#000000036|0|ly final foxes between the s +20962|457|F|263684.97|1992-02-15|3-MEDIUM|Clerk#000000990|0|quickly regular instructions. carefully bold ideas haggle carefully. bold, fi +20963|13|F|30017.80|1994-10-09|3-MEDIUM|Clerk#000000394|0|ts boost carefully. quickly regula +20964|10|F|298876.15|1992-03-31|1-URGENT|Clerk#000000041|0|press deposits affix furiously fluffily +20965|1240|F|181511.69|1994-12-21|1-URGENT|Clerk#000000052|0|out the fluffily regul +20966|643|F|184100.55|1993-09-19|5-LOW|Clerk#000000368|0| waters affix carefully carefully ironic sentiments. furiou +20967|301|P|219976.43|1995-03-16|2-HIGH|Clerk#000000138|0|anent excuses haggle after the packages. packa +20992|836|F|90694.79|1992-08-05|2-HIGH|Clerk#000000053|0|onic theodolites. furiously regular dependencies are about the p +20993|1462|O|46520.13|1996-01-24|2-HIGH|Clerk#000000812|0|ly regular instructions. furiously final orbits cajole. +20994|907|O|181612.37|1996-04-12|1-URGENT|Clerk#000000240|0|nal dependencies need to are blithely regular theodolites. f +20995|139|F|112188.95|1992-03-28|3-MEDIUM|Clerk#000000778|0| dependencies promise carefully. express, ironic accounts print; +20996|583|O|49889.63|1996-08-16|2-HIGH|Clerk#000000925|0|lyly ironic platelets cajole slyly carefu +20997|889|O|144644.32|1998-03-05|1-URGENT|Clerk#000000266|0|ckages cajole carefully. furio +20998|766|O|299553.01|1997-01-31|5-LOW|Clerk#000000784|0|ular asymptotes promise. quickly bold deposits ea +20999|1309|O|110155.48|1997-04-23|5-LOW|Clerk#000000859|0|ss the final courts. alwa +21024|706|F|72188.69|1993-12-29|3-MEDIUM|Clerk#000000549|0|ins sleep slyly. quickly final deposits snooze carefull +21025|136|F|81361.53|1993-09-12|4-NOT SPECIFIED|Clerk#000000260|0|theodolites. blithely express pinto be +21026|865|O|142850.15|1996-08-08|1-URGENT|Clerk#000000593|0|iers cajole furiously +21027|943|F|231325.82|1993-01-06|2-HIGH|Clerk#000000864|0|cial, regular foxes. regular ideas cajole regular de +21028|106|F|84341.71|1992-06-08|1-URGENT|Clerk#000000490|0|times careful packages sleep against the pending packages. express, re +21029|499|O|53152.97|1996-04-19|3-MEDIUM|Clerk#000000577|0|g to the quick pinto beans cajole against the slyly re +21030|307|F|152151.50|1992-04-23|1-URGENT|Clerk#000000779|0|t the express foxes haggle furiously above the ironic deposits. blith +21031|343|O|43702.29|1995-08-13|3-MEDIUM|Clerk#000000342|0|y regular accounts cajole blithely bold, pendi +21056|347|F|79773.41|1992-11-19|4-NOT SPECIFIED|Clerk#000000457|0|usly regular instructions. final, regular foxes are +21057|1129|F|142469.55|1995-02-04|5-LOW|Clerk#000000326|0|y along the carefully regular packa +21058|881|F|58836.85|1992-10-11|4-NOT SPECIFIED|Clerk#000000860|0|uests. blithely blithe theodolites detec +21059|536|F|42202.52|1992-11-04|1-URGENT|Clerk#000000134|0|nt ideas are above the bold, regular theodolites? ca +21060|566|O|126118.18|1998-05-18|4-NOT SPECIFIED|Clerk#000000257|0|lyly express epitaphs sleep fluffily +21061|113|F|53757.07|1994-12-22|2-HIGH|Clerk#000000018|0|ular pinto beans wake slyly above the regular theodolites. fluff +21062|881|O|253234.80|1997-10-16|4-NOT SPECIFIED|Clerk#000000580|0|entiments. even, sil +21063|445|P|100706.45|1995-04-16|5-LOW|Clerk#000000652|0|y around the accounts. furiously ironic accoun +21088|463|O|75961.96|1997-02-18|2-HIGH|Clerk#000000643|0|lyly final packages. requests poach quickly across the slyly expr +21089|49|O|243844.70|1995-07-29|3-MEDIUM|Clerk#000000347|0|pendencies according to the instructions wake silent in +21090|91|F|158319.52|1992-05-16|4-NOT SPECIFIED|Clerk#000000312|0|yly according to the fluffily regular asymptotes. blithely regular pac +21091|1096|F|115363.89|1994-12-13|2-HIGH|Clerk#000000556|0|express deposits wake furiously atop the slyly express pinto be +21092|745|O|163511.42|1997-01-18|5-LOW|Clerk#000000938|0|uctions wake furiously? blithely ironic ideas a +21093|643|F|79875.90|1994-03-01|3-MEDIUM|Clerk#000000942|0|efully alongside of the furiously regular packages. final, even fo +21094|1282|F|77868.19|1994-07-17|2-HIGH|Clerk#000000077|0|s. express accounts cajole careful +21095|772|F|229644.31|1994-02-18|1-URGENT|Clerk#000000678|0| quickly daring instructions use blithely patterns-- carefully bold ideas s +21120|1469|F|121789.85|1993-03-12|1-URGENT|Clerk#000000202|0|use against the requ +21121|649|F|7076.04|1994-09-17|4-NOT SPECIFIED|Clerk#000000604|0| across the quickly express excuses. slyly ironic pinto +21122|676|O|162839.08|1997-02-06|2-HIGH|Clerk#000000523|0|sits: blithely furious packages after the +21123|709|O|283297.94|1998-07-22|3-MEDIUM|Clerk#000000059|0|sual requests. fina +21124|341|O|215919.00|1996-08-27|4-NOT SPECIFIED|Clerk#000000184|0|carefully final sentiments mold among +21125|307|F|60479.92|1995-02-27|4-NOT SPECIFIED|Clerk#000000157|0|into beans haggle. fluffily pending accounts sleep fu +21126|1136|F|97574.91|1992-03-19|1-URGENT|Clerk#000000416|0|s was quietly about the quickly bold dependencies. +21127|184|F|171594.14|1993-09-26|1-URGENT|Clerk#000000376|0| slyly regular foxes around the regular packages sleep blithely against t +21152|184|O|266740.16|1997-10-23|5-LOW|Clerk#000000982|0|le slyly above the quickly express pinto beans. ruthlessly regular requests +21153|1183|F|262320.29|1994-01-17|2-HIGH|Clerk#000000377|0|osits along the fluffily pending theodolites sleep across the furiously ironic +21154|1105|F|27180.00|1993-08-18|5-LOW|Clerk#000000640|0|ructions affix fluffily around the blithely even excuses. unusual deposits +21155|892|F|152120.42|1995-02-06|2-HIGH|Clerk#000000640|0|instructions. unusual, express deposits haggle furiously arou +21156|1217|O|281270.34|1997-04-14|5-LOW|Clerk#000000211|0|lthy pinto beans. silent, careful packag +21157|1489|O|177891.04|1996-02-07|4-NOT SPECIFIED|Clerk#000000997|0|usly slyly final packages. carefully express pa +21158|490|O|33275.18|1996-10-24|2-HIGH|Clerk#000000495|0|ckly blithely regular dolphins. sometimes reg +21159|86|O|201364.66|1995-06-08|5-LOW|Clerk#000000360|0|nag blithely alongside of the slyly regular deposits. furiously exp +21184|388|O|72878.37|1998-07-11|3-MEDIUM|Clerk#000000255|0|ide of the slyly silent pinto beans. quiet, ironic deposits +21185|443|O|73331.17|1997-01-10|3-MEDIUM|Clerk#000000831|0|ke slyly requests. ironic a +21186|961|F|106969.87|1992-05-11|2-HIGH|Clerk#000000488|0|dolphins use slyly about the ironic decoys. express packages wake fluffily +21187|136|O|168182.12|1996-09-25|3-MEDIUM|Clerk#000000531|0|carefully ironic platelets shall affix qui +21188|349|O|95400.65|1995-09-22|1-URGENT|Clerk#000000073|0|into beans about the carefully even excuses s +21189|719|O|212161.54|1996-02-15|3-MEDIUM|Clerk#000000874|0|ckages. furiously blithe ideas wake furiously. excuses da +21190|775|F|138124.56|1994-05-29|3-MEDIUM|Clerk#000000487|0|lyly within the carefully express instructions. regular i +21191|979|F|172655.34|1992-11-15|2-HIGH|Clerk#000000222|0|lithely final ideas nag furiously. fluffily even dinos nag. f +21216|1042|O|59898.02|1998-07-22|3-MEDIUM|Clerk#000000439|0|osits. slyly regular platelets cajole carefully. final pinto beans must pro +21217|1208|F|10713.02|1994-09-10|4-NOT SPECIFIED|Clerk#000000028|0|nding, special pinto beans. unusual, final foxes are blithely +21218|152|O|28083.35|1997-06-18|1-URGENT|Clerk#000000910|0|e regular packages. deposits haggle. final theodolites af +21219|1346|F|194607.48|1995-01-17|5-LOW|Clerk#000000014|0|deposits. carefully silent r +21220|301|F|319691.33|1992-12-23|4-NOT SPECIFIED|Clerk#000000100|0|osits. carefully express accounts above the depths affix care +21221|808|F|51922.48|1994-07-26|2-HIGH|Clerk#000000806|0|e against the slyly even theodo +21222|814|F|254447.25|1994-02-04|4-NOT SPECIFIED|Clerk#000000112|0|to the even, special pinto +21223|410|F|232117.32|1992-03-16|4-NOT SPECIFIED|Clerk#000000323|0|ways ironic platelets: packages nag. re +21248|775|O|252440.15|1996-08-11|5-LOW|Clerk#000000605|0|kindle even sauternes +21249|785|F|166125.39|1993-09-20|5-LOW|Clerk#000000662|0| pending, regular instructions cajole bl +21250|1489|O|89894.47|1997-07-08|3-MEDIUM|Clerk#000000932|0|l foxes affix slyly slyly busy accounts. slyly bo +21251|1024|O|134573.73|1996-11-24|3-MEDIUM|Clerk#000000161|0|es cajole slyly final d +21252|1151|O|280184.51|1996-06-02|4-NOT SPECIFIED|Clerk#000000575|0|ecoys. fluffily regular deposits sleep quickly according to the s +21253|1466|F|167165.40|1992-04-18|3-MEDIUM|Clerk#000000460|0|l packages. blithely regular deposits boost slyly? slyly even +21254|229|F|71805.39|1993-08-20|5-LOW|Clerk#000000770|0|l requests among the fl +21255|454|F|236940.60|1994-08-29|2-HIGH|Clerk#000000621|0|even dolphins. asymptotes impress slyly final instructions. bo +21280|991|O|264223.21|1997-12-07|4-NOT SPECIFIED|Clerk#000000430|0|round the theodolites breach alongside of the slyly unusual platelets. slyly +21281|1115|F|118840.99|1995-04-05|2-HIGH|Clerk#000000503|0|cording to the fluffily bold deposi +21282|1141|O|203407.33|1998-05-02|2-HIGH|Clerk#000000973|0|carefully according to the slyly unusual +21283|908|O|270727.93|1996-12-30|5-LOW|Clerk#000000515|0|s are carefully bold theodolites. stealthily bold ideas +21284|1121|F|81535.00|1992-09-15|1-URGENT|Clerk#000000660|0|ndencies above the regu +21285|1348|F|131049.74|1993-07-04|3-MEDIUM|Clerk#000000956|0|r packages after the even deposits hinder ruthless instructions. blithe +21286|607|F|174550.69|1994-05-17|1-URGENT|Clerk#000000906|0|eep quickly deposits. regular, e +21287|920|O|243403.57|1997-01-28|3-MEDIUM|Clerk#000000845|0|as cajole slyly special requests. even packages engage slyly along the ca +21312|283|O|57584.48|1996-02-01|1-URGENT|Clerk#000000951|0|ts. regular deposits according to the in +21313|460|F|70712.15|1992-07-28|4-NOT SPECIFIED|Clerk#000000198|0|usly ironic theodolites wake in +21314|730|F|210750.61|1994-11-03|5-LOW|Clerk#000000232|0|deposits. slyly express ideas about the accounts sleep around the +21315|184|O|119881.53|1996-10-09|2-HIGH|Clerk#000000534|0|the pending, express instructions sleep quic +21316|943|O|197610.99|1997-10-21|3-MEDIUM|Clerk#000000973|0|uctions are alongside of the deposits! fluffily unusual theod +21317|838|P|269454.16|1995-04-10|5-LOW|Clerk#000000737|0|Tiresias. accounts a +21318|980|F|232394.74|1993-07-05|2-HIGH|Clerk#000000376|0|ily final excuses-- special waters wake fluffily about the final pinto bea +21319|815|F|174915.82|1993-04-30|3-MEDIUM|Clerk#000000738|0|tions-- slyly quiet packages along the final, final theodolites u +21344|493|F|127573.52|1992-12-10|5-LOW|Clerk#000000442|0|e. bold deposits co +21345|22|F|121395.99|1993-04-25|4-NOT SPECIFIED|Clerk#000000040|0|ag slyly about the gifts. blithely special w +21346|932|O|184551.36|1995-06-08|2-HIGH|Clerk#000000899|0|foxes wake furiously blithely pend +21347|887|O|230432.88|1998-05-22|3-MEDIUM|Clerk#000000439|0|es according to the furiously f +21348|118|F|22887.17|1995-03-11|1-URGENT|Clerk#000000995|0|posits affix furiously pending package +21349|1138|O|195615.84|1998-07-18|4-NOT SPECIFIED|Clerk#000000189|0|s wake blithely after the even requests. requests haggle quickly +21350|389|F|27250.86|1995-02-25|3-MEDIUM|Clerk#000000247|0|ickly according to the final accounts? alw +21351|1072|O|29301.66|1998-03-13|4-NOT SPECIFIED|Clerk#000000423|0| the ironic pinto beans boost througho +21376|1277|O|344610.00|1996-06-09|4-NOT SPECIFIED|Clerk#000000873|0|as use blithely. furiously silent theodolites wake care +21377|1144|F|61894.08|1993-02-23|5-LOW|Clerk#000000725|0|the blithely special pinto beans. accounts cajole furiously across the bo +21378|179|O|217579.12|1995-08-08|3-MEDIUM|Clerk#000000854|0|ly bold deposits. slyly unusual courts are final dependenci +21379|544|F|190363.45|1995-01-15|2-HIGH|Clerk#000000218|0|x fluffily final deposits. fu +21380|775|O|180798.62|1997-03-14|4-NOT SPECIFIED|Clerk#000000445|0|arefully special packages. quickly +21381|260|F|14478.71|1994-06-15|1-URGENT|Clerk#000000834|0|ial accounts cajole final dependencies. carefully silent packages acco +21382|455|F|379689.83|1992-01-13|1-URGENT|Clerk#000000112|0|uests against the slyly r +21383|178|F|160369.71|1994-01-31|5-LOW|Clerk#000000249|0|ld notornis. quickly regular theo +21408|1042|O|187999.41|1997-08-30|5-LOW|Clerk#000000167|0|e quickly regular requests: unusu +21409|1165|F|91876.56|1994-02-25|4-NOT SPECIFIED|Clerk#000000184|0|y bold realms nag carefully above the b +21410|1499|F|54168.29|1992-05-02|1-URGENT|Clerk#000000944|0|cross the quickly regular braids! furiously +21411|1325|O|148059.94|1997-07-13|1-URGENT|Clerk#000000501|0| to the blithely pendin +21412|1270|O|117403.73|1995-07-14|4-NOT SPECIFIED|Clerk#000000830|0|t the slyly bold ideas. blithely regular +21413|677|O|265930.15|1997-06-13|5-LOW|Clerk#000000332|0|he blithely bold ideas-- carefully regular accounts do detect +21414|1400|P|355597.02|1995-05-05|1-URGENT|Clerk#000000832|0|d deposits. unusual, silent ideas around the si +21415|788|F|68837.16|1992-04-27|1-URGENT|Clerk#000000249|0|s: quickly regular dependencies according to the regular, final depe +21440|1378|F|176705.79|1992-11-14|1-URGENT|Clerk#000000815|0|tructions. carefully express ideas wake +21441|1156|O|91274.56|1997-05-19|1-URGENT|Clerk#000000990|0|ts. express platelets nag stealthily aga +21442|1225|F|182494.70|1994-12-26|5-LOW|Clerk#000000584|0|uriously regular dependencies. furiously special packages sleep +21443|137|O|71886.46|1996-01-05|2-HIGH|Clerk#000000900|0|press foxes nag furiously? furiously final accounts past the furio +21444|199|P|225515.11|1995-04-16|3-MEDIUM|Clerk#000000451|0|gular ideas sleep slyly after the idle, even accou +21445|883|F|262159.09|1994-11-18|5-LOW|Clerk#000000054|0|odolites wake along the furiously bold instructions. silent deposits +21446|523|O|81852.09|1998-05-27|2-HIGH|Clerk#000000602|0| ironic deposits shall boost carefully against the sometimes +21447|1430|F|291570.11|1993-06-04|4-NOT SPECIFIED|Clerk#000000357|0| regular ideas! platelets a +21472|908|O|59118.90|1996-01-08|2-HIGH|Clerk#000000900|0|olphins after the blithely bold instructions are asymptot +21473|559|P|78305.38|1995-04-02|2-HIGH|Clerk#000000328|0|ress instructions integrate quickly blithely even excuses +21474|757|F|236143.22|1993-04-05|1-URGENT|Clerk#000000977|0| carefully regular pinto beans sleep b +21475|1138|F|189133.45|1995-02-21|1-URGENT|Clerk#000000722|0|nts are slyly around the pending depos +21476|1264|O|184907.10|1995-05-19|3-MEDIUM|Clerk#000000240|0|heodolites. blithely regular packages ki +21477|337|P|216395.26|1995-05-22|5-LOW|Clerk#000000650|0|ic accounts nag above the ironic de +21478|1061|F|303657.83|1992-03-03|5-LOW|Clerk#000000452|0|he blithely even foxes. slyly final deposits boost slyly according +21479|385|F|98748.20|1994-08-29|3-MEDIUM|Clerk#000000282|0|out the quickly express asymptotes run slyly bo +21504|83|O|184886.29|1997-11-06|3-MEDIUM|Clerk#000000802|0|unusual, stealthy requests are quickly among the slyly unusua +21505|80|F|269780.48|1992-12-04|5-LOW|Clerk#000000067|0|tions haggle up the caref +21506|976|F|183580.67|1994-06-08|3-MEDIUM|Clerk#000000425|0|ully pending requests wake carefully along the furiously pending accounts. +21507|1054|O|128337.81|1997-06-15|3-MEDIUM|Clerk#000000837|0|usly slyly pending packages. slyly bold requests wake u +21508|1309|O|81861.37|1998-04-26|5-LOW|Clerk#000000280|0| thinly stealthy deposits +21509|1198|F|177291.23|1992-07-04|2-HIGH|Clerk#000000841|0|ithely special asymptotes. furiously pending foxes are slyly furi +21510|385|F|82848.10|1992-05-09|2-HIGH|Clerk#000000138|0|. quickly ironic requests affix. stealthy accounts wake about the care +21511|149|O|273551.78|1996-04-17|4-NOT SPECIFIED|Clerk#000000217|0|refully blithely silent deposits. blithely pendi +21536|868|O|158554.35|1997-04-12|5-LOW|Clerk#000000395|0|ns sleep. bold accounts must lose furiously. blith +21537|857|F|59461.71|1992-02-06|1-URGENT|Clerk#000000924|0|fily unusual ideas are carefully after the carefully idle +21538|1243|F|222231.74|1994-07-28|3-MEDIUM|Clerk#000000118|0|ing packages-- regular forges was. furiously regular +21539|604|F|120744.66|1993-07-10|3-MEDIUM|Clerk#000000008|0|ns about the fluffy acco +21540|412|F|104776.53|1992-05-13|5-LOW|Clerk#000000894|0|. quickly ironic dependencies cajole +21541|220|F|58559.74|1994-10-09|4-NOT SPECIFIED|Clerk#000000559|0|ounts. blithely regular depos +21542|794|P|202414.03|1995-05-22|2-HIGH|Clerk#000000563|0|eposits wake blithely packages. carefully even requests use care +21543|262|F|167911.70|1992-03-08|2-HIGH|Clerk#000000247|0|ctions detect carefully gifts. blithely ironic theodol +21568|566|O|49099.81|1995-07-20|2-HIGH|Clerk#000000169|0|gs. instructions promise final saute +21569|838|O|19741.87|1996-09-12|3-MEDIUM|Clerk#000000227|0|y even accounts. blithely silent requests haggle blithely express, final pa +21570|1093|O|60287.71|1996-02-03|2-HIGH|Clerk#000000965|0|ly. carefully final +21571|172|O|151541.70|1995-08-20|5-LOW|Clerk#000000825|0|hely even dolphins. regular, special packages doubt blithely bold, regular the +21572|1405|F|204460.19|1994-02-14|1-URGENT|Clerk#000000156|0|gular packages. never even pinto bea +21573|316|F|205131.07|1992-04-26|1-URGENT|Clerk#000000521|0|y pending deposits. blithely final requests are carefull +21574|754|F|149143.07|1993-01-16|1-URGENT|Clerk#000000858|0|ntain furiously along the blithely f +21575|1220|O|73291.67|1997-02-02|2-HIGH|Clerk#000000658|0| dolphins. carefully unusu +21600|1474|F|167190.51|1993-04-05|5-LOW|Clerk#000000325|0|ic instructions thrash about th +21601|475|O|118496.63|1995-04-07|5-LOW|Clerk#000000425|0|ccounts. carefully even asymptotes haggle iro +21602|1157|F|134298.00|1994-07-02|1-URGENT|Clerk#000000279|0|its cajole against the final courts; carefully special instructio +21603|607|O|86145.76|1997-04-21|2-HIGH|Clerk#000000200|0| foxes along the slyly express pinto beans wake carefully pending packages. +21604|1177|F|187273.67|1992-04-02|3-MEDIUM|Clerk#000000965|0|r dependencies. unusual, regular r +21605|712|F|181222.86|1992-04-09|2-HIGH|Clerk#000000516|0| quickly even platelets. slyly ironic depos +21606|685|F|153653.46|1995-01-23|4-NOT SPECIFIED|Clerk#000000270|0|ses: slyly ironic pinto beans hinder blithely ag +21607|1084|F|78581.12|1992-03-16|4-NOT SPECIFIED|Clerk#000000532|0|y even depths. unusual, ironic dependencies s +21632|1381|F|17638.64|1993-01-22|2-HIGH|Clerk#000000129|0|al asymptotes cajole quickly carefully enticing depos +21633|68|F|327255.85|1994-03-28|3-MEDIUM|Clerk#000000756|0|nst the unusual, final deposits. slyly regular dependencies are. even ideas im +21634|586|F|159887.62|1992-10-29|4-NOT SPECIFIED|Clerk#000000284|0|special waters. ironic +21635|704|F|67011.33|1994-12-03|5-LOW|Clerk#000000039|0|riously bold instructions sleep care +21636|868|F|256391.21|1994-08-11|5-LOW|Clerk#000000240|0|ily final foxes affix blithely along the furiously quiet asymp +21637|955|O|50355.93|1998-02-14|5-LOW|Clerk#000000839|0|old epitaphs. quickly silent requests +21638|1244|F|64462.50|1992-04-17|2-HIGH|Clerk#000000708|0|along the requests. furiou +21639|1282|F|171257.52|1995-02-03|4-NOT SPECIFIED|Clerk#000000030|0|quickly alongside of the deposits. hockey players inte +21664|134|F|179106.99|1994-11-13|2-HIGH|Clerk#000000086|0|ual requests use; deposits in place of the +21665|1234|F|107228.03|1992-10-16|2-HIGH|Clerk#000000782|0|ly ironic accounts. regularly regular packages engage? accounts solve fluff +21666|935|F|120279.74|1993-12-18|3-MEDIUM|Clerk#000000396|0|ages will have to sleep against the +21667|161|O|247764.04|1996-05-21|5-LOW|Clerk#000000728|0|l dependencies use blithely packages. unusual pinto beans print +21668|104|O|176574.78|1996-11-06|2-HIGH|Clerk#000000979|0| x-ray. furiously final accounts haggle asymptot +21669|1135|O|118083.02|1995-07-25|3-MEDIUM|Clerk#000000569|0|egular, final excuses. fl +21670|841|F|204477.26|1995-01-12|2-HIGH|Clerk#000000729|0|ully. deposits at the pending sauternes poach furiously blithely spec +21671|307|F|62875.91|1993-06-16|2-HIGH|Clerk#000000843|0|slyly ironic deposits. quickly final deposi +21696|442|F|154745.72|1993-10-22|3-MEDIUM|Clerk#000000191|0|s impress regular accounts. carefully express packages grow slyly final pac +21697|958|O|229968.06|1996-03-05|5-LOW|Clerk#000000299|0| ideas haggle fluffily about the furiously special requests +21698|1111|O|241341.07|1998-03-04|2-HIGH|Clerk#000000655|0|requests are about the final, fina +21699|248|O|168254.87|1995-12-05|4-NOT SPECIFIED|Clerk#000000422|0|uickly regular foxes. slyly final packages are about the quickly iro +21700|103|O|231603.82|1997-07-21|5-LOW|Clerk#000000526|0|ccounts nag finally pin +21701|826|O|75548.57|1996-01-21|4-NOT SPECIFIED|Clerk#000000419|0|ironic requests. dari +21702|1414|F|16971.60|1993-12-18|4-NOT SPECIFIED|Clerk#000000078|0|al packages. platelets are +21703|785|F|121593.54|1994-03-03|4-NOT SPECIFIED|Clerk#000000352|0|en accounts wake blithely with the furiously express theodolites. bold, +21728|745|O|131727.73|1996-12-26|3-MEDIUM|Clerk#000000217|0|eep carefully about the regu +21729|10|F|309286.33|1992-12-07|5-LOW|Clerk#000000577|0|e requests. quickly car +21730|1343|O|147837.54|1996-03-05|2-HIGH|Clerk#000000336|0|ly pending waters. instructions throughout +21731|1415|O|166989.49|1995-11-27|5-LOW|Clerk#000000363|0| accounts. furiously regular theodolites among the blithely r +21732|829|O|222231.87|1996-01-11|2-HIGH|Clerk#000000203|0|telets. carefully close packages sleep furiously slowly final depo +21733|1270|O|350092.65|1996-11-17|1-URGENT|Clerk#000000273|0|r the finally final excuses cajole against the +21734|1442|O|85510.79|1996-02-21|4-NOT SPECIFIED|Clerk#000000295|0|final theodolites. fluffily ironic dep +21735|337|F|194656.54|1993-03-10|4-NOT SPECIFIED|Clerk#000000692|0|slyly fluffily even deposits. +21760|455|F|63425.37|1995-01-31|4-NOT SPECIFIED|Clerk#000000347|0| sentiments. idle, final requests haggle instructions. bli +21761|328|O|53797.39|1997-03-03|5-LOW|Clerk#000000300|0|g pinto beans. theodolites boost slyly across the blit +21762|595|O|250064.82|1996-08-21|3-MEDIUM|Clerk#000000752|0|aggle blithely along the furiously regular pinto beans. slyly re +21763|391|F|108860.43|1992-05-29|5-LOW|Clerk#000000020|0|usly after the quietly even warthogs. pending warhorses sleep. carefully fina +21764|160|O|118155.38|1997-02-24|5-LOW|Clerk#000000983|0|ly special dependencies nag furiously at the blithely bold theodolites. +21765|598|O|94208.67|1997-04-08|4-NOT SPECIFIED|Clerk#000000467|0|egular deposits are among the regular, unusual +21766|1390|F|82889.77|1994-06-02|2-HIGH|Clerk#000000839|0|theodolites wake qui +21767|358|O|187660.03|1998-04-03|3-MEDIUM|Clerk#000000092|0| pending dependencies! regular, final deposit +21792|310|F|27403.01|1992-09-26|4-NOT SPECIFIED|Clerk#000000772|0|gular pearls haggle furiously slyly ir +21793|1096|P|52230.75|1995-04-21|5-LOW|Clerk#000000152|0|ers. quickly special deposi +21794|1376|F|252075.19|1994-06-11|4-NOT SPECIFIED|Clerk#000000300|0|even pinto beans use above the unusual acco +21795|380|F|294163.36|1993-06-14|4-NOT SPECIFIED|Clerk#000000325|0|regular pearls sleep quickly slyly regul +21796|1385|F|240009.51|1992-05-07|5-LOW|Clerk#000000346|0|es. deposits sleep across t +21797|196|O|228945.91|1997-05-08|2-HIGH|Clerk#000000669|0|yly busy accounts wake slyly about the blithe +21798|458|O|99990.79|1998-06-21|3-MEDIUM|Clerk#000000367|0|along the blithely regular deposits. final, unusual +21799|385|F|210837.27|1995-04-20|4-NOT SPECIFIED|Clerk#000000731|0| according to the ruthlessly ironic theodolites. regular +21824|656|F|29462.14|1995-02-08|5-LOW|Clerk#000000154|0|eodolites. slyly final requests along the r +21825|395|F|35434.48|1993-01-03|3-MEDIUM|Clerk#000000663|0|blithely regular deposits. bravely special accounts cajole quickly above the r +21826|1168|O|212185.67|1996-03-25|1-URGENT|Clerk#000000473|0|foxes. packages use blithely according to the gr +21827|950|F|94387.71|1992-11-10|4-NOT SPECIFIED|Clerk#000000180|0|iously thin deposits are accord +21828|535|O|226752.40|1996-11-19|3-MEDIUM|Clerk#000000500|0|ly pending deposits among the regular packages thrash slyl +21829|758|O|5660.07|1998-01-27|4-NOT SPECIFIED|Clerk#000000401|0|uffily express frets. furiously sp +21830|548|F|58105.09|1994-01-12|5-LOW|Clerk#000000704|0|blithely final requests haggle furiously acros +21831|625|F|110846.60|1994-09-20|4-NOT SPECIFIED|Clerk#000000923|0|nal foxes. ruthless, unusual requests cajole. silent requests caj +21856|514|F|127130.06|1992-04-06|4-NOT SPECIFIED|Clerk#000000464|0|uests; accounts nag fluffily after the bold ideas. fluffily unusual sheaves h +21857|748|F|25972.07|1992-06-30|5-LOW|Clerk#000000443|0| beans haggle slyly a +21858|1162|O|206195.10|1997-10-27|3-MEDIUM|Clerk#000000667|0|ncies. furiously express dep +21859|707|O|168938.07|1995-11-19|2-HIGH|Clerk#000000995|0| thinly final requests. regular accounts nag. final acco +21860|605|F|202099.91|1992-04-29|1-URGENT|Clerk#000000579|0| accounts are blithely fluffily i +21861|1211|F|211628.67|1994-08-19|1-URGENT|Clerk#000000969|0|o the carefully unusual requ +21862|451|F|122590.60|1993-09-13|4-NOT SPECIFIED|Clerk#000000523|0|r closely special requests. quickly express somas use a +21863|652|F|197689.40|1993-11-22|4-NOT SPECIFIED|Clerk#000000474|0|tions: special accounts wake quietly above the slyly final accounts. +21888|289|F|105333.80|1992-04-06|2-HIGH|Clerk#000000853|0|ding to the blithely ironic instructions. evenly even deposits slee +21889|1480|F|163057.51|1993-04-02|5-LOW|Clerk#000000387|0|riously express deposits. carefully iron +21890|940|F|117331.98|1995-01-25|4-NOT SPECIFIED|Clerk#000000838|0|unts? regularly idle packages cajole carefully final, +21891|832|O|14515.20|1997-11-25|4-NOT SPECIFIED|Clerk#000000392|0| doggedly according to the regular deposits. silent, bold +21892|679|F|53791.17|1993-07-05|2-HIGH|Clerk#000000398|0|somas use blithely regular pinto beans. ironic pa +21893|1456|O|114317.24|1995-10-25|1-URGENT|Clerk#000000212|0|ss deposits. furiously ironic packages wake. blit +21894|856|O|174533.62|1995-12-19|1-URGENT|Clerk#000000348|0|g to the packages wake quickly careful +21895|464|O|150461.67|1998-05-31|5-LOW|Clerk#000000743|0|s are quickly deposits. furiously silent courts above the deposits sleep fluff +21920|44|O|91869.27|1998-03-13|5-LOW|Clerk#000000407|0|yly even foxes are after the ironic deposits. daringly e +21921|1039|F|125496.60|1994-09-13|3-MEDIUM|Clerk#000000906|0|ding deposits sleep above the blithely express deposits. slyly unus +21922|1483|F|224259.51|1994-11-12|2-HIGH|Clerk#000000033|0|n. fluffily silent pinto beans engage f +21923|256|O|185736.86|1998-06-22|3-MEDIUM|Clerk#000000609|0|elieve furiously carefully regula +21924|758|O|82823.66|1998-05-11|4-NOT SPECIFIED|Clerk#000000939|0|hely regular ideas boost! fluffily final requests cajole pendin +21925|614|F|229239.19|1992-07-13|4-NOT SPECIFIED|Clerk#000000130|0|l accounts are carefully after th +21926|958|O|129794.78|1996-08-18|5-LOW|Clerk#000000009|0|e quickly regular accounts. +21927|442|O|250339.08|1995-12-11|2-HIGH|Clerk#000000176|0| among the blithely brave pearls impress +21952|206|F|68743.94|1993-06-18|3-MEDIUM|Clerk#000000653|0|ly pending waters are. carefully bold platelets detect +21953|79|F|68973.04|1994-05-30|2-HIGH|Clerk#000000065|0|carefully. slyly ironic instructions across the carefully even the +21954|664|F|75474.99|1992-11-05|5-LOW|Clerk#000000242|0|ss the furiously ironic instructions cajole sl +21955|883|O|136357.67|1997-04-19|2-HIGH|Clerk#000000111|0|le. unusual deposits haggle. slyly express packages after th +21956|662|F|281506.72|1995-02-02|2-HIGH|Clerk#000000292|0|sts. blithely regular deposits run carefully. pending packa +21957|853|O|61430.93|1996-05-02|4-NOT SPECIFIED|Clerk#000000503|0|egular pearls haggle along the slyly ironic platelets. furiously i +21958|1345|F|262453.85|1994-06-06|2-HIGH|Clerk#000000561|0| even requests? fluffily special pains haggle. blithely ironic requests c +21959|53|O|215869.32|1996-02-18|1-URGENT|Clerk#000000399|0|ckages haggle furiously about the pending, regular requests. +21984|970|O|139586.17|1997-10-22|4-NOT SPECIFIED|Clerk#000000142|0|eas are ironic, regular platelets. carefully regula +21985|217|F|213742.86|1994-08-27|1-URGENT|Clerk#000000388|0|about the quickly even deposits are according to the express theodolites. +21986|1357|O|182358.39|1997-07-11|2-HIGH|Clerk#000000194|0|slyly ironic, bold excuses. slyly regular theodolites haggle slyly. furiously +21987|128|F|55218.95|1992-07-08|2-HIGH|Clerk#000000434|0|ironic deposits about the silently even packages integrate carefully abou +21988|662|F|99737.30|1993-03-29|3-MEDIUM|Clerk#000000594|0|equests wake carefully +21989|1363|F|264723.01|1995-02-11|5-LOW|Clerk#000000597|0| carefully pending deposits cajole furiousl +21990|695|F|103669.59|1992-08-23|3-MEDIUM|Clerk#000000303|0|nstructions. final, even pinto +21991|904|O|44025.84|1997-05-13|5-LOW|Clerk#000000797|0|accounts. ironic, pending deposits nag furiously sl +22016|169|O|287711.47|1996-08-08|4-NOT SPECIFIED|Clerk#000000658|0|sly, regular deposits boost carefully. f +22017|998|F|99207.93|1994-12-24|3-MEDIUM|Clerk#000000427|0|yly alongside of the carefully ironic packages. +22018|146|O|138552.38|1996-06-04|5-LOW|Clerk#000000125|0| carefully permanent platelets. special requests wake instead of the care +22019|604|O|72250.18|1995-10-30|4-NOT SPECIFIED|Clerk#000000684|0|ously. unusual deposits wake. furiously bold foxes sleep bold, bold +22020|331|F|232170.36|1993-05-18|1-URGENT|Clerk#000000043|0|. finally regular instructions aft +22021|1259|O|93621.32|1996-05-27|5-LOW|Clerk#000000110|0|ckly after the even ideas. fluffily +22022|1130|F|51045.65|1993-04-04|1-URGENT|Clerk#000000153|0|ly against the deposits. ideas are slyly carefully special platelets. +22023|1108|O|8873.71|1996-01-08|5-LOW|Clerk#000000249|0|ts boost fluffily final packages. unusual accounts haggle slyly ab +22048|727|O|8023.91|1997-11-15|2-HIGH|Clerk#000000395|0|express excuses wake according to the slyly express +22049|770|O|20019.97|1997-08-18|2-HIGH|Clerk#000000627|0|ven accounts nod carefully quickly daring requ +22050|673|F|272305.29|1993-06-26|2-HIGH|Clerk#000000433|0|egular pinto beans cajole carefu +22051|625|O|137463.42|1995-12-31|4-NOT SPECIFIED|Clerk#000000369|0|eodolites are blithely regular ideas. express requests cajole quickl +22052|1063|O|185617.49|1995-11-09|1-URGENT|Clerk#000000942|0|thely among the ideas. regular, even deposits impre +22053|883|F|275301.51|1993-08-22|1-URGENT|Clerk#000000169|0|he carefully pending packages. furiously unusual deposi +22054|484|F|157118.38|1993-07-30|3-MEDIUM|Clerk#000000040|0|ke quickly. instructions wake carefully. slyly ironic packages according to t +22055|1108|F|97195.48|1992-09-24|3-MEDIUM|Clerk#000000436|0|ar deposits. furiously ironic deposits cajole slyly. slyly bold requests s +22080|202|F|120154.04|1992-10-14|2-HIGH|Clerk#000000147|0|l deposits should wake furiously across the +22081|92|F|150864.86|1992-05-14|4-NOT SPECIFIED|Clerk#000000256|0|gainst the pending instructions haggle evenly carefully ironi +22082|256|O|106572.58|1997-08-12|5-LOW|Clerk#000000251|0|tions unwind. always special requ +22083|1472|F|123134.86|1994-02-18|1-URGENT|Clerk#000000354|0|ccounts wake above the silent deposits. furiously regul +22084|985|F|42959.75|1992-08-30|4-NOT SPECIFIED|Clerk#000000086|0|ges about the unusu +22085|116|F|154120.36|1992-03-10|5-LOW|Clerk#000000588|0|into beans sleep carefully above the carefully final foxes. finally express pa +22086|845|O|17810.45|1995-12-16|3-MEDIUM|Clerk#000000639|0|e carefully final requests. unusual ideas doze. bold somas detect carefully fl +22087|457|F|60868.30|1994-07-30|1-URGENT|Clerk#000000464|0|ely even deposits detect according to the dep +22112|145|O|131094.34|1996-01-27|4-NOT SPECIFIED|Clerk#000000970|0| carefully ironic asymptotes affix after the carefully final dolphins. pinto b +22113|850|F|85874.77|1993-03-18|3-MEDIUM|Clerk#000000516|0|ely at the always unusual ideas. blithe +22114|536|O|91099.31|1996-03-25|1-URGENT|Clerk#000000247|0|ully above the silent packages. special dependencies haggle +22115|94|F|162750.32|1993-06-16|5-LOW|Clerk#000000889|0|eep. final accounts against the slyly express dependencies cajole express i +22116|884|O|153194.80|1996-08-15|5-LOW|Clerk#000000718|0|refully ironic ideas are ruthlessly about the blithely final requests. pinto +22117|386|F|209082.48|1993-08-13|1-URGENT|Clerk#000000734|0|tterns haggle quickly. furiously regular foxes sleep carefully f +22118|1442|F|114510.47|1994-01-19|2-HIGH|Clerk#000000658|0|efully quiet theodolites. quickly regular depen +22119|1099|F|199198.97|1994-07-25|5-LOW|Clerk#000000676|0|equests hang quickly. unusual requests along the quickly furious accounts c +22144|1177|O|44703.64|1998-03-15|2-HIGH|Clerk#000000799|0|s sleep carefully. slyly regular foxes sublate carefully final deposits. +22145|1111|O|62932.72|1996-03-14|5-LOW|Clerk#000000491|0|usly regular instructions boost furiously after the bra +22146|1139|O|228030.19|1998-05-16|4-NOT SPECIFIED|Clerk#000000037|0|sts. carefully special accounts serve. slyly s +22147|896|F|190901.96|1994-01-17|5-LOW|Clerk#000000941|0|quests. carefully even packages use slyly. furiously dogged ideas sl +22148|854|O|324538.99|1998-03-13|2-HIGH|Clerk#000000148|0|ven, ironic packages unwind according to the slyly pe +22149|203|O|134645.99|1995-09-24|5-LOW|Clerk#000000769|0|nal, regular deposits. ideas above the fluffily regu +22150|727|O|95324.07|1998-02-01|1-URGENT|Clerk#000000187|0|e platelets are fluffily pending requests: bl +22151|1111|F|66533.95|1993-08-01|2-HIGH|Clerk#000000324|0|ackages-- furiously regular t +22176|1415|F|160277.19|1994-08-16|4-NOT SPECIFIED|Clerk#000000727|0|uriously ironic asymptotes cajole blithely along the slyly +22177|328|O|135059.99|1997-07-09|1-URGENT|Clerk#000000452|0|jole carefully excuses. bold packages snooze blithely past +22178|1315|F|20465.55|1994-03-30|4-NOT SPECIFIED|Clerk#000000564|0|ages sleep. blithely thin accounts sleep at the ironically final theodoli +22179|1253|F|87476.44|1993-11-11|1-URGENT|Clerk#000000193|0|packages. slyly ironic packages detect sly +22180|1115|O|27999.66|1998-05-06|2-HIGH|Clerk#000000067|0|ts haggle. blithely final deposits among the carefully ironic +22181|589|O|223073.51|1995-10-08|5-LOW|Clerk#000000952|0|l asymptotes boost blithely. furiously ev +22182|817|F|99852.69|1992-09-06|3-MEDIUM|Clerk#000000091|0|he furiously silent pinto beans. special packages sleep. blithely fluffy i +22183|229|F|320889.82|1992-04-24|3-MEDIUM|Clerk#000000304|0|y special instructions. furiously ironic foxes along the regular foxes +22208|485|F|104216.44|1994-10-14|2-HIGH|Clerk#000000405|0|the even, ironic gifts. furiously close requests sleep regular, s +22209|656|F|83604.30|1993-09-07|4-NOT SPECIFIED|Clerk#000000909|0|sual accounts above the furio +22210|1132|O|248263.37|1995-09-20|1-URGENT|Clerk#000000757|0|ar deposits run carefully unusual +22211|1237|O|174035.08|1995-10-04|4-NOT SPECIFIED|Clerk#000000824|0| furiously packages. slyly ironic theodolites haggle slyly unusual foxes? fl +22212|1168|F|90406.91|1993-09-18|3-MEDIUM|Clerk#000000202|0|y dogged pinto bean +22213|29|O|87793.68|1997-07-18|4-NOT SPECIFIED|Clerk#000000541|0|kly even packages sleep fluffily carefully final accounts +22214|739|O|195929.55|1998-07-09|4-NOT SPECIFIED|Clerk#000000479|0|ilent, pending packages hag +22215|550|O|195848.44|1996-03-15|1-URGENT|Clerk#000000134|0|eans. slyly slow deposi +22240|418|O|27617.83|1996-10-19|3-MEDIUM|Clerk#000000816|0|haggle along the special +22241|1451|F|54438.38|1994-02-07|2-HIGH|Clerk#000000693|0|sleep carefully even ideas. blithel +22242|173|F|170220.12|1994-06-16|4-NOT SPECIFIED|Clerk#000000975|0|hins. ruthlessly regular accounts +22243|1063|F|248088.81|1994-01-16|1-URGENT|Clerk#000000548|0|kly even requests. bli +22244|281|P|18963.38|1995-05-01|2-HIGH|Clerk#000000605|0|he unusual requests nag f +22245|736|F|70619.29|1994-05-01|4-NOT SPECIFIED|Clerk#000000128|0|ing foxes. furiously pending requests grow furiously. sl +22246|928|O|276428.24|1997-04-17|5-LOW|Clerk#000000930|0|fily ironic theodolites. furiously express depos +22247|1177|O|167421.57|1998-04-04|4-NOT SPECIFIED|Clerk#000000830|0|the foxes. ironic accounts do wake quickly across t +22272|980|F|248570.30|1992-05-07|2-HIGH|Clerk#000000622|0| platelets. slyly final packages sleep blithely daringly silent depende +22273|1280|O|248677.56|1997-01-26|4-NOT SPECIFIED|Clerk#000000130|0|inal, pending courts. fluffi +22274|1477|F|71998.33|1993-08-18|5-LOW|Clerk#000000333|0|al, ironic platelets solv +22275|772|O|118466.81|1997-07-27|4-NOT SPECIFIED|Clerk#000000119|0|des. furiously pending asymptotes are amon +22276|220|F|272600.15|1995-01-29|3-MEDIUM|Clerk#000000150|0|ans cajole around t +22277|1261|O|270268.11|1998-03-28|2-HIGH|Clerk#000000850|0|oost quickly blithely regu +22278|529|O|115196.26|1996-04-03|2-HIGH|Clerk#000000468|0|. carefully express dependencies after the even +22279|899|F|50957.45|1994-12-23|4-NOT SPECIFIED|Clerk#000000251|0|the carefully furious foxes. unusual foxes integrate pe +22304|544|O|210954.71|1995-11-26|5-LOW|Clerk#000000913|0|o beans use even decoys. requests sleep packages. furi +22305|1130|F|42051.67|1992-07-03|2-HIGH|Clerk#000000047|0|yly ironic deposits use. final escapades a +22306|458|O|144773.84|1996-08-16|4-NOT SPECIFIED|Clerk#000000618|0|ndencies. packages ac +22307|701|F|171528.51|1993-09-24|5-LOW|Clerk#000000571|0|ourts. furiously express instructions could sleep carefully above the ex +22308|871|F|172077.23|1994-04-01|3-MEDIUM|Clerk#000000874|0|round the blithely +22309|1490|O|324025.46|1996-12-28|4-NOT SPECIFIED|Clerk#000000127|0|nding packages-- quickly pending pinto beans across the express instructi +22310|181|O|107842.26|1997-11-26|4-NOT SPECIFIED|Clerk#000000858|0|. thin, final accounts cajole. e +22311|290|O|219961.89|1998-06-11|4-NOT SPECIFIED|Clerk#000000871|0|lly thin, silent deposits. quickly regular +22336|1483|O|244018.28|1997-08-03|5-LOW|Clerk#000000682|0| unusual deposits use quickly special deposits. slyly unusual accounts acr +22337|784|O|153967.50|1996-02-23|5-LOW|Clerk#000000250|0|hely slyly final pinto beans. +22338|1360|F|164060.90|1993-05-15|3-MEDIUM|Clerk#000000049|0| furiously pending packages at the furiously regular pinto beans +22339|154|F|111234.01|1994-11-05|1-URGENT|Clerk#000000122|0|nal excuses x-ray fluffily furiously final packages. furiou +22340|278|O|65459.34|1998-04-26|3-MEDIUM|Clerk#000000639|0|sits wake furiously ideas. blithely special accou +22341|86|O|158904.42|1995-12-02|2-HIGH|Clerk#000000432|0|e furiously about the pending packages. fluffily unusual requests cajole +22342|994|F|205365.77|1994-05-30|5-LOW|Clerk#000000301|0|usual requests. bold asymptotes cajole furiously final attainments. slyly +22343|655|O|147623.14|1996-01-25|5-LOW|Clerk#000000475|0|endencies. final requests serve bo +22368|1043|F|157564.42|1993-02-20|3-MEDIUM|Clerk#000000528|0|according to the carefully bold th +22369|1141|O|197530.17|1996-03-13|5-LOW|Clerk#000000578|0| packages. furiously pending accounts are carefully. regu +22370|1460|O|185394.12|1997-12-15|5-LOW|Clerk#000000821|0| slyly even frays among +22371|1150|F|32236.12|1994-04-05|2-HIGH|Clerk#000000668|0|express accounts are carefully blithely ironic dinos. blithely ironic request +22372|769|O|246076.21|1997-04-04|2-HIGH|Clerk#000000917|0|he ironic instructions. +22373|523|F|292540.44|1992-03-29|2-HIGH|Clerk#000000392|0|uests. carefully even accounts are slyly furiously regular ideas +22374|979|F|78250.24|1994-09-25|1-URGENT|Clerk#000000238|0|pendencies against the +22375|73|F|44148.67|1995-04-08|4-NOT SPECIFIED|Clerk#000000185|0|sly even deposits. caref +22400|805|F|41272.12|1993-07-01|2-HIGH|Clerk#000000304|0|unusual requests nag blithely carefully ironic pa +22401|241|O|38701.21|1997-02-01|3-MEDIUM|Clerk#000000208|0|tructions. accounts are carefully furiously final instr +22402|632|F|118699.91|1994-05-28|1-URGENT|Clerk#000000943|0|tions cajole furiously deposits. fluffily blithe accounts are blithely +22403|529|O|129269.90|1998-08-01|3-MEDIUM|Clerk#000000054|0|eas. furiously unusual accounts wake s +22404|677|F|75817.89|1993-11-17|5-LOW|Clerk#000000749|0|slyly regular attainments instead of the quickly re +22405|1280|O|27843.15|1997-03-20|1-URGENT|Clerk#000000948|0| haggle blithely after the frays. ca +22406|521|O|123083.27|1996-03-24|5-LOW|Clerk#000000386|0|haggle about the blithely reg +22407|755|F|228474.22|1994-11-18|4-NOT SPECIFIED|Clerk#000000712|0|s sleep furiously among the blithely even deposits. +22432|1456|F|251530.64|1992-11-29|4-NOT SPECIFIED|Clerk#000000152|0|s wake. requests use furiously unusual, unusual pin +22433|905|P|151867.19|1995-03-04|1-URGENT|Clerk#000000857|0|uctions cajole blithely blithely express dependencies. blithely idle de +22434|1027|F|308107.23|1992-08-30|1-URGENT|Clerk#000000094|0|olites sleep quickly final packages. even, bold asymptotes boos +22435|709|O|100437.06|1997-06-06|5-LOW|Clerk#000000322|0|l foxes doubt furiously. slyly final ideas haggle furio +22436|751|O|178799.70|1996-05-24|1-URGENT|Clerk#000000068|0|ar packages. even, bold foxes wake. dependencies cajole carefully iron +22437|79|F|43384.53|1994-07-31|2-HIGH|Clerk#000000148|0|fully. blithely special deposits haggle along the blithely +22438|1192|O|275112.53|1997-09-28|1-URGENT|Clerk#000000774|0|ously regular foxes sleep. express deposits sle +22439|610|O|198119.63|1997-09-01|1-URGENT|Clerk#000000566|0|xcuses. even grouches haggle fluffily. unusual grouches hagg +22464|308|O|235373.35|1998-02-13|2-HIGH|Clerk#000000216|0|furiously across the even pat +22465|1348|F|32435.12|1992-07-22|4-NOT SPECIFIED|Clerk#000000269|0|he deposits. blithely regular foxes sleep furiously slowly furious asymptot +22466|4|F|130160.51|1992-03-29|5-LOW|Clerk#000000641|0|g accounts can sleep blithely along the quiet, unusual p +22467|1342|O|75696.72|1998-01-31|4-NOT SPECIFIED|Clerk#000000341|0|lyly regular foxes kindle carefully. deposits haggle +22468|1244|F|275903.03|1993-06-11|4-NOT SPECIFIED|Clerk#000000828|0|carefully about the fluffily final orbits. furi +22469|964|F|245660.73|1993-10-12|2-HIGH|Clerk#000000068|0|ymptotes wake. even, express pearls boost slyly fluffily even foxe +22470|547|F|43938.35|1993-07-22|1-URGENT|Clerk#000000789|0| furiously express accounts. blithely bold deposits unwind +22471|1435|O|175467.22|1997-04-17|2-HIGH|Clerk#000000719|0|elets are above the quickly final ac +22496|1135|F|30227.13|1994-08-23|3-MEDIUM|Clerk#000000642|0|cross the fluffily unusual dependencies. slyly express packa +22497|757|F|177030.78|1992-04-29|3-MEDIUM|Clerk#000000662|0|s engage slyly sometimes regular +22498|802|F|98586.49|1993-11-10|1-URGENT|Clerk#000000906|0|refully. even package +22499|200|F|24847.49|1994-10-07|5-LOW|Clerk#000000399|0|e quickly final packages. fluffily ironic orbits cajole furiou +22500|704|F|70239.83|1992-08-05|5-LOW|Clerk#000000295|0|ally pending accounts! special packag +22501|493|F|105604.37|1993-05-19|2-HIGH|Clerk#000000849|0| carefully. blithely furious platelets hang carefull +22502|946|O|168912.62|1998-03-11|3-MEDIUM|Clerk#000000444|0|ending theodolites are after the fluffily d +22503|251|O|30303.96|1997-12-15|1-URGENT|Clerk#000000137|0|r foxes. even, pending pinto beans hinder quickly above the fluffil +22528|1160|O|109423.44|1995-11-12|2-HIGH|Clerk#000000539|0|ic accounts could sleep carefully furiously special packages. +22529|968|F|112480.82|1993-05-08|3-MEDIUM|Clerk#000000843|0| final pearls. ironically ironic packages cajole blithely ironic, pending +22530|883|O|58701.18|1997-01-20|1-URGENT|Clerk#000000724|0|usual warthogs sleep +22531|37|O|188883.37|1995-11-20|5-LOW|Clerk#000000362|0|e unusual, regular pinto beans: slyly regular dolphins mold ca +22532|598|F|60752.68|1995-02-09|1-URGENT|Clerk#000000907|0|ust have to sleep about th +22533|436|O|126237.78|1995-11-29|1-URGENT|Clerk#000000741|0|r pinto beans sleep furiously at the regular instructions. slyl +22534|1439|O|116497.31|1995-07-19|3-MEDIUM|Clerk#000000983|0|uriously fluffy instructions across the regular, bold +22535|940|F|41723.03|1994-08-19|2-HIGH|Clerk#000000925|0|ans. slyly pending pinto beans print quickly slyly even deposits. regular, +22560|1084|O|115596.81|1996-03-01|3-MEDIUM|Clerk#000000879|0|iously unusual pinto b +22561|52|F|250229.52|1995-01-21|1-URGENT|Clerk#000000919|0|uests cajole fluffily slyly final deposit +22562|103|F|88732.83|1994-03-28|3-MEDIUM|Clerk#000000944|0|special foxes. carefully silent packages haggle. +22563|854|F|110923.79|1992-05-21|1-URGENT|Clerk#000000409|0| the carefully regular deposits. quickly regular pinto beans need to boost sly +22564|1321|F|9230.44|1995-02-25|3-MEDIUM|Clerk#000000549|0|theodolites. regular dependencies use quickly after th +22565|844|O|276337.42|1998-01-31|4-NOT SPECIFIED|Clerk#000000656|0|l pinto beans. carefully ironic packag +22566|634|O|201868.76|1998-05-05|1-URGENT|Clerk#000000809|0|unts sleep regular, regular deposits. carefully regular ideas +22567|175|O|127846.26|1996-08-09|5-LOW|Clerk#000000450|0|y ironic platelets about the regular, ironic theodolites +22592|65|O|168891.15|1997-06-21|3-MEDIUM|Clerk#000000850|0|lphins wake furiously along the sil +22593|97|O|179442.75|1998-05-24|2-HIGH|Clerk#000000842|0|uests. unusual, final courts use regular, silent accounts. final +22594|1496|F|123192.57|1993-05-10|2-HIGH|Clerk#000000266|0|ccounts wake quickly express, final instructions. quic +22595|1033|O|187221.68|1996-03-15|2-HIGH|Clerk#000000454|0|detect blithely regular +22596|116|O|176285.53|1996-10-02|4-NOT SPECIFIED|Clerk#000000685|0|inal, unusual packages according to the slyly pending accoun +22597|625|O|51198.83|1996-01-01|3-MEDIUM|Clerk#000000568|0|lites are slyly along the bold deposits. slowly +22598|118|F|199407.58|1993-03-21|4-NOT SPECIFIED|Clerk#000000556|0|ubt blithely accounts. quickl +22599|241|O|35380.04|1997-07-11|5-LOW|Clerk#000000153|0|of the regular, even excuses. fluffily unusual foxes across the regular de +22624|535|O|143297.12|1996-01-12|5-LOW|Clerk#000000556|0|fully silent requests acc +22625|8|F|151067.36|1994-10-01|4-NOT SPECIFIED|Clerk#000000233|0|ter the packages. slyly regular requests breach furiously. furiously ironic h +22626|659|F|165229.01|1993-06-30|1-URGENT|Clerk#000000941|0|ajole carefully alongside of the final, iron +22627|1021|F|193433.07|1993-04-04|5-LOW|Clerk#000000285|0|ake according to the slyly final accoun +22628|1219|F|170651.63|1994-10-30|3-MEDIUM|Clerk#000000416|0|counts affix blithely about the final foxes. slyly special dependencies hag +22629|595|F|211506.00|1993-04-16|5-LOW|Clerk#000000922|0|rding to the pending, bold pinto beans. carefully pendi +22630|239|F|123908.49|1994-01-21|2-HIGH|Clerk#000000053|0|nal, even theodolites. slyly pending deposits print furiously. e +22631|166|O|157664.91|1996-04-08|1-URGENT|Clerk#000000424|0|d accounts cajole fluffily: carefully special requests integrate according t +22656|778|F|31701.60|1993-12-23|4-NOT SPECIFIED|Clerk#000000040|0|ts boost. carefully pending asympto +22657|452|O|272131.47|1995-10-30|2-HIGH|Clerk#000000399|0|ithely final foxes integrate. stealthy, ir +22658|445|P|178987.32|1995-05-11|3-MEDIUM|Clerk#000000604|0|arefully slyly ironic ideas! carefully silent excuses after the f +22659|1435|O|113864.26|1998-06-26|5-LOW|Clerk#000000914|0|le blithely alongside of the slyl +22660|712|F|234876.33|1993-07-16|5-LOW|Clerk#000000168|0|sly pending requests mold +22661|247|F|88093.44|1993-09-27|4-NOT SPECIFIED|Clerk#000000929|0|fully final requests. bold accounts +22662|1408|O|188437.37|1998-06-01|5-LOW|Clerk#000000869|0|tes wake. unusual, ironic sauternes may nag +22663|1342|F|150056.99|1992-01-12|5-LOW|Clerk#000000147|0|onic requests. requests sle +22688|1375|F|135916.70|1992-04-18|3-MEDIUM|Clerk#000000347|0|side of the foxes. furiously final asymptotes according to the final d +22689|1448|O|157798.68|1995-10-10|5-LOW|Clerk#000000272|0|mptotes under the blithely regular accounts boost about the slyly fin +22690|961|F|208320.54|1992-09-28|5-LOW|Clerk#000000125|0|ress ideas boost permanently across the packages. carefully fi +22691|139|O|181813.13|1997-04-26|1-URGENT|Clerk#000000475|0|sual, thin accounts affix along the blithely qui +22692|1324|O|91666.41|1998-01-06|4-NOT SPECIFIED|Clerk#000000716|0|luffily even foxes shoul +22693|218|F|246087.75|1992-01-03|2-HIGH|Clerk#000000108|0|ggle carefully quic +22694|932|F|106840.78|1993-10-20|5-LOW|Clerk#000000703|0|bout the furiously ironic packages. blithel +22695|695|F|154909.44|1994-07-04|5-LOW|Clerk#000000918|0|pinto beans sleep c +22720|332|O|254097.34|1997-08-17|4-NOT SPECIFIED|Clerk#000000291|0| accounts haggle according to the express, regular ideas. ironic +22721|1211|O|90495.51|1996-11-20|1-URGENT|Clerk#000000565|0|n accounts. ideas despite the ironi +22722|644|F|289297.34|1992-07-01|1-URGENT|Clerk#000000360|0|ecial, ironic ideas nod blithely regu +22723|967|F|130261.27|1994-05-21|2-HIGH|Clerk#000000550|0|ers cajole blithely fin +22724|112|O|114306.28|1998-04-26|5-LOW|Clerk#000000786|0| furiously regular accounts wake alongside of the orbits. slyl +22725|1129|O|278508.16|1996-10-14|5-LOW|Clerk#000000514|0|gle fluffily above the final, regular requests. deposits run blithely +22726|838|F|40794.29|1992-04-30|2-HIGH|Clerk#000000097|0|nusual foxes print above the furiously ironic d +22727|868|O|89017.22|1995-07-04|4-NOT SPECIFIED|Clerk#000000394|0|s. final, ironic theodolites after the +22752|1324|F|334556.44|1992-12-08|5-LOW|Clerk#000000154|0|osits are above the quickly ironic instructions. slyly regular deposi +22753|277|F|82445.77|1995-03-18|1-URGENT|Clerk#000000315|0|mong the slyly idle requests. carefully even packages along the final, +22754|941|F|56807.12|1992-04-26|5-LOW|Clerk#000000457|0|uctions cajole after the slyly express braids. pendin +22755|1162|F|320945.79|1994-03-31|3-MEDIUM|Clerk#000000409|0|ites are slyly around the platelets. sl +22756|706|F|237321.74|1994-12-25|5-LOW|Clerk#000000462|0|ironic theodolites nag enticingly acr +22757|1225|F|115176.68|1994-03-20|5-LOW|Clerk#000000028|0| pinto beans could have to cajole furiousl +22758|22|F|115526.45|1994-03-31|4-NOT SPECIFIED|Clerk#000000514|0| regular excuses might wake care +22759|617|F|74091.38|1992-09-30|4-NOT SPECIFIED|Clerk#000000745|0|uses print regular excuses. carefully special depend +22784|346|O|118721.61|1995-05-25|5-LOW|Clerk#000000705|0|nd the even foxes. ironic r +22785|1381|F|77802.46|1993-10-27|2-HIGH|Clerk#000000267|0| could have to maintain furiously about the ironic frays. caref +22786|440|O|193535.28|1996-07-11|2-HIGH|Clerk#000000573|0|gle furiously quickly ironic accounts. slyly ironic instructi +22787|146|P|242832.12|1995-04-06|3-MEDIUM|Clerk#000000335|0|sts. fluffily bold deposits are carefully against +22788|749|O|71879.49|1998-05-22|3-MEDIUM|Clerk#000000427|0|onic instructions wake always ruthless packages. +22789|1016|O|65180.36|1996-01-27|5-LOW|Clerk#000000214|0|e above the carefully regular packages. ironically special f +22790|1051|O|267454.30|1998-03-22|4-NOT SPECIFIED|Clerk#000000265|0|ly express instructions solve carefu +22791|895|O|78023.83|1997-01-26|4-NOT SPECIFIED|Clerk#000000938|0|unusual, pending dependencies hang furi +22816|928|P|79105.00|1995-04-15|3-MEDIUM|Clerk#000000310|0|long the regularly even ins +22817|1153|F|139056.33|1992-11-22|1-URGENT|Clerk#000000194|0| excuses alongside of the slyly fluffy theodolites sleep carefu +22818|704|F|204731.27|1994-05-23|5-LOW|Clerk#000000707|0|pecial theodolites. slyly regular packages across the slyly final asymptot +22819|1210|F|234224.97|1992-11-11|2-HIGH|Clerk#000000179|0|haggle. carefully even packages nag carefully doggedly final asympto +22820|1489|F|166154.90|1993-08-18|2-HIGH|Clerk#000000123|0|luffily about the enticingly ironic hockey players. regular, regu +22821|1093|O|162972.00|1997-03-17|4-NOT SPECIFIED|Clerk#000000670|0|final excuses cajole despite the final warhors +22822|418|F|153391.46|1993-11-07|5-LOW|Clerk#000000814|0|y regular requests cajole furiously even requests. +22823|1177|O|13457.72|1997-02-12|3-MEDIUM|Clerk#000000329|0| evenly regular dolphins. stealthily e +22848|460|O|183005.48|1995-12-11|4-NOT SPECIFIED|Clerk#000000598|0|into beans around the quickly bold pinto beans cajole above the blithely +22849|574|F|223897.51|1995-02-15|4-NOT SPECIFIED|Clerk#000000068|0|y even instructions use fluffily pending ideas. asymptotes na +22850|40|F|208732.47|1995-05-01|3-MEDIUM|Clerk#000000343|0|s the daring, bold deposits. final packages sleep furiously. regul +22851|1102|F|186687.66|1994-03-02|1-URGENT|Clerk#000000823|0|ng the slyly bold deposits. blithely regular platelets print according to the +22852|73|O|72283.82|1997-03-29|5-LOW|Clerk#000000381|0|lthily ironic requests wake carefully silent foxes. as +22853|1387|F|44631.76|1994-03-28|3-MEDIUM|Clerk#000000013|0|e blithely accounts-- fluffily bold +22854|1102|O|188631.06|1996-08-28|4-NOT SPECIFIED|Clerk#000000085|0|press asymptotes use blithely quic +22855|776|O|60351.83|1997-07-27|4-NOT SPECIFIED|Clerk#000000536|0|kages cajole about the bli +22880|112|F|234910.51|1993-05-31|3-MEDIUM|Clerk#000000414|0|ar deposits sleep packages +22881|791|F|64656.19|1993-04-07|3-MEDIUM|Clerk#000000417|0|players mold furiously before the depths. +22882|820|F|88306.56|1993-09-14|1-URGENT|Clerk#000000264|0|rmanent packages. ironic, even t +22883|319|F|31915.78|1992-04-05|5-LOW|Clerk#000000776|0|old foxes. unusual accounts along the carefully unusual pains s +22884|952|O|30788.07|1996-05-14|3-MEDIUM|Clerk#000000516|0|efully final theodolites sleep furiously even ideas. sometimes pending account +22885|1115|F|177613.79|1994-11-24|3-MEDIUM|Clerk#000000420|0|en excuses above the accounts affix slyly acc +22886|214|F|234797.95|1993-01-30|5-LOW|Clerk#000000679|0|arefully ironic requests. ironic, busy the +22887|1483|F|156329.99|1993-11-19|4-NOT SPECIFIED|Clerk#000000614|0|eep carefully among the furiously pending frets. car +22912|1402|F|188831.36|1993-10-17|5-LOW|Clerk#000000565|0|even deposits haggle furiously. fluffily special +22913|883|F|338700.52|1993-06-26|1-URGENT|Clerk#000000517|0| platelets. bold, iro +22914|409|F|314596.18|1992-01-14|1-URGENT|Clerk#000000859|0|posits detect blithely +22915|553|O|83397.70|1997-09-20|3-MEDIUM|Clerk#000000786|0|egular packages. even braids wake carefully. always blithe +22916|460|F|20701.51|1992-02-03|3-MEDIUM|Clerk#000000822|0|ly against the foxes. ironic p +22917|157|F|156353.91|1994-03-02|3-MEDIUM|Clerk#000000684|0|inal accounts poach blithely slyly ironic ideas. account +22918|571|O|156512.68|1996-01-31|1-URGENT|Clerk#000000838|0|h quickly along the carefu +22919|748|F|32690.84|1994-07-18|1-URGENT|Clerk#000000079|0|fully bold deposits affix carefu +22944|1138|O|39707.53|1997-06-17|5-LOW|Clerk#000000771|0| furiously ironic requests int +22945|1433|P|247101.92|1995-03-30|3-MEDIUM|Clerk#000000609|0|tructions according to the furiously bo +22946|1141|F|204446.81|1994-01-09|3-MEDIUM|Clerk#000000477|0| ironic requests. furiously bold packages print fluffily above +22947|175|F|219727.70|1994-12-19|5-LOW|Clerk#000000208|0|cajole slyly across the slyly bold dependencies. as +22948|79|F|169245.35|1992-10-28|1-URGENT|Clerk#000000532|0|requests haggle carefully silent dolphins. ideas wake. fluffily ironi +22949|1489|O|153188.29|1998-06-10|5-LOW|Clerk#000000815|0|silent dolphins. foxes above t +22950|545|O|97555.92|1995-12-22|5-LOW|Clerk#000000793|0|ounts integrate carefully bold requests. unusual accounts +22951|1216|F|18611.58|1992-05-04|3-MEDIUM|Clerk#000000607|0| requests. furiously unusual packages are blith +22976|1477|O|166276.41|1998-03-14|2-HIGH|Clerk#000000746|0|dependencies integrate fluffily. slyly pending ideas breach care +22977|608|O|1318.66|1995-09-07|2-HIGH|Clerk#000000389|0|olites; slyly bold deposits alongside of the carefully final requests +22978|325|F|115752.26|1994-04-03|3-MEDIUM|Clerk#000000777|0|sly deposits. requests use furiously express, regular pinto +22979|1475|F|102608.08|1992-09-26|1-URGENT|Clerk#000000701|0|the slyly express accounts +22980|1094|F|130146.07|1992-10-02|4-NOT SPECIFIED|Clerk#000000997|0|slyly express instruction +22981|187|O|89105.74|1995-05-27|5-LOW|Clerk#000000227|0| cajole furiously regular packages. furiously careful instructions af +22982|212|O|230974.42|1995-12-29|5-LOW|Clerk#000000189|0|sts alongside of the special deposits wake toward the quickly regular foxe +22983|1348|F|31542.37|1994-11-26|2-HIGH|Clerk#000000281|0|slyly after the furiously pending accoun +23008|1399|F|313498.30|1994-10-10|1-URGENT|Clerk#000000142|0|inal accounts kindle about the careful +23009|1270|F|119814.21|1992-04-27|5-LOW|Clerk#000000352|0|y requests. slyly ironic pinto beans detect ruthlessly regular +23010|913|F|120608.69|1992-01-01|2-HIGH|Clerk#000000831|0|e. furiously special accounts boost slyly even platelets. regular ideas sleep +23011|7|F|353727.96|1993-06-16|5-LOW|Clerk#000000032|0|r packages eat blithely at +23012|1477|O|154831.70|1996-08-18|1-URGENT|Clerk#000000926|0|ly silent accounts. slyly reg +23013|236|F|193441.80|1993-06-29|2-HIGH|Clerk#000000702|0|l instructions impress above the slyly silen +23014|511|O|42290.17|1995-10-18|4-NOT SPECIFIED|Clerk#000000017|0|ake across the busily bold pinto beans. even warhorses nag. +23015|782|F|109383.43|1992-01-12|3-MEDIUM|Clerk#000000142|0|es. regular, final packages haggle slyly under the +23040|1357|O|118484.41|1997-07-30|2-HIGH|Clerk#000000865|0|atelets cajole slyly ironic, regular deposits. bli +23041|880|F|223697.93|1993-07-21|5-LOW|Clerk#000000789|0|beans. furiously ironic accounts eat carefully pending deposits. caref +23042|919|F|39576.36|1994-04-27|3-MEDIUM|Clerk#000000247|0|ly bold packages impress slyly. da +23043|94|P|115889.56|1995-05-02|3-MEDIUM|Clerk#000000813|0|special frets sleep slyly carefully unusu +23044|1360|O|248621.34|1996-10-22|3-MEDIUM|Clerk#000000401|0|ays regular theodolites; blithely bol +23045|355|O|61294.15|1996-03-11|1-URGENT|Clerk#000000538|0|r excuses. slyly final theodolites about the pending packages nag fluffi +23046|1282|F|267940.35|1993-10-07|1-URGENT|Clerk#000000390|0|solve quickly deposits. carefully ironic instruc +23047|460|O|185656.76|1996-05-14|1-URGENT|Clerk#000000010|0|uests use carefully according to the acco +23072|404|O|89681.43|1996-09-19|5-LOW|Clerk#000000182|0|fully bold requests sleep qu +23073|1261|F|329353.08|1993-03-29|1-URGENT|Clerk#000000067|0|uffily. carefully unusual theodolites for the unu +23074|1070|O|98379.64|1998-06-17|1-URGENT|Clerk#000000941|0|s. slyly regular ideas detect furiously aga +23075|278|F|37988.65|1994-05-08|2-HIGH|Clerk#000000589|0|ructions according to the dogged, even r +23076|338|F|222874.78|1994-05-28|1-URGENT|Clerk#000000914|0|heodolites affix always. regular, express excuses cajole carefully. pl +23077|1342|O|132412.30|1998-02-27|4-NOT SPECIFIED|Clerk#000000093|0|ages sleep along the furiously bold pinto beans. carefully express the +23078|170|O|155759.20|1995-09-16|3-MEDIUM|Clerk#000000461|0|ter the slyly final requests. r +23079|931|O|124695.37|1997-02-09|1-URGENT|Clerk#000000504|0|ording to the regular, regular theodolites. fluffily un +23104|313|P|133326.25|1995-04-10|3-MEDIUM|Clerk#000000558|0|l packages haggle blithely quickly ironic platelets. blithely ironic theodoli +23105|682|F|103936.88|1994-10-15|2-HIGH|Clerk#000000326|0| furiously foxes. quickly final deposits kindle at the ironic +23106|1474|F|181231.14|1993-10-21|3-MEDIUM|Clerk#000000793|0|oxes sleep quickly. requests haggle. even dolphins u +23107|344|O|62661.19|1995-06-12|3-MEDIUM|Clerk#000000623|0|thely ironic accounts. quick +23108|1042|O|151747.73|1998-04-15|1-URGENT|Clerk#000000416|0|into beans boost among the +23109|640|O|85856.98|1997-05-06|5-LOW|Clerk#000000592|0|onic, final Tiresias: silently pending instructions about the +23110|364|O|144339.69|1996-10-03|5-LOW|Clerk#000000333|0|eodolites. furiously regular deposit +23111|94|F|197878.57|1992-04-27|4-NOT SPECIFIED|Clerk#000000226|0|cial accounts cajole quickly. blithely pending deposits cajole furiously dec +23136|1172|F|125873.42|1994-09-26|4-NOT SPECIFIED|Clerk#000000335|0|ly. regular, ironic atta +23137|956|F|42597.56|1992-11-12|5-LOW|Clerk#000000760|0|er the pending deposits. furiously silent instruc +23138|838|O|175063.45|1997-07-23|1-URGENT|Clerk#000000253|0|uctions integrate carefully regular pinto beans. silent accounts wake bli +23139|958|P|114693.84|1995-05-10|2-HIGH|Clerk#000000853|0|ias. requests haggle fluffily. slyly busy epitaphs after +23140|424|F|279533.76|1992-02-09|2-HIGH|Clerk#000000761|0|thes above the regul +23141|46|O|93371.10|1997-08-09|5-LOW|Clerk#000000938|0|egularly express courts sl +23142|22|O|146888.04|1996-05-27|3-MEDIUM|Clerk#000000759|0|ts use. blithely express theodolites det +23143|806|O|28536.68|1996-10-07|3-MEDIUM|Clerk#000000970|0|ve along the stealthily ironic platelets. regular, ironic asymp +23168|35|F|326036.51|1993-09-16|5-LOW|Clerk#000000567|0|. blithely regular packages doubt thinly according to the f +23169|530|O|233688.82|1995-06-24|1-URGENT|Clerk#000000937|0| quickly pending foxes detect carefully. unusual pint +23170|1075|F|258713.58|1994-05-22|4-NOT SPECIFIED|Clerk#000000781|0|riously. regular packages alongside of the fl +23171|550|O|126076.97|1996-06-25|3-MEDIUM|Clerk#000000314|0|y regular deposits. specia +23172|652|F|63675.60|1992-04-25|5-LOW|Clerk#000000959|0|e furiously against the slyly dogged accounts. blithely even acc +23173|1453|O|284884.99|1998-06-13|1-URGENT|Clerk#000000027|0|lets. deposits cajole closely above the slyly e +23174|1490|F|221605.85|1992-07-27|5-LOW|Clerk#000000336|0|slyly fluffily slow packages! final excuses impress blithe +23175|430|O|33817.42|1996-02-25|4-NOT SPECIFIED|Clerk#000000217|0|ly furiously ironic foxes. quickly final ideas use fluffily bold deposits +23200|331|O|214529.66|1996-11-03|1-URGENT|Clerk#000000215|0|nusual packages nag accord +23201|214|O|138522.91|1996-12-18|2-HIGH|Clerk#000000233|0|en theodolites. blithely silent deposits haggle blithely above th +23202|202|O|207559.83|1995-07-31|2-HIGH|Clerk#000000964|0| requests. regular deposits up the special foxes mold furio +23203|703|O|186087.57|1997-10-17|4-NOT SPECIFIED|Clerk#000000164|0|ets boost. slyly regular platelets are slyl +23204|1420|O|70965.15|1997-03-16|1-URGENT|Clerk#000000876|0|s about the dependencies integrate blithely bold, bold foxes. silent reques +23205|1474|F|247982.46|1994-05-25|2-HIGH|Clerk#000000092|0|g accounts wake blithely among the bold +23206|46|O|62933.43|1996-12-27|2-HIGH|Clerk#000000839|0| asymptotes integrate slyly among the unusual requests. +23207|202|F|186062.38|1993-10-23|1-URGENT|Clerk#000000179|0| haggle; fluffily regular courts nag. even accounts use fluffily during +23232|382|F|272384.73|1993-04-17|2-HIGH|Clerk#000000832|0|le regular pinto beans. slyly careful courts about the ideas poach caref +23233|1460|F|50444.92|1994-02-20|1-URGENT|Clerk#000000917|0| furiously slyly ironic packages. regul +23234|842|F|28072.32|1993-07-28|4-NOT SPECIFIED|Clerk#000000520|0|cuses are furiously about the special packages. regular de +23235|208|O|227396.79|1995-07-06|2-HIGH|Clerk#000000385|0|pinto beans. fluffily ironic deposits wake furiously. deposi +23236|1423|O|40237.26|1998-04-25|3-MEDIUM|Clerk#000000549|0|haggle slyly. furiousl +23237|983|O|258532.28|1996-01-12|2-HIGH|Clerk#000000662|0|le-- blithely even foxes along the +23238|1345|F|281878.46|1993-04-01|4-NOT SPECIFIED|Clerk#000000339|0|ckages wake blithely regular requests. deposits are bl +23239|1324|O|224117.01|1997-03-14|3-MEDIUM|Clerk#000000125|0|atelets. pending excuses according to the slyly ex +23264|67|F|197635.24|1993-12-08|1-URGENT|Clerk#000000764|0| furiously ironic dep +23265|1336|O|196354.01|1996-03-31|5-LOW|Clerk#000000695|0|ng accounts sleep blithely. slyly silent decoys use blith +23266|443|F|64044.17|1995-02-17|3-MEDIUM|Clerk#000000911|0|fily dogged dolphins sleep theodolites. furiousl +23267|82|O|240703.99|1996-06-27|3-MEDIUM|Clerk#000000819|0|d to maintain fluffily. regularly regular accounts cajole +23268|601|F|118628.31|1992-01-17|2-HIGH|Clerk#000000538|0|d platelets. fluffily regular pinto beans among +23269|1181|O|250711.63|1998-02-16|2-HIGH|Clerk#000000265|0|counts maintain carefully blithely even deposits. final sentiments sleep. fox +23270|634|F|240038.63|1995-03-14|5-LOW|Clerk#000000199|0|ously unusual ideas x- +23271|860|F|111604.20|1993-11-04|2-HIGH|Clerk#000000064|0|nts. final platelets sleep fluffily against the fluffily enticing exc +23296|1312|O|257680.00|1997-10-11|3-MEDIUM|Clerk#000000341|0|aggle furiously; request +23297|761|F|289814.74|1992-07-03|1-URGENT|Clerk#000000345|0|ackages across the slyly final requests wake slyly regular patterns. ir +23298|214|F|206172.50|1994-11-12|5-LOW|Clerk#000000681|0|counts. quickly silent requests cajole carefully slyly busy d +23299|1192|F|28410.25|1992-08-13|3-MEDIUM|Clerk#000000909|0| across the carefully express +23300|976|O|138178.82|1996-02-07|5-LOW|Clerk#000000987|0|beans hang quickly among the final i +23301|1037|O|117369.09|1995-04-19|2-HIGH|Clerk#000000737|0|jole carefully about the final packages. +23302|283|O|202254.02|1996-02-26|5-LOW|Clerk#000000504|0| ironic instructions sleep slyly. quickly final packages affix furiou +23303|761|F|65279.64|1994-06-21|4-NOT SPECIFIED|Clerk#000000132|0|y regular deposits nod. evenly even foxes integrate fluffily +23328|658|F|56624.49|1993-09-16|2-HIGH|Clerk#000000157|0|t waters haggle furiously. fin +23329|1381|F|239104.78|1993-12-27|5-LOW|Clerk#000000073|0|usly unusual packages. special instructions at th +23330|61|F|159754.94|1993-12-13|2-HIGH|Clerk#000000511|0|sleep furiously above the car +23331|1118|F|97128.21|1993-08-24|4-NOT SPECIFIED|Clerk#000000016|0| packages about the specia +23332|1399|F|130795.56|1993-04-03|3-MEDIUM|Clerk#000000609|0|eposits kindle slyly. brave foxes cajole +23333|1225|F|180960.18|1994-08-06|3-MEDIUM|Clerk#000000095|0|cording to the furiou +23334|1444|F|31094.06|1992-01-09|3-MEDIUM|Clerk#000000732|0|l pinto beans haggle +23335|262|F|144153.04|1994-02-26|5-LOW|Clerk#000000759|0| instructions. special account +23360|842|F|60961.48|1994-05-12|5-LOW|Clerk#000000664|0|es. furiously unusual deposits are acr +23361|245|F|121133.65|1993-07-04|1-URGENT|Clerk#000000824|0|to the slyly ironic instructions. silent foxes use furiously. blithely even +23362|1441|F|107874.19|1993-08-28|3-MEDIUM|Clerk#000000022|0|uests. regular, express asymptotes detect. furiously sly d +23363|905|F|170879.33|1992-05-30|5-LOW|Clerk#000000980|0|uickly according to the even, ironic foxes. even accounts alongsid +23364|1342|O|288397.45|1998-03-07|4-NOT SPECIFIED|Clerk#000000148|0|across the ironic fo +23365|493|O|33531.66|1998-03-13|1-URGENT|Clerk#000000987|0|deposits. even excuses a +23366|280|F|113881.92|1993-11-20|4-NOT SPECIFIED|Clerk#000000383|0|en packages engage blithely pinto beans. special instructions affix +23367|986|O|135326.91|1995-07-01|2-HIGH|Clerk#000000176|0|ickly bold requests +23392|1049|F|169794.46|1994-08-17|3-MEDIUM|Clerk#000000675|0|ilent decoys boost carefully about the slyly final requests. final sautern +23393|487|F|172840.81|1992-08-23|1-URGENT|Clerk#000000487|0| above the express, final deposits. requests against the slyly special acco +23394|596|F|171351.38|1993-04-30|2-HIGH|Clerk#000000358|0| among the regular asymptotes. carefully ironic ideas run. even p +23395|1247|F|66643.74|1992-10-28|3-MEDIUM|Clerk#000000338|0|nal deposits integrate above the carefully bold foxes. slyly even r +23396|278|F|254515.42|1993-06-19|5-LOW|Clerk#000000770|0|nag doggedly final requests? fluffily unusual dependencies integrate. bold, i +23397|617|O|152784.73|1998-07-16|5-LOW|Clerk#000000678|0|ding pinto beans integrate fluffil +23398|722|F|284241.11|1994-03-14|3-MEDIUM|Clerk#000000353|0|s alongside of the e +23399|1093|F|76091.40|1993-12-30|2-HIGH|Clerk#000000453|0|l accounts cajole a +23424|67|F|35545.90|1993-04-15|1-URGENT|Clerk#000000632|0|according to the slyly regular foxes. express theodolites boost slyly alway +23425|1336|O|51374.19|1998-06-30|4-NOT SPECIFIED|Clerk#000000463|0|usly express pinto beans across th +23426|496|F|185090.75|1995-02-17|1-URGENT|Clerk#000000556|0|xes along the pending requests are furiously about th +23427|491|O|113294.95|1995-08-09|5-LOW|Clerk#000000677|0|dly. quickly express packages are quickly. final instructions wake blithe +23428|883|F|305191.08|1992-10-29|2-HIGH|Clerk#000000823|0|requests sleep blithely. quickly silent requests use carefully +23429|1183|F|221081.87|1994-03-20|1-URGENT|Clerk#000000380|0|. special deposits wake ironic, ironic a +23430|934|O|168663.91|1997-01-02|5-LOW|Clerk#000000865|0|ers. express theodolites boost carefully slyly unusual +23431|1078|O|88287.32|1995-06-12|1-URGENT|Clerk#000000877|0|sleep quickly slyly bold sentiments. express depos +23456|1132|O|347596.48|1997-06-23|2-HIGH|Clerk#000000306|0|longside of the carefully express foxes haggle +23457|950|O|222681.38|1997-05-31|5-LOW|Clerk#000000260|0| dolphins dazzle carefully quickly exp +23458|844|F|34071.62|1994-01-18|3-MEDIUM|Clerk#000000908|0|ronic dependencies. carefully even deposits nag blithely around the dol +23459|302|F|141418.09|1993-08-16|4-NOT SPECIFIED|Clerk#000000959|0|serve furiously according to the theodolites. slyly bold +23460|1141|F|129468.42|1992-11-11|2-HIGH|Clerk#000000331|0| even accounts print blithely blithely ironic pi +23461|1222|O|6352.62|1998-04-05|3-MEDIUM|Clerk#000000029|0|ets wake. regular pinto beans cajole. fluffily silent excuses mold furiously a +23462|1316|O|90765.40|1996-08-31|5-LOW|Clerk#000000369|0|ts mold carefully final requests +23463|463|O|57261.41|1997-04-12|4-NOT SPECIFIED|Clerk#000000960|0|posits after the accounts need to cajole fluffily af +23488|416|F|177248.64|1994-01-07|2-HIGH|Clerk#000000611|0|y finally silent realms. ruthlessly unusual instruc +23489|1456|F|83908.19|1992-08-29|2-HIGH|Clerk#000000296|0|packages wake carefully carefully silent packages. sl +23490|1456|O|42717.75|1998-02-26|4-NOT SPECIFIED|Clerk#000000790|0|ly special dolphins wake above the slyly +23491|943|F|110089.84|1992-11-05|3-MEDIUM|Clerk#000000644|0|osits. carefully regular deposits after the slyly final instruc +23492|1243|O|253984.67|1997-09-11|5-LOW|Clerk#000000603|0|sly against the ironic requests. e +23493|1001|F|52291.00|1994-09-20|5-LOW|Clerk#000000903|0|ackages wake slyly according to the slyly final accounts. slyly regular ideas +23494|1318|O|154237.88|1997-08-26|5-LOW|Clerk#000000307|0|eas nag slyly about +23495|1333|F|149790.70|1993-07-12|2-HIGH|Clerk#000000396|0|ironic theodolites. slyly final excuses engag +23520|754|O|135711.87|1996-07-24|4-NOT SPECIFIED|Clerk#000000908|0|ng to the special, final ideas. bl +23521|1475|O|81695.18|1998-03-17|2-HIGH|Clerk#000000399|0|oach. slyly final accounts cajole unusual +23522|181|P|205252.87|1995-04-12|1-URGENT|Clerk#000000894|0|regular instructions. ironic dependencies are slyly even, ex +23523|1096|O|331176.66|1998-05-15|4-NOT SPECIFIED|Clerk#000000971|0|permanent requests within the idly special accounts cajole blithely +23524|1360|F|136117.61|1994-04-29|2-HIGH|Clerk#000000191|0| bold accounts along the regular, silent +23525|1009|O|165831.15|1996-12-02|3-MEDIUM|Clerk#000000913|0|final ideas against the ideas wake qui +23526|395|O|112614.35|1998-05-22|5-LOW|Clerk#000000901|0|nic ideas. furiously final dinos b +23527|1303|O|15505.09|1997-07-19|4-NOT SPECIFIED|Clerk#000000241|0|express, regular platelets are according to the +23552|1018|O|118836.44|1998-01-19|5-LOW|Clerk#000000889|0|, special instructions mold regular foxes. slyly regular asymptotes ma +23553|685|O|178160.61|1998-05-13|3-MEDIUM|Clerk#000000391|0|luffily express deposits use carefully. express, regular package +23554|544|O|133203.07|1996-12-04|1-URGENT|Clerk#000000278|0|ly ironic dependencies. fluffily permanent courts are sl +23555|1469|F|312432.71|1992-12-12|2-HIGH|Clerk#000000517|0|regular packages wa +23556|739|F|58004.85|1995-01-10|3-MEDIUM|Clerk#000000848|0|lites. even ideas are along th +23557|1144|O|270691.39|1995-06-01|4-NOT SPECIFIED|Clerk#000000132|0|uriously final theodol +23558|103|O|304634.36|1995-08-10|5-LOW|Clerk#000000922|0|le slyly about the slyly enticing instructions. express, final packages aga +23559|1495|F|186274.13|1993-07-19|5-LOW|Clerk#000000588|0|ounts haggle furiously against the slyly pending ideas. ideas ab +23584|1135|F|146357.04|1992-03-13|1-URGENT|Clerk#000000880|0|dogged ideas. carefully unusual deposits c +23585|136|F|193339.65|1992-11-01|1-URGENT|Clerk#000000358|0|ts; fluffily final platelet +23586|772|F|200744.74|1993-01-15|3-MEDIUM|Clerk#000000702|0|rding to the quickly unusual packages. slyly ironic dependencies among +23587|1262|F|96918.93|1992-05-11|1-URGENT|Clerk#000000838|0|oss the slyly pending requests. fluffily ironic accounts +23588|892|O|7023.24|1996-10-28|2-HIGH|Clerk#000000976|0| carefully furiously u +23589|943|O|92660.44|1998-04-15|4-NOT SPECIFIED|Clerk#000000415|0|its. fluffily final realms kindle slyly along the s +23590|106|O|107044.32|1996-01-08|4-NOT SPECIFIED|Clerk#000000068|0|l, ironic accounts +23591|23|O|93265.36|1997-04-13|3-MEDIUM|Clerk#000000721|0|er the even instructions! ironic, regular sautern +23616|1381|F|172319.71|1992-08-29|4-NOT SPECIFIED|Clerk#000000960|0|s wake blithely quickly ironic excuses. bl +23617|346|P|250151.60|1995-05-06|4-NOT SPECIFIED|Clerk#000000892|0|uriously final, regular ideas. carefully regular ideas alo +23618|88|F|26339.65|1992-11-28|3-MEDIUM|Clerk#000000401|0|st the packages sleep slyly +23619|1445|F|178126.15|1992-12-22|3-MEDIUM|Clerk#000000269|0|s. slyly ironic sentiments af +23620|65|O|123878.95|1998-07-22|4-NOT SPECIFIED|Clerk#000000498|0|nts haggle carefully. final packages about the slyly +23621|788|O|208490.01|1996-12-29|3-MEDIUM|Clerk#000000945|0|refully across the slyly regular requests. busily ironic deposits slee +23622|1037|F|189861.73|1994-04-10|3-MEDIUM|Clerk#000000143|0|carefully brave pinto beans. slyly even ideas haggle carefully final ins +23623|1210|O|110351.11|1997-01-07|1-URGENT|Clerk#000000570|0|furiously according to the final packages. final, bold orbits are blithe +23648|869|F|218001.93|1992-09-25|1-URGENT|Clerk#000000972|0|ironic, final theodolites. quickly even pinto be +23649|1142|F|284114.11|1992-09-06|4-NOT SPECIFIED|Clerk#000000144|0|unusual packages. furiously regular theodolites thrash. final f +23650|962|O|39719.28|1996-12-21|4-NOT SPECIFIED|Clerk#000000932|0|atelets cajole pending deposits +23651|1229|O|152091.04|1997-11-16|4-NOT SPECIFIED|Clerk#000000514|0|dencies. fluffily ironic requests about the s +23652|820|F|80326.62|1994-08-31|4-NOT SPECIFIED|Clerk#000000043|0|lly silent foxes wake abo +23653|125|O|139016.11|1996-10-14|3-MEDIUM|Clerk#000000599|0|carefully silent pinto beans wake r +23654|437|O|311722.88|1996-10-06|5-LOW|Clerk#000000676|0|he bold, blithe ideas. quickly final +23655|695|O|201365.26|1996-09-17|2-HIGH|Clerk#000000501|0|ly regular theodolites use regular, even packages. ironic +23680|808|F|55766.70|1993-11-07|4-NOT SPECIFIED|Clerk#000000568|0| engage quickly. unusual deposits use slyly express ideas? specia +23681|1444|F|43671.58|1992-05-20|2-HIGH|Clerk#000000620|0|ely silent patterns after the regular accounts +23682|901|O|49453.23|1998-03-08|4-NOT SPECIFIED|Clerk#000000430|0|ounts around the final accou +23683|466|O|38018.92|1996-09-19|5-LOW|Clerk#000000752|0|the excuses. quickly bold requests haggle slyly. unusual a +23684|970|O|334476.43|1998-02-27|4-NOT SPECIFIED|Clerk#000000255|0|egrate among the furiously pending accounts. furiously express asymptotes +23685|1271|F|301293.87|1992-06-30|4-NOT SPECIFIED|Clerk#000000952|0|yly along the realms. furiously final theodolites believe quick +23686|536|O|145931.23|1996-12-01|5-LOW|Clerk#000000089|0|nusual asymptotes above the fina +23687|784|O|47627.55|1996-11-15|4-NOT SPECIFIED|Clerk#000000619|0|usual excuses are blithely even platelets. id +23712|667|F|30275.66|1993-08-26|4-NOT SPECIFIED|Clerk#000000434|0|slyly final packages among the carefully special ideas nag blithely +23713|433|F|127773.31|1992-11-29|4-NOT SPECIFIED|Clerk#000000477|0|ainst the carefully express deposits. unusual, express accounts nag +23714|1445|O|69784.41|1996-04-06|1-URGENT|Clerk#000000061|0|ites haggle carefully. +23715|715|O|62186.21|1997-06-17|1-URGENT|Clerk#000000515|0|ests cajole slyly. daring, express courts are slyly pinto beans: quickl +23716|946|O|239583.40|1997-03-10|4-NOT SPECIFIED|Clerk#000000294|0|equests. ironic accounts dazzle carefully. slyly even requests detect ca +23717|754|F|79889.09|1993-11-17|3-MEDIUM|Clerk#000000751|0|ests. slyly quiet foxes wak +23718|415|F|155946.01|1994-01-23|5-LOW|Clerk#000000291|0| foxes. fluffily daring requests along the slyly pending deposits haggle furio +23719|73|F|137508.93|1993-07-26|1-URGENT|Clerk#000000381|0|sly regular instructions. blithely special deposits boost +23744|463|O|200481.15|1998-02-09|5-LOW|Clerk#000000296|0|ts haggle carefully across th +23745|1351|F|248166.91|1992-12-06|5-LOW|Clerk#000000266|0|ss, careful theodolites above the +23746|136|F|140842.22|1993-12-16|2-HIGH|Clerk#000000883|0|ar, pending deposits haggle fluffily. final theo +23747|347|O|129939.09|1998-05-12|2-HIGH|Clerk#000000284|0|nts after the regular excuses are +23748|859|F|20839.20|1992-08-11|2-HIGH|Clerk#000000647|0|uests dazzle carefully even packages. final escapades above the unusu +23749|1345|O|157914.46|1997-01-24|3-MEDIUM|Clerk#000000779|0| deposits affix slyly against the blithely regular platelets. caref +23750|1144|F|84349.86|1992-08-18|2-HIGH|Clerk#000000213|0|ing deposits. dogged, regular foxes use slyly? finally special p +23751|1039|F|99825.81|1994-03-19|3-MEDIUM|Clerk#000000142|0|efully fluffy instructions doubt furio +23776|1450|F|74547.62|1992-08-09|5-LOW|Clerk#000000204|0|ly furiously ironic instructions. blithely final packages +23777|301|F|124113.40|1992-11-27|4-NOT SPECIFIED|Clerk#000000297|0|ully after the packages. slyly busy deposits nag carefully. thinly unu +23778|1067|F|158171.72|1994-07-14|5-LOW|Clerk#000000975|0|es. busily ironic deposits integrate furiously-- blithely ironic accounts +23779|601|O|272828.38|1998-07-01|5-LOW|Clerk#000000987|0|ructions around the regular sau +23780|1483|O|46315.58|1997-04-04|2-HIGH|Clerk#000000797|0| cajole blithely about the regular +23781|463|O|65904.03|1995-11-01|1-URGENT|Clerk#000000603|0|unusual platelets are fluffily. fluffily ironic theod +23782|808|F|168591.99|1993-01-11|5-LOW|Clerk#000000824|0|ounts. slyly ironic pinto beans believ +23783|1465|O|20584.36|1995-04-17|4-NOT SPECIFIED|Clerk#000000647|0| blithely regular ideas afte +23808|1331|F|136842.86|1994-02-08|5-LOW|Clerk#000000364|0| fluffily special theodolites sleep slyly. even +23809|1223|F|296716.41|1992-06-05|4-NOT SPECIFIED|Clerk#000000736|0|s. carefully regular accounts wake. express fo +23810|1477|F|16317.90|1993-04-25|1-URGENT|Clerk#000000439|0| slowly carefully pending requests. furiously fi +23811|1451|O|137127.93|1997-05-21|4-NOT SPECIFIED|Clerk#000000295|0|detect quickly. slyly even deposits around the furiously final deposits sl +23812|1313|F|175504.84|1992-07-28|1-URGENT|Clerk#000000887|0|cajole furiously among the bold accoun +23813|811|O|76437.10|1997-06-18|2-HIGH|Clerk#000000174|0|ding deposits cajole slyly about the furiously pending instructions. +23814|79|O|313011.92|1998-04-05|5-LOW|Clerk#000000704|0|lphins. ironic pinto beans a +23815|635|O|78006.93|1997-01-31|3-MEDIUM|Clerk#000000581|0|its serve carefully. blithely unusual requests doze furiously quickly re +23840|1063|F|69955.63|1994-04-05|4-NOT SPECIFIED|Clerk#000000518|0|ncies are. carefully even courts wake quickly about t +23841|232|F|75646.27|1992-08-19|2-HIGH|Clerk#000000599|0|ffily unusual packages sublate quietly about the e +23842|1135|F|251888.58|1993-09-18|5-LOW|Clerk#000000858|0|uests doze carefully. quickl +23843|1466|O|60000.23|1996-05-15|1-URGENT|Clerk#000000243|0|boost. ironic account +23844|656|F|180698.80|1994-07-07|4-NOT SPECIFIED|Clerk#000000684|0|accounts are asymptotes. ironic, regular asymptotes wake slyly acro +23845|1336|O|80870.89|1997-06-05|1-URGENT|Clerk#000000912|0|theodolites. final, regular requests alongside of the fluffily regular ide +23846|155|O|118885.15|1997-08-20|4-NOT SPECIFIED|Clerk#000000058|0|s. furiously thin requests sleep blithely. carefully bold instr +23847|805|F|29548.16|1992-11-10|4-NOT SPECIFIED|Clerk#000000960|0|eful accounts sleep blithely furiously fi +23872|1399|O|66849.30|1996-10-18|2-HIGH|Clerk#000000693|0|efully ironic accounts detect flu +23873|418|F|49344.91|1994-11-19|3-MEDIUM|Clerk#000000877|0|uests. blithely special deposi +23874|386|F|34224.30|1993-08-20|5-LOW|Clerk#000000370|0|quickly bold notornis wake fluffily. even platelets doubt. even +23875|1393|O|80263.89|1995-12-02|4-NOT SPECIFIED|Clerk#000000416|0|y regular deposits. furiously express instructions sleep aro +23876|725|F|108562.39|1992-09-30|3-MEDIUM|Clerk#000000444|0|r asymptotes-- requests affix pinto beans. bli +23877|986|F|329975.17|1994-07-13|4-NOT SPECIFIED|Clerk#000000700|0|ntegrate carefully express plate +23878|865|O|136707.80|1996-11-21|4-NOT SPECIFIED|Clerk#000000027|0|r deposits affix. pinto beans across the furiously express dep +23879|260|O|212823.01|1998-07-22|3-MEDIUM|Clerk#000000950|0|dependencies! quickly quiet platelets haggle carefull +23904|340|O|117632.96|1996-11-11|4-NOT SPECIFIED|Clerk#000000529|0|s sleep across the regular, regular frays. ironic +23905|1198|O|57696.50|1997-10-05|5-LOW|Clerk#000000953|0|l deposits. silent courts along the bli +23906|1258|F|74923.03|1993-09-21|1-URGENT|Clerk#000000936|0|aring, express packages. quickly unusual courts maintain. blithely ir +23907|281|O|103982.48|1995-07-15|4-NOT SPECIFIED|Clerk#000000028|0|itaphs above the regular dolphins are final deposits. slyly pe +23908|1336|O|254970.20|1997-04-25|3-MEDIUM|Clerk#000000479|0|w furiously. slyly regular ideas cajole slyly dogged pint +23909|493|O|103031.04|1997-01-16|4-NOT SPECIFIED|Clerk#000000396|0|foxes alongside of the final, unusual foxes sleep slyly regu +23910|722|O|40586.61|1996-05-20|4-NOT SPECIFIED|Clerk#000000350|0|hely bold theodolites boost +23911|319|F|202099.82|1992-06-02|1-URGENT|Clerk#000000479|0|counts breach furiously according to the unusual ideas. reg +23936|1402|F|301048.56|1994-12-18|3-MEDIUM|Clerk#000000727|0|uctions. foxes dazzle regular, final deposits. sl +23937|1004|O|103970.33|1997-03-21|1-URGENT|Clerk#000000500|0|structions wake slyly along the furi +23938|1169|O|134626.31|1996-12-06|3-MEDIUM|Clerk#000000540|0|t packages nod quickly silent pinto beans. furiously special depos +23939|1471|O|46234.48|1998-04-01|5-LOW|Clerk#000000664|0|aggle furiously near the regular deposits. furiously regular reque +23940|1025|F|108580.72|1995-04-09|3-MEDIUM|Clerk#000000659|0| ideas sleep furiously among t +23941|181|O|171983.15|1996-06-25|4-NOT SPECIFIED|Clerk#000000578|0|s. furiously regular accounts nag furiously fluffily regular instructi +23942|883|F|39841.47|1992-12-13|3-MEDIUM|Clerk#000000841|0|kages haggle quietly about the even +23943|1360|O|372934.56|1995-06-24|1-URGENT|Clerk#000000932|0|fter the express asymptotes. special accounts about the +23968|533|P|320180.69|1995-03-05|1-URGENT|Clerk#000000017|0|carefully bold hockey players sleep carefully. excuses haggle f +23969|455|O|181046.95|1997-08-12|3-MEDIUM|Clerk#000000783|0|final theodolites. furiously even requests detect quickly. quickly speci +23970|277|O|178495.03|1998-04-03|3-MEDIUM|Clerk#000000099|0|s requests cajole carefully blithely express sheaves. permanent, express dec +23971|925|F|53858.20|1994-11-22|1-URGENT|Clerk#000000195|0|iously final instructions +23972|1036|F|163362.30|1993-08-17|4-NOT SPECIFIED|Clerk#000001000|0|s. blithely final packages sleep quickly idle pearls. even, bold +23973|352|O|132983.61|1996-07-14|4-NOT SPECIFIED|Clerk#000000860|0|bold deposits? final, ironic packages are evenly across the ironic foxes. even +23974|763|F|177140.87|1992-07-25|3-MEDIUM|Clerk#000000552|0|eas. furiously even excuses around the quickly unusual de +23975|841|O|30037.59|1997-03-24|4-NOT SPECIFIED|Clerk#000000530|0|arefully final theodolites sleep fluffily requests. +24000|754|O|2008.30|1995-07-09|2-HIGH|Clerk#000000222|0|ongside of the blithely ironic pinto beans. +24001|637|O|22522.97|1997-05-25|1-URGENT|Clerk#000000074|0|y ironic requests haggle blithely final pinto beans +24002|1292|O|112271.88|1996-11-07|3-MEDIUM|Clerk#000000339|0|packages boost. slyly r +24003|487|F|161598.85|1994-11-01|1-URGENT|Clerk#000000221|0|ily regular pinto beans use slyly. furiously even a +24004|856|F|262360.95|1992-06-15|4-NOT SPECIFIED|Clerk#000000207|0|ounts boost furiously across the blithel +24005|602|F|147332.47|1992-01-13|1-URGENT|Clerk#000000359|0|s across the special, regular packages believe with the slyly regular +24006|1210|O|206121.81|1996-10-12|1-URGENT|Clerk#000000414|0|its are. deposits maintain carefully. slyly regular instructions above +24007|581|F|166436.04|1993-08-27|5-LOW|Clerk#000000948|0| frays are blithely express theodolites. fluffily bold do +24032|112|O|96997.49|1997-08-23|2-HIGH|Clerk#000000629|0|lieve busily along the furiously even theodolites. furio +24033|856|F|76431.70|1995-01-03|2-HIGH|Clerk#000000415|0|ending pinto beans according to the pending, pendi +24034|784|O|189077.69|1996-12-31|4-NOT SPECIFIED|Clerk#000000412|0|ructions are furiously near the blithe +24035|506|P|143809.29|1995-03-25|4-NOT SPECIFIED|Clerk#000000705|0|haggle carefully furiously regular accounts. blithely express deposits cajole +24036|989|O|165908.47|1995-06-20|2-HIGH|Clerk#000000267|0|nto beans. furiously final f +24037|425|O|87106.53|1996-10-01|3-MEDIUM|Clerk#000000229|0|hockey players after the special epitaphs dete +24038|973|O|123460.18|1995-06-21|2-HIGH|Clerk#000000622|0|s. furiously even packages cajole; carefully ironi +24039|1189|F|119446.14|1992-07-18|4-NOT SPECIFIED|Clerk#000000799|0|r foxes. unusual dolphins are f +24064|35|F|150777.45|1993-07-26|3-MEDIUM|Clerk#000000020|0|ithely final foxes. furiously final instructi +24065|799|O|150337.65|1997-03-13|4-NOT SPECIFIED|Clerk#000000012|0|thely alongside of the ironic, even asymptotes. regular waters los +24066|397|F|182046.63|1992-04-14|2-HIGH|Clerk#000000411|0|ly regular requests? furiously unusual i +24067|745|F|248388.97|1992-08-23|2-HIGH|Clerk#000000872|0|en platelets integrate carefully fluffily special packages. carefully +24068|647|O|271907.67|1998-03-31|5-LOW|Clerk#000000708|0|oach carefully blithely busy +24069|28|F|49812.58|1993-07-17|5-LOW|Clerk#000000407|0|s. regular deposits along the slyly bold deposits haggle furiously ab +24070|1229|F|109864.17|1995-03-16|2-HIGH|Clerk#000000746|0|leep fluffily special requests. slyly pending theodolites haggle carefull +24071|256|F|72389.81|1992-04-02|4-NOT SPECIFIED|Clerk#000000568|0| quickly unusual packages; carefully bold ideas imp +24096|604|F|2161.02|1995-03-01|2-HIGH|Clerk#000000267|0|uriously final excuses; eve +24097|1258|F|197500.16|1993-08-05|2-HIGH|Clerk#000000315|0|ly. special pinto beans about the blithely ironic requests sleep slyly a +24098|670|F|165894.59|1992-04-18|1-URGENT|Clerk#000000371|0|tes affix fluffily express, pending requests. slyly final accounts haggl +24099|1361|P|184201.31|1995-05-21|4-NOT SPECIFIED|Clerk#000000073|0|bout the slyly careful packages. spec +24100|1351|O|46718.94|1995-03-26|4-NOT SPECIFIED|Clerk#000000717|0|ggle slyly pending accounts. expre +24101|1286|F|120004.92|1992-04-14|2-HIGH|Clerk#000000111|0|use never ironic ideas? furiously silent foxes +24102|1270|F|217427.18|1993-12-01|1-URGENT|Clerk#000000131|0|elets. slyly regular ideas among the carefully final courts are furiously iro +24103|868|F|309860.54|1994-09-14|3-MEDIUM|Clerk#000000582|0|ously permanent packages +24128|845|F|112844.08|1993-11-24|2-HIGH|Clerk#000000130|0| quickly. pinto beans according to the furiously ironic +24129|482|O|21978.00|1995-07-08|4-NOT SPECIFIED|Clerk#000000264|0|ic, final pinto beans might haggle careful +24130|358|O|160930.47|1995-07-11|1-URGENT|Clerk#000000945|0|unusual pinto beans. exp +24131|641|O|104510.71|1996-07-03|4-NOT SPECIFIED|Clerk#000000970|0|ding orbits. furiously even ex +24132|550|F|199312.74|1994-07-07|5-LOW|Clerk#000000187|0| ideas sleep. fluffily even deposits sleep furiously blithely unusual gifts. +24133|1225|O|84853.18|1996-07-09|1-URGENT|Clerk#000000050|0|usly bold requests. accounts snooze across the blith +24134|1184|O|101862.46|1998-05-18|5-LOW|Clerk#000000107|0| special dolphins promise fluffily slyly fi +24135|946|F|193417.56|1993-01-23|5-LOW|Clerk#000000565|0|s-- carefully bold requests whithout the +24160|787|F|58856.27|1995-02-02|3-MEDIUM|Clerk#000000831|0|its wake against the carefully even deposits. quickly qui +24161|130|F|66836.17|1994-08-07|3-MEDIUM|Clerk#000000241|0|ely. furiously regular requests nag carefully permanen +24162|1087|F|353202.95|1994-08-23|4-NOT SPECIFIED|Clerk#000000617|0|s in place of the furiously bold packages sleep fluffil +24163|700|O|184150.94|1998-03-23|4-NOT SPECIFIED|Clerk#000000119|0|gle. carefully regular accounts use +24164|73|O|198491.16|1998-05-31|4-NOT SPECIFIED|Clerk#000000529|0|olites mold furiously slyly final foxes! slyly unusual accounts haggle d +24165|187|F|147874.35|1994-12-14|3-MEDIUM|Clerk#000000244|0|e carefully. furiously ironic instructions against the ironic theodolites pr +24166|265|F|127564.85|1992-08-09|3-MEDIUM|Clerk#000000546|0| packages wake slyly: furiously regular hockey players affi +24167|1036|F|141781.97|1992-01-03|5-LOW|Clerk#000000622|0|s wake. blithely even instructions nag furiously carefully ironic foxes. +24192|575|O|266986.70|1998-03-02|2-HIGH|Clerk#000000247|0|thely. regular somas detect across the quickly final depths. regular +24193|235|F|299874.52|1994-03-15|4-NOT SPECIFIED|Clerk#000000398|0|ag furiously regular req +24194|365|O|4070.26|1995-09-28|5-LOW|Clerk#000000944|0|st blithely after the special, ironic pains. slyly even package +24195|1198|O|198763.84|1996-09-19|2-HIGH|Clerk#000000471|0|ironic platelets. furiously special theodolites are during the blithely +24196|244|F|108755.85|1993-07-31|2-HIGH|Clerk#000000488|0|nic foxes use bravely. bold deposits sleep sly +24197|52|F|169033.08|1993-02-04|5-LOW|Clerk#000000758|0|ts wake blithely slyly final asymptotes. blithely ironic +24198|391|F|261190.99|1995-02-09|4-NOT SPECIFIED|Clerk#000000469|0|y ironic braids. even packages nag carefully. slyly fina +24199|976|F|64059.34|1994-06-17|1-URGENT|Clerk#000000263|0|uriously final dependencies. blithely ironi +24224|1474|O|126700.33|1997-09-08|5-LOW|Clerk#000000621|0| unusual accounts detect. quickly unusual courts haggle. slyly regular accou +24225|1117|O|67525.05|1996-04-21|5-LOW|Clerk#000000989|0|ole slyly final packages. slyly regular excu +24226|364|O|175932.10|1997-01-19|3-MEDIUM|Clerk#000000574|0|ely silent platelets s +24227|1420|F|125438.57|1993-08-17|3-MEDIUM|Clerk#000000158|0|ccounts sleep slyly according to the regular accounts. regular +24228|1322|F|100761.10|1994-07-18|5-LOW|Clerk#000000849|0| bold packages haggle quickly express foxes. regular deposits cajole blithely +24229|1058|O|276864.48|1996-08-30|3-MEDIUM|Clerk#000000963|0|gside of the pinto beans. requests nag c +24230|1156|O|220373.80|1996-10-09|5-LOW|Clerk#000000324|0|stealthy pinto beans detect. furiously +24231|722|F|267041.67|1994-08-08|4-NOT SPECIFIED|Clerk#000000188|0|sly final sentiments serve blithely. slyly unusual +24256|712|O|62519.05|1997-03-25|1-URGENT|Clerk#000000570|0|n dolphins haggle quickl +24257|1247|F|117458.78|1992-08-10|4-NOT SPECIFIED|Clerk#000000869|0|o the bold packages wake after the furiously ironic accoun +24258|1384|O|346279.77|1996-04-22|4-NOT SPECIFIED|Clerk#000000622|0|ccording to the carefully unusual ideas. permanently final dolphins hinder +24259|727|O|102861.77|1996-05-25|2-HIGH|Clerk#000000888|0|e the carefully bold accounts. daring foxes haggle unusual asymptote +24260|154|F|194431.92|1993-10-04|4-NOT SPECIFIED|Clerk#000000985|0|ckages wake after the unusual, bold theo +24261|181|F|24077.48|1992-09-18|1-URGENT|Clerk#000000637|0|lar platelets boost blithely. carefully special accounts +24262|1411|F|149159.84|1994-01-24|2-HIGH|Clerk#000000968|0|ctions was slyly above the o +24263|1457|F|32267.01|1992-09-16|5-LOW|Clerk#000000204|0|ely silent asymptotes. slyly express requests are blithely b +24288|322|F|146720.64|1993-03-01|1-URGENT|Clerk#000000568|0|inal instructions. silent, regular a +24289|1315|O|114311.50|1997-07-02|5-LOW|Clerk#000000467|0|ndencies sleep slyly: i +24290|1351|F|77074.94|1992-01-19|4-NOT SPECIFIED|Clerk#000000279|0|ckly? slyly ironic accounts integr +24291|1160|F|186506.22|1992-04-25|4-NOT SPECIFIED|Clerk#000000556|0|ironic, final foxes wake. furiously regular deposits along the even p +24292|488|F|236293.44|1994-03-09|1-URGENT|Clerk#000000044|0| instructions boost blithely slyly even de +24293|104|O|4129.76|1997-03-26|4-NOT SPECIFIED|Clerk#000000509|0|uickly above the slyly regular courts. furiously express accou +24294|925|F|197246.24|1994-08-03|4-NOT SPECIFIED|Clerk#000000903|0|s over the furiously unusual instructions haggle around the fluff +24295|466|O|25692.07|1998-02-19|1-URGENT|Clerk#000000230|0| enticingly quiet requ +24320|382|F|94583.37|1993-12-31|4-NOT SPECIFIED|Clerk#000000314|0| above the fluffily ironic foxes. slyly ironic theodolites cajole fu +24321|68|F|188235.82|1994-11-05|2-HIGH|Clerk#000000676|0|ave to are furiously alongside of the carefully ir +24322|1|O|231040.44|1997-01-29|1-URGENT|Clerk#000000100|0|regular deposits cajole slyly. ironic t +24323|257|O|186595.05|1997-06-06|3-MEDIUM|Clerk#000000455|0|egular requests use. quickly even excuses grow? pending excu +24324|209|F|61059.83|1993-06-09|1-URGENT|Clerk#000000167|0|silent, regular dolphins wake slyl +24325|1414|O|151992.11|1996-08-02|1-URGENT|Clerk#000000600|0| furious packages boo +24326|232|O|255159.23|1995-09-30|1-URGENT|Clerk#000000250|0| deposits among the furiously enticing deposits integrate furiously fur +24327|440|O|55527.39|1996-02-08|3-MEDIUM|Clerk#000000519|0|structions around the packages haggle slyl +24352|1468|F|183303.39|1993-05-11|1-URGENT|Clerk#000000728|0|quickly carefully unusual platelets. regu +24353|1160|O|99937.55|1996-05-24|5-LOW|Clerk#000000047|0| the asymptotes. fluffily even ideas ar +24354|1201|O|264563.23|1998-01-08|1-URGENT|Clerk#000000844|0|ding to the final packages. slyly e +24355|1072|O|190235.85|1997-07-06|5-LOW|Clerk#000000252|0|ously after the quickly even deposits. carefully regular ideas b +24356|812|F|52353.30|1993-05-12|3-MEDIUM|Clerk#000000492|0|furiously regular realms. dogged, express courts kindle. escapad +24357|434|O|151521.74|1996-01-30|1-URGENT|Clerk#000000406|0|eposits. never ironic deposits accor +24358|1085|F|180858.27|1994-05-17|1-URGENT|Clerk#000000501|0|ut the pinto beans. boldly pending r +24359|1042|O|211135.84|1998-03-11|3-MEDIUM|Clerk#000000542|0|etect quietly silently +24384|151|P|289851.78|1995-03-27|3-MEDIUM|Clerk#000000046|0|ing to the carefully final theodolites cajole final +24385|1279|F|225343.87|1993-01-23|1-URGENT|Clerk#000000017|0|s. final pinto beans against the pending dolphins hang slyly across the final +24386|860|F|209145.61|1992-06-27|2-HIGH|Clerk#000000333|0|ts haggle blithely. quickly express instructions sleep fur +24387|995|O|172930.20|1995-08-11|1-URGENT|Clerk#000000091|0|ounts. regular, regular requests engage +24388|286|F|85970.26|1995-01-27|1-URGENT|Clerk#000000146|0| ironic accounts sleep quic +24389|406|O|51144.38|1998-01-25|3-MEDIUM|Clerk#000000809|0|bold, pending deposits boost +24390|709|F|195797.79|1992-06-07|5-LOW|Clerk#000000307|0| wake blithely. pendin +24391|82|F|187692.78|1994-03-07|5-LOW|Clerk#000000555|0| above the never bold requests. special accounts wake blit +24416|4|O|184512.04|1996-10-18|5-LOW|Clerk#000000672|0|nts are after the blithely eve +24417|752|O|224785.59|1998-06-26|4-NOT SPECIFIED|Clerk#000000964|0| beans! slyly silent accounts are furio +24418|1367|F|144304.96|1992-08-23|3-MEDIUM|Clerk#000000652|0|tions. slyly final accou +24419|199|O|270127.56|1998-07-21|5-LOW|Clerk#000000254|0|reful foxes thrash evenly around the requests. +24420|956|F|218975.17|1992-05-17|2-HIGH|Clerk#000000187|0|eas run quickly. quickly ironic deposits nag fluffily. furiously final +24421|1192|O|27457.03|1997-07-09|2-HIGH|Clerk#000000863|0|e slyly express packages. quickly stealthy accounts haggle qu +24422|233|O|118415.06|1995-12-30|1-URGENT|Clerk#000000785|0|ns. final patterns haggle regularly! even packages use. pac +24423|1051|O|37642.97|1998-01-21|2-HIGH|Clerk#000000748|0|structions solve above the fluffily final accounts-- ironic, +24448|1367|F|179763.12|1992-02-07|2-HIGH|Clerk#000000896|0|mold fluffily according to the +24449|520|O|157440.02|1997-06-20|3-MEDIUM|Clerk#000000379|0| final pearls nag. ironic deposits detect after the accou +24450|320|F|298830.92|1992-07-10|1-URGENT|Clerk#000000858|0|dolites between the quickly bold theodolites use daring instructions. c +24451|25|F|70375.62|1992-12-04|1-URGENT|Clerk#000000079|0|ld foxes affix above +24452|1364|F|62266.62|1994-05-08|2-HIGH|Clerk#000000732|0|nto the blithely fluffy courts. furious +24453|508|F|47717.72|1992-05-21|2-HIGH|Clerk#000000695|0|symptotes. slyly quiet platelets cajole fr +24454|878|F|77284.69|1994-04-13|3-MEDIUM|Clerk#000000701|0|ously final pinto beans detect quickly furiously special +24455|988|F|161934.00|1994-12-07|4-NOT SPECIFIED|Clerk#000000339|0|inder regular pinto beans. fluffily ironic +24480|275|F|47092.86|1994-03-05|2-HIGH|Clerk#000000856|0|uriously. pending ideas sleep furiously fluffil +24481|725|O|81346.28|1995-12-02|3-MEDIUM|Clerk#000000632|0|arefully quiet theodolites are quickly! blithely express pinto beans cajole ab +24482|1124|O|15789.29|1995-12-10|2-HIGH|Clerk#000000774|0| the furiously regular requests haggle a +24483|677|O|179278.59|1996-03-31|3-MEDIUM|Clerk#000000903|0|he fluffily bold accounts. requests haggle among the slyly pending packa +24484|958|F|254244.13|1995-01-12|3-MEDIUM|Clerk#000000297|0|the carefully special pinto beans. furiously ex +24485|232|F|7685.97|1994-04-27|5-LOW|Clerk#000000065|0|s. quickly final deposits haggle slyly regular reques +24486|727|P|235827.59|1995-04-23|3-MEDIUM|Clerk#000000345|0|es. carefully express ideas +24487|832|F|48808.69|1992-02-17|4-NOT SPECIFIED|Clerk#000000166|0|ons boost quickly about the +24512|346|O|123293.97|1995-08-26|3-MEDIUM|Clerk#000000475|0|ns. deposits sleep blithely regular depende +24513|1370|O|36298.21|1998-01-15|1-URGENT|Clerk#000000012|0|ironic ideas cajole blithely furiously regular foxes. +24514|88|O|89336.76|1995-11-09|4-NOT SPECIFIED|Clerk#000000233|0| furiously express foxes cajole across the p +24515|1483|F|299861.33|1993-05-07|1-URGENT|Clerk#000000042|0|sts wake slyly. fluffily bold packages are carefully. instructions a +24516|535|F|78986.47|1993-10-11|2-HIGH|Clerk#000000891|0|gouts use. regular package +24517|280|F|39791.86|1994-06-09|4-NOT SPECIFIED|Clerk#000000267|0|p carefully ironic packages. always express frays integrate caref +24518|1118|O|117862.04|1997-09-24|5-LOW|Clerk#000000445|0|aggle above the quickly +24519|952|O|266550.91|1995-06-12|1-URGENT|Clerk#000000982|0| sleep furiously? fluffily express ideas are ironic esca +24544|193|F|189411.48|1994-01-27|2-HIGH|Clerk#000000812|0|s requests promise furiously after the special pinto b +24545|1171|O|249977.68|1996-06-22|5-LOW|Clerk#000000131|0| cajole regularly slyly final accounts. thinly ev +24546|331|F|275451.23|1992-03-27|1-URGENT|Clerk#000000401|0|ate blithely daring requests. slyly final asymptotes integrate. carefull +24547|820|O|55893.99|1997-07-19|4-NOT SPECIFIED|Clerk#000000520|0| somas. busy, unusual accounts haggle fluffily. careful +24548|1294|F|18638.98|1995-03-15|2-HIGH|Clerk#000000108|0|even deposits. ideas wake fluffily express, express accounts. unusua +24549|727|O|83476.46|1997-03-23|4-NOT SPECIFIED|Clerk#000000462|0|lyly unusual accounts nag blithely carefully regular asymptotes. accounts are. +24550|1136|O|150617.49|1996-10-24|1-URGENT|Clerk#000000978|0|even accounts sleep +24551|1295|O|332472.53|1997-01-07|5-LOW|Clerk#000000867|0|ions. slyly pending accoun +24576|164|F|128616.15|1992-12-12|4-NOT SPECIFIED|Clerk#000000208|0|cross the final, regular accounts slee +24577|1139|F|115629.77|1993-03-02|3-MEDIUM|Clerk#000000491|0|nooze fluffily alongside of the quickly pend +24578|544|O|68186.91|1996-09-30|2-HIGH|Clerk#000000660|0|uriously even requests. regular accounts hag +24579|877|F|242138.55|1992-11-19|2-HIGH|Clerk#000000460|0|r theodolites. blithely final ideas haggle quickly. never ironic depende +24580|1415|F|65003.05|1992-06-24|2-HIGH|Clerk#000000538|0|ording to the bold, final deposi +24581|1144|F|91452.54|1993-04-10|2-HIGH|Clerk#000000803|0|c accounts are slyly fluffily bold ideas. packages w +24582|913|O|208109.69|1996-07-01|1-URGENT|Clerk#000000118|0|cies. final deposits are furiously theodolites. s +24583|1288|O|59281.30|1995-08-10|1-URGENT|Clerk#000000115|0|s. final ideas serve again +24608|29|F|161783.79|1992-08-15|3-MEDIUM|Clerk#000000320|0| to the enticing, final ideas. regular instructions boost ironic fox +24609|7|F|151012.65|1994-08-10|2-HIGH|Clerk#000000176|0|e regular excuses. excuse +24610|955|F|301207.03|1993-01-19|4-NOT SPECIFIED|Clerk#000000859|0| the asymptotes. theodolites sleep furiously special re +24611|584|O|257766.61|1998-06-15|1-URGENT|Clerk#000000170|0|xcuses x-ray slyly furio +24612|181|F|58587.39|1994-06-14|5-LOW|Clerk#000000777|0|ter the permanently ironi +24613|1048|F|251169.56|1992-07-17|5-LOW|Clerk#000000555|0|ven requests sublate carefully regular, express dolphins +24614|724|F|24852.16|1994-11-22|5-LOW|Clerk#000000256|0|ptotes sleep deposits. quickly express theodolites alongside of the stea +24615|1444|F|119010.65|1993-08-13|1-URGENT|Clerk#000000332|0|re furiously. slyly unusual deposits haggle fluffily r +24640|419|F|207700.55|1995-01-30|3-MEDIUM|Clerk#000000184|0|yly bold, unusual packages. final deposits detect furiously. regu +24641|235|O|142841.10|1996-03-14|5-LOW|Clerk#000000131|0|ges affix blithely among the even somas. pearls believe carefully fluffi +24642|494|O|141379.21|1996-10-19|1-URGENT|Clerk#000000397|0|y permanent deposits solve slyly above the fluffily final idea +24643|230|F|42609.02|1992-04-30|3-MEDIUM|Clerk#000000498|0|equests. ironic epitaphs nag fluffily. blithely +24644|256|F|74607.88|1994-07-29|1-URGENT|Clerk#000000248|0|arefully alongside of the silent pinto beans. quickly fi +24645|532|F|49774.90|1994-11-20|3-MEDIUM|Clerk#000000017|0| even instructions. ironic requests above the carefully +24646|1142|P|158826.92|1995-04-16|4-NOT SPECIFIED|Clerk#000000185|0|packages dazzle blithely. unusual deposits detect fluffily to +24647|1072|F|172558.66|1994-06-05|4-NOT SPECIFIED|Clerk#000000193|0|carefully among the furiously unusual requests. furiously close pack +24672|826|F|272325.49|1992-03-18|3-MEDIUM|Clerk#000000794|0|the deposits. bold pinto beans sleep slyly. id +24673|196|O|83138.61|1997-06-21|3-MEDIUM|Clerk#000000127|0|efully even accounts. furio +24674|91|O|120739.49|1996-05-15|2-HIGH|Clerk#000000449|0|nag slyly along the quickly special accounts. quickly silent court +24675|512|F|36515.94|1994-05-28|3-MEDIUM|Clerk#000000725|0|usual instructions haggle furi +24676|199|F|12938.26|1994-04-01|5-LOW|Clerk#000000860|0|iously regular dependencies. +24677|101|F|45755.28|1992-03-06|5-LOW|Clerk#000000139|0|eans wake along the excu +24678|17|O|148704.59|1997-07-27|3-MEDIUM|Clerk#000000049|0|le. blithely bold platelets are. blithe +24679|170|P|259867.81|1995-05-08|4-NOT SPECIFIED|Clerk#000000472|0|ss gifts. deposits across the quickl +24704|1208|F|37423.39|1994-10-31|4-NOT SPECIFIED|Clerk#000000042|0|onic requests. furiously unu +24705|536|O|136660.50|1995-09-16|1-URGENT|Clerk#000000443|0|e quickly even platelets kindle at the ironic, bold requests. furiously r +24706|58|F|29716.40|1992-04-24|2-HIGH|Clerk#000000559|0|tect blithely. carefully express packages use-- blithely even dep +24707|1421|F|121224.43|1992-03-11|3-MEDIUM|Clerk#000000878|0| forges. even excuses doubt. ironic deposits solve blithely; bold p +24708|733|F|46158.50|1992-12-05|4-NOT SPECIFIED|Clerk#000000315|0|nic deposits haggle against the carefully express platelets. reg +24709|479|F|14623.67|1995-01-16|2-HIGH|Clerk#000000935|0|g to the carefully special instructions. quickly final acco +24710|1001|F|56548.72|1993-10-01|5-LOW|Clerk#000000859|0|gainst the furiously final accounts. never ironic deposits wake amo +24711|769|F|201644.14|1992-10-28|2-HIGH|Clerk#000000341|0|latelets. slyly ironic dependenc +24736|149|O|297907.56|1998-01-15|2-HIGH|Clerk#000000390|0|riously. even requests hinder furiously unusual deposits. slyly ironic p +24737|218|F|236347.29|1994-12-07|2-HIGH|Clerk#000000916|0|stealthy pinto beans! blithely regular courts haggle carefully slyly i +24738|1067|F|58891.52|1993-11-13|3-MEDIUM|Clerk#000000416|0|ial accounts. ironic +24739|44|O|126749.91|1996-05-25|4-NOT SPECIFIED|Clerk#000000585|0|l requests haggle. final, final frays hang slyly final pinto beans: unusu +24740|1432|F|60242.92|1993-01-11|3-MEDIUM|Clerk#000000205|0|tes haggle slyly after the sometimes +24741|1147|O|85394.39|1996-11-11|1-URGENT|Clerk#000000576|0|slyly ironic deposits cajole carefully close sauternes. carefully final foxes +24742|1330|F|67055.37|1995-04-09|1-URGENT|Clerk#000000322|0|posits. packages try to sleep bu +24743|89|F|83971.36|1992-06-29|5-LOW|Clerk#000000201|0|y. accounts across the carefully ironic accounts hagg +24768|1001|O|97110.39|1998-05-09|3-MEDIUM|Clerk#000000492|0| even requests detect +24769|1276|O|241665.37|1995-11-25|3-MEDIUM|Clerk#000000518|0|sly bold decoys. even instructions a +24770|1438|F|58221.07|1992-03-25|1-URGENT|Clerk#000000909|0|furiously regular platelets. slyly ironic packages play. sl +24771|85|O|185952.99|1996-04-09|5-LOW|Clerk#000000497|0|s haggle permanently blithely pending instructions. quickly final accounts +24772|700|O|14088.57|1996-06-28|5-LOW|Clerk#000000937|0|g to the even deposits integrate slyly ironically ironic deposits. furiousl +24773|841|O|96318.85|1998-04-24|5-LOW|Clerk#000000776|0| ironic foxes. slyly regular packages across the qui +24774|1231|O|77982.71|1997-05-20|2-HIGH|Clerk#000000382|0|e finally silent packages detect carefully final inst +24775|607|F|50020.13|1992-02-18|1-URGENT|Clerk#000000701|0|ess asymptotes. careful +24800|1084|O|244698.14|1998-04-15|3-MEDIUM|Clerk#000000199|0|xes impress slyly after th +24801|1138|F|76078.40|1992-11-16|2-HIGH|Clerk#000000929|0| quickly express theod +24802|256|F|84226.32|1994-01-24|3-MEDIUM|Clerk#000000677|0|indle. close, ironic +24803|1381|O|102333.43|1997-02-25|4-NOT SPECIFIED|Clerk#000000925|0|ven braids. slyly pending foxes are bl +24804|1498|O|110276.95|1995-05-28|4-NOT SPECIFIED|Clerk#000000648|0|uickly alongside of the express forges. fluffily final excuses according to t +24805|590|F|105390.57|1994-11-04|3-MEDIUM|Clerk#000000884|0|es! brave accounts nag above the slyly quiet accounts. carefully re +24806|625|F|64511.87|1993-09-07|4-NOT SPECIFIED|Clerk#000000426|0|sleep slowly across the epitaphs. carefully even foxes arou +24807|1306|O|13344.82|1996-04-02|5-LOW|Clerk#000000188|0|ncies cajole fluffily. slyly final depo +24832|379|O|386334.55|1997-03-19|2-HIGH|Clerk#000000279|0|l packages? carefully unusual theodolites +24833|1376|F|156838.81|1993-07-17|4-NOT SPECIFIED|Clerk#000000250|0|according to the carefully expre +24834|391|F|35349.50|1994-06-19|2-HIGH|Clerk#000000542|0|pinto beans wake furiously alongside of the even +24835|464|O|86231.81|1998-02-02|2-HIGH|Clerk#000000183|0|he fluffily even dependencies. quick +24836|386|O|227542.53|1998-05-26|2-HIGH|Clerk#000000442|0|st quickly even pinto beans. instructions nag acros +24837|469|O|196175.57|1997-04-15|5-LOW|Clerk#000000216|0| carefully regular packages. ideas run slyly according t +24838|599|O|249823.34|1997-06-20|2-HIGH|Clerk#000000013|0|gular packages. silent, unusual packages integrate carefull +24839|767|O|264550.46|1998-07-19|3-MEDIUM|Clerk#000000435|0|instructions. regular, unusual instructions are carefully grouches. carefull +24864|400|F|154307.14|1992-01-16|1-URGENT|Clerk#000000199|0|t deposits. ironic excus +24865|497|F|220181.87|1992-03-20|2-HIGH|Clerk#000000599|0|s. blithely regular dolphins integrate slyly against the slyly pending deposit +24866|737|F|162258.66|1993-12-05|4-NOT SPECIFIED|Clerk#000000941|0|ajole blithely slyly final deposits. furiously regul +24867|856|F|12641.80|1994-02-01|2-HIGH|Clerk#000000211|0|g foxes haggle. furiously even re +24868|241|F|193326.87|1992-05-27|2-HIGH|Clerk#000000892|0| instructions cajole. furiously bold requests serve +24869|319|F|229144.28|1994-06-11|4-NOT SPECIFIED|Clerk#000000854|0|fily slyly regular platelets. u +24870|862|F|86742.06|1994-04-25|5-LOW|Clerk#000000621|0|nusual, regular ideas. quickly slow requests hinder among th +24871|236|P|326576.48|1995-03-24|3-MEDIUM|Clerk#000000347|0|usual packages haggle. sometimes ironic deposits boost fluffily. even instr +24896|490|F|108701.72|1993-02-19|3-MEDIUM|Clerk#000000943|0|final foxes haggle carefully against the blithely final epitaphs. bold grouc +24897|110|O|111959.02|1998-02-06|3-MEDIUM|Clerk#000000823|0|ording to the slyly even pack +24898|1187|O|220221.83|1997-01-20|5-LOW|Clerk#000000399|0|bout the regularly regular deposits? ironic, unusual accounts promise. fu +24899|715|O|235398.02|1995-08-21|4-NOT SPECIFIED|Clerk#000000874|0|se carefully about the idly regular theodolites. slyly even package +24900|200|O|289213.34|1996-08-05|1-URGENT|Clerk#000000578|0|slyly even requests haggle slyly above the special deposits. ironic instruc +24901|367|O|135859.62|1996-08-31|5-LOW|Clerk#000000114|0| blithely regular, bold pinto beans. regu +24902|709|F|220592.00|1993-05-27|2-HIGH|Clerk#000000557|0|inal instructions integrate quickly special, permanent r +24903|1258|F|310652.81|1993-10-20|5-LOW|Clerk#000000120|0|g the even dolphins boost quickly sly ideas. quickly final ep +24928|1153|O|28273.54|1996-04-15|4-NOT SPECIFIED|Clerk#000000039|0| even frays sleep against the busily regular accounts. platelets +24929|316|O|96283.19|1996-10-01|4-NOT SPECIFIED|Clerk#000000121|0| requests alongside of the slyly silent packages affix blithely abou +24930|502|O|148609.19|1998-04-18|2-HIGH|Clerk#000000095|0|ep furiously foxes. express, regular theo +24931|1189|O|325132.77|1995-11-08|5-LOW|Clerk#000000060|0|cial foxes sleep fluffily along the unusual, +24932|932|O|66201.87|1996-02-25|1-URGENT|Clerk#000000562|0|y unusual requests cajole carefully carefully +24933|269|F|165997.33|1994-07-27|5-LOW|Clerk#000000770|0|efully slyly final packages. sl +24934|635|F|11569.89|1995-01-31|2-HIGH|Clerk#000000901|0|uriously ironic accounts wake furiously. furi +24935|1300|O|43331.41|1998-07-24|3-MEDIUM|Clerk#000000120|0|uickly unusual ideas haggle fluffily unusual +24960|371|F|299406.40|1995-01-28|2-HIGH|Clerk#000000402|0|ggle carefully from the carefully pen +24961|1175|F|30499.54|1993-01-27|5-LOW|Clerk#000000965|0|s. ruthlessly regular +24962|199|O|129824.29|1998-02-09|1-URGENT|Clerk#000000372|0|lyly across the furiously express request +24963|1145|O|228247.51|1995-12-24|4-NOT SPECIFIED|Clerk#000000914|0|lithely even packages are quickly after the quickly regu +24964|31|F|167234.03|1994-12-30|5-LOW|Clerk#000000182|0|ng packages after the daring, +24965|394|P|206568.65|1995-03-30|5-LOW|Clerk#000000071|0|st the blithely regular packages. sl +24966|1481|O|198977.51|1995-12-18|3-MEDIUM|Clerk#000000675|0|nic foxes above the ironic deposits boost slyly along the +24967|298|O|129415.47|1997-03-14|4-NOT SPECIFIED|Clerk#000000118|0|y slyly even ideas? quiet, pending grouches hi +24992|866|O|150377.92|1998-03-24|3-MEDIUM|Clerk#000000052|0|cally special deposits cajole sl +24993|532|F|136144.20|1993-03-12|2-HIGH|Clerk#000000475|0|egular platelets cajole blithely fur +24994|1189|O|88503.67|1998-06-25|5-LOW|Clerk#000000741|0|yly. Tiresias sleep among t +24995|647|O|67902.95|1997-11-27|5-LOW|Clerk#000000881|0|e blithely enticing requests. fluffily bold requests use bl +24996|1031|O|269181.24|1995-09-26|1-URGENT|Clerk#000000110|0|l deposits. carefully ironic +24997|938|O|174879.52|1998-07-19|4-NOT SPECIFIED|Clerk#000000848|0|, stealthy instructions. stealthily regular accounts cajole furiously +24998|653|O|132572.66|1996-07-19|3-MEDIUM|Clerk#000000719|0|as sleep slyly special dolphins. even platelets use slyly along the final +24999|559|O|40039.22|1997-03-28|4-NOT SPECIFIED|Clerk#000000966|0|ss deposits after the silent, regular deposits sleep quickl +25024|631|O|20117.35|1997-07-05|5-LOW|Clerk#000000014|0| ironic deposits-- stealthily pending +25025|1336|O|18285.28|1996-09-24|3-MEDIUM|Clerk#000000952|0|ly even dependencies. pending depo +25026|1342|O|149345.57|1996-09-01|1-URGENT|Clerk#000000930|0|quickly above the furious +25027|73|F|166484.33|1994-12-17|3-MEDIUM|Clerk#000000156|0| quickly furious, silent dependencies. idle +25028|436|F|157847.93|1995-01-06|1-URGENT|Clerk#000000346|0|s slyly silent theodolit +25029|1376|O|69416.93|1997-11-15|2-HIGH|Clerk#000000284|0|ar foxes. blithely even e +25030|1024|O|62230.79|1998-07-15|1-URGENT|Clerk#000000172|0|theodolites hang quickly furiously regular packages. regularly pend +25031|1411|F|174269.18|1994-08-24|2-HIGH|Clerk#000000677|0|eposits nag quickly regular instructions +25056|367|F|107345.62|1993-09-22|4-NOT SPECIFIED|Clerk#000000286|0|t have to wake carefully. fluffily regular ideas are slyly a +25057|319|O|17181.32|1998-05-01|1-URGENT|Clerk#000000830|0| across the instructions. regular pinto beans integrate fluff +25058|739|P|63449.96|1995-05-07|5-LOW|Clerk#000000230|0|rhorses among the regular theodolites haggle beside the bold accounts. +25059|311|O|9272.98|1997-11-16|4-NOT SPECIFIED|Clerk#000000744|0|hely even deposits. furiously ironi +25060|625|F|199377.41|1994-07-21|4-NOT SPECIFIED|Clerk#000000844|0|ding requests. furio +25061|952|O|187634.96|1995-12-19|3-MEDIUM|Clerk#000000200|0| cajole ironic, final pinto b +25062|772|F|101660.52|1993-10-31|1-URGENT|Clerk#000000084|0|onic ideas are ironic, ironic accounts. i +25063|209|F|37911.97|1994-06-30|4-NOT SPECIFIED|Clerk#000000170|0|eat enticingly entici +25088|739|O|160430.44|1998-06-20|2-HIGH|Clerk#000000907|0|al pinto beans use blithely. slyly p +25089|640|O|89653.76|1998-07-30|2-HIGH|Clerk#000000683|0|ter the express, even ideas cajole along the unusual account +25090|1097|F|113870.23|1993-05-16|4-NOT SPECIFIED|Clerk#000000854|0|e ironic foxes. carefully final excuses wake blithely quickly +25091|806|F|67625.86|1993-02-20|3-MEDIUM|Clerk#000000166|0|old sauternes nag furiously a +25092|976|F|233856.01|1993-12-02|2-HIGH|Clerk#000000336|0|into beans. fluffily ironic deposits dazzle quickly furiously unusual account +25093|694|F|166358.47|1992-10-29|3-MEDIUM|Clerk#000000328|0|theodolites. ironic ideas haggle. furiously regular dugouts use across th +25094|1099|F|43084.38|1994-04-23|3-MEDIUM|Clerk#000000732|0|pinto beans. pending excuses poach furiously. blithely even pinto beans are +25095|1231|F|276231.12|1995-01-26|5-LOW|Clerk#000000057|0|ly beside the carefully bold foxes. furiously regular deposi +25120|346|F|171182.59|1994-02-05|3-MEDIUM|Clerk#000000686|0|s. carefully special package +25121|85|F|79831.06|1993-11-17|2-HIGH|Clerk#000000061|0|s detect slyly along the excuses. carefully final accounts detect slyly ag +25122|17|O|74400.72|1998-07-03|2-HIGH|Clerk#000000457|0|blithely furiously reg +25123|1097|F|55784.54|1992-09-22|5-LOW|Clerk#000000429|0|ular instructions wake quickly fluffi +25124|902|O|247909.47|1997-12-02|5-LOW|Clerk#000000789|0|ccording to the furiously ironic sauternes. final foxes grow blithely iro +25125|824|O|113540.22|1997-08-30|3-MEDIUM|Clerk#000000237|0|ickly regular accounts use quickly. carefully pending instructions above th +25126|904|F|295370.03|1992-12-24|1-URGENT|Clerk#000000611|0|ular courts. silent depths doze. blithely ir +25127|1051|O|167208.88|1996-07-13|4-NOT SPECIFIED|Clerk#000000201|0|es. fluffily ironic dependencies cajo +25152|880|F|146218.07|1992-10-16|1-URGENT|Clerk#000000221|0|s around the ironic deposits must have to cajole careful +25153|1274|O|31526.70|1997-12-22|4-NOT SPECIFIED|Clerk#000000582|0|s. quickly silent packages hang dependencies? carefully re +25154|316|F|127197.35|1993-08-21|2-HIGH|Clerk#000000235|0|quickly along the slyly pe +25155|1315|F|324896.39|1993-01-21|5-LOW|Clerk#000000646|0|ar asymptotes. regular, +25156|197|O|254306.44|1996-02-21|3-MEDIUM|Clerk#000000952|0| slyly ironic pinto beans after +25157|1399|F|166140.20|1993-05-26|4-NOT SPECIFIED|Clerk#000000453|0|regular sauternes. qu +25158|422|O|147542.77|1996-08-26|1-URGENT|Clerk#000000622|0|beans cajole blithely furiously ironic theodolites. furiously sly +25159|97|O|129727.49|1996-03-27|3-MEDIUM|Clerk#000000304|0|thely ironic pinto beans +25184|1222|F|83850.59|1995-02-28|4-NOT SPECIFIED|Clerk#000000120|0|ve the furiously bold requests- +25185|943|F|29207.11|1993-05-26|3-MEDIUM|Clerk#000000441|0| sentiments along the blithely fi +25186|811|O|132409.03|1996-10-24|5-LOW|Clerk#000000838|0|efully carefully final asymptotes. quickly even acc +25187|1300|O|38654.98|1997-02-15|4-NOT SPECIFIED|Clerk#000000199|0|s. carefully final requests boost carefully. final dep +25188|865|F|151038.18|1995-01-04|3-MEDIUM|Clerk#000000293|0|y ironic deposits. fluffil +25189|235|F|161440.03|1993-11-13|3-MEDIUM|Clerk#000000813|0|ternes use above the even deposits. ac +25190|1435|O|124264.96|1997-12-03|3-MEDIUM|Clerk#000000838|0| furiously against the slyly ironic dolphins. asymptotes cajo +25191|778|P|241779.84|1995-03-31|3-MEDIUM|Clerk#000000322|0|-- fluffily ironic deposits nag never. quickly final depo +25216|34|F|83299.94|1992-12-08|1-URGENT|Clerk#000000552|0|e slyly unusual asymptotes boost furiously blithely even patterns. furiously b +25217|634|O|107424.06|1998-06-25|3-MEDIUM|Clerk#000000648|0| excuses. regular asymptotes against the foxes aff +25218|871|O|290711.63|1998-03-24|3-MEDIUM|Clerk#000000352|0|as cajole according to the furiously unusu +25219|35|O|168971.02|1997-09-13|4-NOT SPECIFIED|Clerk#000000703|0|e even, bold excuses use furiously about the carefully regular warhor +25220|652|O|73387.96|1997-12-09|2-HIGH|Clerk#000000638|0|ar, brave deposits. careful +25221|814|O|266235.53|1995-06-15|5-LOW|Clerk#000000415|0|ing pinto beans. carefully even pinto beans integrat +25222|109|O|169405.48|1997-11-23|1-URGENT|Clerk#000000019|0|equests are carefully blithely ev +25223|886|O|179001.86|1996-05-09|5-LOW|Clerk#000000508|0|gainst the fluffily +25248|458|O|69770.75|1995-12-02|3-MEDIUM|Clerk#000000234|0|sts. ironic deposits cajole caref +25249|1004|F|123807.39|1992-11-07|3-MEDIUM|Clerk#000000802|0|heodolites are after the slyly pending packag +25250|329|O|56670.88|1995-07-20|5-LOW|Clerk#000000513|0|ests use close, regular pinto beans: express, regular dugouts cajole careful +25251|1043|O|211731.77|1996-05-16|4-NOT SPECIFIED|Clerk#000000459|0|ar deposits should have to unwind b +25252|1090|F|41633.01|1992-07-23|4-NOT SPECIFIED|Clerk#000000969|0|sts nag fluffily along the unusual packages. brav +25253|40|O|353894.29|1995-07-31|5-LOW|Clerk#000000534|0| regular foxes kindle asymptotes. ironic deposits along the th +25254|1267|F|251661.61|1993-09-18|1-URGENT|Clerk#000000329|0|instructions snooze slyly at the blithely express req +25255|490|F|142137.24|1992-02-21|1-URGENT|Clerk#000000356|0| packages. furiously final accounts among the unusual deposits s +25280|4|O|115422.02|1995-05-22|4-NOT SPECIFIED|Clerk#000000234|0| packages haggle across the furio +25281|58|O|149842.32|1996-03-30|1-URGENT|Clerk#000000736|0|s affix slyly ironic patterns. ca +25282|439|O|298603.29|1996-01-04|3-MEDIUM|Clerk#000000217|0|sits haggle quickly upon the packages. furiousl +25283|370|O|206530.94|1998-06-28|4-NOT SPECIFIED|Clerk#000000882|0|. furiously unusual pinto beans nag blithel +25284|304|F|161440.76|1993-09-19|1-URGENT|Clerk#000000224|0|ts haggle blithely special, bold requests. slyly busy requests grow +25285|1298|O|25944.77|1995-09-18|3-MEDIUM|Clerk#000000585|0|tterns. final packages doubt. blithely unusual instruc +25286|671|O|115642.43|1996-07-29|1-URGENT|Clerk#000000464|0|pecial theodolites haggle about the fluffily regular p +25287|853|F|95117.66|1993-12-17|1-URGENT|Clerk#000000881|0|ly furiously even requests. ironic, +25312|464|O|89045.13|1996-03-22|2-HIGH|Clerk#000000020|0|ending accounts. blithely silent theodolites cajole. ironically pending +25313|124|F|102736.72|1992-08-22|1-URGENT|Clerk#000000534|0|oost slyly according to the slyly regular co +25314|347|F|282388.67|1992-02-25|2-HIGH|Clerk#000000433|0|requests haggle slyly. closely regular deposits are fluffily against th +25315|586|F|210178.05|1993-12-03|5-LOW|Clerk#000000888|0|le carefully ironic, pending ideas. pending, regular acco +25316|1385|O|158437.90|1996-11-26|3-MEDIUM|Clerk#000000291|0| instructions. final excuses are fluff +25317|154|O|50001.33|1995-07-03|4-NOT SPECIFIED|Clerk#000000222|0|phs. slyly ironic platelets against the carefully iro +25318|238|O|225013.81|1995-11-20|1-URGENT|Clerk#000000189|0|ending asymptotes against the regular, express requests haggle blith +25319|955|O|170904.73|1997-02-19|3-MEDIUM|Clerk#000000838|0| final deposits cajole +25344|343|O|53666.41|1997-04-06|1-URGENT|Clerk#000000038|0|onic pains. carefully even accoun +25345|1457|O|55797.33|1996-05-01|4-NOT SPECIFIED|Clerk#000000104|0|packages. carefully regular a +25346|577|O|151720.59|1997-08-24|5-LOW|Clerk#000000655|0|fter the regular, regular fo +25347|640|F|141369.62|1994-06-13|5-LOW|Clerk#000000263|0|ffily ironic requests. ironically ironic platelets nag careful +25348|763|F|169474.56|1992-05-10|1-URGENT|Clerk#000000989|0|s about the quickly regular deposi +25349|53|O|63363.97|1996-02-03|3-MEDIUM|Clerk#000000246|0|ly against the ironic, pending theodolites. even, enticing pa +25350|1184|F|280721.16|1993-12-04|4-NOT SPECIFIED|Clerk#000000320|0|l requests. silent excuses nag. bravely unusual pinto beans haggle. +25351|1498|F|38200.42|1992-01-16|3-MEDIUM|Clerk#000000470|0|ole requests? slyly final packages use among the slyly special +25376|49|F|91216.64|1995-03-27|1-URGENT|Clerk#000000699|0|regular, regular theodolites sleep alongside of the qui +25377|1136|F|16879.33|1992-11-27|5-LOW|Clerk#000000225|0|riously express excuses haggle slyly express, even +25378|1282|O|90107.46|1995-12-19|4-NOT SPECIFIED|Clerk#000000566|0|slyly slyly regular ideas. fluffy, ironic requests outside the quickly express +25379|460|O|9896.90|1996-11-08|1-URGENT|Clerk#000000607|0|ular accounts about the excuses can brea +25380|97|F|10764.04|1994-10-12|1-URGENT|Clerk#000000604|0|s haggle blithely silent patterns. carefully special deposits among t +25381|1042|O|75709.53|1996-08-24|5-LOW|Clerk#000000964|0| unusual excuses. fluffily regular re +25382|1441|O|59281.47|1998-06-22|4-NOT SPECIFIED|Clerk#000000462|0|ccounts. regular ideas +25383|929|O|68099.06|1997-11-27|4-NOT SPECIFIED|Clerk#000000181|0|ructions. accounts sleep ar +25408|517|O|49214.81|1996-01-08|2-HIGH|Clerk#000000339|0|ges boost carefully special theodolites. carefully regular foxes m +25409|1223|O|94967.44|1997-10-06|1-URGENT|Clerk#000000086|0|ncies. ironically final deposits according to the i +25410|70|O|193381.82|1998-03-20|3-MEDIUM|Clerk#000000801|0|nic requests haggle. s +25411|1238|O|168491.56|1997-03-13|4-NOT SPECIFIED|Clerk#000000062|0|g accounts sleep. regularly ironic requests haggle f +25412|1163|O|288171.42|1995-06-07|4-NOT SPECIFIED|Clerk#000000566|0| pinto beans against the carefully express +25413|733|O|148672.00|1996-09-15|1-URGENT|Clerk#000000700|0|ly regular, ironic requests. furio +25414|1105|O|220955.10|1996-04-18|3-MEDIUM|Clerk#000000969|0|nstructions are about the +25415|568|O|293909.88|1997-11-14|2-HIGH|Clerk#000000944|0|ess ideas cajole excuses. instruct +25440|634|F|230038.50|1994-02-07|2-HIGH|Clerk#000000358|0|ironic requests could poach about the furiously enticin +25441|572|F|30402.99|1995-01-10|5-LOW|Clerk#000000642|0|quickly quickly close requests. slyly iron +25442|499|F|145349.54|1992-01-06|2-HIGH|Clerk#000000977|0|l accounts according to the fluffily final accounts are bravely to the r +25443|1066|F|96258.85|1992-09-23|3-MEDIUM|Clerk#000000470|0| blithely. sly, blithe instructio +25444|250|F|48366.35|1993-01-14|5-LOW|Clerk#000000184|0| wake. blithely brave excuses cajole. blithely express gi +25445|214|F|271914.90|1994-05-26|5-LOW|Clerk#000000989|0|xcuses are daringly around the carefu +25446|596|F|102592.10|1992-11-11|3-MEDIUM|Clerk#000000825|0| packages. ironic, final packages wake bli +25447|181|F|181574.70|1992-05-24|4-NOT SPECIFIED|Clerk#000000061|0|s can haggle blithely final ideas: blithely pending pi +25472|1076|F|88384.26|1994-05-22|2-HIGH|Clerk#000000676|0|ly pending packages. bold requests use +25473|742|F|67835.18|1992-10-15|2-HIGH|Clerk#000000137|0|le according to the requests-- unusual acco +25474|1277|F|275344.50|1992-06-22|2-HIGH|Clerk#000000113|0|its. requests affix +25475|421|F|59505.85|1994-04-05|1-URGENT|Clerk#000000017|0|ts wake carefully furiously ironic dolphins +25476|409|F|75932.78|1992-10-03|4-NOT SPECIFIED|Clerk#000000868|0|ven theodolites among the carefully regular ideas haggle among the furio +25477|1360|F|118709.46|1993-09-21|2-HIGH|Clerk#000000338|0|bove the regular, regular theodolites boost fluffily +25478|463|F|101938.90|1992-04-25|1-URGENT|Clerk#000000404|0|es use regular, final packages. fluffy foxes nag fluffily iro +25479|382|F|96118.77|1995-04-29|1-URGENT|Clerk#000000754|0|egular accounts wake slyly +25504|1324|O|79401.59|1995-05-27|1-URGENT|Clerk#000000311|0|te quickly ideas. final, regular theodolites shall have to h +25505|1334|O|195998.70|1997-01-01|1-URGENT|Clerk#000000770|0|tly unusual packages hagg +25506|1412|F|51957.12|1993-03-14|2-HIGH|Clerk#000000691|0|pearls sleep quickly pending theodolites. regular requests +25507|1354|F|304500.68|1994-08-06|4-NOT SPECIFIED|Clerk#000000698|0|s must have to wake slyly slyly r +25508|1480|O|67642.86|1998-07-14|4-NOT SPECIFIED|Clerk#000000355|0|wake special warthogs. furiously ironic +25509|1081|F|94293.49|1994-05-23|1-URGENT|Clerk#000000274|0|the furiously even asymptotes are pinto beans. slyly pending pint +25510|1210|F|93982.14|1994-06-25|1-URGENT|Clerk#000000967|0|ake blithely against the quickly express dependencies. unusual pinto beans +25511|217|F|111782.14|1994-01-16|2-HIGH|Clerk#000000213|0|xpress foxes grow cl +25536|242|O|13351.59|1995-07-23|5-LOW|Clerk#000000470|0|ven accounts after the special, express deposits nag enticingly according to +25537|1082|F|85102.40|1993-04-20|2-HIGH|Clerk#000000304|0|ar excuses. carefully express deposits hinder +25538|446|O|38428.56|1996-07-09|3-MEDIUM|Clerk#000000392|0|l grouches sublate carefully d +25539|1366|O|109239.99|1997-10-14|4-NOT SPECIFIED|Clerk#000000506|0|. fluffily pending +25540|613|O|60937.62|1996-03-23|3-MEDIUM|Clerk#000000254|0|ly. carefully final foxes use caref +25541|187|F|162381.68|1994-01-14|5-LOW|Clerk#000000526|0| around the gifts lose slyly agai +25542|25|F|110060.10|1992-12-31|5-LOW|Clerk#000000210|0|eep. furiously special ideas wake ironic, regular requests. qui +25543|628|F|57076.58|1993-10-02|4-NOT SPECIFIED|Clerk#000000076|0|ent deposits. blithe +25568|1027|O|162514.32|1996-10-31|1-URGENT|Clerk#000000359|0|e of the ironic packages. final courts haggle. requests sublate bold, iron +25569|328|F|129075.80|1992-07-10|2-HIGH|Clerk#000000151|0|yly even theodolites. slyly silent requests haggle carefully. furious +25570|391|F|109330.98|1992-02-17|1-URGENT|Clerk#000000231|0|fter the regular theodol +25571|853|F|63882.62|1992-08-19|1-URGENT|Clerk#000000665|0|ven accounts nag ev +25572|433|F|96808.07|1995-01-23|1-URGENT|Clerk#000000974|0| about the blithely ironic requests. fluffily ironic +25573|1315|F|247571.00|1993-11-05|4-NOT SPECIFIED|Clerk#000000344|0| cajole carefully final deposits. special, busy accounts sleep flu +25574|1148|F|238229.54|1994-03-13|4-NOT SPECIFIED|Clerk#000000044|0|nic ideas use carefully above the even, express requests. quickly +25575|1192|F|177294.17|1992-05-30|4-NOT SPECIFIED|Clerk#000000967|0|lyly fluffily ironic realms. requests wake about the ironic requests. ideas na +25600|652|O|148984.44|1998-07-17|2-HIGH|Clerk#000000713|0| blithely final deposits. regular, iro +25601|722|F|151224.94|1994-01-06|3-MEDIUM|Clerk#000000683|0|carefully even deposits grow sometimes. ideas are furiously express +25602|823|O|128606.14|1996-03-01|3-MEDIUM|Clerk#000000644|0|ly slyly ironic deposits. platelets wake carefully carefully +25603|103|F|150121.55|1995-03-06|5-LOW|Clerk#000000817|0|hely after the slyly pendi +25604|760|O|270228.05|1997-11-21|1-URGENT|Clerk#000000173|0|: carefully pending pinto beans use furiously bl +25605|512|F|10962.56|1994-06-03|2-HIGH|Clerk#000000663|0|rate carefully furiously regula +25606|650|F|23877.79|1992-04-23|2-HIGH|Clerk#000000851|0|liers. ironic accounts thrash quietly. carefu +25607|877|O|86439.74|1996-11-23|2-HIGH|Clerk#000000864|0| quickly even asymptotes. fu +25632|1246|O|281215.12|1996-09-02|5-LOW|Clerk#000000378|0|fily blithely even ideas. final, regular +25633|1093|O|231274.63|1995-08-02|5-LOW|Clerk#000000249|0| blithely ironic asymptotes around the pending, bold instructions detect sly +25634|70|F|299230.95|1993-07-30|4-NOT SPECIFIED|Clerk#000000790|0|s boost quickly furiously bold requ +25635|1048|F|123853.80|1992-05-30|1-URGENT|Clerk#000000671|0|lly pending pains. s +25636|94|O|128211.60|1998-07-08|2-HIGH|Clerk#000000838|0|ajole furiously against the slyly unusual +25637|305|F|151092.01|1992-02-26|4-NOT SPECIFIED|Clerk#000000841|0|even pearls. blithely even pa +25638|202|F|161345.81|1994-08-07|2-HIGH|Clerk#000000372|0|cing requests haggle. sometimes even asymptotes sleep blit +25639|1258|F|109350.02|1994-10-12|3-MEDIUM|Clerk#000000951|0|nic hockey players affix slyly. careful +25664|566|F|156476.82|1994-12-30|1-URGENT|Clerk#000000255|0|fily express dependencies wake f +25665|19|O|53951.90|1996-08-01|1-URGENT|Clerk#000000128|0|c, silent packages are furiously slyly final requests. ironic pinto bean +25666|589|F|84169.63|1992-09-03|1-URGENT|Clerk#000000054|0|tructions haggle after the carefully i +25667|532|O|42593.51|1995-11-15|3-MEDIUM|Clerk#000000002|0| beans boost across the silent accounts. furious platelets against the furiou +25668|118|O|2149.53|1997-04-27|4-NOT SPECIFIED|Clerk#000000665|0|ss the blithely ironic foxes sublate slyly regular p +25669|1375|F|198950.16|1995-01-17|1-URGENT|Clerk#000000807|0|. carefully regular ideas cajole. q +25670|751|O|210045.49|1997-12-12|2-HIGH|Clerk#000000475|0| after the slyly express requests. packages across the pending, pending asymp +25671|1294|O|109909.99|1997-04-21|4-NOT SPECIFIED|Clerk#000000752|0|ackages about the fluffi +25696|86|F|127424.26|1993-02-16|3-MEDIUM|Clerk#000000774|0|furiously final packages wake quickly +25697|464|P|43576.71|1995-04-27|5-LOW|Clerk#000000784|0|ackages sleep about the furiously express accounts. quickly ruthless dep +25698|271|O|111342.37|1998-03-02|2-HIGH|Clerk#000000693|0|ns cajole blithely around the quickly special requests. dugouts nag q +25699|464|O|248247.94|1997-11-19|4-NOT SPECIFIED|Clerk#000000050|0|h. even packages after the accounts kindle fluff +25700|1009|O|19708.70|1997-04-28|1-URGENT|Clerk#000000179|0|efully ironic requests. pinto beans nag across the tithes. slyly regula +25701|977|O|222527.62|1996-02-08|1-URGENT|Clerk#000000897|0|ecial pinto beans affix furiously unusua +25702|1492|O|217721.68|1996-06-26|2-HIGH|Clerk#000000201|0|tect blithely. express requests sleep blithely across the dep +25703|488|F|76138.47|1994-03-07|3-MEDIUM|Clerk#000000950|0|l deposits wake slyly against the express, regular theodolites. furiou +25728|31|O|188315.29|1997-02-16|4-NOT SPECIFIED|Clerk#000000870|0|yly blithely even excuses? regular +25729|790|O|12509.08|1995-08-17|3-MEDIUM|Clerk#000000514|0|inal accounts up the slyly even +25730|491|O|42288.07|1997-10-02|5-LOW|Clerk#000000763|0|s. furiously even theodolites cajole ironic accounts. regula +25731|1000|F|197028.42|1994-03-26|1-URGENT|Clerk#000000909|0|rnis according to the ironic, regular packages sleep carefully a +25732|187|O|236878.83|1996-02-16|4-NOT SPECIFIED|Clerk#000000186|0|ss the unusual accounts. slyl +25733|128|F|217327.37|1992-05-13|5-LOW|Clerk#000000209|0|ugouts use furiously against the +25734|523|O|162947.17|1997-06-25|4-NOT SPECIFIED|Clerk#000000917|0|usual packages. silent pint +25735|1231|F|163151.70|1993-12-31|4-NOT SPECIFIED|Clerk#000000703|0| instructions. accounts are. fluf +25760|1078|O|178315.90|1996-07-18|2-HIGH|Clerk#000000304|0|to the furiously even deposits sleep furiously above +25761|1253|O|8050.24|1998-07-15|4-NOT SPECIFIED|Clerk#000000845|0|al dolphins. carefully express accounts are slyly fur +25762|1267|O|104987.45|1997-02-13|5-LOW|Clerk#000000816|0|ic packages detect d +25763|130|O|32330.46|1997-07-09|5-LOW|Clerk#000000767|0|ep carefully special dolphins. bold, regular frays boost furiously +25764|1120|O|6447.97|1997-10-28|1-URGENT|Clerk#000000083|0|slyly sly ideas. pending ideas across the ironic de +25765|1006|F|35490.57|1994-04-13|5-LOW|Clerk#000000155|0|ounts across the express, pending +25766|601|O|6842.11|1997-12-23|4-NOT SPECIFIED|Clerk#000000496|0|lar pinto beans cajole furiously fluffily +25767|538|F|230089.61|1992-03-04|2-HIGH|Clerk#000000539|0|ven foxes. carefully final packages cajole. carefully ironic +25792|193|O|75216.79|1996-10-25|2-HIGH|Clerk#000000202|0|he blithely regular packages integrate slyly +25793|1078|F|93224.80|1992-04-08|5-LOW|Clerk#000000648|0|fluffily ironic theo +25794|854|O|205090.49|1997-09-28|4-NOT SPECIFIED|Clerk#000000735|0|sauternes. evenly pending waters nod alongside of the final, final depos +25795|856|O|59098.28|1997-09-23|4-NOT SPECIFIED|Clerk#000000352|0|tithes among the hockey players sleep busily fluffily regular pinto be +25796|241|F|150030.96|1992-12-31|3-MEDIUM|Clerk#000000675|0|accounts. furiously final pinto beans agains +25797|1469|F|154498.95|1992-09-02|4-NOT SPECIFIED|Clerk#000000676|0|e furiously bold accoun +25798|1067|O|34220.62|1998-04-29|4-NOT SPECIFIED|Clerk#000000474|0|ly across the unusual, express packages. packages x-ray slyly. regula +25799|305|F|138136.19|1995-02-25|5-LOW|Clerk#000000809|0|ly. carefully final excuses haggle slyly. ironic foxes cajole furio +25824|1477|F|299457.60|1994-09-05|3-MEDIUM|Clerk#000000560|0|latelets must have to wake slyly carefully regular deposits. c +25825|73|F|156705.26|1992-07-20|4-NOT SPECIFIED|Clerk#000000152|0|ts at the pending asymptotes maintain slyly +25826|775|O|130467.14|1996-10-24|5-LOW|Clerk#000000129|0|ng packages nag furiously among the even dependencies. final foxes across +25827|901|O|7453.15|1998-07-17|1-URGENT|Clerk#000000718|0|d asymptotes. unusual, final deposits according to the sl +25828|526|F|203152.91|1993-11-24|4-NOT SPECIFIED|Clerk#000000897|0| cajole final, even dependencies +25829|451|O|87984.73|1997-05-22|2-HIGH|Clerk#000000305|0|side of the regular, pending requests. daringly pending reques +25830|982|F|101779.83|1993-05-07|5-LOW|Clerk#000000146|0|unts integrate quickly ab +25831|469|F|183511.25|1994-09-15|3-MEDIUM|Clerk#000000176|0|ly bold accounts. final excuses cajole +25856|1136|F|244825.21|1992-09-15|1-URGENT|Clerk#000000247|0|luffily special accounts. regular forges sleep bli +25857|1450|O|76343.06|1996-03-19|2-HIGH|Clerk#000000340|0| accounts. final, final notornis use carefully. pending accoun +25858|1316|F|137357.80|1995-01-31|1-URGENT|Clerk#000000507|0| quickly idle deposits cajole carefully a +25859|202|O|173697.64|1997-01-19|5-LOW|Clerk#000000913|0|ead of the requests. requests nag enticingly pending courts. f +25860|940|F|100443.69|1993-01-03|5-LOW|Clerk#000000884|0|alongside of the quickly special accounts. carefully ironic instructions +25861|884|F|220666.38|1992-08-08|2-HIGH|Clerk#000000536|0|about the furiously unusual instructions; furiously bold foxes hagg +25862|185|O|57425.93|1997-09-13|5-LOW|Clerk#000000294|0| theodolites? carefully bold accounts sleep slyly bold, silent dependenci +25863|1498|P|271195.78|1995-04-23|4-NOT SPECIFIED|Clerk#000000330|0| bold, regular instructions wake blithely bold tithes. final accounts c +25888|136|O|129460.36|1996-10-20|1-URGENT|Clerk#000000934|0|onic accounts cajole quickly above +25889|926|F|99118.55|1993-06-09|5-LOW|Clerk#000000819|0| instructions wake carefully blithely eve +25890|286|O|83124.79|1997-12-01|2-HIGH|Clerk#000000891|0|eep carefully fluffily ironic requests. furiousl +25891|208|O|211559.21|1997-02-03|1-URGENT|Clerk#000000868|0|nst the regular grouches affix ar +25892|838|O|13695.00|1995-12-16|3-MEDIUM|Clerk#000000636|0| even forges around the silent accounts are furiously u +25893|4|O|150695.21|1997-09-16|1-URGENT|Clerk#000000431|0|uick requests. slyly special packages cajole. quickly regular deposi +25894|1021|O|46740.39|1996-09-15|3-MEDIUM|Clerk#000000379|0|r the blithely pending sentiments boost quickly according to the +25895|784|F|146948.04|1992-04-18|3-MEDIUM|Clerk#000000479|0|nd the blithely unusual accounts detect permanently furio +25920|1265|O|280812.31|1997-11-11|1-URGENT|Clerk#000000509|0|quickly quickly daring accounts-- final accounts according +25921|484|O|237395.11|1997-06-13|3-MEDIUM|Clerk#000000869|0|lyly final requests use furiously. carefully unusual pearls cajole fluffil +25922|622|O|11004.95|1995-08-09|3-MEDIUM|Clerk#000000963|0|arefully final excuses boost always asymptotes. quickly even +25923|1483|F|112973.99|1993-04-01|1-URGENT|Clerk#000000771|0| special packages. fluffily +25924|1237|O|347357.18|1997-08-28|5-LOW|Clerk#000000839|0|ecial deposits. blithely quiet instructions int +25925|787|O|147323.74|1997-07-28|1-URGENT|Clerk#000000058|0| pending deposits of the regular, regular accou +25926|1144|F|329606.34|1994-11-21|2-HIGH|Clerk#000000944|0| final, silent instructions are blithely quickly regular foxes. pe +25927|712|F|212995.52|1994-04-23|3-MEDIUM|Clerk#000000754|0|y regular platelets boost +25952|1303|F|160886.99|1993-09-05|2-HIGH|Clerk#000000283|0|heodolites sleep furiously after the unusual, special accounts. bold deposits +25953|712|F|139775.62|1994-09-28|1-URGENT|Clerk#000000242|0|to the unusual packages. quickly ironic packages sleep quickly pendin +25954|340|F|47607.41|1995-01-27|3-MEDIUM|Clerk#000000679|0|ymptotes. final depe +25955|137|P|83224.84|1995-05-05|4-NOT SPECIFIED|Clerk#000000784|0|xpress dolphins hang blithely. depo +25956|1202|O|159552.82|1998-06-04|5-LOW|Clerk#000000294|0|y special dependencies. ironic packages +25957|715|O|149481.20|1996-08-01|2-HIGH|Clerk#000000586|0|riously regular pains detect after the unusual, si +25958|155|O|192179.05|1997-06-20|4-NOT SPECIFIED|Clerk#000000597|0|inal instructions. blithely ironic requests grow above the fin +25959|310|F|131373.92|1994-07-18|2-HIGH|Clerk#000000523|0|lithely silent packages sleep above the even accounts. final ideas haggl +25984|107|O|26063.83|1997-04-25|5-LOW|Clerk#000000613|0|nts are blithely after the fluffily express requests. blithely special +25985|469|F|169716.48|1992-09-03|5-LOW|Clerk#000000409|0|ke carefully alongside of the carefully i +25986|206|F|232381.51|1992-06-23|3-MEDIUM|Clerk#000000198|0|ites cajole blithely. regular, silent waters lose slyly. +25987|286|O|89411.76|1997-09-16|4-NOT SPECIFIED|Clerk#000000428|0|ts haggle about the quickly final accounts. slyly final asymptote +25988|883|O|52647.51|1996-10-14|1-URGENT|Clerk#000000432|0|ckly bold theodolites. daring deposits sleep carefully against +25989|311|O|319209.66|1998-05-18|1-URGENT|Clerk#000000093|0|furiously regular accounts are +25990|1357|F|263432.53|1994-03-08|4-NOT SPECIFIED|Clerk#000000340|0|r foxes boost slyly after the furiously bold ideas. never even packages cajo +25991|619|O|241392.91|1998-04-16|1-URGENT|Clerk#000000461|0|gular dolphins. blithely special deposits cajole. requests integrate ins +26016|214|F|179880.05|1994-10-08|2-HIGH|Clerk#000000342|0|unusual packages nag carefully even ideas. carefully regular +26017|215|O|149895.69|1998-06-05|2-HIGH|Clerk#000000303|0|sts alongside of the slyly express packages haggle carefully accordin +26018|803|O|186262.65|1997-07-10|3-MEDIUM|Clerk#000000516|0|osits are carefully. blithely iron +26019|1319|O|103462.85|1997-11-24|1-URGENT|Clerk#000000508|0| dependencies nag. regula +26020|1469|O|128116.10|1996-02-07|5-LOW|Clerk#000000070|0|hely final courts integrate carefully e +26021|850|F|89984.89|1992-09-15|1-URGENT|Clerk#000000828|0|ly ironic requests. furiously unusual accounts above the slyly re +26022|745|O|188816.32|1997-10-16|3-MEDIUM|Clerk#000000982|0|rts sleep deposits! theodolites use carefully ironic req +26023|1261|F|201881.67|1993-08-21|2-HIGH|Clerk#000000616|0| even packages are quickly permanent packages. regular frays a +26048|251|O|73821.73|1998-07-02|5-LOW|Clerk#000000461|0|es. quickly ironic deposits wake sometimes against the express, pending d +26049|937|F|51331.76|1995-03-01|2-HIGH|Clerk#000000368|0| express pinto beans. unusual, special theodolites +26050|187|O|130542.47|1995-06-17|2-HIGH|Clerk#000000189|0|luffily close accounts ca +26051|178|F|113473.40|1993-06-28|4-NOT SPECIFIED|Clerk#000000384|0|according to the idle, blithe foxes are slyly acco +26052|277|O|158777.45|1996-04-30|3-MEDIUM|Clerk#000000352|0|the unusual theodolites. blithely regul +26053|853|F|176600.98|1992-01-25|5-LOW|Clerk#000000027|0|quests play carefully quickly final dependencies. carefully fi +26054|841|F|269902.52|1993-02-13|1-URGENT|Clerk#000000966|0|nt asymptotes wake. slyly express dependencies haggl +26055|610|F|162873.56|1992-11-26|4-NOT SPECIFIED|Clerk#000000929|0|deas wake. express account +26080|601|F|178627.80|1993-12-16|1-URGENT|Clerk#000000733|0|ic realms. foxes aff +26081|1142|F|45716.94|1993-11-16|2-HIGH|Clerk#000000780|0| asymptotes use quickly carefully pending excuses. furiously pe +26082|788|O|127860.34|1996-02-02|5-LOW|Clerk#000000456|0|usly among the blith +26083|962|O|243303.90|1996-05-11|1-URGENT|Clerk#000000912|0|ckages mold along the pending, regular deposits. quickly unusual ideas +26084|1489|F|96192.46|1992-10-17|5-LOW|Clerk#000000297|0|ts after the quickly regular accounts use furious +26085|326|O|74883.25|1998-01-08|3-MEDIUM|Clerk#000000454|0|ealthy, silent packages sleep after the fluffily special foxes. regular, f +26086|377|O|73298.49|1997-06-26|5-LOW|Clerk#000000955|0|blithely dependencies. blithely ev +26087|905|O|78601.83|1996-10-13|4-NOT SPECIFIED|Clerk#000000500|0|beans cajole carefully ironic requests. final account +26112|1435|O|67955.94|1998-03-18|4-NOT SPECIFIED|Clerk#000000433|0|s detect quickly alo +26113|160|O|239608.66|1998-07-15|5-LOW|Clerk#000000571|0|ins sleep. blithely bold pinto beans haggle slyly care +26114|794|O|127650.12|1997-09-08|5-LOW|Clerk#000000047|0|e special foxes boost regular accounts. always final requests kindle car +26115|128|O|293689.10|1996-11-06|4-NOT SPECIFIED|Clerk#000000681|0|ely across the furiously final deposits: slyly pending pinto b +26116|674|F|222954.48|1992-10-30|1-URGENT|Clerk#000000585|0|es. carefully unusual packages sleep furiously final foxes. quickly final as +26117|79|O|80639.86|1997-06-06|4-NOT SPECIFIED|Clerk#000000236|0|haggle slyly across the c +26118|133|O|100186.71|1997-11-16|4-NOT SPECIFIED|Clerk#000000563|0|across the bold platelets wake furiously final pinto beans; blithely iron +26119|671|F|17815.25|1994-11-18|3-MEDIUM|Clerk#000000883|0|gle fluffily. accounts wake quickly carefully pending pinto beans. perma +26144|55|O|143939.95|1995-10-27|2-HIGH|Clerk#000000408|0|fluffily regular accoun +26145|971|O|120562.08|1995-07-05|5-LOW|Clerk#000000963|0| bold deposits. pending instructions must play quickly ironic ac +26146|320|F|246092.44|1994-10-12|5-LOW|Clerk#000000455|0|al accounts. furiously silent foxes along th +26147|650|P|155967.15|1995-04-22|2-HIGH|Clerk#000000830|0|ounts. packages after the slyly regular dolphins cajole silent +26148|1000|F|106746.90|1994-04-07|2-HIGH|Clerk#000000280|0|refully along the furiously special requests. fluffily unusual instruct +26149|316|O|129750.51|1996-05-24|4-NOT SPECIFIED|Clerk#000000916|0|out the furiously silent deposits cajole furiously express packages. final cou +26150|799|O|152019.52|1998-06-27|2-HIGH|Clerk#000000557|0|ove the silent, regular packages lose fluffily slyly pending pinto beans. pend +26151|1288|F|184543.86|1992-02-13|4-NOT SPECIFIED|Clerk#000000519|0|excuses solve across t +26176|571|O|100295.25|1995-11-20|2-HIGH|Clerk#000000159|0|furiously unusual requests sleep across the busily unusual +26177|1003|O|104483.35|1995-12-28|4-NOT SPECIFIED|Clerk#000000399|0|slyly quickly final accounts. blithely +26178|1078|O|67253.51|1997-07-31|3-MEDIUM|Clerk#000000541|0|, ironic theodolites doze steal +26179|598|O|244472.74|1997-04-04|1-URGENT|Clerk#000000660|0|express packages cajole slyly. theodolites was quickly +26180|511|F|177144.84|1994-12-06|3-MEDIUM|Clerk#000000186|0| the dogged theodolites. blithely pending foxes serve along the b +26181|1456|F|32732.05|1994-04-14|4-NOT SPECIFIED|Clerk#000000015|0|hins. blithely unusual +26182|28|F|193983.45|1993-01-17|4-NOT SPECIFIED|Clerk#000000807|0|s integrate furiously requests. ideas use quickly regular dep +26183|1259|O|41083.77|1996-02-21|2-HIGH|Clerk#000000357|0|quests eat blithely against the blithely final ideas. careful +26208|755|O|161392.92|1996-03-21|4-NOT SPECIFIED|Clerk#000000901|0|ave to sleep furiously ironic instruc +26209|1015|O|85655.99|1997-04-30|1-URGENT|Clerk#000000226|0|carefully regular requests. blithely bold dependencies along the bli +26210|1499|F|203425.25|1993-02-26|4-NOT SPECIFIED|Clerk#000000344|0| deposits. final accounts b +26211|406|O|28962.96|1996-02-03|3-MEDIUM|Clerk#000000355|0|g decoys solve above the blithely final instructions! blithely pending realms +26212|196|O|267215.93|1996-04-06|5-LOW|Clerk#000000055|0|special packages-- carefully regula +26213|604|O|67958.62|1997-01-17|2-HIGH|Clerk#000000415|0|lithely bold request +26214|1138|O|137884.01|1995-11-21|3-MEDIUM|Clerk#000000091|0|oxes. fluffily bold warhorses wake alongside of t +26215|619|O|213144.02|1995-07-05|4-NOT SPECIFIED|Clerk#000000935|0|ughout the furiously final asymptotes. final +26240|61|F|257648.32|1994-12-20|1-URGENT|Clerk#000000885|0| final, regular excuses cajole quickly. bold, final +26241|13|O|268342.50|1996-02-10|4-NOT SPECIFIED|Clerk#000000243|0|express, even theodolites wake +26242|532|O|290901.93|1996-12-27|3-MEDIUM|Clerk#000000828|0|bout the quietly ironic dolphins may wake dependencies. fluffily even r +26243|16|O|153793.57|1995-07-17|5-LOW|Clerk#000000702|0|lly express requests serve carefully about +26244|422|F|169151.42|1993-08-04|2-HIGH|Clerk#000000164|0|pecial requests cajole bl +26245|1165|F|27720.11|1995-01-19|3-MEDIUM|Clerk#000000104|0|onic foxes. ironic accounts are furiously. ironic account +26246|1297|O|92590.83|1995-04-29|2-HIGH|Clerk#000000444|0|sits are furiously blithe +26247|764|O|52662.07|1997-11-07|1-URGENT|Clerk#000000350|0|sly regular packages are above the foxe +26272|727|F|175382.02|1992-06-30|5-LOW|Clerk#000000870|0|ic packages integrate furiously alongside of the carefully even deposits. +26273|206|O|263678.70|1997-12-26|2-HIGH|Clerk#000000238|0|slyly. slyly special pinto beans are carefully furiously iro +26274|247|F|243472.89|1992-06-13|4-NOT SPECIFIED|Clerk#000000865|0|fully express frays can sleep slyly. +26275|1436|F|1258.33|1993-12-22|3-MEDIUM|Clerk#000000263|0|usly unusual foxes about the even ideas affix ideas. always +26276|719|F|113992.56|1993-09-13|5-LOW|Clerk#000000116|0|he special packages +26277|602|O|89797.37|1995-06-28|3-MEDIUM|Clerk#000000673|0|inst the regular excuses are blithely abo +26278|775|F|109235.47|1994-03-19|2-HIGH|Clerk#000000408|0|counts haggle slyly according to the ironic, regular ideas. regular atta +26279|313|F|275148.17|1994-07-31|4-NOT SPECIFIED|Clerk#000000068|0|wake carefully after t +26304|1124|P|322194.40|1995-03-20|3-MEDIUM|Clerk#000000248|0|y fluffily slow accounts. +26305|1387|F|174029.25|1993-12-03|3-MEDIUM|Clerk#000000316|0|es above the express requests sl +26306|922|F|242020.26|1992-10-31|5-LOW|Clerk#000000463|0|sts are quickly against the platelets. regular pinto beans integrate +26307|404|O|194780.04|1996-06-13|2-HIGH|Clerk#000000302|0|uests about the blithely ironic accounts g +26308|409|O|135993.57|1995-12-02|4-NOT SPECIFIED|Clerk#000000940|0|eposits try to cajole ironic requests. furiously even packages are furious +26309|1367|F|271421.11|1992-02-20|5-LOW|Clerk#000000765|0|special ideas. regular foxes integrate c +26310|920|F|130194.46|1992-07-30|4-NOT SPECIFIED|Clerk#000000462|0|tes haggle blithely after the silent requests. qu +26311|445|O|163019.80|1995-10-31|3-MEDIUM|Clerk#000000458|0| to the pending accounts. even, ironic instructions are fluff +26336|523|F|112425.92|1992-05-27|2-HIGH|Clerk#000000802|0| silent packages alongside of the requests sleep +26337|109|F|104392.99|1994-11-08|1-URGENT|Clerk#000000893|0|ouches should integrate among the even foxes. furiously special accounts w +26338|436|F|157933.00|1992-03-30|2-HIGH|Clerk#000000565|0|ven dependencies wake sometimes after the carefu +26339|757|F|100366.04|1992-08-15|5-LOW|Clerk#000000275|0| ironic theodolites cajole. slyly express requests cajole furio +26340|524|O|119382.75|1997-09-27|3-MEDIUM|Clerk#000000757|0| nag about the blithely unusual packages. express ideas wake fluffily. packa +26341|1309|F|104438.99|1993-07-29|1-URGENT|Clerk#000000161|0|pinto beans. even foxes detect furiously fi +26342|635|F|197026.08|1994-10-19|5-LOW|Clerk#000000394|0|ironic deposits are until the permanently final packages. even +26343|671|O|65849.03|1998-03-27|3-MEDIUM|Clerk#000000661|0|egular orbits sleep slyly pending theodolites. quickly pending pinto beans d +26368|1262|F|98681.05|1993-07-16|3-MEDIUM|Clerk#000000984|0|nto beans. pending ideas ha +26369|1208|F|26239.31|1992-12-13|1-URGENT|Clerk#000000436|0|e furiously pending sentiments. blithely regular packages after the furiously +26370|359|O|173238.50|1995-08-09|4-NOT SPECIFIED|Clerk#000000263|0|beans. carefully special dependencies according to the blithely silent +26371|992|O|236327.85|1998-07-22|2-HIGH|Clerk#000000755|0|d asymptotes. caref +26372|565|F|160189.37|1994-07-13|5-LOW|Clerk#000000832|0|ets. even requests sleep flu +26373|322|F|134531.74|1993-07-23|3-MEDIUM|Clerk#000000761|0|. furiously regular accou +26374|1276|F|224022.24|1994-11-06|4-NOT SPECIFIED|Clerk#000000395|0|he carefully sly depo +26375|1198|O|148371.05|1996-05-15|1-URGENT|Clerk#000000186|0|xes. final notornis +26400|839|O|182106.31|1998-04-04|3-MEDIUM|Clerk#000000369|0|detect slyly about the blithely +26401|868|F|102277.75|1993-10-14|3-MEDIUM|Clerk#000000870|0| ironic excuses doze flu +26402|244|F|174846.99|1994-09-23|3-MEDIUM|Clerk#000000866|0|ily ruthless accounts daz +26403|1360|O|43776.88|1997-12-12|5-LOW|Clerk#000000623|0|ts about the even, express asymptotes cajole along the blithely ir +26404|1303|O|263163.54|1997-01-02|3-MEDIUM|Clerk#000000418|0|lithely against the furiously unusual asymptotes. finally final ideas hag +26405|287|F|145769.80|1993-06-14|2-HIGH|Clerk#000000657|0|ounts about the quickly idle grouches wake regularly ac +26406|569|P|135108.86|1995-04-13|4-NOT SPECIFIED|Clerk#000000256|0|s; thin pinto beans detect. carefully even dependencies ca +26407|4|F|275581.07|1992-06-20|1-URGENT|Clerk#000000524|0| regular deposits. slyly bold theodolites was furi +26432|1144|F|143355.06|1994-12-31|5-LOW|Clerk#000000709|0|uriously special excuses. final excuses over the packag +26433|1177|O|135686.46|1996-06-07|3-MEDIUM|Clerk#000000443|0|cies. carefully regular ideas detect furiously +26434|896|O|127887.21|1995-11-29|2-HIGH|Clerk#000000463|0|riously even accounts. furiously re +26435|140|F|37293.01|1994-10-09|1-URGENT|Clerk#000000643|0|bove the deposits-- accoun +26436|686|F|242150.01|1994-05-04|1-URGENT|Clerk#000000629|0|l packages nag along +26437|328|O|158719.20|1995-11-29|1-URGENT|Clerk#000000569|0|cuses nag furiously among the furiously iron +26438|506|O|5002.26|1996-01-04|1-URGENT|Clerk#000000309|0|onic, daring instructions +26439|634|O|253479.49|1995-09-16|3-MEDIUM|Clerk#000000085|0|bove the slyly silent excuses nag slyly about the bl +26464|958|O|234154.12|1995-12-12|2-HIGH|Clerk#000000806|0|. slyly even deposits above the regular accounts +26465|382|O|171749.91|1997-02-13|2-HIGH|Clerk#000000533|0|ess requests boost ironic, even acc +26466|1420|F|57654.96|1994-06-12|1-URGENT|Clerk#000000433|0| pending accounts haggle after the blithely ironic +26467|1159|O|3327.70|1997-02-12|1-URGENT|Clerk#000000462|0|iously furiously regular packages. final, reg +26468|998|O|189082.16|1997-03-16|5-LOW|Clerk#000000583|0|ly pending packages cajole carefully regular deposits. reg +26469|298|F|136647.31|1992-07-31|3-MEDIUM|Clerk#000000043|0|sts wake silent braids. regular ins +26470|445|F|179811.35|1994-03-22|2-HIGH|Clerk#000000602|0|bold foxes wake slyly alongside of the fluffily regul +26471|298|O|119046.86|1997-03-17|2-HIGH|Clerk#000000935|0|egular, pending requests nag fluffily along the regular +26496|479|O|163445.59|1996-06-10|5-LOW|Clerk#000000238|0| furiously fluffy forges; furiously final foxes haggle. furi +26497|1484|O|93056.43|1997-07-23|3-MEDIUM|Clerk#000000950|0|s platelets. bold accounts cajole furiously slyly pending excuses. furiously +26498|1277|O|110248.19|1996-10-02|5-LOW|Clerk#000000355|0| accounts-- carefully regular requests wake. bol +26499|94|F|271849.68|1993-02-22|3-MEDIUM|Clerk#000000408|0|pecial deposits haggle furio +26500|1048|O|128933.81|1996-11-29|4-NOT SPECIFIED|Clerk#000000726|0|gainst the furiously even ideas grow around the ironic, pending requests. +26501|536|F|89900.14|1993-05-18|5-LOW|Clerk#000000741|0|cross the pinto beans cajole according to the +26502|1391|F|53610.18|1992-12-28|3-MEDIUM|Clerk#000000025|0|g across the pending, final packages. bold platelets after +26503|619|P|228373.02|1995-04-22|3-MEDIUM|Clerk#000000172|0|urts! regular, final pinto beans use blithely. spe +26528|1217|O|58343.44|1995-11-21|4-NOT SPECIFIED|Clerk#000000714|0|ithely regular deposits should cajole across the slyly ironic foxe +26529|1340|F|247268.62|1995-01-29|5-LOW|Clerk#000000227|0|the slyly regular deposits sleep blithely regularly bold pack +26530|1288|O|25678.59|1998-07-01|4-NOT SPECIFIED|Clerk#000000336|0|s sleep carefully quickly thin asymptotes. blithely unusual theodol +26531|553|O|262874.86|1995-06-21|3-MEDIUM|Clerk#000000500|0|deposits sleep among the furiously final packages. blithely regular ideas +26532|1303|F|107588.94|1994-12-08|2-HIGH|Clerk#000000198|0|accounts believe nea +26533|106|F|61314.97|1993-04-18|5-LOW|Clerk#000000907|0| notornis haggle furiously furiously ironic pains. +26534|1282|O|102637.21|1996-01-06|1-URGENT|Clerk#000000035|0|uickly final packages may hinder. closely express instructions cajole +26535|304|F|153352.99|1992-03-21|4-NOT SPECIFIED|Clerk#000000769|0|n requests. carefully silent excuses cajole instru +26560|761|O|100381.64|1997-12-04|2-HIGH|Clerk#000000057|0|ent ideas haggle carefully above the slyly regular +26561|968|O|118055.84|1998-07-28|4-NOT SPECIFIED|Clerk#000000128|0|ages wake slyly ironically silent theo +26562|1312|O|21542.68|1998-05-07|1-URGENT|Clerk#000000160|0|al platelets snooze sile +26563|127|O|236222.45|1997-02-02|1-URGENT|Clerk#000000198|0|yly according to the furiously ironic packages. carefully special deposit +26564|520|F|158860.25|1994-05-01|5-LOW|Clerk#000000553|0|arefully furious asymptotes sleep carefu +26565|404|F|263685.04|1994-10-22|3-MEDIUM|Clerk#000000451|0|d depths wake slyly accounts. slyly even req +26566|38|O|110899.86|1995-11-15|3-MEDIUM|Clerk#000000476|0| closely final accounts. f +26567|1384|F|204616.63|1994-09-05|1-URGENT|Clerk#000000774|0|le carefully quickly busy theodolites. evenly even pinto beans b +26592|634|O|75639.82|1997-05-09|5-LOW|Clerk#000000391|0| of the carefully unusual fox +26593|1390|O|15054.11|1995-07-05|5-LOW|Clerk#000000765|0|iously permanent ideas haggle quickl +26594|613|P|124260.33|1995-04-24|4-NOT SPECIFIED|Clerk#000000085|0| the carefully ironic dolphins. ironic deposits are along +26595|1462|O|68078.25|1997-03-18|1-URGENT|Clerk#000000655|0|lyly unusual accounts. carefully unusual deposits after +26596|134|O|158179.64|1996-10-18|5-LOW|Clerk#000000078|0|se fluffily fluffily unusu +26597|1459|F|158793.58|1995-01-14|2-HIGH|Clerk#000000355|0|furiously. ironic platelets sleep around t +26598|361|O|80383.31|1997-09-23|5-LOW|Clerk#000000943|0|pending, express instructions sleep slyly ideas. silent, unusu +26599|395|O|11507.89|1997-05-13|2-HIGH|Clerk#000000821|0|ly ironic foxes. slyly ironic platelets nod carefully along the furiously sp +26624|797|O|197320.15|1997-02-21|2-HIGH|Clerk#000000930|0|iously careful idea +26625|334|O|32570.35|1995-10-16|4-NOT SPECIFIED|Clerk#000000026|0|y ironic deposits cajole furiously along the pinto bea +26626|1468|F|81389.99|1994-11-14|3-MEDIUM|Clerk#000000757|0|ly bold asymptotes. i +26627|313|F|148183.43|1994-10-31|3-MEDIUM|Clerk#000000382|0|p around the somas! requests affix idly +26628|1423|O|267389.02|1997-01-18|5-LOW|Clerk#000000304|0| fluffily. quickly sil +26629|1273|F|200170.79|1994-07-11|2-HIGH|Clerk#000000016|0|requests wake furiously ironic dependencies. requests wa +26630|382|F|133244.71|1993-11-28|2-HIGH|Clerk#000000156|0|oost ideas. final, even hockey +26631|737|F|362967.77|1993-11-02|1-URGENT|Clerk#000000722|0|counts among the even, express asymptotes wake furiously carefully +26656|1417|F|86982.71|1992-06-09|2-HIGH|Clerk#000000688|0| pending requests a +26657|85|F|116592.90|1992-09-30|3-MEDIUM|Clerk#000000595|0|totes wake furiously special deposit +26658|877|O|88739.78|1995-12-23|2-HIGH|Clerk#000000915|0|ously ironic instructions. special Tiresias nag quickly. fin +26659|1279|O|299204.61|1997-03-26|3-MEDIUM|Clerk#000000827|0|structions are express packages-- bold requests among the idl +26660|976|F|119904.72|1992-03-19|3-MEDIUM|Clerk#000000503|0|ong the ironic, special requests sleep c +26661|1163|F|138515.10|1992-12-20|3-MEDIUM|Clerk#000000490|0|even asymptotes. fi +26662|107|F|114228.65|1994-02-22|2-HIGH|Clerk#000000186|0|g, ironic requests use alongside of the furiously final platelets. blithe +26663|800|O|253842.55|1996-04-16|1-URGENT|Clerk#000000500|0|requests. final platelets cajole slyly. special, even requ +26688|955|F|163741.40|1993-08-19|3-MEDIUM|Clerk#000000197|0|ons cajole around the furiously unusua +26689|407|F|111236.61|1994-09-30|2-HIGH|Clerk#000000307|0|final accounts wake carefully. blithely express pinto beans around +26690|619|F|168905.18|1994-02-28|4-NOT SPECIFIED|Clerk#000000655|0|ns. regular deposits poach carefully af +26691|970|F|165298.34|1992-08-04|4-NOT SPECIFIED|Clerk#000000780|0|g deposits are furiously carefully unusual theodoli +26692|1304|F|20547.89|1993-07-23|4-NOT SPECIFIED|Clerk#000000778|0|e furiously bold deposits. final instructio +26693|854|F|110952.34|1993-08-22|3-MEDIUM|Clerk#000000172|0|g furiously. carefully regular pe +26694|643|O|153627.09|1998-02-11|3-MEDIUM|Clerk#000000700|0|r ideas are quickly fluffily final accounts! carefully quiet orbits +26695|1282|F|90888.32|1993-06-07|4-NOT SPECIFIED|Clerk#000000676|0|ts are slyly above the furiously ironic packages. fluffily express ac +26720|1249|O|37960.38|1996-12-20|1-URGENT|Clerk#000000033|0|sits. furiously express ideas integrate slyly. furiously regular packages +26721|826|O|331740.14|1997-03-23|3-MEDIUM|Clerk#000000673|0|uickly against the quickly final +26722|4|O|173562.06|1996-05-16|3-MEDIUM|Clerk#000000258|0|nt about the furiously regular accounts. blithely final requests sleep against +26723|568|F|122730.40|1995-03-04|5-LOW|Clerk#000000271|0| frays cajole blithely above the bold, regular requests: furiously reg +26724|1411|F|162762.02|1994-02-07|1-URGENT|Clerk#000000712|0|ording to the carefully ironic fo +26725|1475|O|37357.76|1998-06-01|3-MEDIUM|Clerk#000000599|0|hlessly final accounts solve slyly packages. furiou +26726|359|F|154804.49|1992-12-28|2-HIGH|Clerk#000000377|0|sits according to the furiously ironic pinto bean +26727|944|O|206403.49|1998-06-02|4-NOT SPECIFIED|Clerk#000000032|0| sleep blithely after the deposits. bold ideas above the slowly bo +26752|1312|O|88745.61|1996-07-14|3-MEDIUM|Clerk#000000288|0|ously ironic ideas. quickly regular theodolites wake slyly even cour +26753|838|F|63821.32|1992-10-15|4-NOT SPECIFIED|Clerk#000000770|0|iously express hockey players sleep quickly across +26754|880|O|153757.64|1998-02-06|3-MEDIUM|Clerk#000000993|0|. ironic packages are idly bold t +26755|1240|O|235638.15|1996-12-04|1-URGENT|Clerk#000000535|0|y. furiously regular requests are at the thinly special theodolites. ironi +26756|739|F|149986.51|1992-05-11|3-MEDIUM|Clerk#000000559|0|the blithely ironic courts. carefully express packages was furiously +26757|442|O|46974.18|1996-11-04|2-HIGH|Clerk#000000049|0|unts nag slyly regular orbits. furiously pending asymptotes haggl +26758|767|F|211605.23|1994-05-24|4-NOT SPECIFIED|Clerk#000000916|0|luffily express deposits. furiously regular accounts affix furiously after +26759|41|F|206729.48|1992-01-26|4-NOT SPECIFIED|Clerk#000000200|0|uriously regular accounts. requests doze blithely slyly +26784|1094|F|132125.96|1993-07-24|1-URGENT|Clerk#000000841|0|furiously furiously +26785|10|O|148499.07|1996-06-25|5-LOW|Clerk#000000376|0|requests-- ironic pinto beans nag accordin +26786|461|F|147906.46|1993-04-08|3-MEDIUM|Clerk#000000076|0|ackages. even requests cajole bl +26787|232|O|119541.27|1995-09-20|2-HIGH|Clerk#000000358|0| x-ray slyly bold requests. packages wake slyly. ironic r +26788|172|F|200616.11|1993-02-02|2-HIGH|Clerk#000000181|0|lay. carefully sile +26789|983|F|35498.00|1994-03-28|3-MEDIUM|Clerk#000000707|0|ess foxes. packages above the fur +26790|1121|O|104510.23|1996-11-12|2-HIGH|Clerk#000000419|0|ackages. furiously express requests against +26791|347|P|223779.95|1995-04-30|5-LOW|Clerk#000000480|0|its. ironic dolphins wake furiously quickly ironic asymptotes. even, unusual r +26816|466|F|129849.23|1993-08-05|2-HIGH|Clerk#000000670|0|accounts after the fluffily bold excuses cajole even deposits. slyly silent do +26817|770|O|149767.42|1998-04-15|2-HIGH|Clerk#000000074|0|lar ideas haggle about the blithely reg +26818|1186|F|310219.64|1992-01-09|4-NOT SPECIFIED|Clerk#000000401|0|e to integrate alongside of the quickly even ideas. theodolites across the u +26819|679|O|3759.92|1996-01-12|3-MEDIUM|Clerk#000000907|0|furiously express deposits: +26820|847|F|10786.56|1994-07-21|1-URGENT|Clerk#000000575|0|he slyly even packages. +26821|1073|O|147846.28|1995-11-30|4-NOT SPECIFIED|Clerk#000000567|0|uickly silent ideas are carefully evenly silent for +26822|998|F|116222.11|1994-05-08|1-URGENT|Clerk#000000739|0| carefully ironic theodolites after the requests wake carefu +26823|155|O|45231.28|1997-04-25|5-LOW|Clerk#000000355|0|ct blithely regular +26848|623|P|155027.98|1995-03-10|5-LOW|Clerk#000000712|0|ctions according to the s +26849|844|O|113335.31|1998-04-13|2-HIGH|Clerk#000000740|0|nic pinto beans affix furiously even pinto beans. c +26850|311|O|136271.43|1995-12-06|5-LOW|Clerk#000000838|0|ular deposits cajole. pac +26851|181|O|23622.14|1995-07-25|2-HIGH|Clerk#000000090|0|ins. final, ironic theodolites alongside of the final requests boost +26852|4|F|77869.29|1993-03-07|1-URGENT|Clerk#000000166|0|lly beneath the decoys. final excuses must have to wake. ironic asymptote +26853|263|F|157655.82|1992-06-13|5-LOW|Clerk#000000773|0|refully unusual theod +26854|433|F|240068.75|1994-06-22|4-NOT SPECIFIED|Clerk#000000338|0| beans are unusual, special requests; final, ironic platelets cajole blit +26855|352|F|35920.09|1994-03-16|2-HIGH|Clerk#000000080|0|ructions affix fluffily-- sile +26880|1129|O|71662.77|1996-01-07|3-MEDIUM|Clerk#000000345|0|tions! quickly pending foxes after the blithely regular requests nag at the +26881|1123|F|69050.17|1994-08-02|5-LOW|Clerk#000000154|0|among the express, pending gifts; unusual orbits +26882|853|O|166074.15|1995-06-28|4-NOT SPECIFIED|Clerk#000000506|0|o the blithely pending excuses sleep bu +26883|1478|F|45943.93|1992-01-16|5-LOW|Clerk#000000201|0|along the blithely silent packages. final dinos use care +26884|373|F|183078.48|1993-03-05|2-HIGH|Clerk#000000741|0|regular deposits sleep. requests +26885|1288|O|224392.38|1997-05-11|3-MEDIUM|Clerk#000000951|0|counts. dependencies integrate quickly around t +26886|1303|O|57406.34|1995-06-22|5-LOW|Clerk#000000570|0|s wake according to the ironic, regular foxes. ironic, +26887|1057|P|132704.36|1995-05-16|1-URGENT|Clerk#000000139|0|efully quickly final acc +26912|887|F|12825.19|1992-04-28|5-LOW|Clerk#000000355|0|l pinto beans was across the +26913|1075|F|205196.70|1994-09-30|2-HIGH|Clerk#000000091|0|uriously final packages maintain among the carefully ironic packages. sl +26914|916|O|129399.46|1996-11-03|4-NOT SPECIFIED|Clerk#000000604|0| final sheaves are quickl +26915|1474|O|294362.97|1996-01-14|2-HIGH|Clerk#000000502|0|uriously pending dependencies boost fluffily even, regular packages. +26916|349|F|121993.76|1993-07-09|1-URGENT|Clerk#000000082|0|e quickly. accounts alongside of the unusual, special +26917|140|O|9825.32|1995-11-07|1-URGENT|Clerk#000000447|0|inal deposits affix blithe +26918|560|F|223218.76|1994-04-07|5-LOW|Clerk#000000213|0|ular accounts cajole. ideas cajole slyly. furiously careful pi +26919|1321|F|274376.96|1992-12-11|5-LOW|Clerk#000000850|0|ve. carefully bold ideas detect. silent, express packages de +26944|1480|F|13965.81|1994-11-08|1-URGENT|Clerk#000000342|0|accounts cajole. silent, final packages integrate slyly bold requests. f +26945|334|F|170523.90|1994-02-06|1-URGENT|Clerk#000000084|0|ly about the stealthy excuses. even instructions print +26946|1291|O|48540.11|1997-08-09|4-NOT SPECIFIED|Clerk#000000118|0|impress quickly caref +26947|224|F|214651.69|1993-06-05|2-HIGH|Clerk#000000033|0|hely regular dolphins along the fluffily ironic reques +26948|280|O|144902.11|1995-11-23|2-HIGH|Clerk#000000431|0| asymptotes. carefully exp +26949|1172|F|184923.96|1994-08-16|1-URGENT|Clerk#000000970|0| special asymptotes haggle deposits. sly +26950|526|O|171991.03|1997-05-11|2-HIGH|Clerk#000000236|0|s haggle never along the slyly even acco +26951|616|F|95282.72|1993-04-09|4-NOT SPECIFIED|Clerk#000000915|0|ly final packages against the unusual ideas cajol +26976|457|P|368982.60|1995-05-21|4-NOT SPECIFIED|Clerk#000000105|0|g the carefully final accounts. carefully ex +26977|316|F|102051.31|1994-11-30|2-HIGH|Clerk#000000044|0|ost furiously instead of the ide +26978|976|F|271718.54|1993-06-26|3-MEDIUM|Clerk#000000925|0| furiously ironic asy +26979|52|F|198948.24|1992-03-29|3-MEDIUM|Clerk#000000518|0|s warhorses. pinto beans sleep slyly carefully ironic dependenc +26980|1408|F|121843.53|1992-04-21|1-URGENT|Clerk#000000333|0|s haggle carefully furious pinto beans. furiously final courts ac +26981|739|F|196887.34|1992-08-31|3-MEDIUM|Clerk#000000845|0|ions. fluffily final theodolites poach fluffily along the regular dinos. c +26982|61|F|300975.93|1992-04-29|4-NOT SPECIFIED|Clerk#000000777|0|ggle bold requests. pi +26983|1240|O|79483.52|1996-08-05|5-LOW|Clerk#000000754|0| blithely regular instructions. dogg +27008|1168|O|68400.75|1998-03-08|1-URGENT|Clerk#000000251|0|dolites cajole alon +27009|1486|F|110328.58|1993-12-27|3-MEDIUM|Clerk#000000871|0| wake. ironic instructions are express pearls. carefully un +27010|1309|O|161350.37|1997-01-22|3-MEDIUM|Clerk#000000778|0| excuses. regular theodolites across the slyly ironic requests print qu +27011|1099|F|190965.18|1993-12-31|3-MEDIUM|Clerk#000000978|0|al ideas haggle regular requests. furiously final asymptotes are careful +27012|1210|F|53205.67|1993-04-30|1-URGENT|Clerk#000000856|0|ites wake quickly requests-- acco +27013|961|F|242230.28|1994-07-06|5-LOW|Clerk#000000738|0|c theodolites sleep blithely. always final accounts wake blithely among th +27014|670|O|139346.85|1997-08-11|5-LOW|Clerk#000000359|0|pinto beans up the packa +27015|110|F|31144.44|1992-01-01|5-LOW|Clerk#000000551|0|carefully ironic accounts haggle? regular +27040|463|O|103635.61|1997-05-30|5-LOW|Clerk#000000412|0|ruthless, even instructions haggle under the blithely final acco +27041|961|O|25569.31|1998-06-30|1-URGENT|Clerk#000000206|0| unusual dolphins. slyly regular ideas after the even theodolites x-ray s +27042|982|F|206044.12|1994-09-23|3-MEDIUM|Clerk#000000397|0| during the even, bold platelets. unusual theodolites wake blithely about the +27043|1345|O|189740.59|1997-09-30|1-URGENT|Clerk#000000875|0|lyly express requests impress furiously around the ironic excus +27044|1429|O|204604.10|1997-03-14|3-MEDIUM|Clerk#000000414|0|ffily regular deposits. carefully ca +27045|889|F|197421.96|1992-03-02|4-NOT SPECIFIED|Clerk#000000480|0|l instructions. blithely special platelets poach f +27046|397|O|69442.72|1997-10-25|5-LOW|Clerk#000000265|0|ide of the final packages wake quickly according to the sheaves. even, bold +27047|446|F|175833.44|1993-11-23|2-HIGH|Clerk#000000141|0|al, even ideas use furiously furiously ironic deposi +27072|682|F|33127.45|1993-07-07|3-MEDIUM|Clerk#000000152|0|he express instructions integrate blithely after the forges. carefully even +27073|1039|O|40469.49|1995-04-01|5-LOW|Clerk#000000164|0|oost blithely according to the blithely regular request +27074|823|O|135632.29|1997-07-10|4-NOT SPECIFIED|Clerk#000000195|0|e furiously regular deposits serve slyly ironic asymptotes. carefu +27075|1013|O|120552.99|1998-06-04|3-MEDIUM|Clerk#000000029|0|lithely. unusual theodolites +27076|622|F|140292.27|1992-03-19|3-MEDIUM|Clerk#000000518|0|blithely final theodolites was idly fluffily darin +27077|1033|F|189249.12|1993-03-16|1-URGENT|Clerk#000000441|0|e carefully slyly ironic deposits. somas afte +27078|1090|F|48253.17|1992-08-13|4-NOT SPECIFIED|Clerk#000000032|0| blithely ironic instructions cajole slyly. quickly ironic instructions w +27079|580|F|41215.41|1994-03-14|2-HIGH|Clerk#000000266|0|ular packages integrate alongside of the blithely express asymptotes. furi +27104|256|F|157888.67|1993-08-22|3-MEDIUM|Clerk#000000639|0|uriously: theodolites sleep +27105|379|F|110309.78|1995-02-17|4-NOT SPECIFIED|Clerk#000000644|0| alongside of the s +27106|554|O|146680.18|1995-12-02|2-HIGH|Clerk#000000645|0|pending, regular instructions according to t +27107|436|F|141834.91|1993-06-30|3-MEDIUM|Clerk#000000949|0|carefully blithely special deposits. furio +27108|551|O|197262.94|1996-04-17|3-MEDIUM|Clerk#000000689|0|eposits wake blithely deposits. slyly special ideas caj +27109|307|F|82257.98|1992-02-09|1-URGENT|Clerk#000000412|0|sual foxes. blithely ironic accounts against the permanent dugouts +27110|1069|O|124692.24|1996-04-12|5-LOW|Clerk#000000063|0|gle furiously after the carefully pending packages. quickly ironic dec +27111|1114|F|162279.12|1994-03-12|2-HIGH|Clerk#000000128|0|blithely unusual foxes should haggle: fluffily pending requests a +27136|865|O|226895.25|1998-04-26|3-MEDIUM|Clerk#000000167|0|sts wake carefully acr +27137|542|F|258661.28|1992-01-01|2-HIGH|Clerk#000000881|0| regular deposits. deposits in place of +27138|1049|F|183385.71|1992-05-31|2-HIGH|Clerk#000000583|0|ular deposits boost +27139|902|F|98470.57|1994-11-02|5-LOW|Clerk#000000881|0|he regular deposits. car +27140|743|O|122092.05|1997-05-26|2-HIGH|Clerk#000000503|0|al requests unwind quietly quickly silent instructions? alw +27141|1225|F|123975.97|1993-02-05|4-NOT SPECIFIED|Clerk#000000647|0|ckages was. furiously +27142|280|F|137441.37|1992-05-19|1-URGENT|Clerk#000000910|0|foxes promise special ac +27143|973|O|173750.19|1997-09-11|1-URGENT|Clerk#000000875|0|deposits. quickly ironic packages maintain regular requests. slyly final +27168|1139|F|139398.74|1994-10-29|3-MEDIUM|Clerk#000000016|0|final instructions sleep quickly fluffily express +27169|476|O|109891.50|1995-09-12|4-NOT SPECIFIED|Clerk#000000276|0|oost furiously regular theodolites. +27170|428|O|166346.90|1998-06-18|1-URGENT|Clerk#000000415|0|ly ironic accounts integrate. slyly express pinto beans are sl +27171|673|F|191627.38|1992-02-25|2-HIGH|Clerk#000000191|0|as around the slyly pending requests +27172|880|O|47165.43|1996-02-06|5-LOW|Clerk#000000016|0|according to the silently bold packages are at the p +27173|1495|F|6756.95|1994-11-15|5-LOW|Clerk#000000033|0|g, busy packages. blithely final in +27174|1408|O|135547.52|1995-10-09|1-URGENT|Clerk#000000642|0|le against the bravely final theodolites. express d +27175|148|F|73780.23|1993-09-01|3-MEDIUM|Clerk#000000266|0|ets according to the regular, bold deposits haggle fluffily cour +27200|10|O|173191.03|1995-08-22|3-MEDIUM|Clerk#000000476|0|xes wake carefully sil +27201|1084|F|193031.80|1992-07-26|2-HIGH|Clerk#000000040|0|y even packages about the quickly final accounts sleep +27202|1252|O|31786.82|1996-05-13|4-NOT SPECIFIED|Clerk#000000175|0| decoys integrate blithely across the pending accounts +27203|1322|O|318536.77|1996-01-20|3-MEDIUM|Clerk#000000143|0|ges sleep slyly. ironic, regular packages affix across the furiously bold id +27204|142|O|121621.08|1996-05-29|2-HIGH|Clerk#000000745|0|nst the furiously ironic foxes. +27205|107|F|150659.54|1993-05-22|4-NOT SPECIFIED|Clerk#000000954|0|encies cajole furiously-- slyly +27206|1355|F|114491.28|1993-04-25|3-MEDIUM|Clerk#000000771|0|s haggle even, regula +27207|16|O|42285.59|1996-09-07|1-URGENT|Clerk#000000627|0|ly. even, bold requests haggle slyly silent deposits. blithely even sheaves +27232|334|F|98045.47|1993-08-19|4-NOT SPECIFIED|Clerk#000000082|0|fully along the ironi +27233|271|O|232505.65|1996-06-30|5-LOW|Clerk#000000511|0|urious, special deposits. blithely bold asymptotes haggle ab +27234|181|O|176519.17|1997-10-04|1-URGENT|Clerk#000000689|0|y even requests. carefu +27235|1225|F|131159.58|1992-11-12|4-NOT SPECIFIED|Clerk#000000129|0|asymptotes. carefully unus +27236|1063|F|343707.16|1993-03-03|2-HIGH|Clerk#000000862|0|rly among the fluffily slow hockey players. regular +27237|418|O|58261.87|1996-03-05|4-NOT SPECIFIED|Clerk#000000927|0|s. regular asymptotes cajole ironic depo +27238|301|O|189627.89|1995-08-15|5-LOW|Clerk#000000594|0|yly pending accounts. unusual, fluffy accounts boost dep +27239|1480|O|87723.52|1998-02-09|2-HIGH|Clerk#000000739|0|ly ironic ideas? ironic, final foxes doze slyly regular accounts. quickly +27264|1246|P|153280.48|1995-06-05|5-LOW|Clerk#000000506|0|quests among the final packag +27265|1132|F|93280.93|1992-05-07|1-URGENT|Clerk#000000550|0| final requests haggle blithely about the fluffily final theodolites- +27266|628|O|218993.09|1995-09-09|1-URGENT|Clerk#000000753|0|ic deposits use around the special inst +27267|686|O|207975.11|1996-09-15|5-LOW|Clerk#000000065|0|o beans. pending sheaves sleep furiously even foxes. slyly final pinto bean +27268|976|F|67350.22|1994-11-29|4-NOT SPECIFIED|Clerk#000000245|0|lly final ideas serve furiously deposits. even requests nag. care +27269|988|O|192100.72|1997-06-29|3-MEDIUM|Clerk#000000351|0|lithely after the furiously regular requests? asymptotes affix instructio +27270|610|F|103050.55|1993-03-10|5-LOW|Clerk#000000175|0|boost slyly. regular, regular ideas according to the slyly +27271|1202|O|207967.40|1995-09-15|4-NOT SPECIFIED|Clerk#000000181|0|le carefully pending, regular theodoli +27296|682|O|238619.69|1997-08-30|4-NOT SPECIFIED|Clerk#000000383|0| cajole quickly carefully special packages. furiously b +27297|1468|O|60918.93|1997-06-21|4-NOT SPECIFIED|Clerk#000000814|0| into the furiously silent accounts mold c +27298|1106|O|88791.10|1995-11-20|5-LOW|Clerk#000000223|0|nal foxes against the blithely final dependen +27299|1255|F|165881.93|1992-08-06|1-URGENT|Clerk#000000749|0|press requests wake furiously furiously even depo +27300|1273|F|213227.59|1992-10-01|4-NOT SPECIFIED|Clerk#000000468|0|haggle furiously slyly express deposits. unus +27301|994|F|96559.67|1993-04-05|1-URGENT|Clerk#000000470|0|regular packages. final, bold requests wake slyly accou +27302|697|F|141031.51|1992-09-13|5-LOW|Clerk#000000526|0|ding dugouts sleep blithely about the furiously regular foxes +27303|706|F|163430.81|1993-01-06|3-MEDIUM|Clerk#000000972|0|y unusual platelets. carefully ironic accounts sleep after the final p +27328|1378|O|193171.00|1995-06-05|4-NOT SPECIFIED|Clerk#000000348|0|iously pending request +27329|319|F|132507.03|1992-12-24|3-MEDIUM|Clerk#000000948|0|ly ironic pinto beans. +27330|307|F|348742.53|1994-09-17|5-LOW|Clerk#000000003|0|gular packages. furiously ironic accounts across the ironic, fin +27331|1391|F|188837.44|1994-01-27|1-URGENT|Clerk#000000072|0| accounts. carefully final instructions poach. carefully even accounts along +27332|109|O|24953.51|1996-03-23|1-URGENT|Clerk#000000805|0|ideas about the reques +27333|1009|F|214001.25|1993-11-24|3-MEDIUM|Clerk#000000885|0|ades. idly regular pinto beans cajole slyly silent packages. blith +27334|1097|O|158961.22|1996-02-07|1-URGENT|Clerk#000000283|0|latelets. express, special packages haggle final accounts! quickly final ins +27335|1264|F|54252.48|1993-11-07|5-LOW|Clerk#000000517|0|e requests. dependencies wake blithely; blithely even theodolites about the r +27360|593|O|87904.69|1996-06-13|1-URGENT|Clerk#000000256|0|he furiously special requests. special theodolites s +27361|893|F|32873.32|1995-01-23|3-MEDIUM|Clerk#000000434|0|ests poach furiously ironic requests. silent, regular ideas after th +27362|1300|F|51375.71|1994-01-23|2-HIGH|Clerk#000000964|0|iously ironic accounts sleep never regular accounts. slyly final notornis al +27363|1036|O|91848.98|1995-10-19|3-MEDIUM|Clerk#000000738|0|ongside of the quickly pending accounts. regula +27364|226|P|296508.21|1995-05-21|3-MEDIUM|Clerk#000000951|0|s sleep above the regularly +27365|805|O|67745.39|1997-08-12|2-HIGH|Clerk#000000771|0|usual packages kindle along the +27366|70|O|201199.06|1997-08-02|2-HIGH|Clerk#000000700|0|ld accounts sleep furiously bold, bold requests. even somas cajole fur +27367|74|O|236979.53|1997-03-08|2-HIGH|Clerk#000000429|0|lar packages promise furiously. stealthily final packages use a +27392|338|F|238902.36|1992-03-03|5-LOW|Clerk#000000129|0| beans sleep never. silent deposits a +27393|1423|O|26242.47|1997-04-10|2-HIGH|Clerk#000000818|0|ully express foxes. quiet orbits integrate blithely +27394|1084|O|250861.54|1998-03-06|5-LOW|Clerk#000000901|0|posits. furiously even instructions maintain silently +27395|16|O|29345.27|1997-09-25|4-NOT SPECIFIED|Clerk#000000879|0|luffily bold pinto beans nag quickly across +27396|484|F|152320.23|1993-12-09|1-URGENT|Clerk#000000868|0| beans are about the spe +27397|1190|O|7975.74|1997-02-13|4-NOT SPECIFIED|Clerk#000000395|0|quests. blithely close foxes boost bli +27398|181|F|164641.92|1992-09-30|5-LOW|Clerk#000000491|0|es. slyly regular packages are slyly even accounts. final foxes use blithe +27399|937|O|260073.11|1997-03-06|4-NOT SPECIFIED|Clerk#000000718|0|ses use slyly even, bo +27424|986|O|206210.44|1997-01-28|2-HIGH|Clerk#000000632|0|e furiously silent instru +27425|578|F|38229.43|1995-02-07|5-LOW|Clerk#000000652|0|gle ironic foxes. furiously express ideas sleep ir +27426|212|F|114502.91|1993-02-24|5-LOW|Clerk#000000728|0|s. furiously bold accounts a +27427|1201|F|153861.90|1993-10-07|2-HIGH|Clerk#000000326|0|longside of the quickly final reque +27428|739|O|34189.71|1996-04-16|4-NOT SPECIFIED|Clerk#000000584|0|the carefully final requests. slowly regular pinto beans wak +27429|1312|O|20255.79|1998-05-05|3-MEDIUM|Clerk#000000535|0|e quickly blithely bold packages. unusual, ironic asymptotes d +27430|629|F|92684.00|1995-02-01|2-HIGH|Clerk#000000833|0|sual asymptotes. slyly even dependencie +27431|832|O|71116.18|1998-04-29|3-MEDIUM|Clerk#000000082|0|usual deposits are fluffily against the unusual, ironic instructions. +27456|514|F|172781.45|1994-04-11|4-NOT SPECIFIED|Clerk#000000569|0| sleep carefully slyly ironic deposits. slyly silent p +27457|697|P|202960.26|1995-05-30|1-URGENT|Clerk#000000203|0|s cajole ideas. unusual ideas along the blithely regular accou +27458|637|O|130857.03|1997-08-08|3-MEDIUM|Clerk#000000498|0|kages sublate furiously across the carefully regular ideas: pinto beans h +27459|1013|O|288593.44|1997-04-05|4-NOT SPECIFIED|Clerk#000000634|0|thely final platelets. unu +27460|1162|F|241124.43|1994-05-13|4-NOT SPECIFIED|Clerk#000000356|0|e blithely. fluffily even requests haggle furiously slyly special +27461|1306|F|246405.94|1993-02-27|1-URGENT|Clerk#000000550|0|ct ironically carefully regula +27462|817|O|170651.60|1998-04-08|3-MEDIUM|Clerk#000000479|0|totes cajole blithely. +27463|1030|F|147779.22|1994-11-14|3-MEDIUM|Clerk#000000350|0|nt patterns. regular deposits after the blithely fina +27488|1204|O|59042.00|1998-02-25|4-NOT SPECIFIED|Clerk#000000690|0|special packages. furiously special asymptotes haggle furiously about the sly +27489|1012|O|26555.48|1996-09-19|3-MEDIUM|Clerk#000000937|0|nstructions haggle quickly aft +27490|1238|F|186313.08|1992-03-15|4-NOT SPECIFIED|Clerk#000000471|0|pendencies. carefully ironic deposits cajole furiously f +27491|508|F|253347.27|1994-04-10|4-NOT SPECIFIED|Clerk#000000890|0|ons use from the pending requests-- express, even requests sleep across t +27492|166|O|166512.27|1998-03-16|1-URGENT|Clerk#000000238|0| ironic pinto beans are blithely across the ideas. carefully final +27493|520|O|80755.68|1997-02-28|5-LOW|Clerk#000000236|0| regular pinto beans. pen +27494|1492|O|225457.05|1997-03-16|1-URGENT|Clerk#000000777|0|lyly unusual deposits +27495|412|O|174118.01|1997-07-26|3-MEDIUM|Clerk#000000958|0|excuses wake above the quietly final excuses. idly final theodolite +27520|115|O|246568.95|1996-07-13|3-MEDIUM|Clerk#000000987|0|yly carefully regular deposits. +27521|1321|F|28647.78|1993-12-30|5-LOW|Clerk#000000432|0|e final frets. fluffily even deposi +27522|509|O|220570.26|1997-12-22|2-HIGH|Clerk#000000216|0|eans x-ray carefully across the slyly final pl +27523|107|O|30213.94|1997-02-17|4-NOT SPECIFIED|Clerk#000000664|0|uctions sleep about the slyly ironic deposits. busy, regular accounts wake th +27524|815|F|130397.85|1993-02-02|4-NOT SPECIFIED|Clerk#000000487|0|carefully across the carefully bold accounts. pending, pending deposits ab +27525|331|F|110218.21|1992-06-17|4-NOT SPECIFIED|Clerk#000000784|0|the carefully final pains. packages among the blithely final instructio +27526|806|O|265458.02|1995-10-01|1-URGENT|Clerk#000000930|0| instructions cajole thinl +27527|1435|F|99223.66|1993-12-01|3-MEDIUM|Clerk#000000118|0|ructions kindle alongside of the slyly even packages. quickly pendi +27552|1003|F|85345.05|1992-09-10|1-URGENT|Clerk#000000558|0|low theodolites grow after the even packages. foxes +27553|917|O|140386.75|1995-08-13|3-MEDIUM|Clerk#000000320|0|ously regular packages after the accounts are furiously furiously regular asym +27554|1246|F|120368.85|1995-03-11|1-URGENT|Clerk#000000826|0|gular accounts are abo +27555|1051|F|121902.23|1994-09-02|1-URGENT|Clerk#000000618|0|ly regular ideas are above the carefully even requests. slyly e +27556|1243|F|96469.57|1992-06-02|5-LOW|Clerk#000000273|0|ose ideas cajole unusual instructions. final +27557|190|F|243141.86|1992-02-09|5-LOW|Clerk#000000559|0|kages are carefully furiously unusual packages. accounts ab +27558|886|O|9447.88|1995-07-08|4-NOT SPECIFIED|Clerk#000000021|0| accounts. blithely expres +27559|505|O|155638.37|1995-10-31|2-HIGH|Clerk#000000924|0| after the packages. carefully bold accounts across the carefully furiou +27584|749|O|330134.23|1998-05-05|5-LOW|Clerk#000000019|0| fluffily above the slyly silent packages. qu +27585|1274|O|306798.37|1997-08-17|2-HIGH|Clerk#000000368|0|y special pinto beans. slyly express accounts sl +27586|368|O|251021.88|1997-12-20|3-MEDIUM|Clerk#000000909|0| silent requests sleep about the carefully special packages. q +27587|772|O|113469.64|1996-10-23|4-NOT SPECIFIED|Clerk#000000920|0|ggle fluffily along the regular instructions. furiously even accounts engage +27588|565|O|34259.43|1998-08-01|3-MEDIUM|Clerk#000000967|0|thely even notornis w +27589|280|O|132287.71|1995-09-16|3-MEDIUM|Clerk#000000163|0|l platelets. carefully ironic acco +27590|670|F|146047.05|1994-07-14|4-NOT SPECIFIED|Clerk#000000961|0|ly regular packages +27591|562|O|273500.62|1998-01-17|4-NOT SPECIFIED|Clerk#000000811|0|uickly express requests. special, regular ideas detect. req +27616|1316|F|202614.14|1992-07-31|5-LOW|Clerk#000000991|0| ironic instructions. blithely express in +27617|224|F|88055.85|1992-11-09|3-MEDIUM|Clerk#000000784|0|nts are. slyly regular pin +27618|193|F|112513.61|1993-05-25|2-HIGH|Clerk#000000583|0|ully regular packages sleep. furiously ironi +27619|890|F|89929.70|1994-08-13|4-NOT SPECIFIED|Clerk#000000654|0|. slyly final reques +27620|950|O|22028.16|1996-10-10|3-MEDIUM|Clerk#000000543|0| regular deposits sleep slyly alongside +27621|605|O|55393.84|1997-10-10|4-NOT SPECIFIED|Clerk#000000475|0|al deposits. even requests cajole around the quickly regular depende +27622|631|F|76857.16|1995-02-07|3-MEDIUM|Clerk#000000644|0|uts after the dependencies sleep above the furiously even requ +27623|1168|O|223579.92|1996-02-06|2-HIGH|Clerk#000000751|0| pearls cajole carefully along the carefully expr +27648|575|F|57052.82|1994-08-30|4-NOT SPECIFIED|Clerk#000000955|0|lar pinto beans. express, silent platelets impress. slyly +27649|209|O|40747.12|1996-02-06|5-LOW|Clerk#000000660|0|asymptotes? unusual, bold packages nag. slyly final package +27650|259|F|1771.25|1992-07-13|1-URGENT|Clerk#000000784|0|slyly regular requests. slyly bold theodolites afte +27651|1028|O|211810.57|1997-11-18|3-MEDIUM|Clerk#000000134|0|ial deposits. caref +27652|100|F|314923.30|1993-01-01|3-MEDIUM|Clerk#000000044|0|y. special packages cajole. bravely ironic requests are +27653|1129|O|31789.34|1995-06-02|3-MEDIUM|Clerk#000000271|0|efully even instructions haggle carefully. quic +27654|947|F|72480.74|1993-09-25|2-HIGH|Clerk#000000522|0|ffily regular deposits. final theodolites are blithely. +27655|764|O|48001.42|1998-01-27|2-HIGH|Clerk#000000429|0|carefully about the quick +27680|109|F|321405.21|1993-01-27|1-URGENT|Clerk#000000606|0|e quickly across the furiously bold pinto +27681|1084|F|118730.30|1993-11-25|3-MEDIUM|Clerk#000000142|0|the slyly ironic escap +27682|377|F|54433.88|1994-07-11|1-URGENT|Clerk#000000682|0|ose deposits boost slyly deposits. ironic requests print +27683|67|O|64175.84|1995-10-08|2-HIGH|Clerk#000000145|0|s haggle according to the furiously +27684|37|O|164532.86|1995-09-06|5-LOW|Clerk#000000899|0|y ironic requests. sly +27685|1265|O|48416.42|1997-09-01|1-URGENT|Clerk#000000217|0|e regularly blithely pending packages. carefully ironic pinto beans det +27686|1321|F|37469.72|1993-01-14|4-NOT SPECIFIED|Clerk#000000410|0|leep carefully blithely regular ideas. blithel +27687|326|F|151316.92|1993-04-23|3-MEDIUM|Clerk#000000959|0|sly even instructions after the carefully ironic platelets wa +27712|1297|F|128247.63|1993-03-05|5-LOW|Clerk#000000820|0|atelets dazzle slyly about the blithely idle deposits. deposits abou +27713|1213|O|67223.98|1996-12-23|4-NOT SPECIFIED|Clerk#000000658|0|etect according to the silently regular requests! slyly ir +27714|400|O|71167.10|1997-06-10|2-HIGH|Clerk#000000475|0|kages haggle blithely. excuses across the accoun +27715|1228|O|269447.24|1995-09-20|2-HIGH|Clerk#000000981|0|gular foxes are stealthily even requests: carefully bold id +27716|821|O|118440.93|1996-04-29|1-URGENT|Clerk#000000141|0|arefully unusual ideas wake. pending packages haggle blithely ironic ideas +27717|1183|O|71086.18|1995-10-27|1-URGENT|Clerk#000000546|0|pending accounts hagg +27718|154|O|55920.89|1997-02-20|3-MEDIUM|Clerk#000000614|0| ironic requests serve requests. stealt +27719|380|F|209016.45|1995-02-14|4-NOT SPECIFIED|Clerk#000000607|0| quickly final asympto +27744|745|F|35409.47|1993-08-04|1-URGENT|Clerk#000000245|0| furiously regular instructions. ironic, even warh +27745|41|F|213720.02|1993-09-21|5-LOW|Clerk#000000958|0|ackages cajole slyly. fi +27746|805|F|381170.13|1993-12-05|1-URGENT|Clerk#000000804|0|yly even packages. slyly unusual dolphins sleep furiously r +27747|938|O|25312.01|1995-05-06|5-LOW|Clerk#000000803|0|the carefully ironic packages boost fluffily a +27748|22|O|262266.89|1996-08-08|3-MEDIUM|Clerk#000000625|0|he blithely pending accounts. r +27749|1466|O|215969.20|1998-05-26|4-NOT SPECIFIED|Clerk#000000567|0|wake blithely. carefully bold requests above the c +27750|985|F|183755.08|1992-10-20|5-LOW|Clerk#000000157|0|riously. blithely express deposits after the slyly speci +27751|521|O|168123.17|1998-03-26|3-MEDIUM|Clerk#000000477|0|ans affix carefully against the even, final dep +27776|271|F|131062.86|1993-05-05|5-LOW|Clerk#000000306|0|hely silent packages after the slowly +27777|1246|O|133140.71|1998-06-21|4-NOT SPECIFIED|Clerk#000000071|0|accounts cajole foxes. slyly even pinto bea +27778|418|O|155987.90|1995-09-03|1-URGENT|Clerk#000000079|0|s sleep. even accounts wake about the carefully final instructions. exp +27779|1247|F|27037.44|1993-07-22|2-HIGH|Clerk#000000887|0|ns against the blithely furious packages lose slyly across t +27780|427|F|105194.11|1992-10-21|1-URGENT|Clerk#000000086|0|ely fluffy requests cajole boldly quickly ironic packages. +27781|1180|O|142648.96|1995-09-16|2-HIGH|Clerk#000000016|0|structions serve. slyly ironic instructions sleep +27782|571|O|237576.08|1996-02-21|5-LOW|Clerk#000000718|0|. carefully express dependencies use. final accounts are silent, ironic i +27783|463|O|83586.45|1996-02-07|2-HIGH|Clerk#000000109|0|aggle. blithely final requests are s +27808|100|F|101817.31|1993-01-27|5-LOW|Clerk#000000484|0|olites. carefully ironic packages haggle furiously theodolites. evenly expres +27809|265|O|24544.24|1995-10-01|4-NOT SPECIFIED|Clerk#000000554|0|ts. slyly unusual deposits according to the ironic, even foxes are daringly pa +27810|29|F|158394.58|1993-01-29|2-HIGH|Clerk#000000595|0|gular accounts. furiously unu +27811|1471|F|179863.52|1995-03-05|4-NOT SPECIFIED|Clerk#000000381|0|nding packages are slyly pinto be +27812|1246|O|84104.43|1997-09-22|1-URGENT|Clerk#000000012|0|ular, unusual accounts haggle. +27813|1495|F|80977.11|1994-01-13|3-MEDIUM|Clerk#000000159|0|he furiously pending asymptotes. carefully regular packages affix +27814|865|O|217616.66|1997-10-26|1-URGENT|Clerk#000000858|0| ironic excuses. carefully even ideas det +27815|35|O|225590.72|1996-04-12|4-NOT SPECIFIED|Clerk#000000470|0|nts. finally regular requests detect carefully among the slyly regular +27840|841|F|240160.78|1994-07-04|2-HIGH|Clerk#000000399|0| deposits wake blithel +27841|563|F|284953.90|1992-09-17|2-HIGH|Clerk#000000194|0|s sleep blithely about the carefully final pinto beans; +27842|301|O|135232.32|1998-05-28|3-MEDIUM|Clerk#000000431|0| haggle according to the blithely re +27843|110|F|115670.99|1993-09-06|3-MEDIUM|Clerk#000000577|0| carefully pending accounts. slyly final pinto b +27844|1123|O|139357.46|1995-06-30|5-LOW|Clerk#000000125|0|quickly final accounts haggle carefully requests. carefully +27845|1385|O|161614.00|1995-07-14|4-NOT SPECIFIED|Clerk#000000591|0|nding accounts. ironic so +27846|649|O|56127.77|1996-05-19|4-NOT SPECIFIED|Clerk#000000293|0|ites. carefully quick deposits ar +27847|956|O|116976.77|1998-07-11|3-MEDIUM|Clerk#000000521|0|ing to the pending, final packages. ironic deposits sleep silently acr +27872|595|O|234716.67|1995-10-14|4-NOT SPECIFIED|Clerk#000000028|0|gedly bold sentiments. slyly special pl +27873|79|O|68367.18|1996-05-09|5-LOW|Clerk#000000949|0|fluffily even requests +27874|242|O|143101.24|1997-09-06|1-URGENT|Clerk#000000014|0|ffily bold notornis sleep carefully. slyly r +27875|1211|F|177863.37|1993-03-27|5-LOW|Clerk#000000853|0|longside of the blithely eve +27876|184|F|137823.36|1993-09-08|5-LOW|Clerk#000000069|0|lithely across the flu +27877|838|O|193169.77|1997-03-11|3-MEDIUM|Clerk#000000896|0| silent instructions wake among the unusual pinto beans. fluffily express +27878|364|O|39234.26|1997-03-27|3-MEDIUM|Clerk#000000852|0|s mold blithely slyly regular deposi +27879|1459|F|56342.31|1993-02-27|3-MEDIUM|Clerk#000000422|0|e express packages cajole above the braids. +27904|143|O|50177.19|1995-09-04|2-HIGH|Clerk#000000747|0| serve about the furiously final foxes. deposits nod c +27905|1027|O|190080.25|1997-10-31|4-NOT SPECIFIED|Clerk#000000961|0| depths along the quickly final instructions +27906|241|O|112599.66|1997-05-28|5-LOW|Clerk#000000986|0| ironic foxes are furiously. express deposits to the blithely regular forg +27907|1435|O|16603.27|1997-11-22|3-MEDIUM|Clerk#000000538|0|ymptotes-- furiously final pinto beans +27908|1355|F|93357.71|1994-05-06|2-HIGH|Clerk#000000249|0| haggle final tithes. fluffily final pinto beans wake. +27909|382|F|173208.21|1992-02-08|1-URGENT|Clerk#000000301|0| daring, regular accounts with the permanentl +27910|358|F|166891.51|1994-11-09|1-URGENT|Clerk#000000978|0|ans. furiously regular pinto beans haggle bravely according to the deposit +27911|1120|O|263944.70|1996-12-10|2-HIGH|Clerk#000000864|0|special foxes hinder. furiously ironic accounts +27936|124|O|185564.82|1995-07-08|2-HIGH|Clerk#000000562|0|refully daring dolphins nag. even requests alongside of the final theodoli +27937|1093|O|163244.21|1998-01-27|2-HIGH|Clerk#000000517|0|c waters haggle about the platelets. slyl +27938|413|F|64384.48|1994-05-06|3-MEDIUM|Clerk#000000015|0|ndencies. special, ironic accounts sleep slyly requests. blithely s +27939|1060|F|171431.68|1992-04-11|3-MEDIUM|Clerk#000000977|0|riously final accou +27940|275|O|126197.27|1997-12-08|4-NOT SPECIFIED|Clerk#000000531|0|al packages cajole slyly bold accounts-- furiously care +27941|1402|F|134676.08|1993-07-02|1-URGENT|Clerk#000000504|0|ending accounts. carefully pending packages sleep slyly fluffily p +27942|401|O|226053.99|1997-10-28|2-HIGH|Clerk#000000516|0|s. carefully regular accounts to the blithely ironic dependencies are f +27943|542|O|37900.77|1997-11-29|4-NOT SPECIFIED|Clerk#000000329|0| deposits. ruthlessly final instructio +27968|632|O|231835.53|1997-12-01|4-NOT SPECIFIED|Clerk#000000527|0|serve slowly around the fluffily even pinto beans. dolphins detect slyly +27969|382|F|188946.63|1993-06-09|5-LOW|Clerk#000000323|0|posits. blithely final foxes about the slyly regular accounts +27970|472|O|3007.12|1998-07-06|5-LOW|Clerk#000000208|0|yly pending requests are quickly silent courts. regular foxes are blithely a +27971|614|O|139299.99|1996-12-27|5-LOW|Clerk#000000844|0|otes cajole slyly around the furiously final packages. enticing deposits nag +27972|1207|O|202260.62|1996-07-25|1-URGENT|Clerk#000000423|0|structions: express accounts against the special, final deposits sleep qu +27973|323|F|213176.82|1993-03-04|3-MEDIUM|Clerk#000000810|0|iet deposits haggle slowly on the fluffily i +27974|1372|F|242090.31|1993-10-08|2-HIGH|Clerk#000000406|0|arefully slyly regular acco +27975|1132|F|97036.00|1995-02-13|3-MEDIUM|Clerk#000000240|0|ccording to the ironic, silent requests +28000|1087|P|73465.06|1995-04-03|1-URGENT|Clerk#000000535|0| hang furiously. unusual foxes wake fluffi +28001|374|F|245866.25|1994-06-15|1-URGENT|Clerk#000000046|0|ngside of the slyly special requests nag +28002|409|F|113653.31|1994-10-11|1-URGENT|Clerk#000000609|0|ages. regularly even accounts use. carefully regular foxe +28003|715|P|217787.63|1995-03-20|1-URGENT|Clerk#000000524|0|eas affix carefully f +28004|470|O|218194.75|1998-07-05|4-NOT SPECIFIED|Clerk#000000781|0|sides the regular requests detect according to the fl +28005|625|F|85190.70|1995-01-24|3-MEDIUM|Clerk#000000487|0|ss deposits wake furiously bold packages. f +28006|544|O|156539.01|1997-05-12|1-URGENT|Clerk#000000584|0| unusual deposits. slyly ironic pinto beans wake +28007|560|F|229494.18|1993-04-09|4-NOT SPECIFIED|Clerk#000000267|0|sleep according to the +28032|526|O|85411.44|1998-02-13|3-MEDIUM|Clerk#000000124|0|furiously ironic packages sleep daring +28033|43|F|227144.69|1993-09-15|2-HIGH|Clerk#000000581|0|e blithely. requests maintain. carefully pending deposi +28034|1141|O|12464.97|1995-10-19|2-HIGH|Clerk#000000168|0|requests breach alongside of the fluffi +28035|164|P|190758.40|1995-05-09|4-NOT SPECIFIED|Clerk#000000513|0|. slyly final accou +28036|688|F|238212.87|1993-11-11|2-HIGH|Clerk#000000249|0|osits sleep. thin, ironic ideas are +28037|1153|F|74320.94|1994-12-13|2-HIGH|Clerk#000000301|0|nusual dinos. theodolites sleep carefully stealthily ironic de +28038|1352|O|171360.30|1996-06-05|5-LOW|Clerk#000000273|0|counts are: slyly ironic courts cajole furiously +28039|406|F|85230.65|1992-09-28|3-MEDIUM|Clerk#000000075|0|hely special pinto beans doze. fluffily ironic instructions cajole +28064|1372|F|230783.26|1993-09-03|3-MEDIUM|Clerk#000000523|0|special platelets slee +28065|839|O|216147.88|1997-11-12|2-HIGH|Clerk#000000074|0|bold ideas. slyly ironic packages nag fluffily ir +28066|772|O|114622.54|1997-03-07|3-MEDIUM|Clerk#000000294|0|quickly silent deposits. +28067|1318|F|347917.63|1993-12-30|2-HIGH|Clerk#000000792|0| ironic packages use above the unusual +28068|893|F|214178.70|1993-08-27|5-LOW|Clerk#000000362|0|le slyly. unusual, unusual deposits haggle. +28069|1051|F|212149.15|1994-05-22|5-LOW|Clerk#000000615|0| dolphins wake alongside of the even, ironic accounts. even platelets +28070|68|O|41322.24|1997-10-29|4-NOT SPECIFIED|Clerk#000000843|0|e furiously about the carefully regular deposits. furiously pending requests +28071|659|O|92466.98|1995-07-13|1-URGENT|Clerk#000000650|0|eodolites cajole quickly bold, final deposits. furiously even packages ought t +28096|1066|O|58448.58|1998-04-14|1-URGENT|Clerk#000000151|0|ironic accounts above the requests are slyly f +28097|31|F|68499.40|1994-05-14|3-MEDIUM|Clerk#000000261|0|cial instructions. carefully ironi +28098|1391|O|43818.23|1997-08-01|5-LOW|Clerk#000000593|0| carefully. blithely express ideas after the carefully regular acco +28099|740|O|174670.63|1996-09-26|5-LOW|Clerk#000000815|0|equests. furiously thin cou +28100|1213|O|181133.81|1995-11-09|3-MEDIUM|Clerk#000000578|0|ly regular requests cajole regular platelets. carefully regular packages c +28101|1222|O|28686.58|1998-03-22|4-NOT SPECIFIED|Clerk#000000210|0|y above the furiously unusual re +28102|65|O|36474.61|1998-01-12|2-HIGH|Clerk#000000936|0| ironic dependencies sleep quickly? fluffily final packages cajole above the +28103|637|F|141447.76|1992-07-18|3-MEDIUM|Clerk#000000030|0|ccounts nag! furiously final dependencies could lose. quickly even s +28128|1249|O|273801.33|1996-07-21|2-HIGH|Clerk#000000644|0|ets believe blithely sly +28129|991|F|182559.68|1992-01-27|3-MEDIUM|Clerk#000000461|0|deposits sleep blithely express instructio +28130|670|F|243965.23|1994-07-31|5-LOW|Clerk#000000093|0|en deposits. regular deposits against the finally re +28131|652|F|149023.05|1992-06-13|3-MEDIUM|Clerk#000000179|0|tions. carefully even pinto beans are +28132|1213|O|156436.13|1998-05-13|4-NOT SPECIFIED|Clerk#000000296|0|ts are slyly! carefully regular i +28133|788|O|131582.32|1998-03-16|4-NOT SPECIFIED|Clerk#000000308|0|lly above the furiously even dependen +28134|604|O|136122.20|1997-03-23|3-MEDIUM|Clerk#000000845|0|ular accounts. dependencies are slyly. bold +28135|893|F|114965.18|1994-09-26|1-URGENT|Clerk#000000567|0|wake slyly ironic excuses. fluffily express accounts +28160|1139|O|198379.26|1997-08-20|4-NOT SPECIFIED|Clerk#000000141|0|ndencies. even requests haggle blithely ironic packages. accounts accordin +28161|632|F|333642.39|1994-06-16|4-NOT SPECIFIED|Clerk#000000373|0|ackages. even hockey players cajole slyly even id +28162|517|F|148299.21|1993-10-04|4-NOT SPECIFIED|Clerk#000000938|0|mong the ironic, special theodolites. ir +28163|869|F|163200.71|1994-08-11|5-LOW|Clerk#000000729|0|nic, ironic accounts! regular, +28164|1483|O|180792.23|1997-09-06|2-HIGH|Clerk#000000678|0|imes final accounts +28165|1300|F|196900.08|1992-07-10|4-NOT SPECIFIED|Clerk#000000904|0|hely silent instructions. busy theodolites +28166|298|F|124310.60|1993-04-28|3-MEDIUM|Clerk#000000940|0|l dolphins above the furiously enticing pint +28167|2|O|37156.97|1997-05-24|3-MEDIUM|Clerk#000000638|0|uriously special instructions. idle instructions are against the +28192|350|O|62285.09|1997-10-13|3-MEDIUM|Clerk#000000432|0|yly bold pinto beans among the slyly express decoys sleep quickly fin +28193|1211|F|31143.44|1994-02-28|5-LOW|Clerk#000000770|0|pending packages; ideas affix +28194|730|O|252730.01|1996-12-13|5-LOW|Clerk#000000882|0|slyly. ideas cajole carefully carefully spec +28195|1483|F|59877.36|1994-12-21|4-NOT SPECIFIED|Clerk#000000361|0|s cajole about the furiously express notornis. +28196|1436|O|73200.46|1995-10-20|4-NOT SPECIFIED|Clerk#000000570|0| boost carefully fluffily regular reque +28197|1361|F|94749.11|1992-01-19|4-NOT SPECIFIED|Clerk#000000084|0|ly. slyly ironic pinto bea +28198|172|F|181438.24|1992-02-09|3-MEDIUM|Clerk#000000665|0|e the blithely thin package +28199|1271|O|273788.66|1997-04-28|3-MEDIUM|Clerk#000000531|0|fully express deposits by +28224|58|F|169116.37|1992-12-20|1-URGENT|Clerk#000000919|0|ely bold deposits. express theodolites +28225|1430|F|288586.24|1994-01-23|1-URGENT|Clerk#000000919|0|gular asymptotes cajole carefully carefully express asymptotes. id +28226|16|O|49338.63|1998-07-24|4-NOT SPECIFIED|Clerk#000000710|0| according to the fluffily ironic ins +28227|709|O|80775.79|1996-11-10|3-MEDIUM|Clerk#000000379|0|ngside of the ironic accounts cajole quickly against +28228|820|F|93726.57|1992-07-12|4-NOT SPECIFIED|Clerk#000000751|0|nding warthogs. quickly ironic packages haggle blit +28229|986|O|15004.67|1996-07-28|1-URGENT|Clerk#000000078|0|ts print furiously quickly even +28230|1153|O|168911.45|1997-09-02|2-HIGH|Clerk#000000471|0|its serve furiously. special deposits across the requests sleep +28231|1397|F|162700.17|1992-11-02|1-URGENT|Clerk#000000578|0|side of the careful +28256|1216|F|62333.07|1994-02-24|2-HIGH|Clerk#000000191|0|ages. furiously bold deposits about the fluffily bold packages +28257|778|O|83603.10|1998-04-21|1-URGENT|Clerk#000000719|0|ctions sleep slyly excuses. final, even accounts wake pending, +28258|797|F|179764.94|1994-03-14|1-URGENT|Clerk#000000350|0|kly ironic requests are bold courts. fluffily final foxes ca +28259|1399|F|205340.26|1994-11-05|2-HIGH|Clerk#000000699|0|ecial, final ideas. pe +28260|1228|O|217247.10|1996-08-27|3-MEDIUM|Clerk#000000586|0|ons use above the fluffily fina +28261|880|F|102540.94|1992-12-06|3-MEDIUM|Clerk#000000046|0|ly regular dolphins. express courts +28262|821|F|152413.97|1995-01-01|3-MEDIUM|Clerk#000000534|0|ffily ironic requests on the carefully ironic frets engage accordi +28263|226|O|102502.99|1997-01-28|3-MEDIUM|Clerk#000000676|0|cial asymptotes inte +28288|8|O|121848.05|1996-03-16|5-LOW|Clerk#000000583|0|accounts. slyly regular ideas nag slyly final asympto +28289|1438|F|19420.41|1993-01-15|2-HIGH|Clerk#000000352|0|nal, thin ideas nag. special pinto beans are +28290|1193|F|268450.31|1994-01-11|5-LOW|Clerk#000000704|0|quickly regular pinto beans boost. regular, even instructions wa +28291|1376|F|59332.63|1994-03-05|1-URGENT|Clerk#000000575|0|carefully silent deposits are furiously ironic, unus +28292|839|F|8061.41|1993-02-26|2-HIGH|Clerk#000000598|0|thely even pinto beans are slyly. express, bold platelets nag fu +28293|1403|O|205371.28|1997-10-05|2-HIGH|Clerk#000000841|0|along the fluffily pending deposits haggle qui +28294|701|F|133528.92|1992-05-23|2-HIGH|Clerk#000000950|0|t slyly blithely pending deposits. fluffily si +28295|1228|O|98774.67|1997-12-05|5-LOW|Clerk#000000977|0|foxes. final, silent ide +28320|781|F|87808.78|1993-01-09|1-URGENT|Clerk#000000250|0|y ironic pinto beans. bold ideas are furiously express +28321|472|F|232123.33|1993-08-02|3-MEDIUM|Clerk#000000871|0|y express platelets use slyly against the +28322|811|O|251196.33|1995-12-14|2-HIGH|Clerk#000000728|0|ckages wake furiously along the ironic ideas. furiously fi +28323|1348|O|93378.35|1996-03-11|2-HIGH|Clerk#000000070|0|to the carefully ironic foxes. regular deposits nag carefully. ironic theodoli +28324|407|O|248534.10|1995-08-08|2-HIGH|Clerk#000000299|0|lly quiet deposits up the furiously even deposits can sleep +28325|1396|O|109980.33|1996-07-15|1-URGENT|Clerk#000000528|0|und the regular packages. regular packages serve slyly. ideas are +28326|49|O|259350.63|1998-07-07|5-LOW|Clerk#000000545|0|furiously final instructions are furiously platelets +28327|1333|F|137572.46|1994-06-16|2-HIGH|Clerk#000000348|0|ully. pending accounts do +28352|550|O|218600.51|1998-01-03|2-HIGH|Clerk#000000283|0|e carefully bold requests. quietly regular requests haggl +28353|239|F|13759.17|1993-05-27|1-URGENT|Clerk#000000056|0|ily requests. ironic, regular sheaves haggle acc +28354|697|F|200020.04|1994-03-28|5-LOW|Clerk#000000825|0|nt deposits across the final t +28355|793|F|306581.79|1993-10-05|2-HIGH|Clerk#000000828|0|ss the regular depos +28356|841|O|6821.96|1997-11-06|1-URGENT|Clerk#000000380|0|r warthogs sleep among the furious +28357|1498|F|123974.86|1993-05-22|4-NOT SPECIFIED|Clerk#000000459|0|en instructions. blithely express de +28358|1174|F|83916.45|1994-04-08|2-HIGH|Clerk#000000826|0|r blithely carefully unusual +28359|551|O|102924.34|1997-05-03|1-URGENT|Clerk#000000207|0|sual requests are slyly quickly special packag +28384|209|O|161970.80|1997-01-06|2-HIGH|Clerk#000000869|0|uses sleep furiously. blithely final reque +28385|520|F|47060.26|1992-11-03|5-LOW|Clerk#000000710|0|tions maintain fluffily pending requests-- deposits cajole +28386|88|O|241758.22|1998-02-24|2-HIGH|Clerk#000000146|0|into beans. carefully ironic requests impr +28387|448|F|251404.83|1992-06-30|4-NOT SPECIFIED|Clerk#000000802|0| instructions. express, regular depos +28388|751|F|150373.42|1993-12-18|4-NOT SPECIFIED|Clerk#000000215|0| regular deposits according to the blithely unusual asymptotes sleep slyly ab +28389|532|F|229214.86|1994-11-04|2-HIGH|Clerk#000000974|0|ironic deposits according to th +28390|1045|F|135991.69|1992-02-08|2-HIGH|Clerk#000000496|0|eep against the final requests. regular accounts w +28391|542|O|166783.57|1997-12-31|4-NOT SPECIFIED|Clerk#000000302|0|ts. express, regular p +28416|101|O|213675.08|1996-11-06|3-MEDIUM|Clerk#000000422|0|counts. accounts promise. quickly special accounts are furiously regula +28417|4|O|209874.16|1998-01-25|3-MEDIUM|Clerk#000000515|0|ronic instructions integrate quic +28418|878|F|62503.60|1992-05-14|4-NOT SPECIFIED|Clerk#000000586|0|efully ironic platelets. pending ideas across the furiously even +28419|1030|F|44179.17|1994-11-01|5-LOW|Clerk#000000852|0| deposits nag after the careful +28420|967|F|12742.48|1994-09-25|5-LOW|Clerk#000000892|0|efully slyly final theodolites. +28421|1219|O|62538.59|1998-02-22|5-LOW|Clerk#000000038|0|ents. regular, ironic requests abou +28422|1222|O|25543.00|1997-11-11|5-LOW|Clerk#000000931|0|express, regular requests! carefully even ideas nag slyly. final depend +28423|611|O|73093.55|1996-09-16|3-MEDIUM|Clerk#000000131|0| instructions use fluffily unusual theodolites. blithely iro +28448|694|O|91349.06|1995-09-16|2-HIGH|Clerk#000000980|0|across the final requests. blithely final packages ca +28449|722|O|24116.59|1998-03-24|4-NOT SPECIFIED|Clerk#000000237|0|se deposits. furiously bold foxes d +28450|1138|O|67216.40|1998-04-21|5-LOW|Clerk#000000987|0|cajole. silent accounts integrate carefully. blithely ironic reque +28451|505|F|258691.27|1994-01-06|1-URGENT|Clerk#000000432|0| special packages. carefully regular deposits sleep cl +28452|169|O|9406.49|1997-03-15|2-HIGH|Clerk#000000380|0|ly even accounts. regular p +28453|730|F|26850.88|1992-12-29|1-URGENT|Clerk#000000710|0|foxes sleep. busy ideas are slyly. bold accounts x-ray after +28454|569|F|185716.62|1992-08-07|3-MEDIUM|Clerk#000000289|0|final requests cajole +28455|826|F|124722.71|1993-05-31|3-MEDIUM|Clerk#000000602|0|inal packages. furiously unusual theodolites c +28480|175|F|47830.79|1994-03-16|3-MEDIUM|Clerk#000000653|0|y final deposits. fluffily ironic somas caj +28481|1393|F|87786.75|1994-01-22|4-NOT SPECIFIED|Clerk#000000786|0|ackages. special instructions haggle f +28482|1483|F|77540.36|1993-03-09|1-URGENT|Clerk#000000452|0|ructions engage carefully about the furiously quie +28483|1439|O|176273.25|1997-03-05|4-NOT SPECIFIED|Clerk#000000361|0|ckly silent requests. final accounts +28484|28|O|138284.78|1998-07-31|2-HIGH|Clerk#000000235|0|hely final pinto beans. ruthlessly unusual packages integrat +28485|79|F|232640.16|1992-01-13|2-HIGH|Clerk#000000707|0|s requests wake among the slyly pending +28486|1051|F|201911.64|1994-08-27|2-HIGH|Clerk#000000598|0|ven instructions! packages cajole furiousl +28487|1237|O|49613.92|1997-09-13|4-NOT SPECIFIED|Clerk#000000396|0|inal packages; regular i +28512|1141|F|267077.80|1993-04-28|3-MEDIUM|Clerk#000000401|0|e at the carefully ironic patterns. regular +28513|1171|O|220791.71|1997-09-24|2-HIGH|Clerk#000000327|0|sly furiously enticing pinto beans- +28514|1159|O|256200.16|1998-05-30|4-NOT SPECIFIED|Clerk#000000041|0|ng the slyly regular instructions. blithely express accoun +28515|787|F|221529.31|1993-07-01|2-HIGH|Clerk#000000675|0|ent accounts. fluffily ironic pack +28516|1007|F|91109.51|1992-08-10|1-URGENT|Clerk#000000306|0| slyly regular pinto beans. fluffily special accounts boost blithe +28517|1489|O|2784.51|1996-07-07|2-HIGH|Clerk#000000968|0|press requests. pinto beans +28518|752|O|69792.33|1995-06-23|1-URGENT|Clerk#000000661|0|s wake alongside of the slyly final pinto +28519|1006|F|195778.25|1993-06-23|2-HIGH|Clerk#000000492|0|ake blithely special instructions. fluffily ironic +28544|304|F|100242.44|1992-08-29|1-URGENT|Clerk#000000055|0|l theodolites atop the final pinto beans are slyly regula +28545|770|O|129999.08|1995-08-24|2-HIGH|Clerk#000000044|0|s hang against the carefully even requests +28546|1450|F|149245.80|1992-09-25|2-HIGH|Clerk#000000671|0|lites cajole quickly e +28547|910|O|56887.40|1996-12-20|3-MEDIUM|Clerk#000000528|0|are furiously expre +28548|1219|O|211196.68|1998-01-13|3-MEDIUM|Clerk#000000572|0|ly bold accounts. quickly +28549|208|O|172607.54|1997-07-07|3-MEDIUM|Clerk#000000617|0| affix regular theodol +28550|238|P|289847.38|1995-03-21|4-NOT SPECIFIED|Clerk#000000767|0|the regular deposits. even, regular waters boost sly +28551|295|O|279637.71|1997-12-02|2-HIGH|Clerk#000000896|0|arefully blithely busy pinto beans-- carefully regular asymptotes boo +28576|394|O|124601.63|1998-04-05|1-URGENT|Clerk#000000535|0|l packages. furiously pending instructi +28577|587|O|220579.29|1996-03-04|4-NOT SPECIFIED|Clerk#000000775|0| run blithely after the deposits. ironic, bold warhorses upon the regular, un +28578|916|O|103657.27|1998-06-23|2-HIGH|Clerk#000000181|0|efully pending excuses. +28579|1306|O|62858.50|1997-10-10|3-MEDIUM|Clerk#000000456|0|ly regular instructions. regular, r +28580|491|F|17654.92|1993-08-18|2-HIGH|Clerk#000000090|0|out the busily final excuses sublate +28581|614|O|208301.25|1995-12-08|3-MEDIUM|Clerk#000000178|0|d foxes was across the final, final requ +28582|1202|F|105150.14|1992-01-23|4-NOT SPECIFIED|Clerk#000000997|0| carefully after the quickly regular accounts. regular packages a +28583|1361|F|34483.81|1994-11-13|1-URGENT|Clerk#000000053|0|around the express, ironic theodolites. enticing decoys us +28608|94|F|59686.64|1995-02-15|3-MEDIUM|Clerk#000000423|0|ravely across the ironic requests. silent pack +28609|982|O|40546.14|1997-04-19|1-URGENT|Clerk#000000509|0| boost slyly furiously silent theodolites. express accou +28610|65|O|133822.52|1996-11-14|2-HIGH|Clerk#000000429|0|kly after the fluffily ironic requests-- slyly final theodolites among the flu +28611|436|F|137509.22|1992-12-28|5-LOW|Clerk#000000877|0|olites nag according to the evenly iro +28612|1403|O|192624.16|1997-09-13|1-URGENT|Clerk#000000585|0|luffily sly requests haggle carefully fl +28613|745|O|266229.33|1996-11-06|1-URGENT|Clerk#000000675|0|haggle slyly furiously pending foxe +28614|1168|F|179379.67|1994-10-20|1-URGENT|Clerk#000000587|0|ully special decoys detect slyly around the furiously ironic requ +28615|1331|O|80527.53|1996-12-25|3-MEDIUM|Clerk#000000806|0|uffily carefully final pa +28640|574|O|128685.99|1996-03-31|5-LOW|Clerk#000000596|0|ar requests. carefully bold deposits +28641|1471|O|62569.13|1995-10-13|4-NOT SPECIFIED|Clerk#000000504|0|as. quickly final asymptotes boost about the furious +28642|932|F|157822.97|1995-01-19|2-HIGH|Clerk#000000848|0|ounts. slyly pending deposits are. ideas boost furious +28643|778|F|160576.23|1993-04-28|4-NOT SPECIFIED|Clerk#000000720|0|final, bold accounts. unusual, +28644|478|O|112395.34|1997-06-10|3-MEDIUM|Clerk#000000413|0|ial ideas nag evenly along the ca +28645|332|F|145263.45|1993-10-15|3-MEDIUM|Clerk#000000090|0|nt tithes. slyly pending excuses cajole. blithely regular courts nag int +28646|886|O|107697.76|1997-06-11|4-NOT SPECIFIED|Clerk#000000507|0|ular requests. regular requests haggle across the dependencies. express, i +28647|1351|F|924.33|1994-03-15|1-URGENT|Clerk#000000803|0|along the slyly unusual foxes sleep bol +28672|1181|O|67600.84|1995-12-09|5-LOW|Clerk#000000314|0| courts are quickly careful +28673|1091|O|16163.73|1997-10-29|5-LOW|Clerk#000000553|0|arefully pending hockey players affix slyly finally even courts. dep +28674|76|O|89797.28|1995-08-16|2-HIGH|Clerk#000000541|0|y regular pinto beans sleep slyly enticing foxes. blithe +28675|1279|F|201137.66|1994-10-09|1-URGENT|Clerk#000000635|0|refully above the slyly even req +28676|841|O|117370.86|1998-05-26|4-NOT SPECIFIED|Clerk#000000009|0|s wake furiously across the unusual dep +28677|1183|O|34218.06|1997-08-12|1-URGENT|Clerk#000000682|0|luffily pending excuse +28678|962|F|9136.24|1994-01-06|4-NOT SPECIFIED|Clerk#000000354|0|accounts. slyly busy foxes do +28679|856|O|97778.30|1995-08-26|1-URGENT|Clerk#000000571|0|unusual theodolites sleep slyly packages. slyly final instructio +28704|841|O|3029.19|1996-06-30|3-MEDIUM|Clerk#000000930|0|r theodolites cajole quickly. deposits must +28705|1102|O|288680.00|1997-12-25|5-LOW|Clerk#000000678|0|ts boost furiously blithely +28706|1042|F|45262.82|1994-06-09|1-URGENT|Clerk#000000850|0|fily pending courts nag quickly. furiously regular requests eat furiously c +28707|1360|O|131698.27|1997-01-21|3-MEDIUM|Clerk#000000681|0|t the special instructions. regular requests wake furiously dolphins +28708|949|O|56739.10|1997-02-17|3-MEDIUM|Clerk#000000637|0|e the blithely ironic waters. busily regular depos +28709|386|O|153912.25|1997-06-14|5-LOW|Clerk#000000250|0|ctions haggle furio +28710|401|F|38080.61|1992-04-14|1-URGENT|Clerk#000000669|0| use slyly slyly regula +28711|1351|F|34768.22|1994-10-24|3-MEDIUM|Clerk#000000213|0|ole along the furiously regular deposits. slyly ironic r +28736|616|F|33753.49|1994-04-22|2-HIGH|Clerk#000000720|0|ggle. packages wake +28737|796|O|234819.80|1995-10-04|1-URGENT|Clerk#000000436|0| requests. braids cajole ca +28738|218|F|279092.71|1992-08-11|3-MEDIUM|Clerk#000000339|0| fluffy requests after the express instructi +28739|1456|O|142636.73|1996-09-10|2-HIGH|Clerk#000000092|0|sits near the carefully ironic deposits boost furiously carefully +28740|937|F|164001.89|1992-10-05|4-NOT SPECIFIED|Clerk#000000290|0|ructions boost carefully. regular packages aroun +28741|277|P|139973.51|1995-03-01|4-NOT SPECIFIED|Clerk#000000432|0|lites integrate. quickly ironic packages abo +28742|1417|F|154147.99|1992-04-30|5-LOW|Clerk#000000180|0|y ironic theodolites. quickly regular r +28743|1061|O|88518.67|1996-05-12|3-MEDIUM|Clerk#000000703|0|al deposits. carefully unusual platelets cajole along the +28768|1492|O|208713.38|1996-08-07|4-NOT SPECIFIED|Clerk#000000786|0|ar, regular dolphins. ruthlessly regular courts sleep pinto bean +28769|40|F|199499.93|1993-08-29|5-LOW|Clerk#000000348|0|ess excuses use. nev +28770|421|O|211684.78|1997-07-18|5-LOW|Clerk#000000409|0|ogged deposits. theodolites haggle: ironic, f +28771|1465|F|4884.19|1992-05-07|3-MEDIUM|Clerk#000000887|0|r the slyly express packages. re +28772|52|F|353791.62|1994-02-07|2-HIGH|Clerk#000000106|0|ily ironic accounts boost after the pinto beans. requests grow against the f +28773|701|F|188942.80|1995-02-11|5-LOW|Clerk#000000580|0|furiously ironic ideas. carefully regular de +28774|364|F|134179.49|1994-01-02|2-HIGH|Clerk#000000159|0| carefully pending instructions. +28775|608|F|161192.66|1994-10-10|1-URGENT|Clerk#000000953|0|es. pinto beans sleep blithely above the quickly regular requests. ruth +28800|184|O|41157.20|1998-02-12|1-URGENT|Clerk#000000688|0|nently even accounts. even, iron +28801|107|F|85102.24|1993-09-24|4-NOT SPECIFIED|Clerk#000000786|0|ts. blithely ironic +28802|619|F|129917.86|1993-11-05|2-HIGH|Clerk#000000059|0|oxes sleep furiously silent, final accounts. quickly unus +28803|1364|O|62739.03|1996-06-22|3-MEDIUM|Clerk#000000696|0|refully final pinto beans. unusual accounts above the furiously final reques +28804|994|O|6688.98|1997-07-12|3-MEDIUM|Clerk#000000782|0| to the quickly even accounts. idly express foxes +28805|85|P|166163.11|1995-04-03|3-MEDIUM|Clerk#000000100|0|y about the carefully ironic ideas! blithely even packa +28806|697|O|151177.53|1996-09-20|2-HIGH|Clerk#000000845|0|ing packages. carefully unusual asymptotes haggle slyly ironic packages! s +28807|560|P|160287.05|1995-04-01|2-HIGH|Clerk#000000988|0|platelets sleep furiously. ironic foxes eat caref +28832|893|F|119456.37|1993-09-25|3-MEDIUM|Clerk#000000488|0|sual deposits across the carefully special packages impres +28833|668|O|73662.16|1996-03-21|2-HIGH|Clerk#000000635|0|ng, ironic accounts. deposits integrate quickly? requests according to +28834|709|O|121608.18|1996-04-17|1-URGENT|Clerk#000000815|0|ckages detect blithely. +28835|152|F|107079.38|1992-04-01|4-NOT SPECIFIED|Clerk#000000807|0| blithely carefully special instructions. requests +28836|175|F|83253.92|1993-10-25|2-HIGH|Clerk#000000921|0|beans. final, bold accounts nag after the ironic instructions. carefully re +28837|1315|F|40185.81|1993-05-17|1-URGENT|Clerk#000000203|0|nic sauternes-- slyly regular +28838|373|O|317257.33|1998-07-08|3-MEDIUM|Clerk#000000419|0|ithely express escapades. quickl +28839|464|F|158945.11|1994-04-29|5-LOW|Clerk#000000660|0|late. regular platelets use across the ironic, final theodol +28864|487|F|66072.76|1992-10-30|3-MEDIUM|Clerk#000000614|0|ackages haggle furiously slyly ironic accounts. carefully speci +28865|479|O|69325.63|1998-04-09|1-URGENT|Clerk#000000521|0|the closely pending packages sleep among the platelets. slyly final req +28866|388|O|316396.11|1997-06-15|5-LOW|Clerk#000000856|0|. slyly unusual foxes haggle furiously quickly ironic dolphins? deposi +28867|1499|O|187970.14|1995-07-23|3-MEDIUM|Clerk#000000322|0|uctions? theodolites nag furiously bold accounts. even packages t +28868|172|F|141125.33|1992-04-06|2-HIGH|Clerk#000000487|0|y final instructions may haggle slyly regular requests. final req +28869|1213|O|147389.66|1998-05-07|4-NOT SPECIFIED|Clerk#000000494|0| regular dugouts. ir +28870|869|O|189731.67|1995-11-11|2-HIGH|Clerk#000000950|0|y regular foxes. carefully spe +28871|1291|F|120449.04|1992-04-16|2-HIGH|Clerk#000000264|0|kages. fluffily ironic +28896|1144|O|115365.57|1998-07-15|2-HIGH|Clerk#000000361|0|fully slow deposits around the slyly silent requests wake along the b +28897|992|F|219397.27|1994-08-25|3-MEDIUM|Clerk#000000934|0|bold accounts. quickly bold sauternes among the carefully ironic packages cajo +28898|10|O|122287.09|1995-05-29|5-LOW|Clerk#000000423|0|the unusual packages. blithely expre +28899|1043|F|240461.91|1992-06-15|5-LOW|Clerk#000000082|0|final pinto beans haggle blithely. blithely unusual dependencies sleep quick +28900|577|O|156709.28|1996-09-02|3-MEDIUM|Clerk#000000577|0| of the furiously unusual deposits. blithe +28901|391|F|148431.61|1992-06-12|2-HIGH|Clerk#000000592|0|packages. closely silent +28902|388|F|219532.35|1992-01-24|5-LOW|Clerk#000000931|0|s. quickly ironic excuses haggle +28903|964|F|111641.55|1994-08-08|1-URGENT|Clerk#000000152|0|oggedly near the slyly final packages. ironic theod +28928|631|F|173445.67|1993-05-01|5-LOW|Clerk#000000135|0|. accounts wake carefully along the slyly sp +28929|506|F|131161.61|1992-10-10|3-MEDIUM|Clerk#000000150|0|ckages are furiously express theodolites. quickly fluffy acc +28930|1493|O|180077.86|1997-12-09|1-URGENT|Clerk#000000835|0|regular, even packages use furiously. regular theodolites na +28931|101|O|107527.47|1995-06-27|4-NOT SPECIFIED|Clerk#000000516|0|xcuses x-ray fluffily acros +28932|1114|F|141057.11|1993-07-22|5-LOW|Clerk#000000597|0|uests. silent accounts about the ironic +28933|920|F|64186.95|1994-07-10|1-URGENT|Clerk#000000706|0|quickly silent foxes. quickly special accounts against the slyly unusual +28934|650|F|145876.08|1992-11-29|3-MEDIUM|Clerk#000000259|0|carefully excuses. slyly bold deposits beneath the quickly express T +28935|829|O|161719.11|1997-11-03|1-URGENT|Clerk#000000772|0|onic ideas are slyly unusual pinto beans. boldly sly +28960|946|O|112514.50|1998-02-10|5-LOW|Clerk#000000778|0|le blithely accounts. pinto beans are among t +28961|415|O|5852.65|1997-12-09|3-MEDIUM|Clerk#000000019|0| along the slyly regular instructions nag fluffily a +28962|1141|O|79761.11|1997-08-10|2-HIGH|Clerk#000000290|0|e. slowly even inst +28963|1453|O|158185.78|1995-12-05|4-NOT SPECIFIED|Clerk#000000948|0|inal ideas. special, fin +28964|1130|O|177363.56|1997-11-26|3-MEDIUM|Clerk#000000938|0|ions. quickly ironic gifts eat quickly about the carefully close acc +28965|1402|O|161104.51|1996-05-23|5-LOW|Clerk#000000248|0|are carefully furiously final warthogs. carefully even ideas around the f +28966|736|F|20011.18|1994-09-05|4-NOT SPECIFIED|Clerk#000000833|0|egular foxes. bold foxes grow. bold gifts use carefully. ironic, unusual reque +28967|446|F|104951.80|1994-09-02|1-URGENT|Clerk#000000703|0| bold accounts. even, express pinto beans boost blith +28992|799|O|58938.09|1995-09-20|1-URGENT|Clerk#000000164|0|ual packages sleep across the quickly pending theodolites. furi +28993|803|F|42035.51|1995-03-10|3-MEDIUM|Clerk#000000588|0|ng to the furiously final packages. deposits accord +28994|263|O|185474.37|1998-06-20|3-MEDIUM|Clerk#000000109|0|ructions cajole around the pending, ironic accounts. fox +28995|938|F|295762.23|1993-05-13|2-HIGH|Clerk#000000992|0|ajole slyly within the carefully ironic foxes. ironic +28996|100|O|269546.76|1997-04-23|1-URGENT|Clerk#000000750|0|, final requests. final ideas inte +28997|884|O|139169.76|1997-10-31|5-LOW|Clerk#000000360|0|cuses cajole above the regular depo +28998|1025|F|2496.87|1992-02-28|2-HIGH|Clerk#000000580|0|thely idle instructions about the furiously special patterns nag fur +28999|1327|F|74038.96|1994-01-11|2-HIGH|Clerk#000000449|0|ironic theodolites after th +29024|1198|F|149112.99|1992-04-06|1-URGENT|Clerk#000000588|0|y ironic deposits. special requests acros +29025|739|F|45234.16|1994-06-15|3-MEDIUM|Clerk#000000982|0|ending requests use slyly regular ac +29026|931|O|131221.91|1995-08-26|4-NOT SPECIFIED|Clerk#000000624|0|olites cajole after the furiously regula +29027|547|F|260718.59|1994-07-18|3-MEDIUM|Clerk#000000587|0|lithely brave ideas. slyly unusual requests are furiously. special dolphi +29028|367|F|146795.21|1995-02-06|1-URGENT|Clerk#000000086|0| haggle furiously after the regular platelets. final pinto beans cajole blith +29029|850|O|192123.44|1997-07-25|2-HIGH|Clerk#000000439|0|s deposits sleep instructions. blithely even ideas wake slyly. unusual, exp +29030|1153|F|68221.14|1992-01-03|3-MEDIUM|Clerk#000000995|0|s. bold deposits are carefully furiously regula +29031|214|O|50196.51|1997-10-21|3-MEDIUM|Clerk#000000846|0| use blithely slyly regular dependencies +29056|719|F|238716.36|1994-12-13|4-NOT SPECIFIED|Clerk#000000738|0|thely enticingly even packages. carefully silent deposits a +29057|1244|O|286572.68|1997-06-07|1-URGENT|Clerk#000000145|0| the slyly pending accounts. daringly spe +29058|1300|F|320149.44|1993-01-04|2-HIGH|Clerk#000000782|0|ts haggle carefully slyly express braids. express, final requ +29059|799|O|177080.30|1997-11-11|5-LOW|Clerk#000000140|0| use. blithely even packages wake slyl +29060|610|O|42034.44|1997-04-29|3-MEDIUM|Clerk#000000877|0|es. foxes sleep quickly alongsi +29061|1396|O|175210.89|1997-01-13|5-LOW|Clerk#000000409|0|final, ironic waters sublate across the slyly final deposits. fluffily e +29062|1447|F|12784.23|1994-11-21|3-MEDIUM|Clerk#000000655|0|nstructions. pending asymptotes sleep furiously +29063|1270|F|184858.67|1993-05-20|2-HIGH|Clerk#000000026|0|ully above the pending, regular pinto beans. q +29088|220|O|193243.60|1997-08-27|4-NOT SPECIFIED|Clerk#000000603|0|xes? carefully dogged packages x-r +29089|458|O|268690.47|1997-03-05|4-NOT SPECIFIED|Clerk#000000584|0| affix against the slyl +29090|1024|F|206102.86|1992-01-17|3-MEDIUM|Clerk#000000898|0|es. packages use quickly carefully regular accounts. ex +29091|409|O|89829.60|1996-11-14|2-HIGH|Clerk#000000671|0|usly carefully regu +29092|1214|F|153243.80|1994-08-10|5-LOW|Clerk#000000242|0|t the accounts. fluffily express packages across the furiously +29093|136|O|95711.73|1996-11-22|4-NOT SPECIFIED|Clerk#000000278|0| against the packages. slyly final ideas +29094|1171|O|103321.73|1997-07-10|5-LOW|Clerk#000000689|0|pending requests haggle blithely final deposits. furiously +29095|1258|P|284979.70|1995-03-09|4-NOT SPECIFIED|Clerk#000000663|0|ironic instructions haggle caref +29120|1036|F|266364.97|1993-05-13|5-LOW|Clerk#000000319|0| about the ironic requests. special +29121|236|F|72973.84|1993-04-12|3-MEDIUM|Clerk#000000123|0|uriously ironic pinto beans. carefully even ideas hag +29122|616|O|164834.65|1998-05-14|4-NOT SPECIFIED|Clerk#000000767|0| carefully unusual deposits. carefully enticing foxe +29123|1492|O|151081.67|1997-03-25|4-NOT SPECIFIED|Clerk#000000521|0|uriously across the quickly silent packa +29124|1127|F|39805.95|1994-10-30|1-URGENT|Clerk#000000910|0|bold accounts are against the even requests. regular, ironic +29125|274|O|64382.57|1997-07-23|4-NOT SPECIFIED|Clerk#000000909|0|cial foxes. slyly final requests wake carefully a +29126|1393|O|117679.62|1995-07-07|4-NOT SPECIFIED|Clerk#000000836|0| dolphins. final, pending sheaves sleep fluf +29127|1132|F|134264.03|1994-04-01|1-URGENT|Clerk#000000712|0|l foxes sleep quickly: final, special deposits engage blithely along the +29152|691|O|205474.41|1995-07-24|5-LOW|Clerk#000000557|0|lithely even theodolites. furio +29153|1201|O|117315.55|1996-05-12|4-NOT SPECIFIED|Clerk#000000475|0|ccounts boost carefully. fluffily even foxes impress pending ac +29154|442|O|280844.60|1996-09-25|5-LOW|Clerk#000000788|0|ding to the accounts. regular, ironic +29155|1078|F|216704.00|1994-09-18|4-NOT SPECIFIED|Clerk#000000479|0|its. special requests among the pending requests nod fluffily +29156|1327|F|127700.37|1993-02-25|5-LOW|Clerk#000000121|0| quickly final packages. blithel +29157|358|O|29138.31|1997-02-06|1-URGENT|Clerk#000000497|0|iously bold orbits cajole carefully blithely express requests. accounts ar +29158|667|O|439687.23|1995-10-21|2-HIGH|Clerk#000000525|0|lessly quiet deposits across the furiously ironi +29159|1069|O|46278.80|1997-05-01|4-NOT SPECIFIED|Clerk#000000691|0| regular requests wake carefully ab +29184|628|F|25547.89|1992-06-30|1-URGENT|Clerk#000000104|0|unusual ideas boost furiously slyly final asymptotes. accounts are q +29185|994|F|242764.22|1993-01-21|2-HIGH|Clerk#000000396|0|kly quickly even deposits. excuses against the ruthles +29186|565|O|57301.91|1998-04-11|4-NOT SPECIFIED|Clerk#000000005|0|latelets boost quickly fluffily quick accounts. regular, ironic dep +29187|1150|F|345377.31|1994-08-01|5-LOW|Clerk#000000593|0|ly bold instructions. slyly regular ideas sleep daringly among t +29188|71|F|57668.28|1992-04-26|5-LOW|Clerk#000000040|0|ly slow deposits among +29189|1247|F|32017.36|1993-06-24|1-URGENT|Clerk#000000546|0|efully ironic theodo +29190|1261|O|23103.73|1997-01-10|1-URGENT|Clerk#000000903|0|efully. special, final accounts haggle carefully even ideas. furiously iron +29191|1232|F|311888.23|1992-06-29|3-MEDIUM|Clerk#000000090|0|platelets. regular dolphins a +29216|1324|F|129781.39|1992-12-30|1-URGENT|Clerk#000000212|0|es. fluffily final requests use quick +29217|911|O|31067.73|1997-09-08|3-MEDIUM|Clerk#000000611|0|lithely even, bold deposits. carefully silent a +29218|769|F|228861.28|1992-05-30|5-LOW|Clerk#000000411|0|uriously silent pearls alongside of the regul +29219|1405|F|167769.29|1994-04-11|4-NOT SPECIFIED|Clerk#000000050|0|e above the furiously silent +29220|1216|F|91290.78|1992-12-30|3-MEDIUM|Clerk#000000278|0|ages. final, even instructions about the fluffily ironic +29221|206|F|77795.74|1992-05-30|2-HIGH|Clerk#000000051|0|ven requests after the fluffily final theodolites bo +29222|97|O|196434.24|1998-02-20|3-MEDIUM|Clerk#000000620|0|special theodolites. slyly regular packages wake fu +29223|1099|F|224896.53|1992-01-21|2-HIGH|Clerk#000000325|0|nally. packages cajole slyly furi +29248|1177|O|196206.52|1998-03-16|1-URGENT|Clerk#000000523|0|ove the ironic gifts. quickly ironic escapades affix +29249|140|O|189072.43|1995-06-14|5-LOW|Clerk#000000789|0|ccounts. ironic ideas according to the +29250|551|F|269634.69|1992-05-18|1-URGENT|Clerk#000000393|0|deas use across the brave, pending +29251|1297|O|30456.56|1998-06-15|1-URGENT|Clerk#000000048|0|usual theodolites haggle. quickly unusua +29252|766|F|250484.38|1994-08-07|5-LOW|Clerk#000000414|0|y even packages. blithely express theodolites are above the even instructio +29253|830|O|86102.78|1997-04-13|1-URGENT|Clerk#000000984|0|fully regular grouches cajole fluffily pending pinto bea +29254|113|O|198421.51|1997-09-19|2-HIGH|Clerk#000000077|0|e even Tiresias wake fluffily around the fluffily final packages! +29255|667|O|70418.61|1995-12-04|5-LOW|Clerk#000000121|0|ages above the unusual deposits wake blithely about the final, stealthy excu +29280|1399|F|185669.79|1992-03-29|3-MEDIUM|Clerk#000000954|0|y bold ideas wake blithely. +29281|661|O|61451.48|1998-04-02|3-MEDIUM|Clerk#000000262|0|eep. blithely final pinto beans cajole furiously ruthlessly ironic accounts: +29282|1345|F|230862.55|1992-11-29|3-MEDIUM|Clerk#000000225|0|. platelets integrate aroun +29283|830|O|178381.42|1998-01-23|2-HIGH|Clerk#000000120|0|re slyly silent accou +29284|235|F|124059.47|1994-04-11|3-MEDIUM|Clerk#000000479|0|ly regular accounts. express, eve +29285|1178|O|131683.46|1997-12-14|2-HIGH|Clerk#000000919|0| the blithely express accounts. +29286|112|F|29151.16|1994-07-29|1-URGENT|Clerk#000000391|0|ake alongside of the slyly special asymptotes. busi +29287|499|F|266652.67|1994-07-03|2-HIGH|Clerk#000000757|0|cuses. close excuses haggle slyly across the quickly special +29312|433|F|67366.47|1994-12-09|1-URGENT|Clerk#000000714|0|ckages. blithely pending requests after the slyly special +29313|632|O|265532.62|1998-06-19|2-HIGH|Clerk#000000434|0|phins. regular pinto beans wake carefully alongside of th +29314|767|O|174618.73|1996-02-15|2-HIGH|Clerk#000000883|0| platelets are slyly above the regular pinto beans. furiously bold depende +29315|1474|O|69756.58|1998-07-08|1-URGENT|Clerk#000000927|0|y. slyly express packages after the dependencies boost thinly above +29316|1366|O|101975.02|1997-05-03|5-LOW|Clerk#000000814|0|ests sleep furiously doggedly special packages. pending +29317|1441|O|233340.34|1995-10-03|4-NOT SPECIFIED|Clerk#000000557|0|y according to the slyly even requests +29318|377|O|145129.74|1995-07-01|4-NOT SPECIFIED|Clerk#000000155|0|. furiously even packag +29319|527|F|153641.02|1994-01-25|5-LOW|Clerk#000000133|0|uriously even orbit +29344|1301|O|63600.02|1998-03-03|4-NOT SPECIFIED|Clerk#000000487|0|nal requests affix unusual theodolites. slyly regular foxes use carefu +29345|335|O|135710.75|1997-01-30|1-URGENT|Clerk#000000001|0|dolites. even pearls nag furiously +29346|1193|F|175352.29|1994-08-17|5-LOW|Clerk#000000548|0|ieve carefully furiously ironic +29347|946|F|208880.05|1992-08-13|3-MEDIUM|Clerk#000000936|0|slyly regular dependencies; regular, even platelets haggle depos +29348|829|O|148831.13|1998-05-31|2-HIGH|Clerk#000000141|0|ess theodolites. re +29349|1319|F|86695.52|1993-06-11|2-HIGH|Clerk#000000847|0|ate blithely since the quickly regular requests. express, e +29350|1334|F|150347.27|1994-08-26|2-HIGH|Clerk#000000575|0|sly regular packages breach blithely according to the express pin +29351|1018|O|29708.46|1995-10-04|3-MEDIUM|Clerk#000000959|0|excuses nag carefully above the final instructions. slyly unusual pinto be +29376|1103|F|144007.92|1992-08-12|1-URGENT|Clerk#000000412|0|g, ironic ideas integrate after the packages. furi +29377|512|O|45272.41|1998-03-29|2-HIGH|Clerk#000000447|0|ithely ironic attainments. silent req +29378|664|O|314784.07|1996-06-09|4-NOT SPECIFIED|Clerk#000000526|0|xpress theodolites use carefully. furiously bold theodoli +29379|709|O|234150.92|1996-08-25|1-URGENT|Clerk#000000370|0|lyly foxes; furiously special theodolites det +29380|577|F|93595.15|1994-04-28|4-NOT SPECIFIED|Clerk#000000313|0|nding ideas. carefully final gifts sleep carefully regular pinto beans. +29381|706|O|126760.38|1996-08-23|2-HIGH|Clerk#000000615|0|rts haggle blithely +29382|1441|F|169496.92|1993-11-18|2-HIGH|Clerk#000000503|0|lar theodolites wake ruthlessly. carefully bold warthogs cajole +29383|313|O|133103.96|1995-11-19|3-MEDIUM|Clerk#000000628|0| around the slyly unusual accounts. regular pinto beans abo +29408|2|F|154867.09|1993-05-03|4-NOT SPECIFIED|Clerk#000000106|0|ajole fluffily. final ac +29409|85|F|85036.75|1995-01-14|2-HIGH|Clerk#000000524|0| among the furiously ironic pi +29410|1406|F|137597.43|1994-09-18|1-URGENT|Clerk#000000310|0|eas. blithely final deposits about the even asymptotes haggle qui +29411|625|F|337745.42|1992-04-07|2-HIGH|Clerk#000000648|0| blithely regular Tiresias among the pending, even p +29412|944|F|22400.41|1992-01-18|1-URGENT|Clerk#000000754|0|ns sleep slyly slyly pending foxes. regularly even accounts are furiously pend +29413|859|F|188335.37|1994-02-15|2-HIGH|Clerk#000000740|0|counts. unusual foxes along the carefully regular p +29414|1384|O|77617.19|1997-09-22|3-MEDIUM|Clerk#000000922|0|. deposits across the regular warthogs cajole blithely against the +29415|899|F|10103.82|1994-08-12|3-MEDIUM|Clerk#000000458|0|pecial packages. ironic foxes cajole ir +29440|1280|F|93146.95|1993-04-10|5-LOW|Clerk#000000876|0|ests. final, unusual theodolites use bli +29441|1192|F|178509.53|1992-09-04|2-HIGH|Clerk#000000554|0| the carefully unusual +29442|626|O|86364.31|1998-02-08|4-NOT SPECIFIED|Clerk#000000452|0|e furiously special ideas. ex +29443|310|F|293262.72|1993-02-14|2-HIGH|Clerk#000000421|0|. blithely regular pa +29444|128|O|193876.08|1996-06-20|1-URGENT|Clerk#000000102|0|ckly regular requests are carefully enticingly ironi +29445|1304|F|41685.97|1993-09-30|2-HIGH|Clerk#000000688|0|arhorses about the even accounts use across the +29446|835|O|136474.99|1996-04-29|1-URGENT|Clerk#000000593|0|s along the quickly final grouche +29447|244|O|111726.40|1997-05-13|3-MEDIUM|Clerk#000000048|0|ic deposits. blithely pending deposits according to the spe +29472|994|F|40273.80|1993-04-05|4-NOT SPECIFIED|Clerk#000000342|0|requests. ironic, final accounts ar +29473|1469|F|215474.17|1992-02-16|3-MEDIUM|Clerk#000000514|0|tions cajole carefully pending accounts. quickly unusual request +29474|475|F|94620.84|1994-03-14|2-HIGH|Clerk#000000753|0|s cajole furiously bold pla +29475|1220|F|251196.47|1993-02-23|2-HIGH|Clerk#000000587|0|efully express deposits. slyly express packages nag blithely. deposits whithou +29476|385|O|319157.54|1997-09-22|2-HIGH|Clerk#000000381|0|y about the final, silent requests. slyly regular pinto beans sleep quickl +29477|1061|O|193127.81|1998-01-18|5-LOW|Clerk#000000501|0|uriously special asymptotes! unusual, bold accounts +29478|325|F|64070.72|1993-04-10|2-HIGH|Clerk#000000194|0|special accounts along the depths cajole furiously quick +29479|83|O|173866.95|1997-10-01|2-HIGH|Clerk#000000971|0|the final requests detect blithely across the quickly even instructions +29504|853|F|248012.86|1993-09-24|4-NOT SPECIFIED|Clerk#000000236|0|s. carefully express instructions sleep slyly a +29505|28|F|236557.05|1992-12-28|3-MEDIUM|Clerk#000000939|0|ding to the final packages integrate carefull +29506|1186|O|214687.19|1995-06-15|1-URGENT|Clerk#000000024|0| special, bold accounts. ironic instructions wake blit +29507|265|F|160907.24|1992-02-10|5-LOW|Clerk#000000811|0|into beans. furiously even theodolites are permanently slyly bold ideas. fluf +29508|79|F|17062.53|1994-07-06|2-HIGH|Clerk#000000206|0|elets. requests boost blithely unusual hockey player +29509|1447|O|78546.48|1996-04-05|4-NOT SPECIFIED|Clerk#000000788|0| slyly along the final dependencies. silent, unusual cou +29510|592|P|16145.49|1995-04-16|1-URGENT|Clerk#000000413|0|yly express instructions are a +29511|242|F|49655.46|1995-04-07|3-MEDIUM|Clerk#000000208|0|lar requests from the fluffily even theodolites x-ray carefully slyly regu +29536|494|F|216007.65|1992-09-08|3-MEDIUM|Clerk#000000833|0|unts unwind furiously up the +29537|793|F|243062.60|1992-09-20|5-LOW|Clerk#000000737|0|uickly bold theodolites maintain slyly alongside of the furiously express d +29538|505|F|23072.30|1994-12-31|3-MEDIUM|Clerk#000000619|0|pinto beans. blithely even packages lose ruthlessly. +29539|484|O|98118.11|1995-04-24|2-HIGH|Clerk#000000966|0|round the special, unus +29540|1444|O|299884.53|1997-07-21|4-NOT SPECIFIED|Clerk#000000997|0|c foxes are quickly across the accounts. blith +29541|784|F|61282.66|1994-08-03|4-NOT SPECIFIED|Clerk#000000311|0|ts cajole regularly after the c +29542|1487|O|291264.03|1998-03-16|1-URGENT|Clerk#000000357|0|the accounts detect fluffily s +29543|826|O|111585.15|1997-02-11|4-NOT SPECIFIED|Clerk#000000623|0|iously dogged asymptotes nag special +29568|1216|O|17574.64|1997-12-07|5-LOW|Clerk#000000663|0|permanent accounts. packages cajole slyly furiously pe +29569|1468|O|254519.49|1995-07-04|2-HIGH|Clerk#000000513|0|d foxes are after the blithely even +29570|224|F|113306.78|1994-08-04|5-LOW|Clerk#000000317|0|ake. furiously ironic requests under the pending reques +29571|1369|O|136361.49|1996-05-03|5-LOW|Clerk#000000685|0|kages. furiously regular deposits be +29572|1010|F|88449.12|1993-06-04|4-NOT SPECIFIED|Clerk#000000428|0| quickly alongside of the fina +29573|256|F|82817.47|1992-01-17|1-URGENT|Clerk#000000064|0|gular, ironic requests +29574|4|O|112785.17|1996-07-12|3-MEDIUM|Clerk#000000887|0|requests sleep according to the r +29575|844|F|37627.79|1992-05-23|1-URGENT|Clerk#000000556|0|r the slyly brave orbits? +29600|530|O|93594.37|1996-01-07|1-URGENT|Clerk#000000597|0|kly. bold, bold dolphins cajole foxes. carefully sp +29601|248|O|356824.50|1998-05-16|2-HIGH|Clerk#000000102|0|blithely ironic packages. quickly express instructions wake thinly. even +29602|230|O|80693.12|1997-12-12|2-HIGH|Clerk#000000781|0|tions. express pinto beans among the never express platelets might cajole arou +29603|359|O|258025.18|1998-07-28|2-HIGH|Clerk#000000988|0|es. slyly even asymptotes haggle alongside of the blithely regular t +29604|668|F|101723.18|1993-01-26|1-URGENT|Clerk#000000947|0|slyly. fluffily silent packages sl +29605|248|F|134261.45|1993-01-06|4-NOT SPECIFIED|Clerk#000000980|0|usual patterns. furiously final patterns abo +29606|785|O|122230.37|1998-04-30|2-HIGH|Clerk#000000221|0|ves use blithely across the furiously special pinto beans. b +29607|496|F|119844.75|1992-03-14|3-MEDIUM|Clerk#000000707|0|c, unusual requests cajole ruthlessly along the slyly regular excuses? furiou +29632|149|F|69749.97|1993-08-17|3-MEDIUM|Clerk#000000107|0|. brave pinto beans breach slyly bold, final pinto be +29633|827|F|57222.30|1994-06-23|1-URGENT|Clerk#000000467|0|ending deposits wake thinly. exp +29634|106|F|190178.48|1994-12-04|5-LOW|Clerk#000000495|0| deposits kindle. quickly express foxes +29635|14|O|220655.30|1997-10-08|5-LOW|Clerk#000000071|0|l instructions against the slyly pending +29636|943|F|198992.07|1992-12-30|2-HIGH|Clerk#000000195|0|ts cajole furiously above the final excuses. carefully bo +29637|371|F|153772.80|1994-05-26|2-HIGH|Clerk#000000438|0|ending packages cajole quickly above the silent do +29638|1007|O|115946.58|1995-10-25|3-MEDIUM|Clerk#000000712|0|uickly permanent deposits may nag slyly. quietly ironic packages alongside of +29639|1247|P|196902.71|1995-04-18|1-URGENT|Clerk#000000092|0|telets are carefully final dolphins. slyly final acco +29664|1321|O|234570.06|1997-03-24|1-URGENT|Clerk#000000289|0|yly final deposits. ironic packages among the regular requests hagg +29665|466|O|154140.91|1996-04-04|1-URGENT|Clerk#000000458|0|deposits nag above the w +29666|1114|O|243996.84|1995-12-31|4-NOT SPECIFIED|Clerk#000000590|0|out the ironic, ruthless requests snooze furiously slyly stealthy +29667|208|F|166546.33|1994-07-25|4-NOT SPECIFIED|Clerk#000000392|0|. carefully final pa +29668|1300|O|226658.89|1996-12-21|4-NOT SPECIFIED|Clerk#000000925|0|press patterns! regular, unusual accounts sleep quickly around the regular +29669|76|O|41499.28|1996-03-09|2-HIGH|Clerk#000000966|0|bove the carefully expre +29670|1304|F|12832.31|1994-03-07|5-LOW|Clerk#000000251|0|nic packages. fluffily regular packages are furiously; instruction +29671|485|F|202823.33|1993-03-23|1-URGENT|Clerk#000000083|0|regular foxes unwind slyly. quickly regular +29696|1348|O|80618.75|1996-07-02|1-URGENT|Clerk#000000043|0|uriously even dolphins nod furiously. fluffy +29697|490|O|71674.19|1997-03-03|1-URGENT|Clerk#000000537|0|tegrate blithely theo +29698|175|O|34614.47|1996-06-27|2-HIGH|Clerk#000000878|0|eans wake carefully along the close, final requests. ironi +29699|838|O|201389.31|1996-02-24|1-URGENT|Clerk#000000199|0|ests. final, special ideas sleep +29700|1118|F|76204.06|1993-04-07|3-MEDIUM|Clerk#000000464|0|nst the furiously ironic dependencies +29701|226|O|55542.22|1997-07-01|4-NOT SPECIFIED|Clerk#000000791|0|ages. carefully idle requests +29702|986|F|244294.92|1994-04-24|2-HIGH|Clerk#000000785|0|e carefully regular packages kind +29703|1202|O|133908.11|1996-07-02|2-HIGH|Clerk#000000754|0|. doggedly daring packages after the furiously even ideas haggle about the fur +29728|1448|O|44233.86|1998-06-08|2-HIGH|Clerk#000000794|0|rding to the even requests. quickly final platelets run requests. ir +29729|124|O|141336.52|1996-01-09|2-HIGH|Clerk#000000332|0|carefully about the deposits. sly warhorses cajole carefully fu +29730|1051|F|171813.62|1993-06-17|1-URGENT|Clerk#000000359|0|ironic deposits wake at the carefully regular +29731|37|O|117601.66|1995-11-22|1-URGENT|Clerk#000000601|0| along the bold requests. regular packages wake. carefully f +29732|121|F|180490.66|1992-12-13|3-MEDIUM|Clerk#000000489|0| ruthless accounts alongside of the slyly exp +29733|1285|O|48658.40|1996-09-12|1-URGENT|Clerk#000000079|0| blithely regular packages. slyly unusual accounts poach across +29734|1156|O|87052.11|1996-09-24|2-HIGH|Clerk#000000824|0|ions. even pinto beans x-ray furiously after the excuses-- furiously +29735|571|O|139749.24|1996-10-06|2-HIGH|Clerk#000000979|0|eas about the regular, even foxes sleep inside the fluffily express courts +29760|94|O|198688.88|1996-02-27|4-NOT SPECIFIED|Clerk#000000715|0|c deposits sleep. carefully +29761|427|F|116856.53|1992-07-04|3-MEDIUM|Clerk#000000014|0| deposits. quickly express requests use about the +29762|610|F|282432.73|1993-08-04|1-URGENT|Clerk#000000177|0|c dugouts. final requests alongside of th +29763|1162|O|13613.10|1996-07-19|4-NOT SPECIFIED|Clerk#000000705|0|ajole. quickly regular accounts boost carefully final accounts. reg +29764|538|F|90154.58|1992-07-23|1-URGENT|Clerk#000000036|0|lyly final theodolites. furiously bold requests wake carefully f +29765|835|F|150219.59|1992-07-04|1-URGENT|Clerk#000000416|0|ongside of the furiously even account +29766|700|F|258556.48|1994-03-22|3-MEDIUM|Clerk#000000107|0| slyly slyly final theodolites. slyly +29767|214|F|238383.62|1995-02-06|2-HIGH|Clerk#000000844|0|old excuses. carefully express deposits slee +29792|670|F|108663.40|1993-02-20|1-URGENT|Clerk#000000862|0|gular ideas are fluffily. ironic ac +29793|721|O|245177.12|1997-08-14|1-URGENT|Clerk#000000547|0|sits among the bold requests wake +29794|1025|F|36330.99|1994-01-09|1-URGENT|Clerk#000000726|0|tions wake slyly after the ironic requests. regular pinto beans +29795|1432|O|97344.96|1995-11-26|2-HIGH|Clerk#000000533|0|ironic packages. fluffily blithe accounts haggle slyly bo +29796|1169|O|129925.42|1998-05-27|2-HIGH|Clerk#000000511|0|ideas above the instructions use +29797|274|F|161055.11|1993-06-27|2-HIGH|Clerk#000000645|0|carefully above the silent deposits. carefully pending package +29798|1301|O|215977.84|1996-02-01|3-MEDIUM|Clerk#000000535|0|lar multipliers cajole regular d +29799|517|F|229970.75|1994-02-01|2-HIGH|Clerk#000000889|0|ual excuses affix ironically alongside of the unusual d +29824|1384|F|55485.52|1994-12-30|1-URGENT|Clerk#000000159|0| pinto beans haggle bold +29825|1466|F|11774.01|1994-07-09|5-LOW|Clerk#000000552|0|hless deposits are. bl +29826|358|F|204328.47|1994-09-25|1-URGENT|Clerk#000000707|0|se fluffily regular requests. quickly ironic instructions cajole q +29827|901|O|192417.76|1995-07-15|1-URGENT|Clerk#000000699|0|elets. doggedly even foxes boost quickly. regular, bold accounts doub +29828|886|O|20820.47|1995-08-17|1-URGENT|Clerk#000000928|0|ular packages. blithely express r +29829|706|O|68936.00|1997-02-10|2-HIGH|Clerk#000000403|0|g requests boost. carefully special packages wake slyly bold, fin +29830|775|F|38955.60|1995-01-13|2-HIGH|Clerk#000000774|0|yly ironic accounts. deposits sleep blithely alongside of the carefully +29831|1189|F|219889.83|1992-03-30|1-URGENT|Clerk#000000964|0|counts. slyly regul +29856|769|F|147868.33|1992-06-09|3-MEDIUM|Clerk#000000634|0|lithely regular accounts along the furiously re +29857|295|F|94651.02|1994-12-13|3-MEDIUM|Clerk#000000364|0|deposits are furiously across the carefully +29858|1271|F|30388.13|1994-01-31|5-LOW|Clerk#000000332|0|posits. foxes boost. express, express requests in +29859|82|O|85571.13|1997-08-04|5-LOW|Clerk#000000893|0|manent deposits. even theodolites after the blithely enticing requests wake +29860|98|F|117318.65|1994-09-14|1-URGENT|Clerk#000000673|0|unts can haggle quickly unusual requests. slyly enticing dependencies b +29861|205|F|94956.47|1992-04-26|1-URGENT|Clerk#000000313|0|al packages. bold ideas cajole quickly according to the permanent requests +29862|511|O|182428.60|1995-06-20|3-MEDIUM|Clerk#000000514|0|ng waters sublate always since the dugouts. permanent, express hockey players +29863|965|O|175621.08|1996-09-26|5-LOW|Clerk#000000756|0|gular, express accounts ar +29888|1300|F|210233.89|1992-01-17|1-URGENT|Clerk#000000890|0|ffily unusual instru +29889|1207|F|54912.48|1994-12-05|4-NOT SPECIFIED|Clerk#000000996|0|cial theodolites wake furiously regular requests. fluff +29890|413|F|86048.89|1993-03-06|1-URGENT|Clerk#000000327|0|al dependencies after the express, unusua +29891|472|O|169124.01|1996-05-19|3-MEDIUM|Clerk#000000289|0|e final, regular packages. slyly silent packages cajole carefully. bold +29892|1310|F|282853.32|1992-11-24|2-HIGH|Clerk#000000136|0|he blithely bold requests. regular re +29893|1049|F|262696.09|1992-06-17|3-MEDIUM|Clerk#000000596|0|ully after the blithely ironic deposits. slyly reg +29894|251|F|287583.08|1993-09-08|5-LOW|Clerk#000000633|0|t the final excuses. slyly special theodolites eat th +29895|340|F|165038.04|1993-10-21|3-MEDIUM|Clerk#000000922|0|longside of the unusual, ironic excuses; blithely final waters i +29920|1411|O|147802.83|1996-02-11|4-NOT SPECIFIED|Clerk#000000372|0|ckages detect. theo +29921|1459|F|49279.43|1992-03-24|3-MEDIUM|Clerk#000000955|0|quickly bold requests alongside of the regular theod +29922|719|O|179767.72|1996-03-21|2-HIGH|Clerk#000000916|0|e of the silent deposits wake blithely whithout the final accounts. blithel +29923|965|F|164493.31|1994-09-14|5-LOW|Clerk#000000267|0|xes. blithely unusual packages doze. frays run alongside +29924|374|O|198516.52|1997-07-30|3-MEDIUM|Clerk#000000898|0| orbits use carefully above +29925|1063|O|60565.18|1998-02-09|3-MEDIUM|Clerk#000000352|0|gular foxes cajole blithely along +29926|1291|F|67656.82|1992-03-23|3-MEDIUM|Clerk#000000282|0|ly carefully ironic deposits. express deposits boost. +29927|923|F|144526.31|1992-11-08|2-HIGH|Clerk#000000152|0|ns. regular accounts cajole. deposits cajole slyly across the q +29952|893|O|124957.85|1996-08-30|2-HIGH|Clerk#000000640|0|ts. carefully ironic ideas boost blithely among the ironic, r +29953|814|F|166084.88|1995-02-08|1-URGENT|Clerk#000000158|0| unusual accounts cajole carefully along the requests. instructions +29954|220|O|212422.10|1996-01-08|4-NOT SPECIFIED|Clerk#000000202|0|ymptotes. fluffily regular theodolites ca +29955|511|O|113032.94|1996-03-18|2-HIGH|Clerk#000000545|0|ts. packages cajole after the blithely stealthy +29956|2|F|116247.57|1994-08-15|1-URGENT|Clerk#000000566|0|nts use carefully. bli +29957|889|F|242357.08|1993-03-14|1-URGENT|Clerk#000000390|0|ingly. furiously pending excu +29958|1027|F|169165.36|1995-01-07|2-HIGH|Clerk#000000540|0|usly pending packages with the slyly r +29959|782|O|76315.64|1996-02-29|2-HIGH|Clerk#000000835|0|blithely. final asymptotes are carefully +29984|316|F|69025.47|1994-03-06|4-NOT SPECIFIED|Clerk#000000833|0| ironic theodolites us +29985|836|F|101093.43|1992-07-12|1-URGENT|Clerk#000000794|0|the slyly bold theodolites-- carefully regular accounts cajole sly +29986|970|O|119799.09|1995-07-04|1-URGENT|Clerk#000000181|0|enticingly ironic instructions wake along the furiously special req +29987|412|O|20692.68|1997-06-17|3-MEDIUM|Clerk#000000226|0|theodolites engage. quickly even hockey players serve carefully. furiously fin +29988|478|F|50074.52|1994-06-13|2-HIGH|Clerk#000000195|0|deposits are. furiously special acco +29989|430|F|28062.96|1994-07-25|4-NOT SPECIFIED|Clerk#000000701|0|le. final accounts of the furiously final t +29990|256|F|74106.76|1993-11-12|1-URGENT|Clerk#000000779|0|nst the slyly regular foxes haggle alongside of the special, unusual forge +29991|937|F|164767.44|1992-10-06|5-LOW|Clerk#000000036|0|e the fluffily ironic requests. regular +30016|683|F|272201.91|1994-01-04|1-URGENT|Clerk#000000962|0|e the accounts. sly +30017|1351|O|235781.23|1997-12-28|4-NOT SPECIFIED|Clerk#000000557|0|ss the regular instructions. fluffily express pinto beans c +30018|661|O|63181.38|1997-01-13|5-LOW|Clerk#000000384|0|ic accounts. blithely ironic requests sho +30019|1349|O|344173.12|1997-10-27|5-LOW|Clerk#000000346|0|ets! bravely express packages cajole fluffily acros +30020|41|O|170338.18|1997-07-29|3-MEDIUM|Clerk#000000011|0|furiously. quickly regular foxes wake slyly slyly final deposits. +30021|1252|F|73044.50|1993-03-13|1-URGENT|Clerk#000000727|0|epitaphs after the slyly special requests haggle carefully across the fur +30022|271|O|118580.74|1996-05-08|5-LOW|Clerk#000000750|0|es along the even requests sleep blithely final requests. asymptotes engage ag +30023|278|F|146206.32|1993-10-16|5-LOW|Clerk#000000935|0|posits nag carefully after the carefully blithe accounts. blithe +30048|62|O|41258.85|1995-06-14|3-MEDIUM|Clerk#000000326|0|equests around the carefully ironic +30049|403|O|126162.35|1996-01-02|2-HIGH|Clerk#000000513|0|arefully asymptotes +30050|499|F|162485.73|1993-06-20|3-MEDIUM|Clerk#000000782|0|cajole fluffily alongs +30051|235|F|109781.14|1992-03-21|4-NOT SPECIFIED|Clerk#000000854|0|ole slyly among the ironically regular depos +30052|565|O|135911.36|1998-03-08|1-URGENT|Clerk#000000546|0|s sleep fluffily qui +30053|1136|F|253851.03|1994-02-02|1-URGENT|Clerk#000000630|0|ld requests. furiously express +30054|140|F|187828.68|1992-09-02|4-NOT SPECIFIED|Clerk#000000265|0|inal packages affix fluf +30055|1199|F|146046.50|1993-04-17|5-LOW|Clerk#000000657|0|requests. final acco +30080|899|O|148521.68|1997-07-27|1-URGENT|Clerk#000000064|0|use blithely among the final theodolites. final accounts are +30081|1360|O|51414.12|1995-12-18|2-HIGH|Clerk#000000151|0|pendencies are. regularl +30082|268|O|197137.92|1996-12-13|1-URGENT|Clerk#000000788|0|ular, regular dependencies are regularly about the furio +30083|263|F|120287.00|1994-01-09|4-NOT SPECIFIED|Clerk#000000842|0| requests haggle blithely a +30084|1310|O|92146.04|1997-10-20|2-HIGH|Clerk#000000009|0|affix. carefully regular re +30085|1132|O|144669.36|1996-07-20|1-URGENT|Clerk#000000569|0|usly. blithely special requests sleep blithely around the even +30086|1067|O|212445.42|1996-07-01|2-HIGH|Clerk#000000602|0|. carefully unusual instructions print blithely along the ironic +30087|283|F|171643.93|1993-09-20|2-HIGH|Clerk#000000020|0| wake furiously beside the slyly final theodo +30112|955|F|74621.66|1993-02-23|2-HIGH|Clerk#000000582|0|dependencies according to the quickly bold realms are care +30113|115|F|28603.89|1992-02-01|5-LOW|Clerk#000000894|0|usly even foxes affix to the regular accounts. regul +30114|1277|F|35494.00|1993-08-17|5-LOW|Clerk#000000638|0|es. final requests along the instructions use blith +30115|670|O|47427.43|1997-12-27|2-HIGH|Clerk#000000577|0|press accounts use slyly. regularly express re +30116|628|O|127172.26|1998-04-05|5-LOW|Clerk#000000037|0|ilent courts over the slyly +30117|698|F|13013.20|1993-06-13|3-MEDIUM|Clerk#000000067|0|ding foxes. excuses do sleep boldly befo +30118|1156|F|179574.68|1993-03-15|5-LOW|Clerk#000000832|0| haggle? final brai +30119|391|O|181527.00|1998-06-11|1-URGENT|Clerk#000000724|0|structions cajole furious instructi +30144|769|O|165179.60|1995-08-07|5-LOW|Clerk#000000538|0|efully ironic excuses cajole quickly. slyly +30145|418|O|181843.92|1998-06-22|2-HIGH|Clerk#000000779|0|leep according to the special excuses. slyly special requests wake slyly. +30146|1219|O|21857.34|1998-04-10|2-HIGH|Clerk#000000622|0|gage furiously. quick +30147|901|F|110980.66|1992-06-18|4-NOT SPECIFIED|Clerk#000000975|0|ly. furious hockey players use carefully regular ideas. ironic pack +30148|1028|O|218465.96|1997-06-07|3-MEDIUM|Clerk#000000807|0|ges. slyly regular excuses sleep blithely fur +30149|385|F|228982.72|1993-12-13|3-MEDIUM|Clerk#000000474|0|leep against the express requests. furiously brave not +30150|1183|F|36894.78|1993-10-05|1-URGENT|Clerk#000000169|0|osits. final accounts was slyly among the final dependencies. special, regul +30151|1426|F|145211.38|1995-01-30|4-NOT SPECIFIED|Clerk#000000555|0|ar accounts. daringly pendin +30176|1003|F|115102.33|1994-04-20|5-LOW|Clerk#000000037|0|mong the packages. idly express requests use carefully. instru +30177|278|F|12532.41|1992-10-25|1-URGENT|Clerk#000000998|0|o beans integrate final platelets. furious +30178|167|F|86449.25|1992-11-23|2-HIGH|Clerk#000000136|0|uests. bold platelets haggle furiously. special, regular instructions +30179|1477|O|192825.05|1997-10-31|2-HIGH|Clerk#000000910|0|uffily ironic foxes haggle slyly behi +30180|334|O|153212.32|1997-01-06|3-MEDIUM|Clerk#000000774|0|ly unusual pinto beans. fluffily ironic package +30181|1373|O|64824.45|1996-07-15|4-NOT SPECIFIED|Clerk#000000519|0|ves. carefully ironic requests are carefully special ideas. carefull +30182|802|F|24092.12|1995-01-09|3-MEDIUM|Clerk#000000139|0|inal requests. carefully ironic deposits +30183|476|O|179491.94|1997-06-10|5-LOW|Clerk#000000454|0|s about the quickly special instructi +30208|298|F|354579.92|1992-07-17|5-LOW|Clerk#000000063|0|hely ironic ideas at the furiously regular hoc +30209|1061|F|71069.26|1994-10-31|2-HIGH|Clerk#000000920|0|ffily pending excuses nag fluffily. furiously even pac +30210|767|O|154277.94|1998-03-01|2-HIGH|Clerk#000000021|0|beans. blithely final foxes cajole carefully after the slyly final accounts +30211|1000|F|250118.97|1993-06-08|3-MEDIUM|Clerk#000000901|0|uriously ironic patterns doubt requests. slyly express asymptotes na +30212|938|O|218279.27|1997-11-10|2-HIGH|Clerk#000000769|0|re furiously carefully bold requests. +30213|787|F|8375.23|1993-04-16|5-LOW|Clerk#000000732|0|ments nag slyly quickly ironic packages. fluffily +30214|71|F|182747.86|1994-10-05|5-LOW|Clerk#000000341|0| the silent patterns +30215|157|F|272558.20|1994-02-27|3-MEDIUM|Clerk#000000034|0|riously final requests above the quickly even foxe +30240|1352|O|179090.77|1998-03-17|5-LOW|Clerk#000000911|0|y above the quickly final dolphins. furiously even instr +30241|211|O|148701.92|1997-08-24|5-LOW|Clerk#000000100|0|s sleep alongside of the requests. carefully regular +30242|8|O|100684.47|1998-04-21|2-HIGH|Clerk#000000817|0|ccounts. careful accounts are busily against the bold, pending pinto b +30243|409|F|192450.36|1993-05-06|1-URGENT|Clerk#000000295|0|affix carefully quiet deposits! boldly final dinos a +30244|730|O|85337.92|1996-07-23|2-HIGH|Clerk#000000733|0|epths cajole quickly against the final requests. slyly exp +30245|766|O|142728.22|1997-12-17|4-NOT SPECIFIED|Clerk#000000647|0|y. slyly final platelets boost regularly furiously even instruct +30246|1229|O|104371.12|1996-10-21|1-URGENT|Clerk#000000976|0|blithely express packages against the unusual instructi +30247|370|O|169426.67|1998-05-02|4-NOT SPECIFIED|Clerk#000000379|0|nusual accounts cajole slowly ironic instructions. blithely ironic deposits +30272|1030|O|51900.14|1996-06-29|2-HIGH|Clerk#000000571|0|even packages sleep. final requests are blith +30273|376|O|179938.85|1997-01-21|4-NOT SPECIFIED|Clerk#000000157|0|ously regular pinto beans. quick +30274|674|O|183101.17|1997-10-03|1-URGENT|Clerk#000000943|0|sly along the ironic, final pinto beans. express b +30275|646|O|78879.39|1997-10-10|3-MEDIUM|Clerk#000000892|0|uctions boost quickly slyly regular accounts. accounts na +30276|998|O|166359.95|1995-08-27|5-LOW|Clerk#000000057|0| the quickly regular deposits. blithely even i +30277|1348|O|152441.63|1998-01-10|1-URGENT|Clerk#000000077|0|carefully regular packages nag quickly. furiously ironic platelets cajole o +30278|1340|F|34906.51|1994-10-01|5-LOW|Clerk#000000503|0| special requests? carefully sly accounts are fluffily unusual instruc +30279|1031|O|257701.37|1995-12-08|1-URGENT|Clerk#000000852|0|fully toward the final instructions. even pinto beans are carefully. ca +30304|526|O|124807.52|1995-06-15|1-URGENT|Clerk#000000731|0|refully special accounts need to boost. slyly even theodolites along the expr +30305|1412|F|135115.78|1992-04-17|5-LOW|Clerk#000000382|0| express foxes shall have to integrate quic +30306|10|O|30726.71|1995-06-15|4-NOT SPECIFIED|Clerk#000000707|0|gular, busy grouches detect furiously. dogg +30307|1024|F|101119.10|1992-05-02|2-HIGH|Clerk#000000186|0|haggle carefully orbits. carefully +30308|779|F|64475.61|1993-03-22|3-MEDIUM|Clerk#000000810|0|ironic, ironic instructions wake +30309|551|O|39756.17|1996-09-21|1-URGENT|Clerk#000000275|0|! regular ideas haggle unusual accounts. sly +30310|1342|F|120672.64|1992-04-27|3-MEDIUM|Clerk#000000386|0|hely even accounts was furiously. special, regular requests sleep carefully s +30311|1285|F|164017.84|1992-08-07|4-NOT SPECIFIED|Clerk#000000866|0|oughout the furiously ironic tithes cajole carefully exp +30336|773|F|172790.76|1993-01-30|3-MEDIUM|Clerk#000000830|0|c dependencies. ideas integrate slyly. slyly final packages lose furiously +30337|259|O|104270.45|1997-05-13|2-HIGH|Clerk#000000013|0|e. regular packages wake accord +30338|1081|O|50539.31|1997-12-21|3-MEDIUM|Clerk#000000859|0|p doggedly furiously regular excuses. regular, regular ideas nag +30339|995|F|233382.59|1993-04-27|3-MEDIUM|Clerk#000000127|0| pending, regular acc +30340|686|F|266536.75|1994-11-11|3-MEDIUM|Clerk#000000966|0| requests nag fluffily along the furiously express ideas. quickl +30341|142|F|206645.67|1994-02-01|5-LOW|Clerk#000000204|0| platelets haggle furi +30342|1253|O|198394.50|1998-02-11|4-NOT SPECIFIED|Clerk#000000446|0|blithely final pinto beans sleep furiously ironic theodolites. f +30343|455|F|249043.33|1992-05-22|1-URGENT|Clerk#000000456|0|finally unusual dolphins sublate slyly among the blith +30368|769|O|22459.42|1997-12-02|3-MEDIUM|Clerk#000000999|0|g to the furiously ironic +30369|1141|F|189106.82|1995-03-25|1-URGENT|Clerk#000000067|0|nic accounts are slyly. furiously even accounts wake above +30370|259|F|64828.60|1993-03-01|4-NOT SPECIFIED|Clerk#000000246|0|furiously regular accounts. +30371|431|O|99002.56|1997-01-06|1-URGENT|Clerk#000000487|0|ckages. special, even ac +30372|418|F|224503.42|1993-08-31|2-HIGH|Clerk#000000589|0|equests nag. quickly stealthy accounts hang slyly past the b +30373|193|O|240371.98|1996-10-14|5-LOW|Clerk#000000151|0|y past the slyly ironic requests. furiously express pinto beans among the +30374|1100|F|148526.49|1993-03-22|1-URGENT|Clerk#000000726|0|y regular deposits haggle carefully above the accou +30375|79|F|144907.69|1992-05-04|5-LOW|Clerk#000000473|0| alongside of the ironic t +30400|775|O|167364.20|1997-02-17|4-NOT SPECIFIED|Clerk#000000602|0|equests wake slyly blithely ruthless deposit +30401|925|F|26668.62|1992-10-19|3-MEDIUM|Clerk#000000837|0| blithely express instructions after the ironic ideas brea +30402|554|F|213683.65|1994-06-19|1-URGENT|Clerk#000000177|0|sts. requests sleep quickly. furiously regular accounts are fluffily. +30403|1216|F|183888.96|1992-07-11|2-HIGH|Clerk#000000643|0|egular deposits are quickl +30404|1384|F|31385.29|1994-02-27|2-HIGH|Clerk#000000459|0|special, final requests mold furiously bold deposits-- quickly ironic dependen +30405|634|F|12672.87|1992-04-29|5-LOW|Clerk#000000881|0|lly special packages cajole slyly? dependenc +30406|832|F|140427.27|1994-06-17|3-MEDIUM|Clerk#000000779|0|ound the pinto beans. blithely ironic theodoli +30407|889|F|158680.21|1994-04-18|5-LOW|Clerk#000000138|0|o the ideas use alongside of the ideas. foxes are slyly carefully exp +30432|293|F|144621.03|1994-02-27|3-MEDIUM|Clerk#000000907|0|refully accounts. unusual foxes wake slyly slyly regular requests. furio +30433|643|F|158101.53|1993-06-10|3-MEDIUM|Clerk#000000821|0|wake furiously. express instructions at the instru +30434|871|O|64737.78|1996-10-31|2-HIGH|Clerk#000000981|0|p fluffily. carefully re +30435|253|O|127671.91|1998-05-24|5-LOW|Clerk#000000114|0|nding packages? unusual, special courts along the ruthless pinto beans nag ca +30436|1357|F|150717.44|1992-07-08|5-LOW|Clerk#000000694|0|times alongside of the quickly regular theodolites. sent +30437|218|O|116313.27|1996-08-16|5-LOW|Clerk#000000847|0|pecial, idle packages. slyly blithe packages wake. ironi +30438|1327|O|67338.84|1997-06-05|3-MEDIUM|Clerk#000000740|0|slyly careful platelets unwind +30439|697|F|30471.51|1995-04-12|4-NOT SPECIFIED|Clerk#000000071|0|onic foxes. quickly silent theodolites doze quickly slyly blithe dep +30464|62|O|190534.63|1997-08-23|2-HIGH|Clerk#000000933|0|usly across the quickly unusual requests. express accounts a +30465|1184|F|46140.04|1994-04-07|2-HIGH|Clerk#000000212|0|ally unusual accounts are regular accounts. unusual, unusua +30466|500|O|103491.95|1996-01-30|1-URGENT|Clerk#000000519|0| dependencies despite the packages sleep carefully after th +30467|982|F|95827.17|1994-08-16|1-URGENT|Clerk#000000051|0|sly express accounts caj +30468|185|F|25352.65|1993-03-28|2-HIGH|Clerk#000000867|0|into beans sleep about the carefully special packages. even, +30469|874|F|68639.89|1992-12-26|4-NOT SPECIFIED|Clerk#000000816|0|ecial packages print. slyly ir +30470|808|F|285477.32|1993-12-27|2-HIGH|Clerk#000000084|0|al requests? closely ironic epitaphs against the packag +30471|935|O|145048.60|1998-05-14|3-MEDIUM|Clerk#000000857|0|ages impress stealthily. ironic realms haggle carefully permanent +30496|550|O|50209.31|1998-06-27|1-URGENT|Clerk#000000056|0|s. pinto beans wake blithely along the slowly regular packages. +30497|947|F|252042.28|1995-02-07|1-URGENT|Clerk#000000586|0|y unusual deposits run quickly after the ironic deposits. slyly final deposi +30498|613|O|37513.90|1998-04-30|2-HIGH|Clerk#000000794|0|ithely regular accounts sleep fluffily special asymp +30499|1237|F|194415.79|1992-10-31|2-HIGH|Clerk#000000662|0|efully regular packages sleep bold ideas. regular depo +30500|1478|O|231350.65|1998-04-03|1-URGENT|Clerk#000000171|0|onic dependencies nod. furiously express packages cou +30501|70|O|25899.97|1997-04-18|2-HIGH|Clerk#000000893|0|late carefully. quickly +30502|247|F|26388.69|1995-05-16|1-URGENT|Clerk#000000733|0| integrate slyly even packages. finally unusual pinto beans against th +30503|1127|F|13245.77|1994-04-04|3-MEDIUM|Clerk#000000961|0| snooze. theodolites must thrash +30528|955|F|52787.71|1993-07-18|5-LOW|Clerk#000000657|0|nusual, final deposit +30529|134|F|180311.22|1994-08-05|5-LOW|Clerk#000000927|0|gular forges affix blithely against the pending, silent deposits. slyly +30530|628|O|24131.71|1996-08-01|2-HIGH|Clerk#000000734|0|n courts use slyly. dependencies doze. unusual, final packages sleep slyly. bl +30531|833|O|45093.22|1996-11-27|3-MEDIUM|Clerk#000000018|0|l ideas. bold, ironic acco +30532|1018|O|114688.41|1995-11-27|2-HIGH|Clerk#000000255|0|egular, regular packages cajole quickly final decoys. b +30533|277|F|257122.63|1994-10-03|5-LOW|Clerk#000000222|0| across the carefully ironic foxes. regular, even pinto beans are aga +30534|55|F|84203.70|1995-02-10|1-URGENT|Clerk#000000818|0|ests engage carefully after the pending foxes. furiously iron +30535|280|O|160725.21|1996-02-11|5-LOW|Clerk#000000788|0|e slyly. blithely quick ideas use. carefully dogged dependencies print care +30560|826|O|230357.87|1996-08-31|2-HIGH|Clerk#000000129|0|escapades. slyly even requests about the sly, final dependencies wake fluf +30561|296|F|112920.56|1994-02-09|5-LOW|Clerk#000000859|0|- regular, even multipliers cajole slyly. furiously ironic theo +30562|1211|F|14381.24|1992-11-02|2-HIGH|Clerk#000000050|0|ly final packages are quickly above the furiously final requests. +30563|1417|O|129501.87|1996-03-19|4-NOT SPECIFIED|Clerk#000000332|0|final, ironic accounts: slyly expre +30564|202|F|168174.58|1994-02-27|1-URGENT|Clerk#000000283|0|usly. fluffily brave requests haggle. slyly fi +30565|1081|O|242401.86|1995-07-27|3-MEDIUM|Clerk#000000192|0| accounts: quickly final waters are ca +30566|223|O|98151.95|1995-07-02|5-LOW|Clerk#000000877|0|r packages. quickly even asymptotes acros +30567|839|F|259363.44|1994-01-15|4-NOT SPECIFIED|Clerk#000000603|0|osits. fluffily special dinos are furiously. blithely unusual deposits de +30592|538|O|346813.52|1996-09-14|1-URGENT|Clerk#000000994|0|r packages according to the fu +30593|710|O|180032.08|1995-07-26|1-URGENT|Clerk#000000050|0|nic deposits haggle blithely ag +30594|962|O|118812.32|1997-10-26|2-HIGH|Clerk#000000577|0|lar, ironic dolphins. pending, unusual fo +30595|211|O|109613.77|1996-09-16|2-HIGH|Clerk#000000358|0| regular deposits affix +30596|1426|O|232676.58|1998-04-02|2-HIGH|Clerk#000000528|0|mong the evenly final frays. fluffily final ideas after the regular grouche +30597|712|F|172387.42|1992-08-06|2-HIGH|Clerk#000000893|0|hely regular packages haggle busily alongside of the slyly regular fo +30598|394|F|147170.83|1993-10-16|3-MEDIUM|Clerk#000000588|0|around the fluffily final reques +30599|517|F|52392.57|1992-02-11|4-NOT SPECIFIED|Clerk#000000957|0|uriously since the furiously ruthless packages. unusu +30624|304|O|287907.58|1998-07-27|3-MEDIUM|Clerk#000000983|0|ests. slyly final ideas alongside of the +30625|17|F|191561.40|1993-02-09|1-URGENT|Clerk#000000373|0|hely regular pinto beans above the regular, ironic accounts +30626|662|P|198876.40|1995-04-26|1-URGENT|Clerk#000000645|0|nusual requests nag carefully furiously regular requ +30627|781|F|114039.82|1992-05-09|4-NOT SPECIFIED|Clerk#000000002|0|as-- special deposits sleep quickly carefully ironic instructions? asy +30628|652|F|217172.99|1992-12-28|1-URGENT|Clerk#000000235|0|p carefully furiously blithe courts. carefully special inst +30629|962|F|122367.11|1992-01-23|3-MEDIUM|Clerk#000000489|0|e carefully ironic instructions must +30630|256|O|157539.75|1998-07-29|2-HIGH|Clerk#000000120|0|y daring pinto beans use slyly express instructions. quickly ironic reque +30631|205|F|119285.14|1993-06-18|1-URGENT|Clerk#000000770|0|press accounts cajole according to the regular, bold excuses. final pa +30656|656|P|310676.11|1995-04-04|3-MEDIUM|Clerk#000000132|0|ording to the express, final accounts. ironic deposits cajole blithel +30657|1021|P|62198.46|1995-05-11|2-HIGH|Clerk#000000108|0|regular foxes integrat +30658|430|P|161937.41|1995-03-27|3-MEDIUM|Clerk#000000908|0| blithely according to the blithely unusual deposits. carefully pe +30659|109|O|56338.88|1995-09-14|1-URGENT|Clerk#000000442|0|ully regular pearls. slyly pendin +30660|610|F|236670.47|1992-09-06|1-URGENT|Clerk#000000862|0|ckages. deposits grow among the daring, ironic depende +30661|860|F|199473.69|1994-04-03|5-LOW|Clerk#000000693|0|uses. carefully special pinto beans detect. evenly even waters +30662|235|O|168548.64|1996-01-18|2-HIGH|Clerk#000000500|0|en instructions sleep carefully carefully regular notornis. sil +30663|55|O|65781.78|1998-04-15|1-URGENT|Clerk#000000564|0|to beans. furiously unusual packages boost accounts. requests +30688|1166|O|10706.26|1996-09-22|1-URGENT|Clerk#000000591|0|eposits sleep slyly ironic, regular theodolit +30689|652|O|115865.32|1996-10-22|3-MEDIUM|Clerk#000000744|0|use after the special excuses. fluffily unusual accounts sleep. ironic +30690|877|F|109820.38|1993-02-25|3-MEDIUM|Clerk#000000543|0|final packages nod idly furious +30691|1229|O|87040.34|1996-06-23|1-URGENT|Clerk#000000715|0| blithely even accounts caj +30692|868|O|186984.57|1996-09-23|5-LOW|Clerk#000000320|0|final deposits cajole ruthlessly accord +30693|1468|O|144152.19|1997-02-05|3-MEDIUM|Clerk#000000409|0|nto beans about the final accounts haggle quickly about the slyly pe +30694|122|F|19442.76|1992-02-17|5-LOW|Clerk#000000963|0|s the blithely idle waters. +30695|1202|O|111369.84|1998-02-20|3-MEDIUM|Clerk#000000594|0|rate furiously. even instructions wake finally ironic theodolit +30720|1033|F|205577.51|1992-09-28|5-LOW|Clerk#000000139|0|es. permanently final excuse +30721|370|O|43017.94|1996-01-12|5-LOW|Clerk#000000914|0|y silent accounts are. quickly +30722|694|F|38310.11|1993-06-05|5-LOW|Clerk#000000041|0|eas alongside of the regular, bold deposits kindle among the quickl +30723|649|O|69257.03|1996-04-29|2-HIGH|Clerk#000000334|0|ages sleep. slyly final packages sle +30724|1345|O|36921.08|1996-02-28|2-HIGH|Clerk#000000905|0| across the packages. even pearls according to the +30725|401|F|222619.44|1994-12-29|3-MEDIUM|Clerk#000000173|0|osits haggle. furiously careful requests detect at the carefully special +30726|878|F|69291.69|1994-11-26|3-MEDIUM|Clerk#000000600|0|press pains. slyly ironic accounts boost final deposits. bra +30727|1063|F|243008.49|1992-07-26|3-MEDIUM|Clerk#000000002|0|oldly silent requests nag quickly ironic accoun +30752|1309|O|114166.27|1997-11-09|3-MEDIUM|Clerk#000000685|0|ust sleep furiously. ironic ideas amon +30753|1273|O|143600.19|1997-09-25|2-HIGH|Clerk#000000858|0|es. even accounts are; final, unusual +30754|490|F|179307.86|1993-11-26|5-LOW|Clerk#000000094|0|ld deposits. carefully express instructions breach quickly bold idea +30755|979|O|210628.08|1998-02-13|1-URGENT|Clerk#000000912|0|even, bold dolphins los +30756|764|O|156117.64|1997-09-20|4-NOT SPECIFIED|Clerk#000000231|0|ding requests nag slyly furiously even instructions. ironic, special pack +30757|656|F|81469.64|1993-12-27|3-MEDIUM|Clerk#000000830|0|ons doze furiously about the fluf +30758|487|O|64708.12|1998-07-07|5-LOW|Clerk#000000385|0|arefully ironic packages need to wake +30759|448|F|43366.57|1994-05-09|4-NOT SPECIFIED|Clerk#000000529|0|ons affix carefully according to th +30784|490|F|160284.38|1992-05-08|3-MEDIUM|Clerk#000000784|0|unts integrate sometimes; furiously express accounts aft +30785|872|F|131272.32|1994-07-04|2-HIGH|Clerk#000000576|0|l pinto beans along the slyl +30786|682|F|270298.36|1992-07-17|3-MEDIUM|Clerk#000000374|0|according to the final instructions are final requests. +30787|1042|O|70163.90|1995-09-28|2-HIGH|Clerk#000000588|0|ously unusual requests poach slyly bold accounts. ca +30788|977|F|162578.17|1992-10-22|2-HIGH|Clerk#000000028|0|nag furiously according to the final, regular packages. b +30789|316|F|172863.89|1994-06-27|4-NOT SPECIFIED|Clerk#000000678|0|s poach permanently doggedl +30790|827|F|358882.09|1992-12-11|4-NOT SPECIFIED|Clerk#000000191|0|he fluffily pending dependencies. carefully +30791|880|O|119792.73|1997-10-14|2-HIGH|Clerk#000000367|0|st above the multipliers. packages play express deposits. quickly b +30816|1075|O|23302.79|1996-11-26|1-URGENT|Clerk#000000544|0|sly ironic deposits. quickly regular pinto beans are furiously carefu +30817|1285|O|128135.58|1996-08-30|2-HIGH|Clerk#000000286|0|en, bold pinto beans. slyly fin +30818|56|O|216712.24|1997-07-22|2-HIGH|Clerk#000000865|0|ly pending theodolites detect slyly bold, ironic notornis. busily pending req +30819|916|F|9144.72|1992-05-07|2-HIGH|Clerk#000000028|0|egular platelets affix after the regular, ironic packages. blithely regular pa +30820|652|F|59319.55|1995-04-10|1-URGENT|Clerk#000000107|0|its lose slyly accor +30821|418|F|139303.08|1994-01-10|3-MEDIUM|Clerk#000000949|0|sometimes regular dolphins. regula +30822|1390|O|186213.98|1996-11-30|3-MEDIUM|Clerk#000000868|0|final pinto beans. foxes against the final instructions haggle carefull +30823|920|O|240499.70|1997-03-02|4-NOT SPECIFIED|Clerk#000000346|0|deposits above the sile +30848|262|P|172277.88|1995-05-02|3-MEDIUM|Clerk#000000887|0|courts. busy asymptotes cajole carefully bl +30849|568|O|191857.36|1996-03-11|3-MEDIUM|Clerk#000000385|0|efully final ideas haggle +30850|193|F|78132.48|1992-05-26|2-HIGH|Clerk#000000340|0|t at the furiously regular deposits. caref +30851|364|F|11759.57|1993-09-22|5-LOW|Clerk#000000960|0|s. furiously express deposits across the regular, regular pinto beans are af +30852|664|F|175061.12|1994-05-15|1-URGENT|Clerk#000000128|0|riously special packages. even ideas are blithely regular foxes. quic +30853|1105|O|245930.72|1995-07-28|3-MEDIUM|Clerk#000000353|0|r the slyly even deposits. slyly bold requests +30854|421|O|164074.23|1997-02-28|5-LOW|Clerk#000000852|0|sly. special, ironic platelets after the +30855|1093|O|165777.85|1996-11-14|5-LOW|Clerk#000000165|0|quests about the accounts cajole quickly furiously regula +30880|937|O|57953.23|1997-11-05|1-URGENT|Clerk#000000152|0|ven deposits! final depths about the quickly regular foxes are theodo +30881|919|F|182348.12|1993-06-12|2-HIGH|Clerk#000000463|0|tructions. slyly regular instructions w +30882|10|O|65297.83|1996-10-11|4-NOT SPECIFIED|Clerk#000000176|0|usly enticing packag +30883|1097|F|200615.15|1993-08-22|3-MEDIUM|Clerk#000000844|0|uickly carefully special +30884|727|F|96478.44|1993-09-27|5-LOW|Clerk#000000481|0| pending accounts cajole. furiously special depths are slowly slyly +30885|760|F|196059.07|1993-06-22|2-HIGH|Clerk#000000871|0|ructions kindle slyly after the quickly special packages. slyly re +30886|1229|F|155820.71|1992-05-13|5-LOW|Clerk#000000755|0|s cajole blithely. fin +30887|415|F|147408.02|1993-07-08|1-URGENT|Clerk#000000522|0| sleep slyly on the carefully ironic ideas. regular fox +30912|1019|F|124678.85|1993-11-25|4-NOT SPECIFIED|Clerk#000000175|0|r theodolites. escapades use. quickly regular depo +30913|730|F|290873.93|1992-09-23|3-MEDIUM|Clerk#000000796|0|even accounts according to the blithely p +30914|1442|O|85298.36|1997-05-21|2-HIGH|Clerk#000000844|0|he unusual pinto beans. quick +30915|1418|F|169183.48|1994-01-17|5-LOW|Clerk#000000928|0|s. quickly regular requests was blithely regular decoys. deposits +30916|1228|F|46042.89|1994-07-19|2-HIGH|Clerk#000000408|0|furiously regular instructions wake fluffily al +30917|70|F|170760.29|1993-11-02|5-LOW|Clerk#000000904|0| instructions. slyly express packages haggle a +30918|101|O|8446.01|1995-11-17|4-NOT SPECIFIED|Clerk#000000811|0|p. blithely regular excuses are among the furiously ironic accounts +30919|590|F|183199.92|1992-09-26|2-HIGH|Clerk#000000229|0|long the final accounts. fluffily quiet r +30944|236|O|197886.49|1995-06-23|1-URGENT|Clerk#000000112|0|ss the slyly express packages. quickly regular de +30945|211|F|120706.40|1994-08-19|2-HIGH|Clerk#000000697|0|g after the unusual packages. even dependencies serve slyly. mul +30946|200|F|33047.31|1994-04-19|1-URGENT|Clerk#000000312|0|ggle furiously. quickly pending accounts was slyly expres +30947|1465|F|155340.05|1993-07-15|5-LOW|Clerk#000000254|0|ial pinto beans wake. carefully special ideas sle +30948|730|O|14141.66|1996-10-11|4-NOT SPECIFIED|Clerk#000000050|0|s wake blithely. furiously regular +30949|1075|F|160897.81|1992-01-31|1-URGENT|Clerk#000000776|0|boldly unusual deposits wake after the fluffily even foxes: exp +30950|433|O|88007.80|1995-12-13|1-URGENT|Clerk#000000854|0| above the quickly regular accounts; boldly special +30951|955|O|60669.86|1996-07-06|2-HIGH|Clerk#000000119|0| fluffily ironic packages. unusual hockey players +30976|52|F|63324.57|1992-10-25|2-HIGH|Clerk#000000473|0| final, ironic foxe +30977|115|O|135593.72|1996-06-19|3-MEDIUM|Clerk#000000519|0|eposits. carefully bold de +30978|1162|O|61995.43|1996-06-30|1-URGENT|Clerk#000000594|0|l, final theodolites. final deposits impress +30979|1028|F|55469.64|1994-03-04|4-NOT SPECIFIED|Clerk#000000431|0|ges cajole quickly fluffily express theodolites-- idl +30980|244|O|64429.60|1995-08-27|5-LOW|Clerk#000000844|0| requests use silent accounts. express requests cajole. blithely i +30981|938|F|258384.94|1995-02-16|5-LOW|Clerk#000000665|0| haggle carefully along the bl +30982|1249|O|76180.58|1997-02-07|1-URGENT|Clerk#000000453|0|counts above the furiously final warhorses haggle fluffily pending dep +30983|1147|O|250997.50|1998-03-23|4-NOT SPECIFIED|Clerk#000000809|0|final accounts cajole furiously regular packages. blithely +31008|253|O|139006.24|1998-01-04|5-LOW|Clerk#000000002|0| regular instructions haggle blithely according to the regular instructions. +31009|259|O|149705.23|1997-05-29|3-MEDIUM|Clerk#000000350|0|ckages mold about the even, pending accounts. even package +31010|116|O|59476.39|1997-01-19|2-HIGH|Clerk#000000048|0|fily express deposits. requ +31011|659|F|51469.55|1994-11-14|2-HIGH|Clerk#000000385|0|iously even foxes. pending requests wake slyly c +31012|320|O|123645.60|1997-07-10|5-LOW|Clerk#000000052|0|eans wake blithely after the ca +31013|916|O|159981.34|1996-10-11|4-NOT SPECIFIED|Clerk#000000580|0| deposits. fluffily express pa +31014|613|O|199760.33|1998-01-14|3-MEDIUM|Clerk#000000523|0|against the blithely ironic foxes affix among +31015|224|F|79366.59|1993-01-24|2-HIGH|Clerk#000000626|0|ic theodolites. enticing deposits haggle. notornis integrate. quick +31040|985|F|258096.18|1993-09-15|4-NOT SPECIFIED|Clerk#000000924|0|into beans. carefully s +31041|1480|O|87031.90|1997-11-23|3-MEDIUM|Clerk#000000822|0|s haggle bravely quickly r +31042|1402|F|134995.08|1992-11-20|3-MEDIUM|Clerk#000000178|0|deposits. slowly ironic packages after the unusual packages use whithout the +31043|694|F|77856.31|1994-07-16|2-HIGH|Clerk#000000797|0|. ironic dolphins sleep along the slyly un +31044|649|F|53112.55|1993-01-11|5-LOW|Clerk#000000688|0|uses above the pending dolphins haggle carefully around the +31045|772|O|99639.12|1996-02-19|5-LOW|Clerk#000000028|0|ickly against the furiously bold courts. mul +31046|656|F|246364.21|1995-02-08|1-URGENT|Clerk#000000228|0|lyly even somas. iro +31047|1276|O|266861.96|1997-05-22|1-URGENT|Clerk#000000122|0|carefully. sometimes sly requests about the caref +31072|724|F|47190.73|1993-11-30|5-LOW|Clerk#000000379|0|e among the carefully +31073|235|F|221858.76|1993-07-26|3-MEDIUM|Clerk#000000046|0|tes serve across the ironic instruction +31074|652|O|211123.75|1997-04-22|4-NOT SPECIFIED|Clerk#000000723|0|ideas are bold, ironic instructions: furiously +31075|571|O|88985.22|1995-08-27|2-HIGH|Clerk#000000952|0|yly after the carefully regular requests. fluffily ironi +31076|265|F|22346.79|1992-07-20|5-LOW|Clerk#000000731|0|gular instructions haggle blithely blithely final packa +31077|199|F|28104.13|1993-10-24|4-NOT SPECIFIED|Clerk#000000152|0|al accounts hinder carefully! courts +31078|1244|F|110134.50|1994-02-11|1-URGENT|Clerk#000000590|0|ly ironic accounts. bold theodolites eat carefully across the +31079|230|O|2491.15|1995-09-05|4-NOT SPECIFIED|Clerk#000000383|0| haggle stealthily. sometimes regular d +31104|1496|O|32473.35|1997-02-21|2-HIGH|Clerk#000000656|0|g quickly. regular, regular foxes haggle. final dolp +31105|419|O|192205.09|1996-06-16|4-NOT SPECIFIED|Clerk#000000225|0| instructions. theodolites cajole slyly regular, silent asy +31106|649|F|272475.44|1992-02-17|5-LOW|Clerk#000000154|0|refully slyly final accounts. slyly i +31107|583|F|70252.73|1993-08-02|4-NOT SPECIFIED|Clerk#000000504|0|uickly special theodolites. furiously ironic requests affix slyly +31108|1069|F|121006.43|1994-08-02|1-URGENT|Clerk#000000909|0|eposits wake quickly ironic, regular theodolites. slyly regular fo +31109|1112|O|158369.02|1995-10-29|5-LOW|Clerk#000000986|0|ly special packages. car +31110|434|O|119723.57|1996-12-09|5-LOW|Clerk#000000813|0|instructions. furiously regular patterns sleep blithely above the f +31111|830|F|213864.54|1994-08-25|4-NOT SPECIFIED|Clerk#000000704|0|l, bold deposits boost carefully above the gifts; regular accounts cajol +31136|682|O|9360.52|1996-04-13|2-HIGH|Clerk#000000059|0| haggle along the requests. final instructions sleep +31137|1402|O|174888.97|1997-01-24|1-URGENT|Clerk#000000687|0|nal foxes. regular requests cajole slyly +31138|49|F|30653.68|1994-01-22|2-HIGH|Clerk#000000346|0|uriously express foxes wake blit +31139|454|F|159732.78|1993-12-19|4-NOT SPECIFIED|Clerk#000000278|0|ourts about the unusual, even asymptotes cajole along +31140|1183|F|42702.13|1995-02-02|1-URGENT|Clerk#000000021|0|usual ideas cajole doggedly ironic pinto beans. ca +31141|235|F|155788.94|1992-07-12|2-HIGH|Clerk#000000108|0|the deposits. carefully bold deposits +31142|574|O|121571.84|1997-01-24|3-MEDIUM|Clerk#000000506|0|ngside of the excuses. special, bold platelets according to the clo +31143|349|O|14512.93|1996-12-07|3-MEDIUM|Clerk#000000990|0|ns across the quickly even theod +31168|1009|F|144680.20|1992-02-14|1-URGENT|Clerk#000000199|0|lar, special package +31169|1445|P|313409.56|1995-06-10|5-LOW|Clerk#000000330|0|sts wake platelets-- quickly express theo +31170|635|F|103511.94|1992-01-28|3-MEDIUM|Clerk#000000629|0|egular platelets serve. slyly express accounts sleep against the fu +31171|557|F|103134.92|1994-04-09|4-NOT SPECIFIED|Clerk#000000704|0|ests detect slyly. dependencies at the fluffily unusual accounts haggl +31172|398|O|104638.81|1997-10-17|4-NOT SPECIFIED|Clerk#000000278|0|ts nag finally special, ironic ideas. +31173|907|F|220312.48|1992-08-19|5-LOW|Clerk#000000607|0|dencies nag blithely according to the quickly ir +31174|1438|F|191234.34|1994-03-27|4-NOT SPECIFIED|Clerk#000000628|0| quickly special requests will have to use forges. +31175|583|F|132614.68|1994-09-27|1-URGENT|Clerk#000000229|0|g fluffily carefully final warthogs. regular, d +31200|1424|O|170193.63|1996-09-07|1-URGENT|Clerk#000000940|0|brave accounts. unusual dependenci +31201|1117|O|6616.88|1997-11-01|2-HIGH|Clerk#000000279|0|ess instructions detect bravely ironic foxes. +31202|715|F|50321.96|1993-01-23|2-HIGH|Clerk#000000170|0|cing packages serve +31203|74|O|65314.23|1997-10-18|1-URGENT|Clerk#000000922|0|instructions sleep furiously alongside of the even theodolites. blithely steal +31204|1249|F|277810.17|1993-08-22|5-LOW|Clerk#000000082|0|d foxes. slyly ironic requests nag abo +31205|130|O|182771.96|1996-07-30|5-LOW|Clerk#000000819|0|the furiously special deposits sleep carefully +31206|232|F|111369.05|1993-02-05|1-URGENT|Clerk#000000418|0|le. furiously even multipliers sleep carefully quickly regular accounts. +31207|1147|F|46339.67|1994-06-21|4-NOT SPECIFIED|Clerk#000000984|0|beans wake slowly above the car +31232|1282|F|119993.60|1992-08-30|2-HIGH|Clerk#000000583|0|en deposits nag alongside of the quickly final accounts. unusual, s +31233|197|O|201805.80|1995-09-25|5-LOW|Clerk#000000042|0|jole across the silent, unusual foxes. blithely ironic requests use s +31234|1417|F|53253.44|1994-12-14|4-NOT SPECIFIED|Clerk#000000380|0|after the pending packages. final requests ha +31235|1181|O|157121.17|1996-07-26|3-MEDIUM|Clerk#000000996|0|ons impress furiously final pinto +31236|1444|O|145646.81|1996-07-02|5-LOW|Clerk#000000252|0|riously regular dependencies? final, ironic requests haggle silent re +31237|268|O|171643.92|1995-07-30|4-NOT SPECIFIED|Clerk#000000608|0|kly. furiously even accounts nag blithely slyly regular instructions. +31238|275|F|199199.61|1993-08-23|3-MEDIUM|Clerk#000000578|0|ains must use express instruct +31239|736|F|193697.13|1993-08-29|5-LOW|Clerk#000000347|0|riously express accounts haggle sly +31264|638|O|45304.52|1997-07-08|3-MEDIUM|Clerk#000000963|0|s wake according to the careful, express deposits. slyly special pa +31265|1441|O|260837.99|1996-10-28|1-URGENT|Clerk#000000158|0|lyly final deposits affix slyly. carefully pend +31266|49|F|98212.56|1992-10-04|2-HIGH|Clerk#000000079|0|ly regular dependencies: sentiments are quickly. furiously ironic pack +31267|712|O|50340.73|1997-01-12|1-URGENT|Clerk#000000926|0|ven deposits cajole. furiously express foxes +31268|571|O|67631.82|1995-07-13|1-URGENT|Clerk#000000975|0|gular instructions. slowly express packages haggle quickly clo +31269|742|F|68483.24|1992-03-12|2-HIGH|Clerk#000000177|0|nding pinto beans alon +31270|880|F|296947.79|1992-11-24|3-MEDIUM|Clerk#000000549|0|. even, ironic somas integ +31271|955|P|97025.96|1995-04-21|5-LOW|Clerk#000000543|0|l accounts. final, special deposits sleep fluffily final excuses. caref +31296|919|F|182237.89|1993-12-01|1-URGENT|Clerk#000000380|0| are carefully along the special acco +31297|872|F|327274.69|1992-08-19|5-LOW|Clerk#000000181|0|quests? furiously ironic ideas +31298|511|O|101295.60|1996-10-31|1-URGENT|Clerk#000000474|0|y. ironic packages boost quickly across t +31299|1015|O|15767.59|1997-01-06|4-NOT SPECIFIED|Clerk#000000196|0|counts. pending, bold dol +31300|146|O|48233.96|1997-04-03|4-NOT SPECIFIED|Clerk#000000888|0|n asymptotes above the regular, ironic deposits x-ray blithely a +31301|35|F|105477.65|1993-10-19|5-LOW|Clerk#000000949|0|hely regular ideas eat. accounts cajole furiously. blit +31302|1267|F|330511.77|1992-08-02|2-HIGH|Clerk#000000257|0|al instructions. slyly ironic packages print: packages breach carefully s +31303|880|P|178304.32|1995-03-21|5-LOW|Clerk#000000081|0|express requests doze carefully among the ruthless requests. +31328|1135|O|264511.14|1998-04-20|5-LOW|Clerk#000000624|0| bold, final packages. slyly regular instructions use +31329|100|O|160313.73|1998-06-18|3-MEDIUM|Clerk#000000167|0|ainst the furiously silent accounts breach silent braids. close excuses +31330|919|F|250581.01|1993-06-02|2-HIGH|Clerk#000000310|0|y according to the quickly ironic accounts +31331|1396|O|175576.28|1998-06-22|4-NOT SPECIFIED|Clerk#000000605|0| among the slyly ironic packages. ins +31332|1241|O|38318.08|1998-06-02|1-URGENT|Clerk#000000415|0|regular packages wake quickly. blithely regular requests cajole on the spec +31333|1357|F|196918.93|1994-10-16|3-MEDIUM|Clerk#000000284|0|ual theodolites detect blithely silent acc +31334|76|O|10801.28|1996-11-04|1-URGENT|Clerk#000000056|0|ecial requests cajole quickly. final requests serve +31335|233|O|65375.10|1996-01-12|4-NOT SPECIFIED|Clerk#000000799|0|e carefully. blithely special pinto beans serve carefully after the quickly +31360|1088|O|149250.96|1997-12-01|3-MEDIUM|Clerk#000000804|0|sts sleep. silent packages integrate carefully even instructions. idle in +31361|994|O|87225.13|1997-08-03|3-MEDIUM|Clerk#000000640|0|kly-- slyly ironic asymptotes nag slyly above th +31362|181|O|51919.49|1995-10-14|1-URGENT|Clerk#000000011|0|aggle carefully. quickly quick requests haggle +31363|1420|F|52481.40|1994-04-18|5-LOW|Clerk#000000202|0|ccording to the carefully regular tithes. slyly even deposits +31364|1379|F|269957.04|1994-05-02|4-NOT SPECIFIED|Clerk#000000713|0|fully ironic packages boost slyly blithely u +31365|1081|P|255507.46|1995-05-28|3-MEDIUM|Clerk#000000785|0|ly pending pinto beans. quickly re +31366|188|F|92627.73|1993-09-01|4-NOT SPECIFIED|Clerk#000000684|0|y final theodolites cajole besides the sometimes +31367|1241|O|121651.87|1996-10-07|5-LOW|Clerk#000000716|0| cajole carefully. sl +31392|1402|F|186182.17|1993-05-07|5-LOW|Clerk#000000311|0|hely ironic accounts nag ab +31393|485|F|145311.71|1992-05-12|1-URGENT|Clerk#000000299|0| carefully unusual accounts haggle slyly. fluffily +31394|1187|O|81553.43|1997-03-25|3-MEDIUM|Clerk#000000793|0|st carefully along the fluffily ironic theo +31395|1213|F|59513.57|1992-08-01|1-URGENT|Clerk#000000535|0|se. requests use even excuses-- blithely sp +31396|1012|O|117922.04|1996-01-05|2-HIGH|Clerk#000000804|0| the silent, special foxes haggle alongside of the slyly even a +31397|530|O|25679.60|1997-01-18|1-URGENT|Clerk#000000457|0|inal foxes about the i +31398|679|O|166243.72|1998-02-04|4-NOT SPECIFIED|Clerk#000000870|0| haggle furiously doggedly special pinto beans. permanent accounts +31399|1339|O|305980.22|1995-11-06|4-NOT SPECIFIED|Clerk#000000666|0|ly final requests. pinto beans nag blithely +31424|772|O|271224.57|1996-09-09|3-MEDIUM|Clerk#000000802|0| blithely daring theo +31425|1039|O|140805.05|1996-10-11|4-NOT SPECIFIED|Clerk#000000258|0|hely special accounts boost carefully. furiously even theodolites hang a +31426|1154|F|254602.02|1994-08-06|5-LOW|Clerk#000000533|0|dolites. pinto beans cajole blithely ironic frays. regula +31427|742|F|102278.32|1994-05-27|1-URGENT|Clerk#000000432|0|ly unusual foxes. even excuses serve slyly slyly regular packages. caref +31428|709|O|32888.36|1997-03-12|4-NOT SPECIFIED|Clerk#000000373|0|s are slyly blithely regular accounts. final, bold instructions cajole alwa +31429|1459|O|29771.72|1995-10-30|2-HIGH|Clerk#000000450|0|arefully carefully regular accounts. furiously ir +31430|1000|F|16744.76|1992-05-15|4-NOT SPECIFIED|Clerk#000000597|0|ajole closely against the carefully quick ideas. instruct +31431|991|O|243973.90|1996-05-09|1-URGENT|Clerk#000000560|0|ing to the pending theodolites? blithely even platelets wake despite the s +31456|862|F|83372.08|1992-11-16|2-HIGH|Clerk#000000805|0|deas. ironic accounts nag carefully. furiously final instruction +31457|143|O|99616.39|1996-01-01|2-HIGH|Clerk#000000126|0|press dolphins according to the quickly regular platelets ha +31458|1090|O|60113.22|1998-04-13|5-LOW|Clerk#000000858|0|even pinto beans use blithely above the +31459|1406|O|254708.64|1997-12-10|4-NOT SPECIFIED|Clerk#000000627|0|rts sleep toward the pending ideas. theodolites maintain +31460|611|F|55978.12|1992-08-27|2-HIGH|Clerk#000000928|0|xcuses. even, express packages about the quickly reg +31461|194|O|138474.42|1995-06-28|3-MEDIUM|Clerk#000000469|0|ages are furiously blithely ironic instructions. car +31462|256|F|75052.08|1993-07-11|4-NOT SPECIFIED|Clerk#000000593|0|gainst the regular, regular asymptotes. pending dependencies wake +31463|616|O|64232.06|1996-11-02|3-MEDIUM|Clerk#000000430|0|y even accounts. accounts +31488|223|O|185274.73|1995-11-13|2-HIGH|Clerk#000000911|0|. carefully regular ide +31489|1298|F|149141.18|1992-12-08|1-URGENT|Clerk#000000025|0|usly regular deposits boost slyly; slyly bold theodolites about the fluffil +31490|1363|O|209113.14|1996-04-21|4-NOT SPECIFIED|Clerk#000000633|0|carefully silent platelets wake +31491|556|O|91031.74|1998-05-18|2-HIGH|Clerk#000000992|0|ngside of the carefully pending dolphins. quickly regular excuses around the e +31492|11|F|275245.06|1993-10-16|1-URGENT|Clerk#000000036|0|ests x-ray carefully among the foxes. furiously even theod +31493|1265|F|25643.54|1994-10-18|2-HIGH|Clerk#000000565|0|s sleep ironic foxes. blithely even multipliers are +31494|1438|O|190137.70|1998-04-15|2-HIGH|Clerk#000000515|0|ress foxes above th +31495|1207|F|131109.03|1993-08-05|5-LOW|Clerk#000000176|0|ly permanent deposits. quickly ironic reque +31520|146|O|232383.65|1995-11-29|2-HIGH|Clerk#000000456|0|s about the slowly ironic dependencies play agains +31521|1480|F|223394.20|1992-05-26|1-URGENT|Clerk#000000769|0|regular theodolites. platelets cajole ruthlessly ironic accounts. b +31522|1481|F|264255.31|1993-05-26|3-MEDIUM|Clerk#000000549|0|dolites sublate blithely +31523|625|F|109252.64|1992-03-09|5-LOW|Clerk#000000620|0|al platelets nag. request +31524|748|O|169653.91|1995-06-27|5-LOW|Clerk#000000972|0|ess requests boost blithe +31525|239|F|9259.13|1992-02-07|2-HIGH|Clerk#000000715|0|hely regular dependencies impress. furiously final instructions sleep. slyly +31526|1207|O|156674.17|1995-10-16|4-NOT SPECIFIED|Clerk#000000207|0|ns haggle blithely ironic +31527|139|F|126826.03|1994-07-07|2-HIGH|Clerk#000000273|0|sts sleep. carefully even requests wake furiously acro +31552|1184|F|196661.12|1992-11-12|2-HIGH|Clerk#000000445|0| platelets. express r +31553|1219|F|171543.00|1994-01-11|1-URGENT|Clerk#000000398|0|ously. furiously express requests sleep fluffily after the unusua +31554|1172|O|204108.26|1996-02-29|3-MEDIUM|Clerk#000000077|0|longside of the bold packages cajole carefully after the slyly +31555|679|F|105491.57|1992-01-05|1-URGENT|Clerk#000000049|0|above the furiously special packages. furiously special +31556|514|O|137829.57|1995-07-28|1-URGENT|Clerk#000000349|0|quests. final ideas according to +31557|1394|O|148325.45|1997-05-16|3-MEDIUM|Clerk#000000487|0|ress deposits at the carefully bold +31558|940|O|93369.75|1995-07-24|5-LOW|Clerk#000000961|0| final deposits print slyly carefully final accounts. thinly final +31559|863|O|133805.09|1997-11-06|3-MEDIUM|Clerk#000000054|0|press, permanent accounts cajole according to the e +31584|908|O|125014.50|1996-12-02|1-URGENT|Clerk#000000482|0|sual deposits? evenly even asymptotes at the request +31585|587|O|111645.26|1996-06-04|5-LOW|Clerk#000000527|0|s cajole slyly upon the unusual, silent deposits. final packages hag +31586|746|F|287701.08|1992-03-22|5-LOW|Clerk#000000102|0|its haggle doggedly blithely blithe platelets. furiou +31587|803|O|92990.34|1998-02-08|2-HIGH|Clerk#000000256|0|uickly bold deposits. blit +31588|1348|F|27733.45|1993-10-16|2-HIGH|Clerk#000000335|0|es grow blithely ironic dolphins? blithely express deposits wake furiously abo +31589|1387|O|61605.61|1996-09-13|1-URGENT|Clerk#000000409|0|ave accounts. ironic ideas about the pending pa +31590|190|F|116851.98|1993-06-06|1-URGENT|Clerk#000000376|0|nts sleep quickly regular packages-- bold, flu +31591|686|O|228221.10|1997-12-10|2-HIGH|Clerk#000000896|0|old instructions above the ironic packages integrate furiously around +31616|986|F|236079.61|1993-08-29|1-URGENT|Clerk#000000477|0|to the final requests. courts +31617|437|F|40468.70|1995-05-27|3-MEDIUM|Clerk#000000551|0| the furiously final accounts affix after the slyly e +31618|487|O|227076.39|1995-07-12|1-URGENT|Clerk#000000431|0|sly unusual requests use. ironic ideas cajole evenly pending pint +31619|487|F|94208.19|1994-09-18|5-LOW|Clerk#000000562|0|ometimes ironic excuses. +31620|253|O|69141.34|1995-08-12|1-URGENT|Clerk#000000826|0|ges cajole slyly at the furiousl +31621|550|O|58471.47|1997-07-29|3-MEDIUM|Clerk#000000295|0|, regular accounts haggle quickly ironic forges. blithe +31622|757|F|78566.62|1992-02-26|4-NOT SPECIFIED|Clerk#000000505|0|pendencies sleep furiously +31623|281|O|163417.62|1997-06-20|5-LOW|Clerk#000000224|0|ccording to the quick +31648|1400|O|319491.64|1995-08-21|2-HIGH|Clerk#000000158|0|ly regular asymptotes. slyly express foxes cajole blithely even a +31649|331|O|157979.84|1998-03-01|2-HIGH|Clerk#000000615|0|ic dependencies boost fluffily according to +31650|1246|F|164756.65|1993-08-12|4-NOT SPECIFIED|Clerk#000000783|0|gle. fluffily ironic deposits among the s +31651|575|O|155174.04|1997-09-03|3-MEDIUM|Clerk#000000559|0|counts detect furiously regular ideas. sly warthogs eat against th +31652|1255|F|159234.70|1994-10-03|5-LOW|Clerk#000000830|0|lyly regular accounts. carefully express accounts +31653|1|F|152411.41|1993-06-05|2-HIGH|Clerk#000000346|0|foxes. fluffily fin +31654|1090|O|140290.10|1996-09-15|4-NOT SPECIFIED|Clerk#000000307|0|s. carefully busy packages use carefully bus +31655|874|F|300848.95|1993-03-14|5-LOW|Clerk#000000824|0|ct blithely. blithely ironic foxes mol +31680|190|O|36928.54|1998-03-17|4-NOT SPECIFIED|Clerk#000000696|0|accounts sleep furiously slyly final deposits. blithely fin +31681|1078|F|29247.97|1992-11-08|4-NOT SPECIFIED|Clerk#000000375|0|ccording to the final requests. ca +31682|295|F|85797.45|1993-03-10|5-LOW|Clerk#000000449|0|ly even accounts sleep carefully accordi +31683|1489|O|135506.76|1997-04-21|4-NOT SPECIFIED|Clerk#000000078|0|s. quickly regular dolphins breach. express packages above the ev +31684|1024|F|244548.44|1992-09-17|1-URGENT|Clerk#000000037|0|cross the fluffy, express grouches. car +31685|1409|F|73476.18|1994-06-23|5-LOW|Clerk#000000255|0|ully among the furiously ironic packages. pinto beans across the ironic ac +31686|103|O|150924.05|1996-06-15|4-NOT SPECIFIED|Clerk#000000187|0|excuses. carefully unus +31687|79|P|94275.67|1995-05-20|2-HIGH|Clerk#000000614|0|ven platelets sublate among +31712|857|O|12057.29|1997-03-31|4-NOT SPECIFIED|Clerk#000000267|0|ic warthogs integrate fluffily ironic dugouts. never final ideas affix f +31713|434|O|104713.93|1998-02-08|5-LOW|Clerk#000000821|0|sts. slyly unusual courts are. slyly permanent packages would ca +31714|769|O|320239.84|1997-08-21|4-NOT SPECIFIED|Clerk#000000479|0|r packages sleep furiously inside the +31715|1234|F|215747.14|1994-01-10|4-NOT SPECIFIED|Clerk#000000465|0|warthogs among the furiously regular accounts are slyly bravely unus +31716|74|O|73755.56|1996-11-02|1-URGENT|Clerk#000000020|0|excuses nag slyly about the carefully regular pinto +31717|983|O|89845.10|1997-11-07|2-HIGH|Clerk#000000237|0|quests cajole quickly carefully express accounts. accounts grow. slyly +31718|1471|F|83646.89|1993-11-28|5-LOW|Clerk#000000612|0|sits sleep carefully. carefully blithe excuses snooze carefully final req +31719|52|O|298812.24|1997-03-13|4-NOT SPECIFIED|Clerk#000000428|0|the furiously final platelets sleep carefully slyly final asymptotes. bold, i +31744|386|F|251246.75|1992-09-10|3-MEDIUM|Clerk#000000816|0|tions-- pending, regular platelets against the evenly regular accounts wak +31745|466|F|106608.72|1993-10-16|2-HIGH|Clerk#000000931|0|ges. slyly final instructions are carefully alongside of the unusual deposits +31746|1133|O|108800.85|1997-05-11|2-HIGH|Clerk#000000738|0|inal, regular platelets haggle carefully a +31747|121|F|167645.52|1995-02-03|3-MEDIUM|Clerk#000000792|0|ys wake alongside of the ironic requests. fu +31748|937|O|216374.91|1996-08-21|5-LOW|Clerk#000000099|0|lly bold ideas. carefully regular dolphins are up +31749|710|O|156961.35|1995-06-07|1-URGENT|Clerk#000000197|0|c deposits cajole carefully regular deposits. regular ac +31750|392|O|119522.98|1997-01-13|1-URGENT|Clerk#000000070|0|s integrate blithely after th +31751|1403|P|178321.53|1995-05-27|2-HIGH|Clerk#000000204|0|es. final requests boost quickly. furiously unusual theodolite +31776|575|O|214465.23|1997-04-24|5-LOW|Clerk#000000723|0| foxes cajole carefull +31777|730|O|105464.09|1995-10-20|4-NOT SPECIFIED|Clerk#000000077|0|y quickly ironic packages. +31778|428|O|65516.55|1997-12-08|3-MEDIUM|Clerk#000000023|0|gular requests cajole quickly. slow theodolites affix fl +31779|391|F|71006.50|1993-10-09|3-MEDIUM|Clerk#000000059|0|ses poach. close deposits haggle slyly ac +31780|1348|F|135801.89|1993-01-30|3-MEDIUM|Clerk#000000898|0|nag. carefully permanent f +31781|1394|F|249682.77|1994-01-17|3-MEDIUM|Clerk#000000944|0|bout the furiously regular pinto beans hag +31782|899|F|69165.04|1992-10-20|2-HIGH|Clerk#000000842|0|oze according to the furiously bold foxes. slyly pending accounts h +31783|257|O|2430.14|1996-04-13|4-NOT SPECIFIED|Clerk#000000443|0| across the special packages. carefully bold pi +31808|226|F|178911.82|1993-09-23|4-NOT SPECIFIED|Clerk#000000236|0|ully with the unusual accounts. deposits affix quickly pending pack +31809|854|F|76354.01|1993-07-29|2-HIGH|Clerk#000000523|0|nts. carefully pending sentiments haggle blithely slyly +31810|275|F|78090.93|1994-05-22|1-URGENT|Clerk#000000103|0|ickly regular foxes are furiously final instructions? eve +31811|1379|O|21068.50|1998-04-08|2-HIGH|Clerk#000000962|0|across the slyly spec +31812|1237|O|161000.01|1995-08-01|2-HIGH|Clerk#000000695|0|ithely pending platelets. regular, regular plate +31813|163|O|113967.15|1997-05-11|3-MEDIUM|Clerk#000000821|0|s solve permanently across the flu +31814|38|O|93151.61|1997-08-01|5-LOW|Clerk#000000225|0| dugouts. regular accounts sleep furiously furi +31815|58|O|106719.06|1996-08-01|5-LOW|Clerk#000000733|0|express courts nag quickly packages. +31840|803|F|129940.71|1993-04-19|2-HIGH|Clerk#000000297|0| nag along the deposits +31841|919|O|50599.99|1996-06-08|2-HIGH|Clerk#000000161|0|. furiously bold foxes around the furiously +31842|25|F|137338.53|1993-07-17|3-MEDIUM|Clerk#000000093|0|uests about the dolphins are blithely +31843|1034|P|53762.30|1995-05-30|3-MEDIUM|Clerk#000000963|0|ackages. quickly even courts run qu +31844|395|O|42519.73|1995-07-03|4-NOT SPECIFIED|Clerk#000000907|0|the blithely regular theodolites. blithely ironic deposi +31845|152|F|55594.62|1992-10-23|5-LOW|Clerk#000000697|0|accounts. courts print blithely ironic accounts. silent dependen +31846|694|O|46472.07|1995-08-14|1-URGENT|Clerk#000000852|0|s use furiously after the slyly final accounts. s +31847|641|F|272673.38|1994-12-19|5-LOW|Clerk#000000220|0|usual requests. blithely pending accounts boost slyly after the caref +31872|488|F|184610.60|1993-09-07|5-LOW|Clerk#000000048|0|al dolphins! final accounts are quickly bold pinto +31873|871|F|301974.74|1994-11-09|5-LOW|Clerk#000000220|0|al ideas. carefully final accounts alongside of the silent, final foxes +31874|1349|F|53357.85|1992-09-16|2-HIGH|Clerk#000000695|0|r pinto beans wake across the furiously ironic requests. furiously unusu +31875|61|F|163702.58|1992-07-12|5-LOW|Clerk#000000759|0|egular dependencies nag care +31876|970|P|181860.22|1995-05-08|2-HIGH|Clerk#000000164|0|s according to the bravely special frets sleep above +31877|883|F|190257.30|1994-06-30|3-MEDIUM|Clerk#000000919|0| furiously regular dinos maintain again +31878|59|O|183644.02|1995-12-19|3-MEDIUM|Clerk#000000276|0|ly express foxes wake abo +31879|712|F|100237.50|1993-08-04|3-MEDIUM|Clerk#000000266|0|apades. furiously regular deposits cajole fluffily express requests. bold, r +31904|752|O|89029.68|1997-04-07|2-HIGH|Clerk#000000010|0|blithely regular warhorses haggle. slyly pending excuses sleep. final +31905|389|O|34216.56|1998-05-01|1-URGENT|Clerk#000000871|0|accounts cajole blithely. ironic accounts haggle quietly about the ideas. +31906|241|O|68309.89|1997-07-11|5-LOW|Clerk#000000088|0|ts. closely final attainments sleep quickly. foxes us +31907|961|F|217709.83|1993-05-19|5-LOW|Clerk#000000718|0| nag carefully. regular depend +31908|185|O|61563.98|1998-01-11|4-NOT SPECIFIED|Clerk#000000252|0|r deposits. blithely silent dep +31909|1196|F|79248.84|1993-05-31|2-HIGH|Clerk#000000436|0|s. quickly express foxes about the enticingly regular theodolites boost at the +31910|244|F|317858.00|1994-10-30|3-MEDIUM|Clerk#000000065|0|ctions. silent dugouts haggle carefully dugouts. furiously regular +31911|398|F|3584.32|1993-09-11|2-HIGH|Clerk#000000160|0|ic orbits along the c +31936|850|O|343791.22|1995-12-18|2-HIGH|Clerk#000000389|0| dugouts cajole slyly regular dinos. deposits haggle quickly. slyly final mult +31937|383|O|1606.38|1998-02-28|3-MEDIUM|Clerk#000000116|0|olites. quickly silent theodolites whithout the express +31938|70|O|170033.24|1995-07-28|3-MEDIUM|Clerk#000000525|0|elets. carefully ironic platelets maintain. furiously ironic frets use. excu +31939|281|O|90843.19|1995-06-26|2-HIGH|Clerk#000000840|0| carefully brave deposits along the regu +31940|1483|F|21384.56|1992-07-15|2-HIGH|Clerk#000000146|0| dolphins wake ruthlessly. furiously pending requests will have to detect +31941|596|F|148472.11|1994-03-19|3-MEDIUM|Clerk#000000823|0|y among the carefully slow packages. slyly regular dolphins +31942|1481|O|80930.85|1996-11-17|5-LOW|Clerk#000000616|0|cingly slyly final dolphins. carefull +31943|710|O|14623.67|1995-03-14|3-MEDIUM|Clerk#000000186|0|ously after the even accounts. fluffily fin +31968|371|O|120042.89|1998-05-29|5-LOW|Clerk#000000938|0|encies. furiously ironic accounts are slyly. furiously final instruction +31969|1145|O|107716.17|1998-05-26|4-NOT SPECIFIED|Clerk#000000100|0|ages. furiously special instructions are furiously above the furiously ironi +31970|199|F|100761.33|1992-12-21|2-HIGH|Clerk#000000606|0| quickly against the fluffily sp +31971|1354|O|116980.87|1998-05-26|5-LOW|Clerk#000000512|0|ironic instructions. furiously even re +31972|1438|O|5683.90|1998-07-20|3-MEDIUM|Clerk#000000524|0| haggle slyly ironic Tiresias. special requests slee +31973|469|P|115549.48|1995-05-13|4-NOT SPECIFIED|Clerk#000000367|0|s. ideas sleep carefully about the carefu +31974|22|O|278142.58|1998-04-02|1-URGENT|Clerk#000000389|0|even foxes haggle slyly. furiously final requests nag carefully against the +31975|1006|F|82250.07|1993-01-15|1-URGENT|Clerk#000000631|0| blithely even requests. even instructions nag slyly a +32000|488|F|149464.63|1992-09-14|5-LOW|Clerk#000000683|0|he blithely pending ideas. slyly regular instructions wake carefull +32001|1496|O|226290.41|1995-10-29|5-LOW|Clerk#000000922|0|ly unusual ideas. patterns wake furiously by the packages. never +32002|164|F|147502.62|1993-07-21|5-LOW|Clerk#000000983|0|s should use quickly. final deposits cajo +32003|1349|O|174274.57|1996-04-01|5-LOW|Clerk#000000247|0|inal dependencies are. furi +32004|1414|O|94602.00|1996-07-01|4-NOT SPECIFIED|Clerk#000000404|0|quickly platelets. ironic, regular requests a +32005|1039|O|177166.69|1997-06-01|4-NOT SPECIFIED|Clerk#000000765|0|fily even foxes are slyly requests: careful theodolites haggle slyly +32006|1294|O|79017.57|1996-12-07|2-HIGH|Clerk#000000846|0|efully. furiously pending theodolites cajole. +32007|607|F|66339.79|1995-02-06|5-LOW|Clerk#000000502|0|kly. fluffily regular deposits across the a +32032|493|F|38450.29|1992-04-25|3-MEDIUM|Clerk#000000428|0|sly. unusual dolphins along the pending accounts wake furiously accordi +32033|610|O|4736.16|1996-04-07|5-LOW|Clerk#000000198|0|s alongside of the blithely express accounts wake across the slyly silent d +32034|259|P|77352.02|1995-05-21|4-NOT SPECIFIED|Clerk#000000540|0| instructions haggle after the unusual, pending foxes. ironic, iron +32035|1106|O|72437.96|1997-03-15|1-URGENT|Clerk#000000062|0|s are across the sp +32036|61|O|159314.77|1995-10-06|3-MEDIUM|Clerk#000000052|0|losely along the express, final accounts. package +32037|478|F|281897.32|1994-02-17|5-LOW|Clerk#000000498|0|onic accounts about the ironic, expres +32038|256|F|224021.16|1994-06-18|5-LOW|Clerk#000000332|0|dinos nag above the +32039|1474|O|65247.70|1998-01-14|5-LOW|Clerk#000000333|0|ar courts sleep. ste +32064|700|F|67920.87|1993-12-24|4-NOT SPECIFIED|Clerk#000000495|0|uietly ruthless foxes wake furiously special ideas. eve +32065|500|O|343672.73|1995-12-03|3-MEDIUM|Clerk#000000496|0|slyly. unusual instructions integrat +32066|751|O|291495.38|1998-07-11|1-URGENT|Clerk#000000839|0|ing deposits. blithely unusual asymp +32067|890|F|217255.66|1992-03-13|2-HIGH|Clerk#000000304|0|ckages according to the quickly ironic ide +32068|115|F|15549.65|1992-06-13|1-URGENT|Clerk#000000241|0|s run across the accounts. bold ideas wake carefully above the re +32069|1265|O|212319.74|1995-11-20|4-NOT SPECIFIED|Clerk#000000297|0|about the final accounts. furiously bold dinos haggle b +32070|97|F|169938.02|1994-07-18|3-MEDIUM|Clerk#000000916|0|deas sleep along the fluffily regular accounts. +32071|1346|O|293637.73|1997-09-01|4-NOT SPECIFIED|Clerk#000000442|0|efully ironic deposits wake c +32096|1112|F|44045.48|1994-08-03|2-HIGH|Clerk#000000253|0| regular foxes after +32097|34|O|279506.41|1997-04-20|1-URGENT|Clerk#000000849|0|blithely regular packa +32098|191|F|31593.94|1993-07-14|1-URGENT|Clerk#000000647|0|even ideas. final deposits cajole. special, regular the +32099|1043|F|72320.70|1993-05-06|4-NOT SPECIFIED|Clerk#000000780|0|efully according to the unusual, silent theodolites. regular packages use slyl +32100|1072|F|70340.23|1992-05-24|3-MEDIUM|Clerk#000000425|0|c requests use blithely furiously pending somas. blithely pending a +32101|964|F|177761.00|1994-12-27|5-LOW|Clerk#000000832|0|ld excuses. furiously bold epitaphs wake quickly sl +32102|1213|F|115243.88|1992-12-15|3-MEDIUM|Clerk#000000743|0| deposits haggle evenly fluffily express +32103|1174|F|115647.16|1993-07-12|4-NOT SPECIFIED|Clerk#000000086|0|refully unusual requests haggle always among the regular, iro +32128|349|F|101159.06|1995-01-22|5-LOW|Clerk#000000176|0|the instructions. pending ideas +32129|214|O|379837.62|1995-07-03|1-URGENT|Clerk#000000395|0|ring accounts serve s +32130|1076|F|109253.75|1993-10-04|4-NOT SPECIFIED|Clerk#000000764|0|ironic instructions believe alongside of the final, bold packages. +32131|413|F|129255.70|1993-12-28|1-URGENT|Clerk#000000086|0|its haggle blithely unusual re +32132|755|O|116014.98|1996-03-21|4-NOT SPECIFIED|Clerk#000000780|0|the slyly express dependencies sleep furiously furiously unusual packages. fu +32133|539|O|179771.97|1997-06-24|1-URGENT|Clerk#000000976|0|hely special accounts. +32134|572|O|151688.35|1996-02-07|5-LOW|Clerk#000000910|0|usly regular depths run carefully slyly final packages. +32135|679|F|205716.29|1993-11-26|2-HIGH|Clerk#000000844|0|es maintain blithely bol +32160|1450|O|185976.87|1996-03-03|1-URGENT|Clerk#000000499|0| asymptotes haggle quickly. quickly regular p +32161|250|O|14801.86|1996-09-18|4-NOT SPECIFIED|Clerk#000000950|0|p accounts? even pinto bean +32162|187|O|119220.28|1997-11-07|3-MEDIUM|Clerk#000000831|0|s sleep slyly around the regular deposits. slyly regular +32163|175|F|40278.07|1993-04-16|2-HIGH|Clerk#000000494|0|ckly about the slyly express asymptotes. r +32164|274|F|236063.99|1993-02-03|4-NOT SPECIFIED|Clerk#000000256|0|blithely regular accounts above the regular ideas believe slyly a +32165|1132|F|121110.97|1992-10-15|4-NOT SPECIFIED|Clerk#000000320|0|le. slyly unusual foxes sleep quickly along +32166|1456|F|188788.56|1994-05-24|1-URGENT|Clerk#000000425|0|ar packages sleep blithely above the blithely +32167|941|O|169122.32|1996-11-27|5-LOW|Clerk#000000431|0|side of the theodolites. +32192|334|F|189185.65|1992-02-19|4-NOT SPECIFIED|Clerk#000000344|0|y against the fluff +32193|256|F|29024.70|1993-10-21|5-LOW|Clerk#000000404|0|s among the unusual foxes run sly, final requests. qui +32194|1117|O|171391.26|1997-08-29|2-HIGH|Clerk#000000201|0| about the carefully ruthless pinto beans. blithely ironic instruction +32195|712|F|127629.34|1994-11-26|3-MEDIUM|Clerk#000000017|0| across the slyly even accounts. regular, express accounts integrate +32196|616|O|75345.41|1997-01-15|4-NOT SPECIFIED|Clerk#000000491|0|ular theodolites. furiously special p +32197|653|O|123440.82|1996-02-22|4-NOT SPECIFIED|Clerk#000000628|0|osely. theodolites solve slyly sile +32198|553|O|198573.67|1995-11-10|3-MEDIUM|Clerk#000000911|0|x slyly express pinto beans. blithel +32199|1168|F|115102.08|1994-07-16|2-HIGH|Clerk#000000867|0|sly silent, ironic depths-- carefully regular platelets at the pinto bea +32224|991|O|100575.49|1996-05-28|5-LOW|Clerk#000000983|0| unusual requests wake. quickly ironic requests affix slyly express instr +32225|968|O|19552.14|1997-08-20|2-HIGH|Clerk#000000735|0|y express platelets detect blit +32226|17|O|228374.71|1996-12-21|1-URGENT|Clerk#000000924|0|es. regular, bold packages around the furious +32227|242|O|335758.71|1996-01-05|4-NOT SPECIFIED|Clerk#000000475|0|y. ironic deposits boost around the furio +32228|1465|F|147551.17|1993-11-05|1-URGENT|Clerk#000000016|0|y special pinto beans cajole carefully accounts. blithely ironic depos +32229|556|F|230507.38|1993-08-31|2-HIGH|Clerk#000000870|0|uffily. regular, regular packages hang carefully; bold ideas will n +32230|193|F|83185.56|1992-08-20|2-HIGH|Clerk#000000648|0|lithely regular gifts. ironic requests +32231|1168|F|353334.19|1992-11-02|5-LOW|Clerk#000000917|0|t the furiously regular ideas believe along the +32256|200|O|80730.79|1998-06-02|3-MEDIUM|Clerk#000000027|0|tegrate furiously accounts. furiousl +32257|1180|O|99534.02|1997-10-03|3-MEDIUM|Clerk#000000786|0|y ironic dolphins nag carefully regular pinto beans. slyly special deposits pr +32258|28|O|59954.11|1997-01-29|5-LOW|Clerk#000000597|0|jole slyly furiously special platelets. slyly bold foxes slee +32259|724|O|189710.88|1996-01-16|2-HIGH|Clerk#000000726|0|tions detect. express, expre +32260|1225|O|254684.68|1997-02-21|1-URGENT|Clerk#000000394|0| throughout the furiously ironic epitaphs are +32261|355|F|69059.03|1993-01-31|1-URGENT|Clerk#000000371|0|nusual deposits haggle a +32262|794|O|307334.22|1998-05-14|1-URGENT|Clerk#000000141|0|e unusual, even ideas. slyly pending packag +32263|490|O|93494.66|1996-09-10|3-MEDIUM|Clerk#000000217|0|iously pending theodolites. daring, bold instructions integrate furiously cl +32288|1108|O|246843.08|1996-03-02|3-MEDIUM|Clerk#000000179|0|the quickly unusual requests are quickly ironic depen +32289|256|O|27420.14|1998-03-02|5-LOW|Clerk#000000049|0|ges. regular packages detect carefu +32290|160|O|126554.97|1997-04-06|4-NOT SPECIFIED|Clerk#000000533|0|posits are furiously blithely silent courts. brave, final courts +32291|892|F|173176.65|1994-11-06|3-MEDIUM|Clerk#000000050|0| thinly sly instructions. special dugouts affix furiously ironic reques +32292|571|F|262598.76|1992-02-16|5-LOW|Clerk#000000397|0| beans hinder according to the slyly unusual requests? blithely +32293|625|O|275339.98|1995-11-15|1-URGENT|Clerk#000000321|0|riously furiously final packages. slyly final instructions na +32294|835|O|89937.52|1996-02-19|3-MEDIUM|Clerk#000000732|0|press theodolites. pinto beans are according to t +32295|544|F|83267.42|1994-01-08|2-HIGH|Clerk#000000469|0|hely bold dolphins. blithely fina +32320|1205|O|127195.19|1997-03-02|4-NOT SPECIFIED|Clerk#000000060|0|r the carefully final accounts. express accounts nag. carefully express requ +32321|706|O|369804.91|1996-12-15|4-NOT SPECIFIED|Clerk#000000466|0|ests wake alongside of the blithely even warthogs. slyly unusual excuses a +32322|1064|O|100838.17|1997-08-07|5-LOW|Clerk#000000719|0|counts haggle accounts. e +32323|1417|F|240788.04|1993-07-24|2-HIGH|Clerk#000000930|0|. even, regular requests engage; ironic in +32324|190|O|303598.07|1996-11-19|1-URGENT|Clerk#000000850|0|lyly special sentiments wake furiously carefully idle packages. fur +32325|1202|F|214373.89|1992-11-02|1-URGENT|Clerk#000000361|0| unwind furiously. slyly even theodolites according to the sl +32326|226|F|12517.97|1993-11-01|2-HIGH|Clerk#000000172|0|y regular asymptotes. furiousl +32327|307|F|223663.44|1992-08-08|5-LOW|Clerk#000000939|0| about the idle foxes. pending, final pint +32352|1235|O|112621.57|1997-09-08|1-URGENT|Clerk#000000331|0|unts was furiously. regular packages pri +32353|331|O|200807.82|1998-05-29|5-LOW|Clerk#000000205|0| slyly among the carefully express requests. furiously spec +32354|652|O|103821.79|1996-03-13|5-LOW|Clerk#000000987|0|ly regular accounts above the packa +32355|652|F|232785.33|1994-05-21|4-NOT SPECIFIED|Clerk#000000088|0|sly regular deposits use. carefully iron +32356|400|F|241364.06|1992-10-11|4-NOT SPECIFIED|Clerk#000000211|0|ccounts wake quickly. accounts haggle along the qui +32357|694|O|120769.90|1996-02-06|3-MEDIUM|Clerk#000000808|0|es are blithely across the unusual warhorses. furiously final ac +32358|1478|F|245979.73|1994-06-10|2-HIGH|Clerk#000000174|0|final foxes sleep furi +32359|241|O|168832.68|1996-12-05|2-HIGH|Clerk#000000690|0|y express ideas. blithely final cou +32384|235|O|178886.95|1998-04-24|5-LOW|Clerk#000000821|0|le fluffily. bold packages wake fluffily. sometimes ironic pi +32385|1390|O|279695.95|1996-08-15|5-LOW|Clerk#000000390|0|ges sleep across the blithely unusual instructions. requests +32386|412|F|62536.33|1992-04-19|1-URGENT|Clerk#000000904|0|equests haggle after the instructions. furiously close pea +32387|815|O|10755.29|1997-12-16|2-HIGH|Clerk#000000675|0|xes sleep carefully after the regular instructions. slyly unusual reque +32388|572|O|99601.77|1996-03-19|2-HIGH|Clerk#000000012|0| to the quickly final dependencies hang special ideas-- a +32389|652|F|317103.71|1993-11-01|3-MEDIUM|Clerk#000000444|0| deposits against the express instructions cajole above the bold w +32390|1282|O|13963.33|1996-09-10|4-NOT SPECIFIED|Clerk#000000550|0|e quickly ironic pack +32391|1478|F|128426.86|1993-05-27|4-NOT SPECIFIED|Clerk#000000239|0|e silent theodolites. carefully regular theodolites det +32416|328|O|229289.59|1997-12-25|1-URGENT|Clerk#000000021|0|l deposits. pending deposits af +32417|1459|F|51701.10|1993-04-13|2-HIGH|Clerk#000000879|0|. blithely even sheaves boost according to the furiously even +32418|1465|F|88440.40|1994-01-01|4-NOT SPECIFIED|Clerk#000000859|0|bold dependencies sleep furiously. f +32419|1442|O|156772.88|1997-04-16|1-URGENT|Clerk#000000151|0|hins use. slyly unusual accounts run. furiously e +32420|706|F|316425.39|1994-07-30|3-MEDIUM|Clerk#000000228|0|jole among the slyly bold pinto beans. carefully even +32421|247|O|106543.06|1995-12-19|4-NOT SPECIFIED|Clerk#000000548|0|into beans are fluffily around the carefully final depe +32422|1001|O|166463.78|1995-12-17|5-LOW|Clerk#000000242|0|nticing packages nag fluffily pending, ironic accounts! carefully expre +32423|437|O|100837.67|1997-12-25|3-MEDIUM|Clerk#000000868|0|, bold requests are slyly +32448|403|O|74417.27|1998-06-17|5-LOW|Clerk#000000396|0|equests detect carefully at the ironic, final requests. ironic requests slee +32449|397|F|169828.17|1992-12-10|1-URGENT|Clerk#000000784|0|s deposits haggle about the q +32450|1258|O|140447.56|1995-12-20|3-MEDIUM|Clerk#000000438|0|use blithely blithely pending theodolites; carefully idle requests nag +32451|40|F|173840.90|1994-03-25|4-NOT SPECIFIED|Clerk#000000672|0|jole carefully alongsi +32452|1120|O|143848.96|1995-07-19|3-MEDIUM|Clerk#000000351|0|s the carefully ironic dependencies sleep carefully carefully +32453|427|O|196169.50|1997-06-25|5-LOW|Clerk#000000658|0|into beans alongside of the quickly pending deposits haggle slyly a +32454|1259|F|117337.79|1995-04-01|1-URGENT|Clerk#000000378|0| unusual, ironic accounts are finally ruthlessly final pinto beans. +32455|341|F|134292.48|1993-09-24|2-HIGH|Clerk#000000583|0|deas wake above the slyly regular deposits. ironic, +32480|100|O|122188.64|1997-03-10|3-MEDIUM|Clerk#000000764|0|gular foxes promise. packages sleep furiousl +32481|59|O|41290.03|1995-09-30|2-HIGH|Clerk#000000186|0|structions integrat +32482|473|O|267388.05|1996-11-12|1-URGENT|Clerk#000000052|0|ts affix furiously requests-- speci +32483|1216|F|166250.89|1994-08-04|5-LOW|Clerk#000000041|0|affix carefully special deposits. express requests sleep fluffily b +32484|1048|F|112155.90|1995-02-05|4-NOT SPECIFIED|Clerk#000000582|0|heodolites. even pinto beans are according to the excuses. furiously pending +32485|1123|F|124587.84|1993-06-30|4-NOT SPECIFIED|Clerk#000000211|0|even, ironic ideas. quickly unusual theodolites wake slyly. blithely ironic mu +32486|1049|F|136286.44|1994-11-01|4-NOT SPECIFIED|Clerk#000000379|0|bove the quickly express pinto beans are carefully according to +32487|1195|O|148829.70|1996-03-26|1-URGENT|Clerk#000000338|0|y. carefully regular requests affix slyly slyly bold accounts. unusual, eve +32512|796|O|5543.82|1997-08-15|4-NOT SPECIFIED|Clerk#000000243|0|s. regular, final deposits x- +32513|829|F|118405.60|1992-02-03|5-LOW|Clerk#000000740|0|ts haggle according to the unusual, perma +32514|1444|F|82695.57|1992-09-26|5-LOW|Clerk#000000531|0| fluffily slyly special packages? regular +32515|796|O|253320.74|1996-08-26|5-LOW|Clerk#000000666|0|e the quickly even platelets. final, even dependencies wake regu +32516|932|F|125678.30|1993-10-25|1-URGENT|Clerk#000000382|0|posits. regular, even instructions haggle. pending acco +32517|1294|F|38794.55|1992-05-30|5-LOW|Clerk#000000701|0|ording to the deposits cajole slyly above the carefully regular foxes. slyly +32518|74|O|46418.83|1996-12-27|5-LOW|Clerk#000000009|0|ccounts are fluffily. final, final deposits are +32519|448|F|268082.00|1993-10-09|5-LOW|Clerk#000000657|0|ackages. idly final deposits could wake slyly of the doggedly expre +32544|896|O|95375.62|1996-02-29|5-LOW|Clerk#000000595|0|sual asymptotes. accounts along the slyly regular accounts wake sly +32545|742|O|23352.26|1995-10-29|1-URGENT|Clerk#000000189|0|ts. regular, final theodolites sleep requests. bold, regular deposi +32546|55|P|143581.16|1995-03-19|1-URGENT|Clerk#000000130|0|al requests. accounts cajole blithely. final foxe +32547|853|O|11698.54|1997-02-23|2-HIGH|Clerk#000000783|0|inst the bold packages. packages haggle furiously +32548|208|O|148133.56|1997-02-24|5-LOW|Clerk#000000555|0|use after the slyly even accounts. fluffily ironic courts are accounts. +32549|265|O|264397.63|1996-04-16|1-URGENT|Clerk#000000043|0|lly. carefully special requests use. quickly unusual courts d +32550|662|F|18759.68|1992-07-25|1-URGENT|Clerk#000000332|0|ent pinto beans. brave instructions boost daringly. pending dependencies hag +32551|859|O|38610.54|1996-05-13|1-URGENT|Clerk#000000659|0|sual requests wake at the even requests. quickly +32576|539|O|79345.79|1996-10-02|1-URGENT|Clerk#000000088|0|onic accounts. blithely even pinto b +32577|491|F|197710.69|1993-08-25|1-URGENT|Clerk#000000745|0|lly along the slyly silent theodo +32578|724|F|63264.41|1995-02-06|2-HIGH|Clerk#000000761|0|phs integrate slyly deposits-- quickly regular +32579|977|O|68575.44|1995-10-31|5-LOW|Clerk#000000626|0|onic packages haggle blithely. accounts afte +32580|151|O|238434.25|1995-09-16|2-HIGH|Clerk#000000416|0|slyly special ideas use furiously against +32581|359|O|106194.07|1997-01-09|3-MEDIUM|Clerk#000000192|0|ccounts should have to are. slyly regular requests +32582|380|F|223839.79|1994-06-26|4-NOT SPECIFIED|Clerk#000000097|0| wake fluffily instructions. blithely regular deposits haggle +32583|253|O|245035.44|1996-02-14|2-HIGH|Clerk#000000354|0|ly bold requests use blithely. carefully pen +32608|1444|F|250006.53|1992-05-23|2-HIGH|Clerk#000000672|0|ily silent requests. instructions according to the quickly regular forges hin +32609|767|O|85341.31|1996-05-17|1-URGENT|Clerk#000000212|0|nstructions use ironic foxes. even ideas detect blithely furiously +32610|1396|F|329621.61|1992-08-20|4-NOT SPECIFIED|Clerk#000000452|0| special instructions sleep carefully final foxes. slyly ruthless accounts c +32611|968|F|230436.29|1994-08-28|3-MEDIUM|Clerk#000000751|0|fily unusual frets. accounts detect around the furiously +32612|1169|F|31112.50|1993-01-01|1-URGENT|Clerk#000000575|0|ously regular deposits around the fluffily unusual acco +32613|967|O|360022.89|1995-12-17|5-LOW|Clerk#000000859|0|cies wake after the express foxes. ruthlessly final packages caj +32614|520|O|193124.85|1996-08-15|4-NOT SPECIFIED|Clerk#000000292|0|ages detect blithely. carefully special requests against the s +32615|1348|F|29588.82|1992-01-15|4-NOT SPECIFIED|Clerk#000000128|0|es kindle carefully. quickly ironic accounts use against the unusual +32640|1459|F|259032.81|1992-09-16|2-HIGH|Clerk#000000128|0|und the ideas. slyly final accounts affix quickly. deposits wake furiously +32641|400|F|247363.41|1993-03-22|2-HIGH|Clerk#000000500|0| furiously above the quickly even theodolites. blit +32642|1237|F|26434.21|1992-03-30|3-MEDIUM|Clerk#000000150|0|y ironic accounts cajole among the blithely r +32643|890|O|45715.20|1997-06-20|3-MEDIUM|Clerk#000000341|0|ly pending platelets. s +32644|49|O|66634.86|1997-04-21|2-HIGH|Clerk#000000196|0|ng requests cajole evenly according to th +32645|82|O|90569.28|1997-05-24|2-HIGH|Clerk#000000145|0|lar warhorses. never even foxes integrate across the car +32646|872|O|98585.16|1997-05-12|4-NOT SPECIFIED|Clerk#000000718|0|g requests among the blithely express packages haggle furiously furious pack +32647|1160|O|152970.85|1995-11-19|2-HIGH|Clerk#000000746|0|ke fluffily quickly unusual pinto beans. ironic, final accounts h +32672|568|F|132639.22|1994-06-10|5-LOW|Clerk#000000413|0|ronic, ruthless deposits cajole quickly requests. quickly regular pinto +32673|1018|O|29135.87|1996-09-12|4-NOT SPECIFIED|Clerk#000000650|0|o beans cajole alongside of the regular pinto beans. pending, pendi +32674|364|O|50548.92|1997-10-06|3-MEDIUM|Clerk#000000250|0|dolites: slyly quick packages use fluffily regular foxes. regular +32675|1375|F|117403.18|1994-11-04|2-HIGH|Clerk#000000372|0|arefully along the even asymptotes. carefully unusual packages around +32676|872|F|136735.69|1994-02-02|1-URGENT|Clerk#000000981|0|ckly furious requests. quickly silen +32677|652|O|1733.41|1996-03-05|1-URGENT|Clerk#000000477|0|ly silent requests cajole e +32678|1060|O|85512.29|1995-12-17|3-MEDIUM|Clerk#000000534|0|onic deposits nod blithely silent excus +32679|520|O|113795.93|1997-12-30|1-URGENT|Clerk#000000058|0|pinto beans nag clos +32704|161|O|131279.97|1998-02-08|3-MEDIUM|Clerk#000000531|0|ically ironic accounts wake. fluffi +32705|1189|F|60425.21|1994-03-26|5-LOW|Clerk#000000324|0|ully after the regular instructions. bold, bold instructions alongside of th +32706|1072|F|62741.69|1994-07-05|1-URGENT|Clerk#000000527|0|y furiously pending accounts: permanently unusual dependencies boo +32707|292|F|69067.27|1994-04-12|5-LOW|Clerk#000000799|0| slyly ironic notornis cajole fluffily. bold, bold accounts play. +32708|23|O|116176.45|1995-12-27|4-NOT SPECIFIED|Clerk#000000279|0|f the quickly busy theodolites. requests s +32709|1244|O|289763.85|1996-02-05|5-LOW|Clerk#000000445|0|ven depths. stealthy patterns of the blithely unusual platelets cajole flu +32710|707|F|113910.35|1994-11-17|2-HIGH|Clerk#000000440|0| was ironically foxes. special deposits doubt fluffily blithel +32711|1427|O|242600.12|1996-02-04|3-MEDIUM|Clerk#000000980|0|. slyly regular plat +32736|1144|O|110926.31|1998-02-12|2-HIGH|Clerk#000000375|0|ing requests: regular platelets according to the blithely unusual instructi +32737|476|F|213149.30|1994-10-29|2-HIGH|Clerk#000000380|0|ronic theodolites along the instructions doubt against the +32738|1102|O|11534.32|1998-03-16|2-HIGH|Clerk#000000788|0|, even excuses sleep carefull +32739|292|O|45253.07|1996-10-07|2-HIGH|Clerk#000000467|0|e above the carefully pending accounts. carefull +32740|1279|F|38455.43|1992-10-09|3-MEDIUM|Clerk#000000726|0|uffily alongside of the express frets. carefully final requests +32741|1024|F|298590.61|1994-02-16|5-LOW|Clerk#000000924|0|fluffily regular accounts +32742|409|O|123732.99|1998-05-17|5-LOW|Clerk#000000963|0|sleep quickly quickly ironic packages. special, final pinto beans boost fluff +32743|385|F|95901.83|1993-05-08|1-URGENT|Clerk#000000613|0|gular, regular foxes. slyly pending deposits around +32768|1265|O|214504.91|1997-08-05|4-NOT SPECIFIED|Clerk#000000953|0|al requests haggle. final, express ideas lose fluf +32769|1000|O|93737.29|1997-01-22|2-HIGH|Clerk#000000956|0|y final requests haggle? qui +32770|1186|O|226224.41|1996-01-28|3-MEDIUM|Clerk#000000034|0| furious requests. blithely blithe foxes +32771|29|O|191338.49|1997-01-12|1-URGENT|Clerk#000000607|0|ckly slyly pending cour +32772|803|O|193587.73|1997-10-16|2-HIGH|Clerk#000000062|0|e according to the ironic accounts. ironic, bo +32773|1078|O|340782.49|1998-06-02|4-NOT SPECIFIED|Clerk#000000137|0|as. carefully special pinto beans haggle fluffily. unusual accounts are car +32774|259|F|55452.83|1993-06-16|2-HIGH|Clerk#000000331|0|ing asymptotes wake slyly about the slyly pending pinto beans. blithely final +32775|712|O|139799.96|1996-12-31|1-URGENT|Clerk#000000383|0| excuses cajole carefully slyly final theodolites. furiously final requests +32800|220|F|184692.35|1994-01-22|4-NOT SPECIFIED|Clerk#000000883|0|p furiously furiously +32801|1082|O|147575.45|1997-04-30|5-LOW|Clerk#000000233|0|counts about the furiously final instructions hinder carefully caref +32802|1243|O|98685.07|1998-04-19|5-LOW|Clerk#000000392|0| careful requests impress carefully even packages. quietl +32803|34|O|103309.88|1995-12-17|3-MEDIUM|Clerk#000000407|0|tions. furiously regula +32804|598|F|137895.64|1992-09-10|3-MEDIUM|Clerk#000000212|0|uches wake fluffily slyly unusual requ +32805|901|F|103772.26|1992-05-04|1-URGENT|Clerk#000000599|0|ke against the carefully ironic theodolites. fluffily +32806|148|O|187435.20|1995-06-22|2-HIGH|Clerk#000000890|0|ments. pending dolphins are c +32807|226|F|178629.71|1994-01-27|1-URGENT|Clerk#000000838|0| carefully regular packages sleep even, darin +32832|763|O|220189.25|1997-12-30|4-NOT SPECIFIED|Clerk#000000403|0|uickly pending accounts. slyly +32833|904|O|151506.82|1997-08-27|3-MEDIUM|Clerk#000000575|0|foxes print final accounts. slyly special requests a +32834|559|F|56159.09|1993-08-28|1-URGENT|Clerk#000000387|0|e fluffily unusual courts: blithely final d +32835|487|F|203096.56|1992-07-08|3-MEDIUM|Clerk#000000927|0|grate alongside of the furiously unu +32836|655|O|130618.53|1996-08-07|4-NOT SPECIFIED|Clerk#000000103|0|ect furiously according to the bold instruct +32837|433|F|49976.87|1994-05-14|3-MEDIUM|Clerk#000000557|0|the deposits. ironic, even de +32838|955|P|69022.29|1995-05-12|1-URGENT|Clerk#000000949|0|the close accounts. furiously +32839|419|O|293359.99|1996-12-09|5-LOW|Clerk#000000065|0|ut the carefully pending accounts. regular ins +32864|1096|O|186389.52|1997-10-09|4-NOT SPECIFIED|Clerk#000000071|0|ve the furiously ironic p +32865|268|F|35834.46|1994-09-03|3-MEDIUM|Clerk#000000475|0| theodolites haggle furiously. even, express accounts haggle furious +32866|307|O|69045.24|1998-02-19|3-MEDIUM|Clerk#000000249|0|packages boost sometimes frets; slyly ironic requests cajo +32867|811|O|11287.32|1998-01-10|1-URGENT|Clerk#000000066|0|furiously regular requests. blithely unusual foxes +32868|325|F|51221.72|1994-01-18|4-NOT SPECIFIED|Clerk#000000016|0|ns. quickly regular forges sleep slyly bold epitaphs. slyly +32869|496|F|217813.70|1994-03-28|3-MEDIUM|Clerk#000000358|0|y furiously final accounts. boldly stealthy ideas against the ironic plat +32870|1061|O|171988.44|1997-02-26|4-NOT SPECIFIED|Clerk#000000927|0|nic deposits around the even, silent deposits boos +32871|910|F|131098.70|1992-10-27|2-HIGH|Clerk#000000310|0| even deposits affix along the blithely ironic warthogs. silen +32896|1294|O|222311.79|1997-04-05|2-HIGH|Clerk#000000446|0|ts. blithely regular dependencies cajole carefully iro +32897|32|O|224613.70|1996-02-03|1-URGENT|Clerk#000000157|0| asymptotes cajole blithely according to the express +32898|859|F|111250.57|1994-08-24|5-LOW|Clerk#000000547|0|uickly express accounts. slyly final asymptotes could doubt. instruct +32899|523|F|92823.77|1994-04-18|5-LOW|Clerk#000000967|0|quickly. blithely bo +32900|1217|O|29191.10|1997-06-14|3-MEDIUM|Clerk#000000580|0|arefully final packages integrate instruct +32901|1214|F|281360.94|1995-01-11|1-URGENT|Clerk#000000516|0|nic ideas wake. unusual, pending dolphins af +32902|1453|F|174746.34|1992-03-04|2-HIGH|Clerk#000000261|0|slyly even accounts. blithely u +32903|925|F|243233.61|1992-07-27|5-LOW|Clerk#000000787|0|the quickly blithe accounts. furiously even requests cajole slyly. pendi +32928|428|P|305812.89|1995-05-10|3-MEDIUM|Clerk#000000631|0|platelets are slyly across the theodolites. silent requests will have to +32929|1363|P|235919.13|1995-05-03|5-LOW|Clerk#000000001|0|sias against the excuses haggle slyly against the even +32930|1256|O|99349.94|1996-04-25|3-MEDIUM|Clerk#000000223|0|theodolites poach q +32931|257|F|167328.12|1993-02-16|5-LOW|Clerk#000000753|0|ndencies nag. regular accounts boost across the ironic ideas. thin +32932|281|F|141457.90|1993-01-10|5-LOW|Clerk#000000902|0| pearls cajole blithely among the fi +32933|1483|O|21232.46|1996-07-29|4-NOT SPECIFIED|Clerk#000000454|0|e carefully final epitaphs. regular packages +32934|1276|O|87912.54|1998-02-21|3-MEDIUM|Clerk#000000861|0|en accounts. fluffily ironic courts into the thinly +32935|1108|F|95918.70|1994-01-15|2-HIGH|Clerk#000000909|0|furiously regular foxes. regular asymptotes use furiously across th +32960|500|F|195322.70|1994-02-08|3-MEDIUM|Clerk#000000738|0| accounts sleep furiously. carefully unusual deposits affix carefull +32961|247|F|76137.24|1993-03-18|1-URGENT|Clerk#000000006|0|s haggle ironically evenly final foxes. blithely ironic dolphins nag blithe +32962|206|O|41698.50|1995-04-09|2-HIGH|Clerk#000000263|0|lly final requests mold carefully among the bold waters. re +32963|850|O|56490.76|1997-04-06|2-HIGH|Clerk#000000736|0|ing to the blithely bold requests. blithely sile +32964|824|O|77632.66|1996-08-14|1-URGENT|Clerk#000000775|0|riously blithely regular ideas. deposits integrate according to +32965|223|P|272842.24|1995-02-25|2-HIGH|Clerk#000000790|0|lyly regular package +32966|1006|F|260459.34|1992-01-27|5-LOW|Clerk#000000600|0|se among the carefully close requests. furiously final accoun +32967|709|O|217985.10|1998-03-16|1-URGENT|Clerk#000000606|0|ructions. slyly express dolphi +32992|1295|O|254513.56|1996-06-02|3-MEDIUM|Clerk#000000937|0|s about the final theod +32993|1144|F|123719.02|1992-04-04|4-NOT SPECIFIED|Clerk#000000778|0|ing requests according +32994|806|F|119938.90|1992-09-17|1-URGENT|Clerk#000000945|0| instructions. carefully bold requests wake; fluffily final forges affix +32995|464|O|274969.46|1998-02-17|3-MEDIUM|Clerk#000000575|0|to are. furiously express instructions use evenly. b +32996|1021|F|167749.08|1993-12-18|1-URGENT|Clerk#000000321|0|ongside of the express asymptotes. slyly even dependencies sleep fluffily +32997|1429|O|31601.58|1997-09-29|1-URGENT|Clerk#000000852|0| bold theodolites above the f +32998|1132|F|81180.68|1993-09-30|4-NOT SPECIFIED|Clerk#000000680|0|t the asymptotes boos +32999|268|F|164994.97|1994-04-15|5-LOW|Clerk#000000538|0| packages cajole courts. depe +33024|1096|F|150773.99|1992-05-07|2-HIGH|Clerk#000000814|0|aggle furiously blithely fluffy excuses. regular foxes mold alongside o +33025|1144|F|202527.42|1994-01-25|5-LOW|Clerk#000000884|0|to beans affix slyly carefully pending packages. accounts w +33026|859|O|57894.31|1995-11-08|4-NOT SPECIFIED|Clerk#000000217|0|y silent instructions. ironic accounts alo +33027|1486|O|154285.00|1997-04-22|3-MEDIUM|Clerk#000000089|0|e furiously ironic requests dazzle furiously about the bold +33028|1309|O|183833.90|1996-09-22|1-URGENT|Clerk#000000160|0|packages cajole alongside of the +33029|1333|F|139779.60|1992-06-01|2-HIGH|Clerk#000000722|0|refully even instructio +33030|496|O|140926.80|1996-12-09|3-MEDIUM|Clerk#000000470|0| unusual foxes above the slyly unusual excuses caj +33031|611|F|143725.86|1992-08-25|2-HIGH|Clerk#000000905|0|es. furiously special ideas are +33056|835|O|147965.71|1998-06-21|2-HIGH|Clerk#000000740|0|usly regular deposits. slyly even packages promise blithely furiously ironic +33057|1229|O|135750.82|1998-07-23|5-LOW|Clerk#000000089|0| regular pinto beans boost ide +33058|595|F|20651.24|1992-10-06|4-NOT SPECIFIED|Clerk#000000828|0|packages. fluffily even packages haggle furiously. regu +33059|1172|F|82110.94|1993-02-25|1-URGENT|Clerk#000000660|0|eyond the carefully ironic packages. blithely si +33060|730|F|251931.15|1993-02-20|2-HIGH|Clerk#000000573|0|lets. slyly slow deposits detect across the ironic de +33061|358|O|139280.04|1995-07-16|2-HIGH|Clerk#000000555|0|gular deposits integrate fluff +33062|448|O|168525.05|1996-01-19|3-MEDIUM|Clerk#000000507|0| accounts snooze regular, final pearls? silent requests wake quickly. blit +33063|97|O|158217.91|1997-09-04|2-HIGH|Clerk#000000763|0|press. regularly even t +33088|776|F|169986.60|1994-12-24|4-NOT SPECIFIED|Clerk#000000525|0| around the regular, final ideas. furiously final instructions cajole f +33089|1225|F|164590.57|1993-05-31|5-LOW|Clerk#000000061|0| furiously final instructions. escap +33090|800|F|269641.99|1994-08-06|3-MEDIUM|Clerk#000000176|0|accounts sleep furiously pending theodolites. fluffily regular deposits wa +33091|283|F|56302.99|1995-01-26|2-HIGH|Clerk#000000551|0| the quickly final pinto beans. pending pl +33092|1414|O|194773.53|1997-03-29|5-LOW|Clerk#000000497|0|ously even attainments detect fluffily regular, bold deposits. express +33093|1426|O|141685.40|1997-05-17|4-NOT SPECIFIED|Clerk#000000033|0|ideas. quickly regular requests cajole carefully carefully ste +33094|169|F|47158.12|1992-08-29|2-HIGH|Clerk#000000567|0|symptotes. blithely expr +33095|10|F|239749.78|1994-02-16|4-NOT SPECIFIED|Clerk#000000771|0|riously packages. boldly bold instructions boost furiously slyly regular de +33120|1369|F|14492.60|1994-01-25|2-HIGH|Clerk#000000005|0|requests haggle blithely. even, ironic pinto beans boost carefu +33121|478|O|223572.15|1998-02-11|4-NOT SPECIFIED|Clerk#000000490|0|ly bold dependencies promise furiously bl +33122|542|F|113172.56|1993-06-20|5-LOW|Clerk#000000055|0|s. regular packages a +33123|1261|F|137550.77|1993-11-25|3-MEDIUM|Clerk#000000030|0|ackages. slyly special deposits cajole through the +33124|514|O|95631.96|1995-09-21|2-HIGH|Clerk#000000087|0|asymptotes integrate unusual, final foxes. quickly unusual accounts abov +33125|1438|O|160249.72|1997-02-26|4-NOT SPECIFIED|Clerk#000000239|0|l instructions are blithely across the silently unusu +33126|334|O|105483.69|1995-11-13|1-URGENT|Clerk#000000130|0|ithely. fluffily final deposits sleep furiously above the furiously regul +33127|1450|F|17024.72|1993-09-03|4-NOT SPECIFIED|Clerk#000000430|0|ing instructions among the furiously +33152|962|F|98540.51|1993-11-22|1-URGENT|Clerk#000000611|0|e slyly after the frets! excuses detect furi +33153|776|O|133537.01|1997-06-04|2-HIGH|Clerk#000000639|0|iously after the slyly express orbits. blithely fi +33154|100|F|30287.40|1993-08-04|1-URGENT|Clerk#000000689|0|even packages. quick +33155|394|O|104718.07|1996-10-14|3-MEDIUM|Clerk#000000155|0|g slyly ironic deposits. fluffily regular +33156|698|F|165060.85|1992-11-17|2-HIGH|Clerk#000000146|0|usly above the dolphi +33157|655|O|291529.42|1996-07-10|3-MEDIUM|Clerk#000000603|0|s unwind slyly after the furiously regular depo +33158|748|O|49739.00|1998-02-13|4-NOT SPECIFIED|Clerk#000000816|0| dependencies! fluffily regular sheaves nag fluffily. slyly even courts sl +33159|820|F|77057.88|1992-04-28|3-MEDIUM|Clerk#000000919|0| requests. blithely ironic requ +33184|800|F|61466.41|1992-02-14|4-NOT SPECIFIED|Clerk#000000078|0|y: unusual ideas wake slyly. carefu +33185|101|O|85094.36|1996-10-13|5-LOW|Clerk#000000303|0|after the furiously regular dependencies +33186|131|F|202701.36|1992-08-29|5-LOW|Clerk#000000730|0|es solve for the quickly final foxes. carefully express patterns wake. +33187|1208|F|164508.45|1994-10-26|3-MEDIUM|Clerk#000000481|0|according to the blithely regular packages nag after the furiously +33188|949|O|3119.73|1995-08-22|1-URGENT|Clerk#000000641|0|s are quickly even deposits. blithely ironic packages eat blithely before t +33189|1492|F|192088.40|1994-11-21|5-LOW|Clerk#000000180|0|ly against the special braids. s +33190|217|O|130643.39|1997-10-15|4-NOT SPECIFIED|Clerk#000000871|0|ly ironic requests above the special pinto beans cajole blithely express +33191|200|O|220032.14|1997-02-19|4-NOT SPECIFIED|Clerk#000000958|0|kages affix theodolites? furiously even instructions alongside o +33216|863|O|98904.07|1996-06-17|3-MEDIUM|Clerk#000000577|0|usly regular ideas. special requests use blithely around the quickly thin idea +33217|833|F|240143.58|1994-03-13|2-HIGH|Clerk#000000949|0|ly platelets. furiously regular accounts kindle careful +33218|859|F|255529.31|1993-01-07|4-NOT SPECIFIED|Clerk#000000184|0| requests integrate quickly +33219|997|O|216050.48|1995-12-11|2-HIGH|Clerk#000000019|0|jole furiously. quickly express requests haggle. slyly even +33220|107|F|182853.66|1994-04-16|4-NOT SPECIFIED|Clerk#000000118|0|thely according to the thinly pending pinto beans. someti +33221|1381|O|4970.19|1997-08-03|1-URGENT|Clerk#000000011|0|jole carefully above the unusual, pending requests. re +33222|772|F|150774.62|1992-06-20|3-MEDIUM|Clerk#000000244|0|cial sauternes are fluffil +33223|14|O|27393.03|1996-08-22|4-NOT SPECIFIED|Clerk#000000035|0|sts. furiously final ideas haggle carefully. qu +33248|214|O|289510.97|1997-02-13|3-MEDIUM|Clerk#000000675|0| detect quickly carefully pending accounts. unusual dolph +33249|631|F|162535.46|1992-09-23|5-LOW|Clerk#000000418|0|ronic, even realms wake fluffily unusual instructions. furious +33250|1114|F|160684.24|1994-06-26|4-NOT SPECIFIED|Clerk#000000217|0|ly. final asymptotes kindle fluffily carefully final packages. slyly ironic +33251|1051|F|12665.83|1994-06-09|2-HIGH|Clerk#000000500|0|ly final foxes cajole slyly. packages alongside of the fu +33252|1006|F|347058.46|1992-03-26|1-URGENT|Clerk#000000532|0|ep furiously above the unusual, ironic foxes. carefully bold requests affix q +33253|82|O|66566.39|1995-12-01|4-NOT SPECIFIED|Clerk#000000312|0|uests according to the regular dinos engage blithely s +33254|1085|O|113912.98|1995-11-04|4-NOT SPECIFIED|Clerk#000000141|0|silently bold excuses along the quickly ironic multipliers affix quickly acco +33255|595|F|219258.03|1993-06-25|1-URGENT|Clerk#000000627|0|ial ideas affix furiously unusual ideas-- slyl +33280|1085|O|189079.41|1998-03-24|3-MEDIUM|Clerk#000000623|0|ronic packages. regular asymptotes cajole fluffily around the sometim +33281|1211|F|73503.15|1992-10-25|4-NOT SPECIFIED|Clerk#000000623|0|uriously unusual reque +33282|499|O|119094.37|1998-06-15|4-NOT SPECIFIED|Clerk#000000608|0| ironic, regular ideas. fl +33283|1204|F|294267.96|1993-03-21|3-MEDIUM|Clerk#000000231|0|ully unusual ideas; carefully even accounts haggl +33284|1441|F|101457.00|1992-04-01|5-LOW|Clerk#000000103|0|ins along the theodolit +33285|736|F|242939.92|1992-01-20|2-HIGH|Clerk#000000396|0|uests. carefully even pinto beans boost fluffily. fluffily p +33286|968|O|295531.24|1997-12-01|3-MEDIUM|Clerk#000000376|0| the pending dependencies serve ideas. +33287|1444|O|7013.92|1995-04-23|1-URGENT|Clerk#000000381|0|y final deposits. final, bold requests about +33312|190|O|183317.54|1996-06-24|3-MEDIUM|Clerk#000000488|0|ffix blithely. fluffily final idea +33313|565|O|262835.82|1997-01-07|3-MEDIUM|Clerk#000000955|0|ic dugouts. furiously final senti +33314|157|O|263874.02|1997-04-22|5-LOW|Clerk#000000210|0|r the packages. regular, even dependencies are. regular, bold requests do +33315|1486|O|301061.02|1997-08-09|4-NOT SPECIFIED|Clerk#000000012|0|ending excuses according +33316|1085|O|73919.18|1998-03-29|5-LOW|Clerk#000000726|0|y even theodolites. special, bold deposits against the sp +33317|1201|F|203248.49|1994-05-12|2-HIGH|Clerk#000000300|0|furiously blithe accounts u +33318|142|O|76554.90|1997-04-26|2-HIGH|Clerk#000000672|0|s wake after the regular, regular requests. carefully +33319|889|F|204529.90|1994-03-28|4-NOT SPECIFIED|Clerk#000000578|0|ctions. quickly even packages are along the packages. car +33344|982|F|1955.38|1994-02-10|4-NOT SPECIFIED|Clerk#000000821|0|about the packages wake furiously according to the final pinto beans. even acc +33345|698|O|215240.63|1996-04-29|5-LOW|Clerk#000000259|0|arefully regular requests after the evenly bold excuses ha +33346|1250|O|51805.70|1995-08-04|2-HIGH|Clerk#000000572|0|tes according to the carefully regular dugouts cajole regular +33347|298|F|99593.87|1992-08-27|1-URGENT|Clerk#000000996|0| theodolites. carefully special instructio +33348|977|F|62831.49|1994-11-08|1-URGENT|Clerk#000000706|0| slyly fluffily final excuses. carefully ironic pearls sno +33349|52|O|123286.36|1997-01-16|2-HIGH|Clerk#000000496|0|posits. stealthily even accounts mai +33350|1187|F|226324.89|1994-07-22|4-NOT SPECIFIED|Clerk#000000635|0|cial dependencies. re +33351|782|O|135033.19|1997-04-25|5-LOW|Clerk#000000347|0|g packages boost alongside of the frets. deposits cajole slyly. asymptotes +33376|673|O|33255.27|1996-09-29|3-MEDIUM|Clerk#000000559|0|xes. furiously ironic packages abou +33377|464|O|227115.27|1995-08-01|2-HIGH|Clerk#000000274|0|of the furiously ironic instructions. decoys above the carefully special ep +33378|886|F|348752.29|1992-04-28|2-HIGH|Clerk#000000300|0|y ironic requests boost +33379|362|O|22866.89|1997-12-21|5-LOW|Clerk#000000710|0|ress dolphins after the regular accounts are above the quick +33380|103|O|177978.28|1996-11-09|3-MEDIUM|Clerk#000000346|0| requests wake blithely about +33381|634|O|122658.54|1998-07-21|3-MEDIUM|Clerk#000000031|0|hogs. blithely ironic +33382|1486|O|41285.26|1997-05-07|2-HIGH|Clerk#000000280|0|s above the slyly final instructions d +33383|1405|O|83090.63|1996-12-05|5-LOW|Clerk#000000654|0|ular instructions. regular, regular foxes around the +33408|190|O|76540.35|1996-12-11|5-LOW|Clerk#000000761|0|kages nod regular excuses. ironic dolphins detect busily furiously pend +33409|103|F|29844.11|1992-04-11|5-LOW|Clerk#000000222|0|dencies after the dogged accounts ha +33410|1288|F|107026.15|1992-01-17|1-URGENT|Clerk#000000489|0|slyly. carefully regular accou +33411|572|O|219283.67|1998-01-10|2-HIGH|Clerk#000000382|0|uriously special somas. pinto beans boost quickly carefully s +33412|835|O|70751.59|1996-12-26|4-NOT SPECIFIED|Clerk#000000168|0|mptotes? blithely ironic deposits subl +33413|1484|O|109300.44|1996-06-23|2-HIGH|Clerk#000000029|0|kages. final, regular forges detect. blithely even packages +33414|1282|F|126984.89|1992-02-11|4-NOT SPECIFIED|Clerk#000000099|0|s: pending, final accounts snooze daringly across the carefully eve +33415|1409|F|58982.90|1993-02-06|5-LOW|Clerk#000000908|0|ructions against the express packages should are deposits. carefully ir +33440|601|O|184801.81|1998-04-25|1-URGENT|Clerk#000000719|0|usly among the furiously special r +33441|980|O|87058.25|1997-03-02|1-URGENT|Clerk#000000788|0|ions solve across the fu +33442|499|O|241047.55|1996-07-10|3-MEDIUM|Clerk#000000178|0|eep slyly pending packages. final grouches boost quickly +33443|7|F|62078.08|1992-05-04|1-URGENT|Clerk#000000901|0| carefully regular instructions about the slyly bold accounts use fluffily sly +33444|1234|F|167724.94|1992-10-07|3-MEDIUM|Clerk#000000326|0|press theodolites after the slyly quick theodolites nag across +33445|1207|F|252015.28|1992-08-03|5-LOW|Clerk#000000903|0|al, even ideas kindle furiously pending pinto beans. blithely fin +33446|1138|F|171759.46|1993-07-23|5-LOW|Clerk#000000464|0|avely final packages. furiousl +33447|875|O|99376.72|1997-11-06|1-URGENT|Clerk#000000464|0|riously ironic packages. furiously bold theodolites detect busi +33472|649|O|142351.31|1996-04-07|2-HIGH|Clerk#000000437|0|arefully final packages. slyly silent ideas ab +33473|1205|F|57243.63|1995-01-05|5-LOW|Clerk#000000686|0|across the carefully final instructions haggle unus +33474|418|F|72790.03|1994-08-25|5-LOW|Clerk#000000148|0|accounts use above the slyly ironic depos +33475|913|O|284109.52|1996-04-29|4-NOT SPECIFIED|Clerk#000000905|0|ding sheaves wake blithely beyond the carefully special requests. quiet +33476|1177|F|228504.88|1995-01-02|2-HIGH|Clerk#000000990|0|bout the furiously close plate +33477|1336|F|109357.53|1992-10-20|2-HIGH|Clerk#000000430|0|regular theodolites. carefully ironic deposits use blithely fluffil +33478|1450|F|137324.91|1993-06-15|2-HIGH|Clerk#000000954|0|ke carefully fluffily bold instructions; special, final +33479|136|F|249360.03|1992-09-19|1-URGENT|Clerk#000000923|0|r theodolites. slyly regular pinto beans run quickly furiously final +33504|1384|O|12202.94|1998-06-17|3-MEDIUM|Clerk#000000658|0|gouts. furiously ironic foxes +33505|644|F|201984.19|1993-09-26|5-LOW|Clerk#000000468|0|unts above the even accounts detect blithely deposits. slyly s +33506|1429|O|298021.21|1997-11-21|3-MEDIUM|Clerk#000000982|0| nag after the slyly pen +33507|154|F|138687.93|1992-02-14|5-LOW|Clerk#000000113|0|ix furiously about the slyly dogged deposits. furiously unusual foxes ha +33508|1426|O|43429.38|1995-12-09|3-MEDIUM|Clerk#000000689|0|ironic requests. slyly final deposits haggle permanently speci +33509|815|F|57250.93|1992-10-30|2-HIGH|Clerk#000000169|0|fully regular requests. depe +33510|1004|O|241009.12|1995-12-03|2-HIGH|Clerk#000000626|0| dolphins affix slyly bold accounts. ex +33511|580|O|201804.86|1998-02-27|4-NOT SPECIFIED|Clerk#000000394|0|ions do hang slyly. carefully unusual ideas after the +33536|1229|O|92608.27|1996-05-22|1-URGENT|Clerk#000000219|0|ic deposits nag. ideas haggle carefully blith +33537|1157|F|124572.13|1993-08-14|3-MEDIUM|Clerk#000000375|0| slyly special accounts use. deposits nag about the slyly fin +33538|916|O|19093.25|1996-08-11|2-HIGH|Clerk#000000393|0| ironic platelets mold slyly about the even, ironic accounts. patte +33539|217|O|81214.14|1996-03-03|2-HIGH|Clerk#000000707|0|ggle carefully about the furiously regular packages. unusual, regular +33540|791|P|187949.56|1995-06-07|5-LOW|Clerk#000000456|0|s sleep carefully. furiously regular +33541|1202|F|239040.92|1992-06-20|1-URGENT|Clerk#000000840|0|refully ironic water +33542|103|O|262724.68|1995-12-16|3-MEDIUM|Clerk#000000739|0|ackages are carefully blithely ironic accou +33543|1066|O|100518.58|1998-03-18|4-NOT SPECIFIED|Clerk#000000048|0| blithely bold foxes about the silent pack +33568|842|F|169750.18|1992-07-22|3-MEDIUM|Clerk#000000055|0|e blithely among the regular escapades. packages unwind quickl +33569|457|F|100957.11|1994-08-29|5-LOW|Clerk#000000652|0| forges are carefully. caref +33570|1285|F|193606.46|1992-12-17|4-NOT SPECIFIED|Clerk#000000972|0|ecial, regular ideas wake furiously final packages. blithely ironic +33571|886|O|17769.60|1995-10-12|3-MEDIUM|Clerk#000000329|0|the carefully ironic accounts will cajole slyly bold, pe +33572|103|F|222314.04|1992-07-02|3-MEDIUM|Clerk#000000798|0|regular packages sleep regular, final instructions. +33573|328|F|177695.77|1993-10-05|1-URGENT|Clerk#000000887|0|nos are fluffily. final, final accounts hang quic +33574|1388|O|189395.64|1996-08-23|4-NOT SPECIFIED|Clerk#000000657|0|ruthless instructions +33575|757|F|54740.70|1993-06-13|3-MEDIUM|Clerk#000000216|0|carefully upon the carefully b +33600|886|F|97401.73|1993-10-07|5-LOW|Clerk#000000542|0|ronic requests wake. fluffily bo +33601|202|O|79304.53|1995-12-19|2-HIGH|Clerk#000000404|0|ag. regular somas use around the quic +33602|1135|O|79889.86|1998-06-08|2-HIGH|Clerk#000000993|0|hely unusual dugouts use slyly. slyly bold foxes sleep slyly ironic patterns +33603|40|F|37604.34|1992-02-07|1-URGENT|Clerk#000000019|0|ffily final deposits thrash slyly against the slyly final accounts. unusua +33604|241|O|90485.30|1995-08-19|2-HIGH|Clerk#000000836|0|usual theodolites. final packages sleep final +33605|409|F|121557.10|1992-04-04|1-URGENT|Clerk#000000215|0|ve the quickly ironic packages. slyly special packages hinder +33606|653|F|30613.13|1992-03-02|2-HIGH|Clerk#000000086|0|bold theodolites are furiously about the final pinto beans. slyly pending depo +33607|1303|O|160640.88|1996-03-22|4-NOT SPECIFIED|Clerk#000000304|0|fluffily final requests affix quickly. theodol +33632|1360|F|73950.84|1993-03-14|1-URGENT|Clerk#000000708|0|egular realms. quickly even dinos was furiousl +33633|383|O|158292.99|1996-09-01|5-LOW|Clerk#000000072|0|ns sleep final, express in +33634|535|F|7573.89|1993-09-01|4-NOT SPECIFIED|Clerk#000000058|0|posits. carefully regular packages among +33635|1388|F|351086.78|1994-07-13|2-HIGH|Clerk#000000161|0|es. blithely regular accounts wake blithely carefully special requests. d +33636|1466|O|105867.43|1998-02-24|5-LOW|Clerk#000000068|0| final deposits wake. slyly express deposits are sly +33637|307|F|136188.84|1992-11-25|5-LOW|Clerk#000000540|0|ironic theodolites cajole carefully express excuses. regular +33638|179|F|23685.60|1994-02-09|4-NOT SPECIFIED|Clerk#000000040|0|nts are carefully after the regularly bold packages. qu +33639|364|O|141562.64|1995-11-03|1-URGENT|Clerk#000000159|0| requests. final, quiet ideas wake slyly. fur +33664|1102|F|20136.13|1992-10-08|4-NOT SPECIFIED|Clerk#000000364|0|to beans. bold, express instru +33665|226|P|138835.73|1995-05-26|5-LOW|Clerk#000000032|0| the final forges. quickly unusual requests snooze. fur +33666|730|F|162667.16|1992-07-17|4-NOT SPECIFIED|Clerk#000000187|0|y ideas. carefully final deposits use quickly. pending deposits +33667|403|O|54313.15|1997-08-14|5-LOW|Clerk#000000548|0|daring instructions use along the quickly i +33668|1135|O|50482.91|1997-04-25|3-MEDIUM|Clerk#000000667|0|oxes wake according to the carefully express pinto beans. ironic accounts w +33669|829|O|234713.77|1996-11-22|3-MEDIUM|Clerk#000000020|0|ilent dolphins about the ironic esc +33670|1213|F|201226.89|1992-04-28|2-HIGH|Clerk#000000816|0|int carefully fluffily even foxes. even Tiresias affix slyly. re +33671|586|O|70725.58|1996-06-09|2-HIGH|Clerk#000000394|0| the carefully unusu +33696|250|F|143484.93|1994-05-08|2-HIGH|Clerk#000000552|0|onic foxes. final, express theodolites cajole? +33697|31|O|64129.34|1998-06-18|3-MEDIUM|Clerk#000000606|0|ely dogged theodolites. final, p +33698|28|O|46576.24|1995-05-16|3-MEDIUM|Clerk#000000980|0|aggle among the regular platelets. accounts haggle. express dependencies wa +33699|53|F|134884.55|1994-07-27|5-LOW|Clerk#000000024|0|s are carefully for the th +33700|935|P|98646.58|1995-04-08|5-LOW|Clerk#000000666|0|lphins are slyly slyly express platelets. requests use +33701|7|F|157139.75|1994-10-02|3-MEDIUM|Clerk#000000522|0|ly silent requests hi +33702|329|F|246324.88|1992-09-03|4-NOT SPECIFIED|Clerk#000000177|0|y ironic requests poach according to the carefully special platelets. furio +33703|856|F|118897.46|1993-02-07|4-NOT SPECIFIED|Clerk#000000350|0|ver fluffy accounts. slyly unusual accounts sleep blithely r +33728|517|O|43843.40|1996-08-31|2-HIGH|Clerk#000000906|0|s about the carefully stealthy dolphins sleep around the blithely +33729|592|F|189331.50|1992-09-20|4-NOT SPECIFIED|Clerk#000000633|0|ns. slyly quick accounts at the fina +33730|1186|O|32643.26|1997-09-01|3-MEDIUM|Clerk#000000236|0|t slyly ideas. furiously express theodolites +33731|1394|F|226910.17|1992-10-09|2-HIGH|Clerk#000000754|0|sly express deposits. furiously +33732|38|F|84254.65|1994-08-29|4-NOT SPECIFIED|Clerk#000000023|0|y special deposits cajole b +33733|1213|F|44593.48|1993-08-18|1-URGENT|Clerk#000000703|0|s sleep carefully alongside of the never regu +33734|565|O|210807.84|1995-10-18|4-NOT SPECIFIED|Clerk#000000100|0|asymptotes sleep carefully. regular packages are slyly bl +33735|1339|O|166802.97|1996-07-09|3-MEDIUM|Clerk#000000555|0|ar ideas use accounts. flu +33760|767|F|48569.47|1992-07-30|2-HIGH|Clerk#000000130|0|usly careful pinto beans wake special courts. carefully pend +33761|719|F|289027.50|1992-08-05|2-HIGH|Clerk#000000344|0|enticingly unusual dependencies. fluffily regular +33762|295|O|130697.71|1996-01-15|4-NOT SPECIFIED|Clerk#000000800|0|pending accounts cajole-- express packages affix slyly around th +33763|190|F|23710.07|1993-09-24|4-NOT SPECIFIED|Clerk#000000511|0|ons. platelets boost. furiously regular theodolites are. quickly special reque +33764|1279|F|260372.46|1995-02-11|1-URGENT|Clerk#000000716|0|ly among the even requests. express instructions afte +33765|1292|O|180742.02|1997-05-10|1-URGENT|Clerk#000000331|0|ans. ironic requests snooze blithely: +33766|436|O|112918.54|1998-06-30|2-HIGH|Clerk#000000018|0| regular ideas. quickly regular excuses haggle. furiously regular packages d +33767|878|F|42192.13|1994-04-11|4-NOT SPECIFIED|Clerk#000000726|0|furiously? quickly ironic dependencies sleep quickly slyly regular excuses. b +33792|770|O|80259.25|1997-04-03|2-HIGH|Clerk#000000006|0|l dependencies integrate. regular courts try to poach doggedly. silently +33793|1457|F|122390.33|1992-06-28|1-URGENT|Clerk#000000233|0|es. slyly daring accounts are along the ac +33794|1069|F|272916.42|1995-02-23|1-URGENT|Clerk#000000853|0|tegrate across the accounts. blithely even ideas a +33795|1111|O|253496.81|1996-09-09|1-URGENT|Clerk#000000662|0|ding to the packages. f +33796|1450|O|213845.46|1997-08-29|5-LOW|Clerk#000000540|0|lithely final packages-- fu +33797|940|F|259029.43|1994-01-12|4-NOT SPECIFIED|Clerk#000000091|0|ular accounts integrate unusual theodolites. +33798|437|O|346778.01|1996-11-16|2-HIGH|Clerk#000000082|0|s wake slyly. slyly +33799|904|O|107267.92|1997-02-18|4-NOT SPECIFIED|Clerk#000000968|0|equests run. courts need to +33824|914|F|156756.20|1995-03-03|1-URGENT|Clerk#000000123|0|osits sleep carefully blithely regular accounts. carefully silent accounts h +33825|437|O|204733.58|1998-04-14|3-MEDIUM|Clerk#000000050|0| regular packages according to the slyly express packages mold bravely un +33826|223|F|199685.27|1993-12-20|5-LOW|Clerk#000000200|0|ag blithely. express +33827|88|F|8610.48|1994-01-03|4-NOT SPECIFIED|Clerk#000000564|0| packages; regular, special ideas after the b +33828|817|O|45791.29|1996-08-06|4-NOT SPECIFIED|Clerk#000000412|0|ly silent platelets are carefully after the blithely permanent deposits. blit +33829|91|O|80628.58|1997-11-17|1-URGENT|Clerk#000000421|0|e idly pending accounts. carefully spec +33830|1150|P|179964.55|1995-05-10|3-MEDIUM|Clerk#000000958|0|elets use quickly. deposits wake slyly even platelets. sometimes reg +33831|1300|O|65180.68|1998-06-14|5-LOW|Clerk#000000987|0|ickly. regular pinto beans cajole. q +33856|98|O|282245.02|1996-05-25|1-URGENT|Clerk#000000007|0|ounts. furiously even accounts integrate carefully furiously fi +33857|1481|F|168402.73|1993-04-30|1-URGENT|Clerk#000000301|0|ously even instructions wake blithely regular, final requests. slyl +33858|541|F|26437.86|1995-05-15|2-HIGH|Clerk#000000325|0|ts boost slyly after the evenly pending packages. regular, unusual dep +33859|842|O|56138.56|1996-01-17|5-LOW|Clerk#000000164|0|the quickly even accounts. quickly sp +33860|682|O|64190.67|1995-12-31|3-MEDIUM|Clerk#000000715|0| ideas wake carefully alongside of the quickly fin +33861|1190|O|209830.99|1996-03-18|5-LOW|Clerk#000000970|0|ymptotes are about the blithely ir +33862|199|F|36480.84|1993-06-23|4-NOT SPECIFIED|Clerk#000000600|0| unusual instructions nod blithely: ca +33863|1036|F|150295.00|1993-03-08|1-URGENT|Clerk#000000944|0| integrate. packages after t +33888|587|F|175572.88|1994-08-21|4-NOT SPECIFIED|Clerk#000000591|0|nding platelets. furiously express packages across the flu +33889|1484|F|192803.75|1993-11-07|5-LOW|Clerk#000000726|0|ts cajole furiously final theodolites. furiously regular dependencies could +33890|1283|O|39113.17|1996-08-28|5-LOW|Clerk#000000547|0|carefully ironic asymptotes wake blithely b +33891|91|F|240420.47|1993-04-09|4-NOT SPECIFIED|Clerk#000000128|0|xes. ironic, unusual foxes affix blithely across the slyl +33892|575|O|11032.70|1995-05-23|5-LOW|Clerk#000000630|0|l, stealthy packages sle +33893|905|F|226204.20|1992-09-21|4-NOT SPECIFIED|Clerk#000000212|0|nst the slyly regular ideas +33894|854|F|210146.60|1993-06-15|1-URGENT|Clerk#000000933|0|ess excuses haggle slyly. furiously final requests haggle +33895|1078|O|54893.96|1996-03-12|1-URGENT|Clerk#000000658|0|g slyly final, regular accounts. pending, express packages pr +33920|1040|F|70261.92|1994-06-30|3-MEDIUM|Clerk#000000920|0|nic packages wake carefully regular, idle warthogs. slowly express th +33921|409|F|140353.83|1993-03-31|5-LOW|Clerk#000000292|0|furiously ideas. final deposits play quickly. final, ironic requests +33922|211|F|150028.02|1993-02-28|4-NOT SPECIFIED|Clerk#000000454|0| haggle. frays haggle above the quickly final accounts. ideas integra +33923|145|F|67978.96|1994-01-08|5-LOW|Clerk#000000036|0|ideas? pending patterns sleep b +33924|974|F|189997.46|1992-10-19|4-NOT SPECIFIED|Clerk#000000896|0|nic deposits are ruthlessly against the even f +33925|1015|F|66036.77|1995-05-04|5-LOW|Clerk#000000958|0| the slyly unusual accounts. r +33926|1418|O|70451.94|1996-08-21|2-HIGH|Clerk#000000784|0|yly final sauternes. f +33927|52|O|246573.55|1997-03-26|3-MEDIUM|Clerk#000000223|0|arefully busy packages nag boldly. furiously bold dinos against the +33952|1219|O|80997.61|1996-03-03|4-NOT SPECIFIED|Clerk#000000410|0| use according to the carefully pending courts. expres +33953|746|F|190533.15|1992-06-21|2-HIGH|Clerk#000000430|0|tegrate furiously regular dependencie +33954|1424|O|59226.30|1998-02-05|5-LOW|Clerk#000000059|0|sts play furiously regular dependencies-- pe +33955|1144|O|256572.94|1996-04-09|3-MEDIUM|Clerk#000000197|0|ously. asymptotes against the quickly even packages nag against the regu +33956|253|F|183908.55|1992-01-20|5-LOW|Clerk#000000001|0|s. slyly regular pinto beans cajole slyly ac +33957|38|O|221222.46|1998-06-14|1-URGENT|Clerk#000000470|0| maintain furiously about the unusual ideas. final, final +33958|982|F|43099.94|1995-02-03|1-URGENT|Clerk#000000383|0|fily silent accounts. unusual +33959|706|F|100608.06|1994-08-01|1-URGENT|Clerk#000000505|0|haggle-- unusual deposits are blithely along the blithely pen +33984|880|O|60119.43|1997-06-05|5-LOW|Clerk#000000525|0|ven forges along the furiously silent requests are furiously along the e +33985|292|F|91176.76|1993-07-02|3-MEDIUM|Clerk#000000776|0|. furiously ironic +33986|815|F|118010.23|1994-02-12|1-URGENT|Clerk#000000390|0|s-- furiously pending orbits nag blithely according to the +33987|961|O|184338.94|1995-10-26|2-HIGH|Clerk#000000434|0|fter the ironic packages. furiou +33988|959|F|14838.92|1994-01-11|3-MEDIUM|Clerk#000000905|0|pendencies are blithely above the +33989|664|F|71036.27|1993-02-13|5-LOW|Clerk#000000235|0|ructions haggle ironically quiet dependencies. express, +33990|19|F|55711.44|1993-01-11|2-HIGH|Clerk#000000560|0|lessly final asymptotes use about the express, u +33991|1078|O|17384.33|1998-07-28|4-NOT SPECIFIED|Clerk#000000859|0|r excuses sleep according to the ironic dolphins. +34016|56|O|234997.21|1996-12-11|5-LOW|Clerk#000000670|0|ithely even packages use slowly fluffy foxes +34017|781|F|153427.05|1994-03-24|2-HIGH|Clerk#000000647|0|ss, thin deposits cajole ca +34018|1132|O|58238.72|1997-09-21|4-NOT SPECIFIED|Clerk#000000113|0|e carefully regular requests. caref +34019|1|O|89230.03|1998-03-29|5-LOW|Clerk#000000815|0|ic depths. boldly special multipliers caj +34020|1249|F|164158.44|1993-01-25|2-HIGH|Clerk#000000754|0|across the fluffily even accounts. blithely p +34021|1465|O|23726.75|1996-07-27|1-URGENT|Clerk#000000607|0|ic instructions nag quickly even excuses. requests hagg +34022|17|F|175601.34|1992-11-04|4-NOT SPECIFIED|Clerk#000000552|0|y even accounts use along the express pinto beans. quick instructions hag +34023|1246|F|196196.76|1993-08-14|5-LOW|Clerk#000000285|0|iously bold dependencies +34048|1114|P|321396.28|1995-03-29|5-LOW|Clerk#000000902|0|carefully final deposits. unusual requests slee +34049|268|F|54769.50|1995-01-27|4-NOT SPECIFIED|Clerk#000000253|0|posits wake carefully about the blithely ir +34050|793|F|24643.71|1993-04-15|2-HIGH|Clerk#000000319|0|eodolites. special deposits +34051|263|O|279755.22|1996-02-28|4-NOT SPECIFIED|Clerk#000000302|0|ording to the blithely even accounts thrash ruthlessly carefully idle +34052|764|O|123625.33|1996-06-28|1-URGENT|Clerk#000000455|0|y bold foxes. regular excuses cajole carefully. blithely final instructio +34053|245|O|185393.04|1997-09-24|2-HIGH|Clerk#000000015|0|ronic deposits. foxes nag furiously among the slyly special d +34054|1093|O|168173.47|1997-05-17|4-NOT SPECIFIED|Clerk#000000433|0|ide of the carefully ruthle +34055|1417|F|101316.57|1994-12-13|3-MEDIUM|Clerk#000000483|0|cording to the carefully bold pinto beans sleep caref +34080|619|O|358646.80|1996-07-17|4-NOT SPECIFIED|Clerk#000000366|0| packages. final deposits against the ironic, final requests wake slyly +34081|329|F|271664.94|1994-05-04|2-HIGH|Clerk#000000494|0|pecial packages. bold i +34082|421|O|178316.26|1995-10-29|4-NOT SPECIFIED|Clerk#000000480|0|y against the unusual, blithe depths. regular, pending requests boost +34083|886|F|207117.84|1992-02-06|4-NOT SPECIFIED|Clerk#000000165|0|lly unusual packages cajole blithely ideas. silently special accounts impres +34084|511|O|135341.78|1997-03-11|4-NOT SPECIFIED|Clerk#000000476|0|al, even packages after the furi +34085|440|F|11521.52|1993-06-11|4-NOT SPECIFIED|Clerk#000000462|0|lets nag alongside of the pending platelets. express instr +34086|226|F|45015.11|1992-04-30|2-HIGH|Clerk#000000496|0|the excuses. furiou +34087|658|F|20438.42|1994-07-25|5-LOW|Clerk#000000790|0|final epitaphs wake flu +34112|1456|O|158754.86|1995-09-02|1-URGENT|Clerk#000000582|0|mptotes boost carefully around the blithely express +34113|80|O|213576.80|1998-03-01|2-HIGH|Clerk#000000791|0| foxes use furiously across the blithely ironic requests. carefully ironic as +34114|103|F|97396.95|1994-05-11|2-HIGH|Clerk#000000727|0|he carefully express deposits. packages detect. silently ironi +34115|1219|F|304045.32|1994-05-21|1-URGENT|Clerk#000000533|0|es use blithely. bl +34116|352|F|132749.95|1993-04-24|2-HIGH|Clerk#000000736|0|ing theodolites sleep slyly about the regular +34117|1259|F|292749.24|1992-02-08|2-HIGH|Clerk#000000900|0|arefully even ideas. deposits use about the carefully +34118|343|O|21957.96|1997-07-24|3-MEDIUM|Clerk#000000423|0|eas above the blithely final requests sleep a +34119|937|O|145576.40|1997-10-19|1-URGENT|Clerk#000000238|0|oss the theodolites. blithely regular packages cajo +34144|481|F|79054.36|1994-06-02|1-URGENT|Clerk#000000700|0| requests. pending, i +34145|530|F|88775.43|1992-01-04|3-MEDIUM|Clerk#000000976|0|bold requests wake fluffily. carefully regul +34146|514|O|74472.02|1998-07-07|3-MEDIUM|Clerk#000000520|0|thely bravely regular asymptotes. +34147|743|O|43441.38|1996-11-05|2-HIGH|Clerk#000000165|0|ly pending accounts. idly final accounts use af +34148|1195|F|262034.24|1992-08-22|1-URGENT|Clerk#000000431|0|egular platelets wake furiously. fluffily regular accoun +34149|73|O|213437.26|1997-09-13|1-URGENT|Clerk#000000061|0|ounts. bold, silent packages are furiously deposits. iro +34150|841|F|91376.57|1993-02-13|3-MEDIUM|Clerk#000000400|0|blithely even instructions sleep quic +34151|427|O|271811.82|1995-09-10|4-NOT SPECIFIED|Clerk#000000387|0|ns. careful accounts wake idly through the furiously ironic deposits. blithel +34176|1342|F|59356.07|1994-03-16|2-HIGH|Clerk#000000671|0|regular deposits hang. final +34177|818|F|246232.01|1994-08-16|2-HIGH|Clerk#000000219|0|ng ideas detect blithely quickly regular deposits-- idly bold pearls mold sly +34178|295|O|125112.70|1995-11-09|2-HIGH|Clerk#000000205|0|the slyly regular packages. pending requests haggle carefully blithely final +34179|1343|O|118353.83|1995-11-03|4-NOT SPECIFIED|Clerk#000000770|0|arefully across the accounts. regular accounts eat fluffily afte +34180|1393|O|297105.66|1995-09-04|2-HIGH|Clerk#000000218|0|are after the even req +34181|1178|O|47810.91|1997-12-02|4-NOT SPECIFIED|Clerk#000000979|0|ove the furiously pending pinto beans. slyly ironic deposits use. carefully +34182|65|F|84292.04|1992-10-18|1-URGENT|Clerk#000000485|0| quickly. stealthy ideas wake across the accounts. bold account +34183|1444|F|22842.04|1994-05-13|1-URGENT|Clerk#000000800|0|unts. ruthlessly ironic +34208|1498|F|92901.38|1994-08-10|1-URGENT|Clerk#000000838|0|e after the regular packages. deposits wake furiously across the packag +34209|1285|F|282919.82|1993-08-25|2-HIGH|Clerk#000000389|0| slyly after the ironic theodolites. slyly re +34210|1126|O|303921.57|1997-06-03|2-HIGH|Clerk#000000054|0|ironic deposits nag. quickly +34211|965|F|118346.63|1992-02-14|4-NOT SPECIFIED|Clerk#000000239|0|encies. slyly final requests cajole. carefully ironic requests poach after th +34212|1070|O|107225.88|1996-04-07|3-MEDIUM|Clerk#000000331|0|ag. regular dependencies above the final dependencies wake a +34213|211|O|140011.67|1997-05-17|1-URGENT|Clerk#000000397|0|sly bold, express pa +34214|784|O|143731.02|1998-04-28|1-URGENT|Clerk#000000488|0|ic foxes haggle carefully about the regular, ironic reque +34215|358|P|179903.59|1995-05-15|2-HIGH|Clerk#000000071|0|ly pending deposits. bold packages are about the quickly pending p +34240|1385|O|166798.83|1997-09-17|5-LOW|Clerk#000000809|0|eposits haggle slyly. regular platelets against the +34241|995|F|101415.21|1992-10-09|5-LOW|Clerk#000000467|0|express requests nag after the quickly regular packages. quickly thi +34242|703|O|162140.65|1998-06-22|1-URGENT|Clerk#000000948|0|tainments. final, b +34243|493|F|264337.49|1995-02-12|2-HIGH|Clerk#000000062|0|es. fluffily regular excuses against the packages sleep slyly furiously pe +34244|1021|F|129371.77|1993-09-30|5-LOW|Clerk#000000323|0|d packages sleep carefully alongside of the packages +34245|1162|F|113731.74|1993-02-08|3-MEDIUM|Clerk#000000835|0|y unusual instructions kind +34246|619|F|205687.53|1993-10-08|1-URGENT|Clerk#000000949|0|ch furiously final pains. blithely pe +34247|674|F|14373.92|1994-03-25|2-HIGH|Clerk#000000865|0|special packages about the fluffily regular foxes boost carefully +34272|1376|O|61406.87|1997-03-16|4-NOT SPECIFIED|Clerk#000000122|0|thely even requests. final packages above the +34273|224|O|149752.82|1996-08-09|2-HIGH|Clerk#000000692|0|nding braids integrate carefully. +34274|1087|F|135603.19|1993-02-10|3-MEDIUM|Clerk#000000968|0|refully furiously final instructions. ironic escapades hang furiously acc +34275|955|F|85306.69|1994-07-02|5-LOW|Clerk#000000128|0|long the stealthily pending foxes. furiously ironic requests i +34276|568|F|62608.66|1992-03-07|1-URGENT|Clerk#000000085|0|usly even foxes. reg +34277|1292|O|101978.88|1997-08-21|4-NOT SPECIFIED|Clerk#000000616|0|lay blithely along the furiously bold deposits. quickly bold requests +34278|712|O|140262.78|1997-02-19|3-MEDIUM|Clerk#000000968|0|pecial deposits. furiously regular ideas cajole along th +34279|694|F|230118.66|1992-03-29|4-NOT SPECIFIED|Clerk#000000395|0|posits sleep. final foxes cajole carefully regular, pending Tiresias. +34304|1216|F|14629.98|1994-03-09|3-MEDIUM|Clerk#000000196|0| quickly final idea +34305|830|F|144671.58|1993-02-20|1-URGENT|Clerk#000000378|0|ious excuses. ideas boost quickly. slyly pending +34306|494|O|254539.41|1997-01-26|4-NOT SPECIFIED|Clerk#000000761|0|ages haggle furiously regular excuses. even foxes about the furiou +34307|1282|F|71293.98|1993-03-19|3-MEDIUM|Clerk#000000367|0|olites. slyly ironic dependencies breach sl +34308|124|F|93174.20|1993-12-24|1-URGENT|Clerk#000000580|0|beans nag slyly in place of the carefully regular instructions. enticing +34309|245|F|34424.71|1992-09-07|2-HIGH|Clerk#000000052|0|nts unwind quickly. blithely bold ideas haggle along the daring asymptotes? s +34310|1334|O|56780.43|1996-03-29|4-NOT SPECIFIED|Clerk#000000056|0|usual theodolites wake blith +34311|10|F|209263.18|1994-09-06|2-HIGH|Clerk#000000108|0|into beans. even deposits wake slyly regular foxes. express asymptotes +34336|967|O|196683.41|1997-07-13|5-LOW|Clerk#000000308|0|he carefully stealthy deposits. slyly silent instructions play +34337|1366|F|61093.62|1993-05-15|3-MEDIUM|Clerk#000000867|0|hs. carefully final realms affix even, r +34338|691|F|1003.57|1993-07-01|5-LOW|Clerk#000000242|0|old deposits affix ironic +34339|202|F|259864.02|1992-05-14|3-MEDIUM|Clerk#000000929|0|ss requests. blithely brave platelets under the furiously unusual +34340|746|O|47026.51|1997-04-17|2-HIGH|Clerk#000000771|0|tes. furiously stealthy deposits use final packages. blithely special in +34341|787|O|342584.86|1996-11-20|3-MEDIUM|Clerk#000000134|0|special packages unwind. slyly special accounts eat slyly across the caref +34342|1081|O|60331.64|1998-02-09|2-HIGH|Clerk#000000104|0|nic packages among the carefully express asymptotes nag +34343|1354|O|318144.50|1998-04-10|2-HIGH|Clerk#000000012|0|s. ideas among the final, pe +34368|1228|F|85541.60|1995-01-08|5-LOW|Clerk#000000777|0|arefully regular packages believe fu +34369|649|O|91749.28|1997-10-18|2-HIGH|Clerk#000000080|0|c foxes hinder carefully-- bold pinto beans are. regular +34370|1121|O|239308.09|1997-11-14|1-URGENT|Clerk#000000575|0|ions believe slyly alongside of the blithely special requests. blithely sp +34371|1346|F|82898.83|1993-04-02|3-MEDIUM|Clerk#000000492|0|to kindle quickly against the regular, final asymptotes. slyly regular accoun +34372|1394|F|51853.05|1992-10-17|2-HIGH|Clerk#000000637|0|l packages wake quickly ironic ideas. quickly idle requests a +34373|571|F|198747.26|1992-12-09|4-NOT SPECIFIED|Clerk#000000100|0|blithely special platelets. ideas detect furiously. fin +34374|889|F|25825.28|1994-07-01|5-LOW|Clerk#000000457|0|al warthogs haggle furiously. blithel +34375|851|F|205530.48|1994-01-05|3-MEDIUM|Clerk#000000451|0|deposits along the carefully express requests wake carefully closely +34400|397|F|133509.95|1992-12-25|5-LOW|Clerk#000000953|0|ers haggle slyly pending accounts: blithely ruthless packages na +34401|1288|O|161112.03|1996-02-23|2-HIGH|Clerk#000000671|0|instructions must have to believe according to the +34402|1084|F|209480.13|1993-05-03|2-HIGH|Clerk#000000495|0|ost quickly above the requests. b +34403|604|O|51499.87|1996-08-02|1-URGENT|Clerk#000000993|0|carefully regular gifts. fluffily silent packages cajole slyly +34404|554|F|32743.42|1993-02-24|2-HIGH|Clerk#000000414|0|yly ironic pinto beans about the quietly unusual accounts ca +34405|823|F|90939.58|1992-03-02|3-MEDIUM|Clerk#000000156|0| requests nag busily ac +34406|667|F|223168.35|1992-09-29|3-MEDIUM|Clerk#000000959|0|ans integrate furiously against the carefully bold sentiments. furiously +34407|869|F|115395.14|1993-08-01|5-LOW|Clerk#000000023|0|slyly even deposits nag. ironic packag +34432|425|F|193909.41|1994-04-08|4-NOT SPECIFIED|Clerk#000000144|0|sits. pending deposits cajole qui +34433|502|F|95204.95|1995-01-20|4-NOT SPECIFIED|Clerk#000000430|0|f the fluffy deposits. furiously ironic requests x-ra +34434|301|P|212560.53|1995-05-10|4-NOT SPECIFIED|Clerk#000000313|0|sts at the deposits lose slyly ironic packages. ex +34435|782|F|45657.33|1994-08-06|5-LOW|Clerk#000000476|0|s. courts about the quickly ironic accounts poach alongside of the quietl +34436|956|O|101674.00|1998-02-06|3-MEDIUM|Clerk#000000683|0|counts sleep carefully unusual, special requests: bli +34437|769|F|65357.96|1995-02-18|5-LOW|Clerk#000000305|0|express accounts. blithe accounts are furiously regular ideas: never iron +34438|1102|F|75046.93|1993-12-12|2-HIGH|Clerk#000000598|0|to beans integrate. carefully final notornis +34439|1045|F|151030.78|1994-10-11|4-NOT SPECIFIED|Clerk#000000419|0|quickly regular Tiresias. wa +34464|917|O|91388.09|1997-06-09|3-MEDIUM|Clerk#000000177|0|eodolites. slyly final depths integrate by the furiously pendi +34465|844|O|64550.50|1997-01-13|2-HIGH|Clerk#000000425|0| fluffily-- regular ideas believe slyly. +34466|550|O|141182.34|1998-01-21|4-NOT SPECIFIED|Clerk#000000284|0|ironic requests. special, e +34467|67|F|179328.49|1994-10-25|1-URGENT|Clerk#000000782|0| final dependencies. stealthily ironic instructions belie +34468|188|O|36200.71|1996-10-12|3-MEDIUM|Clerk#000000157|0| carefully quickly bold a +34469|937|O|220913.88|1997-10-22|3-MEDIUM|Clerk#000000081|0|inst the express instructions +34470|247|F|142211.89|1992-02-02|1-URGENT|Clerk#000000361|0|after the express theodoli +34471|154|O|96439.00|1996-09-08|4-NOT SPECIFIED|Clerk#000000431|0|oxes. fluffily even dependencies wake quickly. blithel +34496|326|F|24067.70|1993-05-14|1-URGENT|Clerk#000000493|0|ts. quickly slow requests play carefully against the fluffily final req +34497|646|F|73214.26|1994-03-11|3-MEDIUM|Clerk#000000462|0| special packages with the packages boost furiously +34498|1276|F|204260.64|1994-02-16|5-LOW|Clerk#000000435|0|usly alongside of the regular, even pi +34499|1219|F|227855.73|1993-07-19|3-MEDIUM|Clerk#000000060|0|use against the quickly even dependencies. slyly special de +34500|1333|O|168884.40|1998-04-03|5-LOW|Clerk#000000863|0|ins boost blithely ironic accounts. furious +34501|431|F|89909.13|1993-12-16|1-URGENT|Clerk#000000158|0|about the slyly pending accounts. accounts nag furiously about th +34502|635|O|135176.66|1997-10-11|1-URGENT|Clerk#000000066|0|uriously blithely ironic theodolites. +34503|1412|O|110131.68|1996-12-23|3-MEDIUM|Clerk#000000437|0|t furiously notornis +34528|1349|O|103901.51|1997-11-02|1-URGENT|Clerk#000000644|0|yly unusual pinto beans. express dependencies nag along the special +34529|50|O|108199.49|1998-01-20|4-NOT SPECIFIED|Clerk#000000945|0| even requests. brave +34530|1321|F|217200.93|1993-08-31|5-LOW|Clerk#000000152|0|usual foxes use furiously bold accoun +34531|1295|O|80615.73|1998-01-25|5-LOW|Clerk#000000475|0| the unusual, pending deposits +34532|1468|F|155239.31|1992-12-12|5-LOW|Clerk#000000502|0|eposits. requests according to the pl +34533|691|O|176081.72|1996-04-17|2-HIGH|Clerk#000000719|0|s cajole blithely. silently regular packages believe after +34534|698|O|76694.54|1997-12-23|2-HIGH|Clerk#000000210|0|s are quickly slyly silent pack +34535|817|F|175000.69|1993-08-07|1-URGENT|Clerk#000000244|0|usly regular platelets are slyly blithely final foxes. express account +34560|208|F|139137.42|1992-11-04|4-NOT SPECIFIED|Clerk#000000762|0|above the brave, final instructions. boldly bold depo +34561|1049|F|68742.38|1994-06-29|1-URGENT|Clerk#000000632|0|ns. packages affix carefully. deposits use q +34562|149|F|211890.42|1993-08-25|5-LOW|Clerk#000000484|0|ts are. ironic deposits against the even accounts cajole deposits +34563|665|F|194801.20|1992-03-05|4-NOT SPECIFIED|Clerk#000000627|0|l platelets are furiously fur +34564|986|O|210238.83|1997-11-11|4-NOT SPECIFIED|Clerk#000000405|0| carefully final instructions haggle blithely regular instructi +34565|1339|F|242561.37|1994-07-14|3-MEDIUM|Clerk#000000117|0|refully ironic requests. regular dependenci +34566|379|O|126754.43|1995-11-11|1-URGENT|Clerk#000000620|0|refully final epitaphs nag furiously i +34567|700|F|188201.94|1994-04-27|5-LOW|Clerk#000000571|0|lyly careful, enticing theodolites. express requests sleep blithely account +34592|253|F|50781.48|1995-02-28|5-LOW|Clerk#000000914|0|foxes cajole blithely b +34593|1129|O|217280.34|1996-11-05|2-HIGH|Clerk#000000531|0|e bold, bold deposits should have to haggle about the slyly iron +34594|1265|F|8620.57|1992-11-24|1-URGENT|Clerk#000000536|0|ously even theodolites. silently reg +34595|1490|F|240027.66|1992-07-20|3-MEDIUM|Clerk#000000658|0|ound the bold foxes cajole +34596|91|O|166241.77|1995-09-01|1-URGENT|Clerk#000000824|0| slyly pending requests after t +34597|1303|F|78384.94|1993-12-17|3-MEDIUM|Clerk#000000349|0| quickly ironic packages. final, regular pains snooze furiously alongside of t +34598|472|O|50898.50|1997-06-05|3-MEDIUM|Clerk#000000760|0|s. blithely bold dependencies are. regular, special requests +34599|1099|F|200493.20|1993-03-04|5-LOW|Clerk#000000298|0|after the even requests. always final instructions haggle slyly. slyly +34624|634|F|74304.98|1992-09-22|4-NOT SPECIFIED|Clerk#000000198|0| instructions detect regular, even packages-- accounts use bl +34625|1105|O|140211.76|1997-05-20|3-MEDIUM|Clerk#000000034|0|e. ideas are bravely +34626|400|F|232339.61|1992-10-16|3-MEDIUM|Clerk#000000179|0|s cajole blithely even theodo +34627|772|F|125080.63|1992-10-04|3-MEDIUM|Clerk#000000796|0|ounts. final deposits are bold requests. final, +34628|766|F|78871.64|1993-04-18|4-NOT SPECIFIED|Clerk#000000763|0| furiously express requests af +34629|853|O|28095.15|1997-08-14|2-HIGH|Clerk#000000737|0|pending ideas. quickly even packages wake quickl +34630|1379|O|189761.17|1995-11-30|1-URGENT|Clerk#000000233|0|ffix. carefully express requests are furiously carefull +34631|1315|F|149398.42|1994-10-24|4-NOT SPECIFIED|Clerk#000000794|0|. special accounts wake bold asymptotes. slyly regu +34656|749|O|27944.06|1995-06-24|1-URGENT|Clerk#000000303|0|ickly special platelets throughout the slyly final requests dazzle fluffily +34657|430|F|43406.92|1993-05-06|5-LOW|Clerk#000000051|0|s. special dependencies integrate at the quickly silent plat +34658|1201|F|183974.07|1993-11-19|3-MEDIUM|Clerk#000000896|0| ironic deposits wake b +34659|44|F|218304.46|1992-11-20|2-HIGH|Clerk#000000569|0| finally regular accounts boost fluffily slyly regular ideas. b +34660|877|O|256751.87|1995-09-04|4-NOT SPECIFIED|Clerk#000000169|0|. ironic epitaphs wake slyly. even requests sleep pen +34661|130|F|29095.72|1993-01-21|1-URGENT|Clerk#000000060|0|uctions. careful forges are above the excuses? quickly unusu +34662|760|F|251035.71|1992-01-11|1-URGENT|Clerk#000000878|0|xcuses wake. express, pending theodolites lose furiously blithely final req +34663|34|O|175607.96|1995-07-07|4-NOT SPECIFIED|Clerk#000000491|0| packages wake quickly final accounts. slyly regular packages sleep care +34688|1453|F|152512.71|1992-07-13|5-LOW|Clerk#000000789|0|ly blithe accounts. carefully bold packages along the quickly bli +34689|946|F|71250.63|1994-11-24|5-LOW|Clerk#000000681|0|s cajole according to the carefully special dolphi +34690|169|F|21740.61|1993-07-03|4-NOT SPECIFIED|Clerk#000000279|0|fily final pinto beans nag. fluf +34691|239|F|202660.57|1994-01-15|1-URGENT|Clerk#000000256|0|d packages about the express pack +34692|334|F|165859.23|1993-05-10|2-HIGH|Clerk#000000280|0|ges sleep slyly according to the regular, ev +34693|824|O|182517.93|1997-02-12|4-NOT SPECIFIED|Clerk#000000223|0|its after the final platelet +34694|304|P|154997.17|1995-04-29|5-LOW|Clerk#000000442|0|pending packages will have to cajole quickly. silently express tit +34695|202|O|112777.39|1997-05-03|4-NOT SPECIFIED|Clerk#000000339|0|ully above the blithely ironic excuses. furiously even sauternes across the b +34720|704|O|28429.95|1997-02-08|4-NOT SPECIFIED|Clerk#000000487|0|e. quickly even pinto b +34721|508|F|140649.71|1993-11-02|4-NOT SPECIFIED|Clerk#000000715|0|refully after the special deposit +34722|1090|O|309980.43|1997-03-04|3-MEDIUM|Clerk#000000994|0| integrate silently. carefully busy asymptot +34723|517|F|192420.95|1992-12-10|3-MEDIUM|Clerk#000000866|0|hely final instructions sleep. final, even deposits sleep slyly quic +34724|1486|F|55774.10|1994-12-28|5-LOW|Clerk#000000913|0| deposits according to the ironic asymptotes +34725|1471|O|322493.26|1995-07-28|5-LOW|Clerk#000000611|0|usual requests. instructions wake carefully against the even +34726|887|O|32427.70|1996-10-31|2-HIGH|Clerk#000000415|0|deas. regular sentiments detect slyly across the ironic asymptote +34727|277|F|102724.99|1995-03-14|5-LOW|Clerk#000000732|0|earls sleep quickly. furiously special packages affi +34752|1469|O|25335.83|1995-07-10|2-HIGH|Clerk#000000171|0|ches haggle carefully spe +34753|482|F|193644.59|1993-01-19|4-NOT SPECIFIED|Clerk#000000220|0|kages. slyly regular ideas integrate carefully. +34754|835|F|4961.71|1992-06-05|1-URGENT|Clerk#000000947|0|carefully. ideas around the blithely bold +34755|4|O|156681.56|1997-02-24|1-URGENT|Clerk#000000190|0|l requests wake. final, ironic courts promise quic +34756|229|O|232430.29|1998-03-24|3-MEDIUM|Clerk#000000624|0|en accounts! fluffily ev +34757|401|F|32531.58|1992-05-29|2-HIGH|Clerk#000000169|0| decoys cajole carefu +34758|493|P|279161.07|1995-05-03|1-URGENT|Clerk#000000873|0|cording to the blithely even pinto b +34759|1255|O|178493.03|1997-11-19|1-URGENT|Clerk#000000479|0|refully silent requests. slyly sly theodolites haggle slyly p +34784|1178|F|227786.35|1994-02-04|4-NOT SPECIFIED|Clerk#000000537|0|fily regular packages impress blithely furiously regular reque +34785|149|F|3971.08|1993-01-26|1-URGENT|Clerk#000000207|0| slyly bold accounts haggle furiously. ideas integrate blithely. fluffil +34786|952|O|10599.71|1996-07-11|2-HIGH|Clerk#000000059|0|ounts wake alongside of the special packages. special foxes sleep fluffily +34787|622|F|162118.88|1993-03-01|5-LOW|Clerk#000000412|0| cajole slyly even deposits. quickly ironic courts haggle fur +34788|686|F|152607.72|1994-11-10|2-HIGH|Clerk#000000970|0|to beans about the regular, regular re +34789|49|O|239938.68|1996-10-24|5-LOW|Clerk#000000640|0|lly ironic ideas haggl +34790|415|O|230496.07|1997-12-13|1-URGENT|Clerk#000000802|0|fully ironic somas are furiously against the sly +34791|100|P|200763.59|1995-05-08|3-MEDIUM|Clerk#000000103|0| the blithely regular foxes. accounts wake. blith +34816|809|F|118505.86|1993-11-06|4-NOT SPECIFIED|Clerk#000000594|0| foxes. fluffily express dolphins sleep. ironic packages h +34817|1037|F|15184.28|1994-04-13|2-HIGH|Clerk#000000257|0|ly express pearls across the final foxes sleep pendi +34818|295|O|231910.16|1996-02-22|5-LOW|Clerk#000000612|0|ter the quickly final asymptotes. bold ideas nag s +34819|1388|O|51067.12|1997-11-30|5-LOW|Clerk#000000438|0| furiously. carefully s +34820|350|F|28379.62|1993-06-02|5-LOW|Clerk#000000609|0|slyly regular packages cajole thinly according to the even, ironic deposi +34821|1246|F|304387.57|1993-08-20|1-URGENT|Clerk#000000172|0|serve along the packages. busily pending foxes print. pending packages use fu +34822|1183|F|244722.19|1992-07-11|4-NOT SPECIFIED|Clerk#000000609|0|s integrate furiously regular requests. careful +34823|118|F|96444.82|1993-10-10|3-MEDIUM|Clerk#000000760|0|equests. unusual requests wake. carefully regular notornis +34848|1342|O|252742.41|1997-02-10|3-MEDIUM|Clerk#000000179|0|de of the carefully +34849|391|F|318214.12|1993-10-13|1-URGENT|Clerk#000000413|0|ly. slyly even theo +34850|388|F|79842.44|1993-08-18|4-NOT SPECIFIED|Clerk#000000436|0| slyly ironic forges. carefully special accounts sleep. slyly unusu +34851|580|F|66662.02|1992-11-06|4-NOT SPECIFIED|Clerk#000000219|0| deposits detect slyly final depos +34852|1307|F|114726.01|1992-09-06|5-LOW|Clerk#000000435|0|ar asymptotes. carefully unusual +34853|445|O|208341.45|1995-09-30|1-URGENT|Clerk#000000466|0|ending deposits. fluffy, +34854|1093|F|74139.72|1994-11-17|3-MEDIUM|Clerk#000000088|0| express dependencies. silently regular +34855|788|F|113540.95|1994-03-30|5-LOW|Clerk#000000636|0|yly along the carefully ironic pinto beans. +34880|133|F|100899.32|1994-09-17|2-HIGH|Clerk#000000928|0|thely final ideas integrate fluffily. slyly regular account +34881|1274|F|262557.61|1995-02-08|3-MEDIUM|Clerk#000000659|0|the final ideas. idl +34882|1483|F|199644.30|1994-07-25|1-URGENT|Clerk#000000765|0|lly bold instructions. slyly special accounts around the packages cajole b +34883|286|F|180387.43|1994-11-05|1-URGENT|Clerk#000000456|0|nts. furiously unusual requests +34884|529|O|121067.37|1996-12-08|3-MEDIUM|Clerk#000000232|0|ometimes special deposits +34885|253|O|46771.09|1997-06-13|1-URGENT|Clerk#000000502|0|special asymptotes nag careful +34886|925|O|47543.06|1998-05-07|3-MEDIUM|Clerk#000000356|0|ly silent accounts above t +34887|1411|O|3029.24|1998-01-16|3-MEDIUM|Clerk#000000537|0|lyly regular pinto beans. ironic deposits boost fluffily unusua +34912|1472|F|28148.00|1992-02-03|5-LOW|Clerk#000000976|0|ole slyly. furiously regula +34913|1316|O|70499.36|1995-11-23|3-MEDIUM|Clerk#000000586|0|tes about the unusual, express tithes haggle special p +34914|88|O|202196.28|1997-09-08|2-HIGH|Clerk#000000628|0|lithely regular deposits. silent, ironic ide +34915|877|F|63147.67|1994-08-29|2-HIGH|Clerk#000000801|0|s. final accounts haggle furio +34916|254|F|40733.96|1993-08-10|2-HIGH|Clerk#000000960|0|e the quickly regular accounts are around the even accoun +34917|304|O|54311.07|1995-10-17|2-HIGH|Clerk#000000895|0| carefully before the ironic, regular deposits. pendin +34918|827|F|263806.74|1994-10-24|3-MEDIUM|Clerk#000000420|0|efully furiously regular accounts. slyly ironic packages was slowly. ca +34919|1150|O|141340.14|1996-08-08|2-HIGH|Clerk#000000027|0|onic requests sleep furiously again +34944|338|O|60551.25|1998-03-08|1-URGENT|Clerk#000000781|0|n pinto beans doubt slyly across the fluffily pending p +34945|745|O|225004.23|1998-03-31|5-LOW|Clerk#000000203|0|ns promise blithely outside the bold dependencies. ironic, ev +34946|487|O|47814.67|1998-04-19|5-LOW|Clerk#000000959|0|the unusual, bold pinto beans +34947|883|O|269380.92|1996-07-11|4-NOT SPECIFIED|Clerk#000000181|0|lly final multipliers. carefully ironic requests hinder after the p +34948|916|F|106537.13|1993-01-13|1-URGENT|Clerk#000000352|0|pendencies. regular dolphins ha +34949|1187|F|96060.91|1993-12-10|1-URGENT|Clerk#000000001|0|ans. unusual foxes after the quickly daring theodolites print instructio +34950|131|O|192857.74|1996-09-07|5-LOW|Clerk#000000603|0|instructions detect alongside o +34951|35|O|169400.03|1996-05-23|4-NOT SPECIFIED|Clerk#000000982|0|r, silent packages. bold, regular instructions +34976|832|F|260326.94|1992-11-25|3-MEDIUM|Clerk#000000561|0| blithely final dolphins use fluffily. blithely regular instruc +34977|1199|F|135780.29|1993-10-17|5-LOW|Clerk#000000419|0|ng accounts. furiously bold requests above the slyly bold theodolite +34978|235|F|329225.83|1995-02-05|2-HIGH|Clerk#000000336|0|ngside of the ironic, ironic platelets. s +34979|1192|F|144259.27|1993-09-29|1-URGENT|Clerk#000000349|0|osits. slyly bold theodolites caj +34980|1015|F|144564.60|1993-08-03|4-NOT SPECIFIED|Clerk#000000912|0|taphs after the blithely final requests sleep quickly regula +34981|1114|O|219909.58|1996-04-07|5-LOW|Clerk#000000499|0|y even packages cajole. q +34982|1376|F|63437.34|1992-08-19|4-NOT SPECIFIED|Clerk#000000542|0|ily regular platelets sleep slyly across the b +34983|1117|O|52461.60|1997-04-20|3-MEDIUM|Clerk#000000102|0|hely final deposits. final, unusual dependencies was. packag +35008|1489|F|264418.13|1992-05-08|1-URGENT|Clerk#000000453|0|ieve ruthlessly express deposits: final, quiet deposits cajole about t +35009|1438|O|232307.05|1998-03-26|2-HIGH|Clerk#000000545|0|even foxes. quickly furious accounts after the furiously even account +35010|370|O|11023.58|1997-12-12|2-HIGH|Clerk#000000275|0|efully excuses. ironic ideas +35011|805|F|43776.68|1992-12-11|4-NOT SPECIFIED|Clerk#000000932|0|ons nag across the express, regular packages. quickly even acc +35012|686|F|192803.03|1992-06-09|3-MEDIUM|Clerk#000000811|0|lent dependencies. slyly ironic packages breach furiously furiously even dep +35013|1343|O|309427.15|1997-11-12|3-MEDIUM|Clerk#000000661|0|s. furiously blithe pack +35014|835|F|36596.98|1994-10-04|3-MEDIUM|Clerk#000000147|0|al foxes alongside of the carefully +35015|442|O|60687.83|1997-11-25|2-HIGH|Clerk#000000078|0|t the carefully final foxes. pending, silent asymptotes unwind bravely ag +35040|488|F|163115.46|1992-04-19|4-NOT SPECIFIED|Clerk#000000581|0|ully among the regular pinto beans. pending, ironic pinto beans use bli +35041|1150|F|149487.03|1994-04-16|4-NOT SPECIFIED|Clerk#000000890|0|cuses along the quickly pending theodolites boost bl +35042|538|F|37500.06|1993-12-03|4-NOT SPECIFIED|Clerk#000000287|0|p along the regular grouches. i +35043|970|F|127017.53|1993-07-20|4-NOT SPECIFIED|Clerk#000000778|0|ously final foxes! express requests was +35044|1447|O|59451.81|1997-05-02|1-URGENT|Clerk#000000256|0|eful foxes thrash slyly about the accounts. deposits believe furiousl +35045|698|F|146093.34|1992-04-03|3-MEDIUM|Clerk#000000974|0|hely pending packages: unusual accounts ar +35046|214|F|282155.94|1993-07-25|3-MEDIUM|Clerk#000000954|0|the regular excuses. sl +35047|1480|F|264316.67|1993-06-10|3-MEDIUM|Clerk#000000624|0| busily. packages boost. ironic depths cajole carefully +35072|953|O|140665.45|1995-12-24|4-NOT SPECIFIED|Clerk#000000022|0|onic deposits. pending dependencies affix quickly. special ideas sleep careful +35073|646|O|170788.45|1997-08-20|3-MEDIUM|Clerk#000000008|0|regular requests. idea +35074|628|O|15521.07|1996-09-12|4-NOT SPECIFIED|Clerk#000000028|0|lar accounts sleep caref +35075|920|F|167878.05|1993-01-17|3-MEDIUM|Clerk#000000439|0|nding, regular packages. +35076|616|O|189968.05|1998-03-14|4-NOT SPECIFIED|Clerk#000000311|0| slyly around the special, regular accounts. carefully f +35077|202|O|150749.24|1995-10-08|2-HIGH|Clerk#000000242|0|even accounts nag against the unusua +35078|304|O|205662.74|1996-08-10|5-LOW|Clerk#000000261|0|ickly silent pinto beans. carefully even a +35079|830|F|212218.89|1993-08-15|2-HIGH|Clerk#000000514|0|blithely regular ideas use carefully blithely regular asymptotes. express p +35104|493|F|257922.45|1992-04-23|2-HIGH|Clerk#000000869|0|uriously busy foxes eat along the unusual packages. ca +35105|1117|F|28211.58|1993-11-28|1-URGENT|Clerk#000000585|0|sly express instructions +35106|1213|O|78618.16|1995-07-10|4-NOT SPECIFIED|Clerk#000000523|0|onic deposits. final requests against +35107|664|F|155636.90|1994-09-16|4-NOT SPECIFIED|Clerk#000000973|0|ly according to the pending forges. blithely careful fox +35108|268|F|144383.13|1994-05-26|3-MEDIUM|Clerk#000000728|0|courts. carefully final warhorses nag. furiously quick warthogs boo +35109|952|O|122275.83|1998-02-08|1-URGENT|Clerk#000000398|0|ounts nag carefully according to the ideas. carefully even accounts wake furio +35110|640|O|115465.06|1995-10-19|2-HIGH|Clerk#000000409|0|te slyly deposits. enticingly even packages s +35111|734|F|65188.76|1993-06-06|1-URGENT|Clerk#000000873|0|rs boost slyly blithely pending pinto beans. fluffily even requests b +35136|1121|F|156740.44|1994-10-09|1-URGENT|Clerk#000000523|0|ss dependencies. even ideas nag carefully express, fluffy packages +35137|188|F|130442.63|1993-07-18|2-HIGH|Clerk#000000169|0|unts cajole slyly stealthy accounts. special packages sleep. b +35138|973|O|38776.45|1997-05-15|1-URGENT|Clerk#000000588|0|otes about the slowly final requests serve fluffily silent accounts. +35139|1045|F|279093.60|1993-01-19|2-HIGH|Clerk#000000315|0|nts are slyly caref +35140|1333|O|202934.34|1997-11-07|3-MEDIUM|Clerk#000000874|0|arefully express deposits. blithely ironic packages sleep. f +35141|1000|F|196069.07|1993-09-12|3-MEDIUM|Clerk#000000641|0|arefully bold, pending +35142|1234|F|124295.46|1993-04-23|5-LOW|Clerk#000000157|0|ely. even packages impress carefully even sauternes: theodolite +35143|1499|O|29798.01|1995-10-06|5-LOW|Clerk#000000871|0|ironic accounts wake furiousl +35168|455|O|95298.23|1998-07-15|5-LOW|Clerk#000000247|0|s promise fluffily regular, even waters. quickly pending requests dou +35169|674|O|121717.50|1996-06-01|2-HIGH|Clerk#000000827|0|ccounts around the fluffily pending pa +35170|646|F|82267.56|1994-06-11|2-HIGH|Clerk#000000053|0|ld instructions. bravely regular deposits are fluffily waters. furiously +35171|157|O|208090.14|1996-12-31|5-LOW|Clerk#000000883|0|e carefully furiously ironic ideas. +35172|1210|F|3072.67|1994-08-18|5-LOW|Clerk#000000284|0|ke pending, regular packages. regular, s +35173|334|F|244047.82|1992-03-14|4-NOT SPECIFIED|Clerk#000000340|0|leep above the final theodolites. fluffily ironic platelets subl +35174|988|O|16958.14|1998-01-25|4-NOT SPECIFIED|Clerk#000000389|0|y special, ironic dinos. +35175|1415|O|80766.26|1997-11-15|2-HIGH|Clerk#000000852|0|r accounts around the slyly even theodolites sleep silently af +35200|236|F|264621.95|1994-02-06|3-MEDIUM|Clerk#000000716|0|uests. idle excuses boost furiously among the carefully regul +35201|61|F|321401.94|1993-06-05|5-LOW|Clerk#000000579|0| quietly ironic deposits across the thinly express packages +35202|803|O|188479.45|1997-07-05|2-HIGH|Clerk#000000817|0|final, final requests wake q +35203|1277|O|56155.15|1997-05-22|2-HIGH|Clerk#000000409|0| instructions cajole slyly among the slyly regular packages-- regular platele +35204|524|O|27963.46|1997-09-08|4-NOT SPECIFIED|Clerk#000000803|0|elets nag slyly carefully regular accounts. de +35205|896|O|194365.23|1997-07-07|4-NOT SPECIFIED|Clerk#000000450|0|ar deposits above the slyly e +35206|818|O|264349.08|1996-07-24|5-LOW|Clerk#000000182|0|fully according to the pending pinto beans. slyly unusual packages sleep +35207|1012|O|169768.34|1996-05-05|3-MEDIUM|Clerk#000000451|0|leep quickly regular somas. unusual, express asympto +35232|622|O|216447.92|1996-07-07|4-NOT SPECIFIED|Clerk#000000990|0| deposits. blithely ironic dependencies kindle slyly +35233|97|F|126830.41|1993-10-13|5-LOW|Clerk#000000045|0| requests haggle blithe +35234|209|O|18764.42|1997-05-26|2-HIGH|Clerk#000000793|0|press orbits above the fluffily pending packages impress slyly b +35235|89|O|245432.07|1997-10-04|1-URGENT|Clerk#000000447|0|s are furiously silent frets. blithely final real +35236|1285|O|29923.62|1997-06-08|2-HIGH|Clerk#000000705|0| the accounts. sometimes even reques +35237|520|F|161352.63|1993-01-03|2-HIGH|Clerk#000000675|0|eans boost carefully blithely even packages. express foxes doze carefully acco +35238|926|P|162304.26|1995-04-29|5-LOW|Clerk#000000922|0|ding warthogs. packages us +35239|302|O|137293.24|1995-11-13|1-URGENT|Clerk#000000510|0|ly final pinto beans cajole blithely even +35264|910|F|18356.56|1995-03-14|4-NOT SPECIFIED|Clerk#000000451|0| after the regular deposits mold ac +35265|1442|F|249498.43|1993-11-30|4-NOT SPECIFIED|Clerk#000000515|0|y bold foxes. accounts use furiously after the furiously +35266|1048|F|257483.93|1995-01-11|4-NOT SPECIFIED|Clerk#000000963|0| even packages nag furiously ironic packages. fu +35267|1324|O|141413.37|1997-05-25|1-URGENT|Clerk#000000774|0|long the blithely special dependencies. furiously ironic asymptotes according +35268|383|O|1877.97|1998-01-15|3-MEDIUM|Clerk#000000730|0|affix carefully quick packages. fu +35269|265|F|46879.55|1994-06-17|5-LOW|Clerk#000000044|0|bold theodolites. carefully pending +35270|782|F|28170.57|1994-11-10|5-LOW|Clerk#000000611|0|en accounts. final theodolites haggle against the specia +35271|334|F|874.89|1993-07-27|2-HIGH|Clerk#000000195|0|iously unusual packages are even requests. furiously regular package +35296|1358|F|78813.13|1995-03-22|5-LOW|Clerk#000000577|0| furious requests across +35297|844|F|83893.69|1993-01-01|1-URGENT|Clerk#000000331|0|ns. express dependencies cajole blithely dependencies. blithely ironic idea +35298|1351|F|84770.37|1992-10-19|5-LOW|Clerk#000000044|0| fluffily dogged accounts poach carefully regular instructions; ironi +35299|635|F|229544.89|1992-08-11|4-NOT SPECIFIED|Clerk#000000727|0|usly among the slyly special requests. +35300|332|F|244145.77|1993-03-03|3-MEDIUM|Clerk#000000977|0|ithely close ideas. carefully special braids cajole slyly abo +35301|373|F|133957.73|1992-12-22|5-LOW|Clerk#000000372|0|e bold requests. bold id +35302|529|F|253194.77|1993-06-08|3-MEDIUM|Clerk#000000900|0|olites. regular packages use above the even, pen +35303|821|O|68548.63|1998-02-24|4-NOT SPECIFIED|Clerk#000000628|0|of the excuses. blithely regular e +35328|1418|F|174083.56|1993-07-08|1-URGENT|Clerk#000000582|0|y ironic pinto beans; fluffily final ideas nag furio +35329|628|O|19827.19|1997-03-21|1-URGENT|Clerk#000000655|0|ronic foxes boost blithely across the ironic dolphins. fu +35330|1085|F|94016.86|1994-04-11|1-URGENT|Clerk#000000359|0|s against the slyly bold deposits +35331|1138|O|85413.97|1997-05-09|2-HIGH|Clerk#000000051|0|fully according to the quickly even deposits. furious +35332|833|O|24991.04|1997-06-19|4-NOT SPECIFIED|Clerk#000000076|0|cross the excuses. final instructions haggle blithely unus +35333|793|O|129466.93|1996-11-24|3-MEDIUM|Clerk#000000278|0|ges use carefully according to the accounts. blithel +35334|341|O|63661.58|1996-07-24|5-LOW|Clerk#000000740|0|inal platelets mold slyly about the blithel +35335|349|O|171058.34|1997-02-13|5-LOW|Clerk#000000577|0|to beans. blithely regular excuses eat blithely at the pending, express d +35360|241|P|304454.67|1995-04-19|1-URGENT|Clerk#000000350|0| decoys use pinto beans. quickly special +35361|388|F|191240.86|1994-04-07|3-MEDIUM|Clerk#000000098|0|lar accounts hang blithely carefully regular deposits. final, unusual re +35362|350|O|92476.08|1995-07-05|2-HIGH|Clerk#000000155|0| requests nag. furiously unusual instructions al +35363|695|O|4508.89|1996-11-17|4-NOT SPECIFIED|Clerk#000000769|0|s. blithely special deposits haggle carefully quickly final reque +35364|137|F|246675.18|1994-12-13|1-URGENT|Clerk#000000327|0| realms nag alongsid +35365|1043|O|114392.05|1997-06-24|4-NOT SPECIFIED|Clerk#000000555|0| requests. unusual grouche +35366|1264|O|264377.97|1995-07-13|5-LOW|Clerk#000000056|0|courts are blithely? carefully ironic excuses cajo +35367|892|O|142648.83|1996-04-07|4-NOT SPECIFIED|Clerk#000000678|0|thely special platele +35392|1207|F|51872.69|1992-02-24|2-HIGH|Clerk#000000644|0|hely furiously silent frays. close instructions sleep quick +35393|1282|F|21600.97|1995-04-18|3-MEDIUM|Clerk#000000952|0|sly slyly silent excuses. furiously pending +35394|565|O|56607.82|1997-06-01|4-NOT SPECIFIED|Clerk#000000901|0|nto beans against the carefully silent dependenci +35395|775|F|78617.38|1994-03-23|3-MEDIUM|Clerk#000000428|0|ully quickly regular deposits. slyly final courts unwind. fluffily regular +35396|568|O|173609.34|1996-03-04|2-HIGH|Clerk#000000081|0|eep carefully unusual +35397|796|O|88226.22|1998-05-12|3-MEDIUM|Clerk#000000471|0|rhorses. slyly even courts haggle after the furiously ev +35398|1129|O|186743.17|1996-12-06|3-MEDIUM|Clerk#000000695|0|thely carefully regular deposits. slyly express excuses wake blithel +35399|674|F|57309.13|1995-01-22|5-LOW|Clerk#000000728|0|se carefully across the theodolites. blithel +35424|772|O|397797.80|1996-01-04|1-URGENT|Clerk#000000234|0|dependencies. regular warthogs nag blithe +35425|203|F|208296.81|1993-03-29|4-NOT SPECIFIED|Clerk#000000265|0|uickly bold dolphins are in place of the regular pinto beans. exp +35426|1201|F|105624.40|1993-10-04|2-HIGH|Clerk#000000452|0|uickly ironic deposits. slyly ironic excuses unwind regular, regula +35427|304|O|64824.81|1996-02-25|4-NOT SPECIFIED|Clerk#000000321|0|onic asymptotes! stealthily ruthless Tiresias nag. carefully e +35428|1342|F|115621.13|1992-06-08|5-LOW|Clerk#000000863|0|s grow slyly. pinto beans wake quickly special pac +35429|8|O|57858.41|1996-10-28|5-LOW|Clerk#000000964|0|he blithely ironic deposits haggle boldly regular requests. blithely pendi +35430|298|F|219768.01|1993-03-26|5-LOW|Clerk#000000346|0|lithely pending packages wak +35431|70|F|123140.32|1994-11-19|1-URGENT|Clerk#000000733|0|lyly express excuses cajole fluffily at the unusual foxes. slyly ironic +35456|1474|F|249492.46|1992-11-02|1-URGENT|Clerk#000000394|0|ges cajole special dependencies. slyly silent requ +35457|1126|F|245338.12|1994-12-08|5-LOW|Clerk#000000648|0|uriously ironic packages are quickly blithely ironic pinto bean +35458|1229|O|48115.51|1996-10-12|2-HIGH|Clerk#000000549|0|deposits wake. furiously specia +35459|770|O|111382.78|1997-04-12|5-LOW|Clerk#000000878|0|packages sleep slyly among the blithely ironic somas. final theo +35460|334|F|405742.27|1993-11-28|5-LOW|Clerk#000000112|0| deposits wake furiously into the s +35461|779|F|186965.92|1994-06-02|1-URGENT|Clerk#000000466|0| express requests across the slyly regular deposits haggle about the bl +35462|1322|O|259814.73|1998-06-10|1-URGENT|Clerk#000000115|0|usly blithely careful pinto +35463|778|O|77963.14|1996-06-12|5-LOW|Clerk#000000332|0|pending foxes. carefully regular accounts haggl +35488|1171|O|296914.48|1995-08-18|3-MEDIUM|Clerk#000000407|0|structions detect slyly final pinto b +35489|649|O|153144.24|1998-06-20|2-HIGH|Clerk#000000249|0| across the slyly even instr +35490|673|F|236103.08|1993-12-08|2-HIGH|Clerk#000000817|0|ole fluffily around the ironic, +35491|976|O|8457.66|1996-07-18|4-NOT SPECIFIED|Clerk#000000986|0|blithely throughout the slyly unusual packages? even, regular +35492|1237|F|222036.22|1992-02-11|3-MEDIUM|Clerk#000000046|0|ckly slyly ironic pinto +35493|13|F|23620.23|1994-04-02|2-HIGH|Clerk#000000855|0|counts. carefully regular instructions cajole ironic packages. q +35494|727|F|165401.57|1995-02-15|3-MEDIUM|Clerk#000000107|0|he even dolphins; brave ideas cajole about the slyly ironic cour +35495|568|O|93606.42|1997-07-06|3-MEDIUM|Clerk#000000845|0| nag blithely against the quic +35520|1411|O|33205.66|1998-02-20|5-LOW|Clerk#000000794|0|s wake quickly. carefully regular accounts alongside of th +35521|1394|O|164681.42|1996-03-19|3-MEDIUM|Clerk#000000696|0|uriously bold deposits. regular, even accounts sleep caref +35522|215|F|72577.74|1993-10-26|5-LOW|Clerk#000000624|0|e. ironic requests are furiously. final, +35523|1319|O|78100.83|1996-05-26|3-MEDIUM|Clerk#000000491|0|egular accounts? pending, pending foxes against the carefully ironic +35524|1267|O|2409.79|1997-07-12|1-URGENT|Clerk#000000128|0| carefully thin pack +35525|566|O|185871.69|1995-11-11|3-MEDIUM|Clerk#000000667|0|s. blithely pending requests wake alongside of the furiously express a +35526|463|O|61132.24|1996-07-29|5-LOW|Clerk#000000236|0| blithely bold deposits cajole +35527|607|F|27858.88|1993-04-28|5-LOW|Clerk#000000215|0|y unusual realms haggle blithely theodolites. furiously re +35552|1322|O|111952.09|1997-04-07|2-HIGH|Clerk#000000782|0|uffily. ironic instructions w +35553|427|F|12835.77|1993-03-26|4-NOT SPECIFIED|Clerk#000000012|0|s ideas around the theodolites haggle slyly a +35554|1259|F|103324.34|1992-09-25|4-NOT SPECIFIED|Clerk#000000530|0|al deposits across the blithely ironic courts cajole unusual dep +35555|1199|P|139003.65|1995-03-05|3-MEDIUM|Clerk#000000147|0|uickly regular foxes. carefully ironic deposits wake slyly agai +35556|688|O|298605.48|1997-04-02|1-URGENT|Clerk#000000208|0|quests. furiously even foxes cajole al +35557|358|F|156447.26|1994-02-23|3-MEDIUM|Clerk#000000284|0|ructions cajole blithely after the regular accounts. final asymptotes +35558|997|F|127243.02|1994-09-16|1-URGENT|Clerk#000000572|0| furious pinto beans sleep +35559|334|O|47725.97|1998-04-09|4-NOT SPECIFIED|Clerk#000000781|0|ests cajole furiously even platelets; fluff +35584|53|P|89047.22|1995-05-04|3-MEDIUM|Clerk#000000607|0|telets. pending packages nag blithely after the quickly express deposits. +35585|755|O|103735.35|1997-06-30|3-MEDIUM|Clerk#000000385|0|ronic packages. final, bold requests are +35586|187|O|266477.18|1996-10-24|4-NOT SPECIFIED|Clerk#000000348|0|ons sublate fluffily finally pending packages. careful +35587|1480|O|209691.18|1995-11-11|1-URGENT|Clerk#000000995|0|mise slyly quickly ironic pinto beans. +35588|103|F|126382.75|1993-06-14|5-LOW|Clerk#000000448|0|he silently ironic packages h +35589|175|F|217008.84|1993-12-28|5-LOW|Clerk#000000337|0|s haggle carefully. blithely final d +35590|1258|F|231457.27|1992-12-03|1-URGENT|Clerk#000000180|0|uctions. carefully ironic packages use. furiously +35591|886|O|173725.25|1996-12-27|4-NOT SPECIFIED|Clerk#000000193|0| furiously. carefully special platelets integrate about +35616|1345|F|18847.62|1993-01-07|4-NOT SPECIFIED|Clerk#000000289|0|nag final packages. ironic theodolites haggle +35617|130|F|10029.42|1995-02-01|4-NOT SPECIFIED|Clerk#000000492|0|ly regular frets use fluffily silent theodolites. fluffily regula +35618|1036|O|171238.55|1996-03-03|5-LOW|Clerk#000000594|0|e along the careful, special accounts. daringly express packages use quickly. +35619|1193|O|174363.36|1996-05-11|4-NOT SPECIFIED|Clerk#000000747|0|s doubt blithely pe +35620|338|O|120904.25|1996-08-08|3-MEDIUM|Clerk#000000513|0|ts. carefully even packages sleep slyly against the pending, e +35621|1432|F|124547.65|1994-12-23|2-HIGH|Clerk#000000863|0|s wake doggedly furiously final deposits. slyly express requests cajole plate +35622|1457|O|72206.60|1998-06-06|2-HIGH|Clerk#000000154|0| carefully silent the +35623|298|O|113082.12|1996-03-02|5-LOW|Clerk#000000230|0|ly regular asymptotes haggle quickly! package +35648|731|O|92140.43|1998-01-16|1-URGENT|Clerk#000000952|0|g to the bold accounts. regular, bold acc +35649|325|O|136632.16|1995-10-10|3-MEDIUM|Clerk#000000470|0|iously bold deposits after the carefully ironic pinto beans +35650|161|O|186670.49|1996-08-29|1-URGENT|Clerk#000000457|0|-- slyly regular requests haggle final, unusual accounts. court +35651|172|O|298502.85|1998-06-09|1-URGENT|Clerk#000000808|0|o beans. quickly ironic requests above the carefully express deposits nag requ +35652|1459|F|268833.42|1993-09-22|5-LOW|Clerk#000000909|0|ests above the fluffily final foxes sleep above the accounts. b +35653|1078|O|37143.14|1996-06-10|1-URGENT|Clerk#000000654|0|nstructions against the platelets nag above the furiously regular +35654|550|O|73277.07|1995-09-08|4-NOT SPECIFIED|Clerk#000000996|0|d hockey players haggle according to the regular reque +35655|539|O|13264.91|1998-07-26|4-NOT SPECIFIED|Clerk#000000852|0|unts boost ironic foxes. carefully unusual depos +35680|454|O|59522.21|1996-02-09|3-MEDIUM|Clerk#000000872|0|lithely according to the even, pending accounts. pending, special braids +35681|997|O|77597.40|1997-08-27|1-URGENT|Clerk#000000298|0|ronic accounts sleep furiously. unusual requests cajole slyly. +35682|775|F|239530.04|1994-07-06|2-HIGH|Clerk#000000889|0|ideas nag after the fluffily silent ideas! permane +35683|281|O|121783.60|1997-09-26|3-MEDIUM|Clerk#000000526|0|ide of the furiously express dolphins. fluffily final +35684|230|O|135819.17|1995-08-04|5-LOW|Clerk#000000768|0|requests. unusual packages boost along +35685|611|F|44287.19|1994-11-24|2-HIGH|Clerk#000000182|0|lar grouches. quickly ironic asymptotes aro +35686|248|F|125410.58|1993-10-03|2-HIGH|Clerk#000000850|0|nstructions. furiously final pains wake pa +35687|380|O|179739.16|1995-11-19|4-NOT SPECIFIED|Clerk#000000812|0|nts haggle about the ironic platelets. stealthily even excuses boos +35712|667|F|211305.12|1992-10-24|2-HIGH|Clerk#000000419|0|requests are blithely +35713|580|F|13493.13|1992-10-18|3-MEDIUM|Clerk#000000816|0|rate around the accounts. +35714|223|O|181396.07|1997-04-02|3-MEDIUM|Clerk#000000162|0|fully idle pinto beans. slyly final acco +35715|1043|F|163308.73|1993-02-08|5-LOW|Clerk#000000531|0| fluffily pending theodolites breach +35716|641|O|41703.87|1996-03-19|2-HIGH|Clerk#000000403|0| use blithely. furiously express requests dou +35717|874|O|46848.50|1998-04-10|3-MEDIUM|Clerk#000000270|0| express foxes haggle slyly furious +35718|1061|O|313915.06|1997-11-18|4-NOT SPECIFIED|Clerk#000000675|0|n theodolites wake carefully final foxes. regular decoys are at +35719|803|O|72956.20|1997-02-13|2-HIGH|Clerk#000000543|0|ffily even asymptotes grow slyly quickly express packages. +35744|1246|F|126507.64|1994-03-22|4-NOT SPECIFIED|Clerk#000000094|0|its cajole slyly. accounts nag slyly closely bold requests. expr +35745|910|O|141231.11|1995-10-15|3-MEDIUM|Clerk#000000945|0|deas across the even deposits affix ca +35746|553|F|107093.51|1994-02-09|4-NOT SPECIFIED|Clerk#000000299|0|express deposits. even, final instructions believe blithely. requests +35747|1120|O|87540.12|1997-09-02|3-MEDIUM|Clerk#000000207|0|ng to the fluffily regular foxes. bold accounts sleep. pe +35748|965|O|181762.14|1996-10-08|3-MEDIUM|Clerk#000000502|0|ld ideas. accounts integrate furiously +35749|1492|O|37881.67|1996-03-06|3-MEDIUM|Clerk#000000087|0|kly ironic deposits according to the +35750|1279|F|85280.49|1993-09-27|2-HIGH|Clerk#000000613|0|totes. blithely unusual requests breach quickly furiously even packag +35751|338|O|270450.40|1997-03-15|1-URGENT|Clerk#000000825|0|foxes. quickly even decoys al +35776|958|F|254715.40|1994-02-05|3-MEDIUM|Clerk#000000554|0|eposits; bold pinto beans maintain carefully +35777|787|F|136771.41|1993-09-09|1-URGENT|Clerk#000000948|0|inst the fluffily unusual accounts haggle carefully according to the speci +35778|892|O|99381.03|1995-09-17|5-LOW|Clerk#000000997|0|ourts haggle carefully regular, final foxe +35779|529|F|31866.63|1993-06-12|4-NOT SPECIFIED|Clerk#000000445|0|y. furiously regular sentiments haggle +35780|1051|F|76844.00|1995-01-18|3-MEDIUM|Clerk#000000327|0|special deposits. pending, regular theodolites above the +35781|1142|F|278962.71|1993-05-16|3-MEDIUM|Clerk#000000177|0|es. requests across the ironi +35782|715|O|177951.73|1995-08-06|5-LOW|Clerk#000000626|0|iously final accounts are after the slyly special asymp +35783|349|O|120202.24|1997-06-21|4-NOT SPECIFIED|Clerk#000000093|0|l accounts alongside of the furiously ironic excuses cajole quickly pe +35808|173|O|179613.08|1997-10-03|3-MEDIUM|Clerk#000000406|0|. accounts after the slyly bold pinto beans wa +35809|586|F|37425.80|1993-07-13|5-LOW|Clerk#000000263|0|uriously final foxes. pending theodolites according to the dolphins integra +35810|721|O|122723.03|1997-01-21|2-HIGH|Clerk#000000596|0|ccording to the carefully regular requests. slyly ironic deposits affix +35811|586|F|185551.43|1992-01-04|1-URGENT|Clerk#000000257|0|egular deposits. special ideas hin +35812|823|F|209862.12|1993-01-23|1-URGENT|Clerk#000000826|0|d after the final dependencies. furiously ironic excuses cajole carefu +35813|1207|F|200557.92|1994-04-22|1-URGENT|Clerk#000000338|0|e express, regular theo +35814|223|F|242528.92|1992-03-28|2-HIGH|Clerk#000000078|0|ct-- regular, regular foxes haggle +35815|610|F|118558.98|1992-10-28|3-MEDIUM|Clerk#000000801|0|usual deposits. deposits sleep even, final ideas. slyly +35840|199|F|100089.14|1993-05-30|2-HIGH|Clerk#000000220|0|into beans nod carefully along the ironic waters +35841|947|O|235812.27|1995-05-09|3-MEDIUM|Clerk#000000119|0|riously special requests among the final instructions sleep a +35842|1058|F|117860.24|1992-05-25|2-HIGH|Clerk#000000475|0|furiously special instructions cajol +35843|1192|O|133741.36|1997-11-19|2-HIGH|Clerk#000000809|0|y special orbits boost slyly silent foxes. packag +35844|7|F|86552.46|1994-12-07|5-LOW|Clerk#000000503|0|kly final pinto beans above the special requests sleep blithely bo +35845|904|F|99503.24|1995-01-07|2-HIGH|Clerk#000000838|0| idle pinto beans. furiously final multipliers boos +35846|200|F|64349.01|1992-02-16|3-MEDIUM|Clerk#000000046|0|pendencies haggle regular, thin instructions +35847|832|F|270113.36|1994-01-31|1-URGENT|Clerk#000000986|0| the slyly final attainments. daringly regular pinto be +35872|1081|F|142115.66|1994-12-19|1-URGENT|Clerk#000000770|0|dolites. special requests try to boost quickly after the carefull +35873|1261|O|81358.14|1995-12-21|3-MEDIUM|Clerk#000000191|0|fily. permanently even deposits affix fin +35874|940|O|294154.95|1996-12-16|5-LOW|Clerk#000000847|0|ic, silent instructions cajole fluff +35875|887|O|242797.59|1995-06-15|2-HIGH|Clerk#000000790|0|ccounts cajole against the ironic foxes. blithely pending +35876|1019|O|200425.67|1998-03-04|3-MEDIUM|Clerk#000000342|0|ep slyly. furiously unusual theodolites impress blithely ironic accounts. +35877|473|F|179344.94|1993-05-26|2-HIGH|Clerk#000000143|0| furiously ironic accounts dazzle quickly. theodolites haggle furiously +35878|340|F|144632.60|1993-08-14|3-MEDIUM|Clerk#000000786|0|hely bold deposits are slowly above the slyly final pinto beans. deposits no +35879|473|O|111557.41|1996-04-26|3-MEDIUM|Clerk#000000726|0|al, final requests. pinto beans +35904|206|O|61404.85|1997-07-31|5-LOW|Clerk#000000578|0|y. idly final accounts must have to affix carefully qui +35905|1204|F|195870.87|1992-02-20|5-LOW|Clerk#000000688|0|uriously against the furi +35906|980|O|209427.60|1997-03-16|1-URGENT|Clerk#000000838|0|ites haggle against the requests. final packages use across the fluff +35907|1295|O|150265.03|1998-04-13|1-URGENT|Clerk#000000050|0|ipliers detect after the slyly fina +35908|844|F|141836.29|1993-12-13|4-NOT SPECIFIED|Clerk#000000625|0|ecial, even requests may use above the express reque +35909|1303|O|255412.27|1996-10-09|4-NOT SPECIFIED|Clerk#000000104|0|tly final pinto beans hang bold packages. fluffily +35910|1343|F|236598.48|1993-11-25|2-HIGH|Clerk#000000629|0| quickly quiet accounts sleep slyly ironic ideas. slyly regular instruction +35911|1247|O|13877.20|1997-02-17|4-NOT SPECIFIED|Clerk#000000453|0|gle fluffily furiously special instructions. slyly regul +35936|940|F|332603.47|1994-01-22|3-MEDIUM|Clerk#000000730|0|ly bold accounts along the enticing, pending packages sleep blithely q +35937|484|O|304112.55|1996-06-14|5-LOW|Clerk#000000030|0|osits sleep above the escapades. pending packages sl +35938|50|F|215107.90|1992-11-18|4-NOT SPECIFIED|Clerk#000000100|0|requests. blithely final requests according to the quickly pending ideas +35939|1486|O|22886.55|1996-08-01|5-LOW|Clerk#000000941|0| carefully unusual requests must have to snooze above the quietly express +35940|934|F|194254.49|1993-05-28|1-URGENT|Clerk#000000619|0| by the final theodolites. pending warthogs h +35941|934|O|11542.47|1996-09-18|5-LOW|Clerk#000000372|0|ons haggle furiously among the regular deposits. furiousl +35942|82|O|178542.48|1997-09-17|3-MEDIUM|Clerk#000000139|0| excuses: fluffily +35943|331|O|241420.18|1997-12-12|3-MEDIUM|Clerk#000000913|0|final asymptotes haggle slyly along the +35968|718|F|251339.31|1992-03-04|4-NOT SPECIFIED|Clerk#000000987|0| ruthlessly final depend +35969|503|O|136870.83|1997-08-28|3-MEDIUM|Clerk#000000270|0|telets poach carefully alongside of the slyly even ideas. express, unusua +35970|1433|O|228507.77|1997-04-22|3-MEDIUM|Clerk#000000295|0|lithely ironic realms. packages cajole. blithely busy courts ab +35971|106|O|174256.07|1997-01-04|2-HIGH|Clerk#000000029|0| carefully even deposits. furiously ironic accounts nag bold theodoli +35972|10|F|39228.39|1993-12-25|1-URGENT|Clerk#000000002|0|ly up the ironic deposits. slyly ironic escapades toward the fluffily unu +35973|215|O|233172.57|1997-09-08|1-URGENT|Clerk#000000485|0|al excuses. quickly even requests use slyly. blithe +35974|1324|O|207278.96|1998-06-14|5-LOW|Clerk#000000844|0|press accounts integrate spec +35975|1199|O|74088.00|1997-07-26|4-NOT SPECIFIED|Clerk#000000561|0|alms! regular, unusual ideas solve among the ironically bold +36000|1063|F|15427.43|1992-01-24|1-URGENT|Clerk#000000544|0|ash. blithely pending pinto beans +36001|260|P|253731.56|1995-03-29|5-LOW|Clerk#000000138|0|sleep according to the daring, regular packages. slowly fina +36002|643|F|88889.12|1993-05-13|4-NOT SPECIFIED|Clerk#000000303|0|. express theodolites alongside of the slyly express theodol +36003|1396|F|51581.34|1993-11-01|3-MEDIUM|Clerk#000000222|0| ironic deposits. theodolites wake abov +36004|457|O|115049.36|1998-05-13|1-URGENT|Clerk#000000827|0|slyly among the courts. carefully final excuses detect slyly brave dep +36005|637|F|152183.57|1993-09-18|5-LOW|Clerk#000000383|0|as. thinly pending platelets haggle quickly: bl +36006|682|O|293037.60|1995-10-14|5-LOW|Clerk#000000727|0| deposits boost pinto beans. carefully fi +36007|209|O|58452.72|1997-04-24|5-LOW|Clerk#000000071|0|eas sleep carefully regular excuses. slyly +36032|922|O|36888.63|1997-07-16|2-HIGH|Clerk#000000277|0|are besides the quickly final requests. blithely unus +36033|584|F|123904.67|1994-12-20|4-NOT SPECIFIED|Clerk#000000660|0| requests; even deposits play. quick +36034|811|F|53715.13|1992-10-17|2-HIGH|Clerk#000000858|0|ounts. sometimes express foxes after the even, regular p +36035|749|O|89358.84|1996-11-10|5-LOW|Clerk#000000835|0|round the slyly bold instructions wake after the packages. +36036|1042|F|252792.91|1993-04-08|3-MEDIUM|Clerk#000000442|0|ns haggle slyly. regular, final r +36037|139|F|73552.16|1994-04-30|2-HIGH|Clerk#000000877|0|e against the carefully final accounts. express deposits +36038|142|F|132325.84|1992-08-17|2-HIGH|Clerk#000000454|0|its against the carefully regular deposits haggle ca +36039|1313|O|117310.81|1996-04-02|5-LOW|Clerk#000000950|0|even accounts. fluffily silen +36064|1138|O|162997.13|1997-10-24|5-LOW|Clerk#000000928|0| packages will have to engage carefully. carefully pending packages serve bli +36065|1117|F|236188.57|1993-02-18|2-HIGH|Clerk#000000695|0|ve carefully against the furiously special pinto beans. blithel +36066|442|O|239142.67|1997-09-02|1-URGENT|Clerk#000000804|0|s. ironic accounts cajole according to the quickly ruthless theod +36067|1078|F|62967.03|1994-07-05|2-HIGH|Clerk#000000612|0|lar deposits haggle. +36068|1186|F|146988.12|1994-02-06|1-URGENT|Clerk#000000027|0|ccounts. carefully ironic +36069|904|F|101156.81|1994-12-06|5-LOW|Clerk#000000424|0|ic multipliers nag fluffily special deposits. even t +36070|1354|O|260887.22|1998-06-02|2-HIGH|Clerk#000000957|0|en packages. regular pinto beans are +36071|1267|F|48682.04|1993-11-24|2-HIGH|Clerk#000000208|0|uests. regular, special accounts according to the final requests believe furio +36096|238|F|58229.12|1993-01-27|4-NOT SPECIFIED|Clerk#000000343|0|y carefully regular deposits; carefully even packa +36097|167|O|94780.99|1998-02-17|3-MEDIUM|Clerk#000000626|0|ages. pending, regular theodolites +36098|1412|O|42965.99|1995-12-01|3-MEDIUM|Clerk#000000727|0|kages mold furiously furiously bold courts. ironic sentiments wake amo +36099|1040|F|133358.84|1993-09-18|5-LOW|Clerk#000000173|0|uickly ironic deposits-- express packages against the unusual accounts wake q +36100|862|F|22298.10|1992-07-20|5-LOW|Clerk#000000135|0|yly past the carefully ironic platelets. fur +36101|805|F|112554.67|1992-08-21|2-HIGH|Clerk#000000282|0|er the regular packages. regular atta +36102|920|F|179042.75|1993-05-21|4-NOT SPECIFIED|Clerk#000000930|0|y express accounts are. final accounts wake blith +36103|904|F|132372.53|1992-04-30|1-URGENT|Clerk#000000418|0|uickly unusual instructions. carefully final packages wake bold +36128|64|O|80015.74|1995-07-25|5-LOW|Clerk#000000344|0|l packages cajole. blithely pending instructio +36129|469|O|148596.55|1997-07-22|3-MEDIUM|Clerk#000000648|0|ar accounts are blithely carefully final instructions. bold, slow platel +36130|322|F|180264.41|1992-09-14|1-URGENT|Clerk#000000184|0|icingly regular pinto beans. furiously final deposits sleep quick +36131|1223|F|248655.88|1994-05-18|2-HIGH|Clerk#000000241|0|carefully even pinto beans. furiously bold pack +36132|389|F|112095.07|1992-04-10|5-LOW|Clerk#000000028|0|yly. ideas along the carefully ironic theodolites +36133|22|O|102720.75|1995-08-21|3-MEDIUM|Clerk#000000488|0| platelets use blithely quickly ironic pi +36134|1394|F|41650.11|1993-11-23|5-LOW|Clerk#000000546|0|counts print carefully according to the quickly bold packages +36135|349|P|190704.98|1995-05-31|4-NOT SPECIFIED|Clerk#000000772|0|regular theodolites-- even, pending packages detect special, pending grouches +36160|847|F|70175.63|1992-11-23|5-LOW|Clerk#000000758|0|s sleep quickly. unusual requests kindle at the fluffily unusual accounts. eve +36161|814|F|244346.91|1993-01-17|1-URGENT|Clerk#000000146|0|ound the furiously final foxes. final instruction +36162|517|O|58027.15|1998-05-21|4-NOT SPECIFIED|Clerk#000000356|0|arefully carefully +36163|181|F|30595.85|1992-11-06|5-LOW|Clerk#000000772|0|ccounts kindle evenly even accounts: eve +36164|1028|O|82005.98|1996-03-02|4-NOT SPECIFIED|Clerk#000000141|0| boost regularly. slyly even foxes cajole slyly slyly regular +36165|308|O|27985.69|1996-09-08|1-URGENT|Clerk#000000037|0| are fluffily at the requests. blithely close ho +36166|661|O|106356.53|1998-07-01|1-URGENT|Clerk#000000476|0| the final, even foxes. special dep +36167|1138|O|69338.55|1997-03-18|5-LOW|Clerk#000000103|0| haggle slyly pending packages. furiously even deposits grow: special +36192|1078|O|133514.64|1996-04-16|5-LOW|Clerk#000000239|0|lly pending accounts! final packages haggle quickly alongside +36193|832|O|179677.57|1995-07-22|3-MEDIUM|Clerk#000000854|0|al requests nag carefully according to the slyly i +36194|1075|O|217514.28|1997-12-17|4-NOT SPECIFIED|Clerk#000000577|0|ole among the dependencies. final deposits boost permanently slyly +36195|848|O|165846.50|1997-06-06|2-HIGH|Clerk#000000280|0|lar theodolites haggle carefully ag +36196|1495|O|137914.13|1995-08-07|4-NOT SPECIFIED|Clerk#000000042|0|p after the furiously final deposits +36197|898|F|230803.93|1995-01-25|4-NOT SPECIFIED|Clerk#000000971|0|ckly express ideas sleep against the fur +36198|349|O|111002.80|1995-07-17|5-LOW|Clerk#000000256|0|ress requests do affix quietly. furiously final dep +36199|193|O|150725.54|1996-02-14|2-HIGH|Clerk#000000148|0| quickly blithely final accounts. slyly final deposits within the ideas sleep +36224|199|F|115079.48|1994-05-04|3-MEDIUM|Clerk#000000860|0|e above the pending, regular instructions. furiously unusual saute +36225|334|O|98490.37|1997-06-10|5-LOW|Clerk#000000200|0|s are slyly special, express asymptotes. bl +36226|827|O|258217.34|1997-01-01|1-URGENT|Clerk#000000101|0|xpress requests. theodolites wake quickly among the fur +36227|241|O|219928.93|1996-03-28|5-LOW|Clerk#000000100|0|kly regular deposits ar +36228|715|O|89243.31|1997-11-27|5-LOW|Clerk#000000896|0|s. ironic frays are blithely. furiously final accounts nag after the sl +36229|760|F|302183.03|1992-09-22|4-NOT SPECIFIED|Clerk#000000554|0|osits integrate quickly +36230|496|F|288342.22|1994-06-11|2-HIGH|Clerk#000000231|0|ve the furiously regular requests. blithely regular requests sleep bold escapa +36231|835|F|95033.98|1992-12-03|3-MEDIUM|Clerk#000000839|0|sleep regular theodolites. slyly regular theodolites breac +36256|59|O|258711.34|1996-12-22|5-LOW|Clerk#000000500|0|ly instead of the instructions. furiously final requests breach. furiously fin +36257|130|F|96834.09|1992-02-29|2-HIGH|Clerk#000000442|0| furiously regular platelets sleep slyly around +36258|146|F|138221.52|1995-02-10|3-MEDIUM|Clerk#000000386|0|ly pending deposits: unusual, final requests ab +36259|442|O|22648.01|1996-10-14|1-URGENT|Clerk#000000006|0|usly express foxes. carefully ironic pla +36260|370|O|124168.90|1997-08-30|5-LOW|Clerk#000000779|0|boost. furiously ir +36261|947|O|270403.85|1996-05-10|3-MEDIUM|Clerk#000000363|0|l accounts. ruthlessly silent deposits doubt fluffily carefully regul +36262|1060|F|175904.86|1993-07-28|4-NOT SPECIFIED|Clerk#000000414|0|ar frays are. regular pint +36263|1393|O|266320.02|1998-01-28|1-URGENT|Clerk#000000919|0|cial, final packages eat carefully along the ironic, final pinto beans. ironi +36288|862|F|78807.05|1993-01-20|1-URGENT|Clerk#000000719|0| ironic pinto beans maintain according to the regular requests. express, regu +36289|977|F|232978.33|1994-05-27|1-URGENT|Clerk#000000400|0|the unusual asymptotes integrate furiously blithely pending asymptotes. s +36290|668|F|21929.74|1993-09-19|2-HIGH|Clerk#000000552|0|from the furiously express packages. ironic +36291|1427|O|104579.13|1997-06-19|1-URGENT|Clerk#000000201|0|r accounts sleep fluffily after the slyly pending packages. regular ideas a +36292|538|F|205868.42|1993-02-08|1-URGENT|Clerk#000000776|0|ven packages about the unusual packages wak +36293|451|F|127851.86|1993-12-31|3-MEDIUM|Clerk#000000655|0|ns cajole quickly around the platelets. even pinto beans above t +36294|709|F|25705.78|1992-08-21|3-MEDIUM|Clerk#000000939|0|ges haggle furiously even instructions. express, fl +36295|163|F|146750.26|1993-09-05|3-MEDIUM|Clerk#000000083|0|nusual deposits. courts sleep furiously according to the slyly even ep +36320|1268|F|78216.37|1994-08-05|2-HIGH|Clerk#000000716|0|s lose blithely ironic pinto beans. blithely fina +36321|1076|O|62326.55|1995-09-05|3-MEDIUM|Clerk#000000184|0|uriously among the carefully ironic patterns. fluffily pending deposits dete +36322|1324|O|114690.70|1996-04-20|5-LOW|Clerk#000000572|0|fully pending depths. regular foxes mol +36323|970|F|54261.52|1993-10-19|2-HIGH|Clerk#000000279|0|eposits wake. doggedly even instructions across the bl +36324|979|F|136362.12|1992-05-14|4-NOT SPECIFIED|Clerk#000000452|0|tealthy deposits. furiously special instructions hinder. even deposits ab +36325|1274|O|76299.92|1997-01-03|2-HIGH|Clerk#000000628|0|the quickly express ideas. carefully bold +36326|373|F|3544.97|1993-06-30|4-NOT SPECIFIED|Clerk#000000638|0|e slyly. furiously bold accounts sleep finally packages. bli +36327|515|F|135286.12|1994-10-28|5-LOW|Clerk#000000933|0|ickly: carefully dogged dependencies cajole slyly. pinto beans sleep +36352|941|F|74613.83|1995-03-10|5-LOW|Clerk#000001000|0|ic, regular deposits nag: furiously even accoun +36353|1345|O|201086.50|1996-08-11|4-NOT SPECIFIED|Clerk#000000197|0| the furiously daring dugouts. blithely bold instructions cajole +36354|1472|F|196123.44|1992-06-06|3-MEDIUM|Clerk#000000618|0|ges. slyly regular accounts sleep: express, final requests haggle slyly regula +36355|632|F|249195.68|1994-12-03|3-MEDIUM|Clerk#000000602|0|counts are fluffily. regular, even accounts wake furiousl +36356|115|O|118288.77|1995-12-26|3-MEDIUM|Clerk#000000713|0|ly among the pending accounts. ironic, s +36357|670|F|204679.94|1992-01-15|4-NOT SPECIFIED|Clerk#000000771|0|s. ideas nag slyly pending packages. bold, regular packages cajo +36358|1246|F|210662.95|1994-05-14|4-NOT SPECIFIED|Clerk#000000365|0|hely along the carefully busy excuses. ironic packages across th +36359|551|O|130621.40|1995-11-24|2-HIGH|Clerk#000000225|0|dly ironic accounts thrash after the furiously ironic ideas. furiou +36384|1033|O|167608.69|1997-01-10|3-MEDIUM|Clerk#000000357|0|ackages haggle. slyly speci +36385|418|O|33910.23|1996-10-02|4-NOT SPECIFIED|Clerk#000000933|0|bout the carefully express accounts integrate furiously requests. furiousl +36386|4|F|6829.14|1994-04-03|3-MEDIUM|Clerk#000000755|0|usly bold sheaves along the caref +36387|845|O|277594.34|1995-11-08|2-HIGH|Clerk#000000584|0|oxes. carefully final +36388|1331|O|111287.14|1996-05-31|4-NOT SPECIFIED|Clerk#000000518|0|dencies integrate quickly slyly ironic deposits. even Tiresias alongside of +36389|1064|O|67190.67|1997-02-22|3-MEDIUM|Clerk#000000383|0|cording to the even t +36390|35|F|248846.57|1992-10-13|2-HIGH|Clerk#000000186|0|ven sentiments nag ironic, ironic accounts. deposits sl +36391|118|O|26097.51|1997-07-21|3-MEDIUM|Clerk#000000008|0|g to the fluffily even accounts. slyly unusual instructions haggle +36416|446|F|230840.28|1994-12-01|5-LOW|Clerk#000000829|0|ic foxes are blithely regular theodolites. blithely +36417|1399|O|95095.47|1996-05-03|1-URGENT|Clerk#000000084|0| bold packages. dugouts sleep +36418|1489|F|99912.68|1992-01-28|4-NOT SPECIFIED|Clerk#000000370|0|yly silent foxes cajole quickly. doggedly even depths cajole someti +36419|383|O|20913.88|1998-03-31|4-NOT SPECIFIED|Clerk#000000758|0|osits. regular accounts s +36420|1358|O|186719.45|1997-07-24|3-MEDIUM|Clerk#000000611|0|ckly final instruction +36421|1243|O|280365.20|1996-04-11|2-HIGH|Clerk#000000260|0|eposits. carefully silent +36422|1|O|270087.44|1997-03-04|3-MEDIUM|Clerk#000000532|0|e evenly final dependencies. regular, bold pinto beans +36423|1376|O|39553.24|1995-04-24|2-HIGH|Clerk#000000059|0|! furiously regular requests are busily. ironic packages sleep ac +36448|940|F|248059.71|1993-09-11|3-MEDIUM|Clerk#000000685|0| carefully express deposits. furiously expre +36449|1177|F|205225.23|1993-09-06|4-NOT SPECIFIED|Clerk#000000379|0|st. carefully pending packages about the quickly final requests nag aga +36450|472|O|164194.22|1997-12-02|4-NOT SPECIFIED|Clerk#000000124|0|requests sleep slyly. carefully special re +36451|643|F|113333.71|1992-09-06|2-HIGH|Clerk#000000567|0|uld have to sleep permanently pending accounts. furiously express instruc +36452|49|F|160955.59|1994-04-06|2-HIGH|Clerk#000000021|0|slyly final requests will have to boost +36453|293|O|125554.70|1996-05-19|2-HIGH|Clerk#000000522|0|rges according to the carefully final packa +36454|583|F|172582.28|1995-02-19|1-URGENT|Clerk#000000894|0|fully across the quickly regular +36455|1426|F|161430.98|1994-02-20|2-HIGH|Clerk#000000410|0| cajole. express packages are. slyly express packages along t +36480|1163|F|235672.87|1993-08-23|3-MEDIUM|Clerk#000000201|0|dly furious accounts haggle furiously. final, regular sentiments impress +36481|673|O|114832.95|1998-07-25|4-NOT SPECIFIED|Clerk#000000994|0|longside of the regular, final requests. theodolites haggle. ironic, bold +36482|1024|O|122126.76|1995-07-06|3-MEDIUM|Clerk#000000558|0|s about the fluffily +36483|718|O|329897.27|1996-11-03|4-NOT SPECIFIED|Clerk#000000836|0|old pains cajole along the regular requ +36484|493|F|204715.32|1992-01-29|1-URGENT|Clerk#000000501|0|es across the fluffy, unusu +36485|1202|F|356711.63|1992-06-06|5-LOW|Clerk#000000064|0|otes nod blithely final platelets. regular, fluffy accounts are fl +36486|292|O|220906.53|1996-12-11|3-MEDIUM|Clerk#000000797|0|cajole carefully requests. do +36487|1072|O|166699.43|1997-05-18|1-URGENT|Clerk#000000355|0| furiously final packages sleep fur +36512|1000|F|311720.35|1992-03-29|4-NOT SPECIFIED|Clerk#000000772|0|kly unusual pinto beans haggle quickly fl +36513|488|O|245203.44|1996-01-12|1-URGENT|Clerk#000000939|0|y express ideas. instructions should have to haggle thinly slyly ironic i +36514|47|F|113817.41|1994-05-21|1-URGENT|Clerk#000000587|0|ccounts cajole furiously. pending, final ideas above the blithely bold depos +36515|1321|O|303394.60|1997-05-28|5-LOW|Clerk#000000995|0|ts. slyly final realms sleep slyly around the blithely permanent packages. +36516|943|O|144083.30|1995-07-26|3-MEDIUM|Clerk#000000498|0|he slyly even ideas. excuses serve above the +36517|101|F|240863.80|1993-03-02|4-NOT SPECIFIED|Clerk#000000375|0|equests haggle care +36518|353|O|33187.72|1997-08-06|3-MEDIUM|Clerk#000000087|0|yly. regular pinto beans haggle slyly. bold courts integrate fluffily. pi +36519|1486|F|52884.91|1993-05-31|4-NOT SPECIFIED|Clerk#000000972|0|ironic deposits are carefully. ironic, quick requests ca +36544|881|O|65549.49|1997-07-17|1-URGENT|Clerk#000000064|0|ns after the theodolites haggle +36545|859|O|193948.16|1997-10-19|1-URGENT|Clerk#000000074|0|special accounts are furiously after +36546|850|O|297069.13|1996-03-28|2-HIGH|Clerk#000000280|0|phins detect slyly furiously final requests. furiously silent theodolites +36547|1136|F|147912.58|1994-12-03|4-NOT SPECIFIED|Clerk#000000052|0|old requests sleep slyly alo +36548|527|F|72709.83|1993-10-31|5-LOW|Clerk#000000990|0|lly careful excuses along the slyly regular requests serve carefull +36549|223|O|75283.97|1996-05-17|3-MEDIUM|Clerk#000000246|0|instructions snooze carefully regular requests. fluffily regular package +36550|1456|F|72964.24|1994-02-13|4-NOT SPECIFIED|Clerk#000000637|0|hes haggle slyly outside t +36551|499|F|26895.66|1992-05-22|2-HIGH|Clerk#000000668|0|y along the final grouches. exp +36576|565|F|139736.46|1993-03-24|3-MEDIUM|Clerk#000000666|0|arefully special instructions. instructions wake furiously theod +36577|95|O|196590.15|1998-06-17|3-MEDIUM|Clerk#000000113|0|special deposits us +36578|136|O|27913.20|1998-07-04|3-MEDIUM|Clerk#000000847|0|ut the deposits. sp +36579|88|O|190752.20|1998-05-27|1-URGENT|Clerk#000000879|0| final packages. special accounts against +36580|137|O|214200.13|1997-07-13|5-LOW|Clerk#000000126|0|foxes according to the regular, regular accounts cajole blithel +36581|355|O|178535.22|1996-09-02|1-URGENT|Clerk#000000542|0| regular courts use. fluffily even foxes across the even excuse +36582|34|F|199609.11|1992-01-03|1-URGENT|Clerk#000000358|0|even requests might use carefully +36583|1387|O|239525.36|1997-05-03|1-URGENT|Clerk#000000772|0|e ironic accounts. busy orbits affix +36608|253|O|160888.30|1995-09-29|5-LOW|Clerk#000000826|0|gle carefully final plate +36609|68|F|307901.46|1994-05-15|4-NOT SPECIFIED|Clerk#000000750|0|out the fluffily special dugouts. bold, regular courts use blithely regula +36610|464|O|157563.08|1995-10-11|5-LOW|Clerk#000000667|0|totes. regular, quiet packages around the unusual accounts nag sl +36611|625|O|97678.96|1997-11-08|4-NOT SPECIFIED|Clerk#000000297|0|counts. final, special deposits kindle bli +36612|721|F|137188.30|1992-03-07|1-URGENT|Clerk#000000953|0|jole slyly pending instructions. slyly blithe requests sl +36613|721|O|24374.76|1996-01-16|4-NOT SPECIFIED|Clerk#000000700|0|platelets are quickly special ideas. slyly even asymptotes play sly +36614|139|F|29724.93|1992-05-19|2-HIGH|Clerk#000000010|0|eodolites. blithely regular packages are blithely regular, pendin +36615|1051|F|40644.50|1993-10-30|1-URGENT|Clerk#000000977|0| the blithely regular foxes boost furiously above the fluffily bold ins +36640|839|O|220472.97|1995-11-19|4-NOT SPECIFIED|Clerk#000000389|0|ites. even deposits haggle. furiously special exc +36641|352|O|142189.85|1997-11-20|2-HIGH|Clerk#000000050|0|tegrate blithely above the slyly dogged depos +36642|433|O|62573.96|1996-09-09|5-LOW|Clerk#000000044|0|ep blithely final, bold packages. packages wake around +36643|1210|F|198617.38|1994-02-24|1-URGENT|Clerk#000000767|0| carefully final depende +36644|22|F|255525.42|1992-05-14|2-HIGH|Clerk#000000002|0|ironic pinto beans haggle abov +36645|944|O|215722.38|1996-05-01|2-HIGH|Clerk#000000118|0|y special theodolites. even instructions hag +36646|734|F|164630.55|1993-06-09|3-MEDIUM|Clerk#000000763|0|ages against the regular, regular dependencies use blithe +36647|484|F|198138.08|1994-07-01|2-HIGH|Clerk#000000975|0|grate along the furiously ironic idea +36672|1183|O|181193.84|1997-08-05|4-NOT SPECIFIED|Clerk#000000153|0|atelets. furiously even asymptotes cajole carefully. furiously special p +36673|1226|F|364437.75|1993-09-14|5-LOW|Clerk#000000205|0|gular deposits-- fluffily regular instructions lose. carefully silent de +36674|1078|O|79320.49|1996-08-27|1-URGENT|Clerk#000000945|0|deas nod alongside of the furiously enticing ins +36675|455|O|166984.15|1995-07-04|2-HIGH|Clerk#000000792|0|y even instructions sleep fluffily o +36676|380|O|163752.55|1995-08-26|4-NOT SPECIFIED|Clerk#000000873|0|after the carefully regular requests. unusual +36677|1094|F|64670.83|1994-12-24|5-LOW|Clerk#000000833|0|uthlessly ironic packages. regularly expre +36678|557|F|302534.45|1994-01-21|3-MEDIUM|Clerk#000000145|0| requests use carefully ir +36679|646|O|103348.66|1995-08-31|1-URGENT|Clerk#000000624|0|s affix special tithes. furiously silent packages along +36704|11|O|268229.62|1995-06-17|2-HIGH|Clerk#000000459|0|to the blithely regular courts. express fr +36705|1063|F|197750.58|1994-06-26|4-NOT SPECIFIED|Clerk#000000533|0|ding instructions cajole furiously. accounts wake about the esc +36706|409|F|174490.92|1994-04-12|4-NOT SPECIFIED|Clerk#000000303|0|e furiously. even, final deposit +36707|1175|F|109250.23|1994-11-30|3-MEDIUM|Clerk#000000383|0| bold accounts use carefully ironic, unu +36708|13|O|77866.77|1995-09-20|4-NOT SPECIFIED|Clerk#000000692|0|r instructions are. slyly fi +36709|481|F|296669.94|1992-08-24|1-URGENT|Clerk#000000227|0| haggle quickly above the furiously ironic cou +36710|628|O|176910.26|1997-03-04|1-URGENT|Clerk#000000190|0|: quickly unusual theodolites cajole among th +36711|1141|O|213966.26|1997-11-30|3-MEDIUM|Clerk#000000381|0|nding epitaphs. furiously bold deposits ought to cajo +36736|1045|P|276367.57|1995-05-04|3-MEDIUM|Clerk#000000166|0|e pinto beans. slyly final dolphins wake across th +36737|1085|F|138929.83|1993-03-16|4-NOT SPECIFIED|Clerk#000000627|0|quick requests cajole closely regul +36738|220|O|194846.89|1996-07-03|1-URGENT|Clerk#000000987|0|. carefully ironic pinto beans sleep. ex +36739|239|F|194152.15|1994-10-09|4-NOT SPECIFIED|Clerk#000000828|0|fully even frets. carefully re +36740|281|O|236805.43|1997-01-07|3-MEDIUM|Clerk#000000491|0| ironic packages. furiously eve +36741|1322|F|152955.08|1993-12-20|1-URGENT|Clerk#000000326|0|inal platelets wake among the carefully final deposits. unusual, regular +36742|1123|O|77657.85|1998-01-03|3-MEDIUM|Clerk#000000630|0|kages. silent foxes boost furiously. special acc +36743|1136|F|111986.39|1992-09-09|1-URGENT|Clerk#000000161|0|ideas. bold ideas wake quickly b +36768|1006|O|80556.18|1998-04-08|3-MEDIUM|Clerk#000000797|0|sly even pinto beans. always unusual packages +36769|805|F|67108.74|1994-02-22|1-URGENT|Clerk#000000423|0| packages. special accounts against the even requests nag blithely at t +36770|1057|O|73907.33|1996-09-06|3-MEDIUM|Clerk#000000138|0| platelets. express requests +36771|274|O|137748.01|1995-10-27|5-LOW|Clerk#000000322|0|ccounts. quickly even deposits use slyly accounts. silent realms mold bli +36772|799|F|237589.75|1993-05-16|3-MEDIUM|Clerk#000000094|0|xes. pending deposits haggle according to the express foxes. furiously en +36773|1154|F|148942.11|1993-09-24|4-NOT SPECIFIED|Clerk#000000097|0|nto beans sleep through the slyly bold packag +36774|497|O|76768.47|1996-09-03|2-HIGH|Clerk#000000428|0|unts wake slyly unusual packages. ironic instructions wake-- slyly +36775|755|O|29719.94|1996-11-10|5-LOW|Clerk#000000448|0|uickly ironic accounts nag blithely final deposits. ironic r +36800|1198|F|164816.55|1993-09-11|2-HIGH|Clerk#000000847|0|equests affix. furiously b +36801|625|O|201447.97|1996-08-15|2-HIGH|Clerk#000000083|0| around the silent instructions? excuses sleep excuses: fluffily +36802|836|O|214377.52|1997-04-16|3-MEDIUM|Clerk#000000380|0|ests affix furiously along the furiously final ins +36803|545|F|372488.09|1992-08-05|4-NOT SPECIFIED|Clerk#000000518|0|eas print. furiously special theodolites are blithely final deposi +36804|314|F|255552.31|1994-06-29|1-URGENT|Clerk#000000564|0|into beans. fluffily special excuses haggle blithely final dependencie +36805|541|F|51825.09|1993-12-15|3-MEDIUM|Clerk#000000597|0| against the slyly special foxes. fur +36806|424|O|156837.97|1998-06-25|5-LOW|Clerk#000000848|0| against the carefully ruthless packages. pending ideas sleep fluffily blithe +36807|1177|F|142378.31|1994-03-17|3-MEDIUM|Clerk#000000133|0|cial accounts x-ray across the carefully +36832|926|F|243809.21|1992-06-02|5-LOW|Clerk#000000891|0|orses. bold, even deposits +36833|487|F|143876.01|1992-07-12|5-LOW|Clerk#000000266|0|ven deposits wake furious +36834|1388|F|100582.11|1994-12-25|5-LOW|Clerk#000000396|0|uriously according to the slyly ironic requests. final deposits after the s +36835|1205|F|264865.48|1994-10-21|1-URGENT|Clerk#000000188|0|y unusual ideas cajole carefully above t +36836|1138|F|113930.11|1993-02-27|3-MEDIUM|Clerk#000000616|0| instructions sleep. carefully unusual requests sleep. furiously sil +36837|487|O|277736.44|1997-06-18|4-NOT SPECIFIED|Clerk#000000457|0|furiously according to the slyly final accou +36838|1484|F|330348.13|1994-04-09|5-LOW|Clerk#000000179|0|equests haggle fluffily above the sometim +36839|1141|O|117384.16|1996-11-13|2-HIGH|Clerk#000000740|0|s detect. quickly pending theodolites sleep. furiously final foxe +36864|320|F|243040.12|1992-07-30|5-LOW|Clerk#000000134|0|ake closely along the +36865|565|O|110296.96|1997-08-29|4-NOT SPECIFIED|Clerk#000000117|0|e bold, even asymptotes. excuses wake slyly ironic platelets. fluffily ironi +36866|731|F|172151.54|1993-03-25|5-LOW|Clerk#000000855|0|uriously. furiously express theodolites cajole unusual, even +36867|760|F|266374.09|1994-09-06|2-HIGH|Clerk#000000221|0|s. furiously regular accounts cajole slyly fi +36868|722|O|35919.78|1997-06-13|1-URGENT|Clerk#000000846|0|ously final packages doubt blithely fina +36869|811|F|171305.07|1993-09-20|4-NOT SPECIFIED|Clerk#000000423|0|across the quickly regular dugouts cajole carefully +36870|410|O|137154.49|1996-07-28|1-URGENT|Clerk#000000131|0|requests wake busily. ironic packages nag furiously-- furiously express accoun +36871|1114|O|260572.24|1998-04-06|3-MEDIUM|Clerk#000000734|0|hin requests. express a +36896|614|F|243292.48|1994-11-04|1-URGENT|Clerk#000000699|0|s cajole fluffily brave theodolites. express requests sleep furi +36897|1085|O|194076.75|1995-12-13|3-MEDIUM|Clerk#000000209|0|, express ideas. even deposits sleep furiously furiously bold f +36898|862|F|162919.96|1992-07-07|2-HIGH|Clerk#000000269|0|s. final, ironic courts doubt ironic multipliers. quickl +36899|136|O|22390.72|1995-03-29|5-LOW|Clerk#000000834|0|ions around the accou +36900|1421|O|174132.04|1997-07-08|2-HIGH|Clerk#000000878|0| carefully forges. doggedly regular +36901|1252|F|110109.93|1992-09-14|1-URGENT|Clerk#000000409|0|nd the slyly regular packa +36902|832|O|188040.59|1997-10-03|1-URGENT|Clerk#000000522|0|ly. carefully ironic pinto beans alongside of t +36903|638|O|315754.48|1996-06-07|1-URGENT|Clerk#000000370|0|ally sly, unusual instructions. blithely bold instructions run slyly along +36928|1030|O|30817.56|1998-01-01|4-NOT SPECIFIED|Clerk#000000522|0|ial, ironic requests. deposits use. ironic, unusual requests slee +36929|502|F|51722.33|1992-05-26|5-LOW|Clerk#000000987|0|s. blithely express +36930|1391|O|259694.09|1995-09-29|3-MEDIUM|Clerk#000000993|0|gular, careful accounts. even accounts maintain slyly. slyly u +36931|1409|F|58357.33|1995-01-20|4-NOT SPECIFIED|Clerk#000000761|0|ans; platelets integrate quickly about the b +36932|61|F|225982.76|1994-07-08|5-LOW|Clerk#000000473|0|y even packages after the carefully unusual asympto +36933|146|O|150638.33|1995-07-13|2-HIGH|Clerk#000000324|0|oze foxes. ironic pint +36934|50|F|112603.29|1994-12-23|3-MEDIUM|Clerk#000000799|0|theodolites integrate fluffily s +36935|1193|O|16722.43|1995-11-06|5-LOW|Clerk#000000081|0|, regular deposits are fluffily around the +36960|680|F|16334.35|1995-03-09|4-NOT SPECIFIED|Clerk#000000868|0|sual pinto beans affix. quickly even accounts eat blithely +36961|833|O|241768.86|1996-09-14|4-NOT SPECIFIED|Clerk#000000465|0|ackages. final, final deposits are along the regular, r +36962|1018|F|47825.60|1993-12-02|3-MEDIUM|Clerk#000000090|0|. final, ironic pinto beans h +36963|442|O|156947.44|1997-03-15|3-MEDIUM|Clerk#000000728|0|lyly bold deposits. slyly bold p +36964|58|O|264204.91|1998-03-09|3-MEDIUM|Clerk#000000603|0|the slyly regular requests-- carefully even packages haggle carefully. +36965|479|F|85883.36|1994-05-20|5-LOW|Clerk#000000108|0|eposits wake slyly carefully even foxes. carefully pending requests haggle fu +36966|160|F|135007.08|1995-03-18|5-LOW|Clerk#000000432|0|express, final packages across the even deposits cajole carefully abov +36967|253|O|125568.39|1996-12-19|4-NOT SPECIFIED|Clerk#000000362|0|posits dazzle carefully regular pinto +36992|148|F|200782.67|1994-12-08|3-MEDIUM|Clerk#000000008|0|s. ironic packages are furiously. quickly even requ +36993|613|O|92827.44|1995-12-30|2-HIGH|Clerk#000000419|0|ular deposits use furiously fr +36994|1111|O|255317.63|1995-06-18|5-LOW|Clerk#000000143|0|unts nag bravely. ironic ideas are f +36995|977|F|80881.72|1993-12-19|4-NOT SPECIFIED|Clerk#000000521|0|ses haggle slyly above the accounts. slyly iro +36996|256|O|8970.71|1995-09-30|5-LOW|Clerk#000000189|0|foxes cajole? special requests detect slyly final, pending pa +36997|1094|F|111362.76|1993-12-06|4-NOT SPECIFIED|Clerk#000000958|0|cial theodolites. packages about the slyly bold accounts haggl +36998|823|F|138032.53|1992-09-30|5-LOW|Clerk#000000405|0|ep ironically. slyly fina +36999|865|F|205255.78|1994-12-13|3-MEDIUM|Clerk#000000225|0|st regular instructions. slyly final packages +37024|925|F|165442.51|1992-07-11|5-LOW|Clerk#000000090|0|ously blithely fluffy deposits. quietly unusual foxes could sl +37025|1387|F|315907.45|1994-11-11|2-HIGH|Clerk#000000357|0|riously final pinto beans: slyly express packages along the furiously +37026|1333|O|160833.14|1997-03-28|1-URGENT|Clerk#000000182|0|etimes during the carefully final foxes. fin +37027|1216|O|190616.18|1998-02-27|3-MEDIUM|Clerk#000000851|0|es; even Tiresias alongside of the furiously id +37028|367|O|38834.05|1998-05-09|1-URGENT|Clerk#000000579|0| final, even foxes. instructions use blithely after the blith +37029|757|O|152877.51|1997-09-17|3-MEDIUM|Clerk#000000439|0|s sleep regular pinto beans. special packages cajole carefully furiously +37030|286|O|2767.39|1995-08-25|1-URGENT|Clerk#000000690|0| accounts. even requests above the blithely regular +37031|916|O|51847.59|1995-08-09|1-URGENT|Clerk#000000652|0|s. furiously ironic escapa +37056|1444|F|108583.83|1993-07-26|3-MEDIUM|Clerk#000000415|0|ons cajole furiously in place of the special requests. even +37057|1135|O|242675.78|1998-01-21|5-LOW|Clerk#000000095|0|egular packages are furiously express accounts. furiousl +37058|613|O|129779.52|1996-02-03|3-MEDIUM|Clerk#000000503|0|haggle slyly among the f +37059|623|O|139691.75|1997-12-15|3-MEDIUM|Clerk#000000471|0| quietly pending pinto beans across the even platelets are +37060|596|O|262697.43|1996-03-16|3-MEDIUM|Clerk#000000767|0|ely permanent deposits. regular accounts boost slyly furiously unusual ho +37061|193|O|280437.54|1996-06-18|5-LOW|Clerk#000000962|0|o beans was furiously iron +37062|797|F|92895.26|1993-11-07|1-URGENT|Clerk#000000071|0|counts. blithely bold ideas use carefully. regular inst +37063|1444|F|72360.53|1992-12-10|4-NOT SPECIFIED|Clerk#000000621|0|bold accounts. express, final dugo +37088|43|O|127521.35|1997-09-05|5-LOW|Clerk#000000406|0|thely. excuses print. quickly iro +37089|302|O|69278.70|1997-05-02|5-LOW|Clerk#000000268|0|le furiously packages. final, regular tithes cajole blithely across the entici +37090|154|O|42654.90|1998-03-18|5-LOW|Clerk#000000294|0| cajole closely furiously silent courts. bold accounts sleep s +37091|751|F|127938.21|1993-11-27|2-HIGH|Clerk#000000839|0|boost furiously bold requests. slyly slow foxes w +37092|469|O|204127.78|1996-07-31|2-HIGH|Clerk#000000256|0| express deposits. carefully darin +37093|544|F|92896.05|1993-12-04|5-LOW|Clerk#000000274|0|s sleep special requests. carefully pending inst +37094|748|O|78939.18|1997-02-16|1-URGENT|Clerk#000000484|0|ckages cajole slyly alon +37095|427|F|306636.73|1994-03-11|5-LOW|Clerk#000000471|0| quickly; fluffily bold pi +37120|1103|O|171311.42|1996-06-18|4-NOT SPECIFIED|Clerk#000000576|0|quests. quick accounts detect. blithely special accounts haggle carefully +37121|1079|O|17159.54|1995-03-16|4-NOT SPECIFIED|Clerk#000000416|0|inal ideas. silent instructions wake carefully: blithely silent deposits sho +37122|506|O|25002.16|1996-06-21|4-NOT SPECIFIED|Clerk#000000973|0|ly. regular deposits inte +37123|32|F|131888.02|1992-02-19|2-HIGH|Clerk#000000090|0|xpress deposits boost above the ironic, unusual ac +37124|1246|F|121266.29|1992-03-31|5-LOW|Clerk#000000399|0|unts according to the blithely even platelets wake above the blithely +37125|694|F|113114.07|1993-01-15|2-HIGH|Clerk#000000057|0| haggle carefully furiously regular theodolites. carefully even ideas after th +37126|97|O|172852.27|1998-07-01|4-NOT SPECIFIED|Clerk#000000225|0|ove the unusual, ironic deposits. quickly special packages boost +37127|1276|F|279013.32|1993-10-03|2-HIGH|Clerk#000000918|0|uickly evenly ironic accounts +37152|1433|P|138227.51|1995-05-23|3-MEDIUM|Clerk#000000977|0|ke stealthily slyly regular accounts. pending ideas sleep furiously a +37153|572|O|198670.81|1996-07-15|3-MEDIUM|Clerk#000000801|0|oss the slyly express excuses. blithely ironic asymptotes haggle fluffily pe +37154|1165|O|24018.93|1996-05-01|3-MEDIUM|Clerk#000000817|0|ular pains. carefully ruthless pinto beans sleep fluffily even packages. s +37155|1072|O|59785.99|1997-03-21|1-URGENT|Clerk#000000837|0|ely unusual deposits run carefully slyly +37156|844|F|30799.49|1992-09-18|5-LOW|Clerk#000000533|0|riously special accounts are carefully. slyly even +37157|379|F|151738.12|1993-02-21|2-HIGH|Clerk#000000552|0|y fluffy accounts along the forges are blithe +37158|343|F|240870.41|1992-09-23|5-LOW|Clerk#000000494|0|r packages are furious +37159|523|F|282579.28|1993-04-30|2-HIGH|Clerk#000000917|0|t slyly ideas? even accounts sleep fluffily furiousl +37184|598|P|32973.38|1995-03-12|2-HIGH|Clerk#000000628|0|ironic requests sleep furiously permanently even packages +37185|923|F|254728.87|1992-11-01|2-HIGH|Clerk#000000134|0|lar theodolites. foxes sh +37186|442|O|134316.87|1996-05-12|3-MEDIUM|Clerk#000000621|0|egrate quickly blithely regular pinto beans. unusual ideas boost flu +37187|691|O|47620.02|1995-07-11|1-URGENT|Clerk#000000140|0|haggle alongside of the bold requests. deposits use bold, ironic +37188|1396|F|136330.92|1992-03-05|1-URGENT|Clerk#000000619|0|express packages. carefully final pinto be +37189|815|F|90885.41|1992-06-13|2-HIGH|Clerk#000000654|0|ests sleep blithely bl +37190|142|O|175751.60|1996-06-26|3-MEDIUM|Clerk#000000481|0|quests. accounts sleep slyly. carefully regular pl +37191|478|F|134281.86|1993-03-13|2-HIGH|Clerk#000000205|0|ts. carefully even requests abov +37216|787|F|395495.85|1993-12-01|2-HIGH|Clerk#000000498|0|tes boost blithely. platelets promise even foxes. carefull +37217|1030|O|45608.13|1997-09-06|1-URGENT|Clerk#000000784|0|as. stealthily pending fr +37218|553|F|109159.64|1993-12-20|2-HIGH|Clerk#000000675|0|t dinos alongside of the final, special foxes integ +37219|1225|O|283925.32|1996-04-18|2-HIGH|Clerk#000000330|0|its boost ironically. furiously express notornis are ironic, unus +37220|1180|O|222579.79|1996-12-03|5-LOW|Clerk#000000537|0|instructions hinder blithely across the carefully regu +37221|664|O|4814.53|1997-11-02|2-HIGH|Clerk#000000954|0| the ironic, busy platelets. ca +37222|497|O|184791.47|1996-04-22|3-MEDIUM|Clerk#000000808|0|ts poach carefully. special deposits sleep carefully quickly pendin +37223|403|O|163979.63|1995-11-11|5-LOW|Clerk#000000802|0|ys use around the quickly special dolphins. quickly ironic deposits until +37248|538|O|49891.87|1996-02-22|1-URGENT|Clerk#000000146|0|ending pinto beans. f +37249|587|O|84450.21|1996-02-07|4-NOT SPECIFIED|Clerk#000000007|0|es. quickly daring packages boost furiously sly +37250|1132|F|75836.61|1993-01-15|2-HIGH|Clerk#000000445|0|lithely instructions. carefully regular ideas haggle furiou +37251|994|O|62843.57|1996-11-15|4-NOT SPECIFIED|Clerk#000000235|0|pending pinto beans alongside of the slyly reg +37252|1109|O|194646.76|1995-11-20|5-LOW|Clerk#000000285|0|lyly. idle, bold platelets cajole alongside of the +37253|98|F|330902.74|1992-09-02|2-HIGH|Clerk#000000949|0|blithely pending accounts affix blithely +37254|284|F|25263.39|1994-09-19|2-HIGH|Clerk#000000842|0|. carefully even theodolites cajole carefully; blithely regular platelets +37255|1360|F|79023.70|1994-11-06|5-LOW|Clerk#000000368|0|s. silent dolphins x-ray furiously alongside +37280|1372|O|48533.66|1997-08-20|3-MEDIUM|Clerk#000000076|0|iously pending platelets. bold pinto beans i +37281|136|F|100914.33|1994-08-29|3-MEDIUM|Clerk#000000462|0|at the quickly pending deposits. slyly regular req +37282|770|F|178644.43|1994-08-06|1-URGENT|Clerk#000000843|0|ans haggle across the blithely final foxes. pinto +37283|613|O|209594.61|1996-10-12|2-HIGH|Clerk#000000082|0|. regular instructi +37284|235|P|44809.43|1995-03-14|3-MEDIUM|Clerk#000000333|0|y packages. dependencies haggle. fluffily unusual excuses alongside of the fin +37285|382|O|106481.20|1996-04-12|3-MEDIUM|Clerk#000000527|0|s. final, ironic instructions across the fluffil +37286|61|O|106065.68|1996-06-27|2-HIGH|Clerk#000000422|0|instructions after the blithely even ideas haggle blithely carefully regul +37287|1456|F|171821.94|1992-11-02|5-LOW|Clerk#000000684|0| players alongside of the pending in +37312|571|O|12359.13|1998-02-05|5-LOW|Clerk#000000495|0|usual, unusual deposits detect furiously ent +37313|1438|F|141172.47|1992-07-03|4-NOT SPECIFIED|Clerk#000000689|0| requests eat blithely special deposits. ironic r +37314|355|P|193710.82|1995-05-05|3-MEDIUM|Clerk#000000834|0|structions are blithely re +37315|251|F|44320.73|1992-06-06|5-LOW|Clerk#000000087|0|to beans cajole furi +37316|301|O|96020.95|1995-09-05|5-LOW|Clerk#000000568|0|ites x-ray above the notornis. blithel +37317|904|F|23277.32|1993-03-09|2-HIGH|Clerk#000000853|0|asymptotes integrate slyly. blithely regular theodolites agai +37318|1445|F|251628.02|1993-04-16|3-MEDIUM|Clerk#000000794|0|al theodolites after the quickly final packages haggle speci +37319|25|F|197757.40|1994-08-05|1-URGENT|Clerk#000000758|0| affix slyly ironic ideas. quickly +37344|670|O|222749.70|1996-03-11|4-NOT SPECIFIED|Clerk#000000582|0|luffily silent accou +37345|370|O|71674.47|1998-05-24|4-NOT SPECIFIED|Clerk#000000061|0|und the slyly ironic pearls. sly +37346|551|F|31630.97|1994-02-07|5-LOW|Clerk#000000541|0|e slyly across the fluffily pending accounts. bold accounts hinder +37347|374|F|203196.74|1992-01-30|2-HIGH|Clerk#000000701|0|s haggle. furiously +37348|868|F|262724.27|1994-06-14|2-HIGH|Clerk#000000576|0|nstructions. pending, silent ideas wake regular asymptotes. car +37349|361|F|217176.35|1993-02-16|1-URGENT|Clerk#000000906|0|es are. slyly regular ideas cajole slyly f +37350|328|F|37977.69|1992-05-21|1-URGENT|Clerk#000000102|0|ng to the furiously even platel +37351|52|F|9493.31|1992-09-13|4-NOT SPECIFIED|Clerk#000000603|0|y ironic foxes play furiously dogged +37376|739|F|142626.99|1994-01-30|4-NOT SPECIFIED|Clerk#000000215|0|ecial deposits. regular +37377|1267|F|207110.89|1992-01-21|3-MEDIUM|Clerk#000000476|0|usly regular packages haggle blithely around the unusual +37378|94|O|178972.85|1997-12-20|3-MEDIUM|Clerk#000000063|0|heodolites sleep furiously depen +37379|922|O|189413.49|1996-06-28|4-NOT SPECIFIED|Clerk#000000538|0|as wake. regular asymptotes use slyly about the quickly silen +37380|580|P|208791.45|1995-04-02|1-URGENT|Clerk#000000831|0|ent courts serve blithely +37381|1186|O|144927.42|1997-01-09|2-HIGH|Clerk#000000527|0|riously ironic packages nag carefully across the final, express packages. car +37382|778|F|94420.62|1994-12-08|4-NOT SPECIFIED|Clerk#000000163|0|uriously brave requests are agains +37383|1400|O|190025.79|1995-06-15|3-MEDIUM|Clerk#000000225|0|refully thinly final +37408|1105|O|162942.89|1998-03-03|2-HIGH|Clerk#000000882|0|ckly regular deposits. furiously ir +37409|893|O|323172.22|1998-04-29|3-MEDIUM|Clerk#000000681|0| the carefully bold packages sleep slyly regular accounts. careful +37410|728|F|184451.89|1993-10-13|3-MEDIUM|Clerk#000000810|0| haggle above the slyly final dependencies. furi +37411|1303|O|135378.14|1996-12-25|4-NOT SPECIFIED|Clerk#000000410|0|oach furiously above the carefully regular ideas. furiously final package +37412|872|F|137285.94|1992-08-04|2-HIGH|Clerk#000000893|0| deposits. final accounts along the unusual pinto beans wake re +37413|805|O|30947.11|1997-07-09|3-MEDIUM|Clerk#000000711|0|l accounts cajole slyly about the carefully express platelets. final +37414|349|O|72958.80|1995-09-10|5-LOW|Clerk#000000015|0|eodolites. silent packages detect. carefu +37415|301|O|986.63|1995-12-05|4-NOT SPECIFIED|Clerk#000000160|0|blithely ironic platelets. quickly i +37440|404|F|90655.24|1993-06-24|4-NOT SPECIFIED|Clerk#000000246|0|refully regular deposits are. furiou +37441|1045|F|257190.17|1994-02-25|1-URGENT|Clerk#000000686|0|refully pending deposits. quickly e +37442|1432|O|14121.10|1997-09-13|3-MEDIUM|Clerk#000000058|0|telets cajole. special asymptotes use care +37443|604|F|119393.68|1993-04-16|4-NOT SPECIFIED|Clerk#000000076|0|symptotes. special packag +37444|850|F|85396.30|1992-02-07|3-MEDIUM|Clerk#000000186|0|inal deposits are fluffily s +37445|472|F|153075.34|1992-02-19|2-HIGH|Clerk#000000396|0|le. slyly regular foxe +37446|1090|F|63137.05|1993-12-19|3-MEDIUM|Clerk#000000523|0|wake furiously carefully regular packages. carefully ironic r +37447|754|F|262496.07|1994-07-09|5-LOW|Clerk#000000990|0|uriously ironic deposits use carefully final, regular foxes! slyl +37472|277|O|251101.12|1997-02-03|3-MEDIUM|Clerk#000000832|0|counts haggle final requests. regular ideas +37473|1063|F|273237.64|1994-10-02|5-LOW|Clerk#000000852|0|ely regular excuses h +37474|527|F|25970.11|1994-05-26|2-HIGH|Clerk#000000930|0|ter the dependencies. furiously express instructions wake slyly ex +37475|1117|O|59530.11|1995-03-25|4-NOT SPECIFIED|Clerk#000000207|0|xcuses sleep fluffily about the +37476|115|O|166794.13|1996-06-07|1-URGENT|Clerk#000000084|0|ic courts play furiously ca +37477|328|O|33819.69|1997-04-19|3-MEDIUM|Clerk#000000833|0|ong the accounts. ironic requests snooze slyly +37478|1022|F|12739.23|1993-05-02|3-MEDIUM|Clerk#000000704|0|gular deposits sleep blithely. final deposits sleep blithely unusua +37479|895|O|169313.75|1998-04-16|1-URGENT|Clerk#000000875|0|pending deposits. regular foxes against the carefully special pinto beans +37504|1291|O|165509.83|1996-03-04|5-LOW|Clerk#000000871|0|c theodolites alongside of the fluffily bold requests haggle quickly against +37505|1297|P|206579.20|1995-06-04|5-LOW|Clerk#000000852|0|usly. express, bold dolphins sleep slyly +37506|145|O|187994.23|1997-04-12|1-URGENT|Clerk#000000891|0| the furiously even tithes. furiously silent deposits cajole carefully s +37507|613|F|122016.97|1994-12-09|1-URGENT|Clerk#000000363|0|usual instructions. permanently +37508|1051|O|173280.00|1997-09-03|4-NOT SPECIFIED|Clerk#000000973|0|s the regular pinto beans. asymptotes haggle fluffily: unusual i +37509|910|O|52984.71|1997-08-31|1-URGENT|Clerk#000000655|0|t carefully ironic deposits. ironic requests nod. even deposits +37510|166|F|173973.04|1994-03-09|1-URGENT|Clerk#000000849|0|blithely about the regular, express packages. fl +37511|572|O|119994.88|1995-11-08|4-NOT SPECIFIED|Clerk#000000253|0|dencies boost slyly. blithe, bold instructions after +37536|473|F|280463.76|1994-09-06|1-URGENT|Clerk#000000420|0| dolphins solve blithely behind the quickly unusual theodolit +37537|1015|F|156458.25|1994-01-03|5-LOW|Clerk#000000228|0|wake packages: regular excuses boost. slyly pending +37538|259|O|137139.66|1997-06-20|4-NOT SPECIFIED|Clerk#000000283|0|accounts. special asymptotes across the blithely reg +37539|1445|O|133518.13|1997-02-04|1-URGENT|Clerk#000000997|0| across the carefully pending requests affix furiously carefully special depo +37540|1171|O|139934.90|1997-05-07|4-NOT SPECIFIED|Clerk#000000863|0|rding to the blithely +37541|677|F|133203.40|1993-02-27|3-MEDIUM|Clerk#000000180|0| ironic theodolites; requests wa +37542|109|F|335774.52|1994-07-21|3-MEDIUM|Clerk#000000703|0|fully unusual dependencies. express requests +37543|1243|F|168013.86|1992-01-01|3-MEDIUM|Clerk#000000054|0|d deposits. carefully regu +37568|655|O|15965.30|1996-08-08|4-NOT SPECIFIED|Clerk#000000044|0|e slyly finally regular ideas. regular deposits +37569|1126|F|137428.62|1994-06-10|3-MEDIUM|Clerk#000000709|0|re blithely according to the silent packages. ironic +37570|689|F|95443.01|1995-03-10|4-NOT SPECIFIED|Clerk#000000139|0|e fluffily pending accounts. even, unusual deposits hang slyly acc +37571|514|O|186136.31|1998-06-18|1-URGENT|Clerk#000000411|0|ly special deposits. furiously pending foxes boo +37572|88|F|176950.09|1993-08-04|2-HIGH|Clerk#000000139|0|careful, regular packages lo +37573|838|O|268163.63|1996-06-02|5-LOW|Clerk#000000075|0|ully bold requests above the stealthily ironic accounts ou +37574|565|F|52809.19|1994-06-14|5-LOW|Clerk#000000155|0|en ideas. ironic, unusual instructions are bli +37575|767|O|284980.30|1997-05-25|4-NOT SPECIFIED|Clerk#000000611|0| wake blithely carefully pending ideas: blithely special gif +37600|701|F|16165.58|1993-02-14|3-MEDIUM|Clerk#000000265|0|ts hinder blithely. furiously silent excuses use qu +37601|1055|F|38249.02|1992-07-23|4-NOT SPECIFIED|Clerk#000000615|0|y according to the ironic, unusu +37602|871|O|322769.14|1998-07-20|3-MEDIUM|Clerk#000000895|0| are fluffily across the fu +37603|146|F|228875.22|1993-11-25|3-MEDIUM|Clerk#000000535|0|counts. blithely regular requests solve after the quickly spe +37604|590|O|132162.77|1997-06-06|1-URGENT|Clerk#000000348|0| accounts haggle furiously. blithely ironic requests nag-- careful +37605|1160|F|169666.45|1992-03-14|1-URGENT|Clerk#000000863|0| even instructions. i +37606|722|F|234173.79|1993-02-23|1-URGENT|Clerk#000000036|0|egular, special depths. furiously even dep +37607|1366|O|273729.79|1997-08-16|5-LOW|Clerk#000000828|0| about the quiet accounts nag final, pending accoun +37632|826|O|180865.37|1995-12-11|2-HIGH|Clerk#000000766|0|furiously daring excuses detect. q +37633|373|O|52984.06|1996-11-02|1-URGENT|Clerk#000000156|0|ggle furiously. regular requests wake sometimes. final foxes boost quickly +37634|7|F|129328.66|1992-05-22|3-MEDIUM|Clerk#000000747|0|s. requests cajole blithely regular t +37635|1249|O|55108.09|1997-02-24|4-NOT SPECIFIED|Clerk#000000652|0|ound the furiously final requests-- slyly +37636|979|O|140237.42|1996-07-28|3-MEDIUM|Clerk#000000564|0|final instructions. sl +37637|1417|F|169364.64|1994-03-16|2-HIGH|Clerk#000000308|0|uthlessly. carefully ironic foxes +37638|1118|F|117301.59|1994-01-22|5-LOW|Clerk#000000379|0|r the special, regular dugouts. deposit +37639|1090|O|122894.40|1996-02-02|4-NOT SPECIFIED|Clerk#000000599|0|heodolites about the furiously regular accounts wake care +37664|481|F|224659.36|1994-10-11|5-LOW|Clerk#000000068|0|le requests. carefully unusua +37665|1102|O|109912.74|1996-11-14|4-NOT SPECIFIED|Clerk#000000398|0|t deposits: final i +37666|746|O|197714.37|1997-05-31|3-MEDIUM|Clerk#000000592|0|ending pinto beans haggle carefully even asymptotes. e +37667|763|O|154217.98|1995-12-03|2-HIGH|Clerk#000000652|0|ackages: carefully ironic foxes +37668|55|F|152077.50|1993-01-09|5-LOW|Clerk#000000488|0|deposits wake furiously-- platelets above the qui +37669|932|F|249030.10|1993-10-30|4-NOT SPECIFIED|Clerk#000000938|0|ss the fluffily regular accounts sleep quickly alongside of the slyly stea +37670|362|O|15144.45|1996-01-20|3-MEDIUM|Clerk#000000375|0|onic foxes. slyly special foxes cajole carefully along the furiously fi +37671|1462|F|20281.41|1993-07-03|5-LOW|Clerk#000000153|0| even dependencies are about the slyly final ideas: carefu +37696|568|F|73098.58|1994-07-10|4-NOT SPECIFIED|Clerk#000000127|0|, ironic foxes to t +37697|1253|F|11595.31|1992-11-25|3-MEDIUM|Clerk#000000281|0| excuses use furiously blithely regular requests. blithely +37698|62|O|56749.86|1996-10-25|1-URGENT|Clerk#000000103|0|! bold packages haggle sometimes after the carefully express requests. final +37699|694|O|116898.34|1995-08-23|5-LOW|Clerk#000000337|0|s sleep furiously. ironi +37700|1495|F|71177.69|1994-12-09|1-URGENT|Clerk#000000711|0|around the carefully regular requests mold carefully about the b +37701|1024|O|152791.02|1997-03-28|5-LOW|Clerk#000000176|0|ckages nag furiously. furiou +37702|983|O|6440.33|1995-06-11|4-NOT SPECIFIED|Clerk#000000453|0|e slyly. express pinto beans maintain. bold pinto beans int +37703|560|O|225454.65|1995-12-17|2-HIGH|Clerk#000000462|0|ly carefully express requests. carefully even ideas haggle carefu +37728|758|O|272225.09|1998-07-31|5-LOW|Clerk#000000459|0|romise blithely around the pending accounts. boldly unusual d +37729|685|F|128045.16|1994-01-16|4-NOT SPECIFIED|Clerk#000000030|0|furiously furiously s +37730|1489|F|222902.92|1994-05-03|4-NOT SPECIFIED|Clerk#000000303|0|ges cajole slyly around the pending deposits. car +37731|85|F|192279.34|1994-11-05|1-URGENT|Clerk#000000506|0|e fluffily even ideas nag ideas. slyly fina +37732|410|O|32534.66|1996-05-05|4-NOT SPECIFIED|Clerk#000000558|0|al ideas sleep regu +37733|1367|F|126622.25|1992-05-25|5-LOW|Clerk#000000081|0|grate blithely pending +37734|943|F|258189.29|1994-12-27|1-URGENT|Clerk#000000900|0|, regular deposits wake. slyly pending theodolites sleep. +37735|865|O|45255.77|1998-08-01|3-MEDIUM|Clerk#000000919|0|ideas wake. final deposits nag. furiously final packages slee +37760|1366|F|180769.93|1994-08-15|2-HIGH|Clerk#000000275|0|. quickly regular deposits are even platelets. carefully special pac +37761|715|O|150215.79|1998-06-28|4-NOT SPECIFIED|Clerk#000000466|0|iously bold accounts affix carefully alongside of the carefully unusual idea +37762|740|F|75528.77|1992-06-07|3-MEDIUM|Clerk#000000821|0|cingly final instructions above +37763|1460|F|118442.86|1992-02-09|4-NOT SPECIFIED|Clerk#000000782|0|press instructions belie +37764|101|O|196915.82|1996-10-15|5-LOW|Clerk#000000765|0| blithely. bold, unusual +37765|446|F|300044.24|1992-11-25|5-LOW|Clerk#000000988|0|refully boldly final asymptotes. iron +37766|761|O|235226.50|1997-04-23|4-NOT SPECIFIED|Clerk#000000827|0|ins affix carefully. unusual, regular frays nag silent platelet +37767|1136|O|118525.94|1996-09-08|3-MEDIUM|Clerk#000000042|0|ully bold foxes. blithely ironic dolphins are slyl +37792|1103|O|62041.88|1995-12-30|2-HIGH|Clerk#000000114|0|e carefully express deposits. even ideas +37793|1159|F|72182.31|1994-11-09|4-NOT SPECIFIED|Clerk#000000963|0|nst the regular foxes! regular dol +37794|233|F|161679.73|1994-03-25|5-LOW|Clerk#000000237|0|sts wake express ideas! pinto beans detect furiously. ironic, fi +37795|94|F|16397.85|1993-10-28|3-MEDIUM|Clerk#000000702|0|t depths. unusual, unusual asymptotes unwind furiously +37796|904|F|77807.61|1994-11-02|1-URGENT|Clerk#000000043|0|lve boldly ironic, express requests. regular, +37797|1240|F|137153.25|1992-02-23|3-MEDIUM|Clerk#000000580|0|l grouches cajole carefully carefully f +37798|1069|F|107801.58|1992-11-05|2-HIGH|Clerk#000000575|0|into beans. quickly unusua +37799|559|F|97932.14|1993-10-31|4-NOT SPECIFIED|Clerk#000000856|0|ully final sentiments integrate. carefully final foxes use slyly. fur +37824|97|O|62315.31|1998-02-22|3-MEDIUM|Clerk#000000680|0|es cajole ironic packages. blithely expre +37825|146|F|223070.99|1994-07-23|5-LOW|Clerk#000000783|0|s detect around the quickly even accounts. slyly final excuses nag. b +37826|730|P|163583.00|1995-04-24|3-MEDIUM|Clerk#000000480|0| blithely finally even packages. packages integrate +37827|554|O|185015.31|1996-08-01|4-NOT SPECIFIED|Clerk#000000824|0|requests sleep along t +37828|412|P|186467.94|1995-04-21|5-LOW|Clerk#000000755|0| furiously regular, bold ideas; expre +37829|1021|F|214600.53|1993-09-30|4-NOT SPECIFIED|Clerk#000000776|0|. carefully furious requests haggle blithely about the fluffy deposits. idea +37830|878|F|127840.23|1994-08-17|4-NOT SPECIFIED|Clerk#000000006|0|oubt slyly bold accounts. unusual sauternes use slyly special ideas. slyly +37831|725|F|339138.11|1992-07-27|4-NOT SPECIFIED|Clerk#000000084|0|hely final pinto bean +37856|1144|O|23107.80|1998-01-20|4-NOT SPECIFIED|Clerk#000000413|0|requests-- packages maintain furiously quickly regular theodolites. d +37857|148|O|238100.86|1997-05-01|3-MEDIUM|Clerk#000000631|0| carefully regular excuses detect special dolphins. excuses cajole. reg +37858|278|F|24187.47|1993-06-25|5-LOW|Clerk#000000902|0|ross the blithely final deposits. carefully bold deposits abo +37859|925|F|208258.95|1994-03-31|1-URGENT|Clerk#000000378|0|jole bold pinto beans. doggedly pending platelets detect instruction +37860|479|F|170422.16|1993-08-28|3-MEDIUM|Clerk#000000418|0|haggle quickly. regular theodolites haggle furiously blithely slow acco +37861|1331|O|110593.62|1995-12-29|4-NOT SPECIFIED|Clerk#000000160|0|s cajole furiously. blithely bold asympto +37862|1349|F|243991.35|1994-01-13|4-NOT SPECIFIED|Clerk#000000188|0|fully even platelet +37863|364|P|98466.62|1995-02-25|2-HIGH|Clerk#000000227|0|ly even theodolites wake carefully alongside of the slyly special deposits. f +37888|173|F|87817.85|1994-12-23|1-URGENT|Clerk#000000072|0|kly regular requests. daringly express deposits are. carefully +37889|547|O|77931.55|1996-07-12|3-MEDIUM|Clerk#000000626|0|ccounts boost thinly. idly specia +37890|283|O|165619.05|1996-07-07|2-HIGH|Clerk#000000541|0| requests thrash carefully carefully silent accounts. q +37891|514|O|304580.89|1995-10-21|2-HIGH|Clerk#000000299|0| ironic, regular platelets wak +37892|1126|F|31027.64|1992-01-26|1-URGENT|Clerk#000000272|0|yly bold instructions wake carefully furiously ironic packages? final, ironic +37893|928|O|88832.54|1995-11-25|4-NOT SPECIFIED|Clerk#000000772|0|ss asymptotes are instructions. slyly slow foxes wake above the ironic +37894|514|O|38774.65|1995-11-27|4-NOT SPECIFIED|Clerk#000000489|0|l, special deposits. idly even re +37895|170|F|81449.89|1992-03-31|1-URGENT|Clerk#000000159|0|refully. quickly express accounts haggle carefull +37920|455|F|36741.37|1993-07-15|1-URGENT|Clerk#000000623|0|out the gifts believe inside the care +37921|1366|F|11119.09|1995-05-16|4-NOT SPECIFIED|Clerk#000000051|0|ckly pending deposits after +37922|1228|O|133357.07|1998-03-24|2-HIGH|Clerk#000000891|0|ithely regular accounts at the final, special theodolites boost blithely furio +37923|943|F|187809.89|1993-03-28|4-NOT SPECIFIED|Clerk#000000227|0|posits are quickly. accounts use fluffy dolphin +37924|898|F|172101.31|1994-11-30|2-HIGH|Clerk#000000720|0|ckly special sheaves. quickly unusual theodolites around the ironic +37925|58|F|207624.70|1993-09-27|3-MEDIUM|Clerk#000000104|0|s about the quickly even packages cajole slyly packages. b +37926|1391|F|36554.68|1994-09-09|1-URGENT|Clerk#000000274|0|. thin asymptotes impress carefully. blithely ironic requests wake careful +37927|857|F|257840.10|1995-01-26|4-NOT SPECIFIED|Clerk#000000502|0|y special, express ideas. depend +37952|229|O|187202.44|1996-07-04|5-LOW|Clerk#000000478|0|cial pinto beans. ironic, regular theodolites detect furiously against +37953|358|O|147885.53|1997-03-18|2-HIGH|Clerk#000000872|0|eodolites wake slyly about the furiously even deposits. blithely fi +37954|823|O|262198.06|1997-10-06|2-HIGH|Clerk#000000334|0|equests-- final theodoli +37955|436|O|157730.49|1997-03-15|4-NOT SPECIFIED|Clerk#000000697|0|riously. foxes nag carefully. slyly final dependencies cajole +37956|1219|O|23374.78|1997-07-25|5-LOW|Clerk#000000461|0| sleep blithely up the even, regular theodolites. blithely special req +37957|559|F|208027.68|1993-11-06|4-NOT SPECIFIED|Clerk#000000989|0|cial instructions. ironic asymptotes detect blithely above the sly pinto +37958|1024|O|164310.67|1997-11-10|1-URGENT|Clerk#000000324|0|ans. blithely regular foxes across the pending ide +37959|1012|F|147247.56|1993-10-17|5-LOW|Clerk#000000516|0|eep blithely. regular instructions b +37984|374|F|39255.23|1993-04-17|3-MEDIUM|Clerk#000000009|0|arefully doggedly regular +37985|1214|O|116597.08|1996-11-27|5-LOW|Clerk#000000644|0|slyly careful frets above the slyly regular instructions use caref +37986|638|F|120793.27|1992-02-27|1-URGENT|Clerk#000000857|0|ccounts. slyly final requests cajole even +37987|293|F|97363.17|1994-07-04|2-HIGH|Clerk#000000867|0|enly unusual instructions cajole daringly final accounts. final re +37988|1438|F|46755.16|1995-04-06|4-NOT SPECIFIED|Clerk#000000842|0|cross the fluffily regular courts. c +37989|758|O|21327.25|1996-11-14|4-NOT SPECIFIED|Clerk#000000344|0|he furiously regular packages boost ruthless escapades. ironic, stealthy p +37990|433|F|261813.62|1993-04-17|5-LOW|Clerk#000000001|0|blithely regular pinto beans wake carefully ironic requests. blithely +37991|346|F|56396.92|1995-02-22|4-NOT SPECIFIED|Clerk#000000460|0|ly even instructions. regular realms haggle across the accou +38016|1175|O|249955.29|1997-08-26|1-URGENT|Clerk#000000177|0|egular asymptotes use according to the quickly unusual theo +38017|556|F|238690.05|1993-07-21|5-LOW|Clerk#000000090|0| beans wake against the quickly regular instructions. theodolites +38018|1234|F|141204.00|1994-07-04|5-LOW|Clerk#000000684|0|iously final ideas. furiously ironic theodolites around the carefully +38019|1369|O|195789.84|1998-06-24|4-NOT SPECIFIED|Clerk#000000898|0| the ironic ideas; pend +38020|1123|O|7174.26|1998-04-10|3-MEDIUM|Clerk#000000165|0|ously final hockey play +38021|107|F|120012.85|1994-01-22|3-MEDIUM|Clerk#000000672|0|al deposits; carefully silent deposits run slyly about the carefully unusua +38022|59|O|220864.56|1998-03-03|4-NOT SPECIFIED|Clerk#000000650|0| regular requests haggle ruthlessly even packages. idle, unusual ide +38023|25|O|236211.21|1996-08-04|1-URGENT|Clerk#000000589|0|he furiously regular excuses sleep blithely ironic theodolite +38048|589|F|61360.06|1993-01-25|2-HIGH|Clerk#000000080|0|y final packages cajole quickly furio +38049|1411|F|5565.83|1992-06-14|4-NOT SPECIFIED|Clerk#000000639|0|inal packages among the regular dependencies sleep by the quickly +38050|760|F|154921.40|1993-10-27|4-NOT SPECIFIED|Clerk#000000880|0| use furiously across the foxes. even theodolites haggle carefully. +38051|1172|O|169612.00|1997-04-01|4-NOT SPECIFIED|Clerk#000000426|0|e bold, final requests hang blithely a +38052|602|F|31848.24|1992-02-16|5-LOW|Clerk#000000554|0|regular packages. platelets a +38053|1031|O|30039.45|1997-05-25|4-NOT SPECIFIED|Clerk#000000818|0| unusual accounts are furiousl +38054|1000|F|3829.39|1995-04-09|2-HIGH|Clerk#000000888|0|thely. regular pinto beans sle +38055|40|F|77500.51|1994-09-11|4-NOT SPECIFIED|Clerk#000000347|0|ly. fluffily ironic requests boost. furiously express ideas sleep +38080|236|F|185749.66|1994-09-15|4-NOT SPECIFIED|Clerk#000000388|0|equests wake according to the carefully unusual theodolites. stealthily iro +38081|1271|O|115883.11|1997-04-02|1-URGENT|Clerk#000000132|0|ing to the slyly regular +38082|697|O|207897.96|1997-07-21|4-NOT SPECIFIED|Clerk#000000579|0|sits sleep fluffily above the carefully final foxes. furiously expr +38083|736|O|89402.24|1998-05-04|1-URGENT|Clerk#000000063|0|ag blithely. dolphins haggle. furiously pen +38084|803|F|89404.73|1994-03-21|4-NOT SPECIFIED|Clerk#000000441|0|c deposits. carefully express excuses haggle +38085|284|O|62213.11|1997-05-22|4-NOT SPECIFIED|Clerk#000000025|0|y final requests cajole. blithely dar +38086|959|F|102377.03|1992-02-26|5-LOW|Clerk#000000532|0|ffily ironic deposits cajole silently-- blithely bold deposit +38087|376|F|173796.26|1994-02-22|1-URGENT|Clerk#000000818|0|iously final requests. r +38112|607|O|297900.72|1998-01-29|1-URGENT|Clerk#000000977|0|ly final accounts wak +38113|412|O|250320.83|1997-12-29|5-LOW|Clerk#000000226|0| alongside of the fluffily pending deposits sn +38114|464|O|47256.61|1997-07-13|5-LOW|Clerk#000000422|0|heodolites according to the blithely ironic reque +38115|1396|O|203347.86|1997-11-20|1-URGENT|Clerk#000000245|0|en theodolites are slyly. quietly even requests sleep slyly +38116|1180|O|162810.94|1995-12-11|1-URGENT|Clerk#000000493|0|s boost above the ironic, unusual accounts. regula +38117|4|F|148782.33|1993-04-21|5-LOW|Clerk#000000571|0|s integrate quickly. blithe +38118|1039|O|99987.48|1995-04-19|4-NOT SPECIFIED|Clerk#000000052|0|e fluffily regular accounts. fluffily silent accounts sleep +38119|1477|F|110308.62|1994-03-23|2-HIGH|Clerk#000000290|0|boost carefully express, final pinto be +38144|809|O|68808.68|1998-04-17|1-URGENT|Clerk#000000852|0| final, ironic foxes a +38145|862|F|161228.08|1994-09-13|4-NOT SPECIFIED|Clerk#000000621|0| special Tiresias imp +38146|1033|O|61230.52|1995-12-08|5-LOW|Clerk#000000868|0| furiously express requests sleep carefully. express +38147|1384|F|161631.40|1992-01-13|2-HIGH|Clerk#000000835|0|furiously unusual depende +38148|254|O|278141.05|1996-06-14|5-LOW|Clerk#000000166|0|structions hang. notornis wake blithely. silent +38149|1126|O|21595.69|1998-01-25|4-NOT SPECIFIED|Clerk#000000744|0|round the special, silent deposits. carefully ironic instruct +38150|794|O|63012.18|1998-02-07|3-MEDIUM|Clerk#000000808|0|ccounts sleep across the blithely brave dolphins. quickly express accounts +38151|1360|O|79901.74|1997-12-28|1-URGENT|Clerk#000000813|0|riously final packages use flu +38176|967|F|162291.57|1993-08-16|2-HIGH|Clerk#000000999|0|detect blithely up the blithely even instructions? unusu +38177|1324|O|65286.86|1998-07-22|3-MEDIUM|Clerk#000000224|0|hely regular theodolites. slyly unusual platelets af +38178|193|F|115291.40|1992-08-30|3-MEDIUM|Clerk#000000720|0|ronic asymptotes. final, silent dolphins wake +38179|410|O|102161.77|1997-10-12|5-LOW|Clerk#000000379|0| special deposits at the b +38180|479|F|155257.13|1994-08-20|3-MEDIUM|Clerk#000000430|0|s. furiously bold packages wake a +38181|520|O|141128.92|1997-05-04|1-URGENT|Clerk#000000221|0|. carefully regular pinto beans at the quickly dogged theodolites +38182|653|F|57271.32|1992-05-23|2-HIGH|Clerk#000000652|0|p fluffily unusual accounts. even, bold acco +38183|616|O|194713.67|1998-01-26|2-HIGH|Clerk#000000417|0|s. even ideas are carefully even accounts. pending deposit +38208|29|O|141276.12|1996-03-24|5-LOW|Clerk#000000315|0| blithely regular accounts abo +38209|214|F|21032.54|1994-08-16|3-MEDIUM|Clerk#000000510|0|lly regular dependencies. fluffily ironic tithes wake across the +38210|478|F|276107.15|1993-12-13|5-LOW|Clerk#000000695|0|regular forges above the fluffily reg +38211|422|O|341430.15|1996-05-02|5-LOW|Clerk#000000160|0|osits integrate. carefully express deposits mold blithely-- final i +38212|1298|P|321677.13|1995-04-05|3-MEDIUM|Clerk#000000470|0|l dependencies are furiously abo +38213|340|O|256208.53|1996-10-06|4-NOT SPECIFIED|Clerk#000000508|0|usual asymptotes sleep furiously final ideas. unusual, silent ideas are bol +38214|269|O|161058.62|1996-10-09|4-NOT SPECIFIED|Clerk#000000712|0|nding excuses. unusual requests nag +38215|1366|F|201026.59|1993-01-03|1-URGENT|Clerk#000000401|0|ymptotes use. quickly ironic ideas use quickly against the +38240|1021|F|92424.12|1994-12-20|2-HIGH|Clerk#000000800|0|fily even, special realms: +38241|1063|F|91577.08|1994-11-22|5-LOW|Clerk#000000443|0|x against the blithely pending ac +38242|200|F|292850.47|1992-04-19|1-URGENT|Clerk#000000347|0| platelets boost slyly regular i +38243|127|F|166412.19|1994-08-24|3-MEDIUM|Clerk#000000814|0|ependencies above the silent packages cajole furiously along the +38244|745|O|127388.28|1997-06-04|3-MEDIUM|Clerk#000000209|0|ronic deposits. ironic reque +38245|829|F|55483.84|1993-04-29|3-MEDIUM|Clerk#000000205|0| bold, special deposits cajole furiousl +38246|497|O|66553.17|1996-08-26|5-LOW|Clerk#000000636|0|deposits believe blithely among the e +38247|382|O|46010.30|1997-09-05|1-URGENT|Clerk#000000597|0|p furiously along the slyly enticing theodolite +38272|833|O|210691.47|1995-11-16|1-URGENT|Clerk#000000527|0|ges nag. carefully regular pinto bea +38273|1010|F|88579.80|1993-01-09|3-MEDIUM|Clerk#000000884|0|ly express requests are. fluffily special accounts sleep permanentl +38274|283|O|253114.33|1995-06-11|2-HIGH|Clerk#000000702|0|ully pending ideas. fluffily express dependencies boost. pending d +38275|1312|O|245196.00|1996-12-23|3-MEDIUM|Clerk#000000540|0| dependencies eat furiously accounts. flu +38276|2|O|201568.55|1996-03-13|5-LOW|Clerk#000000353|0|efully unusual deposits. carefully ir +38277|976|F|21878.30|1992-01-20|1-URGENT|Clerk#000000511|0|eodolites. packages across the furiously pending a +38278|1234|O|9003.19|1995-08-16|2-HIGH|Clerk#000000073|0|accounts affix furiously. furiously ironic requests affix bli +38279|673|F|183149.51|1992-04-30|3-MEDIUM|Clerk#000000237|0|refully bold packages impress blithely; +38304|1469|P|60366.08|1995-03-23|2-HIGH|Clerk#000000683|0|erve. blithely special requests w +38305|74|P|135309.15|1995-05-01|1-URGENT|Clerk#000000970|0|ess deposits detect s +38306|635|O|210945.25|1996-07-09|4-NOT SPECIFIED|Clerk#000000448|0|ven deposits are furiously silent instructions. fluf +38307|926|O|117515.57|1998-01-19|2-HIGH|Clerk#000000538|0|thely bold accounts haggle. pending, even acco +38308|607|O|207271.70|1996-08-26|1-URGENT|Clerk#000000692|0|ts sleep regular warthogs. furiously ironic deposits cajole carefully slyly fi +38309|736|O|261180.77|1996-05-14|4-NOT SPECIFIED|Clerk#000000205|0|s cajole blithely. furiously unusual theodoli +38310|784|F|93436.38|1992-04-15|2-HIGH|Clerk#000000501|0|even tithes. quickly bold requests cajole even, ironic patterns. iro +38311|88|P|139357.94|1995-04-24|3-MEDIUM|Clerk#000000160|0|wake fluffily after the regular packages. ironic pin +38336|506|F|169564.28|1992-10-06|1-URGENT|Clerk#000000939|0| cajole around the quickly un +38337|238|F|251160.23|1993-11-01|3-MEDIUM|Clerk#000000691|0|l frays serve blithely realms. carefully careful deposits could have t +38338|184|O|113707.73|1998-03-25|1-URGENT|Clerk#000000168|0|uickly unusual sentimen +38339|1117|O|119123.65|1996-09-02|2-HIGH|Clerk#000000376|0|yly against the final deposits. carefully silen +38340|1196|F|103340.15|1994-01-21|1-URGENT|Clerk#000000263|0|ithely final pinto beans nag blithely ironic theodolites. carefully +38341|1414|F|67953.09|1994-05-19|3-MEDIUM|Clerk#000000241|0|ve the slyly special foxes. final, final +38342|550|O|169784.26|1995-05-04|3-MEDIUM|Clerk#000000649|0|s mold slyly. furiously unusual dolphins sleep blithely bold, regular in +38343|413|O|52173.45|1995-09-22|3-MEDIUM|Clerk#000000473|0|lyly final accounts hinder about the packages. furi +38368|182|F|42851.68|1994-02-14|1-URGENT|Clerk#000000218|0|ons. quickly final theodol +38369|140|F|114155.24|1993-01-13|4-NOT SPECIFIED|Clerk#000000726|0|ag. regular ideas haggle ironic, regular +38370|775|P|204984.19|1995-04-04|2-HIGH|Clerk#000000632|0|permanent tithes are pending pack +38371|586|F|54597.33|1994-11-09|4-NOT SPECIFIED|Clerk#000000998|0|e quickly. quickly sly packages +38372|1339|F|151107.88|1993-05-16|2-HIGH|Clerk#000000392|0|ges cajole. final dependencies caj +38373|281|O|206391.92|1997-10-10|2-HIGH|Clerk#000000979|0| ironic asymptotes wake blit +38374|1405|P|201846.21|1995-05-19|3-MEDIUM|Clerk#000000130|0|even instructions sleep carefully. fluffily regular +38375|964|O|18787.90|1996-05-19|3-MEDIUM|Clerk#000000176|0|azzle slyly bold foxes. carefully regular requests are quic +38400|34|F|191519.56|1994-12-15|4-NOT SPECIFIED|Clerk#000000883|0|yly bold instructions. bold, regular packages sl +38401|403|O|85919.42|1998-07-03|2-HIGH|Clerk#000000186|0|e. even requests haggle blithely +38402|892|O|238505.72|1996-09-12|2-HIGH|Clerk#000000027|0|dolites. quickly pen +38403|58|P|139162.78|1995-05-22|5-LOW|Clerk#000000107|0|ironic packages haggle. fluffily quick packag +38404|703|F|5038.71|1994-01-19|2-HIGH|Clerk#000000058|0|y slyly even requests. special depos +38405|331|F|359455.08|1993-07-16|3-MEDIUM|Clerk#000000431|0|lly unusual foxes. blithely regular requests sub +38406|946|F|191668.77|1993-12-03|3-MEDIUM|Clerk#000000449|0|ely ironic dependencies promise fur +38407|290|O|98200.78|1997-10-08|4-NOT SPECIFIED|Clerk#000000985|0|nto beans cajole blithely among the slyly +38432|343|O|108917.81|1996-11-01|4-NOT SPECIFIED|Clerk#000000934|0|quests across the pending, final deposits are acco +38433|1336|F|102878.81|1994-05-17|3-MEDIUM|Clerk#000000380|0|riously. quickly final depths dete +38434|973|F|162081.00|1994-05-10|2-HIGH|Clerk#000000319|0|s wake. busily final theodolites cajole around the e +38435|1096|O|12804.89|1997-10-14|5-LOW|Clerk#000000645|0|the carefully idle realms affix blithely against the ironic +38436|1003|F|115545.25|1992-09-29|2-HIGH|Clerk#000000227|0|gular accounts-- regular dep +38437|436|F|128124.02|1992-05-09|1-URGENT|Clerk#000000040|0|areful accounts. waters detect closely blithely express platelets. final d +38438|877|P|183042.83|1995-06-01|1-URGENT|Clerk#000000931|0|sleep carefully even excuses. slyly express foxes after the regular +38439|436|F|100257.67|1995-01-14|3-MEDIUM|Clerk#000000122|0|nos cajole. express acco +38464|892|F|71632.83|1993-11-19|5-LOW|Clerk#000000031|0|ickly ironic platelets haggle ironic, special accounts: sile +38465|1045|F|53516.38|1992-03-13|3-MEDIUM|Clerk#000000708|0|s. bold packages cajole flu +38466|1411|O|174104.65|1995-08-18|1-URGENT|Clerk#000000839|0| the regular platelets. quickly regular deposits are silent requests; blithel +38467|1150|O|121780.42|1996-05-22|3-MEDIUM|Clerk#000000342|0|dly after the blithely express pinto beans; carefully even f +38468|472|O|42578.34|1995-10-07|4-NOT SPECIFIED|Clerk#000000805|0|lithely daring hockey players believe. never regular deposits wa +38469|635|O|88483.26|1996-09-27|1-URGENT|Clerk#000000716|0|pecial foxes are finally. +38470|1394|F|204736.83|1993-07-19|1-URGENT|Clerk#000000993|0| even deposits. final, pending waters hag +38471|908|O|256638.14|1997-05-08|3-MEDIUM|Clerk#000000765|0|e carefully final accounts. regular +38496|319|F|254204.36|1993-02-21|1-URGENT|Clerk#000000548|0|s wake carefully along the +38497|7|F|85024.27|1993-10-04|3-MEDIUM|Clerk#000000874|0|ly bold accounts. quickly express packages alongside of the packages dete +38498|1183|F|148768.08|1992-04-28|1-URGENT|Clerk#000000104|0|he unusual deposits are above the bold foxes. slyly fina +38499|334|O|39852.29|1997-11-09|3-MEDIUM|Clerk#000000330|0|sly according to the busily ironic instructions. slyly +38500|989|F|75154.81|1992-02-14|1-URGENT|Clerk#000000882|0|y even theodolites sleep alongside of the care +38501|241|F|75905.92|1994-04-29|1-URGENT|Clerk#000000666|0| are above the regular +38502|95|O|167530.84|1997-09-23|4-NOT SPECIFIED|Clerk#000000354|0|t quickly carefully p +38503|154|F|132275.14|1994-05-06|5-LOW|Clerk#000000775|0|. carefully ironic platel +38528|592|O|314606.17|1995-12-21|1-URGENT|Clerk#000000747|0|s. furiously regular ideas wake slyly speci +38529|754|F|295303.85|1994-02-03|5-LOW|Clerk#000000524|0|ffix furiously pending dolphins: furiously iro +38530|1477|P|376904.18|1995-04-18|1-URGENT|Clerk#000000220|0|ake: even, special ideas +38531|1057|O|167119.08|1995-12-06|5-LOW|Clerk#000000147|0|d instructions. furiously bold instructions across the furi +38532|280|F|212298.24|1992-07-18|2-HIGH|Clerk#000000093|0| blithely ironic de +38533|214|O|202808.50|1997-02-14|4-NOT SPECIFIED|Clerk#000000392|0|under the slyly regular attainments. regular theodolites across the final ins +38534|532|O|231802.96|1996-12-26|2-HIGH|Clerk#000000894|0|carefully regular packages mold enticingly carefully ironic instructions. +38535|643|F|9084.69|1992-08-10|2-HIGH|Clerk#000000398|0|al packages hinder carefully among the carefully ironic depende +38560|673|O|203453.23|1996-02-07|4-NOT SPECIFIED|Clerk#000000286|0|requests are fluffily after the quickly unusual ideas. regular fox +38561|19|O|117067.03|1995-08-31|1-URGENT|Clerk#000000720|0|ts about the fluffily final instructions caj +38562|223|F|75157.20|1993-12-30|2-HIGH|Clerk#000000657|0|sleep furiously slyly regular requests. furiously +38563|185|F|144995.56|1992-07-06|3-MEDIUM|Clerk#000000864|0|lites. packages are across the even deposits. carefully unusua +38564|326|F|225990.36|1994-11-03|1-URGENT|Clerk#000000279|0|lent pinto beans believe. bold packages boost slyly slyly en +38565|199|F|273830.92|1994-03-26|1-URGENT|Clerk#000000074|0|fully final platelets across the final dependencies eat about the packages +38566|607|O|65028.70|1996-01-04|5-LOW|Clerk#000000971|0|furiously final foxe +38567|229|O|144152.87|1997-05-14|5-LOW|Clerk#000000780|0|nal, regular accounts. deposits are carefully +38592|53|O|78482.52|1997-03-21|2-HIGH|Clerk#000000015|0|lithely bold packages; quickly ironic deposits +38593|559|O|61368.26|1996-12-10|5-LOW|Clerk#000000729|0|ly permanent instructions cajole +38594|91|F|160874.90|1994-12-02|3-MEDIUM|Clerk#000000575|0|es print above the regular +38595|740|O|23802.30|1996-12-23|3-MEDIUM|Clerk#000000127|0|oys. fluffily express accounts print never. carefully slow packa +38596|1477|F|74370.58|1993-04-03|3-MEDIUM|Clerk#000000552|0|ackages sleep carefully ironic d +38597|416|F|180788.96|1992-02-05|1-URGENT|Clerk#000000417|0|. requests are carefully ac +38598|868|F|218579.26|1994-08-16|5-LOW|Clerk#000000862|0| along the slyly pending deposits. quickly iro +38599|31|F|104394.37|1994-10-27|2-HIGH|Clerk#000000266|0|, special foxes after the express cou +38624|274|O|233210.74|1998-02-16|4-NOT SPECIFIED|Clerk#000000305|0|dependencies. instructions boost furiously about the furious +38625|850|F|213446.91|1993-11-18|4-NOT SPECIFIED|Clerk#000000293|0|riously special packages among the qui +38626|40|O|165270.84|1997-04-16|2-HIGH|Clerk#000000721|0|deposits against the final excuses haggle furiously above the furiously bli +38627|277|F|39238.89|1994-11-01|1-URGENT|Clerk#000000873|0| accounts according to the quickly +38628|79|O|8513.15|1995-10-30|5-LOW|Clerk#000000437|0|after the fluffily bold accounts. fluffily regular in +38629|292|O|188397.94|1997-04-20|2-HIGH|Clerk#000000605|0|ending dependencies are final platelets. furiously silent multipliers accordi +38630|649|F|306172.25|1993-04-18|3-MEDIUM|Clerk#000000164|0|. pending accounts print carefully regular deposits. furiously regular deposit +38631|686|O|237938.73|1997-11-13|3-MEDIUM|Clerk#000000827|0|across the bold foxes! slyly bold deposits nag rut +38656|65|F|122168.58|1992-08-11|5-LOW|Clerk#000000336|0|uffily busy patterns. ironic, even dependencies haggle slyly acr +38657|616|F|105110.87|1993-05-29|4-NOT SPECIFIED|Clerk#000000320|0| requests nod blithely across the carefully regular theodolites. ironic, +38658|1154|O|116919.01|1997-07-06|4-NOT SPECIFIED|Clerk#000000772|0|old instructions wake fluffily regular excuses. carefully unusual packa +38659|847|F|176718.57|1993-03-31|5-LOW|Clerk#000000551|0|sly-- slyly regular deposits was quickly. bold, regular ideas against the f +38660|397|F|49486.56|1992-12-16|1-URGENT|Clerk#000000680|0| requests boost caref +38661|1499|F|260730.46|1992-02-13|2-HIGH|Clerk#000000572|0|y regular theodolites wake carefully above the furiously r +38662|109|O|148909.98|1995-11-25|4-NOT SPECIFIED|Clerk#000000707|0|ross the bold excuses. blithely iro +38663|871|O|68137.45|1997-05-07|5-LOW|Clerk#000000710|0|ate evenly ironic, unusual theodolites. blithely bold deposits haggle +38688|364|O|177075.44|1998-06-16|1-URGENT|Clerk#000000653|0|lithely regular accounts cajole fluffily even i +38689|670|F|115430.95|1994-04-26|3-MEDIUM|Clerk#000000406|0|nstructions according to the unusual requests print aga +38690|716|F|80320.72|1992-01-21|5-LOW|Clerk#000000593|0|gle quickly regular packages. final pin +38691|1082|O|45573.29|1995-03-30|4-NOT SPECIFIED|Clerk#000000200|0|carefully slyly bold ideas. sly +38692|991|O|52091.93|1996-01-26|5-LOW|Clerk#000000337|0|fluffily even deposits cajole slyly. ironi +38693|58|O|2653.43|1995-06-15|5-LOW|Clerk#000000252|0| regular deposits nag car +38694|538|O|15433.75|1998-06-27|1-URGENT|Clerk#000000287|0|lyly regular, regular requests. even requests sleep slyly across the fluffily +38695|1382|O|2022.19|1997-08-21|2-HIGH|Clerk#000000322|0|uctions sleep fluffily according to the +38720|1328|O|151828.49|1998-04-03|1-URGENT|Clerk#000000483|0|nag. quickly unusual a +38721|1115|F|166517.33|1994-03-25|1-URGENT|Clerk#000000933|0| deposits. close excuses haggle +38722|614|O|240611.33|1997-03-23|5-LOW|Clerk#000000071|0|s. carefully unusual ideas boost slyly above the blit +38723|73|F|211237.90|1992-09-21|1-URGENT|Clerk#000000185|0|platelets nag at the carefully unusual package +38724|1102|O|11097.82|1997-08-22|5-LOW|Clerk#000000155|0|e. fluffily unusual platelets toward the furiously silent foxes sleep f +38725|1402|F|165414.87|1994-07-18|1-URGENT|Clerk#000000364|0| cajole blithely acr +38726|952|F|191113.24|1994-05-22|3-MEDIUM|Clerk#000000955|0| unusual theodolites thrash special, ironic theodolites. carefully express +38727|17|F|174613.29|1993-06-14|4-NOT SPECIFIED|Clerk#000000752|0|he packages. slyly ironic packages x-ray quickly regula +38752|400|F|207743.79|1994-10-03|2-HIGH|Clerk#000000793|0|uickly special accounts. furiously express ac +38753|814|F|115139.81|1993-09-11|5-LOW|Clerk#000000132|0|nd. bold foxes nag furiously. carefully express accounts sleep. gr +38754|268|O|130436.97|1997-09-07|3-MEDIUM|Clerk#000000924|0|y regular accounts. carefully regular accounts cajole above the regu +38755|1108|O|142349.93|1996-03-08|4-NOT SPECIFIED|Clerk#000000103|0|s engage furiously regular foxes. fu +38756|14|F|172660.10|1994-05-08|1-URGENT|Clerk#000000485|0|even theodolites are across the slyly regular foxes. slyly express theodolites +38757|538|O|157423.67|1998-02-06|3-MEDIUM|Clerk#000000493|0|lar instructions. slyly regular sauternes haggle blithely to the +38758|334|O|259783.24|1995-09-25|4-NOT SPECIFIED|Clerk#000000343|0|p furiously furiously bold accounts. express +38759|7|O|166068.24|1996-07-18|5-LOW|Clerk#000000620|0|ding to the even, regular foxes detect quickly even epitaphs. always pen +38784|904|F|29824.48|1995-02-04|3-MEDIUM|Clerk#000000578|0|al pinto beans. final, enticing sauternes boost carefully after th +38785|280|O|39013.60|1997-02-05|3-MEDIUM|Clerk#000000450|0|le among the furiously regular ideas. slyly spe +38786|545|O|60335.00|1995-06-19|3-MEDIUM|Clerk#000000086|0|uriously across the regular excuses? slyl +38787|1349|O|210829.67|1995-08-06|5-LOW|Clerk#000000106|0|n requests cajole fluffily. quickly ironic packages eat after the pending +38788|172|O|73030.89|1996-11-18|3-MEDIUM|Clerk#000000658|0|haggle. ironic theodolites after the furiously pending deposi +38789|191|F|354924.90|1993-11-15|2-HIGH|Clerk#000000355|0|areful requests wake furiously. instr +38790|985|O|102757.49|1996-01-11|1-URGENT|Clerk#000000492|0|yly! blithely final epitaphs snooze carefully sly +38791|1349|F|48324.57|1993-03-15|5-LOW|Clerk#000000632|0|ions of the final dolphins wake against the slyly pending accounts. fluffily +38816|1109|F|192135.23|1992-12-24|5-LOW|Clerk#000000418|0|ts use carefully. quickly express foxes cajole furiously. furiou +38817|1132|F|154811.44|1992-05-21|4-NOT SPECIFIED|Clerk#000000359|0|nstructions. final pint +38818|841|F|173277.79|1994-11-19|1-URGENT|Clerk#000000931|0|egular accounts. care +38819|155|F|30969.06|1993-01-12|1-URGENT|Clerk#000000523|0|ccording to the ideas. courts cajole about the quickly silent +38820|976|O|36093.44|1998-06-27|2-HIGH|Clerk#000000137|0|use alongside of the +38821|1102|F|91070.82|1993-05-22|2-HIGH|Clerk#000000844|0|nst the final reque +38822|806|F|94843.83|1994-12-28|5-LOW|Clerk#000000984|0|er the accounts. furiously regular pinto beans according to the quietly bold +38823|934|O|91597.23|1997-11-09|1-URGENT|Clerk#000000239|0|unusual, pending packages above the carefully f +38848|679|F|16274.18|1992-12-17|2-HIGH|Clerk#000000233|0|ites wake slyly enticing ideas. blithely ironic +38849|509|O|268781.80|1996-07-22|2-HIGH|Clerk#000000911|0|n ideas. pending, special packages cajole car +38850|37|F|339194.75|1993-04-30|3-MEDIUM|Clerk#000000910|0|slyly regular theodolites. final, special packages cajole after the bl +38851|619|F|65702.57|1992-06-11|1-URGENT|Clerk#000000028|0| slyly ironic ideas maintain among the fluffily final +38852|643|F|234783.97|1994-11-02|4-NOT SPECIFIED|Clerk#000000153|0|dolites. fluffily ironic packages nag after the never final pint +38853|793|F|211225.58|1992-03-24|5-LOW|Clerk#000000039|0| accounts integrate furiously +38854|485|O|169327.92|1996-02-10|1-URGENT|Clerk#000000796|0|ents. pending, express courts haggle. permanently ironic +38855|1262|O|174797.79|1997-10-07|5-LOW|Clerk#000000895|0| even foxes are: blithely slow dolphins thrash ideas. s +38880|667|O|181362.95|1997-01-24|4-NOT SPECIFIED|Clerk#000000759|0|lyly ironic ideas. regular, quick theodolites are furious +38881|1060|O|314818.58|1996-02-07|3-MEDIUM|Clerk#000000305|0|ts wake even instructions. blit +38882|1036|F|197678.01|1994-12-15|1-URGENT|Clerk#000000406|0|ve the carefully special deposits. special a +38883|953|O|89947.52|1996-08-14|1-URGENT|Clerk#000000122|0|ing to the express, final requests wake always ironic deposit +38884|499|F|234583.79|1992-08-18|2-HIGH|Clerk#000000393|0|structions cajole furiously final packages. blithely bold pinto bea +38885|313|O|38759.49|1997-09-09|2-HIGH|Clerk#000000472|0| even excuses. slyly id +38886|1348|F|108949.25|1994-08-08|2-HIGH|Clerk#000000591|0|eans nag around the furiously special dependencies. final d +38887|1339|F|220992.24|1994-10-25|1-URGENT|Clerk#000000816|0|ounts cajole quickly. furiousl +38912|949|F|285636.13|1992-10-29|5-LOW|Clerk#000000376|0|unts haggle furiously. quickly regular instructions wake slyly agains +38913|967|F|24259.22|1994-09-07|4-NOT SPECIFIED|Clerk#000000373|0|slyly regular reques +38914|1426|F|96262.50|1992-05-31|3-MEDIUM|Clerk#000000505|0|g excuses. fluffily regular packages sleep slyly request +38915|452|F|241435.60|1994-09-18|3-MEDIUM|Clerk#000000734|0| deposits sleep blithely regular foxes. regular deposits are caref +38916|1490|O|130081.24|1997-06-19|5-LOW|Clerk#000000786|0|ckages. carefully ironic deposits detect blithely against the slyly iron +38917|302|F|276341.82|1993-11-22|5-LOW|Clerk#000000345|0|endencies above the escapades sleep slyly according to the dep +38918|1189|O|234724.00|1997-05-10|2-HIGH|Clerk#000000375|0|e fluffily regular deposits. slyly ironic accounts sleep quickly. fluffil +38919|1219|O|94172.43|1995-12-04|4-NOT SPECIFIED|Clerk#000000050|0|! regular, final ideas +38944|1136|F|196955.88|1993-04-21|3-MEDIUM|Clerk#000000802|0|e regular epitaphs. blithely bold foxes sleep slyly bold requests +38945|1477|O|138181.54|1996-01-16|5-LOW|Clerk#000000388|0|kages after the blithe instructions dazzle carefully along the bli +38946|1427|O|46428.96|1996-11-01|1-URGENT|Clerk#000000311|0|ic packages across the blithely final r +38947|1138|F|132987.22|1994-11-30|1-URGENT|Clerk#000000813|0|ial accounts hang furiously. slyly special reques +38948|877|O|89020.48|1995-06-06|4-NOT SPECIFIED|Clerk#000000484|0|blithely bold foxes wake ironic, even accounts? caref +38949|917|F|256434.99|1992-08-28|4-NOT SPECIFIED|Clerk#000000582|0|ackages lose alongside +38950|1420|O|150002.94|1995-07-03|4-NOT SPECIFIED|Clerk#000000411|0|y ironic sauternes. ironic foxes breach slyly about the quickly fi +38951|64|O|177413.17|1997-04-03|4-NOT SPECIFIED|Clerk#000000929|0| slyly final deposits. carefully ironic deposits affix furiously. ironi +38976|364|F|171518.14|1993-12-26|1-URGENT|Clerk#000000584|0|riously pending deposits. quickly silent accounts alon +38977|578|F|231348.30|1993-02-13|1-URGENT|Clerk#000000733|0|sh blithely packages. even requests alongside of the blithely even pac +38978|341|F|36800.50|1994-08-04|5-LOW|Clerk#000000609|0|ully pending instructions affix fin +38979|145|F|208349.79|1993-02-27|5-LOW|Clerk#000000428|0| packages cajole. requests across the accounts +38980|509|F|181283.45|1993-11-14|3-MEDIUM|Clerk#000000530|0| final deposits haggle quickly about the +38981|572|F|87111.92|1993-01-30|1-URGENT|Clerk#000000436|0|egular deposits. blithely unusual theodolites are blithely. slyly regular +38982|787|F|152400.26|1994-07-18|4-NOT SPECIFIED|Clerk#000000626|0|final deposits after the fluffily special pinto beans believe slyly after the +38983|1096|O|61378.74|1997-06-10|2-HIGH|Clerk#000000028|0|ar platelets haggle quickly silent accounts-- +39008|670|O|174519.65|1995-04-29|4-NOT SPECIFIED|Clerk#000000157|0|es against the packages boost regular, regular foxes. +39009|283|O|140793.42|1997-07-13|1-URGENT|Clerk#000000256|0| final ideas might sublate slyly. quickly special pl +39010|565|P|181035.48|1995-05-14|5-LOW|Clerk#000000757|0|tructions. carefully regular inst +39011|187|F|14440.28|1992-12-31|5-LOW|Clerk#000000996|0|gular accounts. slyly regular reque +39012|223|O|31323.44|1996-05-19|3-MEDIUM|Clerk#000000667|0|its. carefully ironic foxes +39013|493|O|80697.09|1996-01-14|5-LOW|Clerk#000000953|0|ons among the final, +39014|166|O|159753.67|1997-11-05|3-MEDIUM|Clerk#000000797|0|s haggle slyly. pearls nag furiously ironic, unusual +39015|760|F|143156.57|1994-12-07|3-MEDIUM|Clerk#000000385|0| ideas. carefully silent requests are furious +39040|494|F|139368.05|1994-05-22|1-URGENT|Clerk#000000994|0|equests around the thinly even +39041|529|O|306266.58|1995-10-27|1-URGENT|Clerk#000000140|0|uriously. fluffily ironic deposits after the furiously ironic +39042|244|F|73316.95|1994-08-18|1-URGENT|Clerk#000000241|0|fully even foxes. stealthily final accounts affix unusual, +39043|1447|F|81206.15|1993-12-23|4-NOT SPECIFIED|Clerk#000000420|0|ar foxes. closely silent ideas cajole against the s +39044|607|F|88379.74|1993-04-30|4-NOT SPECIFIED|Clerk#000000488|0|according to the carefully pending platelets. carefully final +39045|370|F|144504.68|1992-09-15|1-URGENT|Clerk#000000545|0|counts cajole slyly final packages. regular, daring patterns ha +39046|358|O|124233.97|1995-11-17|3-MEDIUM|Clerk#000000782|0|s cajole. carefully ironic foxes haggle after th +39047|536|F|62108.58|1993-03-03|4-NOT SPECIFIED|Clerk#000000803|0|fully regular theodolites haggl +39072|353|F|39650.23|1994-02-23|2-HIGH|Clerk#000000243|0|ously even pinto beans. special deposits +39073|1357|F|204850.59|1994-01-30|1-URGENT|Clerk#000000806|0|bold instructions. expr +39074|494|O|237802.16|1996-04-14|2-HIGH|Clerk#000000678|0|ecial, final accounts solv +39075|1345|F|175618.29|1992-02-20|4-NOT SPECIFIED|Clerk#000000243|0|above the unusual deposits. unus +39076|88|F|152274.27|1994-12-12|1-URGENT|Clerk#000000204|0|? blithely even theodolites cajole along th +39077|127|O|234898.12|1997-12-20|3-MEDIUM|Clerk#000000880|0|p among the final accounts. fluffily +39078|845|F|160126.05|1994-06-24|5-LOW|Clerk#000000602|0| blithely blithe foxes: carefully +39079|664|O|180044.60|1995-09-08|2-HIGH|Clerk#000000232|0|ts. carefully regular instructions wa +39104|724|O|109229.37|1996-01-14|4-NOT SPECIFIED|Clerk#000000158|0|ding theodolites are furiously grouches. blithely regular instructions mold f +39105|247|O|46692.61|1996-05-07|5-LOW|Clerk#000000384|0|sly slyly express ideas. ironically pending attainm +39106|1379|O|49659.69|1997-03-13|4-NOT SPECIFIED|Clerk#000000022|0| silent, even requests serve furiously across the even a +39107|574|O|108517.31|1995-12-05|1-URGENT|Clerk#000000088|0|y pending instructions. permanently regular pinto beans print blithely. e +39108|1496|O|140955.85|1997-06-21|5-LOW|Clerk#000000544|0|lly ironic deposits. p +39109|1093|O|133604.03|1998-06-29|1-URGENT|Clerk#000000451|0| quickly ironic asymptot +39110|1435|F|115382.88|1993-02-06|3-MEDIUM|Clerk#000000595|0|ironic packages about the blithely special packages use blithely slyly expre +39111|1024|O|89461.32|1995-07-26|3-MEDIUM|Clerk#000000515|0|usly final theodolites cajole carefully. quickl +39136|407|F|99205.30|1994-06-25|2-HIGH|Clerk#000000787|0|its. packages need to haggle carefully carefully ironic som +39137|1271|O|225913.01|1998-04-02|4-NOT SPECIFIED|Clerk#000000613|0|tainments detect carefully across +39138|133|O|208174.69|1995-12-30|2-HIGH|Clerk#000000164|0|e enticing, final platelets: slyly regular dolphins alongs +39139|853|F|300895.16|1993-11-14|4-NOT SPECIFIED|Clerk#000000936|0|sleep ironic requests. ironic packages boost-- regular, fin +39140|79|F|191314.56|1993-09-28|5-LOW|Clerk#000000513|0|lly among the quickly f +39141|1489|F|253399.76|1994-05-04|5-LOW|Clerk#000000795|0|lyly ironic instructions ha +39142|1150|F|181598.05|1992-10-31|4-NOT SPECIFIED|Clerk#000000701|0|special excuses play blithely regula +39143|898|F|82528.19|1992-04-07|4-NOT SPECIFIED|Clerk#000000378|0|ar somas instead of the r +39168|593|F|249577.96|1992-05-18|2-HIGH|Clerk#000000130|0|. packages sleep abo +39169|1067|O|194820.12|1995-08-27|3-MEDIUM|Clerk#000000401|0|instructions. final, even pinto beans against the +39170|1274|F|121784.98|1994-07-16|5-LOW|Clerk#000000832|0|lessly regular courts wake. pending accounts cajo +39171|1054|O|207564.71|1997-12-28|4-NOT SPECIFIED|Clerk#000000176|0|ckly silent accounts serve. furiously ironic deposits above the ironi +39172|779|F|213662.19|1993-06-26|5-LOW|Clerk#000000937|0|uriously regular packages. slyly even dep +39173|556|F|218847.08|1994-01-17|1-URGENT|Clerk#000000080|0|. sentiments above the fluff +39174|19|O|267133.62|1997-06-14|1-URGENT|Clerk#000000205|0|y regular theodolites. regular deposits eat evenly blithely unusual deposi +39175|1190|O|247664.59|1995-07-29|4-NOT SPECIFIED|Clerk#000000526|0| slyly final accoun +39200|514|O|142184.65|1996-05-14|4-NOT SPECIFIED|Clerk#000000182|0|haggle blithely! slyly unusual packages print. +39201|1387|O|239317.76|1996-01-05|3-MEDIUM|Clerk#000000187|0|ounts wake furiously after the pe +39202|859|O|66409.42|1997-01-08|2-HIGH|Clerk#000000217|0|s above the slyly express accounts sleep against the carefully blithe deposit +39203|733|F|52272.47|1992-04-08|1-URGENT|Clerk#000000935|0|cajole furiously along the regular packages. furiously express dolphins bre +39204|146|F|252013.26|1994-07-31|4-NOT SPECIFIED|Clerk#000000521|0|nal packages could haggle among the regular orbits. slyly regular pinto be +39205|125|O|37880.68|1995-06-06|5-LOW|Clerk#000000583|0| regular pinto beans integrate against the fu +39206|728|F|18441.93|1995-04-10|5-LOW|Clerk#000000434|0|instructions affix blithely regular foxes. slowly +39207|34|F|169283.27|1994-09-06|1-URGENT|Clerk#000000196|0|ding to the slyly ironic deposits. quickly p +39232|724|O|157940.88|1995-07-13|5-LOW|Clerk#000000990|0|es. requests on the fluffily final request +39233|1474|O|198319.35|1996-08-23|1-URGENT|Clerk#000000783|0|nag carefully by the regular, bold deposits. bold deposits poach. caref +39234|1253|O|258002.71|1997-03-09|2-HIGH|Clerk#000000755|0|hely ironic requests? instructions integrate furiousl +39235|1307|F|80494.43|1993-07-15|3-MEDIUM|Clerk#000000035|0|ecial frets cajole quietly dar +39236|1183|F|82734.91|1993-08-30|1-URGENT|Clerk#000000824|0|ccounts haggle fluffily across the quickly ironic asymptotes. furio +39237|820|O|242791.06|1997-08-02|4-NOT SPECIFIED|Clerk#000000131|0| final deposits. furiously pending ideas sleep across the final foxes. slyly +39238|1135|F|210941.45|1993-09-27|1-URGENT|Clerk#000000450|0|ss the furiously pending foxes. ironic, regular in +39239|1036|O|158880.19|1997-11-25|5-LOW|Clerk#000000343|0|odolites alongside of the +39264|1040|O|181124.50|1997-04-04|3-MEDIUM|Clerk#000000956|0|ng to the quickly unusual instructions. +39265|872|F|264254.16|1993-05-08|1-URGENT|Clerk#000000909|0|iously daring packages. final packages along the foxes snooze carefully flu +39266|1399|F|74889.49|1992-08-28|2-HIGH|Clerk#000000557|0|sts boost carefully special requests. sile +39267|676|F|111637.85|1993-01-19|2-HIGH|Clerk#000000556|0|lly ironic instructions haggle. furiously silent instructi +39268|1255|P|210482.12|1995-04-23|4-NOT SPECIFIED|Clerk#000000611|0| furiously final foxes. accounts nag furiously express platelets. ironic, ex +39269|1066|F|178177.07|1992-10-27|5-LOW|Clerk#000000053|0|arefully. quickly special deposits cajole carefully around the carefully sil +39270|1093|F|33017.19|1995-02-07|2-HIGH|Clerk#000000976|0|ckages. accounts are slyly. blithely re +39271|1306|O|74377.34|1998-04-27|1-URGENT|Clerk#000000414|0|sly even platelets nod against the special, pending requests. fluffily final +39296|623|O|196088.56|1997-08-31|2-HIGH|Clerk#000000762|0| furiously fluffily even pinto beans. blithely express deposits ha +39297|1180|F|45613.39|1994-03-21|5-LOW|Clerk#000000060|0|ar requests. slyly even accounts boost after +39298|1099|O|25606.32|1996-10-10|2-HIGH|Clerk#000000012|0|arefully bold theodolites haggle fluffily after the ironi +39299|1430|O|268543.12|1998-01-03|4-NOT SPECIFIED|Clerk#000000311|0|ckages above the final tithes boost quickly above the furiously +39300|188|F|143819.99|1992-04-23|2-HIGH|Clerk#000000376|0|s dazzle unusual foxes. special accounts cajole blithely. carefully +39301|835|F|270561.70|1994-03-23|3-MEDIUM|Clerk#000000862|0|nstructions above the sl +39302|821|F|34430.46|1992-05-04|5-LOW|Clerk#000000975|0|kages against the express, silent packages nag carefully ironic accounts. +39303|305|O|130214.14|1998-06-25|3-MEDIUM|Clerk#000000654|0|lyly special requests. accounts among the unusual, regul +39328|889|O|141883.31|1997-05-08|3-MEDIUM|Clerk#000000718|0|al deposits in place of the pending dependencies affix after the ironically +39329|815|O|339885.38|1996-01-23|3-MEDIUM|Clerk#000000322|0|requests wake across +39330|755|F|160060.14|1993-07-18|1-URGENT|Clerk#000000941|0|l accounts serve slyly. furiously even packages haggle quickly furiou +39331|769|O|3173.95|1995-09-14|2-HIGH|Clerk#000000844|0|accounts after the even, ironi +39332|32|O|89259.68|1995-10-10|2-HIGH|Clerk#000000480|0|lyly. express somas cajole pinto bean +39333|1010|F|348230.52|1993-02-18|1-URGENT|Clerk#000000551|0| sleep carefully after the courts. ironic foxes integrate bl +39334|335|O|137310.28|1997-09-28|3-MEDIUM|Clerk#000000402|0|latelets. ironic asymptotes are regula +39335|790|F|194071.13|1994-05-26|4-NOT SPECIFIED|Clerk#000000502|0|sits above the fluffily special platelets sleep carefully alongside of th +39360|1327|F|289332.10|1994-12-05|5-LOW|Clerk#000000352|0|luffily final packa +39361|128|F|152600.94|1994-12-14|2-HIGH|Clerk#000000732|0|unusual, bold accounts along the unusual acc +39362|1244|O|33119.77|1998-07-02|4-NOT SPECIFIED|Clerk#000000258|0|bout the deposits. furiously bold warthogs are-- final, silent deposits +39363|1306|O|132271.30|1997-11-17|2-HIGH|Clerk#000000694|0|ual packages haggle alongside of the req +39364|1066|F|243633.93|1992-11-10|2-HIGH|Clerk#000000682|0|fully after the fur +39365|832|F|103179.65|1992-05-15|2-HIGH|Clerk#000000030|0|eodolites eat slyly. furious, regular +39366|979|O|146824.98|1997-07-20|4-NOT SPECIFIED|Clerk#000000492|0|lar foxes cajole at the silently final ideas. quickly final packages hinder a +39367|1319|F|112334.98|1994-08-07|1-URGENT|Clerk#000000848|0|are carefully regular f +39392|22|O|220895.65|1997-06-30|3-MEDIUM|Clerk#000000861|0|refully express orbits detect alongside of th +39393|508|F|96715.63|1993-11-18|4-NOT SPECIFIED|Clerk#000000711|0|accounts. final instructions cajole +39394|898|O|28354.12|1996-02-24|4-NOT SPECIFIED|Clerk#000000866|0|s. blithely ironic deposits haggle. idly ironic deposits along +39395|1072|O|238838.17|1996-09-19|5-LOW|Clerk#000000093|0|es. fluffily pending ideas sleep +39396|599|O|171630.67|1996-01-26|5-LOW|Clerk#000000999|0| special ideas poach furiously +39397|16|F|97282.25|1993-10-12|3-MEDIUM|Clerk#000000686|0|ully regular dependencies. furious foxes breach. quickly eve +39398|56|O|68356.61|1998-07-23|3-MEDIUM|Clerk#000000120|0|s. final platelets sleep among the carefully fin +39399|454|F|140599.46|1992-12-18|3-MEDIUM|Clerk#000000222|0|p slyly. requests wake carefully blithely silent foxes. never pendi +39424|1208|O|37399.23|1997-04-12|5-LOW|Clerk#000000690|0|c requests about the carefully regular foxes wake carefully final fo +39425|442|F|238651.07|1992-08-17|1-URGENT|Clerk#000000239|0|ng pinto beans? sometimes unus +39426|316|F|201345.62|1994-05-27|1-URGENT|Clerk#000000771|0| the final accounts. unusual foxe +39427|478|F|220539.32|1993-12-12|2-HIGH|Clerk#000000740|0|sts above the even Tiresias inte +39428|1415|O|236970.41|1996-12-16|1-URGENT|Clerk#000000509|0| ironic packages. ca +39429|58|O|78091.89|1998-05-13|2-HIGH|Clerk#000000848|0|fily ironic foxes integrate carefully about the unusual +39430|554|F|198773.07|1994-06-14|5-LOW|Clerk#000000302|0|re fluffily above the +39431|416|F|53224.01|1992-05-22|1-URGENT|Clerk#000000826|0|e carefully packages. unusual deposit +39456|1016|O|409770.83|1998-02-16|2-HIGH|Clerk#000000972|0|ts sleep final requests. carefully b +39457|100|O|127377.48|1995-06-03|2-HIGH|Clerk#000000808|0|uctions detect slyly permanently special packages. carefully spec +39458|569|O|134681.40|1997-08-21|1-URGENT|Clerk#000000349|0|about the ironic instructions. quickly regular depend +39459|451|O|86120.05|1997-09-01|3-MEDIUM|Clerk#000000637|0|ronic packages haggle final requests. +39460|1105|F|297349.76|1994-05-03|4-NOT SPECIFIED|Clerk#000000024|0|ly regular theodolites wake express asymptotes! bold +39461|776|O|147833.52|1996-05-28|2-HIGH|Clerk#000000439|0|ge. furiously regular accounts cajole quickly above the quickly final dolphins +39462|550|O|162944.45|1996-05-03|1-URGENT|Clerk#000000768|0|s haggle regularly. express +39463|1360|F|84379.95|1994-10-02|3-MEDIUM|Clerk#000000201|0|even packages. deposits haggle furiously final depende +39488|187|F|54018.86|1994-06-23|5-LOW|Clerk#000000918|0|ly. ironic, special instructions sublate regula +39489|1135|O|20837.76|1998-07-29|5-LOW|Clerk#000000115|0|s try to wake regular accounts. fina +39490|1439|F|161008.91|1992-08-13|5-LOW|Clerk#000000882|0|iously bold frets sleep fluffily. theodolites cajole blithely. express, regul +39491|109|F|142548.26|1993-07-07|1-URGENT|Clerk#000000600|0|ly along the furiously pending packages. carefully regular tithes +39492|316|P|110068.26|1995-04-18|4-NOT SPECIFIED|Clerk#000000181|0|iously ironic packages. special accounts are quickly at the deposit +39493|355|O|157209.61|1997-07-03|2-HIGH|Clerk#000000937|0|ar requests nag regular +39494|1337|O|135325.81|1996-09-18|5-LOW|Clerk#000000695|0|r deposits. slowly final theodolites cajole slyly according to t +39495|920|F|177618.52|1994-02-02|1-URGENT|Clerk#000000909|0|equests sleep blithely final ideas. ironic accounts +39520|1102|O|314168.92|1997-10-03|1-URGENT|Clerk#000000752|0|hall have to solve quickly silent instructions. stealthy sauternes nag +39521|1480|F|73295.45|1994-08-10|5-LOW|Clerk#000000768|0|. final gifts at the requests nag alongside of the slowly even deposit +39522|295|O|67312.33|1998-05-29|5-LOW|Clerk#000000237|0|uests are blithely express requests. slyly regular accounts +39523|148|O|295635.50|1997-03-03|2-HIGH|Clerk#000000161|0|xcuses above the quickly ir +39524|160|O|111600.31|1996-09-23|1-URGENT|Clerk#000000621|0|accounts above the bold deposits use carefully before the express c +39525|98|O|62372.23|1995-06-12|3-MEDIUM|Clerk#000000780|0|rint blithely unusual pinto beans. quickly unusual deposits +39526|665|O|159702.75|1996-09-24|5-LOW|Clerk#000000191|0|ounts. packages affix doggedly. blithely bold pinto beans cajole. thinly r +39527|176|P|135602.88|1995-04-18|5-LOW|Clerk#000000332|0|aggle furiously quickly ironic accounts. slyly ironic platelets wake slyl +39552|1247|O|23604.82|1997-12-29|5-LOW|Clerk#000000237|0|cial accounts among the slyly unusual theodolites nag along the slyly +39553|1282|O|59594.08|1996-08-16|4-NOT SPECIFIED|Clerk#000000757|0|eep carefully. furiously express accounts sleep close +39554|1457|O|144821.61|1996-02-07|4-NOT SPECIFIED|Clerk#000000439|0|ously ironic requests! quickly express theodolites th +39555|670|F|142720.02|1992-09-05|5-LOW|Clerk#000000776|0|yly unusual packages among the carefully regu +39556|157|O|216076.12|1998-02-18|3-MEDIUM|Clerk#000000030|0|ely instructions. blithely even pinto beans d +39557|1372|F|238700.93|1993-10-12|1-URGENT|Clerk#000000546|0|y furiously even instructions. carefully final +39558|553|O|4572.12|1996-12-28|2-HIGH|Clerk#000000534|0|in carefully. furiously even packages around the carefully ironic accounts wak +39559|473|O|13893.40|1995-10-23|4-NOT SPECIFIED|Clerk#000000388|0|e of the blithely unusual requests sleep along the s +39584|763|O|239740.46|1997-09-06|5-LOW|Clerk#000000473|0|ages grow bold, bold accounts. bold accounts use blithely pending deposits. th +39585|1013|O|183131.59|1995-12-30|4-NOT SPECIFIED|Clerk#000000966|0|hely even requests. regular theodol +39586|733|P|165403.13|1995-05-20|4-NOT SPECIFIED|Clerk#000000340|0|cial pinto beans sleep during the special frays. fluffily unusual requests ca +39587|550|O|245250.91|1997-04-05|5-LOW|Clerk#000000641|0|ial courts wake quickly furiously bold r +39588|274|O|92178.78|1997-12-20|1-URGENT|Clerk#000000491|0|eposits ought to wake against the quickly final packages. request +39589|712|F|87654.01|1994-08-03|1-URGENT|Clerk#000000950|0|nic packages. regular pinto beans cajo +39590|460|P|92311.50|1995-05-15|5-LOW|Clerk#000000615|0|lly even pinto beans. fi +39591|238|O|78732.80|1997-03-25|2-HIGH|Clerk#000000889|0|ns cajole evenly since the pending theodolites. bold +39616|1291|O|271072.65|1997-11-04|1-URGENT|Clerk#000000789|0|al accounts. pinto beans breach slyly. quickly +39617|502|O|197776.25|1995-12-18|4-NOT SPECIFIED|Clerk#000000346|0| furiously final excuses against the fluffily even packa +39618|1432|O|90287.19|1998-03-13|5-LOW|Clerk#000000987|0|unts affix furiously slyly final deposits. ironic platelets n +39619|347|F|140277.98|1992-01-05|5-LOW|Clerk#000000115|0|nal excuses wake. carefully ironic pinto be +39620|1279|F|406938.36|1994-10-05|2-HIGH|Clerk#000000457|0|nic packages sleep quickly regular excuses. busy packages nag finally! package +39621|608|O|17476.20|1998-06-26|3-MEDIUM|Clerk#000000046|0|s serve furiously about the regular requests. regular th +39622|346|O|56787.88|1995-08-18|1-URGENT|Clerk#000000767|0|riously since the special, +39623|526|O|183734.60|1996-05-19|3-MEDIUM|Clerk#000000566|0|the quiet theodolites-- special, even acco +39648|653|F|103802.17|1992-01-11|5-LOW|Clerk#000000171|0|aggle slyly regular, ironic pinto beans. carefully unusual packages de +39649|262|F|294640.47|1994-10-20|2-HIGH|Clerk#000000673|0|accounts are quickly fu +39650|584|F|115486.78|1993-07-31|4-NOT SPECIFIED|Clerk#000000853|0|regular accounts. silent accounts are furiously. slyly ironic +39651|349|O|84675.92|1996-09-16|4-NOT SPECIFIED|Clerk#000000983|0|y furiously express excuses. regular requests across the exp +39652|574|F|273410.21|1992-05-05|5-LOW|Clerk#000000008|0|al deposits. regular warthogs use fluffily pending platelets. dar +39653|805|O|128403.23|1997-10-13|1-URGENT|Clerk#000000859|0|. fluffily special packages wake blithely fi +39654|1306|F|132957.60|1992-10-01|3-MEDIUM|Clerk#000000391|0|he furiously bold requests. unusual asymptotes dazzle slyly ir +39655|269|F|221293.28|1992-03-24|2-HIGH|Clerk#000000316|0|g to the asymptotes; even, pending depend +39680|493|F|52779.97|1993-06-22|5-LOW|Clerk#000000125|0|ccounts. slyly unusual deposits grow blithely above the pendi +39681|1199|O|244894.09|1998-01-15|2-HIGH|Clerk#000000790|0|fully regular deposits. r +39682|835|F|15671.99|1993-11-10|3-MEDIUM|Clerk#000000843|0|lar deposits haggle busily bold, final +39683|169|O|248750.39|1995-08-11|2-HIGH|Clerk#000000799|0| braids nag alongside of the even requests. slyly unusual packages mold sly +39684|896|O|150905.97|1997-03-31|4-NOT SPECIFIED|Clerk#000000659|0|t the slyly ironic packages. furiously silent theodolit +39685|1270|O|136681.27|1996-08-15|3-MEDIUM|Clerk#000000703|0|olites cajole thinly agai +39686|388|F|294986.65|1992-06-09|4-NOT SPECIFIED|Clerk#000000493|0|s integrate quickly iron +39687|181|F|106108.20|1993-07-09|3-MEDIUM|Clerk#000000478|0|onic dinos integrate slyly instructions. even ideas wake furiously regul +39712|1318|F|80916.24|1994-02-21|5-LOW|Clerk#000000705|0| after the slyly ironic pinto beans. fl +39713|883|F|156484.08|1994-01-26|4-NOT SPECIFIED|Clerk#000000135|0|t above the carefully even request +39714|1400|F|84284.96|1994-10-21|5-LOW|Clerk#000000329|0|. final, bold pinto beans use carefully even excuses. blithely unusual de +39715|712|O|47758.78|1997-04-03|4-NOT SPECIFIED|Clerk#000000820|0| blithely bold packages s +39716|970|O|51115.29|1996-08-11|3-MEDIUM|Clerk#000000708|0|er express packages haggle carefully afte +39717|50|F|116253.05|1994-11-29|2-HIGH|Clerk#000000193|0|usual accounts. packages boost. final, bold de +39718|337|F|126347.44|1994-10-01|2-HIGH|Clerk#000000062|0| about the blithely regular requests. req +39719|1291|O|179398.58|1997-11-26|3-MEDIUM|Clerk#000000919|0|ely regular asymptotes. quickly special pinto beans before t +39744|161|F|59122.97|1994-07-07|3-MEDIUM|Clerk#000000522|0|latelets impress. slyly final attainments nag carefully +39745|581|P|193055.52|1995-05-05|4-NOT SPECIFIED|Clerk#000000630|0|ly among the unusual deposits. +39746|1123|O|57618.01|1996-11-26|4-NOT SPECIFIED|Clerk#000000086|0|leep blithely. furiously regular foxes believe +39747|13|O|39729.75|1997-07-06|4-NOT SPECIFIED|Clerk#000000894|0|structions haggle furiously special accounts. quickly fi +39748|1106|O|80387.86|1995-04-30|3-MEDIUM|Clerk#000000689|0| ironic requests. dogged dependencies caj +39749|1456|F|265047.58|1993-06-28|2-HIGH|Clerk#000000412|0|ng courts maintain express request +39750|1261|F|58553.86|1994-03-28|2-HIGH|Clerk#000000322|0|nding packages are. quickly final ideas use after the regu +39751|1048|F|83932.14|1993-03-16|2-HIGH|Clerk#000000302|0|mold carefully across the special, e +39776|247|F|190806.75|1994-06-28|2-HIGH|Clerk#000000432|0|usly around the ironic excuses. unusual foxes are +39777|1312|O|294816.57|1996-04-05|5-LOW|Clerk#000000425|0|ect carefully after the bli +39778|1282|F|29232.78|1992-10-07|3-MEDIUM|Clerk#000000913|0| wake fluffily carefu +39779|931|F|174607.40|1994-01-24|2-HIGH|Clerk#000000861|0|ong the blithely special theodolites use carefully a +39780|949|F|233404.56|1994-06-08|5-LOW|Clerk#000000666|0|instructions. dugouts cajole across the quickly re +39781|130|O|179381.64|1996-09-04|2-HIGH|Clerk#000000642|0|rmanently bold accounts. fluffily regular courts haggle carefully final T +39782|1405|O|115018.02|1997-06-09|5-LOW|Clerk#000000767|0|ly regular packages ought to wake a +39783|1486|F|141916.24|1992-09-21|4-NOT SPECIFIED|Clerk#000000611|0|usly according to the stealthily ironic requests. furiou +39808|1354|F|236425.18|1992-09-03|5-LOW|Clerk#000000720|0|lphins. fluffily ironic packages across the blithely even excuses +39809|811|O|96186.21|1998-03-01|2-HIGH|Clerk#000000891|0| silent pinto beans. furiously express pinto beans may caj +39810|949|O|36490.84|1997-10-20|3-MEDIUM|Clerk#000000307|0|need to are pending, final dependencies. ironic deposits cajole qui +39811|1175|O|28686.74|1996-12-14|2-HIGH|Clerk#000000115|0| the unusual courts boost blithely deposits. ironic instructions promise qui +39812|737|F|274696.19|1994-06-21|4-NOT SPECIFIED|Clerk#000000510|0|cross the blithely regular pinto beans. bold theodolites nag +39813|1120|F|95441.16|1992-02-03|1-URGENT|Clerk#000000169|0|ss, final platelets integrate +39814|1489|F|203915.33|1993-01-15|5-LOW|Clerk#000000860|0|s haggle furiously among the final pack +39815|829|F|202623.41|1994-04-10|5-LOW|Clerk#000000046|0|nstructions cajole carefully by the quickly ironic d +39840|1163|O|179240.78|1996-02-07|2-HIGH|Clerk#000000439|0|t packages. carefully ironic accounts sleep furiously. furiously even +39841|301|F|24942.86|1993-01-02|3-MEDIUM|Clerk#000000838|0|eposits affix furiously agains +39842|1264|F|166147.94|1993-12-20|3-MEDIUM|Clerk#000000743|0| theodolites haggle slyly beside the +39843|77|F|155094.50|1994-08-28|3-MEDIUM|Clerk#000000462|0|the furiously bold instructions: carefully final pains nag beyond the final, +39844|584|F|293743.41|1994-12-02|4-NOT SPECIFIED|Clerk#000000543|0|. carefully permanent instruction +39845|965|F|120403.33|1994-09-07|1-URGENT|Clerk#000000903|0|ges use around the close +39846|178|F|157103.73|1994-02-28|5-LOW|Clerk#000000434|0|atterns nag furiously after the pendin +39847|154|F|197533.19|1993-04-05|4-NOT SPECIFIED|Clerk#000000065|0|e slyly accounts. carefully regular accounts sle +39872|862|F|199103.89|1993-02-23|1-URGENT|Clerk#000000162|0|ackages eat quickly furiousl +39873|322|F|56450.95|1992-02-25|3-MEDIUM|Clerk#000000289|0|decoys detect blithely regular accounts. express re +39874|547|O|83828.08|1996-02-24|2-HIGH|Clerk#000000738|0|s nag slyly after the theodolites. quickly even accounts after the blithel +39875|1282|F|108420.25|1993-01-26|5-LOW|Clerk#000000589|0|l accounts: even, express pinto beans sleep +39876|235|F|86734.64|1992-04-14|2-HIGH|Clerk#000000526|0|s across the slyly regular deposits boost carefully bold deposits. +39877|541|F|152485.13|1992-08-17|1-URGENT|Clerk#000000009|0|refully furiously final ideas. blithely regula +39878|685|P|229669.07|1995-03-06|4-NOT SPECIFIED|Clerk#000000913|0|usly regular foxes shoul +39879|199|O|97311.19|1996-10-07|5-LOW|Clerk#000000890|0|bold instructions boost quickly unusual pi +39904|1319|F|52821.94|1994-02-03|4-NOT SPECIFIED|Clerk#000000142|0|ess accounts integrate blithely above the packages. c +39905|337|O|193644.51|1997-06-16|4-NOT SPECIFIED|Clerk#000000137|0| permanently express multipliers solve carefully after the even de +39906|901|F|60245.22|1994-03-18|3-MEDIUM|Clerk#000000031|0|es sleep furiously along the accounts. carefully ironic packages wake blithe +39907|439|F|12119.57|1993-08-30|5-LOW|Clerk#000000433|0|yly even ideas boost. slyly regular dolphins are quickl +39908|98|F|215876.40|1994-05-11|5-LOW|Clerk#000000155|0|to the idle requests. quickly slow dolp +39909|470|P|199456.46|1995-02-25|5-LOW|Clerk#000000263|0|ctions sleep blithely regular instructions. final +39910|763|F|193998.95|1992-08-19|1-URGENT|Clerk#000000144|0|ending, even escapades. pinto beans could have to +39911|1178|O|70983.48|1996-01-08|4-NOT SPECIFIED|Clerk#000000518|0|cuses cajole according to the +39936|1354|O|43424.24|1998-06-15|4-NOT SPECIFIED|Clerk#000000027|0|efully silent deposits haggle slyly dar +39937|16|P|310673.97|1995-05-24|3-MEDIUM|Clerk#000000650|0|fluffily bold foxes. ironic packages use blithely regular +39938|868|F|146436.29|1992-06-11|2-HIGH|Clerk#000000403|0|inal accounts. fluffily pending dugouts haggle packages. carefull +39939|421|F|186552.96|1992-07-27|5-LOW|Clerk#000000622|0|usly pending dependencies. packages above the fluffy, bold packages sle +39940|463|O|35809.73|1997-10-31|5-LOW|Clerk#000000205|0|s. final, express instructions use slyly alongside o +39941|925|F|7149.18|1994-10-19|3-MEDIUM|Clerk#000000772|0|se ideas sleep carefully fluffily bold deposits. carefully pending dependencie +39942|712|F|34329.74|1992-01-12|1-URGENT|Clerk#000000767|0|the quickly ironic requests. furious +39943|949|F|220778.68|1992-06-08|2-HIGH|Clerk#000000538|0| the regular theodolites. theodolites along the blithely special packa +39968|1106|O|229999.54|1996-01-09|2-HIGH|Clerk#000000095|0|unts use. blithely special asymptotes nag quickly amon +39969|1286|O|274832.24|1997-12-24|3-MEDIUM|Clerk#000000802|0|lets wake against the excus +39970|37|F|58992.31|1994-06-26|5-LOW|Clerk#000000558|0|iously regular packages. expr +39971|188|F|209232.54|1994-01-09|3-MEDIUM|Clerk#000000163|0| nag furiously. quickly express ideas brea +39972|433|F|140991.72|1992-09-26|4-NOT SPECIFIED|Clerk#000000184|0|slyly unusual warthogs. carefully even sheaves haggle quietly furiousl +39973|643|O|293424.70|1997-11-10|1-URGENT|Clerk#000000882|0|ag? ironic accounts affix slowly. slyly regular pinto beans +39974|1073|O|179959.60|1996-04-27|5-LOW|Clerk#000000196|0|lites. furiously ironic deposits detect furiously furiously ironic a +39975|622|O|198968.67|1998-06-28|4-NOT SPECIFIED|Clerk#000000177|0|r packages. fluffily final ideas cajole blithely. dolphin +40000|1141|F|106310.40|1995-01-30|2-HIGH|Clerk#000000498|0|packages sleep quickly. requests above the foxes are +40001|712|F|111953.06|1995-02-25|3-MEDIUM|Clerk#000000197|0|g furiously regular, express forges. final th +40002|1064|F|46465.82|1993-11-09|2-HIGH|Clerk#000000965|0|usly slyly special packages. ca +40003|515|F|226742.80|1994-03-01|3-MEDIUM|Clerk#000000723|0|unts hang furiously. regular pinto beans boost slyly carefully regular ac +40004|44|O|102626.43|1997-03-17|2-HIGH|Clerk#000000455|0|fully bold requests after the special, ironic pinto beans are +40005|1406|F|110493.15|1993-07-26|2-HIGH|Clerk#000000829|0|s serve. fluffily ironic frays haggle. quickly express ideas al +40006|67|F|46513.08|1994-06-16|4-NOT SPECIFIED|Clerk#000000444|0|carefully furiously ironic platelets. furiously even asy +40007|1435|F|129721.23|1992-08-31|4-NOT SPECIFIED|Clerk#000000758|0|leep. pinto beans kindle blithely final r +40032|820|F|240909.71|1992-12-01|5-LOW|Clerk#000000009|0|oxes. always special ideas cajole quick +40033|781|F|17585.01|1993-12-29|2-HIGH|Clerk#000000234|0|accounts. express packages affix silent pinto beans. +40034|34|F|100764.82|1995-03-11|3-MEDIUM|Clerk#000000212|0|xcuses. ironic requests into the fluffily even instructions cajole fur +40035|32|O|174771.17|1996-03-16|3-MEDIUM|Clerk#000000516|0|, unusual excuses solve blithely +40036|521|F|187891.30|1993-06-08|4-NOT SPECIFIED|Clerk#000000807|0|hy requests haggle carefully. foxe +40037|1442|F|43530.95|1993-04-21|1-URGENT|Clerk#000000004|0| even, regular excuses after the f +40038|607|O|128353.84|1998-07-19|3-MEDIUM|Clerk#000000104|0|s haggle furiously regular +40039|739|F|54939.93|1994-12-14|2-HIGH|Clerk#000000180|0| the regular instructions. ironic, express instructions wake exp +40064|1324|O|67001.79|1997-05-26|5-LOW|Clerk#000000242|0|ly express accounts doubt carefully bold pinto beans. +40065|337|F|244278.72|1992-02-18|2-HIGH|Clerk#000000060|0|osits haggle. carefully regular c +40066|1105|O|114663.52|1997-08-21|3-MEDIUM|Clerk#000000295|0|pending gifts use. fluffi +40067|1462|F|116699.40|1992-02-18|5-LOW|Clerk#000000372|0|y unusual requests nag furiously. express, +40068|998|F|116771.11|1993-04-21|5-LOW|Clerk#000000064|0|ily about the carefully even d +40069|794|O|149054.88|1996-08-30|2-HIGH|Clerk#000000451|0|lithely along the ironic platelets +40070|2|O|54402.20|1996-09-17|3-MEDIUM|Clerk#000000890|0|y around the boldly bold theodo +40071|353|O|109416.75|1998-06-24|1-URGENT|Clerk#000000285|0|posits; unusual, bold foxes cajole furiously final platele +40096|1174|O|61127.06|1995-11-15|2-HIGH|Clerk#000000112|0|egular packages run blithely regular accounts. dugouts w +40097|65|F|163023.93|1994-01-10|5-LOW|Clerk#000000429|0|refully even instruc +40098|241|F|210461.56|1992-02-06|5-LOW|Clerk#000000626|0| special accounts cajole permanently ironic deposits. blithely final i +40099|1402|O|104103.28|1998-05-30|4-NOT SPECIFIED|Clerk#000000558|0|sts alongside of the final foxes serve quickly across the regular packages. f +40100|1060|F|265908.18|1992-02-05|5-LOW|Clerk#000000055|0|refully about the pending escapades +40101|766|F|54289.48|1994-02-01|5-LOW|Clerk#000000830|0|l platelets eat carefully +40102|106|F|112865.77|1995-02-04|3-MEDIUM|Clerk#000000282|0|n gifts alongside of the carefully busy epitap +40103|1180|F|61728.34|1993-09-25|4-NOT SPECIFIED|Clerk#000000444|0| regular courts. slyly enticing id +40128|808|F|163629.12|1994-02-10|5-LOW|Clerk#000000598|0|ng accounts. instructions sublate quickly carefully regular package +40129|590|O|84134.07|1997-06-22|5-LOW|Clerk#000000294|0|ainst the furiously unusual patterns. carefully final deposits haggle bli +40130|1390|O|62368.68|1997-09-15|4-NOT SPECIFIED|Clerk#000000172|0|y regular deposits haggle blithely +40131|158|F|32785.42|1992-05-03|5-LOW|Clerk#000000121|0|y blithely special requests. packages nag abou +40132|665|F|381793.12|1992-02-24|5-LOW|Clerk#000000870|0|use carefully. blithely f +40133|818|F|115270.16|1993-07-27|4-NOT SPECIFIED|Clerk#000000786|0|ely slow deposits sleep. furiously pending a +40134|1498|O|38568.32|1995-10-10|5-LOW|Clerk#000000766|0| final ideas detect furiou +40135|335|F|94055.44|1994-09-09|3-MEDIUM|Clerk#000000826|0|s along the careful +40160|347|F|123911.91|1994-10-16|1-URGENT|Clerk#000000047|0|fully. regular, pending i +40161|484|O|140816.37|1997-08-09|2-HIGH|Clerk#000000208|0|ests. slyly regular +40162|365|F|33114.83|1993-01-25|1-URGENT|Clerk#000000184|0| furiously blithely ironic instr +40163|628|O|48213.95|1996-06-18|4-NOT SPECIFIED|Clerk#000000646|0|efully. daring, even dependencies cajole requests. ide +40164|743|F|290129.78|1993-04-11|4-NOT SPECIFIED|Clerk#000000276|0|tes cajole blithely regularly regular requests. pending, final pack +40165|115|P|91588.35|1995-03-03|2-HIGH|Clerk#000000294|0|ccounts. idly regular accounts are e +40166|310|O|70106.88|1998-03-06|5-LOW|Clerk#000000875|0|gular asymptotes cajole about the even h +40167|1321|F|151781.29|1992-09-19|4-NOT SPECIFIED|Clerk#000000481|0|. fluffily regular dolphins are furiously. slyly even dolphins nag. sl +40192|686|O|240348.85|1998-07-12|1-URGENT|Clerk#000000486|0|arefully thin theodolites are carefully around the special, regular accou +40193|592|F|138137.78|1992-09-03|2-HIGH|Clerk#000000837|0|l foxes wake carefully after the blithely special theodolites. +40194|1301|F|241494.43|1993-10-07|4-NOT SPECIFIED|Clerk#000000058|0|nusual, final courts above the final somas ca +40195|428|O|234625.81|1997-01-10|2-HIGH|Clerk#000000245|0|fluffily unusual foxes. regular, +40196|410|O|39106.30|1997-03-30|5-LOW|Clerk#000000962|0|ideas haggle slyly special accounts. blithely final excuses cajole. +40197|1354|P|196008.49|1995-03-25|4-NOT SPECIFIED|Clerk#000000071|0|regular instructions. regular theodolites use blithely above t +40198|457|O|170973.40|1996-04-11|5-LOW|Clerk#000000116|0|express theodolites. fluffy a +40199|1211|F|160368.39|1992-11-10|2-HIGH|Clerk#000000934|0|g to the quickly ironic dugouts. unusual, +40224|451|F|249685.52|1994-07-01|5-LOW|Clerk#000000409|0|o beans. furiously even asymptotes against the carefully regular request +40225|1378|F|189716.03|1995-01-10|5-LOW|Clerk#000000037|0|unts affix according to the slyly silent accounts. final accou +40226|1366|F|246374.01|1993-10-14|1-URGENT|Clerk#000000542|0| gifts. carefully i +40227|781|O|236217.46|1998-07-20|2-HIGH|Clerk#000000274|0|packages serve furiously blithely +40228|1360|O|102183.61|1997-08-10|5-LOW|Clerk#000000145|0|ach around the blithely +40229|904|O|160462.18|1997-06-13|1-URGENT|Clerk#000000144|0|atelets will have to +40230|1018|O|102795.09|1996-02-10|3-MEDIUM|Clerk#000000243|0|iously regular deposits. bold packa +40231|1327|O|169609.96|1997-03-29|4-NOT SPECIFIED|Clerk#000000480|0|al, ironic decoys are quickly according to the pa +40256|1255|F|131450.43|1993-10-05|4-NOT SPECIFIED|Clerk#000000798|0|nto beans boost fluffily. bold foxes nag about the carefully f +40257|800|F|40140.74|1993-08-22|4-NOT SPECIFIED|Clerk#000000156|0| deposits use carefully of the slyly final +40258|1144|F|237183.27|1994-04-10|4-NOT SPECIFIED|Clerk#000000898|0|regular courts are slyly among the ironic, final ac +40259|1441|F|211455.40|1993-10-13|3-MEDIUM|Clerk#000000006|0|ts could have to cajole around the fi +40260|247|O|182196.30|1996-06-30|1-URGENT|Clerk#000000382|0|ake furiously regular deposits. carefully thin asymptote +40261|647|F|338073.37|1994-11-05|1-URGENT|Clerk#000000063|0|le furiously from the packages. final theodolites w +40262|1231|F|116513.98|1992-07-23|1-URGENT|Clerk#000000996|0|ious, special courts boost blithely special instruction +40263|508|O|346399.47|1996-09-22|4-NOT SPECIFIED|Clerk#000000666|0|oxes are slyly regular deposits. slyly pending packages wake quickly. +40288|101|O|17803.70|1996-05-31|3-MEDIUM|Clerk#000000767|0|otes. warthogs integrate: b +40289|815|F|281686.64|1992-11-27|4-NOT SPECIFIED|Clerk#000000742|0|ar accounts until th +40290|70|O|36433.84|1996-07-19|5-LOW|Clerk#000000826|0| instructions wake fur +40291|271|F|71449.99|1992-04-16|1-URGENT|Clerk#000000329|0|into beans wake after the furiously +40292|133|F|109602.74|1995-04-30|2-HIGH|Clerk#000000072|0|ite the furiously ironic packages. pinto beans sleep blithely. blit +40293|769|F|67663.69|1995-01-11|4-NOT SPECIFIED|Clerk#000000366|0|even, ironic accounts. final +40294|865|O|38003.10|1996-03-15|3-MEDIUM|Clerk#000000689|0|ely ironic accounts: regular packages haggle. carefully ironic pin +40295|532|O|234441.81|1998-01-04|2-HIGH|Clerk#000000502|0|tes. regularly even accounts +40320|229|O|171521.59|1996-11-29|5-LOW|Clerk#000000110|0| slyly after the carefully bold deposits. even, express requests wak +40321|766|F|175807.48|1993-06-24|2-HIGH|Clerk#000000802|0|st the furiously ironic instructions aff +40322|1363|O|47483.47|1995-08-03|5-LOW|Clerk#000000166|0|osits. carefully silent pinto beans should have to boost carefully blithely b +40323|761|O|40276.49|1997-07-20|3-MEDIUM|Clerk#000000005|0|egular packages haggle blithel +40324|601|O|76247.97|1996-01-31|3-MEDIUM|Clerk#000000018|0|ly against the bold, regular packages. silent accounts doze furiously s +40325|961|O|23683.22|1997-07-11|4-NOT SPECIFIED|Clerk#000000725|0| have to detect furious +40326|1330|F|44066.57|1994-12-27|4-NOT SPECIFIED|Clerk#000000480|0|s haggle toward the packages. fluffily ironic deposit +40327|1366|P|166495.73|1995-05-14|3-MEDIUM|Clerk#000000243|0|nent packages. furiously silen +40352|979|F|116072.49|1994-06-09|5-LOW|Clerk#000000158|0|ly unusual foxes use slyly +40353|311|O|141555.89|1998-04-19|1-URGENT|Clerk#000000416|0|lly. furiously dogged dolphins breach blithely. final, even d +40354|1181|F|228776.09|1994-01-04|2-HIGH|Clerk#000000246|0|ccounts cajole fluffily furiously express ideas. blithely +40355|436|O|93323.18|1996-10-13|5-LOW|Clerk#000000664|0|ns after the furiously sly dep +40356|667|F|96997.24|1994-12-20|4-NOT SPECIFIED|Clerk#000000948|0|to the blithely final the +40357|869|F|172376.98|1992-07-22|4-NOT SPECIFIED|Clerk#000000565|0|usual instructions above the special, even pinto beans boost carefully blithel +40358|382|O|63824.03|1997-06-10|5-LOW|Clerk#000000843|0|lithely. special, even accounts haggle slyly unusual packages +40359|571|F|86330.75|1993-02-07|1-URGENT|Clerk#000000415|0|lites haggle; stealthy ideas +40384|763|O|52769.48|1997-03-25|4-NOT SPECIFIED|Clerk#000000423|0|odolites wake never ironic pac +40385|1138|F|164494.30|1994-10-29|5-LOW|Clerk#000000904|0|y ironic instructions. carefully iron +40386|364|F|231193.43|1995-02-19|2-HIGH|Clerk#000000483|0| slyly silent ideas cajole blithely re +40387|10|O|180784.32|1998-02-21|1-URGENT|Clerk#000000704|0|lithely enticing requests. blithely even waters are quickly quickl +40388|1072|F|141352.75|1992-07-25|1-URGENT|Clerk#000000714|0|y regular accounts. slyly special ideas are furiously ironic deposits. carefu +40389|1049|O|133442.86|1998-04-06|3-MEDIUM|Clerk#000000877|0| unusual deposits sleep blithely regular platelets. ironic, even +40390|226|O|48325.77|1996-10-01|2-HIGH|Clerk#000000031|0|sheaves sleep ironic foxes. regular, ironic acco +40391|1331|O|173842.15|1997-09-28|5-LOW|Clerk#000000462|0|he ironic deposits nag +40416|1343|F|161099.20|1993-04-08|5-LOW|Clerk#000000133|0|final instructions are slyly above the blithely silent ide +40417|128|O|58622.38|1998-03-30|4-NOT SPECIFIED|Clerk#000000893|0|ly pending platelets x-ray. blithely express deposit +40418|1438|O|63794.47|1998-04-04|1-URGENT|Clerk#000000616|0|lyly regular theodolites sleep blithely. +40419|686|O|66339.26|1996-06-10|2-HIGH|Clerk#000000076|0|ccounts affix blithely +40420|358|F|221918.91|1995-01-11|2-HIGH|Clerk#000000650|0|uffily. slyly express deposits was slyly. +40421|1009|F|77477.42|1992-10-11|1-URGENT|Clerk#000000891|0|eans use slyly about the ideas. specia +40422|938|O|97425.54|1995-07-19|1-URGENT|Clerk#000000174|0| deposits. carefully ironic frays after the regular requests hag +40423|1127|O|136395.66|1998-07-11|1-URGENT|Clerk#000000001|0|raids use furiously. regular pinto beans according to the furiously spec +40448|590|O|189319.84|1997-08-25|5-LOW|Clerk#000000936|0| special, regular ideas. express requests sleep carefull +40449|1409|O|58623.62|1998-05-17|4-NOT SPECIFIED|Clerk#000000318|0| regular deposits are idly +40450|431|F|124479.69|1992-07-26|4-NOT SPECIFIED|Clerk#000000593|0|packages. even instructio +40451|754|O|111704.19|1997-09-04|2-HIGH|Clerk#000000884|0|requests boost quickly above the requests. bold courts above th +40452|1105|O|188659.30|1997-09-28|5-LOW|Clerk#000000876|0|xcuses. final instructions impress carefully pending pack +40453|1183|O|173671.58|1996-03-12|1-URGENT|Clerk#000000947|0|ld instructions. deposits are. regul +40454|1240|F|113803.47|1995-04-22|4-NOT SPECIFIED|Clerk#000000691|0|s, final dependencies. deposits hag +40455|1361|F|10701.96|1995-01-13|4-NOT SPECIFIED|Clerk#000000194|0| theodolites haggle quickly carefully bold ideas. car +40480|808|O|148205.88|1995-12-08|1-URGENT|Clerk#000000860|0|kly pending ideas. regular requests serve carefu +40481|1367|O|128111.13|1998-01-23|2-HIGH|Clerk#000000106|0|heaves sublate blithely. final ideas sleep slyly +40482|211|O|51322.86|1995-10-22|4-NOT SPECIFIED|Clerk#000000183|0|s haggle. never bold packages try to sleep. deposit +40483|1061|F|221522.91|1993-10-27|5-LOW|Clerk#000000312|0|ular, ironic requests. carefully even pac +40484|1292|F|80234.45|1993-07-26|4-NOT SPECIFIED|Clerk#000000727|0|l pinto beans. even, pending theodolites nag f +40485|682|F|131573.15|1994-12-28|4-NOT SPECIFIED|Clerk#000000135|0| nag quickly against the ruthlessly unusual packages. fluffi +40486|982|O|96452.87|1997-12-11|2-HIGH|Clerk#000000841|0|nal deposits haggle against the blithely bold ins +40487|1069|O|260234.30|1996-06-04|5-LOW|Clerk#000000694|0|nag across the final, even deposits. even, bold somas alongside of the si +40512|743|F|202777.80|1993-09-18|3-MEDIUM|Clerk#000000265|0| furiously ironic foxes boost furiously blit +40513|1460|O|92310.74|1996-05-31|1-URGENT|Clerk#000000399|0|ffy asymptotes boost: stealthily even theodolites wake car +40514|1121|O|229942.57|1998-03-30|3-MEDIUM|Clerk#000000292|0|areful ideas nag regular, unusual theod +40515|626|O|191723.20|1996-01-28|5-LOW|Clerk#000000355|0|packages. dolphins use! q +40516|923|O|92838.48|1996-07-12|4-NOT SPECIFIED|Clerk#000000944|0|fily express accounts doze carefully. furiously regular +40517|838|O|77622.40|1996-04-10|5-LOW|Clerk#000000179|0| beans doze against the accounts. packages wake ab +40518|365|F|57856.47|1994-03-14|1-URGENT|Clerk#000000400|0|le against the final, regular epitaphs. thi +40519|80|F|38491.40|1993-12-22|1-URGENT|Clerk#000000153|0|ular sheaves against the slyly final pinto bean +40544|1157|F|150660.58|1994-04-07|5-LOW|Clerk#000000612|0|final deposits use carefully. asymptotes about the fur +40545|785|O|133701.66|1997-12-02|4-NOT SPECIFIED|Clerk#000000909|0|y ironic instructions. carefully ironic deposits cajole along the regular, ev +40546|1369|F|39120.76|1993-06-08|2-HIGH|Clerk#000000777|0| quickly unusual theod +40547|517|F|115002.32|1994-07-10|1-URGENT|Clerk#000000759|0|efully ironic deposits above the blithely bold accounts nag +40548|305|O|231247.77|1997-05-26|2-HIGH|Clerk#000000871|0| about the express requests. furiously fi +40549|280|O|114940.79|1996-09-25|5-LOW|Clerk#000000674|0|lyly after the special requests. special ideas nag furiously silent dependenci +40550|829|O|245036.24|1996-06-07|2-HIGH|Clerk#000000182|0|ecial instructions. ca +40551|541|F|102005.26|1993-09-09|3-MEDIUM|Clerk#000000592|0| the furiously quiet accoun +40576|878|F|6104.45|1992-06-04|1-URGENT|Clerk#000000063|0|scapades. unusual, even foxes sleep +40577|175|O|125150.95|1997-12-08|4-NOT SPECIFIED|Clerk#000000361|0|efully furious requests cajol +40578|121|O|212493.07|1996-09-15|3-MEDIUM|Clerk#000000140|0|sly silent pinto beans nag slyly. slyly regular requests detect ca +40579|913|O|185314.98|1996-11-01|5-LOW|Clerk#000000192|0|uriously regular accounts. express dependencies detect theodolites. blithely +40580|1117|O|182373.43|1996-09-15|1-URGENT|Clerk#000000867|0|lly special accounts: busy dinos are slyly. fluffil +40581|992|O|70497.66|1996-04-28|1-URGENT|Clerk#000000268|0|sleep slyly alongside of the bl +40582|112|O|132941.63|1997-06-04|1-URGENT|Clerk#000000160|0|regular theodolites. furiously regular dugouts +40583|712|O|290487.94|1998-02-20|3-MEDIUM|Clerk#000000403|0|riously pending requests. accounts haggle slyly. furiously regular de +40608|16|F|121384.41|1992-08-20|4-NOT SPECIFIED|Clerk#000000687|0|e about the blithely final platelets. ideas play carefully about the ne +40609|1465|F|106641.25|1993-06-03|3-MEDIUM|Clerk#000000023|0|ckly even theodolites +40610|487|F|136417.03|1992-05-28|4-NOT SPECIFIED|Clerk#000000833|0| are furiously fluffily expres +40611|674|F|121304.98|1992-03-29|4-NOT SPECIFIED|Clerk#000000154|0|p alongside of the even accounts. thinly regular i +40612|623|P|253267.85|1995-03-01|2-HIGH|Clerk#000000626|0|eans poach blithely alongside of the +40613|472|O|315759.32|1997-05-01|1-URGENT|Clerk#000000556|0|es integrate slyly according to the carefully final asymptotes. quickly +40614|223|O|16413.91|1997-09-14|5-LOW|Clerk#000000411|0|eodolites boost furiously unusual pinto bea +40615|1105|F|163162.47|1994-07-05|1-URGENT|Clerk#000000398|0|ze quickly regular Tiresias. pending accounts are fluffily across +40640|1382|O|134588.77|1998-05-06|2-HIGH|Clerk#000000640|0| final excuses among the furiously regular excuses sleep blit +40641|586|O|99766.62|1995-11-27|4-NOT SPECIFIED|Clerk#000000586|0|ts are above the furiously regular excuses. pending, enticing i +40642|196|O|97721.86|1997-05-11|5-LOW|Clerk#000000368|0|efully. pending accounts wake blithely? never speci +40643|130|P|243949.05|1995-04-06|1-URGENT|Clerk#000000659|0| wake instructions: +40644|842|O|224938.76|1998-04-20|4-NOT SPECIFIED|Clerk#000000395|0|odolites. blithely express requests across the ironic accounts wake +40645|1229|F|135347.61|1992-12-11|3-MEDIUM|Clerk#000000395|0|ests wake furiously pending, express sauternes. furi +40646|1352|F|76247.62|1992-11-17|1-URGENT|Clerk#000000582|0|ests will have to use across the furiously even accounts? fur +40647|623|F|221400.27|1994-08-18|2-HIGH|Clerk#000000888|0| according to the furiously ironic packages h +40672|512|F|92605.63|1992-10-30|5-LOW|Clerk#000000339|0|y pending accounts between the blithely even th +40673|325|F|228157.72|1992-02-18|5-LOW|Clerk#000000682|0|n requests haggle blithely after the ev +40674|968|O|151089.91|1997-10-03|2-HIGH|Clerk#000000855|0|ments. bold, ironic packages use slyly blithely final +40675|511|F|25287.70|1994-03-14|5-LOW|Clerk#000000903|0|foxes. carefully silent deposits haggle aga +40676|619|F|52279.16|1992-03-28|2-HIGH|Clerk#000000201|0|doze quickly requests. carefully ironic packages use express p +40677|88|F|93542.10|1993-09-08|1-URGENT|Clerk#000000971|0|en instructions. blithel +40678|937|F|185203.05|1993-04-29|5-LOW|Clerk#000000987|0|ng the epitaphs. regular, ironic dependencies boost furiously bold deposits. +40679|244|F|169124.87|1993-06-13|4-NOT SPECIFIED|Clerk#000000375|0|quickly even ideas cajole blithely regular instructions. slyl +40704|67|F|194915.61|1994-01-08|5-LOW|Clerk#000000932|0|riously regular pinto +40705|31|O|118217.71|1997-02-14|2-HIGH|Clerk#000000380|0|according to the daring asymptotes. p +40706|778|F|174239.99|1992-01-22|3-MEDIUM|Clerk#000000176|0|s promise carefully with the blithely special deposits. carefu +40707|431|F|10251.37|1994-06-12|2-HIGH|Clerk#000000084|0|even, bold orbits according to the carefully blithe packages sleep +40708|1163|F|242153.37|1994-10-13|4-NOT SPECIFIED|Clerk#000000972|0|cross the quickly pending packages. slyly even packages hinder? bold ex +40709|1211|O|51155.01|1995-09-16|5-LOW|Clerk#000000678|0|sual packages. slyly silent packages alongside of the ideas ser +40710|1319|O|20065.04|1996-07-11|3-MEDIUM|Clerk#000000554|0|odolites cajole quickly express deposits. busily even packa +40711|688|F|176680.75|1992-07-15|5-LOW|Clerk#000000893|0| the express, express ex +40736|1303|F|3702.08|1992-10-08|4-NOT SPECIFIED|Clerk#000000131|0|xes sleep quickly among the quickly express pinto beans. blithely +40737|28|O|78677.46|1997-10-16|5-LOW|Clerk#000000252|0|s haggle final epitaphs. unusual, express requests about the furiously bra +40738|991|O|168791.60|1998-02-01|1-URGENT|Clerk#000000739|0|fluffily bold packages believe after the express, th +40739|541|O|16818.13|1998-07-24|3-MEDIUM|Clerk#000000701|0|sleep carefully. fluffily regular requests wak +40740|170|F|28763.42|1994-05-14|2-HIGH|Clerk#000000847|0|ing to the fluffily unusual accounts. permanent dolp +40741|1360|O|241897.93|1998-03-23|3-MEDIUM|Clerk#000000592|0|s use quickly blithely regular pinto beans. packages nag +40742|209|O|81321.98|1998-01-02|3-MEDIUM|Clerk#000000057|0| ironic, pending theodolites are blithely final att +40743|1447|O|116366.96|1997-10-28|2-HIGH|Clerk#000000987|0|xes believe slyly bold, +40768|319|O|82116.70|1997-03-13|1-URGENT|Clerk#000000313|0|ide of the foxes. blithely +40769|604|O|78234.06|1998-05-07|5-LOW|Clerk#000000714|0|kages. carefully iron +40770|49|P|129378.82|1995-04-17|5-LOW|Clerk#000000045|0|es. carefully ironic accoun +40771|80|O|203494.89|1996-04-17|2-HIGH|Clerk#000000198|0|iously express deposits sleep final packages. daringly express ideas c +40772|361|F|160131.72|1992-02-14|1-URGENT|Clerk#000000712|0|usual accounts. blithely regular dependencies sleep quickly between the bli +40773|338|F|17797.46|1994-11-07|1-URGENT|Clerk#000000640|0|y regular packages. slyly regular requests w +40774|289|O|143144.73|1996-07-10|1-URGENT|Clerk#000000107|0|ent instructions promise slyly quickly +40775|1183|F|154302.39|1993-11-18|5-LOW|Clerk#000000330|0|ms wake slyly accor +40800|16|F|246461.81|1993-12-05|4-NOT SPECIFIED|Clerk#000000699|0|cial instructions cajole. blithely unusual deposits wake +40801|1069|F|273797.84|1992-07-02|4-NOT SPECIFIED|Clerk#000000573|0|ickly even deposits. instructions sleep fluffily. pending requests sleep +40802|437|F|56876.99|1992-09-04|2-HIGH|Clerk#000000034|0|ly regular pinto beans. pending instructions around the express deposi +40803|1396|P|44490.89|1995-04-14|5-LOW|Clerk#000000959|0|al packages wake against the final accounts. unusua +40804|583|F|194124.59|1993-03-13|3-MEDIUM|Clerk#000000102|0|ously silent deposits use slyly above the carefully special packages. fu +40805|1378|F|5011.11|1993-11-06|1-URGENT|Clerk#000000668|0|ts? deposits alongside of the platelets hag +40806|446|O|238866.36|1995-09-07|1-URGENT|Clerk#000000437|0|ts cajole blithely. f +40807|1450|F|252619.11|1993-04-19|4-NOT SPECIFIED|Clerk#000000612|0|ealms use fluffily furiously ironic platelets. slyly +40832|925|F|101280.53|1993-03-30|2-HIGH|Clerk#000000433|0|blithely ironic escapades. furiously regular courts sleep furiously. care +40833|988|F|190353.31|1993-07-16|5-LOW|Clerk#000000687|0|ways silent instruction +40834|943|O|241622.65|1998-05-31|5-LOW|Clerk#000000605|0|ly regular deposits sleep slyly. fluff +40835|73|F|137457.35|1994-11-25|2-HIGH|Clerk#000000068|0|dencies. final, pending requests cajole slyly; ideas +40836|793|O|278497.23|1997-12-12|3-MEDIUM|Clerk#000000997|0|ly final ideas wake; furiously regular request +40837|1144|O|179997.47|1996-10-31|1-URGENT|Clerk#000000135|0| the even, quick requests cajole quickly even packages. express, ca +40838|802|F|103770.95|1992-11-27|4-NOT SPECIFIED|Clerk#000000636|0|s dazzle blithely fluffily unusual instructions. unusual, special dep +40839|55|F|72302.93|1992-04-01|3-MEDIUM|Clerk#000000488|0|lent asymptotes. instructions against the fluffily express account +40864|23|O|216570.96|1996-04-13|2-HIGH|Clerk#000000945|0|eep blithely furiously +40865|13|O|114049.98|1995-06-16|4-NOT SPECIFIED|Clerk#000000128|0|r deposits sublate around the express courts! final courts w +40866|1184|F|93209.58|1993-05-24|2-HIGH|Clerk#000000440|0|packages wake carefully blithely pending requests? bold, +40867|1367|O|235779.89|1997-12-21|3-MEDIUM|Clerk#000000549|0|lly. carefully unusual theod +40868|400|O|48257.23|1995-10-11|3-MEDIUM|Clerk#000000922|0|capades. quickly permanent de +40869|530|O|8000.45|1997-01-10|4-NOT SPECIFIED|Clerk#000000199|0|elets use fluffily. bold packages sleep fluffily quickly regular depend +40870|83|O|177061.72|1995-12-12|1-URGENT|Clerk#000000325|0|ully. furiously regular accounts boost furiously alongsid +40871|760|O|116621.13|1995-09-14|4-NOT SPECIFIED|Clerk#000000643|0| the bold deposits. even foxes sleep fluffily among the silent +40896|1325|O|190099.48|1995-09-03|4-NOT SPECIFIED|Clerk#000000555|0|fily furiously even depen +40897|833|O|22687.45|1997-11-24|5-LOW|Clerk#000000051|0|ending accounts wake after the slyly final deposits. sly +40898|1082|O|230456.75|1996-04-09|4-NOT SPECIFIED|Clerk#000000274|0|sts wake blithely. bold theodolit +40899|359|O|36191.44|1996-01-15|3-MEDIUM|Clerk#000000577|0|requests sleep stealthy, ironic pinto beans. even, expre +40900|955|O|164865.46|1997-01-10|4-NOT SPECIFIED|Clerk#000000211|0|y special ideas print ironic frays. furiously fluffy foxes cajole fluffily amo +40901|766|F|226782.86|1992-07-30|3-MEDIUM|Clerk#000000561|0|deposits. even, pending ideas haggle silently slyly final packages. f +40902|559|F|207641.04|1994-07-08|5-LOW|Clerk#000000284|0| orbits. quickly special theodolites after the slyly brave foxes lose s +40903|1381|O|209485.10|1996-05-12|1-URGENT|Clerk#000000913|0| even instructions. accounts +40928|1459|F|76702.11|1994-09-13|5-LOW|Clerk#000000485|0|ges alongside of the fluffily express deposits wake carefully according to th +40929|106|O|129830.89|1997-01-02|1-URGENT|Clerk#000000931|0|sly final accounts against the unusual, pending account +40930|470|O|130640.62|1998-06-16|1-URGENT|Clerk#000000093|0|fully after the carefully even ideas +40931|328|O|70250.69|1997-01-07|1-URGENT|Clerk#000000999|0|ual excuses integrate quickly about the furiously regular accounts +40932|1154|O|146472.75|1998-05-12|3-MEDIUM|Clerk#000000951|0|refully special dependencies u +40933|1289|F|92495.58|1992-05-28|2-HIGH|Clerk#000000477|0| blithely bold foxes. regular packages engage throu +40934|986|O|187906.98|1995-11-14|4-NOT SPECIFIED|Clerk#000000870|0|furiously ironic excuses. furiously even requests detect slyly blithely regul +40935|713|O|84137.41|1996-06-02|3-MEDIUM|Clerk#000000419|0| fluffily bold theodolites sleep slyly carefully ironic accounts +40960|278|O|260264.60|1998-05-05|2-HIGH|Clerk#000000437|0|counts boost fluffily along the regular theodolites? ca +40961|1349|P|44356.29|1995-03-31|3-MEDIUM|Clerk#000000217|0|usly even excuses behind the blithely silent courts sleep s +40962|523|F|191681.20|1995-02-21|1-URGENT|Clerk#000000461|0|ts wake: boldly unusual packages d +40963|734|O|230189.52|1997-04-04|5-LOW|Clerk#000000349|0|thy decoys. blithely express accounts hagg +40964|743|P|108670.54|1995-05-24|1-URGENT|Clerk#000000758|0|ke fluffily final, unusual Tiresias. carefully regular requests hag +40965|1462|F|309728.98|1994-11-21|3-MEDIUM|Clerk#000000750|0|odolites are fluffily. ironic th +40966|1369|O|180399.32|1997-05-21|5-LOW|Clerk#000000048|0|regular theodolites nag slowly final, final requests. ironically b +40967|1031|O|149081.76|1997-09-22|2-HIGH|Clerk#000000124|0|e carefully around the blithely ir +40992|1063|F|137217.51|1993-12-01|2-HIGH|Clerk#000000383|0|nag against the furiously regular theodolites. blithely final instructions ar +40993|544|O|95968.00|1997-10-07|5-LOW|Clerk#000000414|0|ily evenly dogged accounts. quick forges are slyly except the even theodoli +40994|721|F|133195.29|1992-10-10|2-HIGH|Clerk#000000089|0|y special dolphins across the pending, ironic foxes +40995|619|O|55134.49|1998-05-27|2-HIGH|Clerk#000000865|0|st the final, ironic excuses sleep ironic, regular deposits. c +40996|1058|F|31082.23|1994-08-11|5-LOW|Clerk#000000982|0|according to the final theodolites. furiously regular theodolites promise. +40997|184|F|129525.05|1994-04-22|5-LOW|Clerk#000000912|0|bout the slyly unusual packages wake regular, express instructi +40998|1330|F|77330.42|1994-05-03|3-MEDIUM|Clerk#000000371|0|the furiously busy theodolites p +40999|97|F|17908.88|1992-05-06|2-HIGH|Clerk#000000820|0|s. slyly bold deposits boost quickly according to the quickly even courts. +41024|286|F|186354.28|1993-07-19|4-NOT SPECIFIED|Clerk#000000040|0|ts use even pinto beans. daring, final +41025|176|O|107460.52|1996-02-09|1-URGENT|Clerk#000000384|0|ies-- furiously special accounts haggle according to the slyly regular gro +41026|298|P|206548.06|1995-04-20|3-MEDIUM|Clerk#000000427|0|lly careful dependencies. silent plat +41027|1109|F|145907.08|1994-03-03|1-URGENT|Clerk#000000156|0|ss instructions. fluffily stealthy theodolites wake final dependencies +41028|1093|O|260223.71|1997-05-07|1-URGENT|Clerk#000000532|0|ithely ironic pinto beans. regular accounts are furiously regular +41029|1156|O|142149.19|1996-05-13|1-URGENT|Clerk#000000496|0|sual accounts. caref +41030|113|O|154216.15|1996-02-07|4-NOT SPECIFIED|Clerk#000000224|0| haggle slyly blithely regular foxes: even, bold +41031|1048|O|132349.99|1996-02-25|4-NOT SPECIFIED|Clerk#000000969|0|slyly even foxes. accounts maintain regular packages. quickly silent th +41056|1123|F|56617.13|1992-03-27|1-URGENT|Clerk#000000580|0|uests sleep about the fu +41057|491|O|81407.25|1998-01-16|3-MEDIUM|Clerk#000000869|0|nal accounts. carefull +41058|1163|O|36574.04|1997-07-14|3-MEDIUM|Clerk#000000289|0|never requests. ideas use-- slow dolphi +41059|601|F|263747.01|1993-09-15|3-MEDIUM|Clerk#000000290|0|es. blithely regular deposits hang carefully after the furiously ironic ins +41060|1184|F|78717.54|1994-06-21|4-NOT SPECIFIED|Clerk#000000797|0|ding, even patterns haggle. pending accounts are furi +41061|1352|O|81050.47|1997-03-29|3-MEDIUM|Clerk#000000064|0|the quickly ironic theodolites +41062|1363|F|139079.93|1995-01-19|4-NOT SPECIFIED|Clerk#000000169|0|es alongside of the regular foxes wake blithely across t +41063|949|F|251832.44|1992-11-22|5-LOW|Clerk#000000580|0|inst the slyly regular instruc +41088|1171|O|15903.35|1998-04-30|3-MEDIUM|Clerk#000000283|0|equests haggle blithely. blithely bold packages sleep. requests wake +41089|332|O|61512.48|1998-07-22|2-HIGH|Clerk#000000945|0|ackages wake furiously silent theodol +41090|1291|F|117988.40|1994-04-08|5-LOW|Clerk#000000200|0|longside of the slyly pending ideas! requests cajole quickly thinly regular p +41091|811|F|114861.95|1994-05-25|3-MEDIUM|Clerk#000000750|0|o beans nag furiously +41092|301|O|122890.84|1997-07-17|2-HIGH|Clerk#000000877|0|luffily special accounts wake quickly quickly pending packages +41093|805|O|241983.73|1997-02-08|2-HIGH|Clerk#000000734|0|lithely after the blithely s +41094|1067|F|315556.30|1994-01-07|5-LOW|Clerk#000000721|0|t the carefully ironic platelets-- silent packages along the slyly r +41095|703|O|16837.28|1996-12-22|5-LOW|Clerk#000000792|0|pending accounts boost above the c +41120|905|F|185005.29|1992-07-08|5-LOW|Clerk#000000909|0|uests-- bold dugouts according to th +41121|541|O|53742.44|1996-06-25|5-LOW|Clerk#000000802|0|ns wake. furiously ironic instructions of the packages +41122|649|F|82118.57|1993-02-22|4-NOT SPECIFIED|Clerk#000000431|0|g to the carefully pending orbits. dependencies c +41123|299|F|170293.01|1993-12-07|5-LOW|Clerk#000000376|0|owly final courts wake carefully +41124|712|F|77871.43|1994-05-12|3-MEDIUM|Clerk#000000458|0|sly. busy packages wake blithely p +41125|1147|P|47396.29|1995-04-28|3-MEDIUM|Clerk#000000904|0|s. pinto beans across the ironic packages are slyly pending foxes. quickly +41126|733|O|56608.57|1998-04-02|2-HIGH|Clerk#000000856|0|permanent deposits! slyly pending dolphins sublate carefully against +41127|151|O|191925.10|1996-08-02|4-NOT SPECIFIED|Clerk#000000041|0|slyly. even asymptotes haggle blithely. blithely final t +41152|52|O|147617.84|1995-09-04|2-HIGH|Clerk#000000195|0|ns. slyly express escapades along the quickly bold dependencies sl +41153|412|F|101105.20|1994-03-03|3-MEDIUM|Clerk#000000877|0| to the fluffily iro +41154|1327|F|113779.62|1994-05-01|5-LOW|Clerk#000000316|0|old packages boost carefully accounts. special theodolit +41155|1324|O|61427.93|1996-04-15|4-NOT SPECIFIED|Clerk#000000606|0|ic asymptotes integrate; regular, express packages about the slyly +41156|382|O|43742.98|1998-04-13|5-LOW|Clerk#000000042|0|ng to the furiously ironic ideas sleep excuses. slyly ironic accounts shoul +41157|286|P|200911.20|1995-04-17|3-MEDIUM|Clerk#000000134|0|reach. blithely final ideas dazzle silent foxes. express gro +41158|949|O|187270.58|1996-04-01|4-NOT SPECIFIED|Clerk#000000541|0|accounts. ironic Tiresias sle +41159|575|O|10632.41|1996-10-29|1-URGENT|Clerk#000000369|0|ave to haggle furiously against the slyly express deposits. regular packages +41184|1085|O|133896.17|1995-09-23|2-HIGH|Clerk#000000618|0|yly blithely brave sheaves! blithely ironic accounts after the slyly regul +41185|265|F|181412.23|1994-12-07|1-URGENT|Clerk#000000489|0|ly silent gifts haggle b +41186|286|F|162714.19|1993-11-23|2-HIGH|Clerk#000000850|0|ng requests wake carefully. furiously regular requests +41187|1246|F|159450.50|1993-10-01|5-LOW|Clerk#000000218|0|requests wake carefully final packages. even accounts sleep carefully a +41188|1324|O|40608.95|1998-04-05|1-URGENT|Clerk#000000883|0|l ideas sleep carefully ironic, unusual hockey players. a +41189|1025|F|164944.25|1994-07-15|5-LOW|Clerk#000000885|0|nts boost furiously among the unusual, bold +41190|826|F|196007.29|1993-09-26|2-HIGH|Clerk#000000174|0|cross the packages. carefully special packages hinder blithely. +41191|791|O|251239.10|1998-03-03|2-HIGH|Clerk#000000538|0|ages affix about the furiously even pinto beans. closely qu +41216|235|F|69772.61|1994-07-02|4-NOT SPECIFIED|Clerk#000000692|0|s are slyly alongside of the +41217|307|O|50670.18|1995-07-14|2-HIGH|Clerk#000000795|0|cording to the final platelets dazzle carefully among +41218|1399|O|155689.43|1996-10-21|1-URGENT|Clerk#000000750|0|ole idly express asympt +41219|371|F|124208.07|1992-07-05|2-HIGH|Clerk#000000873|0|iously unusual request +41220|676|O|117159.48|1997-08-16|4-NOT SPECIFIED|Clerk#000000834|0|pinto beans cajole furiously idly pending acco +41221|991|F|46056.26|1994-09-13|1-URGENT|Clerk#000000162|0|inst the blithely unusual requests. packages use special +41222|527|O|60843.19|1998-03-23|2-HIGH|Clerk#000000009|0| slyly silent water +41223|1310|O|182070.61|1997-10-31|1-URGENT|Clerk#000000992|0|efully bold accounts are slyly express, ironic dependencies. ironic theodo +41248|1369|O|261184.35|1998-03-29|1-URGENT|Clerk#000000103|0| carefully sly pains along the slyly un +41249|575|O|150366.21|1998-04-25|3-MEDIUM|Clerk#000000861|0|ns whithout the unusual pinto beans ought to boost furiously unusual +41250|70|O|282077.63|1996-06-04|5-LOW|Clerk#000000265|0|cording to the blithely fluffy theodolites: p +41251|1207|O|106692.16|1998-02-21|1-URGENT|Clerk#000000131|0|es. final platelets around the silent +41252|1211|O|41784.97|1997-02-02|2-HIGH|Clerk#000000623|0|ckly silent patterns haggle furiously. slyly ironic acco +41253|538|F|237922.87|1994-05-08|3-MEDIUM|Clerk#000000721|0|ckly. carefully express foxes us +41254|1289|F|226000.65|1995-01-11|1-URGENT|Clerk#000000813|0|n accounts. deposits alongside of the slyly even accounts cajole furiousl +41255|1207|F|131337.82|1994-10-19|5-LOW|Clerk#000000881|0|inal requests. quickly final accounts boost slyly. blithely silent instru +41280|1309|O|79260.12|1996-09-05|3-MEDIUM|Clerk#000000556|0|fts sleep never after the pending ideas. carefully final platelets sleep b +41281|502|F|40592.94|1992-01-12|1-URGENT|Clerk#000000532|0| regular requests. carefully final pi +41282|206|F|160186.21|1994-07-05|3-MEDIUM|Clerk#000000226|0|ss pinto beans. ironic, ironic pinto beans cajole quickly courts. slyly silent +41283|631|O|181962.99|1996-03-25|2-HIGH|Clerk#000000796|0|ructions. furiously final deposits w +41284|598|O|195440.84|1998-07-22|1-URGENT|Clerk#000000277|0|riously express foxes. +41285|94|O|288986.16|1998-02-19|3-MEDIUM|Clerk#000000450|0|ffily ironic deposits cajole slyly. blithely pending dolphins haggle c +41286|806|F|215066.03|1992-09-17|3-MEDIUM|Clerk#000000881|0|. accounts against the qu +41287|191|O|92343.55|1996-03-12|4-NOT SPECIFIED|Clerk#000000457|0|counts. even theodolites wake slyly bold deposits. carefully regular deposits +41312|1004|F|203894.86|1992-02-01|4-NOT SPECIFIED|Clerk#000000415|0| deposits haggle quickly. slyly regular patterns wake pinto beans. sp +41313|1330|F|77310.03|1992-12-21|5-LOW|Clerk#000000773|0|ular, regular accounts. furiously ironic reque +41314|1096|O|250813.89|1997-05-07|2-HIGH|Clerk#000000070|0|ts across the quickly even packages boost blithely against the iron +41315|643|O|158796.21|1998-07-24|3-MEDIUM|Clerk#000000954|0|es. regular packages s +41316|179|F|231933.54|1994-07-22|4-NOT SPECIFIED|Clerk#000000894|0|oost furiously furiously even requests. quickly bold theodolites use dogged +41317|470|O|275436.21|1998-05-12|4-NOT SPECIFIED|Clerk#000000100|0|ly even accounts integr +41318|166|O|255514.00|1995-10-10|5-LOW|Clerk#000000924|0|ounts. accounts wake. special requests wake +41319|950|F|24925.80|1992-06-14|3-MEDIUM|Clerk#000000276|0|gedly above the regular deposits. express pinto beans sleep around the slyly +41344|193|F|31522.43|1992-04-14|1-URGENT|Clerk#000000498|0|ests. regular foxes are blithely final +41345|1306|F|214018.45|1992-02-03|3-MEDIUM|Clerk#000000679|0|y final waters haggle carefully among the +41346|884|O|42142.05|1997-02-10|5-LOW|Clerk#000000012|0|longside of the even accounts. furiously regular instruc +41347|725|F|115690.74|1993-10-06|4-NOT SPECIFIED|Clerk#000000345|0|detect permanently. silent foxes ar +41348|1339|O|140974.54|1996-11-19|3-MEDIUM|Clerk#000000383|0|ick asymptotes. dogged +41349|1298|O|166620.41|1995-12-18|1-URGENT|Clerk#000000232|0| ironic, ironic instructions. qu +41350|271|F|99858.06|1993-05-09|3-MEDIUM|Clerk#000000547|0|le quickly special requests; carefully special pattern +41351|250|F|147475.13|1993-09-24|4-NOT SPECIFIED|Clerk#000000151|0|sublate fluffily unusual, express deposits. ironic, special depos +41376|1270|F|177085.42|1992-12-13|3-MEDIUM|Clerk#000000900|0| boost doggedly final pla +41377|284|O|47684.45|1995-12-18|4-NOT SPECIFIED|Clerk#000000755|0|requests are slyly of the un +41378|664|F|92977.66|1992-10-30|4-NOT SPECIFIED|Clerk#000000096|0|kages unwind quietly even, ironic dolphins. blithely express theodolites again +41379|1384|F|222389.91|1993-02-17|5-LOW|Clerk#000000857|0|ses. deposits cajole. s +41380|506|O|188420.26|1998-05-04|4-NOT SPECIFIED|Clerk#000000463|0|egrate quickly. ironic sentiments a +41381|328|O|1006.33|1996-02-14|5-LOW|Clerk#000000760|0|ven, brave instructions wake. expr +41382|77|O|59737.67|1997-11-12|2-HIGH|Clerk#000000450|0|ecial ideas use furiously around the final, bold a +41383|943|F|117161.25|1993-05-13|5-LOW|Clerk#000000145|0| regular hockey players sleep blithely quickly bold asymptotes. idly bold ide +41408|224|O|219335.58|1995-08-19|4-NOT SPECIFIED|Clerk#000000116|0|ic pinto beans. carefully ev +41409|130|O|200338.61|1995-07-22|4-NOT SPECIFIED|Clerk#000000777|0|ular packages alongside of the furiously even accounts are fluffily reg +41410|215|F|1402.99|1992-04-21|2-HIGH|Clerk#000000558|0|ounts. express requests haggle blithely. req +41411|796|O|71331.76|1995-10-10|1-URGENT|Clerk#000000650|0|tructions detect. blithely final pinto beans are. +41412|320|F|151111.89|1994-09-18|4-NOT SPECIFIED|Clerk#000000808|0|y regular packages haggle regular, brave requ +41413|16|O|179630.05|1995-11-17|5-LOW|Clerk#000000868|0|regular packages are above the fu +41414|223|F|27900.62|1993-05-13|1-URGENT|Clerk#000000114|0|e carefully bold multipliers. blithel +41415|1150|F|278431.87|1994-11-11|5-LOW|Clerk#000000290|0|ments. blithely regular requests hinder quick +41440|1150|F|164083.66|1994-09-23|2-HIGH|Clerk#000000044|0|counts wake. furiously unusual ideas cajole furiou +41441|1420|F|70917.01|1992-01-24|3-MEDIUM|Clerk#000000078|0| silent pinto beans wake according to the carefully even courts. stealthi +41442|649|F|119866.91|1994-05-08|2-HIGH|Clerk#000000534|0|ar sheaves. carefully even excuses inte +41443|709|O|109455.80|1996-01-07|2-HIGH|Clerk#000000149|0|ly pending requests. slyly unusual requests boost a +41444|1057|O|46180.10|1998-06-20|5-LOW|Clerk#000000374|0|along the ironic ideas. +41445|61|O|392172.90|1996-02-08|4-NOT SPECIFIED|Clerk#000000411|0| theodolites haggle fluffily. special depos +41446|313|F|94981.03|1994-11-03|4-NOT SPECIFIED|Clerk#000000933|0|unts. blithely express pinto beans are blithely deposits? +41447|922|O|97153.94|1997-04-01|3-MEDIUM|Clerk#000000267|0|ly permanent ideas along the carefully even accounts boos +41472|296|F|173483.13|1993-01-24|5-LOW|Clerk#000000913|0|ending sauternes cajole carefully slyly +41473|80|O|42518.45|1997-09-29|4-NOT SPECIFIED|Clerk#000000349|0|regular hockey players boost. pinto beans sleep blithely abo +41474|584|F|172888.05|1994-04-21|4-NOT SPECIFIED|Clerk#000000510|0|ending excuses. ironic instructions cajole regularly quickly ironic ins +41475|1153|O|237168.38|1998-04-29|3-MEDIUM|Clerk#000000075|0| furiously quickly even re +41476|395|F|201614.30|1993-06-01|2-HIGH|Clerk#000000749|0|he blithely regular accounts. quickly silent requests are. furiously regular +41477|1027|O|75284.14|1998-04-26|1-URGENT|Clerk#000000208|0|beans cajole regular, final foxes. slyl +41478|722|O|26372.21|1996-12-04|1-URGENT|Clerk#000000694|0|ckly regular platelets wake fur +41479|677|F|38851.41|1994-04-28|4-NOT SPECIFIED|Clerk#000000070|0|excuses above the furiously regular accounts doze blithely around the spe +41504|1426|F|193785.71|1992-10-29|1-URGENT|Clerk#000000807|0|nstructions-- regular, sly requests wake ironic, regular patterns. the +41505|1102|F|173788.68|1993-04-28|5-LOW|Clerk#000000242|0|d accounts boost across the fi +41506|1355|O|198063.24|1996-08-14|1-URGENT|Clerk#000000402|0|posits about the ironic requests are carefully among the pending foxes. +41507|706|F|30713.45|1993-10-28|1-URGENT|Clerk#000000645|0|xpress foxes cajole blithely about the final waters. carefully quick de +41508|1150|F|243633.07|1993-09-25|2-HIGH|Clerk#000000938|0|final instructions. blithely iron +41509|113|F|35769.97|1993-11-27|2-HIGH|Clerk#000000047|0|always carefully regular dependencies. bol +41510|616|F|19506.76|1992-01-31|4-NOT SPECIFIED|Clerk#000000458|0|ove the asymptotes are blithely fluffily regular theo +41511|610|F|119648.72|1994-10-01|3-MEDIUM|Clerk#000000685|0|s. fluffily special theodolites alongside of the special packages +41536|727|O|219779.01|1996-09-05|1-URGENT|Clerk#000000685|0| slyly pending requests ag +41537|520|O|167542.25|1996-11-06|5-LOW|Clerk#000000039|0|onic accounts. furiously regular ideas wake furiously. quic +41538|1048|O|45280.30|1996-10-25|4-NOT SPECIFIED|Clerk#000000777|0|ully ironic packages poach carefully after the slyly reg +41539|746|P|259340.26|1995-05-04|2-HIGH|Clerk#000000071|0| the slowly ironic accounts. quickly final requests c +41540|338|O|279449.03|1996-12-29|2-HIGH|Clerk#000000059|0|nusual pinto beans sleep. fluffil +41541|329|O|209428.83|1996-11-18|2-HIGH|Clerk#000000164|0|s haggle daringly. carefu +41542|805|F|106965.29|1994-09-27|2-HIGH|Clerk#000000374|0|refully. regular, regular ins +41543|1462|F|231265.53|1994-02-07|5-LOW|Clerk#000000052|0|final ideas cajole quickly closely bol +41568|1219|F|6802.69|1993-06-16|4-NOT SPECIFIED|Clerk#000000677|0|e packages. special deposi +41569|1045|F|181929.53|1993-07-22|1-URGENT|Clerk#000000685|0|wake bravely deposits. final, even reques +41570|197|F|210362.74|1993-12-04|4-NOT SPECIFIED|Clerk#000000717|0|l deposits above the blithely even requests doubt quickly silent deposits. r +41571|659|P|208679.19|1995-06-07|5-LOW|Clerk#000000645|0|o beans cajole requests. careful requests nag furiously about the +41572|815|O|225125.03|1997-03-04|3-MEDIUM|Clerk#000000236|0|refully final requests. bold warthogs use carefully. +41573|284|O|204906.98|1996-02-29|4-NOT SPECIFIED|Clerk#000000102|0|even pinto beans. carefully pending packages u +41574|289|F|167928.81|1993-09-21|2-HIGH|Clerk#000000800|0|posits nag. ironic frets about the final requests are quickly blithely iron +41575|373|O|211618.78|1997-08-19|2-HIGH|Clerk#000000054|0|ding to the platelets. blithely even requests sleep. +41600|4|O|192516.42|1997-04-06|2-HIGH|Clerk#000000199|0|ly. regular instructions haggle fluffily regular es +41601|310|F|101691.70|1994-10-04|3-MEDIUM|Clerk#000000362|0|rts boost furiously evenly regular p +41602|295|O|59301.18|1995-08-14|3-MEDIUM|Clerk#000000238|0|unts run furiously carefully even pinto beans: accounts cajole furiously +41603|203|O|85191.24|1997-07-19|1-URGENT|Clerk#000000297|0|ests sleep doggedly stealthily final foxes. furiously bold packages +41604|377|F|34489.47|1994-02-11|3-MEDIUM|Clerk#000000612|0|lyly patterns. quickly fin +41605|1075|F|48020.52|1993-12-26|3-MEDIUM|Clerk#000000766|0|rave, regular packages sleep slyly ideas. slyly unusual as +41606|700|F|159610.71|1994-06-24|2-HIGH|Clerk#000000957|0|y. final instructions sleep among the blithely ironic +41607|205|F|195175.13|1994-12-20|3-MEDIUM|Clerk#000000617|0| carefully regular accounts integrate boldly regular accounts. dogged +41632|1163|F|162265.12|1993-12-02|5-LOW|Clerk#000000815|0|doubt quickly! iron +41633|1153|F|159408.89|1993-11-10|5-LOW|Clerk#000000508|0|ccording to the silent deposits haggle theodolites. furi +41634|1085|F|231812.88|1992-12-09|4-NOT SPECIFIED|Clerk#000000303|0|ickly ironic requests wake furiously +41635|196|F|111917.08|1993-08-28|3-MEDIUM|Clerk#000000924|0|counts run slyly. regu +41636|1136|F|248800.09|1994-08-15|1-URGENT|Clerk#000000648|0|l accounts was quickly fluffily regular excuses. furiously final orbit +41637|535|F|165476.72|1993-05-06|4-NOT SPECIFIED|Clerk#000000453|0| unusual dependencies. furiously bold instructions sleep quickly aga +41638|1435|F|61282.52|1993-05-22|4-NOT SPECIFIED|Clerk#000000125|0| blithely regular frets. quickly ironic platelets doubt around the r +41639|830|O|161595.15|1996-03-16|1-URGENT|Clerk#000000926|0|arefully slow asymptotes. unusual, ironic +41664|1345|O|61667.39|1995-12-05|1-URGENT|Clerk#000000301|0|y about the blithel +41665|1303|O|120739.32|1996-07-15|2-HIGH|Clerk#000000141|0|ainst the quickly pending requests. quickly silent ideas boost slyly +41666|661|F|210742.99|1992-03-04|3-MEDIUM|Clerk#000000177|0|s cajole above the +41667|77|F|188975.01|1992-06-21|2-HIGH|Clerk#000000213|0|nic courts. fluffily bold +41668|1318|O|1317.77|1996-05-08|5-LOW|Clerk#000000905|0|s! slyly express dolphins doz +41669|1492|O|151154.25|1997-11-15|4-NOT SPECIFIED|Clerk#000000325|0|ironic deposits wake quickly. carefully regular +41670|998|O|125935.83|1996-08-22|1-URGENT|Clerk#000000191|0|arefully final deposits. +41671|487|F|112129.35|1992-12-04|1-URGENT|Clerk#000000633|0|besides the unusual accounts are carefully a +41696|1486|F|46317.29|1994-07-14|4-NOT SPECIFIED|Clerk#000000097|0| nag alongside of the requests. blithely final instructio +41697|865|O|130361.46|1996-12-17|2-HIGH|Clerk#000000648|0|al sentiments. furiously regula +41698|491|O|5532.94|1998-03-28|1-URGENT|Clerk#000000301|0|final theodolites among the regular requests haggl +41699|325|F|30799.22|1993-01-31|2-HIGH|Clerk#000000650|0| carefully. blithely bold packages boost! pending, final foxes +41700|613|O|201610.13|1997-06-28|4-NOT SPECIFIED|Clerk#000000534|0|thrash. slyly even pinto beans would haggle quickly after the +41701|43|O|163797.93|1997-02-26|5-LOW|Clerk#000000297|0|sual ideas haggle slyly among the pending requests. fluffily bo +41702|1180|F|172991.16|1993-12-23|4-NOT SPECIFIED|Clerk#000000493|0|ously-- foxes sleep: +41703|181|F|208313.64|1992-05-08|4-NOT SPECIFIED|Clerk#000000734|0|bout the packages. furiously unusual requests cajole slyly slyly regular a +41728|79|F|334328.33|1994-10-01|2-HIGH|Clerk#000000742|0|ependencies cajole f +41729|1435|F|6764.61|1993-01-22|2-HIGH|Clerk#000000352|0|he final theodolites sleep acco +41730|812|O|171065.06|1996-11-17|1-URGENT|Clerk#000000101|0|into beans are slyly across the fluffily unusual instructions. spec +41731|1499|O|28436.09|1996-04-05|2-HIGH|Clerk#000000983|0|uickly final realms: express theodolite +41732|139|F|98374.05|1994-08-10|4-NOT SPECIFIED|Clerk#000000679|0|lithely pending deposits. furiousl +41733|650|O|47215.31|1997-11-17|4-NOT SPECIFIED|Clerk#000000575|0| integrate sometimes bold dependen +41734|280|F|177516.01|1993-12-20|3-MEDIUM|Clerk#000000936|0|er the furiously special packages. blithely regular foxes are along the p +41735|1211|O|60952.16|1996-09-03|4-NOT SPECIFIED|Clerk#000000497|0|ong the quickly bold +41760|463|F|230987.59|1992-01-28|5-LOW|Clerk#000000154|0|nstructions use slyly +41761|649|O|66631.43|1998-06-05|5-LOW|Clerk#000000010|0|ar requests. carefully even accounts after the care +41762|1427|O|125047.14|1997-04-05|5-LOW|Clerk#000000673|0|ickly final foxes. blithely final ac +41763|319|F|120099.25|1993-06-11|4-NOT SPECIFIED|Clerk#000000277|0| pinto beans sleep! blithely iro +41764|299|F|202689.10|1994-10-06|4-NOT SPECIFIED|Clerk#000000539|0|lose packages doze against the carefully silent deposits. carefully ev +41765|1055|F|194186.07|1994-12-10|3-MEDIUM|Clerk#000000945|0|slyly pending deposi +41766|349|F|266358.29|1992-09-12|1-URGENT|Clerk#000000292|0|ar somas wake furiously carefully even deposits. furiously bold deposits n +41767|1375|F|147288.49|1994-07-21|2-HIGH|Clerk#000000656|0| the furiously silent foxes c +41792|1015|O|41431.18|1997-07-15|4-NOT SPECIFIED|Clerk#000000482|0| final asymptotes poach slyly abo +41793|466|F|166121.32|1994-05-16|2-HIGH|Clerk#000000547|0|ounts according to the carefully +41794|340|P|169790.75|1995-05-28|1-URGENT|Clerk#000000989|0|inal requests? packages wake carefully. furiously special +41795|469|O|83857.96|1996-09-16|5-LOW|Clerk#000000269|0|to beans. fluffily bold asymptotes ca +41796|1264|O|19622.59|1998-01-16|4-NOT SPECIFIED|Clerk#000000533|0|the bold, special deposits haggl +41797|757|O|110033.71|1996-04-04|3-MEDIUM|Clerk#000000139|0|s; furiously silent packages against the regular i +41798|769|F|166409.86|1992-11-11|5-LOW|Clerk#000000619|0|express packages-- accounts sleep blithely. carefully un +41799|560|F|53175.52|1994-06-24|2-HIGH|Clerk#000000781|0|latelets. carefully bold accounts a +41824|1057|F|229043.09|1993-07-05|4-NOT SPECIFIED|Clerk#000000902|0|unts. express ideas +41825|805|F|120577.78|1994-08-23|1-URGENT|Clerk#000000822|0|. special requests about the quickly ironic asymptotes bo +41826|488|F|228377.99|1993-10-17|3-MEDIUM|Clerk#000000142|0| maintain bold, final requests. slyly express reque +41827|670|O|50290.25|1995-12-04|2-HIGH|Clerk#000000392|0|accounts cajole furiously regular a +41828|962|O|12743.81|1996-11-06|4-NOT SPECIFIED|Clerk#000000218|0|ccounts can sleep around the even packages. ironic excu +41829|589|O|238845.97|1997-10-27|4-NOT SPECIFIED|Clerk#000000549|0|ymptotes. furiously regular hockey players haggle bli +41830|1303|F|188418.63|1992-02-18|5-LOW|Clerk#000000470|0|ly even packages. fl +41831|878|F|196085.89|1992-07-22|4-NOT SPECIFIED|Clerk#000000259|0|ly even attainments above the requests wake carefully after the qu +41856|1213|F|57945.37|1993-09-01|2-HIGH|Clerk#000000074|0|onic instructions mold slyly about the slyly +41857|256|O|145685.01|1995-05-07|5-LOW|Clerk#000000663|0|posits haggle regularly against the regularly unusual requests. quickly +41858|1099|O|291456.33|1997-12-04|4-NOT SPECIFIED|Clerk#000000643|0|es. slyly busy accounts above t +41859|583|O|105631.04|1997-02-18|5-LOW|Clerk#000000510|0|. fluffily regular packages caj +41860|545|O|47006.68|1997-05-11|4-NOT SPECIFIED|Clerk#000000883|0|uests integrate against the ideas. furiously unusual +41861|520|F|259149.04|1993-11-27|5-LOW|Clerk#000000889|0|equests. regular packages against the furiously regular instru +41862|1153|O|215341.05|1997-01-29|4-NOT SPECIFIED|Clerk#000000669|0|ently pending asymptotes +41863|286|O|105074.81|1996-01-07|1-URGENT|Clerk#000000938|0|maintain? unusual, bold deposits haggle express, unusual packages. furio +41888|1312|F|217920.17|1994-03-01|5-LOW|Clerk#000000272|0|lites at the ironic +41889|812|F|258897.46|1994-09-12|5-LOW|Clerk#000000998|0|regular requests boost furiously regular, final deposi +41890|740|F|190647.36|1992-12-26|3-MEDIUM|Clerk#000000125|0|ffix slyly. blithely even +41891|655|O|249581.65|1995-05-23|2-HIGH|Clerk#000000848|0|theodolites wake along the unusual deposits. special asymptotes haggle slyly a +41892|14|O|226644.40|1996-07-21|1-URGENT|Clerk#000000378|0|the express packages cajole blithely +41893|439|O|80080.92|1996-04-05|1-URGENT|Clerk#000000567|0|ickly ironic pinto beans among the carefully final packages +41894|1057|O|39698.90|1998-07-04|3-MEDIUM|Clerk#000000947|0|ndencies boost slowly among the regular, unusual packages. final, +41895|910|F|86944.66|1995-01-11|1-URGENT|Clerk#000000303|0|le quickly against the quickly ironic pinto beans! quickly fin +41920|287|O|91325.27|1998-07-16|2-HIGH|Clerk#000000286|0| have to wake blithely. furiously final foxes alongside of the fluffily final +41921|1070|F|113515.74|1992-02-24|3-MEDIUM|Clerk#000000386|0|ts. platelets sleep. sl +41922|1324|F|153818.92|1993-10-01|3-MEDIUM|Clerk#000000234|0|otes. ironic deposits wake regular deposits. blithely final packages ar +41923|962|O|194384.43|1996-07-22|4-NOT SPECIFIED|Clerk#000000751|0|jole quickly about the ironic package +41924|685|O|73963.72|1995-05-26|5-LOW|Clerk#000000449|0|ly furiously final reques +41925|1394|O|43424.03|1997-02-24|1-URGENT|Clerk#000000259|0| deposits. furiously special pac +41926|67|F|187187.43|1995-02-06|2-HIGH|Clerk#000000672|0| nag carefully after the furiously express asymptotes. furiousl +41927|251|F|42496.72|1992-07-14|4-NOT SPECIFIED|Clerk#000000790|0|ages. slyly express accounts are carefull +41952|1361|F|193533.08|1993-07-30|5-LOW|Clerk#000000220|0|lithely slyly even theodolites. quickly ironic asymptotes ha +41953|712|O|43242.72|1997-09-06|4-NOT SPECIFIED|Clerk#000000860|0|e fluffily regular instructions haggle about the quiet +41954|205|O|95590.50|1996-05-06|2-HIGH|Clerk#000000623|0|ully. silent, regular packages boost slyly fina +41955|121|P|296787.08|1995-04-02|4-NOT SPECIFIED|Clerk#000000744|0|liers use slyly fur +41956|1339|O|169333.77|1995-12-13|3-MEDIUM|Clerk#000000710|0|tes doubt furiously a +41957|878|O|253592.57|1997-12-28|3-MEDIUM|Clerk#000000995|0|otes cajole furiously! even courts are busily. carefully even +41958|1258|O|248777.88|1997-05-25|4-NOT SPECIFIED|Clerk#000000889|0|st carefully regular pinto beans. doggedly even ideas use fur +41959|479|F|113460.41|1993-04-29|1-URGENT|Clerk#000000761|0|ickly pending theodolites. quickly fluffy a +41984|202|O|188020.58|1997-01-31|2-HIGH|Clerk#000000372|0| hinder around the regular packages. carefully stealthy packages wake regula +41985|73|O|186193.73|1996-07-12|4-NOT SPECIFIED|Clerk#000000541|0|lyly pending theodolites. regu +41986|826|F|101202.18|1993-02-14|2-HIGH|Clerk#000000026|0|he carefully pending d +41987|505|O|136076.39|1995-10-22|4-NOT SPECIFIED|Clerk#000000085|0|uriously special excuses run alon +41988|1210|F|311540.69|1994-02-05|5-LOW|Clerk#000000291|0|ipliers are furiously pending deposits. unusual, quick foxes u +41989|358|F|63076.20|1993-04-10|2-HIGH|Clerk#000000991|0|instructions x-ray furiously alongside of +41990|295|O|220305.51|1997-06-08|1-URGENT|Clerk#000000353|0|tegrate among the quickly regular plat +41991|361|O|232000.93|1995-12-19|5-LOW|Clerk#000000637|0|l deposits cajole quickly final +42016|1195|F|192314.50|1993-07-19|3-MEDIUM|Clerk#000000996|0|eans wake blithely above the carefully express braids. regular theodo +42017|494|P|112425.74|1995-06-01|2-HIGH|Clerk#000000020|0|requests cajole even, pending pinto beans. doggedly unusua +42018|1367|O|114610.01|1996-09-25|3-MEDIUM|Clerk#000000674|0|ges are slyly final, quiet accounts. furiously final accou +42019|449|O|51485.13|1997-05-29|2-HIGH|Clerk#000000198|0|uffy foxes impress fluffily. furiously regular dependenc +42020|1249|O|106416.69|1995-03-21|3-MEDIUM|Clerk#000000761|0|counts are requests. platelets boost blithely furiously regular pinto beans +42021|883|O|213812.97|1996-06-14|4-NOT SPECIFIED|Clerk#000000387|0|ect evenly furiously bold packages. final epitaphs are thinly. regular a +42022|980|F|68468.25|1994-09-25|3-MEDIUM|Clerk#000000141|0|ic packages hinder fur +42023|706|F|143353.69|1992-09-21|2-HIGH|Clerk#000000800|0|fily regular packages can wake expr +42048|1025|O|235749.84|1995-10-10|5-LOW|Clerk#000000439|0| blithely regular theodolites are blithely. requests detect blithely pendi +42049|563|O|66879.08|1997-08-10|4-NOT SPECIFIED|Clerk#000000984|0|sly special instructions. carefully even +42050|1346|F|40058.30|1995-03-31|5-LOW|Clerk#000000019|0|lar dependencies wake idle pinto beans. quickly bold packages +42051|1148|F|99835.58|1992-10-05|4-NOT SPECIFIED|Clerk#000000629|0|g to the ironic excuses +42052|259|O|174987.78|1995-07-04|1-URGENT|Clerk#000000831|0|ironic accounts sleep slyly alongside of the even instructions: slyly +42053|400|O|205935.74|1997-06-28|4-NOT SPECIFIED|Clerk#000000737|0| quickly regular pl +42054|13|F|191967.00|1992-09-15|3-MEDIUM|Clerk#000000631|0|slyly accounts. furiously final asymptotes acc +42055|700|O|136932.94|1996-01-18|3-MEDIUM|Clerk#000000760|0|ely final packages among the carefully regular pinto +42080|599|O|71963.40|1996-07-25|5-LOW|Clerk#000000257|0|se fluffily. regular ideas was about the express, even theodolites. slyly pend +42081|1027|F|261637.34|1995-01-11|5-LOW|Clerk#000000122|0|yly final requests use +42082|1324|O|246125.84|1995-12-19|1-URGENT|Clerk#000000207|0|egular accounts. fur +42083|175|O|145290.24|1995-12-12|1-URGENT|Clerk#000000549|0|arefully final packages cajole furiously blithely ironic theodolites. bo +42084|724|O|296643.86|1997-02-15|2-HIGH|Clerk#000000020|0| deposits cajole furiously. fur +42085|418|O|155819.91|1998-06-27|5-LOW|Clerk#000000290|0|lets. silent asymptotes are furiously. f +42086|1303|F|11155.72|1993-07-23|2-HIGH|Clerk#000000195|0| quickly special deposits snooze s +42087|433|O|177171.30|1997-04-08|4-NOT SPECIFIED|Clerk#000000470|0|bout the quiet accounts haggle after the carefully regular accou +42112|649|F|151382.96|1993-12-25|4-NOT SPECIFIED|Clerk#000000522|0|egular asymptotes. ironic packages cajole. quick +42113|748|F|24584.71|1994-02-21|5-LOW|Clerk#000000902|0| across the carefully final courts! even, silent theodolites boost carefu +42114|362|O|47587.21|1997-02-16|4-NOT SPECIFIED|Clerk#000000423|0| pending packages. bold, final depende +42115|323|F|205717.74|1992-02-19|1-URGENT|Clerk#000000867|0|. foxes nag closely unusual instructions: quickly pending foxes believe +42116|587|O|121962.31|1996-09-03|2-HIGH|Clerk#000000031|0|s sleep. pending ideas sleep slyly above the furiously spe +42117|442|F|156893.29|1995-02-19|2-HIGH|Clerk#000000846|0|ly regular ideas affix. regular accounts cajole. daringly express theodolites +42118|1324|O|205348.87|1996-07-20|2-HIGH|Clerk#000000930|0|aggle beside the regular, regula +42119|838|O|146508.87|1998-02-14|2-HIGH|Clerk#000000019|0|final excuses-- final, bold requ +42144|208|F|179959.65|1994-11-13|3-MEDIUM|Clerk#000000787|0|nag slyly furiously bold accounts. regular dependencies above the furiously ir +42145|679|O|152689.31|1997-11-18|1-URGENT|Clerk#000000867|0|s pinto beans cajole furiously final pinto +42146|734|O|80141.06|1998-01-28|3-MEDIUM|Clerk#000000299|0|are around the instructi +42147|278|O|211785.09|1997-06-14|1-URGENT|Clerk#000000243|0|its haggle furiously according +42148|317|O|226163.07|1995-10-21|1-URGENT|Clerk#000000650|0| regular requests. ironic, +42149|1123|O|40570.19|1996-04-08|2-HIGH|Clerk#000000517|0|o cajole furiously among the furiously t +42150|1022|O|221151.68|1997-12-19|5-LOW|Clerk#000000129|0|latelets sleep even ideas. dependencies against +42151|640|F|60195.65|1993-12-16|2-HIGH|Clerk#000000457|0|nticing packages use around the express requests. ironic accounts haggle +42176|340|O|268730.83|1998-01-26|3-MEDIUM|Clerk#000000526|0|fily at the furiously even ideas. blithely unus +42177|694|F|121439.49|1992-05-31|4-NOT SPECIFIED|Clerk#000000837|0|nts boost unusual, pending accounts. furiously final dugouts sleep blithel +42178|61|F|82424.10|1993-06-24|3-MEDIUM|Clerk#000000784|0|ntly special ideas nag blithely about the dolphins. pending packages are +42179|637|O|240334.35|1996-04-16|1-URGENT|Clerk#000000197|0| ideas. pending requests haggle blithely. +42180|1126|O|121307.67|1997-07-27|3-MEDIUM|Clerk#000000435|0|instructions sleep furiously according to the quickly regular excuses. pinto b +42181|289|O|132220.11|1995-10-18|5-LOW|Clerk#000000397|0|ily final deposits sleep above the ironic courts. +42182|1151|F|12620.56|1993-06-30|1-URGENT|Clerk#000000629|0|sly furiously special accounts. slyly regular excuses haggle along +42183|628|O|29819.40|1998-02-01|4-NOT SPECIFIED|Clerk#000000313|0|xpress foxes. carefully final accounts haggle blithely. furiou +42208|881|F|122520.18|1992-12-21|3-MEDIUM|Clerk#000000151|0|anent deposits wake silent instructions. quickly regular req +42209|580|F|234177.63|1993-03-30|2-HIGH|Clerk#000000650|0|ess carefully. carefully thin instructi +42210|1255|F|44663.26|1994-04-22|3-MEDIUM|Clerk#000000593|0|print. ironic, silent ideas nag above the blithely special accounts. f +42211|892|F|272272.67|1992-06-22|2-HIGH|Clerk#000000146|0|e. final ideas affix carefully fluffily quick platelets; quietly unusual foxes +42212|29|F|254173.13|1992-04-23|2-HIGH|Clerk#000000498|0|ses. pending warthogs cajole against +42213|1133|P|100844.12|1995-03-22|1-URGENT|Clerk#000000897|0|ar packages was carefully. requests cajole along the unusu +42214|784|P|304313.61|1995-05-25|5-LOW|Clerk#000000030|0|pending platelets nag carefully regular packages? final, unusual packages sle +42215|935|F|65297.35|1993-11-04|3-MEDIUM|Clerk#000000073|0|lly ironic requests. blith +42240|1076|O|251507.89|1996-03-16|5-LOW|Clerk#000000507|0|refully ironic courts nag doggedly ironic requests. blithely regular packa +42241|194|F|177376.48|1992-04-24|5-LOW|Clerk#000000515|0|ly final accounts. quickly ironic deposits are slyly! quickly final pinto +42242|697|F|223322.68|1994-04-02|4-NOT SPECIFIED|Clerk#000000587|0|its are. silent, regular deposits are carefully at the slyly final pinto beans +42243|487|F|108072.84|1992-03-12|3-MEDIUM|Clerk#000000101|0|ckly regular ideas: furiously bold d +42244|694|O|61936.30|1998-05-13|4-NOT SPECIFIED|Clerk#000000884|0|al accounts unwind regular theodolites. idly bo +42245|646|O|258594.57|1997-05-13|5-LOW|Clerk#000000094|0|g quickly about the blithely even platelets. furiously even requests af +42246|259|F|226996.76|1992-04-27|4-NOT SPECIFIED|Clerk#000000973|0|lar ideas integrate instructions: dependencies haggle furiously reg +42247|725|O|10065.27|1996-09-30|3-MEDIUM|Clerk#000000618|0|tes use quickly slyly bold sheaves-- carefully even pinto bea +42272|1160|O|111938.44|1995-11-20|3-MEDIUM|Clerk#000000685|0| final accounts sleep about the regular theodolites. car +42273|28|O|54212.39|1996-10-20|1-URGENT|Clerk#000000930|0| blithely final pinto beans. iron +42274|127|O|134007.28|1995-09-04|2-HIGH|Clerk#000000293|0|uriously final theodolites +42275|1111|F|24923.17|1992-11-04|3-MEDIUM|Clerk#000000884|0|ironic courts against the blithel +42276|851|F|41982.89|1994-07-21|5-LOW|Clerk#000000101|0|ake fluffily after the silent, furious dependencies! i +42277|1345|O|189670.35|1997-02-05|1-URGENT|Clerk#000000989|0| regular foxes kindle slyly requests. accounts haggle sl +42278|322|O|156740.20|1995-06-09|3-MEDIUM|Clerk#000000470|0| ironic requests haggle. carefully regular account +42279|701|F|170919.94|1994-07-01|4-NOT SPECIFIED|Clerk#000000914|0|ests use alongside of the blithely even asymptotes. fluffily bol +42304|361|F|203267.01|1994-03-14|4-NOT SPECIFIED|Clerk#000000037|0| regular packages. express platelets cajole carefully. unusual rea +42305|925|O|38110.36|1998-02-18|2-HIGH|Clerk#000000752|0|deposits sleep fluffily against the furiously unusual requests. furiously iro +42306|1285|F|286380.27|1992-09-15|2-HIGH|Clerk#000000477|0|ly requests wake across the final dependencies: blithely express reque +42307|1426|O|249202.30|1998-03-07|4-NOT SPECIFIED|Clerk#000000118|0|bout the furiously even platelets. quickly s +42308|133|F|109759.96|1994-06-13|3-MEDIUM|Clerk#000000521|0|s boost. stealthily ironic packages boost care +42309|643|F|184021.24|1994-08-07|5-LOW|Clerk#000000852|0|sual, even requests. daringly silent deposits accordin +42310|679|F|133933.20|1994-07-22|1-URGENT|Clerk#000000011|0|ial accounts doze sly requests. silently ironic accounts enga +42311|1165|O|250551.30|1998-07-17|2-HIGH|Clerk#000000942|0|cuses are blithely across the express accounts. slyly ironic +42336|1069|F|100468.97|1992-05-04|2-HIGH|Clerk#000000933|0|lar packages haggle furiously ironic, brave depos +42337|262|O|223396.25|1996-01-07|1-URGENT|Clerk#000000941|0| regular requests are above the slyly unusual deposits. regular, regu +42338|23|F|206276.32|1994-11-03|4-NOT SPECIFIED|Clerk#000000786|0| blithely. special packages wake special platelets. re +42339|1228|F|145891.05|1994-02-13|1-URGENT|Clerk#000000320|0|posits detect quickly along the asy +42340|1426|F|24661.74|1992-06-21|2-HIGH|Clerk#000000228|0|nt deposits. carefully regular request +42341|448|O|41621.21|1996-07-09|5-LOW|Clerk#000000926|0| must sleep along th +42342|68|F|160932.08|1994-09-05|4-NOT SPECIFIED|Clerk#000000472|0|ajole furiously about the regular, express theodolites. instructions e +42343|1126|F|93512.07|1994-08-15|1-URGENT|Clerk#000000236|0| pending courts. blithely e +42368|874|O|114715.96|1995-11-11|1-URGENT|Clerk#000000832|0| asymptotes. careful, regular deposits +42369|1403|F|183415.61|1993-08-06|1-URGENT|Clerk#000000223|0|ccounts. final packages wake slyly against the re +42370|889|O|67762.30|1995-11-22|2-HIGH|Clerk#000000631|0|s accounts haggle furiously quickly ironic requests! +42371|1115|O|15203.11|1996-02-08|1-URGENT|Clerk#000000778|0|theodolites. regular, regular +42372|580|O|155856.79|1996-04-24|5-LOW|Clerk#000000477|0|osits. furiously ironic pinto beans about the pinto beans haggle s +42373|790|O|223628.73|1995-08-18|4-NOT SPECIFIED|Clerk#000000967|0|gainst the daringly pending excuses. bli +42374|632|F|126749.68|1992-07-18|1-URGENT|Clerk#000000594|0|ites. requests sleep. i +42375|334|F|137732.03|1993-10-02|2-HIGH|Clerk#000000728|0| enticing deposits. blithely final theodolites ar +42400|1172|F|169406.79|1992-08-10|5-LOW|Clerk#000000089|0| even deposits? dolphins integ +42401|1430|O|177519.69|1996-09-16|3-MEDIUM|Clerk#000000259|0|ar, final requests nag. asymptotes wake-- unusual +42402|178|F|61861.20|1992-08-13|5-LOW|Clerk#000000963|0|inal requests. accounts eat furiously in place +42403|1226|F|227209.59|1994-06-21|4-NOT SPECIFIED|Clerk#000000176|0|refully bold accounts wake? slyly ironic instructions +42404|1040|O|36134.47|1997-10-02|1-URGENT|Clerk#000000996|0|ccounts. blithely silent deposits dazzle quickly. even sentiments wa +42405|919|F|187594.14|1993-01-22|2-HIGH|Clerk#000000771|0|ependencies wake carefully. carefully bold requests haggle +42406|1036|O|99280.03|1995-12-29|5-LOW|Clerk#000000735|0|onic, regular ideas use. carefully express deposits affix slyly ag +42407|1337|O|100056.50|1997-01-08|3-MEDIUM|Clerk#000000219|0|ly furiously final accounts: blithely ironic accounts mainta +42432|949|F|66146.21|1993-09-17|2-HIGH|Clerk#000000529|0|s wake fluffily. unusu +42433|1405|F|138174.99|1993-01-30|3-MEDIUM|Clerk#000000047|0|ly final requests. slyly +42434|881|O|152228.17|1998-01-16|2-HIGH|Clerk#000000770|0|efully even deposits. regular requests sleep slyly; furiously +42435|181|O|84012.86|1997-11-03|5-LOW|Clerk#000000244|0| final, pending requests. busy ideas cajole slyly about the pe +42436|61|F|128804.85|1992-08-10|1-URGENT|Clerk#000000145|0|fter the daring, quick deposits. slyly special requests hagg +42437|181|F|11173.66|1992-03-06|1-URGENT|Clerk#000000280|0|ies cajole among the blithely quick foxe +42438|274|O|308306.22|1997-11-16|1-URGENT|Clerk#000000234|0|nto beans. pending, special pa +42439|358|F|240623.35|1993-06-20|4-NOT SPECIFIED|Clerk#000000316|0| blithely regular pains. quickly bold deposits wa +42464|742|O|89772.53|1998-01-07|1-URGENT|Clerk#000000105|0|s. blithely ironic decoys +42465|523|F|64889.50|1993-12-22|3-MEDIUM|Clerk#000000738|0|y sly instructions: carefully f +42466|628|F|35441.48|1994-04-22|3-MEDIUM|Clerk#000000733|0| the quickly regular requests. furiousl +42467|1288|F|154214.78|1993-10-15|2-HIGH|Clerk#000000718|0|e carefully. furiously enticing packages boost slyly. slyly express inst +42468|1013|F|53705.49|1993-04-23|1-URGENT|Clerk#000000344|0| deposits are quickly busy ideas. quick +42469|937|F|204615.32|1992-11-09|4-NOT SPECIFIED|Clerk#000000309|0| requests dazzle carefully. +42470|1471|O|182612.13|1998-06-10|5-LOW|Clerk#000000038|0|counts mold blithely. quickly bold accounts was fluffily. regular, eve +42471|683|F|299163.99|1992-03-10|5-LOW|Clerk#000000167|0|foxes nag after the instructions: express e +42496|976|O|43795.27|1997-01-28|4-NOT SPECIFIED|Clerk#000000218|0|al foxes use at the sl +42497|751|O|79435.22|1996-04-28|1-URGENT|Clerk#000000483|0|y across the deposits. bold theodolit +42498|235|F|77799.45|1993-01-29|5-LOW|Clerk#000000805|0|al dolphins. bold, unusual pa +42499|428|O|38027.66|1995-08-24|5-LOW|Clerk#000000031|0| even requests haggle about the carefully special deposits. furiously +42500|724|F|126430.32|1993-02-06|4-NOT SPECIFIED|Clerk#000000992|0|gedly ironic deposits print ir +42501|91|F|235558.61|1992-11-14|1-URGENT|Clerk#000000357|0|ounts along the special, +42502|1411|O|19309.05|1997-05-20|3-MEDIUM|Clerk#000000408|0|fully even accounts cajole +42503|1439|O|192780.82|1996-12-04|2-HIGH|Clerk#000000287|0|ding platelets breach requests. dependencies doubt. even, ruthless deposits +42528|862|F|235325.35|1993-02-24|3-MEDIUM|Clerk#000000457|0|its cajole furiously ruthless accounts. ruthle +42529|745|F|178771.33|1993-10-11|5-LOW|Clerk#000000283|0|? quickly pending packa +42530|1000|O|241674.70|1997-04-10|2-HIGH|Clerk#000000529|0|s among the packages run slyly +42531|1261|O|235093.15|1996-05-12|2-HIGH|Clerk#000000436|0|ely regular foxes along the furiou +42532|835|O|128604.77|1996-01-31|5-LOW|Clerk#000000916|0|lly final packages. theodolites affix quickly against the carefully e +42533|586|O|107945.36|1998-05-28|4-NOT SPECIFIED|Clerk#000000055|0|xpress requests. deposits sleep blithely permanent pinto beans +42534|766|F|55419.47|1993-05-03|3-MEDIUM|Clerk#000000736|0|ross the blithely bold accounts. theodolites ha +42535|1295|O|64907.04|1995-11-09|2-HIGH|Clerk#000000627|0| haggle furiously after the furiously ironic deposits. blithely fi +42560|1318|F|182078.06|1992-11-02|5-LOW|Clerk#000000168|0|. express, express dependencies around the ironic ideas wake according +42561|940|F|333006.90|1993-02-07|5-LOW|Clerk#000000346|0|ent dolphins serve quickly +42562|1000|F|1586.67|1994-07-11|2-HIGH|Clerk#000000941|0|the even, express ideas. fluffily regular packages thrash blithely of +42563|1229|F|47762.15|1993-08-13|3-MEDIUM|Clerk#000000220|0|es are even pinto beans. fluffily fluffy dolphins wake carefully i +42564|272|F|148899.61|1992-09-13|5-LOW|Clerk#000000070|0|lites. dependencies affix. slyly regular decoys should have to sl +42565|481|F|351587.09|1993-09-23|5-LOW|Clerk#000000993|0|the carefully final accounts sleep furiously after +42566|190|F|152096.81|1994-03-11|1-URGENT|Clerk#000000101|0|ronic accounts. ideas are quickly +42567|497|F|103154.16|1993-01-12|1-URGENT|Clerk#000000541|0|ents sublate carefully along th +42592|719|F|134840.56|1994-07-19|2-HIGH|Clerk#000000943|0|lets: special theodolites wake slyly about the slyly exp +42593|601|O|162868.76|1998-05-25|1-URGENT|Clerk#000000251|0|y quick packages. furiously final accounts wake carefully +42594|199|O|116809.33|1995-11-19|1-URGENT|Clerk#000000685|0| at the blithely ironic pinto beans. even, final ideas affix acr +42595|1379|O|151331.39|1997-06-30|5-LOW|Clerk#000000239|0| boost fluffily. express accounts sleep blithely. regularly regular depos +42596|349|F|49754.87|1992-08-15|3-MEDIUM|Clerk#000000988|0|longside of the blithely bold theodolites; dolphins are among the furio +42597|1088|F|16874.69|1993-03-26|3-MEDIUM|Clerk#000000229|0|ag slyly against the carefully special requests. furiou +42598|199|O|164980.20|1996-04-30|1-URGENT|Clerk#000000145|0|al requests. slyly even hockey players boost slyly special exc +42599|1282|F|109642.34|1994-04-07|3-MEDIUM|Clerk#000000116|0|ts after the bold pinto beans wake sl +42624|115|F|179584.11|1992-02-19|5-LOW|Clerk#000000806|0|ic pinto beans: blithely regular packages wake furiously unusual, r +42625|1300|O|32832.43|1997-08-28|5-LOW|Clerk#000000715|0|g to the carefully ev +42626|1084|O|234452.47|1998-02-12|2-HIGH|Clerk#000000691|0|even notornis sleep enticing, even braids. furiously unusual instructions p +42627|355|O|83028.52|1996-12-10|4-NOT SPECIFIED|Clerk#000000674|0|st slyly along the enticingly ironic packages. quickly regular +42628|490|P|77614.14|1995-05-06|4-NOT SPECIFIED|Clerk#000000931|0|l packages. slyly even deposits according to the idle packages +42629|1318|F|26992.35|1994-01-28|5-LOW|Clerk#000000171|0| quick packages solve across the slyly thin realms. furiously final packages +42630|1171|F|15088.02|1993-01-20|5-LOW|Clerk#000000940|0|ve to haggle against the thin requests. stealthy ideas dete +42631|940|F|236861.20|1994-05-10|2-HIGH|Clerk#000000737|0|foxes. foxes engage furiously. packages about th +42656|1478|O|167151.61|1995-12-02|2-HIGH|Clerk#000000030|0|gular ideas sleep furiously ironic packages +42657|1138|O|118953.22|1995-10-04|5-LOW|Clerk#000000132|0|xpress instructions haggle slyly. carefully special asymptotes are carefully e +42658|448|F|123951.18|1993-06-16|3-MEDIUM|Clerk#000000509|0|tes alongside of the regular, final accounts ru +42659|920|O|88744.87|1995-07-18|3-MEDIUM|Clerk#000000467|0| pending instructions cajole fluffily. b +42660|1178|O|80496.28|1997-02-10|4-NOT SPECIFIED|Clerk#000000564|0|tes sleep furiously bold theodolites. even +42661|154|O|220995.47|1998-05-13|5-LOW|Clerk#000000357|0|ts. final deposits +42662|1274|O|14822.09|1997-07-01|2-HIGH|Clerk#000000495|0|thely after the fluffily final pinto beans. blithely silent instructions hagg +42663|1147|O|91725.02|1998-03-02|4-NOT SPECIFIED|Clerk#000000553|0|express packages affix ironic requ +42688|476|F|52124.97|1992-08-01|3-MEDIUM|Clerk#000000504|0| affix according to the ironic accounts. blithely bold ideas use evenly +42689|397|O|41273.92|1995-12-07|2-HIGH|Clerk#000000367|0|quickly regular plate +42690|623|F|109824.08|1993-09-29|5-LOW|Clerk#000000206|0|to beans boost slyly un +42691|625|F|231223.55|1993-05-25|5-LOW|Clerk#000000457|0|fluffy accounts haggle slyly pending sauternes. carefully p +42692|976|O|214902.70|1995-12-21|3-MEDIUM|Clerk#000000161|0|ntegrate blithely regular requests. regular pinto beans ha +42693|1232|F|149619.80|1994-04-05|2-HIGH|Clerk#000000395|0|ress dependencies are carefully quietly r +42694|1162|O|215095.24|1996-03-27|1-URGENT|Clerk#000000209|0|dencies; permanently even deposits wa +42695|1075|F|27224.56|1993-12-23|4-NOT SPECIFIED|Clerk#000000575|0|osits. quickly regular accounts cajole above the fluffily even idea +42720|1267|O|3038.50|1995-07-21|5-LOW|Clerk#000000187|0|lar accounts. slyly close accounts are bl +42721|380|O|42729.09|1996-12-26|5-LOW|Clerk#000000150|0|ages wake slyly unusual deposits. regular packages engage quietly express ac +42722|976|F|134885.70|1992-10-08|4-NOT SPECIFIED|Clerk#000000057|0|ly regular requests ru +42723|226|O|134715.94|1997-12-21|2-HIGH|Clerk#000000367|0|g the ironic deposits poach blithely into the furiously regular requests; +42724|1123|O|24397.67|1996-08-25|1-URGENT|Clerk#000000473|0|uctions wake. ironic, pending ins +42725|7|O|149670.17|1995-05-03|3-MEDIUM|Clerk#000000352|0|y final foxes integrate. requests believe along the fluffil +42726|1216|F|180020.35|1993-07-17|3-MEDIUM|Clerk#000000509|0|posits are furiously: packa +42727|280|P|119928.69|1995-04-30|4-NOT SPECIFIED|Clerk#000000048|0|lar deposits sleep blithe +42752|1166|O|70489.89|1996-09-12|3-MEDIUM|Clerk#000000180|0|inal foxes-- blithely final ideas use carefully against the r +42753|1297|F|133915.24|1992-01-19|3-MEDIUM|Clerk#000000656|0|r pains. quickly ironic p +42754|1004|F|266979.42|1993-08-25|1-URGENT|Clerk#000000989|0|ully even deposits. regular +42755|1307|F|127153.91|1992-08-02|4-NOT SPECIFIED|Clerk#000000171|0|pending dependencies sleep after the final accounts. fluf +42756|1150|F|139890.51|1993-06-23|3-MEDIUM|Clerk#000000039|0|gular packages are furiously. carefully regular +42757|283|P|62216.14|1995-05-31|4-NOT SPECIFIED|Clerk#000000599|0|ons cajole carefully until the carefully regula +42758|1219|F|183900.70|1992-11-11|1-URGENT|Clerk#000000699|0| instructions. slyly special accounts n +42759|676|O|271201.52|1997-02-08|4-NOT SPECIFIED|Clerk#000000327|0|ly about the blithely spe +42784|871|O|74488.39|1996-04-28|3-MEDIUM|Clerk#000000578|0|nic pinto beans engage q +42785|112|O|230267.49|1996-09-12|2-HIGH|Clerk#000000230|0|osits after the enticingly ironic pinto beans sleep slyly s +42786|422|F|222360.79|1993-10-11|1-URGENT|Clerk#000000381|0|ven instructions: regular p +42787|853|O|203493.48|1997-05-16|2-HIGH|Clerk#000000915|0|arefully blithely final ideas. fur +42788|1015|O|100877.96|1995-10-14|1-URGENT|Clerk#000000180|0|furiously pending foxes cajole ruthlessly across the quickly final packages. +42789|904|F|31523.87|1992-02-19|1-URGENT|Clerk#000000516|0|courts. slyly unusual requests boost about the packa +42790|1396|O|255533.01|1998-04-30|5-LOW|Clerk#000000795|0|he quickly special ideas try to affix blithely blithely reg +42791|689|O|31252.46|1997-12-22|2-HIGH|Clerk#000000012|0|sly against the blithely special excuses. asymptote +42816|1396|F|197548.58|1992-03-18|5-LOW|Clerk#000000812|0|sts. blithely stealthy platelets boost slyly. c +42817|1084|O|70377.51|1997-08-31|5-LOW|Clerk#000000951|0|old deposits! requests are stealthily according to +42818|533|F|61928.89|1993-05-29|2-HIGH|Clerk#000000328|0|r the carefully ironic theodolites. +42819|380|O|143623.37|1998-03-26|1-URGENT|Clerk#000000891|0|encies wake bold, final pinto beans. f +42820|491|F|68929.80|1993-02-17|5-LOW|Clerk#000000338|0|g to the express asymptotes. dogg +42821|565|O|299392.32|1997-07-23|5-LOW|Clerk#000000024|0|ites are ruthlessly furiously express dependencies. ironic, +42822|1106|O|230095.54|1998-04-28|1-URGENT|Clerk#000000206|0|posits unwind slyly ca +42823|1255|F|162005.58|1993-06-26|3-MEDIUM|Clerk#000000317|0|ess, ironic foxes haggle sly +42848|686|F|31399.11|1992-10-07|4-NOT SPECIFIED|Clerk#000000725|0| ironic accounts use furio +42849|1102|O|164647.52|1996-05-08|3-MEDIUM|Clerk#000000275|0| bold pinto beans around the slyly specia +42850|1111|O|73838.04|1995-06-22|3-MEDIUM|Clerk#000000040|0|ely daring deposits. pending depths are always through +42851|592|F|217198.28|1994-06-02|2-HIGH|Clerk#000000736|0| ironic ideas nag carefully above the blithely express depths. blit +42852|554|F|89600.96|1994-12-21|4-NOT SPECIFIED|Clerk#000000957|0|ly idle accounts. bold, regular accounts may boost slyly qu +42853|278|O|4475.34|1996-12-11|5-LOW|Clerk#000000826|0|egular requests integrate blithely silent pinto beans. fur +42854|545|O|131038.38|1998-02-06|2-HIGH|Clerk#000000045|0|ke quickly alongside of the packages. slyly careful ideas again +42855|379|O|177343.42|1995-07-09|4-NOT SPECIFIED|Clerk#000000179|0|lent pinto beans maintain blithel +42880|422|O|118039.91|1997-03-29|5-LOW|Clerk#000000940|0|s sleep quickly along the silent requests. slyly express requests sleep unusu +42881|829|F|75689.54|1992-10-16|3-MEDIUM|Clerk#000000426|0|y bold instructions. slyly final packages haggle stealthily. slyly +42882|761|F|270943.47|1993-10-28|5-LOW|Clerk#000000476|0|s haggle carefully acco +42883|596|F|27773.68|1995-01-27|2-HIGH|Clerk#000000651|0|ndencies at the unusual, ironic requests haggle blithely packages. pendi +42884|704|F|91600.84|1993-03-13|4-NOT SPECIFIED|Clerk#000000301|0|ecial requests sleep quickly special requests. p +42885|928|O|67364.44|1996-11-15|5-LOW|Clerk#000000093|0|he blithely even packages nag blithel +42886|1265|F|73048.65|1992-01-09|3-MEDIUM|Clerk#000000519|0|ns boost slyly slyly pending pinto beans. quickly +42887|1327|F|207423.08|1992-06-11|3-MEDIUM|Clerk#000000226|0|regular foxes along the slyly flu +42912|1387|F|143167.57|1993-05-05|4-NOT SPECIFIED|Clerk#000000850|0|foxes are slyly sly warhorses. fluffily ironic deposits cajole furiously. f +42913|559|O|104057.10|1996-05-23|4-NOT SPECIFIED|Clerk#000000343|0|. slowly ironic dependencies cajole: iro +42914|25|O|258000.55|1998-04-10|5-LOW|Clerk#000000401|0|ts against the blithely special requests integrate fur +42915|1252|O|259779.26|1998-03-18|1-URGENT|Clerk#000000488|0|lites sleep quickly along the quickly ironic requests. special noto +42916|1456|O|34607.82|1997-02-14|3-MEDIUM|Clerk#000000210|0|accounts. furiously +42917|61|O|64698.13|1996-03-02|4-NOT SPECIFIED|Clerk#000000538|0|ing instructions. blithely unusual p +42918|1490|P|342820.36|1995-05-23|2-HIGH|Clerk#000000338|0|yly pending platelets sleep c +42919|325|O|176576.67|1995-10-07|3-MEDIUM|Clerk#000000298|0| beans. carefully special instructions despite the carefully i +42944|199|F|73939.52|1992-11-19|1-URGENT|Clerk#000000485|0|nts nag carefully. fluffily enticing accounts against the final, special +42945|394|F|264813.91|1992-12-30|4-NOT SPECIFIED|Clerk#000000065|0|unts boost with the slyly pending ideas. +42946|580|O|278513.75|1997-09-11|2-HIGH|Clerk#000000972|0|hinly regular dinos. fluffily +42947|646|F|110501.90|1993-08-27|5-LOW|Clerk#000000542|0|fluffily special instructions. furiously special frets sleep slyly across t +42948|1361|O|178016.34|1996-11-12|2-HIGH|Clerk#000000595|0|ously express dolphins. quickly final excuses detect qu +42949|22|F|183700.29|1994-05-22|4-NOT SPECIFIED|Clerk#000000467|0| gifts haggle carefully regular accounts. blithely sly +42950|1073|F|222164.40|1993-08-23|2-HIGH|Clerk#000000487|0|round the foxes. furiously unusual deposits sleep slowly. final re +42951|683|F|230531.49|1992-09-17|1-URGENT|Clerk#000000773|0|ully unusual foxes. even foxes boost slyly. furiously fi +42976|188|O|187592.64|1998-07-27|4-NOT SPECIFIED|Clerk#000000568|0| special theodolites. furiously regular +42977|1480|O|1419.03|1997-09-21|4-NOT SPECIFIED|Clerk#000000887|0|ven deposits. furiously bold asymptotes na +42978|683|O|301315.87|1997-10-03|1-URGENT|Clerk#000000420|0|ounts; blithely bold pinto beans about the eve +42979|503|P|201848.57|1995-05-02|4-NOT SPECIFIED|Clerk#000000295|0| inside the careful instructions cajole blithely across the fluffi +42980|461|O|157585.83|1998-07-13|3-MEDIUM|Clerk#000000608|0|ully about the even deposits. blithely express foxes haggle carefully a +42981|158|F|134504.02|1994-05-31|1-URGENT|Clerk#000000700|0|quickly regular pinto beans. fluffily regular deposits wake fur +42982|224|F|229159.48|1992-07-28|5-LOW|Clerk#000000509|0|above the carefully special accounts unwind final hoc +42983|773|O|38400.81|1997-06-28|2-HIGH|Clerk#000000111|0|lithely according to the final asymptotes. pearls +43008|1235|O|153581.83|1996-10-26|5-LOW|Clerk#000000050|0|final deposits should affix carefully. quickly regular in +43009|1217|F|2939.22|1994-05-31|2-HIGH|Clerk#000000825|0|s wake regular accounts. brave, pending p +43010|221|F|119091.96|1992-10-10|1-URGENT|Clerk#000000325|0| blithely regular requests kindle carefully-- packages among the blithel +43011|299|O|242837.18|1996-05-02|2-HIGH|Clerk#000000291|0|etect furiously sly epitaphs. slyly regular requests are blithe +43012|824|F|35379.22|1992-08-10|5-LOW|Clerk#000000417|0|s. even, pending packages use. sil +43013|256|P|210252.25|1995-04-23|5-LOW|Clerk#000000105|0|. ironic grouches believe across t +43014|305|F|315651.56|1994-11-13|2-HIGH|Clerk#000000134|0| requests boost amo +43015|1145|O|124999.89|1996-03-01|4-NOT SPECIFIED|Clerk#000000866|0|ach furiously ironic instru +43040|650|O|78377.53|1996-08-03|2-HIGH|Clerk#000000375|0|ickly regular accounts. fluffily regular waters above +43041|20|O|156386.36|1996-12-19|3-MEDIUM|Clerk#000000581|0|quests. slyly bold pinto beans according to th +43042|1156|O|176051.71|1997-08-18|2-HIGH|Clerk#000000599|0|rts. busily pending asymptotes caj +43043|274|F|216825.78|1992-04-15|1-URGENT|Clerk#000000110|0| boost ironic accounts. u +43044|368|F|281797.38|1994-10-18|3-MEDIUM|Clerk#000000772|0|xes haggle always silent requests. slow, special deposits wake +43045|646|F|79045.47|1992-06-15|3-MEDIUM|Clerk#000000322|0|ly. carefully regular excuses breach fluffily along the exp +43046|1192|O|185283.48|1996-08-26|4-NOT SPECIFIED|Clerk#000000705|0|r frays. quickly pending pinto beans wake. blithely pend +43047|881|O|95597.11|1997-02-26|4-NOT SPECIFIED|Clerk#000000148|0|zle blithely. regular instructions boost furiously +43072|1100|O|172614.21|1998-05-02|4-NOT SPECIFIED|Clerk#000000210|0| the furiously special pinto beans. carefully unusual +43073|976|O|57959.40|1996-08-15|1-URGENT|Clerk#000000435|0|. furiously unusual courts haggle express dependenc +43074|352|F|217023.72|1993-09-30|1-URGENT|Clerk#000000473|0|as. pending theodolites sleep bl +43075|433|O|37958.35|1997-07-04|4-NOT SPECIFIED|Clerk#000000472|0|s was blithely slow deposits. slyly u +43076|244|F|216599.52|1993-06-17|4-NOT SPECIFIED|Clerk#000000090|0|tions wake carefully special packages. quickly blithe theodolites after the e +43077|166|O|128996.50|1996-12-25|4-NOT SPECIFIED|Clerk#000000413|0|ly unusual theodolites. quickl +43078|10|O|61921.02|1998-04-08|5-LOW|Clerk#000000356|0|special packages. furious +43079|983|F|36586.59|1994-07-22|3-MEDIUM|Clerk#000000166|0|g to the never ironic requests-- accounts +43104|886|F|203287.69|1992-10-29|2-HIGH|Clerk#000000896|0| affix slyly packages. quickly ironic accounts affix quickly. expre +43105|797|O|102191.59|1998-01-11|1-URGENT|Clerk#000000469|0|theodolites are. fluffily regular ideas are blithely amo +43106|928|F|232134.53|1995-01-22|3-MEDIUM|Clerk#000000260|0|ges. furiously permanent +43107|1459|O|115401.26|1997-05-14|2-HIGH|Clerk#000000562|0|nic packages are quickly. quickl +43108|172|O|113002.96|1996-08-16|5-LOW|Clerk#000000537|0|eas are quickly after the fluffily idle packages. final, regular pinto beans +43109|1067|F|228977.82|1992-12-22|1-URGENT|Clerk#000000230|0|eodolites. ironic pinto beans affix blithely final deposits. slyly pending a +43110|1384|F|190579.75|1995-02-07|2-HIGH|Clerk#000000725|0|gular packages. slyly regular deposits are +43111|943|O|182093.97|1995-09-13|2-HIGH|Clerk#000000714|0|quickly special accounts boost ironic theodoli +43136|1274|F|31701.68|1993-08-26|5-LOW|Clerk#000000430|0|es haggle along the deposits. slyly iron +43137|292|F|43969.70|1995-02-27|2-HIGH|Clerk#000000295|0|mas alongside of the silent asymptotes haggle slyly quickly regu +43138|557|F|67941.82|1992-03-15|5-LOW|Clerk#000000351|0|lites eat bravely across the ideas. sile +43139|38|O|87255.56|1997-01-20|4-NOT SPECIFIED|Clerk#000000474|0| instructions sleep +43140|391|F|181184.72|1994-03-19|1-URGENT|Clerk#000000459|0|eposits serve slyly bold, pending theodolites. finally re +43141|512|F|194027.61|1993-07-05|1-URGENT|Clerk#000000287|0|eposits. regular courts are. express, express +43142|1318|O|382233.07|1996-02-06|5-LOW|Clerk#000000610|0|tes are alongside of the pending +43143|1274|O|186516.24|1998-01-23|1-URGENT|Clerk#000000758|0|ions was blithely above the blithely pending asymptotes. theodolites sleep a +43168|677|O|120769.29|1996-03-29|3-MEDIUM|Clerk#000000093|0|bold ideas. furiously ironic packages haggle. ironic, bold theodolites +43169|277|F|55573.29|1994-04-01|1-URGENT|Clerk#000000650|0|yly ironic accounts: blithely do +43170|283|F|272201.18|1993-05-14|5-LOW|Clerk#000000782|0| excuses wake carefully. quickly +43171|1027|O|75095.03|1996-06-13|5-LOW|Clerk#000000584|0| express accounts cajole furiously. blithely pending requests above the s +43172|938|F|27322.37|1994-07-04|5-LOW|Clerk#000000996|0| unusual ideas. regular accounts haggle about the requests! regular instruc +43173|718|O|56481.73|1996-01-03|3-MEDIUM|Clerk#000000228|0|requests are express ideas-- furiously express ideas ac +43174|1123|O|8540.24|1998-01-03|1-URGENT|Clerk#000000773|0|kages. unusual, pending deposits haggle above the furiously fi +43175|610|O|118937.39|1996-02-24|1-URGENT|Clerk#000000586|0|quests sleep agains +43200|563|F|291690.28|1993-08-01|4-NOT SPECIFIED|Clerk#000000920|0|ly braids. dogged accounts use slowly about the fina +43201|638|F|16452.69|1995-03-04|5-LOW|Clerk#000000331|0|thely silent platelets sleep against the blithely pending ideas. de +43202|626|F|110420.41|1994-08-01|4-NOT SPECIFIED|Clerk#000000252|0|pinto beans use according +43203|1201|F|172508.06|1992-02-15|4-NOT SPECIFIED|Clerk#000000573|0|quests: even, special acc +43204|1288|F|219734.27|1994-12-05|5-LOW|Clerk#000000358|0| sleep against the fluffily careful packages. furiously unus +43205|1351|O|65433.03|1997-04-28|2-HIGH|Clerk#000000492|0|y pending deposits are carefully along the pending deposi +43206|1159|F|271095.29|1994-08-24|3-MEDIUM|Clerk#000000202|0|otes detect carefully spe +43207|124|F|247578.26|1993-06-10|5-LOW|Clerk#000000975|0|thely regular accounts. quickly regular e +43232|292|O|53778.00|1995-10-14|1-URGENT|Clerk#000000364|0|te slyly. slyly even accounts haggle. ac +43233|1060|F|37946.66|1993-06-20|1-URGENT|Clerk#000000635|0|ts nag slyly slyly bold accounts. quickly express deposits use carefully +43234|607|O|207641.72|1997-10-17|5-LOW|Clerk#000000483|0|ts wake along the bold, ironic accounts +43235|1357|O|22789.70|1995-07-15|5-LOW|Clerk#000000378|0|e slyly ideas. furiously quick instructions sleep furiousl +43236|643|F|127911.92|1993-07-04|4-NOT SPECIFIED|Clerk#000000101|0|boost furiously. slyly fluffy packa +43237|808|F|129871.57|1993-05-28|2-HIGH|Clerk#000000928|0|wake quickly. final, regular requests dazzle blithely +43238|448|O|104920.18|1996-04-07|3-MEDIUM|Clerk#000000675|0|egular excuses. express, bo +43239|233|O|61958.52|1995-03-17|4-NOT SPECIFIED|Clerk#000000563|0|odolites sleep among the slyly permanent accounts. furiously +43264|46|O|88955.84|1996-04-01|2-HIGH|Clerk#000000636|0|quests cajole about the regular excuses. regular deposits across the fluf +43265|937|O|128100.48|1997-08-04|3-MEDIUM|Clerk#000000754|0|ully unusual requests use slyly about the special orbits. ironically ironic +43266|211|O|130645.79|1998-02-05|2-HIGH|Clerk#000000947|0|tructions. regular, unusual requ +43267|304|P|99700.28|1995-05-17|1-URGENT|Clerk#000000885|0| boost. slyly final pint +43268|1150|O|20114.79|1996-09-05|2-HIGH|Clerk#000000143|0|silently furiously special pinto beans; carefully even accounts haggle blit +43269|667|F|21488.87|1994-04-11|1-URGENT|Clerk#000000683|0|ffily ironic dependencies nag careful +43270|149|F|77528.18|1992-09-02|1-URGENT|Clerk#000000768|0|ironic, express instructions. slyly regular requests a +43271|838|F|35614.36|1993-03-04|3-MEDIUM|Clerk#000000727|0|r accounts at the ruthlessly ironic pinto beans use +43296|46|F|35511.32|1992-03-04|3-MEDIUM|Clerk#000000992|0|ly unusual accounts sleep furi +43297|514|O|199605.76|1998-02-28|5-LOW|Clerk#000000995|0| wake after the carefully pending brai +43298|637|O|137872.20|1995-07-11|4-NOT SPECIFIED|Clerk#000000683|0|egular Tiresias nag furiously after the carefully regular accounts. +43299|778|O|106072.47|1996-12-29|4-NOT SPECIFIED|Clerk#000000738|0|foxes. unusual, pending theodolites thrash quickly above t +43300|502|O|48188.31|1998-03-04|1-URGENT|Clerk#000000121|0|s. express requests are. ironic requests are carefully after th +43301|1142|F|196920.08|1994-08-22|1-URGENT|Clerk#000000029|0|e deposits. blithely pending asymptotes sleep against the slyly fi +43302|1454|O|109067.35|1995-08-24|5-LOW|Clerk#000000843|0|totes. pending, even accounts against the bold ideas sleep blithe +43303|1141|F|122291.02|1994-03-05|4-NOT SPECIFIED|Clerk#000000082|0|the quickly ironic platelets. instructions wake among the slyly expre +43328|1093|P|164184.99|1995-03-04|5-LOW|Clerk#000000764|0|y about the ironic accounts. quickly regular +43329|172|F|116475.31|1993-03-08|3-MEDIUM|Clerk#000000914|0|hely ruthless requests haggle carefully. quick sauternes wak +43330|239|F|83685.14|1994-04-28|4-NOT SPECIFIED|Clerk#000000716|0| carefully silent instructions are carefully busy deposits. iro +43331|1364|O|35350.32|1998-03-20|5-LOW|Clerk#000000947|0|ove the blithely express dependencies are quickly ir +43332|62|F|154680.41|1992-09-11|2-HIGH|Clerk#000000112|0|ding to the slyly final accounts are requests. bold ideas boost quickly fina +43333|1330|F|9537.29|1993-12-20|3-MEDIUM|Clerk#000000327|0|ly regular requests +43334|1411|F|5618.66|1993-08-01|4-NOT SPECIFIED|Clerk#000000114|0|encies according to the carefull +43335|316|O|20960.97|1998-05-13|5-LOW|Clerk#000000732|0| final warthogs nag furiously bold de +43360|241|F|132222.90|1994-10-14|5-LOW|Clerk#000000833|0|ns. special, ironic requests detect quickly. regu +43361|292|O|8346.95|1995-09-25|2-HIGH|Clerk#000000092|0|ithely slyly special pinto beans. slyly even deposits +43362|167|F|178265.35|1994-01-13|1-URGENT|Clerk#000000644|0|tructions. quickly silent accounts cajole. special deposits against the ironi +43363|1189|O|204474.25|1995-09-06|1-URGENT|Clerk#000000863|0| across the bold, special theodolites cajole against the carefully +43364|1255|F|124283.93|1992-04-08|2-HIGH|Clerk#000000880|0|fully bold deposits. slyly regular platelets +43365|1190|O|117053.76|1998-03-09|2-HIGH|Clerk#000000980|0|er the always pending packages. quickly final packages sl +43366|1177|O|185568.35|1997-04-19|3-MEDIUM|Clerk#000000362|0| final deposits. slyly regular dolphins nag care +43367|719|F|98287.20|1993-03-10|1-URGENT|Clerk#000000265|0|osits wake alongside of the slyly express asymp +43392|652|F|189647.45|1995-01-01|3-MEDIUM|Clerk#000000056|0|ly express instructions against the blithely ironic packages +43393|395|O|53250.76|1996-07-04|1-URGENT|Clerk#000000317|0| quickly ironic packages. furiously even instructions haggle fur +43394|124|F|41173.83|1994-06-19|3-MEDIUM|Clerk#000000235|0|ckly unusual, even sentiments. brave, r +43395|580|O|4108.28|1995-12-19|3-MEDIUM|Clerk#000000774|0|. stealthy, final foxes wa +43396|1435|F|25037.68|1992-12-16|3-MEDIUM|Clerk#000000742|0|ly express instructions. carefully regular accounts nod slyly. carefully iro +43397|955|F|25474.23|1995-05-13|1-URGENT|Clerk#000000281|0|y special requests sleep regular packages. slyly idle braids sleep blit +43398|1342|P|145393.54|1995-04-25|4-NOT SPECIFIED|Clerk#000000762|0|ffily about the furiously ironic theodolites. foxes hang carefully a +43399|475|F|332464.38|1994-07-31|2-HIGH|Clerk#000000178|0| instructions boost. furiously final foxes believe quickly beyond the fi +43424|967|O|33255.50|1995-08-19|4-NOT SPECIFIED|Clerk#000000113|0|ffily pending instructions wake +43425|199|F|76389.29|1994-01-13|5-LOW|Clerk#000000547|0|unusual deposits. packages hang carefully. quickly even accoun +43426|509|F|228919.11|1993-03-10|2-HIGH|Clerk#000000143|0| bold, ironic ideas wake furiously after the dolphins. blithely express packag +43427|1444|O|11860.39|1995-10-08|4-NOT SPECIFIED|Clerk#000000202|0|al instructions nag furiously; ruthlessly ironic requests boost +43428|1253|O|53673.23|1998-03-29|4-NOT SPECIFIED|Clerk#000000473|0|nag always regular deposits. regular, ir +43429|808|F|220889.69|1992-07-06|5-LOW|Clerk#000000436|0|en requests. furiously special theodolites haggle fluffily bold pa +43430|586|F|110075.91|1992-06-21|5-LOW|Clerk#000000678|0|nic, express packages a +43431|1217|O|41230.86|1995-05-17|4-NOT SPECIFIED|Clerk#000000472|0|olites cajole blithely slyly final +43456|713|O|176634.90|1997-04-17|4-NOT SPECIFIED|Clerk#000000922|0|s accounts after the accounts sleep according to the slyly unusual accounts. q +43457|193|O|151021.42|1996-06-05|1-URGENT|Clerk#000000468|0|ts. blithely regular accounts are dogged theodolites. boldly ironic platelets +43458|647|O|148810.78|1996-06-13|4-NOT SPECIFIED|Clerk#000000486|0|riously regular packag +43459|1009|O|29671.66|1995-11-08|1-URGENT|Clerk#000000486|0|cajole quickly. blithely +43460|1127|F|90363.27|1992-06-12|3-MEDIUM|Clerk#000000116|0|p slyly alongside of the regular instructi +43461|308|O|163696.62|1998-02-25|1-URGENT|Clerk#000000451|0| platelets among the bold, +43462|574|F|60395.98|1993-05-22|2-HIGH|Clerk#000000559|0|ter the fluffily final asymptotes. re +43463|223|O|320004.89|1996-07-28|4-NOT SPECIFIED|Clerk#000000243|0|e furiously regular packages wake blithely fluffily regular accounts. regu +43488|1249|F|234656.24|1992-06-19|1-URGENT|Clerk#000000683|0|oxes nag carefully. quickly bold requests breach above the bold theodolite +43489|841|O|46786.00|1996-09-21|1-URGENT|Clerk#000000833|0|gged packages wake up the depen +43490|356|F|46715.04|1994-08-19|4-NOT SPECIFIED|Clerk#000000616|0|lyly unusual instructions +43491|766|P|172693.02|1995-03-09|5-LOW|Clerk#000000801|0|ar accounts cajole bl +43492|1475|O|104237.90|1996-03-17|4-NOT SPECIFIED|Clerk#000000295|0|ins kindle quickly against the +43493|958|F|257570.50|1992-05-11|2-HIGH|Clerk#000000243|0|d the bold, regular instructions. bold requ +43494|913|F|122147.47|1992-01-04|3-MEDIUM|Clerk#000000771|0| silent packages ca +43495|881|O|246433.66|1996-10-28|4-NOT SPECIFIED|Clerk#000000961|0|sly pending accounts. slyly r +43520|1408|O|217064.15|1998-02-08|3-MEDIUM|Clerk#000000523|0|xpress packages are blithely a +43521|287|F|92370.71|1994-05-03|3-MEDIUM|Clerk#000000651|0|; fluffily ironic ideas believe slyly quickly regular +43522|866|F|39810.04|1994-01-25|4-NOT SPECIFIED|Clerk#000000432|0|ic ideas against the deposits sleep unusual, regular foxes. ironic, un +43523|1349|F|94634.01|1992-05-24|3-MEDIUM|Clerk#000000076|0| packages according to the quickly final gifts nod furiously ironic +43524|847|F|35384.73|1992-07-07|2-HIGH|Clerk#000000809|0|ackages cajole after the dinos. care +43525|1013|F|41051.09|1993-05-26|5-LOW|Clerk#000000599|0|ickly blithe requests. furiously ironic requests serve slyly spec +43526|65|F|109328.36|1993-05-27|2-HIGH|Clerk#000000561|0|ss accounts; special, ironic dependencies cajole +43527|655|F|131351.40|1993-08-22|4-NOT SPECIFIED|Clerk#000000788|0|eodolites boost blithely ideas. furiously even excuses after the fluffil +43552|517|F|170924.38|1994-04-21|2-HIGH|Clerk#000000538|0|side the slyly pending requests +43553|1366|F|154860.65|1994-05-15|4-NOT SPECIFIED|Clerk#000000122|0|ions. slyly even accounts are +43554|670|F|96761.62|1994-10-31|1-URGENT|Clerk#000000603|0|even foxes doubt boldly final theodolites. accou +43555|169|F|132844.65|1992-07-04|3-MEDIUM|Clerk#000000772|0|posits. slyly final asymptotes wake furiously unusual requests. foxes a +43556|220|F|52787.32|1992-07-23|5-LOW|Clerk#000000282|0|ate carefully among the slyly ironic +43557|727|O|145117.01|1998-01-31|2-HIGH|Clerk#000000955|0|the packages cajole quickl +43558|341|O|75824.29|1996-06-19|2-HIGH|Clerk#000000504|0|sheaves after the carefully regular pi +43559|1372|O|132044.02|1995-08-07|1-URGENT|Clerk#000000174|0|y brave dolphins according to the furiously reg +43584|1045|O|331523.46|1996-06-04|4-NOT SPECIFIED|Clerk#000000862|0|regular courts. fluffily unusual courts use packages. fluffily unusua +43585|1373|F|56558.70|1993-11-11|1-URGENT|Clerk#000000521|0| final, unusual foxes integrate according to the slyly fin +43586|1135|O|158995.35|1996-10-16|2-HIGH|Clerk#000000393|0|ts among the idle deposi +43587|856|O|90402.67|1997-01-25|4-NOT SPECIFIED|Clerk#000000589|0|uts do hang carefully carefully sly pat +43588|1163|F|248428.59|1992-09-02|3-MEDIUM|Clerk#000000112|0|le quickly according to the bo +43589|880|F|64671.25|1993-05-26|2-HIGH|Clerk#000000815|0|usly special requests. carefully regular packages bo +43590|200|F|275456.88|1994-09-11|2-HIGH|Clerk#000000239|0|ic dolphins use outside the slyly pending courts. carefully final courts w +43591|1495|O|281672.90|1996-02-29|2-HIGH|Clerk#000000735|0|nal packages wake slyly blithely +43616|346|O|197295.05|1996-12-04|2-HIGH|Clerk#000000786|0| requests. blithely express packages sleep fluf +43617|320|O|228190.22|1996-04-27|2-HIGH|Clerk#000000772|0| even requests hinder regular accounts. dependencies a +43618|1078|O|304121.61|1996-08-22|1-URGENT|Clerk#000000288|0|ilent asymptotes integrate instructions. requests among +43619|811|O|170730.95|1997-05-02|1-URGENT|Clerk#000000579|0|ackages boost about the +43620|431|F|123312.49|1994-01-18|3-MEDIUM|Clerk#000000491|0|ans integrate special packages. furiou +43621|541|F|83563.99|1995-02-13|2-HIGH|Clerk#000000960|0|ests according to the carefully express dependencies wake quickly quic +43622|721|O|164699.49|1997-08-01|3-MEDIUM|Clerk#000000661|0|s according to the pinto beans use slyly according to the e +43623|646|O|97519.78|1998-04-28|1-URGENT|Clerk#000000596|0| pending accounts haggle slyly carefully unusual dolphins. +43648|1355|O|22295.27|1995-03-31|5-LOW|Clerk#000000480|0|nto beans. frays wake. accounts caj +43649|148|F|6762.50|1993-09-26|3-MEDIUM|Clerk#000000928|0|xpress requests use b +43650|880|F|228201.40|1994-03-24|4-NOT SPECIFIED|Clerk#000000597|0|t the pending deposits wake furiously after the forges. final +43651|1094|O|184653.54|1997-11-05|3-MEDIUM|Clerk#000000323|0|hely enticing tithes! slyly ironic accounts cajole finally acro +43652|626|O|6705.47|1997-12-08|1-URGENT|Clerk#000000014|0|regular platelets agai +43653|1363|F|106023.56|1992-10-31|2-HIGH|Clerk#000000016|0|. carefully regular deposits cajole slyly along the daringly silent p +43654|893|F|236002.66|1994-06-12|3-MEDIUM|Clerk#000000851|0|nt deposits. slyly ironic accounts sleep slyly al +43655|850|O|232868.72|1997-07-02|2-HIGH|Clerk#000000728|0|ld theodolites cajole furiously brave packag +43680|1126|F|240820.99|1993-03-23|4-NOT SPECIFIED|Clerk#000000971|0|ely unusual packages cajole +43681|1313|O|50900.13|1995-03-31|5-LOW|Clerk#000000105|0|. carefully regular foxes wake according to the quiet requ +43682|547|F|208349.43|1992-08-28|3-MEDIUM|Clerk#000000210|0|lar, even theodolites. quick, express excuses wake furious +43683|683|O|82342.87|1997-09-13|1-URGENT|Clerk#000000759|0|ffily furiously final d +43684|607|O|98963.84|1997-01-12|1-URGENT|Clerk#000000418|0| express theodolites sleep furiously toward the bold sentiments. furiously per +43685|364|O|158160.98|1997-08-16|4-NOT SPECIFIED|Clerk#000000020|0| bravely pending platelets. furiously regular dinos nag express packag +43686|638|O|150399.67|1995-05-08|3-MEDIUM|Clerk#000000955|0|final asymptotes. ironic deposits sleep caref +43687|49|O|248518.55|1997-03-27|3-MEDIUM|Clerk#000000407|0|oubt carefully through the quickly regula +43712|415|F|40474.98|1995-03-25|4-NOT SPECIFIED|Clerk#000000924|0|riously even dugouts haggle blithel +43713|1450|F|132832.57|1992-09-08|3-MEDIUM|Clerk#000000688|0|xpress theodolites. regular, final foxes +43714|112|O|260921.94|1996-07-30|5-LOW|Clerk#000000433|0| excuses affix even accounts. ironic instr +43715|865|O|46875.02|1996-06-28|5-LOW|Clerk#000000703|0|al pinto beans. regular, special instructions haggle. re +43716|1424|O|137538.75|1995-05-03|5-LOW|Clerk#000000964|0| blithely regular pinto beans. carefully stealth +43717|314|O|212023.96|1996-12-15|2-HIGH|Clerk#000000899|0|unts cajole quickly carefully final ide +43718|1210|O|83814.59|1997-02-05|2-HIGH|Clerk#000000349|0|ully. asymptotes boos +43719|551|O|146921.57|1997-08-10|1-URGENT|Clerk#000000518|0|uriously furiously regular accounts. package +43744|706|F|29892.99|1992-02-11|4-NOT SPECIFIED|Clerk#000000652|0| furiously final dependencies are carefully pending accounts. ironi +43745|928|F|229381.05|1993-11-02|5-LOW|Clerk#000000017|0|ic accounts. slyly ironic ideas sleep across the fluffily +43746|326|O|112832.58|1997-07-24|3-MEDIUM|Clerk#000000779|0| dependencies against the theodolites cajole along the regular do +43747|821|O|68870.93|1997-08-09|4-NOT SPECIFIED|Clerk#000000751|0|ronic requests sleep carefully car +43748|652|F|8727.29|1992-04-18|1-URGENT|Clerk#000000766|0|ly about the slyly regular pinto beans. regular, ironic requests us +43749|1046|F|67645.50|1992-08-25|5-LOW|Clerk#000000012|0|le blithely furiously bold deposits. blithely regular pearls s +43750|253|O|27984.91|1996-10-21|5-LOW|Clerk#000000174|0| unusual instructions according to the slyly s +43751|388|F|57006.96|1992-06-28|2-HIGH|Clerk#000000364|0|impress quickly carefully silent pa +43776|1040|F|91531.14|1992-12-03|2-HIGH|Clerk#000000304|0|e blithely bold the +43777|1361|O|171414.44|1998-04-23|1-URGENT|Clerk#000000483|0|refully ironic instructions cajole furiously regu +43778|556|O|213461.53|1997-04-11|4-NOT SPECIFIED|Clerk#000000980|0|gular packages. quickly ironic grouches against the quickly bold courts cajo +43779|616|F|90565.55|1994-08-22|2-HIGH|Clerk#000000217|0|ke. slyly silent packages among the fluffil +43780|724|O|111268.08|1996-11-29|3-MEDIUM|Clerk#000000614|0|dependencies affix blithely special +43781|1366|F|215971.86|1993-02-03|4-NOT SPECIFIED|Clerk#000000345|0|osits haggle daringly pinto beans. ironic instru +43782|611|F|97533.53|1993-11-14|3-MEDIUM|Clerk#000000839|0|osits. special deposits haggle blithely amo +43783|1481|O|305512.61|1997-01-21|3-MEDIUM|Clerk#000000894|0|l asymptotes. even, special ideas haggle about +43808|1001|F|97149.05|1995-01-07|5-LOW|Clerk#000000587|0|fix final excuses? blithely ironic pains about the special requests wak +43809|1315|O|127785.48|1997-04-25|1-URGENT|Clerk#000000901|0|thely ironic asymptotes. fluffily final foxes sleep dogge +43810|1141|O|345675.99|1998-03-15|3-MEDIUM|Clerk#000000783|0| even, pending requests haggle +43811|1192|O|138944.66|1998-05-29|4-NOT SPECIFIED|Clerk#000000651|0|onic, silent deposits wake. quickly special warthogs boost fluffily slyly +43812|973|O|127158.28|1996-05-28|5-LOW|Clerk#000000449|0|cies nag sometimes above the carefully even +43813|110|F|115631.34|1994-07-22|4-NOT SPECIFIED|Clerk#000000467|0|ully even deposits. furiously regular deposits g +43814|559|F|196211.20|1995-01-10|3-MEDIUM|Clerk#000000544|0| haggle regular forges: ironic instructions l +43815|1357|F|166581.56|1992-06-14|4-NOT SPECIFIED|Clerk#000000346|0|gular accounts. blithely silent deposits detect. quickly regular a +43840|1234|O|16236.69|1998-04-05|1-URGENT|Clerk#000000538|0|fully final accounts +43841|1468|O|62195.31|1995-11-02|5-LOW|Clerk#000000314|0|ideas haggle carefully above the furiousl +43842|1196|F|203762.99|1994-02-01|2-HIGH|Clerk#000000337|0|ructions wake special, pending packages. ep +43843|1189|O|211893.16|1997-09-30|3-MEDIUM|Clerk#000000059|0|ggle carefully against the unusual, regular gifts. accounts use across the ir +43844|1261|F|41796.59|1993-11-01|2-HIGH|Clerk#000000674|0| quickly about the ironic dependen +43845|1465|O|214400.39|1997-01-22|4-NOT SPECIFIED|Clerk#000000046|0|totes. hockey players nag above the ironic, unusual theodo +43846|1061|F|334828.63|1994-02-27|2-HIGH|Clerk#000000223|0| the final, unusual foxes integrate slyly among the carefull +43847|1325|F|11392.95|1992-08-14|2-HIGH|Clerk#000000682|0| carefully bold platelets cajol +43872|493|O|47547.25|1997-07-08|5-LOW|Clerk#000000080|0|ly unusual deposits. even foxes sleep. requests maintain blithely along t +43873|1444|O|247161.85|1997-05-30|1-URGENT|Clerk#000000454|0| against the quickly regular dolphins cajole even, final account +43874|958|F|31973.21|1992-06-11|2-HIGH|Clerk#000000823|0|are above the ruthlessly pending attainments. fluffily +43875|1471|O|304460.81|1995-12-08|1-URGENT|Clerk#000000343|0|quests boost blithely. ironically special +43876|664|O|254184.50|1996-03-28|4-NOT SPECIFIED|Clerk#000000828|0|y silent packages. fluffily ironic +43877|1252|F|115227.64|1993-03-16|5-LOW|Clerk#000000008|0|express packages; regular accounts solve +43878|1439|O|143237.42|1996-03-28|2-HIGH|Clerk#000000083|0|ly even ideas nag furiously according to the +43879|1|F|83095.85|1993-08-13|2-HIGH|Clerk#000000092|0|enly regular instructions +43904|652|F|99383.96|1993-05-02|4-NOT SPECIFIED|Clerk#000000987|0| have to unwind furiously carefully express patterns. blithely even requests +43905|1216|O|94873.03|1998-01-31|4-NOT SPECIFIED|Clerk#000000500|0|ly pending excuses. acco +43906|853|F|156318.11|1992-02-09|2-HIGH|Clerk#000000167|0|yly ironic packages wake furiously instructions. final, +43907|556|F|90823.56|1992-07-19|1-URGENT|Clerk#000000177|0|ges are slyly ironic braids. slyly bold dolphins after the silent excuses sle +43908|41|O|78980.25|1998-01-02|5-LOW|Clerk#000000751|0|jole slyly since the deposits. even accounts unwind slyly carefully final +43909|1030|F|72597.44|1994-01-08|2-HIGH|Clerk#000000015|0|ns. silent deposits are clo +43910|1027|O|77136.54|1997-03-30|5-LOW|Clerk#000000698|0|unusual excuses wake slyly slyly unusual +43911|1288|F|102359.80|1994-01-15|3-MEDIUM|Clerk#000000332|0|above the quickly even platelets. furiously express theodolite +43936|391|F|131105.28|1993-03-14|1-URGENT|Clerk#000000967|0|the bold, blithe foxes. blithely ironic +43937|1057|F|67050.21|1992-03-13|4-NOT SPECIFIED|Clerk#000000222|0| ironic accounts cajole silent request +43938|580|O|157031.95|1997-10-24|3-MEDIUM|Clerk#000000911|0|pendencies detect quickly according to the stealthily regular +43939|563|F|83563.85|1994-02-09|4-NOT SPECIFIED|Clerk#000000955|0|y regular packages. blithely express theodolites haggle fluffily abo +43940|830|F|221325.52|1993-02-22|1-URGENT|Clerk#000000790|0|s. final, final depe +43941|616|O|16634.01|1996-12-19|4-NOT SPECIFIED|Clerk#000000766|0|. blithely ironic instructions about the furiously pen +43942|199|O|215165.63|1996-08-18|5-LOW|Clerk#000000692|0|es doubt across the furiously ironic pinto beans. furiously fi +43943|557|O|108197.37|1997-10-13|5-LOW|Clerk#000000047|0|y final packages are blithely above the unusual asympt +43968|1169|O|85189.83|1996-09-01|2-HIGH|Clerk#000000854|0|ld excuses. requests wake. blithely special instructions +43969|835|O|245745.31|1998-07-27|2-HIGH|Clerk#000000800|0|regular requests. blithely even courts affix slyly ironic excus +43970|700|F|33081.55|1993-07-30|1-URGENT|Clerk#000000638|0|g foxes; deposits according +43971|1247|O|86207.19|1996-03-31|3-MEDIUM|Clerk#000000032|0|uffily pending packages. unusual, ironic accounts kindle +43972|1079|F|257880.07|1993-03-17|5-LOW|Clerk#000000858|0|ar pinto beans sleep furiously carefully final inst +43973|701|O|227259.98|1998-01-16|5-LOW|Clerk#000000324|0|affix after the slyly ironic p +43974|1103|F|75632.12|1994-09-17|4-NOT SPECIFIED|Clerk#000000810|0| accounts detect blithely furiously final depo +43975|332|F|146231.18|1995-01-05|4-NOT SPECIFIED|Clerk#000000046|0|ers. quickly regular requests after the sl +44000|278|F|167181.65|1992-10-05|4-NOT SPECIFIED|Clerk#000000700|0|ounts. blithely final packages are above the regular, exp +44001|631|O|137031.83|1997-09-24|4-NOT SPECIFIED|Clerk#000000924|0|xes cajole slyly bold dependencies. slyly unusual deposits haggle. even +44002|481|F|153469.27|1994-02-08|3-MEDIUM|Clerk#000000098|0|ed to cajole. carefully final deposits +44003|1475|O|92205.13|1995-11-18|5-LOW|Clerk#000000850|0|es according to the furiously ironic f +44004|706|O|118629.86|1995-07-24|4-NOT SPECIFIED|Clerk#000000816|0|fluffily from the requests. carefully express theodolites sleep +44005|406|F|7859.33|1993-09-04|3-MEDIUM|Clerk#000000269|0|e requests. pending pinto bean +44006|802|O|43763.61|1998-02-10|3-MEDIUM|Clerk#000000175|0|ag carefully. quickly ironic instructions detect eve +44007|155|O|49740.09|1995-05-31|3-MEDIUM|Clerk#000000008|0|ic, sly hockey players wake slyly ab +44032|697|F|219866.73|1993-03-30|5-LOW|Clerk#000000849|0|the blithely regula +44033|1370|F|59313.16|1992-01-11|1-URGENT|Clerk#000000109|0|requests nag quickly express requests. express pinto beans hag +44034|1078|O|168009.12|1996-06-16|3-MEDIUM|Clerk#000000814|0|deposits are carefully. furiously idle instru +44035|1174|F|20174.01|1992-02-21|2-HIGH|Clerk#000000718|0|fter the sly requests. even, even pinto beans do +44036|412|F|25421.40|1992-01-12|2-HIGH|Clerk#000000917|0|c ideas serve after the ideas. +44037|1249|F|126276.25|1992-06-29|2-HIGH|Clerk#000000938|0| packages. slyly enticing deposits wake furiously outside the stealthy, +44038|1021|O|57433.85|1997-04-16|2-HIGH|Clerk#000000693|0|al foxes. silent theodolites haggle. regular excuses maintain fluffily +44039|370|O|78320.61|1996-09-21|4-NOT SPECIFIED|Clerk#000000554|0|nal instructions use carefully. slyly bold packages should have to are +44064|856|F|80611.58|1993-03-04|3-MEDIUM|Clerk#000000362|0|ronic pinto beans. carefully even escapades a +44065|1486|F|218573.91|1993-07-04|5-LOW|Clerk#000000051|0|e slyly carefully bold fox +44066|125|O|169829.06|1997-04-24|4-NOT SPECIFIED|Clerk#000000401|0|ove the ironic, ironic theod +44067|919|O|124966.12|1996-11-26|1-URGENT|Clerk#000000148|0|ully silent, even theodolites. blithely pe +44068|1231|P|150826.75|1995-05-09|2-HIGH|Clerk#000000201|0|nently bold theodolites. bold +44069|1070|F|183556.17|1994-01-03|1-URGENT|Clerk#000000876|0|eas wake idly furiously ironic packages. quickly even packages haggle +44070|1258|O|230700.20|1997-09-26|4-NOT SPECIFIED|Clerk#000000350|0|odolites boost regularly. slyly regular ideas are furious +44071|898|F|143940.37|1992-04-16|4-NOT SPECIFIED|Clerk#000000987|0|inst the blithely silent requests are above the carefully fluffy requests. spe +44096|1021|O|221659.02|1997-01-29|2-HIGH|Clerk#000000333|0|ronic platelets wake quickly unusual, stealthy requests. quic +44097|293|O|25307.61|1995-12-19|2-HIGH|Clerk#000000457|0|egular packages after the accounts are express, final packages. b +44098|427|F|248148.70|1993-01-28|5-LOW|Clerk#000000866|0|courts boost quickly fluffily bold hockey players. deposits sleep. eve +44099|569|F|166406.11|1992-03-13|3-MEDIUM|Clerk#000000297|0| pending requests: slyly +44100|1231|O|1971.20|1998-06-12|5-LOW|Clerk#000000536|0|dolites. quickly pending i +44101|829|O|114080.03|1996-01-16|4-NOT SPECIFIED|Clerk#000000723|0|s. carefully even deposits haggle along the instructions. careful +44102|649|F|259189.43|1995-01-14|3-MEDIUM|Clerk#000000219|0|uffily ironic deposits sleep at the blithely brave acc +44103|802|O|82188.56|1997-02-07|5-LOW|Clerk#000000986|0|osits. furious requests sleep quickly among the blithely final notornis. re +44128|64|O|40439.46|1996-11-17|3-MEDIUM|Clerk#000000729|0|tructions unwind regular pa +44129|5|O|67276.32|1998-03-14|3-MEDIUM|Clerk#000000922|0|press warthogs. bli +44130|491|O|310777.95|1996-01-29|1-URGENT|Clerk#000000939|0| pinto beans. fluffily regular requests hagg +44131|626|O|208297.74|1997-10-23|4-NOT SPECIFIED|Clerk#000000445|0|ven pinto beans use furiously regular somas. ironic +44132|1246|O|118995.00|1997-03-29|4-NOT SPECIFIED|Clerk#000000333|0|c accounts believe express dependencies. even, bold platelets will use +44133|1360|F|97905.25|1993-01-07|2-HIGH|Clerk#000000542|0|uses. ironic, final deposits inte +44134|826|F|219385.86|1994-10-31|2-HIGH|Clerk#000000408|0|ly after the express excuses. even, regular pinto beans sle +44135|1120|F|74962.00|1994-11-10|4-NOT SPECIFIED|Clerk#000000475|0|against the regular accounts haggle furiously blithely ironic dependencies. b +44160|401|O|176023.39|1996-11-21|1-URGENT|Clerk#000000777|0|olites. deposits in place of the furiously silent requests use slyly among +44161|1183|O|5173.69|1996-09-17|3-MEDIUM|Clerk#000000426|0|inal deposits thrash stealthily. slyl +44162|157|F|26350.29|1993-03-20|2-HIGH|Clerk#000000943|0|inal accounts boost dogged +44163|1180|O|174534.90|1997-01-14|3-MEDIUM|Clerk#000000852|0|nusual platelets wake slyly special, regular excuses. unusual instru +44164|1084|O|52585.73|1996-04-16|2-HIGH|Clerk#000000001|0|ding, bold accounts. bravely express theodo +44165|280|O|317609.90|1996-07-31|4-NOT SPECIFIED|Clerk#000000532|0|y furious packages cajole quickly. carefully ironic accounts along the re +44166|1105|O|138116.37|1997-11-28|1-URGENT|Clerk#000000218|0|ckages: furiously ironic epitaphs nod: ir +44167|323|F|220860.47|1992-01-31|1-URGENT|Clerk#000000078|0|e furiously packages. orbits around the fluffily r +44192|1213|O|96979.69|1997-07-05|1-URGENT|Clerk#000000005|0|s pinto beans according to the final dependencies cajole sly +44193|992|O|220365.30|1997-08-19|3-MEDIUM|Clerk#000000974|0|ing foxes cajole carefully ruthless, +44194|121|O|212038.01|1996-07-29|1-URGENT|Clerk#000000738|0|l packages wake furiously. +44195|319|O|122410.83|1996-02-21|1-URGENT|Clerk#000000967|0|ly quickly final dep +44196|199|F|49230.58|1994-08-23|4-NOT SPECIFIED|Clerk#000000511|0|fully bold pinto beans maintain quickly blithely regular acc +44197|298|F|245901.68|1994-01-21|2-HIGH|Clerk#000000364|0|s above the quickly unusual requests. ironic pinto beans could have +44198|148|F|136856.69|1995-01-05|1-URGENT|Clerk#000000327|0|tions. bold asymptotes are fluffily dugouts. ideas haggle slyly; excuses wake +44199|1402|F|166909.30|1992-03-05|5-LOW|Clerk#000000371|0|fully special packages. slyly regular ideas use carefu +44224|536|F|60321.28|1993-08-10|2-HIGH|Clerk#000000048|0|. regular instructions haggle blithely. furiously +44225|1024|F|202953.23|1994-04-04|2-HIGH|Clerk#000000453|0|ual theodolites. carefully ironic deposits play aft +44226|1360|O|10413.09|1995-12-05|5-LOW|Clerk#000000393|0|sual accounts wake according to the bold packages. qu +44227|1048|F|133206.50|1992-03-26|2-HIGH|Clerk#000000585|0|oxes wake fluffily quietly pending deposits. busily regular excuses belie +44228|1237|O|145648.86|1998-03-14|1-URGENT|Clerk#000000481|0|egular, final asymptotes haggle furiously regular ac +44229|430|F|179265.88|1993-05-15|3-MEDIUM|Clerk#000000475|0|ites mold furiously across the furi +44230|446|F|27325.02|1993-03-19|4-NOT SPECIFIED|Clerk#000000818|0|ccording to the express ideas. bold accounts +44231|508|F|243471.44|1994-11-04|4-NOT SPECIFIED|Clerk#000000812|0| packages! furiously silent requests alongside of t +44256|220|O|286099.55|1995-11-20|5-LOW|Clerk#000000324|0|dependencies play quickly against the fluffily pending pinto beans. +44257|590|O|270112.20|1996-09-08|4-NOT SPECIFIED|Clerk#000000284|0| beans. furiously silent +44258|830|F|171399.73|1994-06-04|4-NOT SPECIFIED|Clerk#000000507|0|tes are carefully pending, thin accounts. bold accounts cajole after the +44259|1177|O|78443.35|1997-07-29|4-NOT SPECIFIED|Clerk#000000651|0|y quickly ironic foxes. quickly ironic excuses integrate sly +44260|1331|O|50312.10|1998-02-20|5-LOW|Clerk#000000565|0|pending, express de +44261|446|F|209930.28|1992-03-24|2-HIGH|Clerk#000000554|0|s silent instructions are at the slyl +44262|467|F|11666.37|1994-05-10|3-MEDIUM|Clerk#000000442|0|regular sauternes. furiously fi +44263|1309|O|208773.30|1998-04-20|3-MEDIUM|Clerk#000000704|0|nts haggle carefully slyly final accounts. slyly regular requests wake flu +44288|304|O|239521.23|1996-11-11|3-MEDIUM|Clerk#000000793|0|refully. special sheaves was fluffily final +44289|403|O|94516.30|1996-07-25|2-HIGH|Clerk#000000114|0|e quickly around the furiously final instructio +44290|218|F|236055.16|1993-03-22|3-MEDIUM|Clerk#000000284|0|sly special foxes. pendi +44291|214|O|19921.07|1995-12-19|1-URGENT|Clerk#000000408|0|e carefully unusual instructions. slyly regular ideas are. +44292|763|O|201393.89|1995-06-15|4-NOT SPECIFIED|Clerk#000000822|0|ular ideas haggle blithely accord +44293|514|O|203046.12|1996-07-20|2-HIGH|Clerk#000000359|0|t deposits use blit +44294|850|F|121868.64|1994-06-04|5-LOW|Clerk#000000913|0|counts hang carefully pending packages. slyly unusual deposits cajole abo +44295|1118|F|212058.55|1993-01-24|3-MEDIUM|Clerk#000000877|0| ironic decoys kindle carefully. slyly even excuses sleep along +44320|269|F|30006.90|1994-04-30|3-MEDIUM|Clerk#000000530|0|the enticing, express deposits; fluffily special hockey players bo +44321|1250|O|62315.86|1995-06-23|1-URGENT|Clerk#000000386|0|tructions according to the carefully final requests hagg +44322|160|O|144308.90|1995-10-13|4-NOT SPECIFIED|Clerk#000000819|0|ites. accounts among the final requests ha +44323|355|F|294271.64|1992-08-08|3-MEDIUM|Clerk#000000342|0|nal pinto beans sleep carefully +44324|397|O|200088.32|1997-10-22|3-MEDIUM|Clerk#000000952|0|gular instructions above the ironic instructions +44325|986|F|40153.12|1994-02-11|3-MEDIUM|Clerk#000000262|0|gular packages inside the regularly express accounts use blithely alon +44326|1003|F|98737.18|1992-09-07|3-MEDIUM|Clerk#000000110|0|y blithely express packages. requests use final +44327|235|O|116993.82|1997-12-19|4-NOT SPECIFIED|Clerk#000000784|0|dencies. bold foxes use ca +44352|1499|F|194120.56|1994-09-16|4-NOT SPECIFIED|Clerk#000000504|0| packages grow quic +44353|598|F|166951.87|1995-02-04|1-URGENT|Clerk#000000474|0|telets. ironic packages wake slyly. carefull +44354|1129|O|172022.41|1997-06-04|4-NOT SPECIFIED|Clerk#000000810|0|unts use among the furiously eve +44355|532|O|254021.78|1996-02-22|5-LOW|Clerk#000000962|0|, even dependencies. slyly final foxes along the final pearls mus +44356|782|O|221629.37|1996-06-14|4-NOT SPECIFIED|Clerk#000000791|0|nto beans integrate after the furiously regular waters. deposits affix blithe +44357|134|O|142784.39|1995-11-16|2-HIGH|Clerk#000000082|0|egular requests run caref +44358|1282|F|227385.10|1993-04-02|2-HIGH|Clerk#000000321|0|e ideas sleep fluffily pending, special +44359|856|F|331227.17|1993-11-30|2-HIGH|Clerk#000000788|0| furiously ironic dependen +44384|1106|O|87828.35|1997-12-31|1-URGENT|Clerk#000000986|0| quickly. express theodoli +44385|1090|O|28949.94|1996-01-30|3-MEDIUM|Clerk#000000035|0|ending deposits snooze abo +44386|100|F|166573.92|1992-04-10|3-MEDIUM|Clerk#000000520|0|s haggle carefully unusual, ironic accounts. blithe ideas cajole blit +44387|1390|F|163105.62|1994-02-05|5-LOW|Clerk#000000542|0|y even accounts. blithely reg +44388|1339|O|108774.24|1997-04-29|5-LOW|Clerk#000000828|0|es are carefully after the final, final deposits. regular, ironic +44389|326|F|50611.87|1994-02-24|4-NOT SPECIFIED|Clerk#000000776|0| around the ironic accounts. pending frets wake blithely. slyly +44390|940|F|252571.26|1993-12-04|4-NOT SPECIFIED|Clerk#000000193|0|ular deposits sleep against the furiously express acco +44391|220|F|196916.34|1994-01-11|4-NOT SPECIFIED|Clerk#000001000|0|usly even gifts haggle blithely across the quickly even deposits. bli +44416|806|O|213363.12|1996-06-20|5-LOW|Clerk#000000545|0|ges after the slyly regu +44417|779|F|169049.46|1993-11-29|4-NOT SPECIFIED|Clerk#000000490|0|ackages. furiously thin packages x-ray +44418|739|F|247605.60|1995-02-01|5-LOW|Clerk#000000675|0|regular excuses breach furiously along the slyly ruthless the +44419|1189|O|55175.28|1997-06-26|4-NOT SPECIFIED|Clerk#000000385|0|haggle even asymptotes. carefully pending instructions sleep blithely at t +44420|85|O|73733.80|1998-04-27|1-URGENT|Clerk#000000730|0|lar pinto beans. unusual deposits hang furiously blithely express r +44421|911|O|126172.77|1998-05-23|5-LOW|Clerk#000000241|0|y final platelets solve +44422|67|F|204362.68|1992-04-14|3-MEDIUM|Clerk#000001000|0|pliers. blithely ironic courts detect. unusual pin +44423|493|F|85608.63|1992-07-30|1-URGENT|Clerk#000000914|0|ackages boost slyly blithely silent instructions. packages among the +44448|1319|F|270276.63|1994-04-14|1-URGENT|Clerk#000000368|0|kages. slyly blithe pinto beans a +44449|994|O|138643.98|1995-08-21|3-MEDIUM|Clerk#000000844|0|uffily past the fina +44450|556|F|131287.42|1993-10-10|1-URGENT|Clerk#000000582|0|the regular realms. slyly bold foxes boost furiously. furiously ironic deposi +44451|1177|O|318408.07|1995-09-12|5-LOW|Clerk#000000591|0|cies haggle. slyly stealthy accounts was slyly +44452|574|O|134006.02|1995-12-10|4-NOT SPECIFIED|Clerk#000000387|0|gular foxes mold according to the furiously final instructions. slyly ex +44453|1135|F|78116.03|1994-03-26|5-LOW|Clerk#000000671|0|eposits. final accounts wake quickly after the closely +44454|676|O|188788.74|1996-12-16|2-HIGH|Clerk#000000273|0|ole slyly. blithely ironic sauternes sublat +44455|82|O|114691.79|1997-06-19|3-MEDIUM|Clerk#000000182|0|s are quickly at the quickly +44480|244|F|82612.00|1993-05-13|3-MEDIUM|Clerk#000000201|0|ts. blithely unusual packages are furiously slyly bold requests +44481|241|O|166948.46|1996-06-06|4-NOT SPECIFIED|Clerk#000000429|0|thely ironic accounts hang final, even requests. express, fi +44482|1499|O|78705.16|1998-03-18|5-LOW|Clerk#000000999|0|the ironic requests. furiously express requests cajole ironic +44483|904|O|288093.09|1996-07-31|5-LOW|Clerk#000000484|0|e regular packages solve ironic i +44484|1057|O|320234.13|1996-02-14|1-URGENT|Clerk#000000903|0|e carefully ironic depths. busily bold foxes w +44485|440|F|209629.76|1994-06-26|2-HIGH|Clerk#000000861|0|usual requests are beside the slyly +44486|4|F|39197.54|1992-07-10|1-URGENT|Clerk#000000280|0|ic theodolites. regular, pending accounts sleep quickly epitaphs. ev +44487|916|F|307569.27|1994-09-12|1-URGENT|Clerk#000000219|0| even pinto beans eat. regular, silent instructions against the +44512|958|F|50099.40|1993-04-13|3-MEDIUM|Clerk#000000626|0|ites haggle blithely around the slyly ironic packages. pinto beans sleep +44513|1309|F|25476.59|1994-07-10|1-URGENT|Clerk#000000471|0|ular asymptotes wake furiously special foxes. qu +44514|1256|F|47212.87|1994-12-04|2-HIGH|Clerk#000000526|0|ts near the even, express deposits wake final instruct +44515|1432|O|41790.82|1996-09-27|3-MEDIUM|Clerk#000000152|0| sleep slyly along the blithely iron +44516|871|O|264153.88|1995-06-30|1-URGENT|Clerk#000000962|0|uriously special braids. carefully ruthless asympto +44517|940|F|205740.54|1994-04-24|3-MEDIUM|Clerk#000000883|0|ound the carefully express accounts boost slyly sp +44518|97|O|104361.68|1996-07-11|4-NOT SPECIFIED|Clerk#000000979|0|regular deposits wake fluffily regular, express somas. blithely reg +44519|1303|F|200349.98|1993-05-20|2-HIGH|Clerk#000000677|0|regularly furiously unusual deposits. final foxes wake slyl +44544|1243|O|202117.58|1998-03-04|1-URGENT|Clerk#000000154|0|ing to the bold requests. sl +44545|37|O|144657.43|1998-01-10|5-LOW|Clerk#000000701|0|-- sometimes regular waters affix quickly. fluff +44546|637|F|140613.51|1993-03-25|1-URGENT|Clerk#000000936|0|ronic packages cajole. carefully quiet platelets cajole above +44547|712|O|112411.28|1995-04-27|1-URGENT|Clerk#000000492|0| regular depths. furiou +44548|790|O|80708.08|1997-07-26|4-NOT SPECIFIED|Clerk#000000082|0|ymptotes use. enticing pac +44549|814|F|162378.08|1992-01-23|3-MEDIUM|Clerk#000000915|0|xes. somas are carefully +44550|691|O|80272.57|1997-08-26|5-LOW|Clerk#000000192|0|! silently ironic requests sleep. qu +44551|454|O|30182.92|1996-12-27|2-HIGH|Clerk#000000720|0|n packages sleep finally. regular accounts slee +44576|1474|F|139746.69|1994-12-26|4-NOT SPECIFIED|Clerk#000000724|0|osits haggle slyly ironic requests. +44577|922|O|120403.80|1997-03-13|2-HIGH|Clerk#000000890|0| deposits cajole quickly after the closely ironic foxes +44578|862|O|288177.16|1997-02-03|1-URGENT|Clerk#000000115|0|against the carefully regular foxes. regular packages among +44579|850|P|167200.12|1995-06-04|4-NOT SPECIFIED|Clerk#000000395|0|le furiously. carefully regu +44580|1357|F|92679.85|1992-03-22|2-HIGH|Clerk#000000183|0|yly blithely regular packages? thin request +44581|193|O|285358.60|1997-11-15|4-NOT SPECIFIED|Clerk#000000478|0|s after the ironic requests are furi +44582|1390|O|83017.68|1996-11-24|4-NOT SPECIFIED|Clerk#000000884|0|onic accounts haggle blithe +44583|605|F|69979.73|1994-10-05|5-LOW|Clerk#000000198|0|ironic ideas cajole quickly final requests. blithely p +44608|239|F|274266.57|1992-02-06|1-URGENT|Clerk#000000181|0|according to the quickly express pinto beans? slyly ironic excuses could have +44609|1246|O|197417.41|1995-06-19|5-LOW|Clerk#000000124|0| final asymptotes unwind furiously along the slyly regular pinto beans- +44610|155|P|164194.34|1995-03-11|2-HIGH|Clerk#000000568|0|along the regular, fluffy requests. +44611|1058|O|139759.39|1997-07-21|1-URGENT|Clerk#000000891|0| carefully bold ideas against the +44612|1006|P|161131.07|1995-03-14|2-HIGH|Clerk#000000581|0|fily regular dependencies mold slyly ironic, ironic th +44613|514|F|129205.00|1993-08-31|2-HIGH|Clerk#000000026|0|, special requests. p +44614|17|F|188986.88|1993-06-15|5-LOW|Clerk#000000656|0|e the even, pending ideas. carefully unusual requests a +44615|523|F|200442.72|1993-05-10|3-MEDIUM|Clerk#000000160|0| instructions. quickly special ideas are furiously iron +44640|1129|O|113079.99|1997-10-02|4-NOT SPECIFIED|Clerk#000000538|0|nusual dependencies. quickly regular platelets wa +44641|875|O|152663.34|1998-02-19|1-URGENT|Clerk#000000660|0|hin packages breach +44642|169|O|264710.82|1997-12-14|1-URGENT|Clerk#000000323|0|its play across the furio +44643|1126|F|136280.48|1994-03-19|3-MEDIUM|Clerk#000000148|0|? furiously regular asymptotes affix. +44644|1282|O|28265.08|1996-01-24|5-LOW|Clerk#000000462|0|ong the carefully final platelets. final requests boost slyly. quickly +44645|1006|F|62868.03|1995-04-08|4-NOT SPECIFIED|Clerk#000000161|0|regular sentiments detect quickly across the furiousl +44646|1400|F|99330.84|1992-01-05|5-LOW|Clerk#000000348|0|pecial accounts use. special, +44647|934|F|249627.02|1992-01-25|5-LOW|Clerk#000000034|0| slow packages nag according to the blithely pe +44672|1429|O|109993.82|1998-04-15|3-MEDIUM|Clerk#000000346|0|lent courts sleep quiet asymptotes. bravely i +44673|973|O|57299.78|1996-09-04|2-HIGH|Clerk#000000575|0|oldly furiously ironic patterns. +44674|124|O|220063.66|1996-09-28|2-HIGH|Clerk#000000248|0|ages among the unusual packages cajole furiously ag +44675|898|O|76104.89|1996-03-27|3-MEDIUM|Clerk#000000963|0|regular theodolites use. un +44676|923|O|129270.09|1998-03-24|4-NOT SPECIFIED|Clerk#000000674|0|lyly across the express platelets. slyly even packages +44677|310|O|51797.10|1997-08-04|4-NOT SPECIFIED|Clerk#000000982|0|are bold instructions. courts detect carefully above the slyly even deposits. +44678|1291|F|189788.92|1992-10-14|5-LOW|Clerk#000000223|0|ording to the final reques +44679|757|F|92352.93|1992-06-04|3-MEDIUM|Clerk#000000280|0|ickly unusual packages abou +44704|464|O|127674.76|1997-02-07|1-URGENT|Clerk#000000346|0| beans nag slyly after the ironic, cl +44705|91|O|199189.72|1996-09-05|2-HIGH|Clerk#000000544|0|ut the furiously ironic platelets. carefully ir +44706|190|F|201472.55|1993-03-31|5-LOW|Clerk#000000157|0|lly close instructions alongside of the f +44707|1013|O|431771.98|1997-08-14|1-URGENT|Clerk#000000313|0|ly fluffily special ideas. +44708|20|F|61676.36|1994-07-28|4-NOT SPECIFIED|Clerk#000000128|0| slyly ironic accounts sleep carefully. slyly pending dep +44709|925|O|50249.97|1996-01-17|5-LOW|Clerk#000000985|0|haggle blithely. carefully ironic accounts integrate. slyly regular pi +44710|1399|O|41667.59|1995-05-16|3-MEDIUM|Clerk#000000783|0|ly final accounts. fluffy foxes wake +44711|1000|F|57786.94|1994-09-07|2-HIGH|Clerk#000000607|0|pinto beans. requests +44736|490|F|99486.68|1993-04-25|1-URGENT|Clerk#000000701|0|e of the unusual instructions. silent, silent excuses above t +44737|1133|F|208147.73|1992-11-20|3-MEDIUM|Clerk#000000697|0|ending theodolites. special deposits promise fluffi +44738|1045|F|164442.84|1993-12-06|4-NOT SPECIFIED|Clerk#000000421|0|ar ideas. slyly blithe +44739|871|O|57549.92|1998-05-06|3-MEDIUM|Clerk#000000040|0|nt foxes after the deposits shall ha +44740|964|F|109091.63|1992-06-05|5-LOW|Clerk#000000360|0|platelets haggle about the accounts. f +44741|910|O|19852.79|1998-04-15|2-HIGH|Clerk#000000491|0| regular dugouts against +44742|1286|F|141392.17|1993-03-07|2-HIGH|Clerk#000000617|0|ully pending deposits above the pending, bold instructions haggle re +44743|1393|O|68970.28|1996-01-04|5-LOW|Clerk#000000769|0|slyly even packages according to the quickly even foxes are furiously fina +44768|962|F|168623.60|1992-05-27|4-NOT SPECIFIED|Clerk#000000965|0|requests promise fluffily. deposits inte +44769|481|F|58289.68|1993-02-11|4-NOT SPECIFIED|Clerk#000000592|0|lithely. slyly ironic packages are caref +44770|938|O|168895.98|1998-05-29|3-MEDIUM|Clerk#000000375|0|ndencies cajole blithely unusual, regular ideas: blithely brave braids are +44771|1103|O|182383.11|1996-10-10|1-URGENT|Clerk#000000974|0|old, even packages about the express, regular i +44772|742|F|156052.38|1994-04-01|4-NOT SPECIFIED|Clerk#000000578|0|areful accounts. quickly regular platelets cajole a +44773|974|O|77002.08|1996-04-11|1-URGENT|Clerk#000000864|0|side of the furious accounts-- foxes sleep slyly regular packag +44774|691|O|153616.65|1998-07-10|4-NOT SPECIFIED|Clerk#000000535|0|ckages. final packages cajole caref +44775|925|F|12940.85|1994-09-30|3-MEDIUM|Clerk#000000533|0|kages. accounts haggle about the regular dolphins. slyly ironic instructions m +44800|1355|O|205476.40|1995-08-24|4-NOT SPECIFIED|Clerk#000000205|0|y final platelets haggle +44801|517|O|48643.88|1996-12-26|4-NOT SPECIFIED|Clerk#000000080|0|r foxes sleep across the quickly pending pinto beans. ca +44802|281|F|41435.81|1992-01-29|5-LOW|Clerk#000000069|0|sts haggle. even pinto +44803|8|O|174071.02|1998-07-27|3-MEDIUM|Clerk#000000580|0|r theodolites. unusual excuses haggle bli +44804|70|O|190339.14|1996-02-14|5-LOW|Clerk#000000665|0|s requests use carefully according to the slyly unusual deposits +44805|559|F|59956.12|1992-09-15|2-HIGH|Clerk#000000164|0|ackages boost fluffily regular, ironic accounts. slyly even theodolites aff +44806|637|O|134209.34|1997-12-07|1-URGENT|Clerk#000000087|0| carefully regular requests haggle quickly about the regular court +44807|40|O|200970.35|1998-03-26|2-HIGH|Clerk#000000207|0|accounts affix. final, ironic platelets x +44832|1033|O|15640.24|1996-01-10|4-NOT SPECIFIED|Clerk#000000056|0| carefully unusual theodolites sleep closely unusual theodolites. carefully +44833|583|F|60700.44|1994-10-17|2-HIGH|Clerk#000000669|0|slyly special deposits. unusual courts kindle. unusual platelets boos +44834|880|F|70590.51|1994-04-21|3-MEDIUM|Clerk#000000719|0|nd the carefully express asymptotes thrash except the carefu +44835|1243|O|225971.65|1997-09-02|5-LOW|Clerk#000000074|0|ideas haggle along the blithely even packages. express +44836|16|F|188024.46|1994-09-12|3-MEDIUM|Clerk#000000890|0|s alongside of the unusual packages cajole carefully according to the f +44837|661|O|213788.71|1996-06-06|4-NOT SPECIFIED|Clerk#000000746|0| furiously silent excuses cajole quickly packages. even deposits are blithel +44838|974|O|165125.58|1997-10-04|4-NOT SPECIFIED|Clerk#000000943|0|uctions. regular instructions along the blithely regular d +44839|440|F|172701.40|1992-06-12|1-URGENT|Clerk#000000486|0|fully express ideas +44864|433|F|222095.99|1993-06-18|5-LOW|Clerk#000000970|0|ic, ironic ideas haggle slyly furiously +44865|409|O|158370.96|1997-10-04|5-LOW|Clerk#000000622|0|ual ideas. ironic, ironi +44866|250|O|213830.88|1997-01-25|4-NOT SPECIFIED|Clerk#000000704|0|theodolites around the asymptotes +44867|347|F|37527.33|1994-07-27|2-HIGH|Clerk#000000001|0|t the regular dependencies. sile +44868|7|O|137334.10|1997-03-17|1-URGENT|Clerk#000000708|0|le. permanently pending excuses cajole carefully among the blithely iro +44869|463|F|141925.67|1992-08-23|3-MEDIUM|Clerk#000000045|0|t the blithely final instructions. special dolphins impress above the bl +44870|652|O|258328.96|1997-08-25|2-HIGH|Clerk#000000438|0|regular pinto beans affix. requests haggle s +44871|757|P|179661.34|1995-05-04|1-URGENT|Clerk#000000174|0|packages wake furiously carefully regular deposits: fluffily p +44896|1256|O|204646.01|1996-06-01|5-LOW|Clerk#000000934|0|rding to the furiously bold theodolites. express ideas are carefully among th +44897|1312|F|133192.65|1993-03-10|2-HIGH|Clerk#000000055|0|luffily special orbits. daringly regular depo +44898|110|F|94271.88|1992-04-03|4-NOT SPECIFIED|Clerk#000000030|0| the unusual packages. blithely final instructions after the car +44899|988|O|112151.83|1998-04-16|3-MEDIUM|Clerk#000000180|0|nt excuses are among the slyly +44900|1316|F|166794.07|1993-02-10|3-MEDIUM|Clerk#000000383|0|lly even packages. regularly pending dependencies cajole furiously alongsid +44901|68|O|29126.71|1997-02-09|3-MEDIUM|Clerk#000000750|0|s doubt carefully carefully special accounts. even foxes are excus +44902|314|O|8663.01|1998-04-14|1-URGENT|Clerk#000000440|0|ts. special deposits +44903|41|F|217168.28|1992-03-10|5-LOW|Clerk#000000522|0|express theodolites boost fluffily. fluf +44928|446|O|46550.85|1996-01-13|2-HIGH|Clerk#000000427|0|lly ironic excuses detect blithe +44929|794|F|161556.85|1993-07-31|2-HIGH|Clerk#000000292|0|s hang blithely throughout the blithely final asymptotes. even, bold foxes h +44930|52|F|225401.58|1994-09-23|1-URGENT|Clerk#000000345|0|ickly stealthy somas along +44931|1070|O|12920.23|1995-11-10|1-URGENT|Clerk#000000647|0|s after the blithely regular instructions are carefully af +44932|1187|O|269191.55|1996-01-13|3-MEDIUM|Clerk#000000548|0|uests among the furiously blithe somas nag q +44933|193|F|95753.19|1993-08-18|5-LOW|Clerk#000000891|0|c frets doubt blithely. quickly f +44934|7|F|34119.28|1993-04-20|1-URGENT|Clerk#000000580|0|ly express ideas cajole fluffily. carefully regul +44935|197|F|269286.11|1993-11-18|2-HIGH|Clerk#000000247|0|ve the slyly even accounts. f +44960|1258|P|215845.08|1995-05-04|5-LOW|Clerk#000000372|0|ake blithely according to the quickly ironic asymptotes. furiously ironic +44961|1132|O|10914.53|1996-02-13|5-LOW|Clerk#000000855|0|hins boost furiously unusual deposits. special instructions eat slyly eve +44962|2|F|45657.87|1994-12-29|3-MEDIUM|Clerk#000000895|0|ideas. carefully ironic theodolite +44963|28|O|133652.47|1997-02-25|3-MEDIUM|Clerk#000000922|0|en requests; request +44964|274|O|303035.83|1996-09-02|1-URGENT|Clerk#000000693|0|ar requests across the ideas nag fluffily against the never final instructi +44965|44|O|269819.56|1995-10-03|5-LOW|Clerk#000000871|0|ronic dolphins affix +44966|298|F|73385.12|1992-03-06|4-NOT SPECIFIED|Clerk#000000487|0|ithely fluffy, final forges. blithely pending deposits snooze. reg +44967|830|O|84361.87|1996-09-30|3-MEDIUM|Clerk#000000543|0|tructions. bold accounts +44992|137|F|187064.44|1992-12-25|1-URGENT|Clerk#000000964|0|ar theodolites haggle slyly pending, ironic accoun +44993|241|O|31268.98|1995-12-22|2-HIGH|Clerk#000000111|0|egular requests. even pinto beans nag furiously bold, unusual i +44994|95|O|36172.14|1998-01-09|3-MEDIUM|Clerk#000000302|0|aggle furiously ironic foxes. ironic, ironic theodolites haggle about +44995|781|F|134013.09|1994-08-07|2-HIGH|Clerk#000000095|0|ackages are special accounts. +44996|824|O|117400.53|1996-10-20|2-HIGH|Clerk#000000230|0|ial forges sleep carefully across the slyly sil +44997|760|O|117234.60|1995-09-29|5-LOW|Clerk#000000659|0|haggle carefully. regular dolphins use blithely. furiously regu +44998|1468|O|136183.56|1996-12-17|1-URGENT|Clerk#000000053|0|carefully ironic theodolites. carefully unusual packages abou +44999|73|F|112103.63|1993-01-23|3-MEDIUM|Clerk#000000945|0|t the requests sleep against the furiously special ideas. furiously express +45024|971|O|207605.90|1998-05-19|2-HIGH|Clerk#000000756|0|quickly regular deposits cajole across the requests. closely pending theod +45025|1441|P|202812.28|1995-04-12|2-HIGH|Clerk#000000140|0|r deposits. final deposits engage express platelets. reque +45026|200|O|135378.15|1996-01-25|1-URGENT|Clerk#000000188|0|osits. furiously sly tithes about the packages haggle quickly ex +45027|1135|F|58277.35|1992-09-13|3-MEDIUM|Clerk#000000840|0|lithely bold pinto beans above the slyly express packages cajole ne +45028|103|O|125630.09|1996-03-05|3-MEDIUM|Clerk#000000579|0| furiously deposits. closely +45029|547|F|142822.97|1993-07-04|2-HIGH|Clerk#000000141|0|x carefully slyly unusual pinto beans. carefully fina +45030|293|F|227308.45|1993-07-25|2-HIGH|Clerk#000000230|0|uffily final accounts. carefully +45031|526|F|162889.75|1992-11-23|5-LOW|Clerk#000000557|0|yly around the always special acc +45056|574|F|230889.52|1994-10-24|1-URGENT|Clerk#000000732|0| deposits. slyly pending requests s +45057|1097|O|231431.83|1997-03-19|5-LOW|Clerk#000000441|0|egular packages. ironic Tir +45058|221|O|220623.13|1997-01-13|4-NOT SPECIFIED|Clerk#000000697|0|iously final accounts-- quickly fi +45059|124|F|239264.56|1995-02-04|4-NOT SPECIFIED|Clerk#000000905|0| accounts. enticingly express requests boost. bli +45060|593|F|35655.75|1994-06-25|4-NOT SPECIFIED|Clerk#000000497|0|pending braids. furiously ironic dolphins a +45061|1465|O|148154.27|1996-04-02|3-MEDIUM|Clerk#000000261|0|arefully unusual packages use blithely regular excuse +45062|1418|O|225285.72|1998-06-12|4-NOT SPECIFIED|Clerk#000000724|0|sly special foxes nag sometimes above the pinto beans. slyly pending forges us +45063|142|O|260107.98|1997-01-11|1-URGENT|Clerk#000000149|0|dle platelets. final, bold requ +45088|1144|F|65973.42|1993-11-23|5-LOW|Clerk#000000900|0|ent accounts cajole regularly bold theodolites; +45089|559|F|51943.14|1994-01-28|4-NOT SPECIFIED|Clerk#000000896|0|of the fluffily special packages haggle furiously ideas. thinly i +45090|176|F|80291.23|1993-07-06|5-LOW|Clerk#000000445|0|onic pinto beans cajole carefully s +45091|1307|O|40887.68|1995-09-03|1-URGENT|Clerk#000000035|0| furiously carefully regular Tiresias. regular, +45092|668|O|121100.21|1996-09-11|3-MEDIUM|Clerk#000000337|0|press foxes about the fluffily +45093|523|O|176857.77|1998-03-15|4-NOT SPECIFIED|Clerk#000000658|0|haggle across the slyly even theodolites. unusual, even requests sleep carefu +45094|260|O|117631.41|1997-04-14|5-LOW|Clerk#000000483|0|ctions detect requests. final requests haggle thinly bold depend +45095|707|O|49921.18|1997-04-04|5-LOW|Clerk#000000287|0| sleep slyly accordin +45120|259|F|181824.60|1994-04-10|1-URGENT|Clerk#000000494|0| carefully silent account +45121|1132|O|23861.94|1998-04-19|5-LOW|Clerk#000000482|0|refully final packages wake +45122|1436|F|152060.54|1992-11-08|3-MEDIUM|Clerk#000000717|0|dly. regular, silent packages beli +45123|1258|O|161434.28|1998-03-28|4-NOT SPECIFIED|Clerk#000000050|0|silent deposits sleep even packages. express requests would +45124|392|O|16129.63|1998-01-20|1-URGENT|Clerk#000000056|0|tes. ironic, bold foxes cajo +45125|155|F|189948.73|1992-05-29|1-URGENT|Clerk#000000099|0|y final foxes haggl +45126|925|F|64183.85|1992-05-17|2-HIGH|Clerk#000000789|0|. ironic deposits wake! special, even depths use above the even instructi +45127|14|F|185902.85|1992-12-31|3-MEDIUM|Clerk#000000642|0|leep carefully. ironic requests use slyly blithely final packages. +45152|1412|O|220636.44|1997-10-23|1-URGENT|Clerk#000000167|0|ly; accounts sleep along the ironic, special theodolites. pending +45153|559|F|16690.28|1992-05-02|5-LOW|Clerk#000000450|0|hely pending deposits sleep slyly at the requ +45154|209|O|273589.23|1996-10-30|1-URGENT|Clerk#000000802|0|nal deposits boost slyly acr +45155|745|F|202620.20|1995-02-16|5-LOW|Clerk#000000116|0|accounts wake carefully fluffily regular instruct +45156|1019|F|121896.80|1995-02-13|5-LOW|Clerk#000000514|0|y. fluffily regular instructions wake among the +45157|1496|O|76665.39|1997-05-14|3-MEDIUM|Clerk#000000329|0|ts nag special, bold packages. furiously regular deposits serve from th +45158|1448|F|86505.67|1993-04-11|5-LOW|Clerk#000000947|0|ons. pending, ironic +45159|665|F|225953.16|1994-05-08|3-MEDIUM|Clerk#000000904|0|ously. quickly regular courts sublate pending theodolit +45184|1339|F|301304.29|1993-06-18|5-LOW|Clerk#000000705|0|ress excuses maintain carefully i +45185|44|F|228121.46|1993-03-24|4-NOT SPECIFIED|Clerk#000000277|0|s are furiously slyly +45186|818|O|144092.68|1998-05-11|1-URGENT|Clerk#000000881|0|ets. quickly fluffy deposits s +45187|409|F|193913.88|1993-11-12|3-MEDIUM|Clerk#000000266|0| cajole carefully quickly bold pinto beans. express foxes wake slyly dogge +45188|907|O|337386.66|1996-08-10|5-LOW|Clerk#000000464|0|. regular deposits nag furiously blithely r +45189|1451|F|224749.34|1994-12-12|1-URGENT|Clerk#000000107|0|ironic excuses sleep carefully final requests. final excuses about the acco +45190|1118|F|138605.11|1993-11-20|2-HIGH|Clerk#000000634|0|encies nag slyly. furiously ironic forges wake slyly +45191|751|F|22414.22|1992-11-13|1-URGENT|Clerk#000000028|0|ts use after the slyly close ideas. carefully +45216|931|O|41845.36|1996-06-27|5-LOW|Clerk#000000021|0|ly final accounts. carefully bold accounts boost blithe +45217|265|F|98852.71|1993-09-02|4-NOT SPECIFIED|Clerk#000000336|0|ns. furiously bold instructions integrate furious +45218|727|F|71774.99|1994-05-11|5-LOW|Clerk#000000178|0|ong the quickly bold instructions are fluffily furiously u +45219|1003|F|228367.86|1992-03-01|5-LOW|Clerk#000000681|0|are carefully theodo +45220|442|O|130285.84|1997-05-24|5-LOW|Clerk#000000699|0|final requests poach carefully. furiously s +45221|139|O|102787.98|1997-10-16|1-URGENT|Clerk#000000340|0|elieve blithely thin sentiments. re +45222|61|O|83168.79|1996-07-12|5-LOW|Clerk#000000554|0|refully enticing accounts. quickly ironic foxes across the slyly unusual d +45223|1177|O|148613.22|1996-09-12|4-NOT SPECIFIED|Clerk#000000244|0|ncies sleep against the packages. slyly final pint +45248|1481|P|117479.80|1995-04-17|3-MEDIUM|Clerk#000000197|0|ely express ideas-- special requests on +45249|1123|F|38670.47|1993-11-28|5-LOW|Clerk#000000075|0|totes sleep. never ironic acco +45250|295|O|280186.43|1997-10-23|4-NOT SPECIFIED|Clerk#000000215|0|al asymptotes wake furiously carefully regular foxes. unusual, +45251|959|F|128183.33|1993-08-28|1-URGENT|Clerk#000000251|0|ly final instructions along the packages boost agains +45252|422|F|226158.47|1994-07-10|2-HIGH|Clerk#000000854|0|e platelets affix furiously furio +45253|1381|O|234592.08|1996-11-27|2-HIGH|Clerk#000000611|0|s detect blithely. even packages cajole. careful +45254|64|F|110995.42|1993-07-27|2-HIGH|Clerk#000000146|0|ages. furiously fluffy requests wake carefully. furiously regu +45255|1102|O|202554.29|1997-07-15|1-URGENT|Clerk#000000998|0| eat blithely along the blithely final packag +45280|1079|O|201291.21|1997-11-03|3-MEDIUM|Clerk#000000937|0|ly. quickly pending ideas dete +45281|701|O|68947.18|1997-03-07|1-URGENT|Clerk#000000461|0|ole. carefully bold +45282|863|O|216876.36|1997-12-05|2-HIGH|Clerk#000000197|0|deposits affix slyly +45283|1123|O|274302.46|1996-10-07|4-NOT SPECIFIED|Clerk#000000494|0| wake blithely above the asymptotes: slyly ironic fox +45284|788|F|48671.22|1992-01-08|2-HIGH|Clerk#000000620|0|nding courts haggle amon +45285|169|O|77853.64|1996-09-15|2-HIGH|Clerk#000000942|0|ly final deposits. ruthlessl +45286|1436|O|139869.82|1998-07-23|5-LOW|Clerk#000000176|0|eep across the final instru +45287|1111|O|152309.62|1997-12-19|4-NOT SPECIFIED|Clerk#000000958|0|y even instructions boost quickly enticing packages. ironic package +45312|1474|O|256664.63|1996-05-09|5-LOW|Clerk#000000110|0|s. fluffily express deposits among the ironic theodolites are silent requests. +45313|905|O|284167.18|1996-09-02|4-NOT SPECIFIED|Clerk#000000834|0|furiously. carefully bold frets cajole. unusual patterns cajole furiously +45314|133|O|125920.97|1996-03-15|4-NOT SPECIFIED|Clerk#000000870|0|re furiously above t +45315|1303|F|42645.28|1992-04-21|3-MEDIUM|Clerk#000000674|0|ously ironic theodolites. packages wake speci +45316|995|O|27977.21|1997-08-04|2-HIGH|Clerk#000000733|0|packages are. final packages wake quickly regular pac +45317|1384|F|187836.13|1992-03-02|5-LOW|Clerk#000000843|0|lyly final platelets. regular theodolites lose across the slyly express asympt +45318|1069|O|200692.22|1997-11-04|4-NOT SPECIFIED|Clerk#000000988|0|al deposits beyond the regul +45319|475|O|202362.46|1997-05-12|5-LOW|Clerk#000000043|0|un furiously pending theodolites. final acco +45344|1493|F|35904.08|1993-10-25|1-URGENT|Clerk#000000310|0|ag carefully furiously ruthless platelets. br +45345|776|F|10102.04|1993-06-28|4-NOT SPECIFIED|Clerk#000000423|0|apades nag carefully. even, regular accounts wake quickly. furiously +45346|1048|F|129910.70|1992-11-16|2-HIGH|Clerk#000000295|0|ges across the foxes are carefully regular, ironic dep +45347|86|F|247074.09|1993-09-30|3-MEDIUM|Clerk#000000707|0|fully special patterns integrate fl +45348|1193|F|102764.25|1993-06-05|4-NOT SPECIFIED|Clerk#000000821|0|permanently. pending, furious courts nag thinly; deposits above the accounts +45349|1400|F|100198.47|1995-02-12|4-NOT SPECIFIED|Clerk#000000352|0| bold ideas boost unusual multipliers. quickly daring accounts detect +45350|1193|F|143240.78|1995-01-04|5-LOW|Clerk#000000570|0|he bold accounts are bravely idle pac +45351|928|O|248393.85|1997-05-12|3-MEDIUM|Clerk#000000662|0|. fluffily ironic accounts according to the bold, fin +45376|643|O|268746.10|1995-12-03|1-URGENT|Clerk#000000918|0| are according to the ideas. slyl +45377|992|P|246526.43|1995-04-04|5-LOW|Clerk#000000122|0|s. furiously regular accounts sleep busily after the regula +45378|1202|F|99813.67|1992-05-17|1-URGENT|Clerk#000000011|0|osits alongside of the ideas +45379|970|F|131698.77|1994-06-22|3-MEDIUM|Clerk#000000096|0|of the furiously unusual packages ough +45380|1138|F|266713.58|1994-05-01|1-URGENT|Clerk#000000925|0|regular requests. unusual frays above th +45381|236|O|221890.79|1995-08-22|3-MEDIUM|Clerk#000000161|0|ding requests above the final, final asympt +45382|154|O|405235.90|1996-01-21|5-LOW|Clerk#000000216|0|he slyly pending requests. furiously express ideas +45383|256|O|153789.32|1997-07-11|4-NOT SPECIFIED|Clerk#000000595|0|counts detect quickly ir +45408|1000|F|98197.62|1993-12-27|5-LOW|Clerk#000000967|0|oss the slyly regular deposits. fluffily ironic packag +45409|1216|F|234270.81|1993-04-13|1-URGENT|Clerk#000000690|0| express deposits. carefully busy dolphins affix according to the c +45410|778|F|124423.20|1994-08-20|5-LOW|Clerk#000000099|0|arefully? ironic requests na +45411|823|O|58903.72|1995-07-01|3-MEDIUM|Clerk#000000036|0|ag ironic accounts. slyly brave deposit +45412|217|F|286826.89|1993-04-23|3-MEDIUM|Clerk#000000989|0|en pinto beans integrate slyly slyly regular pinto beans. quickly speci +45413|212|F|277141.98|1993-06-09|2-HIGH|Clerk#000000505|0|ages boost blithely ironic packages-- fluffily regular account +45414|1408|F|135678.44|1994-02-12|1-URGENT|Clerk#000000278|0| beans; slyly regular asymptotes are alongside of the carefu +45415|28|F|35417.20|1992-03-07|1-URGENT|Clerk#000000675|0|al dependencies. slyly ironic packages use enticingly according to the pendi +45440|364|F|369658.21|1992-08-10|1-URGENT|Clerk#000000911|0|ly careful theodolites boost carefully. fluffily +45441|595|O|135178.99|1997-10-04|4-NOT SPECIFIED|Clerk#000000359|0|the furiously special requests. furiously final plat +45442|1459|F|62571.45|1995-02-07|1-URGENT|Clerk#000000655|0|regular, pending dependencies wake. slyly silent +45443|442|O|108794.61|1996-03-09|2-HIGH|Clerk#000000486|0|fix carefully unusual ideas. carefully final packages cajole +45444|487|F|110809.97|1992-11-10|2-HIGH|Clerk#000000855|0|l asymptotes-- slyly even packages cajole bravely above the +45445|1027|O|32171.47|1996-03-30|1-URGENT|Clerk#000000660|0|cording to the pending deposits sleep carefully perman +45446|592|O|115409.20|1997-07-16|1-URGENT|Clerk#000000769|0|al deposits. furiously final accounts wake. carefully regular depen +45447|355|F|214053.64|1992-01-27|3-MEDIUM|Clerk#000000626|0|old deposits. never regular deposits at the final, even ins +45472|685|O|105195.29|1996-08-15|1-URGENT|Clerk#000000773|0|oost above the ruthless, express foxes. even tithes use final excuses. carefu +45473|598|O|212880.21|1995-08-11|1-URGENT|Clerk#000000157|0|egular deposits. instructions eat furiously. furiously silent instructions +45474|946|O|45491.40|1996-02-22|5-LOW|Clerk#000000278|0|olites? fluffily bold foxes above the stealthily silent req +45475|1279|F|30124.50|1993-05-31|5-LOW|Clerk#000000221|0|eans haggle furiously after the asymptotes? pending depos +45476|202|F|210876.73|1992-04-19|1-URGENT|Clerk#000000317|0|s ideas. special, regular pa +45477|500|O|152251.80|1996-01-18|1-URGENT|Clerk#000000817|0| excuses. ironic, ironic requ +45478|733|O|136146.49|1996-09-11|3-MEDIUM|Clerk#000000345|0|lyly unusual deposits about the express ideas boo +45479|1445|O|50539.34|1998-04-29|1-URGENT|Clerk#000000487|0|gle above the ironic deposits. slyly express co +45504|274|F|161536.63|1992-09-12|1-URGENT|Clerk#000000001|0|eposits. final, ironic Tiresias are. carefully even multipliers int +45505|820|O|6703.54|1998-03-27|3-MEDIUM|Clerk#000000941|0| instructions cajol +45506|1009|O|89463.04|1995-12-27|5-LOW|Clerk#000000356|0|unts wake blithely final theodolites. blithely eve +45507|1433|O|143329.17|1997-04-03|5-LOW|Clerk#000000787|0|the deposits. blithely ironic deposits haggl +45508|38|O|22341.89|1997-09-26|2-HIGH|Clerk#000000781|0|iously according to the blithely final theo +45509|1387|F|85004.36|1993-01-03|2-HIGH|Clerk#000000472|0|he quickly ironic packages are carefully along the i +45510|1186|O|335701.59|1996-12-13|5-LOW|Clerk#000000749|0| special accounts. regular deposits use. regular accounts after the silent, i +45511|389|F|141815.28|1993-08-22|5-LOW|Clerk#000000085|0|ccounts according to the dol +45536|52|F|55293.03|1992-02-28|1-URGENT|Clerk#000000004|0|luffily even accounts. slyly regular platelets do sleep caref +45537|1037|O|141792.44|1997-11-26|5-LOW|Clerk#000000290|0|ake carefully. even deposits use sly +45538|296|O|219459.33|1997-08-18|3-MEDIUM|Clerk#000000839|0|leep bravely fluffily silent pi +45539|1121|F|302491.86|1994-08-03|4-NOT SPECIFIED|Clerk#000000688|0|gular excuses. regular, even requests dete +45540|1003|O|11873.36|1996-03-29|5-LOW|Clerk#000000618|0|fter the accounts engage instructi +45541|250|O|155441.14|1998-04-21|3-MEDIUM|Clerk#000000101|0|ress, bold hockey players shall hav +45542|1420|F|172974.76|1993-02-08|2-HIGH|Clerk#000000831|0|ep carefully ironic packages. quickly even r +45543|607|F|193059.61|1995-02-03|5-LOW|Clerk#000000302|0|have to integrate slyly according to the quickl +45568|1258|O|220659.67|1998-04-01|2-HIGH|Clerk#000000038|0|ithely ironic deposits. special tithes ought to sleep furi +45569|1052|O|100131.64|1997-04-26|3-MEDIUM|Clerk#000000806|0|counts are blithely carefully ironic instructions. blithely final packages c +45570|250|F|135534.32|1993-08-10|1-URGENT|Clerk#000000421|0|elets nag carefully ac +45571|841|F|249686.53|1992-09-24|3-MEDIUM|Clerk#000000918|0|dencies across the express accounts detect bold instruction +45572|1105|O|244065.14|1996-06-08|3-MEDIUM|Clerk#000000925|0|ts cajole fluffily silent requests +45573|317|F|26607.41|1994-08-13|2-HIGH|Clerk#000000432|0|lets use blithely express i +45574|616|O|27399.78|1996-10-08|5-LOW|Clerk#000000902|0|ly express foxes haggle throughout the express ideas. special ac +45575|583|F|197161.01|1992-04-13|1-URGENT|Clerk#000000701|0|ts. accounts according to the idly ironic +45600|1444|F|69756.79|1992-08-08|2-HIGH|Clerk#000000810|0|d hockey players. pending +45601|1102|O|174136.57|1995-09-27|2-HIGH|Clerk#000000491|0|rding to the quickly bold dependencies are sile +45602|547|O|205482.84|1996-10-26|4-NOT SPECIFIED|Clerk#000000079|0|s cajole. ironic theodolites are carefully above the even plat +45603|805|O|142106.74|1996-08-20|2-HIGH|Clerk#000000056|0|ests. requests sleep fluffily regular foxes. carefully regul +45604|1234|F|58050.82|1993-02-20|5-LOW|Clerk#000000551|0|tructions hinder slyly. express ideas sleep a +45605|728|F|164585.20|1993-04-11|3-MEDIUM|Clerk#000000288|0| excuses haggle furiously according +45606|1300|O|112396.60|1995-09-23|3-MEDIUM|Clerk#000000967|0|y regular accounts. furiously exp +45607|28|O|84295.41|1997-11-14|4-NOT SPECIFIED|Clerk#000000025|0|ntegrate slyly across the evenly ironic requests. furiously express e +45632|155|F|271349.05|1993-05-11|4-NOT SPECIFIED|Clerk#000000158|0|. blithely furious asymptotes according to the slyly regular excuses integrat +45633|1427|O|191508.03|1997-01-30|1-URGENT|Clerk#000000973|0| the regularly bold packages wake special, final +45634|551|O|25091.25|1997-07-30|2-HIGH|Clerk#000000395|0| affix among the quickly final accounts. special ideas snooze +45635|280|F|33414.24|1992-04-08|5-LOW|Clerk#000000186|0|gular platelets boost quickly fu +45636|1415|O|61378.47|1996-10-06|4-NOT SPECIFIED|Clerk#000000322|0|he even courts nag never special deposits +45637|944|F|48372.83|1994-03-19|2-HIGH|Clerk#000000450|0|inal, unusual foxes. fin +45638|163|O|328804.37|1997-08-27|2-HIGH|Clerk#000000420|0|ecial asymptotes. boldly unusual foxes affix slowly special, unusual packages. +45639|325|O|47446.88|1996-06-06|3-MEDIUM|Clerk#000000638|0|e stealthy gifts; ironic excuses +45664|238|F|124240.16|1992-06-10|4-NOT SPECIFIED|Clerk#000000454|0|lyly special asymptotes cajol +45665|1388|O|235745.37|1997-05-11|5-LOW|Clerk#000000607|0|c, final theodolites are carefully evenly final asymptotes. carefully expres +45666|1447|O|177168.19|1997-02-14|5-LOW|Clerk#000000224|0|fully unusual pinto beans above the furiously even requests affix boldly alon +45667|655|O|157666.79|1996-04-23|2-HIGH|Clerk#000000640|0|equests haggle blithely above the slyly regular requests. unusual, express +45668|1498|F|215664.32|1993-12-13|4-NOT SPECIFIED|Clerk#000000726|0|ests according to the quickly final +45669|799|O|172286.95|1995-07-01|2-HIGH|Clerk#000000833|0| bold requests hang quickly regular accounts. th +45670|1303|F|397549.76|1992-08-08|5-LOW|Clerk#000000904|0|ly silent packages haggle carefully. slyly even dolphins alongs +45671|662|O|64323.68|1995-06-13|5-LOW|Clerk#000000466|0| pending instructions. furiously ironic accounts cajole. f +45696|68|O|287449.15|1996-12-19|2-HIGH|Clerk#000000216|0|gle finally blithely express du +45697|1096|F|396261.24|1992-01-01|4-NOT SPECIFIED|Clerk#000000293|0|uses. final dependencies nag alongside of the unusual, regul +45698|1063|F|55362.19|1992-04-24|2-HIGH|Clerk#000000508|0|se furiously slyly ironic requests. blithely express +45699|970|O|31153.51|1997-09-05|1-URGENT|Clerk#000000419|0|posits sublate blithely. ironic instru +45700|910|F|301984.03|1992-11-14|2-HIGH|Clerk#000000249|0|quests affix slyly carefully even excuses +45701|211|O|137980.34|1997-04-25|2-HIGH|Clerk#000000882|0| x-ray. quickly iron +45702|1145|O|103071.36|1995-08-10|1-URGENT|Clerk#000000529|0|ar accounts cajole. unusual excuses nod furiously. sentiments are carefull +45703|871|O|112678.21|1996-06-02|1-URGENT|Clerk#000000295|0|sits. foxes haggle after the quickly bold escapades. caref +45728|436|F|151227.22|1993-06-22|2-HIGH|Clerk#000000797|0|blithely bold packages sublate a +45729|1051|O|179763.02|1998-04-12|1-URGENT|Clerk#000000810|0|refully final dependencies try to cajole blithely about the special, pending p +45730|1469|O|72030.37|1997-12-16|4-NOT SPECIFIED|Clerk#000000864|0|nt deposits. ironic, reg +45731|139|F|353083.24|1994-08-11|1-URGENT|Clerk#000000755|0| blithely ironic excuses along the furiously regular ideas i +45732|565|F|116060.13|1994-02-05|3-MEDIUM|Clerk#000000390|0| wake carefully. even deposits use blithely deposits: bold, +45733|268|F|250967.04|1993-12-07|1-URGENT|Clerk#000000465|0|asymptotes. even deposits wake furiously carefully unusual +45734|707|F|152899.72|1992-07-18|1-URGENT|Clerk#000000502|0|yly bold theodolites are carefully. slyly special pinto beans wake s +45735|835|O|100750.11|1997-03-22|1-URGENT|Clerk#000000326|0|. bold, regular accounts boost. blithely silent packages after t +45760|256|F|152897.51|1993-07-23|5-LOW|Clerk#000000825|0|long the slyly ironic pinto beans cajole after the e +45761|559|F|46496.60|1992-05-13|5-LOW|Clerk#000000227|0|sits about the silently regular packages nag along the blit +45762|890|F|156053.14|1993-07-22|5-LOW|Clerk#000000824|0|requests wake blithely. regular, special hockey players need to serve never +45763|967|F|2833.14|1993-07-08|2-HIGH|Clerk#000000542|0|osits are blithely alongside of the slyly regular foxes. regular pinto bea +45764|295|O|154617.44|1996-08-23|3-MEDIUM|Clerk#000000306|0|gainst the carefully regular ideas. bli +45765|1250|F|81544.33|1993-10-15|2-HIGH|Clerk#000000688|0|t the carefully bold deposit +45766|1289|F|201302.69|1993-05-08|2-HIGH|Clerk#000000258|0|quests. carefully ironi +45767|853|F|113255.25|1992-07-11|2-HIGH|Clerk#000000077|0|he deposits. blithely final foxes are carefully. dog +45792|460|O|301917.64|1996-11-12|3-MEDIUM|Clerk#000000638|0|ously against the ideas. furiously f +45793|268|O|104083.08|1996-09-01|3-MEDIUM|Clerk#000000933|0|cial packages wake after the fluffily special deposits. furio +45794|149|O|262943.91|1995-09-25|1-URGENT|Clerk#000000051|0|the ideas. blithely even accounts +45795|695|O|161848.97|1998-01-09|4-NOT SPECIFIED|Clerk#000000987|0|ts maintain slyly about +45796|746|O|177616.34|1996-01-16|4-NOT SPECIFIED|Clerk#000000856|0|ironic accounts cajole carefully above the furiously unusual depos +45797|67|O|248254.64|1997-11-26|1-URGENT|Clerk#000000994|0|ven instructions cajole furiously furiously regular asymptotes. quickly bo +45798|247|F|10108.21|1993-07-11|3-MEDIUM|Clerk#000000368|0|courts nag carefully above the furiously pending pinto beans. regular d +45799|179|P|213290.44|1995-06-02|5-LOW|Clerk#000000696|0|uriously: even packages at t +45824|791|F|53160.13|1994-12-07|4-NOT SPECIFIED|Clerk#000000174|0|arhorses cajole slyly fu +45825|1090|F|186499.27|1992-10-08|3-MEDIUM|Clerk#000000787|0|e blithely final dependencies cajole carefully above the de +45826|595|O|122880.57|1997-06-09|2-HIGH|Clerk#000000812|0|ld theodolites haggle slyly fox +45827|1012|F|169239.19|1992-08-04|3-MEDIUM|Clerk#000000473|0|gly pending courts. regular deposits maintain +45828|521|O|172133.45|1997-06-08|4-NOT SPECIFIED|Clerk#000000948|0|y bold packages haggle blithely across the even excuses. +45829|514|O|48328.24|1995-03-13|1-URGENT|Clerk#000000473|0|nal requests use carefully among the +45830|103|O|263384.76|1997-10-21|1-URGENT|Clerk#000000318|0|sts sleep furiously around the +45831|1313|O|81827.75|1997-04-17|4-NOT SPECIFIED|Clerk#000000339|0|use furiously. express, fi +45856|1190|O|185800.72|1998-02-20|2-HIGH|Clerk#000000427|0|ely bold deposits use blithely above the carefully sly e +45857|728|O|71842.02|1997-09-07|5-LOW|Clerk#000000456|0|oost; blithely pending deposits haggle blithely about the slyly special +45858|1354|O|58388.28|1996-10-08|3-MEDIUM|Clerk#000000238|0|ronic deposits use slyly. fl +45859|1348|F|260732.29|1993-11-10|4-NOT SPECIFIED|Clerk#000000416|0|nic packages sleep blithe +45860|950|F|178145.13|1992-08-13|5-LOW|Clerk#000000520|0|eposits. quickly unusual excuses be +45861|1225|O|113760.78|1995-08-26|3-MEDIUM|Clerk#000000361|0|ependencies boost permanently. +45862|968|O|41920.67|1997-07-02|4-NOT SPECIFIED|Clerk#000000850|0|erns. final requests haggle slyly. theodolites wake after the furio +45863|277|F|109461.06|1993-09-20|5-LOW|Clerk#000000815|0|uriously ironic deposits. furiously ev +45888|1085|F|50712.19|1993-06-22|2-HIGH|Clerk#000000104|0|inal requests. furiously ruthless packages are carefully? furiously clo +45889|1306|O|164781.81|1996-02-01|1-URGENT|Clerk#000000315|0| accounts against the fluffily express de +45890|1442|O|28249.45|1995-09-16|2-HIGH|Clerk#000000615|0|pinto beans. final platelets wake. unusual instructions a +45891|1366|F|189569.51|1992-04-16|3-MEDIUM|Clerk#000000252|0|y special instructio +45892|1465|F|23638.06|1994-05-12|5-LOW|Clerk#000000209|0|slyly at the slyly sly p +45893|724|O|218834.56|1995-05-27|2-HIGH|Clerk#000000556|0| ideas. furiously ironic dependencies alongside of the fi +45894|1276|O|40619.47|1996-06-25|1-URGENT|Clerk#000000043|0|ges wake stealthily. packages wake furiously. quickly express +45895|667|F|111482.38|1994-06-20|1-URGENT|Clerk#000000710|0|ins serve blithely. unusual dependencies wake. slyly pending theo +45920|1321|O|267313.02|1996-06-28|2-HIGH|Clerk#000000947|0|yly regular accounts boost blithely. silent, regular accounts against the +45921|314|O|127447.03|1996-01-05|1-URGENT|Clerk#000000821|0|requests. packages nod across t +45922|748|F|187639.69|1993-10-19|4-NOT SPECIFIED|Clerk#000000346|0| regular requests nag slyly enticing foxes. slyly iro +45923|317|O|221671.07|1997-01-20|4-NOT SPECIFIED|Clerk#000000700|0|dly final packages snooze. final, ironic platelets prom +45924|442|F|188121.76|1993-12-22|5-LOW|Clerk#000000376|0|ent theodolites. re +45925|1001|O|46401.06|1996-04-28|4-NOT SPECIFIED|Clerk#000000537|0|hely silent theodolites according to +45926|310|P|64179.07|1995-03-04|4-NOT SPECIFIED|Clerk#000000609|0|lithely ironic foxes. carefully final pinto beans throughout the dep +45927|1277|F|133259.22|1994-09-26|5-LOW|Clerk#000000970|0|t blithely across the unusual warthogs. regular, bold accounts haggle about +45952|1090|O|235903.23|1997-03-21|3-MEDIUM|Clerk#000000007|0| packages are around the ironic +45953|1366|O|38972.52|1998-05-20|3-MEDIUM|Clerk#000000619|0|ctions. ironic packages against the fluffily express deposits w +45954|1081|O|95867.30|1997-12-26|1-URGENT|Clerk#000000331|0|l theodolites. slyly ironic platelets among the dogged instru +45955|157|O|15994.69|1998-08-02|5-LOW|Clerk#000000336|0|ously pending deposits cajole. furiously even +45956|566|O|36308.18|1996-09-05|3-MEDIUM|Clerk#000000460|0|ent foxes. even, even warhorses use furiously pending de +45957|22|F|149802.07|1993-09-22|1-URGENT|Clerk#000000772|0|ndencies. even, regular instructions above the qui +45958|1295|O|121192.36|1995-05-26|3-MEDIUM|Clerk#000000423|0|lithely. quickly unusual packages are regular req +45959|380|F|276427.05|1994-12-07|3-MEDIUM|Clerk#000000842|0|into beans. quickly close grouches are enticing, express +45984|1471|F|189544.89|1992-01-28|3-MEDIUM|Clerk#000000883|0|n foxes according to the ironi +45985|622|O|181352.65|1997-03-23|2-HIGH|Clerk#000000281|0|the daringly ironic deposits slee +45986|272|F|35460.24|1994-12-26|5-LOW|Clerk#000000759|0|ideas. carefully final ideas sleep blithely above the slyl +45987|1300|F|237705.03|1994-03-13|4-NOT SPECIFIED|Clerk#000000776|0|ests: quickly unusual requests nag furiously. slowl +45988|1399|F|119725.55|1994-09-02|1-URGENT|Clerk#000000388|0|carefully special a +45989|1327|F|79658.22|1993-08-24|2-HIGH|Clerk#000000416|0|olites! ironic, final requests w +45990|179|F|116855.73|1994-09-01|3-MEDIUM|Clerk#000000606|0|ng requests. regular platelets boost +45991|568|F|175941.22|1995-02-15|5-LOW|Clerk#000000733|0|ounts? final foxes boost blithely alongside of the ironic t +46016|589|F|231608.41|1993-05-12|4-NOT SPECIFIED|Clerk#000000274|0| requests. pending, +46017|328|F|155853.17|1992-02-17|5-LOW|Clerk#000000809|0|. even deposits use alongside of the even in +46018|1325|F|5489.13|1994-08-12|3-MEDIUM|Clerk#000000061|0|kly carefully regular ac +46019|256|O|137003.35|1997-08-08|5-LOW|Clerk#000000519|0|lly express ideas. blithely +46020|1396|O|182595.63|1997-03-01|4-NOT SPECIFIED|Clerk#000000825|0|, unusual platelets +46021|1054|F|68904.50|1994-03-03|2-HIGH|Clerk#000000658|0|sts. carefully express accounts nag carefully. ironi +46022|889|O|141336.47|1997-09-05|3-MEDIUM|Clerk#000000739|0|ccounts. regular platele +46023|1243|F|169015.76|1992-03-25|4-NOT SPECIFIED|Clerk#000000941|0|less pinto beans detect entic +46048|544|F|165921.59|1992-12-12|3-MEDIUM|Clerk#000000625|0|t the even requests. ideas are. furiously unus +46049|418|F|106729.06|1992-04-28|3-MEDIUM|Clerk#000000087|0|accounts about the carefully silent theodolites cajole aft +46050|223|F|278045.22|1993-01-05|2-HIGH|Clerk#000000783|0|onic theodolites use blithely regular dolphins. ironic s +46051|11|O|16873.08|1998-01-21|3-MEDIUM|Clerk#000000207|0|ronic multipliers above the deposits sleep quickly after the regula +46052|733|F|197797.06|1994-11-24|3-MEDIUM|Clerk#000000572|0| special instructions. blithely final requests wake final accounts. slyly +46053|799|F|78195.09|1992-09-14|2-HIGH|Clerk#000000405|0|cial dependencies haggle permanently among the fin +46054|1447|F|137317.78|1992-12-01|4-NOT SPECIFIED|Clerk#000000019|0|gular dependencies use slyly furiously pending instruct +46055|800|F|295378.64|1992-06-03|3-MEDIUM|Clerk#000000874|0|uffily about the platelets. furious +46080|1012|O|199364.16|1997-09-21|4-NOT SPECIFIED|Clerk#000000411|0|! fluffily even deposits above the slyly regular reques +46081|164|F|152691.69|1992-06-29|4-NOT SPECIFIED|Clerk#000000904|0| beans about the slyly ironic deposits nag +46082|610|O|195132.90|1998-02-24|1-URGENT|Clerk#000000125|0|. regular theodolites cajole about the sile +46083|1018|F|64204.11|1993-09-14|5-LOW|Clerk#000000441|0|instructions haggle carefully ironic packages. blithely express foxes are unus +46084|886|O|121317.48|1997-09-10|1-URGENT|Clerk#000000425|0| silently pending courts wake +46085|83|F|141331.71|1992-01-03|4-NOT SPECIFIED|Clerk#000000237|0|lithely deposits. ironic, unusual deposits +46086|1186|O|33821.82|1995-11-09|3-MEDIUM|Clerk#000000399|0|s. final, regular foxes wake outside the blithely express packages. ironic +46087|371|O|1591.66|1995-10-26|5-LOW|Clerk#000000391|0|requests are above the even foxes. silent +46112|13|F|54449.96|1992-10-08|2-HIGH|Clerk#000000172|0|es. asymptotes wake carefully ac +46113|671|F|124436.98|1994-12-03|4-NOT SPECIFIED|Clerk#000000971|0| slyly fluffily final packages. theodolites use about +46114|455|O|55887.85|1997-06-24|5-LOW|Clerk#000000421|0|ven theodolites sleep quickly furiously regular packages-- c +46115|158|P|306350.62|1995-03-03|1-URGENT|Clerk#000000096|0|ts. slyly pending dependencies about the furiously bold foxes cajo +46116|88|F|223894.83|1995-01-08|1-URGENT|Clerk#000000980|0|ending ideas haggle slyly. depende +46117|971|O|95340.29|1995-05-23|5-LOW|Clerk#000000353|0|ven ideas after the blithely bold foxes wake +46118|358|O|285688.38|1997-04-11|5-LOW|Clerk#000000470|0|ts cajole fluffily across the quickly bold packages. bl +46119|808|F|276302.39|1994-02-16|1-URGENT|Clerk#000000647|0|d braids. final dependencies wake furiously quickly even accounts. slyly +46144|911|F|97374.12|1992-12-09|3-MEDIUM|Clerk#000000194|0|refully unusual theodolites haggle bold, stealthy platelets +46145|553|O|91500.06|1997-01-31|3-MEDIUM|Clerk#000000331|0|es. regular, regular dolphins sleep. ironic acc +46146|427|O|100779.70|1997-09-09|4-NOT SPECIFIED|Clerk#000000175|0|c requests haggle fluffily among the furiou +46147|251|F|207369.90|1995-01-16|1-URGENT|Clerk#000000592|0|eep furiously. quickly daring requests haggle furiously. quickly +46148|1345|O|44214.29|1997-05-19|2-HIGH|Clerk#000000031|0|: slyly regular pinto beans use furio +46149|1162|O|37287.14|1996-05-18|2-HIGH|Clerk#000000148|0|ular excuses. furiously bold accounts use slyly. ironi +46150|415|F|33685.83|1993-02-18|1-URGENT|Clerk#000000102|0| furiously special platelets are sl +46151|479|F|219862.48|1994-11-09|1-URGENT|Clerk#000000806|0|ctions engage furiously +46176|1384|O|79752.40|1997-09-07|1-URGENT|Clerk#000000061|0|equests are busily. care +46177|1001|F|215046.15|1993-12-06|5-LOW|Clerk#000000275|0| pending, final deposits cajole furiously bold requests. unusual dolphins alo +46178|1081|O|123541.26|1996-02-04|3-MEDIUM|Clerk#000000125|0|elets boost slyly after the fluffily bold a +46179|1150|O|65487.13|1998-07-07|5-LOW|Clerk#000000767|0|arefully quickly unusual packages. pending foxes cajole upon the fluff +46180|478|O|164556.70|1997-07-27|5-LOW|Clerk#000000683|0|ctions across the deposits are slyly regular requests? even accounts abov +46181|1180|O|201556.06|1997-06-25|4-NOT SPECIFIED|Clerk#000000175|0|arefully even pinto beans cajole ironic deposits. bl +46182|1393|F|263087.08|1993-03-12|1-URGENT|Clerk#000000408|0|e furiously after the carefully final requests. dolphins according to the fox +46183|805|F|86508.42|1993-12-14|1-URGENT|Clerk#000000408|0|rays cajole carefully above the instructions. epitaphs nag bravely. packa +46208|1036|O|241120.09|1997-06-16|1-URGENT|Clerk#000000909|0|uickly final accounts. packages integrate carefully +46209|859|O|50291.89|1996-05-11|3-MEDIUM|Clerk#000000640|0|efully. blithely final f +46210|457|F|278019.17|1994-09-24|2-HIGH|Clerk#000000599|0|er the furiously regular deposits. silent, ironic deposits boost carefully pe +46211|928|F|120489.98|1993-06-12|5-LOW|Clerk#000000141|0|e carefully bold pinto beans. q +46212|1474|F|118148.07|1992-09-13|4-NOT SPECIFIED|Clerk#000000050|0| nag boldly after the unusual, regular foxes. sly +46213|347|F|105068.39|1993-01-08|1-URGENT|Clerk#000000520|0|unts are slyly pending platelets. special deposits +46214|481|F|114114.98|1993-02-09|1-URGENT|Clerk#000000732|0|y final packages haggle about the blit +46215|1195|F|60155.14|1993-07-23|5-LOW|Clerk#000000667|0|s cajole furiously. final, ironic deposits +46240|31|F|56147.50|1994-09-30|5-LOW|Clerk#000000066|0| ideas are? slyly unusual pinto beans unwind slyly pending asymptotes. +46241|407|F|245443.83|1994-03-15|4-NOT SPECIFIED|Clerk#000000745|0|are slyly slyly pending accounts. pinto beans use furiously. e +46242|424|F|73167.07|1993-08-03|4-NOT SPECIFIED|Clerk#000000682|0| deposits cajole quickly +46243|329|F|281918.69|1992-01-25|5-LOW|Clerk#000000189|0|into beans. furiously e +46244|1268|F|42565.50|1994-07-03|3-MEDIUM|Clerk#000000233|0|o beans. bold ideas beneath the blithely unusual +46245|377|O|67620.65|1997-09-27|1-URGENT|Clerk#000000017|0|. furiously ironic +46246|973|O|156872.39|1998-01-17|3-MEDIUM|Clerk#000000913|0|g the carefully special dependencies: regularly +46247|1391|O|211771.02|1996-09-26|5-LOW|Clerk#000000456|0|y special ideas. sometimes final fo +46272|686|O|305078.58|1996-03-13|5-LOW|Clerk#000000522|0|o the sheaves cajole carefully according to the dogged accounts. carefully iro +46273|28|O|77178.54|1997-08-22|5-LOW|Clerk#000000485|0|cial asymptotes are furi +46274|442|O|248651.28|1997-02-16|5-LOW|Clerk#000000935|0| blithely even pinto beans haggle across the spe +46275|743|O|120176.00|1997-04-21|2-HIGH|Clerk#000000336|0|nic, final requests. pending req +46276|1108|F|162356.65|1992-12-10|1-URGENT|Clerk#000000575|0|pending requests. furiously final deposits nag alongside of the +46277|460|O|60365.06|1996-11-14|1-URGENT|Clerk#000000091|0|dependencies. bold packages near the quickly sly excuses slee +46278|158|O|246375.90|1997-10-04|2-HIGH|Clerk#000000627|0|atterns. unusual instructions cajole carefully. carefully even +46279|362|O|182485.15|1997-06-24|3-MEDIUM|Clerk#000000805|0|y final requests sleep special accounts. pend +46304|155|O|200622.08|1995-11-15|3-MEDIUM|Clerk#000000203|0|riously unusual req +46305|140|O|32566.54|1995-07-31|5-LOW|Clerk#000000524|0|ular ideas. slyly idle +46306|818|O|39468.91|1998-04-29|1-URGENT|Clerk#000000452|0|nic theodolites run busily. furiously final shea +46307|713|F|184546.46|1995-02-07|3-MEDIUM|Clerk#000000577|0|y alongside of the pending, special requests. carefully ironic packages boos +46308|688|O|109709.78|1996-06-17|2-HIGH|Clerk#000000642|0|ng the slyly even foxes. carefully quiet theodolites wake fluffily unusu +46309|1093|F|210504.61|1993-10-23|5-LOW|Clerk#000000499|0|nusual foxes boost furiously decoys. deposits +46310|1025|F|372916.06|1993-07-22|2-HIGH|Clerk#000000774|0|ven accounts according t +46311|793|O|285617.49|1995-07-26|2-HIGH|Clerk#000000210|0| sly dependencies cajole until the express depos +46336|553|O|97146.43|1995-07-30|2-HIGH|Clerk#000000383|0|nstructions haggle blithely according to the +46337|397|F|46957.47|1992-04-28|5-LOW|Clerk#000000812|0|symptotes. silent accounts nag carefully. regular ac +46338|484|O|247912.29|1997-03-30|5-LOW|Clerk#000000093|0|iously about the final, final ideas! slyly unusual frets +46339|1147|F|215460.24|1994-07-06|2-HIGH|Clerk#000000344|0| slyly daringly silent braids. blithely +46340|1246|F|63642.64|1992-05-06|5-LOW|Clerk#000000861|0| grouches! quickly express deposits along +46341|811|F|264157.04|1994-12-18|2-HIGH|Clerk#000000462|0|e slyly unusual accoun +46342|1142|F|163734.31|1994-05-31|2-HIGH|Clerk#000000151|0| final requests sleep furiously according to the final, unusual dolphins. +46343|50|O|156973.78|1997-09-26|3-MEDIUM|Clerk#000000658|0|sly final instructions agai +46368|280|F|253142.61|1992-04-25|2-HIGH|Clerk#000000036|0|carefully according to the pending accounts. express ideas +46369|1337|O|165616.73|1997-04-16|4-NOT SPECIFIED|Clerk#000000083|0|ronic accounts nag stealthily furiously regular asymptotes. blithel +46370|1376|O|8368.61|1998-01-12|2-HIGH|Clerk#000000467|0|ackages cajole furio +46371|85|F|88899.72|1994-09-03|2-HIGH|Clerk#000000912|0|into beans against the regular, ironic pains are quickly re +46372|607|F|141231.07|1995-02-27|2-HIGH|Clerk#000000148|0|among the quickly express packages; regular +46373|575|O|25835.24|1997-11-26|1-URGENT|Clerk#000000806|0|stead of the even, ironic ideas. ironic, regular theodolites +46374|701|F|284093.60|1993-07-08|2-HIGH|Clerk#000000354|0|deas. ironic accounts haggle furiously furiously even deposits +46375|86|F|213170.56|1993-08-27|3-MEDIUM|Clerk#000000425|0|nto beans sleep carefully pending +46400|421|O|160532.29|1997-02-24|4-NOT SPECIFIED|Clerk#000000347|0| carefully express instructions cajole carefully around the thinly specia +46401|638|O|90748.04|1998-04-21|5-LOW|Clerk#000000409|0|refully regular packages. silent, ironic deposits nag across +46402|1100|F|175991.41|1995-01-09|3-MEDIUM|Clerk#000000774|0|ly furiously ironic requests. unusual asymptotes hagg +46403|823|F|135920.01|1994-05-31|5-LOW|Clerk#000000175|0|nently express reques +46404|1459|F|109766.28|1992-03-05|1-URGENT|Clerk#000000495|0|blithely. blithely regular pains haggle carefully. quickly +46405|1112|F|243672.32|1992-12-29|3-MEDIUM|Clerk#000000287|0|uriously express court +46406|853|O|214989.49|1998-07-15|5-LOW|Clerk#000000211|0|s. quietly final deposits are? fluffily regular deposits nag +46407|253|F|31793.01|1994-03-27|4-NOT SPECIFIED|Clerk#000000383|0|hely alongside of the special, regula +46432|802|F|179107.21|1994-04-24|5-LOW|Clerk#000000385|0|ly even instructions. +46433|1487|O|154561.68|1995-12-31|5-LOW|Clerk#000000481|0| ought to doze carefully even theodolites. furiously ir +46434|1153|F|48133.85|1993-04-02|1-URGENT|Clerk#000000734|0|ld deposits. carefully ironic packages haggle furious +46435|1064|O|243359.93|1996-11-14|4-NOT SPECIFIED|Clerk#000000577|0|lites cajole slyly according to the final packages. bol +46436|1114|F|260335.31|1994-04-05|5-LOW|Clerk#000000375|0|mong the regular, regular ideas haggle slyly excuses. blit +46437|397|F|66264.42|1994-09-16|3-MEDIUM|Clerk#000000878|0|ep. fluffily special packa +46438|1262|F|73626.77|1994-05-20|2-HIGH|Clerk#000000679|0|ong the furiously even requests. pains was about the slyly f +46439|1270|O|16908.52|1998-06-06|2-HIGH|Clerk#000000843|0|quickly silent asymptotes. furiously final instructions wake slyly re +46464|584|O|51020.79|1997-03-11|1-URGENT|Clerk#000000890|0|ent foxes wake regular dolphins. regular, regular accounts are +46465|1393|F|185582.11|1994-05-03|1-URGENT|Clerk#000000093|0|rding to the blithely pending foxe +46466|574|F|198881.22|1992-02-22|3-MEDIUM|Clerk#000000799|0|ly bold pinto beans boost carefully around the regular ideas. +46467|1186|O|25163.28|1998-05-03|2-HIGH|Clerk#000000311|0|ole quickly along the fin +46468|622|F|157928.24|1995-01-12|1-URGENT|Clerk#000000220|0|s nod slyly at the permanent packages. furiously regula +46469|410|F|126893.89|1994-08-17|1-URGENT|Clerk#000000062|0|nically furiously unusual foxes. quick, pending theodolites cajole slyly slyly +46470|1054|F|26661.36|1993-12-06|4-NOT SPECIFIED|Clerk#000000959|0|sts affix slyly. ruthlessly even +46471|215|F|187525.20|1992-07-13|2-HIGH|Clerk#000000068|0|across the theodolites boost carefully deposits. deposits haggle carefully +46496|890|O|121869.66|1997-02-15|3-MEDIUM|Clerk#000000128|0| haggle blithely ironic ideas. slyly regular instructions after the +46497|1084|F|115085.96|1992-06-20|2-HIGH|Clerk#000000369|0|special hockey players after the instructions sleep quickly slyly idle escapa +46498|1043|O|122203.55|1997-08-21|2-HIGH|Clerk#000000902|0|as sleep blithely ruthle +46499|562|F|161634.04|1994-06-08|1-URGENT|Clerk#000000760|0|ht to use alongside of the +46500|647|O|14492.00|1996-01-31|2-HIGH|Clerk#000000413|0|y ironic epitaphs. ironic, idle idea +46501|508|O|180672.67|1996-05-05|5-LOW|Clerk#000000756|0|ndencies. fluffily silent accounts poach with +46502|1042|O|74668.49|1996-09-01|1-URGENT|Clerk#000000807|0| after the even accounts cajole among the carefu +46503|1318|O|76488.38|1995-11-07|4-NOT SPECIFIED|Clerk#000000540|0|sleep above the furiously even requests. +46528|328|F|168832.22|1994-12-07|3-MEDIUM|Clerk#000000386|0|quests nag quickly bold accounts. furiously final foxes al +46529|217|O|196478.42|1997-06-20|4-NOT SPECIFIED|Clerk#000000830|0| silent pinto beans are blithely across the regular, special warhorses. spe +46530|448|F|146565.24|1995-03-18|5-LOW|Clerk#000000693|0| ideas. foxes about the carefully bold deposits s +46531|1240|O|290534.75|1995-08-22|5-LOW|Clerk#000000883|0|ts haggle slyly quiet foxes. express theodolit +46532|1321|O|81122.36|1997-12-26|1-URGENT|Clerk#000000871|0|thely final accounts. blithely ironic packages acro +46533|1055|F|109294.65|1994-10-08|2-HIGH|Clerk#000000815|0|dolites. slyly ironic excuses nag of the furiously +46534|412|F|75895.02|1992-10-04|2-HIGH|Clerk#000000998|0|onic dependencies. requests according to the final multipliers cajole carefu +46535|563|F|92265.14|1995-03-02|1-URGENT|Clerk#000000868|0|blithely final courts wake slyly theodolites! b +46560|350|O|106909.41|1997-08-23|1-URGENT|Clerk#000000448|0|to beans cajole after the carefully unusual epitaphs +46561|446|O|17147.67|1997-05-19|3-MEDIUM|Clerk#000000981|0|te slyly accounts. slyly ir +46562|439|F|76772.01|1995-02-13|4-NOT SPECIFIED|Clerk#000000412|0| the idle requests nag after th +46563|281|F|89846.28|1992-01-17|4-NOT SPECIFIED|Clerk#000000368|0|ully final excuses boost near the ironic theodolites. care +46564|992|O|158426.03|1998-05-09|5-LOW|Clerk#000000509|0|l requests boost carefully regular pinto beans. slyly regular pinto +46565|455|O|366528.14|1995-06-23|4-NOT SPECIFIED|Clerk#000000833|0|efully final platelets affix abo +46566|805|F|211653.59|1992-04-10|3-MEDIUM|Clerk#000000062|0|ses wake furiously regular, ruthless requests. express, +46567|160|O|66789.23|1998-04-15|2-HIGH|Clerk#000000282|0|breach furiously above the quickl +46592|209|F|120740.20|1994-08-04|1-URGENT|Clerk#000000298|0|jole carefully carefully special req +46593|1003|O|20938.42|1998-06-08|3-MEDIUM|Clerk#000000701|0| to the bold dugouts. slyly unusua +46594|1489|O|82657.72|1998-04-05|1-URGENT|Clerk#000000029|0| ironic foxes are slyly against the fin +46595|689|O|114054.78|1998-06-10|4-NOT SPECIFIED|Clerk#000000668|0|ake. pending theodolites +46596|989|F|54522.79|1993-07-01|5-LOW|Clerk#000000197|0|fily unusual requests cajole acc +46597|140|F|199657.97|1993-01-01|4-NOT SPECIFIED|Clerk#000000619|0|ts kindle fluffily pending deposits. blithely final deposits s +46598|1025|P|99615.54|1995-04-16|1-URGENT|Clerk#000000491|0|usly special foxes wake carefully ironic, pending depos +46599|1219|F|146360.24|1993-09-14|4-NOT SPECIFIED|Clerk#000000680|0|ously ironic deposits against the pending theodolites +46624|115|F|130704.16|1993-04-27|4-NOT SPECIFIED|Clerk#000000498|0|luffily pending dolphins. ironic accounts across the fluffily even g +46625|1028|F|72517.28|1994-07-21|4-NOT SPECIFIED|Clerk#000000924|0|ular ideas use. slyly quiet ideas +46626|163|F|55632.15|1992-06-28|5-LOW|Clerk#000000672|0|unts must have to run. slyly unusual d +46627|1339|F|314857.51|1994-06-12|1-URGENT|Clerk#000000305|0|lyly after the carefully final packages. e +46628|974|F|205077.37|1994-09-05|2-HIGH|Clerk#000000888|0|xcuses haggle along the quickly even dependencies. quickly silent excuses slee +46629|101|O|237393.19|1996-08-06|3-MEDIUM|Clerk#000000835|0|cies: special, final deposits wake +46630|142|O|118592.38|1998-03-19|5-LOW|Clerk#000000194|0|yly carefully final theodolites. hockey players affix pending grouches. sly +46631|1066|F|248698.63|1992-03-12|4-NOT SPECIFIED|Clerk#000000599|0|en excuses sleep furiously among +46656|112|F|145587.78|1994-07-17|2-HIGH|Clerk#000000913|0| poach furiously carefu +46657|586|O|176576.33|1996-04-05|4-NOT SPECIFIED|Clerk#000000332|0|ffix quickly regular ideas. unusual, express courts unwind quic +46658|734|O|156107.23|1995-08-22|3-MEDIUM|Clerk#000000695|0|ronic instructions wake quickly about the instructions. carefull +46659|427|F|159336.53|1993-04-10|4-NOT SPECIFIED|Clerk#000000357|0|s use sometimes against the slyly pe +46660|1168|O|121236.43|1996-07-19|2-HIGH|Clerk#000000425|0|ans wake furiously against the pending, si +46661|1276|O|57737.48|1998-04-06|4-NOT SPECIFIED|Clerk#000000857|0|equests maintain according to the +46662|158|O|128000.24|1995-12-30|1-URGENT|Clerk#000000367|0|arefully about the expre +46663|199|O|21867.39|1998-02-28|1-URGENT|Clerk#000000934|0|symptotes according to the reg +46688|448|O|94918.88|1997-09-30|4-NOT SPECIFIED|Clerk#000000024|0|t the quickly regular accounts. slyly ironic pinto beans boost furious +46689|1313|O|291034.71|1996-01-12|2-HIGH|Clerk#000000145|0|riously foxes. fluffily ironic deposits nag carefully. furiously ironic +46690|355|F|285587.97|1993-09-07|1-URGENT|Clerk#000000812|0|old platelets. carefully expres +46691|599|F|142003.66|1992-06-25|1-URGENT|Clerk#000000702|0|eas. final, express foxes nag car +46692|479|O|13599.51|1996-07-25|5-LOW|Clerk#000000371|0|orbits. carefully ironic pinto beans among the unusual packages cajole blit +46693|1249|O|212667.87|1998-07-10|5-LOW|Clerk#000000818|0|hely fluffily final deposits. regular, final requ +46694|1138|O|263793.57|1995-08-28|2-HIGH|Clerk#000000101|0|ar, bold instructions are blithely pending, ironic ac +46695|232|F|96292.35|1993-04-26|5-LOW|Clerk#000000151|0|oxes around the fluffily regular requests solve +46720|1294|O|124756.97|1997-05-17|2-HIGH|Clerk#000000524|0| deposits cajole fluf +46721|1276|F|111451.68|1994-09-14|3-MEDIUM|Clerk#000000947|0|enticing deposits affix furiously against t +46722|1436|O|234485.49|1996-01-21|1-URGENT|Clerk#000000361|0|ely even platelets. unusual, final +46723|796|F|144889.82|1992-04-13|1-URGENT|Clerk#000000146|0|lly furiously express accounts. special ideas along the iron +46724|1021|O|72371.05|1997-01-28|5-LOW|Clerk#000000874|0|ole against the accounts. carefully bold instructions are +46725|325|F|206251.42|1993-09-21|4-NOT SPECIFIED|Clerk#000000524|0| quickly bold requests cajole fluffily. final pinto beans haggle bli +46726|1016|F|91889.58|1992-07-06|4-NOT SPECIFIED|Clerk#000000947|0|fully express requests wake. furiously special packages a +46727|1169|F|83171.65|1994-11-14|5-LOW|Clerk#000000499|0|e furiously special accounts nod blithely foxes. +46752|1268|O|156204.13|1996-07-28|4-NOT SPECIFIED|Clerk#000000017|0|ronic instructions. final requests use. furiously bold requests cajole +46753|382|O|146786.04|1996-04-02|5-LOW|Clerk#000000477|0|ideas eat carefully special pinto beans. +46754|695|O|186875.86|1997-09-23|5-LOW|Clerk#000000191|0|ng foxes sleep carefully eve +46755|197|F|285293.63|1995-02-07|2-HIGH|Clerk#000000302|0|ckages. fluffily unusual pinto beans nag furiously. +46756|431|F|202579.59|1994-10-12|3-MEDIUM|Clerk#000000635|0|lar accounts serve fluffily fi +46757|758|O|44699.95|1995-06-05|1-URGENT|Clerk#000000927|0|try to wake! slyly special requests haggle. theodol +46758|1337|O|10005.61|1995-09-03|5-LOW|Clerk#000000590|0| ironic deposits hinder. regular +46759|1391|O|107261.76|1995-12-15|2-HIGH|Clerk#000000594|0|ular ideas. blithely enticing dependenc +46784|1189|O|214111.79|1995-10-20|2-HIGH|Clerk#000000495|0|heodolites about the slyly pending requests sleep careful +46785|1463|F|154642.78|1993-02-01|1-URGENT|Clerk#000000903|0|ourts haggle carefully. carefully eve +46786|542|F|279620.76|1993-04-03|2-HIGH|Clerk#000000787|0|y regular ideas about the quickly regular requests print ironic plate +46787|1345|F|163385.76|1992-03-30|3-MEDIUM|Clerk#000000160|0|efully unusual packages wake blithely after the final, final pinto beans. +46788|898|F|111910.26|1992-02-02|5-LOW|Clerk#000000025|0|sual, final pinto beans sleep above the furiousl +46789|1192|O|112222.68|1997-01-20|1-URGENT|Clerk#000000636|0|es nag carefully ironic accounts. theodolites +46790|1444|O|114678.90|1998-03-17|3-MEDIUM|Clerk#000000984|0|ke slyly. regular, regular accounts wake carefully furiously bol +46791|1147|F|159247.96|1994-03-05|1-URGENT|Clerk#000000570|0|foxes shall haggle quickly-- pending, special deposits affix c +46816|433|O|135912.06|1996-01-10|5-LOW|Clerk#000000569|0|out the blithely ironic deposits. carefully pending accounts haggle s +46817|1252|F|269001.73|1992-07-29|5-LOW|Clerk#000000856|0|e furiously ironic pinto beans. asymptotes n +46818|82|O|3057.97|1995-11-18|5-LOW|Clerk#000000196|0|carefully silent requests cajole furiously. dependencies ab +46819|40|O|172576.77|1997-11-13|5-LOW|Clerk#000000634|0|integrate unusual deposits. packages sleep blithely. fluffy foxes wake careful +46820|88|O|251372.18|1996-08-28|2-HIGH|Clerk#000000172|0|yly ironic dolphins should have to sleep evenly blithely regular accounts. ex +46821|1007|O|47484.67|1996-04-04|3-MEDIUM|Clerk#000000301|0|foxes are quickly blithely pending package +46822|361|O|179677.34|1997-03-24|2-HIGH|Clerk#000000753|0|e regular, furious deposits-- quickly +46823|1064|F|277313.92|1994-03-10|4-NOT SPECIFIED|Clerk#000000939|0|ccounts should have to i +46848|209|F|101259.45|1994-11-11|3-MEDIUM|Clerk#000000104|0|deposits cajole blithely even grouches. blithely r +46849|355|F|38350.04|1993-12-14|4-NOT SPECIFIED|Clerk#000000425|0|uriously ironic requests. careful +46850|529|F|15100.10|1993-12-10|3-MEDIUM|Clerk#000000632|0|y final deposits integrate furiously against the blit +46851|1357|O|111501.30|1996-12-05|1-URGENT|Clerk#000000106|0|kages cajole quickly ironic platelets +46852|1390|F|320104.89|1992-01-29|4-NOT SPECIFIED|Clerk#000000167|0|ross the blithely even deposits. fluffily silent requests cajole. expr +46853|1447|F|319926.65|1994-05-23|5-LOW|Clerk#000000021|0|uctions cajole blithely across the never even courts. unusual +46854|274|O|226556.62|1996-09-19|5-LOW|Clerk#000000457|0|fy pinto beans are carefully. blithely regular packages wake slyly. bli +46855|137|F|67889.30|1993-03-06|2-HIGH|Clerk#000000503|0|ts kindle. slyly special packages doze carefully. ironic, bold ins +46880|1307|F|11282.76|1993-07-04|1-URGENT|Clerk#000000112|0| pending accounts-- doggedly final deposits haggle quickly carefull +46881|244|F|206747.44|1994-10-07|1-URGENT|Clerk#000000884|0|requests sleep furiously express requests-- qui +46882|1486|O|193041.28|1997-03-28|4-NOT SPECIFIED|Clerk#000000893|0|posits sleep. slyly final deposits do nag +46883|289|O|8185.67|1997-05-22|4-NOT SPECIFIED|Clerk#000000926|0|dencies. blithely express +46884|1051|F|291564.78|1994-01-18|3-MEDIUM|Clerk#000000538|0|aggle. regular ideas +46885|73|O|225018.41|1995-06-08|5-LOW|Clerk#000000542|0|nts cajole after the fluffily final deposits. carefully +46886|1252|O|7483.89|1998-02-19|1-URGENT|Clerk#000000681|0|ges along the regular requests cajole blithely r +46887|130|O|142467.54|1997-08-28|4-NOT SPECIFIED|Clerk#000000166|0|cuses sleep dugouts. blithely express multipliers cajole furio +46912|490|F|176524.11|1992-07-01|5-LOW|Clerk#000000649|0|s doze bold pinto beans. fluffily fina +46913|1462|O|41870.86|1998-02-27|2-HIGH|Clerk#000000563|0| according to the furiously unusual platelets. carefully even foxes are. senti +46914|109|O|93387.47|1996-08-09|2-HIGH|Clerk#000000355|0|ray permanently along the express, final warhorses. +46915|328|F|96645.76|1994-07-10|4-NOT SPECIFIED|Clerk#000000124|0|s the slyly pending waters use +46916|1102|O|129214.15|1995-10-04|2-HIGH|Clerk#000000377|0|al requests. blithely regular foxes integrate. bli +46917|1253|F|172476.54|1993-07-13|4-NOT SPECIFIED|Clerk#000000958|0| express packages. furiously quiet accounts +46918|517|O|121001.17|1996-06-27|2-HIGH|Clerk#000000619|0|ven packages. permanently regular ideas +46919|317|F|161067.96|1994-06-19|5-LOW|Clerk#000000836|0|deposits are carefully final asymptotes. frets according to the do +46944|313|O|181710.69|1996-02-23|4-NOT SPECIFIED|Clerk#000000940|0|lly ironic theodolites engage. instructions wake furio +46945|121|F|79080.37|1993-01-08|2-HIGH|Clerk#000000107|0|egular requests. carefully even r +46946|1343|O|205526.21|1997-12-14|5-LOW|Clerk#000000628|0|cuses wake even, sly deposits. regular, ironic asymptotes haggle caref +46947|1105|F|18573.96|1993-12-20|3-MEDIUM|Clerk#000000137|0|eaves. express, pending theodolites wake blithely against the spec +46948|1189|F|137841.87|1993-05-21|5-LOW|Clerk#000000626|0|ges. bold instructions dazzle furiously even asy +46949|1352|F|227320.07|1993-03-08|2-HIGH|Clerk#000000820|0|e even deposits cajole +46950|25|O|85461.86|1997-03-21|5-LOW|Clerk#000000881|0|tes sleep after the pinto beans. q +46951|4|O|32138.87|1995-11-18|1-URGENT|Clerk#000000980|0|xpress frets. carefully even +46976|104|F|86058.00|1994-03-10|4-NOT SPECIFIED|Clerk#000000265|0| warhorses haggle blithely. fu +46977|352|F|112302.32|1992-05-08|3-MEDIUM|Clerk#000000288|0|. blithely regular accounts above the bli +46978|73|O|133851.06|1998-05-31|4-NOT SPECIFIED|Clerk#000000053|0|ch furiously about the asymptotes. furio +46979|428|F|77298.94|1992-07-17|5-LOW|Clerk#000000294|0|nal packages? blithely special deposits are blithely. spec +46980|1192|F|116138.27|1995-01-18|1-URGENT|Clerk#000000370|0|r deposits engage deposits. blithely special theodolites kindle furiously +46981|536|F|156771.91|1994-02-08|3-MEDIUM|Clerk#000000499|0|ans sleep slyly furiously final accounts. sl +46982|572|O|7093.72|1996-06-10|5-LOW|Clerk#000000376|0|sts. blithely unusual pla +46983|307|O|62933.86|1996-04-23|5-LOW|Clerk#000000228|0|s affix carefully sly, special requests. e +47008|1237|O|46229.05|1997-06-06|5-LOW|Clerk#000000892|0|thely ironic ideas among the ironic, regular ideas cajole carefully acr +47009|977|F|77762.56|1994-06-05|1-URGENT|Clerk#000000938|0|hely even theodolites affix quickly pending instructions. pac +47010|571|O|186045.48|1995-10-04|1-URGENT|Clerk#000000875|0| final dolphins affix fluffily slyly even packages. carefull +47011|1333|F|180910.69|1994-02-20|2-HIGH|Clerk#000000566|0|ays even requests cajole. quickly regular deposits use regular requests. spe +47012|659|F|77943.63|1993-05-14|5-LOW|Clerk#000000479|0|ly above the carefully pending pinto beans. ironic asymptotes are f +47013|239|O|49133.63|1996-08-23|3-MEDIUM|Clerk#000000156|0| carefully? slyly final accounts sleep quickly along the theodolit +47014|1144|F|158279.73|1992-05-14|1-URGENT|Clerk#000000918|0| fluffily express packages wake blithely from the bold +47015|901|F|258165.81|1995-02-14|4-NOT SPECIFIED|Clerk#000000188|0|rate carefully ideas. fu +47040|143|F|97209.68|1993-08-17|2-HIGH|Clerk#000000552|0| thinly slyly special packages. slyly regular pack +47041|1126|F|72038.55|1992-04-02|4-NOT SPECIFIED|Clerk#000000331|0|ress instructions solve slowly furiously unusual ideas. furiously fi +47042|1150|F|335164.51|1992-03-03|1-URGENT|Clerk#000000883|0|n depths sleep furiously fur +47043|472|O|26290.07|1995-09-29|1-URGENT|Clerk#000000262|0|ular instructions. furiously unusual accounts wak +47044|827|O|235800.59|1998-07-25|3-MEDIUM|Clerk#000000956|0|cing packages sleep fluffily against the blithely iro +47045|829|O|214964.33|1997-01-14|4-NOT SPECIFIED|Clerk#000000271|0|he blithely final gifts haggle furiously accordi +47046|1144|F|136772.64|1994-02-16|2-HIGH|Clerk#000000414|0|ular asymptotes. bold r +47047|490|F|48436.61|1994-07-28|1-URGENT|Clerk#000000452|0|accounts. slyly unusual instructi +47072|1177|F|26202.09|1994-12-23|5-LOW|Clerk#000000705|0|s integrate along th +47073|407|F|58864.70|1994-06-29|4-NOT SPECIFIED|Clerk#000000633|0|xpress sentiments. som +47074|503|O|226230.83|1997-12-05|3-MEDIUM|Clerk#000000543|0|g to the platelets! fluffily silent dugouts haggle slyly slyly ironic +47075|1007|O|202513.24|1995-10-18|3-MEDIUM|Clerk#000000715|0|sits nag fluffily. pinto beans nag blithely. caref +47076|860|F|18814.00|1995-01-08|3-MEDIUM|Clerk#000000334|0|counts doze carefully +47077|509|O|264185.65|1996-06-25|2-HIGH|Clerk#000000488|0|s requests engage pending +47078|265|F|227422.32|1993-04-20|3-MEDIUM|Clerk#000000984|0|counts. carefully express asymptotes alongside of t +47079|469|O|248825.56|1995-12-17|1-URGENT|Clerk#000000527|0|accounts. deposits +47104|518|F|119721.25|1992-06-23|5-LOW|Clerk#000000171|0|gular, regular accounts. bold, final pinto beans according +47105|167|O|177737.93|1996-05-20|3-MEDIUM|Clerk#000000443|0| deposits nag blithely. unusual ideas nag carefully. bli +47106|1456|O|199160.42|1995-10-26|3-MEDIUM|Clerk#000000866|0|ticingly ironic accounts. quickly final depths are. +47107|1294|O|181177.75|1996-02-21|5-LOW|Clerk#000000681|0|e the idly final pack +47108|1375|F|230101.92|1994-10-16|4-NOT SPECIFIED|Clerk#000000882|0|uffily final foxes. special de +47109|1396|O|208906.62|1995-09-12|2-HIGH|Clerk#000000472|0|s, even deposits sleep furiously. even, ironic hoc +47110|1498|F|76969.50|1993-08-16|2-HIGH|Clerk#000000280|0| ironic theodolites wake blithel +47111|995|O|118803.41|1997-09-10|2-HIGH|Clerk#000000549|0|carefully. bold dolphins affix along +47136|367|F|148878.66|1995-01-25|3-MEDIUM|Clerk#000000262|0| haggle slyly. deposits wake caref +47137|1192|O|66393.94|1996-03-15|5-LOW|Clerk#000000570|0| blithely final war +47138|667|F|249596.59|1994-01-10|5-LOW|Clerk#000000708|0|ag regular, ironic accounts. ironic, +47139|1403|O|71568.37|1997-05-18|5-LOW|Clerk#000000232|0|cording to the close foxes are quickly quietly iron +47140|214|O|147434.69|1998-06-07|1-URGENT|Clerk#000000309|0|ges. slyly special p +47141|562|F|151651.15|1994-10-20|2-HIGH|Clerk#000000258|0|ons! ironic foxes sleep across the carefully final deposits. carefully s +47142|973|O|114696.70|1996-03-23|1-URGENT|Clerk#000000951|0|e along the slyly bold courts. special instructions nag furiously blithely fin +47143|1312|O|151108.03|1997-08-20|5-LOW|Clerk#000000883|0|nto beans. blithely ironic deposits cajole. silent, final foxe +47168|464|F|203363.54|1994-06-22|4-NOT SPECIFIED|Clerk#000000261|0|ar accounts wake bold tithes. carefully pending i +47169|1127|F|208710.82|1993-03-04|3-MEDIUM|Clerk#000000926|0|the regular instructions. final deposits among the pinto beans cajole carefull +47170|923|O|136644.09|1996-10-16|4-NOT SPECIFIED|Clerk#000000944|0|y about the slyly final deposits. quickly final req +47171|116|F|110061.19|1993-01-08|3-MEDIUM|Clerk#000000972|0|xpress asymptotes sleep furiously among the blithely blithe packages; depos +47172|310|F|91321.00|1993-12-03|2-HIGH|Clerk#000001000|0|y ironic deposits wake slyly against the packages. p +47173|1327|F|231974.11|1994-09-02|4-NOT SPECIFIED|Clerk#000000052|0|unts. carefully unusual asymptotes cajole furiously. fu +47174|962|O|87626.71|1995-09-17|1-URGENT|Clerk#000000397|0|gular ideas. carefully regula +47175|1168|F|302112.63|1993-04-26|4-NOT SPECIFIED|Clerk#000000582|0|ts. quickly regular packages wake +47200|80|O|234605.29|1998-04-10|3-MEDIUM|Clerk#000000257|0|ag blithely about the even packages. regular re +47201|230|F|22856.40|1994-12-29|1-URGENT|Clerk#000000733|0|uctions poach. foxes detect along +47202|1108|O|199917.56|1996-12-13|4-NOT SPECIFIED|Clerk#000000777|0|e across the even accounts. bl +47203|692|F|144726.54|1994-12-19|1-URGENT|Clerk#000000709|0|c deposits affix furiously regular accounts. carefully ex +47204|224|P|213366.62|1995-03-13|3-MEDIUM|Clerk#000000678|0|fully. quickly special asymptotes h +47205|1291|O|255178.99|1998-03-25|3-MEDIUM|Clerk#000000888|0|s. deposits along the quickly unusua +47206|19|O|207396.40|1996-01-26|2-HIGH|Clerk#000000826|0|arefully final attainments. final pa +47207|655|F|80644.62|1994-12-19|5-LOW|Clerk#000000901|0|courts along the slyly pending accounts serv +47232|671|F|104659.83|1993-08-18|4-NOT SPECIFIED|Clerk#000000324|0|s! fluffily unusual courts are bl +47233|307|F|45759.96|1993-03-27|1-URGENT|Clerk#000000998|0|sts-- special dependencies according to the pending foxes haggle slyly +47234|71|O|154479.27|1998-05-14|2-HIGH|Clerk#000000163|0|unts. fluffily final multipliers haggle bold ideas. furiously iro +47235|841|F|80597.91|1992-04-03|2-HIGH|Clerk#000000285|0|furiously regular requests use careful +47236|577|O|275350.71|1995-10-03|2-HIGH|Clerk#000000075|0|. ideas sleep platelets. ironic somas use c +47237|313|F|217771.37|1993-08-31|4-NOT SPECIFIED|Clerk#000000109|0|regular requests. quickly regular deposits w +47238|301|F|25628.03|1993-01-15|1-URGENT|Clerk#000000219|0|l instructions nod blithely carefully ironic requests. +47239|1111|O|115304.59|1996-12-20|5-LOW|Clerk#000000504|0|egular asymptotes. even pinto beans cajole +47264|1303|O|34448.09|1997-08-28|2-HIGH|Clerk#000000691|0|lar accounts. deposits nod fluffily. blithely unusual f +47265|475|O|129104.92|1995-12-11|1-URGENT|Clerk#000000821|0|ully stealthy packages use instructions. furiously final sentiments d +47266|521|O|240131.78|1997-02-15|5-LOW|Clerk#000000046|0|nic ideas. slyly express asymptotes haggle blithely +47267|689|F|186323.47|1993-12-30|3-MEDIUM|Clerk#000000750|0|alongside of the slyly final waters. carefully unusual deposits +47268|1270|O|194781.96|1995-10-05|4-NOT SPECIFIED|Clerk#000000206|0|d requests haggle. furiously pending accounts are fl +47269|404|O|92501.86|1997-10-16|1-URGENT|Clerk#000000727|0|efully slyly regular mult +47270|644|F|214585.79|1993-08-03|1-URGENT|Clerk#000000271|0|n accounts serve amon +47271|1168|O|76195.49|1995-07-29|3-MEDIUM|Clerk#000000161|0|ns wake according to the bold asymptotes. pending, regular ideas accordi +47296|727|F|123342.02|1993-06-22|5-LOW|Clerk#000000961|0|hely ironic requests wake quickly carefully express accounts. quickly +47297|1414|O|216541.09|1997-07-25|1-URGENT|Clerk#000000829|0| accounts. stealthy deposits haggle quickly special packages. f +47298|392|O|121195.35|1995-10-08|3-MEDIUM|Clerk#000000138|0|ets nag quickly after t +47299|1465|F|46441.81|1993-10-29|1-URGENT|Clerk#000000680|0|eodolites sleep carefully alongside of the carefully even depende +47300|244|F|258143.39|1994-01-01|1-URGENT|Clerk#000000516|0|ut the foxes are bli +47301|77|O|121254.91|1995-07-18|5-LOW|Clerk#000000890|0|uld have to boost across t +47302|1309|O|255237.48|1996-10-13|2-HIGH|Clerk#000000869|0|ial requests detect. final packages sleep acr +47303|1067|O|124732.67|1995-12-06|3-MEDIUM|Clerk#000000273|0|e slyly regular dolphins. ideas hinder fur +47328|997|O|85167.24|1996-04-15|1-URGENT|Clerk#000000864|0|ce of the furiously regular requests. blithely final requests acc +47329|1132|F|231099.72|1993-02-11|5-LOW|Clerk#000000047|0|y bold ideas. slyly unusual accounts nag caref +47330|808|P|181730.57|1995-03-31|4-NOT SPECIFIED|Clerk#000000372|0|pecial requests sleep. express courts cajole bol +47331|233|O|176554.96|1996-08-17|1-URGENT|Clerk#000000693|0|top the quickly even reque +47332|1040|O|184344.92|1997-02-17|3-MEDIUM|Clerk#000000449|0|ic foxes sleep furiously. carefully final multipliers us +47333|409|O|60138.63|1995-09-08|1-URGENT|Clerk#000000400|0| about the final accounts! quickly even accounts haggle bli +47334|775|F|195584.61|1993-05-01|3-MEDIUM|Clerk#000000486|0|kages. regular, close instructions alongside of the special, final plat +47335|1345|F|105244.32|1992-07-30|1-URGENT|Clerk#000000492|0|counts cajole carefully unusual accounts. carefully iron +47360|407|F|153215.87|1993-10-09|4-NOT SPECIFIED|Clerk#000000462|0|fluffily express instru +47361|80|O|117528.72|1996-07-31|1-URGENT|Clerk#000000970|0|ake carefully pending ideas. silent deposits sleep fluffily according +47362|50|O|257309.12|1996-01-17|2-HIGH|Clerk#000000536|0|nts. furiously express requests haggle. reg +47363|949|O|79597.97|1996-06-02|5-LOW|Clerk#000000495|0|eat around the furiously regular requests. quickly final accounts integr +47364|1255|O|188832.58|1997-02-20|3-MEDIUM|Clerk#000000946|0|. regular, regular accounts sleep blithely aft +47365|973|O|224519.99|1997-07-02|4-NOT SPECIFIED|Clerk#000000186|0|uriously even deposits. quickly even foxes against the furiously ev +47366|349|F|95229.95|1993-02-10|2-HIGH|Clerk#000000828|0| regular dolphins. regular, unusual excuses doubt carefully. furiously ex +47367|1468|P|119173.03|1995-04-17|3-MEDIUM|Clerk#000000786|0|jole slyly after the furiously pending pinto +47392|959|F|168394.67|1994-09-13|4-NOT SPECIFIED|Clerk#000000459|0|fully bold accounts unwind: quickly ironic accounts cajole. carefully bo +47393|451|O|216091.85|1998-07-03|3-MEDIUM|Clerk#000000372|0|kindle around the quickly express theodolites. blit +47394|770|O|120276.85|1998-07-28|1-URGENT|Clerk#000000850|0|are furiously even foxes +47395|782|F|116324.34|1992-01-31|5-LOW|Clerk#000000663|0| pinto beans wake blithely ironic foxes- +47396|452|O|140975.85|1997-06-08|4-NOT SPECIFIED|Clerk#000000119|0|long the special pinto beans. final theodol +47397|1456|O|47593.25|1998-02-16|5-LOW|Clerk#000000062|0|y pending requests wake quickly final, f +47398|904|O|117667.58|1995-06-18|3-MEDIUM|Clerk#000000018|0|fily fluffy courts slee +47399|1228|F|200685.62|1992-08-02|5-LOW|Clerk#000000058|0|e against the carefully pending requests. quickly special accounts detect al +47424|590|O|171662.91|1996-06-29|5-LOW|Clerk#000000934|0|usual platelets boost +47425|601|O|125632.31|1998-02-08|1-URGENT|Clerk#000000087|0|ly regular ideas use blithely furiously special requests. +47426|1333|F|44097.76|1994-08-31|3-MEDIUM|Clerk#000000173|0|s. express instructions affix +47427|53|O|46695.13|1998-02-25|3-MEDIUM|Clerk#000000607|0|jole furiously final requests. slyly ironic packages cajole. furiou +47428|1168|F|15140.12|1993-02-06|4-NOT SPECIFIED|Clerk#000000967|0|und the fluffily ironic accoun +47429|49|O|57915.77|1996-05-14|2-HIGH|Clerk#000000135|0|. regular foxes above the blithely quiet deposits cajole blithel +47430|838|O|40201.75|1997-04-06|5-LOW|Clerk#000000799|0|carefully ironic theodolites do haggle blithely. slyly +47431|1376|O|150828.91|1997-09-03|3-MEDIUM|Clerk#000000500|0|express accounts. deposits doze about the bold, regular +47456|427|F|149659.81|1992-06-01|5-LOW|Clerk#000000711|0|e. quickly even deposits to th +47457|142|F|275823.26|1994-06-04|5-LOW|Clerk#000000250|0| express, pending requests +47458|76|O|183170.54|1996-04-25|1-URGENT|Clerk#000000150|0| slyly pending asymptotes in +47459|1201|O|94435.21|1995-08-18|4-NOT SPECIFIED|Clerk#000000267|0|egular packages. final dependencies wake after the even foxes. slyly ironic ac +47460|649|F|106396.19|1993-10-11|1-URGENT|Clerk#000000982|0| even platelets? furious +47461|638|F|214308.46|1993-04-26|2-HIGH|Clerk#000000570|0|ully furiously pending deposits. carefully even platelets boost behin +47462|1120|O|146594.36|1995-06-10|2-HIGH|Clerk#000000618|0|hely final courts sleep quickly furiously special dependencies. blithely sly d +47463|1249|O|133406.15|1998-02-12|2-HIGH|Clerk#000000262|0|iresias hang quickly alongside of the even excuse +47488|31|F|74665.94|1995-04-26|3-MEDIUM|Clerk#000000295|0|, bold accounts haggle. silent acc +47489|163|F|172492.85|1994-05-21|4-NOT SPECIFIED|Clerk#000000968|0|ironic accounts cajole about the carefully regular packages. +47490|521|O|212385.28|1995-08-14|2-HIGH|Clerk#000000330|0|detect about the furiously regular instruc +47491|628|O|61013.00|1998-03-17|4-NOT SPECIFIED|Clerk#000000486|0|onic instructions bo +47492|241|O|231633.73|1995-07-24|2-HIGH|Clerk#000000185|0|g to the slyly ironic requests. slyly ironic requ +47493|128|F|236881.89|1994-02-12|1-URGENT|Clerk#000000206|0|r the carefully ironic +47494|1429|F|175874.33|1994-07-02|2-HIGH|Clerk#000000416|0|requests along the ironic, regular accounts boost blithely dolphins? carefull +47495|487|O|184368.88|1995-08-30|3-MEDIUM|Clerk#000000650|0|pinto beans. specia +47520|1321|F|268596.83|1994-10-08|4-NOT SPECIFIED|Clerk#000000170|0|sts. fluffily even account +47521|323|F|147769.27|1993-12-08|3-MEDIUM|Clerk#000000113|0| impress slyly pending requests. furiously +47522|205|F|183442.28|1992-10-24|2-HIGH|Clerk#000000569|0|quests doubt furiously after the carefully final depos +47523|287|F|197235.67|1992-06-01|5-LOW|Clerk#000000316|0|furiously ironic deposits haggle regular pains: even deposits after the pend +47524|106|F|177908.37|1993-04-16|3-MEDIUM|Clerk#000000295|0|packages cajole among the final packages. requests above the blithely express +47525|175|P|258912.84|1995-03-04|3-MEDIUM|Clerk#000000504|0|es use furiously express accounts. fluffily final packages w +47526|1208|F|92405.71|1992-01-29|1-URGENT|Clerk#000000987|0|ess platelets wake furiously about the carefully even packa +47527|293|F|86091.02|1993-09-18|3-MEDIUM|Clerk#000000785|0|y. pending accounts solve quickly; fluffily bold deposit +47552|871|O|261653.44|1998-06-27|4-NOT SPECIFIED|Clerk#000000799|0|le along the silent pint +47553|952|O|212402.94|1995-05-23|3-MEDIUM|Clerk#000000702|0|ly final pinto beans cajole. quickly fluffy deposits wa +47554|1249|F|157980.71|1993-03-14|5-LOW|Clerk#000000338|0|ly even packages cajole enti +47555|1144|O|59856.43|1997-10-04|1-URGENT|Clerk#000000651|0| never silent warhorses. bold deposits wake fluffily enticing ex +47556|436|F|127074.72|1993-07-26|5-LOW|Clerk#000000228|0|nts nag slyly fluffy foxes. regular, special accou +47557|935|O|146021.24|1998-06-13|1-URGENT|Clerk#000000779|0|s along the furiously special pinto beans are quickly across the +47558|76|O|259596.90|1997-05-12|2-HIGH|Clerk#000000834|0|nal packages after the carefully +47559|556|O|53290.31|1998-06-09|4-NOT SPECIFIED|Clerk#000000821|0|press excuses. carefully express asymptotes use along +47584|1291|F|297165.65|1993-07-28|1-URGENT|Clerk#000000925|0|inal packages. final, furious instructions boost furiously. fur +47585|373|O|319477.22|1998-05-13|3-MEDIUM|Clerk#000000921|0| instructions cajole. furiously final packages are-- silentl +47586|202|O|248557.47|1996-05-24|2-HIGH|Clerk#000000881|0|ular packages are blithely alongside of the qui +47587|1153|O|28301.13|1996-05-18|1-URGENT|Clerk#000000636|0|ages cajole blithely according to the blithely quiet packages. car +47588|601|F|76090.72|1994-05-23|4-NOT SPECIFIED|Clerk#000000604|0| the blithely pending requests. quickly even idea +47589|1114|O|142269.16|1997-04-13|4-NOT SPECIFIED|Clerk#000000350|0| instructions. final, pending +47590|28|O|155236.61|1997-07-04|2-HIGH|Clerk#000000719|0|uriously ironic accounts. even +47591|823|F|125040.01|1992-01-03|1-URGENT|Clerk#000000497|0|eas nag furiously bravely regular depths. even i +47616|779|O|64356.65|1997-10-12|4-NOT SPECIFIED|Clerk#000000183|0|e closely against the car +47617|421|F|267440.22|1994-12-09|4-NOT SPECIFIED|Clerk#000000849|0|r the carefully regular theodolites. excuses sleep furiousl +47618|1201|O|285707.10|1996-09-25|4-NOT SPECIFIED|Clerk#000000790|0|s the furiously express accounts haggle quickly blithely blithe ex +47619|388|F|37744.88|1992-03-22|1-URGENT|Clerk#000000765|0|ly. blithely express requests integrate blithely. pinto beans +47620|1426|F|104014.12|1992-06-27|5-LOW|Clerk#000000868|0|gular theodolites cajole blithely regular requests. care +47621|304|F|86324.75|1994-07-12|1-URGENT|Clerk#000000122|0|ously silent deposits? bold deposits +47622|356|F|45195.84|1992-09-13|4-NOT SPECIFIED|Clerk#000000597|0|y silent packages. iron +47623|580|F|65467.53|1993-11-29|1-URGENT|Clerk#000000784|0|gainst the accounts. sly +47648|668|F|158652.34|1992-06-25|4-NOT SPECIFIED|Clerk#000000964|0|- regular pinto beans use fluffily clos +47649|421|F|27750.41|1992-11-01|1-URGENT|Clerk#000000327|0|lar instructions. requests d +47650|370|F|214173.39|1995-02-06|2-HIGH|Clerk#000000585|0|posits cajole furiously! stealthily silent accounts integrate a +47651|916|O|45162.64|1996-07-25|3-MEDIUM|Clerk#000000534|0|ages at the even frets sleep fluffily alongside +47652|67|F|45294.30|1994-01-21|3-MEDIUM|Clerk#000000664|0|sly ironic pinto beans wake packages. accounts use. deposit +47653|1399|O|207323.07|1996-07-06|3-MEDIUM|Clerk#000000830|0|lar deposits. quickly express theo +47654|940|O|12755.96|1995-07-31|5-LOW|Clerk#000000632|0| slyly along the quickly unusual escapades. carefully special accounts s +47655|952|O|258650.26|1997-08-10|5-LOW|Clerk#000000684|0|dencies cajole. slyly ironic requests boost pinto beans. fluffily u +47680|634|O|38504.81|1998-01-14|2-HIGH|Clerk#000000563|0|ong the permanent accounts. ironic, final instructions aff +47681|1400|O|1301.08|1995-11-14|3-MEDIUM|Clerk#000000751|0| cajole quickly. carefully regular ins +47682|160|F|198450.88|1992-11-17|4-NOT SPECIFIED|Clerk#000000757|0|es-- ironic, final pa +47683|481|F|154203.63|1993-09-02|5-LOW|Clerk#000000186|0|nto beans cajole quickly. pinto beans +47684|44|O|281583.35|1997-06-10|1-URGENT|Clerk#000000560|0|eposits cajole slyly special packages. furiously regul +47685|1381|O|182157.02|1995-06-18|4-NOT SPECIFIED|Clerk#000000929|0|ges use furiously ironic asymptotes. furiously final asymptotes snooze slyly +47686|595|F|205408.68|1992-10-12|4-NOT SPECIFIED|Clerk#000000399|0|urious dependencies are slyly carefully pending requests. requ +47687|934|F|126990.80|1992-01-31|1-URGENT|Clerk#000000890|0|ggle carefully! slyly regular dugouts detect daringly. final, regular +47712|1015|F|215659.78|1993-07-14|5-LOW|Clerk#000000481|0|bold accounts. fluffily pending ideas nag fluffily slyly express packages. f +47713|763|F|254990.40|1994-07-04|2-HIGH|Clerk#000000061|0|nt deposits. finally special foxes haggle carefully p +47714|790|P|279595.57|1995-03-11|3-MEDIUM|Clerk#000000748|0|ithely final deposits. ironic grouches sleep above the slyly ironic package +47715|1000|O|132433.44|1998-03-11|1-URGENT|Clerk#000000168|0|y regular packages haggle quickly carefully silent instructi +47716|982|O|85651.31|1997-09-27|2-HIGH|Clerk#000000242|0|l asymptotes sleep fluffily. carefully r +47717|403|O|180950.93|1995-12-18|4-NOT SPECIFIED|Clerk#000000651|0|fully special requests. +47718|358|O|235532.97|1996-03-20|3-MEDIUM|Clerk#000000715|0|ackages. boldly pending deposits must haggl +47719|1006|O|56022.10|1995-12-19|4-NOT SPECIFIED|Clerk#000000826|0|l pinto beans haggle blithely after the quickly unus +47744|1463|O|262799.06|1997-07-05|5-LOW|Clerk#000000007|0|as cajole slyly about the final, regular asymptotes. pending foxes wake care +47745|1321|O|51746.34|1998-05-17|4-NOT SPECIFIED|Clerk#000000666|0|ach furiously foxes. final packages use. +47746|1405|O|43176.55|1997-05-22|5-LOW|Clerk#000000515|0| ironic requests sleep carefully according to the dependencies! +47747|38|O|38356.28|1995-11-22|2-HIGH|Clerk#000000937|0|ns. furiously pending deposits nag carefully slyly fina +47748|139|O|211146.29|1996-03-14|1-URGENT|Clerk#000000648|0|regular asymptotes. requests haggle blithely ac +47749|1426|F|1800.58|1993-03-17|3-MEDIUM|Clerk#000000679|0| the slyly ironic courts are slyly behind the req +47750|1169|F|290415.79|1993-06-16|5-LOW|Clerk#000000751|0|arefully regular foxes. permanent, regular theodolites use. express packag +47751|518|O|174395.83|1996-09-12|4-NOT SPECIFIED|Clerk#000000075|0|ts are requests-- r +47776|692|O|146528.13|1996-06-25|1-URGENT|Clerk#000000227|0|lly bold ideas sleep blithely fluffily regular somas. ironic, final noto +47777|1154|F|58962.40|1992-11-26|5-LOW|Clerk#000000716|0|ully bold deposits haggle slyly. +47778|947|F|14186.25|1993-02-15|1-URGENT|Clerk#000000479|0| pinto beans. stealthily pending deposits cajole around the blithel +47779|709|F|133577.19|1992-09-05|1-URGENT|Clerk#000000815|0|press accounts: furiously even deposits nod furiously along the regular +47780|1184|F|105071.32|1993-03-26|2-HIGH|Clerk#000000735|0|he even, regular theodolite +47781|1186|F|112941.62|1995-01-29|3-MEDIUM|Clerk#000000703|0|xpress ideas. final deposits impress alongsid +47782|1387|F|47703.13|1992-08-08|1-URGENT|Clerk#000000295|0|ng packages wake. carefully pendin +47783|229|F|151786.81|1993-04-29|5-LOW|Clerk#000000625|0|pending excuses nag after the bold, regular accounts. regular package +47808|583|O|118275.57|1995-06-22|5-LOW|Clerk#000000935|0|y. blithely ironic requests haggle blithely. flu +47809|1040|O|217092.79|1995-06-27|4-NOT SPECIFIED|Clerk#000000956|0|onic accounts. final, ironic deposits are slyly special a +47810|1441|O|149564.89|1995-08-15|1-URGENT|Clerk#000000580|0|its are carefully furiously furious pinto b +47811|46|O|202624.04|1996-02-24|2-HIGH|Clerk#000000905|0|arefully against the deposits? unusual, regular +47812|1240|O|33350.57|1995-08-24|4-NOT SPECIFIED|Clerk#000000856|0|ress requests. fluf +47813|487|F|238048.36|1994-08-28|2-HIGH|Clerk#000000346|0|asymptotes are. furiously regular foxes cajole c +47814|944|O|213189.11|1997-04-01|2-HIGH|Clerk#000000297|0|ggle ironic deposits. quickly ironic pinto beans boost furiously +47815|677|F|147438.07|1992-12-31|4-NOT SPECIFIED|Clerk#000000666|0|usly final asymptotes wake carefully about the slyly silen +47840|928|F|221871.09|1994-03-03|4-NOT SPECIFIED|Clerk#000000987|0|ithely according to the quickly pending fox +47841|977|O|215923.01|1996-02-10|3-MEDIUM|Clerk#000000551|0| across the ideas. requests wak +47842|610|F|211413.69|1993-05-13|3-MEDIUM|Clerk#000000310|0|evenly even deposits. fluff +47843|97|F|145605.79|1992-03-17|1-URGENT|Clerk#000000497|0|sly express requests nag slyly even excuses. furiously regul +47844|1340|F|177826.81|1993-12-13|1-URGENT|Clerk#000000538|0|ickly even dolphins sleep care +47845|1112|O|95953.69|1997-01-01|4-NOT SPECIFIED|Clerk#000000235|0|press instructions: slyly even foxes acros +47846|1499|F|260966.57|1992-08-12|2-HIGH|Clerk#000000612|0|pinto beans. slyly special +47847|343|O|127655.91|1996-01-14|3-MEDIUM|Clerk#000000599|0|eep across the furiously ironic packages. blithely unus +47872|797|F|202900.19|1994-06-13|1-URGENT|Clerk#000000083|0| furiously regular requests by the express, bold accounts use acco +47873|449|F|132396.83|1993-11-14|1-URGENT|Clerk#000000851|0|pecial, final Tiresias hinder slyly fluffily ironic idea +47874|970|O|54277.43|1998-03-18|4-NOT SPECIFIED|Clerk#000000858|0|osits wake blithely across t +47875|352|F|192696.45|1992-08-05|3-MEDIUM|Clerk#000000006|0|r packages? carefully expre +47876|205|F|250985.98|1994-12-26|2-HIGH|Clerk#000000268|0|of the ironic deposits. furiously even sentiments sleep quickly instead +47877|737|F|254363.30|1994-08-29|3-MEDIUM|Clerk#000000042|0| slyly ruthless deposits. ru +47878|496|P|93998.40|1995-05-08|2-HIGH|Clerk#000000514|0|ously regular sentiments wake. ironic request +47879|1165|F|54960.85|1992-01-12|1-URGENT|Clerk#000000528|0|dolites nag. regular instructions cajole fur +47904|206|O|245498.00|1997-06-03|4-NOT SPECIFIED|Clerk#000000744|0|s. slyly regular instruction +47905|740|F|99631.37|1994-04-02|1-URGENT|Clerk#000000972|0|nal accounts wake above the unusual pinto bean +47906|1306|O|89040.53|1996-01-04|5-LOW|Clerk#000000851|0| sleep furiously packages: +47907|1447|O|225434.37|1998-05-11|5-LOW|Clerk#000000603|0|wake. carefully special foxes along the courts cajo +47908|257|O|97445.44|1997-12-23|4-NOT SPECIFIED|Clerk#000000675|0|uffily furiously slow instructions. express platele +47909|737|F|235230.01|1993-03-10|3-MEDIUM|Clerk#000000656|0|he packages. carefully unusual pinto beans across the carefull +47910|536|F|111891.77|1994-08-16|2-HIGH|Clerk#000000899|0|s are blithely against the quickly even accounts. ironic packages sleep q +47911|296|O|255065.30|1996-07-21|3-MEDIUM|Clerk#000000574|0|erns. ironic, final packages th +47936|676|O|113514.85|1996-12-29|4-NOT SPECIFIED|Clerk#000000456|0| requests. blithely pending depe +47937|1244|F|168507.11|1993-08-26|2-HIGH|Clerk#000000138|0|ts cajole quickly after the carefully fi +47938|1096|F|162710.02|1994-06-25|5-LOW|Clerk#000000048|0|ckly express instructions sleep furiously alongside of the slyly special +47939|961|F|88149.34|1992-05-09|4-NOT SPECIFIED|Clerk#000000328|0|ets. ironic, even instr +47940|1123|F|35225.86|1993-05-27|4-NOT SPECIFIED|Clerk#000000226|0|ckages. fluffily bold packages wake blithely special epitaphs. bu +47941|251|F|201981.60|1994-08-09|2-HIGH|Clerk#000000757|0|re carefully. regular +47942|1313|F|266749.66|1993-02-28|3-MEDIUM|Clerk#000000327|0|tes across the furiously +47943|71|F|156615.62|1994-11-15|3-MEDIUM|Clerk#000000403|0| above the carefully regula +47968|974|F|43318.66|1993-03-08|3-MEDIUM|Clerk#000000635|0|ess foxes. final multipliers wake carefully. never even +47969|905|F|42342.77|1994-11-20|3-MEDIUM|Clerk#000000414|0|ully alongside of the silently +47970|853|O|166370.58|1997-07-25|5-LOW|Clerk#000000530|0|sly unusual requests hag +47971|314|F|210387.85|1992-10-30|2-HIGH|Clerk#000000218|0|nto beans? slyly ironic packages cajole +47972|841|F|162195.95|1993-10-12|3-MEDIUM|Clerk#000000221|0| theodolites are carefully +47973|139|O|158931.34|1997-07-08|4-NOT SPECIFIED|Clerk#000000996|0|aters boost boldly across the fluffily pending theo +47974|661|F|175462.82|1994-09-01|3-MEDIUM|Clerk#000000533|0|es promise stealthily +47975|1294|F|99781.94|1993-08-15|1-URGENT|Clerk#000000173|0|nticing multipliers haggle qu +48000|1088|F|45578.04|1992-08-14|2-HIGH|Clerk#000000956|0|its integrate furiously carefully regular +48001|605|O|321653.28|1998-02-12|4-NOT SPECIFIED|Clerk#000000345|0|slyly. evenly final ideas affix furiously according to the silent asympt +48002|1438|O|244049.97|1996-04-02|5-LOW|Clerk#000000240|0|leep slyly patterns. e +48003|278|F|243214.51|1992-01-27|3-MEDIUM|Clerk#000000489|0|es affix furiously carefully final requests-- ev +48004|382|O|211680.36|1998-01-18|1-URGENT|Clerk#000000625|0|ely ironic packages along the slyly bold instructions nag sly +48005|1222|O|207556.73|1997-05-04|3-MEDIUM|Clerk#000000963|0|ar ideas affix carefully. carefully ironic pack +48006|1228|F|15031.34|1992-07-05|1-URGENT|Clerk#000000147|0|in packages. even gifts cajole qui +48007|1153|O|271793.84|1997-06-26|2-HIGH|Clerk#000000995|0|e blithely pending foxes are according to the carefully furious asymptote +48032|536|F|115174.34|1993-08-27|2-HIGH|Clerk#000000336|0|ns engage. carefully pending a +48033|661|O|2995.75|1996-07-28|1-URGENT|Clerk#000000857|0|kly regular instructi +48034|103|F|108773.99|1994-07-15|4-NOT SPECIFIED|Clerk#000000917|0|ut the quietly pending packages are fluffily among the blit +48035|824|F|80002.94|1994-04-01|1-URGENT|Clerk#000000229|0| even packages about the furiousl +48036|325|O|172630.93|1996-03-02|1-URGENT|Clerk#000000149|0|ts doze. regular accounts sleep carefull +48037|244|O|79674.91|1995-09-16|1-URGENT|Clerk#000000791|0|bold deposits. ironic, regular deposits sleep acros +48038|1099|O|43747.19|1997-01-18|4-NOT SPECIFIED|Clerk#000000615|0|ily ironic ideas print quickly about t +48039|262|F|25235.80|1993-07-30|4-NOT SPECIFIED|Clerk#000000880|0|fully express depos +48064|376|F|86245.17|1993-06-08|3-MEDIUM|Clerk#000000768|0| ironic foxes. blithely silent requests above the bra +48065|1202|F|35721.06|1993-04-14|2-HIGH|Clerk#000000986|0|foxes should mold after the bravely brave foxes. carefully even a +48066|977|F|22177.45|1993-08-29|3-MEDIUM|Clerk#000000705|0|xes. final, silent requests along the furiously bold deposit +48067|149|F|260590.35|1992-06-30|5-LOW|Clerk#000000901|0|y bold requests! slyly bold ideas boost +48068|481|F|2806.71|1992-10-26|3-MEDIUM|Clerk#000000300|0|s. carefully ironic accoun +48069|731|O|3658.18|1996-04-30|1-URGENT|Clerk#000000159|0|quests! frets detect blithely +48070|28|O|37269.48|1997-07-16|2-HIGH|Clerk#000000243|0|fully around the acco +48071|1462|F|73170.91|1995-03-04|5-LOW|Clerk#000000906|0|accounts sleep around the carefully express foxes. furiousl +48096|1363|F|292794.34|1994-06-13|2-HIGH|Clerk#000000127|0|equests are alongside of the even deposits. +48097|187|O|38151.43|1997-09-01|4-NOT SPECIFIED|Clerk#000000433|0|thely regular asymptotes. regular foxes are fluffily among t +48098|461|F|124858.74|1994-08-16|2-HIGH|Clerk#000000700|0|carefully bold accounts? furiously final accounts are +48099|332|O|53332.13|1996-05-01|1-URGENT|Clerk#000000999|0|inal excuses wake slyly. express instructions sleep slyly regular +48100|799|O|66685.24|1997-12-02|4-NOT SPECIFIED|Clerk#000000237|0| carefully ironic pa +48101|1366|O|146910.39|1995-09-13|2-HIGH|Clerk#000000816|0|t! accounts integrate carefully. bravely final requests are bl +48102|1072|F|42972.77|1992-02-07|2-HIGH|Clerk#000000288|0| final accounts. slyly express requests sublate furiously about +48103|568|O|209339.22|1996-07-09|2-HIGH|Clerk#000000017|0|xes was stealthily ironi +48128|1360|F|181075.99|1992-04-12|3-MEDIUM|Clerk#000000683|0|beans haggle above the blithely even accounts. theodolites lose carefully at t +48129|259|O|39440.12|1997-11-09|3-MEDIUM|Clerk#000000822|0|carefully regular pinto beans. slyly ironic packages us +48130|1402|O|171549.36|1997-11-06|1-URGENT|Clerk#000000506|0|ions. carefully pending deposits across the fluffily even depe +48131|925|O|39438.99|1998-02-16|4-NOT SPECIFIED|Clerk#000000104|0|posits wake carefully. carefully even theodolit +48132|488|F|148416.70|1992-12-20|3-MEDIUM|Clerk#000000216|0|ic theodolites use blithely blithely regular requests. qui +48133|302|O|74176.18|1995-11-26|2-HIGH|Clerk#000000884|0|s haggle carefully bold instruction +48134|772|F|126051.12|1993-03-06|4-NOT SPECIFIED|Clerk#000000816|0|c packages doze blithely slyly final warthogs +48135|1238|F|304538.52|1994-04-20|2-HIGH|Clerk#000000412|0|blithely against the final, final packages. sile +48160|1162|O|116619.49|1996-02-08|4-NOT SPECIFIED|Clerk#000000277|0|en, even packages after the idly s +48161|176|P|283479.20|1995-05-24|4-NOT SPECIFIED|Clerk#000000568|0|. theodolites lose quickl +48162|406|O|163521.95|1996-03-22|2-HIGH|Clerk#000000417|0|ts unwind. fluffily final packages haggle. carefully unusual foxes boost furio +48163|676|O|148217.94|1997-02-22|5-LOW|Clerk#000000654|0|fully-- furiously silent accounts slee +48164|430|O|31962.16|1995-10-30|2-HIGH|Clerk#000000619|0| wake furiously after the regular platelets. blithely even package +48165|1252|F|26549.61|1993-11-06|2-HIGH|Clerk#000000885|0|e final, silent tithes. fin +48166|1492|O|110982.24|1996-07-24|5-LOW|Clerk#000000543|0|the pending excuses wake fluffily alongside of the blithely sly instruc +48167|1078|F|96430.43|1994-09-07|1-URGENT|Clerk#000000798|0|final deposits enga +48192|892|F|176659.15|1994-12-17|1-URGENT|Clerk#000000540|0|ely silent theodolites use. pend +48193|307|O|81685.03|1996-08-27|2-HIGH|Clerk#000000268|0|eans. carefully bold at +48194|161|O|125186.20|1997-10-08|1-URGENT|Clerk#000000134|0|e special instructions. final dependencies along +48195|1223|F|194323.16|1993-11-28|4-NOT SPECIFIED|Clerk#000000992|0|ver special ideas use furiously final, even accounts: packages haggle blithely +48196|467|O|140586.59|1998-01-16|1-URGENT|Clerk#000000879|0|g dolphins; slyly regular deposits wake furiously. quickly even requests cajol +48197|127|F|186302.65|1992-05-06|4-NOT SPECIFIED|Clerk#000000565|0|. blithely pending packages sleep. slyly ironic platelets pl +48198|322|F|139255.13|1994-11-21|1-URGENT|Clerk#000000396|0|ins. furiously bold ideas haggle carefully. pea +48199|802|F|366916.27|1994-01-19|4-NOT SPECIFIED|Clerk#000000150|0|ag fluffily after the +48224|836|F|179812.89|1993-07-15|3-MEDIUM|Clerk#000000153|0|nic packages cajole against the c +48225|308|O|140666.28|1996-02-04|3-MEDIUM|Clerk#000000299|0| sleep. furiously even requests are abo +48226|253|F|311922.01|1994-01-07|5-LOW|Clerk#000000866|0|beans. carefully final deposits among the bold packa +48227|568|O|263990.64|1998-07-13|1-URGENT|Clerk#000000562|0| packages cajole. carefully bold instructions c +48228|1195|O|91031.44|1995-06-01|2-HIGH|Clerk#000000886|0|ites. blithely regular a +48229|1082|O|371624.55|1997-12-30|2-HIGH|Clerk#000000968|0|fully about the packages. blithely pending i +48230|358|F|175578.08|1994-02-26|4-NOT SPECIFIED|Clerk#000000232|0|ckly permanent deposits haggle slyly. fluffily bold ac +48231|812|F|44819.53|1992-08-22|4-NOT SPECIFIED|Clerk#000000294|0|sias snooze slyly-- bol +48256|1360|F|9893.41|1995-04-11|1-URGENT|Clerk#000000359|0| are slyly. slyly s +48257|1459|F|33518.77|1994-04-23|5-LOW|Clerk#000000342|0| theodolites. regular accounts cajole. fu +48258|1406|O|41524.04|1996-06-03|3-MEDIUM|Clerk#000000344|0|packages detect according to the closely regular pinto beans. sl +48259|442|F|155678.81|1993-10-14|1-URGENT|Clerk#000000735|0|ilent accounts. slyly ironic inst +48260|421|O|166243.37|1996-12-14|2-HIGH|Clerk#000000832|0|egular, regular requests about the slyly ironic requests boost blithely c +48261|689|F|97177.39|1995-03-19|3-MEDIUM|Clerk#000000527|0|y past the fluffily ironic packages. pending requests p +48262|691|O|130703.27|1996-04-26|3-MEDIUM|Clerk#000000548|0|refully. packages among the bravely special requests boost quickly amo +48263|1132|F|185961.52|1993-03-10|3-MEDIUM|Clerk#000000597|0|lar, regular requests doubt +48288|694|O|11063.18|1995-07-23|3-MEDIUM|Clerk#000000620|0|ructions cajole ironic, u +48289|1096|O|262727.27|1997-06-11|3-MEDIUM|Clerk#000000532|0| carefully regular packages nag furiously. blithely furious +48290|1381|O|173749.42|1997-11-27|1-URGENT|Clerk#000000303|0|xpress packages was fluffily quickly ruthle +48291|832|O|32844.84|1996-10-31|2-HIGH|Clerk#000000488|0|s; fluffily regular requests sleep blithely even deposits. furiously regul +48292|152|O|79123.23|1998-05-01|2-HIGH|Clerk#000000663|0|ithely. carefully ironic requests wake slyly. regular accounts x-ray fluffi +48293|1388|F|81084.82|1992-04-10|1-URGENT|Clerk#000000247|0|e blithely pending accounts! bold accounts +48294|1414|F|35355.67|1993-05-27|2-HIGH|Clerk#000000896|0|otes. furiously brave deposits grow realms. ironic f +48295|1499|F|98529.72|1994-11-24|3-MEDIUM|Clerk#000000724|0|nding instructions. exp +48320|821|O|152039.63|1995-11-04|5-LOW|Clerk#000000641|0| regular requests across +48321|1280|F|106055.89|1993-07-30|2-HIGH|Clerk#000000169|0|nstructions x-ray regular pinto +48322|881|F|37808.12|1992-03-05|3-MEDIUM|Clerk#000000268|0| even frays among the regular, ironic theodolites hang furi +48323|205|F|48916.95|1993-10-31|4-NOT SPECIFIED|Clerk#000000666|0|ickly bold instructions haggle furiously among the ironic warthogs. carefu +48324|410|F|161508.31|1993-06-01|4-NOT SPECIFIED|Clerk#000000120|0|ly across the furiously ruthless p +48325|346|O|25719.57|1996-03-10|2-HIGH|Clerk#000000795|0|efully pending asymptotes. care +48326|1499|F|68728.64|1992-01-14|4-NOT SPECIFIED|Clerk#000000793|0|requests? furiously final tithes sleep blithely. ideas haggle busi +48327|857|F|170758.88|1994-08-11|4-NOT SPECIFIED|Clerk#000000076|0|e slyly according to th +48352|626|O|11499.77|1997-05-05|2-HIGH|Clerk#000000674|0|le. furiously final platelets nod carefully deposits. never even requests caj +48353|383|F|194696.20|1992-12-16|4-NOT SPECIFIED|Clerk#000000856|0|sual deposits was. express theodolites haggle against the quickly +48354|344|F|14998.97|1995-04-21|3-MEDIUM|Clerk#000000871|0| sheaves wake about the r +48355|1117|O|163032.11|1995-08-15|2-HIGH|Clerk#000000806|0|tes are against the blithely special p +48356|817|O|242698.02|1997-04-02|2-HIGH|Clerk#000000334|0|olites cajole fluffily even deposits. blithely bo +48357|16|F|168663.51|1994-03-29|4-NOT SPECIFIED|Clerk#000000013|0|ole. carefully ironic dep +48358|136|O|87507.53|1997-08-10|4-NOT SPECIFIED|Clerk#000000244|0|ay furiously slyly even warhorses. regular packages haggle blithely a +48359|796|O|165042.17|1997-12-01|2-HIGH|Clerk#000000139|0|ainst the carefully bold instructions. final requests wake. slyly unusual de +48384|643|F|102035.04|1994-07-30|4-NOT SPECIFIED|Clerk#000000861|0|es: slyly regular pinto beans nod. blithely ir +48385|1430|F|258034.99|1994-09-19|3-MEDIUM|Clerk#000000324|0| detect along the blithely silent theodolites. brave +48386|139|O|136392.23|1998-06-25|5-LOW|Clerk#000000045|0|y unusual requests. even requests use slyly. blithel +48387|1360|F|266419.83|1992-03-14|2-HIGH|Clerk#000000819|0| alongside of the busy, bold i +48388|670|F|114196.27|1994-08-10|2-HIGH|Clerk#000000812|0|cial theodolites. furious +48389|329|O|212601.11|1997-02-17|1-URGENT|Clerk#000000348|0|e furiously regular theodolites. regul +48390|721|F|99573.11|1993-07-24|5-LOW|Clerk#000000118|0|lly regular asymptotes. quic +48391|1076|F|177040.39|1993-10-30|4-NOT SPECIFIED|Clerk#000000243|0| blithely pending theodolites boost accord +48416|905|F|17681.24|1994-07-07|4-NOT SPECIFIED|Clerk#000000647|0|he blithely silent instructions. express deposits agai +48417|310|O|7566.19|1997-12-24|1-URGENT|Clerk#000000326|0|dazzle slyly among the final, regular packages +48418|968|O|151138.77|1996-01-14|2-HIGH|Clerk#000000362|0| deposits boost carefully. furiously special packages boost fluffily thinly +48419|802|O|116679.13|1997-09-29|2-HIGH|Clerk#000000496|0| ironic foxes integrate across the pending i +48420|746|F|219292.01|1994-10-12|5-LOW|Clerk#000000651|0| the furiously pending requests doubt quickly unusual, blithe instructio +48421|392|F|116341.61|1993-04-18|5-LOW|Clerk#000000403|0| x-ray alongside of the furiously fi +48422|1453|O|203795.09|1998-04-01|1-URGENT|Clerk#000000066|0|the express accounts. +48423|773|F|97072.03|1992-11-01|2-HIGH|Clerk#000000330|0| after the pinto beans sleep at the ironic requests. carefully p +48448|1099|F|267297.28|1992-11-17|5-LOW|Clerk#000000624|0|uctions serve about the regular theodolites. +48449|991|P|61247.29|1995-03-22|1-URGENT|Clerk#000000808|0|iously unusual ideas-- fluffily pending instru +48450|215|O|173876.41|1997-04-30|1-URGENT|Clerk#000000581|0|s haggle slyly after the +48451|622|F|41158.34|1994-11-01|5-LOW|Clerk#000000537|0|osits. slyly express pinto beans detect slyly. +48452|947|F|265343.91|1993-10-10|2-HIGH|Clerk#000000976|0| cajole slyly. accounts around the furiously pen +48453|620|F|254619.49|1994-07-27|3-MEDIUM|Clerk#000000569|0|quickly blithely unusual dependencies. fluffily unusual instructions cajole. +48454|661|O|93972.92|1996-03-16|1-URGENT|Clerk#000000007|0|eodolites haggle blithely across the +48455|826|F|241973.60|1994-06-03|1-URGENT|Clerk#000000777|0|ously final theodolites. iro +48480|265|F|109802.70|1993-01-03|1-URGENT|Clerk#000000402|0|ut the theodolites. ironic foxes across the fluffily unusual +48481|289|O|244736.60|1998-04-09|5-LOW|Clerk#000000086|0|l, silent deposits cajole +48482|247|O|212252.01|1996-11-23|3-MEDIUM|Clerk#000000228|0| final accounts haggle sly dependencies. deposits dete +48483|424|F|392614.07|1994-12-11|1-URGENT|Clerk#000000378|0|nts. foxes haggle. blithely final packages shall are among t +48484|877|F|130201.11|1993-06-24|3-MEDIUM|Clerk#000000375|0| slyly furiously ironic pinto bean +48485|631|O|33301.67|1997-08-04|2-HIGH|Clerk#000000722|0|boost. furiously bold foxes maintain careful +48486|62|O|74942.85|1995-05-13|2-HIGH|Clerk#000000704|0|uctions. furiously special requests sleep slyly across the blit +48487|766|F|210890.14|1993-01-12|5-LOW|Clerk#000000276|0|furiously pending theodolites promise ironic accounts! blithely ev +48512|1022|O|112506.09|1995-08-04|4-NOT SPECIFIED|Clerk#000000623|0|fily regular ideas along the carefully unusua +48513|1036|O|123801.11|1995-11-18|2-HIGH|Clerk#000000261|0|ng dolphins cajole a +48514|959|O|102067.10|1995-08-30|2-HIGH|Clerk#000000451|0|ously pending requests along the qu +48515|256|O|174294.45|1995-12-21|1-URGENT|Clerk#000000500|0|lar theodolites. furiously unusual packages after the furiously regular dep +48516|634|O|215999.38|1997-12-03|2-HIGH|Clerk#000000824|0|inal foxes. unusual accounts are quickly regular pi +48517|727|F|12273.13|1993-03-15|5-LOW|Clerk#000000982|0|er the carefully reg +48518|340|F|273598.29|1994-04-03|3-MEDIUM|Clerk#000000742|0|ggle blithely. quickly final foxes against the ironic, regu +48519|862|O|235107.55|1998-03-02|1-URGENT|Clerk#000000939|0|sleep furiously. carefully regular dolphins cajole about the +48544|427|P|191454.48|1995-05-17|2-HIGH|Clerk#000000686|0|e pinto beans wake. furious fox +48545|1262|O|200763.84|1997-12-18|3-MEDIUM|Clerk#000000865|0| the furiously bold excuses. carefu +48546|1376|F|84622.61|1992-05-16|3-MEDIUM|Clerk#000000416|0|uickly regular warhorses. as +48547|413|F|58492.76|1994-02-09|4-NOT SPECIFIED|Clerk#000000017|0|ven instructions. ironic theodolites boost fluffily. packages nod +48548|1120|P|233831.94|1995-03-27|1-URGENT|Clerk#000000709|0|ed to promise according to the dependencies. blithely bold deposits boos +48549|898|O|155084.41|1997-02-25|4-NOT SPECIFIED|Clerk#000000311|0|ccording to the carefully pending deposits use about the furiousl +48550|1370|O|3182.79|1996-09-08|5-LOW|Clerk#000000533|0|hely ruthless platelets haggle quickly slyly express ideas. bold, expr +48551|874|F|109819.23|1993-02-11|3-MEDIUM|Clerk#000000429|0|e regular asymptotes? ir +48576|1235|F|209301.25|1992-12-02|4-NOT SPECIFIED|Clerk#000000065|0|across the theodolites x-ray across the slyly express accounts. +48577|787|F|241920.61|1992-07-09|3-MEDIUM|Clerk#000000006|0|lly bold theodolites run silent, regular ideas. even, ironic deposits x-ray +48578|778|O|17648.36|1995-08-30|2-HIGH|Clerk#000000198|0|cing requests-- furiously ironic deposit +48579|421|O|98546.61|1996-10-13|1-URGENT|Clerk#000000085|0|to the blithely brave dolphins. careful +48580|368|F|18063.77|1993-12-28|3-MEDIUM|Clerk#000000184|0|, bold requests cajole bold, unusual packag +48581|1393|F|170690.61|1992-10-24|3-MEDIUM|Clerk#000000889|0|ajole slyly bold, unusua +48582|922|O|119745.95|1998-02-01|5-LOW|Clerk#000000136|0|usual patterns nod blithely final deposits. carefully ironic deposits +48583|754|O|185962.45|1998-03-05|3-MEDIUM|Clerk#000000484|0| pending attainments cajole. ideas thrash quickly along the idly reg +48608|832|F|299557.56|1993-08-25|3-MEDIUM|Clerk#000000381|0| about the furiously ironic packages. final platelets sleep. furious +48609|154|F|211804.06|1993-02-25|2-HIGH|Clerk#000000337|0| special excuses. furiously ir +48610|268|F|201451.82|1993-03-18|1-URGENT|Clerk#000000979|0|its. furiously unusual requests across the even, special pinto be +48611|1453|F|109641.15|1993-09-14|1-URGENT|Clerk#000000970|0|leep among the furious somas. furiously ironic accounts +48612|1468|F|34167.38|1992-07-01|2-HIGH|Clerk#000000372|0| the ironic, even requests. unusual, final excuses a +48613|107|O|134174.94|1996-06-20|2-HIGH|Clerk#000000097|0|ccounts. quickly final platelets was express +48614|697|F|103136.27|1992-06-01|1-URGENT|Clerk#000000349|0|ly unusual pinto beans. furiously regular accounts slee +48615|1078|F|170847.80|1992-12-04|5-LOW|Clerk#000000545|0|t have to integrate special requests. ironic, pending deposi +48640|730|O|90332.38|1996-01-28|5-LOW|Clerk#000000295|0| deposits sleep. fur +48641|782|O|75597.04|1995-12-06|2-HIGH|Clerk#000000809|0|s. quickly ironic requests wake against the fluffily regular pin +48642|239|F|252256.09|1993-02-02|2-HIGH|Clerk#000000319|0|tes are furiously even packages. pe +48643|41|F|316843.65|1992-10-19|3-MEDIUM|Clerk#000000980|0|pecial realms cajole careful +48644|340|O|227837.78|1997-01-13|4-NOT SPECIFIED|Clerk#000000453|0|ully ironic excuses. pending, r +48645|508|O|98342.84|1996-04-26|2-HIGH|Clerk#000000648|0|ual pinto beans. dolphins sleep slyly. quickly regular theodolites affix fur +48646|604|O|143755.32|1995-09-11|4-NOT SPECIFIED|Clerk#000000363|0|ccounts wake blithely. fluffily unusual multipliers run blithely according to +48647|419|F|107419.74|1992-03-16|4-NOT SPECIFIED|Clerk#000000897|0|s along the unusual, +48672|1129|F|314393.04|1992-12-27|2-HIGH|Clerk#000000585|0|nt packages boost furiously after the furiously u +48673|1042|F|72668.06|1992-04-27|4-NOT SPECIFIED|Clerk#000000476|0| instructions. theo +48674|598|O|191531.50|1996-01-10|1-URGENT|Clerk#000000641|0|al deposits. asymptotes along the special excuses sleep blithely dolphins. f +48675|224|F|96167.91|1992-07-11|3-MEDIUM|Clerk#000000210|0|structions haggle blithely; permanently even +48676|979|O|48027.37|1998-04-24|2-HIGH|Clerk#000000509|0|. slyly regular platelets wake after the even, re +48677|1027|O|160903.32|1996-08-12|2-HIGH|Clerk#000000385|0|bold escapades cajole blith +48678|1366|O|14735.82|1995-12-06|5-LOW|Clerk#000000283|0|carefully regular requests cajole +48679|1405|O|182992.41|1997-02-16|3-MEDIUM|Clerk#000000053|0|ong the dependencies. regular, regular deposits haggle b +48704|196|F|268523.95|1992-01-10|2-HIGH|Clerk#000000748|0|ependencies print furiously about the unusual, b +48705|19|O|74050.93|1996-03-17|5-LOW|Clerk#000000636|0|ove the regular, ironic ideas haggle enticingly accounts. furiously +48706|1465|F|74229.37|1992-10-31|5-LOW|Clerk#000000694|0|out the express pinto beans; quickly even packages +48707|1346|F|156202.35|1992-09-08|5-LOW|Clerk#000000649|0|uffily according to the slyly even f +48708|290|O|116796.13|1996-05-06|2-HIGH|Clerk#000000722|0|kages. deposits about the carefully ironi +48709|920|O|67058.02|1995-08-29|2-HIGH|Clerk#000000204|0|uriously; slyly bold theodolites against the quickly even ide +48710|1255|F|240806.84|1994-11-26|3-MEDIUM|Clerk#000000871|0| pending deposits. pending pinto +48711|710|O|130724.28|1997-04-14|3-MEDIUM|Clerk#000000878|0|c platelets serve carefully alongside of the blit +48736|79|O|8795.66|1997-03-27|5-LOW|Clerk#000000453|0|ding theodolites det +48737|709|O|93494.21|1996-03-11|4-NOT SPECIFIED|Clerk#000000629|0|press packages. fur +48738|1195|O|79705.02|1998-02-02|2-HIGH|Clerk#000000134|0|structions wake furiously caref +48739|7|O|105262.51|1997-08-30|1-URGENT|Clerk#000000834|0|sts. carefully bold platelets will nag. deposits detect regular packages. +48740|64|O|147342.28|1996-03-11|3-MEDIUM|Clerk#000000891|0|ously ironic gifts unwind carefully fluffily regular deposits. slyly bold +48741|721|O|294386.56|1997-07-04|3-MEDIUM|Clerk#000000628|0|fully bold requests print up the blithely ironic grouches. quickly ironic acc +48742|1370|F|211180.31|1992-04-18|4-NOT SPECIFIED|Clerk#000000580|0| slyly regular pinto beans. carefully special dependencies according t +48743|224|F|18824.22|1994-11-21|3-MEDIUM|Clerk#000000349|0|g theodolites wake. pending a +48768|1283|O|69466.55|1997-07-18|5-LOW|Clerk#000000525|0|counts. quietly final requests grow f +48769|142|O|130607.67|1995-10-06|1-URGENT|Clerk#000000892|0|iously. final accounts hagg +48770|1094|F|121177.40|1992-03-26|1-URGENT|Clerk#000000278|0| foxes cajole carefully slyly pending dependencie +48771|932|O|79876.16|1998-01-28|5-LOW|Clerk#000000165|0|e express, pending pinto beans. f +48772|1058|F|124171.08|1994-05-13|3-MEDIUM|Clerk#000000543|0|sts. theodolites use ironic requ +48773|64|F|152477.86|1994-01-16|3-MEDIUM|Clerk#000000007|0|s haggle silently above the p +48774|631|F|11498.47|1992-08-10|2-HIGH|Clerk#000000678|0|ccording to the regular, express theodolites. slyly regular reque +48775|70|F|142606.77|1994-09-07|5-LOW|Clerk#000000641|0|, final theodolites w +48800|743|F|213161.20|1993-10-23|4-NOT SPECIFIED|Clerk#000000882|0|ly unusual deposits. pendi +48801|508|F|178548.32|1992-10-14|2-HIGH|Clerk#000000148|0|lar ideas sleep slyly about the carefully fi +48802|1495|F|8044.03|1992-06-30|5-LOW|Clerk#000000557|0|gular requests. furiously regular platelets +48803|172|F|112278.10|1992-11-10|1-URGENT|Clerk#000000327|0| deposits according to the quickly regular instructions wake regular asymp +48804|1309|O|89383.17|1997-08-24|1-URGENT|Clerk#000000332|0|t around the fluffily +48805|1016|F|32147.97|1994-02-12|2-HIGH|Clerk#000000609|0|luffily bold packages. deposits run furiously regular foxes. c +48806|46|O|198886.70|1996-02-22|3-MEDIUM|Clerk#000000910|0|ts. asymptotes detect. even, regular dolphin +48807|508|F|80357.71|1992-05-12|2-HIGH|Clerk#000000120|0|ly regular instructions dazzle +48832|1288|F|22634.03|1993-05-06|2-HIGH|Clerk#000000648|0|uickly ironic deposits above the blithely +48833|556|O|95020.77|1996-02-15|5-LOW|Clerk#000000520|0|ic, regular requests print quickly behind the careful dolphins. +48834|1261|O|62518.55|1996-11-08|4-NOT SPECIFIED|Clerk#000000719|0|e busily final somas. regular theodolites nag. slyly +48835|128|F|79531.23|1993-01-24|4-NOT SPECIFIED|Clerk#000000019|0| even packages. furiously ironic dependencies toward t +48836|34|F|122261.90|1994-02-15|1-URGENT|Clerk#000000519|0| slyly alongside of th +48837|832|O|169589.20|1995-07-19|4-NOT SPECIFIED|Clerk#000000284|0|nst the slyly final packages sleep slyly after the pinto beans. bl +48838|796|O|126289.19|1996-06-14|3-MEDIUM|Clerk#000000847|0|er regular deposits. blithely +48839|568|F|100882.89|1993-07-11|1-URGENT|Clerk#000000856|0|n, unusual theodoli +48864|409|O|54758.53|1997-11-06|2-HIGH|Clerk#000000564|0|nic requests alongside of the regular platelets +48865|1162|F|190957.45|1993-10-26|1-URGENT|Clerk#000000688|0|unts are quickly. slyly f +48866|640|F|110960.05|1992-06-17|3-MEDIUM|Clerk#000000856|0|sly ironic foxes. bold requests hinder. regular instr +48867|1045|O|91972.23|1998-02-09|5-LOW|Clerk#000000081|0|ests boost slyly acro +48868|382|F|169049.46|1992-06-14|4-NOT SPECIFIED|Clerk#000000689|0|n sentiments by the fluffily even deposits sleep furiously ironic +48869|449|O|297665.92|1996-06-14|4-NOT SPECIFIED|Clerk#000000330|0|. ironic accounts poach carefully after the quietly +48870|68|O|161792.07|1996-04-25|2-HIGH|Clerk#000000930|0|deas. regular deposits cajole blithely express +48871|395|O|9825.64|1997-07-06|1-URGENT|Clerk#000000351|0|packages wake blithely. regular packages integrate slyly. regular +48896|913|F|37230.25|1994-10-29|1-URGENT|Clerk#000000361|0|o the slyly ironic deposits nod above the slyly regular +48897|1456|O|182880.57|1997-04-04|4-NOT SPECIFIED|Clerk#000000759|0|ld accounts haggle furiously above the s +48898|664|F|58246.73|1992-02-29|4-NOT SPECIFIED|Clerk#000000544|0|e. slyly pending packages wake carefully. final accounts +48899|898|F|240474.36|1995-01-19|2-HIGH|Clerk#000000441|0|. carefully bold instructi +48900|1063|F|205141.12|1994-03-23|4-NOT SPECIFIED|Clerk#000000248|0| requests sleep blithely after the regular request +48901|1487|O|289395.86|1997-12-02|1-URGENT|Clerk#000000381|0|g. blithely even gi +48902|424|F|39277.75|1992-10-24|3-MEDIUM|Clerk#000000611|0|uffily ironic patterns use. furiousl +48903|1463|F|42618.38|1994-11-12|1-URGENT|Clerk#000000402|0|totes haggle quickly slyly unusual dependencies. reg +48928|779|O|199290.88|1997-06-05|4-NOT SPECIFIED|Clerk#000000824|0|sly regular patterns will have to thrash slyly aga +48929|1085|F|294515.21|1994-10-23|2-HIGH|Clerk#000000687|0|express foxes about the even deposits nod after the +48930|277|O|290399.16|1996-02-02|3-MEDIUM|Clerk#000000985|0|er the final, even foxes. carefully enticing platelets wake! express, expr +48931|119|F|310925.86|1994-06-18|5-LOW|Clerk#000000556|0|the instructions ca +48932|1360|O|81996.33|1998-05-01|5-LOW|Clerk#000000778|0|structions. quiet, ironic requests haggle carefully re +48933|1030|F|15755.88|1992-02-29|2-HIGH|Clerk#000000285|0| packages! slyly final foxes solve carefully slyly regular accounts. +48934|511|O|111078.36|1997-04-11|5-LOW|Clerk#000000889|0|theodolites integrate re +48935|1484|F|324551.89|1993-01-08|5-LOW|Clerk#000000830|0|kages shall have to w +48960|1484|O|172023.24|1997-09-04|3-MEDIUM|Clerk#000000198|0|sts boost blithely against the slyly pending requests. slyly thin acc +48961|637|F|217946.24|1994-07-22|4-NOT SPECIFIED|Clerk#000000791|0|ons serve carefully slyly special instructions. regular frays haggle along +48962|307|O|315531.57|1998-01-26|5-LOW|Clerk#000000538|0|ncies haggle. special packages haggle und +48963|1412|F|173435.65|1993-10-20|4-NOT SPECIFIED|Clerk#000000239|0|ogs haggle under the blithely final asymptotes. furiously bold packages affix +48964|1123|O|104548.09|1996-07-24|1-URGENT|Clerk#000000731|0|lyly. slyly bold instruc +48965|695|F|134013.32|1993-03-25|1-URGENT|Clerk#000000586|0|ularly regular attainments. bold dolphins sublate carefully blithely bol +48966|619|F|9264.42|1993-06-13|2-HIGH|Clerk#000000991|0|inal packages breach quickly express accounts. slyly +48967|718|F|33138.84|1992-02-11|3-MEDIUM|Clerk#000000370|0| doze slyly. slowly brave r +48992|557|O|43938.06|1996-02-11|4-NOT SPECIFIED|Clerk#000000139|0|fily furious ideas boost. unusual, even packages +48993|1259|F|108598.38|1992-06-01|5-LOW|Clerk#000000732|0|unusual accounts boost. slyly quick foxes integrate qui +48994|874|F|90132.85|1993-10-23|4-NOT SPECIFIED|Clerk#000000900|0|pinto beans; stealthy requests wak +48995|1073|O|227357.20|1997-01-21|5-LOW|Clerk#000000208|0|until the deposits. furious requests cajole toward +48996|205|O|40945.70|1995-07-01|3-MEDIUM|Clerk#000000695|0|al packages. furious +48997|865|F|61615.38|1994-07-08|5-LOW|Clerk#000000851|0|ns. regular ideas haggle furiously. slyly regular requests dazzle +48998|155|F|329964.36|1994-02-17|5-LOW|Clerk#000000786|0|usual instructions. furiously ironi +48999|922|O|82242.17|1996-08-23|3-MEDIUM|Clerk#000000818|0|edly to the furiously +49024|1189|O|44815.25|1997-10-20|5-LOW|Clerk#000000006|0|ickly special dependencies nag blithely. quickly regular ideas are. +49025|103|F|91656.00|1992-06-17|5-LOW|Clerk#000000401|0|lar, ironic packages across the carefully regular +49026|676|F|35082.85|1995-03-08|5-LOW|Clerk#000000880|0|run carefully regular ideas. speci +49027|247|P|148735.58|1995-04-12|2-HIGH|Clerk#000000784|0|l deposits believe quickly slyly silent instructions. blithely regular pa +49028|640|O|29426.32|1996-12-06|1-URGENT|Clerk#000000012|0| ironic pinto beans after the furiously final pains nag qui +49029|1208|F|62603.27|1992-05-21|2-HIGH|Clerk#000000767|0|onic dugouts. furiously even packages above the furiously ironic ideas nag bli +49030|709|O|114153.88|1998-01-25|1-URGENT|Clerk#000000344|0|ughout the silent, bold pint +49031|958|O|118802.27|1997-06-18|5-LOW|Clerk#000000004|0|ckages. slyly bold requests sleep slyly slyly express deposits +49056|652|F|225090.12|1994-10-02|2-HIGH|Clerk#000000514|0|y ironic hockey playe +49057|1276|O|107813.12|1996-12-26|2-HIGH|Clerk#000000209|0|usual foxes. furiously bold requests us +49058|1450|F|9117.76|1993-01-11|2-HIGH|Clerk#000000560|0|ites haggle slyly according to the +49059|1351|F|309947.29|1994-09-21|3-MEDIUM|Clerk#000000943|0|nic dependencies run. theodolites sleep qui +49060|794|O|30455.49|1998-06-22|3-MEDIUM|Clerk#000000914|0|ites engage slyly. regular pinto beans detect quickly +49061|1213|O|177429.92|1996-09-04|5-LOW|Clerk#000000922|0|beans against the final dependencies engage across the dependencie +49062|98|F|222370.13|1992-04-12|5-LOW|Clerk#000000931|0|inst the final foxes haggle boldly pending packages. quick +49063|1081|O|268108.46|1996-12-31|5-LOW|Clerk#000000633|0|lithely regular deposits cajole furiously slyly fluffy deposits. brave acc +49088|937|F|260587.89|1994-09-24|1-URGENT|Clerk#000000680|0|uctions nag slyly. platelets ab +49089|775|F|111468.99|1993-05-29|1-URGENT|Clerk#000000956|0|the final, even excuses h +49090|92|O|108380.43|1997-03-29|5-LOW|Clerk#000000267|0| carefully regular theodolites cajole. unusual, bold i +49091|820|O|175303.08|1996-06-07|5-LOW|Clerk#000000823|0|ly regular platelets. slowly silent accounts +49092|1238|O|281381.63|1997-11-05|4-NOT SPECIFIED|Clerk#000000774|0|nst the regular escapades wake amo +49093|1427|O|56128.02|1998-07-28|5-LOW|Clerk#000000203|0|s maintain slyly silent ideas: furiously final theodolites us +49094|820|F|144417.60|1992-09-04|1-URGENT|Clerk#000000001|0|iously regular pinto beans. regular requests use fl +49095|1364|O|209296.32|1997-05-16|5-LOW|Clerk#000000818|0|e special ideas. regular, unusual accounts wake. final instructions haggle +49120|631|O|1547.81|1996-08-07|5-LOW|Clerk#000000389|0|t the pending, final deposits are across the final +49121|1436|F|60407.76|1992-12-06|4-NOT SPECIFIED|Clerk#000000621|0|yly express requests across the slyly regular excuses poach carefull +49122|443|O|79320.82|1996-07-10|5-LOW|Clerk#000000226|0| carefully stealthy dep +49123|1153|F|97544.83|1994-02-26|2-HIGH|Clerk#000000023|0|ly ironic deposits detect. regul +49124|397|O|146795.48|1996-12-29|1-URGENT|Clerk#000000165|0|y! ironic accounts nag permanently! quickly bold instructions use p +49125|1186|F|182177.29|1994-03-30|4-NOT SPECIFIED|Clerk#000000468|0|ously express warhorses. slyly final foxes above the final, final +49126|1465|O|134100.82|1995-07-11|5-LOW|Clerk#000000344|0|. final, special foxes cajole. blithely u +49127|1021|P|60609.79|1995-03-31|3-MEDIUM|Clerk#000000536|0|e slyly special deposi +49152|73|O|199449.48|1997-08-19|3-MEDIUM|Clerk#000000065|0|heodolites: excuses a +49153|118|F|40692.58|1992-07-29|3-MEDIUM|Clerk#000000667|0|cuses. busily ironic theodolites cajole. slyly silent dolphins a +49154|220|F|236472.06|1994-03-07|3-MEDIUM|Clerk#000000524|0|riously ironic packages boost fluffily after the ironic, even accounts. blith +49155|1283|F|219008.31|1993-09-19|5-LOW|Clerk#000000905|0| are carefully around the furiously final requests. +49156|616|F|84087.47|1994-09-09|2-HIGH|Clerk#000000319|0|e of the bravely regu +49157|944|O|66342.98|1996-02-24|3-MEDIUM|Clerk#000000101|0|ounts against the quickly special hockey players cajole carefully care +49158|721|F|20221.66|1992-06-28|4-NOT SPECIFIED|Clerk#000000509|0|deposits. deposits doubt. bold, final foxes haggle blithely. furiously reg +49159|1231|O|279387.86|1997-09-15|2-HIGH|Clerk#000000892|0|n Tiresias. thinly regular dependenc +49184|502|F|117489.45|1995-03-02|2-HIGH|Clerk#000000326|0|ans wake around the carefully bold packages. fluffily final excuses wak +49185|338|O|184769.69|1996-01-20|3-MEDIUM|Clerk#000000340|0|he furiously pending requests. even platelets accordin +49186|751|O|107577.57|1997-07-28|2-HIGH|Clerk#000000303|0|press pinto beans. slyly final theodolites boost after the furiously expr +49187|1330|O|239517.62|1997-07-17|5-LOW|Clerk#000000449|0| are quickly up the carefully r +49188|700|O|223403.81|1995-06-23|2-HIGH|Clerk#000000237|0| final deposits. quick accounts sleep fluffily around the regularly sp +49189|1034|F|124988.92|1995-01-16|1-URGENT|Clerk#000000731|0|ly regular pinto beans sleep thinly slyly daring instructions. b +49190|1495|F|160005.16|1992-12-12|2-HIGH|Clerk#000000563|0|the regular accounts. final, unusual depo +49191|988|O|208530.45|1996-12-26|4-NOT SPECIFIED|Clerk#000000953|0|iously ironic depths. fluffily quiet th +49216|739|F|152574.41|1994-03-20|2-HIGH|Clerk#000000283|0|s. carefully express packages cajole blithely. care +49217|1327|F|141596.32|1993-07-05|3-MEDIUM|Clerk#000000040|0|ost blithely. regular accounts integrate s +49218|874|F|96098.21|1993-06-05|5-LOW|Clerk#000000302|0|asymptotes. blithely even pint +49219|923|O|178489.07|1996-08-31|2-HIGH|Clerk#000000542|0|sleep blithely furiously final dependenc +49220|1202|O|119305.95|1995-08-14|1-URGENT|Clerk#000000525|0|excuses. slyly regular packages +49221|1090|F|171034.05|1993-07-04|4-NOT SPECIFIED|Clerk#000000052|0|ously express platelets. quickly regular accounts impress. regular +49222|590|O|70503.61|1998-04-24|1-URGENT|Clerk#000000750|0|instructions; carefully final grouches detect slyly blith +49223|862|O|70727.93|1995-10-03|3-MEDIUM|Clerk#000000911|0|. patterns wake furiously; blithely pending requests about +49248|355|F|6884.69|1992-07-24|3-MEDIUM|Clerk#000000883|0|l deposits sleep carefully furiously final theodolites. regular ideas m +49249|1334|O|212707.50|1997-11-14|2-HIGH|Clerk#000000655|0|symptotes wake quickly about +49250|1468|O|57959.14|1996-04-22|2-HIGH|Clerk#000000429|0|ly bold foxes. even, ironic packages nag express, expr +49251|752|F|231202.51|1993-11-23|1-URGENT|Clerk#000000401|0|o beans cajole furiously +49252|1066|F|116592.79|1994-12-10|3-MEDIUM|Clerk#000000858|0|ven, ironic packages sublate furiously. carefull +49253|187|F|224617.33|1994-05-03|1-URGENT|Clerk#000000702|0|hely along the blithely regular pac +49254|23|O|67702.22|1997-12-14|2-HIGH|Clerk#000000166|0|lly final excuses. carefully dogged acc +49255|332|F|225208.80|1992-06-23|2-HIGH|Clerk#000000544|0|ve. slyly regular theodolites wak +49280|139|P|203153.27|1995-04-30|4-NOT SPECIFIED|Clerk#000000371|0|s even packages boost carefully. iron +49281|961|F|104727.96|1995-02-05|1-URGENT|Clerk#000000619|0| carefully even theodolites dazzle carefully ca +49282|430|O|76417.36|1995-07-13|2-HIGH|Clerk#000000723|0|ns. furiously ironic instructions according to the +49283|370|F|138992.73|1994-12-12|2-HIGH|Clerk#000000677|0|longside of the bold, express accounts. patte +49284|823|F|257016.93|1994-01-03|4-NOT SPECIFIED|Clerk#000000222|0|gular packages cajole after +49285|217|O|160108.47|1997-05-25|5-LOW|Clerk#000000707|0|ingly even braids. pending accounts haggle slyly ironic deposits. carefully f +49286|737|O|258733.89|1997-03-31|1-URGENT|Clerk#000000831|0|inal deposits. stealthy, regular packages h +49287|1331|F|234003.07|1994-05-20|1-URGENT|Clerk#000000078|0|ronic requests are blithely carefully caref +49312|166|F|279660.92|1995-02-22|1-URGENT|Clerk#000000097|0|uffily unusual deposits eat blithely alongside of the p +49313|583|F|92250.30|1994-10-05|3-MEDIUM|Clerk#000000543|0|es haggle after the furiously enticing deposits. final, +49314|1420|O|248393.00|1996-01-13|4-NOT SPECIFIED|Clerk#000000896|0|n requests. package +49315|1300|O|183070.68|1998-04-26|1-URGENT|Clerk#000000756|0|hogs about the furiously even notorn +49316|424|O|34713.06|1996-03-09|3-MEDIUM|Clerk#000000423|0|ep regular courts. carefully express theodolites after the carefu +49317|1247|O|315123.90|1998-05-05|2-HIGH|Clerk#000000466|0|ording to the special ideas lose fluffily +49318|854|O|68945.06|1997-10-02|4-NOT SPECIFIED|Clerk#000000551|0|e slyly regular asymptot +49319|217|O|186080.27|1995-08-26|5-LOW|Clerk#000000402|0| special, special deposits sleep special deposits. blithely bold requests hagg +49344|571|F|155905.80|1992-12-31|5-LOW|Clerk#000000085|0| cajole slyly regular theodolites. slyly ironic platelets cajole blithely +49345|31|F|95198.55|1992-04-23|2-HIGH|Clerk#000000604|0|e quickly stealthy deposits. final accounts wake. slowly final pl +49346|107|P|141266.90|1995-05-06|4-NOT SPECIFIED|Clerk#000000619|0|deas sleep along the quickly regular ideas. fluffily regular accounts ab +49347|1417|F|94492.23|1995-01-11|3-MEDIUM|Clerk#000000837|0|finally even accounts. express requests wake pen +49348|46|O|274742.02|1997-03-15|1-URGENT|Clerk#000000189|0|counts. fluffily ironic foxes haggle reque +49349|1354|O|153447.44|1995-06-02|2-HIGH|Clerk#000000712|0|bout the express, silent th +49350|1471|F|104340.03|1992-08-23|2-HIGH|Clerk#000000735|0|packages sleep carefully around the silent braids. furiously +49351|151|F|159194.86|1992-03-31|5-LOW|Clerk#000000487|0| final requests after the ev +49376|1021|O|279519.79|1997-06-16|5-LOW|Clerk#000000118|0|kly ironic deposits lose blithe +49377|107|F|80828.21|1993-02-19|4-NOT SPECIFIED|Clerk#000000175|0|as print slyly ruthles +49378|940|O|97140.38|1996-07-12|3-MEDIUM|Clerk#000000462|0|ons. carefully bold acc +49379|1028|O|187794.04|1996-08-11|1-URGENT|Clerk#000000374|0|ts wake after the quickly even ideas. fluffily ex +49380|1270|F|95601.59|1992-05-05|3-MEDIUM|Clerk#000000191|0| requests wake slyly. blithely pending ideas use carefully after the +49381|271|F|88831.45|1992-12-14|4-NOT SPECIFIED|Clerk#000000781|0|ly express deposits haggle foxes. slyly even deposits are. quickly ev +49382|725|O|84305.77|1996-02-29|2-HIGH|Clerk#000000001|0|nst the furiously pending packages. bold, unusual +49383|91|O|228610.09|1997-11-04|3-MEDIUM|Clerk#000000880|0|ular ideas sleep furiously slyly ironic packages. +49408|784|O|157312.01|1998-06-22|3-MEDIUM|Clerk#000000639|0|r foxes are-- deposits nag arou +49409|1385|O|253106.88|1995-08-17|2-HIGH|Clerk#000000655|0|inal, unusual pinto beans boost beyond the slyly final platelets. deposits +49410|1336|F|97416.73|1993-09-12|1-URGENT|Clerk#000000248|0| packages haggle quickly. finally special c +49411|481|F|51959.99|1994-11-25|2-HIGH|Clerk#000000886|0|ecial packages. blithe +49412|724|F|98846.33|1994-03-08|1-URGENT|Clerk#000000338|0|y blithely final deposits. ideas along the carefully i +49413|986|O|148400.61|1998-04-14|1-URGENT|Clerk#000000760|0|regular foxes wake blithely ironic instructions +49414|88|O|30604.62|1995-08-20|2-HIGH|Clerk#000000042|0| dogged platelets along the fluffily bold ideas sleep qui +49415|299|O|201575.17|1998-05-16|5-LOW|Clerk#000000483|0|deposits. unusual r +49440|449|O|223732.30|1997-03-09|2-HIGH|Clerk#000000081|0|usly bold courts at the quickly ironic packages affix slyly according +49441|1126|F|141988.84|1994-09-28|3-MEDIUM|Clerk#000000438|0|entiments atop the deposits haggle quickly fur +49442|550|F|169070.80|1992-08-10|2-HIGH|Clerk#000000890|0|n platelets. blithely even accounts +49443|1067|F|171035.55|1995-01-24|2-HIGH|Clerk#000000780|0|e. regular theodolites affix. even deposi +49444|118|O|226554.55|1997-01-23|2-HIGH|Clerk#000000814|0|s. quickly bold packages integrate. furio +49445|950|O|206141.06|1998-03-07|1-URGENT|Clerk#000000120|0|uthlessly above the ste +49446|937|O|104909.67|1997-09-28|1-URGENT|Clerk#000000050|0| regular packages wake. blithely regul +49447|877|O|162538.47|1996-07-08|2-HIGH|Clerk#000000503|0|ts cajole carefully carefull +49472|1255|F|163151.63|1993-07-17|5-LOW|Clerk#000000468|0|along the slyly unusual packages. caref +49473|1300|O|359406.02|1997-08-23|1-URGENT|Clerk#000000472|0|c packages. blithely bold courts ab +49474|43|O|98942.08|1997-11-03|2-HIGH|Clerk#000000255|0|c deposits cajole between the +49475|569|O|89189.60|1997-05-21|3-MEDIUM|Clerk#000000230|0|ully silent requests nag carefully ironi +49476|1243|O|267340.82|1997-10-10|4-NOT SPECIFIED|Clerk#000000925|0|uctions. furiously special dolphins ar +49477|826|O|179951.57|1995-11-30|3-MEDIUM|Clerk#000000211|0|ounts boost carefully fluffily special dependencies. +49478|1174|O|75936.37|1998-01-29|5-LOW|Clerk#000000836|0|fluffily pending requests. slyly pending deposits sleep. furiously silent +49479|91|O|264573.15|1995-07-28|3-MEDIUM|Clerk#000000466|0|gular requests. furiously regular requests use after the fi +49504|614|F|63497.74|1994-11-17|4-NOT SPECIFIED|Clerk#000000061|0|slyly bold packages. slyly special accounts cajole blithely. +49505|1222|F|213420.60|1994-01-22|1-URGENT|Clerk#000000289|0|ages integrate. sly +49506|10|O|152699.84|1997-04-26|1-URGENT|Clerk#000000497|0|express theodolites about +49507|157|O|126368.42|1997-10-22|5-LOW|Clerk#000000539|0|even packages boost. final packages use according to t +49508|817|O|250894.96|1998-07-04|2-HIGH|Clerk#000000796|0| requests. blithely unusual sauternes +49509|1388|O|67583.53|1995-06-05|1-URGENT|Clerk#000000791|0|cuses. furiously final sentiments cajole blithely. furiously bold requests poa +49510|1351|F|121045.92|1992-03-21|1-URGENT|Clerk#000000449|0|ithely pending excuses use slyly across the furiously silent +49511|881|F|140320.50|1994-04-21|2-HIGH|Clerk#000000046|0|gular theodolites affix slyly regular dependencies. carefully +49536|1277|O|49495.78|1995-11-24|2-HIGH|Clerk#000000837|0|y express deposits against the asymptotes nag furio +49537|229|F|33108.19|1995-03-07|2-HIGH|Clerk#000000159|0|are quickly regular pinto be +49538|898|F|104582.72|1993-03-18|5-LOW|Clerk#000000710|0| carefully according to the blithely silent excu +49539|218|F|127541.57|1993-04-01|3-MEDIUM|Clerk#000000690|0|egular ideas. special packages use. blit +49540|550|O|171592.26|1997-09-15|4-NOT SPECIFIED|Clerk#000000369|0| packages unwind closely. pending platelets sleep furiou +49541|455|F|34511.34|1994-01-17|3-MEDIUM|Clerk#000000140|0|ggle blithely: furiously quick theodolites about the a +49542|850|F|61587.92|1993-08-12|3-MEDIUM|Clerk#000000367|0|: slyly ironic accounts wake. carefully even theodolites +49543|392|F|95672.28|1992-01-15|4-NOT SPECIFIED|Clerk#000000523|0|ng the blithely final instructions. even ideas haggle slyly acro +49568|508|O|63616.83|1997-02-27|3-MEDIUM|Clerk#000000243|0|nal packages. carefully unusual asymptotes eat carefully. quickly eve +49569|1142|F|259255.86|1994-06-22|4-NOT SPECIFIED|Clerk#000000090|0|. regular, even platelets are slyly furiously ruth +49570|1012|F|61103.64|1994-06-30|1-URGENT|Clerk#000000425|0|slyly idle grouches +49571|487|O|124930.33|1996-10-11|1-URGENT|Clerk#000000631|0|. fluffily slow deposits wake doggedly re +49572|1219|O|35169.99|1997-01-11|2-HIGH|Clerk#000000638|0|lyly final theodolites. slyly express foxes are around the special accounts! +49573|883|O|19915.06|1997-12-25|1-URGENT|Clerk#000000337|0|lyly ironic accounts haggle slyly final requests. final pinto beans detect +49574|1408|O|119393.12|1997-12-10|5-LOW|Clerk#000000141|0|c accounts are blithely. ru +49575|58|F|278846.78|1993-12-17|2-HIGH|Clerk#000000607|0|g carefully across the bold packages. bold packages sleep against the +49600|1294|P|124037.71|1995-03-08|5-LOW|Clerk#000000097|0|aves nag busily bold courts. even packages use slyly. slyly f +49601|1147|F|158997.11|1995-01-27|5-LOW|Clerk#000000149|0|r the regular requests. special deposits use: fluff +49602|1427|F|234732.32|1992-03-09|4-NOT SPECIFIED|Clerk#000000412|0|en platelets wake never along the blithely even accounts. quickly even packa +49603|809|O|190204.24|1995-11-05|5-LOW|Clerk#000000357|0|uriously ironic courts: carefully regular packages wake +49604|1036|O|63964.15|1997-02-04|3-MEDIUM|Clerk#000000591|0|l requests. slyly regula +49605|1369|O|207734.49|1998-02-21|5-LOW|Clerk#000000780|0|arefully special accounts believe against the quickly final foxes. pack +49606|1345|F|39258.13|1993-10-30|1-URGENT|Clerk#000000668|0|e quickly silent pinto beans poach carefully slyly ev +49607|721|F|69679.83|1994-05-05|3-MEDIUM|Clerk#000000698|0|gular patterns affix slyly unusual requests. carefully thin excuses n +49632|1165|F|175607.30|1992-11-26|1-URGENT|Clerk#000000049|0|according to the even pinto beans. carefully final foxes affix about +49633|530|F|276226.39|1993-02-04|1-URGENT|Clerk#000000736|0|lar deposits doubt enticingly after the quietly +49634|808|F|248472.83|1992-03-24|4-NOT SPECIFIED|Clerk#000000167|0|ic asymptotes integrate furiously regul +49635|799|F|138170.86|1993-04-12|5-LOW|Clerk#000000024|0|sly bold deposits-- ironic deposits amon +49636|1258|F|233084.77|1992-12-22|2-HIGH|Clerk#000000985|0|y. ironic packages nod carefully furiously even packages. silently regula +49637|505|F|39669.16|1992-06-13|3-MEDIUM|Clerk#000000631|0| the regular, quiet instructions wake fluffily after the special d +49638|121|F|261064.01|1993-08-08|3-MEDIUM|Clerk#000000066|0|ts. slyly special platelets cajole furi +49639|1009|F|48404.07|1993-10-23|2-HIGH|Clerk#000000831|0|g furiously across t +49664|1189|F|181990.14|1994-03-20|1-URGENT|Clerk#000000193|0|tect carefully final deposits. blithely pending requests boost carefully ab +49665|1385|O|219422.99|1996-03-24|2-HIGH|Clerk#000000772|0|y even ideas are. packa +49666|142|F|148993.75|1994-08-07|5-LOW|Clerk#000000402|0|foxes? blithely regular deposits are carefully +49667|691|O|270258.30|1996-07-26|4-NOT SPECIFIED|Clerk#000000396|0|al accounts boost. pendi +49668|839|F|34657.54|1994-12-03|5-LOW|Clerk#000000151|0|egular requests: carefully even pin +49669|1378|O|157275.81|1998-06-03|3-MEDIUM|Clerk#000000015|0|lar requests haggle whithout t +49670|1345|O|150822.75|1997-02-26|1-URGENT|Clerk#000000040|0|ckages cajole about the platelets. silent theodolites d +49671|94|O|41714.17|1996-11-26|1-URGENT|Clerk#000000313|0|thely unusual packages nag blithely thinly final +49696|208|O|266710.24|1998-05-04|2-HIGH|Clerk#000000204|0| solve slyly. furiously specia +49697|232|O|127033.47|1996-11-09|5-LOW|Clerk#000000537|0|quickly express packages might integrate slyly regularly pending +49698|109|O|234860.45|1997-11-12|5-LOW|Clerk#000000483|0|ts. final dolphins sleep carefully carefully regular requests. iron +49699|976|O|163368.57|1996-01-14|3-MEDIUM|Clerk#000000210|0|posits are furiously. ideas +49700|391|O|219467.12|1996-07-31|1-URGENT|Clerk#000000270|0|olites. pinto beans cajole quickly. special requests wake. orbits wak +49701|1222|O|67537.31|1996-05-18|5-LOW|Clerk#000000430|0|sy foxes-- slyly express asymptotes eat. final, r +49702|1202|O|216847.74|1996-11-10|3-MEDIUM|Clerk#000000921|0|osits. carefully express foxes believe blithel +49703|412|O|142808.02|1998-05-05|3-MEDIUM|Clerk#000000745|0|refully special foxes haggle slyly. carefully regular +49728|569|O|11129.48|1998-06-02|2-HIGH|Clerk#000000279|0|ccounts affix across the platelets. fluffily even requests haggle. perman +49729|130|O|30182.60|1996-02-19|5-LOW|Clerk#000000218|0|cording to the pending, express dolphins. fluffily i +49730|347|F|30095.80|1994-01-05|2-HIGH|Clerk#000000868|0|even accounts. final foxes haggle quickly fluffily final depos +49731|421|F|70513.65|1994-11-02|2-HIGH|Clerk#000000314|0|ronic requests: ironic requests among the unusual excuses cajole quickly whit +49732|23|F|151484.84|1993-09-22|2-HIGH|Clerk#000000149|0|g to the express deposits +49733|1090|O|102724.63|1996-12-22|5-LOW|Clerk#000000526|0| realms wake about the quickly unusual ideas. regular excuses are ab +49734|409|F|151190.52|1995-01-24|4-NOT SPECIFIED|Clerk#000000659|0|ding deposits across the quickly final platelets lose dolphins. even +49735|1478|F|203577.54|1994-09-24|4-NOT SPECIFIED|Clerk#000000493|0|ironic packages across the acco +49760|1282|O|132391.12|1995-10-02|3-MEDIUM|Clerk#000000431|0|ccounts sleep. furious accounts use thinly quickly express asymptotes: c +49761|1420|F|310767.11|1995-01-25|4-NOT SPECIFIED|Clerk#000000070|0| the quickly express accounts. unusual accounts sublate carefully silent p +49762|404|O|49430.11|1995-06-16|2-HIGH|Clerk#000000394|0|beans. daringly even packages s +49763|1157|F|163992.85|1995-02-14|1-URGENT|Clerk#000000522|0|quickly regular deposits are fluffily. carefully regula +49764|692|F|94412.40|1993-10-04|5-LOW|Clerk#000000673|0|ests cajole. never ironic instruct +49765|874|F|128173.32|1993-10-06|3-MEDIUM|Clerk#000000515|0|nic, special requests +49766|517|O|32358.37|1996-01-22|5-LOW|Clerk#000000566|0|icing ideas across the carefully special packages lose across the furiousl +49767|1441|F|168280.71|1993-11-09|1-URGENT|Clerk#000000223|0| to the even dolphins-- sl +49792|272|O|49339.59|1997-09-20|2-HIGH|Clerk#000000766|0|its. blithely quick deposits are n +49793|1222|F|22450.70|1994-02-19|4-NOT SPECIFIED|Clerk#000000534|0|ut the quickly regular asymptotes wake above the carefully pending de +49794|1421|O|26032.82|1995-09-16|5-LOW|Clerk#000000990|0|ions wake carefully alongside of the sentiments. reg +49795|28|O|84232.85|1998-04-08|3-MEDIUM|Clerk#000000539|0|ending deposits. pending requests haggle quickly. slyly final accou +49796|79|O|40523.16|1998-02-01|5-LOW|Clerk#000000862|0|blithely along the pending deposits. regular requests +49797|877|P|113167.17|1995-03-09|4-NOT SPECIFIED|Clerk#000000771|0|d platelets cajole above the careful +49798|1492|F|208016.00|1992-12-09|1-URGENT|Clerk#000000524|0|bout the final platelets are +49799|79|F|306063.68|1994-08-25|2-HIGH|Clerk#000000095|0|s wake furiously according to the fluffily final accounts. fluffily reg +49824|1267|F|122701.20|1995-03-23|2-HIGH|Clerk#000000858|0|ully bold foxes. carefully special instructions cajo +49825|517|F|36065.51|1994-01-07|4-NOT SPECIFIED|Clerk#000000760|0|times regular courts print furiously according to the dependencies. unusua +49826|536|O|160677.39|1996-08-06|3-MEDIUM|Clerk#000000226|0|thely ironic packages. bold requests according to the regular accounts wak +49827|271|F|65099.41|1992-07-29|4-NOT SPECIFIED|Clerk#000000843|0|ages integrate carefully slyly pending pinto beans. furiously regular request +49828|212|O|109986.56|1995-08-31|3-MEDIUM|Clerk#000000572|0|o beans; theodolites detect fluffily against the carefully express accounts. +49829|875|O|155994.48|1996-11-25|1-URGENT|Clerk#000000492|0|. carefully express theodolit +49830|400|F|198341.12|1994-07-10|1-URGENT|Clerk#000000044|0|tes boost quickly packages. i +49831|820|F|87376.59|1993-08-24|1-URGENT|Clerk#000000011|0|usual, even instructions nag carefully. slyly bol +49856|1078|O|68857.99|1998-06-08|3-MEDIUM|Clerk#000000634|0|ly ironic dependencies. blithely express platelets promise care +49857|22|O|162522.13|1997-03-04|1-URGENT|Clerk#000000157|0|nstructions. slyly bold deposits against +49858|334|F|170024.67|1993-05-05|5-LOW|Clerk#000000717|0|ages against the blithely final pinto beans wake +49859|434|O|239756.71|1996-05-02|3-MEDIUM|Clerk#000000700|0|uickly even accounts nag blithely. bold, regular packages against the blith +49860|430|O|172654.58|1996-06-22|5-LOW|Clerk#000000987|0|oss the carefully pending +49861|1133|F|302569.75|1994-06-13|2-HIGH|Clerk#000000906|0|refully against the quickly unusual requests. slyly brave excus +49862|929|F|90394.71|1992-09-13|4-NOT SPECIFIED|Clerk#000000520|0|ages thrash sometimes. even, ironic de +49863|1198|O|244928.68|1996-06-09|5-LOW|Clerk#000000686|0|efully finally ironic accounts. express, unusual pinto beans will have to hagg +49888|593|O|60895.06|1998-02-01|5-LOW|Clerk#000000470|0|gularly even foxes. quickly final p +49889|1426|F|129740.04|1992-12-13|1-URGENT|Clerk#000000557|0|counts affix slyly. quickly regular frets w +49890|1432|F|98510.37|1992-04-09|1-URGENT|Clerk#000000936|0|sts are. pinto beans a +49891|1399|F|252391.81|1994-09-13|4-NOT SPECIFIED|Clerk#000000427|0|boost pending foxes. quickly regular theodolites haggle quickl +49892|346|F|68202.60|1995-02-11|5-LOW|Clerk#000000418|0|vely across the requests. slyly +49893|1183|O|59749.65|1997-01-15|4-NOT SPECIFIED|Clerk#000000652|0|ake fluffily unusual accounts. furio +49894|1210|O|297453.94|1997-05-10|4-NOT SPECIFIED|Clerk#000000161|0|ly final deposits. +49895|931|F|5446.69|1993-11-09|2-HIGH|Clerk#000000897|0|ven deposits. regular, even pinto +49920|1258|O|195220.83|1996-02-19|5-LOW|Clerk#000000409|0|ly pending accounts. carefully special packages wak +49921|697|F|323725.08|1995-02-18|5-LOW|Clerk#000000296|0|xes wake. carefully pending instructions nag. slyly bold packages haggle al +49922|959|F|32553.60|1994-08-31|5-LOW|Clerk#000000372|0|ar sentiments. silent excuses sleep slyly special a +49923|1033|F|44262.24|1994-04-07|3-MEDIUM|Clerk#000000857|0|lly regular requests +49924|88|P|140513.16|1995-05-26|1-URGENT|Clerk#000000201|0|fix. silent accounts across the +49925|335|F|149199.54|1993-01-23|2-HIGH|Clerk#000000165|0|ructions nag. special, even pinto beans haggle slyl +49926|736|P|84506.07|1995-03-30|3-MEDIUM|Clerk#000000552|0|ress theodolites boost furiously. multipliers cajole quickly arou +49927|289|F|128920.94|1992-07-21|4-NOT SPECIFIED|Clerk#000000876|0|inal deposits. slyly express deposits impress bli +49952|1471|O|99453.09|1995-11-20|2-HIGH|Clerk#000000937|0|equests across the final foxes haggle regular packages. regular ideas hag +49953|473|F|172885.56|1992-03-18|4-NOT SPECIFIED|Clerk#000000839|0|al instructions. courts are furiously bold requests. even, even theodolites d +49954|997|F|102748.07|1992-02-28|1-URGENT|Clerk#000000792|0|urts. slyly regular requests sleep furiousl +49955|706|O|75915.64|1996-07-05|2-HIGH|Clerk#000000175|0| depths. furiously ironic idea +49956|787|O|78355.47|1997-02-26|5-LOW|Clerk#000000741|0|fily. final foxes boost boldly among +49957|1379|O|46725.25|1996-04-07|5-LOW|Clerk#000000216|0| ideas use. blithely ironic asymptotes grow slyly? slyly pending escapades ac +49958|1036|O|159160.84|1996-08-27|1-URGENT|Clerk#000000631|0| boost quickly blithely even requests. daring +49959|343|O|118122.13|1997-08-24|4-NOT SPECIFIED|Clerk#000000698|0|ven dependencies sleep carefully blithely e +49984|647|F|230475.85|1994-05-12|5-LOW|Clerk#000000252|0|ily pending requests hinder quickly along the furiously thin pinto b +49985|470|O|91591.60|1998-07-21|3-MEDIUM|Clerk#000000183|0|xpress deposits. silent requests are boldly whithout the slyly regular excu +49986|1168|F|205201.55|1993-10-15|1-URGENT|Clerk#000000429|0| beans. bold requests whithout the de +49987|850|F|278277.21|1995-01-20|2-HIGH|Clerk#000000296|0|es detect slyly among the q +49988|1141|F|280319.67|1993-12-21|2-HIGH|Clerk#000000145|0|y at the fluffily final deposits. carefully unusual deposits along the fur +49989|848|F|36980.39|1993-04-27|4-NOT SPECIFIED|Clerk#000000450|0|e slyly among the carefully final accou +49990|625|F|12270.89|1994-09-06|4-NOT SPECIFIED|Clerk#000000835|0| slyly regular packages cajole carefully bold asymptotes. quickly ironic +49991|914|O|128469.89|1997-11-27|2-HIGH|Clerk#000000172|0| haggle quickly about the slyly regular theodolites. +50016|1369|F|206424.86|1994-04-06|2-HIGH|Clerk#000000386|0|s wake. slyly even frays haggle doggedly. express pa +50017|757|F|102960.49|1992-11-21|5-LOW|Clerk#000000567|0|ers are blithely pending pinto beans. special f +50018|1129|O|269907.11|1997-10-28|4-NOT SPECIFIED|Clerk#000000082|0|ts. slyly special packages nag evenly slyly bold platelets. carefully even cou +50019|941|F|37200.67|1994-09-21|3-MEDIUM|Clerk#000000060|0|es. pending deposits promise alongside of +50020|1046|O|209266.90|1996-06-06|3-MEDIUM|Clerk#000000850|0|refully ironic foxes. furiously pending platelets use across the +50021|1019|F|67209.48|1992-11-06|2-HIGH|Clerk#000000039|0|ly. final instructions after the accounts sleep furi +50022|788|O|239626.79|1996-02-19|5-LOW|Clerk#000000269|0|the packages are dogged ideas. carefully brave deposits are. quickly exp +50023|394|O|303458.87|1997-04-09|3-MEDIUM|Clerk#000000223|0|posits. final deposits sleep quickly about the slyly final pac +50048|88|F|222310.98|1993-01-19|2-HIGH|Clerk#000000786|0| to the express packages cajole blithely +50049|493|O|198720.62|1996-01-30|1-URGENT|Clerk#000000087|0|sts wake carefully above the carefully +50050|610|F|230927.53|1993-12-21|1-URGENT|Clerk#000000744|0|. accounts along the +50051|890|F|340740.85|1994-10-05|3-MEDIUM|Clerk#000000905|0|inos nag carefully. even foxes was furiously. depos +50052|1312|O|290168.40|1995-07-29|3-MEDIUM|Clerk#000000054|0|ers haggle against the ironic epitaph +50053|1330|O|99815.38|1995-05-01|5-LOW|Clerk#000000005|0|ly express packages are quickly above the regular foxes. theodoli +50054|43|F|123804.53|1993-09-07|4-NOT SPECIFIED|Clerk#000000085|0|egularly final deposits cajole carefully behind the ironic deposits. e +50055|319|F|224294.81|1992-10-19|3-MEDIUM|Clerk#000000508|0|hely pending packages detect +50080|1453|O|197089.68|1997-02-20|2-HIGH|Clerk#000000439|0|elets haggle fluffily according to the blithely regu +50081|1423|F|183683.87|1994-11-04|4-NOT SPECIFIED|Clerk#000000653|0|ross the slyly unusual warthogs: silent, regular pinto beans use +50082|1318|F|25222.38|1992-12-04|2-HIGH|Clerk#000000464|0|e carefully according to +50083|1163|P|44222.94|1995-04-09|4-NOT SPECIFIED|Clerk#000000764|0|accounts nag quickly. slyly express depend +50084|1372|O|224384.30|1998-04-15|2-HIGH|Clerk#000000500|0|ilent requests wake +50085|1100|O|47063.65|1995-10-02|1-URGENT|Clerk#000000671|0|are slyly carefully quick deposits. ca +50086|10|F|72065.37|1992-09-20|3-MEDIUM|Clerk#000000681|0|refully. regular deposits are. s +50087|952|F|115633.96|1993-05-16|4-NOT SPECIFIED|Clerk#000000578|0|l requests wake along the ironic asymptotes! slyly ironic warhorses wake +50112|769|O|22612.58|1995-11-09|2-HIGH|Clerk#000000947|0|nts nag theodolites. quickly silent accounts could haggle +50113|1031|O|310546.68|1996-12-23|1-URGENT|Clerk#000000358|0|about the deposits. carefully careful braid +50114|269|O|196908.35|1996-11-29|1-URGENT|Clerk#000000989|0|ts haggle evenly. eve +50115|898|F|243469.69|1993-11-05|1-URGENT|Clerk#000000888|0|kages haggle slowly final excuses. special asy +50116|410|O|88983.27|1996-05-09|1-URGENT|Clerk#000000828|0|fully after the quickly ironic ideas. blithely regular pi +50117|878|O|33774.43|1995-06-04|1-URGENT|Clerk#000000215|0|al pinto beans haggle +50118|700|F|214174.08|1993-03-19|4-NOT SPECIFIED|Clerk#000000916|0|ithely unusual courts impress. final, regular depos +50119|1379|F|94667.89|1993-05-31|5-LOW|Clerk#000000682|0| furiously regular instructions. ironic, final packages sublate furi +50144|949|F|145071.03|1992-06-08|1-URGENT|Clerk#000000657|0|requests. carefully special requests run furiously. thin, bold +50145|781|P|209653.29|1995-02-27|2-HIGH|Clerk#000000624|0| fluffy requests. blithe +50146|907|F|114831.28|1993-08-10|4-NOT SPECIFIED|Clerk#000000161|0|refully final requests detect alo +50147|400|F|215214.90|1994-10-09|3-MEDIUM|Clerk#000000644|0|timents. regular, unus +50148|1192|F|163219.81|1992-02-02|3-MEDIUM|Clerk#000000110|0|silent platelets integrate according to the blithely daring packages. blit +50149|1090|F|110703.66|1994-04-02|3-MEDIUM|Clerk#000000978|0|he ironic requests. even, +50150|1267|O|273213.99|1996-05-12|1-URGENT|Clerk#000000530|0|thin the blithely unusual ideas. regular, special accounts hag +50151|835|O|175866.61|1998-05-08|5-LOW|Clerk#000000484|0|y regular dependencies. escapades boo +50176|1006|F|60836.76|1993-02-26|2-HIGH|Clerk#000000200|0| to the regular, silent requests. unusual, +50177|61|O|158904.56|1998-03-07|4-NOT SPECIFIED|Clerk#000000034|0| deposits sleep on the slyly sly instructions. quickly ironic requests w +50178|434|F|46146.14|1992-04-22|1-URGENT|Clerk#000000008|0|sly even packages. carefully special accounts +50179|317|O|99802.35|1998-04-05|2-HIGH|Clerk#000000497|0|lithely unusual bra +50180|263|F|89737.59|1993-11-04|3-MEDIUM|Clerk#000000703|0|n deposits use thin grouches. careful +50181|838|F|236263.99|1992-05-31|2-HIGH|Clerk#000000733|0|uriously even attainments are fluffily against the bold +50182|1205|O|90265.59|1997-06-27|3-MEDIUM|Clerk#000000438|0|aves promise slyly ironic deposits. slyly final ideas solve quic +50183|1288|F|144459.13|1993-05-25|2-HIGH|Clerk#000000865|0|foxes haggle slyly regular platelets +50208|727|F|191058.81|1995-01-23|3-MEDIUM|Clerk#000000876|0|. special hockey players sublate regularly ironic dolphins. furiously silent f +50209|1273|F|233962.77|1993-09-11|2-HIGH|Clerk#000000293|0|en foxes. carefully pending packages haggle aro +50210|1424|F|228131.32|1993-07-20|5-LOW|Clerk#000000113|0|uickly special packages. quickly special +50211|1384|O|136421.27|1996-10-28|2-HIGH|Clerk#000000650|0|sly even instructions. quickly thin instructions after the unusual +50212|926|O|109130.58|1997-08-28|2-HIGH|Clerk#000000974|0|e. enticingly bold accounts wake. slyly iron +50213|52|O|308271.63|1997-06-12|5-LOW|Clerk#000000567|0|ding pinto beans. quickly special deposits sleep +50214|1240|F|249928.19|1994-06-22|5-LOW|Clerk#000000125|0|ites are furiously. carefully pending theodo +50215|638|O|67023.28|1996-06-05|4-NOT SPECIFIED|Clerk#000000217|0|s nag slyly slyly special deposits. +50240|589|F|23627.94|1992-02-07|4-NOT SPECIFIED|Clerk#000000202|0|egular courts haggle blithely. slyly ironic ideas around the even, +50241|1012|O|143624.91|1997-12-25|5-LOW|Clerk#000000049|0|arefully even foxes haggle careful +50242|959|F|146449.94|1993-07-20|4-NOT SPECIFIED|Clerk#000000094|0| furiously special requests wa +50243|532|F|56660.52|1994-10-25|4-NOT SPECIFIED|Clerk#000000341|0| haggle alongside of the instructions. regular, bold p +50244|451|F|27585.16|1992-07-15|1-URGENT|Clerk#000000589|0|are furiously. fluffily bus +50245|893|O|181897.34|1995-12-31|3-MEDIUM|Clerk#000000879|0|ng to the furiously regular ideas. speci +50246|598|F|215502.02|1993-08-19|3-MEDIUM|Clerk#000000428|0|en platelets wake across the blithely ironic instructions. +50247|1456|O|89114.32|1996-01-31|3-MEDIUM|Clerk#000000346|0|ven instructions wake! closely even accounts boost slyly. even, even pa +50272|863|F|99576.80|1993-09-21|1-URGENT|Clerk#000000780|0|ly special pinto beans +50273|823|F|8931.52|1994-05-10|1-URGENT|Clerk#000000281|0|t the regular, final theodolites. s +50274|353|O|194518.34|1996-01-16|4-NOT SPECIFIED|Clerk#000000632|0|ix. quickly unusual pinto beans haggle. sometimes ironic pin +50275|61|F|135465.74|1994-12-06|3-MEDIUM|Clerk#000000886|0|eep. enticing, expres +50276|1099|F|89619.62|1995-02-15|4-NOT SPECIFIED|Clerk#000000655|0|. slyly regular pinto beans use furi +50277|622|F|158939.15|1994-10-22|2-HIGH|Clerk#000000321|0| packages according to the slyly express foxes +50278|622|F|83782.93|1993-05-26|2-HIGH|Clerk#000000394|0|onic dependencies use furiously about the carefully ironic deposits. +50279|1081|F|83539.13|1994-11-22|5-LOW|Clerk#000000104|0|es are fluffily. regular +50304|295|F|102349.39|1993-02-01|1-URGENT|Clerk#000000880|0|quests sleep blithely. carefully regular ideas sleep. even, pendi +50305|1408|F|120258.76|1994-02-12|3-MEDIUM|Clerk#000000201|0|y pending pinto beans detect blithely according t +50306|751|O|41496.36|1995-05-21|3-MEDIUM|Clerk#000000033|0|de of the regular ideas solve slyly across the packages. requests sleep. care +50307|238|F|257801.87|1993-10-16|5-LOW|Clerk#000000437|0|telets alongside of the ev +50308|1132|F|219349.36|1992-10-19|5-LOW|Clerk#000000779|0|special accounts. quickly permanent foxes use. slyly express accounts wake +50309|545|P|95441.83|1995-03-16|5-LOW|Clerk#000000024|0|y express ideas. courts snooze furiously carefully express pinto bean +50310|32|F|279545.76|1994-08-16|3-MEDIUM|Clerk#000000829|0|h quickly about the blithely regular requests. even +50311|835|O|311325.39|1996-02-18|5-LOW|Clerk#000000700|0|ndencies? furiously bold account +50336|1192|F|108460.01|1994-11-05|4-NOT SPECIFIED|Clerk#000000090|0|e even courts! slyly ironic packages sleep. stealthily +50337|659|F|193392.11|1994-04-17|4-NOT SPECIFIED|Clerk#000000436|0|ly furiously stealthy deposi +50338|1441|F|78499.59|1994-03-24|4-NOT SPECIFIED|Clerk#000000967|0|gainst the blithely regular packages. c +50339|568|F|105978.40|1993-12-27|2-HIGH|Clerk#000000931|0|ding accounts wake quickly even +50340|1060|O|320579.27|1997-01-15|5-LOW|Clerk#000000766|0| foxes. slyly express deposits eat. always express accounts after the caref +50341|1379|O|62033.77|1998-02-14|5-LOW|Clerk#000000004|0|eep carefully final decoys. regular deposits nag. furiously pending excuses se +50342|505|F|197191.09|1994-10-30|3-MEDIUM|Clerk#000000709|0|cajole carefully accoun +50343|178|O|78162.54|1998-03-15|3-MEDIUM|Clerk#000000794|0|ffily regular courts. slyly ironic notornis ca +50368|706|F|30497.41|1992-07-08|1-URGENT|Clerk#000000139|0|l, even platelets: unusual, sile +50369|8|O|238131.74|1998-02-07|2-HIGH|Clerk#000000943|0| packages print quickly around the blithely special accounts. bold d +50370|1075|F|85309.63|1992-11-07|1-URGENT|Clerk#000000272|0|its. closely bold ideas affix blithely +50371|1061|F|181573.25|1994-07-01|2-HIGH|Clerk#000000616|0|ithely regular ideas. special, +50372|73|O|39638.26|1997-03-25|1-URGENT|Clerk#000000607|0|heodolites after the braids are above the special, +50373|724|F|246992.88|1994-07-03|1-URGENT|Clerk#000000567|0|y bold deposits nag bravely pending as +50374|1387|F|134717.54|1994-05-31|4-NOT SPECIFIED|Clerk#000000576|0|long the blithely final ideas run carefully above the furi +50375|1225|O|202267.65|1996-07-08|4-NOT SPECIFIED|Clerk#000000645|0| across the blithely special packages. fluffily slow requests wake accordi +50400|1315|F|86897.11|1992-08-13|2-HIGH|Clerk#000000865|0|totes. ironic ideas wake. carefully final orbit +50401|1333|O|24739.64|1997-12-30|5-LOW|Clerk#000000024|0|ly regular ideas are even deposi +50402|785|O|190716.12|1997-12-19|5-LOW|Clerk#000000614|0|e express accounts. quickly pending instructions sleep bus +50403|395|F|161427.26|1992-05-13|4-NOT SPECIFIED|Clerk#000000449|0|regular somas. ironic foxes serve furiously. dolphins use against +50404|478|F|196544.31|1995-03-27|2-HIGH|Clerk#000000909|0| furiously regular pac +50405|125|O|270254.79|1995-07-03|3-MEDIUM|Clerk#000000206|0|uickly regular ideas haggle. excuses along the ideas dete +50406|874|O|55450.55|1995-12-16|1-URGENT|Clerk#000000197|0|ng requests cajole carefully about the +50407|842|F|76459.94|1993-05-28|2-HIGH|Clerk#000000273|0|ng foxes run; furio +50432|943|F|159359.59|1994-06-08|5-LOW|Clerk#000000887|0|play about the slyly express deposits. slyly unusual +50433|1135|F|332134.23|1992-01-20|1-URGENT|Clerk#000000830|0|its sleep slyly througho +50434|745|F|91131.55|1992-12-24|1-URGENT|Clerk#000000146|0|posits sleep against the bold deposits. furiousl +50435|1471|O|65151.40|1997-06-05|1-URGENT|Clerk#000000241|0|pending theodolites. regular requests after the quickly +50436|1259|F|2943.78|1992-09-04|3-MEDIUM|Clerk#000000600|0|ccording to the slyly stealth +50437|836|O|164519.40|1997-02-20|4-NOT SPECIFIED|Clerk#000000468|0|sits. instructions believe at the ideas. blithely ruthless +50438|1427|O|7786.17|1996-06-24|4-NOT SPECIFIED|Clerk#000000825|0|g excuses engage caref +50439|196|O|253530.03|1998-03-21|5-LOW|Clerk#000000583|0|are fluffily about the blithely regular orbits-- quickly ironic instru +50464|830|O|16179.01|1995-09-28|1-URGENT|Clerk#000000128|0| blithely along the furiously eve +50465|1399|P|172431.66|1995-03-12|3-MEDIUM|Clerk#000000435|0|accounts. dogged deposits are blithely. ac +50466|797|F|72809.49|1992-06-29|1-URGENT|Clerk#000000017|0|arefully. ironic deposits at +50467|1243|O|151122.08|1998-06-05|2-HIGH|Clerk#000000929|0|rate. deposits after the packages us +50468|547|F|58523.18|1992-02-01|1-URGENT|Clerk#000000573|0|ave to lose. regular requests wake ironic packages. furiously final +50469|463|F|170315.04|1993-06-20|4-NOT SPECIFIED|Clerk#000000832|0|eans wake furiously slyly ironic accounts. slyly unusual theodolites +50470|133|F|312184.65|1993-08-24|5-LOW|Clerk#000000736|0|ts wake about the fluffily final instructions. eve +50471|751|F|38940.46|1992-01-04|5-LOW|Clerk#000000217|0|gle blithely final, final foxes. +50496|374|F|55970.79|1994-08-09|2-HIGH|Clerk#000000413|0|ronic, even ideas above the requests nag fluffily after t +50497|289|O|125859.52|1996-04-13|5-LOW|Clerk#000000076|0|eans use blithely. regular, ironic deposits wake carefully carefully un +50498|1277|O|83949.81|1997-05-17|3-MEDIUM|Clerk#000000993|0| integrate furiously. regular accounts nag. slyly ironic deposits +50499|574|O|180343.61|1995-10-13|4-NOT SPECIFIED|Clerk#000000975|0| blithely. deposits sublate carefully enticing requests. +50500|331|O|303092.11|1995-09-07|5-LOW|Clerk#000000214|0|are quickly. furiously ironic platelets sublate carefully final theodolites +50501|277|F|168851.15|1994-05-30|2-HIGH|Clerk#000000084|0|iously special deposits use ruthlessly +50502|1333|F|82633.74|1995-03-27|4-NOT SPECIFIED|Clerk#000000277|0|ep about the ideas. slowly even requests detect slyly fluffily regular platel +50503|934|F|258571.01|1992-11-22|3-MEDIUM|Clerk#000000396|0|ithely regular accounts-- pending, even dependencies detect idea +50528|1267|O|254585.88|1996-12-11|5-LOW|Clerk#000000613|0|regular packages use b +50529|443|O|74787.69|1996-01-26|1-URGENT|Clerk#000000207|0| final deposits along the furiously brave requests affix quickly blithely iron +50530|268|F|87755.06|1992-02-29|5-LOW|Clerk#000000786|0|r accounts. bravely regular packages according to the unusual r +50531|178|O|244660.86|1996-04-29|3-MEDIUM|Clerk#000000118|0| final accounts. regular, s +50532|1496|F|311279.77|1992-08-15|3-MEDIUM|Clerk#000000825|0|ular accounts. quickly express theodolites agains +50533|31|P|144066.93|1995-06-01|4-NOT SPECIFIED|Clerk#000000661|0|ts affix at the deposits. furiously unusual deposits sleep carefully: acco +50534|223|O|99485.49|1998-03-16|2-HIGH|Clerk#000000962|0| even packages. theodolites are slyly about the theodolites. stealthily r +50535|184|F|85087.90|1993-12-09|1-URGENT|Clerk#000000254|0|ts. quickly final dependencies are furio +50560|53|O|165296.23|1996-09-24|1-URGENT|Clerk#000000361|0|as. furiously ironic instructions integr +50561|1283|O|93296.22|1998-05-22|1-URGENT|Clerk#000000118|0|ers according to the express dependencies sleep quickly furious +50562|508|O|21953.88|1996-02-11|1-URGENT|Clerk#000000818|0|boldly even asymptotes detect blith +50563|151|O|126976.78|1995-07-17|2-HIGH|Clerk#000000998|0|e. carefully bold sentiments use care +50564|1493|F|122475.64|1992-03-03|2-HIGH|Clerk#000000277|0|ular deposits. quickly bold packages affix slyly +50565|709|F|237708.11|1992-08-31|2-HIGH|Clerk#000000450|0| final requests sleep slyly bold accoun +50566|548|O|130594.06|1995-09-08|4-NOT SPECIFIED|Clerk#000000105|0| dependencies. final foxes are carefully silent forges. carefully special +50567|865|F|157234.69|1992-02-06|3-MEDIUM|Clerk#000000156|0|ress quickly along the bold dependencies. furiou +50592|7|O|163136.68|1996-11-09|3-MEDIUM|Clerk#000000954|0|quickly unusual, final accounts. un +50593|113|O|160942.05|1995-07-01|1-URGENT|Clerk#000000845|0| across the even accounts boost furiously regular requests. f +50594|533|F|224841.35|1993-05-18|5-LOW|Clerk#000000028|0|ffily quick depths. express pinto beans are carefully quickly final pinto +50595|1147|O|91997.34|1997-10-03|3-MEDIUM|Clerk#000000849|0|eas use permanently. final, bold reques +50596|1129|F|67276.39|1992-08-26|4-NOT SPECIFIED|Clerk#000000282|0|t the blithely special instructions use above t +50597|1211|O|287956.49|1998-07-21|2-HIGH|Clerk#000000890|0|regular, final patterns +50598|461|O|46564.48|1995-12-11|3-MEDIUM|Clerk#000000252|0|y. furiously bold accounts haggle sl +50599|640|O|96410.66|1998-03-02|1-URGENT|Clerk#000000593|0|pearls cajole blithely +50624|463|O|165589.05|1996-04-17|1-URGENT|Clerk#000000879|0|es use dolphins. blithely unusual packages +50625|73|F|163315.74|1994-04-24|3-MEDIUM|Clerk#000000751|0| pending excuses are. unusual, silent deposits after t +50626|61|F|115152.60|1994-10-21|3-MEDIUM|Clerk#000000875|0|counts. furiously express gifts wake blithely throughout the packages. sly +50627|104|O|41212.72|1998-03-04|5-LOW|Clerk#000000779|0|usly carefully pending accounts. theodolites use expre +50628|1147|O|144660.03|1997-10-28|5-LOW|Clerk#000000426|0| beans sleep furiously about the quickly regular courts. ironic +50629|161|O|139209.51|1995-11-14|4-NOT SPECIFIED|Clerk#000000025|0|le after the furiously even requests. requests wake. silent +50630|395|O|123885.29|1996-07-13|1-URGENT|Clerk#000000051|0|nal pearls are. never final requests above t +50631|1114|O|34862.68|1998-06-12|4-NOT SPECIFIED|Clerk#000000902|0|ies solve among the pending, pend +50656|94|F|181383.45|1994-10-26|1-URGENT|Clerk#000000028|0|ly. blithely careful packages wake carefully-- furiously final requests abou +50657|1415|O|185677.23|1995-12-19|2-HIGH|Clerk#000000536|0| foxes among the final, pending requests print ironic pack +50658|619|F|138749.08|1994-08-18|2-HIGH|Clerk#000000901|0|nding ideas are requests. fluffily brave requests detect blithely acco +50659|538|O|146688.01|1998-04-12|1-URGENT|Clerk#000000350|0| carefully final dolphins cajole slyly careful requests. even foxes haggle wi +50660|965|O|49238.29|1996-03-20|3-MEDIUM|Clerk#000000484|0|the slyly regular dugouts. final packages boost above the slyly +50661|175|O|112869.46|1996-10-21|4-NOT SPECIFIED|Clerk#000000785|0|pending pinto beans; pinto beans among the never ironic the +50662|1300|O|89875.89|1997-03-15|5-LOW|Clerk#000000720|0|fily bold asymptotes. furiously unusual +50663|1495|F|155929.51|1993-11-10|1-URGENT|Clerk#000000351|0|s haggle regularly. slyl +50688|73|O|167324.96|1995-12-17|1-URGENT|Clerk#000000391|0| sleep slyly unusual foxes. blithely even requests according t +50689|271|F|106528.47|1994-06-19|3-MEDIUM|Clerk#000000111|0|ges. orbits are. blithely +50690|1447|F|150903.63|1993-10-19|1-URGENT|Clerk#000000655|0|lithely silent ideas. p +50691|643|O|158325.97|1997-05-22|4-NOT SPECIFIED|Clerk#000000823|0|onic instructions thrash furiously special accounts. even accounts hagg +50692|919|F|322597.68|1993-09-18|2-HIGH|Clerk#000000543|0|ully even packages. foxes against the f +50693|349|F|48367.26|1995-01-17|3-MEDIUM|Clerk#000000831|0|regular decoys. carefully ironic deposits according to the blithely final acco +50694|979|O|85074.55|1996-09-07|5-LOW|Clerk#000000477|0|e furiously at the regular +50695|121|O|33543.51|1995-12-03|2-HIGH|Clerk#000000413|0|ep blithely. slyly special pinto beans are. pending, special deposits ha +50720|1327|F|143490.74|1994-09-26|5-LOW|Clerk#000000854|0| near the furiously final pinto beans. unusual packages sleep blithely. furi +50721|1408|F|174659.56|1992-02-29|2-HIGH|Clerk#000000760|0|special instructions boost slyly blithely ironic +50722|164|F|33349.76|1992-10-11|4-NOT SPECIFIED|Clerk#000000420|0|unts. even, regular requests wake carefully. furiously express requests ha +50723|610|O|200851.99|1996-08-16|5-LOW|Clerk#000000291|0|old attainments. carefully regular +50724|541|O|193628.19|1996-10-13|2-HIGH|Clerk#000000311|0|ole ironically. blithely even deposits nag furiously unusual theo +50725|691|F|216357.86|1993-11-24|3-MEDIUM|Clerk#000000028|0|hely even deposits. blithely unusual tithes after the slyly bold dependenc +50726|490|O|281053.85|1995-11-01|5-LOW|Clerk#000000619|0|es haggle blithely along the pending, final deposits. furiously +50727|1429|O|37634.83|1996-05-23|4-NOT SPECIFIED|Clerk#000000932|0| ideas. special instruction +50752|1048|F|135513.83|1993-05-14|1-URGENT|Clerk#000000934|0|wake carefully above the packa +50753|169|O|225476.12|1997-01-04|1-URGENT|Clerk#000000763|0|carefully unusual somas. blith +50754|379|F|125965.53|1994-12-10|4-NOT SPECIFIED|Clerk#000000814|0|ongside of the furiously bold requests. ironic, pending pinto beans a +50755|205|O|41265.59|1998-05-04|4-NOT SPECIFIED|Clerk#000000444|0|al packages hinder furiously alongside of the slyly even requests. +50756|1192|F|308320.22|1993-09-10|4-NOT SPECIFIED|Clerk#000000291|0|r the unusual, ironic instr +50757|554|O|87475.64|1997-04-08|4-NOT SPECIFIED|Clerk#000000140|0|regular accounts breach. even, regular instructions +50758|1393|F|97856.66|1992-07-13|3-MEDIUM|Clerk#000000165|0| even dolphins sleep even warhors +50759|124|F|14679.70|1993-03-20|5-LOW|Clerk#000000571|0|ecial orbits breach blithely r +50784|1231|F|17253.91|1992-02-11|2-HIGH|Clerk#000000445|0|tect daringly accoun +50785|205|O|100062.52|1997-09-13|1-URGENT|Clerk#000000679|0|aggle furiously frays. blithely express ideas +50786|493|F|21371.21|1994-10-13|5-LOW|Clerk#000000238|0|ions boost closely among the furiously final ideas +50787|871|F|45848.38|1993-12-09|4-NOT SPECIFIED|Clerk#000000351|0|nding excuses. orbi +50788|1013|O|211423.04|1998-05-18|1-URGENT|Clerk#000000365|0| wake furiously blithely regular instructions. ironic, even asymptotes +50789|304|F|121318.80|1995-03-13|4-NOT SPECIFIED|Clerk#000000703|0|sts detect fluffily against the t +50790|280|O|26671.35|1995-07-17|1-URGENT|Clerk#000000980|0|foxes breach blithely about the enticingly regular courts. slyly pendin +50791|1246|O|74893.70|1998-05-26|3-MEDIUM|Clerk#000000667|0| ironic packages haggle fluffily express deposits. ironic requests acros +50816|970|F|216947.10|1994-03-28|2-HIGH|Clerk#000000525|0|iously? final theodol +50817|1193|O|48670.41|1996-05-07|1-URGENT|Clerk#000000267|0|dolites across the quickly ironic pinto beans wake quickly regula +50818|115|F|91726.45|1992-10-07|3-MEDIUM|Clerk#000000567|0|riously pending foxes are. blithely +50819|851|O|59271.22|1997-11-08|1-URGENT|Clerk#000000722|0|sual accounts. quickly regular patterns eat among the silent, pendi +50820|817|O|31325.18|1998-02-03|4-NOT SPECIFIED|Clerk#000000976|0|lites. pending platelets cajole blithely. silent deposits ha +50821|583|F|58345.29|1992-01-26|4-NOT SPECIFIED|Clerk#000000446|0|across the quickly even requ +50822|1418|F|262176.29|1992-02-08|3-MEDIUM|Clerk#000000774|0|le final packages. slyly silent +50823|577|F|204887.09|1994-07-22|5-LOW|Clerk#000000118|0|egular pinto beans. slyly regular dependencies about the fl +50848|1222|F|59053.83|1993-01-14|5-LOW|Clerk#000000087|0| are blithely. regular, special requests are. packages dazzle around +50849|1156|F|57399.36|1992-10-05|5-LOW|Clerk#000000855|0|iously slow requests doubt carefully. ironic, exp +50850|1318|F|187272.68|1994-05-07|1-URGENT|Clerk#000000509|0|arefully regular accounts are quickly throughout the slyly bold deposits. fi +50851|940|O|159113.60|1998-03-15|2-HIGH|Clerk#000000142|0|telets: sly pinto beans cajole blithely. unusual packages +50852|1126|O|151081.65|1995-06-13|3-MEDIUM|Clerk#000000692|0|s haggle enticingly regular deposits. permanent, reg +50853|847|F|124116.91|1994-06-27|3-MEDIUM|Clerk#000000845|0|final deposits. regular dinos about +50854|1342|O|327622.65|1995-12-18|1-URGENT|Clerk#000000114|0|hely final dependencie +50855|112|F|63551.13|1992-04-18|3-MEDIUM|Clerk#000000787|0| carefully ironic accounts are about the +50880|1079|P|157936.28|1995-04-11|4-NOT SPECIFIED|Clerk#000000186|0|es sleep blithely across the slyly regular +50881|643|O|55577.66|1997-01-15|2-HIGH|Clerk#000000288|0|kages could sleep ruthlessly final t +50882|577|F|156816.51|1993-09-01|2-HIGH|Clerk#000000527|0|rts. blithely ironic ideas wake slyly +50883|881|F|143221.00|1992-06-02|5-LOW|Clerk#000000741|0|o beans among the silent pack +50884|101|O|185546.78|1998-07-30|1-URGENT|Clerk#000000888|0| slyly ironic deposits haggle across the blithely express reques +50885|811|F|81633.30|1994-10-11|1-URGENT|Clerk#000000310|0|ly! ironic theodolites against +50886|1460|O|140268.66|1998-04-28|2-HIGH|Clerk#000000092|0|ng to the blithely brave packages are slyly slyly even pinto +50887|973|F|136769.06|1993-06-03|5-LOW|Clerk#000000376|0|its haggle. regular requests sleep f +50912|1087|O|176693.74|1996-01-27|3-MEDIUM|Clerk#000000662|0|e final platelets. +50913|218|O|226921.02|1997-02-21|1-URGENT|Clerk#000000107|0|uriously even pinto beans sleep slyly. iro +50914|614|F|289485.57|1992-07-04|1-URGENT|Clerk#000000869|0|ick accounts. regular +50915|440|O|53761.05|1996-05-05|5-LOW|Clerk#000000799|0|y express instructions are pending pinto beans. accounts about +50916|448|F|106391.42|1994-08-03|3-MEDIUM|Clerk#000000409|0|. furiously even packages sleep af +50917|490|F|99476.73|1994-07-22|5-LOW|Clerk#000000158|0|ar theodolites. regular pinto beans sleep blithely bold ideas. ca +50918|1255|F|211062.32|1993-12-05|1-URGENT|Clerk#000000985|0|its cajole according to +50919|1198|O|130012.36|1995-07-04|1-URGENT|Clerk#000000972|0| slyly final dugouts nag carefully regular, even packages. final d +50944|578|O|248268.22|1998-06-29|2-HIGH|Clerk#000000067|0| ruthless courts. q +50945|1223|F|107282.48|1995-01-08|1-URGENT|Clerk#000000090|0|ideas could are pinto beans. +50946|125|O|94075.83|1998-06-08|1-URGENT|Clerk#000000465|0|ly even deposits sleep special dependencies! packages detect among +50947|983|O|211668.37|1996-02-10|5-LOW|Clerk#000000193|0|slyly unusual requests caj +50948|1081|F|69816.57|1994-07-17|5-LOW|Clerk#000000739|0|slyly ironic excuses boost blithely according to the carefully final de +50949|700|F|118734.44|1995-02-05|3-MEDIUM|Clerk#000000703|0|ctions. blithely fluffy packages amon +50950|1088|F|200534.88|1992-12-31|4-NOT SPECIFIED|Clerk#000000824|0| unusual ideas use after the blithely regular gifts; quickly slow frays n +50951|586|F|129605.74|1992-03-26|3-MEDIUM|Clerk#000000641|0| about the final deposits. warhorses +50976|1241|F|108080.22|1994-11-06|3-MEDIUM|Clerk#000000150|0|ent platelets wake fluffily across the regular p +50977|664|F|223160.15|1992-06-12|5-LOW|Clerk#000000821|0| the carefully regular deposits. p +50978|481|F|97526.77|1992-04-01|2-HIGH|Clerk#000000461|0|thely ironic instructions play blithely beside the permanent deposits. +50979|662|F|258298.22|1992-04-18|5-LOW|Clerk#000000873|0| final accounts sleep +50980|551|O|13897.49|1998-02-03|5-LOW|Clerk#000000100|0|ieve slyly express requests. slyly special packages +50981|595|F|159485.38|1994-08-05|1-URGENT|Clerk#000000829|0|egular accounts boost furiously after the furiously even accounts. quick de +50982|793|F|125512.46|1992-04-17|2-HIGH|Clerk#000000269|0|ructions haggle slyly across the fluffily unusual requests +50983|470|O|293901.59|1995-06-29|1-URGENT|Clerk#000000373|0|ckages sleep quickly furiously +51008|1351|O|277965.71|1995-08-21|2-HIGH|Clerk#000000712|0|luffily ironic realms against the ironic packages bo +51009|349|O|340939.48|1995-11-06|4-NOT SPECIFIED|Clerk#000000447|0| final instructions sleep above the express pac +51010|367|F|44550.51|1993-10-14|5-LOW|Clerk#000000157|0|nusual ideas. regular warhorses unwind furiously above the id +51011|307|F|155441.82|1993-06-07|5-LOW|Clerk#000000575|0| nag slyly final deposits? furiously final asymptotes engage carefully. +51012|553|P|104194.47|1995-05-17|3-MEDIUM|Clerk#000000275|0|l deposits during the blithely final packages haggle special instructions. +51013|553|F|15536.49|1993-04-13|4-NOT SPECIFIED|Clerk#000000080|0|s use slyly. bold, regular accounts nag fluffily. carefully +51014|55|O|184268.92|1996-08-06|1-URGENT|Clerk#000000086|0|ly final deposits wake silently ac +51015|859|F|97179.96|1994-02-13|3-MEDIUM|Clerk#000000068|0|nside the carefully final decoys are across the s +51040|545|O|130575.15|1997-02-05|1-URGENT|Clerk#000000882|0| unusual deposits nag furiously above the unusual, pending package +51041|811|F|47294.39|1993-07-30|2-HIGH|Clerk#000000182|0|y special dependencies haggle furiously. carefully final foxe +51042|388|O|275284.00|1997-12-05|1-URGENT|Clerk#000000596|0|e carefully unusual gift +51043|554|O|39791.31|1997-05-14|5-LOW|Clerk#000000751|0|ckages alongside of the express, unusual ideas affix blithely +51044|1234|F|208124.50|1992-01-19|5-LOW|Clerk#000000757|0|posits. express requests wake slyly. furiously unusual dolphins believe +51045|29|F|241823.84|1992-10-16|2-HIGH|Clerk#000000404|0|ealms according to the carefully regular pearls sleep fluffily sly +51046|269|O|134037.72|1997-03-20|2-HIGH|Clerk#000000344|0|usly ruthless deposits haggle slyly-- unusual ideas through t +51047|1309|F|176638.23|1994-04-11|3-MEDIUM|Clerk#000000862|0|g to the slyly special requests. furiously +51072|1078|F|122503.22|1994-10-03|1-URGENT|Clerk#000000807|0| ironic instructions. furiously busy packages above the slyly +51073|190|F|196357.27|1993-05-15|4-NOT SPECIFIED|Clerk#000000883|0|en deposits cajole silentl +51074|1303|O|133025.53|1995-09-06|5-LOW|Clerk#000000227|0|ake furiously among the furiously i +51075|1099|F|107924.77|1993-11-24|4-NOT SPECIFIED|Clerk#000000112|0| deposits wake quickly according to the final, bold packages. re +51076|533|O|52263.62|1996-09-01|3-MEDIUM|Clerk#000000184|0|ate. final theodolites above the ca +51077|200|O|143786.82|1997-01-28|1-URGENT|Clerk#000000135|0|. accounts are caref +51078|724|O|128772.10|1997-02-11|2-HIGH|Clerk#000000760|0|express accounts. quickly ironic th +51079|13|O|150330.47|1997-11-27|4-NOT SPECIFIED|Clerk#000000497|0|ily unusual deposits are qui +51104|1085|O|40849.51|1997-09-22|1-URGENT|Clerk#000000179|0|he even, final platelets? stealt +51105|604|O|70189.41|1998-05-17|5-LOW|Clerk#000000494|0| deposits use furiously ironic pearls. fluffily bold excuses u +51106|1147|F|8313.25|1993-08-07|5-LOW|Clerk#000000753|0|ously even deposits wake carefully according to the ca +51107|869|F|193447.29|1992-09-26|4-NOT SPECIFIED|Clerk#000000710|0| asymptotes wake ruthlessly across the even, regular +51108|494|O|118213.28|1996-09-04|4-NOT SPECIFIED|Clerk#000000190|0|ly regular deposits: thinly special courts wake quickly. bol +51109|284|F|26786.82|1992-11-09|2-HIGH|Clerk#000000450|0| slyly even deposits could have to haggle +51110|1034|O|76480.08|1996-07-23|2-HIGH|Clerk#000000520|0|ross the never ironic platelets. theodolite +51111|247|F|110560.18|1992-02-10|4-NOT SPECIFIED|Clerk#000000982|0|onic foxes boost. daringly pending d +51136|40|F|75814.70|1992-05-18|5-LOW|Clerk#000000554|0|fter the furiously pending accounts use furiously regular pinto beans. car +51137|824|O|338603.83|1996-09-15|3-MEDIUM|Clerk#000000764|0|eep. blithely enticing request +51138|737|O|95447.26|1997-09-06|5-LOW|Clerk#000000818|0|sly even packages cajole after the fu +51139|1261|F|47879.54|1994-08-17|1-URGENT|Clerk#000000771|0|s sleep quickly across +51140|154|F|211825.36|1992-09-15|5-LOW|Clerk#000000557|0|ajole. bold account +51141|586|F|170949.70|1992-05-09|3-MEDIUM|Clerk#000000102|0|nt platelets may grow even deposits. +51142|781|O|65888.60|1995-06-22|1-URGENT|Clerk#000000668|0| furiously bold instructions haggle quickly ironic, regul +51143|1453|O|106665.04|1997-12-22|1-URGENT|Clerk#000000172|0|posits against the furiously express instructions cajole f +51168|1168|F|130262.50|1994-05-09|3-MEDIUM|Clerk#000000814|0| ironic accounts poach quickly by the furiously unusual deposits. caref +51169|407|F|149197.29|1993-12-25|2-HIGH|Clerk#000000944|0|ly. final instructions integrate around the c +51170|797|O|226609.09|1998-06-26|2-HIGH|Clerk#000000866|0|ly ironic asymptotes boost blithel +51171|1351|F|52258.99|1993-06-22|2-HIGH|Clerk#000000487|0|ously ironic asymptotes. slyly final asymptotes hang slyly +51172|922|O|165300.18|1997-09-21|1-URGENT|Clerk#000000762|0|ch furiously careful, ironic pac +51173|181|F|188543.86|1992-11-16|1-URGENT|Clerk#000000436|0|usily special accounts according to the carefully pending p +51174|416|O|279221.38|1997-05-08|4-NOT SPECIFIED|Clerk#000000589|0|odolites wake slyly? careful +51175|1228|F|167335.74|1992-08-15|2-HIGH|Clerk#000000285|0|. regular, close sheaves boost furiously always unusual deposits. quic +51200|626|O|311634.17|1995-11-19|3-MEDIUM|Clerk#000000295|0|ly. final pinto beans haggle regular deposits. careful +51201|607|O|76346.06|1995-12-17|2-HIGH|Clerk#000000644|0|requests. stealthily regular dependencies +51202|1358|F|145358.77|1992-04-14|2-HIGH|Clerk#000000043|0|ag. ideas sleep stealthily. furious +51203|446|O|13500.63|1995-12-22|2-HIGH|Clerk#000000685|0| furious instructions affix sl +51204|466|O|20346.24|1996-01-18|4-NOT SPECIFIED|Clerk#000000473|0|odolites use. carefully even sentiments nag: requests are slyly final, eve +51205|1289|F|120400.13|1992-12-11|2-HIGH|Clerk#000000991|0| wake pending dolphins! final packages us +51206|970|F|42282.16|1994-02-05|5-LOW|Clerk#000000360|0|ld requests use regularly. unusual, regular packages against the carefully s +51207|464|O|118132.40|1996-07-01|2-HIGH|Clerk#000000602|0|ould promise according to the furiously ironic accounts. slyly fi +51232|1433|F|266573.94|1992-01-21|3-MEDIUM|Clerk#000000446|0|along the slyly even deposits. carefully even excuses +51233|61|F|132739.92|1994-12-10|5-LOW|Clerk#000000962|0|. final, final requests +51234|754|F|206263.51|1993-12-02|1-URGENT|Clerk#000000080|0| regularly silent instructio +51235|1397|O|11543.90|1998-04-16|2-HIGH|Clerk#000000997|0|grate fluffily. even forges affix. furiously special accounts among the s +51236|625|O|178104.00|1998-07-06|4-NOT SPECIFIED|Clerk#000000780|0|fix furiously quickly final ideas-- +51237|301|F|45070.82|1992-03-11|3-MEDIUM|Clerk#000000707|0| requests wake slyly. blithel +51238|194|O|209020.46|1998-06-08|2-HIGH|Clerk#000000023|0|dolites nag blithely excuses. regul +51239|908|F|139982.53|1992-02-24|5-LOW|Clerk#000000253|0|nwind blithely alongside of the sly, bold pinto beans. quickl +51264|1172|O|156210.52|1996-09-27|4-NOT SPECIFIED|Clerk#000000224|0|equests around the regular accounts nag ruthless, express pinto beans. +51265|811|O|99878.41|1998-07-17|3-MEDIUM|Clerk#000000026|0|yly unusual ideas. furiously final accounts sl +51266|413|F|244119.45|1994-03-26|4-NOT SPECIFIED|Clerk#000000907|0|blate furiously after the furiously special instructions. +51267|137|F|32003.28|1992-05-04|5-LOW|Clerk#000000336|0|inal requests. regular, regular deposits engage among the pe +51268|946|O|133684.29|1997-01-30|2-HIGH|Clerk#000000771|0|ependencies. daringly stealthy dolphins about the ir +51269|607|F|176199.87|1992-01-13|2-HIGH|Clerk#000000390|0|instructions hinder quickly about the stealthily final accounts. blithely bo +51270|1313|O|338157.45|1997-12-20|2-HIGH|Clerk#000000926|0|ake furiously against the requests. carefully thin w +51271|64|F|140276.19|1993-10-26|2-HIGH|Clerk#000000578|0| accounts wake furiously ironic depos +51296|1151|F|289568.22|1993-10-12|4-NOT SPECIFIED|Clerk#000000918|0|the furiously ironic theodolites cajole furiously along th +51297|1171|F|52901.95|1992-11-12|5-LOW|Clerk#000000253|0|ounts. blithely express e +51298|253|F|204967.52|1994-01-26|2-HIGH|Clerk#000000992|0|ully bold foxes at the furiously ironic deposits a +51299|581|O|296088.69|1998-05-14|2-HIGH|Clerk#000000691|0|rate blithely. blithely pending requests wake beyond the +51300|395|O|138908.94|1995-10-16|3-MEDIUM|Clerk#000000026|0|s according to the slyly ironic instructions boost fu +51301|208|O|247741.00|1997-04-10|4-NOT SPECIFIED|Clerk#000000910|0|accounts. blithely regular instructions tr +51302|202|O|246902.74|1995-08-25|4-NOT SPECIFIED|Clerk#000000643|0|ily carefully regular theodol +51303|1120|F|1336.56|1993-05-23|3-MEDIUM|Clerk#000000420|0|al deposits. carefully regul +51328|562|F|173015.66|1993-10-27|5-LOW|Clerk#000000139|0|ironic instructions +51329|1387|O|207769.17|1996-08-12|3-MEDIUM|Clerk#000000503|0|nts nag. quickly regular instructions nag about the fluffil +51330|463|O|68078.32|1998-06-10|1-URGENT|Clerk#000000868|0|requests up the blithely stealthy ideas cajole quickly f +51331|832|O|88262.37|1996-11-23|5-LOW|Clerk#000000706|0|ts nag furiously final reques +51332|875|O|227371.33|1997-09-11|4-NOT SPECIFIED|Clerk#000000604|0|kly. slyly special dependencies ar +51333|586|F|143560.31|1992-10-05|4-NOT SPECIFIED|Clerk#000000831|0|express accounts cajole stealthily fluffily ironic reques +51334|547|O|156524.33|1997-02-23|3-MEDIUM|Clerk#000000730|0|ly blithely special excuses. +51335|181|F|33435.61|1994-10-26|2-HIGH|Clerk#000000082|0| even tithes. ideas boost carefully slyly final warhorses. re +51360|206|O|19318.06|1995-06-21|3-MEDIUM|Clerk#000000414|0|uriously final requests haggle blithely pending packages. furiously ir +51361|1336|P|111056.68|1995-03-19|5-LOW|Clerk#000000238|0|ly ironic deposits. quickly final platelets sleep. slyly even accoun +51362|1279|F|147844.47|1993-02-23|3-MEDIUM|Clerk#000000944|0|slyly ironic packages. carefully final courts sleep blithely +51363|472|O|71571.03|1997-05-20|5-LOW|Clerk#000000324|0| special theodolites boost blithely pending accounts. quickly regular pinto +51364|1463|F|15043.45|1993-11-03|5-LOW|Clerk#000000090|0| haggle blithely blithe dolphins. fluffily ir +51365|563|F|21264.57|1992-08-08|2-HIGH|Clerk#000000526|0|ily across the even, even platelets. furiously bold +51366|946|O|80975.89|1995-05-23|1-URGENT|Clerk#000000010|0|uctions across the foxes haggle regular dependencies. carefully regular +51367|826|F|111099.31|1994-10-31|4-NOT SPECIFIED|Clerk#000000539|0|he even pinto beans. excuses except the bold instructions mo +51392|434|F|142544.12|1994-11-13|3-MEDIUM|Clerk#000000701|0| bold packages cajole carefully unusual +51393|1492|O|36985.63|1997-03-11|3-MEDIUM|Clerk#000000760|0|ctions. sly instruct +51394|941|F|177774.11|1994-09-08|3-MEDIUM|Clerk#000000437|0|ests believe blithely slyly regular accounts. furiously f +51395|1496|F|242386.08|1993-06-10|5-LOW|Clerk#000000452|0|usly ironic foxes boost blithely after the furio +51396|319|O|141767.82|1997-12-16|5-LOW|Clerk#000000876|0|al pinto beans are among the pending, special packages. express, final pa +51397|1420|F|29652.98|1992-02-08|4-NOT SPECIFIED|Clerk#000000282|0|lly ironic requests wake quic +51398|1438|O|42874.36|1996-06-05|3-MEDIUM|Clerk#000000583|0|press ideas boost quickly. fluffily ironic braids +51399|1463|O|138274.49|1997-11-02|2-HIGH|Clerk#000000952|0|ons shall have to haggle slyly fluffily carefu +51424|949|F|163454.58|1992-01-10|4-NOT SPECIFIED|Clerk#000000161|0|e about the regular deposits. regular instructio +51425|724|O|125273.78|1997-11-25|4-NOT SPECIFIED|Clerk#000000550|0|lites sleep ruthlessly. quickly final foxes boost after the +51426|133|F|68945.31|1993-12-02|3-MEDIUM|Clerk#000000065|0|gle quickly along the regular deposits. even pinto beans nag slyl +51427|94|O|75052.68|1998-01-02|2-HIGH|Clerk#000000855|0|ickly final dolphins. fluffily express pinto beans kindle blithely am +51428|1220|F|264640.07|1994-12-14|3-MEDIUM|Clerk#000000775|0|ts. regular accounts haggle carefully requests. deposits wake +51429|430|O|308758.12|1998-03-28|3-MEDIUM|Clerk#000000706|0|nts are blithely carefully final foxes. bold theodolites wake care +51430|1267|O|31183.64|1996-01-05|1-URGENT|Clerk#000000709|0|ing requests above the slyly regular warthogs are sly +51431|47|O|113074.05|1997-12-23|4-NOT SPECIFIED|Clerk#000000618|0|kages. slowly regular instructions boost care +51456|925|F|16435.93|1993-04-25|1-URGENT|Clerk#000000863|0|refully according to the express, +51457|1019|O|46385.36|1998-01-05|2-HIGH|Clerk#000000629|0|the slyly final orbi +51458|487|O|112426.93|1995-05-13|3-MEDIUM|Clerk#000000677|0|counts along the requests detect quickly even pinto beans. blithely silen +51459|94|O|103983.88|1996-01-24|1-URGENT|Clerk#000000234|0|heodolites cajole slyly +51460|349|O|49450.84|1998-07-30|3-MEDIUM|Clerk#000000790|0|ld theodolites integrate f +51461|1367|F|333496.55|1995-02-11|4-NOT SPECIFIED|Clerk#000000186|0|carefully bold asymptotes are idly even, special pains. quickl +51462|991|O|263735.33|1995-06-23|3-MEDIUM|Clerk#000000706|0|ests. blithely final ideas cajole slyly after the slyly regular theodolite +51463|1123|O|80671.68|1995-12-18|5-LOW|Clerk#000000369|0|express platelets. blithely ironic waters kindle. ruthlessly +51488|790|F|169107.51|1993-05-03|2-HIGH|Clerk#000000612|0| wake across the furiously daring accou +51489|364|F|208268.43|1992-03-04|1-URGENT|Clerk#000000980|0|yly regular deposits along the regular accounts print never quickly ironic ac +51490|946|O|70181.94|1997-04-16|1-URGENT|Clerk#000000134|0|e across the regular, pending requests. carefully bold de +51491|1468|O|183673.68|1998-02-04|1-URGENT|Clerk#000000980|0|ly furiously furiou +51492|1294|O|170013.09|1998-02-14|3-MEDIUM|Clerk#000000110|0| integrate slyly express packages. packages haggle. carefully blithe instru +51493|1219|O|240144.73|1995-07-07|5-LOW|Clerk#000000157|0|. theodolites are quickly final instructions. ruthlessly specia +51494|709|O|78522.33|1995-08-04|1-URGENT|Clerk#000000115|0|c braids affix carefully. ac +51495|1460|F|145062.16|1992-08-01|4-NOT SPECIFIED|Clerk#000000530|0|r deposits alongside o +51520|1279|O|192941.86|1996-06-15|5-LOW|Clerk#000000764|0|ding requests cajole quietly quickly even requests. slyly ironic the +51521|1301|O|189863.49|1996-06-15|1-URGENT|Clerk#000000645|0|ual packages cajole furiously slow platelets. +51522|889|O|140228.41|1995-10-15|3-MEDIUM|Clerk#000000125|0| final, pending deposits are slyly. carefully ironic ideas sleep care +51523|695|F|35312.19|1994-07-24|1-URGENT|Clerk#000000328|0|ss pinto beans haggle slyly! blithely thin theodo +51524|808|F|177615.14|1993-03-15|3-MEDIUM|Clerk#000000498|0|uietly pending foxes +51525|1277|O|166491.31|1995-11-08|1-URGENT|Clerk#000000339|0|ent platelets run carefully regular foxes. even theodol +51526|61|F|66734.08|1995-05-06|2-HIGH|Clerk#000000720|0|ag slyly. quickly bold deposits sleep. furiously even +51527|28|O|226467.04|1997-05-08|2-HIGH|Clerk#000000468|0| final dolphins nag after +51552|272|O|36784.63|1998-03-22|5-LOW|Clerk#000000233|0|eve carefully. slyly regular dep +51553|1195|O|274777.10|1995-11-28|4-NOT SPECIFIED|Clerk#000000646|0|ully final excuses. silent ideas use carefully. furiously sly depo +51554|1391|F|256096.99|1994-03-27|3-MEDIUM|Clerk#000000138|0|lyly ironic packages at the blithely unusual pack +51555|1349|F|91484.44|1994-12-13|4-NOT SPECIFIED|Clerk#000000595|0| fluffily even deposits accordi +51556|817|F|68024.21|1992-10-28|2-HIGH|Clerk#000000213|0|. idly ironic asymptotes beneath the packages nag slyly pendi +51557|1196|O|56454.48|1995-11-01|2-HIGH|Clerk#000000254|0|nal, even packages haggle blithely blithel +51558|1033|F|170357.37|1993-03-30|4-NOT SPECIFIED|Clerk#000000696|0|thin courts try to serve slyly express requests. furiously regular pack +51559|580|F|175652.15|1992-03-05|5-LOW|Clerk#000000588|0| regular accounts. pinto beans alo +51584|562|F|251402.55|1993-10-18|1-URGENT|Clerk#000000879|0|nt, ironic theodolites wake regular +51585|871|O|275479.35|1996-04-29|3-MEDIUM|Clerk#000000293|0|accounts. dependencies alongside of the carefully ev +51586|469|O|233313.83|1997-02-01|2-HIGH|Clerk#000000102|0|n dolphins. pinto beans am +51587|1114|O|68787.87|1997-12-28|2-HIGH|Clerk#000000210|0|packages. fluffily express instructions after the slyly r +51588|551|O|31367.82|1997-03-19|3-MEDIUM|Clerk#000000524|0|mptotes wake carefully foxes. sl +51589|1120|O|329464.57|1995-06-04|5-LOW|Clerk#000000562|0|edly across the blithely iro +51590|242|O|221500.56|1998-05-05|3-MEDIUM|Clerk#000000686|0|ular packages are furiously. furiously express dolphins +51591|742|F|176753.29|1994-10-02|1-URGENT|Clerk#000000880|0|. carefully even deposits wake ironic +51616|979|O|14752.33|1997-07-28|5-LOW|Clerk#000000376|0|ackages. ironic deposits ha +51617|973|O|233672.98|1996-11-21|4-NOT SPECIFIED|Clerk#000000870|0|quests. blithely express packages according to the carefully ev +51618|806|O|229552.68|1998-02-22|2-HIGH|Clerk#000000283|0|its wake carefully. blithely regular excuses haggle careful +51619|202|F|189271.46|1994-09-03|4-NOT SPECIFIED|Clerk#000000885|0|even accounts. ironic theodolites sleep fluffily. carefully ironic r +51620|835|F|290969.25|1992-03-09|3-MEDIUM|Clerk#000000526|0|fully according to the ironic pinto beans. slyly regular theodo +51621|1292|F|37490.10|1993-11-23|3-MEDIUM|Clerk#000000973|0| foxes use furiously acros +51622|559|O|148071.25|1997-09-20|2-HIGH|Clerk#000000726|0| special foxes: carefully regular deposits snooze slyly according +51623|827|F|212769.20|1994-01-14|1-URGENT|Clerk#000000767|0|y pending sheaves. final foxes run. thin, ironic requests hang furiously +51648|1054|F|306254.24|1992-01-02|5-LOW|Clerk#000000565|0|closely even deposits haggle accordi +51649|1459|O|150184.19|1996-11-04|5-LOW|Clerk#000000330|0|aggle. carefully regular +51650|589|P|151571.99|1995-06-02|2-HIGH|Clerk#000000740|0|efully unusual foxes sleep. ironic asymptotes above the +51651|421|O|33357.31|1998-01-07|2-HIGH|Clerk#000000623|0| beans wake alongside of the carefully regular deposits. even, regu +51652|112|P|247097.82|1995-04-10|4-NOT SPECIFIED|Clerk#000000718|0|ecial deposits. ironic, regular pinto beans across the +51653|244|O|162667.27|1997-10-04|5-LOW|Clerk#000000531|0|y special theodolites. slyly special deposits +51654|686|O|149520.85|1996-03-27|5-LOW|Clerk#000000612|0|endencies. fluffily final foxes cajole carefully regular ideas. blithe +51655|1480|F|78376.32|1993-09-19|5-LOW|Clerk#000000356|0|cajole quickly blithely special +51680|56|O|24233.51|1995-12-29|3-MEDIUM|Clerk#000000207|0|ly ironic ideas grow c +51681|1400|O|234436.79|1998-01-28|3-MEDIUM|Clerk#000000972|0|o the furiously regular packages. sly +51682|1078|F|128986.66|1993-04-10|2-HIGH|Clerk#000000091|0|. slyly regular accounts wake blithely. doggedly bold deposits sleep carefull +51683|1420|F|58226.57|1993-05-31|4-NOT SPECIFIED|Clerk#000000540|0|uffily pending courts. idly unusual pains nag according to the dinos. ironic +51684|505|F|164262.11|1993-12-02|2-HIGH|Clerk#000000234|0|latelets. regular asymptotes wake deposit +51685|613|F|69543.10|1992-04-14|4-NOT SPECIFIED|Clerk#000000341|0|s will was along the regular, pending deposits. furiously special +51686|1186|O|127522.35|1997-02-10|4-NOT SPECIFIED|Clerk#000000222|0| boost among the deposits. slyly iron +51687|1294|O|194482.48|1995-09-12|5-LOW|Clerk#000000858|0|al accounts instead of the regula +51712|430|O|124597.68|1997-08-09|1-URGENT|Clerk#000000290|0|ly express pinto beans. idly special instructions ar +51713|1090|P|259340.73|1995-03-20|4-NOT SPECIFIED|Clerk#000000341|0|pinto beans after the quickly pending instructions +51714|614|F|203358.71|1994-09-06|4-NOT SPECIFIED|Clerk#000000999|0|platelets sublate against the express, +51715|1421|O|315933.23|1996-01-27|5-LOW|Clerk#000000491|0|ideas. ironic, final requests haggle quickly blithely ironic asympt +51716|526|O|80923.08|1996-11-02|1-URGENT|Clerk#000000878|0|tes? sometimes brave courts cajole quickly blit +51717|919|O|39888.74|1998-05-13|2-HIGH|Clerk#000000797|0|ts. blithely regular theodolites nag furiou +51718|596|O|140955.30|1996-02-05|3-MEDIUM|Clerk#000000159|0| carefully even foxes haggle. slyly ironic packages above the req +51719|328|O|15363.88|1996-09-01|5-LOW|Clerk#000000166|0|uctions sleep ironic, final packages. slyly fin +51744|476|O|81531.65|1996-10-28|2-HIGH|Clerk#000000251|0|uriously besides the bold +51745|617|O|58559.60|1996-09-13|2-HIGH|Clerk#000000452|0|the slyly ironic patterns. courts wake final requests. qui +51746|1022|F|37778.49|1992-10-18|4-NOT SPECIFIED|Clerk#000000854|0|old pinto beans. ironic pack +51747|22|F|168912.52|1992-07-06|3-MEDIUM|Clerk#000000145|0|tructions: blithely regular instructi +51748|1169|O|55783.94|1995-06-10|1-URGENT|Clerk#000000355|0|ly even foxes cajole fluffily about the carefully even foxes. fur +51749|695|O|239921.50|1997-03-09|2-HIGH|Clerk#000000407|0|arefully about the blithely regular deposits. specia +51750|202|F|9880.74|1993-04-08|2-HIGH|Clerk#000000405|0|nts. carefully bold requests wake furiously furiou +51751|1180|F|28357.41|1994-05-02|5-LOW|Clerk#000000305|0|ckages after the finally even accou +51776|538|O|15513.41|1996-06-09|3-MEDIUM|Clerk#000000783|0|endencies wake slyly after the regular, special ideas. even, i +51777|728|F|177015.98|1995-02-20|3-MEDIUM|Clerk#000000698|0| carefully ironic deposits. dependencies wa +51778|284|O|42554.83|1997-11-25|2-HIGH|Clerk#000000640|0| instructions. even, bold realms +51779|1303|O|25583.67|1995-10-21|1-URGENT|Clerk#000000979|0|s. furiously regular th +51780|731|F|173062.34|1993-07-25|5-LOW|Clerk#000000527|0|cial deposits believe f +51781|385|O|20202.88|1996-03-06|5-LOW|Clerk#000000284|0|quickly regular pla +51782|703|F|158837.16|1993-09-04|2-HIGH|Clerk#000000333|0|asymptotes cajole deposits. blithely regular patterns doubt slyly i +51783|1498|O|278407.89|1995-11-12|3-MEDIUM|Clerk#000000085|0|boost along the slyly slow deposits. pinto be +51808|806|F|90340.02|1993-08-02|5-LOW|Clerk#000000282|0|efully special foxes among the blith +51809|229|F|161394.40|1992-06-12|4-NOT SPECIFIED|Clerk#000000230|0|r deposits. carefully ironic courts according to the careful +51810|434|F|86568.46|1993-05-11|1-URGENT|Clerk#000000371|0|slyly quickly even deposits. furiously ironic accounts +51811|520|F|60875.72|1992-09-04|3-MEDIUM|Clerk#000000970|0| nag fluffily carefully ir +51812|1268|O|254778.89|1997-05-13|3-MEDIUM|Clerk#000000429|0| doggedly ironic courts sleep furiously +51813|1334|F|166944.28|1992-12-22|4-NOT SPECIFIED|Clerk#000000862|0|o beans. foxes sleep quickly. slyly u +51814|947|F|264724.12|1993-09-25|1-URGENT|Clerk#000000318|0|he close, bold deposits. carefully unus +51815|1372|F|284796.75|1994-05-27|5-LOW|Clerk#000000466|0|round the final accounts. fluffily final gifts +51840|769|O|85848.42|1996-07-06|3-MEDIUM|Clerk#000000793|0|pinto beans alongside of the ideas wak +51841|1405|O|20973.77|1997-02-12|1-URGENT|Clerk#000000690|0|endencies. silent packages sleep furiou +51842|1163|O|248181.35|1995-11-29|5-LOW|Clerk#000000560|0|ly regular platelets. pending deposits detect blithely before the express, +51843|811|O|210362.00|1996-01-31|2-HIGH|Clerk#000000241|0|ructions nag furiousl +51844|313|F|224578.60|1994-04-18|2-HIGH|Clerk#000000204|0|s! fluffily ironic deposits boost blithely requests. sl +51845|1214|F|107727.15|1992-04-30|1-URGENT|Clerk#000000090|0|re carefully above the stealthily ironic req +51846|1132|O|168893.86|1998-06-21|1-URGENT|Clerk#000000157|0|ironic theodolites sleep slyly ironic pa +51847|181|O|251797.78|1996-12-30|5-LOW|Clerk#000000322|0|ickly. bold accounts doubt slyly alongside of the un +51872|808|F|323449.71|1992-04-24|3-MEDIUM|Clerk#000000879|0|jole slyly regular instructions. qu +51873|680|F|101353.84|1994-05-07|2-HIGH|Clerk#000000076|0|entiments thrash slyly regular deposits. quickly even dep +51874|722|O|48318.63|1997-12-26|5-LOW|Clerk#000000622|0|ites nag quickly. bold, sp +51875|1072|O|43353.75|1997-05-28|4-NOT SPECIFIED|Clerk#000000060|0|ffily special accounts. slyly pending foxes boost carefully final deposits. +51876|353|F|8720.53|1992-03-07|1-URGENT|Clerk#000000193|0|, slow pinto beans cajole fluffily unusu +51877|85|O|203532.63|1995-12-09|1-URGENT|Clerk#000000600|0|y ironic ideas are slyly slyly regular foxes: deposits wake slyly along th +51878|928|O|41216.13|1995-09-26|4-NOT SPECIFIED|Clerk#000000623|0|across the quickly unusual requests. final excu +51879|607|F|166175.34|1993-08-25|4-NOT SPECIFIED|Clerk#000000123|0|es? foxes cajole along the slyly ironic dugouts. unusual +51904|1072|O|29158.87|1998-03-07|2-HIGH|Clerk#000000518|0|usly against the final foxes. slyly ironic deposits cajole. ironic c +51905|428|O|170168.05|1997-11-04|1-URGENT|Clerk#000000398|0|the blithely brave accounts. bold dependencies sleep carefully silent pa +51906|37|O|242161.37|1995-09-02|2-HIGH|Clerk#000000690|0|ic theodolites. furiously final ideas inside the furiously p +51907|1243|O|133497.69|1997-11-11|2-HIGH|Clerk#000000708|0|use carefully regular de +51908|526|O|204302.83|1996-08-20|2-HIGH|Clerk#000000611|0|ly final packages-- quickly regular epitaphs aft +51909|1175|O|248983.97|1996-04-11|5-LOW|Clerk#000000451|0|cial foxes. ironic pinto beans detect inst +51910|1087|O|230254.65|1995-05-28|5-LOW|Clerk#000000717|0|y fluffily fluffy requests. even theodolites +51911|572|O|233781.21|1997-03-07|1-URGENT|Clerk#000000232|0| ironic theodolites. carefully express acc +51936|709|O|68591.48|1998-07-30|5-LOW|Clerk#000000265|0|s across the theodolites nag among the furiously fluffy dependencies. +51937|1010|F|91241.41|1994-02-28|2-HIGH|Clerk#000000840|0|ular, ironic ideas. slow, final dep +51938|1123|P|59257.98|1995-05-18|5-LOW|Clerk#000000611|0| foxes. slyly even dependencies cajole fluffily +51939|1480|O|43307.34|1996-02-19|1-URGENT|Clerk#000000017|0|iously about the carefully express deposits. even +51940|688|F|89585.84|1992-10-18|2-HIGH|Clerk#000000113|0|ld ideas. blithely regular instructions against the furiou +51941|218|O|86116.16|1996-01-26|2-HIGH|Clerk#000000301|0|ges are quickly. regular, pending pinto beans are slyly +51942|136|O|189742.53|1997-02-27|3-MEDIUM|Clerk#000000570|0|ests except the final pinto beans ar +51943|94|F|138612.62|1994-04-25|2-HIGH|Clerk#000000237|0|es cajole according to the furi +51968|694|F|49821.80|1994-09-06|3-MEDIUM|Clerk#000000154|0|e bravely unusual requests. slowly +51969|1490|O|276309.44|1995-09-05|2-HIGH|Clerk#000000174|0| instructions nag blithely. blithely unusual requests boost furiously final d +51970|719|F|114316.00|1992-01-12|4-NOT SPECIFIED|Clerk#000000154|0|. carefully final requ +51971|145|O|288909.59|1995-10-04|4-NOT SPECIFIED|Clerk#000000719|0|ideas. always even accounts will affix about the blithely regu +51972|1444|O|158827.43|1996-05-04|5-LOW|Clerk#000000271|0|y regular pinto bean +51973|677|O|114210.14|1998-05-21|3-MEDIUM|Clerk#000000167|0| pending, pending pains are final requests. quickly iro +51974|1004|F|249892.29|1995-01-27|2-HIGH|Clerk#000000176|0|e even pinto beans snooze fur +51975|1436|F|393923.76|1994-12-19|5-LOW|Clerk#000000030|0| final requests sleep fluffily carefully silent package +52000|851|F|180667.93|1992-10-04|5-LOW|Clerk#000000687|0|into beans integrate. even, regular request +52001|454|F|340337.98|1992-08-07|2-HIGH|Clerk#000000857|0|even foxes. silent requests wake silent, regular packages. blithely bold +52002|1243|F|171772.33|1994-06-05|2-HIGH|Clerk#000000983|0|ng the furiously final accounts are +52003|1064|F|40754.33|1992-02-19|5-LOW|Clerk#000000448|0|e packages haggle quickly across the furiously unusual accounts. permanen +52004|575|O|67904.91|1996-05-23|5-LOW|Clerk#000000506|0|dazzle across the blithely bold instructions +52005|916|F|22729.14|1994-01-19|3-MEDIUM|Clerk#000000668|0|print blithely quick requests. silently final foxes n +52006|757|F|210506.76|1994-06-25|3-MEDIUM|Clerk#000000151|0|r the final deposits. quic +52007|247|F|228952.21|1992-04-15|3-MEDIUM|Clerk#000000626|0|ironic, permanent requests boost blithely. regular fox +52032|1294|O|163509.93|1997-05-06|5-LOW|Clerk#000000335|0|efully unusual epitaphs are blithely asymptotes. carefully even +52033|223|O|60139.20|1997-10-16|2-HIGH|Clerk#000000784|0|. even, final packages against the slyly +52034|175|O|220843.98|1996-06-22|3-MEDIUM|Clerk#000000545|0|es. final, pending pinto beans wake blithely boldly regular packa +52035|1060|F|38465.01|1994-11-28|2-HIGH|Clerk#000000201|0|en theodolites haggle along the carefully final waters. +52036|1436|O|244377.74|1998-06-15|3-MEDIUM|Clerk#000000330|0|quests. slyly even accounts are. furiously unusual pin +52037|577|O|64064.12|1996-08-09|4-NOT SPECIFIED|Clerk#000000881|0|to beans mold blithely. fluffily regular +52038|610|O|183752.44|1996-07-18|2-HIGH|Clerk#000000980|0|ach carefully alongside of the unusual, reg +52039|812|F|230517.43|1992-08-03|1-URGENT|Clerk#000000095|0|ffily ironic excuses. final theodolites +52064|467|O|9822.82|1997-08-24|1-URGENT|Clerk#000000771|0|s use. quickly final ideas wake fluffily bold request +52065|1204|O|71607.56|1996-03-30|5-LOW|Clerk#000000296|0|leep furiously ironic theodolites. requests sleep blithely. notornis +52066|1496|O|33828.09|1996-06-09|2-HIGH|Clerk#000000536|0|r the unusual, even accounts. fluffil +52067|482|O|212082.88|1998-06-16|4-NOT SPECIFIED|Clerk#000000100|0|eas. permanently even ideas +52068|301|F|168964.23|1992-01-14|4-NOT SPECIFIED|Clerk#000000155|0|old requests cajole slyly af +52069|271|O|25920.04|1998-02-23|4-NOT SPECIFIED|Clerk#000000720|0|y final instructions across th +52070|1187|F|37563.53|1994-12-02|4-NOT SPECIFIED|Clerk#000000157|0|en excuses. even pinto beans nag. so +52071|1345|O|278763.84|1995-11-28|4-NOT SPECIFIED|Clerk#000000947|0|ackages print ironically above +52096|824|O|115266.18|1995-11-08|5-LOW|Clerk#000000710|0|blithely across the quickly bold packages. final deposits integrate permanen +52097|307|O|176237.99|1997-05-18|2-HIGH|Clerk#000000771|0|uests haggle along the special, blithe deposits. foxes affix sl +52098|274|F|31756.21|1993-03-11|3-MEDIUM|Clerk#000000769|0|platelets sleep by the special, unusual deposits. slyly pending instructi +52099|932|O|79837.40|1996-03-14|2-HIGH|Clerk#000000730|0| quickly furiously bold foxes. attainments maintain furiou +52100|232|O|124343.33|1997-10-01|5-LOW|Clerk#000000644|0|e above the requests. furiously regular plate +52101|1258|O|104642.75|1998-01-24|5-LOW|Clerk#000000066|0|uests. silent packages are ca +52102|715|F|115970.02|1993-09-13|3-MEDIUM|Clerk#000000679|0|ly. stealthy, regular pinto beans cajole furiously sometimes ironic t +52103|1454|F|16424.06|1994-12-24|3-MEDIUM|Clerk#000000122|0|s. bold, silent foxe +52128|331|F|88724.29|1993-11-23|4-NOT SPECIFIED|Clerk#000000488|0|cross the furiously express theodolites wake carefull +52129|227|O|179296.46|1996-11-07|2-HIGH|Clerk#000000521|0|y furiously final accounts. enticingly ironic ideas wake ca +52130|1136|F|307520.60|1992-09-06|5-LOW|Clerk#000000693|0|es boost blithely reg +52131|1303|O|76968.96|1997-11-17|5-LOW|Clerk#000000604|0| even foxes. enticing, express pint +52132|586|P|59233.73|1995-05-01|1-URGENT|Clerk#000000237|0|dolites nag slyly. furiously pending deposits cajole +52133|406|O|150090.92|1998-01-16|5-LOW|Clerk#000000062|0|yly unusual deposits maintain carefully slyly regular theodolites. r +52134|17|F|170305.82|1994-04-22|5-LOW|Clerk#000000836|0|lyly against the bold ideas. warthogs are a +52135|268|F|251782.27|1993-03-25|5-LOW|Clerk#000000807|0|about the even, regular hockey players cajole carefully across the u +52160|25|O|112561.17|1995-07-04|1-URGENT|Clerk#000000803|0|s. slyly express requests haggle. carefully unusual pinto +52161|952|O|167435.80|1997-09-30|4-NOT SPECIFIED|Clerk#000000933|0|ajole blithely bold accounts. slyly e +52162|1081|O|205914.89|1995-11-02|4-NOT SPECIFIED|Clerk#000000663|0|blithely pending deposits use p +52163|1300|O|6216.27|1997-07-06|5-LOW|Clerk#000000326|0|ffily express ideas are across the bold dependencies. final +52164|268|F|65259.72|1992-04-14|4-NOT SPECIFIED|Clerk#000000883|0|thely about the furiou +52165|253|O|240774.13|1998-05-24|4-NOT SPECIFIED|Clerk#000000257|0|ns nag along the furiously unusual ideas! final acc +52166|829|O|7458.19|1995-12-23|5-LOW|Clerk#000000119|0|ole blithely. express courts haggle fluffily unusual, final r +52167|1276|O|236965.79|1998-07-11|1-URGENT|Clerk#000000971|0|slyly special deposits cajole orbi +52192|1160|O|165426.85|1998-06-15|2-HIGH|Clerk#000000649|0|d are carefully above the bold re +52193|266|F|196843.68|1993-03-06|4-NOT SPECIFIED|Clerk#000000185|0|rding to the silent excuses affix carefully according to th +52194|991|F|177623.10|1993-12-12|1-URGENT|Clerk#000000184|0|ter the furiously unusual packa +52195|175|O|310388.88|1995-10-27|4-NOT SPECIFIED|Clerk#000000477|0|es. unusual theodolites among the final, final packages +52196|697|F|126449.91|1993-01-31|4-NOT SPECIFIED|Clerk#000000914|0|gular excuses-- pending requests are blithel +52197|143|F|153535.38|1992-08-05|1-URGENT|Clerk#000000825|0|usual deposits wake. fo +52198|1055|O|330655.57|1996-05-28|2-HIGH|Clerk#000000394|0|y after the furiously final dinos! theodo +52199|1468|F|68638.57|1995-01-27|3-MEDIUM|Clerk#000000333|0| carefully fluffily ironic +52224|1241|O|11861.41|1997-06-03|2-HIGH|Clerk#000000636|0| haggle after the quickly reg +52225|706|F|158967.58|1992-04-13|1-URGENT|Clerk#000000959|0|efully unusual packages. ironic, silent foxes nag alongside of the fluffily +52226|1361|F|53982.25|1994-11-02|1-URGENT|Clerk#000000916|0|symptotes. ironic instructions sleep never. +52227|1276|F|175805.12|1994-02-13|3-MEDIUM|Clerk#000000123|0|ress asymptotes. ironically ironic requests among the quic +52228|880|O|205589.33|1997-10-11|1-URGENT|Clerk#000000126|0|ong the furiously regular dolphins cajole blithely across the +52229|1261|O|180963.46|1997-03-16|1-URGENT|Clerk#000000489|0| packages. thin theod +52230|535|F|168750.59|1992-08-31|1-URGENT|Clerk#000000602|0|bove the regular dolphins cajole blith +52231|691|F|219752.50|1994-07-16|4-NOT SPECIFIED|Clerk#000000638|0|, ironic theodolites boost furiously: blithe +52256|695|F|87349.93|1993-11-05|4-NOT SPECIFIED|Clerk#000000221|0|regular packages past the slyly brave requests are around the final d +52257|1451|O|125474.14|1997-05-16|5-LOW|Clerk#000000511|0|. regularly bold foxes cajole regu +52258|52|F|71394.16|1994-02-11|5-LOW|Clerk#000000353|0| across the ideas solve blithely pending pac +52259|148|O|19317.00|1998-02-11|4-NOT SPECIFIED|Clerk#000000453|0|oss the carefully ironic theodolites are furiously pending pain +52260|809|F|133265.05|1993-05-25|4-NOT SPECIFIED|Clerk#000000960|0|es. regular dolphins haggle blit +52261|1000|P|227135.44|1995-04-22|4-NOT SPECIFIED|Clerk#000000607|0|. blithely silent asymptotes cajole against the express courts. express as +52262|715|F|11899.81|1992-03-17|4-NOT SPECIFIED|Clerk#000000242|0|heodolites above the daringly even excuses sleep across the +52263|1|F|51134.82|1994-05-08|4-NOT SPECIFIED|Clerk#000000080|0|lly ironic, even packages. bold foxes wake carefully. bold requests hag +52288|7|O|188659.65|1995-08-11|2-HIGH|Clerk#000000696|0|ual deposits are fluffi +52289|184|O|275396.66|1998-05-30|5-LOW|Clerk#000000616|0|al theodolites wake bl +52290|842|F|305078.65|1992-05-22|5-LOW|Clerk#000000646|0|ithes cajole quickly alongside of the b +52291|76|F|143658.85|1994-10-30|1-URGENT|Clerk#000000134|0|ependencies. ironic, pending hockey players use carefully. regu +52292|43|F|105463.66|1993-10-04|4-NOT SPECIFIED|Clerk#000000656|0|es. blithely even sauternes haggle blithely +52293|961|P|199146.08|1995-04-16|2-HIGH|Clerk#000000043|0|deas nag furiously among the slyly special grouches. regular, special +52294|229|O|201205.46|1996-08-27|1-URGENT|Clerk#000000631|0|lar foxes. quickly final deposits slee +52295|58|O|261896.24|1995-11-23|1-URGENT|Clerk#000000257|0|ally along the ruthlessly ironic dependencies. ironic platelets nag slyly afte +52320|809|F|150737.60|1992-09-25|5-LOW|Clerk#000000581|0|g courts eat. blithely silent accounts boost fluffily. blithely regular pa +52321|217|O|267235.30|1995-11-06|2-HIGH|Clerk#000000050|0|ic requests? ironic requests sleep around the regular, even ac +52322|266|F|60260.79|1993-02-03|5-LOW|Clerk#000000107|0|ctions. final deposits wake slyly above the quickly unusual +52323|851|O|123197.16|1997-05-01|1-URGENT|Clerk#000000284|0|s the fluffily bold accounts. blithely ironic pinto beans haggl +52324|1039|F|307602.51|1992-06-30|4-NOT SPECIFIED|Clerk#000000495|0|n the unusual instructions. blith +52325|791|F|147429.52|1992-07-15|4-NOT SPECIFIED|Clerk#000000950|0|the slyly quiet requests nag furiously furiously final pinto beans. +52326|1103|F|136154.97|1993-08-05|5-LOW|Clerk#000000890|0| quickly permanent deposits. blithely ironic theodolites wake fur +52327|1423|O|212362.12|1995-12-21|3-MEDIUM|Clerk#000000203|0|fix blithely even deposits. unusual, final requests sleep quickly at the regul +52352|182|O|178158.51|1997-02-14|5-LOW|Clerk#000000693|0|ironic packages haggle. furiously slow accounts cajole! even pla +52353|793|O|45265.98|1996-12-27|1-URGENT|Clerk#000000608|0|xes-- carefully regular requests detect. furiously regular theodolite +52354|82|F|106088.72|1992-08-10|1-URGENT|Clerk#000000085|0|refully regular pinto beans. regular foxes play +52355|1213|O|200475.83|1997-06-12|3-MEDIUM|Clerk#000000780|0|old depths; quickly ironic pinto beans must have +52356|208|O|128470.03|1997-12-21|2-HIGH|Clerk#000000301|0|ng requests. furiously silent deposits are slyly pending ideas. fluffily +52357|409|F|151540.59|1994-09-04|4-NOT SPECIFIED|Clerk#000000565|0|packages nod furiously. fin +52358|178|O|14963.60|1996-12-02|2-HIGH|Clerk#000000419|0|sits cajole blithely slyly ironic packages +52359|932|O|85383.40|1998-06-19|2-HIGH|Clerk#000000677|0|. foxes wake fluffily idle pack +52384|1318|O|121996.79|1998-05-18|4-NOT SPECIFIED|Clerk#000000972|0|ggle carefully. finally special instructions promise qui +52385|811|F|144180.30|1994-01-03|5-LOW|Clerk#000000915|0|ully unusual instructions wake after the sly +52386|794|F|168438.73|1994-01-06|2-HIGH|Clerk#000000178|0|lyly according to the furiously express dolphins. dep +52387|898|O|201191.93|1996-09-19|3-MEDIUM|Clerk#000000247|0|e slyly even accounts? +52388|907|O|191457.64|1996-03-20|4-NOT SPECIFIED|Clerk#000000081|0|express accounts cajole u +52389|1291|O|243892.45|1995-10-22|1-URGENT|Clerk#000000771|0|ounts. special, special hockey players integrate fluffily ironic i +52390|832|O|112958.87|1996-11-18|4-NOT SPECIFIED|Clerk#000000678|0|ut the furiously express dolphins. final, expre +52391|179|F|99534.31|1994-12-13|2-HIGH|Clerk#000000798|0|ular deposits sleep alongside of the carefully ironic th +52416|1321|F|84357.39|1994-02-01|4-NOT SPECIFIED|Clerk#000000628|0| special packages are. final, special courts may haggle against the quic +52417|952|O|33796.25|1996-01-06|3-MEDIUM|Clerk#000000564|0|pending dolphins haggle quickly across the furiously regular r +52418|133|O|53572.64|1998-07-12|1-URGENT|Clerk#000000272|0|lithely final asymptotes. dari +52419|151|F|141374.92|1992-09-19|2-HIGH|Clerk#000000028|0|nding platelets wake slyly bold packages. regular theodolites thra +52420|589|O|349539.44|1998-04-28|4-NOT SPECIFIED|Clerk#000000021|0|ounts nag after the furiously ironic platelets. f +52421|992|O|54492.23|1996-03-14|1-URGENT|Clerk#000000989|0|heodolites. fluffily ironic accou +52422|1220|O|17880.49|1997-02-25|5-LOW|Clerk#000000567|0|gular deposits detect carefully. deposits wake careful +52423|1255|P|234334.40|1995-04-12|1-URGENT|Clerk#000000241|0|sly express requests cajole according to the quickly even d +52448|427|F|157895.60|1993-09-11|4-NOT SPECIFIED|Clerk#000000074|0| bravely slyly unusual courts; do +52449|517|O|89675.55|1997-05-08|1-URGENT|Clerk#000000898|0|nusual excuses. blithely special packa +52450|827|O|68885.37|1997-01-10|2-HIGH|Clerk#000000774|0|le furiously alongside of the quickly +52451|1130|O|152376.58|1996-09-17|2-HIGH|Clerk#000000451|0|nic deposits. slyly furious packages ma +52452|247|F|158550.85|1993-11-12|4-NOT SPECIFIED|Clerk#000000053|0| packages sleep carefully. requests detect furious +52453|937|F|86596.02|1994-01-25|4-NOT SPECIFIED|Clerk#000000203|0|he final requests. pending platelets boost. bold, un +52454|652|O|181549.70|1997-02-16|1-URGENT|Clerk#000000497|0|s. silently thin asymptotes haggle blithely. r +52455|208|F|73180.94|1993-11-21|1-URGENT|Clerk#000000440|0|ckages. permanently express depos +52480|583|F|403464.01|1993-07-28|4-NOT SPECIFIED|Clerk#000000338|0|final gifts. dogged ideas are quickly. theodolites use accoun +52481|806|O|134270.31|1997-09-11|4-NOT SPECIFIED|Clerk#000000115|0|ctions. fluffily regular dolphins affix slyly. fluffily ironic +52482|1453|F|164423.82|1995-02-01|1-URGENT|Clerk#000000016|0|fluffily final excuses sleep furiously bold deposits. dogged, even theodolite +52483|650|O|165053.15|1997-09-27|3-MEDIUM|Clerk#000000386|0|ests boost blithely after the slyly express packages. blithe +52484|1253|O|209054.93|1996-05-21|3-MEDIUM|Clerk#000000375|0|en pinto beans according to the special +52485|1093|O|210004.25|1996-04-11|3-MEDIUM|Clerk#000000612|0|equests. slyly pending accounts grow fluffily +52486|202|F|277543.84|1995-01-05|4-NOT SPECIFIED|Clerk#000000571|0|s the slyly ironic foxes. packa +52487|523|F|244281.21|1994-06-02|1-URGENT|Clerk#000000947|0|ronic deposits use quickly a +52512|472|O|257410.40|1995-07-08|2-HIGH|Clerk#000000768|0|usy deposits integrate +52513|1159|O|214196.47|1996-10-17|3-MEDIUM|Clerk#000000667|0|ly even requests. slyly regular requests acco +52514|1090|O|157768.93|1997-06-05|3-MEDIUM|Clerk#000000022|0| theodolites will ha +52515|1249|O|30045.04|1997-01-10|2-HIGH|Clerk#000000129|0|the quickly unusual deposits. furiously sil +52516|1150|F|161783.91|1992-01-06|2-HIGH|Clerk#000000699|0|l pinto beans are quickly slyly express pinto beans. quickly +52517|359|F|129115.28|1992-01-06|3-MEDIUM|Clerk#000000665|0|xpress, regular decoys si +52518|1205|F|362242.86|1992-04-04|1-URGENT|Clerk#000000345|0|t the express requests. regular pinto beans above the even +52519|1229|F|107001.49|1992-04-30|2-HIGH|Clerk#000000640|0|ar ideas. furiously unusual theod +52544|1114|F|114953.13|1992-02-10|4-NOT SPECIFIED|Clerk#000000898|0|osits shall detect regularly slyly even theodolites; carefully fina +52545|1042|O|250251.29|1996-02-23|4-NOT SPECIFIED|Clerk#000000997|0| the quickly unusua +52546|1213|O|113025.40|1997-04-10|1-URGENT|Clerk#000000226|0|ing, express packages. slyl +52547|257|O|205451.99|1996-12-22|2-HIGH|Clerk#000000169|0|regular platelets boost into the carefully quiet theodolites. quickly +52548|88|O|147823.86|1996-01-04|2-HIGH|Clerk#000000763|0|c ideas. furiously express dependencies integrate sl +52549|1159|O|236030.80|1996-11-26|1-URGENT|Clerk#000000307|0|usual requests. pending, f +52550|746|O|185653.18|1997-02-11|5-LOW|Clerk#000000363|0|al requests alongside of the quickly unusual requests slee +52551|28|F|97412.99|1995-01-22|4-NOT SPECIFIED|Clerk#000000833|0|lithely. carefully express foxes +52576|691|F|132086.45|1994-03-29|5-LOW|Clerk#000000587|0|unts. regular, ironic packages +52577|889|O|95262.74|1997-08-17|3-MEDIUM|Clerk#000000921|0|quests? even, close accounts wake blithely according to the final deposits. +52578|46|P|180037.03|1995-03-08|1-URGENT|Clerk#000000639|0|r deposits. slyly ironic requests nag. careful +52579|887|O|79836.50|1996-02-24|1-URGENT|Clerk#000000964|0|ackages haggle furiously unusual acc +52580|694|F|347610.53|1992-08-29|2-HIGH|Clerk#000000603|0|e bold pinto beans. express deposits cajole furiously after the expres +52581|223|O|62561.23|1995-09-10|2-HIGH|Clerk#000000705|0| quickly final somas believe. furiously pen +52582|136|O|58526.65|1997-03-16|1-URGENT|Clerk#000000946|0|to detect. carefully final ideas boost furiously slyly final pin +52583|853|O|176947.02|1997-04-22|3-MEDIUM|Clerk#000000511|0| express accounts are carefully after t +52608|1318|F|201054.62|1994-01-22|5-LOW|Clerk#000000489|0|ily pending instructions eat among the slyly even p +52609|227|O|68189.84|1997-02-23|2-HIGH|Clerk#000000832|0|e regular asymptotes. express, regular +52610|1055|F|12274.25|1993-01-24|1-URGENT|Clerk#000000591|0|the slyly special notornis was along the sly +52611|1454|P|162553.95|1995-04-26|3-MEDIUM|Clerk#000000335|0|ccounts. bold, regular ideas boost slyly quickly special requests. spec +52612|1235|F|47796.46|1992-11-10|4-NOT SPECIFIED|Clerk#000000482|0|s, ironic requests. escapades promise? carefully unusual dolphins nag +52613|176|F|20584.96|1994-09-27|3-MEDIUM|Clerk#000000024|0|ress requests. even requests wake slyly furiou +52614|898|F|56097.42|1992-04-11|4-NOT SPECIFIED|Clerk#000000872|0|. pinto beans lose e +52615|1330|F|246475.35|1994-10-20|5-LOW|Clerk#000000853|0|usual deposits. stealthily special dependencies sublate fluffily. evenly bo +52640|349|F|245641.43|1995-01-02|3-MEDIUM|Clerk#000000899|0|nusual ideas. slyly even pinto beans integrate carefully requests. slyl +52641|743|F|193209.59|1993-10-09|4-NOT SPECIFIED|Clerk#000000444|0|into beans. furiously even pinto beans until the special deposits boost +52642|889|O|285331.11|1995-06-15|5-LOW|Clerk#000000168|0|tes. quickly regular platelets use f +52643|178|F|40546.64|1993-09-28|4-NOT SPECIFIED|Clerk#000000272|0|omise furiously bold, even theodolites. special deposits are furiously +52644|640|F|213901.62|1992-05-19|2-HIGH|Clerk#000000905|0|ial ideas haggle slyly express, unusual orbits. final accounts nag above t +52645|316|F|231575.80|1992-03-08|5-LOW|Clerk#000000971|0|slyly express dependencies around the pending accounts are furious +52646|176|O|39673.14|1996-03-09|4-NOT SPECIFIED|Clerk#000000334|0| the furiously special requests. ironic, even ideas was thinly. regula +52647|658|O|178619.25|1997-07-04|3-MEDIUM|Clerk#000000730|0| furiously express foxes sleep theodolites. packages sleep blith +52672|827|F|142688.93|1995-01-09|5-LOW|Clerk#000000909|0|equests haggle along the carefully expres +52673|5|F|86070.96|1992-05-09|3-MEDIUM|Clerk#000000995|0|cajole: ironic deposits are carefully fluffily express ideas. final pla +52674|1426|O|276510.88|1996-04-20|3-MEDIUM|Clerk#000000636|0|daring deposits. accounts after the slyly special requests sleep accordin +52675|1210|O|243646.88|1995-10-11|3-MEDIUM|Clerk#000000830|0|ronic grouches. care +52676|466|F|184705.69|1992-08-29|2-HIGH|Clerk#000000383|0|aggle blithely against the +52677|319|F|11321.85|1994-03-03|1-URGENT|Clerk#000000367|0|never dolphins. regular theodolites sleep with the final, ironic +52678|919|F|222389.02|1992-07-30|2-HIGH|Clerk#000000089|0|express requests. care +52679|118|O|59990.64|1996-04-05|1-URGENT|Clerk#000000625|0|ggle express foxes. steal +52704|247|F|156866.60|1993-12-23|1-URGENT|Clerk#000000081|0| foxes. doggedly unusual instructions use fluffi +52705|296|O|132873.61|1998-06-29|2-HIGH|Clerk#000000709|0|. bravely ironic packages alongside of the furiously e +52706|302|F|120571.68|1992-07-10|5-LOW|Clerk#000000094|0|ackages sleep against the fluffily ironic ideas. pending excuses boost. furi +52707|1304|O|237813.43|1996-08-07|1-URGENT|Clerk#000000150|0|r dolphins. express platelets haggle furiously. slyl +52708|1094|O|91770.85|1997-03-04|5-LOW|Clerk#000000966|0|e after the slyly final foxes. fluffily ironic grouches a +52709|679|F|77858.35|1994-10-13|4-NOT SPECIFIED|Clerk#000000357|0|yly unusual requests. regular, special instructions sle +52710|841|F|67608.22|1993-11-01|5-LOW|Clerk#000000678|0|carefully express pinto beans. fluffily express +52711|1073|O|315832.64|1995-09-24|4-NOT SPECIFIED|Clerk#000000823|0|ns detect slyly foxes. blithely b +52736|739|O|124587.73|1998-06-09|2-HIGH|Clerk#000000780|0|gular instructions across the blithely unusual asymptotes u +52737|1118|F|146416.09|1993-11-09|4-NOT SPECIFIED|Clerk#000000754|0|ronic foxes use blithely. regular, final accounts us +52738|823|O|25813.46|1996-08-06|4-NOT SPECIFIED|Clerk#000000666|0|old ideas. carefully special requests are blithely. quickly final +52739|610|F|27015.61|1994-01-10|4-NOT SPECIFIED|Clerk#000000548|0|r accounts promise furiously thin deposits. fin +52740|259|O|100655.67|1996-07-07|5-LOW|Clerk#000000207|0|ts. furiously special depos +52741|967|O|207078.13|1998-05-20|4-NOT SPECIFIED|Clerk#000000766|0|ccounts wake blithely even packages. carefully pendin +52742|682|O|12774.96|1995-06-04|5-LOW|Clerk#000000658|0|ully carefully final theodo +52743|1288|F|76334.15|1993-07-05|2-HIGH|Clerk#000000302|0|equests. furiously express deposits su +52768|106|O|188420.60|1997-12-14|5-LOW|Clerk#000000945|0|ve the blithely special deposits. fluf +52769|229|O|71114.61|1996-03-28|1-URGENT|Clerk#000000065|0|ages. blithely regular accounts around the ac +52770|1226|O|53116.14|1996-04-08|4-NOT SPECIFIED|Clerk#000000439|0| the ironic accounts. ironic, express deposit +52771|1336|F|130376.12|1993-10-08|4-NOT SPECIFIED|Clerk#000000860|0|s. express accounts are carefully fluffily ironic deposits. furiousl +52772|908|F|359364.87|1992-11-06|1-URGENT|Clerk#000000618|0| ironic packages are a +52773|976|O|284072.75|1996-01-09|5-LOW|Clerk#000000534|0|nal deposits are furiously. unusual foxes should are c +52774|580|O|213362.71|1997-05-22|3-MEDIUM|Clerk#000000980|0| the carefully special warthogs. slyl +52775|1033|O|74441.66|1997-01-27|1-URGENT|Clerk#000000400|0|s nag quickly. final foxes sle +52800|703|F|86316.21|1993-10-11|4-NOT SPECIFIED|Clerk#000000653|0|uriously furiously unusual deposits. fluffy dep +52801|823|O|52096.87|1997-08-15|1-URGENT|Clerk#000000842|0| dolphins. excuses promise furi +52802|992|O|197317.59|1995-11-01|5-LOW|Clerk#000000492|0|pecial foxes. pinto beans nag fluffily a +52803|628|F|95433.95|1994-09-21|2-HIGH|Clerk#000000664|0|sly even, final theodolites. furiously ironic forges detect: fluffily iron +52804|1075|F|8481.05|1994-11-02|1-URGENT|Clerk#000000663|0| ironic packages use slyly. special, regular packages sleep +52805|352|O|237201.18|1995-09-29|2-HIGH|Clerk#000000334|0|yly regular packages ar +52806|221|O|136714.64|1996-02-19|2-HIGH|Clerk#000000852|0|kages wake along the ironic pinto bea +52807|328|F|154792.53|1993-11-26|3-MEDIUM|Clerk#000000808|0|final accounts wake carefully slyly pe +52832|317|O|170895.64|1998-03-19|3-MEDIUM|Clerk#000000222|0|s sleep. bold, final deposits detect along the quick acco +52833|700|O|200902.14|1995-12-25|3-MEDIUM|Clerk#000000910|0|s sleep carefully around the blithely quick frets. sometimes silent re +52834|1384|O|192507.94|1997-11-27|1-URGENT|Clerk#000000305|0|pending pinto beans. even reque +52835|808|O|198565.38|1997-09-13|4-NOT SPECIFIED|Clerk#000000006|0|p furiously. furiously unusual reques +52836|1307|O|304773.74|1998-04-04|5-LOW|Clerk#000000488|0|nic dolphins should have to cajole even, bold pac +52837|1297|F|226116.69|1992-01-19|1-URGENT|Clerk#000000712|0|ing instructions. blithe +52838|595|O|183906.39|1997-11-12|4-NOT SPECIFIED|Clerk#000000431|0|ar ideas are slyly abov +52839|1201|F|112884.16|1993-04-12|2-HIGH|Clerk#000000820|0|out the accounts run quickly furiously final deposit +52864|835|F|90086.89|1993-08-11|5-LOW|Clerk#000000581|0| carefully even ideas cajole fluffily blithely ironic +52865|356|O|264291.60|1995-12-24|4-NOT SPECIFIED|Clerk#000000469|0|ldly regular foxes cajole qui +52866|49|F|154955.61|1992-05-04|4-NOT SPECIFIED|Clerk#000000326|0|encies according to the carefully even deposits sleep final, final pack +52867|1216|F|55451.26|1994-08-14|2-HIGH|Clerk#000000329|0|, unusual theodolites lose carefully after the final excuses. car +52868|829|F|245378.30|1995-02-17|5-LOW|Clerk#000000958|0|atelets according to the permanently pending asymptotes run blithely carefu +52869|803|O|99553.08|1996-03-28|3-MEDIUM|Clerk#000000838|0|lly ironic accounts. spec +52870|430|F|215846.51|1994-03-10|4-NOT SPECIFIED|Clerk#000000124|0|ly final requests among the carefully bold foxes impress among the acc +52871|610|P|76714.50|1995-05-11|3-MEDIUM|Clerk#000000264|0|ticingly special accounts. blithely special requests are regularly around +52896|727|F|299431.94|1993-10-23|2-HIGH|Clerk#000000153|0|nic accounts about the even, pending wate +52897|676|F|157982.97|1994-08-23|3-MEDIUM|Clerk#000000227|0|uriously final pinto beans +52898|446|O|134760.41|1996-01-11|3-MEDIUM|Clerk#000000169|0| sleep slyly slyly final theodolites. ironic instr +52899|1372|O|148490.87|1997-01-03|4-NOT SPECIFIED|Clerk#000000997|0|ven ideas use even asymptotes. furiously pending packages sle +52900|1339|O|228575.87|1995-05-21|2-HIGH|Clerk#000000811|0|ecial accounts. pending, even accounts sleep against the slyly +52901|562|O|225197.54|1998-03-08|1-URGENT|Clerk#000000698|0|ns wake blithely furiously pending dolphins. furiously ironic p +52902|790|F|163590.83|1993-07-18|5-LOW|Clerk#000000735|0| beans. blithely ironic deposits hang careful +52903|7|O|173021.97|1996-03-31|1-URGENT|Clerk#000000703|0|ackages boost after the even accounts. furiously s +52928|1198|O|49965.14|1997-08-06|3-MEDIUM|Clerk#000000997|0|orbits. quickly special packages cajole after the sometimes unusual +52929|1018|P|168966.23|1995-04-09|2-HIGH|Clerk#000000249|0|dolphins cajole according to the slyly pendin +52930|1375|O|234584.73|1995-11-09|5-LOW|Clerk#000000532|0|ymptotes. special, pending requests are fluffily even bra +52931|898|F|220617.99|1993-04-21|4-NOT SPECIFIED|Clerk#000000096|0|ly. carefully final theodolites detect packages. silent dep +52932|421|F|22633.19|1992-05-13|5-LOW|Clerk#000000280|0|. carefully ironic packages alongside of the packages +52933|106|F|260969.24|1993-08-27|5-LOW|Clerk#000000766|0|ackages through the fur +52934|1234|O|205668.62|1995-07-28|1-URGENT|Clerk#000000876|0|e pending accounts hag +52935|826|O|103284.50|1998-07-27|1-URGENT|Clerk#000000254|0|ly ironic packages nag carefully. bold requests are fluffily about +52960|52|O|27674.61|1997-08-28|4-NOT SPECIFIED|Clerk#000000990|0|lyly ironic packages. carefully regular ideas after the slyly pending f +52961|88|O|208180.51|1997-03-02|2-HIGH|Clerk#000000339|0|ld, unusual accounts wake. theodolites sleep carefully slyly bold pear +52962|1084|O|112244.62|1998-05-27|4-NOT SPECIFIED|Clerk#000000618|0|sts detect. blithely pending dependencie +52963|106|O|242299.32|1998-03-07|1-URGENT|Clerk#000000036|0|s along the ironic f +52964|1441|F|94219.60|1993-04-01|1-URGENT|Clerk#000000523|0|lar packages wake after the even requests. s +52965|676|O|466001.28|1996-09-22|3-MEDIUM|Clerk#000000103|0|thless pinto beans use about the blithe +52966|532|F|56083.38|1992-12-03|2-HIGH|Clerk#000000244|0|e slyly bold requests. furiously regular foxes cajole. blithely +52967|1391|O|95431.29|1998-04-28|3-MEDIUM|Clerk#000000264|0|luffily special depo +52992|1279|O|224483.54|1996-12-07|4-NOT SPECIFIED|Clerk#000000792|0|y even deposits. ideas wake. f +52993|526|F|126671.92|1992-07-30|3-MEDIUM|Clerk#000000307|0|usual requests boost about the sometimes speci +52994|100|F|89601.52|1994-12-09|3-MEDIUM|Clerk#000000402|0|ost against the deposits. slyly ironic packages after the blithely regular +52995|559|F|79391.61|1992-03-16|4-NOT SPECIFIED|Clerk#000000834|0|ts. furiously unusual packages hinder blithely according t +52996|1117|O|39744.90|1996-08-09|5-LOW|Clerk#000000272|0|final instructions are slyly unusual dependencies. slyly un +52997|947|F|118893.97|1994-02-09|4-NOT SPECIFIED|Clerk#000000946|0|ly final platelets cajole slyly above the even accounts. furiously reg +52998|1460|F|30635.36|1993-07-18|5-LOW|Clerk#000000372|0|ccounts cajole platelets. blithely special accounts boost. bold platelets ha +52999|737|F|206535.43|1992-04-26|4-NOT SPECIFIED|Clerk#000000761|0|y even ideas. blithely final warthogs detect across the furiously speci +53024|1195|F|289169.45|1992-05-13|4-NOT SPECIFIED|Clerk#000000043|0|fter the blithely special packages. slyly +53025|1162|F|74655.79|1993-03-18|1-URGENT|Clerk#000000462|0|ully final requests mold across the slyly bold foxes-- pending, pending +53026|446|F|130908.54|1992-02-27|5-LOW|Clerk#000000564|0|sits? ironic, final ideas sleep blithely along +53027|694|F|211423.69|1993-10-27|5-LOW|Clerk#000000750|0| according to the quickly ironic sauternes. thinly express instructions wake +53028|599|O|110923.43|1997-02-15|1-URGENT|Clerk#000000549|0|efully brave ideas. final, specia +53029|1313|F|250322.57|1994-07-28|5-LOW|Clerk#000000853|0|ts haggle quickly regular sheaves. regularly +53030|649|O|194331.64|1996-05-09|4-NOT SPECIFIED|Clerk#000000614|0|ole slyly. blithely pending asymptotes +53031|65|O|44090.30|1997-08-13|1-URGENT|Clerk#000000545|0|ts. slyly even ideas integrate above the quickly special accounts. slyly regu +53056|880|O|160291.80|1995-11-04|1-URGENT|Clerk#000000152|0|arefully beyond the final theodoli +53057|1000|F|238483.87|1993-07-21|1-URGENT|Clerk#000000735|0|ests. instructions cajo +53058|805|O|61323.82|1998-01-20|2-HIGH|Clerk#000000120|0|egular instructions along the blithely regular dinos ki +53059|352|O|173432.60|1997-03-29|1-URGENT|Clerk#000000804|0|ronic deposits. express dolphins nag blithely idly regular instructio +53060|571|F|186907.01|1993-03-23|1-URGENT|Clerk#000000878|0|e carefully regular warhorses. theodolites boost fluffily above +53061|35|O|182441.64|1995-07-26|3-MEDIUM|Clerk#000000576|0|dolites wake furiously about the quickly unusual theodolites. reg +53062|1051|F|184160.32|1994-08-15|1-URGENT|Clerk#000000803|0|carefully final packa +53063|397|O|65277.55|1997-02-02|4-NOT SPECIFIED|Clerk#000000550|0|areful ideas. carefully regular foxes sleep never pending dugouts. r +53088|767|O|234040.80|1995-12-09|3-MEDIUM|Clerk#000000115|0|y even deposits. carefully regular accounts cajol +53089|1414|O|32595.34|1998-04-13|1-URGENT|Clerk#000000073|0|ourts about the furiously final realms wake about the slyly regular re +53090|893|F|3587.18|1994-03-12|4-NOT SPECIFIED|Clerk#000000449|0|o beans sleep fluffily after the fu +53091|670|O|254572.86|1996-06-04|3-MEDIUM|Clerk#000000689|0|onic ideas wake furiously. special platelets according to the carefull +53092|77|O|48279.97|1997-12-30|1-URGENT|Clerk#000000796|0|beans boost slyly deposits. ent +53093|205|F|42511.84|1993-04-12|5-LOW|Clerk#000000045|0|zle against the unusual +53094|719|O|43488.29|1997-12-08|4-NOT SPECIFIED|Clerk#000000546|0|. furiously special ideas wake slyly idle deposits. furiously fin +53095|578|O|44252.96|1997-10-06|2-HIGH|Clerk#000000387|0|fluffily pending ideas sleep above the furiously even packages? regular +53120|440|F|111923.13|1992-05-18|4-NOT SPECIFIED|Clerk#000000325|0|ely even deposits. sly +53121|170|O|174499.35|1996-01-10|5-LOW|Clerk#000000551|0|atelets. carefully regular pinto beans must detect +53122|1333|O|46801.66|1995-07-07|4-NOT SPECIFIED|Clerk#000000419|0|lar accounts haggle quickly alongside of the carefully ironic packages. c +53123|236|F|118763.77|1994-09-01|4-NOT SPECIFIED|Clerk#000000921|0|he carefully regular escapades cajole fluffily bold foxes. furi +53124|25|F|48894.49|1993-01-04|4-NOT SPECIFIED|Clerk#000000159|0|s. even patterns haggle. furi +53125|1055|O|180100.15|1998-07-23|5-LOW|Clerk#000000489|0|posits between the ruthless frays dazzle slyly blithely +53126|71|F|11529.65|1994-11-29|4-NOT SPECIFIED|Clerk#000000817|0|past the carefully final accounts are sometimes among the carefully ironi +53127|175|P|148510.08|1995-05-12|2-HIGH|Clerk#000000775|0|slyly regular pearls. regular packages sublate +53152|1177|F|144076.57|1994-03-06|3-MEDIUM|Clerk#000000266|0| gifts. daringly unusual packages across the carefully regular requests boo +53153|8|F|193893.24|1994-09-24|1-URGENT|Clerk#000000306|0| unusual excuses haggle slyly final platelets. +53154|367|F|46202.92|1992-04-18|4-NOT SPECIFIED|Clerk#000000149|0| above the stealthily special platelets. blithely ironic requests nag ironi +53155|211|O|234489.90|1996-09-22|2-HIGH|Clerk#000000701|0| deposits detect carefully ironic requests +53156|65|F|68907.12|1992-03-11|4-NOT SPECIFIED|Clerk#000000984|0|y regular packages. slyly ruthless packages ca +53157|902|O|40902.81|1997-04-27|5-LOW|Clerk#000000750|0|ly express dependencies. furio +53158|166|O|234957.11|1997-04-13|3-MEDIUM|Clerk#000000532|0|gainst the slyly final pinto beans wake quickl +53159|1307|F|183185.21|1992-02-17|2-HIGH|Clerk#000000179|0|nic requests. regular t +53184|1279|O|118808.94|1998-02-07|3-MEDIUM|Clerk#000000105|0|es above the slyly +53185|371|F|93132.52|1993-11-28|5-LOW|Clerk#000000477|0|g packages are carefully slyly silent pinto beans. unusual cour +53186|1222|O|180755.34|1996-11-28|3-MEDIUM|Clerk#000000990|0|tes affix. furiousl +53187|239|F|109423.91|1993-11-08|1-URGENT|Clerk#000000872|0|odolites sleep blithely furiously final packages. fu +53188|941|F|59290.25|1992-11-06|2-HIGH|Clerk#000000234|0|requests. excuses print. blithely +53189|793|O|42090.56|1995-08-24|1-URGENT|Clerk#000000127|0|blithely regular de +53190|877|F|181220.38|1994-09-25|3-MEDIUM|Clerk#000000257|0|lar packages lose slyly express requests. boldly special platelets +53191|1129|F|189780.33|1993-02-05|2-HIGH|Clerk#000000403|0|as. even, bold theodolites across the furiously final asy +53216|121|F|217314.63|1992-12-05|2-HIGH|Clerk#000000084|0|s according to the carefu +53217|244|O|130589.89|1998-07-15|4-NOT SPECIFIED|Clerk#000000586|0|arefully special ideas wake slyly unusual p +53218|1177|F|101511.74|1994-04-11|1-URGENT|Clerk#000000793|0|refully even accounts. bold instructions alongside of t +53219|131|O|33050.06|1996-04-19|1-URGENT|Clerk#000000464|0| cajole carefully bold a +53220|553|O|197698.46|1997-07-12|4-NOT SPECIFIED|Clerk#000000528|0|tructions are carefully quickly final courts. ironic, special pinto b +53221|1432|F|268693.22|1992-02-27|4-NOT SPECIFIED|Clerk#000000234|0|kages. slyly regular waters haggle slyly slyly pending p +53222|1460|F|1799.10|1994-10-20|5-LOW|Clerk#000000992|0|s might are blithel +53223|1390|F|251060.31|1992-07-15|5-LOW|Clerk#000000209|0|even foxes. final, unusual depo +53248|382|F|268488.72|1993-10-30|1-URGENT|Clerk#000000016|0| ideas alongside of the theodolites e +53249|1309|F|58382.85|1992-09-15|5-LOW|Clerk#000000203|0|ously about the ironic pinto beans-- blithely unusual dol +53250|770|O|179928.92|1996-11-26|2-HIGH|Clerk#000000283|0|d packages. carefully regular +53251|899|F|33723.51|1995-03-28|1-URGENT|Clerk#000000579|0|carefully furiously regular deposits. slyly speci +53252|907|O|60714.70|1998-06-20|1-URGENT|Clerk#000000327|0|luffily final foxes ca +53253|214|O|142604.12|1998-07-03|4-NOT SPECIFIED|Clerk#000000056|0|ly. blithely regular deposits toward the unusual theodolites n +53254|1331|F|117564.02|1994-08-19|3-MEDIUM|Clerk#000000592|0| requests. quickly final courts haggle blithely slyly regular requests. expres +53255|901|O|160555.36|1997-07-01|2-HIGH|Clerk#000000096|0|ronic instructions. bold +53280|1462|F|112595.26|1995-01-09|2-HIGH|Clerk#000000690|0| use fluffily. bold, bold packages print. final foxes along the furiously spe +53281|79|F|145587.89|1994-04-03|1-URGENT|Clerk#000000655|0|out the unusual requests sleep carefully excuses. care +53282|473|F|61631.12|1994-08-02|2-HIGH|Clerk#000000476|0| final accounts are quickly fluffily ironic +53283|1|O|165928.33|1995-10-29|2-HIGH|Clerk#000000802|0|ged requests. slyly final platelets +53284|355|O|184776.38|1996-09-20|1-URGENT|Clerk#000000277|0|deas along the slyly express deposits run +53285|181|F|15511.55|1992-05-25|1-URGENT|Clerk#000000774|0|efully special ideas. notornis across the fluff +53286|1268|F|160678.45|1993-06-26|3-MEDIUM|Clerk#000000999|0|uietly excuses. special, express deposits wake regular +53287|1490|O|94233.18|1996-09-21|1-URGENT|Clerk#000000946|0|nstructions. blithely final requ +53312|145|F|168360.25|1994-07-05|3-MEDIUM|Clerk#000000721|0|quests wake blithely among the +53313|740|O|207627.36|1997-02-12|5-LOW|Clerk#000000331|0|arefully unusual requests sleep +53314|749|F|183418.09|1993-09-20|2-HIGH|Clerk#000000525|0|ound the slyly regular +53315|1360|O|108411.68|1995-07-30|2-HIGH|Clerk#000000207|0|lithely bold escapades wake fluffily according +53316|805|O|296624.19|1997-01-09|3-MEDIUM|Clerk#000000591|0|uickly regular deposits. blithely special accounts cajole slyly around the +53317|1291|F|107060.97|1994-11-21|1-URGENT|Clerk#000000876|0|use blithely regular platelets. carefully express theodolites int +53318|1412|F|38095.53|1992-12-03|5-LOW|Clerk#000000960|0|ns are according to the quickly express ideas. regular +53319|932|O|190683.24|1997-11-15|4-NOT SPECIFIED|Clerk#000000290|0|ccounts. furiously final requests wake slyly across the blithely regular packa +53344|922|F|190813.71|1993-02-25|2-HIGH|Clerk#000000798|0|ls. unusual packages +53345|589|O|100165.31|1997-02-20|4-NOT SPECIFIED|Clerk#000000814|0|ly special instructions. boldly final ide +53346|577|O|246355.95|1996-07-26|2-HIGH|Clerk#000000213|0|gle quickly foxes. unusual +53347|323|O|230405.42|1996-12-09|5-LOW|Clerk#000000622|0|onic requests boost slyly furiously pend +53348|565|O|40745.45|1997-08-30|4-NOT SPECIFIED|Clerk#000000408|0|refully ironic foxes. special packages haggle quickly packages. +53349|377|F|51362.07|1993-04-11|5-LOW|Clerk#000000609|0|cross the blithely r +53350|251|F|73189.67|1994-06-15|4-NOT SPECIFIED|Clerk#000000112|0|hely bold deposits are darin +53351|1429|F|248601.04|1992-06-24|5-LOW|Clerk#000000803|0| regular packages haggle furiously regular foxes. permanently regular p +53376|1489|O|190586.46|1997-08-12|5-LOW|Clerk#000000668|0|mptotes. regular, ironic re +53377|1058|O|199324.77|1998-07-26|1-URGENT|Clerk#000000410|0|ording to the carefully regular requests nag carefully final, pending accou +53378|856|F|212852.55|1992-07-14|3-MEDIUM|Clerk#000000004|0|sits cajole carefully. blithely special fo +53379|451|O|76138.97|1997-12-05|2-HIGH|Clerk#000000982|0| slyly final foxes. bold packages are according to the ironi +53380|1013|F|149644.92|1993-11-29|4-NOT SPECIFIED|Clerk#000000571|0|coys detect furiously along the final dugouts. carefully even warthogs cajol +53381|493|F|201190.85|1993-09-27|1-URGENT|Clerk#000000428|0| dependencies haggle a +53382|461|F|116088.95|1994-12-28|4-NOT SPECIFIED|Clerk#000000313|0|thely special asymptotes. accounts according to the ironic hockey players det +53383|433|O|118471.13|1996-08-09|4-NOT SPECIFIED|Clerk#000000882|0|refully final deposits haggle slyly rut +53408|655|F|37905.93|1993-09-16|3-MEDIUM|Clerk#000000154|0|unts are blithely. regular, final ideas aro +53409|973|O|8004.23|1996-02-17|4-NOT SPECIFIED|Clerk#000000641|0|snooze blithely. furiously silent requests boost express ideas. carefully +53410|1085|F|63743.13|1994-08-08|1-URGENT|Clerk#000000214|0| pending accounts. bold ac +53411|1226|O|82742.08|1995-11-30|1-URGENT|Clerk#000000263|0|fully regular foxes haggle across the ironic, s +53412|448|F|122987.73|1994-09-16|1-URGENT|Clerk#000000345|0|r, final pinto beans. u +53413|1123|O|192854.80|1996-04-18|2-HIGH|Clerk#000000077|0|ronic, even dependencies boost +53414|1171|O|206666.70|1996-09-25|3-MEDIUM|Clerk#000000491|0| requests wake at the carefully steal +53415|53|O|37362.78|1997-09-12|5-LOW|Clerk#000000447|0|, even packages haggle fluffily among the requests. platelets affi +53440|541|O|50083.42|1998-07-16|2-HIGH|Clerk#000000941|0|furiously permanent +53441|898|F|133031.76|1994-08-25|3-MEDIUM|Clerk#000000513|0|ions print blithely. furiously +53442|664|F|127974.08|1994-06-20|5-LOW|Clerk#000000961|0| regular instructions affix across the fluffily special hockey players. i +53443|1385|O|341771.74|1995-10-09|1-URGENT|Clerk#000000042|0|of the carefully pend +53444|298|O|53571.68|1997-10-22|2-HIGH|Clerk#000000478|0|ound the excuses. slyly regular excuses sleep furiously regular deposits-- b +53445|349|F|240599.55|1992-10-25|2-HIGH|Clerk#000000088|0|uriously regular excuses. regular, regular ideas nag quickly qui +53446|130|O|19024.04|1997-09-17|3-MEDIUM|Clerk#000000614|0|. fluffily final de +53447|637|O|130904.96|1998-02-23|3-MEDIUM|Clerk#000000357|0|onic deposits. furiously even pinto beans caj +53472|302|O|168596.93|1997-11-20|5-LOW|Clerk#000000402|0|l, regular foxes. final instructions eat blithely. slyly unusual deposits +53473|791|F|150282.76|1994-12-31|5-LOW|Clerk#000000547|0|sts. ironic requests alongside of the ideas co +53474|118|F|114470.08|1992-01-10|4-NOT SPECIFIED|Clerk#000000875|0|ts according to the c +53475|920|O|255966.65|1997-10-14|3-MEDIUM|Clerk#000000280|0|y final, idle patterns. foxes boost +53476|542|F|325557.13|1994-06-12|4-NOT SPECIFIED|Clerk#000000781|0|xpress ideas nag slyl +53477|625|F|65864.93|1992-05-06|2-HIGH|Clerk#000000185|0|encies are blithely against th +53478|311|O|63716.73|1996-08-23|2-HIGH|Clerk#000000972|0|tions nod. slyly regular accounts snooze accounts. +53479|1432|F|41218.64|1994-01-03|4-NOT SPECIFIED|Clerk#000000435|0| ironic theodolites. careful accounts boost. furiously ironic deposits han +53504|430|F|106687.56|1994-04-22|1-URGENT|Clerk#000000409|0|oss the furiously final account +53505|461|F|121819.10|1992-10-09|4-NOT SPECIFIED|Clerk#000000151|0| special instructions. deposits after the regular, even theodolites sleep +53506|1273|O|70979.86|1995-09-18|3-MEDIUM|Clerk#000000812|0|tegrate along the furiously special requests. even request +53507|796|O|203765.61|1997-01-28|5-LOW|Clerk#000000598|0|aggle slyly whithout the blithely regular warthogs +53508|1082|F|231540.07|1994-11-11|2-HIGH|Clerk#000000881|0|ajole regular theodolites. unusual, f +53509|1027|O|184630.11|1998-02-22|1-URGENT|Clerk#000000506|0| unusual requests. blithely bold account +53510|775|F|234669.71|1992-04-28|4-NOT SPECIFIED|Clerk#000000757|0|oxes haggle carefully along the carefully ironic +53511|532|F|186512.51|1994-02-21|3-MEDIUM|Clerk#000000121|0|e blithely! bold tithes according to the blithely unusual packages wake +53536|524|F|179460.30|1992-10-31|2-HIGH|Clerk#000000316|0| haggle carefully at the finally special packages. regular f +53537|430|O|115372.40|1998-07-27|4-NOT SPECIFIED|Clerk#000000956|0|he accounts. blithely even instructions may sleep carefully s +53538|1042|O|40042.91|1997-09-30|4-NOT SPECIFIED|Clerk#000000483|0|ecial, ironic deposits ab +53539|464|P|200794.44|1995-03-15|5-LOW|Clerk#000000112|0|ole blithely. furiously regular depos +53540|1087|F|20131.98|1993-02-22|5-LOW|Clerk#000000448|0|hely ironic ideas. fluffily ironic dep +53541|1033|F|68870.92|1994-01-13|3-MEDIUM|Clerk#000000101|0| requests serve unusual, express accounts. sly +53542|212|O|171179.31|1998-05-07|1-URGENT|Clerk#000000124|0|wake carefully across the carefully final ideas. quickly express requ +53543|829|F|81564.24|1994-01-19|1-URGENT|Clerk#000000694|0|cajole carefully unusual, +53568|97|F|128763.00|1993-06-29|3-MEDIUM|Clerk#000000494|0|ites. express, pending p +53569|1390|O|159467.33|1997-09-27|1-URGENT|Clerk#000000979|0|ously regular, express in +53570|269|O|172072.09|1996-09-07|3-MEDIUM|Clerk#000000857|0|yly after the regular somas. blithely expr +53571|520|F|182669.21|1992-03-16|4-NOT SPECIFIED|Clerk#000000177|0| slyly. slyly bold accounts according to the slyly ruthless pinto beans +53572|590|F|41430.12|1993-05-08|3-MEDIUM|Clerk#000000827|0|after the regular, +53573|130|F|3102.14|1994-03-16|4-NOT SPECIFIED|Clerk#000000039|0|hely express deposits boost quickly; blithely express +53574|1141|F|45899.75|1992-04-10|3-MEDIUM|Clerk#000000293|0| beans affix fluffily requests. furiously final foxes haggle carefully ex +53575|925|O|50135.43|1997-11-15|4-NOT SPECIFIED|Clerk#000000879|0|fluffily among the slyly pending pinto bean +53600|616|F|223767.17|1992-07-11|3-MEDIUM|Clerk#000000752|0|xes. slyly ironic requests detect. +53601|604|O|4862.14|1997-06-29|4-NOT SPECIFIED|Clerk#000000069|0| unwind carefully. even packages sleep +53602|1136|F|36211.42|1993-06-15|1-URGENT|Clerk#000000560|0|pecial packages above the evenly +53603|1396|O|242534.82|1995-06-03|4-NOT SPECIFIED|Clerk#000000371|0|n about the carefully ironic orbits. carefully ironic platelets among th +53604|1343|O|12501.71|1995-08-15|3-MEDIUM|Clerk#000000501|0|haggle slyly platelets. accounts cajole fin +53605|925|F|187073.61|1993-08-04|3-MEDIUM|Clerk#000000764|0|kly blithely bold deposits. requests haggle s +53606|877|O|89896.58|1997-03-22|3-MEDIUM|Clerk#000000906|0|. furiously ironic ideas integrate quietly even, special instructions. p +53607|481|O|50128.99|1996-01-08|3-MEDIUM|Clerk#000000142|0|ly pending deposits haggle ruthlessly bold excuses. pending, iron +53632|721|F|11717.80|1992-11-22|1-URGENT|Clerk#000000426|0|c pinto beans wake quickly slyly regular depen +53633|403|O|71613.51|1997-08-05|4-NOT SPECIFIED|Clerk#000000894|0|ainments cajole blithely. carefully final platelets nag. instructio +53634|1457|F|19348.11|1995-02-22|5-LOW|Clerk#000000997|0|posits maintain quickly after the quick +53635|373|F|71071.11|1992-07-19|4-NOT SPECIFIED|Clerk#000000863|0|ly! furiously regular dependencies believe furiously regular foxes. +53636|907|O|83844.77|1996-01-10|4-NOT SPECIFIED|Clerk#000000741|0|kages sleep quickly across the regular, +53637|592|P|179550.87|1995-03-18|2-HIGH|Clerk#000000354|0|he carefully ironic ideas. quickly final platelets affix alongsid +53638|1253|O|106264.65|1997-02-01|2-HIGH|Clerk#000000885|0|ent accounts. slyly unusual req +53639|104|O|185142.15|1996-09-23|3-MEDIUM|Clerk#000000982|0|ironic pinto beans nag blithely! slyly pending excuses wake +53664|152|O|13968.28|1996-08-12|5-LOW|Clerk#000000196|0|n accounts-- fluffily express accounts aft +53665|322|O|200757.72|1998-02-20|2-HIGH|Clerk#000000061|0|s. bold, regular theodolites above the +53666|121|O|158258.11|1997-07-21|1-URGENT|Clerk#000000538|0|pinto beans. dugouts after the silently ironic foxes cajole abo +53667|562|F|112205.43|1992-05-18|3-MEDIUM|Clerk#000000581|0|e theodolites. bold dolphins sleep quickly about the slyly ironi +53668|1052|F|189376.64|1993-04-01|4-NOT SPECIFIED|Clerk#000000302|0| against the express, s +53669|1075|O|264262.73|1998-03-15|2-HIGH|Clerk#000000427|0|refully pending courts. regular se +53670|358|F|6722.27|1993-11-14|3-MEDIUM|Clerk#000000829|0|s. furiously ironic accounts haggle blithely acco +53671|226|P|186248.12|1995-06-11|3-MEDIUM|Clerk#000000642|0|its sleep carefully requests: ideas eat behind the p +53696|562|F|215495.63|1993-12-11|4-NOT SPECIFIED|Clerk#000000276|0|y. quickly bold packages affix quickly express excuses. slyly special depos +53697|619|F|21630.58|1992-12-31|1-URGENT|Clerk#000000641|0|into beans. special pinto beans are regular theodolites. slyly specia +53698|73|F|152682.78|1992-06-17|3-MEDIUM|Clerk#000000711|0|sts kindle slyly about the c +53699|1163|O|172883.45|1996-10-10|3-MEDIUM|Clerk#000000875|0| final deposits! carefully regular ideas p +53700|148|O|71165.57|1996-12-18|1-URGENT|Clerk#000000081|0|cross the furiously regul +53701|19|O|139056.73|1998-02-23|1-URGENT|Clerk#000000222|0|riously final requests about th +53702|266|F|96880.39|1994-04-27|2-HIGH|Clerk#000000894|0|ctions breach. regular, express pinto beans wake across the carefull +53703|989|F|100842.63|1993-06-15|4-NOT SPECIFIED|Clerk#000000385|0|y regular pinto beans use slyly in +53728|1081|O|141464.55|1995-10-23|2-HIGH|Clerk#000000115|0| even packages. fluffily express pinto beans af +53729|1414|O|63420.94|1997-01-13|5-LOW|Clerk#000000605|0| pending courts. quickly even i +53730|433|F|157788.63|1992-12-30|2-HIGH|Clerk#000000185|0|y special accounts. bold asymptotes boost regular, final instr +53731|352|O|102579.87|1998-03-10|3-MEDIUM|Clerk#000000590|0| across the silent accounts. fluffily express ideas use carefully +53732|337|O|71427.47|1995-06-22|3-MEDIUM|Clerk#000000269|0|ironic dependencies affix slyly alon +53733|352|O|206539.56|1997-02-21|5-LOW|Clerk#000000363|0|ress instructions against the +53734|1219|O|53011.92|1997-03-13|1-URGENT|Clerk#000000013|0|r packages haggle around the quickly unusual ins +53735|1495|O|10371.28|1997-01-21|1-URGENT|Clerk#000000791|0|-- permanent frays cajole slyly epitaphs +53760|37|O|156160.33|1996-03-19|3-MEDIUM|Clerk#000000746|0|haggle. quickly special requests are pe +53761|1361|O|71277.46|1995-04-12|2-HIGH|Clerk#000000708|0|. blithe packages haggle slyly af +53762|481|F|117287.06|1992-06-02|1-URGENT|Clerk#000000026|0|ts haggle quickly alo +53763|157|O|104203.16|1996-06-16|3-MEDIUM|Clerk#000000513|0|ilent instructions up the slyly e +53764|1319|O|124802.22|1997-04-13|2-HIGH|Clerk#000000163|0|nst the quickly pendi +53765|1247|F|159811.55|1993-10-19|2-HIGH|Clerk#000000948|0|ly final excuses haggle bl +53766|572|F|82006.94|1994-10-14|4-NOT SPECIFIED|Clerk#000000112|0|ets. slyly regular dependenci +53767|151|O|161951.91|1995-08-27|4-NOT SPECIFIED|Clerk#000000485|0|final platelets lose slyly pending pinto beans. regular dependencies cajol +53792|634|O|130701.45|1998-05-31|5-LOW|Clerk#000000686|0|gular instructions. regular requests are furiously. ironic, i +53793|982|F|106618.38|1994-11-10|3-MEDIUM|Clerk#000000770|0|e furiously special foxes was furiously brav +53794|121|O|178424.83|1997-09-10|3-MEDIUM|Clerk#000000077|0|s: express deposits wake fluffily during the s +53795|733|F|162344.75|1992-01-31|2-HIGH|Clerk#000000769|0|ts across the caref +53796|1028|F|17023.48|1993-06-16|1-URGENT|Clerk#000000024|0| daring deposits lose slyly. pinto beans haggle blithely. fu +53797|121|F|214625.07|1994-10-02|1-URGENT|Clerk#000000260|0| sleep permanently bold requests. sly theodolites along the slyly even foxes +53798|691|F|158640.32|1994-04-20|5-LOW|Clerk#000000272|0|n theodolites. slyly ironic packages hag +53799|764|O|239139.14|1996-12-15|4-NOT SPECIFIED|Clerk#000000471|0|aringly pending acc +53824|277|O|29801.18|1997-06-04|4-NOT SPECIFIED|Clerk#000000399|0| blithely. express excuses x +53825|1336|P|161479.71|1995-04-10|5-LOW|Clerk#000000134|0|elets should have to mold quietly carefully express de +53826|799|O|123303.06|1996-11-14|3-MEDIUM|Clerk#000000219|0|quickly unusual accounts. carefully regular fox +53827|848|O|89104.96|1997-12-12|2-HIGH|Clerk#000000681|0|de of the regular, ironic packages. bold deposits are caref +53828|521|O|70360.58|1996-06-05|1-URGENT|Clerk#000000961|0|cial ideas over the quietly ironic packages sleep furiously final pla +53829|1072|O|178867.52|1997-03-07|1-URGENT|Clerk#000000275|0| slyly regular ideas +53830|1220|F|114149.48|1993-08-29|4-NOT SPECIFIED|Clerk#000000927|0|nto beans x-ray carefully. thin dep +53831|1052|O|282851.75|1998-03-16|2-HIGH|Clerk#000000868|0|carefully. fluffily pending requests nag under the +53856|286|O|73362.93|1996-05-04|1-URGENT|Clerk#000000984|0|ending instructions. blithely final pinto beans at the slyly regular accou +53857|454|O|238849.44|1996-03-28|2-HIGH|Clerk#000000472|0|imes silent asymptotes are qui +53858|1102|O|33988.80|1998-06-06|2-HIGH|Clerk#000000532|0|foxes. slyly regular dependencies cajole bli +53859|716|F|34415.23|1993-05-18|5-LOW|Clerk#000000877|0|kly along the accounts. ca +53860|1103|F|5579.21|1994-01-18|1-URGENT|Clerk#000000769|0|uickly special accounts. slyly unusual re +53861|190|O|183843.78|1996-03-23|3-MEDIUM|Clerk#000000593|0|sheaves about the carefully bold acco +53862|1078|O|173858.32|1996-07-09|2-HIGH|Clerk#000000832|0|unusual accounts. furiously silent theod +53863|902|F|187793.10|1993-06-04|2-HIGH|Clerk#000000879|0|requests! furiously special dinos integrate carefully after the fluffily regul +53888|839|O|294586.97|1997-02-02|4-NOT SPECIFIED|Clerk#000000257|0|lites are doggedly ironic, pending instructions. +53889|880|O|180627.06|1997-02-13|5-LOW|Clerk#000000034|0|ld sleep. slyly bold packages haggle bravely along the carefully regular dep +53890|1288|O|227974.43|1998-01-26|5-LOW|Clerk#000000337|0|mong the final decoys. i +53891|1094|F|145931.82|1994-01-23|2-HIGH|Clerk#000000528|0|ronic ideas sleep furiously along t +53892|1120|O|118085.62|1998-03-21|1-URGENT|Clerk#000000864|0|ly final dolphins. blithely +53893|595|O|47334.85|1998-01-10|2-HIGH|Clerk#000000941|0|odolites. fluffily silent +53894|907|F|245390.91|1994-07-08|1-URGENT|Clerk#000000013|0|odolites wake quickly. quickly unusua +53895|1258|O|101715.80|1995-09-05|4-NOT SPECIFIED|Clerk#000000200|0|ntain along the foxes. quickly even hockey players cajole quickly fluffily eve +53920|742|F|351797.60|1994-03-19|1-URGENT|Clerk#000000843|0|pecial requests are slyly. +53921|1312|F|20473.53|1992-09-22|1-URGENT|Clerk#000000673|0|ccording to the iron +53922|1070|O|240916.68|1996-09-21|2-HIGH|Clerk#000000661|0|ously ironic accounts affix according to the unusual theodolite +53923|454|O|124160.99|1997-09-19|1-URGENT|Clerk#000000070|0| across the carefully even accounts engage slyly +53924|1069|O|153175.81|1996-12-18|2-HIGH|Clerk#000000426|0| accounts are quickly sly +53925|625|O|212598.26|1997-01-23|5-LOW|Clerk#000000244|0|ver bold pinto beans. blithely reg +53926|661|O|54203.89|1996-07-31|1-URGENT|Clerk#000000963|0|sleep idly express packages. final foxe +53927|1318|O|179582.48|1995-07-06|3-MEDIUM|Clerk#000000253|0|bold instructions. blithely even requests are quickly regular packages. slyly +53952|931|O|279089.45|1997-11-19|2-HIGH|Clerk#000000242|0|yly even dolphins. requests wa +53953|1195|F|265253.44|1994-03-28|4-NOT SPECIFIED|Clerk#000000541|0| bold deposits integrate. regular foxes boost furious +53954|1462|O|49460.88|1997-08-19|3-MEDIUM|Clerk#000000758|0|tions beside the furiousl +53955|961|F|20920.80|1995-03-05|1-URGENT|Clerk#000000334|0|fter the slyly express theodolites. busy patterns sleep dolphins. si +53956|1348|O|299476.84|1995-08-09|2-HIGH|Clerk#000000404|0|structions. blithely express request +53957|7|O|121277.09|1997-10-16|1-URGENT|Clerk#000000068|0|telets wake. furiously final platelets u +53958|154|O|235882.98|1997-12-26|2-HIGH|Clerk#000000160|0|riously pending ideas wake. idly idle requests are quickly. quickl +53959|20|O|273295.48|1997-02-18|3-MEDIUM|Clerk#000000549|0|refully pending requests. ironic theodolites boost carefully above the foxes. +53984|415|F|48207.71|1992-12-11|3-MEDIUM|Clerk#000000040|0|s wake about the blithely final +53985|1042|O|287397.23|1996-11-12|1-URGENT|Clerk#000000562|0|rs. furiously even +53986|796|F|179082.15|1993-12-01|2-HIGH|Clerk#000000258|0|leep carefully above the care +53987|176|F|5468.99|1993-02-17|4-NOT SPECIFIED|Clerk#000000737|0|arefully above the blithely unusual pinto beans. +53988|589|F|76857.35|1992-01-02|3-MEDIUM|Clerk#000000182|0|fter the quickly express instructions are pe +53989|83|O|54192.58|1996-12-29|3-MEDIUM|Clerk#000000808|0|s. blithely express warhorses against the blithely regular asymptotes are furi +53990|1069|F|99957.13|1992-11-02|4-NOT SPECIFIED|Clerk#000000559|0|to beans. sheaves are blithely deposits. carefully final packages acr +53991|1271|F|31681.80|1994-04-01|2-HIGH|Clerk#000000113|0|ent deposits. furiously bold courts about the quic +54016|178|O|79725.53|1996-09-13|3-MEDIUM|Clerk#000000553|0|requests. blithely regular deposits sleep sl +54017|599|O|128796.97|1997-11-04|1-URGENT|Clerk#000000830|0|furiously. stealthy, silent requests impress inside the furiously ironic pac +54018|4|O|50422.56|1998-06-24|2-HIGH|Clerk#000000892|0|iously express deposits dazzle furiousl +54019|382|F|119968.88|1994-07-02|5-LOW|Clerk#000000076|0|xpress deposits. blithely bold accounts integrate +54020|292|F|106257.14|1992-02-01|5-LOW|Clerk#000000257|0|equests. regular packages maintain carefully bold ac +54021|316|F|3794.77|1993-10-15|5-LOW|Clerk#000000418|0|y. final, bold packages around the carefully e +54022|1066|O|39189.98|1996-10-15|2-HIGH|Clerk#000000689|0|ly theodolites. blithely regular ideas boost slyly according +54023|925|F|60721.26|1992-07-23|4-NOT SPECIFIED|Clerk#000000748|0|s deposits mold fluffily across the blithely reg +54048|1084|F|129990.77|1992-11-17|4-NOT SPECIFIED|Clerk#000000880|0|equests. even deposits across the regular requests are +54049|724|F|77714.75|1993-10-07|5-LOW|Clerk#000000445|0|aggle silently. realms cajole quickly among the slyly pending pack +54050|1052|O|121420.43|1997-06-04|2-HIGH|Clerk#000000093|0|ly bold foxes. accounts affix carefully slyly +54051|1222|O|302637.53|1995-08-12|3-MEDIUM|Clerk#000000525|0|olites nag alongside of the carefully special ideas. u +54052|737|O|217776.51|1996-07-20|1-URGENT|Clerk#000000374|0|grate carefully pending pinto beans. furiously final pains +54053|686|F|311397.89|1992-02-15|2-HIGH|Clerk#000000491|0| ideas snooze. fluffily final accou +54054|1147|O|130331.75|1996-01-18|4-NOT SPECIFIED|Clerk#000000172|0|ess deposits-- slyly ironi +54055|781|F|52403.85|1994-02-14|1-URGENT|Clerk#000000925|0|accounts mold carefully carefully even theodolites. accoun +54080|170|F|10012.88|1994-07-03|2-HIGH|Clerk#000000749|0|e slyly even pinto beans. requests +54081|829|P|164187.42|1995-03-11|5-LOW|Clerk#000000612|0|es. carefully ironic platelets unwind furiously ironic deposits. foxes nod s +54082|196|F|204726.67|1993-07-11|2-HIGH|Clerk#000000816|0|lar, final instructions. quickly even deposits subla +54083|602|O|153434.95|1995-07-22|2-HIGH|Clerk#000000862|0|gular accounts cajole furiously according to the slyly bold req +54084|1172|O|109991.83|1995-09-11|1-URGENT|Clerk#000000073|0|to beans cajole slyly along the finally final foxes. slyly regular package +54085|805|O|70122.09|1995-10-08|5-LOW|Clerk#000000864|0|ily. regular, special packa +54086|238|F|335093.41|1992-09-07|5-LOW|Clerk#000000789|0|l theodolites use. requests h +54087|587|O|249329.60|1998-07-03|2-HIGH|Clerk#000000649|0|xes upon the blithely regular accounts detect carefully according to the +54112|440|O|214223.26|1998-06-03|4-NOT SPECIFIED|Clerk#000000250|0|ans. dependencies are slyly. slyly express foxes grow fluff +54113|961|O|181889.43|1997-09-24|5-LOW|Clerk#000000813|0|lar dependencies against the quietly fi +54114|412|F|58398.07|1994-09-20|5-LOW|Clerk#000000671|0|ve the carefully final packages. final, regular accounts toward the exp +54115|791|F|190349.91|1992-01-08|5-LOW|Clerk#000000109|0| bold instructions sleep slyly +54116|508|O|211631.51|1995-11-04|1-URGENT|Clerk#000000751|0|fully special excuses cajole furiously furiously pending fr +54117|1202|O|8356.03|1998-06-08|3-MEDIUM|Clerk#000000177|0|ic accounts according +54118|704|O|140153.09|1998-03-01|4-NOT SPECIFIED|Clerk#000000332|0|yly final platelets. furiously regular multipliers alongside of the +54119|736|F|177564.67|1993-05-23|3-MEDIUM|Clerk#000000128|0|even deposits. pending instructions m +54144|724|F|37343.66|1994-10-19|3-MEDIUM|Clerk#000000067|0| ironic packages. express excuses wake +54145|1073|F|272501.94|1993-01-03|5-LOW|Clerk#000000969|0|nts. quickly final deposits are busily. quickly spe +54146|1000|F|217119.01|1993-10-19|5-LOW|Clerk#000000952|0| carefully blithely final pinto beans. carefully even +54147|1375|O|191260.39|1997-05-07|2-HIGH|Clerk#000000238|0|x furiously unusual accounts. sometimes even +54148|61|O|59041.42|1996-10-28|1-URGENT|Clerk#000000824|0|ly ironic packages detect furiously against the fur +54149|439|O|90199.64|1996-03-05|3-MEDIUM|Clerk#000000143|0| deposits. furiously thin pinto beans are. blithely even theodolites nag +54150|1354|O|75319.94|1995-06-23|1-URGENT|Clerk#000000379|0|ealthily silent deposits. blithely u +54151|1186|F|176493.43|1994-09-03|1-URGENT|Clerk#000000460|0|unts. pending ideas haggle carefully against the slyly f +54176|232|O|58971.80|1995-06-28|4-NOT SPECIFIED|Clerk#000000387|0| furiously. blithely special requests wake quickly special platelets. +54177|989|F|222889.83|1992-01-26|1-URGENT|Clerk#000000826|0|bold requests; blit +54178|1201|O|201522.66|1996-02-21|4-NOT SPECIFIED|Clerk#000000559|0|ar pinto beans. fur +54179|1289|O|60073.44|1995-03-15|5-LOW|Clerk#000000763|0|final ideas sleep final, regular platelets. unusual pinto beans are +54180|670|F|113196.21|1992-10-23|1-URGENT|Clerk#000000052|0|refully final foxes. fluffily +54181|824|F|246457.64|1992-05-19|2-HIGH|Clerk#000000963|0|cial instructions. express theodolites haggle furiously regu +54182|364|O|240758.36|1998-06-16|4-NOT SPECIFIED|Clerk#000000759|0|r accounts! carefully final asymptotes haggle quick +54183|454|F|256086.95|1992-04-16|1-URGENT|Clerk#000000101|0| carefully even excuses. ironic pinto beans was along t +54208|1246|O|157093.10|1998-05-29|2-HIGH|Clerk#000000264|0|ic accounts cajole carefully ironic, ironic requ +54209|523|F|165893.31|1992-08-16|3-MEDIUM|Clerk#000000675|0| deposits poach furiously from the fluffily unusual warhorses? fu +54210|1252|F|20534.15|1993-10-05|3-MEDIUM|Clerk#000000340|0|uriously final courts. b +54211|331|O|79786.26|1996-04-05|5-LOW|Clerk#000000227|0|te over the quickly bold deposits. slyly bold dependencies wake ironic +54212|421|F|124729.84|1994-03-13|5-LOW|Clerk#000000038|0|quests cajole blithely about the regular dolphins. acc +54213|292|F|97036.13|1995-02-04|4-NOT SPECIFIED|Clerk#000000102|0|ages. slyly express platelets against t +54214|874|F|57276.82|1992-01-03|3-MEDIUM|Clerk#000000194|0| ironic excuses. requests among the theodolit +54215|1495|O|126697.48|1995-10-22|2-HIGH|Clerk#000000990|0|s? even, final instructions +54240|1040|O|96409.50|1996-05-10|4-NOT SPECIFIED|Clerk#000000094|0|ong the furiously unusual foxes. care +54241|649|F|172368.57|1992-07-29|4-NOT SPECIFIED|Clerk#000000622|0|y special asymptotes need to use alongside of the pend +54242|100|O|183377.45|1998-03-31|3-MEDIUM|Clerk#000000970|0|usual theodolites haggle instructions. ideas sleep carefully ironic r +54243|277|F|80677.00|1994-09-17|5-LOW|Clerk#000000457|0|ns. furiously regula +54244|223|O|79618.36|1996-04-03|5-LOW|Clerk#000000298|0|lphins wake quickly quick instructions +54245|53|P|106578.32|1995-03-25|3-MEDIUM|Clerk#000000828|0|into beans haggle blithely against the platelets. closely pending pack +54246|1099|F|45727.63|1993-06-30|1-URGENT|Clerk#000000141|0|s. final, express theodolites wake requests. regular req +54247|193|O|246090.44|1997-04-16|1-URGENT|Clerk#000000404|0|ep blithely ironic deposits? fluffily express requests wake +54272|266|O|73321.98|1997-08-12|4-NOT SPECIFIED|Clerk#000000559|0|l packages. regular, bold deposi +54273|1273|O|135497.11|1998-05-15|4-NOT SPECIFIED|Clerk#000000944|0|kly pending packages ac +54274|1402|F|208798.86|1993-11-24|4-NOT SPECIFIED|Clerk#000000061|0|lyly final pinto beans; blithely blithe instructions are quickly blithely even +54275|887|F|64784.74|1993-01-03|5-LOW|Clerk#000000656|0|sily even packages detect according to the enticingly regular d +54276|932|F|152388.88|1993-02-07|4-NOT SPECIFIED|Clerk#000000033|0|r the daringly even accounts print blithely acr +54277|304|F|255733.15|1993-01-03|1-URGENT|Clerk#000000163|0|bove the deposits. carefully unusual sheaves cajole bli +54278|55|O|215399.43|1997-05-08|5-LOW|Clerk#000000617|0|haggle fluffily against the ca +54279|1072|O|148252.23|1995-07-31|2-HIGH|Clerk#000000394|0|he sometimes pending requests. dependencies daz +54304|508|F|99283.88|1993-02-18|2-HIGH|Clerk#000000861|0|ely express attainments nag furiously about the express theodolites. special, +54305|1454|O|126813.88|1997-08-12|5-LOW|Clerk#000000123|0|symptotes. pending accounts +54306|889|F|66967.45|1992-06-09|3-MEDIUM|Clerk#000000641|0|ven theodolites run. accounts haggle carefully about the daringly final e +54307|988|F|209670.97|1992-01-09|2-HIGH|Clerk#000000085|0|lithely. carefully even packages are +54308|295|O|241884.88|1996-03-02|5-LOW|Clerk#000000132|0|lithely express theodolites boost ca +54309|698|F|107315.00|1992-06-26|3-MEDIUM|Clerk#000000023|0|ccounts. furiously unusual deposits wake slyly regular deposits +54310|787|O|162669.48|1998-04-04|5-LOW|Clerk#000000643|0|press, bold instructions haggle along the foxe +54311|904|O|269270.41|1998-01-05|3-MEDIUM|Clerk#000000126|0|arefully. instructions could have to dazzle. unusu +54336|190|F|114101.06|1993-04-16|3-MEDIUM|Clerk#000000147|0|players. slyly express asymptotes are fluffil +54337|1373|O|139235.75|1996-08-02|1-URGENT|Clerk#000000143|0| permanent packages are nev +54338|1078|O|161480.02|1998-01-05|2-HIGH|Clerk#000000646|0| regular requests. deposits boost. silent courts nod slyly across the bold +54339|469|F|231117.30|1992-05-03|5-LOW|Clerk#000000247|0|s unwind inside the final packages. blithely regular accounts +54340|995|F|48668.69|1993-11-10|3-MEDIUM|Clerk#000000458|0|jole fluffily across the dolphins. express theodolites po +54341|973|F|124363.21|1992-04-23|2-HIGH|Clerk#000000947|0|sts. blithely regular accounts nod +54342|877|F|163927.52|1994-06-09|5-LOW|Clerk#000000187|0|ng the blithely final in +54343|472|O|250858.39|1998-07-30|4-NOT SPECIFIED|Clerk#000000975|0| furiously final deposits det +54368|34|O|308920.79|1995-11-02|4-NOT SPECIFIED|Clerk#000000026|0|play slyly on the fluffily +54369|1123|F|95434.13|1994-03-03|4-NOT SPECIFIED|Clerk#000000828|0|dencies impress blithel +54370|1291|F|140804.73|1992-04-09|4-NOT SPECIFIED|Clerk#000000411|0|intain above the carefully silent requests. pending accounts cajole alon +54371|661|F|101446.53|1992-02-16|4-NOT SPECIFIED|Clerk#000000941|0|ly carefully special deposits. slyly bold pains +54372|557|P|244775.72|1995-03-24|1-URGENT|Clerk#000000729|0|sts haggle against the slyly bold packages. final, +54373|1124|O|53838.78|1998-01-08|4-NOT SPECIFIED|Clerk#000000145|0|inal deposits are fluffily along the slyly pending accounts! unusual, +54374|241|O|139087.37|1997-07-29|2-HIGH|Clerk#000000862|0|latelets. unusual idea +54375|718|O|152240.00|1997-05-25|5-LOW|Clerk#000000528|0|packages integrate pending pinto bea +54400|10|O|132173.75|1997-07-09|3-MEDIUM|Clerk#000000675|0| the final, express deposits-- blithely r +54401|97|O|190482.19|1995-12-05|2-HIGH|Clerk#000000237|0|s! slyly pending excuses against the furiously regular a +54402|1247|O|197304.15|1996-10-11|3-MEDIUM|Clerk#000000021|0|ng the carefully bol +54403|725|O|52071.98|1996-02-19|4-NOT SPECIFIED|Clerk#000000109|0|lyly furious requests. +54404|4|O|182306.44|1998-02-13|5-LOW|Clerk#000000319|0|kages affix after the furiously pending packages. slyly regular deposits wak +54405|496|F|107404.04|1994-06-01|3-MEDIUM|Clerk#000000025|0|e slyly ironic packages? slyly regular deposits w +54406|1304|O|292040.50|1995-06-02|4-NOT SPECIFIED|Clerk#000000629|0|tes wake blithely. slyly regular requests haggle i +54407|346|F|142358.61|1993-06-17|3-MEDIUM|Clerk#000000231|0|ounts. even pinto beans above the sl +54432|1372|O|65765.82|1996-03-09|1-URGENT|Clerk#000000637|0|lly final theodolites haggle qu +54433|1414|O|125265.28|1997-09-24|2-HIGH|Clerk#000000957|0|tions sleep. ironic accounts haggle furious +54434|415|F|86074.20|1994-09-14|5-LOW|Clerk#000000021|0|orges wake carefully regular accounts. blithely express depo +54435|1451|O|182118.32|1997-04-20|4-NOT SPECIFIED|Clerk#000000512|0|sts along the final packages cajole according to the careful +54436|104|F|214506.69|1994-09-20|2-HIGH|Clerk#000000235|0|osits wake slyly furiously regular deposits. carefully even deposits wake c +54437|718|F|93422.56|1993-12-20|2-HIGH|Clerk#000000771|0|ending packages sleep carefully speci +54438|1117|F|147192.59|1993-02-15|5-LOW|Clerk#000000520|0|accounts grow fluffily. busily busy deposits +54439|1436|O|153127.30|1998-05-02|1-URGENT|Clerk#000000223|0|ans. fluffily silent accounts nod blithely ironic +54464|776|F|241654.23|1994-09-02|2-HIGH|Clerk#000000457|0| accounts wake blithely along the furiously ironic packages. fluffil +54465|631|O|23752.22|1997-08-10|2-HIGH|Clerk#000000018|0|final packages engage bl +54466|976|O|28061.15|1997-07-21|3-MEDIUM|Clerk#000000176|0|instructions wake carefully. ideas integrate. regular theodolites detect bli +54467|71|F|123344.67|1993-10-19|5-LOW|Clerk#000000208|0| along the quickly fluffy instructions wake carefully above the sly +54468|1234|F|182577.24|1994-12-15|2-HIGH|Clerk#000000060|0|ickly final foxes. furiously regular courts kindle furiously b +54469|667|O|71690.36|1997-08-02|2-HIGH|Clerk#000000030|0|ainst the ironic platelets. sl +54470|686|O|44824.63|1997-12-05|4-NOT SPECIFIED|Clerk#000000409|0|tegrate never carefully ironic braids. bravely pending acco +54471|943|F|204089.25|1992-09-05|4-NOT SPECIFIED|Clerk#000000682|0|r the accounts. fluffily +54496|1372|O|50974.79|1995-12-10|2-HIGH|Clerk#000000098|0|fully unusual deposits. slyly special theodolites wake! blithely pending pint +54497|898|F|105585.88|1993-01-20|4-NOT SPECIFIED|Clerk#000000290|0|nts among the idly unusual deposits cajole after the closely +54498|1354|O|170279.68|1996-02-15|1-URGENT|Clerk#000000497|0|uriously even accounts boost along the +54499|949|F|186126.31|1993-04-06|4-NOT SPECIFIED|Clerk#000000533|0|k warthogs cajole quickly. slyly enticing dep +54500|946|O|36678.53|1997-09-13|2-HIGH|Clerk#000000626|0| regular requests according to the fluffily unusual instructions sleep b +54501|370|F|57715.78|1992-11-30|1-URGENT|Clerk#000000754|0|ly. ironic ideas haggle furiously carefully regular instructions. unusual, sp +54502|529|O|201291.69|1995-10-01|5-LOW|Clerk#000000915|0|ss braids. pending, slow theodoli +54503|406|F|214236.12|1994-07-17|1-URGENT|Clerk#000000984|0| foxes. doggedly pending ideas are c +54528|1049|F|171194.04|1995-01-05|3-MEDIUM|Clerk#000000237|0| regular excuses. carefully f +54529|1129|O|195217.42|1997-06-07|5-LOW|Clerk#000000200|0|egular accounts. fluffily even ideas boost slyly. qui +54530|769|F|48967.02|1992-09-20|1-URGENT|Clerk#000000483|0| carefully express deposits cajole. pains cajole fur +54531|587|O|202979.85|1996-02-05|5-LOW|Clerk#000000307|0|uriously. quickly regular requests cajole quietl +54532|400|O|151740.96|1998-02-10|3-MEDIUM|Clerk#000000042|0|ly about the furiously regular pinto beans. even warhorses are according +54533|19|O|161015.75|1995-12-19|3-MEDIUM|Clerk#000000643|0|y ruthless braids. silent, regular platelet +54534|181|F|31588.37|1992-03-20|4-NOT SPECIFIED|Clerk#000001000|0|g the furiously ironic instructions-- furio +54535|251|O|7406.53|1996-02-08|1-URGENT|Clerk#000000850|0|o beans haggle quickly unusual, silent depos +54560|1429|F|119471.92|1994-07-17|1-URGENT|Clerk#000000084|0|boost after the fluffily r +54561|340|O|156665.60|1998-04-10|5-LOW|Clerk#000000094|0|ithely unusual ideas haggle slyly-- slyly pending d +54562|751|O|140260.59|1996-11-08|4-NOT SPECIFIED|Clerk#000000385|0|cial notornis detect quickly about the carefully regu +54563|430|F|358340.33|1993-10-05|1-URGENT|Clerk#000000987|0|ckly silent deposit +54564|886|F|120495.79|1993-12-07|2-HIGH|Clerk#000000024|0|y special pinto beans according to the regular deposits +54565|1453|O|146662.10|1996-06-15|5-LOW|Clerk#000000128|0|are carefully even packages. +54566|340|O|165550.98|1996-08-13|1-URGENT|Clerk#000000426|0|uffily final platelets are quietly quickly +54567|1285|F|130086.20|1994-08-03|3-MEDIUM|Clerk#000000237|0|ly final platelets snooze bl +54592|991|O|224488.21|1995-06-13|5-LOW|Clerk#000000039|0|haggle furiously ironic, regular dolph +54593|1192|F|215249.89|1992-08-19|5-LOW|Clerk#000000312|0|cies sleep blithely fluffily final deposits. special or +54594|847|O|51755.15|1996-06-01|2-HIGH|Clerk#000000952|0|structions haggle quickl +54595|722|F|227942.93|1994-04-29|3-MEDIUM|Clerk#000000089|0|long the even, daring packages. final instructions against t +54596|479|O|72150.07|1997-05-14|5-LOW|Clerk#000000456|0|ffix furiously quietly special platelets. quickly fina +54597|592|O|109043.09|1996-04-20|4-NOT SPECIFIED|Clerk#000000828|0| theodolites use quickly against the +54598|664|O|135085.18|1996-05-06|3-MEDIUM|Clerk#000000515|0| cajole blithely. blithely unusual a +54599|136|O|11377.27|1997-10-25|2-HIGH|Clerk#000000334|0|around the carefully express requests. slyly re +54624|1102|O|55593.54|1998-03-24|2-HIGH|Clerk#000000713|0|y final theodolites. furiously even deposit +54625|602|F|168866.45|1993-05-18|2-HIGH|Clerk#000000488|0|s nag furiously qui +54626|841|O|165823.31|1997-04-06|2-HIGH|Clerk#000000697|0|nal theodolites cajole regularly after the slyly even acco +54627|1303|O|71548.67|1998-04-11|1-URGENT|Clerk#000000957|0|blithely among the furiously unusual forges. blithel +54628|178|F|73057.55|1993-06-06|2-HIGH|Clerk#000000413|0|ffix above the fluffi +54629|1456|O|52059.57|1996-09-03|2-HIGH|Clerk#000000953|0|slyly regular escapades +54630|8|F|165022.63|1992-08-11|5-LOW|Clerk#000000021|0|onic foxes. furiously pending deposits wake blithely according to th +54631|728|O|198013.52|1998-07-11|5-LOW|Clerk#000000980|0|ttainments nag alongside of the final, brave platelets? per +54656|1367|F|106393.08|1992-11-20|2-HIGH|Clerk#000000085|0|ously furiously regular packages: regular accounts do sleep fu +54657|1120|F|100524.75|1992-07-04|3-MEDIUM|Clerk#000000255|0|to nag slyly above the ruthlessly final deposits. carefully even hock +54658|1277|O|103524.21|1998-02-17|2-HIGH|Clerk#000000236|0|usly unusual deposits nag bli +54659|178|O|95405.20|1995-08-16|2-HIGH|Clerk#000000903|0|l, unusual excuses. expre +54660|1237|F|71902.15|1994-03-24|1-URGENT|Clerk#000000925|0|the carefully regular deposits cajole carefully requests. furiously bold fox +54661|425|O|282953.41|1998-07-31|4-NOT SPECIFIED|Clerk#000000207|0|le after the fluffily daring ideas. carefully even +54662|1409|O|184573.71|1997-02-28|5-LOW|Clerk#000000026|0|sly. furiously final deposits above the even, bold requests cajole blithely sl +54663|511|O|114697.38|1996-04-14|3-MEDIUM|Clerk#000000714|0|deposits use. bravely express requests sleep slyly along the regula +54688|1499|O|26618.49|1996-10-16|1-URGENT|Clerk#000000245|0|al pinto beans haggle carefully alongside of the regular +54689|772|F|42659.98|1993-09-11|1-URGENT|Clerk#000000860|0| the carefully pending gifts. pen +54690|794|F|242492.49|1992-02-22|3-MEDIUM|Clerk#000000601|0| ironic, pending excuses sleep blith +54691|1402|O|49619.76|1997-05-13|4-NOT SPECIFIED|Clerk#000000644|0|ipliers wake ironic deposits. +54692|850|F|189947.74|1993-03-06|3-MEDIUM|Clerk#000000093|0|ully even pinto beans affix stealth +54693|904|O|249568.96|1997-10-08|1-URGENT|Clerk#000000289|0|refully even foxes across the furiously unusual Ti +54694|389|F|207828.01|1994-09-20|1-URGENT|Clerk#000000656|0|. close instructions boost furiously carefully special deposits. package +54695|34|O|208108.62|1997-07-19|2-HIGH|Clerk#000000824|0| foxes. blithely final requests boost fluffily +54720|877|O|75424.72|1996-02-18|1-URGENT|Clerk#000000350|0|special accounts. slyly express instructions nag. +54721|1079|F|229731.41|1992-10-19|4-NOT SPECIFIED|Clerk#000000459|0|ss accounts. fluffily regular asymptotes are carefully. quickly +54722|4|F|208672.53|1993-01-08|5-LOW|Clerk#000000380|0|ly across the final deposits. blithely ironic sheaves among the sl +54723|19|F|215788.17|1994-01-16|5-LOW|Clerk#000000792|0|p fluffily above the ideas. even theodolites are blithely. bold deposits +54724|239|F|17941.94|1992-06-04|3-MEDIUM|Clerk#000000548|0|ithe accounts boost bravel +54725|350|O|345798.55|1998-05-03|5-LOW|Clerk#000000102|0|. fluffily final pinto beans haggle quickly along the +54726|50|F|242343.70|1992-09-14|4-NOT SPECIFIED|Clerk#000000993|0|tions along the furiously ironic packages wake +54727|796|F|94447.90|1993-12-14|3-MEDIUM|Clerk#000000959|0|hely even deposits around the quickly bold instructions integrate amon +54752|874|O|142706.99|1996-08-21|5-LOW|Clerk#000000585|0|ar theodolites hagg +54753|403|F|153940.67|1994-04-19|3-MEDIUM|Clerk#000000421|0|s. furiously express deposits +54754|1295|O|119733.77|1996-09-30|2-HIGH|Clerk#000000512|0|quickly special foxes integrate quickly si +54755|1408|F|205831.28|1994-12-08|1-URGENT|Clerk#000000710|0|xpress, regular pinto beans +54756|1099|O|201026.94|1996-07-04|4-NOT SPECIFIED|Clerk#000000354|0|nstructions sleep across the slyly final req +54757|940|F|79191.41|1992-12-01|1-URGENT|Clerk#000000946|0|e regular, special foxes breach above the final, pending instructions. dep +54758|1372|F|19236.81|1994-11-09|4-NOT SPECIFIED|Clerk#000000735|0|r deposits. decoys cajole slyly against the regular, pending accounts +54759|464|F|164894.42|1994-05-09|1-URGENT|Clerk#000000007|0|te the furiously pending packages sleep after the blithely pending accoun +54784|637|F|70994.96|1992-01-26|4-NOT SPECIFIED|Clerk#000000671|0|s packages cajole carefully. pending foxes acc +54785|1015|O|146659.54|1996-06-21|4-NOT SPECIFIED|Clerk#000000698|0| quickly slyly final foxes. final pa +54786|226|F|156518.31|1992-01-12|4-NOT SPECIFIED|Clerk#000000033|0| furiously accounts. slyly bold multipl +54787|910|F|112069.01|1995-02-25|2-HIGH|Clerk#000000263|0|lites. requests need to l +54788|1330|O|13125.06|1998-04-20|2-HIGH|Clerk#000000792|0|s sleep stealthily according to the ironic, final requests. quickl +54789|439|O|110057.84|1995-09-19|4-NOT SPECIFIED|Clerk#000000536|0| special requests? final theodolites cajole quickl +54790|1090|F|127525.40|1993-12-16|2-HIGH|Clerk#000000421|0|ously bold requests haggle at the ironic ideas. +54791|1126|F|177101.93|1992-12-21|2-HIGH|Clerk#000000868|0|round the idly regu +54816|1030|F|174061.56|1994-12-10|2-HIGH|Clerk#000000583|0|cording to the carefully idle requests haggle +54817|1294|F|232089.19|1992-05-18|5-LOW|Clerk#000000710|0|ackages. busily bold packages hinder slyly de +54818|715|O|48989.36|1997-06-10|2-HIGH|Clerk#000000905|0|ong the theodolites. final requests haggle +54819|1147|F|386714.93|1994-10-11|5-LOW|Clerk#000000010|0|furiously final packages. bold pinto bean +54820|1298|O|82559.08|1996-01-04|1-URGENT|Clerk#000000962|0| accounts. furiously regula +54821|329|F|138675.30|1994-04-25|5-LOW|Clerk#000000749|0|le across the deposits? quick instructions shall have to hag +54822|773|F|133777.29|1994-12-25|1-URGENT|Clerk#000000614|0|. slyly ironic instruct +54823|1408|O|111096.93|1998-03-27|1-URGENT|Clerk#000000770|0|slyly furiously regular pinto beans. slyly silent depos +54848|457|O|97748.66|1997-09-20|1-URGENT|Clerk#000000784|0|efully ironic, ironic platelets. ca +54849|1046|O|76436.87|1996-07-01|1-URGENT|Clerk#000000237|0|. always express accounts are +54850|739|F|181281.76|1993-12-25|4-NOT SPECIFIED|Clerk#000000682|0|es detect. dependencies around the theodolites wake carefully regular deposit +54851|13|F|114282.92|1993-10-09|4-NOT SPECIFIED|Clerk#000000501|0|e furiously unusual +54852|211|O|300017.99|1997-05-05|1-URGENT|Clerk#000000567|0|ts sleep. furiously unusual pearls against the slyly +54853|175|O|92990.93|1996-12-14|2-HIGH|Clerk#000000577|0|al requests integrate above the special, regular pinto beans +54854|373|O|101140.37|1997-01-19|1-URGENT|Clerk#000000076|0| haggle across the special, final accounts. furiously pending excuse +54855|7|F|58981.96|1992-07-02|4-NOT SPECIFIED|Clerk#000000370|0|ly final pinto beans affix blithely even account +54880|41|O|184792.22|1996-07-14|5-LOW|Clerk#000000637|0|gle blithely. special pinto beans was alongside of the slyly ironic pl +54881|823|O|90743.57|1998-05-01|1-URGENT|Clerk#000000696|0|y quickly final accounts: quickly regular acco +54882|376|F|84986.36|1995-02-07|1-URGENT|Clerk#000000226|0|ly final packages haggle furiously. carefully ironic requests are. p +54883|1136|O|66752.33|1997-06-14|3-MEDIUM|Clerk#000000825|0|riously regular instructions. slyly unusual pl +54884|49|F|16636.56|1992-08-01|2-HIGH|Clerk#000000806|0|es wake slyly unusual ac +54885|1121|O|237649.23|1996-12-06|4-NOT SPECIFIED|Clerk#000000430|0|unts nag furiously. blithely regular +54886|5|F|51363.40|1992-08-05|1-URGENT|Clerk#000000656|0| alongside of the carefully final dolphins. c +54887|289|O|78990.14|1998-07-17|5-LOW|Clerk#000000633|0|furiously final pinto beans: furiously regula +54912|1427|O|24640.93|1995-07-22|5-LOW|Clerk#000000522|0|nts. quickly regular foxes cajole quickly final deposits. quickly s +54913|128|F|38623.19|1993-07-04|2-HIGH|Clerk#000000382|0|furiously special requests +54914|1009|O|251683.89|1995-08-29|1-URGENT|Clerk#000000178|0| requests. bold accounts detect bli +54915|226|O|11536.61|1995-06-19|1-URGENT|Clerk#000000497|0|its. enticingly final requests are; regular co +54916|778|O|40866.91|1998-01-24|2-HIGH|Clerk#000000330|0|tealthily final platelets wake furi +54917|179|F|299997.78|1993-04-10|2-HIGH|Clerk#000000395|0|ully unusual accounts. fluffily ironic requests wake f +54918|1306|O|62583.96|1996-04-14|5-LOW|Clerk#000000702|0|ecial warhorses. deposits cajole slowly. furiously pending ideas use carefu +54919|1480|F|215840.07|1994-05-08|1-URGENT|Clerk#000000434|0| quickly quickly even deposits. blithely bold theodolites sn +54944|103|F|41149.58|1994-12-23|2-HIGH|Clerk#000000721|0| quickly final asymptotes. +54945|988|O|255188.13|1996-09-18|5-LOW|Clerk#000000052|0|integrate against the warthogs. pending requests across the sl +54946|872|O|291382.56|1997-11-16|1-URGENT|Clerk#000000752|0|sts. fluffily pending de +54947|1240|F|164569.22|1994-02-23|4-NOT SPECIFIED|Clerk#000000787|0|structions. carefully blithe packages eat furiously regular +54948|784|O|95219.22|1997-11-20|2-HIGH|Clerk#000000176|0|t the regular, furious packages. carefully regular packages affix b +54949|128|F|247727.85|1994-08-11|5-LOW|Clerk#000000251|0|te carefully final instructions. final requests according to the account +54950|311|F|166906.60|1993-12-06|2-HIGH|Clerk#000000628|0|posits. slyly regular foxes +54951|104|O|259856.42|1998-04-03|4-NOT SPECIFIED|Clerk#000000657|0|usly around the slyly silent p +54976|112|F|60346.91|1993-01-25|5-LOW|Clerk#000000768|0|ccounts along the special requests kindle according to the blithely ironi +54977|329|O|234394.75|1995-07-11|5-LOW|Clerk#000000355|0|riously. furiously bold requests cajo +54978|842|F|26140.05|1992-01-19|2-HIGH|Clerk#000000675|0|xes. slyly pending orbits about the slyly thin accounts caj +54979|374|O|8989.75|1995-11-08|2-HIGH|Clerk#000000777|0|dly bold pinto beans use final dependencies. slyly ironic acco +54980|1069|F|50006.78|1994-05-08|5-LOW|Clerk#000000087|0|dolites ought to affix quickly. c +54981|679|F|106421.25|1992-02-12|2-HIGH|Clerk#000000573|0|theodolites against the slyly express accounts are slyly +54982|1102|O|214785.19|1998-02-18|2-HIGH|Clerk#000000878|0|iously. blithely final accounts serve idly unusual accounts. i +54983|1408|O|67076.06|1998-03-08|2-HIGH|Clerk#000000113|0|es are furiously alongside of the unusua +55008|398|O|252276.49|1998-07-24|4-NOT SPECIFIED|Clerk#000000985|0|ccording to the final deposits. furiously final pinto beans ar +55009|1187|F|107063.67|1992-09-17|4-NOT SPECIFIED|Clerk#000000348|0|tructions are quickly alongside of the blithely slow theodolites. slyly ironic +55010|793|O|196656.48|1998-07-26|3-MEDIUM|Clerk#000000501|0|ress theodolites are am +55011|833|F|214711.38|1992-01-05|1-URGENT|Clerk#000000957|0|ke carefully regular reques +55012|839|O|127173.09|1998-01-14|5-LOW|Clerk#000000316|0|ites nag against the furiously final platelets. slyly fin +55013|131|O|146246.52|1995-07-13|5-LOW|Clerk#000000355|0| carefully. regular dolphins are express pinto beans. furiously regular tith +55014|946|F|305029.20|1993-11-02|2-HIGH|Clerk#000000155|0|t the carefully final requests haggle carefully slyly fina +55015|1489|F|246408.53|1993-09-28|4-NOT SPECIFIED|Clerk#000000232|0|ely regular asympto +55040|886|F|166547.24|1994-04-13|2-HIGH|Clerk#000000118|0|unts promise carefully along the fl +55041|235|O|178955.55|1996-09-17|4-NOT SPECIFIED|Clerk#000000177|0|deas. bold accounts wake fluffily. final instructions +55042|1354|O|109012.02|1995-12-09|2-HIGH|Clerk#000000581|0|usly. regular dependencies use quickly unusua +55043|19|O|179710.37|1997-02-26|4-NOT SPECIFIED|Clerk#000000070|0|ter the blithely pending no +55044|346|O|188306.60|1998-02-10|3-MEDIUM|Clerk#000000569|0| play. furiously special courts among the regular, ir +55045|1087|F|44856.05|1994-11-23|2-HIGH|Clerk#000000263|0| the express, bold theodolites. furiously ironic instructions cajole +55046|1361|F|69828.77|1994-04-14|1-URGENT|Clerk#000000034|0|regular grouches sl +55047|59|F|186857.79|1993-06-20|1-URGENT|Clerk#000000539|0|s the unusual ideas are careful +55072|44|F|61221.47|1995-01-05|4-NOT SPECIFIED|Clerk#000000903|0|express packages. packages around the accounts boost q +55073|913|F|111273.48|1992-03-21|5-LOW|Clerk#000000850|0|ts wake carefully quickly special deposits. +55074|151|O|161956.70|1997-09-10|5-LOW|Clerk#000000280|0|es haggle slowly according to the silent pinto beans. blithely ironic +55075|1010|F|182615.63|1995-02-02|1-URGENT|Clerk#000000677|0|olphins are about the carefully regul +55076|530|O|288335.06|1996-05-27|5-LOW|Clerk#000000949|0|iously accounts. quick instructions cajole carefully. regul +55077|176|O|183545.02|1995-10-05|1-URGENT|Clerk#000000003|0|tealthy waters against the q +55078|1078|O|117074.67|1998-06-10|4-NOT SPECIFIED|Clerk#000000781|0|ily ironic excuses. furiously pending plate +55079|1073|O|116938.48|1996-05-03|3-MEDIUM|Clerk#000000543|0|e special, even excuses-- carefully final requests nag. carefully +55104|658|O|101580.02|1998-01-09|1-URGENT|Clerk#000000816|0| regular packages. regular requests against the furiously regular acc +55105|403|F|203226.28|1994-05-07|2-HIGH|Clerk#000000925|0|gular, unusual deposits are +55106|662|O|139402.31|1996-04-21|2-HIGH|Clerk#000000855|0|ic packages. pending foxes integrate. regular pac +55107|1154|F|193043.20|1993-05-09|5-LOW|Clerk#000000595|0|quickly above the quickly even requests. furiously stealthy ideas solve fur +55108|586|O|271901.67|1997-09-06|5-LOW|Clerk#000000950|0|counts. blithely even pinto beans integrate. slyly even deposits +55109|334|O|57753.17|1996-03-22|1-URGENT|Clerk#000000687|0|onic instructions. slyly unusual theodolites a +55110|727|O|229526.49|1997-06-19|1-URGENT|Clerk#000000515|0| deposits sublate furiously i +55111|227|O|117255.06|1997-05-09|1-URGENT|Clerk#000000520|0| carefully final ideas nag furiously at the blithely regular +55136|1156|F|233429.46|1993-10-10|1-URGENT|Clerk#000000475|0|t the even theodolites. fluffily +55137|431|F|74535.74|1993-03-24|4-NOT SPECIFIED|Clerk#000000500|0|lets are according to the silent pinto beans +55138|1228|F|27469.49|1994-09-25|2-HIGH|Clerk#000000532|0|ly ideas wake always package +55139|479|F|245369.24|1993-01-18|4-NOT SPECIFIED|Clerk#000000545|0|old accounts sleep fluffily ideas. quickly even excuses believe blithely. blit +55140|901|F|111365.89|1993-07-05|1-URGENT|Clerk#000000444|0|fully alongside of +55141|652|O|99329.77|1996-05-30|1-URGENT|Clerk#000000421|0|es above the carefully regular requests +55142|22|F|201369.19|1993-12-09|3-MEDIUM|Clerk#000000055|0|bold pinto beans haggle carefully around the care +55143|1207|F|83619.40|1993-01-22|5-LOW|Clerk#000000569|0|into beans above the ironic packages are fluffily carefully regular dolphins +55168|200|O|194716.61|1997-04-15|5-LOW|Clerk#000000744|0|after the even dependencies nag quietly express +55169|1366|F|35495.85|1992-04-16|4-NOT SPECIFIED|Clerk#000000948|0|nstructions. blithely ironic requests detect quietly. regular, express a +55170|238|F|195369.86|1992-09-22|1-URGENT|Clerk#000000591|0|ul pinto beans mold quickly about the carefully unusual theodolites. regular +55171|352|F|258059.12|1992-10-27|2-HIGH|Clerk#000000781|0|s wake furiously with the ironic, unusu +55172|224|F|174678.44|1993-12-04|4-NOT SPECIFIED|Clerk#000000941|0| waters are carefully ironic, final asymptotes. packages along the stealt +55173|139|O|138469.94|1997-11-19|5-LOW|Clerk#000000986|0|ending packages wake. furiously close +55174|989|F|131878.03|1993-07-06|3-MEDIUM|Clerk#000000433|0|osits use carefully unusua +55175|496|O|22707.60|1995-07-23|4-NOT SPECIFIED|Clerk#000000380|0| haggle quickly furiously regular requ +55200|686|F|173670.15|1993-08-29|3-MEDIUM|Clerk#000000678|0| slyly after the regular ideas. blithely stealthy pinto beans affix carefull +55201|52|F|30080.57|1993-03-24|5-LOW|Clerk#000000149|0|y carefully special inst +55202|646|O|172928.58|1995-08-25|5-LOW|Clerk#000000718|0| the thinly express pinto beans boost slyly dolphins. slyly bold accounts caj +55203|232|F|179708.96|1993-04-12|5-LOW|Clerk#000000071|0|ests. ironic requests haggl +55204|635|O|159718.21|1997-07-31|4-NOT SPECIFIED|Clerk#000000025|0|ts cajole carefully at the carefully regular request +55205|1489|O|233488.50|1998-08-02|5-LOW|Clerk#000000870|0| are. slyly even theodolites haggle blithely unusual instructions. even, iro +55206|886|O|72676.78|1995-11-03|3-MEDIUM|Clerk#000000047|0|s. slyly final requests integra +55207|13|F|40030.85|1994-11-17|3-MEDIUM|Clerk#000000777|0|rding to the final, final accounts. special, ironic orbits again +55232|1048|O|101073.25|1996-01-30|4-NOT SPECIFIED|Clerk#000000809|0|ar deposits sleep blithely packages. accounts nag furiously speci +55233|1111|F|40895.33|1995-02-02|2-HIGH|Clerk#000000298|0| the silent package +55234|538|F|367176.04|1993-07-29|5-LOW|Clerk#000000732|0|usly pending theodolites cajole carefully. slyly ironic ideas us +55235|1175|F|147162.76|1993-10-07|5-LOW|Clerk#000000191|0| even accounts are +55236|686|O|41182.81|1996-12-13|3-MEDIUM|Clerk#000000830|0|fully pending dolphins. blithely regular requ +55237|1138|O|30649.15|1997-02-14|3-MEDIUM|Clerk#000000166|0|cajole slyly packages. regular pinto beans haggle furiously +55238|488|O|297311.46|1998-05-28|3-MEDIUM|Clerk#000000100|0|r the furiously even instr +55239|338|F|195801.59|1992-12-04|1-URGENT|Clerk#000000252|0|mptotes sleep blithely ironic ideas. even, special theodolites sleep fluf +55264|733|F|1827.17|1993-12-20|4-NOT SPECIFIED|Clerk#000000273|0|lthy asymptotes boost fluffily slyly final pinto beans. even asymptotes use +55265|1258|F|323163.32|1994-09-24|5-LOW|Clerk#000000586|0|ven accounts. blithely even requests through the +55266|395|F|105455.77|1992-06-14|1-URGENT|Clerk#000000093|0|nto beans cajole furiously e +55267|179|O|91132.69|1998-03-25|5-LOW|Clerk#000000407|0|inal, regular accounts. fluffily ir +55268|412|F|50034.05|1992-03-18|2-HIGH|Clerk#000000581|0|usy ideas around the quickly express platelets breach a +55269|196|F|253397.92|1993-03-08|3-MEDIUM|Clerk#000000899|0|egular requests use along the final platelets. slyly final platelets detect +55270|1000|F|172992.03|1993-01-23|3-MEDIUM|Clerk#000000196|0|kages against the pinto beans haggle express, final asymp +55271|496|P|205930.19|1995-03-12|3-MEDIUM|Clerk#000000881|0|counts. even, final ideas about the ironic requests detec +55296|1421|F|75300.65|1992-10-19|5-LOW|Clerk#000000974|0|rding to the furiously final platelets sleep alongside o +55297|1336|F|237703.54|1993-10-20|3-MEDIUM|Clerk#000000762|0|l, bold theodolites. slyly pending accounts a +55298|274|F|72417.61|1994-08-03|1-URGENT|Clerk#000000043|0| beans across the q +55299|908|F|80725.23|1992-03-31|5-LOW|Clerk#000000768|0|lly regular theodolites are among the furiously bold accounts. slyly unusual +55300|337|F|199785.12|1994-02-21|2-HIGH|Clerk#000000462|0|ithely enticing ideas x-ray fluffily bold ideas. b +55301|1226|F|53919.80|1994-02-28|1-URGENT|Clerk#000000189|0|he silent, brave realms. accounts wake. ironic excuses are fluffily ac +55302|697|O|225469.13|1997-11-21|5-LOW|Clerk#000000117|0|f the pinto beans. carefully even attainments sleep along the furiously re +55303|1061|P|79759.59|1995-03-31|4-NOT SPECIFIED|Clerk#000000129|0|o beans are carefully furiously pending dolphins. +55328|1447|O|67723.77|1998-02-05|5-LOW|Clerk#000000332|0|o the pinto beans. quickly special the +55329|340|O|163134.94|1996-06-25|5-LOW|Clerk#000000278|0| final deposits are idly furiously ironic id +55330|94|F|249649.04|1994-08-13|3-MEDIUM|Clerk#000000453|0| accounts use. blit +55331|1349|F|332773.20|1993-12-14|2-HIGH|Clerk#000000110|0|special deposits. slyly bold dependencies sleep f +55332|1474|O|47066.62|1998-03-31|5-LOW|Clerk#000000191|0|ngly special instructions haggle quickly re +55333|418|F|171591.94|1993-11-17|2-HIGH|Clerk#000000025|0| fluffy requests sleep ruthlessly e +55334|613|O|204477.20|1997-05-07|1-URGENT|Clerk#000000977|0|phins. fluffily ironic foxes aff +55335|835|F|129869.08|1992-09-16|4-NOT SPECIFIED|Clerk#000000224|0|its sleep above the carefully ironic deposits +55360|475|F|179592.25|1994-01-23|3-MEDIUM|Clerk#000000520|0| the requests. furiousl +55361|313|P|180209.58|1995-03-24|4-NOT SPECIFIED|Clerk#000000368|0|kly pending pinto beans integrate regular, even deposits! bold acco +55362|1024|P|257820.06|1995-04-21|2-HIGH|Clerk#000000998|0|fully regular accounts! slyly express deposits cajole. quickly p +55363|527|F|185092.55|1993-12-29|2-HIGH|Clerk#000000014|0|he ideas nag fluffily along the daringly pending hockey players. +55364|187|O|71044.42|1996-10-09|2-HIGH|Clerk#000000092|0|ronic packages cajole daringly. ironic +55365|1378|O|225626.89|1996-01-06|3-MEDIUM|Clerk#000000748|0|heodolites integrate fluffily. fluffily expre +55366|605|F|91967.01|1992-10-11|1-URGENT|Clerk#000000956|0|oost slyly about the carefully stealthy ideas. blithe theodol +55367|1121|F|187349.70|1994-01-11|1-URGENT|Clerk#000000792|0|s sleep furiously express +55392|1031|F|278714.84|1994-06-07|1-URGENT|Clerk#000000647|0|kages detect even packages. ironic accounts cajole blit +55393|1427|O|124503.32|1996-05-18|5-LOW|Clerk#000000375|0|idle platelets. bold, express excuses cajole slowly. special foxes cajole fur +55394|236|F|126699.97|1993-02-27|1-URGENT|Clerk#000000377|0|e along the dugouts. ironic, even the +55395|1252|F|46437.55|1994-11-02|2-HIGH|Clerk#000000343|0|furiously ironic deposits would kindle evenly +55396|1198|F|64171.63|1994-04-07|1-URGENT|Clerk#000000592|0|e regular, bold requests cajole furiously slyly ironic court +55397|181|F|48438.92|1993-03-31|4-NOT SPECIFIED|Clerk#000000563|0|ounts are furiously regular dep +55398|767|F|211955.58|1993-01-21|3-MEDIUM|Clerk#000000873|0|thely even packages. regular attainments solve instead of the bol +55399|490|O|78606.50|1996-02-15|2-HIGH|Clerk#000000907|0|ffily quick packages sleep. quickly even re +55424|490|F|204020.83|1993-03-03|3-MEDIUM|Clerk#000000101|0|ter the quickly daring theodo +55425|673|O|190521.10|1995-11-02|1-URGENT|Clerk#000000162|0|; slyly express theodolites affix. express, ironic theodolites wak +55426|799|O|159060.19|1997-01-21|4-NOT SPECIFIED|Clerk#000000406|0|kages sleep. final ideas sleep furiously even, ev +55427|1099|O|130383.52|1995-07-06|1-URGENT|Clerk#000000526|0|ithely after the fu +55428|517|O|123193.88|1996-07-06|3-MEDIUM|Clerk#000000028|0|ecial packages detect +55429|1249|F|172186.47|1994-06-30|2-HIGH|Clerk#000000259|0| the quickly regular +55430|770|F|194750.53|1994-06-11|3-MEDIUM|Clerk#000000751|0|luffily ironic deposits. bold accounts cajole quick +55431|1271|F|224280.70|1992-06-09|4-NOT SPECIFIED|Clerk#000000403|0|nding packages haggle slyly regular accounts. packages unwind. blithely +55456|943|F|145502.79|1993-01-07|3-MEDIUM|Clerk#000000036|0|packages haggle carefu +55457|1394|O|54318.55|1996-08-22|4-NOT SPECIFIED|Clerk#000000938|0|al foxes wake slyly pending deposits. blit +55458|170|F|87701.57|1992-03-17|2-HIGH|Clerk#000000701|0|furiously about the sly, regular pains. bold pinto beans beside +55459|694|F|161787.78|1994-04-26|1-URGENT|Clerk#000000047|0|uriously bold deposits. +55460|154|F|183135.63|1992-05-27|2-HIGH|Clerk#000000294|0|s are blithely accord +55461|340|F|181440.27|1994-09-29|3-MEDIUM|Clerk#000000609|0|are carefully against the furiously even attainments. silen +55462|1015|F|274581.87|1992-03-28|3-MEDIUM|Clerk#000000911|0| ironic notornis affix acco +55463|779|F|19092.11|1993-05-10|4-NOT SPECIFIED|Clerk#000000589|0|egrate blithely around the accounts. quickly final ideas +55488|1310|O|223988.08|1996-02-18|4-NOT SPECIFIED|Clerk#000000409|0|xcuses. furiously even dolphins doze about the +55489|1276|O|55929.50|1996-07-09|2-HIGH|Clerk#000000162|0|ing deposits wake blit +55490|1367|F|186971.11|1994-11-17|3-MEDIUM|Clerk#000000518|0|es detect fluffily fluffily slow packages. boldly ironic packages ru +55491|368|P|100451.65|1995-05-18|4-NOT SPECIFIED|Clerk#000000693|0| never. foxes haggle blithely unusual requests: carefully ironic fr +55492|10|O|187966.88|1995-09-20|1-URGENT|Clerk#000000105|0|totes. quickly bold pinto beans about the careful +55493|1231|F|33985.97|1993-09-08|3-MEDIUM|Clerk#000000429|0|refully regular ideas. +55494|743|F|256449.39|1992-06-26|4-NOT SPECIFIED|Clerk#000000971|0|osits cajole fluffily. iron +55495|445|O|93903.99|1996-06-01|2-HIGH|Clerk#000000605|0|riously across the furiously regular accounts. silent, even +55520|586|P|106513.04|1995-05-08|1-URGENT|Clerk#000000419|0|ular excuses sleep fluf +55521|1087|O|101577.02|1997-05-21|4-NOT SPECIFIED|Clerk#000000793|0|lithely silent dolphins according to the quickly even +55522|608|F|25432.52|1994-06-27|3-MEDIUM|Clerk#000000330|0|en deposits. slyly unusual theodolites haggle slyly: final sauternes serve fur +55523|220|O|61868.77|1998-05-18|1-URGENT|Clerk#000000050|0| unusual foxes. bold packages sleep carefully ironic orbits. slyly special +55524|1358|O|68935.47|1995-10-29|3-MEDIUM|Clerk#000000838|0|refully. slyly express accounts use furiously. requests acc +55525|1417|F|211613.68|1994-05-09|5-LOW|Clerk#000000378|0| unusual pearls detect furiously quickly regular deposits. sile +55526|833|F|271294.39|1992-07-03|2-HIGH|Clerk#000000964|0|elets. carefully quiet requests cajole at the furiously regular ideas. quickl +55527|482|O|130159.99|1997-07-26|1-URGENT|Clerk#000000941|0|lar requests run fluffi +55552|293|O|133694.43|1996-10-13|5-LOW|Clerk#000000769|0|efully pending accounts according t +55553|1453|F|123478.24|1994-07-18|3-MEDIUM|Clerk#000000208|0|usly pending requests +55554|1037|F|229584.02|1994-11-17|1-URGENT|Clerk#000000370|0|ending Tiresias haggle quickly across the slyly ir +55555|764|O|74186.98|1997-11-25|3-MEDIUM|Clerk#000000689|0|onic ideas cajole ideas? quickly s +55556|1358|O|90937.72|1995-11-16|5-LOW|Clerk#000000248|0|ar ideas. hockey players use. final decoys across the even accou +55557|892|O|86257.85|1997-02-04|3-MEDIUM|Clerk#000000859|0|iously silent accounts integrate slyly fluffily final requests: blithely final +55558|643|F|25259.19|1993-08-10|3-MEDIUM|Clerk#000000868|0|arefully. regular, final requests wake across the ironic p +55559|1451|O|124390.89|1997-09-05|1-URGENT|Clerk#000000672|0| unusual theodolites. blithely pending packages cajole furiously furiously +55584|170|O|103195.86|1996-03-08|5-LOW|Clerk#000000451|0| deposits doubt. furiously even requests main +55585|923|O|79948.50|1997-01-20|4-NOT SPECIFIED|Clerk#000000832|0| deposits haggle carefully at the requests. daring asy +55586|160|O|176581.86|1998-05-17|2-HIGH|Clerk#000000029|0|bove the packages. decoys integrate. final somas across the p +55587|227|F|65790.16|1993-07-20|3-MEDIUM|Clerk#000000222|0| special instructions. quickly bold packages ar +55588|568|F|225959.15|1993-03-15|4-NOT SPECIFIED|Clerk#000000651|0|eposits sleep furiously requests! furiously final foxes affix id +55589|58|F|59329.97|1993-02-26|1-URGENT|Clerk#000000780|0| regular instructions haggle quickly even +55590|580|O|124199.42|1996-12-24|3-MEDIUM|Clerk#000000915|0|lithely after the fluffily unusual tithes. final orbits are bli +55591|620|O|133996.27|1997-08-03|4-NOT SPECIFIED|Clerk#000000982|0|carefully. unusual ideas nag. foxes boost slyly according t +55616|634|P|116032.58|1995-05-09|2-HIGH|Clerk#000000687|0|nto beans. furiously special sheaves nag about t +55617|1397|O|260432.45|1998-06-29|3-MEDIUM|Clerk#000000558|0| carefully blithely final dependencies. ironic, pendin +55618|1498|F|211824.32|1992-01-22|3-MEDIUM|Clerk#000000652|0| sauternes cajole requests. even theodo +55619|548|O|157993.23|1997-11-15|2-HIGH|Clerk#000000653|0|fily. fluffily express wa +55620|29|O|3453.62|1998-01-10|4-NOT SPECIFIED|Clerk#000000311|0|usly. regular, regul +55621|1276|P|125544.74|1995-03-16|5-LOW|Clerk#000000207|0| pending realms kindle quickly +55622|430|F|8658.14|1994-09-22|1-URGENT|Clerk#000000295|0|ts haggle carefully bold ideas: regularly bold theodolites ser +55623|568|F|86992.46|1992-10-06|1-URGENT|Clerk#000000716|0|unts hinder furiously quickly unusual deposits. permanently ironic platelets +55648|62|F|286264.01|1994-09-10|1-URGENT|Clerk#000000229|0| foxes affix furiously. caref +55649|445|O|138833.05|1998-01-18|3-MEDIUM|Clerk#000000811|0|posits. regular theodolites are furiously. final, final deposits boost slyly. +55650|686|O|21520.14|1995-10-22|5-LOW|Clerk#000000002|0|pecial escapades integrate slyly among the carefully even +55651|217|F|345586.31|1992-03-08|3-MEDIUM|Clerk#000000573|0|ccounts nag according to the fu +55652|583|F|29525.47|1993-12-22|1-URGENT|Clerk#000000167|0|ss above the furiously regular deposits. car +55653|785|F|69028.95|1993-11-27|3-MEDIUM|Clerk#000000160|0|bold platelets. quickly pending +55654|1346|F|105004.44|1993-09-20|2-HIGH|Clerk#000000349|0|hely regular deposits. furiously bo +55655|208|F|299558.31|1992-09-25|5-LOW|Clerk#000000184|0|accounts. quickly close packages detect above the ironic packages +55680|433|F|6979.69|1992-06-10|4-NOT SPECIFIED|Clerk#000000773|0|ular excuses boost finally? dugouts sleep fluffily-- depths ha +55681|763|O|10243.64|1996-08-23|4-NOT SPECIFIED|Clerk#000000138|0|yly? sly deposits wake slyly! blithely special deposits sleep silent +55682|377|F|46548.81|1994-11-14|1-URGENT|Clerk#000000106|0| beans lose furiously. sometimes express asymptotes haggle. pending packages h +55683|979|F|192959.00|1992-07-16|2-HIGH|Clerk#000000419|0|final, idle account +55684|526|P|51112.78|1995-03-10|3-MEDIUM|Clerk#000000815|0|boost daringly. pinto beans sleep slyly. special, special requests are bli +55685|1051|F|71326.73|1992-10-12|4-NOT SPECIFIED|Clerk#000000302|0|r ideas until the quickly even pinto beans haggle carefully packages. regular +55686|1477|P|355352.90|1995-03-26|1-URGENT|Clerk#000000485|0|final platelets sleep carefully ironic foxes. packa +55687|1231|F|44714.49|1992-10-27|5-LOW|Clerk#000000227|0|al theodolites nag slyly final packages. special, ev +55712|1442|O|49106.63|1996-11-20|4-NOT SPECIFIED|Clerk#000000589|0|instructions; final asymptotes sleep carefully. regular +55713|572|F|359769.90|1994-02-03|2-HIGH|Clerk#000000041|0|integrate slyly dependencies. regular pi +55714|1406|O|67036.38|1997-06-02|1-URGENT|Clerk#000000341|0|le idly quickly unusual ideas. deposits haggle furiously. +55715|1180|F|43035.78|1995-04-03|1-URGENT|Clerk#000000578|0|counts. fluffily final packages cajole blith +55716|373|F|72597.98|1992-10-23|2-HIGH|Clerk#000000548|0|elets. busily final instruc +55717|1111|F|23314.66|1992-02-15|3-MEDIUM|Clerk#000000692|0|thy pinto beans detect blithely +55718|97|O|163322.27|1997-06-23|2-HIGH|Clerk#000000902|0|s sleep slyly. fluffily ironic packages haggle carefully regular accounts. qu +55719|203|F|27321.19|1992-10-12|5-LOW|Clerk#000000142|0|ts are carefully ironic packages. slyly regular packages around the quiet, iro +55744|1135|O|179907.72|1995-10-21|1-URGENT|Clerk#000000235|0|unts haggle between the si +55745|410|F|68538.29|1994-02-15|3-MEDIUM|Clerk#000000884|0|structions! blithely special epitaphs ag +55746|992|F|33616.95|1994-07-01|4-NOT SPECIFIED|Clerk#000000967|0|al, regular ideas print blithely iron +55747|610|F|99305.94|1992-12-03|2-HIGH|Clerk#000000264|0|fily regular platelets believe carefull +55748|929|O|109747.86|1995-08-16|5-LOW|Clerk#000000315|0|al accounts. furiously regular deposits ar +55749|10|F|102944.70|1992-05-04|1-URGENT|Clerk#000000925|0|wake quickly about the blithely ironic water +55750|1274|F|211980.09|1993-08-28|1-URGENT|Clerk#000000106|0|inal accounts sleep furiously si +55751|175|O|98392.27|1997-12-07|3-MEDIUM|Clerk#000000944|0|usly express instructio +55776|1169|F|75563.58|1994-03-23|4-NOT SPECIFIED|Clerk#000000039|0|counts are furiously according to +55777|607|F|86896.03|1992-11-11|4-NOT SPECIFIED|Clerk#000000826|0|od evenly about the slyly ironic theodolites. slyly bli +55778|523|O|8293.34|1997-04-14|4-NOT SPECIFIED|Clerk#000000398|0|e accounts. blithely even packag +55779|497|F|126251.13|1992-03-11|1-URGENT|Clerk#000000329|0| blithely according to the pending packages. silent r +55780|1114|O|158760.53|1997-10-13|4-NOT SPECIFIED|Clerk#000000390|0|encies use. carefully final packages haggle slyly. regular, +55781|1324|O|62577.01|1996-12-04|2-HIGH|Clerk#000000444|0|ing accounts haggle against the fluffily express pinto beans. ironic, +55782|1339|O|59717.14|1997-07-24|5-LOW|Clerk#000000610|0|inal, final accounts about the +55783|1415|O|79340.48|1996-07-12|3-MEDIUM|Clerk#000000160|0|ss the express foxes. unusual, +55808|1207|F|260339.26|1995-02-15|4-NOT SPECIFIED|Clerk#000000384|0| even dolphins wake carefully theodolites. slyly even pinto beans +55809|1133|O|146704.89|1995-09-11|1-URGENT|Clerk#000000196|0| furiously regular instructions. final attai +55810|649|O|257421.66|1996-04-08|3-MEDIUM|Clerk#000000295|0|ic dependencies sleep carefully final theodolites. blithely even platelets +55811|845|O|72367.26|1998-06-06|2-HIGH|Clerk#000000952|0|ole quickly carefully ironic foxes: ideas across the furiously bold pinto +55812|379|F|251136.10|1993-10-27|4-NOT SPECIFIED|Clerk#000000904|0|eposits. furiously even foxes are above the +55813|1021|F|224346.77|1992-07-29|5-LOW|Clerk#000000887|0|equests cajole against the final, regular pa +55814|244|F|87603.84|1993-08-21|3-MEDIUM|Clerk#000000952|0|ternes. even dependencies use. furiously ironic decoys +55815|806|F|183919.79|1995-01-14|2-HIGH|Clerk#000000433|0|affix slyly. slyly final deposits detect +55840|452|F|98038.64|1994-08-18|3-MEDIUM|Clerk#000000028|0| regular instructions affi +55841|1249|O|37069.48|1996-10-31|3-MEDIUM|Clerk#000000806|0|ss the fluffy deposits. requests lose slyl +55842|625|O|262921.71|1996-02-27|4-NOT SPECIFIED|Clerk#000000612|0|ies haggle carefully blithely silent pinto beans. s +55843|1112|O|22902.29|1995-03-19|4-NOT SPECIFIED|Clerk#000000307|0|. blithely pending platelets wake q +55844|541|O|45710.01|1995-12-22|1-URGENT|Clerk#000000857|0|counts wake furiously blithely even packag +55845|556|O|170714.26|1995-07-22|5-LOW|Clerk#000000815|0|ess packages must have to detec +55846|862|F|8473.43|1994-07-21|4-NOT SPECIFIED|Clerk#000000238|0| of the regular, ironic packag +55847|476|F|91006.81|1994-07-21|4-NOT SPECIFIED|Clerk#000000075|0| the asymptotes. quickly regular requests affix +55872|676|F|48928.29|1993-12-14|4-NOT SPECIFIED|Clerk#000000989|0|uriously special instructions. express foxes haggle fluffily under the +55873|491|O|362117.55|1995-11-20|5-LOW|Clerk#000000537|0|. regular ideas according to the carefully even theodolites wake blith +55874|14|F|108983.31|1994-02-17|3-MEDIUM|Clerk#000000742|0|ly express warthogs. ideas haggle according to +55875|476|F|79302.16|1994-11-26|1-URGENT|Clerk#000000638|0|s integrate blithely unusual theodolites. +55876|904|O|144807.21|1997-10-02|2-HIGH|Clerk#000000115|0| packages at the even instructions +55877|754|F|198958.08|1993-02-03|4-NOT SPECIFIED|Clerk#000000155|0|inal requests. ironic foxes nod carefully. quickly unusual request +55878|1462|O|15901.27|1995-04-07|5-LOW|Clerk#000000402|0|s haggle fluffily among the carefully ironic foxes. carefully regular +55879|1255|F|40222.53|1994-04-06|1-URGENT|Clerk#000000850|0|ly around the carefully ironic deposits. final deposits along +55904|935|F|230200.51|1993-03-20|3-MEDIUM|Clerk#000000857|0|oze. fluffily regular d +55905|325|O|106463.08|1996-06-28|1-URGENT|Clerk#000000559|0|ithely final warhorses. deposits cajole. quickly iron +55906|608|F|201209.42|1994-11-27|1-URGENT|Clerk#000000483|0|ct blithely along the slyly regular dugouts. slyly silent ideas w +55907|628|O|147554.38|1996-10-23|5-LOW|Clerk#000000869|0|ly. carefully regular accounts nag above the slyly even escapades. careful +55908|866|F|159277.15|1994-05-24|2-HIGH|Clerk#000000029|0| bold accounts. thinly special asymptotes nag unusual instructions. carefu +55909|877|F|75038.85|1994-05-20|5-LOW|Clerk#000000547|0|ckly final accounts. furiously regular pinto beans sleep quickly. fluf +55910|643|F|19518.54|1993-09-18|2-HIGH|Clerk#000000359|0|ly alongside of the final accounts. final, bold realms cajol +55911|748|F|66181.45|1993-10-05|5-LOW|Clerk#000000654|0| about the pinto beans dazzle slyly final dependencie +55936|226|O|142104.94|1995-12-28|2-HIGH|Clerk#000000193|0| after the slyly ironic requests. instructions ag +55937|166|F|402930.49|1994-01-27|3-MEDIUM|Clerk#000000136|0|y ironic requests haggle at the slyly busy accounts. furiously even pi +55938|475|F|258033.04|1992-07-03|4-NOT SPECIFIED|Clerk#000000620|0|iously final theodolites. deposits sleep +55939|50|O|8031.62|1997-02-03|2-HIGH|Clerk#000000070|0|packages. slyly ironi +55940|139|F|55188.56|1994-04-30|4-NOT SPECIFIED|Clerk#000000695|0|the slyly silent foxes use final accounts. slyly even +55941|626|F|62441.32|1995-02-21|2-HIGH|Clerk#000000720|0|ly after the unusual, t +55942|994|O|170833.57|1998-03-04|4-NOT SPECIFIED|Clerk#000000158|0|ly regular theodolites haggle regular dependencies. blithely final packages af +55943|658|O|88192.54|1997-04-18|5-LOW|Clerk#000000050|0| foxes. furiously unusual courts eat. regular foxes sleep ca +55968|349|F|129713.57|1992-10-01|5-LOW|Clerk#000000867|0|ts. packages about the furious +55969|562|F|123077.82|1993-10-05|3-MEDIUM|Clerk#000000347|0|pecial accounts. even, p +55970|1297|O|100041.60|1995-09-25|5-LOW|Clerk#000000345|0|as. enticing, final depende +55971|382|O|250836.87|1997-01-03|4-NOT SPECIFIED|Clerk#000000966|0|oys. furiously express dependencies are final, ironic packages. accounts abou +55972|959|O|126674.93|1995-11-05|5-LOW|Clerk#000000773|0|ly ironic instructions. bold, special excuses u +55973|236|F|351195.20|1995-02-15|5-LOW|Clerk#000000256|0|furiously final pinto beans after the ironic, final +55974|787|O|48301.90|1996-05-14|2-HIGH|Clerk#000000959|0| ideas are against the fluffily bold ideas. +55975|19|O|155466.70|1998-02-10|2-HIGH|Clerk#000000663|0|slyly final asympto +56000|1421|O|64686.52|1996-11-04|3-MEDIUM|Clerk#000000527|0|t quickly slyly even realms. quickly express deposits against the fluffily +56001|1124|F|134102.70|1993-04-13|5-LOW|Clerk#000000600|0|final, final requests about the +56002|295|F|277136.90|1994-07-05|5-LOW|Clerk#000000497|0|ns across the carefully final deposits use according +56003|1267|F|135380.09|1993-04-07|1-URGENT|Clerk#000000305|0| the quickly final platelets. +56004|334|F|19619.86|1993-06-07|5-LOW|Clerk#000000856|0|. fluffily unusual notornis affix carefully b +56005|485|O|189371.13|1996-01-12|5-LOW|Clerk#000000885|0|n requests. slyly regular platelets across the bl +56006|757|O|319205.22|1995-10-02|1-URGENT|Clerk#000000870|0|ess requests haggle doggedly alongside of the fluffy requests. ruthlessly f +56007|1420|F|9107.89|1992-01-16|2-HIGH|Clerk#000000480|0|g slyly furiously sile +56032|373|O|86522.98|1995-12-20|4-NOT SPECIFIED|Clerk#000000276|0| slyly special instructions use aft +56033|1357|F|33110.56|1992-01-04|2-HIGH|Clerk#000000446|0|final accounts. furiously regular ideas into the depo +56034|1012|O|203771.43|1997-09-08|5-LOW|Clerk#000000304|0|kages. notornis above the blith +56035|1036|O|84118.71|1996-07-16|1-URGENT|Clerk#000000708|0|ckages. furiously pending dependencies caj +56036|851|O|74061.41|1996-10-10|2-HIGH|Clerk#000000476|0|are blithely accounts. s +56037|701|O|238263.13|1996-03-23|5-LOW|Clerk#000000370|0|ost according to the furiously unusual excuses: slyly regular +56038|1010|F|177186.11|1994-01-17|1-URGENT|Clerk#000000634|0| platelets are carefully around +56039|40|O|253879.31|1995-11-26|5-LOW|Clerk#000000117|0|ost fluffily packages. accounts are slyly stealthily unus +56064|1156|F|173166.90|1994-10-30|3-MEDIUM|Clerk#000000104|0|ackages would are blithely al +56065|316|P|175959.03|1995-04-03|5-LOW|Clerk#000000283|0|into beans. carefully regular packages use carefully slyly regular packages +56066|343|O|38468.48|1998-01-24|2-HIGH|Clerk#000000364|0|sublate fluffily after the blithely +56067|1382|O|307841.76|1996-09-04|1-URGENT|Clerk#000000806|0|ly regular asymptotes at the blithely ironic deposits detect carefu +56068|1471|O|130689.15|1997-01-13|4-NOT SPECIFIED|Clerk#000000335|0|ep by the furiously quick deposits. blithely final asymptotes boost fluffil +56069|614|F|47573.06|1992-10-15|5-LOW|Clerk#000000330|0|fluffily regular theodolites integrate above the +56070|592|F|83860.23|1992-01-14|5-LOW|Clerk#000000410|0|ions solve besides the even foxes. packages wake slyly. regular, ev +56071|793|O|263961.31|1996-07-14|2-HIGH|Clerk#000000966|0|the ironic pinto be +56096|922|O|98899.57|1995-10-11|5-LOW|Clerk#000000865|0|c, enticing accounts wake. regular, even dolphins sleep fi +56097|343|O|249043.37|1996-05-02|3-MEDIUM|Clerk#000000023|0| even, pending deposits sleep slyly regular notornis. slyly pending plate +56098|508|O|133531.61|1996-12-17|5-LOW|Clerk#000000555|0|carefully ironic requests nag carefully across t +56099|1405|F|209465.83|1993-10-06|5-LOW|Clerk#000000760|0| to impress furiously. carefully +56100|929|F|72578.65|1993-04-17|2-HIGH|Clerk#000000076|0|er furiously even deposits. accounts are quickly fin +56101|407|F|286254.23|1993-07-20|4-NOT SPECIFIED|Clerk#000000785|0|sual theodolites. ideas detect carefully along the instruc +56102|646|O|129711.57|1997-01-14|5-LOW|Clerk#000000811|0| the ruthless packages! slyly regular foxes boost slyly accordi +56103|872|F|270665.13|1993-12-27|2-HIGH|Clerk#000000430|0|ct carefully about the stealthy courts. +56128|550|F|191843.15|1993-07-31|3-MEDIUM|Clerk#000000647|0|latelets. carefully express foxes are quickly. furiously pending dolph +56129|739|O|83848.98|1995-12-25|5-LOW|Clerk#000000983|0|al foxes. furiously regular deposits sleep doggedly. carefully even foxe +56130|1369|O|139779.89|1995-11-30|3-MEDIUM|Clerk#000000100|0|ular packages. slyly even +56131|338|F|112880.48|1993-03-17|3-MEDIUM|Clerk#000000008|0|lly special theodolites are +56132|436|F|101992.62|1992-06-07|3-MEDIUM|Clerk#000000076|0|quests sleep. special Tiresias sleep carefully ironic ide +56133|256|O|71957.08|1996-04-13|3-MEDIUM|Clerk#000000390|0|boost blithely always regular asymptotes. furiously regular decoys against +56134|1178|O|220387.00|1998-04-01|2-HIGH|Clerk#000000404|0|uriously ironic requests cajole ideas. blithely r +56135|1484|F|240655.72|1993-11-14|3-MEDIUM|Clerk#000000285|0|hely final instructions. regular f +56160|266|F|332655.50|1994-09-18|1-URGENT|Clerk#000000633|0|lithely even accounts use carefully carefully special instructions. slyly fin +56161|802|F|112256.56|1992-04-15|2-HIGH|Clerk#000000227|0|ully regular packages wake carefully-- regular pa +56162|1499|P|153594.59|1995-04-26|4-NOT SPECIFIED|Clerk#000000416|0|s are blithely after the express ins +56163|640|F|140687.85|1994-08-12|4-NOT SPECIFIED|Clerk#000000583|0|al pearls. pending, express theodolites promise. blit +56164|269|O|99434.19|1998-05-22|5-LOW|Clerk#000000773|0|uriously at the furiously regular theodolites. bold pinto beans across +56165|35|F|52541.01|1992-04-20|2-HIGH|Clerk#000000816|0|rding to the fluffily express packages lose bl +56166|676|F|68419.40|1993-08-05|1-URGENT|Clerk#000000278|0|xes. ironic deposits try to boost abo +56167|530|O|120148.56|1996-03-18|2-HIGH|Clerk#000000249|0|fully. regular, express asymptotes sleep across the regular +56192|728|O|95309.88|1997-03-07|4-NOT SPECIFIED|Clerk#000000617|0|usily ironic, regular dependencies. furio +56193|604|O|177720.50|1996-06-08|4-NOT SPECIFIED|Clerk#000000151|0|lithely final accounts. blithely special dep +56194|29|O|10903.93|1996-02-10|3-MEDIUM|Clerk#000000689|0|ns wake furiously regular deposits. dependencies according to the fluffily fin +56195|706|F|106944.09|1993-07-10|4-NOT SPECIFIED|Clerk#000000392|0|latelets doze furiously according to the express packages. slyly speci +56196|4|F|199826.92|1994-11-06|1-URGENT|Clerk#000000532|0| multipliers. carefully final accounts affix. grouches abo +56197|1295|F|198615.34|1994-05-12|2-HIGH|Clerk#000000502|0| wake blithely furiously regular +56198|1160|O|95653.11|1997-11-12|3-MEDIUM|Clerk#000000728|0|pecial forges are ironic theodolites. s +56199|92|O|38649.14|1997-07-05|3-MEDIUM|Clerk#000000706|0| even packages are blithely furiously ev +56224|982|F|246449.69|1992-10-26|3-MEDIUM|Clerk#000000786|0|ously. daringly pending foxes according to the furiously regular +56225|1288|O|176699.74|1995-10-16|3-MEDIUM|Clerk#000000560|0|s even, pending deposits. furiously final pains integrate slyly bold r +56226|1273|O|260448.72|1996-12-05|4-NOT SPECIFIED|Clerk#000000818|0|re slyly carefully special +56227|640|O|52659.96|1996-10-01|2-HIGH|Clerk#000000434|0|refully enticing frets above the carefu +56228|211|F|315724.81|1993-12-11|3-MEDIUM|Clerk#000000876|0|cajole even ideas. ironic, pen +56229|1075|O|26662.73|1997-06-28|2-HIGH|Clerk#000000843|0| cajole blithely across the blithely bold dependencie +56230|994|P|130962.71|1995-05-05|1-URGENT|Clerk#000000755|0|tly! fluffily pending instructions are furiously express, even requests. flu +56231|808|O|99161.14|1998-05-16|2-HIGH|Clerk#000000416|0|er express requests are furiously regular, ironic accounts. +56256|122|F|23510.27|1993-08-06|3-MEDIUM|Clerk#000000201|0|ithely special deposits sublate slyly final fo +56257|991|O|143469.70|1995-09-10|3-MEDIUM|Clerk#000000879|0| requests. quickly express requests affix slyly at the slyly bold d +56258|466|O|204077.56|1996-12-07|2-HIGH|Clerk#000000326|0|usual accounts haggle ironic, final requests. request +56259|527|O|16975.63|1995-11-13|5-LOW|Clerk#000000155|0|ourts. daring packages use c +56260|583|F|136916.90|1994-08-16|4-NOT SPECIFIED|Clerk#000000744|0|at fluffily against the regular, sly depths. quickly +56261|1138|F|183467.17|1992-02-29|1-URGENT|Clerk#000000110|0| deposits cajole furiously after the even packages. s +56262|1079|O|143015.93|1996-04-09|5-LOW|Clerk#000000175|0|nts haggle quickly along the +56263|1394|F|58044.91|1993-06-26|5-LOW|Clerk#000000734|0|s are slyly enticing requests. +56288|598|F|171143.96|1993-07-01|4-NOT SPECIFIED|Clerk#000000911|0|ackages integrate carefully abou +56289|25|O|44745.51|1995-12-22|2-HIGH|Clerk#000000942|0|sts ought to sleep according to the sly +56290|304|P|215857.86|1995-04-16|3-MEDIUM|Clerk#000000893|0|into beans. slyly busy dependencies sleep after the furiously expre +56291|893|F|167140.76|1992-09-18|4-NOT SPECIFIED|Clerk#000000226|0|fluffily. foxes wake carefully about the final theodolites. bo +56292|1196|F|275177.40|1992-03-01|5-LOW|Clerk#000000176|0|egular accounts. furiously special frets among the bus +56293|392|F|145600.83|1993-01-06|4-NOT SPECIFIED|Clerk#000000171|0|ccounts wake carefully across +56294|1294|O|214708.01|1998-02-02|3-MEDIUM|Clerk#000000035|0|l deposits. blithely ironic grouches +56295|1009|F|124139.22|1995-02-24|5-LOW|Clerk#000000426|0|ronic dependencies after the furi +56320|679|O|124061.19|1997-08-31|5-LOW|Clerk#000000616|0|g, even foxes integrate blithely fluffily regular pack +56321|424|F|316056.46|1993-04-17|1-URGENT|Clerk#000000669|0|g dependencies. unus +56322|127|O|152161.13|1995-10-01|3-MEDIUM|Clerk#000000031|0|arefully slyly fina +56323|1213|O|187979.89|1996-12-13|1-URGENT|Clerk#000000769|0|nic, bold accounts. furiously +56324|910|O|54844.96|1996-01-03|3-MEDIUM|Clerk#000000376|0|out the blithely even warthogs haggle slyly about the +56325|205|O|26020.72|1997-12-13|1-URGENT|Clerk#000000860|0|al platelets boost blithely. bold requests affix carefully. fu +56326|55|O|50910.22|1998-06-22|1-URGENT|Clerk#000000403|0|sits. furiously pending dolphins are +56327|251|F|220503.03|1993-01-12|3-MEDIUM|Clerk#000000326|0|ithely bold requests wake furiously. final deposits above t +56352|445|O|69741.87|1997-01-02|3-MEDIUM|Clerk#000000799|0|ages across the accounts haggle slyly among the reg +56353|679|O|40374.60|1997-05-07|1-URGENT|Clerk#000000742|0|regular requests? ruthless, special deposits wake blithely regular +56354|1255|F|54465.79|1992-02-17|4-NOT SPECIFIED|Clerk#000000694|0|ar requests cajole quickly carefully unu +56355|1207|O|269251.25|1996-02-29|3-MEDIUM|Clerk#000000029|0|en deposits. carefully ironic requests detect unusual packages. th +56356|82|O|142512.38|1997-11-20|1-URGENT|Clerk#000000888|0|sits cajole slyly. slyly special ideas haggle bli +56357|134|O|18644.74|1996-08-02|1-URGENT|Clerk#000000754|0|nticingly among the ruthless excuses. silent foxes are furiously +56358|20|F|53277.94|1992-03-02|4-NOT SPECIFIED|Clerk#000000129|0|detect fluffily forges. slyly final co +56359|34|F|305024.57|1993-12-23|4-NOT SPECIFIED|Clerk#000000759|0|ng requests haggle. instructions +56384|481|F|286020.40|1992-08-01|1-URGENT|Clerk#000000388|0|odolites. carefully express foxes about the ideas use car +56385|61|O|140441.38|1998-03-29|4-NOT SPECIFIED|Clerk#000000184|0|ar, dogged deposits. slyly special deposits around the regularly expres +56386|797|O|57329.13|1996-11-22|1-URGENT|Clerk#000000617|0|ly pending accounts serve furiously. fluffily unusual requests sleep. +56387|139|O|265649.29|1995-05-21|3-MEDIUM|Clerk#000000412|0|s. even instructions was +56388|1195|O|268872.70|1997-02-14|1-URGENT|Clerk#000000207|0|en, final theodolites. regular, +56389|1079|O|171610.82|1997-07-21|1-URGENT|Clerk#000000539|0|slyly silent excuses. pending, final +56390|1073|O|344963.97|1997-02-15|2-HIGH|Clerk#000000104|0|regular instructions. fluffily +56391|1156|O|177656.19|1995-08-21|4-NOT SPECIFIED|Clerk#000000611|0|phins detect quickly regular foxes. furi +56416|817|F|75214.51|1992-05-14|2-HIGH|Clerk#000000551|0|lets sleep fluffily after the even deposits. furiously special fox +56417|644|O|141678.08|1997-05-28|5-LOW|Clerk#000000575|0|ts are evenly. final packages of the excuses +56418|887|F|134545.52|1992-04-13|1-URGENT|Clerk#000000531|0|ts snooze furiously. regular +56419|1055|F|72680.32|1993-05-22|4-NOT SPECIFIED|Clerk#000000667|0|s. final dependencies nag slyly. requests wa +56420|34|O|144128.48|1995-07-25|5-LOW|Clerk#000000502|0|uctions are slyly. sly pint +56421|1249|O|238044.42|1996-12-19|3-MEDIUM|Clerk#000000684|0|nstructions boost around the regular dolphins. bold deposits caj +56422|115|F|204856.20|1992-02-06|3-MEDIUM|Clerk#000000959|0|ly regular ideas are furiously +56423|964|O|234992.81|1995-12-26|4-NOT SPECIFIED|Clerk#000000894|0| unusual, unusual instructions boost sly +56448|268|F|129803.16|1993-08-22|5-LOW|Clerk#000000308|0|he blithely bold asymp +56449|1480|O|136773.58|1998-05-09|3-MEDIUM|Clerk#000000061|0| boost quickly above the f +56450|796|O|56852.91|1998-07-26|2-HIGH|Clerk#000000598|0|ithely regular decoys. furiously bold packages are furiously final, final fox +56451|64|O|73241.23|1996-11-08|4-NOT SPECIFIED|Clerk#000000165|0|bout the quickly thin platelets. special pinto b +56452|571|F|70192.46|1994-02-15|4-NOT SPECIFIED|Clerk#000000068|0|st above the accoun +56453|25|F|223616.41|1992-04-12|1-URGENT|Clerk#000000261|0| slyly furiously even re +56454|187|O|104527.35|1996-12-15|4-NOT SPECIFIED|Clerk#000000206|0|sts nod carefully. quickly bold packages wake sile +56455|379|F|161118.20|1992-01-24|3-MEDIUM|Clerk#000000326|0|ajole slyly alongside +56480|559|F|1879.71|1993-03-05|2-HIGH|Clerk#000000514|0|posits use. furiously even accounts wake after the blithely even +56481|1135|F|34404.71|1993-04-13|4-NOT SPECIFIED|Clerk#000000773|0| furiously final dependencies haggle slyly alongside of t +56482|1495|F|136120.29|1993-06-08|3-MEDIUM|Clerk#000000368|0|kly regular packages are quickly behind the fluffil +56483|1039|F|51266.11|1994-02-20|2-HIGH|Clerk#000000609|0|ven requests wake. carefully final in +56484|1111|O|264647.97|1995-11-22|4-NOT SPECIFIED|Clerk#000000089|0|. pending, even requests use slyly against the slyly pend +56485|70|O|32629.72|1996-08-07|5-LOW|Clerk#000000438|0|ly. requests wake under the fluffily even accounts. fluffily regular +56486|1267|F|182649.03|1994-05-29|1-URGENT|Clerk#000000694|0|aggle furiously ironically blithe foxes. bold platelets sleep along +56487|553|O|45910.43|1995-06-09|3-MEDIUM|Clerk#000000056|0|lyly thin deposits cajole. express ideas are after the carefully iro +56512|484|O|77614.29|1997-04-21|2-HIGH|Clerk#000000040|0|fully. quickly express requests boost around the ironic excuses. bold +56513|169|O|266713.74|1996-06-06|3-MEDIUM|Clerk#000000848|0|ests haggle quickly: packages detect carefully among the fluffil +56514|655|F|221105.91|1992-02-12|5-LOW|Clerk#000000103|0|slyly bold requests across the pinto beans are carefully against the quickly +56515|1453|O|119676.86|1995-05-28|3-MEDIUM|Clerk#000000625|0|ly bold requests. blithely spe +56516|320|F|144353.45|1994-08-04|3-MEDIUM|Clerk#000000828|0|. blithely even platelets al +56517|763|O|15793.44|1997-10-23|1-URGENT|Clerk#000000679|0|sits. slyly bold sentiments cajole furio +56518|277|O|121661.58|1998-03-08|4-NOT SPECIFIED|Clerk#000000963|0|blithely dogged deposi +56519|13|O|139028.29|1996-03-12|3-MEDIUM|Clerk#000000530|0|ts. slyly even accounts wake slyly. q +56544|826|O|156272.21|1996-11-10|4-NOT SPECIFIED|Clerk#000000702|0|xcuses. slyly bold asymptotes among the carefully pending accounts wa +56545|698|O|49279.85|1995-05-28|3-MEDIUM|Clerk#000000010|0|ages. carefully regular accounts must cajole carefully blithely ex +56546|154|O|169299.60|1997-09-02|4-NOT SPECIFIED|Clerk#000000869|0|cross the bold package +56547|760|F|87685.36|1993-06-26|4-NOT SPECIFIED|Clerk#000000026|0|nic packages are slyly above the furiously ironic packages: +56548|85|F|125067.45|1992-09-06|3-MEDIUM|Clerk#000000487|0|slyly about the instructions. slyly special decoys boost. +56549|730|O|9691.97|1997-01-09|5-LOW|Clerk#000000416|0|ies. ironic, express sheaves wake about the quickly bold instructions. pendin +56550|755|P|300442.88|1995-04-09|4-NOT SPECIFIED|Clerk#000000390|0|asymptotes wake slyly bold +56551|986|O|261815.07|1998-02-13|5-LOW|Clerk#000000902|0| packages. slyly blithe ideas print furiously. quickly regular i +56576|1145|O|27958.01|1996-09-20|5-LOW|Clerk#000000653|0|g the blithely unusual accounts boost furiously across the h +56577|491|O|234951.75|1995-11-03|1-URGENT|Clerk#000000325|0|ain tithes. carefully pending pinto beans need +56578|1172|O|105741.73|1997-03-14|5-LOW|Clerk#000000209|0|cajole slyly across the slyly regular depo +56579|611|O|37857.53|1996-06-24|5-LOW|Clerk#000000975|0|es affix. slyly ironi +56580|1217|O|230131.18|1995-08-15|4-NOT SPECIFIED|Clerk#000000652|0|he unusual, thin foxes. slyl +56581|1162|F|91141.27|1994-02-09|2-HIGH|Clerk#000000397|0|ges sleep pending instructions. regular, silent foxes use according to +56582|55|F|195785.33|1994-06-13|5-LOW|Clerk#000000563|0|ronic requests haggle above the furiously final deposits. pending inst +56583|139|O|70214.54|1997-10-19|3-MEDIUM|Clerk#000000031|0| slyly stealthy accounts above the quickly silent +56608|1249|F|47833.65|1994-11-19|1-URGENT|Clerk#000000449|0| deposits. final, express requests are +56609|203|O|151599.79|1997-01-31|2-HIGH|Clerk#000000576|0|riously express packages ha +56610|776|F|21291.39|1993-03-08|3-MEDIUM|Clerk#000000474|0|pinto beans. even packages sleep carefully. pending, +56611|1376|O|62394.25|1995-12-02|1-URGENT|Clerk#000000644|0|blithely. quickly regular accounts cajole alongside of the s +56612|761|F|10433.01|1994-07-23|2-HIGH|Clerk#000000002|0|leep blithely. requests sleep blithely even deposits. furio +56613|1318|F|96015.09|1993-10-23|3-MEDIUM|Clerk#000000879|0|onic foxes nag. ironic, express asymp +56614|317|F|267719.81|1992-09-05|2-HIGH|Clerk#000000478|0|slyly silent instructions. +56615|686|O|82205.62|1995-06-07|1-URGENT|Clerk#000000774|0| fluffily ironic requests. slyly final accounts boost b +56640|1040|O|239793.75|1995-08-26|2-HIGH|Clerk#000000888|0|arefully final requests haggle slowl +56641|382|O|37497.26|1996-05-03|4-NOT SPECIFIED|Clerk#000000372|0| the final ideas. carefully final theodolites dazzle around t +56642|517|O|254893.94|1996-02-23|1-URGENT|Clerk#000000637|0|nto beans. final notor +56643|707|F|254141.35|1992-04-29|2-HIGH|Clerk#000000417|0|ep. carefully even packages nod +56644|494|F|219452.54|1992-11-29|4-NOT SPECIFIED|Clerk#000000295|0|sits cajole among the special accounts. regular, spe +56645|1289|F|277027.85|1992-01-07|5-LOW|Clerk#000000424|0|foxes. packages eat furiously. daringl +56646|1394|F|114787.77|1993-05-20|1-URGENT|Clerk#000000652|0|ecial accounts are across the fluffily regular dol +56647|1069|O|70467.49|1995-08-04|3-MEDIUM|Clerk#000000355|0|uriously among the entici +56672|152|F|137560.73|1992-05-13|2-HIGH|Clerk#000000309|0|t the regular packages. slyly iron +56673|1240|F|80570.68|1993-01-21|1-URGENT|Clerk#000000520|0|pending accounts. fluffily final excuses use slyly against the even, regular +56674|1111|F|113151.19|1993-09-17|5-LOW|Clerk#000000836|0|gle special courts. regular, special foxes use qui +56675|1078|F|143945.32|1992-01-04|4-NOT SPECIFIED|Clerk#000000140|0|osits. slyly even accounts wake slyly ironic deposits. regular e +56676|1330|F|18910.25|1992-10-26|1-URGENT|Clerk#000000167|0|. blithely final packages alongside of the blithely special pinto beans haggl +56677|187|F|114909.68|1994-04-12|2-HIGH|Clerk#000000767|0|t accounts sleep blithely above the slyly bold foxes. +56678|643|O|306488.29|1996-11-27|1-URGENT|Clerk#000000360|0|dependencies sleep blithely bold deposits. +56679|893|O|252856.05|1997-05-20|3-MEDIUM|Clerk#000000926|0|y. slow, ironic instructions use blithely. fluff +56704|392|F|130469.74|1992-07-28|1-URGENT|Clerk#000000133|0|nt deposits. careful +56705|619|O|282923.82|1997-01-28|4-NOT SPECIFIED|Clerk#000000504|0|ial, regular packages. c +56706|1201|F|177031.54|1994-11-11|2-HIGH|Clerk#000000933|0|odolites haggle slyly across the furious +56707|85|F|207081.52|1992-12-23|2-HIGH|Clerk#000000384|0|uests. slyly ironic deposits breac +56708|544|F|208742.11|1992-12-03|4-NOT SPECIFIED|Clerk#000000538|0|unusual accounts. furiously silent requests cajole slyly even, stealt +56709|742|O|151569.21|1997-04-01|2-HIGH|Clerk#000000183|0|across the furiously express requests. +56710|329|F|263290.84|1993-05-12|4-NOT SPECIFIED|Clerk#000000281|0|, even ideas nag fluffi +56711|73|F|114066.99|1995-02-07|5-LOW|Clerk#000000091|0|, bold pains grow slyly. even instructions may detect furiously. permanen +56736|1369|O|144548.15|1998-01-13|4-NOT SPECIFIED|Clerk#000000436|0|s. quickly ironic asymptotes cajole slyly. furiou +56737|1426|O|138349.34|1997-05-05|1-URGENT|Clerk#000000547|0|ests affix slowly even deposits. fluffily special theodolites en +56738|884|O|175576.13|1996-04-09|5-LOW|Clerk#000000436|0|. quickly pending pinto beans cajole. carefully bold instructions cajol +56739|1397|F|184229.19|1993-04-15|3-MEDIUM|Clerk#000000300|0|iously express deposits. quietly regular instructions mold slyly. blit +56740|1324|F|63217.97|1992-10-17|5-LOW|Clerk#000000855|0| final asymptotes grow +56741|310|O|70833.16|1997-03-20|5-LOW|Clerk#000000759|0|osits: even ideas cajole quickly regular, bold accounts. furiously special +56742|254|O|85678.32|1996-09-07|3-MEDIUM|Clerk#000000610|0|lly according to the regular deposits. furiously ironi +56743|343|O|280081.62|1995-06-23|3-MEDIUM|Clerk#000000390|0|leep quickly. special accounts +56768|685|O|73632.26|1995-07-28|1-URGENT|Clerk#000000183|0|y. blithely final waters boo +56769|506|F|43035.64|1993-11-30|3-MEDIUM|Clerk#000000546|0|depths detect bold frets. +56770|472|O|156762.28|1997-10-20|1-URGENT|Clerk#000000050|0|wake slyly furiously bold deposits. blithely blithe dep +56771|995|O|119055.86|1997-03-23|3-MEDIUM|Clerk#000000243|0|inal packages. excuses wake fluffily blithely regul +56772|424|F|356912.77|1993-01-14|1-URGENT|Clerk#000000758|0|ng to the ironic theodolites. blithely regular accounts run along +56773|586|F|57686.30|1992-10-18|1-URGENT|Clerk#000000526|0| affix carefully across the blithely regular dependencies. final packages +56774|1424|O|229632.27|1996-12-05|2-HIGH|Clerk#000000729|0|e quietly before the regular theodolites. requests wake fluffily. slyl +56775|10|F|42578.88|1994-10-11|1-URGENT|Clerk#000000010|0| blithely express, pending packages. slyly quiet dep +56800|970|F|248561.77|1993-02-01|4-NOT SPECIFIED|Clerk#000000156|0|requests detect quickly. bold dolphins +56801|757|O|243247.92|1996-03-25|5-LOW|Clerk#000000108|0|onic instructions among the bold, ironic pinto bean +56802|1115|F|157249.57|1992-05-30|2-HIGH|Clerk#000000070|0|uriously enticing r +56803|1378|F|289994.35|1994-12-11|4-NOT SPECIFIED|Clerk#000000400|0|yly about the carefully regular instructions. blithely bold deposits use +56804|787|P|192592.97|1995-03-28|1-URGENT|Clerk#000000614|0| furiously regular deposits. carefully special frets wake quickl +56805|287|F|274018.73|1992-06-06|2-HIGH|Clerk#000000286|0|ual packages poach alo +56806|349|O|85179.13|1997-10-31|3-MEDIUM|Clerk#000000831|0|uctions. regular, e +56807|907|F|91689.65|1994-04-22|2-HIGH|Clerk#000000113|0|. fluffily regular packages haggle furiously acros +56832|1150|O|161962.53|1997-03-01|4-NOT SPECIFIED|Clerk#000000036|0|requests sleep quickly. blithely special deposits +56833|1223|F|159655.69|1994-09-06|3-MEDIUM|Clerk#000000266|0|quickly final requests are above the furiously ironic dep +56834|1294|P|143728.36|1995-05-02|2-HIGH|Clerk#000000716|0|furiously above the carefully unusual deposi +56835|637|F|166342.74|1993-02-21|4-NOT SPECIFIED|Clerk#000000315|0|tions use furiously according to the regular asy +56836|809|O|243614.13|1996-08-24|3-MEDIUM|Clerk#000000890|0|fully unusual excuses. furiously even ideas boost fu +56837|439|F|63927.57|1993-12-15|5-LOW|Clerk#000000471|0|y furiously regular excuses. fluffily bold accounts sleep slyly around the pl +56838|962|O|90558.82|1995-07-30|1-URGENT|Clerk#000000036|0|ns wake after the pend +56839|599|O|115833.32|1997-10-29|5-LOW|Clerk#000000437|0|e furiously final instructions. furiously express packages impress fluffily +56864|1171|O|93836.61|1997-08-09|5-LOW|Clerk#000000183|0|bout the quickly reg +56865|1054|O|149796.90|1997-04-16|3-MEDIUM|Clerk#000000197|0|y pending excuses boost slyly. instru +56866|763|O|186084.69|1997-12-08|3-MEDIUM|Clerk#000000380|0|e carefully silent requests. carefully r +56867|838|O|108094.85|1996-08-25|5-LOW|Clerk#000000064|0|e slyly above the furiously special deposits. slyly pending hockey players +56868|151|O|243769.64|1995-12-04|5-LOW|Clerk#000000219|0|blithely final ideas integrate. unusual packages agai +56869|1228|F|12043.69|1993-07-24|5-LOW|Clerk#000000896|0|regular deposits. reg +56870|74|F|95114.49|1992-08-19|1-URGENT|Clerk#000000135|0|s. carefully silent ideas cajole among the silent accounts. enticingly regu +56871|910|O|18434.85|1998-01-20|2-HIGH|Clerk#000000472|0|hely furiously unusual accounts. furiously reg +56896|394|O|137214.79|1996-05-27|2-HIGH|Clerk#000000780|0|n requests. blithely ironic packages haggle quickly ironic dep +56897|721|O|210488.39|1997-06-19|1-URGENT|Clerk#000000213|0| carefully regular accounts are carefully blithely regula +56898|748|O|99397.03|1998-07-27|2-HIGH|Clerk#000000774|0|refully final packages. fluffily bold requests alongside o +56899|538|F|129712.47|1994-05-23|5-LOW|Clerk#000000753|0|g deposits haggle furiously according to the sauternes. regular +56900|358|O|175448.24|1995-11-27|4-NOT SPECIFIED|Clerk#000000500|0|ly special asymptotes sleep blithely along the slyly +56901|1471|F|322828.75|1994-09-12|1-URGENT|Clerk#000000088|0|d, ironic platelets. blithely even deposits wake carefully among the carefully +56902|830|O|112267.28|1996-11-10|4-NOT SPECIFIED|Clerk#000000788|0|deposits wake never among the regular courts. bold, express asympt +56903|1082|O|105632.45|1996-05-15|2-HIGH|Clerk#000000989|0| furiously ironic requests. furious +56928|1130|O|162778.26|1998-05-25|1-URGENT|Clerk#000000285|0|across the carefully unusual theodolit +56929|1156|O|56291.84|1995-09-27|2-HIGH|Clerk#000000499|0| ironic deposits integrate above t +56930|491|F|276336.76|1992-08-18|5-LOW|Clerk#000000399|0|sual deposits according to th +56931|34|F|198467.73|1993-02-04|2-HIGH|Clerk#000000867|0|ide of the furiously even pa +56932|941|O|87980.46|1998-03-17|2-HIGH|Clerk#000000527|0|r, regular requests use fluffily packages. blithely regular packa +56933|475|O|152076.08|1998-06-20|2-HIGH|Clerk#000000278|0|al dolphins. carefully final packages sleep carefully above the sl +56934|1486|O|151099.97|1997-10-22|4-NOT SPECIFIED|Clerk#000000522|0|ithely carefully bold frays. quickly final requests haggle +56935|1144|F|27934.01|1994-01-07|1-URGENT|Clerk#000000400|0|ven, regular pinto beans haggle. fluffily unusual accounts alon +56960|1202|F|67204.80|1994-08-07|2-HIGH|Clerk#000000556|0| ironic requests haggle express packages. foxes along the blithel +56961|815|O|159947.34|1997-02-02|4-NOT SPECIFIED|Clerk#000000204|0|ding requests. accounts nag slyly final ideas! blithely regular orbits +56962|190|F|196882.77|1994-01-03|4-NOT SPECIFIED|Clerk#000000137|0|s eat. furiously ironic requests are c +56963|599|O|185655.87|1997-02-26|1-URGENT|Clerk#000000206|0| about the accounts. slyly express accounts wa +56964|19|O|173803.02|1998-01-12|4-NOT SPECIFIED|Clerk#000000625|0|nic, regular deposits. bold deposits sleep carefully. pending pinto beans +56965|1445|O|163353.59|1997-09-08|1-URGENT|Clerk#000000606|0|detect slyly. final asymptotes haggle +56966|1117|O|148270.67|1996-12-14|3-MEDIUM|Clerk#000000825|0| nag. blithely even theodolites would wake bl +56967|388|F|161492.16|1992-03-03|5-LOW|Clerk#000000954|0|ithely bold packages wake slyly regular deposits. slyly express fox +56992|487|F|149345.46|1993-04-19|4-NOT SPECIFIED|Clerk#000000582|0|fily even pinto beans was. carefu +56993|43|O|126606.87|1998-03-12|2-HIGH|Clerk#000000033|0|ven requests. fluffily unusual packages integrate. cl +56994|529|O|147144.39|1998-06-05|3-MEDIUM|Clerk#000000295|0|sly pending excuses boost quickly above the final asymptotes. blithely +56995|1009|F|190567.21|1994-10-16|3-MEDIUM|Clerk#000000904|0| use final, final foxes. special, final instructions integrat +56996|485|O|66157.79|1996-03-15|2-HIGH|Clerk#000000823|0|le carefully careful requests. fluffily even foxes boost carefully carefully +56997|761|O|12386.30|1996-03-08|5-LOW|Clerk#000000121|0|ts sleep carefully excuses. furiously regu +56998|1163|O|26516.16|1997-11-22|3-MEDIUM|Clerk#000000671|0|l warthogs cajole enticingly. slyly regul +56999|796|O|6244.75|1997-06-10|5-LOW|Clerk#000000181|0|instructions promise slyly ironic pinto beans. final requests u +57024|1133|O|256130.58|1996-09-03|3-MEDIUM|Clerk#000000106|0|dolites. carefully ironic instructions +57025|142|F|38905.67|1992-06-27|3-MEDIUM|Clerk#000000874|0|express requests haggle slyly furiously even theodolites. unusual +57026|479|O|28564.46|1998-07-05|4-NOT SPECIFIED|Clerk#000000509|0|t the carefully pending excuses. realms hag +57027|791|F|68263.54|1995-01-21|4-NOT SPECIFIED|Clerk#000000869|0|egular packages; slyly thin +57028|520|F|37205.53|1994-07-09|4-NOT SPECIFIED|Clerk#000000069|0|express platelets wake carefully according to the even accounts. clo +57029|1034|P|113622.42|1995-03-09|1-URGENT|Clerk#000000384|0|heodolites sleep? furiously ironic instru +57030|388|O|228626.18|1998-05-14|4-NOT SPECIFIED|Clerk#000000239|0|ously after the carefully enticing excuses! even, even pinto beans accor +57031|1085|F|27894.11|1992-06-28|3-MEDIUM|Clerk#000000325|0|furiously ironic deposits. final theodolites sleep p +57056|577|F|31483.63|1992-11-09|5-LOW|Clerk#000000377|0|aggle furiously special requests. regular, regular accounts en +57057|713|F|28449.48|1992-04-13|3-MEDIUM|Clerk#000000030|0|rts. quickly unusual requests are +57058|1373|F|86743.05|1992-05-10|3-MEDIUM|Clerk#000000559|0|es. blithely silent excuses nag according to the silent packages. blithely +57059|1471|O|105530.73|1995-06-02|3-MEDIUM|Clerk#000000308|0|final ideas breach sometimes. fluffily furious account +57060|1282|O|264623.66|1997-04-05|3-MEDIUM|Clerk#000000066|0|l deposits shall have to integrate never +57061|1231|F|241146.83|1994-12-01|5-LOW|Clerk#000000169|0|bt. furiously even asymptotes cajole. carefully sly theodolites cajole car +57062|1465|O|181428.76|1996-06-07|3-MEDIUM|Clerk#000000057|0| ruthless packages sleep fur +57063|812|O|153866.31|1995-06-03|3-MEDIUM|Clerk#000000104|0| asymptotes haggle pi +57088|725|O|272399.20|1997-09-10|2-HIGH|Clerk#000000031|0|fix. even instructions poach fluffily about the final, unusual re +57089|149|F|36089.05|1992-12-25|5-LOW|Clerk#000000100|0|fully even deposits haggle slyly across the regular deposits; furiously +57090|496|F|165927.83|1992-07-27|4-NOT SPECIFIED|Clerk#000000136|0|outs cajole closely acco +57091|1372|O|186666.91|1995-11-01|3-MEDIUM|Clerk#000000430|0|he notornis. blithe +57092|226|F|109680.37|1993-05-02|1-URGENT|Clerk#000000647|0|blithely. regular, even depths use furiously unusual fox +57093|767|F|107703.08|1992-05-03|5-LOW|Clerk#000000867|0|ake furiously blithely regular depos +57094|217|O|113821.92|1998-07-18|2-HIGH|Clerk#000000710|0|ress excuses. slyly special packages haggle careful +57095|917|F|7194.88|1995-03-24|3-MEDIUM|Clerk#000000142|0|lites detect. fluffily regular instructions affix along the slyly e +57120|659|O|125300.01|1996-06-05|1-URGENT|Clerk#000000231|0|wake blithely against the furiously final platelets. furiously express +57121|301|O|146268.32|1995-11-17|4-NOT SPECIFIED|Clerk#000000882|0| the ideas. fluffily furi +57122|307|O|65111.42|1997-03-11|4-NOT SPECIFIED|Clerk#000000097|0|s. slyly regular asymptotes are. enticing, ironic requests across the +57123|1159|O|273203.52|1997-05-12|2-HIGH|Clerk#000000634|0| even deposits. carefully final excuses between +57124|826|O|172949.12|1996-02-29|1-URGENT|Clerk#000000487|0|endencies sleep special pint +57125|368|F|303458.86|1993-06-04|3-MEDIUM|Clerk#000000751|0|y ruthless theodolites cajole blit +57126|125|O|150280.58|1998-02-14|4-NOT SPECIFIED|Clerk#000000758|0|out the epitaphs are frays. rea +57127|377|F|46484.63|1993-02-17|5-LOW|Clerk#000000007|0|ld have to haggle slyly. carefully ironic warhorses poach blithel +57152|1369|F|137212.35|1992-09-04|5-LOW|Clerk#000000912|0|accounts boost furiously. furiously regular de +57153|268|F|84966.87|1994-05-27|1-URGENT|Clerk#000000044|0|refully ironic packages. final, unusual accounts wake sometimes after +57154|1448|O|88538.53|1996-11-22|4-NOT SPECIFIED|Clerk#000000905|0|carefully ironic packages wake blithely fl +57155|494|F|199365.34|1994-06-18|1-URGENT|Clerk#000000205|0|y regular foxes detect against the packages. quiet, regular requests use flu +57156|302|O|39610.40|1996-04-25|1-URGENT|Clerk#000000762|0|wake. carefully express accounts mold accounts. carefully +57157|13|F|54291.79|1992-02-27|1-URGENT|Clerk#000000928|0|ckly final dinos nag above the slyly pending foxes. +57158|1207|O|72455.73|1997-01-12|2-HIGH|Clerk#000000164|0| silent excuses. blithely pending excuses cajole furi +57159|437|F|335455.33|1993-02-13|1-URGENT|Clerk#000000350|0|efully idle warhorses. close, express deposits +57184|1454|O|145246.80|1998-01-19|2-HIGH|Clerk#000000604|0|onic deposits. regular instructions +57185|304|O|42295.89|1995-05-24|3-MEDIUM|Clerk#000000194|0|lyly across the blithely r +57186|877|F|64166.04|1993-04-21|5-LOW|Clerk#000000109|0|endencies cajole regular ideas. slyly pending +57187|1294|O|85093.01|1998-03-20|2-HIGH|Clerk#000000988|0|uches. furiously quick pinto bean +57188|301|F|65185.61|1994-03-10|3-MEDIUM|Clerk#000000170|0|ets. slyly ironic d +57189|743|F|40158.24|1992-11-18|5-LOW|Clerk#000000982|0|r the idle accounts hang after the quickly bold theodolites. blithe +57190|1261|F|114833.15|1993-05-29|3-MEDIUM|Clerk#000000606|0|bold patterns sublate. thin, unusual dependencies haggle quic +57191|601|O|248544.92|1997-01-01|5-LOW|Clerk#000000137|0|y above the ironic instructions. carefully thin attainments according to the +57216|1165|F|366277.63|1993-07-30|2-HIGH|Clerk#000000867|0| final foxes across the enticingly final deposits eat furi +57217|691|F|216509.51|1995-01-22|3-MEDIUM|Clerk#000000209|0|lithely pending reque +57218|1271|O|104196.83|1997-06-12|5-LOW|Clerk#000000700|0| dependencies wake slyly. blithely regular dependencies alo +57219|580|O|118026.81|1995-11-02|1-URGENT|Clerk#000000603|0|wake around the furiously r +57220|998|O|78448.07|1995-09-04|1-URGENT|Clerk#000000646|0|ding excuses. carefully final instructions use quickly final r +57221|563|O|5903.06|1997-11-01|3-MEDIUM|Clerk#000000598|0|unts sleep. regular, even foxes are sl +57222|1490|O|105645.11|1996-11-10|4-NOT SPECIFIED|Clerk#000000559|0|fully. idly regular deposits around t +57223|314|O|40158.05|1996-01-06|3-MEDIUM|Clerk#000000312|0|ainst the slyly regular courts. blithely bold asymptotes shall nag. unusual +57248|1379|F|50048.99|1994-10-16|1-URGENT|Clerk#000000627|0|en packages ought to wake blithely fluffily ironi +57249|1486|F|291049.25|1993-07-21|2-HIGH|Clerk#000000047|0| accounts. fluffily special instructions along +57250|1184|O|117340.62|1996-01-01|4-NOT SPECIFIED|Clerk#000000136|0|cross the unusual, unusual dependencies. furiously regular asymp +57251|853|O|45509.14|1996-04-25|5-LOW|Clerk#000000309|0|unts wake. fluffily final excuses x-ray slyly carefully daring d +57252|317|O|178065.85|1997-10-17|4-NOT SPECIFIED|Clerk#000000602|0|thely ironic deposits a +57253|707|F|270095.22|1994-01-01|1-URGENT|Clerk#000000569|0|ly pending theodolites wake above the iro +57254|22|O|268334.28|1998-02-28|5-LOW|Clerk#000000466|0|s thrash regular orbits. final the +57255|49|O|163750.76|1997-10-01|4-NOT SPECIFIED|Clerk#000000213|0|unts. final packages +57280|1304|F|133658.48|1992-02-01|3-MEDIUM|Clerk#000000106|0|ges sleep slyly alongside of the car +57281|889|F|146072.76|1993-04-21|2-HIGH|Clerk#000000874|0|among the quickly pending requests. e +57282|71|O|147480.08|1996-12-18|4-NOT SPECIFIED|Clerk#000000760|0|lyly special excuses. blithely final pinto beans cajole ca +57283|34|F|114507.43|1994-03-16|2-HIGH|Clerk#000000792|0|pending requests. furiously silent packages accordin +57284|628|O|133098.32|1997-09-08|1-URGENT|Clerk#000000887|0|requests. carefully ironic requests hinder sl +57285|1462|O|199483.62|1998-01-31|1-URGENT|Clerk#000000374|0|g express, ironic requests. blithely regular t +57286|400|O|8038.96|1996-02-18|3-MEDIUM|Clerk#000000994|0|ress accounts use slyly. blithely express instructions print quickly. sl +57287|1369|O|51704.82|1995-10-29|4-NOT SPECIFIED|Clerk#000000654|0|y furious deposits +57312|1465|F|58111.42|1993-08-02|3-MEDIUM|Clerk#000000743|0|y pending grouches. furiously pending packages along the blithely express r +57313|473|O|144872.75|1997-06-18|3-MEDIUM|Clerk#000000924|0|lets detect across the even, +57314|1105|F|297649.51|1993-10-13|5-LOW|Clerk#000000425|0|unts sleep. furiously even acco +57315|1151|F|1453.27|1994-05-12|2-HIGH|Clerk#000000127|0|ously pending deposits. express, express p +57316|92|O|204010.37|1996-09-28|1-URGENT|Clerk#000000576|0|ding to the special asymptotes. slowly unusual instructions a +57317|424|O|23761.19|1995-12-25|3-MEDIUM|Clerk#000000842|0|posits haggle slyly against the +57318|50|F|223735.22|1993-01-11|3-MEDIUM|Clerk#000000221|0|e along the even, even ideas. final requests wake blithely. regula +57319|514|F|193303.45|1992-10-18|5-LOW|Clerk#000000725|0|ic grouches sleep thin deposits. packages after the pending, si +57344|571|F|69719.15|1993-09-25|2-HIGH|Clerk#000000650|0|y above the slyly even accounts. slyly bold deposits +57345|1408|O|132998.04|1998-07-17|4-NOT SPECIFIED|Clerk#000000830|0|iously ironic asymptotes boost quickly. even ideas doze quickly a +57346|1498|F|50050.53|1992-01-31|2-HIGH|Clerk#000000344|0|requests affix furiously. silent instructions cajol +57347|262|O|191964.02|1996-12-09|5-LOW|Clerk#000000377|0|ccounts. carefully ironic accounts nag carefully busy frays. care +57348|1156|F|102628.86|1993-04-05|3-MEDIUM|Clerk#000000349|0|despite the quickly unusual requests no +57349|1261|F|163079.65|1992-04-12|1-URGENT|Clerk#000000318|0|as. slyly special asymptotes use. furiously unusual requests sleep car +57350|883|O|231054.67|1995-05-26|2-HIGH|Clerk#000000862|0|silent dugouts are sometimes pending instructions. +57351|715|O|39346.75|1995-12-23|1-URGENT|Clerk#000000505|0| furiously slyly even patterns. silent foxes +57376|676|O|411255.46|1995-06-20|1-URGENT|Clerk#000000618|0|ular Tiresias after the furiously regular requests sha +57377|232|O|82242.93|1998-04-21|3-MEDIUM|Clerk#000000651|0| fluffily silent ideas. +57378|469|F|72620.43|1994-12-29|4-NOT SPECIFIED|Clerk#000000028|0|ions dazzle slyly express instructions! fluffily +57379|1156|F|27203.63|1994-06-06|2-HIGH|Clerk#000000572|0|egular, pending requests. quickly enticing foxes sleep according to the slyly +57380|1112|O|232137.69|1995-10-21|5-LOW|Clerk#000000810|0|ld wake furiously. regular, bold orbits alongside of the quietly express acco +57381|1135|F|186131.15|1994-08-08|2-HIGH|Clerk#000000037|0|ly unusual pinto beans. carefully ironic packages are carefully re +57382|556|F|125633.12|1994-03-24|3-MEDIUM|Clerk#000000392|0|ously final, unusual excus +57383|283|F|262359.75|1993-11-14|3-MEDIUM|Clerk#000000929|0|ithely packages; unusual, express foxes haggle quickly final dependencies. s +57408|787|O|179938.82|1997-02-19|1-URGENT|Clerk#000000781|0|pendencies. blithely da +57409|682|F|191167.68|1994-11-21|4-NOT SPECIFIED|Clerk#000000187|0|osits haggle furiously silently regular request +57410|751|O|182917.77|1998-01-17|1-URGENT|Clerk#000000283|0|lar requests nod above the fluffily pending packages. special requests na +57411|533|O|71828.69|1998-05-03|1-URGENT|Clerk#000000658|0| theodolites cajole carefully around the carefully sp +57412|811|F|31508.89|1994-07-14|5-LOW|Clerk#000000301|0|final packages could hag +57413|1438|O|163205.99|1998-07-20|2-HIGH|Clerk#000000238|0|dependencies haggle slyly by the accounts. special idea +57414|644|F|42583.07|1992-06-17|2-HIGH|Clerk#000000461|0|en dolphins. slyly regular pinto beans are carefully through the final +57415|515|F|137430.61|1994-03-25|3-MEDIUM|Clerk#000000810|0|jole quickly against the regular deposits. regul +57440|746|F|70068.36|1993-07-24|5-LOW|Clerk#000000638|0|cording to the blithely express ideas doubt car +57441|728|O|238338.31|1996-06-23|1-URGENT|Clerk#000000719|0|ticing requests sleep unusual, even foxes. carefully even deposit +57442|839|O|183775.96|1996-10-29|4-NOT SPECIFIED|Clerk#000000758|0|haggle ironic platelets. furiously unusual pin +57443|280|O|145076.81|1997-12-09|3-MEDIUM|Clerk#000000030|0|ncies. blithely ironic dugouts nag. carefully ironic foxes mold acros +57444|1460|O|91236.70|1995-05-15|1-URGENT|Clerk#000000345|0|ess escapades cajole along the unusual, regular sauter +57445|724|F|201118.68|1994-08-01|3-MEDIUM|Clerk#000000397|0|s boost furiously. special, f +57446|760|O|149094.08|1997-11-28|2-HIGH|Clerk#000000380|0|ts haggle blithely ironic warhorses. sl +57447|112|O|187464.22|1995-07-05|4-NOT SPECIFIED|Clerk#000000233|0| boost blithely. slyly express accounts past the iron +57472|787|O|255515.42|1998-07-17|5-LOW|Clerk#000000777|0|ly even dugouts. carefully ironic deposits nag fluffily about the never specia +57473|1204|F|36789.47|1992-03-08|5-LOW|Clerk#000000752|0| quickly fluffily ironic packages. regular courts cajole +57474|521|O|53800.51|1996-05-27|1-URGENT|Clerk#000000844|0|uffy instructions wake quietly against the furiously +57475|28|F|273999.85|1993-10-05|5-LOW|Clerk#000000489|0|ithely. carefully ironic excuses sleep furiously; caref +57476|784|F|89059.42|1994-03-17|2-HIGH|Clerk#000000284|0|s. furiously express accounts engage. carefully bold pains acco +57477|1169|F|174446.52|1993-09-27|2-HIGH|Clerk#000000280|0|the unusual, unusual foxes: +57478|1030|F|253282.42|1993-10-04|1-URGENT|Clerk#000000018|0|uests after the deposits are furiously +57479|415|P|65654.07|1995-03-16|2-HIGH|Clerk#000000453|0|ost. slyly furious ideas haggle blithely special instr +57504|1288|F|97579.50|1994-08-05|4-NOT SPECIFIED|Clerk#000000752|0|requests. furiously express requests use blithely. platelets ac +57505|1474|O|209048.32|1996-11-25|2-HIGH|Clerk#000000069|0| have to haggle blithely slyly bold depths. final, regular frays imp +57506|1037|F|185914.52|1994-02-14|3-MEDIUM|Clerk#000000505|0|ly ironic pinto beans nag blithely fluf +57507|697|F|229055.13|1994-06-27|1-URGENT|Clerk#000000752|0|ke according to the carefully unusual ideas. carefully regular p +57508|1199|O|138294.16|1997-01-06|5-LOW|Clerk#000000689|0|ounts wake quickly close, regular accounts. bold pinto bea +57509|1064|F|255237.44|1994-02-22|5-LOW|Clerk#000000992|0|ironic requests. regular, permanent theodolites cajole along +57510|1480|O|113282.36|1995-12-11|4-NOT SPECIFIED|Clerk#000000795|0|y quickly even packages. blithely ironic asy +57511|919|F|118995.36|1994-10-07|1-URGENT|Clerk#000000341|0|y whithout the slyly ironic waters. final ideas after the ironic excuse +57536|1231|F|61067.64|1992-10-30|3-MEDIUM|Clerk#000000589|0|nding accounts. carefully fi +57537|1363|F|304002.29|1992-09-19|3-MEDIUM|Clerk#000000087|0|to beans promise carefull +57538|262|F|341793.55|1993-02-21|1-URGENT|Clerk#000000556|0|s. requests against the ruthlessly special requests wake express depos +57539|1118|F|64622.03|1992-02-03|5-LOW|Clerk#000000941|0|ickly regular requests around the regular accounts integrate around the +57540|1175|F|156862.10|1992-06-28|3-MEDIUM|Clerk#000000061|0|s kindle alongside of the furiously silent requests. +57541|631|F|30326.41|1992-02-23|4-NOT SPECIFIED|Clerk#000000859|0|yly against the carefully regular platele +57542|859|F|173585.47|1994-08-23|2-HIGH|Clerk#000000236|0|e slyly express deposits cajole above the pending, unusual pa +57543|733|F|278765.33|1992-05-12|2-HIGH|Clerk#000000617|0| requests wake. carefully +57568|331|F|207690.52|1993-06-18|4-NOT SPECIFIED|Clerk#000000216|0|haggle furiously final theodolites. furiously ironic foxes poach fluffi +57569|655|O|81284.57|1996-12-30|2-HIGH|Clerk#000000699|0|al, express requests slee +57570|341|F|128015.26|1992-09-29|2-HIGH|Clerk#000000061|0|ounts sleep against the dogged deposits. furiously unusual requests sleep +57571|998|F|51170.46|1993-07-17|5-LOW|Clerk#000000653|0|e. always unusual packages cajole even accounts. +57572|1330|O|291839.63|1995-07-13|3-MEDIUM|Clerk#000000847|0|deposits. blithely express pinto beans cajole across the furiou +57573|1093|O|29786.64|1998-01-03|2-HIGH|Clerk#000000816|0|ic theodolites haggle. unusual asymptotes sleep blit +57574|121|F|141322.15|1992-07-24|1-URGENT|Clerk#000000529|0|l requests. busily even id +57575|1396|O|125523.36|1997-03-08|3-MEDIUM|Clerk#000000693|0|ar instructions; unusual foxes haggle furiously against +57600|1160|F|199654.82|1992-11-12|1-URGENT|Clerk#000000545|0|hogs are. ideas affix carefully ca +57601|1040|F|31406.34|1993-10-25|4-NOT SPECIFIED|Clerk#000000181|0|fully final deposits nag quickly thin +57602|397|F|107647.04|1992-05-18|5-LOW|Clerk#000000542|0|to wake furiously after the furiously ironic excuses. final +57603|103|O|109704.51|1997-06-27|3-MEDIUM|Clerk#000000128|0|ent dependencies haggle slyly. fur +57604|760|O|28195.24|1997-08-19|2-HIGH|Clerk#000000547|0|odolites. furiously unu +57605|433|F|43174.91|1994-05-17|2-HIGH|Clerk#000000510|0|eposits cajole blithely stea +57606|1471|F|84734.56|1993-01-04|4-NOT SPECIFIED|Clerk#000000575|0|eas sleep throughout the bold, ironic braids. quick +57607|322|O|36022.05|1996-07-02|3-MEDIUM|Clerk#000000286|0|nding excuses wake blithely quickly pendin +57632|544|O|48575.57|1996-04-20|2-HIGH|Clerk#000000945|0|tructions. dolphins wake. special instructions are express, speci +57633|958|F|139456.61|1995-02-07|2-HIGH|Clerk#000000452|0|eposits are around the special ideas. ironically silent requests are furi +57634|856|O|92564.26|1997-11-27|1-URGENT|Clerk#000000412|0|al requests integrate fluffily slyly special attainments. acc +57635|14|O|159023.15|1996-11-12|2-HIGH|Clerk#000000643|0|play carefully regular, final braids; furiously even packages above the q +57636|355|O|132660.33|1998-04-21|2-HIGH|Clerk#000000589|0|y regular asymptotes dazzle along the sl +57637|1114|O|41034.43|1998-08-01|1-URGENT|Clerk#000000383|0|c requests about the blithely regular packages wake according to the slyly ex +57638|328|F|292570.57|1992-04-23|5-LOW|Clerk#000000449|0|r the slyly even courts cajole carefully slyly regular accounts. per +57639|1355|F|185321.41|1993-07-22|1-URGENT|Clerk#000000182|0|ular pinto beans. ironic reques +57664|691|F|136105.72|1993-11-29|1-URGENT|Clerk#000000589|0|cial tithes after the foxes use blithely after the spe +57665|1147|F|62457.56|1992-04-26|1-URGENT|Clerk#000000507|0|yly furiously unusual packages. unusual, final asymptotes ab +57666|676|F|169012.47|1994-05-23|4-NOT SPECIFIED|Clerk#000000839|0|eodolites sleep furiously. never express ideas +57667|769|O|208599.04|1996-05-26|3-MEDIUM|Clerk#000000654|0|he fluffily final pinto beans. furiously regular packages was furiously regul +57668|431|F|52391.28|1992-02-18|1-URGENT|Clerk#000000391|0|ular, final requests. slyly even somas unwind after the blithe +57669|1093|F|117557.65|1993-08-09|1-URGENT|Clerk#000000251|0|jole furiously unusual theodolites. regular pac +57670|113|F|184736.13|1993-10-13|1-URGENT|Clerk#000000054|0|n accounts haggle across the quickly even reque +57671|1469|F|269379.15|1992-11-08|4-NOT SPECIFIED|Clerk#000000436|0|sits nag furiously. regular requests wake daringl +57696|73|O|237793.99|1997-02-12|2-HIGH|Clerk#000000846|0|slyly pending pinto beans. carefully ironic pinto beans us +57697|167|F|214721.32|1995-02-08|5-LOW|Clerk#000000314|0|counts. ironic, special pinto beans +57698|953|F|189185.83|1992-01-07|1-URGENT|Clerk#000000753|0|s try to lose slyly across the fluff +57699|1441|F|376309.96|1992-11-11|5-LOW|Clerk#000000891|0|ckly after the quick, +57700|1009|O|79405.09|1995-11-13|3-MEDIUM|Clerk#000000510|0|ular pinto beans. quickly regular deposits haggle blithely across +57701|1037|O|267054.94|1996-06-23|3-MEDIUM|Clerk#000000429|0| the even deposits. furiously final dinos above the quickly ironic excuses +57702|19|O|205579.61|1996-10-08|5-LOW|Clerk#000000966|0|efully regular deposits haggle about the carefully even packages. packages at +57703|1432|F|46302.86|1994-02-19|2-HIGH|Clerk#000000901|0|pending theodolites. carefully pending foxes along the +57728|1108|O|50774.64|1996-07-05|2-HIGH|Clerk#000000721|0|lites wake blithely furiously even de +57729|1108|O|59115.31|1996-05-12|4-NOT SPECIFIED|Clerk#000000217|0|en accounts? ironic packag +57730|1144|O|93010.21|1998-02-18|3-MEDIUM|Clerk#000000260|0|sits nag slyly carefully final +57731|191|O|249783.25|1996-12-25|4-NOT SPECIFIED|Clerk#000000507|0|longside of the sil +57732|718|O|160616.07|1996-04-10|1-URGENT|Clerk#000000080|0|ets-- bravely ironic pinto beans across the special waters cajole furio +57733|589|O|102867.81|1998-03-01|5-LOW|Clerk#000000791|0| theodolites among the carefully even pinto +57734|1016|F|254070.03|1994-09-17|2-HIGH|Clerk#000000235|0| unwind carefully carefully i +57735|850|F|249598.48|1992-05-01|3-MEDIUM|Clerk#000000975|0|iously regular instructions. regular requests are ar +57760|562|O|116789.34|1995-07-13|4-NOT SPECIFIED|Clerk#000000679|0| unusual courts. blithely final a +57761|1282|F|87844.21|1994-09-14|3-MEDIUM|Clerk#000000563|0| ironic instructions. carefully final packages boost blithely. final, pe +57762|625|F|284975.26|1994-11-29|1-URGENT|Clerk#000000122|0|efully above the quickly regula +57763|217|O|112488.41|1996-11-09|5-LOW|Clerk#000000975|0|ts among the instructions are instructions? slyly bold accounts could wake +57764|427|O|176482.12|1996-11-25|4-NOT SPECIFIED|Clerk#000000939|0|ackages: theodolites affi +57765|1312|F|221337.74|1994-10-16|3-MEDIUM|Clerk#000000041|0|ding, unusual platelets. dependencies against the +57766|1486|F|197756.04|1993-05-01|2-HIGH|Clerk#000000847|0|ructions across the dugouts cajole against the stealth +57767|7|F|233905.25|1992-04-12|1-URGENT|Clerk#000000927|0|al theodolites. special deposits are slyly. +57792|748|O|170427.85|1998-05-28|3-MEDIUM|Clerk#000000379|0|cial dependencies. regular, unusual instructi +57793|418|F|152342.02|1992-11-08|3-MEDIUM|Clerk#000000876|0|es boost quickly above the blithely iro +57794|194|F|165081.75|1994-07-27|5-LOW|Clerk#000000477|0|ep slyly slyly final decoys. +57795|347|F|121812.51|1994-06-20|4-NOT SPECIFIED|Clerk#000000551|0|bold ideas detect blithely near the deposits. slyly +57796|667|O|70051.07|1996-02-28|4-NOT SPECIFIED|Clerk#000000446|0|ons according to the furiously regular pains cajole furiously under the q +57797|493|O|238542.40|1998-02-08|4-NOT SPECIFIED|Clerk#000000928|0|es haggle slyly blithely pendin +57798|1360|F|121227.20|1992-09-16|2-HIGH|Clerk#000000418|0| carefully even accounts sleep fluffily silent instruction +57799|1019|O|186598.94|1995-09-01|2-HIGH|Clerk#000000983|0|ect final, unusual instructions. ironic deposits among the unusual in +57824|479|O|93086.37|1997-10-31|4-NOT SPECIFIED|Clerk#000000217|0|xpress dolphins. pac +57825|850|O|230633.97|1998-02-19|5-LOW|Clerk#000000964|0|yly even ideas sleep carefully: ironic foxes slee +57826|640|O|130909.16|1998-04-04|4-NOT SPECIFIED|Clerk#000000186|0|. carefully unusual instru +57827|661|F|154037.06|1994-07-03|3-MEDIUM|Clerk#000000149|0| regular requests against t +57828|1325|O|245373.41|1998-05-27|5-LOW|Clerk#000000241|0|usly ironic requests sleep carefully. unusual, express deposits use into +57829|800|F|79126.58|1994-03-06|3-MEDIUM|Clerk#000000285|0|al, regular pinto beans. slyly regular asymptotes haggle. pending, ironic acc +57830|91|O|110841.38|1995-08-24|3-MEDIUM|Clerk#000000772|0|o beans affix carefully. quickly pending deposits ca +57831|265|O|178288.06|1996-10-10|2-HIGH|Clerk#000000316|0|fully final asymptotes haggle +57856|676|F|51333.42|1994-02-13|3-MEDIUM|Clerk#000000570|0| after the regular, ironic accounts. blithely ironic excuses along th +57857|661|F|303399.76|1993-05-02|2-HIGH|Clerk#000000504|0|courts haggle bold, ironic accounts. foxes w +57858|928|O|246457.72|1995-10-31|1-URGENT|Clerk#000000181|0|ake around the packages. deposits are blithely final request +57859|790|O|294466.65|1997-05-26|1-URGENT|Clerk#000000192|0|ully final pinto beans during the slyly final +57860|589|O|101247.55|1996-12-22|4-NOT SPECIFIED|Clerk#000000234|0|ress, pending depos +57861|1018|F|111302.17|1992-10-26|3-MEDIUM|Clerk#000000937|0|eodolites. ironic requests above the slyly final packages are carefully expr +57862|427|O|125715.08|1996-04-25|2-HIGH|Clerk#000000063|0|ly slyly silent foxes. requests are rut +57863|193|F|78558.70|1992-06-11|3-MEDIUM|Clerk#000000744|0| carefully carefully even pa +57888|829|O|74918.13|1997-03-06|1-URGENT|Clerk#000000566|0|y bold foxes cajole quickly around the express accounts. busy, ex +57889|385|F|330721.15|1993-04-08|5-LOW|Clerk#000000584|0|quickly across the ironic id +57890|457|F|163379.80|1994-02-27|1-URGENT|Clerk#000000480|0|he carefully regular platelets sleep +57891|862|F|163436.24|1993-12-18|3-MEDIUM|Clerk#000000051|0|yly even grouches: special +57892|1069|O|135530.87|1996-11-10|5-LOW|Clerk#000000428|0|lar theodolites wake carefully around the furiously final theodolites. expre +57893|632|F|160029.42|1993-10-24|3-MEDIUM|Clerk#000000345|0|promise blithely ironic instructions. ironic, even ideas in +57894|308|F|206411.52|1992-04-04|5-LOW|Clerk#000000377|0|ously. even accounts wake blithely +57895|113|O|243839.24|1997-01-15|5-LOW|Clerk#000000643|0| bold accounts about the furiously regular instructions are +57920|994|O|348150.86|1996-12-24|2-HIGH|Clerk#000000679|0|ites haggle blithely. quickly even requests above th +57921|1178|F|339975.46|1993-08-19|3-MEDIUM|Clerk#000000283|0| excuses nag across the furiously bold theodolites. f +57922|769|F|88419.59|1995-02-09|1-URGENT|Clerk#000000765|0|ct blithely regular accounts. regular, regular requests sleep fluffily +57923|1468|F|171705.00|1994-03-13|4-NOT SPECIFIED|Clerk#000000640|0|al theodolites. deposits against the platelets haggle carefully permanentl +57924|514|O|242428.47|1997-04-02|4-NOT SPECIFIED|Clerk#000000505|0|. slyly special packages among the regular ideas engage a +57925|1448|O|58465.97|1997-04-28|4-NOT SPECIFIED|Clerk#000000761|0|ns. carefully even instructions boost fluffily quickly bold platelets +57926|40|O|233887.29|1998-04-13|2-HIGH|Clerk#000000585|0|ly regular courts according to the regularly +57927|19|F|28187.55|1993-01-01|5-LOW|Clerk#000000713|0|fluffily final packages. fluffily fin +57952|241|O|129181.76|1996-04-27|5-LOW|Clerk#000000764|0|deas. regular, ironic dependen +57953|1000|O|250013.58|1996-12-01|5-LOW|Clerk#000000157|0|counts against the blit +57954|352|O|232725.87|1998-05-14|1-URGENT|Clerk#000000663|0|ss platelets cajole blithely re +57955|622|O|122770.80|1997-12-03|1-URGENT|Clerk#000000015|0|the quickly final accounts. accounts eat. slyly +57956|937|O|217002.01|1998-06-01|3-MEDIUM|Clerk#000000633|0|en theodolites about the unusual, unusual dinos are furiousl +57957|94|O|163815.45|1996-05-08|4-NOT SPECIFIED|Clerk#000000355|0|mong the unusual, special deposits. accou +57958|137|F|92884.74|1994-03-01|1-URGENT|Clerk#000000639|0| haggle blithely ironic theodolites. ironic pac +57959|1499|O|240829.64|1995-12-31|3-MEDIUM|Clerk#000000525|0|lose furiously. regular instructions serve blithely deposit +57984|815|F|256707.02|1993-10-03|2-HIGH|Clerk#000000618|0|cies. carefully regular pinto beans haggle ruthl +57985|709|F|109777.24|1992-03-17|5-LOW|Clerk#000000799|0|ctions wake blithely along the furiously silent packages. per +57986|1403|F|259339.97|1993-10-30|2-HIGH|Clerk#000000488|0|ct fluffily alongside of the reg +57987|64|F|66935.22|1994-12-16|5-LOW|Clerk#000000066|0| detect quickly fluffily bold a +57988|530|O|252516.12|1995-11-26|3-MEDIUM|Clerk#000000245|0|usly accounts: slyly +57989|406|O|81375.04|1996-09-21|5-LOW|Clerk#000000691|0|s wake slyly even instructio +57990|796|F|34509.88|1994-09-07|1-URGENT|Clerk#000000057|0|quickly. dependencies boos +57991|1417|F|69566.76|1993-01-10|1-URGENT|Clerk#000000426|0| furiously ironic accounts. asymptotes sleep careful +58016|562|F|87567.22|1994-03-23|3-MEDIUM|Clerk#000000564|0|ly even warthogs use furiously qui +58017|368|O|148348.04|1997-05-17|1-URGENT|Clerk#000000114|0| brave dependencies. ironic, even pinto +58018|1231|O|90420.70|1997-06-03|3-MEDIUM|Clerk#000000264|0|l accounts against the furiously fi +58019|1268|F|38175.08|1992-02-14|4-NOT SPECIFIED|Clerk#000000424|0|slowly regular dolphins sleep carefully. care +58020|788|F|124269.12|1992-11-15|2-HIGH|Clerk#000000091|0|luffily pending pinto beans haggle +58021|439|F|84960.14|1992-08-13|2-HIGH|Clerk#000000400|0|ss excuses around the slyly bold warthogs are accordi +58022|214|O|166597.27|1996-04-20|4-NOT SPECIFIED|Clerk#000000664|0|ly. carefully regular accounts haggle blithely. pearls nag. sl +58023|988|O|207234.31|1996-08-13|4-NOT SPECIFIED|Clerk#000000364|0|t closely against the furiously ironic pearls. bold, slow deposits above +58048|686|O|110969.46|1998-07-22|1-URGENT|Clerk#000000432|0|oost quickly after the regu +58049|529|F|223507.82|1995-03-07|3-MEDIUM|Clerk#000000952|0|ages sleep furiously f +58050|764|F|15159.52|1992-05-16|1-URGENT|Clerk#000000985|0|bove the express pinto beans. blithely regular dependen +58051|1381|F|34185.40|1992-03-21|2-HIGH|Clerk#000000166|0|ccording to the blithely final requests haggl +58052|1219|F|274546.87|1992-04-25|4-NOT SPECIFIED|Clerk#000000323|0|ccording to the carefully +58053|1396|F|127188.75|1993-01-09|3-MEDIUM|Clerk#000000270|0|l requests. carefully pending platelets +58054|1117|F|229884.37|1995-01-05|2-HIGH|Clerk#000000347|0|ongside of the slyly even packages. special asymptotes sleep caref +58055|733|O|341913.41|1995-10-28|1-URGENT|Clerk#000000278|0|en foxes nag carefully a +58080|11|O|51714.57|1997-09-25|5-LOW|Clerk#000000462|0|y even requests integrate fluffily. +58081|161|F|125563.59|1992-01-08|2-HIGH|Clerk#000000690|0|instructions. blithely bold e +58082|841|O|113547.02|1996-01-30|2-HIGH|Clerk#000000355|0|r accounts. regular pinto beans h +58083|1405|O|294017.18|1997-05-06|4-NOT SPECIFIED|Clerk#000000407|0|c packages cajole fluffily against the fluffily bold instruct +58084|1246|F|226180.63|1992-08-20|3-MEDIUM|Clerk#000000465|0|uests sleep blithely final deposits. carefully even requests print f +58085|178|O|140977.43|1996-09-08|1-URGENT|Clerk#000000108|0|riously according to the +58086|332|P|128400.86|1995-03-11|3-MEDIUM|Clerk#000000978|0|y regular deposits. blithely ironic requests haggl +58087|823|O|238155.94|1996-01-20|1-URGENT|Clerk#000000656|0|pendencies. blithely +58112|787|O|38199.20|1997-12-15|1-URGENT|Clerk#000000618|0|ronic excuses are blithely among the final req +58113|371|F|203475.78|1992-02-02|2-HIGH|Clerk#000000245|0|l asymptotes nag slyly fluffily bold pinto beans; blithely reg +58114|62|O|91926.99|1997-10-14|4-NOT SPECIFIED|Clerk#000000923|0| bold packages. furio +58115|1339|O|81904.12|1997-10-11|2-HIGH|Clerk#000000936|0|counts cajole fluffily about the final ideas. final, final patterns dazzl +58116|1457|F|192843.61|1994-03-29|1-URGENT|Clerk#000000828|0| carefully blithely ironic deposits. +58117|1147|F|218416.58|1995-02-21|1-URGENT|Clerk#000000719|0|g to the regular forges. evenly final packages doubt furious +58118|1276|O|280220.19|1997-09-06|3-MEDIUM|Clerk#000000479|0|p carefully against the furiously silent d +58119|1369|F|20893.17|1992-08-20|1-URGENT|Clerk#000000261|0|he furiously regular asymptotes haggle after +58144|1271|F|220176.27|1994-12-17|5-LOW|Clerk#000000703|0|nod slyly ironic excuses. ironic, special foxes along the bold pinto beans in +58145|862|F|929.03|1992-05-17|3-MEDIUM|Clerk#000000475|0|ays wake carefully. furiously silent pinto beans wake unusua +58146|4|O|241263.01|1997-04-02|3-MEDIUM|Clerk#000000368|0|le according to the slyly final exc +58147|892|F|148388.15|1994-05-19|2-HIGH|Clerk#000000930|0|ccounts poach carefully alongside of the slyly silent braids. b +58148|928|F|78302.54|1992-11-20|4-NOT SPECIFIED|Clerk#000000119|0|ully final decoys a +58149|1388|O|144922.38|1997-03-11|1-URGENT|Clerk#000000757|0|ect furiously blithely unusual +58150|809|F|223117.67|1993-05-08|1-URGENT|Clerk#000000455|0|ong the regular, regular asymptotes. deposits haggle blithely after the p +58151|580|F|323517.59|1994-09-30|2-HIGH|Clerk#000000406|0|maintain fluffily pending platelets. furi +58176|541|F|100202.49|1994-08-03|3-MEDIUM|Clerk#000000216|0|ven instructions. quickly regular pinto beans along the +58177|1123|F|156840.86|1992-08-23|4-NOT SPECIFIED|Clerk#000000373|0| even requests cajole across the pend +58178|962|F|99810.59|1992-01-23|4-NOT SPECIFIED|Clerk#000000962|0|n packages against the carefully bold excuse +58179|728|O|157599.20|1995-09-06|3-MEDIUM|Clerk#000000577|0|gular deposits sleep slyly according to the carefully final ideas. quickly re +58180|1225|O|327136.63|1997-07-20|1-URGENT|Clerk#000000257|0|ickly ironically regular exc +58181|919|F|230900.13|1992-10-08|4-NOT SPECIFIED|Clerk#000000431|0|boldly about the slyl +58182|361|F|155262.06|1994-02-21|2-HIGH|Clerk#000000647|0| special platelets haggle carefully above the furiously ironic accounts. c +58183|161|F|21084.37|1994-04-10|5-LOW|Clerk#000000227|0|l accounts around the careful +58208|295|O|241816.44|1998-07-14|2-HIGH|Clerk#000000704|0|lly ironic packages. furiously pending accounts was blithe +58209|379|F|264705.99|1993-10-16|1-URGENT|Clerk#000000331|0|y regular, regular foxes. furiously +58210|1234|F|77444.01|1992-12-07|3-MEDIUM|Clerk#000000828|0|y across the carefully even deposits. final, final sentiments c +58211|860|O|131483.03|1998-05-25|4-NOT SPECIFIED|Clerk#000000339|0|sleep blithely unusual asymptotes. unusual pinto beans sleep. carefully pend +58212|1210|O|106668.78|1996-11-19|1-URGENT|Clerk#000000093|0|o the slyly special foxes sleep pinto beans. special, unusual i +58213|1412|O|51529.50|1996-10-28|4-NOT SPECIFIED|Clerk#000000791|0|y across the packages. final deposits alongside of the bold deposits affix +58214|664|O|222512.65|1996-06-10|2-HIGH|Clerk#000000399|0|lithely regular instructions. final requests +58215|163|F|72346.69|1992-10-11|3-MEDIUM|Clerk#000000134|0|posits use about the furiously final +58240|542|O|102211.23|1997-02-24|5-LOW|Clerk#000000501|0| regular packages. slyly perman +58241|505|F|163134.32|1993-09-08|1-URGENT|Clerk#000000455|0|into beans? slyly express requests hag +58242|1370|F|88274.83|1994-06-29|3-MEDIUM|Clerk#000000282|0|are quickly regular frays. even, iron +58243|1063|O|7465.71|1997-11-03|4-NOT SPECIFIED|Clerk#000000459|0|c ideas haggle blithely final packages. pending, final request +58244|1168|O|93801.72|1997-10-01|2-HIGH|Clerk#000000265|0|the final ideas. carefully unusual accounts against +58245|238|O|192211.71|1997-01-14|1-URGENT|Clerk#000000955|0|ly at the carefully special theodolites. ironic deposits affix furiously ironi +58246|19|F|47373.33|1994-07-23|2-HIGH|Clerk#000000725|0|reach furiously. final, even accounts nag qui +58247|1054|O|150008.82|1995-09-24|4-NOT SPECIFIED|Clerk#000000021|0|ular ideas sleep. regular accounts cajole against the furiously fi +58272|214|O|242438.07|1996-05-05|2-HIGH|Clerk#000000431|0|atelets x-ray daring, bold packages. furiously pending +58273|805|F|237137.86|1993-06-21|2-HIGH|Clerk#000000655|0|bold requests. regular, +58274|658|O|71937.68|1998-01-26|2-HIGH|Clerk#000000005|0|l theodolites. blithely quiet d +58275|1127|O|155331.96|1996-11-02|2-HIGH|Clerk#000000339|0|ong the fluffily bold dependencies. final attain +58276|790|O|95793.71|1996-09-09|1-URGENT|Clerk#000000161|0|gedly special orbits. unusual, express pinto beans after the slyly eve +58277|1328|F|119591.73|1994-01-25|3-MEDIUM|Clerk#000000838|0|fluffily among the regular reque +58278|1478|F|180043.62|1992-09-11|2-HIGH|Clerk#000000889|0|y blithely regular packages. +58279|1466|F|34117.81|1994-04-12|3-MEDIUM|Clerk#000000403|0|s. carefully regular ideas unwind fluffily careful accounts. e +58304|1210|O|76415.95|1996-02-02|4-NOT SPECIFIED|Clerk#000000754|0|efully bold deposits. s +58305|1157|F|71144.20|1994-08-08|1-URGENT|Clerk#000000088|0|s along the bold, ironic accounts sleep aft +58306|1270|O|134912.93|1996-06-21|2-HIGH|Clerk#000000771|0|uriously across the thinly fin +58307|1315|F|133472.15|1994-11-12|3-MEDIUM|Clerk#000000235|0| pending requests h +58308|457|F|113643.66|1993-05-22|4-NOT SPECIFIED|Clerk#000000219|0|requests sleep at the furiously final requests. permanent asympto +58309|1177|O|263590.16|1997-07-18|2-HIGH|Clerk#000000911|0|t slyly? pending, silent package +58310|529|F|151560.86|1994-02-24|1-URGENT|Clerk#000000302|0|ackages wake blithely bold, fin +58311|1039|O|118820.10|1996-04-29|3-MEDIUM|Clerk#000000776|0|kly final sauternes sleep. finally pending ideas among the furiously quick +58336|1006|F|93610.96|1994-07-06|3-MEDIUM|Clerk#000000619|0|g the quickly bold +58337|1468|F|152270.61|1994-05-29|5-LOW|Clerk#000000990|0|es. ironic, even theodolites +58338|416|F|93432.78|1992-07-24|2-HIGH|Clerk#000000175|0|cuses are busily even req +58339|158|F|101631.30|1994-06-14|2-HIGH|Clerk#000000729|0| theodolites maintain entic +58340|257|F|183442.39|1995-01-09|3-MEDIUM|Clerk#000000841|0|s foxes-- packages grow blithely pending, silent decoys. slyly +58341|604|F|3221.16|1995-02-09|4-NOT SPECIFIED|Clerk#000000694|0|ross the express instruction +58342|547|P|198469.14|1995-04-02|2-HIGH|Clerk#000000143|0|e across the bold, expres +58343|43|F|184778.27|1994-01-10|4-NOT SPECIFIED|Clerk#000000333|0|uickly above the blithely final packages? spec +58368|1352|F|237598.61|1992-07-10|2-HIGH|Clerk#000000121|0|ely special requests after the slyly ruthless p +58369|1411|F|120845.25|1992-08-31|2-HIGH|Clerk#000000467|0|s. dinos snooze slyly furiously final dependencies. quickly dogged depos +58370|1222|F|137851.22|1992-04-02|5-LOW|Clerk#000000220|0| around the quickly even accounts. blithely express requests according to +58371|260|F|366479.63|1993-05-12|3-MEDIUM|Clerk#000000645|0|se around the blithely final deposits. furiously regular deposits +58372|682|P|266819.62|1995-04-03|5-LOW|Clerk#000000358|0|structions cajole slyly. express, ruthless instructions detect fluffily c +58373|862|O|1041.49|1996-08-31|5-LOW|Clerk#000000281|0|final deposits among the express dependencies wake carefu +58374|929|O|219552.91|1997-07-01|4-NOT SPECIFIED|Clerk#000000109|0|ns. blithely ironic +58375|40|O|269108.20|1996-03-27|1-URGENT|Clerk#000000188|0|. pending packages unwind among the fluffily q +58400|640|O|160545.78|1997-12-06|5-LOW|Clerk#000000531|0|ously special somas sleep blithely. final, unu +58401|1135|O|218504.77|1997-01-10|2-HIGH|Clerk#000000803|0|ross the final decoys are evenly slyly even ideas. reg +58402|1162|O|124971.48|1997-02-28|2-HIGH|Clerk#000000745|0|nd carefully-- blithely unusual ideas detect slyl +58403|1489|O|153941.38|1995-12-11|3-MEDIUM|Clerk#000000935|0|ely ironic deposits-- blithely final requests among the blithely sp +58404|406|F|27679.76|1993-12-09|1-URGENT|Clerk#000000005|0|sits wake slyly blithely express packages. furiously final reque +58405|319|O|163168.00|1998-07-26|4-NOT SPECIFIED|Clerk#000000324|0|lyly careful ideas! slyly fin +58406|1406|O|117534.54|1996-07-14|2-HIGH|Clerk#000000246|0|ggle quickly. carefully special foxes sublate. bold requests are furiou +58407|308|F|65176.49|1995-05-07|2-HIGH|Clerk#000000864|0|oss the furiously unusual deposits. blithely +58432|466|F|16209.44|1994-05-20|4-NOT SPECIFIED|Clerk#000000758|0|ests. quickly ironic requests +58433|976|O|151146.93|1995-07-02|2-HIGH|Clerk#000000189|0|pitaphs. regular sentiments cajole. bold, bold packages about the blithely +58434|779|F|70282.87|1994-03-10|2-HIGH|Clerk#000000948|0|press accounts doze deposits. blithely ironic p +58435|356|F|122438.39|1992-05-08|5-LOW|Clerk#000000930|0| instructions haggle blithely. blithely even theodolites us +58436|1103|O|26119.96|1997-02-24|4-NOT SPECIFIED|Clerk#000000318|0|detect blithely. fluffily ironic requests along the carefully bold p +58437|307|O|148247.03|1997-10-15|2-HIGH|Clerk#000000299|0|ag carefully quick, special account +58438|1243|O|109454.27|1996-01-28|2-HIGH|Clerk#000000329|0|osits. final, even dugouts boost furiousl +58439|1085|O|104160.98|1996-03-09|4-NOT SPECIFIED|Clerk#000000320|0|old requests. furiously special requests aff +58464|406|O|183459.95|1997-11-06|4-NOT SPECIFIED|Clerk#000000080|0| quickly ruthless requests run slyly. furiously even deposits accordin +58465|29|O|235175.25|1998-02-15|2-HIGH|Clerk#000000037|0|oost carefully regular realms. packages haggle slyly. even, furious theod +58466|1340|F|67418.44|1993-11-05|5-LOW|Clerk#000000286|0|ress deposits haggle blithely ironic, special accounts. slyly fin +58467|458|O|296143.11|1996-03-07|5-LOW|Clerk#000000779|0|s. slyly regular accounts wake +58468|400|F|94214.11|1993-05-17|1-URGENT|Clerk#000000876|0|the slyly even pinto beans nag among the furiously ironic r +58469|223|O|145395.56|1996-03-12|5-LOW|Clerk#000000958|0|ckages. furiously bold ideas boost. quickly regular in +58470|991|O|257231.65|1995-06-09|2-HIGH|Clerk#000000809|0|ounts serve furiously around the regular packages. pending deposits cajol +58471|838|O|245833.41|1997-02-06|1-URGENT|Clerk#000000177|0|o the fluffily regular theodolites nag ironic, s +58496|1369|O|195263.23|1995-06-12|4-NOT SPECIFIED|Clerk#000000484|0|inal requests boost. ev +58497|794|O|155615.57|1996-04-05|2-HIGH|Clerk#000000185|0|efully even hockey players sleep quickly carefully final instructions; +58498|731|O|127376.14|1998-07-27|4-NOT SPECIFIED|Clerk#000000864|0|slyly ironic deposits alongside +58499|1376|F|105519.05|1992-08-07|4-NOT SPECIFIED|Clerk#000000129|0|about the slyly pending requests serve ironic, ruth +58500|779|F|103401.77|1995-02-15|5-LOW|Clerk#000000516|0|ular pinto beans after th +58501|113|O|336130.15|1996-05-11|2-HIGH|Clerk#000000416|0|ites run since the fluffily regular packages. express +58502|697|F|252977.27|1993-02-13|1-URGENT|Clerk#000000973|0| the furiously bold pinto beans was across the express, +58503|46|O|31023.44|1996-10-19|4-NOT SPECIFIED|Clerk#000000038|0|e regular requests-- silent, regular warhorses haggle +58528|1429|F|220773.77|1993-10-28|3-MEDIUM|Clerk#000000118|0|ng to the blithely u +58529|724|F|40977.16|1995-01-05|2-HIGH|Clerk#000000897|0|uests wake. ironic escap +58530|1457|O|123468.75|1996-03-02|4-NOT SPECIFIED|Clerk#000000975|0|al foxes hang carefu +58531|1003|O|26362.70|1997-09-15|2-HIGH|Clerk#000000915|0|etect. final, bold deposits use. furiously final deposits mig +58532|224|O|81984.56|1998-05-11|1-URGENT|Clerk#000000290|0|posits. furiously silent theodolites wake fluffily +58533|11|O|91804.28|1997-09-11|5-LOW|Clerk#000000160|0|efully regular accounts. requests n +58534|1264|O|174273.19|1997-06-02|3-MEDIUM|Clerk#000000373|0|ly final requests wake about the pac +58535|1276|O|339753.03|1997-06-18|5-LOW|Clerk#000000409|0|. furiously ironic packages wak +58560|1274|O|17171.58|1997-10-18|2-HIGH|Clerk#000000643|0|coys haggle according to the quickly even deposits. carefully ironi +58561|131|O|153459.16|1996-07-01|5-LOW|Clerk#000000207|0|uriously express pinto beans do cajole s +58562|1373|F|229132.83|1992-02-22|1-URGENT|Clerk#000000047|0|ic, final theodolites around the deposits try to sleep against the expre +58563|1316|F|37887.18|1995-05-06|1-URGENT|Clerk#000000445|0|telets. furiously final instructions wake even pinto +58564|259|F|98359.26|1992-11-13|1-URGENT|Clerk#000000446|0|y among the carefully final deposits. furiously ev +58565|1295|O|111084.57|1996-08-24|1-URGENT|Clerk#000000719|0|. slyly final foxes cajole slyly even ideas. carefully enticing theodol +58566|1421|O|195818.45|1995-08-24|4-NOT SPECIFIED|Clerk#000000466|0|deposits. regular ideas do haggle carefully express, even pinto b +58567|1103|O|8928.14|1996-05-27|1-URGENT|Clerk#000000461|0|ts cajole. fluffily express pa +58592|854|F|146583.36|1995-02-05|4-NOT SPECIFIED|Clerk#000000678|0|e slyly final, regular theodolites. packag +58593|785|O|296396.95|1995-09-09|1-URGENT|Clerk#000000370|0|ckly final requests. blithely even excuses haggle about the +58594|103|O|16511.46|1998-07-23|5-LOW|Clerk#000000907|0|c instructions. fluffily f +58595|661|F|190959.17|1993-08-30|2-HIGH|Clerk#000000711|0|cies wake against the r +58596|1382|O|41438.18|1995-05-14|2-HIGH|Clerk#000000407|0|l asymptotes. furiously pending platelets haggle b +58597|982|O|261781.42|1997-02-02|1-URGENT|Clerk#000000116|0| boost above the regularly final courts. even requests +58598|835|O|168763.18|1995-08-23|3-MEDIUM|Clerk#000000958|0|nts eat furiously furiousl +58599|1412|F|181116.54|1993-01-15|1-URGENT|Clerk#000000552|0|nal pinto beans sleep bold deposits. accounts detect carefully before the even +58624|304|F|36104.85|1994-06-30|3-MEDIUM|Clerk#000000536|0|g the quickly special deposits. never pend +58625|1297|O|99747.90|1995-11-28|4-NOT SPECIFIED|Clerk#000000649|0|beans detect carefully. final deposits cajole carefully. slyly final escap +58626|212|O|135905.94|1995-12-31|2-HIGH|Clerk#000000150|0| deposits. even accounts +58627|1055|F|154213.02|1993-12-30|1-URGENT|Clerk#000000836|0|re slyly across the furiously even deposits. blithely s +58628|16|F|100434.11|1994-03-25|3-MEDIUM|Clerk#000000408|0|tions hinder blithely. final, even escapades wake. theo +58629|598|F|107591.21|1994-03-14|1-URGENT|Clerk#000000697|0|as; ironic escapades s +58630|805|O|208941.43|1997-11-21|3-MEDIUM|Clerk#000000734|0|ing to the unusual, unusual accounts. fi +58631|649|O|167072.49|1997-09-21|5-LOW|Clerk#000000238|0|gainst the slyly regular packages. furiously ev +58656|1159|F|141180.93|1993-12-05|2-HIGH|Clerk#000000659|0|nstructions toward the even, even dugouts serve against the unusual, regular p +58657|175|F|184679.38|1993-03-28|1-URGENT|Clerk#000000290|0|ronic ideas. blithely final packages cajole furiously. blithely +58658|364|F|137161.51|1992-06-12|3-MEDIUM|Clerk#000000540|0|ounts. ironic packages sleep +58659|698|F|180389.45|1993-10-25|2-HIGH|Clerk#000000038|0|regular excuses breach slyly. bold pinto beans alon +58660|461|F|212310.79|1994-03-04|4-NOT SPECIFIED|Clerk#000000080|0|nusual accounts. furiously bol +58661|806|O|157290.38|1995-12-11|1-URGENT|Clerk#000000126|0|uriously silent packages boost carefully above the blithely final gifts. +58662|1420|O|272985.52|1996-03-19|2-HIGH|Clerk#000000223|0|ly among the bold deposits. dolphins sleep blithely carefully +58663|308|O|98254.49|1997-08-14|2-HIGH|Clerk#000000892|0|ickly final pinto beans. regular deposits cajole along th +58688|847|F|206794.21|1994-03-30|4-NOT SPECIFIED|Clerk#000000582|0|uests are fluffily? ideas integrate. quickly bold d +58689|1090|O|52786.85|1995-08-13|3-MEDIUM|Clerk#000000618|0|yly. special deposits promise +58690|1354|O|191210.03|1995-11-06|2-HIGH|Clerk#000000193|0| theodolites integrate carefully final instructions. regula +58691|76|O|232689.24|1996-08-09|3-MEDIUM|Clerk#000000592|0|grate slyly along the sly +58692|73|O|21983.66|1996-01-08|3-MEDIUM|Clerk#000000837|0|packages sleep across the slyly even packages. ironic, special asymptotes cajo +58693|1495|F|197449.59|1994-10-22|5-LOW|Clerk#000000881|0|nal requests. dependencies behind the blithely +58694|1132|O|64154.17|1996-10-07|3-MEDIUM|Clerk#000000621|0|uests. platelets must have to wake fluffily e +58695|1003|F|68042.41|1994-01-15|4-NOT SPECIFIED|Clerk#000000395|0|e regular, special requests. excuses integrate fluffily? blithely ir +58720|1274|F|117607.45|1993-03-08|4-NOT SPECIFIED|Clerk#000000656|0|aggle among the regular dependencies. carefully r +58721|1463|O|35278.52|1995-06-16|1-URGENT|Clerk#000000548|0|fully final packages. fluffily even deposits detect blith +58722|1291|F|57515.20|1992-10-12|1-URGENT|Clerk#000000584|0|about the slyly final asymp +58723|134|O|157331.24|1998-02-20|3-MEDIUM|Clerk#000000446|0|ly above the unusual theodolites. bold instructions ca +58724|1060|O|57790.92|1997-10-18|4-NOT SPECIFIED|Clerk#000000639|0|e fluffily according to the blithely even pinto beans. ev +58725|1432|F|61213.37|1993-05-21|4-NOT SPECIFIED|Clerk#000000338|0|ely ironic requests boost according to the carefully even accou +58726|593|O|82894.63|1996-04-20|5-LOW|Clerk#000000600|0| blithely slyly final theodolites? finally unusual accounts +58727|1283|F|115035.59|1994-07-07|3-MEDIUM|Clerk#000000625|0|. regular packages sleep. furiously silent accounts affix fluffily ac +58752|571|F|281709.78|1994-08-18|1-URGENT|Clerk#000000561|0|e. unusual packages boost. even requests integrate slyly after t +58753|1030|O|155327.97|1996-01-31|1-URGENT|Clerk#000000903|0|ructions. regular deposits cajole closel +58754|718|O|227739.28|1996-01-09|2-HIGH|Clerk#000000665|0|tructions. fluffily brave sauternes are. requests haggle furiously +58755|517|O|154876.46|1995-12-04|5-LOW|Clerk#000000918|0|ts along the final reque +58756|877|O|118618.41|1997-01-12|5-LOW|Clerk#000000371|0| theodolites nag furiously care +58757|322|F|273665.36|1994-01-17|5-LOW|Clerk#000000304|0|he regular, ironic theodolites. carefully regular accou +58758|1492|F|100127.73|1993-11-05|3-MEDIUM|Clerk#000000070|0|ar excuses. deposits haggle quickly. q +58759|790|F|236993.32|1994-01-22|5-LOW|Clerk#000000372|0|the slyly daring deposits. special requests alo +58784|1217|F|258891.25|1994-01-19|3-MEDIUM|Clerk#000000132|0|l requests. furiously regular packages need to are +58785|670|O|237690.34|1997-04-11|5-LOW|Clerk#000000998|0|es use ironic, even attainments. bli +58786|283|O|259915.59|1996-02-27|4-NOT SPECIFIED|Clerk#000000091|0|al requests haggle slowly-- carefully pending instructions according to +58787|1459|O|100980.01|1997-04-15|3-MEDIUM|Clerk#000000077|0|refully regular accounts boost above the slyly ironic p +58788|301|F|158902.00|1993-02-02|5-LOW|Clerk#000000294|0|uriously bold packages haggle furiously along the special theo +58789|938|F|120898.62|1993-08-06|5-LOW|Clerk#000000633|0|ly since the bold, unusual instructions-- ironic accounts slee +58790|1457|O|200864.67|1997-08-31|4-NOT SPECIFIED|Clerk#000000597|0|s at the carefully pending dependencies was above the quickly unusual platele +58791|811|O|100500.78|1996-09-08|3-MEDIUM|Clerk#000000763|0|sly bold foxes. packages haggle furiously slow +58816|919|O|304205.13|1997-12-13|4-NOT SPECIFIED|Clerk#000000514|0|ress packages wake furiously to the regular, bold theodolites. car +58817|356|F|28085.05|1995-01-28|4-NOT SPECIFIED|Clerk#000000612|0|nts. quickly regular dependencies subla +58818|1234|F|278195.78|1994-04-16|1-URGENT|Clerk#000000475|0|uriously alongside of the accounts. theodolites integrate slyly ac +58819|578|F|298196.63|1993-06-14|5-LOW|Clerk#000000099|0|es. hockey players use regular asymptotes. reg +58820|74|F|102397.52|1993-02-28|5-LOW|Clerk#000000505|0|ven accounts hinder after +58821|1309|F|79072.01|1993-02-11|4-NOT SPECIFIED|Clerk#000000120|0|ies x-ray slyly; slyly +58822|814|O|91771.61|1995-08-25|1-URGENT|Clerk#000000089|0|o the packages. bold, ironic deposits integrate across the furiou +58823|655|O|115930.79|1996-09-23|4-NOT SPECIFIED|Clerk#000000795|0|ut the carefully unusual accounts. quickly express accoun +58848|571|F|137980.15|1993-09-04|2-HIGH|Clerk#000000094|0| of the blithely ironic de +58849|251|F|164782.16|1994-05-06|3-MEDIUM|Clerk#000000044|0|eposits-- regular accounts use slyly slyly unusual packages. care +58850|94|O|24592.70|1997-01-10|3-MEDIUM|Clerk#000000074|0|row quickly. express, even packages wake aft +58851|257|F|296587.23|1993-06-08|5-LOW|Clerk#000000930|0|ironic, bold courts play fluffily special courts +58852|832|O|36427.14|1998-05-29|1-URGENT|Clerk#000000443|0|riously final ideas. furiously bold i +58853|374|F|39822.10|1992-05-14|1-URGENT|Clerk#000000932|0|unts. slyly bold Tiresias w +58854|1225|F|239478.65|1993-04-25|1-URGENT|Clerk#000000612|0|regular platelets wake furiously furiously bold foxes. +58855|575|F|84326.17|1993-11-01|3-MEDIUM|Clerk#000000604|0|requests boost slyly unusual accounts. regular, final +58880|1330|F|201213.06|1995-01-08|3-MEDIUM|Clerk#000000313|0|ly express packages. care +58881|560|O|312748.19|1996-03-01|4-NOT SPECIFIED|Clerk#000000367|0| the slyly ruthless packages n +58882|323|F|29720.38|1994-03-29|1-URGENT|Clerk#000000918|0|f the slyly pending accounts haggle fluffily about the +58883|1291|F|237823.70|1992-08-13|5-LOW|Clerk#000000104|0|ckly regular accounts cajole slyly. slyly iro +58884|539|F|97403.16|1995-03-22|5-LOW|Clerk#000000018|0|cajole blithely around the silently unusual instruc +58885|208|F|265881.05|1994-08-07|2-HIGH|Clerk#000000439|0|cial instructions. furiously final requests boost slyly. bravely regular +58886|52|O|165834.10|1996-08-02|2-HIGH|Clerk#000000187|0|unts. special instructions about +58887|388|O|138116.61|1996-10-24|1-URGENT|Clerk#000000279|0| hockey players. furiously regular instructions +58912|199|O|163744.64|1997-09-22|4-NOT SPECIFIED|Clerk#000000957|0|eodolites boost evenly furiously bold packages. even +58913|1124|F|236368.81|1993-05-12|3-MEDIUM|Clerk#000000672|0|ing packages at the slyly regular packages wake regular re +58914|865|F|261090.36|1994-04-10|5-LOW|Clerk#000000684|0|counts. bold, final excuses should sleep after the +58915|1037|F|153866.11|1992-01-10|4-NOT SPECIFIED|Clerk#000000040|0|edly regular platelets are slyly. special, silent deposits are carefull +58916|1319|O|213394.26|1997-01-23|3-MEDIUM|Clerk#000000543|0|slyly even, express instructions. fluf +58917|515|F|94869.28|1992-03-03|2-HIGH|Clerk#000000922|0|ackages use quickly along the slyly ironic accounts. re +58918|805|F|9716.54|1994-06-30|2-HIGH|Clerk#000000534|0|lly final instructions. final, silent deposits +58919|877|O|110441.89|1996-10-24|1-URGENT|Clerk#000000068|0|tructions sleep blithely a +58944|328|F|44101.11|1994-05-12|4-NOT SPECIFIED|Clerk#000000669|0|packages wake carefully. +58945|607|O|133510.28|1997-11-16|4-NOT SPECIFIED|Clerk#000000565|0|ans wake blithely f +58946|145|O|254540.41|1998-01-12|1-URGENT|Clerk#000000597|0|special dependencies sleep carefully. dependencies haggle. fi +58947|970|O|250297.19|1995-09-27|4-NOT SPECIFIED|Clerk#000000716|0|r ideas. fluffily final deposits cajole quickly even packages. foxes wa +58948|919|O|158881.92|1996-11-02|3-MEDIUM|Clerk#000000292|0|ickly slow foxes wake carefully: requests sleep. regular foxes boos +58949|694|F|262719.61|1992-12-17|1-URGENT|Clerk#000000401|0|k realms. final accounts wake fluffily. slyly pending braids +58950|868|F|80473.07|1994-05-05|5-LOW|Clerk#000000448|0|es against the care +58951|794|O|85130.43|1997-11-22|5-LOW|Clerk#000000669|0|ly final, regular theodolites. theodolites nag carefully a +58976|1102|F|71062.49|1993-11-26|2-HIGH|Clerk#000000869|0|nts cajole against the quickly ironic accounts. express instructio +58977|901|F|40789.52|1994-10-27|5-LOW|Clerk#000000628|0|l, ironic packages-- furiously regular ideas a +58978|1219|F|175992.71|1992-02-07|5-LOW|Clerk#000000670|0| regular theodolites use above the slyly regular requests. eve +58979|10|O|69241.25|1997-07-06|1-URGENT|Clerk#000000870|0| carefully ironic excuses. slyly silent deposits detect unusual deposits. car +58980|1255|F|128339.96|1994-11-12|4-NOT SPECIFIED|Clerk#000000940|0|ggle blithely above the unusual requests +58981|1279|F|60084.57|1995-02-01|2-HIGH|Clerk#000000566|0|uriously silent deposits +58982|652|O|68893.26|1998-03-12|1-URGENT|Clerk#000000283|0| even ideas. dolphins cajole furiously. carefully even pinto beans cajole +58983|422|O|172797.43|1997-02-04|1-URGENT|Clerk#000000474|0|kindle slyly slyly final pinto beans. even platel +59008|1168|F|213670.03|1993-09-30|1-URGENT|Clerk#000000889|0|inal instructions are fluffily acr +59009|1354|O|170759.44|1995-11-19|1-URGENT|Clerk#000000057|0| the regular pinto beans use furiously along the +59010|1457|P|37130.22|1995-04-16|2-HIGH|Clerk#000000547|0|egular, even deposits use carefully final a +59011|19|O|84473.62|1998-06-02|3-MEDIUM|Clerk#000000200|0|ounts. quickly special theodolites wake blithely about +59012|910|F|73648.29|1994-01-17|5-LOW|Clerk#000000066|0|into beans are. slyly regular platelets sleep idly blithely ru +59013|1201|O|202013.49|1998-03-22|5-LOW|Clerk#000000111|0| haggle carefully along the pearls. furiously express grouches nag. regular e +59014|634|O|114856.48|1996-04-22|4-NOT SPECIFIED|Clerk#000000821|0| requests according to the sile +59015|124|F|176385.78|1992-05-27|3-MEDIUM|Clerk#000000527|0|long the carefully express deposits. quick +59040|232|O|49512.45|1996-03-31|1-URGENT|Clerk#000000738|0|l packages. bold, ironic courts cajole furiously fluffy pains. furiousl +59041|988|O|167466.08|1996-10-04|5-LOW|Clerk#000000140|0|uriously ironic requests are carefully +59042|652|O|104310.75|1995-07-11|1-URGENT|Clerk#000000821|0|c packages. slyly regular deposits +59043|818|F|226595.75|1994-01-11|5-LOW|Clerk#000000252|0| deposits. furiously regular deposits wake. blithely ironic deposits +59044|1144|O|157323.91|1995-07-21|1-URGENT|Clerk#000000879|0|about the pinto bean +59045|1072|F|163721.30|1995-02-14|1-URGENT|Clerk#000000511|0|ly fluffy escapades are slyly requests. furiously regular requests ha +59046|1472|O|196462.84|1996-09-28|2-HIGH|Clerk#000000480|0|uests. carefully close +59047|1001|F|149866.62|1995-01-29|4-NOT SPECIFIED|Clerk#000000812|0|ers use slyly express pinto beans. carefully +59072|1220|F|187827.92|1994-05-26|4-NOT SPECIFIED|Clerk#000000518|0|egular accounts. carefully bold theodolites are. carefully +59073|461|F|22150.45|1993-04-17|5-LOW|Clerk#000000624|0|ngside of the pending grouches. regular asymptotes detect. deposit +59074|739|F|139347.57|1993-08-13|5-LOW|Clerk#000000022|0|iously regular requests. regular deposits wake. unusual accounts cajole eve +59075|1115|F|165949.71|1992-02-27|5-LOW|Clerk#000000547|0|cial theodolites are about th +59076|289|O|37093.99|1997-01-07|5-LOW|Clerk#000000197|0| accounts haggle blithely against the quickly final +59077|991|O|55269.47|1996-12-10|2-HIGH|Clerk#000000532|0|lyly ironic foxes affix quickly quickly regula +59078|970|O|137384.92|1996-11-28|4-NOT SPECIFIED|Clerk#000000426|0|lites sleep. carefully +59079|4|O|29140.97|1995-10-05|5-LOW|Clerk#000000881|0|blithely. carefully regular theodolites detect. +59104|46|F|162887.84|1994-02-13|2-HIGH|Clerk#000000355|0|cross the blithely regular deposits; instructions hag +59105|1273|O|129672.97|1996-12-15|2-HIGH|Clerk#000000381|0|cial asymptotes beyond the final dependencies integrate +59106|953|O|430619.75|1996-10-24|4-NOT SPECIFIED|Clerk#000000344|0|y above the slyly final deposits. furiously regular pinto beans use s +59107|1069|O|170646.08|1997-12-18|3-MEDIUM|Clerk#000000886|0|y regular theodolites. carefully express accounts +59108|607|O|240678.59|1995-10-08|5-LOW|Clerk#000000259|0| deposits cajole above the quickly ironic deposits. carefully express +59109|985|F|68158.70|1994-05-10|4-NOT SPECIFIED|Clerk#000000499|0| quiet multipliers for the furio +59110|410|O|124664.61|1998-01-06|3-MEDIUM|Clerk#000000106|0| theodolites cajole quickly according to the ca +59111|220|F|79881.00|1994-03-26|4-NOT SPECIFIED|Clerk#000000260|0|nstructions across the carefully regular packages +59136|109|O|273407.02|1997-05-28|3-MEDIUM|Clerk#000000099|0|ajole carefully against the packages? quickly unusual packages promise +59137|695|F|100707.90|1992-06-26|2-HIGH|Clerk#000000953|0|ross the regular, final accounts. furiously regular asymptotes u +59138|640|O|52862.66|1996-06-13|5-LOW|Clerk#000000823|0|ironic theodolites. f +59139|662|F|105318.19|1995-01-30|1-URGENT|Clerk#000000827|0|press deposits doze furiously +59140|4|O|215749.35|1997-08-31|4-NOT SPECIFIED|Clerk#000000888|0|lly final theodolites. quickly final accounts after the pending d +59141|1360|O|19737.27|1996-03-30|2-HIGH|Clerk#000000591|0|the ironic pinto beans cajole slyly about +59142|1156|F|169511.60|1993-05-02|1-URGENT|Clerk#000000860|0| regular grouches detect according to the unusual deposits. furio +59143|1105|O|121047.07|1998-07-26|1-URGENT|Clerk#000000258|0|s are furiously among the blithel +59168|983|F|149659.75|1993-06-12|4-NOT SPECIFIED|Clerk#000000032|0|eas. quickly final ideas against the ideas boost thin packages. pend +59169|409|O|156640.25|1997-04-05|1-URGENT|Clerk#000000389|0| according to the quickly unusual pint +59170|1402|F|300714.81|1994-02-18|2-HIGH|Clerk#000000991|0|s wake carefully bold ideas. pinto beans mold +59171|656|O|67320.25|1995-09-13|3-MEDIUM|Clerk#000000623|0|al ideas. slyly final frays haggle furiously across th +59172|1223|O|176272.69|1997-06-19|5-LOW|Clerk#000000779|0|ironic requests alongside of the final +59173|56|F|142286.64|1993-12-21|2-HIGH|Clerk#000000340|0|ally ironic decoys should have to boost. carefully spec +59174|248|F|169601.31|1993-01-02|3-MEDIUM|Clerk#000000687|0|s. enticingly regular instructions alongside of th +59175|157|F|38646.67|1994-04-10|4-NOT SPECIFIED|Clerk#000000968|0|uctions affix quickly. quickly regular packag +59200|1001|O|130966.36|1995-12-10|3-MEDIUM|Clerk#000000333|0|ironic deposits. platelets affix bu +59201|122|O|284494.12|1997-05-18|5-LOW|Clerk#000000123|0|furiously along the slyly ironic requests. express, pending ideas afte +59202|1043|F|185365.82|1992-09-09|3-MEDIUM|Clerk#000000264|0|of the furiously ironic packages. closely u +59203|1267|O|58123.70|1995-07-01|4-NOT SPECIFIED|Clerk#000000212|0|ccounts above the final, even pinto beans nag clo +59204|713|F|214664.12|1992-03-01|3-MEDIUM|Clerk#000000152|0|fully ironic multipliers. carefully express packages cajole furiously. slyly +59205|245|O|64165.34|1995-11-01|1-URGENT|Clerk#000000493|0|uctions. furiously final idea +59206|772|O|171481.67|1995-10-21|2-HIGH|Clerk#000000406|0|posits alongside of the blithely iron +59207|1415|F|115927.42|1994-05-19|1-URGENT|Clerk#000000448|0| slyly regular theodolites. slyly regular platelets along the caref +59232|719|F|199325.86|1994-01-01|2-HIGH|Clerk#000000852|0|c packages. silent, ironic +59233|715|F|192322.68|1993-08-21|2-HIGH|Clerk#000000186|0|ial accounts cajole carefully across +59234|632|F|145418.17|1992-07-30|5-LOW|Clerk#000000561|0|e against the carefully fluffy foxes. ironic, regular +59235|775|O|103580.45|1998-02-21|1-URGENT|Clerk#000000992|0|express accounts cajole along the blithely even sauternes. furiousl +59236|928|F|27416.72|1992-02-19|1-URGENT|Clerk#000000304|0|s wake. stealthily close warhors +59237|652|F|33931.25|1993-07-18|5-LOW|Clerk#000000246|0|the packages. fluffily even packages wake quickl +59238|1147|F|101420.15|1994-09-20|2-HIGH|Clerk#000000973|0|tions during the sp +59239|539|F|163613.06|1993-02-16|1-URGENT|Clerk#000000897|0|g packages. quickly regular notornis +59264|1024|F|79219.81|1992-09-13|2-HIGH|Clerk#000000817|0| the blithely express accounts. carefully regular d +59265|1229|O|53685.58|1997-10-22|1-URGENT|Clerk#000000548|0|oxes. blithely pending requests cajole across the furio +59266|844|O|98598.54|1998-06-15|2-HIGH|Clerk#000000247|0|nt theodolites. slyly pending braids across the +59267|853|P|151852.82|1995-04-19|1-URGENT|Clerk#000000209|0|eodolites poach. dependencies boost +59268|917|F|40237.12|1995-03-19|2-HIGH|Clerk#000000558|0| the ironic, express requests. req +59269|1006|O|148459.93|1996-05-03|5-LOW|Clerk#000000168|0| bold deposits. final instructions lose blithely thinly silent ideas. careful +59270|925|F|234052.44|1993-01-12|2-HIGH|Clerk#000000286|0|counts wake blithely carefu +59271|478|P|269718.88|1995-04-26|4-NOT SPECIFIED|Clerk#000000981|0| the blithely ironic dugouts. q +59296|73|O|47464.43|1997-11-05|5-LOW|Clerk#000000450|0|l accounts cajole about the furiously final i +59297|1036|F|273273.70|1994-12-10|3-MEDIUM|Clerk#000000264|0|ets. theodolites sleep fluff +59298|920|F|25408.83|1994-06-17|4-NOT SPECIFIED|Clerk#000000137|0|sly around the express requests. bold theodolites hagg +59299|95|O|123943.97|1997-08-02|4-NOT SPECIFIED|Clerk#000000660|0|old furiously slyly pending courts! unusual, +59300|1483|O|20287.54|1997-03-08|4-NOT SPECIFIED|Clerk#000000155|0|iously final instructions sleep. express theodolites along th +59301|607|O|175923.01|1996-11-05|2-HIGH|Clerk#000000158|0|ely according to the carefully speci +59302|922|O|113851.86|1996-02-09|4-NOT SPECIFIED|Clerk#000000747|0|ts about the deposits use carefully regular dolphins. carefully ironic pinto b +59303|1376|O|214486.24|1997-12-06|1-URGENT|Clerk#000000177|0|quickly ironic accounts along the furiously unusual accounts n +59328|8|O|145761.72|1997-03-31|5-LOW|Clerk#000000092|0|s. carefully special accounts wake fluffily foxes. ironic pac +59329|1355|F|186839.98|1992-12-05|1-URGENT|Clerk#000000411|0|y during the furiously thin warhorses. epitaphs after the bold req +59330|715|F|28704.52|1994-07-25|3-MEDIUM|Clerk#000000019|0| ironic deposits was atop the ruthlessly ironic foxes. pinto beans detect bli +59331|574|O|204917.76|1998-03-08|5-LOW|Clerk#000000629|0|ts use furiously quickly unusual platelets. furiously special +59332|1220|O|261821.69|1996-01-24|1-URGENT|Clerk#000000883|0|ckly even requests doze furiously ab +59333|1124|O|107762.64|1998-01-26|1-URGENT|Clerk#000000546|0|e fluffily. pending foxes wake about the fluffily re +59334|979|F|104325.85|1995-01-03|2-HIGH|Clerk#000000810|0|es. bold, express requests cajole fluffily bold plat +59335|1475|O|9639.56|1998-02-09|5-LOW|Clerk#000000035|0|ainst the pending theodolites eat fluffily along the furi +59360|1174|F|77513.46|1992-06-19|5-LOW|Clerk#000000758|0|he enticing platelets. blithely ironic p +59361|362|F|39430.03|1992-08-30|2-HIGH|Clerk#000000188|0|oxes about the furio +59362|1324|O|138339.05|1996-05-01|5-LOW|Clerk#000000427|0|essly bold accounts cajole +59363|1117|F|129810.26|1994-05-03|2-HIGH|Clerk#000000973|0|rave excuses sleep. qui +59364|116|O|27867.58|1996-07-06|5-LOW|Clerk#000000548|0|slyly even warhorses along the +59365|937|F|141737.49|1994-12-08|3-MEDIUM|Clerk#000000535|0|efully against the bold, express excuses. blithely even requests snooz +59366|148|P|202743.32|1995-04-23|2-HIGH|Clerk#000000161|0|ic theodolites detect above the ironic packages-- pinto +59367|64|O|244282.09|1996-09-27|2-HIGH|Clerk#000000319|0|ages use furiously pending dependenc +59392|115|F|203982.07|1993-06-27|3-MEDIUM|Clerk#000000604|0|carefully even asymptotes boost quic +59393|1174|F|247675.80|1993-11-21|3-MEDIUM|Clerk#000000576|0|ic asymptotes haggle even, unusual packages. regularly ironic packages n +59394|1129|O|210330.16|1997-06-26|1-URGENT|Clerk#000000484|0|platelets integrate. blithely regular theodolites haggle blithely. +59395|499|F|44176.67|1992-04-23|1-URGENT|Clerk#000000450|0|ithely special ideas along the fluffily final deposits nag in place of the car +59396|169|F|304605.41|1994-11-15|1-URGENT|Clerk#000000475|0|final deposits haggle bold +59397|533|O|130093.99|1997-03-02|4-NOT SPECIFIED|Clerk#000000039|0|oxes. deposits print slyly forges: carefully regular +59398|565|O|28702.42|1998-01-02|3-MEDIUM|Clerk#000000715|0|old dependencies: fluffily i +59399|97|O|214384.65|1995-07-03|1-URGENT|Clerk#000000126|0| accounts sleep careful +59424|866|O|196216.68|1996-12-17|5-LOW|Clerk#000000281|0|s cajole slyly across the +59425|226|F|222152.54|1992-05-18|3-MEDIUM|Clerk#000000200|0|the final, special accounts. carefully f +59426|563|O|201660.76|1996-01-26|5-LOW|Clerk#000000518|0|lyly silent packages. even, even accounts sleep fluffil +59427|307|O|206581.34|1996-08-08|2-HIGH|Clerk#000000065|0|s wake blithely according to the busy packages. s +59428|493|F|276089.08|1993-09-10|2-HIGH|Clerk#000000302|0|r, ironic pinto beans. even pearls wake +59429|1321|F|100533.50|1994-01-03|1-URGENT|Clerk#000000987|0|ual instructions integrate furiously. regular, ir +59430|34|O|53442.52|1997-09-29|3-MEDIUM|Clerk#000000286|0|ithely final deposits use unusual, unusual accounts. ironic +59431|1159|F|114708.13|1993-02-23|2-HIGH|Clerk#000000455|0|ular requests nag; express, express requests detect-- stealthy deposits are d +59456|1012|F|162010.30|1992-01-09|5-LOW|Clerk#000000779|0|sly final accounts. slyly regular +59457|280|O|164763.71|1998-07-31|5-LOW|Clerk#000000665|0|ly blithe asymptotes haggle blithely after the d +59458|827|O|85737.23|1998-04-13|5-LOW|Clerk#000000670|0|efully final packages. bold instructions subl +59459|820|F|89733.40|1994-02-05|3-MEDIUM|Clerk#000000686|0|final warhorses about the even accounts use acro +59460|703|O|159266.98|1995-04-24|2-HIGH|Clerk#000000197|0|cies affix. carefully regular f +59461|698|O|62814.80|1997-10-15|4-NOT SPECIFIED|Clerk#000000549|0|e across the regular, final deposits. furiously spec +59462|790|O|175240.28|1998-03-20|5-LOW|Clerk#000000221|0| wake slyly among the carefully express platelets. unusual dolphins are. furi +59463|886|F|148271.03|1993-10-30|4-NOT SPECIFIED|Clerk#000000133|0|ages according to the stealthily even foxes nag +59488|1246|O|103026.46|1997-10-06|1-URGENT|Clerk#000000924|0| blithely regular accounts sublate blith +59489|517|F|226631.49|1992-01-21|1-URGENT|Clerk#000000510|0|special, pending excuses. deposits +59490|1019|F|52662.30|1993-07-01|4-NOT SPECIFIED|Clerk#000000102|0|haggle instead of the blithely speci +59491|1315|F|218411.39|1992-03-25|2-HIGH|Clerk#000000478|0|lyly regular deposits haggle fluffily unusual requests. qui +59492|1447|F|68228.89|1992-11-01|4-NOT SPECIFIED|Clerk#000000029|0|ts wake closely around the slyly regular packages: permanent, unusua +59493|35|O|75693.75|1996-03-10|4-NOT SPECIFIED|Clerk#000000709|0|fully regular instructions. carefully pendi +59494|137|O|132279.60|1997-05-23|4-NOT SPECIFIED|Clerk#000000174|0|eodolites. requests are quickly among the blithely regu +59495|692|F|191615.71|1992-10-08|4-NOT SPECIFIED|Clerk#000000268|0|und the slyly bold instructions. furiously pending braids wake. packages inte +59520|911|O|179096.77|1997-05-30|4-NOT SPECIFIED|Clerk#000000578|0|s mold. quickly ironic t +59521|976|O|70208.25|1995-10-10|3-MEDIUM|Clerk#000000963|0|s. ruthlessly even dependencies around the ironic, eve +59522|712|F|28762.71|1993-07-15|2-HIGH|Clerk#000000935|0| requests are blithely furiously bold pinto beans. doggedly regular packages +59523|1426|O|121660.63|1995-08-14|2-HIGH|Clerk#000000252|0|ven requests. furiously even deposits sleep-- bold requests cajo +59524|935|F|89783.85|1993-08-07|5-LOW|Clerk#000000175|0|heodolites are slyly ironi +59525|1168|O|115666.58|1996-12-28|2-HIGH|Clerk#000000446|0|tegrate furiously alongside of the ironic, pending packages. carefully exp +59526|284|O|87104.61|1998-04-04|2-HIGH|Clerk#000000311|0|totes wake furiously blithely enticing accounts. reques +59527|1228|O|219710.90|1998-08-01|1-URGENT|Clerk#000000212|0|l instructions sleep sly deposits. quickly express accounts poach fur +59552|847|F|191440.92|1993-01-14|4-NOT SPECIFIED|Clerk#000000771|0|uriously ironic platelets na +59553|577|F|243746.73|1993-11-13|4-NOT SPECIFIED|Clerk#000000736|0|. fluffily unusual packages +59554|1120|O|255097.90|1995-11-16|1-URGENT|Clerk#000000233|0|ep quickly along the carefully express excuses. i +59555|394|O|234371.56|1996-01-28|2-HIGH|Clerk#000000726|0|fully. escapades use furiously across the furiously special deposits. +59556|77|F|140039.22|1994-12-16|4-NOT SPECIFIED|Clerk#000000387|0| to the theodolites. fluffily pending asymptotes after t +59557|275|O|82552.90|1997-06-09|1-URGENT|Clerk#000000521|0|es affix! furiously silent packages cajole among the furio +59558|157|F|94725.43|1992-07-17|4-NOT SPECIFIED|Clerk#000000437|0|ously regular deposits boost final instructions. enticing pinto beans accordin +59559|626|F|186262.25|1993-09-18|1-URGENT|Clerk#000000952|0|furiously. regular foxes wake. blithely pendi +59584|1309|F|148447.71|1993-05-29|3-MEDIUM|Clerk#000000425|0|iments nag carefully p +59585|1102|F|164205.27|1992-09-23|2-HIGH|Clerk#000000169|0|egular deposits. blithely special requests boost furiously about the careful +59586|1111|F|217472.32|1992-03-08|5-LOW|Clerk#000000410|0|refully special ideas. idly even dependencies cajole ironic, regular the +59587|194|F|9638.86|1993-09-10|4-NOT SPECIFIED|Clerk#000000912|0|. theodolites sleep carefully fluffily ironic foxes. express p +59588|1211|O|71416.49|1995-06-15|2-HIGH|Clerk#000000259|0|lar accounts cajole about the +59589|281|F|73691.70|1992-04-12|3-MEDIUM|Clerk#000000412|0| the furiously silent theodolites. evenly regular packages +59590|796|F|262601.08|1993-02-26|3-MEDIUM|Clerk#000000934|0| carefully against +59591|580|F|90906.46|1994-10-10|4-NOT SPECIFIED|Clerk#000000034|0|s detect carefully slyly regular depe +59616|430|O|76956.06|1997-04-20|4-NOT SPECIFIED|Clerk#000000965|0|refully pending pear +59617|304|F|173783.59|1993-05-20|4-NOT SPECIFIED|Clerk#000000364|0|ns! foxes nag. furiously regular packages nag blithely even, +59618|1459|O|239259.54|1997-01-03|5-LOW|Clerk#000000884|0|es use blithely carefully express warhorses. quickly express pinto beans na +59619|1495|F|169965.56|1993-02-14|4-NOT SPECIFIED|Clerk#000000541|0|uses-- express accounts solve stealthily. quickly final accounts would +59620|146|O|221389.01|1998-04-29|4-NOT SPECIFIED|Clerk#000000202|0|arefully regular requests breach. slyly express deposits cajole carefully +59621|760|O|160730.24|1997-04-28|2-HIGH|Clerk#000000023|0| final requests about the blithely final pack +59622|836|O|330490.79|1998-05-03|1-URGENT|Clerk#000000804|0|ts use according to the ironic packages. furious +59623|485|O|303481.89|1997-02-09|4-NOT SPECIFIED|Clerk#000000752|0|hely even instructions. ironic, bo +59648|904|O|155490.12|1997-08-11|4-NOT SPECIFIED|Clerk#000000572|0|nts. fluffily ironic ideas must have to cajole deposits. special deposits w +59649|929|O|273380.03|1997-07-16|2-HIGH|Clerk#000000667|0|lithely regular deposits afte +59650|1447|F|47180.83|1992-12-29|5-LOW|Clerk#000000389|0|cing deposits across the furiously ironic theodolites affix +59651|1093|F|164066.66|1993-05-21|1-URGENT|Clerk#000000055|0|. regular pinto beans mold carefully. +59652|971|F|69166.54|1995-01-28|3-MEDIUM|Clerk#000000201|0|its. blithely special accounts would haggle regular, unusual idea +59653|295|O|236538.46|1997-03-23|5-LOW|Clerk#000000129|0|unts. sometimes express deposits +59654|385|F|243896.21|1993-12-05|4-NOT SPECIFIED|Clerk#000000258|0| carefully across the blithely bold dolphins. blithely pending +59655|1409|F|93647.21|1993-10-23|4-NOT SPECIFIED|Clerk#000000171|0|tructions above the furiously bold packages are slyl +59680|1072|F|172313.52|1992-06-19|1-URGENT|Clerk#000000101|0|g the sly, ironic deposits thrash carefully ac +59681|1474|F|318220.50|1994-06-12|1-URGENT|Clerk#000000650|0|er the quickly special dependencies. even ideas haggle. blithely iron +59682|1195|O|30460.65|1996-04-27|5-LOW|Clerk#000000650|0|ronic requests sublate. bl +59683|1445|F|162717.70|1992-10-14|4-NOT SPECIFIED|Clerk#000000850|0|bove the blithely ironic pinto beans. express ideas haggle carefully. blit +59684|725|F|310966.40|1993-12-30|3-MEDIUM|Clerk#000000611|0|efully ironic courts across t +59685|946|F|96630.57|1992-12-11|1-URGENT|Clerk#000000732|0|. ironically regular requests haggle against the furiou +59686|32|F|13981.23|1995-03-09|5-LOW|Clerk#000000170|0|dazzle at the braids. braids cajole quickly +59687|82|O|175158.67|1998-04-23|1-URGENT|Clerk#000000049|0|luffy, ironic foxes detect. regular, express accounts +59712|527|F|32265.71|1993-06-16|1-URGENT|Clerk#000000970|0|xpress accounts. courts according to the slyly ex +59713|958|F|222273.95|1993-05-08|1-URGENT|Clerk#000000652|0|kly final accounts. express ideas use according to the regular, final pac +59714|772|F|225196.56|1993-12-14|1-URGENT|Clerk#000000892|0|ly. furiously bold accounts wake slyly +59715|992|O|199412.76|1998-03-28|3-MEDIUM|Clerk#000000133|0|nts. special, regular dependencies are +59716|815|O|138322.90|1996-02-03|1-URGENT|Clerk#000000526|0|s wake carefully; bold, express pinto beans thrash? carefully fin +59717|1433|O|122069.17|1995-12-01|2-HIGH|Clerk#000000573|0|ously bold pinto beans must have to wake idly. even, eve +59718|248|F|79311.21|1992-01-01|5-LOW|Clerk#000000897|0|ngside of the regular theodolites. furiously regular frays wake always sil +59719|37|O|72794.48|1995-11-29|2-HIGH|Clerk#000000748|0|osits sleep furiously. carefully +59744|853|F|115982.56|1994-10-30|5-LOW|Clerk#000000378|0|inst the special deposits. slyly special pinto beans affix c +59745|566|F|54035.63|1994-04-20|4-NOT SPECIFIED|Clerk#000000456|0| theodolites wake closely. slyly ironic instructions are carefull +59746|1027|O|74127.04|1996-10-18|2-HIGH|Clerk#000000280|0|kages use carefully. furiously +59747|1351|O|157674.43|1996-01-10|2-HIGH|Clerk#000000429|0|inal asymptotes sleep. fluffily express ideas are care +59748|802|O|70269.89|1997-08-29|2-HIGH|Clerk#000000561|0|wake about the pending accounts. accounts cajole furiously blithely pend +59749|262|O|226721.94|1998-04-28|3-MEDIUM|Clerk#000000953|0|- slyly sly foxes use furiously. quickly unusual acc +59750|1012|F|243541.80|1993-07-10|5-LOW|Clerk#000000952|0|he blithely express frays. quickly even idea +59751|1337|O|202722.62|1998-01-19|5-LOW|Clerk#000000612|0|ons boost fluffily at the blithely bold +59776|1166|F|242701.68|1994-03-10|5-LOW|Clerk#000000855|0|zzle final, final dependencies. final, final accounts are blith +59777|890|F|87858.53|1993-12-13|2-HIGH|Clerk#000000017|0| furiously according to the slyly express accounts. fu +59778|928|O|119857.86|1997-06-13|1-URGENT|Clerk#000000469|0|y packages. fluffily slow Tiresias wa +59779|140|F|271847.81|1994-05-18|5-LOW|Clerk#000000213|0|sits haggle furiously alongsi +59780|929|F|148223.07|1993-02-21|1-URGENT|Clerk#000000502|0|s. quickly final asymptotes wake c +59781|169|F|186921.52|1992-12-13|4-NOT SPECIFIED|Clerk#000000084|0|efully after the fluf +59782|992|O|128174.88|1996-08-11|1-URGENT|Clerk#000000434|0|lites are blithely. even courts shall sle +59783|895|F|90116.97|1993-08-20|5-LOW|Clerk#000000358|0|ealms cajole slyly regular, special accounts. carefully bold orbits +59808|1103|O|45514.28|1995-07-16|5-LOW|Clerk#000000120|0|blithely careful courts ought to use f +59809|55|P|113301.67|1995-03-09|4-NOT SPECIFIED|Clerk#000000394|0|egular excuses haggle agai +59810|1198|O|76425.55|1998-06-18|1-URGENT|Clerk#000000567|0|ular, busy accounts sleep quickly ironic deposits. carefully spe +59811|749|O|119086.61|1998-01-07|5-LOW|Clerk#000000280|0|pinto beans. deposits about the brave +59812|955|O|119561.86|1995-06-23|3-MEDIUM|Clerk#000000248|0|fully silent platelets boost foxes. slyly ironic accounts above the i +59813|1213|O|308847.12|1996-07-08|5-LOW|Clerk#000000643|0|ily unusual instructions mold. regular accounts +59814|1162|F|145695.45|1994-09-28|1-URGENT|Clerk#000000558|0| the unusual asymptotes. slyly even instruction +59815|700|F|144070.16|1993-12-16|4-NOT SPECIFIED|Clerk#000000567|0|ntain doggedly requests. s +59840|1336|O|101397.11|1997-08-04|1-URGENT|Clerk#000000897|0|. quickly final accounts are alongside of the qu +59841|955|F|370518.49|1993-05-28|2-HIGH|Clerk#000000653|0|oxes haggle carefully regular, express Tiresias. furio +59842|358|F|89537.63|1992-03-17|4-NOT SPECIFIED|Clerk#000000734|0|hely. unusual, final theodo +59843|1453|F|233753.80|1995-02-14|2-HIGH|Clerk#000000188|0|ss accounts. quickly pending accounts wa +59844|398|F|104748.23|1993-08-17|3-MEDIUM|Clerk#000000026|0|ld theodolites. accounts breach quickly carefully express asymptotes +59845|1171|F|262875.59|1994-12-23|5-LOW|Clerk#000000359|0|le quickly fluffily final theodolites. reg +59846|799|O|140268.17|1995-08-29|3-MEDIUM|Clerk#000000366|0|ckages among the furiously express theodolites doubt bravely across the fur +59847|1264|F|199727.62|1994-04-17|3-MEDIUM|Clerk#000000388|0|requests at the regular foxes thrash sometimes bold accoun +59872|686|O|31901.92|1996-09-13|3-MEDIUM|Clerk#000000497|0|fily special accounts. blit +59873|1499|F|359414.77|1994-02-13|3-MEDIUM|Clerk#000000235|0|counts. slyly ironic deposits boos +59874|514|F|150435.47|1995-01-06|5-LOW|Clerk#000000002|0|egular requests are fluffily ironic deposits. furio +59875|388|O|150366.51|1997-05-03|5-LOW|Clerk#000000122|0|lar packages. carefully special deposits affix. packages haggle. furio +59876|709|O|103944.72|1996-06-25|1-URGENT|Clerk#000000508|0|foxes wake blithely blithely ironic instructions. slyly unusua +59877|667|F|96214.77|1993-05-26|1-URGENT|Clerk#000000654|0|ly final accounts haggle upon the blithely final pin +59878|1147|F|254529.11|1992-05-29|2-HIGH|Clerk#000000360|0|ironic asymptotes wake slyly! quickly close +59879|470|F|57566.87|1994-03-10|4-NOT SPECIFIED|Clerk#000000205|0|al packages are slyly about the theodolit +59904|772|F|65146.49|1992-03-25|5-LOW|Clerk#000000486|0|s. furiously ironic +59905|475|F|151664.46|1992-04-15|2-HIGH|Clerk#000000684|0|counts haggle furiously even packages. even, e +59906|505|F|181481.12|1993-05-21|2-HIGH|Clerk#000000313|0|as are according to the carefully final foxes. fluffily +59907|715|O|231964.11|1997-01-09|5-LOW|Clerk#000000730|0|deposits hinder furiously. final deposits hinder bli +59908|242|F|33695.83|1992-09-26|1-URGENT|Clerk#000000016|0| requests. express deposits will wake daringly above the blithely regu +59909|160|F|180810.02|1992-08-06|5-LOW|Clerk#000000083|0|ously bold courts. fluffily express requests wake slyly platelets. slyly fina +59910|763|O|33820.94|1995-06-11|3-MEDIUM|Clerk#000000183|0|into beans. furiously unusual packages according to th +59911|140|O|57960.06|1995-12-19|4-NOT SPECIFIED|Clerk#000000662|0|c packages. slyly pending asymptotes are about the special, unusual dolph +59936|568|F|81094.42|1992-11-21|1-URGENT|Clerk#000000271|0|structions haggle fluffily ironic, regular requests. furiously regular +59937|985|F|6524.60|1994-12-29|2-HIGH|Clerk#000000356|0|wake outside the ironic +59938|1079|O|76407.32|1995-08-07|2-HIGH|Clerk#000000356|0|fter the special accounts use blithely slyly final ideas? fu +59939|425|F|119286.90|1993-09-02|3-MEDIUM|Clerk#000000287|0|uriously above the fluf +59940|238|F|130910.25|1994-09-25|5-LOW|Clerk#000000515|0|avely pending deposits haggle quickly among the carefully +59941|1414|F|98772.72|1992-10-22|1-URGENT|Clerk#000000005|0|ests. quickly pending courts wake blithely around the final excuses. s +59942|581|F|243021.96|1994-02-09|3-MEDIUM|Clerk#000000435|0|nding accounts across the slyly special requests cajole accordi +59943|340|F|57983.40|1993-06-10|1-URGENT|Clerk#000000504|0|al packages nag carefully. regular ideas will are blithely special instruct +59968|898|O|59677.34|1997-10-12|4-NOT SPECIFIED|Clerk#000000833|0|ages. furiously final foxes wake of the +59969|1210|F|223577.84|1992-01-12|2-HIGH|Clerk#000000926|0|gular packages use. final deposits cajole quickly regu +59970|970|O|25973.28|1998-07-15|1-URGENT|Clerk#000000181|0| pearls nag. fluffily special foxes boost sl +59971|826|P|242729.20|1995-06-01|1-URGENT|Clerk#000000461|0|odolites. slyly final instructions wake slyly. special foxes a +59972|1480|F|98245.72|1994-11-01|4-NOT SPECIFIED|Clerk#000000260|0|le along the deposits. blithely bol +59973|229|O|230718.14|1995-11-16|5-LOW|Clerk#000000891|0|lyly among the furiously fluffy theodolites. carefully f +59974|761|O|63273.39|1995-12-05|2-HIGH|Clerk#000000862|0|counts. even, ironic packages cajole ironic +59975|706|F|59995.27|1993-12-22|5-LOW|Clerk#000000193|0|. even packages affix fluffily against +60000|1426|P|299401.61|1995-04-21|2-HIGH|Clerk#000000194|0|usual frets use alongside of the furiou diff --git a/src/test/singlenode_regress/data/order_small.csv b/src/test/singlenode_regress/data/order_small.csv new file mode 100644 index 00000000000..990d08ce0f6 --- /dev/null +++ b/src/test/singlenode_regress/data/order_small.csv @@ -0,0 +1,1498 @@ +1|370|O|172799.49|1996-01-02|5-LOW|Clerk#000000951|0|nstructions sleep furiously among +2|781|O|38426.09|1996-12-01|1-URGENT|Clerk#000000880|0| foxes. pending accounts at the pending, silent asymptot +3|1234|F|205654.30|1993-10-14|5-LOW|Clerk#000000955|0|sly final accounts boost. carefully regular ideas cajole carefully. depos +4|1369|O|56000.91|1995-10-11|5-LOW|Clerk#000000124|0|sits. slyly regular warthogs cajole. regular, regular theodolites acro +5|445|F|105367.67|1994-07-30|5-LOW|Clerk#000000925|0|quickly. bold deposits sleep slyly. packages use slyly +6|557|F|45523.10|1992-02-21|4-NOT SPECIFIED|Clerk#000000058|0|ggle. special, final requests are against the furiously specia +7|392|O|271885.66|1996-01-10|2-HIGH|Clerk#000000470|0|ly special requests +32|1301|O|198665.57|1995-07-16|2-HIGH|Clerk#000000616|0|ise blithely bold, regular requests. quickly unusual dep +33|670|F|146567.24|1993-10-27|3-MEDIUM|Clerk#000000409|0|uriously. furiously final request +34|611|O|73315.48|1998-07-21|3-MEDIUM|Clerk#000000223|0|ly final packages. fluffily final deposits wake blithely ideas. spe +35|1276|O|194641.93|1995-10-23|4-NOT SPECIFIED|Clerk#000000259|0|zzle. carefully enticing deposits nag furio +36|1153|O|42011.04|1995-11-03|1-URGENT|Clerk#000000358|0| quick packages are blithely. slyly silent accounts wake qu +37|862|F|131896.49|1992-06-03|3-MEDIUM|Clerk#000000456|0|kly regular pinto beans. carefully unusual waters cajole never +38|1249|O|71553.08|1996-08-21|4-NOT SPECIFIED|Clerk#000000604|0|haggle blithely. furiously express ideas haggle blithely furiously regular re +39|818|O|326565.37|1996-09-20|3-MEDIUM|Clerk#000000659|0|ole express, ironic requests: ir +64|322|F|35831.73|1994-07-16|3-MEDIUM|Clerk#000000661|0|wake fluffily. sometimes ironic pinto beans about the dolphin +65|163|P|95469.44|1995-03-18|1-URGENT|Clerk#000000632|0|ular requests are blithely pending orbits-- even requests against the deposit +66|1292|F|104190.66|1994-01-20|5-LOW|Clerk#000000743|0|y pending requests integrate +67|568|O|182481.16|1996-12-19|4-NOT SPECIFIED|Clerk#000000547|0|symptotes haggle slyly around the furiously iron +68|286|O|301968.79|1998-04-18|3-MEDIUM|Clerk#000000440|0| pinto beans sleep carefully. blithely ironic deposits haggle furiously acro +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 +70|644|F|125705.32|1993-12-18|5-LOW|Clerk#000000322|0| carefully ironic request +71|34|O|260603.38|1998-01-24|4-NOT SPECIFIED|Clerk#000000271|0| express deposits along the blithely regul +96|1078|F|64364.30|1994-04-17|2-HIGH|Clerk#000000395|0|oost furiously. pinto +97|211|F|100572.55|1993-01-29|3-MEDIUM|Clerk#000000547|0|hang blithely along the regular accounts. furiously even ideas after the +98|1045|F|71721.40|1994-09-25|1-URGENT|Clerk#000000448|0|c asymptotes. quickly regular packages should have to nag re +99|890|F|108594.87|1994-03-13|4-NOT SPECIFIED|Clerk#000000973|0|e carefully ironic packages. pending +100|1471|O|198978.27|1998-02-28|4-NOT SPECIFIED|Clerk#000000577|0|heodolites detect slyly alongside of the ent +101|280|O|118448.39|1996-03-17|3-MEDIUM|Clerk#000000419|0|ding accounts above the slyly final asymptote +102|8|O|184806.58|1997-05-09|2-HIGH|Clerk#000000596|0| slyly according to the asymptotes. carefully final packages integrate furious +103|292|O|118745.16|1996-06-20|4-NOT SPECIFIED|Clerk#000000090|0|ges. carefully unusual instructions haggle quickly regular f +128|740|F|34997.04|1992-06-15|1-URGENT|Clerk#000000385|0|ns integrate fluffily. ironic asymptotes after the regular excuses nag around +129|712|F|254281.41|1992-11-19|5-LOW|Clerk#000000859|0|ing tithes. carefully pending deposits boost about the silently express +130|370|F|140213.54|1992-05-08|2-HIGH|Clerk#000000036|0|le slyly unusual, regular packages? express deposits det +131|928|F|140726.47|1994-06-08|3-MEDIUM|Clerk#000000625|0|after the fluffily special foxes integrate s +132|265|F|133485.89|1993-06-11|3-MEDIUM|Clerk#000000488|0|sits are daringly accounts. carefully regular foxes sleep slyly about the +133|440|O|95971.06|1997-11-29|1-URGENT|Clerk#000000738|0|usly final asymptotes +134|62|F|208201.46|1992-05-01|4-NOT SPECIFIED|Clerk#000000711|0|lar theodolites boos +135|605|O|230472.84|1995-10-21|4-NOT SPECIFIED|Clerk#000000804|0|l platelets use according t +160|826|O|114742.32|1996-12-19|4-NOT SPECIFIED|Clerk#000000342|0|thely special sauternes wake slyly of t +161|167|F|17668.60|1994-08-31|2-HIGH|Clerk#000000322|0|carefully! special instructions sin +162|142|O|3553.15|1995-05-08|3-MEDIUM|Clerk#000000378|0|nts hinder fluffily ironic instructions. express, express excuses +163|878|O|177809.13|1997-09-05|3-MEDIUM|Clerk#000000379|0|y final packages. final foxes since the quickly even +164|8|F|250417.20|1992-10-21|5-LOW|Clerk#000000209|0|cajole ironic courts. slyly final ideas are slyly. blithely final Tiresias sub +165|274|F|193302.35|1993-01-30|4-NOT SPECIFIED|Clerk#000000292|0|across the blithely regular accounts. bold +166|1079|O|158207.39|1995-09-12|2-HIGH|Clerk#000000440|0|lets. ironic, bold asymptotes kindle +167|1195|F|64017.85|1993-01-04|4-NOT SPECIFIED|Clerk#000000731|0|s nag furiously bold excuses. fluffily iron +192|826|O|194637.57|1997-11-25|5-LOW|Clerk#000000483|0|y unusual platelets among the final instructions integrate rut +193|791|F|80834.26|1993-08-08|1-URGENT|Clerk#000000025|0|the furiously final pin +194|619|F|154284.73|1992-04-05|3-MEDIUM|Clerk#000000352|0|egular requests haggle slyly regular, regular pinto beans. asymptote +195|1355|F|216638.92|1993-12-28|3-MEDIUM|Clerk#000000216|0|old forges are furiously sheaves. slyly fi +196|649|F|38660.64|1993-03-17|2-HIGH|Clerk#000000988|0|beans boost at the foxes. silent foxes +197|326|P|155247.48|1995-04-07|2-HIGH|Clerk#000000969|0|solve quickly about the even braids. carefully express deposits affix care +198|1103|O|149551.63|1998-01-02|4-NOT SPECIFIED|Clerk#000000331|0|its. carefully ironic requests sleep. furiously express fox +199|530|O|95867.70|1996-03-07|2-HIGH|Clerk#000000489|0|g theodolites. special packag +224|25|F|234050.44|1994-06-18|4-NOT SPECIFIED|Clerk#000000642|0|r the quickly thin courts. carefully +225|331|P|226028.98|1995-05-25|1-URGENT|Clerk#000000177|0|s. blithely ironic accounts wake quickly fluffily special acc +226|1276|F|256459.40|1993-03-10|2-HIGH|Clerk#000000756|0|s are carefully at the blithely ironic acc +227|100|O|69020.68|1995-11-10|5-LOW|Clerk#000000919|0| express instructions. slyly regul +228|442|F|2744.06|1993-02-25|1-URGENT|Clerk#000000562|0|es was slyly among the regular foxes. blithely regular dependenci +229|1118|F|195619.74|1993-12-29|1-URGENT|Clerk#000000628|0|he fluffily even instructions. furiously i +230|1027|F|147711.01|1993-10-27|1-URGENT|Clerk#000000520|0|odolites. carefully quick requ +231|910|F|234383.86|1994-09-29|2-HIGH|Clerk#000000446|0| packages haggle slyly after the carefully ironic instruct +256|1249|F|132718.67|1993-10-19|4-NOT SPECIFIED|Clerk#000000834|0|he fluffily final ideas might are final accounts. carefully f +257|1228|O|9255.12|1998-03-28|3-MEDIUM|Clerk#000000680|0|ts against the sly warhorses cajole slyly accounts +258|419|F|259466.78|1993-12-29|1-URGENT|Clerk#000000167|0|dencies. blithely quick packages cajole. ruthlessly final accounts +259|433|F|110611.59|1993-09-29|4-NOT SPECIFIED|Clerk#000000601|0|ages doubt blithely against the final foxes. carefully express deposits dazzle +260|1048|O|268084.69|1996-12-10|3-MEDIUM|Clerk#000000960|0|lently regular pinto beans sleep after the slyly e +261|461|F|278279.30|1993-06-29|3-MEDIUM|Clerk#000000310|0|ully fluffily brave instructions. furiousl +262|304|O|173401.63|1995-11-25|4-NOT SPECIFIED|Clerk#000000551|0|l packages. blithely final pinto beans use carefu +263|1162|F|104961.32|1994-05-17|2-HIGH|Clerk#000000088|0| pending instructions. blithely un +288|71|O|239366.68|1997-02-21|1-URGENT|Clerk#000000109|0|uriously final requests. even, final ideas det +289|1039|O|174624.55|1997-02-10|3-MEDIUM|Clerk#000000103|0|sily. slyly special excuse +290|1180|F|67636.54|1994-01-01|4-NOT SPECIFIED|Clerk#000000735|0|efully dogged deposits. furiou +291|1411|F|88375.89|1994-03-13|1-URGENT|Clerk#000000923|0|dolites. carefully regular pinto beans cajol +292|223|F|54152.77|1992-01-13|2-HIGH|Clerk#000000193|0|g pinto beans will have to sleep f +293|301|F|46128.56|1992-10-02|2-HIGH|Clerk#000000629|0|re bold, ironic deposits. platelets c +294|505|F|46889.54|1993-07-16|3-MEDIUM|Clerk#000000499|0|kly according to the frays. final dolphins affix quickly +295|190|F|148569.49|1994-09-29|2-HIGH|Clerk#000000155|0| unusual pinto beans play. regular ideas haggle +320|4|O|50202.60|1997-11-21|2-HIGH|Clerk#000000573|0|ar foxes nag blithely +321|1226|F|73024.50|1993-03-21|3-MEDIUM|Clerk#000000289|0|equests run. blithely final dependencies after the deposits wake caref +322|1336|F|165992.05|1992-03-19|1-URGENT|Clerk#000000158|0|fully across the slyly bold packages. packages against the quickly regular i +323|392|F|121127.17|1994-03-26|1-URGENT|Clerk#000000959|0|arefully pending foxes sleep blithely. slyly express accoun +324|1052|F|46327.90|1992-03-20|1-URGENT|Clerk#000000352|0| about the ironic, regular deposits run blithely against the excuses +325|401|F|94638.59|1993-10-17|5-LOW|Clerk#000000844|0|ly sometimes pending pa +326|760|O|325448.68|1995-06-04|2-HIGH|Clerk#000000466|0| requests. furiously ironic asymptotes mold carefully alongside of the blit +327|1447|P|32302.12|1995-04-17|5-LOW|Clerk#000000992|0|ng the slyly final courts. slyly even escapades eat +352|1066|F|25542.02|1994-03-08|2-HIGH|Clerk#000000932|0|ke slyly bold pinto beans. blithely regular accounts against the spe +353|19|F|224983.69|1993-12-31|5-LOW|Clerk#000000449|0| quiet ideas sleep. even instructions cajole slyly. silently spe +354|1384|O|231311.22|1996-03-14|2-HIGH|Clerk#000000511|0|ly regular ideas wake across the slyly silent ideas. final deposits eat b +355|701|F|103949.82|1994-06-14|5-LOW|Clerk#000000532|0|s. sometimes regular requests cajole. regular, pending accounts a +356|1469|F|189160.02|1994-06-30|4-NOT SPECIFIED|Clerk#000000944|0|as wake along the bold accounts. even, +357|604|O|138936.83|1996-10-09|2-HIGH|Clerk#000000301|0|e blithely about the express, final accounts. quickl +358|23|F|362024.17|1993-09-20|2-HIGH|Clerk#000000392|0|l, silent instructions are slyly. silently even de +359|776|F|214770.97|1994-12-19|3-MEDIUM|Clerk#000000934|0|n dolphins. special courts above the carefully ironic requests use +384|1132|F|191275.12|1992-03-03|5-LOW|Clerk#000000206|0|, even accounts use furiously packages. slyly ironic pla +385|331|O|75866.47|1996-03-22|5-LOW|Clerk#000000600|0|hless accounts unwind bold pain +386|602|F|119718.02|1995-01-25|2-HIGH|Clerk#000000648|0| haggle quickly. stealthily bold asymptotes haggle among the furiously even re +387|34|O|197839.44|1997-01-26|4-NOT SPECIFIED|Clerk#000000768|0| are carefully among the quickly even deposits. furiously silent req +388|448|F|161560.04|1992-12-16|4-NOT SPECIFIED|Clerk#000000356|0|ar foxes above the furiously ironic deposits nag slyly final reque +389|1270|F|3266.69|1994-02-17|2-HIGH|Clerk#000000062|0|ing to the regular asymptotes. final, pending foxes about the blithely sil +390|1027|O|232256.36|1998-04-07|5-LOW|Clerk#000000404|0|xpress asymptotes use among the regular, final pinto b +391|1103|F|14517.91|1994-11-17|2-HIGH|Clerk#000000256|0|orges thrash fluffil +416|403|F|106818.50|1993-09-27|5-LOW|Clerk#000000294|0| the accounts. fluffily bold depo +417|547|F|132531.73|1994-02-06|3-MEDIUM|Clerk#000000468|0|ironic, even packages. thinly unusual accounts sleep along the slyly unusual +418|949|P|39431.46|1995-04-13|4-NOT SPECIFIED|Clerk#000000643|0|. furiously ironic instruc +419|1163|O|159079.22|1996-10-01|3-MEDIUM|Clerk#000000376|0|osits. blithely pending theodolites boost carefully +420|902|O|269064.47|1995-10-31|4-NOT SPECIFIED|Clerk#000000756|0|leep carefully final excuses. fluffily pending requests unwind carefully above +421|392|F|1292.21|1992-02-22|5-LOW|Clerk#000000405|0|egular, even packages according to the final, un +422|731|O|155533.71|1997-05-31|4-NOT SPECIFIED|Clerk#000000049|0|aggle carefully across the accounts. regular accounts eat fluffi +423|1034|O|31900.60|1996-06-01|1-URGENT|Clerk#000000674|0|quests. deposits cajole quickly. furiously bold accounts haggle q +448|1498|O|157247.56|1995-08-21|3-MEDIUM|Clerk#000000597|0| regular, express foxes use blithely. quic +449|958|O|55082.33|1995-07-20|2-HIGH|Clerk#000000841|0|. furiously regular theodolites affix blithely +450|475|P|213638.07|1995-03-05|4-NOT SPECIFIED|Clerk#000000293|0|d theodolites. boldly bold foxes since the pack +451|988|O|142756.81|1998-05-25|5-LOW|Clerk#000000048|0|nic pinto beans. theodolites poach carefully; +452|596|O|2072.79|1997-10-14|1-URGENT|Clerk#000000498|0|t, unusual instructions above the blithely bold pint +453|442|O|343004.49|1997-05-26|5-LOW|Clerk#000000504|0|ss foxes. furiously regular ideas sleep according to t +454|488|O|24543.95|1995-12-27|5-LOW|Clerk#000000890|0|dolites sleep carefully blithely regular deposits. quickly regul +455|121|O|190711.32|1996-12-04|1-URGENT|Clerk#000000796|0| about the final platelets. dependen +480|715|F|30644.49|1993-05-08|5-LOW|Clerk#000000004|0|ealthy pinto beans. fluffily regular requests along the special sheaves wake +481|304|F|160370.14|1992-10-08|2-HIGH|Clerk#000000230|0|ly final ideas. packages haggle fluffily +482|1252|O|197194.23|1996-03-26|1-URGENT|Clerk#000000295|0|ts. deposits wake: final acco +483|349|O|66194.38|1995-07-11|2-HIGH|Clerk#000000025|0|cross the carefully final e +484|544|O|331553.32|1997-01-03|3-MEDIUM|Clerk#000000545|0|grouches use. furiously bold accounts maintain. bold, regular deposits +485|1006|O|142389.70|1997-03-26|2-HIGH|Clerk#000000105|0| regular ideas nag thinly furiously s +486|509|O|286150.09|1996-03-11|4-NOT SPECIFIED|Clerk#000000803|0|riously dolphins. fluffily ironic requ +487|1079|F|88805.07|1992-08-18|1-URGENT|Clerk#000000086|0|ithely unusual courts eat accordi +512|631|P|183939.48|1995-05-20|5-LOW|Clerk#000000814|0|ding requests. carefully express theodolites was quickly. furious +513|607|O|78769.71|1995-05-01|2-HIGH|Clerk#000000522|0|regular packages. pinto beans cajole carefully against the even +514|749|O|123202.51|1996-04-04|2-HIGH|Clerk#000000094|0| cajole furiously. slyly final excuses cajole. slyly special instructions +515|1420|F|177231.12|1993-08-29|4-NOT SPECIFIED|Clerk#000000700|0|eposits are furiously furiously silent pinto beans. pending pack +516|440|O|13277.79|1998-04-21|2-HIGH|Clerk#000000305|0|lar, unusual platelets are carefully. even courts sleep bold, final pinto bea +517|94|O|109269.47|1997-04-07|5-LOW|Clerk#000000359|0|slyly pending deposits cajole quickly packages. furiou +518|1444|O|335285.37|1998-02-08|2-HIGH|Clerk#000000768|0| the carefully bold accounts. quickly regular excuses are +519|631|O|109395.60|1997-10-31|1-URGENT|Clerk#000000985|0|ains doze furiously against the f +544|934|F|58960.45|1993-02-17|2-HIGH|Clerk#000000145|0|the special, final accounts. dogged dolphins +545|632|O|35129.54|1995-11-07|2-HIGH|Clerk#000000537|0|as. blithely final hockey players about th +546|1433|O|26227.74|1996-11-01|2-HIGH|Clerk#000000041|0|osits sleep. slyly special dolphins about the q +547|983|O|137852.72|1996-06-22|3-MEDIUM|Clerk#000000976|0|ing accounts eat. carefully regular packa +548|1240|F|139094.89|1994-09-21|1-URGENT|Clerk#000000435|0|arefully express instru +549|1100|F|211787.30|1992-07-13|1-URGENT|Clerk#000000196|0|ideas alongside of +550|236|O|54818.45|1995-08-02|1-URGENT|Clerk#000000204|0|t requests. blithely +551|898|O|64301.40|1995-05-30|1-URGENT|Clerk#000000179|0|xpress accounts boost quic +576|296|O|24722.97|1997-05-13|3-MEDIUM|Clerk#000000955|0|l requests affix regular requests. final account +577|553|F|47860.53|1994-12-19|5-LOW|Clerk#000000154|0| deposits engage stealthil +578|926|O|103543.00|1997-01-10|5-LOW|Clerk#000000281|0|e blithely even packages. slyly pending platelets bes +579|671|O|146610.11|1998-03-11|2-HIGH|Clerk#000000862|0| regular instructions. blithely even p +580|593|O|144557.44|1997-07-05|2-HIGH|Clerk#000000314|0|tegrate fluffily regular accou +581|688|O|175985.28|1997-02-23|4-NOT SPECIFIED|Clerk#000000239|0| requests. even requests use slyly. blithely ironic +582|494|O|181813.20|1997-10-21|1-URGENT|Clerk#000000378|0|n pinto beans print a +583|472|O|154731.76|1997-03-19|3-MEDIUM|Clerk#000000792|0|efully express requests. a +608|260|O|100151.20|1996-02-28|3-MEDIUM|Clerk#000000995|0|nic waters wake slyly slyly expre +609|1252|F|33980.88|1994-06-01|3-MEDIUM|Clerk#000000348|0|- ironic gifts believe furiously ca +610|508|O|229411.94|1995-08-02|1-URGENT|Clerk#000000610|0|totes. ironic, unusual packag +611|1055|F|83388.31|1993-01-27|1-URGENT|Clerk#000000401|0|ounts detect furiously ac +612|815|F|232560.07|1992-10-21|3-MEDIUM|Clerk#000000759|0|boost quickly quickly final excuses. final foxes use bravely afte +613|1384|O|56355.92|1995-06-18|2-HIGH|Clerk#000000172|0|ts hinder among the deposits. fluffily ironic depos +614|1333|F|325942.94|1992-12-01|2-HIGH|Clerk#000000388|0| deposits! even, daring theodol +615|655|F|30990.93|1992-05-09|5-LOW|Clerk#000000388|0|t to promise asymptotes. packages haggle alongside of the fluffil +640|952|F|210229.36|1993-01-23|2-HIGH|Clerk#000000433|0|r, unusual accounts boost carefully final ideas. slyly silent theod +641|1330|F|175084.81|1993-08-30|5-LOW|Clerk#000000175|0|ents cajole furiously about the quickly silent pac +642|400|F|34647.34|1993-12-16|3-MEDIUM|Clerk#000000357|0| among the requests wake slyly alongside of th +643|578|P|261882.19|1995-03-25|2-HIGH|Clerk#000000354|0|g dependencies. regular accounts +644|74|F|267079.41|1992-05-01|1-URGENT|Clerk#000000550|0| blithely unusual platelets haggle ironic, special excuses. excuses unwi +645|1144|F|350110.21|1994-12-03|2-HIGH|Clerk#000000090|0|quickly daring theodolites across the regu +646|505|F|192105.59|1994-11-22|2-HIGH|Clerk#000000203|0|carefully even foxes. fina +647|1430|O|67696.52|1997-08-07|1-URGENT|Clerk#000000270|0|egular pearls. carefully express asymptotes are. even account +672|1081|F|128581.82|1994-04-14|5-LOW|Clerk#000000106|0|egular requests are furiously according to +673|793|F|34950.94|1994-03-10|1-URGENT|Clerk#000000448|0| special pinto beans use quickly furiously even depende +674|332|F|27390.00|1992-08-29|5-LOW|Clerk#000000448|0|ully special deposits. furiously final warhorses affix carefully. fluffily f +675|118|O|166843.13|1997-07-31|2-HIGH|Clerk#000000168|0|ffily between the careful +676|380|O|254171.66|1996-12-13|2-HIGH|Clerk#000000248|0|the final deposits. special, pending +677|1240|F|205917.22|1993-11-24|3-MEDIUM|Clerk#000000824|0|uriously special pinto beans cajole carefully. fi +678|1307|F|208791.37|1993-02-27|5-LOW|Clerk#000000530|0|. blithely final somas about the +679|485|O|14905.06|1995-12-15|2-HIGH|Clerk#000000853|0|tealthy, final pinto beans haggle slyly. pending platelets about the special, +704|844|O|85100.07|1996-11-21|3-MEDIUM|Clerk#000000682|0|blithely pending platelets wake alongside of the final, iron +705|428|O|117587.40|1997-02-13|4-NOT SPECIFIED|Clerk#000000294|0|ithely regular dependencies. express, even packages sleep slyly pending t +706|1474|O|40836.77|1995-09-09|1-URGENT|Clerk#000000448|0|g the packages. deposits caj +707|1162|F|80722.77|1994-11-20|3-MEDIUM|Clerk#000000199|0| ideas about the silent, bold deposits nag dolphins +708|316|O|127925.56|1998-07-03|3-MEDIUM|Clerk#000000101|0|lphins cajole about t +709|361|O|92115.73|1998-04-21|1-URGENT|Clerk#000000461|0|ons alongside of the carefully bold pinto bea +710|1312|F|309878.50|1993-01-02|5-LOW|Clerk#000000026|0| regular, regular requests boost. fluffily re +711|637|F|99553.27|1993-09-23|4-NOT SPECIFIED|Clerk#000000856|0|its. fluffily regular gifts are furi +736|464|O|200720.61|1998-06-21|5-LOW|Clerk#000000881|0|refully of the final pi +737|1198|F|20647.65|1992-04-26|5-LOW|Clerk#000000233|0|ake blithely express, ironic theodolites. blithely special accounts wa +738|208|F|177823.89|1993-03-02|4-NOT SPECIFIED|Clerk#000000669|0|ly even foxes. furiously regular accounts cajole ca +739|4|O|226008.80|1998-05-31|5-LOW|Clerk#000000900|0| against the slyly ironic packages nag slyly ironic +740|436|O|126713.42|1995-07-16|3-MEDIUM|Clerk#000000583|0|courts haggle furiously across the final, regul +741|1045|O|81912.56|1998-07-07|2-HIGH|Clerk#000000295|0|ic instructions. slyly express instructions solv +742|1030|F|258834.44|1994-12-23|5-LOW|Clerk#000000543|0|equests? slyly ironic dolphins boost carefully above the blithely +743|784|O|39284.49|1996-10-04|4-NOT SPECIFIED|Clerk#000000933|0|eans. furiously ironic deposits sleep carefully carefully qui +768|971|O|294534.22|1996-08-20|3-MEDIUM|Clerk#000000411|0|jole slyly ironic packages. slyly even idea +769|800|F|65622.27|1993-06-02|3-MEDIUM|Clerk#000000172|0|ggle furiously. ironic packages haggle slyly. bold platelets affix s +770|320|O|99554.29|1998-05-23|5-LOW|Clerk#000000572|0|heodolites. furiously special pinto beans cajole pac +771|446|O|151561.45|1995-06-17|1-URGENT|Clerk#000000105|0|s. furiously final instructions across the deposit +772|965|F|205442.15|1993-04-17|2-HIGH|Clerk#000000430|0|s boost blithely fluffily idle ideas? fluffily even pin +773|1319|F|190734.21|1993-09-26|3-MEDIUM|Clerk#000000307|0|tions are quickly accounts. accounts use bold, even pinto beans. gifts ag +774|796|O|214484.43|1995-12-04|1-URGENT|Clerk#000000883|0|tealthily even depths +775|1333|F|75392.93|1995-03-18|1-URGENT|Clerk#000000191|0|kly express requests. fluffily silent accounts poach furiously +800|560|O|144932.63|1998-07-14|2-HIGH|Clerk#000000213|0|y alongside of the pending packages? final platelets nag fluffily carefu +801|1178|F|186160.67|1992-02-18|1-URGENT|Clerk#000000186|0|iously from the furiously enticing reques +802|1367|F|192178.48|1995-01-05|1-URGENT|Clerk#000000516|0|posits. ironic, pending requests cajole. even theodol +803|145|O|49471.93|1997-04-29|5-LOW|Clerk#000000260|0|ic instructions. even deposits haggle furiously at the deposits-- regular de +804|500|F|136844.01|1993-03-12|3-MEDIUM|Clerk#000000931|0|s. blithely final foxes are about the packag +805|1261|O|145879.67|1995-07-05|4-NOT SPECIFIED|Clerk#000000856|0|y according to the fluffily +806|1309|O|39072.30|1996-06-20|2-HIGH|Clerk#000000240|0| the ironic packages wake carefully fina +807|1436|F|291066.38|1993-11-24|3-MEDIUM|Clerk#000000012|0|refully special tithes. blithely regular accoun +832|290|F|75549.27|1992-04-19|5-LOW|Clerk#000000495|0|xes. bravely regular packages sleep up the furiously bold accou +833|553|F|53948.73|1994-02-13|3-MEDIUM|Clerk#000000437|0|ts haggle quickly across the slyl +834|428|F|57631.12|1994-05-23|3-MEDIUM|Clerk#000000805|0| sleep. quickly even foxes are boldly. slyly express requests use slyly +835|649|O|79671.35|1995-10-08|4-NOT SPECIFIED|Clerk#000000416|0|s about the carefully special foxes haggle quickly about the +836|688|O|103041.70|1996-11-25|4-NOT SPECIFIED|Clerk#000000729|0|ely bold excuses sleep regular ideas. furiously unusual ideas wake furiou +837|1159|F|99107.47|1994-06-15|4-NOT SPECIFIED|Clerk#000000563|0|kages sleep slyly above the ironic, final orbits +838|164|O|119122.55|1998-01-29|5-LOW|Clerk#000000213|0| slyly around the slyly even +839|280|O|109349.68|1995-08-08|1-URGENT|Clerk#000000951|0|the carefully even platelets. furiously unusual fo +864|1378|O|110290.44|1997-08-17|1-URGENT|Clerk#000000036|0|ly after the slyly regular deposits. express, regular asymptotes nag ca +865|26|F|112126.26|1993-05-04|3-MEDIUM|Clerk#000000337|0|. special packages wake after the carefully final accounts. express pinto be +866|383|F|5793.01|1992-11-28|3-MEDIUM|Clerk#000000718|0|ins after the even, even accounts nod blithel +867|253|F|9271.15|1993-11-16|3-MEDIUM|Clerk#000000877|0|pades nag quickly final, +868|1036|F|157914.01|1992-06-09|4-NOT SPECIFIED|Clerk#000000782|0|onic theodolites print carefully. blithely dogge +869|1348|O|88458.72|1997-01-12|2-HIGH|Clerk#000000245|0|ar sheaves are slowly. slyly even attainments boost theodolites. furiously +870|322|F|60182.94|1993-06-20|4-NOT SPECIFIED|Clerk#000000123|0|blithely ironic ideas nod. sly, r +871|145|O|265450.06|1995-11-15|5-LOW|Clerk#000000882|0|oss the ironic theodolites. +896|17|F|248402.10|1993-03-09|1-URGENT|Clerk#000000187|0|inal packages eat blithely according to the warhorses. furiously quiet de +897|490|P|88281.28|1995-03-20|1-URGENT|Clerk#000000316|0| wake quickly against +898|536|F|159708.26|1993-06-03|2-HIGH|Clerk#000000611|0|. unusual pinto beans haggle quickly across +899|1085|O|165248.53|1998-04-08|5-LOW|Clerk#000000575|0|rts engage carefully final theodolites. +900|460|F|173555.09|1994-10-01|4-NOT SPECIFIED|Clerk#000000060|0| fluffily express deposits nag furiousl +901|113|O|106041.48|1998-07-21|4-NOT SPECIFIED|Clerk#000000929|0|lyly even foxes are furious, silent requests. requests about the quickly +902|86|F|49777.81|1994-07-27|4-NOT SPECIFIED|Clerk#000000811|0|yly final requests over the furiously regula +903|109|O|140726.26|1995-07-07|4-NOT SPECIFIED|Clerk#000000793|0|e slyly about the final pl +928|658|F|315638.02|1995-03-02|5-LOW|Clerk#000000450|0|ithely express pinto beans. +929|827|F|149145.44|1992-10-02|2-HIGH|Clerk#000000160|0|its. furiously even foxes affix carefully finally silent accounts. express req +930|1310|F|285619.42|1994-12-17|1-URGENT|Clerk#000000004|0| accounts nag slyly. ironic, ironic accounts wake blithel +931|1030|F|170066.75|1992-12-07|1-URGENT|Clerk#000000881|0|ss packages haggle furiously express, regular deposits. even, e +932|404|O|57043.21|1997-05-16|2-HIGH|Clerk#000000218|0|ly express instructions boost furiously reg +933|955|F|106503.56|1992-08-05|4-NOT SPECIFIED|Clerk#000000752|0|ial courts wake permanently against the furiously regular ideas. unusual +934|514|O|18262.86|1996-07-03|1-URGENT|Clerk#000000229|0|ts integrate carefully. sly, regular deposits af +935|493|O|131247.01|1997-09-24|5-LOW|Clerk#000000180|0|iously final deposits cajole. blithely even packages +960|347|F|84356.33|1994-09-21|3-MEDIUM|Clerk#000000120|0|regular accounts. requests +961|551|P|248080.06|1995-06-04|4-NOT SPECIFIED|Clerk#000000720|0|ons nag furiously among the quickl +962|353|F|144898.54|1994-05-06|5-LOW|Clerk#000000463|0|ments nag deposits. fluffily ironic a +963|253|F|98613.54|1994-05-26|3-MEDIUM|Clerk#000000497|0|uses haggle carefully. slyly even dependencies after the packages ha +964|752|O|207649.97|1995-05-20|3-MEDIUM|Clerk#000000657|0|print blithely ironic, careful theodolit +965|685|P|44648.62|1995-05-15|5-LOW|Clerk#000000218|0|iously special packages. slyly pending requests are carefully +966|134|O|142557.51|1998-04-30|2-HIGH|Clerk#000000239|0|special deposits. furious +967|1099|F|236000.05|1992-06-21|3-MEDIUM|Clerk#000000167|0|excuses engage quickly bold dep +992|538|O|189842.36|1997-11-11|3-MEDIUM|Clerk#000000875|0|ts. regular pinto beans thrash carefully sl +993|793|O|269632.17|1995-09-10|3-MEDIUM|Clerk#000000894|0|quickly express accounts among the furiously bol +994|13|F|49870.71|1994-04-20|5-LOW|Clerk#000000497|0|ole. slyly bold excuses nag caref +995|1160|P|189854.55|1995-05-31|3-MEDIUM|Clerk#000000439|0|deas. blithely final deposits play. express accounts wake blithely caref +996|710|O|71877.30|1997-12-29|1-URGENT|Clerk#000000497|0|arefully final packages into the slyly final requests affix blit +997|1087|O|39832.61|1997-05-19|2-HIGH|Clerk#000000651|0|ly express depths. furiously final requests haggle furiously. carefu +998|317|F|81009.81|1994-11-26|4-NOT SPECIFIED|Clerk#000000956|0|ronic dolphins. ironic, bold ideas haggle furiously furious +999|602|F|221018.87|1993-09-05|5-LOW|Clerk#000000464|0|pitaphs sleep. regular accounts use. f +1024|35|O|248306.79|1997-12-23|5-LOW|Clerk#000000903|0| blithely. even, express theodolites cajole slyly across +1025|1027|F|112960.50|1995-05-05|2-HIGH|Clerk#000000376|0|ross the slyly final pa +1026|712|O|49485.22|1997-06-04|5-LOW|Clerk#000000223|0|s wake blithely. special acco +1027|1280|F|145806.89|1992-06-03|3-MEDIUM|Clerk#000000241|0|equests cajole. slyly final pinto bean +1028|685|F|190755.43|1994-01-01|2-HIGH|Clerk#000000131|0|ts are. final, silent deposits are among the fl +1029|1288|F|57789.24|1994-06-21|2-HIGH|Clerk#000000700|0|quests sleep. slyly even foxes wake quickly final theodolites. clo +1030|1340|F|26164.34|1994-06-15|5-LOW|Clerk#000000422|0|ully ironic accounts sleep carefully. requests are carefully alongside of the +1031|37|F|203268.37|1994-09-01|3-MEDIUM|Clerk#000000448|0|s; ironic theodolites along the carefully ex +1056|275|F|41838.38|1995-02-11|1-URGENT|Clerk#000000125|0|t, even deposits hang about the slyly special i +1057|760|F|176625.96|1992-02-20|1-URGENT|Clerk#000000124|0|cuses dazzle carefully careful, ironic pinto beans. carefully even theod +1058|530|F|132338.09|1993-04-26|3-MEDIUM|Clerk#000000373|0|kly pending courts haggle. blithely regular sheaves integrate carefully fi +1059|1268|F|291519.65|1994-02-27|1-URGENT|Clerk#000000104|0|en accounts. carefully bold packages cajole daringly special depende +1060|1397|F|155247.64|1993-02-21|3-MEDIUM|Clerk#000000989|0|l platelets sleep quickly slyly special requests. furiously +1061|1027|O|197424.17|1998-05-15|5-LOW|Clerk#000000576|0|uests sleep at the packages. fur +1062|1051|O|48449.37|1997-01-15|1-URGENT|Clerk#000000152|0|eposits use blithely +1063|370|F|76957.40|1994-04-02|2-HIGH|Clerk#000000024|0|deposits nag quickly regular deposits. quickl +1088|1469|F|53063.07|1992-05-21|5-LOW|Clerk#000000347|0|counts are blithely. platelets print. carefully +1089|481|O|140302.14|1996-05-04|4-NOT SPECIFIED|Clerk#000000226|0|ns haggle ruthlessly. even requests are quickly abov +1090|172|O|34290.36|1997-11-15|2-HIGH|Clerk#000000300|0| furiously regular platelets haggle along the slyly unusual foxes! +1091|829|O|48591.79|1996-08-27|1-URGENT|Clerk#000000549|0| even pinto beans haggle quickly alongside of the eve +1092|1232|P|131664.83|1995-03-04|3-MEDIUM|Clerk#000000006|0|re quickly along the blithe +1093|1007|O|124792.59|1997-07-31|4-NOT SPECIFIED|Clerk#000000159|0| after the carefully ironic requests. carefully ironic packages wake fluffil +1094|1438|O|9281.56|1997-12-24|3-MEDIUM|Clerk#000000570|0|beans affix furiously about the pending, even deposits. finally pendi +1095|1433|O|225466.98|1995-08-22|3-MEDIUM|Clerk#000000709|0|sly bold requests cajole carefully according to +1120|1391|O|152580.64|1997-11-07|3-MEDIUM|Clerk#000000319|0|lly special requests. slyly pending platelets are quickly pending requ +1121|281|O|368220.47|1997-01-13|3-MEDIUM|Clerk#000000541|0|r escapades. deposits above the fluffily bold requests hag +1122|1196|O|225660.19|1997-01-10|1-URGENT|Clerk#000000083|0|uffily carefully final theodolites. furiously express packages affix +1123|715|O|115157.87|1996-08-03|3-MEDIUM|Clerk#000000929|0|uriously pending requests. slyly regular instruction +1124|796|O|214762.97|1998-07-30|5-LOW|Clerk#000000326|0|regular pinto beans along the fluffily silent packages +1125|242|F|112869.93|1994-10-27|2-HIGH|Clerk#000000510|0|ithely final requests. i +1126|1433|O|81025.22|1998-01-28|4-NOT SPECIFIED|Clerk#000000928|0|d slyly regular ideas: special ideas believe slyly. slyly ironic sheaves w +1127|575|O|125368.14|1995-09-19|4-NOT SPECIFIED|Clerk#000000397|0|usly silent, regular pinto beans. blithely express requests boos +1152|490|F|78973.34|1994-08-14|4-NOT SPECIFIED|Clerk#000000496|0|equests. deposits ab +1153|1196|O|328207.15|1996-04-18|5-LOW|Clerk#000000059|0| across the pending deposi +1154|352|F|264213.46|1992-02-15|1-URGENT|Clerk#000000268|0|old asymptotes are special requests. blithely even deposits sleep furiously +1155|1498|O|170273.99|1997-10-06|2-HIGH|Clerk#000000164|0|c deposits haggle among the ironic, even requests. carefully ironic sheaves n +1156|1318|O|333319.23|1996-10-19|1-URGENT|Clerk#000000200|0| blithely ironic dolphins. furiously pendi +1157|968|O|136306.85|1998-01-14|4-NOT SPECIFIED|Clerk#000000207|0|out the regular excuses boost carefully against the furio +1158|1414|O|43176.15|1996-06-30|2-HIGH|Clerk#000000549|0|integrate slyly furiously ironic deposit +1159|685|F|68999.67|1992-09-18|3-MEDIUM|Clerk#000000992|0|ts may sleep. requests according to the +1184|886|O|55815.77|1997-10-26|5-LOW|Clerk#000000777|0|iously even packages haggle fluffily care +1185|736|F|68659.75|1992-08-24|5-LOW|Clerk#000000344|0| even escapades are. package +1186|589|O|88428.13|1996-08-15|4-NOT SPECIFIED|Clerk#000000798|0|ingly regular pinto beans: instructi +1187|1337|F|133699.36|1992-11-20|3-MEDIUM|Clerk#000000047|0|s after the furiously final deposits boost slyly under the +1188|199|O|79030.59|1996-04-11|2-HIGH|Clerk#000000256|0|ully ironic deposits. slyl +1189|445|F|90219.24|1994-04-09|1-URGENT|Clerk#000000243|0|f the even accounts. courts print blithely ironic accounts. sile +1190|121|O|54852.43|1997-03-16|5-LOW|Clerk#000000575|0|ccounts above the foxes integrate carefully after the +1191|1103|O|41725.75|1995-11-07|3-MEDIUM|Clerk#000000011|0|uests nag furiously. carefully even requests +1216|1220|F|111175.17|1992-12-07|5-LOW|Clerk#000000918|0|nal foxes around the e +1217|64|F|63714.18|1992-04-26|4-NOT SPECIFIED|Clerk#000000538|0| foxes nag quickly. ironic excuses nod. blithely pending +1218|83|F|157442.11|1994-06-20|4-NOT SPECIFIED|Clerk#000000994|0|s cajole. special, silent deposits about the theo +1219|271|O|11895.23|1995-10-05|3-MEDIUM|Clerk#000000800|0|od carefully. slyly final dependencies across the even fray +1220|485|O|164363.11|1996-08-29|1-URGENT|Clerk#000000712|0|inal theodolites wake. fluffily ironic asymptotes cajol +1221|134|F|164863.12|1992-04-19|4-NOT SPECIFIED|Clerk#000000852|0| detect against the silent, even deposits. carefully ironic +1222|98|F|61432.27|1993-02-05|3-MEDIUM|Clerk#000000811|0|theodolites use quickly even accounts. carefully final asympto +1223|91|O|50645.67|1996-05-25|4-NOT SPECIFIED|Clerk#000000238|0|posits was blithely fr +1248|472|F|295111.15|1992-01-02|1-URGENT|Clerk#000000890|0|t the carefully regular dugouts. s +1249|1498|F|70939.22|1994-01-05|1-URGENT|Clerk#000000095|0|al ideas sleep above the pending pin +1250|359|F|13036.54|1992-09-29|4-NOT SPECIFIED|Clerk#000000652|0|ts after the fluffily pending instructions use slyly about the s +1251|379|O|168646.06|1997-10-30|1-URGENT|Clerk#000000276|0|, brave sauternes. deposits boost fluffily. +1252|1499|O|135540.70|1997-08-04|5-LOW|Clerk#000000348|0|ng the slyly regular excuses. special courts nag furiously blithely e +1253|1145|F|135358.41|1993-01-26|1-URGENT|Clerk#000000775|0| requests sleep furiously even foxes. ruthless packag +1254|698|O|143889.73|1995-12-22|1-URGENT|Clerk#000000607|0| pinto beans. carefully regular request +1255|1217|F|104935.74|1994-05-30|4-NOT SPECIFIED|Clerk#000000798|0|ct slyly regular accounts. quick +1280|956|F|137579.92|1993-01-11|5-LOW|Clerk#000000160|0|posits thrash quickly after the theodolites. furiously iro +1281|611|F|226132.40|1994-12-11|1-URGENT|Clerk#000000430|0|counts. carefully pending accounts eat +1282|1160|F|85558.32|1992-02-29|4-NOT SPECIFIED|Clerk#000000168|0|he quickly special packages. furiously final re +1283|1165|O|296055.80|1996-08-30|4-NOT SPECIFIED|Clerk#000000260|0| pinto beans boost slyly ac +1284|1340|O|147647.95|1996-01-07|2-HIGH|Clerk#000000492|0|s. blithely silent deposits s +1285|104|F|209656.04|1992-06-01|1-URGENT|Clerk#000000423|0|cial deposits cajole after the ironic requests. p +1286|1087|F|308115.46|1993-05-14|4-NOT SPECIFIED|Clerk#000000939|0| deposits use carefully from the excuses. slyly bold p +1287|173|F|181586.61|1994-07-05|2-HIGH|Clerk#000000288|0|ly ironic dolphins integrate furiously among the final packages. st +1312|1111|F|81611.04|1994-05-19|3-MEDIUM|Clerk#000000538|0|n, express accounts across the ironic +1313|1477|F|69234.03|1994-09-13|1-URGENT|Clerk#000000774|0|ld accounts. regular deposits cajole. ironically pending theodolites use car +1314|1424|F|63623.22|1994-05-13|3-MEDIUM|Clerk#000000485|0|ickly blithe packages nod ideas. furiously bold braids boost around the car +1315|215|O|182956.83|1998-03-22|5-LOW|Clerk#000000840|0|final theodolites alongside of the carefu +1316|160|F|232915.54|1993-12-03|1-URGENT|Clerk#000000857|0|ully bold theodolites? pending, bold pin +1317|991|P|170654.55|1995-05-19|2-HIGH|Clerk#000000373|0|sts. furiously special deposits lose fur +1318|1279|O|98170.50|1998-06-27|3-MEDIUM|Clerk#000000581|0|s hang bold requests. pending, re +1319|313|O|46533.50|1996-09-27|2-HIGH|Clerk#000000257|0|y across the ruthlessly ironic accounts. unusu +1344|170|F|66338.64|1992-04-16|5-LOW|Clerk#000000178|0|omise close, silent requests. pending theodolites boost pending +1345|943|F|165361.31|1992-10-28|5-LOW|Clerk#000000447|0| regular tithes. quickly fluffy de +1346|748|F|224106.48|1992-06-18|2-HIGH|Clerk#000000374|0|ges sleep quickly-- even pint +1347|403|O|249530.87|1997-06-20|5-LOW|Clerk#000000977|0|he furiously even foxes use carefully express req +1348|175|O|145456.56|1998-04-18|5-LOW|Clerk#000000206|0|tly. quickly even deposi +1349|637|O|49656.84|1997-10-26|1-URGENT|Clerk#000000543|0|yly! blithely special theodolites cajole. unusual, reg +1350|508|F|71653.64|1993-08-24|1-URGENT|Clerk#000000635|0|iously about the blithely special a +1351|1060|O|23806.26|1998-04-20|1-URGENT|Clerk#000000012|0| cajole. regular, special re +1376|461|O|35617.06|1997-05-04|4-NOT SPECIFIED|Clerk#000000730|0|der furiously final, final frets. carefull +1377|199|O|145303.74|1998-04-24|4-NOT SPECIFIED|Clerk#000000625|0|lly across the blithely express accounts. ironic excuses promise carefully de +1378|196|O|184205.63|1996-03-09|4-NOT SPECIFIED|Clerk#000000705|0| furiously even tithes cajole slyly among the quick +1379|643|O|98253.79|1998-05-25|5-LOW|Clerk#000000861|0|y deposits are caref +1380|1363|O|136526.77|1996-07-07|3-MEDIUM|Clerk#000000969|0|inal deposits wake slyly daringly even requests. bold, even foxe +1381|1264|O|74771.86|1998-05-25|3-MEDIUM|Clerk#000000107|0|even requests breach after the bold, ironic instructions. slyly even +1382|1324|F|246263.02|1993-08-17|5-LOW|Clerk#000000241|0|fully final packages sl +1383|1196|F|53197.34|1993-04-27|2-HIGH|Clerk#000000785|0|ts. express requests sleep blithel +1408|539|O|255424.00|1997-12-26|4-NOT SPECIFIED|Clerk#000000942|0|t the quickly final asymptotes. unusual +1409|1429|F|119571.58|1992-12-31|4-NOT SPECIFIED|Clerk#000000065|0|ructions. furiously unusual excuses are regular, unusual theodolites. fin +1410|1123|O|153160.36|1997-04-12|5-LOW|Clerk#000000123|0|iously along the bravely regular dolphins. pinto beans cajole furiously sp +1411|946|F|222485.73|1994-12-21|2-HIGH|Clerk#000000566|0|s. furiously special excuses across the pending pinto beans haggle sp +1412|529|F|114697.28|1993-03-13|4-NOT SPECIFIED|Clerk#000000083|0|uffily daring theodolit +1413|907|O|111589.54|1997-06-14|3-MEDIUM|Clerk#000000342|0|, ironic instructions. carefully even packages dazzle +1414|763|O|50012.42|1995-08-16|1-URGENT|Clerk#000000883|0|ccounts. ironic foxes haggle car +1415|787|F|32535.28|1994-05-29|4-NOT SPECIFIED|Clerk#000000601|0|rays. blithely final ideas affix quickl +1440|979|O|53447.02|1995-08-10|5-LOW|Clerk#000000956|0| pending requests. closely s +1441|1219|O|243310.98|1997-03-06|4-NOT SPECIFIED|Clerk#000000156|0|ter the excuses. ironic dependencies m +1442|1106|F|8836.99|1994-07-05|4-NOT SPECIFIED|Clerk#000000935|0|nal pinto beans. slyly ironic ideas cajol +1443|439|O|59178.01|1996-12-16|5-LOW|Clerk#000000185|0|x blithely against the carefully final somas. even asymptotes are. quickly spe +1444|1333|F|290512.20|1994-12-06|3-MEDIUM|Clerk#000000783|0|ove the bold accounts cajole fluffily about +1445|1136|F|235888.22|1995-01-10|3-MEDIUM|Clerk#000000211|0|even packages wake fluffily +1446|401|O|46093.69|1998-02-16|5-LOW|Clerk#000000274|0|lly regular notornis above the requests sleep final accounts! +1447|901|F|158371.04|1992-10-15|2-HIGH|Clerk#000000880|0|inly against the blithely pending excuses. regular, pe +1472|1499|O|72730.13|1996-10-06|5-LOW|Clerk#000000303|0|y special dolphins around the final dependencies wake quick +1473|923|O|125427.75|1997-03-17|3-MEDIUM|Clerk#000000960|0|furiously close accoun +1474|691|F|69600.97|1995-01-09|1-URGENT|Clerk#000000438|0|detect quickly above the carefully even +1475|49|O|252931.74|1997-11-12|2-HIGH|Clerk#000000972|0|cally final packages boost. blithely ironic packa +1476|1447|O|24352.78|1996-06-27|2-HIGH|Clerk#000000673|0|ding accounts hinder alongside of the quickly pending requests. fluf +1477|755|O|288752.23|1997-08-24|5-LOW|Clerk#000000612|0|ly bold foxes. final ideas would cajo +1478|499|O|27542.96|1997-08-03|2-HIGH|Clerk#000000827|0|lessly. carefully express +1479|146|O|41710.22|1995-12-16|4-NOT SPECIFIED|Clerk#000000697|0|he furiously even foxes. thinly bold deposits +1504|19|F|125349.58|1992-08-28|3-MEDIUM|Clerk#000000381|0|, brave deposits. bold de +1505|352|F|61594.91|1992-08-21|2-HIGH|Clerk#000000544|0|s. slyly ironic packages cajole. carefully regular packages haggle +1506|1462|F|263170.47|1992-09-21|3-MEDIUM|Clerk#000000620|0| dependencies. accounts affix blithely slowly unusual deposits. slyly regular +1507|1205|F|155226.23|1993-10-14|3-MEDIUM|Clerk#000000305|0|stealthy, ironic de +1508|1013|O|207727.99|1998-04-10|5-LOW|Clerk#000000117|0| after the furiously regular pinto beans hang slyly quickly ironi +1509|625|F|252994.90|1993-07-08|5-LOW|Clerk#000000770|0|the regular ideas. regul +1510|523|O|235151.19|1996-09-17|5-LOW|Clerk#000000128|0|ld carefully. furiously final asymptotes haggle furiously +1511|785|O|103042.07|1996-12-22|4-NOT SPECIFIED|Clerk#000000386|0|ts above the depend +1536|932|O|8717.58|1997-01-26|3-MEDIUM|Clerk#000000117|0|ges are! furiously final deposits cajole iron +1537|1076|F|144582.24|1992-02-15|4-NOT SPECIFIED|Clerk#000000862|0|g to the even deposits. ironic, final packages +1538|290|O|214050.85|1995-06-18|4-NOT SPECIFIED|Clerk#000000258|0| instructions. regular theod +1539|1118|F|67801.22|1995-03-10|5-LOW|Clerk#000000840|0|nstructions boost pa +1540|142|F|191775.25|1992-08-05|2-HIGH|Clerk#000000927|0|r ideas hinder blithe +1541|940|P|72808.67|1995-05-18|1-URGENT|Clerk#000000906|0|y. slyly ironic warhorses around the furiously regul +1542|1427|F|177573.43|1993-09-15|3-MEDIUM|Clerk#000000435|0|t the furiously close deposits do was f +1543|503|O|221716.54|1997-02-20|1-URGENT|Clerk#000000398|0|unts. furiously pend +1568|167|O|108945.79|1997-01-30|4-NOT SPECIFIED|Clerk#000000554|0|d notornis. carefully +1569|1036|O|133309.13|1998-04-02|5-LOW|Clerk#000000786|0|orbits. fluffily even decoys serve blithely. furiously furious realms nag acro +1570|1223|O|58046.02|1998-03-16|1-URGENT|Clerk#000000745|0|pinto beans haggle furiousl +1571|1027|F|194190.45|1992-12-05|2-HIGH|Clerk#000000565|0|ously furiously bold warthogs. slyly ironic instructions are quickly a +1572|104|O|64264.28|1996-02-24|2-HIGH|Clerk#000000994|0|fluffily ironic accounts haggle blithely final platelets! slyly regular foxes +1573|1480|F|127138.20|1992-12-28|2-HIGH|Clerk#000000940|0|ess, ironic deposits use along the carefu +1574|1334|O|255009.95|1996-12-12|3-MEDIUM|Clerk#000000809|0| ideas hinder after the carefully unusual +1575|1447|O|238537.34|1995-09-13|3-MEDIUM|Clerk#000000497|0|. furiously regular dep +1600|926|F|188076.26|1993-03-03|3-MEDIUM|Clerk#000000627|0|tions cajole quietly above the regular, silent requests. slyly fin +1601|524|F|116922.47|1994-08-27|5-LOW|Clerk#000000469|0|ent deposits are ca +1602|10|F|6751.57|1993-08-05|5-LOW|Clerk#000000660|0|deposits. busily silent instructions haggle furiously. fin +1603|13|F|46920.46|1993-07-31|4-NOT SPECIFIED|Clerk#000000869|0|s. slyly silent deposits boo +1604|1123|F|135098.39|1993-07-17|5-LOW|Clerk#000000512|0|lithely silent waters. blithely unusual packages alongside +1605|577|O|190137.68|1998-04-24|4-NOT SPECIFIED|Clerk#000000616|0|sleep furiously? ruthless, even pinto beans +1606|530|O|184091.64|1997-04-17|4-NOT SPECIFIED|Clerk#000000550|0|r requests. quickly even platelets breach before the ironically +1607|1493|O|228124.53|1995-12-16|2-HIGH|Clerk#000000498|0| bold, pending foxes haggle. slyly silent +1632|659|O|272854.60|1997-01-08|3-MEDIUM|Clerk#000000351|0|onic requests are accounts. bold a +1633|143|O|74276.27|1995-10-14|2-HIGH|Clerk#000000666|0|y silent accounts sl +1634|689|O|202866.17|1996-09-10|1-URGENT|Clerk#000000360|0|arefully blithely ironic requests. slyly unusual instructions alongside +1635|38|O|107289.95|1997-02-13|3-MEDIUM|Clerk#000000958|0|s. slyly ironic requests affix slyly +1636|787|O|232036.04|1997-06-17|3-MEDIUM|Clerk#000000457|0|ding requests. slyly ironic courts wake quickl +1637|728|F|264917.81|1995-02-08|4-NOT SPECIFIED|Clerk#000000189|0| final accounts. blithely silent ideas cajole bravely. carefully express +1638|1390|O|222330.55|1997-08-13|2-HIGH|Clerk#000000643|0|he fluffily regular asymp +1639|44|O|155953.46|1995-08-20|4-NOT SPECIFIED|Clerk#000000939|0|haggle furiously. final requests detect furious +1664|640|O|229693.92|1996-03-03|1-URGENT|Clerk#000000090|0|y quickly even asymptotes. furiously regular packages haggle quickly fin +1665|757|F|7215.86|1994-05-08|2-HIGH|Clerk#000000920|0|ly regular packages are fluffily even ideas. fluffily final +1666|941|O|187461.04|1995-10-18|1-URGENT|Clerk#000000849|0|ffily pending dependencies wake fluffily. pending, final accounts +1667|46|O|193695.84|1997-10-10|2-HIGH|Clerk#000000103|0|e accounts. slyly express accounts must are a +1668|1415|O|178694.86|1997-07-12|4-NOT SPECIFIED|Clerk#000000148|0|eodolites. carefully dogged dolphins haggle q +1669|19|O|41922.71|1997-06-09|3-MEDIUM|Clerk#000000663|0|er ironic requests detect furiously blithely sp +1670|245|O|129082.05|1997-05-24|2-HIGH|Clerk#000000320|0|unusual dependencies. furiously special platelets main +1671|343|O|155157.94|1996-07-27|4-NOT SPECIFIED|Clerk#000000275|0|ly. slyly pending requests was above the +1696|35|O|159110.93|1998-01-08|4-NOT SPECIFIED|Clerk#000000041|0|bravely bold accounts above the quickly bold +1697|758|O|173054.70|1996-10-07|1-URGENT|Clerk#000000815|0|o x-ray blithely. pl +1698|395|O|212919.29|1997-04-23|2-HIGH|Clerk#000000432|0|slyly. carefully express deposit +1699|835|F|87704.83|1993-12-30|1-URGENT|Clerk#000000125|0|jole blithely. furiously un +1700|649|O|118049.58|1996-06-15|3-MEDIUM|Clerk#000000328|0|ely final dolphins wake sometimes above the quietly regular deposits. fur +1701|1285|F|97290.23|1992-05-19|2-HIGH|Clerk#000000395|0|furiously. regular, close theodoli +1702|655|P|313394.52|1995-05-07|2-HIGH|Clerk#000000300|0|around the carefully final deposits cajole carefully according to the b +1703|1334|F|151075.27|1993-01-28|3-MEDIUM|Clerk#000000463|0| pinto beans poach. bold courts boost. regular, express deposits at +1728|631|O|181415.94|1996-05-22|2-HIGH|Clerk#000000711|0|beans. slyly regular instructions sleep! slyly final packages +1729|1312|F|16895.97|1992-05-19|2-HIGH|Clerk#000000158|0|pending foxes wake. accounts +1730|1234|O|196574.65|1998-07-24|5-LOW|Clerk#000000794|0| fluffily pending deposits serve. furiously even requests wake furiou +1731|1279|O|274023.72|1996-01-06|1-URGENT|Clerk#000000268|0|lithely regular, final instructions. ironic, express packages are above +1732|1459|F|261007.93|1993-11-29|5-LOW|Clerk#000000903|0|inal requests integrate dolph +1733|1475|O|195828.98|1996-05-12|2-HIGH|Clerk#000000789|0|e carefully according to the accounts. furiously pending instructions sleep +1734|64|F|59250.30|1994-06-11|2-HIGH|Clerk#000000722|0| final ideas haggle. blithely quick foxes sleep busily bold ideas. i +1735|206|F|128698.48|1992-12-27|1-URGENT|Clerk#000000458|0|ully idle requests wake qu +1760|1142|O|122830.52|1996-05-17|5-LOW|Clerk#000000917|0| deposits. busily regular deposits wake blithely along the furiously even re +1761|1049|F|310359.22|1993-12-24|2-HIGH|Clerk#000000817|0|efully slyly bold frets. packages boost b +1762|767|F|293674.75|1994-08-20|4-NOT SPECIFIED|Clerk#000000653|0|ly ironic packages. furi +1763|1205|O|194261.80|1996-10-29|2-HIGH|Clerk#000000321|0|es. bold dependencies haggle furiously along +1764|283|F|68855.70|1992-03-25|1-URGENT|Clerk#000000182|0|. slyly final packages integrate carefully acro +1765|727|O|51928.97|1995-12-03|4-NOT SPECIFIED|Clerk#000000490|0| regular excuses wake slyly +1766|1385|O|67803.59|1996-10-12|2-HIGH|Clerk#000000983|0|unusual deposits affix quickly beyond the carefully s +1767|247|P|184646.16|1995-03-14|2-HIGH|Clerk#000000327|0|eposits use carefully carefully regular platelets. quickly regular packages al +1792|472|F|175299.11|1993-11-09|5-LOW|Clerk#000000102|0|ructions haggle along the pending packages. carefully speci +1793|178|F|106527.58|1992-07-12|4-NOT SPECIFIED|Clerk#000000291|0|regular packages cajole. blithely special packages according to the final d +1794|1396|O|259572.58|1997-09-28|1-URGENT|Clerk#000000686|0|ally silent pinto beans. regular package +1795|928|F|178189.68|1994-03-19|2-HIGH|Clerk#000000815|0| quickly final packages! blithely dogged accounts c +1796|463|F|41893.26|1992-11-21|2-HIGH|Clerk#000000245|0|eans use furiously around th +1797|1243|O|63183.36|1996-05-07|3-MEDIUM|Clerk#000000508|0|quiet platelets haggle since the quickly ironic instructi +1798|517|O|45519.51|1997-07-28|1-URGENT|Clerk#000000741|0|al foxes are blithe +1799|601|F|60595.26|1994-03-07|4-NOT SPECIFIED|Clerk#000000339|0|ns sleep furiously final waters. blithely regular instructions h +1824|482|F|107580.47|1994-05-05|1-URGENT|Clerk#000000972|0|e blithely fluffily +1825|1465|F|203057.19|1993-12-05|3-MEDIUM|Clerk#000000345|0|ironic, final accou +1826|814|F|150931.79|1992-04-16|4-NOT SPECIFIED|Clerk#000000718|0|the even asymptotes dazzle fluffily slyly regular asymptotes. final, unu +1827|1051|O|320537.08|1996-06-22|4-NOT SPECIFIED|Clerk#000000369|0|luffily even requests haggle sly +1828|314|F|193253.78|1994-04-18|3-MEDIUM|Clerk#000000840|0|y quickly bold packag +1829|1114|F|138691.03|1994-05-08|2-HIGH|Clerk#000000537|0| accounts wake above the furiously unusual requests. pending package +1830|1315|F|116412.14|1995-02-23|1-URGENT|Clerk#000000045|0|according to the even, +1831|706|F|83108.48|1993-12-02|1-URGENT|Clerk#000000854|0| accounts. carefully even accounts boost furiously. regular ideas engage. +1856|1045|F|267665.56|1992-03-20|4-NOT SPECIFIED|Clerk#000000952|0|. special pinto beans run acr +1857|1321|F|165861.54|1993-01-13|2-HIGH|Clerk#000000083|0|hely final ideas slee +1858|1423|O|34660.99|1997-12-13|1-URGENT|Clerk#000000389|0|thely. slyly final deposits sleep +1859|598|O|162087.77|1997-04-11|4-NOT SPECIFIED|Clerk#000000949|0| the foxes. bravely special excuses nag carefully special r +1860|97|O|9265.31|1996-04-04|3-MEDIUM|Clerk#000000556|0|osits. quickly bold deposits according to +1861|685|F|113123.65|1994-01-03|3-MEDIUM|Clerk#000000847|0|r the fluffily close sauternes. furio +1862|325|O|123620.54|1998-02-24|5-LOW|Clerk#000000348|0|ts snooze ironically abou +1863|731|F|142539.37|1993-09-23|4-NOT SPECIFIED|Clerk#000000658|0|old sentiments. careful, +1888|1192|F|360144.81|1993-10-31|4-NOT SPECIFIED|Clerk#000000659|0|olites. pinto beans cajole. regular deposits affix. slyly regular +1889|244|O|128067.39|1997-03-16|1-URGENT|Clerk#000000854|0|p around the regular notornis. unusual deposits +1890|95|O|297716.58|1996-12-18|4-NOT SPECIFIED|Clerk#000000627|0|romise final, regular deposits. regular fox +1891|610|F|128912.17|1994-12-15|5-LOW|Clerk#000000495|0|unusual foxes sleep regular deposits. requests wake special pac +1892|235|F|165541.41|1994-03-26|5-LOW|Clerk#000000733|0|sts. slyly regular dependencies use slyly. ironic, spec +1893|1244|O|169481.16|1997-10-30|2-HIGH|Clerk#000000111|0|olites. silent, special deposits eat slyly quickly express packages; hockey p +1894|751|F|65789.57|1992-03-30|1-URGENT|Clerk#000000626|0|e furiously. furiously even accounts are slyly final accounts. closely speci +1895|67|F|62954.37|1994-05-30|3-MEDIUM|Clerk#000000878|0|ress accounts. bold accounts cajole. slyly final pinto beans poach regul +1920|1096|O|195949.19|1998-06-24|5-LOW|Clerk#000000018|0|hely; furiously regular excuses +1921|862|F|82692.09|1994-01-18|3-MEDIUM|Clerk#000000293|0|counts. slyly quiet requests along the ruthlessly regular accounts are +1922|556|O|12696.20|1996-07-13|3-MEDIUM|Clerk#000000984|0|side of the blithely final re +1923|1345|O|262475.36|1997-07-07|1-URGENT|Clerk#000000471|0| express dolphins. +1924|748|O|235357.72|1996-09-07|4-NOT SPECIFIED|Clerk#000000823|0| of the ironic accounts. instructions near the final instr +1925|167|F|192587.39|1992-03-05|1-URGENT|Clerk#000000986|0|e slyly regular deposits. furiously +1926|931|O|132894.56|1996-01-31|2-HIGH|Clerk#000000568|0|cajole. even warhorses sleep carefully. +1927|1399|O|38474.28|1995-09-30|3-MEDIUM|Clerk#000000616|0|riously special packages. permanent pearls wake furiously. even packages alo +1952|662|F|17837.86|1994-03-16|2-HIGH|Clerk#000000254|0| silent accounts boost +1953|1495|F|65277.06|1993-11-30|3-MEDIUM|Clerk#000000891|0| fluffily along the quickly even packages. +1954|559|O|244793.78|1997-05-31|4-NOT SPECIFIED|Clerk#000000104|0| unusual excuses cajole according to the blithely regular theodolites. +1955|121|F|132951.01|1992-04-20|1-URGENT|Clerk#000000792|0|ly special ideas. sometimes final +1956|1258|F|109978.44|1992-09-20|4-NOT SPECIFIED|Clerk#000000600|0|ironic ideas are silent ideas. furiously final deposits sleep slyly carefu +1957|302|O|113050.82|1998-07-21|2-HIGH|Clerk#000000639|0|nding excuses about the +1958|523|O|240252.23|1995-09-22|5-LOW|Clerk#000000343|0| haggle blithely. flu +1959|424|O|86342.43|1997-01-13|4-NOT SPECIFIED|Clerk#000000631|0| cajole about the blithely express requests. even excuses mold bl +1984|508|O|123878.05|1998-04-01|1-URGENT|Clerk#000000416|0| slyly special instructions. unusual foxes use packages. carefully regular req +1985|59|F|220942.19|1994-09-02|4-NOT SPECIFIED|Clerk#000000741|0|slyly slyly even pains. slyly reg +1986|1486|F|51251.50|1994-05-05|2-HIGH|Clerk#000000609|0|across the theodolites. quick +1987|982|F|7351.41|1994-04-30|2-HIGH|Clerk#000000652|0|gular platelets alongside +1988|1075|O|189572.71|1995-10-06|4-NOT SPECIFIED|Clerk#000000011|0|ly ironic dolphins serve quickly busy accounts. bu +1989|1162|F|43106.73|1994-03-16|4-NOT SPECIFIED|Clerk#000000747|0|ely bold pinto beans ha +1990|1181|F|44391.50|1994-12-16|2-HIGH|Clerk#000000114|0|e bold patterns. always regul +1991|187|F|191273.88|1992-09-07|4-NOT SPECIFIED|Clerk#000000854|0|ing accounts can haggle at the carefully final Tiresias-- pending, regular +2016|76|O|34243.46|1996-08-16|3-MEDIUM|Clerk#000000641|0|the carefully ironic foxes. requests nag bold, r +2017|1006|O|83524.96|1998-05-13|3-MEDIUM|Clerk#000000427|0|nusual requests. blit +2018|176|P|29982.40|1995-04-05|4-NOT SPECIFIED|Clerk#000000920|0|gular accounts wake fur +2019|1342|F|52971.22|1992-10-23|1-URGENT|Clerk#000000565|0| furiously bold packages. fluffily fi +2020|725|F|190262.97|1993-06-21|3-MEDIUM|Clerk#000000192|0|es. furiously regular packages above the furiously special theodolites are a +2021|700|O|41487.67|1995-07-15|1-URGENT|Clerk#000000155|0|ong the furiously regular requests. unusual deposits wake fluffily inside +2022|619|F|319320.43|1992-03-15|1-URGENT|Clerk#000000268|0| dependencies sleep fluffily even, ironic deposits. express, silen +2023|1180|F|181994.65|1992-05-06|5-LOW|Clerk#000000137|0|ular courts engage according to the +2048|169|F|43446.23|1993-11-15|1-URGENT|Clerk#000000934|0|s cajole after the blithely final accounts. f +2049|298|O|206620.70|1995-12-07|2-HIGH|Clerk#000000859|0|ly regular requests thrash blithely about the fluffily even theodolites. r +2050|274|F|289457.13|1994-06-02|4-NOT SPECIFIED|Clerk#000000821|0|d accounts against the furiously regular packages use bli +2051|382|O|104971.81|1996-03-18|4-NOT SPECIFIED|Clerk#000000333|0|ctions sleep blithely. blithely regu +2052|895|F|223352.03|1992-04-13|2-HIGH|Clerk#000000767|0| requests sleep around the even, even courts. ironic theodolites affix furious +2053|1406|F|162584.35|1995-02-07|1-URGENT|Clerk#000000717|0|ar requests: blithely sly accounts boost carefully across t +2054|401|F|162781.21|1992-06-08|4-NOT SPECIFIED|Clerk#000000103|0|l requests affix carefully about the furiously special +2055|970|F|70155.57|1993-09-04|1-URGENT|Clerk#000000067|0|. warhorses affix slyly blithely express instructions? fur +2080|946|F|75292.75|1993-06-18|5-LOW|Clerk#000000190|0|ironic, pending theodolites are carefully about the quickly regular theodolite +2081|1193|O|202626.98|1997-07-05|2-HIGH|Clerk#000000136|0|ong the regular theo +2082|487|F|70224.72|1995-01-10|2-HIGH|Clerk#000000354|0|cial accounts. ironic, express dolphins nod slyly sometimes final reques +2083|1009|F|39235.65|1993-07-14|3-MEDIUM|Clerk#000000361|0|al patterns. bold, final foxes nag bravely about the furiously express +2084|800|F|277607.01|1993-03-17|2-HIGH|Clerk#000000048|0|zle furiously final, careful packages. slyly ironic ideas amo +2085|488|F|62710.56|1993-11-21|3-MEDIUM|Clerk#000000818|0|ress, express ideas haggle +2086|1405|F|259355.86|1994-10-19|1-URGENT|Clerk#000000046|0| permanently regular +2087|493|O|79220.54|1998-01-31|2-HIGH|Clerk#000000626|0|e always regular packages nod against the furiously spec +2112|634|O|29666.67|1997-02-05|2-HIGH|Clerk#000000351|0|against the slyly even id +2113|319|O|70044.40|1997-11-08|2-HIGH|Clerk#000000527|0|slyly regular instruct +2114|787|F|159876.50|1995-01-16|5-LOW|Clerk#000000751|0|r, unusual accounts haggle across the busy platelets. carefully +2115|1042|O|213137.77|1998-05-23|4-NOT SPECIFIED|Clerk#000000101|0|odolites boost. carefully regular excuses cajole. quickly ironic pinto be +2116|223|F|79971.53|1994-08-26|1-URGENT|Clerk#000000197|0|efully after the asymptotes. furiously sp +2117|220|O|215355.06|1997-04-26|2-HIGH|Clerk#000000887|0|ely even dependencies. regular foxes use blithely. +2118|1333|O|54388.61|1996-10-09|1-URGENT|Clerk#000000196|0|ial requests wake carefully special packages. f +2119|622|O|31760.98|1996-08-20|2-HIGH|Clerk#000000434|0|uickly pending escapades. fluffily ir +2144|1348|F|176382.12|1994-03-29|3-MEDIUM|Clerk#000000546|0|t. carefully quick requests across the deposits wake regu +2145|1336|F|30239.30|1992-10-03|1-URGENT|Clerk#000000886|0|sts would snooze blithely alongside of th +2146|1177|F|254476.65|1992-09-14|4-NOT SPECIFIED|Clerk#000000476|0|ven packages. dependencies wake slyl +2147|988|F|117795.98|1992-09-06|4-NOT SPECIFIED|Clerk#000000424|0| haggle carefully furiously final foxes. pending escapades thrash. bold theod +2148|1283|F|20481.54|1995-04-19|4-NOT SPECIFIED|Clerk#000000517|0|ross the furiously unusual theodolites. always expre +2149|1007|F|151151.22|1993-03-13|5-LOW|Clerk#000000555|0|nusual accounts nag furiously special reques +2150|817|F|230677.37|1994-06-03|3-MEDIUM|Clerk#000000154|0|ect slyly against the even, final packages. quickly regular pinto beans wake c +2151|580|O|166259.86|1996-11-11|3-MEDIUM|Clerk#000000996|0|c requests. ironic platelets cajole across the quickly fluffy deposits. +2176|1036|F|140007.98|1992-11-10|1-URGENT|Clerk#000000195|0|s haggle regularly accor +2177|1351|O|254199.26|1997-01-20|3-MEDIUM|Clerk#000000161|0|ove the blithely unusual packages cajole carefully fluffily special request +2178|80|O|92942.00|1996-12-12|3-MEDIUM|Clerk#000000656|0|thely according to the instructions. furious +2179|410|O|86553.77|1996-09-07|2-HIGH|Clerk#000000935|0|ounts alongside of the furiously unusual braids cajol +2180|751|O|287379.99|1996-09-14|4-NOT SPECIFIED|Clerk#000000650|0|xpress, unusual pains. furiously ironic excu +2181|742|O|174000.86|1995-09-13|3-MEDIUM|Clerk#000000814|0|y against the ironic, even +2182|226|F|174578.47|1994-04-05|2-HIGH|Clerk#000000071|0|ccounts. quickly bold deposits across the excuses sl +2183|1121|O|78568.93|1996-06-22|1-URGENT|Clerk#000000287|0| among the express, ironic packages. slyly ironic platelets integrat +2208|676|P|346978.53|1995-05-01|4-NOT SPECIFIED|Clerk#000000900|0|symptotes wake slyly blithely unusual packages. +2209|892|F|173318.78|1992-07-10|2-HIGH|Clerk#000000056|0|er above the slyly silent requests. furiously reg +2210|319|F|54392.14|1992-01-16|2-HIGH|Clerk#000000941|0| believe carefully quickly express pinto beans. deposi +2211|920|F|204877.13|1994-06-30|2-HIGH|Clerk#000000464|0|ffily bold courts e +2212|1163|F|28563.15|1994-03-23|3-MEDIUM|Clerk#000000954|0|structions above the unusual requests use fur +2213|1213|F|204541.38|1993-01-15|4-NOT SPECIFIED|Clerk#000000598|0|osits are carefully reg +2214|1141|O|224136.38|1998-05-05|3-MEDIUM|Clerk#000000253|0|packages. fluffily even accounts haggle blithely. carefully ironic depen +2215|388|O|159169.89|1996-06-16|4-NOT SPECIFIED|Clerk#000000817|0|le final, final foxes. quickly regular gifts are carefully deposit +2240|554|F|265020.95|1992-03-06|4-NOT SPECIFIED|Clerk#000000622|0|accounts against the slyly express foxes are after the slyly regular +2241|1013|F|248564.48|1993-05-11|1-URGENT|Clerk#000000081|0|y about the silent excuses. furiously ironic instructions along the sil +2242|815|O|16543.76|1997-07-20|4-NOT SPECIFIED|Clerk#000000360|0| pending multipliers. carefully express asymptotes use quickl +2243|479|O|11918.84|1995-06-10|2-HIGH|Clerk#000000813|0|ously regular deposits integrate s +2244|1268|F|34877.52|1993-01-09|1-URGENT|Clerk#000001000|0|ckages. ironic, ironic accounts haggle blithely express excuses. +2245|565|F|257990.42|1993-04-28|3-MEDIUM|Clerk#000000528|0|ake carefully. braids haggle slyly quickly b +2246|1124|O|100351.39|1996-05-27|4-NOT SPECIFIED|Clerk#000000739|0| final gifts sleep +2247|947|F|20406.41|1992-08-02|4-NOT SPECIFIED|Clerk#000000947|0|furiously regular packages. final brai +2272|1384|F|186159.70|1993-04-13|2-HIGH|Clerk#000000449|0|s. bold, ironic pinto beans wake. silently specia +2273|1343|O|223151.74|1996-12-14|5-LOW|Clerk#000000155|0|uickly express foxes haggle quickly against +2274|1040|F|62910.69|1993-09-04|4-NOT SPECIFIED|Clerk#000000258|0|nstructions try to hag +2275|1484|F|54526.45|1992-10-22|4-NOT SPECIFIED|Clerk#000000206|0| furiously furious platelets. slyly final packa +2276|415|O|177003.87|1996-04-29|4-NOT SPECIFIED|Clerk#000000821|0|ecial requests. fox +2277|889|F|104747.35|1995-01-02|4-NOT SPECIFIED|Clerk#000000385|0|accounts cajole. even i +2278|1406|O|154671.54|1998-04-25|3-MEDIUM|Clerk#000000186|0|r pinto beans integrate after the carefully even deposits. blit +2279|794|F|187322.08|1993-02-23|3-MEDIUM|Clerk#000000898|0|de of the quickly unusual instructio +2304|451|F|136763.46|1994-01-07|4-NOT SPECIFIED|Clerk#000000415|0|onic platelets. ironic packages haggle. packages nag doggedly according to +2305|421|F|154302.46|1993-01-26|2-HIGH|Clerk#000000440|0|ove the furiously even acco +2306|268|O|341859.20|1995-07-26|2-HIGH|Clerk#000000975|0| wake furiously requests. permanent requests affix. final packages caj +2307|1042|F|79156.35|1993-06-29|5-LOW|Clerk#000000952|0|furiously even asymptotes? carefully regular accounts +2308|239|F|78112.08|1992-10-25|4-NOT SPECIFIED|Clerk#000000609|0|ts. slyly final depo +2309|997|O|194143.51|1995-09-04|5-LOW|Clerk#000000803|0|he carefully pending packages. fluffily stealthy foxes engage carefully +2310|304|O|121341.69|1996-09-20|5-LOW|Clerk#000000917|0|wake carefully. unusual instructions nag ironic, regular excuse +2311|718|P|208795.07|1995-05-02|2-HIGH|Clerk#000000761|0|ly pending asymptotes-- furiously bold excus +2336|1414|O|37197.01|1996-01-07|4-NOT SPECIFIED|Clerk#000000902|0|c, final excuses sleep furiously among the even theodolites. f +2337|1402|O|65214.59|1997-06-18|4-NOT SPECIFIED|Clerk#000000754|0| quickly. final accounts haggle. carefully final acco +2338|1394|O|41743.98|1997-09-15|2-HIGH|Clerk#000000951|0|riously final dugouts. final, ironic packages wake express, ironic id +2339|1084|F|87620.47|1993-12-15|5-LOW|Clerk#000000847|0| against the regular +2340|646|O|47690.57|1996-01-12|1-URGENT|Clerk#000000964|0|ter the deposits sleep according to the slyly regular packages. carefully +2341|817|F|90460.36|1993-05-30|5-LOW|Clerk#000000443|0|sts-- blithely bold dolphins through the deposits nag blithely carefully re +2342|365|O|139380.41|1996-06-09|1-URGENT|Clerk#000000615|0|oost carefully across the regular accounts. blithely final d +2343|712|O|119571.52|1995-08-21|3-MEDIUM|Clerk#000000170|0|fluffily over the slyly special deposits. quickl +2368|130|F|130017.09|1993-08-20|1-URGENT|Clerk#000000830|0|t the bold instructions. carefully unusual +2369|1097|O|102225.66|1996-12-24|2-HIGH|Clerk#000000752|0|iously even requests are dogged, express +2370|1405|F|93340.00|1994-01-17|1-URGENT|Clerk#000000231|0|lyly final packages. quickly final deposits haggl +2371|187|O|278700.24|1998-01-07|1-URGENT|Clerk#000000028|0|ckages haggle at th +2372|292|O|145396.99|1997-11-21|5-LOW|Clerk#000000342|0|s: deposits haggle along the final ideas. careful +2373|263|F|79116.08|1994-03-12|4-NOT SPECIFIED|Clerk#000000306|0| even, special courts grow quickly. pending, +2374|40|F|148382.76|1993-10-29|4-NOT SPECIFIED|Clerk#000000081|0| blithely regular packages. blithely unusua +2375|49|O|159126.15|1996-11-20|3-MEDIUM|Clerk#000000197|0|unusual, pending theodolites cajole carefully +2400|364|O|104781.57|1998-07-25|5-LOW|Clerk#000000782|0|nusual courts nag against the carefully unusual pinto b +2401|1477|O|115018.83|1997-07-29|4-NOT SPECIFIED|Clerk#000000531|0|ully unusual instructions boost carefully silently regular requests. +2402|658|O|114097.88|1996-09-06|4-NOT SPECIFIED|Clerk#000000162|0|slyly final sheaves sleep slyly. q +2403|544|O|171679.55|1998-04-11|3-MEDIUM|Clerk#000000820|0|furiously regular deposits use. furiously unusual accounts wake along the +2404|767|O|136444.96|1997-03-13|4-NOT SPECIFIED|Clerk#000000409|0|deposits breach furiously. ironic foxes haggle carefully bold packag +2405|713|O|157476.73|1996-12-23|3-MEDIUM|Clerk#000000535|0|ular, regular asympto +2406|67|O|267248.11|1996-10-28|5-LOW|Clerk#000000561|0|blithely regular accounts u +2407|536|O|165349.80|1998-06-19|2-HIGH|Clerk#000000068|0|uests affix slyly among the slyly regular depos +2432|1021|O|80711.22|1996-07-13|1-URGENT|Clerk#000000115|0|re. slyly even deposits wake bra +2433|299|F|200835.08|1994-08-22|4-NOT SPECIFIED|Clerk#000000324|0|ess patterns are slyly. packages haggle carefu +2434|238|O|160941.81|1997-04-27|3-MEDIUM|Clerk#000000190|0|s. quickly ironic dolphins impress final deposits. blithel +2435|715|F|165964.31|1993-02-21|5-LOW|Clerk#000000112|0|es are carefully along the carefully final instructions. pe +2436|1250|O|95969.65|1995-09-11|4-NOT SPECIFIED|Clerk#000000549|0|arefully. blithely bold deposits affix special accounts. final foxes nag. spe +2437|844|F|207060.97|1993-04-21|4-NOT SPECIFIED|Clerk#000000578|0|. theodolites wake slyly-- ironic, pending platelets above the carefully exp +2438|127|F|308209.95|1993-07-15|2-HIGH|Clerk#000000744|0|the final, regular warhorses. regularly +2439|541|O|68090.09|1997-03-15|2-HIGH|Clerk#000000819|0|lithely after the car +2464|1450|O|32741.64|1997-11-23|5-LOW|Clerk#000000633|0|le about the instructions. courts wake carefully even +2465|325|O|253098.40|1995-06-24|1-URGENT|Clerk#000000078|0|al pinto beans. final, bold packages wake quickly +2466|181|F|221482.78|1994-03-06|1-URGENT|Clerk#000000424|0|c pinto beans. express deposits wake quickly. even, final courts nag. package +2467|343|O|8612.24|1995-07-16|4-NOT SPECIFIED|Clerk#000000914|0|pades sleep furiously. sometimes regular packages again +2468|1109|O|253685.87|1997-06-09|4-NOT SPECIFIED|Clerk#000000260|0|ickly regular packages. slyly ruthless requests snooze quickly blithe +2469|1229|O|230050.24|1996-11-26|5-LOW|Clerk#000000730|0| sleep closely regular instructions. furiously ironic instructi +2470|563|O|119774.66|1997-04-19|3-MEDIUM|Clerk#000000452|0|to the furiously final packages? pa +2471|884|O|61766.57|1998-03-12|4-NOT SPECIFIED|Clerk#000000860|0|carefully blithely regular pac +2496|1342|F|188456.20|1994-01-09|2-HIGH|Clerk#000000142|0|slyly. pending instructions sleep. quic +2497|470|F|236003.51|1992-08-27|1-URGENT|Clerk#000000977|0|ily ironic pinto beans. furiously final platelets alongside of t +2498|959|F|57787.08|1993-11-08|5-LOW|Clerk#000000373|0|g the slyly special pinto beans. +2499|1210|O|194133.93|1995-09-24|1-URGENT|Clerk#000000277|0|r the quickly bold foxes. bold instructi +2500|1330|F|210458.54|1992-08-15|2-HIGH|Clerk#000000447|0|integrate slyly pending deposits. furiously ironic accounts across the s +2501|665|O|105442.80|1997-05-25|5-LOW|Clerk#000000144|0|ickly special theodolite +2502|694|F|47966.60|1993-05-28|4-NOT SPECIFIED|Clerk#000000914|0|lyly: carefully pending ideas affix again +2503|67|F|250884.59|1993-06-20|3-MEDIUM|Clerk#000000294|0|ly even packages was. ironic, regular deposits unwind furiously across the p +2528|550|F|140496.46|1994-11-20|1-URGENT|Clerk#000000789|0|ular dependencies? regular frays kindle according to the blith +2529|1349|O|4809.51|1996-08-20|2-HIGH|Clerk#000000511|0|posits across the silent instructions wake blithely across +2530|1271|F|96402.94|1994-03-21|3-MEDIUM|Clerk#000000291|0|ular instructions about the quic +2531|434|O|214816.43|1996-05-06|4-NOT SPECIFIED|Clerk#000000095|0|even accounts. furiously ironic excuses sleep fluffily. carefully silen +2532|937|O|173714.44|1995-10-11|2-HIGH|Clerk#000000498|0|the blithely pending accounts. regular, regular excuses boost aro +2533|496|O|248797.75|1997-03-24|1-URGENT|Clerk#000000594|0|ecial instructions. spec +2534|754|O|265775.52|1996-07-17|3-MEDIUM|Clerk#000000332|0|packages cajole ironic requests. furiously regular +2535|1202|F|99020.66|1993-05-25|5-LOW|Clerk#000000296|0|phins cajole beneath the fluffily express asymptotes. c +2560|1309|F|213993.64|1992-09-05|1-URGENT|Clerk#000000538|0|atelets; quickly sly requests +2561|572|O|180170.50|1997-11-14|1-URGENT|Clerk#000000861|0|ual requests. unusual deposits cajole furiously pending, regular platelets. +2562|82|F|196430.96|1992-08-01|1-URGENT|Clerk#000000467|0|elets. pending dolphins promise slyly. bo +2563|613|F|237151.86|1993-11-19|4-NOT SPECIFIED|Clerk#000000150|0|sly even packages after the furio +2564|761|F|3975.31|1994-09-09|2-HIGH|Clerk#000000718|0|usly regular pinto beans. orbits wake carefully. slyly e +2565|554|O|269678.73|1998-02-28|3-MEDIUM|Clerk#000000032|0|x-ray blithely along +2566|856|F|127226.57|1992-10-10|3-MEDIUM|Clerk#000000414|0|ructions boost bold ideas. idly ironic accounts use according to th +2567|694|O|366949.49|1998-02-27|2-HIGH|Clerk#000000031|0|detect. furiously ironic requests +2592|1006|F|14583.53|1993-03-05|4-NOT SPECIFIED|Clerk#000000524|0|ts nag fluffily. quickly stealthy theodolite +2593|913|F|184358.17|1993-09-04|2-HIGH|Clerk#000000468|0|r the carefully final +2594|776|F|118325.94|1992-12-17|1-URGENT|Clerk#000000550|0|ests. theodolites above the blithely even accounts detect furio +2595|737|O|278418.04|1995-12-14|4-NOT SPECIFIED|Clerk#000000222|0|arefully ironic requests nag carefully ideas. +2596|424|O|93640.14|1996-08-17|1-URGENT|Clerk#000000242|0|requests. ironic, bold theodolites wak +2597|1036|F|38810.68|1993-02-04|2-HIGH|Clerk#000000757|0|iously ruthless exc +2598|1120|O|100794.85|1996-03-05|3-MEDIUM|Clerk#000000391|0| ironic notornis according to the blithely final requests should +2599|1483|O|95783.25|1996-11-07|2-HIGH|Clerk#000000722|0|ts. slyly regular theodolites wake sil +2624|512|O|43715.51|1996-11-28|5-LOW|Clerk#000000930|0|ic, regular packages +2625|382|F|46838.33|1992-10-14|4-NOT SPECIFIED|Clerk#000000386|0| final deposits. blithely ironic ideas +2626|1372|O|109208.97|1995-09-08|4-NOT SPECIFIED|Clerk#000000289|0|gside of the carefully special packages are furiously after the slyly express +2627|1486|F|31377.24|1992-03-24|3-MEDIUM|Clerk#000000181|0|s. silent, ruthless requests +2628|553|F|243890.34|1993-10-22|5-LOW|Clerk#000000836|0|ajole across the blithely careful accounts. blithely silent deposits sl +2629|1372|O|124187.64|1998-04-06|5-LOW|Clerk#000000680|0|uches dazzle carefully even, express excuses. ac +2630|841|F|180224.30|1992-10-24|5-LOW|Clerk#000000712|0|inal theodolites. ironic instructions s +2631|352|F|70543.30|1993-09-24|5-LOW|Clerk#000000833|0| quickly unusual deposits doubt around +2656|766|F|119993.15|1993-05-04|1-URGENT|Clerk#000000307|0|elets. slyly final accou +2657|247|O|231309.69|1995-10-17|2-HIGH|Clerk#000000160|0| foxes-- slyly final dependencies around the slyly final theodo +2658|134|O|208449.54|1995-09-23|3-MEDIUM|Clerk#000000400|0|bout the slyly regular accounts. ironic, +2659|821|F|103595.36|1993-12-18|4-NOT SPECIFIED|Clerk#000000758|0|cross the pending requests maintain +2660|1264|O|24605.68|1995-08-05|5-LOW|Clerk#000000480|0|ly finally regular deposits. ironic theodolites cajole +2661|739|O|138682.43|1997-01-04|3-MEDIUM|Clerk#000000217|0|al, regular pinto beans. silently final deposits should have t +2662|370|O|94638.61|1996-08-21|3-MEDIUM|Clerk#000000589|0|bold pinto beans above the slyly final accounts affix furiously deposits. pac +2663|941|O|35825.35|1995-09-06|1-URGENT|Clerk#000000950|0|ar requests. furiously final dolphins along the fluffily spe +2688|974|F|244642.45|1992-01-24|2-HIGH|Clerk#000000720|0|have to nag according to the pending theodolites. sly +2689|1015|F|43940.00|1992-04-09|4-NOT SPECIFIED|Clerk#000000698|0|press pains wake. furiously express theodolites alongsid +2690|935|O|325313.14|1996-03-31|3-MEDIUM|Clerk#000000760|0|ravely even theodolites +2691|59|F|47515.61|1992-04-30|5-LOW|Clerk#000000439|0|es at the regular deposits sleep slyly by the fluffy requests. eve +2692|619|O|25165.18|1997-12-02|3-MEDIUM|Clerk#000000878|0|es. regular asymptotes cajole above t +2693|172|O|64546.06|1996-09-04|1-URGENT|Clerk#000000370|0|ndle never. blithely regular packages nag carefully enticing platelets. ca +2694|1192|O|132476.42|1996-03-14|5-LOW|Clerk#000000722|0| requests. bold deposits above the theodol +2695|563|O|204229.27|1996-08-20|1-URGENT|Clerk#000000697|0|ven deposits around the quickly regular packa +2720|301|F|173898.68|1993-06-08|1-URGENT|Clerk#000000948|0|quickly. special asymptotes are fluffily ironi +2721|773|O|93291.10|1996-01-27|2-HIGH|Clerk#000000401|0| ideas eat even, unusual ideas. theodolites are carefully +2722|347|F|62122.98|1994-04-09|5-LOW|Clerk#000000638|0|rding to the carefully quick deposits. bli +2723|592|O|128721.12|1995-10-06|5-LOW|Clerk#000000836|0|nts must have to cajo +2724|1369|F|178028.99|1994-09-14|2-HIGH|Clerk#000000217|0| sleep blithely. blithely idle +2725|884|F|88263.14|1994-05-21|4-NOT SPECIFIED|Clerk#000000835|0|ular deposits. spec +2726|58|F|48071.00|1992-11-27|5-LOW|Clerk#000000470|0| blithely even dinos sleep care +2727|739|O|4148.56|1998-04-19|4-NOT SPECIFIED|Clerk#000000879|0|sual theodolites cajole enticingly above the furiously fin +2752|581|F|252581.73|1993-11-19|2-HIGH|Clerk#000000648|0| carefully regular foxes are quickly quickl +2753|154|F|228723.78|1993-11-30|2-HIGH|Clerk#000000380|0|ending instructions. unusual deposits +2754|1438|F|39260.31|1994-04-03|2-HIGH|Clerk#000000960|0|cies detect slyly. +2755|1177|F|131857.47|1992-02-07|4-NOT SPECIFIED|Clerk#000000177|0|ously according to the sly foxes. blithely regular pinto bean +2756|1166|F|194478.82|1994-04-18|1-URGENT|Clerk#000000537|0|arefully special warho +2757|755|O|125256.68|1995-07-20|2-HIGH|Clerk#000000216|0| regular requests subl +2758|412|O|42052.59|1998-07-12|5-LOW|Clerk#000000863|0|s cajole according to the carefully special +2759|1159|F|101861.98|1993-11-25|4-NOT SPECIFIED|Clerk#000000071|0|ts. regular, pending pinto beans sleep ab +2784|943|O|153115.55|1998-01-07|1-URGENT|Clerk#000000540|0|g deposits alongside of the silent requests s +2785|1462|O|195472.29|1995-07-21|2-HIGH|Clerk#000000098|0|iously pending packages sleep according to the blithely unusual foxe +2786|788|F|247891.00|1992-03-22|2-HIGH|Clerk#000000976|0|al platelets cajole blithely ironic requests. ironic re +2787|1030|O|4893.42|1995-09-30|1-URGENT|Clerk#000000906|0|he ironic, regular +2788|1234|F|26524.32|1994-09-22|1-URGENT|Clerk#000000641|0|nts wake across the fluffily bold accoun +2789|361|O|291634.33|1998-03-14|2-HIGH|Clerk#000000972|0|gular patterns boost. carefully even re +2790|250|F|239747.97|1994-08-19|2-HIGH|Clerk#000000679|0| the carefully express deposits sleep slyly +2791|1207|F|212540.36|1994-10-10|2-HIGH|Clerk#000000662|0|as. slyly ironic accounts play furiously bl +2816|568|F|62180.16|1994-09-20|2-HIGH|Clerk#000000289|0|kages at the final deposits cajole furious foxes. quickly +2817|397|F|107437.21|1994-04-19|3-MEDIUM|Clerk#000000982|0|ic foxes haggle upon the daringly even pinto beans. slyly +2818|482|F|166324.37|1994-12-12|3-MEDIUM|Clerk#000000413|0|eep furiously special ideas. express +2819|1019|F|92864.28|1994-05-05|1-URGENT|Clerk#000000769|0|ngside of the blithely ironic dolphins. furio +2820|181|F|202441.88|1994-05-20|3-MEDIUM|Clerk#000000807|0|equests are furiously. carefu +2821|1166|F|54252.30|1993-08-09|3-MEDIUM|Clerk#000000323|0|ng requests. even instructions are quickly express, silent instructi +2822|788|F|53827.11|1993-07-26|2-HIGH|Clerk#000000510|0|furiously against the accounts. unusual accounts aft +2823|781|O|261004.83|1995-09-09|2-HIGH|Clerk#000000567|0|encies. carefully fluffy accounts m +2848|689|F|165694.90|1992-03-10|1-URGENT|Clerk#000000256|0|ly fluffy foxes sleep furiously across the slyly regu +2849|455|O|272713.22|1996-04-30|2-HIGH|Clerk#000000659|0|al packages are after the quickly bold requests. carefully special +2850|992|O|161737.06|1996-10-02|2-HIGH|Clerk#000000392|0|, regular deposits. furiously pending packages hinder carefully carefully u +2851|1445|O|10321.32|1997-09-07|5-LOW|Clerk#000000566|0|Tiresias wake quickly quickly even +2852|892|F|144902.15|1993-01-16|1-URGENT|Clerk#000000740|0|ruthless deposits against the final instructions use quickly al +2853|929|F|137718.56|1994-05-05|2-HIGH|Clerk#000000878|0|the carefully even packages. +2854|1384|F|232446.67|1994-06-27|1-URGENT|Clerk#000000010|0| furiously ironic tithes use furiously +2855|481|F|63484.19|1993-04-04|4-NOT SPECIFIED|Clerk#000000973|0| silent, regular packages sleep +2880|79|F|172033.71|1992-03-15|2-HIGH|Clerk#000000756|0|ves maintain doggedly spec +2881|986|F|74406.92|1992-05-10|5-LOW|Clerk#000000864|0|uriously. slyly express requests according to the silent dol +2882|1201|O|266004.51|1995-08-22|2-HIGH|Clerk#000000891|0|pending deposits. carefully eve +2883|1208|F|253433.41|1995-01-23|5-LOW|Clerk#000000180|0|uses. carefully ironic accounts lose fluffil +2884|914|O|106271.93|1997-10-12|3-MEDIUM|Clerk#000000780|0|efully express instructions sleep against +2885|61|F|195560.03|1992-09-19|4-NOT SPECIFIED|Clerk#000000280|0|ly sometimes special excuses. final requests are +2886|1075|F|129888.20|1994-11-13|4-NOT SPECIFIED|Clerk#000000619|0|uctions. ironic packages sle +2887|1075|O|34769.89|1997-05-26|5-LOW|Clerk#000000566|0|slyly even pinto beans. slyly bold epitaphs cajole blithely above t +2912|922|F|29086.04|1992-03-12|5-LOW|Clerk#000000186|0|jole blithely above the quickly regular packages. carefully regular pinto bean +2913|424|O|168204.36|1997-07-12|3-MEDIUM|Clerk#000000118|0|mptotes doubt furiously slyly regu +2914|1072|F|87611.96|1993-03-03|3-MEDIUM|Clerk#000000543|0|he slyly regular theodolites are furiously sile +2915|925|F|154725.01|1994-03-31|5-LOW|Clerk#000000410|0|ld packages. bold deposits boost blithely. ironic, unusual theodoli +2916|74|O|35450.91|1995-12-27|2-HIGH|Clerk#000000681|0|ithely blithe deposits sleep beyond the +2917|908|O|155542.57|1997-12-09|4-NOT SPECIFIED|Clerk#000000061|0| special dugouts among the special deposi +2918|1175|O|37282.52|1996-09-08|3-MEDIUM|Clerk#000000439|0|ular deposits across th +2919|526|F|154899.61|1993-12-10|2-HIGH|Clerk#000000209|0|es. pearls wake quietly slyly ironic instructions-- +2944|136|O|196529.29|1997-09-24|4-NOT SPECIFIED|Clerk#000000740|0|deas. permanently special foxes haggle carefully ab +2945|283|O|351345.57|1996-01-03|2-HIGH|Clerk#000000499|0|ons are carefully toward the permanent, bold pinto beans. regu +2946|1243|O|146922.98|1996-02-05|5-LOW|Clerk#000000329|0|g instructions about the regular accounts sleep carefully along the pen +2947|697|P|53117.45|1995-04-26|1-URGENT|Clerk#000000464|0|ronic accounts. accounts run furiously d +2948|439|F|145273.22|1994-08-23|5-LOW|Clerk#000000701|0| deposits according to the blithely pending +2949|1363|F|150199.75|1994-04-12|2-HIGH|Clerk#000000184|0|y ironic accounts use. quickly blithe accou +2950|1345|O|275176.74|1997-07-06|1-URGENT|Clerk#000000833|0| dolphins around the furiously +2951|737|O|183228.93|1996-02-06|2-HIGH|Clerk#000000680|0|gular deposits above the finally regular ideas integrate idly stealthil +2976|281|F|170496.06|1993-12-10|4-NOT SPECIFIED|Clerk#000000159|0|. furiously ironic asymptotes haggle ruthlessly silently regular r +2977|712|O|41482.00|1996-08-27|3-MEDIUM|Clerk#000000252|0|quickly special platelets are furio +2978|439|P|192591.22|1995-05-03|1-URGENT|Clerk#000000135|0|d. even platelets are. ironic dependencies cajole slow, e +2979|1330|O|159392.83|1996-03-23|3-MEDIUM|Clerk#000000820|0|even, ironic foxes sleep along +2980|38|O|223259.35|1996-09-14|3-MEDIUM|Clerk#000000661|0|y quick pinto beans wake. slyly re +2981|475|O|49188.07|1998-07-29|5-LOW|Clerk#000000299|0|hely among the express foxes. blithely stealthy requests cajole boldly. regu +2982|844|F|81058.61|1995-03-19|2-HIGH|Clerk#000000402|0|lyly. express theodolites affix slyly after the slyly speci +2983|613|F|83588.10|1992-01-07|1-URGENT|Clerk#000000278|0|r the even requests. accounts maintain. regular accounts +3008|394|O|214071.78|1995-11-08|3-MEDIUM|Clerk#000000701|0|ze quickly. blithely regular packages above the slyly bold foxes shall +3009|544|O|155804.55|1997-02-28|1-URGENT|Clerk#000000205|0|r ideas. carefully pe +3010|76|O|208692.43|1996-01-26|2-HIGH|Clerk#000000931|0| blithely final requests. special deposits are slyl +3011|898|F|54626.00|1992-01-14|5-LOW|Clerk#000000515|0|onic deposits kindle slyly. dependencies around the quickly iro +3012|314|F|144301.93|1993-05-05|1-URGENT|Clerk#000000414|0|ts after the regular pinto beans impress blithely s +3013|1423|O|227439.49|1997-02-05|5-LOW|Clerk#000000591|0|the furiously pendin +3014|289|F|254837.16|1992-10-30|4-NOT SPECIFIED|Clerk#000000476|0|ep blithely according to the blith +3015|1016|F|165794.93|1992-09-27|5-LOW|Clerk#000000013|0|ously regular deposits affix carefully. furiousl +3040|1108|F|159027.67|1993-04-12|3-MEDIUM|Clerk#000000544|0|carefully special packages. blithe +3041|1126|O|34175.78|1997-06-03|5-LOW|Clerk#000000092|0|s. unusual, pending deposits use carefully. thinly final +3042|199|F|112621.21|1994-11-21|3-MEDIUM|Clerk#000000573|0| the slyly ironic depo +3043|434|F|113399.95|1992-04-25|5-LOW|Clerk#000000137|0|cajole blithely furiously fina +3044|529|O|60086.93|1996-04-03|2-HIGH|Clerk#000000008|0|cajole final courts. ironic deposits about the quickly final re +3045|499|O|146623.24|1995-09-27|1-URGENT|Clerk#000000405|0| express courts sleep quickly special asymptotes. +3046|314|O|170565.91|1995-11-30|2-HIGH|Clerk#000000522|0|r deposits. platelets use furi +3047|247|O|39892.35|1997-03-21|1-URGENT|Clerk#000000962|0|as. slyly express deposits are dogged pearls. silent ide +3072|226|F|126150.96|1994-01-30|4-NOT SPECIFIED|Clerk#000000370|0|ely final deposits cajole carefully. ironic, re +3073|1354|F|207755.81|1994-01-08|3-MEDIUM|Clerk#000000404|0|kly slyly bold accounts. express courts near the regular ideas sleep bli +3074|658|F|111588.36|1992-11-01|5-LOW|Clerk#000000546|0|yly even asymptotes shall have to haggle fluffily. deposits are +3075|1252|F|41813.90|1994-05-07|3-MEDIUM|Clerk#000000433|0|ackages: carefully unusual reques +3076|914|F|129065.87|1993-07-23|2-HIGH|Clerk#000000099|0|busy foxes. deposits affix quickly ironic, pending pint +3077|1208|O|157557.18|1997-08-06|2-HIGH|Clerk#000000228|0|kly. fluffily ironic requests use qui +3078|473|F|65211.07|1993-02-12|2-HIGH|Clerk#000000110|0|ounts are alongside of the blith +3079|986|O|192511.27|1997-09-12|5-LOW|Clerk#000000505|0|lly ironic accounts +3104|689|F|148848.19|1993-09-16|3-MEDIUM|Clerk#000000871|0|ges boost-- regular accounts are furiousl +3105|1366|O|185113.31|1996-11-13|4-NOT SPECIFIED|Clerk#000000772|0|s. blithely final ins +3106|1445|O|192869.71|1997-01-12|3-MEDIUM|Clerk#000000729|0|its use slyly final theodolites; regular dolphins hang above t +3107|254|O|157543.64|1997-08-21|1-URGENT|Clerk#000000669|0|ously even deposits acr +3108|844|F|75046.18|1993-08-05|1-URGENT|Clerk#000000574|0|s packages haggle furiously am +3109|1222|F|296211.71|1993-07-24|5-LOW|Clerk#000000936|0|bold requests sleep quickly according to the slyly final +3110|874|F|148021.35|1994-12-17|2-HIGH|Clerk#000000564|0|round the fluffy instructions. carefully silent packages cajol +3111|1328|O|208880.19|1995-08-25|5-LOW|Clerk#000000922|0|slyly regular theodolites. furious deposits cajole deposits. ironic theodoli +3136|230|F|195429.40|1994-08-10|4-NOT SPECIFIED|Clerk#000000891|0|tructions sleep slyly. pending di +3137|1342|O|9264.77|1995-07-26|3-MEDIUM|Clerk#000000063|0|ymptotes wake carefully above t +3138|1390|F|210941.18|1994-02-09|4-NOT SPECIFIED|Clerk#000000650|0|e fluffily final theodolites. even dependencies wake along the quickly ir +3139|166|F|56421.93|1992-01-02|3-MEDIUM|Clerk#000000855|0|ounts against the ruthlessly unusual dolphins +3140|1450|F|68160.48|1992-04-09|1-URGENT|Clerk#000000670|0|carefully ironic deposits use furiously. blith +3141|253|O|161595.67|1995-11-10|1-URGENT|Clerk#000000475|0|es. furiously bold instructions after the carefully final p +3142|73|F|17194.09|1992-06-28|3-MEDIUM|Clerk#000000043|0|usual accounts about the carefully special requests sleep slyly quickly regul +3143|1069|F|221770.55|1993-02-17|1-URGENT|Clerk#000000519|0| are final, ironic accounts. ironic +3168|1358|F|101697.90|1992-01-30|5-LOW|Clerk#000000352|0|s sleep slyly? ironic, furious instructions detect. quickly final i +3169|181|F|184054.00|1993-12-21|3-MEDIUM|Clerk#000000252|0| even pinto beans are blithely special, special multip +3170|43|O|292168.10|1997-11-09|1-URGENT|Clerk#000000288|0|requests. furiously bold +3171|466|F|110707.33|1993-04-06|5-LOW|Clerk#000000940|0|ar deposits. idly r +3172|883|F|165727.78|1992-06-03|4-NOT SPECIFIED|Clerk#000000771|0|es. slyly ironic packages x-ra +3173|1462|O|105183.55|1996-08-10|5-LOW|Clerk#000000516|0|ial requests lose along t +3174|1264|O|152505.56|1995-11-15|5-LOW|Clerk#000000663|0|rts. silent, regular pinto beans are blithely regular packages. furiousl +3175|439|F|252261.28|1994-07-15|5-LOW|Clerk#000000629|0| across the slyly even realms use carefully ironic deposits: sl +3200|122|O|178687.59|1996-02-07|1-URGENT|Clerk#000000020|0| regular dependencies impress evenly even excuses. blithely +3201|952|F|100522.53|1993-07-02|4-NOT SPECIFIED|Clerk#000000738|0|. busy, express instruction +3202|868|F|72537.65|1992-12-24|5-LOW|Clerk#000000067|0|fluffily express requests affix carefully around th +3203|1259|O|71682.53|1997-11-05|2-HIGH|Clerk#000000493|0|e furiously silent warhorses. slyly silent deposits wake bli +3204|88|F|44713.55|1992-12-26|1-URGENT|Clerk#000000693|0|ess somas cajole slyly. pending accounts cajole +3205|1463|F|215063.16|1992-04-11|5-LOW|Clerk#000000803|0|e furiously. quickly regular dinos about the final pinto be +3206|1213|O|82248.70|1996-08-09|1-URGENT|Clerk#000000755|0|ntegrate furiously final, express +3207|205|O|184595.78|1998-02-16|1-URGENT|Clerk#000000695|0|uriously accounts. fluffily i +3232|809|F|66817.67|1992-10-09|1-URGENT|Clerk#000000314|0|yly final accounts. packages agains +3233|1397|F|70920.20|1994-10-24|5-LOW|Clerk#000000470|0|ly ironic epitaphs use stealthy, express deposits. quickly regular instruct +3234|139|O|218988.88|1996-04-05|4-NOT SPECIFIED|Clerk#000000367|0|ents according to the dependencies will sleep after the blithely even p +3235|448|O|160699.91|1995-11-15|5-LOW|Clerk#000000349|0| quickly pinto beans. ironi +3236|1405|O|42427.77|1996-11-06|4-NOT SPECIFIED|Clerk#000000553|0|ithely slyly pending req +3237|182|F|11628.02|1992-06-03|1-URGENT|Clerk#000000606|0|inal requests. slyly even foxes detect about the furiously exp +3238|610|F|64556.89|1993-02-21|5-LOW|Clerk#000000818|0|lly express deposits are. furiously unusual ideas wake carefully somas. instr +3239|343|O|219052.93|1998-01-12|4-NOT SPECIFIED|Clerk#000000619|0| cajole carefully along the furiously pending deposits. +3264|925|O|214961.96|1996-11-02|5-LOW|Clerk#000000244|0|carefully. express, bold +3265|523|F|68739.22|1992-06-27|1-URGENT|Clerk#000000265|0|re quickly quickly pe +3266|37|P|99432.16|1995-03-17|5-LOW|Clerk#000000545|0|refully ironic instructions. slyly final pi +3267|1120|O|54666.17|1997-01-07|5-LOW|Clerk#000000484|0| the packages. regular decoys about the bold dependencies grow fi +3268|1414|F|50963.54|1994-06-25|5-LOW|Clerk#000000746|0|y brave requests unwind furiously accordin +3269|169|O|331533.22|1996-03-01|3-MEDIUM|Clerk#000000378|0|ts. accounts wake carefully. carefully dogged accounts wake slyly slyly i +3270|379|O|240687.99|1997-05-28|1-URGENT|Clerk#000000375|0|uffily pending courts ca +3271|331|F|138053.06|1992-01-01|1-URGENT|Clerk#000000421|0|s. furiously regular requests +3296|1471|F|280148.00|1994-10-19|3-MEDIUM|Clerk#000000991|0|as! carefully final requests wake. furiously even +3297|1385|F|11553.32|1992-11-03|2-HIGH|Clerk#000000220|0| after the theodolites cajole carefully according to the finally +3298|1159|O|91070.97|1996-04-17|5-LOW|Clerk#000000241|0|even accounts boost +3299|892|F|68340.62|1993-12-26|3-MEDIUM|Clerk#000000853|0|bold deposits. special instructions sleep care +3300|1168|O|35168.76|1995-07-15|5-LOW|Clerk#000000198|0|ses. carefully unusual instructions must have to detect about the blithel +3301|1322|F|72199.05|1994-09-04|4-NOT SPECIFIED|Clerk#000000325|0|ular gifts impress enticingly carefully express deposits; instructions boo +3302|334|O|51365.63|1995-11-14|2-HIGH|Clerk#000000367|0|eep blithely ironic requests. quickly even courts haggle slyly +3303|1435|O|155557.55|1997-12-14|4-NOT SPECIFIED|Clerk#000000661|0|nto beans sleep furiously above the carefully ironic +3328|65|F|192264.80|1992-11-19|5-LOW|Clerk#000000384|0|ake among the express accounts? carefully ironic packages cajole never. +3329|34|O|55269.13|1995-07-03|2-HIGH|Clerk#000000236|0|old deposits. special accounts haggle furiousl +3330|65|F|51302.83|1994-12-19|1-URGENT|Clerk#000000124|0|kages use. carefully regular deposits cajole carefully about +3331|907|F|77649.29|1993-05-21|2-HIGH|Clerk#000000901|0|uffily carefully sly accounts. blithely unu +3332|1424|F|103092.90|1994-11-05|1-URGENT|Clerk#000000840|0|ans detect carefully furiously final deposits: regular accoun +3333|913|F|252419.80|1992-09-16|4-NOT SPECIFIED|Clerk#000000157|0|ctions boost slyly quickly even accounts. deposits along +3334|751|O|47161.56|1996-02-18|5-LOW|Clerk#000000532|0|ounts maintain carefully. furiously close request +3335|487|O|162808.07|1995-10-15|3-MEDIUM|Clerk#000000694|0| deposits poach. ironic ideas about the carefully ironi +3360|1030|O|266634.93|1998-01-23|5-LOW|Clerk#000000254|0| the deposits. fluffily bold requests cajole regula +3361|484|F|116078.71|1992-08-23|4-NOT SPECIFIED|Clerk#000000577|0|unts detect furiously instructions. slow deposi +3362|1399|O|256039.11|1995-07-29|5-LOW|Clerk#000000011|0|the quickly pending deposits. silent, ev +3363|512|O|114518.93|1995-09-23|2-HIGH|Clerk#000000615|0|posits. ironic, final deposits are furiously slyly pending +3364|448|O|157350.59|1997-06-21|1-URGENT|Clerk#000000280|0|y even foxes? blithely stea +3365|820|F|240272.44|1994-11-09|2-HIGH|Clerk#000000126|0|he slyly regular foxes nag about the accounts. fluffily +3366|508|O|17060.87|1997-05-18|1-URGENT|Clerk#000000160|0| pinto beans upon the quickly expres +3367|727|F|123759.09|1992-12-31|4-NOT SPECIFIED|Clerk#000000029|0|efully blithely ironic pinto beans. carefully close +3392|737|O|124060.27|1995-10-28|1-URGENT|Clerk#000000325|0|es thrash blithely depths. bold multipliers wake f +3393|973|O|270663.25|1995-07-04|2-HIGH|Clerk#000000076|0|even requests. excuses are carefully deposits. fluf +3394|1486|O|231035.67|1996-05-05|4-NOT SPECIFIED|Clerk#000000105|0| blithely among the attainments. carefully final accounts nag blit +3395|1496|F|180443.18|1994-10-30|4-NOT SPECIFIED|Clerk#000000682|0|ideas haggle beside the ev +3396|1492|F|277647.09|1994-05-21|3-MEDIUM|Clerk#000000868|0|uffily regular platelet +3397|1297|F|117210.56|1994-06-23|3-MEDIUM|Clerk#000000048|0|yly. final deposits wake f +3398|668|O|1744.64|1996-09-23|1-URGENT|Clerk#000000818|0|uthless, special courts atop the unusual accounts grow fur +3399|1220|P|70777.98|1995-02-28|4-NOT SPECIFIED|Clerk#000000575|0|the carefully sly accounts. regular, pending theodolites wa +3424|1013|O|67108.17|1996-08-21|1-URGENT|Clerk#000000190|0|ven requests are quickly pending accounts. blithely furious requests +3425|1150|O|230685.11|1996-03-31|4-NOT SPECIFIED|Clerk#000000188|0|ions. deposits nag blithely alongside of the carefully f +3426|521|O|118942.14|1996-10-16|3-MEDIUM|Clerk#000000283|0|alongside of the slyly +3427|28|O|180376.94|1997-05-29|4-NOT SPECIFIED|Clerk#000000404|0|y final pinto beans snooze fluffily bold asymptot +3428|85|O|103376.25|1996-04-07|5-LOW|Clerk#000000953|0|lar excuses. slyly pending ideas detect p +3429|1453|O|207631.78|1997-01-06|4-NOT SPECIFIED|Clerk#000000737|0|l deposits cajole furiously enticing deposits. blithe packages haggle careful +3430|1121|F|270267.01|1994-12-12|4-NOT SPECIFIED|Clerk#000000664|0| regular attainments are at the final foxes. final packages along the blithe +3431|463|F|71445.89|1993-08-22|1-URGENT|Clerk#000000439|0| sleep. slyly busy Tiresias a +3456|448|F|32601.42|1993-06-01|5-LOW|Clerk#000000924|0|es promise slyly. ironicall +3457|241|P|207252.29|1995-04-27|4-NOT SPECIFIED|Clerk#000000849|0|ely thin asymptotes. deposits kindle. pending +3458|946|F|197366.63|1994-12-22|2-HIGH|Clerk#000000392|0|rges snooze. slyly unusua +3459|1187|F|179504.40|1994-07-28|4-NOT SPECIFIED|Clerk#000000777|0|n instructions? carefully regular excuses are blithely. silent, ironi +3460|808|O|354036.76|1995-10-03|2-HIGH|Clerk#000000078|0|ans integrate carefu +3461|986|F|320694.21|1993-01-31|1-URGENT|Clerk#000000504|0|al, bold deposits cajole fluffily fluffily final foxes. pending ideas beli +3462|1328|O|86823.93|1997-05-17|3-MEDIUM|Clerk#000000657|0|uriously express asympto +3463|884|F|147059.62|1993-08-18|1-URGENT|Clerk#000000545|0|ding to the carefully ironic deposits +3488|1477|F|106165.56|1995-01-08|3-MEDIUM|Clerk#000000694|0|cording to the carefully regular deposits. re +3489|1072|F|86269.91|1993-07-29|3-MEDIUM|Clerk#000000307|0|s detect. carefully even platelets across the fur +3490|899|O|180759.57|1997-05-26|5-LOW|Clerk#000000703|0|gular ideas. furiously silent deposits across the unusual accounts boost i +3491|826|O|62878.19|1998-06-24|1-URGENT|Clerk#000000560|0|nic orbits believe carefully across the +3492|1019|F|193799.44|1994-11-24|5-LOW|Clerk#000000066|0|packages along the regular foxes lose final dependencie +3493|805|F|69650.05|1993-08-24|2-HIGH|Clerk#000000887|0|lyly special accounts use blithely across the furiously sil +3494|472|F|204991.65|1993-04-04|5-LOW|Clerk#000000559|0|r instructions haggle. accounts cajole. carefully final requests at the +3495|307|O|87879.06|1996-02-26|2-HIGH|Clerk#000000441|0|nticing excuses are carefully +3520|1250|O|217904.72|1997-08-04|1-URGENT|Clerk#000000023|0|hely. ideas nag; even, even fo +3521|68|F|207058.26|1992-10-26|5-LOW|Clerk#000000812|0|y even instructions cajole carefully above the bli +3522|256|F|228929.46|1994-09-26|5-LOW|Clerk#000000250|0|deposits-- slyly stealthy requests boost caref +3523|1499|O|179947.37|1998-04-07|2-HIGH|Clerk#000000688|0|are on the carefully even depe +3524|934|F|28748.76|1992-05-03|2-HIGH|Clerk#000000607|0|efully unusual tithes among the foxes use blithely daringly bold deposits. re +3525|1072|O|151567.42|1995-12-22|4-NOT SPECIFIED|Clerk#000000084|0|s nag among the blithely e +3526|559|F|70730.17|1995-03-16|5-LOW|Clerk#000000364|0|to the quickly special deposits print agai +3527|557|O|173421.31|1997-06-21|5-LOW|Clerk#000000874|0|regular ideas across the quickly bold theodo +3552|343|O|170016.99|1997-04-23|2-HIGH|Clerk#000000973|0| the ironic packages. furiously +3553|908|F|165037.95|1994-05-18|3-MEDIUM|Clerk#000000270|0|counts mold furiously. slyly i +3554|439|O|151890.41|1995-06-17|5-LOW|Clerk#000000931|0|hely ironic requests haggl +3555|455|O|178654.01|1996-07-07|5-LOW|Clerk#000000585|0|s nag carefully regular, even pinto be +3556|148|F|159831.74|1992-09-23|4-NOT SPECIFIED|Clerk#000000140|0|e. dependencies need to haggle alongs +3557|1192|F|116288.27|1992-11-09|2-HIGH|Clerk#000000291|0|ithely courts. furi +3558|265|O|162598.01|1996-02-29|1-URGENT|Clerk#000000841|0|around the furiously even requests. quickl +3559|1054|F|55757.49|1992-10-24|3-MEDIUM|Clerk#000000634|0|sly deposits. fluffily final ideas cajole careful +3584|118|O|101937.04|1997-08-11|1-URGENT|Clerk#000000760|0|fully bold packages. fluffily final braids haggle final, ironic dolphins. b +3585|1381|F|206416.27|1994-11-23|2-HIGH|Clerk#000000988|0|regular asymptotes. bold pains above the carefully pending asymptot +3586|1201|F|171227.96|1993-12-05|2-HIGH|Clerk#000000438|0|he quickly final courts. carefully regular requests nag unusua +3587|775|O|225119.62|1996-05-10|4-NOT SPECIFIED|Clerk#000000443|0|ular patterns detect +3588|1186|F|287191.29|1995-03-19|4-NOT SPECIFIED|Clerk#000000316|0|ong the pains. evenly unusual +3589|307|F|52846.72|1994-05-26|2-HIGH|Clerk#000000023|0|ithe deposits nag furiously. furiously pending packages sleep f +3590|1489|P|352720.59|1995-05-13|5-LOW|Clerk#000000986|0|lyly final deposits. +3591|1345|F|138408.31|1993-12-08|3-MEDIUM|Clerk#000000144|0|ual foxes haggle! unusual request +3616|1273|F|90467.25|1994-02-16|4-NOT SPECIFIED|Clerk#000000268|0|uickly about the quickly final requests. fluffily final packages wake evenly +3617|394|O|181875.51|1996-03-19|3-MEDIUM|Clerk#000000886|0|the carefully regular platelets ha +3618|98|O|185247.02|1997-12-13|3-MEDIUM|Clerk#000000894|0|. ideas run carefully. thin, pending +3619|1489|O|320560.24|1996-11-20|2-HIGH|Clerk#000000211|0|uests mold after the blithely ironic excuses. slyly pending pa +3620|440|O|90481.44|1997-03-07|5-LOW|Clerk#000000124|0|le quickly against the epitaphs. requests sleep slyly according to the +3621|1408|F|149743.36|1993-05-06|3-MEDIUM|Clerk#000000643|0|kly unusual deposits. qu +3622|901|O|174438.86|1995-11-27|5-LOW|Clerk#000000012|0|c deposits are fluffily about the blithely final theo +3623|29|O|253649.01|1996-12-26|1-URGENT|Clerk#000000184|0|- ironic excuses boost quickly in place +3648|1249|F|240597.67|1993-06-17|5-LOW|Clerk#000000717|0|foxes. unusual deposits boost quickly. slyly regular asymptotes across t +3649|388|F|202043.25|1994-07-06|5-LOW|Clerk#000000349|0|taphs boost above the final p +3650|445|F|280273.39|1992-05-28|4-NOT SPECIFIED|Clerk#000000454|0|kages sleep fluffily slyly +3651|986|O|125508.45|1998-04-27|1-URGENT|Clerk#000000222|0|ly unusual deposits thrash quickly after the ideas. +3652|1066|O|150080.43|1997-02-25|4-NOT SPECIFIED|Clerk#000000024|0|sly even requests after the +3653|383|F|215841.09|1994-03-27|1-URGENT|Clerk#000000402|0| pearls. bold accounts are along the ironic, +3654|56|F|326681.49|1992-06-03|5-LOW|Clerk#000000475|0|s cajole slyly carefully special theodolites. even deposits haggl +3655|487|F|111868.80|1992-10-06|1-URGENT|Clerk#000000815|0|er the carefully unusual deposits sleep quickly according to +3680|1267|F|172093.20|1992-12-10|4-NOT SPECIFIED|Clerk#000000793|0|ular platelets. carefully regular packages cajole blithely al +3681|517|F|34981.18|1992-04-04|1-URGENT|Clerk#000000566|0|. ironic deposits against the ironic, regular frets use pending plat +3682|317|O|93227.96|1997-01-22|2-HIGH|Clerk#000000001|0|es haggle carefully. decoys nag +3683|874|F|137933.64|1993-03-04|2-HIGH|Clerk#000000248|0|ze across the express foxes. carefully special acco +3684|229|F|109708.71|1993-07-20|2-HIGH|Clerk#000000835|0|bold accounts affix along the carefully ironic requ +3685|158|F|226866.11|1992-01-17|3-MEDIUM|Clerk#000000954|0| sleep fluffily special ide +3686|400|O|124290.79|1998-07-07|2-HIGH|Clerk#000000175|0|s. furiously final pinto beans poach carefully among +3687|422|F|127789.54|1993-02-03|1-URGENT|Clerk#000000585|0|gular accounts. slyly regular instructions can are final ide +3712|640|F|181818.96|1992-01-02|2-HIGH|Clerk#000000032|0| promise according +3713|1498|O|315464.25|1998-05-07|3-MEDIUM|Clerk#000000325|0|s haggle quickly. ironic, regular Tiresi +3714|392|O|115054.72|1998-05-01|3-MEDIUM|Clerk#000000595|0|nding accounts. ironic pinto beans wake slyly. furiously pendin +3715|644|O|88203.51|1996-03-18|1-URGENT|Clerk#000000463|0| always silent requests wake pinto beans. slyly pending foxes are aga +3716|415|O|202853.22|1997-08-19|4-NOT SPECIFIED|Clerk#000000748|0| pending ideas haggle. ironic, +3717|266|O|254701.10|1998-06-03|4-NOT SPECIFIED|Clerk#000000974|0|t the carefully even ideas use sp +3718|305|O|83545.86|1996-10-23|2-HIGH|Clerk#000000016|0|refully. furiously final packages use carefully slyly pending deposits! final, +3719|1180|O|194113.04|1997-02-16|2-HIGH|Clerk#000000034|0|, enticing accounts are blithely among the daringly final asymptotes. furious +3744|643|F|55886.68|1992-01-10|3-MEDIUM|Clerk#000000765|0|osits sublate about the regular requests. fluffily unusual accou +3745|1118|F|23657.43|1993-09-29|5-LOW|Clerk#000000181|0|ckages poach slyly against the foxes. slyly ironic instructi +3746|731|F|109530.26|1994-09-11|4-NOT SPECIFIED|Clerk#000000188|0|. express, special requests nag quic +3747|1492|O|258977.08|1996-08-20|1-URGENT|Clerk#000000226|0|refully across the final theodolites. carefully bold accounts cajol +3748|521|O|118550.25|1998-02-28|1-URGENT|Clerk#000000156|0|slyly special packages +3749|376|P|134685.89|1995-02-24|3-MEDIUM|Clerk#000000639|0|y regular instructions haggle blithel +3750|965|P|227479.98|1995-04-30|3-MEDIUM|Clerk#000000885|0|y. express, even packages wake after the ide +3751|91|F|296988.49|1994-04-27|4-NOT SPECIFIED|Clerk#000000925|0|sheaves. express, unusual t +3776|844|F|210295.67|1992-11-20|2-HIGH|Clerk#000000698|0|efully even platelets slee +3777|272|F|118933.43|1994-04-08|3-MEDIUM|Clerk#000000941|0| regular, special dolphins cajole enticingly ca +3778|1054|F|314918.09|1993-05-26|1-URGENT|Clerk#000000187|0| above the express requests. packages maintain fluffily according to +3779|733|O|43092.48|1997-01-05|4-NOT SPECIFIED|Clerk#000000670|0| against the deposits. quickly bold instructions x-ray. pending fox +3780|410|O|95100.73|1996-04-13|5-LOW|Clerk#000000967|0| around the brave, pendin +3781|1384|O|175615.29|1996-06-20|1-URGENT|Clerk#000000394|0|yly after the ruthless packages. pinto beans use slyly: never ironic dependenc +3782|650|O|170815.80|1996-08-24|1-URGENT|Clerk#000000121|0|counts are. pending, regular asym +3783|436|F|242713.60|1993-12-06|4-NOT SPECIFIED|Clerk#000000614|0| along the pinto beans. special packages use. regular theo +3808|778|F|320547.32|1994-04-24|1-URGENT|Clerk#000000717|0|odolites. blithely ironic cour +3809|1474|O|185067.55|1996-05-01|5-LOW|Clerk#000000646|0| regular excuses. even theodolites are fluffily according to t +3810|997|F|181248.66|1992-09-17|1-URGENT|Clerk#000000660|0|ters sleep across the carefully final +3811|799|O|215676.13|1998-04-16|3-MEDIUM|Clerk#000000290|0|sits wake slyly abo +3812|406|O|98698.11|1996-08-13|3-MEDIUM|Clerk#000000727|0|al, final requests cajole +3813|1459|O|102438.30|1998-06-29|1-URGENT|Clerk#000000531|0|g the furiously regular instructions +3814|1162|P|222423.89|1995-02-22|5-LOW|Clerk#000000669|0| the furiously pending theodo +3815|1039|O|18092.99|1997-08-26|1-URGENT|Clerk#000000249|0|es snooze carefully stealth +3840|985|O|270240.36|1998-07-17|4-NOT SPECIFIED|Clerk#000000713|0|yly slow theodolites. enticingly +3841|577|F|176161.65|1994-10-05|4-NOT SPECIFIED|Clerk#000000018|0| bold requests sleep quickly ironic packages. sometimes regular deposits nag +3842|269|F|184717.13|1992-04-09|5-LOW|Clerk#000000418|0|silent ideas. final deposits use furiously. blithely express excuses cajole fu +3843|85|O|35023.79|1997-01-04|4-NOT SPECIFIED|Clerk#000000693|0|eodolites; slyly unusual accounts nag boldly +3844|784|F|6858.13|1994-12-29|1-URGENT|Clerk#000000686|0|r dolphins. slyly ironic theodolites ag +3845|887|F|180711.26|1992-04-26|1-URGENT|Clerk#000000404|0|es among the pending, regular accounts sleep blithely blithely even de +3846|475|O|168131.67|1998-02-05|2-HIGH|Clerk#000000877|0|y alongside of the slyl +3847|337|F|11494.62|1993-03-12|5-LOW|Clerk#000000338|0|uriously even deposits. furiously pe +3872|1331|O|269197.14|1996-09-06|5-LOW|Clerk#000000943|0|counts boost slyly against the ironic platelets-- blithely p +3873|535|O|127910.27|1998-03-30|4-NOT SPECIFIED|Clerk#000000791|0|express deposits-- even ideas +3874|1186|F|85524.46|1993-06-09|3-MEDIUM|Clerk#000000208|0|ular asymptotes sleep blithely ironic ideas. blithel +3875|1177|O|93803.50|1997-09-10|1-URGENT|Clerk#000000587|0| solve among the fluffily even +3876|283|O|113879.01|1996-08-02|5-LOW|Clerk#000000708|0|into beans. blithely +3877|164|F|239783.44|1993-05-21|5-LOW|Clerk#000000652|0|foxes. thinly bold reques +3878|866|O|90013.77|1997-03-23|1-URGENT|Clerk#000000314|0|e carefully regular platelets. special, express dependencies slee +3879|1408|O|100898.76|1995-11-23|1-URGENT|Clerk#000000231|0|sts along the quickly ironic sentiments cajole carefully according to t +3904|1483|O|58126.35|1997-11-15|4-NOT SPECIFIED|Clerk#000000883|0|sits haggle furiously across the requests. theodolites ha +3905|211|F|55580.47|1993-12-21|4-NOT SPECIFIED|Clerk#000000573|0|usly even accounts lose quietly above the slyly express p +3906|443|F|208585.62|1992-05-28|3-MEDIUM|Clerk#000000867|0|ironic theodolites haggle blithely above the final re +3907|661|F|318521.56|1992-08-19|3-MEDIUM|Clerk#000000084|0|gular pinto beans sleep f +3908|412|F|100534.13|1993-03-09|3-MEDIUM|Clerk#000000490|0|ounts cajole. regularly +3909|206|O|133975.94|1998-07-27|1-URGENT|Clerk#000000980|0|nic, special theodolites sleep furiously! furiously +3910|629|O|70759.37|1996-08-26|3-MEDIUM|Clerk#000000270|0|ickly. furiously final packag +3911|89|P|45445.54|1995-03-17|4-NOT SPECIFIED|Clerk#000000818|0|he fluffily final forges haggle slyly according to the blithely +3936|314|O|255569.92|1996-11-07|2-HIGH|Clerk#000000200|0|iously express packages engage slyly fina +3937|935|O|254234.45|1997-11-30|4-NOT SPECIFIED|Clerk#000000189|0|ckages boost carefully blithely q +3938|298|F|65808.22|1993-03-03|1-URGENT|Clerk#000000199|0|. unusual, final foxes haggle +3939|682|O|12318.56|1996-01-11|5-LOW|Clerk#000000647|0|ly ruthlessly silent requests. blithely regular requests haggle blithely wh +3940|1495|O|180309.76|1996-02-14|5-LOW|Clerk#000000363|0|e above the ideas. quickly even dependencies along the blithely ir +3941|1354|O|114660.33|1996-08-29|2-HIGH|Clerk#000000503|0|gular theodolites integrate quickly +3942|754|F|56198.29|1993-06-28|4-NOT SPECIFIED|Clerk#000000608|0|eas cajole bold requests. idly silent instructions +3943|397|O|87171.39|1996-10-09|5-LOW|Clerk#000000482|0|se alongside of the final pinto beans. regular packages boost across the ca +3968|242|O|166197.28|1997-02-17|4-NOT SPECIFIED|Clerk#000000431|0| the slyly special accounts; +3969|512|O|269722.89|1997-05-14|2-HIGH|Clerk#000000731|0|uriously final dependencies slee +3970|751|F|185828.35|1992-03-27|3-MEDIUM|Clerk#000000190|0|luffily furiously regular deposits. blithely special requests cajole blithely +3971|1033|O|88799.11|1996-06-28|5-LOW|Clerk#000000287|0|alongside of the instructions ought to are +3972|1225|F|2750.56|1994-04-21|3-MEDIUM|Clerk#000000049|0|y regular requests haggle quickly. pending, express acco +3973|1018|F|112002.24|1992-03-24|4-NOT SPECIFIED|Clerk#000000114|0|somas according to the quickly even instructions wake fu +3974|931|O|74431.82|1996-03-05|4-NOT SPECIFIED|Clerk#000000938|0|deposits are furiously beneath the bl +3975|1175|O|57733.07|1995-04-11|3-MEDIUM|Clerk#000000016|0|ts. regular, regular Tiresias play furiously. ironi +4000|697|F|142251.94|1992-01-04|5-LOW|Clerk#000000339|0|le carefully closely even pinto beans. regular, ironic foxes against the +4001|1141|O|116208.23|1997-05-15|3-MEDIUM|Clerk#000000878|0|detect. asymptotes sleep furio +4002|1036|O|102892.70|1997-04-08|5-LOW|Clerk#000000097|0| regular braids are. furiously even patterns agains +4003|1102|F|26116.74|1993-01-27|1-URGENT|Clerk#000000177|0| blithe theodolites are slyly. slyly silent accounts toward +4004|683|F|302888.59|1993-05-07|3-MEDIUM|Clerk#000000273|0|accounts among the blithely regular sentiments +4005|1394|O|158486.49|1996-11-20|2-HIGH|Clerk#000000341|0|ily according to the slyly iron +4006|343|F|87327.23|1995-01-04|3-MEDIUM|Clerk#000000765|0|ly ironic packages integrate. regular requests alongside of +4007|80|F|143238.58|1993-06-18|2-HIGH|Clerk#000000623|0|ecial packages. slyly regular accounts integrate +4032|100|O|78049.89|1998-02-26|3-MEDIUM|Clerk#000000686|0|iresias sleep slyly regular ideas. quickly unusual +4033|830|F|68013.86|1993-06-02|5-LOW|Clerk#000000181|0|ously bold instructions haggle furiously above the fluf +4034|925|F|282204.87|1993-11-14|4-NOT SPECIFIED|Clerk#000000548|0|ts x-ray. express requests affix fluffily regular theodolites. pending, fina +4035|1165|F|35308.69|1992-02-19|5-LOW|Clerk#000000097|0|he ironic deposits sleep blith +4036|469|O|98412.41|1997-04-26|3-MEDIUM|Clerk#000000398|0|ly express deposits nag slyly. ironic, final asymptotes boost bra +4037|1210|F|57520.19|1993-03-24|2-HIGH|Clerk#000000384|0|t carefully above the unusual the +4038|937|O|223001.93|1996-01-06|1-URGENT|Clerk#000000272|0|re slyly. silent requests wake quickly. regular packages play quickly +4039|281|O|201017.09|1997-11-16|1-URGENT|Clerk#000000358|0|ly ironic deposits. ironic reques +4064|1288|O|231293.88|1996-10-10|4-NOT SPECIFIED|Clerk#000000598|0|ccounts. furiously unusual theodolites wake carefully about +4065|794|F|200609.19|1994-06-09|1-URGENT|Clerk#000000131|0|even foxes! slyly final deposits agai +4066|313|O|250572.93|1997-01-27|4-NOT SPECIFIED|Clerk#000000286|0|yly ironic dinos. quickly regular accounts haggle. requests wa +4067|145|F|232299.26|1992-10-07|2-HIGH|Clerk#000000027|0|tes boost furiously quick asymptotes. final deposits of the dolphins solv +4068|1250|O|86200.64|1996-09-18|3-MEDIUM|Clerk#000000203|0|lly even accounts wake furiously across the unusual platelets. unusu +4069|727|F|286148.59|1992-05-13|3-MEDIUM|Clerk#000000359|0|deposits: slyly bold ideas detect furiously. f +4070|284|O|133677.58|1995-06-12|2-HIGH|Clerk#000000713|0|xpress ideas poach ab +4071|1462|O|75727.31|1996-09-15|4-NOT SPECIFIED|Clerk#000000486|0|nal deposits. pending deposits d +4096|1378|F|100856.31|1992-07-03|4-NOT SPECIFIED|Clerk#000000706|0|sits. quickly thin deposits x-ray blith +4097|85|O|218589.15|1996-05-24|1-URGENT|Clerk#000000475|0|ickly under the even accounts. even packages after the furiously express +4098|221|O|83587.82|1996-11-05|4-NOT SPECIFIED|Clerk#000000491|0|otes. quickly final requests after the stealthily ironic pinto bean +4099|161|F|297452.57|1992-08-21|1-URGENT|Clerk#000000379|0|r platelets. slyly regular requests cajole carefully against the +4100|22|O|6545.02|1996-03-12|3-MEDIUM|Clerk#000000429|0|posits. carefully unusual packages use pending deposits. regular she +4101|1417|F|22280.28|1993-11-22|4-NOT SPECIFIED|Clerk#000000704|0|y around the express, careful epitaphs. accounts use fluffily. quickly p +4102|208|O|166220.63|1996-03-17|1-URGENT|Clerk#000000675|0|nding dependencies was slyly about the bl +4103|1048|F|64531.68|1992-07-03|5-LOW|Clerk#000000679|0|fully ironic dependencies. +4128|1390|O|9289.86|1995-10-07|4-NOT SPECIFIED|Clerk#000000635|0|ctions. dependencies from the slyly regular accounts nag slyly fu +4129|317|F|92828.14|1993-06-26|3-MEDIUM|Clerk#000000541|0|nwind. quickly final theodolites use packages. accounts +4130|1033|O|74653.84|1996-03-10|5-LOW|Clerk#000000609|0|omise alongside of the carefully final foxes. blithel +4131|436|O|174653.40|1998-01-30|1-URGENT|Clerk#000000612|0| above the foxes hang +4132|179|P|88197.43|1995-05-29|4-NOT SPECIFIED|Clerk#000000158|0|ld asymptotes solve alongside of the express, final packages. fluffily fi +4133|1001|F|39006.98|1992-08-07|4-NOT SPECIFIED|Clerk#000000268|0|al, express foxes. quickly pending deposits might cajole alongsi +4134|961|F|160154.58|1995-01-12|1-URGENT|Clerk#000000171|0|fully even deposits. regular de +4135|361|O|126584.08|1997-03-10|3-MEDIUM|Clerk#000000627|0|ly quietly even ideas. deposits haggle blithely +4160|542|O|110944.85|1996-08-20|5-LOW|Clerk#000000283|0|the carefully special accounts. furiously regular dugouts alongs +4161|1177|F|241960.17|1993-08-21|5-LOW|Clerk#000000047|0|nts. fluffily regular foxes above the quickly daring reques +4162|212|F|125408.74|1992-02-10|5-LOW|Clerk#000000179|0|r packages are slyly accounts. furiously special foxes detect carefully re +4163|628|F|15143.73|1992-12-21|2-HIGH|Clerk#000000268|0| integrate furiously slyly regular depende +4164|940|O|9375.68|1998-07-03|2-HIGH|Clerk#000000720|0| regularly busy theodolites boost furiously quickly bold packages. express, s +4165|29|O|15785.08|1997-07-25|3-MEDIUM|Clerk#000000621|0|special foxes affix never blithely ironic pinto beans; blithely +4166|413|F|145533.27|1993-02-28|5-LOW|Clerk#000000757|0|quickly sly forges impress. careful foxes across the blithely even a +4167|262|O|101266.76|1998-06-17|1-URGENT|Clerk#000000917|0|kly furiously even deposits. unu +4192|1453|O|256886.42|1998-04-19|1-URGENT|Clerk#000000369|0|equests above the slyly regular pinto beans unwi +4193|34|F|189411.15|1994-01-09|2-HIGH|Clerk#000000201|0|ng accounts haggle quickly. packages use fluffily ironic excu +4194|1058|F|102889.89|1994-10-16|3-MEDIUM|Clerk#000000385|0| instructions are quickly even pinto beans. courts boost furiously regular, ev +4195|1037|F|82719.34|1993-05-29|4-NOT SPECIFIED|Clerk#000000777|0| pinto beans cajole furiously theodolites-- slyly regular deposits doub +4196|1058|O|280403.32|1998-05-15|3-MEDIUM|Clerk#000000532|0|affix carefully. quickly final requests +4197|919|O|294678.85|1996-08-13|4-NOT SPECIFIED|Clerk#000000264|0| pinto beans according +4198|1429|O|135740.09|1997-06-16|3-MEDIUM|Clerk#000000583|0|g the special packages haggle pen +4199|41|F|40988.20|1992-02-13|1-URGENT|Clerk#000000309|0|e blithely. special deposits haggle slyly final foxes. carefully even +4224|689|O|237454.70|1997-07-14|1-URGENT|Clerk#000000034|0|jole quickly final dolphins. slyly pending foxes wake furiously bold pl +4225|1277|O|126532.76|1997-06-03|3-MEDIUM|Clerk#000000992|0|r the platelets nag among the special deposits. ironic, ironic re +4226|919|F|48595.07|1993-03-09|5-LOW|Clerk#000000203|0|phins wake slyly regular packages. deposits haggle slowl +4227|1318|F|127357.75|1995-02-24|1-URGENT|Clerk#000000063|0|ng the requests; ideas haggle fluffily. slyly unusual ideas c +4228|1100|O|27801.89|1997-03-28|5-LOW|Clerk#000000309|0|pecial requests aft +4229|133|O|115394.17|1998-03-03|1-URGENT|Clerk#000000301|0|p furiously: final excuses hagg +4230|1396|F|318270.36|1992-03-04|1-URGENT|Clerk#000000364|0|lly ironic deposits integrate carefully about the fu +4231|859|O|139085.25|1997-11-20|4-NOT SPECIFIED|Clerk#000000630|0|ly final accounts cajole furiously accounts. bravely ironic platelets am +4256|1178|F|30843.69|1992-04-05|4-NOT SPECIFIED|Clerk#000000043|0|y alongside of the fluffily iro +4257|163|P|49760.53|1995-03-25|3-MEDIUM|Clerk#000000682|0|r ideas cajole along the blithely regular gifts. +4258|916|O|184702.51|1996-10-27|4-NOT SPECIFIED|Clerk#000000364|0|efully final platelets around the blit +4259|1037|O|18170.62|1997-10-09|5-LOW|Clerk#000000781|0|es snooze slyly against the furiously unusual ideas. furious +4260|1418|F|22789.85|1992-05-16|4-NOT SPECIFIED|Clerk#000000919|0|e among the fluffily bold accounts. +4261|1174|F|114623.71|1992-10-03|1-URGENT|Clerk#000000662|0| about the even, pending packages. slyly bold deposits boost +4262|868|O|278346.38|1996-08-04|3-MEDIUM|Clerk#000000239|0| of the furious accounts. furiously regular accounts w +4263|25|O|200998.16|1998-03-16|1-URGENT|Clerk#000000265|0|sly ruthless deposits. final packages are instructions. fu +4288|340|F|94099.00|1992-12-04|4-NOT SPECIFIED|Clerk#000000823|0|usly carefully even theodolites: slyly express pac +4289|1246|F|35192.89|1993-10-07|3-MEDIUM|Clerk#000000912|0|e carefully close instructions. slyly special reques +4290|407|F|33841.66|1995-01-15|3-MEDIUM|Clerk#000000688|0| slyly quickly bold requests. final deposits haggle pending ideas! som +4291|881|F|81411.97|1993-11-29|3-MEDIUM|Clerk#000000655|0| sleep fluffily between the bold packages. bold +4292|244|F|177630.99|1992-01-09|3-MEDIUM|Clerk#000000794|0| ruthlessly. slyly bo +4293|1028|O|319796.01|1996-08-20|2-HIGH|Clerk#000000750|0|ly packages. regular packages nag according to t +4294|487|F|320119.78|1992-08-15|3-MEDIUM|Clerk#000000407|0|ng pinto beans breach. slyly express requests bo +4295|43|O|115056.47|1996-02-10|3-MEDIUM|Clerk#000000023|0|e boldly bold dependencies +4320|1144|O|101740.00|1996-12-08|4-NOT SPECIFIED|Clerk#000000223|0|ages haggle after the slowly bold se +4321|151|F|176680.44|1994-07-18|3-MEDIUM|Clerk#000000041|0|ending deposits are carefully carefully regular packa +4322|1412|O|206843.22|1998-03-13|3-MEDIUM|Clerk#000000433|0|totes nag across the fluffily special instructions. quickly silent hockey +4323|1036|F|27690.06|1994-01-23|2-HIGH|Clerk#000000282|0|lve after the slyly regular multipliers. even, regular excus +4324|713|O|264556.68|1995-07-17|1-URGENT|Clerk#000000800|0|ccounts. slyly stealthy requests shall have t +4325|1294|O|28574.21|1996-07-18|2-HIGH|Clerk#000000591|0|y around the always ev +4326|286|O|57111.99|1996-10-27|4-NOT SPECIFIED|Clerk#000000869|0|packages. carefully express deposit +4327|1456|P|174336.63|1995-03-16|2-HIGH|Clerk#000000571|0|yly pending braids. final requests abo +4352|136|O|17780.78|1997-11-26|2-HIGH|Clerk#000000620|0|ly final platelets integrate carefully even requ +4353|721|O|40333.36|1997-12-12|2-HIGH|Clerk#000000790|0|uickly even ideas cajole +4354|1436|F|245015.68|1994-09-30|4-NOT SPECIFIED|Clerk#000000046|0|pending notornis. requests serve +4355|28|O|231360.69|1996-11-16|1-URGENT|Clerk#000000362|0|ndencies use furiously across the regular +4356|961|F|66973.45|1994-04-11|5-LOW|Clerk#000000956|0| asymptotes sleep blithely. asymptotes sleep. blithely regul +4357|461|O|105145.58|1997-10-23|4-NOT SPECIFIED|Clerk#000000031|0|ages nag between the +4358|236|O|51989.52|1997-08-12|1-URGENT|Clerk#000000692|0|according to the fluffily special asymptotes +4359|142|F|163691.40|1993-03-03|1-URGENT|Clerk#000000393|0|sts. special, unusual deposits across the ironic theodo +4384|241|F|92211.63|1992-07-13|1-URGENT|Clerk#000000192|0|onic platelets. furiously regular asymptotes according to the special pac +4385|1217|O|39190.62|1996-08-06|2-HIGH|Clerk#000000597|0|ully final requests. ironic, even dolphins above the regular +4386|610|O|164103.41|1998-02-06|5-LOW|Clerk#000000070|0| dolphins. silent, idle pinto beans +4387|1091|O|153390.55|1995-10-23|1-URGENT|Clerk#000000025|0|ter the regular pinto beans. special, final gifts above the requests wi +4388|97|O|114701.49|1996-03-28|2-HIGH|Clerk#000000715|0|ts wake against the carefully final accounts. sly +4389|541|F|167744.85|1994-05-05|3-MEDIUM|Clerk#000000403|0|wly express excuses after the permanently even instructions are +4390|53|P|197545.62|1995-05-23|1-URGENT|Clerk#000000691|0|inal pinto beans. exp +4391|379|F|78494.42|1992-02-18|2-HIGH|Clerk#000000880|0|regular accounts. even depo +4416|1481|F|111380.89|1992-06-30|5-LOW|Clerk#000000391|0| deposits. ideas cajole express theodolites: +4417|670|O|109268.75|1998-07-09|1-URGENT|Clerk#000000365|0|ideas are alongside of the blithely final reque +4418|599|F|62464.13|1993-03-25|3-MEDIUM|Clerk#000000731|0|pecial pinto beans. close foxes affix iron +4419|1033|O|106015.25|1996-06-12|4-NOT SPECIFIED|Clerk#000000410|0|ages wake furiously slyly thin theodolit +4420|1090|F|6531.42|1994-06-18|1-URGENT|Clerk#000000706|0|lly bold deposits along the bold, pending foxes detect blithely after the acco +4421|85|O|401055.62|1997-04-04|3-MEDIUM|Clerk#000000246|0|t the pending warhorses. express waters a +4422|682|P|137446.09|1995-05-22|3-MEDIUM|Clerk#000000938|0|ly bold accounts sleep special, regular foxes. doggedly regular in +4423|635|F|6952.95|1995-02-17|5-LOW|Clerk#000000888|0|excuses are ruthless +4448|685|O|202506.72|1998-05-21|2-HIGH|Clerk#000000428|0|. deposits haggle around the silent packages; slyly unusual packages +4449|86|O|62361.39|1998-02-08|5-LOW|Clerk#000000035|0|ourts are carefully even deposits. pending +4450|1060|O|179497.92|1997-07-15|1-URGENT|Clerk#000000867|0|quests boost. furiously even realms are blithely bold requests. bl +4451|26|F|137267.09|1994-10-01|1-URGENT|Clerk#000000181|0|. carefully final foxes along the quickly express T +4452|122|F|65330.93|1994-06-21|5-LOW|Clerk#000000985|0|oxes are slyly. express, ironic pinto beans wake after the quickly pending re +4453|643|O|180326.79|1997-04-01|3-MEDIUM|Clerk#000000603|0|ages could have to nag slyly furiously even asymptotes! slowly regular +4454|1409|F|237490.06|1994-02-02|5-LOW|Clerk#000000411|0|uriously regular pint +4455|172|F|135599.42|1993-10-11|3-MEDIUM|Clerk#000000924|0|even requests. bravely regular foxes according to the carefully unusual +4480|832|F|27861.42|1994-03-31|4-NOT SPECIFIED|Clerk#000000534|0|press, bold deposits boost blit +4481|1468|O|108087.11|1996-03-30|5-LOW|Clerk#000000443|0|press sheaves cajole furio +4482|808|P|112095.89|1995-05-15|4-NOT SPECIFIED|Clerk#000000534|0|ravely bold accounts. furiously ironic instructions affix quickly. pend +4483|505|F|161222.40|1992-03-07|3-MEDIUM|Clerk#000000615|0|its. blithely idle accounts run; theodolites wake carefully around the fi +4484|1304|O|287136.09|1996-12-24|1-URGENT|Clerk#000000392|0|ct across the pinto beans. quickly pending excuses engage furiously. +4485|524|F|235145.28|1994-11-13|3-MEDIUM|Clerk#000000038|0|es wake slyly even packages. blithely brave requests nag above the regul +4486|367|O|215821.93|1998-03-03|2-HIGH|Clerk#000000656|0|ffily according to the carefully pending acc +4487|446|F|140035.87|1993-02-23|3-MEDIUM|Clerk#000000017|0|s up the never pending excuses wake furiously special pinto beans. furiously i +4512|683|O|193312.17|1995-10-25|5-LOW|Clerk#000000393|0|ending instructions maintain fu +4513|832|O|177644.71|1996-03-15|5-LOW|Clerk#000000154|0|ests. final, final ideas +4514|967|F|222536.94|1994-04-30|3-MEDIUM|Clerk#000000074|0|deposits according to the carefull +4515|1397|F|209521.83|1992-03-17|1-URGENT|Clerk#000000191|0|quests among the accounts sleep boldly about the regular f +4516|1294|F|53669.59|1994-03-29|3-MEDIUM|Clerk#000000739|0|ing packages sleep slyly regular attainments +4517|1129|O|66970.94|1998-03-07|4-NOT SPECIFIED|Clerk#000000231|0|uriously final deposits doze furiously furiously reg +4518|1246|O|35494.27|1997-05-01|3-MEDIUM|Clerk#000000187|0|luffily against the spec +4519|1343|F|110005.32|1993-03-30|4-NOT SPECIFIED|Clerk#000000938|0|ccording to the final +4544|1117|O|205337.52|1997-08-07|3-MEDIUM|Clerk#000000435|0|g dependencies dazzle slyly ironic somas. carefu +4545|586|F|191746.13|1993-01-17|4-NOT SPECIFIED|Clerk#000000303|0|ep. requests use sly +4546|418|O|55946.84|1995-07-29|5-LOW|Clerk#000000373|0|ns sleep. regular, regular instructions maintai +4547|1082|F|73135.94|1993-08-23|3-MEDIUM|Clerk#000000519|0|uctions thrash platelets. slyly final foxes wake slyly against th +4548|1265|O|181682.48|1996-06-28|5-LOW|Clerk#000000798|0| in place of the blithely express sentiments haggle slyly r +4549|638|O|61843.03|1998-03-05|4-NOT SPECIFIED|Clerk#000000965|0|ully even deposits dazzle. fluffily pending ideas against the requests +4550|1177|F|41533.95|1994-12-29|2-HIGH|Clerk#000000748|0|s haggle carefully acco +4551|1090|O|124682.71|1996-02-09|2-HIGH|Clerk#000000462|0|ts. slyly quick theodolite +4576|1381|O|87420.18|1996-08-14|5-LOW|Clerk#000000798|0|e pending deposits. +4577|785|O|165340.00|1998-05-02|5-LOW|Clerk#000000409|0|ly. unusual platelets are alw +4578|893|F|142392.37|1992-09-13|5-LOW|Clerk#000000121|0| to the furiously ironic instructions? furiou +4579|1042|O|125085.80|1995-12-01|2-HIGH|Clerk#000000951|0|its wake quickly blithely specia +4580|805|F|170320.34|1993-11-15|4-NOT SPECIFIED|Clerk#000000086|0|rs wake blithely regular requests. fluffily ev +4581|778|F|119792.47|1992-09-04|4-NOT SPECIFIED|Clerk#000000687|0|ges. carefully pending accounts use furiously abo +4582|184|O|30356.19|1996-07-04|1-URGENT|Clerk#000000638|0|g the furiously regular pac +4583|217|F|325377.79|1994-09-25|3-MEDIUM|Clerk#000000240|0|equests. slyly even platelets was qui +4608|796|F|237969.57|1994-06-17|1-URGENT|Clerk#000000259|0|y even instructions detect slyly asymptotes. blithely final packa +4609|1325|O|92624.01|1996-12-05|3-MEDIUM|Clerk#000000239|0|hang slyly slyly expre +4610|259|F|204812.77|1993-06-18|5-LOW|Clerk#000000616|0|e carefully express pinto +4611|286|F|263391.24|1993-01-10|2-HIGH|Clerk#000000152|0|. furiously regular instructions haggle dolphins. even instructions det +4612|604|F|105777.20|1993-09-20|3-MEDIUM|Clerk#000000397|0|bove the deposits. even deposits dazzle. slyly express packages haggle sl +4613|1315|O|265437.03|1998-03-05|3-MEDIUM|Clerk#000000541|0|furiously blithely pending dependen +4614|596|O|187916.73|1996-04-22|1-URGENT|Clerk#000000974|0| sauternes wake thinly special accounts. fur +4615|286|F|19198.41|1993-08-27|3-MEDIUM|Clerk#000000982|0|jole after the fluffily pending foxes. packages affix carefully acco +4640|955|O|110296.53|1996-01-01|5-LOW|Clerk#000000902|0|requests. deposits do detect above the blithely iron +4641|1334|F|165285.20|1993-01-20|4-NOT SPECIFIED|Clerk#000000755|0|ronic, final requests integrate slyly: specia +4642|1474|F|187642.74|1995-02-27|1-URGENT|Clerk#000000295|0|cial requests wake carefully around the regular, unusual ideas. furi +4643|667|O|84614.35|1995-06-30|2-HIGH|Clerk#000000292|0|ously regular packages. unusual, special platel +4644|935|O|127086.51|1998-01-17|5-LOW|Clerk#000000961|0|requests. fluffily even ideas bo +4645|434|F|329585.38|1994-09-20|1-URGENT|Clerk#000000764|0|fully even instructions. final gifts sublate quickly final requests. bl +4646|826|O|179979.78|1996-06-18|1-URGENT|Clerk#000000036|0|n place of the blithely qu +4647|265|F|147711.77|1994-05-14|3-MEDIUM|Clerk#000000626|0|out the deposits. slyly final pinto beans haggle idly. slyly s +4672|788|O|303147.86|1995-11-07|1-URGENT|Clerk#000000475|0|lyly final dependencies caj +4673|820|O|56339.98|1996-08-13|4-NOT SPECIFIED|Clerk#000000914|0|c deposits are slyly. bravely ironic deposits cajole carefully after the +4674|364|F|160248.90|1994-04-19|1-URGENT|Clerk#000000122|0|careful hockey players. carefully pending deposits caj +4675|860|F|100736.18|1993-11-25|4-NOT SPECIFIED|Clerk#000000741|0|al deposits haggle slyly final +4676|133|O|221378.75|1995-09-01|2-HIGH|Clerk#000000407|0|s. slyly bold accounts sleep furiously special +4677|382|O|29459.53|1998-02-21|3-MEDIUM|Clerk#000000245|0|ly pending deposits after the carefully regular foxes sleep blithely after t +4678|866|O|191622.17|1998-08-02|4-NOT SPECIFIED|Clerk#000000175|0|side of the bold platelets detect slyly blithely ironic e +4679|865|F|11866.57|1993-01-20|2-HIGH|Clerk#000000905|0|ely regular accounts affix slyly. final dolphins are. furiously final de +4704|13|O|101152.73|1996-08-16|4-NOT SPECIFIED|Clerk#000000256|0|lithely final requests about the fluffily regular +4705|979|F|248055.57|1992-03-22|4-NOT SPECIFIED|Clerk#000000522|0| special instructions poa +4706|238|F|144370.16|1992-12-29|4-NOT SPECIFIED|Clerk#000000722|0| packages above the never regular packages nag packages. deposits c +4707|893|F|74828.14|1995-02-27|2-HIGH|Clerk#000000943|0|ully enticing accounts behind the regular +4708|832|F|96314.41|1994-10-01|1-URGENT|Clerk#000000383|0|ly thinly even accounts. unusu +4709|256|O|69810.47|1996-01-08|3-MEDIUM|Clerk#000000785|0|he furiously even deposits! ironic theodolites haggle blithely. r +4710|985|F|120729.41|1994-12-08|4-NOT SPECIFIED|Clerk#000000734|0|the final, regular foxes. carefully ironic pattern +4711|1417|O|162618.22|1998-05-06|1-URGENT|Clerk#000000818|0|mptotes. unusual packages wake furiously qui +4736|1378|O|88659.44|1995-11-20|2-HIGH|Clerk#000000563|0|blithely regular courts affix into the carefully ironic deposits. slyly exp +4737|787|F|102138.81|1993-03-11|4-NOT SPECIFIED|Clerk#000000275|0|ents use slyly among the unusual, ironic pearls. furiously pending +4738|43|F|248132.99|1992-04-08|2-HIGH|Clerk#000000150|0|deposits. thin acco +4739|1472|F|116385.48|1993-02-21|5-LOW|Clerk#000000872|0|ing to the pending attainments: pending, express account +4740|677|O|51361.39|1996-07-05|2-HIGH|Clerk#000000420|0| dependencies haggle about the +4741|1270|F|261434.58|1992-07-07|4-NOT SPECIFIED|Clerk#000000983|0|ly bold deposits are slyly about the r +4742|637|P|249116.09|1995-03-23|3-MEDIUM|Clerk#000000058|0|n packages. quickly regular ideas cajole blithely +4743|967|F|98430.47|1993-03-31|5-LOW|Clerk#000000048|0|pinto beans above the bold, even idea +4768|1351|F|6485.65|1993-11-22|2-HIGH|Clerk#000000875|0|ctions snooze idly beneath the quick waters. fluffily u +4769|1205|P|202053.23|1995-04-14|4-NOT SPECIFIED|Clerk#000000116|0|pon the asymptotes. idle, final account +4770|589|O|96758.59|1995-06-20|2-HIGH|Clerk#000000461|0|cial instructions believe carefully. +4771|943|F|58304.87|1992-12-14|1-URGENT|Clerk#000000571|0|lly express deposits serve furiously along the f +4772|277|F|106724.51|1994-09-14|1-URGENT|Clerk#000000708|0|es sleep. regular requests haggle furiously slyly +4773|1213|O|278107.39|1995-12-23|1-URGENT|Clerk#000000327|0|ptotes was slyly along the +4774|508|F|186430.13|1993-04-20|3-MEDIUM|Clerk#000000299|0|eposits use blithely bold deposits. carefully regular gifts about the fin +4775|1273|O|141549.59|1995-08-13|4-NOT SPECIFIED|Clerk#000000609|0|s integrate slyly slyly final instructions. carefully bold pack +4800|352|F|135654.46|1992-01-06|5-LOW|Clerk#000000625|0|ggle furiously along the pending pinto beans. deposits use: final foxe +4801|874|O|168339.96|1996-01-25|1-URGENT|Clerk#000000553|0|r the final sentiments. pending theodolites sleep doggedly across t +4802|1288|O|8238.68|1997-01-23|3-MEDIUM|Clerk#000000400|0| ironic, thin packages wake furiously ironic, ironic deposits. the +4803|1234|O|249267.51|1996-02-08|5-LOW|Clerk#000000892|0|lly unusual courts are ironic +4804|358|F|148287.00|1992-01-28|2-HIGH|Clerk#000000614|0|ly final accounts. blithely unusual theodolite +4805|149|F|238156.01|1992-04-25|4-NOT SPECIFIED|Clerk#000000514|0|even accounts wake furiously slyly final accounts; blithel +4806|53|F|44638.95|1993-04-21|5-LOW|Clerk#000000625|0|ave accounts. furiously pending wa +4807|526|O|184759.45|1997-01-09|3-MEDIUM|Clerk#000000310|0|kly. slyly special accounts +4832|340|O|106440.70|1997-12-04|3-MEDIUM|Clerk#000000548|0|final accounts sleep among the blithe +4833|1319|O|94940.36|1996-05-12|3-MEDIUM|Clerk#000000256|0|r deposits against the slyly final excuses slee +4834|178|O|175765.87|1996-09-12|2-HIGH|Clerk#000000284|0|lar accounts. furiously ironic accounts haggle slyly +4835|1451|F|102173.80|1994-10-25|1-URGENT|Clerk#000000250|0|s integrate furiously blithely expr +4836|643|O|110667.95|1996-12-18|1-URGENT|Clerk#000000691|0|c packages cajole carefully through the accounts. careful +4837|1282|O|109203.24|1998-04-24|4-NOT SPECIFIED|Clerk#000000517|0|n accounts are regular, bold accounts. even instructions use request +4838|436|F|77558.81|1992-08-02|1-URGENT|Clerk#000000569|0|ffily bold sentiments. carefully close dolphins cajole across the +4839|244|F|107759.92|1994-05-10|1-URGENT|Clerk#000000925|0| even somas. slyly express ideas lose carefully. blithely unusu +4864|863|F|192178.70|1992-11-11|5-LOW|Clerk#000000423|0|ests nag within the quickly ironic asymptotes. ironic +4865|839|O|250988.92|1997-06-07|3-MEDIUM|Clerk#000000418|0|sits boost stealthily above the bl +4866|530|O|29343.32|1997-08-07|2-HIGH|Clerk#000000663|0|kages. unusual packages nag fluffily. qui +4867|82|F|15931.91|1992-05-21|1-URGENT|Clerk#000000891|0|ss the slyly regular dependencies. fluffily regular deposits within the car +4868|745|O|253228.69|1997-03-02|5-LOW|Clerk#000000729|0|regular asymptotes. regular packages sublate carefully al +4869|568|F|232130.29|1994-09-26|5-LOW|Clerk#000000802|0|boost! ironic packages un +4870|1016|F|140038.23|1994-08-06|3-MEDIUM|Clerk#000000911|0|nto beans about the blithely regular d +4871|448|O|172274.73|1995-06-12|1-URGENT|Clerk#000000531|0|ven, special instructions across t +4896|850|F|131264.74|1992-08-22|1-URGENT|Clerk#000000622|0|sly pending deposits. final accounts boost above the sly, even +4897|800|F|155933.30|1992-09-17|5-LOW|Clerk#000000184|0|s. bold pinto beans sleep. evenly final accounts daz +4898|137|F|67478.88|1994-07-11|4-NOT SPECIFIED|Clerk#000000841|0|final patterns. special theodolites haggle ruthlessly at the blithely spec +4899|601|F|16204.30|1993-10-18|4-NOT SPECIFIED|Clerk#000000348|0| instructions. furiously even packages are furiously speci +4900|1361|F|241094.13|1992-06-30|4-NOT SPECIFIED|Clerk#000000878|0|sleep quickly unusual +4901|790|O|178383.88|1997-12-31|4-NOT SPECIFIED|Clerk#000000980|0|inal dependencies cajole furiously. carefully express accounts na +4902|1372|O|44050.73|1998-07-04|3-MEDIUM|Clerk#000000874|0| the slyly express dolphins. +4903|920|F|39360.53|1992-03-22|4-NOT SPECIFIED|Clerk#000000907|0|yly. multipliers within the fo +4928|22|F|92223.13|1993-10-04|4-NOT SPECIFIED|Clerk#000000952|0|slyly brave instructions after the ironic excuses haggle ruthlessly about +4929|1492|O|198278.90|1996-02-29|3-MEDIUM|Clerk#000000109|0|uests. furiously special ideas poach. pending +4930|1483|F|264157.22|1994-05-06|5-LOW|Clerk#000000593|0| haggle slyly quietly final theodolites. packages are furious +4931|496|F|170930.79|1994-11-17|1-URGENT|Clerk#000000356|0|leep. slyly express dolphins nag slyly. furiously regular s +4932|1219|F|60768.93|1993-08-10|1-URGENT|Clerk#000000830|0|onic foxes. enticingly reg +4933|925|O|56755.81|1995-07-14|3-MEDIUM|Clerk#000000848|0|y special sauternes integr +4934|382|O|254375.72|1997-02-17|1-URGENT|Clerk#000000372|0|nes cajole; carefully special accounts haggle. special pinto beans nag +4935|400|F|225832.93|1993-05-25|4-NOT SPECIFIED|Clerk#000000601|0|c foxes. fluffily pendin +4960|1228|F|204893.89|1995-02-26|5-LOW|Clerk#000000229|0|uriously even excuses. fluffily regular instructions along the furiously ironi +4961|574|O|131816.39|1998-04-06|3-MEDIUM|Clerk#000000731|0| braids. furiously even theodolites +4962|1037|F|52829.69|1993-07-28|3-MEDIUM|Clerk#000000008|0| breach never ironic +4963|329|O|83635.70|1996-11-07|3-MEDIUM|Clerk#000000754|0|ully unusual epitaphs nod s +4964|1003|O|285003.26|1997-07-28|4-NOT SPECIFIED|Clerk#000000144|0|ithely final theodolites. blithely regu +4965|518|F|123088.54|1993-10-21|5-LOW|Clerk#000000638|0|dependencies poach packages. sometim +4966|688|O|80899.69|1996-09-07|2-HIGH|Clerk#000000243|0|accounts. blithely ironic courts wake boldly furiously express +4967|976|O|161892.72|1997-02-17|3-MEDIUM|Clerk#000000397|0|e theodolites; furiously b +4992|613|F|291161.83|1992-05-10|1-URGENT|Clerk#000000166|0|telets nag carefully am +4993|112|F|194811.83|1994-08-04|4-NOT SPECIFIED|Clerk#000000258|0|ing instructions nag furiously. un +4994|425|O|315464.22|1996-06-29|4-NOT SPECIFIED|Clerk#000000868|0|oxes wake above the asymptotes. bold requests sleep br +4995|388|O|259750.37|1996-01-06|4-NOT SPECIFIED|Clerk#000000748|0|s. even deposits boost along the express, even theodolites. stealthily ir +4996|1330|F|139500.09|1992-09-14|3-MEDIUM|Clerk#000000433|0|foxes. carefully special packages haggle quickly fluffi +4997|463|O|179285.35|1998-03-18|5-LOW|Clerk#000000040|0|egrate final pinto beans. fluffily special notornis use blith +4998|319|F|196035.93|1992-01-11|4-NOT SPECIFIED|Clerk#000000054|0|alongside of the quickly final requests hang always +4999|844|F|135073.82|1993-06-26|2-HIGH|Clerk#000000504|0| dolphins cajole blithely above the sly +5024|1222|O|148461.38|1996-10-25|3-MEDIUM|Clerk#000000659|0|r foxes. regular excuses are about the quickly regular theodolites. regular, +5025|1198|O|29882.15|1997-02-03|5-LOW|Clerk#000000805|0|ackages are slyly about the quickly +5026|271|O|24577.34|1997-09-06|1-URGENT|Clerk#000000955|0|y final requests us +5027|1463|O|273265.90|1997-08-30|2-HIGH|Clerk#000000751|0|e-- final, pending requests along t +5028|116|F|44919.14|1992-04-17|2-HIGH|Clerk#000000180|0|ickly blithely express deposits. b +5029|104|F|28069.92|1992-11-14|3-MEDIUM|Clerk#000000469|0|. regular accounts haggle slyly. regul +5030|1057|O|106018.58|1998-05-25|4-NOT SPECIFIED|Clerk#000000564|0| wake slyly furiously thin requests. ironic pinto beans ha +5031|1381|F|135672.76|1994-12-02|3-MEDIUM|Clerk#000000788|0|lar instructions haggle blithely pending foxes? sometimes final excuses h +5056|508|O|108095.49|1997-02-15|5-LOW|Clerk#000000828|0|lithely above the express ideas. blithely final deposits are fluffily spec +5057|640|O|91744.27|1997-08-03|1-URGENT|Clerk#000000955|0|r ironic requests of the carefully ironic dependencies wake slyly a +5058|1190|O|28461.94|1998-03-23|1-URGENT|Clerk#000000367|0| the pending packages wake after the quickly speci +5059|413|F|102772.50|1993-11-10|2-HIGH|Clerk#000000058|0|latelets. final, regular accounts cajole furiously ironic pinto beans? do +5060|1111|F|85197.05|1992-07-07|4-NOT SPECIFIED|Clerk#000000333|0|e according to the excuses. express theodo +5061|1006|F|72555.51|1993-08-14|1-URGENT|Clerk#000000009|0|e packages use fluffily according to the carefully ironic deposits. bol +5062|598|F|157769.50|1992-10-08|3-MEDIUM|Clerk#000000012|0|ithely. blithely bold theodolites affix. blithely final deposits haggle ac +5063|224|O|133623.15|1997-05-17|2-HIGH|Clerk#000000745|0|lyly after the pending foxes. express theodolites breach across t +5088|1294|F|160391.21|1993-01-06|5-LOW|Clerk#000000930|0|ole slyly since the quickly ironic br +5089|1295|F|137114.54|1992-07-29|1-URGENT|Clerk#000000677|0|cial platelets. quiet, final ideas cajole carefully. unusu +5090|881|O|174101.49|1997-03-09|1-URGENT|Clerk#000000953|0|ress accounts affix silently carefully quick accounts. carefully f +5091|1477|O|81938.11|1998-05-21|3-MEDIUM|Clerk#000000311|0|egular decoys mold carefully fluffily unus +5092|206|O|288758.19|1995-10-30|5-LOW|Clerk#000000194|0|are blithely along the pin +5093|776|F|249888.04|1993-09-03|3-MEDIUM|Clerk#000000802|0|ully ironic theodolites sleep above the furiously ruthless instructions. bli +5094|1051|F|103588.23|1993-03-29|4-NOT SPECIFIED|Clerk#000000406|0|uickly pending deposits haggle quickly ide +5095|952|F|275920.02|1992-04-22|2-HIGH|Clerk#000000964|0|accounts are carefully! slyly even packages wake slyly a +5120|155|O|33217.93|1996-06-05|1-URGENT|Clerk#000000332|0|against the slyly express requests. furiousl +5121|1328|F|229899.02|1992-05-11|4-NOT SPECIFIED|Clerk#000000736|0|gular requests. furiously final pearls against the permanent, thin courts s +5122|688|O|131621.44|1996-02-10|5-LOW|Clerk#000000780|0|blithely. slyly ironic deposits nag. excuses s +5123|97|O|14822.35|1998-02-10|1-URGENT|Clerk#000000776|0|ic requests. furiously ironic packages grow above the express, ironic inst +5124|238|O|209658.77|1997-04-04|4-NOT SPECIFIED|Clerk#000000749|0|kly even courts. bold packages solve. +5125|274|O|41954.76|1998-02-07|5-LOW|Clerk#000000834|0|ructions. dolphins wake slowly carefully unusual +5126|1120|F|110348.46|1992-10-12|4-NOT SPECIFIED|Clerk#000000270|0|s. unusual deposits +5127|722|O|59050.89|1997-01-15|5-LOW|Clerk#000000829|0|fully express pinto beans. slyly final accounts along the ironic dugouts use s +5152|433|O|70131.25|1997-01-04|3-MEDIUM|Clerk#000000963|0| for the blithely reg +5153|1124|O|256816.81|1995-08-26|1-URGENT|Clerk#000000954|0| the furiously ironic foxes. express packages shall cajole carefully across +5154|79|O|40583.07|1997-04-13|3-MEDIUM|Clerk#000000316|0|inal requests. slyly regular deposits nag. even deposits haggle agains +5155|763|F|99230.28|1994-06-12|2-HIGH|Clerk#000000108|0|y pending deposits are ag +5156|1249|O|72450.53|1996-11-04|5-LOW|Clerk#000000117|0|ngside of the multipliers solve slyly requests. regu +5157|1412|O|235193.85|1997-07-06|4-NOT SPECIFIED|Clerk#000000689|0|closely above the unusual deposits. furiously +5158|755|O|349464.54|1997-01-21|1-URGENT|Clerk#000000541|0| regular foxes. even foxes wake blithely +5159|1048|O|195720.25|1996-09-25|1-URGENT|Clerk#000000303|0|tegrate slyly around the slyly sly sauternes. final pa +5184|850|O|311131.08|1998-07-20|5-LOW|Clerk#000000250|0|nding accounts detect final, even +5185|1477|O|316890.58|1997-07-25|3-MEDIUM|Clerk#000000195|0| regular ideas about the even ex +5186|520|O|345577.74|1996-08-03|1-URGENT|Clerk#000000332|0|pecial platelets. slyly final ac +5187|538|O|52047.87|1997-07-16|3-MEDIUM|Clerk#000000682|0|ckly according to t +5188|1400|P|96653.92|1995-03-02|4-NOT SPECIFIED|Clerk#000000029|0|counts. finally ironic requests ab +5189|704|F|247112.62|1993-11-26|5-LOW|Clerk#000000940|0|e after the pending accounts. asymptotes boost. re +5190|580|F|146966.67|1992-04-26|5-LOW|Clerk#000000888|0|equests. slyly unusual +5191|770|F|156365.18|1994-12-11|4-NOT SPECIFIED|Clerk#000000318|0|ing, regular deposits alongside of the deposits boost fluffily quickly ev +5216|587|O|27361.79|1997-08-14|3-MEDIUM|Clerk#000000418|0|des boost across the platelets. slyly busy theodolit +5217|349|O|204315.50|1995-10-13|2-HIGH|Clerk#000000873|0|ons might wake quickly according to th +5218|802|F|109453.09|1992-07-30|4-NOT SPECIFIED|Clerk#000000683|0|y ruthless packages according to the bold, ironic package +5219|875|O|22976.04|1997-02-27|1-URGENT|Clerk#000000510|0|aggle always. foxes above the ironic deposits +5220|95|F|43690.73|1992-07-30|2-HIGH|Clerk#000000051|0| final packages. ideas detect slyly around +5221|125|O|82717.41|1995-06-09|4-NOT SPECIFIED|Clerk#000000324|0|lar accounts above the sl +5222|797|F|1406.50|1994-05-27|4-NOT SPECIFIED|Clerk#000000613|0|along the bold ideas. furiously final foxes snoo +5223|1486|F|125739.86|1994-06-30|1-URGENT|Clerk#000000745|0|e. theodolites serve blithely unusual, final foxes. carefully pending packag +5248|697|P|125759.30|1995-04-15|2-HIGH|Clerk#000000737|0|theodolites cajole according to the silent packages. quickly ironic packages a +5249|1019|F|166411.87|1994-09-06|3-MEDIUM|Clerk#000000019|0|refully bold accounts +5250|956|O|48941.36|1995-07-16|2-HIGH|Clerk#000000307|0|. carefully final instructions sleep among the finally regular dependen +5251|340|O|42259.44|1995-04-12|3-MEDIUM|Clerk#000000687|0| ironic dugouts detect. reque +5252|898|O|247519.93|1996-02-17|1-URGENT|Clerk#000000724|0| ironic accounts among the silent asym +5253|1480|P|144724.33|1995-04-11|2-HIGH|Clerk#000000275|0|egular requests! blithely regular deposits alongside of t +5254|1105|F|265744.68|1992-07-26|4-NOT SPECIFIED|Clerk#000000527|0|he express, even ideas cajole blithely special requests +5255|634|O|98826.70|1996-07-12|5-LOW|Clerk#000000591|0|ly slow forges. express foxes haggle. regular, even asymp +5280|329|O|110094.95|1997-12-03|3-MEDIUM|Clerk#000000604|0|riously ironic instructions. ironic ideas according to the accounts boost fur +5281|1240|O|232387.44|1995-11-02|2-HIGH|Clerk#000000158|0|ackages haggle slyly a +5282|499|O|126638.39|1998-01-30|1-URGENT|Clerk#000000030|0|rding to the unusual, bold accounts. regular instructions +5283|1309|F|19969.25|1994-06-04|3-MEDIUM|Clerk#000000579|0|ests. even, final ideas alongside of t +5284|608|O|58961.47|1995-07-09|4-NOT SPECIFIED|Clerk#000000155|0| careful dependencies use sly +5285|700|F|142725.60|1994-01-18|2-HIGH|Clerk#000000976|0|p across the furiously ironic deposits. +5286|1156|O|119200.31|1997-09-26|5-LOW|Clerk#000000606|0|structions are furiously quickly ironic asymptotes. quickly iro +5287|250|F|41064.04|1993-12-22|5-LOW|Clerk#000000406|0|regular packages. bold instructions sleep always. carefully final p +5312|649|F|82451.06|1995-02-24|2-HIGH|Clerk#000000690|0|ter the even, bold foxe +5313|130|O|199395.07|1997-06-17|4-NOT SPECIFIED|Clerk#000000896|0|le. final courts haggle furiously according to the +5314|331|O|29612.61|1995-06-02|2-HIGH|Clerk#000000617|0|ions across the quickly special d +5315|1387|F|84399.32|1992-10-29|4-NOT SPECIFIED|Clerk#000000035|0| furiously. quickly unusual packages use. sly +5316|997|F|68793.55|1994-01-31|1-URGENT|Clerk#000000734|0| requests haggle across the regular, pending deposits. furiously regular requ +5317|367|F|322782.46|1994-09-09|5-LOW|Clerk#000000687|0|jole quickly at the slyly pend +5318|590|F|140892.20|1993-04-04|2-HIGH|Clerk#000000663|0|efully regular dolphins. even ideas nag fluffily furiously even packa +5319|979|O|94253.83|1996-01-21|1-URGENT|Clerk#000000237|0|lent requests. quickly pe +5344|1072|O|139337.42|1998-06-21|3-MEDIUM|Clerk#000000569|0|s. ironic excuses cajole across the +5345|304|O|154585.90|1997-08-24|1-URGENT|Clerk#000000057|0|r the slyly silent packages. pending, even pinto b +5346|367|F|213859.93|1993-12-26|2-HIGH|Clerk#000000220|0|gly close packages against the even, regular escapades boost evenly accordi +5347|478|F|237559.02|1995-02-22|3-MEDIUM|Clerk#000000180|0|onic, regular deposits. packag +5348|524|O|151375.82|1997-11-08|5-LOW|Clerk#000000497|0|totes. accounts after the furiously +5349|670|O|52011.10|1996-09-01|1-URGENT|Clerk#000000960|0|le along the carefully bold dolphins. carefully special packa +5350|745|F|159518.11|1993-10-10|5-LOW|Clerk#000000604|0|ccounts after the carefully pending requests believe +5351|1213|O|91753.68|1998-05-11|1-URGENT|Clerk#000000443|0|to beans sleep furiously after the carefully even +5376|1486|F|166038.52|1994-07-04|5-LOW|Clerk#000000392|0|. quickly ironic deposits integrate along +5377|623|O|162417.75|1997-04-24|2-HIGH|Clerk#000000917|0|ons nag blithely furiously regula +5378|412|F|144404.53|1992-10-25|1-URGENT|Clerk#000000520|0|n ideas. regular accounts haggle. ironic ideas use along the bold ideas. blith +5379|884|O|80830.65|1995-08-08|2-HIGH|Clerk#000000503|0|he unusual accounts. carefully special instructi +5380|1462|O|163456.68|1997-10-12|1-URGENT|Clerk#000000481|0|le slyly about the slyly final dolphins. fu +5381|311|F|309639.39|1993-01-29|5-LOW|Clerk#000000531|0|arefully bold packages are slyly furiously ironic foxes. fluffil +5382|344|F|177903.56|1992-01-13|5-LOW|Clerk#000000809|0|lent deposits are according to the reg +5383|308|O|21345.98|1995-05-26|5-LOW|Clerk#000000409|0|ly bold requests hang furiously furiously unusual accounts. evenly unusu +5408|223|F|175098.30|1992-07-21|5-LOW|Clerk#000000735|0|egular requests according to the +5409|127|F|190710.92|1992-01-09|5-LOW|Clerk#000000171|0|eans. regular accounts are regul +5410|202|O|152792.92|1998-07-28|4-NOT SPECIFIED|Clerk#000000117|0|final deposits: pending excuses boost. ironic theodolites cajole furi +5411|598|O|81721.30|1997-05-16|3-MEDIUM|Clerk#000000800|0|equests cajole slyly furious +5412|1408|O|186066.37|1998-01-20|2-HIGH|Clerk#000000151|0|ets boost furiously regular accounts. regular foxes above th +5413|940|O|275955.54|1997-10-17|1-URGENT|Clerk#000000066|0|e even excuses. always final depen +5414|995|F|229650.28|1993-03-25|4-NOT SPECIFIED|Clerk#000000242|0|lent dependencies? carefully express requests sleep furiously ac +5415|221|F|204898.67|1992-08-05|3-MEDIUM|Clerk#000000998|0|ly even ideas nag blithely above the final instructions +5440|1291|O|3309.00|1997-01-12|1-URGENT|Clerk#000000154|0|posits boost regularly ironic packages. regular, ironic deposits wak +5441|401|F|179096.05|1994-07-21|4-NOT SPECIFIED|Clerk#000000257|0|after the furiously ironic +5442|413|O|204762.90|1998-01-13|4-NOT SPECIFIED|Clerk#000000954|0|ully. quickly express accounts against the +5443|1306|O|203531.90|1996-10-10|4-NOT SPECIFIED|Clerk#000000492|0|al foxes could detect. blithely stealthy asymptotes kind +5444|1288|P|247984.02|1995-03-18|1-URGENT|Clerk#000000677|0| asymptotes. asymptotes cajole quickly quickly bo +5445|1150|F|144557.32|1993-07-26|5-LOW|Clerk#000000623|0|s. even, special requests cajole furiously even, +5446|56|F|49289.08|1994-06-21|5-LOW|Clerk#000000304|0| furiously final pac +5447|130|O|54828.65|1996-03-16|3-MEDIUM|Clerk#000000597|0|uternes around the furiously bold accounts wake after +5472|686|F|349883.98|1993-04-11|5-LOW|Clerk#000000552|0|counts. deposits about the slyly dogged pinto beans cajole slyly +5473|641|F|88121.08|1992-03-25|4-NOT SPECIFIED|Clerk#000000306|0|te the quickly stealthy ideas. even, regular deposits above +5474|538|F|217534.09|1992-06-01|4-NOT SPECIFIED|Clerk#000000487|0|gle blithely enticing ideas. final, exp +5475|1372|O|16971.18|1996-07-07|5-LOW|Clerk#000000856|0|es shall boost slyly. furiously even deposits lose. instruc +5476|898|O|35392.02|1997-11-06|1-URGENT|Clerk#000000189|0|furiously final ideas. furiously bold dependencies sleep care +5477|1061|O|198571.43|1997-12-30|5-LOW|Clerk#000000689|0|ckages. ironic deposits caj +5478|1153|O|102065.07|1996-05-17|1-URGENT|Clerk#000000272|0|ckages. quickly pending deposits thrash furiously: bl +5479|697|F|81438.25|1993-12-22|3-MEDIUM|Clerk#000000335|0|ng asymptotes. pinto beans sleep care +5504|178|F|60408.91|1993-01-06|2-HIGH|Clerk#000000221|0|y pending packages. furiousl +5505|943|O|207951.17|1997-10-04|5-LOW|Clerk#000000719|0| final, regular packages according to the slyly ironic accounts nag ironica +5506|907|F|11496.86|1993-11-08|1-URGENT|Clerk#000000292|0|nusual theodolites. sly +5507|17|O|176100.92|1998-05-28|5-LOW|Clerk#000000692|0|the carefully ironic instructions are quickly iro +5508|557|O|4010.45|1996-06-21|1-URGENT|Clerk#000000128|0|y express packages cajole furiously. slyly unusual requests +5509|793|F|235588.34|1994-04-08|5-LOW|Clerk#000000164|0|usual deposits use packages. furiously final requests wake slyly about th +5510|361|F|163179.38|1993-01-08|3-MEDIUM|Clerk#000000819|0| nag slyly. carefully eve +5511|773|F|191746.63|1994-11-29|1-URGENT|Clerk#000000438|0|ng instructions integrate fluffily among the fluffily silent accounts. bli +5536|1151|O|161021.95|1998-03-16|4-NOT SPECIFIED|Clerk#000000076|0| carefully final dolphins. ironic, ironic deposits lose. bold, +5537|1178|O|157429.58|1996-10-03|3-MEDIUM|Clerk#000000742|0|ng to the daring, final +5538|1384|F|119417.57|1993-12-25|1-URGENT|Clerk#000000992|0|ttainments. slyly final ideas are about the furiously silent excuses. +5539|1189|F|63099.20|1994-07-31|5-LOW|Clerk#000000675|0|structions. slyly regular patterns solve above the carefully expres +5540|1285|O|144175.37|1996-10-12|4-NOT SPECIFIED|Clerk#000000120|0|y ironic packages cajole blithely +5541|1423|O|69883.38|1997-09-30|3-MEDIUM|Clerk#000000217|0|encies among the silent accounts sleep slyly quickly pending deposits +5542|481|O|10491.88|1996-04-20|4-NOT SPECIFIED|Clerk#000000100|0|riously among the regularly regular pac +5543|1150|F|165445.62|1993-09-25|3-MEDIUM|Clerk#000000644|0|ckly regular epitaphs. carefully bold accounts haggle furiously +5568|295|O|164846.25|1995-06-07|3-MEDIUM|Clerk#000000491|0| nag. fluffily pending de +5569|1088|F|183119.70|1993-04-30|4-NOT SPECIFIED|Clerk#000000759|0|e regular dependencies. furiously unusual ideas b +5570|1106|O|114869.30|1996-08-12|2-HIGH|Clerk#000000795|0|eans. ironic, even requests doze +5571|1021|F|130352.45|1992-12-19|4-NOT SPECIFIED|Clerk#000000184|0|ts cajole furiously carefully regular sheaves. un +5572|73|F|236455.84|1994-07-17|2-HIGH|Clerk#000000163|0|e fluffily express deposits cajole slyly across th +5573|358|O|200471.60|1996-08-15|3-MEDIUM|Clerk#000000055|0|lites. slyly final pinto beans about the carefully regul +5574|268|F|194685.04|1992-03-10|4-NOT SPECIFIED|Clerk#000000002|0|n deposits. special, regular t +5575|1012|O|71308.78|1995-07-24|5-LOW|Clerk#000000948|0|uriously express frays breach +5600|941|O|77497.53|1997-02-08|4-NOT SPECIFIED|Clerk#000000019|0|lly regular deposits. car +5601|110|F|175212.24|1992-01-06|2-HIGH|Clerk#000000827|0|gular deposits wake platelets? blithe +5602|1294|O|108142.13|1997-07-30|3-MEDIUM|Clerk#000000395|0|onic asymptotes haggl +5603|703|F|205166.88|1992-06-20|4-NOT SPECIFIED|Clerk#000000535|0| asymptotes. fluffily ironic instructions are. pending pinto bean +5604|443|O|124425.17|1998-04-14|4-NOT SPECIFIED|Clerk#000000123|0|ously across the blithely ironic pinto beans. sile +5605|346|O|278023.41|1996-08-22|2-HIGH|Clerk#000000538|0|sleep carefully final packages. dependencies wake slyly. theodol +5606|1486|O|330692.08|1996-11-12|5-LOW|Clerk#000000688|0|uriously express pinto beans. packages sh +5607|911|F|29084.44|1992-01-01|4-NOT SPECIFIED|Clerk#000000137|0|c requests promise quickly fluffily ironic deposits. caref +5632|784|O|106861.13|1996-02-05|1-URGENT|Clerk#000000508|0|ons. blithely pending pinto beans thrash. furiously busy theodoli +5633|775|O|302286.82|1998-05-31|3-MEDIUM|Clerk#000000841|0|cial deposits wake final, final +5634|677|O|147338.82|1996-07-31|3-MEDIUM|Clerk#000000915|0|out the accounts. carefully ironic ideas are slyly. sheaves could h +5635|686|F|273995.47|1992-08-16|3-MEDIUM|Clerk#000000734|0|nal platelets sleep daringly. idle, final accounts about +5636|1214|F|200472.48|1995-02-16|3-MEDIUM|Clerk#000000916|0|. boldly even Tiresias sleep. blithely ironic packages among the ca +5637|1030|O|194938.85|1996-06-17|3-MEDIUM|Clerk#000000183|0|nic dolphins are regular packages. ironic pinto beans hagg +5638|1078|F|104992.42|1994-01-17|1-URGENT|Clerk#000000355|0|enly bold deposits eat. special realms play against the regular, speci +5639|1450|F|13962.03|1994-06-02|3-MEDIUM|Clerk#000000005|0|ending packages use after the blithely regular accounts. regular package +5664|1186|O|241226.07|1998-07-23|2-HIGH|Clerk#000000789|0|the quickly ironic dolp +5665|994|F|162407.28|1993-06-28|4-NOT SPECIFIED|Clerk#000000513|0| carefully special instructions. ironic pinto beans nag slyly blithe +5666|139|F|158442.98|1994-02-02|2-HIGH|Clerk#000000396|0|mptotes. quickly final instructions are +5667|434|O|48054.70|1995-08-10|1-URGENT|Clerk#000000358|0|s print upon the quickly ironic packa +5668|1088|F|14179.13|1995-03-22|4-NOT SPECIFIED|Clerk#000000047|0|p slyly slyly express accoun +5669|736|O|168537.13|1996-05-06|1-URGENT|Clerk#000000336|0|ng packages nag fluffily furio +5670|64|F|153552.69|1993-04-21|5-LOW|Clerk#000000922|0|he carefully final packages. deposits are slyly among the requests. +5671|418|O|195159.38|1998-02-06|2-HIGH|Clerk#000000838|0|k dependencies. slyly +5696|1411|P|274605.94|1995-05-04|1-URGENT|Clerk#000000447|0|e quickly unusual pack +5697|541|F|136651.75|1992-10-05|1-URGENT|Clerk#000000112|0|pendencies impress furiously. bold, final requests solve ab +5698|943|F|204527.94|1994-05-21|3-MEDIUM|Clerk#000000455|0|he furiously silent accounts haggle blithely against the carefully unusual +5699|1414|F|300221.03|1992-07-30|5-LOW|Clerk#000000311|0|o beans. ironic asymptotes boost. blithe, final courts integrate +5700|1427|O|97397.92|1997-12-25|1-URGENT|Clerk#000000618|0|ly pending dolphins sleep carefully slyly pending i +5701|421|O|25111.71|1997-02-07|5-LOW|Clerk#000000798|0| blithely final pinto beans. blit +5702|967|F|235263.35|1993-09-07|4-NOT SPECIFIED|Clerk#000000743|0|ironic accounts. final accounts wake express deposits. final pac +5703|1196|F|3268.07|1993-05-16|3-MEDIUM|Clerk#000000647|0|ly special instructions. slyly even reque +5728|793|F|120489.88|1994-12-11|4-NOT SPECIFIED|Clerk#000000426|0|furiously express pin +5729|434|F|93102.37|1994-10-10|2-HIGH|Clerk#000000843|0|uffily sly accounts about +5730|110|O|18116.22|1997-12-18|1-URGENT|Clerk#000000181|0|l platelets. ironic pinto beans wake slyly. quickly b +5731|79|O|80961.79|1997-05-17|5-LOW|Clerk#000000841|0| silent excuses among the express accounts wake +5732|352|O|35016.82|1997-08-03|1-URGENT|Clerk#000000910|0|he quickly bold asymptotes: final platelets wake quickly. blithely final pinto +5733|1003|F|50786.52|1993-03-17|2-HIGH|Clerk#000000873|0|osits. pending accounts boost quickly. furiously permanent acco +5734|925|O|71965.89|1997-10-12|3-MEDIUM|Clerk#000000084|0|efully even braids detect blithely alo +5735|395|F|61436.03|1994-12-11|3-MEDIUM|Clerk#000000600|0| bold realms cajole slyly fu +5760|241|F|68043.47|1994-05-25|4-NOT SPECIFIED|Clerk#000000498|0|s among the blithely regular frays haggle ironically bold theodolites. al +5761|151|O|184256.14|1998-07-06|3-MEDIUM|Clerk#000000208|0|s asymptotes cajole boldly. regular, +5762|481|O|217243.20|1997-02-14|1-URGENT|Clerk#000000901|0|ly bold packages: slyly ironic deposits sleep quietly foxes. express a +5763|74|O|165052.79|1998-06-26|4-NOT SPECIFIED|Clerk#000000633|0|according to the furiously regular pinto beans. even accounts wake fu +5764|1306|F|68406.47|1993-10-03|4-NOT SPECIFIED|Clerk#000000363|0| furiously regular deposits haggle fluffily around th +5765|518|F|354366.71|1994-12-15|5-LOW|Clerk#000000959|0|longside of the quickly final packages. instructions so +5766|476|F|62642.11|1993-09-27|5-LOW|Clerk#000000753|0|. quickly final packages print slyly. fu +5767|1174|F|204654.62|1992-04-29|2-HIGH|Clerk#000000225|0|ts wake fluffily above the r +5792|256|F|216427.94|1993-04-04|2-HIGH|Clerk#000000731|0|packages. doggedly bold deposits integrate furiously across the +5793|362|O|169572.44|1997-07-13|2-HIGH|Clerk#000000294|0|thely. fluffily even instructi +5794|80|F|152918.94|1993-04-05|5-LOW|Clerk#000000855|0|t accounts kindle about the gifts. as +5795|368|F|59513.90|1992-05-05|2-HIGH|Clerk#000000581|0| even instructions x-ray ironic req +5796|1493|O|35978.09|1996-01-23|3-MEDIUM|Clerk#000000326|0|eodolites. slyly ironic pinto beans at the silent, special request +5797|1216|O|24070.20|1997-10-15|4-NOT SPECIFIED|Clerk#000000381|0|ng! packages against the blithely b +5798|1057|O|149833.20|1998-03-30|5-LOW|Clerk#000000343|0|lent accounts affix quickly! platelets run slyly slyly final packages. f +5799|260|O|133862.33|1995-08-03|1-URGENT|Clerk#000000238|0| unusual deposits sleep blithely along the carefully even requests. care +5824|556|O|255277.52|1996-12-03|2-HIGH|Clerk#000000171|0|unusual packages. even ideas along the even requests are along th +5825|607|F|32267.34|1995-02-21|5-LOW|Clerk#000000494|0|regular packages use bravely. +5826|217|O|32370.45|1998-06-13|1-URGENT|Clerk#000000087|0|even, regular dependenc +5827|305|O|179433.51|1998-07-23|3-MEDIUM|Clerk#000000660|0|hely furiously blithe dolphins. slyly +5828|1270|F|77774.16|1994-03-06|5-LOW|Clerk#000000377|0|ages boost never during the final packa +5829|1246|O|274279.62|1997-01-11|1-URGENT|Clerk#000000196|0|gular accounts. bold accounts are blithely furiously ironic r +5830|836|F|39788.96|1993-03-25|3-MEDIUM|Clerk#000000233|0|lites haggle. ironic, ironic instructions maintain blit +5831|1387|O|159764.61|1996-11-17|5-LOW|Clerk#000000585|0|s final, final pinto beans. unusual depos +5856|361|F|95904.56|1994-11-06|2-HIGH|Clerk#000000634|0|special excuses. slyly final theodolites cajole blithely furiou +5857|1231|O|263158.48|1997-11-06|4-NOT SPECIFIED|Clerk#000000267|0|gage blithely. quickly special ac +5858|625|F|227582.06|1992-07-14|4-NOT SPECIFIED|Clerk#000000580|0|lyly pending dugouts believe through the ironic deposits. silent s +5859|43|O|320141.27|1997-04-23|1-URGENT|Clerk#000000993|0|requests boost. asymptotes across the deposits solve slyly furiously pendin +5860|127|F|14002.56|1992-02-20|4-NOT SPECIFIED|Clerk#000000079|0| beans. bold, special foxes sleep about the ir +5861|1387|O|69464.42|1997-04-10|3-MEDIUM|Clerk#000000094|0|rthogs cajole slyly. express packages sleep blithely final +5862|628|O|30940.39|1997-02-20|1-URGENT|Clerk#000000039|0|leep beneath the quickly busy excuses. ironic theodolit +5863|641|F|96316.78|1993-11-22|3-MEDIUM|Clerk#000000774|0|ets about the slyly pending ideas sleep according to the blithely +5888|448|O|92148.63|1996-09-28|3-MEDIUM|Clerk#000000748|0|quickly against the furiously final requests. evenly fi +5889|209|O|26237.34|1995-05-23|5-LOW|Clerk#000000690|0|ites wake across the slyly ironic +5890|487|F|41609.58|1992-11-04|2-HIGH|Clerk#000000013|0|packages. final, final reques +5891|452|F|68375.28|1992-12-29|3-MEDIUM|Clerk#000000302|0|ounts haggle furiously abo +5892|1003|P|122565.47|1995-05-09|5-LOW|Clerk#000000639|0| pending instruction +5893|19|F|53359.53|1992-07-08|4-NOT SPECIFIED|Clerk#000000560|0|final sentiments. instructions boost above the never speci +5894|703|F|107123.24|1994-08-13|2-HIGH|Clerk#000000776|0|regular deposits wake +5895|622|O|284265.76|1997-01-01|4-NOT SPECIFIED|Clerk#000000747|0| ironic, unusual requests cajole blithely special, special deposits. s +5920|1189|F|227213.95|1994-11-20|2-HIGH|Clerk#000000081|0|ns: even ideas cajole slyly among the packages. never ironic patterns +5921|571|F|224503.60|1994-04-07|5-LOW|Clerk#000000125|0|kly special requests breach. +5922|1426|O|224288.29|1996-11-14|5-LOW|Clerk#000000625|0| ironic instructions haggle furiously blithely regular accounts: even platele +5923|1003|O|220218.91|1997-05-27|2-HIGH|Clerk#000000304|0|o beans haggle slyly above the regular, even dependencies +5924|305|O|154229.85|1995-10-10|3-MEDIUM|Clerk#000000433|0|arefully after the pains. blithely ironic pinto +5925|1453|O|373674.80|1995-11-13|5-LOW|Clerk#000000602|0|ourts. boldly regular foxes might sleep. slyly express tithes against +5926|748|F|146768.49|1994-05-20|5-LOW|Clerk#000000071|0| carefully after the furiously even re +5927|1153|O|136294.71|1997-08-28|4-NOT SPECIFIED|Clerk#000000972|0|endencies according to the slyly ironic foxes detect furiously about the furio +5952|1462|O|209693.87|1997-04-14|3-MEDIUM|Clerk#000000950|0| regular, final pla +5953|58|F|117651.40|1992-03-28|1-URGENT|Clerk#000000049|0|ages are furiously. slowly bold requests +5954|268|F|282400.28|1992-12-03|1-URGENT|Clerk#000000968|0|requests along the blith +5955|922|P|79722.29|1995-03-27|5-LOW|Clerk#000000340|0|deas integrate. fluffily regular pa +5956|208|O|166980.55|1998-05-18|1-URGENT|Clerk#000000587|0|le even, express platelets. +5957|883|F|312733.08|1993-12-27|2-HIGH|Clerk#000000020|0| dependencies are slyly. bold accounts according to the carefully regular r +5958|1141|O|191632.81|1995-09-16|3-MEDIUM|Clerk#000000787|0|e final requests detect alongside of the qu +5959|230|F|253103.52|1992-05-15|3-MEDIUM|Clerk#000000913|0|into beans use ironic, unusual foxes. carefully regular excuses boost caref +5984|688|F|114443.53|1994-06-18|5-LOW|Clerk#000000023|0|ickly final pains haggle along the furiously ironic pinto bea +5985|1430|F|7032.58|1995-01-12|3-MEDIUM|Clerk#000000417|0|as nag fluffily slyly permanent accounts. regular depo +5986|1147|F|157431.69|1992-04-22|2-HIGH|Clerk#000000674|0|iously unusual notornis are diff --git a/src/test/singlenode_regress/data/part.csv b/src/test/singlenode_regress/data/part.csv new file mode 100644 index 00000000000..ff1bdbbc0ff --- /dev/null +++ b/src/test/singlenode_regress/data/part.csv @@ -0,0 +1,2000 @@ +1|goldenrod lace spring peru powder|Manufacturer#1|Brand#13|PROMO BURNISHED COPPER|7|JUMBO PKG|901.00|ly. slyly ironi +2|blush rosy metallic lemon navajo|Manufacturer#1|Brand#13|LARGE BRUSHED BRASS|1|LG CASE|902.00|lar accounts amo +3|dark green antique puff wheat|Manufacturer#4|Brand#42|STANDARD POLISHED BRASS|21|WRAP CASE|903.00|egular deposits hag +4|chocolate metallic smoke ghost drab|Manufacturer#3|Brand#34|SMALL PLATED BRASS|14|MED DRUM|904.00|p furiously r +5|forest blush chiffon thistle chocolate|Manufacturer#3|Brand#32|STANDARD POLISHED TIN|15|SM PKG|905.00| wake carefully +6|white ivory azure firebrick black|Manufacturer#2|Brand#24|PROMO PLATED STEEL|4|MED BAG|906.00|sual a +7|blue blanched tan indian olive|Manufacturer#1|Brand#11|SMALL PLATED COPPER|45|SM BAG|907.00|lyly. ex +8|ivory khaki cream midnight rosy|Manufacturer#4|Brand#44|PROMO BURNISHED TIN|41|LG DRUM|908.00|eposi +9|thistle rose moccasin light floral|Manufacturer#4|Brand#43|SMALL BURNISHED STEEL|12|WRAP CASE|909.00|ironic foxe +10|floral moccasin royal powder burnished|Manufacturer#5|Brand#54|LARGE BURNISHED STEEL|44|LG CAN|910.01|ithely final deposit +11|chocolate turquoise sandy snow misty|Manufacturer#2|Brand#25|STANDARD BURNISHED NICKEL|43|WRAP BOX|911.01|ng gr +12|peru ivory olive powder frosted|Manufacturer#3|Brand#33|MEDIUM ANODIZED STEEL|25|JUMBO CASE|912.01| quickly +13|ghost blue olive sky gainsboro|Manufacturer#5|Brand#55|MEDIUM BURNISHED NICKEL|1|JUMBO PACK|913.01|osits. +14|linen seashell burnished blue gainsboro|Manufacturer#1|Brand#13|SMALL POLISHED STEEL|28|JUMBO BOX|914.01|kages c +15|navajo dark sky turquoise royal|Manufacturer#1|Brand#15|LARGE ANODIZED BRASS|45|LG CASE|915.01|usual ac +16|deep brown turquoise dim papaya|Manufacturer#3|Brand#32|PROMO PLATED TIN|2|MED PACK|916.01|unts a +17|burnished navy orange dodger cream|Manufacturer#4|Brand#43|ECONOMY BRUSHED STEEL|16|LG BOX|917.01| regular accounts +18|spring indian forest khaki midnight|Manufacturer#1|Brand#11|SMALL BURNISHED STEEL|42|JUMBO PACK|918.01|s cajole slyly a +19|dodger forest floral cream black|Manufacturer#2|Brand#23|SMALL ANODIZED NICKEL|33|WRAP BOX|919.01| pending acc +20|bisque salmon dark blanched linen|Manufacturer#1|Brand#12|LARGE POLISHED NICKEL|48|MED BAG|920.02|are across the asympt +21|lemon aquamarine firebrick floral almond|Manufacturer#3|Brand#33|SMALL BURNISHED TIN|31|MED BAG|921.02|ss packages. pendin +22|medium floral beige cornsilk olive|Manufacturer#4|Brand#43|PROMO POLISHED BRASS|19|LG DRUM|922.02| even p +23|firebrick bisque slate rose blanched|Manufacturer#3|Brand#35|MEDIUM BURNISHED TIN|42|JUMBO JAR|923.02|nic, fina +24|saddle dim white honeydew spring|Manufacturer#5|Brand#52|MEDIUM PLATED STEEL|20|MED CASE|924.02| final the +25|blush forest magenta metallic turquoise|Manufacturer#5|Brand#55|STANDARD BRUSHED COPPER|3|JUMBO BAG|925.02|requests wake +26|lawn forest misty chartreuse snow|Manufacturer#3|Brand#32|SMALL BRUSHED STEEL|32|SM CASE|926.02| instructions i +27|plum drab cornflower brown dim|Manufacturer#1|Brand#14|LARGE ANODIZED TIN|20|MED PKG|927.02|s wake. ir +28|green honeydew dim cyan bisque|Manufacturer#4|Brand#44|SMALL PLATED COPPER|19|JUMBO PKG|928.02|x-ray pending, iron +29|aquamarine sky salmon rose burlywood|Manufacturer#3|Brand#33|PROMO PLATED COPPER|7|LG DRUM|929.02| carefully fluffi +30|blush beige steel cyan navy|Manufacturer#4|Brand#42|PROMO ANODIZED TIN|17|LG BOX|930.03|carefully bus +31|grey ghost steel maroon moccasin|Manufacturer#5|Brand#53|STANDARD BRUSHED TIN|10|LG BAG|931.03|uriously s +32|yellow wheat midnight papaya blue|Manufacturer#4|Brand#42|ECONOMY PLATED BRASS|31|LG CASE|932.03|urts. carefully fin +33|maroon beige mint cyan peru|Manufacturer#2|Brand#22|ECONOMY PLATED NICKEL|16|LG PKG|933.03|ly eve +34|bisque pink dodger cream goldenrod|Manufacturer#1|Brand#13|LARGE BRUSHED STEEL|8|JUMBO BOX|934.03|riously ironic +35|green blue coral antique sandy|Manufacturer#4|Brand#43|MEDIUM ANODIZED BRASS|14|JUMBO PACK|935.03|e carefully furi +36|chiffon smoke floral misty navy|Manufacturer#2|Brand#25|SMALL BURNISHED COPPER|3|JUMBO CAN|936.03|olites o +37|turquoise ivory orange sandy maroon|Manufacturer#4|Brand#45|LARGE POLISHED TIN|48|JUMBO BOX|937.03|silent +38|seashell floral bisque midnight black|Manufacturer#4|Brand#43|ECONOMY ANODIZED BRASS|11|SM JAR|938.03|structions inte +39|rose dodger lace peru floral|Manufacturer#5|Brand#53|SMALL POLISHED TIN|43|JUMBO JAR|939.03|se slowly above the fl +40|rosy midnight floral misty green|Manufacturer#2|Brand#25|ECONOMY BURNISHED COPPER|27|SM CASE|940.04|! blithely specia +41|burlywood ghost antique metallic pale|Manufacturer#2|Brand#23|ECONOMY ANODIZED TIN|7|WRAP JAR|941.04|uriously. furiously cl +42|midnight azure bisque turquoise lawn|Manufacturer#5|Brand#52|MEDIUM BURNISHED TIN|45|LG BOX|942.04|the slow +43|medium khaki chocolate rosy blush|Manufacturer#4|Brand#44|PROMO POLISHED STEEL|5|WRAP CASE|943.04|e slyly along the ir +44|medium maroon wheat lavender blush|Manufacturer#4|Brand#45|MEDIUM PLATED TIN|48|SM PACK|944.04|pinto beans. carefully +45|lemon medium frosted indian linen|Manufacturer#4|Brand#43|SMALL BRUSHED NICKEL|9|WRAP BAG|945.04|nts bo +46|antique peru lemon sandy steel|Manufacturer#1|Brand#11|STANDARD POLISHED TIN|45|WRAP CASE|946.04|the blithely unusual +47|sky firebrick red linen dim|Manufacturer#4|Brand#45|LARGE BURNISHED BRASS|14|JUMBO PACK|947.04| even plate +48|slate thistle indian lace drab|Manufacturer#5|Brand#53|STANDARD BRUSHED STEEL|27|JUMBO CASE|948.04|ng to the depo +49|blue tan cornsilk burlywood beige|Manufacturer#2|Brand#24|SMALL BURNISHED TIN|31|MED DRUM|949.04|ar pack +50|yellow cornflower royal blush almond|Manufacturer#3|Brand#33|LARGE ANODIZED TIN|25|WRAP PKG|950.05|kages m +51|lime forest puff deep firebrick|Manufacturer#4|Brand#45|ECONOMY BURNISHED NICKEL|34|JUMBO PACK|951.05|n foxes +52|lemon lace khaki powder blanched|Manufacturer#3|Brand#35|STANDARD BURNISHED TIN|25|WRAP CASE|952.05| final deposits. fu +53|grey black dodger sandy puff|Manufacturer#2|Brand#23|ECONOMY BURNISHED NICKEL|32|MED BAG|953.05|mptot +54|peach smoke yellow pale cornflower|Manufacturer#2|Brand#21|LARGE BURNISHED COPPER|19|WRAP CASE|954.05|e blithely +55|antique cream pale tomato rose|Manufacturer#2|Brand#23|ECONOMY BRUSHED COPPER|9|MED BAG|955.05|ly final pac +56|midnight goldenrod drab ivory blanched|Manufacturer#1|Brand#12|MEDIUM PLATED STEEL|20|WRAP DRUM|956.05|ts. blithel +57|purple blue tan goldenrod medium|Manufacturer#3|Brand#32|MEDIUM BURNISHED BRASS|49|MED PKG|957.05|lly abov +58|linen beige coral dim salmon|Manufacturer#5|Brand#53|STANDARD POLISHED TIN|44|LG PACK|958.05| fluffily blithely reg +59|misty blush metallic spring blanched|Manufacturer#5|Brand#53|MEDIUM POLISHED TIN|2|LG BAG|959.05|regular exc +60|sky burnished salmon navajo hot|Manufacturer#1|Brand#11|LARGE POLISHED COPPER|27|JUMBO CASE|960.06| integ +61|drab burnished lime navy slate|Manufacturer#5|Brand#54|SMALL BURNISHED NICKEL|18|WRAP DRUM|961.06|es. blithely en +62|tan ivory aquamarine indian burlywood|Manufacturer#3|Brand#35|STANDARD BRUSHED BRASS|39|JUMBO BOX|962.06|ckly across the carefu +63|frosted puff hot rose coral|Manufacturer#3|Brand#32|STANDARD BURNISHED NICKEL|10|JUMBO CAN|963.06| quickly +64|aquamarine puff papaya hot floral|Manufacturer#2|Brand#21|MEDIUM ANODIZED BRASS|1|JUMBO CAN|964.06|efully regular pi +65|slate lavender tomato black floral|Manufacturer#5|Brand#53|MEDIUM BRUSHED COPPER|3|MED CAN|965.06|posits after the quic +66|cornflower orchid chocolate lawn light|Manufacturer#3|Brand#35|PROMO ANODIZED NICKEL|46|SM CASE|966.06|haggle blithely iro +67|slate cornsilk red orange plum|Manufacturer#2|Brand#21|SMALL BRUSHED TIN|31|WRAP DRUM|967.06| regular, p +68|bisque frosted pale puff sandy|Manufacturer#1|Brand#11|PROMO ANODIZED STEEL|10|WRAP BOX|968.06|eposits shall h +69|peru green linen blush olive|Manufacturer#5|Brand#52|MEDIUM POLISHED BRASS|2|SM BOX|969.06|ely final depo +70|violet midnight dark cornsilk wheat|Manufacturer#1|Brand#11|STANDARD BRUSHED STEEL|42|LG PACK|970.07|inal gifts. sl +71|sky green spring lavender white|Manufacturer#3|Brand#33|STANDARD PLATED BRASS|26|WRAP DRUM|971.07| packages alongside +72|orange spring burlywood chocolate black|Manufacturer#2|Brand#23|STANDARD ANODIZED TIN|25|JUMBO PACK|972.07|efully final the +73|cream misty tomato peach burlywood|Manufacturer#2|Brand#21|SMALL BRUSHED COPPER|35|WRAP DRUM|973.07|ts haggl +74|dim linen frosted thistle pale|Manufacturer#5|Brand#55|ECONOMY ANODIZED BRASS|25|JUMBO CASE|974.07|ent foxes +75|aquamarine lace wheat salmon blue|Manufacturer#3|Brand#35|SMALL BURNISHED NICKEL|39|SM JAR|975.07|s sleep furiou +76|bisque light yellow puff salmon|Manufacturer#3|Brand#34|MEDIUM BRUSHED COPPER|9|SM PKG|976.07|n accounts sleep qu +77|slate bisque burnished honeydew beige|Manufacturer#5|Brand#52|STANDARD BRUSHED COPPER|13|MED PKG|977.07|uests. +78|blush green slate bisque powder|Manufacturer#1|Brand#14|ECONOMY POLISHED STEEL|24|LG JAR|978.07|icing deposits wake +79|puff pink floral steel forest|Manufacturer#4|Brand#45|PROMO ANODIZED BRASS|22|JUMBO BAG|979.07| foxes are slyly regu +80|tomato saddle brown bisque light|Manufacturer#4|Brand#44|PROMO PLATED BRASS|28|MED CAN|980.08|unusual dependencies i +81|misty salmon cornflower dark frosted|Manufacturer#5|Brand#53|ECONOMY BRUSHED TIN|21|MED BAG|981.08|ove the furiou +82|khaki tomato purple indian lemon|Manufacturer#1|Brand#15|ECONOMY POLISHED TIN|12|WRAP BOX|982.08|ial requests haggle +83|chocolate green deep lace aquamarine|Manufacturer#1|Brand#12|PROMO BURNISHED NICKEL|47|SM CAN|983.08|ly regul +84|salmon peru frosted red chiffon|Manufacturer#4|Brand#45|SMALL ANODIZED NICKEL|26|JUMBO PACK|984.08|ideas nag +85|aquamarine cornsilk floral misty light|Manufacturer#5|Brand#55|PROMO ANODIZED NICKEL|16|LG BAG|985.08| silent +86|green blanched khaki steel deep|Manufacturer#4|Brand#44|STANDARD PLATED TIN|37|LG CASE|986.08| daring sheaves +87|pale khaki sandy antique black|Manufacturer#4|Brand#41|LARGE PLATED STEEL|41|WRAP PACK|987.08|yly final +88|blue olive azure burlywood lavender|Manufacturer#4|Brand#44|PROMO PLATED COPPER|16|SM CASE|988.08|e regular packages. +89|ghost khaki lawn pale dim|Manufacturer#5|Brand#53|STANDARD BURNISHED STEEL|7|MED JAR|989.08|y final pinto +90|ghost goldenrod violet blue purple|Manufacturer#5|Brand#51|ECONOMY POLISHED STEEL|49|JUMBO CAN|990.09|caref +91|dark beige metallic ivory burlywood|Manufacturer#2|Brand#21|STANDARD BRUSHED TIN|32|JUMBO PKG|991.09|counts dete +92|chiffon dodger turquoise thistle red|Manufacturer#2|Brand#22|STANDARD ANODIZED TIN|35|JUMBO PKG|992.09|he ironic accounts. sp +93|blanched yellow cornflower khaki mint|Manufacturer#2|Brand#24|LARGE ANODIZED TIN|2|WRAP DRUM|993.09| platel +94|azure pink orange goldenrod grey|Manufacturer#3|Brand#35|STANDARD POLISHED BRASS|32|SM BOX|994.09|s accounts cajo +95|coral chocolate wheat smoke magenta|Manufacturer#3|Brand#33|LARGE BRUSHED TIN|36|WRAP DRUM|995.09| final pinto beans +96|steel light drab chartreuse honeydew|Manufacturer#5|Brand#53|STANDARD BRUSHED STEEL|32|SM CASE|996.09|ng to the bli +97|metallic dodger aquamarine azure drab|Manufacturer#3|Brand#33|MEDIUM POLISHED BRASS|49|WRAP CAN|997.09|ss excuses sleep am +98|frosted goldenrod chartreuse dark honeydew|Manufacturer#5|Brand#54|STANDARD ANODIZED BRASS|22|MED JAR|998.09|e the q +99|lemon peru chiffon sienna deep|Manufacturer#2|Brand#21|SMALL BURNISHED STEEL|11|JUMBO PKG|999.09|press +100|light orange khaki chiffon purple|Manufacturer#3|Brand#33|ECONOMY ANODIZED TIN|4|LG BAG|1000.10|of the steal +101|hot yellow turquoise violet floral|Manufacturer#3|Brand#32|LARGE ANODIZED STEEL|26|JUMBO JAR|1001.10|ly even, +102|firebrick orchid blanched sienna grey|Manufacturer#3|Brand#31|MEDIUM BURNISHED BRASS|17|SM DRUM|1002.10|ular packa +103|navy cream lime orange metallic|Manufacturer#2|Brand#25|MEDIUM PLATED BRASS|45|WRAP DRUM|1003.10|e blithely blith +104|dim cream chocolate cornflower orange|Manufacturer#1|Brand#13|MEDIUM ANODIZED STEEL|36|JUMBO BAG|1004.10|ites sleep quickly +105|rose puff ivory blanched burnished|Manufacturer#1|Brand#15|SMALL POLISHED COPPER|27|LG DRUM|1005.10|odolites was +106|cornsilk beige deep lavender antique|Manufacturer#3|Brand#31|MEDIUM PLATED BRASS|28|WRAP DRUM|1006.10|unts maintain +107|cyan coral red slate orange|Manufacturer#5|Brand#53|SMALL BURNISHED TIN|12|MED BOX|1007.10|slyly special depos +108|honeydew papaya gainsboro tomato puff|Manufacturer#1|Brand#12|PROMO PLATED NICKEL|41|MED PKG|1008.10|after the carefully +109|lemon indian blanched chiffon coral|Manufacturer#3|Brand#33|ECONOMY POLISHED TIN|11|LG PACK|1009.10|instruction +110|cornflower azure beige floral black|Manufacturer#3|Brand#33|STANDARD BURNISHED COPPER|46|LG DRUM|1010.11|t quickly a +111|sandy almond chocolate moccasin misty|Manufacturer#5|Brand#54|LARGE BRUSHED COPPER|28|JUMBO JAR|1011.11|kly bold epitaphs +112|hot burnished tomato chocolate peru|Manufacturer#4|Brand#43|PROMO BRUSHED STEEL|42|JUMBO CAN|1012.11|the express, +113|almond coral royal honeydew lawn|Manufacturer#3|Brand#31|PROMO POLISHED TIN|23|LG CAN|1013.11|finally even +114|pale bisque antique white royal|Manufacturer#5|Brand#51|MEDIUM POLISHED NICKEL|41|MED PACK|1014.11|ully final foxes. pint +115|spring hot sienna azure dark|Manufacturer#4|Brand#45|STANDARD POLISHED STEEL|24|MED CAN|1015.11|counts nag! caref +116|thistle cornsilk pale firebrick black|Manufacturer#5|Brand#53|PROMO POLISHED NICKEL|33|SM PACK|1016.11|usly final courts +117|tomato grey chiffon burlywood ghost|Manufacturer#1|Brand#14|SMALL BRUSHED TIN|25|LG BAG|1017.11|ages acc +118|bisque plum royal burlywood brown|Manufacturer#2|Brand#25|PROMO ANODIZED TIN|31|MED PACK|1018.11|ly ironic pinto +119|olive black navajo burlywood ghost|Manufacturer#4|Brand#43|LARGE POLISHED STEEL|30|WRAP CASE|1019.11|out the quickly r +120|navy chocolate frosted burnished moccasin|Manufacturer#1|Brand#14|SMALL ANODIZED NICKEL|45|WRAP JAR|1020.12|lly a +121|smoke chiffon gainsboro magenta firebrick|Manufacturer#1|Brand#14|ECONOMY BRUSHED COPPER|13|SM PKG|1021.12|deposi +122|ghost royal chocolate peach ivory|Manufacturer#2|Brand#21|MEDIUM ANODIZED TIN|8|LG DRUM|1022.12|sts c +123|cream almond papaya salmon blanched|Manufacturer#1|Brand#12|SMALL BURNISHED TIN|31|JUMBO PKG|1023.12|ray regula +124|wheat azure khaki tan lime|Manufacturer#3|Brand#32|PROMO ANODIZED STEEL|1|LG BOX|1024.12|g the expr +125|metallic indian magenta navy medium|Manufacturer#1|Brand#12|STANDARD BRUSHED BRASS|17|WRAP BAG|1025.12|kages against +126|burnished navy indian medium deep|Manufacturer#4|Brand#45|MEDIUM BRUSHED NICKEL|4|LG BAG|1026.12|es sleep al +127|moccasin green orchid blue blanched|Manufacturer#5|Brand#52|SMALL BURNISHED NICKEL|14|LG JAR|1027.12|lithely expr +128|linen brown khaki snow gainsboro|Manufacturer#2|Brand#22|PROMO PLATED TIN|5|SM BAG|1028.12|e of the furiously ex +129|turquoise spring sandy tan ivory|Manufacturer#1|Brand#15|LARGE POLISHED TIN|20|SM JAR|1029.12| careful +130|gainsboro goldenrod chiffon orchid rose|Manufacturer#2|Brand#23|SMALL PLATED NICKEL|26|LG BOX|1030.13|ake slyly +131|tomato moccasin sandy blue frosted|Manufacturer#5|Brand#52|STANDARD ANODIZED BRASS|43|MED DRUM|1031.13|nts wake dar +132|seashell papaya thistle light powder|Manufacturer#4|Brand#45|STANDARD BURNISHED BRASS|2|WRAP DRUM|1032.13|ckly expre +133|navajo black dim peru deep|Manufacturer#1|Brand#13|SMALL BRUSHED NICKEL|19|LG PKG|1033.13| final pinto beans +134|turquoise goldenrod white moccasin spring|Manufacturer#4|Brand#42|SMALL POLISHED STEEL|35|SM PKG|1034.13|es. bold pa +135|metallic lime cyan forest burlywood|Manufacturer#2|Brand#21|MEDIUM BURNISHED STEEL|24|JUMBO CASE|1035.13|l frets +136|cornsilk blush powder tan rose|Manufacturer#2|Brand#22|SMALL PLATED STEEL|2|WRAP BAG|1036.13|kages print carefully +137|saddle dodger purple salmon rosy|Manufacturer#3|Brand#31|ECONOMY PLATED STEEL|25|MED PACK|1037.13|the t +138|dark goldenrod ghost hot grey|Manufacturer#1|Brand#13|ECONOMY BURNISHED COPPER|42|JUMBO DRUM|1038.13|ts solve acro +139|floral chocolate purple deep coral|Manufacturer#3|Brand#32|MEDIUM BRUSHED STEEL|7|SM BOX|1039.13|ter t +140|frosted chiffon thistle sky grey|Manufacturer#5|Brand#53|STANDARD PLATED STEEL|45|SM BOX|1040.14|oss the carefu +141|peru sienna salmon snow gainsboro|Manufacturer#3|Brand#35|STANDARD ANODIZED STEEL|23|SM PKG|1041.14|ans nag furiously pen +142|chartreuse sky deep slate thistle|Manufacturer#5|Brand#55|STANDARD ANODIZED BRASS|36|MED JAR|1042.14|he accounts. pac +143|moccasin dim almond black misty|Manufacturer#3|Brand#34|ECONOMY PLATED TIN|44|MED BAG|1043.14|nts across the +144|wheat brown orange almond aquamarine|Manufacturer#1|Brand#14|SMALL ANODIZED TIN|26|SM BOX|1044.14|owly +145|indian rosy chartreuse orchid grey|Manufacturer#5|Brand#53|PROMO BRUSHED COPPER|24|SM BAG|1045.14|es wake furiously blit +146|azure medium midnight burlywood blue|Manufacturer#3|Brand#34|STANDARD BRUSHED COPPER|11|WRAP PACK|1046.14|unts cajole +147|honeydew brown deep light chartreuse|Manufacturer#1|Brand#11|MEDIUM PLATED COPPER|29|JUMBO PKG|1047.14|wake never bold +148|yellow white tan khaki saddle|Manufacturer#3|Brand#31|STANDARD PLATED STEEL|20|SM BOX|1048.14|platelets wake fu +149|tan cyan forest ghost plum|Manufacturer#2|Brand#24|MEDIUM BURNISHED NICKEL|6|MED PKG|1049.14|leep requests. dog +150|antique red moccasin green burlywood|Manufacturer#3|Brand#35|LARGE BRUSHED TIN|21|SM BAG|1050.15|ironic foxes +151|chartreuse lime slate white thistle|Manufacturer#3|Brand#34|LARGE PLATED BRASS|45|MED CAN|1051.15|ccounts nag i +152|light indian linen dodger blush|Manufacturer#5|Brand#53|MEDIUM POLISHED STEEL|48|MED CASE|1052.15|thely regular t +153|powder firebrick chiffon purple khaki|Manufacturer#1|Brand#11|STANDARD PLATED TIN|20|MED BAG|1053.15|thlessly. silen +154|peru powder pink orchid lace|Manufacturer#1|Brand#11|ECONOMY ANODIZED TIN|1|JUMBO BAG|1054.15|posits +155|beige saddle cornsilk mint sky|Manufacturer#2|Brand#21|SMALL BRUSHED NICKEL|28|WRAP CASE|1055.15|lly ironic, r +156|steel gainsboro plum black cornsilk|Manufacturer#4|Brand#43|SMALL POLISHED NICKEL|2|LG PKG|1056.15| pinto beans. eve +157|navajo lime cream ghost drab|Manufacturer#1|Brand#11|ECONOMY ANODIZED STEEL|26|JUMBO PACK|1057.15|ial courts. ru +158|magenta light rosy almond goldenrod|Manufacturer#4|Brand#45|MEDIUM BURNISHED COPPER|47|LG JAR|1058.15| ideas detect slyl +159|linen drab antique steel aquamarine|Manufacturer#4|Brand#43|SMALL ANODIZED BRASS|46|SM BAG|1059.15| ironic requests-- pe +160|lace coral cream saddle maroon|Manufacturer#5|Brand#55|STANDARD POLISHED COPPER|47|JUMBO CAN|1060.16|nts are carefully +161|hot dodger rosy firebrick aquamarine|Manufacturer#2|Brand#22|STANDARD PLATED TIN|17|SM PACK|1061.16|r the bl +162|aquamarine coral black ivory misty|Manufacturer#3|Brand#33|MEDIUM ANODIZED COPPER|35|JUMBO PACK|1062.16|e slyly around th +163|blush yellow frosted lace drab|Manufacturer#2|Brand#21|ECONOMY PLATED TIN|34|WRAP DRUM|1063.16|nly s +164|brown cream linen frosted blue|Manufacturer#2|Brand#23|LARGE PLATED BRASS|35|JUMBO BAG|1064.16|mong th +165|chiffon dim coral sienna seashell|Manufacturer#1|Brand#15|STANDARD PLATED STEEL|24|SM CAN|1065.16| carefully fin +166|linen royal chiffon floral misty|Manufacturer#5|Brand#52|LARGE POLISHED COPPER|4|MED BAG|1066.16|ss the +167|almond lavender lawn pink ghost|Manufacturer#3|Brand#32|LARGE ANODIZED STEEL|46|WRAP BOX|1067.16|ic ac +168|lace frosted brown slate lawn|Manufacturer#1|Brand#13|SMALL BRUSHED COPPER|20|JUMBO DRUM|1068.16|ss package +169|tan lime sky almond midnight|Manufacturer#5|Brand#55|STANDARD POLISHED BRASS|10|JUMBO CASE|1069.16|lets alongside of +170|peru green hot medium thistle|Manufacturer#3|Brand#33|LARGE POLISHED COPPER|28|LG DRUM|1070.17|yly s +171|beige seashell almond linen blush|Manufacturer#1|Brand#11|STANDARD BURNISHED COPPER|40|LG JAR|1071.17| the r +172|medium goldenrod tan light brown|Manufacturer#5|Brand#53|PROMO PLATED NICKEL|28|MED CASE|1072.17|quick as +173|pale papaya tomato navajo coral|Manufacturer#1|Brand#12|ECONOMY BURNISHED TIN|17|LG CASE|1073.17|sly bold excuses haggl +174|plum pink medium saddle orchid|Manufacturer#1|Brand#15|ECONOMY BRUSHED COPPER|25|LG CASE|1074.17| accounts nag ab +175|azure blanched chartreuse moccasin ghost|Manufacturer#1|Brand#11|PROMO ANODIZED TIN|45|JUMBO JAR|1075.17|ole against the +176|lawn forest indian orchid peru|Manufacturer#2|Brand#24|SMALL ANODIZED STEEL|40|MED CAN|1076.17|blithely. ironic +177|indian deep sandy floral yellow|Manufacturer#2|Brand#21|MEDIUM BRUSHED STEEL|42|LG BAG|1077.17|ermanently eve +178|blue black cornflower white powder|Manufacturer#1|Brand#13|STANDARD POLISHED TIN|10|LG JAR|1078.17|regular instructions. +179|rose lime blush bisque ivory|Manufacturer#4|Brand#43|ECONOMY BRUSHED STEEL|20|LG JAR|1079.17|ely regul +180|purple blanched khaki blush aquamarine|Manufacturer#3|Brand#33|STANDARD BURNISHED NICKEL|7|WRAP BAG|1080.18|oss the +181|almond burlywood smoke peru dark|Manufacturer#2|Brand#24|MEDIUM PLATED STEEL|19|WRAP CAN|1081.18|al deposits +182|beige medium brown chartreuse purple|Manufacturer#3|Brand#31|MEDIUM ANODIZED COPPER|11|JUMBO CAN|1082.18|bits are +183|ivory white wheat pale orange|Manufacturer#5|Brand#52|PROMO POLISHED STEEL|35|LG PKG|1083.18|ly regular excus +184|burlywood cream cornsilk chocolate purple|Manufacturer#5|Brand#53|SMALL POLISHED TIN|42|LG BOX|1084.18|ding courts. idly iro +185|firebrick rose indian spring magenta|Manufacturer#4|Brand#44|ECONOMY POLISHED TIN|4|WRAP BAG|1085.18|even foxe +186|papaya cream chartreuse spring blush|Manufacturer#2|Brand#23|ECONOMY BRUSHED TIN|15|JUMBO PKG|1086.18|ly reg +187|white brown cyan lavender orange|Manufacturer#4|Brand#45|PROMO ANODIZED BRASS|45|MED CAN|1087.18|leep slyly s +188|gainsboro steel rosy dim drab|Manufacturer#5|Brand#54|ECONOMY ANODIZED BRASS|9|MED CAN|1088.18| above the silent p +189|dodger misty yellow brown grey|Manufacturer#2|Brand#22|MEDIUM BRUSHED BRASS|13|WRAP DRUM|1089.18|en requests. sauternes +190|chartreuse khaki ivory chiffon bisque|Manufacturer#5|Brand#53|LARGE BURNISHED NICKEL|23|WRAP BAG|1090.19| furiously even d +191|navajo metallic puff firebrick cornflower|Manufacturer#3|Brand#31|MEDIUM POLISHED BRASS|36|WRAP BOX|1091.19| asymptote +192|light seashell firebrick cornflower green|Manufacturer#3|Brand#34|STANDARD BRUSHED COPPER|17|MED BAG|1092.19|uickly regular, expr +193|turquoise sienna rose rosy chocolate|Manufacturer#4|Brand#45|ECONOMY BURNISHED BRASS|31|SM PKG|1093.19|final ideas wake furi +194|powder bisque cornflower navajo pink|Manufacturer#5|Brand#51|ECONOMY POLISHED STEEL|7|SM CAN|1094.19|y special accoun +195|lace floral blush linen cornflower|Manufacturer#4|Brand#41|STANDARD BRUSHED NICKEL|40|MED CASE|1095.19|oxes sleep care +196|pale blush lime grey blue|Manufacturer#3|Brand#33|SMALL BURNISHED NICKEL|3|JUMBO JAR|1096.19|uickly special +197|blue turquoise cornsilk rosy chartreuse|Manufacturer#5|Brand#52|SMALL ANODIZED COPPER|18|SM JAR|1097.19|lithely after the eve +198|orange khaki papaya cyan navajo|Manufacturer#4|Brand#41|PROMO BRUSHED NICKEL|43|SM PACK|1098.19|ackages? carefully re +199|royal slate lace olive gainsboro|Manufacturer#3|Brand#31|ECONOMY PLATED STEEL|23|JUMBO DRUM|1099.19|ickly regul +200|burnished mint navajo beige dark|Manufacturer#5|Brand#54|MEDIUM POLISHED BRASS|22|LG PKG|1100.20|furiously even depo +201|midnight white medium misty magenta|Manufacturer#4|Brand#42|SMALL POLISHED STEEL|18|JUMBO BAG|1101.20| courts sl +202|brown burnished turquoise moccasin olive|Manufacturer#4|Brand#45|MEDIUM BRUSHED COPPER|49|MED DRUM|1102.20| use slyly c +203|mint dodger chiffon honeydew cornflower|Manufacturer#5|Brand#55|STANDARD ANODIZED STEEL|42|MED BAG|1103.20|usual instructio +204|black slate smoke chartreuse royal|Manufacturer#5|Brand#54|LARGE BURNISHED COPPER|22|SM JAR|1104.20|egular pl +205|tomato beige indian royal cyan|Manufacturer#5|Brand#54|ECONOMY PLATED NICKEL|2|JUMBO DRUM|1105.20| blithely regular +206|sienna chocolate wheat peru ivory|Manufacturer#2|Brand#25|LARGE ANODIZED NICKEL|23|JUMBO CAN|1106.20|ng theodolites +207|blush burlywood lawn bisque royal|Manufacturer#3|Brand#35|STANDARD PLATED COPPER|48|MED CAN|1107.20|lar, +208|medium pink floral green blue|Manufacturer#3|Brand#35|LARGE PLATED COPPER|5|MED PACK|1108.20|l deposits wak +209|almond plum spring midnight lime|Manufacturer#1|Brand#11|ECONOMY PLATED STEEL|6|MED CAN|1109.20| haggle a +210|indian sienna maroon rosy mint|Manufacturer#3|Brand#32|ECONOMY BURNISHED TIN|5|LG JAR|1110.21|ly until the flu +211|brown white lace azure cyan|Manufacturer#3|Brand#32|MEDIUM ANODIZED NICKEL|43|LG PKG|1111.21|s cajole +212|dodger sandy azure linen blanched|Manufacturer#5|Brand#53|PROMO BRUSHED BRASS|42|JUMBO BOX|1112.21|uffily fin +213|forest midnight sky frosted royal|Manufacturer#3|Brand#35|SMALL POLISHED COPPER|14|WRAP CAN|1113.21|der slyly accor +214|burnished midnight dodger tan powder|Manufacturer#4|Brand#41|PROMO PLATED BRASS|30|LG BAG|1114.21|quests. regular, fi +215|tomato peach beige olive burnished|Manufacturer#5|Brand#52|ECONOMY BURNISHED NICKEL|19|SM PACK|1115.21| the carefully i +216|lace antique tomato white metallic|Manufacturer#4|Brand#45|MEDIUM PLATED NICKEL|35|MED JAR|1116.21|gside of the unus +217|lemon powder sandy moccasin magenta|Manufacturer#5|Brand#52|PROMO PLATED COPPER|44|MED DRUM|1117.21|heodolites integrat +218|sandy misty magenta chocolate blanched|Manufacturer#4|Brand#41|PROMO BURNISHED TIN|24|WRAP PACK|1118.21| furiously +219|khaki hot ivory floral aquamarine|Manufacturer#4|Brand#45|PROMO ANODIZED BRASS|31|MED JAR|1119.21|riously ironic reque +220|lemon steel almond white orchid|Manufacturer#1|Brand#14|PROMO BRUSHED BRASS|25|MED CASE|1120.22|heodolites sleep. c +221|chartreuse deep lawn smoke dark|Manufacturer#5|Brand#51|PROMO BRUSHED COPPER|7|LG DRUM|1121.22|ld asymptotes sleep ca +222|linen blanched seashell deep aquamarine|Manufacturer#3|Brand#33|LARGE ANODIZED BRASS|35|LG CASE|1122.22|ross the ironic, un +223|rose blanched indian tomato hot|Manufacturer#3|Brand#33|LARGE ANODIZED STEEL|29|MED BAG|1123.22|ons. even depos +224|drab magenta burlywood dim blanched|Manufacturer#1|Brand#13|STANDARD POLISHED NICKEL|46|WRAP BOX|1124.22|y special depos +225|cornsilk frosted burlywood papaya spring|Manufacturer#4|Brand#45|ECONOMY BRUSHED TIN|23|MED CASE|1125.22|ts ca +226|cyan powder honeydew linen lace|Manufacturer#3|Brand#33|PROMO ANODIZED STEEL|7|SM PKG|1126.22|ular packages. some +227|metallic yellow dim deep cream|Manufacturer#4|Brand#44|SMALL BRUSHED TIN|21|LG PACK|1127.22| silent r +228|goldenrod violet midnight blue white|Manufacturer#4|Brand#44|ECONOMY PLATED STEEL|12|SM DRUM|1128.22|f the fluffily +229|orchid gainsboro coral black blush|Manufacturer#1|Brand#15|SMALL POLISHED STEEL|19|MED CAN|1129.22|ng to the quick +230|thistle midnight cream seashell cyan|Manufacturer#5|Brand#51|STANDARD PLATED STEEL|20|SM PKG|1130.23|fter the ironic pin +231|orchid violet aquamarine firebrick slate|Manufacturer#5|Brand#51|MEDIUM BURNISHED COPPER|17|MED PACK|1131.23|ffily. fur +232|ivory purple spring tan cornsilk|Manufacturer#5|Brand#53|LARGE BURNISHED NICKEL|50|SM PKG|1132.23|r, unusual requests +233|black cornflower chiffon hot saddle|Manufacturer#3|Brand#34|MEDIUM ANODIZED BRASS|25|SM PACK|1133.23|ully ironic +234|azure olive burnished dim green|Manufacturer#1|Brand#13|MEDIUM ANODIZED NICKEL|26|WRAP BOX|1134.23| furiously special +235|aquamarine midnight red cornsilk chocolate|Manufacturer#3|Brand#32|ECONOMY BRUSHED COPPER|4|MED JAR|1135.23|s. carefully regular d +236|antique lawn gainsboro goldenrod papaya|Manufacturer#5|Brand#55|ECONOMY ANODIZED STEEL|31|LG JAR|1136.23|ss packages hag +237|black orange coral floral antique|Manufacturer#2|Brand#25|LARGE BURNISHED TIN|49|SM DRUM|1137.23|g the furiously +238|green medium lavender antique honeydew|Manufacturer#3|Brand#34|SMALL POLISHED TIN|35|LG CAN|1138.23|d, expres +239|medium dodger pink cyan drab|Manufacturer#2|Brand#24|LARGE PLATED NICKEL|36|WRAP DRUM|1139.23|lites are perman +240|honeydew burlywood linen red forest|Manufacturer#3|Brand#32|MEDIUM BURNISHED NICKEL|1|LG CAN|1140.24|ructions. +241|chocolate metallic powder papaya pale|Manufacturer#5|Brand#51|STANDARD BRUSHED COPPER|3|WRAP CASE|1141.24| quickly regular fo +242|magenta deep lawn linen navy|Manufacturer#3|Brand#35|SMALL POLISHED STEEL|42|LG BAG|1142.24|ously final theodo +243|bisque slate olive mint dim|Manufacturer#3|Brand#32|MEDIUM ANODIZED STEEL|49|SM BOX|1143.24|ress sentim +244|midnight brown magenta maroon tan|Manufacturer#5|Brand#51|ECONOMY BURNISHED BRASS|48|LG BOX|1144.24|ns use above the ir +245|medium orange violet dim pale|Manufacturer#2|Brand#23|PROMO BURNISHED BRASS|39|JUMBO PKG|1145.24| instructions. ca +246|burlywood aquamarine pink deep peru|Manufacturer#2|Brand#21|PROMO BRUSHED BRASS|18|SM CAN|1146.24|e caref +247|misty frosted brown chartreuse cornsilk|Manufacturer#5|Brand#53|LARGE BURNISHED BRASS|4|JUMBO PACK|1147.24|r accounts. carefully +248|saddle burlywood red pale orchid|Manufacturer#1|Brand#15|SMALL PLATED BRASS|8|MED PACK|1148.24|furiously fluffily +249|lawn red burnished saddle medium|Manufacturer#4|Brand#44|ECONOMY BURNISHED BRASS|15|LG JAR|1149.24| excuses kindle f +250|honeydew ghost drab firebrick sky|Manufacturer#4|Brand#44|PROMO POLISHED NICKEL|35|WRAP CASE|1150.25|nstructions affix furi +251|chocolate sky gainsboro misty orchid|Manufacturer#1|Brand#15|STANDARD BRUSHED NICKEL|41|WRAP CAN|1151.25|inal ideas aff +252|coral saddle misty deep black|Manufacturer#1|Brand#11|PROMO PLATED NICKEL|22|WRAP DRUM|1152.25|e slyly after the de +253|blanched gainsboro turquoise black linen|Manufacturer#4|Brand#45|PROMO ANODIZED TIN|16|LG PKG|1153.25|he even, re +254|linen frosted purple dark almond|Manufacturer#4|Brand#44|MEDIUM PLATED TIN|10|MED JAR|1154.25|ly at t +255|almond peach indian burlywood spring|Manufacturer#2|Brand#21|LARGE ANODIZED NICKEL|24|JUMBO CAN|1155.25|fter the c +256|pink cornsilk sienna dodger grey|Manufacturer#3|Brand#32|LARGE BURNISHED TIN|2|SM DRUM|1156.25|bove the fur +257|chocolate yellow green ghost peach|Manufacturer#4|Brand#41|ECONOMY POLISHED COPPER|11|SM JAR|1157.25|riously final foxes +258|blue frosted blanched orchid slate|Manufacturer#4|Brand#43|STANDARD ANODIZED COPPER|18|WRAP DRUM|1158.25|leep blith +259|ghost chocolate floral rosy blush|Manufacturer#2|Brand#23|SMALL BURNISHED BRASS|41|WRAP PACK|1159.25|l platelets. evenly +260|brown thistle light burnished chartreuse|Manufacturer#5|Brand#55|STANDARD ANODIZED STEEL|10|LG BAG|1160.26| haggle f +261|floral puff olive burlywood forest|Manufacturer#4|Brand#41|STANDARD POLISHED TIN|44|JUMBO PACK|1161.26|ges was i +262|drab lace blue lawn powder|Manufacturer#5|Brand#52|MEDIUM PLATED NICKEL|16|JUMBO BAG|1162.26|lar theodolites. f +263|linen violet pink lace honeydew|Manufacturer#1|Brand#14|ECONOMY BURNISHED COPPER|46|MED CASE|1163.26|ly ironic the +264|plum firebrick seashell linen dodger|Manufacturer#1|Brand#14|SMALL BURNISHED TIN|23|SM CAN|1164.26|ake. noto +265|maroon misty dim olive royal|Manufacturer#4|Brand#43|SMALL POLISHED STEEL|19|WRAP CASE|1165.26| slyly ac +266|aquamarine metallic ivory magenta brown|Manufacturer#4|Brand#43|ECONOMY BRUSHED STEEL|25|LG DRUM|1166.26|odoli +267|pink salmon misty royal linen|Manufacturer#2|Brand#24|LARGE POLISHED BRASS|41|JUMBO PACK|1167.26|ckly speci +268|ghost dim light lemon violet|Manufacturer#2|Brand#22|MEDIUM PLATED NICKEL|8|MED JAR|1168.26| carefully sil +269|blush navajo frosted orange snow|Manufacturer#1|Brand#13|LARGE PLATED BRASS|5|WRAP BOX|1169.26|ully about the ca +270|maroon misty olive pale snow|Manufacturer#2|Brand#25|PROMO BURNISHED COPPER|45|MED BAG|1170.27|ly even pinto beans. c +271|lace floral hot grey rosy|Manufacturer#5|Brand#52|PROMO PLATED COPPER|32|MED PKG|1171.27| fluffy acco +272|red purple rose brown pale|Manufacturer#5|Brand#52|LARGE POLISHED BRASS|39|LG PKG|1172.27| furiousl +273|black white sky brown forest|Manufacturer#2|Brand#25|STANDARD BRUSHED BRASS|50|LG BOX|1173.27|ackages along the +274|blush lavender snow papaya blue|Manufacturer#2|Brand#23|MEDIUM POLISHED STEEL|46|LG JAR|1174.27|hless accounts prin +275|wheat chiffon dim antique sienna|Manufacturer#4|Brand#45|LARGE BURNISHED BRASS|37|SM BOX|1175.27|equests +276|orange sandy dim linen goldenrod|Manufacturer#2|Brand#25|SMALL BRUSHED COPPER|5|LG JAR|1176.27|iously. +277|grey navajo rosy ghost blush|Manufacturer#4|Brand#43|ECONOMY ANODIZED NICKEL|49|JUMBO JAR|1177.27|arefully special dep +278|antique mint brown goldenrod red|Manufacturer#4|Brand#42|STANDARD BURNISHED NICKEL|49|SM JAR|1178.27| bold p +279|saddle olive dark bisque rose|Manufacturer#3|Brand#35|SMALL ANODIZED BRASS|27|MED CASE|1179.27|eans boos +280|bisque goldenrod drab ivory almond|Manufacturer#2|Brand#21|STANDARD BURNISHED STEEL|33|LG CAN|1180.28|egular, s +281|blanched lemon blue plum almond|Manufacturer#1|Brand#12|SMALL PLATED STEEL|7|MED CAN|1181.28|regula +282|dark floral tan burlywood sandy|Manufacturer#1|Brand#11|SMALL BRUSHED COPPER|44|WRAP CAN|1182.28|packages. final ex +283|metallic brown lace maroon chiffon|Manufacturer#1|Brand#12|SMALL PLATED TIN|8|SM DRUM|1183.28| above the i +284|burlywood khaki dodger hot black|Manufacturer#5|Brand#51|ECONOMY POLISHED COPPER|9|MED DRUM|1184.28|its haggle fu +285|cream lavender olive floral chartreuse|Manufacturer#2|Brand#25|LARGE ANODIZED TIN|42|SM PACK|1185.28| the furiously fi +286|slate deep almond cornsilk lime|Manufacturer#5|Brand#53|MEDIUM POLISHED TIN|1|WRAP CASE|1186.28| foxes. regular, fi +287|mint almond thistle blush chocolate|Manufacturer#1|Brand#15|SMALL PLATED NICKEL|27|SM DRUM|1187.28|y even foxes. final, +288|moccasin purple yellow chocolate navy|Manufacturer#2|Brand#23|STANDARD BURNISHED BRASS|31|SM CASE|1188.28|dencies mold among the +289|green peach olive deep royal|Manufacturer#4|Brand#43|PROMO POLISHED TIN|40|LG CASE|1189.28|odolites sleep care +290|black misty indian moccasin drab|Manufacturer#1|Brand#12|LARGE BURNISHED BRASS|19|JUMBO JAR|1190.29|according to t +291|goldenrod antique rosy white moccasin|Manufacturer#5|Brand#54|ECONOMY PLATED BRASS|26|SM JAR|1191.29|kages alo +292|navajo tan chiffon ivory royal|Manufacturer#1|Brand#12|SMALL PLATED NICKEL|2|MED CAN|1192.29|zzle among t +293|bisque navy azure goldenrod red|Manufacturer#5|Brand#52|STANDARD POLISHED STEEL|24|SM PACK|1193.29|onic requests +294|forest white indian drab rose|Manufacturer#2|Brand#24|ECONOMY POLISHED TIN|35|SM JAR|1194.29|truct +295|blush lace almond indian sky|Manufacturer#2|Brand#25|MEDIUM BURNISHED NICKEL|49|JUMBO JAR|1195.29|ully ironic +296|tan papaya dodger grey cornflower|Manufacturer#1|Brand#13|LARGE BURNISHED BRASS|28|SM PKG|1196.29|, regul +297|hot powder deep bisque chartreuse|Manufacturer#2|Brand#22|LARGE BURNISHED STEEL|23|LG PACK|1197.29|e of the slyl +298|azure lace puff metallic indian|Manufacturer#4|Brand#45|PROMO BRUSHED COPPER|13|JUMBO CAN|1198.29|al deposits wake +299|chartreuse salmon dim royal papaya|Manufacturer#4|Brand#41|STANDARD ANODIZED COPPER|26|WRAP PKG|1199.29|regular dol +300|light cream antique lemon royal|Manufacturer#4|Brand#44|PROMO ANODIZED BRASS|1|WRAP PACK|1200.30|tructions int +301|goldenrod burnished rose coral seashell|Manufacturer#4|Brand#42|ECONOMY BRUSHED STEEL|6|WRAP CAN|1201.30|orges +302|cyan ivory sky midnight gainsboro|Manufacturer#4|Brand#41|PROMO POLISHED BRASS|34|SM BAG|1202.30| ideas. special asy +303|black gainsboro blue azure navajo|Manufacturer#4|Brand#45|ECONOMY PLATED BRASS|7|JUMBO CASE|1203.30|yly according +304|forest burnished cream smoke gainsboro|Manufacturer#4|Brand#43|SMALL POLISHED NICKEL|12|LG DRUM|1204.30|ly regu +305|lemon blue burlywood rose tomato|Manufacturer#1|Brand#15|SMALL ANODIZED TIN|6|SM BAG|1205.30|ake above +306|lemon brown peru red frosted|Manufacturer#3|Brand#33|SMALL BURNISHED NICKEL|25|LG PKG|1206.30| regular req +307|peru aquamarine powder firebrick goldenrod|Manufacturer#2|Brand#21|LARGE BURNISHED BRASS|30|WRAP DRUM|1207.30|eas. e +308|thistle midnight dim seashell red|Manufacturer#2|Brand#21|STANDARD BURNISHED BRASS|40|WRAP JAR|1208.30|ngside of the s +309|brown smoke chartreuse orchid chiffon|Manufacturer#4|Brand#42|LARGE ANODIZED NICKEL|49|JUMBO PKG|1209.30|lly even c +310|burlywood sienna cream beige navajo|Manufacturer#1|Brand#14|ECONOMY BRUSHED NICKEL|32|MED JAR|1210.31|arefully. requ +311|firebrick tomato moccasin orchid drab|Manufacturer#4|Brand#44|MEDIUM PLATED TIN|18|LG DRUM|1211.31|final, +312|maroon drab medium papaya frosted|Manufacturer#3|Brand#32|PROMO BURNISHED STEEL|29|MED CASE|1212.31|nts doze slyly. d +313|moccasin midnight tomato lime royal|Manufacturer#3|Brand#34|PROMO BRUSHED TIN|13|WRAP PACK|1213.31|nly regular +314|cornsilk magenta indian turquoise midnight|Manufacturer#3|Brand#35|STANDARD PLATED STEEL|14|LG DRUM|1214.31|ular deposits. +315|navy orchid cornflower cornsilk mint|Manufacturer#2|Brand#23|LARGE ANODIZED BRASS|20|LG JAR|1215.31|s was slyly pac +316|thistle cream lace honeydew forest|Manufacturer#4|Brand#41|MEDIUM BRUSHED TIN|9|MED CASE|1216.31|deposits haggle +317|linen peru chiffon black cream|Manufacturer#1|Brand#15|LARGE POLISHED STEEL|34|JUMBO BOX|1217.31|e furiously regular pa +318|moccasin rose sandy powder orange|Manufacturer#1|Brand#12|PROMO BURNISHED NICKEL|20|JUMBO CASE|1218.31|ar re +319|royal midnight bisque spring pink|Manufacturer#3|Brand#31|MEDIUM BURNISHED TIN|44|LG BOX|1219.31|kages boost along +320|chiffon brown beige burnished rose|Manufacturer#5|Brand#53|LARGE ANODIZED STEEL|26|WRAP DRUM|1220.32|structions a +321|papaya lace cornsilk cream misty|Manufacturer#5|Brand#51|ECONOMY ANODIZED STEEL|9|SM JAR|1221.32|tructions boost car +322|dark black rosy coral hot|Manufacturer#3|Brand#35|STANDARD PLATED STEEL|32|JUMBO CASE|1222.32|uses. blithely pendin +323|moccasin beige blanched linen ghost|Manufacturer#4|Brand#41|MEDIUM BRUSHED BRASS|15|MED CASE|1223.32|ular pi +324|goldenrod ivory beige violet cream|Manufacturer#2|Brand#25|SMALL PLATED TIN|36|SM BAG|1224.32|ages. requests wake. +325|linen metallic green cornsilk orange|Manufacturer#1|Brand#15|LARGE PLATED COPPER|22|MED PACK|1225.32|ackages. slyly pendin +326|cornsilk bisque hot misty deep|Manufacturer#3|Brand#34|LARGE ANODIZED STEEL|48|JUMBO CAN|1226.32|aggle slyly special f +327|metallic lavender midnight lemon violet|Manufacturer#2|Brand#23|PROMO POLISHED BRASS|14|SM PACK|1227.32|regular +328|cornflower grey snow burlywood mint|Manufacturer#3|Brand#34|PROMO POLISHED COPPER|24|JUMBO CASE|1228.32|ronic dependencies +329|beige aquamarine chiffon chocolate azure|Manufacturer#3|Brand#31|MEDIUM ANODIZED NICKEL|21|LG PKG|1229.32|. quickly pending pa +330|royal grey mint floral deep|Manufacturer#3|Brand#35|LARGE PLATED COPPER|18|LG JAR|1230.33|efully pending depend +331|metallic indian coral cream medium|Manufacturer#2|Brand#25|SMALL BURNISHED COPPER|15|WRAP JAR|1231.33| the slyly iron +332|olive cornflower dark blanched saddle|Manufacturer#2|Brand#24|STANDARD BRUSHED BRASS|14|SM CAN|1232.33|instru +333|chocolate goldenrod light brown navy|Manufacturer#2|Brand#21|ECONOMY POLISHED COPPER|1|LG DRUM|1233.33|accordi +334|thistle plum violet seashell goldenrod|Manufacturer#3|Brand#31|ECONOMY PLATED BRASS|32|LG JAR|1234.33|deas. blithely express +335|navajo linen steel grey turquoise|Manufacturer#3|Brand#32|SMALL BRUSHED COPPER|3|SM JAR|1235.33|ly ironic deposits h +336|maroon lavender goldenrod slate deep|Manufacturer#2|Brand#25|PROMO ANODIZED TIN|3|WRAP JAR|1236.33|nto beans. +337|magenta goldenrod blanched white lime|Manufacturer#2|Brand#23|MEDIUM BRUSHED COPPER|29|MED DRUM|1237.33|uests. carefully fin +338|cyan forest pink olive dodger|Manufacturer#1|Brand#14|LARGE ANODIZED NICKEL|26|JUMBO JAR|1238.33|of th +339|lace deep plum light orchid|Manufacturer#2|Brand#23|PROMO BURNISHED COPPER|14|LG PACK|1239.33|across the slyly expre +340|gainsboro saddle moccasin chartreuse light|Manufacturer#2|Brand#23|STANDARD BRUSHED TIN|3|JUMBO BOX|1240.34|l ideas wake. quic +341|light smoke dodger sienna blue|Manufacturer#4|Brand#45|PROMO POLISHED COPPER|34|MED PKG|1241.34|ully regular a +342|saddle hot brown peach rose|Manufacturer#4|Brand#43|LARGE BURNISHED NICKEL|37|JUMBO CAN|1242.34|riously final pac +343|grey ghost burlywood plum hot|Manufacturer#3|Brand#35|PROMO ANODIZED NICKEL|7|SM JAR|1243.34|s-- ironic foxes boost +344|lime pale chocolate linen white|Manufacturer#4|Brand#45|LARGE ANODIZED TIN|39|SM BOX|1244.34| according to the pend +345|beige turquoise tan black powder|Manufacturer#4|Brand#45|ECONOMY BURNISHED NICKEL|22|LG CAN|1245.34|un carefull +346|medium brown beige ivory plum|Manufacturer#5|Brand#51|ECONOMY BRUSHED COPPER|8|LG PKG|1246.34|benea +347|burnished deep rosy azure salmon|Manufacturer#3|Brand#34|SMALL ANODIZED TIN|28|WRAP BAG|1247.34|r, even instruct +348|goldenrod floral peach brown gainsboro|Manufacturer#5|Brand#53|MEDIUM POLISHED STEEL|16|WRAP BOX|1248.34| pending +349|slate bisque dark gainsboro cornsilk|Manufacturer#2|Brand#24|ECONOMY BURNISHED NICKEL|12|MED JAR|1249.34|tes. unusual acco +350|sky beige bisque black chiffon|Manufacturer#3|Brand#32|STANDARD ANODIZED NICKEL|25|WRAP CAN|1250.35|luffily p +351|slate pale spring seashell purple|Manufacturer#3|Brand#32|STANDARD PLATED TIN|48|WRAP CAN|1251.35|sts integrate. bl +352|honeydew cyan papaya hot lavender|Manufacturer#4|Brand#42|MEDIUM BURNISHED BRASS|44|JUMBO CAN|1252.35|lites ne +353|azure linen moccasin sky aquamarine|Manufacturer#3|Brand#34|PROMO BURNISHED TIN|43|WRAP JAR|1253.35|final packages use +354|coral midnight misty plum olive|Manufacturer#4|Brand#42|PROMO BURNISHED STEEL|38|LG CAN|1254.35|d requests wake +355|smoke chartreuse salmon blush azure|Manufacturer#5|Brand#52|ECONOMY POLISHED NICKEL|16|JUMBO JAR|1255.35| slyly bold theodoli +356|royal pink papaya lavender honeydew|Manufacturer#1|Brand#14|STANDARD BRUSHED NICKEL|46|WRAP BAG|1256.35|according to the furio +357|seashell peru powder drab orchid|Manufacturer#4|Brand#42|STANDARD PLATED COPPER|19|SM DRUM|1257.35|s use at +358|sandy chartreuse spring blanched drab|Manufacturer#2|Brand#24|STANDARD POLISHED BRASS|39|JUMBO PACK|1258.35|g grouches use slyly +359|drab chartreuse olive saddle chocolate|Manufacturer#3|Brand#35|PROMO PLATED BRASS|19|LG DRUM|1259.35|ithely +360|moccasin saddle yellow antique blue|Manufacturer#3|Brand#35|SMALL POLISHED COPPER|14|WRAP BOX|1260.36|. bold +361|chiffon green light forest burlywood|Manufacturer#5|Brand#52|SMALL ANODIZED COPPER|42|WRAP DRUM|1261.36| dolphins. carefully r +362|sienna ghost dim lime pink|Manufacturer#1|Brand#13|ECONOMY POLISHED COPPER|9|JUMBO BAG|1262.36|accounts. furi +363|rosy aquamarine black coral burnished|Manufacturer#2|Brand#22|MEDIUM ANODIZED BRASS|16|WRAP JAR|1263.36|ideas. regular ac +364|violet almond frosted dim chiffon|Manufacturer#4|Brand#43|LARGE BRUSHED NICKEL|21|MED PKG|1264.36|ach caref +365|olive lemon chartreuse floral honeydew|Manufacturer#3|Brand#31|SMALL POLISHED STEEL|8|LG CAN|1265.36|efully regula +366|antique puff aquamarine honeydew royal|Manufacturer#5|Brand#53|ECONOMY BURNISHED STEEL|46|WRAP DRUM|1266.36|unts cajole +367|navajo lavender cream chiffon ghost|Manufacturer#2|Brand#23|STANDARD PLATED BRASS|2|JUMBO PACK|1267.36|ly about the tithe +368|antique dodger indian moccasin powder|Manufacturer#5|Brand#52|ECONOMY BRUSHED TIN|8|SM PACK|1268.36|t the even, +369|grey hot sky dodger drab|Manufacturer#2|Brand#21|SMALL POLISHED BRASS|11|SM BOX|1269.36|ilent request +370|dodger lime steel maroon smoke|Manufacturer#5|Brand#52|LARGE BRUSHED COPPER|46|JUMBO BOX|1270.37|ost quickly against +371|maroon blue aquamarine lime chiffon|Manufacturer#4|Brand#45|ECONOMY ANODIZED COPPER|27|MED BAG|1271.37|o beans. even inst +372|violet midnight ivory misty medium|Manufacturer#3|Brand#32|LARGE ANODIZED STEEL|35|LG CAN|1272.37| regular accounts +373|beige orchid chocolate ghost drab|Manufacturer#5|Brand#53|STANDARD PLATED TIN|37|JUMBO PACK|1273.37| after the fl +374|saddle mint orchid firebrick cornsilk|Manufacturer#1|Brand#11|LARGE PLATED STEEL|18|MED BOX|1274.37| packages. furiou +375|lawn goldenrod dim puff black|Manufacturer#1|Brand#15|SMALL POLISHED BRASS|16|JUMBO JAR|1275.37| ironic courts aga +376|blush powder wheat aquamarine steel|Manufacturer#4|Brand#44|MEDIUM BRUSHED STEEL|44|SM PKG|1276.37|blithe +377|dim ivory magenta burnished almond|Manufacturer#4|Brand#44|STANDARD BURNISHED COPPER|16|WRAP BOX|1277.37|ly regula +378|burnished chartreuse goldenrod tomato yellow|Manufacturer#3|Brand#32|SMALL PLATED COPPER|45|JUMBO PACK|1278.37| slyly careful, ironic +379|indian lawn cornflower blush white|Manufacturer#3|Brand#33|ECONOMY POLISHED STEEL|5|SM CASE|1279.37|l have to sl +380|khaki cornflower coral moccasin lime|Manufacturer#4|Brand#41|LARGE BRUSHED TIN|6|JUMBO DRUM|1280.38|tions. blithely ev +381|pink beige slate light purple|Manufacturer#5|Brand#53|ECONOMY ANODIZED COPPER|37|LG CASE|1281.38|ons. furiousl +382|honeydew seashell khaki pink rosy|Manufacturer#4|Brand#41|LARGE POLISHED BRASS|4|SM CAN|1282.38|blithely +383|seashell tan purple almond navy|Manufacturer#2|Brand#23|SMALL BRUSHED COPPER|45|SM PACK|1283.38|telet +384|lime thistle rosy midnight powder|Manufacturer#4|Brand#43|STANDARD BURNISHED TIN|2|WRAP CAN|1284.38|blithel +385|floral midnight burnished yellow red|Manufacturer#1|Brand#12|STANDARD PLATED TIN|41|WRAP JAR|1285.38|nts wake +386|red pink azure midnight antique|Manufacturer#1|Brand#13|STANDARD PLATED STEEL|4|SM BOX|1286.38|ests. final a +387|midnight white metallic sky chartreuse|Manufacturer#3|Brand#34|LARGE BRUSHED COPPER|23|WRAP CASE|1287.38|gular w +388|bisque floral green cream slate|Manufacturer#1|Brand#11|STANDARD POLISHED STEEL|20|LG PKG|1288.38|nt pinto beans after t +389|blue indian coral tan purple|Manufacturer#1|Brand#11|PROMO BRUSHED TIN|16|MED PKG|1289.38|cial pinto beans amo +390|sienna gainsboro saddle bisque lemon|Manufacturer#5|Brand#54|SMALL ANODIZED COPPER|24|MED DRUM|1290.39|unts integrate +391|cyan cornsilk medium firebrick sienna|Manufacturer#4|Brand#41|SMALL PLATED STEEL|18|LG PACK|1291.39|ickly ironic f +392|papaya plum powder black salmon|Manufacturer#4|Brand#42|MEDIUM BRUSHED COPPER|21|SM BOX|1292.39|even request +393|blue puff frosted slate goldenrod|Manufacturer#3|Brand#34|STANDARD PLATED NICKEL|36|JUMBO CAN|1293.39|gular pi +394|white indian cream pale yellow|Manufacturer#1|Brand#11|MEDIUM POLISHED STEEL|33|MED JAR|1294.39|ely even excuses. +395|spring cornflower royal chartreuse orange|Manufacturer#3|Brand#32|MEDIUM BURNISHED BRASS|9|LG BOX|1295.39|sits haggle fluffily +396|cream royal deep almond drab|Manufacturer#3|Brand#35|SMALL BURNISHED COPPER|37|SM CASE|1296.39|ctions. silent packag +397|misty spring moccasin gainsboro beige|Manufacturer#1|Brand#15|LARGE ANODIZED COPPER|3|JUMBO JAR|1297.39|ly ironic pains. f +398|dark antique ghost cornsilk black|Manufacturer#3|Brand#32|MEDIUM BRUSHED NICKEL|32|SM DRUM|1298.39|ickly sp +399|orange peach yellow blue seashell|Manufacturer#2|Brand#21|LARGE BRUSHED BRASS|37|WRAP BAG|1299.39|nts sleep dog +400|rose honeydew olive chartreuse salmon|Manufacturer#2|Brand#21|ECONOMY POLISHED BRASS|32|SM BOX|1300.40| nag. quick +401|almond wheat bisque ghost chiffon|Manufacturer#2|Brand#21|ECONOMY POLISHED STEEL|10|SM PKG|1301.40|ideas cajole +402|forest rosy indian puff mint|Manufacturer#4|Brand#45|LARGE ANODIZED BRASS|16|SM PACK|1302.40|s above t +403|floral rose plum honeydew burnished|Manufacturer#4|Brand#45|MEDIUM BURNISHED STEEL|19|JUMBO DRUM|1303.40|ic requ +404|maroon plum peru grey navajo|Manufacturer#4|Brand#41|STANDARD ANODIZED NICKEL|9|SM CASE|1304.40|ckages integrate blit +405|ivory deep sandy linen misty|Manufacturer#3|Brand#34|STANDARD BRUSHED BRASS|17|WRAP JAR|1305.40|e to maintain careful +406|cyan maroon burnished powder lavender|Manufacturer#2|Brand#21|STANDARD PLATED STEEL|43|JUMBO JAR|1306.40|ake foxes- +407|brown lime deep plum burlywood|Manufacturer#5|Brand#53|LARGE BRUSHED NICKEL|39|SM JAR|1307.40|quickl +408|blue metallic peach forest orchid|Manufacturer#2|Brand#24|PROMO POLISHED STEEL|4|MED PKG|1308.40|refully b +409|sandy floral antique khaki honeydew|Manufacturer#4|Brand#44|SMALL PLATED NICKEL|40|MED CASE|1309.40|usly above +410|tomato sienna chiffon burlywood dark|Manufacturer#2|Brand#25|STANDARD PLATED NICKEL|36|JUMBO BOX|1310.41| ironic pa +411|plum cyan antique tomato violet|Manufacturer#1|Brand#12|ECONOMY BURNISHED STEEL|17|JUMBO DRUM|1311.41|o beans a +412|slate puff cornflower blanched wheat|Manufacturer#1|Brand#14|SMALL ANODIZED STEEL|33|WRAP PKG|1312.41|ccording to the fur +413|chocolate royal lavender light bisque|Manufacturer#3|Brand#33|PROMO PLATED STEEL|49|MED PKG|1313.41|r deposits wake. alw +414|cornflower chiffon goldenrod black smoke|Manufacturer#4|Brand#41|SMALL BURNISHED STEEL|50|WRAP CASE|1314.41|efully. dolph +415|dark azure almond beige bisque|Manufacturer#2|Brand#22|MEDIUM ANODIZED COPPER|42|SM DRUM|1315.41|blithely blit +416|ghost misty green lace almond|Manufacturer#1|Brand#13|MEDIUM POLISHED STEEL|11|WRAP JAR|1316.41|yly pending deposit +417|gainsboro cream turquoise saddle dodger|Manufacturer#1|Brand#14|MEDIUM PLATED TIN|31|LG BAG|1317.41| nag blithely: ex +418|lavender orange burlywood floral dodger|Manufacturer#1|Brand#11|MEDIUM ANODIZED NICKEL|32|JUMBO JAR|1318.41| ironic deposits. requ +419|cyan navajo sandy purple ivory|Manufacturer#4|Brand#43|ECONOMY BRUSHED TIN|42|WRAP BAG|1319.41|boost slyly among t +420|blue azure metallic chiffon khaki|Manufacturer#2|Brand#23|PROMO BRUSHED TIN|15|LG JAR|1320.42|y. fluffi +421|black powder tan blue magenta|Manufacturer#1|Brand#12|LARGE PLATED STEEL|36|WRAP PACK|1321.42|regular +422|honeydew beige navy lawn smoke|Manufacturer#3|Brand#33|STANDARD POLISHED TIN|16|LG CAN|1322.42| bold +423|midnight olive cyan grey dim|Manufacturer#3|Brand#31|PROMO BRUSHED BRASS|2|SM JAR|1323.42|accou +424|antique grey almond coral lace|Manufacturer#3|Brand#34|SMALL BRUSHED TIN|9|LG CASE|1324.42|usly slyl +425|ivory drab sandy navajo rose|Manufacturer#3|Brand#32|PROMO BRUSHED STEEL|23|JUMBO BOX|1325.42|ndenci +426|papaya lavender beige light blue|Manufacturer#1|Brand#14|STANDARD ANODIZED NICKEL|42|WRAP PACK|1326.42|furiously even pa +427|honeydew midnight antique rosy burnished|Manufacturer#2|Brand#22|PROMO BURNISHED NICKEL|47|JUMBO CAN|1327.42|ts. express, unusual +428|salmon steel firebrick linen pale|Manufacturer#5|Brand#54|LARGE BURNISHED TIN|14|JUMBO CASE|1328.42|furiously ir +429|floral snow yellow indian mint|Manufacturer#4|Brand#45|ECONOMY BRUSHED COPPER|21|MED DRUM|1329.42| carefully even +430|black midnight dark blue honeydew|Manufacturer#3|Brand#34|PROMO BURNISHED NICKEL|34|MED CAN|1330.43| sleep. slyly pend +431|frosted slate rose papaya maroon|Manufacturer#4|Brand#45|MEDIUM POLISHED TIN|30|SM PACK|1331.43|iousl +432|white cornflower indian red hot|Manufacturer#2|Brand#21|MEDIUM PLATED BRASS|6|MED JAR|1332.43|s nag furiously fluff +433|drab goldenrod cornflower coral dim|Manufacturer#1|Brand#12|STANDARD BURNISHED TIN|2|SM PACK|1333.43|ts haggle furiously +434|cornsilk snow violet dark pale|Manufacturer#5|Brand#51|ECONOMY BURNISHED COPPER|20|JUMBO BAG|1334.43|y against the c +435|coral gainsboro blue indian green|Manufacturer#3|Brand#35|ECONOMY ANODIZED BRASS|17|WRAP BAG|1335.43|carefully ironic pack +436|turquoise violet drab blush white|Manufacturer#1|Brand#14|LARGE POLISHED BRASS|50|WRAP CASE|1336.43| the regul +437|purple drab forest navy sandy|Manufacturer#5|Brand#54|ECONOMY PLATED TIN|17|WRAP PACK|1337.43|e furiously +438|green orchid chocolate powder chartreuse|Manufacturer#1|Brand#15|LARGE BURNISHED TIN|31|LG DRUM|1338.43|epitaphs wake +439|bisque cyan rosy chiffon cornsilk|Manufacturer#2|Brand#21|MEDIUM BURNISHED TIN|32|SM PKG|1339.43|uests wake slyly over +440|snow lime pale linen blanched|Manufacturer#3|Brand#34|ECONOMY BURNISHED BRASS|22|MED CASE|1340.44|furiously above the +441|goldenrod white sienna almond blue|Manufacturer#3|Brand#35|PROMO BURNISHED STEEL|24|MED BOX|1341.44|s wake atop the ru +442|honeydew cornsilk plum saddle puff|Manufacturer#4|Brand#41|LARGE BURNISHED TIN|22|MED PACK|1342.44|refully al +443|chocolate frosted grey indian rosy|Manufacturer#4|Brand#44|STANDARD BURNISHED BRASS|10|SM BOX|1343.44|arefully. sl +444|burnished lace floral indian red|Manufacturer#3|Brand#32|MEDIUM ANODIZED COPPER|42|LG JAR|1344.44|ickly special excuse +445|dark blanched gainsboro coral blue|Manufacturer#1|Brand#12|LARGE BURNISHED NICKEL|47|SM DRUM|1345.44|s about the re +446|sandy beige metallic azure medium|Manufacturer#1|Brand#12|STANDARD BURNISHED NICKEL|11|WRAP CASE|1346.44|s sentiments affix +447|coral lemon chiffon ghost bisque|Manufacturer#5|Brand#53|STANDARD BURNISHED COPPER|22|LG JAR|1347.44|s theodolites above th +448|wheat blush cornsilk burnished linen|Manufacturer#1|Brand#13|PROMO POLISHED BRASS|31|LG CAN|1348.44| excuses affix silen +449|forest slate coral dark goldenrod|Manufacturer#2|Brand#25|MEDIUM BRUSHED BRASS|47|JUMBO BAG|1349.44|ular, unusual p +450|sky black goldenrod orchid antique|Manufacturer#4|Brand#43|MEDIUM BURNISHED TIN|23|SM CASE|1350.45|slyly +451|rosy burnished sienna chocolate blush|Manufacturer#4|Brand#42|PROMO PLATED TIN|28|WRAP DRUM|1351.45| detect blithely bl +452|gainsboro hot yellow coral beige|Manufacturer#1|Brand#11|STANDARD ANODIZED STEEL|48|JUMBO BOX|1352.45|ic requests wake +453|lemon navy beige green black|Manufacturer#3|Brand#34|ECONOMY ANODIZED TIN|20|LG CASE|1353.45|y above the pen +454|royal chocolate orchid tomato violet|Manufacturer#5|Brand#53|MEDIUM BURNISHED STEEL|32|LG BOX|1354.45|ual requests. +455|purple black lime deep chartreuse|Manufacturer#2|Brand#22|LARGE BRUSHED BRASS|18|MED JAR|1355.45|ongside of the careful +456|blue magenta drab honeydew pale|Manufacturer#5|Brand#53|PROMO POLISHED BRASS|40|SM PKG|1356.45|usual, +457|almond linen cyan bisque dim|Manufacturer#5|Brand#52|SMALL POLISHED TIN|46|SM CAN|1357.45|express accounts. sp +458|slate pale chocolate hot magenta|Manufacturer#2|Brand#22|PROMO BRUSHED COPPER|38|MED BAG|1358.45|structions sleep +459|beige slate linen dark cyan|Manufacturer#2|Brand#23|MEDIUM ANODIZED NICKEL|27|SM PACK|1359.45| blithely. fur +460|cream papaya orange purple lawn|Manufacturer#3|Brand#35|STANDARD ANODIZED BRASS|47|JUMBO DRUM|1360.46|he carefully +461|goldenrod dim light tan forest|Manufacturer#5|Brand#54|SMALL BRUSHED TIN|44|JUMBO CASE|1361.46|: slyly express pa +462|black yellow sandy drab hot|Manufacturer#5|Brand#54|MEDIUM BURNISHED BRASS|11|WRAP CAN|1362.46|s sleep quickly care +463|lemon puff mint pale cornflower|Manufacturer#2|Brand#21|MEDIUM ANODIZED COPPER|48|MED PACK|1363.46|unts use fluffily +464|misty thistle navy medium salmon|Manufacturer#4|Brand#42|LARGE BURNISHED NICKEL|34|LG BOX|1364.46|l decoys. close exc +465|ivory peach aquamarine blush metallic|Manufacturer#4|Brand#42|SMALL POLISHED BRASS|12|MED JAR|1365.46|nts. slyly special ac +466|deep metallic chocolate dark honeydew|Manufacturer#3|Brand#33|PROMO POLISHED BRASS|12|LG PKG|1366.46|ly special pains. iron +467|burlywood slate midnight antique misty|Manufacturer#2|Brand#24|STANDARD BURNISHED STEEL|48|JUMBO PACK|1367.46|ependenc +468|spring green plum lemon azure|Manufacturer#4|Brand#41|MEDIUM BURNISHED STEEL|24|SM PACK|1368.46|o the +469|mint magenta steel blush beige|Manufacturer#1|Brand#13|MEDIUM POLISHED STEEL|43|WRAP PKG|1369.46|osits. slyly unusua +470|honeydew coral hot royal blush|Manufacturer#2|Brand#24|STANDARD BRUSHED TIN|38|JUMBO CASE|1370.47|ess deposits +471|tan aquamarine ivory yellow burlywood|Manufacturer#1|Brand#11|LARGE BRUSHED STEEL|21|JUMBO BAG|1371.47|sits nag caref +472|green mint snow gainsboro chiffon|Manufacturer#3|Brand#31|PROMO BRUSHED COPPER|24|SM JAR|1372.47| according +473|antique moccasin light papaya lavender|Manufacturer#1|Brand#12|ECONOMY PLATED STEEL|2|MED DRUM|1373.47|e furious +474|gainsboro chiffon dodger orchid royal|Manufacturer#1|Brand#14|ECONOMY PLATED STEEL|45|LG PACK|1374.47|ously even reques +475|maroon black firebrick dark orange|Manufacturer#3|Brand#34|STANDARD ANODIZED NICKEL|30|MED PACK|1375.47|thely unusual th +476|dim blanched purple slate salmon|Manufacturer#3|Brand#33|STANDARD POLISHED COPPER|33|WRAP PACK|1376.47| according to the blit +477|plum gainsboro pale dim khaki|Manufacturer#1|Brand#11|ECONOMY ANODIZED COPPER|35|JUMBO BAG|1377.47|lent s +478|blush forest chiffon light seashell|Manufacturer#4|Brand#45|STANDARD POLISHED COPPER|11|MED CASE|1378.47|ly bold foxes ca +479|light forest slate lime aquamarine|Manufacturer#2|Brand#25|MEDIUM PLATED STEEL|35|SM BAG|1379.47| pending ac +480|cyan rosy beige lavender hot|Manufacturer#5|Brand#54|MEDIUM ANODIZED STEEL|31|WRAP BOX|1380.48|eans. quickly +481|deep light cornflower red dim|Manufacturer#1|Brand#14|MEDIUM BURNISHED BRASS|17|JUMBO PACK|1381.48|s cajole som +482|burnished violet peru blush gainsboro|Manufacturer#5|Brand#53|MEDIUM POLISHED STEEL|11|SM DRUM|1382.48|deposits. fluffily b +483|honeydew grey midnight drab powder|Manufacturer#1|Brand#15|MEDIUM ANODIZED COPPER|9|SM PKG|1383.48|usly final instru +484|brown green lace papaya cornflower|Manufacturer#1|Brand#15|MEDIUM POLISHED BRASS|34|SM CASE|1384.48|uffily final deposits. +485|orchid steel sandy aquamarine honeydew|Manufacturer#3|Brand#31|PROMO PLATED STEEL|44|LG JAR|1385.48| requests. regularly r +486|tomato violet misty chartreuse salmon|Manufacturer#4|Brand#45|SMALL PLATED COPPER|15|MED PKG|1386.48|ent accounts among t +487|orange hot cream medium smoke|Manufacturer#5|Brand#52|SMALL BRUSHED COPPER|43|WRAP PACK|1387.48|iously ruthles +488|tomato moccasin coral dim beige|Manufacturer#2|Brand#21|PROMO PLATED BRASS|47|JUMBO JAR|1388.48| the slyly pending r +489|lime azure drab cyan blanched|Manufacturer#2|Brand#22|LARGE BURNISHED TIN|36|LG CAN|1389.48|unts. quickly bold id +490|dark midnight bisque deep olive|Manufacturer#4|Brand#41|SMALL PLATED NICKEL|11|MED BOX|1390.49|fluffily express packa +491|snow midnight powder almond firebrick|Manufacturer#3|Brand#31|SMALL POLISHED BRASS|42|MED JAR|1391.49| deposit +492|burlywood rose moccasin forest brown|Manufacturer#4|Brand#42|MEDIUM BRUSHED COPPER|13|JUMBO DRUM|1392.49|yly slyly express th +493|almond frosted lime navajo olive|Manufacturer#4|Brand#45|MEDIUM BURNISHED BRASS|8|MED PKG|1393.49|uses. bold +494|navy pale sienna lace snow|Manufacturer#4|Brand#42|STANDARD BRUSHED NICKEL|40|MED PKG|1394.49|y pending theodo +495|salmon brown burnished firebrick navajo|Manufacturer#4|Brand#42|SMALL BRUSHED BRASS|28|MED PKG|1395.49|, ironic pac +496|frosted almond azure snow khaki|Manufacturer#1|Brand#12|STANDARD BRUSHED BRASS|11|SM BAG|1396.49|ealthily +497|chiffon aquamarine blanched cornsilk maroon|Manufacturer#2|Brand#25|PROMO PLATED TIN|1|SM CAN|1397.49|l accounts sl +498|red sienna dark papaya burnished|Manufacturer#2|Brand#25|MEDIUM POLISHED STEEL|21|WRAP CASE|1398.49|lthily even co +499|linen burnished turquoise blush bisque|Manufacturer#3|Brand#35|SMALL PLATED COPPER|38|JUMBO PKG|1399.49|furiously across +500|mint azure spring dim cornsilk|Manufacturer#4|Brand#41|MEDIUM POLISHED STEEL|13|SM JAR|1400.50|regul +501|tomato almond goldenrod cornsilk brown|Manufacturer#4|Brand#45|SMALL BURNISHED COPPER|37|SM BAG|1401.50|press pinto b +502|floral almond goldenrod light midnight|Manufacturer#2|Brand#21|SMALL PLATED TIN|6|JUMBO DRUM|1402.50|quests integrate +503|lavender frosted snow cornsilk almond|Manufacturer#2|Brand#24|PROMO BRUSHED NICKEL|30|SM PKG|1403.50| the dep +504|pink tan lace hot ivory|Manufacturer#2|Brand#24|PROMO BRUSHED STEEL|10|SM JAR|1404.50|refully after the fu +505|red burlywood coral sky drab|Manufacturer#4|Brand#42|STANDARD PLATED BRASS|32|WRAP JAR|1405.50|ly even +506|almond firebrick gainsboro bisque lace|Manufacturer#1|Brand#14|PROMO BRUSHED NICKEL|30|WRAP PACK|1406.50|y ruthless, fi +507|red misty salmon black blue|Manufacturer#4|Brand#43|SMALL ANODIZED BRASS|20|SM CASE|1407.50|ial foxes. furiously +508|blanched peach bisque saddle plum|Manufacturer#1|Brand#14|LARGE ANODIZED TIN|40|WRAP PKG|1408.50|ect according +509|peru cornflower linen bisque firebrick|Manufacturer#1|Brand#13|MEDIUM BRUSHED NICKEL|30|MED CAN|1409.50|eposits. slyly +510|tomato forest gainsboro purple chartreuse|Manufacturer#4|Brand#43|SMALL PLATED NICKEL|25|JUMBO PACK|1410.51|al platelets. iro +511|orchid pale yellow bisque mint|Manufacturer#1|Brand#15|STANDARD BRUSHED COPPER|2|LG JAR|1411.51|ss package +512|cornflower chartreuse mint drab bisque|Manufacturer#5|Brand#51|PROMO ANODIZED COPPER|18|LG PACK|1412.51|dolphins cajo +513|light thistle grey lime saddle|Manufacturer#3|Brand#32|MEDIUM BRUSHED STEEL|10|WRAP CAN|1413.51| after th +514|rosy sky puff lemon burlywood|Manufacturer#4|Brand#42|LARGE POLISHED BRASS|10|JUMBO BOX|1414.51|omise +515|indian dim lime blue peach|Manufacturer#5|Brand#53|MEDIUM PLATED TIN|37|WRAP BOX|1415.51|ular asymptotes im +516|purple red khaki beige smoke|Manufacturer#1|Brand#12|SMALL BRUSHED NICKEL|28|LG CAN|1416.51|ly express +517|tomato firebrick violet mint snow|Manufacturer#3|Brand#34|SMALL BURNISHED COPPER|30|WRAP CAN|1417.51|uses. +518|yellow tomato lavender rose puff|Manufacturer#4|Brand#43|PROMO BRUSHED BRASS|33|JUMBO DRUM|1418.51|n requests hag +519|blush medium cyan black snow|Manufacturer#3|Brand#32|LARGE BRUSHED BRASS|24|WRAP PACK|1419.51|xes are fluffily fluf +520|blanched grey frosted pale almond|Manufacturer#1|Brand#12|PROMO BURNISHED BRASS|49|MED CASE|1420.52| foxes. +521|grey cream almond lime deep|Manufacturer#3|Brand#35|PROMO BRUSHED STEEL|21|JUMBO DRUM|1421.52|the blithe +522|frosted cornflower turquoise saddle chartreuse|Manufacturer#3|Brand#32|STANDARD BRUSHED NICKEL|15|MED CASE|1422.52|deas. brave ac +523|burlywood ghost pale honeydew dodger|Manufacturer#4|Brand#42|ECONOMY BRUSHED NICKEL|7|JUMBO JAR|1423.52|e blithe +524|deep seashell dodger drab antique|Manufacturer#1|Brand#14|SMALL ANODIZED STEEL|17|JUMBO PACK|1424.52|ly reg +525|metallic midnight chocolate khaki royal|Manufacturer#3|Brand#33|STANDARD BURNISHED STEEL|47|JUMBO CAN|1425.52|ly except +526|orchid frosted wheat powder blush|Manufacturer#5|Brand#53|PROMO ANODIZED BRASS|47|JUMBO PKG|1426.52|ronic, iro +527|pink drab purple navajo cornflower|Manufacturer#3|Brand#32|MEDIUM POLISHED NICKEL|39|LG JAR|1427.52|counts wake abov +528|cornsilk lace magenta rose slate|Manufacturer#2|Brand#24|STANDARD PLATED STEEL|40|LG CAN|1428.52|ly ironic pl +529|lavender aquamarine peru slate navajo|Manufacturer#3|Brand#31|MEDIUM PLATED NICKEL|33|SM PKG|1429.52|y along the +530|mint lemon chartreuse lime royal|Manufacturer#4|Brand#42|PROMO PLATED STEEL|45|JUMBO CASE|1430.53|kages about t +531|purple hot floral puff almond|Manufacturer#2|Brand#22|ECONOMY POLISHED NICKEL|16|WRAP DRUM|1431.53| atta +532|midnight lace chiffon maroon powder|Manufacturer#1|Brand#14|LARGE BRUSHED NICKEL|45|WRAP BAG|1432.53|s. blithely +533|hot ivory grey azure light|Manufacturer#2|Brand#24|PROMO PLATED STEEL|38|JUMBO PACK|1433.53|ng the blithely final +534|bisque pink plum burnished firebrick|Manufacturer#5|Brand#53|STANDARD PLATED NICKEL|27|LG CASE|1434.53|rts poach over th +535|lime rosy deep pale rose|Manufacturer#5|Brand#53|STANDARD PLATED TIN|17|SM CASE|1435.53|he unusual idea +536|orchid violet tan bisque indian|Manufacturer#2|Brand#23|STANDARD PLATED STEEL|36|JUMBO BAG|1436.53|le slyl +537|azure olive aquamarine coral yellow|Manufacturer#1|Brand#15|ECONOMY BRUSHED TIN|26|WRAP BOX|1437.53|fully regular platelet +538|deep bisque smoke metallic thistle|Manufacturer#1|Brand#15|ECONOMY POLISHED STEEL|24|SM PACK|1438.53|ic epitap +539|plum metallic salmon dim lime|Manufacturer#3|Brand#34|MEDIUM BURNISHED TIN|4|SM DRUM|1439.53| deposits. fi +540|violet white steel midnight black|Manufacturer#1|Brand#14|MEDIUM PLATED NICKEL|7|LG PACK|1440.54|cial, pending account +541|seashell lawn hot forest lemon|Manufacturer#3|Brand#35|STANDARD ANODIZED NICKEL|34|LG JAR|1441.54|s are fluffily above t +542|light brown cornsilk indian antique|Manufacturer#1|Brand#11|SMALL BRUSHED STEEL|40|WRAP CASE|1442.54|sits bo +543|dodger chartreuse pale medium mint|Manufacturer#5|Brand#54|ECONOMY POLISHED BRASS|4|JUMBO BOX|1443.54| cajole +544|brown dodger hot frosted cream|Manufacturer#2|Brand#22|STANDARD BURNISHED NICKEL|42|SM CASE|1444.54|leep slyl +545|purple peach indian smoke papaya|Manufacturer#3|Brand#31|LARGE PLATED NICKEL|14|MED JAR|1445.54|arefully regular packa +546|metallic green indian steel blanched|Manufacturer#2|Brand#25|ECONOMY ANODIZED STEEL|8|LG CASE|1446.54|ly unusu +547|cornflower turquoise navy coral beige|Manufacturer#4|Brand#43|MEDIUM BURNISHED COPPER|48|WRAP DRUM|1447.54|ial theodolites among +548|blue peru lavender cream metallic|Manufacturer#3|Brand#33|ECONOMY ANODIZED TIN|28|SM CAN|1448.54|gular +549|lavender goldenrod hot salmon puff|Manufacturer#5|Brand#53|SMALL BRUSHED BRASS|36|SM CAN|1449.54|ly unus +550|violet blush maroon wheat cream|Manufacturer#4|Brand#44|STANDARD BRUSHED STEEL|27|SM JAR|1450.55|arefully iron +551|wheat blush firebrick bisque medium|Manufacturer#5|Brand#54|LARGE BURNISHED TIN|10|MED JAR|1451.55|dolites cajole furious +552|turquoise hot mint drab burlywood|Manufacturer#4|Brand#44|LARGE POLISHED BRASS|1|JUMBO CAN|1452.55|longside of the sl +553|gainsboro deep lavender khaki blanched|Manufacturer#2|Brand#23|SMALL POLISHED NICKEL|1|WRAP DRUM|1453.55|fily regular depen +554|ghost lavender navajo medium light|Manufacturer#5|Brand#53|STANDARD BRUSHED STEEL|31|LG JAR|1454.55|ts? ironically +555|thistle brown blue honeydew slate|Manufacturer#4|Brand#42|PROMO BURNISHED TIN|49|SM JAR|1455.55|es hag +556|powder frosted antique seashell cream|Manufacturer#2|Brand#23|SMALL BRUSHED BRASS|49|WRAP JAR|1456.55|ar theodolites ma +557|maroon ghost chocolate antique brown|Manufacturer#3|Brand#35|LARGE BURNISHED TIN|8|JUMBO PKG|1457.55|ccounts im +558|blanched wheat papaya linen gainsboro|Manufacturer#3|Brand#31|STANDARD PLATED BRASS|25|MED BOX|1458.55|eposits. slyly +559|wheat aquamarine moccasin firebrick dark|Manufacturer#3|Brand#31|LARGE PLATED STEEL|27|SM PKG|1459.55|stealthily express +560|orchid indian peru green saddle|Manufacturer#2|Brand#25|STANDARD BRUSHED COPPER|37|WRAP PKG|1460.56|e special pac +561|blue burlywood green chiffon olive|Manufacturer#1|Brand#14|SMALL POLISHED STEEL|44|JUMBO CASE|1461.56|-- ironic, iron +562|lime blue thistle drab cornsilk|Manufacturer#3|Brand#32|SMALL BURNISHED STEEL|16|MED PACK|1462.56| fluffi +563|spring goldenrod forest light magenta|Manufacturer#3|Brand#31|MEDIUM POLISHED STEEL|39|MED DRUM|1463.56|furiously bold, +564|saddle beige pale cream chiffon|Manufacturer#2|Brand#22|LARGE ANODIZED BRASS|41|SM PKG|1464.56|blithely after the ev +565|dodger metallic sienna linen purple|Manufacturer#1|Brand#14|PROMO BRUSHED STEEL|9|JUMBO JAR|1465.56| blithely unusual r +566|seashell cornflower white smoke aquamarine|Manufacturer#2|Brand#25|ECONOMY BURNISHED TIN|19|LG PKG|1466.56|ounts wake across t +567|midnight lace white turquoise medium|Manufacturer#5|Brand#55|STANDARD BRUSHED STEEL|19|JUMBO BAG|1467.56|pending pinto +568|magenta tan orchid frosted beige|Manufacturer#3|Brand#31|PROMO POLISHED STEEL|6|SM BOX|1468.56|ts. ideas along t +569|cornflower aquamarine burlywood goldenrod lemon|Manufacturer#4|Brand#41|SMALL BRUSHED TIN|46|MED BOX|1469.56|y according to +570|lavender slate turquoise deep lawn|Manufacturer#5|Brand#51|ECONOMY BRUSHED COPPER|44|SM PKG|1470.57|le. s +571|chartreuse orchid dim beige forest|Manufacturer#2|Brand#22|LARGE PLATED TIN|1|WRAP CAN|1471.57|ly ironic +572|navy plum light bisque burnished|Manufacturer#4|Brand#43|LARGE BURNISHED COPPER|3|SM BOX|1472.57|requests use +573|dark metallic floral chocolate mint|Manufacturer#2|Brand#23|SMALL PLATED TIN|42|WRAP PACK|1473.57|expres +574|khaki snow beige aquamarine linen|Manufacturer#2|Brand#23|SMALL PLATED BRASS|36|SM PACK|1474.57|oss th +575|gainsboro seashell peach khaki firebrick|Manufacturer#1|Brand#14|SMALL BRUSHED NICKEL|10|MED CAN|1475.57|ns integrate a +576|cornsilk lace forest chocolate drab|Manufacturer#3|Brand#32|PROMO BURNISHED TIN|27|SM CAN|1476.57| foxes. accounts bo +577|black goldenrod cyan slate magenta|Manufacturer#2|Brand#22|LARGE BRUSHED STEEL|34|JUMBO BAG|1477.57|ding, fur +578|black dim lace almond bisque|Manufacturer#4|Brand#41|MEDIUM ANODIZED NICKEL|9|WRAP DRUM|1478.57| furiously iron +579|goldenrod floral azure peach antique|Manufacturer#3|Brand#31|STANDARD POLISHED STEEL|8|WRAP JAR|1479.57|ades. carefully +580|navajo chiffon lawn grey puff|Manufacturer#1|Brand#12|LARGE BURNISHED COPPER|30|JUMBO PACK|1480.58|usly expre +581|khaki gainsboro lawn grey red|Manufacturer#2|Brand#25|ECONOMY ANODIZED BRASS|44|SM BAG|1481.58| furious foxes. silen +582|frosted olive antique red coral|Manufacturer#4|Brand#45|LARGE BRUSHED TIN|23|MED JAR|1482.58|y bold +583|rose brown orange dodger cream|Manufacturer#3|Brand#33|LARGE BURNISHED NICKEL|35|JUMBO CAN|1483.58| sleep +584|moccasin beige dark purple brown|Manufacturer#1|Brand#12|SMALL POLISHED COPPER|42|MED JAR|1484.58|lar, ironic ac +585|peru hot blue saddle white|Manufacturer#5|Brand#53|SMALL PLATED COPPER|7|JUMBO PKG|1485.58|sts haggle q +586|sandy rosy gainsboro dark brown|Manufacturer#1|Brand#11|PROMO ANODIZED BRASS|11|LG DRUM|1486.58|ts haggle fluffily +587|blanched magenta almond blue saddle|Manufacturer#4|Brand#44|SMALL POLISHED STEEL|35|MED PKG|1487.58|c accounts. qui +588|forest powder indian mint blush|Manufacturer#5|Brand#55|SMALL PLATED COPPER|45|WRAP BAG|1488.58|ss foxes. even, ex +589|red olive saddle blanched cornsilk|Manufacturer#1|Brand#13|LARGE POLISHED BRASS|3|SM PKG|1489.58|cies. regul +590|lemon indian green royal aquamarine|Manufacturer#4|Brand#42|LARGE POLISHED COPPER|38|WRAP PKG|1490.59| dependencies sho +591|peach burlywood saddle midnight linen|Manufacturer#1|Brand#14|ECONOMY PLATED NICKEL|40|SM PKG|1491.59| the b +592|dodger midnight chocolate wheat ivory|Manufacturer#2|Brand#23|LARGE POLISHED STEEL|7|MED DRUM|1492.59|ide of the notorni +593|pink chiffon sandy spring cream|Manufacturer#2|Brand#25|PROMO POLISHED STEEL|20|JUMBO CASE|1493.59|ake after +594|moccasin beige burlywood floral smoke|Manufacturer#3|Brand#31|PROMO BRUSHED BRASS|28|SM JAR|1494.59|s detect fu +595|seashell beige forest coral lace|Manufacturer#5|Brand#51|PROMO BRUSHED BRASS|23|JUMBO JAR|1495.59|yly fin +596|slate light gainsboro dark seashell|Manufacturer#5|Brand#52|STANDARD POLISHED TIN|35|JUMBO JAR|1496.59|epend +597|cyan dark green lime orchid|Manufacturer#4|Brand#44|STANDARD ANODIZED NICKEL|36|SM DRUM|1497.59|ronic foxes. speci +598|brown khaki dodger violet blush|Manufacturer#2|Brand#24|MEDIUM POLISHED BRASS|9|MED JAR|1498.59|he fluffily regular +599|yellow burlywood blush lime beige|Manufacturer#5|Brand#51|MEDIUM BRUSHED NICKEL|30|JUMBO PACK|1499.59|ckages against t +600|blue beige metallic seashell blanched|Manufacturer#4|Brand#42|STANDARD POLISHED NICKEL|4|SM JAR|1500.60|ow furiously agai +601|blue navy dim lime tan|Manufacturer#1|Brand#13|STANDARD POLISHED BRASS|13|SM PKG|1501.60|lithely thi +602|maroon smoke aquamarine cornflower lime|Manufacturer#1|Brand#12|PROMO BRUSHED COPPER|8|SM BAG|1502.60|telets a +603|snow blue frosted olive midnight|Manufacturer#1|Brand#12|PROMO ANODIZED COPPER|41|WRAP PKG|1503.60|uests. fluffily regul +604|burnished lemon seashell pale deep|Manufacturer#4|Brand#41|MEDIUM PLATED STEEL|19|MED PACK|1504.60|are after the regula +605|grey red lime saddle forest|Manufacturer#1|Brand#11|LARGE POLISHED STEEL|30|LG JAR|1505.60| bold, final accou +606|navajo lace deep aquamarine lawn|Manufacturer#3|Brand#32|STANDARD PLATED STEEL|36|LG DRUM|1506.60|hins p +607|dark cornsilk thistle sandy linen|Manufacturer#5|Brand#54|MEDIUM POLISHED TIN|13|MED JAR|1507.60|ctions wake qu +608|metallic bisque blanched thistle royal|Manufacturer#2|Brand#25|PROMO PLATED BRASS|35|JUMBO PKG|1508.60|xes. express r +609|dim lemon olive midnight chiffon|Manufacturer#2|Brand#21|ECONOMY BRUSHED TIN|49|JUMBO DRUM|1509.60|cial deposits haggle +610|plum steel seashell white lavender|Manufacturer#1|Brand#11|ECONOMY BURNISHED TIN|38|JUMBO BOX|1510.61|slyly pending re +611|blanched burlywood maroon coral rosy|Manufacturer#4|Brand#42|MEDIUM PLATED TIN|45|SM DRUM|1511.61|iously even packages. +612|midnight deep misty magenta honeydew|Manufacturer#4|Brand#42|PROMO PLATED STEEL|19|LG BOX|1512.61|se quickly; +613|forest chocolate mint burlywood spring|Manufacturer#3|Brand#34|LARGE BURNISHED COPPER|22|LG DRUM|1513.61| cajo +614|indian navy pink powder aquamarine|Manufacturer#2|Brand#23|STANDARD BURNISHED NICKEL|6|WRAP PKG|1514.61|ending accounts ca +615|rosy burlywood blush drab grey|Manufacturer#4|Brand#41|PROMO ANODIZED COPPER|4|WRAP PKG|1515.61| dogged +616|drab plum lace cornsilk khaki|Manufacturer#2|Brand#25|STANDARD BRUSHED STEEL|1|WRAP JAR|1516.61|w packages cajole b +617|pink beige hot pale dim|Manufacturer#2|Brand#22|MEDIUM ANODIZED NICKEL|37|WRAP DRUM|1517.61|furious +618|honeydew red almond cream dim|Manufacturer#2|Brand#22|PROMO BRUSHED BRASS|9|LG BOX|1518.61|ogs. furiously +619|ivory maroon dim lavender tomato|Manufacturer#3|Brand#34|LARGE ANODIZED STEEL|46|MED JAR|1519.61|cuses are +620|chartreuse coral beige saddle plum|Manufacturer#3|Brand#35|MEDIUM BRUSHED COPPER|4|LG PKG|1520.62|efully carefully speci +621|almond coral dim frosted midnight|Manufacturer#5|Brand#53|PROMO PLATED TIN|47|JUMBO DRUM|1521.62|ffily furiously fin +622|peru cyan black blush misty|Manufacturer#5|Brand#51|LARGE POLISHED STEEL|19|WRAP BAG|1522.62|sly deposits. f +623|chiffon bisque plum deep blanched|Manufacturer#3|Brand#32|ECONOMY POLISHED NICKEL|8|MED BOX|1523.62|ly ironic +624|burlywood ghost puff bisque firebrick|Manufacturer#1|Brand#12|LARGE BURNISHED NICKEL|29|SM BAG|1524.62|dencies. even d +625|pale khaki cornflower sienna lime|Manufacturer#3|Brand#35|SMALL PLATED COPPER|38|LG JAR|1525.62|blithely slow multipl +626|khaki indian coral drab pink|Manufacturer#1|Brand#12|SMALL ANODIZED COPPER|23|SM JAR|1526.62|furiously-- +627|rosy forest spring lawn papaya|Manufacturer#4|Brand#44|PROMO ANODIZED NICKEL|13|SM BAG|1527.62|y ironic +628|salmon midnight honeydew lawn hot|Manufacturer#3|Brand#33|ECONOMY BRUSHED BRASS|40|LG BOX|1528.62|sits. +629|powder ivory chiffon grey plum|Manufacturer#5|Brand#51|MEDIUM POLISHED COPPER|25|WRAP BOX|1529.62|fully even co +630|red smoke lemon aquamarine linen|Manufacturer#2|Brand#25|MEDIUM PLATED NICKEL|20|LG DRUM|1530.63|g to th +631|moccasin lawn cornflower olive gainsboro|Manufacturer#2|Brand#22|STANDARD ANODIZED NICKEL|34|WRAP BAG|1531.63|ely silen +632|navy forest tan thistle brown|Manufacturer#3|Brand#34|PROMO PLATED NICKEL|2|MED PACK|1532.63|y ironic instru +633|thistle tan peru peach metallic|Manufacturer#3|Brand#33|ECONOMY POLISHED NICKEL|24|MED PKG|1533.63|bold brai +634|floral seashell burlywood green chiffon|Manufacturer#3|Brand#35|SMALL ANODIZED NICKEL|34|MED DRUM|1534.63|ions. +635|ghost antique frosted cyan pale|Manufacturer#5|Brand#51|PROMO POLISHED STEEL|49|WRAP JAR|1535.63|y ironic excuses. +636|light peru chiffon turquoise papaya|Manufacturer#5|Brand#55|PROMO BRUSHED STEEL|36|SM PACK|1536.63|ithely +637|brown papaya sandy coral antique|Manufacturer#5|Brand#51|LARGE BURNISHED NICKEL|48|JUMBO CASE|1537.63|oxes after the blithel +638|chartreuse royal peru dark antique|Manufacturer#5|Brand#54|SMALL PLATED TIN|37|JUMBO PACK|1538.63| carefully. blithely +639|moccasin indian rosy chiffon magenta|Manufacturer#2|Brand#25|STANDARD POLISHED BRASS|33|SM BAG|1539.63|s cajole quickly. care +640|chartreuse blush azure pale spring|Manufacturer#1|Brand#12|MEDIUM BRUSHED TIN|20|WRAP CASE|1540.64|ly regular acco +641|lemon goldenrod burlywood orchid firebrick|Manufacturer#5|Brand#55|MEDIUM PLATED COPPER|18|SM JAR|1541.64| bold instr +642|moccasin ghost magenta coral beige|Manufacturer#4|Brand#43|ECONOMY BRUSHED BRASS|12|MED PACK|1542.64| bold packages bey +643|beige navy dim green forest|Manufacturer#3|Brand#32|MEDIUM POLISHED STEEL|8|MED DRUM|1543.64|refully fina +644|medium azure chocolate blanched mint|Manufacturer#5|Brand#52|LARGE PLATED STEEL|34|SM PACK|1544.64|lphins. blithely +645|thistle sky blanched indian lawn|Manufacturer#4|Brand#45|MEDIUM BURNISHED NICKEL|45|LG CASE|1545.64| the theodol +646|medium ivory green hot white|Manufacturer#5|Brand#52|SMALL POLISHED COPPER|21|LG PACK|1546.64|ajole according to t +647|bisque violet dim lawn drab|Manufacturer#3|Brand#35|LARGE BURNISHED STEEL|38|MED PKG|1547.64|ters. ironic pinto +648|grey lace dodger papaya smoke|Manufacturer#3|Brand#34|SMALL BRUSHED STEEL|2|WRAP JAR|1548.64|eas. regular +649|lavender yellow seashell blue sienna|Manufacturer#1|Brand#12|STANDARD BURNISHED TIN|33|JUMBO DRUM|1549.64|fully! +650|bisque forest cornsilk magenta seashell|Manufacturer#5|Brand#53|PROMO ANODIZED NICKEL|40|MED JAR|1550.65|ar dependen +651|cornsilk firebrick deep medium drab|Manufacturer#5|Brand#52|MEDIUM POLISHED BRASS|4|WRAP BAG|1551.65|efully final instruct +652|ivory ghost hot yellow maroon|Manufacturer#1|Brand#12|LARGE BRUSHED TIN|39|WRAP PKG|1552.65|le furiously unusua +653|lime blue blush coral lace|Manufacturer#1|Brand#15|ECONOMY BURNISHED BRASS|28|JUMBO DRUM|1553.65|ias. i +654|cyan burlywood beige olive navajo|Manufacturer#2|Brand#23|PROMO PLATED COPPER|2|WRAP BAG|1554.65|posits haggle +655|tomato linen almond rosy olive|Manufacturer#1|Brand#12|STANDARD BURNISHED TIN|23|JUMBO CAN|1555.65|ic instructions. +656|black deep lace coral magenta|Manufacturer#1|Brand#15|STANDARD BURNISHED COPPER|17|MED CASE|1556.65|tions wake ca +657|saddle metallic purple cornsilk hot|Manufacturer#3|Brand#31|ECONOMY BURNISHED COPPER|36|LG PACK|1557.65| packages accord +658|dodger rosy tomato honeydew saddle|Manufacturer#1|Brand#15|MEDIUM PLATED COPPER|27|SM JAR|1558.65| somas haggle quickly +659|ivory green pink orange chartreuse|Manufacturer#3|Brand#34|MEDIUM BRUSHED BRASS|20|LG JAR|1559.65|across the +660|lime peach thistle royal pink|Manufacturer#5|Brand#51|STANDARD POLISHED TIN|8|SM CAN|1560.66|ages cajole fluffily +661|midnight drab ivory purple lawn|Manufacturer#3|Brand#32|PROMO PLATED STEEL|35|SM PKG|1561.66|ng asympt +662|puff brown orchid turquoise hot|Manufacturer#4|Brand#45|STANDARD PLATED STEEL|35|LG PACK|1562.66|e eve +663|ivory olive orchid cream honeydew|Manufacturer#4|Brand#41|PROMO POLISHED COPPER|6|WRAP PACK|1563.66| beans +664|frosted honeydew dodger antique sandy|Manufacturer#4|Brand#43|MEDIUM BURNISHED TIN|26|LG BAG|1564.66|about the slyly s +665|turquoise olive maroon cyan deep|Manufacturer#1|Brand#13|MEDIUM POLISHED STEEL|14|MED DRUM|1565.66|usly final excuse +666|firebrick deep orange cyan bisque|Manufacturer#1|Brand#13|ECONOMY BURNISHED NICKEL|20|MED PACK|1566.66|ronic theodolites ca +667|wheat cream green metallic navajo|Manufacturer#4|Brand#43|MEDIUM PLATED STEEL|42|MED JAR|1567.66|ly pending packages. +668|blue antique deep dark thistle|Manufacturer#2|Brand#22|SMALL ANODIZED NICKEL|10|LG PACK|1568.66|odolites. furio +669|khaki almond orange smoke green|Manufacturer#1|Brand#11|STANDARD BRUSHED TIN|37|MED BAG|1569.66|bold deposi +670|medium frosted rose magenta chocolate|Manufacturer#1|Brand#12|ECONOMY PLATED COPPER|24|LG DRUM|1570.67|es use fluffily unusu +671|dodger metallic deep slate burlywood|Manufacturer#5|Brand#53|SMALL PLATED STEEL|31|JUMBO BOX|1571.67|es. s +672|lawn honeydew seashell navajo blush|Manufacturer#2|Brand#23|PROMO BURNISHED STEEL|13|LG PACK|1572.67|, pen +673|orchid aquamarine salmon yellow burlywood|Manufacturer#2|Brand#23|MEDIUM ANODIZED COPPER|26|SM DRUM|1573.67|y final +674|grey snow seashell ghost orange|Manufacturer#3|Brand#35|SMALL BRUSHED TIN|5|LG PKG|1574.67|unts use slyly bold +675|olive honeydew goldenrod violet sienna|Manufacturer#1|Brand#11|LARGE BRUSHED COPPER|2|SM CAN|1575.67|ely re +676|moccasin lace blush forest lavender|Manufacturer#1|Brand#11|MEDIUM ANODIZED BRASS|45|SM CAN|1576.67|ges. enticingly ironi +677|plum turquoise blanched cornsilk coral|Manufacturer#4|Brand#44|PROMO ANODIZED BRASS|6|WRAP BAG|1577.67|accounts +678|salmon lime floral dark spring|Manufacturer#4|Brand#44|PROMO BRUSHED TIN|15|SM BAG|1578.67|ronic pin +679|purple black linen medium honeydew|Manufacturer#4|Brand#41|SMALL BURNISHED TIN|50|MED BOX|1579.67|iously ironic in +680|burnished gainsboro burlywood tomato yellow|Manufacturer#1|Brand#14|SMALL PLATED COPPER|44|LG PACK|1580.68|l depo +681|chartreuse slate khaki rose brown|Manufacturer#3|Brand#32|ECONOMY PLATED COPPER|9|WRAP CAN|1581.68|ic requests wake accor +682|blush khaki goldenrod antique smoke|Manufacturer#5|Brand#53|LARGE POLISHED NICKEL|48|SM BOX|1582.68|ackages. +683|sienna lemon burnished blanched deep|Manufacturer#5|Brand#53|LARGE BURNISHED NICKEL|1|MED PACK|1583.68|its hag +684|metallic aquamarine honeydew hot lawn|Manufacturer#3|Brand#33|PROMO BURNISHED TIN|6|WRAP BOX|1584.68|unts are fluff +685|spring goldenrod plum royal tomato|Manufacturer#3|Brand#31|SMALL PLATED COPPER|36|LG JAR|1585.68|s. furiously ruthless +686|goldenrod turquoise coral cornflower peru|Manufacturer#5|Brand#54|STANDARD BRUSHED COPPER|15|WRAP BAG|1586.68|lly ironic accounts +687|gainsboro cornflower dodger smoke medium|Manufacturer#5|Brand#51|LARGE POLISHED NICKEL|47|JUMBO BOX|1587.68|packages. even, +688|hot ivory moccasin almond pale|Manufacturer#4|Brand#45|PROMO BRUSHED COPPER|38|JUMBO CAN|1588.68|rious ideas +689|bisque khaki powder deep ghost|Manufacturer#4|Brand#43|LARGE PLATED COPPER|22|SM PACK|1589.68|ual package +690|burlywood dodger saddle cornsilk tan|Manufacturer#3|Brand#32|SMALL PLATED BRASS|31|WRAP PACK|1590.69|al, bold fra +691|burnished deep black cream blanched|Manufacturer#3|Brand#35|PROMO BURNISHED BRASS|3|SM JAR|1591.69|ully slyly unusu +692|almond azure floral blush sienna|Manufacturer#1|Brand#14|MEDIUM BRUSHED BRASS|20|SM DRUM|1592.69|tructions. ev +693|honeydew aquamarine forest chocolate almond|Manufacturer#5|Brand#54|SMALL PLATED TIN|14|WRAP CASE|1593.69|lets sle +694|cream metallic turquoise dim peach|Manufacturer#3|Brand#35|ECONOMY PLATED STEEL|35|JUMBO CASE|1594.69|es. final +695|deep peru brown khaki steel|Manufacturer#2|Brand#23|PROMO ANODIZED COPPER|19|MED DRUM|1595.69|eep blithely +696|light smoke cornflower deep brown|Manufacturer#3|Brand#33|MEDIUM ANODIZED BRASS|3|LG CAN|1596.69|al acco +697|dark mint metallic firebrick khaki|Manufacturer#4|Brand#41|LARGE PLATED TIN|8|MED CAN|1597.69| special pa +698|saddle sienna red lawn burlywood|Manufacturer#4|Brand#42|ECONOMY ANODIZED COPPER|44|LG PACK|1598.69|ronic, ironic +699|plum dim brown lime midnight|Manufacturer#1|Brand#11|MEDIUM PLATED STEEL|5|WRAP CAN|1599.69| regular notornis b +700|lace burnished pink spring orange|Manufacturer#3|Brand#34|PROMO BRUSHED STEEL|31|SM JAR|1600.70|ly even foxes. fi +701|frosted lace beige cyan forest|Manufacturer#4|Brand#43|MEDIUM ANODIZED COPPER|36|WRAP DRUM|1601.70| use blithe +702|lawn beige deep green dim|Manufacturer#4|Brand#41|STANDARD BURNISHED BRASS|26|SM CAN|1602.70|yly f +703|maroon blush turquoise rose cornsilk|Manufacturer#3|Brand#32|ECONOMY POLISHED TIN|20|WRAP CASE|1603.70|nstructions wake alon +704|salmon violet honeydew ivory almond|Manufacturer#3|Brand#34|LARGE ANODIZED BRASS|23|MED CAN|1604.70|l, ironic +705|chocolate dodger firebrick magenta steel|Manufacturer#3|Brand#33|ECONOMY PLATED TIN|47|LG PKG|1605.70|ironic +706|pale red pink rose spring|Manufacturer#3|Brand#33|LARGE PLATED BRASS|6|SM PKG|1606.70|quests. i +707|orchid khaki burnished snow peach|Manufacturer#1|Brand#11|SMALL POLISHED BRASS|17|SM BAG|1607.70|osits about the fluf +708|brown sienna pink chocolate puff|Manufacturer#3|Brand#32|SMALL BRUSHED NICKEL|29|SM DRUM|1608.70|ully final instru +709|burlywood pink chocolate navy midnight|Manufacturer#4|Brand#43|SMALL BRUSHED TIN|16|SM BAG|1609.70|ns. blithely i +710|ghost lace metallic cornsilk violet|Manufacturer#1|Brand#15|SMALL POLISHED TIN|27|JUMBO PACK|1610.71|fluffily unu +711|goldenrod lemon peru orchid orange|Manufacturer#1|Brand#11|PROMO BRUSHED NICKEL|24|LG DRUM|1611.71|s hang slyly regula +712|deep cornflower sandy plum firebrick|Manufacturer#3|Brand#33|ECONOMY BRUSHED COPPER|25|SM CASE|1612.71|even, fluffy +713|lime cornsilk almond sandy peach|Manufacturer#2|Brand#25|SMALL ANODIZED COPPER|20|SM CAN|1613.71|onic de +714|spring cyan powder blanched royal|Manufacturer#1|Brand#11|MEDIUM POLISHED NICKEL|35|SM JAR|1614.71|ions. furiously final +715|lavender magenta smoke lemon olive|Manufacturer#2|Brand#24|LARGE BRUSHED TIN|28|WRAP BAG|1615.71|ons boost. furiou +716|rose brown hot cornsilk gainsboro|Manufacturer#1|Brand#12|SMALL POLISHED TIN|37|JUMBO CAN|1616.71|osits! packages hag +717|mint chartreuse chocolate metallic deep|Manufacturer#2|Brand#22|STANDARD PLATED TIN|28|JUMBO JAR|1617.71| final notornis na +718|cornflower burnished saddle frosted cream|Manufacturer#3|Brand#35|PROMO BURNISHED COPPER|24|SM CAN|1618.71|ests. final, exp +719|chocolate grey ivory indian cornsilk|Manufacturer#3|Brand#35|STANDARD BRUSHED NICKEL|49|JUMBO BAG|1619.71|ect. furiously +720|chartreuse ivory almond cornsilk cyan|Manufacturer#4|Brand#45|SMALL BURNISHED NICKEL|8|JUMBO BAG|1620.72|as. furiously +721|gainsboro chiffon cyan midnight seashell|Manufacturer#5|Brand#52|STANDARD ANODIZED STEEL|33|MED PKG|1621.72|ly special instruct +722|pink goldenrod blue saddle pale|Manufacturer#4|Brand#43|ECONOMY BURNISHED NICKEL|43|JUMBO BAG|1622.72|ic packages. fin +723|honeydew plum blue peach peru|Manufacturer#3|Brand#31|LARGE BRUSHED BRASS|34|WRAP CASE|1623.72|unts. excu +724|smoke chocolate thistle frosted ghost|Manufacturer#3|Brand#35|PROMO POLISHED COPPER|28|JUMBO BOX|1624.72| carefully pend +725|hot black salmon cornflower medium|Manufacturer#4|Brand#43|LARGE PLATED NICKEL|11|JUMBO BOX|1625.72|r theo +726|cream antique violet indian snow|Manufacturer#4|Brand#43|PROMO POLISHED NICKEL|41|JUMBO BAG|1626.72|arefully? carefully i +727|royal bisque smoke azure lemon|Manufacturer#3|Brand#35|PROMO PLATED BRASS|35|SM PKG|1627.72| about the furio +728|cornsilk green seashell goldenrod metallic|Manufacturer#3|Brand#33|ECONOMY PLATED TIN|27|LG JAR|1628.72|fily regular package +729|papaya cornflower frosted maroon peach|Manufacturer#3|Brand#35|ECONOMY BRUSHED TIN|6|LG JAR|1629.72|egular accou +730|orange blue magenta cornflower green|Manufacturer#4|Brand#45|MEDIUM PLATED TIN|8|SM PKG|1630.73|ironic +731|medium dark azure black indian|Manufacturer#3|Brand#33|PROMO BURNISHED NICKEL|34|MED CASE|1631.73|snooze above the +732|turquoise frosted purple royal salmon|Manufacturer#2|Brand#21|MEDIUM BRUSHED BRASS|1|SM BAG|1632.73|. sauternes haggl +733|burnished ghost sienna blue medium|Manufacturer#4|Brand#43|PROMO ANODIZED STEEL|1|MED CASE|1633.73| special instruct +734|almond beige azure dark steel|Manufacturer#2|Brand#21|MEDIUM BRUSHED STEEL|34|WRAP DRUM|1634.73|quests +735|wheat ivory powder lace misty|Manufacturer#4|Brand#42|SMALL BRUSHED STEEL|44|SM CAN|1635.73|kages are according +736|sandy dark goldenrod antique violet|Manufacturer#3|Brand#32|PROMO ANODIZED BRASS|44|JUMBO DRUM|1636.73|telets wake carefu +737|blanched peach bisque dim smoke|Manufacturer#5|Brand#53|PROMO POLISHED NICKEL|25|SM BAG|1637.73|re slyly. bold, regul +738|bisque dark orange misty linen|Manufacturer#2|Brand#21|ECONOMY BURNISHED COPPER|29|JUMBO CAN|1638.73|ckages wake. slyly fin +739|powder steel wheat brown almond|Manufacturer#3|Brand#31|ECONOMY BRUSHED COPPER|24|JUMBO BOX|1639.73|the regular +740|cornsilk ghost magenta drab beige|Manufacturer#3|Brand#35|STANDARD POLISHED COPPER|7|WRAP PACK|1640.74| even dep +741|grey misty cornsilk coral chartreuse|Manufacturer#4|Brand#44|STANDARD PLATED TIN|33|WRAP PACK|1641.74|oxes slee +742|dodger sienna goldenrod pale green|Manufacturer#5|Brand#51|STANDARD BRUSHED NICKEL|30|SM PACK|1642.74|out the furiously +743|chartreuse midnight indian olive peach|Manufacturer#4|Brand#42|LARGE ANODIZED COPPER|4|MED JAR|1643.74|al packages ar +744|burlywood red gainsboro tomato brown|Manufacturer#5|Brand#53|MEDIUM BURNISHED COPPER|47|MED PKG|1644.74|uriously brave ideas +745|papaya cyan khaki sandy olive|Manufacturer#3|Brand#31|PROMO POLISHED COPPER|25|JUMBO BOX|1645.74| silent +746|green blush floral purple bisque|Manufacturer#2|Brand#23|ECONOMY ANODIZED STEEL|31|MED CAN|1646.74|osits affix furiously +747|orange tan almond midnight azure|Manufacturer#1|Brand#11|LARGE BURNISHED NICKEL|20|WRAP PKG|1647.74|deposits b +748|lace indian burlywood black papaya|Manufacturer#5|Brand#54|STANDARD BURNISHED BRASS|32|SM CAN|1648.74|arefully bo +749|lavender cornflower seashell violet metallic|Manufacturer#2|Brand#24|SMALL PLATED COPPER|16|MED JAR|1649.74| bold re +750|puff light linen powder khaki|Manufacturer#4|Brand#43|LARGE POLISHED NICKEL|47|MED PACK|1650.75|tipliers about the q +751|steel plum hot cyan deep|Manufacturer#1|Brand#11|SMALL POLISHED TIN|17|SM DRUM|1651.75|uests haggle bl +752|cream blanched midnight olive khaki|Manufacturer#5|Brand#53|MEDIUM ANODIZED COPPER|1|MED PACK|1652.75|lites mold b +753|blanched firebrick moccasin pink white|Manufacturer#2|Brand#25|STANDARD ANODIZED TIN|13|LG DRUM|1653.75|nal foxes. quickly f +754|forest steel sky black orchid|Manufacturer#5|Brand#51|SMALL ANODIZED STEEL|42|WRAP JAR|1654.75|es. blithely dogge +755|rosy dim drab deep bisque|Manufacturer#2|Brand#22|STANDARD PLATED TIN|12|WRAP PACK|1655.75| wake. even packages a +756|royal ghost snow pale medium|Manufacturer#5|Brand#52|STANDARD PLATED BRASS|44|MED BAG|1656.75|rious +757|bisque dim burlywood antique moccasin|Manufacturer#3|Brand#35|ECONOMY POLISHED NICKEL|12|JUMBO CASE|1657.75|the quickly +758|yellow slate lemon beige rose|Manufacturer#1|Brand#11|ECONOMY ANODIZED TIN|25|MED BOX|1658.75|haggle +759|yellow orange navajo linen coral|Manufacturer#3|Brand#34|LARGE BURNISHED TIN|20|JUMBO CAN|1659.75|struction +760|orange navajo cornflower thistle royal|Manufacturer#4|Brand#44|MEDIUM POLISHED COPPER|6|LG JAR|1660.76|jole according +761|beige rosy dim coral light|Manufacturer#3|Brand#34|ECONOMY ANODIZED TIN|7|SM JAR|1661.76|ages according +762|navy navajo tomato pale lime|Manufacturer#1|Brand#15|LARGE POLISHED TIN|35|MED PKG|1662.76|xpress ideas. fluff +763|lace aquamarine olive blush sienna|Manufacturer#4|Brand#44|LARGE BRUSHED TIN|50|SM PKG|1663.76|counts. regu +764|blush forest plum dark light|Manufacturer#1|Brand#13|SMALL ANODIZED NICKEL|11|LG JAR|1664.76|es. final, bold +765|blush lawn snow forest khaki|Manufacturer#3|Brand#35|STANDARD BRUSHED BRASS|3|WRAP BAG|1665.76|ly regular pint +766|midnight sienna beige papaya olive|Manufacturer#2|Brand#24|MEDIUM BURNISHED NICKEL|20|MED PACK|1666.76|inal ideas. asy +767|blush drab rose beige tomato|Manufacturer#2|Brand#24|LARGE POLISHED TIN|50|MED DRUM|1667.76|ts. carefully unu +768|bisque frosted goldenrod magenta sandy|Manufacturer#4|Brand#43|LARGE BRUSHED COPPER|41|SM DRUM|1668.76|olites haggle: car +769|blue black honeydew forest wheat|Manufacturer#2|Brand#24|MEDIUM BRUSHED TIN|8|LG CASE|1669.76|ake carefull +770|lemon yellow rose cyan almond|Manufacturer#2|Brand#25|LARGE BRUSHED TIN|7|SM PACK|1670.77|ave ideas. +771|deep ghost lace blue dim|Manufacturer#1|Brand#15|SMALL BURNISHED TIN|17|LG DRUM|1671.77| cajole slyly fina +772|dodger drab misty orange seashell|Manufacturer#3|Brand#35|SMALL PLATED BRASS|33|MED PKG|1672.77|dolites haggle sp +773|thistle grey green floral pink|Manufacturer#3|Brand#32|PROMO BURNISHED STEEL|16|LG CASE|1673.77| final, sp +774|khaki firebrick red mint azure|Manufacturer#2|Brand#24|STANDARD ANODIZED NICKEL|26|WRAP CASE|1674.77|ly express dependen +775|sky gainsboro orange brown chiffon|Manufacturer#1|Brand#14|LARGE PLATED TIN|2|MED PACK|1675.77|azzle carefully +776|cornsilk coral bisque brown lavender|Manufacturer#5|Brand#51|STANDARD ANODIZED BRASS|21|WRAP DRUM|1676.77|egular orbits haggl +777|slate royal burnished floral ghost|Manufacturer#5|Brand#53|SMALL ANODIZED STEEL|50|JUMBO JAR|1677.77| theodolites +778|dim drab honeydew forest burlywood|Manufacturer#3|Brand#32|PROMO BURNISHED STEEL|20|WRAP BOX|1678.77|nic re +779|salmon ivory plum rose cornflower|Manufacturer#2|Brand#22|ECONOMY BRUSHED STEEL|26|WRAP DRUM|1679.77| regular epitaphs are +780|rose burlywood blue mint saddle|Manufacturer#5|Brand#55|MEDIUM ANODIZED STEEL|31|MED CASE|1680.78|t quickly sly +781|seashell orchid purple green moccasin|Manufacturer#1|Brand#13|ECONOMY PLATED STEEL|22|LG DRUM|1681.78|gular, regu +782|grey drab linen brown rose|Manufacturer#1|Brand#13|LARGE POLISHED BRASS|29|SM BAG|1682.78|hely u +783|steel aquamarine beige pink frosted|Manufacturer#1|Brand#13|SMALL PLATED NICKEL|4|MED DRUM|1683.78|ss acc +784|light smoke seashell beige brown|Manufacturer#1|Brand#12|MEDIUM BRUSHED COPPER|47|LG DRUM|1684.78|unts. furiously +785|metallic maroon peru lemon pink|Manufacturer#3|Brand#33|PROMO ANODIZED TIN|41|SM PACK|1685.78|use carefully +786|dodger navy indian chiffon seashell|Manufacturer#2|Brand#23|STANDARD PLATED NICKEL|20|SM PACK|1686.78|eodoli +787|blue metallic rosy maroon sky|Manufacturer#5|Brand#55|SMALL ANODIZED NICKEL|35|WRAP PKG|1687.78|es alongside of +788|floral cream mint burlywood khaki|Manufacturer#3|Brand#34|LARGE PLATED STEEL|10|LG JAR|1688.78|s solv +789|rosy spring antique hot sandy|Manufacturer#3|Brand#35|PROMO BURNISHED STEEL|14|LG PACK|1689.78|ts hagg +790|lavender turquoise salmon honeydew blush|Manufacturer#4|Brand#42|PROMO POLISHED COPPER|35|JUMBO BOX|1690.79|s are +791|navy dim saddle hot lemon|Manufacturer#2|Brand#24|STANDARD ANODIZED COPPER|24|MED PACK|1691.79| special pinto bean +792|bisque misty burnished floral puff|Manufacturer#1|Brand#13|SMALL BURNISHED BRASS|8|MED PKG|1692.79|efully unusual deposi +793|brown chartreuse black linen dim|Manufacturer#5|Brand#51|LARGE POLISHED NICKEL|28|JUMBO CAN|1693.79|tions. furiou +794|navy misty drab thistle lace|Manufacturer#5|Brand#51|PROMO PLATED COPPER|47|MED PKG|1694.79|le bl +795|chartreuse royal thistle yellow green|Manufacturer#5|Brand#54|MEDIUM POLISHED TIN|46|MED JAR|1695.79|ully regula +796|blush forest lavender grey chiffon|Manufacturer#5|Brand#51|ECONOMY BRUSHED STEEL|50|WRAP CAN|1696.79|yly fina +797|honeydew papaya puff mint white|Manufacturer#4|Brand#41|STANDARD BURNISHED STEEL|10|WRAP BAG|1697.79|ments +798|turquoise hot papaya white coral|Manufacturer#1|Brand#12|ECONOMY PLATED NICKEL|18|LG JAR|1698.79|ffily even excuses +799|green hot red antique dodger|Manufacturer#3|Brand#35|PROMO POLISHED TIN|7|MED JAR|1699.79|he slyly brave excuses +800|maroon red almond chiffon orchid|Manufacturer#1|Brand#11|PROMO BRUSHED BRASS|29|WRAP BAG|1700.80|s sleep about the car +801|linen azure cornsilk firebrick lavender|Manufacturer#5|Brand#54|LARGE BRUSHED NICKEL|18|JUMBO DRUM|1701.80|latelets. slyly fi +802|azure ghost orange powder pink|Manufacturer#3|Brand#34|ECONOMY PLATED BRASS|41|WRAP JAR|1702.80|equest +803|brown plum tan saddle goldenrod|Manufacturer#5|Brand#52|SMALL ANODIZED TIN|50|MED PKG|1703.80|ly at the accou +804|azure grey lavender gainsboro forest|Manufacturer#2|Brand#23|SMALL POLISHED BRASS|9|SM BAG|1704.80|itaphs sle +805|tan coral cream cornsilk gainsboro|Manufacturer#5|Brand#52|STANDARD PLATED BRASS|8|JUMBO PKG|1705.80|t blithe +806|blue violet coral indian frosted|Manufacturer#3|Brand#32|PROMO BURNISHED TIN|45|LG BAG|1706.80| ironic theodolites a +807|turquoise pale red black peach|Manufacturer#2|Brand#24|LARGE ANODIZED NICKEL|25|WRAP JAR|1707.80| quietly express pi +808|rosy antique pink pale blue|Manufacturer#5|Brand#51|SMALL BRUSHED TIN|36|MED PKG|1708.80| pending asymptotes a +809|peach steel magenta chiffon plum|Manufacturer#3|Brand#32|STANDARD BRUSHED COPPER|17|SM BAG|1709.80|n pla +810|moccasin magenta linen burnished smoke|Manufacturer#5|Brand#54|LARGE ANODIZED TIN|13|WRAP BOX|1710.81|instructions. +811|frosted firebrick dodger burlywood floral|Manufacturer#3|Brand#33|PROMO BRUSHED NICKEL|32|SM BOX|1711.81|pecial, ironic pac +812|sandy olive burlywood floral goldenrod|Manufacturer#3|Brand#33|LARGE PLATED TIN|11|WRAP BAG|1712.81|asymptot +813|peach white ivory lime burlywood|Manufacturer#4|Brand#43|MEDIUM POLISHED STEEL|2|WRAP DRUM|1713.81|riously ironic deposi +814|blush seashell blue honeydew lace|Manufacturer#5|Brand#54|ECONOMY PLATED NICKEL|43|MED PKG|1714.81|xpress requests. +815|lemon peach orange magenta navajo|Manufacturer#2|Brand#22|ECONOMY BRUSHED NICKEL|5|LG PACK|1715.81|nt requests a +816|thistle indian lavender olive white|Manufacturer#1|Brand#13|STANDARD POLISHED NICKEL|35|LG CAN|1716.81| thin +817|dark chiffon lace beige sandy|Manufacturer#4|Brand#41|STANDARD ANODIZED TIN|36|JUMBO PKG|1717.81|carefu +818|navajo orchid hot chocolate steel|Manufacturer#4|Brand#43|PROMO BRUSHED BRASS|36|MED JAR|1718.81|ckages +819|royal linen midnight salmon plum|Manufacturer#5|Brand#54|ECONOMY BRUSHED STEEL|27|SM CAN|1719.81|as are slyly against +820|wheat blanched floral burlywood bisque|Manufacturer#1|Brand#11|STANDARD BURNISHED STEEL|20|WRAP JAR|1720.82|ely regular theodo +821|salmon plum chartreuse burlywood snow|Manufacturer#4|Brand#42|PROMO POLISHED TIN|15|MED BOX|1721.82|gle across t +822|chocolate peach grey azure sky|Manufacturer#5|Brand#52|PROMO ANODIZED BRASS|21|LG CASE|1722.82|ding to t +823|maroon ghost bisque khaki black|Manufacturer#2|Brand#25|SMALL BURNISHED COPPER|21|WRAP CASE|1723.82|inal the +824|magenta smoke pink dark beige|Manufacturer#1|Brand#15|LARGE BURNISHED TIN|34|MED BAG|1724.82|s. ironic +825|dodger dim honeydew burlywood cream|Manufacturer#1|Brand#13|PROMO PLATED TIN|47|LG CAN|1725.82|lar ide +826|ghost olive aquamarine salmon chiffon|Manufacturer#3|Brand#34|ECONOMY PLATED TIN|21|SM CASE|1726.82|ifts could +827|linen peach lavender blush puff|Manufacturer#1|Brand#13|PROMO POLISHED COPPER|15|JUMBO PACK|1727.82|sits; depe +828|red tan chartreuse white antique|Manufacturer#4|Brand#44|LARGE BRUSHED NICKEL|11|LG PKG|1728.82|symptotes. furiously +829|chiffon seashell antique cornsilk peach|Manufacturer#3|Brand#35|MEDIUM BURNISHED BRASS|33|SM JAR|1729.82|tegrate. +830|snow medium salmon cyan lime|Manufacturer#5|Brand#54|SMALL POLISHED TIN|37|JUMBO CAN|1730.83|ep final instructi +831|violet cyan deep lace coral|Manufacturer#5|Brand#51|STANDARD POLISHED COPPER|8|LG CAN|1731.83|se blithely. special, +832|ivory peach cyan blush blue|Manufacturer#4|Brand#44|STANDARD ANODIZED COPPER|3|WRAP BAG|1732.83|fily bo +833|aquamarine blush burnished grey cream|Manufacturer#4|Brand#41|SMALL BRUSHED STEEL|34|JUMBO CAN|1733.83|s thrash furiously fin +834|honeydew forest bisque deep indian|Manufacturer#5|Brand#52|MEDIUM POLISHED TIN|43|JUMBO CAN|1734.83|mptotes integrate +835|spring yellow lemon lawn chocolate|Manufacturer#5|Brand#53|MEDIUM PLATED STEEL|21|SM BOX|1735.83|uses. furi +836|cream sky yellow black slate|Manufacturer#3|Brand#31|LARGE BURNISHED TIN|32|SM JAR|1736.83|lyly bold accounts. t +837|chiffon navajo blush purple dim|Manufacturer#1|Brand#13|MEDIUM BURNISHED BRASS|27|WRAP PKG|1737.83|hely furious packages +838|peach lemon sienna cyan red|Manufacturer#2|Brand#22|MEDIUM ANODIZED TIN|9|WRAP BAG|1738.83| final pac +839|cornflower white rosy violet cream|Manufacturer#2|Brand#25|LARGE BRUSHED NICKEL|19|JUMBO CAN|1739.83|ggle a +840|lavender cornflower burlywood cyan blue|Manufacturer#4|Brand#44|ECONOMY ANODIZED BRASS|42|WRAP PKG|1740.84|ending ideas w +841|sandy puff green lace dim|Manufacturer#1|Brand#15|MEDIUM BURNISHED BRASS|48|WRAP BOX|1741.84|y regul +842|coral indian maroon saddle navy|Manufacturer#1|Brand#11|SMALL ANODIZED BRASS|4|MED PACK|1742.84|en accounts! carefu +843|frosted metallic chiffon almond blanched|Manufacturer#1|Brand#15|MEDIUM POLISHED STEEL|50|LG PACK|1743.84| the +844|chocolate light blue blush firebrick|Manufacturer#3|Brand#35|LARGE PLATED BRASS|22|SM CASE|1744.84|ix furiously beyond +845|papaya ghost dim ivory sandy|Manufacturer#4|Brand#41|LARGE PLATED STEEL|25|LG JAR|1745.84|ully regula +846|purple papaya sky coral green|Manufacturer#2|Brand#24|ECONOMY POLISHED NICKEL|6|SM BAG|1746.84|sometimes bold foxes +847|almond forest lemon honeydew misty|Manufacturer#2|Brand#25|SMALL PLATED STEEL|21|SM PACK|1747.84|ely blith +848|saddle olive rosy mint antique|Manufacturer#5|Brand#53|LARGE BURNISHED TIN|26|LG JAR|1748.84|gular requests u +849|papaya cornflower maroon forest chocolate|Manufacturer#4|Brand#44|STANDARD POLISHED TIN|41|MED DRUM|1749.84|nts among the pending +850|peach ghost grey misty lemon|Manufacturer#4|Brand#41|STANDARD BRUSHED NICKEL|31|JUMBO DRUM|1750.85|kages are carefu +851|blanched magenta chiffon firebrick orchid|Manufacturer#5|Brand#54|ECONOMY BURNISHED COPPER|30|LG CAN|1751.85| asympto +852|beige tan papaya coral chartreuse|Manufacturer#2|Brand#24|PROMO PLATED NICKEL|47|JUMBO BOX|1752.85|side of the +853|thistle honeydew lemon midnight lawn|Manufacturer#5|Brand#51|SMALL ANODIZED NICKEL|42|JUMBO CASE|1753.85|ts sleep! +854|pale sienna thistle lace chartreuse|Manufacturer#4|Brand#41|SMALL POLISHED COPPER|29|JUMBO CASE|1754.85|ests cajole furious +855|dim blanched puff deep antique|Manufacturer#3|Brand#31|STANDARD BURNISHED TIN|46|MED BOX|1755.85|ly express fox +856|blush navy powder orchid blue|Manufacturer#1|Brand#13|MEDIUM BRUSHED STEEL|12|MED BAG|1756.85|posits integrate sly +857|aquamarine dark lemon metallic chiffon|Manufacturer#3|Brand#35|PROMO PLATED TIN|8|MED PACK|1757.85|final de +858|thistle ivory honeydew medium pink|Manufacturer#3|Brand#33|ECONOMY BURNISHED COPPER|14|SM CAN|1758.85|elets breach f +859|ivory navajo lime orchid deep|Manufacturer#3|Brand#35|ECONOMY ANODIZED COPPER|10|WRAP BAG|1759.85| even Tiresias wake fu +860|dodger peach pale violet turquoise|Manufacturer#3|Brand#32|SMALL POLISHED STEEL|36|LG PKG|1760.86|oss the f +861|cornflower sienna navajo magenta moccasin|Manufacturer#4|Brand#43|ECONOMY BRUSHED COPPER|48|JUMBO BOX|1761.86| furiousl +862|tan dim aquamarine plum powder|Manufacturer#5|Brand#54|LARGE POLISHED NICKEL|12|LG PKG|1762.86| pending depo +863|burnished midnight almond cornflower mint|Manufacturer#2|Brand#25|STANDARD ANODIZED COPPER|41|LG CAN|1763.86| regular pinto beans +864|bisque snow light white seashell|Manufacturer#1|Brand#11|STANDARD POLISHED TIN|39|JUMBO PACK|1764.86|boost. +865|orange seashell cyan royal salmon|Manufacturer#1|Brand#11|SMALL ANODIZED BRASS|12|JUMBO PACK|1765.86|s along t +866|indian dodger brown drab linen|Manufacturer#1|Brand#11|STANDARD PLATED COPPER|13|WRAP BOX|1766.86|eas sleep quickly +867|dim almond floral hot peru|Manufacturer#5|Brand#54|PROMO POLISHED NICKEL|4|LG BOX|1767.86|nts wake care +868|frosted lace antique aquamarine chartreuse|Manufacturer#3|Brand#33|PROMO BRUSHED BRASS|48|JUMBO PKG|1768.86|packages. e +869|snow brown chocolate ivory dim|Manufacturer#2|Brand#24|STANDARD ANODIZED COPPER|28|LG BAG|1769.86|y fina +870|steel burnished papaya midnight goldenrod|Manufacturer#5|Brand#54|SMALL PLATED NICKEL|11|JUMBO CAN|1770.87|ldly unusual depth +871|ivory black chocolate wheat blanched|Manufacturer#5|Brand#55|SMALL ANODIZED BRASS|27|SM PKG|1771.87|olites snooze quickl +872|powder midnight plum tomato blue|Manufacturer#1|Brand#15|MEDIUM PLATED STEEL|41|LG CASE|1772.87|gular inst +873|mint magenta snow peach grey|Manufacturer#1|Brand#11|MEDIUM BRUSHED BRASS|45|MED CAN|1773.87|ecial ideas. slyly +874|drab lawn grey azure hot|Manufacturer#1|Brand#15|MEDIUM PLATED TIN|9|MED BOX|1774.87|e regular req +875|pale peach goldenrod sandy floral|Manufacturer#2|Brand#24|ECONOMY BRUSHED COPPER|1|MED DRUM|1775.87|e furiously. b +876|forest hot chocolate midnight dim|Manufacturer#3|Brand#31|MEDIUM PLATED NICKEL|25|SM CAN|1776.87|s after the fur +877|lime turquoise beige puff dark|Manufacturer#3|Brand#31|STANDARD ANODIZED NICKEL|20|MED PACK|1777.87|thely rut +878|lime khaki plum cornflower chartreuse|Manufacturer#3|Brand#32|STANDARD POLISHED NICKEL|40|JUMBO CASE|1778.87| slyly ironic g +879|spring purple forest frosted sienna|Manufacturer#3|Brand#34|STANDARD BURNISHED TIN|23|MED PKG|1779.87|ar, even request +880|medium turquoise gainsboro khaki red|Manufacturer#2|Brand#25|STANDARD ANODIZED COPPER|10|LG CASE|1780.88|ly stealthy deposits +881|pale frosted linen blush black|Manufacturer#2|Brand#21|LARGE BRUSHED BRASS|12|MED PACK|1781.88|ully for +882|lawn plum sienna burnished medium|Manufacturer#4|Brand#44|ECONOMY BRUSHED STEEL|12|MED BAG|1782.88| silent, pendi +883|smoke blush cream aquamarine black|Manufacturer#3|Brand#31|STANDARD PLATED NICKEL|18|LG PACK|1783.88|fluffily unusual pint +884|midnight maroon ghost cornflower cornsilk|Manufacturer#1|Brand#11|SMALL POLISHED NICKEL|38|WRAP BAG|1784.88|luffy accounts. +885|dim pale medium hot thistle|Manufacturer#4|Brand#42|ECONOMY BRUSHED STEEL|31|WRAP DRUM|1785.88|lar, even ideas caj +886|turquoise cornflower mint snow gainsboro|Manufacturer#5|Brand#55|LARGE BRUSHED COPPER|46|MED BAG|1786.88|tornis haggle! +887|navajo green lemon olive orange|Manufacturer#4|Brand#41|SMALL BRUSHED STEEL|48|JUMBO CAN|1787.88|x slyly aroun +888|bisque turquoise red navy brown|Manufacturer#3|Brand#31|STANDARD BRUSHED NICKEL|44|SM DRUM|1788.88|y according t +889|lime puff rosy beige azure|Manufacturer#5|Brand#51|LARGE BURNISHED BRASS|19|JUMBO DRUM|1789.88|efully regular +890|sandy lawn floral peach beige|Manufacturer#5|Brand#52|SMALL BRUSHED STEEL|23|MED PKG|1790.89|ests d +891|plum khaki grey lavender dodger|Manufacturer#4|Brand#42|ECONOMY POLISHED STEEL|5|MED CASE|1791.89|yly regular, expr +892|thistle burnished dark plum deep|Manufacturer#2|Brand#22|SMALL BRUSHED NICKEL|3|LG DRUM|1792.89|quickly regular r +893|drab moccasin azure papaya salmon|Manufacturer#1|Brand#14|PROMO BRUSHED STEEL|9|LG JAR|1793.89|ly regular +894|cream blanched ghost chocolate drab|Manufacturer#3|Brand#35|SMALL BURNISHED TIN|43|MED BAG|1794.89|s. carefully expr +895|puff aquamarine linen metallic azure|Manufacturer#4|Brand#41|MEDIUM BRUSHED STEEL|17|SM BOX|1795.89|eaves might +896|peach burnished chocolate saddle dodger|Manufacturer#4|Brand#43|PROMO ANODIZED TIN|7|LG CASE|1796.89|e across +897|dodger burnished cyan azure turquoise|Manufacturer#4|Brand#41|SMALL BRUSHED COPPER|26|SM JAR|1797.89|cajole bli +898|grey brown rosy black deep|Manufacturer#4|Brand#45|PROMO POLISHED NICKEL|8|WRAP BAG|1798.89|e against the pack +899|deep midnight mint violet steel|Manufacturer#2|Brand#25|SMALL ANODIZED NICKEL|50|WRAP CASE|1799.89|lithely pending excuse +900|antique medium moccasin coral drab|Manufacturer#2|Brand#21|STANDARD PLATED NICKEL|40|LG CAN|1800.90|foxes. carefully s +901|lime spring beige royal olive|Manufacturer#2|Brand#23|ECONOMY PLATED TIN|38|LG CAN|1801.90|ffily final theodoli +902|azure turquoise deep goldenrod firebrick|Manufacturer#2|Brand#23|LARGE ANODIZED COPPER|14|MED CAN|1802.90|inal pint +903|navajo chiffon midnight antique orchid|Manufacturer#4|Brand#44|ECONOMY BURNISHED BRASS|4|SM BAG|1803.90|the i +904|antique midnight lemon almond brown|Manufacturer#1|Brand#12|STANDARD ANODIZED TIN|20|WRAP DRUM|1804.90|ar theodolites sleep b +905|azure olive cornflower almond dim|Manufacturer#2|Brand#25|PROMO BRUSHED BRASS|27|MED CASE|1805.90|es. furiously ir +906|snow goldenrod honeydew lawn orange|Manufacturer#4|Brand#44|MEDIUM BURNISHED COPPER|45|MED DRUM|1806.90|unusua +907|chiffon lawn beige brown lavender|Manufacturer#5|Brand#52|ECONOMY ANODIZED STEEL|8|LG CASE|1807.90|es. carefu +908|pink navajo grey pale black|Manufacturer#2|Brand#25|MEDIUM BURNISHED TIN|13|JUMBO JAR|1808.90|tions ca +909|cornsilk tomato azure gainsboro navajo|Manufacturer#1|Brand#12|STANDARD PLATED TIN|40|WRAP PKG|1809.90|ht boost quic +910|antique blush cyan tan violet|Manufacturer#4|Brand#42|STANDARD ANODIZED TIN|15|JUMBO JAR|1810.91|ly final +911|blanched chocolate maroon hot floral|Manufacturer#1|Brand#14|ECONOMY BURNISHED TIN|23|MED CAN|1811.91|foxes cajole after the +912|olive cornflower lime seashell tomato|Manufacturer#5|Brand#55|STANDARD POLISHED NICKEL|17|SM BAG|1812.91|ar theodo +913|rosy sky azure misty beige|Manufacturer#2|Brand#23|LARGE PLATED BRASS|49|SM DRUM|1813.91|yly even dol +914|snow red antique tomato burnished|Manufacturer#3|Brand#35|ECONOMY POLISHED STEEL|8|LG PKG|1814.91|ckly busil +915|aquamarine frosted lavender forest green|Manufacturer#2|Brand#21|LARGE ANODIZED BRASS|25|WRAP BAG|1815.91|depos +916|indian blanched rose burnished lime|Manufacturer#2|Brand#21|MEDIUM BURNISHED BRASS|28|MED CAN|1816.91|ons. bravely ironic +917|midnight khaki maroon light aquamarine|Manufacturer#2|Brand#24|SMALL ANODIZED COPPER|3|SM CASE|1817.91|riously past th +918|ghost steel aquamarine turquoise red|Manufacturer#5|Brand#55|ECONOMY PLATED TIN|15|LG PKG|1818.91|losely according to +919|steel dim royal medium dodger|Manufacturer#1|Brand#13|PROMO BRUSHED COPPER|49|MED BOX|1819.91|along +920|sky coral misty ivory khaki|Manufacturer#4|Brand#44|MEDIUM BRUSHED STEEL|19|WRAP CAN|1820.92|y regu +921|khaki cyan plum wheat drab|Manufacturer#1|Brand#11|LARGE BURNISHED STEEL|35|JUMBO DRUM|1821.92|pecial in +922|frosted violet cornsilk burnished honeydew|Manufacturer#3|Brand#34|LARGE BURNISHED BRASS|30|SM CASE|1822.92|uctions. sl +923|moccasin aquamarine lavender firebrick drab|Manufacturer#2|Brand#24|STANDARD PLATED TIN|26|WRAP CASE|1823.92|he packag +924|dodger metallic olive frosted pale|Manufacturer#1|Brand#11|ECONOMY POLISHED STEEL|41|JUMBO PKG|1824.92|the ac +925|blush mint saddle plum blanched|Manufacturer#4|Brand#44|STANDARD POLISHED NICKEL|44|MED PACK|1825.92|aggle slyly. blithe +926|honeydew papaya coral smoke slate|Manufacturer#4|Brand#45|STANDARD BRUSHED TIN|39|MED JAR|1826.92|gle quickly ironic +927|dodger purple spring lime misty|Manufacturer#1|Brand#14|LARGE ANODIZED TIN|13|WRAP BAG|1827.92|otes snooz +928|purple ivory dodger chocolate steel|Manufacturer#4|Brand#43|SMALL ANODIZED TIN|43|SM BOX|1828.92|ully ev +929|burnished pale salmon turquoise plum|Manufacturer#3|Brand#33|LARGE PLATED COPPER|40|MED DRUM|1829.92|hely iron +930|violet gainsboro orchid magenta cream|Manufacturer#2|Brand#23|SMALL BRUSHED BRASS|26|LG DRUM|1830.93|uickly ironic +931|honeydew puff burnished deep cornsilk|Manufacturer#3|Brand#31|STANDARD ANODIZED NICKEL|37|LG CAN|1831.93|are fluffily. +932|cornflower sky honeydew coral light|Manufacturer#2|Brand#24|SMALL ANODIZED COPPER|12|LG BOX|1832.93|ly regular depos +933|pink brown thistle ivory drab|Manufacturer#3|Brand#33|STANDARD BRUSHED STEEL|25|LG CASE|1833.93|he blit +934|beige saddle linen hot white|Manufacturer#4|Brand#45|STANDARD ANODIZED BRASS|40|MED JAR|1834.93|ual packages +935|royal coral deep indian chiffon|Manufacturer#5|Brand#53|STANDARD BRUSHED STEEL|8|JUMBO DRUM|1835.93|arefully ironic +936|white azure misty lime pale|Manufacturer#2|Brand#24|MEDIUM PLATED BRASS|6|WRAP DRUM|1836.93|longside of the reg +937|ghost misty rosy midnight magenta|Manufacturer#3|Brand#33|PROMO ANODIZED TIN|2|JUMBO CAN|1837.93|ithely +938|thistle tomato spring chiffon lace|Manufacturer#2|Brand#22|LARGE BRUSHED NICKEL|1|JUMBO CASE|1838.93|ajole slyly r +939|papaya navajo cornsilk snow chocolate|Manufacturer#1|Brand#14|PROMO BURNISHED BRASS|41|WRAP PACK|1839.93|ages wake doggedly of +940|coral chocolate medium olive linen|Manufacturer#1|Brand#15|PROMO POLISHED TIN|49|JUMBO JAR|1840.94|ate blithely bold, si +941|smoke cornflower pink peru snow|Manufacturer#2|Brand#25|MEDIUM PLATED NICKEL|8|LG PKG|1841.94|fully +942|lace chocolate blue cornsilk violet|Manufacturer#3|Brand#35|PROMO POLISHED TIN|44|MED BAG|1842.94|nic pinto b +943|smoke navajo azure purple floral|Manufacturer#5|Brand#55|ECONOMY BRUSHED BRASS|46|SM PKG|1843.94|s wake +944|light salmon olive wheat turquoise|Manufacturer#3|Brand#33|SMALL PLATED STEEL|1|LG CAN|1844.94| requests nag furiou +945|chiffon metallic cornsilk slate mint|Manufacturer#5|Brand#52|MEDIUM PLATED NICKEL|22|MED JAR|1845.94|uffily abo +946|goldenrod dodger lavender royal cornsilk|Manufacturer#2|Brand#25|MEDIUM PLATED TIN|30|LG BOX|1846.94|y along +947|pink chiffon salmon magenta blush|Manufacturer#1|Brand#13|MEDIUM BURNISHED STEEL|16|JUMBO JAR|1847.94|usual accounts. b +948|gainsboro chiffon firebrick rose dodger|Manufacturer#2|Brand#22|MEDIUM ANODIZED BRASS|31|WRAP PKG|1848.94|furious +949|thistle burlywood frosted yellow midnight|Manufacturer#5|Brand#51|LARGE BURNISHED TIN|47|LG PKG|1849.94|l theodolit +950|navajo azure metallic puff chartreuse|Manufacturer#3|Brand#31|SMALL ANODIZED STEEL|26|WRAP CASE|1850.95|kages cajole quickly +951|lace steel cornsilk olive antique|Manufacturer#2|Brand#21|STANDARD BURNISHED STEEL|40|JUMBO JAR|1851.95| final deposits nag a +952|beige chiffon pink yellow drab|Manufacturer#3|Brand#31|MEDIUM BRUSHED TIN|4|MED PACK|1852.95|l deposits sleep bli +953|peach saddle green salmon goldenrod|Manufacturer#4|Brand#41|PROMO ANODIZED TIN|2|WRAP JAR|1853.95|ly quickly final acco +954|bisque hot ivory light beige|Manufacturer#5|Brand#55|ECONOMY ANODIZED STEEL|35|JUMBO CASE|1854.95|furious +955|blue midnight tan chocolate black|Manufacturer#3|Brand#32|PROMO BURNISHED STEEL|43|SM CASE|1855.95|tions +956|cream lavender chocolate lime magenta|Manufacturer#1|Brand#13|STANDARD BRUSHED STEEL|7|LG CASE|1856.95|furiously pending d +957|beige turquoise lime burnished midnight|Manufacturer#3|Brand#33|SMALL ANODIZED COPPER|23|SM CAN|1857.95|ndencies wake s +958|chiffon honeydew burnished deep cornflower|Manufacturer#3|Brand#35|LARGE PLATED NICKEL|13|LG BOX|1858.95|quickly careful i +959|navy grey dark cornflower brown|Manufacturer#4|Brand#41|SMALL BURNISHED STEEL|5|WRAP JAR|1859.95|iously bold depos +960|bisque peru chiffon orange magenta|Manufacturer#5|Brand#55|LARGE PLATED COPPER|26|LG CASE|1860.96|lly b +961|cornflower chiffon firebrick mint hot|Manufacturer#1|Brand#15|PROMO BRUSHED BRASS|1|SM PACK|1861.96|fully. f +962|forest lime hot coral dodger|Manufacturer#1|Brand#13|MEDIUM PLATED BRASS|38|JUMBO BOX|1862.96|lithely. +963|powder gainsboro lavender cream maroon|Manufacturer#4|Brand#44|MEDIUM PLATED BRASS|44|LG CASE|1863.96|y final deposits wake. +964|sky lawn burlywood moccasin blanched|Manufacturer#5|Brand#54|SMALL POLISHED BRASS|48|MED BOX|1864.96|nal asymptotes. regul +965|dodger cyan navy purple cornsilk|Manufacturer#3|Brand#34|MEDIUM PLATED STEEL|39|LG PKG|1865.96|dolite +966|antique medium blue violet peru|Manufacturer#4|Brand#42|PROMO BURNISHED TIN|24|MED CAN|1866.96| the carefully +967|cyan aquamarine blanched sky thistle|Manufacturer#5|Brand#55|SMALL BURNISHED COPPER|16|JUMBO CAN|1867.96|leep fur +968|wheat chartreuse floral ivory pale|Manufacturer#1|Brand#11|LARGE PLATED TIN|23|LG PKG|1868.96|press accounts acro +969|hot aquamarine azure frosted saddle|Manufacturer#5|Brand#55|PROMO POLISHED STEEL|34|JUMBO CASE|1869.96|le aga +970|bisque aquamarine lemon green dodger|Manufacturer#1|Brand#11|STANDARD BURNISHED STEEL|44|SM CAN|1870.97|ironic +971|cornsilk mint goldenrod steel drab|Manufacturer#5|Brand#54|LARGE POLISHED BRASS|19|SM DRUM|1871.97|ugouts. bl +972|goldenrod burlywood maroon mint pink|Manufacturer#3|Brand#32|MEDIUM PLATED BRASS|21|JUMBO JAR|1872.97|yly ironic deposits +973|magenta lace black seashell slate|Manufacturer#2|Brand#22|STANDARD ANODIZED STEEL|42|LG PACK|1873.97|along +974|powder spring tan sky burnished|Manufacturer#4|Brand#44|MEDIUM ANODIZED BRASS|35|WRAP BAG|1874.97|s. caref +975|rose blue ivory yellow dark|Manufacturer#3|Brand#34|MEDIUM ANODIZED COPPER|22|LG JAR|1875.97|torni +976|white khaki red smoke floral|Manufacturer#5|Brand#51|STANDARD BRUSHED NICKEL|19|JUMBO PACK|1876.97| special reque +977|dim tomato rose purple almond|Manufacturer#5|Brand#53|STANDARD BRUSHED STEEL|2|LG CASE|1877.97|the quick +978|cream chiffon rosy drab floral|Manufacturer#4|Brand#45|MEDIUM POLISHED TIN|46|LG DRUM|1878.97|quests sleep abo +979|maroon frosted bisque metallic salmon|Manufacturer#4|Brand#45|STANDARD ANODIZED TIN|4|MED CAN|1879.97| accounts. blithe +980|azure brown cream cyan purple|Manufacturer#4|Brand#41|SMALL ANODIZED STEEL|45|LG CASE|1880.98|ronic deposi +981|floral plum pink deep ivory|Manufacturer#2|Brand#25|MEDIUM POLISHED COPPER|31|WRAP CAN|1881.98| ironic as +982|burlywood steel lime floral metallic|Manufacturer#3|Brand#31|SMALL POLISHED BRASS|28|SM BAG|1882.98|boost blithely +983|coral mint grey spring navy|Manufacturer#4|Brand#43|ECONOMY POLISHED TIN|39|MED BOX|1883.98| pack +984|chiffon orange floral firebrick thistle|Manufacturer#2|Brand#22|LARGE PLATED TIN|40|SM BAG|1884.98|ly. furiously pe +985|black chiffon chartreuse sienna lawn|Manufacturer#5|Brand#53|MEDIUM BURNISHED STEEL|10|JUMBO PKG|1885.98|s beside +986|forest peru firebrick thistle red|Manufacturer#3|Brand#33|PROMO BRUSHED BRASS|50|JUMBO DRUM|1886.98|ronic foxes +987|seashell peru lime salmon hot|Manufacturer#5|Brand#53|PROMO POLISHED BRASS|39|LG BOX|1887.98|furiou +988|bisque saddle navy midnight coral|Manufacturer#2|Brand#24|STANDARD BURNISHED COPPER|27|WRAP PKG|1888.98|special requests sleep +989|misty red floral steel azure|Manufacturer#5|Brand#55|LARGE PLATED TIN|9|JUMBO JAR|1889.98|lets. e +990|azure turquoise hot beige pale|Manufacturer#1|Brand#14|SMALL BURNISHED COPPER|14|SM BAG|1890.99|quick +991|frosted bisque aquamarine lime cream|Manufacturer#3|Brand#32|MEDIUM POLISHED BRASS|9|SM CASE|1891.99|ickly slowly spe +992|hot peach aquamarine cornsilk blue|Manufacturer#5|Brand#51|PROMO BURNISHED COPPER|39|JUMBO BOX|1892.99| haggle +993|chiffon chocolate peru tomato powder|Manufacturer#5|Brand#54|MEDIUM BRUSHED NICKEL|2|MED JAR|1893.99|bold pear +994|ivory saddle papaya salmon drab|Manufacturer#2|Brand#25|PROMO ANODIZED STEEL|38|JUMBO BOX|1894.99|ost slyly. boldly bo +995|salmon chocolate rosy indian sienna|Manufacturer#3|Brand#34|ECONOMY BRUSHED TIN|47|MED DRUM|1895.99|ke furiously fluffily +996|gainsboro pink papaya olive forest|Manufacturer#3|Brand#31|STANDARD POLISHED COPPER|13|LG CAN|1896.99|ously +997|powder lavender purple dim saddle|Manufacturer#5|Brand#51|STANDARD ANODIZED BRASS|22|JUMBO BAG|1897.99|riously final +998|ivory magenta turquoise purple medium|Manufacturer#5|Brand#53|STANDARD BRUSHED NICKEL|2|MED BOX|1898.99|s. bold requests wake +999|sienna sky blanched white ghost|Manufacturer#4|Brand#44|STANDARD PLATED STEEL|16|WRAP CAN|1899.99|ans. slyly expre +1000|cream frosted navajo aquamarine black|Manufacturer#2|Brand#24|ECONOMY BRUSHED NICKEL|10|SM DRUM|901.00|g fluf +1001|goldenrod moccasin blush tan medium|Manufacturer#5|Brand#53|LARGE BRUSHED NICKEL|29|WRAP PACK|902.00|posits x-ray acros +1002|khaki pink blue misty chocolate|Manufacturer#3|Brand#31|SMALL ANODIZED NICKEL|5|MED PKG|903.00|y ironic instructions +1003|khaki orange violet tan drab|Manufacturer#1|Brand#14|ECONOMY ANODIZED STEEL|19|JUMBO BOX|904.00|en id +1004|light navajo indian pale antique|Manufacturer#2|Brand#21|LARGE BRUSHED BRASS|16|WRAP CASE|905.00|ckly ironic +1005|antique olive saddle papaya chiffon|Manufacturer#5|Brand#52|PROMO BRUSHED STEEL|39|WRAP CAN|906.00|even accounts s +1006|lime tomato orchid dim beige|Manufacturer#1|Brand#11|MEDIUM POLISHED COPPER|3|WRAP CASE|907.00|express, even packag +1007|hot lemon medium blue salmon|Manufacturer#1|Brand#14|ECONOMY PLATED TIN|9|JUMBO PKG|908.00|deas believe a +1008|blue cream aquamarine saddle beige|Manufacturer#5|Brand#55|PROMO PLATED TIN|8|LG DRUM|909.00|intain +1009|powder lace cyan hot chartreuse|Manufacturer#4|Brand#42|MEDIUM BURNISHED NICKEL|47|SM JAR|910.00|agains +1010|peach chocolate olive brown hot|Manufacturer#4|Brand#43|SMALL BURNISHED NICKEL|38|JUMBO DRUM|911.01|pinto be +1011|royal ivory goldenrod moccasin tomato|Manufacturer#5|Brand#54|ECONOMY PLATED STEEL|37|LG BOX|912.01|ely pending d +1012|dim linen puff lemon frosted|Manufacturer#4|Brand#44|SMALL ANODIZED COPPER|23|JUMBO JAR|913.01|kages after the sl +1013|mint navajo beige burnished peach|Manufacturer#2|Brand#24|STANDARD BRUSHED STEEL|14|JUMBO BOX|914.01|uests. furiously +1014|peach brown maroon green burlywood|Manufacturer#5|Brand#54|LARGE PLATED COPPER|13|WRAP CAN|915.01|theodolites are fur +1015|salmon peach rose goldenrod burlywood|Manufacturer#4|Brand#41|MEDIUM BRUSHED BRASS|15|MED CAN|916.01|ial deposits. acc +1016|azure blue mint brown goldenrod|Manufacturer#1|Brand#14|STANDARD POLISHED BRASS|40|SM PKG|917.01|ter the unus +1017|lime blush yellow dodger brown|Manufacturer#1|Brand#15|STANDARD ANODIZED BRASS|13|LG CASE|918.01| regular dependencies +1018|tan chartreuse wheat pink blanched|Manufacturer#4|Brand#41|MEDIUM PLATED COPPER|35|SM PACK|919.01|ole. final d +1019|deep wheat blanched purple black|Manufacturer#4|Brand#41|MEDIUM ANODIZED COPPER|18|SM BOX|920.01|sts. furious +1020|aquamarine dodger coral cornsilk dark|Manufacturer#3|Brand#31|LARGE POLISHED TIN|8|WRAP CASE|921.02|e furiously car +1021|azure maroon blanched purple lawn|Manufacturer#3|Brand#33|PROMO ANODIZED TIN|46|JUMBO BAG|922.02|ckages above th +1022|olive smoke blue dim ghost|Manufacturer#1|Brand#13|SMALL BURNISHED COPPER|33|WRAP CAN|923.02|sly quickly +1023|metallic rosy midnight cornflower chocolate|Manufacturer#2|Brand#24|PROMO POLISHED COPPER|50|SM CASE|924.02|ideas use slyly. care +1024|lawn sienna honeydew black mint|Manufacturer#5|Brand#55|SMALL POLISHED COPPER|2|MED PACK|925.02|ges ar +1025|olive violet saddle cyan chartreuse|Manufacturer#2|Brand#25|STANDARD ANODIZED COPPER|25|LG DRUM|926.02|ilent +1026|rosy smoke cyan chiffon purple|Manufacturer#4|Brand#41|ECONOMY ANODIZED TIN|47|SM CAN|927.02|counts maintain theo +1027|orchid dodger pale drab thistle|Manufacturer#3|Brand#31|PROMO ANODIZED NICKEL|9|JUMBO BAG|928.02|riously ironic platel +1028|lime almond light indian sienna|Manufacturer#1|Brand#12|PROMO BRUSHED COPPER|14|JUMBO CAN|929.02|the enticing idea +1029|purple rose khaki linen azure|Manufacturer#4|Brand#44|LARGE PLATED NICKEL|46|JUMBO PKG|930.02|of the requests. qu +1030|green lace medium burnished ivory|Manufacturer#2|Brand#21|STANDARD BRUSHED STEEL|20|MED JAR|931.03|uriously b +1031|firebrick red snow slate white|Manufacturer#3|Brand#32|MEDIUM BURNISHED NICKEL|13|SM BAG|932.03|nally! ironic requ +1032|lime pale blush tan steel|Manufacturer#1|Brand#15|ECONOMY ANODIZED BRASS|32|LG BAG|933.03|arefully regul +1033|blush chiffon midnight pink coral|Manufacturer#1|Brand#12|MEDIUM PLATED BRASS|23|MED JAR|934.03|cajole bl +1034|lime ivory sky gainsboro mint|Manufacturer#5|Brand#52|ECONOMY POLISHED BRASS|46|LG DRUM|935.03|tructi +1035|black slate chocolate blanched light|Manufacturer#5|Brand#52|STANDARD BRUSHED COPPER|13|MED CASE|936.03|hless +1036|honeydew lawn moccasin papaya tan|Manufacturer#3|Brand#35|MEDIUM BRUSHED COPPER|46|WRAP BAG|937.03|accounts +1037|violet sky chiffon drab lawn|Manufacturer#1|Brand#15|ECONOMY ANODIZED STEEL|36|JUMBO JAR|938.03| even, spec +1038|floral blue grey bisque saddle|Manufacturer#4|Brand#44|STANDARD BRUSHED STEEL|40|WRAP CAN|939.03|kages use a +1039|firebrick medium azure mint peach|Manufacturer#3|Brand#34|MEDIUM PLATED TIN|32|MED BAG|940.03| regular, +1040|green papaya light royal powder|Manufacturer#3|Brand#31|MEDIUM BRUSHED STEEL|40|WRAP PKG|941.04|furiously express re +1041|grey navajo antique chartreuse brown|Manufacturer#5|Brand#54|LARGE ANODIZED NICKEL|12|WRAP CAN|942.04|e the +1042|seashell chartreuse steel forest bisque|Manufacturer#3|Brand#32|ECONOMY BURNISHED NICKEL|42|JUMBO BAG|943.04|to eat +1043|seashell orchid linen spring dodger|Manufacturer#4|Brand#41|ECONOMY BURNISHED COPPER|32|SM CAN|944.04|express +1044|dodger almond cornsilk honeydew antique|Manufacturer#2|Brand#25|STANDARD PLATED TIN|25|MED CAN|945.04|ounts. iro +1045|aquamarine blush lawn cream lace|Manufacturer#3|Brand#35|ECONOMY ANODIZED STEEL|24|JUMBO CASE|946.04|blithely iron +1046|beige coral moccasin drab metallic|Manufacturer#2|Brand#23|SMALL POLISHED STEEL|33|MED JAR|947.04|final pinto beans +1047|cornflower snow khaki olive ivory|Manufacturer#5|Brand#54|STANDARD ANODIZED BRASS|18|LG DRUM|948.04|c instructions +1048|azure navy pink orchid royal|Manufacturer#2|Brand#24|MEDIUM BRUSHED STEEL|50|LG PACK|949.04|even accounts. fu +1049|bisque beige slate puff dim|Manufacturer#5|Brand#52|SMALL BRUSHED NICKEL|2|LG CASE|950.04|into beans. slyly +1050|lace cornsilk plum almond saddle|Manufacturer#3|Brand#34|STANDARD BRUSHED BRASS|4|MED CASE|951.05|tly regul +1051|lace gainsboro ivory blanched rose|Manufacturer#1|Brand#15|ECONOMY POLISHED BRASS|12|MED PKG|952.05|haggle. fluffily reg +1052|orchid wheat steel lavender sienna|Manufacturer#5|Brand#55|PROMO PLATED TIN|11|WRAP CASE|953.05|side of +1053|rosy cornsilk azure metallic ghost|Manufacturer#5|Brand#54|ECONOMY BRUSHED TIN|19|LG JAR|954.05| accounts. daring +1054|peru light blanched lemon medium|Manufacturer#2|Brand#24|LARGE BRUSHED STEEL|35|LG CAN|955.05|ggle blithe +1055|slate burnished chocolate black coral|Manufacturer#1|Brand#14|LARGE POLISHED COPPER|18|MED BAG|956.05|haggle p +1056|coral peach maroon seashell hot|Manufacturer#4|Brand#43|MEDIUM ANODIZED COPPER|13|JUMBO PKG|957.05|furiously even reques +1057|papaya antique moccasin indian pink|Manufacturer#1|Brand#12|ECONOMY PLATED BRASS|25|LG BOX|958.05|ual requests ar +1058|salmon blanched spring purple aquamarine|Manufacturer#5|Brand#53|ECONOMY ANODIZED COPPER|24|MED DRUM|959.05|sts. +1059|cornflower ghost drab forest chiffon|Manufacturer#4|Brand#43|MEDIUM ANODIZED TIN|40|JUMBO BOX|960.05|structions +1060|dark hot snow chocolate antique|Manufacturer#3|Brand#33|STANDARD POLISHED BRASS|46|SM CASE|961.06|final ideas. fina +1061|cornflower green orange brown puff|Manufacturer#1|Brand#15|MEDIUM BURNISHED TIN|50|LG BAG|962.06|n depende +1062|floral antique navy olive plum|Manufacturer#1|Brand#12|LARGE POLISHED TIN|12|JUMBO DRUM|963.06|quests are stealth +1063|gainsboro blush moccasin goldenrod beige|Manufacturer#5|Brand#55|SMALL BURNISHED BRASS|42|MED BAG|964.06| pinto be +1064|frosted orange bisque sandy steel|Manufacturer#3|Brand#31|SMALL PLATED NICKEL|4|SM PKG|965.06|onic pinto beans +1065|coral azure lawn navy hot|Manufacturer#4|Brand#43|STANDARD PLATED TIN|14|JUMBO CASE|966.06|ing deposits. blith +1066|khaki spring smoke orange peach|Manufacturer#3|Brand#31|SMALL BURNISHED NICKEL|30|SM CASE|967.06|fully across the unus +1067|medium honeydew bisque orange thistle|Manufacturer#3|Brand#33|SMALL BRUSHED BRASS|39|MED BOX|968.06|final plate +1068|antique rosy forest chiffon steel|Manufacturer#1|Brand#11|ECONOMY ANODIZED NICKEL|33|MED BOX|969.06|ously regular +1069|powder beige coral seashell lime|Manufacturer#5|Brand#55|SMALL PLATED TIN|1|LG DRUM|970.06| the carefu +1070|lace sienna cyan floral bisque|Manufacturer#4|Brand#45|SMALL POLISHED BRASS|31|WRAP DRUM|971.07| beans al +1071|seashell cyan saddle cornflower metallic|Manufacturer#2|Brand#22|SMALL BURNISHED STEEL|23|WRAP DRUM|972.07|ong the c +1072|dim frosted dark metallic cyan|Manufacturer#2|Brand#22|LARGE ANODIZED BRASS|31|SM PACK|973.07|ithes-- furious, +1073|midnight cornsilk blanched chiffon yellow|Manufacturer#2|Brand#22|MEDIUM BRUSHED BRASS|14|LG PACK|974.07|posits. furiously +1074|midnight burnished mint moccasin sienna|Manufacturer#5|Brand#53|STANDARD ANODIZED NICKEL|46|LG PACK|975.07|silent foxes nag furi +1075|indian chartreuse papaya light blue|Manufacturer#2|Brand#21|LARGE ANODIZED NICKEL|33|LG PACK|976.07| carefully un +1076|yellow magenta wheat ivory green|Manufacturer#1|Brand#13|PROMO BRUSHED BRASS|18|JUMBO CASE|977.07|. carefully enticing i +1077|gainsboro cream medium chiffon ghost|Manufacturer#4|Brand#41|STANDARD ANODIZED TIN|49|MED BAG|978.07|into beans. +1078|maroon mint steel lace cream|Manufacturer#4|Brand#41|SMALL BRUSHED NICKEL|22|WRAP CAN|979.07|ly among the care +1079|khaki azure honeydew sandy drab|Manufacturer#2|Brand#25|STANDARD ANODIZED COPPER|22|SM CASE|980.07|gular, regu +1080|khaki light beige frosted yellow|Manufacturer#5|Brand#52|STANDARD PLATED COPPER|21|JUMBO PKG|981.08| to the reg +1081|thistle papaya coral grey peru|Manufacturer#1|Brand#15|PROMO POLISHED NICKEL|44|SM PKG|982.08|s. depo +1082|cream magenta moccasin white salmon|Manufacturer#1|Brand#11|SMALL ANODIZED TIN|45|JUMBO PKG|983.08| throughout the +1083|mint black burnished rosy firebrick|Manufacturer#1|Brand#11|ECONOMY PLATED COPPER|20|JUMBO CASE|984.08|out the ca +1084|olive black brown drab cyan|Manufacturer#2|Brand#22|STANDARD BRUSHED TIN|10|JUMBO BAG|985.08|ptotes. carefully ruth +1085|cream mint olive lawn purple|Manufacturer#4|Brand#45|PROMO PLATED COPPER|26|LG CAN|986.08|anent notornis about +1086|navajo lemon powder almond peach|Manufacturer#4|Brand#45|LARGE BRUSHED COPPER|49|SM DRUM|987.08|ecial request +1087|purple light pale dark ghost|Manufacturer#4|Brand#42|LARGE ANODIZED COPPER|32|MED CASE|988.08|fluffily silent accou +1088|turquoise puff blanched dodger cream|Manufacturer#3|Brand#35|SMALL ANODIZED STEEL|7|MED CAN|989.08|above the furious +1089|slate goldenrod puff papaya misty|Manufacturer#2|Brand#24|LARGE BURNISHED TIN|26|WRAP CASE|990.08|dolites sleep acros +1090|sandy spring blush tomato snow|Manufacturer#1|Brand#13|SMALL PLATED TIN|6|MED PKG|991.09|furiously reg +1091|navajo blanched hot spring ghost|Manufacturer#2|Brand#22|LARGE BURNISHED STEEL|45|SM PKG|992.09|kly b +1092|rosy dim navy mint cream|Manufacturer#1|Brand#12|STANDARD ANODIZED BRASS|3|SM PKG|993.09|y bold asympt +1093|moccasin slate puff cream ivory|Manufacturer#2|Brand#25|STANDARD ANODIZED TIN|9|JUMBO BOX|994.09|ach evenly regu +1094|papaya azure lace midnight drab|Manufacturer#4|Brand#42|SMALL ANODIZED COPPER|2|SM PKG|995.09|excuses use +1095|cream blanched rosy chiffon red|Manufacturer#3|Brand#35|MEDIUM BURNISHED TIN|24|JUMBO DRUM|996.09|iously. silent +1096|frosted maroon powder dim lace|Manufacturer#5|Brand#51|SMALL PLATED NICKEL|33|LG DRUM|997.09|furiousl +1097|violet hot almond aquamarine azure|Manufacturer#3|Brand#31|ECONOMY BRUSHED STEEL|1|JUMBO CASE|998.09|unts. quickly +1098|navy honeydew azure deep beige|Manufacturer#2|Brand#21|ECONOMY POLISHED STEEL|44|JUMBO BAG|999.09|e ironic a +1099|coral orchid mint khaki chartreuse|Manufacturer#3|Brand#32|PROMO PLATED COPPER|43|LG DRUM|1000.09| idly silent dol +1100|lawn bisque black rosy steel|Manufacturer#4|Brand#41|ECONOMY BRUSHED STEEL|8|MED PKG|1001.10|regular pinto bea +1101|dim magenta steel dark beige|Manufacturer#5|Brand#53|STANDARD POLISHED BRASS|21|JUMBO BOX|1002.10|s. theodolites +1102|peach chiffon rosy light white|Manufacturer#4|Brand#45|PROMO PLATED COPPER|21|SM CAN|1003.10|, bol +1103|midnight spring sky olive ivory|Manufacturer#5|Brand#53|ECONOMY ANODIZED BRASS|35|LG DRUM|1004.10|lyly. carefully +1104|navy orchid burlywood antique frosted|Manufacturer#2|Brand#23|MEDIUM BRUSHED TIN|22|MED BAG|1005.10|ndencies. furio +1105|sienna olive beige dark khaki|Manufacturer#2|Brand#25|MEDIUM PLATED COPPER|7|JUMBO DRUM|1006.10|ely regular theodo +1106|brown saddle chocolate coral orange|Manufacturer#1|Brand#14|MEDIUM ANODIZED TIN|25|WRAP BAG|1007.10|ructions are +1107|forest sandy indian cornflower smoke|Manufacturer#3|Brand#34|ECONOMY BRUSHED COPPER|47|LG DRUM|1008.10|oss the fluffily final +1108|azure cyan sienna cornsilk navy|Manufacturer#1|Brand#13|MEDIUM POLISHED BRASS|24|WRAP CASE|1009.10|hely ironic +1109|azure lime seashell orange green|Manufacturer#5|Brand#54|ECONOMY BURNISHED NICKEL|13|JUMBO PACK|1010.10|nal packages boost flu +1110|lawn lavender violet grey tan|Manufacturer#4|Brand#44|STANDARD BURNISHED TIN|41|WRAP CAN|1011.11|es use blithely ev +1111|azure cornflower black peach brown|Manufacturer#1|Brand#11|LARGE BRUSHED COPPER|41|WRAP CAN|1012.11|d pinto beans cajole. +1112|orchid dim blanched seashell burlywood|Manufacturer#1|Brand#11|MEDIUM BRUSHED COPPER|21|JUMBO CASE|1013.11| use package +1113|lime navy smoke cream snow|Manufacturer#3|Brand#33|ECONOMY BURNISHED STEEL|39|SM PACK|1014.11| blithely regular +1114|lace rosy deep olive midnight|Manufacturer#4|Brand#43|LARGE POLISHED COPPER|43|MED DRUM|1015.11|nts. ironic +1115|forest cornsilk magenta gainsboro burnished|Manufacturer#2|Brand#24|PROMO PLATED NICKEL|47|LG CAN|1016.11|yly regula +1116|tomato spring mint pink orchid|Manufacturer#3|Brand#34|ECONOMY ANODIZED TIN|49|JUMBO CASE|1017.11|etly clo +1117|antique white goldenrod linen cream|Manufacturer#1|Brand#13|PROMO BURNISHED COPPER|28|WRAP PACK|1018.11|s use blithely. fl +1118|sandy brown steel beige floral|Manufacturer#5|Brand#55|SMALL POLISHED NICKEL|37|SM BOX|1019.11|encies affix acr +1119|pink frosted goldenrod forest slate|Manufacturer#1|Brand#14|ECONOMY BRUSHED NICKEL|24|WRAP JAR|1020.11|s according +1120|burlywood floral beige smoke rose|Manufacturer#2|Brand#22|SMALL PLATED TIN|1|MED CASE|1021.12|bout the slow foxes. +1121|lime seashell sienna metallic aquamarine|Manufacturer#3|Brand#35|LARGE BRUSHED STEEL|25|LG JAR|1022.12|ven instructi +1122|red plum goldenrod cream drab|Manufacturer#4|Brand#44|STANDARD BRUSHED NICKEL|7|SM BAG|1023.12|bold theod +1123|olive linen saddle pink cornsilk|Manufacturer#2|Brand#23|ECONOMY BURNISHED NICKEL|29|WRAP BAG|1024.12| pinto beans; slyl +1124|frosted magenta papaya seashell blanched|Manufacturer#2|Brand#22|MEDIUM BURNISHED TIN|23|WRAP JAR|1025.12|ckages nag carefully +1125|peach dark chiffon beige black|Manufacturer#2|Brand#23|SMALL PLATED NICKEL|12|WRAP DRUM|1026.12|uickly final deposit +1126|chiffon lawn powder violet spring|Manufacturer#2|Brand#23|MEDIUM BURNISHED TIN|27|LG PACK|1027.12|he ironic, iron +1127|saddle yellow pale magenta frosted|Manufacturer#2|Brand#22|SMALL PLATED STEEL|37|SM PKG|1028.12|hockey players. even +1128|indian navy lace royal chiffon|Manufacturer#5|Brand#52|STANDARD POLISHED STEEL|19|SM CAN|1029.12|hely so +1129|tan khaki yellow grey navajo|Manufacturer#4|Brand#44|SMALL ANODIZED TIN|45|SM JAR|1030.12|odolite +1130|lemon sandy plum lace metallic|Manufacturer#4|Brand#45|STANDARD PLATED STEEL|27|SM DRUM|1031.13|ges. packages nag sl +1131|cornflower magenta purple spring steel|Manufacturer#3|Brand#33|MEDIUM PLATED STEEL|49|WRAP BOX|1032.13|ut the final deposits +1132|pale sky seashell lace cornsilk|Manufacturer#2|Brand#22|STANDARD PLATED TIN|19|SM PKG|1033.13|es. slyly bold pa +1133|aquamarine ivory pink chocolate brown|Manufacturer#5|Brand#51|SMALL ANODIZED TIN|43|JUMBO PKG|1034.13|sily ironic reques +1134|gainsboro sandy pale firebrick plum|Manufacturer#1|Brand#14|PROMO PLATED BRASS|10|SM PACK|1035.13|. bli +1135|navajo azure turquoise magenta burnished|Manufacturer#1|Brand#13|MEDIUM PLATED STEEL|27|WRAP JAR|1036.13|cross the ironi +1136|blanched grey cyan navajo dim|Manufacturer#4|Brand#41|PROMO POLISHED NICKEL|38|SM JAR|1037.13|ckly +1137|lemon purple almond chartreuse blanched|Manufacturer#4|Brand#44|LARGE PLATED BRASS|21|WRAP JAR|1038.13|ong the quickly fina +1138|cyan forest linen bisque orange|Manufacturer#1|Brand#14|SMALL PLATED NICKEL|30|LG PKG|1039.13|ound the final, +1139|ivory medium wheat saddle forest|Manufacturer#4|Brand#41|ECONOMY BRUSHED TIN|13|WRAP CASE|1040.13|carefully e +1140|navy floral khaki smoke papaya|Manufacturer#1|Brand#15|LARGE BURNISHED BRASS|22|SM DRUM|1041.14|latelets sleep at +1141|orchid aquamarine almond blanched misty|Manufacturer#5|Brand#52|LARGE BURNISHED TIN|45|JUMBO CASE|1042.14|ounts bre +1142|violet black magenta honeydew burnished|Manufacturer#4|Brand#44|ECONOMY ANODIZED NICKEL|36|LG CAN|1043.14|ar requests wake ca +1143|medium green midnight cyan lime|Manufacturer#2|Brand#22|MEDIUM POLISHED COPPER|20|LG CAN|1044.14|ts? ste +1144|saddle metallic light antique sky|Manufacturer#2|Brand#25|ECONOMY PLATED NICKEL|23|WRAP JAR|1045.14|re. ironic, pen +1145|dim bisque blush indian sandy|Manufacturer#2|Brand#24|PROMO ANODIZED NICKEL|30|SM PACK|1046.14|ing, regular +1146|deep metallic cornsilk almond azure|Manufacturer#2|Brand#23|STANDARD BURNISHED NICKEL|26|SM PKG|1047.14|. furiously silent sau +1147|honeydew drab chartreuse cream hot|Manufacturer#1|Brand#15|ECONOMY BURNISHED BRASS|14|MED CASE|1048.14| the acco +1148|sienna saddle burlywood orange white|Manufacturer#5|Brand#52|MEDIUM ANODIZED TIN|8|SM PKG|1049.14| express, special a +1149|peru lavender peach royal deep|Manufacturer#4|Brand#42|STANDARD POLISHED BRASS|35|MED BOX|1050.14|s wake furiousl +1150|orange orchid pale powder navy|Manufacturer#2|Brand#21|LARGE POLISHED TIN|20|WRAP CAN|1051.15| theodol +1151|black dim orange olive almond|Manufacturer#4|Brand#44|ECONOMY POLISHED NICKEL|23|MED PACK|1052.15|ts sleep +1152|navy lawn azure dim ivory|Manufacturer#5|Brand#52|PROMO BRUSHED TIN|32|LG BAG|1053.15|s boos +1153|black medium dodger purple yellow|Manufacturer#5|Brand#54|MEDIUM BRUSHED TIN|35|LG CAN|1054.15|uction +1154|dim green sky orange bisque|Manufacturer#1|Brand#15|STANDARD BURNISHED NICKEL|8|JUMBO DRUM|1055.15| express +1155|light antique misty yellow gainsboro|Manufacturer#2|Brand#22|MEDIUM PLATED STEEL|40|LG BOX|1056.15|sits about the slyl +1156|floral blanched gainsboro sandy pale|Manufacturer#5|Brand#55|LARGE PLATED BRASS|8|JUMBO CASE|1057.15| even requests. deposi +1157|dim dodger plum papaya blush|Manufacturer#2|Brand#21|SMALL ANODIZED STEEL|1|JUMBO PKG|1058.15|uctions use blithely +1158|sienna puff peach dark violet|Manufacturer#2|Brand#21|LARGE PLATED COPPER|16|LG BOX|1059.15|pecial pa +1159|brown hot forest ghost sienna|Manufacturer#1|Brand#13|ECONOMY POLISHED BRASS|9|SM BAG|1060.15|fily cl +1160|navajo blush antique pale cornsilk|Manufacturer#3|Brand#33|SMALL BRUSHED STEEL|3|JUMBO DRUM|1061.16|ular p +1161|sienna coral steel ghost mint|Manufacturer#4|Brand#41|LARGE PLATED STEEL|2|WRAP PKG|1062.16|nusual ac +1162|sienna wheat cyan aquamarine sky|Manufacturer#5|Brand#54|LARGE BURNISHED BRASS|49|LG CAN|1063.16|mptotes might +1163|moccasin cyan cornflower midnight orchid|Manufacturer#3|Brand#33|LARGE BRUSHED BRASS|13|LG PACK|1064.16|rave instructions abo +1164|firebrick honeydew indian khaki steel|Manufacturer#5|Brand#52|STANDARD ANODIZED STEEL|6|LG PACK|1065.16| regular requests lo +1165|dim black hot burnished olive|Manufacturer#4|Brand#41|STANDARD BRUSHED NICKEL|4|LG PKG|1066.16|ly unusual accou +1166|navy rosy hot orange tan|Manufacturer#3|Brand#35|STANDARD ANODIZED NICKEL|14|LG JAR|1067.16|re furi +1167|lace ivory chiffon frosted indian|Manufacturer#2|Brand#21|STANDARD PLATED BRASS|49|MED DRUM|1068.16|ns haggle +1168|frosted chartreuse steel pink firebrick|Manufacturer#2|Brand#22|LARGE BRUSHED NICKEL|42|MED CASE|1069.16|he express ins +1169|firebrick papaya thistle chartreuse coral|Manufacturer#2|Brand#25|MEDIUM PLATED TIN|8|LG JAR|1070.16|e quickly final ex +1170|pink lawn antique red firebrick|Manufacturer#5|Brand#53|SMALL ANODIZED STEEL|10|WRAP DRUM|1071.17|d the theodolites +1171|sienna metallic rosy azure sandy|Manufacturer#4|Brand#45|MEDIUM BRUSHED BRASS|27|WRAP DRUM|1072.17|equests x-ray towa +1172|tomato linen yellow burlywood dodger|Manufacturer#4|Brand#45|MEDIUM POLISHED COPPER|15|WRAP PKG|1073.17|thely ironic idea +1173|midnight frosted snow red medium|Manufacturer#1|Brand#14|ECONOMY PLATED NICKEL|37|JUMBO JAR|1074.17|inst the fluffil +1174|cream sky seashell spring drab|Manufacturer#4|Brand#42|STANDARD POLISHED NICKEL|16|SM CASE|1075.17|heodolites. care +1175|cornflower wheat brown papaya ghost|Manufacturer#2|Brand#24|MEDIUM POLISHED TIN|29|JUMBO JAR|1076.17|. regular depos +1176|khaki floral blanched bisque firebrick|Manufacturer#4|Brand#42|PROMO PLATED NICKEL|22|WRAP CAN|1077.17|he slyly unusu +1177|pale medium cornflower cream red|Manufacturer#5|Brand#54|ECONOMY BRUSHED NICKEL|42|LG CASE|1078.17|quests along the furi +1178|lime light pink azure cyan|Manufacturer#2|Brand#24|MEDIUM POLISHED TIN|46|WRAP CAN|1079.17|usly across the car +1179|white cornflower snow ghost dodger|Manufacturer#4|Brand#43|ECONOMY ANODIZED COPPER|19|LG DRUM|1080.17|ending pla +1180|steel aquamarine coral snow thistle|Manufacturer#1|Brand#15|LARGE POLISHED COPPER|8|MED CASE|1081.18|gular accounts. quickl +1181|beige thistle yellow bisque maroon|Manufacturer#2|Brand#23|PROMO BRUSHED BRASS|17|LG BAG|1082.18|rious dolphins. +1182|metallic forest coral powder blush|Manufacturer#1|Brand#15|LARGE POLISHED COPPER|24|SM JAR|1083.18| slyly abo +1183|violet blanched pink peru seashell|Manufacturer#2|Brand#25|LARGE POLISHED STEEL|25|WRAP BOX|1084.18|arefully against +1184|sky navajo azure plum metallic|Manufacturer#1|Brand#14|MEDIUM BURNISHED NICKEL|32|WRAP PKG|1085.18|ngside of th +1185|beige lawn sky hot metallic|Manufacturer#2|Brand#21|PROMO PLATED TIN|12|SM PACK|1086.18|onically final depos +1186|dodger forest dim blush mint|Manufacturer#4|Brand#43|PROMO BURNISHED COPPER|13|LG CASE|1087.18| sleep c +1187|cornflower powder ghost firebrick chiffon|Manufacturer#1|Brand#15|MEDIUM POLISHED COPPER|44|WRAP JAR|1088.18|r accounts affix ab +1188|saddle chocolate mint orange royal|Manufacturer#3|Brand#35|LARGE BRUSHED STEEL|42|LG CAN|1089.18| deposits +1189|rose papaya chiffon dark black|Manufacturer#5|Brand#51|STANDARD POLISHED COPPER|20|JUMBO JAR|1090.18|ts detect after the +1190|magenta chiffon lavender olive moccasin|Manufacturer#2|Brand#21|SMALL BRUSHED BRASS|24|MED PACK|1091.19| instructio +1191|green bisque dark floral midnight|Manufacturer#1|Brand#13|LARGE BURNISHED TIN|49|SM CASE|1092.19| packages sle +1192|blue cornsilk moccasin orchid brown|Manufacturer#4|Brand#42|SMALL POLISHED TIN|15|LG CAN|1093.19|out the specia +1193|firebrick purple coral lavender goldenrod|Manufacturer#1|Brand#11|STANDARD POLISHED NICKEL|45|SM CAN|1094.19|kly accounts +1194|white drab lawn dodger cornflower|Manufacturer#5|Brand#53|MEDIUM BRUSHED STEEL|35|JUMBO DRUM|1095.19|ly re +1195|plum olive navy salmon indian|Manufacturer#1|Brand#13|MEDIUM PLATED COPPER|19|WRAP DRUM|1096.19|by the +1196|gainsboro forest cornsilk chocolate thistle|Manufacturer#1|Brand#13|ECONOMY PLATED STEEL|23|MED JAR|1097.19|asymptotes haggle b +1197|indian turquoise sienna saddle coral|Manufacturer#5|Brand#53|MEDIUM POLISHED STEEL|26|JUMBO DRUM|1098.19|efully f +1198|antique drab hot saddle gainsboro|Manufacturer#5|Brand#52|MEDIUM BURNISHED STEEL|26|MED BAG|1099.19|ronic +1199|drab cornsilk bisque wheat floral|Manufacturer#1|Brand#12|LARGE ANODIZED BRASS|1|LG PKG|1100.19|ong the q +1200|blush goldenrod beige papaya midnight|Manufacturer#1|Brand#11|PROMO BURNISHED TIN|42|SM PKG|1101.20|ng th +1201|aquamarine lace pink medium khaki|Manufacturer#5|Brand#54|LARGE POLISHED COPPER|21|JUMBO DRUM|1102.20|to bean +1202|lemon plum burlywood bisque light|Manufacturer#1|Brand#14|PROMO BURNISHED TIN|17|LG BAG|1103.20|final instruct +1203|pink plum coral papaya drab|Manufacturer#5|Brand#51|PROMO PLATED STEEL|35|WRAP JAR|1104.20|ld theodolites +1204|blanched royal red steel floral|Manufacturer#2|Brand#25|MEDIUM POLISHED NICKEL|15|LG JAR|1105.20|out the e +1205|beige aquamarine burnished coral navajo|Manufacturer#2|Brand#22|STANDARD BRUSHED COPPER|22|LG BOX|1106.20|s wake flu +1206|blush burlywood burnished khaki chiffon|Manufacturer#3|Brand#34|MEDIUM POLISHED NICKEL|43|MED CASE|1107.20|tes boost sl +1207|azure linen plum blush olive|Manufacturer#4|Brand#45|MEDIUM POLISHED STEEL|41|MED JAR|1108.20|nstruct +1208|purple chocolate blush turquoise maroon|Manufacturer#1|Brand#11|SMALL POLISHED COPPER|27|JUMBO PACK|1109.20|cial, special pinto +1209|dodger honeydew salmon papaya khaki|Manufacturer#5|Brand#52|STANDARD BURNISHED COPPER|32|JUMBO BAG|1110.20|leep. +1210|purple black lawn blanched metallic|Manufacturer#5|Brand#54|SMALL PLATED BRASS|23|SM DRUM|1111.21|lites +1211|blush navajo mint linen ivory|Manufacturer#3|Brand#35|SMALL ANODIZED TIN|39|SM CAN|1112.21|gedly final ideas +1212|cyan firebrick sky indian metallic|Manufacturer#1|Brand#12|LARGE ANODIZED TIN|45|LG PACK|1113.21| unusual accounts ab +1213|antique cream cyan powder drab|Manufacturer#1|Brand#13|STANDARD PLATED TIN|50|JUMBO JAR|1114.21|ly slyly even accounts +1214|medium magenta sienna cyan steel|Manufacturer#5|Brand#51|LARGE PLATED TIN|33|JUMBO CASE|1115.21| according to the +1215|papaya turquoise deep firebrick olive|Manufacturer#5|Brand#52|ECONOMY ANODIZED BRASS|14|SM DRUM|1116.21|ully even accounts. +1216|orange lavender red lime chiffon|Manufacturer#4|Brand#41|MEDIUM POLISHED BRASS|14|JUMBO PKG|1117.21|ly final dolphins are +1217|cream forest orchid salmon ivory|Manufacturer#5|Brand#52|MEDIUM ANODIZED COPPER|29|SM DRUM|1118.21|cajole carefully +1218|rosy frosted linen black peach|Manufacturer#2|Brand#22|STANDARD BRUSHED TIN|34|SM CASE|1119.21|ular +1219|deep aquamarine brown seashell forest|Manufacturer#4|Brand#43|LARGE ANODIZED COPPER|21|WRAP CASE|1120.21| ideas +1220|mint lawn peru magenta gainsboro|Manufacturer#3|Brand#31|SMALL BURNISHED TIN|18|JUMBO PKG|1121.22|regular packag +1221|rosy azure gainsboro indian turquoise|Manufacturer#2|Brand#23|LARGE BURNISHED BRASS|5|WRAP CASE|1122.22|o the blit +1222|maroon peach wheat white navajo|Manufacturer#2|Brand#21|MEDIUM POLISHED TIN|8|MED JAR|1123.22|lar foxes alongs +1223|olive yellow floral burlywood wheat|Manufacturer#1|Brand#12|MEDIUM ANODIZED STEEL|16|SM DRUM|1124.22|al foxes. fluff +1224|indian wheat sandy blanched cream|Manufacturer#3|Brand#35|SMALL BURNISHED NICKEL|29|SM PACK|1125.22| deposit +1225|dim plum coral lemon peru|Manufacturer#3|Brand#32|ECONOMY BURNISHED NICKEL|38|WRAP PKG|1126.22|al pinto +1226|purple dark papaya forest white|Manufacturer#5|Brand#52|LARGE POLISHED NICKEL|36|WRAP PKG|1127.22|jole blithely bold +1227|lavender honeydew dim chocolate khaki|Manufacturer#1|Brand#14|PROMO PLATED NICKEL|2|SM CAN|1128.22|es. slyly regular acc +1228|almond dodger dark saddle navy|Manufacturer#3|Brand#34|ECONOMY BURNISHED TIN|2|JUMBO PACK|1129.22|the courts. carefu +1229|pale goldenrod black peru frosted|Manufacturer#2|Brand#24|LARGE BURNISHED STEEL|47|JUMBO DRUM|1130.22|s. instructions nag +1230|thistle royal antique dark deep|Manufacturer#5|Brand#52|STANDARD BRUSHED TIN|12|MED JAR|1131.23|. furiousl +1231|azure tan purple aquamarine honeydew|Manufacturer#4|Brand#42|LARGE ANODIZED NICKEL|4|JUMBO CAN|1132.23|usly express +1232|beige yellow cyan royal light|Manufacturer#4|Brand#43|MEDIUM PLATED NICKEL|2|SM BAG|1133.23| the blithely slo +1233|blanched olive orange smoke cornflower|Manufacturer#2|Brand#21|SMALL BURNISHED BRASS|32|MED BOX|1134.23|symptotes run +1234|thistle khaki navy magenta light|Manufacturer#4|Brand#42|SMALL BRUSHED STEEL|28|LG JAR|1135.23|e quickly ruthles +1235|rose salmon snow tomato navy|Manufacturer#4|Brand#44|SMALL PLATED NICKEL|12|SM BAG|1136.23| furiously express +1236|dim rose rosy almond puff|Manufacturer#4|Brand#42|MEDIUM ANODIZED NICKEL|26|LG CAN|1137.23|s sleep. furiously iro +1237|rosy blue bisque burlywood gainsboro|Manufacturer#2|Brand#25|STANDARD ANODIZED BRASS|10|MED DRUM|1138.23|ccount +1238|forest lemon dodger blanched ghost|Manufacturer#1|Brand#11|ECONOMY PLATED BRASS|13|MED CASE|1139.23| fluffily special +1239|purple dim sky green navajo|Manufacturer#5|Brand#51|PROMO BURNISHED STEEL|24|LG CASE|1140.23|structions? quickly i +1240|grey antique sandy olive medium|Manufacturer#2|Brand#22|ECONOMY BURNISHED NICKEL|19|MED JAR|1141.24|r ideas hang ag +1241|beige cream drab honeydew chiffon|Manufacturer#4|Brand#41|STANDARD BRUSHED BRASS|10|LG DRUM|1142.24|aggle +1242|ghost azure hot dark violet|Manufacturer#3|Brand#31|ECONOMY ANODIZED COPPER|25|MED DRUM|1143.24|uriously pen +1243|lemon lace turquoise bisque wheat|Manufacturer#2|Brand#23|LARGE BRUSHED NICKEL|47|JUMBO BOX|1144.24|nusua +1244|navy red blush ghost coral|Manufacturer#1|Brand#12|MEDIUM PLATED NICKEL|24|MED PACK|1145.24|ding accounts. +1245|rosy chiffon green beige plum|Manufacturer#3|Brand#33|SMALL POLISHED NICKEL|4|WRAP PACK|1146.24| deposits x-ray care +1246|aquamarine chartreuse spring dodger navajo|Manufacturer#1|Brand#11|STANDARD POLISHED COPPER|27|JUMBO DRUM|1147.24|press pinto bean +1247|cream burlywood firebrick beige wheat|Manufacturer#3|Brand#35|SMALL POLISHED BRASS|18|WRAP JAR|1148.24|rays across the reque +1248|honeydew plum cornflower drab magenta|Manufacturer#3|Brand#32|SMALL BURNISHED STEEL|33|LG CAN|1149.24|he express, reg +1249|sky deep coral green tomato|Manufacturer#3|Brand#35|STANDARD ANODIZED COPPER|1|WRAP CASE|1150.24|lar requ +1250|lime khaki burnished chocolate green|Manufacturer#5|Brand#51|SMALL POLISHED NICKEL|10|LG BAG|1151.25| haggle quickly des +1251|chiffon hot rosy ghost slate|Manufacturer#1|Brand#12|STANDARD ANODIZED STEEL|16|JUMBO BAG|1152.25|ins haggle +1252|gainsboro drab sky cyan midnight|Manufacturer#2|Brand#21|PROMO BRUSHED STEEL|23|JUMBO BOX|1153.25|sleep +1253|burlywood rosy turquoise chartreuse pink|Manufacturer#1|Brand#14|LARGE ANODIZED NICKEL|9|SM PACK|1154.25| sublate fu +1254|brown chocolate pale goldenrod dodger|Manufacturer#2|Brand#24|PROMO BRUSHED STEEL|7|WRAP PACK|1155.25|efully express pi +1255|olive gainsboro red purple coral|Manufacturer#5|Brand#52|LARGE POLISHED NICKEL|1|WRAP BOX|1156.25| somas wa +1256|maroon orchid firebrick gainsboro cream|Manufacturer#5|Brand#53|PROMO POLISHED BRASS|16|WRAP DRUM|1157.25|y pending id +1257|blue almond midnight forest ivory|Manufacturer#5|Brand#52|MEDIUM BURNISHED BRASS|1|SM BAG|1158.25|accounts sleep quickly +1258|pink antique gainsboro brown midnight|Manufacturer#5|Brand#52|MEDIUM BRUSHED STEEL|30|LG DRUM|1159.25|, final +1259|lavender frosted azure blanched grey|Manufacturer#5|Brand#54|LARGE POLISHED NICKEL|43|MED CASE|1160.25|nts boost accou +1260|ivory steel red forest gainsboro|Manufacturer#4|Brand#43|PROMO BRUSHED STEEL|15|LG PKG|1161.26|ular instructions x-ra +1261|blue mint slate moccasin drab|Manufacturer#5|Brand#55|MEDIUM PLATED NICKEL|21|LG BOX|1162.26|reque +1262|azure bisque rosy tomato sky|Manufacturer#3|Brand#35|SMALL BRUSHED BRASS|37|WRAP CASE|1163.26|sual ideas detect am +1263|black puff antique ivory lime|Manufacturer#4|Brand#44|STANDARD ANODIZED COPPER|34|MED PACK|1164.26|s. boldly regular ac +1264|burlywood rosy floral lawn royal|Manufacturer#4|Brand#42|STANDARD ANODIZED NICKEL|7|MED JAR|1165.26|the quickly final t +1265|lavender burnished frosted peru blush|Manufacturer#5|Brand#53|LARGE BURNISHED COPPER|8|JUMBO CAN|1166.26|areful platelets a +1266|orchid royal lawn dim coral|Manufacturer#3|Brand#33|SMALL ANODIZED TIN|10|LG PACK|1167.26|instructions. f +1267|chocolate salmon dim frosted forest|Manufacturer#1|Brand#11|PROMO BURNISHED BRASS|36|MED CASE|1168.26|boost daringly against +1268|burnished rosy aquamarine turquoise burlywood|Manufacturer#3|Brand#31|ECONOMY POLISHED STEEL|47|LG PKG|1169.26|s might +1269|bisque almond sky lavender honeydew|Manufacturer#5|Brand#51|SMALL PLATED STEEL|28|WRAP CAN|1170.26|ly regular packages +1270|lemon azure brown lime puff|Manufacturer#3|Brand#35|LARGE ANODIZED TIN|30|SM BAG|1171.27|ly regu +1271|metallic wheat orchid sky saddle|Manufacturer#2|Brand#23|MEDIUM BRUSHED NICKEL|3|LG JAR|1172.27|unts. slyly regu +1272|deep pink lemon cream blanched|Manufacturer#3|Brand#33|PROMO BURNISHED NICKEL|10|WRAP BAG|1173.27|uickly to the sly +1273|wheat dark burnished salmon hot|Manufacturer#2|Brand#25|MEDIUM BRUSHED COPPER|11|LG JAR|1174.27|unusual plat +1274|drab honeydew ghost orange medium|Manufacturer#5|Brand#55|SMALL POLISHED BRASS|39|MED PKG|1175.27|luffily pend +1275|red turquoise forest lawn lime|Manufacturer#5|Brand#51|MEDIUM PLATED NICKEL|29|SM CAN|1176.27|nding foxes haggle s +1276|navajo brown sky peru pale|Manufacturer#1|Brand#15|STANDARD PLATED NICKEL|19|WRAP CASE|1177.27|pecial packag +1277|grey light cornsilk sandy bisque|Manufacturer#3|Brand#31|PROMO BURNISHED STEEL|48|JUMBO DRUM|1178.27|pinto beans cajol +1278|navy burnished grey misty midnight|Manufacturer#4|Brand#43|STANDARD PLATED STEEL|13|JUMBO JAR|1179.27|f the +1279|ghost brown blue honeydew orchid|Manufacturer#2|Brand#24|STANDARD BRUSHED STEEL|40|WRAP PACK|1180.27|. slyly +1280|saddle green violet deep beige|Manufacturer#3|Brand#35|PROMO PLATED NICKEL|37|SM DRUM|1181.28| deposits sleep blith +1281|pale pink orchid peru ghost|Manufacturer#4|Brand#44|STANDARD BURNISHED STEEL|41|LG PKG|1182.28|its detect. b +1282|peach seashell rosy indian lavender|Manufacturer#1|Brand#14|STANDARD POLISHED TIN|33|WRAP PACK|1183.28|gular asymptot +1283|frosted cornsilk snow azure khaki|Manufacturer#2|Brand#22|PROMO BURNISHED BRASS|7|JUMBO DRUM|1184.28|lyly even ideas! even +1284|grey sandy drab gainsboro khaki|Manufacturer#1|Brand#13|ECONOMY BRUSHED COPPER|40|SM CAN|1185.28|deposits ac +1285|frosted purple hot brown azure|Manufacturer#5|Brand#55|LARGE POLISHED STEEL|36|LG BAG|1186.28|packages dazzle. +1286|honeydew burlywood white thistle dim|Manufacturer#2|Brand#23|LARGE ANODIZED TIN|35|WRAP BAG|1187.28|ven dolphins. regular +1287|peach coral blue papaya rose|Manufacturer#4|Brand#41|PROMO BRUSHED TIN|33|SM BOX|1188.28|e of +1288|drab cornflower slate beige metallic|Manufacturer#3|Brand#34|STANDARD BURNISHED NICKEL|48|SM PACK|1189.28|egular pearls. the +1289|blanched orchid coral cornflower cream|Manufacturer#4|Brand#43|STANDARD POLISHED TIN|29|JUMBO PACK|1190.28| the specia +1290|plum lime forest linen green|Manufacturer#4|Brand#45|STANDARD ANODIZED COPPER|10|LG CAN|1191.29|ns cajole quick +1291|cornsilk pink royal frosted green|Manufacturer#3|Brand#35|SMALL PLATED COPPER|26|WRAP CASE|1192.29|lar requests. expre +1292|misty burnished cornflower purple cream|Manufacturer#4|Brand#43|MEDIUM ANODIZED COPPER|49|MED BAG|1193.29|aggle blithely iro +1293|dim burlywood dark almond white|Manufacturer#4|Brand#45|MEDIUM BRUSHED COPPER|29|WRAP PKG|1194.29|refull +1294|tomato beige lemon chiffon cyan|Manufacturer#1|Brand#11|STANDARD BURNISHED TIN|30|LG DRUM|1195.29|structions nag slyl +1295|antique cyan aquamarine magenta wheat|Manufacturer#4|Brand#45|MEDIUM ANODIZED NICKEL|16|MED JAR|1196.29|r ideas cajole be +1296|sky goldenrod metallic midnight antique|Manufacturer#2|Brand#23|LARGE BURNISHED NICKEL|27|SM PACK|1197.29|ously +1297|grey steel metallic purple chartreuse|Manufacturer#3|Brand#32|ECONOMY BRUSHED STEEL|5|MED PKG|1198.29|beans. ironic, iron +1298|honeydew lavender green dodger black|Manufacturer#3|Brand#35|PROMO POLISHED TIN|16|SM BAG|1199.29|g to th +1299|black chocolate smoke dodger misty|Manufacturer#3|Brand#33|MEDIUM PLATED STEEL|10|JUMBO PKG|1200.29|ly deposits +1300|dim medium cyan sky brown|Manufacturer#2|Brand#25|SMALL BURNISHED NICKEL|39|LG CASE|1201.30| platelets haggle +1301|lace cream cornflower saddle beige|Manufacturer#5|Brand#52|LARGE PLATED BRASS|30|WRAP CASE|1202.30|ct. slyl +1302|slate medium wheat cyan royal|Manufacturer#1|Brand#11|STANDARD BURNISHED TIN|27|SM DRUM|1203.30|he ironic i +1303|orchid blue snow peru cornsilk|Manufacturer#2|Brand#23|ECONOMY PLATED BRASS|7|LG CAN|1204.30|refully bold +1304|firebrick cream royal lavender saddle|Manufacturer#2|Brand#22|MEDIUM BRUSHED COPPER|3|JUMBO BOX|1205.30|ke above the iron +1305|chartreuse seashell blue firebrick lawn|Manufacturer#5|Brand#52|LARGE POLISHED TIN|32|WRAP CASE|1206.30|ndencies are. reg +1306|blanched puff yellow smoke linen|Manufacturer#1|Brand#15|STANDARD PLATED TIN|3|JUMBO CASE|1207.30|nusual, idle id +1307|beige misty burnished goldenrod medium|Manufacturer#3|Brand#31|SMALL BRUSHED NICKEL|23|SM BOX|1208.30|. busy, regular fo +1308|thistle slate firebrick goldenrod magenta|Manufacturer#4|Brand#44|MEDIUM ANODIZED STEEL|34|LG PACK|1209.30|ely even requests. sly +1309|floral beige black dim antique|Manufacturer#2|Brand#21|MEDIUM BURNISHED BRASS|21|JUMBO BOX|1210.30|kly carefully final as +1310|almond slate lemon salmon honeydew|Manufacturer#5|Brand#53|PROMO PLATED COPPER|18|WRAP CAN|1211.31|ly bold depende +1311|moccasin tan puff salmon hot|Manufacturer#5|Brand#53|LARGE ANODIZED STEEL|28|JUMBO JAR|1212.31|ounts. regular pint +1312|wheat lemon bisque rosy burlywood|Manufacturer#5|Brand#53|STANDARD PLATED COPPER|11|LG PACK|1213.31|refully sp +1313|cornflower tan navajo coral khaki|Manufacturer#4|Brand#43|ECONOMY POLISHED TIN|45|LG BAG|1214.31| foxe +1314|thistle olive honeydew lawn maroon|Manufacturer#2|Brand#25|LARGE PLATED COPPER|50|SM DRUM|1215.31|about the +1315|beige cornsilk gainsboro dodger midnight|Manufacturer#4|Brand#44|LARGE BRUSHED TIN|3|JUMBO CAN|1216.31|ly alo +1316|gainsboro papaya white brown cream|Manufacturer#1|Brand#14|PROMO PLATED BRASS|32|JUMBO CAN|1217.31|tructions wa +1317|royal steel navy red cornflower|Manufacturer#4|Brand#45|PROMO ANODIZED COPPER|36|JUMBO CAN|1218.31|ld deposits ab +1318|dim almond green navajo burnished|Manufacturer#3|Brand#34|LARGE POLISHED BRASS|8|LG CASE|1219.31|across +1319|rose frosted brown saddle turquoise|Manufacturer#2|Brand#22|MEDIUM BURNISHED TIN|19|LG PACK|1220.31|pinto bea +1320|forest papaya midnight chartreuse tan|Manufacturer#2|Brand#21|PROMO BRUSHED TIN|42|LG BOX|1221.32|ajole along the q +1321|blue lavender antique olive light|Manufacturer#3|Brand#32|ECONOMY ANODIZED COPPER|36|LG PKG|1222.32|lyly. s +1322|black slate wheat khaki white|Manufacturer#3|Brand#35|STANDARD ANODIZED TIN|21|SM DRUM|1223.32|encies. +1323|misty floral lemon steel linen|Manufacturer#4|Brand#45|SMALL POLISHED TIN|47|LG JAR|1224.32|y carefully +1324|green dodger lace brown light|Manufacturer#4|Brand#44|MEDIUM POLISHED NICKEL|40|JUMBO CASE|1225.32|ts affix according to +1325|smoke wheat cream rosy red|Manufacturer#5|Brand#55|LARGE ANODIZED BRASS|17|WRAP BOX|1226.32| special tithes boost +1326|burlywood honeydew red olive spring|Manufacturer#4|Brand#44|ECONOMY BURNISHED BRASS|35|WRAP CASE|1227.32|ges sleep quickly even +1327|forest burlywood chartreuse tan orange|Manufacturer#3|Brand#33|STANDARD BURNISHED BRASS|43|SM JAR|1228.32|c accou +1328|steel cyan sky misty pale|Manufacturer#1|Brand#12|ECONOMY PLATED COPPER|28|MED CASE|1229.32| slyly s +1329|peru maroon forest navajo khaki|Manufacturer#1|Brand#12|PROMO POLISHED BRASS|21|JUMBO PACK|1230.32| to the care +1330|green cornsilk lace plum beige|Manufacturer#3|Brand#31|SMALL BURNISHED COPPER|1|JUMBO PKG|1231.33|ding to t +1331|navy honeydew cornsilk beige orange|Manufacturer#2|Brand#22|MEDIUM BRUSHED TIN|18|JUMBO JAR|1232.33|against the blit +1332|thistle peach aquamarine red chartreuse|Manufacturer#3|Brand#31|SMALL ANODIZED TIN|21|WRAP JAR|1233.33|t even, ironic id +1333|orange sky violet lemon hot|Manufacturer#2|Brand#23|MEDIUM POLISHED STEEL|50|WRAP JAR|1234.33|ts alongside of the +1334|cornflower thistle puff burlywood metallic|Manufacturer#4|Brand#42|PROMO PLATED TIN|29|MED CASE|1235.33| blithely final de +1335|metallic lawn chocolate lemon antique|Manufacturer#1|Brand#15|ECONOMY BRUSHED NICKEL|15|SM JAR|1236.33|ntegrat +1336|hot ghost sandy olive rosy|Manufacturer#5|Brand#55|STANDARD ANODIZED STEEL|42|JUMBO CAN|1237.33| slyly even pac +1337|blanched chiffon beige lavender olive|Manufacturer#5|Brand#53|MEDIUM BRUSHED STEEL|45|WRAP CAN|1238.33|ts. p +1338|sky ghost green chiffon light|Manufacturer#2|Brand#24|ECONOMY BRUSHED BRASS|36|MED CASE|1239.33|osits. idea +1339|lavender ghost green seashell hot|Manufacturer#1|Brand#14|STANDARD POLISHED STEEL|7|LG PKG|1240.33|old packages haggle +1340|peach turquoise metallic linen dodger|Manufacturer#4|Brand#42|ECONOMY BRUSHED TIN|42|JUMBO BOX|1241.34|lithely regular theod +1341|red floral misty goldenrod lace|Manufacturer#4|Brand#45|STANDARD POLISHED TIN|38|LG PKG|1242.34| regular +1342|seashell thistle cyan goldenrod lawn|Manufacturer#3|Brand#32|PROMO ANODIZED STEEL|11|LG PKG|1243.34|uffily. blithe +1343|white metallic cornflower coral beige|Manufacturer#3|Brand#31|PROMO BURNISHED TIN|11|WRAP PKG|1244.34|cuses +1344|pale navajo red saddle blanched|Manufacturer#3|Brand#33|LARGE ANODIZED TIN|7|JUMBO CASE|1245.34|into bea +1345|mint smoke powder cream burlywood|Manufacturer#3|Brand#33|ECONOMY ANODIZED TIN|29|MED DRUM|1246.34|nusual, pending packag +1346|navajo slate misty gainsboro dodger|Manufacturer#4|Brand#45|MEDIUM PLATED TIN|34|MED BOX|1247.34| theodolites +1347|peru midnight lace tomato magenta|Manufacturer#5|Brand#54|ECONOMY ANODIZED NICKEL|12|JUMBO CAN|1248.34|sleep alway +1348|lawn maroon linen bisque honeydew|Manufacturer#4|Brand#43|ECONOMY ANODIZED BRASS|47|JUMBO BAG|1249.34|ove the regular, ironi +1349|khaki black olive almond peach|Manufacturer#2|Brand#24|STANDARD PLATED STEEL|13|MED PKG|1250.34|eep furiously blithe +1350|black azure navajo hot lemon|Manufacturer#1|Brand#13|MEDIUM BRUSHED COPPER|26|JUMBO JAR|1251.35|ial packages after th +1351|cornflower cyan spring olive tomato|Manufacturer#4|Brand#42|SMALL BRUSHED TIN|25|JUMBO PACK|1252.35| the regular pint +1352|almond midnight chocolate tomato olive|Manufacturer#2|Brand#23|SMALL POLISHED COPPER|5|SM CASE|1253.35| wake furiou +1353|frosted mint smoke brown saddle|Manufacturer#1|Brand#11|PROMO ANODIZED NICKEL|25|MED BOX|1254.35|ts affix blithely +1354|plum azure dim aquamarine turquoise|Manufacturer#1|Brand#13|STANDARD POLISHED COPPER|22|MED PACK|1255.35|the furio +1355|blue tomato aquamarine firebrick dim|Manufacturer#4|Brand#42|LARGE PLATED TIN|7|SM CAN|1256.35|ake across the eve +1356|tan brown lemon antique lace|Manufacturer#3|Brand#34|SMALL BURNISHED COPPER|11|WRAP CASE|1257.35| brav +1357|turquoise chiffon firebrick bisque ivory|Manufacturer#3|Brand#34|SMALL BRUSHED BRASS|27|WRAP PKG|1258.35|y special plat +1358|almond sienna salmon dark peach|Manufacturer#4|Brand#45|PROMO PLATED TIN|18|WRAP CASE|1259.35|y even instructions +1359|magenta black papaya turquoise lawn|Manufacturer#2|Brand#21|LARGE PLATED TIN|29|WRAP DRUM|1260.35|lyly regula +1360|medium khaki chocolate moccasin frosted|Manufacturer#2|Brand#21|STANDARD BURNISHED STEEL|31|JUMBO CASE|1261.36|e blithely caref +1361|goldenrod dodger peach dark hot|Manufacturer#2|Brand#24|ECONOMY PLATED COPPER|36|MED DRUM|1262.36|dogged theod +1362|ivory forest grey almond chocolate|Manufacturer#1|Brand#14|PROMO PLATED BRASS|8|SM BOX|1263.36|ns. slyly ir +1363|antique lavender smoke red black|Manufacturer#3|Brand#32|PROMO POLISHED COPPER|30|MED DRUM|1264.36|thin packages int +1364|spring plum gainsboro cyan royal|Manufacturer#3|Brand#34|ECONOMY ANODIZED TIN|5|JUMBO CAN|1265.36|deposits. car +1365|brown indian blanched sandy blue|Manufacturer#1|Brand#12|LARGE BURNISHED TIN|30|MED CASE|1266.36|ole alongside +1366|magenta dim chartreuse peru cyan|Manufacturer#2|Brand#22|MEDIUM BRUSHED COPPER|45|LG JAR|1267.36|nder carefully final +1367|dodger grey aquamarine goldenrod lemon|Manufacturer#4|Brand#45|ECONOMY PLATED COPPER|47|SM JAR|1268.36|fix slyly? quickly +1368|aquamarine tan midnight navajo saddle|Manufacturer#3|Brand#35|MEDIUM ANODIZED COPPER|32|SM BAG|1269.36|aggle acros +1369|burlywood maroon black khaki pale|Manufacturer#5|Brand#54|ECONOMY BURNISHED COPPER|7|SM PKG|1270.36|ideas s +1370|bisque mint blush navajo saddle|Manufacturer#3|Brand#33|STANDARD PLATED NICKEL|36|WRAP PACK|1271.37|n deposits haggle +1371|powder snow khaki beige chiffon|Manufacturer#5|Brand#54|ECONOMY ANODIZED STEEL|42|SM BOX|1272.37|he special +1372|saddle orange puff burnished grey|Manufacturer#1|Brand#14|PROMO ANODIZED COPPER|41|WRAP JAR|1273.37| furiousl +1373|antique hot olive lavender deep|Manufacturer#3|Brand#33|ECONOMY ANODIZED TIN|13|SM PACK|1274.37| regular theodolites +1374|azure grey medium yellow aquamarine|Manufacturer#1|Brand#12|ECONOMY ANODIZED COPPER|43|JUMBO BAG|1275.37| are packages. +1375|purple spring linen midnight khaki|Manufacturer#5|Brand#51|SMALL POLISHED TIN|35|JUMBO BAG|1276.37| depo +1376|brown mint ghost cyan floral|Manufacturer#3|Brand#34|MEDIUM BURNISHED COPPER|5|WRAP BAG|1277.37|s are furiou +1377|chartreuse bisque lime drab navy|Manufacturer#4|Brand#42|PROMO BRUSHED TIN|46|JUMBO JAR|1278.37|sts; slyly +1378|plum azure sky metallic steel|Manufacturer#1|Brand#15|PROMO BRUSHED BRASS|8|WRAP CASE|1279.37|ending foxes. quickl +1379|green salmon rose olive aquamarine|Manufacturer#3|Brand#33|SMALL BRUSHED BRASS|33|MED PACK|1280.37|inst the regular ex +1380|azure blue magenta lemon dim|Manufacturer#1|Brand#14|MEDIUM BRUSHED STEEL|30|MED BAG|1281.38|the carefully ironi +1381|lemon moccasin violet midnight black|Manufacturer#3|Brand#34|STANDARD BURNISHED COPPER|30|JUMBO DRUM|1282.38|gular foxe +1382|cornflower metallic honeydew gainsboro orange|Manufacturer#5|Brand#51|STANDARD BURNISHED COPPER|17|LG JAR|1283.38|ts detect fluffi +1383|red orchid antique indian honeydew|Manufacturer#3|Brand#34|LARGE BRUSHED STEEL|5|SM CAN|1284.38|heodolites wake blithe +1384|maroon dodger blue plum yellow|Manufacturer#5|Brand#52|PROMO BURNISHED TIN|27|WRAP PACK|1285.38|lar pinto beans-- +1385|green aquamarine blanched lemon lavender|Manufacturer#5|Brand#53|ECONOMY BURNISHED COPPER|5|JUMBO BAG|1286.38|telets doubt. silent +1386|frosted dodger cream almond bisque|Manufacturer#3|Brand#34|STANDARD ANODIZED NICKEL|36|JUMBO PKG|1287.38|final th +1387|puff gainsboro papaya tan hot|Manufacturer#1|Brand#13|LARGE BURNISHED TIN|17|WRAP PKG|1288.38|s across +1388|misty moccasin gainsboro orchid burlywood|Manufacturer#5|Brand#51|SMALL BURNISHED BRASS|11|MED JAR|1289.38| accounts. +1389|lemon magenta burnished almond medium|Manufacturer#1|Brand#12|MEDIUM ANODIZED BRASS|21|MED CAN|1290.38|wake +1390|coral medium peru light steel|Manufacturer#4|Brand#42|STANDARD BURNISHED COPPER|8|WRAP BAG|1291.39|fter the slyly perma +1391|orange burnished sky orchid goldenrod|Manufacturer#4|Brand#43|SMALL POLISHED COPPER|17|JUMBO PKG|1292.39|heodolites. +1392|cream gainsboro peach medium ghost|Manufacturer#5|Brand#54|MEDIUM BRUSHED BRASS|18|MED PACK|1293.39| carefully even accou +1393|navy light pale salmon lemon|Manufacturer#3|Brand#34|PROMO BURNISHED COPPER|34|MED CAN|1294.39|endencies boost fu +1394|lawn smoke bisque khaki cyan|Manufacturer#1|Brand#14|MEDIUM BRUSHED NICKEL|29|WRAP BAG|1295.39|usly. exp +1395|turquoise yellow magenta burnished peach|Manufacturer#1|Brand#12|STANDARD BRUSHED STEEL|40|SM DRUM|1296.39|lyly p +1396|ivory deep dim almond chiffon|Manufacturer#2|Brand#21|ECONOMY BRUSHED TIN|48|SM CAN|1297.39|ake quickly. pi +1397|bisque gainsboro honeydew orchid rosy|Manufacturer#5|Brand#51|ECONOMY BURNISHED BRASS|10|LG CAN|1298.39|gular +1398|medium black navy almond violet|Manufacturer#3|Brand#32|MEDIUM POLISHED TIN|27|WRAP DRUM|1299.39|ironic deposits haggl +1399|black maroon magenta chartreuse dodger|Manufacturer#5|Brand#54|ECONOMY POLISHED COPPER|48|JUMBO JAR|1300.39| furiously agai +1400|rose azure dark cyan misty|Manufacturer#1|Brand#14|MEDIUM PLATED NICKEL|44|JUMBO BOX|1301.40|t the quick +1401|cornflower tomato aquamarine ivory green|Manufacturer#5|Brand#52|MEDIUM ANODIZED BRASS|17|JUMBO PKG|1302.40|usual +1402|goldenrod drab dim red burnished|Manufacturer#5|Brand#51|STANDARD PLATED TIN|13|SM JAR|1303.40|aggle slyly furi +1403|goldenrod lime powder salmon rose|Manufacturer#3|Brand#35|LARGE BRUSHED NICKEL|42|LG BOX|1304.40|heodoli +1404|indian azure brown hot wheat|Manufacturer#2|Brand#23|LARGE PLATED BRASS|34|SM DRUM|1305.40|l accounts hang fur +1405|aquamarine chiffon cream dark honeydew|Manufacturer#3|Brand#33|ECONOMY POLISHED BRASS|14|LG CAN|1306.40|ress p +1406|navajo beige burnished dark thistle|Manufacturer#3|Brand#34|STANDARD BRUSHED STEEL|26|JUMBO CAN|1307.40| final p +1407|beige chiffon frosted cream cornflower|Manufacturer#5|Brand#55|PROMO ANODIZED NICKEL|25|LG CAN|1308.40|ilent fox +1408|azure moccasin deep drab brown|Manufacturer#1|Brand#12|STANDARD BURNISHED BRASS|17|JUMBO CAN|1309.40|e. esca +1409|medium ghost bisque antique seashell|Manufacturer#2|Brand#22|SMALL BURNISHED COPPER|11|SM BAG|1310.40|xes about +1410|pink deep blue tomato rosy|Manufacturer#4|Brand#43|SMALL ANODIZED COPPER|44|LG PACK|1311.41|ke fu +1411|firebrick blush goldenrod powder saddle|Manufacturer#5|Brand#55|PROMO BRUSHED NICKEL|2|JUMBO DRUM|1312.41|are sl +1412|burnished azure khaki dark maroon|Manufacturer#4|Brand#42|MEDIUM PLATED NICKEL|35|JUMBO BAG|1313.41| express accounts. +1413|coral thistle medium ivory mint|Manufacturer#4|Brand#45|ECONOMY POLISHED COPPER|28|WRAP BOX|1314.41|cajole carefully instr +1414|firebrick orange violet snow magenta|Manufacturer#4|Brand#41|LARGE ANODIZED NICKEL|44|SM PACK|1315.41|nts us +1415|honeydew salmon blanched chartreuse medium|Manufacturer#2|Brand#22|PROMO BRUSHED STEEL|36|MED CAN|1316.41|accounts are abo +1416|orange black peru grey blush|Manufacturer#1|Brand#12|SMALL POLISHED TIN|21|WRAP JAR|1317.41|s. flu +1417|indian orchid tan papaya cyan|Manufacturer#4|Brand#44|MEDIUM PLATED TIN|35|LG PKG|1318.41| the express, +1418|cyan black indian lavender linen|Manufacturer#5|Brand#52|SMALL ANODIZED COPPER|31|LG DRUM|1319.41| furiously regula +1419|chiffon light burnished smoke royal|Manufacturer#1|Brand#15|LARGE POLISHED TIN|6|LG CAN|1320.41|xpress, s +1420|seashell linen midnight goldenrod magenta|Manufacturer#1|Brand#13|MEDIUM BURNISHED NICKEL|1|LG PACK|1321.42|he asymptotes. regula +1421|green thistle firebrick burnished lime|Manufacturer#1|Brand#13|ECONOMY POLISHED STEEL|39|JUMBO PACK|1322.42|egular ideas grow aft +1422|bisque floral hot burlywood khaki|Manufacturer#1|Brand#14|STANDARD POLISHED BRASS|43|MED PACK|1323.42|rays. regular +1423|cream goldenrod drab coral almond|Manufacturer#1|Brand#15|ECONOMY BRUSHED BRASS|36|WRAP PACK|1324.42|according to the r +1424|navajo metallic blue peru mint|Manufacturer#4|Brand#45|ECONOMY BURNISHED NICKEL|25|LG PACK|1325.42|ons. pinto beans w +1425|blush drab burlywood deep seashell|Manufacturer#4|Brand#42|LARGE PLATED BRASS|11|MED CAN|1326.42|xes. ironic requests u +1426|black lime azure blue dark|Manufacturer#3|Brand#32|ECONOMY PLATED STEEL|21|WRAP BOX|1327.42|long the bl +1427|thistle white sky black antique|Manufacturer#2|Brand#23|MEDIUM ANODIZED NICKEL|17|MED PKG|1328.42|carefully speci +1428|blush orange olive grey royal|Manufacturer#3|Brand#34|ECONOMY POLISHED STEEL|42|MED PKG|1329.42|ld excu +1429|green plum purple cornsilk cream|Manufacturer#2|Brand#23|SMALL PLATED BRASS|27|WRAP CAN|1330.42|sublate amo +1430|royal purple cornsilk almond hot|Manufacturer#1|Brand#12|PROMO BURNISHED TIN|33|SM PKG|1331.43|oxes. quietly ir +1431|burnished blue linen wheat hot|Manufacturer#5|Brand#52|ECONOMY BURNISHED STEEL|17|SM PACK|1332.43|ter th +1432|aquamarine metallic bisque blush cornsilk|Manufacturer#3|Brand#31|LARGE BURNISHED TIN|21|MED PKG|1333.43|st blit +1433|ghost gainsboro aquamarine black burnished|Manufacturer#1|Brand#15|ECONOMY ANODIZED BRASS|26|JUMBO PKG|1334.43|dolphins are +1434|burnished grey antique chartreuse lemon|Manufacturer#4|Brand#42|SMALL POLISHED TIN|30|JUMBO BOX|1335.43|ronic, e +1435|midnight cyan firebrick azure navajo|Manufacturer#5|Brand#52|STANDARD ANODIZED TIN|10|SM PACK|1336.43|express +1436|pink cornsilk blanched indian bisque|Manufacturer#5|Brand#54|ECONOMY ANODIZED COPPER|10|LG BAG|1337.43|sily pending inst +1437|dodger pink midnight seashell floral|Manufacturer#4|Brand#44|PROMO BURNISHED COPPER|43|JUMBO JAR|1338.43|ly even pin +1438|puff spring azure brown drab|Manufacturer#2|Brand#25|ECONOMY BRUSHED COPPER|50|MED JAR|1339.43|about the +1439|lime steel aquamarine frosted cornsilk|Manufacturer#1|Brand#15|SMALL BRUSHED STEEL|21|JUMBO CAN|1340.43|eep permanen +1440|linen chiffon goldenrod floral navajo|Manufacturer#1|Brand#14|STANDARD BRUSHED BRASS|16|WRAP CASE|1341.44|aggle. fluf +1441|seashell burnished cornflower peach maroon|Manufacturer#1|Brand#14|STANDARD ANODIZED TIN|42|JUMBO PACK|1342.44| furiously ironi +1442|frosted magenta medium honeydew turquoise|Manufacturer#1|Brand#14|SMALL POLISHED TIN|7|JUMBO PACK|1343.44|fter the ironic +1443|lavender blanched seashell peru forest|Manufacturer#2|Brand#22|PROMO POLISHED NICKEL|40|WRAP JAR|1344.44|s are. pend +1444|gainsboro floral salmon linen lace|Manufacturer#3|Brand#31|PROMO BRUSHED NICKEL|34|SM CAN|1345.44|slyly even requests. +1445|seashell puff smoke burlywood violet|Manufacturer#5|Brand#54|MEDIUM ANODIZED COPPER|42|WRAP CAN|1346.44|the ruthless +1446|green moccasin blanched seashell spring|Manufacturer#2|Brand#21|ECONOMY BRUSHED NICKEL|39|JUMBO CASE|1347.44|lar pinto beans. +1447|dim blue dodger goldenrod burlywood|Manufacturer#1|Brand#11|STANDARD ANODIZED COPPER|16|LG PACK|1348.44|n pinto beans wake a +1448|brown ivory forest firebrick grey|Manufacturer#1|Brand#15|MEDIUM POLISHED TIN|7|JUMBO CAN|1349.44|ronic foxes +1449|light burnished sandy pale lemon|Manufacturer#5|Brand#55|STANDARD PLATED NICKEL|11|SM JAR|1350.44|e slyl +1450|tomato green antique magenta navajo|Manufacturer#5|Brand#51|SMALL BRUSHED COPPER|1|WRAP PKG|1351.45|mptotes are. deposits +1451|cornsilk pink pale gainsboro orchid|Manufacturer#5|Brand#54|SMALL BURNISHED STEEL|19|WRAP DRUM|1352.45|ests sleep always f +1452|beige aquamarine slate ghost magenta|Manufacturer#3|Brand#31|MEDIUM PLATED TIN|36|JUMBO CAN|1353.45| haggle blithe +1453|orchid khaki snow ivory tan|Manufacturer#1|Brand#13|MEDIUM PLATED BRASS|16|SM CASE|1354.45|slyly according t +1454|mint purple floral grey smoke|Manufacturer#3|Brand#32|MEDIUM PLATED NICKEL|8|LG PACK|1355.45|gular ac +1455|blue magenta blush mint indian|Manufacturer#5|Brand#53|LARGE BRUSHED STEEL|42|SM PACK|1356.45|ic excuses. fl +1456|frosted cornsilk light gainsboro lace|Manufacturer#5|Brand#55|STANDARD ANODIZED NICKEL|24|JUMBO DRUM|1357.45|bout +1457|slate chartreuse indian burnished spring|Manufacturer#3|Brand#32|SMALL PLATED BRASS|6|LG PKG|1358.45| final instru +1458|brown steel firebrick cream aquamarine|Manufacturer#3|Brand#35|PROMO BRUSHED NICKEL|47|MED BOX|1359.45|denci +1459|dodger wheat white chocolate hot|Manufacturer#3|Brand#35|ECONOMY BRUSHED NICKEL|6|JUMBO CAN|1360.45|about the caref +1460|firebrick tan cream almond green|Manufacturer#4|Brand#43|SMALL PLATED TIN|43|MED CAN|1361.46|ependencies poach +1461|brown saddle plum dark black|Manufacturer#2|Brand#25|ECONOMY POLISHED STEEL|41|WRAP BOX|1362.46| blith +1462|burnished peach chartreuse pale dim|Manufacturer#1|Brand#15|MEDIUM BRUSHED COPPER|2|SM CASE|1363.46|al warhor +1463|green red cornflower royal chocolate|Manufacturer#3|Brand#34|SMALL PLATED TIN|16|LG CASE|1364.46|ong the slyly ex +1464|linen black drab seashell frosted|Manufacturer#2|Brand#22|LARGE POLISHED NICKEL|19|SM PACK|1365.46|ge quietly. furious +1465|bisque chartreuse pale red green|Manufacturer#5|Brand#55|SMALL ANODIZED STEEL|34|WRAP BOX|1366.46|special, i +1466|lemon aquamarine burnished navy light|Manufacturer#5|Brand#54|ECONOMY POLISHED BRASS|6|SM CASE|1367.46| the careful +1467|chocolate yellow navy turquoise pink|Manufacturer#1|Brand#15|LARGE PLATED NICKEL|30|MED BAG|1368.46|ecial, pen +1468|saddle brown cyan tomato puff|Manufacturer#2|Brand#22|ECONOMY BRUSHED NICKEL|27|SM JAR|1369.46|ic foxes +1469|navy spring violet orange sienna|Manufacturer#3|Brand#35|SMALL ANODIZED NICKEL|12|SM DRUM|1370.46| package +1470|lace khaki linen lawn mint|Manufacturer#5|Brand#52|LARGE BRUSHED NICKEL|19|JUMBO CASE|1371.47| to the ruthless +1471|smoke khaki deep green firebrick|Manufacturer#5|Brand#55|STANDARD ANODIZED NICKEL|38|LG JAR|1372.47| final accounts. +1472|lemon misty saddle floral honeydew|Manufacturer#2|Brand#22|LARGE ANODIZED STEEL|3|WRAP JAR|1373.47|ironic inst +1473|powder papaya ghost blush honeydew|Manufacturer#4|Brand#41|LARGE POLISHED NICKEL|26|MED BAG|1374.47|patterns slee +1474|cream aquamarine burlywood bisque black|Manufacturer#5|Brand#52|ECONOMY POLISHED STEEL|28|SM JAR|1375.47| pinto beans. c +1475|dark plum red lemon firebrick|Manufacturer#3|Brand#32|LARGE BRUSHED TIN|21|LG PKG|1376.47|ges. fluffily +1476|chartreuse lavender cornflower honeydew brown|Manufacturer#4|Brand#45|SMALL PLATED STEEL|38|LG PKG|1377.47|e blithely regular a +1477|khaki wheat puff olive medium|Manufacturer#3|Brand#33|ECONOMY ANODIZED BRASS|11|LG CAN|1378.47|final, +1478|blanched chiffon misty smoke gainsboro|Manufacturer#3|Brand#34|SMALL PLATED BRASS|50|MED JAR|1379.47|ooze fluff +1479|steel frosted royal blanched rose|Manufacturer#3|Brand#35|LARGE BURNISHED BRASS|2|SM BAG|1380.47|lar, unusual +1480|orchid white dodger almond firebrick|Manufacturer#1|Brand#12|STANDARD POLISHED COPPER|35|JUMBO PKG|1381.48| wake slyly ar +1481|royal tomato moccasin pale papaya|Manufacturer#3|Brand#31|STANDARD POLISHED STEEL|29|WRAP DRUM|1382.48| reque +1482|gainsboro white burnished cornflower burlywood|Manufacturer#4|Brand#42|MEDIUM BRUSHED BRASS|20|JUMBO PKG|1383.48|usly pendin +1483|azure sky almond aquamarine wheat|Manufacturer#2|Brand#21|ECONOMY POLISHED STEEL|44|WRAP BAG|1384.48|slyly slyly regular +1484|honeydew beige chocolate frosted khaki|Manufacturer#2|Brand#21|SMALL ANODIZED NICKEL|38|JUMBO PKG|1385.48|ar packages sleep +1485|bisque floral burlywood orange dim|Manufacturer#1|Brand#12|LARGE PLATED COPPER|46|SM BAG|1386.48|theodolites c +1486|lemon deep olive rose pink|Manufacturer#4|Brand#41|STANDARD POLISHED TIN|22|JUMBO JAR|1387.48|evenly bold p +1487|indian dodger ghost purple metallic|Manufacturer#4|Brand#45|STANDARD POLISHED COPPER|44|JUMBO BOX|1388.48|ructions detect s +1488|blush orchid rose bisque brown|Manufacturer#4|Brand#42|PROMO BRUSHED STEEL|19|MED PKG|1389.48|use furious +1489|lime chiffon rose chartreuse medium|Manufacturer#2|Brand#21|PROMO PLATED COPPER|20|MED PKG|1390.48|after the asym +1490|indian midnight violet cyan purple|Manufacturer#1|Brand#14|LARGE ANODIZED STEEL|35|LG BOX|1391.49|ly fox +1491|seashell deep navy blanched papaya|Manufacturer#1|Brand#15|ECONOMY ANODIZED COPPER|28|LG PACK|1392.49|y even theodolite +1492|floral magenta linen firebrick turquoise|Manufacturer#3|Brand#32|STANDARD POLISHED NICKEL|10|SM CASE|1393.49|ounts. +1493|spring royal blanched lavender orchid|Manufacturer#3|Brand#34|ECONOMY BRUSHED STEEL|16|SM PKG|1394.49|ccounts +1494|blue violet white papaya coral|Manufacturer#1|Brand#15|ECONOMY POLISHED TIN|47|WRAP JAR|1395.49|of the f +1495|pale brown orange red ivory|Manufacturer#5|Brand#55|SMALL POLISHED COPPER|43|SM CAN|1396.49|en foxes. +1496|lemon drab tan peach khaki|Manufacturer#3|Brand#34|MEDIUM ANODIZED TIN|20|JUMBO JAR|1397.49| wake blithely +1497|drab sky firebrick snow antique|Manufacturer#1|Brand#13|STANDARD PLATED STEEL|38|MED JAR|1398.49|. permanent re +1498|magenta cornsilk coral smoke navajo|Manufacturer#1|Brand#15|MEDIUM ANODIZED TIN|47|WRAP CASE|1399.49| silent packages wake +1499|cream green khaki cornflower purple|Manufacturer#3|Brand#32|LARGE ANODIZED STEEL|14|LG PKG|1400.49|excuses. regul +1500|midnight aquamarine blue rosy burlywood|Manufacturer#5|Brand#51|SMALL ANODIZED STEEL|4|SM JAR|1401.50|s. fluffily b +1501|brown blanched blush almond dark|Manufacturer#1|Brand#11|PROMO ANODIZED BRASS|49|WRAP CAN|1402.50|urious +1502|antique salmon light thistle plum|Manufacturer#2|Brand#25|PROMO ANODIZED STEEL|22|JUMBO CASE|1403.50| quickly ex +1503|medium grey pink bisque spring|Manufacturer#2|Brand#21|STANDARD POLISHED TIN|36|SM CAN|1404.50|d carefully slyly pen +1504|black burlywood navajo lace chartreuse|Manufacturer#2|Brand#25|LARGE PLATED STEEL|18|SM CAN|1405.50|luffi +1505|salmon pale navy antique chocolate|Manufacturer#1|Brand#13|STANDARD PLATED BRASS|5|SM CASE|1406.50|ithely final d +1506|burnished aquamarine azure cyan brown|Manufacturer#2|Brand#25|MEDIUM PLATED COPPER|41|SM BOX|1407.50|usly regular instructi +1507|navajo maroon lavender navy sandy|Manufacturer#2|Brand#24|ECONOMY PLATED TIN|13|MED JAR|1408.50|sits af +1508|azure ivory lawn lavender purple|Manufacturer#4|Brand#41|STANDARD BRUSHED NICKEL|11|LG BAG|1409.50|realms are +1509|burnished navy midnight antique spring|Manufacturer#4|Brand#42|PROMO BRUSHED TIN|40|JUMBO BAG|1410.50|e quick +1510|brown ivory peru olive hot|Manufacturer#1|Brand#11|STANDARD POLISHED TIN|1|LG DRUM|1411.51|its. quickl +1511|smoke magenta hot burlywood royal|Manufacturer#2|Brand#25|MEDIUM BRUSHED STEEL|8|JUMBO PACK|1412.51|efull +1512|frosted medium green tomato blush|Manufacturer#1|Brand#15|SMALL BURNISHED STEEL|22|JUMBO BAG|1413.51|bold theodolites hang +1513|cornflower puff light goldenrod lemon|Manufacturer#3|Brand#34|STANDARD PLATED NICKEL|28|JUMBO CAN|1414.51|y according to the do +1514|cyan firebrick burlywood honeydew dark|Manufacturer#3|Brand#32|PROMO PLATED BRASS|18|SM JAR|1415.51|tructions among t +1515|lemon ivory grey lime cornflower|Manufacturer#2|Brand#21|ECONOMY ANODIZED COPPER|25|SM CASE|1416.51|dolites are quic +1516|olive rosy pale green pink|Manufacturer#2|Brand#21|PROMO BURNISHED COPPER|7|JUMBO BAG|1417.51|ions are quickly. +1517|lime frosted burnished green rose|Manufacturer#3|Brand#32|LARGE POLISHED STEEL|43|MED BAG|1418.51|uriously regular acco +1518|linen moccasin dodger sandy lavender|Manufacturer#4|Brand#43|STANDARD ANODIZED STEEL|26|WRAP BAG|1419.51| cajole fluffily ir +1519|coral linen lemon forest tomato|Manufacturer#2|Brand#22|MEDIUM BRUSHED STEEL|4|SM PACK|1420.51|ular the +1520|peru turquoise powder cyan lace|Manufacturer#1|Brand#12|STANDARD BRUSHED STEEL|40|JUMBO BAG|1421.52|ularly agai +1521|cyan lace thistle olive lawn|Manufacturer#5|Brand#51|ECONOMY ANODIZED TIN|42|JUMBO DRUM|1422.52| ironic foxes dete +1522|cyan tan navajo magenta dim|Manufacturer#1|Brand#14|ECONOMY POLISHED COPPER|41|LG CAN|1423.52|s ideas. fo +1523|cyan yellow burlywood puff indian|Manufacturer#2|Brand#23|LARGE POLISHED COPPER|42|JUMBO DRUM|1424.52|ual, final reque +1524|red light peru lavender mint|Manufacturer#5|Brand#52|LARGE PLATED STEEL|9|SM BOX|1425.52| sleep furiousl +1525|honeydew blanched ghost lace antique|Manufacturer#2|Brand#24|ECONOMY ANODIZED BRASS|2|LG CAN|1426.52|sly. iro +1526|chiffon seashell blush lime lace|Manufacturer#1|Brand#12|LARGE ANODIZED STEEL|32|WRAP JAR|1427.52|s accounts cajole f +1527|antique royal navajo indian goldenrod|Manufacturer#5|Brand#51|ECONOMY POLISHED STEEL|15|MED BAG|1428.52|. unusual, pending pa +1528|magenta indian snow orange chocolate|Manufacturer#1|Brand#13|STANDARD POLISHED TIN|1|JUMBO CASE|1429.52|es cajole idly u +1529|deep ghost almond steel chartreuse|Manufacturer#1|Brand#15|STANDARD ANODIZED BRASS|25|SM JAR|1430.52|ts snooze +1530|forest moccasin pale lime royal|Manufacturer#5|Brand#51|SMALL ANODIZED TIN|18|SM DRUM|1431.53|ccounts boost slyly s +1531|rosy royal navy peru burlywood|Manufacturer#4|Brand#45|LARGE POLISHED COPPER|33|MED DRUM|1432.53| x-ray b +1532|royal black navy lemon chocolate|Manufacturer#2|Brand#24|SMALL PLATED TIN|10|SM PACK|1433.53|unts. c +1533|lawn peach blush midnight ghost|Manufacturer#1|Brand#12|MEDIUM PLATED TIN|48|MED PKG|1434.53|s wake carefully e +1534|ghost midnight deep grey navy|Manufacturer#2|Brand#24|MEDIUM BURNISHED TIN|48|MED PKG|1435.53|nts ar +1535|burlywood thistle royal indian chocolate|Manufacturer#3|Brand#31|LARGE BURNISHED NICKEL|5|WRAP CASE|1436.53|s. blithely unusual d +1536|brown metallic chartreuse light wheat|Manufacturer#2|Brand#24|PROMO ANODIZED BRASS|50|MED BOX|1437.53|p blithely ironic +1537|peru misty maroon metallic medium|Manufacturer#2|Brand#21|ECONOMY POLISHED STEEL|33|LG JAR|1438.53|ly regula +1538|drab cream medium coral chiffon|Manufacturer#3|Brand#35|SMALL ANODIZED STEEL|43|WRAP DRUM|1439.53| unusual +1539|olive orange wheat ghost peru|Manufacturer#5|Brand#54|SMALL POLISHED TIN|46|WRAP CASE|1440.53|y furiou +1540|mint brown royal peru yellow|Manufacturer#5|Brand#52|STANDARD POLISHED STEEL|2|SM PKG|1441.54|ts nag acros +1541|medium sandy moccasin cyan aquamarine|Manufacturer#4|Brand#44|LARGE BURNISHED COPPER|11|WRAP DRUM|1442.54|fter the carefully +1542|powder goldenrod misty olive wheat|Manufacturer#3|Brand#31|ECONOMY BURNISHED COPPER|21|MED JAR|1443.54|gular +1543|drab violet azure grey ivory|Manufacturer#4|Brand#45|STANDARD BURNISHED NICKEL|1|WRAP DRUM|1444.54| are slyly; q +1544|lawn blush beige chiffon antique|Manufacturer#5|Brand#51|LARGE BURNISHED STEEL|28|SM PKG|1445.54|sly pinto b +1545|maroon powder chartreuse black sandy|Manufacturer#5|Brand#54|MEDIUM BURNISHED BRASS|41|MED CASE|1446.54|furiousl +1546|black maroon medium burlywood dodger|Manufacturer#4|Brand#43|ECONOMY PLATED TIN|19|JUMBO CASE|1447.54|express depend +1547|tan plum light linen orange|Manufacturer#2|Brand#23|STANDARD PLATED TIN|19|LG CAN|1448.54|he carefu +1548|grey steel indian midnight cyan|Manufacturer#5|Brand#52|STANDARD POLISHED BRASS|39|JUMBO CASE|1449.54| of the +1549|misty snow powder hot dark|Manufacturer#2|Brand#22|SMALL POLISHED COPPER|38|MED CASE|1450.54|. carefully fi +1550|frosted cornsilk spring papaya bisque|Manufacturer#2|Brand#24|MEDIUM POLISHED BRASS|42|LG PKG|1451.55|c deposit +1551|red turquoise maroon lime green|Manufacturer#2|Brand#25|MEDIUM BRUSHED COPPER|39|WRAP JAR|1452.55|s. blithely +1552|chocolate chiffon cream orchid dim|Manufacturer#4|Brand#41|SMALL POLISHED TIN|10|WRAP CASE|1453.55|onic deposits +1553|rose wheat floral maroon spring|Manufacturer#5|Brand#53|LARGE BRUSHED COPPER|21|JUMBO BAG|1454.55|heodol +1554|powder medium navajo peru seashell|Manufacturer#4|Brand#44|MEDIUM PLATED COPPER|14|MED DRUM|1455.55|sly eve +1555|medium cornsilk lavender royal burnished|Manufacturer#3|Brand#35|LARGE BURNISHED STEEL|6|LG PKG|1456.55| final packages. +1556|misty lemon midnight bisque magenta|Manufacturer#4|Brand#42|ECONOMY BURNISHED BRASS|17|SM PKG|1457.55| carefully after +1557|white firebrick beige sky coral|Manufacturer#3|Brand#35|STANDARD ANODIZED NICKEL|4|SM PACK|1458.55|s detect. furiously +1558|cream peach orchid light moccasin|Manufacturer#1|Brand#11|SMALL BURNISHED COPPER|39|LG CASE|1459.55|ns haggl +1559|white dark smoke almond sienna|Manufacturer#1|Brand#14|STANDARD ANODIZED TIN|1|MED BOX|1460.55|ar acc +1560|indian chocolate navy royal powder|Manufacturer#5|Brand#52|SMALL ANODIZED NICKEL|36|WRAP DRUM|1461.56|uriously quiet +1561|white burlywood midnight medium purple|Manufacturer#3|Brand#33|SMALL PLATED COPPER|7|WRAP JAR|1462.56| regular ins +1562|dim spring lavender salmon linen|Manufacturer#5|Brand#54|MEDIUM BURNISHED STEEL|3|MED CASE|1463.56|hely brave multipliers +1563|lemon puff aquamarine orange magenta|Manufacturer#5|Brand#53|ECONOMY BRUSHED BRASS|5|MED CAN|1464.56|olites. blit +1564|blush ghost deep snow aquamarine|Manufacturer#2|Brand#21|ECONOMY PLATED BRASS|41|JUMBO BAG|1465.56| pinto beans against t +1565|blush misty coral black royal|Manufacturer#4|Brand#41|STANDARD PLATED TIN|49|MED PACK|1466.56|riously even foxe +1566|peach moccasin firebrick lime burnished|Manufacturer#5|Brand#55|LARGE BURNISHED STEEL|46|JUMBO BOX|1467.56|maintain +1567|green plum orchid rose bisque|Manufacturer#3|Brand#35|STANDARD ANODIZED STEEL|35|WRAP PKG|1468.56|t sly +1568|burlywood navy white yellow blanched|Manufacturer#5|Brand#51|MEDIUM POLISHED STEEL|27|MED CASE|1469.56|nstructions are +1569|lawn cream ivory black magenta|Manufacturer#1|Brand#13|PROMO BURNISHED TIN|1|LG PACK|1470.56|ts wake carefully. ca +1570|hot brown lavender chartreuse steel|Manufacturer#1|Brand#15|LARGE BURNISHED STEEL|41|LG CASE|1471.57|latelets breach abo +1571|grey aquamarine dim deep navajo|Manufacturer#5|Brand#52|STANDARD ANODIZED BRASS|22|MED BOX|1472.57|uctions. finally regul +1572|lemon metallic blue midnight bisque|Manufacturer#4|Brand#45|ECONOMY POLISHED COPPER|50|LG JAR|1473.57|riously ironic pinto +1573|burlywood chiffon purple mint powder|Manufacturer#5|Brand#52|ECONOMY ANODIZED COPPER|36|WRAP PACK|1474.57|theodolites. silent p +1574|antique white cream moccasin sienna|Manufacturer#1|Brand#13|PROMO BRUSHED BRASS|27|MED CASE|1475.57|pinto +1575|sienna bisque navajo rose almond|Manufacturer#3|Brand#32|LARGE BURNISHED BRASS|47|LG PKG|1476.57|ts sn +1576|magenta lawn saddle blush midnight|Manufacturer#2|Brand#24|LARGE BURNISHED STEEL|21|SM CASE|1477.57|entiments. ir +1577|cornflower metallic light indian steel|Manufacturer#5|Brand#55|SMALL BRUSHED BRASS|35|JUMBO CAN|1478.57|nts. ex +1578|yellow drab forest lime indian|Manufacturer#1|Brand#13|MEDIUM PLATED STEEL|47|MED CASE|1479.57|al, final excuses wak +1579|chocolate mint white peru blush|Manufacturer#2|Brand#24|LARGE PLATED STEEL|25|JUMBO BAG|1480.57| express accou +1580|burlywood lace khaki smoke honeydew|Manufacturer#3|Brand#32|SMALL PLATED COPPER|26|LG DRUM|1481.58|totes. furious, speci +1581|lace white thistle metallic sandy|Manufacturer#5|Brand#55|MEDIUM ANODIZED TIN|7|SM BOX|1482.58| sleep slyly +1582|dark firebrick beige dim hot|Manufacturer#3|Brand#35|MEDIUM BRUSHED COPPER|42|JUMBO CASE|1483.58| pinto beans. spe +1583|cream dark tan blue brown|Manufacturer#1|Brand#12|ECONOMY POLISHED STEEL|50|SM JAR|1484.58| cajole fluffily +1584|ghost lavender rose black cornflower|Manufacturer#4|Brand#44|MEDIUM PLATED STEEL|6|MED DRUM|1485.58|l, pending +1585|seashell deep smoke honeydew ivory|Manufacturer#4|Brand#43|STANDARD BRUSHED COPPER|20|WRAP BAG|1486.58|etimes regular +1586|drab cyan midnight magenta burnished|Manufacturer#4|Brand#41|STANDARD BRUSHED TIN|45|JUMBO CASE|1487.58|refully regu +1587|sky ivory bisque medium metallic|Manufacturer#1|Brand#13|PROMO PLATED TIN|19|MED JAR|1488.58|xcuses are b +1588|maroon dodger drab wheat hot|Manufacturer#5|Brand#55|ECONOMY BURNISHED TIN|6|SM PACK|1489.58|heodolites +1589|cornflower rosy black deep chocolate|Manufacturer#1|Brand#14|LARGE BRUSHED NICKEL|7|JUMBO BAG|1490.58| even packag +1590|linen pink blush ghost chiffon|Manufacturer#5|Brand#53|PROMO BRUSHED STEEL|12|MED JAR|1491.59|tes hinder against +1591|sky midnight medium sandy ghost|Manufacturer#2|Brand#23|LARGE POLISHED TIN|42|JUMBO JAR|1492.59|lar requests +1592|brown pink black blush blue|Manufacturer#3|Brand#31|SMALL ANODIZED COPPER|45|JUMBO BAG|1493.59|urts aroun +1593|rosy dodger lime chartreuse slate|Manufacturer#4|Brand#44|ECONOMY ANODIZED COPPER|1|LG JAR|1494.59|s? instructions hagg +1594|cream ghost tan grey sky|Manufacturer#4|Brand#42|ECONOMY BURNISHED BRASS|16|WRAP CAN|1495.59|ealthi +1595|almond lavender gainsboro aquamarine cyan|Manufacturer#5|Brand#52|MEDIUM PLATED BRASS|48|SM CASE|1496.59|sts. carefully specia +1596|steel aquamarine peach navajo chiffon|Manufacturer#4|Brand#43|MEDIUM ANODIZED COPPER|20|MED CASE|1497.59|bravely regula +1597|burnished forest snow dark chartreuse|Manufacturer#5|Brand#55|SMALL ANODIZED BRASS|1|LG PKG|1498.59|efully pending +1598|lavender chiffon chocolate tan grey|Manufacturer#1|Brand#12|ECONOMY BURNISHED COPPER|45|LG BAG|1499.59|ly along the quick +1599|grey deep bisque ivory black|Manufacturer#5|Brand#55|PROMO BURNISHED NICKEL|12|MED JAR|1500.59|slyly final +1600|blanched ivory deep cream snow|Manufacturer#2|Brand#21|STANDARD PLATED COPPER|21|LG DRUM|1501.60|uld sleep +1601|turquoise moccasin ivory forest chiffon|Manufacturer#3|Brand#34|SMALL POLISHED STEEL|29|MED DRUM|1502.60|ngside of the furiou +1602|lace grey orchid peru olive|Manufacturer#5|Brand#51|SMALL POLISHED STEEL|49|JUMBO PACK|1503.60|special theodolites +1603|wheat blush metallic ivory turquoise|Manufacturer#4|Brand#43|LARGE POLISHED TIN|45|LG DRUM|1504.60|accou +1604|linen sandy indian moccasin salmon|Manufacturer#2|Brand#25|LARGE PLATED TIN|6|SM DRUM|1505.60|ve the fur +1605|beige floral pale dodger firebrick|Manufacturer#1|Brand#13|PROMO POLISHED NICKEL|37|JUMBO PKG|1506.60|ns will are +1606|honeydew wheat grey orange metallic|Manufacturer#5|Brand#53|LARGE ANODIZED NICKEL|32|SM CAN|1507.60|ets. careful +1607|drab orange sky steel cornflower|Manufacturer#2|Brand#23|SMALL BRUSHED BRASS|30|JUMBO CAN|1508.60|ly even instructi +1608|khaki dark burnished cyan saddle|Manufacturer#3|Brand#31|MEDIUM BURNISHED COPPER|3|SM CASE|1509.60|le quickly special i +1609|navajo cream khaki moccasin antique|Manufacturer#2|Brand#24|ECONOMY BURNISHED BRASS|34|WRAP CAN|1510.60|nts boost accor +1610|magenta lace blue honeydew cream|Manufacturer#2|Brand#24|SMALL BURNISHED NICKEL|29|JUMBO CAN|1511.61| against the even +1611|cornsilk lawn cyan drab firebrick|Manufacturer#5|Brand#51|LARGE BRUSHED BRASS|1|WRAP CASE|1512.61|tructions. furiously +1612|black drab moccasin smoke blanched|Manufacturer#2|Brand#21|ECONOMY BURNISHED TIN|29|LG CASE|1513.61|ccounts. special, slo +1613|bisque deep floral chiffon almond|Manufacturer#4|Brand#44|STANDARD PLATED COPPER|28|MED CASE|1514.61|structions wak +1614|papaya navy plum slate sandy|Manufacturer#2|Brand#23|ECONOMY BURNISHED STEEL|2|LG PKG|1515.61|fily carefully final +1615|violet ghost dim gainsboro coral|Manufacturer#3|Brand#32|STANDARD BURNISHED NICKEL|29|JUMBO JAR|1516.61|ly even pinto beans c +1616|royal tomato drab powder lime|Manufacturer#3|Brand#33|MEDIUM POLISHED TIN|48|SM CAN|1517.61|he fl +1617|dodger green almond misty lavender|Manufacturer#4|Brand#43|LARGE POLISHED BRASS|44|WRAP CASE|1518.61|the unusual +1618|thistle frosted cornsilk peru yellow|Manufacturer#4|Brand#45|STANDARD ANODIZED NICKEL|9|WRAP PACK|1519.61| blit +1619|sandy coral blush seashell powder|Manufacturer#1|Brand#11|MEDIUM PLATED BRASS|12|LG PKG|1520.61|unts +1620|black medium antique navy steel|Manufacturer#5|Brand#54|LARGE BURNISHED TIN|42|SM PACK|1521.62|refully even +1621|burnished lemon sandy sienna cornflower|Manufacturer#2|Brand#23|PROMO ANODIZED TIN|17|JUMBO PACK|1522.62|against the qu +1622|burnished olive azure moccasin thistle|Manufacturer#3|Brand#33|SMALL ANODIZED COPPER|10|MED CASE|1523.62|s poach +1623|blue navy forest almond misty|Manufacturer#5|Brand#51|ECONOMY PLATED NICKEL|49|WRAP DRUM|1524.62|s haggle quickly +1624|dark lavender gainsboro sandy purple|Manufacturer#4|Brand#44|LARGE ANODIZED BRASS|19|LG PKG|1525.62|y slyly thin fo +1625|orange pale honeydew rose sandy|Manufacturer#4|Brand#44|SMALL PLATED TIN|43|MED DRUM|1526.62|encies. pending excuse +1626|lavender smoke black dark white|Manufacturer#4|Brand#45|ECONOMY PLATED TIN|34|MED DRUM|1527.62|owly ironic inst +1627|lawn ghost yellow plum brown|Manufacturer#3|Brand#33|MEDIUM BRUSHED STEEL|13|SM DRUM|1528.62|ly silent instructio +1628|khaki smoke powder plum tan|Manufacturer#3|Brand#31|MEDIUM BURNISHED COPPER|40|JUMBO PKG|1529.62|n requests. bo +1629|smoke royal cornflower spring powder|Manufacturer#2|Brand#25|MEDIUM BRUSHED NICKEL|10|WRAP PACK|1530.62|ar pa +1630|orchid brown frosted sandy slate|Manufacturer#4|Brand#45|PROMO POLISHED BRASS|3|MED DRUM|1531.63|nic theodolites. sile +1631|aquamarine lavender forest plum coral|Manufacturer#2|Brand#23|SMALL BURNISHED COPPER|49|JUMBO PACK|1532.63|inal package +1632|beige cornsilk cornflower lawn indian|Manufacturer#4|Brand#43|STANDARD PLATED COPPER|4|SM PACK|1533.63|ironic reques +1633|honeydew mint indian antique khaki|Manufacturer#3|Brand#35|MEDIUM BRUSHED STEEL|33|WRAP BOX|1534.63|its do use +1634|blush lawn thistle slate lime|Manufacturer#2|Brand#21|ECONOMY PLATED BRASS|15|LG CAN|1535.63|ven attainment +1635|smoke peru black red coral|Manufacturer#2|Brand#23|LARGE PLATED NICKEL|34|SM DRUM|1536.63|nal pe +1636|linen blanched drab ivory turquoise|Manufacturer#2|Brand#22|PROMO PLATED STEEL|50|SM PACK|1537.63|ang carefully +1637|dim goldenrod burlywood floral medium|Manufacturer#4|Brand#42|PROMO BRUSHED BRASS|48|LG DRUM|1538.63|play. carefully dari +1638|lavender navy dark saddle misty|Manufacturer#5|Brand#51|LARGE PLATED COPPER|35|WRAP BAG|1539.63|gular pack +1639|sienna goldenrod yellow black ivory|Manufacturer#4|Brand#41|MEDIUM BRUSHED COPPER|5|SM PACK|1540.63|cial theodolites are a +1640|metallic burlywood light peach khaki|Manufacturer#5|Brand#51|MEDIUM ANODIZED STEEL|2|WRAP BAG|1541.64| ironic orb +1641|navajo forest blue white moccasin|Manufacturer#1|Brand#12|MEDIUM PLATED BRASS|21|LG DRUM|1542.64|eas are furiously +1642|floral navajo aquamarine coral rose|Manufacturer#5|Brand#52|SMALL BURNISHED STEEL|47|JUMBO BOX|1543.64|ong th +1643|dark purple chocolate moccasin peru|Manufacturer#1|Brand#13|LARGE ANODIZED TIN|19|JUMBO CASE|1544.64|ironic pinto beans are +1644|blue chiffon burlywood steel pale|Manufacturer#3|Brand#31|PROMO PLATED STEEL|38|MED PACK|1545.64| silent p +1645|orchid moccasin burlywood forest aquamarine|Manufacturer#1|Brand#14|STANDARD BRUSHED COPPER|41|JUMBO JAR|1546.64|kly according to th +1646|khaki smoke tan dark burnished|Manufacturer#4|Brand#43|PROMO ANODIZED STEEL|11|SM DRUM|1547.64| cajole furio +1647|plum lime chiffon forest azure|Manufacturer#1|Brand#14|STANDARD POLISHED TIN|38|SM CAN|1548.64|arefull +1648|dark light cream cornsilk antique|Manufacturer#4|Brand#42|LARGE POLISHED BRASS|13|WRAP BAG|1549.64|sits h +1649|red coral saddle deep wheat|Manufacturer#5|Brand#54|LARGE ANODIZED BRASS|49|MED CASE|1550.64|ometimes +1650|lawn powder cyan peach saddle|Manufacturer#1|Brand#15|STANDARD POLISHED STEEL|34|WRAP PACK|1551.65|y ironic asym +1651|navy dodger lace burnished hot|Manufacturer#3|Brand#32|LARGE ANODIZED NICKEL|33|JUMBO DRUM|1552.65| foxes. even ex +1652|slate almond brown drab violet|Manufacturer#1|Brand#12|PROMO BRUSHED STEEL|20|JUMBO BOX|1553.65| furiously +1653|medium chiffon coral frosted sky|Manufacturer#3|Brand#35|STANDARD BURNISHED NICKEL|27|LG PACK|1554.65| epitaphs use. pac +1654|tomato indian papaya bisque rosy|Manufacturer#2|Brand#22|SMALL BURNISHED TIN|2|LG JAR|1555.65|cies. carefully specia +1655|sienna beige violet azure maroon|Manufacturer#3|Brand#35|MEDIUM BRUSHED COPPER|6|SM CASE|1556.65|ctions affix fur +1656|navajo deep goldenrod forest powder|Manufacturer#2|Brand#22|PROMO POLISHED BRASS|7|JUMBO JAR|1557.65|y requests? furiou +1657|navajo aquamarine sky smoke chiffon|Manufacturer#3|Brand#33|PROMO PLATED TIN|17|WRAP CASE|1558.65|ing to the furious +1658|papaya dodger cyan wheat lace|Manufacturer#3|Brand#34|MEDIUM BURNISHED TIN|20|SM BAG|1559.65|al depo +1659|peru cyan goldenrod khaki indian|Manufacturer#5|Brand#55|PROMO BURNISHED STEEL|14|SM CAN|1560.65|hithout the blithely e +1660|lemon ivory brown dim orchid|Manufacturer#4|Brand#45|MEDIUM BRUSHED NICKEL|38|SM CASE|1561.66|ideas. carefully fi +1661|lace burlywood drab blanched steel|Manufacturer#3|Brand#34|ECONOMY ANODIZED COPPER|41|SM PKG|1562.66|fluffily final account +1662|black lime papaya goldenrod dodger|Manufacturer#1|Brand#11|ECONOMY BRUSHED STEEL|34|MED PKG|1563.66| impress furiou +1663|yellow blanched lace blue green|Manufacturer#2|Brand#23|PROMO ANODIZED COPPER|2|WRAP PACK|1564.66| instructions. +1664|antique midnight honeydew red metallic|Manufacturer#2|Brand#22|SMALL ANODIZED BRASS|31|MED CASE|1565.66|xpress Tiresia +1665|seashell almond spring goldenrod blush|Manufacturer#4|Brand#45|STANDARD BURNISHED BRASS|27|WRAP DRUM|1566.66|sts after the +1666|violet peach snow midnight maroon|Manufacturer#3|Brand#35|LARGE PLATED BRASS|24|WRAP PKG|1567.66|egular instructions. +1667|pale drab dodger orchid violet|Manufacturer#3|Brand#34|SMALL ANODIZED STEEL|23|LG BAG|1568.66|er the blithely f +1668|indian aquamarine forest sandy light|Manufacturer#2|Brand#25|PROMO PLATED COPPER|33|LG CAN|1569.66|lyly re +1669|purple khaki thistle steel dodger|Manufacturer#1|Brand#12|SMALL ANODIZED BRASS|39|LG JAR|1570.66|al gifts. expres +1670|black navy antique cream olive|Manufacturer#1|Brand#14|MEDIUM POLISHED TIN|49|WRAP CASE|1571.67|ess packages sleep. bo +1671|midnight burlywood lemon puff plum|Manufacturer#2|Brand#25|PROMO ANODIZED COPPER|28|SM PACK|1572.67|ronic +1672|blue linen slate white ivory|Manufacturer#5|Brand#52|LARGE ANODIZED STEEL|41|MED CAN|1573.67|. pint +1673|orange dodger burnished linen ghost|Manufacturer#2|Brand#22|MEDIUM ANODIZED TIN|7|MED PACK|1574.67|nal theodolites. q +1674|chocolate saddle lawn aquamarine cream|Manufacturer#1|Brand#13|MEDIUM PLATED STEEL|38|MED BAG|1575.67| beans. fl +1675|lawn orchid cornsilk spring lemon|Manufacturer#3|Brand#32|SMALL POLISHED TIN|45|MED PACK|1576.67|eans nag across +1676|bisque lavender brown powder floral|Manufacturer#4|Brand#45|MEDIUM BURNISHED BRASS|33|SM JAR|1577.67|en ideas. bo +1677|salmon hot blush tomato snow|Manufacturer#3|Brand#32|MEDIUM BURNISHED COPPER|44|LG BOX|1578.67|unts. regular, regu +1678|steel khaki dark peach metallic|Manufacturer#1|Brand#15|SMALL BRUSHED STEEL|20|SM DRUM|1579.67|al ideas. slyly unus +1679|white blanched steel rosy plum|Manufacturer#3|Brand#34|MEDIUM POLISHED COPPER|38|JUMBO PKG|1580.67|ites. blithely i +1680|pink yellow blanched ghost navy|Manufacturer#2|Brand#24|PROMO PLATED BRASS|18|SM BAG|1581.68|sly! regular decoys h +1681|pink azure plum ghost lemon|Manufacturer#1|Brand#15|PROMO BRUSHED NICKEL|18|JUMBO CAN|1582.68|y caref +1682|lavender midnight bisque coral purple|Manufacturer#3|Brand#31|SMALL ANODIZED COPPER|3|WRAP CASE|1583.68|. regula +1683|spring misty steel thistle cyan|Manufacturer#1|Brand#12|PROMO BRUSHED STEEL|34|LG BOX|1584.68|ng dependencie +1684|burnished blush steel violet forest|Manufacturer#2|Brand#23|LARGE BRUSHED NICKEL|26|LG JAR|1585.68| the express, re +1685|blanched lawn slate dim honeydew|Manufacturer#3|Brand#34|ECONOMY BRUSHED COPPER|48|MED JAR|1586.68|ly regular exc +1686|blue smoke blush tomato lavender|Manufacturer#2|Brand#21|MEDIUM BURNISHED STEEL|23|SM BAG|1587.68|y final accounts +1687|chiffon light steel lime lavender|Manufacturer#5|Brand#54|STANDARD POLISHED NICKEL|6|JUMBO PKG|1588.68|carefully b +1688|olive blush papaya magenta burnished|Manufacturer#5|Brand#54|ECONOMY POLISHED NICKEL|22|MED JAR|1589.68|pendencies. regular +1689|plum violet beige antique rosy|Manufacturer#2|Brand#22|LARGE BURNISHED STEEL|7|SM JAR|1590.68|efully r +1690|hot yellow navajo salmon dim|Manufacturer#3|Brand#33|SMALL POLISHED NICKEL|34|JUMBO CASE|1591.69| nag blithely blithe +1691|cyan honeydew mint lace lavender|Manufacturer#5|Brand#55|PROMO BURNISHED BRASS|12|SM BOX|1592.69|regular deposits a +1692|green drab maroon almond dim|Manufacturer#5|Brand#52|SMALL BRUSHED TIN|31|MED DRUM|1593.69|ites. even accou +1693|seashell cornflower rose tomato dodger|Manufacturer#2|Brand#21|LARGE BRUSHED BRASS|27|MED PKG|1594.69|ly th +1694|sky brown azure royal seashell|Manufacturer#3|Brand#31|STANDARD BURNISHED NICKEL|33|WRAP BAG|1595.69|refully. qu +1695|linen magenta almond saddle pink|Manufacturer#3|Brand#35|PROMO POLISHED BRASS|28|SM CAN|1596.69|slyly eve +1696|black firebrick antique sandy orange|Manufacturer#1|Brand#11|SMALL PLATED COPPER|46|SM DRUM|1597.69|ual deposit +1697|midnight green tomato linen blanched|Manufacturer#3|Brand#35|LARGE BURNISHED STEEL|44|WRAP BOX|1598.69|furiously bold deposi +1698|purple bisque burlywood thistle cream|Manufacturer#3|Brand#33|PROMO BRUSHED BRASS|30|MED PACK|1599.69| carefully express ins +1699|tan coral gainsboro dodger bisque|Manufacturer#4|Brand#44|ECONOMY BRUSHED STEEL|26|LG BOX|1600.69|s along +1700|blush dodger coral chiffon black|Manufacturer#1|Brand#12|ECONOMY PLATED NICKEL|27|MED JAR|1601.70| ironic pinto bean +1701|navy blanched deep goldenrod black|Manufacturer#2|Brand#22|STANDARD PLATED COPPER|20|JUMBO BOX|1602.70|ully. deposit +1702|indian coral seashell drab frosted|Manufacturer#1|Brand#13|MEDIUM BRUSHED NICKEL|26|MED CASE|1603.70| even, final packa +1703|azure goldenrod blanched rosy almond|Manufacturer#2|Brand#22|ECONOMY PLATED BRASS|40|LG DRUM|1604.70|c requests! bl +1704|cornsilk honeydew thistle seashell floral|Manufacturer#2|Brand#24|SMALL BURNISHED NICKEL|48|JUMBO CASE|1605.70|sits. even, speci +1705|floral lawn forest rosy plum|Manufacturer#2|Brand#25|PROMO BURNISHED STEEL|18|WRAP PACK|1606.70|uriously final pint +1706|mint green papaya burnished tomato|Manufacturer#1|Brand#13|ECONOMY BRUSHED BRASS|7|JUMBO PKG|1607.70|riously regul +1707|misty goldenrod sienna plum hot|Manufacturer#5|Brand#51|LARGE POLISHED NICKEL|46|WRAP BAG|1608.70|the even packag +1708|frosted blue red sienna black|Manufacturer#2|Brand#21|ECONOMY BRUSHED COPPER|30|MED PACK|1609.70|press, +1709|azure rosy dodger violet aquamarine|Manufacturer#5|Brand#55|LARGE ANODIZED COPPER|7|SM PACK|1610.70|s the r +1710|orange khaki olive navajo steel|Manufacturer#4|Brand#43|PROMO BURNISHED STEEL|3|JUMBO BOX|1611.71|ainst the de +1711|gainsboro burlywood sandy blue indian|Manufacturer#5|Brand#55|MEDIUM BRUSHED TIN|45|LG BAG|1612.71|r accounts +1712|puff pink saddle slate aquamarine|Manufacturer#2|Brand#25|LARGE POLISHED STEEL|1|JUMBO CASE|1613.71|s, ironic patterns +1713|blanched maroon red cream brown|Manufacturer#2|Brand#24|PROMO BRUSHED STEEL|12|WRAP PACK|1614.71|y regular foxes. +1714|azure ivory sienna gainsboro salmon|Manufacturer#3|Brand#31|MEDIUM POLISHED TIN|44|MED CAN|1615.71|iously quickl +1715|cream chartreuse hot white floral|Manufacturer#4|Brand#44|ECONOMY PLATED COPPER|37|LG CASE|1616.71|carefully along +1716|bisque dim lawn navy tomato|Manufacturer#3|Brand#32|SMALL BRUSHED COPPER|12|WRAP DRUM|1617.71|sly ir +1717|goldenrod forest dodger cornflower dark|Manufacturer#3|Brand#33|SMALL BURNISHED TIN|21|MED JAR|1618.71|ornis are blit +1718|thistle dark forest yellow tan|Manufacturer#2|Brand#24|STANDARD POLISHED NICKEL|14|WRAP JAR|1619.71|sts. quickly pending +1719|cyan ivory snow peru antique|Manufacturer#5|Brand#52|ECONOMY POLISHED NICKEL|29|JUMBO JAR|1620.71|te blithely +1720|rosy white cornflower green forest|Manufacturer#3|Brand#35|ECONOMY ANODIZED NICKEL|1|WRAP CASE|1621.72|d, silen +1721|spring pale moccasin orange cyan|Manufacturer#1|Brand#15|ECONOMY BURNISHED STEEL|39|SM PACK|1622.72|nt, pen +1722|steel antique gainsboro forest chartreuse|Manufacturer#5|Brand#55|STANDARD PLATED TIN|44|WRAP CAN|1623.72|pecial request +1723|wheat chiffon ghost slate green|Manufacturer#5|Brand#55|LARGE BRUSHED TIN|50|WRAP PACK|1624.72| requests. sly +1724|dim thistle deep steel white|Manufacturer#3|Brand#33|ECONOMY PLATED STEEL|34|WRAP CASE|1625.72|en theod +1725|magenta honeydew goldenrod lime burlywood|Manufacturer#5|Brand#51|STANDARD ANODIZED BRASS|22|LG CAN|1626.72|en foxes. slyl +1726|navy deep midnight chartreuse drab|Manufacturer#3|Brand#35|LARGE PLATED COPPER|28|JUMBO JAR|1627.72|ickly furious +1727|plum powder hot misty lemon|Manufacturer#3|Brand#33|SMALL PLATED BRASS|6|WRAP CAN|1628.72|es. final deposits try +1728|steel dim frosted cornsilk rose|Manufacturer#5|Brand#55|SMALL POLISHED BRASS|10|LG PACK|1629.72|s wake slyly. sly +1729|burnished grey midnight pink sky|Manufacturer#3|Brand#33|SMALL BRUSHED COPPER|17|WRAP BAG|1630.72|urts ha +1730|gainsboro maroon black cornsilk coral|Manufacturer#1|Brand#13|ECONOMY BRUSHED COPPER|47|MED PACK|1631.73|l accou +1731|beige lawn firebrick rosy pink|Manufacturer#3|Brand#32|ECONOMY PLATED STEEL|40|MED DRUM|1632.73|ealthily regular +1732|drab tan white orange cyan|Manufacturer#1|Brand#15|LARGE BURNISHED COPPER|6|LG DRUM|1633.73|arefully final the +1733|honeydew burlywood green lemon firebrick|Manufacturer#3|Brand#33|STANDARD PLATED NICKEL|8|WRAP DRUM|1634.73|efully regular +1734|rosy peru steel white chocolate|Manufacturer#5|Brand#54|PROMO POLISHED NICKEL|42|LG CASE|1635.73|usly regular shea +1735|linen chartreuse peru drab puff|Manufacturer#4|Brand#44|STANDARD PLATED TIN|7|JUMBO JAR|1636.73|ests. +1736|firebrick gainsboro olive dodger tomato|Manufacturer#2|Brand#24|ECONOMY POLISHED NICKEL|38|SM PKG|1637.73|ggle against +1737|violet beige misty midnight green|Manufacturer#3|Brand#32|ECONOMY POLISHED BRASS|29|WRAP PKG|1638.73| furiously. f +1738|azure blush linen brown chartreuse|Manufacturer#5|Brand#52|LARGE ANODIZED NICKEL|4|WRAP CAN|1639.73|the special, final +1739|honeydew cream sienna dodger deep|Manufacturer#2|Brand#24|MEDIUM BURNISHED COPPER|47|JUMBO BOX|1640.73|orses. fluffily i +1740|peach misty burnished maroon snow|Manufacturer#2|Brand#21|STANDARD BURNISHED TIN|16|WRAP CAN|1641.74|. special acco +1741|bisque green medium seashell pale|Manufacturer#5|Brand#52|SMALL ANODIZED STEEL|9|JUMBO BAG|1642.74|ions. furiously +1742|powder blue forest black blush|Manufacturer#5|Brand#54|STANDARD BURNISHED BRASS|43|WRAP DRUM|1643.74|ely along the furiousl +1743|blue dark khaki azure navy|Manufacturer#3|Brand#31|LARGE PLATED STEEL|30|JUMBO JAR|1644.74|r accounts +1744|cream lavender almond sienna rosy|Manufacturer#2|Brand#24|LARGE POLISHED BRASS|27|JUMBO BOX|1645.74|es. accounts +1745|burnished aquamarine plum saddle indian|Manufacturer#3|Brand#31|SMALL BURNISHED COPPER|24|MED PKG|1646.74|uriously +1746|forest lime burlywood lawn gainsboro|Manufacturer#1|Brand#13|MEDIUM POLISHED NICKEL|37|WRAP DRUM|1647.74| pinto beans. +1747|moccasin peru lawn chartreuse seashell|Manufacturer#5|Brand#55|SMALL BURNISHED COPPER|28|LG CAN|1648.74|nto b +1748|mint orange lavender lime ivory|Manufacturer#4|Brand#45|ECONOMY POLISHED STEEL|34|JUMBO CAN|1649.74|ounts sleep accordin +1749|burnished turquoise slate orange firebrick|Manufacturer#3|Brand#32|LARGE BURNISHED COPPER|29|MED CASE|1650.74|lthily final acco +1750|red pink grey linen dark|Manufacturer#2|Brand#23|SMALL PLATED NICKEL|44|JUMBO BAG|1651.75|arefully express +1751|papaya chiffon chartreuse burnished metallic|Manufacturer#2|Brand#21|ECONOMY PLATED COPPER|24|SM CASE|1652.75|ously ato +1752|burnished cream snow burlywood smoke|Manufacturer#1|Brand#11|PROMO BRUSHED NICKEL|22|SM PACK|1653.75|riously +1753|misty goldenrod gainsboro thistle almond|Manufacturer#2|Brand#24|ECONOMY POLISHED TIN|50|MED PACK|1654.75|y ironic bra +1754|azure coral dark hot khaki|Manufacturer#1|Brand#11|LARGE BURNISHED NICKEL|39|LG CASE|1655.75|inst the slyly +1755|lime orchid forest cyan white|Manufacturer#4|Brand#41|ECONOMY PLATED STEEL|43|LG PACK|1656.75|e slyly even dugou +1756|ivory sienna metallic salmon tan|Manufacturer#5|Brand#52|ECONOMY POLISHED COPPER|10|WRAP CASE|1657.75|beans. ideas wa +1757|dark khaki violet lace dodger|Manufacturer#4|Brand#43|ECONOMY BRUSHED BRASS|33|SM DRUM|1658.75|e furiously re +1758|navy white maroon almond misty|Manufacturer#1|Brand#13|PROMO ANODIZED NICKEL|39|MED DRUM|1659.75|ccounts! +1759|antique spring brown orange violet|Manufacturer#1|Brand#15|PROMO POLISHED TIN|43|SM BAG|1660.75|ular foxes +1760|floral metallic honeydew chiffon sienna|Manufacturer#2|Brand#22|STANDARD PLATED NICKEL|3|LG BOX|1661.76|ind s +1761|lace blush wheat powder medium|Manufacturer#4|Brand#41|STANDARD ANODIZED BRASS|42|SM JAR|1662.76|cross the regul +1762|cornflower chocolate blanched smoke slate|Manufacturer#3|Brand#34|SMALL BURNISHED COPPER|7|SM DRUM|1663.76|ages n +1763|blush floral chocolate powder misty|Manufacturer#2|Brand#22|LARGE BURNISHED TIN|36|SM BAG|1664.76|fter the special, re +1764|frosted hot chocolate chiffon dim|Manufacturer#5|Brand#51|SMALL BRUSHED TIN|13|JUMBO BAG|1665.76|hogs use across +1765|sienna gainsboro frosted violet red|Manufacturer#2|Brand#24|PROMO ANODIZED STEEL|50|JUMBO DRUM|1666.76|usly slyly fi +1766|grey black sandy dodger deep|Manufacturer#3|Brand#33|MEDIUM BRUSHED TIN|18|JUMBO BOX|1667.76|sts. bold, u +1767|beige dark frosted powder chartreuse|Manufacturer#4|Brand#42|ECONOMY POLISHED TIN|1|WRAP BOX|1668.76|unts. care +1768|sienna bisque orange black drab|Manufacturer#5|Brand#54|MEDIUM ANODIZED NICKEL|10|LG DRUM|1669.76| packages above th +1769|blush linen burnished puff slate|Manufacturer#5|Brand#55|LARGE BRUSHED NICKEL|9|WRAP DRUM|1670.76|ily ironic requests. +1770|aquamarine forest powder peru green|Manufacturer#5|Brand#55|STANDARD PLATED TIN|24|WRAP PKG|1671.77|pecial warthog +1771|papaya forest gainsboro cyan burnished|Manufacturer#4|Brand#42|MEDIUM PLATED NICKEL|2|WRAP JAR|1672.77|nding deposits +1772|smoke honeydew antique burnished frosted|Manufacturer#4|Brand#44|PROMO POLISHED STEEL|6|MED BAG|1673.77|luffily ironic pi +1773|sandy turquoise indian firebrick tan|Manufacturer#5|Brand#52|LARGE ANODIZED TIN|12|MED JAR|1674.77|quickly +1774|khaki lace red purple burnished|Manufacturer#4|Brand#45|LARGE PLATED STEEL|22|SM DRUM|1675.77|ven, pendin +1775|misty dim ghost aquamarine lemon|Manufacturer#4|Brand#41|STANDARD ANODIZED STEEL|12|LG PKG|1676.77|. carefully f +1776|royal cream orange indian sandy|Manufacturer#2|Brand#24|PROMO PLATED NICKEL|13|JUMBO CAN|1677.77| excuses +1777|burnished bisque gainsboro dark chocolate|Manufacturer#3|Brand#33|ECONOMY PLATED STEEL|48|WRAP JAR|1678.77|tructions haggle +1778|light midnight chocolate salmon maroon|Manufacturer#3|Brand#32|SMALL ANODIZED TIN|9|JUMBO DRUM|1679.77| instruc +1779|rose wheat cornflower powder dodger|Manufacturer#5|Brand#53|LARGE PLATED BRASS|9|LG DRUM|1680.77|ithely special +1780|linen frosted forest sky midnight|Manufacturer#3|Brand#31|STANDARD PLATED TIN|38|JUMBO JAR|1681.78|gular requests. c +1781|goldenrod hot firebrick deep navy|Manufacturer#4|Brand#45|PROMO ANODIZED BRASS|11|WRAP CAN|1682.78|sits; slyly regular +1782|firebrick seashell light bisque metallic|Manufacturer#5|Brand#51|STANDARD BURNISHED COPPER|19|WRAP JAR|1683.78|its. depo +1783|mint plum violet metallic powder|Manufacturer#3|Brand#34|ECONOMY ANODIZED BRASS|30|WRAP PACK|1684.78|olphins are fl +1784|brown black burlywood orange salmon|Manufacturer#2|Brand#23|PROMO BRUSHED NICKEL|34|MED PKG|1685.78|ets. r +1785|chocolate dim firebrick olive blue|Manufacturer#3|Brand#33|SMALL BRUSHED STEEL|42|JUMBO CASE|1686.78|n packag +1786|floral aquamarine deep powder chocolate|Manufacturer#3|Brand#34|STANDARD PLATED STEEL|11|MED PACK|1687.78|ve the blithely fi +1787|lemon hot indian olive steel|Manufacturer#5|Brand#54|PROMO ANODIZED COPPER|38|LG CASE|1688.78|posits. regular, p +1788|powder violet magenta lemon coral|Manufacturer#3|Brand#31|PROMO PLATED STEEL|34|JUMBO BOX|1689.78|latele +1789|magenta peach turquoise red papaya|Manufacturer#2|Brand#21|PROMO PLATED STEEL|29|WRAP PKG|1690.78|e slyly silen +1790|tomato ghost frosted cornflower salmon|Manufacturer#3|Brand#32|ECONOMY PLATED COPPER|31|MED CAN|1691.79|special +1791|smoke coral bisque turquoise frosted|Manufacturer#1|Brand#14|LARGE BRUSHED NICKEL|18|WRAP PACK|1692.79|ic ins +1792|light rose maroon peru blush|Manufacturer#4|Brand#42|SMALL PLATED TIN|30|SM PACK|1693.79| fluffily above the bl +1793|almond thistle puff powder cyan|Manufacturer#1|Brand#13|ECONOMY BURNISHED NICKEL|27|LG PKG|1694.79|lar deposits doze +1794|dodger green puff thistle light|Manufacturer#3|Brand#32|ECONOMY BRUSHED NICKEL|11|SM PKG|1695.79|ages. sl +1795|green puff rosy burlywood rose|Manufacturer#4|Brand#43|ECONOMY ANODIZED TIN|13|MED JAR|1696.79|ly special ac +1796|sienna forest khaki frosted burlywood|Manufacturer#4|Brand#42|LARGE POLISHED BRASS|6|JUMBO CASE|1697.79|final accounts nag f +1797|floral black chartreuse dark saddle|Manufacturer#4|Brand#44|LARGE BRUSHED NICKEL|25|LG CAN|1698.79|ole. blithely even +1798|gainsboro turquoise chiffon metallic tomato|Manufacturer#4|Brand#45|PROMO PLATED NICKEL|3|SM PACK|1699.79| deposits s +1799|chiffon deep sienna burlywood lace|Manufacturer#5|Brand#51|ECONOMY PLATED COPPER|15|SM CAN|1700.79|gged packa +1800|orange cornsilk tomato indian cornflower|Manufacturer#2|Brand#22|LARGE BURNISHED NICKEL|8|SM BAG|1701.80|gular accounts nag a +1801|deep slate aquamarine honeydew floral|Manufacturer#4|Brand#44|ECONOMY BRUSHED STEEL|40|WRAP BOX|1702.80|eposit +1802|coral ivory powder chartreuse chocolate|Manufacturer#1|Brand#11|PROMO BURNISHED TIN|32|SM PACK|1703.80|c packages sleep +1803|blue white cornflower chartreuse burnished|Manufacturer#1|Brand#14|STANDARD BRUSHED NICKEL|15|JUMBO CAN|1704.80|y about t +1804|firebrick white puff royal deep|Manufacturer#1|Brand#13|MEDIUM BRUSHED TIN|33|WRAP BOX|1705.80|nto beans cajol +1805|bisque cream turquoise almond goldenrod|Manufacturer#5|Brand#54|MEDIUM POLISHED STEEL|43|LG PACK|1706.80|thely along +1806|chocolate pale light papaya salmon|Manufacturer#2|Brand#24|MEDIUM BRUSHED TIN|16|MED CAN|1707.80|slyly re +1807|lime beige dodger cornsilk deep|Manufacturer#4|Brand#43|LARGE ANODIZED COPPER|44|JUMBO CASE|1708.80|kly re +1808|sandy spring rosy deep misty|Manufacturer#2|Brand#23|LARGE ANODIZED COPPER|13|LG PKG|1709.80|he carefully unusua +1809|medium purple pale dim dark|Manufacturer#2|Brand#21|ECONOMY ANODIZED NICKEL|13|JUMBO DRUM|1710.80|e carefully spe +1810|floral gainsboro tomato burlywood drab|Manufacturer#4|Brand#44|LARGE BRUSHED TIN|11|SM CAN|1711.81| the carefully regular +1811|moccasin sky peru dim misty|Manufacturer#2|Brand#22|SMALL BURNISHED NICKEL|42|JUMBO CAN|1712.81| the bl +1812|burlywood ivory grey cornsilk drab|Manufacturer#3|Brand#31|LARGE POLISHED STEEL|4|WRAP JAR|1713.81| fluffily. r +1813|dim royal khaki pale lavender|Manufacturer#5|Brand#51|LARGE PLATED COPPER|48|JUMBO BOX|1714.81|y regular deposi +1814|hot beige lawn blanched ghost|Manufacturer#5|Brand#54|PROMO POLISHED STEEL|42|MED DRUM|1715.81| accounts +1815|dim goldenrod white burlywood olive|Manufacturer#5|Brand#53|SMALL ANODIZED TIN|37|SM CAN|1716.81|ongside o +1816|violet gainsboro royal khaki sienna|Manufacturer#2|Brand#21|MEDIUM BRUSHED TIN|13|SM BAG|1717.81|s nag blithely +1817|sandy pale coral magenta orchid|Manufacturer#4|Brand#41|STANDARD ANODIZED COPPER|40|MED DRUM|1718.81|the regular, sp +1818|dim brown peach beige burnished|Manufacturer#4|Brand#44|MEDIUM PLATED NICKEL|30|WRAP CAN|1719.81|timents. quickly un +1819|pale dark antique deep seashell|Manufacturer#3|Brand#33|MEDIUM POLISHED NICKEL|18|WRAP DRUM|1720.81|uriously fl +1820|indian burlywood blanched burnished chartreuse|Manufacturer#3|Brand#35|PROMO POLISHED BRASS|26|WRAP CAN|1721.82|s. bold p +1821|cream frosted deep almond steel|Manufacturer#2|Brand#25|ECONOMY POLISHED STEEL|39|JUMBO PKG|1722.82| the final, regu +1822|lawn honeydew mint spring hot|Manufacturer#3|Brand#33|MEDIUM POLISHED TIN|2|LG DRUM|1723.82|counts u +1823|lavender beige ivory forest indian|Manufacturer#5|Brand#55|ECONOMY POLISHED BRASS|24|MED BOX|1724.82| furio +1824|coral indian aquamarine peach honeydew|Manufacturer#5|Brand#54|STANDARD PLATED BRASS|1|SM BAG|1725.82| unusual, +1825|brown firebrick dim blue peach|Manufacturer#5|Brand#55|MEDIUM ANODIZED TIN|27|WRAP PKG|1726.82|p express accounts. +1826|aquamarine navy tan burlywood lawn|Manufacturer#5|Brand#55|PROMO POLISHED TIN|38|SM CASE|1727.82|struction +1827|beige steel chartreuse light chocolate|Manufacturer#5|Brand#52|PROMO PLATED STEEL|34|SM CAN|1728.82|express packages u +1828|saddle peru cream spring maroon|Manufacturer#1|Brand#14|MEDIUM BRUSHED COPPER|10|JUMBO BAG|1729.82|ts us +1829|chiffon lemon thistle puff ivory|Manufacturer#2|Brand#25|STANDARD ANODIZED NICKEL|25|LG CASE|1730.82| thrash sl +1830|burlywood hot ghost smoke spring|Manufacturer#2|Brand#21|ECONOMY ANODIZED STEEL|19|LG BOX|1731.83|hely fi +1831|pale red black forest chartreuse|Manufacturer#4|Brand#43|MEDIUM BURNISHED COPPER|37|MED PACK|1732.83|haggle furio +1832|pale cream orchid puff cyan|Manufacturer#4|Brand#43|STANDARD ANODIZED BRASS|3|LG PKG|1733.83|entiments are furiou +1833|drab khaki light red lavender|Manufacturer#4|Brand#42|LARGE BRUSHED TIN|17|SM BAG|1734.83|ular ideas are f +1834|coral violet tan orange drab|Manufacturer#3|Brand#35|PROMO BURNISHED NICKEL|29|JUMBO JAR|1735.83|ges hinder along the +1835|spring drab tomato lemon antique|Manufacturer#3|Brand#34|ECONOMY PLATED STEEL|39|SM BOX|1736.83|struc +1836|antique brown chartreuse plum white|Manufacturer#4|Brand#43|SMALL BRUSHED TIN|4|MED BAG|1737.83| wake along +1837|navy lavender burlywood papaya ivory|Manufacturer#4|Brand#43|LARGE PLATED COPPER|10|SM JAR|1738.83|bout the special p +1838|papaya honeydew misty cornsilk dim|Manufacturer#4|Brand#45|SMALL BRUSHED BRASS|35|MED JAR|1739.83|onic dolphins +1839|maroon cornflower orange coral orchid|Manufacturer#5|Brand#54|LARGE BRUSHED STEEL|5|LG DRUM|1740.83|aggle among the +1840|snow sky papaya brown midnight|Manufacturer#2|Brand#22|MEDIUM PLATED BRASS|49|MED CASE|1741.84| carefully +1841|yellow metallic moccasin gainsboro rosy|Manufacturer#4|Brand#41|LARGE BRUSHED TIN|35|WRAP JAR|1742.84|sly express theodoli +1842|powder magenta gainsboro chiffon coral|Manufacturer#1|Brand#15|STANDARD BRUSHED TIN|6|WRAP BAG|1743.84|uriously ironic reque +1843|chocolate burnished forest dim blush|Manufacturer#1|Brand#13|SMALL BURNISHED BRASS|45|WRAP CASE|1744.84|e the furio +1844|white orange rose maroon magenta|Manufacturer#4|Brand#41|PROMO BURNISHED STEEL|2|MED PACK|1745.84| carefull +1845|smoke misty snow azure peach|Manufacturer#5|Brand#51|SMALL PLATED BRASS|40|MED CASE|1746.84|s sleep accordi +1846|powder ghost thistle saddle drab|Manufacturer#1|Brand#15|STANDARD BURNISHED STEEL|45|JUMBO PKG|1747.84|ress ideas. regular, +1847|lemon antique salmon olive coral|Manufacturer#3|Brand#33|SMALL POLISHED COPPER|48|WRAP BOX|1748.84|ross the pending r +1848|sky navajo rose firebrick grey|Manufacturer#5|Brand#53|PROMO BRUSHED COPPER|11|JUMBO BOX|1749.84|nding, final fox +1849|lawn floral chartreuse dim dark|Manufacturer#4|Brand#42|SMALL POLISHED TIN|24|MED PACK|1750.84|ly; fluffily even +1850|sky goldenrod navy ivory lemon|Manufacturer#5|Brand#51|SMALL BURNISHED COPPER|1|SM PKG|1751.85|nts haggl +1851|honeydew beige green goldenrod dark|Manufacturer#3|Brand#34|MEDIUM BURNISHED NICKEL|3|JUMBO JAR|1752.85| blit +1852|orchid chiffon tomato smoke ghost|Manufacturer#5|Brand#52|ECONOMY PLATED TIN|23|LG CAN|1753.85|ly pending depo +1853|lemon misty navy lime cornflower|Manufacturer#4|Brand#44|MEDIUM PLATED TIN|34|WRAP PACK|1754.85|integrate sl +1854|indian metallic grey light blush|Manufacturer#2|Brand#24|PROMO POLISHED BRASS|14|WRAP PKG|1755.85|ual th +1855|wheat slate light rose chiffon|Manufacturer#2|Brand#21|MEDIUM ANODIZED TIN|9|MED CASE|1756.85|ding, final accounts +1856|cyan tan grey rose seashell|Manufacturer#5|Brand#54|STANDARD BURNISHED COPPER|31|MED BAG|1757.85|nts nag ca +1857|aquamarine beige azure burnished moccasin|Manufacturer#1|Brand#13|STANDARD PLATED NICKEL|48|WRAP PACK|1758.85|es. furiously even +1858|thistle dim khaki olive dodger|Manufacturer#2|Brand#24|ECONOMY POLISHED STEEL|15|WRAP CASE|1759.85|y by +1859|lawn dim puff seashell smoke|Manufacturer#1|Brand#14|LARGE ANODIZED NICKEL|20|SM JAR|1760.85|o beans h +1860|cream smoke floral sienna blue|Manufacturer#5|Brand#55|LARGE ANODIZED TIN|26|SM BAG|1761.86|ts could solve +1861|violet brown sienna burnished blue|Manufacturer#1|Brand#11|PROMO ANODIZED BRASS|3|LG DRUM|1762.86|telet +1862|royal bisque brown frosted tan|Manufacturer#5|Brand#51|STANDARD POLISHED COPPER|8|MED JAR|1763.86|lyly regular depos +1863|cyan sienna saddle violet lemon|Manufacturer#5|Brand#54|ECONOMY POLISHED BRASS|49|JUMBO BOX|1764.86|. slyly final foxes ca +1864|almond hot papaya chiffon grey|Manufacturer#5|Brand#51|SMALL ANODIZED COPPER|20|JUMBO BAG|1765.86|hely special r +1865|ivory bisque indian hot rosy|Manufacturer#3|Brand#32|PROMO ANODIZED TIN|39|MED PACK|1766.86|n pinto beans. deposit +1866|misty blanched coral indian moccasin|Manufacturer#4|Brand#41|MEDIUM PLATED TIN|18|MED JAR|1767.86|rnis. speci +1867|lace lime deep burnished turquoise|Manufacturer#5|Brand#53|LARGE PLATED STEEL|49|WRAP CAN|1768.86| would wake against t +1868|peru red burnished chocolate deep|Manufacturer#3|Brand#32|ECONOMY BURNISHED STEEL|16|JUMBO JAR|1769.86|egular, special ide +1869|gainsboro green dim burnished blanched|Manufacturer#2|Brand#25|SMALL ANODIZED STEEL|6|JUMBO DRUM|1770.86|posits affix furio +1870|red goldenrod metallic dodger khaki|Manufacturer#3|Brand#34|LARGE BURNISHED TIN|49|SM DRUM|1771.87|ronic requests boost +1871|medium deep khaki drab snow|Manufacturer#1|Brand#14|SMALL ANODIZED BRASS|21|JUMBO JAR|1772.87|ross the regul +1872|frosted goldenrod ghost plum turquoise|Manufacturer#2|Brand#22|LARGE BURNISHED TIN|45|WRAP CAN|1773.87|essly regular +1873|blush slate pink light lime|Manufacturer#1|Brand#12|SMALL PLATED NICKEL|48|MED PACK|1774.87|arefully instructions. +1874|lime blush puff cornsilk dark|Manufacturer#2|Brand#25|PROMO PLATED NICKEL|3|SM BAG|1775.87| deposits sleep unu +1875|blue peach rose lace slate|Manufacturer#2|Brand#25|PROMO ANODIZED STEEL|26|MED CAN|1776.87|le slyly unusual, re +1876|lime linen dark violet cornsilk|Manufacturer#5|Brand#51|PROMO BRUSHED STEEL|50|MED CASE|1777.87|ges integrate a +1877|lawn misty plum khaki navy|Manufacturer#5|Brand#54|MEDIUM BURNISHED BRASS|7|JUMBO PACK|1778.87|ter t +1878|lavender frosted indian rose ivory|Manufacturer#5|Brand#55|STANDARD BURNISHED TIN|10|MED BAG|1779.87| place +1879|sienna indian antique cornflower misty|Manufacturer#5|Brand#51|STANDARD BURNISHED STEEL|10|MED CAN|1780.87|ly blithely sp +1880|brown black rosy chocolate khaki|Manufacturer#3|Brand#34|ECONOMY ANODIZED NICKEL|27|SM PKG|1781.88|he furiously i +1881|floral firebrick drab dim blanched|Manufacturer#5|Brand#52|LARGE POLISHED NICKEL|41|LG BAG|1782.88|usly accordin +1882|burnished salmon orange orchid white|Manufacturer#4|Brand#42|LARGE POLISHED NICKEL|1|JUMBO BAG|1783.88| foxes. ir +1883|ivory powder cream moccasin blush|Manufacturer#3|Brand#35|LARGE BRUSHED COPPER|39|LG DRUM|1784.88|regular requests. even +1884|khaki black aquamarine indian green|Manufacturer#3|Brand#34|ECONOMY PLATED NICKEL|47|LG PKG|1785.88|ily ironic, blith +1885|navajo azure sienna black indian|Manufacturer#3|Brand#32|LARGE BRUSHED BRASS|31|LG JAR|1786.88|iously a +1886|bisque rose tan forest red|Manufacturer#4|Brand#44|MEDIUM ANODIZED TIN|43|JUMBO DRUM|1787.88| slow platelets +1887|firebrick aquamarine honeydew chocolate azure|Manufacturer#4|Brand#42|ECONOMY PLATED BRASS|46|WRAP BOX|1788.88| ironic accounts. fluf +1888|thistle frosted olive beige grey|Manufacturer#5|Brand#52|LARGE PLATED TIN|9|SM BAG|1789.88| slyly fi +1889|papaya grey light orchid cream|Manufacturer#4|Brand#41|PROMO ANODIZED NICKEL|35|LG BAG|1790.88|oss the special reque +1890|deep dodger lime magenta grey|Manufacturer#1|Brand#13|STANDARD BURNISHED NICKEL|35|JUMBO CAN|1791.89|ending +1891|rosy cornsilk white indian gainsboro|Manufacturer#4|Brand#41|PROMO BURNISHED COPPER|20|WRAP CAN|1792.89|about the +1892|bisque plum ghost dark beige|Manufacturer#1|Brand#14|PROMO BRUSHED NICKEL|37|LG BOX|1793.89|ggle slyly. unu +1893|thistle blush lawn maroon drab|Manufacturer#5|Brand#52|MEDIUM BURNISHED BRASS|48|MED JAR|1794.89|thely abo +1894|khaki misty honeydew linen lemon|Manufacturer#4|Brand#42|ECONOMY BRUSHED COPPER|14|MED BAG|1795.89|dolite +1895|slate cornflower magenta spring drab|Manufacturer#2|Brand#25|MEDIUM BRUSHED TIN|4|WRAP PKG|1796.89|use slyly +1896|grey cornflower drab cyan puff|Manufacturer#2|Brand#23|MEDIUM BRUSHED TIN|40|SM DRUM|1797.89|yly ironic +1897|puff red tan violet magenta|Manufacturer#3|Brand#34|STANDARD BRUSHED TIN|19|JUMBO CASE|1798.89|ole blithely. furio +1898|navy magenta antique ivory sky|Manufacturer#4|Brand#41|MEDIUM BURNISHED STEEL|17|MED DRUM|1799.89|bold plate +1899|cyan mint powder blanched khaki|Manufacturer#2|Brand#21|MEDIUM BRUSHED NICKEL|26|SM BOX|1800.89|ar, r +1900|frosted dim orchid deep forest|Manufacturer#1|Brand#11|MEDIUM BURNISHED COPPER|44|JUMBO CAN|1801.90|express requests. +1901|floral peach purple puff hot|Manufacturer#4|Brand#41|SMALL POLISHED COPPER|14|JUMBO CASE|1802.90|counts sn +1902|hot purple gainsboro cream chartreuse|Manufacturer#3|Brand#32|ECONOMY POLISHED NICKEL|12|SM PKG|1803.90|carefully requests +1903|lavender almond smoke misty slate|Manufacturer#4|Brand#45|SMALL BRUSHED COPPER|33|JUMBO CASE|1804.90|es wake regularly bold +1904|navajo beige lime chiffon goldenrod|Manufacturer#1|Brand#13|STANDARD ANODIZED STEEL|20|LG DRUM|1805.90|ross the s +1905|floral brown forest olive wheat|Manufacturer#5|Brand#54|PROMO BURNISHED STEEL|29|LG CAN|1806.90|uests wake ca +1906|burlywood green firebrick misty drab|Manufacturer#2|Brand#21|LARGE POLISHED STEEL|41|SM PKG|1807.90|accounts affix +1907|hot chartreuse peach green maroon|Manufacturer#2|Brand#21|PROMO BURNISHED COPPER|19|WRAP BOX|1808.90|sts will h +1908|violet powder aquamarine coral blush|Manufacturer#4|Brand#41|ECONOMY PLATED NICKEL|37|JUMBO JAR|1809.90| brave +1909|cyan forest sienna hot orange|Manufacturer#4|Brand#45|STANDARD BRUSHED NICKEL|26|SM CASE|1810.90|er slyly for +1910|linen turquoise dark puff wheat|Manufacturer#5|Brand#52|ECONOMY BURNISHED STEEL|36|WRAP CASE|1811.91|p quickly a +1911|magenta bisque dark green sky|Manufacturer#4|Brand#44|LARGE BURNISHED BRASS|38|WRAP BAG|1812.91|ronic de +1912|blanched cream sandy steel antique|Manufacturer#4|Brand#43|LARGE POLISHED NICKEL|2|JUMBO CAN|1813.91|ts. unusual, r +1913|gainsboro powder midnight blue cream|Manufacturer#1|Brand#12|SMALL POLISHED STEEL|35|MED CASE|1814.91|gle against the fluff +1914|plum linen floral coral peru|Manufacturer#2|Brand#23|STANDARD PLATED BRASS|9|MED JAR|1815.91|ial deposits +1915|red lemon pink rosy lavender|Manufacturer#1|Brand#11|ECONOMY BURNISHED NICKEL|49|MED BAG|1816.91|s cajole carefu +1916|cream seashell frosted medium blanched|Manufacturer#5|Brand#54|LARGE BURNISHED TIN|2|SM BOX|1817.91|ts use bl +1917|khaki maroon deep papaya saddle|Manufacturer#4|Brand#41|PROMO ANODIZED NICKEL|9|MED BOX|1818.91|wake quickly reg +1918|khaki spring wheat rosy bisque|Manufacturer#2|Brand#24|LARGE ANODIZED NICKEL|38|JUMBO BOX|1819.91| fluffily regular p +1919|moccasin forest chartreuse plum gainsboro|Manufacturer#3|Brand#32|SMALL BRUSHED STEEL|39|WRAP BOX|1820.91|hy ideas wil +1920|papaya blush wheat lace navy|Manufacturer#2|Brand#24|STANDARD POLISHED NICKEL|26|LG DRUM|1821.92|carefully against the +1921|maroon beige olive lace purple|Manufacturer#4|Brand#45|LARGE BRUSHED STEEL|6|LG BOX|1822.92|unts are careful +1922|snow rose royal drab almond|Manufacturer#5|Brand#52|PROMO BRUSHED NICKEL|32|SM DRUM|1823.92|sts. +1923|lavender blush dodger chiffon powder|Manufacturer#1|Brand#12|STANDARD BURNISHED STEEL|8|WRAP JAR|1824.92|ter the carefull +1924|chartreuse blush misty salmon spring|Manufacturer#4|Brand#42|MEDIUM ANODIZED STEEL|1|JUMBO CAN|1825.92|ts al +1925|gainsboro chiffon lawn navy spring|Manufacturer#4|Brand#43|PROMO ANODIZED COPPER|47|JUMBO BAG|1826.92| furiously slyl +1926|forest puff blue peru burnished|Manufacturer#3|Brand#34|PROMO BRUSHED STEEL|28|MED BOX|1827.92|blith +1927|magenta burnished khaki almond drab|Manufacturer#1|Brand#11|SMALL ANODIZED NICKEL|26|WRAP CASE|1828.92|against the reque +1928|lavender hot black dodger mint|Manufacturer#4|Brand#44|PROMO BURNISHED STEEL|13|LG DRUM|1829.92|kages by t +1929|midnight medium mint hot lace|Manufacturer#1|Brand#14|LARGE PLATED BRASS|17|LG DRUM|1830.92|he ideas +1930|spring deep bisque smoke ghost|Manufacturer#3|Brand#31|PROMO PLATED BRASS|5|WRAP BAG|1831.93| even, clos +1931|cyan ivory black misty papaya|Manufacturer#3|Brand#31|LARGE PLATED TIN|10|LG CAN|1832.93|regula +1932|metallic peach olive midnight maroon|Manufacturer#1|Brand#15|STANDARD BRUSHED NICKEL|31|SM DRUM|1833.93| boost ev +1933|sky blue peru violet sienna|Manufacturer#4|Brand#43|MEDIUM ANODIZED NICKEL|31|WRAP JAR|1834.93|thely even +1934|dodger violet olive blue light|Manufacturer#3|Brand#34|SMALL PLATED BRASS|33|LG DRUM|1835.93|ly pending notornis s +1935|peru white linen cornsilk chocolate|Manufacturer#1|Brand#11|STANDARD ANODIZED TIN|24|WRAP JAR|1836.93|l foxes boost fu +1936|thistle antique indian bisque azure|Manufacturer#2|Brand#23|ECONOMY BRUSHED TIN|1|SM JAR|1837.93|ckly +1937|chocolate wheat tan yellow rose|Manufacturer#2|Brand#25|PROMO PLATED BRASS|35|SM BOX|1838.93|ously ironic +1938|lime blue blush rose blanched|Manufacturer#4|Brand#43|STANDARD BRUSHED TIN|44|WRAP CAN|1839.93|count +1939|lace plum papaya beige almond|Manufacturer#2|Brand#21|STANDARD POLISHED TIN|7|SM JAR|1840.93|r dol +1940|almond azure yellow aquamarine spring|Manufacturer#3|Brand#35|SMALL BRUSHED NICKEL|26|MED PACK|1841.94|ular asymptotes. bl +1941|lemon chocolate azure blue thistle|Manufacturer#4|Brand#42|LARGE POLISHED BRASS|20|LG PACK|1842.94|gle furi +1942|gainsboro azure smoke chocolate light|Manufacturer#1|Brand#13|SMALL BURNISHED NICKEL|17|MED JAR|1843.94|ly around the regul +1943|blue antique steel chocolate almond|Manufacturer#4|Brand#43|SMALL ANODIZED COPPER|16|JUMBO JAR|1844.94|ic packages sl +1944|wheat powder white aquamarine peru|Manufacturer#1|Brand#11|ECONOMY BRUSHED STEEL|24|JUMBO BAG|1845.94|ar pint +1945|papaya navy beige thistle steel|Manufacturer#1|Brand#15|ECONOMY PLATED STEEL|45|LG PKG|1846.94|refully bold deposi +1946|burlywood saddle orchid bisque indian|Manufacturer#3|Brand#34|MEDIUM BURNISHED BRASS|32|SM PKG|1847.94|egrate slyly +1947|rose royal coral cyan pale|Manufacturer#5|Brand#55|PROMO BURNISHED TIN|18|MED CAN|1848.94|inal platelets. +1948|dodger tan medium rose saddle|Manufacturer#2|Brand#21|STANDARD BRUSHED STEEL|41|SM DRUM|1849.94|es integrate qui +1949|hot maroon purple moccasin ghost|Manufacturer#2|Brand#23|PROMO BURNISHED BRASS|35|LG BAG|1850.94|ole slyly around th +1950|saddle antique chocolate light blush|Manufacturer#5|Brand#51|MEDIUM BRUSHED BRASS|48|MED CASE|1851.95|ular foxes affix slyly +1951|black ivory steel maroon antique|Manufacturer#4|Brand#43|LARGE PLATED TIN|24|WRAP BAG|1852.95|press accounts. ironic +1952|violet hot blush orchid maroon|Manufacturer#2|Brand#23|MEDIUM ANODIZED TIN|30|WRAP DRUM|1853.95|etect acc +1953|blush medium ghost snow tan|Manufacturer#5|Brand#51|SMALL BURNISHED NICKEL|33|SM PACK|1854.95|old, reg +1954|forest sky pink tan plum|Manufacturer#4|Brand#43|STANDARD BRUSHED COPPER|24|WRAP CASE|1855.95|tes. b +1955|misty frosted sky black dim|Manufacturer#5|Brand#51|MEDIUM ANODIZED TIN|14|SM PACK|1856.95|gifts. ironic, regul +1956|cornsilk sandy orchid salmon cornflower|Manufacturer#5|Brand#55|LARGE POLISHED TIN|42|WRAP DRUM|1857.95| beans. unusual, si +1957|magenta sandy mint powder turquoise|Manufacturer#3|Brand#33|PROMO POLISHED STEEL|9|WRAP DRUM|1858.95|theodolites +1958|blue midnight honeydew bisque hot|Manufacturer#1|Brand#15|ECONOMY POLISHED COPPER|22|LG PACK|1859.95|xpress excuses. s +1959|salmon beige green midnight sandy|Manufacturer#3|Brand#34|LARGE ANODIZED NICKEL|47|SM BAG|1860.95|ly pe +1960|honeydew floral pink papaya metallic|Manufacturer#3|Brand#33|PROMO BURNISHED BRASS|30|SM BAG|1861.96|ithely s +1961|antique bisque steel misty linen|Manufacturer#2|Brand#21|MEDIUM BRUSHED BRASS|29|MED JAR|1862.96|g. furiously unusua +1962|goldenrod peach lace floral peru|Manufacturer#4|Brand#42|LARGE BRUSHED NICKEL|11|WRAP BOX|1863.96|ainst the quickly +1963|burnished firebrick honeydew lawn orchid|Manufacturer#5|Brand#53|STANDARD BURNISHED COPPER|37|SM CASE|1864.96|ly. evenly pendin +1964|olive tomato burnished frosted orange|Manufacturer#2|Brand#25|STANDARD ANODIZED NICKEL|42|MED JAR|1865.96|e blithel +1965|light chocolate blanched brown spring|Manufacturer#1|Brand#13|STANDARD PLATED TIN|34|LG PKG|1866.96|st with the bl +1966|azure cornsilk tomato chartreuse burnished|Manufacturer#2|Brand#23|STANDARD BURNISHED TIN|40|JUMBO BOX|1867.96|s are furiously +1967|lime bisque chartreuse burlywood powder|Manufacturer#5|Brand#51|LARGE ANODIZED TIN|42|LG PACK|1868.96|, express dependenc +1968|aquamarine turquoise beige cornflower light|Manufacturer#5|Brand#54|STANDARD POLISHED NICKEL|26|JUMBO JAR|1869.96|uthlessly +1969|blue navy azure black tan|Manufacturer#3|Brand#32|STANDARD POLISHED NICKEL|43|JUMBO BAG|1870.96|ress, regula +1970|peru blue ghost cream hot|Manufacturer#5|Brand#54|ECONOMY PLATED TIN|50|WRAP JAR|1871.97| platelets wake b +1971|saddle red black honeydew brown|Manufacturer#4|Brand#43|SMALL BRUSHED TIN|10|MED BOX|1872.97|carefull +1972|frosted orange peru lime cornflower|Manufacturer#1|Brand#13|STANDARD BURNISHED BRASS|17|JUMBO PACK|1873.97|nding ac +1973|snow orchid lace almond cornsilk|Manufacturer#4|Brand#44|SMALL PLATED BRASS|13|SM JAR|1874.97|s. carefully iro +1974|chartreuse saddle violet hot burnished|Manufacturer#3|Brand#33|MEDIUM BURNISHED COPPER|14|JUMBO CAN|1875.97|osits. quickly e +1975|misty burnished pale cyan grey|Manufacturer#5|Brand#53|PROMO BRUSHED BRASS|6|MED JAR|1876.97|. eve +1976|drab blue dodger dim linen|Manufacturer#2|Brand#23|STANDARD POLISHED TIN|32|JUMBO BOX|1877.97|ounts caj +1977|cream indian yellow dodger dark|Manufacturer#4|Brand#41|ECONOMY ANODIZED COPPER|33|MED CAN|1878.97|ar requests. ca +1978|chiffon lace goldenrod metallic blush|Manufacturer#1|Brand#13|SMALL PLATED BRASS|44|LG DRUM|1879.97|ly pending pint +1979|khaki floral orchid burnished lime|Manufacturer#5|Brand#52|SMALL POLISHED COPPER|50|SM PKG|1880.97|es. blithel +1980|frosted thistle burnished orchid antique|Manufacturer#2|Brand#24|ECONOMY BRUSHED BRASS|13|WRAP PACK|1881.98|egular theodolites +1981|frosted azure peru brown snow|Manufacturer#4|Brand#44|MEDIUM BURNISHED NICKEL|23|SM BAG|1882.98| bold +1982|aquamarine wheat chocolate peru lace|Manufacturer#1|Brand#13|MEDIUM BURNISHED STEEL|18|SM BOX|1883.98|y players w +1983|deep bisque metallic salmon chiffon|Manufacturer#2|Brand#25|MEDIUM PLATED BRASS|22|WRAP CAN|1884.98|lly about the slyly +1984|lavender brown yellow sienna pink|Manufacturer#5|Brand#51|MEDIUM BRUSHED NICKEL|26|LG CAN|1885.98|ts integrate r +1985|magenta gainsboro navy rosy cyan|Manufacturer#1|Brand#12|ECONOMY PLATED BRASS|26|WRAP PACK|1886.98|tornis sleep aro +1986|goldenrod coral red chiffon blue|Manufacturer#3|Brand#33|PROMO PLATED TIN|49|LG BAG|1887.98|he ironic +1987|peach moccasin deep khaki lime|Manufacturer#5|Brand#55|STANDARD ANODIZED STEEL|5|LG PACK|1888.98|s. carefully bold ide +1988|moccasin brown grey midnight orange|Manufacturer#5|Brand#51|SMALL BRUSHED COPPER|38|JUMBO BOX|1889.98|ar requests +1989|sienna chiffon saddle medium lime|Manufacturer#3|Brand#32|LARGE BURNISHED STEEL|15|WRAP BOX|1890.98|ully wi +1990|slate snow lemon thistle chocolate|Manufacturer#2|Brand#25|LARGE BRUSHED TIN|31|SM PKG|1891.99| beans nag acco +1991|dim beige smoke drab aquamarine|Manufacturer#1|Brand#12|SMALL ANODIZED BRASS|47|SM PKG|1892.99|ts. furiously quic +1992|cream green navajo seashell medium|Manufacturer#3|Brand#34|MEDIUM BRUSHED TIN|14|MED PKG|1893.99|ven foxes poach +1993|magenta burlywood moccasin midnight dodger|Manufacturer#4|Brand#41|STANDARD POLISHED TIN|4|JUMBO CASE|1894.99|notornis-- busy, ir +1994|snow salmon cream plum lavender|Manufacturer#1|Brand#12|STANDARD PLATED STEEL|36|SM PACK|1895.99|ackages. slyly sil +1995|plum khaki peru snow magenta|Manufacturer#1|Brand#12|ECONOMY PLATED TIN|31|JUMBO BAG|1896.99| doggedly regu +1996|bisque tan thistle rosy gainsboro|Manufacturer#2|Brand#22|SMALL ANODIZED STEEL|22|JUMBO CASE|1897.99|package +1997|coral indian dodger black medium|Manufacturer#3|Brand#32|STANDARD BURNISHED NICKEL|15|MED JAR|1898.99|ckages are +1998|forest rose chocolate midnight frosted|Manufacturer#2|Brand#25|LARGE BURNISHED TIN|37|WRAP PACK|1899.99|deas +1999|frosted black gainsboro hot aquamarine|Manufacturer#2|Brand#25|LARGE BURNISHED BRASS|35|SM PKG|1900.99|l ideas! carefully ru +2000|drab blue goldenrod powder medium|Manufacturer#1|Brand#12|PROMO ANODIZED STEEL|46|SM BAG|902.00|ajole carefully diff --git a/src/test/singlenode_regress/data/partsupp.csv b/src/test/singlenode_regress/data/partsupp.csv new file mode 100644 index 00000000000..80913e3594f --- /dev/null +++ b/src/test/singlenode_regress/data/partsupp.csv @@ -0,0 +1,8000 @@ +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 +1|27|8076|993.49|ven ideas. quickly even packages print. pending multipliers must have to are fluff +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 +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 +2|3|8895|378.49|nic accounts. final accounts sleep furiously about the ironic, bold packages. regular, regular accounts +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 +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 +2|78|3025|306.39|olites. deposits wake carefully. even, express requests cajole. carefully regular ex +3|4|4651|920.92|ilent foxes affix furiously quickly unusual requests. even packages across the carefully even theodolites nag above the sp +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 +3|54|3917|645.40|of the blithely regular theodolites. final theodolites haggle blithely carefully unusual ideas. blithely even f +3|79|9942|191.92| unusual, ironic foxes according to the ideas detect furiously alongside of the even, express requests. blithely regular the +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 +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 +4|55|2694|51.37|g, regular deposits: quick instructions run across the carefully ironic theodolites-- final dependencies haggle into the dependencies. f +4|80|2480|444.37|requests sleep quickly regular accounts. theodolites detect. carefully final depths w +5|6|3735|255.88|arefully even requests. ironic requests cajole carefully even dolphin +5|31|9653|50.52|y stealthy deposits. furiously final pinto beans wake furiou +5|56|1329|219.83|iously regular deposits wake deposits. pending pinto beans promise ironic dependencies. even, regular pinto beans integrate +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 +6|7|8851|130.72|usly final packages. slyly ironic accounts poach across the even, sly requests. carefully pending request +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 +6|57|3336|642.13|final instructions. courts wake packages. blithely unusual realms along the multipliers nag +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, +7|8|7454|763.98|y express tithes haggle furiously even foxes. furiously ironic deposits sleep toward the furiously unusual +7|33|2770|149.66|hould have to nag after the blithely final asymptotes. fluffily spe +7|58|3377|68.77|usly against the daring asymptotes. slyly regular platelets sleep quickly blithely regular deposits. boldly regular deposits wake blithely ironic accounts +7|83|9460|299.58|. furiously final ideas hinder slyly among the ironic, final packages. blithely ironic dependencies cajole pending requests: blithely even packa +8|9|6834|249.63|lly ironic accounts solve express, unusual theodolites. special packages use quickly. quickly fin +8|34|396|957.34|r accounts. furiously pending dolphins use even, regular platelets. final +8|59|9845|220.62|s against the fluffily special packages snooze slyly slyly regular p +8|84|8126|916.91|final accounts around the blithely special asymptotes wake carefully beyond the bold dugouts. regular ideas haggle furiously after +9|10|7054|84.20|ts boost. evenly regular packages haggle after the quickly careful accounts. +9|35|7542|811.84|ate after the final pinto beans. express requests cajole express packages. carefully bold ideas haggle furiously. blithely express accounts eat carefully among the evenly busy accounts. carefully un +9|60|9583|381.31|d foxes. final, even braids sleep slyly slyly regular ideas. unusual ideas above +9|85|3063|291.84| the blithely ironic instructions. blithely express theodolites nag furiously. carefully bold requests shall have to use slyly pending requests. carefully regular instr +10|11|2952|996.12| bold foxes wake quickly even, final asymptotes. blithely even depe +10|36|3335|673.27|s theodolites haggle according to the fluffily unusual instructions. silent realms nag carefully ironic theodolites. furiously unusual instructions would detect fu +10|61|5691|164.00|r, silent instructions sleep slyly regular pinto beans. furiously unusual gifts use. silently ironic theodolites cajole final deposits! express dugouts are furiously. packages sleep +10|86|841|374.02|refully above the ironic packages. quickly regular packages haggle foxes. blithely ironic deposits a +11|12|4540|709.87|thely across the blithely unusual requests. slyly regular instructions wake slyly ironic theodolites. requests haggle blithely above the blithely brave p +11|37|4729|894.90|ters wake. sometimes bold packages cajole sometimes blithely final instructions. carefully ironic foxes after the furiously unusual foxes cajole carefully acr +11|62|3708|818.74|inal accounts nag quickly slyly special frays; bold, final theodolites play slyly after the furiously pending packages. f +11|87|3213|471.98|nusual, regular requests use carefully. slyly final packages haggle quickly. slyly express packages impress blithely across the blithely regular ideas. regular depe +12|13|3610|659.73|jole bold theodolites. final packages haggle! carefully regular deposits play furiously among the special ideas. quickly ironic packages detect quickly carefully final +12|38|7606|332.81|luffily regular courts engage carefully special realms. regular accounts across the blithely special pinto beans use carefully at the silent request +12|63|824|337.06|es are unusual deposits. fluffily even deposits across the blithely final theodolites doubt across the unusual accounts. regular, +12|88|5454|901.70|s across the carefully regular courts haggle fluffily among the even theodolites. blithely final platelets x-ray even ideas. fluffily express pinto beans sleep slyly. carefully even a +13|14|612|169.44|s. furiously even asymptotes use slyly blithely express foxes. pending courts integrate blithely among the ironic requests! blithely pending deposits integrate slyly furiously final packa +13|39|7268|862.70|s sleep slyly packages. final theodolites to the express packages haggle quic +13|64|864|38.64|s after the slyly pending instructions haggle even, express requests. permanently regular pinto beans are. slyly pending req +13|89|9736|327.18|tect after the express instructions. furiously silent ideas sleep blithely special ideas. attainments sleep furiously. carefully bold requests ab +14|15|5278|650.07|e quickly among the furiously ironic accounts. special, final sheaves against the +14|40|5334|889.50|ss dependencies are furiously silent excuses. blithely ironic pinto beans affix quickly according to the slyly ironic asymptotes. final packag +14|65|3676|893.39|sits are according to the fluffily silent asymptotes. final ideas are slyly above the regular instructions. furiousl +14|90|4947|310.13| final deposits boost slyly regular packages; carefully pending theodolites +15|16|7047|835.70|blithely quick requests sleep carefully fluffily regular pinto beans. ironic pinto beans around the slyly regular foxe +15|41|3336|784.55|slyly. fluffily bold accounts cajole furiously. furiously regular dependencies wak +15|66|3316|265.89|e express instructions. ironic requests haggle fluffily along the carefully even packages. furiously final acco +15|91|5255|458.67|refully bold instructions among the silent grouches must boost against the express deposits: +16|17|5282|709.16|lithely ironic theodolites should have to are furiously-- +16|42|9412|887.53|ly special accounts wake. fluffily bold ideas believe blith +16|67|854|781.91| unusual excuses. requests after the carefully regular pinto +16|92|1491|918.51|unts cajole furiously across the fluffily pending instructions. slyly special accounts could have to boost b +17|18|8555|995.35|are furiously final accounts. carefully unusual accounts snooze across the requests. carefully special dolphins +17|43|7737|648.75|e blithely express accounts. foxes kindle slyly unusual dinos. quickly special f +17|68|3123|555.04|ly bold accounts. regular packages use silently. quickly unusual sentiments around the quickly ironic theodolites haggle furiously pending requests. care +17|93|3203|64.40|bold packages nag fluffily after the regular accounts. furiously ironic asymptotes sleep quickly enticing pinto beans. carefully pending accounts use about the +18|19|1125|664.17|. ironic, regular accounts across the furiously express +18|44|8132|52.44| final packages wake quickly across the blithely ironic instructions. regular pains integrate slyly across the deposits. carefully regular pinto beans among the close +18|69|3133|568.61|riously bold accounts. packages boost daringly. blithely regular requests cajole. regular foxes wake carefully final accounts. blithely unusual excuses det +18|94|6475|386.29|. furiously regular accounts cajole slyly across the pending +19|20|1416|144.80|o beans. even packages nag boldly according to the bold, special deposits. ironic packages after the pinto beans nag above the quickly ironic requests. bl +19|45|5467|405.70|nstructions use furiously. fluffily regular excuses wake. slyly special grouches are carefully regular Tiresias. regular requests use about the quickly furio +19|70|8800|635.66|sual requests sleep carefully. deposits cajole carefully over the regular, regular requests. quickly unusual asymptotes use some +19|95|1340|346.92| requests. final, pending realms use carefully; slyly dogged foxes impress fluffily above the blithely regular deposits. ironic, regular courts wake carefully. bold requests impress +20|21|2927|675.54|s, ironic deposits haggle across the quickly bold asymptotes. express, ironic pinto beans wake carefully enticingly special foxes. requests are at the c +20|46|2723|305.84|nal, bold frets cajole slyly regular, unusual platelets. slyly permanent deposits wake carefully carefully silent accounts. even, even requests wake quickly. furiously pending packages are +20|71|5905|546.66|ing deposits use furiously. ironically final pinto bea +20|96|4271|115.89|xcuses wake at the deposits. regular pinto beans nag slyly fluffi +21|22|6571|944.44|ing instructions impress bold foxes. ironic pinto beans use. thinly even asymptotes cajole ironic packages. quickly ironic pinto beans detect slyly regular deposits. ruthlessly even deposits are. sl +21|47|1704|139.05|posits cajole; quickly even requests sleep furiously. ironic theodolites sleep pending, express instructions. stealthily even platelets cajole carefully after the final, ironic p +21|72|7153|664.50|blithely enticing instructions use alongside of the carefully thin deposits. blithely bold requests are fluffily +21|97|367|584.86|ong the even theodolites. pending, pending accounts sleep-- courts boost quickly at the accounts. quickly fin +22|23|4410|786.18|even accounts. final excuses try to sleep regular, even packages. carefully express dolphins cajole; furiously special pinto bea +22|48|9779|635.84|l instructions cajole across the blithely special deposits. blithely pending accounts use thinly slyly final requests. instructions haggle. pinto beans sleep along the slyly pen +22|73|7834|359.16|sits wake fluffily carefully stealthy accounts. furiously ironic requests x-ray fluffily alongside of the pending asymptotes. slyly silent packages use along the instructions. fu +22|98|1434|597.21|ix across the blithely express packages. carefully regular pinto beans boost across the special, pending d +23|24|2739|460.12|platelets against the furiously bold Tiresias dazzle quickly into the special, bold courts. silent, regular instructions wake blithely ironic multipliers. ideas +23|49|5739|103.13| theodolites need to nag blithely final notornis. slyly idle packages cajole after the furiously stealthy packages. slyly regular accounts use furiously. carefully final accounts affix +23|74|9898|233.94|l, express packages wake permanently. quickly even deposits sleep quickly slyly silent id +23|99|7035|51.75|xcuses; decoys wake after the pending packages. final instructions are furi +24|25|5180|905.41|heodolites above the ironic requests poach fluffily carefully unusual pinto beans. even packages acc +24|50|2227|511.20|, silent packages boost around the instructions. special requests sleep slyly against the slyly regular deposits. final, final accounts haggle fluffily among the final requests. regular +24|75|7182|582.03| the final, ironic asymptotes. regular requests nag instead of the carefully unusual asymptotes. furiously pending attainments among the slyly final packages boost after th +24|100|5318|62.15| careful requests cajole blithely realms. special asymptotes sleep. pinto beans sleep carefully furiously ironic packages. furiously +25|26|9029|832.74|fully fluffily regular frets. sometimes even requests after the requests wake slyly at the quickly ruthless requests. a +25|51|9062|928.96|he foxes. final, final accounts sleep. boldly ironic excuses thrash quick +25|76|9946|694.35|ld, ironic requests. furiously special packages cajole furiously enticing instructions. +25|1|7340|746.59|dly final packages haggle blithely according to the pending packages. slyly regula +26|27|5020|683.96|es. fluffily express deposits kindle slyly accounts. slyly ironic requests wake blithely bold ideas +26|52|6577|892.20|riously pending pinto beans. furiously express instructions detect slyly according to the b +26|77|3499|382.11|imes even pinto beans among the busily ironic accounts doubt blithely quickly final courts. furiously fluffy packages despite the carefully even plate +26|2|9702|821.89| behind the blithely regular courts impress after the silent sheaves. bravely final ideas haggle +27|28|2111|444.01|the even, ironic deposits. theodolites along the ironic, final dolphins cajole slyly quickly bold asymptotes. furiously regular theodolites integrate furiously furiously bold requests. carefully +27|53|9080|157.03|ole express, final requests. carefully regular packages lose about the regular pinto beans. blithely re +27|78|3407|151.34|ironic theodolites are by the furiously bold ideas. ironic requests shall have to sublate final packages. furiously quick foxes alongside of the express, special deposits was boldly according +27|3|4283|348.61|ound the final foxes detect furiously across the even warhorses. quickly t +28|29|6643|204.86|y ironic deposits above the slyly final deposits sleep furiously above the final deposits. quickly even i +28|54|2452|744.57|ully regular theodolites haggle about the blithely pending packages. carefully ironic sentiments use quickly around the blithely silent requests. slyly ironic frays bo +28|79|302|690.30|uickly unusual requests alongside of the final courts integrate slyly +28|4|9988|666.53|beans haggle carefully around the slyly ironic acco +29|30|3506|799.27|leep fluffily according to the quietly regular requests: accounts integrate carefully bold foxes. carefully silent +29|55|8106|981.33|the ironic, bold asymptotes! blithely regular packages hang furiously above the dependencies. blithely permanent dependencies are furiously furiously ironic acco +29|80|9193|734.44|ly unusual packages. foxes cajole. theodolites nag +29|5|6252|186.21|thely carefully even packages. even, final packages cajole after the quickly bold accounts. fluffily quick accounts in place of the theodolites doze slyly f +30|31|4767|989.05|ts. slyly final pinto beans cajole ironic accounts. blithely final accounts use among the request +30|56|535|743.26|sual instructions wake carefully blithely even hockey playe +30|81|7756|568.86| special foxes across the dependencies cajole quickly against the slyly express packages! furiously unusual pinto beans boost blithely ironic Tir +30|6|7945|583.84| sleep. bold, regular deposits hang doggedly furiously bold requests. slyly bold excuses detect busily above the even gifts. blithely express courts are carefully. blithely final packages until th +31|32|9685|620.84|he blithely regular ideas. blithely unusual requests haggle fluffily. platelets +31|57|1951|120.99|refully regular pinto beans. ironic requests integrate furiously since the quickly ruthless platelets. quickly ironic attainments ha +31|82|1402|761.64|r platelets nag blithely regular deposits. ironic, bold requests +31|7|137|849.11|blithely ironic accounts. slyly ironic asymptotes sleep ironic, even accounts. regular accounts thrash quickly +32|33|2203|406.03|es? slyly enticing dugouts haggle carefully. regular packages alongside of the asymptotes are carefull +32|58|467|109.34|ainst the unusual braids nod fluffily packages. regular packages nod among the slyly express +32|83|7975|747.14|final foxes boost furiously pending packages. quickly regular depths promise blithely accoun +32|8|7938|856.09|s integrate according to the even dependencies. carefully regular reque +33|34|4028|891.46|, pending requests affix slyly. slyly ironic deposits wake accounts. express accounts sleep slowly. ironic, express accounts run carefully fluffily final dependencies. furiously unusual ideas +33|59|4410|929.05| packages sleep carefully. slyly final instructions boost. slyly even requests among the carefully pending platelets wake along the final accounts. quickly expre +33|84|1287|310.76|dolites above the slyly express deposits try to haggle blithely special gifts. blithely ironic reque +33|9|6006|327.19|ly. ironic dependencies haggle carefully silent instructions. furiously ironic dolphins are fluffily furiously even theo +34|35|9934|848.75|ven instructions besides the gifts are furiously among the slyly regular packages! instructions use carefully. even requests sleep quickl +34|60|4749|265.31|ckly regular theodolites eat above the bravely regular courts. ironic requests wake slyly. +34|85|5459|824.69|ong the slyly silent requests. express, even requests haggle slyly +34|10|5884|609.69|ully final tithes. slyly ironic deposits hang furiously about the regular, regular deposits +35|36|2500|451.58|nic packages boost carefully carefully even theodolites. blithely fina +35|61|8875|537.72|ully regular deposits: special accounts use. slyly final deposits wake slyly unusual, special ideas. asymptotes +35|86|596|669.19|slyly against the daring, pending accounts. fluffily special pinto beans integrate slyly after the carefully unusual packages. slyly bold accounts besides +35|11|2025|411.17|s cajole fluffily final deposits. furiously express packages after the blithely special realms boost evenly even requests. slow requests use above the unusual accoun +36|37|3907|630.91|al deposits detect fluffily fluffily unusual sauternes. carefully regular requests against the car +36|62|174|434.47|permanently express instructions. unusual accounts nag toward the accou +36|87|2625|569.91|ctions. pending requests are fluffily across the furiously regular notornis. unusu +36|12|8209|289.15|arefully regular requests cajole. special, express foxes sleep slowly. quickly unusual in +37|38|7171|824.96|usly into the slyly final requests. ironic accounts are furiously furiously ironic i +37|63|5542|126.59|ven deposits. ironic foxes cajole. slyly final deposits are furiously after the furiously even packages. slyly ironic platelets toward the slyl +37|88|7113|15.72|re bravely along the furiously express requests. blithely special asymptotes are quickly. fluffily regular packages alo +37|13|1449|745.64|y after the ironic accounts. blithely final instructions affix blithely. bold packages sleep carefully regular instructions. regular packages affix carefully. stealthy fo +38|39|1226|570.11| slyly even pinto beans. blithely special requests nag slyly about the ironic packages. +38|64|4237|662.75|lar warhorses cajole evenly against the attainments. requests cajole furiously furiously express requests. carefully regular platelets use fluffily after the silent, unusual ideas: bl +38|89|1135|160.70|express accounts haggle. carefully even pinto beans according to the slyly final foxes nag slyly about the enticingly express dol +38|14|3516|847.09|nal accounts. furiously pending hockey players solve slyly after the furiously final dependencies. deposits are blithely. carefully regular packages unwind busily at the deposits. fluffily +39|40|3633|463.10|kages are slyly above the slyly pending pinto beans. bold, ironic pinto beans sleep against the blithely regular requests. fluffily even pinto beans use. regular theodolites haggle against the quic +39|65|3682|300.43|ng requests are according to the packages. regular packages boost quickly. express Tiresias sleep silently across the even, regular ideas! blithely iro +39|90|5475|532.26| beans cajole carefully carefully express requests. instructions sleep furiously bold deposits. furiously regular depos +39|15|6259|737.86|y. special, even asymptotes cajole carefully ironic accounts. regular, final pinto beans cajole quickly. regular requests use warhorses. special, special accounts hinder boldly across the +40|41|7690|776.13|lets use fluffily carefully final deposits. blithely ironic instructions sublate against the furiously final ideas; slyly bold courts x-ray silent foxes. regular foxes wake blithely. slyl +40|66|1704|565.82|riously furiously silent asymptotes. final deposits cajole blithely ironic requests. furiously special pains into the blithely final instru +40|91|4521|374.71|ptotes haggle. slyly even requests nag fluffily silent packages. blith +40|16|6617|196.64|he slyly unusual epitaphs? ironic deposits at the furiously unusual instructions thrash blithely requests. requests are carefully blithely pending waters. +41|42|9040|488.55|ss the dinos wake along the blithely regular theodolites. foxes cajole quickly ironic, final foxes. blithely ironic packages haggle against +41|67|5946|391.81| slyly slyly regular requests. final deposits sleep fluffily. blithely bold instructions detect carefully. blithely pending requests are furiously ironically final ideas. regul +41|92|1550|916.55| the blithely final ideas. furiously regular asymptotes could cajole furious +41|17|560|37.59|special pinto beans against the unusual accounts cajole slyly final foxes. close, ironic +42|43|2893|716.81|requests nag. furiously brave packages boost at the furiously even waters. slyly pending ideas nag carefully caref +42|68|2927|709.06|g dugouts. carefully careful ideas are fluffily. carefully final pinto beans snooze. ironic deposits wake evenly along +42|93|3500|200.00|against the ironic, ironic forges. slyly final deposits wake blithely. ironic courts sleep furiously ab +42|18|3662|29.46|es sleep slyly among the slyly final requests. bold theodolites use silently against the final foxes. carefully pending requests use furiously. dogged, unusual asymptotes use +43|44|3211|805.78|gular accounts. bold theodolites nag slyly. quickly express excuses use blithely. blithely even ideas boost fluffily! blithely unusual ideas detect bli +43|69|6770|493.19|ing to the quickly even theodolites. quickly bold excuses haggle. sometimes unusua +43|94|9506|493.65|riously! slyly ironic sauternes affix. ironic theodolites sleep furiously about the express packages. slyly ironic deposits are blithely against the regular package +43|19|3232|307.12|counts: express, final platelets use slyly bold ideas. ironic theodolites about the blithely s +44|45|486|164.22| final notornis throughout the unusual pinto beans are about the special accounts. bold packages sleep fluffily above the +44|70|5310|114.37|quests. quickly unusual requests against the carefully final somas detect slyly bold a +44|95|3534|383.01|r the pending pinto beans! requests wake furiously after the special deposits. silent deposits mold quickly along the express, special +44|20|4798|833.15| run. ironic, special dolphins according to the even, ironic deposits haggle carefully alongside of the carefully regular excuses. regular frays haggle carefully ironic dependenc +45|46|1685|919.63|he doggedly final accounts; carefully regular packages cajole idly regular idea +45|71|5202|877.29|ngage blithely after the final requests. bold accounts sleep blithely blithely express dependencies. pinto beans through the carefully regular hockey players wake +45|96|5669|532.70|es play carefully doggedly unusual requests. bold grouches against the furiously ironic dugouts sleep furiously qu +45|21|1872|155.32| ironic, even pinto beans. bold theodolites haggle after the furiously ironic accounts. slyly bold courts +46|47|4171|244.65|lly quiet instructions. furiously express requests among the final ideas cajole carefully bold waters. furiously regular pac +46|72|8518|106.80|e unusual instructions shall have to detect slyly blithely ironic foxes. bold requests impress silent foxes. ironic, quiet realms haggle quickly pending, express pinto be +46|97|7225|14.78|ously about the fluffily pending accounts. fluffily even dugouts are quickly slyly express platelets; quickly bold pearls sleep slyly even instructions. furiously ironic packages poach quic +46|22|1381|985.88|ending platelets are carefully regular accounts. fluffily even accounts against the dependencies nag carefully final, +47|48|6989|292.52|even ideas. blithely final requests boost blithely. final, ironic instruct +47|73|4458|539.47|; finally enticing theodolites cajole enticing, silent warhorses! slyly bold pains c +47|98|2896|74.54|grate final asymptotes. pending requests kindle carefully final frets. ironic deposits above the slyly e +47|23|5873|296.63|after the regular dependencies. final, bold pains sleep quickly pend +48|49|5052|611.16|posits are blithely blithely final foxes. blithely even deposits haggle fluffily express requests. furiously final theodolites use sl +48|74|9451|191.36|ckages cajole never even, special foxes. regular dependencies wake after the blithely ironic instructions. thinly ironic reque +48|99|5564|668.19|al pinto beans. furiously final frays use slyly according to the ironic theodolites. regular ideas cajole furiously after the slyly even deposits. +48|24|1719|606.16|forges lose. packages cajole regular, bold accounts. never ironic accounts may promise about the permanently bold deposits. always express requests cajole fluffily regular c +49|50|9056|35.11| bold deposits? final, bold pinto beans are furiously slyly regular packages. sly +49|75|6646|908.15|ts sleep across the fluffily final deposits. carefully express accounts around the regular, express excuses x-ray inside the ironic theodolites. expre +49|100|5336|713.25|ld accounts. furiously blithe waters use furiously blithely idle dependencies. pending deposits along the permanently re +49|25|597|812.62|n foxes snooze furiously. courts integrate never. carefully unusual requests are carefully. quickly ironic deposits ha +50|51|1832|565.54|liers above the dolphins dazzle across the regular foxes. furiously regular packages haggle furiously blithely ironic grouches. ironic, even accounts haggle pending, furious instruction +50|76|43|690.87|aggle daringly along the close, express deposits. final requests snooze carefully carefully bold deposits. carefully unusual ideas doze furiously after the furious +50|1|6160|301.06|arefully ironic requests use. furiously pending waters play carefully carefully regular platelets. sly requests cajole furiously slyly regular pinto beans. bold packages boost fluffily. furiously i +50|26|2104|107.17|t blithely unusual theodolites. quickly final accounts affix fluffily regular requests. c +51|52|837|310.74|ly dogged, regular dependencies. express, even packages are +51|77|7318|85.03|al foxes. carefully ironic accounts detect carefully-- slyly even accounts use. furiously final platelets shall haggle sometimes after the blithely regu +51|2|138|728.95|requests according to the carefully unusual deposits promise slyly ironic packages. slyly ironic dependencies are accordin +51|27|8062|901.04|le ruthlessly furiously slow requests. fluffily slow depende +52|53|6533|54.92|efully. slyly special deposits haggle along the quick deposits. slyly pending requests use quickly packages. final, final dolphins doubt according to the quickly unusual excuses +52|78|1937|210.44|s. never even asymptotes nag carefully! regularly unusual foxes along the unusual requests haggle accounts. fluffily express pinto +52|3|4084|628.53| deposits wake slyly pending asymptotes. ironic asymptotes haggle. blithely ironic requests are qui +52|28|5524|424.93|cial, ironic packages. even dolphins boost. slyly final deposits integrate. final sheaves along the silent excuses use at the slyly close foxes; bold accounts are finally even packages. ironi +53|54|6443|192.78|carefully ironic accounts. blithely bold deposits detect furiously against the flu +53|79|5319|563.44|ly. fluffily final pearls boost carefully. special sauternes nod furiously even instructions. carefully regular dependencies across the slyly regular deposits +53|4|8200|388.08|fully requests. furiously final accounts cajole express, regular pearls. special deposits wake fluffily express accounts. quic +53|29|6929|224.83|xes. carefully ruthless asymptotes impress slyly. fluffily final deposits sleep against the ideas. slyly final packages wake. pending, express packages sleep quickly. +54|55|2515|686.51|ly along the packages. blithely close pinto beans are blithely alongside of the unusual packages. carefully even platelets boost alongside of the even foxes. ironic de +54|80|7079|798.98|he carefully unusual packages wake according to the ironic dolphins. permanently regular sheaves nag quickly. regular, ironic +54|5|2386|23.78|kly ironic foxes. final instructions hinder doggedly. carefull +54|30|536|259.24| furiously along the fluffily regular requests. carefully unusual accounts use fluffily final platelets. pending deposits integrate furiou +55|56|7874|611.04|ly special packages. furiously even warhorses integrate. silen +55|81|8460|236.27|round the special, bold asymptotes cajole alongside of the instructions. qui +55|6|8278|134.62|gedly silent pinto beans! furiously regular sentiments was furiously across the silent pinto beans. pending warthogs along the slyly +55|31|1289|130.33|ut the blithely final requests. requests nag blithely. +56|57|241|855.39|nto beans. finally regular sauternes are. carefully bold deposits according to the blithely express requests wake carefully ironic excuses? furiously final deposit +56|82|9104|54.79|tructions above the blithely pending foxes cajole blithely furiously even sentiments. special, exp +56|7|1330|52.29|xpress instructions haggle furiously regular deposits. quickly unusual packages sleep furiously final pinto +56|32|5799|926.25|ades grow around the dependencies. carefully special ideas cajole furiously across the blithely express requests. unusual tithes are caref +57|58|2972|123.11| asymptotes use carefully furiously final deposits. quickly regular deposits are furiously slyly ironic requests. blithely even excuses haggle: blithely special ideas +57|83|4721|411.08|instructions. quickly unusual deposits about the furiously special ideas believe among the furiously bold theodolites. unusual, even ideas nag: slow, special theodolites hagg +57|8|3788|211.66|ly according to the ironic requests-- slyly final accounts print carefully depths? pending, unusual accounts solve +57|33|4583|137.68|ts. blithely bold theodolites can boost carefully carefully even instr +58|59|4328|542.52|ven deposits wake requests. quickly bold platelets sleep furiously after the ironic requests. even accounts haggle quickly bold +58|84|4307|448.31|quickly carefully ironic foxes. bold platelets nag furiously regular packages. slyly specia +58|9|4136|512.24|packages cajole slyly quickly pending depths. special, bold realms cajole slyly. slyly ir +58|34|9689|25.09|long the unusual, express asymptotes. ironic ideas boost bold, special deposits? ironic foxes among the fin +59|60|8374|357.22|c decoys. carefully even pinto beans wake slyly alongside of the express accounts. regular grouches haggle. +59|85|4226|80.98|lar packages. regular depths use slyly after the fluffily regular packages; theodolites around the furiously ironic asy +59|10|99|598.55|he special pinto beans. fluffily even accounts cajole. fluffily regular foxes haggle among the +59|35|8184|45.50|ependencies. ironic dependencies wake carefully according to the blithely bold packages. quickly unusual ideas about th +60|61|6642|800.72| blithely. slyly final realms alongside of the excuses use quickly blithely bold foxes. final theodolites are slyly after the slyly regular excuses. never thin foxes about +60|86|5017|314.81| even pinto beans wake carefully. quickly regular deposits hinder along the furiously regular pack +60|11|148|504.10|s use fluffily. furiously regular deposits boost furiously against the even instructions. blithely final platelets wake. carefully pending asymptotes sleep blithely. regular, s +60|36|5792|92.64|s the carefully pending deposits. slyly regular pinto beans against the furiously regular grouches lose carefully around the enticingly final ideas. furiously express packages cajole bold pa +61|62|1540|858.64| could have to use upon the packages. fluffily special packages integrate slyly final theodolites. pending warhorses wake quickly after the blithely final fo +61|87|9170|771.26|ly. pinto beans sleep blithely about the patterns. slyly final accounts wake according to the furiously bold requests. slyly regular packages wake according to the ironic packages. requests acros +61|12|4762|633.74|final theodolites haggle. fluffily express ideas about the silent theodolites cajole ideas; fluffily special instructions are accordin +61|37|7312|153.74|gly final instructions. pending theodolites will wake furiously. slyly bold instructions run. furiously special foxes cajole f +62|63|1780|692.42|s around the even ideas cajole furiously somas. silent asym +62|88|5896|348.82| final accounts. furious deposits wake slyly. idly regular packages haggle blithely pending grouches. ironic accounts boost blithely. carefully express pa +62|13|9127|620.08|totes. unusual requests after the unusual accounts sleep fluffily bold notornis. slowly careful requests use according to the final ideas. pinto beans sleep. foxes are furiously furiously pe +62|38|9542|255.78|lly express requests haggle carefully. idle, pending pinto beans are furiously regular excuses. quickly sly attainments are furiously; even accounts are slyly quickl +63|64|1804|498.84|leep bravely. final accounts nag. forges sleep against the slyly ironic pa +63|89|1998|509.16|yly express theodolites. slyly bold ideas sleep furiously accordi +63|14|6839|274.15| among the carefully ironic accounts. carefully even accounts against the regular, final deposits detec +63|39|6325|463.69|arly express accounts. express, unusual escapades haggle. special packages must wake. express, regular requests sleep furiously ironic packages +64|65|5567|228.61|y even instructions. unusual requests serve slyly. special foxes sleep quickly. fluffily ir +64|90|4542|398.92|. quickly final ideas cajole carefully among the blithely silent requests. sometimes ironic accounts nag furiously against the pending instructions. f +64|15|9110|602.65| ironic accounts are carefully carefully final accounts. slyly ironic packa +64|40|2064|25.77| quickly regular ideas. carefully final requests snooze carefully regular, regular instructions. stealthily final pi +65|66|2918|846.26|inal, even foxes cajole. furiously final dolphins hang quickly ironic foxes. furiously special packages alongside of the bold foxes solve above the carefully final instructio +65|91|1779|393.63|ully after the quickly regular ideas. ironic, final multipliers above the carefully bold deposits breach slyly furiously express deposits. unusual accounts haggle carefully idea +65|16|2054|503.10|e express excuses. ironic, even accounts across the reg +65|41|2188|288.73|lent requests nag quickly. blithely silent platelets haggle ironic accounts. slyly bold instructions boost carefully final accounts. carefully even dependencies must nag blithely; qui +66|67|3077|809.13|nod carefully besides the furiously final theodolites. slyly final requests haggle. furiously silent excuses detect quickly. ironic deposits detect above the furiously final +66|92|1076|785.75|its across the blithely regular theodolites wake furiously among the furiously regular accounts. pains are slyly care +66|17|2568|447.08|ously even accounts boost slyly daring requests. even, regular realms kindle blithely. unusual, ironic ins +66|42|296|797.27|s nag enticingly outside the furiously final foxes. final accounts haggle fluffily accord +67|68|9923|306.37|ly according to the quickly ironic requests. express instructions after the slyly even instructions x-ray blith +67|93|7908|546.75|furiously express dolphins integrate carefully regular notor +67|18|3368|625.62|le slyly regular requests: regular platelets wake quickly across the quickly regular accounts. reg +67|43|5826|397.34|en, ironic deposits affix quickly unusual requests. busily ironic accounts are finally never even sauternes. ironic depos +68|69|3444|31.37|es impress furiously pending packages. always silent instructions above the fluffily bold packages haggle slyly blit +68|94|6762|5.16|lithely. carefully even grouches along the bold deposits might sleep slyly requests. blithel +68|19|8300|80.86|nooze according to the furiously even ideas. blithely regular accounts wake blithely. furiously regular Tiresias cajole regular deposits. regular theodolites eat alongside of the +68|44|5399|683.59|. finally final pinto beans play carefully unusual requests. never pending accounts are. regular, final theodolites wake furiously excuses. special request +69|70|6197|694.24|eep across the packages. regular, final foxes boost fluffily regular pinto beans. packages sleep along the final requests. bold, unusual packages cajo +69|95|8235|846.49|nt fluffily. carefully ironic instructions wake. blithely express foxes cajole slyly. unusual requests sleep quickly. final packages affix slyly according to the spec +69|20|9294|386.96|ar packages. blithely regular dependencies are dolphins. slyly ironic excuses nag quickly pending, regular ideas. furiously special sheaves haggle. close, regular pinto beans about the slyly bold +69|45|7017|344.28|heodolites. unusual, regular requests boost slyly pending deposits. slyly daring instruct +70|71|4536|348.27|ructions. blithely final packages cajole carefully after the express, even requests. furiously final theodolites cajole +70|96|8063|452.80|y regular deposits nag about the carefully regular instructions; furiously express accounts along the final, express instruct +70|21|2990|940.81|s deposits. unusual foxes are carefully according to the carefully even deposits. carefully ironic foxes cajole fluffily against the carefully pending deposits. slyly special depo +70|46|9074|182.58|ions after the fluffily regular foxes wake above the furiously regular requests: slyly regular deposits wake slyly daringly even Tiresias. express, express deposits are. always unusual pa +71|72|508|842.21|es cajole carefully around the furiously pending instructions. +71|97|8329|239.57|ins sleep carefully slyly express accounts! quickly even accounts boost carefully about the carefully regular excuses. dogged, even dolphins against the sometimes ironic packages believe bl +71|22|6768|744.67|ructions. daring requests solve carefully about the furiously pending pinto +71|47|5179|329.13|usly at the packages. blithely regular deposits haggle regular packages. quickly special theodolites at the blithely ironic instructions wake +72|73|9855|497.26|tithes. quickly pending foxes haggle enticingly according to the accounts. accounts detect slyly: final packages wake. fina +72|98|9346|41.04| pending instructions before the even, silent dep +72|23|2654|762.61|nusual packages: blithely bold Tiresias sleep furiously. slyly brave accounts according to the final, +72|48|4526|154.47|use across the never ironic packages. express, regular accounts above the pending, fluffy deposits are carefully across the slyly even pinto be +73|74|9873|947.99|tes use pending packages. final foxes wake final, unusual packages. blithely blithe ideas haggle sometimes slyly express accounts. express instructions nag furiously quickly +73|99|7729|920.66|ecial accounts sleep according to the slyly sly accounts. slyly express instructions nag. accounts cajole furiously quickly even foxes. furiously regular requests wake. carefully even frets haggle +73|24|5327|108.96| beans are furiously between the regular ideas! unusual pinto beans use. furiously silent requests against the carefully even somas wake care +73|49|3928|309.57|longside of the blithely final ideas. carefully ironic courts sleep along the enticingly pending requests. fluffily regular accounts use fluffily bold ideas. slyly ironic packa +74|75|3128|345.92|ic theodolites. express deposits haggle blithely pending packages. quickly express foxes could are slyly. deposits sleep deposits. final dependencies sleep ab +74|100|2479|930.97|o beans sleep dependencies. regular accounts use blithely asymptotes. u +74|25|9473|496.36| haggle carefully alongside of the regular requests. slyly regular accounts belie +74|50|6234|849.66| slyly regular foxes. silent accounts integrate. even deposits are quick +75|76|7086|624.39|sits are furiously fluffily even courts. furiously pending requests are blithely. pending, regular accounts play carefully slyly unusual platelets. blithely final requests against the ru +75|1|6308|759.36|refully ironic dependencies. pinto beans use according to the packages. regular platelets wake around the blithely p +75|26|9080|433.59|sits. permanent packages breach. carefully final waters wake. bold, pending foxes haggle furiously evenly express instructions. even deposits about the final +75|51|5439|884.01|ding excuses snooze special accounts. tithes alongside of the regular dep +76|77|6754|494.83|gular accounts solve. ironic deposits sleep slyly even packages. slyly pending accounts detect slyly express accounts. ironic forges can play furiously carefully express fox +76|2|2009|108.97|n packages. blithely even accounts sleep carefully furiously ironic accounts. carefully express requests +76|27|6371|552.38|ts use against the quickly ironic ideas. quickly even deposits are carefully a +76|52|7986|252.03| packages across the furiously ironic platelets cajole across the regular, ironic accounts. carefully enticing accounts among the blithely regular instructions detect regular pinto be +77|78|552|254.92|e after the carefully pending packages. carefully even dependencies cajole pending +77|3|8170|875.83|xcuses. blithely even foxes use fluffily. blithely even requests use. slyl +77|28|8541|936.13|e slyly express instructions haggle about the sometimes regula +77|53|1713|402.14|the even ideas kindle after the requests. regular theodolites cajole carefully about the blithely final ideas. carefully even dependencies at the flu +78|79|9915|729.94|around the special excuses. furiously even deposits serve boldly according to the platelets. carefully express accounts at the blithely unusual pinto beans sleep furiously against the u +78|4|7246|577.23|regular dependencies cajole doggedly ironic accounts. bold theodolites doze about the accounts. quickly final requests boost slyly final asymptotes. carefully final dolphins ha +78|29|1801|434.34|nts kindle furiously according to the even packages. blithely ironic platelets are slyly silent foxes. final, final packages would sleep. pinto beans a +78|54|9599|382.82| carefully special theodolites cajole among the quickly even asymptotes. foxes wake blithely across the carefully +79|80|4248|765.34|nusual, express asymptotes wake furiously. ironic pinto beans detect above the carefully express theodolites: even, dogged instructions nag. spe +79|5|465|28.33|uriously special frays cajole across the finally ironic pinto beans. ironic accounts sleep blithely. fluffily silent accounts are slyly at the slyly unusual ideas. even deposits nag slyly +79|30|3309|880.23|tect final, thin accounts? furiously ironic accounts boost regular deposits. carefully ironic attainments sleep. furiously special ins +79|55|8627|891.18|r dolphins grow blithely against the slyly ironic packages. deposits about the regular, ironic decoys are slyly around the carefully regular packages. slyly pending excuses sle +80|81|8893|127.65|ld accounts detect carefully. carefully bold courts along the regular deposits could have to affix ca +80|6|2243|775.79|endencies. bold, regular pinto beans wake furiously above +80|31|5385|945.72|cial asymptotes believe after the blithely unusual deposits. furiously silent pinto beans cajole quickly inside the slyly even deposits. regular, f +80|56|4034|797.05|ptotes cajole carefully. express ideas cajole carefully even somas. final pinto beans print fluffily across the +81|82|1605|550.29|es haggle blithely fluffily final requests. furiously regular foxes use. furiously unusual requests outside the furiously regular requests +81|7|5923|220.23|the final, quick accounts are blithely above the s +81|32|2942|409.73|accounts boost. fluffily unusual requests cajole fluffily slyly ironic requests. foxes cajole quick +81|57|58|492.19| instructions boost furiously across the foxes-- final depo +82|83|7793|697.31|he accounts cajole quickly after the even patterns. ironic platelets sublate regular, even asymptotes. quick courts affix according to +82|8|7698|585.86|pinto beans. slyly express excuses haggle. blithely even pinto beans about the quick inst +82|33|8268|604.25|e after the carefully even theodolites. regular, pending accounts boost. quickly final asymptotes haggle slyly. requests use final, bold pinto beans. bold, ruthle +82|58|5532|900.07| slyly? fluffily special dependencies haggle among the slyly special requests. regular, bold packages after the blithely ironic packages are slyly ironic packages. slyly final deposits w +83|84|3010|745.51|l foxes along the bold, regular packages integrate carefully express courts! final excuses sleep carefully ironic +83|9|8200|399.64|y final platelets are carefully carefully special platelets. carefully ironic requests wake blithely alongside of the slyly even accounts. bold, regular requests sleep +83|34|5974|657.22| even packages boost furiously. slyly regular gifts above the accounts are quickly express packages. slyly pending deposits besides the express, even asymptotes haggle after the ironic ins +83|59|3890|24.73|deposits. carefully even dependencies across the dependencies haggl +84|85|5711|233.61|arefully final platelets cajole blithely; quickly final accounts use furiously. furiously reg +84|10|208|469.80|carefully express dolphins nag about the slyly bold requests. slyly even packages wake among the furiously special attainments. +84|35|2909|969.44|silent requests cajole slowly bold ideas. special, special deposits according to the always silent packages are against the furiously silent packages. even, blithe accounts sleep slyly across +84|60|903|707.77|gly regular dependencies boost. slyly even accounts sleep. furiously final hockey players wake carefully with the reg +85|86|2628|608.77|xes wake furiously after the carefully even platelets. blithe theodolites are furi +85|11|118|917.83| against the even deposits. furiously bold ideas along the furious requ +85|36|2074|491.20|encies-- slyly regular requests about the quiet accounts detect quickly at the +85|61|8289|73.81|s cajole slyly along the slyly special accounts. regular, special deposits wake. furiously special foxes boost. blithely even packa +86|87|806|65.98|ackages. blithely pending accounts are slyly furiously pending theodolites. furiously eve +86|12|2773|250.04|ding accounts. slyly special requests will have to affix carefully along the furiously unusual packages. regular theodol +86|37|5546|816.53|s. slyly final requests wake. furious deposits must wake blithely among the blithely ironic instructions. special hockey players try to are bli +86|62|1418|332.65|press theodolites sleep carefully about the blithely unusual requests. quickly final deposits breach slyly +87|88|5679|688.33|t the carefully regular asymptotes. blithely stealthy pinto beans within the furiously expres +87|13|1272|435.42|ronic foxes sleep along the special foxes. final ideas wake quickly about the carefully special theodolites. blithely ironic packages are blithely. regular, regular pint +87|38|9041|617.20|furiously final deposits. furiously special dependencies solve across the regular, special ideas. carefully silent requests haggle furiously after the special, specia +87|63|1892|868.60|arhorses are. unusual requests use blithely furiously final ideas. final requests sleep theodoli +88|89|6116|334.58|ect furiously around the regular deposits. special, final platelets boost furiously. blithely unusu +88|14|395|71.50| the regular accounts-- furiously even accounts use quickly after the regular, regular deposits. furiously e +88|39|9979|81.82|f the regular, regular requests believe fluffily along the final, quiet decoys. furiously even accounts cajole. carefully express requests wake quickly among the ideas. quickly silent +88|64|276|821.43|gular pinto beans. slyly pending excuses breach blithely express accounts. thin deposits sleep slyly around the even accounts; fluffily busy patterns kindle. slyly final deposits along the +89|90|3430|744.87| integrate slyly dolphins. bold, final frets use beside the carefully even accounts. slyly close dependencies sleep quickly carefully final pinto beans. foxes promi +89|15|8599|776.53|ress packages use furiously. furiously regular packages thrash blithely about the slyly pe +89|40|7876|417.61|nstructions: furiously even requests are quietly unusual accounts. regular requests are after the blithely regular deposits. sl +89|65|924|920.02|ickly unusual asymptotes after the slyly unusual accounts are carefully doggedly ironic accounts. even, final accounts use furiousl +90|91|8037|409.38|eas. unusual, pending packages boost quietly final accounts. slyly final packages serve. slyly even instructions sleep carefully. quickly even foxes wake quickly. +90|16|9683|498.43| accounts! fluffily regular deposits x-ray about the unusual, final packages. furiously final deposits alongside of the caref +90|41|7849|666.13|carefully ironic accounts are around the slyly bold asymptotes. carefully regular packages use furiously. ironic platelets affix carefully final accounts-- fluffily final pinto beans across the fina +90|66|7629|50.84|onic requests wake fluffily unusual packages. furiously even frays after the daringly pending requests wake furiously alongside of the bold requests. fluffily ironic ideas nag. ironic, +91|92|7986|528.64|luffily final instructions. furiously unusual foxes haggle +91|17|3257|906.20|ackages cajole slyly. blithely bold deposits cajole. blithely +91|42|483|823.21|n: slyly ironic foxes nag blithely according to the furiously bold foxes. regular, regular accounts a +91|67|1265|703.41| quickly silent deposits use attainments. final requests along the carefully ironic accounts wake blithely about the carefully ironic excuses. furiously bold excuses wake final, final ex +92|93|9337|224.01| requests are slyly along the deposits. fluffy pains alongside of the deposits +92|18|2246|985.03|jole enticingly regular asymptotes. carefully unusual pinto beans nag carefully ironic ideas. quickly un +92|43|3199|91.63|ake carefully: carefully ironic requests sleep careful +92|68|1044|854.89|l instructions are fluffily silently regular accounts. quickly final dolphins w +93|94|3008|615.98|sits promise blithely fluffily special decoys. slyly regular packages along the slyly final deposits wake accord +93|19|5275|376.47|ounts boost fluffily along the thinly regular realms. busily regular a +93|44|3869|868.81|ly among the furiously silent accounts. closely regular pinto beans nag slyly! slyly e +93|69|7188|805.90|y furiously bold pinto beans. express asymptotes was quickly. carefully final accounts affix slyly! platelets according to the ca +94|95|5433|365.56| even excuses wake carefully. quickly unusual requests wake accounts. regularly pending packages are regular +94|20|7784|358.08|ironic packages wake slyly carefully regular accounts. quickly regular warhorses against the blithely ironic packages haggle doggedly sly +94|45|7232|478.94|y regular requests. carefully final asymptotes haggle carefully against the slyly unusual requests: blithely brave grouches are fu +94|70|3261|824.08|quests. enticingly final accounts sleep fluffily. quickly express asymptotes around th +95|96|5186|291.03|ites across the blithely pending theodolites do affix across the unusual, bold Tiresias. bold packages +95|21|6552|456.36|tes; final, final accounts boost blithely ironic pinto beans. blithely ironic deposits cajole above the quickly pending requests? i +95|46|367|987.22| express requests detect furiously. requests cajole carefully +95|71|7379|973.74| above the furiously unusual deposits haggle ironic ideas. express, even packages haggle slyly slyly special asymp +96|97|5739|202.06|re. slyly regular theodolites breach slyly even dinos. fluffily regular asymptotes haggle slyly. fluffily bold courts affix furiously. regular requests +96|22|4942|571.30|e carefully. bold packages sleep against the furiously express requests. express foxes above the dependencies use quickly according to the slyly expres +96|47|9985|672.29|ecial instructions-- blithely silent theodolites play. even, silent accounts sleep. blithely silent requests haggle final, f +96|72|7250|587.08|efully ironic foxes. regular, final pinto beans boost above the express a +97|98|6371|129.77|fluffily unusual accounts. slyly regular theodolites integrate furiou +97|23|2390|458.34| carefully unusual pinto beans; even deposits detect furiously +97|48|2618|239.34|al theodolites are daringly requests. warhorses sleep blithely requests. special accounts cajole slyly deposits. a +97|73|4580|761.41| beans. carefully final deposits alongside of the carefully final requests haggle idly blithely ironic accounts. foxes cajole slyly against the ironic, special packages. furiously brave excuses boo +98|99|9486|908.21|usly final deposits mold furiously above the even deposits. carefully ironic packages across the quickly regular dolphins are slyly according to the slyly even +98|24|8550|657.16| sleep carefully. bravely bold somas may sleep pendin +98|49|3443|139.00|gular pinto beans maintain quickly fluffily regular deposits. express requests sleep. even requests after the regu +98|74|3759|811.55|iously. final, express packages are across the ironic dependencies. slyly thin ideas according to the even Tiresias detect furiou +99|100|8487|438.38|lphins affix ironic packages. blithely ironic requests nag fluffily after the slyly ironic foxes. bold dependencies boost furiously. special, +99|25|7567|496.93|es? permanently even excuses haggle quickly across the dependencies. +99|50|7970|365.83|ending accounts cajole furiously. requests promise care +99|75|2789|843.88|ending accounts. furiously sly packages above the carefully unusual dolphins sleep after the thinly even deposits. requests wake abo +100|1|7885|490.61| accounts nag slyly against the bold excuses. pearls according to the fluffily ironic accounts haggle fluffily along the quickly final platelets +100|26|2070|196.73| dolphins. bold deposits along the even theodolites sleep furiously about the final pinto beans. furiously unusual courts cajole about the carefully bold asymptotes. accounts integrate slyly entic +100|51|4994|929.57| deposits. accounts are slyly regular ideas. slyly special pinto beans upo +100|76|9688|22.00|uctions according to the carefully ironic deposits haggle carefully express ideas? packages across the quickly final requests c +101|2|5589|305.40|blithely above the fluffily pending ideas. quickly quick accounts nod ruthlessly above the carefully pending packages. slyly s +101|28|8263|218.71|fluffily final requests. carefully even packages wake quickly about the quickly ironic foxes. fluffily even requests hang quickly about the pending, final requests. sp +101|54|6324|786.53|olites sleep quickly. slyly ironic theodolites affix. furiously bold accounts integrate among the pinto beans. final ideas hang slyly along the quickly regular packages. instructions cajole. +101|80|55|612.09|beans against the carefully express ideas wake quickly along the quickly unusual requests. blithely regular accounts cajole fluffily. enticingly pending theodolites haggle furiously fluffily pendi +102|3|1384|876.75|s wake quickly. carefully express deposits wake. silent, regular requests sleep slyly after the furiously ironic deposits. slyly unusual accounts cajole +102|29|9137|332.71|telets are final, special deposits. silently ironic deposits wake. pending, eve +102|55|9156|618.00| the unusual, ironic pinto beans. theodolites above the foxes sleep slyly car +102|81|6942|231.02|tions haggle against the furiously ironic deposits. quickly final asymptotes haggle carefully. regular sentiments might cajole silent courts. blithely bold frays +103|4|5913|905.88|e across the theodolites. carefully pending escapades haggle after the ironic theodolites. furiously pending ac +103|30|7742|414.42|bout the bold, regular deposits; blithely even accounts are regular, even platelets-- carefully express accounts nag slyly pen +103|56|5164|361.48|furiously thin deposits haggle blithely. blithely regular deposits above the carefully regular accounts are slyly carefully regular packages. silent, unusual +103|82|429|605.20| theodolites cajole quickly above the asymptotes-- slyly special packages can haggle carefully blithely final instructions. unusual, regular ideas +104|5|2368|946.39|packages. final packages wake enticingly. furiously regular asymptotes are always about the carefully regular deposits. slyly regular platelets cajole carefully. final pinto beans must pro +104|31|6110|15.57|ending requests. carefully regular deposits use blithely. bold, ironic deposits wake slyly carefully specia +104|57|6269|213.89| ideas against the final accounts wake slyly regular notornis. final deposits haggle a +104|83|3369|729.38|ong the foxes. foxes sleep quickly? carefully regular accounts sleep. special foxes boost quickl +105|6|4602|27.75|lar pearls cajole never carefully even depths. blithely regular ideas are quickly. unusual asymptotes nod carefully carefully regula +105|32|269|158.62| unusual courts eat pending excuses. ironic, ironic requests use. bravely +105|58|8855|810.86|. slyly special depths sleep. bold packages engage furiously bold packages. fluff +105|84|8519|904.17|ding to the furiously careful ideas. dogged theodolites wake fluffily among the slyly bold ideas. blithely brave warthogs above the slyly even theodolit +106|7|8649|732.15| slyly ironic instructions are. bold, final accounts cajole slyly ironic pinto beans. fluffily ironic accounts around the quickly special requests use blith +106|33|3144|779.68| final deposits along the slyly express theodolites cajole blithely after the ironic pinto beans. furiousl +106|59|1411|310.40|al accounts impress. even instructions engage furiously final foxes. silently final deposits wake qui +106|85|2297|281.98|inal packages. pending foxes sleep bold hockey players. courts across the blithely regular packages sleep fl +107|8|7249|168.03|he fluffily even packages. slyly regular dependencies nag fluffily above the final, unusual foxes. final, pending foxes affix. furiously final deposits cajole quickly blithely +107|34|4029|91.31|integrate. requests maintain quickly. carefully regular ideas about the instructions sle +107|60|4667|372.94|uctions sleep doggedly final requests. express, final theodolites cajole fluffily furiously silent deposits. blithely regular requests cajole quickly regular instruction +107|86|7912|474.77|fluffily across the final, bold accounts. quickly regular deposits grow carefully deposits. regular requests haggle blithely. slyly special platelets boost furiously care +108|9|4149|558.85| of the quickly pending theodolites. fluffily unusual frays wake accounts. carefully even foxes wake slyly. carefully special pinto beans +108|35|4898|241.47|lthily according to the fluffy deposits. furiously silent ideas according to the furiously special theodolites wake furiously a +108|61|5534|626.89|instructions. blithely regular instructions according to the permanent foxes cajole blithely slyly fluffy foxes. slyly regular asymptotes cajole foxes. slyly unusual deposits +108|87|3142|922.27|slyly express accounts are fluffily along the blithely unusual packages. pinto beans mold furiously. furiously bold instructions are blithely deposits. quickly special accounts detect t +109|10|524|275.19|st the permanently final requests. carefully pending pinto beans haggle quickly slyly ironic dolphins. blithely bold deposits wake blithely. even requests cajole foxes. iro +109|36|4470|992.21|ake furiously packages. blithely even foxes haggle furious +109|62|8176|936.60|d the express accounts. even theodolites wake quickly up the furiously bold foxes. furiously regular packages use regular, bold +109|88|7524|374.49|sual requests. final pinto beans cajole furiously. dependencies integrate slyly even excuses. blithely special requests wake around the slyly final pinto beans. furiously pending requests wake furi +110|11|2782|566.46|ly sly deposits. regular deposits are; theodolites haggle furiously bold foxes. final pinto beans wake blithely furiously ironic depths. unusual, regular platelets cajole. final, ironic +110|37|8914|183.47|yly even foxes. carefully regular requests doubt. pending, regular requests across the blithely final theodolites hag +110|63|1160|932.08|ake blithely. furiously ironic accounts sleep fluffily +110|89|4927|196.63|theodolites. instructions haggle even packages. waters impress furiously quickly express courts. furiously ironic depths nod quickly? ironic, ironic requests sle +111|12|1890|321.97|st foxes. daring depths use above the furiously special ideas. ironic foxes among the carefully final theodolites are alongside of the regular depths. e +111|38|9587|978.65|express instructions against the furiously final grouches haggle across the blithely ironic theodolites. slyly special dependencies in place of the carefully pending +111|64|8069|745.33|thely bold requests. unusual packages sleep. quickly pending ideas nag furiously to the carefully final p +111|90|2175|496.08|s around the daringly final pinto beans use furiously against the pi +112|13|8509|111.42|unts. carefully ironic instructions are final, bold foxes. bold excuses run according to the unusual packages. theodolites cajole carefully according to the fluffily pending deposits? sly +112|39|7652|783.52| carefully among the furiously final packages. regular instructions nag. slyly pending ideas hang fluffily blithely ironic instructions. ironic deposits haggle except the quickl +112|65|4835|913.75|ach slyly special dependencies. furiously ironic pinto beans sleep slyly pen +112|91|1211|815.88|l requests integrate furiously. quickly quiet packages are carefully regular accounts. regular packages eat quickly express, ironic sheaves. quickly dogged accounts o +113|14|9981|396.26|ithely express pains lose bravely fluffily pending foxes. blithely ironic sauternes cajole q +113|40|3804|860.68|ully about the carefully even accounts: thinly even foxes are carefully. +113|66|522|981.41| warthogs use quickly alongside of the furiously unusual requests. final deposits are blithely acro +113|92|4692|141.48| blithely unusual gifts snooze against the quickly ironic packages. regular packages across the carefully regular packages bo +114|15|7146|447.24|ideas will nag regular accounts! carefully final requests cajole furiously quickly final tithes. furiously express instructions a +114|41|3062|555.12|ts. furiously regular requests run carefully thin decoys. ironic platelets sleep alongside of the slyly silent deposits. reg +114|67|4519|382.87|nts. ironically express dolphins dazzle blithely. special instructions wake carefully along the ideas. quickly special dolphins sleep. furiously pendi +114|93|2113|570.79|o beans sleep among the ironic excuses. furiously even sheaves are. never regular instructions nod. +115|16|1817|82.84|uffily final accounts integrate furiously along the carefully busy excuses. slyly even asymptotes doubt quickly. fluffily thin theodoli +115|42|983|867.45|kly. requests nag after the blithely bold packages. express requests cajole theodolites. blithely express requests sleep after the furiously regular accounts. fluffily r +115|68|7781|861.93|lyly ironic pinto beans affix alongside of the furiously even ideas: quickly bold warhorses sle +115|94|3002|81.52|efully after the quickly regular deposits. daringly pending ideas sleep even ideas. silent, re +116|17|6580|705.50|iously. slyly regular requests detect slyly. carefully bold packages sleep furiously carefu +116|43|4975|413.86|tions. regular excuses detect. ideas haggle slyly about the slyly ironic courts. ironic foxes solve. ideas affix fluffily after the special, even dependencies. final platelets according +116|69|8679|866.56|aphs cajole blithely regular accounts. even packages doubt; bold instructions boost quickly. fluffi +116|95|5632|37.30|ccounts about the special packages nag across the carefu +117|18|5906|706.51|into beans sleep carefully blithely bold packages. even, bold instructions use across the carefully e +117|44|1986|322.08|eposits. special pinto beans use fluffily across the furiously regular pinto beans. furiously regular epitaphs nag fluffily packages. special accounts a +117|70|2577|761.86|riously. doggedly unusual ideas boost blithely blithely regula +117|96|4762|552.88| run furiously ironic accounts. slyly ironic deposits haggle slyly fluffy requests. flu +118|19|694|744.73|refully slow requests. requests against the special pac +118|45|6326|325.61| packages. express, final frays affix quickly above the final asymptotes. carefully regular requests doubt quickly f +118|71|7806|283.27| accounts affix carefully. regular, regular packages among the brave, pendin +118|97|4951|976.55|s orbits. even asymptotes above the instructions wake fluffily according to the sly, final excuses. express deposits across the blithely ironic depend +119|20|2307|473.64| blithely unusual dolphins boost busy, express ideas. regular requests use carefully furiously ironic deposits. carefully regular packages would sle +119|46|1452|676.92|ular instructions was slyly. furiously bold gifts boost f +119|72|4955|488.93|ias are along the express requests. fluffily pending ideas nag idly against the fluffily bold instructions? foxes cajole quickly. slyly special deposits haggle slyly e +119|98|583|782.47|yly pending requests-- carefully special instructions haggle carefully even instructions. blithely regular theodolites detect blithely final ideas. blithely ironic deposits among the sl +120|21|4976|201.21|inal, regular pinto beans haggle carefully! ironic ideas unwind among the slyly regular theodolites. regular platelets kindle blith +120|47|7744|365.79|l, special escapades! ideas sleep slyly instructions. carefully bold requests are. even accounts cajole. final accounts use slyly +120|73|5329|249.61|s cajole blithely. carefully bold requests believe blithely? brave accounts above the pending, dog +120|99|3102|566.34|ctions; realms beside the blithely final theodolites unwind blithely packages. regular dolphins sleep carefully-- carefully express accounts wake quickly. pending depths use never courts. +121|22|9741|147.45|ly according to the carefully regular asymptotes. silent excuses cajole carefully against the never silent instructions. furio +121|48|4246|850.42|usly final instructions. theodolites are according to the permanently ironic accounts. carefully pending accounts haggle about the pending instructio +121|74|7670|449.39|carefully daring packages. express packages use carefully about the quickly unusual packages. special ideas along +121|100|8709|655.22| detect carefully along the carefully even pinto beans. gifts haggle: ideas sleep ar +122|23|1019|451.29| blithely regular accounts. blithely final pains sleep besides the blithely final warhorses. furiously unusual requests haggle furiously +122|49|2490|637.28|efully special excuses grow slyly unusual packages. carefully quiet as +122|75|4957|650.84|quests. quickly bold requests nag across the furiously ironic accounts. ironically express instructions detect slyly carefully ironic requests. even, un +122|1|2083|739.25|counts. unusual requests alongside of the regular requests are carefully stealthy instructions? regular sauternes cajole. final theodolites breach carefully at the blithely final idea +123|24|9881|107.03|fully bold deposits detect slyly pending instructions. slyly special ideas detect blithely. slyly fluffy instructions hinder +123|50|5638|818.19|thely even pinto beans. furiously regular asymptotes affix furiously. regular, ironic tithes integrate quickly. blithely regular requests breach finally. decoys alon +123|76|2692|217.01|he ironic accounts nag fluffily after the bold, pending theodolites. blithely final ideas sleep carefully according to the blithely ironic foxes. regular requests are. furiousl +123|2|5311|149.65|eposits cajole according to the carefully pending packages. furiously final epitaphs solve alongside of the even requests +124|25|7102|901.98|ily accounts. furiously busy theodolites above the deposits thrash above the blithely final foxes. express instructions nod slyly furiously busy packages. special asymp +124|51|3969|908.64|l epitaphs. packages cajole among the furiously regular requests. closely +124|77|9295|882.54|s along the accounts poach quickly ironic deposits. even, final excuses thrash carefully about the express, special pains. carefully careful accounts breach slyly +124|3|9416|822.78|ously. theodolites affix around the slyly bold packages. even, ironic packages are carefully pains. furiously unusual requests sleep blith +125|26|2263|358.45|e. ironic, regular requests cajole fluffily along the even ideas. final ideas wake blithely. blithely bold +125|52|8276|668.65|nd the carefully express requests. slyly regular requests haggle. blithely unusual platelets solve fluffily fluffily regular +125|78|2600|455.70|ounts. thinly special accounts cajole carefully. even, special accounts after +125|4|5546|806.66| to the unusual courts are deposits! final, final pinto beans solve slyly. ironic accounts boost fluffily. furiously pending d +126|27|2647|221.89|lyly final pinto beans across the regular, even courts use slyly slyly pending braids! unusual requests along the furious +126|53|2373|194.38|fter the ideas. blithely daring sheaves print furiously among the blithely final packages. iron +126|79|1532|451.61|refully alongside of the quickly bold excuses. enticing, bold +126|5|5458|929.43|leep to the furiously special accounts. furiously final courts +127|28|7658|712.33|al pinto beans! slyly ironic excuses boost after the packages. express foxes integrate carefully. pending, regular theodolites +127|54|1467|237.98|regular accounts! quickly ironic packages haggle according to the accounts. carefully ironic +127|80|8281|3.14|ts above the furiously pending asymptotes cajole after the deposits. slyly ironi +127|6|8894|73.42|fter the sometimes special courts sleep about the slyly unusual reque +128|29|6982|425.29|ironic asymptotes. fluffily ironic packages use. ironic, regular ideas are in place of the quickly silent deposits. final, bold gifts across the ironic, regular pac +128|55|7602|224.49|xcuses. blithely unusual theodolites use slyly carefully even warthogs. slyly even dugouts haggle slyly final, express pinto beans. furiously bold packages thrash requests? slyly unusual packages +128|81|3766|947.16|arefully regular packages boost regularly. accounts are according to the blithely even dependencies. slyly silent accounts doubt slyl +128|7|7023|875.78| furiously quickly regular pinto beans. always special requests are. quickly regular deposits are furiously. slyly unusual theodolites haggle evenly; furiously special deposits wa +129|30|5721|129.69|ully express requests above the ironic, final requests cajole slyly along the quickly special packages. sl +129|56|7242|200.26|es across the furious escapades wake quickly slyly e +129|82|5299|330.59|final sentiments affix atop the silent foxes. busy pinto beans cajole. slyly final pinto beans haggle against the carefully expres +129|8|1968|27.22|ealthy, ironic deposits. slyly ironic pinto beans are blithely pinto beans. blithely ironic +130|31|4928|223.38|ths. slyly even theodolites detect according to the slyly final courts. carefully unusual deposits ar +130|57|6909|275.58|lly unusual accounts try to boost along the special packages. furiously bold requests x-ray blithely ironic waters. slyly unusual orbi +130|83|4850|442.81|ully regular deposits snooze. slyly silent foxes detect furiously furiously bold requests. slyly regular accounts breach. blithely bli +130|9|7387|883.99|aggle furiously. even ideas hinder deposits. even, final ideas are. unusual theodolites after the special, express foxes haggle carefully pending accou +131|32|3263|211.70|sits sleep quickly regular multipliers. slyly even platelets cajole after the furiously ironic deposits. slyly ironic requests should have to cajole: bl +131|58|125|861.84|l accounts grow quickly-- slyly ironic requests haggle? quickly express pinto bean +131|84|5138|572.43|grouches run with the carefully even packages. ironic, even deposits run slyly along the packages. special dependencies among the regular +131|10|8945|613.09| are carefully along the quickly final theodolites. packages after the quickly pending package +132|33|3092|687.29|y special decoys against the ideas affix against the sly +132|59|1904|925.73|the regular foxes wake ironic deposits. ironic, special requests use blithely instructions! final requests hang. blithely regular deposits haggle. ir +132|85|7441|357.06|ests. furiously unusual requests wake furiously. quickly unusual depos +132|11|5303|353.06|ep blithely after the sly accounts. slyly express dolphins cajole amon +133|34|5727|49.17|boost blithely across the ironic, regular instructions. packages use slyly unusual requests. bold accounts above the fu +133|60|404|478.18|ly ironic requests run instead of the blithely ironic accounts? regular ideas use fluffily: even, express packages sleep abov +133|86|4568|57.48|dolites. ironic accounts are blithely pinto beans. regular pinto beans haggle beneath +133|12|2813|277.26|s. pending, final accounts haggle blithely furiously pending deposits! carefully unusual attainments integrate. blithely bo +134|35|8879|848.14|lites. slyly final foxes after the bold requests cajole carefu +134|61|9013|102.99|pendencies. furiously express warthogs cajole furiously ironic, regular asymptotes. bold deposits boost among the furiously even theodolites. regular instructions integrate carefully +134|87|852|927.45| sleep unusual, express packages. unusual sentiments are furio +134|13|6270|388.28| to the furiously pending deposits nag along the slyly express asymptotes. slyly silent accounts shal +135|36|6940|465.82|ding foxes cajole. even dugouts haggle busily. fluffily pending packages about the express excuses boost slyly final packages. blithely express ideas cajole about the carefu +135|62|2443|9.83|atterns. pending, special deposits are furiously. express, regular deposits integrate quickly. unusual gifts cajole blithely stealthily pending deposit +135|88|7453|698.42|ven accounts. slyly final instructions nag slyly around the regular, unusual packages. slyly sp +135|14|2771|306.43|old deposits. furiously express instructions boost. pending dolphins use requests. slyly regular packages cajole quickly final ideas. pending, regular ideas nag carefully even, express pla +136|37|2237|548.19|ond the silent accounts haggle above the blithely regular packages +136|63|6068|806.19|structions. ironic theodolites haggle according to the final, daring pearls. carefully ironic somas are silently requests. express pa +136|89|8979|387.57|ans. express pinto beans wake carefully among the slyly ironic foxes: carefully final pinto beans haggle blithely. pending, final deposits promise furiously +136|15|9617|525.81| across the carefully pending warthogs. close, regular packages are quickly after the never ironic foxes. accounts sleep quickly along the furiously regular re +137|38|9057|302.26|slyly about the regular instructions. even, ironic theodolites use carefully around the even decoys. unusual, pending dolphin +137|64|4078|441.11|packages. blithely unusual sentiments should are. furiously regular accounts nag quickly carefully special asymptotes! idly ironic requests dazzle bold requests. carefully expres +137|90|467|371.85|ly special accounts detect carefully. furiously ironic deposits nag express packages. slyly quiet +137|16|7850|187.31|atelets sublate fluffily. enticingly unusual packages boost according to the blithely ironic foxes. pending requests mold sly +138|39|133|576.96|regular, final deposits maintain slyly even requests. regularly furious deposits use above the stealthy requests. ironic deposits are. carefully final frays are carefully. carefu +138|65|2535|885.35|lar deposits. courts sleep carefully. furiously express ideas boost furiously after the final, regular foxes. furiously bold deposits are. express accounts haggle blithely. +138|91|7907|119.83|epitaphs? quickly express foxes use pending accounts. special packages cajole blithely among the quickly unusual accounts? boldly ironic packages across the slyly ironic senti +138|17|967|309.03|pendencies integrate against the unusual pains. carefully unusual theodolites wake quickly across the deposits. blithely regular deposits alongside of the carefully regular deposits +139|40|2886|285.75|fully ironic requests according to the quickly final idea +139|66|9255|684.61|ickly furiously regular excuses. boldly express deposits sleep. ideas nag above the silent dependencies. slyly regular packages wake furiously. requests are carefully. quickly final fox +139|92|1042|972.23|gular, regular theodolites. regular asymptotes haggle carefully according to the permanently even deposits. slyly special account +139|18|3285|690.00|xpress pains. quickly regular ideas after the special, bold excuses wake furiously final ideas. slyly bold accounts nag packages. ironically regular +140|41|2379|501.05|of the silent, bold courts. slyly regular dependencies haggle. fluffily special deposits cajole carefully. quickly ironic depos +140|67|3533|781.45|ayers. carefully ironic pinto beans nod carefully furiously regular pinto beans. slyly ironic requests after the carefully regular packages are about the blithel +140|93|304|45.84|ing requests. carefully unusual foxes are final requests. slyly regular accounts wake permanently. quickly ironic theodolites hagg +140|19|7346|429.52| special pinto beans wake carefully unusual warthogs! furi +141|42|6776|293.63|fluffily unusual courts sleep. close pinto beans haggle quickly after the carefully ir +141|68|1660|139.18|egular accounts. enticingly bold theodolites eat slyly across the never ironic platelets. theodolites wake bli +141|94|7628|838.08|sly about the pinto beans. blithely ironic ideas sleep. foxes are quietly among the pinto beans. carefu +141|20|90|810.68|e doggedly regular ideas. foxes haggle slyly. slyly regular theodolites across the carefu +142|43|9219|897.49|thlessly special requests sleep blithely about the bold deposits. express, ironic instructions wake. final packages are blithely. deposits are carefully furiously even deposits. furiously regular a +142|69|13|334.33|are blithely blithely brave requests. slyly regular theodolites are furiously. blithely ironic dependencies haggle blithely. furiously unu +142|95|3076|860.55|gular requests about the pending packages wake furiously dogged accounts. th +142|21|3858|854.08|efully special deposits. blithely bold pinto beans haggle. slyly final ideas boost blithely. finally special requests mold along the blithely express packages. entic +143|44|7326|960.64|the slyly pending requests cajole quickly blithely regular platelets. even requests boost carefully. ironic, final instructions above the regular courts boost a +143|70|3923|741.01|le quickly furiously silent ideas. carefully regular requests ar +143|96|7152|772.24|fully furious accounts. final asymptotes cajole regular requests. carefully regular courts are quickly. slyly ironic ideas above the carefully regular requests wake +143|22|1952|199.37|l accounts are quickly after the unusual packages. regular accounts wake among the quickly even accounts. even, ironic +144|45|6295|457.37| pinto beans promise across the blithely bold packages. express, regular accounts play around the slyly silent deposits. specia +144|71|494|849.96|uriously ironic pearls wake idly furiously even pearls. foxes impress slyly busily express requests. carefully slow somas wake quick +144|97|1799|713.88|yly final requests. packages are. carefully daring accou +144|23|5427|361.83| foxes integrate carefully. deposits cajole fluffily. pending deposits kindle slyly carefully regular packages. even, thin accounts according to th +145|46|11|641.67| slyly regular packages are slyly carefully special dolphins. unusual braids use furiously about the final courts. slyly special +145|72|3838|568.91|ss, final asymptotes are. furiously express accounts run. furiously express dependencies eat carefully blithely ironic theodolites. closely ironic foxes among the silent asymptotes cajole +145|98|1344|422.60| dependencies. even patterns detect slyly after the ironic deposits. ironically even ideas wake slyly. even packages against the blithely express accounts haggle furiously carefully regular +145|24|4332|894.57|are carefully above the quickly silent deposits. evenly bold reque +146|47|2726|231.15|uriously after the fluffy accounts. furiously bold deposits cajole. requests might engage. quick accounts wake carefu +146|73|4628|123.91|ly across the dependencies. daringly ironic deposits are furiously; requests are. quickly regular accounts hang. carefu +146|99|5893|858.59|sual instructions believe. fluffily unusual warhorses nag. unusual dependencies sleep. slow sheaves haggle furiously. carefully ironic dependencies cajole slyly against the accounts. +146|25|9687|882.37|packages? ideas affix slyly even accounts: express requests wake slyly carefully special depths. ironic in +147|48|7442|939.14|sts against the furiously unusual instructions integrate ironic accounts. slyly final pinto beans sleep blithely carefully final asymptotes. slyly ironic warhorses befor +147|74|7647|102.19|refully regular orbits about the furiously express asymptotes haggle carefully according to the blithely regular ideas. blithely express excuses around the furiously +147|100|1596|466.37|ole. slyly final packages do haggle quickly. unusual accounts across the pending pinto beans was furiously according to the furiously brave deposits. pending deposits along the regular request +147|26|4235|235.91|ar pinto beans. regular instructions sleep carefully after the furiously blithe accounts. slowly pending ideas could nag careful, even accounts. attainments use slyly quickly +148|49|8007|177.40|final requests-- slyly regular theodolites haggle carefully across the blithely final dependencies. slyly even requests about the carefully even accounts sleep +148|75|1904|774.56|y even pinto beans. fluffily ironic packages sleep slyly. permanently brave requests boost furiously packages. boldly ironic deposits across the carefully bold pinto b +148|1|5393|264.09|ses. slyly pending packages haggle fluffily fluffily even instructions. fluffily regular packages are carefully about the furiously even asymptot +148|27|2957|250.98|. requests boost above the bold, special foxes. blithely regular platelets serve blithely slyly final ideas. carefully special idea +149|50|959|679.10|y to sleep carefully ironic requests. even, regular dependencies haggle. slyly unusual foxes haggle along the instructions. quickly even accounts nag furiously special accoun +149|76|7283|201.03|usly bold instructions. regular, final deposits alongside of the furiously ironic platelets are slyly even instructions. carefully bold accounts are. ironic, regular requests nag furious +149|2|7392|266.53|es detect along the regular instructions. bold ideas boost slyly. quickly unusual accounts doubt. carefully even foxes thrash slyly silent, ironic dolphins: Tiresias must wake +149|28|4104|312.37|ly express excuses. bold pinto beans boost blithely across the bold, final pinto beans. final deposits haggle carefully from the +150|51|8091|524.71|sleep furiously furiously bold warthogs. furiously express gifts according to the regularly silent sentiments boost within the f +150|77|2721|814.79|dependencies. special accounts wake carefully furiously regular accounts. regular accounts haggle along the express instructions. express pinto beans along the express, bold deposits run +150|3|3172|33.71| about the silent ideas. fluffily final requests impress. slyly final requests wake carefully about the slyly express foxes. slyly regular warthogs sleep fur +150|29|1640|327.34|slyly even deposits alongside of the furiously even accounts detect boldly quickly regular accounts. final accounts kindle carefu +151|52|391|281.90|dolites. boldly ironic packages cajole fluffily regular instructions. regular, ironic accounts are blithely. ironic accounts are alongside of th +151|78|253|840.06| haggle. somas are carefully. slyly regular requests sleep blithely atop the thinly express deposits. stealthily express packages cajole daringly express requests. carefully special requests after t +151|4|1484|71.68|riously final requests sleep according to the regular deposits? slyly ironic ideas wake furiously. quickly even theodolites use fluffily. regular, unusual courts according to the regular +151|30|9417|244.06| foxes along the hockey players are slyly about the blithely even packages. unusu +152|53|1396|164.60|d the instructions. carefully pending accounts haggle fluffily ruthless instruc +152|79|2653|432.12|carefully pending requests. quickly ironic requests haggle carefully special theodolites. blithely special requests aga +152|5|3599|77.38| quick excuses according to the pending, ironic requests snooze carefully slyly even foxes: slyly regular instru +152|31|1283|142.73|olites above the furiously even requests dazzle blithely against the busy, regular pains. furiously blit +153|54|4695|539.86|atelets. dolphins haggle blithely carefully ironic deposits? express, final accounts wake about the requests. even deposits should use quickly. regular, +153|80|8464|680.14|cording to the final instructions. carefully fluffy asymptotes haggle carefully +153|6|2916|685.52|ully express deposits boost daringly packages. furiously ironic accounts sleep slyly ironic instructions. special deposits integrate blithely. +153|32|6397|285.92|furiously special platelets haggle quickly even, bold pinto beans. blithely close pinto beans boost around the furiously regular packages. quickly express requests cajole. +154|55|3961|474.19|quickly pending requests nag express dependencies. furiously unusual requests about the regular, pending packages wake according to the ironic packages! theodolites wake about the unusual, regula +154|81|3231|829.29|ins along the packages use carefully requests. furiously unusual packages kindle fluffily quick +154|7|7315|960.19|uickly regular dolphins ought to believe among the q +154|33|1682|160.31|refully except the sly, even requests. careful ideas haggle after the slyly regular foxes: slyly special packages at the slyly regular deposits wake carefully theod +155|56|2893|222.02|. bold packages are toward the silent pinto beans. quickly fin +155|82|7077|413.24|lar instructions against the furiously unusual instructions breach furiously for the bold, even platelets. ironic accounts must have to are quickly across the +155|8|3029|413.02|the carefully ironic asymptotes. even, unusual accounts sleep furiously about the blithely regular ideas. quickly re +155|34|977|751.45|quickly silent deposits doubt above the unusual instructions. special r +156|57|4755|453.69|e of the excuses. slyly even theodolites boost about the slyly final foxes? requests after the carefully regular platelets sleep above the furiously pending d +156|83|7228|994.19|odolites wake quickly slyly final dinos. requests cajole slyly along the instructions. furiously regular deposits cajole slyly blithely ironic instructions. instructions wake. blithely even pinto be +156|9|3043|252.66|lithely express, silent decoys. bold, special requests along the carefully even accounts +156|35|3191|9.87|ar instructions-- quickly special deposits wake fluffily about the blithely e +157|58|5414|369.44|ong the carefully bold ideas boost across the regular, ironic requests. ironic fo +157|84|763|568.46|cial packages boost along the ideas. packages sleep slyly express packages. ironic, bold requests +157|10|3718|901.53|, ironic foxes. blithely even foxes wake about the carefully special req +157|36|3400|288.41|encies integrate carefully even accounts. regular, regular sentiments are against the slyly regular deposits-- even, even ideas use inside the carefull +158|59|2845|408.72|y. slyly final pinto beans believe fluffily pending, regular deposits. final, unusual ideas according to t +158|85|8715|452.31|instructions along the ironic, final requests are fluffily regular deposits. regular deposits cajole carefully about the silent instructions +158|11|4465|837.16| wake carefully in place of the furiously express deposits. slyly regular instructions engage. fluffily f +158|37|4251|431.90|etly special accounts boost carefully final multipliers. carefu +159|60|9200|356.66|ccording to the furiously final accounts. carefully fluffy foxes wake idly against the quickly final requests. evenly even pinto beans must have to are against the carefully regular de +159|86|3585|629.29|g platelets wake furiously slyly bold deposits? slyly regular accounts across the stealthily ironic accounts cajole along the special, ironic pearls. fluffily regular pinto +159|12|6085|171.40|ross the blithely special deposits are quickly carefully ironic Tiresias. quickly regular deposits was furiously. unusual accounts affix blithely about the regular deposits. asymptotes ab +159|38|3717|790.87|y blithe dependencies. final accounts haggle furiously. even, special asymptotes +160|61|2434|525.73|lithely. furiously silent theodolites after the ca +160|87|8324|999.93|ly final instructions. closely final deposits nag furiously alongside of the furiously dogged theodolites. blithely unusual theodolites are furi +160|13|6034|733.59| furiously against the final instructions. silent accounts sleep blithely after the boldly final requests. ex +160|39|6872|872.20|ions are carefully. carefully express foxes nag slyly before the carefully final excuses. accounts after the furiously ironic packages are furio +161|62|9365|790.03|scapades. packages use. slyly final accounts haggle across the quickly final th +161|88|8421|394.05|cial ideas. ironic instructions eat blithely slyly special packages. furiously final packages alongside of the furiously final instructions boost carefully against the quickly +161|14|9679|688.47|ns. blithely express requests sleep slyly foxes. blithely unusual ideas +161|40|679|893.72| the fluffily final requests. ironic, pending epitaphs affix slyly. qui +162|63|315|923.04| ideas. carefully final dugouts will have to wake quickly regular asymptotes. express grouches unwind carefully after the regula +162|89|2604|104.20|usly regular excuses. silent, even sheaves are according to the regular requests. packages grow blithely slyly regular accounts. ca +162|15|7014|236.07|cording to the stealthily fluffy theodolites. carefully unusual excuses around the regular deposits cajole slyly amo +162|41|4381|824.36|as across the furiously ironic notornis print blithely alongside of the final, pending deposits. fluffily express deposits slee +163|64|9241|955.81|cial dolphins. furiously bold foxes could have to use. never sly accounts cajole fluffily about the unusual, special pinto beans. pending, even requests around the quickly special deposits use f +163|90|3427|499.51|ithely bold packages integrate slyly quiet pinto beans. carefully even deposits boost slyly about the furiously fluffy packages. evenly regular dependencies wa +163|16|5323|920.75|sly even theodolites against the carefully bold packages wake final pinto beans. furiously pending deposits dazzle furiously. blithely exp +163|42|9676|573.48|ending accounts haggle blithely ironic, even packages. carefully pending packages wake carefully across the ruthlessly pending accounts! pinto beans wake. slyly final deposits boost slyly. fluffily +164|65|1295|341.95| bold instructions cajole slyly ironic deposits. quickly ironic foxes are carefully final, bold theodolites. ironic deposi +164|91|2134|84.02|ns believe. carefully express theodolites impress. carefully fina +164|17|3245|814.67|brave accounts cajole according to the final platelets. furiously final dolphins across the furi +164|43|3028|64.89|fully furiously regular requests. furiously bold orbits serve about the regular packages? carefully final deposits p +165|66|4424|943.82|ular requests. regular accounts cajole against the blithely ironic deposits. blithely even packages cajole. furiously final deposits cajole. thinly pending deposits hagg +165|92|5534|717.83| quickly regular deposits above the fluffily thin deposits haggle furiously against the quickly final depend +165|18|3780|730.28| furiously quickly regular foxes. pending requests engage evenly blithel +165|44|6114|210.84|foxes. foxes haggle. dolphins use carefully according to the fluffily regular packages. blithely special accounts according to the slyly final frets breach blithely after the care +166|67|6527|309.00|lly. dependencies haggle carefully at the slyly special packages. regular, final packages +166|93|6508|714.49|y express deposits cajole furiously above the carefully even theod +166|19|9364|581.52|pinto beans. pinto beans cajole furiously carefully special requests-- quickly +166|45|6713|631.58| sleep carefully. quickly even deposits run carefully fluffily ironic orbits. ironic deposits wake furiously. close sheaves along the special packages sleep carefully special instr +167|68|4933|666.70|ular deposits among the even dolphins are quickly express accounts. final, ironic theodolites cajole closely. th +167|94|5789|524.27| are furiously final, even dugouts. ironic, regular packages nag fu +167|20|4756|336.75|es are carefully along the carefully express tithes. furiously even deposits cajole slyly slyly regular deposits. bold excuses about the carefully ironic requests sleep blithely instructions +167|46|6748|704.97|t the silent ideas are blithely carefully even packages; blithely +168|69|347|394.83|hely blithely final theodolites. blithely final deposits among the quickly even ideas haggle about the blithely bold d +168|95|1281|771.90|, pending packages. ironic pinto beans use carefully. fluffily bold deposits +168|21|9089|508.37|ests are always. regular ideas sleep fluffily; special, express instructions cajole slowly. pending platelets boost furiously against the bold, even instructions. bold instructi +168|47|7519|963.43|requests above the quickly regular deposits use carefully aft +169|70|6914|619.53|uickly along the dependencies. furiously pending notornis cajole at the carefully special attainments. carefully ironic packages impress slyly care +169|96|6589|947.03|gside of the quickly regular asymptotes. quickly even theodolites against the theodolites promise express requests. ironic accounts wake careful +169|22|6731|713.35| the quickly special excuses wake blithely alongside of the carefully silent accounts. regular dolphin +169|48|7691|476.19|slyly alongside of the warthogs. fluffily even instructions poach under the slyly pending packages. blithely silent deposits use across the fur +170|71|7516|581.65| pinto beans. unusual ideas was fluffily. excuses cajole carefully final dependencies. platelets nag quickly according to the furiously ironic requests. carefully regular dependenci +170|97|838|667.16|orges do sleep furiously. fluffily furious requests among the final requests sleep after the slyly bold ideas? regular pinto beans might ha +170|23|6498|251.19| fluffily regular accounts integrate. blithely even packages cajole fluffily. furiously ironic excuses haggle by the finally final requ +170|49|6593|202.07|ep blithely final packages. quickly bold pains cajole carefully across the somet +171|72|8217|859.60|ress deposits. carefully special requests are furiously final requests. accounts cajole carefully blith +171|98|2311|864.96|s are along the blithely final deposits. regular asymptotes nag slyly against the requests. accounts cajole carefully carefully +171|24|8561|22.69|y close ideas are quickly silently regular packages. even, silent requests wake against the slyly special dependencies; regular accounts sleep doggedly furiously final pinto beans. slyly unusual pac +171|50|7589|935.29|s above the theodolites wake slyly along the carefully unusual dependencies. carefully express theodolites a +172|73|9799|184.96|ts. slyly even asymptotes nag blithely regular accounts. final platelets cajole furiously slyly bold packages. ironic accounts sleep slyly. pendi +172|99|8333|920.74|ronic foxes. quickly unusual accounts cajole blithely. blithely bold deposits cajole. blithely close pinto beans cajole requests. quickly express excuses around the quickly even deposits nag agai +172|25|3589|437.86|posits should have to boost furiously near the unusual ideas. final packages cajole blithely. carefully final deposits boost carefully. carefully special attainments boost quickly af +172|51|1661|687.13|y among the slyly even requests. ideas according to the slyly pending dinos print quickly slyly ironic foxes. pending, even excuses dazzle car +173|74|2536|353.84|ons-- final, silent dependencies sleep across the special, special excuses. furiously even accounts must have to mold after the ironic accounts. reque +173|100|8307|70.22|alongside of the furiously even packages. furiously final requests snooze blithely alongside of the carefull +173|26|6050|683.78|e after the slyly regular ideas. unusual pinto beans cajole even asymptotes-- silent, stealthy requests after the even accounts haggle blithely regular instructions. slyly ev +173|52|6162|877.84|es. slyly bold requests after the blithely regular dependencies cajole slyly even ideas. unusual deposits integrate about the final somas. +174|75|2103|681.95|sual, express requests wake furiously ruthless, final accounts. carefully ironic somas dazzle furiously. unusual asymptotes sleep-- patterns about the furiousl +174|1|6795|143.48|regular theodolites. special accounts integrate across the carefully ironic Tiresias. blithely even platelets detect. foxes about t +174|27|111|135.46| express packages-- quickly unusual courts lose carefully requests. bold accounts solve about the theodolites; pinto beans use. ironic foxes +174|53|8404|126.20|nding accounts mold furiously. slyly ironic foxes boost express sheaves. daringly final packages along the stealthy dependencies are blithely ironic requests. furiously pending pin +175|76|5515|487.68|ages sleep against the Tiresias. slyly pending packages print slyly above the evenly ironic dolphins. furiously ironic packages use f +175|2|7522|784.93| affix. quickly final theodolites haggle furiously after the slowly even pinto beans. furiously final packages use slyly. slyly regular reque +175|28|8501|706.61|int above the instructions. furiously regular requests integrate blithely according to the instructions. slyly pending foxes are asymptotes. slyly ruthless accounts wake. r +175|54|9456|978.56| regular packages. carefully ironic packages use. blithely ironic accounts among the pending, +176|77|7180|179.09|riously final requests. accounts doubt blithely regular somas. slyly even platelets are. theodolites across +176|3|3589|157.38|inal excuses. express deposits haggle carefully even deposits. carefully unusual requests haggle along the fluffily bold deposits. even, final requests affix. furi +176|29|5407|947.51|ending accounts eat carefully instructions. carefully pending packages detect slyly express accounts. foxes wake fluffily across th +176|55|1783|861.63|g the carefully special platelets. dogged, ironic asymptotes wake requests. regular excus +177|78|1239|44.75|requests use furiously regular, final requests. regular requests on the pending, ironic deposits use slyly among the excuses. carefully regular sheaves are. +177|4|4349|63.36|osits sleep among the fluffily unusual instructions. ironic dolphins cajole. furiously bold deposits sleep carefully. even, unusual accounts +177|30|9872|252.42|sual platelets. bold foxes affix furiously. pending, pending accounts lose furiously. pending platelets along the unusual, even foxes wake regular, even theo +177|56|4727|859.82|es are. slyly ironic packages haggle around the slyly bold deposits. bold foxes haggle blithely. f +178|79|4231|558.56|deposits. patterns use against the furiously unusual accounts. accounts wake carefully above the careful +178|5|1919|362.26| ironic dependencies. blithely regular packages detect fluffily special theodolites. regular instructions poach-- ironic deposits along the final requests +178|31|6836|864.93|y. ideas integrate regular pinto beans. special foxes wake above the slyly ironic asymptotes. quickly ironic ideas sleep. silent dependencies against the slyly bold packa +178|57|6922|475.18| regular patterns. fluffily express accounts about the furiously bold deposits cajole slyly about the furiously silent foxe +179|80|6956|444.38|g the furiously careful excuses haggle quickly thinly special Tiresias. furiously express foxes after the quickly regular deposits sleep ironic packages +179|6|1954|372.75|even dependencies print carefully. deposits boost blithely about the ironic, ironic accounts. express, regular deposits are. bli +179|32|2710|277.15|d the frets. pending packages doze quickly across the furiously regular deposits. pending, even deposits impress ironic ideas. quickly regular r +179|58|4776|8.39|sly special pinto beans. pinto beans cajole. carefully unusual ideas around the silent accounts are blithely carefully ev +180|81|2467|440.25| instructions affix. regular packages cajole quickly. carefully express asymptotes use furiously around the pendin +180|7|1108|934.59|hinly after the regular, unusual asymptotes! carefully regular theodolites sublate. regular, ironic deposits against the regular pinto beans nag ca +180|33|724|426.16|e, regular accounts. furiously final ideas are furiously above the bold, silent asymptotes. sly instructions are carefully quickly final sentiments. furiously ironic foxes cajole bold, exp +180|59|5899|864.83|hin the carefully furious pinto beans. furiously ironic pinto beans use slyly above the even instructio +181|82|2416|844.44|ully. theodolites throughout the blithely unusual pinto bea +181|8|3242|886.53| express ideas nag carefully brave accounts. slyly express deposits would affix. final, special requests against the slyl +181|34|215|938.29| accounts boost furiously furiously blithe theodolites. slyly bold requests unwind special, unusual requests. furious ideas boost quickly pending +181|60|1122|657.25|lyly fluffily pending foxes. fluffily ironic pains haggle. thinly regular requests against the deposits affix after the never ev +182|83|9699|535.27|ound the furiously regular foxes. pending requests dazzle along +182|9|960|519.36|arefully pending dependencies are always slyly unusual pin +182|35|6243|741.46|accounts are slyly. furiously ironic requests haggle. express, special instructions against the ironic theodolites use s +182|61|6146|365.00|s. blithely express theodolites sleep blithely alongside of the requests? +183|84|30|875.44|slyly. furiously regular instructions cajole slyly about the pending, final theodolites. blithely final deposits cajole fluffily alo +183|10|4482|424.86|es. depths affix fluffily. bold instructions haggle. ruthless instructions must have to boost +183|36|8707|884.26|posits wake. blithely pending requests nag furiously alongside of the p +183|62|333|678.16|ost final, final theodolites. slyly bold foxes dazzle carefully furiously regular accounts. regular, sly instructions about the furiously regular excuses nag blithely abou +184|85|7069|449.45|nal ideas. blithely final ideas haggle against the pinto beans. qu +184|11|9193|576.88|uickly quick dependencies could detect furiously. final packages p +184|37|6400|551.90|ss dependencies. quickly even pinto beans are. express accounts a +184|63|831|186.84|kages cajole carefully furiously ironic instructions. deposits use bl +185|86|1475|538.58|unts hinder slyly. quickly express ideas sleep carefully +185|12|6244|213.04|ly unusual decoys are furiously quickly regular packages. bold, ironic foxes cajole fluffily around +185|38|7245|426.74|sleep blithely alongside of the regular excuses. even, regular +185|64|8014|510.23|lithely even ideas. regular platelets wake carefully ironic, special instructions! final pearls above the fluffily quiet ideas use furiously about the +186|87|1095|252.84|. carefully regular pinto beans according to the blithely close asymptotes haggle carefully special requests. packages cajole up the furi +186|13|1945|18.75|nic foxes boost carefully careful packages: express, fluffy dolphins nag quickly ironic packages. slyly bold requests nag amon +186|39|8838|729.42|ing asymptotes. enticingly regular theodolites mai +186|65|7898|812.37|ctions sleep silently carefully bold platelets. furiously ironic dependencies boost. regular de +187|88|8656|238.66|tes use along the even foxes? final foxes haggle pinto beans. slyly ironic theodolites are according to the deposits. furiously pending reques +187|14|4945|316.64|eposits boost quickly bold requests. furiously regular ideas boost boldly. special, express dependencies are fluffily slyly reg +187|40|3183|362.75|t the bold platelets. fluffily express platelets cajole fluffily along the always bold requests. blith +187|66|7440|989.71|e slyly against the slyly regular pinto beans. requests haggle carefully around the asymptotes. regular, regular asymptotes use furiously some +188|89|4835|771.95|pains are fluffily about the fluffily pending asymptot +188|15|2620|331.70|elets nag slyly regular pinto beans. slyly even dugouts above the blithely unusual theodolites su +188|41|730|713.62|nag against the final accounts. blithely pending attainments lose. silent requests wake quickly. careful +188|67|5430|920.20|uriously. special, regular instructions sleep along the accounts. quickly even foxes across the regular theodolites hang u +189|90|1305|392.50|packages. regular, unusual accounts lose furiously fluffily regular platelets. requests sleep carefully dependenc +189|16|8777|573.22|beans cajole slyly ironic requests. requests are quickly unusual, even packages. ironic frays haggle. blithely pending requests nod slyly. express, silent requests against the slyly unusual +189|42|6369|946.07|ts hinder slyly regular, unusual foxes. final sentiments use above the slyly r +189|68|2505|593.23| the deposits. special deposits sleep-- furiously regular sauternes solve furiously across the furiously regular pack +190|91|535|621.53|unts must have to haggle; slyly ironic accounts affix slyly alongside of the carefully even accounts. furious deposits haggle quietly among the packages. blithely +190|17|5845|608.91| haggle along the carefully unusual pinto beans. quickly final accounts sleep a +190|43|4579|396.60|inal, final foxes. regular, even deposits wake blithely! silent, regular packages integrate according to the slyly regular deposits. ironic, ironic notornis ha +190|69|2861|458.00|s cajole slyly across the daring, final pinto beans. carefully quiet requests affix along the a +191|92|8310|521.06|the slowly regular deposits. special accounts along the quickly unusual +191|18|1693|464.46|y. slyly unusual waters across the special pinto beans nag blithely according to the busy deposits. carefully regular accounts are against the regular accounts; perman +191|44|597|126.96|ly final accounts should have to boost above the doggedly express pinto beans. blithely regular packages cajole furiously bold requests. fluf +191|70|9673|119.41|press deposits kindle theodolites! slyly final dependencies against the blithely final packages sleep slyly regular requests. theodolites cajole furiously quickly bold a +192|93|606|198.69|inal platelets integrate regular accounts. accounts wake ironic, silent accounts. slyly unusual accounts kindle carefully- +192|19|2656|916.16|uickly. slyly bold ideas affix special, close theodolites. ironic, pending requests use carefully. blithely regular +192|45|1811|359.59|ly carefully special asymptotes. furiously pending instructions haggle blithely bravely pending requests. carefully f +192|71|8305|861.23|s against the carefully regular foxes haggle fluffily across the pending accounts. blithely final packages sleep after the furiously ironic theodolites. quickly bold r +193|94|6184|335.98| quickly bold deposits cajole furiously ruthless courts. carefully +193|20|4762|606.19|ns sleep against the furiously regular asymptotes. carefully even asymptotes across the daringly final packages sleep fluf +193|46|385|571.71|ons. slyly ironic deposits wake furiously ironic, unus +193|72|9791|478.52|quests. carefully even requests use regular excuses. pending accounts are. furiously even pinto beans haggle furi +194|95|4289|662.17|ic Tiresias serve along the ironic, express accounts. quickly final requests are slyly among the carefully special requests. accounts boost. +194|21|377|430.21|efully instead of the special ideas. fluffily unusual asymptotes cajole blithely after the regular ideas. final accounts along the silent ex +194|47|5294|913.46|indle fluffily despite the carefully silent instructions. furiously regular hockey players cajole slyly unusual accounts. furiously regular realms cajole furiously according to the e +194|73|7890|79.40|ctions sleep. carefully unusual theodolites should wake furiously across the deposits-- furiously bold excuses boost furiously carefully slow accounts. boldly final accounts grow. regular excuse +195|96|9985|20.39|efully among the fluffily even accounts! requests are slyly ag +195|22|2947|271.39|yly regular requests cajole carefully. carefully fina +195|48|319|102.58|ts. ironic foxes wake carefully slyly special pinto beans. blithely silent excuses hinder blithely quietly regular accounts. quickly careful foxes maintain slyly above the slyly express fo +195|74|2803|992.27|xes according to the regular foxes wake furiously final theodolites. furiously regular packages sleep slyly express theodolites. slyly thin instructions sleep r +196|97|3843|859.90|l platelets use blithely alongside of the enticingly final deposits. fluffily final requests boost furiously ag +196|23|2515|966.01|final theodolites. fluffily even deposits are against the +196|49|4778|37.61|fully final requests cajole fluffily across the furiously ironic accounts. qui +196|75|1068|928.25| cajole about the blithely regular ideas. final ideas hin +197|98|9678|753.88|ously. slyly stealthy requests use alongside of the express, unusual packages. final deposits wake. carefully unusual theodolites cajole slyly about the regular foxes. slyly iron +197|24|2631|279.05|e blithely. quickly final deposits wake fluffily excuses. even, unusual deposits x-ray among the final accounts. even ideas above the blithely ironic requests sleep furiously slyly final inst +197|50|7598|845.51|lets according to the regular deposits wake furiously about the carefully daring theodolites. blithely express dolphins poach after th +197|76|8950|897.33|ideas. requests wake above the blithely unusual deposits. slyly regular +198|99|6878|587.41|y even accounts poach carefully about the asymptotes. deposits haggle slyly. finally unusual requests run silently regular, bold packages: instructions after the +198|25|6493|673.99|y express excuses use blithely among the pending accounts. stealthy ide +198|51|8410|166.93|kages. blithely final theodolites dazzle fluffily. accounts boost furiously. furiously unu +198|77|6190|697.10|beans nag fluffily about the asymptotes. slyly bold escapades haggle quickly. fluffily special requests haggle above the ironic, +199|100|9343|79.70|ending accounts nag across the instructions. carefully express packages over the blithely even pac +199|26|8199|46.52|oost slyly. ironic platelets sleep blithely about the slyly silent foxes. furiously even pl +199|52|2742|890.63| the special deposits? carefully final deposits about the carefully regular sauternes +199|78|7167|884.56|onic platelets use carefully along the slowly stealthy ideas. slyly dogged instructions are quickly above the slyly u +200|1|3120|776.41|ntly final packages kindle furiously blithely ironic accounts. carefully final packages according to the carefully +200|27|5392|242.52|y unusual ideas. ruthlessly express asymptotes cajole. regular theodolites are. carefully silent deposits poach carefully across the fluffily even theodolites. carefully express realms hag +200|53|9408|307.79|oxes! fluffily regular requests use against the unusual, slow ideas. ironic accounts doze b +200|79|331|466.07| slyly even requests. fluffily final packages boost carefully express instructions. slyly regular forges are blithely unusual, regular +201|2|8649|280.98|ainst the furiously even platelets nag carefully across the pending foxes. sly, regular instructions are carefully ins +201|29|2078|340.49| across the quickly special accounts. special accounts are blithely about the fluffily final deposits. silent packages haggle about the ironic packages. blithely ironic deposits boost +201|56|4125|534.11|uctions sleep slyly final theodolites. ironic, regular pinto beans along the sly +201|83|848|947.59| doubt furiously unusual accounts. furiously ironic packages are ironic, even accounts. furiously silent +202|3|7822|247.44| even pinto beans haggle. carefully ironic accounts +202|30|3182|180.81|uriously stealthy pinto beans along the silent deposits detect quickly about the express requests. slyly thin foxes are quickly. unusual, +202|57|2720|160.45|ickly for the deposits. quickly pending deposits haggle ironically. slyly final instructions sleep carefully furiously regular attainments. furious +202|84|6202|656.17|symptotes nod. slyly regular requests sleep quickly along the regular instructions. regular accounts alongside of the express packages detect even, ironic deposits. requests cajole furiously abo +203|4|1677|399.16|ll detect slyly across the ironic, even packages. final deposits haggle. even ideas wake ruthlessly above +203|31|3591|582.85| bold instructions hinder ironic, special pinto beans. final deposits x-ray across the regular deposi +203|58|6239|882.46|bout the blithely permanent asymptotes. slyly ironic dependencies haggle slyly against the blithely even deposi +203|85|5644|489.27|ts nag carefully after the even requests. furiously silent accounts cajole. dolphins haggle furiously. carefully ironi +204|5|9265|504.61|ructions. pending, regular deposits around the slyly pending asymptotes sleep slyly regular, express theodolites. fluffily special excuses a +204|32|2203|609.26|lyly. blithely even accounts against the furiously silent instructions are carefully along the slyly ironic theodolites. slyly bold pinto beans caj +204|59|6344|172.65| theodolites. final accounts wake after the quickly even dependencies! furi +204|86|1238|819.14|e slyly quickly permanent accounts; slyly bold requests sleep express requests-- final excuses snooze above the fl +205|6|9942|226.71|onic depths haggle. always final packages wake slyly along the slyly bold gifts. fluffily unusual requests poach quickly. slyly silent +205|33|7965|427.25|ut the quickly unusual instructions. sly, regular requests haggle blithely blithely regular deposits. dogged deposits haggle quietly above the pending, regular packages +205|60|1974|217.01|ress, final packages hinder blithely special pinto beans +205|87|9207|123.08|leep. slyly pending ideas detect furiously alongside of the silent, regular +206|7|1961|936.54|hely pending courts wake stealthily final theodolites. furiously busy packages across the slyly unusual accounts wake according to the blithely pending theodolites. quickly fluffy accounts aga +206|34|425|362.30|ial requests. even theodolites haggle furiously. fluffily pending deposits boost blith +206|61|7816|389.88|daringly. slyly regular foxes believe carefully among the final courts. carefully pending instructions are qui +206|88|548|480.04|slyly quickly silent foxes. even depths sleep according to the fluffily pending fo +207|8|9319|335.16|al pinto beans should grow blithely blithely bold tithes. slyly unusual theodolites nag +207|35|3567|810.91|above the quickly bold deposits. furiously pending deposits nag slyly-- furiou +207|62|9711|673.18|the platelets sleep about the ironic deposits. even accounts wake slyly alongs +207|89|7316|557.72|nic instructions sleep furiously despite the carefully unusual packages. ironically +208|9|7366|135.51|ial instructions wake furiously. regular asymptotes haggle fl +208|36|7251|54.46|pinto beans nag fluffily special ideas. carefully ironic decoys cajole carefully slyly even excuses. regu +208|63|5255|474.75|s cajole quickly. fluffily even requests use furiously above the quiet foxes. fluffily ironi +208|90|7066|309.80|ke. ironic, express instructions with the slyly bold packages haggle carefully bold, +209|10|7176|236.77|otornis wake slyly about the quickly special asymptotes. foxes believe fluffily above the ironic requests. express accounts solve across the express pinto beans. slyly pending foxes run r +209|37|3344|575.01|he quickly regular deposits. carefully regular requests along the requests lose according to the even pinto beans. express courts are slyly +209|64|5580|81.80|en instructions. carefully regular theodolites solve furiously. pending, regular asymptotes x-ray blithely requests. pinto beans cajole slyly. carefully bold sentiments haggle carefull +209|91|1513|507.38|fily regular pinto beans? blithely regular dependencies cajole ca +210|11|6774|267.01|ermanently final instructions breach across the idly pending theodolites. quickly pending +210|38|8671|377.95| regular packages? final, bold pinto beans use slyly special pac +210|65|6596|817.36|nt accounts lose at the furiously bold platelets. carefully regular pinto beans use. special packages among the d +210|92|4516|259.05|yly bold requests are blithely. packages outside the furiously final ideas x-ray daringly among the even packages. accounts mold blithely about the pending notorn +211|12|4572|475.68|olites haggle slyly according to the regular, even +211|39|6045|856.97| ironic multipliers sleep. furiously express requests wake quickly. regular dependencies along the dinos sleep after the epitaphs. quietly unusual deposits haggle blith +211|66|6901|707.01|final pinto beans affix quickly express warthogs: regular pinto beans from the carefully ironic requests cajole stealthily across the depen +211|93|4247|751.41|tes. warhorses must sleep against the slyly express accounts. special requests according to the carefully regular packages are slyly +212|13|1040|718.90|s along the courts use above the pending packages; pending +212|40|6519|778.38|sly except the fluffily ironic platelets. final deposits serve slyly silent requests. fluffily express dependencies boost. slyly final requests +212|67|6217|426.19| accounts. carefully even requests along the blithely silent deposits boost among the regular, unusual sauternes. blithely regular packages +212|94|9266|318.74|y. furiously even deposits are. fluffily unusual accounts nag fluf +213|14|3959|565.71|uffily blithely special requests. even, unusual instructions sleep: requests +213|41|8685|591.93|epths use carefully at the bold, even theodolites; boldly final ideas wake fluffily final requests. furiously iro +213|68|9296|623.44|nal deposits are furiously final somas. ironic realms across the fluffily regular dependencies sleep slyly never special packages. slyly even requests wake fluffily final attainments? furiously regu +213|95|9377|797.64|s? special instructions wake carefully according to the slyly regular accounts. +214|15|2244|403.15|furiously bold ideas wake furiously across the foxes-- even accounts cajole across the even pinto beans. quickly +214|42|5174|719.69|asymptotes against the regular packages wake after the pending packages. packages cajole carefully ironic, special packages-- furiously expr +214|69|7901|17.50|excuses sleep slyly among the regular forges. final theodolites along the furiously unusual ideas kindle about the final instructions. idle deposits sleep blithely quietly express ideas. +214|96|6358|646.92|s; blithely regular requests boost among the slyly regular accounts. doggedly quiet deposits integrate furiously. foxes wake stealthily. special, ironic pinto beans integrate. fl +215|16|1710|765.63|ect across the fluffily bold deposits. furiously ironic instructions across the regular requests are +215|43|290|932.70|ns. bold accounts x-ray blithely furiously regular packages. daring, expr +215|70|3754|636.10|dolites. carefully ironic packages nag? special theodolites use furiously. finally +215|97|7130|838.57|e decoys. quickly ironic packages are blithely regula +216|17|5429|142.97|inal, bold theodolites. silent packages above the evenly regular decoys sleep slyly pending theodolites. even pinto beans about th +216|44|9076|502.55|ove the furiously pending foxes. ironic, permanent instructions cajole carefully among the slyly +216|71|6245|25.22|sits boost across the furiously regular pinto beans! regularly final dinos sleep. platelets are furiously b +216|98|3277|528.02| sublate fluffily above the quickly special pinto beans. regular accounts nag among the final foxes. furiously even packages wak +217|18|20|479.17| final instructions wake according to the furiously express theodolites. boldly final asymptotes haggle quickly. careful, ironic ideas hag +217|45|3036|714.36|ncies are for the slyly bold realms. quickly express frays wake accounts. slyly ironic instructions sleep blithely during the slyly final package +217|72|875|463.83|inal ideas lose against the carefully unusual deposits. even dolphins are about the blithely enticing +217|99|9247|637.64|y to wake at the packages. regular theodolites boost furiously furiously ironic r +218|19|3896|622.16|e. furiously regular packages above the accounts sleep pending packages. pending accounts haggle carefully arou +218|46|4848|257.48| carefully. fluffily unusual ideas cajole blithely above the fluffily fluffy instructions. ironic accounts cajole slyly carefully regular accounts. slyly final accounts use quickly. blithely +218|73|1431|55.36|ncies. pending, regular grouches haggle carefully furiously busy accounts. blithely regular deposits boost quickly along the slow foxes. regular packages wake after the furiously regular instructio +218|100|3941|568.24|refully silent dependencies sleep after the platelets. slyly idle requests according to the blithely even pinto beans cajole across the final ideas. slyly bold +219|20|2369|168.95|fully regular packages? requests nag carefully regular deposits. fluffily regular requests haggle furiously quickly pendi +219|47|491|658.50|y about the ironic ideas. even deposits haggle stealthily fluffily busy instructions: blithely final requests cajole across the slyly final depths. slyly unusual requests a +219|74|5116|580.18|even requests cajole fluffily after the ideas. even, +219|1|145|1.43|carefully final dependencies cajole. bold foxes haggle. pending deposits use bold, express deposits. platelets are. slyly unusual c +220|21|2941|341.13|gle furiously furiously final foxes. furiously unusual accounts +220|48|2118|396.71|inal packages haggle fluffily against the ironic foxes. bold, final ideas affix stealthily slyly busy ideas. slyly final re +220|75|6654|322.05|the furiously final packages. accounts haggle blithely. requests use furiously. furiously ironic deposits sleep across the carefully final foxes. ironic asymptotes +220|2|8767|297.83|ven pinto beans. blithely express requests sleep. regular, unusual ideas cajole fluffily. fluffily pending packages sleep furiously around the regular foxes. blithely silent depo +221|22|1469|916.33| haggle? silent, pending foxes boost silently excuses. blithely bold instructions nag. regular, regular excuses dazzle carefully even id +221|49|9153|324.88|sly silent theodolites wake around the unusual, ironic deposits. even, idle pinto be +221|76|5484|898.37|uches. furiously ironic accounts sleep carefully against the blithely bold accounts. slyly regular depo +221|3|2849|80.70|s cajole. platelets sleep blithely after the final accounts. pending, bold packages alongside of the +222|23|8085|967.81| ironic platelets? blithely even packages cajole regularly after the bold foxes. dependencies nag carefully about the platelets. quickly regular attainments wake slyly above the requests. quick +222|50|8065|422.77|ual pinto beans. ironically final theodolites along the regular, express platelets are blithely between the close +222|77|7808|734.78|thely across the pinto beans. idle, special accounts after the express, express packages haggle blithely blithely regular dolphins; c +222|4|8855|926.10|es about the closely ruthless requests cajole permanently blithely even packages. deposits sleep stealthily hockey players. finally ironic packages nag. +223|24|582|693.87|n deposits. slyly regular instructions according to the blithely unusual instructions serve across the hockey players. +223|51|1488|735.88|al deposits are slyly along the furiously final excuses: slyly express deposits wake blithely quickly pending ideas. even t +223|78|259|523.37|ongside of the slyly express deposits. foxes use furiously quiet accounts. furiously pending notornis are slyly after the furiously ironic packages. regular, bold accounts detect. slyly regu +223|5|4893|287.24| regular deposits doubt. furiously special requests wake furiously final foxes. slyly quick requests wake. carefully enticing ideas cajole slyly. slyly final dolphins haggle furiously slyly spe +224|25|7119|745.97|ole among the quickly ironic packages. carefully even frays doze. slyly pending ideas detect fluffily slyly final theodolites. +224|52|7374|252.76|ven packages sleep fluffily above the blithely bold deposits. carefully unusual packages about the blithely express deposits haggle blithely furio +224|79|1227|673.82|usly regular accounts. fluffily final instructions according to the slyly ironic theodolites poach blithely final frets. daringly ironic requests boost blithely darin +224|6|9097|404.64|dolites nag carefully across the unusual, regular foxes. stealthily ironic dolphins use sl +225|26|6101|775.45|ess pinto beans are slyly above the final theodolites. blithely final grouches are quickly since the deposits. regular account +225|53|4421|116.17|s above the requests. quiet, silent asymptotes across the pending theodolites haggle +225|80|5365|617.35|arefully regular dependencies along the slyly regular ideas wake about the carefully unusual d +225|7|2137|276.11|ways special packages. ironic pearls around the furiously even packages are ac +226|27|9130|465.81|st the furiously regular theodolites. quickly regular notornis promise. regularly furious packages wake quickly. closely ironic fo +226|54|966|931.43|ourts wake slyly. regular, ruthless pains print carefully after the ca +226|81|2680|343.14|y ironic ideas. express, final instructions boost blithely according to the carefully special accounts. ironic requests cajole +226|8|4772|58.38|lent sentiments solve blithely pending requests. furiously special platelets haggle quickly between the final packages. furiously brave ideas haggle blithely slowly thin accounts. slyly even +227|28|8809|453.33| quickly around the fluffily bold dolphins. ironic accounts sublate blithely ac +227|55|1408|877.71|y. slyly unusual accounts x-ray blithely blithely regul +227|82|6607|472.58|ly even requests. furiously final deposits wake slyly above the requests-- quickly +227|9|5426|736.86|kages unwind ironic, regular requests. quietly final deposits haggle carefully along the quickly pending asymptotes; busily ironic instructions +228|29|831|862.15|al courts sleep. regular requests haggle slyly even deposits. furiously pending requests sleep +228|56|235|727.11|ording to the fluffily express deposits. even, final requests despite the doggedly ironic +228|83|6712|976.89|hely against the ironic foxes. blithely busy deposits about the even asymptotes x-ray carefully along +228|10|6694|133.30|ven requests poach furiously along the furiously express packages. furiously even requests dazzle slyly. blithely special foxes are carefully blithely even accounts. regular, unusual dolphins hag +229|30|4074|835.21|, ironic requests. ironic, regular pinto beans about the special deposits haggle along the ideas. packages wake fluffily final accounts. depo +229|57|4781|497.84|ep final frays. final, final packages wake furiously slyly permanent asymptotes. final packages use carefully. permanently regular deposits affix quickly amo +229|84|2241|820.67|out the final requests. carefully ironic platelets will have to affix furiously toward the carefully special dolphins. blithely stealthy deposits aff +229|11|5560|984.71| stealthily final courts. furiously even packages are slyly. ideas after the slyly final ideas sleep blithely r +230|31|5361|723.71|ully final pinto beans haggle carefully after the regular ideas. regular deposits accordi +230|58|7726|634.61|across the blithely special dependencies. fluffily silent theodolites cajole furiously bold forges. special foxes cajole. carefully even deposits wake permanently against the +230|85|1549|752.70|sts wake idly after the quickly bold accounts. carefully pending packages haggle blithely. express instructions cajole quickly. furiously regular asymptotes use carefully aroun +230|12|4949|491.83|e. quickly final deposits are carefully. quickly pending packages after the unusual, even accounts are even platelets. final, silent requests +231|32|6305|695.86|s are excuses: accounts sleep? quickly even requests +231|59|4995|253.34|uriously against the bold accounts. slyly regular packages +231|86|5360|308.95|yly ironic accounts affix blithely. slowly regular ideas nag regular requests. deposits against the carefully regular instructions boos +231|13|803|971.24|rash. slyly blithe ideas detect furiously. fluffily even deposits use slyly slyly unusual frets. carefully even dependencies +232|33|5028|42.14|e slyly regular foxes. carefully ironic pinto beans according to the packages are carefully about the requests. quickly final +232|60|1108|240.70|kages haggle slyly-- deposits sleep above the regular grouches. express pinto beans nag fluffily. idly ironi +232|87|9154|716.37|yly express accounts. quickly unusual excuses boost carefully across the carefully final instructions? furiously unusual instructions boost fluffily bold theodolite +232|14|1828|266.84|into beans wake across the pending pinto beans. even instructions haggle furiously bold accounts. bold theodolites boost furiously quick instr +233|34|2689|446.29|usly special deposits: busily express theodolites cajole fluffily after +233|61|8231|524.51|carefully ironic sheaves. slyly regular deposits would wake furiously about the accounts? final dinos use. ruthlessly +233|88|444|372.96|pecial requests. ironic instructions alongside of the furiously unusual theodolites sleep quickly slyly regular dependencies. c +233|15|3009|767.62|ses. ironic ideas use fluffily. fluffily fluffy accounts boost furiously. ironic packages cajole carefully bli +234|35|3807|438.37|ly regular accounts unwind above the express excuses. furiously final requests nag. bold platelets cajole across the pinto beans. carefully final courts wake slyly bold plat +234|62|90|194.46|ackages. slyly pending foxes haggle stealthily pending deposits. even dolphins hin +234|89|367|826.04|t the regular, final packages snooze blithely against the furiously ironic pinto beans! special, express theodolites are careful +234|16|600|252.58|ncies sleep carefully unusual orbits. platelets sleep furiously after the ironic sentiments. bold epitaphs print. blithely r +235|36|9292|610.14|pinto beans. quickly dogged requests doze ironic requests. furiously ironic requests wake. blithely even pinto beans wake about the furiously quick accounts; even ideas boost above the slyly p +235|63|3827|96.25|t quickly. carefully close platelets sleep carefully through the b +235|90|3030|493.88|r dolphins haggle furiously. careful, special ideas are blithely after the bold platelets. slyly bold tithes +235|17|9681|100.94|ix about the regular theodolites. furiously special packages sleep blithely across the slyly regular accounts. carefully ironic reques +236|37|3270|423.71|hy requests haggle slyly. ideas cajole around the furiously pending instructions. furiously brave pin +236|64|5757|636.84|. special, unusual sentiments boost fluffily slyly bold foxes. blithely regular excuses are furiously; slyly even deposits wake furiously boldly final instructions. bold +236|91|4959|192.44|lly express, regular waters? blithely even ideas mu +236|18|2932|834.00|sy deposits cajole slyly unusual, pending deposits. evenly busy multipliers could integrate silently. theodolites affix fluffily fluffily regular accounts. deposits use slyly unusual dolphin +237|38|7643|255.01|ounts haggle pending packages. furiously express theodolites b +237|65|5360|438.19| quickly final, even accounts. blithely regular dolphins grow quickly quickly ironic requests. furiously i +237|92|2263|196.32|e carefully. fluffily silent accounts use. blithely regular ideas wake furiously. carefully ironic accounts boost +237|19|5241|67.83|e furiously. fluffily regular foxes use fluffily except the furiously ironic platelets. accounts instead of the blithely express pinto beans integrate theodolites. regular, pendi +238|39|7285|454.34|ecial, regular packages nag. carefully even deposits cajole blithely slyly final foxes. deposits haggle slyly. stealthily pending th +238|66|1615|999.92|riously ironic foxes detect fluffily across the regular packages +238|93|7504|556.95|ns. slyly even deposits cajole furiously blithely even theodolites. blithely express accounts boost quickly express request +238|20|9231|171.18| to the final requests. slyly even accounts among the regular foxes should wake slyly even requests. permanently pending packages integrate enticingly +239|40|8638|155.22|nusual accounts use furiously. furiously even attainments wake. quickly regular packages hang slyly fluffily final deposits. ironic deposits cajole. +239|67|3755|570.10| instructions are theodolites. ironic, ironic foxes about the packages mold blithely bold requests. slyly regular accounts affix according to the blithely special instruc +239|94|6890|411.32|lyly bold packages boost fluffily ironic packages. regular, final deposits mold slyly +239|21|4889|168.50|ickly silent accounts use final ideas. fluffily pending asymptotes across the quickly silent foxes affix slyly alongside of the f +240|41|6917|91.89|kages-- fluffily bold depths cajole against the fluffi +240|68|4238|192.43|are. blithely even foxes are doggedly along the caref +240|95|1972|571.34|fily regular gifts. express ideas are furiously whithout the final notornis. carefully regular instr +240|22|1831|243.03| instructions. bold deposits against the quickly regular instructions nag pac +241|42|1907|876.95|ross the furiously even pinto beans wake slyly about the carefully bold foxes. blithely pending courts among the furiously unusual platelets might nag blithely quickly regular packages. closely pen +241|69|6274|844.49|furiously about the busily fluffy requests. regular deposits serve carefully after the express excuses. slyly +241|96|3003|751.81| cajole furiously bold, even deposits. pending, bold accounts are ev +241|23|60|520.41|old ideas. furiously final packages are furiously slyly express accounts. furiously final asymptotes wak +242|43|6454|536.50|yly slow ideas along the even packages wake carefully up the bold, ironic instructions. +242|70|394|97.24|packages cajole slyly against the blithely special dependencies. furiously even excuses along the slyly sly de +242|97|2514|208.39|ckages. permanent, even warhorses cajole blithely after the final accounts. quickly pending packag +242|24|6902|147.39| sleep. slyly brave foxes lose according to the express foxes. idly express platelets across the carefully even dependencies are ev +243|44|1961|817.56|y across the ironic deposits. ironic accounts boost. silen +243|71|8930|618.10|pecial ideas. stealthy asymptotes use fluffily slyly ironic deposits. blithely unusual accounts haggle carefully. regular theodolites sublate furiously final deposits. quickly final package +243|98|3830|886.99|es. furiously bold foxes are slyly ironic, regular +243|25|3272|641.29| accounts haggle permanently furious dependencies. quickly pending hockey players haggle accounts. blithely even instructions haggle. furiously final dependencie +244|45|5942|148.84|ag according to the quickly even packages. carefully final depos +244|72|4940|293.62|deposits. packages across the fluffy deposits use blithely above the quickly final packages. furiously regular ideas detect. even, bold instructions thrash even requests: regular +244|99|1352|978.74|n platelets integrate. furiously stealthy foxes believe fluffily. furiously final excuses above the furiously unusual packages boost quickly careful +244|26|8850|257.00|final ideas; dolphins are slyly carefully regular accounts. regular, even foxes are quickly throughout the final c +245|46|6034|995.56|. carefully ironic packages promise slyly. ironic, regular deposits about +245|73|3533|187.40|inst the furiously bold asymptotes; depths nag slyly across th +245|100|9116|79.54|asymptotes sleep closely regular pinto beans. regular, final accounts use blithely between the express requests. carefully regular asymptotes cajole carefully blithel +245|27|5694|407.35|press accounts. pending deposits haggle slyly agai +246|47|6561|426.60|uickly unusual requests at the regularly express instructions doze carefully final +246|74|3607|194.36|thely after the carefully quick accounts. quickly final accounts cajole throughout the packages. slyly final ideas cajole. carefully unusual deposits nag furiously a +246|1|7493|170.68|posits integrate slyly across the furiously even packages. fluffily regular asymptotes against the carefully special accounts poa +246|28|8359|645.45| along the bold packages. ideas haggle furiously blithely even requests? regular packages use quickly according to the dogged dependencies. furiously final ideas according to the carefully even +247|48|3492|58.15|ckly bold requests. pending dependencies cajole according to the final accounts. stealthily pending requests sleep furiously ironic ideas. deposits after the carefully ironic accounts are alo +247|75|9811|479.85|nically about the carefully unusual requests. fluffily regular packages haggle carefully dugouts. furiously final re +247|2|7397|143.39|he furiously special foxes. ironic packages integr +247|29|9639|650.32| requests sublate quickly idly regular theodolites. quickly ironic requests alongside of the +248|49|7731|65.54|ronic accounts haggle blithely across the blithely special platelets. furiously final ideas haggle carefully after the fluffily unusual dep +248|76|8847|935.64|ular, regular requests affix ironically enticing ideas. fur +248|3|6329|148.79|enticingly final ideas sleep fluffily. blithely final ideas boost fluffily ironic asymptote +248|30|8054|425.78|the express accounts. even, ironic pinto beans wake furious +249|50|7234|516.17|out the ironic, even deposits. express, regular accounts boost blithely carefully regular requests. special multipliers detect slyly ironic foxes. furiously f +249|77|5568|50.74|ests wake permanently along the packages. ironic excuses x-ray alongside of the regular packa +249|4|1861|914.16|sleep about the unusual packages. slyly furious deposits at the slyly final requests boost blithely about the slyly ironic pinto beans. slyly express deposits aga +249|31|7766|815.94|usly enticing dependencies according to the silent requests haggle ironic, bold packages. blithely express requests boost alongside of the slyly regular deposits. unusual pinto beans +250|51|3525|293.30| slyly special deposits play. silent attainments according to the furiously +250|78|5208|617.59| theodolites about the doggedly brave excuses detect carefull +250|5|7071|374.36|es. express frets nag. pending packages haggle carefully across the final instructions. quickly ironic +250|32|4647|281.06|ironic packages. blithely special packages affix. quickly regular instructions wake carefully pending, regular packages. carefully silent deposits promise quickly outside the +251|52|6748|703.47| furiously thin requests poach blithely. carefully ironic pinto beans sleep carefully e +251|79|6020|154.11|riously regular packages integrate carefully across the carefully even Tiresias. fluffily express realms wake slyly packages. thinly final deposits wake ironic, express requests +251|6|9298|883.57| haggle carefully. special, special accounts sleep slyly. blithely bold instructions according to the blithely unusual deposits serve furiously under the even +251|33|5130|183.19|side of the foxes haggle among the dinos. bold, pending instructions haggle blithely about the blithely regular requests. packages affix blithely. furiously re +252|53|8207|168.05|ess accounts doubt express requests. regular, special instructions use blithely blithely express +252|80|1220|412.54|ly bold requests. even, special deposits are against the furiously bold +252|7|2813|734.15|ly regular courts sleep slyly ironic accounts. carefully express asymptotes are. blithely furious packages are quickly always regular accounts. q +252|34|7645|275.23| blithely bold requests use furiously against the final packages. furiously pending excuses poach carefully after the blithely even packages. slyly regula +253|54|544|658.08|fter the finally bold packages. slyly pending requests boost carefully. furiously special deposits sleep carefully bold deposits. carefully final somas haggle outside the furious, expres +253|81|1705|515.91|structions. furiously ironic packages use blithely. theodolites ought to sleep. ev +253|8|6523|783.87|courts sleep slyly across the fluffily unusual excu +253|35|3540|797.50|eposits use across the slyly special asymptotes. carefully final sauternes wake blithely across the furiously final dolphins. slyly +254|55|2058|111.11|r theodolites haggle along the slyly unusual theodolites. slyly regular orbit +254|82|717|564.77| asymptotes. carefully silent requests wake carefully unusual excuses. sometimes pending packages poach +254|9|8773|729.13|unusual packages boost. slyly ironic accounts maintain after the blithely regular ideas. quickly final requests against the regular requests sleep slyly about the furiously +254|36|1762|940.29|rding to the blithely ruthless multipliers sleep slyly blithely final dependencies. slyly reg +255|56|7540|307.78|ages sleep carefully carefully close ideas. special pinto beans x-ray alongside of the final deposits. slyly dogged deposits could haggle slyly. s +255|83|8151|225.64|ns haggle carefully excuses. carefully regular depos +255|10|2314|362.37|furiously regular accounts; unusual dependencies according to the ironic, express instructions haggle ironic deposits. slyly unusual instructions nag quickly slyly regular instructions. ne +255|37|8412|720.85|ructions are carefully silent decoys. bold deposits cajole slyly: deposits to the even foxes hinder furiously unusual requests. fina +256|57|7261|583.85|arefully regular requests. fluffily special packages are about the quickly bold foxes. blithely bold platelets cajole across the f +256|84|1240|822.40| regular multipliers wake carefully regular platelets. slyly even packages cajole quickly. quick +256|11|9145|33.72| boost pinto beans. unusual, slow excuses thrash furiously. carefully pending theodolites wake among the quickly iron +256|38|4423|511.49|ly up the pinto beans. carefully even packages boost finally. bold, express deposits along the fluffily silent instructions na +257|58|5042|391.32|rs sleep carefully against the silent instructions. carefully bold instructions haggle. fluffily pending deposits sleep busily. +257|85|276|612.44|among the packages. thinly special packages sleep. blithely ironic packages are furiously around the furiously even packages. carefully unusual accounts nag bold dolphins. blithely ironic depend +257|12|8951|657.66|final, careful deposits poach fluffily against the permanently pending pinto beans. slyly express platelets us +257|39|6401|510.53|al instructions detect carefully final requests. accounts kindle slyly quickly unusual theodolites. furiously bold deposits about the carefully unusu +258|59|2767|310.17| wake quickly about the furiously regular theodolites. slyly blithe deposits engage blithely furiousl +258|86|6110|473.92|o beans. busily daring pinto beans about the slyly pending dependencies play furiously forges. express, +258|13|7290|377.76|ole quickly slyly fluffy hockey players. furiously regular packages cajole carefully across the slyly special instructions. bold packages thrash slyly. deposits p +258|40|8527|610.52|ickly bold pinto beans against the fluffily bold foxes are carefully above the quickly special ins +259|60|649|361.81|ide of the furiously fluffy requests. asymptotes was busily past the fluffily silent instructions. permanent, express accounts use slyly against the +259|87|7418|304.94|ttainments nag blithely against the blithely pending ideas. fluffily unusual pains wake slyly. blithely final requests sleep quickly pendi +259|14|2359|499.52|yly regular dolphins wake. furiously even asymptotes boost quickly. blithely final excuses boost fluff +259|41|5176|12.99|ets about the carefully regular accounts affix against the carefully unusual accounts. final, ironic asymptotes nag slyly fluffily ironic accounts. +260|61|4208|750.83|ts integrate bold instructions. fluffily ironic accounts integrate carefully fluffily quiet theodolites. unusual, final packages +260|88|681|11.99|uriously express pinto beans. carefully regular deposits wake. slyly final dependencies along the ironic, even foxes detect a +260|15|5247|988.81|ites. carefully pending dependencies poach above the final accounts. closely special packages haggle thi +260|42|4944|741.18|onic packages. evenly regular deposits alongside of the carefully blithe dolphins boost always idly regular asymptotes. special, final foxes +261|62|3590|537.09|ss requests wake blithely. ironic theodolites cajole after the furiously silent deposits. carefully slow packages against the requests will sleep slyly across the +261|89|6312|2.47|carefully packages. pending ideas haggle. special asymptotes boost furiously. quickly pending dinos cajole slyly alongside of the furiously express pac +261|16|9167|747.91|e regular, bold foxes. foxes sleep about the even, regular accounts. fluffily ironic deposits are never slyly ironic accounts; special, express foxes wake furiously. furiousl +261|43|6807|798.56|nusual pinto beans. carefully even deposits affix slyly. final, ironic dolphins solve above the blithely ironic ideas. quickly unu +262|63|6615|11.82|beans. even theodolites wake carefully outside the slyly even foxes. quickly ironic i +262|90|8397|161.89|s. furiously daring requests detect furiously furiously ironic packages. slyly express ideas cajole quickly dependencies; theodolites engag +262|17|6837|822.86|y regular pinto beans. furiously even requests cajole blithely carefully regular theodolites. asymptotes nag furiously. pending fox +262|44|7139|777.88|leep furiously. quickly unusual requests about the regular foxes boost fluffil +263|64|5592|123.18|atelets. even, ironic requests cajole above the st +263|91|2034|617.49|refully final deposits try to wake even, ironic accounts. ideas integrate bli +263|18|6697|655.09|xes affix above the quickly final deposits? slyly special dependencies affix according to the pend +263|45|6421|321.23|ously final requests. regular, unusual accounts haggle fluffily above th +264|65|7115|550.65|xcuses haggle fluffily along the blithely ironic deposits. slyly final accounts sleep asymptotes. furiously pending accounts sleep. doggedl +264|92|6442|239.05|ress theodolites run above the brave, enticing deposits-- idly bold foxes wake blithely. slyly fluffy pinto beans affix furiously close accounts. quickly pending instructions haggle. furiou +264|19|8245|887.54|sts cajole along the slyly final frays! foxes boost about the slyly ironic instructions. carefully bold instructions boost +264|46|6978|986.71|d detect-- fluffily special ideas haggle across the carefully even foxes. carefully unusual +265|66|5951|288.42|eful packages. final, regular packages grow carefully blithely ironic ideas. carefully regular requests poach special requests +265|93|3699|565.98|r accounts snooze furiously about the carefully final requests. special instructions maintain quickly final sheaves! slyly regular theodolites despite the furiously final sauternes mold carefu +265|20|2706|72.22|elets alongside of the carefully quiet packages are quietly despite the slyly ironic requests. even, final dependencies cajole blith +265|47|1452|327.52|. regular, even foxes integrate. express somas dazzle. carefully ironic deposits about the slyly express requests are furiou +266|67|2552|262.17|ve the final instructions. carefully ironic foxes wake slyly. quickly ev +266|94|3521|903.57| carefully even requests wake. careful accounts sleep furiously. blithely even pinto beans haggle carefully above the furiously bold deposits. deposits impress carefully blithely even depo +266|21|3955|555.47|wake. blithely ironic platelets integrate quickly final packages! ironic ideas haggle above the carefully pending asymptotes. special dep +266|48|1533|379.56| even deposits haggle final, final warhorses. bold pinto beans integrate slyly. carefully final pinto beans wake above the regular deposits; qu +267|68|9780|796.91|eposits. fluffily special courts cajole blithely blithely even grouches. special, r +267|95|2112|214.65|thogs. furiously ruthless requests sleep fluffily after the even platelets: final excuses play quickl +267|22|9243|478.66|theodolites. boldly final requests boost slyly slyly bold requests. slyly even deposits after the platelets cajole among the pending accounts. furiously express accounts cajole carefully close instr +267|49|5747|111.49|ve to are slyly blithely regular deposits. quickly unusual packages sleep fluffily regular accounts. slyly brave accounts against the regular requests cajole above the slyly pending +268|69|8242|893.67|re furiously regular dependencies. final ideas sleep slyly. permanently regular instructions haggle slyly above the slyly regular +268|96|532|995.83|ely regular excuses affix carefully above the packages. ironic theodolites around the deposits breach furiously across the furiously even foxes. furiously ironic accounts grow across the fina +268|23|3331|742.57|hely pending foxes among the quickly regular requests affix fluffily ironic asymptotes. final ideas among the final requests s +268|50|6321|962.07|y. even packages nag. blithely final dolphins x-ray bli +269|70|1186|753.85|es according to the furiously ironic deposits sleep s +269|97|3650|750.77| gifts integrate quickly around the fluffily express dependencies. platelets boost. even i +269|24|8833|936.99|inal courts dazzle slyly about the pending requests-- fluffily final deposits across the furiously final instructions are carefully against the furiously even asymptotes. regular +269|51|2695|874.42| the slyly unusual accounts nag fluffily against the silently unusual packages-- silent packages sleep fluffily. asymptotes cajole across the even, brave packages. carefully even accounts aga +270|71|4380|222.88|ct ruthlessly across the ironic foxes; unusual accounts play. carefully silent instructions haggle blithely across the even platelets. final accounts grow quickly requests. furiously +270|98|8479|851.32|ular ideas cajole slyly. unusual ideas affix fluffily even accounts. final, even accounts thrash furiousl +270|25|5513|559.02|ns cajole-- ironic, even deposits detect fluffily silent, fluffy accounts. always unusual deposits boost sometimes after the accounts. slyly ironic foxes wake carefull +270|52|2408|8.87|usly furiously bold accounts. bold attainments kindle. forges wake blithely enticing requests. pinto beans about the express depths promise c +271|72|2155|442.83|ackages use about the idly special accounts. silent platelets haggle alongside of the unusual, unusual packages. carefully even instructions about the care +271|99|7762|296.66|nal requests are carefully slyly express foxes. regularly even requests +271|26|3118|202.41|foxes: final dolphins sleep slyly regular instructions. final requests sleep. quickly unusual deposits are furiously-- express hockey players use carefully according to the careful +271|53|8112|504.83|s. carefully regular requests alongside of the even dolphins sleep slyly regular pac +272|73|6032|336.71|yly stealthily pending requests. blithely regular t +272|100|2196|938.89| across the quickly even packages. final requests boost boldly? even deposits cajole in place of the quickly quiet accounts. slyly regular ideas haggle ironic ideas. slyly iro +272|27|9403|764.21|g, even sheaves cajole around the pending, enticing depos +272|54|7284|13.85|y regular deposits along the blithely special foxes cajole slyly pending pinto beans. sly +273|74|1227|299.92|y bold deposits are. bold ideas up the final accounts print furiously carefully quick deposits. depo +273|1|252|26.34|ccounts boost slyly evenly pending foxes. slyly thin packages use fluff +273|28|9810|368.60|haggle furiously slyly even accounts. boldly even deposits detect carefully according to the blithely regular requests. quickly busy requests c +273|55|459|396.65|ng accounts are requests. even, ironic dependencies are slyly. blithely sly deposits nag sly +274|75|9773|406.79|jole blithely evenly regular theodolites. fluffily regular pinto beans according to the ironic accounts wake carefully furiously regular excuses-- packages nag. +274|2|6020|925.95|gage slyly above the carefully ironic theodolites. even accou +274|29|3194|208.68| after the accounts. carefully special accounts cajole blithely. ironic, regula +274|56|7541|71.95|are express accounts. quickly even foxes solve: slyly even ideas cajole fu +275|76|309|761.60|es play slyly. even pinto beans against the quickly pe +275|3|7630|88.24|ending courts integrate blithely among the ironic requests! blithely pending deposits integrate slyly furiously final packages. slyly ironic theodolites haggle furiously carefully bold pi +275|30|5084|805.78|d theodolites. bold packages among the final, special accounts haggle ironic platelets? fluffily unusual deposits cajole along the quickly ironic instructions. blithely even foxes +275|57|7063|377.14|osits. carefully even decoys about the final, sly pains sleep accounts. ironic packages +276|77|3238|210.08|l foxes sleep quickly ironic foxes. bold, dogged foxes haggle sly +276|4|2309|612.63|he theodolites. unusual excuses are alongside of the deposits. accounts according to the quickly unusual dolphins sleep slyly pending packages. carefully i +276|31|1966|878.26|xes. blithely express packages doubt among the quickly careful platelets. daringly even deposits sleep quickly caref +276|58|2154|782.37|egular deposits around the special instructions are among the evenly regular excuses. furiously bold dependencies must have to sleep furiously even platelets. furiously even packages abov +277|78|9537|590.56|al packages affix quickly up the carefully unusual theodolites. express requests wake along the furiously final ins +277|5|8662|597.19| instructions boost permanently along the busily ironic warthogs. quietly pending pains sleep carefully ironic +277|32|5298|210.21|eans are. quickly unusual instructions are blithel +277|59|7264|760.15|are quickly above the fluffily ironic orbits. blithe +278|79|3792|820.45|e throughout the quickly unusual accounts. final accounts boost above the blithely express instructions-- fluffily ironic +278|6|4046|217.42|eep carefully. unusual, regular requests are according to the special, +278|33|3228|67.03|lithely ironic accounts. unusual ideas detect. final package +278|60|9568|918.33|heodolites. slyly special pinto beans against the silen +279|80|1729|894.65|yly furiously regular foxes. regular instructions across the furiously pending ideas doubt furiously slyly +279|7|6616|508.76|. carefully ironic accounts wake above the pending, regular accounts. instructions boost evenly ironically sly deposits. ironic, pending +279|34|9390|482.06|ely regular epitaphs haggle furiously for the furiously regular accounts. blithely sly packages cajole blithe +279|61|599|340.51|e quick, express foxes lose packages. slow sauternes against the carefully final foxes cajole furiously according to the fluffily ironic packages. bold accounts cajole finally carefu +280|81|1048|817.32|ily pending packages. blithely silent instructions detect carefully unusual, pending courts. special, unusual packages sleep quietly packages. blithely pending courts sleep ab +280|8|606|641.20|t the quickly even instructions boost foxes. regular accounts cajole above the pending requests. final, regular packages hagg +280|35|828|538.74|e bold requests. carefully even instructions doze silent, silent accou +280|62|3046|863.86|xes sleep. slyly express ideas wake final, dogged ideas. carefully +281|82|935|587.67|dugouts. carefully pending instructions wake silent frays. furiously express theodolites after the always even dugouts should have to integrate blithely around the quickly pe +281|9|1961|15.41|oxes haggle according to the slyly regular requests. final, regular pinto beans was slyly accordin +281|36|7689|496.20|ic instructions cajole after the blithely ironic pinto beans. even dep +281|63|51|99.96|ndencies haggle quickly final sentiments. slyly dogged deposits are furiously ironic dependencies. pinto beans solve slyly after the pending instructions: carefully ironic deposits boost carefu +282|83|17|37.01|beans boost furiously after the ironic excuses. furiously ironic pinto be +282|10|517|869.66| to the quietly bold instructions. carefully ironic deposits by the ironic, regular requests are b +282|37|7339|100.76|among the regularly regular accounts affix furiously alongside of the furiously ironic deposits. slyly thin depos +282|64|6840|428.68|posits. blithely express epitaphs detect furiously special deposits: pending ideas haggle along the blithely pending accounts. carefu +283|84|80|230.32|al accounts. ironic requests use. even forges boost. packages promise slyly slyly silent platelets. ironic, regular foxes cajole slyly special ideas. qui +283|11|3008|125.39|fully bold requests. regular, stealthy platelets about the final dependencie +283|38|484|766.99|ual pinto beans are across the slyly final frays. quietly pending courts sleep slyly regular ideas. excuses nag slyly furiously regular deposits +283|65|7750|757.03|dolites are carefully blithely final deposits. express accounts across the daringly pending deposits use furiously special pinto beans. careful theodolite +284|85|3166|261.10|above the furiously ironic ideas use evenly furiously unusual instructions. regu +284|12|4409|973.64|ickly final deposits mold blithely pending packages! slyl +284|39|3010|402.19|ly special foxes sleep slyly about the furiously express instructions. busily furious package +284|66|2608|588.44|uests. final dugouts wake blithely about the furiously unusual foxes. carefu +285|86|3017|983.75|gular deposits cajole even, final requests. quickly unusual hockey players after the express, special deposits may sleep after the pending, regul +285|13|996|448.03|e furiously after the regular, regular accounts. blithely unusual warthogs around the express instructions maintain quickly after the blithely final deposits! even, express th +285|40|8086|835.59|lyly even asymptotes; slowly pending requests maintain slyly. evenly final theodolites cajole carefully slyly ironic accounts. instructions among the slyly regular sentim +285|67|723|12.85|ges! furiously bold packages try to was. even theodolites play. slyly special packages promise slyly above the slyly ironic requests; final asymptotes are ruthlessly. platelets wake slyly slyl +286|87|1243|376.75|e blithely unusual requests boost above the regular accounts. regular theodolites about the quickly final dolphins +286|14|4231|498.89|s. ironic, regular deposits cajole furiously final pains; blithel +286|41|6267|379.51|ckages nag quickly about the ironic, idle packages. regular platelets snooze slyly slyly ironic asympt +286|68|5285|960.13| quickly. slyly unusual accounts nag furiously; stealthy instructions cajole doggedly alongside of the fluffily final package +287|88|8571|219.71| against the carefully careful ideas. fluffily even requests integrate according to the slyly ironic deposits. blithely pending accounts sleep. final asy +287|15|9210|536.48|ar theodolites above the blithely special theodolites wake according to the regular accounts. slyly unusual deposits across the slyly regular deposits haggle +287|42|1449|787.67|eans are final ideas. regular, regular accounts are furiously according to the regular, special +287|69|9865|674.51|gular warthogs cajole idle dependencies. slyly pending deposits wake furiously quickly regular packages? carefully unusual accounts cajole. blithely pending accounts sleep along the quickly bold r +288|89|1353|915.77|sits integrate carefully quickly pending platelets. carefully special de +288|16|9337|814.16|riously busy requests. quickly pending accounts sleep furiously past the regula +288|43|7811|361.02|lithely at the ironic, pending courts. even, regular requests cajole slyly final asymptotes. even +288|70|8056|6.69|re carefully special deposits. final pinto beans among the slyly regular +289|90|8148|884.14|er the ironic deposits. blithely regular theodolites integrate around the even multipliers. final, special accounts was after the express deposits. carefully special packages solve quic +289|17|4570|715.63|its integrate carefully slyly ironic frets. blithely express packages along the +289|44|2659|822.55|carefully regular instructions. pinto beans near the furiously bold depend +289|71|7441|519.98| blithely regular requests: ironic instructions above the fluffily even pinto beans wake carefully along the silent, +290|91|2802|197.07|ts cajole along the ironic ideas! slyly pending ideas again +290|18|5235|670.51|ent sentiments detect quickly blithely silent requests-- slyly brave dolphins sleep slyly. furiously final deposits might are. always regular packages cajole quickly carefully even excuses. qui +290|45|1424|646.67| daring courts sleep thinly. never furious packages at the car +290|72|3125|586.98|ggle regular theodolites; theodolites sleep carefully express ideas. close packages according to the slyly final deposits wake quickly even requests. even courts sleep slyly +291|92|380|383.56|gular deposits use above the ideas. deposits was furiously. slyly express foxes haggle ideas. carefully express requests wake slyly after the fluffily regular requests. fluffily final foxes detect s +291|19|5571|219.57|o the regular deposits. deposits cajole. final theodolites wake eve +291|46|7165|270.40|its haggle. even, regular dependencies are final, unusual excuses. final ideas boost except the regular dependencies. final packages slee +291|73|9023|338.50|. packages haggle slyly final packages. blithely bold requests alongside of the quickly special deposits cajo +292|93|8086|996.20|n foxes. slyly regular requests are quickly against the stealthy, final dependencies-- furiously final packages along the ironic p +292|20|9673|927.85|carefully sometimes final warthogs. permanently bold requests cajole above the express escapades. quickly ironic requests cajole. furiously express requests +292|47|4133|143.75|idly final instructions. foxes sleep carefully final accounts. deposits can mold slyly boldly unusual packages. carefully e +292|74|2221|597.53|unusual requests haggle fluffily ironic deposits. blithely silent pearls haggle ruthlessly unusual +293|94|3765|919.92|ke carefully final accounts. slyly ironic requests wake quickly. blithely regular accounts are carefully above the carefully stealthy requests. slyly daring packages after the dependenc +293|21|9232|597.44|ages. furiously final somas sleep slyly alongside of the furiously pending foxes: blithely even ideas cajole carefully deposits. carefully regular tithes sleep alongside of the slyly ironic +293|48|3007|421.32|ts. brave ideas nag special instructions. blithely final frets detect slyly quick, iro +293|75|7704|323.62|efully according to the carefully ironic excuses. accounts wake carefully against the thin requests. furiously pending accounts sleep slyly ironic requests. regular, +294|95|4958|755.15|l requests about the furiously even frets maintain against the slyly ironic instructions +294|22|5459|642.44|n pains. regular deposits across the blithely even excuses are carefully bli +294|49|2954|387.79|ly pending theodolites. regular requests are quietly furiously regular fo +294|76|8698|324.37|y bold deposits sleep furiously carefully regular deposits. ideas about the blithely ironic ideas sleep furiou +295|96|2911|273.94|ding accounts. pending, unusual attainments haggle furiously. blithely permanent theodolites use carefully. regular accounts boost fu +295|23|5745|860.51|he quickly express ideas boost blithely ironic accounts-- furiously final packages nod blithely ironic, final theodolites. furiously ironic instructions wake blith +295|50|9953|123.33|sly-- pending, slow foxes among the carefully bold packages hag +295|77|2157|45.25|eep carefully around the packages. fluffily final requests wake blithely alongside of the notornis. ironic, express packages doze ironic, regular plate +296|97|8081|600.92|ntegrate. slyly silent packages nag furiously. qu +296|24|6040|954.78|er the carefully pending accounts cajole carefully alongside of the ironic accounts. quickly blithe pinto beans haggle furiously. stealthily special dependencie +296|51|14|175.09|uickly express requests. furiously express packages are furiously against the fluffily careful saute +296|78|6192|874.52|uffily even theodolites according to the slyly blithe accounts cajole about the +297|98|3869|918.93|oss the blithely ironic ideas. even pinto beans haggle. permanent braids boost +297|25|3206|980.58| carefully about the blithely regular requests. furiously final dependencies haggl +297|52|2952|281.94|into beans. regular decoys above the quickly unusual requests s +297|79|8465|439.74|eposits sleep quickly across the quickly even accounts. blithely pending accounts sleep slyly. pending ideas boost. deposits boost after the slyly final depende +298|99|9804|314.49|nst the regular, furious platelets. regular packages cajole. ironic, pending ideas sleep slyly ironic excuses. requests cajole? blithely express req +298|26|7273|210.43|deposits haggle fluffily. final packages sleep furiously unusual frets. regular, regular excuses haggle slyly carefully ironic accounts. regular ideas unwind slyly acco +298|53|5321|380.94|longside of the close foxes dazzle slyly unusual requests. pinto beans cajole at the fluffily final requests: even platelets sleep quickly express asymptotes. blith +298|80|1664|18.20|er the slyly silent accounts. daringly special depos +299|100|4365|438.80|odolites. carefully regular packages solve against the furiously bold excuses: deposits w +299|27|1747|489.79|etimes special frays. unusual accounts boost blithely. even foxes sleep. furiously ironic dependencies sleep f +299|54|2035|248.11|ithely final foxes cajole. blithely pending packages grow slyly special, ironic platelets. fluffily pending dept +299|81|590|444.06|ly. final, final requests across the forges wake slyly after the sauternes. slyly final pinto be +300|1|6518|924.41|s the special packages. daringly silent somas are blithely even, unusual pinto beans. silently ironic pinto beans cajole furiously unusual requests. furiously even deposits impress. pendi +300|28|7010|190.59|ual pinto beans. blithely express foxes unwind carefully instead of the accounts. ironic accounts boost slyly regular excuses. quickly unusual courts sleep furiously. fluffily even pinto beans h +300|55|7118|743.78|sts wake carefully regular, pending pinto beans. unusual foxes wake slyly among the ironic, reg +300|82|2714|339.22| carefully regular deposits. evenly silent pinto beans integrate. even, regular packages are furiously against the even requests. fluffily special asymptotes across the slyly +301|2|7050|251.11|attainments doze fluffy deposits. carefully pending pinto beans cajole slyly pending, pending ideas. carefully silent theodolites sublate fluffily around th +301|30|3908|877.38|s. furiously enticing packages lose quickly slyly ironic gifts. asymptotes do dazzle carefully final, bold packages. furiously silent asymptotes sleep blithely final asymptotes. requests are. foxe +301|58|2880|954.20|efully bold deposits cajole blithely silent warhorses. furiously even pinto beans sleep blithely instructions. quickly pending requ +301|86|8169|335.10|carefully. blithely express packages hang about the boldly silent packages. final, final instructions boost slyly. slyly express deposits cajole slyly regular instructions. blithely +302|3|6118|885.76| are regularly. furiously regular requests during the sl +302|31|9419|38.78|d platelets detect furiously across the slyly even packages. slyly brave requests sl +302|59|9134|764.04| dependencies sleep furiously around the special, even instructions. furious, ironic f +302|87|3921|148.56|xpress pinto beans. bold, regular theodolites cajole slyly against the carefully even asymptotes. final, ironic excuses haggle furious +303|4|9794|499.32|er the final instructions kindle final, pending ideas. blithely final excuses across +303|32|8459|717.65|symptotes. Tiresias affix slyly. bold, regular asymptotes boost quickly according to the final, regular courts. regular, ironic pinto beans are blithely carefully ironic accounts. platelets s +303|60|2331|682.84| the furiously ironic requests. ironic, final requests haggle carefully beneath the hockey p +303|88|3092|106.23|blithely ironic accounts. platelets integrate slyly about the blithely final sauternes. boldly final accounts cajole furiously after the idly final deposits. quickly final theodolites wake finally +304|5|644|419.29|y final asymptotes! carefully regular requests wake blithely. furiously final theodolites detect carefully across the slyly express excuses. regular requests are. carefully special decoy +304|33|1696|315.96|press bold instructions. carefully final ideas haggle aft +304|61|851|944.89|ies. carefully pending deposits after the blithely special instructions use final accounts. doggedly exp +304|89|4334|770.75|tructions. final deposits cajole. quickly even packages shall have +305|6|2828|105.28|ronic deposits haggle quickly blithely express packages. bold, ironic packag +305|34|1846|428.85|uctions above the foxes sleep carefully at the carefully final accoun +305|62|2863|147.36| sleep carefully. deposits cajole furiously. even dinos haggle blithely slyly even packages. ideas haggle. unusual, even deposits are boldl +305|90|2758|442.56|ilent attainments. slyly final packages cajole. carefully even foxes integrate according to the ironic deposits. slyly regular theodolites w +306|7|3429|671.11|foxes are among the furiously bold foxes. asymptotes about the express requests thrash about the regular packages. carefully regular deposits haggle fluffily! furiously even requests are +306|35|9417|789.02|gular accounts hang against the dolphins. blithely regular deposits nag blithely after the fluffily unusual packages. carefully even deposits cajole quickly. bli +306|63|6950|405.25|counts promise above the quickly special foxes. accounts are slyly regular asymptotes. furiously special instructions print +306|91|7651|33.95| furiously silent deposits above the ironic accounts haggle carefully carefully ironic foxes. close platelets haggle furiously slyly ironic deposits. carefully ironic requests around the final acc +307|8|1809|354.10|sual ideas. carefully ironic epitaphs cajole furiously among the closely express asymptotes. final asymptotes detect. furiously bold instructions sleep sly +307|36|4455|578.21|deas. slyly final foxes haggle fluffily furiously bold accoun +307|64|259|867.98|al packages above the blithely pending theodolites kindl +307|92|8178|902.14|nto beans. deposits along the express, ironic deposits haggle beneath the blithely ironic ideas: even, unusual platelets are. excuses according to the unusual, special dep +308|9|1421|511.71| haggle. fluffily final ideas sleep doggedly. silent, final accounts wake quickly. blithely regular deposits sleep carefully +308|37|264|169.31|lyly even accounts. ideas after the carefully pending deposits haggle after the quickly special pinto beans. carefully ironic accounts haggle furiously regular instructions. f +308|65|4206|639.67|riously bold excuses print doggedly bold requests. carefully careful attainments engage; even sheaves according to the slyly bold packages sleep blithely about the carefully +308|93|3473|835.30|ely even pinto beans? final requests boost carefully along the regular accounts +309|10|6409|12.41|gside of the packages: carefully unusual forges impress slyly sometimes regular accounts. slyly special platelets might wake furiously according t +309|38|1870|989.46|deposits cajole carefully unusual pearls. packages wake blithely fluffily pending excuses. slyly express deposits after the thinly unusual theodolites cajole slyl +309|66|5619|635.09|y slyly regular packages. doggedly pending requests solve. carefully unusual packages sleep regula +309|94|3596|719.58|uriously regular excuses. instructions sleep. blithely express accounts thrash. express dolphin +310|11|5820|251.97|he blithely ironic deposits. furiously express pinto beans wake across the blithely regular deposits. carefully unusual deposits against the permanently unusual requests sleep blithel +310|39|9797|378.30|e blithely bold instructions. unusual, silent ideas sublate blithely. pending packages are furiously along the final, ironic packages. slyly bold packages sleep furiously according to the f +310|67|2896|696.04|among the carefully quiet asymptotes haggle quickly blithely dogged requests. bold deposits affix carefully alongside of the final accounts. slyly regular packages are after the boldly bold dep +310|95|786|185.63|gle blithely pending waters. regular requests cajole carefully pending requests. fluffily unusual packages should wake blithely bravely ironic requests. regular, express r +311|12|799|256.71|around the regular, regular packages. furiously express packages cajole even +311|40|2464|62.15|s. blithely unusual deposits integrate. carefully regular pinto beans wake slowly furiously final pinto beans. slyly even pinto beans are about the +311|68|3560|899.72|c instructions. deposits wake furiously furious do +311|96|7092|813.30|en theodolites affix according to the furiously final packages. blithely ironic pac +312|13|2222|964.88|to beans. bold packages wake quickly regular, regular dolphi +312|41|2789|3.01|the ironic accounts. busy dolphins dazzle among the furiously express ideas. ironic asymptotes will h +312|69|4410|900.66|uffily ironic dolphins affix slyly according to the carefully unusual notornis. furiously ironic dependencies cajole; furiously +312|97|608|715.73|tructions. express instructions integrate carefully; carefully special accounts cajole carefully according to the ironic, unusual foxes. regular deposits boost after the ironic, +313|14|3787|413.31| alongside of the furiously unusual instructions. pending, special foxes cajole slyly. special ideas sleep slyly. slyly regul +313|42|3617|656.08|counts use after the fluffily regular accounts. final dolphins sublate. blithely pending packages haggle finally furiously ironic requests; sly +313|70|2264|975.79|ly unusual deposits against the blithely even instructions sleep furiously regular, regular ideas. even, regular i +313|98|2574|670.56|s the even, daring deposits mold accounts. carefully express accounts haggle fluffily blithely pending ideas. blithely final courts haggle blithely about the regular theodolites. quickly +314|15|8985|613.18|ular pinto beans hang. quickly regular requests integrate slyly quickly regular dolphins. fluffily special theodolites cajole unusual accounts. furiously regular excuse +314|43|910|188.83|es nag across the enticing packages. carefully special instructions haggle slyly after the blithely even packages. pending, unusual asymptotes wake furiously against the +314|71|573|85.10|e regular deposits. furiously even excuses solve quickly. ironic deposits boost furiously along the blithely bold asymptotes. furiously special deposits haggle slyly among the regular instruct +314|99|4839|923.67|ough the slyly special theodolites. regular Tiresias wake across the final, regular deposits. furiously final ideas breach. unusual +315|16|8068|696.12|e instructions are according to the furiously unusual asym +315|44|1267|608.15| accounts boost before the special requests. daringly ironic packages are after the carefully ironic epitaphs. bold, special deposits nag. even, even excuses affix slyly. quickly permanent platelet +315|72|5609|536.31|beans detect furiously. even, express instructions cajole even deposits. caref +315|100|8071|931.74|l instructions: dependencies among the excuses believe fluffily after the carefully unusual ideas. regular +316|17|8732|456.59|. final decoys above the furiously ironic accounts grow above the carefully even multipliers. ironic dolphins cajole quickly bold dolphins. final deposits eat furiously permanent excuses. regu +316|45|8839|823.03|e furiously pending packages. unusual packages mold quickly carefully fi +316|73|8752|591.79|sts hinder carefully. furiously unusual deposits haggle fluffily +316|1|8192|325.50|y carefully final asymptotes. slyly special foxes are fu +317|18|3554|332.00| asymptotes doze fluffily according to the furiously pending theodolites. carefully unusual deposits are among the fluffily final instructio +317|46|6084|633.24|ular ideas before the accounts use carefully across the requests. unusual, pending accounts cajole blithely according to the slyly final +317|74|5004|732.48|sly even ideas. carefully bold dependencies nag blit +317|2|52|319.63|ideas solve escapades. unusual foxes use according to the regular accounts. carefully special packages believe blithely after the pending requests. quickly pending ide +318|19|9115|625.00| excuses. carefully ironic excuses are slyly across the decoys. carefully special foxes boost whithout the furiously regular requests. care +318|47|4020|972.74|y according to the bold requests. special instructions boost carefully furiously regular excu +318|75|9011|272.65|onic packages will have to boost carefully above the ruthlessly quick ideas. slyly special accounts are slyly. carefully ironic instructions boost. slyly pend +318|3|2036|209.06|p carefully furiously express accounts. carefully even requests across the pending excuse +319|20|9918|465.97| ruthlessly quickly silent requests. quickly regular accounts wake furiously. slyly bold accounts wake along the carefully final fox +319|48|8816|606.95|slyly. quickly final foxes are slyly ironic excuses. ironic packages among the special instructions run quickly against the final, expre +319|76|7694|326.82|ets. regular, even deposits sleep theodolites. even foxes dazzle carefully after the slyly even excuses. ironic pinto beans are carefully unusual accounts. quickly ironic instructions after the +319|4|2417|557.91|ieve ironic asymptotes. blithely final accounts use. bold, special foxes nag never alongside of the blithely quiet foxes. enticingly close packages against the even, regular escapades boost +320|21|1322|324.25|use quickly. even requests are slyly permanently unusual platelets. final accounts after the packages impress slyly according to the excuses. regularly regular deposi +320|49|9604|309.83| deposits. slyly daring ideas haggle pending, regular platelets. final requests integr +320|77|7644|663.54|slyly. regular foxes after the quietly even requests grow above the quickly bold packages. carefully pending packages affix slyly fin +320|5|1129|433.78|after the slyly final deposits solve slyly after the pending asymptotes. theodolites maintain always after the ironic packages. furiously pending deposits boost furiously abo +321|22|2538|42.75| ironic pinto beans. unusual, regular excuses hang boldly furiously final grouches. blithely busy reque +321|50|429|466.22| foxes haggle ironic instructions. slyly ironic deposits toward the regular deposits sleep final deposits. regular packages haggle slyly near the blithely e +321|78|5325|833.34|d pinto beans. even, idle deposits wake. carefully regular deposits nag blithely even attainments. fluff +321|6|5778|46.51|y. slyly ironic patterns about the carefully unusual packages use thinly stealthy requests. thin accounts unwind ironic foxes: blithely pending deposits cajole +322|23|7488|700.81|deposits use slyly ironic tithes. regular, close requests are. slow dependencies cajole against the daring, +322|51|808|410.61|esides the silently final excuses cajole after the slyly even pinto beans. blithely ironic packages wake blithely. even courts sleep fluffily after the fluff +322|79|9986|190.97|the platelets wake furiously somas. packages use express, idle requests. unusual foxes haggle boldly behind the unusual deposits. fluffily stealthy dec +322|7|6413|134.72| affix quickly express, ruthless packages. furiously special deposits was +323|24|7168|784.33|kages after the special accounts use always furiously silent packages. ironic, unusual instructions affix blithely even asymptot +323|52|2470|574.84|lar ideas was blithely across the express packages. quickly regular ideas ca +323|80|4158|131.93|theodolites about the ironically regular deposits use furiously express, ironic packages. quickly unusual warhorses wake bold, special cour +323|8|7782|862.38|eas. special foxes sleep. accounts eat slyly across the furiously silent ideas. carefully special requests among the ironic f +324|25|8571|575.93|usly ironic ideas along the quickly final packages cajole blithely +324|53|1057|473.94|fter the fluffily final accounts. fluffily final notornis detect quickly. slyly express pinto beans cajole blithely blithely regular packages. pinto beans alongside of the carefully regu +324|81|8011|583.67|pinto beans could have to haggle slyly. thinly unusual deposi +324|9|5352|789.53|s will sleep slyly against the final theodolites. fi +325|26|8818|982.96|unts cajole. blithely special accounts cajole slyly. furiously regular pinto beans haggle blith +325|54|3085|314.81|place of the carefully even dinos. ironic requests cajole instructions. theodolites above the slyly regular theodolites are even packages. quickly unusual escapades are regularly above the foxes! +325|82|511|457.53|oss the accounts. carefully even foxes before the quickly final accounts are furiously according to the regular, regular pinto beans-- slyly quiet accounts boost carefu +325|10|7915|521.61|r the furiously even asymptotes. bravely bold packages boost furiously. bold theodolites sleep. slyly ironic requests wake fluffily among the even, en +326|27|464|717.88|fter the express deposits. asymptotes cajole slyly among the brave platelets. express, final excuses affix. packages sleep ruthlessly +326|55|7160|592.60|ronic deposits wake slyly regular ideas. pinto beans across the carefully even ideas affix furiously fluffily final accounts. packages are blithely above the r +326|83|8293|939.01|gle according to the carefully special accounts. unusual ideas haggle furiously ironic foxes. pending somas cajole carefully furiously ironic requests. unusual +326|11|2648|813.21|unts are ideas. final deposits shall have to are furiously special packages-- final dependencies use according to the carefully final instructions. furiously ironic mu +327|28|5214|447.89|ffix furiously even, unusual accounts. dependencies boost blithely above the regular pinto beans. final instruction +327|56|2157|351.69|leep furiously. pending requests integrate carefully slyly regular ideas. regular, final packages are slyly regular pinto beans-- bol +327|84|4890|51.95|ans haggle fluffily carefully pending requests. blithely bold packages wake. unusual packages believe above the regular, regular platelets. final account +327|12|7862|290.17|uests. regular requests haggle. blithely bold requests l +328|29|9311|976.49| deposits. quickly even accounts cajole carefully. slyly pending dugouts poach. furiously regular packages nod furiously: fluffily final deposits sleep fluffily. e +328|57|5566|346.00|al ideas. carefully daring packages above the slyly silen +328|85|7348|213.64|instructions cajole carefully even courts. slyly express dependencies nag slyly. final theodolites believe. furiously pending packages after the furiously ironic sentiments ne +328|13|4267|517.57|inal packages sleep furiously according to the slyly final requests. special accounts wake furiously unusual ideas. express frays haggle slyly! regular foxes haggle. accounts sleep quickly quickly +329|30|3180|757.13|of the furiously even instructions haggle slyly about the furiously ironic warthogs. unusual requests sleep ironically against the pend +329|58|1135|974.30|uests integrate. pending packages are quickly among the furiously even packages. fluffily bold foxes grow regul +329|86|8056|565.80|ly. express, furious packages wake blithely fluffil +329|14|8133|167.54|ording to the special packages. instructions boost unusual requests. blithely ironic platelets affix slyly against the furiously bold pinto beans. requests against t +330|31|3634|839.23| the pinto beans eat at the quiet deposits. express, bold sentiments sleep blithely according to the blithely ironic theodolites. furiously even instruction +330|59|9489|214.60|egular excuses wake furiously ironic, bold dinos. fluffily sp +330|87|9145|539.12|lyly ironic ideas nag furiously ironic warhorses. quickly express packages after the furiously bold accounts grow slyly final, even deposits. quickly silent excuses hin +330|15|521|183.79|the furiously ironic accounts. sentiments are with the furiously silent accounts. regular requests i +331|32|5261|275.80|ly express packages grow fluffily along the blithely even packages +331|60|5649|176.15| furiously carefully regular dolphins. carefully ironic braids boost fluffily quickly ironic dependencies. carefully even ac +331|88|6616|830.53|ironic accounts sleep blithely fluffily ironic packages. furiou +331|16|4664|882.46|t requests beneath the final courts haggle furiously after the special requests! blithely ironic packages across the sl +332|33|238|471.35|efully final accounts. carefully unusual frays grow after the furiously unusual foxes. accounts among the blithely express foxes +332|61|7465|151.88| to the regular, regular deposits. slyly final dependencies sleep requests. slyly regular +332|89|2373|517.55|nag fluffily against the special packages. final, final deposits integrate. slyly regular packages wake. final foxes across the regular, pending theodolites use blithely about the slyly r +332|17|6771|404.96|onic instructions use slyly regular, regular packages. blithely pending deposits according to the furiously regular accounts cajol +333|34|229|249.97|uctions promise above the regular pinto beans. regular accounts along the slyly even packages ar +333|62|5833|590.86|ges wake carefully regular requests. regular deposits could affix furiously. carefully ironic requests +333|90|6697|647.82|mptotes nag furiously! furiously pending accounts sleep final foxes. final, regular accounts about the carefully special asymptotes sleep ca +333|18|3264|937.23|etimes express theodolites cajole along the quickly ironic accounts. quickly ironic packages are thinly even requests. silent deposits haggle against the fluffily regular escapades. +334|35|1349|854.29| hockey players haggle inside the special, ironic packages. +334|63|3036|555.50| even, regular platelets wake deposits. special deposits haggle acros +334|91|1715|758.64|about the quickly unusual ideas. theodolites sleep carefully fluffily ironic foxes. express packages are furiously about the accounts. slyly ironic asymptote +334|19|5313|406.96|ake quickly after the final pinto beans. blithely ironic deposits nod. blithely even +335|36|8763|738.18|uctions haggle. quickly silent dolphins nag blithely regular requests. blithely final dolphins may wake quickly final requests. blithely silent ideas after the even accounts print ab +335|64|8252|130.65|r foxes use. blithely silent accounts wake according to the pending epitaphs. slyly special packages about the fluffily regular deposits wak +335|92|2622|330.78|sleep quickly. pending theodolites haggle behind the unusual deposits. ironic packages integrate about the slyly bold excuses. packages along the regular, ironic requests wake along +335|20|7246|130.57|ar, regular accounts sleep carefully. regular deposits wake carefully final requests. ironic accounts cajole quickly. daring, final accounts +336|37|4173|954.09|ggle after the ideas. carefully even dependencies are furiously along t +336|65|7958|498.61|ithely against the slyly ironic packages. fluffily silent packages against t +336|93|7360|648.62|nding, even dinos. final, even requests haggle furiously. special, regular packages nag carefully across the special, even pinto beans. furious +336|21|1661|339.32|ntain along the furiously ironic packages. express accounts sleep quickly. deposits cajole slyly regular ideas. final excus +337|38|5120|848.90| boost ruthlessly. blithely silent accounts about the fluffily special requests cajole quickly pendin +337|66|8361|839.89|ording to the carefully even pinto beans cajole quickly about the fluffily ironic +337|94|4671|229.87|arefully ironic asymptotes detect. slyly idle gifts wake quietly quickly sp +337|22|7643|451.43|ts believe quickly about the furiously ironic foxes. furiously brave deposits according to the carefully final courts haggle furiously slyly silent requests. accounts doubt blithely ironic ac +338|39|3179|938.61|lly ironic decoys. final ideas haggle fluffily express foxes. ironic, pending accounts engage blithely. blithely regular packages haggle furiously. fluffily ironic accounts wake above the car +338|67|9828|73.37|s sleep alongside of the slyly regular foxes. final accounts from the final pinto beans nag above the regular ideas. ironic foxes affix after the furiously regular ideas. permanently +338|95|2514|686.08|s boost among the regular, final deposits. ironic, speci +338|23|3354|689.15|ar foxes haggle packages. furiously ironic accounts haggle fluffily final deposits. bold, regular foxes detect quickly ironic instructions. blithely regular packages are furiously agains +339|40|1413|204.58|nal, express packages. ideas across the final, pending deposits haggle slyly final the +339|68|9921|48.45|ronic deposits are across the express pains. blithely even packages are according to the ironic accounts. idle, final packages boost. special instructions according to the slyl +339|96|7273|312.49|ckly express packages believe slyly along the furiously final theodolites. express accounts sleep carefully alongside of the even instructions? carefully ironic pac +339|24|1279|511.49|kages. deposits among the carefully final dependencies haggle despite the furiously final p +340|41|7657|471.88|nding warthogs. permanently final instructions thrash blithely along the fluffily special accounts? packages kindle ironically slyly express requests. +340|69|4440|977.44|ironic packages. furiously regular instructions acco +340|97|7300|415.14|ar requests. blithely final accounts sleep express requests. even dependencies use blithely-- quickly unusual accounts wake deposits. fluffily iro +340|25|9067|441.56|. bold instructions are carefully blithely final foxes. slyly unusual ideas wake slowly aroun +341|42|6928|943.16|inal packages affix permanently regular, regular foxes. packages nod. final accounts wake carefully slyly regular platelets. fluffily ironic packages wake furiously across the slyly sp +341|70|9855|629.22|ully even asymptotes nag quickly. blithely even accounts do cajole fluffily. slyly special deposits haggle ironically. stealthily even courts +341|98|539|125.74|oost. pinto beans nag blithely. pains sleep fluffily along the blithely unusual request +341|26|7697|632.54|ecial dugouts detect slyly regular, ironic instructions. final, bold patterns haggle among the fluffily bold ideas. ironically final platelet +342|43|1221|831.51|lithely furious requests. blithely regular grouches mold final, pending deposits. special packages after the furiously ironic dinos a +342|71|3567|380.47|arefully even deposits detect pending packages. express, regular pinto beans are furiously bold ideas. stealthily even ideas are slyly. ironic requests use quickly bold deposits. courts inte +342|99|6128|105.32|ckly bold accounts. slyly pending deposits wake af +342|27|2518|79.22|nag quickly regular accounts. instructions boost slyly furiously final dependencies. slyly even ideas boost even packages. quickly even accounts alongside of the blithely ironic +343|44|3058|18.48| blithely regular packages. slyly unusual accounts breach. regular packages after the slyly blithe accounts are ironic instru +343|72|5322|242.79|telets wake blithely ideas. slyly regular packages cajole after the slyly special accounts. carefully express requests are across the express ideas. final packages wake slyly along the express, dar +343|100|458|857.63|ending dependencies. furiously express packages solve against the pinto beans. furiously regular deposits are +343|28|7323|771.94|ording to the idle accounts. quickly express requests haggle. quickly express packages boost across the blithely regular packages. furiously +344|45|8115|60.81| special asymptotes. special, pending requests nag fluffily against the slyly ironic excuses. carefully express frays use express, final courts. unusual, even foxes use furiously pending packages. +344|73|948|324.26|hely special asymptotes detect furiously. furiously express dependencies wake blithely after the pending platelets. furiously express instructions above the dependencies +344|1|7118|463.06|. blithely regular deposits are furiously blithely pending requests. slyly even deposits poach slyly blithely regular accounts. slyly regular platelets int +344|29|7524|541.23|egular, special requests. furiously ironic instructions sleep slowly. foxes along the theodolites could sleep fluff +345|46|2457|786.54|pending dugouts. carefully bold theodolites use slyly special excuses. regular deposits boost foxes. idly silent deposits after the packages are pi +345|74|7767|667.42|ly blithe requests detect furiously. furiously express packages lose alongside of the final platelets. regular requests use pending, i +345|2|8463|638.37| furiously ironic deposits about the accounts print blithely against the sly pains. blithel +345|30|9498|995.31|unts nag fluffily furiously even patterns. special requests sublate ironic depths. regular, regular ideas detect furiously special packag +346|47|6697|26.92|kages instead of the foxes are regularly across the regular ideas. pending asymptotes cajole behind the blithely express packages. unusual packages nag carefully ironic requests. blithely special as +346|75|6640|92.13|es. furiously unusual excuses sleep slyly slyly pending foxes. carefully express pin +346|3|8858|261.72|the slyly pending accounts. slyly regular ideas sleep ironic foxes. slyly bold platelets above the ideas nag Tiresias. furiously reg +346|31|5835|302.24|es. carefully ironic instructions nag blithely. bravely even deposits sleep fluffily furiously final packages. even, ironic warthogs after the iro +347|48|5863|8.56| fluffy ideas. regular, ironic pinto beans wake. courts after the dependencies are carefully above the carefully regular accounts. slyly ironic accounts +347|76|9132|306.86|avely regular pinto beans. blithely silent accounts cajole final sentiments. careful ideas affix slyly slyly regular decoys. re +347|4|4618|833.43|ly regular pinto beans affix daringly even, even foxes. even deposits maintain. ironic deposits sleep carefully. special, regular accounts cajole after the regular ideas-- blithely +347|32|478|675.62|s. slyly ironic packages cajole slyly? quickly pending requests nag blithely. unusual, regular theodolites sleep. theodolites wake quickly excuses. furiously blithe courts haggle outside the qu +348|49|4129|603.76|hins wake quickly. carefully pending requests haggle furiously. quickly final pinto beans sleep furiously. furiously even acc +348|77|4958|640.25|lyly at the packages. accounts nag regular dependencies. idly bold dolphins wake slyly across the blithel +348|5|4606|659.38|after the even deposits. boldly regular instructions use even pinto beans. accounts play idly. final deposits x-ray: pending, even forges between the +348|33|7744|452.86|bold, bold foxes. courts ought to wake. carefully regular she +349|50|2419|969.27|c accounts lose bold, express deposits! permanent, final packages wake +349|78|253|957.16| courts. carefully quick requests cajole busily even, unusual ideas. furiously final pinto beans cajole slyly along the ironic +349|6|7454|205.04|final deposits above the blithely ironic theodolites na +349|34|8502|828.77|regular asymptotes. bold instructions integrate slyly furiously even deposits. furiously unusual platelets are unusual accounts. slyly regular ideas wake furiously fi +350|51|5552|286.09|odolites along the blithely pending ideas are carefully since the final, ironic de +350|79|1219|412.60|ar excuses play carefully about the thinly regular accoun +350|7|3715|771.14|e carefully according to the regular accounts: final, unusual +350|35|2336|689.44| ironic, regular dolphins haggle. carefully final accounts lose. pending, regular packages affix furiously carefully special courts? carefully silent platelets ki +351|52|4245|141.81|le furiously along the excuses. final foxes are alongside of the b +351|80|1754|951.21|latelets cajole slyly slyly regular instructions. carefully ironic theodolites detect carefully final foxes. furiously silent platelets serve blithely. even pack +351|8|3954|107.33|s hang slyly along the final deposits. ironic, regular excuses against the slyly regular deposits sleep quickly express requests. quickly even re +351|36|9106|984.30|ld asymptotes wake around the slyly unusual pinto beans. fluffily special deposits snooze against the blithely express courts. furiously unusual asympto +352|53|1751|757.34|ongside of the regular deposits cajole fluffily around the ev +352|81|6905|534.11|ual patterns dazzle quickly along the never even excuse +352|9|3116|899.22|yly regular platelets. unusual, even warhorses cajole furiously across the expres +352|37|2576|422.98|ove the silent, regular multipliers. sheaves doubt. instructions haggle furiously among the fluffily final warthogs. instructions according t +353|54|8705|250.61|unusual deposits boost slyly against the final, regular packages. final, pending instruc +353|82|6230|491.76|s. permanently unusual requests among the slyly ironic instructions wake despite the fluffily even pinto beans? carefully final packages against the quickly regular dependencies cajole +353|10|8479|425.50| pinto beans cajole. final accounts about the even foxes boost deposits. blithely pending patterns are fluffily quickly final ideas. final accounts sleep bl +353|38|7642|698.38|sits. even requests cajole quickly. instructions haggle furiously furiously regular patterns. f +354|55|7041|517.87|ccounts. ironic accounts boost above the fluffily slow deposits. fluffily unusual accounts print furiously. furiously final packages affix fluffily. ironic, pending pinto beans at +354|83|4171|746.59|y even accounts. quickly silent courts wake blithely requests. carefully ironic requests cajole ruthlessly. furiously bold acco +354|11|4564|682.21|g the special asymptotes. final instructions cajole pinto beans. express, express decoys across the slyly bold pinto beans are according to the enticingly ironic requests. slyly +354|39|5127|559.61|xcuses wake carefully about the regular, ironic fox +355|56|6679|881.63|eodolites sleep slyly in place of the ironic platelets; regular theodolites wake busily around the carefully ironic deposits. pending, express platelets are acco +355|84|4837|543.19| ideas haggle fluffily. regular ideas cajole fluffily fluffily unusual pinto beans. even, even packages to +355|12|3157|636.73|the furiously special instructions? dogged requests cajole slyly furiously unusual deposits. doggedly even deposits haggle. ironic, even requests after the blithe +355|40|9387|328.97|ns are fluffily. slyly pending packages haggle among the fluffily ironic accounts. blithely even excuses are even forges. carefully express deposits cajole qui +356|57|5640|659.89| instructions. furiously pending ideas boost above the quickly i +356|85|5077|961.17|lar packages sleep furiously. regular requests cajole-- blithely bold deposits sleep quietly after the furiously even packages. carefully ironic ac +356|13|1357|721.25|yly ironic accounts. furiously unusual platelets cajole carefully according to the blithe pinto beans. slyly unusual ideas cajole silent depths-- slyly even instructions cajole qu +356|41|3285|308.49|ve to doubt blithely. ironic, ironic packages hang around the final, even requests. slyly even requests agains +357|58|9623|169.85|ngside of the slyly permanent foxes. regular ideas wake carefully +357|86|3547|836.51|ons. pending pinto beans kindle pending platelets. b +357|14|4786|494.30| regular accounts wake slyly. slyly even foxes use against the carefully regular ideas. asymptotes alongside of the regular deposits are slyly along the furiously regul +357|42|7086|272.45|e quiet dependencies. carefully express pinto beans wake furiously quickly pending requests. slyly ironic packages haggle busily according to the regular requests. blithely ironic dolphins +358|59|8036|812.42|ngside of the ironic, slow theodolites cajole regularly excuses. +358|87|216|63.19|hely ironic accounts cajole among the blithely ironic theodolites. bold requests despite the blithely regular requests sleep across the fluf +358|15|8393|323.40|haggle. pending courts integrate carefully about the ideas. carefully unusual theodolites cajole furiously carefully pending requests +358|43|6497|27.27|. final, ironic accounts cajole. regular pinto beans promise carefully final epitaphs; ruthlessly ev +359|60|3678|67.67|ages. slyly ironic packages haggle slyly furiously regular deposits. carefully special requests was furiously. furiously express deposits nag fluffily carefully final packages. +359|88|7459|677.93|ess dependencies engage fluffily carefully express excuses. furiously express packages cajole among the final deposits. c +359|16|4180|521.57|ccounts use furiously against the unusual, ironic asymptotes. ironic instructions boost against the packages. quickly pending deposits after the furiously pending theodolites slee +359|44|4489|969.83|ts. requests cajole carefully according to the even, special +360|61|5834|420.19|deas. carefully special accounts use regularly furiously ironic requests: fluffily even theodolites wake fluffily. c +360|89|4885|362.25|daringly carefully ironic accounts! fluffily regular pinto beans haggle. fluffily final deposi +360|17|9191|710.51|r requests are. slyly ironic packages along the slyly regular tithes are among the quickly final requests. slyly eve +360|45|2781|603.73|g to the furiously regular packages. slyly unusual dolphins sleep carefully slyly unusual packages. special foxes cajole fluffil +361|62|8423|239.47|uickly unusual accounts are slyly. carefully even platelets use about the final, regular excuses. silently ir +361|90|809|32.98|the unusual instructions. furiously enticing instructions run finally about the final forges. special, final asymptotes pr +361|18|3324|124.37|ily. carefully regular accounts integrate blithely. blithely express dependencies sleep even accounts. carefully express deposits use blithely +361|46|7628|563.91|e quickly ironic ideas. bold platelets are carefully. regular instructions are carefully. furiously special foxes sleep. slyly even realms cajole a +362|63|9122|309.21| finally; ironic packages wake fluffily above the furiously final packages. even accounts toward the slyly expr +362|91|6711|357.00|ss the blithely express ideas integrate furiously alongside of the requests. silent instructions engage. furiously special pa +362|19|7455|322.25|gle blithely inside the carefully regular requests. blithely regular platelets do was carefully; final f +362|47|9990|680.32|ickly ironic grouches wake furiously. furiously special packages wake blithely bold, ironic theodolites. dependencies at the slyly ironic deposits cajole carefully alongside o +363|64|442|678.58|. fluffily sly deposits haggle after the ironic deposits. even, ironic foxes cajole never furiously express packages. excuses play. final, regular packages are final requests. quickly +363|92|968|413.65|es. ironic foxes after the regular pinto beans wake even deposits. carefully pending platelets use after the quick, final excuses. quickly regular asym +363|20|5171|373.26|ideas. slyly final waters at the fluffily special deposits believe slyly after the sometimes regular pinto beans. theodolites haggle +363|48|6752|857.86| deposits serve sly, unusual theodolites. ironic ideas sleep. +364|65|9828|667.85|ronic requests eat furiously stealthy packages. slyly pending dependencies haggle blithely across the instructions +364|93|5570|940.12| thrash carefully across the slyly special accounts. quickly regular accou +364|21|7766|541.32|lowly final theodolites nag fluffily carefully even requests. slyly even excuses shall kindle furiously according to the fluffily pending platelets. regular theodolites subla +364|49|8146|325.86|eep. final foxes nag blithely about the carefully express accounts. slyly regular requests use theodolites. carefully special instructions against the slyly regular p +365|66|7178|416.80|sts are furiously fluffily even accounts. quickly final deposits thrash blithely across the express deposits. always express de +365|94|4870|290.80|nal excuses cajole carefully slyly unusual theodolites-- blithely even instructions ab +365|22|1931|536.60| carefully close accounts. regular deposits affix. slyly even deposits affix ironic deposits. platelets about the furiously express packages eat quickly ironic +365|50|7792|916.86|thy packages sleep slyly along the blithely final packages. dependencies are fluffily around the carefully even accounts. even +366|67|8509|161.03| special warhorses are carefully. carefully special packages about the blithely final requests sleep blithely against the requests. carefully unusual deposits cajole carefully. pending, bo +366|95|8356|456.23|ular, ironic excuses detect furiously among the deposits. blithely bold packages along the carefully ironic ideas use about the enticingly ironi +366|23|2143|755.61| wake slyly. blithely regular deposits affix quickly. slyly special foxes wake furiously. carefully regular accounts dazzle idly final packages. furiously express r +366|51|8545|343.32|ithely final platelets nag! unusual pinto beans use carefully. fluffily regular deposits was against the furiously special packages. blithely expre +367|68|2874|232.30|r excuses haggle pending, regular courts. furiously ironic requests lose slyly among the bo +367|96|4845|313.44|gular deposits boost slyly ironic deposits. quickly even ideas boost carefully quickly regular packages. ironic, pending requests according to the bold, i +367|24|3938|439.43|es sleep regular requests. carefully regular ideas slee +367|52|7919|995.51|arefully ruthless accounts nag. carefully bold accounts wake blithely express asymptotes. ironic pinto beans haggle quickly sly, bold instructions. slyly ironic accounts ha +368|69|2368|416.28|ending courts haggle above the fluffily final ideas. pending accounts +368|97|5549|606.88|ckages. final asymptotes nag never deposits. slyly bold requests sleep +368|25|2379|283.24|yly. fluffily final foxes above the final deposits wake quickly above the pending, pending foxes. quickly regular packages hang boldly even ideas. thin theodolites haggle. always fi +368|53|1356|388.64|eans integrate blithely pending requests. furiously even theodolites print ironic sauternes. carefully bold ideas nod slyly unusual foxes. slyly special pin +369|70|215|621.06|long the deposits. regular accounts around the carefully even foxes affix among the carefully final dolphins. carefully ir +369|98|202|690.31|ual courts after the quickly regular multipliers sleep carefully ironic accounts. quickly ironic dolphins maintain. slyly even platelets wake +369|26|5102|750.65|wake slyly silent foxes. pinto beans haggle closely final accounts. packages boost blithely above the carefully ironic requests. fluffily +369|54|4479|882.72|ic gifts. regular deposits use blithely. furiously regular platelets according to the car +370|71|473|783.58|ously even ideas haggle fluffily along the carefully ironic pinto beans. blithely special packages are among the carefully final accounts. sly, ironic theodolites wake slyly. packages cajole furi +370|99|4006|892.40|egular courts nod quickly above the fluffily pending accounts. fluffily sly dolphins haggle furiously slyly bold accoun +370|27|5236|695.64|ites along the accounts cajole blithely about the slyly unusual pinto beans. regular requests use slyly about the courts. carefully special foxes wake furiously against t +370|55|7527|552.41|ing accounts. carefully ironic sauternes lose special, express requests. blithely regular foxes cajole quickly slyly ironic accounts. carefully ironic gifts boost. eve +371|72|4707|849.13|ording to the slyly special requests. theodolites haggle blithely. es +371|100|7194|795.26|romise. blithely final pinto beans poach blithely. blithely +371|28|5155|454.70|ons against the silent, pending escapades could have to detect slyly according to the q +371|56|3644|47.59|ts detect furiously silent packages. slyly bold theodolites according to the regular, unusual deposits nag furiously above the blithely pendin +372|73|4051|835.63|s haggle across the slyly express deposits. quickly unusual dolphins integrate furiously express dolphins. quickly regular deposits serve. blithely express accounts a +372|1|64|643.09|d courts. blithely ironic requests wake. furiously +372|29|3420|374.77|ully final deposits sleep furiously. quickly ironic deposits impress ruthlessly after the +372|57|4572|332.86|er blithely instead of the silent courts. ironic, express requests haggle blithely quickly final accounts. furiously even asymptotes nag f +373|74|6598|249.47|c, close accounts sleep furiously above the pending dependencies. furiously silent accounts integrate bold, regular deposits. express accounts among the blithely even excuses wa +373|2|2376|262.30|usly regular packages shall have to affix slyly final pinto beans. slyly ironic waters run. care +373|30|2838|81.94|haggle ironic deposits. furiously special platelets wake quickly pains. even +373|58|6119|708.73|nic accounts use slyly carefully regular packages. furiously unusual pinto beans detect quickly fluffily regular dependencies. blithely final ideas sleep +374|75|1876|714.84| the warhorses boost furiously after the carefully ironic foxes. furiously regular requ +374|3|1826|399.46|uickly special dependencies! furiously express deposits whithout the slyly exp +374|31|9828|641.00|p fluffily. quickly ironic packages boost quickly quickly idle pinto beans. quickly unusual deposits haggle blithely along the packages. blithely even dependencies sleep care +374|59|9204|150.28|e packages affix quickly slyly express packages. deposits haggle. regula +375|76|2822|475.83|packages. quickly unusual deposits kindle alongside of the carefully bold packages. furiously regular foxes use carefully slyly final accounts. final requests according +375|4|4114|460.86|, unusual Tiresias haggle slyly even theodolites: ironic, even deposits affix slyly. pinto beans above the carefully regular ideas boost regular deposits. i +375|32|8680|673.03|le blithely enticingly regular courts: final packages use above the furiously unusual ideas. regular foxes cajole fluffily along the blithely unusual patterns. carefully regular orbits according +375|60|3965|151.67|s-- sometimes bold asymptotes sleep after the blithely final pinto beans. enticingly silent pinto beans along the blithely even deposi +376|77|3666|895.66|re? bold deposits cajole. carefully special theodolites use furiously. carefully unusual theodolites are among the furious foxes. deposits thrash regular ideas. even dep +376|5|4524|529.52|iously. packages after the slyly final accounts sleep among the quickly even in +376|33|680|731.93|yly. regular pearls against the excuses sleep slyly blithely ironic theodolites. s +376|61|9418|39.91|ipliers haggle carefully express platelets. unusual theodolites haggle ironically above the final, close foxes. furiously regular r +377|78|9022|665.73|hely pending deposits integrate according to the regular foxes. furiously ironic ideas sleep about the ironic +377|6|966|296.70|as haggle carefully. blithely unusual frets sleep furiously slyly final requests. furiously bold requests cajole about the packages. pending, even pinto beans affix. fluffil +377|34|762|757.99|ccounts haggle slyly special requests. express, final foxes solve boldly regular theo +377|62|7490|448.57|final excuses use. carefully silent packages according to the furiously pending +378|79|5057|894.75| the unusual accounts! never final foxes nag blithely: quickly final accounts detect closely. frets detect. special deposits about the blithely +378|7|5433|159.38| packages boost; carefully regular accounts detect closely-- furiously final deposits wake silent, +378|35|6012|671.42|tes. final deposits snooze. always even accounts boost across the requests. fluffily regular packages sublate blithely final, final asymptotes. final theodolites boost fluffily +378|63|2909|34.65|fter the ironic pearls. furiously final requests are. unusu +379|80|1136|243.36|y final pinto beans nag slyly among the slyly ironic packa +379|8|4070|473.81|nts. ideas play slyly across the final gifts. even, even platelets at the furiously final dependencies lose according to the slyly regular requests. +379|36|4749|491.78| instructions boost carefully. instructions wake carefully about the carefully silent deposits? fluffily ironic packages along the slyly bold platelets sleep carefully a +379|64|2160|738.81|y ironic orbits? furiously unusual asymptotes detect carefully. quickly ironic theodolites +380|81|5384|680.64|ake furiously ironic, regular excuses. stealthy pearls use blithely above the furiously regular requests. even, pending dolphins haggle packages. silent +380|9|6216|134.72| unusual packages. carefully express pearls are a +380|37|9253|774.65|osits alongside of the regular, ironic requests are among the carefully regular instructions. furiously pending grouches are. fluffily bold dependencies nag quickly. +380|65|2627|730.90|y even theodolites. unusual ideas for the furiously express accounts cajole among the carefully special package +381|82|2984|691.99|above the final platelets. special instructions are. quickly pending theodolites poach carefully furiously silent foxes. blithely ironic requests integrate after +381|10|8803|54.31|e among the ideas. even, pending instructions cajole blithely along the iro +381|38|6258|10.65|ily. carefully final dinos haggle blithely furiously even dinos. unusual instructions are carefully +381|66|8277|402.53| use carefully. blithely even packages cajole blithely. blithely ironic deposits after the final, ironic platelets kindle quietly a +382|83|8797|342.68|al requests. furiously ironic packages sleep carefully above the deposits. bravely pending packages after the pinto bea +382|11|3300|355.44| sublate doggedly accounts. express instructions above the furiously special instructions boost blithely slyly regula +382|39|7897|14.97|ns. bold requests boost. unusual dolphins use. requests sleep never. fluffily express foxes wake fluffily above the furiously unusual ideas. +382|67|6546|165.15|le quickly regular excuses. carefully even instructions promise along the quickly express ideas: blithely regular deposits nag blithe +383|84|8632|681.73|usly about the quickly even accounts. even dolphins wake blithely across the closely pending deposits. slyly express dep +383|12|9731|484.18|press packages haggle above the furiously express requests. quickly pending pinto beans will boost slyly +383|40|573|982.52|xes nag blithely along the special pinto beans. slowly ironic theodolites wake carefully unusual accounts. furiously ironic instructions alongside of the +383|68|2123|792.13|ickly silent pinto beans. final somas sleep permanent packages. slyly e +384|85|3933|753.69|ns. sauternes detect quickly after the quickly final accounts. pending deposits haggle slyly among the dinos. blithely final ideas wake? always unusual pearls among the +384|13|5772|45.13|l theodolites solve fluffily above the unusual ideas. fluffily unusual deposits nag among the furiously ironic forges. slyly brave dolphins haggle slyly bravely pending warhorses. caref +384|41|7321|564.83|ges. regular dolphins according to the pending dependencies are slyly bold packages. regular, quiet excuses doze. slyly quiet packages boost quickly +384|69|5218|820.88|es haggle furiously against the fluffily final instructions. slyly final request +385|86|2378|383.05|ld foxes solve. ironic, final ideas doze quickly final deposits. slyly special +385|14|595|539.23|egular pinto beans eat slyly along the final accounts. fluffily regular requests cajole above the express packages. idly regular ideas across the slyly daring accounts ar +385|42|8387|129.69|ongside of the slyly regular theodolites nag slyly blithely ironic requests. regular accounts haggle carefully against the special pearls? +385|70|7996|121.60| carefully unusual pinto beans. blithely pending deposits sleep. frays haggle regularly regular accounts. +386|87|344|60.71|g accounts sleep blithely. furiously regular requests affix quickly. b +386|15|183|637.08|bold packages doubt around the ironic theodolites. unusual requests beside the furio +386|43|5970|203.07|s wake along the idly unusual dolphins. carefully final platelets sleep. slyly express excu +386|71|8599|636.81|ss the quickly ironic excuses. quickly silent accounts use about the quickly pending accounts. multipliers after the even ideas sleep sometimes quickly special excuses. express, final asymp +387|88|9827|713.12|aggle fluffily. unusual foxes sleep. slyly silent packages nag blithely pending foxes. regular deposits integrate after the pending depos +387|16|8555|615.42|o the bold, ironic requests. final ideas nag quickly. ideas are fluffily along the blithely pending deposits. deposits doubt. bold, final foxes haggle blithely. furiously regular sentime +387|44|669|832.04|le blithely! instructions are blithely according to the fluffily ironic forges. slyly regular accounts across the accounts kindle slyly along the b +387|72|9507|140.71| the furiously ironic accounts cajole above the furiously even deposits. furiously ironic deposits are furiously across the express requests. +388|89|8032|561.91|s haggle blithely. furiously even ideas should have to doze according to the furiou +388|17|2913|582.22| among the quickly even packages. fluffily even excuses boost. bold, regular courts are furio +388|45|8090|358.91|s; carefully final decoys wake slowly ironic, pending requests. express deposits are against the unusual foxes. theodolites wake carefully regular accounts. quietly special ideas boost requests +388|73|1385|414.85| ideas. sometimes final packages are. blithely bold forges sleep. carefully regular forges at the furiously even depths cajole furiously above the packages. slyly care +389|90|6248|561.43|kages across the ironic, final accounts integrate furiously along the carefully ironic asymptotes. regular, regular requests bo +389|18|7591|528.84|y unusual deposits. blithely permanent deposits use slyly pending accounts. slyly ironic packages boost slyly after the blithely idle pinto beans. reg +389|46|1746|265.01|dle slyly. carefully ironic excuses kindle slyly ironic deposits. sly +389|74|3524|715.14|fluffily final deposits. fluffily pending packages boost slyly. slyly even deposits nag slyly regular deposits? packages after the ironic requests use regular platelets +390|91|6098|613.18|ding asymptotes hang across the blithely special deposits. bold requests nag blithely +390|19|1254|115.98|tain never against the excuses. silent notornis according to the daring, unusual requests are carefully above the blithely regular requests: blithely final foxes against the courts eat quickly +390|47|3132|415.66|rs. ruthlessly final packages hinder. furious, unusual excuses impress blithely according to the furiously ironic platelets. carefully pending requests dazzle carefully above the depos +390|75|721|194.00|al instructions wake quickly beneath the furiously final tithes. slyly regular instructions cajole care +391|92|8256|993.90|n deposits. carefully regular accounts sleep carefully against the carefully pending foxes; pending deposits use fluffily above the furiously ironic ideas. carefully regular account +391|20|6653|283.35|ithely final deposits wake blithely. carefully stealthy accounts are slyly slyly bold accounts. final pack +391|48|6291|274.87| ruthlessly. stealthily regular requests are. blithely bold requests use slyly express, unusual pinto beans. quickly silent dugouts wake slyly. regular, final deposits +391|76|4228|570.36| nod furiously slyly special asymptotes. carefully regular accounts around the regular requests promise qui +392|93|3185|794.83|express ideas. regular pinto beans boost regular pinto beans. quickly final accounts use slyly against the packages. regular accounts n +392|21|3169|139.79|its. blithely regular excuses haggle quietly. quickly pending requests are blithely. accounts sleep blithely. bold theodolites cajole slyly fu +392|49|623|123.85| dogged requests along the special orbits nag carefully slyly bold accounts. quickly bold requests +392|77|1589|852.62|express accounts. bold accounts across the blithely regular requests x-ray busily quickly final excuses. slyly pending braids boost quickly bold +393|94|3620|410.16|usly ironic sauternes. blithely ironic deposits cajole carefully excuses. quickly even courts wake furiously +393|22|1801|698.08|wake silently evenly ironic accounts. carefully pending deposits wake carefully after the even packages. slyly final excuses haggle blithely atop the ironic ideas. express, ironic dep +393|50|6265|589.70|re slyly even ideas. blithely bold requests haggle alwa +393|78|3096|164.27|its? blithely unusual platelets sleep carefully slyly bold realms: deposits are furiously. ironic requests are among the regular, even packages. quickly even accounts about the bold asympt +394|95|5265|878.34|ing to the carefully special deposits. slyly regular accounts cajole slyly across the carefully ironic packages. carefully regular foxes sleep carefully final, regular escapa +394|23|2113|203.54| even deposits sleep fluffily. ironic, ironic requests x-ray fluffily. f +394|51|5767|540.68|s haggle ironically regular deposits. silent theodolites are blithely agains +394|79|8848|541.70|ously final deposits. ironic decoys nag carefully ironic requests. blithely regular packages haggle. carefully ironic packages kindle across the bo +395|96|2647|629.84|ies was blithely foxes. pearls wake fluffily slyly bold accounts. blithely final packages use across the foxes. final ideas eat above the fluffily +395|24|9382|472.77| packages along the pinto beans lose fluffily across the blithely final deposits. slyly even accounts integrate. pendin +395|52|4144|978.04| cajole. blithely final pinto beans cajole carefully above the final, even dependencies. quickly bold foxes haggle above the ironic packages; carefully fluffy excuses wake furiously blit +395|80|473|473.63|tes might are carefully. express, final accounts may use. blithe +396|97|5543|516.80|nos. ideas cajole furiously carefully sly requests. ironic instructions need to are quickly ideas. slyly quick ideas affix blithely carefully unusual o +396|25|7149|726.33|ke across the bold dependencies. quickly bold requests x-ray. bold excuses are packages. express, ironic packages above the dependencies haggle regular ideas. regular, fluffy dependencies +396|53|3749|741.11|the blithely special excuses are fluffily at the blithely sly foxes; ironic, ironic requests according to the carefully express packages are across the blithely ironic pinto bea +396|81|1112|504.86|ual dolphins. even requests among the blithely thin foxes wake quickly furiously pending foxes. furiousl +397|98|4646|825.08|oxes cajole furiously carefully bold packages. silently regular platelets run +397|26|1877|184.49|lar, final requests sleep slyly? blithely regular accounts cajole blithely. furiously regular excuses haggle slyly ironic theodolites. quickly express theodolites boost blithely: slyly ir +397|54|6029|140.07|oxes. unusual pinto beans haggle furiously. pending theodolites dazzle enticingly. even deposits nag-- carefully +397|82|3814|676.39|ans haggle according to the carefully even Tiresias. slyly even requests doze blithely final requests. +398|99|4636|539.63|ctions. blithely final dependencies doze furiously along the blithely even ideas. slyly final excuses wake slyly against the final, special excuses. final foxes wake slyly ex +398|27|3187|873.15| regular deposits along the final deposits sleep sometimes ironic accounts? ironi +398|55|7390|915.92|r theodolites. carefully regular foxes across the fluffily final grouches boost furiously after the ironic, special packages. blithely pending accounts are carefully in place of the +398|83|1139|323.53|instructions. slyly express instructions wake carefully. carefully special packages of the carefully final foxes haggle carefully after the foxes. slyly regu +399|100|3827|298.29|tes. ironic ideas wake thinly ironic accounts. silent, pending platelets nag according to the special, express pinto beans. requests wake around the idle +399|28|4875|648.59|each above the pending, final theodolites. bold, final pinto beans sleep above t +399|56|9191|898.27|odolites wake furiously. carefully regular excuses after the bravely even asymptotes cajole packages. ironic, special theodolites cajole carefully. ironic packag +399|84|6776|376.50|l ideas. blithely ironic pinto beans boost furiously. slyly regular requests caj +400|1|5833|350.42|aggle across the asymptotes. carefully thin theodolites wake slyly after the regular requests. silently ironic accounts cajole fluffily alongside of the ironic, ironic accounts. i +400|29|2214|565.51|ously final requests haggle blithely requests. final packages haggle slyly despite the carefully regular pi +400|57|5043|180.51|ongside of the carefully pending pinto beans. blithely regular accounts nag across the furiously ironic ideas. furiously regular requests wake. flu +400|85|4648|40.65|ke quickly. carefully ironic accounts serve. regular pinto beans haggle after the carefully ironic packages. regular accounts might be +401|2|3408|214.06|eep slyly-- slyly fluffy deposits thrash fluffily fluffily even deposits. final accounts are slyly among the final ideas. unusual packages print slyly carefully iro +401|31|2047|464.58|ckly blithely even pinto beans. furiously unusual dependencies p +401|60|4316|170.75|ges promise blithely: accounts at the quickly final requests use quickly requests. furiously final instructions integrate requests? accounts alongside of the e +401|89|7220|948.89|iers nod blithely. ruthless requests wake quickly. deposits at the quickly regular asymptotes doubt according to the quickly pending instructions. carefully regular theodolites a +402|3|2471|17.55|carefully regular theodolites cajole regularly. deposits detect. unusual ideas across the furiously final theodolites must have to haggle slyly final packages. silent foxes against the fluffil +402|32|1108|481.24|ve the carefully regular platelets. evenly pending accounts against the carefully ironic excuses integrate furiously among the sly +402|61|6840|458.01|ages affix-- blithely regular attainments sleep furiously. carefully regular packages c +402|90|7942|615.07| regular foxes. blithely even requests around the furiously pending deposits affix carefully final pinto b +403|4|8199|942.81|ole slowly. dolphins nag. quickly unusual pinto beans nag carefully platelets. ideas sleep? fluffily unusual theodolites wake. special requests alongside of the carefully pending package +403|33|6665|769.11| haggle enticing, ironic platelets. furiously regular dolphins affix ruthless, ironic deposits. carefully pending theodolites are sly +403|62|9121|469.60|luffily after the furiously ironic requests. bold requests eat about the +403|91|6484|658.73|ording to the regular accounts. excuses sleep furiously regular dolphins. slyly +404|5|6948|462.90|integrate regular escapades. requests about the deposits wake furiously regularly final dolphins. unusual deposits cajole. slyly ironic accounts against the quietly even i +404|34|891|976.40|symptotes. ironic, even packages cajole carefully alongside of the regular foxes. furiously bold tithes outside the blithely express realms hang across the blithely final accounts. furiou +404|63|3556|851.73|y regular accounts. slyly final somas haggle around the fluffily ironic requests? packages hag +404|92|6032|516.48|ackages haggle accounts. final, ironic accounts haggle among the blithely unusual packages. slyly ironic requests snooze slyly. s +405|6|2243|419.06| final requests. carefully pending epitaphs cajole carefully. even courts detect slyly slyly even theodolites. express, final excuses hinder. closely expre +405|35|9153|417.34|e. orbits boost quickly above the blithely special platelets. quickly ironic foxes are thinly across the s +405|64|1365|421.61|iously pending foxes. even theodolites haggle. slyly unusual deposits through the unusual packages kindle carefully among the regularly ironic a +405|93|9819|358.83|equests. furiously silent requests against the furiously express pinto beans use slyly regular p +406|7|9475|91.03|counts hang according to the deposits. special, pending foxes detect. regular packages around the even pains haggle f +406|36|1083|682.93|osits sleep slyly even packages. special foxes boost during the blithely regu +406|65|6489|664.24|uests grow even foxes. slyly express requests around the regular, fluffy deposits detect blithely above the pending packages. silent pinto beans are quickly special theodolite +406|94|7271|249.21|ructions affix blithely. blithely express pinto beans haggle furiously pending requests. carefully special foxes wake blithely. instructions must have to haggle slyly furiously express +407|8|6142|826.14|e blithely. carefully ironic platelets among the quickly express accounts cajole blithely furiously busy packages. instructions sleep. carefully regular at +407|37|6126|908.15|ly silent foxes. accounts lose quickly against the slyly bold packages. carefully express packages are. carefully fin +407|66|9234|636.84| quickly pending pinto beans wake. furiously even packages solve carefully ironic packages. ironic accounts cajole quickly among the ironic asymptotes. furiously regular accounts are abou +407|95|8359|294.33|old pinto beans sleep across the furiously quick foxes. asymptotes against the slyly regular multipliers wake bold pains. slyly regular +408|9|9899|35.25|above the blithely ironic platelets. carefully even waters sleep-- furiously express packages nag quickly furiously final deposits. fluffily ironic foxes haggle of the regul +408|38|5282|303.52|dolphins nag quickly. packages integrate quickly above the pending pinto beans. quickly ironic deposits should have to use carefully among the furiously unusual req +408|67|2110|566.58|posits about the blithely bold braids are pending, final packages. slyly special foxes across the slyly ironic instructi +408|96|3815|218.93|nto beans. fluffily unusual dugouts according to the fluffily bold pinto beans cajole among the ironic packages. unusual Tiresias boost furiously special pac +409|10|2897|543.48|accounts wake quickly about the slyly bold packages. fluffily regular +409|39|8770|539.70|lly carefully pending packages. bold, regular dinos lose fluffil +409|68|3321|964.94|t blithely. carefully pending pinto beans above the final dependencies nag slyly quickly even theodolites. idle, pending +409|97|5938|148.11|r packages. blithely regular foxes sleep carefully across the express deposits; fluffily bold pinto beans sleep closely idly bold pinto beans. blithely final packag +410|11|6977|89.08|ideas are slyly. ideas promise slyly. express, unusual packages cajole special, bold hockey players. fin +410|40|876|953.50|efully carefully unusual packages. regular forges after the bravely regular pinto beans are carefully across the instructions. blith +410|69|8242|604.23|ely ironic accounts are. carefully final packages eat blithely accounts. even, regular dolphins sleep deposits; deposits use blithely +410|98|846|551.57|y quick instructions boost blithely! blithely silent foxes nag. packages haggle. furiously pending platelets integrate. express platelets haggle furiously carefully iro +411|12|8740|711.71|leep carefully even accounts. quickly regular instructions cajole furiously after the final theodolites. special +411|41|6955|803.21|he final, regular foxes haggle against the final, even deposits. quickly regular accounts cajole quickly against the carefully special dep +411|70|8715|245.29|ctions. pinto beans nag among the carefully even foxes. fluffily final theodolites use. quickly silent theodolites use. quickly final accounts above the even deposits wake furiously pending accou +411|99|7555|989.70|o the slyly pending ideas. regular instructions cajole blithely regular t +412|13|5892|565.47|s. slyly slow foxes are against the blithely express instructions. slyly regular requests cajole slyly. carefully even patterns haggle slyl +412|42|2630|550.04|st slyly along the final packages. fluffily regular dinos boost. slyly special theodolites hinder slyly regular, final frets. caref +412|71|5349|932.45|g accounts. carefully regular packages cajole among the carefully s +412|100|5212|429.35|ccounts. accounts boost. furiously pending pinto beans use carefully about the ironic packages. ironic deposits are. furiously silent asymptotes +413|14|6320|542.38|manently regular pinto beans. asymptotes nag-- express, regular accounts after the blithely quick asymptotes cajole slyly above the blithely final theodolites. regular theodolites h +413|43|9412|80.56|ng the final platelets integrate express ideas. requests cajole carefully even, stealthy packages. fluffily regular accounts nag. final accounts wake idly special +413|72|8423|545.20|regular frets integrate quickly ironic requests. regular depo +413|1|6598|455.06|refully final foxes doubt furiously beneath the ironic packages. quickly bold foxes along the quickly cl +414|15|8403|83.28|ously even requests about the ironic deposits nag special accounts. furiously ironic theodolites haggle. i +414|44|6665|304.53| special theodolites along the unusual pinto beans promise fluffily +414|73|5558|490.14|r instructions. quickly unusual packages wake instead of the carefully even requests. slyly silent packa +414|2|1276|191.30|ly regular somas. quickly even deposits affix about the requests. bold accounts haggle thinly against the slyly final ideas. carefully final requests sleep carefully among +415|16|2514|557.20| boost busily fluffily regular accounts. furiously regular ideas haggle quickly about the final dependencies? slyly regular +415|45|1246|449.60| requests. bold, express dependencies about the furiously pending excuses cajole furiously special accoun +415|74|616|258.51|o beans nag slyly carefully ironic frays. furiously final asymptotes believe slyly. +415|3|484|266.86|ke carefully about the furiously pending excuses; special ideas are. even deposits across the ironic requests thrash bold gi +416|17|4241|813.99|of the pending, even requests could lose slyly regular ideas. slyly final dependencies use-- furiousl +416|46|2414|615.06|s cajole blithely over the carefully ironic asymptotes. furiously final ideas use carefully stealthi +416|75|8089|735.30|ges grow slyly regular accounts. quickly regular instructions boost. regular theodolites against the blithely regular accounts cajole after the deposits? ironic requests +416|4|2185|624.82|uriously final dolphins. regular instructions are. carefully even accounts use furiously along the blithely regular accounts. pending foxes boost permanently about the carefully unusual req +417|18|2485|948.27|lithely special packages sleep blithely along the furiously final excuses. regular excuses wake. theodolites +417|47|6391|625.61|ses. regular, unusual ideas affix. slowly regular deposits affix blithely ironic platelets. blithely regular excuses haggle quickly. quickly regular depths snooze. fur +417|76|2896|287.83|ongside of the bold hockey players. carefully regular deposits s +417|5|7626|581.03| fluffily final deposits eat furiously. ironic, final requests detect furiously. carefully even theodolites maintain around the ironic gifts. carefully silent fra +418|19|6664|241.18|courts grow quickly special packages. final packages snooze closely courts; accounts wake blithely. asymptotes boost across the furiously re +418|48|9519|767.79|ing to the furiously regular accounts cajole furiously quickly pending asymptotes. blithel +418|77|5054|213.36|even packages are blithely around the carefully bold foxes. slyly ironic dependencies doubt carefully ironic grouches! slyly silent dolphins are. stealthily ev +418|6|3607|732.87|special accounts. slyly ruthless instructions nag against the blithely enticing requests. carefully special warthogs thrash against the ironic, ironic asymptotes. notornis wake carefully abo +419|20|2257|892.51|tructions are carefully. ironic packages are quickly. furiously special deposits nag blithely. enticing, ironic foxes thrash slyly across the carefully expres +419|49|4017|528.73|dencies are furiously ironic accounts: quickly unusual pi +419|78|3271|439.43| fluffily carefully special attainments. express packages wake furiously; quickly regular dependencies around the packages sleep slyly furiously regular pla +419|7|6802|105.12|e requests. furiously slow accounts wake carefully regular, bold packages. dependencies haggle slyly at the ironic, final foxes. final, final deposits acco +420|21|9500|738.91|ages. ironic, ironic foxes cajole closely among the slyly express instructions. special dependencies after the pending, ironic requests haggle carefully furiously r +420|50|8947|476.15|ate carefully bold packages. carefully ironic pinto beans are furi +420|79|8920|850.31|y slyly regular ideas. regular, bold ideas nag according to the unusual, unus +420|8|1074|590.90|refully along the final, even deposits? carefully bold foxes about the blithely regular packages haggle carefully fluffily furious excuses. final, ironic accounts above the slyly ironic instruct +421|22|8121|402.29|refully bold, regular instructions. even, regular deposits are. blithely quiet ideas about the even, f +421|51|1190|234.57|efully special instructions cajole furiously. quickly silent accounts boost slyly. pending foxes are furi +421|80|6215|539.50|deas. express pinto beans around the fluffily silent accounts cajole against t +421|9|9804|668.60|posits. fluffily unusual deposits eat furiously among the quickly silent instructions. slyly express epitaphs accordi +422|23|6976|537.53| special pinto beans. slyly regular asymptotes nag slyly against the doggedly ironic forges. furiously pending accounts haggle fluffily across the blithely regular instru +422|52|1054|503.65|t the regular epitaphs detect carefully fluffily regular pinto beans. special accounts sleep quickly across the bold theodolites. furiously regular deposits was sl +422|81|1741|428.15|al requests are deposits. furiously ironic asymptotes sleep ruthlessly about the regular, idle +422|10|8386|323.23|patterns detect between the special, ironic packages. blithely pending theodolites cajole final foxes. packages sleep carefully slyly unusual foxes. blithely final requests wake furiously. b +423|24|9892|125.61|ent excuses wake furiously. dogged, slow platelets against the blithely special theodolites haggle pinto beans. slowly bold foxes +423|53|7433|484.60|al ideas. pending platelets haggle furiously excuses. pinto beans wake blithely according to the slyly special ho +423|82|3989|50.19|gle blithely alongside of the theodolites-- deposits print slyly careful requests. furiously bold theodolites boost blithely regular requests. packages agai +423|11|4210|654.23|es. furiously unusual packages nag: furiously regular packages sleep care +424|25|6729|778.89|c requests. requests along the blithely ironic requests are +424|54|1676|53.89|olites. furiously special waters serve slyly. deposits hinder-- furiously final pinto beans sleep blithely. quickly regular accounts boost. carefully silent packages run blithely. quick +424|83|9030|946.57|tions about the always regular dependencies haggle slyly thin, even ideas. final packages sleep carefully regular deposits. slyly unusual packages wake quickly according to the final, ex +424|12|930|48.30|otes. fluffily final deposits are carefully ironic theodolites. blithely regular realms integrate carefully spec +425|26|2802|895.35|e the slyly even foxes solve fluffily regular requests. slyly special dependencies was furiously a +425|55|6354|325.76|e quickly fluffily even theodolites. furiously special deposits alongside of the enticing foxes cajole brave, final asymptotes. even, ironic requests use blithely beneath the express +425|84|8696|705.10|al packages haggle carefully. unusual dinos at the even instructions are furiously re +425|13|9573|659.22| ironic, regular deposits. slyly special theodolites haggle fluffily ironic packages. q +426|27|8175|809.32|onic accounts about the brave, final requests wak +426|56|631|975.15|packages. slyly regular excuses sleep toward the slyly regular accounts. final deposits cajole slyly slyly silent requests. regular +426|85|3949|882.98|eans was fluffily. furiously even packages promise +426|14|5463|213.28|the blithely bold packages. silently even accounts along the blithely final instructions sleep ag +427|28|2163|415.63|t the ironically final deposits maintain carefully unusual deposits. packages need to sleep blithely deposits. packages nag. slyly regular sauter +427|57|5473|637.67|s. furiously final requests wake. ironic, bold packages sleep slyly even excuses. accounts alongside of the blithely daring packages integrate bold dolphins. asym +427|86|6523|128.74| special deposits are slyly. blithely even tithes affix furiously along the ironic warho +427|15|5348|148.66|uickly carefully ironic packages. blithely express deposits use carefully. idle requests do use carefully quickly ironic requests. asymptotes sleep fluffily against the carefully final excuses; +428|29|9917|273.30|ully slow foxes sleep along the quickly unusual patterns-- requests haggle furiously across the blithely busy foxes. carefully unusu +428|58|658|179.41|y bold deposits cajole slyly. ironic requests doze slyly according to the ironic, ironic ideas. fluffily ironic instructions a +428|87|6127|561.97|ironic pinto beans. pending requests sleep along the fluffy dependencies. slyly ironic ideas sleep. carefully even requests haggle along the carefully ironic deposits. special accou +428|16|1649|654.28|ymptotes! blithely idle requests nag slyly-- ideas do wake after the doggedly final braids. requests use blithely ironic deposits. fluffily express foxes sleep ironically special accounts. slyly s +429|30|1492|720.15|ss packages sleep carefully carefully ironic requests. slyly silent packages nag +429|59|6398|787.57|regular theodolites. quickly bold accounts nag express deposits. furiously final foxes boost quickly across the foxes-- final, even accounts alongside of the fina +429|88|3641|43.51|riously. slyly stealthy packages integrate slyly. slyly bold packages during the fluffily regular epitaphs maintain furiously along +429|17|9468|312.91| final requests. regular, ironic dolphins sleep blithely according to the even excuses. even requests haggle-- unusual packages haggle furiously iro +430|31|15|483.73|elets. slyly pending dependencies impress special dependencies. bold, regular requests ought to wake furiously. ironic d +430|60|7890|357.47|nding packages cajole along the requests. carefully silent packages nag along the ironic, regular pinto beans. fluffily regular accounts use. fluffily unusual packages are! expres +430|89|4716|291.06| cajole ruthlessly above the close packages. bold deposits up the idea +430|18|4037|929.81| about the permanent, even theodolites. even, ironic ideas wake. quickly special +431|32|1891|994.90|encies haggle carefully. requests about the furiously regular deposits wake slyly above the blithely even theodolites. pending patterns grow blithely silent instructions. slyly special +431|61|983|143.64| special requests are blithely alongside of the fina +431|90|291|842.86|luffily even ideas. final, ironic deposits wake. requests boost furi +431|19|5332|226.17|ackages kindle whithout the slyly regular deposits. carefully ironic deposits u +432|33|1202|308.26| bold requests. silent, pending patterns cajole carefully express ideas. carefully bold deposits cajole slyly around the slyly regular dependencies. final pinto b +432|62|2794|280.03| ideas haggle slyly. blithely permanent requests slee +432|91|9183|424.68|ch along the theodolites. ironic, regular accounts sleep ruthlessly even dependencies. quickly regular ac +432|20|6137|893.17| fluffily regular packages sleep carefully. furiously ironic instructions shall have to haggle blithely regular ideas. instructions against the ironic, even accounts promise fluffil +433|34|8880|697.81| the regular, express deposits sleep ironic, even packages. ironic foxes integrate furiously furiously final foxes. furiously +433|63|2803|962.51|deposits are along the furiously ironic deposits. slyly final gifts wake. furiousl +433|92|1798|128.56| beans cajole above the enticingly bold accounts. boldly slow requests cajole fluffily against the final accounts. ironic accounts use carefully. regular, regular +433|21|6651|102.32|riously sly pinto beans affix carefully final packages. slyly bold packages hang carefully; fluffily special instructions haggle daringly at the final excuses. enticing theo +434|35|5295|583.57|re fluffily about the final foxes. packages are fur +434|64|6409|74.66|nts. furiously enticing platelets boost blithely pending platelets. ironic instructions wake along the accounts. dogged accounts alongside of the regular fo +434|93|3606|374.26|ckages are. slow deposits wake across the furiously ironic braids; regular accounts affix furiously. bold packages detect blithely against the furiously bold deposits. spec +434|22|9115|605.47|uests. ironic, bold theodolites wake. furiously unusual platelets are carefully according to the b +435|36|2641|513.95|efully against the packages. unusual, express ideas integrate above the silent, final excuses. permanently even theodolites maintain bravely express excuses. slyly regular deposits lose alongside of +435|65|8630|811.82|ully blithely regular requests. carefully final requests are: final deposits promise packages. furiously ironic instructions kindle +435|94|2159|988.13|beans sleep within the carefully final deposits. blithely unusual accounts wake carefully according to the carefully quick accounts. unusual +435|23|8697|224.91|y pending packages. regular excuses are carefully slyly ironic deposits. slyly special pinto beans boost slyly regular asymptotes. regu +436|37|1868|78.46| requests cajole. regular, regular accounts boost carefully about the slyly special dinos. regular, ironic deposits around the carefully busy ideas use blithely bravely iron +436|66|8034|324.35|ges haggle carefully after the pending accounts. blithely ironic instructions use fur +436|95|5508|26.74|arefully final ideas eat blithely closely unusual Tiresias. quickly express deposits wake quickly unusual packages. carefully final pa +436|24|9301|162.49| to the slyly final accounts. even dependencies h +437|38|1543|904.68|usual packages. carefully regular deposits wake fluffily. furiously final courts cajole furiously silent asymptotes. deposits are. slyly regular accounts haggle slyly. pending, bold courts are f +437|67|1491|362.37|cross the carefully pending accounts. regular, silent deposits impress blithely across the quickly final theodolites. closely unusual deposits doze slyly. fluffily pending +437|96|7237|631.91|uick dependencies boost furiously since the slyly +437|25|7344|341.75| carefully bold foxes cajole finally. slyly regular +438|39|5882|811.87|s after the unusual platelets sleep blithely according to the carefully express packages. furiously thin pinto beans around the accounts are carefully about the carefully final theodolites +438|68|5448|887.62|aggle carefully. furiously ironic instructions are furiously furiously ironic packages. careful accounts are carefully around the even acc +438|97|8510|284.39|y final theodolites hang. slyly even packages sleep slyly above the furiously even packages. regular packages wake blithely +438|26|799|730.23|ing pinto beans. blithely even instructions nag regularly carefully pending ideas. ironic, final packages nag slyly. slyly final requests according to the carefully s +439|40|7843|480.06|ve the furiously even accounts. even theodolites use according to the ideas. fluffily reg +439|69|3951|571.59|usual pinto beans. carefully unusual instructions doze across the fluffily bold packages; blithel +439|98|7746|513.91|s. slyly final theodolites haggle carefully. unusual, ironic foxes +439|27|2909|178.61| detect blithely express ideas. packages according to t +440|41|2315|138.12|osits must have to sleep slyly thin platelets. slyly ironic deposits cajole slyly about the quickly even deposits. theodolites are carefully dependencies. carefully final +440|70|9144|16.89| requests across the furiously unusual dugouts haggle above the carefully pending requests. carefully unusual asymptotes cajole furiously ironic packages. carefull +440|99|9546|379.93|above the blithely unusual accounts-- furiously regular requests haggle along the unusual dolphins. silently ironic requests use stealthily. ironic, daring ideas after the blithely final somas +440|28|2183|104.31|c theodolites doze-- ironic ideas shall boost carefully regular courts. carefully ironic plat +441|42|8758|178.97|ctions affix final, regular sheaves. furiously ironic asymptotes wake furiously unusual instructions. pending, pending instructions sleep alongside of the accounts. careful +441|71|9507|160.16|pinto beans. slyly pending deposits haggle besides the accounts. ironic accounts thra +441|100|5737|688.07|its nag slyly. quickly ironic theodolites haggle idly. quickly permanent hockey players nag blithely accounts! bold, regular packages about the theod +441|29|994|184.53|counts. fluffily special accounts haggle after the final requ +442|43|4798|658.32|egular packages. fluffily final theodolites against the carefully even excuses integrate furiously quickly ironic accounts. requests are. slyly unu +442|72|5787|658.69|l, final packages. carefully furious packages haggle across the dependencies. fluffily final accounts sleep furiously along the requests. un +442|1|4901|838.12|ing to the quickly express instructions. quickly ironic deposits alongside of the excuses nag slyly after the furiously regular excuses. slyly final platelets along the slyly pending pi +442|30|9278|497.52|ogged requests. quickly ironic accounts according to the silently bold packages use around the slyly final deposits. ideas against the accounts eat quickly against the fluffily +443|44|6065|392.77|nic packages. carefully enticing packages against the busy, bold requests use slyly among the bold, special gifts. unusual deposits use slyly. bold, ironic platelets cajole acr +443|73|7419|33.49|kages poach with the ideas. furiously regular inst +443|2|1824|650.33|en instructions. fluffily unusual deposits wake carefully ruthless deposits. carefully bold packages sleep furiously carefully ironic frays. carefully unusual accounts +443|31|6755|196.79|ully. final, brave warthogs breach fluffily after the slyly regular ideas. +444|45|2874|61.36|equests boost after the carefully regular ideas. even, unusual theodolites wake slyly above the ironic instructions. quickly final +444|74|3183|494.99|luffily pending foxes. furiously regular accounts must have to cajole quickly. blithely close ideas are quickly permanent theodolites. furiou +444|3|6627|785.19|ecial dependencies. ironic excuses among the furiously special packages integrate after the blithely regular accounts. theodolites wake slyly silently bold re +444|32|4905|80.21| cajole furiously even foxes. quickly final pinto beans are slyly thinly express deposits? foxes after the fluffily regular asymptotes cajole blithely against th +445|46|9666|717.94|ts. silently pending excuses impress according to the platelets. even, regular theodolites affix across the quickly final instructions. even requests are blithely blithely iro +445|75|1116|652.39|ideas. bold instructions cajole slyly special accounts. special accounts are quickly +445|4|7637|917.84|ial pinto beans. slyly bold excuses nag along the even, bold packages. final packages breach carefully about the quickly express platelets. quickly even packages about the packages sleep care +445|33|9549|641.72| fluffily above the express accounts. slyly bold packages sleep slyly express foxes. final packages a +446|47|6137|307.54|y slyly final requests. carefully bold foxes use blithely above the quickly final packages. deposits against the fluffily ironic dependencies solve carefully theodolites. blithel +446|76|4438|223.88|nstructions about the blithely even theodolites breach along the slyly regular foxes. careful, even deposi +446|5|5678|723.26|thely express instructions nag pending, express instruc +446|34|2473|119.31|lar packages. slyly final asymptotes according to the regular packages haggle deposits. busy, express accounts haggle blithely. furiously pending packages use after the blithely reg +447|48|1629|515.77| the carefully regular packages. deposits haggle. slyly special theodolites haggle quickly quickly final deposits. carefully unusual foxes use. fluffily final +447|77|5276|344.57|ully ironic pinto beans. fluffily even ideas are slyly express deposits. quickly blithe theodolites affix blithely after the slyly express deposits. deposits nag. furiously even dependencies at the +447|6|2465|260.26|yly furiously unusual dolphins. blithely final deposits wake at the furiously unusual dolphins. unusual dependencies must have to haggle slyly pending packages. slyly ironic instructions haggl +447|35|2811|752.18|carefully around the carefully regular escapades. regular requests are carefully even dolphins. pending deposits kindle after the quickly final pearls. eve +448|49|1683|641.77|efully pending packages wake stealthily furiously express packages. carefully silent accounts haggle blithely. final accounts are. bold accounts integrate. bold asymptotes wake sl +448|78|1777|133.27|y around the even, bold accounts. carefully bold theodolites boost alongside of the slyly regular reque +448|7|138|355.79|wake above the express instructions. carefully final requests use fluffily final instructions. quickly even ideas along the final packag +448|36|9993|994.80|d the unusual requests. blithely pending excuses wake fluffily unusual, special deposits. bold accounts haggle. blithely ironic packages haggle furiously. sauternes +449|50|7428|369.58|ully ironic pinto beans. unusual deposits instead of the furiously unusual pinto beans grow blithely special forges. regular deposits wake carefully after the carefull +449|79|218|934.62|old accounts haggle carefully. pending dependencies haggle fluffily quickly regular accounts; carefully special pinto beans haggle. waters cajole bold +449|8|9763|35.69|carefully regular foxes cajole at the blithely ironic reque +449|37|1823|714.11|ording to the blithely close asymptotes haggle carefully special requests. packages cajole up the furiously silent deposits. bold, final i +450|51|1191|118.60|cording to the pending requests. ironic ideas use slyly against the final requests. regular accoun +450|80|4989|543.94|ackages. blithely special patterns wake carefully regular requests. furiously regular pinto beans are fluffily above the furiously bold packages. unusu +450|9|8434|278.56|nding packages breach furiously carefully bold requests. slyly express ideas detect furiously. sl +450|38|3696|688.60|pendencies above the blithely brave asymptotes doze fluffily even, regular deposits. deposits nag slyly ironic deposits? pending deposi +451|52|6028|112.26|inst the blithely final packages cajole about the slyly unusual packages. ironic pinto b +451|81|7722|917.61|e the final, unusual accounts. regular instructions nag. blithely bold deposits sleep. bold, bold instructions eat about the furiously regular packages. packages among t +451|10|3958|739.32|xpress, final ideas haggle slyly on the regular instructions. slyly +451|39|6163|382.46|unts. blithely even accounts sleep. blithely even requests sl +452|53|9580|609.40|ounts sleep. slyly quiet ideas wake furiously. careful +452|82|1723|639.71| even requests boost quickly above the furiously ironic de +452|11|7692|579.38|tions. carefully even pinto beans snooze furiously express somas. instructions haggle quickly a +452|40|7533|494.85|osits; regular accounts sleep carefully ironic deposits. theodolites haggle. carefully even packages are quickly. +453|54|9998|475.40|r platelets boost furiously along the slyly even deposits. final instructions wake even, regular theodolites. quickly +453|83|8418|202.70|cingly close ideas: regular theodolites wake slyly quickly ironic frays. slyly express depths wake after the express pinto beans. +453|12|6657|450.86|ackages boost busily. furiously express foxes alongside of the blithely regular requests sleep at the unusual accounts. +453|41|2988|351.90|nusual ideas. unusual requests sleep express excuses. carefully pending dep +454|55|4742|545.51|ular theodolites are carefully regular multipliers. regular, final hockey players along the final deposits wake ruth +454|84|2377|677.61|p the furiously regular requests. regular packages engage carefully along the regular ideas. blithely special accounts print slyly according to the furiously bold ex +454|13|6906|195.33|lithely fluffily bold multipliers. slyly special courts may breach furiously acc +454|42|1648|404.09|tions about the slyly regular asymptotes haggle furiously blithe multipliers. requests sleep. furiously regular depths should unwind accounts. ideas doubt always. bravely brave pinto beans wak +455|56|9811|482.68|s. carefully pending packages wake carefully carefully bold foxes. slowly even requests believe along the special, final requests. fluffily bold packages integrate furiously silent p +455|85|9403|751.28|l excuses sleep against the slyly regular pinto beans. slyl +455|14|8258|590.98|lets was furiously unusual, regular requests. even requests haggle boldly above the express theodolites. quickly ironic dolphins sleep caref +455|43|12|733.06|quietly. quickly regular instructions cajole daringly slyly permanent theodolites. pending, ir +456|57|8189|50.22|eposits integrate quickly. quickly ironic ideas nag slyly alongside of the special accounts! blithely regular deposits engage. final, final deposits wake blithely accordi +456|86|3200|137.49|arefully ironic deposits sleep carefully along the slyly regula +456|15|5331|424.63|gly final packages. furiously silent pinto beans cajole against the quickly unusual packages. slowly express instructions haggle furiously around the carefully silent accounts. +456|44|6334|56.98|ously stealthy packages. furiously even ideas cajole slyly regular theodolites. final packages maintain slyly about the furiously thin courts. slyly silent accounts wake blithely. accounts amon +457|58|9934|862.74|ending, bold theodolites. slyly regular packages hinder platelets. carefully unusual +457|87|5304|729.13| are quickly ironic pinto beans. platelets snooze furiously. enticingly even deposits haggle slyly quickly express instructions. furiously unusual sentiments +457|16|1790|954.78|lithely slyly bold deposits. stealthily even deposits boost blithely. carefully final +457|45|8338|178.97|oost alongside of the dogged theodolites. silent packages hang: deposits sleep deposits. silently express accounts sleep +458|59|8519|118.01|around the special deposits wake carefully quickly ironic ideas. final requests haggle slyly across the asymptotes. furiously pending deposits kindle among the slyly express request +458|88|7376|699.38|ackages believe enticingly. special deposits haggle carefully. furiously regular theodolites cajole. unusual foxes play pending pinto beans. quickly +458|17|3039|471.55| final deposits. quickly express requests above the ideas haggle blit +458|46|1569|534.23|ial notornis. final ideas haggle slowly according to the final, ironic theodolites. theodolites wake alongside of the special, special requests. blithely pending deposits haggle carefully +459|60|5540|43.89|uickly pending foxes. even, bold attainments sleep along the slyly pending requests. furiously express accounts sleep above the packages. even packages hang fluffily furiously final pinto beans. pa +459|89|4030|648.29|y express deposits wake quickly whithout the furiously ironic acco +459|18|2280|926.61|equests wake slyly across the slyly express accounts. fluffily regular pinto beans wake boldly slyly final requests. quickly unusual packages about the quickly silent sheaves wake furiously +459|47|1296|312.02|es haggle quickly against the special, stealthy requests. requests +460|61|9226|625.27|y regular foxes nag slyly carefully ironic courts. pinto beans wake above the blithely ironic packages. slyly silent forges sleep. always ironic pinto beans use qui +460|90|6813|655.62|s kindle furiously against the theodolites. special packages promise bravely blithely regular packages. +460|19|4864|120.67|egular pinto beans! even accounts eat blithely according to the ironic platelets; unusual sentimen +460|48|5691|406.77|e. final, pending instructions cajole furiously. accounts wake about the escapades. fluffily pending excuses are blithely according to the ironic packages. eve +461|62|3174|591.68|inal deposits should boost furiously against the carefully bold accounts. fluffily silent requests integrate final, final depo +461|91|123|441.86|ar orbits. furiously final ideas wake slyly along the express accounts-- blithely ironic deposits wake across the slyly special instructions? final pinto b +461|20|3756|921.17| sleep above the regular, final ideas. pending decoys impress fluffily. thin requests haggle requests. bold instructions +461|49|39|633.98|ctions sleep according to the quick deposits? bold warthogs along the furiou +462|63|4427|157.70|nstructions integrate carefully. even instructions integrate never regular +462|92|1191|425.10|uctions wake fluffily pending, regular requests. +462|21|2701|31.96|cial accounts do wake carefully unusual packages. carefully regular foxes haggle. even ideas nod according to the regular, ironic packages. even, regular theod +462|50|4947|28.16| ironic accounts nag blithely. slyly special excuses boost boldly pinto beans; quickly expres +463|64|6695|973.73|he blithely final grouches. theodolites wake fluffily a +463|93|5451|19.04| slyly around the idly ironic ideas. quickly final packages nag quickly quickly regular instruct +463|22|8632|534.79|y among the carefully unusual foxes. pending deposi +463|51|586|463.11|tealthily final accounts. carefully fluffy deposits use quickly slyly ironic req +464|65|6084|504.88|egular theodolites. bold theodolites wake. slyly even packages at the i +464|94|8439|114.29| bold, pending accounts-- pending foxes doubt carefully final accounts. final escapades are furiously above the regular, bold gifts. blithely pending +464|23|4317|62.10|es sleep. slyly regular accounts wake blithely enticing deposits. quickly express pinto beans cajole. tithes integrate regular pinto beans. ideas haggle always regular, ev +464|52|9366|19.18|s haggle across the quickly bold deposits. sometimes regular requests sleep carefully according to the furiously special frets. regular, express dependencies hagg +465|66|7010|895.98|blithely carefully regular asymptotes-- express foxes sleep carefully furiously special packages. final deposits above the theodolites int +465|95|5904|937.91|uriously alongside of the final asymptotes. packages haggle carefully around the blithely pending ideas. carefully bold dep +465|24|9364|366.14|es. blithely even theodolites wake furiously against the slyly even requests. slyly permanent deposits sleep carefully regular accounts. even dugouts boost carefully final sen +465|53|4660|122.39|st finally ironic requests; regular deposits sleep fluffily furiously special requests. excuses haggl +466|67|5994|313.60|nts unwind fluffily above the blithely pending hockey players. pending +466|96|2733|201.80|es. regular accounts hinder quickly. carefully regular ideas sleep past the blithely ironic packages. furiously final pinto beans boost against the blithely ironic instructi +466|25|7893|233.22|riously ironic ideas-- patterns wake furiously blithely regular pinto beans. furiously +466|54|5264|935.31|y special pinto beans wake furiously. furiously final sentiments after the ironic requests inte +467|68|6404|621.98|sits are after the quickly special escapades. regular, ironic gifts boost blithely unusual accounts. slyly final foxes boost instructions. final accounts accordin +467|97|9125|226.09|ithely silent requests cajole across the furiously bold pinto beans. blithely ironic platelets nag about the final requests. +467|26|8930|996.79|s. furiously ironic deposits affix carefully about the special dolphins-- deposits nag carefully pending pinto beans. permanent, regular so +467|55|4107|936.01|ounts ought to boost fluffily about the fluffily pending requests. requests use carefully after the foxes. carefully even requests sleep regularly about t +468|69|233|378.55| after the accounts. slyly regular asymptotes cajole. final excuses boost; special, ironic instructions wake blithely. requests wake blithely slyly unusual foxes. blithely pe +468|98|4819|793.23|s. carefully express packages lose regular foxes. slyly blithe packages det +468|27|7846|243.04|fully final packages above the unusual epitaphs use +468|56|3933|22.03|gle furiously slyly special theodolites. sly foxes thrash +469|70|7523|954.28|fluffily pending excuses. blithely ironic requests wake blithely-- special accounts affix carefully express packages. theodo +469|99|5178|802.25|ely unusual platelets. blithely special requests use slyly above the daringly regular pinto beans. fluffily special sheaves cajole slyly along the even pa +469|28|9652|983.24|mong the slyly bold packages sleep above the finally final deposits. furiously regular pinto beans use slyly enticingly express packages. express +469|57|553|903.55|mptotes affix furiously asymptotes. requests haggle blithely unusual packages. carefully ironic packages sleep furiously even accounts. carefully regular courts according to the deposits hagg +470|71|8598|295.89|fix fluffily regular packages. slyly bold foxes are quickly. slyly express foxes cajole furiously iro +470|100|3215|193.64|ly regular packages haggle against the slyly even accou +470|29|2500|944.46| slyly final requests. regular accounts nag furiousl +470|58|144|571.27|l requests use. ironic, special ideas against the slyly express theodolites use carefully carefully ironic pinto beans. ironic, regular accounts are carefully fluffily final pinto beans. carefu +471|72|4978|74.01|ess theodolites. regular, express excuses around the quickly regular accounts are carefully blithely express theodolites. finally ironic foxes sleep blithely above the furiously unusu +471|1|311|447.21| according to the closely final deposits are among the carefully permanent theodolites. blithely even pinto beans sleep furiously. slyly silent packages after the +471|30|3575|965.29|unts are express pinto beans. even, even packages sleep fluffily furiously bold packages. bravely regular ideas after the silent foxes wake about the quickly silent theodolites. +471|59|9777|9.34|deposits wake against the regular ideas. carefully even packages nag slyly. bold, regular requ +472|73|2771|422.91|al excuses above the furiously bold theodolites wake carefully across the never final platelets: slyly regular asymptotes haggle furiously slyl +472|2|1319|223.96|e. furiously final requests are at the fluffily careful foxe +472|31|410|102.02|equests affix; carefully final requests against the bold packages solve slyly across the carefully even foxes. slyly final foxes +472|60|8731|607.94|ges use blithely even accounts. furiously ironic dugouts sleep blithely. slyly silent requests eat among the c +473|74|4750|57.41|kly final packages. boldly regular packages are instructions. boldly final instructions above the carefully pending requests integrate among the +473|3|4126|46.60| fluffily even instructions wake doggedly after the epitaphs. carefully pending dinos haggle blithely accounts. ca +473|32|7455|243.11|ss deposits. slyly ironic pinto beans nag among the carefully pending hockey players. pending foxes after t +473|61|3862|275.77|ans affix carefully. carefully special instructions would was regular instructions. blithely even warhorses are slyly bold, final accounts. bravely quick ideas mus +474|75|3200|728.15|ding to the express courts. furiously ironic deposits nod accounts. bold deposits cajole throughout the carefully close accounts. fluffily final attainments will cajole blithely even foxes. slyl +474|4|6439|420.98|ent foxes cajole slyly special requests. carefully expre +474|33|6252|659.60| the final, even pinto beans. express, bold theodolites affix above the special requests. ironic dependencies wake slyly. fluffily fi +474|62|6728|67.76|d according to the unusual, pending theodolites. furiously thin theodolites haggle +475|76|2890|250.52|ole blithely across the carefully unusual requests. furiously final instructions nag slyly. requests among the bold forges haggle slyly final accounts. blithely final +475|5|4931|963.55|riously ironic requests. furiously ironic theodolites wake enticing platelets-- blithely even packages believe slyly according to the slyly unusual platelets. furiously +475|34|8806|722.81|r packages. final instructions nag quickly about the foxes. quickly express requests cajole car +475|63|1131|517.24|ackages among the dinos dazzle blithely around the ironic, ironic theodolites. final cour +476|77|9171|177.86|o the carefully even deposits detect among the furiously final pinto beans. pinto beans cajole carefully slyly special requests. pinto be +476|6|4393|451.07|ggle blithely according to the slyly ironic accounts. furiously even asymptotes cajole. final sheaves above the quickly final pinto bea +476|35|6969|972.92|lly regular deposits boost among the requests. furiously final dolphins wake blithely carefully regular asymptotes. regular asy +476|64|8829|262.64|s. furiously close requests wake furiously accounts. blithely express deposits about the ironic, ironic packages affix above the cl +477|78|5089|773.55|ly fluffily even pinto beans. quickly even excuses are slyly furious courts. furiously even theodolites sleep blithely fluffily final depths. even, brave foxes use against the ideas. pending accoun +477|7|2551|167.95|. special ideas above the carefully quiet deposits haggle slowly even courts: silent ideas above t +477|36|3921|844.46|nal requests are bold, bold ideas; dependencies are fluffily across the fluffily regular deposits. slyly regular deposits boost according to th +477|65|1463|189.57|. asymptotes wake? express packages wake blithely unusual, ironic somas. quickly unusual pains boost. s +478|79|4424|506.55|theodolites wake furiously close notornis. bold dependencies cajole forges. blithely regular asymptotes cajole according to the fluffily even deposits. excuses cajole blithely +478|8|2049|202.50|ajole slyly final, bold theodolites. carefully regular instructions alongside of the carefully pending dependencies wake alongside of the slyl +478|37|9781|107.59|ts among the bold, regular pearls haggle according to the special dependencies. final dugouts nag quickly. even, final s +478|66|4653|383.41|lthily ironic instructions. closely ironic foxes should nag slyly. unusual, final foxes about the carefully final packages cajole fluffily bol +479|80|657|572.92|s deposits. furiously express ideas wake after the regular theodolites. furiously bold ideas across the fluffily regular accounts +479|9|7940|792.19|e quickly pending excuses boost except the quickly furious deposits. carefully unusual foxes according to the furiously bold requests sublate slyly +479|38|7560|777.28|ounts integrate furiously around the pinto beans. regular pinto beans lose carefully carefully ironic packages-- ironic packages haggle above the slyly regular accounts. regular package +479|67|8063|4.02|ironic foxes haggle theodolites. furiously even packages cajole. blithely pending requests wake silent theodolites. special, silent deposits whithout the slyly express the +480|81|2289|940.16|ully bold excuses cajole regular, silent accounts. regular, pending sentiments boost furiously. fluffily express ideas x-ray requests. deposits are fluffily +480|10|2496|130.96|blithely slyly express excuses. pending accounts haggle. pending deposits poach carefully. ironic theodolites haggle quickly theodolites? fluffily pending accounts sleep afte +480|39|1163|542.64| excuses wake blithely above the requests. never regular packages according to the blithely bold +480|68|5383|430.28| somas after the pending deposits doubt blithely ironic, final ideas +481|82|8117|142.08|s nag carefully according to the slyly final platelets. carefully ironic ideas among the pending requests was among the special packages. somas run unusual, silent f +481|11|1764|516.40| pending, even depths cajole furiously ironic packages. furiously enticing pinto beans cajole fin +481|40|7951|916.08|rthogs. ironic, ironic somas haggle carefully even, ironic accounts. thinly regular requests above the ironic packages wake slyly furiously silent accounts. dogged requests nag regular +481|69|589|56.20|l frets about the slyly blithe epitaphs are instructions. final, f +482|83|5246|822.67| pending accounts? final deposits cajole along the even asymptotes. quickly ironic ideas are slyly. unusual, silent notornis are carefully carefully special deposits. slowly express platelets nag +482|12|1471|623.54|ctions cajole. furiously even ideas print around the special packages. quickly pending ideas believe ruthlessly among the blithely regular theodolites. furiously unusual asymptotes +482|41|4933|501.92|theodolites was carefully along the regular packages? carefully unusual epitaphs across the carefully express deposits doze quickly pending requests. regular packages sleep slyly. +482|70|4382|336.60|the slyly ironic accounts need to are about the carefully pending theodolites. slyly exp +483|84|8999|133.44|fully final deposits are alongside of the even pinto beans. regular pinto beans nag. unusual, even requests run blithely. regular requests sleep slyly carefully even requests. ir +483|13|8687|158.68|unusual dolphins cajole slyly along the even acco +483|42|6707|860.70|he accounts. furiously regular deposits boost fluffily. regular packages are regular foxes. furiously +483|71|8420|435.84|deposits. final accounts thrash carefully. careful accounts sleep slyly about the quickly final th +484|85|1469|674.97|n about the unusual requests. slyly regular asymptotes boost around the final accounts. furiously express accounts wak +484|14|7015|777.58|usly special requests. boldly express pinto beans was quickly. patterns sleep carefully according to the slyly bold orbits. blithely +484|43|9883|969.11|leep. blithely unusual courts boost slyly until the regular, ironic deposits. pending gifts wake furiously final packages. slyly regular packages impress sl +484|72|1923|218.97|lyly even deposits sleep alongside of the blithely ironic packages. quiet patterns grow furiously silently even instructions. carefully even requests are slyly furiously ironic theodolites. furi +485|86|1562|109.26|yly among the regular forges. furiously regular instructions cajole +485|15|8677|435.00|dolites. carefully regular packages cajole furiously across the furiously even asymptotes. carefully final deposits are +485|44|5676|626.94|y around the carefully even theodolites! slyly bold requests integrate. blithely regular d +485|73|30|657.19|ar packages haggle slyly carefully regular accounts. fluffily bold packages across the unusual platelets haggle furiously ironic packages. +486|87|9050|595.51|ly above the fluffily final accounts. blithely regular requests cajole slowly slyly ironi +486|16|2053|908.29|sly idle packages-- regular, regular accounts serve carefully quickly final deposits-- special packages detect. carefully ironic dolphins engage blithely among +486|45|6935|965.81|slyly final asymptotes. carefully unusual ideas sleep carefully sly deposits. grouches integrate slyly +486|74|2806|701.97|tructions haggle slyly blithely unusual asymptotes. ironic, ironic accounts nag. carefully regular decoys use furiously fluffily unusual deposits. furiously regular excus +487|88|4119|46.84|the slyly ironic excuses. silent packages play blithely. ironic, regular deposits haggle furiously. sly +487|17|4119|214.52|tes can wake. final pinto beans at the ruthlessly even excuses are along the pending courts? regular warhorses wake. blithely pending packages wake blithely fluffy, final theodol +487|46|8891|284.83|y ironic instructions detect carefully final, unusual packages. bold requests after the bold, special asymptotes use ironic, unusual requests. +487|75|7655|71.08|pecial deposits. unusual, final accounts across the blithely final requests are enticingly furiously regular deposits. carefully final pinto beans sleep blit +488|89|4385|9.73|ily fluffy ideas. blithely final asymptotes among the excuses are about the slowly pending requests. final excuses haggle furiously. blithely even packages among th +488|18|102|935.21|sleep blithely: final pinto beans believe furiously alongside of the furiously close accounts. even, pending requests boost slyly +488|47|2837|840.67|endencies cajole. blithely even accounts wake after the slyly bold packages. quickly silent requests boost furiously blithely regular requests. furiously reg +488|76|3654|382.27|ons use blithely among the slyly silent requests. deposits cajole re +489|90|3178|360.62|sly even deposits cajole always furiously even deposits. unusual requests cajole carefully regular packag +489|19|7196|174.34|packages cajole carefully even dinos. fluffily final requests x-ray according to the busy, final deposits: furiously express dependencies among the platelets nag acc +489|48|1317|341.76|c braids nag slyly regularly close packages; enticingly silent theodolites above the regular, even instructions sleep furiously pending deposits. quickly bold requ +489|77|3471|937.30|dogged pinto beans above the silent, bold requests wake slyly about the regular accounts. blithely ironic deposits wake. even, express sheaves haggle carefully deposits. specia +490|91|7994|17.68|lyly brave ideas. accounts cajole. slyly express hockey pla +490|20|6306|704.55| fluffily regular requests. regular packages poach pending, unusual courts. +490|49|1820|395.98| slyly bold theodolites. furiously special packages nod carefully silent deposits. quickly regular foxes against the special asymptotes nag slyly ca +490|78|7975|132.42|s nag. furiously express ideas detect about the bold platelets. carefully ironic packages sleep furiously slyly r +491|92|2484|115.31| packages haggle-- carefully even accounts against the ironic requests haggle among the enticingly final requests. ironic, slow requests are +491|21|2491|203.95|efully ironic courts according to the slyly bold excuses sleep ironic, ironic +491|50|7537|526.05|osits. regular requests are furiously about the carefully regular packages. carefully final foxes haggle ironically. blithely express theodolites detect against the furious theodolites. stealthily +491|79|9869|410.80|ironic requests use. even, special courts cajole. theodolites after the blithely ironic courts sleep regular requests. slyly final dependencies nod. +492|93|2545|359.98|ironic foxes sleep blithely regular packages. carefully final frays boost carefully regular theodolites. fluffily bold requests nod beside the carefully final ideas. bl +492|22|3619|520.12|e quickly despite the ironic deposits. unusual deposits nag quickly slyly brave packages. regular ideas along the regular, even cou +492|51|8732|581.28|arefully. instructions alongside of the carefully silent accounts boost furiously abo +492|80|6875|524.71|old theodolites believe daringly according to the furiously regular deposits. pending inst +493|94|8029|765.35|ous packages sleep slyly across the quickly ironic accounts. regular packages thrash above the furiously final theodolites. furi +493|23|1481|319.99|coys against the even instructions cajole furiously bold, daring courts. slyly ironic deposits ought to wake blithely regular ideas. slyly regular ideas according to the slyly express ac +493|52|718|634.58|furiously slyly ironic packages. pending requests use ruthlessly across the blithely bold deposits. furiously fin +493|81|2818|237.16| the carefully special frays. final excuses haggle slyly. furiously regular deposits across t +494|95|5007|153.49|e after the accounts-- finally bold pinto beans cajole quietly. furiously ironic instructions cajole along the slyly final requests. furiously unusual +494|24|3735|592.23|al pinto beans. bold, regular deposits about the slyly regular requests haggle after the slyly ironic deposits. furiously even theodolites are. fox +494|53|1227|780.42|packages. carefully express braids haggle bold theodolites. blithely special requests hinder. blithely fi +494|82|7793|702.46| accounts; furiously express excuses cajole slyly around the +495|96|8482|241.13|cajole furiously according to the furiously express foxes. blithely final ideas ha +495|25|8354|14.27|ironic ideas. fluffily even requests boost about the fluffy deposits: ironic deposits haggle special foxe +495|54|7185|258.98| regular packages boost furiously always final packages. slyly final excuses boost. slyly ironic deposits wake slyly-- final, final asymptotes sleep against the slyly bold deposits. c +495|83|9753|270.41|fter the carefully final forges. final deposits around the slyly pending packages slee +496|97|1478|486.45|ly pending packages would run slyly according to the bold packages. furiously regular deposits are. carefully special attainments boost blithely. permanently pending th +496|26|5685|86.66|lithely enticing asymptotes along the frets wake pending deposits. furiously final dependencies use. sentiments alongside of the regular requests doze carefully into the carefully regular account +496|55|7761|248.04|arefully silent dependencies affix ironically over the ironic accounts. special idea +496|84|7955|180.16|bout the regular platelets. slyly unusual deposits hinder slyly about the special, unusual packages. closely furious packages sleep daringly against the carefully fi +497|98|5708|152.41|yly fluffily final courts. furiously ironic deposits are according to the packages. foxes sublate furiously blithely silent theodolites! unusual pinto beans arou +497|27|9136|285.23|ing to the ironic pinto beans. boldly final requests among the blithely ironic platelets cajole slyly blithely ironic requests-- r +497|56|7810|822.49|ar pinto beans after the slyly ironic deposits are across the quickly special requests. regular warhorses grow carefully before the bold packages. fluffily special deposit +497|85|8148|578.20| cajole furiously. carefully express instructions haggle whithout the slyly even dolphins. bold, special accounts wake furiously. quickly special asymptotes haggle enticingly across +498|99|2846|649.19|platelets. special accounts haggle above the furiously final pinto beans! quiet, +498|28|6199|948.63|ar instructions against the carefully even foxes cajole unusual asymptotes. carefully furious packages about the furiously silent packages sleep careful +498|57|5145|652.24|, even deposits boost. silent requests about the blithely special packages nag regular pinto beans. carefully pending requests haggle slyly unusual multiplie +498|86|6764|303.88|packages. quickly express deposits cajole fluffily during the +499|100|1941|681.26| furiously pending accounts use final, regular theodolites. carefully ironic requests sleep. quietly pending platelets wake furiously. express foxes cajole slyly. furiously bold notornis sleep +499|29|6904|481.78|nst the furiously unusual asymptotes. carefully express +499|58|9665|515.37|unusual accounts sleep slyly even courts; carefully regular theodolites nag furiously regular foxes. bold ideas affix. carefully pending accounts sleep carefully. +499|87|3271|639.57|uses. even requests sleep quickly ironic requests. furiously bold tithes against the accounts haggle slyly final theodolites. final accounts a +500|1|3366|204.89|ar packages. furiously regular pinto beans are outsid +500|30|3667|274.02|ular requests. blithely ironic requests wake carefully fur +500|59|7351|329.76|asymptotes. carefully special notornis among the quickly express requests haggle sometimes final asymptotes. regular asymptotes nag slyly unusual requests. silently unusual packag +500|88|5853|30.89| across the evenly even theodolites. blithely bold dugouts are blithely alongside of the furiously silent foxes. pending instructions sleep even +501|2|6317|961.53| around the regular, final deposits. careful, express frays alongside of the final, unusual deposits sleep blithely against the bold t +501|32|8242|719.16| regular excuses. slyly regular dependencies sleep slyly packages. final packages boost furiously a +501|62|5157|186.38|eas cajole silently fluffy requests. silently ironic accounts promise slyly quiet requests. quickly unusual requests affix p +501|92|6109|931.08|lly bold requests hinder furiously across the even, even foxe +502|3|1735|455.79|ess frays cajole slyly across the quickly final accounts. slyly stealthy accounts cajole packages. quickly final reques +502|33|7173|387.68|l theodolites boost furiously. platelets across the always regular theodolites wake carefully aroun +502|63|5071|461.80|s requests haggle across the silent foxes. blithely express requests about the even theodolites detect furiously blithely bold instructions. ironic +502|93|282|489.35|ainst the evenly regular deposits hinder furiously across the instructi +503|4|7474|973.08|ld accounts wake furiously unusual pinto beans. carefully pending grouches nag slyly. blithely pending accounts doubt. furiously special pinto beans along t +503|34|3793|68.79| blithely final accounts boost fluffily blithely iro +503|64|3034|490.86|carefully ironic theodolites doubt. slyly ironic deposits across the special pinto beans are slyly about the excuses. special deposits sleep fluffily bold accounts. evenly final instructio +503|94|7055|321.55| deposits serve slyly. slyly pending packages sleep slyly blithely bold foxes. carefully final requests wake with the dolp +504|5|3641|841.66|al deposits. carefully final ideas integrate above the final, even requests. quickly ironic dolphins cajole carefully. blithely regular packages cajole slyly. carefully regular foxes haggle a +504|35|2814|96.22| excuses thrash blithely even packages. carefully regular foxes doubt furiously quickly express packages. regular, slow accounts haggle. quiet sentiment +504|65|3211|68.22|o the regular, ironic theodolites. quickly pending accounts above the blithely silent theodolites sublate among the blithely unus +504|95|6273|919.87|nal dependencies are furiously express instructions? quickly regular pinto beans breach furiously ironic, regular dolphins. fluffily special packages wake fluffily above t +505|6|5542|758.43|lly even requests. busily final asymptotes are slyly across the ironic dependencies. carefully ironic dep +505|36|4737|806.19|above the bold packages. blithely bold attainments sleep blithely pending ideas. furiously bold asymptotes detect bli +505|66|1616|278.42|ajole furiously alongside of the carefully ironic instructions. blit +505|96|9262|258.55|e slyly about the regular pinto beans. ironic excuses are furiously past the orbits. slyly bold sauternes against the +506|7|7436|52.21| accounts sleep slyly. final pinto beans among the pending deposits haggle fluffily above the ironic packages. ironic, ironic accounts are +506|37|6994|685.03|ooze above the ironic, final accounts. ironic pains along the regular, express ideas haggle carefully furiously express Tiresias. pending instructions ab +506|67|6986|940.66|iously carefully even accounts. carefully pending sentiment +506|97|3087|516.75|blithely regular deposits. slyly regular excuses among +507|8|3324|833.87|ilent packages. ironic, regular ideas lose above the quickly unusual hockey players. ironic, regular theodolites sleep quickly. special packages cajole furiously. even +507|38|5655|933.86|usly regular courts affix packages. furiously regular depths kindle carefully across the +507|68|6037|141.99|packages. accounts after the deposits wake above the slyly express accounts. bold, final foxes integrate final, unusual requests. furiously permanent foxes haggle quickly. final packages boost qui +507|98|3909|995.52|blate carefully. ruthlessly pending excuses at the quickly brave warthogs are quickly even accounts-- carefully busy foxes doubt. quickly even requests ha +508|9|1551|596.44|tructions! fluffily even requests along the platelets cajole regular, ironic excuses. regular, regular deposits hinder busily acros +508|39|6032|632.11|rmanent packages nag about the furiously special foxes. quickly express accounts wake slyly. regular foxes cajole furiously. slyly even requests nag furiously furiously ironic deposits. depe +508|69|5730|696.27|foxes. slyly close accounts wake furiously blithely fi +508|99|9761|63.95|ress deposits nag slyly. slyly regular pinto beans boost carefully furiously regular packages. quickly bold platelets after the pending, +509|10|3984|176.95|oxes. fluffily final waters cajole carefully quickly even requests. bold, final theodolites sleep co +509|40|5145|167.36|l, silent deposits are slyly regular packages. blithely regula +509|70|9901|799.69|ly final instructions boost quickly slyly pending instructions. regular instructions are quickly about the quickly quick instructions. slyly express deposits sleep at the fu +509|100|4917|962.31|ular theodolites sleep carefully. regular theodolites sleep. frays sleep +510|11|8629|810.63|x. furiously regular theodolites are theodolites. blithely even excuses lose blithely carefully pending pinto beans. regular theodolites sleep slyly accord +510|41|5812|21.66|requests. excuses haggle sometimes even ideas. ironic theodolites serve blith +510|71|7035|733.98|y the quickly express epitaphs. ironic requests are quickly bold requests. furiously regular requests maintain furiously across +510|1|6587|463.96|n accounts. carefully final theodolites sleep slyly. daring ideas +511|12|90|783.67|ar accounts haggle furiously after the careful, special courts. bold foxes integrate blithely carefully regular pa +511|42|9906|440.75| bold patterns. deposits hinder! carefully bold packages sleep. blithely regular dep +511|72|1439|371.24|hang blithely special packages. fluffily ironic requests integrate carefully. even requests are. blithel +511|2|9923|928.27|encies sleep quickly carefully regular foxes. even ideas serve along the pending sauternes. even requests cajole carefully blithely +512|13|3546|131.59|tes sleep. final, regular foxes nag blithely since the accounts. instructions engage fluffily above the quickly pending accounts. slyly ironic platelets use +512|43|7627|33.00|ely brave instructions above the blithely enticing requests cajole according to the furiously express dependencies. furiously thin ide +512|73|3640|421.57|ed deposits. even accounts are blithely. quickly regular theodolites sleep even foxes. ironic dependencies sleep blithely among the furiously brave h +512|3|8928|578.30|e slyly bold packages. fluffily regular instructions impress carefully final notornis. slyly special theodolites cajole even req +513|14|5666|378.65| even accounts. fluffily bold pinto beans was furiously according to the regular, blithe accounts. blithely fin +513|44|9502|565.61|instructions nag quickly blithely brave ideas. deposits will have to sleep slyly express deposits. idly even instructions between the furiously even dependencies dazzle blithely alongs +513|74|378|869.94|, special foxes according to the blithely special accounts use among +513|4|3061|756.83|ions. ironic deposits kindle carefully above the final, final requests. excuses nag carefully slyly even ideas. final pla +514|15|4454|938.27|ts use slyly express deposits. quickly bold accounts sleep blithely carefully unusual ideas. warthogs are ironic packages? special packages boost. dogged requests snooze silently according to t +514|45|4739|419.26|y. regular pinto beans sublate enticingly blithely final deposits. blithely bold asymp +514|75|3784|787.83|ular accounts use fluffily. ironic theodolites doubt sl +514|5|5879|404.67|usly bold pinto beans. carefully pending platelets cajole among the blithely regular deposits: thinly pending deposits kindle across the qu +515|16|6431|349.14|after the furiously even deposits. silent accounts integrate slowly about the fluffily ironic foxes. slyly regular package +515|46|767|995.20|could have to integrate. carefully bold deposits about the carefully regular requests cajole final ex +515|76|6886|196.40|unusual deposits. final, pending accounts maintain fluffily. express, pending +515|6|9134|480.77|he blithely unusual deposits. fluffily final deposits nag slyly. carefully even foxes could wake busily even asymptotes. quickly regular sentiments a +516|17|6105|600.29| blithely regular platelets use carefully above the regular platelets. express +516|47|5414|254.58|uickly ironic requests around the carefully even requests cajole with the final accounts. furiously final pinto beans haggle blithely according to the slyly regular depos +516|77|125|267.26|uriously unusual requests. slyly final deposits nag furiously. doggedly enticing dependencies cajole blithely regular, r +516|7|8650|540.68| silent dependencies use about the fluffily even accounts. slowly unusual accounts haggle carefully. slyl +517|18|1790|556.36| enticing requests. blithely final ideas wake blithely according to the pinto beans. blithely even requests +517|48|1205|263.56|eep slyly special, express platelets. carefully even accounts cajole alo +517|78|9495|232.99|s sleep sheaves. express packages nag slyly. regular, even ideas haggle furiously permanently ironic requests. slyly pend +517|8|8049|947.07|ar foxes. regular pinto beans after the furiously even foxes are fluffily slyly ironic sheaves. pending, p +518|19|1996|412.27| the blithely express forges. furiously bold dolphins against the slyly regular requests cajole abov +518|49|8880|65.72| of the furiously final requests are carefully ironic foxes. furiously regular requests nag. regular, final deposits cajole against the even packages; final, thin pinto beans +518|79|8100|934.78|refully. express requests across the quickly final pains +518|9|6002|612.59|blithely pending requests. dependencies along the silent ideas sleep quickly pending, slow escapades. slyly special packages wake blithely. bold, even d +519|20|3637|185.94|structions wake slyly along the regular accounts. slyly even packages affix blithely about the silent, ironic accounts. courts sleep furiously special excuses. +519|50|777|374.71|ts snooze carefully. carefully brave accounts are across the blithely thin +519|80|7887|250.82|ress accounts sleep closely among the idly ironic requests. slyly express requests are against the fluffily bold dependencies. ironi +519|10|9789|45.86|tions. regular, regular packages grow. blithely final deposits grow. carefully unusual theodolites wake carefully after the slyly regular pains. furiously final accounts nag blithely quickly pendin +520|21|1888|736.35| accounts use furiously against the express instructions. special, express excuses affix blithely across the blithely regular pinto beans: slyly unusual theodolites dazzle caref +520|51|9987|362.52|e carefully above the slyly express requests. furiou +520|81|6592|114.47|ully pending accounts was carefully even requests. carefully quiet instructio +520|11|2585|104.58|yly. fluffily regular deposits cajole blithely accor +521|22|7639|728.23|beans sleep carefully ironic packages. furiously r +521|52|5346|731.96|slyly ironic dependencies. slyly express pinto beans about the qu +521|82|4196|553.03|ly pending requests. blithely unusual excuses use blithely ironic ideas. even foxes about the carefully final foxes use against the ironic dolp +521|12|2510|228.13|r requests nod quickly even instructions. express accounts along the ironic accounts are furiously special ideas. theodolites among the express pinto beans are among the pains +522|23|6343|162.91|long the fluffy accounts affix fluffily ironic foxes. blithely even asymptotes nag carefully accordi +522|53|5885|49.55|inal pinto beans sleep carefully about the deposits. +522|83|4672|896.39|express requests above the blithely special ideas haggle slyly quickly even asymptotes. bold, bold requests after the furiously unusual packages promise evenly unusual pack +522|13|1705|748.37|s, pending instructions solve. quickly even depths serve. excuses m +523|24|8216|603.02|y special deposits wake carefully. special, ironic theodolites sleep carefully according to the excuses. even, unusual somas unwind above the quickly bold packages! furiousl +523|54|3056|205.52|along the even gifts. careful, pending accounts promise about the slyly ironic ideas. fluffily bold sheaves ha +523|84|4826|898.32| courts! ironic, pending accounts engage fluffily busily regular packages. furiously even courts are across the slyly even instructions. +523|14|4259|268.71|final, bold accounts. ironic packages wake slyly. regular theodolites affix blithely. deposits alongside of the deposits use slyly carefully even dependencies. packages at the careful, final pl +524|25|8293|947.68|s sleep quickly blithely regular ideas. ideas wake blithely furiously final deposits. instructions wake. pending packages against the furiously pending excuses sl +524|55|5771|749.19|y ironic pinto beans. epitaphs are silently along the pinto beans. regular, even deposits impress. slyl +524|85|6113|332.94|ts wake carefully along the slyly bold platelets; special, special pinto beans cajole quickly. +524|15|7321|579.21|d excuses. blithely express deposits engage furiously? dugouts detect furiously carefully regular package +525|26|4884|714.33|kly express ideas. regular excuses sleep blithely. deposits are slyly slyly express requests. final, even instructions use. slyly eve +525|56|8567|938.78|ckly against the even hockey players. final ideas hinder blithely. silently regular instruc +525|86|1771|922.49|deas. special instructions wake. furiously ironic instructions boost slyly ironic pinto beans; slyly pending foxes sleep! unusual, ironic excuses haggle. pinto beans sleep blithely. pending ins +525|16|2166|908.34|t after the regular packages. quickly final dependencies haggle c +526|27|6808|855.85|ely even platelets. quickly bold pinto beans haggle along the carefully regular deposits. regular +526|57|4445|732.30|y packages wake above the unusual deposits. blithely close asymptotes according to the carefu +526|87|2002|172.29|yly express warthogs. slyly special deposits hinder quickly along the slyly ironic asymptotes. quickly pending packages use fluffily along the blithely re +526|17|6209|861.73|ges. fluffily pending packages cajole furiously above the slyly special theodolites. asymptotes at the fluffily pending frays sleep alongside of the regular courts. fluffily final deposits alon +527|28|8832|714.20|en accounts poach. special attainments are. final, final theodolites integrate caref +527|58|1981|700.57|ess theodolites. carefully regular deposits snooze furiously bold accounts. ironic, bold deposits wake slyly express packages. deposits impress blithely along the unusual reque +527|88|8577|405.60|quick pinto beans against the deposits sleep blithe, ironic asymptotes. fl +527|18|8097|963.27|slyly daring asymptotes nag furiously. requests integrate carefully. regu +528|29|4555|955.57|y final requests: final, fluffy instructions sleep alongside of the bravely +528|59|8671|376.78|longside of the blithely bold pinto beans. slyly regular +528|89|1635|997.72|entiments. blithely final pinto beans haggle blithely final instructions. even, ironic packages wake slyly regular frets. quickly unusual +528|19|6658|490.28|quests about the final, regular ideas sleep quickly ironic requests. evenly even theodolit +529|30|9026|580.07|among the idle deposits. furiously quiet pinto beans about the unusual foxes wake furiously accounts. bold courts around the ironic accounts hang about the carefully even ideas. pinto beans sleep c +529|60|1487|98.24|es against the slyly bold excuses use slyly alongside of the accounts. carefully final foxes boost. final, regular deposits affix slyly +529|90|1732|86.67|side of the final packages. special deposits cajole carefully alongside of the bold ideas. blithely final pinto +529|20|2587|384.15|en packages are along the carefully regular dolphins. regular deposits sleep carefully stealthily unusual excuses; regularly regular reque +530|31|869|121.57|y fluffy theodolites among the theodolites affix furiously regular ideas; carefully even theodolites use slyly. quick +530|61|4541|485.13|ly across the express deposits. quickly enticing ideas nag fluffily final multiplie +530|91|605|924.74|carefully even pinto beans sleep. dogged, final accounts was furiously above the ironically daring de +530|21|5480|767.38|ndencies sleep slyly along the daring pinto beans. fluffily even grouches affix carefully. final, special deposits boost +531|32|3497|438.81| quickly regular excuses use quickly; carefully pending deposits detect thinly bold courts. final deposits along the ironic deposi +531|62|6229|648.91| along the fluffily unusual ideas cajole careful, bold accounts. regular, special packages around the asymptotes are daringly across the unu +531|92|5292|305.12|quests are slyly. quickly silent ideas alongside of the blithely special ideas detect special, ironic asymptotes. regular requests cajole ironi +531|22|5154|523.50| accounts use ironic accounts. slyly ironic ideas according to the blithely final requests sleep furiously pending, regular dependencies. slyly final asymptotes print blithely even grouches +532|33|4517|372.44|uickly pending platelets mold furiously furiously regular instructions? quickly express requests nag +532|63|4112|69.53|ffily. pending pinto beans cajole furiously unusual, pending accounts. slow, regular ideas cajole carefully packages. fo +532|93|6441|1.87|gular depths according to the fluffily final asymptotes are among the blithely final pains! blithely ironic pinto beans serve blit +532|23|6709|790.81| even platelets. carefully regular requests cajole! slyly regular asymptotes haggle slyly. slyly even i +533|34|6031|505.58| carefully along the slyly ironic platelets. final pinto beans according to the furiously ex +533|64|1001|917.79|e quickly dinos. quickly regular packages cajole. quickly silent packages wake furiously. finally unusual +533|94|1920|824.14|ymptotes poach between the carefully regular requests. quickly bold packages use fluffily even requests? carefully regular +533|24|2511|369.35|y final packages affix slyly pending requests. furiously even courts across the ironic pinto beans detect slyly along the regular, final escapades. packages affix alongside o +534|35|805|48.60|eans. requests are. blithely silent dolphins are silently ironic accounts. pending sentiments among the furiously pending reques +534|65|3296|844.71|lites. carefully express requests sublate quickly along the furiously even requests. dolphins use blithely against the slyly b +534|95|6438|376.01|tructions doze slyly deposits. final, regular ideas haggle carefully. frays doze carefully. slyly bold requests wake carefully about the slyly +534|25|8933|199.70|ly pending realms. ironic instructions about the silently bold deposits haggle across the slyly busy instructions. carefully bold realms need to lose furious +535|36|6234|957.21|. ironic packages integrate slyly above the blithely final ideas. blithely final accounts haggle regularly. express grouches are carefully slyly even idea +535|66|3424|949.68|uriously special instructions cajole boldly blithely express packages. slyly final ideas w +535|96|1363|356.65|nic ideas. carefully final excuses cajole slyly. blithely bold pinto beans use furiously across the +535|26|5565|381.28|ze against the daringly even packages. slyly idle accounts boost slyly according to the carefully express p +536|37|8830|792.14|ar ideas are furiously silent pinto beans. dogged requests detect fluffily! deposits sleep carefully blithely final deposits. quickly regular pearls play +536|67|377|989.85|s. silently regular foxes according to the even, express asymptotes are slyly against the carefully ironic accounts. ca +536|97|352|143.93| blithely express depths cajole quickly. quickly even instructions are quickly. +536|27|7609|623.53|ons sleep blithely about the sometimes even requests. ironic accounts unwind carefully alongside of the quickly permanent packages. slyly even braids print furiously fur +537|38|2145|348.58|c accounts detect final patterns. blithely even dolphins boost about the regular, even theodolites-- blithely unusual deposits wake furiously according to the quickly ironic packages. special +537|68|2662|617.22|ffily even requests. slyly bold foxes about the quickly thin foxes boost furiously slyly stealthy deposits. slowly final requests +537|98|4507|201.79| packages wake above the carefully even theodolites. fluffily regular +537|28|4230|112.34|are against the quickly pending packages. fluffily pending courts nag. quietly final requests mold along the blithely even requests +538|39|4074|230.27|equests detect furiously against the furiously unusual requests. quickly pending warhorses haggle furiously regular dep +538|69|4895|208.50|y even excuses detect. slyly regular foxes are furiously. blithely bold deposits use carefully ironi +538|99|6115|36.59|e bold, ironic packages. always final deposits detect blithely. accounts sleep quickly +538|29|9617|882.65|ke slyly after the slyly special packages. furiously regula +539|40|8720|608.36|ggle blithely final tithes. ironic, final instructions detect slyly quickly express requests +539|70|9489|22.09| final packages haggle. fluffily final pinto beans among the ruthlessly final deposits play furiously blithely unusual ins +539|100|7405|865.77|jole blithely. slyly even deposits are quickly unusual pinto beans. quickly stealthy packages wake. evenly final accounts sleep blithely even instructions. slyly idle attainments haggle furiously pe +539|30|9448|640.91|ep quickly. furiously quick dependencies believe fluffily across the quickly even accounts. stealthily final instructions detect according to the theodolites. instructions cajole furiously abo +540|41|3787|734.46|ss requests wake carefully quickly ironic asymptotes. fluffily final theodolites cajole fluffily about the unusual dolphins? furiously final excuses wake furiously. c +540|71|8758|628.99|deposits against the regular theodolites sleep slyly among the pending pinto beans. carefully even theodolites haggle across the foxes. +540|1|5142|106.41|ecial instructions according to the blithely ironic excuses wake against the final theodoli +540|31|758|428.57|le furiously sly, pending requests. evenly even ideas nag. fluffily silent requests sleep ruthlessly about the even, pending instructions. carefully daring +541|42|2537|384.66|nt, ironic ideas. fluffily even foxes wake. slyly final ideas affix: blithely regular packages haggle furiously +541|72|1654|725.12|osits. blithely ironic platelets wake furiously. pending deposits hang blithely over the bold, ironic deposits. furiously regular deposits cajole quickly. +541|2|2179|498.65|e ruthlessly ironic realms! accounts impress against the express, pending warhorses. instructions cajole regularly special foxes. furiously e +541|32|9694|304.47|ly even pinto beans. carefully final packages according +542|43|9826|549.63| unusual, pending asymptotes engage blithely. blithely regular deposits sleep slyly. bold instructions sleep carefully regular accounts. furiously regular requests cajole carefully acr +542|73|3455|84.63|ronically pending packages. requests along the special, regular deposits integrate carefully +542|3|2453|998.83|waters cajole permanently. carefully regular packages use about the fluffily pending depths. special deposits across the fina +542|33|1707|215.38|ts. bold dolphins believe accounts. ironic accounts cajole along the furiously ironic foxes. blithely ironic instructions are. even requests are enticingly carefully ir +543|44|6362|815.64|ctions: deposits wake according to the slyly pending deposits. slyly quick reque +543|74|4511|255.21|outs. fluffily special accounts hang blithely around the furiously even deposits. id +543|4|2910|744.80| brave dolphins. silent waters mold about the slyly +543|34|210|515.32|y ironic Tiresias are against the even sheaves. express foxes lose fluffily after the fina +544|45|7143|761.96|thely regular packages haggle boldly slyly silent accounts. boldly regular accounts integrate; requests wake dependencies. careful decoys nag quickly evenly special +544|75|5555|188.10|out the carefully fluffy requests. accounts boost bold courts. furiously final instructions cajole. bold, idle deposits serve along the special accounts. furio +544|5|9843|804.77|wake furiously across the blithely ironic requests. fluffily final deposits boost carefully fluffily final instructions. carefully iron +544|35|7770|476.82|regular asymptotes are fluffily final ideas. slyly pending platelets above the pending, final requests boost furiously special deposits. pinto beans detect? theodolites sleep near the furiously e +545|46|7790|168.10| carefully along the fluffily ironic dependencies. carefully silent deposits are slyly furiously unusual requests. ironic, silent pinto beans +545|76|8547|258.26|ily regular accounts. furiously even pinto beans detect carefully. foxes affix furiously among the blithely r +545|6|7282|77.43|packages use-- ironic foxes sleep slyly with the unusual, regular requests. fluffily ironic platelets are carefully. ne +545|36|8100|873.65|fily fluffily bold foxes. slyly ironic sentiments haggle fluffily according to the requests. furiously ev +546|47|7624|218.77|y ironic accounts cajole slyly after the express ideas. carefully final packages are blithely. quic +546|77|4052|688.07| slyly ironic dolphins haggle fluffily against the slyly final instructions-- furiously special deposits are blithely. ironic packages use slyly around the special orbits. furiously pending package +546|7|2872|135.00|f the blithely even excuses: ironic packages nag blithely. furiously express dolphins could have to s +546|37|5233|498.13|al platelets. special asymptotes haggle at the iro +547|48|3093|654.58| courts. quickly ironic requests wake slyly slyly regular asymptotes. fu +547|78|6506|748.27|. carefully final requests wake slyly stealthy deposits-- slyly pending deposits cajole quickly packages. furiously permanent theodolites +547|8|3277|949.39|cial packages sublate slyly fluffily final pinto beans. bold, special pinto bean +547|38|8825|505.17|usly regular packages use blithely alongside of the packages. fluffily regular instructions haggle blithely furiously regular platelets. blithely bold pinto bean +548|49|4316|52.87|among the special deposits detect against the carefully unusual tithes. regular requests haggle carefully. slyly pending waters are slyly express theodolites. carefully final +548|79|8170|721.14| sleep. carefully ironic packages can serve furiously theodolites. requests detect. carefully final deposits wake slyly daringly even requests. bold, even foxes al +548|9|2997|533.03|p closely. quickly express tithes cajole carefully. blithely even theodolites after the deposits ha +548|39|9598|715.90|the pinto beans. slyly pending courts nag blithely along the deposits. quickly pe +549|50|8245|392.93|ut the slyly regular deposits hinder quickly abov +549|80|3834|801.88|slyly after the quickly pending foxes. regular fo +549|10|9550|745.05|ns. fluffily ironic notornis according to the fluffily final pinto beans nag along the quickly final requests. carefully regular foxes boost furiously above the carefully pending reques +549|40|2116|738.17|ully blithely regular escapades. special accounts along the pinto beans nag after the deposits. furiously re +550|51|4396|27.02|lites. blithely pending packages after the blithely regular accounts wake slyly among the quickly even courts. special multipliers haggle furiously above the +550|81|4204|796.93|usly alongside of the slyly even dependencies. ideas sleep furiously. silent, bold packages sleep slyly special requests. blithely ironic theodolites print quickly. pendin +550|11|2788|581.58|old, final deposits wake blithely. furiously regular foxes affix across the slyly ironic theodolites. furiously even pinto beans thrash +550|41|2559|546.99| quickly among the quickly final deposits; carefully even pinto beans wake. slyly final accounts affix carefully evenly ironic foxes; slyly pending reques +551|52|7451|668.71|pending courts wake among the packages. final, unu +551|82|13|344.90|ly. packages are carefully fluffily even ideas. fluffily bold packages boost carefully according to the quickly special deposits. blithely e +551|12|2409|762.51|special, regular somas use accounts. bold, special accounts sha +551|42|4208|497.42|e daring, regular notornis shall detect slyly above the +552|53|4641|766.10|the carefully special deposits detect along the furiously daring accounts. carefully ironic requests wake. blithely bold decoys breach slyly. blithely regular courts boost silently over th +552|83|7758|874.89|ter the slyly final ideas: final pinto beans wake furiously about the quickly bold packages. bold pinto beans use final pac +552|13|4729|131.71|may doze since the foxes. deposits wake blithely carefully final theodolites. pending f +552|43|2250|75.45| sleep quickly fluffily express deposits. carefully even asymptotes maintain blithely across the accounts. silent dependencies according +553|54|7153|627.16|regular dependencies impress about the silent deposits. deposits cajole furiously according to the furiously express dependencies. furiously special deposits haggle +553|84|7642|433.01|nt deposits. furiously final deposits boost slyly quickly express accounts. quickly silent warhorses sleep. slyly bold hockey players haggle alongside of the somas. slyly e +553|14|2160|55.80|es. even, unusual deposits wake. slyly regular foxes wake furiously. ironic, express gifts are. furiously special accounts use. carefully even pinto beans above the thinly special accounts gr +553|44|899|28.69|hely across the requests. bold foxes except the furiously express accounts cajole slyly ironic requests. unusual requests wake carefully packages. regular, +554|55|7964|962.46| the final instructions wake slyly quickly regular ideas. requests should boost slyly along the pending excuses. quickly expr +554|85|9175|273.07|le permanently after the carefully pending pains. unusual packages affix carefully quickly regular deposits. slyly ironic tithes ar +554|15|6477|337.22|luffily even dependencies sleep. bold platelets haggle. blithely final ideas after the slowly express ex +554|45|8097|478.01|dly final depths cajole slyly pending packages. carefully ironic foxes cajole carefully. fluffily bold asymptotes boost c +555|56|6725|201.62|ts. carefully silent requests wake Tiresias. fluffily ironic packages promise asymptotes. requests haggle furiously even instructions! blithely eve +555|86|3577|243.01|lithely. finally special platelets in place of the blithely even requests sleep carefully regular asymptotes. +555|16|543|556.05|l requests are. always regular foxes haggle around the slyly pending foxes. slow packages nag furiously. pending instructions impress slyly. carefully bold patterns cajole furiously +555|46|3648|8.35|lly. slyly silent accounts haggle enticing dependencies; unusual, ironic excuses haggle quickly carefully express deposits. regular, silent foxes are +556|57|2760|687.03|nd slyly ironic ideas. blithely regular packages cajole furiously along the dogged requests. slyly bo +556|87|1352|684.24|iously special dependencies. fluffily bold foxes about the furiously regular deposits use furiously final packages; furiously silen +556|17|3441|637.90|tions cajole carefully. stealthily special asymptotes use! accounts wake furiously ironic instructions. special Tiresias nag quickly. final deposits cajo +556|47|7464|136.36|manently close notornis integrate above the blithely ironic accounts. ironic theodolites affix even, even accounts. bold packages sleep +557|58|5418|309.06|theodolites are furiously gifts. packages are fluffily blithely regular asymptotes. enticingly ironic requests +557|88|106|823.28|ns. slyly final packages wake. carefully ironic packages affix. even, final accounts according to the fluffily final pinto beans use slyl +557|18|5051|775.92|fully bold ideas. quickly final deposits haggle. fu +557|48|8086|83.40|nal, final packages! pinto beans use carefully. u +558|59|3711|428.17|quests haggle furiously. enticingly blithe instructions wake among the unusual, ironic dependencies. platelets nag slyly-- carefully pending asymptotes across t +558|89|310|715.64|ackages. quickly regular accounts nag quickly enticingly regular packages. ideas haggle after the furiously regular packages. packages affix blithely alongside of the accounts. quickly final +558|19|5927|7.31| express accounts. fluffily final requests about the special ideas integrate carefully bold, bold deposits. furious +558|49|8641|315.89|ns was ironic accounts. express requests wake blithely against the furiously final platelets. furiously express instructions integrate fluffily among the regular pinto beans. re +559|60|550|699.67|lets. regular, bold courts according to the carefully final packag +559|90|8203|242.28|egular courts are fluffily after the blithely even pinto beans! qui +559|20|6928|340.89| furiously bold deposits about the slyly final packages nag blithely about the never ironic accounts. fluffily pending instructions might sleep slyly. ironic, even dolphins nag blithely special p +559|50|6714|223.01| across the furiously special dependencies. carefully silent packages use slyly carefully even accounts. quickly steal +560|61|1493|167.48|nstead of the slyly regular accounts. carefully ironic pinto beans are blithely caref +560|91|8132|934.03|y pending requests wake blithely ironic accounts. ironic, even packages sl +560|21|8024|132.55|ess, special accounts sleep furiously final instructions. quickly final pinto beans should have to wake fluffily alongside of the re +560|51|8116|295.06|s sleep slyly. regular decoys may nag. quickly regular ideas boost across the theodolites. regular, final accounts affix slyly. ruthless, regular accounts use blithely furiously unusual ac +561|62|5190|213.30|lithely regular ideas. blithely final foxes cajole carefully pending requests. doggedly final excuses are carefully. quickly ironic foxes among the fluffy, pending packages cajole +561|92|8491|809.80|es. always ironic foxes haggle furiously special packages. carefully ironic requests sleep about the +561|22|946|983.37|gainst the deposits. accounts along the quickly unusual packages are quickly at the furious +561|52|8347|215.37| the quickly special pinto beans. furiously regular platelets nag ironic deposits. furiously ironic platelets around the slyly bold gr +562|63|9575|536.03|ideas. blithely unusual pinto beans boost furiously around the +562|93|7480|200.88|o beans wake requests. regular ideas above the final pains are blithely ironic ideas. packages boost furiously even accounts. ironic requests sleep furiously against the deposits-- regul +562|23|503|787.23|y unusual asymptotes detect quickly ironic forges. final, bold requests about the blithely expres +562|53|2106|269.54|nusual braids wake even instructions. deposits nag past the slyly express platelets. final, regular accounts haggle quickl +563|64|6050|939.84|ously along the regular theodolites. permanently even platelets wake carefully. regular, ironic fo +563|94|8489|769.10|s doze carefully among the regular requests. carefully express ideas amo +563|24|6971|395.61|egular deposits sleep quickly quickly silent forges-- carefully regular accounts boost boldly. fluffily pending requests cajole foxes. ironic, +563|54|702|916.38|g to the theodolites. bold foxes since the furiously fluffy packages nag carefully doggedly p +564|65|2209|170.03|y blithely regular depths. even platelets integrate blithely express instructions. furiously express foxes according to the packages sl +564|95|4777|770.40|eodolites wake quickly above the blithely unusual requests. slyly final requests cajole final accounts. ruthl +564|25|9891|275.94|leep. quickly regular accounts cajole according to the excuses. regular, regular dolphins cajole quickly at the unusual platelets-- final deposits detect blithely after the quickly ironic th +564|55|3416|505.71|s; slyly silent packages detect finally at the furiously special +565|66|8193|236.04|lyly among the regular, bold theodolites? carefully permanent deposits u +565|96|7485|320.62|ect. quiet, silent ideas sleep above the slyly regular instructions. even, special escapades wake finally about +565|26|2032|239.91|bold, final requests. slyly ironic excuses use blithely final requests. carefully sly dugouts across the slyly ironic dependencies wake +565|56|4922|359.95|ans maintain carefully at the quickly regular requests. pending excuses above the notornis det +566|67|2700|10.95|lyly final warhorses along the ironic, even deposits use blithely across the quickly regular foxes. even foxes solve fur +566|97|9470|446.04|y special theodolites cajole. quickly ironic deposits cajole slyly according to the pending accounts. carefully special pinto beans x-ray! daringly +566|27|9181|239.59|nts. slyly final excuses sleep? quickly final theodolites sleep slyly above the furiously final packages. packages was quickly bold packages +566|57|7958|93.48|ully express deposits. silently express foxes after the b +567|68|4443|918.59|carefully ironic accounts against the fluffily unusual pinto beans sleep fluffily alongside of the quickly express accounts. blithely express theodo +567|98|728|355.77|arefully above the carefully pending ideas. ironic instructions cajole never. even courts sleep blithely about the blithely final accounts. furious +567|28|2824|550.31|y. thinly final dependencies cajole furiously through the furious pearls. furiously bold pinto beans wake. excuses are about the quic +567|58|7557|446.25|blithely across the slyly regular notornis. deposits nag slyly. unusual, bold accounts boost above the fi +568|69|8365|772.22|t the furiously special ideas. bold excuses sleep blithely final foxes. foxes breach slyly alongside of the instructi +568|99|1328|774.96|old packages cajole quickly against the slyly ironic ideas. carefully bold accounts wake slyly above the even asymptotes: unusual theodolites haggle carefully instead of the furiously final i +568|29|7616|896.48|eas. furiously final waters above the carefully final theodolites haggle dolphins. permanently ironic pinto beans nag. f +568|59|8820|288.69|n fluffily furiously special ideas. regular theodolites wake bl +569|70|2176|57.99|s haggle instructions. slyly ironic deposits are regular ideas +569|100|1731|818.87|ependencies wake above the bold accounts: blithely special accounts might unwind quickly-- carefully bold platelets cajole slyly regular instructions. ti +569|30|3123|687.93|ld courts. final packages against the furiously final foxes haggle thinly ironic, even realms. slyly brave packages are. regular, regular asymptotes affix q +569|60|1350|820.43|ccounts. slyly unusual dependencies are. quickly regular requests against the final packages haggle carefully according to the blithely +570|71|4292|824.59|s among the carefully final pinto beans sleep slyly even deposits: sly, regular foxes haggle along the silent fox +570|1|8347|918.39|olites. slowly ironic dependencies sleep regular packages. slyly even platelets sleep? regular pinto beans nag above the slyly +570|31|9367|2.91|special accounts are quickly. special accounts are carefully pending courts: unusual dolphins poach carefully requests. carefully even instructions will have to dazz +570|61|2521|185.34|deposits kindle quickly before the pinto beans; carefully ironic excuses sleep. special theodolite +571|72|4070|346.05|ests. furiously regular deposits alongside of the furiously ruthless packages cajole slyly close theodolites? express, ironic de +571|2|5772|123.84|yly special accounts. final, pending pinto beans wake even, final deposits. carefully ironi +571|32|425|652.21|ncies. boldly final pearls use even requests. deposits boost slyly foxes. quickly regular attainments are among the furiously even attainments. slyly unusual ideas cajole dependencies. deposits us +571|62|744|833.16|leep carefully; ironic excuses sleep above the carefully final packages: carefully special deposits against the slyly final requests use furiously packages. ironic, regular +572|73|6996|23.13|ffily even instructions boost blithely among the regular accounts. even accounts doubt fluffily along the special accounts. theodolites wake. final foxes mold frets +572|3|3266|469.64|to beans ought to cajole. slyly slow frays cajole furiously along the quickly bold accounts. bold packages nag slyly against the quickly bold +572|33|3303|274.33|kages. slyly stealthy ideas was quickly after the blithely ironic packages. blithely regular excuses along the express, express accounts aff +572|63|9986|516.84|he slyly pending packages. slyly regular ideas haggle e +573|74|242|355.79|ously final packages. slyly regular instructions across the regular asymptotes wake slyly for the quickly ironic instructions. ironic +573|4|2523|879.93|odolites across the slyly sly accounts hinder according +573|34|9444|815.95|ealms are carefully. quickly regular requests use blithely about the slyly final accounts. slyly pending deposits alongside of the requests nag ste +573|64|8904|581.58|final theodolites. quickly bold foxes are gifts. carefully unusual d +574|75|1556|547.45| accounts cajole about the pending requests. regular ideas +574|5|788|298.27| according to the carefully even deposits. ironic requests haggle after the ironic, unusual deposits: final, +574|35|261|170.18|eep slyly. pending platelets sleep carefully across the express frets-- slyly ironic hockey players cajole quickly; carefully bold foxes sleep regular courts. furiously ironic theodolites c +574|65|4930|364.61|g frets. slyly silent waters boost carefully within the silently even accounts. deposits integrate furiously carefully s +575|76|1828|398.02|et requests. quickly regular instructions will are slyly. furiously re +575|6|1960|466.03|uests. carefully ironic instructions among the even, even deposits wake furiously sly pinto beans. carefully even requests b +575|36|1841|603.75|print carefully among the silent instructions. carefully ironic theodolites dazzle blithely along the b +575|66|3177|505.49|lar accounts are blithely. quickly final pinto beans ea +576|77|3715|474.25|ly furiously express theodolites. furiously ironic theodolites sleep among the slyly special ideas. carefully regular packages use waters. +576|7|5860|839.14|equests x-ray slyly final packages. blithely even excuses after the eve +576|37|5711|675.89|e furiously according to the furiously even deposit +576|67|831|181.83|structions. bold deposits nod fluffily. regular theodolites alongside of the slyly final packages x-ray around the quickly bol +577|78|4109|224.49|. furiously ironic deposits boost blithely across the ruthless, even excuses. quickly pending deposits dazzle carefully according to the even deposits. carefully +577|8|4194|967.63| against the slyly regular deposits affix quickly around the furiously final ideas. quickly ironic requests use furiously about the unusual pinto beans. express, ironic depos +577|38|9072|373.75|ges detect quickly final requests. unusual pinto beans sleep furiously +577|68|1097|60.10|he packages. furiously regular packages haggle blithely. blithely final instructions must boost blithely along the fluffily pending de +578|79|5898|404.75|kages. Tiresias before the deposits nag slyly regular packages. asymptotes are blithely against the ironic accounts. unusual, final dependencies use fur +578|9|9747|647.67|al dependencies-- slow packages are furiously. slyly express packages ar +578|39|917|480.88|ronic deposits grow across the final packages. ironic forges about t +578|69|7215|433.02| wake slyly final instructions. blithely regular accounts affix blithely against the quietly quiet deposits. bold packages across t +579|80|1672|222.32|onic tithes are fluffily among the bold asymptotes. final accounts cajole against +579|10|1338|520.02|he furiously unusual requests. blithely final pinto beans boost slyly special, bold packages. permanent platelets across the final requests sleep across the pending, regular ideas. blith +579|40|4863|844.72|old asymptotes. pinto beans sleep according to the even ideas. excuses shall cajole. pending deposits accor +579|70|7945|603.25|nding orbits wake. carefully even packages sleep. furiously special accounts nag among the blithely final requests. special, ironic +580|81|8561|213.96|aggle carefully foxes. pending accounts against the slyly even accounts doubt carefully pen +580|11|3695|870.38|. slyly slow ideas breach carefully bold foxes. slyly express requests about the slyly unusual foxes cajole furiously slyly regular ideas. special, regular platelets after t +580|41|3173|157.90|ly along the fluffily bold deposits. blithe deposits across the deposits nag blithely slyly even foxes. special theodolites above the express deposits +580|71|6905|703.29|sly special dependencies? carefully special packages use blithely. ironic requests integrate furiously furiously ironic ideas. even, special waters c +581|82|2216|211.24|requests are about the even pinto beans-- furiously final instructions around the quickly even de +581|12|3322|97.56|ndencies against the fluffily even pinto beans nag slyly about the ironically bold requests. foxes wake enticingly sly packages. bold requ +581|42|9392|514.45|escapades wake above the deposits. boldly bold ideas above the blithely unusual requests cajole quietly against t +581|72|1259|214.60|ly during the furiously thin packages. pending, ironic instructions affix into the furiously express request +582|83|6910|537.94|r pains. quickly thin foxes cajole blithely. carefully bold requests are. carefully express packages wake +582|13|2236|452.85|the ironic packages detect furiously requests. final deposits dazzle blithely special accounts. ruthless, express ideas need to are into the blithely regular courts. slyl +582|43|5652|934.35|ackages. blithely silent accounts are quickly across the slyly final theodolites. f +582|73|5337|378.43|he slyly final dependencies boost slyly after the bli +583|84|4495|915.36|riously quickly unusual courts. final accounts wake quickly ironic theodolites: unusual escapades sleep always. regular deposits among the requests are above the re +583|14|1597|39.42|tes. stealthy deposits mold sometimes daring deposits. carefully ironic deposits cajole sly +583|44|4161|414.72| requests. pending, even packages detect slyly. ironic, even notornis along the even instructions run carefully deposits. quietly express foxes wake blithely ironic packages. fluffil +583|74|7685|322.01| accounts. ironic dinos cajole. quickly final excuses across the unusual accounts detect furiously before th +584|85|6170|622.99|refully ironic instructions. daringly bold instructions are furio +584|15|9080|201.23|gle carefully against the closely pending courts. regular packages haggle carefully furiously regular foxes. furiously regular deposits cajole stealthily. fluffily regular excuses use about the bol +584|45|6948|724.18|ular dolphins poach furiously slyly silent deposits. ironic foxes are. bold instructions should detect fluffily unusual theodolites. quickly ironic packages are blithely. carefully bold d +584|75|5132|678.32|pinto beans along the furiously even packages are carefully final, regular excuses. enticingly regular theodolites wake blithely-- even accounts +585|86|8051|3.66|t requests boost dependencies. blithely regular accounts affix around the doggedly bold foxes. bold, ironic requests according to the quickly ironic reque +585|16|1636|751.59|above the quickly ironic instructions; even requests about the carefully final deposits use ironic foxes. idly final pinto beans are. silent deposits alongside of the qui +585|46|7476|835.06|osits believe quickly furiously final theodolites. quickly bold requests use furiously after the final, pending accounts. furiously final packages caj +585|76|9020|100.92|l packages along the instructions boost above the carefully pending somas. deposits cajole. blithely final deposits nag blithely after +586|87|1195|86.90|ep fluffily. furiously regular deposits at the dolphins are +586|17|4391|252.38|ncies. blithely even requests sleep carefully unusua +586|47|818|226.34|bold dolphins engage silent dolphins. quickly even theodolites cajole furiously regular asymptotes. quickly final foxes sleep. sometimes regular requests according to the slyly expr +586|77|4787|104.34| after the silent deposits. carefully final notornis haggle slyl +587|88|9456|707.51| pinto beans boost. quickly final excuses hang never furiously express accounts. furiously fluffy deposits serve quickly ag +587|18|6442|114.68| ideas hinder carefully at the even, silent packages. requests wake furiously bold pinto beans. final deposits wake slyly slyly pending sauternes. theodolites haggle carefu +587|48|9575|607.93|affix instructions. carefully even requests haggle blithely about the foxes. +587|78|1825|932.70|equests are final packages. pending deposits cajole furi +588|89|1076|723.51|egular requests sleep quietly around the slyly even accounts. fluffily brave warhorses sleep. fluffily pending dugouts against the pending foxes should have to sno +588|19|1289|300.04|thely ironic platelets will are. blithely final packages about the regularly special excuses boost slyly carefully regular theodolites. regular theodolites around the +588|49|6497|54.95|lar attainments about the quickly even packages use alongside of the express packages. theodolites outside the quickly regular somas sleep clo +588|79|3566|752.13|lar platelets sleep against the regular requests. carefully even deposits above the accounts sleep excuses. quickly special foxes nag slyly; regular packages wake sly +589|90|7784|829.37|are? silent pains believe blithely carefully express accounts? pending requests among the carefully express packages sleep carefully blithely blithe instructions. slyly regular accounts affix +589|20|6579|273.02|r accounts cajole slyly about the furiously final theodolites. final, special theodolites affix busily against the blithely regul +589|50|379|391.03|s cajole furiously along the slyly regular platelets. bravely pending warthogs integrate blithely. regular instructions are +589|80|2591|743.00|e. slyly regular pinto beans are blithely above the carefully bold packages. multipliers detect furious +590|91|5959|318.50|e furiously. carefully regular instructions thrash. packages wake evenly bold deposits. carefully final excuses eat! slyly final epitaphs are carefully slyly unusual deposits. slyly even asymptotes +590|21|6924|569.59|sual instructions solve even excuses. carefully ironic requests use quickly carefully pending requests. fluffily ironic pains was carefully. fluffily pending pinto beans cajol +590|51|1804|791.72|le final requests. blithely bold requests across the fluffily express waters print fluffily alongside of the regular pearl +590|81|1278|812.56|ng, special accounts use. requests about the accounts wake carefully according to th +591|92|4047|416.60|instructions boost carefully regular, bold packages. bold accounts cajole carefully according t +591|22|3080|50.38|ns. carefully regular foxes integrate quickly. pinto beans affix quic +591|52|5168|815.93| express instructions use ironic, express deposits. regular, special deposits nag pending, special theodolites. furiously idle requests are pending dolphins. qui +591|82|4628|177.43|tructions integrate quickly slyly final deposits. fluffily unusual a +592|93|2676|359.36|ar requests about the express requests cajole slyly final ins +592|23|3489|59.40|ironic accounts sleep blithely slyly bold deposits? carefully pending requests at the ex +592|53|575|544.49|iously carefully even foxes. fluffily permanent accounts haggle furiously across the carefully even foxes. theodolites alongside of the fluffily pending requests sleep pinto beans. foxes +592|83|9716|625.85|after the ironic instructions maintain slyly above the furiously idle packages. slyly regular warthogs use. carefully bold foxes could cajole quickly across the quickly final foxes. a +593|94|960|397.68|ses cajole after the unusual, ironic requests. fluffily ironic requests use pending packages. blithely special deposits nag express acco +593|24|6161|729.56| foxes. ironic sentiments wake after the requests. slyly final dependencies nag even deposits. ironic platelets detect. special, unusual accounts haggle final deposits. un +593|54|1577|87.04|the bold, unusual foxes nag along the regular, express dinos. quickly regular requests serve quietly. fluffily final deposits wake blithe +593|84|3954|674.11|bold deposits x-ray blithely across the foxes. final packages cajol +594|95|1588|198.73|lar foxes. final accounts haggle against the carefully ironic asymptotes. ironic, ironic deposits sleep slyly accor +594|25|1290|616.98|furiously: blithely silent deposits around the even instructions affix after the slyly bold requests. blithely special theodolites +594|55|2209|44.24|. special accounts nag blithely above the ruthless pinto beans; boldly regular ac +594|85|5453|582.69|iously final deposits! quickly final packages detect furiously furiously bold deposits. blithely regular theodolites maintain always across the bravely bold frays. fin +595|96|5057|192.13|even excuses. slyly ironic depths nag along the deposits. slyly regular requests grow quickly. carefully pending dependencies haggle slyly around the carefully special deposits. final, sil +595|26|7752|536.14|ously brave accounts across the unusual deposits wake ironically ironic packages. carefully regular deposits after the quic +595|56|3290|170.95|ndencies. slowly regular accounts wake carefully across the furiously special dinos! furiously final requests wake blithely carefully final theodolites. carefully pending pinto beans are +595|86|3878|348.15| requests engage blithely final ideas. blithely regular ideas cajole slyly ironic dinos. doggedly bold packages +596|97|8343|485.43|packages was quickly after the regular deposits. furiously even ideas above the furiously ironic requests nag about the quickly bold pinto beans: platelets hang. quick +596|27|3658|892.44|al theodolites. slyly regular ideas sleep carefully slyly idle asymptotes. fluffily unusual ideas cajole blithely regular accounts. silent, regular instructions are f +596|57|6735|405.70|g! daring, unusual platelets nag carefully above the bold theodolites. blithely unusual platelets sleep. furiously pending p +596|87|2420|582.85|es. instructions wake slyly slyly regular packages; fluffily ironic instructions haggle blith +597|98|6577|940.11| alongside of the ironic requests. blithely quick excuses thrash carefully even requests. final requests nag doggedly regular realms. quickly bold theodolites +597|28|5327|317.55|e doggedly ironic requests. carefully even requests dete +597|58|7452|582.57|ly express foxes across the blithely express theodolites may sleep furio +597|88|1963|237.05|nto beans haggle. carefully permanent tithes according to the carefully express ideas wake carefully across the regular excuses. +598|99|6443|265.40| blithely ironic instructions. blithely close deposits among the carefully final dolphins detect slyly quietly express ideas. bold dependencies are alongside of +598|29|455|205.83|es. slow packages solve slyly carefully ironic theodolites. slyly r +598|59|666|86.81|posits wake. slyly express pinto beans sleep around the slyly express decoys! furiously quiet requests wake. even, unu +598|89|30|696.54|packages promise carefully carefully pending ideas. slyly bold instructions boost among the carefully regular theodolites. asymptotes between the furiously unusual packages cajole furiou +599|100|9558|668.96|g the final pinto beans. busily even deposits after the enticingly pending accounts boost furio +599|30|8285|613.32|ular warthogs boost carefully furiously permanent asymptotes. quickly unusual pac +599|60|9024|497.80| bold packages. slyly even foxes integrate fluffily slyly regular deposits. blithely iro +599|90|272|19.55|y ironic accounts sleep furiously pending notornis. slyly ironic Tiresias according to the fur +600|1|5324|97.67|en packages haggle according to the final, regular accounts. furiously ironic excuses wake quickly. even packages use according to the bold account +600|31|9175|380.31|r accounts sleep furiously during the even excuses. furi +600|61|5063|507.62|arefully final ideas affix blithely among the carefully silent requests. never even requests run carefully fluffily even foxes. fluffily regular accounts integrate blithe +600|91|7681|290.95|ole carefully express, express accounts. final patterns affix unusual, e +601|2|876|58.20| ironic requests. pinto beans poach carefully. fluffily special accounts cajole. unusual accounts sleep slyly around the carefully ironic instructions. final requests cajole blithely! furiously spe +601|33|1945|316.68|deposits are slyly across the carefully ruthless requests. slyly final deposits whithout the slyly final dependencies +601|64|6857|59.18|er the regular packages detect furiously according to the furiously bold dependencies. blithely bold theodolites wake furiously around the slyly unusual requests. bold theodoli +601|95|6255|881.46|use quickly against the ironic, regular requests? quickly ironic accounts hag +602|3|1645|598.72|oach slyly regular, ironic requests. fluffily regular foxes affix furiously ironic decoys. requests boost carefully according to the packages. slyl +602|34|9523|884.44|nal requests. furiously regular accounts about the slyly ironic dep +602|65|5184|761.04|dogged requests use fluffily carefully bold accounts. blithely unusual excuses detect. even +602|96|4265|683.18| through the quickly pending requests. furiously ironic packages aff +603|4|4867|869.51|ughout the final dolphins. bold dependencies sleep dependencies. +603|35|255|553.21|ns. slyly final packages wake. final packages affix blithely carefully regular deposits. finally regular deposits unwind blithely. always ironic requests upon the express, final a +603|66|655|324.09|ironic packages. pending pinto beans sleep slyly unusual +603|97|4383|722.12|ronic packages cajole furiously unusual theodolites. express, regular notornis affix blithely. fur +604|5|2194|980.46|eposits across the blithely even deposits use careful +604|36|2016|137.43|ould have to sleep carefully. dependencies detect quickly. furiously regular accounts detec +604|67|224|271.36|ly pending packages affix furiously after the furiously regular packages. special accoun +604|98|3706|543.43|ts. regular, final gifts mold across the quickly pending accounts. furiously qui +605|6|5187|772.87|ts will dazzle along the pinto beans. fluffily regular excuses among the permanently express dependencies are even deposits. requests sleep carefully above the carefully e +605|37|5475|707.31|oxes sleep despite the quickly silent instructions. furiously ironic asymptotes haggle. carefully bu +605|68|7391|850.50|l dependencies wake quickly silent packages. requests sleep blithely. busily bold deposits sleep fluffily across the regular packages. bold ideas run. re +605|99|115|849.26|sly ironic theodolites sleep carefully packages: furiously final courts haggle carefully regular courts. furiously pending deposits against the carefully sil +606|7|650|869.91|ly final accounts. even, ironic pinto beans haggle bli +606|38|5576|333.23|final, special dolphins cajole furiously along the slyly pending asymptotes. blithely even dolphins wake carefully? ironic, ironic accounts +606|69|27|484.44|equests integrate above the express packages. carefully unusual frays wake above the special requests. slyly regular deposits sleep. quickly pending platelets sleep quick +606|100|9523|234.30|ironic deposits haggle bold pinto beans. carefully even foxes cajole slyly furiously +607|8|2515|41.72|ccounts haggle slyly along the requests. carefully bold deposits integrate blithely across th +607|39|672|141.55|al accounts sleep above the furiously unusual deposits. special deposits doubt blithely. packages according to the asymptotes sleep quickly above the slyly final accounts. blithely unusu +607|70|560|578.11| are. even, ironic platelets wake across the blithely regular deposits. ironic, regular foxes detect fluffily: bold foxes affix fluffily ironic asymptotes! quickly express water +607|1|8453|212.76| lose quickly dugouts. special theodolites wake slyly slyly ironic ideas. slyly unusual instructions sleep fluffily ironic ideas; blithely pending asymptotes across the foxes sleep +608|9|9733|663.31|l, ironic dugouts nag carefully ironic, regular dependencies. caref +608|40|3974|560.02| pinto beans wake carefully after the deposits. bravely final accounts are slyly above the fluffily bold warthogs. quickl +608|71|6686|808.36|riously. special, final deposits according to the slyly close asymptotes breach slyly up the ideas. blithely regular dependencies affix carefully according to the slyly regular dolphins. ironic depe +608|2|1627|878.41|odolites cajole slyly outside the pending, even platelets. unusual accounts cajole. furiously express packages snooze fluffily. furiously final deposits use across the furiously regular accou +609|10|2599|326.99|gular deposits. even, regular theodolites haggle against the requests. slyly pending re +609|41|8000|500.20|ut the always final deposits. ironic asymptotes detect above the furiously ironic deposits. bold, ironic excuses impress slyly against +609|72|4133|508.60|blithely express deposits alongside of the slyly final packages wake ideas. furiously even patterns detect quickly theodolites. carefully regular pinto beans wake carefully dolphins +609|3|8133|818.54| even pinto beans. furiously express packages sleep blithely ironic, e +610|11|41|136.01|re furiously against the furiously ironic packages; furiously ironic deposits are carefully blithely b +610|42|8605|416.26|c ideas. slyly special packages haggle. carefully regular requests boost by the accounts. furiously special packages boost along the enticingly ironic asymptotes. slyly fluffy +610|73|6489|340.00|leep furiously fluffily final deposits! quickly ironic packages about the carefully pending deposits wake carefully above the careful hocke +610|4|731|372.29|x requests. always regular instructions sleep carefully regular packages. blithely express waters sleep about +611|12|1107|556.41|. special, silent requests detect! slyly even courts cajole carefully after the quickly final instructions. carefully ironic theodol +611|43|3903|58.01|packages up the slyly bold courts affix blithely after the pending warthogs. regular theodolites at the slyly final epitaphs sleep thinly about the furiously regu +611|74|939|213.90|d the furiously unusual pinto beans. carefully even packages cajole above the quickly regular foxes. pending, regular deposits haggle blithely express deposits. carefully even dep +611|5|2789|797.73|carefully pending accounts. slyly even ideas sleep sometimes across the blithely special platelets! ironic packages are carefully. requests cajole blithely above the daringly ironic asymp +612|13|8618|62.60|ions-- regular instructions wake furiously slyly final accounts. regular accounts kindle blithe +612|44|885|415.70|uffily express requests. deposits sleep fluffily. blithely ironic excuses boost permanent theodolites. even instr +612|75|7469|788.99| carefully special packages nag blithely bold accounts. carefully express ideas are slyly against the pending, bold packa +612|6|9998|888.14|refully final deposits sleep carefully final requests. slyly even platelets nag. +613|14|4545|92.95|ys. ironic theodolites nag blithely against the permanent theodolites. furiously even asymptotes cajole slyly. fu +613|45|2029|91.44| doubt slyly blithely special packages; carefully sly requests breach furiously. regular, blithe theodolites about the fl +613|76|6133|624.31|y ironic escapades. even, pending requests cajole unusual theodolites. never even accounts mold after the slyly special deposits-- quickly bold theodolites are blithe +613|7|5859|370.37|furiously sometimes even accounts. even, express dolphins sleep evenly. requests against the thin dolphins cajole quickly furiously ironic packages. furiously pend +614|15|9232|188.00|uriously. accounts haggle blithely on the furiously final excuses? unusual, fluffy accounts cajole quickly unusual, s +614|46|3057|50.01|kages sleep boldly! slyly regular courts sleep quietly final packages. ironic instructions use slyly slyly final pinto beans. final ideas nag quick +614|77|6915|630.03|ular ideas after the quickly careful packages haggle carefully bold platelets. unusual, unusual packages on the final, ironic deposits boost furio +614|8|5720|604.66| slyly special grouches. slow deposits sleep blithely. blithely express accounts eat blithely quickly ironic deposits. deposits detect. blithely ironic packages across the +615|16|1647|822.56|the accounts. carefully even foxes haggle enticingly. unusual, final platelets wake furiously accounts. idly regular instructions affix above the blithely r +615|47|2009|656.13|ironic ideas sleep among the slyly ironic escapades. ironic packages wake furious +615|78|5658|795.52|uests around the final requests boost around the ironic, final accounts. gifts solve always after the final pinto beans. ins +615|9|3056|781.48|nts use. carefully unusual instructions nag. platelets engage. care +616|17|6902|580.13|r requests wake carefully quickly stealthy accounts. bravely busy foxes hinder quickly. furiously unusual dugouts cajole slyly against the final, even +616|48|3865|196.04|s integrate quickly; grouches mold furiously; final dependencies sleep blithely. quickly regular tithes wake carefull +616|79|5497|338.88|gular deposits wake furiously at the regular escapades. furiously bold asymptotes detect slyly carefully special requests. quickly regular accounts according to the deposits na +616|10|4824|454.29| carefully regular instructions. carefully unusual instructions affix carefully inside the blit +617|18|9916|20.82|ctions. unusual, daring accounts are quickly regular ideas. carefully regular requests about the sentiments affix carefully after the special deposits. furiously final requests are furious +617|49|1573|605.84|as integrate final requests. blithely special deposits use carefully pending packages. accounts use carefully around the final escapades. s +617|80|6762|738.54|oldly final deposits nag fluffily regular foxes. gifts affix furiously. blithel +617|11|4954|233.72| pending packages-- fluffily final packages sleep final foxes. furiously sly accounts do cajole fluffily fluffily ironic r +618|19|2693|260.33|ven forges. slyly ironic accounts cajole above the slyly final platelets. furiously regular packages boost doggedly furiously pending packages. accounts detect. express accounts nag alongsi +618|50|4885|28.63| after the quickly bold platelets. slyly ironic accounts above the blithely bold accounts nod ironically along the even, regular requests. blithely even ideas wake never fluffi +618|81|7579|958.61|along the carefully express waters. ironic warhorses wake regular packages. furiously ex +618|12|5996|578.37|refully pending warthogs may doubt carefully since the permanently even instructions. final, even deposits caj +619|20|3727|620.28|tes. blithely silent instructions mold about the furiously ironic dolphins. ironic asymptote +619|51|8881|718.60|across the furiously bold platelets. blithely silent pinto beans sleep carefully ironic theodolites. pending, sly platelets ought to are idly unusual requests. even +619|82|3273|811.31|accounts affix. blithely regular requests are across the express, final requests. bold +619|13|2036|442.78|ffix. final ideas haggle slyly against the evenly bold dugouts. bravely +620|21|7932|378.52|uffily bold packages. pinto beans eat furiously! furiously final +620|52|580|425.02|he theodolites dazzle slyly above the furiously regular platelets. carefully permanent deposits cajole furiously even epitaphs. ironic, express instructions sleep quickl +620|83|2396|733.49|t the accounts nag blithely after the blithely regular platelets. regular, regular packages hinder furiously regular packages. even requests alongside of the ex +620|14|3254|300.32|es. slyly silent pinto beans alongside of the finally regular depen +621|22|9013|743.83|unts affix. final platelets wake. quick packages along the +621|53|1195|195.34|y regular accounts. ironic foxes are after the quickl +621|84|6309|538.72|y after the regular accounts. fluffily pending pinto beans detect +621|15|4897|431.91|ake atop the furiously silent dolphins. silent deposits nag idly above the regular accounts. special, regular deposits cajole blithely alon +622|23|6731|519.56| across the blithely bold accounts. carefully special accounts about the carefully final deposits sleep past the slyly regular instructions. deposits thrash quick +622|54|7330|88.10|te furiously alongside of the final accounts. quickly pending deposits are. blithe deposits sleep furiously. carefully pending accounts are. blithely bold a +622|85|994|452.40|etimes final sauternes boost blithely unusual packages. carefully special pai +622|16|2320|308.19|ainments poach blithely. carefully unusual excuses should have to boost above +623|24|3554|198.68|y ironic pinto beans cajole above the final, regular foxes. carefully ironic ideas sleep furiously quickly pending courts-- boldly bol +623|55|5369|795.82| final, fluffy requests cajole furiously since the close requests. carefully special escapades haggle bold +623|86|9819|860.99| fluffily pending theodolites. regular requests along the packages boost slyly pending asymptotes. pending excuses nag. deposits haggle carefully +623|17|2613|340.23|pinto beans boost quickly. slyly express foxes alongside of the slyly bold hockey players wake furiously bold requests. regular, +624|25|9320|251.88|, regular packages boost slyly regular deposits. quickly ironic platelets thrash. accounts against the ironic, final foxes use furiously in place of the bold, unusual instructions. +624|56|8439|785.46|nag according to the slyly final requests. blithely regular attainm +624|87|1763|570.87|nag quickly ironic pinto beans. ideas boost furiously across the carefully even foxes! blithely pending packages against the furiously even requests haggle deposits. bold packages boost blith +624|18|1218|414.89|fluffily regular multipliers. theodolites boost furiously. slyly express packages haggle slyly unusual Tiresias. slyly close deposits haggle quickly. silent deposits are quickly regular accounts. ca +625|26|8106|255.72|even, stealthy theodolites cajole carefully according to the blithely bold requests-- orbits sleep regularly quickly express accounts. express courts ar +625|57|7539|379.28|ronic requests promise quickly even ideas. pinto beans sleep beyond the doggedly special dependenc +625|88|8070|55.95|accounts. fluffily even deposits use whithout the carefully express ideas. even packages of the ca +625|19|2657|598.41|atelets near the slyly regular platelets boost ironic packages; blithely even foxes sleep. foxes use furiously bold p +626|27|6277|682.35|lly regular deposits cajole foxes. fluffily regular sa +626|58|2753|883.15|ly final requests. regularly unusual accounts ought to use carefully. fluffy, eve +626|89|7062|3.32|e furiously bold instructions detect carefully daringly busy pearls. foxes boost. pending deposi +626|20|3666|165.06|quickly special dugouts cajole slyly special escapades. blithely unusual dependencies believe blithely bold deposits. even, regular requests boost carefully fluffily pending requests. +627|28|7346|244.84|uriously unusual instructions cajole carefully until the carefully regular ideas. carefully final accounts instead of th +627|59|3952|306.49| packages integrate furiously to the slyly special warthogs. brave, regular escapades about the furiously ironic pinto beans integrate carefully pending accounts. slyly unu +627|90|1558|554.31|ly careful orbits integrate furiously alongside of the furiously final warthogs. packages affix quickly. fluffily +627|21|3919|778.11|ost. somas about the blithely express theodolites are fluffily fluffily regular instruc +628|29|6770|984.77|ly final platelets haggle quickly along the quickly silent ideas! fluffily regular accounts nag about the requests. bold ideas nag. regular deposits was about the even, even p +628|60|4240|751.95|ng to the regular dolphins. slowly pending ideas unwind ironically. express, ironic accounts doze ironic, silent theodolites. slyly final theodolites was carefully across the sly platel +628|91|5225|726.82|ong the doggedly ironic ideas sleep blithely slyly express requests. furiously pending packages cajole carefully speci +628|22|2169|957.76|kly unusual requests. quickly ironic packages use carefully. exp +629|30|6664|239.67|long the packages hinder along the even ideas. slyly even requests are. ideas use blithely. slyly bold instructions cajole carefully slyly bold ideas. +629|61|5892|319.73|l requests boost furiously inside the even, regular pinto beans-- final, bold requests across the carefully +629|92|2329|206.08| final deposits are along the regular requests. slyly regular instructions nag against the regular accounts +629|23|353|265.90|g to the accounts; slyly silent theodolites cajole above the deposits. closely regular accounts nag carefully-- quickly bold foxes cajole carefu +630|31|7299|612.42|use carefully slyly even foxes. furiously final foxes nag regularly. iro +630|62|396|400.07|ide of the regularly silent grouches wake after the furiously express accounts. silent asympto +630|93|5167|866.21|lly along the quickly express packages. fluffily bold pinto beans cajole furiously ev +630|24|3822|137.40|ts. slyly permanent accounts are ironic, even packages? furiously final packages detect. ideas are. fluffily regular excuses sleep furiously amon +631|32|8673|786.37|arefully bold, silent accounts. slyly final packages boost ironic, regular requests. accounts sleep blithely +631|63|9631|827.91|carefully ideas. slyly regular packages around the fluffily final ideas cajole alongside of the blithely ironic +631|94|1305|780.99|lyly regular realms. slyly special excuses upon the slyly regular dugouts sleep furiously around the ironic +631|25|5310|429.82|ions. packages against the slyly even accounts sleep quickly above the regular deposits. furiously special dinos sleep slyly across the +632|33|3291|427.86|theodolites use furiously about the sometimes special deposits. furiously bold foxes boost carefully. slyly regular platelets ca +632|64|1342|400.23|ously regular requests. even accounts cajole ironic, brave theodolites. bold requests impress slyly. blithely regular accounts haggle fluffily! i +632|95|7247|620.24|ckly bold pearls. furiously ironic pinto beans cajole regular, daring deposits. regular, special theodolites cajole furiously across the slyly ironic asymptotes. +632|26|2010|891.25|sts against the blithely permanent instructions use slyly final requests. deposits integrat +633|34|5953|319.89|eposits wake furiously along the pending, regular accounts. slyly even packages haggle final deposits. carefully final dolphins use furiously about the quickly +633|65|7862|5.50|wake fluffily even dolphins. furiously thin pinto beans boost quickly according to the regular requests. regular foxes detect carefully blithely pending accounts. final accounts hinder about th +633|96|143|728.43|ilent, even dependencies. accounts sleep furiously against the special Tiresias? carefully final packages wake slyly. even, regular braids wake qui +633|27|2249|190.40|iously. regular gifts are among the quiet asymptotes. ironically express instructions cajole across the furiously regular packages. carefully final depende +634|35|7521|499.40|he quickly even accounts. quickly final platelets use slyly quickly ironic accounts. foxes are furiously carefully +634|66|3738|60.98|ons mold pending, daring sheaves. carefully regular accounts lose quickly after the blithely regular accounts. furiously bold foxes boost. packages cajole quickly. fu +634|97|2405|174.74|uests above the ironic asymptotes sleep carefully quickly pending dolphins. blithely special excuses against the instructions maintain blithely final deposits: blit +634|28|221|998.81|es doggedly even accounts. pinto beans about the furiously regular packages are slyly carefully unusual dependencies. even ideas snooze sl +635|36|3254|976.72|instructions. blithely enticing packages after the fl +635|67|9989|330.43|egular packages affix fluffily furiously bold packages! express requests boost. quickly special foxes use carefully; slyly silent +635|98|1326|364.51|ironic requests above the regular deposits are at the pending packages. regular theodolites haggle along the quickly blithe requests. furiously ironic excuses are pinto beans. fu +635|29|5181|698.14|ve the evenly final orbits. pending accounts affix. final, regular ideas boost above the blithely even pa +636|37|9395|456.89|ular, final foxes print slyly quickly final accounts. careful theodolite +636|68|2151|840.53|furiously even ideas haggle about the blithely even ac +636|99|7161|125.92|lly slyly ironic instructions. slyly enticing requests haggle furiously among the +636|30|6516|675.24| regular packages. carefully bold dependencies are according to the furi +637|38|3173|224.93|ess, bold requests wake blithely quickly final hockey players. slyly regular requests affix blithely furiously express foxes. flu +637|69|8230|373.24|zzle blithely about the furiously final foxes. pen +637|100|2879|561.80|lyly across the carefully regular foxes. regular accou +637|31|4859|857.78|d platelets. quickly pending ideas according to the slyly regular accounts use furiously after the idea +638|39|3447|189.73|dolites sleep slyly unusual theodolites. slyly even +638|70|4080|295.67|ges; slyly ironic escapades use blithely. silent requests are. pending accounts sleep slyly. slyly unusual packages integrate after the quickly regular excuses-- fin +638|1|8889|561.41|ously pending accounts. slyly ironic ideas sleep furiously after the furiously bold frays. furiously regular theodolites run carefully +638|32|7359|308.35| ironic requests. quickly ironic platelets haggle furiously. ca +639|40|4237|898.76|d closely final braids. even tithes haggle final packages. p +639|71|7011|645.13|ependencies nag slyly. carefully special packages across the ideas nag carefully about the carefully ironic accounts. ironic packages sleep furiously around the sil +639|2|7349|679.39|uld have to run furiously special accounts. blithely final foxes are slyly. blithely unusual patterns use boldly. regular, even pinto beans affix slyly furiously +639|33|2334|79.92| packages use slyly about the ironic deposits. slyly regular excuses around the special accounts wake blithely +640|41|6547|766.26|as detect even dinos. bold, bold requests haggle slyly. quickly express accounts after the deposits sleep blithely final dependencies. regular, pending re +640|72|8428|535.48|ular deposits. hockey players cajole furiously even theodolites. furiously final dolphins among the ideas solve furiously after the regular ideas. even packages believe. blithely final theodo +640|3|9574|9.86|ickly idle accounts. carefully unusual accounts lose quickly along the s +640|34|670|124.86|usly express asymptotes wake blithely slyly busy dolphins. silent instructions +641|42|488|934.55|al ideas detect blithely slyly busy theodolites. furiously even pinto beans nag furiously along the unusual accounts. slyly special instr +641|73|7434|811.54| pearls. final, dogged dependencies against the furiously ironic pinto beans might affix blithely idle notornis. pending theodolites unwind furiously. slyly ironic requests above the bold, unusual +641|4|1432|253.67|s about the furiously unusual pains cajole blithely after the theodolites. slyly special requests sleep: regular foxes are slyly express +641|35|7740|916.27|y bold packages boost alongside of the pending courts. silently unusual excuses eat. bold accounts cajole after the furiously express packages. blithely unusual pi +642|43|4535|190.27|ve the final ideas! furiously regular deposits nag. carefully final asymptotes haggle furiously quick, bold requests. blithely express escapades haggle. even excuses a +642|74|3571|235.12|odolites are above the slyly ironic requests: blithely blithe hockey players affix blithely special deposits. slyly silent pinto beans haggle thinly against the +642|5|8683|864.26|unusual pinto beans boost regular requests. quickly ironic dinos cajole even, pending requests. furiously eve +642|36|4027|285.86|y final deposits cajole carefully. furiously final packages cajole ironically above the unusual, regular excuses. slyly pending packages wake after the requests. +643|44|3020|500.94| sleep carefully according to the carefully bold braids. silent dependencies wake after the slyly regular acco +643|75|9303|842.25|efully enticing packages above the slyly final requests sleep ironic foxes. slyly silent theodolites cajole under the furiously permanent packages. furiously even pinto beans haggle quickly +643|6|3768|927.20|ets doubt. carefully even instructions along the deposits wake thin, even pinto beans. furiously pendi +643|37|7018|99.16|s deposits nod quickly carefully final packages. regular courts sleep quickly furiously bold deposits. quickly ironic braids above the finally bold pinto beans cajole +644|45|4595|550.19| alongside of the final, ironic instructions nag furiously quickly regular epitaphs. final re +644|76|4676|400.51|ly special requests wake alongside of the carefully bold instructions. even accounts believe fur +644|7|9654|320.99|ironic requests hinder fluffy platelets. fluffily even accounts serve quickly along the express accounts. final, busy instructions use fluffily pending ideas. bold, express deposits cajole slyly +644|38|7708|566.36|ound the accounts impress toward the quickly special packages. regular warthogs sleep. final packages wake blithely. special, clo +645|46|4248|586.90|carefully pending accounts. slyly enticing deposits sleep across the ironic somas-- quickly regul +645|77|9482|64.12|uriously. final warhorses boost above the slyly unusual packages. furiously even instructions affix busily after the furiously even +645|8|4002|2.57|ickly blithely careful deposits. requests cajole blithely? regular deposits against the silent, bold asymptotes wake always regular packages. regular deposits kindle fluffily! u +645|39|2604|544.64|sits. requests sleep fluffily according to the quickly pending packages. furiously regular pi +646|47|3716|166.92|nto beans cajole final accounts. carefully special depths nag along the carefully bold instructions. final pinto beans cajole. blithely final pinto be +646|78|4626|457.49|y regular accounts cajole carefully; blithely bold braids above the regula +646|9|3818|840.35|totes haggle. blithely bold instructions wake furiously according to the quickly bold foxes. slyly bold instructions haggle. pending ideas cajole deposits. carefully special sheave +646|40|9463|10.25| ideas. furiously final theodolites affix quickly along the slyly even sentiments-- carefully special acc +647|48|7294|640.28|ss theodolites. slyly careful theodolites haggle among the final, final excuses. unusual requests across the final instructions cajole regular, final dolphins. accounts haggle bl +647|79|7431|167.74|gle slyly pending realms-- pending asymptotes are blithely; slyly special multipliers along the carefully special accoun +647|10|9636|334.66|e express excuses. furiously pending packages sleep ironic epitaphs. silent deposits across the regular deposits haggle quickly above the packages. blithely even theodolites sleep furiously blithe +647|41|6712|465.94|uickly fluffy deposits. instructions detect according to the furiously regular inst +648|49|5845|140.98| instructions haggle carefully blithely special escapades. +648|80|3238|69.51| blithely around the bold accounts. regular ideas can wake fluffily. daringly even packages grow furiously along +648|11|9122|747.33|uriously furiously sly foxes. fluffily ironic packages cajole across the quickly silent dependencies. sl +648|42|5563|152.51|ing, bold dependencies lose blithely alongside of the +649|50|339|980.11|s. final, ruthless pinto beans cajole. slyly unusual ideas wake carefully unusual pearls. carefully final instructions nod slyly slyly regular packages. slyly dogged packages ar +649|81|2242|353.22|ss courts are idly along the furiously final packages. ironic, thin deposits affix! carefully special dolphins are around the express pinto beans. blithely regular instructions against the ca +649|12|9775|715.51|lites. furiously silent foxes along the ironic dependencies integrate care +649|43|1392|741.53|ing to the silent, ironic requests. final, even packages haggle carefully epitaphs. packages around the unusual pinto beans cajole across the fluffily regular somas. quickly express co +650|51|6341|438.35|nding, regular accounts around the pending pinto beans solve slyly ironic deposits. silent, special foxes alongside of the furiously bold accounts nag carefully regu +650|82|1544|940.71|quests are ironic, pending courts. furiously bold accounts use fluffily after the fluffily pending deposits. fluffily express ideas wake fluffily. slyly +650|13|6065|472.77|hins wake carefully express instructions. blithely special the +650|44|8443|43.93|accounts solve above the regular, ironic instructions. quickly pending instructions haggle above the quickly final instructions. even, regular theodolites sleep carefully +651|52|3543|368.92|lites nag ironic packages. ideas nag at the quickly pending sheaves. packages use carefully. bold pinto beans wake furiously after the ironic, ironic pa +651|83|7711|796.30| regular ideas after the furiously even asymptotes affix according to the even asymptotes; deposits affix furiously quiet foxes. furiously silent accounts are slowly according +651|14|7243|980.82|nder carefully. quickly ironic ideas use carefully regular deposits. furiously pending requests alongside of the bold accounts boost carefully regular deposits. packages +651|45|5776|242.45|ccounts are blithely idle packages. slowly final theodolites cajole. packages sleep. +652|53|7436|85.48| across the pending packages. even asymptotes sleep carefully about the ironic, bold packages: even deposit +652|84|694|342.92|furiously. blithely regular patterns cajole quickly regular, express dolphins. silent p +652|15|9114|440.26|ilent requests! furiously final requests cajole furiously furiously regular deposits. blithely ironic packages at the slyly final requests sleep slyly dep +652|46|7050|978.70|he blithely final deposits. pending deposits wake quickly: carefully reg +653|54|2203|562.23|ges. unusual, regular foxes are furiously after the carefully ironic instructions. slyly regular accounts about the quickly special ideas cajole blithely pend +653|85|797|989.93|furiously daring theodolites. slyly final accounts run carefully regular, even excuses. dol +653|16|1770|548.78|ependencies nag. regular excuses sleep quietly. blithely even tithes alongside of the regular, regular deposits are quickly unusual braids. carefully unusual dependencies in +653|47|6254|759.41|se. regular, special packages sleep carefully. slyly ironic sauternes around the foxes promise even dolphins. asymptotes wa +654|55|9438|306.64|carefully pending requests haggle along the foxes: furiously final packages are furiou +654|86|7928|83.54|dependencies above the quickly even pinto beans are slyly along the carefully pending ideas. special platelets along the pending, final dependencies haggle after the express accounts. furiously thi +654|17|2899|689.85|n, special requests according to the excuses use carefully quickly unusual packages; excuses haggle besides the foxes +654|48|5173|110.08|ajole carefully carefully regular deposits. even, final instructions cajole quickly about the slowly final depths. regular deposits integrate quickly alongside of the quickly ironic packages. +655|56|9772|279.24|ounts. furiously unusual asymptotes wake alongside of the carefully close instructions. final accounts cajole slowly about the express deposits. express, ironic instructions nag carefully furio +655|87|2749|84.00| accounts. bold packages cajole? fluffily final excuses wa +655|18|7989|423.06| wake silently. ideas cajole fluffily ironic, regular dependenc +655|49|9816|731.03|s-- fluffily pending asymptotes after the quietly special accounts should haggl +656|57|4347|940.05|uffily bold depths haggle quickly. carefully ironic dependencies cajole. +656|88|7587|309.07|t the blithely express platelets. even theodolites wake: furiously even deposits haggle carefully. ironic pinto beans engage carefull +656|19|5044|18.36|ts wake furiously against the furiously regular platelets. fluffily even epitaphs are furiou +656|50|1156|202.08|ular requests. packages about the blithely regular i +657|58|8394|984.63| carefully unusual platelets. ironic somas cajole ironically; fin +657|89|5428|417.71|nal foxes cajole blithely silently ironic pinto bea +657|20|6487|662.37|ymptotes was quickly at the ironic requests. pending patterns a +657|51|8505|668.46|ng the quickly ironic ideas. blithely special warthogs boost furiously slyly regular excuses. blithel +658|59|9224|198.60| special deposits haggle above the final foxes. close, final packages maintain furiously. slowly pending deposits believe thinly. furiously bold accounts among the theodolites nag +658|90|9176|516.45|ckages-- furiously final accounts boost carefully alongside of the ironic deposits. blithely bold pinto beans was carefully quickly final a +658|21|9641|775.03| final dolphins. quickly final excuses use. regular, even packages boost furiously among the fluffily ironic dependencies. carefully +658|52|9696|92.27|inst the carefully special deposits snooze against the even accounts. carefully even courts boost furiously regular requests. regular theodolites are. quickly express account +659|60|4689|661.65|requests. furiously ironic instructions integrate blithely unusual, ironic accounts. slyly bold forges haggle slyly; +659|91|2478|678.41|, final foxes haggle furiously asymptotes. slyly pending packages besides the unusual ideas haggle furiously furiously fluffy dependencies. pinto beans wake furiously within the +659|22|9028|649.03|le across the even instructions. slyly regular deposits hag +659|53|2479|384.95|uickly sly dependencies. accounts sleep along the blithely ironic platelets. busy foxes use carefully blithely ironic platelets. pinto beans within the pending, final cour +660|61|4004|479.96| packages. slyly even packages are blithely even r +660|92|4775|20.79|e special, final requests? slyly sly requests among the bold foxes are according to the regular dependencies. c +660|23|4564|93.96|sly quickly bold pinto beans. slyly ironic dependencies snooze blithely. slyly ironic deposits sleep. furiously regular asymptotes sleep slyly above the regular dolphins. carefully even +660|54|3457|91.73| the even deposits! careful requests nag against the blithely +661|62|3362|508.61|r, even accounts cajole pending deposits. blithe, unusual instructions are blithely. silent theodolites dazzle slyly. carefu +661|93|3101|894.22|fully. blithely silent instructions wake slyly after the foxes. quickly regular accounts impress about the ironic, ironic frays. deposits affix slyly alongside of the packages. final, r +661|24|1354|290.11|eodolites unwind carefully about the special packages. final accounts nag. quickly bold requests integrate blithely final as +661|55|3582|919.68|gular instructions wake fluffily unusual accounts. unusual theodolites cajole furiously against the iron +662|63|7854|614.36|es. slyly final deposits sleep according to the bold, pending requests. furiously even pinto beans cajole. carefully slow requests use slyly. furiously ironic accounts use slyly. slyly ironic +662|94|1051|26.72| carefully unusual requests. special, final excuses cajole against the fluffily fluffy instructions. furiously regular accounts affix slyly! blithe de +662|25|3739|862.07|ggle quickly final packages. furiously regular requests haggle according to the pending, bold dependencies. express, regular deposits cajole carefully. packages alongside of the s +662|56|3502|402.51|blithely silent instructions. slyly regular packages breach slyly. quickly regular packages sleep furiously. regular, even accounts s +663|64|2691|944.77|lyly after the packages. furiously pending foxes should sleep permanent courts. requests after the carefully pending requests cajole fluffily a +663|95|5853|707.74|blithely furiously bold requests. quickly ironic depths across the quickly unusual packages haggle along the carefully regular decoys. evenly regular theodolites haggle +663|26|9390|954.26|use fluffily. pending ideas nag. regular accounts poach. blithely ironic theodolites might print. final pinto beans cajole furiously alongside of the slyly special courts. e +663|57|5985|332.39| blithely even requests. blithely regular platelets boost quickly ironic packages. furiously ironic +664|65|6891|220.61|r requests kindle carefully about the fluffily silent packages. requests poach quickly regular platelets. busy, final asymptotes detect amon +664|96|6156|801.81|ily ironic packages sleep even accounts. slyly final deposits promise furiously final dolphins: carefully pending deposits +664|27|7402|715.79|gainst the carefully ironic ideas. packages cajole among the furiously ironic deposits. silent deposits wake quickly: +664|58|6104|546.16|es: ironic deposits wake quickly along the quickly unusual courts. quickly express theodolites haggle closely. carefully even acco +665|66|115|592.51|sts. carefully ironic deposits sleep idly carefully even packages. ironic, even dolphins against the pending, regular theodolites use blithely +665|97|8218|425.20|foxes are along the regular theodolites. slyly final accounts alongside of the pinto +665|28|3362|698.24|ly unusual accounts haggle above the even instructions. requests cajole about the fluffily silent pearls. +665|59|1234|130.02|ages boost carefully. quickly pending foxes nag stealthily foxes? final, unusual accounts boost slyly final accounts. pac +666|67|9860|596.08|efully bold foxes are furiously. bold packages haggle blithely along the fu +666|98|8372|451.56|he blithely bold requests. regular, blithe deposits use. unusual deposits sleep furiously slyly ironic packages. furiously regular braids along the final, fina +666|29|1000|96.36|h slyly among the quickly even epitaphs. regular, even dependencies nod. carefully silent foxes cajole. final requests unwind carefully carefully even deposits. ironic acc +666|60|6150|361.35|g, special theodolites nod blithely even pinto beans: carefully pending deposits cajole. quickly regular requests haggle carefully busy accounts. carefully unusual packages abov +667|68|9129|490.65|ges haggle. stealthy accounts alongside of the quickly ironic d +667|99|6304|830.76|es at the carefully pending deposits are silent a +667|30|1626|723.63|ugouts cajole carefully. even packages about the fluffily unusual orbits haggle blithely above the bold packages. express courts boost furiously silent braids. even pac +667|61|1766|324.09|ng accounts after the unusual platelets lose across the ironic, ironic deposits. slyly regular requests wake over the blithely special theodolites. unusual ideas sleep according +668|69|4931|620.24|ole evenly about the regular ideas; unusual theodolites haggle slyly furiously unusual requests-- pending dolphins nag carefully final theodolites. blithely final escapades about the furiou +668|100|3214|911.61|ents could cajole fluffily ironic accounts. regular requests use slyly regular deposits; finally silent excuses affix ac +668|31|8173|843.77| ironic accounts are along the blithely blithe requests. ironic, final platelets haggle ironic, unusual foxes. ir +668|62|6276|601.16|iously regular packages! carefully ironic platelets sleep fluffily. fluffily silent instructions about the furi +669|70|6768|54.05|ccounts. quickly even accounts about the slyly express courts are slyly against the requests. quickly regular foxes sleep slyly ideas. slyly even accounts wake furiously furiously enticing dep +669|1|7485|515.96|arefully. blithely silent accounts thrash carefully special requests. blithely special accounts +669|32|7163|668.96|s. even foxes wake blithely excuses. express orbits wake across the blithely ironic excuses. ironic, special packages against the doggedly pending excuses are fur +669|63|8417|564.66|nts solve blithely. furiously blithe deposits use carefully instead of the furiously ironic packages. fluffily bold instructions according to th +670|71|6190|937.71|al theodolites. unusual, even excuses wake blithely. furiously express requests affix after the final accounts. regular, unusual realms wake ironic, bold accounts. even asymptotes +670|2|9088|886.77|uickly across the blithe pinto beans. fluffily regular escapades sleep blithely according to the slyly regular packages. slyly special packages use care +670|33|7960|917.08| instructions. furiously bold pinto beans haggle among the slyly regular deposits. ideas haggle. ironic, regular instruct +670|64|5344|969.21|ly patterns! fluffily bold instructions haggle. pains +671|72|2692|924.19|ges nag across the slyly even pinto beans. requests boost final dolphins. instructions wake +671|3|6874|532.06|packages believe carefully. final deposits use fluffily deposits. silent instructions sleep toward the carefully bold accounts. ironic, regular patterns sleep. slyly ironic accounts hang fl +671|34|460|482.64|nal foxes; theodolites cajole furiously. dogged, even requests nag furiously! quickly special platelets a +671|65|8576|55.41|ecial deposits use blithely pending requests. carefully final waters cajole above the regular packages. enticing foxes wake quickly. finally bold deposits wake furiou +672|73|73|464.89|lly final packages sleep carefully silent accounts. sly hockey players are against the pending ideas +672|4|4345|348.56|ording to the carefully bold pinto beans. enticing, unusual sentim +672|35|7170|270.96|e excuses; final patterns sleep furiously slyly express dependencies. blithely ironic requests across the ironic courts haggle slyly along the ex +672|66|4968|787.19|efully regular pinto beans. slyly ironic dependencies boost fluffily ideas. quickly even deposits boost. furiously express +673|74|9038|618.93|ackages wake carefully against the finally final requests. carefully even requests maintain carefully along +673|5|8210|991.12|ounts boost carefully after the even, ironic deposits. fluffily regular ideas sleep slyly reque +673|36|8205|545.53|eans are. carefully even foxes after the carefully final accounts detect furiously around the even foxes. quickly unusual epitaphs nag blithely between the regular id +673|67|3078|990.16|riously around the regular theodolites. even, special warhorses use slyly. carefully even foxes kindle quickly bold platelets. regular packages across the quickly even foxes det +674|75|9757|418.19|y bold, pending asymptotes. quickly final accounts cajole furiously ironic deposits. express packages across the bli +674|6|2476|726.52|e furiously even dolphins use across the final, bold deposits. regular pinto beans doubt thinly furiously pending dolphins. theodolites cajole slyly. blithely special deposits are furiously. s +674|37|3092|22.16|r dolphins according to the courts boost fluffily final deposits. ironic accounts along the final, final packages boost furiously furiou +674|68|9894|122.22|deas sleep slyly about the foxes. regular deposits nag fluffily against the carefully ironic theodolites. furiously ironic packages wake +675|76|598|484.56|thless realms above the blithely regular dependencies use blithely furiously special deposits. quickly special dependencies against the ironic theodolites integrate slyly express instru +675|7|4272|341.98|e bold pinto beans. requests doze special packages? regular, even dolphins are ironic pinto beans. fluffily express foxes thrash unusual, unusual accounts. platelets use blith +675|38|4618|666.67|ly. carefully pending requests nag about the slyly express instructions! slyly even requests integrate slyly! pending, regular frays according to the quickly regular requests are quickly blithely bo +675|69|1044|11.44|final requests. blithely ironic packages haggle furiously. blithely regular asymptotes use slyly. deposits mold slyly. fluffily bold pinto beans aga +676|77|4834|772.80|hins. quickly silent deposits alongside of the ironic accounts integrate above the blithely ironic deposits. final packages are. silent pinto beans doze quickly. fluf +676|8|5671|552.04| haggle furiously blithely regular platelets. final notor +676|39|1703|532.54|counts shall have to sleep furiously along the slyly silent requests. asymptotes must have to lo +676|70|9436|569.00|ly furious instructions. quickly final theodolites about the furiously even foxes will have to unwind carefully slyly ironic foxes. foxes sleep along the unusual, regular accounts. final, ex +677|78|685|974.88|quests. furiously ironic pinto beans are; quickly regular instructions are bravely against the +677|9|5342|307.70|special excuses. enticing, regular dolphins must sleep according to the carefully ironic pinto beans. blithely regular sauternes sleep. slyly final depths wake fluffily around the blithely +677|40|3682|882.49|. slyly regular pinto beans cajole quickly among the express packages. furiously regular pinto beans integrate slyly +677|71|5976|895.82|encies use quietly along the ruthlessly final platelets. ideas after the regular theodolites detect against the blithely even deposits. quickly bold ideas w +678|79|8623|206.81|nusual packages. slyly regular packages must have to c +678|10|9099|574.83|s. regular requests play slyly according to the ironic packages. pinto beans are blithely furiously ironic instructions. carefully final deposits haggle across the ironic asymptotes +678|41|9071|62.32|ajole. special requests nag carefully after the furiously regular ideas. ironic, regular accounts a +678|72|7607|650.12|e quickly bold pinto beans. carefully even sentimen +679|80|6574|666.05|to beans cajole. express, final packages integrate furiously even, ironic epitaphs. fluffily regular +679|11|1307|652.98|ithely silent ideas haggle slyly slyly regular instructions. slyly special packages must affix carefully blithely bold deposits! packages sleep alo +679|42|3654|823.95|ggle slyly. slyly final accounts wake furiously blithely unusual orbits. carefully silent dependencies are express accounts. slow, final pa +679|73|6899|177.54|y alongside of the slyly special accounts! final requests haggle always. furiously even deposits cajole blithely special foxes. unusual excuses cajole furiously blithely bold ideas! never +680|81|8945|98.58|ests sleep. quickly even deposits nag slyly. final accounts wake regular courts. blithely express ideas among th +680|12|8530|702.98|brave packages cajole slyly excuses. accounts are pending accounts. silent dolphins cajole. carefully stealthy ideas affix. warthogs wake after the blithely unusual packages. carefull +680|43|1158|2.78|ages. regular accounts are. finally unusual somas above the theodolites nag carefully asymptotes. ideas +680|74|212|16.57|ess deposits boost furiously ironic, express packages. furiously ironic dolphins wake. pending, final excuses sublate above the quickly thin deposi +681|82|7314|16.08|xes. ironic, express accounts integrate quickly against the requests. even, final instructions sleep along the blithely dar +681|13|6359|709.11| the furiously regular instructions. quickly bold pinto beans breach waters. quickly unusual deposits nag special, ironic braids. accounts lose. furiously regular accounts are among the careful +681|44|3473|24.47|ly slyly stealthy accounts. blithely unusual pinto beans wake carefully after the even, regular packages. final requests afte +681|75|3202|982.97|int above the carefully pending deposits: fluffily pending requests sleep unusual, ironic theodolites +682|83|6146|425.51|l depths against the express, even asymptotes hang alongside of the blithely even requests +682|14|590|900.63|lites affix against the carefully ironic requests: special pearls are quickly final pinto beans. careful requests nag around the furiously regular accounts. carefully bold accounts alon +682|45|5218|137.75|e regularly. ironically daring instructions nag slyly against the quickly express theodolites; dolphins sleep carefully alongside of the furiously even theodolites. furio +682|76|5161|745.07|ly ironic, final instructions. deposits haggle across the enticingly special instructions. fluffily final courts snooze regular p +683|84|8854|44.46|ngside of the even instructions. even instructions wake along the carefully pending ideas. blithely even packages sleep. packages integrate blithel +683|15|3859|182.88|quickly close ideas. courts about the evenly special instructions grow furiously ab +683|46|1051|917.83|onic epitaphs at the quickly express packages use furiously ironic dependencie +683|77|5735|493.37|ag along the pinto beans. furiously final deposits nag carefully slyly regular instructions. blithely ironic depos +684|85|1122|509.35|, even packages use furiously slyly ironic escapades. bold packages use among the permanently final requests. express platelets may haggle along the quic +684|16|2684|368.35| unwind carefully according to the furiously ruthless dolphins. furious foxes above the fluffily stealthy dependencies nag alongside of the +684|47|8949|296.08|inments. furiously ironic packages wake. furiously ironic packages sleep +684|78|3665|393.48|ely final theodolites cajole slyly ruthlessly final ideas. instructions sleep blithely slyly bold requests. carefully regular platelets are furi +685|86|8614|983.70| excuses affix decoys. bold asymptotes run slyly silent requests. quickly even requests above the quickly even pinto beans doubt above the slyly pend +685|17|4832|719.65| slyly. carefully slow dugouts haggle. quickly unusual ideas nag along the final requests. slyly regular ideas eat. daringly ruthless accounts wake slyly; express, bold packages nag +685|48|7999|480.90|ously final, brave accounts. fluffily final requests sleep. fluffily regular instructions are carefully. ironic forges haggle slyly blithely silent +685|79|7760|782.14|ts run among the slow requests. instructions wake quickly according to the special, unusual pinto beans. carefully regular multipliers sleep. even packages cajole +686|87|5026|778.62|efully ironic deposits sleep furiously express tithes. closely fin +686|18|6375|564.42|sly. thin, ruthless dolphins nag. silent packages haggle across the special, ironic pinto beans. slyly express deposits cajole carefully among the furiously pending packages. careful pinto beans caj +686|49|6289|948.96|unusual packages wake carefully among the blithely ironic theodolites. ironic packages affix after the blithely special theodolites. blithely final packages boost bl +686|80|3412|259.05|e. bold pinto beans nag slyly. slyly pending ideas haggle alongside of the as +687|88|4682|398.33|posits haggle blithely regular deposits. slyly final pinto beans sleep furiously carefully final deposits. quickly final packages wake furiously quickly silent courts. deposits boost blithely. caref +687|19|5181|553.94|ep. carefully permanent pinto beans haggle across the instructions. ironic instructions despite the blithely ex +687|50|9281|503.76|ch. furiously regular accounts wake carefully: carefully ironic instructions boost about the ironic pinto beans. bold courts doubt quickly final platelets. deposits cajole quic +687|81|3237|326.08|lyly enticing theodolites integrate slyly furiously regular requests. furiously regular theodolites according to the ironic deposits wake carefully among the carefully regular requests. +688|89|3292|53.28|ash around the carefully even foxes. slyly silent requests haggle. furiously express deposits believe furiously. ironic, unusual dependencies i +688|20|3778|615.31|, even accounts. furiously silent deposits sleep blithely. ironic packages wake among the carefully special dependencies. blithely ironic requests above the furi +688|51|7416|14.21|ly bold packages. bold, special excuses are according to the express accounts. fluffily final instructions haggle after the quickly express packages. blithely pending instruc +688|82|2895|310.10|tes believe across the platelets. furiously bold p +689|90|6180|286.64| are. ironically regular gifts sleep against the furiously ironic deposits. ironic, ironic accounts wake blithely slyly regular asymptotes. carefully r +689|21|4408|675.02|ar, bold pinto beans integrate ironic accounts. fluffily ironic ideas doubt carefully afte +689|52|5115|637.37|sly even packages could have to use fluffily against the silent sentiments. quickly bold theodolites are regularly deposits; final foxes +689|83|1757|212.05|riously against the carefully ironic deposits. express requests nag furiously among the pending, silent pin +690|91|1485|662.72|ackages. courts against the fluffily express theodolites affix whithout the furiously unusual packages. +690|22|5194|697.82|lar tithes? instructions haggle carefully. regular requests cajole alongside of the unusual id +690|53|1102|121.44|xpress, unusual deposits integrate slyly. slow accounts use furiously ironic packages. carefully express deposits according to the regular, ironic requests doze furiously regular accounts. ca +690|84|8781|323.22|ic, even ideas. deposits thrash slyly silent deposits. ironic, special packages wake silent asymptotes. slyly ironic waters sleep blithely. fluffily silent theo +691|92|7808|85.45|y special excuses serve quickly furiously express accounts. silent dolphins haggle quickly above the blithely unusual requests. regular accounts use qui +691|23|180|774.70|s boost carefully along the slyly even asymptotes. ironic foxes +691|54|6775|505.20|uffily silent accounts. carefully silent deposits solve. special dinos sleep quickly pending accounts. busy, special p +691|85|9908|568.59|y special, final frets. deposits cajole slyly slyly pending dolphins. final deposits wake. ironic pinto beans wake doggedly according to the quickly express inst +692|93|3861|953.42|counts integrate furiously. carefully express accounts above the carefully pending sentiments must detect ironic ins +692|24|9109|260.35|hely. unusual requests after the carefully final pinto beans are furiously quickly regular orbits. express requests according to the warthogs nag among the furiously ir +692|55|5013|279.04|en packages? slyly unusual theodolites wake blithely according to the fluffily ironic dependencies. ironic platelets +692|86|7323|719.59|unts haggle slyly up the carefully unusual instructions. unusual packages dazzle fluffily pending, even depos +693|94|5136|350.25|luffily unusual deposits boost furiously alongside of the daring packages. ironic packages boost furiously about the bold, blithe foxes. furiously regular instructions cajole blithely alongside +693|25|6049|807.87|instructions sleep ruthlessly furiously even accounts. regular packages haggle slyly against the special dolphins. blithely slow foxes sleep quickly. fluffily iro +693|56|6139|654.98|ake carefully about the furiously unusual excuses. carefully final accounts boost bold theodolites. blithely silent pinto beans use quickly regular deposits. sile +693|87|2973|417.56|ts wake deposits. regular, silent packages are quietly regular deposits. blithely pendi +694|95|616|141.00|ss the fluffily special packages. carefully ironic accounts serve furiously thinly pending pinto beans. carefully unusual asymptotes against the carefully silent accounts sleep slyly requests. bo +694|26|1473|378.81|ges sleep carefully final asymptotes. quickly even dependencies boost blithely. instructions alongside of the special, slow ideas run among the excuses. slyly r +694|57|8731|251.19| quickly even instructions. final ideas wake blithely. quickly final requests against the furiously special accounts nag furiously around the accounts. slyly bold deposits across the fluffily +694|88|6674|143.46|final requests. carefully final deposits breach. fluf +695|96|7952|720.94|g the accounts. silently regular accounts among the regularly special deposits impress slyly furiously regular instruct +695|27|3248|92.62|he furiously final instructions. bold, ironic deposits sleep a +695|58|1343|522.15|mas. furiously regular ideas wake carefully. blithely final pinto beans cajole slyly furiously even excuses. pending ideas boost furiously slyly ironic accounts. pe +695|89|5336|779.46|lyly ironic braids was slyly. carefully pending foxes sleep fluffily final platelets-- unusual, furious pinto beans sleep slyly about the +696|97|6314|647.48|dependencies impress blithely. ironic deposits boost furiously. pending warthogs sleep deposits. carefully ironic instructions cajole slyly packages: permanent requests wake. final deposits wake f +696|28|4053|227.94|usly final requests cajole carefully ironic, slow instructio +696|59|2774|988.53|jole carefully. carefully express packages above the quickly ironic requests use closely along the packages. carefully unusual packages wake carefully carefully furious ideas. spec +696|90|5083|2.66|lyly final platelets wake fluffily. ironic, blithe requests sleep. carefully unusual theodolite +697|98|6567|960.59|courts around the carefully even excuses sleep carefully along the carefully final requests-- quickly silent excuses cajole quickly around the deposits. regular, special instructio +697|29|8132|954.27|gainst the regular, ironic packages should boost alongside of the even accounts. regular ideas a +697|60|423|619.30|old accounts run carefully above the blithely ironic dependencies. blithely i +697|91|5240|131.38|e slyly ironic requests. packages sleep furiously express pinto beans. blithely +698|99|5329|495.02|ounts are closely along the pending, pending deposits. slyly pending instructions run furiously blithely ironic instructions. carefully final asymptotes nag slyl +698|30|2651|341.41|oxes. enticing accounts integrate slyly alongside of the carefully pending requests. even, bold requests are carefully around the furiously ironic deposits! regul +698|61|6810|972.28|g the ideas. carefully busy requests haggle carefully. carefully final sauternes along the enticing accounts cajol +698|92|4011|518.88|haggle quickly at the quickly bold dolphins; carefully bold accounts p +699|100|5457|774.09|al, special packages beside the quickly pending accounts use furiously across the unusual dependencies. slyly special ideas at +699|31|1996|318.26|ests. furiously final packages wake across the slyly pending accounts. express ideas about the final packages cajole across the closely regular excuses: carefully regular dolphins after the quickly +699|62|7300|590.47|in, bold theodolites nag carefully furiously final packages. ironic instructions sleep furiously furiously final requests. blithely even deposits was above t +699|93|51|87.09|quests. quickly permanent deposits wake around the furiously unusual packages. blithely even deposits use. ideas detect quickly! regular ideas are. slyly ironic requests solve deposits. unusua +700|1|2592|443.80|ns affix slyly across the unusual accounts. furiously final pinto beans sleep across the blithely final accounts. carefully pending accounts cajole al +700|32|3248|599.05|ccording to the carefully final instructions. regular requests across +700|63|9682|465.59| the carefully special asymptotes. slyly ironic deposits affix slyly unusual grouches. accounts snooze after the final, ironic dolphins. foxes integrate carefully blithely special accounts. +700|94|4633|149.16|s against the regular excuses sleep above the furiously silent foxes. unusual, ironic theodolites wake unusual packages. excuses within +701|2|4457|659.09|e after the furiously pending requests. furiously regular requests cajole slyly ironic dependencies. slyly express accounts affix carefully before the final deposits. slyly regular reques +701|34|807|602.04|telets haggle quickly according to the requests. final, final frets are fluffily bold requests. slyly bold packages wake. furiously regular deposits use careful +701|66|198|821.39| courts. carefully special packages wake boldly even deposits. theodolites are slyly against the slyly regular deposits. ironic accounts sleep above the carefully even theodolites. dolphins accord +701|98|2371|113.38|theodolites. furiously express accounts use blithely across the accounts. enticingly busy pinto beans according to the ruthlessly unusual pinto beans wake at the requests! close, regular +702|3|8251|732.51|ic packages are. quickly pending requests sleep according to the silent accounts. ironic packages against the furiously regular pinto beans cajole alongside of the deposits. cl +702|35|9951|686.68|ven courts. blithely bold foxes cajole slyly. silent deposits cajole furiously pi +702|67|2259|666.42|iously final theodolites haggle slyly regular foxes. even, special instructions haggle blithely even requests. slyly stealthy instructions solve blithely. quickly regular platelets d +702|99|2684|864.70|ts. blithely bold platelets nag carefully carefully even instructions. regular, even asymptotes according to the careful requests poach fluf +703|4|2813|602.76|c foxes do use according to the final foxes. caref +703|36|3126|966.27|out the carefully careful asymptotes. blithely special requests after the requests use q +703|68|103|504.94|oze according to the special requests. bold, special reque +703|100|4744|116.94|slyly express pearls. even platelets cajole furiously after the regular, special accounts! quickly unusual packages about the furiously ironic deposits cajole slyly after t +704|5|5245|630.65|ular packages are carefully among the express requests. blithely ironic orbits sleep. quickl +704|37|1116|128.11|sts. slyly express ideas haggle. quickly regular ideas affix quickly among the furiously pending sauternes. idle deposits about the slyly special requests +704|69|7507|482.09|al patterns wake slyly blithely even packages. pinto beans haggle furiously. carefully +704|1|3391|814.35|deposits boost according to the fluffily express deposits. permanently bold dolphins nag. carefully unu +705|6|7977|665.13|ickly even accounts. express requests wake fluffily: slow, express requests along the close dependencies cajole blithely ironic instructions. slyly pending deposits wake blithely bold pinto +705|38|1674|102.28| asymptotes. quickly ironic pearls sleep. patterns cajole: ironic, unusual accounts cajole furiously according to the packages; f +705|70|1087|30.49|ses wake carefully ironic accounts. stealthily regular excuses haggle carefully. fluffy accounts according to the fluffi +705|2|3371|222.92|sly against the ironic, bold epitaphs. furiously final accounts are carefully. final, final pains kindle regular, regular packages. always final accounts boost. carefully regular ide +706|7|9747|609.14|packages nag blithely fluffily bold packages. regular, regular packages about the ironic, bold pinto beans are furiously over the ironic, final requests. bl +706|39|2545|154.24|urts alongside of the carefully ironic ideas doze final pinto beans. slyly brave asymptotes could sleep fluffily. pending packages are. +706|71|2559|92.76| packages. even asymptotes integrate furiously. blithely unusual theodolites wake carefully even packages. furiously express instructions above the even escapades are fin +706|3|8215|857.89|ts cajole slyly after the fluffily regular asymptotes. permanent, regular deposits about the slyly pending as +707|8|7878|99.90|sts haggle blithely according to the slyly final requests. pending foxes snooze carefully about the furiously +707|40|9076|13.91|the carefully bold instructions. furiously bold deposits are +707|72|9493|329.76|nic platelets. daringly express theodolites use furiously. unusual, +707|4|5405|83.82|oxes. final requests was. packages haggle of the fluffy asymptotes. final foxe +708|9|8896|472.84|egular pinto beans cajole closely carefully regular requests. requests cajole. fluffily final packages affix furiously after the special theodolites! carefully final pinto b +708|41|6600|167.74| close foxes sleep regular theodolites. fluffily final pinto beans against the furiously ironic asymptotes +708|73|5261|247.72|slyly regular deposits. blithely even excuses nag furiously. silent, ironic deposits boost-- furiously ironic foxes play express instructions. requests are along the slyly ironic +708|5|3879|765.44|y ironic dolphins-- carefully ironic requests snooze blithely deposits. ironic, regular accounts sleep iro +709|10|8822|809.14|nts. final, ironic excuses integrate quickly across the tithes. pending packages haggle furiously pending asymptotes. unu +709|42|4072|879.25|lly special requests after the accounts nag fluffily after the slyly even instructions! silent, even dinos boost fluffily regular, ironic foxes. carefully final pin +709|74|9817|376.02|deas. carefully ironic sauternes sleep after the carefully even platelets. regular, special dugouts detect blithely. care +709|6|9533|326.18|carefully special theodolites use quickly! fluffily regular somas boost permanently silent excuses. slyly even realms cajole slyly? blithely regular platelets wak +710|11|7236|844.12|ly around the dolphins. regular theodolites affix among the final deposits. slyly unusual packages cajole always across the instructions. carefully thin theodolites nag carefully regul +710|43|3868|377.54|olites according to the slyly express requests boost after the quietly ironic excuses. furiously final packages cajole quickly across the regular, even pearls. ironically regular +710|75|664|939.25|oss the stealthily final pinto beans sleep fluffily furiously final courts. +710|7|8607|956.31|ely final deposits according to the stealthily regular packages wake pending pac +711|12|1124|894.80|instructions. carefully bold pinto beans among the carefully special deposits dazzle carefully platelets-- final pac +711|44|3589|31.56| kindle slyly along the carefully silent theodolites. ironic packages boost furiously along the +711|76|3783|138.46|c foxes haggle quickly bold accounts. slyly final tithes cajole furiously above the carefully unusual ideas. even, +711|8|3746|601.51|regular instructions wake quickly at the regular, regular requests. regular requests detect whithout the carefully ironic requests. blithely reg +712|13|467|875.03|es above the final, unusual waters wake quickly about the fluffily special foxes. ironic, brave theodolites sleep furiously against the permanently car +712|45|687|530.42|ously against the regular accounts-- furiously pending ideas wake quietly accounts. blithely furious accounts cajole. theodolites over the blithely bold packages use slyly car +712|77|4688|799.85|deas integrate never packages. final accounts are carefully. blithely regular asymptotes +712|9|4128|638.22|uffily even instructions wake blithely after the carefully final platelets. quickly regular excuses sleep. slyly unusual deposits haggle ironic deposits. requests slee +713|14|1062|503.03|nusual excuses. carefully express deposits sleep sly +713|46|7124|57.52| requests integrate fluffily unusual packages? even, regular forges haggle blithely. pending, even theodolites cajole carefully dogged packages. slyly final instructions sleep about the slyly reg +713|78|2453|995.67|nal requests across the furiously express accounts are slyly against the c +713|10|106|67.04|according to the blithely silent ideas. slyly special platelets sleep fluffily. blithe foxes alongs +714|15|8770|142.38|ruthless accounts. stealthy instructions haggle slyly ironic, pending dependencies. special accounts wake furi +714|47|7474|536.56|regular, bold warthogs. furiously ironic excuses cajole carefully. final, even accounts unwind slyly regularly careful accounts. +714|79|2472|173.33|ular pinto beans. fluffily unusual deposits cajole. regular somas along the fluffily even pinto beans nag slyly against th +714|11|26|311.85| ironically against the quickly bold asymptotes. final sheaves are. slyly final deposits boost furiously. a +715|16|7573|656.71|y unusual realms detect furiously. special, bold p +715|48|2426|504.26| foxes. regular asymptotes are slyly special packages. courts affix +715|80|7092|776.92|hely regular foxes boost furiously regular theodolites. final requests wake blithely outside the furiously bold platelets. furiously special deposits impress carefully across the carefully unusua +715|12|8294|869.92|requests boost. blithely silent foxes sleep carefully ironic ideas. fluffily regular pearls after the quickly pending asymptotes use furiously gifts. ca +716|17|2166|511.37|the requests haggle even, bold instructions. final, ironic accou +716|49|1472|441.44|n, special packages detect. quickly ironic requests detect. slyly +716|81|9350|945.26|ges eat. regular, special ideas nag carefully carefully regular gifts. regular, ironic excuses around the even asympt +716|13|5181|925.45|lyly ironic asymptotes. deposits are carefully. pending, ironic requests in place of the furiously unusual accounts are carefully slyly even ideas. special accounts cajole blithely busy acco +717|18|9376|709.72|ix carefully enticingly ironic accounts! carefully regular foxes haggle furiously along the quickly regular pinto beans. blithely regular requests for +717|50|7474|344.44|ts cajole carefully unusual epitaphs. regular ideas cajole across th +717|82|1229|77.43|quests detect. deposits among the ironic requests boost slyly pending theodolites. carefully unusual pinto beans nag according to the slyly special +717|14|2617|916.77| accounts haggle quickly along the final, enticing requests. slyly ironic instr +718|19|4556|649.24|s. quickly ironic deposits wake final excuses. regu +718|51|6680|851.26|pinto beans. special foxes wake quickly against the furiously pending packages. blithely express accounts use. waters about the express pinto beans cajole hockey pl +718|83|6361|590.03|special ideas sleep carefully express packages. fluffily final theodolites against the quickly expre +718|15|2249|709.24|usual, special accounts cajole carefully. dependencies cajole carefully blithely regular deposits. slyly unusual accounts wake furiously ironic r +719|20|8187|214.93|ss the ironic packages. finally regular asymptotes about the furiously regular theodolites snooze furiously among the carefully pending deposits. foxes across the ironic dolphins are quickly after +719|52|235|199.87| instructions kindle furiously. even realms wake. quickly express packages haggle. pending asymptotes across the even pinto beans sleep packages. slyly ironic asymptotes +719|84|9530|888.37|s; final packages detect fluffily carefully pending platelets. blithely unusual ideas above the slyly ironic requests impress fluffily after the blithely silent dolphins. even dependencies kindle bl +719|16|521|824.53| slyly ironic packages. furiously final packages was slyly ironic deposits. final deposits are. fluff +720|21|2402|883.37|sly above the accounts. slyly final ideas alongside of the even, +720|53|7795|735.09|ven excuses wake fluffily above the regular instructions. carefully final foxes about the unusual accounts boost furiously along the furiously regular warthogs. packages haggle quickly even pinto +720|85|5764|114.73|efully regular deposits. fluffily express dependencies cajole slyly. blithely final foxes are. blithely ironic requests serve carefully +720|17|146|490.01|s. brave, special deposits was idly. fluffily eve +721|22|1106|58.45|carefully according to the ironic accounts. Tiresias +721|54|3210|642.95|tain slyly above the regular accounts. furiously close packages up the +721|86|859|42.31|rate after the furiously pending theodolites: slyly unusual deposits ab +721|18|9237|127.63|s. platelets into the ruthlessly blithe dependencies boost final accounts. furiously special platelets wake fluffily regular accounts. special +722|23|4943|482.06|he fluffily express excuses. ironic requests nag carefully reque +722|55|1009|334.70|ages; pending deposits sleep furiously pending requests. quickly r +722|87|3533|216.88|nal dinos across the ironic accounts cajole above the carefully even foxes? ironic, ev +722|19|2940|981.71|ally. even asymptotes wake slyly. slyly even theodolites must have to nag busily about the ironic deposits. iron +723|24|1682|220.66|ions. ironic instructions cajole pending foxes. special accounts use quickly regular dependencies. slyly even foxes across the ironic instructions wake finally along the fluffy acco +723|56|9349|550.88|sly final courts solve quickly close ideas. slyly quiet packages cajole against the ironic, final accounts. +723|88|5230|120.42|avely brave courts. permanent ideas behind the ironic accounts affix furiously furiously final theodolites. carefully pending requests among th +723|20|6971|108.21| blithely furiously express deposits. final accounts haggle about the regular sentiments. quickly pending sentiments boost finally against the ironic requests. cour +724|25|644|778.30| theodolites after the regular packages nag blithely according to the pending, special multipliers. slyly even packages about the blithely final grouc +724|57|5104|62.07|cross the furiously final excuses. carefully pending packages among the car +724|89|1041|494.43|he slyly even requests. excuses among the quickly final deposits haggle blithely even pinto beans. even, regular theodolites are furiously across the quickly dogged +724|21|1088|311.67|nic dependencies sleep. final deposits wake slyly. furiously even tithes are furiously. re +725|26|2273|693.23|ironic deposits cajole. furiously express frays sleep blithel +725|58|606|851.97|fluffily even foxes. courts wake express orbits. quickly final accounts wake quickly requests. furiousl +725|90|7626|577.47|even deposits wake furiously furiously pending foxes. waters integrate furiously against the quickly express accounts. slyly ironic deposits sleep. even plat +725|22|2252|456.53|r requests. finally pending grouches cajole slyly. furiously bold theodoli +726|27|353|729.48|o the express, brave accounts wake requests. blithely regular requests according to the waters nag fluf +726|59|2778|764.18|at slyly across the deposits. express requests against the fluffily final deposits boost blithe +726|91|7940|548.76|. quickly pending requests wake even, final ideas. ironic dugouts eat fluffily +726|23|6037|479.71|final accounts across the pending braids x-ray regular theodolites. furiously ironic excuses are against the carefully pending accounts. fluffily silent deposits haggle across the bli +727|28|4534|804.85|nstructions. regular excuses must have to sleep slyly according to t +727|60|3750|813.62| the slow, unusual foxes. requests haggle. furiously special foxes boost according to the express, regular frets. furiously ironic f +727|92|3973|398.97|cording to the unusual dependencies. special, regular theodolites wake along the +727|24|3324|427.39|ounts cajole furiously according to the pending, unusual accounts. regular accounts along the carefully express +728|29|3215|452.10|lithely regular theodolites use blithely across the s +728|61|4964|156.87|ven epitaphs. fluffily thin requests boost slyly around the final, express dependencies. d +728|93|871|395.57|y ironic courts. carefully even dependencies cajole across the fluffily even dependencies. busily bold packages wake furiously final frays. final, +728|25|4646|261.17|platelets haggle. carefully even requests are final requests. carefully ironic instructions across the slyly +729|30|2546|171.84|quickly fluffily regular accounts. hockey players boost carefully even requests. quickly ironic accounts against the spec +729|62|9356|289.28|ve furiously against the carefully even packages-- ironic excuses hang carefully. quickly bold accounts among the furiously unusual packages cajole c +729|94|2508|935.58|onic platelets. special orbits promise requests. ironic requests +729|26|3357|78.88|lithely unusual packages along the carefully even dolphins are quickly special packages. carefully unusual accounts wake slyly above the final, ironic requests. carefully even foxes mold +730|31|1509|237.27|ffily pending requests. carefully final pinto beans boost according to t +730|63|6504|934.13|eas are quickly ironic requests. blithely final requests haggle quickly ironic pinto beans. ironic deposits engage furiously +730|95|8748|697.31|are slyly furiously bold foxes. quickly ironic packages above the slyly regular requests nag among the carefully even platelets: permanently regular deposits na +730|27|8874|641.57|nic accounts. special requests nag slyly even, silent dolphins! sometimes regular theodolite +731|32|6788|810.78|counts are after the regular, ironic deposits. bravely express requests cajole. special, ruthless ideas boost blithely. deposits use furiously quickly regular ideas. final, dogged notor +731|64|1965|588.30|y regular accounts. fluffily final ideas use slyly? requests wake bli +731|96|7853|627.81|er the fluffy excuses affix among the silently ironic accounts. slyly final dependencies sleep along the instructions. slyly stealthy deposits integrate slyly around the deposits. furiously +731|28|3992|366.24|ular asymptotes. blithely special realms are furiously. final excuses alongside of the blithely special pinto beans sol +732|33|6654|741.33|quickly regular pinto beans hang furiously after the special, unusual frets. furiously ironic epitaphs haggle fluffily pack +732|65|7501|217.43|onic pinto beans wake. carefully regular frays unwind enticingly according to the slyly final requests. carefully unusual packages use according to the ironic deposits. sly +732|97|272|144.81|lly final requests. blithely bold deposits boost slyly above the regular, final accounts. carefully regular deposits cajole blithely bold instructions. sometimes pendin +732|29|9804|456.70|e? quickly bold pinto beans cajole carefully about the deposits. bravely special platelets pr +733|34|8204|656.63|bove the blithely bold packages. furiously silent sauternes sleep blithely. special, silent asymptotes doze about +733|66|1741|160.62|s affix never. furiously unusual requests grow carefully quiet accounts. blithely express sheaves affix ruthlessly. slyly unusual instructions haggle blithely about the +733|98|917|450.57|eposits. fluffily final theodolites detect slyly: ironic, express dependencies haggle blithely; even dinos are across the ironic deposits. always ironic platelets use never express +733|30|799|546.29| foxes cajole. dogged, unusual Tiresias above the silent, bold accounts haggle slyly according to the special, bold requests. regular, special dep +734|35|4410|817.17|odolites. regular warthogs sleep carefully final dependencies. unusual asymptotes are. blithely close packages detect slyly. special accounts nag slyly ironic deposits. caref +734|67|7230|987.06|furiously express pinto beans sleep carefully. foxes snooze blithely fin +734|99|6547|179.74| pending ideas across the slyly express requests wake furiously accounts. accounts haggle slyly. regular excuses use slyly. s +734|31|7476|189.46|uickly against the dependencies. fluffily thin instructions mold blithely-- blithely bold pearls doze slyly waters. asymptotes na +735|36|9318|666.26|ic foxes haggle slyly about the furiously regular packages. furiously regular foxes sleep carefully. blithely pending att +735|68|8838|169.33| fluffily pending theodolites. regular theodolites cajole slyly slyly ironic foxes. theodolites throughout the finally ironic accounts doze against the even inst +735|100|286|939.02|equests affix thinly furiously final dolphins. accounts detect carefully regular requests. fluffily silent instructions engage fluf +735|32|1628|23.40|st the slyly final accounts boost ironically among the closely even accounts. unusual pinto beans cajole slyly. final theodolites haggle carefull +736|37|7236|872.53| beans. carefully quiet requests among the slyly even theodolites nag after the express theodolites. carefully special accounts play above the final dependencies. +736|69|5233|327.72| express packages according to the furiously regular pinto beans cajole packages-- slyly special accounts integrate carefully along the busily ironic requests. regular, regular +736|1|7431|694.25|y alongside of the warhorses. carefully regular packages wake special escapades. furiou +736|33|3956|10.65|yly express packages are across the regular dolphins. blithely regular excuses nag at the furiously final dolphins. pinto beans hang special asymptotes. ironic dependencies according to the +737|38|2639|449.00|ntain above the ironic dugouts. special, bold foxes are across the bold pinto beans. regular packages use blithely along the quickly i +737|70|4834|72.02|refully. final foxes about the ironic accounts are quickly re +737|2|1213|917.31|r packages nag furiously blithely final courts? carefully even tithes across +737|34|679|771.96|ending deposits grow furiously. carefully regular requests across the slowly final accounts haggle blithely after the requests. regular packages will eat after the deposits. unusual accounts ha +738|39|8416|400.61|arefully ironic packages. stealthy foxes cajole blithely +738|71|3945|955.90|sits. deposits nag carefully according to the slyly bold requests. ideas wake slyly quickly regular pains. quickly special requests wake caref +738|3|1864|70.75|y against the regular packages. fluffily final pinto b +738|35|6065|476.03|fter the pending accounts. furiously stealthy foxes run. ironic accounts use slyly fluffily special +739|40|3248|850.61| across the even, pending requests use blithely pending asymptotes; furiously pending instructions wake. fluffily bold requests haggle busily. silent deposits alongside of the express ideas n +739|72|9028|633.69|ously blithely unusual ideas. packages are blithely. blithely unusual accounts around t +739|4|3558|197.83|endencies. blithely regular theodolites print about the carefully regular requests. blithely ironic sauternes cajole furiously regular accounts. ironic accounts sleep carefully above the specia +739|36|6488|456.44|ns. instructions haggle carefully above the fluffily bold excuses. requests cajole furiously +740|41|4969|248.49|ts. deposits use. ironic platelets cajole. express foxes above the ironic platelets haggle carefully i +740|73|9484|844.64|ts sleep slyly. silent pinto beans mold. pending requests cajole furiously since the regular instructions. e +740|5|5420|262.00|ic foxes wake blithely above the fluffily ironic accounts. regular, ironic pinto beans sleep blithely quickly regular platelets. +740|37|6886|137.93|furiously furiously final accounts. quickly bold instructions are blithely; slyly pending deposits sublate fluffily around the quickly silent instructions. bold deposits dazzle ab +741|42|8201|761.76|detect final, ironic ideas. final pinto beans are final, special +741|74|2855|810.29|r accounts are blithely above the carefully ironic foxes. dolphins wake furiously against the even accounts. quickly bold dependencies wake carefully ideas +741|6|4592|276.65|above the foxes. regular packages was slyly furio +741|38|5270|446.25|es. accounts doubt permanently. blithely special theodolites lose +742|43|6812|755.84|te blithely daring, express braids. furiously final deposit +742|75|5286|203.86|uests wake after the slyly final pinto beans. slyly ironic packages cajole slyly. regularly final forges need to cajole. slyly ironic decoys wake: slyly daring foxes boost even, special +742|7|2076|903.32|l dependencies haggle finally. blithely final deposits across the regular, special foxes haggle carefully carefully regular packages. quickly express theodolites boost furiously reg +742|39|8455|416.54|arly unusual deposits sleep. slyly ironic accounts nag carefully. furiously express foxes haggle regular pinto beans. ironic asymptotes across the pending, bl +743|44|5539|909.78|slyly bold packages sleep. furiously special accounts wake. packages detect? carefully unusual accounts haggle blithely regularly silent requests. furiously ironic reques +743|76|8562|100.09|its. even ideas cajole furiously. furiously bold excuses haggle daringly alongside of th +743|8|3928|130.02|ounts alongside of the blithely idle accounts wake about the pearls. slyly special packages sleep quickly. slyly final accounts are. even, express +743|40|8086|599.06|into beans cajole furiously on the final excuses. slyly bold dolphins cajole slowly ironic foxes. unusual packages affix slyly final acc +744|45|4|698.75|express packages try to use above the even excuses. furiously regular deposits above the silen +744|77|1605|736.96|y regular pinto beans cajole furiously bold deposits. pending platele +744|9|6545|565.50|lly across the pending packages. theodolites haggle blithely ironic requests. boldly regular requests sleep around the furiously even instructions. foxes wake blithely. blithel +744|41|1733|8.22|fully. fluffily express ideas detect. blithely permanent requests boost express instructions. accounts after +745|46|8648|473.53|al instructions nag above the express, silent pinto beans! furio +745|78|4033|694.70|ly final requests run furiously across the even accounts. even tithes according to the blithely ironic packages integrate fluffi +745|10|5339|650.09|y. regular, final deposits boost blithely packages. even, regular accounts wake fluffily after the bold instructions. ironic warthogs are. ruth +745|42|6992|111.97|fully unusual platelets wake furiously blithely unusual packages. ironic, ironic reque +746|47|5732|964.24|y bold requests. regular, silent packages promise enticingly across the idly ironic requests. accounts impress along the rut +746|79|3729|342.06|carefully stealthy accounts kindle silently during the regular orbi +746|11|1661|18.80|es use furiously final, special ideas. blithely regular requests detect along the furiously unusual dependencies. carefully pending pinto beans detect slyly according to the regular packages +746|43|8252|482.38| daringly regular deposits. ironic theodolites about the carefully final pinto beans may x-ray final, final instructions? special +747|48|4031|722.31| are finally along the ironic dependencies. furiously ironic instructions detect a +747|80|626|91.87| believe. blithely even packages are blithely? express pinto beans are blithely about the unusual packages. excuses nag carefully express war +747|12|911|909.79|endencies. accounts around the ironic forges play slyly carefully final foxes. bold packages must hang according to the special pa +747|44|7914|317.38|nal platelets haggle except the unusual dugouts. regular, silent accounts a +748|49|2102|827.53|lar frays about the deposits haggle up the regular pinto beans. ideas wake slyly. regular dolphins doubt ironic, silent accounts. final platelets maintain against the +748|81|5262|382.39|fily among the express, ironic excuses; slyly pending accounts are slyly along the carefully special pa +748|13|5503|503.41|lly since the bravely even theodolites. pending orbits nag carefully bold excuses. final, even pinto beans about the slyly ironic theodolites haggle blithely bold packages. bold accounts nag quick +748|45|7953|404.35|s sublate blithely above the slyly blithe packages. sometimes special pinto beans mold slyly ironic instructions. pending, special packages wake deposits. furi +749|50|1989|878.89|above the platelets: blithely express pinto beans wake. bold, stealthy requests use express, special the +749|82|9099|471.73|ans dazzle furiously. instructions boost carefully. carefully regular package +749|14|2728|481.73|y ironic packages. express, final accounts along the even, bold dolphins detect bold ideas. dependencies boost furiously about the bold, regular pinto beans. quickl +749|46|747|700.41|ic multipliers are express, daring deposits. slyly regular packages are above the blithely special ideas. deposits slee +750|51|7824|635.07|s doubt quickly. requests wake furiously along the furiously stealthy requests. dogged deposits are above the slyl +750|83|8062|401.42|uffily regular requests. special packages wake pinto beans: furiously brave a +750|15|7180|584.43|y ironic deposits. carefully even ideas are blithely instructions. dogged ideas among the slyly regular +750|47|2441|530.78|blithely. even requests integrate blithely among the even instructions. slyly bold de +751|52|7720|846.07|lly after the bold, even accounts. final deposits cajole slyly regular packages; requests about the quickly express instructions integrate quickly with the furiously pending acco +751|84|7337|288.34|ic packages. furiously final foxes lose among the furious +751|16|1645|150.65|sly regular excuses. slyly final escapades boost? furiously regular inst +751|48|9385|674.98|jole blithely ironic deposits. pending, unusual deposits detect quickly across the idly pending reque +752|53|5650|857.84|ultipliers. quickly special notornis wake express depos +752|85|2495|205.26|uests use slyly slyly ironic warhorses. regular, regular pack +752|17|2173|507.31|l, ironic asymptotes. pending pinto beans was slyly. carefully pending requests cajol +752|49|4946|152.82|p carefully. bold dependencies wake quickly carefully silent asymptotes. carefully ironic requests above the ironic, regular deposits +753|54|2888|290.84|ic asymptotes. packages wake blithely after the sly, even dependencies. pending ac +753|86|1224|243.37|nusual pinto beans according to the blithely express requests boost furiously ironic pac +753|18|9499|570.26| the even deposits. blithely final ideas unwind closely. furiously unusual accounts sleep fluffily even requests. regular, special foxes cajole carefully. slyly e +753|50|1677|142.28|the slyly even deposits. slyly ironic packages believe. final, regular requests eat quickly at the ironic deposits. quickly special requests sleep ironic accounts. carefully e +754|55|6813|885.91|ly across the daringly pending accounts? carefully silent platelets affix blithely about the furiously express foxes. bold dependencies along the r +754|87|1884|588.76|counts. bold requests across the idle, unusual deposits wake among the slyly regular accounts. regular deposits after the slyly silent ideas are carefully against the carefully bold asy +754|19|6323|351.15|s. packages are slyly ironic deposits. slyly pending ideas along the furiously express instructions haggle fluffily expr +754|51|9078|855.09|he express accounts. furiously express accounts sublate requests. slyly pending requests hang fluffily. idle, unusual deposits sleep furiously +755|56|5119|73.94|cajole slyly across the special, unusual theodolites. foxes according to the bold, regular platelets haggle among the quick dependencies. deposits use platelets. regular account +755|88|3309|167.66|lent deposits use blithely above the idle, pending deposits. quickly final +755|20|9659|853.98|slyly regular instructions. express requests detect. furiously final packages among the ideas haggle ironic excuses. quickly even instructions wake. quickly special deposits print about the r +755|52|9520|381.84|lly ironic pinto beans. slyly final patterns nag quickly about the furiously regular requests; ideas wake +756|57|3692|284.28|ains cajole quickly express pearls. slyly pending theodolites sleep slyly. slyly ironic instructions haggle slyly. furiously unusual requests cajole furiously abou +756|89|9232|862.53| furiously enticing dolphins unwind furiously even, pending accounts. carefully silent ideas wake quickly finally final packages. bold asymptotes integrate fluffily slyly special packages. silently +756|21|8738|144.16|accounts haggle blithely against the busily regular grouc +756|53|6994|496.05|. quickly ironic requests wake carefully furiously bold pinto beans. unusual platelets according to the special platelets sleep slyly along the silent, regular packages. carefully ironic requ +757|58|7815|667.38|among the ironic ideas. furiously ironic ideas use fluffily silent deposits. idly even packages +757|90|7677|63.93| sentiments among the accounts integrate blithely above the furiously brave packages. quickly final foxes shall have to wake requests. iro +757|22|1703|782.69|nd the carefully silent patterns cajole enticingly blithely ironic ideas. instructions are carefully blithely unusual foxes. unusual, final ideas nag +757|54|8358|947.38|egular theodolites. blithely even packages boost carefully across the theodolites. furiously express requests use of the furiously spe +758|59|4777|607.78|ual packages wake quickly alongside of the bold accounts. furiousl +758|91|2929|319.96|into beans grow carefully. furiously regular deposits hi +758|23|1694|152.01|ickly regular accounts. fluffily sly foxes boost alongside of the bold ideas. requests alongside of the express hockey players use carefully carefu +758|55|652|592.99|iously express requests are regular pinto beans. ironic pinto beans after the slyl +759|60|6048|437.12|ooze furiously across the carefully final platelets. ironic packages +759|92|6351|247.78|oxes boost furiously quiet pains. slyly special requests pr +759|24|1514|853.68|ccounts wake blithely among the idly unusual accounts. final requests detect blithely pending deposits. ironic foxes cajole slyly blithely express accounts. p +759|56|563|322.90|iments are blithely. slyly ironic instructions sleep blithely final accounts. furious +760|61|5893|600.02|ounts use slyly. ironic accounts sleep carefully furiously iro +760|93|4721|804.29|gular courts-- fluffily regular deposits are fluffily. ironic, unusual i +760|25|8078|405.37|e against the furiously furious deposits. blithely silent ide +760|57|9874|90.35|ironic theodolites are carefully against the ironic ide +761|62|4909|354.85|ep carefully. bold foxes solve slyly. slyly regular platelets serve alongside of the even requests. blithely unusual theodoli +761|94|1517|188.66|the deposits. carefully even courts sleep quickly. final, final instructions sleep slowly about the carefully unusual packages. requests boost express, b +761|26|8470|235.92|ress deposits hang alongside of the silent packages. evenly final instructions wake carefully regular packages. permanently express asymptotes haggle blithely quietly pending dependenc +761|58|5826|354.75|ly instructions. carefully pending asymptotes wake fluffily furiously express pinto beans. Tiresias against the express requests use silent packages. slyly regular accounts above the ironic, iro +762|63|6504|446.54|oys. quickly pending deposits integrate furiously ironic, ironic deposits. pending, regular theodolites above the blithely ironic platelets sleep across the requests. pending deposits haggl +762|95|1683|659.22|uests. ironic, final accounts about the blithely even asymptotes are furiously ironic accounts-- silent platelets wake regularly. furiously ironic dep +762|27|2613|811.37|ys unusual foxes wake furiously above the furiously iron +762|59|3635|438.58|thely blithely special accounts? furiously pending deposits snooze fluffily across the carefully pending deposits. regular ideas wake +763|64|8866|851.61|e always bold packages sleep according to the slyly final packages. brave asymptotes cajole quickly final packages. fluffily express deposits across the slyly special platelets wake slyly after +763|96|9608|379.45|ests cajole slyly carefully regular theodolites. ironic ideas use. unusual packages against the carefully regular accounts sleep slyly sile +763|28|1070|1.05| daring deposits across the blithely ironic pinto beans use furiously within the slyly ironic requests. furiously unusual packages integrate blithely. regular pinto beans above t +763|60|3364|5.60|s. fluffily pending deposits sleep. pending pinto beans cajole quickly across the accounts. quickly ironic accounts believe. regular packages engage alongside of the idle accoun +764|65|8069|454.11|quests. ironic requests sleep. furiously unusual depths sleep blit +764|97|1098|11.35|ests serve furiously furiously ironic ideas. excuses cajole furiously: blithely final foxes use-- id +764|29|1018|248.98|inal accounts detect quickly deposits. pending tithes x-ray. slyly even theodolites believ +764|61|1024|69.06|tes according to the requests cajole carefully across the even deposits. bold, ironic accounts cajole +765|66|7058|40.03|hins use above the bold pinto beans! regular accounts sleep after +765|98|473|741.29|y special ideas. ironic, dogged ideas above the slyly bold frays nod carefully against the even packages. blithely ironic packages affi +765|30|8059|433.35| furiously bold requests above the carefully final deposits use furiously across the furiously +765|62|7642|845.40|asymptotes haggle quickly behind the carefully bold deposits. requests cajole blithely furiou +766|67|8004|50.45|gular braids. even, pending theodolites along the blithely express requests are ironic realms. +766|99|2749|94.57|lar foxes. ironic, bold instructions above the slyly ironic packages are among the furious +766|31|7322|325.03|. slyly pending deposits use carefully about the theodolites. furiously regular requests wake quickly according to the blithely unusual packages. blith +766|63|167|374.38| accounts. final requests use. slow deposits sleep. quickly even packages cajole +767|68|1662|745.51|. special deposits above the furiously ironic sheaves haggle fluffily above the furiously bold accounts. slyly final ideas among the fluffil +767|100|1424|442.95|odolites. requests impress furiously against the furiously final accounts. blithely regular pinto beans a +767|32|2620|376.84|usly with the slyly special ideas. furiously ironic pinto bea +767|64|1454|78.16|jole among the ironic, ironic accounts. furiously sly requests haggle across the ironically final accounts. quickly silent deposits mold slyly above the foxes. slyly pending instructions acro +768|69|9252|155.42|y final sentiments. ironic, express theodolites use carefully. pinto beans boost packages. furiously fina +768|1|2578|999.77|ep carefully between the quickly special deposits. quickly regular platelets use slyly thinly ironic excuses. quickly regular ideas poach. ideas haggle across the car +768|33|6847|4.28|eas against the regular asymptotes wake quickly against the quickly regular foxes. fluffily regular pinto beans boost carefully. slyly ironic package +768|65|3977|335.32|ts. special pinto beans according to the carefully ironic notornis use carefully toward the blithely unusual pinto beans. accounts boost quickly. carefully final platelets unwind blithely +769|70|7177|519.39|accounts. brave deposits are. blithely furious requests are. regular accounts kindle. foxes haggle blithely slyly +769|2|4513|220.61| players. carefully express deposits cajole fluffily quickly sly foxes. even platelets haggle evenly quickly idle packages. slyly stealthy accounts haggle above the dependencies. sheaves wake. bli +769|34|4774|689.65|t about the furiously final requests. requests cajole carefully ev +769|66|3461|674.73|carefully unusual accounts. blithely final deposits are carefully. regular requests sleep furiously. dogged deposits haggle carefully. carefully express asymp +770|71|8688|632.12|. quickly pending accounts haggle. theodolites cajole slyly silent deposits. silent requests wake furiously foxes. theo +770|3|1428|797.51|ly ironic pinto beans nag carefully regular, regular pearls. carefully regular requests hag +770|35|3678|346.49|olites according to the even, ironic packages are quickly furiously final deposits. regular, special packages detect blithel +770|67|6439|509.93|lar ideas. ironic deposits sleep slyly. carefully ironic dinos wake carefully slyly express pinto beans. slyly pending accounts wake across the furiously silent courts! quiet deposits boost above th +771|72|9322|227.85|regular packages. carefully ironic requests use carefully furiously regular ideas. special, ironic escapades wake slyly bold, final accounts. blithely final sentiments acc +771|4|8479|602.84|s sleep according to the quickly regular packages. ironically ironic instructions haggle blithely. blithely ironic requests boost slyly about the ironic, even accounts. blithely special +771|36|6409|265.50|lly express accounts cajole furiously about the careful, ironic deposits. slyly final requests after the ironic dependencies grow fluffily packages. fluffily pendin +771|68|6686|991.19| dependencies. final deposits boost fluffily. ironic platelets sleep among the express hockey players. carefully ironic +772|73|773|640.27|ly ironic instructions. express pinto beans cajole furiously thinly u +772|5|1303|942.93| blithely alongside of the slyly special pinto beans. quickly ironi +772|37|1011|801.94|lyly ironic requests wake. regular theodolites haggle carefully instructions. carefully pending packages above the carefully express pinto beans haggle special accounts. ironic, ironic dugouts d +772|69|8712|752.10|iously alongside of the carefully regular ideas. slyly express requests serve quickly across the foxes! unusual, even deposits are slyly. caref +773|74|606|363.43|le requests. pending, blithe packages sleep carefully above the quickly bold requests. slyly express accounts nag fluffily. iro +773|6|4077|541.34| accounts. even foxes wake quickly slyly ironic packages. bold deposits integrate furiously beside the special, pending theodolites. slyly regular foxes after the special, regular theodolites nag +773|38|2274|602.85|ts use fluffily carefully regular warthogs. pinto beans was furiously. furiously daring sauternes are fluffily according to the furiously ironic requests. e +773|70|8040|406.03|y ironic requests wake slyly. furiously pending accounts haggle furiously unusual, pending deposi +774|75|5149|120.72|kly idle pinto beans cajole slyly along the blithely final accounts. requests among the unusual requests are regularly bold dependencies. even requests among the furiously ironic platelets haggle c +774|7|1336|135.23|eas. carefully regular epitaphs use slyly. doggedly regular packages ought to cajole carefully under the blithely pending i +774|39|3147|262.43|ages cajole boldly. silent epitaphs boost furiously about the final pinto beans. regular, pending fox +774|71|1059|228.06|e. platelets detect even packages. even asymptotes are fluffily. special, ironic asymptotes detect carefully after the careful +775|76|7992|106.20|as breach after the final, regular deposits. slyly express packages nag. carefully unusual packages affix slyly pending deposits. final packages wake carefully b +775|8|4036|895.79|ecial, fluffy epitaphs use boldly. regular excuses wake according to the express requests. blithely ironic pinto beans affix carefully dogged accounts. thinly special platelets nag bl +775|40|3943|776.66|s haggle quickly according to the carefully ironic p +775|72|4802|597.16|sly slyly special pinto beans. final tithes impress furiously above the quickly expre +776|77|3909|641.21|ic foxes. fluffily regular packages after the quickly daring asymptotes lose quickly beside the slyly special deposits. slyly even pinto beans along the frays play pinto beans. re +776|9|4057|802.88|uickly regular accounts. carefully silent sheaves along the slyly final platelets are along the carefully pending theodolites. evenly ironic requests lose above +776|41|708|605.22| deposits boost asymptotes. fluffily even platelets sleep carefully about +776|73|8298|202.65| ideas nag fluffily furiously dogged deposits. packages affix blithely above the quickly pending requests. idly even theodolites doubt on the slyly ironi +777|78|4741|592.24|. slyly final instructions haggle. furiously regular packages integrate quickly blithely even r +777|10|7388|971.31|es. thin instructions print carefully. even excuses among the even, ironic accounts boost slyly furiously ironic instructions-- quickly regular packages integrate. +777|42|8587|198.06|e fluffily regular deposits. final instructions affix. fluffy accou +777|74|1859|344.97|requests. carefully pending theodolites cajole fluffily after the requests. special accounts grow furiously. even acco +778|79|1219|956.30|e quietly final ideas. carefully thin platelets haggle enticingly fluffily express accounts. asymptotes cajole. ironic, even ideas acro +778|11|1563|770.58|luffily regular realms-- final theodolites according to the carefully final pinto beans poach carefully special grouches. quickly even platel +778|43|1283|159.05| wake pending, express packages. unusual packages use alongside of the carefully even instructions. fluffily final packages ought to use. blithely bold accounts boost about the express +778|75|786|81.15|thy, express dependencies hinder slyly about the ca +779|80|4246|568.25|. quickly final theodolites nag fluffily ironic foxes. blithely ironic braids nag along +779|12|913|269.77|thy theodolites according to the blithely ironic somas w +779|44|5037|706.69|s haggle. quickly pending packages after the excuses sleep around the furiously silent instructions. quickly eve +779|76|8715|355.43|oost carefully across the slyly ironic requests. blithely special requests haggle slyly final instructions. furiously regular pinto beans +780|81|207|835.41|symptotes after the silently pending packages sleep furiously above the slyly special packages. carefully final deposits hang. regular +780|13|7741|841.40|eposits dazzle slyly above the theodolites. final instructions wake quickly regular asymptotes. ironic, ironic deposits haggle carefully +780|45|6152|656.20|es wake furiously quickly regular requests: carefully express requests integrate never blithely regular deposits. re +780|77|149|914.74|e final frets doze according to the slyly regular foxes. ironic accounts integrate alongside of the regular ideas. blithely daring deposits +781|82|3475|579.21|ual deposits are quickly after the slyly regular packages. blithely silent theodolites sleep. requests integrate quickly. furiously pending requests are above the regular deposits. slyly express acc +781|14|7796|764.34|ke. furiously regular deposits wake thinly. fluffily special excuses wake carefully. bold package +781|46|3424|255.15|s are. ironic, unusual deposits after the express instructions cajole amon +781|78|9903|774.28| the courts. slyly regular packages sleep slyly. regular packages cajole quickly according to th +782|83|4291|435.05|ual ideas above the furiously regular asymptotes impress around the regular, bold pains: even, silent accounts are +782|15|8886|435.51|lar, regular instructions haggle against the sometimes even requests. slyly bold accounts engage blithely. careful +782|47|8819|195.78|jole. ruthlessly thin ideas are: pinto beans integr +782|79|1883|69.76|nts; unusual, pending requests haggle fluffily busy ideas. furiously even courts are thinly regular foxes. pendin +783|84|9238|880.44|refully express deposits was furiously carefully ruthless requests. stealthily even accounts nag +783|16|2087|494.23|the fluffily even requests haggle quickly against the fluffily final warthogs. carefully final a +783|48|8701|996.04|ctions cajole slyly after the slyly final ideas. slyly ironic instructions cajole furiously regular deposits. blithely ironic deposits are after the quickly regular excuses. unusual gifts pro +783|80|72|285.01|er the quickly bold waters. special requests are. sly +784|85|8779|151.19|phins are busily final foxes. regular, regular accounts use slyly final packages. slyly unusual id +784|17|1617|810.06|quiet, busy foxes. furiously regular asymptotes haggle blithely express accounts. furiou +784|49|5295|499.87| daring requests cajole. silent pinto beans haggle blithely fluffily bold deposits. ins +784|81|7555|938.39|even accounts integrate. regular deposits wake quickly slyly final frays. sile +785|86|4685|452.75|ong the quietly even asymptotes sleep slyly pending excuses. quickly final ideas about the foxes hinder blithely fluffily ironic requests-- slyly pending instructions haggle blithely afte +785|18|2403|251.85|t requests-- carefully ironic packages wake. bold, dogged ideas haggle slyly f +785|50|2780|335.61|c excuses nag about the regular, special theodolites. blithely regular gifts use alongside of the quickly bold packages. quickly bold theodolites dazzle furiously agains +785|82|1737|412.85|s above the express theodolites snooze blithely alongside of the daringly regular foxes. quickly regular foxes among the carefully silent requ +786|87|4352|906.59|eas. slyly silent pinto beans after the furiously final packages +786|19|7441|361.62| the final, bold pinto beans haggle blithely special, unusual accounts. slyly express t +786|51|8028|83.80|ly outside the furiously final foxes. slyly permanent accounts along the even dependencies sleep fluffily against the blithely regular requests. slyly fi +786|83|7406|20.24|ccounts are slyly special, final packages. carefully special accounts engage against the even, regular requests. furiously special in +787|88|2589|839.13|ironic, bold foxes wake carefully silent courts. blithely special packages boost about the blithely express forges. carefully express theodolites across the depos +787|20|5511|522.16|nt accounts boost furiously unusual dolphins. pending packages against the furiously regular accounts are along the bold, regular package +787|52|9682|885.14|special theodolites cajole fluffily according to the never express accounts. regular instructions impress. bravely express requests integrat +787|84|9746|512.36|atelets wake quickly final deposits. carefully enticing packages across the regular, regular packages sleep blithely +788|89|9631|988.72|ajole. express, even accounts are furiously ironic pinto beans; packages above the fluffily unusual deposits cajole according to the do +788|21|5731|104.59|. enticingly special accounts cajole carefully: special, bold requests maintain furiously. furiously regu +788|53|9881|883.76|ons. fluffily bold requests sleep across the blithely ironic ideas. quickly bold deposits poach carefully. q +788|85|1853|413.50|s. blithely regular instructions against the special accounts sleep blithely exp +789|90|5756|809.45|platelets; blithely regular packages against the furiously unusual packages haggle fluffily about the regula +789|22|4353|155.27|otes promise regularly about the carefully regular packages. carefully even requests among the regular, special packages haggle carefully regular, b +789|54|5552|501.23|ully across the furiously unusual deposits. fluffily ironic requests are slyly. carefully final foxes across the special +789|86|6422|803.90|sts after the excuses nod slyly dogged accounts; slyly regular requests cajole furiously ironic excuses. slyly ironic forges about the express, even reque +790|91|1875|755.08|eodolites cajole. unusual deposits are carefully regular accounts? carefully bold requests sleep slyly above the quickly +790|23|6758|404.52|ar deposits. always regular instructions doze furiously furiously express accounts. ironic packages should have to h +790|55|6131|846.18|uests. express, regular packages wake. requests are carefully finally express accounts. pending escapades cajole furiously slyly special deposits. ir +790|87|3362|51.45|even packages. blithely furious pinto beans integrate special dependencies. unusual frays are fluffily +791|92|7727|905.14|ely ironic requests. ironic, final deposits sleep blithely dogged requests. ent +791|24|8601|18.85|heodolites. quickly permanent deposits according to the ironically final ideas detect idly quickly final packag +791|56|2113|341.91|ular accounts. express accounts nag blithely furiously regular requests. ironic foxes haggle-- regular foxes boost carefully furiou +791|88|4293|492.44|y. slyly regular packages sleep. slyly busy foxes across the carefully pending tithes breach blithely bold ideas. excuses alongside of the furiou +792|93|1076|844.74|y ironic instructions. even, final requests are. bold instructions use silent, regular accounts-- slyly final excuses doubt fluffily after the quickly p +792|25|9272|904.83|ly regular packages. ruthless instructions haggle carefully final, special courts. silently ruthless courts hinder slyly regular packages; regular, regular pac +792|57|3457|888.86| quickly among the slyly regular packages. blithely special accounts haggle. regular requests use carefully against the quickly ironic gifts. ideas wake slyly. quickly ironic ideas sleep +792|89|6779|79.65|ithely silent asymptotes boost quickly. unusual hockey players are furiously across the furiously pending platelets. furiously express requests among the furiously ironic acco +793|94|5130|210.74|ages boost carefully. blithely silent asymptotes haggle. i +793|26|3749|601.28|ular pinto beans. final ideas about the requests haggle slyly along the slyly special ideas. blithely unusua +793|58|9402|904.29|ng the silent requests. daringly express dependencies nag above the furiously final requ +793|90|4685|701.89|ts. ironic instructions against the furiously unusual accounts detect about the quickly ironic foxes. fluffily ironic accoun +794|95|3011|684.14|he regular, regular accounts. regular waters boost slyly final requests; carefully express asymptotes haggle against the carefully final packages. requests are quickly expres +794|27|4360|35.74|te carefully about the furiously unusual pinto beans. sometimes ironic courts haggle blithely ironic accounts. theodolites are slyly after the dep +794|59|9415|512.35|e the frays; ironic packages detect carefully special asymp +794|91|7087|894.55| unusual accounts. carefully final packages sleep after the furiously express packages. quickly even accounts +795|96|1465|862.72|iously ironic deposits sleep. bold requests cajole. bold, express deposits about the silently express theodolites are carefully above the furiously thin foxes. slyly dogged pinto beans use fi +795|28|4068|373.77|carefully about the permanent, unusual packages. fluffily regular pinto beans h +795|60|3561|431.29|foxes. quickly regular excuses beside the ironic, final instructions haggle furiously final, bold pinto beans? accounts against the special, ex +795|92|2981|161.48|ic accounts wake quickly pending requests. blithely furious ideas nag carefully slyly regular excuses. regular, special dolphins across the quickly final asymptotes cajole +796|97|1032|10.97|e according to the carefully even accounts. even, express deposits wake blithely after the final requests. carefully ironic theodolites integrate slyly even requests. even pinto beans +796|29|9821|895.48|c packages cajole regular, final packages. slyly final accounts wake fluffily among the blithely +796|61|3803|557.49|quickly ironic packages. bold excuses integrate against the +796|93|7359|309.61|ironic depths. fluffily express pinto beans impress +797|98|9400|962.73|sual instructions nag slyly carefully ruthless requests. furiously regular deposits boost furiously. theodolites use f +797|30|304|947.06|after the express accounts hang quickly above the iron +797|62|5891|200.52| to the ironic, final packages. quickly pending accounts integrate blithel +797|94|2586|758.66|ounts are? theodolites of the ironic accounts use furiously alongside of the regular ideas. final deposits until the slowly regular courts ca +798|99|7074|631.74|s wake slyly thin, bold packages. furiously even ideas against the slyly regular platelets sleep accounts. furiously ironic accounts +798|31|9981|449.87|egrate. unusual deposits haggle against the ironic platelets. express dependencies cajole fluffily along the fluffily final deposits. quickly even escapades bo +798|63|3332|783.02|ickly according to the carefully unusual accounts. bold accounts at th +798|95|2517|521.88|carefully according to the quickly ironic instructions. packages are silently ironic instructions. furiously bold accounts boost fur +799|100|3948|188.59|fully regular instructions cajole. slyly bold requests maintain blithely. carefully final epitaphs along the even, final deposits boost after the careful pearls. +799|32|5336|31.61| solve furiously. carefully final ideas wake furiously after the boldly final sheaves. ironic foxes boost. final, fluff +799|64|5863|31.79|ages poach: final, express pinto beans nag. even requests nag darin +799|96|8570|9.86|en accounts. unusual, special requests against the frets sleep quickly above the +800|1|7051|111.21|c, express ideas cajole after the slyly regular instructions. deposits haggle furiously slyly ironic platelets. slyly even accoun +800|33|2455|270.23|uriously silent dolphins. foxes sleep blithely among the enticingly final instructions. +800|65|7184|524.93|the special frays. ironic requests before the quickly pending requests nag furiously according to th +800|97|8994|450.34|ions use carefully along the final asymptotes. blithely unusual package +801|2|1441|704.88|s. silent requests nag quickly against the furiou +801|35|5236|886.84| boost regularly even, express requests. dogged excuses wake closely pending decoys: carefully regular accounts cajole furiously. blithely unusual accounts a +801|68|2046|95.36|ges among the blithely unusual packages cajole across the pending, special requests. express packages along the unusual ideas sleep even instructions. blith +801|1|8841|566.76| regularly. slyly ironic sauternes nag blithely. fin +802|3|3035|234.39| the express instructions haggle slyly alongside of the packages. theodolites cajole slyly after the quickly special dolphins. blithely regular asymptotes detect fluffily. th +802|36|4703|527.11|posits wake carefully ironic deposits? fluffily ironic theodolites cajole quickly blithely pending dependen +802|69|9514|248.21|ng packages. pending packages eat even, even requests +802|2|4810|27.10|s cajole braids. furiously regular ideas haggle. carefully even accounts nag. special acc +803|4|7980|233.54|lar, bold requests. bold accounts wake. special braids haggle fluffily. carefully final accounts sublate inside the fluffily final packages. slowly ironic +803|37|8444|187.64|e carefully. blithely ironic excuses wake slyly final packages. even requests haggle slyly. carefully bold platelets hinder blithely al +803|70|8800|56.84| patterns above the slyly final requests sleep carefully even requests. quick, ironic foxes nag furiously express requests? slyly regular pinto beans are slyly slyly +803|3|6113|464.32|y even requests sleep above the ironic, pending pinto beans. fluffily ironic deposits use boldly quickly ironic ideas. furiously express deposits among the blithely +804|5|455|739.37| integrate furiously across the carefully unusual packages +804|38|1521|146.30|ole blithely. special, regular accounts promise carefully ironic ideas. ideas run quickly. final deposits integrate after t +804|71|5794|619.84|lar packages. carefully regular dugouts across the +804|4|9664|295.74|ut the carefully regular excuses. silent requests wake quickly along the ironic bra +805|6|4158|614.06|e pending, final deposits. regular accounts hinder blithely carefully regular ideas. slyly special accounts are f +805|39|5156|61.87|lar attainments. quickly final dolphins haggle quickly. quickly bold foxes sleep fluffily even pinto beans. express pinto beans nod blithely among the furiously ir +805|72|322|104.62|g the quickly express dolphins. slyly even instructions nag furiously. carefully final ideas are idly above the ironic asymptotes. unusual requests haggle about t +805|5|6830|298.77|ss orbits. furiously regular deposits haggle blithely carefully final pinto beans. ironic, silent accounts thrash quickly about the accounts. iron +806|7|2301|602.27|ously carefully ironic foxes. furiously final accounts use blithely. +806|40|5367|622.66| carefully final requests breach slyly carefully ironic dependencies. quickly enticing notornis among the regular, bold deposits maintain furiously blithely i +806|73|268|596.62|cording to the even deposits. slyly pending reques +806|6|3818|591.90| deposits sleep about the quickly even pinto beans. ironic accounts haggle slyly according to the slyly even foxes. furiously final accounts mold furiously regular accounts. ironic deposits haggle +807|8|8960|131.40|y even accounts. carefully unusual requests hinder. dependencies cajole about the blithely unusual theodolites. deposits run furiously. fluffily r +807|41|3060|861.49|h special accounts. regular packages are. silently even waters are furiously. ironic packages according to the requests use above the frays. express, pending accounts are carefully slyly s +807|74|4641|648.77|carefully bold requests. bold, final excuses sleep blithely against the final, special escapades. even, final accounts serve carefully. furiously ironic platelets use final +807|7|4467|949.36|counts. packages against the slyly ironic theodolites haggle doggedly express packages. furiously final accounts haggle quickly above the regular requests. carefully final dolphins haggle fluffi +808|9|458|908.83|ions cajole. bold pinto beans along the regular deposits sleep quickly ironic packages. regular deposits s +808|42|5100|107.94|nag sometimes. fluffily regular packages maintain blithely even requests. s +808|75|5599|154.45|arefully ironic deposits. furiously regular platelets are slyly bold accounts. slyly final accounts sleep blithely blithely final multipliers. quickly even foxes nag. carefully pending a +808|8|8363|618.65| to the regular pinto beans? thinly final theodolites after the permanent deposits +809|10|5442|155.17|s requests. quickly even deposits in place of the slyly bold pinto beans wake alongside of the asymptotes. carefully regular deposits wake furiously bold epitaphs; slyly bold instructions haggle ca +809|43|7697|745.34|ns sleep carefully foxes. slyly even foxes wake carefully careful attainments. fur +809|76|1773|589.78| regular, ironic requests doze furiously. unusual packages detect furiously across the regular, regular packages. blithely ironic deposits use along the +809|9|1451|591.34|lly bold packages. deposits sleep never alongside of the requests. quickly special re +810|11|9420|713.37|le furiously slyly ironic instructions. carefully pending packages haggl +810|44|7803|835.65|ld instructions are slyly at the carefully regular pinto beans. even ideas boost carefully. regular accounts about the blithely ir +810|77|1752|32.00|ckages haggle-- quickly final theodolites are quickly deposits. express +810|10|6030|621.89|fix furiously quickly silent deposits. slyly express requests inside the regular requests sleep quickly +811|12|2279|690.57|asymptotes sublate blithely against the quickly final pa +811|45|1962|175.84|ular instructions wake; final notornis sleep furiously. furiously express +811|78|3235|508.54|ly regular asymptotes cajole final foxes. furiously final waters haggle blithely after the al +811|11|9613|741.31|ven packages nag furiously. final deposits nag carefully thr +812|13|6199|827.25|packages sleep quietly against the express packages. dependencies around the slyly ironic r +812|46|3515|587.89|al packages will wake blithely. blithely final foxes nag requests. slyly ironic deposi +812|79|6920|690.35|inst the even requests. final, unusual gifts believe slyly. forges doubt. blithely ironic dependencies ar +812|12|8903|429.24|er the regular accounts wake furiously around the silent accounts. slyly bold dependencies will boost carefully; pending e +813|14|3390|605.40|s deposits. final theodolites wake instructions. idle, regular excuses use furiously special accounts. even, pending excuses affix slyly. +813|47|1629|319.29|n foxes across the fluffily ruthless ideas wake blithely bold dolp +813|80|6555|806.17|eposits. final, pending deposits above the furiously busy accounts boost blithely quickly special +813|13|209|968.01|arefully special requests haggle carefully. silently ironic accounts mold blithely above the boldly unusual asymptotes. fluffily +814|15|1837|650.20|slyly final ideas after the bold ideas wake quick +814|48|5566|970.68|ly. even, regular accounts use throughout the express, express sauternes. sly accounts wake +814|81|4548|606.14|integrate slyly at the furiously special requests. carefully regular ideas against the even, express accounts haggle blithely ironic packages. blithely ironic ideas sleep furiously +814|14|2154|677.50|longside of the quickly fluffy pains. furiously unusual forges nag. regular excuses sleep. fluffily final packages sleep slyly regular deposits? blithely final accounts haggle ironic accounts. caref +815|16|2259|207.25|s wake furiously throughout the slyly pending instructions. pending th +815|49|8598|43.96|o beans. slyly final deposits hang furiously special, ironic requests. slyly even deposits haggle furiously bol +815|82|1973|862.76|ckages cajole slyly-- furiously even deposits sleep carefully carefully ironic asymptotes. furiously ironic packages sleep fluffily quickly final requests. pending accounts will sleep about the pen +815|15|1400|985.89|e regular, final accounts. slowly express foxes sublate +816|17|8247|524.63|r pinto beans. regular, ironic packages boost aga +816|50|962|501.82| even ideas haggle fluffily along the carefully express deposits. accounts nag. furiously final decoys thrash furiously slyly unusual excuses? blithely express +816|83|6133|729.09|atelets doze instead of the carefully ironic deposits. deposits haggle permanently ironic instructions. carefully pen +816|16|1321|243.15|l accounts sleep quietly. slyly pending foxes according to the pending, special accounts detect even, pending instructions. foxes are slyly furiou +817|18|5208|871.88|s nag slyly slowly ironic deposits. furiously spe +817|51|7306|432.49|ages shall have to sleep furiously unusual packages. carefully pending packages cajole sl +817|84|7358|282.09|ing dependencies are furiously slyly bold instructions. carefully special attainments wake blithely carefully final theodolites. furiously regular packages +817|17|2688|63.54|epitaphs. carefully ironic packages are slyly. furiously unusu +818|19|8456|307.24|nts against the quickly pending pinto beans integrate carefully along the ironic theodolites. quickly even deposits are quickly according to the +818|52|8954|136.92|r deposits. requests sleep slyly. instructions around the fu +818|85|4854|739.40| even deposits cajole unusual requests. final, regular packages cajole carefully after the fluffily b +818|18|1898|726.55|ly regular pinto beans after the furiously even requests haggle furiously slyly final deposits. carefully regular dependencies solve stealthily bravely ironic ideas. closely ironic +819|20|1104|433.90| special ideas are slyly. even, final somas among the blithely even accounts are quickly among the furiously bold sauternes. +819|53|5670|33.77|blithely express accounts dazzle quickly. regular, final accounts maintain slyly abo +819|86|5167|416.50|ong the quickly unusual packages are stealthily after the slyly ironic theodolites. theodolites are among the slyly close deposits. slyly regular accounts detect platelets +819|19|4781|316.61|y pending deposits after the furiously even packages boost furiously according to the slow excuses. express, pending plat +820|21|167|722.10| quickly silent foxes cajole final pearls. slyly regular accounts boost furiously according to the packages! express, special ideas cajole furiously express pinto beans. blithely even foxes wake sly +820|54|7032|620.55|telets wake fluffily. slyly express pinto beans cajole since the blithely regul +820|87|2432|189.91|riously special requests above the special ideas use final, expr +820|20|8580|247.19|. furiously ironic pinto beans affix slyly beyond the special accounts. never regular accounts boost carefully above the final theodolites. even packages haggle slyly carefully final packages. +821|22|8207|960.15|ve slyly even accounts. special instructions believe against the pen +821|55|6813|431.73|ross the regular requests. excuses boost according to the pending platelets. quietly silent ideas use slyly according to the even +821|88|3092|578.18|jole furiously against the close deposits: regular instructions boost slyly special theodolites. furiously regular accounts x-ray carefully pending deposits? quickly silent frets ar +821|21|9180|293.28|ts. quickly express packages are fluffily. carefully special requests wake along the deposits. blithely bold accounts detect carefully final, regu +822|23|6760|349.11| final dolphins wake fluffily ironically even accounts. carefully final instructions sleep carefully requests-- specia +822|56|7767|498.13|lites. carefully unusual pinto beans cajole according to the carefully final foxes. blithely unusual pains affi +822|89|5932|549.63|arefully final instructions are across the blithely dogged exc +822|22|6009|117.17|ntegrate. furiously pending ideas affix quickly. even packages under the regular asymptotes sleep boldly aga +823|24|857|459.64|inst the quickly bold courts. daring, enticing accounts wake furiously foxes. furiously ironic asymptotes haggle blithely? accounts detect bli +823|57|6461|44.90| haggle quickly. slyly regular accounts detect blithely. fluffily unusual excuses against the packages will ha +823|90|8632|717.58|yly final requests; final requests hinder. slyly ironic requests +823|23|8587|632.07|counts. regular accounts integrate furiously bold platelets. ironic, ironic platelets are furiously +824|25|541|53.62|ut the carefully pending accounts. regular deposits sleep furiously regular sauternes. deposits use blithely +824|58|9732|315.21|es along the regular pinto beans boost along the express theodolites. regular courts solve ar +824|91|7178|197.47|slyly final instructions against the quickly ironic packages use slyly regular pinto beans. furiously regular tit +824|24|7908|419.51|fully. fluffily special requests haggle quickly carefully ironic packages. slyly special requests nag slyly special requests! quickly p +825|26|162|996.42|accounts. furiously final platelets are slyly along the regular, brave excuses; dolphins cajole carefull +825|59|4002|612.34|nding foxes detect-- even, express platelets haggle. +825|92|4836|978.23|its. regular foxes nag carefully ironic requests! blithely ironic theodolites across the carefully un +825|25|9909|735.55|cajole: quickly final deposits affix carefully slyly final packages. slyly regular packages along the evenly regular deposits affix fu +826|27|857|965.67|nic, bold patterns nod ironic requests. closely ironic ideas sleep carefully. silent requests haggle across the ironic instructions. blithely bold courts haggle finally. sly, bold r +826|60|3147|381.46|fully ironic epitaphs among the final, even packages cajole quickly slyly even orbits. slyly silent theodol +826|93|5311|830.36|ckly after the ironic, final platelets. ironic accounts cajole furiously across the even requests. carefully regular requests along the slyly ironic deposits nag +826|26|4882|12.48|d slyly across the carefully unusual excuses. busily special deposit +827|28|9107|174.81| final pinto beans. regular requests detect slyly regular ideas. slyly express packages nag +827|61|8766|274.29|against the even packages breach blithely up the slyly regular courts. furiously ironic packages kindle slyly unusual co +827|94|581|851.78|lar deposits wake furiously regular requests; unusual, re +827|27|9535|325.32| unusual foxes. carefully final warhorses detect fluffily against the fluffily final sauternes. final, special in +828|29|4655|298.07|s the blithely ironic instructions. ironic ideas nag furiously above the final, ironic excuses. depend +828|62|7300|825.64|lyly even packages. furiously fluffy ideas above the requests sleep carefully according to the carefully regular foxes. carefully enticing requests haggle fluffily quickly +828|95|1018|529.09| instructions. final deposits across the pending, even excu +828|28|7239|467.99|lar accounts. furiously furious pains across the ironic waters boost beneath the furiously unusual theodolites. blithely final dependencies are along the furio +829|30|3846|610.52| final courts behind the carefully special courts cajole carefully after the carefully express waters. furiously even ac +829|63|1772|474.02|nal, even escapades sleep furiously carefully quiet excuses. final, special dolphins after the carefully unusual attainments unwind slyly pending accounts. slyly regul +829|96|1303|4.04|gular accounts doubt quickly. pending requests sleep. requests affix carefully express forges. final packages after the furiously special p +829|29|8760|191.80|s haggle quickly ironic accounts. carefully final deposits about the thinly regular +830|31|7873|100.94|its. requests boost carefully after the ruthlessly regular deposits. carefully unusual +830|64|1820|493.71| instructions wake quickly according to the pinto beans. furiou +830|97|7371|294.99|al pinto beans affix furiously about the special deposits-- final deposits are carefully along the blithely regular courts. pending co +830|30|3028|126.96| packages. slyly brave ideas alongside of the slyly bold accounts nag platelets. carefully regular requests along the blithely ironic pint +831|32|9983|129.33|ckages detect after the pending, final deposits! ironic, even instructions haggle carefully. final ideas haggle carefully carefully silent packages. special excuses haggle alongside of th +831|65|8093|120.22|onic, careful dolphins. slyly final platelets use carefully blithely close pinto beans-- carefully even packages sleep slyly about the daring packages. slyly ironic accounts a +831|98|1550|779.45|regular theodolites are slyly against the furiously special dependencies. special requests are furiously carefully regular ideas. silent instructions are after the furiously ironic packages! slyly +831|31|7654|386.58|st regularly. special deposits haggle furiously above the quickly final courts. unusual, quiet dolphins nag fluffily against the pending packages. fluffily unusual instructions are. brave p +832|33|3657|942.78|ions detect carefully. ironic requests detect after the furi +832|66|7531|195.32|iously brave ideas wake slyly: hockey players between the pending, silent packages might cajole deposits. furiously special theodolites above the quickly pending deposits sleep after the pen +832|99|2365|306.10|he slyly ironic deposits nag fluffily special deposits. accounts thrash quickly +832|32|7125|51.55| wake furiously ironic deposits. quickly even ideas grow careful +833|34|461|505.63|s doubt furiously ironic deposits. quickly final platelets sleep. slyly even accounts use quickly above the quickly bold deposits. carefully unusual dependencies affix along +833|67|2550|787.33|eans boost regular, bold pinto beans. even platelets haggle slyly slyly pending instructions. deposits haggle idly enticingly s +833|100|5532|94.68| requests snooze fluffily along the furiously thin deposits. ironic accounts haggle across the b +833|33|7423|53.69|its are blithely outside the quickly regular courts. slyly fin +834|35|8635|573.93|ckages; unusual sheaves cajole pending accounts. unusual pinto beans affix carefully. slyly even excuses wake blithely along the pinto beans. furiously bold instru +834|68|9559|891.53| special, final dugouts are slyly ironic requests? slyly even pinto beans doze blithely. furiously special packages wake carefully. carefully special packages boost blithely ironic +834|1|1908|114.36|p blithely! accounts wake-- fluffily pending packages haggle above the quick, final asymptotes. foxes detect pinto beans: final accou +834|34|4491|291.94|hang enticingly. quickly final accounts haggle blithely. furiously even accounts wake quickly final, regular accounts. st +835|36|4003|681.15|ackages believe blithely according to the blithely express sentiments. blithely ironic instructions use slyly after the ironic requests. carefully pending realms use quic +835|69|9638|629.13|ly according to the fluffily ironic packages. ironic excuses are quietly between the pending requests. blithely regular packages cajole fl +835|2|6535|520.91|ly slyly unusual instructions. carefully regular id +835|35|96|859.59|slyly special asymptotes. carefully final sheaves play quickly carefully bold instructions. pending requests sleep blithely. furiously silent ideas solve slyly alongside of the expres +836|37|248|718.16|cial packages mold blithely final packages. fluffily special packages breach furiously after the fi +836|70|5281|268.93|ckly above the even, express instructions. even, final waters haggle slyly across the furiously ironic packages. blithely ironic deposits solve f +836|3|7718|690.00|ly unusual requests. blithely fluffy asymptotes above the final ideas sleep +836|36|7883|569.70|ites wake slyly along the fluffily regular foxes. pending, regular requests along the slowly special requests use sometimes dependencies. bol +837|38|3126|683.32|ans. bold, bold foxes boost furiously. even pains detect alongside of the even, unusual deposits. quickly ironic foxes toward the even foxes breach slyly ev +837|71|1424|260.35|instructions sleep furiously bold instructions. blithely special packages boost slyly across the quickly unusual accounts. regular realms use after the quickly express theodolites. slyly expr +837|4|9637|377.73|ular excuses after the special, special dugouts hang ideas. furiously unusual requests around the express deposits haggle furiously final depos +837|37|8979|989.28|lar theodolites. express, ironic requests haggle carefully above the bold accounts: special accounts kindle quickly. accounts cajole blithely. slyly bold requests wake after +838|39|5844|600.38|carefully ironic packages wake blithely! quickly bold attainments about the furiously fluffy deposits doubt slyly +838|72|3945|889.76|quests are fluffily blithely regular deposits. slyly special packages dazzle slyly accounts. blithely even accou +838|5|5891|243.46| cajole across the dinos? blithely special foxes are carefully furiously regular packages. even, ironic platelets engage after +838|38|9578|120.70|n packages haggle about the carefully express deposits. regular, ironic accounts run furiously carefully ironic requests. f +839|40|826|937.36|olites around the quickly unusual pinto beans wake furiously blithely ironic accounts. bold theodolites haggle. furiously final requests wake slyly +839|73|3113|9.63|ost furiously according to the quickly even pinto beans. slyly regular frays use fluffily thin requests. stealthily bold packages wake carefully. +839|6|8879|330.34|arefully bold requests. furiously even packages sleep along the carefully even accounts. quickly unusual accounts are slyly about the slyly regular +839|39|8733|836.50|ecial deposits. quickly even deposits haggle unusual accounts; carefully bold accounts according to the bold requests haggle ruthlessly above the blithely bold accounts. furiously even ac +840|41|5222|284.59| among the theodolites. carefully final accounts solve furiously at the furiously regular requests. carefully unusual requests wake carefully express dolphins. final deposits hagg +840|74|7819|166.00|ly even instructions nag quickly idle requests! carefully regular dependencies sleep slyly above the slyly ironic e +840|7|4333|966.31|ckly against the slyly regular pinto beans. silent theodolites are carefully. carefully regular excuses haggle instructions. final requests sleep furiously slyly +840|40|2737|149.26|r foxes haggle. carefully final courts wake quickly! carefully ironic requests wake instead of the ironic instructions. even, final accounts are. foxes acro +841|42|7766|440.44|ar accounts use quickly quiet accounts. blithely bold foxes are slyly ironic packages! slyly bold ideas boost furiously after the bold asymptotes. carefu +841|75|6221|103.90| boost carefully. slyly bold instructions along the final foxes nod pinto beans. furiously final platelets use fluffily. furiously final accounts cajole +841|8|4936|236.80|inal requests along the foxes haggle carefully sometimes final requests. furiously careful requests detect furiously; blithely b +841|41|3292|169.00|y packages. furiously unusual requests are blithely among the ironic, silent packages. accounts haggle fluffily. slyly final instructions are slyly deposits. special accoun +842|43|239|433.46|, fluffy pinto beans haggle pains; ironic, regular gifts affix slyly slyly busy foxes. carefully regular dolphins use furiously carefully ironic ideas. unusual, +842|76|1069|637.31|s haggle carefully slyly unusual foxes-- blithely special platelets are blithely. unusual, even dependencies cajole carefully across the furiously even theodolites. carefully eve +842|9|7980|127.76|e about the furiously close accounts. furiously pending accounts along the slyly regular pinto beans engage blithely carefully unusual packages. ruthlessly close requests use blithely +842|42|3970|576.11|l accounts. regular ideas along the regular dolphins wake idly from the slyly final patterns. carefully final requests boost. quickly express ideas cajole slyly. ironic foxes bo +843|44|1057|558.15|fluffily quickly bold asymptotes. furiously regular requests impress furiously regular, pending foxes. express, unusual packages cajole. final +843|77|1251|310.87| furiously unusual accounts? regular platelets sleep slyly alongside of the regular, regular instructions. carefully entic +843|10|381|291.44|e carefully express pinto beans. quickly final foxes detect carefully carefully pending instructions. silent instructions cajole fluffily regular, express +843|43|1829|414.02|fluffily even pinto beans detect after the furiously ironic requests. ideas nag along the re +844|45|1928|555.16|refully pending requests above the accounts boost across the slyly regular pinto beans. careful +844|78|5515|83.64|lyly bold requests. blithely bold excuses sleep. blithely even requests sleep platelets. blithely bold requests are blithely across the carefully ev +844|11|6591|334.60|e blithely silent packages. close pinto beans nag fluffily. even requests lose. special platelets are boldly fin +844|44|2383|514.35|carefully quickly ironic deposits. accounts sleep slyly above the slyly unusual accounts. unusual accounts +845|46|241|513.25|y. even theodolites nag blithely slyly final instructions. accounts across the bold instructions poach bli +845|79|8472|63.24|carefully special accounts. regular, pending accounts boost against the always regular depo +845|12|6230|147.59|ing dependencies haggle atop the express deposits. iro +845|45|8449|246.15|g always close asymptotes. silent packages nag unusual sheaves. deposits cajole. fur +846|47|9906|484.81|ffy courts. final Tiresias are blithely slyly regular deposits. slyly expr +846|80|405|574.47|even theodolites. unusual, ironic excuses sleep blithely carefully even for +846|13|3782|985.24|. carefully ironic courts could wake. slyly express attainments use accounts. carefully special deposits wake carefully careful +846|46|8082|526.12|ans cajole carefully after the carefully special dependencies. carefully bold foxes about the final theodolites use carefully among the furiously regular platelets. furiously ironic requests +847|48|9944|606.51|ly regular instructions; slyly pending accounts wake furiously according to the unusual foxes. slyly regular instructions under the pending foxes boost against the slyly +847|81|5087|991.08| carefully regular, final foxes. slyly ironic requests believe fluffily. deposits about the carefully silent theodolites maintain carefully slowly u +847|14|4420|791.11|s wake instructions. packages according to the instructions use after the regular deposits. carefully bold requests detect alongside of the furiously ironi +847|47|1073|614.66|wake alongside of the accounts. daringly unusual theodolites cajole carefully fluffily ironic foxes. boldly ironic theodolites nag slyly furiously pending reque +848|49|1473|22.92|wake across the regular, regular deposits. pending, pending patterns sleep above the quickly pending ideas. final accounts along the packages cajole above the ca +848|82|5322|823.76|y express forges. carefully ironic ideas was carefully regular theodolites. unusual re +848|15|130|971.92| accounts according to the regular deposits sleep slyly quickly express excuses-- boldly special pinto beans wake enticingly regular asymptotes. ironic, final excuses cajole slyly at the unusu +848|48|3830|557.72|es sleep carefully. carefully final instructions wake furiously. even deposits after the quick +849|50|9836|124.57|lly ironic excuses sleep regularly express, bold frays. express packages haggle blithely. instruc +849|83|3262|900.72|p slyly regular excuses. special deposits cajole furiously a +849|16|8903|627.15|bove the careful requests nag slyly ironic packages. slyly unusual warhorses nod regularly along the regular deposits: ironic accounts boost carefully: blithely ir +849|49|4149|199.72|counts boost furiously above the final platelets. +850|51|7371|362.51|y silent, final pinto beans. furiously final instructions affix permanently even, close instructions. carefully pending d +850|84|8052|32.69|nto beans to the packages haggle carefully slow theodolites. quickly pending pinto beans use furiously furiously ironic dependencies. even packages against the quickly e +850|17|2205|219.21| blithely bold accounts haggle furiously according to the carefully final packages. furiously unusual accounts haggle furious +850|50|6897|97.18|c platelets haggle fluffily! fluffily silent packages sleep carefully even instructions. ironic asymptotes s +851|52|5555|252.06|de of the pending, sly requests. quickly final pinto beans affix furiously. bold ideas cajole quickly. instructions are slyly. quickly pending instructions snooze furiously according to the blithel +851|85|228|807.47|riously above the regular deposits. regular, bold accounts x-ray fluffily regular deposits. ironic, even packages are to the blithely ironic theodolites. carefully regular accounts use. +851|18|5975|914.36|ts! daringly special accounts cajole slyly quickly ironic deposits. furiously ir +851|51|7975|76.31|ets wake furiously against the fluffy, bold requests. final epitaphs are slyly against the blithely regular braids. daringly +852|53|544|124.54|ously evenly even requests. furiously ironic deposits wake. regular +852|86|850|456.42| special asymptotes. furiously unusual accounts after the furiously even dependencies serve final ideas. carefully final instructions wake quickly across the blithely quiet pa +852|19|759|860.57|unts wake fluffily. furiously bold accounts along the carefully regular platelets nag blit +852|52|3434|171.71|nts cajole blithely fluffily regular accounts. furiously express courts affix blithely requests. carefully final foxes sleep after the quiet, final pinto beans. blithely regular +853|54|6185|110.36|quickly thin asymptotes cajole quickly across the carefully regular packages. slyly regular foxes use car +853|87|4585|1.69|uffily along the slyly regular pearls. regular requests haggle. furious +853|20|8724|644.06|es about the final requests try to boost alongside of the regular pinto beans. slyly bold deposits unwind slyly. reg +853|53|256|739.19|packages haggle regular foxes! regular dolphins about the blithely quick Tiresias nag along the blithely unusual instructions. carefully even deposits detect fluffily. sly +854|55|4415|85.82|ruthlessly final instructions sleep after the ironic dolphins. fluffily exp +854|88|7846|110.61|e. blithely bold foxes cajole quickly even foxes. slowly bold instructions are fluffily above the quiet packages. furiously final accounts poach quickly ironic grouches. +854|21|9727|56.70|tions boost carefully unusual requests. always express Tiresias haggle furiously. pending, ironic pinto beans about the +854|54|5470|187.15|ly special packages. carefully unusual platelets according to the carefully even packages wa +855|56|247|769.14|regular packages poach furiously. blithely unusual ideas sleep furiously final requests. slyly bold pinto beans mold. +855|89|5037|20.09|oxes hinder permanently. furiously express accounts impress furiously. +855|22|760|266.40|. sometimes special packages haggle furiously. pending theodolites detect. dependencies are qu +855|55|1601|160.85|lyly regular ideas haggle evenly. blithely final deposits after the regular, even ideas use accounts. +856|57|4108|366.92| ideas-- even deposits above the even accounts sleep regular warhorses. express accounts sleep thinly carefully ironic ideas. instr +856|90|360|266.53| use after the regular sentiments. fluffily silent accounts wake carefu +856|23|7616|187.39|ly foxes. blithely ironic deposits sleep blithely accounts. furiously pending ideas sleep carefully regular pinto beans. even, ironic epitaphs unwind blithely slyly iro +856|56|2905|761.40|onic deposits according to the pending deposits cajole slyly slyly regular requests. carefully even accounts wake ironic ideas. carefully bold accounts nag slyly unusual platelets. ironic id +857|58|7579|708.22|ily slyly dogged pinto beans. carefully final packages wake finally. silent deposits grow along the slyly silent platelets. theodolites haggle. slyly bold theodolites across the b +857|91|9068|52.68|lar accounts was; furiously final dependencies are. final accou +857|24|9900|510.10|kly regular accounts detect evenly against the ironic sheaves. furiously express dependencies nag furiously. carefully unusual dolphins integrate slyly. carefully unusu +857|57|9270|999.64|furiously pending pinto beans. special, bold instructions wake regularly. blith +858|59|3244|784.88|s haggle blithely regular deposits. foxes detect slyly bli +858|92|9839|739.66|eposits haggle. final pinto beans wake. slyly regular instructions use blithely bold deposits. carefully bold packages use ironi +858|25|4312|11.94|ly. express, ironic packages wake. accounts nag according to the even requests. +858|58|4333|163.97|e. fluffily blithe accounts use slyly. blithely express instructions boost. bold dependencies use quickly. packages according to the dependenc +859|60|7405|767.58|tructions. carefully regular foxes against the platelets are carefully alongside of the regular, final foxes. even, ruthless asymptotes are. foxes nag fluffily bold e +859|93|6111|686.66|unts. daring, even deposits are blithely special accounts. ironic accounts lose. busily even packages after the carefully even i +859|26|2128|330.52|ost slyly. pending theodolites promise furiously. carefully ironic pinto beans engage alongside of the quickly final ideas. slyly even dolphins among the even deposits haggle above th +859|59|5980|869.77|olites sleep according to the regular, bold accounts. slyly express pinto beans against the carefully silent requests wake blithely across the furiously pending packages. do +860|61|2966|43.07|he slyly unusual theodolites cajole furiously even, ironic somas. pinto beans are slyly alongside of the spec +860|94|2825|898.02|nts nag ironic, silent dependencies: carefully final pa +860|27|1771|291.86|pitaphs are across the fluffily regular foxes. final deposits about the regular dependencies cajo +860|60|418|411.05|gular theodolites sleep. quickly even deposits solve furiously. regular somas use. final asymptotes boost carefully at the blithely furious excuses. silent, bold package +861|62|3897|546.98|ic foxes haggle. dependencies cajole across the bold, special braids. even pinto beans breach blithely regular requests. fina +861|95|7328|420.72|ies above the slyly regular instructions nag quickly special dependencies. carefully silent dependencies across the slyly +861|28|8734|229.45|requests wake. blithely regular accounts across the furiously ironic deposits sleep carefully ironic dolphins. quickly pending theodolites among the silent dolphins breach carefull +861|61|6664|473.19|requests. ironic, express pains haggle quickly along the ironic theodolites. carefull +862|63|7729|33.00|al packages. ironic requests believe carefully slyly pending ideas-- blithely final theodolites eat carefully about the slyly special requests. carefully even acc +862|96|3154|455.17|ts are slyly. blithely express deposits wake slyly since the regular requests-- pending requests are furiously along the ironic, bold asymptotes. slyly ironic packages +862|29|3777|927.37|l pinto beans. bold hockey players cajole carefully unusual, quick theodolites. special accounts haggle carefully. carefully even deposits wake. furiously pending ideas integrate asymptote +862|62|6866|969.74|xpress packages nag blithely even requests. quickly careful pinto beans wake carefully carefully regular pack +863|64|2856|843.60|ly slyly even deposits. furiously regular requests alongside of the never even requests cajole furiously blithely regular requests. even deposits sleep silently t +863|97|1978|703.69|s the foxes! instructions nag among the even, regular packages. unusual packages nag according to the slyly permanent requests. fluffily unusual requests are. u +863|30|4406|843.33|blate quickly fluffily regular excuses. unusual instructi +863|63|5619|136.83|ven dependencies boost ironic, unusual accounts. ironic packages pl +864|65|6309|180.05| ought to wake furiously. ironic accounts lose. slyly f +864|98|9226|404.16|ress fluffily furious packages. furiously final requests hang. final, regular theodolites detect blithely. express accounts according to the slyly spe +864|31|7303|714.43|s. slyly unusual foxes boost carefully among the carefu +864|64|1238|640.78|ress packages. carefully quiet theodolites wake according to the accounts. furiousl +865|66|1248|447.31|usy deposits use furiously carefully bold escapades. silently silent dolphins nag slyly special theodolites. furiously quiet ideas wake pe +865|99|7153|684.98|wake furiously blithely regular deposits. carefully silent theodolites are furiously among the final, even instructions. instructions along the fluffily ironic platelets poach according to the blit +865|32|9385|72.11|y slyly pending deposits. carefully regular deposits nag carefully around the blithely bold instr +865|65|7463|378.61|ackages about the furiously express platelets haggle blithely above the quickly regular pinto beans. carefully even requests sublate blithely. unusual dolphins use thinly fluffily i +866|67|2209|905.37|g to the slyly even ideas detect blithely regular accounts. even hockey players haggle. busy +866|100|627|866.72|ounts. regular requests alongside of the blithely fur +866|33|4388|627.40|sts haggle carefully carefully unusual ideas. carefully regular accounts are furiously along the permanent theodolites. silent dinos serve blithely packages. special acco +866|66|8394|476.91|ely unusual packages sleep quickly. furiously regular requests nag! slyly even ideas nag after the carefully unusual deposits. ideas cajole packages. slyly even +867|68|9167|551.21| slyly about the furiously even instructions. bold, ironic packages against the blithely pending request +867|1|995|587.35|ts. packages around the ironic foxes sleep carefully dolphins. closely final excuses sleep blithely among the fluffily even packages. blithely even packages haggle furiously special, unus +867|34|4023|696.43|nal accounts about the final, enticing accounts haggle around the ironic, unusual asymptotes. slyly regular notornis acco +867|67|773|833.46|ess packages solve; slyly regular requests haggle slyly. packages cajole fluffily among the slyly ironic accounts. blithely regular warhorses believe fluffily +868|69|4076|81.76| against the furiously even packages. platelets dazzle. quickly r +868|2|3534|760.24|ages alongside of the unusual theodolites cajole bold deposits. blithely regular theodolites cajole blithely: blithely regular accounts sleep quickly after the fluffily regular ideas. express, sil +868|35|2122|352.73|he theodolites. final requests affix. slyly unusual packages above the ironic, ironic dolphins boost blithely +868|68|5761|450.77|ctions cajole? bold packages kindle above the regular, special accounts. regular, p +869|70|8181|917.87|kly final deposits. bold, bold theodolites sleep furiously after the slyly regular asymptotes. silent foxes cajole slyly. ironic packages sleep quickly near the quickly ex +869|3|7324|216.09|after the regular, stealthy accounts wake quickly above the pinto beans. express foxes detect furiously ironic courts. carefully even braids nag according to the bravely ironic dolphins. +869|36|5477|762.32|tructions. blithely regular packages eat slyly. slyly regular braids after the carefully pending excuses sleep ironic pinto beans. carefully express pinto beans wake after the slyly even +869|69|130|295.72|sleep blithely ironic pinto beans. blithely silent requests sleep carefully around the blithely final deposits! ironic instructions cajole along the final instructions. slyly express realms sle +870|71|9259|289.76|cial ideas could have to haggle at the furiously final ideas. quickly silent +870|4|5492|137.42|s wake ironically-- blithely pending ideas sleep quickly around the requests. quickly bold requests wake quickly according to the instructio +870|37|2010|107.06|dolphins. deposits haggle. pending asymptotes haggle fluffily above the carefully unusual deposits. quietly ironic instructions sleep carefully. spe +870|70|2020|408.49|ounts. carefully ironic deposits haggle carefully pending requests! quic +871|72|6748|482.91|s the special, ruthless sheaves haggle carefully after the carefully pending deposits. regular, even accounts against the express ideas poach furiously accordi +871|5|2497|633.51|ter the ideas. carefully busy deposits are at the blithely regular dolphins. careful warthogs are fluffily. slyly express requests believe quickly ironic theodolites. +871|38|5725|280.34|excuses affix furiously bold accounts. accounts after the pending pac +871|71|1391|641.12|. fluffily sly warhorses solve after the slyly express theodolites. furiously ironic theodolites cajole. unusual packages haggle carefully. s +872|73|5572|274.93|efully even pinto beans. even courts wake carefully-- quickly regular decoys thrash slyly. fluffily ironic requests cajole +872|6|8098|669.74|ly pending packages. requests wake carefully ironic, unusual dependencies. carefully pending pinto beans wake after the blithely special instructions. fluffily quiet requests +872|39|8629|749.50|arefully at the quickly regular ideas. unusual packages are carefully among the express pinto beans. blithely unusual deposits boost +872|72|6277|597.42|y along the fluffily ironic platelets. ironic theodolites lose carefully about the carefully daring requests. slyly regular foxes along the regular dependencies haggle furiously final de +873|74|8493|128.98|beans. fluffily regular warthogs are sometimes around the quickly bol +873|7|5291|125.92|ainst the platelets. pinto beans detect furiously above +873|40|394|672.24|to beans-- regular deposits boost quickly unusual foxes. quickly regular theodolites use quickly deposits. furiously regular deposits above the fur +873|73|5564|713.93|sts wake busily furiously bold accounts. blithely even theodolites wake after the carefully unusual ideas. carefully silent pearls affix furiously above the slyly ir +874|75|31|220.95|g to the requests nod above the express, final platelets. furiously pending requests are around the regular foxes. slyly pending deposits wake quickly alongside of the carefully ironic excu +874|8|6879|440.27|ding, unusual packages. final requests sleep slyly. furiously pending account +874|41|3027|275.73|imes final instructions. regular, final requests sleep quickly final dependencies. slyly even requests wake carefully. even ideas after the ironic accounts integrate a +874|74|1195|109.49|ns poach daringly against the slyly ironic foxes. ironic, sly realm +875|76|5325|230.60| the quickly regular deposits. packages after the silent platelets haggle fluffily carefully regular packages. special pinto beans are +875|9|9852|877.05| accounts impress slyly express foxes. slyly silent theodolites above the slyly final foxes +875|42|6282|458.39|ely bold deposits wake against the quickly even dinos. blithely regular warhorses affix quickly at the even accounts. ironically careful foxes cajole slyly slyl +875|75|9349|976.61|ages run bold notornis. requests eat carefully across the furiously even pinto beans. quickly even requests use fluffily against the even pinto beans. r +876|77|2213|380.59|s packages about the quickly ironic warthogs cajole in place of the deposits. +876|10|2355|223.95|yly express requests cajole even, regular asymptotes. foxes after the pending foxes cajole slyly slyly ironic requests. i +876|43|6600|988.32|en packages x-ray fluffily. slyly regular forges kindle blithely asymptotes. furiously regular deposits boost around the slyly regular depend +876|76|3579|490.84|ully regular theodolites sleep always regular, bold instructions. furiously final ideas cajole along the alway +877|78|5315|6.74|side of the furiously express platelets. express orbits integrate. ruthlessly ironic packages hang about the furiously pending packages. final instructions sleep carefully fin +877|11|2095|604.40| special ideas. regular, bold deposits boost carefully carefully pending accounts. pending, regular instructions are quickly quickly bold dependencies. deposits integrate furiously against the +877|44|4539|403.22|ss ideas use express pinto beans. blithely ironic packages kindle quickly blithely ironic platelets. f +877|77|129|978.40|timents haggle of the final, furious dinos. requests snooze furiously. fluffily regular dependencies impres +878|79|2294|580.15|. quickly even theodolites boost slyly regular, final foxes. blith +878|12|6560|585.92|nic epitaphs. ironic packages haggle idly around the carefully furious asymptotes. final foxes haggle carefully after the blithely silent packages. slyly pend +878|45|3237|601.96|inst the final foxes thrash blithely regular, idle foxes: final, special packages are carefully into the furiously even packages. quickly express accounts around the fluffil +878|78|5677|469.27|foxes. stealthily even grouches among the unusual packages cajole express ideas. furiousl +879|80|8603|68.26|ts. slyly ironic theodolites above the carefully even packages lose furiously aft +879|13|583|576.93|ly regular orbits. unusual, ironic dependencies sleep slyly above the f +879|46|1936|357.70|te quickly. slyly unusual hockey players are quickly after the furiously ironic pinto beans. slyly silent dependencies are bold realms. blithely final pinto beans haggle slyly furiously bold idea +879|79|1669|160.62|es according to the fluffily bold dugouts eat even, bus +880|81|31|528.04|e blithely regular deposits sleep blithely around the quickly unusual requests: furiously ironic dependencies sleep sometimes. ruthlessly final foxes above the regular asymptotes use quickly +880|14|1492|822.42|ietly even dependencies use! quickly regular ideas against the regular foxes cajole sly +880|47|8990|355.16| ideas. dependencies play blithely according to the fluffily express theodolites: special packages sleep carefu +880|80|272|293.25|e the final ideas. theodolites alongside of the furiously express requests use through the slyly ironic requests. furiously special accounts detect furiously even asymptotes. special a +881|82|3507|836.88|usual deposits. slyly final theodolites use. regular packages about the furiously regular foxes sleep alongside of the slyly final asymptotes. unusual decoys nag about the express, regular reques +881|15|9524|636.63|efully about the special, special ideas. carefully ironic requests doubt slyly +881|48|5726|784.20|ts are slyly. regular packages wake furiously: ideas are special request +881|81|6188|360.75|ual braids cajole across the furiously bold requests. slyly ironic ideas integrate furiously fl +882|83|5684|408.34| multipliers boost across the final packages. unusual foxes sleep carefully. regular pinto beans use fluffily. slyly special theodolites are. slyly pen +882|16|8673|959.68|ess theodolites affix. slyly slow foxes along the carefully ironic +882|49|745|611.37|ial theodolites solve carefully blithely regular packages. carefully bold deposits use +882|82|9924|704.76|s. blithely even excuses are blithely express, pending +883|84|5055|898.69|ar accounts are furiously above the bold theodolites. accounts sleep fluffily fluffily final accounts. carefully special accounts i +883|17|7098|550.59|daring packages. packages sleep furiously through the carefully bold accounts. ideas after the blithely fin +883|50|6826|147.18|. deposits boost: slyly ironic requests are finally. unusual, ironic theodolites caj +883|83|9812|341.27|slyly unusual deposits. furiously even deposits wake. blithely express foxes wake furiously across the bold deposits. slyly even foxes integrate. carefully spe +884|85|3166|665.66|platelets. instructions alongside of the final theodolites nag after the regular, pending dolphins. blithely regular ac +884|18|882|46.31|he express, regular deposits. closely silent excuses nag quickly ironic deposits. carefully quiet excuses cajole pending accounts. theodolites sleep quickly. blithely eve +884|51|4190|282.99|ackages above the packages cajole along the furiously pending ideas. blithe +884|84|1514|229.51|al accounts. even theodolites sleep fluffily across the patterns. special waters behind the regular somas sleep carefully abo +885|86|7749|521.33| packages are according to the even deposits. ideas about the slow, regula +885|19|4112|20.52|s believe special, regular accounts. even, ironic courts sleep quickly? blithely regular excuses affix closely. accounts are across the slyly bold +885|52|1939|431.60|refully. final, unusual packages along the ironic deposits nod packages. bol +885|85|9596|398.71|theodolites haggle across the ironic accounts. furiously furious instructions cajole. pending, regular dugouts nod furiously. slyly expr +886|87|4069|19.56|r requests across the carefully final deposits nag ironic ideas. unusual dolphins nag furiously near the furiou +886|20|2513|266.96| requests sleep final requests. pearls cajole carefully pending accounts. quickl +886|53|7566|436.45|c patterns cajole. requests after the furiously even packages wake blithely across th +886|86|6239|873.69|ter the slyly express pinto beans. packages unwind furiously. slyly pending accounts cajole around the slyly ir +887|88|8389|982.92|hely. fluffily pending accounts sleep against the even, regular instructions. slyly unus +887|21|6367|533.95|s. even requests alongside of the furiously bold cou +887|54|1181|221.08|s the deposits. unusual packages use blithely. furiously quiet ideas shall are. quickly reg +887|87|6844|668.61|uffily final dependencies. furiously ironic foxes cajole about the fluffily regular foxes. carefully regular dolphins hagg +888|89|6664|660.53|y bold requests. blithely blithe instructions affix slyl +888|22|9155|724.37|ost bravely atop the finally bold accounts. even requests above the regular, final requests do eat regular, regular deposits. specia +888|55|8547|855.05|cial, unusual packages haggle blithely carefully unusual excuses. slyly unusual packages nag quickly. blithely ironic foxes detect quickly against the unusual, regular pin +888|88|7959|348.43|ag furiously according to the unusual, regular pinto beans. ironic, final ideas cajole about the +889|90|5025|87.06|ly final requests haggle. furiously ironic packages hinder. slyly even foxes wake furiously. accounts use furiously. fluffily ironic Tiresias haggle carefully +889|23|341|931.12| blithely slyly blithe asymptotes. foxes haggle carefully about the quickly thin theodolites. deposits according to the slyly ironic t +889|56|1669|108.99|along the silent, pending theodolites. busily even accoun +889|89|9227|874.87|egular packages among the carefully ironic requests will have to cajole carefully about the blithely even instructions. blithely regular instructions solve blith +890|91|2292|790.64|ress dependencies. platelets cajole fluffily carefully bold deposits. requests use. accounts serve blithely above the deposits. dependencies wake fluffily. fluffily pending requests +890|24|1665|707.19| unusual accounts boost slyly blithely bold packages; pending, even dependencies wake. orbits boost slyly quickly even packages. slyly unusual warthogs wake caref +890|57|5700|817.88|eposits cajole slyly after the carefully express sauternes. slyly bold deposits haggle even deposits. accounts sleep! blithely express excuses x-ray fluffily according to the final courts. furiously +890|90|8226|986.32|thely unusual packages. furiously pending accounts mold furiously even dependencies. ironic, ironic requ +891|92|5260|811.29|kly final packages use at the enticingly daring deposits. furiously bold ideas lose blithely final packages. quickly careful theodolites cajole ruthlessly furiou +891|25|1302|179.77|requests lose furiously. even requests haggle wart +891|58|8611|710.08|uickly ironic deposits integrate even accounts. silent, regular foxes boost unusual, expre +891|91|3838|373.25|l pinto beans above the slyly silent dolphins sleep daringly quickly bold pinto beans. express pinto b +892|93|5917|660.43|e carefully ironic packages. pinto beans integrate across the blithely +892|26|2607|76.21|thely pending foxes. quickly special deposits integrate. slyly idle foxes across the pending orbits sleep carefully against the carefully ironic deposits. carefully ironic instructions haggle afte +892|59|3775|395.07| carefully dogged ideas are blithely express pinto beans. enticingly ironic platelets alongside of the carefully pending pains are carefully blithely ironic courts. regular, ironic deposits boo +892|92|9558|708.03|uriously regular warthogs. regular deposits are about the furiously pending platelets. quickly final asymptotes cajole f +893|94|1729|887.02|ogs. blithely silent deposits will have to poach regular, even fo +893|27|4336|259.58|al courts. ironic, regular excuses wake busily quickly regular deposits. dependencies doze quickly fluffy requests. carefully ironic escapades are; furiously even courts use ca +893|60|9057|320.12|oxes cajole furiously. quickly final requests sleep furiously sly +893|93|6796|844.47|regular excuses can use blithely inside the regular, ironic packages. carefully special ide +894|95|1433|324.60|use special, regular foxes. blithely regular warthogs are furiously blithely regular packages. slyly regular instructions cajole blithely after the carefully final deposits. +894|28|4915|295.89|accounts haggle slyly against the ironic, ironic foxes. even dependencies according to +894|61|6842|261.96|he blithely regular deposits. bold deposits along the carefully express exc +894|94|4562|453.68|s wake slyly fluffily regular accounts. fluffily even platelets wake carefully +895|96|5570|805.95|encies haggle requests. bold, regular pinto beans snooze blithely above the blithely unusual ideas. fluffily daring request +895|29|2385|217.37|blithely pending foxes cajole above the furiously even depths. +895|62|3334|300.24|ess deposits sleep regular, regular deposits. carefully regular dugouts kindle furiously against the busy ideas. regular excuses sle +895|95|9654|450.13|express asymptotes. blithely permanent frets detect blithely pending pinto beans. express instructions alongsid +896|97|5966|132.12|carefully final deposits cajole carefully among the ir +896|30|6567|22.07|furiously even dolphins. quickly pending accounts sleep: furiously ironic frets haggle furiously slyly regular requests. ideas across the sometimes express ideas integrate furiously against +896|63|6849|594.88|pecial dependencies across the accounts haggle carefully across the carefu +896|96|7655|382.96|c deposits wake carefully unusual pinto beans. regular, ironic requests wake furiously according to the special packages. warthogs affix slyly during the f +897|98|9271|33.17|he blithely regular requests. even packages sleep carefully even pinto beans: blithely special +897|31|7779|236.90|. instructions are blithely blithely silent accounts. carefully regular requests haggle requests. express packages could print. quickly final foxes alongsid +897|64|3436|851.96|ven deposits. regular sauternes across the ironic, special instructions serve alongside of the fluffily pending requests. final id +897|97|2110|368.66|quickly bold accounts. fluffily final packages serve above the carefully furious requests. blithely express pinto beans sleep blithely even pinto beans. fluffil +898|99|1670|476.80|ickly. blithely final theodolites boost ironic ideas. blithely even deposits about the slow instructions nag carefully abo +898|32|3350|778.09| final foxes serve quickly silent foxes. requests against the sometimes ironi +898|65|7539|595.27|s sleep fluffily requests. furiously bold ideas impress carefully. fluffily special patterns until the express, regular instructions was blithely ironically special accounts. regular packag +898|98|7940|933.77|attainments. hockey players boost regular, regular pearls. slyly even theodolites affix quickly after the carefully regular deposits. silent accounts wake among the requ +899|100|446|736.47|egular instructions play above the daringly regular requests. slyly pending deposits are furiously. sentiments are furiously along the blithely special forges. re +899|33|785|384.70|t fluffily furiously regular packages. furiously even packages w +899|66|3747|374.07|carefully final, final excuses. special foxes around the express accounts wake around the bold warthogs. ideas about the quickly bold pinto beans haggle against the theod +899|99|8453|429.83|ze blithely about the carefully even packages. carefully final accounts are. carefully express accoun +900|1|1133|584.06| even epitaphs. ironic accounts cajole stealthily quickly even excuses. fluffily final accounts cajole slyly instead of the furiously e +900|34|6876|262.30|mptotes poach furiously according to the furiously special dinos. blithely even foxes sleep carefully. blithely ev +900|67|1586|103.87|ckages. carefully final requests are furiously around the blithely final multipliers. fluffily regular ideas cajole furiously even deposits. slyly regular ideas haggle blit +900|100|2030|803.67|o the blithely pending ideas. carefully bold deposits wake. even instructions haggle carefully slyly brave requests. special, regular dugouts nag fluffily express accounts. ironic, un +901|2|7364|943.14|ecial requests use alongside of the fluffily final dolphins. deposits are furiously until the special +901|36|4471|371.76|ily pending, bold accounts. instructions use furiously. blithely regular foxes +901|70|7122|585.92|nst the carefully ironic deposits. furiously final ideas grow. furiously regular instructions wake carefully slyly unusual pai +901|4|9510|549.36|e furiously silent foxes. slyly special accounts snooze blithely. express, pending theodolites according to the final, +902|3|8617|483.02|ly even, pending packages. special theodolites cajole along the slyly even foxes. furiously pending asymptotes along the always even ideas +902|37|9735|355.36|ongside of the slyly final foxes. blithely even theodolites across the slyly even instructions are quickly after the carefully +902|71|8166|778.64|nstructions nod across the requests. fluffily careful excuses past the ruthlessly pending +902|5|7960|899.19|ic, ironic requests cajole slyly. furiously regular packages according to the final excuses snooze daringly pending packages-- express, expres +903|4|2639|3.37|. furiously fluffy ideas are furiously. regular, expr +903|38|6434|12.37|ges wake. blithely ironic asymptotes boost blithely carefully ruthless deposits. carefully even excuses wake furi +903|72|1483|421.00|arefully furiously ironic theodolites. slyly even asymptotes along the regular accounts haggle carefully among the carefully even ideas. slyly bold requests wake against the ironic pa +903|6|9074|49.24|efully express, ironic foxes. pending packages lose among the blithely special accounts. dolphins are above the fin +904|5|263|679.07|quests. final pinto beans use among the foxes. sly courts sleep across the bold, regular foxes. frays haggle slyly across the even, even dolphins. grouches doubt blithely ironic requests. qu +904|39|7551|635.10|p against the packages. deposits haggle carefully above t +904|73|3690|3.91|deas lose fluffily against the pending requests. express, ironic pinto beans are carefully regular dependencies. slyly pending accounts sleep slyly. express packages thrash acro +904|7|3396|50.08|e carefully. quickly ironic pinto beans boost blithely ironic requests. ironic as +905|6|3562|759.20| the slyly even dolphins. carefully ironic theodolites cajole carefully across the carefully final ac +905|40|7593|718.15|s. instructions doze deposits. even deposits sleep furiously realms. furiously final instructions must cajole against the slyly ironic pearls. quickly regular pinto bean +905|74|2827|137.60|thely final, pending deposits. ironic, express accounts are at the blithely final accounts. blithely regular account +905|8|5818|118.80|closely bold packages haggle furiously final requests. regular requests cajole slyly. carefully final asymptote +906|7|9257|911.16|ckages across the furiously ironic accounts are blithely regular accounts. care +906|41|3730|278.81|ously express deposits. carefully final asymptotes boost thinly. final requests use finally alongside of the +906|75|2997|835.73|eposits. final, final accounts around the furiously unusual excuses kindle thin deposits. pending, regular deposits grow furious +906|9|6048|301.39|de of the express packages. even accounts sleep furiously after the final deposits. blithely regular theodolites sleep. blithely bold for +907|8|4812|734.07|se doggedly pending pinto beans. slyly special dependencies haggle slyly among the quietly even packages. sil +907|42|5923|31.43|ic ideas. even theodolites are after the even asymptotes. accounts detect. blithe +907|76|8332|69.55|e quickly pending packages! slyly regular dependencies above the furiously regular dependencies impress among the fluffily special deposits. even deposits above t +907|10|6931|272.16|requests cajole among the accounts. slyly bold pinto beans are. fluffily bold packages cajole slyly bold packages. quickly express platelets alongside o +908|9|1371|52.87|g against the fluffily special excuses. special packages cajole. pending asymptotes boost furiously according to the carefully even courts? bold dolphins nag furiously even +908|43|1944|781.29|t the blithely pending instructions. blithely even packages cajole furiously caref +908|77|9020|453.31|ites serve quickly unusual deposits. ideas wake pinto beans. ideas are final, pending courts. carefully careful platelets despite the silent warthogs haggle carefully slyly regular +908|11|2951|587.78|ly even pinto beans haggle slyly always express dependencies. furiously bold theodolites among the furiously ironic foxes hinder busily +909|10|4672|788.00|. carefully bold foxes wake furiously. special pinto beans according to the quick, bold packages wake slyly among +909|44|460|380.65|, regular instructions sleep blithely fluffily express requests. special packages thrash. slow, permanent asymptotes nag carefully accounts; bravely even dolphins are +909|78|3978|198.61|se along the carefully express accounts. foxes are slyly. furiously pending deposits are furiously furiously quiet theodolites. unusual accounts wake. pending platelets promise +909|12|8468|652.49|xpress asymptotes detect furiously final accounts. ruthless pinto beans use slyly boldly unusual multipliers. slyly regular deposits are furiously s +910|11|658|532.78|ans. quickly final excuses cajole at the packages: final excuses at the slyly ironic excuses are blithely across the final, regular requests. slyly quick ideas af +910|45|4353|624.35| regular deposits. carefully pending packages are furiously. slyly daring packages wake fluffily. final, express r +910|79|939|174.43|riously unusual hockey players. carefully regular grouches after the quickly even escapades haggle slyly regular requests. final, ironic accounts sleep w +910|13|8620|828.20|boost furiously final requests. slyly express deposits sleep final deposits. deposits after the blithely bold instructions are express ideas; regular pinto beans should +911|12|4794|538.99| along the fluffily ironic deposits. furiously special requests are blithely. carefully unusual pinto beans are furiously regular, unusual accounts. regular account +911|46|7298|960.70|ully silent orbits nag after the express, thin instructions. deposits haggle slyly fluffily final asymptotes. even deposits use blithely across the slyly dogged accounts. carefully expr +911|80|8509|725.79|ironic deposits cajole blithely. fluffily silent theodolites according to the express foxes affix sly +911|14|4212|777.51|e blithely alongside of the thinly pending pinto beans. slyly even requests are blithely requests. +912|13|6655|749.70|ep carefully express pinto beans. final braids haggle blithely about th +912|47|4031|27.94|bold pinto beans sleep blithely alongside of the blithely quiet fox +912|81|4657|353.63|sly ironic requests wake slyly. quickly regular packages nag. ironic instructions according to the pending, silent request +912|15|6025|691.44|ding theodolites wake quickly carefully regular packages. requests wake fluffily. fluffily regular accounts after the slyly ironic dependencies wake quic +913|14|216|844.28|e idly regular excuses. slyly ironic requests wake across the slyly permanent packages. quickly bold accounts boost carefully. final, +913|48|2785|152.89| packages. ironic, blithe deposits haggle slyly among the carefully unusual platelets. quickly ironic reque +913|82|3666|397.94|gular deposits are. furiously final deposits integrate ironic accounts. express, ironic deposits sl +913|16|1380|26.01|ole according to the quickly final theodolites. furiously f +914|15|636|810.56|y about the carefully express theodolites. slyly regular deposits cajole. carefully express pinto beans hang across the blithely fina +914|49|5204|834.40|ages boost slyly above the slyly silent sauternes. carefully final accounts detect. always thin accounts cajole at the sp +914|83|4678|999.65|lyly alongside of the furiously quiet instructions. slyly final account +914|17|3039|963.44|ccording to the blithely even pinto beans. furiously special deposits wake furiously around the re +915|16|2667|799.60|sly regular foxes. quickly even pinto beans around the final, regular sheaves wake above the bold dependencies; unusual theodolites wake aft +915|50|9197|525.78|r the final, even deposits should have to are alongside of the carefully careful attainments. blithely ironic theodolites sleep quickly among the furiously ironic packages. even requests +915|84|8311|815.03|lites haggle furiously express ideas. requests are blithely blithely ironic requests. pending dependencies are busily blithely even excuses. furiously ironic d +915|18|5274|106.40|ge carefully quickly regular asymptotes. carefully ironic dinos detect slyly ironic pinto beans. even foxes nag slyly. carefully ironic decoys hang along the carefully permanent depos +916|17|530|276.96|carefully bold instructions haggle against the special deposits. regular frets a +916|51|6289|735.07|excuses. pending, ironic theodolites within the even foxes affix among the carefully regular pinto beans. unusual accounts unwind slyly. regular, even requests a +916|85|6385|782.26|ies use furiously carefully express excuses. regular, express accounts wake carefull +916|19|6981|813.63|ully final packages haggle special instructions. unusual attainments integrate. foxes against the packages haggle express d +917|18|6787|414.86|he silent ideas. furious realms boost slyly against the theodolites. stealthily regular asymptotes sleep slyly. even gifts through the express deposits cajole ac +917|52|6086|711.89|nic instructions breach against the furiously slow packages. regular, +917|86|9519|841.72|al excuses. slyly even platelets sublate blithely. carefully unusual foxes affix +917|20|8797|133.96|ep furiously pending, even packages. slyly final packages cajole fluffily blithely pending ideas. carefully express instructions above the b +918|19|6815|978.02|accounts after the quickly silent sheaves sleep blithel +918|53|726|186.32|ts affix blithely. special, unusual requests use furiously. final account +918|87|1789|765.91|e. carefully express deposits cajole along the blithely unusual courts. accounts impress blithely about the regular theodolites. even, pending pinto beans impress. furiously unusual pinto beans afte +918|21|513|741.93|ckages haggle blithely about the regular packages. accounts are. slyly bold deposits wake blithely final depths. final deposits should print careful +919|20|2792|266.54|. requests sleep. deposits nag quickly. slyly express in +919|54|471|374.55|pecial pinto beans are fluffily up the ironic pinto beans. evenly unusual theodolites was fl +919|88|3153|513.21|accounts. blithely express packages wake blithely. dogged, ironic ideas breach permanently against the ironic instruct +919|22|9598|388.74|s wake slyly blithely final platelets. carefully bold dep +920|21|5338|219.37|s across the unusual, unusual requests wake slyly carefully final accounts. deposits x-ray f +920|55|3330|891.85|frets. regular courts cajole furiously furiously even pinto beans. carefully pending +920|89|2847|445.19|. furiously pending platelets wake quickly. carefully ironic theodolites nod +920|23|8630|938.75|ular deposits impress carefully. furiously final deposits wake furiously. +921|22|5299|403.58|jole around the deposits. carefully pending packages are. final packages haggle furiously above the furious +921|56|7142|9.31|yly special foxes after the regular, final requests wake furiously carefully ironic ideas. idle, express ideas solve after the carefully pending pains. quickly ironic requests +921|90|1359|841.84|bold deposits haggle furiously. special, final sentiments wake fluffily after the carefully bold pinto beans? ca +921|24|5780|41.03| express instructions cajole fluffily outside the bold packages. blithely ev +922|23|352|475.98|bout the furiously dogged deposits. carefully final pinto beans haggle slyly carefully even depende +922|57|3764|978.34|y ironic theodolites. closely even instructions sleep stealthily packages. unusual foxes boost furiously slyly regular theodolites. blithely special accounts would dazzle after the car +922|91|7407|457.36| blithely final epitaphs detect furiously regular, even accounts. slyly final requests at the ironic deposits haggle furiously along the carefully regular accounts. carefully ironic de +922|25|3355|806.94| asymptotes across the furiously final accounts x-ray carefully according to the instructions. regular hockey players are fluffily about the closely special instructions. accounts use along +923|24|731|861.29|he quiet requests haggle furiously even theodolites. instructions after the final, even deposits haggle carefully against the even requests. express pearls beneath the ironic, brave theo +923|58|8368|265.84|yly final orbits. furiously ironic requests are slyl +923|92|147|689.95|slyly. fluffily bold packages haggle slyly. fluffily bold dependencies are. regular r +923|26|2193|750.62|ar foxes serve among the furiously even ideas: pending requests wake blithely unusual courts. regular excuses wake always. ruthlessly ironic attainments are carefully u +924|25|5695|490.13|ole quickly alongside of the enticing foxes. bold accounts use around the furiously even requests. requests after the regular reque +924|59|8689|8.93|ual foxes according to the final, ironic warhorses haggle carefully ironic deposits. accounts boost carefully. furio +924|93|9254|438.41|he regular accounts use fluffily blithely final pinto beans. requests integrate furiously. quickly r +924|27|7029|954.96| thrash quickly regular asymptotes. quickly final requests play carefully slyly regular ideas? furiously careful accounts cajole after the fluffily final requests. ironic instructions kindle furio +925|26|2023|244.19| regular deposits wake quickly regular accounts. slyly final excuses thrash slyl +925|60|5525|470.84|he unusual, enticing courts. accounts detect against the bold dolphins? slowly special packages along the express packages use fluffil +925|94|2332|591.19|lithely unusual pearls poach slyly around the blithely +925|28|2592|299.69|y busy deposits. pending packages cajole furiously. pending accounts eat blithely. furiously express foxes are furiously. quickly even foxes are carefully bold, unusual packages. express +926|27|7265|216.29|eep furiously of the furiously even packages. slowly bold packages above the accounts detect blithely against the bold, unusual depo +926|61|2768|36.73|nstructions haggle quickly ironic, unusual theodolites; daringly pending accounts sleep furiously. ironic +926|95|6621|237.18|o the slyly final instructions. furiously even instructions nag-- requests sleep always. stealthy instructions wake slyly above the regul +926|29|1224|439.84|ronic requests. ideas cajole blithely bold packages. express, pending requests +927|28|8919|900.34| grouches. blithely pending frays wake enticingly final deposits. ironic deposits na +927|62|3189|314.59|fluffily regular theodolites according to the slyly final packages are furiously among the carefully ironic ideas. blithely special packages cajole. quickly special asymptotes across +927|96|8490|846.10| furiously fluffily stealthy excuses. quickly ironic deposits poach. fluffily sly packages at the blithely regular packages nag quickly slyly ironic ideas. express ideas unwind furiously. furiousl +927|30|2356|775.14|symptotes. regular ideas poach blithely above the express pains. foxes use silent ideas. packages nag carefully final packages. carefully silent requests along the slyly even accounts de +928|29|5625|955.61|aggle blithely. final asymptotes use platelets. carefully bold accounts across the regular packages are quickly against the carefully regular platelets. slyly pending ideas integrate blithely caref +928|63|2735|174.04|final depths alongside of the carefully even foxes are carefully according to the special requests; carefully bo +928|97|8960|332.87|ously along the furiously regular theodolites. sometimes regular packages grow slyly among the regular, bold wa +928|31|8459|358.84|the theodolites. blithely special instructions dazzle blithely platelets! carefully specia +929|30|4399|344.34|the express, unusual pinto beans. carefully ironic deposits sleep blithely: dugouts around the deposits haggle carefully above the blithely +929|64|4584|244.63|ect slyly above the quickly regular packages. regular accounts are blithely above the final instructions. fluffily furious requests cajole? carefully regular requests at th +929|98|4462|765.37|r the furiously even requests. quickly special accounts boost quickly about th +929|32|9166|595.84|ges was furiously silent orbits. even requests haggle around the +930|31|5248|419.50|fix slyly carefully ironic accounts. blithely final requests above the furiously bold deposits haggle across the blithely ironic packages. final, unusual ideas solve carefully furiously regul +930|65|8678|748.03|counts are carefully. blithely special packages haggle furiously slyly pending packages. blithely express packages wake slyly. slyly silent requests a +930|99|5308|788.17|y bold theodolites above the foxes boost carefully accounts. furiously final requests cajole slyly. unusual, regular pinto beans haggle furiously about the unusual requests. furiously bol +930|33|5424|153.57|courts. quickly unusual instructions at the theodolites grow against the fluffily ironic id +931|32|525|879.37|le. blithely special accounts are furiously carefully express excuses. carefully regular packages sleep. furiously special theodolit +931|66|4049|483.78|yly regular packages are quickly final accounts. blithely final courts wake fluffily un +931|100|1523|267.18|r pinto beans x-ray along the furiously special pinto beans. blithely close pinto beans sleep? regula +931|34|5583|270.51| deposits affix quickly about the special orbits. slyly final instructions nag furiously. carefully ironic warhorses use fluffily carefully fin +932|33|6162|159.14|, regular platelets. final, special asymptotes impress furiously quickly ironic accounts. quickly final deposits haggle. ironic warthogs wake fluffily. furiously unusual accounts are quickl +932|67|4023|606.87|pecial, bold foxes. final, final ideas cajole fluffily alongside of the unusu +932|1|115|15.94|ending, unusual ideas are pending ideas. unusual, ironic packages cajole quickly furiously final deposits. slyly expres +932|35|8324|374.75|fully careful excuses. pending depths boost quickly along the accounts. quickly final accounts nag blithely after the slyly even packages. furiously pending instructions haggle. +933|34|4906|985.94|uests. slyly fluffy deposits boost according to the slyly final accounts. slowly ironic instructions use evenly. foxes haggle slyly across the f +933|68|2578|359.92|ag blithely at the blithely final asymptotes. quickly bold foxes are. blithely sly platelets haggle. requests wake bold, even requests. furiously ironic theodolites sleep. regular asymptote +933|2|6675|504.58|al accounts haggle fluffily bold deposits. quickly regular courts about the regular theodolites boost quickly quickly regular excuses. furiously ironic ideas solve carefully along the +933|36|4662|106.82|ests cajole. silently bold packages according to the carefully unusual ideas use among the carefully final theodolites. even p +934|35|3224|422.60|lets detect slyly according to the furiously ironic theodolites. carefully even theodolites cajole furiously after the blithely unusual requests! furiously even packages nag +934|69|6897|865.49|ay slyly. furiously regular ideas sleep slyly blithely quick packages. slyly ironic accounts are among the regular, dogged accounts. blithely even acc +934|3|5267|909.91|gside of the special, permanent accounts. blithely even accounts to the slyly unusual theodolit +934|37|8321|271.96|dolites haggle after the slyly even requests. carefully even deposits affix. express excuses should haggle furiousl +935|36|2143|680.28|s. carefully unusual packages use blithely across the bold requests. platelets sublate along the packages. slyly silen +935|70|5064|988.14|e carefully among the ironic, unusual asymptotes! carefully i +935|4|9381|411.49| slowly quiet ideas. carefully ironic pinto beans nod carefully furiously ironic requests. ironic, regular packages wake carefully furiously silent +935|38|962|96.22|sts wake furiously furiously unusual accounts. blithely final courts use furiously. carefully final excuses after the ironic, fina +936|37|9045|89.99| boost fluffily special dependencies. carefully express accounts cajole carefully slyly close deposits. thinly bold foxes wake. ironic excuse +936|71|4424|253.27|efully silent excuses-- packages x-ray slyly express instructions. express, pending deposits sleep across the special theodoli +936|5|1285|119.88|after the quickly unusual packages. carefully regular deposits cajole after the blithely final courts. bold, ironic deposits +936|39|8539|147.46|ke furiously. slyly pending deposits are across the regular, unusual accounts. regular, final excuses across the special requests cajole blithely quickly ironic deposits. fluffily pending deposits +937|38|2013|35.41|y. furiously even requests use furiously. blithely final re +937|72|539|60.08|ily foxes. quickly final foxes are. regular accounts wake slyly along the furiou +937|6|6581|71.45|fully special deposits. slyly even packages nag carefully. quickly pending platelets use blithely regular requests. pending theodolites caj +937|40|5247|323.62|s wake quickly ironic packages. furiously regular deposits nag carefully. regular hockey players wake blithely. deposits use according to the slyly ironic pinto be +938|39|1805|781.30|sly above the furiously ironic packages. quickly final deposits cajole. packages boost blithely. furiously special excuses nag. bold accounts cajole carefully. slyly i +938|73|7206|636.34|ongside of the carefully express excuses. carefully bold orbits use idly final, regular accounts. special packag +938|7|5237|887.10|arefully ironic accounts haggle furiously around the slyly express foxes +938|41|1667|508.87|olites shall haggle after the slyly regular warhorses-- carefully regular requests print slyly. sl +939|40|7230|380.24|ainst the sentiments. accounts boost. carefully final accounts sleep furiously carefully ironic requests. blithely regular excuses according to the silent deposit +939|74|1138|279.56| accounts. bold, final theodolites promise above the bold, final packages. slyly pending dependencies wake thinly. carefully unusual requests cajole fluffily quickly unusual re +939|8|6449|487.21|t deposits about the idly pending instructions cajole fluffily car +939|42|256|846.94|arefully regular instructions wake carefully ironic accounts. carefully final deposits across the slyly even packages cajol +940|41|7386|847.15|yly ironic deposits sleep quickly express deposits. unusual pinto beans should have to sleep carefully final platelets. quickly p +940|75|3537|502.97| carefully bold foxes integrate evenly express, unusual excuses. ironic, pending packages boost blithely pending instructions. regular pinto beans nag bus +940|9|176|988.73|nding pinto beans alongside of the silent orbits are sometimes carefully bold accounts; pending excuses use fluffily alongside of +940|43|2820|322.83|uriously along the final, even platelets. carefully regular +941|42|4672|498.43|gular pinto beans. accounts sleep fluffily after the furiously ironic packages. quickly ironic accounts wake slyly pending requests. regular, ironic pinto beans serve slyly +941|76|8513|624.65|lithely unusual requests. furiously silent instructions cajole final, pending packages. en +941|10|308|111.27| the slyly even dolphins. blithely special dependencies promise along the special accounts. furiously pending dinos cajole furiously asymptotes. ironic, even requests a +941|44|9013|287.04|uctions wake furiously quietly even deposits. busily regular deposits cajole quickly about the bold instructions. car +942|43|5402|309.19|al accounts about the quickly final requests sleep slyly furiously even theodolites. bold theodolites doubt. express packages haggle quickly quick +942|77|7823|960.12|sly special accounts haggle blithely pending, unusual frays-- slowly ironic pinto beans hang carefully final requests. silent theodolites +942|11|6510|905.77|ly regular dependencies. bold packages up the carefully express foxes cajole according to the final braids. deposits unwind furiously alongside of the silent ideas. slyly fi +942|45|8942|604.90|urious theodolites sleep: regular instructions wake about the pending foxes. blithely even instructions about the blithely thin theodolites are carefully above the quickly final pinto beans. iron +943|44|6953|928.90|alongside of the instructions use quickly sometimes bold requests. slyly regular deposits sleep furiously! carefully unusual realms are. special asymptotes above the slyly regular inst +943|78|3679|744.26| carefully. quickly express packages wake among the final, pending theodolites. pending deposits nag furiously even courts. slyly bold ideas haggle: furiously even accounts haggle slyly express +943|12|5540|374.86|egular deposits integrate quickly. carefully ironic foxes wake on the final asymptotes. carefully final accounts against the furiously ironic requests wake theodolites. furiously final packages acco +943|46|9354|753.83|long the furiously ironic packages. ironic excuses above the slyly final foxes haggle carefully across the accounts. quickly unusual instructio +944|45|1685|353.22|ven hockey players thrash furiously across the furiously silent requests. carefully pending pinto beans run. furiously +944|79|2302|766.78|y final foxes. ironic dolphins according to the ironic packages cajole carefully even package +944|13|396|366.71|ong the theodolites sleep blithely about the furiously pending realms. furiously ironic asymptotes within the express, pending dependencies cajole above +944|47|9651|697.80|jole packages. pending, slow packages nag blithely above the instructions. ideas sl +945|46|7605|768.45|as. slyly regular dinos cajole furiously express dependencies. even pinto beans sleep slyly according to the blithely idle instructions! even dependencies above the slyly even pinto beans sl +945|80|5635|360.43|yly even pinto beans are blithely after the foxes. bold ideas wake idly above the silent accounts. asymptotes according to the ironic deposi +945|14|5330|977.35|lve furiously regular packages. final foxes after the regular, unusual accounts haggle across the final accounts. blithely special ideas are special +945|48|7587|887.00|ns would are requests. evenly special packages above the slyly bold pinto beans affix blithely special requests. slyly +946|47|3303|791.12|o the carefully pending packages haggle slyly furiously sil +946|81|797|806.82|requests. blithely final accounts lose carefully even theodol +946|15|4402|957.75|unusual excuses; final deposits are quickly across the quickly even foxes. furiously even deposits integrate. carefully bold packages around th +946|49|7673|92.10|refully. foxes haggle blithely express pinto beans. slyly +947|48|9732|675.16|ggle evenly about the final theodolites. deposits wake slyly about the quietly ruthless requests: carefully special foxes haggle furiously regular requests. ironic gifts cajole against +947|82|314|910.53|he pending theodolites. slyly pending dolphins are against the regularly ironic requests. special instructions about the accounts are fluffily carefully special +947|16|3832|702.87|ar accounts use quickly. foxes print quietly. express deposits wake pint +947|50|9905|164.03|press dependencies cajole. regular instructions kindle +948|49|2759|764.02|regular deposits mold above the blithely ironic requests. blithely regular deposits sleep! furiously ironic deposits wake quickly al +948|83|2108|946.05|lar packages run slowly final asymptotes. ironic courts according to the +948|17|2543|244.62| carefully bold requests. furiously careful accounts nag blithely according to the slyly bold sentiments. packages are about the pending +948|51|4425|746.04|nic pains across the dependencies wake carefully according to the furiously regular accounts. regular depo +949|50|1436|434.58|y. accounts lose fluffily carefully silent theodolites. carefull +949|84|8090|563.00|the ironic requests. silent, ironic notornis wake always about +949|18|1929|964.68|y slow deposits. close requests doubt quickly. carefully even accounts nag furiously across the blithely express dolphins. quickly +949|52|9139|787.56|s wake furiously. furiously final accounts haggle. ironic ideas wake never. regular theodolites wake quickly ironic theodolites. slyly final foxes among the even +950|51|9680|885.74|eep blithely blithely regular accounts. blithely silent i +950|85|4792|585.37|es about the express foxes wake ruthlessly according to the furiously express platelets. qu +950|19|871|330.36|s packages wake above the permanent ideas. final theodolites use quickly final requests. ironic requests will boost fluffily to the +950|53|7713|46.69| instructions nag furiously thin, even ideas. furiously ironic foxes use. furiously pending packages sleep slyly through +951|52|7244|709.23| blithely ironic theodolites integrate furiously. bold packages sublate blith +951|86|895|142.02| platelets. fluffily ironic platelets boost blithely. slyly ironic requests among the bold hockey players cajole furiously among the ironic, final pinto beans. ironic, final deposits dazzle +951|20|6874|609.59|ross the quickly final platelets? final theodolites wake furiously alongside of the even, bold packages. blithely bold requests haggle ag +951|54|8830|868.76|x. carefully final deposits haggle quickly across the furiously even platelet +952|53|1094|911.96|oxes. realms sleep ruthlessly after the express pinto beans. quickly ironic accounts wake never after the deposits. furiously bold packages wake furiously carefully final deposits. f +952|87|5489|828.93|nd the final pinto beans nod slyly according to the pending packages. +952|21|8800|940.47|ar platelets hang furiously final deposits. unusual foxes cajole around the pinto beans. slyly even deposits mold quickly after t +952|55|9704|423.38|s. furiously regular packages boost slyly quickly final theodolites. fluffily unusual accounts haggle furiously at the blithely final instructions. furiously ironic excu +953|54|5475|76.94|of the blithely final requests. quickly ironic ideas boost quickly bold accounts. even pinto beans wake. blithely silent courts boost alongside of the furiously special gifts. furiously final packa +953|88|3879|618.91|hely special pinto beans use carefully about the +953|22|1788|631.71|ide of the daring, final theodolites. fluffily pending saute +953|56|1901|884.61|fily along the regularly permanent platelets. furiously regular requests haggle carefully. always silent accounts wake blithely about the u +954|55|670|569.52|final packages. special foxes nod blithely after the special, close packages. ironic packages run slyly slyly express theodolites. furiously pending f +954|89|790|729.97|slyly among the slyly even requests. blithely reg +954|23|4793|949.17|even requests. accounts sleep closely across the ironic, unusual pinto be +954|57|7797|686.67|s. quickly final foxes boost requests. carefully i +955|56|1635|527.86|egular accounts haggle slyly ironic requests. final, unusual accou +955|90|9350|752.13|ccounts wake slyly along the carefully regular accounts. blithely steal +955|24|5395|765.08|he slyly ironic accounts? final, special packages after the ironically regular Tiresias detect slyly furiously final courts. final deposits haggle slyly blithely final platelets. furiously regul +955|58|4605|768.83|ccording to the furiously silent escapades. fluffily regular foxes run carefully bold accounts. even requests solve quickly against the sometimes regular instructions. excuses beyond t +956|57|8204|803.66|carefully about the deposits. furiously bold requests haggle above the even, express packages. blithely pending dolphins +956|91|3862|721.64|sy pinto beans above the express deposits use slyly blithely regular deposits; regular dolphins impress furiously against the blithe, express instructions. special dependencies slee +956|25|8449|905.69|efully unusual packages. slyly silent accounts affix. even packages mold blithely. tithes eat carefully special dependencies. quickly even accounts are +956|59|6948|287.44|ackages nag fluffily carefully final deposits. carefully bold theodolites believe against the theodolites. fluffily pending deposits x-ray final, even packages. +957|58|6490|990.68|ld, final accounts along the pending, even deposits wake fluffily about the fluffily final packages. even, regular accounts sleep blithely furiously regular waters. fluffily special packages s +957|92|9857|187.47|ect carefully final deposits. special accounts nag carefully pending hockey players: quickly even packages above the carefully final packages detect about the even theodolites: carefully +957|26|9159|241.73|ar warhorses. platelets nag quickly. furiously pending deposits detect alongside o +957|60|3274|5.43|accounts nod carefully. bold, unusual packages cajol +958|59|4136|662.00|le blithely. bold, regular accounts wake silent braids. quickly +958|93|614|535.67|ular foxes alongside of the furiously even deposits use fluffily packages. fluffily express instructions affix carefully along the fluffily even dolphins. quickly close package +958|27|6632|162.48| fluffily dogged accounts grow quickly. fluffily ironic requests acros +958|61|3846|806.76|egular deposits. furiously brave ideas cajole final deposits. sometimes special foxes ought to sleep. bravely regular packages wake. packages haggle about the furiously bold requests. blithely +959|60|2714|982.50|tes; slow accounts thrash quickly. bold dependencies wake alongside of the special, f +959|94|8674|431.06|telets wake thinly according to the slyly final braids. blithely ironic dolphins wake quickly regular ideas? blithely re +959|28|4053|207.63|ggle across the blithely express packages. sly asymptotes are c +959|62|8316|435.36| blithely about the regular epitaphs. carefully bold platelets wake fluffily to the final dolphins-- packages wake. evenly express pinto beans above +960|61|4313|643.01|g packages sleep special packages. packages detect furiously +960|95|9336|97.80|ajole fluffily according to the ironic, thin excuses! unusual instructions about the even, regular theodolites wake idly around the final, pendin +960|29|6882|628.62| instructions integrate blithely. carefully pending dependencies sleep blithely. special, ironic reques +960|63|9481|971.38|p always even packages! slyly silent asymptotes use slyly ironic instructions. blithely pending platelets would haggle carefully carefully ironic ideas. slowly ruthless deposits promise f +961|62|7983|477.86|ing to the carefully even ideas. pains believe furious +961|96|3420|533.88|ockey players. regular requests across the fluffily pending accounts eat furiously along t +961|30|9194|8.14|lphins sleep carefully. close, express requests integrate quickly according to th +961|64|7507|128.14|lithely final platelets. slowly special packages boost among the fluffily special deposits. q +962|63|6407|35.76|ual sheaves. regular, even accounts doubt quickly according to the slyly bold fox +962|97|1025|825.97|express deposits. blithely even theodolites are. blithely bold decoys along +962|31|4372|139.06|, even requests could have to wake furiously blithely silent foxes. quickly even foxes cajole fluffily about the carefully even foxes. furiously express pinto beans +962|65|2536|703.56|s. blithely final requests are-- regular deposits are above the carefully final ideas. daringly unusual excuses boost carefully fi +963|64|1234|747.49|e slyly special ideas. regular deposits detect quickly brave packages. even deposits cajole furiously bli +963|98|6190|790.36|. ironic packages above the furiously pending courts integrate blithely silent +963|32|8988|52.47|ages. furiously regular theodolites are blithely carefully permanent instructions. requests was slyly final requests; furiously special +963|66|109|64.57|cial pinto beans nag about the ideas. final deposits wake quickly. ac +964|65|517|517.38| beans wake. regular instructions mold carefully. final requests nag furiously regular, even +964|99|9244|494.98|g instructions. furiously unusual accounts among the slyly unusual deposits nag through t +964|33|4153|710.65| furiously express accounts. fluffily pending deposits sleep. slyly regular packages cajole slyly regular accounts. pending deposits are u +964|67|1935|998.03|tect. furiously pending escapades use. regular deposits cajole slyly across the furiously final requests. bravely bold deposits wake. carefully final packages +965|66|5311|776.74|olites among the ironic packages sleep furiously according to the even, even dolphins. blithely ironic accounts doze. blithely ironic accounts for the carefully unusual dolphins solve fur +965|100|6053|881.81|cording to the quickly final foxes wake blithely since the furiously express courts. blithely even dolphins affix. packages affix. close +965|34|6368|515.39|thely bold deposits maintain warhorses. always special theodolites wake slyly even sheaves. slyly pending packages are. blithely regular accounts must have to thrash blithely-- slyly regular ideas +965|68|215|85.39|final asymptotes sleep blithely. quickly final instructions are. slyly even requests are quickly according to the steal +966|67|6745|783.70|st the blithely unusual packages wake quickly express asymptotes! pending packages impress carefully instructions. bold accounts was. carefully reg +966|1|8807|926.97|olites dazzle furiously among the final instructions. theodolites nag blithely express, regular courts. bold packag +966|35|6276|311.73| accounts. boldly ironic dolphins wake blithely furiously pendi +966|69|8468|756.61|y after the special ideas. even, bold packages haggle among the bravely regular packages. final packages cajole furiously +967|68|6700|207.27|nstructions nag quickly regular, ironic instructions. fluffily ironic instructions doubt. bl +967|2|7532|229.00|iously quickly ironic patterns. carefully even theodolites mold +967|36|9331|836.08|he final ideas. quickly even packages mold quickly alongside of the carefully regular deposits. quickly even packages +967|70|528|142.28|quickly pending theodolites against the fluffily regular foxes cajole furiously special excuses. special deposits wake blithely. ironic, ironic packages are quickly; pending, express accounts h +968|69|2351|938.24|hely unusual deposits detect carefully along the special, ironic requests. silent deposits cajole carefully furiously bold dolphins. instructions +968|3|9343|970.80|final accounts against the furiously regular packages dazzle fluffily against the even instructions. decoys sleep. theodolites wake carefully about the final, regular dolphins. blithely iron +968|37|2282|617.31|he unusual ideas; slyly silent packages cajole slyly furiously bold pinto beans. ironic, express excuses nag carefully even theodolites. furiously ironic excuses above +968|71|3422|600.68|its run carefully according to the slyly special dependencies. furiously regular foxes haggle inside the daringly special requests. regular requests use quickly. quickly slow th +969|70|7599|884.25|cial requests doubt unusual, ruthless foxes. slyly regular reque +969|4|3956|661.00|blithely regular foxes boost quickly final instructions. ironic accounts wake according to th +969|38|2172|723.73|furiously. final, pending frets wake carefully final deposits. blithely ironic dep +969|72|3914|23.75| according to the sly packages. slyly fluffy accounts above the final, regular requests snooze fluffily at the even frets. slyly even asymptotes are quickly. regularly bold accounts cajo +970|71|5827|814.60|requests. requests maintain slyly against the blithely ironic multipliers. slyly +970|5|2780|762.18|y unusual requests haggle after the fluffily ironic requests. blithe +970|39|2929|922.79|kly among the somas. furiously regular packages alongside of the blithely special dolphins cajole quickly outside the slyly pending deposits; deposits sleep fluffily reg +970|73|9665|949.38|oxes use under the theodolites. carefully regular requests against the quickly unusual theodolites affix blithely carefully final instructions. carefully even packages sleep +971|72|796|318.79| asymptotes. regular, bold ideas cajole across the quickly ironic deposits. even deposits can are fu +971|6|2924|454.68|the final deposits. unusual instructions boost blithely special dinos. fu +971|40|5891|601.59|ackages according to the quickly final depths integrate after the final requ +971|74|6935|231.48|ans play blithely! quickly special asymptotes use. ironic theodolites use blithely packages. silent instructions shall are fluffily ideas. qu +972|73|7583|610.60|d packages. final requests haggle blithely. slyly regular epitaphs cajole carefully along +972|7|47|843.40|blithely express sentiments. fluffily ironic pinto beans about the instructions sleep quickly a +972|41|5831|352.76|oss the bold requests. slyly silent packages doubt across the ironically even accounts. dependencies around the f +972|75|7278|967.71| blithely close requests. requests sleep. blithely ironi +973|74|88|670.52|onic packages wake slyly final packages. ironic deposi +973|8|5830|816.98|refully carefully silent packages. quickly unusual excuses affix closely. platelets above the carefully final accounts use blithely sly +973|42|8017|874.33|about the even instructions wake according to the furiously final theodolites. deposits above the ideas sleep slyly above the ironic platelets. carefully ironic requests integ +973|76|9014|733.95|he accounts doubt furiously special deposits. even, ironic packages detect blithely. fluffily ironic requests along the carefully bold packages doze according to the theodol +974|75|3352|994.63| quickly according to the furiously blithe theodolites-- slyly quiet accounts use slyly against the even, regular requests. blithely final foxes against the dependencies haggle f +974|9|7109|538.86|uses serve slyly at the slyly pending requests. bold pinto beans wake about the final deposits! blithely final pinto beans unwind stealthily. furiously bold wa +974|43|2205|925.87|eep furiously unusual instructions. pinto beans around the furiously ironic requests lose quickly final excuses. furiously bold asy +974|77|3847|769.30|y unusual accounts. carefully dogged packages eat according to the dependencies. fluffily regular instructions haggle slyly among the blithely ent +975|76|7957|638.27|dependencies. closely final theodolites integrate. pending packages hinder slyly unusual request +975|10|2193|257.24|le carefully ironic dolphins. pinto beans cajole slyly silent foxes. foxes against the slowly daring pinto beans cajole fluffily bold requests. excuses cajole across the blithely regular requests. +975|44|1427|13.46| silent requests wake daringly according to the blithely even packages. always bold instructions after the regular instructions haggle +975|78|2006|745.84| fluffily final frets wake final theodolites. slyly pending foxes sleep regularly. ironic accounts about the quickly final deposits snooze after the furiously pending asymptotes. q +976|77|4405|44.82| tithes nag blithely. express requests cajole furiously even, blithe deposits. furiously daring packages above the unusual accounts maintain carefully quickly even packages. furiously careful ins +976|11|1765|339.53|tes affix furiously evenly final asymptotes. carefully regular instructions wake doggedly. slyly regular accounts sleep alongside of the even instructions. pending pinto beans haggle +976|45|4740|407.82|kages. slyly ironic excuses are quickly even deposits. blithely final instructions alongside of the accounts haggle slyly alongside of the packages. final package +976|79|713|310.39|. blithely special theodolites use. furiously express theodolites use carefully acc +977|78|8|102.28| regular excuses. quickly ironic courts are busily. theodolites haggle carefully slyly final accounts. regular, special asymptotes haggle along the furiousl +977|12|6079|35.17|lyly blithely even foxes. furiously ironic packages wake fluffily. slyly ironic foxes wake. furiously enticing gifts could sleep furiously across the slyly bold orbits. fluffily unusua +977|46|8521|14.26|requests boost. quickly regular depths use final, ironic requests. fur +977|80|4386|217.11|ackages was slyly sly requests. carefully enticing ti +978|79|993|884.94|use quickly according to the furiously regular instructions. carefully regular pearls engage carefully abou +978|13|6432|220.21|rding to the slyly regular instructions. pinto beans boost furiously. even, ironic packages haggle sly +978|47|529|15.28|ial pains. blithely special asymptotes integrate. final packages kindle quickly unusual, regular ideas; quickly even theodolites wake. furiously special foxes wake quickly abo +978|81|9008|279.45|ickly above the ironic theodolites. furiously ironic attainments doze slyly about the bold, bold ideas. blithely slow foxes wake quickly boldly express theodolites. platelets about the expres +979|80|5466|653.24|ons. final accounts are final, ironic accounts. fluffily special packages sleep. final foxe +979|14|9793|228.41|luffily brave ideas haggle fluffily among the quickly pending theodolites. furiously regular packages are blith +979|48|9982|964.00|ages wake slyly carefully ironic packages. blithely even accounts boost across the car +979|82|7397|190.86|ly. quickly pending foxes wake fluffily alongside of the slyly bold accounts. busily unusual instructions across +980|81|9599|298.02|lar dependencies haggle fluffily according to the quickly permanent deposits. even theodolites after the blithely enticing requests wake ruthlessly above the blithely even gifts. carefully speci +980|15|2721|995.22| requests. quickly final accounts wake about the slyly pending requests. furiously special deposits detect blith +980|49|2181|474.43|en deposits. fluffily ironic instructions wake furiously bold deposits. accounts wake blithely across the pending, regular deposits! blithely bold requests cajole slyly. carefully regul +980|83|4487|832.63|tes according to the regular ideas nag blithely carefully express dolphins. re +981|82|7640|170.36|ly. requests among the furiously final accounts use furiously among the slyly ironic theodolites. deposits nag theodolites. regular deposits after the even requ +981|16|4695|394.48|ts. quickly pending deposits against the unusual pinto beans sleep quickly final accounts. express deposits +981|50|4547|936.79|le furiously about the slyly ironic foxes. even, regular deposits affix carefully final deposits-- carefully special deposits are carefully quickly ironic depo +981|84|5099|510.42| regular deposits. blithely express accounts are fluffily final excuses. furiously even deposits sleep along the even dolphins. blithely busy accounts cajole furiously. even requests sleep +982|83|373|416.01|s kindle. even foxes wake furiously across the pending accounts. furiously final pinto beans boost slyly. carefully close fox +982|17|3705|14.27|ilent packages sleep behind the idly ironic requests. slyly pending ideas boost blithely ironic excuses: slyly ironic ideas cajole blithely pint +982|51|9951|333.78|cial deposits boost fluffily express asymptotes. slyly fluffy requests affix furiously ideas. exc +982|85|6346|692.01|furiously regular packages boost blithely. regular, pending deposits c +983|84|1147|362.69|lithely even asymptotes: quickly regular ideas alongside of the quickly unusual packages sleep regular foxes. slyly +983|18|3216|991.58| are slyly before the unusual requests. closely unusual dependencies use slyly silent pinto beans. quickly pending requests after the furiously thin +983|52|1297|232.21|lose above the furiously pending deposits. busy, ironic deposits after the regular, bold foxes sleep after the blithely pending theodolites. requests cajole slyly special +983|86|5765|961.92|ual packages cajole after the even, final requests. fluffily unusua +984|85|9836|228.17| pending deposits. special platelets lose blithely atop the permanent accounts! regular dolphins wake across the slyly even deposits; slyly ironic depos +984|19|4919|983.28|sts along the regular excuses are blithely slyly pending foxes. furiously regular requests haggle blithely boldly regular requests. sl +984|53|5976|651.38|t fluffily express foxes. regular, regular requests boost. requests according to the quickly even packages are quietly slyly even platelets. accounts affix furiously acco +984|87|6244|784.93|the furiously regular courts. furiously pending ideas are quickly deposits. carefully expres +985|86|297|613.60| among the regular foxes cajole fluffily about the quickly final theodoli +985|20|7497|205.80|eas wake along the slyly pending requests. fluffily ironic accounts lose caref +985|54|3381|497.86|y bold foxes are careful instructions. stealthily regular excuses cajole quickly ironic dep +985|88|7|55.51|final, pending instructions haggle. slyly fluffy ideas mold final, furious epitaphs. ironic deposits nag after the blithely regula +986|87|5525|149.25|tructions against the final dependencies use busily regular theodolites. bravely express accou +986|21|1621|123.88|ronic deposits maintain slyly final, silent epitaphs. final, ironic pinto beans above the ironic requests cajole excuses. carefully even ex +986|55|5236|401.64|ly final somas use blithely at the even pinto beans. quickly even requests pas +986|89|6045|288.47|lly furiously bold platelets. sly packages nod furiously: foxes integrate carefully; somas are furiously unusual, ironic deposits. furiously final requests haggle furiousl +987|88|2543|342.29|eodolites sleep furiously slyly pending deposits. ironically unusual foxes cajole furiously after the even idea +987|22|2691|753.23| furiously. furiously ironic packages affix regular dependencies. blithely ironic packages sleep furiously after the furiously ironic ideas. final foxes sublate slyly. unusua +987|56|2440|417.99|gside of the slyly pending instructions are blithely along the furious accounts. blithely even deposits along the special accounts boost furiously above the regular packages. fluffil +987|90|5539|385.08|final, even requests. accounts against the final ideas play blithely after the carefully ironic courts. furiously unusual accounts haggle blithely above the quickly +988|89|6092|701.33|endencies haggle quickly even sauternes. carefully ironic platele +988|23|602|205.62|ependencies promise furiously after the quickly final theodolites. express ideas kindle carefully unusual, ironic packages. fluffily fluffy ideas doubt qu +988|57|9046|464.75|es sleep slyly. slyly regular instructions wake enticingly along the deposits. regular, regul +988|91|23|59.56|blithely pending theodolites. enticing, even pinto beans across the blithely +989|90|265|284.07|s haggle quickly requests. pending requests haggle about the blithely regular theodolites. quickly bold accounts nag express deposits. furiously final foxes boost +989|24|3027|430.35|y players are around the blithely pending accounts. regular deposits integrate slyly. blithely ironic platelets affix among the packages. regular deposits integrate furiously. final, +989|58|4452|327.78|usly regular deposits. pinto beans wake slyly slyly ironic +989|92|8943|779.48| furiously. multipliers detect. final foxes nag around the ca +990|91|8087|13.42|n instructions. deposits nag slyly fluffily final accounts. pinto beans wake blithely according to the special, pending requests +990|25|6261|17.48|are carefully above the furiously regular packages. furiously bold braids poach blithely. carefully unusual courts cajole blithely. packag +990|59|3737|378.76| regular accounts. furiously even pinto beans affix carefully slyly regular accounts. fluffily pending accounts affix quickly above the regular pinto b +990|93|7925|414.46|ggle quickly according to the blithely quiet accounts. carefully even foxes wake against the quickly ironic accounts. +991|92|1066|936.96|ic braids detect quickly. regular deposits alongside of the furiously special platelets hang about the pending packages. furiously s +991|26|703|312.85| even theodolites nag. furiously regular deposits across the final dependencies cajole quickly carefully unusual requests. fluffily ironic acc +991|60|5761|520.95|es above the bold ideas sleep thinly around the slyly bold packages. slyly ironic requests wake among the instructions. s +991|94|651|499.40|ep. pending requests wake slyly express deposits. quickly ironic requests detect. blithely dogged platelets u +992|93|5880|13.83|, bold ideas are fluffily bold foxes. final deposits are bravely brave requests! furio +992|27|1364|2.05|s the even, final multipliers. unusual packages according to the never final excuses kindle blithely even asymptotes. permanently special r +992|61|1935|699.02|requests! quickly express accounts sleep under the pending requests; blithely silent accounts against the carefully sly packages cajole across the carefully silent packages. blith +992|95|6691|317.08|posits above the deposits are against the blithely regular pearls. packages sle +993|94|6688|743.58|cial instructions haggle furiously across the quickly bold packages. furiously final package +993|28|35|40.94|ress requests nag regular, pending deposits. ironically pending requests are after the final theodolites; +993|62|6925|19.77| instructions haggle furiously. carefully special requests boost quickly even platelets. blithely ironic dependencies sleep among the packages. slyly pen +993|96|6231|902.21|g the slyly regular deposits eat carefully pending foxes: regular packages cajole. furiousl +994|95|8828|683.36|ackages. bold accounts cajole against the blithely regular orbits. s +994|29|4006|926.96|ly regular accounts. furiously regular theodolites across the careful pinto beans haggle slyly above the quickly pending theodolites. blithely even platelets haggle quickly a +994|63|6627|158.22|ithe deposits. quickly express foxes sleep slyly according to the accounts. care +994|97|1000|144.28| regular theodolites. final, bold instructions sleep furiously. carefully pending theodolites haggl +995|96|8665|651.93|e final, express foxes. slyly express packages haggle fluffily. instructions detect fluffily. carefully bold foxes cajole around the slyly even packages. even e +995|30|1429|92.44|fully among the requests. ironic foxes maintain furiously final courts. regular asymptotes boost blithely about the furiously special foxes. blithely regular depe +995|64|5187|484.49|. regular instructions nag quickly-- slyly ironic deposits along the bold, final foxes nag fluffily closely +995|98|8018|97.66|ic courts. silent requests detect slyly according to the slyly regular accounts. slyly regular ideas boost blithely dependencies. furiously silent accounts are carefully p +996|97|7172|264.92|d furiously alongside of the furiously express asymptotes. fluffily special excuses among the regular, silent ideas detect about the furiously ironi +996|31|1845|141.77|ites. final, brave packages wake furiously alongside of the furiously final asymptotes. slyly ironic foxes integrate slyly quickly regular theodolites. platelets wake +996|65|1943|311.98|counts haggle slyly; slyly regular deposits will nag. fluffily special accounts after the final accounts sl +996|99|4928|840.12|er the deposits! carefully pending dolphins wake. slyly quick Tiresias across th +997|98|1763|205.14|eodolites cajole against the pending theodolites? finally final foxes around +997|32|9023|440.17|packages boost. blithely even asymptotes after the ironic excuses are fluffily pending pinto bea +997|66|3548|550.30|ounts sleep. unusual depths affix alongside of the quickly regular excuses. express ideas sleep slyly. even theodolites would lose. express pinto beans are slyly final requests. fur +997|100|2003|234.72|sly final requests. carefully special accounts solve slyly express, bold depths. regular packages are quickly against the foxes. carefully +998|99|5751|149.51|osits after the furiously final deposits sleep slyly about the ironic, final deposits. furiously regular instructions according to the blithely final deco +998|33|6629|628.72|ial platelets. slyly special packages nag blithely. quickly busy patterns sleep. slyly close dolphin +998|67|55|576.13|gle quickly across the blithely unusual deposits. furiously silent packages haggle slyly against the fluffily final accounts. slyly pending packages are. ironic, even accounts cajo +998|1|7711|803.34|sits wake furiously final, pending packages. dependencies cajole quietly ironic packages: silent deposits affix furiously. theodolites sleep fluffily among the furious +999|100|2622|335.88| frays. carefully even deposits are around the carefully brave deposits. fluffily bold acco +999|34|6658|74.56|ole quickly at the blithely unusual ideas. regular, final theodolites cajole Tiresias. enticing pinto beans integrate fluffily against +999|68|5162|681.89|r packages use. even deposits integrate. requests on the even, unusual accounts sleep slyly ironic theodolites. finally pending courts play furiously slyly thin id +999|2|1550|136.14| blithely busy accounts wake blithely carefully regular frays. blithely unusual excuses across the pendi +1000|1|6044|643.17|eposits wake carefully according to the final, brave +1000|35|8219|653.45|ke blithely. final, ironic ideas sleep slyly after the blithely ironic requests. furiously ironic asymptotes boost slyly ideas. furiously ironic dolphins sleep slyly against the blithely ironi +1000|69|3768|711.68|the slyly final theodolites. furiously special ideas sleep according to the brave +1000|3|1547|248.80|riously ironic ideas dazzle above the furiously regular deposits. regular, special foxes across the even foxes wake +1001|2|7621|32.48|es. even requests wake slyly final instructions. carefully reg +1001|37|8139|772.12|r foxes. slyly final packages wake quickly ironic platelets. unusual, regular platelets x-ray fluffily at the even multi +1001|72|2967|143.68|leep. carefully ironic accounts haggle carefully quickly regular theodolites. quickly ironic theod +1001|7|8142|557.99|ng to the blithely regular dinos. quickly silent foxes can sleep carefully about the special, even asymptotes. ruthlessly ironic ideas dazzle closely regular deposits? brave asymptotes haggle +1002|3|2791|755.68|nic packages are: deposits wake evenly pending foxes: requests detect slyly according to the final ideas. furiously +1002|38|1379|542.55|le across the slyly express excuses. final, ironic courts against the sheaves boost alongside of the express deposits. carefully furious requests use carefully alongside of the final accounts. +1002|73|2282|923.79|are slyly. brave, pending accounts use alongside of the regular accounts. unusual platelets detect furiously slyly e +1002|8|676|850.95|inal packages sleep blithely furiously pending packages. quickl +1003|4|4413|406.78|e the slyly regular accounts use furiously silent, sp +1003|39|4268|706.00|beans. final, bold accounts wake furiously around the furiously special ideas-- quickly ironic package +1003|74|8907|787.05|y regular accounts cajole blithely against the fluffily enticing re +1003|9|9251|382.72|ar patterns after the quickly bold deposits snooze above the regular foxes. courts over the slyly s +1004|5|2101|16.82|uriously regular asymptotes cajole. daringly final Tiresias detect blithely dogged hockey play +1004|40|2472|280.13|, even accounts wake furiously instead of the slyly regular ideas-- quickly unusual requests s +1004|75|5356|46.70|yly about the furiously regular theodolites. express, regular instructions sleep. final foxes hinder blithely bold accounts. final theodolites according to the carefully bold deposits integrat +1004|10|592|917.47|ounts. fluffily express deposits cajole blithely. furiously bold accounts are slyly express asymptotes: slyly +1005|6|324|387.69|ously ironic requests hinder along the brave accounts. regular instr +1005|41|2870|646.10|lly unusual requests after the furiously unusual accounts integrate slyly unusual excuses. silent, regular packages sleep slyly even sheaves-- regular sentiment +1005|76|6715|98.48|he express, idle requests. frays use carefully. slyly even dependencies solve busily against the requests. excuses before the carefully final pinto beans affix careful +1005|11|9646|102.60|ular requests near the even, final deposits engage ironic deposits. slyly regular +1006|7|4501|369.40|s wake about the fluffily pending platelets. ironic braids above the dependencies cajole furiously blithely even dependencie +1006|42|7686|879.79|s haggle carefully. quickly pending theodolites across the blithely pending deposits lose slyly after the fluffy requests. foxes s +1006|77|7548|627.18|r, ironic ideas. carefully special platelets cajole. quickly special packages wake furiously quickly bold asymptotes. express orbits haggle carefully above the slyly silent ideas. blithely special +1006|12|7401|777.42|ymptotes. pending, bold pinto beans impress ironic +1007|8|8409|295.13|quickly blithely brave deposits. bold, special requests wake carefully against the fluffy accounts. slyly bold packages was furiously bold instructions. even, unusual patterns affix. ironic +1007|43|6107|442.72| carefully regular asymptotes are furiously beneath the packages. quickly special dependencies are. quickly express +1007|78|9733|501.22| fluffily furious requests. final deposits detect blithely in place of the carefully ironic requests. slyly pending instructions sleep slyly atop the slyl +1007|13|2312|669.49|iously unusual requests was after the slyly final packages. accounts along the regular, even instructions wake furiously carefully special deposits. blithely bold deposits run even notornis. regula +1008|9|469|489.22|y ironic accounts. express, final ideas along the even packages wake furiously above the final, pending +1008|44|5757|793.05|sly above the furiously final pinto beans. ironic packages wake fluffily above the ironic, final warhorses. slyly ironic pinto beans are depos +1008|79|5517|192.41|gular multipliers are. slyly unusual requests cajole slyly express instructions. furiously express accounts detect th +1008|14|1577|249.68|ccounts. furiously express ideas wake furiously? ironic dependencies was furiously. pinto beans nod. accounts at the finally stealthy accounts are quickly final ideas. final theodolit +1009|10|2303|777.89|ckages. accounts was. regular sauternes nag carefully fluffily regular packages. special accounts cajole. ironic requests doubt across the carefully unusua +1009|45|7115|274.60|sts haggle blithely-- furiously even accounts cajole quickly requests. ideas use quickly. regular packages alongside of the blithely unusual ideas sleep blithely +1009|80|8567|977.94|less theodolites sleep furiously fluffily regular deposits-- f +1009|15|7031|707.71|requests use slowly! slyly final asymptotes sleep carefully carefully final packages. slyly fina +1010|11|1567|539.47|en requests serve according to the slyly silent accounts. carefully regular requests haggle above the furiously enticing waters. ironic packages wake +1010|46|4669|121.40|special attainments beyond the blithely stealthy excuses are carefully among the fluffily pending pinto beans; unusual packages along the slyly even accounts are furiously fluffily +1010|81|1339|602.29|s detect quickly. slyly busy packages nag. silent accounts are blithely daring packages. slyly special accounts wake blithely blithely regular requests. c +1010|16|2835|953.52| bold, final ideas sleep quickly alongside of the ideas. carefully unusual platelets snooze furiously about the ca +1011|12|2337|880.92| across the quickly bold packages. fluffily final theodolites cajole carefully! daring, fluffy packa +1011|47|8142|542.37|nag furiously by the carefully regular foxes. final theodolites cajole. carefully bold packages promi +1011|82|4719|828.34|ironic theodolites. furiously special deposits wake according to the slyly special accounts. regular, final accounts affix furiously pending deposits. care +1011|17|9880|972.56|ic packages cajole carefully regular, regular warthogs. quickly regular requests boost alongside of the slyly final requests. furiously sly courts affix about the pending dolphins. quickly ironic +1012|13|8732|344.96|s. carefully final ideas about the platelets are blithely alongside of the blithely unusual asymptotes. slyly permanent packages are furiously. pending, regular pinto beans are sly +1012|48|1862|736.59|ions. final deposits cajole slyly across the theodolites. bravely regular dependencies nag across the final requests. slyly pending packages snooze. carefully blithe theodo +1012|83|4922|427.53|ffily alongside of the blithely ironic accounts. carefully bold braids are carefully. regular dolphins a +1012|18|712|893.16|ccounts sleep about the slyly regular deposits. final accounts across +1013|14|9442|553.33|ggle slyly among the attainments. furiously express pinto beans after the packages snooze carefully even requests. final, daring tithes along the furiously caref +1013|49|2126|276.40|arefully above the stealthy, final packages: accounts sleep against the slyly special deposits. theodolites sleep fluffily. asymptotes nag slyly accordi +1013|84|9752|297.64|uriously permanent pinto beans use. regular, regular pinto beans cajole carefully slyly even pint +1013|19|6953|705.93|refully pending deposits cajole blithely at the doggedly ironic packages. ironic, express instruc +1014|15|489|577.80|dolites sleep alongside of the evenly even accounts! quickly pending theodolites detect ruthless pinto beans. furiously regular excuses nag blithely. special, ironic realm +1014|50|517|927.01|n accounts. quickly pending packages are slyly bold instructions. blithely ironic instructions bre +1014|85|4214|37.13| bold packages wake across the unusual escapades. instructions cajole carefully express ideas: fluffily ironic excuses solve across the furiously bold deposits. +1014|20|6924|864.11|ly special decoys haggle furiously regular pinto beans. regu +1015|16|9057|795.39|uriously furiously bold deposits. slyly pending requests cajole carefully quiet requests. unusual, even ideas haggle carefully ironic dolphins. quickly regular instructions a +1015|51|3353|621.98|s deposits about the quickly final deposits haggle even excuse +1015|86|4584|253.97|ously sly instructions. quickly thin accounts affix along the furiously ironic instructions. carefully pending requests boost fluffily. Tiresias dazzle carefully across the fin +1015|21|8161|929.07|yly. carefully regular foxes impress. instructions cajo +1016|17|1817|669.25|hins alongside of the accounts haggle across the slyly bold accounts. furiously even theodolites solve along the quickly regular packages. furiously special instructions wake blithely account +1016|52|9659|466.18|. even instructions use blithely. fluffily pending accounts wake along the quickly pending instructions. ironic ideas haggle. final, regular platelets integrate slyly ac +1016|87|4250|109.11|rash slyly. blithely bold deposits sleep alongside of the final accounts. furiou +1016|22|3071|831.95|re furiously final deposits. closely regular gifts wake carefully across the foxes; even accounts play slyly. carefully ironic courts sleep slyly fluffily +1017|18|8673|735.38|along the carefully final ideas. furiously regular ideas sleep blithe +1017|53|6633|107.84|l, even accounts. silent deposits nag carefully across the regular, express packages. regular packages above the +1017|88|6246|494.24|usly silent requests detect. ironic accounts hinder fluffily bold accounts. requests detect dependencies; carefully bold fo +1017|23|7762|164.22|requests x-ray carefully ironic, regular requests. furiously final accounts are along the blithely ironic deposits! even, regular deposits grow blithely bold +1018|19|7527|89.26| regular deposits besides the quickly final deposits cajole fluffily slyly final instructions. dependencies doubt quickly regular warhorses. furiously unusual pa +1018|54|2255|15.53|ts. blithely even requests along the quickly ironic pinto beans kindle furiously blithely bold requests. furiously ironic deposits are fluffily. furiously pending a +1018|89|1366|584.71|counts wake according to the slyly regular requests. ironic accounts wake. idly bold packages cajol +1018|24|4195|194.78|could have to boost. slyly regular requests are along the blithely unusual hockey players. slyly regular packages snooze furiously regular dependencies. d +1019|20|9178|162.40|egular instructions. bold deposits across the furiously express dependencies integrate carefully against the blithely express d +1019|55|4083|454.83|ckages was. carefully regular ideas nag carefully across the fluffily regular foxes. daringly regular accoun +1019|90|672|95.11|ide of the ideas. blithely regular platelets hinder. carefully pending pinto beans wake along t +1019|25|2143|409.88| requests. carefully regular packages sleep carefully. express deposits nag bl +1020|21|3287|885.27|es affix final, regular accounts. special, ironic deposits grow along the even foxes. +1020|56|8465|715.20|ar requests boost carefully bravely pending requests. fr +1020|91|550|561.13|he bravely ironic accounts? quickly final accounts use thinly. furiously express packages solve quiet, final theodolites-- furiously bold requ +1020|26|4188|446.40|ts. ideas are permanently. blithely regular ideas lose. carefully special accounts sleep against the regular requests. bold, regular foxe +1021|22|8312|309.97|ges sleep furiously quickly final platelets. furiously pending instructions affix according to the busily unusual packages. deposits after the blithely even instructions sleep +1021|57|7843|63.50|y regular theodolites haggle after the blithely regular deposits. furiously regular asymptotes haggle. final, sly packages wake slyly-- carefully unusual instructio +1021|92|5178|630.99|riously special deposits wake carefully enticingly special accounts. special packages haggle slyly across the requests. furiously regular platelets hinder alon +1021|27|8624|743.71|ut the pearls boost quickly permanent packages. dolphins boost carefully. +1022|23|9118|130.75|ngly furiously ironic ideas. ironic deposits along the final pinto beans nag fluffily quickly ironic +1022|58|7171|949.03|s requests. theodolites impress slyly. carefully final accounts cajole quickly. blithely final packages haggle about the carefully pending pinto beans. final, unusual instructions affix alwa +1022|93|5760|458.65|doze. carefully even requests cajole carefully according to the carefully final pinto beans. blithe pinto beans nag across the regular, ironic platelets. e +1022|28|7540|404.32|uses. slyly regular accounts according to the theodolites cajole quickly across the regular, special pinto beans. furiously ironic instructions use blithely carefully even +1023|24|3286|361.23|ounts are blithely according to the carefully idle platelets. furiously bold accounts wake. slyly pending ideas cajole. bold packages use. sly dependencies use +1023|59|4257|486.30|gle blithely blithely pending instructions. closely final pains affix quickly after the furiously pending pinto beans. ironic pack +1023|94|1065|608.83|fter the braids. furiously express ideas haggle regular, special pains. furiously bold accounts haggle according +1023|29|7613|933.59| carefully even theodolites. fluffily final deposits hagg +1024|25|9824|649.03|lms. furiously pending theodolites according to the unusual, brave theodolites nag quietly outside t +1024|60|8268|332.72|uriously ironic accounts. quickly bold packages nag quickly according to the ideas. brave deposits nag fluffily across the sp +1024|95|396|807.22| requests affix regular requests. final pinto beans with the ideas must have to cajole fluffily express requests. quickly ironic theodoli +1024|30|8182|576.69|yly express theodolites. deposits hinder during the unusual, silent theodolites. carefully unusual packages are: deposits boost quickly. ruthless +1025|26|6647|310.87|, ironic forges. quickly special packages detect carefully accounts. slyly permanent frets print carefully. car +1025|61|961|206.47|s. furiously unusual packages haggle? fluffily even deposits sleep furiously about the carefully final patterns. fluffily pending m +1025|96|2114|860.89| requests wake final requests. furiously thin platelets print +1025|31|1849|636.44|eposits wake according to the carefully final instructions. furiously express pinto beans serve fluffily ironic requests. carefully final sentiments are furiously. unusual excuses are furiousl +1026|27|2474|473.62|he slyly unusual requests boost unusual, regular pinto beans. blithely enticing dependencies are slyly pack +1026|62|52|220.38|into beans! even deposits grow. furiously ironic packages integrate quickly quickly ironic dependencies-- blithely ironic deposits affix carefully final courts. blithely regular pinto beans a +1026|97|4706|865.57| carefully pending packages. even asymptotes cajole quickly. quickly ironic packages detect among the bold, regular accounts. even, special foxes cajole blithely according to the slyly +1026|32|6945|232.64|quickly slyly regular packages: special requests cajole qu +1027|28|8529|161.40|ickly special platelets according to the epitaphs wake carefully regular, unusual packages. slyly ironic dependencies integrate carefully around +1027|63|3138|553.85|slyly silent notornis after the carefully bold packages cajole special, quiet theodolites. ironic dependencies haggle carefully. s +1027|98|4185|4.00|regular packages above the requests was ideas. carefully stealthy packages after the final accounts sleep accounts. even requests accord +1027|33|9400|584.14|express pinto beans boost blithely silent requests. enticingly express accounts cajole according to the regular, bold excuses. final packages sleep slyly regular ideas. carefull +1028|29|3228|557.36|gular requests haggle ironic requests. blithely regular sentiments wake fluffily among the blithely pending instructions. unus +1028|64|6824|54.78|ial packages sleep around the pinto beans. fluffily regular att +1028|99|2520|796.16| boost slyly above the carefully regular grouches. slyly regular packages haggle quickly silent foxes. carefully final courts doze. realms about the quickly unusual packages play carefully after +1028|34|2974|585.48|ses: even instructions around the blithely special excuses wake furiously furiously even deposits. furiously special ideas +1029|30|6409|210.15|ular requests haggle around the even, final excuses. silent pinto beans haggle quickly. blithe, even accounts wake. unusual theodolites a +1029|65|7138|739.65|t packages sleep blithely above the slyly regular platelets. ironic orbits along the final accounts cajole carefully by the brave deposits. blithely final requests haggle furiously +1029|100|4972|950.44|ronic, pending platelets are across the furiously ironic theodolites. fluffily special ideas haggle furiously slyly express inst +1029|35|2847|61.59|ites doze blithely final requests? furiously silent packages hang requests. regular, regular requests sleep quickl +1030|31|5575|382.76|s. special foxes sleep slyly even packages. silent, bold accounts use blithely. accounts along the packages sleep +1030|66|7986|734.59|entiments. furiously final foxes sublate. carefully bold instructions use quickly bold instructions. ironic, express deposits mold ironic, regular foxes. theodolites nag +1030|1|8636|711.73| deposits along the blithely special excuses wake thin, even platelets. blithely regular ideas among the quickly even foxes cajole carefully at the regular accounts. silent pinto bea +1030|36|3726|126.41|refully final forges solve above the furiously final accounts. theodolites use slyly against the regular +1031|32|7443|916.88|ilent ideas. regular foxes wake blithely-- slyly final instructions sleep quickly ironic, even asymptotes. fluffily regular deposits haggle carefully according to the caref +1031|67|8165|485.52|he blithely final accounts shall have to cajole according to the ironic ideas. furiously ironic instructions against the bold somas kindle carefully alongside of the slyly final +1031|2|9745|537.44|ven requests sleep blithely furiously even ideas. final, unusual gifts poach. regular hockey players poach carefully ironic, unu +1031|37|1591|887.56| evenly final deposits alongside of the furiously pending accounts cajole slyly among the special instructions. express foxes wake slyly alongside of the regular requests. pending dependencies are a +1032|33|607|241.20|ular pinto beans detect carefully ironic platelets. furiously final instructions wake slyly bold foxes. special, regular asymptotes cajole carefully carefully bold accounts. quickly final deposits +1032|68|9165|138.28|ng to the evenly ironic ideas? carefully even requests sleep furiously pending accou +1032|3|6606|557.35|lly even deposits wake slyly according to the courts. furiously regular ideas dazzle quickly? furiou +1032|38|4653|884.65|regular requests haggle. furiously even excuses nag. fluffily bold instructions nag according to the stealthily final a +1033|34|5911|239.74|lar dependencies across the pending dolphins cajole blithely among the bl +1033|69|3948|575.56|rding to the slyly special foxes. requests mold. ironic requests haggle along the slyly pending deposits. carefully final Tiresias above the theodolites are furiously sly +1033|4|8940|231.82| instructions breach fluffily. carefully regular escapades are past the slyly ironic requests. fluffily furious packages mold. always pending courts haggle blithely abo +1033|39|9315|386.36|yly unusual accounts. regular, even grouches sleep carefully quick +1034|35|4858|207.09|blithely according to the courts. accounts hinder. furiously regular pinto beans cajole slyly. acc +1034|70|3162|345.12|nt, even instructions wake fluffily after the even, ir +1034|5|7071|502.22|eposits-- even requests above the final instructions maintain silent theodolites. regular +1034|40|6128|515.66|. even, final asymptotes are ironically. furiously ironic pinto beans cajole. quickly regular requests haggle. pending, pending dinos cajole furiously blithely regular accounts. car +1035|36|7121|500.52|es final platelets. furiously regular foxes wake furiously blithely regular ideas. furiously ironic id +1035|71|8766|825.27|ss the regular accounts use blithely against the asymptotes. pending deposits integrate fluffily. even instructions shall have to cajole slyly. regular deposits wake silent requests. blithely +1035|6|2971|383.03|ly. quiet pinto beans would sleep furiously about the ironic instructions. ironic frays wake! blit +1035|41|8053|212.46| slyly final packages use slyly. slyly express dependencies +1036|37|4338|638.87|deposits integrate around the instructions. quickly pending foxes cajole slyly. packages was about the fluffily final orbits. packages integrate ca +1036|72|9708|352.54|ironic pinto beans. slyly even foxes use. carefully express requests sleep carefully against +1036|7|75|236.92|. ironic instructions integrate across the carefully regular excuses. sometimes final accounts are fluffily final, regular requests. eve +1036|42|6560|163.62| quickly slyly ironic courts. slyly express deposits cajole quickly around the final foxes. even multipliers doze carefully. even depths wake regular requests. quickly ironic pinto beans are +1037|38|7705|23.01|ges. slyly special ideas toward the furiously special accounts are slyly regular accounts. furiously final accounts cajole slyly. furiously silent excuses breach blithely theod +1037|73|1123|454.30|ly silent deposits. silent attainments boost. slyly regular foxes affix bravely: regular, idle requests against the quickly sly platelets cajole slyly +1037|8|4130|241.61|boost furiously between the blithely silent dolphins? regular theodolites are furiously furiously regular requests. slyly ironic braids according to the slyly +1037|43|635|101.94|sleep blithely around the slyly ruthless theodolites. carefully brave +1038|39|1373|277.69| requests above the final theodolites must cajole furiously above the foxes. even accounts haggle. blithely regular requests haggle according to the special accounts. deposits was b +1038|74|2985|54.97|ions sleep evenly after the ironic, ironic packages. pending, spec +1038|9|1566|74.54|ven foxes. blithely silent foxes across the blithely regular foxes kindle for the quickly ironic asymptotes. ironic ideas sleep blithely alongside of the blithely regula +1038|44|9667|216.91|luffily ironic excuses wake. regular instructions caj +1039|40|3652|452.03|lar requests after the even accounts haggle quickly un +1039|75|1222|39.65|wly against the quickly final accounts. unusual, regular accounts haggle slyly +1039|10|5523|271.83|ccounts use quickly slyly special theodolites. slyly special foxes are above the regular, special pinto beans: +1039|45|5884|511.50|, final accounts cajole; blithely express requests are blithely slyly pending ideas. carefully final +1040|41|320|526.76| even realms. furiously regular excuses haggle blithely carefully final excuses. silen +1040|76|6172|241.91|lly ironic dolphins. unusual accounts use carefully furiously pending instructions. furiously special packages play blithely special asymptotes. furiously ironic dolphins sublate. +1040|11|1209|9.30|kages. slyly unusual accounts about the theodolites are quickly up the p +1040|46|6890|706.58|, final instructions. quickly express requests around the pending pains cajole furiously quickly bold theodolites? quickly bold deposits wake. ironic packages +1041|42|3620|436.90|al accounts cajole finally blithely ironic accounts. even requests engage according to the carefully final platelets. slyly silent courts could wake among +1041|77|5434|503.88|even excuses nag slyly close accounts. accounts according to the carefully regular dependencies haggle sile +1041|12|7723|331.70|deposits wake carefully about the quickly final depos +1041|47|2680|584.03|quickly slyly ironic dependencies. blithely ironic dolphins use about the blithely ironic theodolites. +1042|43|2968|813.01|. sly instructions sleep furiously against the slyly express foxes. ruthless requests about the spec +1042|78|3296|989.30|press asymptotes: furiously bold deposits sleep quickly among the slyly ironic deposits. regular foxes nag boldly. accounts above the ironic accounts sleep blithe +1042|13|7049|905.61|uests. blithely final ideas haggle after the furiously silent account +1042|48|1512|861.96|ickly ironic instructions about the ironic asymptotes run slyly even deposits. special requests are across the thin accounts! blithely final pl +1043|44|8561|563.71|gular requests haggle slyly. fluffily express instructions haggle carefully across the furiously unusual courts; theodolites among the close, spe +1043|79|7307|903.78|! special packages can cajole quickly quickly even packages. quickly final +1043|14|7862|105.59|sts. fluffily express packages dazzle according to the furiously regular dependencies. slyly final pinto beans among the carefully ironic dependencies sleep furiously +1043|49|8761|737.63|fluffily regular theodolites are slyly even foxes. even instructions believe express, ironic foxes. unusual, final foxes against the carefully regular waters sle +1044|45|9251|857.55|slyly final, final courts. ironic accounts cajole slowly. ironically regular requests haggle. +1044|80|5402|357.79|ard the carefully thin packages. blithely bold requests affix blithely ironic depths. regular, even fo +1044|15|9057|657.32| cajole. carefully special ideas boost blithely. slyl +1044|50|2349|706.73| cajole slyly final accounts. fluffily even pinto beans are fluffily regular theodolites. furiously regular instructions impress? furiously express notornis sleep above +1045|46|2977|121.25|luffily. slyly pending deposits integrate finally packages. carefully final deposits +1045|81|7527|125.62|y. bold, ironic deposits impress fluffily even, thin acc +1045|16|6423|665.40|c forges. blithely ironic instructions haggle furiously. pending, ironic instructions after the finally express de +1045|51|1546|729.33|nto beans sleep furiously slyly slow asymptotes. regular accounts haggle carefully across the special, e +1046|47|5150|272.08|dependencies. pending packages after the busy accounts sleep carefully above the deposits. pending courts atop the carefully even packages wake quickly across the fluffy theodolites. special account +1046|82|2104|604.71| brave requests. quickly regular packages nag carefully. silent theodolites was slyly. final instructions wake furiously. slyly brave pinto bea +1046|17|9190|762.79| fluffily regular packages integrate. regular sentiments breach blithely blithely special asymptotes. silent accounts wake carefully orbits. ironic courts wake packages +1046|52|230|159.58|ending accounts. furiously final deposits haggle slyly. permanently even packages affix slyly across the slyly ironic requests. ironic, final packages after the special instructions boost da +1047|48|2810|907.16|tes across the pinto beans poach doggedly quickly unusual account +1047|83|4521|963.00|onic, final dolphins wake against the final, express requests. regular +1047|18|9660|375.80|ly ruthless requests alongside of the fluffily final ideas haggle blithely regular d +1047|53|1455|543.79|ully upon the slowly idle deposits. bold, silent ideas above the special, ironic requests kindle across the carefully regular instructions. slyly i +1048|49|5744|761.16|thely pending deposits wake blithely. quickly regular packages are furiously pending deposits. quickly unusual ideas affix slyly regular, pending +1048|84|1414|793.52|ng to the furiously special theodolites. quiet, stealthy instructions boost. regular deposits use carefully. the +1048|19|3083|218.57|ly ironic instructions. regular packages against the carefully express pinto beans sleep carefully along the packages. regular, silent theodolites cajole carefully theodolites. +1048|54|1741|329.01|gly furiously regular dolphins. final multipliers mold. daring, even foxes wake slyly quick ideas. furiously final platelets are furiously after the asymptote +1049|50|7637|459.88|furiously bold, silent deposits. even, even deposits boost. pending requests sleep slyly. unusual packages sleep furiously across the fluffily unusual requests-- blithely final accounts s +1049|85|412|203.11|t tithes are carefully after the even accounts. accounts haggle slyly furiously bold packages. furiously pending excuses nag slyly across the perma +1049|20|8448|296.36|g accounts. slyly unusual platelets haggle permanently among the blithely special ideas; carefully unusual packages engage fluffily in pl +1049|55|6584|141.59|ccounts cajole packages. quickly special packages play ironic foxes. ironic packages wake against the fluffily unusual +1050|51|3058|252.07|uickly foxes. closely ironic requests cajole fluffily after the blithely pending foxes. special pinto beans cajole carefully final pinto beans. blithely slow accounts boost. slyly unusual theodolit +1050|86|146|932.55|ts. carefully bold theodolites cajole slyly silent packages. furiously express deposits boost according to the furiously final instructions. carefully p +1050|21|9035|125.14| regular packages. final packages sleep furiously pending, even packages. slyly final packages cajole fluffily blithely pending ideas. care +1050|56|4888|494.24|riously across the slyly regular foxes. excuses cajole fluffily blithely brave deposits. furiously regular +1051|52|5470|150.67|s wake across the slyly regular deposits. furiously express ideas believe slyly regular accounts. furiously unusual +1051|87|3345|134.23|ites print busily. special deposits boost quickly unusual deposits. silent in +1051|22|1371|550.98|etect ironic, ironic deposits. carefully even platelets according to the +1051|57|5355|743.87|tions haggle. quickly bold requests use at the furiously regular requests. furiously regular instructions serve blithely after the regular gifts. closely special reque +1052|53|7880|908.45|ld instructions. deposits dazzle furiously special foxes. dependencies sleep. slyly regular theodolites after the unusual pinto beans sleep except the expre +1052|88|9278|705.59|y across the furiously pending foxes. carefully final pa +1052|23|3818|926.04|lar accounts after the fluffily final pinto beans are furiously according to the pending requests. brave, final requests might cajole alon +1052|58|6344|622.04|sts. regular packages affix deposits. carefully even requ +1053|54|9755|189.42| beans. unusual pinto beans impress. carefully ironic packages cajole slowly furiously even theodolites. carefully +1053|89|5370|63.29|beans. final, pending frays above the special packages affix slyly against the blithely even pinto be +1053|24|8761|106.70| asymptotes solve quickly against the special, ironic accounts. blithely blithe asymptotes across the regular requests hang quickly fluffily final patterns. even, p +1053|59|9052|412.70|eful sauternes. foxes cajole. foxes sleep furiously furiously ironic foxes. finally ironic acco +1054|55|7765|383.52|ng accounts around the blithely pending asymptotes cajole slyly furiously express dolphins. blithely even packages +1054|90|8901|396.42|the furiously ironic dolphins. slyly ironic instructions cajole. even asymptotes about the even sauternes boost slyly across the carefully special epitaphs. slyly bold ideas are carefully +1054|25|9703|414.14|ithely pending theodolites. ironic platelets are furiously carefully quiet packages: fluffily +1054|60|4050|660.52|deposits. blithely even instructions wake carefully about the unusual, quick pinto beans. fluffily final accounts wake! bold accounts ha +1055|56|5016|641.93|yly express foxes. fluffily final dependencies against the final +1055|91|9138|789.14|sts are furiously busy pinto beans. express accounts use furiously. cou +1055|26|4439|490.16|lites are quickly slyly thin asymptotes. even theodolites according to the furiously bold packages thrash across the blithely express requests. ironic dolphins alongside of the deposits ha +1055|61|7057|620.89|s boost slyly final packages. carefully bold accounts after the slyly unusual packages nag slyly above the permanently unusual a +1056|57|4170|900.63|sits are carefully express requests. blithe, regular deposits wake carefully. excuses sleep quickly slyly even pinto beans. +1056|92|9062|184.30|nto beans. carefully ruthless foxes haggle carefully. even deposits boost quickly. furiously final asymptotes sleep quickly against the furiously special +1056|27|1084|789.48|accounts. even accounts sleep permanently slyly unusual requests! bold, final packages cajole slyly r +1056|62|4742|162.82|. bold ideas sleep slyly. carefully express courts wake. dogged accounts +1057|58|4661|526.77|ep. deposits are blithely. slyly special dependencies kindle. platelets sublate silent, regular requests. furiously ironic accounts are furiously even packages. pen +1057|93|9062|481.63|eep carefully even packages! ironic foxes integrate. slyly bold deposits +1057|28|586|956.94|es. dependencies cajole daringly unusual accounts. silent packages boost carefully blithely special requests. thinly ironic ideas sleep after the final packages. regular, express +1057|63|4992|565.89|lites haggle fluffily special accounts: blithely even platelets cajole carefully. regular, final packages nag. ironic theodolites sleep quickly about the quickly furious pinto beans. furiously pendi +1058|59|5494|649.73|s; closely pending instructions wake furiously regular accounts. furiously express packages are carefully final foxes. quic +1058|94|5154|147.73|ily express dependencies sleep slyly inside the pending, even asymptotes. instructions according to the slyly brave i +1058|29|606|620.06|press requests about the furiously final ideas haggle to the somas. furiously pending requ +1058|64|2620|971.58|s haggle beside the furiously ironic packages. ironic, unusual packages ought to nag quickly! blithely unusual foxes wake blithely deposits. carefully special de +1059|60|2046|805.23|etect carefully furiously regular accounts. slyly regular sauternes after the quickly pending instructions wake quickly exp +1059|95|8992|217.87|e fluffily even ideas. regularly final accounts cajole carefully above the furiously unusual deposits. slyly bold pinto beans detect. ironic, special asymptotes may cajole around the ev +1059|30|6975|590.11|egular excuses. slyly regular attainments cajole. furiously special instructions integrate slyly special, bold accounts. furiously ironic ideas gro +1059|65|8110|36.47|ng deposits. carefully special theodolites sleep quickly along the regular, express ideas +1060|61|9808|869.37|ithely ironic ideas nag final, pending accounts. fluffily unusual requests use even instructions. quickly final warhorses cajole furiously into the blithe +1060|96|8528|301.89|tes integrate carefully. slyly even requests according to the blithely express asymptotes detect furiously upon the furiously express theodolites. slyly unusual accounts are a +1060|31|2651|86.52|nts. slyly final excuses after the packages wake blithely express ins +1060|66|8287|871.23|unts. blithely even foxes against the blithely bol +1061|62|8044|465.86| affix always carefully ironic deposits. furiously regular accounts against the slyly ironic dinos wake quickly after the +1061|97|3706|797.47|int furiously above the even, final ideas. even accounts use furiously according to the carefully silent accounts. regular requests sleep blith +1061|32|7415|683.68|usly final instructions. pending platelets after the blithely ironic deposits haggle slyly according to the ca +1061|67|8451|231.06| sleep carefully fluffily bold pinto beans. special, ironic +1062|63|1307|503.87|romise blithely about the furiously express platelets. doggedly unusual packages are carefully final ideas. furiously pending deposits wake among the careful +1062|98|534|245.48|press foxes breach after the blithely bold accounts. regular dolphins are after the epitaphs. carefully regular ideas detect carefully blithely pending requests. packages na +1062|33|2783|117.30|lyly unusual hockey players sleep. carefully final accounts are slyly unusual packages. dependencies doze against the furiously special packages. expr +1062|68|9103|753.18|ccounts. final, pending instructions after the quickly blithe tithes hinder quickly bold deposits-- r +1063|64|4723|454.83|. quickly pending dependencies are. fluffily even theodolites cajole. blithely pending theodolites thrash finally special braids. final gifts use carefully. regular, regu +1063|99|6860|82.10|dencies haggle slyly among the special pinto beans. final packages haggle quickly. quickly regular instructions wake across the furiously ironic theodolites. ironic, regular +1063|34|1184|399.47|st the regular, final asymptotes. slyly special platelets use slyly along the furiously regular requests; furiously even instructions sublate daringly. ex +1063|69|626|802.49|d instructions detect. slowly even deposits alongside of the carefully s +1064|65|2997|63.38|s-- requests cajole slyly carefully enticing dependencies! slyly +1064|100|7996|503.73|uests. theodolites are carefully among the fluffily special asymptotes. blithely express packages nag about the bold courts. slyly f +1064|35|1145|878.92|special requests boost furiously above the ironic, ironic foxes. slyly ironic asymptotes among the furiously unus +1064|70|3868|980.02|platelets cajole after the quickly regular pains. pending, caref +1065|66|9282|753.07|te alongside of the regular foxes. packages about the slyly p +1065|1|9334|602.50|inal requests use fluffily across the requests! requests hag +1065|36|1261|480.30|y unusual pinto beans use slyly above the quickly f +1065|71|3701|599.33|sly ironic requests. packages wake carefully. quickly regular ideas x-ray about the stealthily daring platelets. carefully final requests sleep slyly after the theodolites. unusual +1066|67|2392|121.59|y above the carefully bold requests. even packages boost slyly carefully regu +1066|2|3791|900.91|ut the express packages-- slyly even packages cajole according to the carefully silent foxes. blithely pending pinto bean +1066|37|6468|841.32|its? stealthily ironic accounts at the even accounts haggle accor +1066|72|3302|347.62|s. final ideas use carefully. unusual, pending excuses hang against the regula +1067|68|2683|535.43|riously silent excuses. special instructions unwind among the slyly regular ideas. blithely bold ideas alongside of the carefully fluffy theodolites are furiously according to the regular, i +1067|3|7291|145.56|ages affix fluffily bold, even packages. requests cajole carefully. dependencies are quickly. unusual packages wake eve +1067|38|7384|116.92|arefully silent requests boost. quiet asymptotes +1067|73|3627|262.36|rly ironic foxes. regular, even deposits haggle final, even i +1068|69|9801|40.68|ges up the slyly ironic requests cajole carefully according to the unusual, pending requests. ironic, ironic requests was fluffily. blithely even foxes integrate fluffily about the busily expres +1068|4|1260|693.18|s are furiously across the quietly even accounts. pending d +1068|39|1258|100.60|ully slyly express packages. carefully final requests over the blithely final deposits serve according to the slyly unusual packages. busy accounts cajole car +1068|74|8624|664.41|ns. carefully pending foxes haggle. ideas grow slyl +1069|70|8884|29.88|ole. quickly even requests above the instructions detect blithely according to the +1069|5|7345|992.89|osits along the even packages cajole slyly special de +1069|40|8722|300.36|deas. slyly pending platelets sleep quickly regular requests. closely final instructions use. regular, +1069|75|9766|352.19|. final, express somas wake carefully quickly silent courts. pending, even packages integrate after the even accounts: carefully final ideas alongside of the furiously even ideas use against +1070|71|6822|445.09|instructions sleep carefully special instructions. instructions after the slyly bold accounts cajole slyly bl +1070|6|9272|227.27|requests! express, regular packages about the final requests dazzle carefully carefully ironic platelets. quickly even packages haggle +1070|41|9134|749.79|ts? bold, regular requests across the slyly pending packages are slyly ideas. quickly unusual deposits wake carefully bold notornis. +1070|76|7444|476.90|oxes must have to haggle. blithely ironic instructions kind +1071|72|6791|494.17|efully even packages about the slyly unusual platelets cajole carefully about the furiously i +1071|7|4420|19.75|g the furiously special asymptotes. slyly regular requests doubt +1071|42|2034|555.75|jole. carefully express requests above the blithely special ideas affix blithely carefully regular packages. quickly careful +1071|77|9574|980.60| carefully furious platelets kindle: quickly final dependencies are quickly deposits. quickly regular accounts haggle according to the slyly special instructions. express i +1072|73|3880|544.30|. furiously regular orbits are. furiously pending asymptotes are about the dolphins. pending dolphins after the slyly regular pinto beans integrate carefull +1072|8|712|453.28| excuses are special deposits. carefully regular asymptotes among the furiously final patt +1072|43|8957|162.44|r, ironic foxes. fluffily even instructions sublate within the unusual, unusual courts. regular decoys nag along the carefully special instructions. slyly unusual theodolites across the regular, +1072|78|6783|132.98|thely. even packages integrate furiously furious accounts. carefully regular platelets boost carefully slyly bold packages. final deposits hang furiously along the silent, daring platelets. nev +1073|74|2223|451.05| boost around the final ideas. ironic pinto beans wake. pending deposits print sometimes fluffily bold packages. ironic instructions integrate quickly. permanent, pending platelets sleep against +1073|9|646|631.01|furiously even foxes. carefully even requests affix. unusual, regular requests are. regular ideas wake carefully express de +1073|44|8919|115.31|s cajole carefully along the carefully regular deposits. fluffily pending deposits cajole blithely final theodolites. perman +1073|79|5047|153.42| slyly regular platelets. blithely final platelets cajole carefully dependencies. reg +1074|75|7447|397.46|st carefully above the furiously pending foxes. final instructions wake blithely ruthless requests. requests are. even, bli +1074|10|7311|933.08|he furiously unusual accounts. carefully regular accounts use across the quickly ironic requests. blithely express requests u +1074|45|2681|104.44|fix slyly pending realms. blithely ironic requests wake above the even theodolites. bravely final requests nag. ironic, regular deposits through the final ideas h +1074|80|2393|245.74|ial ideas. carefully permanent accounts detect bravely. deposits nag around the carefully regular dolphins. ironic deposits sleep carefully among the furiously special deposits: ironic ins +1075|76|7455|448.19|equests. furiously ironic packages are. accounts cajole furiously ironic pinto beans. regular requests sleep. stealthily even excuses sleep slyly blithely unusual accoun +1075|11|4347|475.40|nstructions thrash furiously. slyly enticing packages cajole. deposits boost fluffily according to the blithely pending dependencies +1075|46|1966|263.19| packages. deposits after the blithely even excuses bo +1075|81|6189|27.61|ep. fluffily final packages cajole carefully besides the quickly per +1076|77|9628|714.32|. quickly regular requests cajole quickly. carefully pending instructions haggle blithely iro +1076|12|1659|662.81|ng foxes unwind. furiously unusual platelets wake slyly special +1076|47|7411|165.47|ts. furiously express courts are carefully regularly even accounts. accounts after the pending, special requests nag furiously silent platelets. the +1076|82|9345|63.72|escapades. slyly daring pinto beans along the furiously express packages cajole slyly about the instructions. slyly express theodolites haggle slyly. brave +1077|78|4476|341.30|lar, silent pinto beans use. express pinto beans mold. quickly ironic deposits after the blithely even sheaves lose furiously whithout the express, final asymptotes. blithely b +1077|13|3544|180.43|blithely final forges wake quickly somas. fluffily bold accounts use quickly throughout the carefully ironic orbits. ironic +1077|48|3397|788.24|urts haggle furiously about the regular patterns. quickly express ideas use above the +1077|83|2347|375.44|press pinto beans. carefully pending deposits cajole special accounts. requests haggle across the ironic accounts. blithely unusual packages use quickly pending acc +1078|79|4814|505.36| pending packages around the slyly bold excuses boost blithely at the packages. r +1078|14|7132|255.07|uests cajole carefully slyly final packages. carefully unusual ideas cajole quickly at the furiously iro +1078|49|6831|485.07|en theodolites are across the quickly regular instructions. slyly enticing requests cajole furiously even fo +1078|84|4499|874.03| regular, regular ideas wake slyly above the enticingly even packages-- regular, regular accounts nag idle packages. fina +1079|80|8848|635.61|eans. regularly special accounts along the quickly special ideas haggle stealthily alongside of the even, even pinto beans. unusual platelets are furiously alongside of the fluffily bold asymptotes. +1079|15|9167|623.67|ites. slyly regular somas wake furiously along the carefully pending requests. ironic excuses +1079|50|1327|740.76|es. silent platelets against the furiously unusual packages use ironic, regular deposits. tithes detect carefully regular pinto +1079|85|4649|508.39|tions above the carefully final foxes wake slyly according to the pinto beans. regular, regular theodolites among the permanent platelets haggle blithely along the even packages. +1080|81|658|282.34|ckly regular warhorses lose slyly. idly ironic requests boost furiously blithely final pearls. furiously quick pinto beans around the quickly exp +1080|16|7909|209.47|ously furiously express requests. furiously even foxes after the quickly bold instructions haggle slyly never even packages. carefully final instructions above the bold accounts haggle +1080|51|6226|371.21| the final, ironic accounts. carefully even requests wake regular sheaves. slyly final packages cajole carefully ironic dolphins. Tiresias may are. regular requests ha +1080|86|5043|345.38|ly express pinto beans. idly special dependencies wake unusual excuses. slyly i +1081|82|8100|857.22|patterns sleep-- silent, even instructions kindle slyly silent, final instructions. regular, even accounts sleep furiously a +1081|17|8102|899.76|; blithely pending foxes use carefully. carefully bold accounts are carefully at the slyly ironic dependencies. blithely ironic dependencies across the ironic pinto bean +1081|52|5527|595.41|enly ironic excuses nag blithely. carefully final foxes according to +1081|87|9721|248.31| the permanently final packages. carefully special ideas alongside of the carefully regular foxes wake furiously unusual accounts. quickly bold requests boost pending, final accounts; carefull +1082|83|1443|751.98|uickly regular accounts. ironic packages across the requests cajole blithely accounts. unusual packages sleep quickly after the furiously regular instructions. quietly unusual accounts sleep care +1082|18|6543|342.65|s. final, express theodolites affix after the excuses? stealthily special dependencies thrash slyly express realm +1082|53|6875|826.47| beans detect quickly of the furiously regular packages. ironic, regular requests integrate after the courts. ironi +1082|88|6139|530.70|ress accounts haggle carefully. fluffily regular instructions sleep slyly slyly ironic accounts. silent excuses cajole. furiously +1083|84|6119|648.47|hely unusual asymptotes are carefully. furiously ironic ideas after the fluffily furious instruction +1083|19|9551|955.35|out the regular dependencies. furiously pending packages are slyly after the carefully ironic instructions. blithely final requests around the quickly express requests sle +1083|54|5673|777.88| bold, express accounts haggle furiously even, final deposits. carefully bold pinto beans sleep quickly. unusual, even asymptotes sleep fluffily among the f +1083|89|1744|107.45|ding packages. slyly regular packages haggle blithely across the bold, silent requests. quickly express instructions integrate +1084|85|9043|963.12| carefully express packages cajole among the express ideas. slyly even foxes nag furiously along the fluffily silent theodolites. closely +1084|20|6341|377.46|nically ironic instructions. final, unusual accounts was quickly express packages. blithely pending requests haggle pending accounts. even +1084|55|8629|516.97|l dugouts about the blithely special foxes believe after the pending requests. carefully express as +1084|90|3453|622.90|ironic asymptotes will have to wake. regular, special pinto beans wake a +1085|86|9437|692.71|e the slyly dogged instructions! regular, final pinto beans unwind. sly +1085|21|2480|234.42| the accounts. blithely unusual instructions sleep blithely ironic, unusual accounts. final, regular requests after the thi +1085|56|460|111.76| packages after the blithely bold deposits sleep after the furious +1085|91|5827|543.80|across the pinto beans. carefully pending pinto beans cajole slyly. even requests must have to affix above the ironic, final requests. daringly unusual foxes sleep furiously. +1086|87|278|963.48|h quickly blithely unusual deposits. ironic, final accounts sleep blithely. silent requests cajole above the ironic instructions. final deposits are carefully a +1086|22|3499|465.65|ickly express deposits during the blithely silent dependencies was furiously atop the ideas. dependencies boost slyly final theodolites. close instructions lose quickly abo +1086|57|4452|261.84|ily. carefully bold packages wake silently ironic tithes. blithely final dependencies wake instructions. special deposits doubt. blithely even dependencies thras +1086|92|8448|359.80|express, even foxes sleep bold theodolites. even excuses wake. regular deposits against the ironic instructions are along the pinto beans. fluffily special pinto +1087|88|3282|345.03|-- requests haggle carefully fluffily special dolphins +1087|23|4412|990.23|e. express requests after the slyly regular requests wake quickly pending dependencies. ironic, blithe requests wake slyly caref +1087|58|4737|622.53|osits cajole stealthily. silent, final theodolites haggle after the pending, regular accounts. carefully bold courts wake furiously according to the final accounts. blithely ironic dinos bo +1087|93|6404|444.70|ithely final accounts. slyly ironic requests use fluffily about the ironic asymptotes. ironic dependencies beli +1088|89|2418|725.39|sts! blithely ironic ideas wake furiously against the unusual asymptotes. regular grouches sleep blithely. +1088|24|2932|46.80|odolites. blithely even Tiresias after the busily regular accounts cajole alongside of the ironic, bold accounts. ironic foxes cajole above the bold deposits. accounts haggle slyly slyly +1088|59|4598|624.40|accounts haggle quickly across the ironic accounts. furiously regular accounts print. foxes cajole furiously at the fluffily express requests. bold, final pack +1088|94|584|911.87|slyly. thin deposits haggle blithely. permanently pending excuses according to the furiously express requests are carefully +1089|90|4013|209.91|uses across the furiously pending requests poach according to the accounts. regula +1089|25|7407|721.58|efully blithely unusual pinto beans. blithely sly ideas integrate above the final, special +1089|60|4192|923.88|hes boost fluffily special courts. quickly unusual theodolites cajole. carefully express packages sleep carefully. carefully special deposits sleep. special +1089|95|5543|266.55|le among the pending instructions. even requests affix under the blithely ironic +1090|91|4797|570.25|to beans. furiously final foxes are carefully blith +1090|26|6913|903.66|tructions; fluffily regular packages cajole fluffily. unusual instructions among the express requests sleep sl +1090|61|8371|190.15|eodolites. slyly bold deposits detect after the regular, regular ideas! quickly express forges dazzle slyly quickly unusual pinto beans. furiously even asymptotes among the blithely +1090|96|1484|232.16| deposits sleep slyly carefully ironic dolphins. carefully pending deposits cajole carefully across the silently express packages: close, ev +1091|92|5407|56.63|ly ironic foxes. theodolites serve above the bold pinto beans. packages at the unusual platelets are blithely after the carefully regular requests-- final requests are carefully fin +1091|27|5950|993.08|hely against the carefully furious asymptotes. slyly silent theodolites +1091|62|9849|465.96|iously pending frays. regular requests according to the blithely bold deposits detect slyly bold asymptotes. furiously unusual instructions cajole according to the carefully final ideas. +1091|97|3959|387.46|ly ironic instructions boost across the slyly pending ideas. deposits are slyly across the +1092|93|2722|797.56|ns wake carefully busily even requests. theodolites use. carefully unusual theodolites cajole furiously above the slyly even requests. accounts integrate. carefully pending +1092|28|1971|205.65|refully regular asymptotes haggle furiously deposits. fluffily silent packages sleep among the furiously pending platelets. carefully daring wate +1092|63|1239|97.97|ously according to the regular, ironic foxes. theodolites about the slyly even accounts sleep slyly final packages. quickly unusual b +1092|98|1295|467.78|deposits. special instructions cajole furiously among the furious packages. daring courts +1093|94|5143|41.88|, unusual waters. accounts are along the special pac +1093|29|5087|796.95|nstructions wake sometimes final accounts. boldly unusual deposits lose across the ideas. slyly express +1093|64|3536|951.52|use fluffily fluffily regular deposits. packages w +1093|99|1471|257.72|blithe dolphins use even, silent theodolites. carefully final foxes cajole busily. even, unusual packages aga +1094|95|1152|135.05| above the carefully express platelets. fluffily regular pinto beans haggle slyly. furiously regular ideas use furiously blithe escap +1094|30|584|375.86|ilent foxes believe slyly blithely unusual accounts; fluffily ironic ideas cajole furiously unusual realms. ac +1094|65|733|644.47| the carefully regular deposits-- blithely regular instructions according to the pending requests poach alongside +1094|100|7289|551.27|furiously regular packages. slyly daring requests might sleep carefully idle accounts. quickly ironic accounts through the theodolites wake +1095|96|4889|682.20|refully quickly regular deposits. furiously regular packages hang slyly. furiously regular requests about the carefully special packages cajole quickly against the carefully bold ideas. furiously +1095|31|6100|359.48|eposits wake deposits. express platelets detect fluffily pending requests. unusual, pending theodolites affix evenly carefully ironic theodolites. even, regular requests +1095|66|1392|41.24|totes. slyly ironic instructions wake furiously. carefully special gifts haggle furiously quickly unusual asy +1095|1|6739|69.83|g the regular, regular instructions snooze across the slyly final packages. silent, final accounts affix blithely final accounts. f +1096|97|1032|28.55|l deposits cajole fluffily. ironic requests thrash. platelets slee +1096|32|5703|618.47|le pending, even requests. unusual tithes haggle bravely. quickly pending warhorses affix slyly bold, regular deposits. blithely ironic instruction +1096|67|8697|181.03|ronic packages sleep blithely after the final foxes. quickly ironic dependencie +1096|2|7463|807.33|jole finally quickly final deposits. ironic, ironic requests n +1097|98|6459|500.18|he furiously special accounts. ironic, unusual requests are after the packa +1097|33|6169|37.95|e express packages. regular ideas sleep blithely regular asymptotes. regular, regular +1097|68|8526|769.90|n slyly pending foxes; fluffily ironic foxes serve carefull +1097|3|2108|717.46|accounts cajole quickly packages. quickly special instructions affix. final, final accounts after the carefully ironic deposits are across the blithely final e +1098|99|4398|512.83|ounts cajole blithely final, final dolphins; fluffily special asymptotes believe. furiously express foxes are carefully silent deposits. packages detect ca +1098|34|3350|882.84|jole blithely against the carefully final foxes. busily regular ideas sleep fluffily against the final, regular deposits. slyly special packages affix carefully bold, even i +1098|69|3014|904.58|e. quickly regular pinto beans about the final accounts wake along the final, slow ideas; slowly regular deposits across the +1098|4|8623|658.59|ts nag furiously across the accounts. furiously pending pinto beans alongside of the +1099|100|6368|117.46|carefully bold deposits: close, pending deposits engage closely against the furiously even accounts. blithely ironic deposits +1099|35|6552|287.38|dencies wake. blithely regular theodolites thrash blithely. final, express deposits haggle carefully. express packages alongside of th +1099|70|4430|24.94|y bold excuses sleep slyly blithely unusual excuses. regular forges at the fluffy pinto beans are along the dolphins. bold instructions kindle furiously furiously final packages. bold, even +1099|5|405|770.84|dly ironic asymptotes sleep along the quickly even instructions. fluffily bold packages haggle blithely slyly regular platel +1100|1|8841|627.55|ar ideas use furiously alongside of the dolphins. quickly even requests hang-- slyly even asympto +1100|36|2746|998.80| detect ruthlessly. slyly pending foxes sleep quickly final asymptotes. blithely final deposits snooze furiously above the bold dolphins. fluffi +1100|71|9421|785.48|r instructions are. unusual deposits above the blithely pending ideas +1100|6|9710|915.56|forges sleep slyly special instructions. quickly regular packages sleep along the p +1101|2|7067|258.44| silent dependencies grow according to the quickly express theodolites. regular deposits cajole fluffily slyly special excuses. special deposits nag: slyly fin +1101|38|6223|116.49|cajole fluffily. fluffily final accounts alongside of the final requests detect bravely against the regular, even requests. fluffily pending deposits haggle fluffily quickly final asymptotes. fluff +1101|74|7381|969.76|re carefully pending dependencies. special dolphins above the bold attainments cajole slyly packages. carefully final requests promise blithely a +1101|10|2702|99.57|nd the fluffily blithe deposits. special accounts wake accounts. busily even deposits cajole alongside of the express instructions. closely silent forges wake bli +1102|3|5031|414.32|ronic platelets. deposits mold quickly accounts. furiously final accounts sleep furiously among the carefully bold foxes. carefu +1102|39|5021|644.29|ccounts haggle carefully. special packages boost furiously along the carefully regular accounts. instructions wake fluffily regular instructions. unusual theodolites after t +1102|75|7160|634.44|deposits cajole. accounts wake across the sometimes ironic asymptotes. final +1102|11|2842|784.60|ending dependencies are quickly alongside of the carefully regular dolphins. requests cajole carefully excuses. quickly ruthless pa +1103|4|1887|101.44|e quickly above the asymptotes. furiously regular ideas sleep furiously carefully ironic ideas. final, regular fr +1103|40|2579|933.24|ts. bold, final deposits are. slowly ironic pinto beans a +1103|76|2922|776.79|furiously unusual pinto beans haggle slyly. blithely final requests wake quickly: requests boost carefully special accounts. silent accounts doubt. regular, ironi +1103|12|6587|661.49|final instructions. ruthlessly ironic ideas are slyly blithely pending foxes. carefully ironic deposits haggle blithely. even, special +1104|5|9424|889.50|final, quiet packages haggle carefully after the carefully even packages. quickly unusual courts wake along the carefully express do +1104|41|7879|841.10|usy accounts. bold requests alongside of the slyly regular accounts wake slyly a +1104|77|7430|585.13|blithely among the blithely thin packages. carefully ironic epitaphs haggle b +1104|13|76|347.79| after the special ideas. slyly final deposits on the slyly even pac +1105|6|3003|332.92|essly regular packages haggle after the unusual, ironic pinto beans. carefully special packages haggle slyly +1105|42|3907|118.75| pending theodolites. quickly furious accounts haggle carefully about the pending accounts. quickly brave requests around the quickly even deposits +1105|78|4377|60.02|r foxes sleep? fluffily final platelets boost grouches. blithely pending theodolites wake-- furiously final ideas +1105|14|8638|75.39|lly over the carefully ironic pinto beans. final packages are slyly furiously ironic theodolites. quickly special accounts wake. +1106|7|8678|640.55|gle quickly above the ironic, final pinto beans. blithely pending deposits sleep quickly furiously express deposits. blithely express instructions +1106|43|1259|647.69|ar instructions sleep furiously final requests. regular theodolites sublate quietly unusual deposits. quickly unusual accounts a +1106|79|8865|692.65|patterns according to the carefully pending dependencies cajole blithely above the quickly pending requests. blithely regular accounts are among t +1106|15|7475|134.31| around the deposits. blithely regular foxes sleep final, daring excuses. slyly express instructions +1107|8|4090|791.91|shall was carefully across the special, final deposits. slow accounts haggle blithely unusual foxes. ironic, regular requests boost fluffily except the regular, ironic sentiments. slyly pending +1107|44|5764|59.30|cial, regular foxes are slyly furiously pending asymptotes. fluffily pending packages snooze slyly around the quickly ironic deposits. fluffily bold ideas cajole quickly about the unusual depos +1107|80|9010|845.35|the deposits. furiously special requests according to the careful +1107|16|6066|113.30| regular accounts. furiously unusual theodolites play carefully ironic foxes +1108|9|2022|417.19|y. quickly unusual courts haggle. quickly ironic requests sleep furiously furiously even dinos. blithely even foxes are furiously. foxes wake blithely against the quickly ironic package +1108|45|6344|921.18|fter the carefully final platelets. slyly silent packages sleep along the sl +1108|81|2722|900.32|riously ironic ideas haggle slyly. regular pinto beans are quietly after the slyly quiet platelets. bold, slow instruct +1108|17|6876|860.22|ully above the unusual, pending deposits. quietly regular pinto beans cajole according to the ironic dependencies. furiously even deposits sleep carefully alongside of th +1109|10|5622|364.86|sual courts detect fluffily fluffily unusual frets. final, regular packages detect fluffily pending instructions. express, special foxes sleep a +1109|46|2866|489.61|regular deposits haggle carefully special dependencies. carefully express packages +1109|82|1221|211.15|osits. express, even packages thrash quickly after the express packages. carefully bold pinto beans boost furiously pending asymptotes. foxes among the bl +1109|18|2244|599.83| dugouts sleep. furiously express excuses wake blithely. pending, final packages solve car +1110|11|9142|546.32|d blithely about the carefully ironic excuses? requests in place of the quiet, +1110|47|6989|382.66|accounts around the quickly special deposits wake above the blithely silent pinto beans. slyly regular instructions dazzle stealthily blithely express ideas. fluffily even sheaves about the +1110|83|1561|16.32| ironic forges wake unusual excuses. carefully pending deposits use among the careful platelets? quickly ironic patterns haggle along the packages. final pinto beans cajole carefully silently furiou +1110|19|8398|883.31|bold requests integrate carefully. slyly bold frets along the blithely ironic courts sleep furiously unusual asymptotes. fluffily ironic ideas wake. special packages sleep furiously: bold foxe +1111|12|7891|728.45|xcuses are quickly above the unusual dependencies. carefully regular requests hinder blithely +1111|48|668|461.00|pending accounts. fluffily regular instructions alongside of the carefully special warthogs snooze slyly slyl +1111|84|1726|22.72| blithely. carefully regular foxes cajole slyly ironic pinto beans. furiously regular packages kindle. slyly bold warhorses nag. quickly dogged accoun +1111|20|1547|560.69| requests. ironic accounts cajole quickly about the regular, even instructions. regular requests believe furiously against the carefully special accounts. quickly even +1112|13|2508|55.92|gular theodolites cajole blithely furiously unusual dolphins. fluffily final packages was slyly after the blithely brave instructions. bold, special instructions c +1112|49|5818|73.82|tect quietly across the fluffily final packages. quickly even pinto beans about the platelets +1112|85|3566|154.98|all have to affix. slyly special requests across the final pinto beans sleep furiously unusual packages. ironic, special dolphins bo +1112|21|6598|544.39| daring packages. slyly busy packages integrate after the blithely regular packages. bold, unusual theodolites wake even gifts. carefully silent asymptotes cajole +1113|14|1283|871.86|l pains. final, even dependencies use among the slyly express packages. slyly unusual ideas boost slyly even accounts. express, bold pinto beans sl +1113|50|7532|147.29| special ideas? pending ideas sleep carefully about the furiously final accounts. furiously even theodolites boost careful +1113|86|8504|178.30|beans was furiously daringly regular packages. ideas haggle slyly. carefully regular request +1113|22|5145|847.43|sleep. foxes haggle doggedly. regular accounts cajole blithely. slyly special packages haggle slyly. deposits haggle quickly furiously ironic asymptotes. furiously regular instructions cajole ca +1114|15|6864|126.56|counts use. furiously silent deposits detect furiously. slyly even excuses integrate quickly. quickly regular acc +1114|51|8746|386.15|nstructions. bold dolphins haggle carefully in place of the carefully pending escapades. furiously ironic +1114|87|836|765.14|sits sleep. quickly regular deposits run. slyly regular excuses cajole blithely according to the carefully fi +1114|23|9729|680.13|ing to the even foxes cajole furiously regular dolphins. pendi +1115|16|750|485.57|jole carefully across the carefully even deposits. furiously silent packages wake quickly. pending multipliers cajole. permanent packages cajole ca +1115|52|6858|338.47|ronic theodolites wake furiously slyly ironic accounts. express, regular deposits wake fluffily. quickly regular pinto beans across the unusual warthog +1115|88|9404|623.53|al packages haggle furiously. fluffily regular excuses haggle furiously quickly even foxes. i +1115|24|2752|311.33|furiously pending foxes. ideas cajole along the quickly silent requests. slyly final theodolites wake furiously fluffily regular deposits. unusual, even +1116|17|5142|970.85|s. slyly regular asymptotes cajole fluffily-- quickly final packages affix furiously. furiously ironic warhorses are always abov +1116|53|3722|497.74|sts. final dinos sleep thinly across the carefully regular requests. deposits sleep slyly after the quickly bo +1116|89|5105|103.12|ackages. fluffily unusual accounts above the carefully ironic foxes sleep abou +1116|25|2282|127.25|et instructions are always about the quickly unusual packages. furiousl +1117|18|5089|87.06|ven dependencies. doggedly ironic instructions across the b +1117|54|5941|915.17|thely ironic foxes. quickly final requests cajole slyly carefully special ideas. regular requests sleep blithely carefully bold pinto beans. spe +1117|90|4997|771.25|silent, ironic platelets are dolphins. carefully ironic accounts nag slyly carefully pending dinos. ironic dolphins haggle above the quickly sil +1117|26|2544|440.44|s. slyly final asymptotes cajole even, express requests. +1118|19|6041|145.01|endencies haggle regularly furiously final instructions; carefully silent ideas haggle +1118|55|8806|861.87|equests. final, ironic pearls cajole fluffily. slyly iro +1118|91|9990|141.81|ironic orbits engage alongside of the furiously bold requests; special, +1118|27|3593|16.27|r packages are quickly after the enticingly final accounts. slyly even requests +1119|20|2249|927.16|ly pending accounts. furiously bold asymptotes are instructions. quickly ironic dependencies sleep furiously express requests. quickly ironic accounts around the +1119|56|4953|414.87|eans-- special, unusual accounts after the stealthy, pending accounts boost furi +1119|92|2022|936.35|ly bold excuses use furiously! unusual ideas boost carefully against the +1119|28|5219|29.35|s are furiously according to the even sentiments. blithely silent accounts mold carefully above the express, f +1120|21|4386|51.63|unusual requests. furiously unusual waters are furiously fluffily ironic instructions. even accounts sleep care +1120|57|9022|906.08|the carefully ironic deposits. carefully regular dependenc +1120|93|3633|867.49|y regular, unusual instructions. stealthily regular theodolites use along the furiously express deposits. blithely silent forges cajole final, unusual foxes. doggedly regular requests hag +1120|29|4894|646.35| across the final, pending warthogs. carefully final accounts lose finally along the carefully ruthless instructions. regular, ex +1121|22|5116|299.21|nstructions. quickly ironic requests are until the requests? slyly regular deposits sleep. quickly fin +1121|58|9262|114.98| pending requests x-ray slyly final deposits; accounts print carefully above the furiously pending dependencies. slyly pending theodolites sublate quickly alongside of the ironic, bold requests. ex +1121|94|6525|615.53|onic asymptotes use slyly after the quickly regular pinto beans. carefully bold deposits cajole +1121|30|735|676.71|ar packages wake blithely among the blithely final theodolites. carefully ironic excuses about the platelets cajole carefully furiously +1122|23|4303|965.80|d, busy theodolites are carefully quickly ironic accounts. blithely ironic packages sleep. even requests cajole carefully carefully regular dependencies. c +1122|59|7865|624.18|alongside of the fluffily express accounts haggle blithely about the quickly even accounts. furiously even accounts about the regular ideas integrate blithely +1122|95|7906|245.65|accounts. final, pending courts wake quickly express deposits: deposits affix quickly despite the furiously even accounts. express deposits sle +1122|31|48|940.85|lithely final deposits. regular, special instructions boost carefully regular d +1123|24|8162|715.59|e quickly regular pinto beans boost daringly regular ideas. furiously pending requests after the slyly pending dependencies cajole blithely quickly regular instructions. +1123|60|6901|37.10|enticingly furious asymptotes against the furiously special dependencies sleep regular ideas. carefully unusual accounts wake carefully pending accounts. instructions along the blithely regula +1123|96|4277|365.47|s hang. slyly ironic accounts about the somas affix according to the daringly ironic pinto beans. slyly regular platelets use carefully ironic +1123|32|392|841.37|ar theodolites sleep fluffily silent, final excuses. deposits nag. fluffily silent theodolites use quickly carefully pending pinto beans. fluffily final asymptotes snoo +1124|25|749|137.43|es sleep fluffily around the bold braids. final, unusual deposits nag blithely. slyly ironic packages are furiously regular foxes. pending packages +1124|61|8918|383.03|express instructions are blithely. thinly bold warhorses against the blithely ironic instructions cajole ironic ideas. +1124|97|6379|166.50|ctions. slyly final platelets haggle. carefully unusual accounts alongside of the bold accounts sleep about the quickly regular instructions. accounts cajole quickly dogged requests. slyly unusual p +1124|33|9568|328.52|tes wake. blithely express hockey players doubt. special orbits cajole blithely instead of the furiously regular pinto beans. slyly unusual accounts after the careful, even theodolites sleep fur +1125|26|4829|149.05| nod fluffily. final requests cajole carefully among the carefully ironic pinto beans. f +1125|62|6626|832.21|reach fluffily. final packages boost asymptotes; requests cajole according to the furiously even requests. packages doze above the +1125|98|9995|25.17|hes. platelets shall have to sleep. furiously express accounts use against the even ideas: slyly silent requests detect furiously. slyly regular accounts about the evenly e +1125|34|9434|761.23|es cajole. quickly regular grouches along the furiously final requests affix blithely alongside of the furiously bold theodolites. ironic ideas wake thinly. furiously fin +1126|27|2117|878.58|eposits x-ray boldly bold accounts. slyly even packages after the furiously ironic dinos integrate slyly instructions. even ideas wake furiously regular, even grouches. regular reque +1126|63|3477|195.99|le furiously. final, even theodolites use. daringly bold pinto beans above the slyly bold foxes nag carefully since the s +1126|99|8023|517.96|ely pending accounts. fluffily special pinto beans inside the blithely unusual pinto beans eat around the ironic, ironic pinto beans. quickly unusual packages wake blithely accounts. blithe +1126|35|2092|218.22|ily bold pinto beans haggle furiously slyly final accounts? furiously daring gifts according to the final, final deposits ha +1127|28|999|445.87|deas. furiously special patterns sleep slyly. carefully bold requests nag furiously. even, bold theodolites along the regular, bold deposits cajole car +1127|64|9898|425.34|d pinto beans poach slyly quietly regular instructions. finally ironic packages grow slyly slyly unusual requests. deposits wake fluffily s +1127|100|5873|970.89|y even accounts across the slyly regular accounts nag blithely during the quickly bold ideas; requests wake blithely deposits. final deposits nag furiously since the ideas. regular deposits cajol +1127|36|2041|202.84|riously. even dependencies x-ray. carefully final pinto beans haggle furiously ironic excu +1128|29|5248|738.00|nent accounts cajole; ideas boost. carefully even requests wake carefully even, express requests. always bold packages shall have to was sl +1128|65|6604|164.50|regular excuses hinder carefully furiously blithe warhorses. slyly bold packages integrate; blithely final dependencies use blithely even, regular packages. requests wake +1128|1|6701|823.96|pecial, regular packages among the carefully bold accounts grow around the furiously express platelet +1128|37|2869|269.38|regular requests haggle ironic asymptotes. slyly final asymptotes cajole furiously after the accounts. quickly ironic foxes integrate blithel +1129|30|2620|141.40|g asymptotes. pinto beans sleep quickly pending instructions. furiously busy excuses +1129|66|2721|43.75|counts haggle fluffily about the instructions. ironic pinto beans ove +1129|2|4428|306.93|ironic packages snooze above the furiously regular deposits. careful +1129|38|7971|899.66|ong the blithely final pinto beans. slyly final waters during the final instructions detect slyly along +1130|31|4409|909.79| after the slyly busy pinto beans: instructions are even requests. carefully ruthless accounts sleep furiously. slyly pending pinto beans nag quickly. quickly unusual pinto +1130|67|6286|295.58|ns. bold sauternes are. deposits are. doggedly regular packages are carefully. ruthless pinto beans integrate. fluffily final ideas nag furiously alo +1130|3|1997|968.50|ic deposits. fluffily regular foxes nag slyly. ironic accounts wake pending ac +1130|39|4330|998.54|beans hinder about the blithely bold platelets. express multipliers are carefully +1131|32|493|328.36| carefully. theodolites play furiously slyly final accounts. special accounts haggle furiously. regular, special deposits wake quickly through the furiously ironic pinto beans. slyly unusual th +1131|68|9099|516.41|bove the fluffily final requests. furiously bold sentiments use blithely even theodolites. slyly regular requests sleep against the furiously even pearls. furiously express instructions sleep +1131|4|897|202.39|ultipliers are furiously alongside of the quickly special requests. furiously daring requests sleep carefully even requests. regular dolphins alongside of the never thin pa +1131|40|7259|264.50|posits. pinto beans wake carefully among the regular, special depos +1132|33|3548|128.38|old pearls. regular accounts sleep regular instructions! regular requests around the fl +1132|69|7896|143.28|s. careful packages cajole furiously according to the carefully expres +1132|5|8967|776.44|encies. quickly silent requests unwind. special packages boost among the +1132|41|7660|813.72|symptotes against the quickly even packages cajole slyly final +1133|34|1950|931.83|ag over the ironic excuses. regular instructions sleep slyly. regular requests w +1133|70|2752|967.99|bold, regular accounts. carefully ironic gifts impress according to the slyl +1133|6|7647|424.87|ual foxes use furiously. bravely final accounts haggle quickly pending instructions. bold instructions are furiously above the furiously special platelets. id +1133|42|3136|183.94|ggle blithely special, regular pinto beans. carefully pending accounts boost at the closely ironic packages. ironic ideas sleep slyly across the expr +1134|35|7448|816.15|en accounts. ruthless, special packages nod fluffily furiously regular deposits. final, regular accounts mold. even, ironic hockey players use silently against the slyly fina +1134|71|8915|839.18| blithely along the slyly blithe deposits. ironic packages boost bli +1134|7|7182|388.06|. carefully silent packages use bravely slyly ironic pinto beans. slyly regular requests according to the deposits boost carefull +1134|43|624|858.36|ng furiously fluffily regular instructions? even requests sleep. blithely regular excuses haggle blithely for the s +1135|36|5073|84.73|ng accounts are. regular packages according to the furiously unusual packages play ironic waters. quickly final accounts a +1135|72|1691|783.81|uests. quickly furious courts haggle slyly about the blithely final packages. special, even acco +1135|8|1804|881.16|oost carefully always unusual theodolites. quickly specia +1135|44|6889|587.17| the blithely bold foxes nag furiously final packages. blithely ironic packages cajole furiously regular ideas. quickly regular requests wake quickly +1136|37|8400|582.87| slyly ironic packages across the pending accounts cajole quickly across the quickly final pinto beans. +1136|73|475|182.78|tructions use furiously busy theodolites. furiously ironic instructions against the slowly ironic theodolite +1136|9|9833|282.15|eans cajole fluffily carefully unusual requests. slyly unusual pinto beans sleep blithely. carefully even deposits use fluffily fluffily pending no +1136|45|8700|99.16| foxes. slyly express instructions detect slyly regular ideas. re +1137|38|7160|570.94|kindle slyly along the regular, even pinto beans. furiously regular ideas are quickly regular +1137|74|4314|633.11| alongside of the carefully bold deposits will cajole furiously against the blithely regular foxes. excu +1137|10|1736|452.99|cross the even, close instructions. pinto beans serve accor +1137|46|7239|282.75|. accounts are ironically. blithely even accounts integrate quickly. final pinto beans with the silent, pending escapades play along the furiously fi +1138|39|4806|84.41|fully final, ironic pains? blithely even courts cajole quickly until the slyly regular accounts. excuses cajole afte +1138|75|6767|400.43| regular deposits boost blithely along the fluffily special pinto beans. unusual ideas sleep blithely. requests play furiousl +1138|11|548|905.13|ithely furiously regular foxes. idly even deposits use blithely pending instructions. special, special deposi +1138|47|5713|930.09|ending packages wake. stealthily ironic packages cajole furiously slyly regular courts. ironic pinto beans wake furiously after the +1139|40|2492|698.35|s. furiously final packages was quickly final requests. unusual deposits affix after the blithely regular packages. furiously regular dependencies play furiously. blithely busy requests use blit +1139|76|4747|67.51|re slyly alongside of the blithely pending theodolites +1139|12|4889|39.16|ong the dolphins. special accounts haggle alongside of the slyly even deposits. quickly special forges above the slyly unusual r +1139|48|869|60.66| according to the final deposits. blithely special sentiments integrate carefully. regular deposits cajole flu +1140|41|2327|853.07|kly. slyly final theodolites across the blithely bold ideas sleep furiously carefully even theodo +1140|77|7249|955.92|quests. regular, special pinto beans haggle quietly regular, unusual packages. orbits use blithely regular theodolites. silently express theodolites above the regular wat +1140|13|7178|275.36|nic, special deposits across the slow requests use theodolites. carefully pending pac +1140|49|6788|819.61|haggle thinly? carefully final foxes are furiously according to the ironic pinto beans. unusual, special instructions do eat instead o +1141|42|1051|42.69|sily ironic packages cajole quickly final gifts. slyly bold foxes sleep slyly. carefully ironic asymptotes accordi +1141|78|9548|507.76| along the deposits. final instructions about the regular packages haggle +1141|14|5762|715.92|sly regular courts. slyly pending theodolites around the carefully express foxes sleep furiously even accounts. careful +1141|50|6900|618.19|ages. slyly bold packages wake slyly final excuses. slyly regular requests mold across the furiously ironic pinto beans: regular dependencies a +1142|43|4366|405.94|regular requests integrate slowly along the blithely ironic asymptotes. even platelets boost slyly unusual excuses. quickly special accounts according to the slyly +1142|79|2474|734.39|y unusual accounts. evenly ironic foxes cajole. furiously express packages snooze on the slyly even dependencies. stealthily regul +1142|15|137|448.76|lly. slyly fluffy accounts about the blithely fluffy dependencies detect carefully blithely final accounts. slyly unusual packages haggle pending dolphins. quickly final f +1142|51|7945|51.10|dly silent requests. slyly dogged deposits haggle carefully carefully even accounts. blithely even frets across the requests wake against the quietly special accounts. slyly pending +1143|44|2595|11.87| regular deposits. ironic courts sleep blithely final platelets. furiously express requests use quic +1143|80|1124|936.62|r blithely even packages. blithely busy requests should use along the slow, special packages. blithely bold requests kindle slyly above the quickl +1143|16|7679|639.39| ironic waters sleep quickly after the unusual, special r +1143|52|3323|198.62|fully blithely regular accounts. bold accounts are fluffily blithely express packages. spec +1144|45|8423|846.74| across the furiously even foxes. accounts integrate blithely pending accounts. fluff +1144|81|8544|457.67|ch slyly even ideas. quickly regular accounts detect. furiously ironic dependencies sleep blithely slyly even packages. blit +1144|17|6811|882.72| ironic platelets. furiously express pinto beans sleep blithely. pending requests cajole even, even dependencies. special, ironic requests sleep quickly pending foxes. excuses acr +1144|53|5896|877.61|ffily special pinto beans among the carefully pending dependencies wake unusual packages. ideas throughout the blithely regular deposits haggle boldly carefully special accounts. +1145|46|2467|897.37|deposits impress furiously foxes. quickly even packages could have to wake quickly regular dependencies. dependencies along the deposits slee +1145|82|6494|361.19|into beans. express, daring foxes haggle slyly against the slyly unusual instructions. furiously even requests sleep blithely across the evenly enticing theodolites. furiousl +1145|18|8183|737.37|s above the carefully even foxes wake pending, bold theodolites. ironic pearls detect quickly across the ironic, unusual packages. expre +1145|54|9042|441.10|theodolites wake above the final sentiments. slyly bold accounts poach blithely express ideas. furiously final pin +1146|47|1302|217.97|lithely to the regular ideas. slyly pending foxes wake. special, final accounts maintain blithely express ideas. even, unusual ideas haggle. blithely ironic ideas boost carefully along the +1146|83|6931|260.50|ding, bold deposits impress blithely after the special, unusual deposits. carefully pending deposits are according to the packages. quickly regular excuses against +1146|19|9822|752.84|the even packages nag slowly carefully regular foxes. fluffily express foxes sleep above the final acc +1146|55|1931|733.61|ithely. regular, regular accounts wake quickly blithely express excuses; slyly even pinto beans sleep. quickly regular packages cajole. carefully even accounts wake around the re +1147|48|2284|194.99|ironic dolphins. fluffily ironic instructions believe slyly about the furiously even packages. blithely ironic accounts are the +1147|84|677|753.88|cial, final platelets haggle slyly fluffily final pa +1147|20|5363|353.55|regular theodolites are slyly against the quickly express +1147|56|627|269.67|lyly above the enticingly ironic accounts. fluffily special ideas haggle quickly blithely quick excuses. final accounts integrate slowly above +1148|49|4318|61.27|onic ideas. regularly regular ideas cajole carefully. fluffily ironic ideas x-ray furiously final asympto +1148|85|7929|65.04|ly ironic platelets are furiously according to the unusual accounts. even requests use. furiously pend +1148|21|4691|413.25|ideas alongside of the slyly ironic packages sleep slyly quickly final theodolites. slyly ironic requests detect carefully idly spe +1148|57|7976|628.56|l deposits. carefully special foxes sleep carefully. carefully ironic +1149|50|9712|984.97| packages wake furiously furiously dogged foxes. quickly final deposits hang instructions. slyly e +1149|86|1315|980.69|ajole quickly permanently ironic foxes. final pinto beans promise at the fluffily ironic instructions. regular excuses are carefully special, pending packages; blithely bol +1149|22|5061|61.96|s up the pinto beans integrate about the deposits. blithely final packages hinder after the +1149|58|5823|579.54|silent pinto beans. fluffily special deposits can wake furiously blithely special courts. slyly fina +1150|51|8986|276.46|nic, even packages are slyly along the slyly regular hockey players. q +1150|87|1841|295.49|usly final platelets haggle against the express, special pinto beans. final packages solve after the ironic waters. carefully final instructions wake among the carefully +1150|23|2904|511.04|sly pending accounts integrate furiously final packages. quickly +1150|59|638|745.00|the pending, regular accounts sleep carefully bold instructions. slyly regular requests boost from the slyly unusual inst +1151|52|534|901.56| express platelets? requests unwind furiously; dogged instructions unwind closely furiously even deposits. furiously final accou +1151|88|8615|793.61|the blithely unusual pinto beans. special deposits haggle thin, final instructions; stealthy ideas wake quickly according to the ironic ideas. iron +1151|24|3916|722.59|posits. quickly sly packages hinder slowly. quickly bold decoys are furiously final, pending packages. busy accounts boost excuses. unusual accounts nag never aft +1151|60|7332|889.77|ions. slyly bold pinto beans sleep among the slyly special ide +1152|53|1078|515.76|ly ironic theodolites. blithe, ironic ideas along the final requests boost regular platelets. blithely +1152|89|7302|187.19|uickly ironic packages nag furiously express foxes. furiously even ideas print. even excuses use about the regular p +1152|25|2669|404.44|times express requests. theodolites integrate. quickly ironic theodolites use slyly even accounts. even requests at the quickly even accounts use nev +1152|61|1269|417.37|y even courts-- blithely regular foxes nag slyly. instructions impress blithely express, regular deposits. slyly regular pinto beans nea +1153|54|5746|15.23|y quickly silent requests. slyly sly asymptotes wake fluffily furiously final ideas; slyly bold foxes unwind thinly express deposits. deposits unwind among the furiously +1153|90|9015|528.39|uickly since the quickly regular theodolites. carefully express instructions around the final deposits are idly +1153|26|554|707.02| instructions cajole along the regularly final accounts. quickly ironic pi +1153|62|592|986.68|ctions integrate: pending, quick accounts haggle carefully. slyly ironic accounts cajole furiously slyly ironic accounts. regular, final instruc +1154|55|4923|822.38|ges cajole above the slyly silent excuses. furiously bold accounts nag fluffily along the slyly regular requests. stealthy ideas sle +1154|91|3904|698.21|t the regular pinto beans use slyly silent platelets. fluffy pinto beans above the carefully reg +1154|27|3707|667.07|the quickly pending dolphins. carefully even deposits must have to cajole furiously express requests. ideas wake instructions. fluffily unusual frays sleep bl +1154|63|3537|817.18|al Tiresias wake. slyly express courts wake blithely ironic foxes. fluffily silent accounts wake carefully. quickly final dolphins about the blithely bold dolphins sleep blithel +1155|56|3141|266.88|usual ideas mold blithely against the express asymptotes: doggedly pending courts cajole. regular, final dependencies sleep. slyly re +1155|92|2710|211.85|ymptotes cajole. fluffily final Tiresias lose according to the enticingly final deposits. regular foxes run carefully final instructions. carefully ev +1155|28|3941|341.91|fily regular instructions boost furiously. carefully even requests haggle blithely. fur +1155|64|16|506.07|thely regular deposits nod furiously deposits. furiously bold platelets haggle furiously bold ideas. blithely express packages against the asymptotes serve slyly acr +1156|57|3132|247.24|detect slowly. final deposits nag at the regular deposits. express orbits according to the dependencies use across the carefully silent requests: fluff +1156|93|1928|680.74|the slyly regular accounts haggle slyly carefully ironic platelets. pending packages nag car +1156|29|290|774.80|r pinto beans-- quickly final instructions integrate alongside of the sly, silent th +1156|65|3850|225.56| the requests. slyly express orbits affix. evenly express deposits run thinly above the +1157|58|4522|75.69|pending pinto beans. slyly final requests wake. fluffily regular asymptotes haggle furiously furiously regular deposits. packages are carefully. blithely even realms across the +1157|94|8926|647.04| warthogs nag fluffily according to the quickly final ideas. regular deposits use carefully after the silent, bold instructions. furiously final deposits haggle furiously. bold, pending depo +1157|30|3781|844.41|lets. packages x-ray quickly express platelets. ironic foxes wake about the realms. excuses are quickly furiously ironic f +1157|66|6661|395.13|t deposits nag. even theodolites affix carefully. carefully special packages boost upon the +1158|59|8958|788.45|bold dinos sleep quickly. express, bold accounts use busily. blithely final foxes use carefully carefully ironic requests. regular platelets +1158|95|4904|862.54|unts use. instructions sleep quickly final platelets. blithely final packages among the fluffily even platelets boost at the finally even requests. bold requests +1158|31|8763|374.64|leep idly. unusual requests sleep about the deposits. furiously even packages sleep furiously alongs +1158|67|1877|98.90|gular, regular accounts. final, final pinto beans integrate never blithely final asymptotes. p +1159|60|1195|157.18|furiously. final platelets are blithely carefully final accounts. +1159|96|292|610.63|sleep slyly among the instructions. carefully ironic requests haggle slyly after the blithely special accounts. regular, silent packages against the blit +1159|32|2116|228.63|ely furiously regular foxes. packages print carefully carefully bold sheaves. gifts after the special packages haggle slyly carefully +1159|68|5827|645.53| blithely final requests nag slyly pending instructions. furiously special accounts cajole fluffily pending dolphins. express +1160|61|6412|436.19|s haggle. enticingly silent requests use slyly across +1160|97|5670|572.70|se slyly furiously special deposits. silent accounts haggle furiously. blithely final ideas are. permanent, express instructions integrate carefully against the express, special instructio +1160|33|3427|130.78| slyly pending foxes cajole furiously silent packages. silent, final asymptotes haggle furiously ironic theodolites. slyly final accounts nag quickly around the special dependencies. +1160|69|6562|405.05|sual requests about the requests affix furiously even deposits. quickly enticing deposits are. evenly daring theodolites above the daringly ironic requests +1161|62|4216|694.61| sleep blithely furiously regular pinto beans. final packages use according to the carefully express deposits. final packages cajole quickly regular courts. regular accounts eat. q +1161|98|8280|123.14|inal packages x-ray carefully across the regular, regular accounts. quickly unusual foxes integrate among the daringly express escapades! slyly special deposits ha +1161|34|8930|881.09|heodolites. dependencies are furiously. even, regular ideas x-ray blithely against the ironic ide +1161|70|8332|474.00|play according to the slyly even deposits-- ironic foxes along the final deposits haggle carefully above the attainm +1162|63|1130|595.56|ies. fluffily final foxes are at the dolphins: slyly unusual deposits are against the express packages. furiously silen +1162|99|8763|836.26|uickly regular requests. pending, final requests was along the pendi +1162|35|9087|218.25|s theodolites about the fluffily even deposits boost deposits. blithely stealthy asymptotes run blithely about the furiously ironic pa +1162|71|5644|25.25|yly against the bold, special theodolites. pending, silent excuses wake furiously. even theodolites sleep according to the pending, final foxes. regular pack +1163|64|1919|65.11|into beans integrate! carefully regular packages wake at +1163|100|1896|630.54|structions-- pending, regular excuses use slyly. carefully dogged ideas breach across the carefully ironic deposits. furiously ironic dolphins are. slyly unusual packag +1163|36|8955|304.90| special accounts. fluffily ironic ideas in place of the carefully regular req +1163|72|1321|727.17|instructions. quickly special requests cajole deposits. furiously final pinto beans wake permanently expr +1164|65|7404|888.55|ly alongside of the even, pending excuses. thin instructions cajole carefully blithely even packages. final, pending theodolites unwind among the furio +1164|1|4702|996.32|ges haggle final accounts. ironic deposits cajole never special pack +1164|37|5547|964.98|le carefully blithely special accounts. regular, regular ideas about +1164|73|7434|771.69|pending pinto beans after the quickly regular foxes cajole furiously alongside of the carefully slow asymptotes. bold packages ha +1165|66|4909|884.59|efully regular ideas. ironic packages cajole slyly. carefully bold somas nag q +1165|2|2040|256.66|s. close ideas sleep. slyly ironic instructions detect. furiously b +1165|38|8396|245.85| final theodolites. furiously special pinto beans doze carefully according to the quic +1165|74|2070|402.74|nts sleep fluffily final theodolites. carefully ironic instructions nag ironic, final deposits. even, bold attainments among the careful +1166|67|2434|801.53|regular dependencies. ironic requests cajole quickly. quickly +1166|3|6578|846.54|carefully ironic requests are slyly closely even foxes. ironic requests haggle slyly blithely final packages. even, ironic platelets sleep slyly according to the fluffily final deposit +1166|39|8859|100.93|he ironic accounts. furiously special deposits mold against the blithely final packages. accounts +1166|75|4180|275.25|foxes. slyly special ideas wake slyly. unusual depos +1167|68|8901|996.96|kages across the regular requests haggle within the carefully express packages. silent accounts wake. evenly even packages boost. blithely final deposits haggle blithely. packages +1167|4|41|758.02|s. blithely bold dolphins across the blithely even ideas are slyly final packages. bold requests boost evenly even epitaphs. slyly unusual requests haggle quickly against the special, sp +1167|40|6974|985.15|sts. ideas into the packages cajole carefully close packages. ironic foxe +1167|76|4237|70.89|s. regular courts since the furiously final requests solve carefully final foxes. carefully ironic requests could have to haggle regular foxes. foxes snooze after the s +1168|69|2993|840.76|y final instructions. platelets are blithely. furiously unusual accoun +1168|5|7386|912.44|ronic packages across the blithely close deposits boost carefully regular, bold frays. ideas use fluffily at the furiously final requests. bo +1168|41|2529|783.88|ven platelets boost slyly alongside of the frets. bravely even deposits nod furiously. ironic package +1168|77|9122|973.68|sleep. carefully bold theodolites are. final instructions along the fluffil +1169|70|8373|52.15|ackages about the regular packages cajole never special foxes. special ideas engage carefully. bold warhorses sleep furiously; slyly ironic asymptotes hang furiously. specia +1169|6|7397|619.44|icing deposits. furiously regular foxes alongside of the carefully silent depths sleep furiously even deposits. furiously special platelets boost according to the regular foxes. carefully regu +1169|42|8117|492.79|ly daring pinto beans nag furiously above the blithely express requests. carefully careful accounts ar +1169|78|2316|784.60|eaves. slyly unusual requests use slyly blithely express notornis: carefully ironic accounts detect blithely slyly final pinto beans. slyly final packages about the blithely silent excuses nag furio +1170|71|6056|115.32|elets use. furiously regular excuses nag slyly final +1170|7|4292|281.92|ully. pending theodolites haggle. unusual instructions believe furiously furiously regular foxes. ironic dolphins among the furiously pending requests use ruthlessly fluffily special ep +1170|43|9498|221.18|y pending packages. furiously pending accounts affix slyly fluffily special instruction +1170|79|7483|307.17|s. regular packages sleep blithely. express platelets wake blithely carefully final packages. carefully unusual instructions about the quickly unusual packages wake after the careful +1171|72|4920|19.44|usual, bold accounts. carefully express notornis wake furiously across the accoun +1171|8|5884|275.25|ckages wake thinly along the quickly regular theodolites. regular, ironic instructions wake-- ca +1171|44|7822|42.82|equests. furiously regular packages wake slyly above the final, regular asymptotes. blithely regular packages haggle beside the final accounts. carefully bold f +1171|80|6410|653.49|ns. furiously express pinto beans boost doggedly behind the regular r +1172|73|219|404.67| furiously pending ideas sleep quickly carefully silent instructions. furiously ev +1172|9|5393|263.80|ticing accounts wake furiously with the slyly busy excuses. carefully special d +1172|45|3578|392.38|press deposits after the slyly express asymptotes cajole slyly according to the slyly stealthy requests. ironic dolphins are slyly. blithely regular instructions against the +1172|81|2127|519.60| ironic, regular packages sleep slyly ironic requests. quickly regular requests wake. ideas haggle among the ironic theodolites. accounts grow slyly above the blithely ironic instructio +1173|74|7197|772.94| pending dolphins are slyly even accounts. final, regular deposits aro +1173|10|7314|978.28|ironic sheaves-- carefully final packages are slyly final patterns. always bold theodolites integrate. blithely final +1173|46|9863|533.75|ronic accounts sleep furiously. carefully pending packages after the ironic, final ideas wake carefully inside the carefully special a +1173|82|834|821.77|as sleep slyly. carefully special courts haggle slyly. fluffily idle frays at the furiously +1174|75|3041|411.29|are carefully final instructions. fluffily close requests are slyly. unusual requests sleep quickly pinto beans. furiously s +1174|11|1330|715.23|ously even packages. quickly ironic pinto beans beyond the regular requests boost furiously upon the warhorses. deposits wake furiously regu +1174|47|2448|25.53|g the slyly bold deposits. slyly express accounts sleep. fluffily even requests nag carefully blithely even instructions. even accounts wake about the carefully reg +1174|83|6384|690.86|al packages. furiously regular deposits wake quickly instructions. furiously final pinto b +1175|76|9858|37.68|are slyly ironic platelets. bold, express instructions sleep silent, pending patterns. furiously regular dugout +1175|12|7320|256.63|are final deposits. slyly bold waters x-ray slyly. frets haggle furiously near the unusual, final pinto beans. even theodolites use. blithely slow requests integ +1175|48|5618|745.03|egular instructions haggle. sentiments cajole dogged packages. slyly final theodolites across the +1175|84|9141|454.97| the careful accounts use fluffily courts. even, i +1176|77|2626|464.82|the slyly even deposits. even, final accounts are among the blithely pending packages. slyly even dependencies use. bold asymptotes wake alw +1176|13|4996|261.48|fluffily regular packages! pending, ironic packages among the quickly final packages detect furiously carefully regular ideas. even, regular packages will have to wake. slyly ironi +1176|49|5727|356.72|alongside of the slyly even foxes. pending, even dependencies sleep blithely among the carefully even excuses. quickly regular inst +1176|85|8957|652.01|ests. slyly final pinto beans nag express, unusual foxes. requests boost across the slyly bold requests. express requests along the special deposits cajole fluffily ac +1177|78|1647|529.20|usly pending requests detect quickly instructions. bold, eve +1177|14|7173|294.86|heodolites. instructions cajole blithely above the unusual, thin accounts. even instructions haggle busily ironic instructions. +1177|50|8680|924.58|ccording to the slyly even packages. quickly even hockey players haggle carefully instructions! blithely ironic requests cajole slyly above the blithely silent ideas. +1177|86|4939|23.48|theodolites. slyly regular packages use regular notornis. furiously regular ideas detect quickly. carefully fina +1178|79|5952|320.47|al warhorses haggle. slyly regular instructions cajole. furiously even packages serve. theodolites unwind carefully daringly express dependencies. accounts wake express, ruthless req +1178|15|4307|662.85|final requests. silent accounts across the foxes impress furiously furiously ironic +1178|51|9895|831.19|ecial requests use. deposits sleep blithely? final accounts impress furiously above the regu +1178|87|5638|847.92|l dependencies. final instructions above the regular, final deposits doze fluffily carefully iro +1179|80|3594|356.44|ly express pinto beans integrate carefully furiously bold pinto beans. slyly unusual platelets are finally. furiously unusual accounts detect within the permanently +1179|16|6926|945.16|r instructions wake across the blithely unusual platelets. furiously regular pains sleep carefully blithely final deposits. carefully unusual instructions +1179|52|4867|255.20|hin accounts lose slyly. carefully special pinto beans sublate against the regular, special packages. furiously bold foxes engage carefully regular depths. deposits cajole slyly about +1179|88|6911|655.08|cally final theodolites. quickly final dolphins hag +1180|81|1436|119.59| are. furiously ironic ideas run carefully unusual, pending pinto beans. final, final asymptotes cajole carefully even packages. final deposits dazzle. even warthogs haggle at th +1180|17|2047|191.45|en deposits haggle. furious packages kindle furiously. regular pinto beans use carefully. furiously ironic pinto beans sleep carefully. quickly special theodolites against the frays integrate +1180|53|1650|177.85| the sometimes quick packages are across the blithely ironic accounts. regular packages along the quickly unusual pinto beans haggle carefully final, even requests. even, fi +1180|89|2518|301.22|ggle after the fluffily thin requests. quickly pending requests nag blithely ironic requests. regular, final theodolites wake carefully. blithely bold requests grow about +1181|82|8149|919.72| the blithely final pinto beans. bold instructions haggle. excuses sublate bravely alongside of the regular, regular pinto bea +1181|18|7974|330.96|ide of the quickly special dependencies. regular ideas cajole about +1181|54|361|285.60|ts are slyly. quickly express deposits sleep blithely-- slyly unusual accounts cajole quickly express accounts. expres +1181|90|7826|151.10| accounts. regular, ironic packages boost. ironic id +1182|83|9781|273.26|sts. furiously bold requests boost slyly. fluffily final sheaves cajole. slyly final deposits boost blithely. regular deposit +1182|19|1642|532.12| express instructions. blithely bold theodolites haggle! regular multipliers against the furiously ironic accounts use slyly across the carefully special packages. furiously +1182|55|5439|385.50|rious accounts. furiously regular deposits are across the carefully bold ideas. deposits sleep carefully. blithely ironic pinto beans print until the packages. furiously i +1182|91|1461|806.99|ccounts. slyly final packages wake blithely. blit +1183|84|5681|782.88|s, ironic instructions about the slyly special theodolites are blithely along the blithely +1183|20|1852|182.79|al ideas. ironic packages about the unusual deposits use among the carefully express excuses. carefully unusual pinto beans along the express +1183|56|4311|438.86|o beans wake above the slyly silent platelets! slyly express packages are quickly. final deposits cajole carefully according to the slyly bold accounts. blithely e +1183|92|3491|510.64|ages use against the slyly bold accounts. furiously bold theodolites sublate slyly even deposi +1184|85|8329|168.82|. carefully final requests nag furiously even escapades. regular requests alongside of the slyly express dependencies use caref +1184|21|6469|357.97|onic accounts sublate carefully even packages. quickly bold deposits haggle carefully slyly unusual multipliers. accounts +1184|57|3067|706.48| across the slyly final packages. regular deposits maintain furiously ironic requests. special packages nag above the carefully +1184|93|845|881.12|lites across the carefully ironic theodolites eat fluffily among the slyly silent requests. regular, unusual asymptotes haggle carefully. busily silent braid +1185|86|8084|998.75|. special, even dependencies are slyly. furiously unusual accounts wake quickly accor +1185|22|1601|885.47|ronic, ironic packages: pending deposits according to the pend +1185|58|4664|43.85|y. bold dolphins unwind carefully. carefully regular courts eat furiously after the unusual packages. blith +1185|94|3710|979.75|latelets believe furiously special accounts. theodolites according to the slyly even pea +1186|87|8674|230.95|s the slyly dogged deposits boost about the blithely even packages. furiously final tithes after the carefully final theodolites are slyly along th +1186|23|9790|729.20|special deposits. ironic requests boost blithely across the fluffily unusual pinto beans. blithely regular accounts among the +1186|59|7353|77.55|deposits wake furiously. bold forges cajole furiously quickly even deposi +1186|95|1018|988.56|ic foxes sleep along the instructions. furiously regular ideas abov +1187|88|1162|385.08|ccounts. ironic braids sleep. even waters after the final packages are slyly deposits. thinly even pinto beans use slyly past the fluffily special pinto beans. blithe +1187|24|3216|737.11|ckages. silent requests cajole along the bold requests. slyly regular asymptotes sleep slyly quickly special deposits. final, even packages wake blithely. +1187|60|6271|122.62|its. silent ideas breach blithely. ideas affix carefully about the slyly +1187|96|5921|115.05|beans. quickly ironic deposits wake against the furiously unusual accounts. ironic deposits nod. ironic +1188|89|2356|841.79| behind the fluffily even pinto beans. carefully silent foxes among the evenly unusual requests haggle across the furiously ironic deposits. furiously regular pa +1188|25|4597|227.01| bold, ironic attainments. slyly silent ideas across the carefully bold braids use evenly alongside of the carefully ironic requests! carefully unusual sauternes cajole c +1188|61|1522|387.63| silent accounts use furiously across the regular, ironic instru +1188|97|7945|603.67|eposits are carefully. slyly final accounts wake alongside of the instructions. express, bold theodolites haggle furiously. accounts ha +1189|90|9972|264.94|the ironic pinto beans. final, express pinto beans +1189|26|6757|473.32|ts. packages cajole carefully along the slyly unusual dependencies. sometimes idle depths whithout the pinto beans use slyly furiously pending decoys +1189|62|7004|172.02|. even dolphins boost blithely express requests. regular instructions use sometimes bold accounts. ironic dolphins de +1189|98|3423|284.36|bove the fluffily final deposits. furiously special escapades are slyly. +1190|91|4105|263.92|requests are furiously even sauternes. fluffily stealthy packages boost carefully. blithely daring pinto beans wake carefully after the fluffily bold attainments. dependencies in +1190|27|1890|434.88|at the asymptotes. ironic packages was carefully ironic asymptotes. deposits sleep bli +1190|63|3572|514.63|ions lose according to the deposits? doggedly iro +1190|99|8695|161.75|oost furiously even asymptotes. unusual, special accounts thrash. furiously regular excuses may are special dependencies. furiously express foxes cajole fluffily along the even d +1191|92|620|407.58|requests after the slyly ironic deposits wake carefully even asymptotes. bold packages sleep regular instructions-- quickly regular +1191|28|8945|193.24|efully express packages use about the slyly special in +1191|64|8142|228.72|dolites. ironic forges detect carefully. carefully even requests affix furiously final theodolites. blithely ironic foxes nag above the even excuses. slow pinto beans wake regularly carefully fl +1191|100|8198|209.52| slyly ironic deposits. even packages haggle fluffily regular, ironic deposits. regular requests cajole ironically bold requests; furiously final foxes cajole quickly across the final deposits +1192|93|9743|187.29|totes are finally. furiously silent dinos haggle regula +1192|29|2854|159.98|ole blithely after the special, even platelets. fur +1192|65|6432|712.21|lar deposits. carefully express requests wake slyly. +1192|1|5287|176.73|blithely bold ideas. slyly final foxes cajole furiously across the doggedly unusual accounts. blithely ruthless requests against the ironic theodolites was furiously according to the furiously +1193|94|260|579.93|nts. pending, ironic requests about the slyly ironic accounts cajole carefully a +1193|30|1245|743.00|riously final realms impress slyly above the quickly ironic requests. ironic, regular foxes use +1193|66|4281|153.81|ring instructions sleep blithely among the fluffily r +1193|2|3798|988.74|ages haggle silent requests. blithely express account +1194|95|7293|477.13|quests. regular platelets impress slyly among the even waters-- final deposits haggle blithely! fluffily final pinto bea +1194|31|997|265.37|ckey players wake even requests-- final tithes sleep furiously slyly regular +1194|67|6288|739.96|ly unusual deposits around the blithely express requests sleep about the express deposits. silently special packages are carefully ironic accounts. slyly ironic +1194|3|6619|112.98|ests maintain. accounts thrash slyly against the ironic platelets. quickly pending dependencies sleep slyly accounts. pinto bea +1195|96|4573|915.08|s the carefully silent accounts. final theodolites engage ironic, pending accounts. requests solve quickly dolphins. slyly regular foxes above the requests are furiously furiously ironic +1195|32|3289|249.83|ending packages use carefully along the fluffy packages. regular accounts engage about the final theodolites. iron +1195|68|386|339.19| wake blithely slow sauternes. slyly regular accounts grow quickly unusual, bold instructions? carefully unusual request +1195|4|7196|622.37|he carefully regular packages. slyly even pains wake after the packages. dependencies cajole fluffily. regular ideas wake bravely regular ideas? quickly unusual requests after the quickly express at +1196|97|83|839.94|gular ideas. even requests after the always even excuses maintain blithely special asymptotes. packages thrash carefully. sly +1196|33|3908|159.27|d foxes shall have to wake slyly even theodolites. blithely enticing excuses into the flu +1196|69|1703|774.22|unts will have to are fluffily after the ironic ideas. ruthless packages wake slyly silent theodolites. slyly pending inst +1196|5|941|537.38|equests sleep carefully above the furiously final decoys. express, silent requests wake blithely unusual deposits. blithely regular requests boost furiously around the carefully final instru +1197|98|409|24.69|lyly regular theodolites wake carefully ironic acco +1197|34|4681|599.01|ular requests. quickly express packages across the even, final instructions w +1197|70|4959|778.68|nst the slyly regular requests haggle carefully ironic asymptotes. bold, express courts breach quickly regular requests. pinto beans lose +1197|6|5890|470.22|fily final requests. ironic, bold foxes wake blithely blithely even requests. unusual, ironic packages n +1198|99|2873|160.28|sual foxes above the regular, ironic deposits wake carefully busy forges. final foxes could +1198|35|6840|684.54|. slyly regular instructions haggle blithely-- final, dogged pearls along the instructions a +1198|71|5772|684.56|y special requests according to the thinly express pinto beans boost slyly dolphins. slyly bold accounts cajole fluffily unusual deposits. even deposits are deposits. regular requests nag. slyly +1198|7|7240|42.99|ending depths use furiously slyly unusual requests. quickly regular packages nag across the blithely ironi +1199|100|427|555.55|raids except the carefully stealthy courts detect furiously unusual deposits! carefully final accounts among the slyly ironic deposits use slyly bold theod +1199|36|5891|564.05|cajole carefully-- ideas cajole blithely. furiously final deposits haggle. regular, pending platelets are slyly. special packages +1199|72|8733|672.03|lyly unusual foxes nag. furiously regular packages boost quickly regular instructions. quickly pending instructions affix furiously across the slyly unusual instructio +1199|8|3652|192.29|nusual, special pinto beans are fluffily regular asymptotes. carefully silent courts cajole alongside of the warthogs. furiously ironic deposits a +1200|1|594|349.26|asymptotes sleep fluffily furiously final courts. carefully bold packages cajole blithely special ideas. p +1200|37|9045|88.24|, bold pinto beans alongside of the ideas sleep quickly requests; special requests haggle quickly despite the fluffily silent instructio +1200|73|1862|745.85|ke blithely. regular accounts wake blithely among the packages. furiously unusual foxes affix. pinto beans after the slyly bold requests wake according to the ideas. furiou +1200|9|4719|140.23|ep. furiously even packages detect. even deposits cajole furiously slyly express dependencies. blithely daring packages among the ironic pinto beans cajole fluffily against the car +1201|2|6212|495.01|nts wake carefully quickly pending requests. furiously even deposits serve fluffily in place of the furiously silent pinto beans. ironically daring pinto beans are carefully after +1201|39|4340|59.91|l warthogs. regular instructions should have to wake quickly quickly bold theodolites? iro +1201|76|4535|218.04| asymptotes are slyly quickly regular requests. slyly quiet accounts cajole final pearls; carefully regular pinto b +1201|13|6432|460.53|ven theodolites are carefully. foxes nag quickly. final ideas haggle carefully. pending, even asymptotes sleep. +1202|3|2052|993.18|riously pending theodolites sleep quickly express packages. carefully special theodolites haggle carefully. regular pains sleep slyly. slyly pending packages haggle fluffily. blithely r +1202|40|8892|99.63| ironic deposits integrate. carefully unusual accounts sleep quickly! evenly express requests are slyly atop the special, pending instructions. ironic acco +1202|77|1374|403.07|lyly pending dependencies detect furiously alongside of the packages. pending deposits according to the final excuses cajole b +1202|14|2282|339.52|express packages haggle furiously fluffily final accounts-- final requests wake. ironic accounts across the blithely +1203|4|7142|277.56|pitaphs. blithely unusual requests haggle according to the final dependencies. furiously final theodolites hinder. carefully final theodolites wake quickly +1203|41|1235|890.26|are fluffily. pending, ironic pinto beans above the quickly final account +1203|78|5422|717.01|round the special, unusual ideas. ironic, thin foxes kindle furiously alongside o +1203|15|3372|923.10|e packages are quickly even pinto beans. final theodolites cajole slyly. pending, final theodolites along the regular, final foxes doubt quickly abo +1204|5|6847|111.99|the carefully bold frays solve quickly regular accounts. quietly special foxes alongside of the instructions doubt final, final requests. f +1204|42|4418|356.93|ges after the slyly express deposits use blithely upon the carefully regular deposits. +1204|79|4815|122.39|y. quickly regular deposits sleep blithely after the blithely special warthogs. fluffily final packages boost carefully across the +1204|16|3509|333.92|bold courts. furiously bold ideas hinder slyly. ruthless, blithe accounts wake. blithely pending platelets are furiously furiously thin de +1205|6|7022|936.24|nding deposits. pending requests would detect quickly. blithely special forges are ag +1205|43|3523|295.79|al pinto beans must are across the express instructions: theodolites hinder quickly +1205|80|5076|508.78|g theodolites boost past the fluffily express requests. regular sheaves after the deposits dazzle quietly along the silently regular theodolites. blithely regul +1205|17|3956|751.13|o the furiously pending requests. express requests haggle quickly according to the fluffily unusual de +1206|7|9044|82.20| ironic deposits eat slyly after the silent, ironic packages. quickly ruthless ideas boost according to the even dolphins. furiously special excuses boost slyly abo +1206|44|4567|219.47|requests alongside of the carefully ironic ideas sleep quickly regular theodolites. furiously bold requests haggle. sly +1206|81|1501|626.85|hely unusual requests according to the final deposits cajole pending packages. carefully even accounts about the carefully ironic asymptotes use above the ideas. furiously even +1206|18|2053|190.79|gged platelets cajole fluffily along the slyly bold +1207|8|2417|126.03|eodolites! special pinto beans haggle carefully according to the slyly even acco +1207|45|5470|581.10|ar courts. blithely bold theodolites cajole. packages nag above the even, regular theodolites. accounts haggle slyly across +1207|82|6471|465.33|efully alongside of the blithely ironic packages. carefully ironic +1207|19|6470|802.40|al dependencies. pending, regular theodolites snooze unusual accounts. bold requests kindle. waters are. pending deposits unwind about the furiously +1208|9|6976|620.77|ely accounts. carefully regular packages about the slyly even instructions must have to are slyly ironic pinto beans. blithely silent accounts after the requests ha +1208|46|7123|876.67|instructions. fluffily unusual excuses cajole carefully around the special pinto beans. quickly special asymptotes hinder quick gifts. slyly special accounts haggle quickly. fluffi +1208|83|8503|65.48|mpress slyly pending, unusual deposits? silent, bold requests across the final, silent excuses boost fluf +1208|20|3206|941.35|y. quickly express packages are slyly. pending warhorses believe permanently express dependencies. slyly bold deposits wake blithely finally final accoun +1209|10|5176|193.52|silent deposits. furiously unusual foxes cajole silent, ironic theodolites. slyly bold pinto beans sleep fluffily silent ins +1209|47|5720|59.20|counts haggle furiously. carefully final pinto beans wake slyly across the special accounts. ironic, special deposits wake. accounts haggle blithely a +1209|84|2165|227.74|egular theodolites dazzle furiously-- slyly regular accounts sleep after the fluffily ironic deposits. quickly pending deposits ab +1209|21|603|701.95| furiously furiously even packages. quickly regular packages cajole carefully. bravely ironic instructions d +1210|11|3838|682.48|lets wake after the furiously pending deposits. furiously regular requests cajole regular requests; quick, final +1210|48|3589|127.44|ully final pinto beans. carefully bold accounts are against the furiously bold re +1210|85|8799|283.08|lar realms boost across the blithely final requests. bol +1210|22|3636|764.16|-- requests along the blithely ironic pinto beans haggle stealthily upon the express deposits. fluffily special deposits cajole according to the regular instructions. quickly unusual reque +1211|12|6558|184.96|ar accounts cajole slyly after the furiously regular braids. quickly final accounts are +1211|49|8148|26.88|ronic platelets. special packages boost blithely. fluffily unusual packages sleep bli +1211|86|1788|489.52| dolphins. final excuses use alongside of the accounts. ruthlessly regular deposits detect-- quickly express pack +1211|23|2814|822.98|r foxes haggle furiously silent pinto beans. final pinto beans alongsid +1212|13|7754|739.08|the deposits. carefully ironic ideas are furiously quickly regular excuses. requests sublate ironically furiously express accounts. blithely regular ideas nag slyly furiously t +1212|50|3959|256.62|ly ironic deposits. carefully ironic deposits impress carefully-- special platelets wake carefully across the fluffily unusual packages. pending deposits wake quickly. furiously regular warho +1212|87|4432|466.09|tes according to the fluffily ironic deposits use blithely about the even sauternes. carefully ironic instruction +1212|24|1139|581.17|ans. regular, express theodolites haggle. carefully ironic packages haggle fluffily. even packages wake fluffily after the carefully final deposits. slyly +1213|14|2997|733.48|gular platelets are carefully express requests. requests sleep furiously according to the quickly bold packages. express excuses with +1213|51|5070|999.99| ironic, special deposits. carefully final deposits haggle fluffily. furiously final foxes use furiously furiously ironic accounts. package +1213|88|6836|819.54|furiously ironic packages after the ironic, busy accounts wake carefully behind the accounts. dependencies are alongside of the fluffy packages. permanently unus +1213|25|7962|844.93|inal instructions haggle carefully. dolphins haggle carefully slyly ironic accounts. slyly special packages haggle blithely blithely express deposits. quickly regular packa +1214|15|8550|118.83|to beans use express packages. carefully ironic accounts cajole. quickly final excuses breach blithely bold +1214|52|2313|438.22| beans are against the final deposits. blithely quiet theodolites af +1214|89|6279|666.96| according to the regular deposits. furiously express platelets shall haggle blithely quickly special foxes. regular notornis are. final accounts around the deposits nag +1214|26|6859|984.08|lyly silent requests. fluffily final deposits wake sly +1215|16|1421|117.05|ns affix carefully. express ideas affix. express foxes above the carefully regular ideas sleep after the carefully bold packages. quickly pending +1215|53|3020|445.16|ccounts cajole furiously regular, final accounts. pending pinto beans are slyly. accounts +1215|90|6030|480.88|ironic platelets serve. furiously sly theodolites haggle +1215|27|6994|419.16| carefully special pinto beans-- final, ironic ideas wake blithely ironic requests. slyly final dugouts may wake carefully carefully regular platelet +1216|17|7947|6.04|eep. blithe requests hang blithely. furiously even requests cajole around the slyly even escapades. quickly fin +1216|54|8558|831.47|ly express packages lose enticingly final deposits. slyly express deposits are carefully ideas. slyly ironic accounts a +1216|91|6769|658.22|ly final requests use. bold foxes nag furiously at the blithely final instructions. regular, express frets are fluffily against the daring ideas. c +1216|28|7064|7.53|olites boost carefully according to the furiously ironic platelets. fluffily final ideas nag even frets-- quickly final courts after the quickly ironic packages det +1217|18|510|998.55|riously. ideas promise carefully about the ironic, pending packages. ironic, bold packages along the stealthily pending excuses wake furiously slyly b +1217|55|6476|460.68|uctions cajole among the carefully close excuses. packages alongside of the fluffily ironic dugouts should are slyly ironic pinto beans. bold foxes cajole alongside of the furiously regul +1217|92|9570|530.39|ts are. ironic instructions nag alongside of the bold accounts. carefully unusual +1217|29|4197|311.15| use slyly regular accounts. carefully unusual ideas breach slyly slyly even dolphins. regular platelets affix blithely express braids. furious dep +1218|19|6915|999.95|fluffily unusual packages doubt even, regular requests. ironic requests detect carefully blithely silen +1218|56|8742|148.32|furiously express asymptotes sleep blithely fluffily stealthy packages. accounts haggle al +1218|93|5709|589.15| the blithely regular ideas. blithely ironic instructions unwind. furiously regular dependencies about the carefully regular ideas mold slyly alongside of the never regular +1218|30|9864|912.35|the slow, regular asymptotes. furiously busy packages haggle. blithely silent packages sleep furiously. carefully regular pinto beans cajole +1219|20|9065|241.89|unusual requests wake furiously regular deposits. fluffily pending foxes affix above the regular, dogged deposits. fina +1219|57|1064|665.17|he furiously even requests. carefully final theodolites are across the carefully regular foxes. slyly express packages integrate carefully across the ironically ironic packages. final, final +1219|94|4788|776.06|dependencies sleep furiously express requests. furiously silent pinto beans sleep within the regularly special notornis. carefully final platelets breac +1219|31|3590|430.53|ly final excuses. ironic accounts nag. warhorses after the special platelets boost slyly against the blithely even decoys. ironic, special pinto beans cajole. r +1220|21|7602|267.12|ackages sleep blithely pending warhorses. unusual, bold theodolites wake slyly slyly regular requests. silently unusual packages use across the carefully unusual packages. enti +1220|58|2079|243.27|ironic requests. bravely unusual requests maintain. regular +1220|95|1200|902.95|o beans. requests wake. furiously final pinto beans haggle according to the ironic, pending platelets. ironic accounts cajole slyly blithely regular accounts. express, even deposits affix quickl +1220|32|9470|119.58| bold courts are blithely furiously express packages. +1221|22|7066|974.62|quickly above the pending requests. special, ironic multipliers w +1221|59|9348|944.91|ithely express packages serve furiously requests. carefully ironic asymptotes above the platelets sleep ironically slyly final dependencies. furiously final packag +1221|96|1657|60.94|ng to the blithely careful theodolites! ruthless theodolites integrate above the even requests. pinto beans are among the furiously careful ideas. ev +1221|33|3838|424.67|are carefully across the blithely final pinto beans. quickly regular dependencies integrate blithely. pending foxes affix evenly asymptotes. +1222|23|9856|758.18|requests. carefully ironic platelets are. blithely ironic notornis nag after the regular pinto beans. furiously express foxes against the pending excuses nod among the slyly bold packages. final +1222|60|6320|697.90|uests are blithely special theodolites. deposits among the packages cajole quickly pending foxes. carefully ironic requests haggle blithely at the exp +1222|97|794|437.14|refully ironic requests haggle against the final asymptotes. slyly regular deposits are. carefully even foxes are. blithely even pinto beans use around the fluffily unusual d +1222|34|3829|533.63|osits. thin accounts use. quickly bold deposits wake never inside the slyly unusual instructions. regular accounts sleep carefully. quickly ironic pinto beans sleep. t +1223|24|3419|875.20| the requests are blithely along the bold, thin asymptotes. blithely final platelets above the carefully sly instructions are above the quickly ironic r +1223|61|3290|253.55|sual deposits. quickly express deposits are blithely alongside of the express accounts. carefully ironic instructions wake boldly furio +1223|98|59|848.60|e enticingly bold deposits. special asymptotes sleep closely express, ironic theodolites. slyly f +1223|35|7902|774.52|e fluffily special instructions. blithely ironic ideas wake. slow tithes haggle. brave realms integrate along the carefully regular deposits. bold, fina +1224|25|8260|553.08|y final asymptotes must have to boost furiously. carefully even deposits above the even, regular ideas hagg +1224|62|5471|41.57|ng foxes above the unusual deposits cajole blithely blithely unusual foxes? ca +1224|99|2009|648.61|inal foxes boost furiously final, thin theodolites. carefully regular accounts use after the accounts. sly, reg +1224|36|4494|265.18|lithely unusual asymptotes. furiously even packages wake blithely regular deposits. bold, final foxes eat blithely final pinto beans! packages wake. carefully silent packages about t +1225|26|7554|607.83|ymptotes. fluffily silent hockey players use final, final foxes. carefully express excuses wake excuses. slyly bo +1225|63|1471|190.87|ounts mold above the requests. ironic accounts sleep. slyly final ideas are according to the busily even instructions. carefully ironic sauternes u +1225|100|5317|309.24|ructions wake slyly along the furiously final requests. requests alongside of the regular frays are slyly regular accounts. fluffily final accounts wake across the blithely unusual foxes. pe +1225|37|6310|752.19|ully regular theodolites. final theodolites use ironic deposits. special braids above the final accounts sleep blithely special requests. blithely even deposits integrate alongside o +1226|27|1441|767.77|uests. thinly regular asymptotes against the furiously close accounts doze slyly blithely final packages. blithely final deposits detect permanently. slyly ironic accounts boo +1226|64|5476|995.41|p fluffily carefully ironic requests. final packages cajole furiously. ironic, regular asymptotes nag slyly except the careful dependencies. +1226|1|8940|690.83|s. furiously special asymptotes wake furiously. furiously ironic accounts grow furiously after the quickly even packages. ironic, regular dependencies nag carefully about th +1226|38|8368|600.71|t warthogs thrash carefully against the slyly final ideas. pinto beans cajole +1227|28|9007|446.30|ng deposits wake slyly pending deposits. blithely express packages nod against the furiously +1227|65|5330|681.12|furiously pinto beans. furiously regular deposits haggle blithely. furiously regular theodolites about the close, silent accounts haggle slowly +1227|2|9372|206.56|ar deposits wake ideas. furiously bold instructions sleep slyly special dolphins. blithely even escapades are blithely even instructions. furiously even instructions cajole. quickly fi +1227|39|8609|298.29|intain carefully? slyly final sauternes integrate blithely silent theodolites. slyly even excuses haggle +1228|29|2338|658.94| blithely above the bold, unusual packages. pinto beans cajole slyly alongside of the ironic deposits. regular, furious foxes boost +1228|66|6051|55.13|g frays wake bold accounts. unusual, pending deposits use? final, final instructions integrate slyly. furiously regular deposits wake carefully. carefull +1228|3|4526|797.53|its. special instructions detect against the quickly regular pinto beans. carefully expr +1228|40|5792|602.94|even, regular requests. furiously regular orbits since the final, ironic packages promise against the packages. blithely regular requests haggle quickly pending accounts. slyly regular asymp +1229|30|1343|948.95|ackages unwind quickly quickly final deposits. fluffily idle package +1229|67|3848|82.57|above the accounts. final pinto beans grow busily regular packages. final packages cajole carefully alongside of the carefully regular deposits. quickly expr +1229|4|6812|327.44| accounts sleep fluffily final, ironic accounts. fluffily final requests integrate fluffily. carefully special pinto beans nag furiously. ideas sleep furiously. silent, unusual theodolites affix bli +1229|41|402|31.12|luffily regular ideas. even pinto beans dazzle blithely alongside of the carefully regular packages. final ideas x-ray fluffily. silent accounts haggle slyly! +1230|31|657|852.64|y slow theodolites. unusual, bold accounts above the furiously final excuses was against the even pack +1230|68|2730|703.62|sly blithe packages cajole at the carefully special pinto beans. quickly ironic ideas outside t +1230|5|6578|705.88|ess foxes. carefully regular deposits sleep carefully according to the express fo +1230|42|3857|724.12|times even deposits wake carefully quickly ironic reques +1231|32|3689|679.16|deposits print furiously deposits. even accounts cajole ruthlessly above the carefully special instructions! carefully regular instructions cajole about the carefully ironic requests. +1231|69|8011|231.71|lithely. fluffily regular theodolites cajole silently requests. final, final instructions can haggle furiously regular packag +1231|6|7322|398.49|iously pending theodolites. blithely final packages wake slyly silent theodolites. quickly regular packages cajole quickly requests. asymptotes boost busily slyly bold re +1231|43|9510|266.54|sts mold against the platelets. ironic sheaves integrate according to the slyly dogged packa +1232|33|4056|371.29|dencies boost. ironic, final foxes detect furiously even accounts. fluffily unusual ac +1232|70|1922|661.81|eodolites use furiously above the regular deposits. fluffily ironic warthogs wake furiously above the carefully final pinto bea +1232|7|6085|301.40|nd the quickly ruthless instructions are blithely among the carefully ev +1232|44|6870|961.53|arefully regular requests. warhorses promise furiously after the idly even accounts. quickly ironic packages haggle blithely against the unusual, final requests. slyly unusual ideas pla +1233|34|9230|728.07|unts sleep blithely. permanently regular deposits sleep slyly quickly pending requ +1233|71|2121|139.51|te slyly brave deposits. carefully even platelets cajole furiously quickly even sauternes. furiously even +1233|8|5139|321.75|inal accounts are across the even ideas. regular dependencies cajole fluffily slyly even pinto beans. +1233|45|6110|317.08|r dependencies. ironic deposits wake carefully among the regular platelets. quickly ironic deposits are slyly foxes. furiously fi +1234|35|7300|741.98|s. regular accounts across the furiously pending requests wake pending ideas. carefully final deposits sleep slyly slyly dogged accounts-- enticingly regular packages are. furiously +1234|72|2380|75.66|r foxes alongside of the quickly final theodolites cajole blithely quickly ironic accounts. permanent packages integrate furiously. carefully bold requests boost fluffily. platelets unwi +1234|9|8459|120.58| deposits. even, express requests haggle carefully across the carefully ironic instructions: slyly slow accounts wake slyly across +1234|46|1804|878.95| the depths haggle furiously furiously even deposits. fluffily careful courts sleep daringly bold foxes? +1235|36|2929|466.29|nusual theodolites can doubt blithely. blithely ironic pinto beans use carefully quickly final deposits. carefully regular requests according to the unusual accounts sublate bold asymptotes. e +1235|73|3481|41.21|. asymptotes play across the unusual theodolites; furiously blithe forges lose blithely. +1235|10|5990|513.72|ular pinto beans upon the furiously unusual requests use carefully pinto beans. pe +1235|47|968|976.19| requests affix finally carefully bold accounts. blithely ironic packages solve grouches. carefully ironic deposits sleep blithely at the carefully slow theodolites. final dolphins above the in +1236|37|4522|396.42|xpress pinto beans. deposits after the furiously final deposits wake quickly quickly final instructions. carefully final dinos integrate slyly. +1236|74|3585|480.01|al, silent requests haggle blithely pending deposits. ruthlessly regular gifts along the quickly regular requests must wake even, express deposits. furiously express dependencies sleep fluffily +1236|11|7703|866.18| nag blithely. fluffy, pending packages wake above the requests. carefully regular dependencies wake against th +1236|48|8060|616.79|l frays engage carefully quickly ironic dinos. ideas along the special, final deposits cajo +1237|38|6690|916.38|y ironic accounts boost slyly slyly ironic accounts: never regular pinto beans nag carefully even dependen +1237|75|8619|54.57| accounts. furiously regular pinto beans cajole quickly final dinos. carefully ironic excuses boost furiously blithely final requests. slyly final instructions alongside of +1237|12|7650|352.30|pinto beans. carefully even courts are slyly regular accounts. carefully blithe deposits boos +1237|49|3773|252.17|foxes. furiously unusual accounts haggle. final, final requests use quickly across the furiously express dependencies! furiously regula +1238|39|5052|619.10|affix furiously across the blithely silent patterns. blithely silent requests wake. blithely regular accounts boost bl +1238|76|1098|861.63|e theodolites boost around the regular decoys. quickly regular requests detect furiously along the carefully ironic platelets. final, ironic ideas nag blithely except the furi +1238|13|22|949.69| carefully final ideas along the blithely even deposits nag furiously express foxes. fluffily ruthless asymptotes cajole according to the slyly sp +1238|50|3934|531.77|cross the carefully pending dugouts. quickly final requests sleep regular packages. packages integrate b +1239|40|3425|564.48|nts. quickly unusual packages wake blithely carefully bold packages! quickly silent foxes above the s +1239|77|2863|840.10|ironic packages. regular, special accounts haggle furiously carefully regular ideas. final accounts nag carefully unusual package +1239|14|1439|835.66|eposits. final, regular theodolites wake according to the slyly even packages. furiously bold pinto beans haggle stealthily. requests use. pinto beans wake slyly slyly +1239|51|7996|64.59|pinto beans after the accounts haggle at the even accounts. express packages unwind furiously. furiously even requests maintain blithely bold requests. qui +1240|41|2365|871.14|e evenly slow theodolites. carefully unusual deposits wake according to the blithely regular deposits. carefully final sauternes alongside of the fluffi +1240|78|9816|54.18|yly special requests haggle fluffily silent ideas. regular requests boost across the slyly final platelets. +1240|15|1045|828.94|eep blithely. quickly even packages run. furiously exp +1240|52|4996|82.81|usual deposits. express platelets would wake furi +1241|42|6966|363.57|d instructions outside the unusual, final ideas sleep slyly even, final requests. unusual ideas against the special deposits c +1241|79|4765|909.13|ly bold deposits. quickly pending requests against the bold frets +1241|16|9940|96.52|dolphins need to nag alongside of the fluffily ironic instructions. quickly regular deposits +1241|53|6321|997.46|pinto beans sleep carefully about the quickly pending requests; carefully special requests may cajole blithely furiously bold de +1242|43|6329|229.43|ve the furiously bold asymptotes. slyly ironic packages solve among the slyly ironic deposits. furiously ironic dependencies wake slyly excuses. regular dolphins +1242|80|7353|42.62|eposits. theodolites after the slyly regular platelets maintain furiously blithely silent instructions. finally regular accounts cajole pinto beans. slyly silent attainments affix sl +1242|17|7502|246.80|ts. express, even instructions haggle furiously unusual packages. slyly final escapades nag according +1242|54|663|270.26|. regularly regular ideas cajole quickly above the furiously ironic theodolites. express pinto beans sleep fluffily carefully final instructions. special, iron +1243|44|3049|65.46|into beans wake carefully regular deposits. express theodolites haggle furiously. quickly express requests haggle furiously along the furiously reg +1243|81|5839|478.46|ges. special requests boost alongside of the instructions. carefully regular requests detect across the quickly special accounts. quickly regular deposits according t +1243|18|8213|761.29|ticingly regular accounts-- regular, final accounts use quickly along the carefully unusual foxes. quickly silent dependencies might nag bold pinto beans. ironic +1243|55|8598|956.42| notornis breach among the packages. blithely unusual foxes wake furiously blithely bold notornis. ironic requests are excuses. furious +1244|45|427|763.45|ns are alongside of the instructions. packages wake furiously carefully pending accounts. even, unusual frets are blithely across the slyly final pinto beans. silent, fina +1244|82|9310|283.61|nto beans cajole blithely. fluffily unusual platelets across the doggedly pending platelets boost enticingly after the unusu +1244|19|224|641.82|sly express deposits sleep ironic packages. theodolites hinder furiously carefully special packages. even dolphins integrate quickly express excuses. furiously final packages +1244|56|2729|944.22|out the regular asymptotes. fluffily enticing ideas integrate slyly against +1245|46|4009|455.08|accounts use furiously ironically ironic packages. slyly regular orbits detect carefully; carefully regular foxes are blithely after the blithely pending packages. ironic excuses mai +1245|83|5706|379.42|usly regular depths need to dazzle blithely blithely pending asymptotes-- furiously final accounts are fluffily across the carefully even courts. enticingly express platelets wake. reg +1245|20|9509|561.07|ccording to the quickly final accounts. regular requests affix. ironically regular theodolites boost regular a +1245|57|9453|552.87|eas against the special asymptotes detect according to the fluffily unusual requests. +1246|47|5785|482.05|s. regular accounts haggle slyly across the quickly final instructions. express accounts print unusual, special deposits. blithely slo +1246|84|2526|182.23|thely about the carefully final accounts. warhorses cajole blithely furiously regular realms. packages are slyly. quickly even theodolites sleep slyly unusual +1246|21|556|966.19|en requests wake boldly final accounts. blithely express accounts cajole slyly re +1246|58|6160|167.52|g the quickly unusual foxes detect quickly slyly regular theodolites. fluffily regular theodolites wake blithely among the carefully ironic ins +1247|48|5453|625.39|cial, ironic accounts play regular deposits. furiously +1247|85|4272|524.24|special packages. blithely ironic Tiresias x-ray. finally regular ideas are about the quic +1247|22|6620|977.52| carefully furious, ironic excuses. always regular instructions are against the carefully permanent requests. express, unusual requests boost daringly. bl +1247|59|740|643.58|the final packages. slyly regular sentiments sleep slyly quickly final requests; unusual, e +1248|49|3751|558.81|tions breach slyly even, pending ideas. carefully ironic packages across the excuses should affix idly against the blithely unusual instructions. b +1248|86|9823|423.20|s run fluffily. furiously bold accounts kindle agai +1248|23|8913|113.95|ns sleep quickly along the slyly unusual asymptotes: furiously bold re +1248|60|5338|254.21|ove the slyly ironic accounts. even pinto beans solve at the furiously ironic packages. even, pending instructions boost ex +1249|50|1558|35.79| wake even requests. furiously even excuses sleep theodolites. doggedly bold instructions across the furiously bo +1249|87|2390|366.28|its wake carefully slyly pending deposits. furiously final instructions thrash carefully regular excuses. regular id +1249|24|9548|352.40|. carefully express accounts use fluffily. slyly ironic requests sleep slyly regular deposits. accounts cajole blithely. express deposits integ +1249|61|9183|847.33|refully final packages kindle dependencies. blithely final requests grow blithely bold sheaves. slyly brave pinto beans boost. blithely silent deposits nag. carefully final foxes use always alo +1250|51|3336|516.52|ding to the instructions. slyly express dolphins sleep-- slyly busy requests lose furiously. carefully ironic requests haggle. carefully permanent requests nag caref +1250|88|761|9.64|kages use special dependencies. idly regular pains above the theodolites sublate doggedly special packages. quickly ironic accounts against the slyly special excuses are slyly slyly special pinto b +1250|25|798|418.87|ns. furiously even forges use carefully. slyly pending accounts +1250|62|5256|108.06|ng the ironic ideas. blithely even theodolites boost slyly blithe, regular ideas. slyly final platelets nag furiously. bold requests nag around the bold, final in +1251|52|9317|248.09|kly even accounts sleep furiously carefully regular packages. requests lose above the final requests. accounts wake evenly. carefully silent foxes wake blithely amo +1251|89|3006|2.95|ular theodolites. packages are blithely final accounts. never bold platelets cajole after the slyly final packag +1251|26|5695|956.98|e sly accounts. regular, final sentiments integrate! fluffily even deposits try to wake carefully against the carefully regular ideas. stealthil +1251|63|9429|205.12|totes. slyly regular Tiresias haggle blithely ironic accounts. instructions integrate quic +1252|53|1985|79.94|ly special packages wake fluffily above the final foxes. ironic theodolites nag among the slyly even accounts. pinto beans promise blithely alongside of the ironic requests +1252|90|6432|210.12| boost furiously. slyly unusual foxes try to are furiously about +1252|27|4666|230.72|alongside of the ironic dolphins are quickly platelets. specia +1252|64|5367|761.38|lites wake quickly. regular patterns eat furiously. pending accounts detect carefully slyly pending notornis. slyly express requests boost. furiously furious pinto beans after the final, silen +1253|54|9074|443.97| slyly ironic accounts haggle across the carefully special excuses. quickly express warthogs sleep fur +1253|91|9566|469.64|uffily above the carefully even accounts. requests affix; ironically final instructions above the carefully special accounts int +1253|28|9372|317.22| requests along the unusual pinto beans believe furiously against the fluffily regular deposits. even, final asy +1253|65|7260|2.12|luffily regular multipliers haggle blithely fluffy requests? special foxes cajole quickly. stealthily bold accounts about the slyly regula +1254|55|8947|850.49|y silent hockey players. ironic foxes against the final, final foxes haggle blithely against the fluffily regular accounts. quickly ironic instructions +1254|92|1950|576.20|ithely special accounts. furiously ironic dolphins cajole slyly regular requests. furiously regular deposits boost slyly bold packages. quickly re +1254|29|8035|45.01|ular, bold asymptotes sleep furiously. slyly final packages about the quickly even accounts was carefully acr +1254|66|5385|572.72|quickly final foxes boost. furiously final deposits cajole blithely. unusual, silent forges haggle slyly against the slyly ironic reques +1255|56|70|587.13|enticingly dogged packages. special, even packages print furiously ironic accounts. carefully unusual requests according to the furiously special accounts use pending, special foxes. furious +1255|93|5085|870.67|cajole slyly stealthy deposits. quickly special requests among the quickly unusual accounts are +1255|30|6715|111.03|onic platelets. bold braids sleep. quickly unusual courts about the furiously express accounts boost furiously quickly express packages. slyly regular foxes nag. f +1255|67|7477|155.36|furiously furiously pending asymptotes: carefully express requests lose slyly after the quickly +1256|57|2797|906.41|g the accounts wake fluffily slyly regular deposits. quickly permanent platelets wake quickly pinto beans. unusual deposits wake fluffily past the bold, bold ideas. always unusual idea +1256|94|587|464.83|are fluffily final deposits. regular, final accounts haggle. furiously even deposits haggle. accounts run. final, even accounts haggle boldly. quickly regul +1256|31|8659|448.82|ly about the carefully ironic ideas. pending pains snooze furiously. pinto beans thrash. express packages thrash asymptotes. +1256|68|9711|133.89|the furiously even requests breach carefully blithely pending escapades. even, special courts cajole furiously regular accounts. carefully final requests haggle slyly accounts. f +1257|58|8317|711.08|lites wake final accounts. requests use among the regular pinto beans. slyly final instructions wake special pinto beans-- blithely final packages nag carefully final +1257|95|2365|245.29|ily bold theodolites. accounts are blithely. ironic packages boost perma +1257|32|6728|930.01|ckly ironic deposits boost. furiously pending instructions wake. blithely regular pinto beans among the qui +1257|69|1194|406.15|ly regular instructions-- carefully pending requests wake +1258|59|3323|259.30| the ironic, even foxes. slyly final packages cajole furiously at the special packages. regular requests integrate quickly bold the +1258|96|4245|597.67| packages wake ironic excuses. furiously ironic requests sleep silent, ironic forges. ironic requests around the regular ideas cajole furiously pending accounts; furiously spec +1258|33|821|284.41| dogged packages unwind above the asymptotes. final theodolites sleep. accounts use furiously ideas? ironic, regular theodolites wake slyly f +1258|70|9166|8.48|s-- slyly final accounts wake quickly? special deposits haggle regularly. carefully ironic gifts wake after the quickly regular foxes. regular, ironic requests sl +1259|60|317|941.11|ly regular platelets. carefully pending requests after the +1259|97|3342|92.40|ilent, silent requests sleep slyly even, final dep +1259|34|2423|706.05|ular instructions haggle blithely around the furiously express instructions. carefully regular pinto beans nod closely regular theodolites! blithely final braids about t +1259|71|5144|637.16|ing deposits sleep carefully across the pending excuses. packages above the unusual, pending tithes believe furiously across the quickly regular id +1260|61|3294|649.32|lar packages; carefully regular packages against the blithely special accounts integrate carefully accounts. gifts nag blithely. furiously special +1260|98|6691|265.78|uests haggle ironic packages. always pending accoun +1260|35|4323|601.44| thin tithes nag carefully pending, express deposits. quickly final dependencies affix quickly. special, final pinto be +1260|72|853|633.64|ons; blithely regular packages nag ideas. fluffily silent theodolites nag slyly. regular +1261|62|965|323.61|ly quickly special deposits. slyly bold dependencies x-ray after the furiously regular ideas. silent accounts wake furiously blithely regular ideas. final theodolites are +1261|99|5714|526.96|ding notornis against the final deposits engage slyly around the bold forges. deposits are blithely. bold pinto beans boost slyly. express requests cajole finally across the final court +1261|36|9215|712.02|t deposits at the quickly special accounts sleep ironic requests. furiously dogged instructions hinder blithely. blithely final packages alongside of the blithely pe +1261|73|6008|46.80|onic ideas thrash furiously unusual accounts? slyly s +1262|63|9897|619.97| accounts x-ray idle packages. packages haggle according to the even, regular deposits. pending foxes cajole above the blithely +1262|100|9056|461.93| use carefully quickly final packages. quick escapades eat regular instructions. quickly regular platelets use requests. final platelets b +1262|37|4687|536.97|cording to the theodolites haggle above the ironic foxes. carefully unusual excuse +1262|74|1428|126.20| ironic requests haggle. pending, special packages use never. furiously final instructions integrate carefully? quickly ironic foxes sleep alongside of +1263|64|2585|378.16|. slow, pending pinto beans haggle carefully along the furiously regular inst +1263|1|1704|335.58|, regular packages. slyly regular instructions wake carefully. even deposits haggle furiously according to the furiously expr +1263|38|8403|942.63|gside of the slyly unusual accounts. final accounts wake asymptotes. final accounts nag ironic theodolites. slyly pending packages kindle carefully. pending, unusual ideas boost +1263|75|676|666.47|ave to haggle idly regular accounts. fluffily even accounts haggle furiously according to the blithely even accounts? slyly special requests snooze quickly slyly bold packages. carefully close pa +1264|65|6836|707.87|p carefully. silent accounts across the daring accounts wake blithely across the slyly bold instructions. quickly express requests at the finally furious pi +1264|2|999|196.02|ccounts. slyly final accounts detect blithely. regular theodolites about the final, final pinto beans cajole against the regular, regular theodolites. unusual, blithe acc +1264|39|9427|993.53|ly pending accounts use carefully-- furiously ironic ideas integrate furiously packages. escapades are sometimes blithely final instructions? bold, ironic packages are acro +1264|76|6505|4.39|ss sauternes nag slyly. sly, bold excuses x-ray slyly along the ironically even deposits? slyly express packages wake furiously; platelets kindle slyly against the slyly s +1265|66|7492|139.90| integrate furiously express packages. silent, unusual +1265|3|6615|819.22|bove the pending requests. even asymptotes about the packages affix furiously above the blithely ironic theodolites. carefully thin platelets haggle al +1265|40|1311|538.54|e carefully even excuses. unusual orbits across the quickly final packages grow slowly instructions. slyly ironic packages boost fluffily. special, special accounts cajole alongside of the bold +1265|77|686|395.16|ly express requests. quickly regular ideas haggle quickly among the furiously regular requests. slyly iro +1266|67|4077|227.29|quests boost fluffily. ideas detect finally. quickly final deposits nag carefully. quickly ironic pains x-ray fluffily above the fluffily regular requests: +1266|4|2485|110.96|ending dependencies across the carefully silent requests cajole blithely according +1266|41|6628|28.63|tect quietly bold ideas. furiously special packages haggle. regular pinto beans +1266|78|1344|964.08|symptotes nag carefully. express, ironic requests sleep blithely even platelets. fluffily express somas haggle fluffily ironic packages. even theodolites are carefully beyond the final, un +1267|68|7991|654.75|lly busy foxes use slyly. carefully express accounts haggle slyly special platelets. instructions sleep blithely. blithely unusual excuses nag furiously. unusual ideas wake. furiou +1267|5|1903|544.09|, regular packages. furiously even tithes could have to sleep carefully. evenly even instructions grow furiously against the en +1267|42|340|773.64|should have to nag quickly. slyly even accounts are enticingly against the carefully even requests; fluffily ironic packages after the slyly regular requests cajole carefully about the f +1267|79|3176|748.44|n accounts integrate silently unusual asymptotes. furiously regular packages about the carefully bold instructions detect carefully after the slyly thin pinto beans: ironic requests after the bli +1268|69|9681|713.94|refully dependencies. quickly furious excuses cajole carefully unusual, final theodolites. express, regular deposits sleep slyly at the unusual multipliers. carefully even acc +1268|6|9620|309.82|carefully bold warhorses are regular, unusual instructions. blithely sly requests wake quickly after the quickly bold requests; qu +1268|43|2888|630.12|y final pinto beans doze. express, ironic packages print. quickly regular packages use beside the bold, express accounts-- final deposits cajole according to the +1268|80|8005|241.47|ar foxes haggle after the ironic requests. quickly ironic instructions integrate slyly. packages nag slyly express pearls. slyly even theodol +1269|70|2476|585.07|ly after the carefully unusual deposits. deposits wake even instr +1269|7|4324|195.83|al ideas. quickly express deposits thrash. quickly final deposits above the final, sly instructions wa +1269|44|4465|786.21|ously carefully express pinto beans. packages wake. special deposits use along the accounts. bold, unusual deposits above the carefully final de +1269|81|3324|214.78|ttainments sleep quickly even deposits. dolphins along the ruthlessly final asymptot +1270|71|2495|632.19|l requests. pinto beans must cajole. slyly even pinto beans wake quickly pending accounts. +1270|8|4803|942.28|yly ironic accounts was fluffily: carefully regular packages are furiously furiously bold dependencies: fluffily even dependencies nag according to the accounts. accounts are quickly r +1270|45|2737|877.45|endencies. even accounts wake inside the special requests. furiously slow foxes nag quickly bold accounts. carefully bold pinto bea +1270|82|3420|257.16| along the accounts. fluffily bold dolphins above the furiously r +1271|72|3287|696.54| foxes. furiously even theodolites boost quickly +1271|9|7301|589.25|as sleep atop the carefully final requests. stealthy excuses use. furiously final deposits wake according to the blithely final orbits +1271|46|4874|585.59|ent accounts outside the asymptotes haggle blithel +1271|83|4592|101.93|r the finally regular requests. silent epitaphs haggle multipliers. ruthlessly final deposits would cajole slyly special ideas. pending, regular attainments boost blithely special decoys. +1272|73|3033|81.39|ss furiously pending dolphins. carefully even deposits can cajole? slyly bold theodolites boost at the instructions. ironic deposits across the unusual, ir +1272|10|4105|535.25|kly after the even, ironic pinto beans. slyly idle instructions wake furiously. final accounts across the carefully even accounts boost permanently +1272|47|393|91.69|cuses haggle. furiously bold requests cajole blithely. slyly regular deposits snooze. ironic, even packages cajole. carefully +1272|84|7762|887.38|cajole. regular requests wake furiously after the blithely final fo +1273|74|6285|265.18|ely regular sentiments against the quickly special requests haggle after the furiously silent deposits. slyly unu +1273|11|1677|630.77|final instructions after the furiously furious asymptotes cajole after the quickly pending ideas. quickly even dugouts detect blithely regular instructions. carefully quick packages are pendin +1273|48|9917|122.80| foxes detect furiously alongside of the final, express instructions. accounts haggl +1273|85|6871|255.31|lites are. even accounts are around the brave, express packages. blithely enticing theodolites cajole fluffily blithely sly accounts. final instructions boost furiously furiously e +1274|75|7622|431.99|lly even ideas boost blithely final packages. foxes nag against the furiously ironic excuses. blithely regular accounts would cajole bravely quick, ironic packages-- regular, ironic depths +1274|12|9345|906.71|nts impress after the carefully express sheaves. fluffily pending notornis use quickly past the regular, final packag +1274|49|9865|422.23| packages are along the regular, ironic requests. regular packages use furiously ironic requests. furiously unusual accounts sleep amon +1274|86|988|719.71|blithely pending packages. special accounts haggle. blithely regular instructions according to th +1275|76|3670|390.00|about the regular deposits. special dependencies sleep quickly along the even, regular ideas: theodolites nag. ideas caj +1275|13|5519|501.90|ly along the even, final excuses. slyly special instructions sleep. slyly even notornis use slyly. +1275|50|955|70.68|as. ironic theodolites wake blithely even asymptotes. slyly final packages integrate regular, special deposits. +1275|87|9944|401.46|excuses are furiously against the blithely final asymptotes. ironic ideas above the quickly bold ideas wake slyly above the quickly +1276|77|5518|265.96| accounts haggle ironic, even requests. instructions +1276|14|5052|711.21|platelets shall have to are. slyly ironic gifts haggle slowly final packages. pending ideas sleep furiously. packages print blithely realms. quickly even instructions boost. theodolites pla +1276|51|6697|489.27| accounts haggle slyly about the quickly special packages. quickly furious requests are according to +1276|88|3471|654.11|y ironic theodolites? quickly unusual ideas sleep along the express requests. express, regular theodolites after the furiously bold accounts integrate quickly according to the slyly bold attainmen +1277|78|1538|743.17|final instructions haggle furiously after the slyly slow depend +1277|15|6316|102.08| final theodolites. ironic accounts do cajole after t +1277|52|9872|668.46|he final requests. express, ironic requests wake a +1277|89|7030|269.02|fluffily ironic multipliers. quickly special requests use quickly +1278|79|4185|146.13|s. slyly enticing deposits haggle furiously carefully regular foxes. final, special theodolites are express accoun +1278|16|8972|756.58|sts. even asymptotes according to the ironic, pending accounts cajole furiously unusu +1278|53|5258|694.77|ts after the special, busy ideas wake quickly after the requests. carefully express theodolites alongside of the packages haggle furiously blithely regular foxes. theodo +1278|90|9689|763.29|quests. fluffily final pinto beans affix carefully after the foxes. blithely regular deposits boost. quickly +1279|80|6217|624.90|egrate about the regular dugouts. slyly even requests according to the carefully regular packages detect fluffily against the packages. regular foxes cajole silently +1279|17|2633|333.16|ies are slyly along the furiously even instructions. even, pending accounts cajole furiously alongside of the carefully special attainments. ironic requests +1279|54|5683|240.73|ess packages haggle slyly final deposits. fluffily unusual ideas haggle +1279|91|3175|223.65|slyly regular dependencies haggle slyly against the final requests. blithely even packages affix carefully alongsi +1280|81|3309|864.18|aring foxes across the blithely bold accounts wake after the slyly special packages. blithely ironic packages affix doggedly. furiously ex +1280|18|9144|912.86|t packages. blithely express attainments maintain furiously. blithely final requests x-ray blithely. unusual, unusual packages sleep quickly even requests. idly bold packages al +1280|55|4334|954.72|. accounts sleep furiously. blithely special instructions doze. slyly special dependencies haggle fluffily. regular, final accounts use after the blithely final depos +1280|92|4862|182.84|sly special packages. slyly ironic accounts thrash fluffily? furiously busy requests ar +1281|82|54|251.28|ages. carefully even deposits sleep. foxes boost slyly against the final theodolites. doggedly silent ideas h +1281|19|2654|765.12|elets. slyly bold deposits believe against the ironic, final dependencies. slyly bold deposits was carefully about the blithely final requests. bold packages use to the pending court +1281|56|9480|400.13|t the quickly special pains. unusual, ironic excuses doubt ironical +1281|93|2280|985.34|he furiously pending pinto beans. fluffily close ideas since the slyly regular accounts serve a +1282|83|8379|356.26|he carefully regular asymptotes. quickly regular pinto beans sleep carefully final excuses. slyly even gro +1282|20|3999|903.38|onic accounts. blithely busy deposits sleep slyly ironic asymptotes. carefully pending platelets sle +1282|57|5566|383.72|gular, special ideas among the quickly express foxes boost fluffily about the slyly special instructions. pending courts cajole against the blithely regular deposits. fluffily ironic i +1282|94|341|823.57| accounts. even, bold requests wake blithely. final deposits are slyly. slyly ironic requests wake idly. furiously regular requests +1283|84|5331|782.71|equests boost fluffily. bold instructions doze quickly unusual pinto beans. quickly special deposits use quickly slyly silent packages. special foxes sleep fluffily. regular, even pac +1283|21|4174|278.57|sly. final platelets according to the accounts sleep express packages. quickly reg +1283|58|5806|842.95|luffily blithely final accounts; carefully regular gifts wake blithely. packages ought to wake fluffily. deposits haggle carefully blithely even pinto beans. carefully final foxes shall haggle ag +1283|95|8272|799.06|ly final excuses. blithely even accounts against the accounts cajole slyly even ideas. final instructions cajole. instructions wake. accounts boost quickly. carefully regular somas are quickly +1284|85|2079|322.86|slyly regular requests. regular foxes wake furiously about the ironic dolphins. requests wake carefully ironic, special dolphins. +1284|22|9884|951.37|st the boldly final accounts are slyly furiously regular platelets. quickly unusual requests across the packages +1284|59|4022|740.14|ar, express foxes wake blithely. slyly ironic accounts are blithely instructions. ironic, daring foxes are quickly packages. fluffily stealthy accounts sleep fluffil +1284|96|7143|83.22|ithely unusual pinto beans. regular ideas integrate express, ironic ideas. care +1285|86|6501|347.77|e closely across the even packages. furiously bold pinto beans across the furiously final frets lose regular requests. final deposits serve slyly after the caref +1285|23|7501|48.28|fily regular multipliers. express packages boost. blithely ironic deposits are after the regular, final warhorses. ironic dependencies m +1285|60|230|485.21|fily ironic packages. hockey players haggle. silently regular excuses haggle carefully according to the packa +1285|97|246|248.08|cajole ironic packages. carefully ironic pains according to the slyly thin excuses cajole ironically furiously express packages. platelets sleep slyly agains +1286|87|8795|916.51|gular, bold instructions boost carefully ironic instructions. furiously bold accounts nag busily regular requests. express requests sublate furiou +1286|24|690|249.66|arefully. special patterns play quickly across the slyly unusual forges. slyly unusual accounts integrate regular packages. blithely express p +1286|61|3912|438.71|posits. slyly regular courts affix quickly depths. bold instruction +1286|98|5214|34.05| haggle carefully final gifts. quickly express asymptotes haggle furiously. regular deposits must have to sleep furiously. accounts h +1287|88|3815|64.36|theodolites. accounts wake carefully along the blithely ironic accounts. furiously pending frets nag slyly q +1287|25|9855|7.03|. furiously regular requests sleep final deposits. accounts alongside of the slyly final pinto b +1287|62|5294|563.92|r instructions against the slyly special deposits detect furiously against the regular dolphins. ironic, bold asymptotes are caref +1287|99|9755|452.61|ys blithely express requests. slyly regular pinto beans cajole according to the furiously express deposits. blithely bold requests wake fu +1288|89|6977|759.64|riously carefully pending requests. permanent pack +1288|26|1663|124.06|. stealthy, special deposits about the slyly regular accounts nag blithely regular, ironic platelets. requests wake quickly foxes. ironic packages wake alongside of the car +1288|63|199|324.09|packages wake slyly carefully final packages. regular accounts among the pending deposits wake blithely among the slyly silent hockey players. asymptotes across the fluffily final pinto beans doze +1288|100|3881|629.76|ep busy attainments. final, bold orbits nod against the final, ironic accounts. doggedly ir +1289|90|3285|125.41|es boost slyly. bold requests sleep ironic instructions. ironic +1289|27|3400|171.72|usual foxes. even, even pinto beans wake slyly. dependencies grow blithely alongside of the pending deposits. unusual, unusual asymptotes are. pack +1289|64|9213|237.39|es according to the deposits cajole blithely about the carefully express deposits! bold +1289|1|6798|963.64|s cajole carefully express packages. furiously pending requests across the quickly regular requests wake around the bold, ironic pinto beans. asymptotes ca +1290|91|1189|208.56|y after the furiously final packages. final packages above the carefully pending dolphins cajole blithely quick deposits! slyly ironic excuses engage furiously alongside of the pending packages. +1290|28|2901|969.00|slyly regular accounts sleep furiously slyly regula +1290|65|5833|422.03| platelets are above the regular deposits. blithely pending pinto beans are express, regular deposits. care +1290|2|6950|321.34|ag slyly requests. quickly pending accounts detect furiously final, silent deposits. final instructions across the carefully dogged asymptotes cajole at the express packages. furiously even +1291|92|1935|343.25|tructions are slyly carefully regular requests. pinto beans cajole after the final, ironic dolphins: always careful ideas wake carefully about the furious +1291|29|7400|23.50|iously regular packages nag furiously against the slyly pending packages. carefully regular instructions nag furiously slyly final pinto beans. accounts integrate. unusual, fin +1291|66|7435|618.70| ironic ideas. fluffily bold deposits sublate furiously around the slyly special requests. furiously pending deposits believe carefully carefully final requests. furiously express acco +1291|3|97|40.86|nal accounts wake quickly slyly unusual packages. unu +1292|93|7694|640.78|ly quickly ruthless theodolites. careful requests along the carefully special instructions sleep blithely silent dependencies. furiously special foxes cajole doggedly final instructions. unusual +1292|30|8304|598.80|gular packages alongside of the express, pending requests boost carefully final foxes. furiously final deposits affix fluffily slyly exp +1292|67|5583|230.07| wake quickly regular ideas. daring frays haggle. deposits cajole above the express notornis. fluffily regular pinto beans lose boldly. slyly special reque +1292|4|3896|924.38| blithely carefully bold waters. regular, bold asymptotes against the ironic, regular instructions maintain slyly unusual, bold dolphins. ironic requests aff +1293|94|7827|724.58|tructions affix idly. quickly final ideas hinder furiously regularly regular deposits. enticing, ironic requests affix. fluffily express asymptotes wake furiously. foxes doubt slyly ideas. ev +1293|31|1290|271.22|bout the carefully brave dependencies. permanently final accounts are slyly pending requests. final foxes sleep abov +1293|68|5107|201.61|pinto beans are carefully. unusual instructions boost about the slyly bold accounts. carefully regular ide +1293|5|7541|117.35| carefully around the accounts. ironic deposits print finally blithely regular pinto beans. furiously pending pi +1294|95|8339|480.79|ross the requests. theodolites are above the quickly final deposits. carefully express package +1294|32|1931|918.71|ronic deposits sleep alongside of the warhorses. furiously ironic pinto beans boost. furiously regular foxes sleep blithely along the excuses; fluffily ironic asymptotes detect +1294|69|7677|262.53|ly unusual theodolites nag slyly bold requests. doggedly final instructions wake quietly carefully even theodolites. deposits hang: silently regular packages use carefull +1294|6|2796|49.83|ugouts. enticing waters eat carefully regular deposits! ironic +1295|96|6295|525.97|after the furiously careful forges. slyly express theodolites maintain. accounts nag furiously. final, busy requests affix fl +1295|33|7504|35.39|ffily even packages believe silent, regular packages: busily bold dependencies haggle despite the final excus +1295|70|8833|595.05| platelets. furiously ironic ideas nag blithely bold deposits. blithely ironic accounts wake blithely requests. even accounts against the speci +1295|7|7311|172.09|, ironic foxes detect slyly; carefully pending accounts hagg +1296|97|6112|392.08|slyly final accounts. slyly ironic packages sleep carefully special excuses: fluffily even platelets use blithely a +1296|34|5358|437.66|refully slyly ruthless excuses. fluffily express +1296|71|3020|368.30|uriously careful theodolites about the regular platelets sleep along the final, regular accounts! ideas along the furiously pending ideas boost slyly slyly f +1296|8|8463|440.87|ts use on the regular instructions. furiously express packages along the quickly ironic theodolites engage blithely furiou +1297|98|1079|364.00|regular requests. fluffily final packages do poach quickly doggedly regular deposits. ironic asymptotes wake carefully against the daring +1297|35|8123|80.73|ironic asymptotes. carefully regular instructions detect. ironic, bold deposits cajole past the quickly final theodolites. +1297|72|6023|358.50|ording to the slyly regular platelets. blithely silent frays are blithely-- blithely slow deposits +1297|9|4079|529.10|d requests nag slyly above the quickly final ideas. furiously bold requests cajole quickly even deposits. blithely final requests haggle s +1298|99|7523|615.37|en deposits are under the furiously even foxes. ironic, +1298|36|292|965.94|ular packages across the furiously unusual orbits use permanently final asymptotes. bold courts cajole. unusual, ironic accounts wake. furiously bold ideas are after the deposits. quickly pending de +1298|73|8852|878.34|sly ironic packages run furiously. final ideas shou +1298|10|7770|100.28|re slyly about the blithe packages. permanently regular pinto beans above the slyly enticing attainments breach furiously at the pending requests. ironic packages use. blithely ironic requests nag. +1299|100|801|321.33|o the deposits. ironic requests with the quickly special accounts use accounts. final, regular +1299|37|6665|262.49|gainst the pending courts doze furiously accounts. quickly ironic foxes nag slyly finally silent foxes. fluffily ironic dolphins lose carefully among the +1299|74|5533|237.94|fter the platelets are fluffily blithely pending accounts. carefully unusual packages alongside of the braids are slyly bold theodolites. furiously regular deposits until the furiously express r +1299|11|355|216.12|heaves haggle slyly slyly special forges. ironic theodolites according to the theodolites impress dependencies-- thin, ironic packages sublate fluffily. ideas a +1300|1|4576|184.85|le carefully regular foxes. bold, pending pinto beans cajole fluffily above the slyly regular packages. express, final somas integrate above the carefully even acc +1300|38|3565|155.70|packages haggle blithely furiously final requests. slyly final realms sleep. packages alongside of the special plat +1300|75|5761|750.25|ons. ironic excuses detect furiously. bold, regular requests dazzle fluffily slyly unusual pinto beans. final pinto beans believe furiously ironic, regular deposits. eve +1300|12|9814|259.16|usly. furiously regular theodolites affix. requests c +1301|2|3698|252.52|doubt. furiously close packages boost furiously bold requests. theodolites sleep carefully above the blithely even deposits. pending requests are. blith +1301|40|47|592.83|s haggle blithely besides the slyly regular instructions. furiously even requests boost quickly blithely s +1301|78|4341|892.99|r pinto beans. carefully final accounts use fluffily regular foxes. regular, ironic accounts impress slyly against the slyly ironic deposits. deposits against the furiously special ideas affix abo +1301|16|1168|624.73| blithely special packages wake furiously unusual foxes. unusual, final pinto beans among the quickly bold deposits cajole quickly along the pinto beans? special, regular pac +1302|3|5278|545.80|aggle against the pinto beans. regular accounts nag idly carefully regular ideas. quickly even deposits x-ray quic +1302|41|4259|608.64|deposits wake carefully across the blithely express requests. furiously final notornis boost above the furiously ironic packages. fi +1302|79|3807|788.93|s. blithely unusual theodolites haggle special packages. final dolphins affix carefully a +1302|17|6995|4.10| along the blithely unusual excuses use alongside of the express, dogged deposits. care +1303|4|5587|246.63|s use quickly even accounts. pending, furious requests sleep: carefully special deposits are blithely slyly blithe requests. platelets haggle +1303|42|4479|552.81|tithes. blithely final platelets haggle after the bold foxes. furiously ironic platelets wake quickly. carefully ironic accounts nag orbits. idly s +1303|80|7376|512.65|y accounts boost furiously. furiously silent deposits boost boldly quickly even packages. boldly ironic deposits against the bold, final excuses lose q +1303|18|8972|911.06|rays. slyly regular packages breach furiously. slyly ironic pinto beans wake. slyly regular accounts nag blithely packages? regular deposits among the blithely even accounts hang bl +1304|5|5326|691.26|s accounts doze fluffily slyly silent deposits. blithely express platelets cajole across the slyly special +1304|43|122|761.60|ress instructions nag fluffily after the ruthlessly regular asymptotes-- packages sleep against the blithely express accounts. bold, ironic braids alongside of the furiously +1304|81|7315|75.90|thely final requests are carefully. slyly regular accounts cajole carefully. accounts haggle quickly across the furiously final account +1304|19|9129|239.71|ording to the slyly regular foxes. ironic dolphins boost slyly; furiously express pinto beans haggle slyly packag +1305|6|4776|32.29|y slyly final ideas. carefully regular theodolites are slyly. quickly final Tiresias cajole furiously carefully even multipliers. slowly blithe asymptotes sleep silently-- accounts at the b +1305|44|1551|459.93|al accounts. accounts sleep slyly. busily regular accounts nod slyly furiously close instructions. slyly final theodolites wake always bold ideas. ideas unwind blithely among the unusual pla +1305|82|1186|905.64|s. even theodolites use carefully around the slyly express requests. blithely even platelets haggle at t +1305|20|4901|361.18|s boost blithely among the blithely even theodolites. regular, regular requests sleep carefully final requests? carefully even requests thrash pinto beans. courts sublate boldly across the ironic pi +1306|7|3834|546.20| slyly even deposits. blithely final accounts are blithely among the slyly special requests. furiously unusual packages wake slyly even pinto beans. accounts across the bold, even requests nag +1306|45|8649|342.28|cording to the regular foxes detect busily against the quickly bold theodolites. even packages +1306|83|5017|667.39|lowly alongside of the final accounts. regular sauternes sleep slyly for the deposits. ide +1306|21|5994|264.77|ress packages nag carefully furiously final deposits. express, regular waters haggle slyly deposits. blithely unusual packages sleep furiously +1307|8|3950|594.04|sits wake. even accounts nag furiously. final accounts against the furiously express deposits are quickly after the unusual packages. final accounts am +1307|46|2020|182.05|carefully above the slyly brave packages. pending packages haggle fluffily +1307|84|1892|953.37|uriously ironic accounts. requests among the furiously pending excuses print blithely ironic ideas. carefully permanent ideas beyond the carefully pending excuses thrash +1307|22|6500|511.80|ely ironic packages. furiously bold instructions wake blithely ruthless, ironic pinto beans. even accounts impress slyly alongside of the slyly ironic accounts. even theodolites a +1308|9|4431|556.23|ajole enticingly after the quickly ironic accounts. quickly special accounts integrate +1308|47|7084|28.60|leep slyly blithely express pinto beans. packages sleep +1308|85|9545|435.11|accounts snooze slyly furiously unusual theodolites. final, regular pinto beans breach quickly among the final, ironic asymptotes. blithely unusual foxes integrate. final din +1308|23|3697|334.47|deposits wake regular courts. carefully even theodolites nag slyly furiously even deposits-- ironic requests along the packages breach sl +1309|10|5410|310.64|quests wake slyly according to the silently regular packages. deposits haggle blithely blithely final foxes. quickly regular packages according to the +1309|48|2592|340.75| requests are slyly after the special, final requests. even foxes sleep slyly final ideas. evenly ironic instructions nag quickly. special accounts sleep +1309|86|8505|848.12|lar, special instructions are quickly around the carefully unusual accounts. bold requests across the fluffily express accounts sleep carefully instructions +1309|24|6768|811.13|ironic pinto beans nag. slyly express packages wake quickly across the furiously even foxes. slyly bold requests cajole about the ironic, express accounts. ironic +1310|11|289|459.12|eat furiously attainments. bold packages poach quickly. blithely even platelets c +1310|49|5616|359.11|egular requests. slyly regular requests cajole above the regular theodolites. express asymptotes are blithely across the pending foxes. even, silent acc +1310|87|3837|763.31|xpress packages. furiously ironic ideas are quickly along the final ideas. blithely final theodolites wake busily. ironic packages use fluffily beneath the silent the +1310|25|6978|3.07|e. pinto beans cajole doggedly bold packages. fluffy accounts along the blithely stealthy deposits are carefully regular excuses. quickly even requests +1311|12|6944|978.50|lites across the quickly silent requests should breach against the carefully pending foxes. special, ironic dolphins along the carefully pending accounts +1311|50|9568|152.77|arhorses. requests are alongside of the ideas? braids over the silent, silent instructions sleep quickly at t +1311|88|1278|423.12|yly even packages. fluffily special courts detect fluffily. slyly idle instructions boost slyly special deposits. enticingly ironic platelets along the regular t +1311|26|8946|621.49| regular pinto beans-- blithely final asymptotes thrash according to the slyly ironic platelets! thin dependencies doze slyly furiously fi +1312|13|9379|941.90|ns. excuses cajole slyly. slyly final warhorses prin +1312|51|6731|481.57|ring accounts nag fluffily along the furiously regular requests. final foxes about the slyly special dependencies impress cl +1312|89|5645|973.72|pending requests. blithely unusual ideas integrate furiously above the ironic requests. accounts nag. furiously regular deposits sleep ironically regular frays! accounts +1312|27|5646|867.88|are about the requests. quickly regular epitaphs nag. blithely even ideas sublate slyly. unusual dependencies sleep. final instructions boost blithely across the pending packages. thinly ev +1313|14|270|220.35|the carefully express deposits. fluffy deposits haggle +1313|52|7835|307.45|ggle. slowly ironic deposits wake-- regular deposits thrash carefully ironic foxes. fluffily regular ideas nag slyly above the carefully pending foxes. slyly final platelets wake blithely a +1313|90|9271|670.28|anently express packages. furiously bold accounts cajole. final accounts cajole slyly among the foxes. carefully final requests sleep carefully. fluffily express packages boost across the furiously +1313|28|9148|786.06|the carefully unusual platelets. slyly final packages above the deposits cajole quickly after the always +1314|15|2026|731.30| affix furiously slyly regular epitaphs. slyly regular +1314|53|2593|479.82|regular courts promise. express, unusual pinto beans are furiously blithely unusual foxes. even, bold theodolites will are according to the quickly ironic requests. bold, +1314|91|8750|620.50|gainst the blithely even instructions. instructions cajole never. silent pinto beans engage furiously among the idly regular foxes. special, ironic packages are. ironic, unu +1314|29|4995|371.70|e furiously around the quickly even accounts. furiously bold accounts sleep furiously among the regular reques +1315|16|7880|654.10|bold theodolites sleep alongside of the blithely regular ideas: carefully pending accounts affix blithely. unusual packages sleep blithely. bold frets cajole. packages cajole carefully +1315|54|6984|581.04|g to the quickly final platelets-- quickly silent theodolites cajole quickly even deposits. ruthlessly silent dependencies cajole carefully unusual, busy theodolites. instructions wake bravely +1315|92|7461|402.67|the carefully final deposits detect alongside of the blithely final requests. blithely ironic +1315|30|3312|680.89|sheaves. blithely final accounts are. slyly regular sauternes are quickly. ironic, even asymptotes x-ray? slyly final pinto beans w +1316|17|229|241.26|dependencies sleep against the carefully ironic accounts. ironic accounts use. express ideas wake slowly regular packages. pendin +1316|55|638|151.93|ix pending instructions. slyly special dolphins shall have to cajole furiously carefully ironic requests. carefully even deposits are blithely inst +1316|93|7444|200.48|regular dolphins wake furiously blithely ironic deposits. accounts wake along the final instructions. +1316|31|9334|131.12|ding to the slowly ironic excuses cajole fluffily multipliers. regular acco +1317|18|8939|146.27| deposits sleep carefully across the quickly final packages. blithely final p +1317|56|3539|55.89|cies haggle alongside of the blithely final theodolites-- pending deposits sleep. ironic, regular epitaphs maintain blithely. express requests wake slyl +1317|94|2522|606.31|ar pinto beans. regular requests against the ironic notornis nag carefully +1317|32|1922|557.84|l, even instructions affix. deposits sublate carefully even accounts. furiously final foxes detect after the furiously final deposits. qui +1318|19|3689|86.48|al deposits haggle slyly after the ideas. special, regular pinto beans sleep along the blithely silent dependencies. dogged, bold requests haggle above the special +1318|57|6576|136.52|ously express dependencies dazzle. fluffily bold pinto beans +1318|95|662|990.93|bold excuses. regular deposits cajole slyly. deposits wake above the bold pearls. ironic, pending foxes sleep about t +1318|33|6382|321.42|al packages. express, unusual escapades mold fluffily final somas. blithely pending pains over the ironically unusual theodolites sleep along the special accou +1319|20|8449|789.33|its-- theodolites lose furiously even, daring requests. even accounts poach quickly slyly regular real +1319|58|1755|626.13|s cajole furiously above the slyly unusual instructions. slyly silent instructions against the excuses integrate regular, express accounts-- quickly en +1319|96|4591|128.46| regular requests cajole. slyly even requests cajole furiously according to the pinto beans. bold, ironic deposits wake carefully ironic frays. express requests hang quickly alon +1319|34|7946|509.68|asymptotes are furiously above the slyly regular pinto beans. special pinto beans use fluffily after the blithely special packages. carefully unusual instructions a +1320|21|1865|877.97|g to the regularly special deposits use furiously above the ironic ideas. carefully special braids are furiously bravely final deposits. unusual ideas wake blithely. fluffily ironic +1320|59|5573|949.02|blithely regular packages across the final packages sleep ironic depths. even excuses cajole blithely across the blithely bold deposits. blithely regular instructions hinder blithely a +1320|97|3768|298.24|ld requests. regular hockey players promise slyly about the slyly ironi +1320|35|4159|774.69|tect permanently with the slyly silent instructions. quickly ironic instructions cajole fluffily. quickly b +1321|22|5949|362.44| pinto beans haggle slyly. regular braids wake aga +1321|60|6715|819.86|ic foxes haggle blithely furiously final accounts. theodolites boost about the packages. carefully ironic pinto bea +1321|98|7242|356.43|e quickly. furiously ironic platelets kindle blithe +1321|36|5870|767.09|bold excuses wake. fluffily final accounts above the ca +1322|23|5319|481.85|the special, quick packages unwind carefully express ideas. foxes breach carefully furiously unusual +1322|61|1261|743.78|ies affix furiously around the ironic, ironic frays. blithely +1322|99|3989|362.59|y. carefully regular packages integrate fluffily about the quickly final packages. requests cajole fluffily. final requests sleep along the requests; pending packages acros +1322|37|4868|417.40|. final excuses wake quickly final excuses. slyly regular requests across the ironically regular packa +1323|24|4319|382.18|usual packages haggle blithely regular accounts. special, pending attainments dazzle slyly. express requests hinder furiously according to the +1323|62|8307|859.53| instructions. furiously regular warthogs solve blithely special, stealthy accounts. ironic, +1323|100|9852|775.94|warhorses haggle fluffily. accounts wake ironically final packages. sly requests haggle. furiously unusual ideas sleep final foxes. +1323|38|7965|355.30|ronic instructions. permanent theodolites nag alongsi +1324|25|6028|654.53|s haggle doggedly along the furiously even accounts. fluffily regular accounts wake quickly after the furiously regular pinto bea +1324|63|4688|890.55|l deposits sleep. slyly special accounts use furiously. furiously brave ideas boost fluffily: carefully slow gifts according to the c +1324|1|8373|565.10|es sleep carefully after the quickly express accounts. carefully even requests across the pending packages are +1324|39|5573|296.59|y final theodolites. carefully unusual instructions against the furio +1325|26|3236|6.06|theodolites boost quickly after the carefully ruthless ideas. sl +1325|64|8495|218.83|, unusual deposits are furiously across the furiously regular foxes. blithely i +1325|2|7643|860.90| requests are slyly above the carefully unusual warhorses. blithely final deposits are carefully +1325|40|2887|755.00|ular accounts nag carefully around the final ideas. fluffily quiet epitaphs are furiously: special, quick accounts integrate furiously. final, ironic pinto beans nag fluffily af +1326|27|1061|112.99|es about the regular, regular accounts hang idly even deposits; quiet, unusual deposits detect slyly quickly fluffy deposits. theod +1326|65|3735|219.49|uctions snooze quickly over the quietly ironic packages. furiously ironic pains against the quickly even pa +1326|3|5497|836.19|egular deposits haggle. furiously regular dolphins hinder quickly after the slyly unusual requests. close packages cajole blithely quiet accounts. requests s +1326|41|5857|115.15| integrate blithely against the blithe, express foxes. final requests nag quickly. unusual, blithe accounts cajole +1327|28|7643|458.20|l accounts nag furiously slyly regular accounts. fluffily final foxes are quickly about the final theodolites. furiously regular platelets cajole slyly at the ironic theodolites. +1327|66|1251|938.03| ironic asymptotes wake quickly bold requests. slyly even instructions haggle slyly final dependencies. thinly pending excuses impress q +1327|4|234|308.27|e enticingly final pinto beans. regular platelets are furiously ironic accounts. quickly final packages are furiously. silent ideas are furiously above the +1327|42|8918|434.98| pinto beans. deposits cajole from the slyly final requests. final instructions haggle carefully. furiously bold ideas integrate slyly along the ideas. +1328|29|6547|240.75|egular requests cajole fluffily about the even ideas. boldly ironic ideas cajole against the unusual, bold ideas. ironic, regula +1328|67|2893|479.86| packages cajole fluffily fluffily even deposits. pinto beans breach slyly. unusual deposits wake. r +1328|5|568|226.59|bold ideas. ironic deposits sleep quickly! packages are carefully final dinos. pending platelets +1328|43|5950|344.23|osits past the furiously pending requests haggle sl +1329|30|5801|461.38|fily pending ideas nag carefully alongside of the bold, idle accounts. bold, regular packages wake requests. quickly pending accounts cajole furiously alongside of +1329|68|5816|432.19|ndencies print furiously across the silently quick foxes. d +1329|6|5458|324.79|inal deposits boost carefully carefully special dolphins. quickly bold pinto beans haggle blithely fluffily ex +1329|44|6223|370.54|s! even instructions along the slowly final excuses sleep carefully according to the blithely ironic ideas. ac +1330|31|68|118.32|ng requests along the blithely express courts sleep furiously ironic escapades. blithely final deposits after the slyly regular deposits nag fluffil +1330|69|5377|849.40| fluffily with the blithely ironic requests. regular accounts sleep. dugouts wake never regular requ +1330|7|1633|307.82|posits. closely special deposits detect. furiously regular requests print slyly above the carefully regular courts. fluffily bold foxes nag special hockey players. ideas wak +1330|45|8126|882.98|hrough the furiously regular theodolites. regular, regular requests haggle accor +1331|32|4866|139.06|lly special ideas haggle blithely across the blithely pending frays: regular, unu +1331|70|6724|727.10|s alongside of the ironic, regular foxes sleep slyly ironic ideas. ironic, ironic packages detect slyly. furiously silent dependencies according to the express instructions gr +1331|8|6811|676.30|he quickly silent theodolites. regular dependencies promise caref +1331|46|6346|163.00|ideas detect furiously. regular theodolites boost quickly silent, pending packages. slyly express pinto beans are. silent dependencies among the bold, even frets sleep carefully regular exc +1332|33|3259|588.84|s haggle fluffily. quickly regular asymptotes eat evenly. blithely regular packages sleep slyly outside the even, bold foxes. +1332|71|8688|693.33|onic dugouts cajole carefully upon the fluffily regular deposits. final requests wake slyly blithely even accounts. express accounts haggle furiously after the slyly ironic +1332|9|1393|584.47|ent foxes are blithely. carefully close platelets eat. regular requests wake blithely ironic theodolites. slyly regular ideas hinder carefully express packages. slyly even asymptotes w +1332|47|2503|99.67|theodolites cajole furiously across the asymptotes. deposits wa +1333|34|7075|94.06|ent theodolites after the slyly even accounts detect among the un +1333|72|1056|680.53|ress deposits. carefully pending excuses cajole carefully final dependencies. even e +1333|10|967|202.93|lar, regular packages cajole quickly. regular ideas wake packages. ironic packages wake. ideas are? ideas are blithely? slyly regu +1333|48|7888|223.71|ar packages sleep slyly about the silent, final warthogs. slyly special deposits nag carefully regular packages. regular platelets above the slyly even +1334|35|8431|958.24|e thinly busy deposits. blithely ironic accounts sleep furiously. unusual warthogs grow slyl +1334|73|4376|290.88|requests wake slyly about the regular dolphins. special packages nod. unusual, even requests sleep. ironic pinto beans mold around the ironic ideas +1334|11|1417|845.69|ously ironic requests wake sometimes in place of the fluffily bold instructions? blithely final asympt +1334|49|4514|846.57|nal theodolites. final, ironic dependencies sleep. express dependencies haggle furiously pending, pending accounts. fluffily even +1335|36|1524|708.92|egular instructions haggle carefully special platelets. ideas use carefully. ironic, special exc +1335|74|905|916.10|kly regular instructions about the blithely final accounts wake slyly among the slyly bol +1335|12|1859|378.64|uriously among the express accounts. blithely final ideas use carefully regular foxes. special accounts wake about the blithely special ideas. furiously pend +1335|50|5642|310.03|al requests. slyly ironic patterns are. final dolphins use blithely. thinly busy accounts wake. blithely even packages wake +1336|37|2205|32.01|ing to the foxes. slyly even accounts about the ironic courts wake along the daringly regular accounts. blithely unusual accounts haggle carefully. carefu +1336|75|47|774.44|lithely among the fluffily regular deposits. ironic, ironic requests boost across the regular packages! packages wake blithely pending requests. special +1336|13|7153|124.92|instructions. quickly final ideas boost fluffily. slyly special dolphins run blithely final, regular requests. sly packages alongside of the bold deposits wake furiously according to the quic +1336|51|2917|790.67| ironic accounts! quickly even braids nag at the quickly silent theodolites. even deposits haggle quickly special grouches. furiously ironic asymptotes use blithely. quickly unusual packages sle +1337|38|4682|231.54| packages. furiously busy pinto beans detect: quickly regular accounts haggle slyly against the carefully special accounts. packages cajole quickly across +1337|76|6218|563.06|s around the accounts haggle carefully final platelets. blithely ironic foxes against the packages are slyly quiet, regular +1337|14|4393|939.82|ily regular requests. slyly regular asymptotes cajole inside the carefully bold ideas. blithely regular foxes boost accounts. furiously regular pl +1337|52|8310|475.51|deas wake along the fluffily final pinto beans. blithely regular requests alongside of the final, unusual foxes cajole bold, even accounts. carefully ir +1338|39|8399|20.50|s wake: excuses engage. blithely ironic instructions mold about the express requests. ruthless, final requests above the theodolites sleep furiously fluffily +1338|77|4757|181.66|quests use carefully alongside of the final instructions. silent, pending accounts cajole among the blithely even ideas. slyly ironic requests hag +1338|15|1178|398.70|refully even sheaves sleep. even requests around the enticingly ironic deposits sleep furiously blithely pending packages. blithely ironic dependencies after the fluffily ironic packag +1338|53|8975|827.82|y regular accounts. furiously regular deposits wake regularly. fluffily final theodolites wake across the blithely quiet asymptotes. finally express i +1339|40|5513|139.66|c ideas sleep furiously carefully final packages. blithely regular pint +1339|78|2543|932.91|quickly. slyly unusual packages about the requests unwind slyly ironic requests. ideas sleep. carefully final foxes among the carefully unusual excuses us +1339|16|3813|187.11|gular packages; blithely bold ideas after the regular, special accounts detect c +1339|54|7066|61.54| pending ideas are. regular dinos about the pinto beans wake b +1340|41|4006|586.63|es lose carefully unusual theodolites. carefully regular theodolites are quickly. slyly daring dependencies daz +1340|79|9002|473.33|the carefully even accounts. carefully regular dug +1340|17|7457|406.37|eas cajole blithely above the regular packages. s +1340|55|4656|865.91|telets. slyly final packages across the slyly even dugouts sleep furiously express, ruthless accounts. carefully even acc +1341|42|3397|22.49|even pinto beans sleep alongside of the carefully regular accounts. furious +1341|80|8732|555.16|ic multipliers boost carefully. frays cajole against the thinly final requests. fluffily bold requests po +1341|18|3373|147.40|ages integrate along the furiously pending asympto +1341|56|3332|25.57|nal deposits haggle. final deposits sleep. regular deposits boos +1342|43|132|475.79|ious deposits affix blithely final, express deposits. blithely regular orbits along +1342|81|1230|804.79|ets. blithely regular deposits haggle. final requests sleep silentl +1342|19|6834|779.35|. unusual warthogs lose carefully blithely bold deposits. final theodolites haggle furiously. fluffily even asymptotes +1342|57|9302|759.15|es. ironic frays boost even decoys. deposits according to the regular excuses unw +1343|44|1116|894.36|special packages wake furiously according to the slyly final deposits. quickly final sauternes sleep blithely. furiously express accounts on the quickly regular epitaphs use even, ironic pac +1343|82|8291|626.44|inal accounts haggle after the slyly express requests. regular deposits integrate blithely. furiously regular requests cajole carefully! never unusual re +1343|20|3256|237.00| accounts between the furiously final foxes sleep asymptotes. sly +1343|58|9218|406.38|r theodolites after the fluffily even packages haggle carefully carefully express dolphins. final, pending platelets wake fluffily unusual, ironic instructions. unusual +1344|45|9449|985.11|, regular accounts. fluffily final accounts against the special, regular dolphins detect blithely about the c +1344|83|7046|447.18|totes wake furiously. carefully even dependencies use against the ironic foxes. furiously ironic p +1344|21|3803|513.95|dolites cajole. silent requests across the slyly final foxes are care +1344|59|3935|726.73|ronic packages. furiously bold packages are. sile +1345|46|604|594.31|l instructions. ironic, pending deposits run blithely furiously regular accounts. pending ideas among the sl +1345|84|5455|727.30|al excuses sleep across the furiously express accounts. furiously unusual pinto beans wake furiously ironic accounts. ca +1345|22|9597|47.76|c accounts. silent pinto beans cajole slyly. regular foxes across the even, regular packages are doggedly after the ideas. carefully close foxes +1345|60|6896|750.85| slyly furious asymptotes. express, careful instructions haggle carefully. foxes are carefully at the bold deposits. slyly ironic packages print express, pendin +1346|47|8478|312.59|ording to the slyly regular requests. blithely final instructions above the regular asymptotes sleep slyly against the fluffily special ideas. furiously fi +1346|85|1573|222.91|r packages mold quietly. blithely bold ideas sleep carefully instructions. quickly pending +1346|23|3354|499.24|ages. final pinto beans are slyly pinto beans. thinly ironic excuses boost. ironic packages run! carefully regular requests detect slyly accounts. final accounts subl +1346|61|5287|258.98|quickly bold requests. furiously regular requests sleep instead of the instructions. slyly regular packages use. fluffily eve +1347|48|6388|304.14|unusual ideas. ironic platelets are carefully quickly bold asymptotes. regular accounts cajole furiou +1347|86|2132|72.41|int according to the carefully even foxes. ironic, even theodolites nag furiously above the carefully ironic foxes. carefully silent deposits along the final theodoli +1347|24|1441|523.20|uickly regular theodolites are carefully about the even requests. regular, ironic requests affix. d +1347|62|8750|323.28|excuses. special realms after the busily ironic theodolites dazzle slyly regular requests. never unusual deposits according to the accounts boost closely around the special deposits. b +1348|49|7996|70.89|aggle regular theodolites. slyly bold instructions about the r +1348|87|6267|960.49| instructions sleep silently above the furiously even platelets. warhorses wake furiously enticingly bold package +1348|25|4257|282.75|, express deposits. unusual accounts haggle. courts nag among the unusual accounts. ironic packages across the packages would cajole furiously blithely special dependencies. slyly r +1348|63|5821|124.44|ending deposits. furiously express instructions boost across the carefully ironic packages. silently ironic accounts cajole furiously special +1349|50|227|742.03|lyly even asymptotes sleep quickly slow, silent accounts. dependencies haggle silently sly ideas? deposits are slyly pending requests. ironic theodolites are furiously speci +1349|88|9407|848.83|onic deposits boost. carefully sly packages against the carefully silent accounts sleep s +1349|26|9577|760.28|quests kindle carefully. bold platelets wake carefully quickly bold courts. even decoys alongside +1349|64|2306|933.61|ely. carefully blithe deposits use quick packages. ideas alongside of the slyly bold dolphins wake carefully carefully regular deposits. re +1350|51|8145|918.74|ests. silent requests nag express packages. closely final accounts according to the slyly +1350|89|1777|859.74|riously. final instructions are. furiously express pinto beans wake slyly against the carefully express packages. pending deposits across the furiously spec +1350|27|5301|169.04|furiously final platelets are blithely. furiously even foxes haggle express, express courts: even, spec +1350|65|8848|172.04|hely pending requests unwind furiously even packages. final accounts aft +1351|52|6232|649.16|te furiously quickly ironic accounts. blithely even courts are. enticingly regular foxes haggle blit +1351|90|6542|422.35| platelets haggle fluffily furiously regular ideas. final requests play beside the theodolites. quickly bold accounts +1351|28|6905|712.12|mpress blithely accounts: requests wake alongside of the ironic accounts. quickly even requests wake furiously. dolphins affix slyly. daringly even foxes alongside of the bold +1351|66|373|753.59|lar dugouts. blithely final requests are blithely among the carefully fin +1352|53|912|482.42|ular packages. final, final requests cajole ironic, special accounts. slyly final deposits hagg +1352|91|4115|386.35|equests haggle against the slyly express platelets. express, final braids after the dolphins are closely carefully regular platelets. carefully even platelets sleep fur +1352|29|807|153.94|y quickly daring accounts. doggedly brave requests may haggle blithely above the carefully expres +1352|67|8914|20.02|engage among the instructions. even deposits nod among the carefully final asymptotes. carefully unusual packages about the thin, even instructions c +1353|54|8589|142.00|s. final, regular asymptotes sleep carefully even reque +1353|92|4763|153.77| tithes cajole slyly pending foxes: daringly ironic dependencies haggle fluffily. slyly bold patterns affix. furious +1353|30|5541|216.35| theodolites integrate fluffily final asymptotes. slyly express packages around the slowly regular platelets cajole across the slyly pend +1353|68|3019|122.46|sentiments. regular deposits wake blithely. blithely ironic accounts across the express requests hang b +1354|55|4032|526.54|ccording to the bold excuses. carefully even asymptotes nag blithely about the even pinto beans. furiously bold foxes cajole. express ideas are final realms. blithely regular sentim +1354|93|4082|610.86|ely express deposits haggle furiously quickly ironic foxes. regular ideas use carefully. even packages haggle slyly across the ironic, final frays. blithely regular pearls believe +1354|31|4353|103.14|eas x-ray slyly among the slyly even packages. even instructions above the slyl +1354|69|593|375.52|d instructions haggle blithely above the slyly bold courts. express, ironic requests are furiously s +1355|56|5966|805.73|structions. carefully ironic accounts are furiously. +1355|94|4595|651.23| special pinto beans nag-- ironic, special packages nag slyly fluffily bold pinto beans. carefully pending accounts around the carefully even deposits cajole sheaves. regular p +1355|32|9548|289.36|d alongside of the bold accounts. fluffily express packages are idly. carefully ironic accounts sleep regular ideas. furiously fluffy deposits wa +1355|70|5526|398.58|riously ironic deposits snooze slyly blithe theodolites. slyly ironic instructions boost. instructions are furiously even packages. ironic, final ideas abo +1356|57|8405|755.45|requests play busily regular ideas. doggedly pending pinto beans wake quickly slyly express accounts. carefully express deposits sleep furiously. +1356|95|7753|669.76| haggle blithely. never ironic requests alongside of the blithely final pa +1356|33|4999|133.17|nding asymptotes-- even requests nag. final asymptotes sleep f +1356|71|6548|714.35|hely final tithes. requests above the ironic, quiet w +1357|58|1947|231.37|nic deposits among the slyly even deposits are carefully silent requests. regular theodolites are carefu +1357|96|3259|756.00|fluffily quietly careful packages. furiously even requests wake quickly silent platelets-- evenly bold sauternes might wake furiously ironic, ironic theodolites. +1357|34|9775|964.38|p furiously final, final courts. quickly bold packages are carefully. furiously ironic foxes about the blithely pending deposits wake final, express requests. regula +1357|72|3307|671.35|kly bold ideas; final accounts cajole silently. carefully regular requests +1358|59|3638|819.10| bold platelets. furiously even requests thrash furiously. unusual, special asymptotes haggle blithely fi +1358|97|8165|473.81|ccounts wake slyly quickly express excuses. silent Tiresias are along the blithely even patterns. fluffil +1358|35|7752|438.16| after the carefully silent packages. carefully pending requests haggle careful requests. furiously ironic accounts use slyly around the r +1358|73|6587|652.74|pending foxes. pending deposits haggle against the courts. requests d +1359|60|2856|739.28|ut the deposits. slyly regular ideas wake blithely. fluffily pending packages c +1359|98|9529|711.55|h quickly after the furiously final pinto beans. pa +1359|36|5439|57.65|ackages. fluffily final accounts detect blithely carefully even ideas. silent, ironic pinto beans x-ray. fluffily pending requests cajole furiously requests. fluffily unusual platelets use blit +1359|74|9606|109.42| sleep carefully. furiously regular deposits wake fluffily slyly even accounts? carefully fi +1360|61|6788|60.64|xes according to the enticing pinto beans kindle fu +1360|99|3652|399.74|s. accounts kindle fluffily about the blithely ironic instructions. final, regular pinto beans snooze slyly according to the regular requests. decoys alongside of the unusual dependencies belie +1360|37|301|395.52|ons. deposits beside the silent foxes sleep regularly pending requests. fluffily pending theodolites use fluffily +1360|75|4270|278.78|ffix quickly furiously pending dolphins. quickly pending pinto beans sleep slyly. final ideas nag carefully. furiously bold deposits are furiously daring depend +1361|62|1998|285.49|ously blithely pending dolphins. excuses haggle furiously regular grouches. unusual deposits cajole slyly across the quickly regular requests. unusual requests are after the caref +1361|100|2859|198.11|ep carefully along the accounts. final theodolites sleep furiously careful ideas. quickly even accounts thrash furiously. slyly unusual accounts sleep slyly asymptotes-- final, ironic accou +1361|38|9407|254.39|ilent, regular deposits integrate blithely around the fur +1361|76|6508|69.71|ously even deposits sleep against the pending attainments. unusual, ironic requests haggle. special packages wake. pendin +1362|63|3185|42.47| carefully final braids cajole furiously special accounts. pinto beans boost. finally even accounts sleep furiously after the closely regular pinto beans +1362|1|9737|799.94|ns cajole idly. deposits are quickly blithely even deposits. quickly regular packages boost carefully. blithely ironic asympto +1362|39|9194|240.78|l requests cajole carefully. blithely express gifts +1362|77|3991|997.76|y special excuses promise slyly along the blithely express dug +1363|64|3056|289.61|e of the furiously regular foxes try to dazzle carefully grouches: sl +1363|2|5333|640.48|packages cajole quickly about the express, final accounts. fluffily unusual pinto beans are furiously. ideas use quickly regular requests. silent requests boost closely furiously even packages. pen +1363|40|5800|446.14|hely even ideas among the unusual, special requests sleep blithely ironic requests. carefully regular foxes nag blithely quickly ironic accounts. finally unusual accounts eat finally close, even pac +1363|78|6854|933.50|nally ironic asymptotes use carefully. carefully pending platelets above the unusual, unusual instructions might sleep against the quickly final deposits; regular, idle deposits boost furiously +1364|65|3819|181.43|r the furiously regular requests. express accounts mold requests. excuses ought to are slyly even requests. enticing dolphins wake slyly again +1364|3|1397|605.69|ular dolphins. final instructions are according to the blithely careful escapades. slyly unusual foxes haggle +1364|41|9013|117.17|nstructions use carefully deposits. fluffily final deposits doubt fluffily according to the pending accounts. slyly pending asymptotes through the regular ideas haggle blithely ar +1364|79|6198|443.73|y even pinto beans. furious deposits nag carefully slyly express requests. unusual, regular deposits dazzle furiously quickly final packages. ironic, express instruction +1365|66|9732|365.19|use according to the quickly pending accounts. ruthlessly regular accounts alongside of the carefully ruthless packages use furiously over the pack +1365|4|936|61.40|nic forges. furiously final requests haggle. fluffily final waters promise furiously carefully regular dolphins. furio +1365|42|6347|279.40|eposits. slyly regular epitaphs wake. blithely express asymptotes across the platelets haggle slyly above the special theodolites. even, bold sentiments alongside of the regular, pending theodolite +1365|80|753|871.48| blithely even accounts above the quickly silent requests haggle quickly unusual, s +1366|67|3791|732.85|lyly bold instructions are slyly with the blithely regular theodolites. fluffily silent deposits by the pinto beans affix fluffily blithely express asymptotes. bold platelets beside the slyly f +1366|5|8413|461.41|eposits. ironic deposits detect. ruthlessly regular theodolites are slyly. unusual, ironic patterns haggle quickly express do +1366|43|8556|929.31|s. silent platelets according to the slyly even packages sleep alongside of the special courts. fluffily even packages +1366|81|6354|628.59| quickly ironic instructions; furiously final frets use. slyly idle packages across the carefully ironic requests wake after the furiously pending dependencies. orbits use. +1367|68|8335|512.39|ar theodolites. regular requests wake after the slyly unusual foxes. fluffily express dolphins across the furiously +1367|6|9326|551.93| regular dolphins. furiously unusual requests cajole around the +1367|44|7401|723.25|onic patterns sleep quickly. silently ironic packages after the regular, special foxes impress carefully regular deposits. special foxes against the blithely even +1367|82|2894|951.21| blithely pending hockey players. carefully regular theodolites are slyly. quickly regular excuses x-ray carefully slyly regular requests. slyly express excuses wake furiously alongside of the sile +1368|69|4059|27.57| the slyly regular hockey players try to wake blithely special accounts. slyly unusual theodolites nag daringly fluffily ironic foxes. even, even requests nag fluffi +1368|7|9775|36.72|eas alongside of the always bold packages detect across the slyly pending theodolites. blithely regular accounts should sle +1368|45|737|72.52|ronic instructions nag foxes. special notornis wake slyly among the furiously silent foxes. carefully ironic requests affix +1368|83|52|385.61|s cajole furiously at the carefully bold accounts. unusual somas are quickly with the sometimes pending ideas. pending, special pinto beans with the sp +1369|70|9597|608.15|s sleep. slyly express deposits x-ray. final foxes wake quickly unusual foxes. regular, special requests boost busily. final theodolites sleep boldly above the special instructions. regular requests +1369|8|4117|601.18|ke blithely furiously even instructions. carefully regular deposits haggle quickly sl +1369|46|9187|301.39|asymptotes. fluffily final packages cajole after the silent somas. fluffily pending accounts according to the special pearls maintain slyly blithely sile +1369|84|5711|713.70|thely pending pinto beans are somas. carefully regular dependencies boost against the slyly stealthy accounts. +1370|71|7725|243.75|r ironic theodolites. even, ironic instructions haggle about the close braids. slyly regular pinto beans wake slyly according to th +1370|9|2323|961.19| regular requests boost blithely express requests. quickly silent requests over the unusual instructions use blithely slyly special packages. blit +1370|47|4702|30.16|yly ironic courts. slyly even accounts are carefully for the furiously express platelets. quickly final deposits boost ironic, even theodolites. carefully final asymptotes +1370|85|6906|660.85|sits after the regular ideas wake furiously even foxes? carefully blithe pinto beans sleep quickly around the pending platelets. carefully bold dependencies +1371|72|2394|174.25|to beans. accounts affix slyly final, final requests! slyly even requests use carefully ironic platelets. furiously silent epitaphs sleep fluffily to +1371|10|7993|854.64|al deposits nag enticingly among the furiously sly ideas. fluffily even instructions haggle blithely after the bold pinto beans? quiet excuse +1371|48|3703|466.44|ly regular accounts. slyly even packages wake across the quickly express deposits. quickly slow instructions boost according to the regula +1371|86|6788|541.82|n requests will wake. regularly pending deposits against the pending platelets +1372|73|3384|570.78|as across the final packages sleep blithely carefully bold ideas. furiously final ideas sleep quickly after the carefull +1372|11|9378|791.61| boost carefully. carefully quiet requests wake along the bold, final p +1372|49|7493|54.02|. express platelets nag silently alongside of the regular, expr +1372|87|4716|37.58|equests. pending dependencies nag blithely even, ironic accounts. bold requests cajole regular, regula +1373|74|6867|529.53|dolites. ruthlessly even ideas detect. slyly final foxes across the quickly regular somas sleep furiously across the furiously bold accounts; exp +1373|12|4862|852.74| in place of the final packages nag slyly according to the sometimes ironic platelets. quickly unusu +1373|50|723|429.89|hily even dependencies nag slyly. ironic, daring pinto bean +1373|88|2558|523.71|ideas. packages nag slyly express instructions. permanently quick ideas boost regul +1374|75|5955|899.29|ntly express deposits grow furiously express notornis. final Tiresias across the final asymptotes thrash carefully quickly even accounts. brave, ironic requests sleep. blithely special pinto +1374|13|3933|544.79|refully special packages. quickly ironic platelets use daringly after the slyly final packages? quickly ironic pinto beans nag furiously. bold deposits cajole fluffily along t +1374|51|3339|586.82|unts poach. quickly even requests wake. carefully pending accounts cajole. blithely unusual ideas cajole pinto beans. blithely even +1374|89|4062|781.22|along the even, regular pinto beans. bold accounts will use carefully after the bold accounts. ideas cajole among the packages. special, even requests are across the deposits. p +1375|76|5528|297.99|ckly about the pending accounts. daring foxes print carefully. carefully express theodolites cajole quickly silent asymptotes. blithely final requests against the furiously unusual foxes are car +1375|14|9330|480.38|foxes shall nag slyly according to the unusual instructions. slyly special packages after the slyly pending deposits cajole among the quickly regular requests; asymptotes cajole thinly f +1375|52|1210|973.66|ully around the dogged, regular asymptotes. special +1375|90|3682|733.47|furiously express grouches are slyly across the even, special deposits. packages x-ray about +1376|77|6059|975.68|y bold requests boost regular foxes. unusual pinto beans unwind after the blithely regular accounts. blithely regular frets eat carefully. quickly ironic ideas nag furi +1376|15|2402|737.10|quickly blithely regular instructions. carefully even packages boost regular deposits. carefully even packages haggl +1376|53|8067|912.31| beans about the enticingly even accounts are boldly across the express foxes. ironic accounts about the carefully slow theodolites kindle furiously aft +1376|91|4071|716.33|kly above the blithely bold packages. blithely final packages boost carefully regular accounts. blithely unusual accounts cajole blithely across the slyl +1377|78|2319|532.02|sly special ideas use slyly quickly regular accounts. quickly final foxes cajole after the pending, special packages. requests are qu +1377|16|25|703.86|lithely along the evenly ironic deposits. furiously ironic instructions snooze. +1377|54|6216|675.63| accounts? slyly final accounts are across the final deposits. slyly final packages according to the excuses print furiously regular ideas. +1377|92|5311|847.06|s. blithely ironic deposits x-ray. special dolphins before the re +1378|79|3097|832.95|above the carefully final courts. final packages use furiously. carefully pe +1378|17|1915|585.87|blithely ironic tithes. furiously regular packages sleep slyly across the ironic packages. blithely even packages about the regular theodolites are blithely slyly ironic packages. special deposits +1378|55|2973|727.39|at slyly final packages. enticingly pending excuses across the sometimes final dependencies sleep evenly above the express dep +1378|93|5417|620.51|requests against the blithely unusual deposits wake furiously furiously special platelets. ironically unusual accounts detect blithely. finally unusu +1379|80|1967|529.54|ve the carefully special asymptotes cajole alongside of the ironic packages. closely express courts alongside of the furiously permanent acc +1379|18|1013|139.48|ronic deposits affix busily. final, final courts haggle blithely about the ironic theodolites. slyly ruthless accounts hag +1379|56|8775|741.12|nusual requests are unusual, regular requests. fluffily silent accounts use fluffily +1379|94|5919|631.31|as integrate final ideas. foxes at the slyly silent excuses haggle car +1380|81|3694|186.36|ly even foxes boost. final packages cajole furiously. slyly final deposits are against the pending foxes. blithely even accounts detect carefully. permanent packages according to the quickly e +1380|19|7131|588.97|furiously regular instructions. express platelets will have to sublate quickl +1380|57|4123|887.91|ic, ironic excuses. pinto beans wake against the pinto beans. final, express instructions cajole blithely carefully final instructions. blithely regular theodolites pri +1380|95|8398|121.47|e slyly even ideas. bold, even packages solve. carefully ironic deposit +1381|82|7113|766.33|beans. furiously final theodolites haggle. blithely bold platelets boost against the pending, exp +1381|20|3704|725.88|dolphins sleep silently foxes. pending ideas haggle across the blithely unusual pinto beans. sly dugouts believe carefully pending theodolites. ironic req +1381|58|9893|195.70|to cajole. dolphins to the packages detect furiously furiously regu +1381|96|9242|584.05|ages are blithely. final, pending deposits cajole blithely against the platelets. packages haggle. furiously ironic requests above the pending notornis wake among the fluffily even wat +1382|83|7411|86.71|he carefully ironic deposits. epitaphs solve slyly regular asymptotes. blithely final deposits cajole furiously. final, pending theodolites lose carefully regular requests. furiously +1382|21|4413|28.30|inal pinto beans use. quickly ironic dolphins shall have to detect blithely. +1382|59|154|419.73|structions hang around the regular, regular packages. even, ironic requests breach across the furiously bold excuses. quickly express instructions affix above the fin +1382|97|8177|578.84|old dugouts cajole quickly after the quickly even packages. fluffily regular foxes dazzle slyly despite the slyly pending instructions. carefully bold packages sleep carefully +1383|84|9977|485.03|gular platelets solve furiously above the slyly pending pinto beans. patterns nag after the even packages. final requests use carefully across the unusual, pending asymptot +1383|22|5140|200.89|nusual foxes; slyly even realms sleep final, regular requests. furiou +1383|60|1408|21.89|l accounts-- furiously final platelets are across the qu +1383|98|6322|539.15|lyly special accounts. regular deposits wake carefully even deposits. deposits wake regular deposits. regular platele +1384|85|8766|716.32|ular accounts. furiously silent instructions haggle. blithely ironic ideas play blithely furiously idle requests. even foxes boost silently along the final packages. blithely bold frays haggle +1384|23|4353|445.92| express platelets snooze furiously fluffily even courts. permanently regular requests across the ironic packages sleep forges. blithely unusual instructions +1384|61|9956|210.22|unts-- pending requests past the silent deposits affix carefully blithely final packages. dogged packages are within the furiously final packages. slowly final instructions affix. bl +1384|99|9312|949.55|osits. accounts print slyly after the furiously ironic sauternes. bl +1385|86|8769|192.45|s should boost about the carefully special ideas. furiously pending asymptotes haggle evenly around the carefully re +1385|24|2120|999.97|ts haggle blithely about the pending, regular ideas! e +1385|62|894|407.49|ze instructions. furiously regular deposits haggle against the unusual ideas. bold packages sleep-- bold accounts wake slyly final package +1385|100|2644|672.13|at fluffily. foxes are carefully according to the unusual theodolites. ironic theodolites alongside +1386|87|2086|961.91|p. slyly special packages affix carefully. slyly unusual platelets af +1386|25|9720|117.93|nstructions x-ray furiously quickly final deposits-- carefully u +1386|63|6165|301.14| carefully even instructions serve. blithely regular accounts haggle slyly furiousl +1386|1|2720|616.37| tithes wake quickly. carefully silent accounts across the fluffily express ideas run finally requests. evenly ironic accounts will print across +1387|88|6870|818.03|y final somas. unusual, silent requests wake. even theodolites poach furiously. even deposits across the unusual, expr +1387|26|836|595.57|ns above the ironic pearls cajole after the final deposits. carefully furious deposits maintain against the quickly busy accounts. unusual, regular pinto beans boost furio +1387|64|9205|880.60| slyly regular instructions haggle unusual, even deposits. +1387|2|2235|169.10|sleep fluffily furiously permanent requests. quickly final accounts are slyly final accounts. slyly final deposits x-ray quickly. pi +1388|89|666|63.00|nts. forges sleep fluffily along the fluffily final deposits. blithely regular requests about the special, b +1388|27|2533|70.00|ructions boost slyly pending deposits. blithely ironic foxes according to the final, re +1388|65|8718|953.23|tions. escapades sleep carefully. express dolphins are carefully ironic, special foxes. busily final foxes detect. slyly ironic packages run about the regularly pending instruc +1388|3|6839|22.72| accounts haggle about the regular orbits. blithely ironic requests cajole along the regular pinto beans. blithe +1389|90|169|517.39|ain fluffily slyly regular courts. ironic, even deposits haggle idly inside the silently final accounts. deposits sleep according to the slyly pending requests. express pi +1389|28|9828|730.52|nts wake regular, regular requests. blithely pending platelets boost furiously. carefully regular accounts haggle thinly ev +1389|66|9647|286.94|unusual deposits. unusual packages about the quickly special platelets sleep furiously silent foxes; requests ab +1389|4|8431|608.75|ess platelets about the carefully bold accounts nag blithely carefully quick foxes +1390|91|8071|612.13| beans. carefully ironic requests was. doggedly silent +1390|29|7205|495.22| thrash. ironic, bold dolphins hinder fluffily. Tiresias mold quickly furiously unusual requests. courts use carefully against the final platelets. furiously +1390|67|3979|660.74|iously about the fluffily express packages. carefully even ideas cajole furiously. express pinto beans use among the quickly bold requests. slyly final deposits wake quick +1390|5|2150|304.23|. slyly express theodolites cajole furiously slyly +1391|92|4273|583.49|gular foxes detect. patterns at the blithely even deposits integrate after the furiously express pinto beans. carefully pending theodolites sleep. slowly +1391|30|2717|731.39| closely regular theodolites; special pinto beans haggle thinly carefull +1391|68|7440|934.61|yly regular ideas. accounts are above the furiously regular escapades. slyly regular pinto beans hang fluffily. quickly bold ideas boost among the enticingly +1391|6|2366|756.69|yly. silent foxes grow furiously alongside of the final ideas. blithely regular courts +1392|93|2448|625.06|ts. slyly unusual theodolites against the even dependencies +1392|31|7250|60.22|nstructions above the ironic ideas hang quickly after the deposits. fluffily ironic pin +1392|69|1314|321.42|e fluffily from the blithely final requests. final deposits detect slyly among the unusual, final instructions. doggedly slow requests haggle furiou +1392|7|3242|673.51| blithely ironic platelets integrate ironic ideas: carefully bold ideas haggle slyly express deposits. busily final accounts sleep during the express, special ideas. escapades snoo +1393|94|7154|157.34|ages affix. regular, bold packages affix fluffily furiously final foxes. unusual packages haggle furiously special pinto beans. qui +1393|32|3793|346.61| theodolites nag regular, even packages. regular instructions detect carefully according to the slyly regular deposits. ironically even depe +1393|70|687|525.26|theodolites haggle above the slyly final foxes. carefully even requests above the dol +1393|8|2518|996.77|quickly slyly fluffy theodolites. furiously silent multipliers haggle stealthily daring platelet +1394|95|237|507.03|es. idly regular requests toward the sometimes unusual +1394|33|9673|426.21|ndencies cajole carefully carefully pending accounts. slyly special courts boost. carefully quick pinto beans about the furiously express accounts cajole slyly according +1394|71|6996|751.66|c, silent asymptotes promise fluffily blithely bold deposits. s +1394|9|8743|944.20|tructions could cajole quickly across the slyly slow instructions. regular, bold requests alongside of the pending deposi +1395|96|4192|214.60|nal deposits. furiously even deposits along the even, bold pinto beans haggle furiously ironic ideas. even acc +1395|34|3451|539.98|s. regular theodolites promise slyly among the idle accounts. quickly permanent accounts promise. special accounts are furiously according to the silent deposits. quickly express +1395|72|9262|652.48|nto beans. carefully silent accounts snooze quickly furiously pending asymptotes! furiously ironic frets doze carefully; ironic warhorses doubt blithely ab +1395|10|2975|392.27|ily dogged theodolites? sheaves wake furiously pending foxes. regular, special ideas sleep fluffi +1396|97|3879|627.22|ilent excuses. carefully pending theodolites use quickly permanently even packages. final, silent requests n +1396|35|4173|435.32|boost. ironic requests detect furiously across the fluffily final excuses +1396|73|9579|967.89|ously final theodolites alongside of the ironic, ironic asymptotes are furiously express packages. regular, even theodolites are. blithely express requests above the silent excuses sleep bli +1396|11|9359|646.09|cajole blithely pending, ironic deposits. slyly regular requests nag idly along the quickly even accounts. ironic excuses according to the fluffily special somas affix carefully a +1397|98|7971|826.34|ously express accounts haggle quickly after the furiously even ide +1397|36|8254|240.43| haggle bold, express pearls. carefully special foxes are blithely. carefully final ideas use sl +1397|74|7077|221.37|ieve quickly quickly express foxes. blithely bold requests imp +1397|12|8634|435.01|inst the furiously pending pinto beans use furiously blithely special pinto beans. carefully +1398|99|4347|726.52|ckly regular requests impress carefully. accounts haggle carefull +1398|37|372|54.59|ons after the final, bold accounts use slyly theodolites-- carefully bold foxes are slyly furiously +1398|75|6458|740.35|uriously express foxes are furiously during the regular platelets. carefully unusual deposits sleep slyly idly idle packages? Tiresias wake carefully against the express, unusual cour +1398|13|2188|735.19|nic, bold deposits wake furiously. stealthy dolphins cajole fluffily carefully final escapades. quickly express asymptotes haggle furiously. quickly express dependenci +1399|100|7314|822.25|ies haggle blithely furious deposits. carefully slow requests boost blithely regular instructions. final instructions above the blithely even frays wake quickly slyly final requests. ironic theod +1399|38|4097|585.25|ffily careful, ironic ideas. carefully even ideas are across the furiously bold deposits. qui +1399|76|9321|253.91|lar dependencies hang above the express accounts. regular packages according to the unusual requests wake along th +1399|14|9923|913.73|s cajole. blithely special dependencies along the slyly final instructions boost final deposits. slowly silent excuses slee +1400|1|7460|482.95|s across the regular deposits integrate blithely quickly regular deposits: slyly regular packages affix slyly even fo +1400|39|944|254.31|es unwind along the slyly final pinto beans. furiously pending deposits boost furiously. furiously final requests wake furiously furiously ironic deposits. unusual accou +1400|77|3170|675.03|gular, regular requests. final platelets haggle after the ironic deposits. quickly regular theodolites doze fluffily for the blithely expres +1400|15|2210|741.73|s packages run blithely according to the deposits. fluffily special deposits after the unusual accounts wake bli +1401|2|5122|846.28|ickly about the special requests. packages wake thinly notornis. carefully final foxes sleep among the fluffily express instructions. fluffily express multipliers sleep +1401|41|5303|726.90| slowly pending ideas are after the blithely ironic dependencies. slyly even foxes wake daringly along the deposits. pending pinto beans are over the even, ironic deposits. pending +1401|80|4600|301.52|sts are pending, ironic ideas. quickly special requests affix fluffily final, ironic depths. +1401|19|6109|964.92|ly among the furiously ironic depths. final ideas sleep carefully slyly silent packages. even platelets across the bold, regular packages cajole courts. furiously ironic instructions use +1402|3|1878|771.04|ironic deposits. idly regular deposits nag idly among the fluffily thin pinto beans. blithely ironic instructions wake furiously furiou +1402|42|9053|989.04|yly regular, final requests. slyly even requests use; blithely unusual package +1402|81|2424|582.26|cial deposits. carefully even packages cajole above the accounts. furiously special ideas after the carefully regular accounts sleep furiously even grouches. ironic requests kindle final, speci +1402|20|5233|74.76|y ironic realms integrate blithely about the quickly regular platelets. pending, express asymptotes are. furiously express notornis det +1403|4|5804|914.33|play blithely fluffily regular requests. quickly ironic depo +1403|43|1988|556.04|es. slyly even requests alongside of the fluffily special packages wake blithely ironic, silent theodolites. silent, ironic theodolites kindle. blithely unusual requests use +1403|82|2069|910.02|efully regular requests boost blithely about the blithely regular asymptotes. furiously regular dependencies detect furiously across the unus +1403|21|3126|173.62| beans. regular, pending theodolites hang furiously slyly pending depend +1404|5|7593|154.11|olites use. blithely express packages are blithely. even, ironic sentiments use. pending, unusual pains cajole blithely? even, express pinto beans wake blithely amon +1404|44|306|902.15|accounts-- dogged, pending dolphins are fluffily unusual instructions. special, express packages nag. special pinto bea +1404|83|5959|716.45|s along the special dinos x-ray carefully against the quickly regular accounts. furious, express deposits alongside of the carefully express accounts integrate about the slyly r +1404|22|816|485.98|ts wake carefully! furiously unusual asymptotes affix quickly after the quickly pending pinto beans. pending gifts dazzle r +1405|6|8969|165.50| carefully. silent asymptotes will have to affix furiously. slyly express accounts about the silent requests haggle fluffily quickly final foxes +1405|45|6024|589.25|ain quickly. unusual, ironic deposits nag blithely carefully special packages. carefully ironic pinto beans use quickly. furiously bold deposits alongside of the regular inst +1405|84|7825|522.01|haggle furiously furiously ironic accounts. carefully ironic deposits boost carefully deposits. +1405|23|1589|436.30|final deposits sleep above the blithely ironic escapades. pinto beans sleep along the carefully +1406|7|2624|498.50|nst the blithely even accounts. ruthlessly brave deposits wake bold foxes. carefully unusual packages cajole enticingly after the ironic pinto beans. regular grouches boo +1406|46|7563|792.12|doggedly final pinto beans. final, pending packages haggle along the carefully express accounts. never ironic excuses sleep blithely. theodolites affix quickly +1406|85|8156|627.99|c, final packages cajole fluffily furiously quick deposits. final accounts haggle +1406|24|3626|311.85|grow furiously quickly regular dependencies. slyly final excuses nag. blithely ironic pearls sleep furiously. unusual deposits boos +1407|8|6617|697.94| final excuses cajole furiously; foxes across the carefully regular ideas print after the sometimes fluffy deposits. furiously final accounts are furiously furious asymptotes. +1407|47|6125|103.42|the excuses. ruthlessly even courts haggle always alongside of t +1407|86|752|84.47|es cajole slyly ironic requests. carefully final instructions sleep about the ironic accounts. packages are bravely after the quickly ironic foxes. b +1407|25|3680|332.60|aring packages? requests according to the fluffily ironic accounts wake furiously regular accounts; quickly regular accounts haggle furiously. regular, e +1408|9|2559|792.74|ites above the blithely pending requests haggle s +1408|48|7752|13.66|counts. accounts wake blithely. blithely ironic reques +1408|87|5009|12.44|carefully express ideas sleep blithely against the regular, regular theodolites. regular orbits sleep blithely. slyly special pi +1408|26|322|579.44|furiously even somas. furiously ironic dolphins wake furiously around the finally unusual deposits. regularly unusual packages after the accounts unwind slyly re +1409|10|133|639.74|dolphins. fluffily final ideas sleep slyly even theodolites. slyly bold deposits along the carefully sly pac +1409|49|8885|979.46|eodolites: blithely bold foxes haggle quickly against the bold theodolites. requests sleep blithely. quickly special deposits sleep blithely furiously pending packages. regular platelets haggl +1409|88|2360|283.68|requests haggle blithely ironic excuses. deposits kindle carefully idle instructions. +1409|27|2653|799.41|ts. quickly final instructions cajole? blithely slow deposits detect slyly. foxes after the slyly bold dependencies use regular, express instructions? b +1410|11|1022|329.83|side the even, even instructions. packages nag carefully. carefully busy instructions according to the requests unwind whithout the pending instructions. slyly iron +1410|50|2514|150.69|onic packages. furiously slow pinto beans among the slyly special courts wake never ironic, regular requests. fluffily even dependencies use carefully. carefully ev +1410|89|7890|493.33|ing to the furiously enticing decoys haggle furiously never silent grou +1410|28|145|818.25|efully permanent excuses. furiously regular excuses on the special theodolites dazzle alo +1411|12|2070|185.66|ronic, express realms are-- asymptotes along the courts wake carefully deposits. bold, ironic deposits are sometimes regular dependencies. furiously final pinto beans dete +1411|51|1962|791.82|ess requests. furiously silent deposits will haggle f +1411|90|7781|639.34|arefully bold theodolites wake regularly above the slyly sile +1411|29|1008|284.18|ccounts according to the unusual, regular accounts hinder alongside of the silent pinto beans. slyly even ideas nag furious +1412|13|4476|287.50|blithely furiously regular ideas. furiously special attainments haggle carefully above the instructi +1412|52|8995|88.24|ts. unusual depths cajole enticingly according to the slyly ironic instructions. quickly even accounts cajole alongside of the slyly ironic foxes. packages impress among th +1412|91|9418|787.90|ly regular deposits around the bold requests are quickly about the boldly +1412|30|5206|681.46|xes. carefully careful accounts boost carefully. unusual platelets haggle alongside of the quickly bold foxes. fluffily +1413|14|2395|895.64|usly final ideas. quickly regular deposits need to are. packages after the blithely final packages affix caref +1413|53|6746|138.89|riously final dependencies cajole blithely final packages. always bold reque +1413|92|4027|972.26|ely about the regular instructions. even foxes cajole. slyly silent multipliers cajole quickly about the blithely regular theodolites. furiously final d +1413|31|7813|242.21|dependencies from the furiously regular depths wake slyly carefully final foxes. slyly silent instructions grow. fluffily regular deposits integrate against the blithe deposits. slyly unu +1414|15|4138|47.10| wake slyly. carefully ironic accounts run quickly for the pending, final deposits. carefully ironic +1414|54|3612|712.33|es haggle furiously blithely bold instructions. regular, final hockey players sleep: blithely regular theodolites against the special, express deposits boost furiously daringly bold deposi +1414|93|9978|338.50|ents sleep quickly pending, express excuses. slyly unusual packages among the unusual, express ideas cajole about the fluffily final realms. furiously fin +1414|32|9261|52.89|e final, final theodolites. unusual deposits sleep blithely special dinos. carefully permanent theodolites across the carefully silent sheaves a +1415|16|8192|135.38|te the regular, express requests. idly final platelets alongside of the final, regular platelets wak +1415|55|566|830.99|uffily-- quickly ironic braids use furiously against the quickly +1415|94|7064|479.84|s. fluffily bold packages wake blithely throughout the fluffily ironic ideas. regular gifts wake. furiously special instruct +1415|33|9556|886.51|, thin deposits print slyly around the quickly regular foxes. bold accounts sleep carefully ironic, final frays. +1416|17|9912|681.56|y bold dependencies at the even packages poach slyly carefully even requests. blithely even deposits are. regular dependencies affix slyly. blithely expres +1416|56|6618|614.01|eas. unusual, slow sauternes boost. blithely regular packages wake +1416|95|2265|234.82| slyly regular packages. quickly pending accounts after the blithely unusual requests boost quickly sil +1416|34|4555|742.05|ely ironic packages. regular pinto beans boost. blithely final pinto beans run carefully requests. regularly pending deposits +1417|18|756|329.63|gle slyly. slyly ironic asymptotes among the slow, even pinto beans sleep quietly against the pinto bea +1417|57|3793|839.65|r accounts nod against the regular pinto beans. even foxes wake blithely about the carefully final theodolites. furiously quick ideas t +1417|96|6987|166.17|iously special excuses. packages after the stealthily ironic accounts integrate carefully across the silent, final accou +1417|35|3591|901.40|xcuses. special, final requests after the quickly regular asymptotes haggle regular, silent accounts. foxes boost quickly according to the asymptotes. +1418|19|8081|187.46|old requests against the brave, final requests haggle even, silent foxes +1418|58|8894|37.56|e carefully even courts: quickly regular packages cajole quickly after the carefully +1418|97|7898|159.02|nag requests. furiously final theodolites are furiously closely ironic pinto +1418|36|2785|540.34|ular excuses wake carefully among the slowly even ideas +1419|20|9812|804.51|regular asymptotes wake. dolphins are final packages. furiously unusual deposits boost blithely pending pinto beans! final instructions through the furiously unusual +1419|59|7434|11.76|y unusual instructions nag? pending accounts are slyly. regular tithes are slyly. pending packages along the carefully unusual deposits hag +1419|98|799|126.21|sly even platelets. regular, express theodolites integrate blithely alongside of the ironic requests. requests cajole foxes. slyl +1419|37|4225|506.90|regular packages along the silent theodolites sleep blithely special packages. carefully express excuses against the furiously unusual instructions wake blith +1420|21|1401|236.90|d, special foxes. accounts above the special requests breach thinly furiously blithe instructions. pending dinos across the quickly even accounts wake fluffily iro +1420|60|6294|740.06|en packages print stealthily. carefully pending requests wake blithely quickly final pinto beans. slyly unusual ideas run furiously e +1420|99|9779|799.41|detect across the blithely final courts. quickly express theodolites cajole careful +1420|38|3366|253.65|. slyly even ideas wake furiously above the fluffily thin pinto beans. bold packages cajole quickly. regular accounts cajole quickly ironi +1421|22|9933|577.60|sts impress about the express asymptotes. ironic frays nag ironic dugouts. even, final requests slee +1421|61|9879|630.54|efully blithely regular dolphins. unusual packages promise after the silent requests. special instructions +1421|100|9446|190.63|osits play blithely. regular excuses sleep above the slyly regular ideas. furiously even requ +1421|39|6444|434.22|y closely regular requests. express requests whithout t +1422|23|2288|472.79|special dolphins wake through the blithely unusual packages. qu +1422|62|5056|284.00|requests. blithely even packages could have to wake slyly regular accounts. slyly final instru +1422|1|4416|105.43|accounts haggle blithely alongside of the theodolites. furiously dogged accounts according to the fur +1422|40|2899|902.01| quickly even ideas wake even platelets. busily ironic accounts n +1423|24|2409|375.07|aggle. furiously pending instructions boost. unusual, regular asymptotes above the fluffily express epitaphs sleep finally about the final foxes. ideas eat fluffi +1423|63|8518|327.62|ges. quickly ironic instructions haggle stealthily above the blithely +1423|2|8285|8.41|rs. regular deposits unwind except the enticingly final platelets. slyly ironic requests sleep slyly. slowly express packages haggle fluffily. f +1423|41|282|800.36| blithely final accounts. quickly final instructions are fluffily regular theodolites. blithely ruthles +1424|25|8394|302.66|ctions cajole along the furiously unusual packages. blithely r +1424|64|1100|96.42|s. express decoys lose slyly. carefully final theodolites around the closely ironic ideas boost along the regular, express courts. pa +1424|3|4252|373.09|unts cajole furiously special pinto beans! silent escapades thrash furiously. busily final notornis are quickly special theodolites. packages wa +1424|42|758|38.66|the always final deposits. quickly daring theodolites among the furiously i +1425|26|4423|708.91|grate carefully special ideas. carefully regular depths sleep blithely ruthlessl +1425|65|946|719.44|deposits wake furiously. even, ironic multipliers cajole alongside of the furiously unusual foxes. quickly regular accounts wak +1425|4|5505|808.23|d deposits sleep slyly ironic courts. regular deposi +1425|43|9789|569.10|deas haggle quickly. deposits are blithely. furiously final deposits sleep blithely bold foxes. slyly pending packages print carefully blithely pending packages. b +1426|27|1403|604.67| even courts haggle above the blithely final accounts. slyly regular deposits by the blithely permanent accounts sleep slyly among the express asymptotes. carefully even foxe +1426|66|429|80.80|ckages boost slyly ironic deposits. regular ideas dazzle quic +1426|5|9734|643.99|n accounts haggle among the ideas? ruthlessly pending requests affix alongside of the ironic, ironic ideas. even, ironic platelets nag. ideas +1426|44|1315|477.75|furiously after the bold asymptotes. even ideas haggle furiously ironic, ironic w +1427|28|3|746.80|lyly unusual deposits. regular deposits cajole slyly about the blithely special warthogs. furiously regular dolphins integrate across the bold requests. quickly regular +1427|67|6152|220.90|nag slyly quickly pending theodolites? carefully even accounts above the unusual asymptotes +1427|6|3075|609.74|x furiously alongside of the fluffily ironic requests-- ir +1427|45|4361|247.98|ial requests haggle quickly pending pinto beans. final, regular deposits are slyly. blithely even pinto +1428|29|1482|140.38|egular ideas across the quickly pending accounts use sometimes above the slyly ironic packages. carefully pending deposits cajole. express theodolites hagg +1428|68|7088|909.59|thlessly unusual deposits wake across the pending accounts. pinto beans serve carefully. blithely pe +1428|7|3564|806.00|uches; furiously regular packages cajole quickly. enticing, ironic pinto beans detect blithely. quickly regular theo +1428|46|221|108.02|unusual deposits wake silently above the carefully ironic ideas. slyly pending theodolites use. slyly final foxes haggle. express accounts integr +1429|30|8080|590.26|ly regular ideas. regular deposits are fluffily. si +1429|69|3733|512.87|egular requests engage blithely regular ideas. even, regular epitaphs cajole instead of the dependencies. regular, pending accounts are. furious +1429|8|6619|554.26| fluffily atop the instructions. ironic deposits haggle furiously slyly bold deposits. final packages detect slyly. stealthy theodolites will use +1429|47|6411|7.73|foxes. slyly even theodolites after the blithe deposits sleep across the carefully regular accounts. carefully regular deposits doubt slyly about the quickly ironic foxes. furiously +1430|31|7569|304.11|y asymptotes. instructions wake blithely packages. express foxes ha +1430|70|9407|448.64| along the slyly quiet deposits haggle ironic, bold requests. furiously f +1430|9|353|12.72|ts. even, final dolphins integrate around the slyly silent theodolites. ironic forges sleep carefully above the car +1430|48|1124|336.94|lets cajole at the carefully express courts. ironic +1431|32|853|752.61|fluffily ironic accounts affix against the slyly regular requests; unusual, final theodolites haggle carefully. somas haggle furiously. quickly quiet deposits boost fluff +1431|71|1072|919.01|y express instructions. blithely pending theodolites are pending i +1431|10|5896|307.70|ding to the carefully ruthless requests. permanently express instructions +1431|49|6756|831.88|ic pinto beans. carefully silent packages sleep ironic deposits. slyly regular deposits haggle blithely about the foxes. special deposits +1432|33|6001|452.16|ely final foxes nag blithely around the even asymptotes. bold accounts boost carefully according to the carefully even requests. accounts use furiously +1432|72|8092|173.59|he blithe, blithe warhorses haggle carefully bold requests. final requests after the unusual, regular pinto beans use about the furiously ironic waters. final, iron +1432|11|1214|732.37|en dolphins believe furiously at the blithely pending pinto beans. instructions snooze blithely blithely final requests. final foxes are quickly. quickly silent +1432|50|1704|459.59|uriously bold requests haggle after the blithely regular pinto beans. ironic ideas thrash against the carefully pending gifts. quickly regular accounts wake slyly. furiously spec +1433|34|6792|327.63|c, ironic packages cajole final ideas. blithely regular accounts sleep fluffily pending, regular ideas. pending, careful notornis hag +1433|73|2307|146.76| regular accounts. furiously pending packages boost ironic accounts. furiously enticing packages sleep quickly among the furiously regular accounts. ironic accounts sleep carefully against the sl +1433|12|7924|361.96|excuses shall wake across the permanently special dependencies. furiously pending accounts snooze slyly across +1433|51|3282|738.40|lar packages. blithely express pinto beans are final instructions. packages wake stealthily slyly final ideas. ironic foxes are furiously alongside of the carefully ir +1434|35|3964|909.70|uffily. slyly regular packages breach fluffily. permanently final accounts must haggle furiously. bravely final deposits sleep b +1434|74|1568|689.05|eposits. requests wake dogged ideas. regular pinto beans are of the quick requests. accounts sleep furious +1434|13|2888|520.99|ly even accounts. carefully express dolphins use boldly. final ideas nag across the instructions. requests wake blithely bold packages. regular, bold requests wake carefully a +1434|52|5525|163.93|ructions solve above the pinto beans? silent, bold packages cajole. quickly even deposits wake fluffily alongside of the deposits. deposits are slyly bold deposits. final, regular +1435|36|1352|231.09|quickly bold sauternes cajole quickly. quickly express accounts sleep c +1435|75|4806|957.98|he regular accounts wake fluffily along the carefully ironic foxes. furiously ironic pinto beans detect among the carefully regular requests-- requests cajole across the blithely f +1435|14|6339|959.51|ironic deposits cajole carefully about the carefully pending accounts. instructions sleep slyly at the slyly special deposits. furiously even pinto beans are! regular warthogs ac +1435|53|5430|673.87|after the regular ideas snooze carefully dolphins. idly bold accounts above the blithely final accounts haggle accounts. carefully blithe pinto beans wake furi +1436|37|4102|153.43|to beans wake unusual requests. quickly regular excuses cajole fluffily fluffily regular accounts. final pains boost +1436|76|4329|575.85|xes nag. furiously express pinto beans dazzle. express, ironic deposits thrash according to the slyly regular pinto beans. multipliers sleep furiously al +1436|15|2379|231.49|pending pinto beans play furiously furiously unusual requests. +1436|54|7821|750.43|g quickly idly even accounts. carefully even pearls sleep. ironically express deposits about the final, even asymptotes nag after the slyly regular pinto beans. blithely +1437|38|7527|265.78|ithely regular instructions. packages are about the blithely slow deposits. blithely ent +1437|77|8426|598.10|fix blithely. regular packages wake carefully. packages are blithely above the even requests. carefully final packages serve before the pinto beans. carefully silen +1437|16|9735|467.16|refully against the blithely silent theodolites. blithe platelets wake above the closely regular requests. fluffily ironic theodolites along the furiously fina +1437|55|9477|679.78|ic dependencies haggle blithely special packages. never special pinto beans haggle fluffily furiously unusual ideas. furiously ironic foxes among the fluffil +1438|39|9224|683.20|ual deposits grow slyly slyly pending requests. permanently enticing ideas lose blithely even ideas. pinto beans sleep alongside of the furiously regular ins +1438|78|8974|220.90|final excuses run sauternes! regular, regular accounts wake carefully. fluffily ironic deposits wake along the furiously even requests. +1438|17|5744|550.73|structions. slyly pending accounts haggle carefully quickly iron +1438|56|4667|532.01|r final dependencies mold slyly. blithe requests above the closely pending requests kindle according to the foxes. speci +1439|40|2549|586.57|. carefully special excuses among the furiously unusual deposits are furiously among the blithely special accounts. depe +1439|79|9765|477.47|express requests. slyly regular accounts are carefully across the unusual, final asymptotes. carefully final frets wake deposits. carefully final dolphins snooze blith +1439|18|603|12.44|fully bold dependencies-- blithely pending theodolites haggle fluffily. slyly even frays are despite the blithely bold hoc +1439|57|9045|622.53|excuses doze carefully blithely special accounts. furiously regular platelets sleep blit +1440|41|5109|544.58|are ironic, sly packages. bold platelets haggle carefully. blithely ruthless +1440|80|6324|121.24|sts. carefully ironic requests wake carefully. fluffily special requests use fluffily express requests. pendin +1440|19|4641|903.94|ress theodolites. slyly express asymptotes integrate quickly among the carefully +1440|58|1213|879.58|alongside of the quickly even accounts. quickly unusual accounts grow quickly carefully regular pinto beans. regular pinto beans lose? blithely fina +1441|42|6300|14.22|unwind furiously about the ironic courts. unusual deposits wake slyly above the blithely bold theodolites. blithely regular requests according to the slyly final requests sleep furiou +1441|81|3547|413.31|nal accounts. ironic, pending deposits cajole carefully fluffily ironic platelets. idle requests sleep special, regular accounts: final, unusual requests hang slyly around the furious +1441|20|3216|716.56|es: blithely special theodolites detect furiously above the fluffily regular deposits. careful +1441|59|3807|421.13|hs. carefully ironic foxes nag fluffily final, pending pinto beans. bold, regular deposits wake slyly slyly +1442|43|5417|278.12|le blithely around the final, special packages. sheaves about the furiously regular dolphins haggle among the packages. ironic, thin pinto beans sleep about the p +1442|82|3100|272.29|ave deposits. final excuses across the final packages detect furiously enticing foxes. unusual theodolites sleep furiously. +1442|21|1330|143.46|iously ironic dolphins sleep quickly bold packages-- furiously unusual deposits about the bold pinto beans lose furiously express, specia +1442|60|3058|733.76|ess courts. quickly special packages above the furiously final ideas snooze theodolites. blithely final ideas boost carefully after the special orbits; quickly even packages haggl +1443|44|4493|813.88|gular deposits hang finally silently even deposits. carefully unusual deposits mold furiously furiously special deposits. carefully regular requests are furiously. quickly r +1443|83|9068|714.69|ideas detect carefully across the even ideas-- stealthy, even r +1443|22|753|965.49|ccounts across the furiously ironic instructions affix carefully across the quickly regula +1443|61|3513|386.01|ronic, regular packages nag. ironic, pending deposits haggle furiously alongside of the ironic requests. fluffily ironic theodolites sleep near the quickly ironic accounts. +1444|45|8251|320.91|riously regular theodolites. even ideas unwind blithely along the pending, pending deposits. thinly even deposits above the furio +1444|84|7871|142.54|ickly final accounts around the bold requests integrate slyly blithely final packages +1444|23|5347|340.46|instructions wake. regular deposits nag slyly about the blithely pending platelets. fluffily express re +1444|62|9709|7.64|packages boost quickly silent theodolites. final braids wake blithely after the blithely ironic dependencies. regular packages haggle among the final instructions? unusual ideas wake c +1445|46|882|850.72|al dinos detect blithely even, regular braids. carefully pending ideas haggle furiously according to the carefully ironic platelets. slyly pending dependencies wake along the bli +1445|85|293|562.76|al Tiresias use slyly about the slyly ironic platelets. carefully silent dependencies boost carefully according to the final platelets; slowly silent theodolit +1445|24|4903|973.39|cross the regular, unusual pinto beans boost quickly a +1445|63|9190|278.40|encies. regular instructions are. carefully final requests play regular accounts. blithely even deposits wake. blithely ironic excuses nag slyly regular, +1446|47|8452|39.97| carefully against the daringly ironic theodolites. foxes haggle furiously idly unusual theodolites. silent deposits sleep carefully quickly regular requests. busily ironic deposits +1446|86|1149|649.68|ily above the furiously even packages. blithely bold dependencies wake never accounts. packages sleep fluffily bold deposits. expres +1446|25|3249|227.49|e regular ideas. packages cajole slyly along the silent pinto beans. final foxes lose furiously +1446|64|9143|459.39|s are furiously carefully pending requests. slyly even packages haggle daringly. furiously unusual dependencie +1447|48|5404|942.67| accounts nag about the even instructions. quickly brave deposits haggle slyly slyly pending packages. express, unu +1447|87|5507|392.33|gular theodolites nag carefully furiously ironic requ +1447|26|4605|707.75|lithely bold requests dazzle furiously. bold requests nag about the furiously regular ideas. slyly final pearls hag +1447|65|1200|121.12|sits. carefully regular accounts haggle furiously ironic foxes. carefully ironic dependencies sleep about the slyly regular accounts. clos +1448|49|3373|905.99|ly final deposits nag regular ideas. slyly regular packages sleep. blithely ironic foxes integr +1448|88|8606|387.36|ies wake carefully regular excuses. carefully regular accounts are blithely carefully final platelets. carefully pending requests haggle ironic accounts. furiously pending requests cajole caref +1448|27|2354|65.09|ymptotes sleep alongside of the final, pending accounts. bo +1448|66|6512|373.08|ly along the furiously even accounts. quickly ironic accounts are. blithely express theodolites nag ironically around the regular accounts. ironic instructions boost final deposit +1449|50|5538|765.08|odolites wake close instructions. ruthlessly bold ideas above the carefully quiet deposits haggle above the final, ironic foxes. quickly unusual requests engage carefully slyly final deposits. +1449|89|3134|643.99|ns use after the pinto beans-- carefully dogged accounts +1449|28|4801|540.06|ages. ironic packages are fluffily. blithely even theodolites after the unusual, +1449|67|871|971.21| above the platelets. unusual, pending deposits wake slyly against the foxes. slyly pen +1450|51|7585|639.30|fily across the dolphins. platelets haggle even accounts. slyly f +1450|90|2877|592.65|sits unwind furiously even packages. even, ironic requests boost blithely. f +1450|29|4491|869.48| sheaves sleep blithely: quiet, final packages against the pending, final pinto beans x-ray furiously across the furiously regular asymptotes. even, regular instructions promise after the reg +1450|68|3152|26.25|deas wake furiously fluffily ironic deposits. caref +1451|52|9420|808.23|n dependencies haggle. daringly ironic instructions cajole special deposits. express, ironic excuses are blithely ironic, bold deposits. excuses after the slyly regular deposit +1451|91|3821|679.05|e even, ironic accounts. furiously bold dolphins boost; slyly +1451|30|4580|420.77|le. ironic accounts affix slyly. forges wake furiously ironic excuses. slyly regular acco +1451|69|3182|158.37| wake blithely unusual deposits-- slyly bold requests affix c +1452|53|5432|640.80|y even foxes. furiously final ideas cajole carefully. ideas across the blithely even packages wake slyly at the accounts. final, regular theodolites across the ex +1452|92|52|783.11|ily silent accounts along the quickly unusual excuses boos +1452|31|6|969.62|gle blithely furiously final deposits. carefully ironic packages wake. final asymptotes ar +1452|70|9866|808.76|ly careful requests. enticingly unusual pinto beans boost quickly even packages. u +1453|54|1337|484.37|oxes. final decoys are carefully fluffily special theodolites. dugouts detect fluffily. depo +1453|93|556|193.39|rding to the blithely ironic accounts wake silent packages. furiously silent requests sleep ironic, unusual packages. carefully express deposits against the bold, bold requests wak +1453|32|5553|725.99|its after the unusual dolphins sleep blithely above the final packages. final sheaves unwind slyly. d +1453|71|4476|100.10|tions sleep slyly: slyly special pinto beans about the pending, silent packages haggle carefully among the ironic packages. unusual requests was carefully after the furiously unusual forges. even r +1454|55|6667|358.88|refully final theodolites; quickly express foxes nag. special pinto beans could have to cajole. carefully bold requests solve carefully. pending instructions sleep; final requests integ +1454|94|9335|972.83|endencies. carefully special requests haggle around the regular requests. quickly final platelets nag furiously bold packages. thinly final deposits are furiously +1454|33|7323|777.66| deposits. regular, ironic deposits affix quickly. unusual deposits haggle carefully fluffily even dinos. carefully regular i +1454|72|4187|344.01|y special foxes. furiously ironic packages against the slyly pending dinos af +1455|56|1831|727.91|eas cajole final instructions. furiously even accounts wake. bold dolphins might are blithe packages. quickly exp +1455|95|8769|381.15|ggedly express instructions. furiously express ideas among the ironic, dogged packages thrash carefully according to the carefully bold theodolites. sometimes ir +1455|34|3298|563.44|ic ideas. quietly ironic theodolites cajole carefully special, regular asymptotes. slyly ironic accounts along the unusual +1455|73|1277|422.96|e bold, unusual packages. ironic requests sleep quickly above the quickly express deposits. packages detect carefully. quickly ironic accounts print furiously express instructions. permanentl +1456|57|3914|15.11|slyly even dependencies. blithely quiet packages maintain about the evenly even theodo +1456|96|2690|442.09|t the fluffily even frets sleep after the requests. carefully final pinto beans across the bold, ironic deposits are thinly carefu +1456|35|7173|837.18|nts. furiously silent packages across the bold, final theodolites haggle slyly pinto beans. carefully quick accounts nag blithely furious requests. brave platelet +1456|74|6091|697.75|ptotes cajole thinly along the special accounts. final deposits boost alongside of the unus +1457|58|4346|36.39|uriously regular accounts. slyly regular accounts +1457|97|6375|477.21| accounts. blithely regular theodolites boost slyly regular, regular foxes. packages after the slyly ironic packages eat busily express accounts. expres +1457|36|5324|651.36|sits. evenly regular deposits snooze among the ironic dinos. foxes haggle slyly. ironic p +1457|75|8526|475.55|g the idle, final deposits. carefully final deposits nag permanently brave gifts. carefully bold asymptotes haggle slyly +1458|59|802|794.68|regular dependencies use slyly slyly regular deposits. carefully special deposits against the slyly even exc +1458|98|8411|658.35|ts. silent, regular packages nag blithely. bravely special forges unwind regular requests. regular instructions haggle. regular foxes are carefully alongside of the pending requests. express acc +1458|37|7746|171.11| the regular theodolites! bold excuses are furiously slyly +1458|76|2859|987.77|ithely express dependencies. furiously final foxes nag quickly. furiously even packages integrate blithely entic +1459|60|4419|153.20|quests nod slyly. carefully pending deposits mold. slyly express accounts integrate carefully final packages. even, regular packages x-ray quickly furiously pending pinto beans. quickly regu +1459|99|5938|614.98|. silent, regular asymptotes nag. slyly ironic foxes use blithely unusual courts. final packag +1459|38|7945|403.65|arefully according to the carefully special ideas. fl +1459|77|8455|209.06|lar packages. asymptotes whithout the slyly final packages wake furiously according to the foxes. deposits boost. carefully even deposits haggle +1460|61|3989|478.95|ckages. fluffily special accounts wake quickly final pinto beans. carefully regular dependencies sleep slyly blithely ironic accounts. realms sleep blithely alongside of +1460|100|9832|959.33|sits sleep carefully quickly final theodolites. express foxes cajole furiously alongside of the ironic, bold deposits. carefully ironic epitaphs are closely above the ex +1460|39|1369|631.35|al, final foxes. carefully ironic dependencies sleep slyly finally s +1460|78|3875|916.77|gular instructions. ironic, express requests nag alongside of the busil +1461|62|804|717.47|lar deposits are at the furiously special ideas. quietly pending packages affix carefully above the special excuses. regular requests a +1461|1|2879|781.61| even ideas kindle. ironic ideas are furiously. fluffily final deposits print furiously. slyly regular asymptotes dazzle carefully carefully unusual asymptotes. even accounts us +1461|40|6219|757.51|sly final accounts nag accounts! final asymptotes across the slyly special platelets grow after the regular ac +1461|79|6029|349.29|ly bold instructions. blithely final dependencies alongside of the regular foxes nag blit +1462|63|5841|674.16|ual theodolites cajole slyly furiously ironic deposits. carefully regular warthogs detect +1462|2|6869|56.84|ts cajole quickly pending instructions-- slyly even ideas was +1462|41|7633|447.17|ar dolphins affix blithely after the slyly final tithes. blithely final pinto beans haggle fluffily against the regular, even excuses. ideas sleep carefully regular +1462|80|1534|277.46|iously. deposits integrate daringly. carefully special requests haggle furiously blithely pending deposits. pinto beans +1463|64|3836|103.87|ly even packages above the even, even excuses run blithely express ideas. regular, final packages are stealthily around the ironic instructions. ironic asymptotes slee +1463|3|826|799.93| the accounts. special, final packages at the slyly ironic platelets nag fluffily about the even, unusual accounts. daringly even deposits above the unusual depo +1463|42|842|936.55|usly special accounts wake quietly. even requests above the regular, ironic asymptotes eat carefully blithely final ideas. carefully bold theodolites poach carefully blithely silent +1463|81|5519|436.74|s. carefully even deposits was never quickly final deposits; slyly +1464|65|4924|892.20|aintain. quickly slow asymptotes will haggle along the slyly pending frets. carefully ex +1464|4|9334|354.05|s. unusual requests affix fluffily after the furiously ironic depths. slyly unusual frays use fur +1464|43|757|601.45|ise about the slyly unusual deposits. quickly ironic pinto bean +1464|82|9466|820.53|es play quietly across the quickly express instructions. regular id +1465|66|9601|602.62|the unusual, pending deposits. special deposits use blithely carefully ironic req +1465|5|8622|516.60| requests are pending, regular deposits. deposits breach near the blithely even ideas. pending, special packages ca +1465|44|215|285.20|und the pending, ironic notornis sleep blithely alongside of the theodolites. quickly ironic requests wake. regular ideas boost after the furiously ironic accounts. blithely special courts boost +1465|83|2557|314.58|ironic accounts haggle carefully regular packages. quick packages haggle carefully about the even asymptotes. slyly regular de +1466|67|5045|620.36|sly quickly ironic excuses. carefully ironic asymptotes use? fluffy requests +1466|6|6532|16.87|fully bold excuses sleep slyly. regular accounts wake furiousl +1466|45|7263|119.58|ts. slyly ironic pearls nag along the bold accounts. quickly even accounts nag furiously; fur +1466|84|986|27.58|he blithely furious theodolites. fluffily special requests about the blithel +1467|68|9333|277.25|ts should are slyly about the blithely silent theodolites. brave accounts against the slyly final ideas thrash above the c +1467|7|2935|569.01|counts. final packages haggle furiously furiously bold accounts. +1467|46|9285|72.45|s! furiously ironic accounts wake fluffily special packages. fi +1467|85|87|62.70|ges. requests affix blithely. carefully bold instr +1468|69|9093|120.18|y dogged dependencies wake furiously against the ironic, special instructions. quickly regular accounts against the quickly ironic ideas sleep quickly across the silent dolphins. carefu +1468|8|7309|142.99|s are slyly after the quickly special packages. idly final foxes wake furiously fluffy packages. stealthy, ironic instructions sleep blithely about the carefully final instructions. slyl +1468|47|2557|946.99| furiously! carefully ironic theodolites promise careful +1468|86|8185|159.12|l braids after the regular packages nag fluffily after the regular packages. fluffily special accounts cajole. quickly regular deposits wake blithely carefully even requests. fu +1469|70|2346|157.32|pendencies. even foxes use after the blithely silent deposits. furiously ironic packages serve about the instructions. dependencies cajole. special requests believe across the fluffil +1469|9|1643|986.77|unts are furiously. unusual requests wake fluffily furiously express dependencies. quickly express deposits sleep blit +1469|48|9558|335.58|e pending, even pinto beans boost special decoys. even, ironic deposits nag blithely against the fluffily regular packages. carefu +1469|87|3523|979.31|are slyly. furious requests according to the carefully bold accounts cajo +1470|71|3019|841.60|g foxes. final foxes sleep quickly brave requests. regular depos +1470|10|4209|8.73| quickly unusual theodolites. blithely express pinto beans wake carefully until the fluffy ideas. fluffily ironic ideas wake alongside of the quickly ironic accounts-- fluffily special asymptot +1470|49|8373|182.45|slyly final requests about the regular depths sleep according to the +1470|88|9001|737.66| are furiously across the ruthlessly even braids. thin notornis cajole across the deposits. final, regular orbits boost blithely among the carefully stealthy Tiresias. +1471|72|9639|360.54|s solve slyly among the slyly regular deposits. quickly regular packages nag alongside of the busily ironic +1471|11|9150|872.51|after the carefully pending deposits. slyly ironic accounts eat. accounts haggle. express asymptotes alongside of the slyly final packages cajole final, r +1471|50|4541|53.23| permanently bold braids kindle. blithely ironic ideas cajole. doggedly unusual deposits kindle. packages about the deposits haggle quickly across the even dolphins. +1471|89|2910|797.02|ial accounts. express escapades boost around the bo +1472|73|8842|973.65|d dependencies. blithely ironic requests haggle. carefully ironic instructions +1472|12|9900|618.65|bout the pending packages. regular ideas sublate carefully packages. carefully unusual asymptotes are slyly +1472|51|6006|212.48|ngside of the requests sleep quickly above the carefully final accou +1472|90|3872|917.16| ironic, final orbits. deposits sleep carefully carefully express frets. platelets engage regularl +1473|74|6672|177.21|s boost along the furiously final pinto beans. fluffily silent platelets sleep slyly slyly ironic courts. sauternes integrate furiously f +1473|13|722|496.90|ts promise furiously final requests. pinto beans use regularly. unusual +1473|52|1112|897.04|. ironic pinto beans cajole furiously furiously express dolphins. slyly unusual orbits mold above the blithely regular packages. requests wake blithely among the account +1473|91|9008|806.52|the regular accounts. furiously even pinto beans haggle closely fluffily ironic dependencies. +1474|75|6000|868.21|inal dependencies. slyly ironic pinto beans must sleep fluffily. final theodo +1474|14|624|700.19|across the carefully regular foxes. quickly ironic requests above the blithely bold requests affix silently fluffily unusual requests. silent foxes detect furiou +1474|53|6018|932.98|lar instructions. carefully regular deposits cajole carefully packages. silent ideas was. pinto beans sleep furiously ironic packages. express, ex +1474|92|5101|474.47|ecial packages sleep after the furiously express platelets. slyly final instructions sleep fluffily quiet instructions. quickly regular deposits sleep blithely final, silent platelets. carefully i +1475|76|1558|578.70|usly! deposits across the blithely ironic deposits integrate blithely blithely special +1475|15|7859|63.99|lar deposits alongside of the slyly regular deposits boost regular waters. boldly pending ideas detect blithely. blithely special asymptotes nag special requests. furiously special sentim +1475|54|7362|803.26| the quickly even deposits. quickly express pinto beans maintain fluffily. blithely final accounts w +1475|93|9075|2.04|ress theodolites cajole. furiously final accounts sleep blithely among the carefully regular accounts. carefully silent pinto beans wake blithely even +1476|77|154|564.26|side of the furiously special ideas kindle furiously ab +1476|16|5800|131.95|ts nag. furiously special deposits may are quickly thin pinto beans. ca +1476|55|4804|130.86| sleep throughout the busily pending packages-- even, even theodolites wake. sly +1476|94|3327|746.57|es wake blithely. blithely regular deposits must sleep blithel +1477|78|7502|243.45|ing to the quickly special packages wake fluffily along the furiously ruthless ideas. furiously final packages above the special theodolites are along the furiously iro +1477|17|2886|921.65|on the blithely ironic dinos? quickly even asymptotes sleep blithely along the furiously silent req +1477|56|4519|822.22|aggle furiously. final dolphins haggle furiously regular instructions. carefully bold requests haggle. instr +1477|95|7526|15.61|regular dinos print carefully silent requests. theodolites cajole always. furiously express deposits hag +1478|79|6504|804.73|bold deposits. dependencies engage furiously. unusual ideas +1478|18|3184|776.90| unusual realms. carefully final requests about the pinto beans boost slyly slyly express grouches; slyly ironic instructions nag furiously. slyly ironic theodolites use express ideas. fi +1478|57|6077|610.16|t the daringly final sauternes sleep fluffily furiously silent d +1478|96|8099|431.52|y carefully permanent theodolites. slyly blithe theodolites affix carefully. slyly regular pinto beans detect blithely. furiously regular pinto beans haggle bl +1479|80|649|965.30|ully. blithely even dependencies above the carefully bold theodolites mold after the packages. instruc +1479|19|5736|212.65|posits use blithely. slyly pending platelets against the fluffily regular packages believe furiously according to the even waters. quickly final +1479|58|9404|799.65|counts. fluffily final instructions across the slyly even requests wake blithely quickly bold requests. quick +1479|97|4956|229.15|le blithely after the quickly ironic requests. furiously final deposits are furiously. final hockey players haggle quickly special accounts. ironic, ironic packages use slyly regular req +1480|81|2982|381.12|o beans cajole alongside of the dependencies. carefully even dolphins haggle carefully. sly hockey players cajole about the carefully exp +1480|20|373|154.86|counts. slyly final requests haggle quickly regular packages. ironically unusual dependencies use carefully. furiously regular pinto beans haggle across the fluffily pending sauternes. i +1480|59|2881|652.54|instructions nag slyly carefully express accounts. bold, final requests about the quickly express asymptotes haggle furiousl +1480|98|3492|347.46|final pinto beans run carefully. deposits sleep closely across the express theodolites. regular, daring deposits across the instructions are bravely of t +1481|82|4222|761.83|y unusual accounts. furiously final requests along the slyly ironic packages would sleep +1481|21|5739|20.46|tions wake blithely: bold accounts nag across the fluf +1481|60|1431|547.70|ual packages along the quickly unusual asymptotes boost slyly about the idly ironic pinto beans. fluffily unusua +1481|99|8980|625.30|ias. packages are. carefully careful deposits according to the furiously final requests nag slyly final requests. slyly regular platelets wake among the silent ideas. express deposits hagg +1482|83|7141|44.13|eans wake quickly ironic pinto beans. furiously bold accounts haggle fl +1482|22|58|659.07|d deposits are blithely. blithely regular packages nag? furiously ironic +1482|61|9730|229.13|ckly blithely ironic excuses. blithely ironic instructions use carefully. final dinos about the ironic, regular requests slee +1482|100|5631|127.28|kages. blithely ironic packages wake express dependencies. blithely even accounts according to t +1483|84|5661|517.14|e. fluffy hockey players cajole quickly quickly bold packages. blithely special requests use about the slyly unusual epitaphs. quickly unusual sheaves are. requests against the i +1483|23|2888|414.78|sly ironic accounts haggle among the silent packages. blithely ironic dependencies cajole according +1483|62|8253|353.62| above the accounts. requests according to the packages x-ray blithely blithe instructions. slyly ironic pains are slyly about the slyly ironic packages. enticingly +1483|1|6740|408.28|oss the carefully regular packages haggle from the slyly even dolphins. blithely regular pinto beans are. slyly bold packages use furiously final, +1484|85|6377|72.51|accounts are among the blithely quiet pinto beans. ironic deposits use slyly. ironic packages wake blithely around the pending pinto beans; final theodolites wake. furiously blithe depos +1484|24|6361|150.54| deposits. special deposits wake fluffily. quickly unusual deposits a +1484|63|3417|924.24|ymptotes haggle slyly unusual pinto beans. slyly final accounts sleep ironic, regular accounts. bold, ironic requests around the furiously bold pinto beans haggl +1484|2|5464|327.44|hely even requests nag even Tiresias. slyly busy notornis across the final dependencies run quickly along the final instructions. blithely special packages cajole blithely. regular ideas a +1485|86|4553|984.50| deposits are carefully against the blithely regular ideas. unusu +1485|25|1409|67.34|uctions boost about the unusual pinto beans. regular asymptotes are. idly pending gifts after the quickly silent accounts are qui +1485|64|7341|235.82|unts above the stealthily even requests kindle carefully past the carefully ironic instructions. regular pinto beans boost. regular deposits are furiously slyl +1485|3|819|565.20|h quickly pending platelets. ironic instructions use blithely ruthless instructions. slow dolphins are permanently. special accounts cajole across the furiously unusual deposit +1486|87|1086|961.52| pinto beans around the requests wake thinly ironic, express deposits. carefully regular pinto beans are against the +1486|26|3477|614.45|s. carefully regular requests wake after the even pinto bea +1486|65|2307|631.88| impress furiously stealthily ironic requests. quickly ironic instructions cajole within the quick foxes. ironic platelets cajole blithely above t +1486|4|1408|864.67|e never dogged deposits. pending, bold requests would haggle blithely. furiously even orbits among +1487|88|6235|213.47|uriously even packages beyond the carefully express requests cajole furiously carefully special ideas. closely unusual foxes use quickly pending deposits. carefully even multipliers solve furiously. +1487|27|4529|568.66|the furious foxes. carefully ironic packages sleep furiously ironic dolphins. regular ideas haggle carefully pending packages. ironic instructions after the even accounts haggle alongside of the fu +1487|66|4054|160.68|s use carefully carefully special deposits. ironic instructions need to haggle. slyly ironic ins +1487|5|6213|467.87|es haggle slyly according to the even accounts? regular grouches cajole furiously express dependencies. slyly unusual foxes haggle furiously. furiously regular pinto beans haggle slyly slyly +1488|89|2296|617.15|xpress foxes. pending, ironic courts haggle slyly above the slyly even requests. furiously regular sauternes use blithely. blithely special theodolites impress. furiously unusual gifts are +1488|28|2475|930.47| carefully about the unusual packages. fluffily ironic foxes wake. un +1488|67|8831|84.00| the fluffily even packages. blithely final asymptotes above the blithely ironic packages unwind fo +1488|6|945|461.59|hins doubt carefully above the always even deposits. regular theodolites wake carefully against the carefully special packages. packages along the pending instructions cajole against +1489|90|9471|817.63|nding, special dependencies. even requests are slyly slowly even instructions. deposits doze special, final excuses. f +1489|29|4108|807.60|quests impress blithely above the slyly bold foxes. instructions against t +1489|68|3452|78.50|s haggle toward the fluffily regular instructions. blithely silent courts across the express, ironic dependencies use quickly furiously even dol +1489|7|8941|961.61|. bold, ironic accounts affix carefully bold decoys. thin Tiresias cajo +1490|91|3428|14.18|fluffily against the foxes. regular requests cajole blithely. even theodolites cajole carefully. pending theodolites sleep slyly unusual theodolites. special e +1490|30|5905|773.67|tes cajole according to the final pinto beans. quietly final deposits was. carefully unusual asymptotes detect. blithely b +1490|69|5343|184.40|ecial accounts cajole carefully regular pains! quickly express dependencies affix slyly according to the close accounts. carefully even deposits about +1490|8|7470|555.86|y. carefully quiet platelets sleep doggedly? quietly regular requests cajole slyly at the unusual, ironic ideas. blithely even packages boost quickly. sp +1491|92|45|900.13| dugouts. pending ideas around the quickly unusual requests are furiou +1491|31|1188|712.83|refully about the slyly regular instructions. accounts sleep pending accounts. express, ironic requests according to the c +1491|70|6796|680.75|ades integrate blithely. carefully unusual packages use; final, final orbits across the even, express requests sleep across t +1491|9|1097|941.13|otes. carefully ironic foxes are blithely. special foxes are furiously. carefully final platelets play. ruthl +1492|93|4575|428.73|ess accounts? final accounts use quickly slyly silent instructions. +1492|32|6486|67.72|al requests sleep silent, silent ideas. final requests above the even, dogged excuses wake according to the regular, express requests. blithely final foxes wake carefully bold courts. slyly unusual +1492|71|7644|511.43|s cajole slyly regular accounts; express accounts among the slyly unusual packages are blithely along the pending packages. fluffily quick foxes play carefully blithely ironic depos +1492|10|512|402.29| across the quickly busy foxes haggle furiously platelets; special packages nag furiously carefully final packages. even deposits across the daringly even courts wake furiously ironic packages. sil +1493|94|3415|313.98|ideas integrate never! furiously express deposits use enticingly against the even, even excuses? furiously special accounts are. blithely final accounts are. slyly even id +1493|33|6060|568.79|nusual courts. furiously final asymptotes sleep quickly among the deposits. slyly even ideas nod slyly. carefully even deposits should play carefully about the deposits. furiously thin acco +1493|72|9935|352.17|requests try to serve slyly. packages sleep. slyly ironic forges detect carefully carefully final instruction +1493|11|7736|47.41|telets are carefully furiously regular instructions. packages wake across the express, pending accounts. bravely express orbits sleep furiously spe +1494|95|6935|820.16|tes. final packages around the express foxes cajole slyly unusual deposits. carefully final packages haggle blithely according to the pending deposits. regular requests are +1494|34|2281|396.64|arefully. ironic accounts across the slyly ironic packages boost slyly slyly silent package +1494|73|5081|155.56| quickly regular theodolites. blithely regular deposits cajole afte +1494|12|7477|354.31|affix among the unusual packages. furiously ironic requests sleep blithely across the furiously bold dugouts. quick, special ideas integrat +1495|96|5328|98.58|he pending somas cajole after the final pains. pinto beans maintain carefully about the fu +1495|35|1001|725.27|pecial accounts. slyly final requests after the ruthlessly pending waters dete +1495|74|8565|884.60|pendencies are slyly special ideas. silent deposits cajole slowly quickly final escapades. final dependencies wake. ironic, special platelets cajole carefully furiously fin +1495|13|2784|491.27|g to the packages. fluffily ironic ideas haggle slyly carefully dogged dolphins. final escapades accordi +1496|97|3252|168.80|deposits alongside of the even, even accounts sleep furiously furiously unusual requests. carefully bold deposits sleep furiousl +1496|36|6676|96.34|ronic instructions affix alongside of the bold packages. blithely busy asymptotes haggle about the slyly regular deposits. pending theodol +1496|75|1745|58.12|. bold, bold theodolites cajole blithely. regular, ironic excuses breach abo +1496|14|8646|61.04|l ideas wake requests? carefully ironic foxes sleep quickly even theodolites: bold requests cajole. furiously regular theodolites maintain slyly spec +1497|98|1971|190.19|ges wake carefully alongside of the ironic, ironic instructions; carefully regular platelets detect. furiously regular co +1497|37|8428|895.39| slyly express instructions wake above the slyly unusual deposits. furiously ironic deposits was furiously. unusual packages caj +1497|76|1337|12.63|sits sleep unusual packages. quickly ironic requests boost of the regular deposits-- furiously express platel +1497|15|7496|726.01|ly furiously final deposits. special, brave asymptotes dazzle carefully after the ideas. slyly ironic requests against the quickly ironic ideas promise bravely according to the slowly even acco +1498|99|2171|380.78|ular excuses use. pending ideas thrash carefully around the ironically ironic grouches. even pinto beans are sometimes regular packages. carefully final ideas pr +1498|38|8131|433.86|ly final instructions affix. regular theodolites haggle according to the asymptotes; slyly express theod +1498|77|1985|448.81|al deposits wake slyly silent packages. final dependencies boost-- slyly ironic deposits integrate blith +1498|16|9311|858.67|onic foxes nag across the carefully pending requests. excuses cajole +1499|100|7418|155.25|x slyly even requests. blithely ironic deposits mold fluffily. fluffily final pac +1499|39|2565|144.32|nal dependencies detect quickly about the fluffily idle instructions. express, special requests against +1499|78|6458|235.97|s are pending packages. accounts cajole furiously: fluffy, ironic instructions boost even packages. quickly unusual r +1499|17|4633|128.34|il the regular asymptotes. slyly express deposits about the pinto bean +1500|1|4457|484.57|y. platelets wake blithely. furiously express deposits are. slyly ironic asymptotes above +1500|40|4975|554.85| haggle blithely above the special, ironic foxes. instructions alongside of the furiously express foxes haggle blithely alongside of the blithely bold pinto beans. carefully express requests eng +1500|79|3277|782.83| instructions. instructions haggle furiously. fluffily final packages haggle carefully furiousl +1500|18|5097|365.99|s haggle furiously blithely special pinto beans. slyly even theodolites along the furiously even requests are slyly fluffily final frets. deposits haggle fluffily. +1501|2|1552|522.89|pending pinto beans above the carefully thin asymptotes haggle among the furiously unusu +1501|42|5799|140.48|rses cajole slyly about the furious, unusual instructions. fluffily final accounts wake blithely bol +1501|82|3353|696.23|y. final, ironic deposits are carefully. close, even excuses haggle. furiously pending accounts are slyly final account +1501|22|7235|358.89|c theodolites try to boost. slyly regular packages against the furiously even +1502|3|5795|67.70| wake quickly accounts. fluffily pending instructions across the regular instructions sleep slyly unusual deposits. sometimes darin +1502|43|6012|152.50|kages among the regular, even requests sleep furiously accounts. furiously regular excuses alongside of the furiously special accounts wake above +1502|83|9497|896.56|fully even asymptotes. carefully ironic packages boost carefully. furiously final deposits may cajole busily carefully ironic packages. regular requests about the furiously eve +1502|23|6445|740.03|out the special pinto beans. packages wake at the unus +1503|4|823|317.43|ly. slyly regular orbits about the carefully ironic deposits haggle furiously alongside of the carefully ironic foxes. furiously silent de +1503|44|8330|606.35|d haggle carefully ironic dinos. carefully express instructions affix. thin accounts sleep carefully final foxes. regular, even dependencies snooze. pending ideas poach carefully ac +1503|84|9576|287.80|lyly across the bold, even accounts. busily even accounts during the attainments are quickly quickly pending dependencies. furiously pending deposits are care +1503|24|5454|143.64|pending requests cajole at the pending deposits. regular, ironic theodolit +1504|5|410|753.73|g, even excuses wake above the quickly special pinto beans. blithely express excuses wake furiously carefully special foxes. furiously ironic depths sleep carefully final accounts. packages caj +1504|45|5701|694.92|s. ironic instructions are final, silent deposits. express dinos around the blithely express requests wake slyly furiously regular ideas. carefully final asym +1504|85|910|407.49|eposits; fluffily ironic theodolites sleep carefully ev +1504|25|9044|668.14|pecial theodolites. blithely express packages haggle evenly. blithely special deposits doubt furiously furiou +1505|6|7917|877.72|ackages. slyly unusual asymptotes doubt courts. carefully bold +1505|46|3050|758.58|s sleep express packages. ironic ideas wake. furiously pending instructions would us +1505|86|7102|389.49|uests. even requests after the sometimes special pinto beans cajole blithely +1505|26|9505|904.79|to beans with the regular ideas should snooze alongside of the quickly final packages! carefully bold theodolites sleep sl +1506|7|443|149.51|lphins. furiously even deposits boost furiously. slyly ironic requests haggle fluffily even accounts. ca +1506|47|2178|602.81|pending accounts on the carefully even requests sleep blithely across the slyly silent deposits. express requests impress slyly: slyly unusual +1506|87|5952|659.81|cross the slyly pending requests. furiously ironic asymptote +1506|27|3147|727.38|s use according to the special accounts. bold, special accounts after the carefully bold deposits was furiously against the furiously regular requests. carefully furious platelet +1507|8|6518|369.31|silent escapades among the carefully final pinto beans doze carefully according to the ironic ideas. slyly express deposits nag. accounts detect across the quickly iro +1507|48|5378|483.53|fter the blithely ironic instructions hang furiously according to the b +1507|88|8336|51.77|unts. slyly express ideas sleep slyly slyly ironic dolphins. pinto beans sublate carefully. carefully express pinto beans cajole furiously. ironic, even excuse +1507|28|3444|230.19|, unusual accounts. furiously express deposits among the regular, special packages sleep fluffily across the regular deposits. regular packages hinder furiously. quickly final pint +1508|9|2633|885.25| requests sleep furiously. silent dependencies affix furiously according to the fluffily even instruction +1508|49|8662|465.35| accounts dazzle about the slowly final grouches. carefully pending theodolites cajole after the requests +1508|89|7994|139.99|ages. carefully ironic instructions boost blithely according to the carefully final courts. blithely ironic courts are slyly. quickly expr +1508|29|4663|322.84|as hinder after the carefully silent theodolites. deposits after the bold, even packages use frays. final deposits across the express theodolites sleep around the slyly i +1509|10|4938|685.98|d carefully across the silent asymptotes-- slyly regular accounts wake. fluffily blithe instructions are carefully slyly regular packages. slyly +1509|50|8189|952.78|ideas nod furiously final ideas? furiously ironic excuses boost slyly furiously ironic requests. regular deposits do wake permanently according to the furiou +1509|90|2197|571.29| decoys. carefully thin multipliers integrate within the daring packages. carefully dogged asymptotes haggle. slyly unusual courts haggle slyly final, special deposits. express, ironi +1509|30|5388|386.31|its. carefully regular asymptotes are around the unusual pinto beans. sometimes final requests integrate blithely final deposits. slyly e +1510|11|9539|329.66|ounts. slyly pending foxes haggle fluffily unusual, sly requests. slyly iron +1510|51|9088|353.68| epitaphs. slyly sly deposits sleep slyly before the carefully special pinto beans. furiously express deposits cajole. s +1510|91|589|412.51|. regular dolphins cajole quietly along the quickly final deposits. deposits sleep furiously along the special, stealthy deposit +1510|31|996|212.12|oss the thin packages. slyly ironic requests integrate from the carefully regul +1511|12|5184|891.12|ges. regular dependencies wake furiously silent deposits. quickly thin packages affix among the slyly bold fo +1511|52|9934|158.03| haggle slyly except the final packages. furiously bold gifts use idly. furiously unusual requests sleep blithely after the blithely p +1511|92|5009|822.25|ar courts! carefully regular ideas hang blithely. regular dolphins sleep furiously a +1511|32|3829|514.00| packages run blithely about the quickly slow pinto beans. fluffily final foxes are blithely. slyly bo +1512|13|9536|549.75|equests cajole. silent requests cajole carefully. regular, regular requests cajole +1512|53|4271|83.25| even dolphins doubt accounts. furiously regular ideas sleep among the carefull +1512|93|2076|803.98|packages. furiously unusual asymptotes above the carefully even platelets boost carefully silently unusual attainments. carefully special accounts cajole. slyly regular req +1512|33|2230|146.58|aggle carefully slyly express packages. slyly regular deposits haggle blithely. carefully special theodolites nag furiously final accounts. even, +1513|14|4376|300.34|nts; slyly express deposits mold carefully against the quickly unusual foxes. slyly thin ideas above the carefully even packages haggle carefully bold depos +1513|54|9004|24.85| express, ironic accounts use furiously regular deposits. permanent requests boost slyly blithely final ideas. theodolites bre +1513|94|9607|352.60|ly ironic theodolites detect slyly. regular platelets sleep at the slyly daring requests. careful, even orbits sleep blithely. even foxes boost quickly ironic, fin +1513|34|3776|299.17|foxes nod carefully slyly final pinto beans. stealthily thin deposits do boost fluffily nea +1514|15|4313|445.02| accounts. pending packages maintain fluffily ironic requests. ironic packages wake doggedly across the +1514|55|6989|111.34|ckly final pinto beans haggle furiously. carefully ironic deposits wake quickly against +1514|95|1901|330.08|lites breach express, unusual asymptotes. slyly special pinto beans nag slyly. pending, un +1514|35|5253|402.43|nt escapades. express instructions boost slyly. slyly ironic dependencies wake blithely after the deposits. regular asymptotes are according to the idly unusual accounts. carefully regular fo +1515|16|6910|526.68|y bold packages. deposits cajole furiously even foxes. bold requests print carefully. carefully silent requests use. slyly regular ideas can haggle across the regular deposits: carefully silent pa +1515|56|2570|878.08| even requests. blithely regular foxes are blithely: enticing asymptotes de +1515|96|3108|756.62|ckly express, even theodolites. instructions across the furiously express foxes sleep slyly after the fluffily special deposits. furiousl +1515|36|6791|371.89|ironic packages cajole blithely. unusual excuses wake carefully along the sl +1516|17|6750|756.60|ns wake slyly furiously ironic pinto beans. foxes haggle +1516|57|3464|106.86|nal requests. blithely unusual theodolites cajole evenly fluffily bold accounts. closely ironic ideas detect carefully alongside of the silently +1516|97|8391|20.93|lithely regular packages. furiously express excuses cajole blithely final requests. regular pinto beans are. bli +1516|37|3197|353.01|n accounts. slyly even requests sleep. blithely regular dugouts engage against the +1517|18|6173|157.27|he daringly special ideas. accounts cajole around the slyly pending deposits. packages use enticingly. bold asym +1517|58|7486|142.17|s sleep. bold pinto beans poach final, slow packages. requests wake slyly special deposits. deposits across the slyly pending packages cajole slyly above the +1517|98|2906|97.79|ut the carefully regular platelets nag special dependencies! carefully ironic forges are fluff +1517|38|3826|470.49|ckly ironic excuses. permanently regular asymptotes above the furiously silent instructions kindle express packages. ironic +1518|19|772|619.97|ptotes use. ironic ideas cajole blithely ironic somas. slyly silent acc +1518|59|5689|360.33|uriously final requests sleep furiously furiously ironic ideas. unusual, regular platele +1518|99|1285|335.15| blithe, furious requests. carefully ironic excuses sleep furiously among the even, ironic deposits. special, regular accounts affix. special accounts wake quiet +1518|39|8089|789.98|accounts sleep for the quietly regular platelets. blithely final accounts across the pending requests affix blithely furiously ironic ideas. always close braids na +1519|20|2315|678.05|ernes sleep slyly regular notornis. furiously regular asymptotes haggle slyly. slyly regular hockey players sleep carefully slow theodolites. excuses above the depe +1519|60|5489|557.88| wake fluffily. special foxes boost furiously across the slyly reg +1519|100|8990|787.11|uests ought to detect furiously final requests. pending dependencies wake alongside of the carefully final instructions. +1519|40|9796|369.02|ccounts. carefully even deposits haggle finally. quickly regular requests are quickly carefully express packages. ironic +1520|21|8941|539.90|kages. carefully final theodolites wake furiously. pending, final platelets affix carefully special packages. carefully fi +1520|61|3870|418.30| fluffily. ironic asymptotes sleep carefully idle requests. platelets engage carefully. quickly even dependencies nag slyly furiously even requests. even pl +1520|1|6696|594.43|boost quickly. furiously slow requests dazzle slyly regular requests. carefully special +1520|41|9899|777.63|sly pending accounts could are stealthily even, bold packages. slyly express courts use slyly. carefully pending dependencies cajole: ironic escapades wake furiously quietly ironic deposit +1521|22|5583|842.86|into beans. furiously even packages along the carefully silent requests +1521|62|3383|256.07| boost. quickly final deposits hang slyly. slyly final requests haggle across the carefully regular pearls. furiously unusual instructions haggle carefully furious +1521|2|9471|308.76|regular accounts. quickly silent deposits wake dependencies. blithely ironic accounts cajole. grouches haggle fluffily against the blithely unusual deposits. ironic requests sleep finally upon the +1521|42|4029|714.35| the courts sublate furiously furiously final ideas. ironic, regular packages are across the furiously special requests. carefully bold reque +1522|23|4350|302.90|osits. slyly bold requests are furiously across the instructions. special dependencies wake. final deposits sleep blithely alongside o +1522|63|632|195.78|ges. slyly even requests lose furiously across the blithely even packages. silent, regular accounts nag quickly blithely even deposits. re +1522|3|2134|997.44|eodolites. carefully regular attainments sleep. final, ironic foxes do sleep. furiously permanent platelets according to the blithely special requests unwind furiousl +1522|43|9567|861.22|ans-- packages must are quietly pending theodolites. slyly regular requests are furiously. +1523|24|8461|107.26|uffily according to the foxes. carefully even theodolites cajole. carefully bold platelets are fluff +1523|64|5295|731.15|nts poach fluffily above the final requests. quickly pending accounts detect qu +1523|4|5216|848.94|. final frays sleep blithely fluffily pending attainments. instructions haggle +1523|44|449|586.10| ironic ideas nag thin pinto beans. final platelets sleep. silent accounts wake blithely about the unusual deposits! carefully bold ideas nod above the regular requests. final ideas +1524|25|6672|622.22|ns. bold, even requests cajole above the pending accounts. fluffily regular deposits might wake among the regular accounts. ironic id +1524|65|2462|217.34| nag accounts. carefully regular instructions x-ray blithely final asymptotes. ironic requests wake slyly; fina +1524|5|948|717.50|ts haggle blithely final excuses. quickly silent warthogs use against the fluffily final theodolites. carefully express packages breach slyly. furiously silent dependencies +1524|45|2552|249.67|d the regular, pending accounts. blithely regular epitaphs wake carefully carefully even ideas. re +1525|26|7063|562.09|ular instructions. quickly final platelets will breach. pains are after the blithely pending accounts. furiously fina +1525|66|4756|699.68|onic sauternes-- final excuses snooze carefully. special packages use fluffily regul +1525|6|6693|515.90|ctions maintain carefully permanent packages. furiously enticing forges wake fluffily alongside of the slyly regular dependen +1525|46|6730|505.62|eposits are slyly. special, ironic instructions cajole furiously. packages integrate silently about the u +1526|27|6519|630.86|ly pending dependencies nag slyly special packages. unusual pearls are packages. deposits sleep carefully final packages. blithely ironic requests detect carefully. slyly sly packages cajol +1526|67|399|628.39|kly final ideas nag about the final, even requests. unusual grouches cajole requests. instructions cajole carefully. furiously pending requests kindle car +1526|7|176|124.31|he slyly final accounts-- pending, regular deposits integrate slyly. slyly daring sheaves believe among +1526|47|542|608.81|posits nod blithely accounts. permanently final deposits cajole furiously furiously regul +1527|28|6653|621.08|gainst the regular instructions wake blithely deposits. ironic requests wake ironically against the slyly final deposits. slyly ironic requests among +1527|68|6916|84.20|n instructions sleep around the slyly ironic accounts? carefully even accounts are carefully. evenly ironic accounts caj +1527|8|6427|787.54|- slyly regular requests doubt slyly about the slyly pending accounts. quietly express dependencies sleep slyly. even instructions cajole furiously carefully bold packages. fluffily sp +1527|48|1126|561.69|osits. slyly bold accounts above the furiously unusual requests x-ray along the bravely ir +1528|29|763|869.92|aggle quickly fluffily thin pinto beans. carefully ironic packages integrate slyly. slowly regular foxes was finally final theodolites. accounts sleep after the carefully regular ideas. fina +1528|69|4077|511.99|deas. pending, regular excuses cajole slyly. carefully express accounts snooze above the furiously regular escapades +1528|9|2569|832.54|ly about the carefully permanent packages. furiously regular requests against the fluffily +1528|49|9344|638.38|es integrate quickly blithely express requests. furiously pending requests across the carefully ironic courts are about the regular, ironic pinto beans-- accounts +1529|30|6545|159.57|ckages haggle silently along the quickly final instructions. carefully final foxes sleep furiously requests. dep +1529|70|3894|798.24|ular accounts haggle fluffily across the blithely fluffy accounts. express dugouts play blithely final requests. +1529|10|3823|641.93|furiously express dependencies according to the blithely ir +1529|50|1962|793.25|ep evenly blithely ironic requests. unusual instructions use blithely about the carefully silent packages. i +1530|31|8434|547.45|ing foxes wake slyly against the dolphins; slyly bold theodolites are quickly across the regular packages. furiously final realms along the idea +1530|71|689|313.99|y even dolphins are. fluffily even platelets are carefully carefully final epitaphs. bold dolphins use against the express packages? blithely fluffy packages sleep fluffil +1530|11|5263|692.16|gular theodolites alongside of the bravely ironic accounts kindle after the +1530|51|1489|886.40|lly above the regular packages. blithely final packages above the regular deposits cajole furiously carefully final r +1531|32|6817|743.10| deposits detect. blithely regular requests detect slyly bold excuses. somas cajole after the theodolites. ironic, ironic pac +1531|72|1008|860.55| ironic requests after the pending foxes run blithely toward th +1531|12|8891|930.35|pendencies boost carefully-- furiously ironic accounts snooze furiously about the pinto beans. deposits sleep. fina +1531|52|5769|112.60|dolites. furiously special dependencies wake blithely regular foxes. carefully regular asymptotes use. somas sleep express ideas. fluffily final platelets cajole blithely. enticing pinto beans l +1532|33|7501|671.00|r the requests. fluffily bold ideas serve quickly. quickly final requests mold. even requests wake furiously accounts. furiously ironic packages cajole idly pains. final, even requests detect acros +1532|73|1476|904.15| requests. slyly unusual requests cajole. carefully pending requests wake. unu +1532|13|2948|343.63| packages according to the blithely final requests aff +1532|53|5415|404.28|icing packages. ironic pinto beans about the regular packages use about the blithely regular instructions. furiously express foxes cajole blithely final instructions. carefu +1533|34|1305|770.27|lar, regular accounts. special, bold courts haggle furiously. blithely ironic foxes use furiousl +1533|74|1173|39.86|inal ideas engage alongside of the deposits. furiously busy excuses according to the fluffily thin accou +1533|14|1101|897.74|arls boost furiously after the carefully even requests. quickly final ideas integrat +1533|54|813|570.94|ptotes. carefully regular waters kindle furiously slyly final instructions. unusual ideas are carefully. bl +1534|35|201|631.61| wake furiously alongside of the slyly final grouches. even realms wake blithely after the furiously regular packages. slyly even requests dazzle even instructio +1534|75|5920|329.40|fix blithely about the carefully express deposits. furiously final platelets haggle idly. +1534|15|1938|961.46|final accounts nag blithely bold accounts. furiously regular deposits cajole. furiously furious +1534|55|9607|481.84|out the furiously final ideas. slyly ironic pinto beans among the blit +1535|36|5465|641.65|e carefully bold deposits doubt above the regular, regular requests: slyly ironic courts integrate slyly theodolites. blithely silent packages cajole among the caref +1535|76|9375|84.74|nic deposits are idly according to the quickly regular pinto beans. ironic, regular accounts sleep ironically after the carefully express warhorses. fluffi +1535|16|9509|944.55|theodolites. final, special accounts use fluffily slyly bold deposits. slyly even ideas boost slyly ironic requests; express excuses wake quickly final ideas. furiously bold asymptotes poach iron +1535|56|705|35.85|iously about the somas. dependencies boost carefully slyly ironic accounts. fluffily ironic foxes haggle carefully. blithely unusual f +1536|37|3717|321.65|telets. slyly regular courts affix fluffily regular courts. furiously final deposits according to the furiously final courts grow eve +1536|77|3629|512.35|equests. courts nag slyly regular, ironic depths. quickly ironic depos +1536|17|8090|811.02|onic instructions should nag slyly. regular theodolites are after the quickly quiet theodolites. evenly regular ideas boost against the pinto beans. carefully bold accounts acros +1536|57|9634|644.75|according to the slyly ironic packages. quickly slow packages sleep: ironic instructions haggle among the carefully unusual dependencies. slyly ironic accounts are flu +1537|38|6507|242.24|fily final packages sleep quickly regular requests. regular, express accounts might are carefully. doggedly special braids use slyly fluffily qui +1537|78|8905|671.69|l requests. furiously final accounts alongside of the regular accounts +1537|18|58|608.64|ely bold pinto beans. quickly ironic braids cajole furiously fluffily final instructions. express +1537|58|4804|869.14|accounts use slyly before the quickly regular foxes. slyly special excuses detect slyly above the requests. quickl +1538|39|3687|318.42|quests sleep. carefully ironic accounts nag above the quickly iro +1538|79|9255|246.03|the final, even foxes use blithely regular deposits. blithely regular requests integrate blithely according to the slyly ironic requests. express theodolite +1538|19|8249|386.03|odolites. carefully final requests wake furiously daring accounts. furious packages cajole fluffily. slyly silent requests are. permanently pending requests believe silent acc +1538|59|9286|638.85|slyly bold somas. ironic, blithe packages integrate blithely. furiously ironic instructio +1539|40|4843|994.32| regular deposits are carefully. busily regular packages are packages. quickly stealthy deposits alongside of the slow, regular foxes nag accordi +1539|80|2579|275.34|yly ironic ideas are furiously ironic foxes: platelets haggle. regular, regular requests affix doggedly pending, pending theodolites. slyly re +1539|20|3625|556.06|ckages unwind slyly slyly ironic foxes. express, final packages above the dependencies nod after the theodolites. slyly even deposits nag. quickly pending +1539|60|519|298.21|ndencies. slyly brave excuses nag slyly! slyly unusual packages use blithely above the blithely regular theodolites. regular fox +1540|41|787|319.36|ely according to the fluffily ironic dolphins. blithely regular accounts above the slyly final deposits haggle bold sauternes. special accounts detect furiously along the regular, silent fra +1540|81|5940|995.64|nag slyly for the pending requests. final deposits are. unusual +1540|21|7877|632.90|ding accounts. regular packages wake furiously deposits. furiously final asymptotes wake according to the enti +1540|61|2317|948.11|ns; carefully unusual ideas wake carefully according to the furiously regular ideas. quickly regular accounts integrate furiously quic +1541|42|1843|2.24|re furiously blithely even instructions? regular pac +1541|82|7056|955.25|sleep carefully even, dogged somas. bold accounts boost quickly quickly final accounts: packages use carefully about the even instructions. even deposits sleep instead of the ironic, regu +1541|22|6330|7.20|lly. carefully special deposits wake along the quickly pending accounts. slyly ironic packages print slyly carefully ironic packages. pending requests haggle quickly. permanently final asymptotes a +1541|62|8183|318.12|lyly ironic excuses. even, express packages along the even requests sleep furiously accounts. fluffily ironic deposits x-ray furiously express requests. reg +1542|43|1681|232.79|y bold pinto beans along the fluffy ideas wake closely on the quickly +1542|83|1597|671.71|hould wake. blithely pending theodolites wake furiously furiously special deposits. requests are carefully. dogged packages believe. stealthy excuses about the regular, pending deposit +1542|23|4341|849.06|oss the slyly furious accounts. furiously unusual instructions cajole blithely according to the silent, ironic pinto beans? slyly bold requests hinder blithely regular packages. blithely +1542|63|5162|524.93|ly regular packages. ironic, final braids among the deposits use quickly carefully final packages. blithely regular instructions above the enticing excuses use furiously a +1543|44|9756|426.36|e along the carefully final braids. boldly regular requests wake regular deposits. fluffi +1543|84|515|278.90| ironic pinto beans nag slyly slow packages. ironic dugouts wake carefully. +1543|24|8628|445.75|quickly express excuses are slyly thin, unusual theodolites. decoys breach furiously final, final requests. slyly express deposits coul +1543|64|8056|415.09|ial instructions. blithely bold requests thrash carefully carefully careful requests. carefully ironic accounts against the bold, +1544|45|7255|569.64|p furiously before the fluffy requests. regular packages sleep furiously acc +1544|85|4793|686.12|lar excuses maintain quickly even ideas. slyly pending requests are slyly. +1544|25|536|241.56|ns haggle furiously even deposits. furiously special requests cajole about the even requests. sentiments wake quickly. final, regular r +1544|65|876|170.20|ages are furiously pending requests; regular, ironic +1545|46|8732|624.43| the blithely sly deposits use final accounts. furiously bold theodolit +1545|86|9802|530.13| bold instructions doubt carefully. fluffily final deposits nag according to the pending, final deposits? final accounts c +1545|26|3162|985.98|ular deposits. carefully pending requests haggle across the blit +1545|66|7871|6.87|uests believe about the express, regular asymptotes. blithely regular excuses along the fluffily slow ideas boost blithely blith +1546|47|5866|893.17|e blithely enticingly even pinto beans. silent dependencies integrate fluffily about the even, pending foxes. blithely regular packages play toward the pinto beans. blithely regular +1546|87|7765|706.74|regular deposits. blithely special platelets wake quickly on the pending platelets. pac +1546|27|5743|179.44|. silent packages above the unusual, pending packages wake +1546|67|8421|29.94|. blithely final requests could wake. carefully pending platelets sleep among the regular requests. carefully ironic foxes according to the carefully regular pinto beans haggle among th +1547|48|6630|880.00|ding packages affix blithely about the furiously even r +1547|88|4650|4.33|gular theodolites along the slyly final foxes cajole furiously between the silent accounts. quickly pending +1547|28|3626|126.00|counts haggle slyly unusual dolphins. fluffily fluffy packages +1547|68|8131|99.48|ites-- bold Tiresias along the carefully final pinto beans cajole by the carefully even requests. furiously unusua +1548|49|8908|868.72|ngside of the final ideas integrate furiously after the special packages. blithely even deposits among the unusual, r +1548|89|793|270.69|haggle carefully. silent deposits after the carefully final foxes wake blithely above the special foxes. blithely even instructions are quickly slyly p +1548|29|1447|231.68| cajole slyly express escapades. slyly special pinto beans sleep about the regular warthogs. b +1548|69|337|947.54|hely ironic instructions. furiously regular deposits wake carefully quickly special dependencies. deposits against the regular pint +1549|50|5633|398.24|furiously above the slyly final orbits; slyly even theodolites across the special requests affix +1549|90|7825|40.93|e daringly quickly ironic packages. furiously special requests haggle blithely-- pac +1549|30|4829|805.22|he unusual foxes. special, ironic epitaphs of the carefully special packages haggle furious +1549|70|6590|79.88|cial theodolites shall have to wake special, special requests. slyly ironic pack +1550|51|6807|80.19|egular, regular theodolites need to engage around the carefully express instructions. +1550|91|7902|357.82|ounts promise fluffily alongside of the special theodolites. quickly express accounts across the ironic ideas cajole against the furiously even +1550|31|5840|153.90|sts according to the blithely express pinto beans are furiously quickly unusual instructions. express accounts across +1550|71|3464|492.72|uests. furiously pending packages alongside of the slyly express deposits haggle blithely fluffily ironic accounts-- final foxes alongside of the slyly regular requests doubt blithely alo +1551|52|8394|675.26|re carefully across the regular requests. furiously ironic packages sleep. carefully unusual accounts nag blithely across the blithely unusual packages-- deposits +1551|92|3182|581.08|st cajole slyly among the carefully bold foxes. carefully even accounts sleep. doggedly regular instructions haggle alongside of the dolphins? regu +1551|32|3304|182.76|r instructions sublate furiously slyly ironic ideas. ironically enticing deposits wake ca +1551|72|1774|895.11|ing dependencies. boldly bold theodolites cajole regular sauternes. +1552|53|5358|289.15|ronic accounts. foxes integrate quickly regular pinto beans. slyly ironic excuses boost blithely: final theodolites haggle quickly. slyly ironic accounts affix alongside of the +1552|93|7030|802.33|p about the enticingly quiet pinto beans. furiously ironic packages are care +1552|33|8648|324.50| instructions. permanently ironic requests use carefully regular, regular tithes. quickly regul +1552|73|3658|537.80|e carefully bold dependencies. furiously unusual accounts along the regular packages sle +1553|54|9417|953.30| the regular ideas. regular requests shall have to lose. never unusual requests after the ironic, ironic packages unwind quickly blithely final accounts. quickly unusual pinto beans cajole +1553|94|3273|209.32|s among the pending, final ideas haggle blithely among the quickly enticing theodolites. ironic theodolites use patterns. requests +1553|34|8045|775.79| regular packages play quickly pending deposits. blithely ironic accounts doubt furiously ironic Ti +1553|74|2868|965.74|sits; carefully express asymptotes impress. ideas against the special ideas cajole carefully slyly express a +1554|55|4758|534.05| ironic accounts haggle carefully furiously bold accounts. quickly silent ideas kindle closely express packages. even, regular decoys among the quickly ironic instructions haggle dependenc +1554|95|2934|899.57|he even packages. quick deposits affix slyly unusual excuses. quickly bold instructions boost? fluffily pending dinos affix blithely. quickly final +1554|35|9256|364.43|pecial packages are busily. frays cajole for the blithely special decoys. carefully unusual ins +1554|75|5156|293.98|riously after the furiously unusual requests. regular deposits sleep blithely quickly even deposits. regular, express packages solve furiously fina +1555|56|1734|28.17|ly along the slyly even deposits. even, unusual requests wake always over the ideas! +1555|96|2825|132.09|nal requests boost according to the slyly silent foxes. furiously pending packages sleep blithely across the packages. unusual requests need to haggle. furiously ironic accounts nag quickly pe +1555|36|1281|479.64|kages are along the regular, ironic ideas. special, bold instructions hang slyly. furiously final requests try to dazzle carefully final instructions! blithely silent packag +1555|76|8783|603.05|final deposits are. quickly pending packages wake among the quickly pending requests. regular deposits +1556|57|8116|714.07|ructions. deposits wake quickly requests. even packages according to the furiously regular dependencies cajole slyly ideas. regular +1556|97|5003|511.06|quests cajole fluffily. express requests despite the requests cajole +1556|37|8161|105.84|as furiously about the furiously pending instructions. furiously final requests use silently within the sp +1556|77|4198|928.23|ly pending requests after the quickly final depths wake after the furiously bold +1557|58|3677|528.83|althily quickly unusual deposits. requests nag slyly. final, express excuses according to the slyly regular theodolites haggle carefully quickly special requests. care +1557|98|9800|95.53|inly express asymptotes. enticing foxes after the carefully final requests cajole quickly alongside of the blithely bold orbits. sp +1557|38|3408|502.26|beans. fluffily special asymptotes sleep carefully regular ideas. final, final deposit +1557|78|3784|112.71|. furiously regular foxes cajole slyly pending courts. pending accounts according to the fluffily final pinto beans haggle blithely bli +1558|59|3296|415.42|press requests. slyly bold accounts along the final, final theodolites haggle iron +1558|99|6901|153.28|efully silent requests wake carefully slyly regular accounts. fluffily special foxes wake careful +1558|39|2595|34.83|ons. special deposits doubt fluffily. slyly bold accounts maintain according to the +1558|79|2097|255.53|unusual gifts boost carefully? special, silent packages haggle blithely above the carefully unusual +1559|60|680|211.82|ously final theodolites. blithely express packages are slyly ironic theodolites. regular patterns promise quickly. furiously even ideas boost slyly after the express accounts. silent deposits a +1559|100|589|845.41|the stealthily bold requests are busily bold platelets. final, slow deposits are. quickly regular Tiresias haggle regular, silent deposits. slyly express theodolites doze. dolphins among the spec +1559|40|6774|167.55| carefully final accounts are slyly final theodolit +1559|80|9485|4.58|s. furiously special epitaphs cajole furiously. express dependencies was above the fluffily silent instructions. slyly unusua +1560|61|7096|270.38|ts. unusual, pending dependencies sleep against the carefully unusual depths. closely unusual requests wake quickly. unusual packages sleep furiousl +1560|1|4166|119.01| foxes after the blithely express multipliers wake according to the regular accounts. slyly bold packages detect quickly. furiously regular +1560|41|3114|467.93|oost furiously after the final accounts. carefully bold theodolites are. bravely re +1560|81|9226|575.60|ndencies haggle slowly above the regular, regular pinto beans. regular, final deposits sleep across the quickly unusual asymptotes. silent de +1561|62|4050|916.48|uriously quick platelets sleep ironic, pending packages. furiousl +1561|2|3911|755.49|ual theodolites are furiously along the carefully pen +1561|42|1264|298.25|ix slyly blithely final theodolites. regular, unusual accounts are fluffily regular deposits: unusual, regular packages according to the blithely +1561|82|3191|960.62|lly express deposits. deposits affix furiously fluffily ironic accounts. carefully unusual deposits haggle agai +1562|63|4004|331.07| express pinto beans cajole closely. carefully regular packages eat quickly deposits. pending ideas are blithely slyly express asymptotes? theodolites haggle. blithely fi +1562|3|8746|115.12|quests thrash furiously after the blithely final requests. +1562|43|784|56.87|equests cajole according to the furiously regular accounts. slyly f +1562|83|266|971.79|ironically ironic ideas. quickly pending requests are furiously accordi +1563|64|6198|331.45|tly pending pinto beans. blithely special accounts sleep. platelets boost furiously. slyly silent deposits are ruthles +1563|4|5180|465.03|y even accounts. even, ironic asymptotes cajole blithely. ironic packages detect carefully. even requests poa +1563|44|7813|765.16|rate carefully. carefully regular Tiresias nod blithely. final instructions wake fluffily. pending theodolites use. deposits affix. furiously pending notornis are quickly slyly express foxes. furio +1563|84|5432|86.25|re slyly. ironic requests hinder blithely against the unusual ideas? quickly pending dependencies cajole at the requests. quickly regular instru +1564|65|4177|379.24| deposits. regular accounts are. even, final courts was. silently unusual theodolites nag furiously accounts-- carefully final d +1564|5|6426|539.25|ial platelets nag carefully theodolites. even pinto beans nag against the pending foxes. furiously regular ideas against the blithely pending packages sleep slyly above the blithely bold accounts. +1564|45|4955|497.54|requests. ironic instructions wake slyly instructions. furiously stealthy packages wake. regular waters across the carefully even do +1564|85|3962|710.88|. quickly pending deposits wake blithely. theodolites cajole blithely requests. final deposits use quickly. carefully +1565|66|140|779.20|ithely even deposits sleep quickly blithely silent packages. ironic requests alongside of the even, regular asymptotes are carefully since the packages. slyly special as +1565|6|2599|208.91|ly regular instructions are blithely according to the blithely even ideas. ironic deposits run. brave, bold accounts wake. careful +1565|46|2317|835.43|ounts are about the carefully ironic foxes. special packages poach blith +1565|86|4022|229.01|ully pending requests. special deposits sleep deposits. unusual asymptotes sleep express instructions. regular, regular deposits lose carefully among the slyly ironic requests. +1566|67|2660|68.87|ons boost about the regular instructions. carefully special foxes integrate carefully. carefully final requests x-ray after the unusual, unusual theodolites. careful packages wake. flu +1566|7|7488|842.39|le. unusual accounts integrate quick requests. quickly final ideas nag always against the blithely ironic ideas. furiously bold packages sleep finally unusual courts. carefully special packages a +1566|47|3693|369.80|ged packages boost regular, regular excuses. ironic warhorses are carefully. blithely bold foxes nag across the bold requests. carefully even requests nag around the express packages-- accou +1566|87|2708|571.65| blithely regular accounts haggle carefully carefully regular asymptotes. furiously unusual +1567|68|7871|567.64|furiously slyly unusual waters. asymptotes integrate quickly blithely bold requests. blithely spe +1567|8|3126|84.19|press requests nag carefully after the furiously final instructions. furiously pending theodolites sleep. fluffily pending requests wake. stealthily unu +1567|48|2439|616.26|ep around the slyly bold deposits. even packages sleep fluffily ironic deposits. express, +1567|88|5651|962.96|foxes. pearls wake daringly. quickly permanent requests cajole furiously. regular instructions boost regular, bold requests. fluffily final accounts acro +1568|69|1251|824.17|al foxes serve slyly careful foxes. ironic, express depo +1568|9|8837|863.20|ar dependencies are stealthily busy foxes. carefully final fo +1568|49|470|501.00|accounts. carefully final grouches cajole furiously quickly ironic accounts. instructions haggle above the final, even packages. unusual gifts boost. dolphins are qui +1568|89|1895|899.23|ages integrate carefully alongside of the requests. quietly special ideas haggle blithely after the furiously bold hockey pla +1569|70|7228|552.77|notornis alongside of the dolphins affix silently above the escapades. slyly stealthy Tiresias after the fur +1569|10|6858|908.78|y bold frays. instructions haggle slyly: regular, ironic instructions across the packages integrate fluffily +1569|50|6769|295.91|. courts are blithely slyly unusual packages. quickly even attainments cajole. careful +1569|90|5865|476.29|ding to the slyly brave foxes. excuses cajole slyly slyly special platelets: carefully pendin +1570|71|7082|167.81|leep ruthlessly. slyly fluffy instructions affix deposits. pending platelets above the even deposits nag carefully slyly ir +1570|11|9736|459.38| after the carefully ironic packages. even accounts use blithely. unusual deposits along the instructions cajole furiously along the b +1570|51|3092|734.28|lar theodolites cajole. carefully pending packages engage around the unu +1570|91|6307|515.54|sly final packages. instructions cajole furiously according to the careful +1571|72|2661|559.24| furiously silent pinto beans boost furiously. slyly final multipliers wake fluffily after the express, expres +1571|12|7273|718.56|n instructions sleep fluffily after the packages. carefully final ideas wake slyly. asymptot +1571|52|2537|61.65|ly furiously express pinto beans. express theodolites integrate blithely after the pending requests. ideas shall have to cajol +1571|92|519|468.09| requests haggle fluffily final requests; carefully enticing theodolites according to the quickl +1572|73|9991|184.82| express, special sentiments. slyly regular deposits wake carefully quickly bold deposits. furiously ironic asymptotes above the regular, regular requests should are above the qu +1572|13|4030|591.56|y bold platelets snooze sometimes furiously unusual deposits. final ideas are blithely above the +1572|53|3452|478.26|ffily regular instructions. accounts sleep about the ironic, final ideas. s +1572|93|4912|274.60|y during the pending pinto beans. regular theodolites nod slowly furiously even instructions. instructions sleep fluffily furiously even foxes. carefully even requests haggle above the +1573|74|8043|59.66|uick excuses. furiously even deposits sublate bravely even requests. requests of the accounts impress carefully regular +1573|14|6944|966.65|eposits nag against the furiously ruthless theodolites. ironic w +1573|54|3458|919.65| regular instructions haggle carefully at the even, express packages. slow decoys doubt quickly ironic accounts? packages snooze abov +1573|94|8981|142.64| quickly final packages integrate thinly. furiously regular accounts hang. quickly final courts c +1574|75|7011|956.43| regular accounts? regular, regular packages along the slyly regular dolphins solve slyly after the carefully bold asymptotes. +1574|15|5563|926.10|ial requests wake blithely. slyly even deposits affix daringly express instructions; carefully expres +1574|55|5410|663.84|ual excuses. quickly unusual packages unwind slyly ato +1574|95|7412|499.47| slyly after the carefully express excuses. bold asymptotes about the slyly regular depths use brave somas. bold ideas are blithe +1575|76|4468|243.61|gular pinto beans. carefully pending packages sleep blithely about the ironic deposits. quickly final accou +1575|16|2091|611.77|s. slyly pending requests wake always fluffily unusual ideas. carefully final packages nag fluffily furious, express pinto beans. furiously regular requests should have to breach blithely silent a +1575|56|4184|387.37|ages detect carefully regular ideas. carefully regular packages are. furiously final instructions sleep quickly unusual, even hock +1575|96|4906|230.55|s nag furiously against the furiously final accounts. furiously final foxes cajole fluffily after the ideas. ironic, final pinto beans sublate. fluf +1576|77|507|975.15|ons. blithely pending deposits cajole deposits. slyly ironic foxes sleep. accounts about the regular packages boost carefully alongside o +1576|17|5992|884.79|ges are slyly according to the slyly ironic accounts. final packages engage fluffily. carefully bold ideas sleep final deposits. express deposits sleep blithely regular foxes. sly packages nag. f +1576|57|821|598.13|. quickly special excuses about the final, final packages cajole furiously after th +1576|97|9361|959.92|riously against the regular foxes. blithely final deposits nod express deposits. slyly express dependencies us +1577|78|2755|585.90|packages. slyly sly asymptotes among the ironic theodolites detect quickly ironic sauternes. blithely ironic packages for t +1577|18|2391|197.90|e. idle instructions haggle slyly slyly final deposits. carefull +1577|58|4671|727.66|gle slyly after the blithely unusual theodolites. final accounts haggle carefully silent packages. deposits sublate slyly pinto beans. special, pending re +1577|98|3075|140.74|he quickly even deposits. special accounts outside the fluffily regular foxe +1578|79|1720|996.35|. pending instructions breach quickly always even excuses. regular packages wak +1578|19|7478|479.52| the pending, ironic pinto beans. blithely express deposits sleep quickly. quickly regular accounts sleep about the unusual deposits. blithely daring accounts affix carefully +1578|59|293|568.43|deas try to haggle unusual, final ideas. final, special ideas unwind blithely carefully bold instructions. blithely regular som +1578|99|9143|309.54|ions haggle across the fluffily even asymptotes. blithely bold ideas use. furiously regular theodolites integrate fluffily. furiously special deposits are; carefully regular accounts cajole slyly +1579|80|1278|772.77|egular foxes mold carefully regular requests. idle platelets af +1579|20|9355|995.56|haggle above the final multipliers. carefully even packages boost alongside of the permanent, bold deposi +1579|60|6175|299.08|s. furiously final deposits at the bold requests affix fluffily at the blithely ironic ideas. furiously even deposits wake carefully; requests cajole stealthily. even, express +1579|100|9777|833.02|rding to the blithely even instructions. finally unusual theodolites detect about the fluffily regular packages. regular packages wake warhorses. sly, express asymptotes mai +1580|81|3874|717.86|luffily according to the express, regular ideas. furiously special +1580|21|8717|326.53|ly regular ideas integrate carefully. even pinto beans haggle sly +1580|61|7456|708.31|sly final deposits. regular deposits across the final, ironic deposits nag ironically quick +1580|1|7327|564.34|us pinto beans solve furiously. deposits solve quickly. carefully bold frets according to the even ideas haggle fluffily on the slyly regular forges. even, pending +1581|82|320|583.76| carefully? requests detect blithely along the regular deposits; carefully dari +1581|22|2765|282.67|dazzle slyly according to the requests. furiously regular pains thrash stealthily at the fluffily +1581|62|7770|870.03|ing to the final, bold theodolites sleep blithely ironic, express accounts. furiously even asymptotes wake quickly final a +1581|2|2081|361.81|nal multipliers sleep among the fluffily quick ideas. furiously unusual requests +1582|83|3839|210.93| boost! always pending ideas cajole furiously: final, express requests cajole special deposits. quickly final platelets hinder quickly. requests could are qui +1582|23|7863|888.77|gular platelets. fluffily special accounts dazzle quickly. furiously regular instructions are furious +1582|63|5310|614.00|r dolphins according to the furiously silent accounts use carefully about the fluffily final foxes. fur +1582|3|1959|941.46|er the slyly final packages. slyly ironic realms use carefully regular accounts. fluffily ir +1583|84|188|18.72|wake. special, ironic ideas cajole carefully. even, express platelets according to t +1583|24|1002|224.32|sly pending deposits. furiously unusual theodolites impress according to the always pending hockey players. +1583|64|2690|77.37|ly deposits. fluffily ironic accounts wake slyly special accounts? even courts nag around the special instructions! unusual, pending deposits could nag slyly regular requests. brave packages haggl +1583|4|5607|867.40|ay detect alongside of the furiously even requests. carefully unusual theodolites use quickly. quickly regular instructions wake quickly according to +1584|85|1957|142.34|y furiously pending instructions. blithely pending deposits according to the slyly silent accounts boost quickly pending accounts. slow requests against the foxes ha +1584|25|5501|1.27|ests detect quickly special requests. furiously bold packages are slyly quickl +1584|65|3417|569.81|hely unusual, regular deposits. final, regular theodolites are carefully regular, regular requests. special requests grow quickly. blithely ironic deposits +1584|5|5238|548.83|oys are bravely slyly regular packages. slyly final foxes cajole at the quickly special dolphins. carefully silent requests across the foxes use +1585|86|5742|634.10| final Tiresias nag against the decoys. dolphins until +1585|26|9526|128.49|slyly ironic deposits haggle alongside of the even accounts. express, final packages among the bold, even requests run fluffily pending requests. blithely ironic account +1585|66|1526|955.01|uctions nag quickly. regular deposits wake alongside of the slyly bold instructions. carefully final deposits haggle qu +1585|6|4500|8.17|s sleep carefully even instructions. permanently final requests are doggedly alongside of the blithely fluffy foxes. blithely pending accounts haggle blithely. ironic pinto beans +1586|87|7545|717.19| deposits detect furiously about the foxes. final deposits do cajole along the slyly even packages. ins +1586|27|4829|92.66|ronic dependencies are quickly accounts. ironic instructions boost blithely according to the blithely silent deposits. ironic hockey players cajole silently. c +1586|67|6693|131.63|nal packages haggle furiously across the slyly final deposits. blithely unusual requests aff +1586|7|3328|839.30|refully express waters are furiously bold deposits. quickly regular deposits haggle slyly across the final acco +1587|88|2305|387.54|ep furiously above the slyly express ideas. carefully pending instructions sleep carefully slyly regular +1587|28|8988|133.20| dolphins wake quickly bold requests. final, special foxes run alongside of the quickly ironic pinto beans. unusual, even foxes cou +1587|68|3309|132.40|ts sleep slyly deposits. blithely ironic ideas cajole quietly besides the +1587|8|7934|719.58|sits serve carefully? slyly regular instructions wake according to the fluffily even accounts! slyly special ideas are fluffily. dogg +1588|89|3853|255.59|pinto beans across the ironic, stealthy instructions cajole carefully even accounts. busily regular platelets solve. fluffily +1588|29|8503|280.40|oost quickly. instructions nag slyly furiously pending accounts. carefully unusual pinto beans among the slowly ironic foxes integrate acc +1588|69|1090|541.46|structions: regular platelets sleep furiously around the ideas. special platelets s +1588|9|8150|540.29|bout the blithely express instructions haggle fluffily slyly ruthless accounts. regular, regular accounts maintai +1589|90|7148|927.28|t the carefully ironic instructions. slyly busy grouches wake furiously. carefully unusual excuses are. furiously pending accounts bre +1589|30|1064|439.88| blithely bold accounts nag carefully. slyly special requests print. quickly regular account +1589|70|3048|681.59|nal instructions. furiously ironic requests among the platelets haggle thinly alongside of the unusual packages. packages sleep slyly final theodolites. instructions about the specia +1589|10|1947|128.34|r ideas toward the final requests cajole across the quickly special packages. special ideas cajol +1590|91|9431|479.59|cajole furiously final accounts. never even sheaves sleep platelets. slyly final requests use slyly bold de +1590|31|6259|765.07| slyly. quickly even pearls haggle blithely. regular, ironic deposits sleep brave +1590|71|4337|462.56|oss the blithely ironic requests cajole before the platelets. ironic pinto beans are quickly above the blithely fluffy requests. quickly regular accounts wake blithely at the +1590|11|171|206.01|blithely pending, unusual ideas. furiously bold excuses try to boost along the furiously special foxes. bravely regular packages around the fluffi +1591|92|2341|150.53|ly ironic packages. theodolites sleep about the final instructions. thinly even sauternes wake. blithely final packages use carefully alongside of the escapades. requests wake along the packages +1591|32|5242|662.96|e regular packages-- packages haggle quickly bold braids. regular accounts according to the quickly special requests haggle +1591|72|1617|728.78|kages detect quickly ironic, pending epitaphs. quickly unusual deposits wake. fluffily final patte +1591|12|7035|921.51|osits. bold requests nag carefully blithely regular pearls. regular requests use permanently regular instructions. final instructions ought to are above the fluffily express d +1592|93|4190|355.60|ically express courts among the requests cajole qu +1592|33|6420|752.53|ites haggle slyly after the quickly regular asymptotes. furiously pending ideas according to the regular pinto beans boost blithely among the bold pinto beans. ironic foxes cajol +1592|73|5365|606.03|ackages haggle slyly around the slyly unusual courts. ironic requests use furiously! closely bold theodolites along the ironic theodolites solve above the carefully even deposits. regular, even +1592|13|869|871.67|dolites hang fluffily among the blithely regular theodolites. furiously regular excuses are requests. slyly regul +1593|94|2639|991.84|its. fluffily pending packages boost quietly carefully special dolphins. quickly regular requests boost blithely unusual requests? slyly final asympt +1593|34|8015|583.94|al packages. slyly ruthless packages wake among the carefully ironic ideas. carefully ironic packages affix. +1593|74|532|232.80|aggle fluffily after the slyly final foxes. permanently ironic accounts among the unusual, bold pinto beans nag dari +1593|14|7134|724.04|y dogged platelets boost slyly pinto beans. fluffily final requests cajole. bold asymptotes wake blithely. carefully spe +1594|95|1801|232.09|. special, regular Tiresias cajole. foxes against the furiously fi +1594|35|1121|791.08|eep blithely regular asymptotes. furiously regular deposits are blithely quickly permane +1594|75|4100|171.95|gside of the even, unusual deposits. slyly regular accounts above the furiously ironic packages integrate furiously at the quickly ironic instructions. quickly +1594|15|2995|90.21|kages thrash across the ironic accounts. slyly ironic pac +1595|96|9275|939.10|usly final attainments are. slyly ironic ideas cajole carefully. u +1595|36|569|284.83|to beans. quickly pending deposits sleep among the regular accounts. furiously final pac +1595|76|1649|211.54|totes. enticing pinto beans cajole ruthlessly after the furiously even somas. somas boost carefully bold foxes. final, ironic pinto beans cajole across the furiously express ideas. re +1595|16|6928|217.42|fully express requests kindle pending foxes. ironic packages are furiously. fluffily expres +1596|97|4083|141.21|ly ironic deposits. deposits breach along the blithely regular theodolites. requ +1596|37|5065|948.83|sly special packages. slyly final theodolites sleep c +1596|77|1404|78.75|pecial accounts after the furiously ironic foxes sleep alongside of the slyly pending accounts. packages wake carefully silent packages. blithely final depo +1596|17|2783|181.54|the regular asymptotes haggle blithely regular requests. carefully regular hockey players wake furiously slyly unusual foxes. even deposits integrate slyly sometimes even requests. ex +1597|98|8409|377.72|osits are fluffily according to the slyly ruthless requests. blithely ironic deposits after the ironic theodolites wake furiously to the slyly express requests. carefully final Tir +1597|38|2060|824.79|among the blithe pinto beans breach above the ironic, special theodolites. stealthily sile +1597|78|4443|177.28|ecial packages. slyly thin foxes are even attainments. furiously express theodolites wake slyly across the regular inst +1597|18|571|709.56|ding deposits wake. blithely final excuses haggle fluffily. quickly express foxes haggle. blithely regular foxes cajole furiously. carefully unusual +1598|99|2861|702.88|nto beans are quickly past the regular, regular waters. express theodolites according to the furiously regular requests boost after the carefully pending packages. blithely final packages hagg +1598|39|2559|230.69|packages. furiously ironic accounts shall have to print blithely according to the finally express accounts. fluffily ironic courts use furiously unusual requests. pending, even requ +1598|79|3257|255.71|warthogs wake slyly about the slyly pending ideas. ironic Tiresias cajole blithely. quickly +1598|19|8689|237.73| instructions against the unusual pinto beans poach slyly accordi +1599|100|3105|695.20| quickly sly dependencies print slyly. even, ironic requests wake carefully daringly regular packages. unusual courts use blithely into the slyly special +1599|40|4635|120.13|inal theodolites: furiously regular theodolites about the final, unusual requests sleep carefully fluffily regular asymptotes. pending accounts +1599|80|7360|280.76|ions sleep slyly quickly regular asymptotes. slyly express theodolites along the special pinto beans wake unusual, final deposits. regular hockey players around th +1599|20|8251|665.30|ages wake around the special accounts. slyly final excuses wake carefully. blithely ironic pinto beans cajole slyly express requests! +1600|1|3836|965.26|counts wake blithely pending accounts. slyly ironic deposits sleep blithely among the furiously bold ideas. epitaphs +1600|41|4463|469.03|its. express, special pinto beans sleep fluffily quickly special sauternes. de +1600|81|9605|78.17|slyly close deposits-- slyly ironic pinto beans integrate. carefully ironic warhorses against the fluffily express requests sublate since the fluffily final packages. ideas run furiously after the +1600|21|874|324.34|ifts integrate above the final ideas. fluffily express pinto beans hag +1601|2|5505|873.81|ites. furiously even packages haggle slyly even deposits. regular, even deposits use carefully final accounts +1601|43|9546|856.43|y pending requests nag slyly about the carefully regular deposits. express instructions are express foxes. furiously special acco +1601|84|2987|471.28|haggle about the slyly ironic requests. slyly even instructions cajole slyly above the quickly final packages. slyly +1601|25|5804|955.12|ully according to the fluffily bold requests. regular, regular requests boost slyly final pinto beans. slyly bold packages haggle furiously carefully ironic requests: caref +1602|3|5922|833.22| fluffily even accounts cajole fluffily? deposits wake furiously according to the +1602|44|5591|89.18|he slyly final accounts. pending, special asymptotes maintain slyly fluffy frets. theodolites around the quickly bold packa +1602|85|5472|547.06| blithely furious deposits eat blithely about the carefully bold packages. regular, ironic dolphins are quickly blithely quick asymptotes. pending pinto beans lose slyly carefully ironic r +1602|26|4323|830.77| dependencies are quietly even packages. final instructions hang furiously; pinto beans cajole slyly theodolites? final ideas detect. asymptotes a +1603|4|9774|837.49|ide of the blithely ironic foxes. carefully even pinto beans boost carefully. unu +1603|45|9225|908.32|egular deposits nag blithely even requests. carefully close theodolites across the deposits cajole always after the unusual instructions. regular ideas mold sly, bold dependencies. regular pa +1603|86|6381|500.66|the unusual, unusual asymptotes. furiously regular accounts ha +1603|27|9953|234.15|ld ideas. furiously pending instructions across the carefully regular requests nag fur +1604|5|3984|533.36|theodolites; bold dugouts on the quickly pending asymptotes haggle blithely carefully final deposits. deposits boost across th +1604|46|3169|304.09| even warthogs are fluffily according to the platelets. ironic, even packages nag along the dependencies; accounts use fluffily carefully pendin +1604|87|7402|164.68|out the furiously final requests cajole blithely final instruc +1604|28|1681|822.53|sleep carefully around the furiously even pinto beans. s +1605|6|7365|262.92|rs. carefully ironic instructions haggle fluffily instructions. blithely pending packages use according to the slyly even deposits. blithely dogged accounts ar +1605|47|4791|497.37|boldly pending requests sleep. blithely final packages affix carefully. blithely unusual ideas hinder along the express deposits. furiously even requests hag +1605|88|4513|878.52| breach express, final dependencies. furiously even foxes haggle slyly bold theodolites. quickly unusual accounts engage furiously alongside +1605|29|4528|148.13|ld deposits are boldly among the blithely unusual ideas. even, final platelets are carefully across the slyly pending instructions! sly +1606|7|9228|266.06|ss the slyly regular grouches use final, pending pinto beans. carefully final requests sleep around the blithely express theodol +1606|48|14|443.38|yly express foxes. special excuses haggle above the final dolphins. carefully +1606|89|6054|486.42| beans cajole furiously even packages. fluffily silent deposits among th +1606|30|8803|555.95|onic, pending platelets nag furiously after the blithely regular requests. carefully ironic deposits are blithely according to the express, even requests. bravely regular theodolites boos +1607|8|4552|431.17|ounts cajole. silently special ideas wake pending, pending Tiresias! blithely unu +1607|49|710|163.99|iously even packages wake carefully. special accounts about the blithely even packages cajole about the accounts. fluffily pending dolphins use thinly slyly even instructions. ir +1607|90|1762|147.32|uickly carefully unusual frets. ironically silent requests cajole about the special, final instructions. regular, regular de +1607|31|6123|771.64|fully final accounts. silent, pending instructions are. iron +1608|9|9288|119.36|yly blithe dependencies wake furiously regular warhorses. requests nag bli +1608|50|7302|258.72|. ironic theodolites sleep. quiet, permanent instruc +1608|91|6046|885.52|requests sleep. deposits cajole slyly blithely regular grouches. quickly express foxes detect furiously ironic braids. +1608|32|3770|937.85|ckages wake slyly until the Tiresias. quickly slow accounts across the deposits cajole accounts. carefully r +1609|10|2111|274.22|fily carefully ironic deposits. fluffily express asymptotes sleep. fluffily pend +1609|51|307|654.28|osits. bold, regular requests haggle quickly ironic theodolite +1609|92|5600|702.61|are blithely? special accounts wake furiously enticing, final requests. +1609|33|8048|748.35|to beans. carefully ruthless foxes haggle carefully. even deposits boost quickly. furiously final asymptotes sleep quickly against the furiously special p +1610|11|6086|220.60|nt accounts. slyly ironic accounts doubt against the regular, ev +1610|52|4395|560.41| ironic dolphins cajole across the final deposits. blithely furious instructions are. blithely silent deposits haggle. fluffily final pinto beans boost a +1610|93|485|486.81|leep furiously furiously regular instructions. ironic, regular warthogs above the furiously special requests cajole final foxes. carefully regular packages at the special +1610|34|1563|232.14|ckly special pinto beans. express hockey players cajole slyly. carefully regular requests cajole quickly express accounts? carefully ironic theodolites around the fluffily pen +1611|12|5793|769.51|ctions. slyly express platelets are carefully above the carefully express instructions +1611|53|6457|236.93|ithely unusual dependencies wake according to the requests. unusual, final dolphins snooze blithely according to the blithely dogged ideas. carefully unusual instructions na +1611|94|417|333.72|ully final escapades use fluffily across the carefully regular packages. regular packages sleep fluffily against the carefully regu +1611|35|8918|627.00|regular packages use quickly furiously ironic requests. busy instru +1612|13|3431|647.89|structions grow furiously alongside of the fluffily even theodolites. furiously final accounts cajole carefully: regular, ironic instructions sleep +1612|54|3452|175.30|es. fluffily regular requests breach final deposits. carefully express req +1612|95|1384|452.84|te quickly slyly bold pinto beans. slyly unusual theodolites +1612|36|5848|734.34|heodolites haggle slyly thinly bold accounts. slyly regular instructions integrate furiously. carefully unusual packages haggle after the even, express accounts. +1613|14|9877|510.15|as. packages nag furiously. careful deposits among the slyly regular instructions are regular, regular dependencies. quickly final instructions along the pending +1613|55|3357|775.76|lphins affix quickly along the quick sentiments. even requests nag carefully about the final requests. fluffy requests nag slyly quickly ironic platele +1613|96|1504|310.12|uickly pending theodolites. thinly regular instructions haggle at the ironic requests. fluffily special packages haggle blithely fluffy reque +1613|37|9689|695.74|g ideas after the slyly express deposits haggle fluffily across t +1614|15|50|127.26|e according to the quickly pending asymptotes. regular, regular packages wake blithely furiously special deposits. furiously busy ideas wake fluffily among the regular asymptotes. +1614|56|6165|175.10|ackages. theodolites alongside of the packages are slyly regular dolphins. blithely final instructions could have to wake along the furiously dog +1614|97|5161|162.95|en platelets sleep slyly. pending ideas use above the regular platelets. carefully pending packages was final platelets: +1614|38|7452|642.91|ges hinder furiously carefully final excuses. furiously regular requests integrate alongside of the carefully even requests. pending dependencies among the final instructions cajol +1615|16|6804|299.72|ly against the slyly even foxes. quickly even foxes are idly after th +1615|57|5941|636.38| pinto beans poach quickly after the unusual, pending packages. busy accounts poach quickly whithout the furiously ironic deposits. fluffily final dugouts sle +1615|98|8318|561.57| pending pinto beans. asymptotes across the furiously pending ideas detect before the quickly final a +1615|39|605|910.47|ve finally alongside of the express, ironic requests. blithely +1616|17|7160|711.15|oxes nod quietly slyly special sheaves. ideas haggle furiously even, ironic deposits. carefully unusual accounts ar +1616|58|6990|484.42|ickly according to the silently pending ideas. quickly final deposits along the platelets shall are after the carefully idle accounts. b +1616|99|9767|991.00|yly regular excuses sleep ironic, busy platelets. carefully final deposits +1616|40|8923|553.62|lar excuses. fluffily special accounts doubt blithely through the instructions. slyly even deposi +1617|18|5632|176.97|about the even accounts? carefully final platelets maintain across the quickly pending packages. express ideas are silent instructions. care +1617|59|1196|551.90|refully pending deposits. furiously bold requests maintain +1617|100|1452|223.30| to the carefully final courts boost along the bold, regular requests. express, express accounts boost slyly. busy instructions sleep slyly. s +1617|41|2150|898.93|equests. slowly special accounts sleep quickly according to the express, pending warhorses. furiously final requests haggle among +1618|19|3493|600.28|. blithely special foxes about the regular dependencies cajole quickly pinto beans. even instructions are express instructions. final, regular requests p +1618|60|3360|112.61|encies. close requests boost always. slyly even instruct +1618|1|3777|803.57| furiously slow, ironic dugouts. carefully regular dependencies haggle furiously idle, special theodolites. busily unusual pinto beans ha +1618|42|5569|259.52|ely quick requests; regularly ironic ideas haggle quickly. carefully express requests cajole. furiousl +1619|20|1561|387.43|out the special theodolites. express, bold dugouts maintain carefully alongside of the unusual theodolites. never special deposits +1619|61|7539|276.05|gouts wake slyly for the slyly pending requests. express, special waters along the slyly even theodolites are furiously above the furiously regular packages. blithely ruthle +1619|2|8765|371.94|x finally. final pinto beans sublate. regular excuses according to the regular instructions cajole across the fluffy deposits. blithely even orbits hinder. furiously regular deposits among th +1619|43|7460|711.16|. carefully regular ideas are slyly express excuses. carefully even packages are blithely. blith +1620|21|6734|586.56|usly carefully regular courts. slyly ironic pinto beans integrate sl +1620|62|2369|401.25|about the furiously ironic ideas. dogged pinto beans detect +1620|3|8079|781.32|. pending foxes after the blithely special packages haggle quickly busily regular instructions. ironic requests after the regular platelets cajole afte +1620|44|2048|981.50|lithely into the express notornis. thinly ironic ideas cajole. special, final deposits after the blithely ironic deposi +1621|22|401|623.02|ts are quickly ironic pinto beans. quickly final requests haggle furiously. quickly +1621|63|7628|705.63|osits haggle finally. express, regular accounts are quickly quickly final decoys. even deposits wake fluffily abo +1621|4|5197|490.20| regular packages nag blithely. fluffily regular platelets sleep carefully after the furiously regular foxes. fluffily special instr +1621|45|2619|289.25|platelets use even, final instructions. fluffily ironic accounts snooze fluffily after the furiously unusual excuses. acc +1622|23|6050|440.53|nto beans unwind carefully fluffily special depen +1622|64|9430|631.73| carefully. furiously bold requests sleep blithely. excuses are. pending accounts are carefully alongside of the blithely regular ac +1622|5|5706|330.59|equests. carefully ironic accounts cajole furiously. furiously even packages are blithely regular asymptotes. carefully special +1622|46|9797|43.26|ctions-- accounts are fluffily bold requests. slyly ironic accounts lose aga +1623|24|9473|7.59| packages nag slyly final theodolites. quickly ironic sentiments across +1623|65|5365|22.34|e dinos; slyly even accounts sleep furiously pending ideas. slyly unusual asymptotes haggle never final packages. pinto +1623|6|1923|134.53| packages haggle. deposits use slyly. quickly ironic orbits are. slyly regular dolphins cajole careful +1623|47|1002|589.89| pending dependencies. slyly ironic accounts wake final accounts. ca +1624|25|8464|296.91|uriously special pinto beans. packages wake blithely. fluffily ironic pinto +1624|66|9670|350.85|ular dolphins according to the fluffily pending requests haggle blithely across the +1624|7|8199|923.62|ounts. fluffily express deposits along the slyly fi +1624|48|4882|849.78|slyly about the ruthlessly ironic accounts! final requests according to the fl +1625|26|7713|742.36|l ideas. final, express foxes integrate furiously among the ironic accounts. quiet requests print blithely after the quickly +1625|67|1363|488.92|oughout the carefully even instructions. sauternes should wake across the carefully express pinto beans. furiously dogged accounts affix after the closely final accounts. Tiresi +1625|8|6824|679.72|aggle after the furiously ironic instructions. ironic, pending dolphins are quickly blithely ironic deposits. bold, quiet deposits about the quickl +1625|49|7254|662.68| the carefully regular accounts affix slyly instead of the furiously regular packages; ironic, quick ideas hinder. spe +1626|27|6189|955.67|ests after the bold packages sublate carefully blithely final requests. fluffily ironic dependencies boost. furiously express requests about the pains might sleep furiously final +1626|68|3153|128.34|sits. final pinto beans cajole. asymptotes along the ironic, expre +1626|9|8608|472.17|ill boost slyly. furiously bold accounts wake fluffily even deposits. carefully ironic requests are ac +1626|50|7123|804.13|en asymptotes. slyly ironic ideas along the carefully ironic accounts breach furiously against the final, pending pinto beans. furiously regular dependencies mold blithely regular, express notornis. +1627|28|6812|637.33|ickly thin grouches thrash. quickly regular patterns affix sly +1627|69|8191|488.11|sly pending theodolites haggle after the slyly final pinto beans. carefully unusual requests sleep slyly after the final, final accounts! ideas use quickly. special packages +1627|10|8902|21.78|egular ideas. slyly silent packages haggle slyly even, pe +1627|51|9151|651.75|. slyly unusual packages sleep quickly regular, regular theodolites; fluffily permanent deposits nod across the slyly bold +1628|29|6468|37.08|sual frays. carefully pending requests cajole slyly about the brave, ironic foxes. bold dolphins are according to the regular foxes. slyly bold packages use blithely according to the q +1628|70|1761|999.95|lyly about the permanently ironic instructions. carefully ironic pinto beans +1628|11|1578|24.34|eep carefully. bold packages play quickly blithely final gifts. escapades after the slyly +1628|52|1048|794.24|excuses cajole furiously furiously pending frays. slyly bold theodolites sleep fluffily after the ironic accounts. furiously ironic accounts mold above +1629|30|4587|279.38|g foxes use. furiously special platelets sleep blithely. blithely quiet accounts cajole along the quic +1629|71|6430|426.56| the final accounts. orbits against the furiously unusual platelets boost furiously pen +1629|12|4549|575.17|en accounts wake ironic packages. even, express packages according to the regular, final courts affix slyly unusual excuses. even, express requests use carefully. quickly special somas c +1629|53|7704|740.28|regular accounts could sleep blithely according to the regular instructions. instructions wake about +1630|31|6006|444.03|es after the slyly pending notornis impress fluffily slyl +1630|72|8369|509.07|ickly ironic deposits are furiously. ironic, unusual instructions x-ray closely dependencies. even, pending pinto beans nag slyly pending foxes. final ideas wa +1630|13|8506|639.77| fluffily even, ruthless deposits. quickly ironic requests use furiously. final, final asy +1630|54|1951|478.12|s beside the blithely unusual packages sleep alongside of the ruthlessly bold deposits. carefully ironic requests na +1631|32|445|926.33|tions boost quickly according to the blithely pending ideas. furiously regular foxes try to use slyly fina +1631|73|4380|589.59|blithely fluffy pinto beans haggle furiously about the furiously special packages. unusual, regular packages about the fluffily express somas sleep carefully carefully bold dinos +1631|14|9227|328.03|posits cajole blithely. bold ideas haggle blithely accounts. even packages affix closely bol +1631|55|2143|850.20|ic deposits. unusual dugouts cajole. carefully bold instructions unwind quickly furiously regular packages. quickly regular dolphins haggle ca +1632|33|5870|683.27|onic packages. ironic instructions affix blithely according to the regular d +1632|74|1419|302.67|y final theodolites use fluffily. slyly regular asymptotes cajole quickly regular pinto beans. carefully even deposits should haggle slyly blithely bold requests. close, exp +1632|15|942|282.53|es. carefully pending excuses are quietly furiously regular requests. express, ironic accounts cajole across the blithely even packages. furiously express requests wake +1632|56|6044|367.07|tly express instructions. permanent packages cajole permanently. dolphins boost furiously final pinto beans. final, regular pinto beans dazzle unusual packages; furiously final accounts cajol +1633|34|129|711.48|c instructions are blithely. carefully ironic instructions unwind blithely. sly +1633|75|2412|957.75|ithely final requests hinder blithely carefully silent packages. f +1633|16|1466|178.52|s. express accounts nag silent, even orbits. furiously express gif +1633|57|5321|693.85| bold foxes. slyly final excuses are fluffily furiously final requests. furiously special ideas are alongside of the quickly +1634|35|6707|372.29| at the blithely even ideas are fluffily carefully unusual deposits. quickly regular platelets wake beneath the furiously even req +1634|76|8060|621.51|. pinto beans will was. fluffily unusual packages wake quickly express p +1634|17|4677|372.86|jole slyly? packages cajole fluffily quickly pending dolphins. regular, even instructions around the blithely regular requests wake ruthlessly against the never regular dependencies. final f +1634|58|1839|139.49|p blithely bold frets. unusual braids across the carefully ironic ideas cajole furiously pinto beans. blithely unusual idea +1635|36|5737|977.20|inal dependencies boost. special requests alongside of the careful +1635|77|614|415.04|nts alongside of the blithely pending pinto beans haggle furiously near the furiously ironic accounts. slyly unusual theodolites sleep blithely quickly unusual accounts. +1635|18|6007|688.57|t the unusual, silent packages. quickly unusual platelets sleep fluffily. special instructions boost; slyly express theodolite +1635|59|6037|529.76|sits sleep fluffily above the evenly express requests. instructions sleep. slyly special requests detect around the blithely iron +1636|37|8264|794.73|lent gifts. blithely unusual ideas cajole blithely. +1636|78|2774|593.63|g foxes. carefully ironic foxes about the slyly even packages wake carefully after the blithely unusual accounts: blithely express theodolites across the bold, ironic packages haggle furiously af +1636|19|1218|279.00|ke slyly silent theodolites. special, regular packages solve carefully bold, fin +1636|60|2463|46.68| packages haggle slyly after the carefully final accounts. deposits wake. quiet pinto beans cajole-- even ideas cajole furiously slyly daring +1637|38|9364|550.32|es. furiously final deposits are blithely at the fluffily ironic instructions. slyly pending deposits sleep. slyly reg +1637|79|3329|635.99| slowly ironic accounts could boost after the daringly enticing deposits. ironic packages wake carefully alwa +1637|20|4839|931.10|riously ironic courts wake boldly. special, even accounts +1637|61|6487|804.89|er furiously slyly unusual gifts. pending ideas are blithely blithely pending foxes. slyly entic +1638|39|8573|418.35|thely ironic pinto beans sleep quickly silent epi +1638|80|4918|483.81|d packages are slyly express instructions; furiously ironic excuses use carefully. carefully bold theo +1638|21|499|758.83|platelets nag according to the unusual Tiresias. sl +1638|62|4484|497.94|the quickly final foxes integrate blithely blithely bol +1639|40|99|377.19|ld packages. quickly regular pearls are slyly final asymptotes. carefully ironic theodolites cajole carefully across the carefully ir +1639|81|1824|985.44|ily regular platelets. final, special foxes boost! carefu +1639|22|2237|951.67|usual, regular asymptotes! regular patterns along the qui +1639|63|1941|746.98|ronic requests cajole furiously special, final depths. bold accounts after the unusual excuses cajole always above the fluffily final excuses: blithely fi +1640|41|9150|199.23|al, regular foxes. even, express attainments cajole bravely along the carefully s +1640|82|5179|52.49|, silent pinto beans doze quickly express ideas. ironic dependencie +1640|23|5078|342.03|ffily ironic ideas besides the slyly final sheaves ha +1640|64|8680|530.39|lyly even accounts cajole across the careful patterns. express requests +1641|42|1165|416.74|. furiously busy tithes cajole furiously blithe theodolites. regular, bold theodolites above the slyly even excuses are fluffily even sentiments. carefully special pinto beans integrate bli +1641|83|4485|286.95|s after the regular, bold dolphins shall sleep furiously final deposits: care +1641|24|8752|841.91|yly silent theodolites. silently even requests wake quickly. final requests eat across the furiously even accounts. pending accounts above the regular requ +1641|65|5042|200.92|lar ideas nag blithely furiously final deposits. even, pending foxes wake around the furiously pending requests. unusual requests integrate +1642|43|9293|401.63|y regular pinto beans. final deposits across the furiously silent theodolites boost about the carefully final escapades. blithely even requests poach carefully after the requests. quickly cl +1642|84|4905|66.91|lithely about the quickly express deposits. packages along the accounts sleep sly +1642|25|602|955.38|e slyly special excuses. fluffily pending excuses after the carefully final packages detect care +1642|66|5935|165.80|lithely careful accounts. fluffily ironic requests cajol +1643|44|9805|648.97|ts detect furiously according to the regular, bold packages. pending theodolites sleep. furiously silent ideas above the pending requests use busily express requests. quickly final asympto +1643|85|4481|359.90|sits; regular pains wake quickly above the carefully express accounts. pending theodolites h +1643|26|5839|55.51|haggle slyly. even deposits among the accounts cajole near the slyly unusual deposits. slyly regular platelets wake. carefully regular theodolites nod always slyly express accounts. blithely re +1643|67|3493|102.43|y. bold deposits sleep carefully ironic packages. unusual dependencies nag furiously regular instructions. slyly idle pinto beans promise quickly instructions. blithely +1644|45|6098|475.26| regular instructions. pending dependencies haggle blithely pending deposits. fluffily regular accounts among the deposits affix careful +1644|86|6440|836.54|r the blithely final instructions. carefully ironic accounts are carefully furiously special packages. care +1644|27|7170|890.88|. blithely bold ideas doze blithely regular dependencies. carefully pending decoys use fluffil +1644|68|3036|132.28|ously final deposits sleep quickly about the carefully final sentiments. furiously ironic packages b +1645|46|9458|625.75|ithely regular deposits above the slyly bold packages wake slyly a +1645|87|7485|714.53|oxes sleep blithely along the furiously unusual deposits. closely express instructions whithout the close deposits wake furiou +1645|28|7112|343.20|c, final accounts use carefully among the ironic deposits. blithely ironic packages for the quickly regular deposits engage slyly against the quickly sly accounts. slyly ironic courts are slyly +1645|69|2107|75.07|ccounts sleep slyly pending platelets. slyly regular accounts promise around the neve +1646|47|7199|264.50| the regular accounts x-ray according to the quickly final accounts. even deposits sleep carefully requests +1646|88|3276|54.72|y across the quickly silent ideas. idly bold instructions wake quickly even ideas. pendi +1646|29|9645|793.60|s around the ironic, ironic deposits use dolphins. slyly unusual pinto beans against th +1646|70|9920|463.40|nusual foxes cajole among the furiously even instructions. carefully final packages cajole even, express requests. even theodolites boos +1647|48|6432|412.57|es sleep. carefully pending deposits run quickly about the theodolites. slyly pending packages sleep blithely according to the blithely final foxes. waters +1647|89|7464|199.64|usly ironic theodolites maintain. slyly final deposits haggle f +1647|30|8240|934.57|iously thin depths wake slyly. carefully unusual deposits sleep across the sometimes +1647|71|3726|170.75|e slowly about the blithely unusual deposits. blithely ironic theodolites cajole. quiet, express deposits cajole. ironi +1648|49|3474|919.85|ful packages are slyly. carefully ironic accounts along the quickly pending accounts should have to are furiously at the requests. blithely even req +1648|90|2944|485.74|ions. slyly even accounts against the bold theodolites haggle furiously slowly unusual instruc +1648|31|7586|163.39|ing waters. carefully regular ideas across the deposits lose furiously regular accounts. carefully express excuses sleep stealthily according to the blithely re +1648|72|9903|31.84|ns run slyly regular instructions. fluffily special courts nag. theodolites eat. slyly final packages +1649|50|1004|917.25|to the stealthily pending requests. depths detect packages. quickly unusual pinto beans sleep ironic ideas-- even requests nag carefully. furiously permanent t +1649|91|9861|728.60|quests. carefully final pinto beans sleep slyly alongside of the quickly silent ideas. blithely unusual instructions wake furiously. furiously even dolp +1649|32|9023|46.12|ial deposits cajole carefully. furiously regular ideas hang blithely unusual instructions. never final packages serve daringly. ironic, fin +1649|73|2963|166.34|onic depths dazzle blithely ironic deposits. ironic grouches sleep. fluffily final deposits are slyly quietly pending p +1650|51|3722|751.78|g carefully among the blithely final accounts. express foxes boost slyly final excuses. blithely even deposits ought to nag express asymptotes. even deposits run ironic foxes. ironically bol +1650|92|7333|13.93| pending ideas try to are among the brave, ironic accounts. pending, regular packa +1650|33|5258|650.01|ructions hang fluffily along the furiously express foxes. carefully ironic deposits sublate after the brave requests. bli +1650|74|9003|739.44| even platelets. slyly brave courts cajole carefully beside the slyly special requests. quickly even theodolites are packages. blithely pending theodolites haggle +1651|52|6360|311.39|s nag above the ideas. furiously final courts integrate fluffily about the unusual requests. regu +1651|93|7131|18.64|ely even platelets sleep furiously requests. carefully regular accou +1651|34|6072|860.39|arefully final accounts nag. carefully pending accounts wake slyly above the +1651|75|738|115.40| regular packages haggle quickly among the ironic platelets. stea +1652|53|6142|709.67|deas sleep stealthily unusual theodolites. ironic pinto beans eat carefully. theodolites sleep across the quickly ironic asymptotes! blithely express dependencies haggle about the +1652|94|8659|499.56|impress blithely furiously even instructions. slyly express platelets boost. slyly express foxes solve slyly ironic pinto beans. unusual accounts sleep slyly along the special asymptote +1652|35|3547|677.21| deposits. ideas use slyly. carefully ruthless packa +1652|76|4686|412.42|egular theodolites. furiously regular instructions haggle except the regular deposits. slyly +1653|54|4496|705.84| after the furiously special instructions. final, pending packages according to the carefully even deposits c +1653|95|3433|152.95|theodolites grow above the carefully final foxes. fluffily bold deposits boost fluffily pending grouches. ideas across the dogged accounts sleep slyly fluffily daring theodo +1653|36|5113|449.35|theodolites despite the furiously ironic requests sublate slyly regular requests. carefully final excuses use quickly regular platelets. silent, even pinto beans use quickly +1653|77|6982|995.35|according to the bold deposits. furiously final reques +1654|55|6730|630.17|n theodolites. pending theodolites wake across the fluffily careful +1654|96|2295|21.78|lets. blithely final theodolites are fluffily. theodolites cajole bold, dogged accounts. slyly ironic accounts according to the fluffily unusual ideas use along the fluffily even plat +1654|37|595|745.48| fluffily quickly bold accounts. blithely regular asymptotes haggle slyly according to the +1654|78|3375|911.21|ns! express packages nag fluffily after the quickly ironic requests. even frays wake according to the even patterns. regular requests might are about the requests. quickly +1655|56|4921|197.34|ar packages wake furiously. ironic packages integrate. ideas around the regular excuses boost furiously idle packages. requests across the regular dinos affix slyly regular requests. ide +1655|97|2952|321.83|. ruthlessly ironic theodolites haggle busy theodolites. final, special theodolites haggle car +1655|38|5431|608.07| haggle slyly blithely regular platelets. furiously express requests above the express foxes cajole final, even courts. furiously bold requests engage silently after th +1655|79|497|162.22|ans sleep slyly. furiously regular theodolites sleep since t +1656|57|4426|397.45|onic Tiresias nag above the slyly even dependencies. blithely silent accounts haggle carefully slyly even dependencies. fluffily regular courts integrate furiously final, regular t +1656|98|4184|805.17| special accounts integrate carefully among the regular requests. express dependencies against the perm +1656|39|9771|146.18|decoys use slyly alongside of the fluffily unusual ideas. silent ideas nag. fluffily ironic deposits can boost. tithes hang slyly careful +1656|80|7026|542.37|iously alongside of the bold foxes. furiously final instructions wake regular, even deposits: ironic, final requests wake quickly regular accounts. doggedly final d +1657|58|5372|931.55|s sleep furiously at the regular deposits. carefully express ideas cajole blithely about the furious +1657|99|6916|403.47| furiously sometimes express accounts. carefully regular instructions cajole carefully alongside of the regular dependencies; careful +1657|40|8131|91.07|ent foxes sleep! furiously even foxes cajole along the bold, even instructions. furiously regular packages nag around the furiously regular theodolites. blithely bold foxes s +1657|81|2164|377.34| requests are bold accounts. ironic, unusual deposits use blithely ironically enticing courts. carefully r +1658|59|6265|487.77|ronic packages sleep blithely pending attainments. carefully even foxes cajole always. express deposits about the final deposits wake blithely after th +1658|100|557|373.90|xes hang furiously among the carefully pending foxes. carefully permanent platelets use care +1658|41|7307|589.27|lets run furiously ironic excuses. bold accounts sleep blithely before the ev +1658|82|5517|968.84| asymptotes eat furiously quickly regular attainments. carefully +1659|60|40|689.11|y special instructions boost slyly against the slyl +1659|1|9897|586.97|pending, unusual pinto beans are. final, regular foxes use slyly express, even foxes: furiously regular accounts cajole blithely among the +1659|42|3822|189.11| slyly final deposits are stealthily according to the +1659|83|1993|742.72| pending requests haggle quickly. carefully regular accounts are fluffily unusual requests. silent, ironic accounts cajole slyly. ruthlessly silent requests use alongside of the slyly fi +1660|61|2177|610.09|ackages. busy platelets alongside of the fluffily even theodolites cajole instructions. fluffi +1660|2|8409|251.15|bold ideas use above the express, express dolphins. ironic packages sleep furiously deposits. regular, special deposits along the ironic requests haggle carefully according to the sp +1660|43|9657|542.68|e slyly into the excuses. carefully final ideas dazzle quickly quickly final foxes. unusual accounts wake along the deposits. even packages wake about the ideas. pend +1660|84|9220|194.66|kages. express deposits haggle carefully after the fluffily ironic warthogs. blithely final foxes wake slyly along the pending deposits. furiously +1661|62|7554|97.14|beans. bold accounts detect carefully after the pending packages. f +1661|3|7928|553.20|o beans must affix furiously blithely final braids-- blithely ironic requests after the even accounts boost carefully at the unusual ideas. blithely even +1661|44|4959|139.78|nic asymptotes cajole fluffily above the regular ideas. carefully exp +1661|85|1973|850.18|ly final asymptotes boost blithely furiously regular theodolites. regular foxes affix +1662|63|2426|341.23|ously special packages haggle. slyly bold ideas above the even, regular depos +1662|4|5704|918.44|refully bold instructions wake ironic, final accounts. deposits are fluffily. ironic ideas cajole slyly. final platelets across the slyly special ideas use blithely after the fl +1662|45|6343|815.97|un beneath the blithely final theodolites. pinto beans sleep. b +1662|86|3306|799.32|arefully above the carefully regular theodolites. carefully even packages promise about the slyly even theodolites. even, ironic asymptotes nag furio +1663|64|5078|743.11|y unusual foxes throughout the blithely unusual packages boost furiously across the regular requests. pending deposits haggle slyly according to the regular deposits. foxes affix above the blithely +1663|5|4415|151.03| regular packages detect furiously at the ironic accounts. furiously final dependencies haggle blithely. closely even accounts above the unusual platelets use blithely after the express accounts. +1663|46|5479|117.76|out the quickly ironic accounts. carefully regular frets use boldly. slyly final dependencies are. regular accounts above the blithely even packages ought to wake quickly alongside +1663|87|4285|399.37| the carefully final dependencies haggle since the furiously pending packages. slyly final deposits haggle furiously about the furiously ironic requests. quickly ironic pinto beans wake blithely exp +1664|65|4636|192.61|furiously ironic deposits use above the daringly regular deposits. accounts integrate blithely quickly regular requests. final pi +1664|6|236|611.40|ual foxes run carefully final foxes; special packages use among the blithely final deposits. dogged ideas sleep blithely. furiously dogged instructions sleep against the +1664|47|1638|307.54|ironic accounts. blithely even requests kindle blithely. carefully regular instructions according to the express deposits are silent asymptotes. caref +1664|88|6847|231.37| excuses use fluffily regular deposits. regular pinto beans unwind permanently among the final, special packages. slyly express requests boost. blithely even packages nag blithely fluffily specia +1665|66|8722|736.45|s the final, even requests. quickly ironic theodolites among the final dependencies integrate fluffily +1665|7|377|988.35|en requests sleep fluffily across the instructions. blithely final deposits alongside of the fluffily even theodolites kindle after the busy deposits. slowly bold ideas cajo +1665|48|6025|902.21|sual asymptotes. permanently express theodolites cajole. blithely final deposits wake-- pending ideas boost quickly about the pending packages. carefully expre +1665|89|5628|735.20|ffily even packages according to the regular packages affix blithely carefully final deposits. even, pending excuses wake carefully ironic asymptot +1666|67|8186|23.39|, unusual packages integrate carefully above the silent epitaphs. regular +1666|8|3350|820.85| slyly furiously final courts. slyly pending packages above the final, special instructions nag +1666|49|8812|993.82|c ideas. slyly ruthless theodolites after the slyl +1666|90|454|898.47|. blithely regular ideas must have to are quickly express platelets. final foxes after the pending foxes integrate bol +1667|68|4987|791.16|ly silent requests across the evenly silent requests unwind furiously ironic, express platelets. furiously even ideas cajole furio +1667|9|7747|390.39|l dependencies. slyly silent requests haggle furiously about the furiously express ideas. blithely bold packages sleep. slyly express deposits wake slyly unusual, iro +1667|50|305|969.87|p furiously; evenly bold accounts after the ironic, special ideas print carefully special dependencies. requests nag bold asymptotes. furiously expres +1667|91|5303|999.36|instructions. slyly even accounts across the bold ideas hag +1668|69|5762|155.65|onic pinto beans are slyly special packages. carefully final accounts nag slyly. even accounts haggle ironic forges. carefully even platelets around +1668|10|4954|930.14|ong the slow, ironic foxes cajole finally pending theodolites. furiously final +1668|51|9903|570.94|nic deposits snooze about the special, ironic asymptotes. furiously silent deposits sleep. blithely ironic asymptotes was fluffily. carefully final dependencies are +1668|92|5911|505.09|uses wake daringly carefully regular foxes. bold, ironic requests boost furiously quickly bold ideas. regular packages cajole quickly after the deposit +1669|70|6987|653.05|long the quickly ironic requests. carefully unusual waters sleep instructions. silent pinto beans after the furiously express packages sleep ironically enticing, final asymptotes. flu +1669|11|8709|1.48|g quickly carefully regular requests. blithely regular theodolites sleep quickly. pinto beans cajole furiously about the silent instructions: slyly enticing deposit +1669|52|3494|147.09| requests sublate. boldly regular foxes against the regular instructions use carefully according to the bold, even packages. carefully special deposits among the blithely regular dugou +1669|93|4738|869.22|ely at the slyly regular deposits. blithely bold packages run. careful packages hinder furiously. even dolphins cajole slyly abo +1670|71|7360|667.65|e doggedly special asymptotes. express escapades nag against the furiously final th +1670|12|7254|621.85|ual requests! furiously final ideas detect slow deposits. requests alongside of the bold, final requests will run slyly slyly even courts. daring +1670|53|883|967.21|cial instructions along the blithely even grouche +1670|94|533|267.96|egrate requests. slyly bold deposits ought to sleep blithely. bold, express instructions grow toward the even requests? slyly final theodolites along the carefully bold requests boost against the pa +1671|72|8199|377.35| slyly ironic theodolites are quickly. quickly special excuses affix +1671|13|2334|597.12|hely final deposits snooze doggedly against the special deposits. even packages wake. furiously ironic requests promise since the regular, special requests. +1671|54|626|929.31|gular accounts. fluffily final multipliers are bli +1671|95|3863|729.56|r foxes. ironic, final braids nag furiously express foxes. carefully bold packages cajole n +1672|73|2653|191.70|orges haggle. furiously regular accounts use. final frays wake around the even, even foxes. enticingly bold pinto beans affix carefully. final accounts nag +1672|14|8873|439.17|the ironic, special ideas. blithely ironic grouches sleep furiously. excuses wake! even, pending instructions believe quickly unusual requests. blithely special pinto bean +1672|55|3505|731.04|furiously pending deposits about the blithely unusual deposits boost unusual requests. furiously ironic deposits haggle furiously around the slyly regular requests. quickly thin packages detect st +1672|96|9977|108.15|ess ideas use quickly quickly silent ideas. dependencies cajole carefully. special, silent deposits wake blithely against the slyly final accounts. carefully ironic platelets caj +1673|74|7169|665.87|s at the carefully pending foxes mold doggedly across the furiously even deposits. slowly enticing accounts sublate. closely special ideas wake. fluffily pending accounts use carefully +1673|15|6747|570.37|totes. final, final theodolites according to the express packages haggle unusual foxes! pinto beans sleep among the ac +1673|56|82|930.63|ing to the carefully unusual packages. slyly pending pinto beans cajole quietly. blithely unusual foxes haggle thinly after the ir +1673|97|6539|818.96|ial instructions. slyly even pinto beans are quickly. fluffily bold pinto beans after the closely dogged dependencies wake among th +1674|75|7560|232.58| sleep. furiously silent pinto beans sleep enticingly furiously silent pinto beans. silently final dolphins integrate slyly final excuses. furiously silent deposits sleep aga +1674|16|974|147.46|ing instructions. quickly final requests haggle beyond the ironic ex +1674|57|6723|44.67|use slyly above the furiously regular requests. even, bold accounts around the slyly special asymptotes sleep according to the brave pinto beans. unusual, ironic dolphins about +1674|98|8998|800.09|es. special, regular dolphins maintain furiously furiously final deposits. slyly unusual courts are silently. clo +1675|76|2696|707.52|e blithely across the final, final packages. carefully express +1675|17|2914|365.34|ts mold. slyly ironic asymptotes into the never fin +1675|58|4953|577.91|ilent requests cajole quickly. silent instructions nod. slyly permanent req +1675|99|2482|883.78|e silent accounts run slyly against the requests. carefully special depende +1676|77|3064|588.22|ackages boost above the fluffily final packages. quickly ironic instructions impress-- bold, even packages wake carefully furiously regular requests. special, regular deposit +1676|18|6199|284.92|oze. carefully regular instructions wake along the always express foxes. final, pending asymptotes are blithely after the blithely iron +1676|59|4718|666.90|f the packages. carefully even deposits are quickly after the unusual, ironic requests? carefully final escapades might wake according to the unusual accounts. care +1676|100|3708|955.28|. requests would use blithely. final accounts wake fu +1677|78|8745|553.60|ly regular requests boost slyly. express dependencies wake closely abov +1677|19|8987|835.93|es. ironic accounts wake fluffily blithely even packages; foxes boost quickly. blithely final d +1677|60|2565|710.26|kly. express deposits integrate blithely fluffily even ideas. blithely special deposits against the final requests are about +1677|1|5189|436.41|ructions. slyly pending platelets after the furiously ironic asymptotes sleep behind the slyly unusual packages. daringly ironic theodolites alongside of the unusual foxes cajole fur +1678|79|3942|288.00|osits about the carefully regular grouches are carefully alongside of the bold, even requests. platelets are around the unusual pinto beans. fluffily even +1678|20|5050|487.70|sely brave foxes integrate around the carefully special ideas. blithely unusual requests wake regular accounts. pending, express requests poach carefully. express theodolites +1678|61|3578|139.65|ular Tiresias. final realms sleep furiously among the blithely b +1678|2|7120|739.19|lithely ironic instructions across the enticingly regular accounts detect fluffily around the slyly final dependencies. blithely ironic theodolites dazzle about the quickly final requests. +1679|80|1159|75.44|o the quickly regular grouches. instructions sleep. express requests boost around the slyly enticing deposits. pi +1679|21|9033|428.11|eans boost deposits. carefully regular ideas are. foxes nod about the fluffily silent requests. blith +1679|62|6788|612.28|al deposits wake blithely final ideas. slyly final deposits sleep. fluffily express ideas wa +1679|3|4304|99.86|he packages use furiously fluffily even requests. theodolites kindle alongside of the pending asymptotes. dugouts for the regular war +1680|81|2660|254.76|nic accounts. furiously even ideas haggle carefully. carefully silent asymptotes against the final foxes integ +1680|22|6418|242.07|ilent dependencies hang accounts. realms nag special packages. unusual theodolites thrash alongside of the slyly final epitaphs. final packa +1680|63|5900|790.63|play slyly. quickly final depths snooze. final, bold dependencies among the carefully silent foxes doubt carefully along +1680|4|3680|628.04|y pending foxes. frets after the express instructions engage according to the ironic, fin +1681|82|7466|261.40| bold dinos. special excuses affix quickly above the fluffily final deposits. bli +1681|23|7206|993.64|ly final ideas-- regular, bold deposits are carefully according to the blithely regular pinto beans. bold ideas boost blithely. bo +1681|64|9770|895.92|ongside of the regular, sly ideas. slyly final deposits are quickly after the dependencies. quickly pending foxes haggle special ideas. pending multipl +1681|5|2300|976.24|gular asymptotes. quickly silent foxes wake. regular att +1682|83|6500|186.75|regular packages. fluffily regular deposits dazzle. unusual asymptotes detect. blithely regular deposits are. fluffily silent accounts cajole carefully after the quickly unusu +1682|24|5054|140.83|gular ideas. blithely regular dolphins sleep carefully about the quickly even instructions? deposits sleep alongside of the even, special pinto beans. packages haggle carefully reg +1682|65|1216|513.05|beans across the carefully final theodolites cajole above the quickly ironic accounts. blithely express asymptotes detect furiously silent accounts. +1682|6|7985|558.22|al packages are carefully alongside of the ironic, ruthless asy +1683|84|7039|498.78|pecial pinto beans. bold requests across the blithely even ideas use slyly blithely ironic pinto beans. requests integrate quickly fluffily even dependencies. blithely regular deposits wa +1683|25|2347|516.69|o beans nag slyly. foxes are blithely about the fluffily close accounts. special, unusual pinto beans above the permanently regul +1683|66|9032|835.14|ts: deposits along the slyly even foxes wake blithely special requests. fluffily pending accounts wake furiously after the carefully silent foxes. fluffily express deposits wake epita +1683|7|4986|397.24|l deposits according to the slyly special decoys wake fluffily across the ironic, quick dependencies. slyly ironic asymptotes wake fluffily. furiously ironic ideas sleep carefully above the iro +1684|85|581|346.62| final packages. furiously regular instructions cajo +1684|26|59|652.53|blithely pending ideas wake around the furiously express instructions. slyly regular dolphins are carefully alongside of the blithely bold pinto beans. express requests haggle across the bli +1684|67|365|169.70|fully beyond the furiously special excuses. carefully even excuses boost furiously alongside of the accounts. slyly final accounts maintain. pending, ironic excuse +1684|8|4217|250.72|ress foxes breach. carefully bold courts across the thinly ironic asymptotes sleep furiously blithely unusual tithes. final forges are carefully pinto beans. quickly ironic theodolites should sleep- +1685|86|1986|333.15|ily after the regular, ironic accounts; furiously pending dependencies are carefully even instructions. express, bold requests wake fluffily among the pending accounts. final, regular sauternes p +1685|27|6066|137.36| slyly regular attainments. enticingly regular requests according to the slyl +1685|68|6368|162.61|unts. furiously final requests sleep carefully above the slyly final requests +1685|9|7962|7.06|al, final instructions haggle. ironic excuses after the daringly special deposits haggle furiously ca +1686|87|2801|100.27|foxes boost about the ironic excuses. carefully even accounts boost against the quickly ironic platelets. fluffily bold deposits wake pinto beans. slyly express foxes across the +1686|28|708|239.79|. special, thin packages around the fluffily unusual pinto beans boost throughout the slyly regular asymptotes. regular, even deposits a +1686|69|5941|323.30|ly express accounts. fluffily ironic dolphins haggle around the unusual pinto beans. bold, special deposits ought to haggle slyly. silent, unusual theodolites grow carefully dependencies. +1686|10|8712|274.39|furiously ironic packages integrate furiously requests. fluffily pending ideas wake against the ironic acc +1687|88|4625|494.97|ng deposits use slyly. instructions haggle blithely above the foxes. care +1687|29|9032|422.33|ns are about the fluffily pending foxes; express ideas across the quickly ironic patterns sublate blithely after the requests. ex +1687|70|5644|411.14|ites detect about the regular courts. unusual ideas sleep carefully even pains. final dolph +1687|11|2608|75.57|c packages. furiously express foxes haggle blithely around the slyly final instructions. furiously special accounts haggle blithely. blithely fina +1688|89|6429|699.72|sly pending deposits. furiously even instructions affix carefully around the never pending p +1688|30|5116|191.07|inal packages x-ray along the always regular deposits. regular, ironic deposits cajole. q +1688|71|4638|745.78|lets. furiously pending pinto beans across the fluffily final requests cajole above the final platelets. foxes are daringly. carefully express deposits nag f +1688|12|8215|966.25|pecial deposits. final, pending excuses wake sometimes between the silent, unusual ideas. carefully special foxes sleep. slyly regular requests sleep carefully +1689|90|8437|112.48|al pains are blithely against the furiously unusual epi +1689|31|8767|577.21|ts haggle quickly ironic pinto beans. pinto beans maintain against the quickly ironic platelets. even accounts wake fluffily. r +1689|72|5050|22.11|usual foxes wake. slyly regular requests according to the requests cajole furiously ironic dependencies. slyly ironic accounts about the regular depe +1689|13|544|184.68|requests-- bold, final gifts above the slyly even ideas are furiously against the quietly even foxes. blithe +1690|91|443|230.86|uriously final foxes: carefully regular asymptotes wake among the c +1690|32|3424|158.65|deposits nag besides the carefully pending deposits. ironic, unusual packages sleep carefully above the carefully special ideas. furiously pending packages nag fluffily. +1690|73|7069|261.02|ven instructions among the quickly regular instructions use alongside of the enticingly unusual multipliers. final, regular asymptotes thrash fluffily furiously silent packag +1690|14|5551|487.44|egularly even excuses run furiously. fluffily final sentiments might nag slyly. blithely express instructions sleep along the ir +1691|92|1344|746.69| against the blithely bold requests. carefully regular accounts doubt slyly packages. final, bold requests haggle blithely pending accounts. ironic, express accounts cajole. ironic, +1691|33|7226|312.92|ss accounts. slyly special ideas solve furiously according to the blithely final platelets-- ironic accounts dazzle furiously foxes. regular, final account +1691|74|4876|722.24|ly even pinto beans wake quickly express excuses. carefully final excuses eat along the furiously pending deposits. express dependen +1691|15|7027|49.54|ans haggle furiously. slyly regular asymptotes at the +1692|93|8019|786.53|gle final accounts. carefully ironic asymptotes haggle daringly along the boldly ironic requests. final foxes sleep. slyly regular decoys use quickly! quickly express accounts after the furious +1692|34|4391|511.15|quickly dogged asymptotes. deposits haggle about the slyly +1692|75|1033|592.64|ptotes according to the final theodolites are furiously at the instructions. ironic requests cajole furiously. blithely express accounts use quickly. slyly +1692|16|983|712.02| ironic dugouts. slyly even theodolites sleep fluffily ab +1693|94|1459|985.78|ular, final deposits! express instructions cajole fluffily sheaves. theodolite +1693|35|3702|672.78|ounts. multipliers haggle ironic dependencies. carefully bold requests cajole blithely special instructions. carefully s +1693|76|2665|923.80|nal deposits cajole slyly. deposits integrate after the furiously pending dolphins. b +1693|17|292|21.77|encies sleep carefully bold deposits. final requests use. furiously unusual r +1694|95|4014|538.94|p. escapades sleep across the furiously regular dependencies. quickly quiet deposits are alongside of the blit +1694|36|7465|209.70|ly brave accounts. carefully final dependencies sleep slyly. stealthy, bold pinto beans +1694|77|2959|127.22|riously pending deposits are blithely bold courts. furiously pending th +1694|18|3120|619.65|ackages. final ideas haggle carefully bold requests. slyly regular deposits haggle blithely along the unusual platelets. carefully even braids poach. carefully fi +1695|96|8147|29.30|ly ironic Tiresias play blithely even packages. accounts wake during the even theodolites. even, bold accoun +1695|37|1455|136.38|carefully quickly even theodolites. furiously ironic requests haggle +1695|78|4264|666.60|edly special deposits. carefully silent accounts use atop the express accounts. blithely special requests beyond the pending, ironic deposits boost abo +1695|19|9154|914.70|y against the fluffily express dependencies? blithely bold deposits sleep: notornis wake +1696|97|6084|851.62|ly regular accounts are above the slyly unusual theodolites. silent, regular packages about the +1696|38|4554|694.68| furiously silent, final deposits. slyly silent somas maintain furiously despite the carefully regular asymptotes. quickly even packages grow blithely along the unusual, regular +1696|79|3998|341.26|g deposits. slyly final theodolites among the slyly ironic hockey players cajole after the carefully final dolphins. even, unusual foxes hagg +1696|20|6697|500.49|telets. asymptotes sleep busily unusual Tiresias. regular, bold accounts use since the ironic pinto b +1697|98|2464|310.27|ideas. furiously unusual packages cajole ruthlessly after the carefully +1697|39|4240|120.72|e furiously hockey players: slyly regular epitaphs use across the carefully even accounts. final Tiresias sleep blithely blithely final ideas. regular accounts are carefully. stealth +1697|80|7503|245.46|bold requests about the brave requests thrash even, final requests. blithely final requests affix carefully pending accounts? requests along the blithely even +1697|21|3912|813.16| the carefully unusual requests boost blithely across the furi +1698|99|518|507.22|s requests sleep among the final pinto beans. theod +1698|40|4565|613.90|wake about the pending deposits. regular, regular requests boost furiously around the carefully regular foxes. carefully regular packages +1698|81|8881|381.58|es cajole blithely. carefully dogged theodolites against the slyly bold requests affix carefully blithely express ideas. carefully final packages ab +1698|22|2282|882.13|le idly even ideas. blithely regular foxes cajole blithely stealthy depo +1699|100|2775|878.92|phins wake quickly ironic dependencies. packages nag. ironic deposits maintain quickly. fluffily busy pinto beans sleep quickly regular asymptotes. requests sleep blithely a +1699|41|518|954.55|ly carefully pending packages. slyly final deposits haggle furiously. slyly ironic requests integrate excuses. fluffily even excuses are furiously. slyly special foxes play +1699|82|2541|203.50|ily blithely final deposits. even, final excuses according to the pending, special sentiments are boldly along the carefully iro +1699|23|7425|840.12| final deposits mold against the slyly final packages. ideas haggle above the carefully regular foxes. blithely silent foxes are blithely about the court +1700|1|2073|198.45|g. quickly pending accounts haggle slowly during the furiously even requests. carefully pending platelets are slyly furiously pending requests. slyly express accounts wake furious +1700|42|813|843.42|he blithely special packages. blithely express foxes sleep around the ironic ideas. blithely pending courts nag slyly along t +1700|83|2978|751.94|osits against the carefully bold foxes nag carefully along the furiously silent foxes. carefully pending packages haggle. blithely express accounts haggle slyly. carefully sly accounts caj +1700|24|3420|629.82|blithely even theodolites. slyly regular theodolites haggle furiously express instructions. blithely ironic instructions pr +1701|2|6042|100.81|platelets. foxes must have to detect except the quickly silent requests. fluffily final hockey players must have to affix slyly idle instr +1701|44|6193|200.08|lithely express dolphins under the quickly special warthogs haggle slyly carefully +1701|86|3247|306.20|theodolites. slyly regular packages at the furious, unusual s +1701|28|9232|695.25|efully. special theodolites use even deposits: quickly final packages believe blithely into t +1702|3|3762|857.64|iously around the ironic, special accounts; bold platelets detect quickly. furiously regular theodolites use. blithely bold requests sleep unusual, regular theodolites. carefully regular wartho +1702|45|2638|976.55|ns. regular foxes at the carefully ironic dependencies lose quickly even, unusual dependencies. blithely final pinto beans wake slyly. carefully bold requests play never. instructions aga +1702|87|8839|404.39|uriously idle foxes among the ironic foxes nag sly +1702|29|8750|515.35|s nag blithely against the special, ironic instructions. blithely special pinto beans poach at the pe +1703|4|7638|337.13|sublate blithely regular dugouts. blithely unusual platelets unwind carefully ideas. unusual, even deposits cajol +1703|46|9728|60.31|ecial ideas. sauternes are along the slyly even theodolites. blithely ironic instructions are bravely. quickly idle packages are carefully +1703|88|2870|948.28| pinto beans cajole. blithely stealthy deposits use pinto beans. courts +1703|30|7164|824.87|egular accounts. unusual, busy instructions after the requests +1704|5|1454|528.12|ongside of the furiously regular theodolites. carefully final pinto beans sleep carefully special realms. +1704|47|4214|183.06|y. furiously final accounts haggle slyly ironic packages. fluffily regular realms wake carefully. final, unusual instructions at the quickly final foxes detect carefully after the carefully quick i +1704|89|7757|939.10| hinder carefully regular foxes. silent accounts boost above the furiously quick requests. quickly even deposits haggle blithely after the unusual deposits. slyly express dependencies accord +1704|31|1034|341.25| even theodolites at the fluffily even deposits are special ac +1705|6|7127|388.05|arefully express, ironic theodolites. fluffily ironic ideas across the regular deposits boost blithely according to the slyly f +1705|48|8923|664.99|lly bold sheaves integrate across the special accounts. never ironic requests boost furiously at the ironic accounts? furiously +1705|90|3916|759.95|mong the final dependencies-- regular foxes wake furiously special deposits. fluffily bold requests nag carefully carefully ironic requests. expres +1705|32|744|397.76|furiously. final accounts haggle. regular, unusual requests affix carefully. even accounts nag quickly. express tithes near the blithely express deposits will boost fu +1706|7|7877|88.23|ding instructions thrash across the carefully regular decoys. ironic requests are carefully blithely final foxes. accounts nag! regular dolphins haggle-- dep +1706|49|5213|655.02|s x-ray against the furiously final accounts. slyly even r +1706|91|1570|65.82|counts. regular packages after the furiously dogged dolphins cajole carefully thinly ironic ideas. furiously regular dependencies about the special deposits are slyly above the slyly even +1706|33|1886|627.85| dinos haggle! final deposits above the fluffily regular excuses impress regular ideas. iro +1707|8|2539|920.48|s across the regular theodolites shall have to cajole alongside of the regular deposits. bold requests cajole alongside of the bli +1707|50|2000|61.20| integrate slyly about the blithely final instructions. carefully ironic accounts haggle slyly against the unusual, even accounts. regular packages would nod furiously a +1707|92|3375|811.31|hely even ideas. fluffily bold foxes haggle blithely. express, pending instructions nod after the fluffily unusual dolphins. silent warthogs +1707|34|1551|476.38|special, pending packages across the special accounts detect around the unusual, special excuses. blithely ironic theodolites above the asymptotes wake quickly accoun +1708|9|2781|727.59|requests. carefully bold packages haggle. even, bold theodolites wake blithely according to the carefully final multipliers. final platelets +1708|51|1780|17.10|e requests use slyly against the enticing deposits. blithely regular requests need to are +1708|93|5750|12.47|the slyly regular frays cajole ironic tithes. blithely close dolphins cajole slyly. doggedly even theodolites use carefully ironic braids. theodolites use quickly carefully pendin +1708|35|4854|134.07|tions. never unusual foxes sleep furiously. regular requests doubt carefully after the slyly even pinto beans. accounts in +1709|10|359|830.33|ake quickly pending accounts. carefully permanent courts boost blithely eve +1709|52|2360|392.90|usual packages. quickly ironic pinto beans boost closely. ruthlessly bold requests promise fluffily pending theodolites. carefully +1709|94|7879|299.51|requests was. carefully ironic instructions are bravely blithely ironic deposits. slyly +1709|36|340|48.24|nusual packages cajole blithely pending packages. carefully iro +1710|11|8155|829.32|gular requests affix slyly. fluffily bold ideas nag furiously: +1710|53|2137|379.74|sts cajole against the furiously regular ideas. blithely regular pin +1710|95|1474|903.52|tly. slyly ironic instructions cajole blithely ironic accounts. slyly even platelets +1710|37|2587|796.77|st. deposits dazzle carefully. fluffily express packages affix closely according to the final foxes. final platelets w +1711|12|3805|789.03|gle idly. furiously even requests nag slyly evenly regular asymptotes. slyly permanent pinto beans promise carefully along the quickly final pinto beans. ironic requests are after the c +1711|54|6727|574.15|ounts sleep about the carefully regular dependencies. +1711|96|6614|512.77|according to the bold attainments. regular excuses affix furiously. slyly silent requests cajole. idly even accounts against the fluffily unusual theodolites sleep carefully around the careful +1711|38|3115|939.69| even deposits. express, regular foxes use carefully blithely regular deposits. carefully bold accounts affix carefully. the +1712|13|5058|338.60| blithely regular deposits hang sometimes final requests. dogged, regular dolphins +1712|55|5043|706.01|riously pending dependencies about the regular war +1712|97|9725|858.52|s; unusual packages will have to use. unusual pinto beans sleep final, bold deposits-- ideas haggle among the slyly fin +1712|39|2717|769.26|re along the unusual packages. boldly ironic requests cajole slyly? carefully regular courts after the blithely final accounts are about the slyly special instructions! blithely +1713|14|4080|5.08|p quickly besides the quickly final pinto beans. regular, regular pinto beans above the carefully bold ideas are carefully unusual, final sentiment +1713|56|6315|800.47|tegrate about the blithely regular deposits. accounts cajole +1713|98|3266|71.99|ounts sleep packages. final requests use. blithely bold pinto beans integrate carefully along the ironic excuses. regular packages cajole carefully within the dolphins. fluffily unusual +1713|40|8091|423.88|equests. furiously regular deposits detect silent packages; express, ironic dependencies cajole furiously to the quickly close package +1714|15|2397|422.49|eans are furiously quickly sly foxes. ironic pinto beans sleep. express deposits from the express epitaphs nag blithely bold packages; express, express accounts wak +1714|57|4877|148.97|ts. bold, bold instructions boost carefully even deposits. furiously pending pinto beans cajole slyly above the ironic gifts. asymptotes detect according to the blithely spe +1714|99|4467|546.48|posits haggle stealthily slyly final requests. even instructions after the regular, spec +1714|41|3103|130.33|bove the slyly ironic packages detect quickly after the brave requests. furiously bold packages use slyly. slyly regular decoys use fluffily carefully final accounts. enticingly exp +1715|16|3034|961.30|ly along the furiously ironic accounts. furiously even instructions detect. furiously final ideas wake quickly special +1715|58|2194|864.87|e express dependencies? blithely slow foxes use. final platelets was flu +1715|100|830|481.56|ut the blithely special ideas. waters breach theodolites. carefully regular deposits snooze quickly above the furiously regular deposits. fluffily silent packages along the blith +1715|42|2820|801.06|ithely regular platelets against the slyly fluffy packages affix blithely blithely regular requests. carefully express deposits boost carefully according to the c +1716|17|6195|987.25| ironic platelets. quickly ironic platelets integrate carefully above the slyly express attainments. special deposits ha +1716|59|8619|432.20| above the final requests. carefully regular requests nag carefully alongside of the unusual requests. carefully express pinto beans ab +1716|1|6627|477.77|ests. blithely unusual pinto beans affix quickly about the furiously even requests. regular, special ideas are furiously +1716|43|469|39.23|e the furiously final packages wake carefully by the packages. unusual, final foxes affix. sl +1717|18|9879|291.88| platelets. accounts nag furiously until the regular requests. pending packages use blithely. furiously bold excuses haggle slyly after the furiou +1717|60|939|797.93|the ironic pinto beans nag furiously pending requests. regular acc +1717|2|2016|431.46|special, unusual packages cajole blithely regular dependencies. carefully ironic deposits eat furiously under the ironic foxes. quickly unusual deposits cajole. blithely regular warthogs maintain +1717|44|3779|39.25| boost carefully after the blithely regular accounts. regular packages sleep furious +1718|19|4223|613.55|n about the slyly unusual theodolites. closely unusual accounts +1718|61|8456|394.48|press asymptotes haggle. fluffy, unusual grouches are carefully idle ideas. regular, regular requests against the unusual, quick packages sublate around the pinto b +1718|3|606|789.67|eodolites. daring gifts wake in place of the furiousl +1718|45|4288|364.01|refully final deposits doze furiously. doggedly unusual attainments boost always caref +1719|20|4809|190.88|egular courts use. blithely regular packages haggle carefully. blithely even excuses above the blithely bold deposits unwind furiously bl +1719|62|6903|594.16|lyly unusual requests. express ideas among the furio +1719|4|5564|252.76|eas. slyly even dugouts after the quickly ironic pinto beans are carefully silent theodolites! special requests sleep across th +1719|46|6075|537.15|cross the carefully special instructions lose blithely express packages. fluffily final depo +1720|21|8996|124.38|. special requests among the pending, final asymptotes cajole about the slyly regular requests. enticing requests against the slyly final accounts are carefully w +1720|63|7653|794.40|efully according to the pinto beans. carefully special ideas integrate carefully carefully regular accounts. carefully final asymptotes sublate. carefull +1720|5|4005|911.07|ptotes boost across the carefully pending tithes. slyly ironic theodolites snooze along the slyly pending accounts. regular, pending d +1720|47|92|845.81|alongside of the regular deposits. special deposits affix furiously. unusual requests haggle slyly across the regular deposits. blithely even Tiresias cajole quick +1721|22|70|868.95|play furiously fluffily final deposits. slyly stealthy pinto beans after the blithely final accounts nag furiously along the pinto beans. ironic, regular braids affix furiously above the reque +1721|64|404|126.26|sts. carefully ruthless requests boost blithely unusual packages. quickly special realms sleep about the ironic theodolites. accounts according to the blithely pending t +1721|6|7910|376.73|he quickly busy pinto beans. packages cajole slyly blithely ironic foxes. accounts haggle regular accounts. bold instructions are furiously carefully enticing deposit +1721|48|2602|242.06|round the slyly ironic accounts. requests snooze furiously. slyly special deposits use p +1722|23|7912|626.00|to the blithely pending asymptotes can nag permanently along the carefully bold requests. furiously express requests sleep. regular dinos about the carefully +1722|65|8485|836.63|s before the slyly regular instructions use quickly against the idly express theodolites. carefully pending requests shall thrash fur +1722|7|5739|479.92|usly silent dependencies. blithely final packages nag carefully. fluffily regular pinto beans wake. fluffily express requests m +1722|49|3738|198.60|ions. ideas haggle against the pending, even requests. blithe foxes nag against the c +1723|24|9695|416.68|latelets. packages are carefully above the instructions. ironic, busy packages a +1723|66|5563|353.27|sleep furiously. fluffily ironic accounts integrate blithely furiously +1723|8|4948|567.89|thely unusual requests. furiously pending pinto beans +1723|50|107|286.34|gle blithely ruthless packages. asymptotes snooze accounts. carefully regular requests cajol +1724|25|5974|568.57|th the furiously even pinto beans. ironic asymptotes are slyly among the even requests. ironic dolphins will have to run. slyly ironic acco +1724|67|8800|729.74|special foxes are furiously evenly even pinto beans. express packages breach +1724|9|4278|95.93|he slyly ironic packages boost special, sly packages. express, final accounts are even packages. fox +1724|51|5366|166.49|its lose quickly regular requests. bold accounts against the bravely even requests use blithely atop th +1725|26|2522|198.48|, unusual dependencies sleep. silent packages cajole carefully acr +1725|68|9030|412.30| frays wake carefully carefully regular tithes. silent foxes maintain furiously even theodolites. carefully ironic somas integrate quickly daring requests. furiously ironic accounts u +1725|10|8368|604.71|xpress pinto beans. furiously unusual pinto beans about the slyly regular instructio +1725|52|5746|755.46|n, regular instructions. blithely final pinto beans would play. bold instructions boost carefully alongside of the final pains. slyly pending deposits through the q +1726|27|6956|776.52|ending dolphins against the ideas cajole quickly ironic theodolites. carefully even re +1726|69|855|150.12|y ironic accounts haggle carefully ironic pinto beans. requests among the furiously even depths boost quickly de +1726|11|6167|749.38|ular excuses. carefully ironic instructions haggle after the deposits. final accounts haggle across the furiously even packages. final packages detect along the even dependencies. furiously even i +1726|53|1592|639.87| accounts nod furiously quickly regular ideas. regular packages nag always among the foxes. fluffily regular deposits run carefully. slyly final ideas across the regular accounts affix q +1727|28|4810|160.45|s must have to hang. express requests sleep across the slyly regular dolphins. slyly regular requests use along the furiously pending deposit +1727|70|8682|633.44| lose carefully special packages. slyly even excuses wake slyly carefully unusual ideas. fluffily final foxes breach blithe +1727|12|8921|19.19|the quickly ironic ideas. slyly regular dependencies are at the carefully final pinto beans. slyly +1727|54|4566|38.71|xpress ideas across the furiously ironic ideas haggle boldly quickly unusual pinto beans. slyly pending patterns amo +1728|29|584|586.82|lithely quickly bold deposits. slyly ironic ideas across the furiously pending foxes cajole carefully carefully special deposits. regular platelets haggle special, ironic ideas. silent packag +1728|71|2322|734.66|, silent ideas sleep fluffily. furiously express warthogs thrash slyly dinos. th +1728|13|3629|989.77|gly regular theodolites. even accounts x-ray blithely according to the slyly final theodolites. quickly pending ideas along the pending dolphins unwind carefully iron +1728|55|5849|850.32|regular, express foxes haggle carefully about the carefully pending gifts. express pinto beans are slyly. +1729|30|4803|712.38|ial, pending deposits. ironic, regular deposits affix blithely. dinos integrate according to the slyly ironic packages. quickly ironic deposits alongside of th +1729|72|6442|105.20|riously. deposits sleep. regular foxes alongside of the quickly bold foxes haggle furiously around the slyly express +1729|14|1302|74.62|ular theodolites are deposits. blithely special Tiresias nag blithely. furiously regular deposits slee +1729|56|2183|586.56|dly pending dependencies according to the deposits +1730|31|9792|273.56|es against the blithely bold requests haggle according to the regular ideas; blit +1730|73|8850|506.44|ages. quickly bold foxes use after the foxes. blithely bold pinto beans serve. bold, even requests play +1730|15|3008|435.92|quickly ironic platelets mold about the packages. closely +1730|57|6776|948.74| ideas among the bold pinto beans nag fluffily thin dependencies. busy, unusual ideas against the carefully express +1731|32|9393|551.26|ely boldly pending ideas? furiously even requests against the regular foxes wake final asymptotes. final, ironic asymptotes among the even, regular packages sleep +1731|74|69|448.81|pendencies eat furiously bold, ironic deposits. quickly ironic requests would cajole blithely ironic deposits. furiously even instructions use ruthlessly +1731|16|7460|955.91|yly ironic ideas around the express platelets are against the pending, quick platelets. regular accounts sleep blithely f +1731|58|9179|222.19|fily according to the blithely regular deposits. ironically +1732|33|4552|363.10|bout the blithely express depths. deposits are furio +1732|75|8770|925.63|lly regular, final dependencies. thinly special theodolites haggle around the regularly pending ideas. silent requests wake blithely silent requests +1732|17|5382|686.69|leep above the furiously ironic requests. even requests sleep about the slyly ironic foxes. regular ideas wake. b +1732|59|9568|898.52|e fluffily pinto beans. express, pending theodolites are furiously. fluffily even packages haggle carefully among the final packages. +1733|34|1199|695.64|odolites. silently express theodolites above the regular waters haggle carefully carefully final requests. quickly even theodolites among the carefully unusual theodolites +1733|76|2253|502.46|ts. accounts use. carefully unusual requests haggle blithely across the bold forges. special foxes about the slyly ironic foxes haggle across the quickly bold theodolites. finally regular instru +1733|18|5770|454.60|g accounts detect among the slyly unusual instructions. carefully unusual asymptotes sleep +1733|60|5644|233.41| haggle after the final, ironic instructions. ironic accounts against the unusual hockey players are daringly stealthy accounts. pearls haggle despite the blithely ironic accounts. blit +1734|35|2645|139.32|ideas along the furiously even instructions haggle across the final deposits. furiously regular deposi +1734|77|3865|197.56|the silent accounts. silently bold deposits detect? fluffily final orbits nag. slyly pending pinto beans boost against the regular, regular acc +1734|19|9353|905.32|requests are according to the blithely regular instructions. regular, final +1734|61|2399|75.60| even frets. even sentiments are along the furiously quick d +1735|36|9514|108.36|tructions nag furiously. quickly special packages solve carefully. slyly special asymptotes affix slyly special requests. blithely bold p +1735|78|2873|308.15|ly ironic foxes along the blithely quick theodolites use blithely ironic deposits. blithely pending deposits nag according to the bold, special platelets. bold dolphins should have to s +1735|20|3170|496.31|blithely about the even, regular platelets. daringly bold packages integrate among the blithely unusual dependencies. blithely ironic packages after t +1735|62|3235|67.72|stealthily ruthless deposits nag blithely slyly unusual ideas. warhorses above the quickly bold deposits are slyl +1736|37|788|530.29|e carefully against the quickly bold instructions. pending theodolites among the quickly final foxes are quickly according to the fluffily ironic r +1736|79|8928|671.17|urts. quickly unusual requests wake fluffily after the special deposits: regular ideas along the quickly reg +1736|21|2729|833.50|ges are after the even frets. fluffily fluffy theodolites sleep carefully slyly final accounts. daringly silent accounts wake carefully fluffily express accounts. furiously ironic ideas abov +1736|63|4686|832.64|st furiously across the courts. slyly ironic theodolites run furiously against the express tithes; furiously silent foxes try to affix quickly +1737|38|9256|386.71|furiously final theodolites boost blithely furiously unusual accounts. fluffily unusual accounts sleep quic +1737|80|6253|176.84|eans nag slyly regular, pending deposits. quickly fluffy requests haggle accounts. express instructions haggle. ironically final packages among the blithely bold instructions nag f +1737|22|2238|292.30|ymptotes. ironic requests sleep furiously about the carefully special asymptotes. final, pending requests boost permanently blithely regular asymptotes. furiously special pinto bea +1737|64|1547|817.92|ggle. even orbits except the final, final packages cajole carefully after the fluffily express excuses. ideas haggle slyly. dependencies sleep fluffily? final, even deposits aro +1738|39|8410|618.03|blithely silent accounts. blithely express theodolites nag after +1738|81|4740|833.10|sly final requests are quickly. dependencies are. quickly regular deposits haggle blithely. quickly ironic packages sle +1738|23|3283|105.58| are slyly quick, regular platelets. carefully special packages snooze quickly according to the slyly bold accounts. final foxes sleep above the quickl +1738|65|9869|557.72|es. furiously ironic requests sublate fluffily after the carefully express i +1739|40|2391|173.72|al accounts run carefully. even foxes detect blithely blithely final platelets. deposits are. bold foxes s +1739|82|7364|878.81|final grouches across the furiously special dolphins boost at the slyly express requests. fur +1739|24|3120|118.31|s the carefully regular deposits. slyly ironic deposits wake regular t +1739|66|847|732.58|s. quickly even dependencies sleep blithely. even theodolites about the ironically even deposits poach after t +1740|41|6508|869.63|ctions affix furiously. regular, express packages haggle; quickly even accounts believe furiously along the carefully regular dolphins. requests at the furiously regular tithes +1740|83|7464|628.50|uses. packages shall nag blithely even accounts. final instructions haggle. always even packages since the blithely express accounts was fu +1740|25|6137|987.95| the unusual asymptotes. quickly ironic accounts along the slowly even excuses wake carefully against the quickly even deposits. regular foxes about the regul +1740|67|2153|119.64|sly special multipliers sleep. final instructions boost furious, close requests. express, regular packages wake. requests are carefully finally expr +1741|42|7436|987.83|urts. regular, silent accounts print carefully ruthless requests. slyly quick accounts engag +1741|84|2827|222.29|ong the slyly regular requests. fluffily even pinto beans alongside of the slyly p +1741|26|3685|991.84|quests? slyly final pinto beans dazzle after the furiously ironic deposits. ironic, regular requests hinder quickly brave packages. ruthlessly final deposits cajo +1741|68|9948|646.48|n the carefully special pinto beans. blithely final accounts sleep slyly. slyly pending pinto beans are quickly blithely pending courts. furiously final requests about the slyly +1742|43|1056|403.39| the even, regular accounts. excuses boost blithely bravely ironic pinto beans! even theodolites sleep across the fluffily daring warthogs. ironic, ironic plate +1742|85|2490|810.92|egular packages; unusual accounts nag. ironic, bold theodolites among the quickly quiet instructions will cajole alongside of the slyly even packages. packa +1742|27|5665|973.76|asymptotes sleep. quickly final dependencies above the permanent, bold instructions wake carefully ironic packages. pending excuses wake carefully carefully unusual braids. fu +1742|69|9675|396.61|haggle? regular packages use finally against the furiously final requests. special theodolites imp +1743|44|4383|626.03|pending asymptotes. pending deposits should have to haggle quickly silent deposits. carefully ironic dependencies grow slyly ironic accounts. furiously special theodolites cajole furiously after t +1743|86|543|399.79|sly express requests. slyly regular foxes integrate slyly. +1743|28|1489|178.72|? carefully even deposits cajole. ideas are blithely. ironic ideas acr +1743|70|170|976.10|eas? final waters doze beside the silent instructions. carefully unusual accounts after the blithely final escapades nag fluffily along the final +1744|45|2288|819.42|olites. even accounts nag. fluffily idle decoys haggle unusual asymptotes. furiously +1744|87|7283|849.92| wake furiously along the unusual deposits. quickly unusual packages nag blithely furiously pending instructions. ideas are carefully. fu +1744|29|1656|951.97|refully final, ruthless theodolites! ironic ideas wake permanently along the furiously special packages. furiously regular ideas sleep carefully against the caref +1744|71|2389|840.74|ests haggle carefully about the furiously regular instruc +1745|46|26|620.53|tions. even, final requests haggle slyly about the instructions. orbits b +1745|88|9486|820.52|ccounts detect quickly against the blithely ironic requests. slyly unusual theodolites above the fluffily express theodolites nag against the final courts. bli +1745|30|3416|449.49|requests wake blithely about the ironic foxes. careful packages sleep. unusual theodolites sleep. never ironic accounts wake pending, express requests. exp +1745|72|2594|349.18|k accounts haggle furiously furiously ironic theodolites; final instructions about the even, even packag +1746|47|8251|754.50|yly ironic deposits haggle blithely after the carefully even deposits. furiously ironic courts in +1746|89|3756|651.41|c requests wake furiously furiously unusual pinto beans. blithely final accou +1746|31|6993|374.26| furiously above the slyly regular platelets. unusual, bold deposits according to the special deposits use finally quickly stealthy ideas. s +1746|73|1759|700.53|press daringly above the fluffily silent packages. final, regular instructions are final, even packages. furiously bold theodolites nag carefully regular packages: quickly even depend +1747|48|7604|750.15|ronic dugouts use slyly. foxes cajole furiously above the carefully ironic pinto beans? blithely even requests along th +1747|90|7347|461.67| blithely express accounts detect furiously blithely even accounts. bold, unusual theodolites sleep. slyly unusual patterns haggle quickly. regular requests wake at the accounts. +1747|32|9887|257.16|s affix quietly. final accounts against the final pinto beans are quickly final deposits. careful +1747|74|7486|608.60|eodolites at the slow, even packages sleep blithely above the express foxes. quickly unusual packages wake furiously +1748|49|9920|184.15|nst the pinto beans wake furiously accounts! blithely ironic foxes haggle: carefully pendin +1748|91|5583|292.83|ly regular dependencies among the carefully regular waters detect blithely after the fluffily special ideas. slyly special inst +1748|33|9560|663.34| slyly ironic somas cajole slyly. pains wake. express, +1748|75|7731|48.30|eans-- quickly silent notornis doubt slyly past the final, pending platelets. slyly ironic packages according to the regular packages integrate despite the slyly even deposits. +1749|50|3946|900.92|ffily according to the carefully ironic requests. furiously ironic instructions sleep quickly even theodolites. slyly ironic excuses sleep pending accou +1749|92|4212|980.02|s. furiously special packages cajole slyly packages. +1749|34|2441|696.10|. blithely ironic platelets nag according to the quickly unusual requests. furiously silent accounts detect slyly deposits. carefully bold no +1749|76|4657|218.55|se. carefully regular pinto beans around the final packages detect above the regular, ironic theodolites. blithely express deposits nag quickly alongside of the +1750|51|3447|140.26|romise slyly pending, regular courts. final requests sleep after the slyly special packages. accounts haggle furiously. blithely bold deposits doze-- carefully +1750|93|7722|874.19|grate slyly ironic, bold excuses. sometimes special packages are. instructions hagg +1750|35|3724|379.25|y silent requests. pending requests wake blithely among the permanently pending re +1750|77|553|564.61|sly furiously pending deposits. carefully final asymptotes detect. furiously ironic theodolites among the ironic, silent foxes x-ray blithely ironic, bold multipliers. carefully regular packa +1751|52|1869|75.01|ffily quiet accounts are blithely. quickly special packages use furiously. +1751|94|8910|139.50|about the fluffily unusual deposits. furiously special pinto beans are slyly packages. sil +1751|36|7296|182.17|ate slyly. bold dependencies across the blithely regular ideas are fluffily quickly express deposits. blithel +1751|78|6274|972.30|lly. furiously pending warthogs cajole blithely around the slyly regular accounts. final, regular dolphins boost blithely along the deposits. pinto beans cajole furiously regular frays. carefully c +1752|53|2424|919.99|ly slyly even requests. final, regular dependencies affix at the carefully pending pinto beans. packages according to the carefully even accounts nag furiousl +1752|95|6786|794.14|alongside of the quickly special deposits. express, special instructions integrate against +1752|37|2109|626.59|sits affix permanently across the deposits. regular, iron +1752|79|6976|800.68|lar, pending accounts hinder carefully. blithely final dependencies wake blithely. fluffily ironic deposits boost about the carefully pending pinto beans. furiou +1753|54|361|578.65|ckly for the carefully even dependencies. slyly express requests was quickly silent deposits. pending packages wake fluffily above the quickly express requests. thin ide +1753|96|1439|269.19|ily. unusual, ironic requests sleep slyly. regularly regular excuses wake furiously final foxes. bold excuses nag +1753|38|4423|35.46|. furiously unusual accounts snooze furiously slyly final deposit +1753|80|7250|903.99|ests. carefully silent packages cajole according to the permanently pending accounts. blithely express pinto beans ar +1754|55|240|733.50|ses sleep quickly requests. furiously regular pinto beans cajole despite +1754|97|774|339.66|cial requests. slyly regular ideas x-ray furiously. even, express foxes integrate ab +1754|39|7468|642.08| are among the special, express packages. ironic, regular packages integrate! slyly special accounts cajole furiously requests. ironic requests will doubt blithely according to the idly ironi +1754|81|9681|401.11|counts cajole. carefully ironic accounts along the final +1755|56|6393|466.25|nst the carefully regular excuses use carefully blithely bold instructions. slyly regular instructions haggle. blithely unusual ideas mold daringly. quickly special deposits are furiously p +1755|98|3281|316.76|ve the bold excuses. slyly final dependencies are. ironic, +1755|40|4151|322.38|sly ironic deposits. slyly unusual deposits snooze blithely blithely unusual accounts. q +1755|82|8094|815.89|unts according to the express foxes cajole blithely carefully even ideas. furiously regular theodolites are blithely after the blithely unusual deposits: fluffily final packages are regular courts. +1756|57|7753|499.61|ly ironic instructions. furiously pending requests haggle fluffily aro +1756|99|6644|527.49|l pinto beans. carefully final packages cajole quickly slow requests. regular, final requests wake bravely even requests. deposits are slyly +1756|41|4476|572.96|ironic accounts sleep idle, regular theodolites. carefully pending packages haggle slyly final, ironic waters! final deposits haggle permanently furiously special foxes. daring accounts among th +1756|83|2629|578.49|ts haggle fluffily. ideas wake. requests wake caref +1757|58|6930|564.47| the furiously final accounts. daringly bold asymptotes among the furiously regular deposits detect blithely after the excuses. carefully regular pinto beans across the sly +1757|100|2121|757.44|egular, express deposits-- slyly pending instructions +1757|42|6338|218.77|efully according to the quickly final deposits. slyly express ideas nag carefully up the regular ideas; dolphins breach slyly despite the slyly regular platelets-- final, even de +1757|84|1946|804.39|longside of the even pinto beans. packages breach carefully. ironically pending excuses among the slyly pending tith +1758|59|8740|22.79|ng packages use slyly. final accounts haggle. furiously pending theodolites breach. blithely even asymptotes about the requests boost blithel +1758|1|9064|638.37|carefully regular excuses. quickly special pinto beans against the fluffily ironic accounts would are furiously requests. slyly iron +1758|43|9686|992.26|e express courts. deposits use furiously carefully regular accounts. bold, bold depths according to the deposits b +1758|85|1158|726.49|lly regular deposits cajole blithely quick deposits. slyly pending ideas integrate carefully am +1759|60|5656|405.75|olites detect. even accounts sleep slyly. slyly regular ideas sleep. ironic theodolites doze furiously. fluffily even grouches boost after the pending, ironic theodolites. idly regula +1759|2|6045|388.04| furiously final dolphins sleep. furiously express packages affix along th +1759|44|6318|522.80|final requests alongside of the quickly ironic dinos boost blithely furiously regular deposits. pending dolphins are; furiously silent pinto beans haggle carefully. furiou +1759|86|3889|613.88|o beans. carefully ironic requests integrate quickly across the slow instructions. blithely b +1760|61|1335|958.82|e furiously unusual, ironic ideas. slyly blithe deposits hinder. regular packages according to the slyly ironic instructions cajole furiously ironic +1760|3|9189|76.94|posits across the silent, bold packages are slyly regular requests. silently even waters shall haggle. furiousl +1760|45|2352|749.94|cajole slyly outside the decoys. quickly unusual foxes nag even packages. quickly express pinto beans against the quickly final requests was ironic sauternes. blithely express de +1760|87|2134|74.05|he furiously pending accounts. fluffily ironic deposits detect carefully on the accounts. ironic deposits boost fluffily u +1761|62|2428|75.00| requests boost platelets. blithely regular platelets must haggle. furiously final dolphins boost. special, bold accounts alongsi +1761|4|785|87.56|fully final foxes affix unusual, final requests. carefully final dependencies about the special theodolites boost carefully regular requests. slyly ironic waters wak +1761|46|9264|376.45|structions use quickly. final ideas haggle. blithely express pinto beans unwind after the furiously bold frets. carefully pending requests cajol +1761|88|186|486.63|ncies. slyly special accounts impress blithely against the slyly ironic pinto beans. carefully ironic ideas dazzle blithely. fluffily permanent instruction +1762|63|8184|107.96|! blithely express foxes sleep blithely ironic dependencies. s +1762|5|5013|621.55|s boost. silent, regular forges boost carefully. silently ironic accounts alongside of the regular, regular excuses boost slyly about the theodolites-- carefully unusual excuses are blit +1762|47|9150|81.26|nticing requests are even asymptotes. final accounts against the blithely special deposits wake slyly among the slyly final a +1762|89|3156|283.80|ns serve slyly. furiously ironic theodolites sleep blithely. +1763|64|2560|880.04|ions around the blithely express deposits maintain regular deposits. furiously even instructions above the ironically final foxes are +1763|6|4705|702.74|according to the even requests sleep furiously furiously even requests. regular packages sleep furiously. quickly quick dolphins at the accounts wake carefully fluff +1763|48|106|869.73|ccounts haggle slyly ironic packages. requests wake slyly slyly final foxes. furi +1763|90|4154|300.29|ckly unusual deposits use carefully quickly bold packages. slyly unusual deposits impress against the regular packages. bold foxes +1764|65|7802|251.01|sts wake against the carefully ironic pinto beans. quickly bold deposits haggle furiously alongside of the bold, special foxes. closely express packages w +1764|7|4009|236.97|t quickly along the final, blithe theodolites. regular courts cajole packages +1764|49|2764|979.22|t the quickly ironic ideas. instructions are fluffily above the even ideas. carefully +1764|91|6784|255.62|s nod even attainments? carefully even gifts doubt. even decoys integrate requests. unusual requests nag express pinto beans. carefully pending theodolites wake boldly according to +1765|66|2488|667.67|lyly against the furiously express ideas. final, ironic accounts use quickly. regular asymptotes are ironic, final foxes. slyly even excuses boost thinly. platelets cajol +1765|8|648|870.85|s wake fluffily along the carefully silent foxes. carefully regular dependencies doze furiously after the regular, pending instructions. sl +1765|50|673|183.46|ly regular packages sleep blithely. slyly pending accounts after the bold deposits sleep furiously about the fluff +1765|92|9938|785.75|regular platelets. blithely regular deposits after the final, even dependencies sleep fluffily above the regular f +1766|67|8948|466.66|ts! blithely regular accounts affix slyly. unusual, regular braids among the even platelets doze above the furiously final pac +1766|9|3660|168.52|. ironic accounts sleep against the carefully final warhorses. slyly regular asymptotes are final pinto beans. bold requests are. enticingly ironic foxes detect. ironic r +1766|51|8598|342.06|foxes. carefully special theodolites boost slyly about the regular packages. blithely even attainments wake bl +1766|93|4325|7.22| hang carefully silent realms. special accounts use furiously above the furiously bold pinto beans. slyly even pa +1767|68|7189|674.73|dolites. quickly regular frets across the permanently silent theodolites engage furiously according to the fluffily regular packages: +1767|10|91|670.87|instructions. special requests sleep thinly along the slyly final pinto beans. quickly regular sheaves use blithely. ruthlessly ironic deposits wake +1767|52|740|830.30|pending packages. busily special ideas sleep blithely +1767|94|7360|881.54|the final ideas. slyly ironic accounts sleep carefully enticingly ironic asymptotes. regularly pending packages x-ray above the carefully even dependencies. furiously ironic asymptotes sleep. +1768|69|6366|39.11|warhorses are. regular courts sleep enticingly re +1768|11|1645|155.12|s nag ironic deposits. regular packages sleep blithely always even theodolites. slyly bold asymptotes sleep. dolphins across the express deposits should have to nag slyly among the blithely spe +1768|53|9365|983.15|s cajole slyly from the carefully final instructions +1768|95|9134|465.47|fluffily around the instructions. final deposits haggle slyly express accounts. express packages haggle slyly blithely unus +1769|70|8556|124.45|s mold. slyly fluffy deposits sleep carefully. bold in +1769|12|6996|912.28|essly special instructions. blithe accounts haggle slyly. ironic, ir +1769|54|8380|216.34|l packages nag furiously blithely express requests. even foxes boost slyly forges. blithely express theodolites cajole blithely after the bold accounts. +1769|96|1631|821.71|etect carefully. requests detect carefully regular deposits. bold accounts detec +1770|71|472|499.31|rding to the carefully ironic attainments. slyly even deposits are carefully. regular dependencies snooze quickly above the slyly ironic packages. packages engage furiously regular accounts. ex +1770|13|5791|458.56|es. fluffily final asymptotes haggle among the sometimes regular sheaves! slyly furious foxes use along the final, regular deposits. sly +1770|55|5281|914.92|ironic deposits haggle. furiously regular deposits according to the final theodolites wake carefully at the +1770|97|8845|612.17|y unusual deposits boost. deposits nag slyly. instructions wake against the carefully pending requests. regular requests are against the regular requests. +1771|72|8009|130.16|kages beneath the platelets detect carefully permanently express accounts. carefully regular requests sleep blithely final theodolites. carefully regular accounts use c +1771|14|2736|8.32|ithely ironic ideas. final ideas are slyly quickly daring theodolites: carefully pending courts wake carefully quickl +1771|56|2456|294.98|ar, ironic ideas haggle blithely alongside of the blithely regular accounts. blithely regular attainments use. even pinto beans about the furiously unusual deposits haggle ruthlessly against the re +1771|98|2792|853.22|xes are across the even dependencies. regular, bold packages hinder. deposits wake furiously at the fluffily final accounts. final foxes throughout the quickly +1772|73|6912|564.70| slyly. ironic, regular accounts across the ironic, final instructions unwind blithely above the furi +1772|15|9798|583.70|instructions. ironic attainments integrate blithely pending deposits. furiously ironic accounts sleep finally against t +1772|57|3675|228.79|about the fluffily ironic courts. pending theodolites are blithely carefully silent instructions. regular packages wake furiously final packages. final instructions nod carefully +1772|99|7781|334.32|ggle blithely. final packages wake carefully across the ironic, ironic foxes. quickly final platelets wake blithely blithely regular accounts. requests among the reques +1773|74|6009|770.69|tly according to the regular foxes. furiously ironic packages haggle. d +1773|16|1291|91.03|riously regular instructions sleep quickly above the b +1773|58|3876|788.84|accounts? ironic asymptotes integrate. slyly special deposits affix about the quickly even courts. asymptotes according to the furiously regular requests haggle bold theodolite +1773|100|9579|475.31|s. regular, pending dependencies run. special, silent instructions engage fluffily even platelets. carefully ironic packages are furiously. furiously unusual dolphins boo +1774|75|6771|678.48|the blithely final decoys engage slyly slyly regular packages! quickly regular requests nod furiously: quickly even asymptotes detect carefully. carefully final exc +1774|17|3163|700.95|ove the slyly silent foxes. blithely even requests according to the slyly final ideas hinder quickly among the quickly special packages. quickl +1774|59|9349|773.28|thely slyly unusual pearls. slyly even theodolites sleep carefully blithely final accounts. quickly fin +1774|1|3133|657.96|yly. regular accounts cajole carefully ironic accounts. bold, ironic instructions affix against the +1775|76|1199|560.44|ffix carefully. blithely unusual deposits after the special, regular asymptotes eat carefully express requests. +1775|18|5786|935.81|ss the special depths; even packages snooze furiously about the furious packages. carefully special dependencies wake. theodolites might wa +1775|60|835|52.88|the regular excuses sleep quickly alongside of the unusual, regular foxes. slyly bold packages nag blithely stealthily ironic wa +1775|2|8741|916.20|fully. furiously regular asymptotes will nag express, regular requests. accounts under the blithely ironic excuses wake along the theodolites. ironic foxes cajole. sl +1776|77|1695|138.16| blithely regular deposits wake fluffily. express instruction +1776|19|6985|557.64|l, express deposits use carefully after the requests. regular, silen +1776|61|4619|796.02|thely after the even, unusual dependencies. fluffily regular pinto beans haggle. final packages sleep toward the slyly final pinto beans. ironic hockey players br +1776|3|7551|279.43|d carefully along the tithes. slyly dogged instructions play slyly slyly express accounts. furiously bold pearls are +1777|78|6444|339.23|y according to the slyly express excuses. slyly pending foxes are blithely ironic packages. furiously unusual theodolit +1777|20|3081|407.59|es nag carefully. ironic packages haggle quickly upon the furiously regular theodolites. quickly spec +1777|62|9042|343.66|thely pending instructions wake furiously accounts. quickly regular instructions detect silent accounts. blithely silent frets haggle carefully. carefully special asymptotes under the instruction +1777|4|128|883.58| use blithely-- furiously unusual excuses are slyly according to the deposits. blithely regular deposits against the carefully ironic deposits cajole ac +1778|79|6263|300.23|theodolites haggle carefully busily regular deposits. quickly regular dolphins snooze furiously. bo +1778|21|9023|157.21|sts. slyly express theodolites are finally courts. ironic, pending pint +1778|63|4411|68.95|d notornis are. slyly final packages wake quickly along +1778|5|7198|268.43|furiously sly foxes. blithely bold ideas along the pending theodolites sleep slyly even packages. blithely even accounts lose quickly after the final d +1779|80|6798|268.02|kages. slyly regular packages haggle closely among the final requests. regular, final requests cajole above the carefully unusual r +1779|22|8670|258.53|ep fluffily realms. unusual pinto beans haggle carefully among the blithe deposits. quickly stealthy theodolites agai +1779|64|919|726.56|tions. regular ideas are along the fluffily ironic instructions. even excuses use +1779|6|9857|709.89|osits according to the fluffily final accounts wake quickly regular packages. special, regular deposits boost carefully. carefully silent theodolites across the regular, ironic accounts cajole sile +1780|81|3995|186.00|aggle carefully. ironic foxes sleep slyly against the asymptotes. furiously bold deposits engage furiously iro +1780|23|9379|528.66|hs. fluffily pending packages detect according to the final, final excuses. packages wake care +1780|65|5520|207.72|. ideas cajole furiously about the ironic, final deposits. carefully regular escapades sleep blithely regular dolphins. slyly enticing theodolites affix furiously throughout the accounts. careful +1780|7|4911|872.66|ly pending instructions wake blithely? fluffily even courts after the furiously special requests cajole bravely against the +1781|82|5498|660.83|ly bold braids nag against the foxes. quickly even accounts around the slyly silent packages nag slyly among the quickly pending deposits. ironic gifts cajole. thinly regular dolphi +1781|24|5816|817.20|l dolphins. dolphins should have to affix furiously. special ideas are furiously alongside of the enticingly even packages. even packages alongside of the ironic pinto beans ha +1781|66|795|492.59|long the silent packages nod throughout the even, regular pinto beans. warhorses are furiously. furiously express dependencies thr +1781|8|6579|444.49| fluffily express foxes. notornis around the regular, regular accounts sleep carefully against the regular T +1782|83|7112|156.54|ular deposits. slyly regular theodolites wake after the blithely unusual theodolites. express foxes above the ironic, even accounts boost blithely across the f +1782|25|556|817.77|eodolites among the furiously bold excuses boost closely ironic pinto beans. pending pinto beans are fluffi +1782|67|4302|171.92|cording to the doggedly regular accounts use furiously even, bold instructions. deposits across the carefully even braids believe stea +1782|9|7637|594.62|ld packages wake slyly regular pinto beans. quickly regular requests according to the furiously ironic packages haggle slyly according to the blithely regula +1783|84|2708|858.70|urts wake. carefully special instructions sleep carefully. furiousl +1783|26|7419|691.75|ggle furiously furiously ironic requests. requests cajole even deposits. ironic ideas thrash. fluffily regular requests detect slyly according to the ironic requests. regular requests are +1783|68|1859|4.40|ctions wake furiously silently unusual ideas. idea +1783|10|6044|361.84|ully. bold packages print blithely pending foxes. slyly unusual packages are carefully after the final, busy theodolites. slyly express ideas wake blithely unusual, +1784|85|7985|782.45| the final, even accounts. blithely even packages use quickly. blithely unusual pinto beans wake fluff +1784|27|7935|906.45|ously ironic theodolites wake slyly across the unusu +1784|69|3424|96.75|ep along the slyly bold theodolites. express, express deposits nag slyly final packages. unusual dependencies are blithely above the quickly unusual packages. qui +1784|11|5842|890.20|s wake permanently furiously unusual platelets. final, express requests wake unusual, unusual deposits. silent acc +1785|86|427|704.79|lar theodolites. blithely regular theodolites unwind among the furiously final packages. b +1785|28|2430|483.70|blithely quickly ironic requests. requests haggle against the carefully final accounts: slyly special courts wake. bravely special asymptotes sleep slyly pending +1785|70|886|896.87|the furiously dogged ideas cajole daringly final requests. warhors +1785|12|6973|841.64|ding requests. even deposits cajole fluffily quickly bold theodolites. carefully ironic instructions wake across the regular theodolites. regular, ironic dependencies detect slyly bold +1786|87|4227|671.20| fluffily special sheaves sleep carefully at the even instructions. furiously final requests around the slyly unusual requests engage quickly along the special, bold packages. furiously regular +1786|29|1424|247.64|gainst the escapades. bold requests wake slyly. theodolites above the furiously bold dependencies grow slyly around the express requests. fluff +1786|71|8403|421.32|fully even courts cajole against the brave, pending requests. slyly special packages haggle doggedly even deposits. slyly even fo +1786|13|7356|327.60| requests are finally through the carefully final ideas. re +1787|88|1137|707.93|en ideas. slyly regular pinto beans according to the carefully pending requests sleep ironic requests. regular excuses against +1787|30|8332|245.94|p after the fluffily ironic sentiments. packages alongside of the ironic, final excuses sleep according to the finally regular dependencies. slyly ironic p +1787|72|9214|840.26|uses cajole ironic deposits! blithely final accounts dazzle ca +1787|14|7298|502.71|regular pinto beans. regular deposits above the even, ironic pinto beans kindle carefully around the final, bold theodolites. blithely un +1788|89|9384|723.72|uests. blithely pending requests use. slyly ironic foxes sleep along the slowly unusual accounts. careful, even accounts wake quickly slyly ironic forges. slyly express waters are +1788|31|1230|806.27|tornis. carefully unusual theodolites after the quickly bold accounts cajole carefully above the slyly ironic pinto beans. express pinto beans wake furi +1788|73|475|664.93|lms sleep always along the busily final instructions. furiously pending deposits wake daringly furiously regular requests! slowly pending theodolites sleep quietly regular i +1788|15|6735|806.37|slyly ironic foxes wake fluffily. carefully silent accounts cajole carefully pinto beans. regular, regular requ +1789|90|6044|359.84|efully. thin instructions wake; ironic, express courts boost blithely. qu +1789|32|8573|158.13| accounts cajole slyly deposits. ideas cajole slyly blithely pending theodolites. ironic, furious dependencies haggle idly carefully even packa +1789|74|592|557.64|express pinto beans wake blithely among the even theodolites. furiously special deposits thrash blithely deposits. even, ironic dolphins cajole. unusual excuses cajole s +1789|16|2464|835.92|excuses cajole furiously quickly regular instructions. bold theodolit +1790|91|3194|516.53|d courts. furiously even packages haggle carefully final pinto beans. furiously regular accounts are quickly ironic, regular asymptotes. slyly unusual deposits are c +1790|33|4546|193.34| blithely. regular, silent packages cajole carefully. furiously regular requests sleep +1790|75|2112|898.72|sleep boldly fluffily special frets. ironic, final requests detect fluffily. pending, pending excuses boost b +1790|17|5030|55.16|quests nag among the slyly unusual epitaphs. bold deposits wake. furiously special sheaves sleep furiously final packages. carefully pending requests along +1791|92|4265|232.95|ously final instructions sleep furiously furiously even ideas. even, unusual pac +1791|34|2369|368.83|its. regular foxes wake even pinto beans? even excuses use furiously against the regular packages. regular instructions against the ironic courts wake special id +1791|76|9747|403.61|y regular requests. carefully special dolphins sleep enticingly. silent deposits nag blith +1791|18|8804|518.06|ully bold pearls boost quickly. furiously even pinto beans sleep carefully blithely even instructions; requests +1792|93|7227|6.54|posits boost quickly about the pending instructions. boldly unusua +1792|35|2212|279.11|r, special instructions haggle furiously according to the final dependencies. fluffily final accounts cajole. carefully pending accounts cajole carefully. +1792|77|1913|839.70|ns. carefully bold requests sleep unusual, regular dependencies. quickly unusual excuses across the express deposits cajole thin platelets. slyly bold accounts detect quickly. ca +1792|19|6252|143.30|ly across the slyly pending attainments. slyly special pinto beans boost blithely even pinto beans. bli +1793|94|9846|131.94|slyly ironic requests. carefully even deposits sleep furiously carefully pending requests. pending asymptotes use blithely. fluffily pending asymptotes use special, fina +1793|36|5136|999.92|lets grow carefully. slyly silent ideas about the foxes nag blithely ironi +1793|78|3391|588.68| beans wake above the slyly final accounts; slyly bold pains use slyly special multipliers. regular packages sleep blithely. regu +1793|20|4813|83.15|ly pending packages wake never except the quickly final accounts. c +1794|95|2261|157.22| blithely express foxes after the silent instructions boost furiously quick accounts. blithely final deposits sleep s +1794|37|7411|231.32|lar packages after the blithely regular packages cajole blithely enticing deposits. slyly ironic dependencies +1794|79|5709|913.04| furiously even requests are slyly according to the cou +1794|21|7281|923.09|ven, unusual instructions. blithely regular packages sleep blithely even dependencies. regular, regular theodolites use along +1795|96|9534|46.03|sly bold packages. theodolites wake across the bold theodolites. slyly special requests detect quickly regular, ironic theodolites. r +1795|38|2891|703.81|oost according to the slyly express dependencies. slyly silent deposits against the furiously final braids cajole never across the slyly bold courts. quickl +1795|80|9998|835.19|s integrate finally about the carefully express requests; bold patterns above the fluffily quick packages +1795|22|5134|161.57|ect slyly. blithely silent dolphins according to the bold, unusual excuses cajole +1796|97|2086|512.25|uickly regular packages. express accounts wake fluffily even instructions. slyly silent patterns against the carefully pending d +1796|39|3439|156.23|fully final packages. quietly bold foxes detect furiously final accounts. final packages +1796|81|561|640.26| grow fluffily slyly even packages. regular realms are furiously special pinto beans. quickly final deposits sublate blithely. ironic co +1796|23|7916|848.29|y enticing deposits. quickly final deposits along the carefully bold deposits sleep regular pinto beans. even instructions use. slyly quiet packages sleep slyly. foxes bo +1797|98|9442|537.27| special instructions. blithely express theodolites above the even, even instructions are furious +1797|40|1257|150.27|ove the fluffily ironic excuses integrate blithely slyly pending foxes. slyly final platelets wake quickly blithely ironic requests. ironic realms hinder re +1797|82|1388|403.55|side of the carefully pending orbits promise against the slyly dogge +1797|24|9838|394.08|ickly slyly final requests. slyly ironic platelets through the doggedly pending asymptotes use furiously excuses. quickly ironic deposits are agains +1798|99|1772|102.40|its. slyly ironic foxes alongside of the slyly bold accounts cajole quickly pendin +1798|41|8704|930.43|ckly alongside of the furiously special requests. pending asymptotes solve carefully even deposits. regular pinto beans cajole fluffily. slyly final requests impress c +1798|83|5885|462.98|nic grouches. carefully bold theodolites sleep quickly packages. carefully final r +1798|25|1832|252.12|g the carefully silent instructions. quickly pending theodolites haggle blithely. regular, brave accounts boost sly +1799|100|8527|804.38|e slyly bold excuses. blithely regular accounts sleep. furiously thin instructions cajole slyly stealthy theodolites. regular orbits haggle slyly quickly +1799|42|3297|934.71|l pinto beans unwind. carefully final requests cajole furiously packages. fluffily ironic asymptotes across the never regular deposits cajole quickly ca +1799|84|2437|570.55|unts. slyly pending foxes grow quietly. bold, regular epitaphs are about the ironic asymptotes-- quickly final instructions sleep blithely pending, ironic pinto beans. blithely ironic +1799|26|4311|61.11|blithely. blithely bold requests cajole according to the furiously silent accounts-- furiously express pinto beans impress slyly unusual packages. unusual +1800|1|1554|281.76|s haggle furiously carefully final packages. slyly unusual packages after the silent, ironic packages use slyly about the reques +1800|43|3297|444.22|beans use blithely against the special excuses. slyly ironic packages across the quickly bold accounts cajole around the carefully bold deposits. slyly stealthy pinto beans cajole instructions! ca +1800|85|849|620.39|ular accounts haggle enticingly about the carefully +1800|27|6086|539.84|ans. furiously bold ideas wake across the furiously quick ideas: unusual, pending platelets cajo +1801|2|6341|418.86|s are regular requests. accounts about the slyly unusual orbits sleep carefully quickly express platelets. carefully silen +1801|45|1080|955.45|e fluffily even accounts. express deposits are among the pending instructions. instructions sleep fluffily. +1801|88|5082|467.08|ing packages. fluffily final packages unwind carefully. excuses +1801|31|3941|304.25|s. carefully silent requests haggle blithely sometimes express hockey players. furiously ironi +1802|3|7695|813.77|ntiments. carefully thin requests cajole accounts. ev +1802|46|1908|782.28|unusual depths thrash slyly. quickly regular requests wake. even, regular +1802|89|8290|23.46|y even deposits. unusual theodolites after the requests sleep furiously sile +1802|32|9323|920.22|even packages sleep carefully. even theodolites sleep carefully at the ironic, regular theodol +1803|4|8279|685.68|l pinto beans. blithely unusual instructions cajole furiously. blithely regular dependencies was carefully furiously final pinto beans? blithely express accounts sleep. ruthless +1803|47|5967|845.39|ly ironic packages are after the quickly bold dependencies. carefully final reques +1803|90|7254|878.90|p carefully around the pending, final pinto beans. even dolp +1803|33|2222|597.23|y regular deposits at the fluffily pending packages hinder slyly across the packages. unusual, final accounts are furiously against the blithely ironic accounts. close asymptotes are carefully bol +1804|5|7171|794.46|jole fluffily blithely special asymptotes. fluffily even ideas wake quickly blithe deposits. pinto beans nag slyly regular, dogg +1804|48|2719|921.21|posits are furiously around the blithely bold courts. accounts according to the q +1804|91|4064|428.54|ully even pinto beans x-ray above the slyly slow ideas. blithely ironic requests print against the carefully even packages. final, final asymptotes are fluffily across the fluffily express ins +1804|34|9721|847.90|instructions. ironic excuses sleep. furiously even theodolites use above the even, pending ideas. blithely even instructions haggle. blithely ironic deposits about the regular asymptotes +1805|6|5296|98.81|even foxes. silent, final packages grow regular, pending deposits-- final platelets are dolphins. special patterns cajole blithe +1805|49|5750|643.80|thely ironic ideas after the carefully even instructions wake fluffily slyly regular dolphins. furiously bold accounts wake fluffily atop the slyly ironic requests. carefully express p +1805|92|6935|304.18|rate furiously ironic accounts. carefully even deposits alongside of the final deposits sleep thinly fl +1805|35|5464|674.56|ss deposits use quickly into the regular accounts. accounts nag slyly. de +1806|7|708|905.57|metimes even pinto beans. furiously silent accounts cajole +1806|50|5054|267.23|e of the bold somas. final foxes nod blithely final dependencies. carefully idle packages kindle bravely across the slyly bold accounts. blithely final dolphins print-- bli +1806|93|442|10.86|egular theodolites thrash furiously pending, ironic accounts. deposits integrate quickly? requests according to the final dolphins integrate foxes. slyly unusual dolphins haggle fu +1806|36|4730|30.21| regular pinto beans. special, regular accounts wake blithely slyly bold dependencies. slyly pending ideas wake fluffily. b +1807|8|4593|424.34|ackages haggle slyly. furiously silent theodolites according to the final accounts wake about the carefully ironic somas. unusual platelets snooze +1807|51|9122|265.41|ding ideas. carefully final instructions wake carefully. final dependencies haggle blithely. ironic theodolites eat along +1807|94|5052|508.43|furiously ironic courts. unusual packages boost furiously. ironic, regular dependencies boost furiously. dolphins detect around the slyly ironic pinto beans. slyly u +1807|37|4075|861.52|final pinto beans. furiously silent packages across the even, final requests boost about the slyly ironic packa +1808|9|6774|134.28| use. final deposits haggle. carefully special foxes will have to wake daring instructions. blithely regular ideas ha +1808|52|5786|346.69|ctions nag blithely according to the special, bold accounts. ironic excuses sleep fluffily bold, bold pinto beans. blithely ironic accounts are car +1808|95|4968|770.78|er slyly express requests. bold, regular packages detect along the deposits. quic +1808|38|203|656.07|breach carefully quickly even requests. blithely express packages wake. quickly special platelets cajole. ironic pinto beans believe blithely. slyly express pinto beans use. ironic, ironic deposits +1809|10|4234|739.57|sts breach furiously. slyly bold requests are slyly about the quickly even requests. final theodolites nag. regular, regular packages cajole blithely aroun +1809|53|4086|519.52| slyly even courts cajole above the ironic accounts. carefully pending instruction +1809|96|8318|509.68| even foxes across the blithely ironic instructions affix never around the slyly final requests. packages was furiously inside the ironic, final accounts. al +1809|39|1567|991.60| blithely final dinos against the sly, regular theodolites lose along the even +1810|11|3376|588.06|usly. instructions sleep slyly. carefully regular instructions about the careful +1810|54|1296|510.18|ing to the special platelets. blithely even theodolite +1810|97|6835|337.49|l accounts. fluffily express packages detect according to the special, regular ideas! carefully express sheaves detect. enticingly regular packages wake slyly quickly quiet deposits. blithely idle +1810|40|3335|68.99|ven, ironic instructions sleep slyly. fluffily even dugouts will have to nag doggedly silent excuses. final, regular orbits main +1811|12|4995|953.59|es. evenly final accounts about the furiously even platelets sleep fluffily fr +1811|55|2662|56.14| accounts affix furiously. furiously final patterns according to the fluffily thin pinto beans boost above the furiously regular accounts. carefully regula +1811|98|8110|708.08|y blithely even deposits. carefully ironic accounts nod bli +1811|41|281|696.30|ugouts across the carefully pending ideas integrate blithely according to the quickly final foxes-- furiously careful +1812|13|2096|635.74|ly thinly regular pinto beans. slyly final accounts breach fluffily among the carefully even packages. final, ironic packages sleep across the s +1812|56|3656|797.85|ven, special platelets. even theodolites sleep final, ironic platelet +1812|99|6168|95.85|l asymptotes boost fluffily regular pinto beans. slyly +1812|42|1858|801.14|nst the blithely pending accounts. enticing requests wake above the slyly ironic requests. platelets snooze carefully. final deposits detect about the carefully final ac +1813|14|6651|296.57|ironic instructions cajole furiously along the fluffily special pinto beans. requests a +1813|57|8439|733.92| wake carefully. blithely regular requests must have to cajole furiously regular requests. furiously pending instructions sleep unusual, regular packages. carefully even packages agai +1813|100|5092|488.08|le carefully across the quietly regular instructions. daringly even packages serve quickly. carefully final platelets haggle furiously until the carefully ironic deposits. quickly +1813|43|4017|468.72|ar pinto beans. furiously ironic excuses boost furiously regular ideas. ironic pinto beans haggle slyly pinto be +1814|15|6638|768.41|. carefully final requests alongside of the ironic packages detect furiously requests. final deposits dazzle blithely special accounts. ruthless, express ideas need to ar +1814|58|2473|744.57|slyly regular requests use furiously? silently regular foxes eat. furiously daring requests haggle furiously. regular, ironic orbits boost furiously express ideas! pending packages cajole sly +1814|1|6658|714.41|ld requests. furiously regular theodolites boost regularly. doggedly ironic packages integrate finally bold requests. ruthless theodolit +1814|44|6720|329.41|ithely special instructions alongside of the unusual accounts cajole according to the slyly unusual platelets. blithely unusual theodolites use outside the regular packages. blithely regul +1815|16|4670|86.79|. pending instructions until the carefully silent foxes maintain among the slyly pending dolphins. silent accounts kindle. fluffily ironic foxes are. furiously pending dolph +1815|59|9731|458.85|platelets wake above the blithely busy dependencies. carefully special excuses +1815|2|9220|788.54| across the bold, regular theodolites. bold, express deposits engage carefully. furiously ironic pinto beans sleep slyly final acc +1815|45|3708|456.07|are according to the theodolites. regular, bold ideas breach carefully regular deposits. slyly final dependencies according to +1816|17|2890|75.55|nusual accounts across the final, ironic deposits ought to haggle furiously after the even accounts. accounts cajole slowly quickly ironic packages. quickly final +1816|60|5615|362.42| special courts. thinly regular accounts along the foxes boost slyly unusual theodolit +1816|3|471|519.03|equests cajole quickly furiously final pinto beans? carefully unusual accounts are. even pinto beans are among the carefully final accounts. requests +1816|46|1261|177.14|uests. platelets haggle after the quickly pending ideas. slyly ironic asymptotes about the quickly pending excuses wake between the express deposits. slyly even deposits haggle sometimes +1817|18|3539|341.53| express, regular accounts. accounts cajole blithely along the carefully regular requests. blithely even accounts are after the express, unusual deposits! quickly bold f +1817|61|9559|1.20|fully bold, bold pains. furiously final pinto beans across the blithely special dolphins nag slyly regular deposits. theodolites wake +1817|4|2761|459.07|pecial ideas cajole furiously ironic pearls. special, special requests could wake slyly against the silent deposits. even, thin instructions around the blithely busy requests haggle always alongside +1817|47|2411|469.88|ies along the even platelets haggle alongside of the blithely bold forges. slyly final platelets are blithely quickly bold foxes. fl +1818|19|5020|281.83|even, quick ideas. quick requests haggle. slyly final accounts are slyly slyly regular theodolites. caref +1818|62|229|704.15| quickly slyly silent theodolites. pending requests haggle carefully final deposits. blithely regular foxes are of the blithely final asymptotes. packages haggle regular, pending pinto bea +1818|5|3468|572.01|ctions boost along the quickly regular asymptotes. pinto beans along the asymptotes boost furiously furious +1818|48|4884|597.56|unts haggle furiously. blithely final deposits cajole across the slyly ironic packages. carefully regular accounts cajole. ironic, bold escapades are furiously even packages. furiously unusu +1819|20|2192|345.87| furiously regular theodolites. fluffily regular theodolites cajole blithely alongside of the slyly unusua +1819|63|1659|71.36|ets-- furiously pending requests sublate among the carefully even deposits. deposits around the bravely pending theodolites cajole carefully pending pinto beans. blithely bold accounts +1819|6|2767|836.98|nal pinto beans. blithely final requests sleep furiously slyly ironic courts +1819|49|9338|334.23|blithely across the excuses. theodolites use silent excuses. slyly unusual dependencies nag about +1820|21|7641|253.30|cial packages. pending, final packages wake slyly among the quickly even foxes; furiously even accou +1820|64|3242|731.00|r the requests affix after the slyly final accounts. final, final sauternes detect carefully unusual pac +1820|7|690|403.80|ing asymptotes-- furiously pending deposits wake slyly carefully express excuses. pending ideas along the stealthy accounts detect silently across the slyly ironic dinos. furiousl +1820|50|3928|657.99|ely slow deposits cajole after the carefully unusual instructions. fluffily final platelets sleep slyly at the blithely silent requests. express accounts wake carefully fluffily r +1821|22|6974|71.68|e fluffily ironic packages. furiously silent instructions detect quickly. quickly express notornis sleep quickly above the bold packages. instructions about +1821|65|7469|224.11| courts impress furiously express excuses. blithely ironic packages after the final foxes +1821|8|2569|611.26|inst the slyly final requests haggle furiously above the final, special sentiments. bold foxes thrash furio +1821|51|5500|882.50| beans are furiously ironic asymptotes! blithely regular +1822|23|5485|60.91|e blithely along the furiously even packages. final, ironic foxes maintain furiously. blithely final hockey players print +1822|66|597|53.60|rmanent platelets wake quickly. carefully bold instructions haggle express packages. special dependencies nag slyly across the slyly special waters: regular deposits sleep. b +1822|9|2603|974.54|e quickly unusual deposits. final, regular accounts between the pending, pending packages cajole furiously sly packages. sl +1822|52|1999|669.33|ss the packages integrate slyly about the even theodolites. bold, ironic excuses cajole carefully special requests. blithely even packages ha +1823|24|3920|901.42|d deposits. requests sublate carefully. deposits cajole quickly. final theodolites across the special pinto beans use furi +1823|67|6454|400.67|ng to the furiously pending deposits cajole blithely final, final co +1823|10|7038|73.01| haggle. furiously express deposits about the pending foxes nag alongside of the regu +1823|53|2835|515.80|riously ironic deposits wake about the dinos. carefully ironic packages wake +1824|25|5596|929.06|tions. doggedly regular instructions sleep above the never ironic requests. blithely bold +1824|68|7577|367.50|ely after the slyly special waters. daringly ironic requests use blithely furiously bold requests. pending ideas after the slyly ironic ac +1824|11|7004|28.76|ions. blithely even foxes alongside of the foxes hinder against the enticing hockey players. instructions are quickly at the quickly even requests. furiously final accounts hang +1824|54|1421|32.98|e sometimes final deposits are evenly final frays: final courts wake quickly. ironic, bold instructions integrate carefully bold, regular +1825|26|2270|148.09|instructions haggle slyly. carefully final requests wake carefully. slyly ironic requests sleep blithely even accounts. blithely even requests wake carefully ironic deposits. blithely unusual ac +1825|69|4932|649.48|ses haggle. slyly ironic deposits doubt slyly slyly special packages. fluffily bold orbits boost pending requests. accounts above the furiously final instructions x-ray furiously after the +1825|12|417|815.26|according to the slyly brave foxes. excuses cajole slyly slyly special platelets: carefully p +1825|55|8232|900.96|requests. fluffily ironic requests around the blithely sile +1826|27|6774|737.64|iously unusual asymptotes. pending instructions wake. fin +1826|70|9757|3.16|uffily bold packages. pending, dogged deposits run blithely. instructions cajole. ironic packages boost slyly. pending deposits sleep. slyly unusual depo +1826|13|9872|412.21|equests cajole blithely special, regular foxes. asymptotes cajole +1826|56|9455|89.52|hins! ironic, bold ideas boost blithely blithely final foxes. courts across the bold, unusual theodolites cajole blithely final +1827|28|2484|358.57|ow dependencies nag. slyly regular platelets hang furiously final deposits. unusual foxes cajole around the pinto beans. slyly e +1827|71|838|716.25|kly regular realms. slyly final theodolites about the furiously special packages wake carefully about the final, ironic pinto beans: quickly final requests into the regular pack +1827|14|2589|213.60|refully theodolites. instructions cajole ironic, regular platelets. carefully ironic packages wake. blithely unusual requests +1827|57|2946|849.48|g among the ironic, even deposits. even foxes eat quickly. carefully quiet deposits cajole idly according to the quickly regular dependencies. dogged excuses kindle carefully bold requests. packa +1828|29|2911|690.04|le even dependencies. unusual, regular accounts haggle carefully ideas. ideas are furiously regular packag +1828|72|9877|217.75|al, ironic packages sleep furiously after the regular pinto beans. sometimes pending epitaphs along the furiously final theodolites haggle furiously among the ironic, even attainments. c +1828|15|8704|619.20|long the quickly regular pinto beans sleep fluffily about the daringly silent packages. regular dolphins kindle furiously final foxes. carefully ironic +1828|58|9958|401.07| pinto beans haggle slyly blithely pending pinto beans-- slowly ironic dolphins after the sly requests are slyly regular deposits. special in +1829|30|7250|803.57|s among the regular, ironic deposits use blithely around the furiously pending f +1829|73|1098|273.79|ages. regular pinto beans grow blithely furiously final Tiresias. final, ironic packages haggle alon +1829|16|691|443.84| daring epitaphs wake ruthlessly around the blithely bold dependencies. regul +1829|59|7784|255.78|s. slyly final platelets detect inside the unusual attainments. stealthy packages integrate fluffily courts. slyly regular accounts boost slyly around th +1830|31|2568|408.40|olites. ironic forges wake slyly against the pending packages. regular deposits wake fluffily bold asymptotes. even, regular packages haggle fluffily. final, e +1830|74|8276|12.06|refully. carefully silent asymptotes wake. packages are. carefully unusual pinto beans use. quic +1830|17|2382|187.47|ckages cajole slyly about the requests. final foxes promise past the fluffily regular deposits. slyly permanent requests around the express platelets cajole after the special theod +1830|60|4627|257.82| asymptotes alongside of the instructions sleep furiously about the unusual sheaves. slyly even theodolites sleep furiously express, unusual accounts. ideas among the blithely ironic deposits affi +1831|32|3739|709.50|er the blithely regular requests. quickly final sheaves after the fluffily even instructions sleep against the carefully final accounts. furiously express asymptotes h +1831|75|9172|697.72| excuses nag above the packages. blithely special theodolites promise packages. slyly regular requests about the silent realms nag quickly after the ruthless requests. regular accounts unwind. +1831|18|7301|437.74| requests poach against the unusual, even accounts. blithely ironic accounts sl +1831|61|2545|597.03|gside of the pending, express warhorses sleep carefully blithely unusual excuses; slyly even packages sleep among the furiously unusual requests. silent, regular foxes haggl +1832|33|8724|425.15|ven packages. slyly ironic accounts against the slyly silent requests detect fluffily above the quickly regular platelets. asymptotes cajol +1832|76|4477|800.50|telets kindle according to the carefully pending theodolites. f +1832|19|859|534.54|ing to the platelets integrate quickly quickly even instructions. deposits haggle slyly carefully +1832|62|1545|199.65|cial platelets wake always among the ideas. quickly bold Tiresias cajole furiously. blithely re +1833|34|6229|33.74|dencies cajole quickly quickly ironic deposits: final, pe +1833|77|6125|890.04|ts sleep quickly bold dolphins! special asymptotes according to the special packages use furiously quickly special platelets. accounts use slyly blithely +1833|20|7351|56.74|ounts cajole bold accounts. deposits haggle quickly across the blithely careful packages. requests doubt blithely alongside of the special +1833|63|8704|755.18| special, regular excuses could have to are carefully pending, express epitaphs. close accounts dazzle about the slyly regular deposits. furiously special pinto beans mold after the blithely +1834|35|7419|121.63|ar requests. slyly regular dugouts according to the regular accounts haggle alongside of the quickly pending packages. +1834|78|9513|501.88|nic asymptotes nag carefully. fluffily ironic ide +1834|21|4914|656.75|nal accounts. fluffily regular platelets are furiously. blithely regular excuses after the blithely slow f +1834|64|3930|233.34|bold requests. theodolites above the furiously ironic ideas nag carefully against the express deposits. fluffily bold requests at the blithely regula +1835|36|6150|970.17|c platelets. special deposits haggle. bold packages nag silently. pending reques +1835|79|3022|105.10| slyly ironic deposits nag blithely pending packages. slyly regular packages haggle +1835|22|570|387.73|ckly unusual packages haggle furiously regular requests; even accounts am +1835|65|4601|325.01| packages are above the final requests. bold courts wake regular accounts. fluffily bold foxes use against the packages. furiously silent reque +1836|37|5168|82.42|nic instructions. furiously regular accounts across the carefully express theo +1836|80|2700|861.31|carefully express deposits. blithely even accounts haggle even, bold requests. ironically regular accounts sleep blith +1836|23|9134|628.83|up the regular pinto beans. ideas wake slyly. regular dolphins doubt ironic, silent accounts. final platelets maintain against the theodolites. carefully unusual depos +1836|66|7225|463.53|about the final packages wake fluffily thinly regular hockey players. furiously final accounts use furiously pending packages. slyly regular frays cajole carefully slyly regular requests. unusual +1837|38|10|483.58|furiously along the furiously regular theodolites. final, ironic packages thrash express requests. ironic, even dep +1837|81|5214|780.86|tside the ironic packages affix special, unusual excuses. blithely bold p +1837|24|5037|260.44|s sleep closely busily even ideas. fluffily even requests nag ironic, even packages. stealthily regular instructio +1837|67|3427|837.20|l asymptotes. ironic, silent pinto beans wake furiously. carefully regular requests haggle special request +1838|39|5733|49.21|es. careful, regular deposits according to the blithely special foxes boost blithely above the slowly ironic instructions. courts nag. furiously close pa +1838|82|1734|217.56|he instructions. even, pending accounts was slyly furiously final asymptotes. special warthogs play carefully express +1838|25|4565|485.77|pending platelets. blithe deposits nag fluffily about the regular, regular instructions. slyly unusual excuses cajole carefully +1838|68|8708|643.53|refully unusual accounts sleep blithely. special, unusual deposits are even accounts. carefully ironic +1839|40|7626|766.68|special, final instructions. blithely busy requests wake fluffily final theodolites. regular theodolites cajole fluffily alongside of the regular theodolites. slyly ironic +1839|83|8972|640.36|the blithely bold platelets. carefully final warhorses lose furiously. furiously final theodolites cajol +1839|26|5798|433.50| final accounts. slyly regular theodolites use. slyly pending accounts across the platelets haggle slyly about the blith +1839|69|3736|281.94|al, pending instructions. fluffily special asymptotes cajole carefully before the carefully unusual accounts. +1840|41|4568|449.69|ans sleep blithely. even sheaves are furiously against the pending instructions. pend +1840|84|9246|761.66|nal, pending requests haggle slyly regular accounts. carefully regular sentiments alongside of the blithely regular ideas maintain c +1840|27|1356|96.11| cajole final, ironic orbits. carefully bold deposits across the blithely ironic deposits x-ray carefully even, unusual theodolites. quietly ironic packages nag slyly unus +1840|70|2373|242.69| packages sleep above the carefully final asymptotes. slyly bold pinto beans sublate about the packages. fluffily stealthy deposits haggle carefully. express, even excuses sleep carefully sil +1841|42|5471|230.68|atelets boost fluffily permanently ironic instructions-- blithely regular deposits among the slyly special accounts are slyly unusual instructions. blithely close accounts wake furiously. entici +1841|85|5526|174.11|eposits. regular, pending packages cajole carefully special dolphins. silent foxes sleep. requests may are +1841|28|2046|377.69|ng packages unwind above the fluffily even theodolites. regular pinto beans sleep furio +1841|71|9703|442.71|ve the packages. furiously ironic gifts sleep quickly about the slyly even courts. express instructions wake blithely among the blithely slow packages: fluffily final accounts are +1842|43|9291|188.63|ong the ironic platelets. sly excuses cajole carefully quick +1842|86|9517|788.60|ans. bold, regular pinto beans wake furiously despite the ironic deposits. permanently ironic foxe +1842|29|654|388.54|eneath the carefully ironic excuses. furiously final packages across the ideas must have to nag furiously ironic deposits. final deposits detect after the carefully bold platelets. perman +1842|72|8466|960.61| slyly unusual platelets after the even, regular deposits sleep fluffily a +1843|44|1955|158.29|at the furiously pending pinto beans. regular asymptotes sleep furiously after the fluf +1843|87|9467|261.40|y after the finally regular packages. fluffily unusual deposits wake carefully. pending tithes cajole fluffily. quickly ironic dinos wake carefully according to the furiously bold ideas. +1843|30|2172|933.98|uickly even excuses haggle quickly. carefully silent deposits +1843|73|7026|263.23|s grow blithely from the packages. fluffily even packages accordin +1844|45|8183|707.90|across the slyly special packages cajole after the blithely final foxes. requests cajole carefully blithely pending platelets. bold instructions cajole quickly along +1844|88|6605|685.75|sual pinto beans. pending ideas use furiously regular platelets. carefully even theodolites before the furiously final accounts run along the furiously even ideas. furiously r +1844|31|9119|126.82| unusual, even deposits instead of the blithely final packages integrate final pinto beans. furiously silent foxes cajole blith +1844|74|3878|854.12|ickly pending excuses. carefully close pinto beans haggle. carefully pending theodolites boost blithely across the final platelets. bold, regular req +1845|46|1585|607.75| final deposits sleep blithely about the special gifts. furiously unusual deposits use: requests wake f +1845|89|2886|760.73|structions affix slyly among the fluffily silent packages. blithely ironic foxes among the slyly special accounts nag furiously dolphins. idea +1845|32|6203|485.14|ackages cajole slyly about the quickly dogged theodolites. bravely special requests cajole. blithely bold requests haggle ironic deposits. caref +1845|75|513|129.05|rate slyly after the accounts. even, special dependencies along the furiously final accounts prom +1846|47|102|276.51| regularly. carefully express requests cajole. accounts cajole blithely. blithely blithe requests a +1846|90|933|199.85|l deposits haggle furiously alongside of the bravely even packages. accounts haggle. instructions are slyly. final asymptotes haggle quickly +1846|33|1604|387.20|ic patterns. carefully regular foxes wake packages. packages haggle blithely. even, regula +1846|76|1548|384.28|even deposits sleep around the close accounts. ironic instructions sleep. pinto beans snooze carefully. theodolites are carefully stealthy, pending accounts. ironic foxes use about the +1847|48|3239|338.36|s. blithely pending platelets haggle quickly in place of the furiously pending theodolites: fluffily bold ideas wake blithely final, unusual pint +1847|91|7057|720.30|ges nag blithely carefully final requests. daringly regular Tiresia +1847|34|3612|267.43|lly special asymptotes play unusual, ironic platelets; special packages serve carefully after the slyly special asymptotes. slowly special packages engage according to the slyly special foxes-- fina +1847|77|2827|425.19|dly blithely final requests. ironically unusual dependencies was after the evenly bold packages. blithely final pinto beans thrash. platelets above the ironica +1848|49|1125|545.12| never final theodolites. special, even ideas haggle +1848|92|3194|94.01|l, regular deposits. furiously final pinto beans use carefully according to the even deposits. furiously bold excuses mold. unusual, bold attainments sleep carefully express, ironic +1848|35|1695|821.22| use blithely unusual asymptotes. furiously express asymptotes x-ray blithely along +1848|78|2373|247.58|as wake carefully! accounts are blithely express, bold deposits. carefully pending packages must have to engage ruthlessly. furiously fina +1849|50|7562|382.50|te furiously about the final, ironic grouches. deposits are along the bold, bold platelets. ironic braids are. regularly ironic platelets detect e +1849|93|1330|264.74|e carefully ironically ironic platelets. silent deposits wake ruthless deposits: regular theodolites are furiously. furiously express pinto beans cajole. express deposits doz +1849|36|2644|169.21|riously permanent platelets cajole fluffily special ideas. special, ironic deposits integrate. accounts are. evenly bold ideas thrash against the final ideas. instructions print +1849|79|5399|944.04|hely blithely unusual ideas. fluffily special packages about the regular packages could have to wake blithely furious theodolites. regular accounts amo +1850|51|6687|383.15|y final accounts about the furiously final pinto beans affix blithely ironic accounts? pinto beans cajole among the blithely even deposits. carefully express instru +1850|94|2502|298.44| ideas. quickly ironic theodolites boost blithely. unusual requests +1850|37|188|116.05| ironic packages. even platelets sleep regular foxes: quickly unusual theodolites sleep carefully pending, ironic foxes: ironic foxes nag fluffily accordi +1850|80|8515|661.63| special ideas after the blithely final asymptotes nag fluffily above the quickly ironic requests. even, ironic foxes wake. bu +1851|52|5765|219.05|ly after the careful ideas! furiously bold packages sleep. blithely unusual requests nod according to the special, special forges. blithely final foxes serve carefully. blithely u +1851|95|4909|541.01|ideas. close accounts cajole around the furiously final accounts. slyly unusual plat +1851|38|7982|61.38|nic deposits with the carefully ironic theodolites wake furi +1851|81|6005|867.03|ly pending pinto beans. slyly final theodolites according to the ironic, final somas sleep careful +1852|53|4462|879.21|ly final accounts haggle blithely final foxes. pinto beans are. express, ironic deposits cajole slyly pendi +1852|96|105|803.15|fully even requests cajole carefully above the ironic, final packages. slyly final accounts sleep. silent requests cajole slyly express pinto beans. thin, enticing +1852|39|3998|126.40|lly unusual, special ideas. foxes sleep furiously boldly re +1852|82|645|848.43| regular pinto beans sleep. ironic, unusual requests detect carefully furiously pending packages. regular ideas may sleep carefully. regular ideas eat quickly blithely silent accoun +1853|54|8286|871.81|furiously. fluffily express asymptotes alongside of the pending accounts solve carefully fluffily unusual sentiments. carefully regular theodolites play blithely. quickly +1853|97|3561|213.16|uriously special dependencies cajole according to the quickly iro +1853|40|9351|406.13|en ideas. carefully regular packages poach after the slyly final theodolites. furiously express deposits above the deposits sleep q +1853|83|3758|863.42| slyly ironic deposits are across the blithely ironic instructions. quickly final deposi +1854|55|3825|150.59|ackages. blithely unusual forges use quickly platelets. slyly final accounts sleep blithely according to the furiously final ideas. furiously final reque +1854|98|9635|681.61|e finally even excuses. furiously express requests integrate. even decoys wake blithely after the even pinto beans. +1854|41|7147|424.51|ns mold slyly sometimes quiet pinto beans. ironic accounts cajole requests. blithely +1854|84|8252|998.96|ld ideas cajole above the bold, final accounts. ironic instructions detect slyly. express foxes detect blithely final foxes. slyly bold accounts sleep carefull +1855|56|7749|339.49|al instructions. deposits cajole-- ironic ideas detect. slyly dogged deposits above the ironic, final excuses cajole blithely foxes. furiously ironic deposits nag carefully after the regular +1855|99|4451|670.70|furiously above the regular, silent instructions. express, even instructions are. blithely final packages use furiously regular, even foxes. bold, unusual packages cajole carefully bold accounts. +1855|42|9411|895.52|s the packages. pending instructions use blithely according to the slyly unusual pac +1855|85|1559|105.59|y after the quickly bold accounts. furiously final accounts are slyly special, close requests. even accounts boost furiously final dependencies. slyly final deposits integrate furiously specia +1856|57|7134|665.98|ests. bold instructions serve permanently unusual foxes. ironically regular requests can haggle along the slyly ironic requests. quickly even Tiresias haggle at the silent platelet +1856|100|2050|445.67|ven foxes should wake quickly about the blithely p +1856|43|6083|989.99|ests around the slyly unusual deposits kindle according to the pending deposits-- ironic instructions against the blithely permanent pearl +1856|86|766|587.58| poach slyly among the blithely regular instructions. blithely unusual accounts mold slyly; bold accounts w +1857|58|8314|428.05|y final warthogs. final frets affix slyly. finally ironic requests use permanently along the quickly unusual packages. quickly regula +1857|1|6540|578.81|haggle permanently against the theodolites. slyly ironic platelets print blithely regular instructions. silent instructions sleep. bo +1857|44|2456|8.87|ly careful ideas use quickly. slyly final deposits serve across the deposits. furiously ironic requests cajole slyly quickly pending deposits. quickl +1857|87|1584|549.25|theodolites affix carefully according to the express, express excuses. final theodolites boost furiously above the blithely permanent requests. permanent, regular deposits haggl +1858|59|109|657.14|ven packages cajole furiously after the enticingly special instructions. even accounts are blithely furiously unusual pinto be +1858|2|9448|745.91|ions. quickly even forges hinder. bold frets boost according to the carefully express packages. slyly special ideas integrate furiously bold asymptotes. blithely unusual packages wake final packages +1858|45|7268|192.08|es. ironic deposits wake carefully. furiously regular requests above the furiously bold packages integrate blithely bold excuses. carefully enticing attainments wake. slyly ironic dependencies +1858|88|9175|831.09|hely bold excuses boost. even packages boost. busily close deposits integrate carefully furiously express deposits. final foxes haggle sl +1859|60|3090|193.11|sly at the special accounts. stealthily even foxes use carefully. ironic platelets integrate blithely according to +1859|3|8542|89.15|slyly for the final requests. close instructions lose after the pending requests. quickly even deposits across the final dependencies +1859|46|742|41.49|the final accounts. even deposits boost slyly across the carefully ironic +1859|89|9800|203.40|es. thinly express instructions engage. furiously express +1860|61|8882|131.24|leep packages. slyly regular packages are. carefully regular deposits are against the regular theodolites. ironic waters haggle alw +1860|4|8112|215.52| blithely across the even packages. slyly regular Tiresias cajole blithely ironic, special courts. furiously special patterns detect. excuses alongside of the pinto beans haggle furiously carefully +1860|47|1851|173.11|ncies. blithely even asymptotes are blithely across th +1860|90|8702|675.85|ccounts. special packages print. unusual pinto beans cajole slyly regular accounts. furiously pending deposits along the final packages boost carefully according to th +1861|62|3956|487.39|nst the blithely even packages. final packages haggle furiously furiousl +1861|5|2379|874.34|gle against the unusual sentiments. regular courts integrate. carefully regular foxes cajole fluffily. per +1861|48|5719|820.54|re furiously quickly regular packages. quickly special pinto beans believe regular instructions. unusual, bold instructions above the bravely unusual asymptotes dazzle blithely final foxes! t +1861|91|6700|775.85|ular theodolites doze carefully along the carefully final theodolites. unusual sentiments sleep bravely final foxes. final packages above the daringly special foxes cajole care +1862|63|3249|867.48|uests nod furiously among the final, express packages! final theodolites boost blithely. furious, ironic theodolites nag slyly pending +1862|6|5277|476.53|ly special platelets. instructions haggle after the attainments. ideas are slyly after the packages. regular, ironic packages are around the platelets. slyly regular dependencies cajole. +1862|49|5515|167.05|slyly quickly even deposits. quickly special grouches after the fin +1862|92|6066|611.28| the packages nag among the furiously bold accounts. slyly final requests haggle regularly about the slyly ironic platelets. packages doze blith +1863|64|2473|276.35|accounts wake special requests: unusual, ironic requests about the slyly regular accounts a +1863|7|6866|439.78|kly thin Tiresias cajole quickly after the slyly express theodolites. fluffily regular decoys affix? busy excuses are furiously quickly final deposits. blithely +1863|50|8256|953.33|iously slow, special packages. regular foxes along the slyly final deposits are after the careful +1863|93|8883|767.93|y bold dolphins. excuses integrate fluffily unusual accounts. bold ex +1864|65|8998|624.76|eas need to cajole platelets. unusual, final packages are fluffily regular, regular instructions. +1864|8|1484|943.61|es haggle. unusual, regular theodolites haggle after the even foxes. slyly even requests are quickly about the theodolites. busily ironic instructions at the blithely regula +1864|51|2402|251.65|refully unusual deposits sleep furiously express requests. express theodolites affi +1864|94|5217|987.53| instead of the express, special packages cajole carefully slyly pending theodolites. carefully thin deposits sleep slyly. slyly ironic dinos among the blithely special theodolites boost regular, s +1865|66|6994|122.70|deposits against the blithely express instructions integrate except the ideas. quickly pending frays at the fluffily special pinto beans are furiou +1865|9|3341|443.48|unusual deposits wake quickly regular packages. accounts run car +1865|52|2786|196.56|ounts are. blithely ironic sentiments haggle. carefully silent deposits solve slyly regular packages. blithely regular ins +1865|95|2365|143.09|excuses detect blithely pending pinto beans! blithely regular instructions wak +1866|67|6424|548.22|ular deposits; silent accounts was carefully carefully ironic notornis. blithely regular requests nag carefully slyly bold +1866|10|3059|292.78|bove the fluffily regular ideas. furiously bold asymptotes nod furiously fur +1866|53|2720|935.97|carefully ironic instructions wake carefully fluffily even foxes. carefully unusual packages across the furiously regular requests wake furiously regular requests. fu +1866|96|8168|661.03| requests lose evenly furiously pending packages. slyly pending ideas sleep furious +1867|68|848|144.81|. quickly unusual accounts haggle fluffily express hockey players. regular, busy foxes integrate express deposits. pinto beans cajole carefully b +1867|11|9464|548.59|ideas nag. slyly ironic theodolites sleep quickly unusual packages. deposits are about the blithely regular pinto beans. blithely ironic packages detect slyly according +1867|54|9810|488.88|ular asymptotes. quickly express instructions are ironic deposits. furiously regular platelets wake carefully. regular +1867|97|8716|34.49|sly requests are furiously after the regular packages. finally unusual deposit +1868|69|1000|506.87|ly since the blithely special requests. unusual, even packages promise against the carefully express +1868|12|6243|626.78|ages. fluffily unusual deposits along the slyly express ideas boost amo +1868|55|1228|26.31|iously even requests sleep carefully ironic pinto beans. final theodolites are blithely. furiously express depo +1868|98|6200|855.52|ts. ironic accounts grow silent, special foxes. final, regular forges boost along the blithely unusual packages. depend +1869|70|1462|197.88|aggle fluffily after the carefully even platelets. even ideas wake. slyly special packages sleep beside the final, pending accounts. unusual packages nag bl +1869|13|5652|280.73|onic accounts cajole. carefully regular accounts sleep across the express theodolites. packages haggle furiously. instructions was caref +1869|56|772|177.66|nusual, ironic dependencies wake regular requests. regular ideas integrate above the permanently final pinto beans. slyly pending multipliers impr +1869|99|5080|85.82|ding, pending accounts. furiously unusual deposits integrate thinly against the regular depe +1870|71|4792|121.04|xes cajole special courts. quickly silent foxes above the bold theodolites could have to wake blithely among the quickly pending dolphins. furiously regular packages wake around t +1870|14|6472|527.64|yly final theodolites integrate carefully about the instructions. ironic foxes run final requests. carefully silent foxes nag ironically even courts. si +1870|57|1194|164.67|nusual warthogs according to the silently pending deposits boost furiously +1870|100|8225|608.58|l packages. pending, pending pinto beans boost carefully fluffily even requests. doggedly regular theodolites sleep. platelets haggle carefully +1871|72|309|730.88|ecial deposits according to the stealthily pending accounts are after the slyly even packages. carefully permanent dependencies are regular pinto beans. dependencies in +1871|15|9101|357.87|st furiously about the carefully ironic requests. final, ironi +1871|58|5504|917.62|to the bold ideas cajole slyly alongside of the carefully even accounts. carefully ironic deposits cajole quickly th +1871|1|8420|971.86|refully even accounts are blithely. quickly regular foxes are thinly ironic asymptotes. unusual platelets use furiously across the boldly final accounts. ironic, unusual packages wake slyl +1872|73|4049|447.75| at the final accounts. carefully unusual courts boost. final theodolites are carefully +1872|16|7877|67.83|ing to the furiously silent packages. slyly even theodolites detect. furiousl +1872|59|8482|353.57|special pinto beans. slyly special hockey players haggle around the carefully final packages. pinto beans +1872|2|7011|609.75|s. fluffily regular packages wake bravely among the blithely ironic theodolites. carefully final deposits haggle. foxes after the ca +1873|74|2893|559.95|ructions according to the bold deposits sleep quickly grouches. slyly regular instructions haggle +1873|17|3180|629.18| beans integrate regular, regular requests. carefully careful theodolites eat among the slyly even instructions. blithely regular orbits haggle. sometimes pending forges sleep slyly among the r +1873|60|6909|318.13|ar accounts integrate furiously dolphins. quietly unusual requests are. slyly even p +1873|3|9489|405.31| blithely pending instructions cajole regular packages. fluffily final sauternes across the ironic +1874|75|9264|53.62|usual platelets wake. requests across the ironic theodolites sleep furiously unusual requests. even foxes along the silent foxes detect according to the regular, express platelets. carefully unusual +1874|18|3841|281.06|iously ironic deposits. furiously ironic packages cajole slyly about the unusual accounts. slyly +1874|61|3130|639.97|the blithe courts unwind above the quickly special requests. dolphins promise slyly slyly stealthy requests. final deposits cajole along the pending sentiments. quickly fina +1874|4|891|934.95|deposits wake carefully. blithely pending accounts wake slyly slyly ironic ideas. final, regular foxes across th +1875|76|662|613.02|nts across the special foxes use bold ideas. fluffily ironic instructions wake slyly according to the blithely unusual hockey players. final accounts affix. slyly +1875|19|9412|485.17|counts. furiously regular platelets dazzle furiously. asymptotes cajole quickly excuses. packages use furiously above the slyly ironic deposits. slyly regular ideas cajole quickly +1875|62|6727|564.92|l instructions. blithely special dependencies wake slyly after the final pinto beans: quickly express +1875|5|6575|245.16|ts thrash blithely. bold requests wake. enticingly idle deposits are. special packages wake across the regular accounts. furiously regular foxes nag. sil +1876|77|8057|684.87|vely along the fluffily pending deposits. quickly regular requests could wake carefully. bold packages m +1876|20|2144|214.93|onic foxes use against the requests. waters sleep warthogs. furiously final requests are blithely beyond th +1876|63|966|92.53|al accounts wake about the regular accounts. special deposits eat slyly. furiou +1876|6|6544|874.55|ves haggle blithely among the ruthless, final packages. quickly final instructions sleep carefully. theodolites above the regular accounts engage along the even dependencies. ironic ideas aff +1877|78|2300|363.91| express asymptotes. bold foxes wake carefully about the never final requests. regular theo +1877|21|9797|617.32|endencies cajole carefully ironic, even packages. slyly final foxes according to the slyly pending pinto beans affix carefully about the silent dependencies +1877|64|5569|840.81|usly stealthy packages? regular requests after the final, ironic platelets are against the q +1877|7|370|804.42|al accounts sleep. ideas kindle regular, regular deposits. pending pearls sleep furiously until the slyly regular asymptotes. stealth +1878|79|3320|567.35|n instructions-- blithely final accounts cajole; slyly final dependencies sleep among the ironic, even requests. ironic, regular packages haggle carefully final packages. unusual requests engage c +1878|22|2556|245.70|gular deposits are slyly final excuses. blithely final pinto beans along the carefully unusual pinto +1878|65|8183|903.04|uriously ironic asymptotes. final, pending packages across the special deposits nag furiously even p +1878|8|6260|708.19|slyly furiously bold requests! deposits wake quickly; blithely final accounts above the blith +1879|80|934|643.60| packages wake fluffily. silent ideas are. carefully final packages haggle. express, unusual packages cajole. ruthlessly final requests haggle carefully fluffily pending accounts. slyly +1879|23|6795|894.87|carefully regular theodolites sleep blithely furiously regular theodolites. ironic th +1879|66|4287|180.66|use. furiously final accounts cajole carefully. ironic requests haggle fluffily after the slyly thin +1879|9|8505|541.48|posits nag blithely final theodolites. furiously final multipliers are fluffily quickly silent instructi +1880|81|4483|953.49|usly along the careful requests. regular, ironic ideas wake fluffily: requests cajole carefully according to the fluffily bold packages? blithely bold a +1880|24|6785|436.79| sleep even accounts. ironically final packages boost along the blithely regular requests. blit +1880|67|5745|669.72|refully ironic packages along the ironic, final Tiresias sleep slyly according to the permanent, fi +1880|10|7547|424.02| cajole furiously across the bold requests. slyly even instructions sublate furiously regularly final sheaves. never +1881|82|341|810.63|the blithely bold requests. special foxes alongside of the foxes wake slyly blithely even instructions. ruthless, even packages maintain. final accounts dazzle c +1881|25|6776|35.11|ogs affix regular, pending somas. requests nod fluffily around the carefully ironic excuses. furiously regular dolphins a +1881|68|7365|978.73|uickly above the furiously special accounts. fluffily unusual excuses was fluffily special, bold depths. instructions nag slyly. speci +1881|11|8105|105.47|lithely unusual instructions; special, special packag +1882|83|9673|662.02|s. quickly ironic foxes integrate permanently among the quickly final pinto beans. doggedly even deposits boost carefully. even, pending asymptotes wake across the final asymptotes. final grouche +1882|26|6238|800.05|xes sleep quickly across the slyly pending dolphins. requests wake slyly deposits. slyly pen +1882|69|1940|980.44|onic instructions? final, bold dependencies about the dependencies sleep across the carefully dogged packages. regular deposits are pending packages. blithely regular +1882|12|8928|845.09|regular packages. furiously even packages maintain fluffily final packages. slyly final instr +1883|84|2359|778.26| nag quickly regular asymptotes. enticingly silent ideas cajole. furiously express instructions sleep multipliers. ironic accounts wake furious +1883|27|1411|422.43|ts breach according to the slyly ironic packages. express, unusual dependencies mold finally. fluffily ironic ideas hag +1883|70|1157|93.67|al packages across the furiously final packages haggle above the carefully pending requests. furiously special deposits wake about the regular platelets. unusual ideas haggle. slyly unusual p +1883|13|8548|202.25|s sauternes. theodolites nod quickly around the furiously ironic packages. ironic theodolites across the quickly ironic dependencies haggle against the ironic +1884|85|9702|774.42|l, even packages. slyly special accounts after the blithely express excuses solve quickly blithely final dolphins. slyly unusual saute +1884|28|3308|825.75|sly bold sauternes thrash even epitaphs. carefully regular requests snooze packages: close, bold instructions cajole. pinto beans cajole carefully regular asymp +1884|71|3047|334.50|even foxes cajole blithely alongside of the regular depths. carefully quiet excuses sleep carefully regular excuses. carefu +1884|14|3465|710.89|olites cajole evenly final, bold theodolites. slyly express dependencies nag blithely. theodolites boost carefully. special theodolites nag. furiously regular pinto +1885|86|3167|23.51|y according to the bold courts. quickly ironic accounts in place of the furiously final packages engage carefully alongside of the slyly final packages. +1885|29|4703|795.83| unusual packages. slyly regular packages maintain furiously after the pending ideas. quick +1885|72|1018|29.46|ecial platelets. furiously unusual packages wake slyly by the ironic gifts: slyly silent accounts about the express excuses ca +1885|15|7657|879.12|s along the furiously express accounts boost slyly quietly even court +1886|87|9501|317.82|s affix against the platelets. gifts according to the fluffily final courts sleep along the furiously even dolp +1886|30|9063|71.99|gular platelets. blithely even dolphins sleep furiously even requests. carefully regular ideas s +1886|73|6773|445.22|eful deposits according to the furiously unusual accounts sleep regular requests. carefully re +1886|16|1177|520.56| final deposits. special packages use quickly according to the quickly silent requests. blithely unusual excuses cajole. blithely final packages use blithely unusual deposits. ironi +1887|88|1763|950.71|ithely even attainments. silent, even theodolites are +1887|31|4155|661.23|. careful, even instructions about the slyly special pinto beans cajole slyly fluffily ironic packages. blithely unusual packages are ideas. blithely even accounts sleep. re +1887|74|9721|584.44| above the final, even requests use final, express packages. blithely final accounts among the fluffily final deposits s +1887|17|6852|720.12|slyly after the carefully final foxes. blithely unusual courts wake-- regular theodolites are busily ironic foxes. quickly sly requests cajole slyly. fluffily p +1888|89|6777|297.23|usly according to the slyly regular requests. furiously regular packages boost fluffily-- furiously regular instructions nag even pinto beans? stealthily br +1888|32|8829|781.94|he carefully even requests sleep evenly about the ironic instructions. accounts about the packages cajole quickly carefully dogged dependencies. slyly even ideas use. quickly +1888|75|9696|280.76|according to the furiously final tithes are carefully after the fluffily regular excuses. slyly bold asymptotes are blithely fluffily blithe accounts. bli +1888|18|162|699.14|leep quickly. carefully ironic pinto beans after the quickly regular +1889|90|6330|392.91| enticing packages. blithely even theodolites are carefully quickly bold accounts? slyly ironic frets cajole alongside of the regular packages. f +1889|33|3382|484.46|s. pinto beans cajole. sometimes final requests x-ray. blithely ironic warhorses cajo +1889|76|9824|574.10| boost permanently. fluffily even theodolites use. furiously unusual accounts cajole boldly above the furiously final frets. +1889|19|5512|673.37|deas wake against the carefully regular packages. foxes use slyly. carefully reg +1890|91|5417|748.25|ts affix blithely after the pending warthogs. regular theodolites at the slyly final epitaphs sleep thinly about the furiously regular pinto beans. even, express +1890|34|9100|512.91|s sleep fluffily asymptotes. carefully pending packages wake according to the carefully final theodolites. slyly express theodolite +1890|77|9243|276.83|nusual depths wake slyly alongside of the accounts! carefully even instructions wake slyly ironic accounts. quickly ironic deposits cajole blithely against the fluffily +1890|20|995|629.58|as above the regular, slow requests sublate slyly carefully pending deposits. +1891|92|9067|119.48|al ideas? slyly final requests after the slyly even requests +1891|35|3676|269.49|efully even packages. carefully unusual warhorses c +1891|78|9897|100.98|ly along the furiously enticing courts. carefully regular accounts cajole furiously. carefully ironic deposits cajole carefully. deposits about the even, r +1891|21|5443|80.50|bt furiously against the fluffily regular excuses. quickly pending excuses wake blithely. furiously regular theodolites use across the accounts. sl +1892|93|4562|500.49|ing accounts. furiously final requests detect blithely about the quickly special accounts. carefully unusual pint +1892|36|5184|344.30|gular ideas. quickly pending foxes nag fluffily. pending pinto beans sleep. quiet, ironic cour +1892|79|472|572.73| foxes detect blithely. carefully silent packages doubt slyly final ideas. express, regular platelets sleep furiou +1892|22|3763|639.43|quickly special foxes haggle after the final ideas. fluffily pending a +1893|94|8578|858.48|al packages are requests. notornis sleep fluffily slyly regular accounts. requests boost furiously car +1893|37|1282|110.63|s. even, ironic dependencies mold across the carefully bold asymptotes: regular, regular asymptotes after the even, ironic requests are furiously along the accounts. unusual, pending dependenci +1893|80|3414|524.37|riously ironic somas across the regular, unusual multipliers detect furious +1893|23|1434|120.01|ely regular foxes. blithely quiet instructions cajole regular excuses! ironic excuses wake carefully against the carefully special somas. blithely even ideas boost slyly! furiously +1894|95|1373|301.95|press. sometimes express pinto beans boost; blithely even ideas wake on the furiously regular acco +1894|38|1651|177.58|y even pinto beans. even pinto beans are carefully alongside +1894|81|5910|738.24|s are slyly against the blithely ironic Tiresias. regular ideas are carefully. final accounts are furiously under the furiously dogged pinto beans. carefully brave theodolites hinder carefully ac +1894|24|6928|204.54|oxes wake sometimes doggedly even foxes. slyly final packages affix slyly-- blithely regular packages affix idly across the ironic theodolites. fluffily regular deposi +1895|96|7358|340.67|lyly bold pinto beans. quickly final deposits nag carefully. furiously careful patterns use slyly s +1895|39|7052|559.27|eodolites are furiously unusual deposits-- pending, even pinto beans among the carefully silent foxes sleep permanently after the carefully +1895|82|4450|301.79|inst the pending packages. quickly special deposits cajole. furiousl +1895|25|4930|417.31|ic packages sleep fluffily across the blithely even deposits. slyly express requests grow quickly slyly dogged requests. slyly final id +1896|97|4860|884.81| should are notornis. final, ironic instructions sleep. slyly unusual deposits are doggedly. fluffily final ideas according to the furiously express ideas hinder slyly slyly final +1896|40|5531|942.09| pending requests are final requests. stealthily special dinos must sleep +1896|83|264|702.09| requests. fluffily special deposits haggle permanently. unusual asymptotes are. accounts against the quickly ir +1896|26|1512|930.50| even deposits boost according to the regular accounts? idle ideas cajole silently stealthy, fluffy excuse +1897|98|4442|592.77|packages? close, pending requests sleep carefully. +1897|41|4801|756.71| haggle fluffily fluffily bold orbits. furiously final theodolites integrate q +1897|84|9701|811.56|even pinto beans x-ray instructions. ironic dependencies along the carefully unusual packages wake slyly b +1897|27|8470|630.51| regular theodolites around the carefully silent packages use slyly according to the furiously ironic deposits. slyly fluffy theodolites according to the f +1898|99|554|774.72|e always regular courts wake fluffily even deposits. slyly ironic accounts cajole slowly bold, final platelets. pending accounts are carefully across the unusual packages. doggedly special foxe +1898|42|1335|854.93|e carefully slyly regular frets. quickly express pinto beans integrat +1898|85|8381|254.16|ing to the pending deposits haggle quickly carefully express theodolites. fu +1898|28|1298|180.25|ly. bold deposits are pending, regular theodolites. blithely permanent dependencies boo +1899|100|6296|680.33| accounts are furiously according to the blithely unusual packages. quickly special requests about the bold theodolites cajole fluffily across the slyly unusual excuses. accounts haggle carefully. +1899|43|5769|956.90|after the even, special foxes. special deposits after the quickly express ideas haggle among the accounts! furiously ironic requests around the even foxes affix carefully furiously regular ideas. c +1899|86|9884|763.95|special, even requests along the blithely final theodolites sleep blithely ironic pinto beans. requests haggle blithely. slyly unusual requests haggle furious +1899|29|1008|655.63|le. regular accounts wake fluffily across the furiously ironic accounts. final accounts nod furiously carefully special accounts. dolphins shall have to use slyly across the carefully regular asym +1900|1|2512|427.04| deposits. silent, final excuses detect fluffily quickly ironic warthogs. furiously busy instructions are above the slyly unusual instructions. asymptotes use regular asymptotes. +1900|44|9587|583.28|ously regular requests; carefully special packages affix quickly up the carefully unusual theodolites. express requ +1900|87|263|230.98|arthogs use carefully ironic, special excuses. blithely regular foxes cajole along the carefully even accounts. quickly pending pinto beans sleep furiously. regular dependencies haggle blit +1900|30|6955|188.88|iously regular theodolites. carefully express requests sleep quickly. even, pending ideas cajole carefu +1901|2|4457|872.64| deposits can cajole blithely fluffily regular instructions. bold requests haggle furiously regular accounts; express, regular asymptotes m +1901|46|8938|331.04|ic deposits. blithely pending deposits are. quickly slow accounts are sl +1901|90|8181|553.55|onic instructions. ironic, express requests about the slyly express pinto beans detect after the express deposits. requests sleep. slow packages detect fluffily carefully dogged deposi +1901|34|6712|60.53|e fluffily final accounts sleep furiously regular packages. carefully regular accounts wake quickly bold, even requests. blithely regular accounts engage +1902|3|4705|581.79| accounts. regular dependencies could wake slyly inside the carefully regular deposits. unusual deposits according to the slyly ironic foxes wake instead of the regular, ironic accounts. +1902|47|2430|34.59|pitaphs affix alongside of the blithely final packages. final, regular deposit +1902|91|133|119.98|gular tithes. finally ironic deposits cajole blithely final, regular accounts. carefully regular deposi +1902|35|1723|829.36|inal requests. furiously regular pearls are blithely special courts. dependen +1903|4|7439|81.37|quests. furiously express foxes nag. furiously unusual dolphins haggle slyly accounts. special, express orbit +1903|48|4695|137.01|fily special deposits according to the ironic accounts promise carefully regular instructions. bold requests along th +1903|92|867|345.74|d deposits. foxes against the unusual pinto beans use blithely along the carefully +1903|36|1293|885.90|fully across the decoys. quickly ironic instructions are furiously above the carefully pending i +1904|5|4974|379.25|he furiously pending excuses. quickly even decoys wake carefully. even pinto beans around the ironic instructions haggle furiously instructions. final platelets wake sl +1904|49|4758|664.27| the furiously even foxes. final requests haggle furiously slyly even packages! ironic requests above the final escapades solve acr +1904|93|4107|655.08|s. blithely silent foxes cajole boldly regular de +1904|37|496|84.99|pending, careful requests. unusual theodolites alongside of the depe +1905|6|2650|136.79|bold courts; carefully express deposits haggle fluffily around the bold, regular ideas. regularly +1905|50|8180|623.85|he regular accounts. ironic deposits lose fluffily. foxes wake against the bold sheaves. fluffily regular pinto beans are against the carefully pending requests. accounts are after the caref +1905|94|3299|773.92|ns cajole special ideas. blithely bold pinto beans integrate regular, special packages. carefully special attainments within the r +1905|38|553|425.19|oldly above the ironic, even pinto beans. blithely ironic pains after the pinto beans sleep quickly ruthlessly ev +1906|7|2500|436.46|y across the pending, regular depths. instructions serve quickly regular instructions. blithely final deposits sleep furiously deposits. regular, ironic requests haggle. +1906|51|6118|113.35| to the ironic, regular accounts nag thinly against the quickly even requests. final pinto beans sleep blithely. bold accounts detect furiously along the +1906|95|9309|174.70| players. slyly express courts play quickly across the regular, express requests. blithely even instructions maintain quickly across the quickly special excuses. quickly fin +1906|39|1821|386.55| blithely regular deposits about the even packages wake carefully about the ideas. slyly ironic instructions across the carefully even ideas are quickly even foxes. blithely even +1907|8|4774|516.07|, express dugouts cajole furiously against the even, unusual escapades. carefully pending platelets are carefully ironic requests. realms wake. slyly regular courts cajole caref +1907|52|3655|388.81|s are carefully express accounts. carefully silent epitaphs use carefully among the final packages. carefully express requests are furiously final, final deposits. +1907|96|5786|389.96|blithely bold accounts. fluffily even requests solve +1907|40|627|761.25|ainst the furiously brave deposits run regularly special dependencies. quickly ironic deposits detect alongside of the +1908|9|8822|201.18|efully ironic packages sleep carefully across the slyly ironic packages. slyly final pinto beans nag above the deposits. furiously pending packages would cajole according to the eve +1908|53|5074|870.70|efully alongside of the even, silent pinto beans. quickly special requests +1908|97|31|587.21|t slyly until the blithely regular ideas. even deposits within the fluffily pending requests detect slyly against the requests. express +1908|41|2987|332.63|regular requests about the ironic pinto beans wake blithely from the regular platelets. carefully pending packages cajole. slyly special de +1909|10|9284|293.56|y final depths haggle after the carefully ironic packages. deposits are against the carefully regular requests. slyly regular sheaves boost against the packages. ir +1909|54|8668|92.84|ar, pending foxes about the instructions affix quietly blithely close deposits? packages no +1909|98|8614|104.99| ideas. slyly pending foxes cajole blithely. special dependencies sleep alongside of th +1909|42|4705|623.68|gle even accounts. carefully permanent pinto beans would wake? idly express accounts detect furiously. instructions haggle slyly even, regular instructions. blithe, express deposits impress +1910|11|7879|916.18|s. furiously bold requests cajole quickly. quickly ironic courts affix accounts. ironic accounts wake. carefully bold a +1910|55|4062|821.43|s sleep fluffily alongside of the ruthless, regular requests. never pend +1910|99|2789|798.44|s haggle slyly after the instructions. blithely even waters doubt slyly silent deposits. carefully unusual depths haggle. regular +1910|43|8252|941.76|nts above the blithely special foxes wake furiously final plate +1911|12|3823|70.01|e unusual, final theodolites nag slyly above the fluffily even platelets. slyly ironic accounts sleep slyly. furiously special accounts after +1911|56|7996|132.86|egular packages snooze slyly. unusual packages boost regular sauternes. dogged, even accounts +1911|100|9552|397.73|equests around the ironic requests haggle quickly unusual accounts. pending packages use slyly. deposits doze fluffily dependencies-- evenly iro +1911|44|3028|587.73|iously final accounts cajole about the carefully final deposits. fluffily final asymptotes around the furiously final pinto beans sleep slyly carefu +1912|13|1828|968.50|ts. bold, brave packages affix slowly unusual deposits. bold ins +1912|57|3658|952.12|theodolites sleep ironic excuses. slyly final dependencies among t +1912|1|2388|388.45|st the slyly final theodolites! stealthy theodolites shall nag sl +1912|45|3971|487.64|ely blithe requests nag quickly decoys. quickly regular foxes sleep quickly. fluffily even pinto +1913|14|4928|196.57| carefully sly deposits. furiously special deposits haggle blithely. fluffily ironic requests cajole. requests haggle slyly. ironic, quiet excu +1913|58|3074|225.45|uriously according to the quickly regular packages. final dolphins shall have to haggle carefully-- blithely ironic packag +1913|2|7958|167.66|thely even ideas. slyly even packages wake according to the slyly r +1913|46|4808|838.71| requests wake furiously regular pinto beans. carefully furious deposits engage fluffily carefully special packages. slyly regular deposits mold above the slyly even pinto beans. fluffily silent ide +1914|15|9865|357.03|, ironic deposits. furiously regular requests boost furiously regular ideas. deposits sleep furiously about the regularly express theodolites +1914|59|3584|830.94|. furiously regular packages haggle. express, final ideas across the furiously final requests haggle furiously special, unusual foxes. pe +1914|3|3962|660.37|osits. quickly express foxes sleep. instructions are fluffily. blithely r +1914|47|2697|117.00|al forges cajole closely. multipliers wake carefully. pinto beans wake. final dependencies around the regular r +1915|16|7309|649.65|he carefully ironic warhorses cajole blithely quickly regular requests. furiously express excuses according to the regular, bold excuses sublate thinly acros +1915|60|6131|742.13|s wake carefully requests. fluffily brave theodolites sleep blithely. unusual instructions need to cajole slyly express pinto b +1915|4|9606|561.78|c pinto beans cajole quickly above the stealthily silent accounts. regular instructions sleep carefully blithely express requests. regular, final requests nag slyly special foxes. slyly p +1915|48|3044|437.85|ly express ideas. furiously even accounts unwind carefully against the final, special platelets. bold instru +1916|17|3644|557.84|e pinto beans run slyly. carefully final dependencies wake. slowly pending accounts use quickly after the special accounts. regular, ironic platelets boost per +1916|61|3639|245.08|heodolites. furiously silent packages haggle stealthily instructions. r +1916|5|4599|380.31| quickly pending pains around the slyly pending platelets nag against the express deposits. furiously final hockey players sleep across the carefully regular package +1916|49|800|445.43|olites cajole carefully with the furious platelets. doggedly final instructions about the furiously even requests sleep after the bli +1917|18|6642|39.63| slyly. quickly final theodolites dazzle slyly furiously ironic deposits. fluffily final asymptotes sleep carefully slyly express ideas. express accounts nag blithely regular dolphins. fin +1917|62|6403|972.56|ole fluffily slyly final deposits. fluffily regular accounts are. pending accounts nag ironic, unu +1917|6|4174|213.64| fluffily even hockey players haggle upon the regular foxes. quickly regu +1917|50|5939|428.21|eodolites: carefully regular requests affix furiously. waters wake slyly among the slyly special deposits +1918|19|3892|280.68|uriously slyly express notornis. blithely pending ideas cajole quickly quietly ironic platelets. final ideas after the busily special dep +1918|63|6920|406.03|gular dependencies. dinos haggle deposits. bold, final asymptotes among the final requests wake slyly quickly even requests. even, pending requests believe across the slyly ironic accounts. furi +1918|7|245|195.16|its nag outside the evenly special instructions. ideas sleep regular deposits. blithely special +1918|51|8443|637.55|bold packages. slyly express packages cajole along the blithely pending somas. blithely even pinto beans doubt permanently. furio +1919|20|1933|136.43|press theodolites across the ironic epitaphs are ironic, bold packages. dugo +1919|64|2496|494.35| instructions boost. furiously unusual accounts use. unusual, even pinto beans after the regular dugouts wake according to the bold instructions. slyly silent +1919|8|3892|115.82|t packages kindle according to the ironic, ironic dependencies? ironic packages sleep. carefully ironic packages use q +1919|52|3925|825.24|ickly along the ironic, regular ideas. regular, regular theodolites are slyly along the regular deposits. furiously unusual pinto beans sleep around the silent Tiresias. blithely spe +1920|21|5249|735.54| requests. furiously regular requests integrate carefully. blit +1920|65|7651|746.84| deposits. quickly regular theodolites are final instructions. warhorses detect ironic pinto beans. fluffily regular requests sleep carefully after the slyly expres +1920|9|9214|901.33|e furiously bold requests. ironic ideas wake idly. bold deposits are special packages. carefully final accounts hag +1920|53|3846|948.49| cajole furiously after the fluffily ironic accounts. furiously pending packages sleep blithely. deposits haggle regularly. furiously ironi +1921|22|175|312.29|ithely bold dolphins. carefully regular excuses are slyly quickly unusu +1921|66|8386|85.46|y bold packages. carefully special foxes sublate slyly. blithely bold instructions are slyly above the regular foxes. fluffily s +1921|10|2383|44.81| the finally regular ideas haggle blithely about the instructions; furio +1921|54|1142|167.74|lithely ironic accounts use fluffily slyly ironic accounts. packages wake about the ironic instructions. regular, +1922|23|10|259.69|ly ironic excuses-- courts are carefully. carefully even courts snooze boldly across the +1922|67|4370|150.41|detect according to the packages. never ironic tithes nag. even foxes detect blithely after the slyly bold theodolites +1922|11|2633|641.05|c dependencies. carefully special accounts are slyly according to the even foxes. requests against the furiously regular requests wake slyly around +1922|55|4061|73.40|e carefully special dolphins; unusual dependencies believe blithely up +1923|24|4076|42.99|cajole fluffily packages. bold, regular deposits against the quietly pending theodolites wake idly ironic foxes. furiously express packages haggle. always special +1923|68|8770|552.47|furiously quickly special instructions. blithely regular theodolites cajole. final packages are. thinly unusual braids alongside of the pending asymptotes are daringly above the bli +1923|12|6385|869.40|regular instructions are slyly against the regular deposits. unusual, even accounts are carefully final, pending ideas. slyly even r +1923|56|6357|719.09|heodolites haggle carefully; carefully even packages above the slyly special foxes wake sl +1924|25|2433|942.05|eposits cajole blithely. final, bold foxes x-ray carefully close deposits. blithely final asymptotes across the +1924|69|7234|971.12|l forges. ironic requests nag quickly quickly regular pinto beans. regular deposi +1924|13|7210|37.33|blithely regular theodolites. ironic, final packages wake idly. slyly furious accounts mold quickly regular, even +1924|57|4542|257.80|ess requests breach fluffily among the slyly regular packages: slyly final deposits nag blithely carefully +1925|26|1095|346.20|usly bold notornis boost slyly. slyly even asymptotes nag deposits. slyly regular accounts use fluffily slyly even deposits. bold accounts nag doggedly even, dogged deposits. quickly b +1925|70|4563|531.48|ut the express attainments affix fluffily above the carefully stealthy as +1925|14|3791|724.95|kages wake blithely according to the unusual platelets. even platelets wake among the ironic, final packages. pending requests among the blithe +1925|58|8139|501.44|ts are fluffily. regular foxes boost quickly platelets. carefully express pinto beans are carefully. blithely pending pinto be +1926|27|3197|330.02|cial instructions nag furiously against the slowly pending dependencies. slyly regular accounts about the quickly regular platelets hinder idly about th +1926|71|2200|424.36|ajole furiously. bold, ironic theodolites nod? blithely regular requests sleep blithely slowly ironic accounts. blithely silent packages wake. regular ideas among the ironic dependencies us +1926|15|2027|512.38|ilent pinto beans. furiously pending packages maintain. quickly quiet deposits wake according to the final dependencies. slow, bold accounts cajole caref +1926|59|9827|392.66|sly bold notornis. blithely regular pinto beans about the carefull +1927|28|2362|167.52|kly pending sentiments boost along the carefully ironic instructions. special, pending pinto beans affix blithely unusual, p +1927|72|6180|515.62| sleep. final theodolites are. unusual instructions nag slyly final requests. fluffily regular gifts use. carefully regular acco +1927|16|2820|864.90|ers. attainments after the regular ideas wake carefully above the special foxes. even +1927|60|5005|35.33|ng packages. slyly close requests doubt. carefully unusual multipliers are blithely against the unusual, final packag +1928|29|2293|654.36|old deposits against the ironic dolphins wake furiously bold courts. unusual courts are slyly instructions. carefully special theodolites will cajole carefully ironic ac +1928|73|5753|40.07|ackages sleep along the express, regular deposits. accounts mold furiously blithely silent requests? slyly pending requests nag quickly daring dolphins. pending frays haggle b +1928|17|8711|455.16|s. unusual Tiresias nag furiously. carefully final deposits haggle doggedly regular accounts. furiously quiet asymptotes about the furiously quick foxes nag fluffily instructions. +1928|61|1372|654.04|yly after the sly, final epitaphs. carefully special pinto beans haggle upon the fluffily pending depths. accounts eat blithely final requests. fluffily special deposits sleep fluffily. +1929|30|2641|672.04|the carefully special packages use furiously even d +1929|74|3554|393.19|ts wake carefully blithely ironic ideas. fluffily unusual theodolites use busily slyly pending d +1929|18|6749|212.86|ts boost fluffily. fluffily ironic accounts boost blithely around the unusual, ironic attainments. bold, even ideas boost along the ironic, unusual instructions. furiously final +1929|62|3086|366.72|eep fluffily. express asymptotes haggle carefully quickly pending packages? slyly regular foxes wake fluffily about the even requests. pend +1930|31|1392|760.97|ans sleep furiously quiet packages. notornis use fluffily against the special courts. bravely ironic theodolites about the special, sly package +1930|75|5204|593.95|egular ideas wake. furious accounts boost blithely regular ideas. slyly regular foxes haggle special packages. slyly ironic deposits sleep since the ironic pains. special deposits grow. slyly even +1930|19|8579|651.14|ts poach. carefully special accounts along the slyly even packages cajole alongside of the accounts. special, regular pinto beans boost furiously. +1930|63|6163|870.52| even accounts; fluffily unusual ideas engage. regular dependencies solve. blithely final warthogs use slyly. slyly thin attainments boost blithe +1931|32|9887|646.51|final theodolites wake. special requests cajole slyly fu +1931|76|9842|981.16|ar excuses across the slyly bold patterns are blithely ab +1931|20|5425|927.20|y final packages. regular pinto beans affix. carefully final packages are blithely blithely stealthy excuses. blithely ironic requests are quickly. spec +1931|64|7897|185.43|refully bold requests. packages maintain after the slow, bold theodolites. blithely regular platelets cajole after the courts. blithely regular instr +1932|33|2424|806.35|ously final ideas. quickly regular braids maintain evenly. quickly ironic ideas sleep slyly after the foxes. quickly special accounts around the blithely bold sauternes eat after the specia +1932|77|1325|993.44|packages cajole carefully. fluffily unusual asymptotes are across the express deposits. unusual, regular dependencies sl +1932|21|5040|607.62|l dolphins. even foxes haggle furiously. quickly silent accounts mold except the slyly regular deposits. blithely regular deposits are +1932|65|5582|587.27|gside of the ironic warhorses sleep furiously above the blithely regular pa +1933|34|4298|363.82|posits around the furiously special pinto beans integrate slowly blithely furious dependencies. bold +1933|78|6461|107.33|l accounts alongside of the special requests haggle carefully bold accounts. sl +1933|22|4703|916.09|le after the final, unusual instructions. carefully bold instructions boost blithely after the furiously silent pinto bea +1933|66|9517|222.21|against the blithely bold accounts. pending requests detect furiously unusual deposits. regular platelets cajole deposits. furiously +1934|35|8439|633.18| special theodolites wake slyly slow theodolites. carefully regular theodolites among the furiously slow deposits ha +1934|79|7741|635.73|. blithely sly requests sleep slyly slyly silent packages. ironic accounts are blithely +1934|23|8765|561.46|ully final theodolites. packages cajole. furiously unusual foxes against the blithely even excuses use blithely pending ideas. carefully even accounts cajole? express, even packages about +1934|67|1932|50.87|osits hinder regular theodolites. special, regular accounts play furiously according to the furiously final requests. ideas nod carefully bold excuses. carefully ironic packages after th +1935|36|7648|74.94|ly final dependencies. slyly pending foxes wake final excuses. carefully regular theodolites around the dolphins snooze furiously bold, ironic accounts. b +1935|80|5662|10.12| about the instructions. carefully final platelets cajole carefully furiously regular requests. carefully regular theodolites along the carefully regular pinto beans haggle about +1935|24|9731|516.71|carefully quiet accounts cajole blithely of the fluffily ironic frets: bold accounts are among the carefully regular theodolites. special, regular deposits +1935|68|2565|257.31| packages dazzle idly quickly pending instructions. furiously i +1936|37|2959|75.13|inal foxes wake blithely across the even, special deposits. ironic packages along the even, pending ideas serve slyly accounts. final, final accounts detect furiously. packag +1936|81|8604|294.17|r packages. slyly pending sauternes haggle. ironic pinto beans wake blithely. carefully ironic instructions cajole carefully. final, final deposits are furiously after the sly +1936|25|2682|218.26|o beans. slyly ruthless requests lose. unusual requests haggle whithout the furiously special accounts. slyly even accounts after the quickly regular instructions nag carefully slyly ruthles +1936|69|5188|275.14|kages nag slyly furiously final accounts. closely regular deposits cajole among the slyly even pains. thin packages unwind according to the re +1937|38|4417|144.28|boost fluffily. carefully regular epitaphs detect slyly. carefully pending packages u +1937|82|408|532.34|ar ideas. slyly regular asymptotes wake carefully along the courts. final requests sleep quickly regular, pending dependencies. quickly express ideas are carefully final packages. +1937|26|6340|221.84|as cajole against the foxes. furiously ironic requests al +1937|70|4045|501.07|ges. regular deposits against the blithely ironic deposits cajole iron +1938|39|155|43.95|tructions. slyly regular requests detect carefully. blithely unusual ideas haggle across the ironically unusual instructions. slyly bold accounts are unusual accounts-- +1938|83|3808|589.70|ly. blithely final deposits cajole furiously final instructions. ironic i +1938|27|8785|160.99|express, express accounts about the pending ideas nag furi +1938|71|8057|764.12|ackages integrate. deposits sleep carefully. accounts sleep slyly. blithely bold packages use ironic, ironic reque +1939|40|1005|604.51|x even accounts. furiously even excuses should have to sle +1939|84|1695|366.45|rding to the quickly regular foxes. carefully bold deposits unwind carefully. fluffily even pinto beans detect carefully final deposits. slyly silent theodol +1939|28|5522|312.45| the permanent escapades. furiously regular packages haggle careful +1939|72|2014|885.69|ilent deposits according to the furiously final requests sleep furiously blithely silent instruction +1940|41|9543|760.79|sly final, bold packages: fluffily bold courts wake slyly furiously bold pinto beans. quickly bold deposits nag. carefully regular requests maintain slyly among the furiously pending asym +1940|85|9490|534.16| pending realms cajole slyly unusual foxes. furiously final deposits sleep carefully. pending packages wake slyly against the regular, unusual attainments. regular deposits print slyly +1940|29|1615|848.07| quickly busy packages. blithely ironic theodolites cajole slyly regular requests. permanent deposits are slyly. fluffy mu +1940|73|4195|880.12|le around the bravely even packages: carefully even requests sleep! unusual deposits haggle b +1941|42|586|39.64|ts wake quickly pending deposits. blithely special foxes haggle above the unusual accounts. quickly regular accounts nag. even, regular theodolites maintain furio +1941|86|5591|106.28|en dependencies. regular, regular deposits poach quickly ironic courts. blithely final packages nag. furiously special dinos haggle fluffily regular theodolites. carefully r +1941|30|6027|330.55|ar accounts. silent deposits haggle quickly furiously silent requests. furiously ironic requests sleep. slyly ironic packages wake furiously blithely regular packages? blithely regular requests +1941|74|4298|339.85|aggle slyly across the furiously pending ideas. ironic, ironic deposits run. packages above the blithely pending theodolites sleep after the unusual frets. special requests are. carefully even no +1942|43|4860|783.48|uffily regular platelets snooze final, bold requests. slyly final deposits wake across the quickly sly packages. furiously bold instructions wak +1942|87|1279|195.63|ffily regular pinto beans haggle. pending, regular courts wake quickly ironic packages? carefully silent accounts sleep. accounts are among the express instructions. furiou +1942|31|5561|465.00|ess, permanent packages. slyly final foxes dazzle. furiously regular accounts use slyly against the enticingly special theodolites. slyly silent requests to the express excuses doubt furiously f +1942|75|729|314.32| carefully unusual ideas. quickly final deposits haggle furiously. daring foxes wake blithely. furiously unusual epitaphs against the pending +1943|44|859|222.64|tithes; bold, even theodolites wake carefully ironic requests. quickly even foxes durin +1943|88|5043|909.03|bold foxes are furiously ironic instructions. requests along the carefully express deposits are quickly blithely unusual pin +1943|32|9896|396.84|nic courts. regular, final packages among the furiously special requests sleep furiously ironic pinto beans. quickly final theodolites shall c +1943|76|9447|540.29|quests use carefully after the ironic deposits: slyly even requests cajole furiously. bold excuses haggle permanently ruthless requests-- blithely pen +1944|45|9168|867.16|old according to the silently special multipliers. furiously special pinto beans after the regu +1944|89|6994|46.22|detect carefully. deposits use since the carefully special dependencies. regular packages i +1944|33|4885|832.12| requests. bold, final foxes nag furiously about the blithely special accounts. unusual pac +1944|77|6728|567.05|hely special instructions against the carefully unusual accounts doze fluffily final, regular accounts? deposits at th +1945|46|1262|32.75|e fluffily ruthless accounts. carefully final ideas cajole blithely! quickly even requests sleep furiously carefully final accounts. ironic, final requests wak +1945|90|1648|188.45|slyly according to the even accounts. final ideas nag blithely final, final pinto beans. slyly quiet decoys boost slyly. +1945|34|680|736.23|mold. requests integrate carefully alongside of the quickly silent braids. carefully pending reque +1945|78|4836|415.00|d, ironic accounts. slyly ironic accounts haggle quickly regular accounts. carefully special accounts unwind quickly regular +1946|47|225|40.57|ic foxes are above the blithely regular pearls. slyly final deposits wake carefully carefully bold requests. blithely special deposits are blithely within the quickly +1946|91|1830|809.14|atelets across the fluffily bold epitaphs nag furiously bold theodolites. carefully special theodolites cajo +1946|35|4042|981.05|lyly. regular patterns haggle blithely. accounts about the ideas sleep quickly slyly special packages. carefully even accounts cajole unusual, stealthy dependencies. pinto beans cajole slyly. b +1946|79|8911|129.81|h slyly furiously express requests. fluffily even instructions wake furiously ruthless deposits. bold requests wake alongside of the furiously even requests? express pearls above the +1947|48|5401|63.34|unusual packages doubt about the blithely final theodolites +1947|92|3163|927.40| regular theodolites cajole. theodolites cajole fluffy pinto beans. slyly regular packa +1947|36|4664|539.58| the carefully pending depths run blithely pending requests; regular, ir +1947|80|8828|7.74|the carefully bold accounts. carefully regular requests wake furiously. furiously bold attainment +1948|49|5180|524.69|accounts. blithely express theodolites sleep blithely above the packages. carefully +1948|93|2779|392.77|ate dependencies. furiously pending asymptotes use slyly quickly i +1948|37|2435|149.94| courts. carefully unusual pearls use slyly daringly regular depos +1948|81|3498|774.02|ully express accounts. slyly express foxes affix carefully blithely silent deposits-- final excuses sublate regularly at the even accounts. regular deposits caj +1949|50|5142|182.48|kages wake alongside of the packages. final accounts among the furiously final foxes cajole after the quickly silent packages. deposits boost blithely among the furiously special asymptotes. sly +1949|94|7102|196.29|gle according to the carefully express accounts. quick accounts sleep furiously even, even courts. sp +1949|38|6275|530.19|dolites wake furiously against the excuses; furiously express ideas cajole furiously above the blithel +1949|82|8220|963.14|ly regular accounts. even foxes boost quickly across the furiou +1950|51|6081|762.05|ously final asymptotes. carefully unusual deposits sleep blithely blithely regular requests. bold ideas haggle furiously carefully unusual ideas. pending pinto beans boost blithely bli +1950|95|8110|729.02| accounts. pending packages use furiously blithely silent deposits. furiously even packages engage furiously furiously final instructions. +1950|39|3470|93.62|lyly regular foxes lose: quickly even courts haggle pending patterns. unusual, ironic accounts cajole fluffily. regular packages use a +1950|83|1114|234.51|ing, regular courts. slyly final asymptotes boost along the quickly even epitaphs. carefully silent dependencies impress c +1951|52|7712|521.78|l theodolites cajole blithely across the slyly unusual dependencies. enticing, busy instructions sleep outside the furiously pending requests. fu +1951|96|6924|494.80|e furiously bold requests. regular dolphins about the carefully even accounts haggle epitaphs. furiously ironic deposits wake along the quickly +1951|40|3852|621.35|kly final requests along the slyly sly pinto beans integrate at the fluffily pending requests. bold, silent dinos along the dolphins snoo +1951|84|8140|640.36|even accounts; dolphins haggle blithely regular, pending accounts. furiously ironic packages sl +1952|53|8180|376.65|y special packages nag furiously regular accounts. blithely final requests boost unusual, unusual theodolites. fluffily pending ideas according to the brave a +1952|97|8886|870.10|fluffily ironic pinto beans? slyly unusual packages are furiously above the quickly even excuses. sometimes thin braids along the blithely ironic pinto beans cajole slyly about the ironic, +1952|41|3716|443.40|silently accounts. bold, ironic pinto beans detect across the bold, pending excuses. furiously ironi +1952|85|5299|916.39| affix carefully special accounts. carefully special foxes across the theodolites boost boldly after the even, even accounts. fluffily regular reque +1953|54|1900|345.28|luffily careful deposits; quickly even theodolites about the +1953|98|8441|190.50| even requests. fluffily ironic dolphins are about the regular instructions! accounts are across the ironic, final platelets. unusual deposits haggle closely across the blithe +1953|42|8479|169.34| to the slyly regular packages. fluffily ironic accounts promise special, regular asymptotes. slyly special instructions along the final p +1953|86|2113|148.78| blithely ironic requests boost across the dependencies. fluffily regul +1954|55|4279|213.69|he ironic packages. special ideas boost carefully furiously special foxes. ironic requests after the slyly bold asymptotes wak +1954|99|1455|290.81|thely across the even, unusual dolphins: quietly special deposits haggle requests. finally even deposits detect among the slyly bold packages. pending, regular instructions sleep ironic, bra +1954|43|3659|744.48|nal requests haggle blithely excuses. even, bold asymptotes grow carefully. regular, bold theod +1954|87|9746|112.83|y unusual ideas. slyly furious requests detect quickly abo +1955|56|9824|439.46|ording to the furiously regular frays wake after the even requests. slyly ironic packages integrate pinto beans. slyly express theodolites about the final excuses wake +1955|100|7345|587.16|s use furiously. blithely even accounts use furiously across the fluffily regular platelets. quickly bold courts +1955|44|8445|438.46|es. regularly special deposits according to the final, even requests wake slyly since the final, ironic decoys. always ironic accounts cajole even foxes. slyly even instructions cajole sly +1955|88|9683|810.75|ound the slyly express escapades. furiously even packages are furiously accounts. daringly bold packages according to the ironi +1956|57|5762|7.73| quickly. evenly express accounts boost quickly about the furiously careful deposits. carefully regular pinto beans cajole quickly dogg +1956|1|7024|289.69|y regular accounts around the ironic, unusual accounts hang according to the even, bold platelets. blithely even accounts poach accord +1956|45|8495|892.52| regular requests wake furiously ironic, bold packages; express accounts wake furiously. slyly unusual packages for the ideas cajole accounts. instructions haggle slowly: unusual accounts wak +1956|89|7958|675.85|yly ironic accounts wake across the final, final requests. regular escapades are. slyly regular deposits along the blithely regular packages haggle +1957|58|4082|585.85|fter the thinly regular deposits. furiously regular excuses wake furiously along the furiously final foxes. quickly final orbits haggle slyly. care +1957|2|2367|330.24|ly regular dolphins. packages unwind. slyly even deposits are furiously regular excuses. even, final dependencies haggle silent, ironic theodolites. fluffily final platelets wake +1957|46|6302|159.02|ess deposits. fluffily unusual deposits cajole besides the slyly final theodolites. quickly ironic deposits snooze. deposits sleep quickly even excuses. even, +1957|90|3335|557.18|ithely close pinto beans must have to dazzle ruthlessly amon +1958|59|9191|6.16|inst the carefully dogged deposits haggle fluffily ironic excuses. slyly quick packages sleep quietly among the regular, unusual packages. idle, even +1958|3|3224|829.21| blithely bold deposits maintain carefully furiously regular dolphins. carefully bold theodolites above the slyly e +1958|47|3684|599.47|odolites haggle carefully quickly regular theodolit +1958|91|8481|554.72|inal pinto beans. regular, ironic ideas engage furiously final pa +1959|60|1889|655.61|posits wake bold requests. fluffily final theodolites affix furiously above the slyly regular foxes. dependencies sleep idly pending pinto +1959|4|9571|27.83|ual requests. requests maintain busily sly accounts-- permanent packages boost slyly across the carefully final excuses; slyly pen +1959|48|1492|395.55|realms sleep requests. unusual requests according to the final, final theodolites haggle slowly after the unusual epitaphs? final hockey players wake furiously. quickly regular accounts nag f +1959|92|9119|778.29|odolites cajole fluffily according to the slyly regular ideas. furiously regular packages breach quickly silent pinto beans. carefully regular accounts according to the blithel +1960|61|5383|971.02|posits cajole across the silent, final requests. express asymptotes according to the final deposits affix slyl +1960|5|771|310.83|as. pinto beans boost quickly carefully special instructions. slyly ironic accounts haggle closely. packages integrate fluffily above the quickly final req +1960|49|8905|493.78|platelets. regularly express packages sleep according to the blithely unusual decoys. pending excuses acros +1960|93|5075|502.55|ly regular accounts. quickly special excuses use about the ironic accounts. ironically bold instructions sleep sometimes across the regular dolphins. eve +1961|62|257|906.11|o beans boost carefully fluffily ironic accounts. express courts eat furiously. accounts boost carefull +1961|6|39|386.79|posits wake against the regular requests. fluffily special warthogs wake about the carefully permanent platelets. idly regular theodolites boost bold accounts. pending packages hang blithely. blithe +1961|50|2787|549.50|iously regular deposits. quickly express requests according to the slyly special excuses nag blithely unusual dependencies. express requests along the slyly final instructions wake car +1961|94|1964|886.65|lithely ironic ideas. furiously silent instructions detect furiously carefully ironic requests. regular deposits sleep busily. ironically regular req +1962|63|4969|948.70|ages. regular, quick deposits cajole. furiously bold dependencies na +1962|7|7499|821.03| fluffily ironic theodolites. closely even accounts cajole slyly fluffily idle instructions. blithely eve +1962|51|6692|918.85|ic packages around the blithely unusual foxes are stealthily across the slyly regular deposits. i +1962|95|4516|647.82|y. quickly pending asymptotes cajole after the carefully ironic requests. final excuses upon the ironic requests run carefully unusual foxes. final, final orbits dazzle fluffily final accounts. fi +1963|64|8869|923.69|usual packages. accounts wake; quietly brave orbits are silent, ironic deposits. hockey players sleep slyly. asymptotes hinder carefully among the orbits. blithely regular Tiresias are. car +1963|8|3144|163.06|ly regular accounts. final, unusual requests wake even, even accounts. blithely even pinto b +1963|52|9746|602.64|slyly carefully regular multipliers. slyly ironic pinto beans about the dependencies haggle fluffily unusual accounts. blithely regular +1963|96|1309|835.19|es after the even deposits are slyly alongside of the even, +1964|65|8225|187.09| quickly even packages detect across the regular requests. blithely special accounts according +1964|9|8770|719.85|lly pending packages: fluffily pending requests around the ac +1964|53|4335|695.86|pinto beans. ironic, unusual packages according to the carefully pending ideas integrate across +1964|97|3758|216.07|s. regular, thin deposits are. blithely express deposits sleep slyly across the quickly bold deposits. quick, regular ideas detect s +1965|66|3875|268.36| regular Tiresias. pending accounts wake carefully against the slyly express pinto beans. regular excuses across the foxes kin +1965|10|8624|1.63|fully ironic accounts haggle quickly pending deposits. theodolites according to the slyly even requests poach carefully special platelets. idly special requests haggle carefully. slyly final dep +1965|54|7497|656.35|unts. requests wake carefully furiously final asymptotes. regular reque +1965|98|5473|538.98|ts wake about the slyly final requests. regular theodolites above +1966|67|9486|937.71|posits. bold excuses doubt fluffily against the unusual accounts. asymptotes sleep blithely. packages caj +1966|11|2132|5.41|into beans. furiously unusual requests integrate carefully ironic packages. furiously regular packages about the carefully bold pinto beans are slyly dolphins. carefu +1966|55|9873|298.33|haggle furiously blithely bold epitaphs. quickly pending pinto beans alongside of the slyly even requests wake quickly across the carefully express foxes. blithely re +1966|99|8530|318.74|nently quickly final accounts. packages detect slyly enti +1967|68|8441|691.61|nal deposits wake blithely in place of the slyly special foxes-- blithely bold ideas believe ruthlessly. pending, final packages haggle carefully after the ruthless packages. slyly p +1967|12|545|613.37|es cajole furiously over the furiously regular packages. special courts are. special, final theodolites wake ac +1967|56|4935|380.58|. blithely blithe multipliers cajole across the final requests. slyly fluffy dependencies haggle according to the fluffily final platelets-- slyly special foxes unwind blithely +1967|100|8523|981.88|te blithely regular packages? slyly pending courts sle +1968|69|9224|21.59|slyly special sentiments! carefully pending foxes are. carefully silent foxes dazzle idly +1968|13|934|400.82|cross the fluffily daring warthogs. ironic, ironic platelets about the fluffily pending packages use blithely carefully even pinto beans. blithely ironic package +1968|57|3076|529.40|tions? carefully ironic packages nag. requests haggle furiously across the car +1968|1|4899|726.51|ngly pending instructions wake slyly. evenly express gifts haggle +1969|70|9744|796.32|rts was carefully final frets. carefully bold pinto beans cajole among the furiously special decoys. silent theodolites poach carefully. furiously unusual dep +1969|14|4767|358.28|ly theodolites. carefully final theodolites according to the regular accounts thrash blithel +1969|58|5139|786.41|around the packages. furiously regular pinto beans wake slyly furiously pending deposits. slyly specia +1969|2|1961|481.35|refully regular theodolites cajole across the carefully even accoun +1970|71|1005|346.77|the ironic instructions. furiously special accounts haggle. even excuses are quietly. carefully ironic deposits along the blithely ironic s +1970|15|250|182.99|osits according to the ironic packages are fluffily silent accounts. final ideas serve slyly according to the slyly even excuses. dogged, express platelets sublate +1970|59|1539|863.64|nal asymptotes sleep blithely furiously unusual dependencies. blithely close packages haggle about the deposits. slyly final excuses must have to cajole fluffily furiously +1970|3|2608|760.30| wake slyly around the forges-- bold, even foxes are. quickly even request +1971|72|248|326.71|quickly unusual dugouts engage. carefully final deposits above the regular deposits +1971|16|2625|670.60|packages affix blithely. finally pending accounts after the ironic ideas sublate quickly above the even packages. carefully even sheaves against the carefully special excuses grow around th +1971|60|4886|222.88|ly regular ideas. even platelets sleep above the quic +1971|4|2581|931.05| asymptotes cajole furiously bold deposits. final requests +1972|73|2891|980.96|ns are blithely. foxes along the grouches affix quickly final requests. permanent, special requests should have to cajole express, pending packages. blit +1972|17|8232|671.29| hockey players sleep blithely carefully regular accounts. closely pending requests boost slyly after the thinly final accounts. final theodolites b +1972|61|7800|756.57|ckages integrate furiously among the quickly ironic deposits. slyly express pinto beans across the quickly pending accounts are quickly carefully silent waters. regular +1972|5|2825|456.79| the furiously even ideas; fluffily busy deposits cajole carefully. enticingly thin courts nag furiously. ironic accounts wake furiously. furiously silent theodolites +1973|74|1763|148.24|yly final excuses. regular, regular dependencies nag? slyly special deposits use above the regular deposits. ironic foxes may na +1973|18|4934|266.06|l courts. furiously unusual requests sleep slyly pending deposits. blithely even packages are blithely even pinto beans. thinly special dependencies are furiously slyly even depos +1973|62|5623|399.03|eposits. regular asymptotes cajole blithely. unusual deposits cajole according to the carefully ironic waters. regular deposits cajole. fluffily bold deposits integrate slyly busy packages. s +1973|6|4918|404.16|e regular requests. carefully unusual theodolites across the fluffily special instructions sleep quickly among the blithely regular requests. quickly bold packages nag blithely. pendin +1974|75|9984|762.36|ly ruthless accounts. quickly pending pinto beans doze carefully. special escapades unwind slyly regular pinto beans. carefully regular packages sleep slyly until the regular deposits. +1974|19|1136|967.09|ly accounts. blithely regular dinos solve furiously above the furiously bold theodolites. slyly even dolphins should have to unwind. blithely even requests wake carefully bold, special +1974|63|9273|308.08|quickly carefully ironic instructions. blithely bold packages cajole accounts! slyly special accounts nag slyly deposits. regular, pending instructions wake q +1974|7|3924|210.76|thely regular accounts. carefully even platelets haggle slyly furiously bold accounts. even pinto beans wake regular accounts. ironic, pending packages wake carefully above the +1975|76|4102|934.42|ss frays. ironically regular platelets about the accounts are furiously ironic dependencies. dependencies wake alongside of the ironic ideas. even, final dolphins integrate pending dinos. b +1975|20|4132|598.21|s cajole blithely fluffily pending instructions. slowly final idea +1975|64|7849|289.48|ress pinto beans. slyly pending foxes alongside of the carefully even accounts sleep carefully blithely careful deposits. express acc +1975|8|6978|307.99|pecial packages. pending instructions haggle fluffily. special, bold packages run carefully along the furiously ironic requests. enticing, unusual theodolites doubt slyly alongside of th +1976|77|8511|714.28|ironic ideas. even requests would dazzle carefully after the dependencies. requests are blithely +1976|21|11|144.69|the fluffily regular courts. blithely ironic accounts nag ironically express excuses. fu +1976|65|1244|419.07|fully. slyly careful accounts haggle. furiously pending foxes along the final +1976|9|3635|609.69|thely slyly regular foxes? special, pending accounts sleep within the +1977|78|6019|514.19| requests nag carefully regular packages. blithely pending dinos snooze quickly at the unusual braids: special, regul +1977|22|3309|760.57|pending packages are carefully careful accounts-- even, even requests sleep quickly about the slyly ironic requests. idle pinto beans cajole at the special requests. regular, regular +1977|66|6329|800.87|lar theodolites wake blithely by the unusual theodolites. special instructions integrate blithely regular, s +1977|10|8305|822.37|c instructions. carefully even theodolites sublate slyly. idle accounts across the pending accounts cajole furiously by the +1978|79|9375|498.31|ake furiously among the furiously ironic accounts! final packages alongside of the unusual, special theodolites use fluffily furiously unusual accou +1978|23|88|640.47|platelets. theodolites sleep. furiously even grouches haggle furiously. quickly unusual instructions cajole blithely thr +1978|67|5563|256.47|ake slyly fluffily regular dependencies; blithely special theodolites across the fluffily fluffy deposits detect alongside of the +1978|11|2277|958.28|s, regular braids nag slyly packages. special packages sleep special, ironic warhorses. blithely final deposits mold around t +1979|80|2836|951.16|ding pains. furiously ironic excuses detect. blithely even accounts nag carefully regular realms. furiously pending ins +1979|24|5657|212.53|t furiously during the quickly even accounts. blithely express epitaphs cajole slyly daring packages. furiously +1979|68|4443|716.16|xpress accounts haggle express excuses. slyly pen +1979|12|7458|712.56|rly special requests use about the pending deposits. dolphins affix blithely even theodolites. car +1980|81|5544|110.10|according to the requests. silent foxes run blithely special, special f +1980|25|8546|481.82|its. furiously regular deposits haggle. furiously express waters against the even, regular deposits hinder furiously regular courts. carefully bold deposits boo +1980|69|6445|227.95|s wake alongside of the furiously unusual accounts. quickly regular requests after the furiously bold hockey players +1980|13|8469|157.22|old dependencies grow carefully above the slyly bold packages. final, quiet packages alongside of the quickly regu +1981|82|1795|356.32|sual packages boost blithely regular, even theodolites. regular instructions are carefully above the quickly bold epitaphs. pending pinto beans x-ray slyly after the blithely pending ideas. care +1981|26|6873|939.17| platelets nag slyly slyly enticing pinto beans. quickly iro +1981|70|18|541.36|fully along the deposits. slyly even sheaves mold beside the slyly even accounts. ideas affix after the carefully pending requests. excuses sleep fluffily idle accou +1981|14|9242|943.45|fully after the pending, express theodolites. pending pinto beans haggle slyly. furiously regular accounts believe silently among the ironic waters. quickly +1982|83|3859|586.51|nts are. blithely regular ideas nag doggedly. quickly silent accounts cajole slyly carefully +1982|27|1027|554.94|equests wake quickly ironic epitaphs. sly, even packages serve around the carefully final accounts. fluffily silent foxes after the furiously express pinto beans wake blithely slyly i +1982|71|8491|310.75|sly idle ideas. unusual ideas haggle carefully fluffily special ideas. blithely ironic +1982|15|9193|201.65|n the even, ironic foxes. even dependencies after the unusual, express packages was fluffily quickly ruthless +1983|84|7560|746.58| blithely. furiously pending platelets wake against the final pinto beans. special, final foxes against the even theod +1983|28|9992|510.41|l ideas x-ray. express ideas across the furiously final foxes are carefully among the carefully special instructi +1983|72|2408|280.06|ternes. slyly bold packages dazzle slyly after the blithely ironic reques +1983|16|6540|965.80| foxes mold fluffily among the slyly even excuses. unusual deposits are slyly ironic accounts. quickly regular accounts haggle. ideas about the furiously bold packages affix furiously after t +1984|85|4661|623.76|xpress deposits cajole blithely against the even packages. ironic requests are fluffily. blithely expr +1984|29|6524|142.71|st the carefully special depths haggle furiously against +1984|73|4988|138.95|efully about the carefully ironic instructions. even accounts believe carefully. express accounts +1984|17|6850|948.25|ffily express excuses print above the slyly even dependencies. pending, flu +1985|86|7737|267.44|blithely unusual requests boost thin deposits. slyly express theodolites cajole again +1985|30|6773|541.50|l ideas integrate. furiously unusual patterns after the furiously ironic requests wake slyly about the regular deposits. carefully final requests are ironi +1985|74|9004|301.49|efully unusual requests doze slyly. furiously final warthog +1985|18|3228|478.40|lites haggle carefully according to the regular requests. slyly regular packages are carefully carefully bold packages. quickly express platelets boost slyly slowly re +1986|87|5486|700.71|beans would was. furiously regular packages haggle near the theodolites. +1986|31|2411|692.56|fily final excuses. regularly regular theodolites cajole carefully final foxes. carefully regular instructions above the silent, final ideas breach slyly unusual packages +1986|75|9987|619.12|ending packages wake quickly. fluffily stealthy requests wake qui +1986|19|5376|100.61|even accounts alongside of the theodolites haggle quickly against the furiously regular courts. carefully enticing deposits against the bold, special packages cajole slyly furious +1987|88|1914|959.95|ss the carefully unusual escapades? final pinto beans cajole quickly. blithely even asymptotes nag platelets. carefully bold accounts detect carefully along the carefully silent platelets. id +1987|32|6609|158.15|carefully even excuses. furiously bold theodolites +1987|76|8840|874.19| according to the furiously ironic deposits. furiously final courts across the quickly ironic patterns cajole furio +1987|20|7471|275.37|ic dependencies sleep about the slyly regular accounts. close, silent dependencies integrate blithely regular requests: regular theodolites +1988|89|4490|953.17|e ruthlessly. deposits print slyly express dependencies. qu +1988|33|9691|102.67|kages above the regular requests boost blithely sly depth +1988|77|432|513.48|nstructions are above the packages. fluffily special deposits across the regular instructions unwi +1988|21|3751|836.00|notornis. final packages use blithely pending platelets. bold accounts against the unusual, unusual packages sleep around the platelets. final, bol +1989|90|359|880.64|even instructions haggle carefully furiously regular requests. unusual, final pinto beans could haggle express, regular theodolites. stealthily enticing accounts cajole blithely final +1989|34|4783|885.25|efully slyly regular somas: fluffily ironic packages are carefully according to the blithe +1989|78|1186|397.91|e the furiously pending packages sleep after the blithely pending accounts. furiously regular foxes are slyly. carefully pending pinto beans sleep carefully around the pinto beans. depos +1989|22|8639|494.67|ow quickly. even packages for the packages sleep past the asymptotes. blithely bold dugouts sleep. fluffily pending instructions impress furiously b +1990|91|8341|471.19| requests sleep around the even realms. regular, +1990|35|4167|370.25|y around the instructions. final requests use quickly. quickly bold requests will cajole. deposits alongs +1990|79|6565|303.24|iously furious packages. carefully ironic excuses use slyly. carefully regular cour +1990|23|894|829.09|ccounts sleep beside the theodolites. even deposits promise unusual dependencies. express ideas against the bl +1991|92|7842|579.25|ording to the quickly express dependencies. quickly express requests cajole fluffily +1991|36|4445|442.50|s. carefully regular theodolites nag beyond the final, unusual packages. blithely ironic platelets wake carefully instru +1991|80|2963|742.50| to the pending foxes integrate blithely pending packages. expres +1991|24|2204|751.26|uses cajole. regular, final requests thrash blithely +1992|93|2726|123.29|s theodolites are slyly slyly even deposits. fluffily +1992|37|82|405.98|ests. ironic, bold packages are even, regular accounts. carefully dogged ideas detect quickly. express, pending excuses eat quickly slyly silent instructions. fluffily +1992|81|5671|250.86| bold accounts sleep carefully above the blithely regular packages. final, brave accounts use. quickly regular pinto b +1992|25|8181|603.44|across the silent, busy depths sleep carefully silent requests. furiously unusual asymptotes cajole fluffily slyly silent requests. slyly pending requests nag fluffily along the fin +1993|94|6338|354.09| instructions. packages boost carefully pending deposits? regular, special theodolites dazzle furiousl +1993|38|1146|356.08|special accounts. blithely regular ideas are after the slyly bold packages. carefully regular pinto beans after the furiously regular pinto beans nod slyly fur +1993|82|7163|748.00|as. slyly express requests among the furiously ironic packages wake above the pending deposits. furiously even accounts along the +1993|26|416|399.83|ng to the fluffily express instructions. slyly ironic accounts are. furiously express dependencies nag quickly ag +1994|95|1432|802.53|y silent packages after the regular, bold excuses sleep fluffily even gifts. fluffily ironic accounts breach carefully accordin +1994|39|7758|718.78|. ironic instructions solve furiously. requests doze blithely carefully final asymptotes. special foxes sleep quick +1994|83|7373|790.08|d requests are quickly. furiously special accounts cajole. decoys haggle carefully about the slyly ironic requests +1994|27|1500|251.28|y regular packages haggle quickly at the boldly final ideas. platelets wake carefully brave requests. blithely final +1995|96|1304|786.17|r excuses use carefully bravely special accounts. bold packages sleep blithely. final requests hang quickly express packages-- quickly special deposit +1995|40|4695|499.76|instructions. blithely final ideas play. carefully final pinto beans boost. unusual depths use against the slyly unusual gifts. eve +1995|84|4864|75.77|uctions. express packages boost slyly blithely ironic ideas. packages haggle alongside of the fluffily bold foxes. carefully close ideas sleep slyly. carefully +1995|28|1587|42.73|atelets unwind slyly above the furiously special pinto beans. blithely express requests cajole slyly requests. special platelets nod around the regular instructions. +1996|97|5281|113.56|ought to sleep. regular, unusual accounts sleep slyly above the quietly ev +1996|41|1141|821.42|urts use never. slyly ironic deposits was fluffily quickly ironic packages. furiously ironic theodolites hinder furiously +1996|85|4318|468.03|ing foxes. furiously bold accounts wake quickly toward the furiously even pinto beans? slyly even instructions maintain regularly after the care +1996|29|9520|287.02| furiously slyly final packages. ironic accounts maintain qu +1997|98|9746|943.84|er across the special, final packages. furiously even excuses cajole fluffily after the slyly special accounts. furiously +1997|42|4758|37.03|to boost carefully carefully pending packages. regular, regular requests wake carefully among the special, ironic requests. furiously ironic deposits wake among the platelets. quickly even asymptote +1997|86|352|187.26|dolites are. slyly final theodolites sleep. carefully special requests after th +1997|30|6256|591.47|h about the bold, silent accounts. carefully unusua +1998|99|8516|910.12|lithely furious foxes cajole from the ironic packages. carefully even packages wake carefully special dependencies. foxes along the accounts sleep even accounts. blithely unusual theodol +1998|43|7641|808.19|y regular hockey players. slyly ironic deposits above the special excuses sleep c +1998|87|8240|2.02|play quickly quiet foxes. quickly ironic instructions haggle. furiously furious requests was. platelets haggle +1998|31|8835|300.74|encies. final warhorses among the blithely regular requests integrate +1999|100|9234|781.69|ess deposits. carefully final deposits boost furiously carefully special d +1999|44|7434|209.00|sts boost above the furiously final courts. final, stealthy deposits cajole blithely; slyly ironic deposits boost blithely. slyly final requests boost carefully slyly u +1999|88|1912|402.86|sits wake furiously after the ironic Tiresias. unusual, regular excuses boost final platelets. regular accounts use a +1999|32|2322|855.87|deposits cajole carefully even deposits. carefully regular accounts use furiously furiously furious courts. carefully unusual excuses are furiously. ironic, regular foxes haggle carefully +2000|1|698|122.03|eep above the furiously regular packages. quickly even platelets above the blithely regular requests are blithely +2000|45|3410|231.06|regular foxes detect furiously carefully bold ideas-- carefully silent accounts boost quickly even +2000|89|2642|558.65|final accounts wake express theodolites? slyly regular forges sleep bravely against the finally even pi +2000|33|8414|798.67|yly ironic dependencies. blithely final theodolites sleep. furiously ironic accounts wake carefully across the express, regular requests. carefully regul diff --git a/src/test/singlenode_regress/data/person.data b/src/test/singlenode_regress/data/person.data new file mode 100644 index 00000000000..3a65b9f46fd --- /dev/null +++ b/src/test/singlenode_regress/data/person.data @@ -0,0 +1,50 @@ +mike 40 (3.1,6.2) +joe 20 (5.5,2.5) +sally 34 (3.8,45.8) +sandra 19 (9.345,09.6) +alex 30 (1.352,8.2) +sue 50 (8.34,7.375) +denise 24 (3.78,87.90) +sarah 88 (8.4,2.3) +teresa 38 (7.7,1.8) +nan 28 (6.35,0.43) +leah 68 (0.6,3.37) +wendy 78 (2.62,03.3) +melissa 28 (3.089,087.23) +joan 18 (9.4,47.04) +mary 08 (3.7,39.20) +jane 58 (1.34,0.44) +liza 38 (9.76,6.90) +jean 28 (8.561,7.3) +jenifer 38 (6.6,23.3) +juanita 58 (4.57,35.8) +susan 78 (6.579,3) +zena 98 (0.35,0) +martie 88 (8.358,.93) +chris 78 (9.78,2) +pat 18 (1.19,0.6) +zola 58 (2.56,4.3) +louise 98 (5.0,8.7) +edna 18 (1.53,3.5) +bertha 88 (2.75,9.4) +sumi 38 (1.15,0.6) +koko 88 (1.7,5.5) +gina 18 (9.82,7.5) +rean 48 (8.5,5.0) +sharon 78 (9.237,8.8) +paula 68 (0.5,0.5) +julie 68 (3.6,7.2) +belinda 38 (8.9,1.7) +karen 48 (8.73,0.0) +carina 58 (4.27,8.8) +diane 18 (5.912,5.3) +esther 98 (5.36,7.6) +trudy 88 (6.01,0.5) +fanny 08 (1.2,0.9) +carmen 78 (3.8,8.2) +lita 25 (1.3,8.7) +pamela 48 (8.21,9.3) +sandy 38 (3.8,0.2) +trisha 88 (1.29,2.2) +uma 78 (9.73,6.4) +velma 68 (8.8,8.9) diff --git a/src/test/singlenode_regress/data/phone_book.txt b/src/test/singlenode_regress/data/phone_book.txt new file mode 100644 index 00000000000..54013aaf61d --- /dev/null +++ b/src/test/singlenode_regress/data/phone_book.txt @@ -0,0 +1,17388 @@ +Abegahd|Axhdadj|AR|4792656710 +Aadgahd|Ayhdadj|AR|4790356710 +Badgahd|Eyhdadj|AR|4790350711 +Abfgahd|Awhdadj|AR|4792356710 +Abhgahd|Athdadj|AR|4794356710 +Bbfgahd|Ewhdadj|AR|4792352711 +Abggahd|Auhdadj|AR|4793356710 +Ackgahd|Bihdadj|AR|4797356710 +Bcjgahd|Fphdadj|AR|4796356711 +Abigahd|Ashdadj|AR|4795356710 +Aclgahd|Bbhdadj|AR|4795016710 +Bclgahd|Fbhdadj|AR|4795018700 +Acjgahd|Bphdadj|AR|4796356710 +Acmgahd|Bxhdadj|AR|4799356701 +Bcogahd|Fahdadj|AR|4792156100 +Acngahd|Bghdadj|AR|4792056701 +Acpgahd|Bkhdadj|AR|4792256701 +Bcqgahd|Gmhdadj|AR|4792356300 +Acogahd|Bahdadj|AR|4792156701 +Adtgahd|Cnhdadj|AR|4792656701 +Bcrgahd|Gbhdadj|AR|4792456400 +Acqgahd|Cmhdadj|AR|4792356701 +Advgahd|Dchdadj|AR|4792479701 +Bdvgahd|Gchdadj|AR|4792479800 +Acrgahd|Cbhdadj|AR|4792456701 +Adxgahd|Dehdadj|AR|4792306711 +Cadgahd|Iyhdadj|AR|4790356712 +Adsgahd|Cdhdadj|AR|4792556701 +Adygahd|Dfhdadj|AR|4792316711 +Cbegahd|Ixhdadj|AR|4792656712 +Adugahd|Cbhdadj|AR|4792756701 +Bbegahd|Axhdadj|AR|4792651711 +Cbhgahd|Ithdadj|AR|4794356712 +Adwgahd|Ddhdadj|AR|4792956711 +Bckgahd|Fihdadj|AR|4797357700 +Ccmgahd|Jxhdadj|AR|4799356721 +Adzgahd|Dghdadj|AR|4792326711 +Bcmgahd|Fxhdadj|AR|4799359700 +Ccogahd|Jahdadj|AR|4792156721 +Bbggahd|Euhdadj|AR|4793353711 +Bcpgahd|Gkhdadj|AR|4792256200 +Ccpgahd|Kkhdadj|AR|4792256721 +Bbhgahd|Ethdadj|AR|4794354711 +Bdsgahd|Gdhdadj|AR|4792555010 +Ccqgahd|Kmhdadj|AR|4792356721 +Bbigahd|Eshdadj|AR|4795355711 +Bdugahd|Gbhdadj|AR|4792756700 +Cdwgahd|Ldhdadj|AR|4792956721 +Bcngahd|Fghdadj|AR|4792056000 +Bdwgahd|Hdhdadj|AR|4792956900 +Cdzgahd|Lghdadj|AR|4792326722 +Bdtgahd|Gnhdadj|AR|4792656600 +Bdzgahd|Hghdadj|AR|4792326729 +Dbggahd|Muhdadj|AR|4793336722 +Bdxgahd|Hehdadj|AR|4792306709 +Cbigahd|Ishdadj|AR|4795356712 +Dckgahd|Nihdadj|AR|4797386722 +Bdygahd|Hfhdadj|AR|4792316719 +Ccjgahd|Jphdadj|AR|4796356712 +Dcogahd|Nahdadj|AR|4792152732 +Cbfgahd|Iwhdadj|AR|4792356712 +Cckgahd|Jihdadj|AR|4797356712 +Dcrgahd|Obhdadj|AR|4792455732 +Cbggahd|Iuhdadj|AR|4793356712 +Cclgahd|Jbhdadj|AR|4795016721 +Ddsgahd|Odhdadj|AR|4792556732 +Ccngahd|Jghdadj|AR|4792056721 +Ccrgahd|Kbhdadj|AR|4792456721 +Ddtgahd|Onhdadj|AR|4792657732 +Cdtgahd|Knhdadj|AR|4792656721 +Cdsgahd|Kdhdadj|AR|4792556721 +Ddugahd|Obhdadj|AR|4792758732 +Cdugahd|Kbhdadj|AR|4792756721 +Cdxgahd|Lehdadj|AR|4792306721 +Eadgahd|Ryhdadj|AR|4790300745 +Cdvgahd|Lchdadj|AR|4792479721 +Dbhgahd|Mthdadj|AR|4794346722 +Ebegahd|Rxhdadj|AR|4792611745 +Cdygahd|Lfhdadj|AR|4792316722 +Dbigahd|Nshdadj|AR|4795356722 +Ebfgahd|Rwhdadj|AR|4792322745 +Dadgahd|Myhdadj|AR|4790306722 +Dclgahd|Nbhdadj|AR|4795016732 +Ebhgahd|Rthdadj|AR|4794344745 +Dbegahd|Mxhdadj|AR|4792616722 +Dcqgahd|Omhdadj|AR|4792354732 +Eckgahd|Sihdadj|AR|4797387745 +Dbfgahd|Mwhdadj|AR|4792326722 +Ddvgahd|Ochdadj|AR|4792859732 +Ecmgahd|Sxhdadj|AR|4799359745 +Dcjgahd|Nphdadj|AR|4796376722 +Ddwgahd|Odhdadj|AR|4792956045 +Ecogahd|Tahdadj|AR|4792152145 +Dcmgahd|Nxhdadj|AR|4799350732 +Ebigahd|Sshdadj|AR|4795355745 +Ecrgahd|Tbhdadj|AR|4792455445 +Dcngahd|Nghdadj|AR|4792051732 +Ecjgahd|Sphdadj|AR|4796376745 +Edugahd|Ubhdadj|AR|4792758709 +Dcpgahd|Nkhdadj|AR|4792253732 +Eclgahd|Sbhdadj|AR|4795018745 +Edvgahd|Uchdadj|AR|4792859809 +Ddxgahd|Pehdadj|AR|4792306145 +Ecngahd|Sghdadj|AR|4792047945 +Edzgahd|Vghdadj|AR|4792326329 +Ddygahd|Pfhdadj|AR|4792316245 +Edwgahd|Udhdadj|AR|4792956909 +Fadgahd|Vyhdadj|AR|4790300709 +Ddzgahd|Pghdadj|AR|4792326345 +Edygahd|Vfhdadj|AR|4792316219 +Fbigahd|Wshdadj|AR|4795355759 +Ebggahd|Ruhdadj|AR|4793333745 +Fbfgahd|Vwhdadj|AR|4792322729 +Fcjgahd|Wphdadj|AR|4796376769 +Ecpgahd|Tkhdadj|AR|4792253245 +Fcmgahd|Wxhdadj|AR|4799359799 +Fclgahd|Wbhdadj|AR|4795018789 +Ecqgahd|Tmhdadj|AR|4792354345 +Fcqgahd|Xmhdadj|AR|4792354383 +Fcngahd|Wghdadj|AR|4792047980 +Edsgahd|Tdhdadj|AR|4792555019 +Fcrgahd|Xbhdadj|AR|4792455484 +Fcpgahd|Wkhdadj|AR|4792253282 +Edtgahd|Unhdadj|AR|4792657609 +Fdzgahd|Yghdadj|AR|4792326329 +Fdtgahd|Xnhdadj|AR|4792657686 +Edxgahd|Uehdadj|AR|4792306109 +Gadgahd|Yyhdadj|AR|4790300709 +Fdygahd|Yfhdadj|AR|4792616219 +Fbegahd|Vxhdadj|AR|4792611719 +Gbegahd|Yxhdadj|AR|4792611719 +Gbigahd|Zshdadj|AR|4795355759 +Fbggahd|Vuhdadj|AR|4793333739 +Gbggahd|Yuhdadj|AR|4793333739 +Gckgahd|Zihdadj|AR|4797387779 +Fbhgahd|Vthdadj|AR|4794344749 +Gcjgahd|Zphdadj|AR|4796376769 +Gcmgahd|Zxhdadj|AR|4799359799 +Fckgahd|Wihdadj|AR|4797387779 +Gcngahd|Zghdadj|AR|4792047980 +Gcogahd|Zahdadj|AR|4792152181 +Fcogahd|Wahdadj|AR|4792152181 +Gdsgahd|Adhdadj|AR|4792556585 +Gcpgahd|Zkhdadj|AR|4792253282 +Fdsgahd|Xdhdadj|AR|4792556585 +Gdzgahd|Aghdadj|AR|4792326329 +Gdtgahd|Anhdadj|AR|4792657686 +Fdugahd|Xbhdadj|AR|4792758787 +Hbggahd|Buhdadj|AR|5013356799 +Gdugahd|Abhdadj|AR|4792758787 +Fdvgahd|Xchdadj|AR|4792859888 +Hbhgahd|Bthdadj|AR|5014356799 +Gdwgahd|Adhdadj|AR|4792956989 +Fdwgahd|Xdhdadj|AR|4792956989 +Hcmgahd|Bxhdadj|AR|5019356799 +Gdxgahd|Aehdadj|AR|4790306109 +Fdxgahd|Xehdadj|AR|4790306109 +Hcogahd|Bahdadj|AR|5012156799 +Hadgahd|Byhdadj|AR|5010356799 +Gbfgahd|Ywhdadj|AR|4792322729 +Hcqgahd|Cmhdadj|AR|5012356767 +Hbigahd|Bshdadj|AR|5015356799 +Gbhgahd|Ythdadj|AR|4794344749 +Hcrgahd|Cbhdadj|AR|5012456767 +Hcjgahd|Bphdadj|AR|5016356799 +Gclgahd|Zbhdadj|AR|4795018789 +Hdvgahd|Cchdadj|AR|5012479767 +Hckgahd|Bihdadj|AR|5017356799 +Gcqgahd|Zmhdadj|AR|4792354383 +Hdwgahd|Cdhdadj|AR|5012956767 +Hclgahd|Bbhdadj|AR|5015016799 +Gcrgahd|Zbhdadj|AR|4792455484 +Hdxgahd|Cehdadj|AR|5012306767 +Hcngahd|Bghdadj|AR|5012056799 +Gdvgahd|Achdadj|AR|4792859888 +Hdygahd|Dfhdadj|AR|5012316767 +Hcpgahd|Ckhdadj|AR|5012256767 +Gdygahd|Afhdadj|AR|4792616219 +Ibggahd|Duhdadj|AR|5013353778 +Hdsgahd|Cdhdadj|AR|5012556767 +Hbegahd|Bxhdadj|AR|5011356799 +Ickgahd|Eihdadj|AR|5017357778 +Hdtgahd|Cnhdadj|AR|5012656767 +Hbfgahd|Bwhdadj|AR|5012356799 +Icogahd|Eahdadj|AR|5012156178 +Hdzgahd|Dghdadj|AR|5012326767 +Hdugahd|Cbhdadj|AR|5012756767 +Icrgahd|Fbhdadj|AR|5012456456 +Ibegahd|Dxhdadj|AR|5011351778 +Iadgahd|Dyhdadj|AR|5010350767 +Idsgahd|Fdhdadj|AR|5012556556 +Ibfgahd|Dwhdadj|AR|5012352778 +Ibhgahd|Dthdadj|AR|5014354778 +Idtgahd|Fnhdadj|AR|5012656656 +Ibigahd|Dshdadj|AR|5015355778 +Icjgahd|Dphdadj|AR|5016356778 +Idvgahd|Fchdadj|AR|5012479479 +Icngahd|Eghdadj|AR|5012056078 +Iclgahd|Ebhdadj|AR|5015018778 +Idwgahd|Fdhdadj|AR|5012956956 +Icpgahd|Ekhdadj|AR|5012256278 +Icmgahd|Exhdadj|AR|5019359778 +Idxgahd|Fehdadj|AR|5012306709 +Icqgahd|Emhdadj|AR|5012356356 +Idygahd|Gfhdadj|AR|5012316719 +Jcogahd|Hahdadj|AR|5012156755 +Idugahd|Fbhdadj|AR|5012756756 +Idzgahd|Gghdadj|AR|5012326729 +Jcpgahd|Hkhdadj|AR|5012256755 +Jadgahd|Gyhdadj|AR|5010356701 +Jbggahd|Guhdadj|AR|5013356701 +Jcqgahd|Hmhdadj|AR|5012356755 +Jbegahd|Gxhdadj|AR|5011356701 +Jbhgahd|Gthdadj|AR|5014356701 +Jdugahd|Ibhdadj|AR|5012756755 +Jbfgahd|Gwhdadj|AR|5012356701 +Jcjgahd|Gphdadj|AR|5016356701 +Jdxgahd|Iehdadj|AR|5012306755 +Jbigahd|Gshdadj|AR|5015356701 +Jcmgahd|Hxhdadj|AR|5019356701 +Jdygahd|Ifhdadj|AR|5012316755 +Jckgahd|Hihdadj|AR|5017356701 +Jcngahd|Hghdadj|AR|5012056755 +Kbggahd|Juhdadj|AR|5013336704 +Jclgahd|Hbhdadj|AR|5015016701 +Jdtgahd|Inhdadj|AR|5012656755 +Kbhgahd|Jthdadj|AR|5014346704 +Jcrgahd|Hbhdadj|AR|5012456755 +Jdvgahd|Ichdadj|AR|5012479755 +Kcmgahd|Jxhdadj|AR|5019350704 +Jdsgahd|Hdhdadj|AR|5012556755 +Jdwgahd|Idhdadj|AR|5012956755 +Kcpgahd|Kkhdadj|AR|5012253704 +Jdzgahd|Ighdadj|AR|5012326755 +Kckgahd|Jihdadj|AR|5017386704 +Kdtgahd|Knhdadj|AR|5012657766 +Kadgahd|Iyhdadj|AR|5010306704 +Kcngahd|Jghdadj|AR|5012051704 +Kdxgahd|Lehdadj|AR|5012306166 +Kbegahd|Ixhdadj|AR|5011316704 +Kcogahd|Kahdadj|AR|5012152704 +Kdygahd|Lfhdadj|AR|5012316266 +Kbfgahd|Jwhdadj|AR|5012326704 +Kdvgahd|Kchdadj|AR|5012859766 +Lbfgahd|Lwhdadj|AR|5012322766 +Kbigahd|Jshdadj|AR|5015356704 +Kdwgahd|Ldhdadj|AR|5012956066 +Lbigahd|Lshdadj|AR|5015355729 +Kcjgahd|Jphdadj|AR|5016376704 +Ladgahd|Lyhdadj|AR|5010300766 +Lckgahd|Mihdadj|AR|5017387729 +Kclgahd|Jbhdadj|AR|5015016704 +Lbggahd|Luhdadj|AR|5013333729 +Lcmgahd|Mxhdadj|AR|5019359729 +Kcqgahd|Kmhdadj|AR|5012354766 +Lbhgahd|Lthdadj|AR|5014344729 +Lcqgahd|Mmhdadj|AR|5012354329 +Kcrgahd|Kbhdadj|AR|5012455766 +Lcjgahd|Lphdadj|AR|5016376729 +Ldxgahd|Nehdadj|AR|5012306109 +Kdsgahd|Kdhdadj|AR|5012556766 +Lclgahd|Mbhdadj|AR|5015018729 +Ldzgahd|Nghdadj|AR|5012326329 +Kdugahd|Kbhdadj|AR|5012754796 +Lcngahd|Mghdadj|AR|5012047929 +Mbegahd|Nxhdadj|AR|5011311719 +Kdzgahd|Lghdadj|AR|5012326366 +Lcogahd|Mahdadj|AR|5012152129 +Mbigahd|Nshdadj|AR|5015355759 +Lbegahd|Lxhdadj|AR|5011311766 +Lcpgahd|Mkhdadj|AR|5012253229 +Mckgahd|Nihdadj|AR|5017387779 +Ldsgahd|Mdhdadj|AR|5012556529 +Lcrgahd|Mbhdadj|AR|5012455429 +Mcngahd|Oghdadj|AR|5012047980 +Ldvgahd|Nchdadj|AR|5012859829 +Ldtgahd|Mnhdadj|AR|5012657629 +Mcogahd|Oahdadj|AR|5012152181 +Ldwgahd|Ndhdadj|AR|5012956929 +Ldugahd|Mbhdadj|AR|5012758729 +Mdtgahd|Onhdadj|AR|5012657686 +Ldygahd|Nfhdadj|AR|5012316219 +Madgahd|Nyhdadj|AR|5010300709 +Mdugahd|Obhdadj|AR|5012758787 +Mbfgahd|Nwhdadj|AR|5012322729 +Mbggahd|Nuhdadj|AR|5013333739 +Mdvgahd|Ochdadj|AR|5012859888 +Mclgahd|Obhdadj|AR|5015018789 +Mbhgahd|Nthdadj|AR|5014344749 +Nbegahd|Pxhdadj|AR|5011311719 +Mcmgahd|Oxhdadj|AR|5019359799 +Mcjgahd|Nphdadj|AR|5016376769 +Nbigahd|Pshdadj|AR|5015355759 +Mcqgahd|Omhdadj|AR|5012354383 +Mcpgahd|Okhdadj|AR|5012253282 +Nclgahd|Qbhdadj|AR|5015018789 +Mcrgahd|Obhdadj|AR|5012455484 +Mdsgahd|Odhdadj|AR|5012556585 +Ncngahd|Qghdadj|AR|5012047980 +Mdxgahd|Pehdadj|AR|5010306109 +Mdwgahd|Pdhdadj|AR|5012956989 +Ncqgahd|Qmhdadj|AR|5012354383 +Ncjgahd|Pphdadj|AR|5016376769 +Mdygahd|Pfhdadj|AR|5011316219 +Ndsgahd|Qdhdadj|AR|5012556585 +Nckgahd|Pihdadj|AR|5017387779 +Mdzgahd|Pghdadj|AR|5012326329 +Ndxgahd|Rehdadj|AR|5010306109 +Ncrgahd|Qbhdadj|AR|5012455484 +Nadgahd|Pyhdadj|AR|5010300709 +Obhgahd|Rthdadj|AR|5014356776 +Ndtgahd|Qnhdadj|AR|5012657686 +Nbfgahd|Pwhdadj|AR|5012322729 +Ocpgahd|Skhdadj|AR|5012256776 +Ndugahd|Qbhdadj|AR|5012758787 +Nbggahd|Puhdadj|AR|5013333739 +Ocrgahd|Sbhdadj|AR|5012456776 +Ndvgahd|Qchdadj|AR|5012859888 +Nbhgahd|Pthdadj|AR|5014344749 +Odsgahd|Sdhdadj|AR|5012556776 +Ndygahd|Rfhdadj|AR|5011316219 +Ncmgahd|Qxhdadj|AR|5019359799 +Odvgahd|Tchdadj|AR|5012479776 +Ndzgahd|Rghdadj|AR|5012326329 +Ncogahd|Qahdadj|AR|5012152181 +Odxgahd|Tehdadj|AR|5012306767 +Obggahd|Ruhdadj|AR|5013356776 +Ncpgahd|Qkhdadj|AR|5012253282 +Odygahd|Tfhdadj|AR|5012316767 +Obigahd|Rshdadj|AR|5015356776 +Ndwgahd|Qdhdadj|AR|5012956989 +Odzgahd|Tghdadj|AR|5012326767 +Oclgahd|Sbhdadj|AR|5015016776 +Oadgahd|Ryhdadj|AR|5010356776 +Pbegahd|Txhdadj|AR|5011351767 +Ocmgahd|Sxhdadj|AR|5019356776 +Obegahd|Rxhdadj|AR|5011356776 +Pbigahd|Tshdadj|AR|5015355767 +Ocogahd|Sahdadj|AR|5012156776 +Obfgahd|Rwhdadj|AR|5012356776 +Pclgahd|Ubhdadj|AR|5015014797 +Ocqgahd|Smhdadj|AR|5012356776 +Ocjgahd|Sphdadj|AR|5016356776 +Pcmgahd|Uxhdadj|AR|5019359767 +Odugahd|Tbhdadj|AR|5012756776 +Ockgahd|Sihdadj|AR|5017356776 +Pcpgahd|Ukhdadj|AR|5012256267 +Padgahd|Tyhdadj|AR|5010350767 +Ocngahd|Sghdadj|AR|5012056776 +Pdsgahd|Udhdadj|AR|5012555010 +Pbfgahd|Twhdadj|AR|5012352767 +Odtgahd|Snhdadj|AR|5012656776 +Pdwgahd|Udhdadj|AR|5012956900 +Pbggahd|Tuhdadj|AR|5013353767 +Odwgahd|Tdhdadj|AR|5012956776 +Pdzgahd|Vghdadj|AR|5012326729 +Pcjgahd|Uphdadj|AR|5016356767 +Pbhgahd|Tthdadj|AR|5014354767 +Radgahd|Vyhdadj|AR|5010356700 +Pckgahd|Uihdadj|AR|5017357767 +Pcogahd|Uahdadj|AR|5012156167 +Rbhgahd|Vthdadj|AR|5014356700 +Pcngahd|Ughdadj|AR|5012056067 +Pcqgahd|Umhdadj|AR|5012356367 +Rcngahd|Wghdadj|AR|5012056700 +Pdugahd|Ubhdadj|AR|5012756700 +Pcrgahd|Ubhdadj|AR|5012456467 +Rcpgahd|Wkhdadj|AR|5012256706 +Pdxgahd|Vehdadj|AR|5012306709 +Pdtgahd|Unhdadj|AR|5012656600 +Rcrgahd|Wbhdadj|AR|5012456706 +Pdygahd|Vfhdadj|AR|5012316719 +Pdvgahd|Uchdadj|AR|5012479800 +Rdugahd|Wbhdadj|AR|5012756706 +Rbggahd|Vuhdadj|AR|5013356700 +Rbegahd|Vxhdadj|AR|5011356700 +Rdvgahd|Wchdadj|AR|5012479706 +Rbigahd|Vshdadj|AR|5015356700 +Rbfgahd|Vwhdadj|AR|5012356700 +Rdxgahd|Wehdadj|AR|5012306706 +Rcjgahd|Vphdadj|AR|5016356700 +Rckgahd|Vihdadj|AR|5017356700 +Rdygahd|Wfhdadj|AR|5012316706 +Sbfgahd|Xwhdadj|AR|5012326706 +Rclgahd|Wbhdadj|AR|5015016700 +Rdzgahd|Wghdadj|AR|5012326706 +Sbggahd|Xuhdadj|AR|5013336706 +Rcmgahd|Wxhdadj|AR|5019356700 +Sadgahd|Xyhdadj|AR|5010306706 +Sbigahd|Xshdadj|AR|5015356740 +Rcogahd|Wahdadj|AR|5012156700 +Sbegahd|Xxhdadj|AR|5011316706 +Scngahd|Xghdadj|AR|5012051740 +Rcqgahd|Wmhdadj|AR|5012356706 +Sbhgahd|Xthdadj|AR|5014346706 +Scpgahd|Ykhdadj|AR|5012253740 +Rdsgahd|Wdhdadj|AR|5012556706 +Sckgahd|Xihdadj|AR|5017386740 +Scqgahd|Ymhdadj|AR|5012354740 +Rdtgahd|Wnhdadj|AR|5012656706 +Sclgahd|Xbhdadj|AR|5015016740 +Sdzgahd|Yghdadj|AR|5012326333 +Rdwgahd|Wdhdadj|AR|5012956706 +Scogahd|Yahdadj|AR|5012152740 +Ubggahd|Zuhdadj|AR|5013333733 +Scjgahd|Xphdadj|AR|5016376740 +Sdsgahd|Ydhdadj|AR|5012556740 +Ubhgahd|Zthdadj|AR|5014344733 +Scmgahd|Xxhdadj|AR|5019350740 +Sdvgahd|Ychdadj|AR|5012859740 +Uckgahd|Zihdadj|AR|5017387733 +Scrgahd|Ybhdadj|AR|5012455740 +Sdwgahd|Ydhdadj|AR|5012956040 +Ucngahd|Aghdadj|AR|5012047933 +Sdtgahd|Ynhdadj|AR|5012657740 +Sdxgahd|Yehdadj|AR|5012306140 +Ucogahd|Aahdadj|AR|5012152133 +Sdugahd|Ybhdadj|AR|5012758740 +Ubfgahd|Zwhdadj|AR|5012322733 +Ucrgahd|Abhdadj|AR|5012455433 +Sdygahd|Yfhdadj|AR|5012316233 +Ucjgahd|Zphdadj|AR|5016376733 +Udsgahd|Adhdadj|AR|5012556533 +Uadgahd|Zyhdadj|AR|5010300733 +Ucpgahd|Akhdadj|AR|5012253233 +Udwgahd|Adhdadj|AR|5012956933 +Ubegahd|Zxhdadj|AR|5011311733 +Udvgahd|Achdadj|AR|5012859833 +Udzgahd|Bghdadj|AR|5012326329 +Ubigahd|Zshdadj|AR|5015355733 +Udygahd|Bfhdadj|AR|5012316219 +Vbfgahd|Bwhdadj|AR|5012322729 +Uclgahd|Zbhdadj|AR|5015018733 +Vadgahd|Byhdadj|AR|5010300709 +Vcjgahd|Bphdadj|AR|5016376769 +Ucmgahd|Axhdadj|AR|5019359733 +Vbegahd|Bxhdadj|AR|5011311719 +Vcmgahd|Cxhdadj|AR|5019359799 +Ucqgahd|Amhdadj|AR|5012354333 +Vbhgahd|Bthdadj|AR|5014344749 +Vcpgahd|Ckhdadj|AR|5012253282 +Udtgahd|Anhdadj|AR|5012657633 +Vbigahd|Bshdadj|AR|5015355759 +Vdxgahd|Cehdadj|AR|5010306109 +Udugahd|Abhdadj|AR|5012758733 +Vckgahd|Bihdadj|AR|5017387779 +Vdygahd|Cfhdadj|AR|5011316219 +Udxgahd|Aehdadj|AR|5012306109 +Vclgahd|Bbhdadj|AR|5015018789 +Vdzgahd|Cghdadj|AR|5012326329 +Vbggahd|Buhdadj|AR|5013333739 +Vcqgahd|Cmhdadj|AR|5012354383 +Wadgahd|Dyhdadj|AR|5010300709 +Vcngahd|Cghdadj|AR|5012047980 +Vdugahd|Cbhdadj|AR|5012758787 +Wbggahd|Duhdadj|AR|5013333739 +Vcogahd|Cahdadj|AR|5012152181 +Vdvgahd|Cchdadj|AR|5012859888 +Wcjgahd|Dphdadj|AR|5016376769 +Vcrgahd|Cbhdadj|AR|5012455484 +Vdwgahd|Cdhdadj|AR|5012956989 +Wcmgahd|Dxhdadj|AR|5019359799 +Vdsgahd|Cdhdadj|AR|5012556585 +Wbfgahd|Dwhdadj|AR|5012322729 +Wdvgahd|Echdadj|AR|5012859888 +Vdtgahd|Cnhdadj|AR|5012657686 +Wbhgahd|Dthdadj|AR|5014344749 +Wdygahd|Efhdadj|AR|5011316219 +Wbegahd|Dxhdadj|AR|5011311719 +Wcogahd|Dahdadj|AR|5012152181 +Xbegahd|Exhdadj|AR|5011356790 +Wbigahd|Dshdadj|AR|5015355759 +Wcpgahd|Dkhdadj|AR|5012253282 +Xbfgahd|Ewhdadj|AR|5012356790 +Wckgahd|Dihdadj|AR|5017387779 +Wcqgahd|Emhdadj|AR|5012354383 +Xbggahd|Euhdadj|AR|5013356790 +Wclgahd|Dbhdadj|AR|5015018789 +Wdugahd|Ebhdadj|AR|5012758787 +Xbhgahd|Ethdadj|AR|5014356790 +Wcngahd|Dghdadj|AR|5012047980 +Wdxgahd|Eehdadj|AR|5010306109 +Xcjgahd|Ephdadj|AR|5016356790 +Wcrgahd|Ebhdadj|AR|5012455484 +Xbigahd|Eshdadj|AR|5015356790 +Xcngahd|Fghdadj|AR|5012056790 +Wdsgahd|Edhdadj|AR|5012556585 +Xckgahd|Eihdadj|AR|5017356790 +Xdsgahd|Fdhdadj|AR|5012556779 +Wdtgahd|Enhdadj|AR|5012657686 +Xcmgahd|Fxhdadj|AR|5019356790 +Xdugahd|Fbhdadj|AR|5012756779 +Wdwgahd|Edhdadj|AR|5012956989 +Xcpgahd|Fkhdadj|AR|5012256779 +Xdygahd|Ffhdadj|AR|5012316779 +Wdzgahd|Eghdadj|AR|5012326329 +Xdvgahd|Fchdadj|AR|5012479779 +Yadgahd|Gyhdadj|AR|5010350779 +Xadgahd|Eyhdadj|AR|5010356790 +Xdwgahd|Fdhdadj|AR|5012956779 +Ybegahd|Gxhdadj|AR|5011351779 +Xclgahd|Fbhdadj|AR|5015016790 +Xdxgahd|Fehdadj|AR|5012306779 +Ybfgahd|Gwhdadj|AR|5012352779 +Xcogahd|Fahdadj|AR|5012156790 +Ybigahd|Gshdadj|AR|5015355779 +Ybhgahd|Gthdadj|AR|5014354779 +Xcqgahd|Fmhdadj|AR|5012356779 +Yckgahd|Gihdadj|AR|5017357779 +Ycjgahd|Gphdadj|AR|5016356779 +Xcrgahd|Fbhdadj|AR|5012456779 +Ycogahd|Gahdadj|AR|5012156144 +Yclgahd|Gbhdadj|AR|5015018744 +Xdtgahd|Fnhdadj|AR|5012656779 +Ycqgahd|Gmhdadj|AR|5012356344 +Ycpgahd|Gkhdadj|AR|5012256244 +Xdzgahd|Fghdadj|AR|5012326779 +Ydsgahd|Hdhdadj|AR|5012556544 +Ydtgahd|Hnhdadj|AR|5012656644 +Ybggahd|Guhdadj|AR|5013353779 +Ydvgahd|Hchdadj|AR|5012479844 +Ydwgahd|Hdhdadj|AR|5012956944 +Ycmgahd|Gxhdadj|AR|5019359744 +Zbegahd|Hxhdadj|AR|5011356744 +Ydxgahd|Hehdadj|AR|5012306709 +Ycngahd|Gghdadj|AR|5012056044 +Zcogahd|Iahdadj|AR|5012156766 +Ydygahd|Hfhdadj|AR|5012316719 +Ycrgahd|Gbhdadj|AR|5012456444 +Zcpgahd|Ikhdadj|AR|5012256766 +Ydzgahd|Hghdadj|AR|5012326729 +Ydugahd|Hbhdadj|AR|5012756744 +Zdwgahd|Jdhdadj|AR|5012956751 +Zadgahd|Hyhdadj|AR|5010356744 +Zbggahd|Huhdadj|AR|5013356766 +Zdygahd|Jfhdadj|AR|5012316751 +Zbfgahd|Hwhdadj|AR|5012356744 +Zbigahd|Ishdadj|AR|5015356766 +Kefgahd|Jwhdadj|AR|5012326751 +Zbhgahd|Hthdadj|AR|5014356766 +Zckgahd|Iihdadj|AR|5017356766 +Keigahd|Jshdadj|AR|5015356751 +Zcjgahd|Iphdadj|AR|5016356766 +Zclgahd|Ibhdadj|AR|5015016766 +Kemgahd|Kxhdadj|AR|5019350751 +Zcmgahd|Ixhdadj|AR|5019356766 +Zcngahd|Ighdadj|AR|5012056766 +Kengahd|Kghdadj|AR|5012051751 +Zdvgahd|Jchdadj|AR|5012479751 +Zcqgahd|Imhdadj|AR|5012356766 +Kepgahd|Kkhdadj|AR|5012253751 +Kedgahd|Jyhdadj|AR|5010306751 +Zcrgahd|Ibhdadj|AR|5012456766 +Kesgahd|Kdhdadj|AR|5012556762 +Keegahd|Jxhdadj|AR|5011316751 +Zdsgahd|Idhdadj|AR|5012556766 +Kewgahd|Kdhdadj|AR|5012956062 +Kehgahd|Jthdadj|AR|5014346751 +Zdtgahd|Inhdadj|AR|5012656766 +Kexgahd|Kehdadj|AR|5012306162 +Kelgahd|Jbhdadj|AR|5015016751 +Zdugahd|Ibhdadj|AR|5012756766 +Lidgahd|Lyhdadj|AR|5010300762 +Keqgahd|Kmhdadj|AR|5012354762 +Zdxgahd|Jehdadj|AR|5012306751 +Liegahd|Lxhdadj|AR|5011311762 +Ketgahd|Knhdadj|AR|5012657762 +Zdzgahd|Jghdadj|AR|5012326751 +Liigahd|Lshdadj|AR|5015355762 +Kezgahd|Kghdadj|AR|5012326362 +Keggahd|Juhdadj|AR|5013336751 +Lijgahd|Lphdadj|AR|5016376762 +Liggahd|Luhdadj|AR|5013333762 +Kejgahd|Jphdadj|AR|5016376751 +Liqgahd|Lmhdadj|AR|5012354388 +Likgahd|Lihdadj|AR|5017387762 +Kekgahd|Jihdadj|AR|5017386751 +Lirgahd|Mbhdadj|AR|5012455488 +Lilgahd|Lbhdadj|AR|5015014792 +Keogahd|Kahdadj|AR|5012152751 +Litgahd|Mnhdadj|AR|5012657688 +Lipgahd|Lkhdadj|AR|5012253288 +Kergahd|Kbhdadj|AR|5012455762 +Liugahd|Mbhdadj|AR|5012758788 +Liygahd|Mfhdadj|AR|5012316219 +Keugahd|Kbhdadj|AR|5012754792 +Lizgahd|Mghdadj|AR|5012326329 +Moegahd|Mxhdadj|AR|5011311719 +Kevgahd|Kchdadj|AR|5012859762 +Modgahd|Myhdadj|AR|5010300709 +Moggahd|Muhdadj|AR|5013333739 +Keygahd|Kfhdadj|AR|5012316262 +Mongahd|Nghdadj|AR|5012047980 +Mohgahd|Mthdadj|AR|5014344749 +Lifgahd|Lwhdadj|AR|5012322762 +Mopgahd|Nkhdadj|AR|5012253282 +Momgahd|Nxhdadj|AR|5019359799 +Lihgahd|Lthdadj|AR|5014344762 +Mosgahd|Ndhdadj|AR|5012556585 +Moqgahd|Nmhdadj|AR|5012354383 +Limgahd|Lxhdadj|AR|5019359762 +Mowgahd|Ndhdadj|AR|5012956989 +Motgahd|Nnhdadj|AR|5012657686 +Lingahd|Lghdadj|AR|5012047988 +Nudgahd|Oyhdadj|AR|5010300709 +Movgahd|Nchdadj|AR|5012859888 +Liogahd|Lahdadj|AR|5012152188 +Nujgahd|Ophdadj|AR|5016376769 +Mozgahd|Oghdadj|AR|5012326329 +Lisgahd|Mdhdadj|AR|5012556588 +Numgahd|Pxhdadj|AR|5019359799 +Nufgahd|Owhdadj|AR|5012322729 +Livgahd|Mchdadj|AR|5012859888 +Nungahd|Pghdadj|AR|5012047980 +Nuggahd|Ouhdadj|AR|5013333739 +Liwgahd|Mdhdadj|AR|5012956988 +Nuogahd|Pahdadj|AR|5012152181 +Nuhgahd|Othdadj|AR|5014344749 +Lixgahd|Mehdadj|AR|5012306109 +Nuqgahd|Pmhdadj|AR|5012354383 +Nukgahd|Oihdadj|AR|5017387779 +Mofgahd|Mwhdadj|AR|5012322729 +Nurgahd|Pbhdadj|AR|5012455484 +Nulgahd|Pbhdadj|AR|5015018789 +Moigahd|Mshdadj|AR|5015355759 +Nutgahd|Pnhdadj|AR|5012657686 +Nuxgahd|Qehdadj|AR|5010306109 +Mojgahd|Nphdadj|AR|5016376769 +Nuugahd|Pbhdadj|AR|5012758787 +Nuygahd|Qfhdadj|AR|5011316219 +Mokgahd|Nihdadj|AR|5017387779 +Nuzgahd|Qghdadj|AR|5012326329 +Badgahd|Eyhdadj|AR|4790350711 +Molgahd|Nbhdadj|AR|5015018789 +Aadgahd|Ayhdadj|AR|4790356710 +Bbfgahd|Ewhdadj|AR|4792352711 +Moogahd|Nahdadj|AR|5012152181 +Abhgahd|Athdadj|AR|4794356710 +Bcjgahd|Fphdadj|AR|4796356711 +Morgahd|Nbhdadj|AR|5012455484 +Ackgahd|Bihdadj|AR|4797356710 +Bclgahd|Fbhdadj|AR|4795018700 +Mougahd|Nbhdadj|AR|5012758787 +Aclgahd|Bbhdadj|AR|4795016710 +Bcogahd|Fahdadj|AR|4792156100 +Moxgahd|Nehdadj|AR|5010306109 +Acmgahd|Bxhdadj|AR|4799356701 +Bcqgahd|Gmhdadj|AR|4792356300 +Moygahd|Ofhdadj|AR|5011316219 +Acpgahd|Bkhdadj|AR|4792256701 +Bcrgahd|Gbhdadj|AR|4792456400 +Nuegahd|Oxhdadj|AR|5011311719 +Adtgahd|Cnhdadj|AR|4792656701 +Bdvgahd|Gchdadj|AR|4792479800 +Nuigahd|Oshdadj|AR|5015355759 +Advgahd|Dchdadj|AR|4792479701 +Cadgahd|Iyhdadj|AR|4790356712 +Nupgahd|Pkhdadj|AR|5012253282 +Adxgahd|Dehdadj|AR|4792306711 +Cbegahd|Ixhdadj|AR|4791356712 +Nusgahd|Pdhdadj|AR|5012556585 +Adygahd|Dfhdadj|AR|4792316711 +Cbhgahd|Ithdadj|AR|4794356712 +Nuvgahd|Pchdadj|AR|5012859888 +Bbegahd|Axhdadj|AR|4791351711 +Ccmgahd|Jxhdadj|AR|4799356721 +Nuwgahd|Pdhdadj|AR|5012956989 +Bckgahd|Fihdadj|AR|4797357700 +Ccogahd|Jahdadj|AR|4792156721 +Abegahd|Axhdadj|AR|4791356710 +Bcmgahd|Fxhdadj|AR|4799359700 +Ccpgahd|Kkhdadj|AR|4792256721 +Abfgahd|Awhdadj|AR|4792356710 +Bcpgahd|Gkhdadj|AR|4792256200 +Ccqgahd|Kmhdadj|AR|4792356721 +Abggahd|Auhdadj|AR|4793356710 +Bdsgahd|Gdhdadj|AR|4792555010 +Cdwgahd|Ldhdadj|AR|4792956721 +Abigahd|Ashdadj|AR|4795356710 +Bdugahd|Gbhdadj|AR|4792756700 +Cdzgahd|Lghdadj|AR|4792326722 +Acjgahd|Bphdadj|AR|4796356710 +Bdwgahd|Hdhdadj|AR|4792956900 +Dbggahd|Muhdadj|AR|4793336722 +Acngahd|Bghdadj|AR|4792056701 +Bdzgahd|Hghdadj|AR|4792326729 +Dckgahd|Nihdadj|AR|4797386722 +Acogahd|Bahdadj|AR|4792156701 +Cbigahd|Ishdadj|AR|4795356712 +Dcogahd|Nahdadj|AR|4792152732 +Acqgahd|Cmhdadj|AR|4792356701 +Ccjgahd|Jphdadj|AR|4796356712 +Dcrgahd|Obhdadj|AR|4792455732 +Acrgahd|Cbhdadj|AR|4792456701 +Cckgahd|Jihdadj|AR|4797356712 +Ddsgahd|Odhdadj|AR|4792556732 +Adsgahd|Cdhdadj|AR|4792556701 +Cclgahd|Jbhdadj|AR|4795016721 +Ddtgahd|Onhdadj|AR|4792657732 +Adugahd|Cbhdadj|AR|4792756701 +Ccrgahd|Kbhdadj|AR|4792456721 +Ddugahd|Obhdadj|AR|4792758732 +Adwgahd|Ddhdadj|AR|4792956711 +Cdsgahd|Kdhdadj|AR|4792556721 +Eadgahd|Ryhdadj|AR|4790300745 +Adzgahd|Dghdadj|AR|4792326711 +Cdxgahd|Lehdadj|AR|4792306721 +Ebegahd|Rxhdadj|AR|4791311745 +Bbggahd|Euhdadj|AR|4793353711 +Dbhgahd|Mthdadj|AR|4794346722 +Ebfgahd|Rwhdadj|AR|4792322745 +Bbhgahd|Ethdadj|AR|4794354711 +Dbigahd|Nshdadj|AR|4795356722 +Ebhgahd|Rthdadj|AR|4794344745 +Bbigahd|Eshdadj|AR|4795355711 +Dclgahd|Nbhdadj|AR|4795016732 +Eckgahd|Sihdadj|AR|4797387745 +Bcngahd|Fghdadj|AR|4792056000 +Dcqgahd|Omhdadj|AR|4792354732 +Ecmgahd|Sxhdadj|AR|4799359745 +Bdtgahd|Gnhdadj|AR|4792656600 +Ddvgahd|Ochdadj|AR|4792859732 +Ecogahd|Tahdadj|AR|4792152145 +Bdxgahd|Hehdadj|AR|4792306709 +Ddwgahd|Odhdadj|AR|4792956045 +Ecrgahd|Tbhdadj|AR|4792455445 +Bdygahd|Hfhdadj|AR|4792316719 +Ebigahd|Sshdadj|AR|4795355745 +Edugahd|Ubhdadj|AR|4792758709 +Cbfgahd|Iwhdadj|AR|4792356712 +Ecjgahd|Sphdadj|AR|4796376745 +Edvgahd|Uchdadj|AR|4792859809 +Cbggahd|Iuhdadj|AR|4793356712 +Eclgahd|Sbhdadj|AR|4795018745 +Edzgahd|Vghdadj|AR|4792326329 +Ccngahd|Jghdadj|AR|4792056721 +Ecngahd|Sghdadj|AR|4792047945 +Fadgahd|Vyhdadj|AR|4790300709 +Cdtgahd|Knhdadj|AR|4792656721 +Edwgahd|Udhdadj|AR|4792956909 +Fbigahd|Wshdadj|AR|4795355759 +Cdugahd|Kbhdadj|AR|4792756721 +Edygahd|Vfhdadj|AR|4792316219 +Fcjgahd|Wphdadj|AR|4796376769 +Cdvgahd|Lchdadj|AR|4792479721 +Fbfgahd|Vwhdadj|AR|4792322729 +Fclgahd|Wbhdadj|AR|4795018789 +Cdygahd|Lfhdadj|AR|4792316722 +Fcmgahd|Wxhdadj|AR|4799359799 +Fcngahd|Wghdadj|AR|4792047980 +Dadgahd|Myhdadj|AR|4790306722 +Fcqgahd|Xmhdadj|AR|4792354383 +Fcpgahd|Wkhdadj|AR|4792253282 +Dbegahd|Mxhdadj|AR|4791316722 +Fcrgahd|Xbhdadj|AR|4792455484 +Fdtgahd|Xnhdadj|AR|4792657686 +Dbfgahd|Mwhdadj|AR|4792326722 +Fdzgahd|Yghdadj|AR|4792326329 +Fdygahd|Yfhdadj|AR|4791316219 +Dcjgahd|Nphdadj|AR|4796376722 +Gadgahd|Yyhdadj|AR|4790300709 +Gbigahd|Zshdadj|AR|4795355759 +Dcmgahd|Nxhdadj|AR|4799350732 +Gbegahd|Yxhdadj|AR|4791311719 +Gckgahd|Zihdadj|AR|4797387779 +Dcngahd|Nghdadj|AR|4792051732 +Gbggahd|Yuhdadj|AR|4793333739 +Gcmgahd|Zxhdadj|AR|4799359799 +Dcpgahd|Nkhdadj|AR|4792253732 +Gcjgahd|Zphdadj|AR|4796376769 +Gcogahd|Zahdadj|AR|4792152181 +Ddxgahd|Pehdadj|AR|4792306145 +Gcngahd|Zghdadj|AR|4792047980 +Gcpgahd|Zkhdadj|AR|4792253282 +Ddygahd|Pfhdadj|AR|4792316245 +Gdsgahd|Adhdadj|AR|4792556585 +Gdtgahd|Anhdadj|AR|4792657686 +Ddzgahd|Pghdadj|AR|4792326345 +Gdzgahd|Aghdadj|AR|4792326329 +Gdugahd|Abhdadj|AR|4792758787 +Ebggahd|Ruhdadj|AR|4793333745 +Hbggahd|Buhdadj|AR|4793356799 +Gdwgahd|Adhdadj|AR|4792956989 +Ecpgahd|Tkhdadj|AR|4792253245 +Hbhgahd|Bthdadj|AR|4794356799 +Gdxgahd|Aehdadj|AR|4790306109 +Ecqgahd|Tmhdadj|AR|4792354345 +Hcmgahd|Bxhdadj|AR|4799356799 +Hadgahd|Byhdadj|AR|4790356799 +Edsgahd|Tdhdadj|AR|4792555019 +Hcogahd|Bahdadj|AR|4792156799 +Hbigahd|Bshdadj|AR|4795356799 +Edtgahd|Unhdadj|AR|4792657609 +Hcqgahd|Cmhdadj|AR|4792356767 +Hcjgahd|Bphdadj|AR|4796356799 +Edxgahd|Uehdadj|AR|4792306109 +Hcrgahd|Cbhdadj|AR|4792456767 +Hckgahd|Bihdadj|AR|4797356799 +Fbegahd|Vxhdadj|AR|4791311719 +Hdvgahd|Cchdadj|AR|4792479767 +Hclgahd|Bbhdadj|AR|4795016799 +Fbggahd|Vuhdadj|AR|4793333739 +Hdwgahd|Cdhdadj|AR|4792956767 +Hcngahd|Bghdadj|AR|4792056799 +Fbhgahd|Vthdadj|AR|4794344749 +Hdxgahd|Cehdadj|AR|4792306767 +Hcpgahd|Ckhdadj|AR|4792256767 +Fckgahd|Wihdadj|AR|4797387779 +Hdygahd|Dfhdadj|AR|4792316767 +Hdsgahd|Cdhdadj|AR|4792556767 +Fcogahd|Wahdadj|AR|4792152181 +Ibggahd|Duhdadj|AR|4793353778 +Hdtgahd|Cnhdadj|AR|4792656767 +Fdsgahd|Xdhdadj|AR|4792556585 +Ickgahd|Eihdadj|AR|4797357778 +Hdzgahd|Dghdadj|AR|4792326767 +Fdugahd|Xbhdadj|AR|4792758787 +Icogahd|Eahdadj|AR|4792156178 +Ibegahd|Dxhdadj|AR|4791351778 +Fdvgahd|Xchdadj|AR|4792859888 +Icrgahd|Fbhdadj|AR|4792456456 +Ibfgahd|Dwhdadj|AR|4792352778 +Fdwgahd|Xdhdadj|AR|4792956989 +Idsgahd|Fdhdadj|AR|4792556556 +Ibigahd|Dshdadj|AR|4795355778 +Fdxgahd|Xehdadj|AR|4790306109 +Idtgahd|Fnhdadj|AR|4792656656 +Icngahd|Eghdadj|AR|4792056078 +Gbfgahd|Ywhdadj|AR|4792322729 +Idvgahd|Fchdadj|AR|4792479479 +Icpgahd|Ekhdadj|AR|4792256278 +Gbhgahd|Ythdadj|AR|4794344749 +Idwgahd|Fdhdadj|AR|4792956956 +Icqgahd|Emhdadj|AR|4792356356 +Gclgahd|Zbhdadj|AR|4795018789 +Idxgahd|Fehdadj|AR|4792306709 +Idugahd|Fbhdadj|AR|4792756756 +Gcqgahd|Zmhdadj|AR|4792354383 +Jcogahd|Hahdadj|AR|4792156755 +Jadgahd|Gyhdadj|AR|4790356701 +Gcrgahd|Zbhdadj|AR|4792455484 +Jcpgahd|Hkhdadj|AR|4792256755 +Jbegahd|Gxhdadj|AR|4791356701 +Gdvgahd|Achdadj|AR|4792859888 +Jcqgahd|Hmhdadj|AR|4792356755 +Jbfgahd|Gwhdadj|AR|4792356701 +Gdygahd|Afhdadj|AR|4791316219 +Jdugahd|Ibhdadj|AR|4792756755 +Jbigahd|Gshdadj|AR|4795356701 +Hbegahd|Bxhdadj|AR|4791356799 +Jdxgahd|Iehdadj|AR|4792306755 +Jckgahd|Hihdadj|AR|4797356701 +Hbfgahd|Bwhdadj|AR|4792356799 +Jdygahd|Ifhdadj|AR|4792316755 +Jclgahd|Hbhdadj|AR|4795016701 +Hdugahd|Cbhdadj|AR|4792756767 +Kbggahd|Juhdadj|AR|4793336704 +Jcrgahd|Hbhdadj|AR|4792456755 +Iadgahd|Dyhdadj|AR|4790350767 +Kbhgahd|Jthdadj|AR|4794346704 +Jdsgahd|Hdhdadj|AR|4792556755 +Ibhgahd|Dthdadj|AR|4794354778 +Kcmgahd|Jxhdadj|AR|4799350704 +Jdzgahd|Ighdadj|AR|4792326755 +Icjgahd|Dphdadj|AR|4796356778 +Kcpgahd|Kkhdadj|AR|4792253704 +Kadgahd|Iyhdadj|AR|4790306704 +Iclgahd|Ebhdadj|AR|4795018778 +Kdtgahd|Knhdadj|AR|4792657766 +Kbegahd|Ixhdadj|AR|4791316704 +Icmgahd|Exhdadj|AR|4799359778 +Kdxgahd|Lehdadj|AR|4792306166 +Kbfgahd|Jwhdadj|AR|4792326704 +Idygahd|Gfhdadj|AR|4792316719 +Kdygahd|Lfhdadj|AR|4792316266 +Kbigahd|Jshdadj|AR|4795356704 +Idzgahd|Gghdadj|AR|4792326729 +Lbfgahd|Lwhdadj|AR|4792322766 +Kcjgahd|Jphdadj|AR|4796376704 +Jbggahd|Guhdadj|AR|4793356701 +Lbigahd|Lshdadj|AR|4795355729 +Kclgahd|Jbhdadj|AR|4795016704 +Jbhgahd|Gthdadj|AR|4794356701 +Lckgahd|Mihdadj|AR|4797387729 +Kcqgahd|Kmhdadj|AR|4792354766 +Jcjgahd|Gphdadj|AR|4796356701 +Lcmgahd|Mxhdadj|AR|4799359729 +Kcrgahd|Kbhdadj|AR|4792455766 +Jcmgahd|Hxhdadj|AR|4799356701 +Lcqgahd|Mmhdadj|AR|4792354329 +Kdsgahd|Kdhdadj|AR|4792556766 +Jcngahd|Hghdadj|AR|4792056755 +Ldxgahd|Nehdadj|AR|4792306109 +Kdugahd|Kbhdadj|AR|4792754796 +Jdtgahd|Inhdadj|AR|4792656755 +Ldzgahd|Nghdadj|AR|4792326329 +Kdzgahd|Lghdadj|AR|4792326366 +Jdvgahd|Ichdadj|AR|4792479755 +Mbegahd|Nxhdadj|AR|4791311719 +Lbegahd|Lxhdadj|AR|4791311766 +Jdwgahd|Idhdadj|AR|4792956755 +Mbigahd|Nshdadj|AR|4795355759 +Ldsgahd|Mdhdadj|AR|4792556529 +Kckgahd|Jihdadj|AR|4797386704 +Mckgahd|Nihdadj|AR|4797387779 +Ldvgahd|Nchdadj|AR|4792859829 +Kcngahd|Jghdadj|AR|4792051704 +Mcngahd|Oghdadj|AR|4792047980 +Ldwgahd|Ndhdadj|AR|4792956929 +Kcogahd|Kahdadj|AR|4792152704 +Mcogahd|Oahdadj|AR|4792152181 +Ldygahd|Nfhdadj|AR|4792316219 +Kdvgahd|Kchdadj|AR|4792859766 +Mdtgahd|Onhdadj|AR|4792657686 +Mbfgahd|Nwhdadj|AR|4792322729 +Kdwgahd|Ldhdadj|AR|4792956066 +Mdugahd|Obhdadj|AR|4792758787 +Mclgahd|Obhdadj|AR|4795018789 +Ladgahd|Lyhdadj|AR|4790300766 +Mdvgahd|Ochdadj|AR|4792859888 +Mcmgahd|Oxhdadj|AR|4799359799 +Lbggahd|Luhdadj|AR|4793333729 +Nbegahd|Pxhdadj|AR|4791311719 +Mcqgahd|Omhdadj|AR|4792354383 +Lbhgahd|Lthdadj|AR|4794344729 +Nbigahd|Pshdadj|AR|4795355759 +Mcrgahd|Obhdadj|AR|4792455484 +Lcjgahd|Lphdadj|AR|4796376729 +Nclgahd|Qbhdadj|AR|4795018789 +Mdxgahd|Pehdadj|AR|4790306109 +Lclgahd|Mbhdadj|AR|4795018729 +Ncngahd|Qghdadj|AR|4792047980 +Ncjgahd|Pphdadj|AR|4796376769 +Lcngahd|Mghdadj|AR|4792047929 +Ncqgahd|Qmhdadj|AR|4792354383 +Nckgahd|Pihdadj|AR|4797387779 +Lcogahd|Mahdadj|AR|4792152129 +Ndsgahd|Qdhdadj|AR|4792556585 +Ncrgahd|Qbhdadj|AR|4792455484 +Lcpgahd|Mkhdadj|AR|4792253229 +Ndxgahd|Rehdadj|AR|4790306109 +Ndtgahd|Qnhdadj|AR|4792657686 +Lcrgahd|Mbhdadj|AR|4792455429 +Obhgahd|Rthdadj|AR|5014356776 +Ndugahd|Qbhdadj|AR|4792758787 +Ldtgahd|Mnhdadj|AR|4792657629 +Ocpgahd|Skhdadj|AR|5012256776 +Ndvgahd|Qchdadj|AR|4792859888 +Ldugahd|Mbhdadj|AR|4792758729 +Ocrgahd|Sbhdadj|AR|5012456776 +Ndygahd|Rfhdadj|AR|4791316219 +Madgahd|Nyhdadj|AR|4790300709 +Odsgahd|Sdhdadj|AR|5012556776 +Ndzgahd|Rghdadj|AR|4792326329 +Mbggahd|Nuhdadj|AR|4793333739 +Odvgahd|Tchdadj|AR|5012479776 +Obggahd|Ruhdadj|AR|5013356776 +Mbhgahd|Nthdadj|AR|4794344749 +Odxgahd|Tehdadj|AR|5012306767 +Obigahd|Rshdadj|AR|5015356776 +Mcjgahd|Nphdadj|AR|4796376769 +Odygahd|Tfhdadj|AR|5012316767 +Oclgahd|Sbhdadj|AR|5015016776 +Mcpgahd|Okhdadj|AR|4792253282 +Odzgahd|Tghdadj|AR|5012326767 +Ocmgahd|Sxhdadj|AR|5019356776 +Mdsgahd|Odhdadj|AR|4792556585 +Pbegahd|Txhdadj|AR|5011351767 +Ocogahd|Sahdadj|AR|5012156776 +Mdwgahd|Pdhdadj|AR|4792956989 +Pbigahd|Tshdadj|AR|5015355767 +Ocqgahd|Smhdadj|AR|5012356776 +Mdygahd|Pfhdadj|AR|4791316219 +Pclgahd|Ubhdadj|AR|5015014797 +Odugahd|Tbhdadj|AR|5012756776 +Mdzgahd|Pghdadj|AR|4792326329 +Pcmgahd|Uxhdadj|AR|5019359767 +Padgahd|Tyhdadj|AR|5010350767 +Nadgahd|Pyhdadj|AR|4790300709 +Pcpgahd|Ukhdadj|AR|5012256267 +Pbfgahd|Twhdadj|AR|5012352767 +Nbfgahd|Pwhdadj|AR|4792322729 +Pdsgahd|Udhdadj|AR|5012555010 +Pbggahd|Tuhdadj|AR|5013353767 +Nbggahd|Puhdadj|AR|4793333739 +Pdwgahd|Udhdadj|AR|5012956900 +Pcjgahd|Uphdadj|AR|5016356767 +Nbhgahd|Pthdadj|AR|4794344749 +Pdzgahd|Vghdadj|AR|5012326729 +Pckgahd|Uihdadj|AR|5017357767 +Ncmgahd|Qxhdadj|AR|4799359799 +Radgahd|Vyhdadj|AR|5010356700 +Pcngahd|Ughdadj|AR|5012056067 +Ncogahd|Qahdadj|AR|4792152181 +Rbhgahd|Vthdadj|AR|5014356700 +Pdugahd|Ubhdadj|AR|5012756700 +Ncpgahd|Qkhdadj|AR|4792253282 +Rcngahd|Wghdadj|AR|5012056700 +Pdxgahd|Vehdadj|AR|5012306709 +Ndwgahd|Qdhdadj|AR|4792956989 +Rcpgahd|Wkhdadj|AR|5012256706 +Pdygahd|Vfhdadj|AR|5012316719 +Oadgahd|Ryhdadj|AR|5010356776 +Rcrgahd|Wbhdadj|AR|5012456706 +Rbggahd|Vuhdadj|AR|5013356700 +Obegahd|Rxhdadj|AR|5011356776 +Rdugahd|Wbhdadj|AR|5012756706 +Rbigahd|Vshdadj|AR|5015356700 +Obfgahd|Rwhdadj|AR|5012356776 +Rdvgahd|Wchdadj|AR|5012479706 +Rcjgahd|Vphdadj|AR|5016356700 +Ocjgahd|Sphdadj|AR|5016356776 +Rdxgahd|Wehdadj|AR|5012306706 +Sbfgahd|Xwhdadj|AR|5012326706 +Ockgahd|Sihdadj|AR|5017356776 +Rdygahd|Wfhdadj|AR|5012316706 +Sbggahd|Xuhdadj|AR|5013336706 +Ocngahd|Sghdadj|AR|5012056776 +Rdzgahd|Wghdadj|AR|5012326706 +Sbigahd|Xshdadj|AR|5015356740 +Odtgahd|Snhdadj|AR|5012656776 +Sadgahd|Xyhdadj|AR|5010306706 +Scngahd|Xghdadj|AR|5012051740 +Odwgahd|Tdhdadj|AR|5012956776 +Sbegahd|Xxhdadj|AR|5011316706 +Scpgahd|Ykhdadj|AR|5012253740 +Pbhgahd|Tthdadj|AR|5014354767 +Sbhgahd|Xthdadj|AR|5014346706 +Scqgahd|Ymhdadj|AR|5012354740 +Pcogahd|Uahdadj|AR|5012156167 +Sckgahd|Xihdadj|AR|5017386740 +Sdzgahd|Yghdadj|AR|5012326333 +Pcqgahd|Umhdadj|AR|5012356367 +Sclgahd|Xbhdadj|AR|5015016740 +Ubggahd|Zuhdadj|AR|5013333733 +Pcrgahd|Ubhdadj|AR|5012456467 +Scogahd|Yahdadj|AR|5012152740 +Ubhgahd|Zthdadj|AR|5014344733 +Pdtgahd|Unhdadj|AR|5012656600 +Sdsgahd|Ydhdadj|AR|5012556740 +Uckgahd|Zihdadj|AR|5017387733 +Pdvgahd|Uchdadj|AR|5012479800 +Sdvgahd|Ychdadj|AR|5012859740 +Ucngahd|Aghdadj|AR|5012047933 +Rbegahd|Vxhdadj|AR|5011356700 +Sdwgahd|Ydhdadj|AR|5012956040 +Ucogahd|Aahdadj|AR|5012152133 +Rbfgahd|Vwhdadj|AR|5012356700 +Sdxgahd|Yehdadj|AR|5012306140 +Ucrgahd|Abhdadj|AR|5012455433 +Rckgahd|Vihdadj|AR|5017356700 +Ubfgahd|Zwhdadj|AR|5012322733 +Udsgahd|Adhdadj|AR|5012556533 +Rclgahd|Wbhdadj|AR|5015016700 +Ucjgahd|Zphdadj|AR|5016376733 +Udwgahd|Adhdadj|AR|5012956933 +Rcmgahd|Wxhdadj|AR|5019356700 +Ucpgahd|Akhdadj|AR|5012253233 +Udzgahd|Bghdadj|AR|5012326329 +Rcogahd|Wahdadj|AR|5012156700 +Udvgahd|Achdadj|AR|5012859833 +Vbfgahd|Bwhdadj|AR|5012322729 +Rcqgahd|Wmhdadj|AR|5012356706 +Udygahd|Bfhdadj|AR|5012316219 +Vcjgahd|Bphdadj|AR|5016376769 +Rdsgahd|Wdhdadj|AR|5012556706 +Vadgahd|Byhdadj|AR|5010300709 +Vcmgahd|Cxhdadj|AR|5019359799 +Rdtgahd|Wnhdadj|AR|5012656706 +Vbegahd|Bxhdadj|AR|5011311719 +Vcpgahd|Ckhdadj|AR|5012253282 +Rdwgahd|Wdhdadj|AR|5012956706 +Vbhgahd|Bthdadj|AR|5014344749 +Vdxgahd|Cehdadj|AR|5010306109 +Scjgahd|Xphdadj|AR|5016376740 +Vbigahd|Bshdadj|AR|5015355759 +Vdygahd|Cfhdadj|AR|5011316219 +Scmgahd|Xxhdadj|AR|5019350740 +Vckgahd|Bihdadj|AR|5017387779 +Vdzgahd|Cghdadj|AR|5012326329 +Scrgahd|Ybhdadj|AR|5012455740 +Vclgahd|Bbhdadj|AR|5015018789 +Wadgahd|Dyhdadj|AR|5010300709 +Sdtgahd|Ynhdadj|AR|5012657740 +Vcqgahd|Cmhdadj|AR|5012354383 +Wbggahd|Duhdadj|AR|5013333739 +Sdugahd|Ybhdadj|AR|5012758740 +Vdugahd|Cbhdadj|AR|5012758787 +Wcjgahd|Dphdadj|AR|5016376769 +Sdygahd|Yfhdadj|AR|5012316233 +Vdvgahd|Cchdadj|AR|5012859888 +Wcmgahd|Dxhdadj|AR|5019359799 +Uadgahd|Zyhdadj|AR|5010300733 +Vdwgahd|Cdhdadj|AR|5012956989 +Wdvgahd|Echdadj|AR|5012859888 +Ubegahd|Zxhdadj|AR|5011311733 +Wbfgahd|Dwhdadj|AR|5012322729 +Wdygahd|Efhdadj|AR|5011316219 +Ubigahd|Zshdadj|AR|5015355733 +Wbhgahd|Dthdadj|AR|5014344749 +Xbegahd|Exhdadj|AR|4791356790 +Uclgahd|Zbhdadj|AR|5015018733 +Wcogahd|Dahdadj|AR|5012152181 +Xbfgahd|Ewhdadj|AR|4792356790 +Ucmgahd|Axhdadj|AR|5019359733 +Wcpgahd|Dkhdadj|AR|5012253282 +Xbggahd|Euhdadj|AR|4793356790 +Ucqgahd|Amhdadj|AR|5012354333 +Wcqgahd|Emhdadj|AR|5012354383 +Xbhgahd|Ethdadj|AR|4794356790 +Udtgahd|Anhdadj|AR|5012657633 +Wdugahd|Ebhdadj|AR|5012758787 +Xcjgahd|Ephdadj|AR|4796356790 +Udugahd|Abhdadj|AR|5012758733 +Wdxgahd|Eehdadj|AR|5010306109 +Xcngahd|Fghdadj|AR|4792056790 +Udxgahd|Aehdadj|AR|5012306109 +Xbigahd|Eshdadj|AR|4795356790 +Xdsgahd|Fdhdadj|AR|4792556779 +Vbggahd|Buhdadj|AR|5013333739 +Xckgahd|Eihdadj|AR|4797356790 +Xdugahd|Fbhdadj|AR|4792756779 +Vcngahd|Cghdadj|AR|5012047980 +Xcmgahd|Fxhdadj|AR|4799356790 +Xdygahd|Ffhdadj|AR|4792316779 +Vcogahd|Cahdadj|AR|5012152181 +Xcpgahd|Fkhdadj|AR|4792256779 +Yadgahd|Gyhdadj|AR|4790350779 +Vcrgahd|Cbhdadj|AR|5012455484 +Xdvgahd|Fchdadj|AR|4792479779 +Ybegahd|Gxhdadj|AR|4791351779 +Vdsgahd|Cdhdadj|AR|5012556585 +Xdwgahd|Fdhdadj|AR|4792956779 +Ybfgahd|Gwhdadj|AR|4792352779 +Vdtgahd|Cnhdadj|AR|5012657686 +Xdxgahd|Fehdadj|AR|4792306779 +Ybhgahd|Gthdadj|AR|4794354779 +Wbegahd|Dxhdadj|AR|5011311719 +Ybigahd|Gshdadj|AR|4795355779 +Ycjgahd|Gphdadj|AR|4796356779 +Wbigahd|Dshdadj|AR|5015355759 +Yckgahd|Gihdadj|AR|4797357779 +Yclgahd|Gbhdadj|AR|4795018744 +Wckgahd|Dihdadj|AR|5017387779 +Ycogahd|Gahdadj|AR|4792156144 +Ycpgahd|Gkhdadj|AR|4792256244 +Wclgahd|Dbhdadj|AR|5015018789 +Ycqgahd|Gmhdadj|AR|4792356344 +Ydtgahd|Hnhdadj|AR|4792656644 +Wcngahd|Dghdadj|AR|5012047980 +Ydsgahd|Hdhdadj|AR|4792556544 +Ydwgahd|Hdhdadj|AR|4792956944 +Wcrgahd|Ebhdadj|AR|5012455484 +Ydvgahd|Hchdadj|AR|4792479844 +Ydxgahd|Hehdadj|AR|4792306709 +Wdsgahd|Edhdadj|AR|5012556585 +Zbegahd|Hxhdadj|AR|4791356744 +Ydygahd|Hfhdadj|AR|4792316719 +Wdtgahd|Enhdadj|AR|5012657686 +Zcogahd|Iahdadj|AR|4792156766 +Ydzgahd|Hghdadj|AR|4792326729 +Wdwgahd|Edhdadj|AR|5012956989 +Zcpgahd|Ikhdadj|AR|4792256766 +Zadgahd|Hyhdadj|AR|4790356744 +Wdzgahd|Eghdadj|AR|5012326329 +Zdwgahd|Jdhdadj|AR|4792956751 +Zbfgahd|Hwhdadj|AR|4792356744 +Xadgahd|Eyhdadj|AR|4790356790 +Zdygahd|Jfhdadj|AR|4792316751 +Zbhgahd|Hthdadj|AR|4794356766 +Xclgahd|Fbhdadj|AR|4795016790 +Kefgahd|Jwhdadj|AR|4792326751 +Zcjgahd|Iphdadj|AR|4796356766 +Xcogahd|Fahdadj|AR|4792156790 +Keigahd|Jshdadj|AR|4795356751 +Zcmgahd|Ixhdadj|AR|4799356766 +Xcqgahd|Fmhdadj|AR|4792356779 +Kemgahd|Kxhdadj|AR|4799350751 +Zdvgahd|Jchdadj|AR|4792479751 +Xcrgahd|Fbhdadj|AR|4792456779 +Kengahd|Kghdadj|AR|4792051751 +Kedgahd|Jyhdadj|AR|4790306751 +Xdtgahd|Fnhdadj|AR|4792656779 +Kepgahd|Kkhdadj|AR|4792253751 +Keegahd|Jxhdadj|AR|4791316751 +Xdzgahd|Fghdadj|AR|4792326779 +Kesgahd|Kdhdadj|AR|4792556762 +Kehgahd|Jthdadj|AR|4794346751 +Ybggahd|Guhdadj|AR|4793353779 +Kewgahd|Kdhdadj|AR|4792956062 +Kelgahd|Jbhdadj|AR|4795016751 +Ycmgahd|Gxhdadj|AR|4799359744 +Kexgahd|Kehdadj|AR|4792306162 +Keqgahd|Kmhdadj|AR|4792354762 +Ycngahd|Gghdadj|AR|4792056044 +Lidgahd|Lyhdadj|AR|4790300762 +Ketgahd|Knhdadj|AR|4792657762 +Ycrgahd|Gbhdadj|AR|4792456444 +Liegahd|Lxhdadj|AR|4791311762 +Kezgahd|Kghdadj|AR|4792326362 +Ydugahd|Hbhdadj|AR|4792756744 +Liigahd|Lshdadj|AR|4795355762 +Liggahd|Luhdadj|AR|4793333762 +Zbggahd|Huhdadj|AR|4793356766 +Lijgahd|Lphdadj|AR|4796376762 +Likgahd|Lihdadj|AR|4797387762 +Zbigahd|Ishdadj|AR|4795356766 +Liqgahd|Lmhdadj|AR|4792354388 +Lilgahd|Lbhdadj|AR|4795014792 +Zckgahd|Iihdadj|AR|4797356766 +Lirgahd|Mbhdadj|AR|4792455488 +Lipgahd|Lkhdadj|AR|4792253288 +Zclgahd|Ibhdadj|AR|4795016766 +Litgahd|Mnhdadj|AR|4792657688 +Liygahd|Mfhdadj|AR|4792316219 +Zcngahd|Ighdadj|AR|4792056766 +Liugahd|Mbhdadj|AR|4792758788 +Moegahd|Mxhdadj|AR|4791311719 +Zcqgahd|Imhdadj|AR|4792356766 +Lizgahd|Mghdadj|AR|4792326329 +Moggahd|Muhdadj|AR|4793333739 +Zcrgahd|Ibhdadj|AR|4792456766 +Modgahd|Myhdadj|AR|4790300709 +Mohgahd|Mthdadj|AR|4794344749 +Zdsgahd|Idhdadj|AR|4792556766 +Mongahd|Nghdadj|AR|4792047980 +Momgahd|Nxhdadj|AR|4799359799 +Zdtgahd|Inhdadj|AR|4792656766 +Mopgahd|Nkhdadj|AR|4792253282 +Moqgahd|Nmhdadj|AR|4792354383 +Zdugahd|Ibhdadj|AR|4792756766 +Mosgahd|Ndhdadj|AR|4792556585 +Motgahd|Nnhdadj|AR|4792657686 +Zdxgahd|Jehdadj|AR|4792306751 +Mowgahd|Ndhdadj|AR|4792956989 +Movgahd|Nchdadj|AR|4792859888 +Zdzgahd|Jghdadj|AR|4792326751 +Nudgahd|Oyhdadj|AR|4790300709 +Mozgahd|Oghdadj|AR|4792326329 +Keggahd|Juhdadj|AR|4793336751 +Nujgahd|Ophdadj|AR|4796376769 +Nufgahd|Owhdadj|AR|4792322729 +Kejgahd|Jphdadj|AR|4796376751 +Numgahd|Pxhdadj|AR|4799359799 +Nuggahd|Ouhdadj|AR|4793333739 +Kekgahd|Jihdadj|AR|4797386751 +Nungahd|Pghdadj|AR|4792047980 +Nuhgahd|Othdadj|AR|4794344749 +Keogahd|Kahdadj|AR|4792152751 +Nuogahd|Pahdadj|AR|4792152181 +Nukgahd|Oihdadj|AR|4797387779 +Kergahd|Kbhdadj|AR|4792455762 +Nuqgahd|Pmhdadj|AR|4792354383 +Nulgahd|Pbhdadj|AR|4795018789 +Keugahd|Kbhdadj|AR|4792754792 +Nurgahd|Pbhdadj|AR|4792455484 +Nuxgahd|Qehdadj|AR|4790306109 +Kevgahd|Kchdadj|AR|4792859762 +Nutgahd|Pnhdadj|AR|4792657686 +Nuygahd|Qfhdadj|AR|4791316219 +Keygahd|Kfhdadj|AR|4792316262 +Nuugahd|Pbhdadj|AR|4792758787 +Badgahd|Eyhdadj|AR|5010350711 +Lifgahd|Lwhdadj|AR|4792322762 +Nuzgahd|Qghdadj|AR|4792326329 +Bbfgahd|Ewhdadj|AR|5012352711 +Lihgahd|Lthdadj|AR|4794344762 +Aadgahd|Ayhdadj|AR|5010356710 +Bcjgahd|Fphdadj|AR|5016356711 +Limgahd|Lxhdadj|AR|4799359762 +Abhgahd|Athdadj|AR|5014356710 +Bclgahd|Fbhdadj|AR|5015018700 +Lingahd|Lghdadj|AR|4792047988 +Ackgahd|Bihdadj|AR|5017356710 +Bcogahd|Fahdadj|AR|5012156100 +Liogahd|Lahdadj|AR|4792152188 +Aclgahd|Bbhdadj|AR|5015016710 +Bcqgahd|Gmhdadj|AR|5012356300 +Lisgahd|Mdhdadj|AR|4792556588 +Acmgahd|Bxhdadj|AR|5019356701 +Bcrgahd|Gbhdadj|AR|5012456400 +Livgahd|Mchdadj|AR|4792859888 +Acpgahd|Bkhdadj|AR|5012256701 +Bdvgahd|Gchdadj|AR|5012479800 +Liwgahd|Mdhdadj|AR|4792956988 +Adtgahd|Cnhdadj|AR|5012656701 +Cadgahd|Iyhdadj|AR|5010356712 +Lixgahd|Mehdadj|AR|4792306109 +Advgahd|Dchdadj|AR|5012479701 +Cbegahd|Ixhdadj|AR|5012656712 +Mofgahd|Mwhdadj|AR|4792322729 +Adxgahd|Dehdadj|AR|5012306711 +Cbhgahd|Ithdadj|AR|5014356712 +Moigahd|Mshdadj|AR|4795355759 +Adygahd|Dfhdadj|AR|5012316711 +Ccmgahd|Jxhdadj|AR|5019356721 +Mojgahd|Nphdadj|AR|4796376769 +Bbegahd|Axhdadj|AR|5012651711 +Ccogahd|Jahdadj|AR|5012156721 +Mokgahd|Nihdadj|AR|4797387779 +Bckgahd|Fihdadj|AR|5017357700 +Ccpgahd|Kkhdadj|AR|5012256721 +Molgahd|Nbhdadj|AR|4795018789 +Bcmgahd|Fxhdadj|AR|5019359700 +Ccqgahd|Kmhdadj|AR|5012356721 +Moogahd|Nahdadj|AR|4792152181 +Bcpgahd|Gkhdadj|AR|5012256200 +Cdwgahd|Ldhdadj|AR|5012956721 +Morgahd|Nbhdadj|AR|4792455484 +Bdsgahd|Gdhdadj|AR|5012555010 +Cdzgahd|Lghdadj|AR|5012326722 +Mougahd|Nbhdadj|AR|4792758787 +Bdugahd|Gbhdadj|AR|5012756700 +Dbggahd|Muhdadj|AR|5013336722 +Moxgahd|Nehdadj|AR|4790306109 +Bdwgahd|Hdhdadj|AR|5012956900 +Dckgahd|Nihdadj|AR|5017386722 +Moygahd|Ofhdadj|AR|4791316219 +Bdzgahd|Hghdadj|AR|5012326729 +Dcogahd|Nahdadj|AR|5012152732 +Nuegahd|Oxhdadj|AR|4791311719 +Cbigahd|Ishdadj|AR|5015356712 +Dcrgahd|Obhdadj|AR|5012455732 +Nuigahd|Oshdadj|AR|4795355759 +Ccjgahd|Jphdadj|AR|5016356712 +Ddsgahd|Odhdadj|AR|5012556732 +Nupgahd|Pkhdadj|AR|4792253282 +Cckgahd|Jihdadj|AR|5017356712 +Ddtgahd|Onhdadj|AR|5012657732 +Nusgahd|Pdhdadj|AR|4792556585 +Cclgahd|Jbhdadj|AR|5015016721 +Ddugahd|Obhdadj|AR|5012758732 +Nuvgahd|Pchdadj|AR|4792859888 +Ccrgahd|Kbhdadj|AR|5012456721 +Eadgahd|Ryhdadj|AR|5010300745 +Nuwgahd|Pdhdadj|AR|4792956989 +Cdsgahd|Kdhdadj|AR|5012556721 +Ebegahd|Rxhdadj|AR|5012611745 +Abegahd|Axhdadj|AR|5012656710 +Cdxgahd|Lehdadj|AR|5012306721 +Ebfgahd|Rwhdadj|AR|5012322745 +Abfgahd|Awhdadj|AR|5012356710 +Dbhgahd|Mthdadj|AR|5014346722 +Ebhgahd|Rthdadj|AR|5014344745 +Abggahd|Auhdadj|AR|5013356710 +Dbigahd|Nshdadj|AR|5015356722 +Eckgahd|Sihdadj|AR|5017387745 +Abigahd|Ashdadj|AR|5015356710 +Dclgahd|Nbhdadj|AR|5015016732 +Ecmgahd|Sxhdadj|AR|5019359745 +Acjgahd|Bphdadj|AR|5016356710 +Dcqgahd|Omhdadj|AR|5012354732 +Ecogahd|Tahdadj|AR|5012152145 +Acngahd|Bghdadj|AR|5012056701 +Ddvgahd|Ochdadj|AR|5012859732 +Ecrgahd|Tbhdadj|AR|5012455445 +Acogahd|Bahdadj|AR|5012156701 +Ddwgahd|Odhdadj|AR|5012956045 +Edugahd|Ubhdadj|AR|5012758709 +Acqgahd|Cmhdadj|AR|5012356701 +Ebigahd|Sshdadj|AR|5015355745 +Edvgahd|Uchdadj|AR|5012859809 +Acrgahd|Cbhdadj|AR|5012456701 +Ecjgahd|Sphdadj|AR|5016376745 +Edzgahd|Vghdadj|AR|5012326329 +Adsgahd|Cdhdadj|AR|5012556701 +Eclgahd|Sbhdadj|AR|5015018745 +Fadgahd|Vyhdadj|AR|5010300709 +Adugahd|Cbhdadj|AR|5012756701 +Ecngahd|Sghdadj|AR|5012031045 +Fbigahd|Wshdadj|AR|5015355759 +Adwgahd|Ddhdadj|AR|5012956711 +Edwgahd|Udhdadj|AR|5012956909 +Fcjgahd|Wphdadj|AR|5016376769 +Adzgahd|Dghdadj|AR|5012326711 +Edygahd|Vfhdadj|AR|5012316219 +Fclgahd|Wbhdadj|AR|5015018789 +Bbggahd|Euhdadj|AR|5013353711 +Fbfgahd|Vwhdadj|AR|5012322729 +Fcngahd|Wghdadj|AR|5012031080 +Bbhgahd|Ethdadj|AR|5014354711 +Fcmgahd|Wxhdadj|AR|5019359799 +Fcpgahd|Wkhdadj|AR|5012253282 +Bbigahd|Eshdadj|AR|5015355711 +Fcqgahd|Xmhdadj|AR|5012354383 +Fdtgahd|Xnhdadj|AR|5012657686 +Bcngahd|Fghdadj|AR|5012056000 +Fcrgahd|Xbhdadj|AR|5012455484 +Fdygahd|Yfhdadj|AR|5012616219 +Bdtgahd|Gnhdadj|AR|5012656600 +Fdzgahd|Yghdadj|AR|5012326329 +Gbigahd|Zshdadj|AR|4795355759 +Bdxgahd|Hehdadj|AR|5012306709 +Gadgahd|Yyhdadj|AR|4790300709 +Gckgahd|Zihdadj|AR|4797387779 +Bdygahd|Hfhdadj|AR|5012316719 +Gbegahd|Yxhdadj|AR|4792611719 +Gcmgahd|Zxhdadj|AR|4799359799 +Cbfgahd|Iwhdadj|AR|5012356712 +Gbggahd|Yuhdadj|AR|4793333739 +Gcogahd|Zahdadj|AR|4792152181 +Cbggahd|Iuhdadj|AR|5013356712 +Gcjgahd|Zphdadj|AR|4796376769 +Gcpgahd|Zkhdadj|AR|4792253282 +Ccngahd|Jghdadj|AR|5012056721 +Gcngahd|Zghdadj|AR|4792031080 +Gdtgahd|Anhdadj|AR|4792657686 +Cdtgahd|Knhdadj|AR|5012656721 +Gdsgahd|Adhdadj|AR|4792556585 +Gdugahd|Abhdadj|AR|4792758787 +Cdugahd|Kbhdadj|AR|5012756721 +Gdzgahd|Aghdadj|AR|4792326329 +Gdwgahd|Adhdadj|AR|4792956989 +Cdvgahd|Lchdadj|AR|5012479721 +Hbggahd|Buhdadj|AR|4793356799 +Gdxgahd|Aehdadj|AR|4790306109 +Cdygahd|Lfhdadj|AR|5012316722 +Hbhgahd|Bthdadj|AR|4794356799 +Hadgahd|Byhdadj|AR|4790356799 +Dadgahd|Myhdadj|AR|5010306722 +Hcmgahd|Bxhdadj|AR|4799356799 +Hbigahd|Bshdadj|AR|4795356799 +Dbegahd|Mxhdadj|AR|5012616722 +Hcogahd|Bahdadj|AR|4792156799 +Hcjgahd|Bphdadj|AR|4796356799 +Dbfgahd|Mwhdadj|AR|5012326722 +Hcqgahd|Cmhdadj|AR|4792356767 +Hckgahd|Bihdadj|AR|4797356799 +Dcjgahd|Nphdadj|AR|5016376722 +Hcrgahd|Cbhdadj|AR|4792456767 +Hclgahd|Bbhdadj|AR|4795016799 +Dcmgahd|Nxhdadj|AR|5019350732 +Hdvgahd|Cchdadj|AR|4792479767 +Hcngahd|Bghdadj|AR|4792056799 +Dcngahd|Nghdadj|AR|5012051732 +Hdwgahd|Cdhdadj|AR|4792956767 +Hcpgahd|Ckhdadj|AR|4792256767 +Dcpgahd|Nkhdadj|AR|5012253732 +Hdxgahd|Cehdadj|AR|4792306767 +Hdsgahd|Cdhdadj|AR|4792556767 +Ddxgahd|Pehdadj|AR|5012306145 +Hdygahd|Dfhdadj|AR|4792316767 +Hdtgahd|Cnhdadj|AR|4792656767 +Ddygahd|Pfhdadj|AR|5012316245 +Ibggahd|Duhdadj|AR|4793353778 +Hdzgahd|Dghdadj|AR|4792326767 +Ddzgahd|Pghdadj|AR|5012326345 +Ickgahd|Eihdadj|AR|4797357778 +Ibegahd|Dxhdadj|AR|4791351778 +Ebggahd|Ruhdadj|AR|5013333745 +Icogahd|Eahdadj|AR|4792156178 +Ibfgahd|Dwhdadj|AR|4792352778 +Ecpgahd|Tkhdadj|AR|5012253245 +Icrgahd|Fbhdadj|AR|4792456456 +Ibigahd|Dshdadj|AR|4795355778 +Ecqgahd|Tmhdadj|AR|5012354345 +Idsgahd|Fdhdadj|AR|4792556556 +Icngahd|Eghdadj|AR|4792056078 +Edsgahd|Tdhdadj|AR|5012555019 +Idtgahd|Fnhdadj|AR|4792656656 +Icpgahd|Ekhdadj|AR|4792256278 +Edtgahd|Unhdadj|AR|5012657609 +Idvgahd|Fchdadj|AR|4792479479 +Icqgahd|Emhdadj|AR|4792356356 +Edxgahd|Uehdadj|AR|5012306109 +Idwgahd|Fdhdadj|AR|4792956956 +Idugahd|Fbhdadj|AR|4792756756 +Fbegahd|Vxhdadj|AR|5012611719 +Idxgahd|Fehdadj|AR|4792306709 +Jadgahd|Gyhdadj|AR|4790356701 +Fbggahd|Vuhdadj|AR|5013333739 +Jcogahd|Hahdadj|AR|4792156755 +Jbegahd|Gxhdadj|AR|4791356701 +Fbhgahd|Vthdadj|AR|5014344749 +Jcpgahd|Hkhdadj|AR|4792256755 +Jbfgahd|Gwhdadj|AR|4792356701 +Fckgahd|Wihdadj|AR|5017387779 +Jcqgahd|Hmhdadj|AR|8702356755 +Jbigahd|Gshdadj|AR|4795356701 +Fcogahd|Wahdadj|AR|5012152181 +Jdugahd|Ibhdadj|AR|8702756755 +Jckgahd|Hihdadj|AR|4797356701 +Fdsgahd|Xdhdadj|AR|5012556585 +Jdxgahd|Iehdadj|AR|8702306755 +Jclgahd|Hbhdadj|AR|4795016701 +Fdugahd|Xbhdadj|AR|5012758787 +Jdygahd|Ifhdadj|AR|8702316755 +Jcrgahd|Hbhdadj|AR|8702456755 +Fdvgahd|Xchdadj|AR|5012859888 +Kbggahd|Juhdadj|AR|8703336704 +Jdsgahd|Hdhdadj|AR|8702556755 +Fdwgahd|Xdhdadj|AR|5012956989 +Kbhgahd|Jthdadj|AR|8704346704 +Jdzgahd|Ighdadj|AR|8702326755 +Fdxgahd|Xehdadj|AR|5010306109 +Kcmgahd|Jxhdadj|AR|8709350704 +Kadgahd|Iyhdadj|AR|8700306704 +Gbfgahd|Ywhdadj|AR|4792322729 +Kcpgahd|Kkhdadj|AR|8702253704 +Kbegahd|Ixhdadj|AR|8701316704 +Gbhgahd|Ythdadj|AR|4794344749 +Kdtgahd|Knhdadj|AR|8702657766 +Kbfgahd|Jwhdadj|AR|8702326704 +Gclgahd|Zbhdadj|AR|4794798789 +Kdxgahd|Lehdadj|AR|8702306166 +Kbigahd|Jshdadj|AR|8705356704 +Gcqgahd|Zmhdadj|AR|4792354383 +Kdygahd|Lfhdadj|AR|8702316266 +Kcjgahd|Jphdadj|AR|8706376704 +Gcrgahd|Zbhdadj|AR|4792455484 +Lbfgahd|Lwhdadj|AR|8702322766 +Kclgahd|Jbhdadj|AR|8708706704 +Gdvgahd|Achdadj|AR|4792859888 +Lbigahd|Lshdadj|AR|8705355729 +Kcqgahd|Kmhdadj|AR|8702354766 +Gdygahd|Afhdadj|AR|4792616219 +Lckgahd|Mihdadj|AR|8707387729 +Kcrgahd|Kbhdadj|AR|8702455766 +Hbegahd|Bxhdadj|AR|4791356799 +Lcmgahd|Mxhdadj|AR|8709359729 +Kdsgahd|Kdhdadj|AR|8702556766 +Hbfgahd|Bwhdadj|AR|4792356799 +Lcqgahd|Mmhdadj|AR|8702354329 +Kdugahd|Kbhdadj|AR|8702758706 +Hdugahd|Cbhdadj|AR|4792756767 +Ldxgahd|Nehdadj|AR|8702306109 +Kdzgahd|Lghdadj|AR|8702326366 +Iadgahd|Dyhdadj|AR|4790350767 +Ldzgahd|Nghdadj|AR|8702326329 +Lbegahd|Lxhdadj|AR|8701311766 +Ibhgahd|Dthdadj|AR|4794354778 +Mbegahd|Nxhdadj|AR|8701311719 +Ldsgahd|Mdhdadj|AR|8702556529 +Icjgahd|Dphdadj|AR|4796356778 +Mbigahd|Nshdadj|AR|8705355759 +Ldvgahd|Nchdadj|AR|8702859829 +Iclgahd|Ebhdadj|AR|4795018778 +Mckgahd|Nihdadj|AR|8707387779 +Ldwgahd|Ndhdadj|AR|8702956929 +Icmgahd|Exhdadj|AR|4799359778 +Mcngahd|Oghdadj|AR|8702031080 +Ldygahd|Nfhdadj|AR|8702316219 +Idygahd|Gfhdadj|AR|4792316719 +Mcogahd|Oahdadj|AR|8702152181 +Mbfgahd|Nwhdadj|AR|8702322729 +Idzgahd|Gghdadj|AR|4792326729 +Mdtgahd|Onhdadj|AR|8702657686 +Mclgahd|Obhdadj|AR|8708708789 +Jbggahd|Guhdadj|AR|4793356701 +Mdugahd|Obhdadj|AR|8702758787 +Mcmgahd|Oxhdadj|AR|8709359799 +Jbhgahd|Gthdadj|AR|4794356701 +Mdvgahd|Ochdadj|AR|8702859888 +Mcqgahd|Omhdadj|AR|8702354383 +Jcjgahd|Gphdadj|AR|4796356701 +Nbegahd|Pxhdadj|AR|8701311719 +Mcrgahd|Obhdadj|AR|8702455484 +Jcmgahd|Hxhdadj|AR|4799356701 +Nbigahd|Pshdadj|AR|8705355759 +Mdxgahd|Pehdadj|AR|8700306109 +Jcngahd|Hghdadj|AR|4792056755 +Nclgahd|Qbhdadj|AR|8708708789 +Ncjgahd|Pphdadj|AR|8706376769 +Jdtgahd|Inhdadj|AR|8702656755 +Ncngahd|Qghdadj|AR|8702031080 +Nckgahd|Pihdadj|AR|8707387779 +Jdvgahd|Ichdadj|AR|8702479755 +Ncqgahd|Qmhdadj|AR|8702354383 +Ncrgahd|Qbhdadj|AR|8702455484 +Jdwgahd|Idhdadj|AR|8702956755 +Ndsgahd|Qdhdadj|AR|8702556585 +Ndtgahd|Qnhdadj|AR|8702657686 +Kckgahd|Jihdadj|AR|8707386704 +Ndxgahd|Rehdadj|AR|8700306109 +Ndugahd|Qbhdadj|AR|8702758787 +Kcngahd|Jghdadj|AR|8702051704 +Obhgahd|Rthdadj|AR|8704356776 +Ndvgahd|Qchdadj|AR|8702859888 +Kcogahd|Kahdadj|AR|8702152704 +Ocpgahd|Skhdadj|AR|8702256776 +Ndygahd|Rfhdadj|AR|8701316219 +Kdvgahd|Kchdadj|AR|8702859766 +Ocrgahd|Sbhdadj|AR|8702456776 +Ndzgahd|Rghdadj|AR|8702326329 +Kdwgahd|Ldhdadj|AR|8702956066 +Odsgahd|Sdhdadj|AR|8702556776 +Obggahd|Ruhdadj|AR|8703356776 +Ladgahd|Lyhdadj|AR|8700300766 +Odvgahd|Tchdadj|AR|8702479776 +Obigahd|Rshdadj|AR|8705356776 +Lbggahd|Luhdadj|AR|8703333729 +Odxgahd|Tehdadj|AR|8702306767 +Oclgahd|Sbhdadj|AR|8705016776 +Lbhgahd|Lthdadj|AR|8704344729 +Odygahd|Tfhdadj|AR|8702316767 +Ocmgahd|Sxhdadj|AR|8709356776 +Lcjgahd|Lphdadj|AR|8706376729 +Odzgahd|Tghdadj|AR|8702326767 +Ocogahd|Sahdadj|AR|8702156776 +Lclgahd|Mbhdadj|AR|8708708729 +Pbegahd|Txhdadj|AR|8701351767 +Ocqgahd|Smhdadj|AR|8702356776 +Lcngahd|Mghdadj|AR|8702031029 +Pbigahd|Tshdadj|AR|8705355767 +Odugahd|Tbhdadj|AR|8702756776 +Lcogahd|Mahdadj|AR|8702152129 +Pclgahd|Ubhdadj|AR|8705018707 +Padgahd|Tyhdadj|AR|8700350767 +Lcpgahd|Mkhdadj|AR|8702253229 +Pcmgahd|Uxhdadj|AR|8709359767 +Pbfgahd|Twhdadj|AR|8702352767 +Lcrgahd|Mbhdadj|AR|8702455429 +Pcpgahd|Ukhdadj|AR|8702256267 +Pbggahd|Tuhdadj|AR|8703353767 +Ldtgahd|Mnhdadj|AR|8702657629 +Pdsgahd|Udhdadj|AR|8702558700 +Pcjgahd|Uphdadj|AR|8706356767 +Ldugahd|Mbhdadj|AR|8702758729 +Pdwgahd|Udhdadj|AR|8702956900 +Pckgahd|Uihdadj|AR|8707357767 +Madgahd|Nyhdadj|AR|8700300709 +Pdzgahd|Vghdadj|AR|8702326729 +Pcngahd|Ughdadj|AR|8702056067 +Mbggahd|Nuhdadj|AR|8703333739 +Radgahd|Vyhdadj|AR|8700356700 +Pdugahd|Ubhdadj|AR|8702756700 +Mbhgahd|Nthdadj|AR|8704344749 +Rbhgahd|Vthdadj|AR|8704356700 +Pdxgahd|Vehdadj|AR|8702306709 +Mcjgahd|Nphdadj|AR|8706376769 +Rcngahd|Wghdadj|AR|8702056700 +Pdygahd|Vfhdadj|AR|8702316719 +Mcpgahd|Okhdadj|AR|8702253282 +Rcpgahd|Wkhdadj|AR|8702256706 +Rbggahd|Vuhdadj|AR|8703356700 +Mdsgahd|Odhdadj|AR|8702556585 +Rcrgahd|Wbhdadj|AR|8702456706 +Rbigahd|Vshdadj|AR|8705356700 +Mdwgahd|Pdhdadj|AR|8702956989 +Rdugahd|Wbhdadj|AR|8702756706 +Rcjgahd|Vphdadj|AR|8706356700 +Mdygahd|Pfhdadj|AR|8701316219 +Rdvgahd|Wchdadj|AR|8702479706 +Sbfgahd|Xwhdadj|AR|8702326706 +Mdzgahd|Pghdadj|AR|8702326329 +Rdxgahd|Wehdadj|AR|8702306706 +Sbggahd|Xuhdadj|AR|8703336706 +Nadgahd|Pyhdadj|AR|8700300709 +Rdygahd|Wfhdadj|AR|8702316706 +Sbigahd|Xshdadj|AR|8705356740 +Nbfgahd|Pwhdadj|AR|8702322729 +Rdzgahd|Wghdadj|AR|8702326706 +Scngahd|Xghdadj|AR|8702051740 +Nbggahd|Puhdadj|AR|8703333739 +Sadgahd|Xyhdadj|AR|8700306706 +Scpgahd|Ykhdadj|AR|8702253740 +Nbhgahd|Pthdadj|AR|8704344749 +Sbegahd|Xxhdadj|AR|8701316706 +Scqgahd|Ymhdadj|AR|8702354740 +Ncmgahd|Qxhdadj|AR|8709359799 +Sbhgahd|Xthdadj|AR|8704346706 +Sdzgahd|Yghdadj|AR|8702326333 +Ncogahd|Qahdadj|AR|8702152181 +Sckgahd|Xihdadj|AR|8707386740 +Ubggahd|Zuhdadj|AR|8703333733 +Ncpgahd|Qkhdadj|AR|8702253282 +Sclgahd|Xbhdadj|AR|8708706740 +Ubhgahd|Zthdadj|AR|8704344733 +Ndwgahd|Qdhdadj|AR|8702956989 +Scogahd|Yahdadj|AR|8702152740 +Uckgahd|Zihdadj|AR|8707387733 +Oadgahd|Ryhdadj|AR|8700356776 +Sdsgahd|Ydhdadj|AR|8702556740 +Ucngahd|Aghdadj|AR|8702031033 +Obegahd|Rxhdadj|AR|8701356776 +Sdvgahd|Ychdadj|AR|8702859740 +Ucogahd|Aahdadj|AR|8702152133 +Obfgahd|Rwhdadj|AR|8702356776 +Sdwgahd|Ydhdadj|AR|8702956040 +Ucrgahd|Abhdadj|AR|8702455433 +Ocjgahd|Sphdadj|AR|8706356776 +Sdxgahd|Yehdadj|AR|8702306140 +Udsgahd|Adhdadj|AR|8702556533 +Ockgahd|Sihdadj|AR|8707356776 +Ubfgahd|Zwhdadj|AR|8702322733 +Udwgahd|Adhdadj|AR|8702956933 +Ocngahd|Sghdadj|AR|8702056776 +Ucjgahd|Zphdadj|AR|8706376733 +Udzgahd|Bghdadj|AR|8702326329 +Odtgahd|Snhdadj|AR|8702656776 +Ucpgahd|Akhdadj|AR|8702253233 +Vbfgahd|Bwhdadj|AR|8702322729 +Odwgahd|Tdhdadj|AR|8702956776 +Udvgahd|Achdadj|AR|8702859833 +Vcjgahd|Bphdadj|AR|8706376769 +Pbhgahd|Tthdadj|AR|8704354767 +Udygahd|Bfhdadj|AR|8702316219 +Vcmgahd|Cxhdadj|AR|8709359799 +Pcogahd|Uahdadj|AR|8702156167 +Vadgahd|Byhdadj|AR|8700300709 +Vcpgahd|Ckhdadj|AR|8702253282 +Pcqgahd|Umhdadj|AR|8702356367 +Vbegahd|Bxhdadj|AR|8701311719 +Vdxgahd|Cehdadj|AR|8700306109 +Pcrgahd|Ubhdadj|AR|8702456467 +Vbhgahd|Bthdadj|AR|8704344749 +Vdygahd|Cfhdadj|AR|8701316219 +Pdtgahd|Unhdadj|AR|8702656600 +Vbigahd|Bshdadj|AR|8705355759 +Vdzgahd|Cghdadj|AR|8702326329 +Pdvgahd|Uchdadj|AR|8702479800 +Vckgahd|Bihdadj|AR|8707387779 +Wadgahd|Dyhdadj|AR|8700300709 +Rbegahd|Vxhdadj|AR|8701356700 +Vclgahd|Bbhdadj|AR|8708708789 +Wbggahd|Duhdadj|AR|8703333739 +Rbfgahd|Vwhdadj|AR|8702356700 +Vcqgahd|Cmhdadj|AR|8702354383 +Wcjgahd|Dphdadj|AR|8706376769 +Rckgahd|Vihdadj|AR|8707356700 +Vdugahd|Cbhdadj|AR|8702758787 +Wcmgahd|Dxhdadj|AR|8709359799 +Rclgahd|Wbhdadj|AR|8705016700 +Vdvgahd|Cchdadj|AR|8702859888 +Wdvgahd|Echdadj|AR|8702859888 +Rcmgahd|Wxhdadj|AR|8709356700 +Vdwgahd|Cdhdadj|AR|8702956989 +Wdygahd|Efhdadj|AR|8701316219 +Rcogahd|Wahdadj|AR|8702156700 +Wbfgahd|Dwhdadj|AR|8702322729 +Xbegahd|Exhdadj|AR|8701356790 +Rcqgahd|Wmhdadj|AR|8702356706 +Wbhgahd|Dthdadj|AR|8704344749 +Xbfgahd|Ewhdadj|AR|8702356790 +Rdsgahd|Wdhdadj|AR|8702556706 +Wcogahd|Dahdadj|AR|8702152181 +Xbggahd|Euhdadj|AR|8703356790 +Rdtgahd|Wnhdadj|AR|8702656706 +Wcpgahd|Dkhdadj|AR|8702253282 +Xbhgahd|Ethdadj|AR|8704356790 +Rdwgahd|Wdhdadj|AR|8702956706 +Wcqgahd|Emhdadj|AR|8702354383 +Xcjgahd|Ephdadj|AR|8706356790 +Scjgahd|Xphdadj|AR|8706376740 +Wdugahd|Ebhdadj|AR|8702758787 +Xcngahd|Fghdadj|AR|8702056790 +Scmgahd|Xxhdadj|AR|8709350740 +Wdxgahd|Eehdadj|AR|8700306109 +Xdsgahd|Fdhdadj|AR|8702556779 +Scrgahd|Ybhdadj|AR|8702455740 +Xbigahd|Eshdadj|AR|8705356790 +Xdugahd|Fbhdadj|AR|8702756779 +Sdtgahd|Ynhdadj|AR|8702657740 +Xckgahd|Eihdadj|AR|8707356790 +Xdygahd|Ffhdadj|AR|8702316779 +Sdugahd|Ybhdadj|AR|8702758740 +Xcmgahd|Fxhdadj|AR|8709356790 +Yadgahd|Gyhdadj|AR|8700350779 +Sdygahd|Yfhdadj|AR|8702316233 +Xcpgahd|Fkhdadj|AR|8702256779 +Ybegahd|Gxhdadj|AR|8701351779 +Uadgahd|Zyhdadj|AR|8700300733 +Xdvgahd|Fchdadj|AR|8702479779 +Ybfgahd|Gwhdadj|AR|8702352779 +Ubegahd|Zxhdadj|AR|8701311733 +Xdwgahd|Fdhdadj|AR|8702956779 +Ybhgahd|Gthdadj|AR|8704354779 +Ubigahd|Zshdadj|AR|8705355733 +Xdxgahd|Fehdadj|AR|8702306779 +Ycjgahd|Gphdadj|AR|8706356779 +Uclgahd|Zbhdadj|AR|8708708733 +Ybigahd|Gshdadj|AR|8705355779 +Yclgahd|Gbhdadj|AR|8705018744 +Ucmgahd|Axhdadj|AR|8709359733 +Yckgahd|Gihdadj|AR|8707357779 +Ycpgahd|Gkhdadj|AR|8702256244 +Ucqgahd|Amhdadj|AR|8702354333 +Ycogahd|Gahdadj|AR|8702156144 +Ydtgahd|Hnhdadj|AR|8702656644 +Udtgahd|Anhdadj|AR|8702657633 +Ycqgahd|Gmhdadj|AR|8702356344 +Ydwgahd|Hdhdadj|AR|8702956944 +Udugahd|Abhdadj|AR|8702758733 +Ydsgahd|Hdhdadj|AR|8702556544 +Ydxgahd|Hehdadj|AR|8702306709 +Udxgahd|Aehdadj|AR|8702306109 +Ydvgahd|Hchdadj|AR|8702479844 +Ydygahd|Hfhdadj|AR|8702316719 +Vbggahd|Buhdadj|AR|8703333739 +Zbegahd|Hxhdadj|AR|8701356744 +Ydzgahd|Hghdadj|AR|8702326729 +Vcngahd|Cghdadj|AR|8702031080 +Zcogahd|Iahdadj|AR|8702156766 +Zadgahd|Hyhdadj|AR|8700356744 +Vcogahd|Cahdadj|AR|8702152181 +Zcpgahd|Ikhdadj|AR|8702256766 +Zbfgahd|Hwhdadj|AR|8702356744 +Vcrgahd|Cbhdadj|AR|8702455484 +Zdwgahd|Jdhdadj|AR|8702956751 +Zbhgahd|Hthdadj|AR|8704356766 +Vdsgahd|Cdhdadj|AR|8702556585 +Zdygahd|Jfhdadj|AR|8702316751 +Zcjgahd|Iphdadj|AR|8706356766 +Vdtgahd|Cnhdadj|AR|8702657686 +Kefgahd|Jwhdadj|AR|8702326751 +Zcmgahd|Ixhdadj|AR|8709356766 +Wbegahd|Dxhdadj|AR|8701311719 +Keigahd|Jshdadj|AR|8705356751 +Zdvgahd|Jchdadj|AR|8702479751 +Wbigahd|Dshdadj|AR|8705355759 +Kemgahd|Kxhdadj|AR|8709350751 +Kedgahd|Jyhdadj|AR|8700306751 +Wckgahd|Dihdadj|AR|8707387779 +Kengahd|Kghdadj|AR|8702051751 +Keegahd|Jxhdadj|AR|8701316751 +Wclgahd|Dbhdadj|AR|8708708789 +Kepgahd|Kkhdadj|AR|8702253751 +Kehgahd|Jthdadj|AR|8704346751 +Wcngahd|Dghdadj|AR|8702031080 +Kesgahd|Kdhdadj|AR|8702556762 +Kelgahd|Jbhdadj|AR|8708706751 +Wcrgahd|Ebhdadj|AR|8702455484 +Kewgahd|Kdhdadj|AR|8702956062 +Keqgahd|Kmhdadj|AR|8702354762 +Wdsgahd|Edhdadj|AR|8702556585 +Kexgahd|Kehdadj|AR|8702306162 +Ketgahd|Knhdadj|AR|8702657762 +Wdtgahd|Enhdadj|AR|8702657686 +Lidgahd|Lyhdadj|AR|8700300762 +Kezgahd|Kghdadj|AR|8702326362 +Wdwgahd|Edhdadj|AR|8702956989 +Liegahd|Lxhdadj|AR|8701311762 +Liggahd|Luhdadj|AR|8703333762 +Wdzgahd|Eghdadj|AR|8702326329 +Liigahd|Lshdadj|AR|8705355762 +Likgahd|Lihdadj|AR|8707387762 +Xadgahd|Eyhdadj|AR|8700356790 +Lijgahd|Lphdadj|AR|8706376762 +Lilgahd|Lbhdadj|AR|8708708702 +Xclgahd|Fbhdadj|AR|8705016790 +Liqgahd|Lmhdadj|AR|8702354388 +Lipgahd|Lkhdadj|AR|8702253288 +Xcogahd|Fahdadj|AR|8702156790 +Lirgahd|Mbhdadj|AR|8702455488 +Liygahd|Mfhdadj|AR|8702316219 +Xcqgahd|Fmhdadj|AR|8702356779 +Litgahd|Mnhdadj|AR|8702657688 +Moegahd|Mxhdadj|AR|8701311719 +Xcrgahd|Fbhdadj|AR|8702456779 +Liugahd|Mbhdadj|AR|8702758788 +Moggahd|Muhdadj|AR|8703333739 +Xdtgahd|Fnhdadj|AR|8702656779 +Lizgahd|Mghdadj|AR|8702326329 +Mohgahd|Mthdadj|AR|8704344749 +Xdzgahd|Fghdadj|AR|8702326779 +Modgahd|Myhdadj|AR|8700300709 +Momgahd|Nxhdadj|AR|8709359799 +Ybggahd|Guhdadj|AR|8703353779 +Mongahd|Nghdadj|AR|8702031080 +Moqgahd|Nmhdadj|AR|8702354383 +Ycmgahd|Gxhdadj|AR|8709359744 +Mopgahd|Nkhdadj|AR|8702253282 +Motgahd|Nnhdadj|AR|8702657686 +Ycngahd|Gghdadj|AR|8702056044 +Mosgahd|Ndhdadj|AR|8702556585 +Movgahd|Nchdadj|AR|8702859888 +Ycrgahd|Gbhdadj|AR|8702456444 +Mowgahd|Ndhdadj|AR|8702956989 +Mozgahd|Oghdadj|AR|8702326329 +Ydugahd|Hbhdadj|AR|8702756744 +Nudgahd|Oyhdadj|AR|8700300709 +Nufgahd|Owhdadj|AR|8702322729 +Zbggahd|Huhdadj|AR|8703356766 +Nujgahd|Ophdadj|AR|8706376769 +Nuggahd|Ouhdadj|AR|8703333739 +Zbigahd|Ishdadj|AR|8705356766 +Numgahd|Pxhdadj|AR|8709359799 +Nuhgahd|Othdadj|AR|8704344749 +Zckgahd|Iihdadj|AR|8707356766 +Nungahd|Pghdadj|AR|8702031080 +Nukgahd|Oihdadj|AR|8707387779 +Zclgahd|Ibhdadj|AR|8705016766 +Nuogahd|Pahdadj|AR|8702152181 +Nulgahd|Pbhdadj|AR|8708708789 +Zcngahd|Ighdadj|AR|8702056766 +Nuqgahd|Pmhdadj|AR|8702354383 +Nuxgahd|Qehdadj|AR|8700306109 +Zcqgahd|Imhdadj|AR|8702356766 +Nurgahd|Pbhdadj|AR|8702455484 +Nuygahd|Qfhdadj|AR|8701316219 +Zcrgahd|Ibhdadj|AR|8702456766 +Nutgahd|Pnhdadj|AR|8702657686 +Badgahd|Eyhdadj|CA|4080350711 +Zdsgahd|Idhdadj|AR|8702556766 +Nuugahd|Pbhdadj|AR|8702758787 +Bbfgahd|Ewhdadj|CA|4082352711 +Zdtgahd|Inhdadj|AR|8702656766 +Nuzgahd|Qghdadj|AR|8702326329 +Bcjgahd|Fphdadj|CA|4086356711 +Zdugahd|Ibhdadj|AR|8702756766 +Aadgahd|Ayhdadj|CA|4080356710 +Bclgahd|Fbhdadj|CA|4088358700 +Zdxgahd|Jehdadj|AR|8702306751 +Abhgahd|Athdadj|CA|4084356710 +Bcogahd|Fahdadj|CA|4082156100 +Zdzgahd|Jghdadj|AR|8702326751 +Ackgahd|Bihdadj|CA|4087356710 +Bcqgahd|Gmhdadj|CA|4082356300 +Keggahd|Juhdadj|AR|8703336751 +Aclgahd|Bbhdadj|CA|4088356710 +Bcrgahd|Gbhdadj|CA|4082456400 +Kejgahd|Jphdadj|AR|8706376751 +Acmgahd|Bxhdadj|CA|4089356701 +Bdvgahd|Gchdadj|CA|4082856800 +Kekgahd|Jihdadj|AR|8707386751 +Acpgahd|Bkhdadj|CA|4082256701 +Cadgahd|Iyhdadj|CA|4080356712 +Keogahd|Kahdadj|AR|8702152751 +Adtgahd|Cnhdadj|CA|4082656701 +Cbegahd|Ixhdadj|CA|4082656712 +Kergahd|Kbhdadj|AR|8702455762 +Advgahd|Dchdadj|CA|4082856701 +Cbhgahd|Ithdadj|CA|4084356712 +Keugahd|Kbhdadj|AR|8702758702 +Adxgahd|Dehdadj|CA|4082306711 +Ccmgahd|Jxhdadj|CA|4089356721 +Kevgahd|Kchdadj|AR|8702859762 +Adygahd|Dfhdadj|CA|4082316711 +Ccogahd|Jahdadj|CA|4082156721 +Keygahd|Kfhdadj|AR|8702316262 +Bbegahd|Axhdadj|CA|4082651711 +Ccpgahd|Kkhdadj|CA|4082256721 +Lifgahd|Lwhdadj|AR|8702322762 +Bckgahd|Fihdadj|CA|4087357700 +Ccqgahd|Kmhdadj|CA|4082356721 +Lihgahd|Lthdadj|AR|8704344762 +Bcmgahd|Fxhdadj|CA|4089359700 +Cdwgahd|Ldhdadj|CA|4082956721 +Limgahd|Lxhdadj|AR|8709359762 +Bcpgahd|Gkhdadj|CA|4082256200 +Cdzgahd|Lghdadj|CA|4082326722 +Lingahd|Lghdadj|AR|8702031088 +Bdsgahd|Gdhdadj|CA|4082556260 +Dbggahd|Muhdadj|CA|4083336722 +Liogahd|Lahdadj|AR|8702152188 +Bdugahd|Gbhdadj|CA|4082756700 +Dckgahd|Nihdadj|CA|4087386722 +Lisgahd|Mdhdadj|AR|8702556588 +Bdwgahd|Hdhdadj|CA|4082956900 +Dcogahd|Nahdadj|CA|4082152732 +Livgahd|Mchdadj|AR|8702859888 +Bdzgahd|Hghdadj|CA|4082326729 +Dcrgahd|Obhdadj|CA|4082455732 +Liwgahd|Mdhdadj|AR|8702956988 +Cbigahd|Ishdadj|CA|4085356712 +Ddsgahd|Odhdadj|CA|4082556732 +Lixgahd|Mehdadj|AR|8702306109 +Ccjgahd|Jphdadj|CA|4086356712 +Ddtgahd|Onhdadj|CA|4082657732 +Mofgahd|Mwhdadj|AR|8702322729 +Cckgahd|Jihdadj|CA|4087356712 +Ddugahd|Obhdadj|CA|4082758732 +Moigahd|Mshdadj|AR|8705355759 +Cclgahd|Jbhdadj|CA|4088356721 +Eadgahd|Ryhdadj|CA|4080300745 +Mojgahd|Nphdadj|AR|8706376769 +Ccrgahd|Kbhdadj|CA|4082456721 +Ebegahd|Rxhdadj|CA|4082611745 +Mokgahd|Nihdadj|AR|8707387779 +Cdsgahd|Kdhdadj|CA|4082556721 +Ebfgahd|Rwhdadj|CA|4082322745 +Molgahd|Nbhdadj|AR|8708708789 +Cdxgahd|Lehdadj|CA|4082306721 +Ebhgahd|Rthdadj|CA|4084344745 +Moogahd|Nahdadj|AR|8702152181 +Dbhgahd|Mthdadj|CA|4084346722 +Eckgahd|Sihdadj|CA|4087387745 +Morgahd|Nbhdadj|AR|8702455484 +Dbigahd|Nshdadj|CA|4085356722 +Ecmgahd|Sxhdadj|CA|4089359745 +Mougahd|Nbhdadj|AR|8702758787 +Dclgahd|Nbhdadj|CA|4086266732 +Ecogahd|Tahdadj|CA|4082152145 +Moxgahd|Nehdadj|AR|8700306109 +Dcqgahd|Omhdadj|CA|4082354732 +Ecrgahd|Tbhdadj|CA|4082455445 +Moygahd|Ofhdadj|AR|8701316219 +Ddvgahd|Ochdadj|CA|4082859732 +Edugahd|Ubhdadj|CA|4082758709 +Nuegahd|Oxhdadj|AR|8701311719 +Ddwgahd|Odhdadj|CA|4082956045 +Edvgahd|Uchdadj|CA|4082859809 +Nuigahd|Oshdadj|AR|8705355759 +Ebigahd|Sshdadj|CA|4085355745 +Edzgahd|Vghdadj|CA|4082326329 +Nupgahd|Pkhdadj|AR|8702253282 +Ecjgahd|Sphdadj|CA|4086376745 +Fadgahd|Vyhdadj|CA|4080300709 +Nusgahd|Pdhdadj|AR|8702556585 +Eclgahd|Sbhdadj|CA|4086268745 +Fbigahd|Wshdadj|CA|4085355759 +Nuvgahd|Pchdadj|AR|8702859888 +Ecngahd|Sghdadj|CA|4082051045 +Fcjgahd|Wphdadj|CA|4086376769 +Nuwgahd|Pdhdadj|AR|8702956989 +Edwgahd|Udhdadj|CA|4082956909 +Fclgahd|Wbhdadj|CA|4086268789 +Abegahd|Axhdadj|CA|4082656710 +Edygahd|Vfhdadj|CA|4082316219 +Fcngahd|Wghdadj|CA|4082051080 +Abfgahd|Awhdadj|CA|4082356710 +Fbfgahd|Vwhdadj|CA|4082322729 +Fcpgahd|Wkhdadj|CA|4082253282 +Abggahd|Auhdadj|CA|4083356710 +Fcmgahd|Wxhdadj|CA|4089359799 +Fdtgahd|Xnhdadj|CA|4082657686 +Abigahd|Ashdadj|CA|4085356710 +Fcqgahd|Xmhdadj|CA|4082354383 +Fdygahd|Yfhdadj|CA|4082616219 +Acjgahd|Bphdadj|CA|4086356710 +Fcrgahd|Xbhdadj|CA|4082455484 +Gbigahd|Zshdadj|CA|4085355759 +Acngahd|Bghdadj|CA|4082056701 +Fdzgahd|Yghdadj|CA|4082326329 +Gckgahd|Zihdadj|CA|4087387779 +Acogahd|Bahdadj|CA|4082156701 +Gadgahd|Yyhdadj|CA|4080300709 +Gcmgahd|Zxhdadj|CA|4089359799 +Acqgahd|Cmhdadj|CA|4082356701 +Gbegahd|Yxhdadj|CA|4082611719 +Gcogahd|Zahdadj|CA|4082152181 +Acrgahd|Cbhdadj|CA|4082456701 +Gbggahd|Yuhdadj|CA|4083333739 +Gcpgahd|Zkhdadj|CA|4082253282 +Adsgahd|Cdhdadj|CA|4082556701 +Gcjgahd|Zphdadj|CA|4086376769 +Gdtgahd|Anhdadj|CA|4082657686 +Adugahd|Cbhdadj|CA|4082756701 +Gcngahd|Zghdadj|CA|4082051080 +Gdugahd|Abhdadj|CA|4082758787 +Adwgahd|Ddhdadj|CA|4082956711 +Gdsgahd|Adhdadj|CA|4082556585 +Gdwgahd|Adhdadj|CA|4082956989 +Adzgahd|Dghdadj|CA|4082326711 +Gdzgahd|Aghdadj|CA|4082326329 +Gdxgahd|Aehdadj|CA|4080306109 +Bbggahd|Euhdadj|CA|4083353711 +Hbggahd|Buhdadj|CA|4153356799 +Hadgahd|Byhdadj|CA|4150356799 +Bbhgahd|Ethdadj|CA|4084354711 +Hbhgahd|Bthdadj|CA|4154356799 +Hbigahd|Bshdadj|CA|4155356799 +Bbigahd|Eshdadj|CA|4085355711 +Hcmgahd|Bxhdadj|CA|4159356799 +Hcjgahd|Bphdadj|CA|4156356799 +Bcngahd|Fghdadj|CA|4082056000 +Hcogahd|Bahdadj|CA|4152156799 +Hckgahd|Bihdadj|CA|4157356799 +Bdtgahd|Gnhdadj|CA|4082656600 +Hcqgahd|Cmhdadj|CA|4152356767 +Hclgahd|Bbhdadj|CA|4158356799 +Bdxgahd|Hehdadj|CA|4082306709 +Hcrgahd|Cbhdadj|CA|4152456767 +Hcngahd|Bghdadj|CA|4152056799 +Bdygahd|Hfhdadj|CA|4082316719 +Hdvgahd|Cchdadj|CA|4152856767 +Hcpgahd|Ckhdadj|CA|4152256767 +Cbfgahd|Iwhdadj|CA|4082356712 +Hdwgahd|Cdhdadj|CA|4152956767 +Hdsgahd|Cdhdadj|CA|4152556767 +Cbggahd|Iuhdadj|CA|4083356712 +Hdxgahd|Cehdadj|CA|4152306767 +Hdtgahd|Cnhdadj|CA|4152656767 +Ccngahd|Jghdadj|CA|4082056721 +Hdygahd|Dfhdadj|CA|4152316767 +Hdzgahd|Dghdadj|CA|4152326767 +Cdtgahd|Knhdadj|CA|4082656721 +Ibggahd|Duhdadj|CA|4153353778 +Ibegahd|Dxhdadj|CA|4151351778 +Cdugahd|Kbhdadj|CA|4082756721 +Ickgahd|Eihdadj|CA|4157357778 +Ibfgahd|Dwhdadj|CA|4152352778 +Cdvgahd|Lchdadj|CA|4082856721 +Icogahd|Eahdadj|CA|4152156178 +Ibigahd|Dshdadj|CA|4155355778 +Cdygahd|Lfhdadj|CA|4082316722 +Icrgahd|Fbhdadj|CA|4152456456 +Icngahd|Eghdadj|CA|4152056078 +Dadgahd|Myhdadj|CA|4080306722 +Idsgahd|Fdhdadj|CA|4152556556 +Icpgahd|Ekhdadj|CA|4152256278 +Dbegahd|Mxhdadj|CA|4082616722 +Idtgahd|Fnhdadj|CA|4152656656 +Icqgahd|Emhdadj|CA|4152356356 +Dbfgahd|Mwhdadj|CA|4082326722 +Idvgahd|Fchdadj|CA|4152856856 +Idugahd|Fbhdadj|CA|4152756756 +Dcjgahd|Nphdadj|CA|4086376722 +Idwgahd|Fdhdadj|CA|4152956956 +Jadgahd|Gyhdadj|CA|4150356701 +Dcmgahd|Nxhdadj|CA|4089350732 +Idxgahd|Fehdadj|CA|4152306709 +Jbegahd|Gxhdadj|CA|4151356701 +Dcngahd|Nghdadj|CA|4082051732 +Jcogahd|Hahdadj|CA|4152156755 +Jbfgahd|Gwhdadj|CA|4152356701 +Dcpgahd|Nkhdadj|CA|4082253732 +Jcpgahd|Hkhdadj|CA|4152256755 +Jbigahd|Gshdadj|CA|4155356701 +Ddxgahd|Pehdadj|CA|4082306145 +Jcqgahd|Hmhdadj|CA|4152356755 +Jckgahd|Hihdadj|CA|4157356701 +Ddygahd|Pfhdadj|CA|4082316245 +Jdugahd|Ibhdadj|CA|4152756755 +Jclgahd|Hbhdadj|CA|4158356701 +Ddzgahd|Pghdadj|CA|4082326345 +Jdxgahd|Iehdadj|CA|4152306755 +Jcrgahd|Hbhdadj|CA|4152456755 +Ebggahd|Ruhdadj|CA|4083333745 +Jdygahd|Ifhdadj|CA|4152316755 +Jdsgahd|Hdhdadj|CA|4152556755 +Ecpgahd|Tkhdadj|CA|4082253245 +Kbggahd|Juhdadj|CA|4153336704 +Jdzgahd|Ighdadj|CA|4152326755 +Ecqgahd|Tmhdadj|CA|4082354345 +Kbhgahd|Jthdadj|CA|4154346704 +Kadgahd|Iyhdadj|CA|4150306704 +Edsgahd|Tdhdadj|CA|4082556269 +Kcmgahd|Jxhdadj|CA|4159350704 +Kbegahd|Ixhdadj|CA|4151316704 +Edtgahd|Unhdadj|CA|4082657609 +Kcpgahd|Kkhdadj|CA|4152253704 +Kbfgahd|Jwhdadj|CA|4152326704 +Edxgahd|Uehdadj|CA|4082306109 +Kdtgahd|Knhdadj|CA|4152657766 +Kbigahd|Jshdadj|CA|4155356704 +Fbegahd|Vxhdadj|CA|4082611719 +Kdxgahd|Lehdadj|CA|4152306166 +Kcjgahd|Jphdadj|CA|4156376704 +Fbggahd|Vuhdadj|CA|4083333739 +Kdygahd|Lfhdadj|CA|4152316266 +Kclgahd|Jbhdadj|CA|4156266704 +Fbhgahd|Vthdadj|CA|4084344749 +Lbfgahd|Lwhdadj|CA|4152322766 +Kcqgahd|Kmhdadj|CA|4152354766 +Fckgahd|Wihdadj|CA|4087387779 +Lbigahd|Lshdadj|CA|4155355729 +Kcrgahd|Kbhdadj|CA|4152455766 +Fcogahd|Wahdadj|CA|4082152181 +Lckgahd|Mihdadj|CA|4157387729 +Kdsgahd|Kdhdadj|CA|4152556766 +Fdsgahd|Xdhdadj|CA|4082556585 +Lcmgahd|Mxhdadj|CA|4159359729 +Kdugahd|Kbhdadj|CA|4152758766 +Fdugahd|Xbhdadj|CA|4082758787 +Lcqgahd|Mmhdadj|CA|4152354329 +Kdzgahd|Lghdadj|CA|4152326366 +Fdvgahd|Xchdadj|CA|4082859888 +Ldxgahd|Nehdadj|CA|4152306109 +Lbegahd|Lxhdadj|CA|4151311766 +Fdwgahd|Xdhdadj|CA|4082956989 +Ldzgahd|Nghdadj|CA|4152326329 +Ldsgahd|Mdhdadj|CA|4152556529 +Fdxgahd|Xehdadj|CA|4080306109 +Mbegahd|Nxhdadj|CA|4151311719 +Ldvgahd|Nchdadj|CA|4152859829 +Gbfgahd|Ywhdadj|CA|4082322729 +Mbigahd|Nshdadj|CA|4155355759 +Ldwgahd|Ndhdadj|CA|4152956929 +Gbhgahd|Ythdadj|CA|4084344749 +Mckgahd|Nihdadj|CA|4157387779 +Ldygahd|Nfhdadj|CA|4152316219 +Gclgahd|Zbhdadj|CA|4086268789 +Mcngahd|Oghdadj|CA|4152051080 +Mbfgahd|Nwhdadj|CA|4152322729 +Gcqgahd|Zmhdadj|CA|4082354383 +Mcogahd|Oahdadj|CA|4152152181 +Mclgahd|Obhdadj|CA|4156268789 +Gcrgahd|Zbhdadj|CA|4082455484 +Mdtgahd|Onhdadj|CA|4152657686 +Mcmgahd|Oxhdadj|CA|4159359799 +Gdvgahd|Achdadj|CA|4082859888 +Mdugahd|Obhdadj|CA|4152758787 +Mcqgahd|Omhdadj|CA|4152354383 +Gdygahd|Afhdadj|CA|4082616219 +Mdvgahd|Ochdadj|CA|4152859888 +Mcrgahd|Obhdadj|CA|4152455484 +Hbegahd|Bxhdadj|CA|4151356799 +Nbegahd|Pxhdadj|CA|4151311719 +Mdxgahd|Pehdadj|CA|4150306109 +Hbfgahd|Bwhdadj|CA|4152356799 +Nbigahd|Pshdadj|CA|4155355759 +Ncjgahd|Pphdadj|CA|4156376769 +Hdugahd|Cbhdadj|CA|4152756767 +Nclgahd|Qbhdadj|CA|4156268789 +Nckgahd|Pihdadj|CA|4157387779 +Iadgahd|Dyhdadj|CA|4150350767 +Ncngahd|Qghdadj|CA|4152051080 +Ncrgahd|Qbhdadj|CA|4152455484 +Ibhgahd|Dthdadj|CA|4154354778 +Ncqgahd|Qmhdadj|CA|4152354383 +Ndtgahd|Qnhdadj|CA|4152657686 +Icjgahd|Dphdadj|CA|4156356778 +Ndsgahd|Qdhdadj|CA|4152556585 +Ndugahd|Qbhdadj|CA|4152758787 +Iclgahd|Ebhdadj|CA|4158358778 +Ndxgahd|Rehdadj|CA|4150306109 +Ndvgahd|Qchdadj|CA|4152859888 +Icmgahd|Exhdadj|CA|4159359778 +Obhgahd|Rthdadj|CA|6264356776 +Ndygahd|Rfhdadj|CA|4151316219 +Idygahd|Gfhdadj|CA|4152316719 +Ocpgahd|Skhdadj|CA|6262256776 +Ndzgahd|Rghdadj|CA|4152326329 +Idzgahd|Gghdadj|CA|4152326729 +Ocrgahd|Sbhdadj|CA|6262456776 +Obggahd|Ruhdadj|CA|6263356776 +Jbggahd|Guhdadj|CA|4153356701 +Odsgahd|Sdhdadj|CA|6262556776 +Obigahd|Rshdadj|CA|6265356776 +Jbhgahd|Gthdadj|CA|4154356701 +Odvgahd|Tchdadj|CA|6262856776 +Oclgahd|Sbhdadj|CA|6268356776 +Jcjgahd|Gphdadj|CA|4156356701 +Odxgahd|Tehdadj|CA|6262306767 +Ocmgahd|Sxhdadj|CA|6269356776 +Jcmgahd|Hxhdadj|CA|4159356701 +Odygahd|Tfhdadj|CA|6262316767 +Ocogahd|Sahdadj|CA|6262156776 +Jcngahd|Hghdadj|CA|4152056755 +Odzgahd|Tghdadj|CA|6262326767 +Ocqgahd|Smhdadj|CA|6262356776 +Jdtgahd|Inhdadj|CA|4152656755 +Pbegahd|Txhdadj|CA|6261351767 +Odugahd|Tbhdadj|CA|6262756776 +Jdvgahd|Ichdadj|CA|4152856755 +Pbigahd|Tshdadj|CA|6265355767 +Padgahd|Tyhdadj|CA|6260350767 +Jdwgahd|Idhdadj|CA|4152956755 +Pclgahd|Ubhdadj|CA|6268358767 +Pbfgahd|Twhdadj|CA|6262352767 +Kckgahd|Jihdadj|CA|4157386704 +Pcmgahd|Uxhdadj|CA|6269359767 +Pbggahd|Tuhdadj|CA|6263353767 +Kcngahd|Jghdadj|CA|4152051704 +Pcpgahd|Ukhdadj|CA|6262256267 +Pcjgahd|Uphdadj|CA|6266356767 +Kcogahd|Kahdadj|CA|4152152704 +Pdsgahd|Udhdadj|CA|6262556260 +Pckgahd|Uihdadj|CA|6267357767 +Kdvgahd|Kchdadj|CA|4152859766 +Pdwgahd|Udhdadj|CA|6262956900 +Pcngahd|Ughdadj|CA|6262056067 +Kdwgahd|Ldhdadj|CA|4152956066 +Pdzgahd|Vghdadj|CA|6262326729 +Pdugahd|Ubhdadj|CA|6262756700 +Ladgahd|Lyhdadj|CA|4150300766 +Radgahd|Vyhdadj|CA|6260356700 +Pdxgahd|Vehdadj|CA|6262306709 +Lbggahd|Luhdadj|CA|4153333729 +Rbhgahd|Vthdadj|CA|6264356700 +Pdygahd|Vfhdadj|CA|6262316719 +Lbhgahd|Lthdadj|CA|4154344729 +Rcngahd|Wghdadj|CA|6262056700 +Rbggahd|Vuhdadj|CA|6263356700 +Lcjgahd|Lphdadj|CA|4156376729 +Rcpgahd|Wkhdadj|CA|6262256706 +Rbigahd|Vshdadj|CA|6265356700 +Lclgahd|Mbhdadj|CA|4156268729 +Rcrgahd|Wbhdadj|CA|6262456706 +Rcjgahd|Vphdadj|CA|6266356700 +Lcngahd|Mghdadj|CA|4152051029 +Rdugahd|Wbhdadj|CA|6262756706 +Sbfgahd|Xwhdadj|CA|6262326706 +Lcogahd|Mahdadj|CA|4152152129 +Rdvgahd|Wchdadj|CA|6262856706 +Sbggahd|Xuhdadj|CA|6263336706 +Lcpgahd|Mkhdadj|CA|4152253229 +Rdxgahd|Wehdadj|CA|6262306706 +Sbigahd|Xshdadj|CA|6265356740 +Lcrgahd|Mbhdadj|CA|4152455429 +Rdygahd|Wfhdadj|CA|6262316706 +Scngahd|Xghdadj|CA|6262051740 +Ldtgahd|Mnhdadj|CA|4152657629 +Rdzgahd|Wghdadj|CA|6262326706 +Scpgahd|Ykhdadj|CA|6262253740 +Ldugahd|Mbhdadj|CA|4152758729 +Sadgahd|Xyhdadj|CA|6260306706 +Scqgahd|Ymhdadj|CA|6262354740 +Madgahd|Nyhdadj|CA|4150300709 +Sbegahd|Xxhdadj|CA|6261316706 +Sdzgahd|Yghdadj|CA|6262326333 +Mbggahd|Nuhdadj|CA|4153333739 +Sbhgahd|Xthdadj|CA|6264346706 +Ubggahd|Zuhdadj|CA|6263333733 +Mbhgahd|Nthdadj|CA|4154344749 +Sckgahd|Xihdadj|CA|6267386740 +Ubhgahd|Zthdadj|CA|6264344733 +Mcjgahd|Nphdadj|CA|4156376769 +Sclgahd|Xbhdadj|CA|6266266740 +Uckgahd|Zihdadj|CA|6267387733 +Mcpgahd|Okhdadj|CA|4152253282 +Scogahd|Yahdadj|CA|6262152740 +Ucngahd|Aghdadj|CA|6262051033 +Mdsgahd|Odhdadj|CA|4152556585 +Sdsgahd|Ydhdadj|CA|6262556740 +Ucogahd|Aahdadj|CA|6262152133 +Mdwgahd|Pdhdadj|CA|4152956989 +Sdvgahd|Ychdadj|CA|6262859740 +Ucrgahd|Abhdadj|CA|6262455433 +Mdygahd|Pfhdadj|CA|4151316219 +Sdwgahd|Ydhdadj|CA|6262956040 +Udsgahd|Adhdadj|CA|6262556533 +Mdzgahd|Pghdadj|CA|4152326329 +Sdxgahd|Yehdadj|CA|6262306140 +Udwgahd|Adhdadj|CA|6262956933 +Nadgahd|Pyhdadj|CA|4150300709 +Ubfgahd|Zwhdadj|CA|6262322733 +Udzgahd|Bghdadj|CA|6262326329 +Nbfgahd|Pwhdadj|CA|4152322729 +Ucjgahd|Zphdadj|CA|6266376733 +Vbfgahd|Bwhdadj|CA|6262322729 +Nbggahd|Puhdadj|CA|4153333739 +Ucpgahd|Akhdadj|CA|6262253233 +Vcjgahd|Bphdadj|CA|6266376769 +Nbhgahd|Pthdadj|CA|4154344749 +Udvgahd|Achdadj|CA|6262859833 +Vcmgahd|Cxhdadj|CA|6269359799 +Ncmgahd|Qxhdadj|CA|4159359799 +Udygahd|Bfhdadj|CA|6262316219 +Vcpgahd|Ckhdadj|CA|6262253282 +Ncogahd|Qahdadj|CA|4152152181 +Vadgahd|Byhdadj|CA|6260300709 +Vdxgahd|Cehdadj|CA|6260306109 +Ncpgahd|Qkhdadj|CA|4152253282 +Vbegahd|Bxhdadj|CA|6261311719 +Vdygahd|Cfhdadj|CA|6261316219 +Ndwgahd|Qdhdadj|CA|4152956989 +Vbhgahd|Bthdadj|CA|6264344749 +Vdzgahd|Cghdadj|CA|6262326329 +Oadgahd|Ryhdadj|CA|6260356776 +Vbigahd|Bshdadj|CA|6265355759 +Wadgahd|Dyhdadj|CA|6260300709 +Obegahd|Rxhdadj|CA|6261356776 +Vckgahd|Bihdadj|CA|6267387779 +Wbggahd|Duhdadj|CA|6263333739 +Obfgahd|Rwhdadj|CA|6262356776 +Vclgahd|Bbhdadj|CA|6266268789 +Wcjgahd|Dphdadj|CA|6266376769 +Ocjgahd|Sphdadj|CA|6266356776 +Vcqgahd|Cmhdadj|CA|6262354383 +Wcmgahd|Dxhdadj|CA|6269359799 +Ockgahd|Sihdadj|CA|6267356776 +Vdugahd|Cbhdadj|CA|6262758787 +Wdvgahd|Echdadj|CA|6262859888 +Ocngahd|Sghdadj|CA|6262056776 +Vdvgahd|Cchdadj|CA|6262859888 +Wdygahd|Efhdadj|CA|6261316219 +Odtgahd|Snhdadj|CA|6262656776 +Vdwgahd|Cdhdadj|CA|6262956989 +Xbegahd|Exhdadj|CA|4151356790 +Odwgahd|Tdhdadj|CA|6262956776 +Wbfgahd|Dwhdadj|CA|6262322729 +Xbfgahd|Ewhdadj|CA|4152356790 +Pbhgahd|Tthdadj|CA|6264354767 +Wbhgahd|Dthdadj|CA|6264344749 +Xbggahd|Euhdadj|CA|4153356790 +Pcogahd|Uahdadj|CA|6262156167 +Wcogahd|Dahdadj|CA|6262152181 +Xbhgahd|Ethdadj|CA|4154356790 +Pcqgahd|Umhdadj|CA|6262356367 +Wcpgahd|Dkhdadj|CA|6262253282 +Xcjgahd|Ephdadj|CA|4156356790 +Pcrgahd|Ubhdadj|CA|6262456467 +Wcqgahd|Emhdadj|CA|6262354383 +Xcngahd|Fghdadj|CA|4152056790 +Pdtgahd|Unhdadj|CA|6262656600 +Wdugahd|Ebhdadj|CA|6262758787 +Xdsgahd|Fdhdadj|CA|4152556779 +Pdvgahd|Uchdadj|CA|6262856800 +Wdxgahd|Eehdadj|CA|6260306109 +Xdugahd|Fbhdadj|CA|4152756779 +Rbegahd|Vxhdadj|CA|6261356700 +Xbigahd|Eshdadj|CA|4155356790 +Xdygahd|Ffhdadj|CA|4152316779 +Rbfgahd|Vwhdadj|CA|6262356700 +Xckgahd|Eihdadj|CA|4157356790 +Yadgahd|Gyhdadj|CA|4150350779 +Rckgahd|Vihdadj|CA|6267356700 +Xcmgahd|Fxhdadj|CA|4159356790 +Ybegahd|Gxhdadj|CA|4151351779 +Rclgahd|Wbhdadj|CA|6268356700 +Xcpgahd|Fkhdadj|CA|4152256779 +Ybfgahd|Gwhdadj|CA|4152352779 +Rcmgahd|Wxhdadj|CA|6269356700 +Xdvgahd|Fchdadj|CA|4152856779 +Ybhgahd|Gthdadj|CA|4154354779 +Rcogahd|Wahdadj|CA|6262156700 +Xdwgahd|Fdhdadj|CA|4152956779 +Ycjgahd|Gphdadj|CA|4156356779 +Rcqgahd|Wmhdadj|CA|6262356706 +Xdxgahd|Fehdadj|CA|4152306779 +Yclgahd|Gbhdadj|CA|4158358744 +Rdsgahd|Wdhdadj|CA|6262556706 +Ybigahd|Gshdadj|CA|4155355779 +Ycpgahd|Gkhdadj|CA|4152256244 +Rdtgahd|Wnhdadj|CA|6262656706 +Yckgahd|Gihdadj|CA|4157357779 +Ydtgahd|Hnhdadj|CA|4152656644 +Rdwgahd|Wdhdadj|CA|6262956706 +Ycogahd|Gahdadj|CA|4152156144 +Ydwgahd|Hdhdadj|CA|4152956944 +Scjgahd|Xphdadj|CA|6266376740 +Ycqgahd|Gmhdadj|CA|4152356344 +Ydxgahd|Hehdadj|CA|4152306709 +Scmgahd|Xxhdadj|CA|6269350740 +Ydsgahd|Hdhdadj|CA|4152556544 +Ydygahd|Hfhdadj|CA|4152316719 +Scrgahd|Ybhdadj|CA|6262455740 +Ydvgahd|Hchdadj|CA|4152856844 +Ydzgahd|Hghdadj|CA|4152326729 +Sdtgahd|Ynhdadj|CA|6262657740 +Zbegahd|Hxhdadj|CA|4151356744 +Zadgahd|Hyhdadj|CA|4150356744 +Sdugahd|Ybhdadj|CA|6262758740 +Zcogahd|Iahdadj|CA|4152156766 +Zbfgahd|Hwhdadj|CA|4152356744 +Sdygahd|Yfhdadj|CA|6262316233 +Zcpgahd|Ikhdadj|CA|4152256766 +Zbhgahd|Hthdadj|CA|4154356766 +Uadgahd|Zyhdadj|CA|6260300733 +Zdwgahd|Jdhdadj|CA|4152956751 +Zcjgahd|Iphdadj|CA|4156356766 +Ubegahd|Zxhdadj|CA|6261311733 +Zdygahd|Jfhdadj|CA|4152316751 +Zcmgahd|Ixhdadj|CA|4159356766 +Ubigahd|Zshdadj|CA|6265355733 +Kefgahd|Jwhdadj|CA|4152326751 +Zdvgahd|Jchdadj|CA|4152856751 +Uclgahd|Zbhdadj|CA|6266268733 +Keigahd|Jshdadj|CA|4155356751 +Kedgahd|Jyhdadj|CA|4150306751 +Ucmgahd|Axhdadj|CA|6269359733 +Kemgahd|Kxhdadj|CA|4159350751 +Keegahd|Jxhdadj|CA|4151316751 +Ucqgahd|Amhdadj|CA|6262354333 +Kengahd|Kghdadj|CA|4152051751 +Kehgahd|Jthdadj|CA|4154346751 +Udtgahd|Anhdadj|CA|6262657633 +Kepgahd|Kkhdadj|CA|4152253751 +Kelgahd|Jbhdadj|CA|4156266751 +Udugahd|Abhdadj|CA|6262758733 +Kesgahd|Kdhdadj|CA|4152556762 +Keqgahd|Kmhdadj|CA|4152354762 +Udxgahd|Aehdadj|CA|6262306109 +Kewgahd|Kdhdadj|CA|4152956062 +Ketgahd|Knhdadj|CA|4152657762 +Vbggahd|Buhdadj|CA|6263333739 +Kexgahd|Kehdadj|CA|4152306162 +Kezgahd|Kghdadj|CA|4152326362 +Vcngahd|Cghdadj|CA|6262051080 +Lidgahd|Lyhdadj|CA|4150300762 +Liggahd|Luhdadj|CA|4153333762 +Vcogahd|Cahdadj|CA|6262152181 +Liegahd|Lxhdadj|CA|4151311762 +Likgahd|Lihdadj|CA|4157387762 +Vcrgahd|Cbhdadj|CA|6262455484 +Liigahd|Lshdadj|CA|4155355762 +Lilgahd|Lbhdadj|CA|4156268762 +Vdsgahd|Cdhdadj|CA|6262556585 +Lijgahd|Lphdadj|CA|4156376762 +Lipgahd|Lkhdadj|CA|4152253288 +Vdtgahd|Cnhdadj|CA|6262657686 +Liqgahd|Lmhdadj|CA|4152354388 +Liygahd|Mfhdadj|CA|4152316219 +Wbegahd|Dxhdadj|CA|6261311719 +Lirgahd|Mbhdadj|CA|4152455488 +Moegahd|Mxhdadj|CA|4151311719 +Wbigahd|Dshdadj|CA|6265355759 +Litgahd|Mnhdadj|CA|4152657688 +Moggahd|Muhdadj|CA|4153333739 +Wckgahd|Dihdadj|CA|6267387779 +Liugahd|Mbhdadj|CA|4152758788 +Mohgahd|Mthdadj|CA|4154344749 +Wclgahd|Dbhdadj|CA|6266268789 +Lizgahd|Mghdadj|CA|4152326329 +Momgahd|Nxhdadj|CA|4159359799 +Wcngahd|Dghdadj|CA|6262051080 +Modgahd|Myhdadj|CA|4150300709 +Moqgahd|Nmhdadj|CA|4152354383 +Wcrgahd|Ebhdadj|CA|6262455484 +Mongahd|Nghdadj|CA|4152051080 +Motgahd|Nnhdadj|CA|4152657686 +Wdsgahd|Edhdadj|CA|6262556585 +Mopgahd|Nkhdadj|CA|4152253282 +Movgahd|Nchdadj|CA|4152859888 +Wdtgahd|Enhdadj|CA|6262657686 +Mosgahd|Ndhdadj|CA|4152556585 +Mozgahd|Oghdadj|CA|4152326329 +Wdwgahd|Edhdadj|CA|6262956989 +Mowgahd|Ndhdadj|CA|4152956989 +Nufgahd|Owhdadj|CA|4152322729 +Wdzgahd|Eghdadj|CA|6262326329 +Nudgahd|Oyhdadj|CA|4150300709 +Nuggahd|Ouhdadj|CA|4153333739 +Xadgahd|Eyhdadj|CA|4150356790 +Nujgahd|Ophdadj|CA|4156376769 +Nuhgahd|Othdadj|CA|4154344749 +Xclgahd|Fbhdadj|CA|4158356790 +Numgahd|Pxhdadj|CA|4159359799 +Nukgahd|Oihdadj|CA|4157387779 +Xcogahd|Fahdadj|CA|4152156790 +Nungahd|Pghdadj|CA|4152051080 +Nulgahd|Pbhdadj|CA|4156268789 +Xcqgahd|Fmhdadj|CA|4152356779 +Nuogahd|Pahdadj|CA|4152152181 +Nuxgahd|Qehdadj|CA|4150306109 +Xcrgahd|Fbhdadj|CA|4152456779 +Nuqgahd|Pmhdadj|CA|4152354383 +Nuygahd|Qfhdadj|CA|4151316219 +Xdtgahd|Fnhdadj|CA|4152656779 +Nurgahd|Pbhdadj|CA|4152455484 +Badgahd|Eyhdadj|CA|9250350711 +Xdzgahd|Fghdadj|CA|4152326779 +Nutgahd|Pnhdadj|CA|4152657686 +Bbfgahd|Ewhdadj|CA|9252352711 +Ybggahd|Guhdadj|CA|4153353779 +Nuugahd|Pbhdadj|CA|4152758787 +Bcjgahd|Fphdadj|CA|9256356711 +Ycmgahd|Gxhdadj|CA|4159359744 +Nuzgahd|Qghdadj|CA|4152326329 +Bclgahd|Fbhdadj|CA|9258358700 +Ycngahd|Gghdadj|CA|4152056044 +Aadgahd|Ayhdadj|CA|9250356710 +Bcogahd|Fahdadj|CA|9252156100 +Ycrgahd|Gbhdadj|CA|4152456444 +Abhgahd|Athdadj|CA|9254356710 +Bcqgahd|Gmhdadj|CA|9252356300 +Ydugahd|Hbhdadj|CA|4152756744 +Ackgahd|Bihdadj|CA|9257356710 +Bcrgahd|Gbhdadj|CA|9252456400 +Zbggahd|Huhdadj|CA|4153356766 +Aclgahd|Bbhdadj|CA|9258356710 +Bdvgahd|Gchdadj|CA|9252856800 +Zbigahd|Ishdadj|CA|4155356766 +Acmgahd|Bxhdadj|CA|9259356701 +Cadgahd|Iyhdadj|CA|9250356712 +Zckgahd|Iihdadj|CA|4157356766 +Acpgahd|Bkhdadj|CA|9252256701 +Cbegahd|Ixhdadj|CA|9251356712 +Zclgahd|Ibhdadj|CA|4158356766 +Adtgahd|Cnhdadj|CA|9252656701 +Cbhgahd|Ithdadj|CA|9254356712 +Zcngahd|Ighdadj|CA|4152056766 +Advgahd|Dchdadj|CA|9252856701 +Ccmgahd|Jxhdadj|CA|9259356721 +Zcqgahd|Imhdadj|CA|4152356766 +Adxgahd|Dehdadj|CA|9252306711 +Ccogahd|Jahdadj|CA|9252156721 +Zcrgahd|Ibhdadj|CA|4152456766 +Adygahd|Dfhdadj|CA|9252316711 +Ccpgahd|Kkhdadj|CA|9252256721 +Zdsgahd|Idhdadj|CA|4152556766 +Bbegahd|Axhdadj|CA|9251351711 +Ccqgahd|Kmhdadj|CA|9252356721 +Zdtgahd|Inhdadj|CA|4152656766 +Bckgahd|Fihdadj|CA|9257357700 +Cdwgahd|Ldhdadj|CA|9252956721 +Zdugahd|Ibhdadj|CA|4152756766 +Bcmgahd|Fxhdadj|CA|9259359700 +Cdzgahd|Lghdadj|CA|9252326722 +Zdxgahd|Jehdadj|CA|4152306751 +Bcpgahd|Gkhdadj|CA|9252256200 +Dbggahd|Muhdadj|CA|9253336722 +Zdzgahd|Jghdadj|CA|4152326751 +Bdsgahd|Gdhdadj|CA|9252556260 +Dckgahd|Nihdadj|CA|9257386722 +Keggahd|Juhdadj|CA|4153336751 +Bdugahd|Gbhdadj|CA|9252756700 +Dcogahd|Nahdadj|CA|9252152732 +Kejgahd|Jphdadj|CA|4156376751 +Bdwgahd|Hdhdadj|CA|9252956900 +Dcrgahd|Obhdadj|CA|9252455732 +Kekgahd|Jihdadj|CA|4157386751 +Bdzgahd|Hghdadj|CA|9252326729 +Ddsgahd|Odhdadj|CA|9252556732 +Keogahd|Kahdadj|CA|4152152751 +Cbigahd|Ishdadj|CA|9255356712 +Ddtgahd|Onhdadj|CA|9252657732 +Kergahd|Kbhdadj|CA|4152455762 +Ccjgahd|Jphdadj|CA|9256356712 +Ddugahd|Obhdadj|CA|9252758732 +Keugahd|Kbhdadj|CA|4152758762 +Cckgahd|Jihdadj|CA|9257356712 +Eadgahd|Ryhdadj|CA|9250300745 +Kevgahd|Kchdadj|CA|4152859762 +Cclgahd|Jbhdadj|CA|9258356721 +Ebegahd|Rxhdadj|CA|9251311745 +Keygahd|Kfhdadj|CA|4152316262 +Ccrgahd|Kbhdadj|CA|9252456721 +Ebfgahd|Rwhdadj|CA|9252322745 +Lifgahd|Lwhdadj|CA|4152322762 +Cdsgahd|Kdhdadj|CA|9252556721 +Ebhgahd|Rthdadj|CA|9254344745 +Lihgahd|Lthdadj|CA|4154344762 +Cdxgahd|Lehdadj|CA|9252306721 +Eckgahd|Sihdadj|CA|9257387745 +Limgahd|Lxhdadj|CA|4159359762 +Dbhgahd|Mthdadj|CA|9254346722 +Ecmgahd|Sxhdadj|CA|9259359745 +Lingahd|Lghdadj|CA|4152051088 +Dbigahd|Nshdadj|CA|9255356722 +Ecogahd|Tahdadj|CA|9252152145 +Liogahd|Lahdadj|CA|4152152188 +Dclgahd|Nbhdadj|CA|9256266732 +Ecrgahd|Tbhdadj|CA|9252455445 +Lisgahd|Mdhdadj|CA|4152556588 +Dcqgahd|Omhdadj|CA|9252354732 +Edugahd|Ubhdadj|CA|9252758709 +Livgahd|Mchdadj|CA|4152859888 +Ddvgahd|Ochdadj|CA|9252859732 +Edvgahd|Uchdadj|CA|9252859809 +Liwgahd|Mdhdadj|CA|4152956988 +Ddwgahd|Odhdadj|CA|9252956045 +Edzgahd|Vghdadj|CA|9252326329 +Lixgahd|Mehdadj|CA|4152306109 +Ebigahd|Sshdadj|CA|9255355745 +Fadgahd|Vyhdadj|CA|9250300709 +Mofgahd|Mwhdadj|CA|4152322729 +Ecjgahd|Sphdadj|CA|9256376745 +Fbigahd|Wshdadj|CA|9255355759 +Moigahd|Mshdadj|CA|4155355759 +Eclgahd|Sbhdadj|CA|9256268745 +Fcjgahd|Wphdadj|CA|9256376769 +Mojgahd|Nphdadj|CA|4156376769 +Ecngahd|Sghdadj|CA|9252051045 +Fclgahd|Wbhdadj|CA|9256268789 +Mokgahd|Nihdadj|CA|4157387779 +Edwgahd|Udhdadj|CA|9252956909 +Fcngahd|Wghdadj|CA|9252051080 +Molgahd|Nbhdadj|CA|4156268789 +Edygahd|Vfhdadj|CA|9252316219 +Fcpgahd|Wkhdadj|CA|9252253282 +Moogahd|Nahdadj|CA|4152152181 +Fbfgahd|Vwhdadj|CA|9252322729 +Fdtgahd|Xnhdadj|CA|9252657686 +Morgahd|Nbhdadj|CA|4152455484 +Fcmgahd|Wxhdadj|CA|9259359799 +Fdygahd|Yfhdadj|CA|9251316219 +Mougahd|Nbhdadj|CA|4152758787 +Fcqgahd|Xmhdadj|CA|9252354383 +Gbigahd|Zshdadj|CA|9255355759 +Moxgahd|Nehdadj|CA|4150306109 +Fcrgahd|Xbhdadj|CA|9252455484 +Gckgahd|Zihdadj|CA|9257387779 +Moygahd|Ofhdadj|CA|4151316219 +Fdzgahd|Yghdadj|CA|9252326329 +Gcmgahd|Zxhdadj|CA|9259359799 +Nuegahd|Oxhdadj|CA|4151311719 +Gadgahd|Yyhdadj|CA|9250300709 +Gcogahd|Zahdadj|CA|9252152181 +Nuigahd|Oshdadj|CA|4155355759 +Gbegahd|Yxhdadj|CA|9251311719 +Gcpgahd|Zkhdadj|CA|9252253282 +Nupgahd|Pkhdadj|CA|4152253282 +Gbggahd|Yuhdadj|CA|9253333739 +Gdtgahd|Anhdadj|CA|9252657686 +Nusgahd|Pdhdadj|CA|4152556585 +Gcjgahd|Zphdadj|CA|9256376769 +Gdugahd|Abhdadj|CA|9252758787 +Nuvgahd|Pchdadj|CA|4152859888 +Gcngahd|Zghdadj|CA|9252051080 +Gdwgahd|Adhdadj|CA|9252956989 +Nuwgahd|Pdhdadj|CA|4152956989 +Gdsgahd|Adhdadj|CA|9252556585 +Gdxgahd|Aehdadj|CA|9250306109 +Abegahd|Axhdadj|CA|9251356710 +Gdzgahd|Aghdadj|CA|9252326329 +Hadgahd|Byhdadj|CA|5100356799 +Abfgahd|Awhdadj|CA|9252356710 +Hbggahd|Buhdadj|CA|5103356799 +Hbigahd|Bshdadj|CA|5105356799 +Abggahd|Auhdadj|CA|9253356710 +Hbhgahd|Bthdadj|CA|5104356799 +Hcjgahd|Bphdadj|CA|5106356799 +Abigahd|Ashdadj|CA|9255356710 +Hcmgahd|Bxhdadj|CA|5109356799 +Hckgahd|Bihdadj|CA|5107356799 +Acjgahd|Bphdadj|CA|9256356710 +Hcogahd|Bahdadj|CA|5102156799 +Hclgahd|Bbhdadj|CA|5108356799 +Acngahd|Bghdadj|CA|9252056701 +Hcqgahd|Cmhdadj|CA|5102356767 +Hcngahd|Bghdadj|CA|5102056799 +Acogahd|Bahdadj|CA|9252156701 +Hcrgahd|Cbhdadj|CA|5102456767 +Hcpgahd|Ckhdadj|CA|5102256767 +Acqgahd|Cmhdadj|CA|9252356701 +Hdvgahd|Cchdadj|CA|5102856767 +Hdsgahd|Cdhdadj|CA|5102556767 +Acrgahd|Cbhdadj|CA|9252456701 +Hdwgahd|Cdhdadj|CA|5102956767 +Hdtgahd|Cnhdadj|CA|5102656767 +Adsgahd|Cdhdadj|CA|9252556701 +Hdxgahd|Cehdadj|CA|5102306767 +Hdzgahd|Dghdadj|CA|5102326767 +Adugahd|Cbhdadj|CA|9252756701 +Hdygahd|Dfhdadj|CA|5102316767 +Ibegahd|Dxhdadj|CA|5101351778 +Adwgahd|Ddhdadj|CA|9252956711 +Ibggahd|Duhdadj|CA|5103353778 +Ibfgahd|Dwhdadj|CA|5102352778 +Adzgahd|Dghdadj|CA|9252326711 +Ickgahd|Eihdadj|CA|5107357778 +Ibigahd|Dshdadj|CA|5105355778 +Bbggahd|Euhdadj|CA|9253353711 +Icogahd|Eahdadj|CA|5102156178 +Icngahd|Eghdadj|CA|5102056078 +Bbhgahd|Ethdadj|CA|9254354711 +Icrgahd|Fbhdadj|CA|5102456456 +Icpgahd|Ekhdadj|CA|5102256278 +Bbigahd|Eshdadj|CA|9255355711 +Idsgahd|Fdhdadj|CA|5102556556 +Icqgahd|Emhdadj|CA|5102356356 +Bcngahd|Fghdadj|CA|9252056000 +Idtgahd|Fnhdadj|CA|5102656656 +Idugahd|Fbhdadj|CA|5102756756 +Bdtgahd|Gnhdadj|CA|9252656600 +Idvgahd|Fchdadj|CA|5102856856 +Jadgahd|Gyhdadj|CA|5100356701 +Bdxgahd|Hehdadj|CA|9252306709 +Idwgahd|Fdhdadj|CA|5102956956 +Jbegahd|Gxhdadj|CA|5101356701 +Bdygahd|Hfhdadj|CA|9252316719 +Idxgahd|Fehdadj|CA|5102306709 +Jbfgahd|Gwhdadj|CA|5102356701 +Cbfgahd|Iwhdadj|CA|9252356712 +Jcogahd|Hahdadj|CA|5102156755 +Jbigahd|Gshdadj|CA|5105356701 +Cbggahd|Iuhdadj|CA|9253356712 +Jcpgahd|Hkhdadj|CA|5102256755 +Jckgahd|Hihdadj|CA|5107356701 +Ccngahd|Jghdadj|CA|9252056721 +Jcqgahd|Hmhdadj|CA|5102356755 +Jclgahd|Hbhdadj|CA|5108356701 +Cdtgahd|Knhdadj|CA|9252656721 +Jdugahd|Ibhdadj|CA|5102756755 +Jcrgahd|Hbhdadj|CA|5102456755 +Cdugahd|Kbhdadj|CA|9252756721 +Jdxgahd|Iehdadj|CA|5102306755 +Jdsgahd|Hdhdadj|CA|5102556755 +Cdvgahd|Lchdadj|CA|9252856721 +Jdygahd|Ifhdadj|CA|5102316755 +Jdzgahd|Ighdadj|CA|5102326755 +Cdygahd|Lfhdadj|CA|9252316722 +Kbggahd|Juhdadj|CA|5103336704 +Kadgahd|Iyhdadj|CA|5100306704 +Dadgahd|Myhdadj|CA|9250306722 +Kbhgahd|Jthdadj|CA|5104346704 +Kbegahd|Ixhdadj|CA|5101316704 +Dbegahd|Mxhdadj|CA|9251316722 +Kcmgahd|Jxhdadj|CA|5109350704 +Kbfgahd|Jwhdadj|CA|5102326704 +Dbfgahd|Mwhdadj|CA|9252326722 +Kcpgahd|Kkhdadj|CA|5102253704 +Kbigahd|Jshdadj|CA|5105356704 +Dcjgahd|Nphdadj|CA|9256376722 +Kdtgahd|Knhdadj|CA|5102657766 +Kcjgahd|Jphdadj|CA|5106376704 +Dcmgahd|Nxhdadj|CA|9259350732 +Kdxgahd|Lehdadj|CA|5102306166 +Kclgahd|Jbhdadj|CA|5106266704 +Dcngahd|Nghdadj|CA|9252051732 +Kdygahd|Lfhdadj|CA|5102316266 +Kcqgahd|Kmhdadj|CA|5102354766 +Dcpgahd|Nkhdadj|CA|9252253732 +Lbfgahd|Lwhdadj|CA|5102322766 +Kcrgahd|Kbhdadj|CA|5102455766 +Ddxgahd|Pehdadj|CA|9252306145 +Lbigahd|Lshdadj|CA|5105355729 +Kdsgahd|Kdhdadj|CA|5102556766 +Ddygahd|Pfhdadj|CA|9252316245 +Lckgahd|Mihdadj|CA|5107387729 +Kdugahd|Kbhdadj|CA|5102758766 +Ddzgahd|Pghdadj|CA|9252326345 +Lcmgahd|Mxhdadj|CA|5109359729 +Kdzgahd|Lghdadj|CA|5102326366 +Ebggahd|Ruhdadj|CA|9253333745 +Lcqgahd|Mmhdadj|CA|5102354329 +Lbegahd|Lxhdadj|CA|5101311766 +Ecpgahd|Tkhdadj|CA|9252253245 +Ldxgahd|Nehdadj|CA|5102306109 +Ldsgahd|Mdhdadj|CA|5102556529 +Ecqgahd|Tmhdadj|CA|9252354345 +Ldzgahd|Nghdadj|CA|5102326329 +Ldvgahd|Nchdadj|CA|5102859829 +Edsgahd|Tdhdadj|CA|9252556269 +Mbegahd|Nxhdadj|CA|5101311719 +Ldwgahd|Ndhdadj|CA|5102956929 +Edtgahd|Unhdadj|CA|9252657609 +Mbigahd|Nshdadj|CA|5105355759 +Ldygahd|Nfhdadj|CA|5102316219 +Edxgahd|Uehdadj|CA|9252306109 +Mckgahd|Nihdadj|CA|5107387779 +Mbfgahd|Nwhdadj|CA|5102322729 +Fbegahd|Vxhdadj|CA|9251311719 +Mcngahd|Oghdadj|CA|5102051080 +Mclgahd|Obhdadj|CA|5106268789 +Fbggahd|Vuhdadj|CA|9253333739 +Mcogahd|Oahdadj|CA|5102152181 +Mcmgahd|Oxhdadj|CA|5109359799 +Fbhgahd|Vthdadj|CA|9254344749 +Mdtgahd|Onhdadj|CA|5102657686 +Mcqgahd|Omhdadj|CA|5102354383 +Fckgahd|Wihdadj|CA|9257387779 +Mdugahd|Obhdadj|CA|5102758787 +Mcrgahd|Obhdadj|CA|5102455484 +Fcogahd|Wahdadj|CA|9252152181 +Mdvgahd|Ochdadj|CA|5102859888 +Mdxgahd|Pehdadj|CA|5100306109 +Fdsgahd|Xdhdadj|CA|9252556585 +Nbegahd|Pxhdadj|CA|5101311719 +Ncjgahd|Pphdadj|CA|5106376769 +Fdugahd|Xbhdadj|CA|9252758787 +Nbigahd|Pshdadj|CA|5105355759 +Nckgahd|Pihdadj|CA|5107387779 +Fdvgahd|Xchdadj|CA|9252859888 +Nclgahd|Qbhdadj|CA|5106268789 +Ncrgahd|Qbhdadj|CA|5102455484 +Fdwgahd|Xdhdadj|CA|9252956989 +Ncngahd|Qghdadj|CA|5102051080 +Ndtgahd|Qnhdadj|CA|5102657686 +Fdxgahd|Xehdadj|CA|9250306109 +Ncqgahd|Qmhdadj|CA|5102354383 +Ndugahd|Qbhdadj|CA|5102758787 +Gbfgahd|Ywhdadj|CA|9252322729 +Ndsgahd|Qdhdadj|CA|5102556585 +Ndvgahd|Qchdadj|CA|5102859888 +Gbhgahd|Ythdadj|CA|9254344749 +Ndxgahd|Rehdadj|CA|5100306109 +Ndygahd|Rfhdadj|CA|5101316219 +Gclgahd|Zbhdadj|CA|9256268789 +Obhgahd|Rthdadj|CA|6264356776 +Ndzgahd|Rghdadj|CA|5102326329 +Gcqgahd|Zmhdadj|CA|9252354383 +Ocpgahd|Skhdadj|CA|6262256776 +Obggahd|Ruhdadj|CA|6263356776 +Gcrgahd|Zbhdadj|CA|9252455484 +Ocrgahd|Sbhdadj|CA|6262456776 +Obigahd|Rshdadj|CA|6265356776 +Gdvgahd|Achdadj|CA|9252859888 +Odsgahd|Sdhdadj|CA|6262556776 +Oclgahd|Sbhdadj|CA|6268356776 +Gdygahd|Afhdadj|CA|9251316219 +Odvgahd|Tchdadj|CA|6262856776 +Ocmgahd|Sxhdadj|CA|6269356776 +Hbegahd|Bxhdadj|CA|5101356799 +Odxgahd|Tehdadj|CA|6262306767 +Ocogahd|Sahdadj|CA|6262156776 +Hbfgahd|Bwhdadj|CA|5102356799 +Odygahd|Tfhdadj|CA|6262316767 +Ocqgahd|Smhdadj|CA|6262356776 +Hdugahd|Cbhdadj|CA|5102756767 +Odzgahd|Tghdadj|CA|6262326767 +Odugahd|Tbhdadj|CA|6262756776 +Iadgahd|Dyhdadj|CA|5100350767 +Pbegahd|Txhdadj|CA|6261351767 +Padgahd|Tyhdadj|CA|6260350767 +Ibhgahd|Dthdadj|CA|5104354778 +Pbigahd|Tshdadj|CA|6265355767 +Pbfgahd|Twhdadj|CA|6262352767 +Icjgahd|Dphdadj|CA|5106356778 +Pclgahd|Ubhdadj|CA|6268358767 +Pbggahd|Tuhdadj|CA|6263353767 +Iclgahd|Ebhdadj|CA|5108358778 +Pcmgahd|Uxhdadj|CA|6269359767 +Pcjgahd|Uphdadj|CA|6266356767 +Icmgahd|Exhdadj|CA|5109359778 +Pcpgahd|Ukhdadj|CA|6262256267 +Pckgahd|Uihdadj|CA|6267357767 +Idygahd|Gfhdadj|CA|5102316719 +Pdsgahd|Udhdadj|CA|6262556260 +Pcngahd|Ughdadj|CA|6262056067 +Idzgahd|Gghdadj|CA|5102326729 +Pdwgahd|Udhdadj|CA|6262956900 +Pdugahd|Ubhdadj|CA|6262756700 +Jbggahd|Guhdadj|CA|5103356701 +Pdzgahd|Vghdadj|CA|6262326729 +Pdxgahd|Vehdadj|CA|6262306709 +Jbhgahd|Gthdadj|CA|5104356701 +Radgahd|Vyhdadj|CA|6260356700 +Pdygahd|Vfhdadj|CA|6262316719 +Jcjgahd|Gphdadj|CA|5106356701 +Rbhgahd|Vthdadj|CA|6264356700 +Rbggahd|Vuhdadj|CA|6263356700 +Jcmgahd|Hxhdadj|CA|5109356701 +Rcngahd|Wghdadj|CA|6262056700 +Rbigahd|Vshdadj|CA|6265356700 +Jcngahd|Hghdadj|CA|5102056755 +Rcpgahd|Wkhdadj|CA|6262256706 +Rcjgahd|Vphdadj|CA|6266356700 +Jdtgahd|Inhdadj|CA|5102656755 +Rcrgahd|Wbhdadj|CA|6262456706 +Sbfgahd|Xwhdadj|CA|6262326706 +Jdvgahd|Ichdadj|CA|5102856755 +Rdugahd|Wbhdadj|CA|6262756706 +Sbggahd|Xuhdadj|CA|6263336706 +Jdwgahd|Idhdadj|CA|5102956755 +Rdvgahd|Wchdadj|CA|6262856706 +Sbigahd|Xshdadj|CA|6265356740 +Kckgahd|Jihdadj|CA|5107386704 +Rdxgahd|Wehdadj|CA|6262306706 +Scngahd|Xghdadj|CA|6262051740 +Kcngahd|Jghdadj|CA|5102051704 +Rdygahd|Wfhdadj|CA|6262316706 +Scpgahd|Ykhdadj|CA|6262253740 +Kcogahd|Kahdadj|CA|5102152704 +Rdzgahd|Wghdadj|CA|6262326706 +Scqgahd|Ymhdadj|CA|6262354740 +Kdvgahd|Kchdadj|CA|5102859766 +Sadgahd|Xyhdadj|CA|6260306706 +Sdzgahd|Yghdadj|CA|6262326333 +Kdwgahd|Ldhdadj|CA|5102956066 +Sbegahd|Xxhdadj|CA|6261316706 +Ubggahd|Zuhdadj|CA|6263333733 +Ladgahd|Lyhdadj|CA|5100300766 +Sbhgahd|Xthdadj|CA|6264346706 +Ubhgahd|Zthdadj|CA|6264344733 +Lbggahd|Luhdadj|CA|5103333729 +Sckgahd|Xihdadj|CA|6267386740 +Uckgahd|Zihdadj|CA|6267387733 +Lbhgahd|Lthdadj|CA|5104344729 +Sclgahd|Xbhdadj|CA|6266266740 +Ucngahd|Aghdadj|CA|6262051033 +Lcjgahd|Lphdadj|CA|5106376729 +Scogahd|Yahdadj|CA|6262152740 +Ucogahd|Aahdadj|CA|6262152133 +Lclgahd|Mbhdadj|CA|5106268729 +Sdsgahd|Ydhdadj|CA|6262556740 +Ucrgahd|Abhdadj|CA|6262455433 +Lcngahd|Mghdadj|CA|5102051029 +Sdvgahd|Ychdadj|CA|6262859740 +Udsgahd|Adhdadj|CA|6262556533 +Lcogahd|Mahdadj|CA|5102152129 +Sdwgahd|Ydhdadj|CA|6262956040 +Udwgahd|Adhdadj|CA|6262956933 +Lcpgahd|Mkhdadj|CA|5102253229 +Sdxgahd|Yehdadj|CA|6262306140 +Udzgahd|Bghdadj|CA|6262326329 +Lcrgahd|Mbhdadj|CA|5102455429 +Ubfgahd|Zwhdadj|CA|6262322733 +Vbfgahd|Bwhdadj|CA|6262322729 +Ldtgahd|Mnhdadj|CA|5102657629 +Ucjgahd|Zphdadj|CA|6266376733 +Vcjgahd|Bphdadj|CA|6266376769 +Ldugahd|Mbhdadj|CA|5102758729 +Ucpgahd|Akhdadj|CA|6262253233 +Vcmgahd|Cxhdadj|CA|6269359799 +Madgahd|Nyhdadj|CA|5100300709 +Udvgahd|Achdadj|CA|6262859833 +Vcpgahd|Ckhdadj|CA|6262253282 +Mbggahd|Nuhdadj|CA|5103333739 +Udygahd|Bfhdadj|CA|6262316219 +Vdxgahd|Cehdadj|CA|6260306109 +Mbhgahd|Nthdadj|CA|5104344749 +Vadgahd|Byhdadj|CA|6260300709 +Vdygahd|Cfhdadj|CA|6261316219 +Mcjgahd|Nphdadj|CA|5106376769 +Vbegahd|Bxhdadj|CA|6261311719 +Vdzgahd|Cghdadj|CA|6262326329 +Mcpgahd|Okhdadj|CA|5102253282 +Vbhgahd|Bthdadj|CA|6264344749 +Wadgahd|Dyhdadj|CA|6260300709 +Mdsgahd|Odhdadj|CA|5102556585 +Vbigahd|Bshdadj|CA|6265355759 +Wbggahd|Duhdadj|CA|6263333739 +Mdwgahd|Pdhdadj|CA|5102956989 +Vckgahd|Bihdadj|CA|6267387779 +Wcjgahd|Dphdadj|CA|6266376769 +Mdygahd|Pfhdadj|CA|5101316219 +Vclgahd|Bbhdadj|CA|6266268789 +Wcmgahd|Dxhdadj|CA|6269359799 +Mdzgahd|Pghdadj|CA|5102326329 +Vcqgahd|Cmhdadj|CA|6262354383 +Wdvgahd|Echdadj|CA|6262859888 +Nadgahd|Pyhdadj|CA|5100300709 +Vdugahd|Cbhdadj|CA|6262758787 +Wdygahd|Efhdadj|CA|6261316219 +Nbfgahd|Pwhdadj|CA|5102322729 +Vdvgahd|Cchdadj|CA|6262859888 +Xbegahd|Exhdadj|CA|5101356790 +Nbggahd|Puhdadj|CA|5103333739 +Vdwgahd|Cdhdadj|CA|6262956989 +Xbfgahd|Ewhdadj|CA|5102356790 +Nbhgahd|Pthdadj|CA|5104344749 +Wbfgahd|Dwhdadj|CA|6262322729 +Xbggahd|Euhdadj|CA|5103356790 +Ncmgahd|Qxhdadj|CA|5109359799 +Wbhgahd|Dthdadj|CA|6264344749 +Xbhgahd|Ethdadj|CA|5104356790 +Ncogahd|Qahdadj|CA|5102152181 +Wcogahd|Dahdadj|CA|6262152181 +Xcjgahd|Ephdadj|CA|5106356790 +Ncpgahd|Qkhdadj|CA|5102253282 +Wcpgahd|Dkhdadj|CA|6262253282 +Xcngahd|Fghdadj|CA|5102056790 +Ndwgahd|Qdhdadj|CA|5102956989 +Wcqgahd|Emhdadj|CA|6262354383 +Xdsgahd|Fdhdadj|CA|5102556779 +Oadgahd|Ryhdadj|CA|6260356776 +Wdugahd|Ebhdadj|CA|6262758787 +Xdugahd|Fbhdadj|CA|5102756779 +Obegahd|Rxhdadj|CA|6261356776 +Wdxgahd|Eehdadj|CA|6260306109 +Xdygahd|Ffhdadj|CA|5102316779 +Obfgahd|Rwhdadj|CA|6262356776 +Xbigahd|Eshdadj|CA|5105356790 +Yadgahd|Gyhdadj|CA|5100350779 +Ocjgahd|Sphdadj|CA|6266356776 +Xckgahd|Eihdadj|CA|5107356790 +Ybegahd|Gxhdadj|CA|5101351779 +Ockgahd|Sihdadj|CA|6267356776 +Xcmgahd|Fxhdadj|CA|5109356790 +Ybfgahd|Gwhdadj|CA|5102352779 +Ocngahd|Sghdadj|CA|6262056776 +Xcpgahd|Fkhdadj|CA|5102256779 +Ybhgahd|Gthdadj|CA|5104354779 +Odtgahd|Snhdadj|CA|6262656776 +Xdvgahd|Fchdadj|CA|5102856779 +Ycjgahd|Gphdadj|CA|5106356779 +Odwgahd|Tdhdadj|CA|6262956776 +Xdwgahd|Fdhdadj|CA|5102956779 +Yclgahd|Gbhdadj|CA|5108358744 +Pbhgahd|Tthdadj|CA|6264354767 +Xdxgahd|Fehdadj|CA|5102306779 +Ycpgahd|Gkhdadj|CA|5102256244 +Pcogahd|Uahdadj|CA|6262156167 +Ybigahd|Gshdadj|CA|5105355779 +Ydtgahd|Hnhdadj|CA|5102656644 +Pcqgahd|Umhdadj|CA|6262356367 +Yckgahd|Gihdadj|CA|5107357779 +Ydwgahd|Hdhdadj|CA|5102956944 +Pcrgahd|Ubhdadj|CA|6262456467 +Ycogahd|Gahdadj|CA|5102156144 +Ydxgahd|Hehdadj|CA|5102306709 +Pdtgahd|Unhdadj|CA|6262656600 +Ycqgahd|Gmhdadj|CA|5102356344 +Ydygahd|Hfhdadj|CA|5102316719 +Pdvgahd|Uchdadj|CA|6262856800 +Ydsgahd|Hdhdadj|CA|5102556544 +Ydzgahd|Hghdadj|CA|5102326729 +Rbegahd|Vxhdadj|CA|6261356700 +Ydvgahd|Hchdadj|CA|5102856844 +Zadgahd|Hyhdadj|CA|5100356744 +Rbfgahd|Vwhdadj|CA|6262356700 +Zbegahd|Hxhdadj|CA|5101356744 +Zbfgahd|Hwhdadj|CA|5102356744 +Rckgahd|Vihdadj|CA|6267356700 +Zcogahd|Iahdadj|CA|5102156766 +Zbhgahd|Hthdadj|CA|5104356766 +Rclgahd|Wbhdadj|CA|6268356700 +Zcpgahd|Ikhdadj|CA|5102256766 +Zcjgahd|Iphdadj|CA|5106356766 +Rcmgahd|Wxhdadj|CA|6269356700 +Zdwgahd|Jdhdadj|CA|5102956751 +Zcmgahd|Ixhdadj|CA|5109356766 +Rcogahd|Wahdadj|CA|6262156700 +Zdygahd|Jfhdadj|CA|5102316751 +Zdvgahd|Jchdadj|CA|5102856751 +Rcqgahd|Wmhdadj|CA|6262356706 +Kefgahd|Jwhdadj|CA|5102326751 +Kedgahd|Jyhdadj|CA|5100306751 +Rdsgahd|Wdhdadj|CA|6262556706 +Keigahd|Jshdadj|CA|5105356751 +Keegahd|Jxhdadj|CA|5101316751 +Rdtgahd|Wnhdadj|CA|6262656706 +Kemgahd|Kxhdadj|CA|5109350751 +Kehgahd|Jthdadj|CA|5104346751 +Rdwgahd|Wdhdadj|CA|6262956706 +Kengahd|Kghdadj|CA|5102051751 +Kelgahd|Jbhdadj|CA|5106266751 +Scjgahd|Xphdadj|CA|6266376740 +Kepgahd|Kkhdadj|CA|5102253751 +Keqgahd|Kmhdadj|CA|5102354762 +Scmgahd|Xxhdadj|CA|6269350740 +Kesgahd|Kdhdadj|CA|5102556762 +Ketgahd|Knhdadj|CA|5102657762 +Scrgahd|Ybhdadj|CA|6262455740 +Kewgahd|Kdhdadj|CA|5102956062 +Kezgahd|Kghdadj|CA|5102326362 +Sdtgahd|Ynhdadj|CA|6262657740 +Kexgahd|Kehdadj|CA|5102306162 +Liggahd|Luhdadj|CA|5103333762 +Sdugahd|Ybhdadj|CA|6262758740 +Lidgahd|Lyhdadj|CA|5100300762 +Likgahd|Lihdadj|CA|5107387762 +Sdygahd|Yfhdadj|CA|6262316233 +Liegahd|Lxhdadj|CA|5101311762 +Lilgahd|Lbhdadj|CA|5106268762 +Uadgahd|Zyhdadj|CA|6260300733 +Liigahd|Lshdadj|CA|5105355762 +Lipgahd|Lkhdadj|CA|5102253288 +Ubegahd|Zxhdadj|CA|6261311733 +Lijgahd|Lphdadj|CA|5106376762 +Liygahd|Mfhdadj|CA|5102316219 +Ubigahd|Zshdadj|CA|6265355733 +Liqgahd|Lmhdadj|CA|5102354388 +Moegahd|Mxhdadj|CA|5101311719 +Uclgahd|Zbhdadj|CA|6266268733 +Lirgahd|Mbhdadj|CA|5102455488 +Moggahd|Muhdadj|CA|5103333739 +Ucmgahd|Axhdadj|CA|6269359733 +Litgahd|Mnhdadj|CA|5102657688 +Mohgahd|Mthdadj|CA|5104344749 +Ucqgahd|Amhdadj|CA|6262354333 +Liugahd|Mbhdadj|CA|5102758788 +Momgahd|Nxhdadj|CA|5109359799 +Udtgahd|Anhdadj|CA|6262657633 +Lizgahd|Mghdadj|CA|5102326329 +Moqgahd|Nmhdadj|CA|5102354383 +Udugahd|Abhdadj|CA|6262758733 +Modgahd|Myhdadj|CA|5100300709 +Motgahd|Nnhdadj|CA|5102657686 +Udxgahd|Aehdadj|CA|6262306109 +Mongahd|Nghdadj|CA|5102051080 +Movgahd|Nchdadj|CA|5102859888 +Vbggahd|Buhdadj|CA|6263333739 +Mopgahd|Nkhdadj|CA|5102253282 +Mozgahd|Oghdadj|CA|5102326329 +Vcngahd|Cghdadj|CA|6262051080 +Mosgahd|Ndhdadj|CA|5102556585 +Nufgahd|Owhdadj|CA|5102322729 +Vcogahd|Cahdadj|CA|6262152181 +Mowgahd|Ndhdadj|CA|5102956989 +Nuggahd|Ouhdadj|CA|5103333739 +Vcrgahd|Cbhdadj|CA|6262455484 +Nudgahd|Oyhdadj|CA|5100300709 +Nuhgahd|Othdadj|CA|5104344749 +Vdsgahd|Cdhdadj|CA|6262556585 +Nujgahd|Ophdadj|CA|5106376769 +Nukgahd|Oihdadj|CA|5107387779 +Vdtgahd|Cnhdadj|CA|6262657686 +Numgahd|Pxhdadj|CA|5109359799 +Nulgahd|Pbhdadj|CA|5106268789 +Wbegahd|Dxhdadj|CA|6261311719 +Nungahd|Pghdadj|CA|5102051080 +Nuxgahd|Qehdadj|CA|5100306109 +Wbigahd|Dshdadj|CA|6265355759 +Nuogahd|Pahdadj|CA|5102152181 +Nuygahd|Qfhdadj|CA|5101316219 +Wckgahd|Dihdadj|CA|6267387779 +Nuqgahd|Pmhdadj|CA|5102354383 +Badgahd|Eyhdadj|CA|8180350711 +Wclgahd|Dbhdadj|CA|6266268789 +Nurgahd|Pbhdadj|CA|5102455484 +Bbfgahd|Ewhdadj|CA|8182352711 +Wcngahd|Dghdadj|CA|6262051080 +Nutgahd|Pnhdadj|CA|5102657686 +Bcjgahd|Fphdadj|CA|8186356711 +Wcrgahd|Ebhdadj|CA|6262455484 +Nuugahd|Pbhdadj|CA|5102758787 +Bclgahd|Fbhdadj|CA|8188358700 +Wdsgahd|Edhdadj|CA|6262556585 +Nuzgahd|Qghdadj|CA|5102326329 +Bcogahd|Fahdadj|CA|8182156100 +Wdtgahd|Enhdadj|CA|6262657686 +Aadgahd|Ayhdadj|CA|8180356710 +Bcqgahd|Gmhdadj|CA|8182356300 +Wdwgahd|Edhdadj|CA|6262956989 +Abhgahd|Athdadj|CA|8184356710 +Bcrgahd|Gbhdadj|CA|8182456400 +Wdzgahd|Eghdadj|CA|6262326329 +Ackgahd|Bihdadj|CA|8187356710 +Bdvgahd|Gchdadj|CA|8182856800 +Xadgahd|Eyhdadj|CA|5100356790 +Aclgahd|Bbhdadj|CA|8188356710 +Cadgahd|Iyhdadj|CA|8180356712 +Xclgahd|Fbhdadj|CA|5108356790 +Acmgahd|Bxhdadj|CA|8189356701 +Cbegahd|Ixhdadj|CA|8162656712 +Xcogahd|Fahdadj|CA|5102156790 +Acpgahd|Bkhdadj|CA|8182256701 +Cbhgahd|Ithdadj|CA|8184356712 +Xcqgahd|Fmhdadj|CA|5102356779 +Adtgahd|Cnhdadj|CA|8182656701 +Ccmgahd|Jxhdadj|CA|8189356721 +Xcrgahd|Fbhdadj|CA|5102456779 +Advgahd|Dchdadj|CA|8182856701 +Ccogahd|Jahdadj|CA|8182156721 +Xdtgahd|Fnhdadj|CA|5102656779 +Adxgahd|Dehdadj|CA|8182306711 +Ccpgahd|Kkhdadj|CA|8182256721 +Xdzgahd|Fghdadj|CA|5102326779 +Adygahd|Dfhdadj|CA|8182316711 +Ccqgahd|Kmhdadj|CA|8182356721 +Ybggahd|Guhdadj|CA|5103353779 +Bbegahd|Axhdadj|CA|8162651711 +Cdwgahd|Ldhdadj|CA|8182956721 +Ycmgahd|Gxhdadj|CA|5109359744 +Bckgahd|Fihdadj|CA|8187357700 +Cdzgahd|Lghdadj|CA|8182326722 +Ycngahd|Gghdadj|CA|5102056044 +Bcmgahd|Fxhdadj|CA|8189359700 +Dbggahd|Muhdadj|CA|8183336722 +Ycrgahd|Gbhdadj|CA|5102456444 +Bcpgahd|Gkhdadj|CA|8182256200 +Dckgahd|Nihdadj|CA|8187386722 +Ydugahd|Hbhdadj|CA|5102756744 +Bdsgahd|Gdhdadj|CA|8182556260 +Dcogahd|Nahdadj|CA|8182152732 +Zbggahd|Huhdadj|CA|5103356766 +Bdugahd|Gbhdadj|CA|8182756700 +Dcrgahd|Obhdadj|CA|8182455732 +Zbigahd|Ishdadj|CA|5105356766 +Bdwgahd|Hdhdadj|CA|8182956900 +Ddsgahd|Odhdadj|CA|8182556732 +Zckgahd|Iihdadj|CA|5107356766 +Bdzgahd|Hghdadj|CA|8182326729 +Ddtgahd|Onhdadj|CA|8182657732 +Zclgahd|Ibhdadj|CA|5108356766 +Cbigahd|Ishdadj|CA|8185356712 +Ddugahd|Obhdadj|CA|8182758732 +Zcngahd|Ighdadj|CA|5102056766 +Ccjgahd|Jphdadj|CA|8186356712 +Eadgahd|Ryhdadj|CA|8180300745 +Zcqgahd|Imhdadj|CA|5102356766 +Cckgahd|Jihdadj|CA|8187356712 +Ebegahd|Rxhdadj|CA|8162611745 +Zcrgahd|Ibhdadj|CA|5102456766 +Cclgahd|Jbhdadj|CA|8188356721 +Ebfgahd|Rwhdadj|CA|8182322745 +Zdsgahd|Idhdadj|CA|5102556766 +Ccrgahd|Kbhdadj|CA|8182456721 +Ebhgahd|Rthdadj|CA|8184344745 +Zdtgahd|Inhdadj|CA|5102656766 +Cdsgahd|Kdhdadj|CA|8182556721 +Eckgahd|Sihdadj|CA|8187387745 +Zdugahd|Ibhdadj|CA|5102756766 +Cdxgahd|Lehdadj|CA|8182306721 +Ecmgahd|Sxhdadj|CA|8189359745 +Zdxgahd|Jehdadj|CA|5102306751 +Dbhgahd|Mthdadj|CA|8184346722 +Ecogahd|Tahdadj|CA|8182152145 +Zdzgahd|Jghdadj|CA|5102326751 +Dbigahd|Nshdadj|CA|8185356722 +Ecrgahd|Tbhdadj|CA|8182455445 +Keggahd|Juhdadj|CA|5103336751 +Dclgahd|Nbhdadj|CA|8186266732 +Edugahd|Ubhdadj|CA|8182758709 +Kejgahd|Jphdadj|CA|5106376751 +Dcqgahd|Omhdadj|CA|8182354732 +Edvgahd|Uchdadj|CA|8182859809 +Kekgahd|Jihdadj|CA|5107386751 +Ddvgahd|Ochdadj|CA|8182859732 +Edzgahd|Vghdadj|CA|8182326329 +Keogahd|Kahdadj|CA|5102152751 +Ddwgahd|Odhdadj|CA|8182956045 +Fadgahd|Vyhdadj|CA|8180300709 +Kergahd|Kbhdadj|CA|5102455762 +Ebigahd|Sshdadj|CA|8185355745 +Fbigahd|Wshdadj|CA|8185355759 +Keugahd|Kbhdadj|CA|5102758762 +Ecjgahd|Sphdadj|CA|8186376745 +Fcjgahd|Wphdadj|CA|8186376769 +Kevgahd|Kchdadj|CA|5102859762 +Eclgahd|Sbhdadj|CA|8186268745 +Fclgahd|Wbhdadj|CA|8186268789 +Keygahd|Kfhdadj|CA|5102316262 +Ecngahd|Sghdadj|CA|8182031045 +Fcngahd|Wghdadj|CA|8182031080 +Lifgahd|Lwhdadj|CA|5102322762 +Edwgahd|Udhdadj|CA|8182956909 +Fcpgahd|Wkhdadj|CA|8182253282 +Lihgahd|Lthdadj|CA|5104344762 +Edygahd|Vfhdadj|CA|8182316219 +Fdtgahd|Xnhdadj|CA|8182657686 +Limgahd|Lxhdadj|CA|5109359762 +Fbfgahd|Vwhdadj|CA|8182322729 +Fdygahd|Yfhdadj|CA|8162616219 +Lingahd|Lghdadj|CA|5102051088 +Fcmgahd|Wxhdadj|CA|8189359799 +Gbigahd|Zshdadj|CA|8185355759 +Liogahd|Lahdadj|CA|5102152188 +Fcqgahd|Xmhdadj|CA|8182354383 +Gckgahd|Zihdadj|CA|8187387779 +Lisgahd|Mdhdadj|CA|5102556588 +Fcrgahd|Xbhdadj|CA|8182455484 +Gcmgahd|Zxhdadj|CA|8189359799 +Livgahd|Mchdadj|CA|5102859888 +Fdzgahd|Yghdadj|CA|8182326329 +Gcogahd|Zahdadj|CA|8182152181 +Liwgahd|Mdhdadj|CA|5102956988 +Gadgahd|Yyhdadj|CA|8180300709 +Gcpgahd|Zkhdadj|CA|8182253282 +Lixgahd|Mehdadj|CA|5102306109 +Gbegahd|Yxhdadj|CA|8162611719 +Gdtgahd|Anhdadj|CA|8182657686 +Mofgahd|Mwhdadj|CA|5102322729 +Gbggahd|Yuhdadj|CA|8183333739 +Gdugahd|Abhdadj|CA|8182758787 +Moigahd|Mshdadj|CA|5105355759 +Gcjgahd|Zphdadj|CA|8186376769 +Gdwgahd|Adhdadj|CA|8182956989 +Mojgahd|Nphdadj|CA|5106376769 +Gcngahd|Zghdadj|CA|8182031080 +Gdxgahd|Aehdadj|CA|8180306109 +Mokgahd|Nihdadj|CA|5107387779 +Gdsgahd|Adhdadj|CA|8182556585 +Hadgahd|Byhdadj|CA|6260356799 +Molgahd|Nbhdadj|CA|5106268789 +Gdzgahd|Aghdadj|CA|8182326329 +Hbigahd|Bshdadj|CA|6265356799 +Moogahd|Nahdadj|CA|5102152181 +Hbggahd|Buhdadj|CA|6263356799 +Hcjgahd|Bphdadj|CA|6266356799 +Morgahd|Nbhdadj|CA|5102455484 +Hbhgahd|Bthdadj|CA|6264356799 +Hckgahd|Bihdadj|CA|6267356799 +Mougahd|Nbhdadj|CA|5102758787 +Hcmgahd|Bxhdadj|CA|6269356799 +Hclgahd|Bbhdadj|CA|6268356799 +Moxgahd|Nehdadj|CA|5100306109 +Hcogahd|Bahdadj|CA|6262156799 +Hcngahd|Bghdadj|CA|6262056799 +Moygahd|Ofhdadj|CA|5101316219 +Hcqgahd|Cmhdadj|CA|6262356767 +Hcpgahd|Ckhdadj|CA|6262256767 +Nuegahd|Oxhdadj|CA|5101311719 +Hcrgahd|Cbhdadj|CA|6262456767 +Hdsgahd|Cdhdadj|CA|6262556767 +Nuigahd|Oshdadj|CA|5105355759 +Hdvgahd|Cchdadj|CA|6262856767 +Hdtgahd|Cnhdadj|CA|6262656767 +Nupgahd|Pkhdadj|CA|5102253282 +Hdwgahd|Cdhdadj|CA|6262956767 +Hdzgahd|Dghdadj|CA|6262326767 +Nusgahd|Pdhdadj|CA|5102556585 +Hdxgahd|Cehdadj|CA|6262306767 +Ibegahd|Dxhdadj|CA|6261351778 +Nuvgahd|Pchdadj|CA|5102859888 +Hdygahd|Dfhdadj|CA|6262316767 +Ibfgahd|Dwhdadj|CA|6262352778 +Nuwgahd|Pdhdadj|CA|5102956989 +Ibggahd|Duhdadj|CA|6263353778 +Ibigahd|Dshdadj|CA|6265355778 +Abegahd|Axhdadj|CA|8162656710 +Ickgahd|Eihdadj|CA|6267357778 +Icngahd|Eghdadj|CA|6262056078 +Abfgahd|Awhdadj|CA|8182356710 +Icogahd|Eahdadj|CA|6262156178 +Icpgahd|Ekhdadj|CA|6262256278 +Abggahd|Auhdadj|CA|8183356710 +Icrgahd|Fbhdadj|CA|6262456456 +Icqgahd|Emhdadj|CA|6262356356 +Abigahd|Ashdadj|CA|8185356710 +Idsgahd|Fdhdadj|CA|6262556556 +Idugahd|Fbhdadj|CA|6262756756 +Acjgahd|Bphdadj|CA|8186356710 +Idtgahd|Fnhdadj|CA|6262656656 +Jadgahd|Gyhdadj|CA|6260356701 +Acngahd|Bghdadj|CA|8182056701 +Idvgahd|Fchdadj|CA|6262856856 +Jbegahd|Gxhdadj|CA|6261356701 +Acogahd|Bahdadj|CA|8182156701 +Idwgahd|Fdhdadj|CA|6262956956 +Jbfgahd|Gwhdadj|CA|6262356701 +Acqgahd|Cmhdadj|CA|8182356701 +Idxgahd|Fehdadj|CA|6262306709 +Jbigahd|Gshdadj|CA|6265356701 +Acrgahd|Cbhdadj|CA|8182456701 +Jcogahd|Hahdadj|CA|6262156755 +Jckgahd|Hihdadj|CA|6267356701 +Adsgahd|Cdhdadj|CA|8182556701 +Jcpgahd|Hkhdadj|CA|6262256755 +Jclgahd|Hbhdadj|CA|6268356701 +Adugahd|Cbhdadj|CA|8182756701 +Jcqgahd|Hmhdadj|CA|6262356755 +Jcrgahd|Hbhdadj|CA|6262456755 +Adwgahd|Ddhdadj|CA|8182956711 +Jdugahd|Ibhdadj|CA|6262756755 +Jdsgahd|Hdhdadj|CA|6262556755 +Adzgahd|Dghdadj|CA|8182326711 +Jdxgahd|Iehdadj|CA|6262306755 +Jdzgahd|Ighdadj|CA|6262326755 +Bbggahd|Euhdadj|CA|8183353711 +Jdygahd|Ifhdadj|CA|6262316755 +Kadgahd|Iyhdadj|CA|6260306704 +Bbhgahd|Ethdadj|CA|8184354711 +Kbggahd|Juhdadj|CA|6263336704 +Kbegahd|Ixhdadj|CA|6261316704 +Bbigahd|Eshdadj|CA|8185355711 +Kbhgahd|Jthdadj|CA|6264346704 +Kbfgahd|Jwhdadj|CA|6262326704 +Bcngahd|Fghdadj|CA|8182056000 +Kcmgahd|Jxhdadj|CA|6269350704 +Kbigahd|Jshdadj|CA|6265356704 +Bdtgahd|Gnhdadj|CA|8182656600 +Kcpgahd|Kkhdadj|CA|6262253704 +Kcjgahd|Jphdadj|CA|6266376704 +Bdxgahd|Hehdadj|CA|8182306709 +Kdtgahd|Knhdadj|CA|6262657766 +Kclgahd|Jbhdadj|CA|6266266704 +Bdygahd|Hfhdadj|CA|8182316719 +Kdxgahd|Lehdadj|CA|6262306166 +Kcqgahd|Kmhdadj|CA|6262354766 +Cbfgahd|Iwhdadj|CA|8182356712 +Kdygahd|Lfhdadj|CA|6262316266 +Kcrgahd|Kbhdadj|CA|6262455766 +Cbggahd|Iuhdadj|CA|8183356712 +Lbfgahd|Lwhdadj|CA|6262322766 +Kdsgahd|Kdhdadj|CA|6262556766 +Ccngahd|Jghdadj|CA|8182056721 +Lbigahd|Lshdadj|CA|6265355729 +Kdugahd|Kbhdadj|CA|6262758766 +Cdtgahd|Knhdadj|CA|8182656721 +Lckgahd|Mihdadj|CA|6267387729 +Kdzgahd|Lghdadj|CA|6262326366 +Cdugahd|Kbhdadj|CA|8182756721 +Lcmgahd|Mxhdadj|CA|6269359729 +Lbegahd|Lxhdadj|CA|6261311766 +Cdvgahd|Lchdadj|CA|8182856721 +Lcqgahd|Mmhdadj|CA|6262354329 +Ldsgahd|Mdhdadj|CA|6262556529 +Cdygahd|Lfhdadj|CA|8182316722 +Ldxgahd|Nehdadj|CA|6262306109 +Ldvgahd|Nchdadj|CA|6262859829 +Dadgahd|Myhdadj|CA|8180306722 +Ldzgahd|Nghdadj|CA|6262326329 +Ldwgahd|Ndhdadj|CA|6262956929 +Dbegahd|Mxhdadj|CA|8162616722 +Mbegahd|Nxhdadj|CA|6261311719 +Ldygahd|Nfhdadj|CA|6262316219 +Dbfgahd|Mwhdadj|CA|8182326722 +Mbigahd|Nshdadj|CA|6265355759 +Mbfgahd|Nwhdadj|CA|6262322729 +Dcjgahd|Nphdadj|CA|8186376722 +Mckgahd|Nihdadj|CA|6267387779 +Mclgahd|Obhdadj|CA|6266268789 +Dcmgahd|Nxhdadj|CA|8189350732 +Mcngahd|Oghdadj|CA|6262031080 +Mcmgahd|Oxhdadj|CA|6269359799 +Dcngahd|Nghdadj|CA|8182051732 +Mcogahd|Oahdadj|CA|6262152181 +Mcqgahd|Omhdadj|CA|6262354383 +Dcpgahd|Nkhdadj|CA|8182253732 +Mdtgahd|Onhdadj|CA|6262657686 +Mcrgahd|Obhdadj|CA|6262455484 +Ddxgahd|Pehdadj|CA|8182306145 +Mdugahd|Obhdadj|CA|6262758787 +Mdxgahd|Pehdadj|CA|6260306109 +Ddygahd|Pfhdadj|CA|8182316245 +Mdvgahd|Ochdadj|CA|6262859888 +Ncjgahd|Pphdadj|CA|6266376769 +Ddzgahd|Pghdadj|CA|8182326345 +Nbegahd|Pxhdadj|CA|6261311719 +Nckgahd|Pihdadj|CA|6267387779 +Ebggahd|Ruhdadj|CA|8183333745 +Nbigahd|Pshdadj|CA|6265355759 +Ncrgahd|Qbhdadj|CA|6262455484 +Ecpgahd|Tkhdadj|CA|8182253245 +Nclgahd|Qbhdadj|CA|6266268789 +Ndtgahd|Qnhdadj|CA|6262657686 +Ecqgahd|Tmhdadj|CA|8182354345 +Ncngahd|Qghdadj|CA|6262031080 +Ndugahd|Qbhdadj|CA|6262758787 +Edsgahd|Tdhdadj|CA|8182556269 +Ncqgahd|Qmhdadj|CA|6262354383 +Ndvgahd|Qchdadj|CA|6262859888 +Edtgahd|Unhdadj|CA|8182657609 +Ndsgahd|Qdhdadj|CA|6262556585 +Ndygahd|Rfhdadj|CA|6261316219 +Edxgahd|Uehdadj|CA|8182306109 +Ndxgahd|Rehdadj|CA|6260306109 +Ndzgahd|Rghdadj|CA|6262326329 +Fbegahd|Vxhdadj|CA|8162611719 +Obhgahd|Rthdadj|CA|6264356776 +Obggahd|Ruhdadj|CA|6263356776 +Fbggahd|Vuhdadj|CA|8183333739 +Ocpgahd|Skhdadj|CA|6262256776 +Obigahd|Rshdadj|CA|6265356776 +Fbhgahd|Vthdadj|CA|8184344749 +Ocrgahd|Sbhdadj|CA|6262456776 +Oclgahd|Sbhdadj|CA|6268356776 +Fckgahd|Wihdadj|CA|8187387779 +Odsgahd|Sdhdadj|CA|6262556776 +Ocmgahd|Sxhdadj|CA|6269356776 +Fcogahd|Wahdadj|CA|8182152181 +Odvgahd|Tchdadj|CA|6262856776 +Ocogahd|Sahdadj|CA|6262156776 +Fdsgahd|Xdhdadj|CA|8182556585 +Odxgahd|Tehdadj|CA|6262306767 +Ocqgahd|Smhdadj|CA|6262356776 +Fdugahd|Xbhdadj|CA|8182758787 +Odygahd|Tfhdadj|CA|6262316767 +Odugahd|Tbhdadj|CA|6262756776 +Fdvgahd|Xchdadj|CA|8182859888 +Odzgahd|Tghdadj|CA|6262326767 +Padgahd|Tyhdadj|CA|6260350767 +Fdwgahd|Xdhdadj|CA|8182956989 +Pbegahd|Txhdadj|CA|6261351767 +Pbfgahd|Twhdadj|CA|6262352767 +Fdxgahd|Xehdadj|CA|8180306109 +Pbigahd|Tshdadj|CA|6265355767 +Pbggahd|Tuhdadj|CA|6263353767 +Gbfgahd|Ywhdadj|CA|8182322729 +Pclgahd|Ubhdadj|CA|6268358767 +Pcjgahd|Uphdadj|CA|6266356767 +Gbhgahd|Ythdadj|CA|8184344749 +Pcmgahd|Uxhdadj|CA|6269359767 +Pckgahd|Uihdadj|CA|6267357767 +Gclgahd|Zbhdadj|CA|8186268789 +Pcpgahd|Ukhdadj|CA|6262256267 +Pcngahd|Ughdadj|CA|6262056067 +Gcqgahd|Zmhdadj|CA|8182354383 +Pdsgahd|Udhdadj|CA|6262556260 +Pdugahd|Ubhdadj|CA|6262756700 +Gcrgahd|Zbhdadj|CA|8182455484 +Pdwgahd|Udhdadj|CA|6262956900 +Pdxgahd|Vehdadj|CA|6262306709 +Gdvgahd|Achdadj|CA|8182859888 +Pdzgahd|Vghdadj|CA|6262326729 +Pdygahd|Vfhdadj|CA|6262316719 +Gdygahd|Afhdadj|CA|8162616219 +Radgahd|Vyhdadj|CA|6260356700 +Rbggahd|Vuhdadj|CA|6263356700 +Hbegahd|Bxhdadj|CA|6261356799 +Rbhgahd|Vthdadj|CA|6264356700 +Rbigahd|Vshdadj|CA|6265356700 +Hbfgahd|Bwhdadj|CA|6262356799 +Rcngahd|Wghdadj|CA|6262056700 +Rcjgahd|Vphdadj|CA|6266356700 +Hdugahd|Cbhdadj|CA|6262756767 +Rcpgahd|Wkhdadj|CA|6262256706 +Sbfgahd|Xwhdadj|CA|6262326706 +Iadgahd|Dyhdadj|CA|6260350767 +Rcrgahd|Wbhdadj|CA|6262456706 +Sbggahd|Xuhdadj|CA|6263336706 +Ibhgahd|Dthdadj|CA|6264354778 +Rdugahd|Wbhdadj|CA|6262756706 +Sbigahd|Xshdadj|CA|6265356740 +Icjgahd|Dphdadj|CA|6266356778 +Rdvgahd|Wchdadj|CA|6262856706 +Scngahd|Xghdadj|CA|6262051740 +Iclgahd|Ebhdadj|CA|6268358778 +Rdxgahd|Wehdadj|CA|6262306706 +Scpgahd|Ykhdadj|CA|6262253740 +Icmgahd|Exhdadj|CA|6269359778 +Rdygahd|Wfhdadj|CA|6262316706 +Scqgahd|Ymhdadj|CA|6262354740 +Idygahd|Gfhdadj|CA|6262316719 +Rdzgahd|Wghdadj|CA|6262326706 +Sdzgahd|Yghdadj|CA|6262326333 +Idzgahd|Gghdadj|CA|6262326729 +Sadgahd|Xyhdadj|CA|6260306706 +Ubggahd|Zuhdadj|CA|6263333733 +Jbggahd|Guhdadj|CA|6263356701 +Sbegahd|Xxhdadj|CA|6261316706 +Ubhgahd|Zthdadj|CA|6264344733 +Jbhgahd|Gthdadj|CA|6264356701 +Sbhgahd|Xthdadj|CA|6264346706 +Uckgahd|Zihdadj|CA|6267387733 +Jcjgahd|Gphdadj|CA|6266356701 +Sckgahd|Xihdadj|CA|6267386740 +Ucngahd|Aghdadj|CA|6262031033 +Jcmgahd|Hxhdadj|CA|6269356701 +Sclgahd|Xbhdadj|CA|6266266740 +Ucogahd|Aahdadj|CA|6262152133 +Jcngahd|Hghdadj|CA|6262056755 +Scogahd|Yahdadj|CA|6262152740 +Ucrgahd|Abhdadj|CA|6262455433 +Jdtgahd|Inhdadj|CA|6262656755 +Sdsgahd|Ydhdadj|CA|6262556740 +Udsgahd|Adhdadj|CA|6262556533 +Jdvgahd|Ichdadj|CA|6262856755 +Sdvgahd|Ychdadj|CA|6262859740 +Udwgahd|Adhdadj|CA|6262956933 +Jdwgahd|Idhdadj|CA|6262956755 +Sdwgahd|Ydhdadj|CA|6262956040 +Udzgahd|Bghdadj|CA|6262326329 +Kckgahd|Jihdadj|CA|6267386704 +Sdxgahd|Yehdadj|CA|6262306140 +Vbfgahd|Bwhdadj|CA|6262322729 +Kcngahd|Jghdadj|CA|6262051704 +Ubfgahd|Zwhdadj|CA|6262322733 +Vcjgahd|Bphdadj|CA|6266376769 +Kcogahd|Kahdadj|CA|6262152704 +Ucjgahd|Zphdadj|CA|6266376733 +Vcmgahd|Cxhdadj|CA|6269359799 +Kdvgahd|Kchdadj|CA|6262859766 +Ucpgahd|Akhdadj|CA|6262253233 +Vcpgahd|Ckhdadj|CA|6262253282 +Kdwgahd|Ldhdadj|CA|6262956066 +Udvgahd|Achdadj|CA|6262859833 +Vdxgahd|Cehdadj|CA|6260306109 +Ladgahd|Lyhdadj|CA|6260300766 +Udygahd|Bfhdadj|CA|6262316219 +Vdygahd|Cfhdadj|CA|6261316219 +Lbggahd|Luhdadj|CA|6263333729 +Vadgahd|Byhdadj|CA|6260300709 +Vdzgahd|Cghdadj|CA|6262326329 +Lbhgahd|Lthdadj|CA|6264344729 +Vbegahd|Bxhdadj|CA|6261311719 +Wadgahd|Dyhdadj|CA|6260300709 +Lcjgahd|Lphdadj|CA|6266376729 +Vbhgahd|Bthdadj|CA|6264344749 +Wbggahd|Duhdadj|CA|6263333739 +Lclgahd|Mbhdadj|CA|6266268729 +Vbigahd|Bshdadj|CA|6265355759 +Wcjgahd|Dphdadj|CA|6266376769 +Lcngahd|Mghdadj|CA|6262031029 +Vckgahd|Bihdadj|CA|6267387779 +Wcmgahd|Dxhdadj|CA|6269359799 +Lcogahd|Mahdadj|CA|6262152129 +Vclgahd|Bbhdadj|CA|6266268789 +Wdvgahd|Echdadj|CA|6262859888 +Lcpgahd|Mkhdadj|CA|6262253229 +Vcqgahd|Cmhdadj|CA|6262354383 +Wdygahd|Efhdadj|CA|6261316219 +Lcrgahd|Mbhdadj|CA|6262455429 +Vdugahd|Cbhdadj|CA|6262758787 +Xbegahd|Exhdadj|CA|6261356790 +Ldtgahd|Mnhdadj|CA|6262657629 +Vdvgahd|Cchdadj|CA|6262859888 +Xbfgahd|Ewhdadj|CA|6262356790 +Ldugahd|Mbhdadj|CA|6262758729 +Vdwgahd|Cdhdadj|CA|6262956989 +Xbggahd|Euhdadj|CA|6263356790 +Madgahd|Nyhdadj|CA|6260300709 +Wbfgahd|Dwhdadj|CA|6262322729 +Xbhgahd|Ethdadj|CA|6264356790 +Mbggahd|Nuhdadj|CA|6263333739 +Wbhgahd|Dthdadj|CA|6264344749 +Xcjgahd|Ephdadj|CA|6266356790 +Mbhgahd|Nthdadj|CA|6264344749 +Wcogahd|Dahdadj|CA|6262152181 +Xcngahd|Fghdadj|CA|6262056790 +Mcjgahd|Nphdadj|CA|6266376769 +Wcpgahd|Dkhdadj|CA|6262253282 +Xdsgahd|Fdhdadj|CA|6262556779 +Mcpgahd|Okhdadj|CA|6262253282 +Wcqgahd|Emhdadj|CA|6262354383 +Xdugahd|Fbhdadj|CA|6262756779 +Mdsgahd|Odhdadj|CA|6262556585 +Wdugahd|Ebhdadj|CA|6262758787 +Xdygahd|Ffhdadj|CA|6262316779 +Mdwgahd|Pdhdadj|CA|6262956989 +Wdxgahd|Eehdadj|CA|6260306109 +Yadgahd|Gyhdadj|CA|6260350779 +Mdygahd|Pfhdadj|CA|6261316219 +Xbigahd|Eshdadj|CA|6265356790 +Ybegahd|Gxhdadj|CA|6261351779 +Mdzgahd|Pghdadj|CA|6262326329 +Xckgahd|Eihdadj|CA|6267356790 +Ybfgahd|Gwhdadj|CA|6262352779 +Nadgahd|Pyhdadj|CA|6260300709 +Xcmgahd|Fxhdadj|CA|6269356790 +Ybhgahd|Gthdadj|CA|6264354779 +Nbfgahd|Pwhdadj|CA|6262322729 +Xcpgahd|Fkhdadj|CA|6262256779 +Ycjgahd|Gphdadj|CA|6266356779 +Nbggahd|Puhdadj|CA|6263333739 +Xdvgahd|Fchdadj|CA|6262856779 +Yclgahd|Gbhdadj|CA|6268358744 +Nbhgahd|Pthdadj|CA|6264344749 +Xdwgahd|Fdhdadj|CA|6262956779 +Ycpgahd|Gkhdadj|CA|6262256244 +Ncmgahd|Qxhdadj|CA|6269359799 +Xdxgahd|Fehdadj|CA|6262306779 +Ydtgahd|Hnhdadj|CA|6262656644 +Ncogahd|Qahdadj|CA|6262152181 +Ybigahd|Gshdadj|CA|6265355779 +Ydwgahd|Hdhdadj|CA|6262956944 +Ncpgahd|Qkhdadj|CA|6262253282 +Yckgahd|Gihdadj|CA|6267357779 +Ydxgahd|Hehdadj|CA|6262306709 +Ndwgahd|Qdhdadj|CA|6262956989 +Ycogahd|Gahdadj|CA|6262156144 +Ydygahd|Hfhdadj|CA|6262316719 +Oadgahd|Ryhdadj|CA|6260356776 +Ycqgahd|Gmhdadj|CA|6262356344 +Ydzgahd|Hghdadj|CA|6262326729 +Obegahd|Rxhdadj|CA|6261356776 +Ydsgahd|Hdhdadj|CA|6262556544 +Zadgahd|Hyhdadj|CA|6260356744 +Obfgahd|Rwhdadj|CA|6262356776 +Ydvgahd|Hchdadj|CA|6262856844 +Zbfgahd|Hwhdadj|CA|6262356744 +Ocjgahd|Sphdadj|CA|6266356776 +Zbegahd|Hxhdadj|CA|6261356744 +Zbhgahd|Hthdadj|CA|6264356766 +Ockgahd|Sihdadj|CA|6267356776 +Zcogahd|Iahdadj|CA|6262156766 +Zcjgahd|Iphdadj|CA|6266356766 +Ocngahd|Sghdadj|CA|6262056776 +Zcpgahd|Ikhdadj|CA|6262256766 +Zcmgahd|Ixhdadj|CA|6269356766 +Odtgahd|Snhdadj|CA|6262656776 +Zdwgahd|Jdhdadj|CA|6262956751 +Zdvgahd|Jchdadj|CA|6262856751 +Odwgahd|Tdhdadj|CA|6262956776 +Zdygahd|Jfhdadj|CA|6262316751 +Kedgahd|Jyhdadj|CA|6260306751 +Pbhgahd|Tthdadj|CA|6264354767 +Kefgahd|Jwhdadj|CA|6262326751 +Keegahd|Jxhdadj|CA|6261316751 +Pcogahd|Uahdadj|CA|6262156167 +Keigahd|Jshdadj|CA|6265356751 +Kehgahd|Jthdadj|CA|6264346751 +Pcqgahd|Umhdadj|CA|6262356367 +Kemgahd|Kxhdadj|CA|6269350751 +Kelgahd|Jbhdadj|CA|6266266751 +Pcrgahd|Ubhdadj|CA|6262456467 +Kengahd|Kghdadj|CA|6262051751 +Keqgahd|Kmhdadj|CA|6262354762 +Pdtgahd|Unhdadj|CA|6262656600 +Kepgahd|Kkhdadj|CA|6262253751 +Ketgahd|Knhdadj|CA|6262657762 +Pdvgahd|Uchdadj|CA|6262856800 +Kesgahd|Kdhdadj|CA|6262556762 +Kezgahd|Kghdadj|CA|6262326362 +Rbegahd|Vxhdadj|CA|6261356700 +Kewgahd|Kdhdadj|CA|6262956062 +Liggahd|Luhdadj|CA|6263333762 +Rbfgahd|Vwhdadj|CA|6262356700 +Kexgahd|Kehdadj|CA|6262306162 +Likgahd|Lihdadj|CA|6267387762 +Rckgahd|Vihdadj|CA|6267356700 +Lidgahd|Lyhdadj|CA|6260300762 +Lilgahd|Lbhdadj|CA|6266268762 +Rclgahd|Wbhdadj|CA|6268356700 +Liegahd|Lxhdadj|CA|6261311762 +Lipgahd|Lkhdadj|CA|6262253288 +Rcmgahd|Wxhdadj|CA|6269356700 +Liigahd|Lshdadj|CA|6265355762 +Liygahd|Mfhdadj|CA|6262316219 +Rcogahd|Wahdadj|CA|6262156700 +Lijgahd|Lphdadj|CA|6266376762 +Moegahd|Mxhdadj|CA|6261311719 +Rcqgahd|Wmhdadj|CA|6262356706 +Liqgahd|Lmhdadj|CA|6262354388 +Moggahd|Muhdadj|CA|6263333739 +Rdsgahd|Wdhdadj|CA|6262556706 +Lirgahd|Mbhdadj|CA|6262455488 +Mohgahd|Mthdadj|CA|6264344749 +Rdtgahd|Wnhdadj|CA|6262656706 +Litgahd|Mnhdadj|CA|6262657688 +Momgahd|Nxhdadj|CA|6269359799 +Rdwgahd|Wdhdadj|CA|6262956706 +Liugahd|Mbhdadj|CA|6262758788 +Moqgahd|Nmhdadj|CA|6262354383 +Scjgahd|Xphdadj|CA|6266376740 +Lizgahd|Mghdadj|CA|6262326329 +Motgahd|Nnhdadj|CA|6262657686 +Scmgahd|Xxhdadj|CA|6269350740 +Modgahd|Myhdadj|CA|6260300709 +Movgahd|Nchdadj|CA|6262859888 +Scrgahd|Ybhdadj|CA|6262455740 +Mongahd|Nghdadj|CA|6262031080 +Mozgahd|Oghdadj|CA|6262326329 +Sdtgahd|Ynhdadj|CA|6262657740 +Mopgahd|Nkhdadj|CA|6262253282 +Nufgahd|Owhdadj|CA|6262322729 +Sdugahd|Ybhdadj|CA|6262758740 +Mosgahd|Ndhdadj|CA|6262556585 +Nuggahd|Ouhdadj|CA|6263333739 +Sdygahd|Yfhdadj|CA|6262316233 +Mowgahd|Ndhdadj|CA|6262956989 +Nuhgahd|Othdadj|CA|6264344749 +Uadgahd|Zyhdadj|CA|6260300733 +Nudgahd|Oyhdadj|CA|6260300709 +Nukgahd|Oihdadj|CA|6267387779 +Ubegahd|Zxhdadj|CA|6261311733 +Nujgahd|Ophdadj|CA|6266376769 +Nulgahd|Pbhdadj|CA|6266268789 +Ubigahd|Zshdadj|CA|6265355733 +Numgahd|Pxhdadj|CA|6269359799 +Nuxgahd|Qehdadj|CA|6260306109 +Uclgahd|Zbhdadj|CA|6266268733 +Nungahd|Pghdadj|CA|6262031080 +Nuygahd|Qfhdadj|CA|6261316219 +Ucmgahd|Axhdadj|CA|6269359733 +Nuogahd|Pahdadj|CA|6262152181 +Badgahd|Eyhdadj|FL|9540350711 +Ucqgahd|Amhdadj|CA|6262354333 +Nuqgahd|Pmhdadj|CA|6262354383 +Bbfgahd|Ewhdadj|FL|9542352711 +Udtgahd|Anhdadj|CA|6262657633 +Nurgahd|Pbhdadj|CA|6262455484 +Bcjgahd|Fphdadj|FL|9546356711 +Udugahd|Abhdadj|CA|6262758733 +Nutgahd|Pnhdadj|CA|6262657686 +Bclgahd|Fbhdadj|FL|9548358700 +Udxgahd|Aehdadj|CA|6262306109 +Nuugahd|Pbhdadj|CA|6262758787 +Bcogahd|Fahdadj|FL|9542156100 +Vbggahd|Buhdadj|CA|6263333739 +Nuzgahd|Qghdadj|CA|6262326329 +Bcqgahd|Gmhdadj|FL|9542356300 +Vcngahd|Cghdadj|CA|6262031080 +Aadgahd|Ayhdadj|FL|9540356710 +Bcrgahd|Gbhdadj|FL|9542456400 +Vcogahd|Cahdadj|CA|6262152181 +Abhgahd|Athdadj|FL|9544356710 +Bdvgahd|Gchdadj|FL|9542856800 +Vcrgahd|Cbhdadj|CA|6262455484 +Ackgahd|Bihdadj|FL|9547356710 +Cadgahd|Iyhdadj|FL|9540356712 +Vdsgahd|Cdhdadj|CA|6262556585 +Aclgahd|Bbhdadj|FL|9548356710 +Cbegahd|Ixhdadj|FL|9542656712 +Vdtgahd|Cnhdadj|CA|6262657686 +Acmgahd|Bxhdadj|FL|9549356701 +Cbhgahd|Ithdadj|FL|9544356712 +Wbegahd|Dxhdadj|CA|6261311719 +Acpgahd|Bkhdadj|FL|9542256701 +Ccmgahd|Jxhdadj|FL|9549356721 +Wbigahd|Dshdadj|CA|6265355759 +Adtgahd|Cnhdadj|FL|9542656701 +Ccogahd|Jahdadj|FL|9542156721 +Wckgahd|Dihdadj|CA|6267387779 +Advgahd|Dchdadj|FL|9542856701 +Ccpgahd|Kkhdadj|FL|9542256721 +Wclgahd|Dbhdadj|CA|6266268789 +Adxgahd|Dehdadj|FL|9542306711 +Ccqgahd|Kmhdadj|FL|9542356721 +Wcngahd|Dghdadj|CA|6262031080 +Adygahd|Dfhdadj|FL|9542316711 +Cdwgahd|Ldhdadj|FL|9542956721 +Wcrgahd|Ebhdadj|CA|6262455484 +Bbegahd|Axhdadj|FL|9542651711 +Cdzgahd|Lghdadj|FL|9542326722 +Wdsgahd|Edhdadj|CA|6262556585 +Bckgahd|Fihdadj|FL|9547357700 +Dbggahd|Muhdadj|FL|9543336722 +Wdtgahd|Enhdadj|CA|6262657686 +Bcmgahd|Fxhdadj|FL|9549359700 +Dckgahd|Nihdadj|FL|9547386722 +Wdwgahd|Edhdadj|CA|6262956989 +Bcpgahd|Gkhdadj|FL|9542256200 +Dcogahd|Nahdadj|FL|9542152732 +Wdzgahd|Eghdadj|CA|6262326329 +Bdsgahd|Gdhdadj|FL|9542555610 +Dcrgahd|Obhdadj|FL|9542455732 +Xadgahd|Eyhdadj|CA|6260356790 +Bdugahd|Gbhdadj|FL|9542756700 +Ddsgahd|Odhdadj|FL|9542556732 +Xclgahd|Fbhdadj|CA|6268356790 +Bdwgahd|Hdhdadj|FL|9542956900 +Ddtgahd|Onhdadj|FL|9542657732 +Xcogahd|Fahdadj|CA|6262156790 +Bdzgahd|Hghdadj|FL|9542326729 +Ddugahd|Obhdadj|FL|9542758732 +Xcqgahd|Fmhdadj|CA|6262356779 +Cbigahd|Ishdadj|FL|9545356712 +Eadgahd|Ryhdadj|FL|9540300745 +Xcrgahd|Fbhdadj|CA|6262456779 +Ccjgahd|Jphdadj|FL|9546356712 +Ebegahd|Rxhdadj|FL|9542611745 +Xdtgahd|Fnhdadj|CA|6262656779 +Cckgahd|Jihdadj|FL|9547356712 +Ebfgahd|Rwhdadj|FL|9542322745 +Xdzgahd|Fghdadj|CA|6262326779 +Cclgahd|Jbhdadj|FL|9548356721 +Ebhgahd|Rthdadj|FL|9544344745 +Ybggahd|Guhdadj|CA|6263353779 +Ccrgahd|Kbhdadj|FL|9542456721 +Eckgahd|Sihdadj|FL|9547387745 +Ycmgahd|Gxhdadj|CA|6269359744 +Cdsgahd|Kdhdadj|FL|9542556721 +Ecmgahd|Sxhdadj|FL|9549359745 +Ycngahd|Gghdadj|CA|6262056044 +Cdxgahd|Lehdadj|FL|9542306721 +Ecogahd|Tahdadj|FL|9542152145 +Ycrgahd|Gbhdadj|CA|6262456444 +Dbhgahd|Mthdadj|FL|9544346722 +Ecrgahd|Tbhdadj|FL|9542455445 +Ydugahd|Hbhdadj|CA|6262756744 +Dbigahd|Nshdadj|FL|9545356722 +Edugahd|Ubhdadj|FL|9542758709 +Zbggahd|Huhdadj|CA|6263356766 +Dclgahd|Nbhdadj|FL|9545616732 +Edvgahd|Uchdadj|FL|9542859809 +Zbigahd|Ishdadj|CA|6265356766 +Dcqgahd|Omhdadj|FL|9542354732 +Edzgahd|Vghdadj|FL|9542326329 +Zckgahd|Iihdadj|CA|6267356766 +Ddvgahd|Ochdadj|FL|9542859732 +Fadgahd|Vyhdadj|FL|9540300709 +Zclgahd|Ibhdadj|CA|6268356766 +Ddwgahd|Odhdadj|FL|9542956045 +Fbigahd|Wshdadj|FL|9545355759 +Zcngahd|Ighdadj|CA|6262056766 +Ebigahd|Sshdadj|FL|9545355745 +Fcjgahd|Wphdadj|FL|9546376769 +Zcqgahd|Imhdadj|CA|6262356766 +Ecjgahd|Sphdadj|FL|9546376745 +Fclgahd|Wbhdadj|FL|9545618789 +Zcrgahd|Ibhdadj|CA|6262456766 +Eclgahd|Sbhdadj|FL|9545618745 +Fcngahd|Wghdadj|FL|9542090480 +Zdsgahd|Idhdadj|CA|6262556766 +Ecngahd|Sghdadj|FL|9542090445 +Fcpgahd|Wkhdadj|FL|9542253282 +Zdtgahd|Inhdadj|CA|6262656766 +Edwgahd|Udhdadj|FL|9542956909 +Fdtgahd|Xnhdadj|FL|9542657686 +Zdugahd|Ibhdadj|CA|6262756766 +Edygahd|Vfhdadj|FL|9542316219 +Fdygahd|Yfhdadj|FL|9542616219 +Zdxgahd|Jehdadj|CA|6262306751 +Fbfgahd|Vwhdadj|FL|9542322729 +Gbigahd|Zshdadj|FL|9545355759 +Zdzgahd|Jghdadj|CA|6262326751 +Fcmgahd|Wxhdadj|FL|9549359799 +Gckgahd|Zihdadj|FL|9547387779 +Keggahd|Juhdadj|CA|6263336751 +Fcqgahd|Xmhdadj|FL|9542354383 +Gcmgahd|Zxhdadj|FL|9549359799 +Kejgahd|Jphdadj|CA|6266376751 +Fcrgahd|Xbhdadj|FL|9542455484 +Gcogahd|Zahdadj|FL|9542152181 +Kekgahd|Jihdadj|CA|6267386751 +Fdzgahd|Yghdadj|FL|9542326329 +Gcpgahd|Zkhdadj|FL|9542253282 +Keogahd|Kahdadj|CA|6262152751 +Gadgahd|Yyhdadj|FL|9540300709 +Gdtgahd|Anhdadj|FL|9542657686 +Kergahd|Kbhdadj|CA|6262455762 +Gbegahd|Yxhdadj|FL|9542611719 +Gdugahd|Abhdadj|FL|9542758787 +Keugahd|Kbhdadj|CA|6262758762 +Gbggahd|Yuhdadj|FL|9543333739 +Gdwgahd|Adhdadj|FL|9542956989 +Kevgahd|Kchdadj|CA|6262859762 +Gcjgahd|Zphdadj|FL|9546376769 +Gdxgahd|Aehdadj|FL|9540306109 +Keygahd|Kfhdadj|CA|6262316262 +Gcngahd|Zghdadj|FL|9542090480 +Hadgahd|Byhdadj|FL|3860356799 +Lifgahd|Lwhdadj|CA|6262322762 +Gdsgahd|Adhdadj|FL|9542556585 +Hbigahd|Bshdadj|FL|3865356799 +Lihgahd|Lthdadj|CA|6264344762 +Gdzgahd|Aghdadj|FL|9542326329 +Hcjgahd|Bphdadj|FL|3866356799 +Limgahd|Lxhdadj|CA|6269359762 +Hbggahd|Buhdadj|FL|3863356799 +Hckgahd|Bihdadj|FL|3867356799 +Lingahd|Lghdadj|CA|6262031088 +Hbhgahd|Bthdadj|FL|3864356799 +Hclgahd|Bbhdadj|FL|3868356799 +Liogahd|Lahdadj|CA|6262152188 +Hcmgahd|Bxhdadj|FL|3869356799 +Hcngahd|Bghdadj|FL|3862056799 +Lisgahd|Mdhdadj|CA|6262556588 +Hcogahd|Bahdadj|FL|3862156799 +Hcpgahd|Ckhdadj|FL|3862256767 +Livgahd|Mchdadj|CA|6262859888 +Hcqgahd|Cmhdadj|FL|3862356767 +Hdsgahd|Cdhdadj|FL|3862556767 +Liwgahd|Mdhdadj|CA|6262956988 +Hcrgahd|Cbhdadj|FL|3862456767 +Hdtgahd|Cnhdadj|FL|3866156767 +Lixgahd|Mehdadj|CA|6262306109 +Hdvgahd|Cchdadj|FL|3862856767 +Hdzgahd|Dghdadj|FL|3862326767 +Mofgahd|Mwhdadj|CA|6262322729 +Hdwgahd|Cdhdadj|FL|3862956767 +Ibegahd|Dxhdadj|FL|3861351778 +Moigahd|Mshdadj|CA|6265355759 +Hdxgahd|Cehdadj|FL|3862306767 +Ibfgahd|Dwhdadj|FL|3862352778 +Mojgahd|Nphdadj|CA|6266376769 +Hdygahd|Dfhdadj|FL|3862316767 +Ibigahd|Dshdadj|FL|3865355778 +Mokgahd|Nihdadj|CA|6267387779 +Ibggahd|Duhdadj|FL|3863353778 +Icngahd|Eghdadj|FL|3862056078 +Molgahd|Nbhdadj|CA|6266268789 +Ickgahd|Eihdadj|FL|3867357778 +Icpgahd|Ekhdadj|FL|3862256278 +Moogahd|Nahdadj|CA|6262152181 +Icogahd|Eahdadj|FL|3862156178 +Icqgahd|Emhdadj|FL|3862356356 +Morgahd|Nbhdadj|CA|6262455484 +Icrgahd|Fbhdadj|FL|3862456456 +Idugahd|Fbhdadj|FL|3862756756 +Mougahd|Nbhdadj|CA|6262758787 +Idsgahd|Fdhdadj|FL|3862556556 +Jadgahd|Gyhdadj|FL|3860356701 +Moxgahd|Nehdadj|CA|6260306109 +Idtgahd|Fnhdadj|FL|3866156656 +Jbegahd|Gxhdadj|FL|3861356701 +Moygahd|Ofhdadj|CA|6261316219 +Idvgahd|Fchdadj|FL|3862856856 +Jbfgahd|Gwhdadj|FL|3862356701 +Nuegahd|Oxhdadj|CA|6261311719 +Idwgahd|Fdhdadj|FL|3862956956 +Jbigahd|Gshdadj|FL|3865356701 +Nuigahd|Oshdadj|CA|6265355759 +Idxgahd|Fehdadj|FL|3862306709 +Jckgahd|Hihdadj|FL|3867356701 +Nupgahd|Pkhdadj|CA|6262253282 +Jcogahd|Hahdadj|FL|3862156755 +Jclgahd|Hbhdadj|FL|3868356701 +Nusgahd|Pdhdadj|CA|6262556585 +Jcpgahd|Hkhdadj|FL|3862256755 +Jcrgahd|Hbhdadj|FL|3862456755 +Nuvgahd|Pchdadj|CA|6262859888 +Jcqgahd|Hmhdadj|FL|3862356755 +Jdsgahd|Hdhdadj|FL|3862556755 +Nuwgahd|Pdhdadj|CA|6262956989 +Jdugahd|Ibhdadj|FL|3862756755 +Jdzgahd|Ighdadj|FL|3862326755 +Abegahd|Axhdadj|FL|9542656710 +Jdxgahd|Iehdadj|FL|3862306755 +Kadgahd|Iyhdadj|FL|3860306704 +Abfgahd|Awhdadj|FL|9542356710 +Jdygahd|Ifhdadj|FL|3862316755 +Kbegahd|Ixhdadj|FL|3861316704 +Abggahd|Auhdadj|FL|9543356710 +Kbggahd|Juhdadj|FL|3863336704 +Kbfgahd|Jwhdadj|FL|3862326704 +Abigahd|Ashdadj|FL|9545356710 +Kbhgahd|Jthdadj|FL|3864346704 +Kbigahd|Jshdadj|FL|3865356704 +Acjgahd|Bphdadj|FL|9546356710 +Kcmgahd|Jxhdadj|FL|3869350704 +Kcjgahd|Jphdadj|FL|3866376704 +Acngahd|Bghdadj|FL|9542056701 +Kcpgahd|Kkhdadj|FL|3862253704 +Kclgahd|Jbhdadj|FL|3865616704 +Acogahd|Bahdadj|FL|9542156701 +Kdtgahd|Knhdadj|FL|3866157766 +Kcqgahd|Kmhdadj|FL|3862354766 +Acqgahd|Cmhdadj|FL|9542356701 +Kdxgahd|Lehdadj|FL|3862306166 +Kcrgahd|Kbhdadj|FL|3862455766 +Acrgahd|Cbhdadj|FL|9542456701 +Kdygahd|Lfhdadj|FL|3862315616 +Kdsgahd|Kdhdadj|FL|3862556766 +Adsgahd|Cdhdadj|FL|9542556701 +Lbfgahd|Lwhdadj|FL|3862322766 +Kdugahd|Kbhdadj|FL|3862758766 +Adugahd|Cbhdadj|FL|9542756701 +Lbigahd|Lshdadj|FL|3865355729 +Kdzgahd|Lghdadj|FL|3862326366 +Adwgahd|Ddhdadj|FL|9542956711 +Lckgahd|Mihdadj|FL|3867387729 +Lbegahd|Lxhdadj|FL|3861311766 +Adzgahd|Dghdadj|FL|9542326711 +Lcmgahd|Mxhdadj|FL|3869359729 +Ldsgahd|Mdhdadj|FL|3862556529 +Bbggahd|Euhdadj|FL|9543353711 +Lcqgahd|Mmhdadj|FL|3862354329 +Ldvgahd|Nchdadj|FL|3862859829 +Bbhgahd|Ethdadj|FL|9544354711 +Ldxgahd|Nehdadj|FL|3862306109 +Ldwgahd|Ndhdadj|FL|3862956929 +Bbigahd|Eshdadj|FL|9545355711 +Ldzgahd|Nghdadj|FL|3862326329 +Ldygahd|Nfhdadj|FL|3862316219 +Bcngahd|Fghdadj|FL|9542056000 +Mbegahd|Nxhdadj|FL|3861311719 +Mbfgahd|Nwhdadj|FL|3862322729 +Bdtgahd|Gnhdadj|FL|9542656600 +Mbigahd|Nshdadj|FL|3865355759 +Mclgahd|Obhdadj|FL|3865618789 +Bdxgahd|Hehdadj|FL|9542306709 +Mckgahd|Nihdadj|FL|3867387779 +Mcmgahd|Oxhdadj|FL|3869359799 +Bdygahd|Hfhdadj|FL|9542316719 +Mcngahd|Oghdadj|FL|3862090480 +Mcqgahd|Omhdadj|FL|3862354383 +Cbfgahd|Iwhdadj|FL|9542356712 +Mcogahd|Oahdadj|FL|3862152181 +Mcrgahd|Obhdadj|FL|3862455484 +Cbggahd|Iuhdadj|FL|9543356712 +Mdtgahd|Onhdadj|FL|3866157686 +Mdxgahd|Pehdadj|FL|3860306109 +Ccngahd|Jghdadj|FL|9542056721 +Mdugahd|Obhdadj|FL|3862758787 +Ncjgahd|Pphdadj|FL|3866376769 +Cdtgahd|Knhdadj|FL|9542656721 +Mdvgahd|Ochdadj|FL|3862859888 +Nckgahd|Pihdadj|FL|3867387779 +Cdugahd|Kbhdadj|FL|9542756721 +Nbegahd|Pxhdadj|FL|3861311719 +Ncrgahd|Qbhdadj|FL|3862455484 +Cdvgahd|Lchdadj|FL|9542856721 +Nbigahd|Pshdadj|FL|3865355759 +Ndtgahd|Qnhdadj|FL|3866157686 +Cdygahd|Lfhdadj|FL|9542316722 +Nclgahd|Qbhdadj|FL|3865618789 +Ndugahd|Qbhdadj|FL|3862758787 +Dadgahd|Myhdadj|FL|9540306722 +Ncngahd|Qghdadj|FL|3862090480 +Ndvgahd|Qchdadj|FL|3862859888 +Dbegahd|Mxhdadj|FL|9542616722 +Ncqgahd|Qmhdadj|FL|3862354383 +Ndygahd|Rfhdadj|FL|3861316219 +Dbfgahd|Mwhdadj|FL|9542326722 +Ndsgahd|Qdhdadj|FL|3862556585 +Ndzgahd|Rghdadj|FL|3862326329 +Dcjgahd|Nphdadj|FL|9546376722 +Ndxgahd|Rehdadj|FL|3860306109 +Obggahd|Ruhdadj|FL|5613356776 +Dcmgahd|Nxhdadj|FL|9549350732 +Obhgahd|Rthdadj|FL|5614356776 +Obigahd|Rshdadj|FL|5615356776 +Dcngahd|Nghdadj|FL|9542051732 +Ocpgahd|Skhdadj|FL|5612256776 +Oclgahd|Sbhdadj|FL|5618356776 +Dcpgahd|Nkhdadj|FL|9542253732 +Ocrgahd|Sbhdadj|FL|5612456776 +Ocmgahd|Sxhdadj|FL|5619356776 +Ddxgahd|Pehdadj|FL|9542306145 +Odsgahd|Sdhdadj|FL|5612556776 +Ocogahd|Sahdadj|FL|5612156776 +Ddygahd|Pfhdadj|FL|9542316245 +Odvgahd|Tchdadj|FL|5612856776 +Ocqgahd|Smhdadj|FL|5612356776 +Ddzgahd|Pghdadj|FL|9542326345 +Odxgahd|Tehdadj|FL|5612306767 +Odugahd|Tbhdadj|FL|5612756776 +Ebggahd|Ruhdadj|FL|9543333745 +Odygahd|Tfhdadj|FL|5612316767 +Padgahd|Tyhdadj|FL|5610350767 +Ecpgahd|Tkhdadj|FL|9542253245 +Odzgahd|Tghdadj|FL|5612326767 +Pbfgahd|Twhdadj|FL|5612352767 +Ecqgahd|Tmhdadj|FL|9542354345 +Pbegahd|Txhdadj|FL|5611351767 +Pbggahd|Tuhdadj|FL|5613353767 +Edsgahd|Tdhdadj|FL|9542555619 +Pbigahd|Tshdadj|FL|5615355767 +Pcjgahd|Uphdadj|FL|5616356767 +Edtgahd|Unhdadj|FL|9542657609 +Pclgahd|Ubhdadj|FL|5618358767 +Pckgahd|Uihdadj|FL|5617357767 +Edxgahd|Uehdadj|FL|9542306109 +Pcmgahd|Uxhdadj|FL|5619359767 +Pcngahd|Ughdadj|FL|5612056067 +Fbegahd|Vxhdadj|FL|9542611719 +Pcpgahd|Ukhdadj|FL|5612255617 +Pdugahd|Ubhdadj|FL|5612756700 +Fbggahd|Vuhdadj|FL|9543333739 +Pdsgahd|Udhdadj|FL|5612555610 +Pdxgahd|Vehdadj|FL|5612306709 +Fbhgahd|Vthdadj|FL|9544344749 +Pdwgahd|Udhdadj|FL|5612956900 +Pdygahd|Vfhdadj|FL|5612316719 +Fckgahd|Wihdadj|FL|9547387779 +Pdzgahd|Vghdadj|FL|5612326729 +Rbggahd|Vuhdadj|FL|5613356700 +Fcogahd|Wahdadj|FL|9542152181 +Radgahd|Vyhdadj|FL|5610356700 +Rbigahd|Vshdadj|FL|5615356700 +Fdsgahd|Xdhdadj|FL|9542556585 +Rbhgahd|Vthdadj|FL|5614356700 +Rcjgahd|Vphdadj|FL|5616356700 +Fdugahd|Xbhdadj|FL|9542758787 +Rcngahd|Wghdadj|FL|5612056700 +Sbfgahd|Xwhdadj|FL|5612326706 +Fdvgahd|Xchdadj|FL|9542859888 +Rcpgahd|Wkhdadj|FL|5612256706 +Sbggahd|Xuhdadj|FL|5613336706 +Fdwgahd|Xdhdadj|FL|9542956989 +Rcrgahd|Wbhdadj|FL|5612456706 +Sbigahd|Xshdadj|FL|5615356740 +Fdxgahd|Xehdadj|FL|9540306109 +Rdugahd|Wbhdadj|FL|5612756706 +Scngahd|Xghdadj|FL|5612051740 +Gbfgahd|Ywhdadj|FL|9542322729 +Rdvgahd|Wchdadj|FL|5612856706 +Scpgahd|Ykhdadj|FL|5612253740 +Gbhgahd|Ythdadj|FL|9544344749 +Rdxgahd|Wehdadj|FL|5612306706 +Scqgahd|Ymhdadj|FL|5612354740 +Gclgahd|Zbhdadj|FL|9545618789 +Rdygahd|Wfhdadj|FL|5612316706 +Sdzgahd|Yghdadj|FL|5612326333 +Gcqgahd|Zmhdadj|FL|9542354383 +Rdzgahd|Wghdadj|FL|5612326706 +Ubggahd|Zuhdadj|FL|5613333733 +Gcrgahd|Zbhdadj|FL|9542455484 +Sadgahd|Xyhdadj|FL|5610306706 +Ubhgahd|Zthdadj|FL|5614344733 +Gdvgahd|Achdadj|FL|9542859888 +Sbegahd|Xxhdadj|FL|5611316706 +Uckgahd|Zihdadj|FL|5617387733 +Gdygahd|Afhdadj|FL|9542616219 +Sbhgahd|Xthdadj|FL|5614346706 +Ucngahd|Aghdadj|FL|5612090433 +Hbegahd|Bxhdadj|FL|3861356799 +Sckgahd|Xihdadj|FL|5617386740 +Ucogahd|Aahdadj|FL|5612152133 +Hbfgahd|Bwhdadj|FL|3862356799 +Sclgahd|Xbhdadj|FL|5615616740 +Ucrgahd|Abhdadj|FL|5612455433 +Hdugahd|Cbhdadj|FL|3862756767 +Scogahd|Yahdadj|FL|5612152740 +Udsgahd|Adhdadj|FL|5612556533 +Iadgahd|Dyhdadj|FL|3860350767 +Sdsgahd|Ydhdadj|FL|5612556740 +Udwgahd|Adhdadj|FL|5612956933 +Ibhgahd|Dthdadj|FL|3864354778 +Sdvgahd|Ychdadj|FL|5612859740 +Udzgahd|Bghdadj|FL|5612326329 +Icjgahd|Dphdadj|FL|3866356778 +Sdwgahd|Ydhdadj|FL|5612956040 +Vbfgahd|Bwhdadj|FL|5612322729 +Iclgahd|Ebhdadj|FL|3868358778 +Sdxgahd|Yehdadj|FL|5612306140 +Vcjgahd|Bphdadj|FL|5616376769 +Icmgahd|Exhdadj|FL|3869359778 +Ubfgahd|Zwhdadj|FL|5612322733 +Vcmgahd|Cxhdadj|FL|5619359799 +Idygahd|Gfhdadj|FL|3862316719 +Ucjgahd|Zphdadj|FL|5616376733 +Vcpgahd|Ckhdadj|FL|5612253282 +Idzgahd|Gghdadj|FL|3862326729 +Ucpgahd|Akhdadj|FL|5612253233 +Vdxgahd|Cehdadj|FL|5610306109 +Jbggahd|Guhdadj|FL|3863356701 +Udvgahd|Achdadj|FL|5612859833 +Vdygahd|Cfhdadj|FL|5611316219 +Jbhgahd|Gthdadj|FL|3864356701 +Udygahd|Bfhdadj|FL|5612316219 +Vdzgahd|Cghdadj|FL|5612326329 +Jcjgahd|Gphdadj|FL|3866356701 +Vadgahd|Byhdadj|FL|5610300709 +Wadgahd|Dyhdadj|FL|5610300709 +Jcmgahd|Hxhdadj|FL|3869356701 +Vbegahd|Bxhdadj|FL|5611311719 +Wbggahd|Duhdadj|FL|5613333739 +Jcngahd|Hghdadj|FL|3862056755 +Vbhgahd|Bthdadj|FL|5614344749 +Wcjgahd|Dphdadj|FL|5616376769 +Jdtgahd|Inhdadj|FL|3866156755 +Vbigahd|Bshdadj|FL|5615355759 +Wcmgahd|Dxhdadj|FL|5619359799 +Jdvgahd|Ichdadj|FL|3862856755 +Vckgahd|Bihdadj|FL|5617387779 +Wdvgahd|Echdadj|FL|5612859888 +Jdwgahd|Idhdadj|FL|3862956755 +Vclgahd|Bbhdadj|FL|5615618789 +Wdygahd|Efhdadj|FL|5611316219 +Kckgahd|Jihdadj|FL|3867386704 +Vcqgahd|Cmhdadj|FL|5612354383 +Xbegahd|Exhdadj|FL|3861356790 +Kcngahd|Jghdadj|FL|3862051704 +Vdugahd|Cbhdadj|FL|5612758787 +Xbfgahd|Ewhdadj|FL|3862356790 +Kcogahd|Kahdadj|FL|3862152704 +Vdvgahd|Cchdadj|FL|5612859888 +Xbggahd|Euhdadj|FL|3863356790 +Kdvgahd|Kchdadj|FL|3862859766 +Vdwgahd|Cdhdadj|FL|5612956989 +Xbhgahd|Ethdadj|FL|3864356790 +Kdwgahd|Ldhdadj|FL|3862956066 +Wbfgahd|Dwhdadj|FL|5612322729 +Xcjgahd|Ephdadj|FL|3866356790 +Ladgahd|Lyhdadj|FL|3860300766 +Wbhgahd|Dthdadj|FL|5614344749 +Xcngahd|Fghdadj|FL|3862056790 +Lbggahd|Luhdadj|FL|3863333729 +Wcogahd|Dahdadj|FL|5612152181 +Xdsgahd|Fdhdadj|FL|3862556779 +Lbhgahd|Lthdadj|FL|3864344729 +Wcpgahd|Dkhdadj|FL|5612253282 +Xdugahd|Fbhdadj|FL|3862756779 +Lcjgahd|Lphdadj|FL|3866376729 +Wcqgahd|Emhdadj|FL|5612354383 +Xdygahd|Ffhdadj|FL|3862316779 +Lclgahd|Mbhdadj|FL|3865618729 +Wdugahd|Ebhdadj|FL|5612758787 +Yadgahd|Gyhdadj|FL|3860350779 +Lcngahd|Mghdadj|FL|3862090429 +Wdxgahd|Eehdadj|FL|5610306109 +Ybegahd|Gxhdadj|FL|3861351779 +Lcogahd|Mahdadj|FL|3862152129 +Xbigahd|Eshdadj|FL|3865356790 +Ybfgahd|Gwhdadj|FL|3862352779 +Lcpgahd|Mkhdadj|FL|3862253229 +Xckgahd|Eihdadj|FL|3867356790 +Ybhgahd|Gthdadj|FL|3864354779 +Lcrgahd|Mbhdadj|FL|3862455429 +Xcmgahd|Fxhdadj|FL|3869356790 +Ycjgahd|Gphdadj|FL|3866356779 +Ldtgahd|Mnhdadj|FL|3866157629 +Xcpgahd|Fkhdadj|FL|3862256779 +Yclgahd|Gbhdadj|FL|3868358744 +Ldugahd|Mbhdadj|FL|3862758729 +Xdvgahd|Fchdadj|FL|3862856779 +Ycpgahd|Gkhdadj|FL|3862256244 +Madgahd|Nyhdadj|FL|3860300709 +Xdwgahd|Fdhdadj|FL|3862956779 +Ydtgahd|Hnhdadj|FL|3866156644 +Mbggahd|Nuhdadj|FL|3863333739 +Xdxgahd|Fehdadj|FL|3862306779 +Ydwgahd|Hdhdadj|FL|3862956944 +Mbhgahd|Nthdadj|FL|3864344749 +Ybigahd|Gshdadj|FL|3865355779 +Ydxgahd|Hehdadj|FL|3862306709 +Mcjgahd|Nphdadj|FL|3866376769 +Yckgahd|Gihdadj|FL|3867357779 +Ydygahd|Hfhdadj|FL|3862316719 +Mcpgahd|Okhdadj|FL|3862253282 +Ycogahd|Gahdadj|FL|3862156144 +Ydzgahd|Hghdadj|FL|3862326729 +Mdsgahd|Odhdadj|FL|3862556585 +Ycqgahd|Gmhdadj|FL|3862356344 +Zadgahd|Hyhdadj|FL|3860356744 +Mdwgahd|Pdhdadj|FL|3862956989 +Ydsgahd|Hdhdadj|FL|3862556544 +Zbfgahd|Hwhdadj|FL|3862356744 +Mdygahd|Pfhdadj|FL|3861316219 +Ydvgahd|Hchdadj|FL|3862856844 +Zbhgahd|Hthdadj|FL|3864356766 +Mdzgahd|Pghdadj|FL|3862326329 +Zbegahd|Hxhdadj|FL|3861356744 +Zcjgahd|Iphdadj|FL|3866356766 +Nadgahd|Pyhdadj|FL|3860300709 +Zcogahd|Iahdadj|FL|3862156766 +Zcmgahd|Ixhdadj|FL|3869356766 +Nbfgahd|Pwhdadj|FL|3862322729 +Zcpgahd|Ikhdadj|FL|3862256766 +Zdvgahd|Jchdadj|FL|3862856751 +Nbggahd|Puhdadj|FL|3863333739 +Zdwgahd|Jdhdadj|FL|3862956751 +Kedgahd|Jyhdadj|FL|3860306751 +Nbhgahd|Pthdadj|FL|3864344749 +Zdygahd|Jfhdadj|FL|3862316751 +Keegahd|Jxhdadj|FL|3861316751 +Ncmgahd|Qxhdadj|FL|3869359799 +Kefgahd|Jwhdadj|FL|3862326751 +Kehgahd|Jthdadj|FL|3864346751 +Ncogahd|Qahdadj|FL|3862152181 +Keigahd|Jshdadj|FL|3865356751 +Kelgahd|Jbhdadj|FL|3865616751 +Ncpgahd|Qkhdadj|FL|3862253282 +Kemgahd|Kxhdadj|FL|3869350751 +Keqgahd|Kmhdadj|FL|3862354762 +Ndwgahd|Qdhdadj|FL|3862956989 +Kengahd|Kghdadj|FL|3862051751 +Ketgahd|Knhdadj|FL|3866157762 +Oadgahd|Ryhdadj|FL|5610356776 +Kepgahd|Kkhdadj|FL|3862253751 +Kezgahd|Kghdadj|FL|3862326362 +Obegahd|Rxhdadj|FL|5611356776 +Kesgahd|Kdhdadj|FL|3862556762 +Liggahd|Luhdadj|FL|3863333762 +Obfgahd|Rwhdadj|FL|5612356776 +Kewgahd|Kdhdadj|FL|3862956062 +Likgahd|Lihdadj|FL|3867387762 +Ocjgahd|Sphdadj|FL|5616356776 +Kexgahd|Kehdadj|FL|3862306162 +Lilgahd|Lbhdadj|FL|3865618762 +Ockgahd|Sihdadj|FL|5617356776 +Lidgahd|Lyhdadj|FL|3860300762 +Lipgahd|Lkhdadj|FL|3862253288 +Ocngahd|Sghdadj|FL|5612056776 +Liegahd|Lxhdadj|FL|3861311762 +Liygahd|Mfhdadj|FL|3862316219 +Odtgahd|Snhdadj|FL|5612656776 +Liigahd|Lshdadj|FL|3865355762 +Moegahd|Mxhdadj|FL|3861311719 +Odwgahd|Tdhdadj|FL|5612956776 +Lijgahd|Lphdadj|FL|3866376762 +Moggahd|Muhdadj|FL|3863333739 +Pbhgahd|Tthdadj|FL|5614354767 +Liqgahd|Lmhdadj|FL|3862354388 +Mohgahd|Mthdadj|FL|3864344749 +Pcogahd|Uahdadj|FL|5612156167 +Lirgahd|Mbhdadj|FL|3862455488 +Momgahd|Nxhdadj|FL|3869359799 +Pcqgahd|Umhdadj|FL|5612356367 +Litgahd|Mnhdadj|FL|3866157688 +Moqgahd|Nmhdadj|FL|3862354383 +Pcrgahd|Ubhdadj|FL|5612456467 +Liugahd|Mbhdadj|FL|3862758788 +Motgahd|Nnhdadj|FL|3866157686 +Pdtgahd|Unhdadj|FL|5612656600 +Lizgahd|Mghdadj|FL|3862326329 +Movgahd|Nchdadj|FL|3862859888 +Pdvgahd|Uchdadj|FL|5612856800 +Modgahd|Myhdadj|FL|3860300709 +Mozgahd|Oghdadj|FL|3862326329 +Rbegahd|Vxhdadj|FL|5611356700 +Mongahd|Nghdadj|FL|3862090480 +Nufgahd|Owhdadj|FL|3862322729 +Rbfgahd|Vwhdadj|FL|5612356700 +Mopgahd|Nkhdadj|FL|3862253282 +Nuggahd|Ouhdadj|FL|3863333739 +Rckgahd|Vihdadj|FL|5617356700 +Mosgahd|Ndhdadj|FL|3862556585 +Nuhgahd|Othdadj|FL|3864344749 +Rclgahd|Wbhdadj|FL|5618356700 +Mowgahd|Ndhdadj|FL|3862956989 +Nukgahd|Oihdadj|FL|3867387779 +Rcmgahd|Wxhdadj|FL|5619356700 +Nudgahd|Oyhdadj|FL|3860300709 +Nulgahd|Pbhdadj|FL|3865618789 +Rcogahd|Wahdadj|FL|5612156700 +Nujgahd|Ophdadj|FL|3866376769 +Nuxgahd|Qehdadj|FL|3860306109 +Rcqgahd|Wmhdadj|FL|5612356706 +Numgahd|Pxhdadj|FL|3869359799 +Nuygahd|Qfhdadj|FL|3861316219 +Rdsgahd|Wdhdadj|FL|5612556706 +Nungahd|Pghdadj|FL|3862090480 +Badgahd|Eyhdadj|FL|3520350711 +Rdtgahd|Wnhdadj|FL|5612656706 +Nuogahd|Pahdadj|FL|3862152181 +Bbfgahd|Ewhdadj|FL|3522352711 +Rdwgahd|Wdhdadj|FL|5612956706 +Nuqgahd|Pmhdadj|FL|3862354383 +Bcjgahd|Fphdadj|FL|3526356711 +Scjgahd|Xphdadj|FL|5616376740 +Nurgahd|Pbhdadj|FL|3862455484 +Bclgahd|Fbhdadj|FL|3528358700 +Scmgahd|Xxhdadj|FL|5619350740 +Nutgahd|Pnhdadj|FL|3866157686 +Bcogahd|Fahdadj|FL|3522156100 +Scrgahd|Ybhdadj|FL|5612455740 +Nuugahd|Pbhdadj|FL|3862758787 +Bcqgahd|Gmhdadj|FL|3522356300 +Sdtgahd|Ynhdadj|FL|5612657740 +Nuzgahd|Qghdadj|FL|3862326329 +Bcrgahd|Gbhdadj|FL|3522456400 +Sdugahd|Ybhdadj|FL|5612758740 +Aadgahd|Ayhdadj|FL|3520356710 +Bdvgahd|Gchdadj|FL|3522856800 +Sdygahd|Yfhdadj|FL|5612316233 +Abhgahd|Athdadj|FL|3524356710 +Cadgahd|Iyhdadj|FL|3520356712 +Uadgahd|Zyhdadj|FL|5610300733 +Ackgahd|Bihdadj|FL|3527356710 +Cbegahd|Ixhdadj|FL|3521356712 +Ubegahd|Zxhdadj|FL|5611311733 +Aclgahd|Bbhdadj|FL|3528356710 +Cbhgahd|Ithdadj|FL|3524356712 +Ubigahd|Zshdadj|FL|5615355733 +Acmgahd|Bxhdadj|FL|3529356701 +Ccmgahd|Jxhdadj|FL|3529356721 +Uclgahd|Zbhdadj|FL|5615618733 +Acpgahd|Bkhdadj|FL|3522256701 +Ccogahd|Jahdadj|FL|3522156721 +Ucmgahd|Axhdadj|FL|5619359733 +Adtgahd|Cnhdadj|FL|3522656701 +Ccpgahd|Kkhdadj|FL|3522256721 +Ucqgahd|Amhdadj|FL|5612354333 +Advgahd|Dchdadj|FL|3522856701 +Ccqgahd|Kmhdadj|FL|3522356721 +Udtgahd|Anhdadj|FL|5612657633 +Adxgahd|Dehdadj|FL|3522306711 +Cdwgahd|Ldhdadj|FL|3522956721 +Udugahd|Abhdadj|FL|5612758733 +Adygahd|Dfhdadj|FL|3522316711 +Cdzgahd|Lghdadj|FL|3522326722 +Udxgahd|Aehdadj|FL|5612306109 +Bbegahd|Axhdadj|FL|3521351711 +Dbggahd|Muhdadj|FL|3523336722 +Vbggahd|Buhdadj|FL|5613333739 +Bckgahd|Fihdadj|FL|3527357700 +Dckgahd|Nihdadj|FL|3527386722 +Vcngahd|Cghdadj|FL|5612090480 +Bcmgahd|Fxhdadj|FL|3529359700 +Dcogahd|Nahdadj|FL|3522152732 +Vcogahd|Cahdadj|FL|5612152181 +Bcpgahd|Gkhdadj|FL|3522256200 +Dcrgahd|Obhdadj|FL|3522455732 +Vcrgahd|Cbhdadj|FL|5612455484 +Bdsgahd|Gdhdadj|FL|3522555610 +Ddsgahd|Odhdadj|FL|3522556732 +Vdsgahd|Cdhdadj|FL|5612556585 +Bdugahd|Gbhdadj|FL|3522756700 +Ddtgahd|Onhdadj|FL|3522657732 +Vdtgahd|Cnhdadj|FL|5612657686 +Bdwgahd|Hdhdadj|FL|3522956900 +Ddugahd|Obhdadj|FL|3522758732 +Wbegahd|Dxhdadj|FL|5611311719 +Bdzgahd|Hghdadj|FL|3522326729 +Eadgahd|Ryhdadj|FL|3520300745 +Wbigahd|Dshdadj|FL|5615355759 +Cbigahd|Ishdadj|FL|3525356712 +Ebegahd|Rxhdadj|FL|3521311745 +Wckgahd|Dihdadj|FL|5617387779 +Ccjgahd|Jphdadj|FL|3526356712 +Ebfgahd|Rwhdadj|FL|3522322745 +Wclgahd|Dbhdadj|FL|5615618789 +Cckgahd|Jihdadj|FL|3527356712 +Ebhgahd|Rthdadj|FL|3524344745 +Wcngahd|Dghdadj|FL|5612090480 +Cclgahd|Jbhdadj|FL|3528356721 +Eckgahd|Sihdadj|FL|3527387745 +Wcrgahd|Ebhdadj|FL|5612455484 +Ccrgahd|Kbhdadj|FL|3522456721 +Ecmgahd|Sxhdadj|FL|3529359745 +Wdsgahd|Edhdadj|FL|5612556585 +Cdsgahd|Kdhdadj|FL|3522556721 +Ecogahd|Tahdadj|FL|3522152145 +Wdtgahd|Enhdadj|FL|5612657686 +Cdxgahd|Lehdadj|FL|3522306721 +Ecrgahd|Tbhdadj|FL|3522455445 +Wdwgahd|Edhdadj|FL|5612956989 +Dbhgahd|Mthdadj|FL|3524346722 +Edugahd|Ubhdadj|FL|3522758709 +Wdzgahd|Eghdadj|FL|5612326329 +Dbigahd|Nshdadj|FL|3525356722 +Edvgahd|Uchdadj|FL|3522859809 +Xadgahd|Eyhdadj|FL|3860356790 +Dclgahd|Nbhdadj|FL|3525616732 +Edzgahd|Vghdadj|FL|3522326329 +Xclgahd|Fbhdadj|FL|3868356790 +Dcqgahd|Omhdadj|FL|3522354732 +Fadgahd|Vyhdadj|FL|3520300709 +Xcogahd|Fahdadj|FL|3862156790 +Ddvgahd|Ochdadj|FL|3522859732 +Fbigahd|Wshdadj|FL|3525355759 +Xcqgahd|Fmhdadj|FL|3862356779 +Ddwgahd|Odhdadj|FL|3522956045 +Fcjgahd|Wphdadj|FL|3526376769 +Xcrgahd|Fbhdadj|FL|3862456779 +Ebigahd|Sshdadj|FL|3525355745 +Fclgahd|Wbhdadj|FL|3525618789 +Xdtgahd|Fnhdadj|FL|3866156779 +Ecjgahd|Sphdadj|FL|3526376745 +Fcngahd|Wghdadj|FL|3522090480 +Xdzgahd|Fghdadj|FL|3862326779 +Eclgahd|Sbhdadj|FL|3525618745 +Fcpgahd|Wkhdadj|FL|3522253282 +Ybggahd|Guhdadj|FL|3863353779 +Ecngahd|Sghdadj|FL|3522090445 +Fdtgahd|Xnhdadj|FL|3522657686 +Ycmgahd|Gxhdadj|FL|3869359744 +Edwgahd|Udhdadj|FL|3522956909 +Fdygahd|Yfhdadj|FL|3521316219 +Ycngahd|Gghdadj|FL|3862056044 +Edygahd|Vfhdadj|FL|3522316219 +Gbigahd|Zshdadj|FL|3525355759 +Ycrgahd|Gbhdadj|FL|3862456444 +Fbfgahd|Vwhdadj|FL|3522322729 +Gckgahd|Zihdadj|FL|3527387779 +Ydugahd|Hbhdadj|FL|3862756744 +Fcmgahd|Wxhdadj|FL|3529359799 +Gcmgahd|Zxhdadj|FL|3529359799 +Zbggahd|Huhdadj|FL|3863356766 +Fcqgahd|Xmhdadj|FL|3522354383 +Gcogahd|Zahdadj|FL|3522152181 +Zbigahd|Ishdadj|FL|3865356766 +Fcrgahd|Xbhdadj|FL|3522455484 +Gcpgahd|Zkhdadj|FL|3522253282 +Zckgahd|Iihdadj|FL|3867356766 +Fdzgahd|Yghdadj|FL|3522326329 +Gdtgahd|Anhdadj|FL|3522657686 +Zclgahd|Ibhdadj|FL|3868356766 +Gadgahd|Yyhdadj|FL|3520300709 +Gdugahd|Abhdadj|FL|3522758787 +Zcngahd|Ighdadj|FL|3862056766 +Gbegahd|Yxhdadj|FL|3521311719 +Gdwgahd|Adhdadj|FL|3522956989 +Zcqgahd|Imhdadj|FL|3862356766 +Gbggahd|Yuhdadj|FL|3523333739 +Gdxgahd|Aehdadj|FL|3520306109 +Zcrgahd|Ibhdadj|FL|3862456766 +Gcjgahd|Zphdadj|FL|3526376769 +Hadgahd|Byhdadj|FL|9040356799 +Zdsgahd|Idhdadj|FL|3862556766 +Gcngahd|Zghdadj|FL|3522090480 +Hbigahd|Bshdadj|FL|9045356799 +Zdtgahd|Inhdadj|FL|3866156766 +Gdsgahd|Adhdadj|FL|3522556585 +Hcjgahd|Bphdadj|FL|9046356799 +Zdugahd|Ibhdadj|FL|3862756766 +Gdzgahd|Aghdadj|FL|3522326329 +Hckgahd|Bihdadj|FL|9047356799 +Zdxgahd|Jehdadj|FL|3862306751 +Hbggahd|Buhdadj|FL|9043356799 +Hclgahd|Bbhdadj|FL|9048356799 +Zdzgahd|Jghdadj|FL|3862326751 +Hbhgahd|Bthdadj|FL|9044356799 +Hcngahd|Bghdadj|FL|9042056799 +Keggahd|Juhdadj|FL|3863336751 +Hcmgahd|Bxhdadj|FL|9049356799 +Hcpgahd|Ckhdadj|FL|9042256767 +Kejgahd|Jphdadj|FL|3866376751 +Hcogahd|Bahdadj|FL|9042156799 +Hdsgahd|Cdhdadj|FL|9042556767 +Kekgahd|Jihdadj|FL|3867386751 +Hcqgahd|Cmhdadj|FL|9042356767 +Hdtgahd|Cnhdadj|FL|9042656767 +Keogahd|Kahdadj|FL|3862152751 +Hcrgahd|Cbhdadj|FL|9042456767 +Hdzgahd|Dghdadj|FL|9042326767 +Kergahd|Kbhdadj|FL|3862455762 +Hdvgahd|Cchdadj|FL|9042856767 +Ibegahd|Dxhdadj|FL|9041351778 +Keugahd|Kbhdadj|FL|3862758762 +Hdwgahd|Cdhdadj|FL|9042956767 +Ibfgahd|Dwhdadj|FL|9042352778 +Kevgahd|Kchdadj|FL|3862859762 +Hdxgahd|Cehdadj|FL|9042306767 +Ibigahd|Dshdadj|FL|9045355778 +Keygahd|Kfhdadj|FL|3862315612 +Hdygahd|Dfhdadj|FL|9042316767 +Icngahd|Eghdadj|FL|9042056078 +Lifgahd|Lwhdadj|FL|3862322762 +Ibggahd|Duhdadj|FL|9043353778 +Icpgahd|Ekhdadj|FL|9042256278 +Lihgahd|Lthdadj|FL|3864344762 +Ickgahd|Eihdadj|FL|9047357778 +Icqgahd|Emhdadj|FL|9042356356 +Limgahd|Lxhdadj|FL|3869359762 +Icogahd|Eahdadj|FL|9042156178 +Idugahd|Fbhdadj|FL|9042756756 +Lingahd|Lghdadj|FL|3862090488 +Icrgahd|Fbhdadj|FL|9042456456 +Jadgahd|Gyhdadj|FL|9040356701 +Liogahd|Lahdadj|FL|3862152188 +Idsgahd|Fdhdadj|FL|9042556556 +Jbegahd|Gxhdadj|FL|9041356701 +Lisgahd|Mdhdadj|FL|3862556588 +Idtgahd|Fnhdadj|FL|9042656656 +Jbfgahd|Gwhdadj|FL|9042356701 +Livgahd|Mchdadj|FL|3862859888 +Idvgahd|Fchdadj|FL|9042856856 +Jbigahd|Gshdadj|FL|9045356701 +Liwgahd|Mdhdadj|FL|3862956988 +Idwgahd|Fdhdadj|FL|9042956956 +Jckgahd|Hihdadj|FL|9047356701 +Lixgahd|Mehdadj|FL|3862306109 +Idxgahd|Fehdadj|FL|9042306709 +Jclgahd|Hbhdadj|FL|9048356701 +Mofgahd|Mwhdadj|FL|3862322729 +Jcogahd|Hahdadj|FL|9042156755 +Jcrgahd|Hbhdadj|FL|9042456755 +Moigahd|Mshdadj|FL|3865355759 +Jcpgahd|Hkhdadj|FL|9042256755 +Jdsgahd|Hdhdadj|FL|9042556755 +Mojgahd|Nphdadj|FL|3866376769 +Jcqgahd|Hmhdadj|FL|9042356755 +Jdzgahd|Ighdadj|FL|9042326755 +Mokgahd|Nihdadj|FL|3867387779 +Jdugahd|Ibhdadj|FL|9042756755 +Kadgahd|Iyhdadj|FL|9040306704 +Molgahd|Nbhdadj|FL|3865618789 +Jdxgahd|Iehdadj|FL|9042306755 +Kbegahd|Ixhdadj|FL|9041316704 +Moogahd|Nahdadj|FL|3862152181 +Jdygahd|Ifhdadj|FL|9042316755 +Kbfgahd|Jwhdadj|FL|9042326704 +Morgahd|Nbhdadj|FL|3862455484 +Kbggahd|Juhdadj|FL|9043336704 +Kbigahd|Jshdadj|FL|9045356704 +Mougahd|Nbhdadj|FL|3862758787 +Kbhgahd|Jthdadj|FL|9044346704 +Kcjgahd|Jphdadj|FL|9046376704 +Moxgahd|Nehdadj|FL|3860306109 +Kcmgahd|Jxhdadj|FL|9049350704 +Kclgahd|Jbhdadj|FL|9045616704 +Moygahd|Ofhdadj|FL|3861316219 +Kcpgahd|Kkhdadj|FL|9042253704 +Kcqgahd|Kmhdadj|FL|9042354766 +Nuegahd|Oxhdadj|FL|3861311719 +Kdtgahd|Knhdadj|FL|9042657766 +Kcrgahd|Kbhdadj|FL|9042455766 +Nuigahd|Oshdadj|FL|3865355759 +Kdxgahd|Lehdadj|FL|9042306166 +Kdsgahd|Kdhdadj|FL|9042556766 +Nupgahd|Pkhdadj|FL|3862253282 +Kdygahd|Lfhdadj|FL|9042315616 +Kdugahd|Kbhdadj|FL|9042758766 +Nusgahd|Pdhdadj|FL|3862556585 +Lbfgahd|Lwhdadj|FL|9042322766 +Kdzgahd|Lghdadj|FL|9042326366 +Nuvgahd|Pchdadj|FL|3862859888 +Lbigahd|Lshdadj|FL|9045355729 +Lbegahd|Lxhdadj|FL|9041311766 +Nuwgahd|Pdhdadj|FL|3862956989 +Lckgahd|Mihdadj|FL|9047387729 +Ldsgahd|Mdhdadj|FL|9042556529 +Abegahd|Axhdadj|FL|3521356710 +Lcmgahd|Mxhdadj|FL|9049359729 +Ldvgahd|Nchdadj|FL|9042859829 +Abfgahd|Awhdadj|FL|3522356710 +Lcqgahd|Mmhdadj|FL|9042354329 +Ldwgahd|Ndhdadj|FL|9042956929 +Abggahd|Auhdadj|FL|3523356710 +Ldxgahd|Nehdadj|FL|9042306109 +Ldygahd|Nfhdadj|FL|9042316219 +Abigahd|Ashdadj|FL|3525356710 +Ldzgahd|Nghdadj|FL|9042326329 +Mbfgahd|Nwhdadj|FL|9042322729 +Acjgahd|Bphdadj|FL|3526356710 +Mbegahd|Nxhdadj|FL|9041311719 +Mclgahd|Obhdadj|FL|9045618789 +Acngahd|Bghdadj|FL|3522056701 +Mbigahd|Nshdadj|FL|9045355759 +Mcmgahd|Oxhdadj|FL|9049359799 +Acogahd|Bahdadj|FL|3522156701 +Mckgahd|Nihdadj|FL|9047387779 +Mcqgahd|Omhdadj|FL|9042354383 +Acqgahd|Cmhdadj|FL|3522356701 +Mcngahd|Oghdadj|FL|9042090480 +Mcrgahd|Obhdadj|FL|9042455484 +Acrgahd|Cbhdadj|FL|3522456701 +Mcogahd|Oahdadj|FL|9042152181 +Mdxgahd|Pehdadj|FL|9040306109 +Adsgahd|Cdhdadj|FL|3522556701 +Mdtgahd|Onhdadj|FL|9042657686 +Ncjgahd|Pphdadj|FL|9046376769 +Adugahd|Cbhdadj|FL|3522756701 +Mdugahd|Obhdadj|FL|9042758787 +Nckgahd|Pihdadj|FL|9047387779 +Adwgahd|Ddhdadj|FL|3522956711 +Mdvgahd|Ochdadj|FL|9042859888 +Ncrgahd|Qbhdadj|FL|9042455484 +Adzgahd|Dghdadj|FL|3522326711 +Nbegahd|Pxhdadj|FL|9041311719 +Ndtgahd|Qnhdadj|FL|9042657686 +Bbggahd|Euhdadj|FL|3523353711 +Nbigahd|Pshdadj|FL|9045355759 +Ndugahd|Qbhdadj|FL|9042758787 +Bbhgahd|Ethdadj|FL|3524354711 +Nclgahd|Qbhdadj|FL|9045618789 +Ndvgahd|Qchdadj|FL|9042859888 +Bbigahd|Eshdadj|FL|3525355711 +Ncngahd|Qghdadj|FL|9042090480 +Ndygahd|Rfhdadj|FL|9041316219 +Bcngahd|Fghdadj|FL|3522056000 +Ncqgahd|Qmhdadj|FL|9042354383 +Ndzgahd|Rghdadj|FL|9042326329 +Bdtgahd|Gnhdadj|FL|3522656600 +Ndsgahd|Qdhdadj|FL|9042556585 +Obggahd|Ruhdadj|FL|5613356776 +Bdxgahd|Hehdadj|FL|3522306709 +Ndxgahd|Rehdadj|FL|9040306109 +Obigahd|Rshdadj|FL|5615356776 +Bdygahd|Hfhdadj|FL|3522316719 +Obhgahd|Rthdadj|FL|5614356776 +Oclgahd|Sbhdadj|FL|5618356776 +Cbfgahd|Iwhdadj|FL|3522356712 +Ocpgahd|Skhdadj|FL|5612256776 +Ocmgahd|Sxhdadj|FL|5619356776 +Cbggahd|Iuhdadj|FL|3523356712 +Ocrgahd|Sbhdadj|FL|5612456776 +Ocogahd|Sahdadj|FL|5612156776 +Ccngahd|Jghdadj|FL|3522056721 +Odsgahd|Sdhdadj|FL|5612556776 +Ocqgahd|Smhdadj|FL|5612356776 +Cdtgahd|Knhdadj|FL|3522656721 +Odvgahd|Tchdadj|FL|5612856776 +Odugahd|Tbhdadj|FL|5612756776 +Cdugahd|Kbhdadj|FL|3522756721 +Odxgahd|Tehdadj|FL|5612306767 +Padgahd|Tyhdadj|FL|5610350767 +Cdvgahd|Lchdadj|FL|3522856721 +Odygahd|Tfhdadj|FL|5612316767 +Pbfgahd|Twhdadj|FL|5612352767 +Cdygahd|Lfhdadj|FL|3522316722 +Odzgahd|Tghdadj|FL|5612326767 +Pbggahd|Tuhdadj|FL|5613353767 +Dadgahd|Myhdadj|FL|3520306722 +Pbegahd|Txhdadj|FL|5611351767 +Pcjgahd|Uphdadj|FL|5616356767 +Dbegahd|Mxhdadj|FL|3521316722 +Pbigahd|Tshdadj|FL|5615355767 +Pckgahd|Uihdadj|FL|5617357767 +Dbfgahd|Mwhdadj|FL|3522326722 +Pclgahd|Ubhdadj|FL|5618358767 +Pcngahd|Ughdadj|FL|5612056067 +Dcjgahd|Nphdadj|FL|3526376722 +Pcmgahd|Uxhdadj|FL|5619359767 +Pdugahd|Ubhdadj|FL|5612756700 +Dcmgahd|Nxhdadj|FL|3529350732 +Pcpgahd|Ukhdadj|FL|5612255617 +Pdxgahd|Vehdadj|FL|5612306709 +Dcngahd|Nghdadj|FL|3522051732 +Pdsgahd|Udhdadj|FL|5612555610 +Pdygahd|Vfhdadj|FL|5612316719 +Dcpgahd|Nkhdadj|FL|3522253732 +Pdwgahd|Udhdadj|FL|5612956900 +Rbggahd|Vuhdadj|FL|5613356700 +Ddxgahd|Pehdadj|FL|3522306145 +Pdzgahd|Vghdadj|FL|5612326729 +Rbigahd|Vshdadj|FL|5615356700 +Ddygahd|Pfhdadj|FL|3522316245 +Radgahd|Vyhdadj|FL|5610356700 +Rcjgahd|Vphdadj|FL|5616356700 +Ddzgahd|Pghdadj|FL|3522326345 +Rbhgahd|Vthdadj|FL|5614356700 +Sbfgahd|Xwhdadj|FL|5612326706 +Ebggahd|Ruhdadj|FL|3523333745 +Rcngahd|Wghdadj|FL|5612056700 +Sbggahd|Xuhdadj|FL|5613336706 +Ecpgahd|Tkhdadj|FL|3522253245 +Rcpgahd|Wkhdadj|FL|5612256706 +Sbigahd|Xshdadj|FL|5615356740 +Ecqgahd|Tmhdadj|FL|3522354345 +Rcrgahd|Wbhdadj|FL|5612456706 +Scngahd|Xghdadj|FL|5612051740 +Edsgahd|Tdhdadj|FL|3522555619 +Rdugahd|Wbhdadj|FL|5612756706 +Scpgahd|Ykhdadj|FL|5612253740 +Edtgahd|Unhdadj|FL|3522657609 +Rdvgahd|Wchdadj|FL|5612856706 +Scqgahd|Ymhdadj|FL|5612354740 +Edxgahd|Uehdadj|FL|3522306109 +Rdxgahd|Wehdadj|FL|5612306706 +Sdzgahd|Yghdadj|FL|5612326333 +Fbegahd|Vxhdadj|FL|3521311719 +Rdygahd|Wfhdadj|FL|5612316706 +Ubggahd|Zuhdadj|FL|5613333733 +Fbggahd|Vuhdadj|FL|3523333739 +Rdzgahd|Wghdadj|FL|5612326706 +Ubhgahd|Zthdadj|FL|5614344733 +Fbhgahd|Vthdadj|FL|3524344749 +Sadgahd|Xyhdadj|FL|5610306706 +Uckgahd|Zihdadj|FL|5617387733 +Fckgahd|Wihdadj|FL|3527387779 +Sbegahd|Xxhdadj|FL|5611316706 +Ucngahd|Aghdadj|FL|5612090433 +Fcogahd|Wahdadj|FL|3522152181 +Sbhgahd|Xthdadj|FL|5614346706 +Ucogahd|Aahdadj|FL|5612152133 +Fdsgahd|Xdhdadj|FL|3522556585 +Sckgahd|Xihdadj|FL|5617386740 +Ucrgahd|Abhdadj|FL|5612455433 +Fdugahd|Xbhdadj|FL|3522758787 +Sclgahd|Xbhdadj|FL|5615616740 +Udsgahd|Adhdadj|FL|5612556533 +Fdvgahd|Xchdadj|FL|3522859888 +Scogahd|Yahdadj|FL|5612152740 +Udwgahd|Adhdadj|FL|5612956933 +Fdwgahd|Xdhdadj|FL|3522956989 +Sdsgahd|Ydhdadj|FL|5612556740 +Udzgahd|Bghdadj|FL|5612326329 +Fdxgahd|Xehdadj|FL|3520306109 +Sdvgahd|Ychdadj|FL|5612859740 +Vbfgahd|Bwhdadj|FL|5612322729 +Gbfgahd|Ywhdadj|FL|3522322729 +Sdwgahd|Ydhdadj|FL|5612956040 +Vcjgahd|Bphdadj|FL|5616376769 +Gbhgahd|Ythdadj|FL|3524344749 +Sdxgahd|Yehdadj|FL|5612306140 +Vcmgahd|Cxhdadj|FL|5619359799 +Gclgahd|Zbhdadj|FL|3525618789 +Ubfgahd|Zwhdadj|FL|5612322733 +Vcpgahd|Ckhdadj|FL|5612253282 +Gcqgahd|Zmhdadj|FL|3522354383 +Ucjgahd|Zphdadj|FL|5616376733 +Vdxgahd|Cehdadj|FL|5610306109 +Gcrgahd|Zbhdadj|FL|3522455484 +Ucpgahd|Akhdadj|FL|5612253233 +Vdygahd|Cfhdadj|FL|5611316219 +Gdvgahd|Achdadj|FL|3522859888 +Udvgahd|Achdadj|FL|5612859833 +Vdzgahd|Cghdadj|FL|5612326329 +Gdygahd|Afhdadj|FL|3521316219 +Udygahd|Bfhdadj|FL|5612316219 +Wadgahd|Dyhdadj|FL|5610300709 +Hbegahd|Bxhdadj|FL|9041356799 +Vadgahd|Byhdadj|FL|5610300709 +Wbggahd|Duhdadj|FL|5613333739 +Hbfgahd|Bwhdadj|FL|9042356799 +Vbegahd|Bxhdadj|FL|5611311719 +Wcjgahd|Dphdadj|FL|5616376769 +Hdugahd|Cbhdadj|FL|9042756767 +Vbhgahd|Bthdadj|FL|5614344749 +Wcmgahd|Dxhdadj|FL|5619359799 +Iadgahd|Dyhdadj|FL|9040350767 +Vbigahd|Bshdadj|FL|5615355759 +Wdvgahd|Echdadj|FL|5612859888 +Ibhgahd|Dthdadj|FL|9044354778 +Vckgahd|Bihdadj|FL|5617387779 +Wdygahd|Efhdadj|FL|5611316219 +Icjgahd|Dphdadj|FL|9046356778 +Vclgahd|Bbhdadj|FL|5615618789 +Xbegahd|Exhdadj|FL|9041356790 +Iclgahd|Ebhdadj|FL|9048358778 +Vcqgahd|Cmhdadj|FL|5612354383 +Xbfgahd|Ewhdadj|FL|9042356790 +Icmgahd|Exhdadj|FL|9049359778 +Vdugahd|Cbhdadj|FL|5612758787 +Xbggahd|Euhdadj|FL|9043356790 +Idygahd|Gfhdadj|FL|9042316719 +Vdvgahd|Cchdadj|FL|5612859888 +Xbhgahd|Ethdadj|FL|9044356790 +Idzgahd|Gghdadj|FL|9042326729 +Vdwgahd|Cdhdadj|FL|5612956989 +Xcjgahd|Ephdadj|FL|9046356790 +Jbggahd|Guhdadj|FL|9043356701 +Wbfgahd|Dwhdadj|FL|5612322729 +Xcngahd|Fghdadj|FL|9042056790 +Jbhgahd|Gthdadj|FL|9044356701 +Wbhgahd|Dthdadj|FL|5614344749 +Xdsgahd|Fdhdadj|FL|9042556779 +Jcjgahd|Gphdadj|FL|9046356701 +Wcogahd|Dahdadj|FL|5612152181 +Xdugahd|Fbhdadj|FL|9042756779 +Jcmgahd|Hxhdadj|FL|9049356701 +Wcpgahd|Dkhdadj|FL|5612253282 +Xdygahd|Ffhdadj|FL|9042316779 +Jcngahd|Hghdadj|FL|9042056755 +Wcqgahd|Emhdadj|FL|5612354383 +Yadgahd|Gyhdadj|FL|9040350779 +Jdtgahd|Inhdadj|FL|9042656755 +Wdugahd|Ebhdadj|FL|5612758787 +Ybegahd|Gxhdadj|FL|9041351779 +Jdvgahd|Ichdadj|FL|9042856755 +Wdxgahd|Eehdadj|FL|5610306109 +Ybfgahd|Gwhdadj|FL|9042352779 +Jdwgahd|Idhdadj|FL|9042956755 +Xbigahd|Eshdadj|FL|9045356790 +Ybhgahd|Gthdadj|FL|9044354779 +Kckgahd|Jihdadj|FL|9047386704 +Xckgahd|Eihdadj|FL|9047356790 +Ycjgahd|Gphdadj|FL|9046356779 +Kcngahd|Jghdadj|FL|9042051704 +Xcmgahd|Fxhdadj|FL|9049356790 +Yclgahd|Gbhdadj|FL|9048358744 +Kcogahd|Kahdadj|FL|9042152704 +Xcpgahd|Fkhdadj|FL|9042256779 +Ycpgahd|Gkhdadj|FL|9042256244 +Kdvgahd|Kchdadj|FL|9042859766 +Xdvgahd|Fchdadj|FL|9042856779 +Ydtgahd|Hnhdadj|FL|9042656644 +Kdwgahd|Ldhdadj|FL|9042956066 +Xdwgahd|Fdhdadj|FL|9042956779 +Ydwgahd|Hdhdadj|FL|9042956944 +Ladgahd|Lyhdadj|FL|9040300766 +Xdxgahd|Fehdadj|FL|9042306779 +Ydxgahd|Hehdadj|FL|9042306709 +Lbggahd|Luhdadj|FL|9043333729 +Ybigahd|Gshdadj|FL|9045355779 +Ydygahd|Hfhdadj|FL|9042316719 +Lbhgahd|Lthdadj|FL|9044344729 +Yckgahd|Gihdadj|FL|9047357779 +Ydzgahd|Hghdadj|FL|9042326729 +Lcjgahd|Lphdadj|FL|9046376729 +Ycogahd|Gahdadj|FL|9042156144 +Zadgahd|Hyhdadj|FL|9040356744 +Lclgahd|Mbhdadj|FL|9045618729 +Ycqgahd|Gmhdadj|FL|9042356344 +Zbfgahd|Hwhdadj|FL|9042356744 +Lcngahd|Mghdadj|FL|9042090429 +Ydsgahd|Hdhdadj|FL|9042556544 +Zbhgahd|Hthdadj|FL|9044356766 +Lcogahd|Mahdadj|FL|9042152129 +Ydvgahd|Hchdadj|FL|9042856844 +Zcjgahd|Iphdadj|FL|9046356766 +Lcpgahd|Mkhdadj|FL|9042253229 +Zbegahd|Hxhdadj|FL|9041356744 +Zcmgahd|Ixhdadj|FL|9049356766 +Lcrgahd|Mbhdadj|FL|9042455429 +Zcogahd|Iahdadj|FL|9042156766 +Zdvgahd|Jchdadj|FL|9042856751 +Ldtgahd|Mnhdadj|FL|9042657629 +Zcpgahd|Ikhdadj|FL|9042256766 +Kedgahd|Jyhdadj|FL|9040306751 +Ldugahd|Mbhdadj|FL|9042758729 +Zdwgahd|Jdhdadj|FL|9042956751 +Keegahd|Jxhdadj|FL|9041316751 +Madgahd|Nyhdadj|FL|9040300709 +Zdygahd|Jfhdadj|FL|9042316751 +Kehgahd|Jthdadj|FL|9044346751 +Mbggahd|Nuhdadj|FL|9043333739 +Kefgahd|Jwhdadj|FL|9042326751 +Kelgahd|Jbhdadj|FL|9045616751 +Mbhgahd|Nthdadj|FL|9044344749 +Keigahd|Jshdadj|FL|9045356751 +Keqgahd|Kmhdadj|FL|9042354762 +Mcjgahd|Nphdadj|FL|9046376769 +Kemgahd|Kxhdadj|FL|9049350751 +Ketgahd|Knhdadj|FL|9042657762 +Mcpgahd|Okhdadj|FL|9042253282 +Kengahd|Kghdadj|FL|9042051751 +Kezgahd|Kghdadj|FL|9042326362 +Mdsgahd|Odhdadj|FL|9042556585 +Kepgahd|Kkhdadj|FL|9042253751 +Liggahd|Luhdadj|FL|9043333762 +Mdwgahd|Pdhdadj|FL|9042956989 +Kesgahd|Kdhdadj|FL|9042556762 +Likgahd|Lihdadj|FL|9047387762 +Mdygahd|Pfhdadj|FL|9041316219 +Kewgahd|Kdhdadj|FL|9042956062 +Lilgahd|Lbhdadj|FL|9045618762 +Mdzgahd|Pghdadj|FL|9042326329 +Kexgahd|Kehdadj|FL|9042306162 +Lipgahd|Lkhdadj|FL|9042253288 +Nadgahd|Pyhdadj|FL|9040300709 +Lidgahd|Lyhdadj|FL|9040300762 +Liygahd|Mfhdadj|FL|9042316219 +Nbfgahd|Pwhdadj|FL|9042322729 +Liegahd|Lxhdadj|FL|9041311762 +Moegahd|Mxhdadj|FL|9041311719 +Nbggahd|Puhdadj|FL|9043333739 +Liigahd|Lshdadj|FL|9045355762 +Moggahd|Muhdadj|FL|9043333739 +Nbhgahd|Pthdadj|FL|9044344749 +Lijgahd|Lphdadj|FL|9046376762 +Mohgahd|Mthdadj|FL|9044344749 +Ncmgahd|Qxhdadj|FL|9049359799 +Liqgahd|Lmhdadj|FL|9042354388 +Momgahd|Nxhdadj|FL|9049359799 +Ncogahd|Qahdadj|FL|9042152181 +Lirgahd|Mbhdadj|FL|9042455488 +Moqgahd|Nmhdadj|FL|9042354383 +Ncpgahd|Qkhdadj|FL|9042253282 +Litgahd|Mnhdadj|FL|9042657688 +Motgahd|Nnhdadj|FL|9042657686 +Ndwgahd|Qdhdadj|FL|9042956989 +Liugahd|Mbhdadj|FL|9042758788 +Movgahd|Nchdadj|FL|9042859888 +Oadgahd|Ryhdadj|FL|5610356776 +Lizgahd|Mghdadj|FL|9042326329 +Mozgahd|Oghdadj|FL|9042326329 +Obegahd|Rxhdadj|FL|5611356776 +Modgahd|Myhdadj|FL|9040300709 +Nufgahd|Owhdadj|FL|9042322729 +Obfgahd|Rwhdadj|FL|5612356776 +Mongahd|Nghdadj|FL|9042090480 +Nuggahd|Ouhdadj|FL|9043333739 +Ocjgahd|Sphdadj|FL|5616356776 +Mopgahd|Nkhdadj|FL|9042253282 +Nuhgahd|Othdadj|FL|9044344749 +Ockgahd|Sihdadj|FL|5617356776 +Mosgahd|Ndhdadj|FL|9042556585 +Nukgahd|Oihdadj|FL|9047387779 +Ocngahd|Sghdadj|FL|5612056776 +Mowgahd|Ndhdadj|FL|9042956989 +Nulgahd|Pbhdadj|FL|9045618789 +Odtgahd|Snhdadj|FL|5612656776 +Nudgahd|Oyhdadj|FL|9040300709 +Nuxgahd|Qehdadj|FL|9040306109 +Odwgahd|Tdhdadj|FL|5612956776 +Nujgahd|Ophdadj|FL|9046376769 +Nuygahd|Qfhdadj|FL|9041316219 +Pbhgahd|Tthdadj|FL|5614354767 +Numgahd|Pxhdadj|FL|9049359799 +Badgahd|Eyhdadj|FL|3050350711 +Pcogahd|Uahdadj|FL|5612156167 +Nungahd|Pghdadj|FL|9042090480 +Bbfgahd|Ewhdadj|FL|3052352711 +Pcqgahd|Umhdadj|FL|5612356367 +Nuogahd|Pahdadj|FL|9042152181 +Bcjgahd|Fphdadj|FL|3056356711 +Pcrgahd|Ubhdadj|FL|5612456467 +Nuqgahd|Pmhdadj|FL|9042354383 +Bclgahd|Fbhdadj|FL|3058358700 +Pdtgahd|Unhdadj|FL|5612656600 +Nurgahd|Pbhdadj|FL|9042455484 +Bcogahd|Fahdadj|FL|3052156100 +Pdvgahd|Uchdadj|FL|5612856800 +Nutgahd|Pnhdadj|FL|9042657686 +Bcqgahd|Gmhdadj|FL|3052356300 +Rbegahd|Vxhdadj|FL|5611356700 +Nuugahd|Pbhdadj|FL|9042758787 +Bcrgahd|Gbhdadj|FL|3052456400 +Rbfgahd|Vwhdadj|FL|5612356700 +Nuzgahd|Qghdadj|FL|9042326329 +Bdvgahd|Gchdadj|FL|3052856800 +Rckgahd|Vihdadj|FL|5617356700 +Aadgahd|Ayhdadj|FL|3050356710 +Cadgahd|Iyhdadj|FL|3050356712 +Rclgahd|Wbhdadj|FL|5618356700 +Abhgahd|Athdadj|FL|3054356710 +Cbegahd|Ixhdadj|FL|3056156712 +Rcmgahd|Wxhdadj|FL|5619356700 +Ackgahd|Bihdadj|FL|3057356710 +Cbhgahd|Ithdadj|FL|3054356712 +Rcogahd|Wahdadj|FL|5612156700 +Aclgahd|Bbhdadj|FL|3058356710 +Ccmgahd|Jxhdadj|FL|3059356721 +Rcqgahd|Wmhdadj|FL|5612356706 +Acmgahd|Bxhdadj|FL|3059356701 +Ccogahd|Jahdadj|FL|3052156721 +Rdsgahd|Wdhdadj|FL|5612556706 +Acpgahd|Bkhdadj|FL|3052256701 +Ccpgahd|Kkhdadj|FL|3052256721 +Rdtgahd|Wnhdadj|FL|5612656706 +Adtgahd|Cnhdadj|FL|3052656701 +Ccqgahd|Kmhdadj|FL|3052356721 +Rdwgahd|Wdhdadj|FL|5612956706 +Advgahd|Dchdadj|FL|3052856701 +Cdwgahd|Ldhdadj|FL|3052956721 +Scjgahd|Xphdadj|FL|5616376740 +Adxgahd|Dehdadj|FL|3052306711 +Cdzgahd|Lghdadj|FL|3052326722 +Scmgahd|Xxhdadj|FL|5619350740 +Adygahd|Dfhdadj|FL|3052316711 +Dbggahd|Muhdadj|FL|3053336722 +Scrgahd|Ybhdadj|FL|5612455740 +Bbegahd|Axhdadj|FL|3056151711 +Dckgahd|Nihdadj|FL|3057386722 +Sdtgahd|Ynhdadj|FL|5612657740 +Bckgahd|Fihdadj|FL|3057357700 +Dcogahd|Nahdadj|FL|3052152732 +Sdugahd|Ybhdadj|FL|5612758740 +Bcmgahd|Fxhdadj|FL|3059359700 +Dcrgahd|Obhdadj|FL|3052455732 +Sdygahd|Yfhdadj|FL|5612316233 +Bcpgahd|Gkhdadj|FL|3052256200 +Ddsgahd|Odhdadj|FL|3052556732 +Uadgahd|Zyhdadj|FL|5610300733 +Bdsgahd|Gdhdadj|FL|3052555610 +Ddtgahd|Onhdadj|FL|3052657732 +Ubegahd|Zxhdadj|FL|5611311733 +Bdugahd|Gbhdadj|FL|3052756700 +Ddugahd|Obhdadj|FL|3052758732 +Ubigahd|Zshdadj|FL|5615355733 +Bdwgahd|Hdhdadj|FL|3052956900 +Eadgahd|Ryhdadj|FL|3050300745 +Uclgahd|Zbhdadj|FL|5615618733 +Bdzgahd|Hghdadj|FL|3052326729 +Ebegahd|Rxhdadj|FL|3056111745 +Ucmgahd|Axhdadj|FL|5619359733 +Cbigahd|Ishdadj|FL|3055356712 +Ebfgahd|Rwhdadj|FL|3052322745 +Ucqgahd|Amhdadj|FL|5612354333 +Ccjgahd|Jphdadj|FL|3056356712 +Ebhgahd|Rthdadj|FL|3054344745 +Udtgahd|Anhdadj|FL|5612657633 +Cckgahd|Jihdadj|FL|3057356712 +Eckgahd|Sihdadj|FL|3057387745 +Udugahd|Abhdadj|FL|5612758733 +Cclgahd|Jbhdadj|FL|3058356721 +Ecmgahd|Sxhdadj|FL|3059359745 +Udxgahd|Aehdadj|FL|5612306109 +Ccrgahd|Kbhdadj|FL|3052456721 +Ecogahd|Tahdadj|FL|3052152145 +Vbggahd|Buhdadj|FL|5613333739 +Cdsgahd|Kdhdadj|FL|3052556721 +Ecrgahd|Tbhdadj|FL|3052455445 +Vcngahd|Cghdadj|FL|5612090480 +Cdxgahd|Lehdadj|FL|3052306721 +Edugahd|Ubhdadj|FL|3052758709 +Vcogahd|Cahdadj|FL|5612152181 +Dbhgahd|Mthdadj|FL|3054346722 +Edvgahd|Uchdadj|FL|3052859809 +Vcrgahd|Cbhdadj|FL|5612455484 +Dbigahd|Nshdadj|FL|3055356722 +Edzgahd|Vghdadj|FL|3052326329 +Vdsgahd|Cdhdadj|FL|5612556585 +Dclgahd|Nbhdadj|FL|3055616732 +Fadgahd|Vyhdadj|FL|3050300709 +Vdtgahd|Cnhdadj|FL|5612657686 +Dcqgahd|Omhdadj|FL|3052354732 +Fbigahd|Wshdadj|FL|3055355759 +Wbegahd|Dxhdadj|FL|5611311719 +Ddvgahd|Ochdadj|FL|3052859732 +Fcjgahd|Wphdadj|FL|3056376769 +Wbigahd|Dshdadj|FL|5615355759 +Ddwgahd|Odhdadj|FL|3052956045 +Fclgahd|Wbhdadj|FL|3055618789 +Wckgahd|Dihdadj|FL|5617387779 +Ebigahd|Sshdadj|FL|3055355745 +Fcngahd|Wghdadj|FL|3052031080 +Wclgahd|Dbhdadj|FL|5615618789 +Ecjgahd|Sphdadj|FL|3056376745 +Fcpgahd|Wkhdadj|FL|3052253282 +Wcngahd|Dghdadj|FL|5612090480 +Eclgahd|Sbhdadj|FL|3055618745 +Fdtgahd|Xnhdadj|FL|3052657686 +Wcrgahd|Ebhdadj|FL|5612455484 +Ecngahd|Sghdadj|FL|3052031045 +Fdygahd|Yfhdadj|FL|3056116219 +Wdsgahd|Edhdadj|FL|5612556585 +Edwgahd|Udhdadj|FL|3052956909 +Gbigahd|Zshdadj|FL|3055355759 +Wdtgahd|Enhdadj|FL|5612657686 +Edygahd|Vfhdadj|FL|3052316219 +Gckgahd|Zihdadj|FL|3057387779 +Wdwgahd|Edhdadj|FL|5612956989 +Fbfgahd|Vwhdadj|FL|3052322729 +Gcmgahd|Zxhdadj|FL|3059359799 +Wdzgahd|Eghdadj|FL|5612326329 +Fcmgahd|Wxhdadj|FL|3059359799 +Gcogahd|Zahdadj|FL|3052152181 +Xadgahd|Eyhdadj|FL|9040356790 +Fcqgahd|Xmhdadj|FL|3052354383 +Gcpgahd|Zkhdadj|FL|3052253282 +Xclgahd|Fbhdadj|FL|9048356790 +Fcrgahd|Xbhdadj|FL|3052455484 +Gdtgahd|Anhdadj|FL|3052657686 +Xcogahd|Fahdadj|FL|9042156790 +Fdzgahd|Yghdadj|FL|3052326329 +Gdugahd|Abhdadj|FL|3052758787 +Xcqgahd|Fmhdadj|FL|9042356779 +Gadgahd|Yyhdadj|FL|3050300709 +Gdwgahd|Adhdadj|FL|3052956989 +Xcrgahd|Fbhdadj|FL|9042456779 +Gbegahd|Yxhdadj|FL|3056111719 +Gdxgahd|Aehdadj|FL|3050306109 +Xdtgahd|Fnhdadj|FL|9042656779 +Gbggahd|Yuhdadj|FL|3053333739 +Hadgahd|Byhdadj|FL|5610356799 +Xdzgahd|Fghdadj|FL|9042326779 +Gcjgahd|Zphdadj|FL|3056376769 +Hbigahd|Bshdadj|FL|5615356799 +Ybggahd|Guhdadj|FL|9043353779 +Gcngahd|Zghdadj|FL|3052031080 +Hcjgahd|Bphdadj|FL|5616356799 +Ycmgahd|Gxhdadj|FL|9049359744 +Gdsgahd|Adhdadj|FL|3052556585 +Hckgahd|Bihdadj|FL|5617356799 +Ycngahd|Gghdadj|FL|9042056044 +Gdzgahd|Aghdadj|FL|3052326329 +Hclgahd|Bbhdadj|FL|5618356799 +Ycrgahd|Gbhdadj|FL|9042456444 +Hbggahd|Buhdadj|FL|5613356799 +Hcngahd|Bghdadj|FL|5612056799 +Ydugahd|Hbhdadj|FL|9042756744 +Hbhgahd|Bthdadj|FL|5614356799 +Hcpgahd|Ckhdadj|FL|5612256767 +Zbggahd|Huhdadj|FL|9043356766 +Hcmgahd|Bxhdadj|FL|5619356799 +Hdsgahd|Cdhdadj|FL|5612556767 +Zbigahd|Ishdadj|FL|9045356766 +Hcogahd|Bahdadj|FL|5612156799 +Hdtgahd|Cnhdadj|FL|5612656767 +Zckgahd|Iihdadj|FL|9047356766 +Hcqgahd|Cmhdadj|FL|5612356767 +Hdzgahd|Dghdadj|FL|5612326767 +Zclgahd|Ibhdadj|FL|9048356766 +Hcrgahd|Cbhdadj|FL|5612456767 +Ibegahd|Dxhdadj|FL|5611351778 +Zcngahd|Ighdadj|FL|9042056766 +Hdvgahd|Cchdadj|FL|5612856767 +Ibfgahd|Dwhdadj|FL|5612352778 +Zcqgahd|Imhdadj|FL|9042356766 +Hdwgahd|Cdhdadj|FL|5612956767 +Ibigahd|Dshdadj|FL|5615355778 +Zcrgahd|Ibhdadj|FL|9042456766 +Hdxgahd|Cehdadj|FL|5612306767 +Icngahd|Eghdadj|FL|5612056078 +Zdsgahd|Idhdadj|FL|9042556766 +Hdygahd|Dfhdadj|FL|5612316767 +Icpgahd|Ekhdadj|FL|5612256278 +Zdtgahd|Inhdadj|FL|9042656766 +Ibggahd|Duhdadj|FL|5613353778 +Icqgahd|Emhdadj|FL|5612356356 +Zdugahd|Ibhdadj|FL|9042756766 +Ickgahd|Eihdadj|FL|5617357778 +Idugahd|Fbhdadj|FL|5612756756 +Zdxgahd|Jehdadj|FL|9042306751 +Icogahd|Eahdadj|FL|5612156178 +Jadgahd|Gyhdadj|FL|5610356701 +Zdzgahd|Jghdadj|FL|9042326751 +Icrgahd|Fbhdadj|FL|5612456456 +Jbegahd|Gxhdadj|FL|5611356701 +Keggahd|Juhdadj|FL|9043336751 +Idsgahd|Fdhdadj|FL|5612556556 +Jbfgahd|Gwhdadj|FL|5612356701 +Kejgahd|Jphdadj|FL|9046376751 +Idtgahd|Fnhdadj|FL|5612656656 +Jbigahd|Gshdadj|FL|5615356701 +Kekgahd|Jihdadj|FL|9047386751 +Idvgahd|Fchdadj|FL|5612856856 +Jckgahd|Hihdadj|FL|5617356701 +Keogahd|Kahdadj|FL|9042152751 +Idwgahd|Fdhdadj|FL|5612956956 +Jclgahd|Hbhdadj|FL|5618356701 +Kergahd|Kbhdadj|FL|9042455762 +Idxgahd|Fehdadj|FL|5612306709 +Jcrgahd|Hbhdadj|FL|5612456755 +Keugahd|Kbhdadj|FL|9042758762 +Jcogahd|Hahdadj|FL|5612156755 +Jdsgahd|Hdhdadj|FL|5612556755 +Kevgahd|Kchdadj|FL|9042859762 +Jcpgahd|Hkhdadj|FL|5612256755 +Jdzgahd|Ighdadj|FL|5612326755 +Keygahd|Kfhdadj|FL|9042315612 +Jcqgahd|Hmhdadj|FL|5612356755 +Kadgahd|Iyhdadj|FL|5610306704 +Lifgahd|Lwhdadj|FL|9042322762 +Jdugahd|Ibhdadj|FL|5612756755 +Kbegahd|Ixhdadj|FL|5611316704 +Lihgahd|Lthdadj|FL|9044344762 +Jdxgahd|Iehdadj|FL|5612306755 +Kbfgahd|Jwhdadj|FL|5612326704 +Limgahd|Lxhdadj|FL|9049359762 +Jdygahd|Ifhdadj|FL|5612316755 +Kbigahd|Jshdadj|FL|5615356704 +Lingahd|Lghdadj|FL|9042090488 +Kbggahd|Juhdadj|FL|5613336704 +Kcjgahd|Jphdadj|FL|5616376704 +Liogahd|Lahdadj|FL|9042152188 +Kbhgahd|Jthdadj|FL|5614346704 +Kclgahd|Jbhdadj|FL|5615616704 +Lisgahd|Mdhdadj|FL|9042556588 +Kcmgahd|Jxhdadj|FL|5619350704 +Kcqgahd|Kmhdadj|FL|5612354766 +Livgahd|Mchdadj|FL|9042859888 +Kcpgahd|Kkhdadj|FL|5612253704 +Kcrgahd|Kbhdadj|FL|5612455766 +Liwgahd|Mdhdadj|FL|9042956988 +Kdtgahd|Knhdadj|FL|5612657766 +Kdsgahd|Kdhdadj|FL|5612556766 +Lixgahd|Mehdadj|FL|9042306109 +Kdxgahd|Lehdadj|FL|5612306166 +Kdugahd|Kbhdadj|FL|5612758766 +Mofgahd|Mwhdadj|FL|9042322729 +Kdygahd|Lfhdadj|FL|5612315616 +Kdzgahd|Lghdadj|FL|5612326366 +Moigahd|Mshdadj|FL|9045355759 +Lbfgahd|Lwhdadj|FL|5612322766 +Lbegahd|Lxhdadj|FL|5611311766 +Mojgahd|Nphdadj|FL|9046376769 +Lbigahd|Lshdadj|FL|5615355729 +Ldsgahd|Mdhdadj|FL|5612556529 +Mokgahd|Nihdadj|FL|9047387779 +Lckgahd|Mihdadj|FL|5617387729 +Ldvgahd|Nchdadj|FL|5612859829 +Molgahd|Nbhdadj|FL|9045618789 +Lcmgahd|Mxhdadj|FL|5619359729 +Ldwgahd|Ndhdadj|FL|5612956929 +Moogahd|Nahdadj|FL|9042152181 +Lcqgahd|Mmhdadj|FL|5612354329 +Ldygahd|Nfhdadj|FL|5612316219 +Morgahd|Nbhdadj|FL|9042455484 +Ldxgahd|Nehdadj|FL|5612306109 +Mbfgahd|Nwhdadj|FL|5612322729 +Mougahd|Nbhdadj|FL|9042758787 +Ldzgahd|Nghdadj|FL|5612326329 +Mclgahd|Obhdadj|FL|5615618789 +Moxgahd|Nehdadj|FL|9040306109 +Mbegahd|Nxhdadj|FL|5611311719 +Mcmgahd|Oxhdadj|FL|5619359799 +Moygahd|Ofhdadj|FL|9041316219 +Mbigahd|Nshdadj|FL|5615355759 +Mcqgahd|Omhdadj|FL|5612354383 +Nuegahd|Oxhdadj|FL|9041311719 +Mckgahd|Nihdadj|FL|5617387779 +Mcrgahd|Obhdadj|FL|5612455484 +Nuigahd|Oshdadj|FL|9045355759 +Mcngahd|Oghdadj|FL|5612031080 +Mdxgahd|Pehdadj|FL|5610306109 +Nupgahd|Pkhdadj|FL|9042253282 +Mcogahd|Oahdadj|FL|5612152181 +Ncjgahd|Pphdadj|FL|5616376769 +Nusgahd|Pdhdadj|FL|9042556585 +Mdtgahd|Onhdadj|FL|5612657686 +Nckgahd|Pihdadj|FL|5617387779 +Nuvgahd|Pchdadj|FL|9042859888 +Mdugahd|Obhdadj|FL|5612758787 +Ncrgahd|Qbhdadj|FL|5612455484 +Nuwgahd|Pdhdadj|FL|9042956989 +Mdvgahd|Ochdadj|FL|5612859888 +Ndtgahd|Qnhdadj|FL|5612657686 +Abegahd|Axhdadj|FL|3056156710 +Nbegahd|Pxhdadj|FL|5611311719 +Ndugahd|Qbhdadj|FL|5612758787 +Abfgahd|Awhdadj|FL|3052356710 +Nbigahd|Pshdadj|FL|5615355759 +Ndvgahd|Qchdadj|FL|5612859888 +Abggahd|Auhdadj|FL|3053356710 +Nclgahd|Qbhdadj|FL|5615618789 +Ndygahd|Rfhdadj|FL|5611316219 +Abigahd|Ashdadj|FL|3055356710 +Ncngahd|Qghdadj|FL|5612031080 +Ndzgahd|Rghdadj|FL|5612326329 +Acjgahd|Bphdadj|FL|3056356710 +Ncqgahd|Qmhdadj|FL|5612354383 +Obggahd|Ruhdadj|FL|5613356776 +Acngahd|Bghdadj|FL|3052056701 +Ndsgahd|Qdhdadj|FL|5612556585 +Obigahd|Rshdadj|FL|5615356776 +Acogahd|Bahdadj|FL|3052156701 +Ndxgahd|Rehdadj|FL|5610306109 +Oclgahd|Sbhdadj|FL|5618356776 +Acqgahd|Cmhdadj|FL|3052356701 +Obhgahd|Rthdadj|FL|5614356776 +Ocmgahd|Sxhdadj|FL|5619356776 +Acrgahd|Cbhdadj|FL|3052456701 +Ocpgahd|Skhdadj|FL|5612256776 +Ocogahd|Sahdadj|FL|5612156776 +Adsgahd|Cdhdadj|FL|3052556701 +Ocrgahd|Sbhdadj|FL|5612456776 +Ocqgahd|Smhdadj|FL|5612356776 +Adugahd|Cbhdadj|FL|3052756701 +Odsgahd|Sdhdadj|FL|5612556776 +Odugahd|Tbhdadj|FL|5612756776 +Adwgahd|Ddhdadj|FL|3052956711 +Odvgahd|Tchdadj|FL|5612856776 +Padgahd|Tyhdadj|FL|5610350767 +Adzgahd|Dghdadj|FL|3052326711 +Odxgahd|Tehdadj|FL|5612306767 +Pbfgahd|Twhdadj|FL|5612352767 +Bbggahd|Euhdadj|FL|3053353711 +Odygahd|Tfhdadj|FL|5612316767 +Pbggahd|Tuhdadj|FL|5613353767 +Bbhgahd|Ethdadj|FL|3054354711 +Odzgahd|Tghdadj|FL|5612326767 +Pcjgahd|Uphdadj|FL|5616356767 +Bbigahd|Eshdadj|FL|3055355711 +Pbegahd|Txhdadj|FL|5611351767 +Pckgahd|Uihdadj|FL|5617357767 +Bcngahd|Fghdadj|FL|3052056000 +Pbigahd|Tshdadj|FL|5615355767 +Pcngahd|Ughdadj|FL|5612056067 +Bdtgahd|Gnhdadj|FL|3052656600 +Pclgahd|Ubhdadj|FL|5618358767 +Pdugahd|Ubhdadj|FL|5612756700 +Bdxgahd|Hehdadj|FL|3052306709 +Pcmgahd|Uxhdadj|FL|5619359767 +Pdxgahd|Vehdadj|FL|5612306709 +Bdygahd|Hfhdadj|FL|3052316719 +Pcpgahd|Ukhdadj|FL|5612255617 +Pdygahd|Vfhdadj|FL|5612316719 +Cbfgahd|Iwhdadj|FL|3052356712 +Pdsgahd|Udhdadj|FL|5612555610 +Rbggahd|Vuhdadj|FL|5613356700 +Cbggahd|Iuhdadj|FL|3053356712 +Pdwgahd|Udhdadj|FL|5612956900 +Rbigahd|Vshdadj|FL|5615356700 +Ccngahd|Jghdadj|FL|3052056721 +Pdzgahd|Vghdadj|FL|5612326729 +Rcjgahd|Vphdadj|FL|5616356700 +Cdtgahd|Knhdadj|FL|3052656721 +Radgahd|Vyhdadj|FL|5610356700 +Sbfgahd|Xwhdadj|FL|5612326706 +Cdugahd|Kbhdadj|FL|3052756721 +Rbhgahd|Vthdadj|FL|5614356700 +Sbggahd|Xuhdadj|FL|5613336706 +Cdvgahd|Lchdadj|FL|3052856721 +Rcngahd|Wghdadj|FL|5612056700 +Sbigahd|Xshdadj|FL|5615356740 +Cdygahd|Lfhdadj|FL|3052316722 +Rcpgahd|Wkhdadj|FL|5612256706 +Scngahd|Xghdadj|FL|5612051740 +Dadgahd|Myhdadj|FL|3050306722 +Rcrgahd|Wbhdadj|FL|5612456706 +Scpgahd|Ykhdadj|FL|5612253740 +Dbegahd|Mxhdadj|FL|3056116722 +Rdugahd|Wbhdadj|FL|5612756706 +Scqgahd|Ymhdadj|FL|5612354740 +Dbfgahd|Mwhdadj|FL|3052326722 +Rdvgahd|Wchdadj|FL|5612856706 +Sdzgahd|Yghdadj|FL|5612326333 +Dcjgahd|Nphdadj|FL|3056376722 +Rdxgahd|Wehdadj|FL|5612306706 +Ubggahd|Zuhdadj|FL|5613333733 +Dcmgahd|Nxhdadj|FL|3059350732 +Rdygahd|Wfhdadj|FL|5612316706 +Ubhgahd|Zthdadj|FL|5614344733 +Dcngahd|Nghdadj|FL|3052051732 +Rdzgahd|Wghdadj|FL|5612326706 +Uckgahd|Zihdadj|FL|5617387733 +Dcpgahd|Nkhdadj|FL|3052253732 +Sadgahd|Xyhdadj|FL|5610306706 +Ucngahd|Aghdadj|FL|5612031033 +Ddxgahd|Pehdadj|FL|3052306145 +Sbegahd|Xxhdadj|FL|5611316706 +Ucogahd|Aahdadj|FL|5612152133 +Ddygahd|Pfhdadj|FL|3052316245 +Sbhgahd|Xthdadj|FL|5614346706 +Ucrgahd|Abhdadj|FL|5612455433 +Ddzgahd|Pghdadj|FL|3052326345 +Sckgahd|Xihdadj|FL|5617386740 +Udsgahd|Adhdadj|FL|5612556533 +Ebggahd|Ruhdadj|FL|3053333745 +Sclgahd|Xbhdadj|FL|5615616740 +Udwgahd|Adhdadj|FL|5612956933 +Ecpgahd|Tkhdadj|FL|3052253245 +Scogahd|Yahdadj|FL|5612152740 +Udzgahd|Bghdadj|FL|5612326329 +Ecqgahd|Tmhdadj|FL|3052354345 +Sdsgahd|Ydhdadj|FL|5612556740 +Vbfgahd|Bwhdadj|FL|5612322729 +Edsgahd|Tdhdadj|FL|3052555619 +Sdvgahd|Ychdadj|FL|5612859740 +Vcjgahd|Bphdadj|FL|5616376769 +Edtgahd|Unhdadj|FL|3052657609 +Sdwgahd|Ydhdadj|FL|5612956040 +Vcmgahd|Cxhdadj|FL|5619359799 +Edxgahd|Uehdadj|FL|3052306109 +Sdxgahd|Yehdadj|FL|5612306140 +Vcpgahd|Ckhdadj|FL|5612253282 +Fbegahd|Vxhdadj|FL|3056111719 +Ubfgahd|Zwhdadj|FL|5612322733 +Vdxgahd|Cehdadj|FL|5610306109 +Fbggahd|Vuhdadj|FL|3053333739 +Ucjgahd|Zphdadj|FL|5616376733 +Vdygahd|Cfhdadj|FL|5611316219 +Fbhgahd|Vthdadj|FL|3054344749 +Ucpgahd|Akhdadj|FL|5612253233 +Vdzgahd|Cghdadj|FL|5612326329 +Fckgahd|Wihdadj|FL|3057387779 +Udvgahd|Achdadj|FL|5612859833 +Wadgahd|Dyhdadj|FL|5610300709 +Fcogahd|Wahdadj|FL|3052152181 +Udygahd|Bfhdadj|FL|5612316219 +Wbggahd|Duhdadj|FL|5613333739 +Fdsgahd|Xdhdadj|FL|3052556585 +Vadgahd|Byhdadj|FL|5610300709 +Wcjgahd|Dphdadj|FL|5616376769 +Fdugahd|Xbhdadj|FL|3052758787 +Vbegahd|Bxhdadj|FL|5611311719 +Wcmgahd|Dxhdadj|FL|5619359799 +Fdvgahd|Xchdadj|FL|3052859888 +Vbhgahd|Bthdadj|FL|5614344749 +Wdvgahd|Echdadj|FL|5612859888 +Fdwgahd|Xdhdadj|FL|3052956989 +Vbigahd|Bshdadj|FL|5615355759 +Wdygahd|Efhdadj|FL|5611316219 +Fdxgahd|Xehdadj|FL|3050306109 +Vckgahd|Bihdadj|FL|5617387779 +Xbegahd|Exhdadj|FL|5611356790 +Gbfgahd|Ywhdadj|FL|3052322729 +Vclgahd|Bbhdadj|FL|5615618789 +Xbfgahd|Ewhdadj|FL|5612356790 +Gbhgahd|Ythdadj|FL|3054344749 +Vcqgahd|Cmhdadj|FL|5612354383 +Xbggahd|Euhdadj|FL|5613356790 +Gclgahd|Zbhdadj|FL|3055618789 +Vdugahd|Cbhdadj|FL|5612758787 +Xbhgahd|Ethdadj|FL|5614356790 +Gcqgahd|Zmhdadj|FL|3052354383 +Vdvgahd|Cchdadj|FL|5612859888 +Xcjgahd|Ephdadj|FL|5616356790 +Gcrgahd|Zbhdadj|FL|3052455484 +Vdwgahd|Cdhdadj|FL|5612956989 +Xcngahd|Fghdadj|FL|5612056790 +Gdvgahd|Achdadj|FL|3052859888 +Wbfgahd|Dwhdadj|FL|5612322729 +Xdsgahd|Fdhdadj|FL|5612556779 +Gdygahd|Afhdadj|FL|3056116219 +Wbhgahd|Dthdadj|FL|5614344749 +Xdugahd|Fbhdadj|FL|5612756779 +Hbegahd|Bxhdadj|FL|5611356799 +Wcogahd|Dahdadj|FL|5612152181 +Xdygahd|Ffhdadj|FL|5612316779 +Hbfgahd|Bwhdadj|FL|5612356799 +Wcpgahd|Dkhdadj|FL|5612253282 +Yadgahd|Gyhdadj|FL|5610350779 +Hdugahd|Cbhdadj|FL|5612756767 +Wcqgahd|Emhdadj|FL|5612354383 +Ybegahd|Gxhdadj|FL|5611351779 +Iadgahd|Dyhdadj|FL|5610350767 +Wdugahd|Ebhdadj|FL|5612758787 +Ybfgahd|Gwhdadj|FL|5612352779 +Ibhgahd|Dthdadj|FL|5614354778 +Wdxgahd|Eehdadj|FL|5610306109 +Ybhgahd|Gthdadj|FL|5614354779 +Icjgahd|Dphdadj|FL|5616356778 +Xbigahd|Eshdadj|FL|5615356790 +Ycjgahd|Gphdadj|FL|5616356779 +Iclgahd|Ebhdadj|FL|5618358778 +Xckgahd|Eihdadj|FL|5617356790 +Yclgahd|Gbhdadj|FL|5618358744 +Icmgahd|Exhdadj|FL|5619359778 +Xcmgahd|Fxhdadj|FL|5619356790 +Ycpgahd|Gkhdadj|FL|5612256244 +Idygahd|Gfhdadj|FL|5612316719 +Xcpgahd|Fkhdadj|FL|5612256779 +Ydtgahd|Hnhdadj|FL|5612656644 +Idzgahd|Gghdadj|FL|5612326729 +Xdvgahd|Fchdadj|FL|5612856779 +Ydwgahd|Hdhdadj|FL|5612956944 +Jbggahd|Guhdadj|FL|5613356701 +Xdwgahd|Fdhdadj|FL|5612956779 +Ydxgahd|Hehdadj|FL|5612306709 +Jbhgahd|Gthdadj|FL|5614356701 +Xdxgahd|Fehdadj|FL|5612306779 +Ydygahd|Hfhdadj|FL|5612316719 +Jcjgahd|Gphdadj|FL|5616356701 +Ybigahd|Gshdadj|FL|5615355779 +Ydzgahd|Hghdadj|FL|5612326729 +Jcmgahd|Hxhdadj|FL|5619356701 +Yckgahd|Gihdadj|FL|5617357779 +Zadgahd|Hyhdadj|FL|5610356744 +Jcngahd|Hghdadj|FL|5612056755 +Ycogahd|Gahdadj|FL|5612156144 +Zbfgahd|Hwhdadj|FL|5612356744 +Jdtgahd|Inhdadj|FL|5612656755 +Ycqgahd|Gmhdadj|FL|5612356344 +Zbhgahd|Hthdadj|FL|5614356766 +Jdvgahd|Ichdadj|FL|5612856755 +Ydsgahd|Hdhdadj|FL|5612556544 +Zcjgahd|Iphdadj|FL|5616356766 +Jdwgahd|Idhdadj|FL|5612956755 +Ydvgahd|Hchdadj|FL|5612856844 +Zcmgahd|Ixhdadj|FL|5619356766 +Kckgahd|Jihdadj|FL|5617386704 +Zbegahd|Hxhdadj|FL|5611356744 +Zdvgahd|Jchdadj|FL|5612856751 +Kcngahd|Jghdadj|FL|5612051704 +Zcogahd|Iahdadj|FL|5612156766 +Kedgahd|Jyhdadj|FL|5610306751 +Kcogahd|Kahdadj|FL|5612152704 +Zcpgahd|Ikhdadj|FL|5612256766 +Keegahd|Jxhdadj|FL|5611316751 +Kdvgahd|Kchdadj|FL|5612859766 +Zdwgahd|Jdhdadj|FL|5612956751 +Kehgahd|Jthdadj|FL|5614346751 +Kdwgahd|Ldhdadj|FL|5612956066 +Zdygahd|Jfhdadj|FL|5612316751 +Kelgahd|Jbhdadj|FL|5615616751 +Ladgahd|Lyhdadj|FL|5610300766 +Kefgahd|Jwhdadj|FL|5612326751 +Keqgahd|Kmhdadj|FL|5612354762 +Lbggahd|Luhdadj|FL|5613333729 +Keigahd|Jshdadj|FL|5615356751 +Ketgahd|Knhdadj|FL|5612657762 +Lbhgahd|Lthdadj|FL|5614344729 +Kemgahd|Kxhdadj|FL|5619350751 +Kezgahd|Kghdadj|FL|5612326362 +Lcjgahd|Lphdadj|FL|5616376729 +Kengahd|Kghdadj|FL|5612051751 +Liggahd|Luhdadj|FL|5613333762 +Lclgahd|Mbhdadj|FL|5615618729 +Kepgahd|Kkhdadj|FL|5612253751 +Likgahd|Lihdadj|FL|5617387762 +Lcngahd|Mghdadj|FL|5612031029 +Kesgahd|Kdhdadj|FL|5612556762 +Lilgahd|Lbhdadj|FL|5615618762 +Lcogahd|Mahdadj|FL|5612152129 +Kewgahd|Kdhdadj|FL|5612956062 +Lipgahd|Lkhdadj|FL|5612253288 +Lcpgahd|Mkhdadj|FL|5612253229 +Kexgahd|Kehdadj|FL|5612306162 +Liygahd|Mfhdadj|FL|5612316219 +Lcrgahd|Mbhdadj|FL|5612455429 +Lidgahd|Lyhdadj|FL|5610300762 +Moegahd|Mxhdadj|FL|5611311719 +Ldtgahd|Mnhdadj|FL|5612657629 +Liegahd|Lxhdadj|FL|5611311762 +Moggahd|Muhdadj|FL|5613333739 +Ldugahd|Mbhdadj|FL|5612758729 +Liigahd|Lshdadj|FL|5615355762 +Mohgahd|Mthdadj|FL|5614344749 +Madgahd|Nyhdadj|FL|5610300709 +Lijgahd|Lphdadj|FL|5616376762 +Momgahd|Nxhdadj|FL|5619359799 +Mbggahd|Nuhdadj|FL|5613333739 +Liqgahd|Lmhdadj|FL|5612354388 +Moqgahd|Nmhdadj|FL|5612354383 +Mbhgahd|Nthdadj|FL|5614344749 +Lirgahd|Mbhdadj|FL|5612455488 +Motgahd|Nnhdadj|FL|5612657686 +Mcjgahd|Nphdadj|FL|5616376769 +Litgahd|Mnhdadj|FL|5612657688 +Movgahd|Nchdadj|FL|5612859888 +Mcpgahd|Okhdadj|FL|5612253282 +Liugahd|Mbhdadj|FL|5612758788 +Mozgahd|Oghdadj|FL|5612326329 +Mdsgahd|Odhdadj|FL|5612556585 +Lizgahd|Mghdadj|FL|5612326329 +Nufgahd|Owhdadj|FL|5612322729 +Mdwgahd|Pdhdadj|FL|5612956989 +Modgahd|Myhdadj|FL|5610300709 +Nuggahd|Ouhdadj|FL|5613333739 +Mdygahd|Pfhdadj|FL|5611316219 +Mongahd|Nghdadj|FL|5612031080 +Nuhgahd|Othdadj|FL|5614344749 +Mdzgahd|Pghdadj|FL|5612326329 +Mopgahd|Nkhdadj|FL|5612253282 +Nukgahd|Oihdadj|FL|5617387779 +Nadgahd|Pyhdadj|FL|5610300709 +Mosgahd|Ndhdadj|FL|5612556585 +Nulgahd|Pbhdadj|FL|5615618789 +Nbfgahd|Pwhdadj|FL|5612322729 +Mowgahd|Ndhdadj|FL|5612956989 +Nuxgahd|Qehdadj|FL|5610306109 +Nbggahd|Puhdadj|FL|5613333739 +Nudgahd|Oyhdadj|FL|5610300709 +Nuygahd|Qfhdadj|FL|5611316219 +Nbhgahd|Pthdadj|FL|5614344749 +Nujgahd|Ophdadj|FL|5616376769 +Badgahd|Eyhdadj|IL|3120350711 +Ncmgahd|Qxhdadj|FL|5619359799 +Numgahd|Pxhdadj|FL|5619359799 +Bbfgahd|Ewhdadj|IL|3122352711 +Ncogahd|Qahdadj|FL|5612152181 +Nungahd|Pghdadj|FL|5612031080 +Bcjgahd|Fphdadj|IL|3126356711 +Ncpgahd|Qkhdadj|FL|5612253282 +Nuogahd|Pahdadj|FL|5612152181 +Bclgahd|Fbhdadj|IL|3128358700 +Ndwgahd|Qdhdadj|FL|5612956989 +Nuqgahd|Pmhdadj|FL|5612354383 +Bcogahd|Fahdadj|IL|3122156100 +Oadgahd|Ryhdadj|FL|5610356776 +Nurgahd|Pbhdadj|FL|5612455484 +Bcqgahd|Gmhdadj|IL|3122356300 +Obegahd|Rxhdadj|FL|5611356776 +Nutgahd|Pnhdadj|FL|5612657686 +Bcrgahd|Gbhdadj|IL|3122456400 +Obfgahd|Rwhdadj|FL|5612356776 +Nuugahd|Pbhdadj|FL|5612758787 +Bdvgahd|Gchdadj|IL|3122856800 +Ocjgahd|Sphdadj|FL|5616356776 +Nuzgahd|Qghdadj|FL|5612326329 +Cadgahd|Iyhdadj|IL|3120356312 +Ockgahd|Sihdadj|FL|5617356776 +Aadgahd|Ayhdadj|IL|3120356710 +Cbegahd|Ixhdadj|IL|3121356312 +Ocngahd|Sghdadj|FL|5612056776 +Abhgahd|Athdadj|IL|3124356710 +Cbhgahd|Ithdadj|IL|3124356312 +Odtgahd|Snhdadj|FL|5612656776 +Ackgahd|Bihdadj|IL|3127356710 +Ccmgahd|Jxhdadj|IL|3129356721 +Odwgahd|Tdhdadj|FL|5612956776 +Aclgahd|Bbhdadj|IL|3128356710 +Ccogahd|Jahdadj|IL|3122156721 +Pbhgahd|Tthdadj|FL|5614354767 +Acmgahd|Bxhdadj|IL|3129356701 +Ccpgahd|Kkhdadj|IL|3122256721 +Pcogahd|Uahdadj|FL|5612156167 +Acpgahd|Bkhdadj|IL|3122256701 +Ccqgahd|Kmhdadj|IL|3122356721 +Pcqgahd|Umhdadj|FL|5612356367 +Adtgahd|Cnhdadj|IL|3122656701 +Cdwgahd|Ldhdadj|IL|3122956721 +Pcrgahd|Ubhdadj|FL|5612456467 +Advgahd|Dchdadj|IL|3122856701 +Cdzgahd|Lghdadj|IL|3122326722 +Pdtgahd|Unhdadj|FL|5612656600 +Adxgahd|Dehdadj|IL|3122306711 +Dbggahd|Muhdadj|IL|3123336722 +Pdvgahd|Uchdadj|FL|5612856800 +Adygahd|Dfhdadj|IL|3122316711 +Dckgahd|Nihdadj|IL|3127386722 +Rbegahd|Vxhdadj|FL|5611356700 +Bbegahd|Axhdadj|IL|3121351711 +Dcogahd|Nahdadj|IL|3122152732 +Rbfgahd|Vwhdadj|FL|5612356700 +Bckgahd|Fihdadj|IL|3127357700 +Dcrgahd|Obhdadj|IL|3122455732 +Rckgahd|Vihdadj|FL|5617356700 +Bcmgahd|Fxhdadj|IL|3129359700 +Ddsgahd|Odhdadj|IL|3122556732 +Rclgahd|Wbhdadj|FL|5618356700 +Bcpgahd|Gkhdadj|IL|3122256200 +Ddtgahd|Onhdadj|IL|3122657732 +Rcmgahd|Wxhdadj|FL|5619356700 +Bdsgahd|Gdhdadj|IL|3122558130 +Ddugahd|Obhdadj|IL|3122758732 +Rcogahd|Wahdadj|FL|5612156700 +Bdugahd|Gbhdadj|IL|3122756700 +Eadgahd|Ryhdadj|IL|3120300745 +Rcqgahd|Wmhdadj|FL|5612356706 +Bdwgahd|Hdhdadj|IL|3122956900 +Ebegahd|Rxhdadj|IL|3121311745 +Rdsgahd|Wdhdadj|FL|5612556706 +Bdzgahd|Hghdadj|IL|3122326729 +Ebfgahd|Rwhdadj|IL|3122322745 +Rdtgahd|Wnhdadj|FL|5612656706 +Cbigahd|Ishdadj|IL|3125356312 +Ebhgahd|Rthdadj|IL|3124344745 +Rdwgahd|Wdhdadj|FL|5612956706 +Ccjgahd|Jphdadj|IL|3126356312 +Eckgahd|Sihdadj|IL|3127387745 +Scjgahd|Xphdadj|FL|5616376740 +Cckgahd|Jihdadj|IL|3127356312 +Ecmgahd|Sxhdadj|IL|3129359745 +Scmgahd|Xxhdadj|FL|5619350740 +Cclgahd|Jbhdadj|IL|3128356721 +Ecogahd|Tahdadj|IL|3122152145 +Scrgahd|Ybhdadj|FL|5612455740 +Ccrgahd|Kbhdadj|IL|3122456721 +Ecrgahd|Tbhdadj|IL|3122455445 +Sdtgahd|Ynhdadj|FL|5612657740 +Cdsgahd|Kdhdadj|IL|3122556721 +Edugahd|Ubhdadj|IL|3122758709 +Sdugahd|Ybhdadj|FL|5612758740 +Cdxgahd|Lehdadj|IL|3122306721 +Edvgahd|Uchdadj|IL|3122859809 +Sdygahd|Yfhdadj|FL|5612316233 +Dbhgahd|Mthdadj|IL|3124346722 +Edzgahd|Vghdadj|IL|3122326329 +Uadgahd|Zyhdadj|FL|5610300733 +Dbigahd|Nshdadj|IL|3125356722 +Fadgahd|Vyhdadj|IL|3120300709 +Ubegahd|Zxhdadj|FL|5611311733 +Dclgahd|Nbhdadj|IL|3128136732 +Fbigahd|Wshdadj|IL|3125355759 +Ubigahd|Zshdadj|FL|5615355733 +Dcqgahd|Omhdadj|IL|3122354732 +Fcjgahd|Wphdadj|IL|3126376769 +Uclgahd|Zbhdadj|FL|5615618733 +Ddvgahd|Ochdadj|IL|3122859732 +Fclgahd|Wbhdadj|IL|3128138789 +Ucmgahd|Axhdadj|FL|5619359733 +Ddwgahd|Odhdadj|IL|3122956045 +Fcngahd|Wghdadj|IL|3122051080 +Ucqgahd|Amhdadj|FL|5612354333 +Ebigahd|Sshdadj|IL|3125355745 +Fcpgahd|Wkhdadj|IL|3122253282 +Udtgahd|Anhdadj|FL|5612657633 +Ecjgahd|Sphdadj|IL|3126376745 +Fdtgahd|Xnhdadj|IL|3122657686 +Udugahd|Abhdadj|FL|5612758733 +Eclgahd|Sbhdadj|IL|3128138745 +Fdygahd|Yfhdadj|IL|3121316219 +Udxgahd|Aehdadj|FL|5612306109 +Ecngahd|Sghdadj|IL|3122051045 +Gbigahd|Zshdadj|IL|3125355759 +Vbggahd|Buhdadj|FL|5613333739 +Edwgahd|Udhdadj|IL|3122956909 +Gckgahd|Zihdadj|IL|3127387779 +Vcngahd|Cghdadj|FL|5612031080 +Edygahd|Vfhdadj|IL|3122316219 +Gcmgahd|Zxhdadj|IL|3129359799 +Vcogahd|Cahdadj|FL|5612152181 +Fbfgahd|Vwhdadj|IL|3122322729 +Gcogahd|Zahdadj|IL|3122152181 +Vcrgahd|Cbhdadj|FL|5612455484 +Fcmgahd|Wxhdadj|IL|3129359799 +Gcpgahd|Zkhdadj|IL|3122253282 +Vdsgahd|Cdhdadj|FL|5612556585 +Fcqgahd|Xmhdadj|IL|3122354383 +Gdtgahd|Anhdadj|IL|3122657686 +Vdtgahd|Cnhdadj|FL|5612657686 +Fcrgahd|Xbhdadj|IL|3122455484 +Gdugahd|Abhdadj|IL|3122758787 +Wbegahd|Dxhdadj|FL|5611311719 +Fdzgahd|Yghdadj|IL|3122326329 +Gdwgahd|Adhdadj|IL|3122956989 +Wbigahd|Dshdadj|FL|5615355759 +Gadgahd|Yyhdadj|IL|3120300709 +Gdxgahd|Aehdadj|IL|3120306109 +Wckgahd|Dihdadj|FL|5617387779 +Gbegahd|Yxhdadj|IL|3121311719 +Hadgahd|Byhdadj|IL|8150356799 +Wclgahd|Dbhdadj|FL|5615618789 +Gbggahd|Yuhdadj|IL|3123333739 +Hbigahd|Bshdadj|IL|8155356799 +Wcngahd|Dghdadj|FL|5612031080 +Gcjgahd|Zphdadj|IL|3126376769 +Hcjgahd|Bphdadj|IL|8156356799 +Wcrgahd|Ebhdadj|FL|5612455484 +Gcngahd|Zghdadj|IL|3122051080 +Hckgahd|Bihdadj|IL|8157356799 +Wdsgahd|Edhdadj|FL|5612556585 +Gdsgahd|Adhdadj|IL|3122556585 +Hclgahd|Bbhdadj|IL|8158356799 +Wdtgahd|Enhdadj|FL|5612657686 +Gdzgahd|Aghdadj|IL|3122326329 +Hcngahd|Bghdadj|IL|8152056799 +Wdwgahd|Edhdadj|FL|5612956989 +Hbggahd|Buhdadj|IL|8153356799 +Hcpgahd|Ckhdadj|IL|8152256767 +Wdzgahd|Eghdadj|FL|5612326329 +Hbhgahd|Bthdadj|IL|8154356799 +Hdsgahd|Cdhdadj|IL|8152556767 +Xadgahd|Eyhdadj|FL|5610356790 +Hcmgahd|Bxhdadj|IL|8159356799 +Hdtgahd|Cnhdadj|IL|8152656767 +Xclgahd|Fbhdadj|FL|5618356790 +Hcogahd|Bahdadj|IL|8152156799 +Hdzgahd|Dghdadj|IL|8152326767 +Xcogahd|Fahdadj|FL|5612156790 +Hcqgahd|Cmhdadj|IL|8152356767 +Ibegahd|Dxhdadj|IL|8151351778 +Xcqgahd|Fmhdadj|FL|5612356779 +Hcrgahd|Cbhdadj|IL|8152456767 +Ibfgahd|Dwhdadj|IL|8152352778 +Xcrgahd|Fbhdadj|FL|5612456779 +Hdvgahd|Cchdadj|IL|8152856767 +Ibigahd|Dshdadj|IL|8155355778 +Xdtgahd|Fnhdadj|FL|5612656779 +Hdwgahd|Cdhdadj|IL|8152956767 +Icngahd|Eghdadj|IL|8152053098 +Xdzgahd|Fghdadj|FL|5612326779 +Hdxgahd|Cehdadj|IL|8152306767 +Icpgahd|Ekhdadj|IL|8152256278 +Ybggahd|Guhdadj|FL|5613353779 +Hdygahd|Dfhdadj|IL|8152316767 +Icqgahd|Emhdadj|IL|8152356356 +Ycmgahd|Gxhdadj|FL|5619359744 +Ibggahd|Duhdadj|IL|8153353778 +Idugahd|Fbhdadj|IL|8152756756 +Ycngahd|Gghdadj|FL|5612056044 +Ickgahd|Eihdadj|IL|8157357778 +Jadgahd|Gyhdadj|IL|8150356701 +Ycrgahd|Gbhdadj|FL|5612456444 +Icogahd|Eahdadj|IL|8152156178 +Jbegahd|Gxhdadj|IL|8151356701 +Ydugahd|Hbhdadj|FL|5612756744 +Icrgahd|Fbhdadj|IL|8152456456 +Jbfgahd|Gwhdadj|IL|8152356701 +Zbggahd|Huhdadj|FL|5613356766 +Idsgahd|Fdhdadj|IL|8152556556 +Jbigahd|Gshdadj|IL|8155356701 +Zbigahd|Ishdadj|FL|5615356766 +Idtgahd|Fnhdadj|IL|8152656656 +Jckgahd|Hihdadj|IL|8157356701 +Zckgahd|Iihdadj|FL|5617356766 +Idvgahd|Fchdadj|IL|8152856856 +Jclgahd|Hbhdadj|IL|8158356701 +Zclgahd|Ibhdadj|FL|5618356766 +Idwgahd|Fdhdadj|IL|8152956956 +Jcrgahd|Hbhdadj|IL|8152456755 +Zcngahd|Ighdadj|FL|5612056766 +Idxgahd|Fehdadj|IL|8152306709 +Jdsgahd|Hdhdadj|IL|8152556755 +Zcqgahd|Imhdadj|FL|5612356766 +Jcogahd|Hahdadj|IL|8152156755 +Jdzgahd|Ighdadj|IL|8152326755 +Zcrgahd|Ibhdadj|FL|5612456766 +Jcpgahd|Hkhdadj|IL|8152256755 +Kadgahd|Iyhdadj|IL|8150306704 +Zdsgahd|Idhdadj|FL|5612556766 +Jcqgahd|Hmhdadj|IL|8152356755 +Kbegahd|Ixhdadj|IL|8151316704 +Zdtgahd|Inhdadj|FL|5612656766 +Jdugahd|Ibhdadj|IL|8152756755 +Kbfgahd|Jwhdadj|IL|8152326704 +Zdugahd|Ibhdadj|FL|5612756766 +Jdxgahd|Iehdadj|IL|8152306755 +Kbigahd|Jshdadj|IL|8155356704 +Zdxgahd|Jehdadj|FL|5612306751 +Jdygahd|Ifhdadj|IL|8152316755 +Kcjgahd|Jphdadj|IL|8156376704 +Zdzgahd|Jghdadj|FL|5612326751 +Kbggahd|Juhdadj|IL|8153336704 +Kclgahd|Jbhdadj|IL|8158136704 +Keggahd|Juhdadj|FL|5613336751 +Kbhgahd|Jthdadj|IL|8154346704 +Kcqgahd|Kmhdadj|IL|8152354766 +Kejgahd|Jphdadj|FL|5616376751 +Kcmgahd|Jxhdadj|IL|8159350704 +Kcrgahd|Kbhdadj|IL|8152455766 +Kekgahd|Jihdadj|FL|5617386751 +Kcpgahd|Kkhdadj|IL|8152253704 +Kdsgahd|Kdhdadj|IL|8152556766 +Keogahd|Kahdadj|FL|5612152751 +Kdtgahd|Knhdadj|IL|8152657766 +Kdugahd|Kbhdadj|IL|8152758766 +Kergahd|Kbhdadj|FL|5612455762 +Kdxgahd|Lehdadj|IL|8152306166 +Kdzgahd|Lghdadj|IL|8152326366 +Keugahd|Kbhdadj|FL|5612758762 +Kdygahd|Lfhdadj|IL|8152316266 +Lbegahd|Lxhdadj|IL|8151311766 +Kevgahd|Kchdadj|FL|5612859762 +Lbfgahd|Lwhdadj|IL|8152322766 +Ldsgahd|Mdhdadj|IL|8152556529 +Keygahd|Kfhdadj|FL|5612315612 +Lbigahd|Lshdadj|IL|8155355729 +Ldvgahd|Nchdadj|IL|8152859829 +Lifgahd|Lwhdadj|FL|5612322762 +Lckgahd|Mihdadj|IL|8157387729 +Ldwgahd|Ndhdadj|IL|8152956929 +Lihgahd|Lthdadj|FL|5614344762 +Lcmgahd|Mxhdadj|IL|8159359729 +Ldygahd|Nfhdadj|IL|8152316219 +Limgahd|Lxhdadj|FL|5619359762 +Lcqgahd|Mmhdadj|IL|8152354329 +Mbfgahd|Nwhdadj|IL|8152322729 +Lingahd|Lghdadj|FL|5612031088 +Ldxgahd|Nehdadj|IL|8152306109 +Mclgahd|Obhdadj|IL|8158138789 +Liogahd|Lahdadj|FL|5612152188 +Ldzgahd|Nghdadj|IL|8152326329 +Mcmgahd|Oxhdadj|IL|8159359799 +Lisgahd|Mdhdadj|FL|5612556588 +Mbegahd|Nxhdadj|IL|8151311719 +Mcqgahd|Omhdadj|IL|8152354383 +Livgahd|Mchdadj|FL|5612859888 +Mbigahd|Nshdadj|IL|8155355759 +Mcrgahd|Obhdadj|IL|8152455484 +Liwgahd|Mdhdadj|FL|5612956988 +Mckgahd|Nihdadj|IL|8157387779 +Mdxgahd|Pehdadj|IL|8150306109 +Lixgahd|Mehdadj|FL|5612306109 +Mcngahd|Oghdadj|IL|8152051080 +Ncjgahd|Pphdadj|IL|8156376769 +Mofgahd|Mwhdadj|FL|5612322729 +Mcogahd|Oahdadj|IL|8152152181 +Nckgahd|Pihdadj|IL|8157387779 +Moigahd|Mshdadj|FL|5615355759 +Mdtgahd|Onhdadj|IL|8152657686 +Ncrgahd|Qbhdadj|IL|8152455484 +Mojgahd|Nphdadj|FL|5616376769 +Mdugahd|Obhdadj|IL|8152758787 +Ndtgahd|Qnhdadj|IL|8152657686 +Mokgahd|Nihdadj|FL|5617387779 +Mdvgahd|Ochdadj|IL|8152859888 +Ndugahd|Qbhdadj|IL|8152758787 +Molgahd|Nbhdadj|FL|5615618789 +Nbegahd|Pxhdadj|IL|8151311719 +Ndvgahd|Qchdadj|IL|8152859888 +Moogahd|Nahdadj|FL|5612152181 +Nbigahd|Pshdadj|IL|8155355759 +Ndygahd|Rfhdadj|IL|8151316219 +Morgahd|Nbhdadj|FL|5612455484 +Nclgahd|Qbhdadj|IL|8158138789 +Ndzgahd|Rghdadj|IL|8152326329 +Mougahd|Nbhdadj|FL|5612758787 +Ncngahd|Qghdadj|IL|8152051080 +Obggahd|Ruhdadj|IL|8723356776 +Moxgahd|Nehdadj|FL|5610306109 +Ncqgahd|Qmhdadj|IL|8152354383 +Obigahd|Rshdadj|IL|8725356776 +Moygahd|Ofhdadj|FL|5611316219 +Ndsgahd|Qdhdadj|IL|8152556585 +Oclgahd|Sbhdadj|IL|8728356776 +Nuegahd|Oxhdadj|FL|5611311719 +Ndxgahd|Rehdadj|IL|8150306109 +Ocmgahd|Sxhdadj|IL|8729356776 +Nuigahd|Oshdadj|FL|5615355759 +Obhgahd|Rthdadj|IL|8724356776 +Ocogahd|Sahdadj|IL|8722156776 +Nupgahd|Pkhdadj|FL|5612253282 +Ocpgahd|Skhdadj|IL|8722256776 +Ocqgahd|Smhdadj|IL|8722356776 +Nusgahd|Pdhdadj|FL|5612556585 +Ocrgahd|Sbhdadj|IL|8722456776 +Odugahd|Tbhdadj|IL|8722756776 +Nuvgahd|Pchdadj|FL|5612859888 +Odsgahd|Sdhdadj|IL|8722556776 +Padgahd|Tyhdadj|IL|8720350767 +Nuwgahd|Pdhdadj|FL|5612956989 +Odvgahd|Tchdadj|IL|8722856776 +Pbfgahd|Twhdadj|IL|8722352767 +Abegahd|Axhdadj|IL|3121356710 +Odxgahd|Tehdadj|IL|8722306767 +Pbggahd|Tuhdadj|IL|8723353767 +Abfgahd|Awhdadj|IL|3122356710 +Odygahd|Tfhdadj|IL|8722316767 +Pcjgahd|Uphdadj|IL|8726356767 +Abggahd|Auhdadj|IL|3123356710 +Odzgahd|Tghdadj|IL|8722326767 +Pckgahd|Uihdadj|IL|8727357767 +Abigahd|Ashdadj|IL|3125356710 +Pbegahd|Txhdadj|IL|8721351767 +Pcngahd|Ughdadj|IL|8722056067 +Acjgahd|Bphdadj|IL|3126356710 +Pbigahd|Tshdadj|IL|8725355767 +Pdugahd|Ubhdadj|IL|8722756700 +Acngahd|Bghdadj|IL|3122056701 +Pclgahd|Ubhdadj|IL|8728358767 +Pdxgahd|Vehdadj|IL|8722306709 +Acogahd|Bahdadj|IL|3122156701 +Pcmgahd|Uxhdadj|IL|8729359767 +Pdygahd|Vfhdadj|IL|8722316719 +Acqgahd|Cmhdadj|IL|3122356701 +Pcpgahd|Ukhdadj|IL|8722256267 +Rbggahd|Vuhdadj|IL|8723356700 +Acrgahd|Cbhdadj|IL|3122456701 +Pdsgahd|Udhdadj|IL|8722558720 +Rbigahd|Vshdadj|IL|8725356700 +Adsgahd|Cdhdadj|IL|3122556701 +Pdwgahd|Udhdadj|IL|8722956900 +Rcjgahd|Vphdadj|IL|8726356700 +Adugahd|Cbhdadj|IL|3122756701 +Pdzgahd|Vghdadj|IL|8722326729 +Sbfgahd|Xwhdadj|IL|8722326706 +Adwgahd|Ddhdadj|IL|3122956711 +Radgahd|Vyhdadj|IL|8720356700 +Sbggahd|Xuhdadj|IL|8723336706 +Adzgahd|Dghdadj|IL|3122326711 +Rbhgahd|Vthdadj|IL|8724356700 +Sbigahd|Xshdadj|IL|8725356740 +Bbggahd|Euhdadj|IL|3123353711 +Rcngahd|Wghdadj|IL|8722056700 +Scngahd|Xghdadj|IL|8722051740 +Bbhgahd|Ethdadj|IL|3124354711 +Rcpgahd|Wkhdadj|IL|8722256706 +Scpgahd|Ykhdadj|IL|8722253740 +Bbigahd|Eshdadj|IL|3125355711 +Rcrgahd|Wbhdadj|IL|8722456706 +Scqgahd|Ymhdadj|IL|8722354740 +Bcngahd|Fghdadj|IL|3122056000 +Rdugahd|Wbhdadj|IL|8722756706 +Sdzgahd|Yghdadj|IL|8722326333 +Bdtgahd|Gnhdadj|IL|3122656600 +Rdvgahd|Wchdadj|IL|8722856706 +Ubggahd|Zuhdadj|IL|8723333733 +Bdxgahd|Hehdadj|IL|3122306709 +Rdxgahd|Wehdadj|IL|8722306706 +Ubhgahd|Zthdadj|IL|8724344733 +Bdygahd|Hfhdadj|IL|3122316719 +Rdygahd|Wfhdadj|IL|8722316706 +Uckgahd|Zihdadj|IL|8727387733 +Cbfgahd|Iwhdadj|IL|3122356312 +Rdzgahd|Wghdadj|IL|8722326706 +Ucngahd|Aghdadj|IL|8722051033 +Cbggahd|Iuhdadj|IL|3123356312 +Sadgahd|Xyhdadj|IL|8720306706 +Ucogahd|Aahdadj|IL|8722152133 +Ccngahd|Jghdadj|IL|3122056721 +Sbegahd|Xxhdadj|IL|8721316706 +Ucrgahd|Abhdadj|IL|8722455433 +Cdtgahd|Knhdadj|IL|3122656721 +Sbhgahd|Xthdadj|IL|8724346706 +Udsgahd|Adhdadj|IL|8722556533 +Cdugahd|Kbhdadj|IL|3122756721 +Sckgahd|Xihdadj|IL|8727386740 +Udwgahd|Adhdadj|IL|8722956933 +Cdvgahd|Lchdadj|IL|3122856721 +Sclgahd|Xbhdadj|IL|8728726740 +Udzgahd|Bghdadj|IL|8722326329 +Cdygahd|Lfhdadj|IL|3122316722 +Scogahd|Yahdadj|IL|8722152740 +Vbfgahd|Bwhdadj|IL|8722322729 +Dadgahd|Myhdadj|IL|3120306722 +Sdsgahd|Ydhdadj|IL|8722556740 +Vcjgahd|Bphdadj|IL|8726376769 +Dbegahd|Mxhdadj|IL|3121316722 +Sdvgahd|Ychdadj|IL|8722859740 +Vcmgahd|Cxhdadj|IL|8729359799 +Dbfgahd|Mwhdadj|IL|3122326722 +Sdwgahd|Ydhdadj|IL|8722956040 +Vcpgahd|Ckhdadj|IL|8722253282 +Dcjgahd|Nphdadj|IL|3126376722 +Sdxgahd|Yehdadj|IL|8722306140 +Vdxgahd|Cehdadj|IL|8720306109 +Dcmgahd|Nxhdadj|IL|3129350732 +Ubfgahd|Zwhdadj|IL|8722322733 +Vdygahd|Cfhdadj|IL|8721316219 +Dcngahd|Nghdadj|IL|3122051732 +Ucjgahd|Zphdadj|IL|8726376733 +Vdzgahd|Cghdadj|IL|8722326329 +Dcpgahd|Nkhdadj|IL|3122253732 +Ucpgahd|Akhdadj|IL|8722253233 +Wadgahd|Dyhdadj|IL|8720300709 +Ddxgahd|Pehdadj|IL|3122306145 +Udvgahd|Achdadj|IL|8722859833 +Wbggahd|Duhdadj|IL|8723333739 +Ddygahd|Pfhdadj|IL|3122316245 +Udygahd|Bfhdadj|IL|8722316219 +Wcjgahd|Dphdadj|IL|8726376769 +Ddzgahd|Pghdadj|IL|3122326345 +Vadgahd|Byhdadj|IL|8720300709 +Wcmgahd|Dxhdadj|IL|8729359799 +Ebggahd|Ruhdadj|IL|3123333745 +Vbegahd|Bxhdadj|IL|8721311719 +Wdvgahd|Echdadj|IL|8722859888 +Ecpgahd|Tkhdadj|IL|3122253245 +Vbhgahd|Bthdadj|IL|8724344749 +Wdygahd|Efhdadj|IL|8721316219 +Ecqgahd|Tmhdadj|IL|3122354345 +Vbigahd|Bshdadj|IL|8725355759 +Xbegahd|Exhdadj|IL|8151356790 +Edsgahd|Tdhdadj|IL|3122558139 +Vckgahd|Bihdadj|IL|8727387779 +Xbfgahd|Ewhdadj|IL|8152356790 +Edtgahd|Unhdadj|IL|3122657609 +Vclgahd|Bbhdadj|IL|8728728789 +Xbggahd|Euhdadj|IL|8153356790 +Edxgahd|Uehdadj|IL|3122306109 +Vcqgahd|Cmhdadj|IL|8722354383 +Xbhgahd|Ethdadj|IL|8154356790 +Fbegahd|Vxhdadj|IL|3121311719 +Vdugahd|Cbhdadj|IL|8722758787 +Xcjgahd|Ephdadj|IL|8156356790 +Fbggahd|Vuhdadj|IL|3123333739 +Vdvgahd|Cchdadj|IL|8722859888 +Xcngahd|Fghdadj|IL|8152056790 +Fbhgahd|Vthdadj|IL|3124344749 +Vdwgahd|Cdhdadj|IL|8722956989 +Xdsgahd|Fdhdadj|IL|8152556779 +Fckgahd|Wihdadj|IL|3127387779 +Wbfgahd|Dwhdadj|IL|8722322729 +Xdugahd|Fbhdadj|IL|8152756779 +Fcogahd|Wahdadj|IL|3122152181 +Wbhgahd|Dthdadj|IL|8724344749 +Xdygahd|Ffhdadj|IL|8152316779 +Fdsgahd|Xdhdadj|IL|3122556585 +Wcogahd|Dahdadj|IL|8722152181 +Yadgahd|Gyhdadj|IL|8150350779 +Fdugahd|Xbhdadj|IL|3122758787 +Wcpgahd|Dkhdadj|IL|8722253282 +Ybegahd|Gxhdadj|IL|8151351779 +Fdvgahd|Xchdadj|IL|3122859888 +Wcqgahd|Emhdadj|IL|8722354383 +Ybfgahd|Gwhdadj|IL|8152352779 +Fdwgahd|Xdhdadj|IL|3122956989 +Wdugahd|Ebhdadj|IL|8722758787 +Ybhgahd|Gthdadj|IL|8154354779 +Fdxgahd|Xehdadj|IL|3120306109 +Wdxgahd|Eehdadj|IL|8720306109 +Ycjgahd|Gphdadj|IL|8156356779 +Gbfgahd|Ywhdadj|IL|3122322729 +Xbigahd|Eshdadj|IL|8155356790 +Yclgahd|Gbhdadj|IL|8158358744 +Gbhgahd|Ythdadj|IL|3124344749 +Xckgahd|Eihdadj|IL|8157356790 +Ycpgahd|Gkhdadj|IL|8152256244 +Gclgahd|Zbhdadj|IL|3128138789 +Xcmgahd|Fxhdadj|IL|8159356790 +Ydtgahd|Hnhdadj|IL|8152656644 +Gcqgahd|Zmhdadj|IL|3122354383 +Xcpgahd|Fkhdadj|IL|8152256779 +Ydwgahd|Hdhdadj|IL|8152956944 +Gcrgahd|Zbhdadj|IL|3122455484 +Xdvgahd|Fchdadj|IL|8152856779 +Ydxgahd|Hehdadj|IL|8152306709 +Gdvgahd|Achdadj|IL|3122859888 +Xdwgahd|Fdhdadj|IL|8152956779 +Ydygahd|Hfhdadj|IL|8152316719 +Gdygahd|Afhdadj|IL|3121316219 +Xdxgahd|Fehdadj|IL|8152306779 +Ydzgahd|Hghdadj|IL|8152326729 +Hbegahd|Bxhdadj|IL|8151356799 +Ybigahd|Gshdadj|IL|8155355779 +Zadgahd|Hyhdadj|IL|8150356744 +Hbfgahd|Bwhdadj|IL|8152356799 +Yckgahd|Gihdadj|IL|8157357779 +Zbfgahd|Hwhdadj|IL|8152356744 +Hdugahd|Cbhdadj|IL|8152756767 +Ycogahd|Gahdadj|IL|8152156144 +Zbhgahd|Hthdadj|IL|8154356766 +Iadgahd|Dyhdadj|IL|8150350767 +Ycqgahd|Gmhdadj|IL|8152356344 +Zcjgahd|Iphdadj|IL|8156356766 +Ibhgahd|Dthdadj|IL|8154354778 +Ydsgahd|Hdhdadj|IL|8152556544 +Zcmgahd|Ixhdadj|IL|8159356766 +Icjgahd|Dphdadj|IL|8156356778 +Ydvgahd|Hchdadj|IL|8152856844 +Zdvgahd|Jchdadj|IL|8152856751 +Iclgahd|Ebhdadj|IL|8158358778 +Zbegahd|Hxhdadj|IL|8151356744 +Kedgahd|Jyhdadj|IL|8150306751 +Icmgahd|Exhdadj|IL|8159359778 +Zcogahd|Iahdadj|IL|8152156766 +Keegahd|Jxhdadj|IL|8151316751 +Idygahd|Gfhdadj|IL|8152316719 +Zcpgahd|Ikhdadj|IL|8152256766 +Kehgahd|Jthdadj|IL|8154346751 +Idzgahd|Gghdadj|IL|8152326729 +Zdwgahd|Jdhdadj|IL|8152956751 +Kelgahd|Jbhdadj|IL|8158136751 +Jbggahd|Guhdadj|IL|8153356701 +Zdygahd|Jfhdadj|IL|8152316751 +Keqgahd|Kmhdadj|IL|8152354762 +Jbhgahd|Gthdadj|IL|8154356701 +Kefgahd|Jwhdadj|IL|8152326751 +Ketgahd|Knhdadj|IL|8152657762 +Jcjgahd|Gphdadj|IL|8156356701 +Keigahd|Jshdadj|IL|8155356751 +Kezgahd|Kghdadj|IL|8152326362 +Jcmgahd|Hxhdadj|IL|8159356701 +Kemgahd|Kxhdadj|IL|8159350751 +Liggahd|Luhdadj|IL|8153333762 +Jcngahd|Hghdadj|IL|8152056755 +Kengahd|Kghdadj|IL|8152051751 +Likgahd|Lihdadj|IL|8157387762 +Jdtgahd|Inhdadj|IL|8152656755 +Kepgahd|Kkhdadj|IL|8152253751 +Lilgahd|Lbhdadj|IL|8158138762 +Jdvgahd|Ichdadj|IL|8152856755 +Kesgahd|Kdhdadj|IL|8152556762 +Lipgahd|Lkhdadj|IL|8152253288 +Jdwgahd|Idhdadj|IL|8152956755 +Kewgahd|Kdhdadj|IL|8152956062 +Liygahd|Mfhdadj|IL|8152316219 +Kckgahd|Jihdadj|IL|8157386704 +Kexgahd|Kehdadj|IL|8152306162 +Moegahd|Mxhdadj|IL|8151311719 +Kcngahd|Jghdadj|IL|8152051704 +Lidgahd|Lyhdadj|IL|8150300762 +Moggahd|Muhdadj|IL|8153333739 +Kcogahd|Kahdadj|IL|8152152704 +Liegahd|Lxhdadj|IL|8151311762 +Mohgahd|Mthdadj|IL|8154344749 +Kdvgahd|Kchdadj|IL|8152859766 +Liigahd|Lshdadj|IL|8155355762 +Momgahd|Nxhdadj|IL|8159359799 +Kdwgahd|Ldhdadj|IL|8152956066 +Lijgahd|Lphdadj|IL|8156376762 +Moqgahd|Nmhdadj|IL|8152354383 +Ladgahd|Lyhdadj|IL|8150300766 +Liqgahd|Lmhdadj|IL|8152354388 +Motgahd|Nnhdadj|IL|8152657686 +Lbggahd|Luhdadj|IL|8153333729 +Lirgahd|Mbhdadj|IL|8152455488 +Movgahd|Nchdadj|IL|8152859888 +Lbhgahd|Lthdadj|IL|8154344729 +Litgahd|Mnhdadj|IL|8152657688 +Mozgahd|Oghdadj|IL|8152326329 +Lcjgahd|Lphdadj|IL|8156376729 +Liugahd|Mbhdadj|IL|8152758788 +Nufgahd|Owhdadj|IL|8152322729 +Lclgahd|Mbhdadj|IL|8158138729 +Lizgahd|Mghdadj|IL|8152326329 +Nuggahd|Ouhdadj|IL|8153333739 +Lcngahd|Mghdadj|IL|8152051029 +Modgahd|Myhdadj|IL|8150300709 +Nuhgahd|Othdadj|IL|8154344749 +Lcogahd|Mahdadj|IL|8152158159 +Mongahd|Nghdadj|IL|8152051080 +Nukgahd|Oihdadj|IL|8157387779 +Lcpgahd|Mkhdadj|IL|8152253229 +Mopgahd|Nkhdadj|IL|8152253282 +Nulgahd|Pbhdadj|IL|8158138789 +Lcrgahd|Mbhdadj|IL|8152455429 +Mosgahd|Ndhdadj|IL|8152556585 +Nuxgahd|Qehdadj|IL|8150306109 +Ldtgahd|Mnhdadj|IL|8152657629 +Mowgahd|Ndhdadj|IL|8152956989 +Nuygahd|Qfhdadj|IL|8151316219 +Ldugahd|Mbhdadj|IL|8152758729 +Nudgahd|Oyhdadj|IL|8150300709 +Badgahd|Eyhdadj|IL|4640350711 +Madgahd|Nyhdadj|IL|8150300709 +Nujgahd|Ophdadj|IL|8156376769 +Bbfgahd|Ewhdadj|IL|4642352711 +Mbggahd|Nuhdadj|IL|8153333739 +Numgahd|Pxhdadj|IL|8159359799 +Bcjgahd|Fphdadj|IL|4643356711 +Mbhgahd|Nthdadj|IL|8154344749 +Nungahd|Pghdadj|IL|8152051080 +Bclgahd|Fbhdadj|IL|4648358700 +Mcjgahd|Nphdadj|IL|8156376769 +Nuogahd|Pahdadj|IL|8152152181 +Bcogahd|Fahdadj|IL|4642156100 +Mcpgahd|Okhdadj|IL|8152253282 +Nuqgahd|Pmhdadj|IL|8152354383 +Bcqgahd|Gmhdadj|IL|4642356300 +Mdsgahd|Odhdadj|IL|8152556585 +Nurgahd|Pbhdadj|IL|8152455484 +Bcrgahd|Gbhdadj|IL|4642456400 +Mdwgahd|Pdhdadj|IL|8152956989 +Nutgahd|Pnhdadj|IL|8152657686 +Bdvgahd|Gchdadj|IL|4642856800 +Mdygahd|Pfhdadj|IL|8151316219 +Nuugahd|Pbhdadj|IL|8152758787 +Cadgahd|Iyhdadj|IL|4640356312 +Mdzgahd|Pghdadj|IL|8152326329 +Nuzgahd|Qghdadj|IL|8152326329 +Cbegahd|Ixhdadj|IL|4641356312 +Nadgahd|Pyhdadj|IL|8150300709 +Aadgahd|Ayhdadj|IL|4640356710 +Cbhgahd|Ithdadj|IL|4644356312 +Nbfgahd|Pwhdadj|IL|8152322729 +Abhgahd|Athdadj|IL|4644356710 +Ccmgahd|Jxhdadj|IL|4649356721 +Nbggahd|Puhdadj|IL|8153333739 +Ackgahd|Bihdadj|IL|4647356710 +Ccogahd|Jahdadj|IL|4642156721 +Nbhgahd|Pthdadj|IL|8154344749 +Aclgahd|Bbhdadj|IL|4648356710 +Ccpgahd|Kkhdadj|IL|4642256721 +Ncmgahd|Qxhdadj|IL|8159359799 +Acmgahd|Bxhdadj|IL|4649356701 +Ccqgahd|Kmhdadj|IL|4642356721 +Ncogahd|Qahdadj|IL|8152152181 +Acpgahd|Bkhdadj|IL|4642256701 +Cdwgahd|Ldhdadj|IL|4642956721 +Ncpgahd|Qkhdadj|IL|8152253282 +Adtgahd|Cnhdadj|IL|4642656701 +Cdzgahd|Lghdadj|IL|4642326722 +Ndwgahd|Qdhdadj|IL|8152956989 +Advgahd|Dchdadj|IL|4642856701 +Dbggahd|Muhdadj|IL|4643336722 +Oadgahd|Ryhdadj|IL|8720356776 +Adxgahd|Dehdadj|IL|4642306711 +Dckgahd|Nihdadj|IL|4647386722 +Obegahd|Rxhdadj|IL|8721356776 +Adygahd|Dfhdadj|IL|4642316711 +Dcogahd|Nahdadj|IL|4642152732 +Obfgahd|Rwhdadj|IL|8722356776 +Bbegahd|Axhdadj|IL|4641351711 +Dcrgahd|Obhdadj|IL|4642455732 +Ocjgahd|Sphdadj|IL|8726356776 +Bckgahd|Fihdadj|IL|4647357700 +Ddsgahd|Odhdadj|IL|4642556732 +Ockgahd|Sihdadj|IL|8727356776 +Bcmgahd|Fxhdadj|IL|4649359700 +Ddtgahd|Onhdadj|IL|4642657732 +Ocngahd|Sghdadj|IL|8722056776 +Bcpgahd|Gkhdadj|IL|4642256200 +Ddugahd|Obhdadj|IL|4642758732 +Odtgahd|Snhdadj|IL|8722656776 +Bdsgahd|Gdhdadj|IL|4642558130 +Eadgahd|Ryhdadj|IL|4640300745 +Odwgahd|Tdhdadj|IL|8722956776 +Bdugahd|Gbhdadj|IL|4642756700 +Ebegahd|Rxhdadj|IL|4641311745 +Pbhgahd|Tthdadj|IL|8724354767 +Bdwgahd|Hdhdadj|IL|4642956900 +Ebfgahd|Rwhdadj|IL|4642322745 +Pcogahd|Uahdadj|IL|8722156167 +Bdzgahd|Hghdadj|IL|4642326729 +Ebhgahd|Rthdadj|IL|4644344745 +Pcqgahd|Umhdadj|IL|8722356367 +Cbigahd|Ishdadj|IL|4645356312 +Eckgahd|Sihdadj|IL|4647387745 +Pcrgahd|Ubhdadj|IL|8722457737 +Ccjgahd|Jphdadj|IL|4643356312 +Ecmgahd|Sxhdadj|IL|4649359745 +Pdtgahd|Unhdadj|IL|8722656600 +Cckgahd|Jihdadj|IL|4647356312 +Ecogahd|Tahdadj|IL|4642152145 +Pdvgahd|Uchdadj|IL|8722856800 +Cclgahd|Jbhdadj|IL|4648356721 +Ecrgahd|Tbhdadj|IL|4642455445 +Rbegahd|Vxhdadj|IL|8721356700 +Ccrgahd|Kbhdadj|IL|4642456721 +Edugahd|Ubhdadj|IL|4642758709 +Rbfgahd|Vwhdadj|IL|8722356700 +Cdsgahd|Kdhdadj|IL|4642556721 +Edvgahd|Uchdadj|IL|4642859809 +Rckgahd|Vihdadj|IL|8727356700 +Cdxgahd|Lehdadj|IL|4642306721 +Edzgahd|Vghdadj|IL|4642326329 +Rclgahd|Wbhdadj|IL|8728356700 +Dbhgahd|Mthdadj|IL|4644346722 +Fadgahd|Vyhdadj|IL|4640300709 +Rcmgahd|Wxhdadj|IL|8729356700 +Dbigahd|Nshdadj|IL|4645356722 +Fbigahd|Wshdadj|IL|4645355759 +Rcogahd|Wahdadj|IL|8722156700 +Dclgahd|Nbhdadj|IL|4648136732 +Fcjgahd|Wphdadj|IL|4643376769 +Rcqgahd|Wmhdadj|IL|8722356706 +Dcqgahd|Omhdadj|IL|4642354732 +Fclgahd|Wbhdadj|IL|4648138789 +Rdsgahd|Wdhdadj|IL|8722556706 +Ddvgahd|Ochdadj|IL|4642859732 +Fcngahd|Wghdadj|IL|4642051080 +Rdtgahd|Wnhdadj|IL|8722656706 +Ddwgahd|Odhdadj|IL|4642956045 +Fcpgahd|Wkhdadj|IL|4642253282 +Rdwgahd|Wdhdadj|IL|8722956706 +Ebigahd|Sshdadj|IL|4645355745 +Fdtgahd|Xnhdadj|IL|4642657686 +Scjgahd|Xphdadj|IL|8726376740 +Ecjgahd|Sphdadj|IL|4643376745 +Fdygahd|Yfhdadj|IL|4641316219 +Scmgahd|Xxhdadj|IL|8729350740 +Eclgahd|Sbhdadj|IL|4648138745 +Gbigahd|Zshdadj|IL|4645355759 +Scrgahd|Ybhdadj|IL|8722455740 +Ecngahd|Sghdadj|IL|4642051045 +Gckgahd|Zihdadj|IL|4647387779 +Sdtgahd|Ynhdadj|IL|8722657740 +Edwgahd|Udhdadj|IL|4642956909 +Gcmgahd|Zxhdadj|IL|4649359799 +Sdugahd|Ybhdadj|IL|8722758740 +Edygahd|Vfhdadj|IL|4642316219 +Gcogahd|Zahdadj|IL|4642152181 +Sdygahd|Yfhdadj|IL|8722316233 +Fbfgahd|Vwhdadj|IL|4642322729 +Gcpgahd|Zkhdadj|IL|4642253282 +Uadgahd|Zyhdadj|IL|8720300733 +Fcmgahd|Wxhdadj|IL|4649359799 +Gdtgahd|Anhdadj|IL|4642657686 +Ubegahd|Zxhdadj|IL|8721311733 +Fcqgahd|Xmhdadj|IL|4642354383 +Gdugahd|Abhdadj|IL|4642758787 +Ubigahd|Zshdadj|IL|8725355733 +Fcrgahd|Xbhdadj|IL|4642455484 +Gdwgahd|Adhdadj|IL|4642956989 +Uclgahd|Zbhdadj|IL|8728728733 +Fdzgahd|Yghdadj|IL|4642326329 +Gdxgahd|Aehdadj|IL|4640306109 +Ucmgahd|Axhdadj|IL|8729359733 +Gadgahd|Yyhdadj|IL|4640300709 +Hadgahd|Byhdadj|IL|7730356799 +Ucqgahd|Amhdadj|IL|8722354333 +Gbegahd|Yxhdadj|IL|4641311719 +Hbigahd|Bshdadj|IL|7735356799 +Udtgahd|Anhdadj|IL|8722657633 +Gbggahd|Yuhdadj|IL|4643333739 +Hcjgahd|Bphdadj|IL|7736356799 +Udugahd|Abhdadj|IL|8722758733 +Gcjgahd|Zphdadj|IL|4643376769 +Hckgahd|Bihdadj|IL|7737356799 +Udxgahd|Aehdadj|IL|8722306109 +Gcngahd|Zghdadj|IL|4642051080 +Hclgahd|Bbhdadj|IL|7738356799 +Vbggahd|Buhdadj|IL|8723333739 +Gdsgahd|Adhdadj|IL|4642556585 +Hcngahd|Bghdadj|IL|7732056799 +Vcngahd|Cghdadj|IL|8722051080 +Gdzgahd|Aghdadj|IL|4642326329 +Hcpgahd|Ckhdadj|IL|7732256767 +Vcogahd|Cahdadj|IL|8722152181 +Hbggahd|Buhdadj|IL|7733356799 +Hdsgahd|Cdhdadj|IL|7732556767 +Vcrgahd|Cbhdadj|IL|8722455484 +Hbhgahd|Bthdadj|IL|7734356799 +Hdtgahd|Cnhdadj|IL|7732656767 +Vdsgahd|Cdhdadj|IL|8722556585 +Hcmgahd|Bxhdadj|IL|7739356799 +Hdzgahd|Dghdadj|IL|7732326767 +Vdtgahd|Cnhdadj|IL|8722657686 +Hcogahd|Bahdadj|IL|7732156799 +Ibegahd|Dxhdadj|IL|7731351778 +Wbegahd|Dxhdadj|IL|8721311719 +Hcqgahd|Cmhdadj|IL|7732356767 +Ibfgahd|Dwhdadj|IL|7732352778 +Wbigahd|Dshdadj|IL|8725355759 +Hcrgahd|Cbhdadj|IL|7732456767 +Ibigahd|Dshdadj|IL|7735355778 +Wckgahd|Dihdadj|IL|8727387779 +Hdvgahd|Cchdadj|IL|7732856767 +Icngahd|Eghdadj|IL|7732053098 +Wclgahd|Dbhdadj|IL|8728728789 +Hdwgahd|Cdhdadj|IL|7732956767 +Icpgahd|Ekhdadj|IL|7732256278 +Wcngahd|Dghdadj|IL|8722051080 +Hdxgahd|Cehdadj|IL|7732306767 +Icqgahd|Emhdadj|IL|7732356356 +Wcrgahd|Ebhdadj|IL|8722455484 +Hdygahd|Dfhdadj|IL|7732316767 +Idugahd|Fbhdadj|IL|7732756756 +Wdsgahd|Edhdadj|IL|8722556585 +Ibggahd|Duhdadj|IL|7733353778 +Jadgahd|Gyhdadj|IL|7730356701 +Wdtgahd|Enhdadj|IL|8722657686 +Ickgahd|Eihdadj|IL|7737357778 +Jbegahd|Gxhdadj|IL|7731356701 +Wdwgahd|Edhdadj|IL|8722956989 +Icogahd|Eahdadj|IL|7732156178 +Jbfgahd|Gwhdadj|IL|7732356701 +Wdzgahd|Eghdadj|IL|8722326329 +Icrgahd|Fbhdadj|IL|7732456456 +Jbigahd|Gshdadj|IL|7735356701 +Xadgahd|Eyhdadj|IL|8150356790 +Idsgahd|Fdhdadj|IL|7732556556 +Jckgahd|Hihdadj|IL|7737356701 +Xclgahd|Fbhdadj|IL|8158356790 +Idtgahd|Fnhdadj|IL|7732656656 +Jclgahd|Hbhdadj|IL|7738356701 +Xcogahd|Fahdadj|IL|8152156790 +Idvgahd|Fchdadj|IL|7732856856 +Jcrgahd|Hbhdadj|IL|7732456755 +Xcqgahd|Fmhdadj|IL|8152356779 +Idwgahd|Fdhdadj|IL|7732956956 +Jdsgahd|Hdhdadj|IL|7732556755 +Xcrgahd|Fbhdadj|IL|8152456779 +Idxgahd|Fehdadj|IL|7732306709 +Jdzgahd|Ighdadj|IL|7732326755 +Xdtgahd|Fnhdadj|IL|8152656779 +Jcogahd|Hahdadj|IL|7732156755 +Kadgahd|Iyhdadj|IL|7730306704 +Xdzgahd|Fghdadj|IL|8152326779 +Jcpgahd|Hkhdadj|IL|7732256755 +Kbegahd|Ixhdadj|IL|7731316704 +Ybggahd|Guhdadj|IL|8153353779 +Jcqgahd|Hmhdadj|IL|7732356755 +Kbfgahd|Jwhdadj|IL|7732326704 +Ycmgahd|Gxhdadj|IL|8159359744 +Jdugahd|Ibhdadj|IL|7732756755 +Kbigahd|Jshdadj|IL|7735356704 +Ycngahd|Gghdadj|IL|8152056044 +Jdxgahd|Iehdadj|IL|7732306755 +Kcjgahd|Jphdadj|IL|7736376704 +Ycrgahd|Gbhdadj|IL|8152456444 +Jdygahd|Ifhdadj|IL|7732316755 +Kclgahd|Jbhdadj|IL|7738136704 +Ydugahd|Hbhdadj|IL|8152756744 +Kbggahd|Juhdadj|IL|7733336704 +Kcqgahd|Kmhdadj|IL|7732354766 +Zbggahd|Huhdadj|IL|8153356766 +Kbhgahd|Jthdadj|IL|7734346704 +Kcrgahd|Kbhdadj|IL|7732455766 +Zbigahd|Ishdadj|IL|8155356766 +Kcmgahd|Jxhdadj|IL|7739350704 +Kdsgahd|Kdhdadj|IL|7732556766 +Zckgahd|Iihdadj|IL|8157356766 +Kcpgahd|Kkhdadj|IL|7732253704 +Kdugahd|Kbhdadj|IL|7732758766 +Zclgahd|Ibhdadj|IL|8158356766 +Kdtgahd|Knhdadj|IL|7732657766 +Kdzgahd|Lghdadj|IL|7732326366 +Zcngahd|Ighdadj|IL|8152056766 +Kdxgahd|Lehdadj|IL|7732306166 +Lbegahd|Lxhdadj|IL|7731311766 +Zcqgahd|Imhdadj|IL|8152356766 +Kdygahd|Lfhdadj|IL|7732316266 +Ldsgahd|Mdhdadj|IL|7732556529 +Zcrgahd|Ibhdadj|IL|8152456766 +Lbfgahd|Lwhdadj|IL|7732322766 +Ldvgahd|Nchdadj|IL|7732859829 +Zdsgahd|Idhdadj|IL|8152556766 +Lbigahd|Lshdadj|IL|7735355729 +Ldwgahd|Ndhdadj|IL|7732956929 +Zdtgahd|Inhdadj|IL|8152656766 +Lckgahd|Mihdadj|IL|7737387729 +Ldygahd|Nfhdadj|IL|7732316219 +Zdugahd|Ibhdadj|IL|8152756766 +Lcmgahd|Mxhdadj|IL|7739359729 +Mbfgahd|Nwhdadj|IL|7732322729 +Zdxgahd|Jehdadj|IL|8152306751 +Lcqgahd|Mmhdadj|IL|7732354329 +Mclgahd|Obhdadj|IL|7738138789 +Zdzgahd|Jghdadj|IL|8152326751 +Ldxgahd|Nehdadj|IL|7732306109 +Mcmgahd|Oxhdadj|IL|7739359799 +Keggahd|Juhdadj|IL|8153336751 +Ldzgahd|Nghdadj|IL|7732326329 +Mcqgahd|Omhdadj|IL|7732354383 +Kejgahd|Jphdadj|IL|8156376751 +Mbegahd|Nxhdadj|IL|7731311719 +Mcrgahd|Obhdadj|IL|7732455484 +Kekgahd|Jihdadj|IL|8157386751 +Mbigahd|Nshdadj|IL|7735355759 +Mdxgahd|Pehdadj|IL|7730306109 +Keogahd|Kahdadj|IL|8152152751 +Mckgahd|Nihdadj|IL|7737387779 +Ncjgahd|Pphdadj|IL|7736376769 +Kergahd|Kbhdadj|IL|8152455762 +Mcngahd|Oghdadj|IL|7732077380 +Nckgahd|Pihdadj|IL|7737387779 +Keugahd|Kbhdadj|IL|8152758762 +Mcogahd|Oahdadj|IL|7732152181 +Ncrgahd|Qbhdadj|IL|7732455484 +Kevgahd|Kchdadj|IL|8152859762 +Mdtgahd|Onhdadj|IL|7732657686 +Ndtgahd|Qnhdadj|IL|7732657686 +Keygahd|Kfhdadj|IL|8152316262 +Mdugahd|Obhdadj|IL|7732758787 +Ndugahd|Qbhdadj|IL|7732758787 +Lifgahd|Lwhdadj|IL|8152322762 +Mdvgahd|Ochdadj|IL|7732859888 +Ndvgahd|Qchdadj|IL|7732859888 +Lihgahd|Lthdadj|IL|8154344762 +Nbegahd|Pxhdadj|IL|7731311719 +Ndygahd|Rfhdadj|IL|7731316219 +Limgahd|Lxhdadj|IL|8159359762 +Nbigahd|Pshdadj|IL|7735355759 +Ndzgahd|Rghdadj|IL|7732326329 +Lingahd|Lghdadj|IL|8152051088 +Nclgahd|Qbhdadj|IL|7738138789 +Obggahd|Ruhdadj|IL|2173356776 +Liogahd|Lahdadj|IL|8152152188 +Ncngahd|Qghdadj|IL|7732077380 +Obigahd|Rshdadj|IL|2175356776 +Lisgahd|Mdhdadj|IL|8152556588 +Ncqgahd|Qmhdadj|IL|7732354383 +Oclgahd|Sbhdadj|IL|2178356776 +Livgahd|Mchdadj|IL|8152859888 +Ndsgahd|Qdhdadj|IL|7732556585 +Ocmgahd|Sxhdadj|IL|2179356776 +Liwgahd|Mdhdadj|IL|8152956988 +Ndxgahd|Rehdadj|IL|7730306109 +Ocogahd|Sahdadj|IL|2172156776 +Lixgahd|Mehdadj|IL|8152306109 +Obhgahd|Rthdadj|IL|2174356776 +Ocqgahd|Smhdadj|IL|2172356776 +Mofgahd|Mwhdadj|IL|8152322729 +Ocpgahd|Skhdadj|IL|2172256776 +Odugahd|Tbhdadj|IL|2172756776 +Moigahd|Mshdadj|IL|8155355759 +Ocrgahd|Sbhdadj|IL|2172456776 +Padgahd|Tyhdadj|IL|2170350767 +Mojgahd|Nphdadj|IL|8156376769 +Odsgahd|Sdhdadj|IL|2172556776 +Pbfgahd|Twhdadj|IL|2172352767 +Mokgahd|Nihdadj|IL|8157387779 +Odvgahd|Tchdadj|IL|2172856776 +Pbggahd|Tuhdadj|IL|2173353767 +Molgahd|Nbhdadj|IL|8158138789 +Odxgahd|Tehdadj|IL|2172306767 +Pcjgahd|Uphdadj|IL|2176356767 +Moogahd|Nahdadj|IL|8152152181 +Odygahd|Tfhdadj|IL|2172316767 +Pckgahd|Uihdadj|IL|2177357767 +Morgahd|Nbhdadj|IL|8152455484 +Odzgahd|Tghdadj|IL|2172326767 +Pcngahd|Ughdadj|IL|2172056067 +Mougahd|Nbhdadj|IL|8152758787 +Pbegahd|Txhdadj|IL|2171351767 +Pdugahd|Ubhdadj|IL|2172756700 +Moxgahd|Nehdadj|IL|8150306109 +Pbigahd|Tshdadj|IL|2175355767 +Pdxgahd|Vehdadj|IL|2172306709 +Moygahd|Ofhdadj|IL|8151316219 +Pclgahd|Ubhdadj|IL|2178358767 +Pdygahd|Vfhdadj|IL|2172316719 +Nuegahd|Oxhdadj|IL|8151311719 +Pcmgahd|Uxhdadj|IL|2179359767 +Rbggahd|Vuhdadj|IL|2173356700 +Nuigahd|Oshdadj|IL|8155355759 +Pcpgahd|Ukhdadj|IL|2172256267 +Rbigahd|Vshdadj|IL|2175356700 +Nupgahd|Pkhdadj|IL|8152253282 +Pdsgahd|Udhdadj|IL|2172552170 +Rcjgahd|Vphdadj|IL|2176356700 +Nusgahd|Pdhdadj|IL|8152556585 +Pdwgahd|Udhdadj|IL|2172956900 +Sbfgahd|Xwhdadj|IL|2172326706 +Nuvgahd|Pchdadj|IL|8152859888 +Pdzgahd|Vghdadj|IL|2172326729 +Sbggahd|Xuhdadj|IL|2173336706 +Nuwgahd|Pdhdadj|IL|8152956989 +Radgahd|Vyhdadj|IL|2170356700 +Sbigahd|Xshdadj|IL|2175356740 +Abegahd|Axhdadj|IL|4641356710 +Rbhgahd|Vthdadj|IL|2174356700 +Scngahd|Xghdadj|IL|2172051740 +Abfgahd|Awhdadj|IL|4642356710 +Rcngahd|Wghdadj|IL|2172056700 +Scpgahd|Ykhdadj|IL|2172253740 +Abggahd|Auhdadj|IL|4643356710 +Rcpgahd|Wkhdadj|IL|2172256706 +Scqgahd|Ymhdadj|IL|2172354740 +Abigahd|Ashdadj|IL|4645356710 +Rcrgahd|Wbhdadj|IL|2172456706 +Sdzgahd|Yghdadj|IL|2172326333 +Acjgahd|Bphdadj|IL|4643356710 +Rdugahd|Wbhdadj|IL|2172756706 +Ubggahd|Zuhdadj|IL|2173333733 +Acngahd|Bghdadj|IL|4642056701 +Rdvgahd|Wchdadj|IL|2172856706 +Ubhgahd|Zthdadj|IL|2174344733 +Acogahd|Bahdadj|IL|4642156701 +Rdxgahd|Wehdadj|IL|2172306706 +Uckgahd|Zihdadj|IL|2177387733 +Acqgahd|Cmhdadj|IL|4642356701 +Rdygahd|Wfhdadj|IL|2172316706 +Ucngahd|Aghdadj|IL|2172051033 +Acrgahd|Cbhdadj|IL|4642456701 +Rdzgahd|Wghdadj|IL|2172326706 +Ucogahd|Aahdadj|IL|2172152133 +Adsgahd|Cdhdadj|IL|4642556701 +Sadgahd|Xyhdadj|IL|2170306706 +Ucrgahd|Abhdadj|IL|2172455433 +Adugahd|Cbhdadj|IL|4642756701 +Sbegahd|Xxhdadj|IL|2171316706 +Udsgahd|Adhdadj|IL|2172556533 +Adwgahd|Ddhdadj|IL|4642956711 +Sbhgahd|Xthdadj|IL|2174346706 +Udwgahd|Adhdadj|IL|2172956933 +Adzgahd|Dghdadj|IL|4642326711 +Sckgahd|Xihdadj|IL|2177386740 +Udzgahd|Bghdadj|IL|2172326329 +Bbggahd|Euhdadj|IL|4643353711 +Sclgahd|Xbhdadj|IL|2172176740 +Vbfgahd|Bwhdadj|IL|2172322729 +Bbhgahd|Ethdadj|IL|4644354711 +Scogahd|Yahdadj|IL|2172152740 +Vcjgahd|Bphdadj|IL|2176376769 +Bbigahd|Eshdadj|IL|4645355711 +Sdsgahd|Ydhdadj|IL|2172556740 +Vcmgahd|Cxhdadj|IL|2179359799 +Bcngahd|Fghdadj|IL|4642056000 +Sdvgahd|Ychdadj|IL|2172859740 +Vcpgahd|Ckhdadj|IL|2172253282 +Bdtgahd|Gnhdadj|IL|4642656600 +Sdwgahd|Ydhdadj|IL|2172956040 +Vdxgahd|Cehdadj|IL|2170306109 +Bdxgahd|Hehdadj|IL|4642306709 +Sdxgahd|Yehdadj|IL|2172306140 +Vdygahd|Cfhdadj|IL|2171316219 +Bdygahd|Hfhdadj|IL|4642316719 +Ubfgahd|Zwhdadj|IL|2172322733 +Vdzgahd|Cghdadj|IL|2172326329 +Cbfgahd|Iwhdadj|IL|4642356312 +Ucjgahd|Zphdadj|IL|2176376733 +Wadgahd|Dyhdadj|IL|2170300709 +Cbggahd|Iuhdadj|IL|4643356312 +Ucpgahd|Akhdadj|IL|2172253233 +Wbggahd|Duhdadj|IL|2173333739 +Ccngahd|Jghdadj|IL|4642056721 +Udvgahd|Achdadj|IL|2172859833 +Wcjgahd|Dphdadj|IL|2176376769 +Cdtgahd|Knhdadj|IL|4642656721 +Udygahd|Bfhdadj|IL|2172316219 +Wcmgahd|Dxhdadj|IL|2179359799 +Cdugahd|Kbhdadj|IL|4642756721 +Vadgahd|Byhdadj|IL|2170300709 +Wdvgahd|Echdadj|IL|2172859888 +Cdvgahd|Lchdadj|IL|4642856721 +Vbegahd|Bxhdadj|IL|2171311719 +Wdygahd|Efhdadj|IL|2171316219 +Cdygahd|Lfhdadj|IL|4642316722 +Vbhgahd|Bthdadj|IL|2174344749 +Xbegahd|Exhdadj|IL|6181356790 +Dadgahd|Myhdadj|IL|4640306722 +Vbigahd|Bshdadj|IL|2175355759 +Xbfgahd|Ewhdadj|IL|6182356790 +Dbegahd|Mxhdadj|IL|4641316722 +Vckgahd|Bihdadj|IL|2177387779 +Xbggahd|Euhdadj|IL|6183356790 +Dbfgahd|Mwhdadj|IL|4642326722 +Vclgahd|Bbhdadj|IL|2172178789 +Xbhgahd|Ethdadj|IL|6184356790 +Dcjgahd|Nphdadj|IL|4643376722 +Vcqgahd|Cmhdadj|IL|2172354383 +Xcjgahd|Ephdadj|IL|6186356790 +Dcmgahd|Nxhdadj|IL|4649350732 +Vdugahd|Cbhdadj|IL|2172758787 +Xcngahd|Fghdadj|IL|6182056790 +Dcngahd|Nghdadj|IL|4642051732 +Vdvgahd|Cchdadj|IL|2172859888 +Xdsgahd|Fdhdadj|IL|6182556779 +Dcpgahd|Nkhdadj|IL|4642253732 +Vdwgahd|Cdhdadj|IL|2172956989 +Xdugahd|Fbhdadj|IL|6182756779 +Ddxgahd|Pehdadj|IL|4642306145 +Wbfgahd|Dwhdadj|IL|2172322729 +Xdygahd|Ffhdadj|IL|6182316779 +Ddygahd|Pfhdadj|IL|4642316245 +Wbhgahd|Dthdadj|IL|2174344749 +Yadgahd|Gyhdadj|IL|6180350779 +Ddzgahd|Pghdadj|IL|4642326345 +Wcogahd|Dahdadj|IL|2172152181 +Ybegahd|Gxhdadj|IL|6181351779 +Ebggahd|Ruhdadj|IL|4643333745 +Wcpgahd|Dkhdadj|IL|2172253282 +Ybfgahd|Gwhdadj|IL|6182352779 +Ecpgahd|Tkhdadj|IL|4642253245 +Wcqgahd|Emhdadj|IL|2172354383 +Ybhgahd|Gthdadj|IL|6184354779 +Ecqgahd|Tmhdadj|IL|4642354345 +Wdugahd|Ebhdadj|IL|2172758787 +Ycjgahd|Gphdadj|IL|6186356779 +Edsgahd|Tdhdadj|IL|4642558139 +Wdxgahd|Eehdadj|IL|2170306109 +Yclgahd|Gbhdadj|IL|6188358744 +Edtgahd|Unhdadj|IL|4642657609 +Xbigahd|Eshdadj|IL|6185356790 +Ycpgahd|Gkhdadj|IL|6182256244 +Edxgahd|Uehdadj|IL|4642306109 +Xckgahd|Eihdadj|IL|6187356790 +Ydtgahd|Hnhdadj|IL|6182656644 +Fbegahd|Vxhdadj|IL|4641311719 +Xcmgahd|Fxhdadj|IL|6189356790 +Ydwgahd|Hdhdadj|IL|6182956944 +Fbggahd|Vuhdadj|IL|4643333739 +Xcpgahd|Fkhdadj|IL|6182256779 +Ydxgahd|Hehdadj|IL|6182306709 +Fbhgahd|Vthdadj|IL|4644344749 +Xdvgahd|Fchdadj|IL|6182856779 +Ydygahd|Hfhdadj|IL|6182316719 +Fckgahd|Wihdadj|IL|4647387779 +Xdwgahd|Fdhdadj|IL|6182956779 +Ydzgahd|Hghdadj|IL|6182326729 +Fcogahd|Wahdadj|IL|4642152181 +Xdxgahd|Fehdadj|IL|6182306779 +Zadgahd|Hyhdadj|IL|6180356744 +Fdsgahd|Xdhdadj|IL|4642556585 +Ybigahd|Gshdadj|IL|6185355779 +Zbfgahd|Hwhdadj|IL|6182356744 +Fdugahd|Xbhdadj|IL|4642758787 +Yckgahd|Gihdadj|IL|6187357779 +Zbhgahd|Hthdadj|IL|6184356766 +Fdvgahd|Xchdadj|IL|4642859888 +Ycogahd|Gahdadj|IL|6182156144 +Zcjgahd|Iphdadj|IL|6186356766 +Fdwgahd|Xdhdadj|IL|4642956989 +Ycqgahd|Gmhdadj|IL|6182356344 +Zcmgahd|Ixhdadj|IL|6189356766 +Fdxgahd|Xehdadj|IL|4640306109 +Ydsgahd|Hdhdadj|IL|6182556544 +Zdvgahd|Jchdadj|IL|6182856751 +Gbfgahd|Ywhdadj|IL|4642322729 +Ydvgahd|Hchdadj|IL|6182856844 +Kedgahd|Jyhdadj|IL|6180306751 +Gbhgahd|Ythdadj|IL|4644344749 +Zbegahd|Hxhdadj|IL|6181356744 +Keegahd|Jxhdadj|IL|6181316751 +Gclgahd|Zbhdadj|IL|4648138789 +Zcogahd|Iahdadj|IL|6182156766 +Kehgahd|Jthdadj|IL|6184346751 +Gcqgahd|Zmhdadj|IL|4642354383 +Zcpgahd|Ikhdadj|IL|6182256766 +Kelgahd|Jbhdadj|IL|6188136751 +Gcrgahd|Zbhdadj|IL|4642455484 +Zdwgahd|Jdhdadj|IL|6182956751 +Keqgahd|Kmhdadj|IL|6182354762 +Gdvgahd|Achdadj|IL|4642859888 +Zdygahd|Jfhdadj|IL|6182316751 +Ketgahd|Knhdadj|IL|6182657762 +Gdygahd|Afhdadj|IL|4641316219 +Kefgahd|Jwhdadj|IL|6182326751 +Kezgahd|Kghdadj|IL|6182326362 +Hbegahd|Bxhdadj|IL|7731356799 +Keigahd|Jshdadj|IL|6185356751 +Liggahd|Luhdadj|IL|6183333762 +Hbfgahd|Bwhdadj|IL|7732356799 +Kemgahd|Kxhdadj|IL|6189350751 +Likgahd|Lihdadj|IL|6187387762 +Hdugahd|Cbhdadj|IL|7732756767 +Kengahd|Kghdadj|IL|6182051751 +Lilgahd|Lbhdadj|IL|6188138762 +Iadgahd|Dyhdadj|IL|7730350767 +Kepgahd|Kkhdadj|IL|6182253751 +Lipgahd|Lkhdadj|IL|6182253288 +Ibhgahd|Dthdadj|IL|7734354778 +Kesgahd|Kdhdadj|IL|6182556762 +Liygahd|Mfhdadj|IL|6182316219 +Icjgahd|Dphdadj|IL|7736356778 +Kewgahd|Kdhdadj|IL|6182956062 +Moegahd|Mxhdadj|IL|6181311719 +Iclgahd|Ebhdadj|IL|7738358778 +Kexgahd|Kehdadj|IL|6182306162 +Moggahd|Muhdadj|IL|6183333739 +Icmgahd|Exhdadj|IL|7739359778 +Lidgahd|Lyhdadj|IL|6180300762 +Mohgahd|Mthdadj|IL|6184344749 +Idygahd|Gfhdadj|IL|7732316719 +Liegahd|Lxhdadj|IL|6181311762 +Momgahd|Nxhdadj|IL|6189359799 +Idzgahd|Gghdadj|IL|7732326729 +Liigahd|Lshdadj|IL|6185355762 +Moqgahd|Nmhdadj|IL|6182354383 +Jbggahd|Guhdadj|IL|7733356701 +Lijgahd|Lphdadj|IL|6186376762 +Motgahd|Nnhdadj|IL|6182657686 +Jbhgahd|Gthdadj|IL|7734356701 +Liqgahd|Lmhdadj|IL|6182354388 +Movgahd|Nchdadj|IL|6182859888 +Jcjgahd|Gphdadj|IL|7736356701 +Lirgahd|Mbhdadj|IL|6182455488 +Mozgahd|Oghdadj|IL|6182326329 +Jcmgahd|Hxhdadj|IL|7739356701 +Litgahd|Mnhdadj|IL|6182657688 +Nufgahd|Owhdadj|IL|6182322729 +Jcngahd|Hghdadj|IL|7732056755 +Liugahd|Mbhdadj|IL|6182758788 +Nuggahd|Ouhdadj|IL|6183333739 +Jdtgahd|Inhdadj|IL|7732656755 +Lizgahd|Mghdadj|IL|6182326329 +Nuhgahd|Othdadj|IL|6184344749 +Jdvgahd|Ichdadj|IL|7732856755 +Modgahd|Myhdadj|IL|6180300709 +Nukgahd|Oihdadj|IL|6187387779 +Jdwgahd|Idhdadj|IL|7732956755 +Mongahd|Nghdadj|IL|6182061880 +Nulgahd|Pbhdadj|IL|6188138789 +Kckgahd|Jihdadj|IL|7737386704 +Mopgahd|Nkhdadj|IL|6182253282 +Nuxgahd|Qehdadj|IL|6180306109 +Kcngahd|Jghdadj|IL|7732051704 +Mosgahd|Ndhdadj|IL|6182556585 +Nuygahd|Qfhdadj|IL|6181316219 +Kcogahd|Kahdadj|IL|7732152704 +Mowgahd|Ndhdadj|IL|6182956989 +Badgahd|Eyhdadj|IL|8720350711 +Kdvgahd|Kchdadj|IL|7732859766 +Nudgahd|Oyhdadj|IL|6180300709 +Bbfgahd|Ewhdadj|IL|8722352711 +Kdwgahd|Ldhdadj|IL|7732956066 +Nujgahd|Ophdadj|IL|6186376769 +Bcjgahd|Fphdadj|IL|8726356711 +Ladgahd|Lyhdadj|IL|7730300766 +Numgahd|Pxhdadj|IL|6189359799 +Bclgahd|Fbhdadj|IL|8728358700 +Lbggahd|Luhdadj|IL|7733333729 +Nungahd|Pghdadj|IL|6182061880 +Bcogahd|Fahdadj|IL|8722156100 +Lbhgahd|Lthdadj|IL|7734344729 +Nuogahd|Pahdadj|IL|6182152181 +Bcqgahd|Gmhdadj|IL|8722356300 +Lcjgahd|Lphdadj|IL|7736376729 +Nuqgahd|Pmhdadj|IL|6182354383 +Bcrgahd|Gbhdadj|IL|8722456400 +Lclgahd|Mbhdadj|IL|7738138729 +Nurgahd|Pbhdadj|IL|6182455484 +Bdvgahd|Gchdadj|IL|8722856800 +Lcngahd|Mghdadj|IL|7732077329 +Nutgahd|Pnhdadj|IL|6182657686 +Cadgahd|Iyhdadj|IL|8720356312 +Lcogahd|Mahdadj|IL|7732158159 +Nuugahd|Pbhdadj|IL|6182758787 +Cbegahd|Ixhdadj|IL|8721356312 +Lcpgahd|Mkhdadj|IL|7732253229 +Nuzgahd|Qghdadj|IL|6182326329 +Cbhgahd|Ithdadj|IL|8724356312 +Lcrgahd|Mbhdadj|IL|7732455429 +Aadgahd|Ayhdadj|IL|8720356710 +Ccmgahd|Jxhdadj|IL|8729356721 +Ldtgahd|Mnhdadj|IL|7732657629 +Abhgahd|Athdadj|IL|8724356710 +Ccogahd|Jahdadj|IL|8722156721 +Ldugahd|Mbhdadj|IL|7732758729 +Ackgahd|Bihdadj|IL|8727356710 +Ccpgahd|Kkhdadj|IL|8722256721 +Madgahd|Nyhdadj|IL|7730300709 +Aclgahd|Bbhdadj|IL|8728356710 +Ccqgahd|Kmhdadj|IL|8722356721 +Mbggahd|Nuhdadj|IL|7733333739 +Acmgahd|Bxhdadj|IL|8729356701 +Cdwgahd|Ldhdadj|IL|8722956721 +Mbhgahd|Nthdadj|IL|7734344749 +Acpgahd|Bkhdadj|IL|8722256701 +Cdzgahd|Lghdadj|IL|8722326722 +Mcjgahd|Nphdadj|IL|7736376769 +Adtgahd|Cnhdadj|IL|8722656701 +Dbggahd|Muhdadj|IL|8723336722 +Mcpgahd|Okhdadj|IL|7732253282 +Advgahd|Dchdadj|IL|8722856701 +Dckgahd|Nihdadj|IL|8727386722 +Mdsgahd|Odhdadj|IL|7732556585 +Adxgahd|Dehdadj|IL|8722306711 +Dcogahd|Nahdadj|IL|8722152732 +Mdwgahd|Pdhdadj|IL|7732956989 +Adygahd|Dfhdadj|IL|8722316711 +Dcrgahd|Obhdadj|IL|8722455732 +Mdygahd|Pfhdadj|IL|7731316219 +Bbegahd|Axhdadj|IL|8721351711 +Ddsgahd|Odhdadj|IL|8722556732 +Mdzgahd|Pghdadj|IL|7732326329 +Bckgahd|Fihdadj|IL|8727357700 +Ddtgahd|Onhdadj|IL|8722657732 +Nadgahd|Pyhdadj|IL|7730300709 +Bcmgahd|Fxhdadj|IL|8729359700 +Ddugahd|Obhdadj|IL|8722758732 +Nbfgahd|Pwhdadj|IL|7732322729 +Bcpgahd|Gkhdadj|IL|8722256200 +Eadgahd|Ryhdadj|IL|8720300745 +Nbggahd|Puhdadj|IL|7733333739 +Bdsgahd|Gdhdadj|IL|8722558130 +Ebegahd|Rxhdadj|IL|8721311745 +Nbhgahd|Pthdadj|IL|7734344749 +Bdugahd|Gbhdadj|IL|8722756700 +Ebfgahd|Rwhdadj|IL|8722322745 +Ncmgahd|Qxhdadj|IL|7739359799 +Bdwgahd|Hdhdadj|IL|8722956900 +Ebhgahd|Rthdadj|IL|8724344745 +Ncogahd|Qahdadj|IL|7732152181 +Bdzgahd|Hghdadj|IL|8722326729 +Eckgahd|Sihdadj|IL|8727387745 +Ncpgahd|Qkhdadj|IL|7732253282 +Cbigahd|Ishdadj|IL|8725356312 +Ecmgahd|Sxhdadj|IL|8729359745 +Ndwgahd|Qdhdadj|IL|7732956989 +Ccjgahd|Jphdadj|IL|8726356312 +Ecogahd|Tahdadj|IL|8722152145 +Oadgahd|Ryhdadj|IL|2170356776 +Cckgahd|Jihdadj|IL|8727356312 +Ecrgahd|Tbhdadj|IL|8722455445 +Obegahd|Rxhdadj|IL|2171356776 +Cclgahd|Jbhdadj|IL|8728356721 +Edugahd|Ubhdadj|IL|8722758709 +Obfgahd|Rwhdadj|IL|2172356776 +Ccrgahd|Kbhdadj|IL|8722456721 +Edvgahd|Uchdadj|IL|8722859809 +Ocjgahd|Sphdadj|IL|2176356776 +Cdsgahd|Kdhdadj|IL|8722556721 +Edzgahd|Vghdadj|IL|8722326329 +Ockgahd|Sihdadj|IL|2177356776 +Cdxgahd|Lehdadj|IL|8722306721 +Fadgahd|Vyhdadj|IL|8720300709 +Ocngahd|Sghdadj|IL|2172056776 +Dbhgahd|Mthdadj|IL|8724346722 +Fbigahd|Wshdadj|IL|8725355759 +Odtgahd|Snhdadj|IL|2172656776 +Dbigahd|Nshdadj|IL|8725356722 +Fcjgahd|Wphdadj|IL|8726376769 +Odwgahd|Tdhdadj|IL|2172956776 +Dclgahd|Nbhdadj|IL|8728136732 +Fclgahd|Wbhdadj|IL|8728138789 +Pbhgahd|Tthdadj|IL|2174354767 +Dcqgahd|Omhdadj|IL|8722354732 +Fcngahd|Wghdadj|IL|8722031080 +Pcogahd|Uahdadj|IL|2172156167 +Ddvgahd|Ochdadj|IL|8722859732 +Fcpgahd|Wkhdadj|IL|8722253282 +Pcqgahd|Umhdadj|IL|2172356367 +Ddwgahd|Odhdadj|IL|8722956045 +Fdtgahd|Xnhdadj|IL|8722657686 +Pcrgahd|Ubhdadj|IL|2172457737 +Ebigahd|Sshdadj|IL|8725355745 +Fdygahd|Yfhdadj|IL|8721316219 +Pdtgahd|Unhdadj|IL|2172656600 +Ecjgahd|Sphdadj|IL|8726376745 +Gbigahd|Zshdadj|IL|8725355759 +Pdvgahd|Uchdadj|IL|2172856800 +Eclgahd|Sbhdadj|IL|8728138745 +Gckgahd|Zihdadj|IL|8727387779 +Rbegahd|Vxhdadj|IL|2171356700 +Ecngahd|Sghdadj|IL|8722031045 +Gcmgahd|Zxhdadj|IL|8729359799 +Rbfgahd|Vwhdadj|IL|2172356700 +Edwgahd|Udhdadj|IL|8722956909 +Gcogahd|Zahdadj|IL|8722152181 +Rckgahd|Vihdadj|IL|2177356700 +Edygahd|Vfhdadj|IL|8722316219 +Gcpgahd|Zkhdadj|IL|8722253282 +Rclgahd|Wbhdadj|IL|2178356700 +Fbfgahd|Vwhdadj|IL|8722322729 +Gdtgahd|Anhdadj|IL|8722657686 +Rcmgahd|Wxhdadj|IL|2179356700 +Fcmgahd|Wxhdadj|IL|8729359799 +Gdugahd|Abhdadj|IL|8722758787 +Rcogahd|Wahdadj|IL|2172156700 +Fcqgahd|Xmhdadj|IL|8722354383 +Gdwgahd|Adhdadj|IL|8722956989 +Rcqgahd|Wmhdadj|IL|2172356706 +Fcrgahd|Xbhdadj|IL|8722455484 +Gdxgahd|Aehdadj|IL|8720306109 +Rdsgahd|Wdhdadj|IL|2172556706 +Fdzgahd|Yghdadj|IL|8722326329 +Hadgahd|Byhdadj|IL|3090356799 +Rdtgahd|Wnhdadj|IL|2172656706 +Gadgahd|Yyhdadj|IL|8720300709 +Hbigahd|Bshdadj|IL|3095356799 +Rdwgahd|Wdhdadj|IL|2172956706 +Gbegahd|Yxhdadj|IL|8721311719 +Hcjgahd|Bphdadj|IL|3096356799 +Scjgahd|Xphdadj|IL|2176376740 +Gbggahd|Yuhdadj|IL|8723333739 +Hckgahd|Bihdadj|IL|3097356799 +Scmgahd|Xxhdadj|IL|2179350740 +Gcjgahd|Zphdadj|IL|8726376769 +Hclgahd|Bbhdadj|IL|3098356799 +Scrgahd|Ybhdadj|IL|2172455740 +Gcngahd|Zghdadj|IL|8722031080 +Hcngahd|Bghdadj|IL|3092056799 +Sdtgahd|Ynhdadj|IL|2172657740 +Gdsgahd|Adhdadj|IL|8722556585 +Hcpgahd|Ckhdadj|IL|3092256767 +Sdugahd|Ybhdadj|IL|2172758740 +Gdzgahd|Aghdadj|IL|8722326329 +Hdsgahd|Cdhdadj|IL|3092556767 +Sdygahd|Yfhdadj|IL|2172316233 +Hbggahd|Buhdadj|IL|3093356799 +Hdtgahd|Cnhdadj|IL|3092656767 +Uadgahd|Zyhdadj|IL|2170300733 +Hbhgahd|Bthdadj|IL|3094356799 +Hdzgahd|Dghdadj|IL|3092326767 +Ubegahd|Zxhdadj|IL|2171311733 +Hcmgahd|Bxhdadj|IL|3099356799 +Ibegahd|Dxhdadj|IL|3091351778 +Ubigahd|Zshdadj|IL|2175355733 +Hcogahd|Bahdadj|IL|3092156799 +Ibfgahd|Dwhdadj|IL|3092352778 +Uclgahd|Zbhdadj|IL|2172178733 +Hcqgahd|Cmhdadj|IL|3092356767 +Ibigahd|Dshdadj|IL|3095355778 +Ucmgahd|Axhdadj|IL|2179359733 +Hcrgahd|Cbhdadj|IL|3092456767 +Icngahd|Eghdadj|IL|3092053098 +Ucqgahd|Amhdadj|IL|2172354333 +Hdvgahd|Cchdadj|IL|3092856767 +Icpgahd|Ekhdadj|IL|3092256278 +Udtgahd|Anhdadj|IL|2172657633 +Hdwgahd|Cdhdadj|IL|3092956767 +Icqgahd|Emhdadj|IL|3092356356 +Udugahd|Abhdadj|IL|2172758733 +Hdxgahd|Cehdadj|IL|3092306767 +Idugahd|Fbhdadj|IL|3092756756 +Udxgahd|Aehdadj|IL|2172306109 +Hdygahd|Dfhdadj|IL|3092316767 +Jadgahd|Gyhdadj|IL|3090356701 +Vbggahd|Buhdadj|IL|2173333739 +Ibggahd|Duhdadj|IL|3093353778 +Jbegahd|Gxhdadj|IL|3091356701 +Vcngahd|Cghdadj|IL|2172051080 +Ickgahd|Eihdadj|IL|3097357778 +Jbfgahd|Gwhdadj|IL|3092356701 +Vcogahd|Cahdadj|IL|2172152181 +Icogahd|Eahdadj|IL|3092156178 +Jbigahd|Gshdadj|IL|3095356701 +Vcrgahd|Cbhdadj|IL|2172455484 +Icrgahd|Fbhdadj|IL|3092456456 +Jckgahd|Hihdadj|IL|3097356701 +Vdsgahd|Cdhdadj|IL|2172556585 +Idsgahd|Fdhdadj|IL|3092556556 +Jclgahd|Hbhdadj|IL|3098356701 +Vdtgahd|Cnhdadj|IL|2172657686 +Idtgahd|Fnhdadj|IL|3092656656 +Jcrgahd|Hbhdadj|IL|3092456755 +Wbegahd|Dxhdadj|IL|2171311719 +Idvgahd|Fchdadj|IL|3092856856 +Jdsgahd|Hdhdadj|IL|3092556755 +Wbigahd|Dshdadj|IL|2175355759 +Idwgahd|Fdhdadj|IL|3092956956 +Jdzgahd|Ighdadj|IL|3092326755 +Wckgahd|Dihdadj|IL|2177387779 +Idxgahd|Fehdadj|IL|3092306709 +Kadgahd|Iyhdadj|IL|3090306704 +Wclgahd|Dbhdadj|IL|2172178789 +Jcogahd|Hahdadj|IL|3092156755 +Kbegahd|Ixhdadj|IL|3091316704 +Wcngahd|Dghdadj|IL|2172051080 +Jcpgahd|Hkhdadj|IL|3092256755 +Kbfgahd|Jwhdadj|IL|3092326704 +Wcrgahd|Ebhdadj|IL|2172455484 +Jcqgahd|Hmhdadj|IL|3092356755 +Kbigahd|Jshdadj|IL|3095356704 +Wdsgahd|Edhdadj|IL|2172556585 +Jdugahd|Ibhdadj|IL|3092756755 +Kcjgahd|Jphdadj|IL|3096376704 +Wdtgahd|Enhdadj|IL|2172657686 +Jdxgahd|Iehdadj|IL|3092306755 +Kclgahd|Jbhdadj|IL|3093096704 +Wdwgahd|Edhdadj|IL|2172956989 +Jdygahd|Ifhdadj|IL|3092316755 +Kcqgahd|Kmhdadj|IL|3092354766 +Wdzgahd|Eghdadj|IL|2172326329 +Kbggahd|Juhdadj|IL|3093336704 +Kcrgahd|Kbhdadj|IL|3092455766 +Xadgahd|Eyhdadj|IL|6180356790 +Kbhgahd|Jthdadj|IL|3094346704 +Kdsgahd|Kdhdadj|IL|3092556766 +Xclgahd|Fbhdadj|IL|6188356790 +Kcmgahd|Jxhdadj|IL|3099350704 +Kdugahd|Kbhdadj|IL|3092758766 +Xcogahd|Fahdadj|IL|6182156790 +Kcpgahd|Kkhdadj|IL|3092253704 +Kdzgahd|Lghdadj|IL|3092326366 +Xcqgahd|Fmhdadj|IL|6182356779 +Kdtgahd|Knhdadj|IL|3092657766 +Lbegahd|Lxhdadj|IL|3091311766 +Xcrgahd|Fbhdadj|IL|6182456779 +Kdxgahd|Lehdadj|IL|3092306166 +Ldsgahd|Mdhdadj|IL|3092556529 +Xdtgahd|Fnhdadj|IL|6182656779 +Kdygahd|Lfhdadj|IL|3092316266 +Ldvgahd|Nchdadj|IL|3092859829 +Xdzgahd|Fghdadj|IL|6182326779 +Lbfgahd|Lwhdadj|IL|3092322766 +Ldwgahd|Ndhdadj|IL|3092956929 +Ybggahd|Guhdadj|IL|6183353779 +Lbigahd|Lshdadj|IL|3095355729 +Ldygahd|Nfhdadj|IL|3092316219 +Ycmgahd|Gxhdadj|IL|6189359744 +Lckgahd|Mihdadj|IL|3097387729 +Mbfgahd|Nwhdadj|IL|3092322729 +Ycngahd|Gghdadj|IL|6182056044 +Lcmgahd|Mxhdadj|IL|3099359729 +Mclgahd|Obhdadj|IL|3093098789 +Ycrgahd|Gbhdadj|IL|6182456444 +Lcqgahd|Mmhdadj|IL|3092354329 +Mcmgahd|Oxhdadj|IL|3099359799 +Ydugahd|Hbhdadj|IL|6182756744 +Ldxgahd|Nehdadj|IL|3092306109 +Mcqgahd|Omhdadj|IL|3092354383 +Zbggahd|Huhdadj|IL|6183356766 +Ldzgahd|Nghdadj|IL|3092326329 +Mcrgahd|Obhdadj|IL|3092455484 +Zbigahd|Ishdadj|IL|6185356766 +Mbegahd|Nxhdadj|IL|3091311719 +Mdxgahd|Pehdadj|IL|3090306109 +Zckgahd|Iihdadj|IL|6187356766 +Mbigahd|Nshdadj|IL|3095355759 +Ncjgahd|Pphdadj|IL|3096376769 +Zclgahd|Ibhdadj|IL|6188356766 +Mckgahd|Nihdadj|IL|3097387779 +Nckgahd|Pihdadj|IL|3097387779 +Zcngahd|Ighdadj|IL|6182056766 +Mcngahd|Oghdadj|IL|3092031080 +Ncrgahd|Qbhdadj|IL|3092455484 +Zcqgahd|Imhdadj|IL|6182356766 +Mcogahd|Oahdadj|IL|3092152181 +Ndtgahd|Qnhdadj|IL|3092657686 +Zcrgahd|Ibhdadj|IL|6182456766 +Mdtgahd|Onhdadj|IL|3092657686 +Ndugahd|Qbhdadj|IL|3092758787 +Zdsgahd|Idhdadj|IL|6182556766 +Mdugahd|Obhdadj|IL|3092758787 +Ndvgahd|Qchdadj|IL|3092859888 +Zdtgahd|Inhdadj|IL|6182656766 +Mdvgahd|Ochdadj|IL|3092859888 +Ndygahd|Rfhdadj|IL|3091316219 +Zdugahd|Ibhdadj|IL|6182756766 +Nbegahd|Pxhdadj|IL|3091311719 +Ndzgahd|Rghdadj|IL|3092326329 +Zdxgahd|Jehdadj|IL|6182306751 +Nbigahd|Pshdadj|IL|3095355759 +Obggahd|Ruhdadj|IL|3093356776 +Zdzgahd|Jghdadj|IL|6182326751 +Nclgahd|Qbhdadj|IL|3093098789 +Obigahd|Rshdadj|IL|3095356776 +Keggahd|Juhdadj|IL|6183336751 +Ncngahd|Qghdadj|IL|3092031080 +Oclgahd|Sbhdadj|IL|3098356776 +Kejgahd|Jphdadj|IL|6186376751 +Ncqgahd|Qmhdadj|IL|3092354383 +Ocmgahd|Sxhdadj|IL|3099356776 +Kekgahd|Jihdadj|IL|6187386751 +Ndsgahd|Qdhdadj|IL|3092556585 +Ocogahd|Sahdadj|IL|3092156776 +Keogahd|Kahdadj|IL|6182152751 +Ndxgahd|Rehdadj|IL|3090306109 +Ocqgahd|Smhdadj|IL|3092356776 +Kergahd|Kbhdadj|IL|6182455762 +Obhgahd|Rthdadj|IL|3094356776 +Odugahd|Tbhdadj|IL|3092756776 +Keugahd|Kbhdadj|IL|6182758762 +Ocpgahd|Skhdadj|IL|3092256776 +Padgahd|Tyhdadj|IL|3090350767 +Kevgahd|Kchdadj|IL|6182859762 +Ocrgahd|Sbhdadj|IL|3092456776 +Pbfgahd|Twhdadj|IL|3092352767 +Keygahd|Kfhdadj|IL|6182316262 +Odsgahd|Sdhdadj|IL|3092556776 +Pbggahd|Tuhdadj|IL|3093353767 +Lifgahd|Lwhdadj|IL|6182322762 +Odvgahd|Tchdadj|IL|3092856776 +Pcjgahd|Uphdadj|IL|3096356767 +Lihgahd|Lthdadj|IL|6184344762 +Odxgahd|Tehdadj|IL|3092306767 +Pckgahd|Uihdadj|IL|3097357767 +Limgahd|Lxhdadj|IL|6189359762 +Odygahd|Tfhdadj|IL|3092316767 +Pcngahd|Ughdadj|IL|3092056067 +Lingahd|Lghdadj|IL|6182061888 +Odzgahd|Tghdadj|IL|3092326767 +Pdugahd|Ubhdadj|IL|3092756700 +Liogahd|Lahdadj|IL|6182152188 +Pbegahd|Txhdadj|IL|3091351767 +Pdxgahd|Vehdadj|IL|3092306709 +Lisgahd|Mdhdadj|IL|6182556588 +Pbigahd|Tshdadj|IL|3095355767 +Pdygahd|Vfhdadj|IL|3092316719 +Livgahd|Mchdadj|IL|6182859888 +Pclgahd|Ubhdadj|IL|3098358767 +Rbggahd|Vuhdadj|IL|3093356700 +Liwgahd|Mdhdadj|IL|6182956988 +Pcmgahd|Uxhdadj|IL|3099359767 +Rbigahd|Vshdadj|IL|3095356700 +Lixgahd|Mehdadj|IL|6182306109 +Pcpgahd|Ukhdadj|IL|3092256267 +Rcjgahd|Vphdadj|IL|3096356700 +Mofgahd|Mwhdadj|IL|6182322729 +Pdsgahd|Udhdadj|IL|3092553090 +Sbfgahd|Xwhdadj|IL|3092326706 +Moigahd|Mshdadj|IL|6185355759 +Pdwgahd|Udhdadj|IL|3092956900 +Sbggahd|Xuhdadj|IL|3093336706 +Mojgahd|Nphdadj|IL|6186376769 +Pdzgahd|Vghdadj|IL|3092326729 +Sbigahd|Xshdadj|IL|3095356740 +Mokgahd|Nihdadj|IL|6187387779 +Radgahd|Vyhdadj|IL|3090356700 +Scngahd|Xghdadj|IL|3092051740 +Molgahd|Nbhdadj|IL|6188138789 +Rbhgahd|Vthdadj|IL|3094356700 +Scpgahd|Ykhdadj|IL|3092253740 +Moogahd|Nahdadj|IL|6182152181 +Rcngahd|Wghdadj|IL|3092056700 +Scqgahd|Ymhdadj|IL|3092354740 +Morgahd|Nbhdadj|IL|6182455484 +Rcpgahd|Wkhdadj|IL|3092256706 +Sdzgahd|Yghdadj|IL|3092326333 +Mougahd|Nbhdadj|IL|6182758787 +Rcrgahd|Wbhdadj|IL|3092456706 +Ubggahd|Zuhdadj|IL|3093333733 +Moxgahd|Nehdadj|IL|6180306109 +Rdugahd|Wbhdadj|IL|3092756706 +Ubhgahd|Zthdadj|IL|3094344733 +Moygahd|Ofhdadj|IL|6181316219 +Rdvgahd|Wchdadj|IL|3092856706 +Uckgahd|Zihdadj|IL|3097387733 +Nuegahd|Oxhdadj|IL|6181311719 +Rdxgahd|Wehdadj|IL|3092306706 +Ucngahd|Aghdadj|IL|3092031033 +Nuigahd|Oshdadj|IL|6185355759 +Rdygahd|Wfhdadj|IL|3092316706 +Ucogahd|Aahdadj|IL|3092152133 +Nupgahd|Pkhdadj|IL|6182253282 +Rdzgahd|Wghdadj|IL|3092326706 +Ucrgahd|Abhdadj|IL|3092455433 +Nusgahd|Pdhdadj|IL|6182556585 +Sadgahd|Xyhdadj|IL|3090306706 +Udsgahd|Adhdadj|IL|3092556533 +Nuvgahd|Pchdadj|IL|6182859888 +Sbegahd|Xxhdadj|IL|3091316706 +Udwgahd|Adhdadj|IL|3092956933 +Nuwgahd|Pdhdadj|IL|6182956989 +Sbhgahd|Xthdadj|IL|3094346706 +Udzgahd|Bghdadj|IL|3092326329 +Abegahd|Axhdadj|IL|8721356710 +Sckgahd|Xihdadj|IL|3097386740 +Vbfgahd|Bwhdadj|IL|3092322729 +Abfgahd|Awhdadj|IL|8722356710 +Sclgahd|Xbhdadj|IL|3093096740 +Vcjgahd|Bphdadj|IL|3096376769 +Abggahd|Auhdadj|IL|8723356710 +Scogahd|Yahdadj|IL|3092152740 +Vcmgahd|Cxhdadj|IL|3099359799 +Abigahd|Ashdadj|IL|8725356710 +Sdsgahd|Ydhdadj|IL|3092556740 +Vcpgahd|Ckhdadj|IL|3092253282 +Acjgahd|Bphdadj|IL|8726356710 +Sdvgahd|Ychdadj|IL|3092859740 +Vdxgahd|Cehdadj|IL|3090306109 +Acngahd|Bghdadj|IL|8722056701 +Sdwgahd|Ydhdadj|IL|3092956040 +Vdygahd|Cfhdadj|IL|3091316219 +Acogahd|Bahdadj|IL|8722156701 +Sdxgahd|Yehdadj|IL|3092306140 +Vdzgahd|Cghdadj|IL|3092326329 +Acqgahd|Cmhdadj|IL|8722356701 +Ubfgahd|Zwhdadj|IL|3092322733 +Wadgahd|Dyhdadj|IL|3090300709 +Acrgahd|Cbhdadj|IL|8722456701 +Ucjgahd|Zphdadj|IL|3096376733 +Wbggahd|Duhdadj|IL|3093333739 +Adsgahd|Cdhdadj|IL|8722556701 +Ucpgahd|Akhdadj|IL|3092253233 +Wcjgahd|Dphdadj|IL|3096376769 +Adugahd|Cbhdadj|IL|8722756701 +Udvgahd|Achdadj|IL|3092859833 +Wcmgahd|Dxhdadj|IL|3099359799 +Adwgahd|Ddhdadj|IL|8722956711 +Udygahd|Bfhdadj|IL|3092316219 +Wdvgahd|Echdadj|IL|3092859888 +Adzgahd|Dghdadj|IL|8722326711 +Vadgahd|Byhdadj|IL|3090300709 +Wdygahd|Efhdadj|IL|3091316219 +Bbggahd|Euhdadj|IL|8723353711 +Vbegahd|Bxhdadj|IL|3091311719 +Xbegahd|Exhdadj|IL|3091356790 +Bbhgahd|Ethdadj|IL|8724354711 +Vbhgahd|Bthdadj|IL|3094344749 +Xbfgahd|Ewhdadj|IL|3092356790 +Bbigahd|Eshdadj|IL|8725355711 +Vbigahd|Bshdadj|IL|3095355759 +Xbggahd|Euhdadj|IL|3093356790 +Bcngahd|Fghdadj|IL|8722056000 +Vckgahd|Bihdadj|IL|3097387779 +Xbhgahd|Ethdadj|IL|3094356790 +Bdtgahd|Gnhdadj|IL|8722656600 +Vclgahd|Bbhdadj|IL|3093098789 +Xcjgahd|Ephdadj|IL|3096356790 +Bdxgahd|Hehdadj|IL|8722306709 +Vcqgahd|Cmhdadj|IL|3092354383 +Xcngahd|Fghdadj|IL|3092056790 +Bdygahd|Hfhdadj|IL|8722316719 +Vdugahd|Cbhdadj|IL|3092758787 +Xdsgahd|Fdhdadj|IL|3092556779 +Cbfgahd|Iwhdadj|IL|8722356312 +Vdvgahd|Cchdadj|IL|3092859888 +Xdugahd|Fbhdadj|IL|3092756779 +Cbggahd|Iuhdadj|IL|8723356312 +Vdwgahd|Cdhdadj|IL|3092956989 +Xdygahd|Ffhdadj|IL|3092316779 +Ccngahd|Jghdadj|IL|8722056721 +Wbfgahd|Dwhdadj|IL|3092322729 +Yadgahd|Gyhdadj|IL|3090350779 +Cdtgahd|Knhdadj|IL|8722656721 +Wbhgahd|Dthdadj|IL|3094344749 +Ybegahd|Gxhdadj|IL|3091351779 +Cdugahd|Kbhdadj|IL|8722756721 +Wcogahd|Dahdadj|IL|3092152181 +Ybfgahd|Gwhdadj|IL|3092352779 +Cdvgahd|Lchdadj|IL|8722856721 +Wcpgahd|Dkhdadj|IL|3092253282 +Ybhgahd|Gthdadj|IL|3094354779 +Cdygahd|Lfhdadj|IL|8722316722 +Wcqgahd|Emhdadj|IL|3092354383 +Ycjgahd|Gphdadj|IL|3096356779 +Dadgahd|Myhdadj|IL|8720306722 +Wdugahd|Ebhdadj|IL|3092758787 +Yclgahd|Gbhdadj|IL|3098358744 +Dbegahd|Mxhdadj|IL|8721316722 +Wdxgahd|Eehdadj|IL|3090306109 +Ycpgahd|Gkhdadj|IL|3092256244 +Dbfgahd|Mwhdadj|IL|8722326722 +Xbigahd|Eshdadj|IL|3095356790 +Ydtgahd|Hnhdadj|IL|3092656644 +Dcjgahd|Nphdadj|IL|8726376722 +Xckgahd|Eihdadj|IL|3097356790 +Ydwgahd|Hdhdadj|IL|3092956944 +Dcmgahd|Nxhdadj|IL|8729350732 +Xcmgahd|Fxhdadj|IL|3099356790 +Ydxgahd|Hehdadj|IL|3092306709 +Dcngahd|Nghdadj|IL|8722051732 +Xcpgahd|Fkhdadj|IL|3092256779 +Ydygahd|Hfhdadj|IL|3092316719 +Dcpgahd|Nkhdadj|IL|8722253732 +Xdvgahd|Fchdadj|IL|3092856779 +Ydzgahd|Hghdadj|IL|3092326729 +Ddxgahd|Pehdadj|IL|8722306145 +Xdwgahd|Fdhdadj|IL|3092956779 +Zadgahd|Hyhdadj|IL|3090356744 +Ddygahd|Pfhdadj|IL|8722316245 +Xdxgahd|Fehdadj|IL|3092306779 +Zbfgahd|Hwhdadj|IL|3092356744 +Ddzgahd|Pghdadj|IL|8722326345 +Ybigahd|Gshdadj|IL|3095355779 +Zbhgahd|Hthdadj|IL|3094356766 +Ebggahd|Ruhdadj|IL|8723333745 +Yckgahd|Gihdadj|IL|3097357779 +Zcjgahd|Iphdadj|IL|3096356766 +Ecpgahd|Tkhdadj|IL|8722253245 +Ycogahd|Gahdadj|IL|3092156144 +Zcmgahd|Ixhdadj|IL|3099356766 +Ecqgahd|Tmhdadj|IL|8722354345 +Ycqgahd|Gmhdadj|IL|3092356344 +Zdvgahd|Jchdadj|IL|3092856751 +Edsgahd|Tdhdadj|IL|8722558139 +Ydsgahd|Hdhdadj|IL|3092556544 +Kedgahd|Jyhdadj|IL|3090306751 +Edtgahd|Unhdadj|IL|8722657609 +Ydvgahd|Hchdadj|IL|3092856844 +Keegahd|Jxhdadj|IL|3091316751 +Edxgahd|Uehdadj|IL|8722306109 +Zbegahd|Hxhdadj|IL|3091356744 +Kehgahd|Jthdadj|IL|3094346751 +Fbegahd|Vxhdadj|IL|8721311719 +Zcogahd|Iahdadj|IL|3092156766 +Kelgahd|Jbhdadj|IL|3093096751 +Fbggahd|Vuhdadj|IL|8723333739 +Zcpgahd|Ikhdadj|IL|3092256766 +Keqgahd|Kmhdadj|IL|3092354762 +Fbhgahd|Vthdadj|IL|8724344749 +Zdwgahd|Jdhdadj|IL|3092956751 +Ketgahd|Knhdadj|IL|3092657762 +Fckgahd|Wihdadj|IL|8727387779 +Zdygahd|Jfhdadj|IL|3092316751 +Kezgahd|Kghdadj|IL|3092326362 +Fcogahd|Wahdadj|IL|8722152181 +Kefgahd|Jwhdadj|IL|3092326751 +Liggahd|Luhdadj|IL|3093333762 +Fdsgahd|Xdhdadj|IL|8722556585 +Keigahd|Jshdadj|IL|3095356751 +Likgahd|Lihdadj|IL|3097387762 +Fdugahd|Xbhdadj|IL|8722758787 +Kemgahd|Kxhdadj|IL|3099350751 +Lilgahd|Lbhdadj|IL|3093098762 +Fdvgahd|Xchdadj|IL|8722859888 +Kengahd|Kghdadj|IL|3092051751 +Lipgahd|Lkhdadj|IL|3092253288 +Fdwgahd|Xdhdadj|IL|8722956989 +Kepgahd|Kkhdadj|IL|3092253751 +Liygahd|Mfhdadj|IL|3092316219 +Fdxgahd|Xehdadj|IL|8720306109 +Kesgahd|Kdhdadj|IL|3092556762 +Moegahd|Mxhdadj|IL|3091311719 +Gbfgahd|Ywhdadj|IL|8722322729 +Kewgahd|Kdhdadj|IL|3092956062 +Moggahd|Muhdadj|IL|3093333739 +Gbhgahd|Ythdadj|IL|8724344749 +Kexgahd|Kehdadj|IL|3092306162 +Mohgahd|Mthdadj|IL|3094344749 +Gclgahd|Zbhdadj|IL|8728138789 +Lidgahd|Lyhdadj|IL|3090300762 +Momgahd|Nxhdadj|IL|3099359799 +Gcqgahd|Zmhdadj|IL|8722354383 +Liegahd|Lxhdadj|IL|3091311762 +Moqgahd|Nmhdadj|IL|3092354383 +Gcrgahd|Zbhdadj|IL|8722455484 +Liigahd|Lshdadj|IL|3095355762 +Motgahd|Nnhdadj|IL|3092657686 +Gdvgahd|Achdadj|IL|8722859888 +Lijgahd|Lphdadj|IL|3096376762 +Movgahd|Nchdadj|IL|3092859888 +Gdygahd|Afhdadj|IL|8721316219 +Liqgahd|Lmhdadj|IL|3092354388 +Mozgahd|Oghdadj|IL|3092326329 +Hbegahd|Bxhdadj|IL|3091356799 +Lirgahd|Mbhdadj|IL|3092455488 +Nufgahd|Owhdadj|IL|3092322729 +Hbfgahd|Bwhdadj|IL|3092356799 +Litgahd|Mnhdadj|IL|3092657688 +Nuggahd|Ouhdadj|IL|3093333739 +Hdugahd|Cbhdadj|IL|3092756767 +Liugahd|Mbhdadj|IL|3092758788 +Nuhgahd|Othdadj|IL|3094344749 +Iadgahd|Dyhdadj|IL|3090350767 +Lizgahd|Mghdadj|IL|3092326329 +Nukgahd|Oihdadj|IL|3097387779 +Ibhgahd|Dthdadj|IL|3094354778 +Modgahd|Myhdadj|IL|3090300709 +Nulgahd|Pbhdadj|IL|3093098789 +Icjgahd|Dphdadj|IL|3096356778 +Mongahd|Nghdadj|IL|3092031080 +Nuxgahd|Qehdadj|IL|3090306109 +Iclgahd|Ebhdadj|IL|3098358778 +Mopgahd|Nkhdadj|IL|3092253282 +Nuygahd|Qfhdadj|IL|3091316219 +Icmgahd|Exhdadj|IL|3099359778 +Mosgahd|Ndhdadj|IL|3092556585 +Badgahd|Eyhdadj|MI|8100350711 +Idygahd|Gfhdadj|IL|3092316719 +Mowgahd|Ndhdadj|IL|3092956989 +Bbfgahd|Ewhdadj|MI|8102352711 +Idzgahd|Gghdadj|IL|3092326729 +Nudgahd|Oyhdadj|IL|3090300709 +Bcjgahd|Fphdadj|MI|8106356711 +Jbggahd|Guhdadj|IL|3093356701 +Nujgahd|Ophdadj|IL|3096376769 +Bclgahd|Fbhdadj|MI|8108358700 +Jbhgahd|Gthdadj|IL|3094356701 +Numgahd|Pxhdadj|IL|3099359799 +Bcogahd|Fahdadj|MI|8108106100 +Jcjgahd|Gphdadj|IL|3096356701 +Nungahd|Pghdadj|IL|3092031080 +Bcqgahd|Gmhdadj|MI|8102356300 +Jcmgahd|Hxhdadj|IL|3099356701 +Nuogahd|Pahdadj|IL|3092152181 +Bcrgahd|Gbhdadj|MI|8102456400 +Jcngahd|Hghdadj|IL|3092056755 +Nuqgahd|Pmhdadj|IL|3092354383 +Bdvgahd|Gchdadj|MI|8102856800 +Jdtgahd|Inhdadj|IL|3092656755 +Nurgahd|Pbhdadj|IL|3092455484 +Cadgahd|Iyhdadj|MI|8100356810 +Jdvgahd|Ichdadj|IL|3092856755 +Nutgahd|Pnhdadj|IL|3092657686 +Cbegahd|Ixhdadj|MI|8101356810 +Jdwgahd|Idhdadj|IL|3092956755 +Nuugahd|Pbhdadj|IL|3092758787 +Cbhgahd|Ithdadj|MI|8104356810 +Kckgahd|Jihdadj|IL|3097386704 +Nuzgahd|Qghdadj|IL|3092326329 +Ccmgahd|Jxhdadj|MI|8109356721 +Kcngahd|Jghdadj|IL|3092051704 +Aadgahd|Ayhdadj|MI|8100356710 +Ccogahd|Jahdadj|MI|8108106721 +Kcogahd|Kahdadj|IL|3092152704 +Abhgahd|Athdadj|MI|8104356710 +Ccpgahd|Kkhdadj|MI|8102256721 +Kdvgahd|Kchdadj|IL|3092859766 +Ackgahd|Bihdadj|MI|8107356710 +Ccqgahd|Kmhdadj|MI|8102356721 +Kdwgahd|Ldhdadj|IL|3092956066 +Aclgahd|Bbhdadj|MI|8108356710 +Cdwgahd|Ldhdadj|MI|8102956721 +Ladgahd|Lyhdadj|IL|3090300766 +Acmgahd|Bxhdadj|MI|8109356701 +Cdzgahd|Lghdadj|MI|8102390622 +Lbggahd|Luhdadj|IL|3093333729 +Acpgahd|Bkhdadj|MI|8102256701 +Dbggahd|Muhdadj|MI|8103336722 +Lbhgahd|Lthdadj|IL|3094344729 +Adtgahd|Cnhdadj|MI|8102656701 +Dckgahd|Nihdadj|MI|8107386722 +Lcjgahd|Lphdadj|IL|3096376729 +Advgahd|Dchdadj|MI|8102856701 +Dcogahd|Nahdadj|MI|8108102732 +Lclgahd|Mbhdadj|IL|3093098729 +Adxgahd|Dehdadj|MI|8102306711 +Dcrgahd|Obhdadj|MI|8102455732 +Lcngahd|Mghdadj|IL|3092031029 +Adygahd|Dfhdadj|MI|8102316711 +Ddsgahd|Odhdadj|MI|8102556732 +Lcogahd|Mahdadj|IL|3092158159 +Bbegahd|Axhdadj|MI|8101351711 +Ddtgahd|Onhdadj|MI|8102655172 +Lcpgahd|Mkhdadj|IL|3092253229 +Bckgahd|Fihdadj|MI|8107357700 +Ddugahd|Obhdadj|MI|8102758732 +Lcrgahd|Mbhdadj|IL|3092455429 +Bcmgahd|Fxhdadj|MI|8109359700 +Eadgahd|Ryhdadj|MI|8100300745 +Ldtgahd|Mnhdadj|IL|3092657629 +Bcpgahd|Gkhdadj|MI|8102256200 +Ebegahd|Rxhdadj|MI|8101311745 +Ldugahd|Mbhdadj|IL|3092758729 +Bdsgahd|Gdhdadj|MI|8102558130 +Ebfgahd|Rwhdadj|MI|8102322745 +Madgahd|Nyhdadj|IL|3090300709 +Bdugahd|Gbhdadj|MI|8102756700 +Ebhgahd|Rthdadj|MI|8104344745 +Mbggahd|Nuhdadj|IL|3093333739 +Bdwgahd|Hdhdadj|MI|8102956900 +Eckgahd|Sihdadj|MI|8107387745 +Mbhgahd|Nthdadj|IL|3094344749 +Bdzgahd|Hghdadj|MI|8102390629 +Ecmgahd|Sxhdadj|MI|8109359745 +Mcjgahd|Nphdadj|IL|3096376769 +Cbigahd|Ishdadj|MI|8105356810 +Ecogahd|Tahdadj|MI|8108102145 +Mcpgahd|Okhdadj|IL|3092253282 +Ccjgahd|Jphdadj|MI|8106356810 +Ecrgahd|Tbhdadj|MI|8102455445 +Mdsgahd|Odhdadj|IL|3092556585 +Cckgahd|Jihdadj|MI|8107356810 +Edugahd|Ubhdadj|MI|8102758709 +Mdwgahd|Pdhdadj|IL|3092956989 +Cclgahd|Jbhdadj|MI|8108356721 +Edvgahd|Uchdadj|MI|8102859809 +Mdygahd|Pfhdadj|IL|3091316219 +Ccrgahd|Kbhdadj|MI|8102456721 +Edzgahd|Vghdadj|MI|8102326329 +Mdzgahd|Pghdadj|IL|3092326329 +Cdsgahd|Kdhdadj|MI|8102556721 +Fadgahd|Vyhdadj|MI|8100300709 +Nadgahd|Pyhdadj|IL|3090300709 +Cdxgahd|Lehdadj|MI|8102306721 +Fbigahd|Wshdadj|MI|8105355759 +Nbfgahd|Pwhdadj|IL|3092322729 +Dbhgahd|Mthdadj|MI|8104346722 +Fcjgahd|Wphdadj|MI|8106376769 +Nbggahd|Puhdadj|IL|3093333739 +Dbigahd|Nshdadj|MI|8105356722 +Fclgahd|Wbhdadj|MI|8108132319 +Nbhgahd|Pthdadj|IL|3094344749 +Dclgahd|Nbhdadj|MI|8108136732 +Fcngahd|Wghdadj|MI|8102051080 +Ncmgahd|Qxhdadj|IL|3099359799 +Dcqgahd|Omhdadj|MI|8102354732 +Fcpgahd|Wkhdadj|MI|8102253282 +Ncogahd|Qahdadj|IL|3092152181 +Ddvgahd|Ochdadj|MI|8102859732 +Fdtgahd|Xnhdadj|MI|8102657686 +Ncpgahd|Qkhdadj|IL|3092253282 +Ddwgahd|Odhdadj|MI|8102956045 +Fdygahd|Yfhdadj|MI|8101316219 +Ndwgahd|Qdhdadj|IL|3092956989 +Ebigahd|Sshdadj|MI|8105355745 +Gbigahd|Zshdadj|MI|8105355759 +Oadgahd|Ryhdadj|IL|3090356776 +Ecjgahd|Sphdadj|MI|8106376745 +Gckgahd|Zihdadj|MI|8107387779 +Obegahd|Rxhdadj|IL|3091356776 +Eclgahd|Sbhdadj|MI|8108138745 +Gcmgahd|Zxhdadj|MI|8109359799 +Obfgahd|Rwhdadj|IL|3092356776 +Ecngahd|Sghdadj|MI|8102051045 +Gcogahd|Zahdadj|MI|8108102181 +Ocjgahd|Sphdadj|IL|3096356776 +Edwgahd|Udhdadj|MI|8102956909 +Gcpgahd|Zkhdadj|MI|8102253282 +Ockgahd|Sihdadj|IL|3097356776 +Edygahd|Vfhdadj|MI|8102316219 +Gdtgahd|Anhdadj|MI|8102657686 +Ocngahd|Sghdadj|IL|3092056776 +Fbfgahd|Vwhdadj|MI|8102322729 +Gdugahd|Abhdadj|MI|8102752317 +Odtgahd|Snhdadj|IL|3092656776 +Fcmgahd|Wxhdadj|MI|8109359799 +Gdwgahd|Adhdadj|MI|8102956989 +Odwgahd|Tdhdadj|IL|3092956776 +Fcqgahd|Xmhdadj|MI|8102354383 +Gdxgahd|Aehdadj|MI|8100306109 +Pbhgahd|Tthdadj|IL|3094354767 +Fcrgahd|Xbhdadj|MI|8102455906 +Hadgahd|Byhdadj|MI|9060356799 +Pcogahd|Uahdadj|IL|3092156167 +Fdzgahd|Yghdadj|MI|8102326329 +Hbigahd|Bshdadj|MI|9065356799 +Pcqgahd|Umhdadj|IL|3092356367 +Gadgahd|Yyhdadj|MI|8100300709 +Hcjgahd|Bphdadj|MI|9066356799 +Pcrgahd|Ubhdadj|IL|3092457737 +Gbegahd|Yxhdadj|MI|8101311719 +Hckgahd|Bihdadj|MI|9067356799 +Pdtgahd|Unhdadj|IL|3092656600 +Gbggahd|Yuhdadj|MI|8103333739 +Hclgahd|Bbhdadj|MI|9068356799 +Pdvgahd|Uchdadj|IL|3092856800 +Gcjgahd|Zphdadj|MI|8106376769 +Hcngahd|Bghdadj|MI|9062056799 +Rbegahd|Vxhdadj|IL|3091356700 +Gcngahd|Zghdadj|MI|8102051080 +Hcpgahd|Ckhdadj|MI|9062256767 +Rbfgahd|Vwhdadj|IL|3092356700 +Gdsgahd|Adhdadj|MI|8102556585 +Hdsgahd|Cdhdadj|MI|9062556767 +Rckgahd|Vihdadj|IL|3097356700 +Gdzgahd|Aghdadj|MI|8102326329 +Hdtgahd|Cnhdadj|MI|9062656767 +Rclgahd|Wbhdadj|IL|3098356700 +Hbggahd|Buhdadj|MI|9063356799 +Hdzgahd|Dghdadj|MI|9062390667 +Rcmgahd|Wxhdadj|IL|3099356700 +Hbhgahd|Bthdadj|MI|9064356799 +Ibegahd|Dxhdadj|MI|9061351778 +Rcogahd|Wahdadj|IL|3092156700 +Hcmgahd|Bxhdadj|MI|9069356799 +Ibfgahd|Dwhdadj|MI|9062352778 +Rcqgahd|Wmhdadj|IL|3092356706 +Hcogahd|Bahdadj|MI|9068106799 +Ibigahd|Dshdadj|MI|9065355778 +Rdsgahd|Wdhdadj|IL|3092556706 +Hcqgahd|Cmhdadj|MI|9062356767 +Icngahd|Eghdadj|MI|9062055178 +Rdtgahd|Wnhdadj|IL|3092656706 +Hcrgahd|Cbhdadj|MI|9062456767 +Icpgahd|Ekhdadj|MI|9062256278 +Rdwgahd|Wdhdadj|IL|3092956706 +Hdvgahd|Cchdadj|MI|9062856767 +Icqgahd|Emhdadj|MI|9062356356 +Scjgahd|Xphdadj|IL|3096376740 +Hdwgahd|Cdhdadj|MI|9062956767 +Idugahd|Fbhdadj|MI|9062756756 +Scmgahd|Xxhdadj|IL|3099350740 +Hdxgahd|Cehdadj|MI|9062306767 +Jadgahd|Gyhdadj|MI|9060356701 +Scrgahd|Ybhdadj|IL|3092455740 +Hdygahd|Dfhdadj|MI|9062316767 +Jbegahd|Gxhdadj|MI|9061356701 +Sdtgahd|Ynhdadj|IL|3092657740 +Ibggahd|Duhdadj|MI|9063353778 +Jbfgahd|Gwhdadj|MI|9062356701 +Sdugahd|Ybhdadj|IL|3092758740 +Ickgahd|Eihdadj|MI|9067357778 +Jbigahd|Gshdadj|MI|9065356701 +Sdygahd|Yfhdadj|IL|3092316233 +Icogahd|Eahdadj|MI|9068106178 +Jckgahd|Hihdadj|MI|9067356701 +Uadgahd|Zyhdadj|IL|3090300733 +Icrgahd|Fbhdadj|MI|9062456456 +Jclgahd|Hbhdadj|MI|9068356701 +Ubegahd|Zxhdadj|IL|3091311733 +Idsgahd|Fdhdadj|MI|9062556556 +Jcrgahd|Hbhdadj|MI|9062456755 +Ubigahd|Zshdadj|IL|3095355733 +Idtgahd|Fnhdadj|MI|9062656656 +Jdsgahd|Hdhdadj|MI|9062556755 +Uclgahd|Zbhdadj|IL|3093098733 +Idvgahd|Fchdadj|MI|9062856856 +Jdzgahd|Ighdadj|MI|9062390655 +Ucmgahd|Axhdadj|IL|3099359733 +Idwgahd|Fdhdadj|MI|9062956956 +Kadgahd|Iyhdadj|MI|9060306704 +Ucqgahd|Amhdadj|IL|3092354333 +Idxgahd|Fehdadj|MI|9062306709 +Kbegahd|Ixhdadj|MI|9061316704 +Udtgahd|Anhdadj|IL|3092657633 +Jcogahd|Hahdadj|MI|9068106755 +Kbfgahd|Jwhdadj|MI|9062390604 +Udugahd|Abhdadj|IL|3092758733 +Jcpgahd|Hkhdadj|MI|9062256755 +Kbigahd|Jshdadj|MI|9065356704 +Udxgahd|Aehdadj|IL|3092306109 +Jcqgahd|Hmhdadj|MI|9062356755 +Kcjgahd|Jphdadj|MI|9066376704 +Vbggahd|Buhdadj|IL|3093333739 +Jdugahd|Ibhdadj|MI|9062756755 +Kclgahd|Jbhdadj|MI|9068136704 +Vcngahd|Cghdadj|IL|3092031080 +Jdxgahd|Iehdadj|MI|9062306755 +Kcqgahd|Kmhdadj|MI|9062354766 +Vcogahd|Cahdadj|IL|3092152181 +Jdygahd|Ifhdadj|MI|9062316755 +Kcrgahd|Kbhdadj|MI|9062455766 +Vcrgahd|Cbhdadj|IL|3092455484 +Kbggahd|Juhdadj|MI|9063336704 +Kdsgahd|Kdhdadj|MI|9062556766 +Vdsgahd|Cdhdadj|IL|3092556585 +Kbhgahd|Jthdadj|MI|9064346704 +Kdugahd|Kbhdadj|MI|9062758766 +Vdtgahd|Cnhdadj|IL|3092657686 +Kcmgahd|Jxhdadj|MI|9069350704 +Kdzgahd|Lghdadj|MI|9062326366 +Wbegahd|Dxhdadj|IL|3091311719 +Kcpgahd|Kkhdadj|MI|9062253704 +Lbegahd|Lxhdadj|MI|9061311766 +Wbigahd|Dshdadj|IL|3095355759 +Kdtgahd|Knhdadj|MI|9062657766 +Ldsgahd|Mdhdadj|MI|9062556529 +Wckgahd|Dihdadj|IL|3097387779 +Kdxgahd|Lehdadj|MI|9062306166 +Ldvgahd|Nchdadj|MI|9062859829 +Wclgahd|Dbhdadj|IL|3093098789 +Kdygahd|Lfhdadj|MI|9062316266 +Ldwgahd|Ndhdadj|MI|9062956929 +Wcngahd|Dghdadj|IL|3092031080 +Lbfgahd|Lwhdadj|MI|9062322766 +Ldygahd|Nfhdadj|MI|9062316219 +Wcrgahd|Ebhdadj|IL|3092455484 +Lbigahd|Lshdadj|MI|9065355729 +Mbfgahd|Nwhdadj|MI|9062322729 +Wdsgahd|Edhdadj|IL|3092556585 +Lckgahd|Mihdadj|MI|9067387729 +Mclgahd|Obhdadj|MI|9068132319 +Wdtgahd|Enhdadj|IL|3092657686 +Lcmgahd|Mxhdadj|MI|9069359729 +Mcmgahd|Oxhdadj|MI|9069359799 +Wdwgahd|Edhdadj|IL|3092956989 +Lcqgahd|Mmhdadj|MI|9062354329 +Mcqgahd|Omhdadj|MI|9062354383 +Wdzgahd|Eghdadj|IL|3092326329 +Ldxgahd|Nehdadj|MI|9062306109 +Mcrgahd|Obhdadj|MI|9062455906 +Xadgahd|Eyhdadj|IL|3090356790 +Ldzgahd|Nghdadj|MI|9062326329 +Mdxgahd|Pehdadj|MI|9060306109 +Xclgahd|Fbhdadj|IL|3098356790 +Mbegahd|Nxhdadj|MI|9061311719 +Ncjgahd|Pphdadj|MI|9066376769 +Xcogahd|Fahdadj|IL|3092156790 +Mbigahd|Nshdadj|MI|9065355759 +Nckgahd|Pihdadj|MI|9067387779 +Xcqgahd|Fmhdadj|IL|3092356779 +Mckgahd|Nihdadj|MI|9067387779 +Ncrgahd|Qbhdadj|MI|9062455906 +Xcrgahd|Fbhdadj|IL|3092456779 +Mcngahd|Oghdadj|MI|9062051080 +Ndtgahd|Qnhdadj|MI|9062657686 +Xdtgahd|Fnhdadj|IL|3092656779 +Mcogahd|Oahdadj|MI|9068102181 +Ndugahd|Qbhdadj|MI|9062752317 +Xdzgahd|Fghdadj|IL|3092326779 +Mdtgahd|Onhdadj|MI|9062657686 +Ndvgahd|Qchdadj|MI|9062859888 +Ybggahd|Guhdadj|IL|3093353779 +Mdugahd|Obhdadj|MI|9062752317 +Ndygahd|Rfhdadj|MI|9061316219 +Ycmgahd|Gxhdadj|IL|3099359744 +Mdvgahd|Ochdadj|MI|9062859888 +Ndzgahd|Rghdadj|MI|9062326329 +Ycngahd|Gghdadj|IL|3092056044 +Nbegahd|Pxhdadj|MI|9061311719 +Obggahd|Ruhdadj|MI|9893356776 +Ycrgahd|Gbhdadj|IL|3092456444 +Nbigahd|Pshdadj|MI|9065355759 +Obigahd|Rshdadj|MI|9895356776 +Ydugahd|Hbhdadj|IL|3092756744 +Nclgahd|Qbhdadj|MI|9068132319 +Oclgahd|Sbhdadj|MI|9898356776 +Zbggahd|Huhdadj|IL|3093356766 +Ncngahd|Qghdadj|MI|9062051080 +Ocmgahd|Sxhdadj|MI|9899356776 +Zbigahd|Ishdadj|IL|3095356766 +Ncqgahd|Qmhdadj|MI|9062354383 +Ocogahd|Sahdadj|MI|9898106776 +Zckgahd|Iihdadj|IL|3097356766 +Ndsgahd|Qdhdadj|MI|9062556585 +Ocqgahd|Smhdadj|MI|9892356776 +Zclgahd|Ibhdadj|IL|3098356766 +Ndxgahd|Rehdadj|MI|9060306109 +Odugahd|Tbhdadj|MI|9892756776 +Zcngahd|Ighdadj|IL|3092056766 +Obhgahd|Rthdadj|MI|9894356776 +Padgahd|Tyhdadj|MI|9890350767 +Zcqgahd|Imhdadj|IL|3092356766 +Ocpgahd|Skhdadj|MI|9892256776 +Pbfgahd|Twhdadj|MI|9892352767 +Zcrgahd|Ibhdadj|IL|3092456766 +Ocrgahd|Sbhdadj|MI|9892456776 +Pbggahd|Tuhdadj|MI|9893353767 +Zdsgahd|Idhdadj|IL|3092556766 +Odsgahd|Sdhdadj|MI|9892556776 +Pcjgahd|Uphdadj|MI|9896356767 +Zdtgahd|Inhdadj|IL|3092656766 +Odvgahd|Tchdadj|MI|9892856776 +Pckgahd|Uihdadj|MI|9891757767 +Zdugahd|Ibhdadj|IL|3092756766 +Odxgahd|Tehdadj|MI|9892306767 +Pcngahd|Ughdadj|MI|9892056067 +Zdxgahd|Jehdadj|IL|3092306751 +Odygahd|Tfhdadj|MI|9892316767 +Pdugahd|Ubhdadj|MI|9892756700 +Zdzgahd|Jghdadj|IL|3092326751 +Odzgahd|Tghdadj|MI|9892390667 +Pdxgahd|Vehdadj|MI|9892306709 +Keggahd|Juhdadj|IL|3093336751 +Pbegahd|Txhdadj|MI|9891351767 +Pdygahd|Vfhdadj|MI|9892316719 +Kejgahd|Jphdadj|IL|3096376751 +Pbigahd|Tshdadj|MI|9895355767 +Rbggahd|Vuhdadj|MI|9893356700 +Kekgahd|Jihdadj|IL|3097386751 +Pclgahd|Ubhdadj|MI|9898358767 +Rbigahd|Vshdadj|MI|9895356700 +Keogahd|Kahdadj|IL|3092152751 +Pcmgahd|Uxhdadj|MI|9899359767 +Rcjgahd|Vphdadj|MI|9896356700 +Kergahd|Kbhdadj|IL|3092455762 +Pcpgahd|Ukhdadj|MI|9892256906 +Sbfgahd|Xwhdadj|MI|9892390606 +Keugahd|Kbhdadj|IL|3092758762 +Pdsgahd|Udhdadj|MI|9892559890 +Sbggahd|Xuhdadj|MI|9893336706 +Kevgahd|Kchdadj|IL|3092859762 +Pdwgahd|Udhdadj|MI|9892956900 +Sbigahd|Xshdadj|MI|9895356740 +Keygahd|Kfhdadj|IL|3092316262 +Pdzgahd|Vghdadj|MI|9892390629 +Scngahd|Xghdadj|MI|9892051740 +Lifgahd|Lwhdadj|IL|3092322762 +Radgahd|Vyhdadj|MI|9890356700 +Scpgahd|Ykhdadj|MI|9892253740 +Lihgahd|Lthdadj|IL|3094344762 +Rbhgahd|Vthdadj|MI|9894356700 +Scqgahd|Ymhdadj|MI|9892354740 +Limgahd|Lxhdadj|IL|3099359762 +Rcngahd|Wghdadj|MI|9892056700 +Sdzgahd|Yghdadj|MI|9892326333 +Lingahd|Lghdadj|IL|3092031088 +Rcpgahd|Wkhdadj|MI|9892256706 +Ubggahd|Zuhdadj|MI|9893333733 +Liogahd|Lahdadj|IL|3092152188 +Rcrgahd|Wbhdadj|MI|9892456706 +Ubhgahd|Zthdadj|MI|9894344733 +Lisgahd|Mdhdadj|IL|3092556588 +Rdugahd|Wbhdadj|MI|9892756706 +Uckgahd|Zihdadj|MI|9897085173 +Livgahd|Mchdadj|IL|3092859888 +Rdvgahd|Wchdadj|MI|9892856706 +Ucngahd|Aghdadj|MI|9892051033 +Liwgahd|Mdhdadj|IL|3092956988 +Rdxgahd|Wehdadj|MI|9892306706 +Ucogahd|Aahdadj|MI|9898102133 +Lixgahd|Mehdadj|IL|3092306109 +Rdygahd|Wfhdadj|MI|9892316706 +Ucrgahd|Abhdadj|MI|9892455433 +Mofgahd|Mwhdadj|IL|3092322729 +Rdzgahd|Wghdadj|MI|9892390606 +Udsgahd|Adhdadj|MI|9892556533 +Moigahd|Mshdadj|IL|3095355759 +Sadgahd|Xyhdadj|MI|9890306706 +Udwgahd|Adhdadj|MI|9892956933 +Mojgahd|Nphdadj|IL|3096376769 +Sbegahd|Xxhdadj|MI|9891316706 +Udzgahd|Bghdadj|MI|9892326329 +Mokgahd|Nihdadj|IL|3097387779 +Sbhgahd|Xthdadj|MI|9894346706 +Vbfgahd|Bwhdadj|MI|9892322729 +Molgahd|Nbhdadj|IL|3093098789 +Sckgahd|Xihdadj|MI|9891786740 +Vcjgahd|Bphdadj|MI|9896376769 +Moogahd|Nahdadj|IL|3092152181 +Sclgahd|Xbhdadj|MI|9899896740 +Vcmgahd|Cxhdadj|MI|9899359799 +Morgahd|Nbhdadj|IL|3092455484 +Scogahd|Yahdadj|MI|9898102740 +Vcpgahd|Ckhdadj|MI|9892253282 +Mougahd|Nbhdadj|IL|3092758787 +Sdsgahd|Ydhdadj|MI|9892556740 +Vdxgahd|Cehdadj|MI|9890306109 +Moxgahd|Nehdadj|IL|3090306109 +Sdvgahd|Ychdadj|MI|9892859740 +Vdygahd|Cfhdadj|MI|9891316219 +Moygahd|Ofhdadj|IL|3091316219 +Sdwgahd|Ydhdadj|MI|9892956040 +Vdzgahd|Cghdadj|MI|9892326329 +Nuegahd|Oxhdadj|IL|3091311719 +Sdxgahd|Yehdadj|MI|9892306140 +Wadgahd|Dyhdadj|MI|9890300709 +Nuigahd|Oshdadj|IL|3095355759 +Ubfgahd|Zwhdadj|MI|9892322733 +Wbggahd|Duhdadj|MI|9893333739 +Nupgahd|Pkhdadj|IL|3092253282 +Ucjgahd|Zphdadj|MI|9896376733 +Wcjgahd|Dphdadj|MI|9896376769 +Nusgahd|Pdhdadj|IL|3092556585 +Ucpgahd|Akhdadj|MI|9892253233 +Wcmgahd|Dxhdadj|MI|9899359799 +Nuvgahd|Pchdadj|IL|3092859888 +Udvgahd|Achdadj|MI|9892859833 +Wdvgahd|Echdadj|MI|9892859888 +Nuwgahd|Pdhdadj|IL|3092956989 +Udygahd|Bfhdadj|MI|9892316219 +Wdygahd|Efhdadj|MI|9891316219 +Abegahd|Axhdadj|MI|8101356710 +Vadgahd|Byhdadj|MI|9890300709 +Xbegahd|Exhdadj|MI|9061356790 +Abfgahd|Awhdadj|MI|8102356710 +Vbegahd|Bxhdadj|MI|9891311719 +Xbfgahd|Ewhdadj|MI|9062356790 +Abggahd|Auhdadj|MI|8103356710 +Vbhgahd|Bthdadj|MI|9894344749 +Xbggahd|Euhdadj|MI|9063356790 +Abigahd|Ashdadj|MI|8105356710 +Vbigahd|Bshdadj|MI|9895355759 +Xbhgahd|Ethdadj|MI|9064356790 +Acjgahd|Bphdadj|MI|8106356710 +Vckgahd|Bihdadj|MI|9897087779 +Xcjgahd|Ephdadj|MI|9066356790 +Acngahd|Bghdadj|MI|8102056701 +Vclgahd|Bbhdadj|MI|9899892319 +Xcngahd|Fghdadj|MI|9062056790 +Acogahd|Bahdadj|MI|8108106701 +Vcqgahd|Cmhdadj|MI|9892354383 +Xdsgahd|Fdhdadj|MI|9062556779 +Acqgahd|Cmhdadj|MI|8102356701 +Vdugahd|Cbhdadj|MI|9892752317 +Xdugahd|Fbhdadj|MI|9062756779 +Acrgahd|Cbhdadj|MI|8102456701 +Vdvgahd|Cchdadj|MI|9892859888 +Xdygahd|Ffhdadj|MI|9062316779 +Adsgahd|Cdhdadj|MI|8102556701 +Vdwgahd|Cdhdadj|MI|9892956989 +Yadgahd|Gyhdadj|MI|9060350779 +Adugahd|Cbhdadj|MI|8102756701 +Wbfgahd|Dwhdadj|MI|9892322729 +Ybegahd|Gxhdadj|MI|9061351779 +Adwgahd|Ddhdadj|MI|8102956711 +Wbhgahd|Dthdadj|MI|9894344749 +Ybfgahd|Gwhdadj|MI|9062352779 +Adzgahd|Dghdadj|MI|8102390611 +Wcogahd|Dahdadj|MI|9898102181 +Ybhgahd|Gthdadj|MI|9064354779 +Bbggahd|Euhdadj|MI|8103353711 +Wcpgahd|Dkhdadj|MI|9892253282 +Ycjgahd|Gphdadj|MI|9066356779 +Bbhgahd|Ethdadj|MI|8104354711 +Wcqgahd|Emhdadj|MI|9892354383 +Yclgahd|Gbhdadj|MI|9068358744 +Bbigahd|Eshdadj|MI|8105355711 +Wdugahd|Ebhdadj|MI|9892752317 +Ycpgahd|Gkhdadj|MI|9062256244 +Bcngahd|Fghdadj|MI|8102056000 +Wdxgahd|Eehdadj|MI|9890306109 +Ydtgahd|Hnhdadj|MI|9062656644 +Bdtgahd|Gnhdadj|MI|8102656600 +Xbigahd|Eshdadj|MI|9065356790 +Ydwgahd|Hdhdadj|MI|9062956944 +Bdxgahd|Hehdadj|MI|8102306709 +Xckgahd|Eihdadj|MI|9067356790 +Ydxgahd|Hehdadj|MI|9062306709 +Bdygahd|Hfhdadj|MI|8102316719 +Xcmgahd|Fxhdadj|MI|9069356790 +Ydygahd|Hfhdadj|MI|9062316719 +Cbfgahd|Iwhdadj|MI|8102356810 +Xcpgahd|Fkhdadj|MI|9062256779 +Ydzgahd|Hghdadj|MI|9062390629 +Cbggahd|Iuhdadj|MI|8103356810 +Xdvgahd|Fchdadj|MI|9062856779 +Zadgahd|Hyhdadj|MI|9060356744 +Ccngahd|Jghdadj|MI|8102056721 +Xdwgahd|Fdhdadj|MI|9062956779 +Zbfgahd|Hwhdadj|MI|9062356744 +Cdtgahd|Knhdadj|MI|8102656721 +Xdxgahd|Fehdadj|MI|9062306779 +Zbhgahd|Hthdadj|MI|9064356766 +Cdugahd|Kbhdadj|MI|8102756721 +Ybigahd|Gshdadj|MI|9065355779 +Zcjgahd|Iphdadj|MI|9066356766 +Cdvgahd|Lchdadj|MI|8102856721 +Yckgahd|Gihdadj|MI|9067357779 +Zcmgahd|Ixhdadj|MI|9069356766 +Cdygahd|Lfhdadj|MI|8102316722 +Ycogahd|Gahdadj|MI|9068106144 +Zdvgahd|Jchdadj|MI|9062856751 +Dadgahd|Myhdadj|MI|8100306722 +Ycqgahd|Gmhdadj|MI|9062356344 +Kedgahd|Jyhdadj|MI|9060306751 +Dbegahd|Mxhdadj|MI|8101316722 +Ydsgahd|Hdhdadj|MI|9062556544 +Keegahd|Jxhdadj|MI|9061316751 +Dbfgahd|Mwhdadj|MI|8102390622 +Ydvgahd|Hchdadj|MI|9062856844 +Kehgahd|Jthdadj|MI|9064346751 +Dcjgahd|Nphdadj|MI|8106376722 +Zbegahd|Hxhdadj|MI|9061356744 +Kelgahd|Jbhdadj|MI|9068136751 +Dcmgahd|Nxhdadj|MI|8109350732 +Zcogahd|Iahdadj|MI|9068106766 +Keqgahd|Kmhdadj|MI|9062354762 +Dcngahd|Nghdadj|MI|8102051732 +Zcpgahd|Ikhdadj|MI|9062256766 +Ketgahd|Knhdadj|MI|9062657762 +Dcpgahd|Nkhdadj|MI|8102253732 +Zdwgahd|Jdhdadj|MI|9062956751 +Kezgahd|Kghdadj|MI|9062326362 +Ddxgahd|Pehdadj|MI|8102306145 +Zdygahd|Jfhdadj|MI|9062316751 +Liggahd|Luhdadj|MI|9063333762 +Ddygahd|Pfhdadj|MI|8102316245 +Kefgahd|Jwhdadj|MI|9062390651 +Likgahd|Lihdadj|MI|9067387762 +Ddzgahd|Pghdadj|MI|8102326345 +Keigahd|Jshdadj|MI|9065356751 +Lilgahd|Lbhdadj|MI|9068138762 +Ebggahd|Ruhdadj|MI|8103333745 +Kemgahd|Kxhdadj|MI|9069350751 +Lipgahd|Lkhdadj|MI|9062253288 +Ecpgahd|Tkhdadj|MI|8102253245 +Kengahd|Kghdadj|MI|9062051751 +Liygahd|Mfhdadj|MI|9062316219 +Ecqgahd|Tmhdadj|MI|8102354345 +Kepgahd|Kkhdadj|MI|9062253751 +Moegahd|Mxhdadj|MI|9061311719 +Edsgahd|Tdhdadj|MI|8102558139 +Kesgahd|Kdhdadj|MI|9062556762 +Moggahd|Muhdadj|MI|9063333739 +Edtgahd|Unhdadj|MI|8102657609 +Kewgahd|Kdhdadj|MI|9062956062 +Mohgahd|Mthdadj|MI|9064344749 +Edxgahd|Uehdadj|MI|8102306109 +Kexgahd|Kehdadj|MI|9062306162 +Momgahd|Nxhdadj|MI|9069359799 +Fbegahd|Vxhdadj|MI|8101311719 +Lidgahd|Lyhdadj|MI|9060300762 +Moqgahd|Nmhdadj|MI|9062354383 +Fbggahd|Vuhdadj|MI|8103333739 +Liegahd|Lxhdadj|MI|9061311762 +Motgahd|Nnhdadj|MI|9062657686 +Fbhgahd|Vthdadj|MI|8104344749 +Liigahd|Lshdadj|MI|9065355762 +Movgahd|Nchdadj|MI|9062859888 +Fckgahd|Wihdadj|MI|8107387779 +Lijgahd|Lphdadj|MI|9066376762 +Mozgahd|Oghdadj|MI|9062326329 +Fcogahd|Wahdadj|MI|8108102181 +Liqgahd|Lmhdadj|MI|9062354388 +Nufgahd|Owhdadj|MI|9062322729 +Fdsgahd|Xdhdadj|MI|8102556585 +Lirgahd|Mbhdadj|MI|9062455488 +Nuggahd|Ouhdadj|MI|9063333739 +Fdugahd|Xbhdadj|MI|8102752317 +Litgahd|Mnhdadj|MI|9062657688 +Nuhgahd|Othdadj|MI|9064344749 +Fdvgahd|Xchdadj|MI|8102859888 +Liugahd|Mbhdadj|MI|9062752318 +Nukgahd|Oihdadj|MI|9067387779 +Fdwgahd|Xdhdadj|MI|8102956989 +Lizgahd|Mghdadj|MI|9062326329 +Nulgahd|Pbhdadj|MI|9068132319 +Fdxgahd|Xehdadj|MI|8100306109 +Modgahd|Myhdadj|MI|9060300709 +Nuxgahd|Qehdadj|MI|9060306109 +Gbfgahd|Ywhdadj|MI|8102322729 +Mongahd|Nghdadj|MI|9062051080 +Nuygahd|Qfhdadj|MI|9061316219 +Gbhgahd|Ythdadj|MI|8104344749 +Mopgahd|Nkhdadj|MI|9062253282 +Badgahd|Eyhdadj|MI|5860350711 +Gclgahd|Zbhdadj|MI|8108132319 +Mosgahd|Ndhdadj|MI|9062556585 +Bbfgahd|Ewhdadj|MI|5862352711 +Gcqgahd|Zmhdadj|MI|8102354383 +Mowgahd|Ndhdadj|MI|9062956989 +Bcjgahd|Fphdadj|MI|5863356711 +Gcrgahd|Zbhdadj|MI|8102455906 +Nudgahd|Oyhdadj|MI|9060300709 +Bclgahd|Fbhdadj|MI|5868358700 +Gdvgahd|Achdadj|MI|8102859888 +Nujgahd|Ophdadj|MI|9066376769 +Bcogahd|Fahdadj|MI|5868106100 +Gdygahd|Afhdadj|MI|8101316219 +Numgahd|Pxhdadj|MI|9069359799 +Bcqgahd|Gmhdadj|MI|5862356300 +Hbegahd|Bxhdadj|MI|9061356799 +Nungahd|Pghdadj|MI|9062051080 +Bcrgahd|Gbhdadj|MI|5862456400 +Hbfgahd|Bwhdadj|MI|9062356799 +Nuogahd|Pahdadj|MI|9068102181 +Bdvgahd|Gchdadj|MI|5862856800 +Hdugahd|Cbhdadj|MI|9062756767 +Nuqgahd|Pmhdadj|MI|9062354383 +Cadgahd|Iyhdadj|MI|5860356810 +Iadgahd|Dyhdadj|MI|9060350767 +Nurgahd|Pbhdadj|MI|9062455906 +Cbegahd|Ixhdadj|MI|5861356810 +Ibhgahd|Dthdadj|MI|9064354778 +Nutgahd|Pnhdadj|MI|9062657686 +Cbhgahd|Ithdadj|MI|5864356810 +Icjgahd|Dphdadj|MI|9066356778 +Nuugahd|Pbhdadj|MI|9062752317 +Ccmgahd|Jxhdadj|MI|5869356721 +Iclgahd|Ebhdadj|MI|9068358778 +Nuzgahd|Qghdadj|MI|9062326329 +Ccogahd|Jahdadj|MI|5868106721 +Icmgahd|Exhdadj|MI|9069359778 +Aadgahd|Ayhdadj|MI|5860356710 +Ccpgahd|Kkhdadj|MI|5862256721 +Idygahd|Gfhdadj|MI|9062316719 +Abhgahd|Athdadj|MI|5864356710 +Ccqgahd|Kmhdadj|MI|5862356721 +Idzgahd|Gghdadj|MI|9062390629 +Ackgahd|Bihdadj|MI|5867356710 +Cdwgahd|Ldhdadj|MI|5862956721 +Jbggahd|Guhdadj|MI|9063356701 +Aclgahd|Bbhdadj|MI|5868356710 +Cdzgahd|Lghdadj|MI|5862390622 +Jbhgahd|Gthdadj|MI|9064356701 +Acmgahd|Bxhdadj|MI|5869356701 +Dbggahd|Muhdadj|MI|5863336722 +Jcjgahd|Gphdadj|MI|9066356701 +Acpgahd|Bkhdadj|MI|5862256701 +Dckgahd|Nihdadj|MI|5867386722 +Jcmgahd|Hxhdadj|MI|9069356701 +Adtgahd|Cnhdadj|MI|5862656701 +Dcogahd|Nahdadj|MI|5868102732 +Jcngahd|Hghdadj|MI|9062056755 +Advgahd|Dchdadj|MI|5862856701 +Dcrgahd|Obhdadj|MI|5862455732 +Jdtgahd|Inhdadj|MI|9062656755 +Adxgahd|Dehdadj|MI|5862306711 +Ddsgahd|Odhdadj|MI|5862556732 +Jdvgahd|Ichdadj|MI|9062856755 +Adygahd|Dfhdadj|MI|5862316711 +Ddtgahd|Onhdadj|MI|5862655172 +Jdwgahd|Idhdadj|MI|9062956755 +Bbegahd|Axhdadj|MI|5861351711 +Ddugahd|Obhdadj|MI|5862758732 +Kckgahd|Jihdadj|MI|9067386704 +Bckgahd|Fihdadj|MI|5867357700 +Eadgahd|Ryhdadj|MI|5860300745 +Kcngahd|Jghdadj|MI|9062051704 +Bcmgahd|Fxhdadj|MI|5869359700 +Ebegahd|Rxhdadj|MI|5861311745 +Kcogahd|Kahdadj|MI|9068102704 +Bcpgahd|Gkhdadj|MI|5862256200 +Ebfgahd|Rwhdadj|MI|5862322745 +Kdvgahd|Kchdadj|MI|9062859766 +Bdsgahd|Gdhdadj|MI|5862558130 +Ebhgahd|Rthdadj|MI|5864344745 +Kdwgahd|Ldhdadj|MI|9062956066 +Bdugahd|Gbhdadj|MI|5862756700 +Eckgahd|Sihdadj|MI|5867387745 +Ladgahd|Lyhdadj|MI|9060300766 +Bdwgahd|Hdhdadj|MI|5862956900 +Ecmgahd|Sxhdadj|MI|5869359745 +Lbggahd|Luhdadj|MI|9063333729 +Bdzgahd|Hghdadj|MI|5862390629 +Ecogahd|Tahdadj|MI|5868102145 +Lbhgahd|Lthdadj|MI|9064344729 +Cbigahd|Ishdadj|MI|5865356810 +Ecrgahd|Tbhdadj|MI|5862455445 +Lcjgahd|Lphdadj|MI|9066376729 +Ccjgahd|Jphdadj|MI|5867356810 +Edugahd|Ubhdadj|MI|5862758709 +Lclgahd|Mbhdadj|MI|9068139899 +Cckgahd|Jihdadj|MI|5867356810 +Edvgahd|Uchdadj|MI|5862859809 +Lcngahd|Mghdadj|MI|9062051029 +Cclgahd|Jbhdadj|MI|5868356721 +Edzgahd|Vghdadj|MI|5862326329 +Lcogahd|Mahdadj|MI|9068109069 +Ccrgahd|Kbhdadj|MI|5862456721 +Fadgahd|Vyhdadj|MI|5860300709 +Lcpgahd|Mkhdadj|MI|9062253229 +Cdsgahd|Kdhdadj|MI|5862556721 +Fbigahd|Wshdadj|MI|5865355759 +Lcrgahd|Mbhdadj|MI|9062455429 +Cdxgahd|Lehdadj|MI|5862306721 +Fcjgahd|Wphdadj|MI|5867376769 +Ldtgahd|Mnhdadj|MI|9062657629 +Dbhgahd|Mthdadj|MI|5864346722 +Fclgahd|Wbhdadj|MI|5868132319 +Ldugahd|Mbhdadj|MI|9062759899 +Dbigahd|Nshdadj|MI|5865356722 +Fcngahd|Wghdadj|MI|5862051080 +Madgahd|Nyhdadj|MI|9060300709 +Dclgahd|Nbhdadj|MI|5868136732 +Fcpgahd|Wkhdadj|MI|5862253282 +Mbggahd|Nuhdadj|MI|9063333739 +Dcqgahd|Omhdadj|MI|5862354732 +Fdtgahd|Xnhdadj|MI|5862657686 +Mbhgahd|Nthdadj|MI|9064344749 +Ddvgahd|Ochdadj|MI|5862859732 +Fdygahd|Yfhdadj|MI|5861316219 +Mcjgahd|Nphdadj|MI|9066376769 +Ddwgahd|Odhdadj|MI|5862956045 +Gbigahd|Zshdadj|MI|5865355759 +Mcpgahd|Okhdadj|MI|9062253282 +Ebigahd|Sshdadj|MI|5865355745 +Gckgahd|Zihdadj|MI|5867387779 +Mdsgahd|Odhdadj|MI|9062556585 +Ecjgahd|Sphdadj|MI|5867376745 +Gcmgahd|Zxhdadj|MI|5869359799 +Mdwgahd|Pdhdadj|MI|9062956989 +Eclgahd|Sbhdadj|MI|5868138745 +Gcogahd|Zahdadj|MI|5868102181 +Mdygahd|Pfhdadj|MI|9061316219 +Ecngahd|Sghdadj|MI|5862051045 +Gcpgahd|Zkhdadj|MI|5862253282 +Mdzgahd|Pghdadj|MI|9062326329 +Edwgahd|Udhdadj|MI|5862956909 +Gdtgahd|Anhdadj|MI|5862657686 +Nadgahd|Pyhdadj|MI|9060300709 +Edygahd|Vfhdadj|MI|5862316219 +Gdugahd|Abhdadj|MI|5862752317 +Nbfgahd|Pwhdadj|MI|9062322729 +Fbfgahd|Vwhdadj|MI|5862322729 +Gdwgahd|Adhdadj|MI|5862956989 +Nbggahd|Puhdadj|MI|9063333739 +Fcmgahd|Wxhdadj|MI|5869359799 +Gdxgahd|Aehdadj|MI|5860306109 +Nbhgahd|Pthdadj|MI|9064344749 +Fcqgahd|Xmhdadj|MI|5862354383 +Hadgahd|Byhdadj|MI|5170356799 +Ncmgahd|Qxhdadj|MI|9069359799 +Fcrgahd|Xbhdadj|MI|5862455906 +Hbigahd|Bshdadj|MI|5175356799 +Ncogahd|Qahdadj|MI|9068102181 +Fdzgahd|Yghdadj|MI|5862326329 +Hcjgahd|Bphdadj|MI|5176356799 +Ncpgahd|Qkhdadj|MI|9062253282 +Gadgahd|Yyhdadj|MI|5860300709 +Hckgahd|Bihdadj|MI|5177356799 +Ndwgahd|Qdhdadj|MI|9062956989 +Gbegahd|Yxhdadj|MI|5861311719 +Hclgahd|Bbhdadj|MI|5178356799 +Oadgahd|Ryhdadj|MI|9890356776 +Gbggahd|Yuhdadj|MI|5863333739 +Hcngahd|Bghdadj|MI|5172056799 +Obegahd|Rxhdadj|MI|9891356776 +Gcjgahd|Zphdadj|MI|5867376769 +Hcpgahd|Ckhdadj|MI|5172256767 +Obfgahd|Rwhdadj|MI|9892356776 +Gcngahd|Zghdadj|MI|5862051080 +Hdsgahd|Cdhdadj|MI|5172556767 +Ocjgahd|Sphdadj|MI|9896356776 +Gdsgahd|Adhdadj|MI|5862556585 +Hdtgahd|Cnhdadj|MI|5172656767 +Ockgahd|Sihdadj|MI|9891756776 +Gdzgahd|Aghdadj|MI|5862326329 +Hdzgahd|Dghdadj|MI|5172390667 +Ocngahd|Sghdadj|MI|9892056776 +Hbggahd|Buhdadj|MI|5173356799 +Ibegahd|Dxhdadj|MI|5171351778 +Odtgahd|Snhdadj|MI|9892656776 +Hbhgahd|Bthdadj|MI|5174356799 +Ibfgahd|Dwhdadj|MI|5172352778 +Odwgahd|Tdhdadj|MI|9892956776 +Hcmgahd|Bxhdadj|MI|5179356799 +Ibigahd|Dshdadj|MI|5175355778 +Pbhgahd|Tthdadj|MI|9894354767 +Hcogahd|Bahdadj|MI|5178106799 +Icngahd|Eghdadj|MI|5172055178 +Pcogahd|Uahdadj|MI|9898106167 +Hcqgahd|Cmhdadj|MI|5172356767 +Icpgahd|Ekhdadj|MI|5172256278 +Pcqgahd|Umhdadj|MI|9892356367 +Hcrgahd|Cbhdadj|MI|5172456767 +Icqgahd|Emhdadj|MI|5172356356 +Pcrgahd|Ubhdadj|MI|9892455177 +Hdvgahd|Cchdadj|MI|5172856767 +Idugahd|Fbhdadj|MI|5172756756 +Pdtgahd|Unhdadj|MI|9892656600 +Hdwgahd|Cdhdadj|MI|5172956767 +Jadgahd|Gyhdadj|MI|5170356701 +Pdvgahd|Uchdadj|MI|9892856800 +Hdxgahd|Cehdadj|MI|5172306767 +Jbegahd|Gxhdadj|MI|5171356701 +Rbegahd|Vxhdadj|MI|9891356700 +Hdygahd|Dfhdadj|MI|5172316767 +Jbfgahd|Gwhdadj|MI|5172356701 +Rbfgahd|Vwhdadj|MI|9892356700 +Ibggahd|Duhdadj|MI|5173353778 +Jbigahd|Gshdadj|MI|5175356701 +Rckgahd|Vihdadj|MI|9891756700 +Ickgahd|Eihdadj|MI|5177357778 +Jckgahd|Hihdadj|MI|5177356701 +Rclgahd|Wbhdadj|MI|9898356700 +Icogahd|Eahdadj|MI|5178106178 +Jclgahd|Hbhdadj|MI|5178356701 +Rcmgahd|Wxhdadj|MI|9899356700 +Icrgahd|Fbhdadj|MI|5172456456 +Jcrgahd|Hbhdadj|MI|5172456755 +Rcogahd|Wahdadj|MI|9898106700 +Idsgahd|Fdhdadj|MI|5172556556 +Jdsgahd|Hdhdadj|MI|5172556755 +Rcqgahd|Wmhdadj|MI|9892356706 +Idtgahd|Fnhdadj|MI|5172656656 +Jdzgahd|Ighdadj|MI|5172390655 +Rdsgahd|Wdhdadj|MI|9892556706 +Idvgahd|Fchdadj|MI|5172856856 +Kadgahd|Iyhdadj|MI|5170306704 +Rdtgahd|Wnhdadj|MI|9892656706 +Idwgahd|Fdhdadj|MI|5172956956 +Kbegahd|Ixhdadj|MI|5171316704 +Rdwgahd|Wdhdadj|MI|9892956706 +Idxgahd|Fehdadj|MI|5172306709 +Kbfgahd|Jwhdadj|MI|5172390604 +Scjgahd|Xphdadj|MI|9896376740 +Jcogahd|Hahdadj|MI|5178106755 +Kbigahd|Jshdadj|MI|5175356704 +Scmgahd|Xxhdadj|MI|9899350740 +Jcpgahd|Hkhdadj|MI|5172256755 +Kcjgahd|Jphdadj|MI|5176376704 +Scrgahd|Ybhdadj|MI|9892455740 +Jcqgahd|Hmhdadj|MI|5172356755 +Kclgahd|Jbhdadj|MI|5178136704 +Sdtgahd|Ynhdadj|MI|9892657740 +Jdugahd|Ibhdadj|MI|5172756755 +Kcqgahd|Kmhdadj|MI|5172354766 +Sdugahd|Ybhdadj|MI|9892758740 +Jdxgahd|Iehdadj|MI|5172306755 +Kcrgahd|Kbhdadj|MI|5172455766 +Sdygahd|Yfhdadj|MI|9892316233 +Jdygahd|Ifhdadj|MI|5172316755 +Kdsgahd|Kdhdadj|MI|5172556766 +Uadgahd|Zyhdadj|MI|9890300733 +Kbggahd|Juhdadj|MI|5173336704 +Kdugahd|Kbhdadj|MI|5172758766 +Ubegahd|Zxhdadj|MI|9891311733 +Kbhgahd|Jthdadj|MI|5174346704 +Kdzgahd|Lghdadj|MI|5172326366 +Ubigahd|Zshdadj|MI|9895355733 +Kcmgahd|Jxhdadj|MI|5179350704 +Lbegahd|Lxhdadj|MI|5171311766 +Uclgahd|Zbhdadj|MI|9899898733 +Kcpgahd|Kkhdadj|MI|5172253704 +Ldsgahd|Mdhdadj|MI|5172556529 +Ucmgahd|Axhdadj|MI|9899359733 +Kdtgahd|Knhdadj|MI|5172657766 +Ldvgahd|Nchdadj|MI|5172859829 +Ucqgahd|Amhdadj|MI|9892354333 +Kdxgahd|Lehdadj|MI|5172306166 +Ldwgahd|Ndhdadj|MI|5172956929 +Udtgahd|Anhdadj|MI|9892657633 +Kdygahd|Lfhdadj|MI|5172316266 +Ldygahd|Nfhdadj|MI|5172316219 +Udugahd|Abhdadj|MI|9892758733 +Lbfgahd|Lwhdadj|MI|5172322766 +Mbfgahd|Nwhdadj|MI|5172322729 +Udxgahd|Aehdadj|MI|9892306109 +Lbigahd|Lshdadj|MI|5175355729 +Mclgahd|Obhdadj|MI|5178132319 +Vbggahd|Buhdadj|MI|9893333739 +Lckgahd|Mihdadj|MI|5177387729 +Mcmgahd|Oxhdadj|MI|5179359799 +Vcngahd|Cghdadj|MI|9892051080 +Lcmgahd|Mxhdadj|MI|5179359729 +Mcqgahd|Omhdadj|MI|5172354383 +Vcogahd|Cahdadj|MI|9898102181 +Lcqgahd|Mmhdadj|MI|5172354329 +Mcrgahd|Obhdadj|MI|5172455906 +Vcrgahd|Cbhdadj|MI|9892455906 +Ldxgahd|Nehdadj|MI|5172306109 +Mdxgahd|Pehdadj|MI|5170306109 +Vdsgahd|Cdhdadj|MI|9892556585 +Ldzgahd|Nghdadj|MI|5172326329 +Ncjgahd|Pphdadj|MI|5176376769 +Vdtgahd|Cnhdadj|MI|9892657686 +Mbegahd|Nxhdadj|MI|5171311719 +Nckgahd|Pihdadj|MI|5177387779 +Wbegahd|Dxhdadj|MI|9891311719 +Mbigahd|Nshdadj|MI|5175355759 +Ncrgahd|Qbhdadj|MI|5172455906 +Wbigahd|Dshdadj|MI|9895355759 +Mckgahd|Nihdadj|MI|5177387779 +Ndtgahd|Qnhdadj|MI|5172657686 +Wckgahd|Dihdadj|MI|9897087779 +Mcngahd|Oghdadj|MI|5172051780 +Ndugahd|Qbhdadj|MI|5172752317 +Wclgahd|Dbhdadj|MI|9899892319 +Mcogahd|Oahdadj|MI|5178102181 +Ndvgahd|Qchdadj|MI|5172859888 +Wcngahd|Dghdadj|MI|9892051080 +Mdtgahd|Onhdadj|MI|5172657686 +Ndygahd|Rfhdadj|MI|5171316219 +Wcrgahd|Ebhdadj|MI|9892455906 +Mdugahd|Obhdadj|MI|5172752317 +Ndzgahd|Rghdadj|MI|5172326329 +Wdsgahd|Edhdadj|MI|9892556585 +Mdvgahd|Ochdadj|MI|5172859888 +Obggahd|Ruhdadj|MI|3133356776 +Wdtgahd|Enhdadj|MI|9892657686 +Nbegahd|Pxhdadj|MI|5171311719 +Obigahd|Rshdadj|MI|3135356776 +Wdwgahd|Edhdadj|MI|9892956989 +Nbigahd|Pshdadj|MI|5175355759 +Oclgahd|Sbhdadj|MI|3138356776 +Wdzgahd|Eghdadj|MI|9892326329 +Nclgahd|Qbhdadj|MI|5178132319 +Ocmgahd|Sxhdadj|MI|3139356776 +Xadgahd|Eyhdadj|MI|9060356790 +Ncngahd|Qghdadj|MI|5172051780 +Ocogahd|Sahdadj|MI|3138106776 +Xclgahd|Fbhdadj|MI|9068356790 +Ncqgahd|Qmhdadj|MI|5172354383 +Ocqgahd|Smhdadj|MI|3132356776 +Xcogahd|Fahdadj|MI|9068106790 +Ndsgahd|Qdhdadj|MI|5172556585 +Odugahd|Tbhdadj|MI|3132756776 +Xcqgahd|Fmhdadj|MI|9062356779 +Ndxgahd|Rehdadj|MI|5170306109 +Padgahd|Tyhdadj|MI|3130350767 +Xcrgahd|Fbhdadj|MI|9062456779 +Obhgahd|Rthdadj|MI|3134356776 +Pbfgahd|Twhdadj|MI|3132352767 +Xdtgahd|Fnhdadj|MI|9062656779 +Ocpgahd|Skhdadj|MI|3132256776 +Pbggahd|Tuhdadj|MI|3133353767 +Xdzgahd|Fghdadj|MI|9062390679 +Ocrgahd|Sbhdadj|MI|3132456776 +Pcjgahd|Uphdadj|MI|3136356767 +Ybggahd|Guhdadj|MI|9063353779 +Odsgahd|Sdhdadj|MI|3132556776 +Pckgahd|Uihdadj|MI|3137057767 +Ycmgahd|Gxhdadj|MI|9069359744 +Odvgahd|Tchdadj|MI|3132856776 +Pcngahd|Ughdadj|MI|3132056067 +Ycngahd|Gghdadj|MI|9062056044 +Odxgahd|Tehdadj|MI|3132306767 +Pdugahd|Ubhdadj|MI|3132756700 +Ycrgahd|Gbhdadj|MI|9062456444 +Odygahd|Tfhdadj|MI|3132316767 +Pdxgahd|Vehdadj|MI|3132306709 +Ydugahd|Hbhdadj|MI|9062756744 +Odzgahd|Tghdadj|MI|3132390667 +Pdygahd|Vfhdadj|MI|3132316719 +Zbggahd|Huhdadj|MI|9063356766 +Pbegahd|Txhdadj|MI|3131351767 +Rbggahd|Vuhdadj|MI|3133356700 +Zbigahd|Ishdadj|MI|9065356766 +Pbigahd|Tshdadj|MI|3135355767 +Rbigahd|Vshdadj|MI|3135356700 +Zckgahd|Iihdadj|MI|9067356766 +Pclgahd|Ubhdadj|MI|3138358767 +Rcjgahd|Vphdadj|MI|3136356700 +Zclgahd|Ibhdadj|MI|9068356766 +Pcmgahd|Uxhdadj|MI|3139359767 +Sbfgahd|Xwhdadj|MI|3132390606 +Zcngahd|Ighdadj|MI|9062056766 +Pcpgahd|Ukhdadj|MI|3132256906 +Sbggahd|Xuhdadj|MI|3133336706 +Zcqgahd|Imhdadj|MI|9062356766 +Pdsgahd|Udhdadj|MI|3132553130 +Sbigahd|Xshdadj|MI|3135356740 +Zcrgahd|Ibhdadj|MI|9062456766 +Pdwgahd|Udhdadj|MI|3132956900 +Scngahd|Xghdadj|MI|3132051740 +Zdsgahd|Idhdadj|MI|9062556766 +Pdzgahd|Vghdadj|MI|3132390629 +Scpgahd|Ykhdadj|MI|3132253740 +Zdtgahd|Inhdadj|MI|9062656766 +Radgahd|Vyhdadj|MI|3130356700 +Scqgahd|Ymhdadj|MI|3132354740 +Zdugahd|Ibhdadj|MI|9062756766 +Rbhgahd|Vthdadj|MI|3134356700 +Sdzgahd|Yghdadj|MI|3132326333 +Zdxgahd|Jehdadj|MI|9062306751 +Rcngahd|Wghdadj|MI|3132056700 +Ubggahd|Zuhdadj|MI|3133333733 +Zdzgahd|Jghdadj|MI|9062390651 +Rcpgahd|Wkhdadj|MI|3132256706 +Ubhgahd|Zthdadj|MI|3134344733 +Keggahd|Juhdadj|MI|9063336751 +Rcrgahd|Wbhdadj|MI|3132456706 +Uckgahd|Zihdadj|MI|3137085173 +Kejgahd|Jphdadj|MI|9066376751 +Rdugahd|Wbhdadj|MI|3132756706 +Ucngahd|Aghdadj|MI|3132051033 +Kekgahd|Jihdadj|MI|9067386751 +Rdvgahd|Wchdadj|MI|3132856706 +Ucogahd|Aahdadj|MI|3138102133 +Keogahd|Kahdadj|MI|9068102751 +Rdxgahd|Wehdadj|MI|3132306706 +Ucrgahd|Abhdadj|MI|3132455433 +Kergahd|Kbhdadj|MI|9062455762 +Rdygahd|Wfhdadj|MI|3132316706 +Udsgahd|Adhdadj|MI|3132556533 +Keugahd|Kbhdadj|MI|9062758762 +Rdzgahd|Wghdadj|MI|3132390606 +Udwgahd|Adhdadj|MI|3132956933 +Kevgahd|Kchdadj|MI|9062859762 +Sadgahd|Xyhdadj|MI|3130306706 +Udzgahd|Bghdadj|MI|3132326329 +Keygahd|Kfhdadj|MI|9062316262 +Sbegahd|Xxhdadj|MI|3131316706 +Vbfgahd|Bwhdadj|MI|3132322729 +Lifgahd|Lwhdadj|MI|9062322762 +Sbhgahd|Xthdadj|MI|3134346706 +Vcjgahd|Bphdadj|MI|3136376769 +Lihgahd|Lthdadj|MI|9064344762 +Sckgahd|Xihdadj|MI|3137086740 +Vcmgahd|Cxhdadj|MI|3139359799 +Limgahd|Lxhdadj|MI|9069359762 +Sclgahd|Xbhdadj|MI|3133136740 +Vcpgahd|Ckhdadj|MI|3132253282 +Lingahd|Lghdadj|MI|9062051088 +Scogahd|Yahdadj|MI|3138102740 +Vdxgahd|Cehdadj|MI|3130306109 +Liogahd|Lahdadj|MI|9068102188 +Sdsgahd|Ydhdadj|MI|3132556740 +Vdygahd|Cfhdadj|MI|3131316219 +Lisgahd|Mdhdadj|MI|9062556588 +Sdvgahd|Ychdadj|MI|3132859740 +Vdzgahd|Cghdadj|MI|3132326329 +Livgahd|Mchdadj|MI|9062859888 +Sdwgahd|Ydhdadj|MI|3132956040 +Wadgahd|Dyhdadj|MI|3130300709 +Liwgahd|Mdhdadj|MI|9062956988 +Sdxgahd|Yehdadj|MI|3132306140 +Wbggahd|Duhdadj|MI|3133333739 +Lixgahd|Mehdadj|MI|9062306109 +Ubfgahd|Zwhdadj|MI|3132322733 +Wcjgahd|Dphdadj|MI|3136376769 +Mofgahd|Mwhdadj|MI|9062322729 +Ucjgahd|Zphdadj|MI|3136376733 +Wcmgahd|Dxhdadj|MI|3139359799 +Moigahd|Mshdadj|MI|9065355759 +Ucpgahd|Akhdadj|MI|3132253233 +Wdvgahd|Echdadj|MI|3132859888 +Mojgahd|Nphdadj|MI|9066376769 +Udvgahd|Achdadj|MI|3132859833 +Wdygahd|Efhdadj|MI|3131316219 +Mokgahd|Nihdadj|MI|9067387779 +Udygahd|Bfhdadj|MI|3132316219 +Xbegahd|Exhdadj|MI|2311356790 +Molgahd|Nbhdadj|MI|9068132319 +Vadgahd|Byhdadj|MI|3130300709 +Xbfgahd|Ewhdadj|MI|2312356790 +Moogahd|Nahdadj|MI|9068102181 +Vbegahd|Bxhdadj|MI|3131311719 +Xbggahd|Euhdadj|MI|2313356790 +Morgahd|Nbhdadj|MI|9062455906 +Vbhgahd|Bthdadj|MI|3134344749 +Xbhgahd|Ethdadj|MI|2314356790 +Mougahd|Nbhdadj|MI|9062752317 +Vbigahd|Bshdadj|MI|3135355759 +Xcjgahd|Ephdadj|MI|2316356790 +Moxgahd|Nehdadj|MI|9060306109 +Vckgahd|Bihdadj|MI|3137087779 +Xcngahd|Fghdadj|MI|2312056790 +Moygahd|Ofhdadj|MI|9061316219 +Vclgahd|Bbhdadj|MI|3133132319 +Xdsgahd|Fdhdadj|MI|2312556779 +Nuegahd|Oxhdadj|MI|9061311719 +Vcqgahd|Cmhdadj|MI|3132354383 +Xdugahd|Fbhdadj|MI|2312756779 +Nuigahd|Oshdadj|MI|9065355759 +Vdugahd|Cbhdadj|MI|3132752317 +Xdygahd|Ffhdadj|MI|2312316779 +Nupgahd|Pkhdadj|MI|9062253282 +Vdvgahd|Cchdadj|MI|3132859888 +Yadgahd|Gyhdadj|MI|2310350779 +Nusgahd|Pdhdadj|MI|9062556585 +Vdwgahd|Cdhdadj|MI|3132956989 +Ybegahd|Gxhdadj|MI|2311351779 +Nuvgahd|Pchdadj|MI|9062859888 +Wbfgahd|Dwhdadj|MI|3132322729 +Ybfgahd|Gwhdadj|MI|2312352779 +Nuwgahd|Pdhdadj|MI|9062956989 +Wbhgahd|Dthdadj|MI|3134344749 +Ybhgahd|Gthdadj|MI|2314354779 +Abegahd|Axhdadj|MI|5861356710 +Wcogahd|Dahdadj|MI|3138102181 +Ycjgahd|Gphdadj|MI|2316356779 +Abfgahd|Awhdadj|MI|5862356710 +Wcpgahd|Dkhdadj|MI|3132253282 +Yclgahd|Gbhdadj|MI|2318358744 +Abggahd|Auhdadj|MI|5863356710 +Wcqgahd|Emhdadj|MI|3132354383 +Ycpgahd|Gkhdadj|MI|2312256244 +Abigahd|Ashdadj|MI|5865356710 +Wdugahd|Ebhdadj|MI|3132752317 +Ydtgahd|Hnhdadj|MI|2312656644 +Acjgahd|Bphdadj|MI|5863356710 +Wdxgahd|Eehdadj|MI|3130306109 +Ydwgahd|Hdhdadj|MI|2312956944 +Acngahd|Bghdadj|MI|5862056701 +Xbigahd|Eshdadj|MI|2315356790 +Ydxgahd|Hehdadj|MI|2312306709 +Acogahd|Bahdadj|MI|5868106701 +Xckgahd|Eihdadj|MI|2317356790 +Ydygahd|Hfhdadj|MI|2312316719 +Acqgahd|Cmhdadj|MI|5862356701 +Xcmgahd|Fxhdadj|MI|2319356790 +Ydzgahd|Hghdadj|MI|2312390629 +Acrgahd|Cbhdadj|MI|5862456701 +Xcpgahd|Fkhdadj|MI|2312256779 +Zadgahd|Hyhdadj|MI|2310356744 +Adsgahd|Cdhdadj|MI|5862556701 +Xdvgahd|Fchdadj|MI|2312856779 +Zbfgahd|Hwhdadj|MI|2312356744 +Adugahd|Cbhdadj|MI|5862756701 +Xdwgahd|Fdhdadj|MI|2312956779 +Zbhgahd|Hthdadj|MI|2314356766 +Adwgahd|Ddhdadj|MI|5862956711 +Xdxgahd|Fehdadj|MI|2312306779 +Zcjgahd|Iphdadj|MI|2316356766 +Adzgahd|Dghdadj|MI|5862390611 +Ybigahd|Gshdadj|MI|2315355779 +Zcmgahd|Ixhdadj|MI|2319356766 +Bbggahd|Euhdadj|MI|5863353711 +Yckgahd|Gihdadj|MI|2317357779 +Zdvgahd|Jchdadj|MI|2312856751 +Bbhgahd|Ethdadj|MI|5864354711 +Ycogahd|Gahdadj|MI|2318106144 +Kedgahd|Jyhdadj|MI|2310306751 +Bbigahd|Eshdadj|MI|5865355711 +Ycqgahd|Gmhdadj|MI|2312356344 +Keegahd|Jxhdadj|MI|2311316751 +Bcngahd|Fghdadj|MI|5862056000 +Ydsgahd|Hdhdadj|MI|2312556544 +Kehgahd|Jthdadj|MI|2314346751 +Bdtgahd|Gnhdadj|MI|5862656600 +Ydvgahd|Hchdadj|MI|2312856844 +Kelgahd|Jbhdadj|MI|2318136751 +Bdxgahd|Hehdadj|MI|5862306709 +Zbegahd|Hxhdadj|MI|2311356744 +Keqgahd|Kmhdadj|MI|2312354762 +Bdygahd|Hfhdadj|MI|5862316719 +Zcogahd|Iahdadj|MI|2318106766 +Ketgahd|Knhdadj|MI|2312657762 +Cbfgahd|Iwhdadj|MI|5862356810 +Zcpgahd|Ikhdadj|MI|2312256766 +Kezgahd|Kghdadj|MI|2312326362 +Cbggahd|Iuhdadj|MI|5863356810 +Zdwgahd|Jdhdadj|MI|2312956751 +Liggahd|Luhdadj|MI|2313333762 +Ccngahd|Jghdadj|MI|5862056721 +Zdygahd|Jfhdadj|MI|2312316751 +Likgahd|Lihdadj|MI|2317387762 +Cdtgahd|Knhdadj|MI|5862656721 +Kefgahd|Jwhdadj|MI|2312390651 +Lilgahd|Lbhdadj|MI|2318138762 +Cdugahd|Kbhdadj|MI|5862756721 +Keigahd|Jshdadj|MI|2315356751 +Lipgahd|Lkhdadj|MI|2312253288 +Cdvgahd|Lchdadj|MI|5862856721 +Kemgahd|Kxhdadj|MI|2319350751 +Liygahd|Mfhdadj|MI|2312316219 +Cdygahd|Lfhdadj|MI|5862316722 +Kengahd|Kghdadj|MI|2312051751 +Moegahd|Mxhdadj|MI|2311311719 +Dadgahd|Myhdadj|MI|5860306722 +Kepgahd|Kkhdadj|MI|2312253751 +Moggahd|Muhdadj|MI|2313333739 +Dbegahd|Mxhdadj|MI|5861316722 +Kesgahd|Kdhdadj|MI|2312556762 +Mohgahd|Mthdadj|MI|2314344749 +Dbfgahd|Mwhdadj|MI|5862390622 +Kewgahd|Kdhdadj|MI|2312956062 +Momgahd|Nxhdadj|MI|2319359799 +Dcjgahd|Nphdadj|MI|5867376722 +Kexgahd|Kehdadj|MI|2312306162 +Moqgahd|Nmhdadj|MI|2312354383 +Dcmgahd|Nxhdadj|MI|5869350732 +Lidgahd|Lyhdadj|MI|2310300762 +Motgahd|Nnhdadj|MI|2312657686 +Dcngahd|Nghdadj|MI|5862051732 +Liegahd|Lxhdadj|MI|2311311762 +Movgahd|Nchdadj|MI|2312859888 +Dcpgahd|Nkhdadj|MI|5862253732 +Liigahd|Lshdadj|MI|2315355762 +Mozgahd|Oghdadj|MI|2312326329 +Ddxgahd|Pehdadj|MI|5862306145 +Lijgahd|Lphdadj|MI|2316376762 +Nufgahd|Owhdadj|MI|2312322729 +Ddygahd|Pfhdadj|MI|5862316245 +Liqgahd|Lmhdadj|MI|2312354388 +Nuggahd|Ouhdadj|MI|2313333739 +Ddzgahd|Pghdadj|MI|5862326345 +Lirgahd|Mbhdadj|MI|2312455488 +Nuhgahd|Othdadj|MI|2314344749 +Ebggahd|Ruhdadj|MI|5863333745 +Litgahd|Mnhdadj|MI|2312657688 +Nukgahd|Oihdadj|MI|2317387779 +Ecpgahd|Tkhdadj|MI|5862253245 +Liugahd|Mbhdadj|MI|2312752318 +Nulgahd|Pbhdadj|MI|2318132319 +Ecqgahd|Tmhdadj|MI|5862354345 +Lizgahd|Mghdadj|MI|2312326329 +Nuxgahd|Qehdadj|MI|2310306109 +Edsgahd|Tdhdadj|MI|5862558139 +Modgahd|Myhdadj|MI|2310300709 +Nuygahd|Qfhdadj|MI|2311316219 +Edtgahd|Unhdadj|MI|5862657609 +Mongahd|Nghdadj|MI|2312023180 +Badgahd|Eyhdadj|MI|9890350711 +Edxgahd|Uehdadj|MI|5862306109 +Mopgahd|Nkhdadj|MI|2312253282 +Bbfgahd|Ewhdadj|MI|9892352711 +Fbegahd|Vxhdadj|MI|5861311719 +Mosgahd|Ndhdadj|MI|2312556585 +Bcjgahd|Fphdadj|MI|9896356711 +Fbggahd|Vuhdadj|MI|5863333739 +Mowgahd|Ndhdadj|MI|2312956989 +Bclgahd|Fbhdadj|MI|9898358700 +Fbhgahd|Vthdadj|MI|5864344749 +Nudgahd|Oyhdadj|MI|2310300709 +Bcogahd|Fahdadj|MI|9898106100 +Fckgahd|Wihdadj|MI|5867387779 +Nujgahd|Ophdadj|MI|2316376769 +Bcqgahd|Gmhdadj|MI|9892356300 +Fcogahd|Wahdadj|MI|5868102181 +Numgahd|Pxhdadj|MI|2319359799 +Bcrgahd|Gbhdadj|MI|9892456400 +Fdsgahd|Xdhdadj|MI|5862556585 +Nungahd|Pghdadj|MI|2312023180 +Bdvgahd|Gchdadj|MI|9892856800 +Fdugahd|Xbhdadj|MI|5862752317 +Nuogahd|Pahdadj|MI|2318102181 +Cadgahd|Iyhdadj|MI|9890356810 +Fdvgahd|Xchdadj|MI|5862859888 +Nuqgahd|Pmhdadj|MI|2312354383 +Cbegahd|Ixhdadj|MI|9891356810 +Fdwgahd|Xdhdadj|MI|5862956989 +Nurgahd|Pbhdadj|MI|2312455906 +Cbhgahd|Ithdadj|MI|9894356810 +Fdxgahd|Xehdadj|MI|5860306109 +Nutgahd|Pnhdadj|MI|2312657686 +Ccmgahd|Jxhdadj|MI|9899356721 +Gbfgahd|Ywhdadj|MI|5862322729 +Nuugahd|Pbhdadj|MI|2312752317 +Ccogahd|Jahdadj|MI|9898106721 +Gbhgahd|Ythdadj|MI|5864344749 +Nuzgahd|Qghdadj|MI|2312326329 +Ccpgahd|Kkhdadj|MI|9892256721 +Gclgahd|Zbhdadj|MI|5868132319 +Aadgahd|Ayhdadj|MI|9890356710 +Ccqgahd|Kmhdadj|MI|9892356721 +Gcqgahd|Zmhdadj|MI|5862354383 +Abhgahd|Athdadj|MI|9894356710 +Cdwgahd|Ldhdadj|MI|9892956721 +Gcrgahd|Zbhdadj|MI|5862455906 +Ackgahd|Bihdadj|MI|7151756710 +Cdzgahd|Lghdadj|MI|9892390622 +Gdvgahd|Achdadj|MI|5862859888 +Aclgahd|Bbhdadj|MI|9898356710 +Dbggahd|Muhdadj|MI|9893336722 +Gdygahd|Afhdadj|MI|5861316219 +Acmgahd|Bxhdadj|MI|9899356701 +Dckgahd|Nihdadj|MI|9897086722 +Hbegahd|Bxhdadj|MI|5171356799 +Acpgahd|Bkhdadj|MI|9892256701 +Dcogahd|Nahdadj|MI|9898102732 +Hbfgahd|Bwhdadj|MI|5172356799 +Adtgahd|Cnhdadj|MI|9892656701 +Dcrgahd|Obhdadj|MI|9892455732 +Hdugahd|Cbhdadj|MI|5172756767 +Advgahd|Dchdadj|MI|9892856701 +Ddsgahd|Odhdadj|MI|9892556732 +Iadgahd|Dyhdadj|MI|5170350767 +Adxgahd|Dehdadj|MI|9892306711 +Ddtgahd|Onhdadj|MI|9892655172 +Ibhgahd|Dthdadj|MI|5174354778 +Adygahd|Dfhdadj|MI|9892316711 +Ddugahd|Obhdadj|MI|9892758732 +Icjgahd|Dphdadj|MI|5176356778 +Bbegahd|Axhdadj|MI|9891351711 +Eadgahd|Ryhdadj|MI|9890300745 +Iclgahd|Ebhdadj|MI|5178358778 +Bckgahd|Fihdadj|MI|9897057700 +Ebegahd|Rxhdadj|MI|9891311745 +Icmgahd|Exhdadj|MI|5179359778 +Bcmgahd|Fxhdadj|MI|9899359700 +Ebfgahd|Rwhdadj|MI|9892322745 +Idygahd|Gfhdadj|MI|5172316719 +Bcpgahd|Gkhdadj|MI|9892256200 +Ebhgahd|Rthdadj|MI|9894344745 +Idzgahd|Gghdadj|MI|5172390629 +Bdsgahd|Gdhdadj|MI|9892558130 +Eckgahd|Sihdadj|MI|9897087745 +Jbggahd|Guhdadj|MI|5173356701 +Bdugahd|Gbhdadj|MI|9892756700 +Ecmgahd|Sxhdadj|MI|9899359745 +Jbhgahd|Gthdadj|MI|5174356701 +Bdwgahd|Hdhdadj|MI|9892956900 +Ecogahd|Tahdadj|MI|9898102145 +Jcjgahd|Gphdadj|MI|5176356701 +Bdzgahd|Hghdadj|MI|9892390629 +Ecrgahd|Tbhdadj|MI|9892455445 +Jcmgahd|Hxhdadj|MI|5179356701 +Cbigahd|Ishdadj|MI|9895356810 +Edugahd|Ubhdadj|MI|9892758709 +Jcngahd|Hghdadj|MI|5172056755 +Ccjgahd|Jphdadj|MI|9896356810 +Edvgahd|Uchdadj|MI|9892859809 +Jdtgahd|Inhdadj|MI|5172656755 +Cckgahd|Jihdadj|MI|9897056810 +Edzgahd|Vghdadj|MI|9892326329 +Jdvgahd|Ichdadj|MI|5172856755 +Cclgahd|Jbhdadj|MI|9898356721 +Fadgahd|Vyhdadj|MI|9890300709 +Jdwgahd|Idhdadj|MI|5172956755 +Ccrgahd|Kbhdadj|MI|9892456721 +Fbigahd|Wshdadj|MI|9895355759 +Kckgahd|Jihdadj|MI|5177386704 +Cdsgahd|Kdhdadj|MI|9892556721 +Fcjgahd|Wphdadj|MI|9896376769 +Kcngahd|Jghdadj|MI|5172051704 +Cdxgahd|Lehdadj|MI|9892306721 +Fclgahd|Wbhdadj|MI|9898132319 +Kcogahd|Kahdadj|MI|5178102704 +Dbhgahd|Mthdadj|MI|9894346722 +Fcngahd|Wghdadj|MI|9892031080 +Kdvgahd|Kchdadj|MI|5172859766 +Dbigahd|Nshdadj|MI|9895356722 +Fcpgahd|Wkhdadj|MI|9892253282 +Kdwgahd|Ldhdadj|MI|5172956066 +Dclgahd|Nbhdadj|MI|9898136732 +Fdtgahd|Xnhdadj|MI|9892657686 +Ladgahd|Lyhdadj|MI|5170300766 +Dcqgahd|Omhdadj|MI|9892354732 +Fdygahd|Yfhdadj|MI|9891316219 +Lbggahd|Luhdadj|MI|5173333729 +Ddvgahd|Ochdadj|MI|9892859732 +Gbigahd|Zshdadj|MI|9895355759 +Lbhgahd|Lthdadj|MI|5174344729 +Ddwgahd|Odhdadj|MI|9892956045 +Gckgahd|Zihdadj|MI|9897087779 +Lcjgahd|Lphdadj|MI|5176376729 +Ebigahd|Sshdadj|MI|9895355745 +Gcmgahd|Zxhdadj|MI|9899359799 +Lclgahd|Mbhdadj|MI|5178139899 +Ecjgahd|Sphdadj|MI|9896376745 +Gcogahd|Zahdadj|MI|9898102181 +Lcngahd|Mghdadj|MI|5172051729 +Eclgahd|Sbhdadj|MI|9898138745 +Gcpgahd|Zkhdadj|MI|9892253282 +Lcogahd|Mahdadj|MI|5178109069 +Ecngahd|Sghdadj|MI|9892031045 +Gdtgahd|Anhdadj|MI|9892657686 +Lcpgahd|Mkhdadj|MI|5172253229 +Edwgahd|Udhdadj|MI|9892956909 +Gdugahd|Abhdadj|MI|9892752317 +Lcrgahd|Mbhdadj|MI|5172455429 +Edygahd|Vfhdadj|MI|9892316219 +Gdwgahd|Adhdadj|MI|9892956989 +Ldtgahd|Mnhdadj|MI|5172657629 +Fbfgahd|Vwhdadj|MI|9892322729 +Gdxgahd|Aehdadj|MI|9890306109 +Ldugahd|Mbhdadj|MI|5172759899 +Fcmgahd|Wxhdadj|MI|9899359799 +Hadgahd|Byhdadj|MI|5170356799 +Madgahd|Nyhdadj|MI|5170300709 +Fcqgahd|Xmhdadj|MI|9892354383 +Hbigahd|Bshdadj|MI|5175356799 +Mbggahd|Nuhdadj|MI|5173333739 +Fcrgahd|Xbhdadj|MI|9892455906 +Hcjgahd|Bphdadj|MI|5176356799 +Mbhgahd|Nthdadj|MI|5174344749 +Fdzgahd|Yghdadj|MI|9892326329 +Hckgahd|Bihdadj|MI|5177356799 +Mcjgahd|Nphdadj|MI|5176376769 +Gadgahd|Yyhdadj|MI|9890300709 +Hclgahd|Bbhdadj|MI|5178356799 +Mcpgahd|Okhdadj|MI|5172253282 +Gbegahd|Yxhdadj|MI|9891311719 +Hcngahd|Bghdadj|MI|5172056799 +Mdsgahd|Odhdadj|MI|5172556585 +Gbggahd|Yuhdadj|MI|9893333739 +Hcpgahd|Ckhdadj|MI|5172256767 +Mdwgahd|Pdhdadj|MI|5172956989 +Gcjgahd|Zphdadj|MI|9896376769 +Hdsgahd|Cdhdadj|MI|5172556767 +Mdygahd|Pfhdadj|MI|5171316219 +Gcngahd|Zghdadj|MI|9892031080 +Hdtgahd|Cnhdadj|MI|5172656767 +Mdzgahd|Pghdadj|MI|5172326329 +Gdsgahd|Adhdadj|MI|9892556585 +Hdzgahd|Dghdadj|MI|5172390667 +Nadgahd|Pyhdadj|MI|5170300709 +Gdzgahd|Aghdadj|MI|9892326329 +Ibegahd|Dxhdadj|MI|5171351778 +Nbfgahd|Pwhdadj|MI|5172322729 +Hbggahd|Buhdadj|MI|5173356799 +Ibfgahd|Dwhdadj|MI|5172352778 +Nbggahd|Puhdadj|MI|5173333739 +Hbhgahd|Bthdadj|MI|5174356799 +Ibigahd|Dshdadj|MI|5175355778 +Nbhgahd|Pthdadj|MI|5174344749 +Hcmgahd|Bxhdadj|MI|5179356799 +Icngahd|Eghdadj|MI|5172055178 +Ncmgahd|Qxhdadj|MI|5179359799 +Hcogahd|Bahdadj|MI|5178106799 +Icpgahd|Ekhdadj|MI|5172256278 +Ncogahd|Qahdadj|MI|5178102181 +Hcqgahd|Cmhdadj|MI|5172356767 +Icqgahd|Emhdadj|MI|5172356356 +Ncpgahd|Qkhdadj|MI|5172253282 +Hcrgahd|Cbhdadj|MI|5172456767 +Idugahd|Fbhdadj|MI|5172756756 +Ndwgahd|Qdhdadj|MI|5172956989 +Hdvgahd|Cchdadj|MI|5172856767 +Jadgahd|Gyhdadj|MI|5170356701 +Oadgahd|Ryhdadj|MI|3130356776 +Hdwgahd|Cdhdadj|MI|5172956767 +Jbegahd|Gxhdadj|MI|5171356701 +Obegahd|Rxhdadj|MI|3131356776 +Hdxgahd|Cehdadj|MI|5172306767 +Jbfgahd|Gwhdadj|MI|5172356701 +Obfgahd|Rwhdadj|MI|3132356776 +Hdygahd|Dfhdadj|MI|5172316767 +Jbigahd|Gshdadj|MI|5175356701 +Ocjgahd|Sphdadj|MI|3136356776 +Ibggahd|Duhdadj|MI|5173353778 +Jckgahd|Hihdadj|MI|5177356701 +Ockgahd|Sihdadj|MI|3137056776 +Ickgahd|Eihdadj|MI|5177357778 +Jclgahd|Hbhdadj|MI|5178356701 +Ocngahd|Sghdadj|MI|3132056776 +Icogahd|Eahdadj|MI|5178106178 +Jcrgahd|Hbhdadj|MI|5172456755 +Odtgahd|Snhdadj|MI|3132656776 +Icrgahd|Fbhdadj|MI|5172456456 +Jdsgahd|Hdhdadj|MI|5172556755 +Odwgahd|Tdhdadj|MI|3132956776 +Idsgahd|Fdhdadj|MI|5172556556 +Jdzgahd|Ighdadj|MI|5172390655 +Pbhgahd|Tthdadj|MI|3134354767 +Idtgahd|Fnhdadj|MI|5172656656 +Kadgahd|Iyhdadj|MI|5170306704 +Pcogahd|Uahdadj|MI|3138106167 +Idvgahd|Fchdadj|MI|5172856856 +Kbegahd|Ixhdadj|MI|5171316704 +Pcqgahd|Umhdadj|MI|3132356367 +Idwgahd|Fdhdadj|MI|5172956956 +Kbfgahd|Jwhdadj|MI|5172390604 +Pcrgahd|Ubhdadj|MI|3132455177 +Idxgahd|Fehdadj|MI|5172306709 +Kbigahd|Jshdadj|MI|5175356704 +Pdtgahd|Unhdadj|MI|3132656600 +Jcogahd|Hahdadj|MI|5178106755 +Kcjgahd|Jphdadj|MI|5176376704 +Pdvgahd|Uchdadj|MI|3132856800 +Jcpgahd|Hkhdadj|MI|5172256755 +Kclgahd|Jbhdadj|MI|5175176704 +Rbegahd|Vxhdadj|MI|3131356700 +Jcqgahd|Hmhdadj|MI|5172356755 +Kcqgahd|Kmhdadj|MI|5172354766 +Rbfgahd|Vwhdadj|MI|3132356700 +Jdugahd|Ibhdadj|MI|5172756755 +Kcrgahd|Kbhdadj|MI|5172455766 +Rckgahd|Vihdadj|MI|3137056700 +Jdxgahd|Iehdadj|MI|5172306755 +Kdsgahd|Kdhdadj|MI|5172556766 +Rclgahd|Wbhdadj|MI|3138356700 +Jdygahd|Ifhdadj|MI|5172316755 +Kdugahd|Kbhdadj|MI|5172758766 +Rcmgahd|Wxhdadj|MI|3139356700 +Kbggahd|Juhdadj|MI|5173336704 +Kdzgahd|Lghdadj|MI|5172326366 +Rcogahd|Wahdadj|MI|3138106700 +Kbhgahd|Jthdadj|MI|5174346704 +Lbegahd|Lxhdadj|MI|5171311766 +Rcqgahd|Wmhdadj|MI|3132356706 +Kcmgahd|Jxhdadj|MI|5179350704 +Ldsgahd|Mdhdadj|MI|5172556529 +Rdsgahd|Wdhdadj|MI|3132556706 +Kcpgahd|Kkhdadj|MI|5172253704 +Ldvgahd|Nchdadj|MI|5172859829 +Rdtgahd|Wnhdadj|MI|3132656706 +Kdtgahd|Knhdadj|MI|5172657766 +Ldwgahd|Ndhdadj|MI|5172956929 +Rdwgahd|Wdhdadj|MI|3132956706 +Kdxgahd|Lehdadj|MI|5172306166 +Ldygahd|Nfhdadj|MI|5172316219 +Scjgahd|Xphdadj|MI|3136376740 +Kdygahd|Lfhdadj|MI|5172316266 +Mbfgahd|Nwhdadj|MI|5172322729 +Scmgahd|Xxhdadj|MI|3139350740 +Lbfgahd|Lwhdadj|MI|5172322766 +Mclgahd|Obhdadj|MI|5175172319 +Scrgahd|Ybhdadj|MI|3132455740 +Lbigahd|Lshdadj|MI|5175355729 +Mcmgahd|Oxhdadj|MI|5179359799 +Sdtgahd|Ynhdadj|MI|3132657740 +Lckgahd|Mihdadj|MI|5177387729 +Mcqgahd|Omhdadj|MI|5172354383 +Sdugahd|Ybhdadj|MI|3132758740 +Lcmgahd|Mxhdadj|MI|5179359729 +Mcrgahd|Obhdadj|MI|5172455906 +Sdygahd|Yfhdadj|MI|3132316233 +Lcqgahd|Mmhdadj|MI|5172354329 +Mdxgahd|Pehdadj|MI|5170306109 +Uadgahd|Zyhdadj|MI|3130300733 +Ldxgahd|Nehdadj|MI|5172306109 +Ncjgahd|Pphdadj|MI|5176376769 +Ubegahd|Zxhdadj|MI|3131311733 +Ldzgahd|Nghdadj|MI|5172326329 +Nckgahd|Pihdadj|MI|5177387779 +Ubigahd|Zshdadj|MI|3135355733 +Mbegahd|Nxhdadj|MI|5171311719 +Ncrgahd|Qbhdadj|MI|5172455906 +Uclgahd|Zbhdadj|MI|3133138733 +Mbigahd|Nshdadj|MI|5175355759 +Ndtgahd|Qnhdadj|MI|5172657686 +Ucmgahd|Axhdadj|MI|3139359733 +Mckgahd|Nihdadj|MI|5177387779 +Ndugahd|Qbhdadj|MI|5172752317 +Ucqgahd|Amhdadj|MI|3132354333 +Mcngahd|Oghdadj|MI|5172031080 +Ndvgahd|Qchdadj|MI|5172859888 +Udtgahd|Anhdadj|MI|3132657633 +Mcogahd|Oahdadj|MI|5178102181 +Ndygahd|Rfhdadj|MI|5171316219 +Udugahd|Abhdadj|MI|3132758733 +Mdtgahd|Onhdadj|MI|5172657686 +Ndzgahd|Rghdadj|MI|5172326329 +Udxgahd|Aehdadj|MI|3132306109 +Mdugahd|Obhdadj|MI|5172752317 +Obggahd|Ruhdadj|MI|5173356776 +Vbggahd|Buhdadj|MI|3133333739 +Mdvgahd|Ochdadj|MI|5172859888 +Obigahd|Rshdadj|MI|5175356776 +Vcngahd|Cghdadj|MI|3132051080 +Nbegahd|Pxhdadj|MI|5171311719 +Oclgahd|Sbhdadj|MI|5178356776 +Vcogahd|Cahdadj|MI|3138102181 +Nbigahd|Pshdadj|MI|5175355759 +Ocmgahd|Sxhdadj|MI|5179356776 +Vcrgahd|Cbhdadj|MI|3132455906 +Nclgahd|Qbhdadj|MI|5175172319 +Ocogahd|Sahdadj|MI|5178106776 +Vdsgahd|Cdhdadj|MI|3132556585 +Ncngahd|Qghdadj|MI|5172031080 +Ocqgahd|Smhdadj|MI|5172356776 +Vdtgahd|Cnhdadj|MI|3132657686 +Ncqgahd|Qmhdadj|MI|5172354383 +Odugahd|Tbhdadj|MI|5172756776 +Wbegahd|Dxhdadj|MI|3131311719 +Ndsgahd|Qdhdadj|MI|5172556585 +Padgahd|Tyhdadj|MI|5170350767 +Wbigahd|Dshdadj|MI|3135355759 +Ndxgahd|Rehdadj|MI|5170306109 +Pbfgahd|Twhdadj|MI|5172352767 +Wckgahd|Dihdadj|MI|3137087779 +Obhgahd|Rthdadj|MI|5174356776 +Pbggahd|Tuhdadj|MI|5173353767 +Wclgahd|Dbhdadj|MI|3133132319 +Ocpgahd|Skhdadj|MI|5172256776 +Pcjgahd|Uphdadj|MI|5176356767 +Wcngahd|Dghdadj|MI|3132051080 +Ocrgahd|Sbhdadj|MI|5172456776 +Pckgahd|Uihdadj|MI|5177357767 +Wcrgahd|Ebhdadj|MI|3132455906 +Odsgahd|Sdhdadj|MI|5172556776 +Pcngahd|Ughdadj|MI|5172056067 +Wdsgahd|Edhdadj|MI|3132556585 +Odvgahd|Tchdadj|MI|5172856776 +Pdugahd|Ubhdadj|MI|5172756700 +Wdtgahd|Enhdadj|MI|3132657686 +Odxgahd|Tehdadj|MI|5172306767 +Pdxgahd|Vehdadj|MI|5172306709 +Wdwgahd|Edhdadj|MI|3132956989 +Odygahd|Tfhdadj|MI|5172316767 +Pdygahd|Vfhdadj|MI|5172316719 +Wdzgahd|Eghdadj|MI|3132326329 +Odzgahd|Tghdadj|MI|5172390667 +Rbggahd|Vuhdadj|MI|5173356700 +Xadgahd|Eyhdadj|MI|2310356790 +Pbegahd|Txhdadj|MI|5171351767 +Rbigahd|Vshdadj|MI|5175356700 +Xclgahd|Fbhdadj|MI|2318356790 +Pbigahd|Tshdadj|MI|5175355767 +Rcjgahd|Vphdadj|MI|5176356700 +Xcogahd|Fahdadj|MI|2318106790 +Pclgahd|Ubhdadj|MI|5178358767 +Sbfgahd|Xwhdadj|MI|5172390606 +Xcqgahd|Fmhdadj|MI|2312356779 +Pcmgahd|Uxhdadj|MI|5179359767 +Sbggahd|Xuhdadj|MI|5173336706 +Xcrgahd|Fbhdadj|MI|2312456779 +Pcpgahd|Ukhdadj|MI|5172256906 +Sbigahd|Xshdadj|MI|5175356740 +Xdtgahd|Fnhdadj|MI|2312656779 +Pdsgahd|Udhdadj|MI|5172555170 +Scngahd|Xghdadj|MI|5172051740 +Xdzgahd|Fghdadj|MI|2312390679 +Pdwgahd|Udhdadj|MI|5172956900 +Scpgahd|Ykhdadj|MI|5172253740 +Ybggahd|Guhdadj|MI|2313353779 +Pdzgahd|Vghdadj|MI|5172390629 +Scqgahd|Ymhdadj|MI|5172354740 +Ycmgahd|Gxhdadj|MI|2319359744 +Radgahd|Vyhdadj|MI|5170356700 +Sdzgahd|Yghdadj|MI|5172326333 +Ycngahd|Gghdadj|MI|2312056044 +Rbhgahd|Vthdadj|MI|5174356700 +Ubggahd|Zuhdadj|MI|5173333733 +Ycrgahd|Gbhdadj|MI|2312456444 +Rcngahd|Wghdadj|MI|5172056700 +Ubhgahd|Zthdadj|MI|5174344733 +Ydugahd|Hbhdadj|MI|2312756744 +Rcpgahd|Wkhdadj|MI|5172256706 +Uckgahd|Zihdadj|MI|5177385173 +Zbggahd|Huhdadj|MI|2313356766 +Rcrgahd|Wbhdadj|MI|5172456706 +Ucngahd|Aghdadj|MI|5172031033 +Zbigahd|Ishdadj|MI|2315356766 +Rdugahd|Wbhdadj|MI|5172756706 +Ucogahd|Aahdadj|MI|5178102133 +Zckgahd|Iihdadj|MI|2317356766 +Rdvgahd|Wchdadj|MI|5172856706 +Ucrgahd|Abhdadj|MI|5172455433 +Zclgahd|Ibhdadj|MI|2318356766 +Rdxgahd|Wehdadj|MI|5172306706 +Udsgahd|Adhdadj|MI|5172556533 +Zcngahd|Ighdadj|MI|2312056766 +Rdygahd|Wfhdadj|MI|5172316706 +Udwgahd|Adhdadj|MI|5172956933 +Zcqgahd|Imhdadj|MI|2312356766 +Rdzgahd|Wghdadj|MI|5172390606 +Udzgahd|Bghdadj|MI|5172326329 +Zcrgahd|Ibhdadj|MI|2312456766 +Sadgahd|Xyhdadj|MI|5170306706 +Vbfgahd|Bwhdadj|MI|5172322729 +Zdsgahd|Idhdadj|MI|2312556766 +Sbegahd|Xxhdadj|MI|5171316706 +Vcjgahd|Bphdadj|MI|5176376769 +Zdtgahd|Inhdadj|MI|2312656766 +Sbhgahd|Xthdadj|MI|5174346706 +Vcmgahd|Cxhdadj|MI|5179359799 +Zdugahd|Ibhdadj|MI|2312756766 +Sckgahd|Xihdadj|MI|5177386740 +Vcpgahd|Ckhdadj|MI|5172253282 +Zdxgahd|Jehdadj|MI|2312306751 +Sclgahd|Xbhdadj|MI|5175176740 +Vdxgahd|Cehdadj|MI|5170306109 +Zdzgahd|Jghdadj|MI|2312390651 +Scogahd|Yahdadj|MI|5178102740 +Vdygahd|Cfhdadj|MI|5171316219 +Keggahd|Juhdadj|MI|2313336751 +Sdsgahd|Ydhdadj|MI|5172556740 +Vdzgahd|Cghdadj|MI|5172326329 +Kejgahd|Jphdadj|MI|2316376751 +Sdvgahd|Ychdadj|MI|5172859740 +Wadgahd|Dyhdadj|MI|5170300709 +Kekgahd|Jihdadj|MI|2317386751 +Sdwgahd|Ydhdadj|MI|5172956040 +Wbggahd|Duhdadj|MI|5173333739 +Keogahd|Kahdadj|MI|2318102751 +Sdxgahd|Yehdadj|MI|5172306140 +Wcjgahd|Dphdadj|MI|5176376769 +Kergahd|Kbhdadj|MI|2312455762 +Ubfgahd|Zwhdadj|MI|5172322733 +Wcmgahd|Dxhdadj|MI|5179359799 +Keugahd|Kbhdadj|MI|2312758762 +Ucjgahd|Zphdadj|MI|5176376733 +Wdvgahd|Echdadj|MI|5172859888 +Kevgahd|Kchdadj|MI|2312859762 +Ucpgahd|Akhdadj|MI|5172253233 +Wdygahd|Efhdadj|MI|5171316219 +Keygahd|Kfhdadj|MI|2312316262 +Udvgahd|Achdadj|MI|5172859833 +Xbegahd|Exhdadj|MI|5171356790 +Lifgahd|Lwhdadj|MI|2312322762 +Udygahd|Bfhdadj|MI|5172316219 +Xbfgahd|Ewhdadj|MI|5172356790 +Lihgahd|Lthdadj|MI|2314344762 +Vadgahd|Byhdadj|MI|5170300709 +Xbggahd|Euhdadj|MI|5173356790 +Limgahd|Lxhdadj|MI|2319359762 +Vbegahd|Bxhdadj|MI|5171311719 +Xbhgahd|Ethdadj|MI|5174356790 +Lingahd|Lghdadj|MI|2312023188 +Vbhgahd|Bthdadj|MI|5174344749 +Xcjgahd|Ephdadj|MI|5176356790 +Liogahd|Lahdadj|MI|2318102188 +Vbigahd|Bshdadj|MI|5175355759 +Xcngahd|Fghdadj|MI|5172056790 +Lisgahd|Mdhdadj|MI|2312556588 +Vckgahd|Bihdadj|MI|5177387779 +Xdsgahd|Fdhdadj|MI|5172556779 +Livgahd|Mchdadj|MI|2312859888 +Vclgahd|Bbhdadj|MI|5175172319 +Xdugahd|Fbhdadj|MI|5172756779 +Liwgahd|Mdhdadj|MI|2312956988 +Vcqgahd|Cmhdadj|MI|5172354383 +Xdygahd|Ffhdadj|MI|5172316779 +Lixgahd|Mehdadj|MI|2312306109 +Vdugahd|Cbhdadj|MI|5172752317 +Yadgahd|Gyhdadj|MI|5170350779 +Mofgahd|Mwhdadj|MI|2312322729 +Vdvgahd|Cchdadj|MI|5172859888 +Ybegahd|Gxhdadj|MI|5171351779 +Moigahd|Mshdadj|MI|2315355759 +Vdwgahd|Cdhdadj|MI|5172956989 +Ybfgahd|Gwhdadj|MI|5172352779 +Mojgahd|Nphdadj|MI|2316376769 +Wbfgahd|Dwhdadj|MI|5172322729 +Ybhgahd|Gthdadj|MI|5174354779 +Mokgahd|Nihdadj|MI|2317387779 +Wbhgahd|Dthdadj|MI|5174344749 +Ycjgahd|Gphdadj|MI|5176356779 +Molgahd|Nbhdadj|MI|2318132319 +Wcogahd|Dahdadj|MI|5178102181 +Yclgahd|Gbhdadj|MI|5178358744 +Moogahd|Nahdadj|MI|2318102181 +Wcpgahd|Dkhdadj|MI|5172253282 +Ycpgahd|Gkhdadj|MI|5172256244 +Morgahd|Nbhdadj|MI|2312455906 +Wcqgahd|Emhdadj|MI|5172354383 +Ydtgahd|Hnhdadj|MI|5172656644 +Mougahd|Nbhdadj|MI|2312752317 +Wdugahd|Ebhdadj|MI|5172752317 +Ydwgahd|Hdhdadj|MI|5172956944 +Moxgahd|Nehdadj|MI|2310306109 +Wdxgahd|Eehdadj|MI|5170306109 +Ydxgahd|Hehdadj|MI|5172306709 +Moygahd|Ofhdadj|MI|2311316219 +Xbigahd|Eshdadj|MI|5175356790 +Ydygahd|Hfhdadj|MI|5172316719 +Nuegahd|Oxhdadj|MI|2311311719 +Xckgahd|Eihdadj|MI|5177356790 +Ydzgahd|Hghdadj|MI|5172390629 +Nuigahd|Oshdadj|MI|2315355759 +Xcmgahd|Fxhdadj|MI|5179356790 +Zadgahd|Hyhdadj|MI|5170356744 +Nupgahd|Pkhdadj|MI|2312253282 +Xcpgahd|Fkhdadj|MI|5172256779 +Zbfgahd|Hwhdadj|MI|5172356744 +Nusgahd|Pdhdadj|MI|2312556585 +Xdvgahd|Fchdadj|MI|5172856779 +Zbhgahd|Hthdadj|MI|5174356766 +Nuvgahd|Pchdadj|MI|2312859888 +Xdwgahd|Fdhdadj|MI|5172956779 +Zcjgahd|Iphdadj|MI|5176356766 +Nuwgahd|Pdhdadj|MI|2312956989 +Xdxgahd|Fehdadj|MI|5172306779 +Zcmgahd|Ixhdadj|MI|5179356766 +Abegahd|Axhdadj|MI|9891356710 +Ybigahd|Gshdadj|MI|5175355779 +Zdvgahd|Jchdadj|MI|5172856751 +Abfgahd|Awhdadj|MI|9892356710 +Yckgahd|Gihdadj|MI|5177357779 +Kedgahd|Jyhdadj|MI|5170306751 +Abggahd|Auhdadj|MI|9893356710 +Ycogahd|Gahdadj|MI|5178106144 +Keegahd|Jxhdadj|MI|5171316751 +Abigahd|Ashdadj|MI|9895356710 +Ycqgahd|Gmhdadj|MI|5172356344 +Kehgahd|Jthdadj|MI|5174346751 +Acjgahd|Bphdadj|MI|9896356710 +Ydsgahd|Hdhdadj|MI|5172556544 +Kelgahd|Jbhdadj|MI|5175176751 +Acngahd|Bghdadj|MI|9892056701 +Ydvgahd|Hchdadj|MI|5172856844 +Keqgahd|Kmhdadj|MI|5172354762 +Acogahd|Bahdadj|MI|9898106701 +Zbegahd|Hxhdadj|MI|5171356744 +Ketgahd|Knhdadj|MI|5172657762 +Acqgahd|Cmhdadj|MI|9892356701 +Zcogahd|Iahdadj|MI|5178106766 +Kezgahd|Kghdadj|MI|5172326362 +Acrgahd|Cbhdadj|MI|9892456701 +Zcpgahd|Ikhdadj|MI|5172256766 +Liggahd|Luhdadj|MI|5173333762 +Adsgahd|Cdhdadj|MI|9892556701 +Zdwgahd|Jdhdadj|MI|5172956751 +Likgahd|Lihdadj|MI|5177387762 +Adugahd|Cbhdadj|MI|9892756701 +Zdygahd|Jfhdadj|MI|5172316751 +Lilgahd|Lbhdadj|MI|5175178762 +Adwgahd|Ddhdadj|MI|9892956711 +Kefgahd|Jwhdadj|MI|5172390651 +Lipgahd|Lkhdadj|MI|5172253288 +Adzgahd|Dghdadj|MI|9892390611 +Keigahd|Jshdadj|MI|5175356751 +Liygahd|Mfhdadj|MI|5172316219 +Bbggahd|Euhdadj|MI|9893353711 +Kemgahd|Kxhdadj|MI|5179350751 +Moegahd|Mxhdadj|MI|5171311719 +Bbhgahd|Ethdadj|MI|9894354711 +Kengahd|Kghdadj|MI|5172051751 +Moggahd|Muhdadj|MI|5173333739 +Bbigahd|Eshdadj|MI|9895355711 +Kepgahd|Kkhdadj|MI|5172253751 +Mohgahd|Mthdadj|MI|5174344749 +Bcngahd|Fghdadj|MI|9892056000 +Kesgahd|Kdhdadj|MI|5172556762 +Momgahd|Nxhdadj|MI|5179359799 +Bdtgahd|Gnhdadj|MI|9892656600 +Kewgahd|Kdhdadj|MI|5172956062 +Moqgahd|Nmhdadj|MI|5172354383 +Bdxgahd|Hehdadj|MI|9892306709 +Kexgahd|Kehdadj|MI|5172306162 +Motgahd|Nnhdadj|MI|5172657686 +Bdygahd|Hfhdadj|MI|9892316719 +Lidgahd|Lyhdadj|MI|5170300762 +Movgahd|Nchdadj|MI|5172859888 +Cbfgahd|Iwhdadj|MI|9892356810 +Liegahd|Lxhdadj|MI|5171311762 +Mozgahd|Oghdadj|MI|5172326329 +Cbggahd|Iuhdadj|MI|9893356810 +Liigahd|Lshdadj|MI|5175355762 +Nufgahd|Owhdadj|MI|5172322729 +Ccngahd|Jghdadj|MI|9892056721 +Lijgahd|Lphdadj|MI|5176376762 +Nuggahd|Ouhdadj|MI|5173333739 +Cdtgahd|Knhdadj|MI|9892656721 +Liqgahd|Lmhdadj|MI|5172354388 +Nuhgahd|Othdadj|MI|5174344749 +Cdugahd|Kbhdadj|MI|9892756721 +Lirgahd|Mbhdadj|MI|5172455488 +Nukgahd|Oihdadj|MI|5177387779 +Cdvgahd|Lchdadj|MI|9892856721 +Litgahd|Mnhdadj|MI|5172657688 +Nulgahd|Pbhdadj|MI|5175172319 +Cdygahd|Lfhdadj|MI|9892316722 +Liugahd|Mbhdadj|MI|5172752318 +Nuxgahd|Qehdadj|MI|5170306109 +Dadgahd|Myhdadj|MI|9890306722 +Lizgahd|Mghdadj|MI|5172326329 +Nuygahd|Qfhdadj|MI|5171316219 +Dbegahd|Mxhdadj|MI|9891316722 +Modgahd|Myhdadj|MI|5170300709 +Badgahd|Eyhdadj|NJ|9080350711 +Dbfgahd|Mwhdadj|MI|9892390622 +Mongahd|Nghdadj|MI|5172031080 +Bbfgahd|Ewhdadj|NJ|9082732711 +Dcjgahd|Nphdadj|MI|9896376722 +Mopgahd|Nkhdadj|MI|5172253282 +Bcjgahd|Fphdadj|NJ|9086356711 +Dcmgahd|Nxhdadj|MI|9899350732 +Mosgahd|Ndhdadj|MI|5172556585 +Bclgahd|Fbhdadj|NJ|9088358700 +Dcngahd|Nghdadj|MI|9892051732 +Mowgahd|Ndhdadj|MI|5172956989 +Bcogahd|Fahdadj|NJ|9082120100 +Dcpgahd|Nkhdadj|MI|9892253732 +Nudgahd|Oyhdadj|MI|5170300709 +Bcqgahd|Gmhdadj|NJ|9082356300 +Ddxgahd|Pehdadj|MI|9892306145 +Nujgahd|Ophdadj|MI|5176376769 +Bcrgahd|Gbhdadj|NJ|9082456400 +Ddygahd|Pfhdadj|MI|9892316245 +Numgahd|Pxhdadj|MI|5179359799 +Bdvgahd|Gchdadj|NJ|9082856800 +Ddzgahd|Pghdadj|MI|9892326345 +Nungahd|Pghdadj|MI|5172031080 +Cadgahd|Iyhdadj|NJ|9080356712 +Ebggahd|Ruhdadj|MI|9893333745 +Nuogahd|Pahdadj|MI|5178102181 +Cbegahd|Ixhdadj|NJ|9082656712 +Ecpgahd|Tkhdadj|MI|9892253245 +Nuqgahd|Pmhdadj|MI|5172354383 +Cbhgahd|Ithdadj|NJ|9084356712 +Ecqgahd|Tmhdadj|MI|9892354345 +Nurgahd|Pbhdadj|MI|5172455906 +Ccmgahd|Jxhdadj|NJ|9089356721 +Edsgahd|Tdhdadj|MI|9892558139 +Nutgahd|Pnhdadj|MI|5172657686 +Ccogahd|Jahdadj|NJ|9082156721 +Edtgahd|Unhdadj|MI|9892657609 +Nuugahd|Pbhdadj|MI|5172752317 +Ccpgahd|Kkhdadj|NJ|9082256721 +Edxgahd|Uehdadj|MI|9892306109 +Nuzgahd|Qghdadj|MI|5172326329 +Ccqgahd|Kmhdadj|NJ|9082356721 +Fbegahd|Vxhdadj|MI|9891311719 +Aadgahd|Ayhdadj|NJ|9080356710 +Cdwgahd|Ldhdadj|NJ|9082956721 +Fbggahd|Vuhdadj|MI|9893333739 +Abhgahd|Athdadj|NJ|9084356710 +Cdzgahd|Lghdadj|NJ|9082326722 +Fbhgahd|Vthdadj|MI|9894344749 +Ackgahd|Bihdadj|NJ|9087356710 +Dbggahd|Muhdadj|NJ|9083336722 +Fckgahd|Wihdadj|MI|9897087779 +Aclgahd|Bbhdadj|NJ|9088356710 +Dckgahd|Nihdadj|NJ|9087973722 +Fcogahd|Wahdadj|MI|9898102181 +Acmgahd|Bxhdadj|NJ|9089356701 +Dcogahd|Nahdadj|NJ|9082152732 +Fdsgahd|Xdhdadj|MI|9892556585 +Acpgahd|Bkhdadj|NJ|9082256701 +Dcrgahd|Obhdadj|NJ|9082455732 +Fdugahd|Xbhdadj|MI|9892752317 +Adtgahd|Cnhdadj|NJ|9082656701 +Ddsgahd|Odhdadj|NJ|9082556732 +Fdvgahd|Xchdadj|MI|9892859888 +Advgahd|Dchdadj|NJ|9082856701 +Ddtgahd|Onhdadj|NJ|9082657732 +Fdwgahd|Xdhdadj|MI|9892956989 +Adxgahd|Dehdadj|NJ|9082306711 +Ddugahd|Obhdadj|NJ|9082758732 +Fdxgahd|Xehdadj|MI|9890306109 +Adygahd|Dfhdadj|NJ|9082316711 +Eadgahd|Ryhdadj|NJ|9080300745 +Gbfgahd|Ywhdadj|MI|9892322729 +Bbegahd|Axhdadj|NJ|9082651711 +Ebegahd|Rxhdadj|NJ|9082611745 +Gbhgahd|Ythdadj|MI|9894344749 +Bckgahd|Fihdadj|NJ|9087357700 +Ebfgahd|Rwhdadj|NJ|9082322745 +Gclgahd|Zbhdadj|MI|9898132319 +Bcmgahd|Fxhdadj|NJ|9089359700 +Ebhgahd|Rthdadj|NJ|9084344745 +Gcqgahd|Zmhdadj|MI|9892354383 +Bcpgahd|Gkhdadj|NJ|9082256200 +Eckgahd|Sihdadj|NJ|9087387745 +Gcrgahd|Zbhdadj|MI|9892455906 +Bdsgahd|Gdhdadj|NJ|9082552010 +Ecmgahd|Sxhdadj|NJ|9089359745 +Gdvgahd|Achdadj|MI|9892859888 +Bdugahd|Gbhdadj|NJ|9082756700 +Ecogahd|Tahdadj|NJ|9082152145 +Gdygahd|Afhdadj|MI|9891316219 +Bdwgahd|Hdhdadj|NJ|9082956900 +Ecrgahd|Tbhdadj|NJ|9082455445 +Hbegahd|Bxhdadj|MI|5171356799 +Bdzgahd|Hghdadj|NJ|9082326729 +Edugahd|Ubhdadj|NJ|9082758709 +Hbfgahd|Bwhdadj|MI|5172356799 +Cbigahd|Ishdadj|NJ|9085356712 +Edvgahd|Uchdadj|NJ|9082859809 +Hdugahd|Cbhdadj|MI|5172756767 +Ccjgahd|Jphdadj|NJ|9086356712 +Edzgahd|Vghdadj|NJ|9082326329 +Iadgahd|Dyhdadj|MI|5170350767 +Cckgahd|Jihdadj|NJ|9087356712 +Fadgahd|Vyhdadj|NJ|9080300709 +Ibhgahd|Dthdadj|MI|5174354778 +Cclgahd|Jbhdadj|NJ|9088356721 +Fbigahd|Wshdadj|NJ|9085355759 +Icjgahd|Dphdadj|MI|5176356778 +Ccrgahd|Kbhdadj|NJ|9082456721 +Fcjgahd|Wphdadj|NJ|9086376769 +Iclgahd|Ebhdadj|MI|5178358778 +Cdsgahd|Kdhdadj|NJ|9082556721 +Fclgahd|Wbhdadj|NJ|9082018789 +Icmgahd|Exhdadj|MI|5179359778 +Cdxgahd|Lehdadj|NJ|9082306721 +Fcngahd|Wghdadj|NJ|9082055180 +Idygahd|Gfhdadj|MI|5172316719 +Dbhgahd|Mthdadj|NJ|9084346722 +Fcpgahd|Wkhdadj|NJ|9082253282 +Idzgahd|Gghdadj|MI|5172390629 +Dbigahd|Nshdadj|NJ|9085356722 +Fdtgahd|Xnhdadj|NJ|9082657686 +Jbggahd|Guhdadj|MI|5173356701 +Dclgahd|Nbhdadj|NJ|9082016732 +Fdygahd|Yfhdadj|NJ|9082616219 +Jbhgahd|Gthdadj|MI|5174356701 +Dcqgahd|Omhdadj|NJ|9082354732 +Gbigahd|Zshdadj|NJ|9085355759 +Jcjgahd|Gphdadj|MI|5176356701 +Ddvgahd|Ochdadj|NJ|9082859732 +Gckgahd|Zihdadj|NJ|9087387779 +Jcmgahd|Hxhdadj|MI|5179356701 +Ddwgahd|Odhdadj|NJ|9082956045 +Gcmgahd|Zxhdadj|NJ|9089359799 +Jcngahd|Hghdadj|MI|5172056755 +Ebigahd|Sshdadj|NJ|9085355745 +Gcogahd|Zahdadj|NJ|9082152181 +Jdtgahd|Inhdadj|MI|5172656755 +Ecjgahd|Sphdadj|NJ|9086376745 +Gcpgahd|Zkhdadj|NJ|9082253282 +Jdvgahd|Ichdadj|MI|5172856755 +Eclgahd|Sbhdadj|NJ|9082018745 +Gdtgahd|Anhdadj|NJ|9082657686 +Jdwgahd|Idhdadj|MI|5172956755 +Ecngahd|Sghdadj|NJ|9082055145 +Gdugahd|Abhdadj|NJ|9082758787 +Kckgahd|Jihdadj|MI|5177386704 +Edwgahd|Udhdadj|NJ|9082956909 +Gdwgahd|Adhdadj|NJ|9082956989 +Kcngahd|Jghdadj|MI|5172051704 +Edygahd|Vfhdadj|NJ|9082316219 +Gdxgahd|Aehdadj|NJ|9080306109 +Kcogahd|Kahdadj|MI|5178102704 +Fbfgahd|Vwhdadj|NJ|9082322729 +Hadgahd|Byhdadj|NJ|9730356799 +Kdvgahd|Kchdadj|MI|5172859766 +Fcmgahd|Wxhdadj|NJ|9089359799 +Hbigahd|Bshdadj|NJ|9735356799 +Kdwgahd|Ldhdadj|MI|5172956066 +Fcqgahd|Xmhdadj|NJ|9082354383 +Hcjgahd|Bphdadj|NJ|9736356799 +Ladgahd|Lyhdadj|MI|5170300766 +Fcrgahd|Xbhdadj|NJ|9082455484 +Hckgahd|Bihdadj|NJ|9737356799 +Lbggahd|Luhdadj|MI|5173333729 +Fdzgahd|Yghdadj|NJ|9082326329 +Hclgahd|Bbhdadj|NJ|9738356799 +Lbhgahd|Lthdadj|MI|5174344729 +Gadgahd|Yyhdadj|NJ|9080300709 +Hcngahd|Bghdadj|NJ|9732056799 +Lcjgahd|Lphdadj|MI|5176376729 +Gbegahd|Yxhdadj|NJ|9082611719 +Hcpgahd|Ckhdadj|NJ|9732256767 +Lclgahd|Mbhdadj|MI|5175179899 +Gbggahd|Yuhdadj|NJ|9083333739 +Hdsgahd|Cdhdadj|NJ|9732556767 +Lcngahd|Mghdadj|MI|5172031029 +Gcjgahd|Zphdadj|NJ|9086376769 +Hdtgahd|Cnhdadj|NJ|9730156767 +Lcogahd|Mahdadj|MI|5178109069 +Gcngahd|Zghdadj|NJ|9082055180 +Hdzgahd|Dghdadj|NJ|9732326767 +Lcpgahd|Mkhdadj|MI|5172253229 +Gdsgahd|Adhdadj|NJ|9082556585 +Ibegahd|Dxhdadj|NJ|9731351778 +Lcrgahd|Mbhdadj|MI|5172455429 +Gdzgahd|Aghdadj|NJ|9082326329 +Ibfgahd|Dwhdadj|NJ|9732732778 +Ldtgahd|Mnhdadj|MI|5172657629 +Hbggahd|Buhdadj|NJ|9733356799 +Ibigahd|Dshdadj|NJ|9735355778 +Ldugahd|Mbhdadj|MI|5172759899 +Hbhgahd|Bthdadj|NJ|9734356799 +Icngahd|Eghdadj|NJ|9732056078 +Madgahd|Nyhdadj|MI|5170300709 +Hcmgahd|Bxhdadj|NJ|9739356799 +Icpgahd|Ekhdadj|NJ|9732256278 +Mbggahd|Nuhdadj|MI|5173333739 +Hcogahd|Bahdadj|NJ|9732156799 +Icqgahd|Emhdadj|NJ|9732356356 +Mbhgahd|Nthdadj|MI|5174344749 +Hcqgahd|Cmhdadj|NJ|9732356767 +Idugahd|Fbhdadj|NJ|9732756756 +Mcjgahd|Nphdadj|MI|5176376769 +Hcrgahd|Cbhdadj|NJ|9732456767 +Jadgahd|Gyhdadj|NJ|9730356701 +Mcpgahd|Okhdadj|MI|5172253282 +Hdvgahd|Cchdadj|NJ|9732856767 +Jbegahd|Gxhdadj|NJ|9731356701 +Mdsgahd|Odhdadj|MI|5172556585 +Hdwgahd|Cdhdadj|NJ|9732956767 +Jbfgahd|Gwhdadj|NJ|9732356701 +Mdwgahd|Pdhdadj|MI|5172956989 +Hdxgahd|Cehdadj|NJ|9732306767 +Jbigahd|Gshdadj|NJ|9735356701 +Mdygahd|Pfhdadj|MI|5171316219 +Hdygahd|Dfhdadj|NJ|9732316767 +Jckgahd|Hihdadj|NJ|9737356701 +Mdzgahd|Pghdadj|MI|5172326329 +Ibggahd|Duhdadj|NJ|9733353778 +Jclgahd|Hbhdadj|NJ|9738356701 +Nadgahd|Pyhdadj|MI|5170300709 +Ickgahd|Eihdadj|NJ|9737357778 +Jcrgahd|Hbhdadj|NJ|9732456755 +Nbfgahd|Pwhdadj|MI|5172322729 +Icogahd|Eahdadj|NJ|9732120178 +Jdsgahd|Hdhdadj|NJ|9732556755 +Nbggahd|Puhdadj|MI|5173333739 +Icrgahd|Fbhdadj|NJ|9732456456 +Jdzgahd|Ighdadj|NJ|9732326755 +Nbhgahd|Pthdadj|MI|5174344749 +Idsgahd|Fdhdadj|NJ|9732556556 +Kadgahd|Iyhdadj|NJ|9730306704 +Ncmgahd|Qxhdadj|MI|5179359799 +Idtgahd|Fnhdadj|NJ|9730156656 +Kbegahd|Ixhdadj|NJ|9731316704 +Ncogahd|Qahdadj|MI|5178102181 +Idvgahd|Fchdadj|NJ|9732856856 +Kbfgahd|Jwhdadj|NJ|9732326704 +Ncpgahd|Qkhdadj|MI|5172253282 +Idwgahd|Fdhdadj|NJ|9732956956 +Kbigahd|Jshdadj|NJ|9735356704 +Ndwgahd|Qdhdadj|MI|5172956989 +Idxgahd|Fehdadj|NJ|9732306709 +Kcjgahd|Jphdadj|NJ|9736376704 +Oadgahd|Ryhdadj|MI|5170356776 +Jcogahd|Hahdadj|NJ|9732156755 +Kclgahd|Jbhdadj|NJ|9732016704 +Obegahd|Rxhdadj|MI|5171356776 +Jcpgahd|Hkhdadj|NJ|9732256755 +Kcqgahd|Kmhdadj|NJ|9732354766 +Obfgahd|Rwhdadj|MI|5172356776 +Jcqgahd|Hmhdadj|NJ|9732356755 +Kcrgahd|Kbhdadj|NJ|9732455766 +Ocjgahd|Sphdadj|MI|5176356776 +Jdugahd|Ibhdadj|NJ|9732756755 +Kdsgahd|Kdhdadj|NJ|9732556766 +Ockgahd|Sihdadj|MI|5177356776 +Jdxgahd|Iehdadj|NJ|9732306755 +Kdugahd|Kbhdadj|NJ|9732758766 +Ocngahd|Sghdadj|MI|5172056776 +Jdygahd|Ifhdadj|NJ|9732316755 +Kdzgahd|Lghdadj|NJ|9732326366 +Odtgahd|Snhdadj|MI|5172656776 +Kbggahd|Juhdadj|NJ|9733336704 +Lbegahd|Lxhdadj|NJ|9731311766 +Odwgahd|Tdhdadj|MI|5172956776 +Kbhgahd|Jthdadj|NJ|9734346704 +Ldsgahd|Mdhdadj|NJ|9732556529 +Pbhgahd|Tthdadj|MI|5174354767 +Kcmgahd|Jxhdadj|NJ|9739350704 +Ldvgahd|Nchdadj|NJ|9732859829 +Pcogahd|Uahdadj|MI|5178106167 +Kcpgahd|Kkhdadj|NJ|9732253704 +Ldwgahd|Ndhdadj|NJ|9732956929 +Pcqgahd|Umhdadj|MI|5172356367 +Kdtgahd|Knhdadj|NJ|9730157766 +Ldygahd|Nfhdadj|NJ|9732316219 +Pcrgahd|Ubhdadj|MI|5172455177 +Kdxgahd|Lehdadj|NJ|9732306166 +Mbfgahd|Nwhdadj|NJ|9732322729 +Pdtgahd|Unhdadj|MI|5172656600 +Kdygahd|Lfhdadj|NJ|9732312016 +Mclgahd|Obhdadj|NJ|9732018789 +Pdvgahd|Uchdadj|MI|5172856800 +Lbfgahd|Lwhdadj|NJ|9732322766 +Mcmgahd|Oxhdadj|NJ|9739359799 +Rbegahd|Vxhdadj|MI|5171356700 +Lbigahd|Lshdadj|NJ|9735355729 +Mcqgahd|Omhdadj|NJ|9732354383 +Rbfgahd|Vwhdadj|MI|5172356700 +Lckgahd|Mihdadj|NJ|9737387729 +Mcrgahd|Obhdadj|NJ|9732455484 +Rckgahd|Vihdadj|MI|5177356700 +Lcmgahd|Mxhdadj|NJ|9739359729 +Mdxgahd|Pehdadj|NJ|9730306109 +Rclgahd|Wbhdadj|MI|5178356700 +Lcqgahd|Mmhdadj|NJ|9732354329 +Ncjgahd|Pphdadj|NJ|9736376769 +Rcmgahd|Wxhdadj|MI|5179356700 +Ldxgahd|Nehdadj|NJ|9732306109 +Nckgahd|Pihdadj|NJ|9737387779 +Rcogahd|Wahdadj|MI|5178106700 +Ldzgahd|Nghdadj|NJ|9732326329 +Ncrgahd|Qbhdadj|NJ|9732455484 +Rcqgahd|Wmhdadj|MI|5172356706 +Mbegahd|Nxhdadj|NJ|9731311719 +Ndtgahd|Qnhdadj|NJ|9736157686 +Rdsgahd|Wdhdadj|MI|5172556706 +Mbigahd|Nshdadj|NJ|9735355759 +Ndugahd|Qbhdadj|NJ|9732758787 +Rdtgahd|Wnhdadj|MI|5172656706 +Mckgahd|Nihdadj|NJ|9737387779 +Ndvgahd|Qchdadj|NJ|9732859888 +Rdwgahd|Wdhdadj|MI|5172956706 +Mcngahd|Oghdadj|NJ|9732055180 +Ndygahd|Rfhdadj|NJ|9731316219 +Scjgahd|Xphdadj|MI|5176376740 +Mcogahd|Oahdadj|NJ|9732152181 +Ndzgahd|Rghdadj|NJ|9732326329 +Scmgahd|Xxhdadj|MI|5179350740 +Mdtgahd|Onhdadj|NJ|9730157686 +Obggahd|Ruhdadj|NJ|2013356776 +Scrgahd|Ybhdadj|MI|5172455740 +Mdugahd|Obhdadj|NJ|9732758787 +Obigahd|Rshdadj|NJ|2015356776 +Sdtgahd|Ynhdadj|MI|5172657740 +Mdvgahd|Ochdadj|NJ|9732859888 +Oclgahd|Sbhdadj|NJ|2018356776 +Sdugahd|Ybhdadj|MI|5172758740 +Nbegahd|Pxhdadj|NJ|9731311719 +Ocmgahd|Sxhdadj|NJ|2019356776 +Sdygahd|Yfhdadj|MI|5172316233 +Nbigahd|Pshdadj|NJ|9735355759 +Ocogahd|Sahdadj|NJ|2012156776 +Uadgahd|Zyhdadj|MI|5170300733 +Nclgahd|Qbhdadj|NJ|9732018789 +Ocqgahd|Smhdadj|NJ|2012356776 +Ubegahd|Zxhdadj|MI|5171311733 +Ncngahd|Qghdadj|NJ|9732055180 +Odugahd|Tbhdadj|NJ|2012756776 +Ubigahd|Zshdadj|MI|5175355733 +Ncqgahd|Qmhdadj|NJ|9732354383 +Padgahd|Tyhdadj|NJ|2010350767 +Uclgahd|Zbhdadj|MI|5175178733 +Ndsgahd|Qdhdadj|NJ|9732556585 +Pbfgahd|Twhdadj|NJ|2012732767 +Ucmgahd|Axhdadj|MI|5179359733 +Ndxgahd|Rehdadj|NJ|9730306109 +Pbggahd|Tuhdadj|NJ|2013353767 +Ucqgahd|Amhdadj|MI|5172354333 +Obhgahd|Rthdadj|NJ|2014356776 +Pcjgahd|Uphdadj|NJ|2016356767 +Udtgahd|Anhdadj|MI|5172657633 +Ocpgahd|Skhdadj|NJ|2012256776 +Pckgahd|Uihdadj|NJ|2017357767 +Udugahd|Abhdadj|MI|5172758733 +Ocrgahd|Sbhdadj|NJ|2012456776 +Pcngahd|Ughdadj|NJ|2012056067 +Udxgahd|Aehdadj|MI|5172306109 +Odsgahd|Sdhdadj|NJ|2012556776 +Pdugahd|Ubhdadj|NJ|2012756700 +Vbggahd|Buhdadj|MI|5173333739 +Odvgahd|Tchdadj|NJ|2012856776 +Pdxgahd|Vehdadj|NJ|2012306709 +Vcngahd|Cghdadj|MI|5172031080 +Odxgahd|Tehdadj|NJ|2012306767 +Pdygahd|Vfhdadj|NJ|2012316719 +Vcogahd|Cahdadj|MI|5178102181 +Odygahd|Tfhdadj|NJ|2012316767 +Rbggahd|Vuhdadj|NJ|2013356700 +Vcrgahd|Cbhdadj|MI|5172455906 +Odzgahd|Tghdadj|NJ|2012326767 +Rbigahd|Vshdadj|NJ|2015356700 +Vdsgahd|Cdhdadj|MI|5172556585 +Pbegahd|Txhdadj|NJ|2011351767 +Rcjgahd|Vphdadj|NJ|2016356700 +Vdtgahd|Cnhdadj|MI|5172657686 +Pbigahd|Tshdadj|NJ|2015355767 +Sbfgahd|Xwhdadj|NJ|2012326706 +Wbegahd|Dxhdadj|MI|5171311719 +Pclgahd|Ubhdadj|NJ|2018358767 +Sbggahd|Xuhdadj|NJ|2013336706 +Wbigahd|Dshdadj|MI|5175355759 +Pcmgahd|Uxhdadj|NJ|2019359767 +Sbigahd|Xshdadj|NJ|2015356740 +Wckgahd|Dihdadj|MI|5177387779 +Pcpgahd|Ukhdadj|NJ|2012252017 +Scngahd|Xghdadj|NJ|2012051740 +Wclgahd|Dbhdadj|MI|5175172319 +Pdsgahd|Udhdadj|NJ|2012552010 +Scpgahd|Ykhdadj|NJ|2012253740 +Wcngahd|Dghdadj|MI|5172031080 +Pdwgahd|Udhdadj|NJ|2012956900 +Scqgahd|Ymhdadj|NJ|2012354740 +Wcrgahd|Ebhdadj|MI|5172455906 +Pdzgahd|Vghdadj|NJ|2012326729 +Sdzgahd|Yghdadj|NJ|2012326333 +Wdsgahd|Edhdadj|MI|5172556585 +Radgahd|Vyhdadj|NJ|2010356700 +Ubggahd|Zuhdadj|NJ|2013333733 +Wdtgahd|Enhdadj|MI|5172657686 +Rbhgahd|Vthdadj|NJ|2014356700 +Ubhgahd|Zthdadj|NJ|2014344733 +Wdwgahd|Edhdadj|MI|5172956989 +Rcngahd|Wghdadj|NJ|2012056700 +Uckgahd|Zihdadj|NJ|2017387733 +Wdzgahd|Eghdadj|MI|5172326329 +Rcpgahd|Wkhdadj|NJ|2012256706 +Ucngahd|Aghdadj|NJ|2012055133 +Xadgahd|Eyhdadj|MI|5170356790 +Rcrgahd|Wbhdadj|NJ|2012456706 +Ucogahd|Aahdadj|NJ|2012152133 +Xclgahd|Fbhdadj|MI|5178356790 +Rdugahd|Wbhdadj|NJ|2012756706 +Ucrgahd|Abhdadj|NJ|2012455433 +Xcogahd|Fahdadj|MI|5178106790 +Rdvgahd|Wchdadj|NJ|2012856706 +Udsgahd|Adhdadj|NJ|2012556533 +Xcqgahd|Fmhdadj|MI|5172356779 +Rdxgahd|Wehdadj|NJ|2012306706 +Udwgahd|Adhdadj|NJ|2012956933 +Xcrgahd|Fbhdadj|MI|5172456779 +Rdygahd|Wfhdadj|NJ|2012316706 +Udzgahd|Bghdadj|NJ|2012326329 +Xdtgahd|Fnhdadj|MI|5172656779 +Rdzgahd|Wghdadj|NJ|2012326706 +Vbfgahd|Bwhdadj|NJ|2012322729 +Xdzgahd|Fghdadj|MI|5172390679 +Sadgahd|Xyhdadj|NJ|2010306706 +Vcjgahd|Bphdadj|NJ|2016376769 +Ybggahd|Guhdadj|MI|5173353779 +Sbegahd|Xxhdadj|NJ|2011316706 +Vcmgahd|Cxhdadj|NJ|2019359799 +Ycmgahd|Gxhdadj|MI|5179359744 +Sbhgahd|Xthdadj|NJ|2014346706 +Vcpgahd|Ckhdadj|NJ|2012253282 +Ycngahd|Gghdadj|MI|5172056044 +Sckgahd|Xihdadj|NJ|2017973740 +Vdxgahd|Cehdadj|NJ|2010306109 +Ycrgahd|Gbhdadj|MI|5172456444 +Sclgahd|Xbhdadj|NJ|2012016740 +Vdygahd|Cfhdadj|NJ|2011316219 +Ydugahd|Hbhdadj|MI|5172756744 +Scogahd|Yahdadj|NJ|2012152740 +Vdzgahd|Cghdadj|NJ|2012326329 +Zbggahd|Huhdadj|MI|5173356766 +Sdsgahd|Ydhdadj|NJ|2012556740 +Wadgahd|Dyhdadj|NJ|2010300709 +Zbigahd|Ishdadj|MI|5175356766 +Sdvgahd|Ychdadj|NJ|2012859740 +Wbggahd|Duhdadj|NJ|2013333739 +Zckgahd|Iihdadj|MI|5177356766 +Sdwgahd|Ydhdadj|NJ|2012956040 +Wcjgahd|Dphdadj|NJ|2016376769 +Zclgahd|Ibhdadj|MI|5178356766 +Sdxgahd|Yehdadj|NJ|2012306140 +Wcmgahd|Dxhdadj|NJ|2019359799 +Zcngahd|Ighdadj|MI|5172056766 +Ubfgahd|Zwhdadj|NJ|2012322733 +Wdvgahd|Echdadj|NJ|2012859888 +Zcqgahd|Imhdadj|MI|5172356766 +Ucjgahd|Zphdadj|NJ|2016376733 +Wdygahd|Efhdadj|NJ|2011316219 +Zcrgahd|Ibhdadj|MI|5172456766 +Ucpgahd|Akhdadj|NJ|2012253233 +Xbegahd|Exhdadj|NJ|9731356790 +Zdsgahd|Idhdadj|MI|5172556766 +Udvgahd|Achdadj|NJ|2012859833 +Xbfgahd|Ewhdadj|NJ|9732356790 +Zdtgahd|Inhdadj|MI|5172656766 +Udygahd|Bfhdadj|NJ|2012316219 +Xbggahd|Euhdadj|NJ|9733356790 +Zdugahd|Ibhdadj|MI|5172756766 +Vadgahd|Byhdadj|NJ|2010300709 +Xbhgahd|Ethdadj|NJ|9734356790 +Zdxgahd|Jehdadj|MI|5172306751 +Vbegahd|Bxhdadj|NJ|2011311719 +Xcjgahd|Ephdadj|NJ|9736356790 +Zdzgahd|Jghdadj|MI|5172390651 +Vbhgahd|Bthdadj|NJ|2014344749 +Xcngahd|Fghdadj|NJ|9732056790 +Keggahd|Juhdadj|MI|5173336751 +Vbigahd|Bshdadj|NJ|2015355759 +Xdsgahd|Fdhdadj|NJ|9732556779 +Kejgahd|Jphdadj|MI|5176376751 +Vckgahd|Bihdadj|NJ|2017387779 +Xdugahd|Fbhdadj|NJ|9732756779 +Kekgahd|Jihdadj|MI|5177386751 +Vclgahd|Bbhdadj|NJ|2012018789 +Xdygahd|Ffhdadj|NJ|9732316779 +Keogahd|Kahdadj|MI|5178102751 +Vcqgahd|Cmhdadj|NJ|2012354383 +Yadgahd|Gyhdadj|NJ|9730350779 +Kergahd|Kbhdadj|MI|5172455762 +Vdugahd|Cbhdadj|NJ|2012758787 +Ybegahd|Gxhdadj|NJ|9731351779 +Keugahd|Kbhdadj|MI|5172758762 +Vdvgahd|Cchdadj|NJ|2012859888 +Ybfgahd|Gwhdadj|NJ|9732732779 +Kevgahd|Kchdadj|MI|5172859762 +Vdwgahd|Cdhdadj|NJ|2012956989 +Ybhgahd|Gthdadj|NJ|9734354779 +Keygahd|Kfhdadj|MI|5172316262 +Wbfgahd|Dwhdadj|NJ|2012322729 +Ycjgahd|Gphdadj|NJ|9736356779 +Lifgahd|Lwhdadj|MI|5172322762 +Wbhgahd|Dthdadj|NJ|2014344749 +Yclgahd|Gbhdadj|NJ|9738358744 +Lihgahd|Lthdadj|MI|5174344762 +Wcogahd|Dahdadj|NJ|2012152181 +Ycpgahd|Gkhdadj|NJ|9732256244 +Limgahd|Lxhdadj|MI|5179359762 +Wcpgahd|Dkhdadj|NJ|2012253282 +Ydtgahd|Hnhdadj|NJ|9730156644 +Lingahd|Lghdadj|MI|5172031088 +Wcqgahd|Emhdadj|NJ|2012354383 +Ydwgahd|Hdhdadj|NJ|9732956944 +Liogahd|Lahdadj|MI|5178102188 +Wdugahd|Ebhdadj|NJ|2012758787 +Ydxgahd|Hehdadj|NJ|9732306709 +Lisgahd|Mdhdadj|MI|5172556588 +Wdxgahd|Eehdadj|NJ|2010306109 +Ydygahd|Hfhdadj|NJ|9732316719 +Livgahd|Mchdadj|MI|5172859888 +Xbigahd|Eshdadj|NJ|9735356790 +Ydzgahd|Hghdadj|NJ|9732326729 +Liwgahd|Mdhdadj|MI|5172956988 +Xckgahd|Eihdadj|NJ|9737356790 +Zadgahd|Hyhdadj|NJ|9730356744 +Lixgahd|Mehdadj|MI|5172306109 +Xcmgahd|Fxhdadj|NJ|9739356790 +Zbfgahd|Hwhdadj|NJ|9732356744 +Mofgahd|Mwhdadj|MI|5172322729 +Xcpgahd|Fkhdadj|NJ|9732256779 +Zbhgahd|Hthdadj|NJ|9734356766 +Moigahd|Mshdadj|MI|5175355759 +Xdvgahd|Fchdadj|NJ|9732856779 +Zcjgahd|Iphdadj|NJ|9736356766 +Mojgahd|Nphdadj|MI|5176376769 +Xdwgahd|Fdhdadj|NJ|9732956779 +Zcmgahd|Ixhdadj|NJ|9739356766 +Mokgahd|Nihdadj|MI|5177387779 +Xdxgahd|Fehdadj|NJ|9732306779 +Zdvgahd|Jchdadj|NJ|9732856751 +Molgahd|Nbhdadj|MI|5175172319 +Ybigahd|Gshdadj|NJ|9735355779 +Kedgahd|Jyhdadj|NJ|9730306751 +Moogahd|Nahdadj|MI|5178102181 +Yckgahd|Gihdadj|NJ|9737357779 +Keegahd|Jxhdadj|NJ|9731316751 +Morgahd|Nbhdadj|MI|5172455906 +Ycogahd|Gahdadj|NJ|9732120144 +Kehgahd|Jthdadj|NJ|9734346751 +Mougahd|Nbhdadj|MI|5172752317 +Ycqgahd|Gmhdadj|NJ|9732356344 +Kelgahd|Jbhdadj|NJ|9732016751 +Moxgahd|Nehdadj|MI|5170306109 +Ydsgahd|Hdhdadj|NJ|9732556544 +Keqgahd|Kmhdadj|NJ|9732354762 +Moygahd|Ofhdadj|MI|5171316219 +Ydvgahd|Hchdadj|NJ|9732856844 +Ketgahd|Knhdadj|NJ|9730157762 +Nuegahd|Oxhdadj|MI|5171311719 +Zbegahd|Hxhdadj|NJ|9731356744 +Kezgahd|Kghdadj|NJ|9732326362 +Nuigahd|Oshdadj|MI|5175355759 +Zcogahd|Iahdadj|NJ|9732156766 +Liggahd|Luhdadj|NJ|9733333762 +Nupgahd|Pkhdadj|MI|5172253282 +Zcpgahd|Ikhdadj|NJ|9732256766 +Likgahd|Lihdadj|NJ|9737387762 +Nusgahd|Pdhdadj|MI|5172556585 +Zdwgahd|Jdhdadj|NJ|9732956751 +Lilgahd|Lbhdadj|NJ|9732018762 +Nuvgahd|Pchdadj|MI|5172859888 +Zdygahd|Jfhdadj|NJ|9732316751 +Lipgahd|Lkhdadj|NJ|9732253288 +Nuwgahd|Pdhdadj|MI|5172956989 +Kefgahd|Jwhdadj|NJ|9732326751 +Liygahd|Mfhdadj|NJ|9732316219 +Abegahd|Axhdadj|NJ|9082656710 +Keigahd|Jshdadj|NJ|9735356751 +Moegahd|Mxhdadj|NJ|9731311719 +Abfgahd|Awhdadj|NJ|9082356710 +Kemgahd|Kxhdadj|NJ|9739350751 +Moggahd|Muhdadj|NJ|9733333739 +Abggahd|Auhdadj|NJ|9083356710 +Kengahd|Kghdadj|NJ|9732051751 +Mohgahd|Mthdadj|NJ|9734344749 +Abigahd|Ashdadj|NJ|9085356710 +Kepgahd|Kkhdadj|NJ|9732253751 +Momgahd|Nxhdadj|NJ|9739359799 +Acjgahd|Bphdadj|NJ|9086356710 +Kesgahd|Kdhdadj|NJ|9732556762 +Moqgahd|Nmhdadj|NJ|9732354383 +Acngahd|Bghdadj|NJ|9082056701 +Kewgahd|Kdhdadj|NJ|9732956062 +Motgahd|Nnhdadj|NJ|9730157686 +Acogahd|Bahdadj|NJ|9082156701 +Kexgahd|Kehdadj|NJ|9732306162 +Movgahd|Nchdadj|NJ|9732859888 +Acqgahd|Cmhdadj|NJ|9082356701 +Lidgahd|Lyhdadj|NJ|9730300762 +Mozgahd|Oghdadj|NJ|9732326329 +Acrgahd|Cbhdadj|NJ|9082456701 +Liegahd|Lxhdadj|NJ|9731311762 +Nufgahd|Owhdadj|NJ|9732322729 +Adsgahd|Cdhdadj|NJ|9082556701 +Liigahd|Lshdadj|NJ|9735355762 +Nuggahd|Ouhdadj|NJ|9733333739 +Adugahd|Cbhdadj|NJ|9082756701 +Lijgahd|Lphdadj|NJ|9736376762 +Nuhgahd|Othdadj|NJ|9734344749 +Adwgahd|Ddhdadj|NJ|9082956711 +Liqgahd|Lmhdadj|NJ|9732354388 +Nukgahd|Oihdadj|NJ|9737387779 +Adzgahd|Dghdadj|NJ|9082326711 +Lirgahd|Mbhdadj|NJ|9732455488 +Nulgahd|Pbhdadj|NJ|9732018789 +Bbggahd|Euhdadj|NJ|9083353711 +Litgahd|Mnhdadj|NJ|9730157688 +Nuxgahd|Qehdadj|NJ|9730306109 +Bbhgahd|Ethdadj|NJ|9084354711 +Liugahd|Mbhdadj|NJ|9732758788 +Nuygahd|Qfhdadj|NJ|9731316219 +Bbigahd|Eshdadj|NJ|9085355711 +Lizgahd|Mghdadj|NJ|9732326329 +Badgahd|Eyhdadj|NJ|7320350711 +Bcngahd|Fghdadj|NJ|9082056000 +Modgahd|Myhdadj|NJ|9730300709 +Bbfgahd|Ewhdadj|NJ|7322732711 +Bdtgahd|Gnhdadj|NJ|9082656600 +Mongahd|Nghdadj|NJ|9732055180 +Bcjgahd|Fphdadj|NJ|7326356711 +Bdxgahd|Hehdadj|NJ|9082306709 +Mopgahd|Nkhdadj|NJ|9732253282 +Bclgahd|Fbhdadj|NJ|7328358700 +Bdygahd|Hfhdadj|NJ|9082316719 +Mosgahd|Ndhdadj|NJ|9732556585 +Bcogahd|Fahdadj|NJ|7322120100 +Cbfgahd|Iwhdadj|NJ|9082356712 +Mowgahd|Ndhdadj|NJ|9732956989 +Bcqgahd|Gmhdadj|NJ|7322356300 +Cbggahd|Iuhdadj|NJ|9083356712 +Nudgahd|Oyhdadj|NJ|9730300709 +Bcrgahd|Gbhdadj|NJ|7322456400 +Ccngahd|Jghdadj|NJ|9082056721 +Nujgahd|Ophdadj|NJ|9736376769 +Bdvgahd|Gchdadj|NJ|7322856800 +Cdtgahd|Knhdadj|NJ|9082656721 +Numgahd|Pxhdadj|NJ|9739359799 +Cadgahd|Iyhdadj|NJ|7320356712 +Cdugahd|Kbhdadj|NJ|9082756721 +Nungahd|Pghdadj|NJ|9732055180 +Cbegahd|Ixhdadj|NJ|7321356712 +Cdvgahd|Lchdadj|NJ|9082856721 +Nuogahd|Pahdadj|NJ|9732152181 +Cbhgahd|Ithdadj|NJ|7324356712 +Cdygahd|Lfhdadj|NJ|9082316722 +Nuqgahd|Pmhdadj|NJ|9732354383 +Ccmgahd|Jxhdadj|NJ|7329356721 +Dadgahd|Myhdadj|NJ|9080306722 +Nurgahd|Pbhdadj|NJ|9732455484 +Ccogahd|Jahdadj|NJ|7322156721 +Dbegahd|Mxhdadj|NJ|9082616722 +Nutgahd|Pnhdadj|NJ|9730157686 +Ccpgahd|Kkhdadj|NJ|7322256721 +Dbfgahd|Mwhdadj|NJ|9082326722 +Nuugahd|Pbhdadj|NJ|9732758787 +Ccqgahd|Kmhdadj|NJ|7322356721 +Dcjgahd|Nphdadj|NJ|9086376722 +Nuzgahd|Qghdadj|NJ|9732326329 +Cdwgahd|Ldhdadj|NJ|7322956721 +Dcmgahd|Nxhdadj|NJ|9089350732 +Aadgahd|Ayhdadj|NJ|7320356710 +Cdzgahd|Lghdadj|NJ|7322326722 +Dcngahd|Nghdadj|NJ|9082051732 +Abhgahd|Athdadj|NJ|7324356710 +Dbggahd|Muhdadj|NJ|7323336722 +Dcpgahd|Nkhdadj|NJ|9082253732 +Ackgahd|Bihdadj|NJ|7327356710 +Dckgahd|Nihdadj|NJ|7327973722 +Ddxgahd|Pehdadj|NJ|9082306145 +Aclgahd|Bbhdadj|NJ|7328356710 +Dcogahd|Nahdadj|NJ|7322152732 +Ddygahd|Pfhdadj|NJ|9082316245 +Acmgahd|Bxhdadj|NJ|7329356701 +Dcrgahd|Obhdadj|NJ|7322455732 +Ddzgahd|Pghdadj|NJ|9082326345 +Acpgahd|Bkhdadj|NJ|7322256701 +Ddsgahd|Odhdadj|NJ|7322556732 +Ebggahd|Ruhdadj|NJ|9083333745 +Adtgahd|Cnhdadj|NJ|7322656701 +Ddtgahd|Onhdadj|NJ|7322657732 +Ecpgahd|Tkhdadj|NJ|9082253245 +Advgahd|Dchdadj|NJ|7322856701 +Ddugahd|Obhdadj|NJ|7322758732 +Ecqgahd|Tmhdadj|NJ|9082354345 +Adxgahd|Dehdadj|NJ|7322306711 +Eadgahd|Ryhdadj|NJ|7320300745 +Edsgahd|Tdhdadj|NJ|9082552019 +Adygahd|Dfhdadj|NJ|7322316711 +Ebegahd|Rxhdadj|NJ|7321311745 +Edtgahd|Unhdadj|NJ|9082657609 +Bbegahd|Axhdadj|NJ|7321351711 +Ebfgahd|Rwhdadj|NJ|7322322745 +Edxgahd|Uehdadj|NJ|9082306109 +Bckgahd|Fihdadj|NJ|7327357700 +Ebhgahd|Rthdadj|NJ|7324344745 +Fbegahd|Vxhdadj|NJ|9082611719 +Bcmgahd|Fxhdadj|NJ|7329359700 +Eckgahd|Sihdadj|NJ|7327387745 +Fbggahd|Vuhdadj|NJ|9083333739 +Bcpgahd|Gkhdadj|NJ|7322256200 +Ecmgahd|Sxhdadj|NJ|7329359745 +Fbhgahd|Vthdadj|NJ|9084344749 +Bdsgahd|Gdhdadj|NJ|7322552010 +Ecogahd|Tahdadj|NJ|7322152145 +Fckgahd|Wihdadj|NJ|9087387779 +Bdugahd|Gbhdadj|NJ|7322756700 +Ecrgahd|Tbhdadj|NJ|7322455445 +Fcogahd|Wahdadj|NJ|9082152181 +Bdwgahd|Hdhdadj|NJ|7322956900 +Edugahd|Ubhdadj|NJ|7322758709 +Fdsgahd|Xdhdadj|NJ|9082556585 +Bdzgahd|Hghdadj|NJ|7322326729 +Edvgahd|Uchdadj|NJ|7322859809 +Fdugahd|Xbhdadj|NJ|9082758787 +Cbigahd|Ishdadj|NJ|7325356712 +Edzgahd|Vghdadj|NJ|7322326329 +Fdvgahd|Xchdadj|NJ|9082859888 +Ccjgahd|Jphdadj|NJ|7326356712 +Fadgahd|Vyhdadj|NJ|7320300709 +Fdwgahd|Xdhdadj|NJ|9082956989 +Cckgahd|Jihdadj|NJ|7327356712 +Fbigahd|Wshdadj|NJ|7325355759 +Fdxgahd|Xehdadj|NJ|9080306109 +Cclgahd|Jbhdadj|NJ|7328356721 +Fcjgahd|Wphdadj|NJ|7326376769 +Gbfgahd|Ywhdadj|NJ|9082322729 +Ccrgahd|Kbhdadj|NJ|7322456721 +Fclgahd|Wbhdadj|NJ|7322018789 +Gbhgahd|Ythdadj|NJ|9084344749 +Cdsgahd|Kdhdadj|NJ|7322556721 +Fcngahd|Wghdadj|NJ|7322055180 +Gclgahd|Zbhdadj|NJ|9082018789 +Cdxgahd|Lehdadj|NJ|7322306721 +Fcpgahd|Wkhdadj|NJ|7322253282 +Gcqgahd|Zmhdadj|NJ|9082354383 +Dbhgahd|Mthdadj|NJ|7324346722 +Fdtgahd|Xnhdadj|NJ|7322657686 +Gcrgahd|Zbhdadj|NJ|9082455484 +Dbigahd|Nshdadj|NJ|7325356722 +Fdygahd|Yfhdadj|NJ|7321316219 +Gdvgahd|Achdadj|NJ|9082859888 +Dclgahd|Nbhdadj|NJ|7322016732 +Gbigahd|Zshdadj|NJ|7325355759 +Gdygahd|Afhdadj|NJ|9082616219 +Dcqgahd|Omhdadj|NJ|7322354732 +Gckgahd|Zihdadj|NJ|7327387779 +Hbegahd|Bxhdadj|NJ|9731356799 +Ddvgahd|Ochdadj|NJ|7322859732 +Gcmgahd|Zxhdadj|NJ|7329359799 +Hbfgahd|Bwhdadj|NJ|9732356799 +Ddwgahd|Odhdadj|NJ|7322956045 +Gcogahd|Zahdadj|NJ|7322152181 +Hdugahd|Cbhdadj|NJ|9732756767 +Ebigahd|Sshdadj|NJ|7325355745 +Gcpgahd|Zkhdadj|NJ|7322253282 +Iadgahd|Dyhdadj|NJ|9730350767 +Ecjgahd|Sphdadj|NJ|7326376745 +Gdtgahd|Anhdadj|NJ|7322657686 +Ibhgahd|Dthdadj|NJ|9734354778 +Eclgahd|Sbhdadj|NJ|7322018745 +Gdugahd|Abhdadj|NJ|7322758787 +Icjgahd|Dphdadj|NJ|9736356778 +Ecngahd|Sghdadj|NJ|7322055145 +Gdwgahd|Adhdadj|NJ|7322956989 +Iclgahd|Ebhdadj|NJ|9738358778 +Edwgahd|Udhdadj|NJ|7322956909 +Gdxgahd|Aehdadj|NJ|7320306109 +Icmgahd|Exhdadj|NJ|9739359778 +Edygahd|Vfhdadj|NJ|7322316219 +Hadgahd|Byhdadj|NJ|5510356799 +Idygahd|Gfhdadj|NJ|9732316719 +Fbfgahd|Vwhdadj|NJ|7322322729 +Hbigahd|Bshdadj|NJ|5515356799 +Idzgahd|Gghdadj|NJ|9732326729 +Fcmgahd|Wxhdadj|NJ|7329359799 +Hcjgahd|Bphdadj|NJ|5516356799 +Jbggahd|Guhdadj|NJ|9733356701 +Fcqgahd|Xmhdadj|NJ|7322354383 +Hckgahd|Bihdadj|NJ|5517356799 +Jbhgahd|Gthdadj|NJ|9734356701 +Fcrgahd|Xbhdadj|NJ|7322455484 +Hclgahd|Bbhdadj|NJ|5518356799 +Jcjgahd|Gphdadj|NJ|9736356701 +Fdzgahd|Yghdadj|NJ|7322326329 +Hcngahd|Bghdadj|NJ|5512056799 +Jcmgahd|Hxhdadj|NJ|9739356701 +Gadgahd|Yyhdadj|NJ|7320300709 +Hcpgahd|Ckhdadj|NJ|5512256767 +Jcngahd|Hghdadj|NJ|9732056755 +Gbegahd|Yxhdadj|NJ|7321311719 +Hdsgahd|Cdhdadj|NJ|5512556767 +Jdtgahd|Inhdadj|NJ|9730156755 +Gbggahd|Yuhdadj|NJ|7323333739 +Hdtgahd|Cnhdadj|NJ|5512656767 +Jdvgahd|Ichdadj|NJ|9732856755 +Gcjgahd|Zphdadj|NJ|7326376769 +Hdzgahd|Dghdadj|NJ|5512326767 +Jdwgahd|Idhdadj|NJ|9732956755 +Gcngahd|Zghdadj|NJ|7322055180 +Ibegahd|Dxhdadj|NJ|5511351778 +Kckgahd|Jihdadj|NJ|9737973704 +Gdsgahd|Adhdadj|NJ|7322556585 +Ibfgahd|Dwhdadj|NJ|5512732778 +Kcngahd|Jghdadj|NJ|9732051704 +Gdzgahd|Aghdadj|NJ|7322326329 +Ibigahd|Dshdadj|NJ|5515355778 +Kcogahd|Kahdadj|NJ|9732152704 +Hbggahd|Buhdadj|NJ|5513356799 +Icngahd|Eghdadj|NJ|5512056078 +Kdvgahd|Kchdadj|NJ|9732859766 +Hbhgahd|Bthdadj|NJ|5514356799 +Icpgahd|Ekhdadj|NJ|5512256278 +Kdwgahd|Ldhdadj|NJ|9732956066 +Hcmgahd|Bxhdadj|NJ|5519356799 +Icqgahd|Emhdadj|NJ|5512356356 +Ladgahd|Lyhdadj|NJ|9730300766 +Hcogahd|Bahdadj|NJ|5512156799 +Idugahd|Fbhdadj|NJ|5512756756 +Lbggahd|Luhdadj|NJ|9733333729 +Hcqgahd|Cmhdadj|NJ|5512356767 +Jadgahd|Gyhdadj|NJ|5510356701 +Lbhgahd|Lthdadj|NJ|9734344729 +Hcrgahd|Cbhdadj|NJ|5512456767 +Jbegahd|Gxhdadj|NJ|5511356701 +Lcjgahd|Lphdadj|NJ|9736376729 +Hdvgahd|Cchdadj|NJ|5512856767 +Jbfgahd|Gwhdadj|NJ|5512356701 +Lclgahd|Mbhdadj|NJ|9732018729 +Hdwgahd|Cdhdadj|NJ|5512956767 +Jbigahd|Gshdadj|NJ|5515356701 +Lcngahd|Mghdadj|NJ|9732055129 +Hdxgahd|Cehdadj|NJ|5512306767 +Jckgahd|Hihdadj|NJ|5517356701 +Lcogahd|Mahdadj|NJ|9732152129 +Hdygahd|Dfhdadj|NJ|5512316767 +Jclgahd|Hbhdadj|NJ|5518356701 +Lcpgahd|Mkhdadj|NJ|9732253229 +Ibggahd|Duhdadj|NJ|5513353778 +Jcrgahd|Hbhdadj|NJ|5512456755 +Lcrgahd|Mbhdadj|NJ|9732455429 +Ickgahd|Eihdadj|NJ|5517357778 +Jdsgahd|Hdhdadj|NJ|5512556755 +Ldtgahd|Mnhdadj|NJ|9730157629 +Icogahd|Eahdadj|NJ|5512120178 +Jdzgahd|Ighdadj|NJ|5512326755 +Ldugahd|Mbhdadj|NJ|9732758729 +Icrgahd|Fbhdadj|NJ|5512456456 +Kadgahd|Iyhdadj|NJ|5510306704 +Madgahd|Nyhdadj|NJ|9730300709 +Idsgahd|Fdhdadj|NJ|5512556556 +Kbegahd|Ixhdadj|NJ|5511316704 +Mbggahd|Nuhdadj|NJ|9733333739 +Idtgahd|Fnhdadj|NJ|5512656656 +Kbfgahd|Jwhdadj|NJ|5512326704 +Mbhgahd|Nthdadj|NJ|9734344749 +Idvgahd|Fchdadj|NJ|5512856856 +Kbigahd|Jshdadj|NJ|5515356704 +Mcjgahd|Nphdadj|NJ|9736376769 +Idwgahd|Fdhdadj|NJ|5512956956 +Kcjgahd|Jphdadj|NJ|5516376704 +Mcpgahd|Okhdadj|NJ|9732253282 +Idxgahd|Fehdadj|NJ|5512306709 +Kclgahd|Jbhdadj|NJ|5512016704 +Mdsgahd|Odhdadj|NJ|9732556585 +Jcogahd|Hahdadj|NJ|5512156755 +Kcqgahd|Kmhdadj|NJ|5512354766 +Mdwgahd|Pdhdadj|NJ|9732956989 +Jcpgahd|Hkhdadj|NJ|5512256755 +Kcrgahd|Kbhdadj|NJ|5512455766 +Mdygahd|Pfhdadj|NJ|9731316219 +Jcqgahd|Hmhdadj|NJ|5512356755 +Kdsgahd|Kdhdadj|NJ|5512556766 +Mdzgahd|Pghdadj|NJ|9732326329 +Jdugahd|Ibhdadj|NJ|5512756755 +Kdugahd|Kbhdadj|NJ|5512758766 +Nadgahd|Pyhdadj|NJ|9730300709 +Jdxgahd|Iehdadj|NJ|5512306755 +Kdzgahd|Lghdadj|NJ|5512326366 +Nbfgahd|Pwhdadj|NJ|9732322729 +Jdygahd|Ifhdadj|NJ|5512316755 +Lbegahd|Lxhdadj|NJ|5511311766 +Nbggahd|Puhdadj|NJ|9733333739 +Kbggahd|Juhdadj|NJ|5513336704 +Ldsgahd|Mdhdadj|NJ|5512556529 +Nbhgahd|Pthdadj|NJ|9734344749 +Kbhgahd|Jthdadj|NJ|5514346704 +Ldvgahd|Nchdadj|NJ|5512859829 +Ncmgahd|Qxhdadj|NJ|9739359799 +Kcmgahd|Jxhdadj|NJ|5519350704 +Ldwgahd|Ndhdadj|NJ|5512956929 +Ncogahd|Qahdadj|NJ|9732152181 +Kcpgahd|Kkhdadj|NJ|5512253704 +Ldygahd|Nfhdadj|NJ|5512316219 +Ncpgahd|Qkhdadj|NJ|9732253282 +Kdtgahd|Knhdadj|NJ|5512657766 +Mbfgahd|Nwhdadj|NJ|5512322729 +Ndwgahd|Qdhdadj|NJ|9732956989 +Kdxgahd|Lehdadj|NJ|5512306166 +Mclgahd|Obhdadj|NJ|5512018789 +Oadgahd|Ryhdadj|NJ|2010356776 +Kdygahd|Lfhdadj|NJ|5512312016 +Mcmgahd|Oxhdadj|NJ|5519359799 +Obegahd|Rxhdadj|NJ|2011356776 +Lbfgahd|Lwhdadj|NJ|5512322766 +Mcqgahd|Omhdadj|NJ|5512354383 +Obfgahd|Rwhdadj|NJ|2012356776 +Lbigahd|Lshdadj|NJ|5515355729 +Mcrgahd|Obhdadj|NJ|5512455484 +Ocjgahd|Sphdadj|NJ|2016356776 +Lckgahd|Mihdadj|NJ|5517387729 +Mdxgahd|Pehdadj|NJ|5510306109 +Ockgahd|Sihdadj|NJ|2017356776 +Lcmgahd|Mxhdadj|NJ|5519359729 +Ncjgahd|Pphdadj|NJ|5516376769 +Ocngahd|Sghdadj|NJ|2012056776 +Lcqgahd|Mmhdadj|NJ|5512354329 +Nckgahd|Pihdadj|NJ|5517387779 +Odtgahd|Snhdadj|NJ|2012656776 +Ldxgahd|Nehdadj|NJ|5512306109 +Ncrgahd|Qbhdadj|NJ|5512455484 +Odwgahd|Tdhdadj|NJ|2012956776 +Ldzgahd|Nghdadj|NJ|5512326329 +Ndtgahd|Qnhdadj|NJ|5512657686 +Pbhgahd|Tthdadj|NJ|2014354767 +Mbegahd|Nxhdadj|NJ|5511311719 +Ndugahd|Qbhdadj|NJ|5512758787 +Pcogahd|Uahdadj|NJ|2012120167 +Mbigahd|Nshdadj|NJ|5515355759 +Ndvgahd|Qchdadj|NJ|5512859888 +Pcqgahd|Umhdadj|NJ|2012356367 +Mckgahd|Nihdadj|NJ|5517387779 +Ndygahd|Rfhdadj|NJ|5511316219 +Pcrgahd|Ubhdadj|NJ|2012456467 +Mcngahd|Oghdadj|NJ|5512055180 +Ndzgahd|Rghdadj|NJ|5512326329 +Pdtgahd|Unhdadj|NJ|2012656600 +Mcogahd|Oahdadj|NJ|5512152181 +Obggahd|Ruhdadj|NJ|2013356776 +Pdvgahd|Uchdadj|NJ|2012856800 +Mdtgahd|Onhdadj|NJ|5512657686 +Obigahd|Rshdadj|NJ|2015356776 +Rbegahd|Vxhdadj|NJ|2011356700 +Mdugahd|Obhdadj|NJ|5512758787 +Oclgahd|Sbhdadj|NJ|2018356776 +Rbfgahd|Vwhdadj|NJ|2012356700 +Mdvgahd|Ochdadj|NJ|5512859888 +Ocmgahd|Sxhdadj|NJ|2019356776 +Rckgahd|Vihdadj|NJ|2017356700 +Nbegahd|Pxhdadj|NJ|5511311719 +Ocogahd|Sahdadj|NJ|2012156776 +Rclgahd|Wbhdadj|NJ|2018356700 +Nbigahd|Pshdadj|NJ|5515355759 +Ocqgahd|Smhdadj|NJ|2012356776 +Rcmgahd|Wxhdadj|NJ|2019356700 +Nclgahd|Qbhdadj|NJ|5512018789 +Odugahd|Tbhdadj|NJ|2012756776 +Rcogahd|Wahdadj|NJ|2012156700 +Ncngahd|Qghdadj|NJ|5512055180 +Padgahd|Tyhdadj|NJ|2010350767 +Rcqgahd|Wmhdadj|NJ|2012356706 +Ncqgahd|Qmhdadj|NJ|5512354383 +Pbfgahd|Twhdadj|NJ|2012732767 +Rdsgahd|Wdhdadj|NJ|2012556706 +Ndsgahd|Qdhdadj|NJ|5512556585 +Pbggahd|Tuhdadj|NJ|2013353767 +Rdtgahd|Wnhdadj|NJ|2012656706 +Ndxgahd|Rehdadj|NJ|5510306109 +Pcjgahd|Uphdadj|NJ|2016356767 +Rdwgahd|Wdhdadj|NJ|2012956706 +Obhgahd|Rthdadj|NJ|2014356776 +Pckgahd|Uihdadj|NJ|2017357767 +Scjgahd|Xphdadj|NJ|2016376740 +Ocpgahd|Skhdadj|NJ|2012256776 +Pcngahd|Ughdadj|NJ|2012056067 +Scmgahd|Xxhdadj|NJ|2019350740 +Ocrgahd|Sbhdadj|NJ|2012456776 +Pdugahd|Ubhdadj|NJ|2012756700 +Scrgahd|Ybhdadj|NJ|2012455740 +Odsgahd|Sdhdadj|NJ|2012556776 +Pdxgahd|Vehdadj|NJ|2012306709 +Sdtgahd|Ynhdadj|NJ|2012657740 +Odvgahd|Tchdadj|NJ|2012856776 +Pdygahd|Vfhdadj|NJ|2012316719 +Sdugahd|Ybhdadj|NJ|2012758740 +Odxgahd|Tehdadj|NJ|2012306767 +Rbggahd|Vuhdadj|NJ|2013356700 +Sdygahd|Yfhdadj|NJ|2012316233 +Odygahd|Tfhdadj|NJ|2012316767 +Rbigahd|Vshdadj|NJ|2015356700 +Uadgahd|Zyhdadj|NJ|2010300733 +Odzgahd|Tghdadj|NJ|2012326767 +Rcjgahd|Vphdadj|NJ|2016356700 +Ubegahd|Zxhdadj|NJ|2011311733 +Pbegahd|Txhdadj|NJ|2011351767 +Sbfgahd|Xwhdadj|NJ|2012326706 +Ubigahd|Zshdadj|NJ|2015355733 +Pbigahd|Tshdadj|NJ|2015355767 +Sbggahd|Xuhdadj|NJ|2013336706 +Uclgahd|Zbhdadj|NJ|2012018733 +Pclgahd|Ubhdadj|NJ|2018358767 +Sbigahd|Xshdadj|NJ|2015356740 +Ucmgahd|Axhdadj|NJ|2019359733 +Pcmgahd|Uxhdadj|NJ|2019359767 +Scngahd|Xghdadj|NJ|2012051740 +Ucqgahd|Amhdadj|NJ|2012354333 +Pcpgahd|Ukhdadj|NJ|2012252017 +Scpgahd|Ykhdadj|NJ|2012253740 +Udtgahd|Anhdadj|NJ|2012657633 +Pdsgahd|Udhdadj|NJ|2012552010 +Scqgahd|Ymhdadj|NJ|2012354740 +Udugahd|Abhdadj|NJ|2012758733 +Pdwgahd|Udhdadj|NJ|2012956900 +Sdzgahd|Yghdadj|NJ|2012326333 +Udxgahd|Aehdadj|NJ|2012306109 +Pdzgahd|Vghdadj|NJ|2012326729 +Ubggahd|Zuhdadj|NJ|2013333733 +Vbggahd|Buhdadj|NJ|2013333739 +Radgahd|Vyhdadj|NJ|2010356700 +Ubhgahd|Zthdadj|NJ|2014344733 +Vcngahd|Cghdadj|NJ|2012055180 +Rbhgahd|Vthdadj|NJ|2014356700 +Uckgahd|Zihdadj|NJ|2017387733 +Vcogahd|Cahdadj|NJ|2012152181 +Rcngahd|Wghdadj|NJ|2012056700 +Ucngahd|Aghdadj|NJ|2012055133 +Vcrgahd|Cbhdadj|NJ|2012455484 +Rcpgahd|Wkhdadj|NJ|2012256706 +Ucogahd|Aahdadj|NJ|2012152133 +Vdsgahd|Cdhdadj|NJ|2012556585 +Rcrgahd|Wbhdadj|NJ|2012456706 +Ucrgahd|Abhdadj|NJ|2012455433 +Vdtgahd|Cnhdadj|NJ|2012657686 +Rdugahd|Wbhdadj|NJ|2012756706 +Udsgahd|Adhdadj|NJ|2012556533 +Wbegahd|Dxhdadj|NJ|2011311719 +Rdvgahd|Wchdadj|NJ|2012856706 +Udwgahd|Adhdadj|NJ|2012956933 +Wbigahd|Dshdadj|NJ|2015355759 +Rdxgahd|Wehdadj|NJ|2012306706 +Udzgahd|Bghdadj|NJ|2012326329 +Wckgahd|Dihdadj|NJ|2017387779 +Rdygahd|Wfhdadj|NJ|2012316706 +Vbfgahd|Bwhdadj|NJ|2012322729 +Wclgahd|Dbhdadj|NJ|2012018789 +Rdzgahd|Wghdadj|NJ|2012326706 +Vcjgahd|Bphdadj|NJ|2016376769 +Wcngahd|Dghdadj|NJ|2012055180 +Sadgahd|Xyhdadj|NJ|2010306706 +Vcmgahd|Cxhdadj|NJ|2019359799 +Wcrgahd|Ebhdadj|NJ|2012455484 +Sbegahd|Xxhdadj|NJ|2011316706 +Vcpgahd|Ckhdadj|NJ|2012253282 +Wdsgahd|Edhdadj|NJ|2012556585 +Sbhgahd|Xthdadj|NJ|2014346706 +Vdxgahd|Cehdadj|NJ|2010306109 +Wdtgahd|Enhdadj|NJ|2012657686 +Sckgahd|Xihdadj|NJ|2017973740 +Vdygahd|Cfhdadj|NJ|2011316219 +Wdwgahd|Edhdadj|NJ|2012956989 +Sclgahd|Xbhdadj|NJ|2012016740 +Vdzgahd|Cghdadj|NJ|2012326329 +Wdzgahd|Eghdadj|NJ|2012326329 +Scogahd|Yahdadj|NJ|2012152740 +Wadgahd|Dyhdadj|NJ|2010300709 +Xadgahd|Eyhdadj|NJ|9730356790 +Sdsgahd|Ydhdadj|NJ|2012556740 +Wbggahd|Duhdadj|NJ|2013333739 +Xclgahd|Fbhdadj|NJ|9738356790 +Sdvgahd|Ychdadj|NJ|2012859740 +Wcjgahd|Dphdadj|NJ|2016376769 +Xcogahd|Fahdadj|NJ|9732156790 +Sdwgahd|Ydhdadj|NJ|2012956040 +Wcmgahd|Dxhdadj|NJ|2019359799 +Xcqgahd|Fmhdadj|NJ|9732356779 +Sdxgahd|Yehdadj|NJ|2012306140 +Wdvgahd|Echdadj|NJ|2012859888 +Xcrgahd|Fbhdadj|NJ|9732456779 +Ubfgahd|Zwhdadj|NJ|2012322733 +Wdygahd|Efhdadj|NJ|2011316219 +Xdtgahd|Fnhdadj|NJ|9730156779 +Ucjgahd|Zphdadj|NJ|2016376733 +Xbegahd|Exhdadj|NJ|5511356790 +Xdzgahd|Fghdadj|NJ|9732326779 +Ucpgahd|Akhdadj|NJ|2012253233 +Xbfgahd|Ewhdadj|NJ|5512356790 +Ybggahd|Guhdadj|NJ|9733353779 +Udvgahd|Achdadj|NJ|2012859833 +Xbggahd|Euhdadj|NJ|5513356790 +Ycmgahd|Gxhdadj|NJ|9739359744 +Udygahd|Bfhdadj|NJ|2012316219 +Xbhgahd|Ethdadj|NJ|5514356790 +Ycngahd|Gghdadj|NJ|9732056044 +Vadgahd|Byhdadj|NJ|2010300709 +Xcjgahd|Ephdadj|NJ|5516356790 +Ycrgahd|Gbhdadj|NJ|9732456444 +Vbegahd|Bxhdadj|NJ|2011311719 +Xcngahd|Fghdadj|NJ|5512056790 +Ydugahd|Hbhdadj|NJ|9732756744 +Vbhgahd|Bthdadj|NJ|2014344749 +Xdsgahd|Fdhdadj|NJ|5512556779 +Zbggahd|Huhdadj|NJ|9733356766 +Vbigahd|Bshdadj|NJ|2015355759 +Xdugahd|Fbhdadj|NJ|5512756779 +Zbigahd|Ishdadj|NJ|9735356766 +Vckgahd|Bihdadj|NJ|2017387779 +Xdygahd|Ffhdadj|NJ|5512316779 +Zckgahd|Iihdadj|NJ|9737356766 +Vclgahd|Bbhdadj|NJ|2012018789 +Yadgahd|Gyhdadj|NJ|5510350779 +Zclgahd|Ibhdadj|NJ|9738356766 +Vcqgahd|Cmhdadj|NJ|2012354383 +Ybegahd|Gxhdadj|NJ|5511351779 +Zcngahd|Ighdadj|NJ|9732056766 +Vdugahd|Cbhdadj|NJ|2012758787 +Ybfgahd|Gwhdadj|NJ|5512732779 +Zcqgahd|Imhdadj|NJ|9732356766 +Vdvgahd|Cchdadj|NJ|2012859888 +Ybhgahd|Gthdadj|NJ|5514354779 +Zcrgahd|Ibhdadj|NJ|9732456766 +Vdwgahd|Cdhdadj|NJ|2012956989 +Ycjgahd|Gphdadj|NJ|5516356779 +Zdsgahd|Idhdadj|NJ|9732556766 +Wbfgahd|Dwhdadj|NJ|2012322729 +Yclgahd|Gbhdadj|NJ|5518358744 +Zdtgahd|Inhdadj|NJ|9730156766 +Wbhgahd|Dthdadj|NJ|2014344749 +Ycpgahd|Gkhdadj|NJ|5512256244 +Zdugahd|Ibhdadj|NJ|9732756766 +Wcogahd|Dahdadj|NJ|2012152181 +Ydtgahd|Hnhdadj|NJ|5512656644 +Zdxgahd|Jehdadj|NJ|9732306751 +Wcpgahd|Dkhdadj|NJ|2012253282 +Ydwgahd|Hdhdadj|NJ|5512956944 +Zdzgahd|Jghdadj|NJ|9732326751 +Wcqgahd|Emhdadj|NJ|2012354383 +Ydxgahd|Hehdadj|NJ|5512306709 +Keggahd|Juhdadj|NJ|9733336751 +Wdugahd|Ebhdadj|NJ|2012758787 +Ydygahd|Hfhdadj|NJ|5512316719 +Kejgahd|Jphdadj|NJ|9736376751 +Wdxgahd|Eehdadj|NJ|2010306109 +Ydzgahd|Hghdadj|NJ|5512326729 +Kekgahd|Jihdadj|NJ|9737973751 +Xbigahd|Eshdadj|NJ|5515356790 +Zadgahd|Hyhdadj|NJ|5510356744 +Keogahd|Kahdadj|NJ|9732152751 +Xckgahd|Eihdadj|NJ|5517356790 +Zbfgahd|Hwhdadj|NJ|5512356744 +Kergahd|Kbhdadj|NJ|9732455762 +Xcmgahd|Fxhdadj|NJ|5519356790 +Zbhgahd|Hthdadj|NJ|5514356766 +Keugahd|Kbhdadj|NJ|9732758762 +Xcpgahd|Fkhdadj|NJ|5512256779 +Zcjgahd|Iphdadj|NJ|5516356766 +Kevgahd|Kchdadj|NJ|9732859762 +Xdvgahd|Fchdadj|NJ|5512856779 +Zcmgahd|Ixhdadj|NJ|5519356766 +Keygahd|Kfhdadj|NJ|9732312012 +Xdwgahd|Fdhdadj|NJ|5512956779 +Zdvgahd|Jchdadj|NJ|5512856751 +Lifgahd|Lwhdadj|NJ|9732322762 +Xdxgahd|Fehdadj|NJ|5512306779 +Kedgahd|Jyhdadj|NJ|5510306751 +Lihgahd|Lthdadj|NJ|9734344762 +Ybigahd|Gshdadj|NJ|5515355779 +Keegahd|Jxhdadj|NJ|5511316751 +Limgahd|Lxhdadj|NJ|9739359762 +Yckgahd|Gihdadj|NJ|5517357779 +Kehgahd|Jthdadj|NJ|5514346751 +Lingahd|Lghdadj|NJ|9732055188 +Ycogahd|Gahdadj|NJ|5512120144 +Kelgahd|Jbhdadj|NJ|5512016751 +Liogahd|Lahdadj|NJ|9732152188 +Ycqgahd|Gmhdadj|NJ|5512356344 +Keqgahd|Kmhdadj|NJ|5512354762 +Lisgahd|Mdhdadj|NJ|9732556588 +Ydsgahd|Hdhdadj|NJ|5512556544 +Ketgahd|Knhdadj|NJ|5512657762 +Livgahd|Mchdadj|NJ|9732859888 +Ydvgahd|Hchdadj|NJ|5512856844 +Kezgahd|Kghdadj|NJ|5512326362 +Liwgahd|Mdhdadj|NJ|9732956988 +Zbegahd|Hxhdadj|NJ|5511356744 +Liggahd|Luhdadj|NJ|5513333762 +Lixgahd|Mehdadj|NJ|9732306109 +Zcogahd|Iahdadj|NJ|5512156766 +Likgahd|Lihdadj|NJ|5517387762 +Mofgahd|Mwhdadj|NJ|9732322729 +Zcpgahd|Ikhdadj|NJ|5512256766 +Lilgahd|Lbhdadj|NJ|5512018762 +Moigahd|Mshdadj|NJ|9735355759 +Zdwgahd|Jdhdadj|NJ|5512956751 +Lipgahd|Lkhdadj|NJ|5512253288 +Mojgahd|Nphdadj|NJ|9736376769 +Zdygahd|Jfhdadj|NJ|5512316751 +Liygahd|Mfhdadj|NJ|5512316219 +Mokgahd|Nihdadj|NJ|9737387779 +Kefgahd|Jwhdadj|NJ|5512326751 +Moegahd|Mxhdadj|NJ|5511311719 +Molgahd|Nbhdadj|NJ|9732018789 +Keigahd|Jshdadj|NJ|5515356751 +Moggahd|Muhdadj|NJ|5513333739 +Moogahd|Nahdadj|NJ|9732152181 +Kemgahd|Kxhdadj|NJ|5519350751 +Mohgahd|Mthdadj|NJ|5514344749 +Morgahd|Nbhdadj|NJ|9732455484 +Kengahd|Kghdadj|NJ|5512051751 +Momgahd|Nxhdadj|NJ|5519359799 +Mougahd|Nbhdadj|NJ|9732758787 +Kepgahd|Kkhdadj|NJ|5512253751 +Moqgahd|Nmhdadj|NJ|5512354383 +Moxgahd|Nehdadj|NJ|9730306109 +Kesgahd|Kdhdadj|NJ|5512556762 +Motgahd|Nnhdadj|NJ|5512657686 +Moygahd|Ofhdadj|NJ|9731316219 +Kewgahd|Kdhdadj|NJ|5512956062 +Movgahd|Nchdadj|NJ|5512859888 +Nuegahd|Oxhdadj|NJ|9731311719 +Kexgahd|Kehdadj|NJ|5512306162 +Mozgahd|Oghdadj|NJ|5512326329 +Nuigahd|Oshdadj|NJ|9735355759 +Lidgahd|Lyhdadj|NJ|5510300762 +Nufgahd|Owhdadj|NJ|5512322729 +Nupgahd|Pkhdadj|NJ|9732253282 +Liegahd|Lxhdadj|NJ|5511311762 +Nuggahd|Ouhdadj|NJ|5513333739 +Nusgahd|Pdhdadj|NJ|9732556585 +Liigahd|Lshdadj|NJ|5515355762 +Nuhgahd|Othdadj|NJ|5514344749 +Nuvgahd|Pchdadj|NJ|9732859888 +Lijgahd|Lphdadj|NJ|5516376762 +Nukgahd|Oihdadj|NJ|5517387779 +Nuwgahd|Pdhdadj|NJ|9732956989 +Liqgahd|Lmhdadj|NJ|5512354388 +Nulgahd|Pbhdadj|NJ|5512018789 +Abegahd|Axhdadj|NJ|7321356710 +Lirgahd|Mbhdadj|NJ|5512455488 +Nuxgahd|Qehdadj|NJ|5510306109 +Abfgahd|Awhdadj|NJ|7322356710 +Litgahd|Mnhdadj|NJ|5512657688 +Nuygahd|Qfhdadj|NJ|5511316219 +Abggahd|Auhdadj|NJ|7323356710 +Liugahd|Mbhdadj|NJ|5512758788 +Badgahd|Eyhdadj|NJ|8480350711 +Abigahd|Ashdadj|NJ|7325356710 +Lizgahd|Mghdadj|NJ|5512326329 +Bbfgahd|Ewhdadj|NJ|8482732711 +Acjgahd|Bphdadj|NJ|7326356710 +Modgahd|Myhdadj|NJ|5510300709 +Bcjgahd|Fphdadj|NJ|8486356711 +Acngahd|Bghdadj|NJ|7322056701 +Mongahd|Nghdadj|NJ|5512055180 +Bclgahd|Fbhdadj|NJ|8488358700 +Acogahd|Bahdadj|NJ|7322156701 +Mopgahd|Nkhdadj|NJ|5512253282 +Bcogahd|Fahdadj|NJ|8482120100 +Acqgahd|Cmhdadj|NJ|7322356701 +Mosgahd|Ndhdadj|NJ|5512556585 +Bcqgahd|Gmhdadj|NJ|8482356300 +Acrgahd|Cbhdadj|NJ|7322456701 +Mowgahd|Ndhdadj|NJ|5512956989 +Bcrgahd|Gbhdadj|NJ|8482456400 +Adsgahd|Cdhdadj|NJ|7322556701 +Nudgahd|Oyhdadj|NJ|5510300709 +Bdvgahd|Gchdadj|NJ|8482856800 +Adugahd|Cbhdadj|NJ|7322756701 +Nujgahd|Ophdadj|NJ|5516376769 +Cadgahd|Iyhdadj|NJ|8480356712 +Adwgahd|Ddhdadj|NJ|7322956711 +Numgahd|Pxhdadj|NJ|5519359799 +Cbegahd|Ixhdadj|NJ|8480156712 +Adzgahd|Dghdadj|NJ|7322326711 +Nungahd|Pghdadj|NJ|5512055180 +Cbhgahd|Ithdadj|NJ|8484356712 +Bbggahd|Euhdadj|NJ|7323353711 +Nuogahd|Pahdadj|NJ|5512152181 +Ccmgahd|Jxhdadj|NJ|8489356721 +Bbhgahd|Ethdadj|NJ|7324354711 +Nuqgahd|Pmhdadj|NJ|5512354383 +Ccogahd|Jahdadj|NJ|8482156721 +Bbigahd|Eshdadj|NJ|7325355711 +Nurgahd|Pbhdadj|NJ|5512455484 +Ccpgahd|Kkhdadj|NJ|8482256721 +Bcngahd|Fghdadj|NJ|7322056000 +Nutgahd|Pnhdadj|NJ|5512657686 +Ccqgahd|Kmhdadj|NJ|8482356721 +Bdtgahd|Gnhdadj|NJ|7322656600 +Nuugahd|Pbhdadj|NJ|5512758787 +Cdwgahd|Ldhdadj|NJ|8482956721 +Bdxgahd|Hehdadj|NJ|7322306709 +Nuzgahd|Qghdadj|NJ|5512326329 +Cdzgahd|Lghdadj|NJ|8482326722 +Bdygahd|Hfhdadj|NJ|7322316719 +Aadgahd|Ayhdadj|NJ|8480356710 +Dbggahd|Muhdadj|NJ|8483336722 +Cbfgahd|Iwhdadj|NJ|7322356712 +Abhgahd|Athdadj|NJ|8484356710 +Dckgahd|Nihdadj|NJ|8487973722 +Cbggahd|Iuhdadj|NJ|7323356712 +Ackgahd|Bihdadj|NJ|8487356710 +Dcogahd|Nahdadj|NJ|8482152732 +Ccngahd|Jghdadj|NJ|7322056721 +Aclgahd|Bbhdadj|NJ|8488356710 +Dcrgahd|Obhdadj|NJ|8482455732 +Cdtgahd|Knhdadj|NJ|7322656721 +Acmgahd|Bxhdadj|NJ|8489356701 +Ddsgahd|Odhdadj|NJ|8482556732 +Cdugahd|Kbhdadj|NJ|7322756721 +Acpgahd|Bkhdadj|NJ|8482256701 +Ddtgahd|Onhdadj|NJ|8482657732 +Cdvgahd|Lchdadj|NJ|7322856721 +Adtgahd|Cnhdadj|NJ|8482656701 +Ddugahd|Obhdadj|NJ|8482758732 +Cdygahd|Lfhdadj|NJ|7322316722 +Advgahd|Dchdadj|NJ|8482856701 +Eadgahd|Ryhdadj|NJ|8480300745 +Dadgahd|Myhdadj|NJ|7320306722 +Adxgahd|Dehdadj|NJ|8482306711 +Ebegahd|Rxhdadj|NJ|8480111745 +Dbegahd|Mxhdadj|NJ|7321316722 +Adygahd|Dfhdadj|NJ|8482316711 +Ebfgahd|Rwhdadj|NJ|8482322745 +Dbfgahd|Mwhdadj|NJ|7322326722 +Bbegahd|Axhdadj|NJ|8480151711 +Ebhgahd|Rthdadj|NJ|8484344745 +Dcjgahd|Nphdadj|NJ|7326376722 +Bckgahd|Fihdadj|NJ|8487357700 +Eckgahd|Sihdadj|NJ|8487387745 +Dcmgahd|Nxhdadj|NJ|7329350732 +Bcmgahd|Fxhdadj|NJ|8489359700 +Ecmgahd|Sxhdadj|NJ|8489359745 +Dcngahd|Nghdadj|NJ|7322051732 +Bcpgahd|Gkhdadj|NJ|8482256200 +Ecogahd|Tahdadj|NJ|8482152145 +Dcpgahd|Nkhdadj|NJ|7322253732 +Bdsgahd|Gdhdadj|NJ|8482552010 +Ecrgahd|Tbhdadj|NJ|8482455445 +Ddxgahd|Pehdadj|NJ|7322306145 +Bdugahd|Gbhdadj|NJ|8482756700 +Edugahd|Ubhdadj|NJ|8482758709 +Ddygahd|Pfhdadj|NJ|7322316245 +Bdwgahd|Hdhdadj|NJ|8482956900 +Edvgahd|Uchdadj|NJ|8482859809 +Ddzgahd|Pghdadj|NJ|7322326345 +Bdzgahd|Hghdadj|NJ|8482326729 +Edzgahd|Vghdadj|NJ|8482326329 +Ebggahd|Ruhdadj|NJ|7323333745 +Cbigahd|Ishdadj|NJ|8485356712 +Fadgahd|Vyhdadj|NJ|8480300709 +Ecpgahd|Tkhdadj|NJ|7322253245 +Ccjgahd|Jphdadj|NJ|8486356712 +Fbigahd|Wshdadj|NJ|8485355759 +Ecqgahd|Tmhdadj|NJ|7322354345 +Cckgahd|Jihdadj|NJ|8487356712 +Fcjgahd|Wphdadj|NJ|8486376769 +Edsgahd|Tdhdadj|NJ|7322552019 +Cclgahd|Jbhdadj|NJ|8488356721 +Fclgahd|Wbhdadj|NJ|8482018789 +Edtgahd|Unhdadj|NJ|7322657609 +Ccrgahd|Kbhdadj|NJ|8482456721 +Fcngahd|Wghdadj|NJ|8482031080 +Edxgahd|Uehdadj|NJ|7322306109 +Cdsgahd|Kdhdadj|NJ|8482556721 +Fcpgahd|Wkhdadj|NJ|8482253282 +Fbegahd|Vxhdadj|NJ|7321311719 +Cdxgahd|Lehdadj|NJ|8482306721 +Fdtgahd|Xnhdadj|NJ|8482657686 +Fbggahd|Vuhdadj|NJ|7323333739 +Dbhgahd|Mthdadj|NJ|8484346722 +Fdygahd|Yfhdadj|NJ|8480116219 +Fbhgahd|Vthdadj|NJ|7324344749 +Dbigahd|Nshdadj|NJ|8485356722 +Gbigahd|Zshdadj|NJ|8485355759 +Fckgahd|Wihdadj|NJ|7327387779 +Dclgahd|Nbhdadj|NJ|8482016732 +Gckgahd|Zihdadj|NJ|8487387779 +Fcogahd|Wahdadj|NJ|7322152181 +Dcqgahd|Omhdadj|NJ|8482354732 +Gcmgahd|Zxhdadj|NJ|8489359799 +Fdsgahd|Xdhdadj|NJ|7322556585 +Ddvgahd|Ochdadj|NJ|8482859732 +Gcogahd|Zahdadj|NJ|8482152181 +Fdugahd|Xbhdadj|NJ|7322758787 +Ddwgahd|Odhdadj|NJ|8482956045 +Gcpgahd|Zkhdadj|NJ|8482253282 +Fdvgahd|Xchdadj|NJ|7322859888 +Ebigahd|Sshdadj|NJ|8485355745 +Gdtgahd|Anhdadj|NJ|8482657686 +Fdwgahd|Xdhdadj|NJ|7322956989 +Ecjgahd|Sphdadj|NJ|8486376745 +Gdugahd|Abhdadj|NJ|8482758787 +Fdxgahd|Xehdadj|NJ|7320306109 +Eclgahd|Sbhdadj|NJ|8482018745 +Gdwgahd|Adhdadj|NJ|8482956989 +Gbfgahd|Ywhdadj|NJ|7322322729 +Ecngahd|Sghdadj|NJ|8482031045 +Gdxgahd|Aehdadj|NJ|8480306109 +Gbhgahd|Ythdadj|NJ|7324344749 +Edwgahd|Udhdadj|NJ|8482956909 +Hadgahd|Byhdadj|NJ|2010356799 +Gclgahd|Zbhdadj|NJ|7322018789 +Edygahd|Vfhdadj|NJ|8482316219 +Hbigahd|Bshdadj|NJ|2015356799 +Gcqgahd|Zmhdadj|NJ|7322354383 +Fbfgahd|Vwhdadj|NJ|8482322729 +Hcjgahd|Bphdadj|NJ|2016356799 +Gcrgahd|Zbhdadj|NJ|7322455484 +Fcmgahd|Wxhdadj|NJ|8489359799 +Hckgahd|Bihdadj|NJ|2017356799 +Gdvgahd|Achdadj|NJ|7322859888 +Fcqgahd|Xmhdadj|NJ|8482354383 +Hclgahd|Bbhdadj|NJ|2018356799 +Gdygahd|Afhdadj|NJ|7321316219 +Fcrgahd|Xbhdadj|NJ|8482455484 +Hcngahd|Bghdadj|NJ|2012056799 +Hbegahd|Bxhdadj|NJ|5511356799 +Fdzgahd|Yghdadj|NJ|8482326329 +Hcpgahd|Ckhdadj|NJ|2012256767 +Hbfgahd|Bwhdadj|NJ|5512356799 +Gadgahd|Yyhdadj|NJ|8480300709 +Hdsgahd|Cdhdadj|NJ|2012556767 +Hdugahd|Cbhdadj|NJ|5512756767 +Gbegahd|Yxhdadj|NJ|8480111719 +Hdtgahd|Cnhdadj|NJ|2012656767 +Iadgahd|Dyhdadj|NJ|5510350767 +Gbggahd|Yuhdadj|NJ|8483333739 +Hdzgahd|Dghdadj|NJ|2012326767 +Ibhgahd|Dthdadj|NJ|5514354778 +Gcjgahd|Zphdadj|NJ|8486376769 +Ibegahd|Dxhdadj|NJ|2011351778 +Icjgahd|Dphdadj|NJ|5516356778 +Gcngahd|Zghdadj|NJ|8482031080 +Ibfgahd|Dwhdadj|NJ|2012732778 +Iclgahd|Ebhdadj|NJ|5518358778 +Gdsgahd|Adhdadj|NJ|8482556585 +Ibigahd|Dshdadj|NJ|2015355778 +Icmgahd|Exhdadj|NJ|5519359778 +Gdzgahd|Aghdadj|NJ|8482326329 +Icngahd|Eghdadj|NJ|2012056078 +Idygahd|Gfhdadj|NJ|5512316719 +Hbggahd|Buhdadj|NJ|2013356799 +Icpgahd|Ekhdadj|NJ|2012256278 +Idzgahd|Gghdadj|NJ|5512326729 +Hbhgahd|Bthdadj|NJ|2014356799 +Icqgahd|Emhdadj|NJ|2012356356 +Jbggahd|Guhdadj|NJ|5513356701 +Hcmgahd|Bxhdadj|NJ|2019356799 +Idugahd|Fbhdadj|NJ|2012756756 +Jbhgahd|Gthdadj|NJ|5514356701 +Hcogahd|Bahdadj|NJ|2012156799 +Jadgahd|Gyhdadj|NJ|2010356701 +Jcjgahd|Gphdadj|NJ|5516356701 +Hcqgahd|Cmhdadj|NJ|2012356767 +Jbegahd|Gxhdadj|NJ|2011356701 +Jcmgahd|Hxhdadj|NJ|5519356701 +Hcrgahd|Cbhdadj|NJ|2012456767 +Jbfgahd|Gwhdadj|NJ|2012356701 +Jcngahd|Hghdadj|NJ|5512056755 +Hdvgahd|Cchdadj|NJ|2012856767 +Jbigahd|Gshdadj|NJ|2015356701 +Jdtgahd|Inhdadj|NJ|5512656755 +Hdwgahd|Cdhdadj|NJ|2012956767 +Jckgahd|Hihdadj|NJ|2017356701 +Jdvgahd|Ichdadj|NJ|5512856755 +Hdxgahd|Cehdadj|NJ|2012306767 +Jclgahd|Hbhdadj|NJ|2018356701 +Jdwgahd|Idhdadj|NJ|5512956755 +Hdygahd|Dfhdadj|NJ|2012316767 +Jcrgahd|Hbhdadj|NJ|2012456755 +Kckgahd|Jihdadj|NJ|5517973704 +Ibggahd|Duhdadj|NJ|2013353778 +Jdsgahd|Hdhdadj|NJ|2012556755 +Kcngahd|Jghdadj|NJ|5512051704 +Ickgahd|Eihdadj|NJ|2017357778 +Jdzgahd|Ighdadj|NJ|2012326755 +Kcogahd|Kahdadj|NJ|5512152704 +Icogahd|Eahdadj|NJ|2012120178 +Kadgahd|Iyhdadj|NJ|2010306704 +Kdvgahd|Kchdadj|NJ|5512859766 +Icrgahd|Fbhdadj|NJ|2012456456 +Kbegahd|Ixhdadj|NJ|2011316704 +Kdwgahd|Ldhdadj|NJ|5512956066 +Idsgahd|Fdhdadj|NJ|2012556556 +Kbfgahd|Jwhdadj|NJ|2012326704 +Ladgahd|Lyhdadj|NJ|5510300766 +Idtgahd|Fnhdadj|NJ|2012656656 +Kbigahd|Jshdadj|NJ|2015356704 +Lbggahd|Luhdadj|NJ|5513333729 +Idvgahd|Fchdadj|NJ|2012856856 +Kcjgahd|Jphdadj|NJ|2016376704 +Lbhgahd|Lthdadj|NJ|5514344729 +Idwgahd|Fdhdadj|NJ|2012956956 +Kclgahd|Jbhdadj|NJ|2012016704 +Lcjgahd|Lphdadj|NJ|5516376729 +Idxgahd|Fehdadj|NJ|2012306709 +Kcqgahd|Kmhdadj|NJ|2012354766 +Lclgahd|Mbhdadj|NJ|5512018729 +Jcogahd|Hahdadj|NJ|2012156755 +Kcrgahd|Kbhdadj|NJ|2012455766 +Lcngahd|Mghdadj|NJ|5512055129 +Jcpgahd|Hkhdadj|NJ|2012256755 +Kdsgahd|Kdhdadj|NJ|2012556766 +Lcogahd|Mahdadj|NJ|5512152129 +Jcqgahd|Hmhdadj|NJ|2012356755 +Kdugahd|Kbhdadj|NJ|2012758766 +Lcpgahd|Mkhdadj|NJ|5512253229 +Jdugahd|Ibhdadj|NJ|2012756755 +Kdzgahd|Lghdadj|NJ|2012326366 +Lcrgahd|Mbhdadj|NJ|5512455429 +Jdxgahd|Iehdadj|NJ|2012306755 +Lbegahd|Lxhdadj|NJ|2011311766 +Ldtgahd|Mnhdadj|NJ|5512657629 +Jdygahd|Ifhdadj|NJ|2012316755 +Ldsgahd|Mdhdadj|NJ|2012556529 +Ldugahd|Mbhdadj|NJ|5512758729 +Kbggahd|Juhdadj|NJ|2013336704 +Ldvgahd|Nchdadj|NJ|2012859829 +Madgahd|Nyhdadj|NJ|5510300709 +Kbhgahd|Jthdadj|NJ|2014346704 +Ldwgahd|Ndhdadj|NJ|2012956929 +Mbggahd|Nuhdadj|NJ|5513333739 +Kcmgahd|Jxhdadj|NJ|2019350704 +Ldygahd|Nfhdadj|NJ|2012316219 +Mbhgahd|Nthdadj|NJ|5514344749 +Kcpgahd|Kkhdadj|NJ|2012253704 +Mbfgahd|Nwhdadj|NJ|2012322729 +Mcjgahd|Nphdadj|NJ|5516376769 +Kdtgahd|Knhdadj|NJ|2012657766 +Mclgahd|Obhdadj|NJ|2012018789 +Mcpgahd|Okhdadj|NJ|5512253282 +Kdxgahd|Lehdadj|NJ|2012306166 +Mcmgahd|Oxhdadj|NJ|2019359799 +Mdsgahd|Odhdadj|NJ|5512556585 +Kdygahd|Lfhdadj|NJ|2012312016 +Mcqgahd|Omhdadj|NJ|2012354383 +Mdwgahd|Pdhdadj|NJ|5512956989 +Lbfgahd|Lwhdadj|NJ|2012322766 +Mcrgahd|Obhdadj|NJ|2012455484 +Mdygahd|Pfhdadj|NJ|5511316219 +Lbigahd|Lshdadj|NJ|2015355729 +Mdxgahd|Pehdadj|NJ|2010306109 +Mdzgahd|Pghdadj|NJ|5512326329 +Lckgahd|Mihdadj|NJ|2017387729 +Ncjgahd|Pphdadj|NJ|2016376769 +Nadgahd|Pyhdadj|NJ|5510300709 +Lcmgahd|Mxhdadj|NJ|2019359729 +Nckgahd|Pihdadj|NJ|2017387779 +Nbfgahd|Pwhdadj|NJ|5512322729 +Lcqgahd|Mmhdadj|NJ|2012354329 +Ncrgahd|Qbhdadj|NJ|2012455484 +Nbggahd|Puhdadj|NJ|5513333739 +Ldxgahd|Nehdadj|NJ|2012306109 +Ndtgahd|Qnhdadj|NJ|2012657686 +Nbhgahd|Pthdadj|NJ|5514344749 +Ldzgahd|Nghdadj|NJ|2012326329 +Ndugahd|Qbhdadj|NJ|2012758787 +Ncmgahd|Qxhdadj|NJ|5519359799 +Mbegahd|Nxhdadj|NJ|2011311719 +Ndvgahd|Qchdadj|NJ|2012859888 +Ncogahd|Qahdadj|NJ|5512152181 +Mbigahd|Nshdadj|NJ|2015355759 +Ndygahd|Rfhdadj|NJ|2011316219 +Ncpgahd|Qkhdadj|NJ|5512253282 +Mckgahd|Nihdadj|NJ|2017387779 +Ndzgahd|Rghdadj|NJ|2012326329 +Ndwgahd|Qdhdadj|NJ|5512956989 +Mcngahd|Oghdadj|NJ|2012031080 +Obggahd|Ruhdadj|NJ|2013356776 +Oadgahd|Ryhdadj|NJ|2010356776 +Mcogahd|Oahdadj|NJ|2012152181 +Obigahd|Rshdadj|NJ|2015356776 +Obegahd|Rxhdadj|NJ|2011356776 +Mdtgahd|Onhdadj|NJ|2012657686 +Oclgahd|Sbhdadj|NJ|2018356776 +Obfgahd|Rwhdadj|NJ|2012356776 +Mdugahd|Obhdadj|NJ|2012758787 +Ocmgahd|Sxhdadj|NJ|2019356776 +Ocjgahd|Sphdadj|NJ|2016356776 +Mdvgahd|Ochdadj|NJ|2012859888 +Ocogahd|Sahdadj|NJ|2012156776 +Ockgahd|Sihdadj|NJ|2017356776 +Nbegahd|Pxhdadj|NJ|2011311719 +Ocqgahd|Smhdadj|NJ|2012356776 +Ocngahd|Sghdadj|NJ|2012056776 +Nbigahd|Pshdadj|NJ|2015355759 +Odugahd|Tbhdadj|NJ|2012756776 +Odtgahd|Snhdadj|NJ|2012656776 +Nclgahd|Qbhdadj|NJ|2012018789 +Padgahd|Tyhdadj|NJ|2010350767 +Odwgahd|Tdhdadj|NJ|2012956776 +Ncngahd|Qghdadj|NJ|2012031080 +Pbfgahd|Twhdadj|NJ|2012732767 +Pbhgahd|Tthdadj|NJ|2014354767 +Ncqgahd|Qmhdadj|NJ|2012354383 +Pbggahd|Tuhdadj|NJ|2013353767 +Pcogahd|Uahdadj|NJ|2012120167 +Ndsgahd|Qdhdadj|NJ|2012556585 +Pcjgahd|Uphdadj|NJ|2016356767 +Pcqgahd|Umhdadj|NJ|2012356367 +Ndxgahd|Rehdadj|NJ|2010306109 +Pckgahd|Uihdadj|NJ|2017357767 +Pcrgahd|Ubhdadj|NJ|2012456467 +Obhgahd|Rthdadj|NJ|2014356776 +Pcngahd|Ughdadj|NJ|2012056067 +Pdtgahd|Unhdadj|NJ|2012656600 +Ocpgahd|Skhdadj|NJ|2012256776 +Pdugahd|Ubhdadj|NJ|2012756700 +Pdvgahd|Uchdadj|NJ|2012856800 +Ocrgahd|Sbhdadj|NJ|2012456776 +Pdxgahd|Vehdadj|NJ|2012306709 +Rbegahd|Vxhdadj|NJ|2011356700 +Odsgahd|Sdhdadj|NJ|2012556776 +Pdygahd|Vfhdadj|NJ|2012316719 +Rbfgahd|Vwhdadj|NJ|2012356700 +Odvgahd|Tchdadj|NJ|2012856776 +Rbggahd|Vuhdadj|NJ|2013356700 +Rckgahd|Vihdadj|NJ|2017356700 +Odxgahd|Tehdadj|NJ|2012306767 +Rbigahd|Vshdadj|NJ|2015356700 +Rclgahd|Wbhdadj|NJ|2018356700 +Odygahd|Tfhdadj|NJ|2012316767 +Rcjgahd|Vphdadj|NJ|2016356700 +Rcmgahd|Wxhdadj|NJ|2019356700 +Odzgahd|Tghdadj|NJ|2012326767 +Sbfgahd|Xwhdadj|NJ|2012326706 +Rcogahd|Wahdadj|NJ|2012156700 +Pbegahd|Txhdadj|NJ|2011351767 +Sbggahd|Xuhdadj|NJ|2013336706 +Rcqgahd|Wmhdadj|NJ|2012356706 +Pbigahd|Tshdadj|NJ|2015355767 +Sbigahd|Xshdadj|NJ|2015356740 +Rdsgahd|Wdhdadj|NJ|2012556706 +Pclgahd|Ubhdadj|NJ|2018358767 +Scngahd|Xghdadj|NJ|2012051740 +Rdtgahd|Wnhdadj|NJ|2012656706 +Pcmgahd|Uxhdadj|NJ|2019359767 +Scpgahd|Ykhdadj|NJ|2012253740 +Rdwgahd|Wdhdadj|NJ|2012956706 +Pcpgahd|Ukhdadj|NJ|2012252017 +Scqgahd|Ymhdadj|NJ|2012354740 +Scjgahd|Xphdadj|NJ|2016376740 +Pdsgahd|Udhdadj|NJ|2012552010 +Sdzgahd|Yghdadj|NJ|2012326333 +Scmgahd|Xxhdadj|NJ|2019350740 +Pdwgahd|Udhdadj|NJ|2012956900 +Ubggahd|Zuhdadj|NJ|2013333733 +Scrgahd|Ybhdadj|NJ|2012455740 +Pdzgahd|Vghdadj|NJ|2012326729 +Ubhgahd|Zthdadj|NJ|2014344733 +Sdtgahd|Ynhdadj|NJ|2012657740 +Radgahd|Vyhdadj|NJ|2010356700 +Uckgahd|Zihdadj|NJ|2017387733 +Sdugahd|Ybhdadj|NJ|2012758740 +Rbhgahd|Vthdadj|NJ|2014356700 +Ucngahd|Aghdadj|NJ|2012031033 +Sdygahd|Yfhdadj|NJ|2012316233 +Rcngahd|Wghdadj|NJ|2012056700 +Ucogahd|Aahdadj|NJ|2012152133 +Uadgahd|Zyhdadj|NJ|2010300733 +Rcpgahd|Wkhdadj|NJ|2012256706 +Ucrgahd|Abhdadj|NJ|2012455433 +Ubegahd|Zxhdadj|NJ|2011311733 +Rcrgahd|Wbhdadj|NJ|2012456706 +Udsgahd|Adhdadj|NJ|2012556533 +Ubigahd|Zshdadj|NJ|2015355733 +Rdugahd|Wbhdadj|NJ|2012756706 +Udwgahd|Adhdadj|NJ|2012956933 +Uclgahd|Zbhdadj|NJ|2012018733 +Rdvgahd|Wchdadj|NJ|2012856706 +Udzgahd|Bghdadj|NJ|2012326329 +Ucmgahd|Axhdadj|NJ|2019359733 +Rdxgahd|Wehdadj|NJ|2012306706 +Vbfgahd|Bwhdadj|NJ|2012322729 +Ucqgahd|Amhdadj|NJ|2012354333 +Rdygahd|Wfhdadj|NJ|2012316706 +Vcjgahd|Bphdadj|NJ|2016376769 +Udtgahd|Anhdadj|NJ|2012657633 +Rdzgahd|Wghdadj|NJ|2012326706 +Vcmgahd|Cxhdadj|NJ|2019359799 +Udugahd|Abhdadj|NJ|2012758733 +Sadgahd|Xyhdadj|NJ|2010306706 +Vcpgahd|Ckhdadj|NJ|2012253282 +Udxgahd|Aehdadj|NJ|2012306109 +Sbegahd|Xxhdadj|NJ|2011316706 +Vdxgahd|Cehdadj|NJ|2010306109 +Vbggahd|Buhdadj|NJ|2013333739 +Sbhgahd|Xthdadj|NJ|2014346706 +Vdygahd|Cfhdadj|NJ|2011316219 +Vcngahd|Cghdadj|NJ|2012055180 +Sckgahd|Xihdadj|NJ|2017973740 +Vdzgahd|Cghdadj|NJ|2012326329 +Vcogahd|Cahdadj|NJ|2012152181 +Sclgahd|Xbhdadj|NJ|2012016740 +Wadgahd|Dyhdadj|NJ|2010300709 +Vcrgahd|Cbhdadj|NJ|2012455484 +Scogahd|Yahdadj|NJ|2012152740 +Wbggahd|Duhdadj|NJ|2013333739 +Vdsgahd|Cdhdadj|NJ|2012556585 +Sdsgahd|Ydhdadj|NJ|2012556740 +Wcjgahd|Dphdadj|NJ|2016376769 +Vdtgahd|Cnhdadj|NJ|2012657686 +Sdvgahd|Ychdadj|NJ|2012859740 +Wcmgahd|Dxhdadj|NJ|2019359799 +Wbegahd|Dxhdadj|NJ|2011311719 +Sdwgahd|Ydhdadj|NJ|2012956040 +Wdvgahd|Echdadj|NJ|2012859888 +Wbigahd|Dshdadj|NJ|2015355759 +Sdxgahd|Yehdadj|NJ|2012306140 +Wdygahd|Efhdadj|NJ|2011316219 +Wckgahd|Dihdadj|NJ|2017387779 +Ubfgahd|Zwhdadj|NJ|2012322733 +Xbegahd|Exhdadj|NJ|2011356790 +Wclgahd|Dbhdadj|NJ|2012018789 +Ucjgahd|Zphdadj|NJ|2016376733 +Xbfgahd|Ewhdadj|NJ|2012356790 +Wcngahd|Dghdadj|NJ|2012055180 +Ucpgahd|Akhdadj|NJ|2012253233 +Xbggahd|Euhdadj|NJ|2013356790 +Wcrgahd|Ebhdadj|NJ|2012455484 +Udvgahd|Achdadj|NJ|2012859833 +Xbhgahd|Ethdadj|NJ|2014356790 +Wdsgahd|Edhdadj|NJ|2012556585 +Udygahd|Bfhdadj|NJ|2012316219 +Xcjgahd|Ephdadj|NJ|2016356790 +Wdtgahd|Enhdadj|NJ|2012657686 +Vadgahd|Byhdadj|NJ|2010300709 +Xcngahd|Fghdadj|NJ|2012056790 +Wdwgahd|Edhdadj|NJ|2012956989 +Vbegahd|Bxhdadj|NJ|2011311719 +Xdsgahd|Fdhdadj|NJ|2012556779 +Wdzgahd|Eghdadj|NJ|2012326329 +Vbhgahd|Bthdadj|NJ|2014344749 +Xdugahd|Fbhdadj|NJ|2012756779 +Xadgahd|Eyhdadj|NJ|5510356790 +Vbigahd|Bshdadj|NJ|2015355759 +Xdygahd|Ffhdadj|NJ|2012316779 +Xclgahd|Fbhdadj|NJ|5518356790 +Vckgahd|Bihdadj|NJ|2017387779 +Yadgahd|Gyhdadj|NJ|2010350779 +Xcogahd|Fahdadj|NJ|5512156790 +Vclgahd|Bbhdadj|NJ|2012018789 +Ybegahd|Gxhdadj|NJ|2011351779 +Xcqgahd|Fmhdadj|NJ|5512356779 +Vcqgahd|Cmhdadj|NJ|2012354383 +Ybfgahd|Gwhdadj|NJ|2012732779 +Xcrgahd|Fbhdadj|NJ|5512456779 +Vdugahd|Cbhdadj|NJ|2012758787 +Ybhgahd|Gthdadj|NJ|2014354779 +Xdtgahd|Fnhdadj|NJ|5512656779 +Vdvgahd|Cchdadj|NJ|2012859888 +Ycjgahd|Gphdadj|NJ|2016356779 +Xdzgahd|Fghdadj|NJ|5512326779 +Vdwgahd|Cdhdadj|NJ|2012956989 +Yclgahd|Gbhdadj|NJ|2018358744 +Ybggahd|Guhdadj|NJ|5513353779 +Wbfgahd|Dwhdadj|NJ|2012322729 +Ycpgahd|Gkhdadj|NJ|2012256244 +Ycmgahd|Gxhdadj|NJ|5519359744 +Wbhgahd|Dthdadj|NJ|2014344749 +Ydtgahd|Hnhdadj|NJ|2012656644 +Ycngahd|Gghdadj|NJ|5512056044 +Wcogahd|Dahdadj|NJ|2012152181 +Ydwgahd|Hdhdadj|NJ|2012956944 +Ycrgahd|Gbhdadj|NJ|5512456444 +Wcpgahd|Dkhdadj|NJ|2012253282 +Ydxgahd|Hehdadj|NJ|2012306709 +Ydugahd|Hbhdadj|NJ|5512756744 +Wcqgahd|Emhdadj|NJ|2012354383 +Ydygahd|Hfhdadj|NJ|2012316719 +Zbggahd|Huhdadj|NJ|5513356766 +Wdugahd|Ebhdadj|NJ|2012758787 +Ydzgahd|Hghdadj|NJ|2012326729 +Zbigahd|Ishdadj|NJ|5515356766 +Wdxgahd|Eehdadj|NJ|2010306109 +Zadgahd|Hyhdadj|NJ|2010356744 +Zckgahd|Iihdadj|NJ|5517356766 +Xbigahd|Eshdadj|NJ|2015356790 +Zbfgahd|Hwhdadj|NJ|2012356744 +Zclgahd|Ibhdadj|NJ|5518356766 +Xckgahd|Eihdadj|NJ|2017356790 +Zbhgahd|Hthdadj|NJ|2014356766 +Zcngahd|Ighdadj|NJ|5512056766 +Xcmgahd|Fxhdadj|NJ|2019356790 +Zcjgahd|Iphdadj|NJ|2016356766 +Zcqgahd|Imhdadj|NJ|5512356766 +Xcpgahd|Fkhdadj|NJ|2012256779 +Zcmgahd|Ixhdadj|NJ|2019356766 +Zcrgahd|Ibhdadj|NJ|5512456766 +Xdvgahd|Fchdadj|NJ|2012856779 +Zdvgahd|Jchdadj|NJ|2012856751 +Zdsgahd|Idhdadj|NJ|5512556766 +Xdwgahd|Fdhdadj|NJ|2012956779 +Kedgahd|Jyhdadj|NJ|2010306751 +Zdtgahd|Inhdadj|NJ|5512656766 +Xdxgahd|Fehdadj|NJ|2012306779 +Keegahd|Jxhdadj|NJ|2011316751 +Zdugahd|Ibhdadj|NJ|5512756766 +Ybigahd|Gshdadj|NJ|2015355779 +Kehgahd|Jthdadj|NJ|2014346751 +Zdxgahd|Jehdadj|NJ|5512306751 +Yckgahd|Gihdadj|NJ|2017357779 +Kelgahd|Jbhdadj|NJ|2012016751 +Zdzgahd|Jghdadj|NJ|5512326751 +Ycogahd|Gahdadj|NJ|2012120144 +Keqgahd|Kmhdadj|NJ|2012354762 +Keggahd|Juhdadj|NJ|5513336751 +Ycqgahd|Gmhdadj|NJ|2012356344 +Ketgahd|Knhdadj|NJ|2012657762 +Kejgahd|Jphdadj|NJ|5516376751 +Ydsgahd|Hdhdadj|NJ|2012556544 +Kezgahd|Kghdadj|NJ|2012326362 +Kekgahd|Jihdadj|NJ|5517973751 +Ydvgahd|Hchdadj|NJ|2012856844 +Liggahd|Luhdadj|NJ|2013333762 +Keogahd|Kahdadj|NJ|5512152751 +Zbegahd|Hxhdadj|NJ|2011356744 +Likgahd|Lihdadj|NJ|2017387762 +Kergahd|Kbhdadj|NJ|5512455762 +Zcogahd|Iahdadj|NJ|2012156766 +Lilgahd|Lbhdadj|NJ|2012018762 +Keugahd|Kbhdadj|NJ|5512758762 +Zcpgahd|Ikhdadj|NJ|2012256766 +Lipgahd|Lkhdadj|NJ|2012253288 +Kevgahd|Kchdadj|NJ|5512859762 +Zdwgahd|Jdhdadj|NJ|2012956751 +Liygahd|Mfhdadj|NJ|2012316219 +Keygahd|Kfhdadj|NJ|5512312012 +Zdygahd|Jfhdadj|NJ|2012316751 +Moegahd|Mxhdadj|NJ|2011311719 +Lifgahd|Lwhdadj|NJ|5512322762 +Kefgahd|Jwhdadj|NJ|2012326751 +Moggahd|Muhdadj|NJ|2013333739 +Lihgahd|Lthdadj|NJ|5514344762 +Keigahd|Jshdadj|NJ|2015356751 +Mohgahd|Mthdadj|NJ|2014344749 +Limgahd|Lxhdadj|NJ|5519359762 +Kemgahd|Kxhdadj|NJ|2019350751 +Momgahd|Nxhdadj|NJ|2019359799 +Lingahd|Lghdadj|NJ|5512055188 +Kengahd|Kghdadj|NJ|2012051751 +Moqgahd|Nmhdadj|NJ|2012354383 +Liogahd|Lahdadj|NJ|5512152188 +Kepgahd|Kkhdadj|NJ|2012253751 +Motgahd|Nnhdadj|NJ|2012657686 +Lisgahd|Mdhdadj|NJ|5512556588 +Kesgahd|Kdhdadj|NJ|2012556762 +Movgahd|Nchdadj|NJ|2012859888 +Livgahd|Mchdadj|NJ|5512859888 +Kewgahd|Kdhdadj|NJ|2012956062 +Mozgahd|Oghdadj|NJ|2012326329 +Liwgahd|Mdhdadj|NJ|5512956988 +Kexgahd|Kehdadj|NJ|2012306162 +Nufgahd|Owhdadj|NJ|2012322729 +Lixgahd|Mehdadj|NJ|5512306109 +Lidgahd|Lyhdadj|NJ|2010300762 +Nuggahd|Ouhdadj|NJ|2013333739 +Mofgahd|Mwhdadj|NJ|5512322729 +Liegahd|Lxhdadj|NJ|2011311762 +Nuhgahd|Othdadj|NJ|2014344749 +Moigahd|Mshdadj|NJ|5515355759 +Liigahd|Lshdadj|NJ|2015355762 +Nukgahd|Oihdadj|NJ|2017387779 +Mojgahd|Nphdadj|NJ|5516376769 +Lijgahd|Lphdadj|NJ|2016376762 +Nulgahd|Pbhdadj|NJ|2012018789 +Mokgahd|Nihdadj|NJ|5517387779 +Liqgahd|Lmhdadj|NJ|2012354388 +Nuxgahd|Qehdadj|NJ|2010306109 +Molgahd|Nbhdadj|NJ|5512018789 +Lirgahd|Mbhdadj|NJ|2012455488 +Nuygahd|Qfhdadj|NJ|2011316219 +Moogahd|Nahdadj|NJ|5512152181 +Litgahd|Mnhdadj|NJ|2012657688 +Badgahd|Eyhdadj|NY|9180350711 +Morgahd|Nbhdadj|NJ|5512455484 +Liugahd|Mbhdadj|NJ|2012758788 +Bbfgahd|Ewhdadj|NY|9182352711 +Mougahd|Nbhdadj|NJ|5512758787 +Lizgahd|Mghdadj|NJ|2012326329 +Bcjgahd|Fphdadj|NY|9186356711 +Moxgahd|Nehdadj|NJ|5510306109 +Modgahd|Myhdadj|NJ|2010300709 +Bclgahd|Fbhdadj|NY|9188358700 +Moygahd|Ofhdadj|NJ|5511316219 +Mongahd|Nghdadj|NJ|2012031080 +Bcogahd|Fahdadj|NY|9182156100 +Nuegahd|Oxhdadj|NJ|5511311719 +Mopgahd|Nkhdadj|NJ|2012253282 +Bcqgahd|Gmhdadj|NY|9182356300 +Nuigahd|Oshdadj|NJ|5515355759 +Mosgahd|Ndhdadj|NJ|2012556585 +Bcrgahd|Gbhdadj|NY|9182456400 +Nupgahd|Pkhdadj|NJ|5512253282 +Mowgahd|Ndhdadj|NJ|2012956989 +Bdvgahd|Gchdadj|NY|9182856800 +Nusgahd|Pdhdadj|NJ|5512556585 +Nudgahd|Oyhdadj|NJ|2010300709 +Cadgahd|Iyhdadj|NY|9180356918 +Nuvgahd|Pchdadj|NJ|5512859888 +Nujgahd|Ophdadj|NJ|2016376769 +Cbegahd|Ixhdadj|NY|9181356918 +Nuwgahd|Pdhdadj|NJ|5512956989 +Numgahd|Pxhdadj|NJ|2019359799 +Cbhgahd|Ithdadj|NY|9184356918 +Abegahd|Axhdadj|NJ|8480156710 +Nungahd|Pghdadj|NJ|2012031080 +Ccmgahd|Jxhdadj|NY|9189356721 +Abfgahd|Awhdadj|NJ|8482356710 +Nuogahd|Pahdadj|NJ|2012152181 +Ccogahd|Jahdadj|NY|9182156721 +Abggahd|Auhdadj|NJ|8483356710 +Nuqgahd|Pmhdadj|NJ|2012354383 +Ccpgahd|Kkhdadj|NY|9182256721 +Abigahd|Ashdadj|NJ|8485356710 +Nurgahd|Pbhdadj|NJ|2012455484 +Ccqgahd|Kmhdadj|NY|9182356721 +Acjgahd|Bphdadj|NJ|8486356710 +Nutgahd|Pnhdadj|NJ|2012657686 +Cdwgahd|Ldhdadj|NY|9182956721 +Acngahd|Bghdadj|NJ|8482056701 +Nuugahd|Pbhdadj|NJ|2012758787 +Cdzgahd|Lghdadj|NY|9182326722 +Acogahd|Bahdadj|NJ|8482156701 +Nuzgahd|Qghdadj|NJ|2012326329 +Dbggahd|Muhdadj|NY|9183336722 +Acqgahd|Cmhdadj|NJ|8482356701 +Aadgahd|Ayhdadj|NY|9180356710 +Dckgahd|Nihdadj|NY|9187386722 +Acrgahd|Cbhdadj|NJ|8482456701 +Abhgahd|Athdadj|NY|9184356710 +Dcogahd|Nahdadj|NY|9182152732 +Adsgahd|Cdhdadj|NJ|8482556701 +Ackgahd|Bihdadj|NY|9187356710 +Dcrgahd|Obhdadj|NY|9182455732 +Adugahd|Cbhdadj|NJ|8482756701 +Aclgahd|Bbhdadj|NY|9188356710 +Ddsgahd|Odhdadj|NY|9182556732 +Adwgahd|Ddhdadj|NJ|8482956711 +Acmgahd|Bxhdadj|NY|9189356701 +Ddtgahd|Onhdadj|NY|9182657732 +Adzgahd|Dghdadj|NJ|8482326711 +Acpgahd|Bkhdadj|NY|9182256701 +Ddugahd|Obhdadj|NY|9182758732 +Bbggahd|Euhdadj|NJ|8483353711 +Adtgahd|Cnhdadj|NY|9182656701 +Eadgahd|Ryhdadj|NY|9180300745 +Bbhgahd|Ethdadj|NJ|8484354711 +Advgahd|Dchdadj|NY|9182856701 +Ebegahd|Rxhdadj|NY|9181311745 +Bbigahd|Eshdadj|NJ|8485355711 +Adxgahd|Dehdadj|NY|9182306711 +Ebfgahd|Rwhdadj|NY|9182322745 +Bcngahd|Fghdadj|NJ|8482056000 +Adygahd|Dfhdadj|NY|9182316711 +Ebhgahd|Rthdadj|NY|9184344745 +Bdtgahd|Gnhdadj|NJ|8482656600 +Bbegahd|Axhdadj|NY|9181351711 +Eckgahd|Sihdadj|NY|9187387745 +Bdxgahd|Hehdadj|NJ|8482306709 +Bckgahd|Fihdadj|NY|9187357700 +Ecmgahd|Sxhdadj|NY|9189359745 +Bdygahd|Hfhdadj|NJ|8482316719 +Bcmgahd|Fxhdadj|NY|9189359700 +Ecogahd|Tahdadj|NY|9182152145 +Cbfgahd|Iwhdadj|NJ|8482356712 +Bcpgahd|Gkhdadj|NY|9182256200 +Ecrgahd|Tbhdadj|NY|9182455445 +Cbggahd|Iuhdadj|NJ|8483356712 +Bdsgahd|Gdhdadj|NY|9182558130 +Edugahd|Ubhdadj|NY|9182758709 +Ccngahd|Jghdadj|NJ|8482056721 +Bdugahd|Gbhdadj|NY|9182756700 +Edvgahd|Uchdadj|NY|9182859809 +Cdtgahd|Knhdadj|NJ|8482656721 +Bdwgahd|Hdhdadj|NY|9182956900 +Edzgahd|Vghdadj|NY|9182326329 +Cdugahd|Kbhdadj|NJ|8482756721 +Bdzgahd|Hghdadj|NY|9182326729 +Fadgahd|Vyhdadj|NY|9180300709 +Cdvgahd|Lchdadj|NJ|8482856721 +Cbigahd|Ishdadj|NY|9185356918 +Fbigahd|Wshdadj|NY|9185355759 +Cdygahd|Lfhdadj|NJ|8482316722 +Ccjgahd|Jphdadj|NY|9186356918 +Fcjgahd|Wphdadj|NY|9186376769 +Dadgahd|Myhdadj|NJ|8480306722 +Cckgahd|Jihdadj|NY|9187356918 +Fclgahd|Wbhdadj|NY|9188138789 +Dbegahd|Mxhdadj|NJ|8480116722 +Cclgahd|Jbhdadj|NY|9188356721 +Fcngahd|Wghdadj|NY|9182051080 +Dbfgahd|Mwhdadj|NJ|8482326722 +Ccrgahd|Kbhdadj|NY|9182456721 +Fcpgahd|Wkhdadj|NY|9182253282 +Dcjgahd|Nphdadj|NJ|8486376722 +Cdsgahd|Kdhdadj|NY|9182556721 +Fdtgahd|Xnhdadj|NY|9182657686 +Dcmgahd|Nxhdadj|NJ|8489350732 +Cdxgahd|Lehdadj|NY|9182306721 +Fdygahd|Yfhdadj|NY|9181316219 +Dcngahd|Nghdadj|NJ|8482051732 +Dbhgahd|Mthdadj|NY|9184346722 +Gbigahd|Zshdadj|NY|9185355759 +Dcpgahd|Nkhdadj|NJ|8482253732 +Dbigahd|Nshdadj|NY|9185356722 +Gckgahd|Zihdadj|NY|9187387779 +Ddxgahd|Pehdadj|NJ|8482306145 +Dclgahd|Nbhdadj|NY|9188136732 +Gcmgahd|Zxhdadj|NY|9189359799 +Ddygahd|Pfhdadj|NJ|8482316245 +Dcqgahd|Omhdadj|NY|9182354732 +Gcogahd|Zahdadj|NY|9182152181 +Ddzgahd|Pghdadj|NJ|8482326345 +Ddvgahd|Ochdadj|NY|9182859732 +Gcpgahd|Zkhdadj|NY|9182253282 +Ebggahd|Ruhdadj|NJ|8483333745 +Ddwgahd|Odhdadj|NY|9182956045 +Gdtgahd|Anhdadj|NY|9182657686 +Ecpgahd|Tkhdadj|NJ|8482253245 +Ebigahd|Sshdadj|NY|9185355745 +Gdugahd|Abhdadj|NY|9182758787 +Ecqgahd|Tmhdadj|NJ|8482354345 +Ecjgahd|Sphdadj|NY|9186376745 +Gdwgahd|Adhdadj|NY|9182956989 +Edsgahd|Tdhdadj|NJ|8482552019 +Eclgahd|Sbhdadj|NY|9188138745 +Gdxgahd|Aehdadj|NY|9180306109 +Edtgahd|Unhdadj|NJ|8482657609 +Ecngahd|Sghdadj|NY|9182051045 +Hadgahd|Byhdadj|NY|2120356799 +Edxgahd|Uehdadj|NJ|8482306109 +Edwgahd|Udhdadj|NY|9182956909 +Hbigahd|Bshdadj|NY|2125356799 +Fbegahd|Vxhdadj|NJ|8480111719 +Edygahd|Vfhdadj|NY|9182316219 +Hcjgahd|Bphdadj|NY|2126356799 +Fbggahd|Vuhdadj|NJ|8483333739 +Fbfgahd|Vwhdadj|NY|9182322729 +Hckgahd|Bihdadj|NY|2127356799 +Fbhgahd|Vthdadj|NJ|8484344749 +Fcmgahd|Wxhdadj|NY|9189359799 +Hclgahd|Bbhdadj|NY|2128356799 +Fckgahd|Wihdadj|NJ|8487387779 +Fcqgahd|Xmhdadj|NY|9182354383 +Hcngahd|Bghdadj|NY|2122056799 +Fcogahd|Wahdadj|NJ|8482152181 +Fcrgahd|Xbhdadj|NY|9182455484 +Hcpgahd|Ckhdadj|NY|2122256767 +Fdsgahd|Xdhdadj|NJ|8482556585 +Fdzgahd|Yghdadj|NY|9182326329 +Hdsgahd|Cdhdadj|NY|2122556767 +Fdugahd|Xbhdadj|NJ|8482758787 +Gadgahd|Yyhdadj|NY|9180300709 +Hdtgahd|Cnhdadj|NY|2122656767 +Fdvgahd|Xchdadj|NJ|8482859888 +Gbegahd|Yxhdadj|NY|9181311719 +Hdzgahd|Dghdadj|NY|2122326767 +Fdwgahd|Xdhdadj|NJ|8482956989 +Gbggahd|Yuhdadj|NY|9183333739 +Ibegahd|Dxhdadj|NY|2121351778 +Fdxgahd|Xehdadj|NJ|8480306109 +Gcjgahd|Zphdadj|NY|9186376769 +Ibfgahd|Dwhdadj|NY|2122352778 +Gbfgahd|Ywhdadj|NJ|8482322729 +Gcngahd|Zghdadj|NY|9182051080 +Ibigahd|Dshdadj|NY|2125355778 +Gbhgahd|Ythdadj|NJ|8484344749 +Gdsgahd|Adhdadj|NY|9182556585 +Icngahd|Eghdadj|NY|2122056078 +Gclgahd|Zbhdadj|NJ|8482018789 +Gdzgahd|Aghdadj|NY|9182326329 +Icpgahd|Ekhdadj|NY|2122256278 +Gcqgahd|Zmhdadj|NJ|8482354383 +Hbggahd|Buhdadj|NY|2123356799 +Icqgahd|Emhdadj|NY|2122356356 +Gcrgahd|Zbhdadj|NJ|8482455484 +Hbhgahd|Bthdadj|NY|2124356799 +Idugahd|Fbhdadj|NY|2122756756 +Gdvgahd|Achdadj|NJ|8482859888 +Hcmgahd|Bxhdadj|NY|2129356799 +Jadgahd|Gyhdadj|NY|2120356701 +Gdygahd|Afhdadj|NJ|8480116219 +Hcogahd|Bahdadj|NY|2122156799 +Jbegahd|Gxhdadj|NY|2121356701 +Hbegahd|Bxhdadj|NJ|2011356799 +Hcqgahd|Cmhdadj|NY|2122356767 +Jbfgahd|Gwhdadj|NY|2122356701 +Hbfgahd|Bwhdadj|NJ|2012356799 +Hcrgahd|Cbhdadj|NY|2122456767 +Jbigahd|Gshdadj|NY|2125356701 +Hdugahd|Cbhdadj|NJ|2012756767 +Hdvgahd|Cchdadj|NY|2122856767 +Jckgahd|Hihdadj|NY|2127356701 +Iadgahd|Dyhdadj|NJ|2010350767 +Hdwgahd|Cdhdadj|NY|2122956767 +Jclgahd|Hbhdadj|NY|2128356701 +Ibhgahd|Dthdadj|NJ|2014354778 +Hdxgahd|Cehdadj|NY|2122306767 +Jcrgahd|Hbhdadj|NY|2122456755 +Icjgahd|Dphdadj|NJ|2016356778 +Hdygahd|Dfhdadj|NY|2122316767 +Jdsgahd|Hdhdadj|NY|2122556755 +Iclgahd|Ebhdadj|NJ|2018358778 +Ibggahd|Duhdadj|NY|2123353778 +Jdzgahd|Ighdadj|NY|2122326755 +Icmgahd|Exhdadj|NJ|2019359778 +Ickgahd|Eihdadj|NY|2127357778 +Kadgahd|Iyhdadj|NY|2120306704 +Idygahd|Gfhdadj|NJ|2012316719 +Icogahd|Eahdadj|NY|2122156178 +Kbegahd|Ixhdadj|NY|2121316704 +Idzgahd|Gghdadj|NJ|2012326729 +Icrgahd|Fbhdadj|NY|2122456456 +Kbfgahd|Jwhdadj|NY|2122326704 +Jbggahd|Guhdadj|NJ|2013356701 +Idsgahd|Fdhdadj|NY|2122556556 +Kbigahd|Jshdadj|NY|2125356704 +Jbhgahd|Gthdadj|NJ|2014356701 +Idtgahd|Fnhdadj|NY|2122656656 +Kcjgahd|Jphdadj|NY|2126376704 +Jcjgahd|Gphdadj|NJ|2016356701 +Idvgahd|Fchdadj|NY|2122856856 +Kclgahd|Jbhdadj|NY|2128136704 +Jcmgahd|Hxhdadj|NJ|2019356701 +Idwgahd|Fdhdadj|NY|2122956956 +Kcqgahd|Kmhdadj|NY|2122354766 +Jcngahd|Hghdadj|NJ|2012056755 +Idxgahd|Fehdadj|NY|2122306709 +Kcrgahd|Kbhdadj|NY|2122455766 +Jdtgahd|Inhdadj|NJ|2012656755 +Jcogahd|Hahdadj|NY|2122156755 +Kdsgahd|Kdhdadj|NY|2122556766 +Jdvgahd|Ichdadj|NJ|2012856755 +Jcpgahd|Hkhdadj|NY|2122256755 +Kdugahd|Kbhdadj|NY|2122758766 +Jdwgahd|Idhdadj|NJ|2012956755 +Jcqgahd|Hmhdadj|NY|2122356755 +Kdzgahd|Lghdadj|NY|2122326366 +Kckgahd|Jihdadj|NJ|2017973704 +Jdugahd|Ibhdadj|NY|2122756755 +Lbegahd|Lxhdadj|NY|2121311766 +Kcngahd|Jghdadj|NJ|2012051704 +Jdxgahd|Iehdadj|NY|2122306755 +Ldsgahd|Mdhdadj|NY|2122556529 +Kcogahd|Kahdadj|NJ|2012152704 +Jdygahd|Ifhdadj|NY|2122316755 +Ldvgahd|Nchdadj|NY|2122859829 +Kdvgahd|Kchdadj|NJ|2012859766 +Kbggahd|Juhdadj|NY|2123336704 +Ldwgahd|Ndhdadj|NY|2122956929 +Kdwgahd|Ldhdadj|NJ|2012956066 +Kbhgahd|Jthdadj|NY|2124346704 +Ldygahd|Nfhdadj|NY|2122316219 +Ladgahd|Lyhdadj|NJ|2010300766 +Kcmgahd|Jxhdadj|NY|2129350704 +Mbfgahd|Nwhdadj|NY|2122322729 +Lbggahd|Luhdadj|NJ|2013333729 +Kcpgahd|Kkhdadj|NY|2122253704 +Mclgahd|Obhdadj|NY|2128138789 +Lbhgahd|Lthdadj|NJ|2014344729 +Kdtgahd|Knhdadj|NY|2122657766 +Mcmgahd|Oxhdadj|NY|2129359799 +Lcjgahd|Lphdadj|NJ|2016376729 +Kdxgahd|Lehdadj|NY|2122306166 +Mcqgahd|Omhdadj|NY|2122354383 +Lclgahd|Mbhdadj|NJ|2012018729 +Kdygahd|Lfhdadj|NY|2122316266 +Mcrgahd|Obhdadj|NY|2122455484 +Lcngahd|Mghdadj|NJ|2012031029 +Lbfgahd|Lwhdadj|NY|2122322766 +Mdxgahd|Pehdadj|NY|2120306109 +Lcogahd|Mahdadj|NJ|2012152129 +Lbigahd|Lshdadj|NY|2125355729 +Ncjgahd|Pphdadj|NY|2126376769 +Lcpgahd|Mkhdadj|NJ|2012253229 +Lckgahd|Mihdadj|NY|2127387729 +Nckgahd|Pihdadj|NY|2127387779 +Lcrgahd|Mbhdadj|NJ|2012455429 +Lcmgahd|Mxhdadj|NY|2129359729 +Ncrgahd|Qbhdadj|NY|2122455484 +Ldtgahd|Mnhdadj|NJ|2012657629 +Lcqgahd|Mmhdadj|NY|2122354329 +Ndtgahd|Qnhdadj|NY|2122657686 +Ldugahd|Mbhdadj|NJ|2012758729 +Ldxgahd|Nehdadj|NY|2122306109 +Ndugahd|Qbhdadj|NY|2122758787 +Madgahd|Nyhdadj|NJ|2010300709 +Ldzgahd|Nghdadj|NY|2122326329 +Ndvgahd|Qchdadj|NY|2122859888 +Mbggahd|Nuhdadj|NJ|2013333739 +Mbegahd|Nxhdadj|NY|2121311719 +Ndygahd|Rfhdadj|NY|2121316219 +Mbhgahd|Nthdadj|NJ|2014344749 +Mbigahd|Nshdadj|NY|2125355759 +Ndzgahd|Rghdadj|NY|2122326329 +Mcjgahd|Nphdadj|NJ|2016376769 +Mckgahd|Nihdadj|NY|2127387779 +Obggahd|Ruhdadj|NY|7183356776 +Mcpgahd|Okhdadj|NJ|2012253282 +Mcngahd|Oghdadj|NY|2122051080 +Obigahd|Rshdadj|NY|7185356776 +Mdsgahd|Odhdadj|NJ|2012556585 +Mcogahd|Oahdadj|NY|2122152181 +Oclgahd|Sbhdadj|NY|7188356776 +Mdwgahd|Pdhdadj|NJ|2012956989 +Mdtgahd|Onhdadj|NY|2122657686 +Ocmgahd|Sxhdadj|NY|7189356776 +Mdygahd|Pfhdadj|NJ|2011316219 +Mdugahd|Obhdadj|NY|2122758787 +Ocogahd|Sahdadj|NY|7182156776 +Mdzgahd|Pghdadj|NJ|2012326329 +Mdvgahd|Ochdadj|NY|2122859888 +Ocqgahd|Smhdadj|NY|7182356776 +Nadgahd|Pyhdadj|NJ|2010300709 +Nbegahd|Pxhdadj|NY|2121311719 +Odugahd|Tbhdadj|NY|7182756776 +Nbfgahd|Pwhdadj|NJ|2012322729 +Nbigahd|Pshdadj|NY|2125355759 +Padgahd|Tyhdadj|NY|7180350767 +Nbggahd|Puhdadj|NJ|2013333739 +Nclgahd|Qbhdadj|NY|2128138789 +Pbfgahd|Twhdadj|NY|7182352767 +Nbhgahd|Pthdadj|NJ|2014344749 +Ncngahd|Qghdadj|NY|2122051080 +Pbggahd|Tuhdadj|NY|7183353767 +Ncmgahd|Qxhdadj|NJ|2019359799 +Ncqgahd|Qmhdadj|NY|2122354383 +Pcjgahd|Uphdadj|NY|7186356767 +Ncogahd|Qahdadj|NJ|2012152181 +Ndsgahd|Qdhdadj|NY|2122556585 +Pckgahd|Uihdadj|NY|7187357767 +Ncpgahd|Qkhdadj|NJ|2012253282 +Ndxgahd|Rehdadj|NY|2120306109 +Pcngahd|Ughdadj|NY|7182056067 +Ndwgahd|Qdhdadj|NJ|2012956989 +Obhgahd|Rthdadj|NY|7184356776 +Pdugahd|Ubhdadj|NY|7182756700 +Oadgahd|Ryhdadj|NJ|2010356776 +Ocpgahd|Skhdadj|NY|7182256776 +Pdxgahd|Vehdadj|NY|7182306709 +Obegahd|Rxhdadj|NJ|2011356776 +Ocrgahd|Sbhdadj|NY|7182456776 +Pdygahd|Vfhdadj|NY|7182316719 +Obfgahd|Rwhdadj|NJ|2012356776 +Odsgahd|Sdhdadj|NY|7182556776 +Rbggahd|Vuhdadj|NY|7183356700 +Ocjgahd|Sphdadj|NJ|2016356776 +Odvgahd|Tchdadj|NY|7182856776 +Rbigahd|Vshdadj|NY|7185356700 +Ockgahd|Sihdadj|NJ|2017356776 +Odxgahd|Tehdadj|NY|7182306767 +Rcjgahd|Vphdadj|NY|7186356700 +Ocngahd|Sghdadj|NJ|2012056776 +Odygahd|Tfhdadj|NY|7182316767 +Sbfgahd|Xwhdadj|NY|7182326706 +Odtgahd|Snhdadj|NJ|2012656776 +Odzgahd|Tghdadj|NY|7182326767 +Sbggahd|Xuhdadj|NY|7183336706 +Odwgahd|Tdhdadj|NJ|2012956776 +Pbegahd|Txhdadj|NY|7181351767 +Sbigahd|Xshdadj|NY|7185356740 +Pbhgahd|Tthdadj|NJ|2014354767 +Pbigahd|Tshdadj|NY|7185355767 +Scngahd|Xghdadj|NY|7182051740 +Pcogahd|Uahdadj|NJ|2012120167 +Pclgahd|Ubhdadj|NY|7188358767 +Scpgahd|Ykhdadj|NY|7182253740 +Pcqgahd|Umhdadj|NJ|2012356367 +Pcmgahd|Uxhdadj|NY|7189359767 +Scqgahd|Ymhdadj|NY|7182354740 +Pcrgahd|Ubhdadj|NJ|2012456467 +Pcpgahd|Ukhdadj|NY|7182256267 +Sdzgahd|Yghdadj|NY|7182326333 +Pdtgahd|Unhdadj|NJ|2012656600 +Pdsgahd|Udhdadj|NY|7182557180 +Ubggahd|Zuhdadj|NY|7183333733 +Pdvgahd|Uchdadj|NJ|2012856800 +Pdwgahd|Udhdadj|NY|7182956900 +Ubhgahd|Zthdadj|NY|7184344733 +Rbegahd|Vxhdadj|NJ|2011356700 +Pdzgahd|Vghdadj|NY|7182326729 +Uckgahd|Zihdadj|NY|7187387733 +Rbfgahd|Vwhdadj|NJ|2012356700 +Radgahd|Vyhdadj|NY|7180356700 +Ucngahd|Aghdadj|NY|7182051033 +Rckgahd|Vihdadj|NJ|2017356700 +Rbhgahd|Vthdadj|NY|7184356700 +Ucogahd|Aahdadj|NY|7182152133 +Rclgahd|Wbhdadj|NJ|2018356700 +Rcngahd|Wghdadj|NY|7182056700 +Ucrgahd|Abhdadj|NY|7182455433 +Rcmgahd|Wxhdadj|NJ|2019356700 +Rcpgahd|Wkhdadj|NY|7182256706 +Udsgahd|Adhdadj|NY|7182556533 +Rcogahd|Wahdadj|NJ|2012156700 +Rcrgahd|Wbhdadj|NY|7182456706 +Udwgahd|Adhdadj|NY|7182956933 +Rcqgahd|Wmhdadj|NJ|2012356706 +Rdugahd|Wbhdadj|NY|7182756706 +Udzgahd|Bghdadj|NY|7182326329 +Rdsgahd|Wdhdadj|NJ|2012556706 +Rdvgahd|Wchdadj|NY|7182856706 +Vbfgahd|Bwhdadj|NY|7182322729 +Rdtgahd|Wnhdadj|NJ|2012656706 +Rdxgahd|Wehdadj|NY|7182306706 +Vcjgahd|Bphdadj|NY|7186376769 +Rdwgahd|Wdhdadj|NJ|2012956706 +Rdygahd|Wfhdadj|NY|7182316706 +Vcmgahd|Cxhdadj|NY|7189359799 +Scjgahd|Xphdadj|NJ|2016376740 +Rdzgahd|Wghdadj|NY|7182326706 +Vcpgahd|Ckhdadj|NY|7182253282 +Scmgahd|Xxhdadj|NJ|2019350740 +Sadgahd|Xyhdadj|NY|7180306706 +Vdxgahd|Cehdadj|NY|7180306109 +Scrgahd|Ybhdadj|NJ|2012455740 +Sbegahd|Xxhdadj|NY|7181316706 +Vdygahd|Cfhdadj|NY|7181316219 +Sdtgahd|Ynhdadj|NJ|2012657740 +Sbhgahd|Xthdadj|NY|7184346706 +Vdzgahd|Cghdadj|NY|7182326329 +Sdugahd|Ybhdadj|NJ|2012758740 +Sckgahd|Xihdadj|NY|7187386740 +Wadgahd|Dyhdadj|NY|7180300709 +Sdygahd|Yfhdadj|NJ|2012316233 +Sclgahd|Xbhdadj|NY|7187186740 +Wbggahd|Duhdadj|NY|7183333739 +Uadgahd|Zyhdadj|NJ|2010300733 +Scogahd|Yahdadj|NY|7182152740 +Wcjgahd|Dphdadj|NY|7186376769 +Ubegahd|Zxhdadj|NJ|2011311733 +Sdsgahd|Ydhdadj|NY|7182556740 +Wcmgahd|Dxhdadj|NY|7189359799 +Ubigahd|Zshdadj|NJ|2015355733 +Sdvgahd|Ychdadj|NY|7182859740 +Wdvgahd|Echdadj|NY|7182859888 +Uclgahd|Zbhdadj|NJ|2012018733 +Sdwgahd|Ydhdadj|NY|7182956040 +Wdygahd|Efhdadj|NY|7181316219 +Ucmgahd|Axhdadj|NJ|2019359733 +Sdxgahd|Yehdadj|NY|7182306140 +Xbegahd|Exhdadj|NY|2121356790 +Ucqgahd|Amhdadj|NJ|2012354333 +Ubfgahd|Zwhdadj|NY|7182322733 +Xbfgahd|Ewhdadj|NY|2122356790 +Udtgahd|Anhdadj|NJ|2012657633 +Ucjgahd|Zphdadj|NY|7186376733 +Xbggahd|Euhdadj|NY|2123356790 +Udugahd|Abhdadj|NJ|2012758733 +Ucpgahd|Akhdadj|NY|7182253233 +Xbhgahd|Ethdadj|NY|2124356790 +Udxgahd|Aehdadj|NJ|2012306109 +Udvgahd|Achdadj|NY|7182859833 +Xcjgahd|Ephdadj|NY|2126356790 +Vbggahd|Buhdadj|NJ|2013333739 +Udygahd|Bfhdadj|NY|7182316219 +Xcngahd|Fghdadj|NY|2122056790 +Vcngahd|Cghdadj|NJ|2012031080 +Vadgahd|Byhdadj|NY|7180300709 +Xdsgahd|Fdhdadj|NY|2122556779 +Vcogahd|Cahdadj|NJ|2012152181 +Vbegahd|Bxhdadj|NY|7181311719 +Xdugahd|Fbhdadj|NY|2122756779 +Vcrgahd|Cbhdadj|NJ|2012455484 +Vbhgahd|Bthdadj|NY|7184344749 +Xdygahd|Ffhdadj|NY|2122316779 +Vdsgahd|Cdhdadj|NJ|2012556585 +Vbigahd|Bshdadj|NY|7185355759 +Yadgahd|Gyhdadj|NY|2120350779 +Vdtgahd|Cnhdadj|NJ|2012657686 +Vckgahd|Bihdadj|NY|7187387779 +Ybegahd|Gxhdadj|NY|2121351779 +Wbegahd|Dxhdadj|NJ|2011311719 +Vclgahd|Bbhdadj|NY|7187188789 +Ybfgahd|Gwhdadj|NY|2122352779 +Wbigahd|Dshdadj|NJ|2015355759 +Vcqgahd|Cmhdadj|NY|7182354383 +Ybhgahd|Gthdadj|NY|2124354779 +Wckgahd|Dihdadj|NJ|2017387779 +Vdugahd|Cbhdadj|NY|7182758787 +Ycjgahd|Gphdadj|NY|2126356779 +Wclgahd|Dbhdadj|NJ|2012018789 +Vdvgahd|Cchdadj|NY|7182859888 +Yclgahd|Gbhdadj|NY|2128358744 +Wcngahd|Dghdadj|NJ|2012031080 +Vdwgahd|Cdhdadj|NY|7182956989 +Ycpgahd|Gkhdadj|NY|2122256244 +Wcrgahd|Ebhdadj|NJ|2012455484 +Wbfgahd|Dwhdadj|NY|7182322729 +Ydtgahd|Hnhdadj|NY|2122656644 +Wdsgahd|Edhdadj|NJ|2012556585 +Wbhgahd|Dthdadj|NY|7184344749 +Ydwgahd|Hdhdadj|NY|2122956944 +Wdtgahd|Enhdadj|NJ|2012657686 +Wcogahd|Dahdadj|NY|7182152181 +Ydxgahd|Hehdadj|NY|2122306709 +Wdwgahd|Edhdadj|NJ|2012956989 +Wcpgahd|Dkhdadj|NY|7182253282 +Ydygahd|Hfhdadj|NY|2122316719 +Wdzgahd|Eghdadj|NJ|2012326329 +Wcqgahd|Emhdadj|NY|7182354383 +Ydzgahd|Hghdadj|NY|2122326729 +Xadgahd|Eyhdadj|NJ|2010356790 +Wdugahd|Ebhdadj|NY|7182758787 +Zadgahd|Hyhdadj|NY|2120356744 +Xclgahd|Fbhdadj|NJ|2018356790 +Wdxgahd|Eehdadj|NY|7180306109 +Zbfgahd|Hwhdadj|NY|2122356744 +Xcogahd|Fahdadj|NJ|2012156790 +Xbigahd|Eshdadj|NY|2125356790 +Zbhgahd|Hthdadj|NY|2124356766 +Xcqgahd|Fmhdadj|NJ|2012356779 +Xckgahd|Eihdadj|NY|2127356790 +Zcjgahd|Iphdadj|NY|2126356766 +Xcrgahd|Fbhdadj|NJ|2012456779 +Xcmgahd|Fxhdadj|NY|2129356790 +Zcmgahd|Ixhdadj|NY|2129356766 +Xdtgahd|Fnhdadj|NJ|2012656779 +Xcpgahd|Fkhdadj|NY|2122256779 +Zdvgahd|Jchdadj|NY|2122856751 +Xdzgahd|Fghdadj|NJ|2012326779 +Xdvgahd|Fchdadj|NY|2122856779 +Kedgahd|Jyhdadj|NY|2120306751 +Ybggahd|Guhdadj|NJ|2013353779 +Xdwgahd|Fdhdadj|NY|2122956779 +Keegahd|Jxhdadj|NY|2121316751 +Ycmgahd|Gxhdadj|NJ|2019359744 +Xdxgahd|Fehdadj|NY|2122306779 +Kehgahd|Jthdadj|NY|2124346751 +Ycngahd|Gghdadj|NJ|2012056044 +Ybigahd|Gshdadj|NY|2125355779 +Kelgahd|Jbhdadj|NY|2128136751 +Ycrgahd|Gbhdadj|NJ|2012456444 +Yckgahd|Gihdadj|NY|2127357779 +Keqgahd|Kmhdadj|NY|2122354762 +Ydugahd|Hbhdadj|NJ|2012756744 +Ycogahd|Gahdadj|NY|2122156144 +Ketgahd|Knhdadj|NY|2122657762 +Zbggahd|Huhdadj|NJ|2013356766 +Ycqgahd|Gmhdadj|NY|2122356344 +Kezgahd|Kghdadj|NY|2122326362 +Zbigahd|Ishdadj|NJ|2015356766 +Ydsgahd|Hdhdadj|NY|2122556544 +Liggahd|Luhdadj|NY|2123333762 +Zckgahd|Iihdadj|NJ|2017356766 +Ydvgahd|Hchdadj|NY|2122856844 +Likgahd|Lihdadj|NY|2127387762 +Zclgahd|Ibhdadj|NJ|2018356766 +Zbegahd|Hxhdadj|NY|2121356744 +Lilgahd|Lbhdadj|NY|2128138762 +Zcngahd|Ighdadj|NJ|2012056766 +Zcogahd|Iahdadj|NY|2122156766 +Lipgahd|Lkhdadj|NY|2122253288 +Zcqgahd|Imhdadj|NJ|2012356766 +Zcpgahd|Ikhdadj|NY|2122256766 +Liygahd|Mfhdadj|NY|2122316219 +Zcrgahd|Ibhdadj|NJ|2012456766 +Zdwgahd|Jdhdadj|NY|2122956751 +Moegahd|Mxhdadj|NY|2121311719 +Zdsgahd|Idhdadj|NJ|2012556766 +Zdygahd|Jfhdadj|NY|2122316751 +Moggahd|Muhdadj|NY|2123333739 +Zdtgahd|Inhdadj|NJ|2012656766 +Kefgahd|Jwhdadj|NY|2122326751 +Mohgahd|Mthdadj|NY|2124344749 +Zdugahd|Ibhdadj|NJ|2012756766 +Keigahd|Jshdadj|NY|2125356751 +Momgahd|Nxhdadj|NY|2129359799 +Zdxgahd|Jehdadj|NJ|2012306751 +Kemgahd|Kxhdadj|NY|2129350751 +Moqgahd|Nmhdadj|NY|2122354383 +Zdzgahd|Jghdadj|NJ|2012326751 +Kengahd|Kghdadj|NY|2122051751 +Motgahd|Nnhdadj|NY|2122657686 +Keggahd|Juhdadj|NJ|2013336751 +Kepgahd|Kkhdadj|NY|2122253751 +Movgahd|Nchdadj|NY|2122859888 +Kejgahd|Jphdadj|NJ|2016376751 +Kesgahd|Kdhdadj|NY|2122556762 +Mozgahd|Oghdadj|NY|2122326329 +Kekgahd|Jihdadj|NJ|2017973751 +Kewgahd|Kdhdadj|NY|2122956062 +Nufgahd|Owhdadj|NY|2122322729 +Keogahd|Kahdadj|NJ|2012152751 +Kexgahd|Kehdadj|NY|2122306162 +Nuggahd|Ouhdadj|NY|2123333739 +Kergahd|Kbhdadj|NJ|2012455762 +Lidgahd|Lyhdadj|NY|2120300762 +Nuhgahd|Othdadj|NY|2124344749 +Keugahd|Kbhdadj|NJ|2012758762 +Liegahd|Lxhdadj|NY|2121311762 +Nukgahd|Oihdadj|NY|2127387779 +Kevgahd|Kchdadj|NJ|2012859762 +Liigahd|Lshdadj|NY|2125355762 +Nulgahd|Pbhdadj|NY|2128138789 +Keygahd|Kfhdadj|NJ|2012312012 +Lijgahd|Lphdadj|NY|2126376762 +Nuxgahd|Qehdadj|NY|2120306109 +Lifgahd|Lwhdadj|NJ|2012322762 +Liqgahd|Lmhdadj|NY|2122354388 +Nuygahd|Qfhdadj|NY|2121316219 +Lihgahd|Lthdadj|NJ|2014344762 +Lirgahd|Mbhdadj|NY|2122455488 +Badgahd|Eyhdadj|NY|7160350711 +Limgahd|Lxhdadj|NJ|2019359762 +Litgahd|Mnhdadj|NY|2122657688 +Bbfgahd|Ewhdadj|NY|7162352711 +Lingahd|Lghdadj|NJ|2012031088 +Liugahd|Mbhdadj|NY|2122758788 +Bcjgahd|Fphdadj|NY|7166356711 +Liogahd|Lahdadj|NJ|2012152188 +Lizgahd|Mghdadj|NY|2122326329 +Bclgahd|Fbhdadj|NY|7168358700 +Lisgahd|Mdhdadj|NJ|2012556588 +Modgahd|Myhdadj|NY|2120300709 +Bcogahd|Fahdadj|NY|7162156100 +Livgahd|Mchdadj|NJ|2012859888 +Mongahd|Nghdadj|NY|2122051080 +Bcqgahd|Gmhdadj|NY|7162356300 +Liwgahd|Mdhdadj|NJ|2012956988 +Mopgahd|Nkhdadj|NY|2122253282 +Bcrgahd|Gbhdadj|NY|7162456400 +Lixgahd|Mehdadj|NJ|2012306109 +Mosgahd|Ndhdadj|NY|2122556585 +Bdvgahd|Gchdadj|NY|7162856800 +Mofgahd|Mwhdadj|NJ|2012322729 +Mowgahd|Ndhdadj|NY|2122956989 +Cadgahd|Iyhdadj|NY|7160356918 +Moigahd|Mshdadj|NJ|2015355759 +Nudgahd|Oyhdadj|NY|2120300709 +Cbegahd|Ixhdadj|NY|7161356918 +Mojgahd|Nphdadj|NJ|2016376769 +Nujgahd|Ophdadj|NY|2126376769 +Cbhgahd|Ithdadj|NY|7164356918 +Mokgahd|Nihdadj|NJ|2017387779 +Numgahd|Pxhdadj|NY|2129359799 +Ccmgahd|Jxhdadj|NY|7169356721 +Molgahd|Nbhdadj|NJ|2012018789 +Nungahd|Pghdadj|NY|2122051080 +Ccogahd|Jahdadj|NY|7162156721 +Moogahd|Nahdadj|NJ|2012152181 +Nuogahd|Pahdadj|NY|2122152181 +Ccpgahd|Kkhdadj|NY|7162256721 +Morgahd|Nbhdadj|NJ|2012455484 +Nuqgahd|Pmhdadj|NY|2122354383 +Ccqgahd|Kmhdadj|NY|7162356721 +Mougahd|Nbhdadj|NJ|2012758787 +Nurgahd|Pbhdadj|NY|2122455484 +Cdwgahd|Ldhdadj|NY|7162956721 +Moxgahd|Nehdadj|NJ|2010306109 +Nutgahd|Pnhdadj|NY|2122657686 +Cdzgahd|Lghdadj|NY|7162326722 +Moygahd|Ofhdadj|NJ|2011316219 +Nuugahd|Pbhdadj|NY|2122758787 +Dbggahd|Muhdadj|NY|7163336722 +Nuegahd|Oxhdadj|NJ|2011311719 +Nuzgahd|Qghdadj|NY|2122326329 +Dckgahd|Nihdadj|NY|7167386722 +Nuigahd|Oshdadj|NJ|2015355759 +Aadgahd|Ayhdadj|NY|7160356710 +Dcogahd|Nahdadj|NY|7162152732 +Nupgahd|Pkhdadj|NJ|2012253282 +Abhgahd|Athdadj|NY|7164356710 +Dcrgahd|Obhdadj|NY|7162455732 +Nusgahd|Pdhdadj|NJ|2012556585 +Ackgahd|Bihdadj|NY|7167356710 +Ddsgahd|Odhdadj|NY|7162556732 +Nuvgahd|Pchdadj|NJ|2012859888 +Aclgahd|Bbhdadj|NY|7168356710 +Ddtgahd|Onhdadj|NY|7162657732 +Nuwgahd|Pdhdadj|NJ|2012956989 +Acmgahd|Bxhdadj|NY|7169356701 +Ddugahd|Obhdadj|NY|7162758732 +Abegahd|Axhdadj|NY|9181356710 +Acpgahd|Bkhdadj|NY|7162256701 +Eadgahd|Ryhdadj|NY|7160300745 +Abfgahd|Awhdadj|NY|9182356710 +Adtgahd|Cnhdadj|NY|7162656701 +Ebegahd|Rxhdadj|NY|7161311745 +Abggahd|Auhdadj|NY|9183356710 +Advgahd|Dchdadj|NY|7162856701 +Ebfgahd|Rwhdadj|NY|7162322745 +Abigahd|Ashdadj|NY|9185356710 +Adxgahd|Dehdadj|NY|7162306711 +Ebhgahd|Rthdadj|NY|7164344745 +Acjgahd|Bphdadj|NY|9186356710 +Adygahd|Dfhdadj|NY|7162316711 +Eckgahd|Sihdadj|NY|7167387745 +Acngahd|Bghdadj|NY|9182056701 +Bbegahd|Axhdadj|NY|7161351711 +Ecmgahd|Sxhdadj|NY|7169359745 +Acogahd|Bahdadj|NY|9182156701 +Bckgahd|Fihdadj|NY|7167357700 +Ecogahd|Tahdadj|NY|7162152145 +Acqgahd|Cmhdadj|NY|9182356701 +Bcmgahd|Fxhdadj|NY|7169359700 +Ecrgahd|Tbhdadj|NY|7162455445 +Acrgahd|Cbhdadj|NY|9182456701 +Bcpgahd|Gkhdadj|NY|7162256200 +Edugahd|Ubhdadj|NY|7162758709 +Adsgahd|Cdhdadj|NY|9182556701 +Bdsgahd|Gdhdadj|NY|7162558130 +Edvgahd|Uchdadj|NY|7162859809 +Adugahd|Cbhdadj|NY|9182756701 +Bdugahd|Gbhdadj|NY|7162756700 +Edzgahd|Vghdadj|NY|7162326329 +Adwgahd|Ddhdadj|NY|9182956711 +Bdwgahd|Hdhdadj|NY|7162956900 +Fadgahd|Vyhdadj|NY|7160300709 +Adzgahd|Dghdadj|NY|9182326711 +Bdzgahd|Hghdadj|NY|7162326729 +Fbigahd|Wshdadj|NY|7165355759 +Bbggahd|Euhdadj|NY|9183353711 +Cbigahd|Ishdadj|NY|7165356918 +Fcjgahd|Wphdadj|NY|7166376769 +Bbhgahd|Ethdadj|NY|9184354711 +Ccjgahd|Jphdadj|NY|7166356918 +Fclgahd|Wbhdadj|NY|7168138789 +Bbigahd|Eshdadj|NY|9185355711 +Cckgahd|Jihdadj|NY|7167356918 +Fcngahd|Wghdadj|NY|7162051080 +Bcngahd|Fghdadj|NY|9182056000 +Cclgahd|Jbhdadj|NY|7168356721 +Fcpgahd|Wkhdadj|NY|7162253282 +Bdtgahd|Gnhdadj|NY|9182656600 +Ccrgahd|Kbhdadj|NY|7162456721 +Fdtgahd|Xnhdadj|NY|7162657686 +Bdxgahd|Hehdadj|NY|9182306709 +Cdsgahd|Kdhdadj|NY|7162556721 +Fdygahd|Yfhdadj|NY|7161316219 +Bdygahd|Hfhdadj|NY|9182316719 +Cdxgahd|Lehdadj|NY|7162306721 +Gbigahd|Zshdadj|NY|7165355759 +Cbfgahd|Iwhdadj|NY|9182356918 +Dbhgahd|Mthdadj|NY|7164346722 +Gckgahd|Zihdadj|NY|7167387779 +Cbggahd|Iuhdadj|NY|9183356918 +Dbigahd|Nshdadj|NY|7165356722 +Gcmgahd|Zxhdadj|NY|7169359799 +Ccngahd|Jghdadj|NY|9182056721 +Dclgahd|Nbhdadj|NY|7168136732 +Gcogahd|Zahdadj|NY|7162152181 +Cdtgahd|Knhdadj|NY|9182656721 +Dcqgahd|Omhdadj|NY|7162354732 +Gcpgahd|Zkhdadj|NY|7162253282 +Cdugahd|Kbhdadj|NY|9182756721 +Ddvgahd|Ochdadj|NY|7162859732 +Gdtgahd|Anhdadj|NY|7162657686 +Cdvgahd|Lchdadj|NY|9182856721 +Ddwgahd|Odhdadj|NY|7162956045 +Gdugahd|Abhdadj|NY|7162758787 +Cdygahd|Lfhdadj|NY|9182316722 +Ebigahd|Sshdadj|NY|7165355745 +Gdwgahd|Adhdadj|NY|7162956989 +Dadgahd|Myhdadj|NY|9180306722 +Ecjgahd|Sphdadj|NY|7166376745 +Gdxgahd|Aehdadj|NY|7160306109 +Dbegahd|Mxhdadj|NY|9181316722 +Eclgahd|Sbhdadj|NY|7168138745 +Hadgahd|Byhdadj|NY|6460356799 +Dbfgahd|Mwhdadj|NY|9182326722 +Ecngahd|Sghdadj|NY|7162051045 +Hbigahd|Bshdadj|NY|6465356799 +Dcjgahd|Nphdadj|NY|9186376722 +Edwgahd|Udhdadj|NY|7162956909 +Hcjgahd|Bphdadj|NY|6466356799 +Dcmgahd|Nxhdadj|NY|9189350732 +Edygahd|Vfhdadj|NY|7162316219 +Hckgahd|Bihdadj|NY|6467356799 +Dcngahd|Nghdadj|NY|9182051732 +Fbfgahd|Vwhdadj|NY|7162322729 +Hclgahd|Bbhdadj|NY|6468356799 +Dcpgahd|Nkhdadj|NY|9182253732 +Fcmgahd|Wxhdadj|NY|7169359799 +Hcngahd|Bghdadj|NY|6462056799 +Ddxgahd|Pehdadj|NY|9182306145 +Fcqgahd|Xmhdadj|NY|7162354383 +Hcpgahd|Ckhdadj|NY|6462256767 +Ddygahd|Pfhdadj|NY|9182316245 +Fcrgahd|Xbhdadj|NY|7162455484 +Hdsgahd|Cdhdadj|NY|6462556767 +Ddzgahd|Pghdadj|NY|9182326345 +Fdzgahd|Yghdadj|NY|7162326329 +Hdtgahd|Cnhdadj|NY|6462656767 +Ebggahd|Ruhdadj|NY|9183333745 +Gadgahd|Yyhdadj|NY|7160300709 +Hdzgahd|Dghdadj|NY|6462326767 +Ecpgahd|Tkhdadj|NY|9182253245 +Gbegahd|Yxhdadj|NY|7161311719 +Ibegahd|Dxhdadj|NY|6461351778 +Ecqgahd|Tmhdadj|NY|9182354345 +Gbggahd|Yuhdadj|NY|7163333739 +Ibfgahd|Dwhdadj|NY|6462352778 +Edsgahd|Tdhdadj|NY|9182558139 +Gcjgahd|Zphdadj|NY|7166376769 +Ibigahd|Dshdadj|NY|6465355778 +Edtgahd|Unhdadj|NY|9182657609 +Gcngahd|Zghdadj|NY|7162051080 +Icngahd|Eghdadj|NY|6462056078 +Edxgahd|Uehdadj|NY|9182306109 +Gdsgahd|Adhdadj|NY|7162556585 +Icpgahd|Ekhdadj|NY|6462256278 +Fbegahd|Vxhdadj|NY|9181311719 +Gdzgahd|Aghdadj|NY|7162326329 +Icqgahd|Emhdadj|NY|6462356356 +Fbggahd|Vuhdadj|NY|9183333739 +Hbggahd|Buhdadj|NY|6463356799 +Idugahd|Fbhdadj|NY|6462756756 +Fbhgahd|Vthdadj|NY|9184344749 +Hbhgahd|Bthdadj|NY|6464356799 +Jadgahd|Gyhdadj|NY|6460356701 +Fckgahd|Wihdadj|NY|9187387779 +Hcmgahd|Bxhdadj|NY|6469356799 +Jbegahd|Gxhdadj|NY|6461356701 +Fcogahd|Wahdadj|NY|9182152181 +Hcogahd|Bahdadj|NY|6462156799 +Jbfgahd|Gwhdadj|NY|6462356701 +Fdsgahd|Xdhdadj|NY|9182556585 +Hcqgahd|Cmhdadj|NY|6462356767 +Jbigahd|Gshdadj|NY|6465356701 +Fdugahd|Xbhdadj|NY|9182758787 +Hcrgahd|Cbhdadj|NY|6462456767 +Jckgahd|Hihdadj|NY|6467356701 +Fdvgahd|Xchdadj|NY|9182859888 +Hdvgahd|Cchdadj|NY|6462856767 +Jclgahd|Hbhdadj|NY|6468356701 +Fdwgahd|Xdhdadj|NY|9182956989 +Hdwgahd|Cdhdadj|NY|6462956767 +Jcrgahd|Hbhdadj|NY|6462456755 +Fdxgahd|Xehdadj|NY|9180306109 +Hdxgahd|Cehdadj|NY|6462306767 +Jdsgahd|Hdhdadj|NY|6462556755 +Gbfgahd|Ywhdadj|NY|9182322729 +Hdygahd|Dfhdadj|NY|6462316767 +Jdzgahd|Ighdadj|NY|6462326755 +Gbhgahd|Ythdadj|NY|9184344749 +Ibggahd|Duhdadj|NY|6463353778 +Kadgahd|Iyhdadj|NY|6460306704 +Gclgahd|Zbhdadj|NY|9188138789 +Ickgahd|Eihdadj|NY|6467357778 +Kbegahd|Ixhdadj|NY|6461316704 +Gcqgahd|Zmhdadj|NY|9182354383 +Icogahd|Eahdadj|NY|6462156178 +Kbfgahd|Jwhdadj|NY|6462326704 +Gcrgahd|Zbhdadj|NY|9182455484 +Icrgahd|Fbhdadj|NY|6462456456 +Kbigahd|Jshdadj|NY|6465356704 +Gdvgahd|Achdadj|NY|9182859888 +Idsgahd|Fdhdadj|NY|6462556556 +Kcjgahd|Jphdadj|NY|6466376704 +Gdygahd|Afhdadj|NY|9181316219 +Idtgahd|Fnhdadj|NY|6462656656 +Kclgahd|Jbhdadj|NY|6468136704 +Hbegahd|Bxhdadj|NY|2121356799 +Idvgahd|Fchdadj|NY|6462856856 +Kcqgahd|Kmhdadj|NY|6462354766 +Hbfgahd|Bwhdadj|NY|2122356799 +Idwgahd|Fdhdadj|NY|6462956956 +Kcrgahd|Kbhdadj|NY|6462455766 +Hdugahd|Cbhdadj|NY|2122756767 +Idxgahd|Fehdadj|NY|6462306709 +Kdsgahd|Kdhdadj|NY|6462556766 +Iadgahd|Dyhdadj|NY|2120350767 +Jcogahd|Hahdadj|NY|6462156755 +Kdugahd|Kbhdadj|NY|6462758766 +Ibhgahd|Dthdadj|NY|2124354778 +Jcpgahd|Hkhdadj|NY|6462256755 +Kdzgahd|Lghdadj|NY|6462326366 +Icjgahd|Dphdadj|NY|2126356778 +Jcqgahd|Hmhdadj|NY|6462356755 +Lbegahd|Lxhdadj|NY|6461311766 +Iclgahd|Ebhdadj|NY|2128358778 +Jdugahd|Ibhdadj|NY|6462756755 +Ldsgahd|Mdhdadj|NY|6462556529 +Icmgahd|Exhdadj|NY|2129359778 +Jdxgahd|Iehdadj|NY|6462306755 +Ldvgahd|Nchdadj|NY|6462859829 +Idygahd|Gfhdadj|NY|2122316719 +Jdygahd|Ifhdadj|NY|6462316755 +Ldwgahd|Ndhdadj|NY|6462956929 +Idzgahd|Gghdadj|NY|2122326729 +Kbggahd|Juhdadj|NY|6463336704 +Ldygahd|Nfhdadj|NY|6462316219 +Jbggahd|Guhdadj|NY|2123356701 +Kbhgahd|Jthdadj|NY|6464346704 +Mbfgahd|Nwhdadj|NY|6462322729 +Jbhgahd|Gthdadj|NY|2124356701 +Kcmgahd|Jxhdadj|NY|6469350704 +Mclgahd|Obhdadj|NY|6468138789 +Jcjgahd|Gphdadj|NY|2126356701 +Kcpgahd|Kkhdadj|NY|6462253704 +Mcmgahd|Oxhdadj|NY|6469359799 +Jcmgahd|Hxhdadj|NY|2129356701 +Kdtgahd|Knhdadj|NY|6462657766 +Mcqgahd|Omhdadj|NY|6462354383 +Jcngahd|Hghdadj|NY|2122056755 +Kdxgahd|Lehdadj|NY|6462306166 +Mcrgahd|Obhdadj|NY|6462455484 +Jdtgahd|Inhdadj|NY|2122656755 +Kdygahd|Lfhdadj|NY|6462316266 +Mdxgahd|Pehdadj|NY|6460306109 +Jdvgahd|Ichdadj|NY|2122856755 +Lbfgahd|Lwhdadj|NY|6462322766 +Ncjgahd|Pphdadj|NY|6466376769 +Jdwgahd|Idhdadj|NY|2122956755 +Lbigahd|Lshdadj|NY|6465355729 +Nckgahd|Pihdadj|NY|6467387779 +Kckgahd|Jihdadj|NY|2127386704 +Lckgahd|Mihdadj|NY|6467387729 +Ncrgahd|Qbhdadj|NY|6462455484 +Kcngahd|Jghdadj|NY|2122051704 +Lcmgahd|Mxhdadj|NY|6469359729 +Ndtgahd|Qnhdadj|NY|6462657686 +Kcogahd|Kahdadj|NY|2122152704 +Lcqgahd|Mmhdadj|NY|6462354329 +Ndugahd|Qbhdadj|NY|6462758787 +Kdvgahd|Kchdadj|NY|2122859766 +Ldxgahd|Nehdadj|NY|6462306109 +Ndvgahd|Qchdadj|NY|6462859888 +Kdwgahd|Ldhdadj|NY|2122956066 +Ldzgahd|Nghdadj|NY|6462326329 +Ndygahd|Rfhdadj|NY|6461316219 +Ladgahd|Lyhdadj|NY|2120300766 +Mbegahd|Nxhdadj|NY|6461311719 +Ndzgahd|Rghdadj|NY|6462326329 +Lbggahd|Luhdadj|NY|2123333729 +Mbigahd|Nshdadj|NY|6465355759 +Obggahd|Ruhdadj|NY|8453356776 +Lbhgahd|Lthdadj|NY|2124344729 +Mckgahd|Nihdadj|NY|6467387779 +Obigahd|Rshdadj|NY|8455356776 +Lcjgahd|Lphdadj|NY|2126376729 +Mcngahd|Oghdadj|NY|6462064680 +Oclgahd|Sbhdadj|NY|8458356776 +Lclgahd|Mbhdadj|NY|2128138729 +Mcogahd|Oahdadj|NY|6462152181 +Ocmgahd|Sxhdadj|NY|8459356776 +Lcngahd|Mghdadj|NY|2122051029 +Mdtgahd|Onhdadj|NY|6462657686 +Ocogahd|Sahdadj|NY|8452156776 +Lcogahd|Mahdadj|NY|2122152129 +Mdugahd|Obhdadj|NY|6462758787 +Ocqgahd|Smhdadj|NY|8452356776 +Lcpgahd|Mkhdadj|NY|2122253229 +Mdvgahd|Ochdadj|NY|6462859888 +Odugahd|Tbhdadj|NY|8452756776 +Lcrgahd|Mbhdadj|NY|2122455429 +Nbegahd|Pxhdadj|NY|6461311719 +Padgahd|Tyhdadj|NY|8450350767 +Ldtgahd|Mnhdadj|NY|2122657629 +Nbigahd|Pshdadj|NY|6465355759 +Pbfgahd|Twhdadj|NY|8452352767 +Ldugahd|Mbhdadj|NY|2122758729 +Nclgahd|Qbhdadj|NY|6468138789 +Pbggahd|Tuhdadj|NY|8453353767 +Madgahd|Nyhdadj|NY|2120300709 +Ncngahd|Qghdadj|NY|6462064680 +Pcjgahd|Uphdadj|NY|8456356767 +Mbggahd|Nuhdadj|NY|2123333739 +Ncqgahd|Qmhdadj|NY|6462354383 +Pckgahd|Uihdadj|NY|8457357767 +Mbhgahd|Nthdadj|NY|2124344749 +Ndsgahd|Qdhdadj|NY|6462556585 +Pcngahd|Ughdadj|NY|8452056067 +Mcjgahd|Nphdadj|NY|2126376769 +Ndxgahd|Rehdadj|NY|6460306109 +Pdugahd|Ubhdadj|NY|8452756700 +Mcpgahd|Okhdadj|NY|2122253282 +Obhgahd|Rthdadj|NY|8454356776 +Pdxgahd|Vehdadj|NY|8452306709 +Mdsgahd|Odhdadj|NY|2122556585 +Ocpgahd|Skhdadj|NY|8452256776 +Pdygahd|Vfhdadj|NY|8452316719 +Mdwgahd|Pdhdadj|NY|2122956989 +Ocrgahd|Sbhdadj|NY|8452456776 +Rbggahd|Vuhdadj|NY|8453356700 +Mdygahd|Pfhdadj|NY|2121316219 +Odsgahd|Sdhdadj|NY|8452556776 +Rbigahd|Vshdadj|NY|8455356700 +Mdzgahd|Pghdadj|NY|2122326329 +Odvgahd|Tchdadj|NY|8452856776 +Rcjgahd|Vphdadj|NY|8456356700 +Nadgahd|Pyhdadj|NY|2120300709 +Odxgahd|Tehdadj|NY|8452306767 +Sbfgahd|Xwhdadj|NY|8452326706 +Nbfgahd|Pwhdadj|NY|2122322729 +Odygahd|Tfhdadj|NY|8452316767 +Sbggahd|Xuhdadj|NY|8453336706 +Nbggahd|Puhdadj|NY|2123333739 +Odzgahd|Tghdadj|NY|8452326767 +Sbigahd|Xshdadj|NY|8455356740 +Nbhgahd|Pthdadj|NY|2124344749 +Pbegahd|Txhdadj|NY|8451351767 +Scngahd|Xghdadj|NY|8452051740 +Ncmgahd|Qxhdadj|NY|2129359799 +Pbigahd|Tshdadj|NY|8455355767 +Scpgahd|Ykhdadj|NY|8452253740 +Ncogahd|Qahdadj|NY|2122152181 +Pclgahd|Ubhdadj|NY|8458358767 +Scqgahd|Ymhdadj|NY|8452354740 +Ncpgahd|Qkhdadj|NY|2122253282 +Pcmgahd|Uxhdadj|NY|8459359767 +Sdzgahd|Yghdadj|NY|8452326333 +Ndwgahd|Qdhdadj|NY|2122956989 +Pcpgahd|Ukhdadj|NY|8452256267 +Ubggahd|Zuhdadj|NY|8453333733 +Oadgahd|Ryhdadj|NY|7180356776 +Pdsgahd|Udhdadj|NY|8452558450 +Ubhgahd|Zthdadj|NY|8454344733 +Obegahd|Rxhdadj|NY|7181356776 +Pdwgahd|Udhdadj|NY|8452956900 +Uckgahd|Zihdadj|NY|8457387733 +Obfgahd|Rwhdadj|NY|7182356776 +Pdzgahd|Vghdadj|NY|8452326729 +Ucngahd|Aghdadj|NY|8452051033 +Ocjgahd|Sphdadj|NY|7186356776 +Radgahd|Vyhdadj|NY|8450356700 +Ucogahd|Aahdadj|NY|8452152133 +Ockgahd|Sihdadj|NY|7187356776 +Rbhgahd|Vthdadj|NY|8454356700 +Ucrgahd|Abhdadj|NY|8452455433 +Ocngahd|Sghdadj|NY|7182056776 +Rcngahd|Wghdadj|NY|8452056700 +Udsgahd|Adhdadj|NY|8452556533 +Odtgahd|Snhdadj|NY|7182656776 +Rcpgahd|Wkhdadj|NY|8452256706 +Udwgahd|Adhdadj|NY|8452956933 +Odwgahd|Tdhdadj|NY|7182956776 +Rcrgahd|Wbhdadj|NY|8452456706 +Udzgahd|Bghdadj|NY|8452326329 +Pbhgahd|Tthdadj|NY|7184354767 +Rdugahd|Wbhdadj|NY|8452756706 +Vbfgahd|Bwhdadj|NY|8452322729 +Pcogahd|Uahdadj|NY|7182156167 +Rdvgahd|Wchdadj|NY|8452856706 +Vcjgahd|Bphdadj|NY|8456376769 +Pcqgahd|Umhdadj|NY|7182356367 +Rdxgahd|Wehdadj|NY|8452306706 +Vcmgahd|Cxhdadj|NY|8459359799 +Pcrgahd|Ubhdadj|NY|7182456467 +Rdygahd|Wfhdadj|NY|8452316706 +Vcpgahd|Ckhdadj|NY|8452253282 +Pdtgahd|Unhdadj|NY|7182656600 +Rdzgahd|Wghdadj|NY|8452326706 +Vdxgahd|Cehdadj|NY|8450306109 +Pdvgahd|Uchdadj|NY|7182856800 +Sadgahd|Xyhdadj|NY|8450306706 +Vdygahd|Cfhdadj|NY|8451316219 +Rbegahd|Vxhdadj|NY|7181356700 +Sbegahd|Xxhdadj|NY|8451316706 +Vdzgahd|Cghdadj|NY|8452326329 +Rbfgahd|Vwhdadj|NY|7182356700 +Sbhgahd|Xthdadj|NY|8454346706 +Wadgahd|Dyhdadj|NY|8450300709 +Rckgahd|Vihdadj|NY|7187356700 +Sckgahd|Xihdadj|NY|8457386740 +Wbggahd|Duhdadj|NY|8453333739 +Rclgahd|Wbhdadj|NY|7188356700 +Sclgahd|Xbhdadj|NY|8458456740 +Wcjgahd|Dphdadj|NY|8456376769 +Rcmgahd|Wxhdadj|NY|7189356700 +Scogahd|Yahdadj|NY|8452152740 +Wcmgahd|Dxhdadj|NY|8459359799 +Rcogahd|Wahdadj|NY|7182156700 +Sdsgahd|Ydhdadj|NY|8452556740 +Wdvgahd|Echdadj|NY|8452859888 +Rcqgahd|Wmhdadj|NY|7182356706 +Sdvgahd|Ychdadj|NY|8452859740 +Wdygahd|Efhdadj|NY|8451316219 +Rdsgahd|Wdhdadj|NY|7182556706 +Sdwgahd|Ydhdadj|NY|8452956040 +Xbegahd|Exhdadj|NY|9171356790 +Rdtgahd|Wnhdadj|NY|7182656706 +Sdxgahd|Yehdadj|NY|8452306140 +Xbfgahd|Ewhdadj|NY|9172356790 +Rdwgahd|Wdhdadj|NY|7182956706 +Ubfgahd|Zwhdadj|NY|8452322733 +Xbggahd|Euhdadj|NY|9173356790 +Scjgahd|Xphdadj|NY|7186376740 +Ucjgahd|Zphdadj|NY|8456376733 +Xbhgahd|Ethdadj|NY|9174356790 +Scmgahd|Xxhdadj|NY|7189350740 +Ucpgahd|Akhdadj|NY|8452253233 +Xcjgahd|Ephdadj|NY|9176356790 +Scrgahd|Ybhdadj|NY|7182455740 +Udvgahd|Achdadj|NY|8452859833 +Xcngahd|Fghdadj|NY|9172056790 +Sdtgahd|Ynhdadj|NY|7182657740 +Udygahd|Bfhdadj|NY|8452316219 +Xdsgahd|Fdhdadj|NY|9172556779 +Sdugahd|Ybhdadj|NY|7182758740 +Vadgahd|Byhdadj|NY|8450300709 +Xdugahd|Fbhdadj|NY|9172756779 +Sdygahd|Yfhdadj|NY|7182316233 +Vbegahd|Bxhdadj|NY|8451311719 +Xdygahd|Ffhdadj|NY|9172316779 +Uadgahd|Zyhdadj|NY|7180300733 +Vbhgahd|Bthdadj|NY|8454344749 +Yadgahd|Gyhdadj|NY|9170350779 +Ubegahd|Zxhdadj|NY|7181311733 +Vbigahd|Bshdadj|NY|8455355759 +Ybegahd|Gxhdadj|NY|9171351779 +Ubigahd|Zshdadj|NY|7185355733 +Vckgahd|Bihdadj|NY|8457387779 +Ybfgahd|Gwhdadj|NY|9172352779 +Uclgahd|Zbhdadj|NY|7187188733 +Vclgahd|Bbhdadj|NY|8458458789 +Ybhgahd|Gthdadj|NY|9174354779 +Ucmgahd|Axhdadj|NY|7189359733 +Vcqgahd|Cmhdadj|NY|8452354383 +Ycjgahd|Gphdadj|NY|9176356779 +Ucqgahd|Amhdadj|NY|7182354333 +Vdugahd|Cbhdadj|NY|8452758787 +Yclgahd|Gbhdadj|NY|9178358744 +Udtgahd|Anhdadj|NY|7182657633 +Vdvgahd|Cchdadj|NY|8452859888 +Ycpgahd|Gkhdadj|NY|9172256244 +Udugahd|Abhdadj|NY|7182758733 +Vdwgahd|Cdhdadj|NY|8452956989 +Ydtgahd|Hnhdadj|NY|9172656644 +Udxgahd|Aehdadj|NY|7182306109 +Wbfgahd|Dwhdadj|NY|8452322729 +Ydwgahd|Hdhdadj|NY|9172956944 +Vbggahd|Buhdadj|NY|7183333739 +Wbhgahd|Dthdadj|NY|8454344749 +Ydxgahd|Hehdadj|NY|9172306709 +Vcngahd|Cghdadj|NY|7182051080 +Wcogahd|Dahdadj|NY|8452152181 +Ydygahd|Hfhdadj|NY|9172316719 +Vcogahd|Cahdadj|NY|7182152181 +Wcpgahd|Dkhdadj|NY|8452253282 +Ydzgahd|Hghdadj|NY|9172326729 +Vcrgahd|Cbhdadj|NY|7182455484 +Wcqgahd|Emhdadj|NY|8452354383 +Zadgahd|Hyhdadj|NY|9170356744 +Vdsgahd|Cdhdadj|NY|7182556585 +Wdugahd|Ebhdadj|NY|8452758787 +Zbfgahd|Hwhdadj|NY|9172356744 +Vdtgahd|Cnhdadj|NY|7182657686 +Wdxgahd|Eehdadj|NY|8450306109 +Zbhgahd|Hthdadj|NY|9174356766 +Wbegahd|Dxhdadj|NY|7181311719 +Xbigahd|Eshdadj|NY|9175356790 +Zcjgahd|Iphdadj|NY|9176356766 +Wbigahd|Dshdadj|NY|7185355759 +Xckgahd|Eihdadj|NY|9177356790 +Zcmgahd|Ixhdadj|NY|9179356766 +Wckgahd|Dihdadj|NY|7187387779 +Xcmgahd|Fxhdadj|NY|9179356790 +Zdvgahd|Jchdadj|NY|9172856751 +Wclgahd|Dbhdadj|NY|7187188789 +Xcpgahd|Fkhdadj|NY|9172256779 +Kedgahd|Jyhdadj|NY|9170306751 +Wcngahd|Dghdadj|NY|7182051080 +Xdvgahd|Fchdadj|NY|9172856779 +Keegahd|Jxhdadj|NY|9171316751 +Wcrgahd|Ebhdadj|NY|7182455484 +Xdwgahd|Fdhdadj|NY|9172956779 +Kehgahd|Jthdadj|NY|9174346751 +Wdsgahd|Edhdadj|NY|7182556585 +Xdxgahd|Fehdadj|NY|9172306779 +Kelgahd|Jbhdadj|NY|9178136751 +Wdtgahd|Enhdadj|NY|7182657686 +Ybigahd|Gshdadj|NY|9175355779 +Keqgahd|Kmhdadj|NY|9172354762 +Wdwgahd|Edhdadj|NY|7182956989 +Yckgahd|Gihdadj|NY|9177357779 +Ketgahd|Knhdadj|NY|9172657762 +Wdzgahd|Eghdadj|NY|7182326329 +Ycogahd|Gahdadj|NY|9172156144 +Kezgahd|Kghdadj|NY|9172326362 +Xadgahd|Eyhdadj|NY|2120356790 +Ycqgahd|Gmhdadj|NY|9172356344 +Liggahd|Luhdadj|NY|9173333762 +Xclgahd|Fbhdadj|NY|2128356790 +Ydsgahd|Hdhdadj|NY|9172556544 +Likgahd|Lihdadj|NY|9177387762 +Xcogahd|Fahdadj|NY|2122156790 +Ydvgahd|Hchdadj|NY|9172856844 +Lilgahd|Lbhdadj|NY|9178138762 +Xcqgahd|Fmhdadj|NY|2122356779 +Zbegahd|Hxhdadj|NY|9171356744 +Lipgahd|Lkhdadj|NY|9172253288 +Xcrgahd|Fbhdadj|NY|2122456779 +Zcogahd|Iahdadj|NY|9172156766 +Liygahd|Mfhdadj|NY|9172316219 +Xdtgahd|Fnhdadj|NY|2122656779 +Zcpgahd|Ikhdadj|NY|9172256766 +Moegahd|Mxhdadj|NY|9171311719 +Xdzgahd|Fghdadj|NY|2122326779 +Zdwgahd|Jdhdadj|NY|9172956751 +Moggahd|Muhdadj|NY|9173333739 +Ybggahd|Guhdadj|NY|2123353779 +Zdygahd|Jfhdadj|NY|9172316751 +Mohgahd|Mthdadj|NY|9174344749 +Ycmgahd|Gxhdadj|NY|2129359744 +Kefgahd|Jwhdadj|NY|9172326751 +Momgahd|Nxhdadj|NY|9179359799 +Ycngahd|Gghdadj|NY|2122056044 +Keigahd|Jshdadj|NY|9175356751 +Moqgahd|Nmhdadj|NY|9172354383 +Ycrgahd|Gbhdadj|NY|2122456444 +Kemgahd|Kxhdadj|NY|9179350751 +Motgahd|Nnhdadj|NY|9172657686 +Ydugahd|Hbhdadj|NY|2122756744 +Kengahd|Kghdadj|NY|9172051751 +Movgahd|Nchdadj|NY|9172859888 +Zbggahd|Huhdadj|NY|2123356766 +Kepgahd|Kkhdadj|NY|9172253751 +Mozgahd|Oghdadj|NY|9172326329 +Zbigahd|Ishdadj|NY|2125356766 +Kesgahd|Kdhdadj|NY|9172556762 +Nufgahd|Owhdadj|NY|9172322729 +Zckgahd|Iihdadj|NY|2127356766 +Kewgahd|Kdhdadj|NY|9172956062 +Nuggahd|Ouhdadj|NY|9173333739 +Zclgahd|Ibhdadj|NY|2128356766 +Kexgahd|Kehdadj|NY|9172306162 +Nuhgahd|Othdadj|NY|9174344749 +Zcngahd|Ighdadj|NY|2122056766 +Lidgahd|Lyhdadj|NY|9170300762 +Nukgahd|Oihdadj|NY|9177387779 +Zcqgahd|Imhdadj|NY|2122356766 +Liegahd|Lxhdadj|NY|9171311762 +Nulgahd|Pbhdadj|NY|9178138789 +Zcrgahd|Ibhdadj|NY|2122456766 +Liigahd|Lshdadj|NY|9175355762 +Nuxgahd|Qehdadj|NY|9170306109 +Zdsgahd|Idhdadj|NY|2122556766 +Lijgahd|Lphdadj|NY|9176376762 +Nuygahd|Qfhdadj|NY|9171316219 +Zdtgahd|Inhdadj|NY|2122656766 +Liqgahd|Lmhdadj|NY|9172354388 +Badgahd|Eyhdadj|NY|7180350711 +Zdugahd|Ibhdadj|NY|2122756766 +Lirgahd|Mbhdadj|NY|9172455488 +Bbfgahd|Ewhdadj|NY|7182352711 +Zdxgahd|Jehdadj|NY|2122306751 +Litgahd|Mnhdadj|NY|9172657688 +Bcjgahd|Fphdadj|NY|7186356711 +Zdzgahd|Jghdadj|NY|2122326751 +Liugahd|Mbhdadj|NY|9172758788 +Bclgahd|Fbhdadj|NY|7188358700 +Keggahd|Juhdadj|NY|2123336751 +Lizgahd|Mghdadj|NY|9172326329 +Bcogahd|Fahdadj|NY|7182156100 +Kejgahd|Jphdadj|NY|2126376751 +Modgahd|Myhdadj|NY|9170300709 +Bcqgahd|Gmhdadj|NY|7182356300 +Kekgahd|Jihdadj|NY|2127386751 +Mongahd|Nghdadj|NY|9172091780 +Bcrgahd|Gbhdadj|NY|7182456400 +Keogahd|Kahdadj|NY|2122152751 +Mopgahd|Nkhdadj|NY|9172253282 +Bdvgahd|Gchdadj|NY|7182856800 +Kergahd|Kbhdadj|NY|2122455762 +Mosgahd|Ndhdadj|NY|9172556585 +Cadgahd|Iyhdadj|NY|7180356918 +Keugahd|Kbhdadj|NY|2122758762 +Mowgahd|Ndhdadj|NY|9172956989 +Cbegahd|Ixhdadj|NY|7181356918 +Kevgahd|Kchdadj|NY|2122859762 +Nudgahd|Oyhdadj|NY|9170300709 +Cbhgahd|Ithdadj|NY|7184356918 +Keygahd|Kfhdadj|NY|2122316262 +Nujgahd|Ophdadj|NY|9176376769 +Ccmgahd|Jxhdadj|NY|7189356721 +Lifgahd|Lwhdadj|NY|2122322762 +Numgahd|Pxhdadj|NY|9179359799 +Ccogahd|Jahdadj|NY|7182156721 +Lihgahd|Lthdadj|NY|2124344762 +Nungahd|Pghdadj|NY|9172091780 +Ccpgahd|Kkhdadj|NY|7182256721 +Limgahd|Lxhdadj|NY|2129359762 +Nuogahd|Pahdadj|NY|9172152181 +Ccqgahd|Kmhdadj|NY|7182356721 +Lingahd|Lghdadj|NY|2122051088 +Nuqgahd|Pmhdadj|NY|9172354383 +Cdwgahd|Ldhdadj|NY|7182956721 +Liogahd|Lahdadj|NY|2122152188 +Nurgahd|Pbhdadj|NY|9172455484 +Cdzgahd|Lghdadj|NY|7182326722 +Lisgahd|Mdhdadj|NY|2122556588 +Nutgahd|Pnhdadj|NY|9172657686 +Dbggahd|Muhdadj|NY|7183336722 +Livgahd|Mchdadj|NY|2122859888 +Nuugahd|Pbhdadj|NY|9172758787 +Dckgahd|Nihdadj|NY|7187386722 +Liwgahd|Mdhdadj|NY|2122956988 +Nuzgahd|Qghdadj|NY|9172326329 +Dcogahd|Nahdadj|NY|7182152732 +Lixgahd|Mehdadj|NY|2122306109 +Aadgahd|Ayhdadj|NY|7180356710 +Dcrgahd|Obhdadj|NY|7182455732 +Mofgahd|Mwhdadj|NY|2122322729 +Abhgahd|Athdadj|NY|7184356710 +Ddsgahd|Odhdadj|NY|7182556732 +Moigahd|Mshdadj|NY|2125355759 +Ackgahd|Bihdadj|NY|7187356710 +Ddtgahd|Onhdadj|NY|7182657732 +Mojgahd|Nphdadj|NY|2126376769 +Aclgahd|Bbhdadj|NY|7188356710 +Ddugahd|Obhdadj|NY|7182758732 +Mokgahd|Nihdadj|NY|2127387779 +Acmgahd|Bxhdadj|NY|7189356701 +Eadgahd|Ryhdadj|NY|7180300745 +Molgahd|Nbhdadj|NY|2128138789 +Acpgahd|Bkhdadj|NY|7182256701 +Ebegahd|Rxhdadj|NY|7181311745 +Moogahd|Nahdadj|NY|2122152181 +Adtgahd|Cnhdadj|NY|7182656701 +Ebfgahd|Rwhdadj|NY|7182322745 +Morgahd|Nbhdadj|NY|2122455484 +Advgahd|Dchdadj|NY|7182856701 +Ebhgahd|Rthdadj|NY|7184344745 +Mougahd|Nbhdadj|NY|2122758787 +Adxgahd|Dehdadj|NY|7182306711 +Eckgahd|Sihdadj|NY|7187387745 +Moxgahd|Nehdadj|NY|2120306109 +Adygahd|Dfhdadj|NY|7182316711 +Ecmgahd|Sxhdadj|NY|7189359745 +Moygahd|Ofhdadj|NY|2121316219 +Bbegahd|Axhdadj|NY|7181351711 +Ecogahd|Tahdadj|NY|7182152145 +Nuegahd|Oxhdadj|NY|2121311719 +Bckgahd|Fihdadj|NY|7187357700 +Ecrgahd|Tbhdadj|NY|7182455445 +Nuigahd|Oshdadj|NY|2125355759 +Bcmgahd|Fxhdadj|NY|7189359700 +Edugahd|Ubhdadj|NY|7182758709 +Nupgahd|Pkhdadj|NY|2122253282 +Bcpgahd|Gkhdadj|NY|7182256200 +Edvgahd|Uchdadj|NY|7182859809 +Nusgahd|Pdhdadj|NY|2122556585 +Bdsgahd|Gdhdadj|NY|7182558130 +Edzgahd|Vghdadj|NY|7182326329 +Nuvgahd|Pchdadj|NY|2122859888 +Bdugahd|Gbhdadj|NY|7182756700 +Fadgahd|Vyhdadj|NY|7180300709 +Nuwgahd|Pdhdadj|NY|2122956989 +Bdwgahd|Hdhdadj|NY|7182956900 +Fbigahd|Wshdadj|NY|7185355759 +Abegahd|Axhdadj|NY|7161356710 +Bdzgahd|Hghdadj|NY|7182326729 +Fcjgahd|Wphdadj|NY|7186376769 +Abfgahd|Awhdadj|NY|7162356710 +Cbigahd|Ishdadj|NY|7185356918 +Fclgahd|Wbhdadj|NY|7188138789 +Abggahd|Auhdadj|NY|7163356710 +Ccjgahd|Jphdadj|NY|7186356918 +Fcngahd|Wghdadj|NY|7182031080 +Abigahd|Ashdadj|NY|7165356710 +Cckgahd|Jihdadj|NY|7187356918 +Fcpgahd|Wkhdadj|NY|7182253282 +Acjgahd|Bphdadj|NY|7166356710 +Cclgahd|Jbhdadj|NY|7188356721 +Fdtgahd|Xnhdadj|NY|7182657686 +Acngahd|Bghdadj|NY|7162056701 +Ccrgahd|Kbhdadj|NY|7182456721 +Fdygahd|Yfhdadj|NY|7181316219 +Acogahd|Bahdadj|NY|7162156701 +Cdsgahd|Kdhdadj|NY|7182556721 +Gbigahd|Zshdadj|NY|7185355759 +Acqgahd|Cmhdadj|NY|7162356701 +Cdxgahd|Lehdadj|NY|7182306721 +Gckgahd|Zihdadj|NY|7187387779 +Acrgahd|Cbhdadj|NY|7162456701 +Dbhgahd|Mthdadj|NY|7184346722 +Gcmgahd|Zxhdadj|NY|7189359799 +Adsgahd|Cdhdadj|NY|7162556701 +Dbigahd|Nshdadj|NY|7185356722 +Gcogahd|Zahdadj|NY|7182152181 +Adugahd|Cbhdadj|NY|7162756701 +Dclgahd|Nbhdadj|NY|7188136732 +Gcpgahd|Zkhdadj|NY|7182253282 +Adwgahd|Ddhdadj|NY|7162956711 +Dcqgahd|Omhdadj|NY|7182354732 +Gdtgahd|Anhdadj|NY|7182657686 +Adzgahd|Dghdadj|NY|7162326711 +Ddvgahd|Ochdadj|NY|7182859732 +Gdugahd|Abhdadj|NY|7182758787 +Bbggahd|Euhdadj|NY|7163353711 +Ddwgahd|Odhdadj|NY|7182956045 +Gdwgahd|Adhdadj|NY|7182956989 +Bbhgahd|Ethdadj|NY|7164354711 +Ebigahd|Sshdadj|NY|7185355745 +Gdxgahd|Aehdadj|NY|7180306109 +Bbigahd|Eshdadj|NY|7165355711 +Ecjgahd|Sphdadj|NY|7186376745 +Hadgahd|Byhdadj|NY|6070356799 +Bcngahd|Fghdadj|NY|7162056000 +Eclgahd|Sbhdadj|NY|7188138745 +Hbigahd|Bshdadj|NY|6075356799 +Bdtgahd|Gnhdadj|NY|7162656600 +Ecngahd|Sghdadj|NY|7182031045 +Hcjgahd|Bphdadj|NY|6076356799 +Bdxgahd|Hehdadj|NY|7162306709 +Edwgahd|Udhdadj|NY|7182956909 +Hckgahd|Bihdadj|NY|6077356799 +Bdygahd|Hfhdadj|NY|7162316719 +Edygahd|Vfhdadj|NY|7182316219 +Hclgahd|Bbhdadj|NY|6078356799 +Cbfgahd|Iwhdadj|NY|7162356918 +Fbfgahd|Vwhdadj|NY|7182322729 +Hcngahd|Bghdadj|NY|6072056799 +Cbggahd|Iuhdadj|NY|7163356918 +Fcmgahd|Wxhdadj|NY|7189359799 +Hcpgahd|Ckhdadj|NY|6072256767 +Ccngahd|Jghdadj|NY|7162056721 +Fcqgahd|Xmhdadj|NY|7182354383 +Hdsgahd|Cdhdadj|NY|6072556767 +Cdtgahd|Knhdadj|NY|7162656721 +Fcrgahd|Xbhdadj|NY|7182455484 +Hdtgahd|Cnhdadj|NY|6072656767 +Cdugahd|Kbhdadj|NY|7162756721 +Fdzgahd|Yghdadj|NY|7182326329 +Hdzgahd|Dghdadj|NY|6072326767 +Cdvgahd|Lchdadj|NY|7162856721 +Gadgahd|Yyhdadj|NY|7180300709 +Ibegahd|Dxhdadj|NY|6071351778 +Cdygahd|Lfhdadj|NY|7162316722 +Gbegahd|Yxhdadj|NY|7181311719 +Ibfgahd|Dwhdadj|NY|6072352778 +Dadgahd|Myhdadj|NY|7160306722 +Gbggahd|Yuhdadj|NY|7183333739 +Ibigahd|Dshdadj|NY|6075355778 +Dbegahd|Mxhdadj|NY|7161316722 +Gcjgahd|Zphdadj|NY|7186376769 +Icngahd|Eghdadj|NY|6072056078 +Dbfgahd|Mwhdadj|NY|7162326722 +Gcngahd|Zghdadj|NY|7182031080 +Icpgahd|Ekhdadj|NY|6072256278 +Dcjgahd|Nphdadj|NY|7166376722 +Gdsgahd|Adhdadj|NY|7182556585 +Icqgahd|Emhdadj|NY|6072356356 +Dcmgahd|Nxhdadj|NY|7169350732 +Gdzgahd|Aghdadj|NY|7182326329 +Idugahd|Fbhdadj|NY|6072756756 +Dcngahd|Nghdadj|NY|7162051732 +Hbggahd|Buhdadj|NY|6073356799 +Jadgahd|Gyhdadj|NY|6070356701 +Dcpgahd|Nkhdadj|NY|7162253732 +Hbhgahd|Bthdadj|NY|6074356799 +Jbegahd|Gxhdadj|NY|6071356701 +Ddxgahd|Pehdadj|NY|7162306145 +Hcmgahd|Bxhdadj|NY|6079356799 +Jbfgahd|Gwhdadj|NY|6072356701 +Ddygahd|Pfhdadj|NY|7162316245 +Hcogahd|Bahdadj|NY|6072156799 +Jbigahd|Gshdadj|NY|6075356701 +Ddzgahd|Pghdadj|NY|7162326345 +Hcqgahd|Cmhdadj|NY|6072356767 +Jckgahd|Hihdadj|NY|6077356701 +Ebggahd|Ruhdadj|NY|7163333745 +Hcrgahd|Cbhdadj|NY|6072456767 +Jclgahd|Hbhdadj|NY|6078356701 +Ecpgahd|Tkhdadj|NY|7162253245 +Hdvgahd|Cchdadj|NY|6072856767 +Jcrgahd|Hbhdadj|NY|6072456755 +Ecqgahd|Tmhdadj|NY|7162354345 +Hdwgahd|Cdhdadj|NY|6072956767 +Jdsgahd|Hdhdadj|NY|6072556755 +Edsgahd|Tdhdadj|NY|7162558139 +Hdxgahd|Cehdadj|NY|6072306767 +Jdzgahd|Ighdadj|NY|6072326755 +Edtgahd|Unhdadj|NY|7162657609 +Hdygahd|Dfhdadj|NY|6072316767 +Kadgahd|Iyhdadj|NY|6070306704 +Edxgahd|Uehdadj|NY|7162306109 +Ibggahd|Duhdadj|NY|6073353778 +Kbegahd|Ixhdadj|NY|6071316704 +Fbegahd|Vxhdadj|NY|7161311719 +Ickgahd|Eihdadj|NY|6077357778 +Kbfgahd|Jwhdadj|NY|6072326704 +Fbggahd|Vuhdadj|NY|7163333739 +Icogahd|Eahdadj|NY|6072156178 +Kbigahd|Jshdadj|NY|6075356704 +Fbhgahd|Vthdadj|NY|7164344749 +Icrgahd|Fbhdadj|NY|6072456456 +Kcjgahd|Jphdadj|NY|6076376704 +Fckgahd|Wihdadj|NY|7167387779 +Idsgahd|Fdhdadj|NY|6072556556 +Kclgahd|Jbhdadj|NY|6076076704 +Fcogahd|Wahdadj|NY|7162152181 +Idtgahd|Fnhdadj|NY|6072656656 +Kcqgahd|Kmhdadj|NY|6072354766 +Fdsgahd|Xdhdadj|NY|7162556585 +Idvgahd|Fchdadj|NY|6072856856 +Kcrgahd|Kbhdadj|NY|6072455766 +Fdugahd|Xbhdadj|NY|7162758787 +Idwgahd|Fdhdadj|NY|6072956956 +Kdsgahd|Kdhdadj|NY|6072556766 +Fdvgahd|Xchdadj|NY|7162859888 +Idxgahd|Fehdadj|NY|6072306709 +Kdugahd|Kbhdadj|NY|6072758766 +Fdwgahd|Xdhdadj|NY|7162956989 +Jcogahd|Hahdadj|NY|6072156755 +Kdzgahd|Lghdadj|NY|6072326366 +Fdxgahd|Xehdadj|NY|7160306109 +Jcpgahd|Hkhdadj|NY|6072256755 +Lbegahd|Lxhdadj|NY|6071311766 +Gbfgahd|Ywhdadj|NY|7162322729 +Jcqgahd|Hmhdadj|NY|6072356755 +Ldsgahd|Mdhdadj|NY|6072556529 +Gbhgahd|Ythdadj|NY|7164344749 +Jdugahd|Ibhdadj|NY|6072756755 +Ldvgahd|Nchdadj|NY|6072859829 +Gclgahd|Zbhdadj|NY|7168138789 +Jdxgahd|Iehdadj|NY|6072306755 +Ldwgahd|Ndhdadj|NY|6072956929 +Gcqgahd|Zmhdadj|NY|7162354383 +Jdygahd|Ifhdadj|NY|6072316755 +Ldygahd|Nfhdadj|NY|6072316219 +Gcrgahd|Zbhdadj|NY|7162455484 +Kbggahd|Juhdadj|NY|6073336704 +Mbfgahd|Nwhdadj|NY|6072322729 +Gdvgahd|Achdadj|NY|7162859888 +Kbhgahd|Jthdadj|NY|6074346704 +Mclgahd|Obhdadj|NY|6076078789 +Gdygahd|Afhdadj|NY|7161316219 +Kcmgahd|Jxhdadj|NY|6079350704 +Mcmgahd|Oxhdadj|NY|6079359799 +Hbegahd|Bxhdadj|NY|6461356799 +Kcpgahd|Kkhdadj|NY|6072253704 +Mcqgahd|Omhdadj|NY|6072354383 +Hbfgahd|Bwhdadj|NY|6462356799 +Kdtgahd|Knhdadj|NY|6072657766 +Mcrgahd|Obhdadj|NY|6072455484 +Hdugahd|Cbhdadj|NY|6462756767 +Kdxgahd|Lehdadj|NY|6072306166 +Mdxgahd|Pehdadj|NY|6070306109 +Iadgahd|Dyhdadj|NY|6460350767 +Kdygahd|Lfhdadj|NY|6072316266 +Ncjgahd|Pphdadj|NY|6076376769 +Ibhgahd|Dthdadj|NY|6464354778 +Lbfgahd|Lwhdadj|NY|6072322766 +Nckgahd|Pihdadj|NY|6077387779 +Icjgahd|Dphdadj|NY|6466356778 +Lbigahd|Lshdadj|NY|6075355729 +Ncrgahd|Qbhdadj|NY|6072455484 +Iclgahd|Ebhdadj|NY|6468358778 +Lckgahd|Mihdadj|NY|6077387729 +Ndtgahd|Qnhdadj|NY|6072657686 +Icmgahd|Exhdadj|NY|6469359778 +Lcmgahd|Mxhdadj|NY|6079359729 +Ndugahd|Qbhdadj|NY|6072758787 +Idygahd|Gfhdadj|NY|6462316719 +Lcqgahd|Mmhdadj|NY|6072354329 +Ndvgahd|Qchdadj|NY|6072859888 +Idzgahd|Gghdadj|NY|6462326729 +Ldxgahd|Nehdadj|NY|6072306109 +Ndygahd|Rfhdadj|NY|6071316219 +Jbggahd|Guhdadj|NY|6463356701 +Ldzgahd|Nghdadj|NY|6072326329 +Ndzgahd|Rghdadj|NY|6072326329 +Jbhgahd|Gthdadj|NY|6464356701 +Mbegahd|Nxhdadj|NY|6071311719 +Obggahd|Ruhdadj|NY|6073356776 +Jcjgahd|Gphdadj|NY|6466356701 +Mbigahd|Nshdadj|NY|6075355759 +Obigahd|Rshdadj|NY|6075356776 +Jcmgahd|Hxhdadj|NY|6469356701 +Mckgahd|Nihdadj|NY|6077387779 +Oclgahd|Sbhdadj|NY|6078356776 +Jcngahd|Hghdadj|NY|6462056755 +Mcngahd|Oghdadj|NY|6072031080 +Ocmgahd|Sxhdadj|NY|6079356776 +Jdtgahd|Inhdadj|NY|6462656755 +Mcogahd|Oahdadj|NY|6072152181 +Ocogahd|Sahdadj|NY|6072156776 +Jdvgahd|Ichdadj|NY|6462856755 +Mdtgahd|Onhdadj|NY|6072657686 +Ocqgahd|Smhdadj|NY|6072356776 +Jdwgahd|Idhdadj|NY|6462956755 +Mdugahd|Obhdadj|NY|6072758787 +Odugahd|Tbhdadj|NY|6072756776 +Kckgahd|Jihdadj|NY|6467386704 +Mdvgahd|Ochdadj|NY|6072859888 +Padgahd|Tyhdadj|NY|6070350767 +Kcngahd|Jghdadj|NY|6462051704 +Nbegahd|Pxhdadj|NY|6071311719 +Pbfgahd|Twhdadj|NY|6072352767 +Kcogahd|Kahdadj|NY|6462152704 +Nbigahd|Pshdadj|NY|6075355759 +Pbggahd|Tuhdadj|NY|6073353767 +Kdvgahd|Kchdadj|NY|6462859766 +Nclgahd|Qbhdadj|NY|6076078789 +Pcjgahd|Uphdadj|NY|6076356767 +Kdwgahd|Ldhdadj|NY|6462956066 +Ncngahd|Qghdadj|NY|6072031080 +Pckgahd|Uihdadj|NY|6077357767 +Ladgahd|Lyhdadj|NY|6460300766 +Ncqgahd|Qmhdadj|NY|6072354383 +Pcngahd|Ughdadj|NY|6072056067 +Lbggahd|Luhdadj|NY|6463333729 +Ndsgahd|Qdhdadj|NY|6072556585 +Pdugahd|Ubhdadj|NY|6072756700 +Lbhgahd|Lthdadj|NY|6464344729 +Ndxgahd|Rehdadj|NY|6070306109 +Pdxgahd|Vehdadj|NY|6072306709 +Lcjgahd|Lphdadj|NY|6466376729 +Obhgahd|Rthdadj|NY|6074356776 +Pdygahd|Vfhdadj|NY|6072316719 +Lclgahd|Mbhdadj|NY|6468138729 +Ocpgahd|Skhdadj|NY|6072256776 +Rbggahd|Vuhdadj|NY|6073356700 +Lcngahd|Mghdadj|NY|6462064629 +Ocrgahd|Sbhdadj|NY|6072456776 +Rbigahd|Vshdadj|NY|6075356700 +Lcogahd|Mahdadj|NY|6462152129 +Odsgahd|Sdhdadj|NY|6072556776 +Rcjgahd|Vphdadj|NY|6076356700 +Lcpgahd|Mkhdadj|NY|6462253229 +Odvgahd|Tchdadj|NY|6072856776 +Sbfgahd|Xwhdadj|NY|6072326706 +Lcrgahd|Mbhdadj|NY|6462455429 +Odxgahd|Tehdadj|NY|6072306767 +Sbggahd|Xuhdadj|NY|6073336706 +Ldtgahd|Mnhdadj|NY|6462657629 +Odygahd|Tfhdadj|NY|6072316767 +Sbigahd|Xshdadj|NY|6075356740 +Ldugahd|Mbhdadj|NY|6462758729 +Odzgahd|Tghdadj|NY|6072326767 +Scngahd|Xghdadj|NY|6072051740 +Madgahd|Nyhdadj|NY|6460300709 +Pbegahd|Txhdadj|NY|6071351767 +Scpgahd|Ykhdadj|NY|6072253740 +Mbggahd|Nuhdadj|NY|6463333739 +Pbigahd|Tshdadj|NY|6075355767 +Scqgahd|Ymhdadj|NY|6072354740 +Mbhgahd|Nthdadj|NY|6464344749 +Pclgahd|Ubhdadj|NY|6078358767 +Sdzgahd|Yghdadj|NY|6072326333 +Mcjgahd|Nphdadj|NY|6466376769 +Pcmgahd|Uxhdadj|NY|6079359767 +Ubggahd|Zuhdadj|NY|6073333733 +Mcpgahd|Okhdadj|NY|6462253282 +Pcpgahd|Ukhdadj|NY|6072256267 +Ubhgahd|Zthdadj|NY|6074344733 +Mdsgahd|Odhdadj|NY|6462556585 +Pdsgahd|Udhdadj|NY|6072556070 +Uckgahd|Zihdadj|NY|6077387733 +Mdwgahd|Pdhdadj|NY|6462956989 +Pdwgahd|Udhdadj|NY|6072956900 +Ucngahd|Aghdadj|NY|6072031033 +Mdygahd|Pfhdadj|NY|6461316219 +Pdzgahd|Vghdadj|NY|6072326729 +Ucogahd|Aahdadj|NY|6072152133 +Mdzgahd|Pghdadj|NY|6462326329 +Radgahd|Vyhdadj|NY|6070356700 +Ucrgahd|Abhdadj|NY|6072455433 +Nadgahd|Pyhdadj|NY|6460300709 +Rbhgahd|Vthdadj|NY|6074356700 +Udsgahd|Adhdadj|NY|6072556533 +Nbfgahd|Pwhdadj|NY|6462322729 +Rcngahd|Wghdadj|NY|6072056700 +Udwgahd|Adhdadj|NY|6072956933 +Nbggahd|Puhdadj|NY|6463333739 +Rcpgahd|Wkhdadj|NY|6072256706 +Udzgahd|Bghdadj|NY|6072326329 +Nbhgahd|Pthdadj|NY|6464344749 +Rcrgahd|Wbhdadj|NY|6072456706 +Vbfgahd|Bwhdadj|NY|6072322729 +Ncmgahd|Qxhdadj|NY|6469359799 +Rdugahd|Wbhdadj|NY|6072756706 +Vcjgahd|Bphdadj|NY|6076376769 +Ncogahd|Qahdadj|NY|6462152181 +Rdvgahd|Wchdadj|NY|6072856706 +Vcmgahd|Cxhdadj|NY|6079359799 +Ncpgahd|Qkhdadj|NY|6462253282 +Rdxgahd|Wehdadj|NY|6072306706 +Vcpgahd|Ckhdadj|NY|6072253282 +Ndwgahd|Qdhdadj|NY|6462956989 +Rdygahd|Wfhdadj|NY|6072316706 +Vdxgahd|Cehdadj|NY|6070306109 +Oadgahd|Ryhdadj|NY|8450356776 +Rdzgahd|Wghdadj|NY|6072326706 +Vdygahd|Cfhdadj|NY|6071316219 +Obegahd|Rxhdadj|NY|8451356776 +Sadgahd|Xyhdadj|NY|6070306706 +Vdzgahd|Cghdadj|NY|6072326329 +Obfgahd|Rwhdadj|NY|8452356776 +Sbegahd|Xxhdadj|NY|6071316706 +Wadgahd|Dyhdadj|NY|6070300709 +Ocjgahd|Sphdadj|NY|8456356776 +Sbhgahd|Xthdadj|NY|6074346706 +Wbggahd|Duhdadj|NY|6073333739 +Ockgahd|Sihdadj|NY|8457356776 +Sckgahd|Xihdadj|NY|6077386740 +Wcjgahd|Dphdadj|NY|6076376769 +Ocngahd|Sghdadj|NY|8452056776 +Sclgahd|Xbhdadj|NY|6076076740 +Wcmgahd|Dxhdadj|NY|6079359799 +Odtgahd|Snhdadj|NY|8452656776 +Scogahd|Yahdadj|NY|6072152740 +Wdvgahd|Echdadj|NY|6072859888 +Odwgahd|Tdhdadj|NY|8452956776 +Sdsgahd|Ydhdadj|NY|6072556740 +Wdygahd|Efhdadj|NY|6071316219 +Pbhgahd|Tthdadj|NY|8454354767 +Sdvgahd|Ychdadj|NY|6072859740 +Xbegahd|Exhdadj|NY|6071356790 +Pcogahd|Uahdadj|NY|8452156167 +Sdwgahd|Ydhdadj|NY|6072956040 +Xbfgahd|Ewhdadj|NY|6072356790 +Pcqgahd|Umhdadj|NY|8452356367 +Sdxgahd|Yehdadj|NY|6072306140 +Xbggahd|Euhdadj|NY|6073356790 +Pcrgahd|Ubhdadj|NY|8452456467 +Ubfgahd|Zwhdadj|NY|6072322733 +Xbhgahd|Ethdadj|NY|6074356790 +Pdtgahd|Unhdadj|NY|8452656600 +Ucjgahd|Zphdadj|NY|6076376733 +Xcjgahd|Ephdadj|NY|6076356790 +Pdvgahd|Uchdadj|NY|8452856800 +Ucpgahd|Akhdadj|NY|6072253233 +Xcngahd|Fghdadj|NY|6072056790 +Rbegahd|Vxhdadj|NY|8451356700 +Udvgahd|Achdadj|NY|6072859833 +Xdsgahd|Fdhdadj|NY|6072556779 +Rbfgahd|Vwhdadj|NY|8452356700 +Udygahd|Bfhdadj|NY|6072316219 +Xdugahd|Fbhdadj|NY|6072756779 +Rckgahd|Vihdadj|NY|8457356700 +Vadgahd|Byhdadj|NY|6070300709 +Xdygahd|Ffhdadj|NY|6072316779 +Rclgahd|Wbhdadj|NY|8458356700 +Vbegahd|Bxhdadj|NY|6071311719 +Yadgahd|Gyhdadj|NY|6070350779 +Rcmgahd|Wxhdadj|NY|8459356700 +Vbhgahd|Bthdadj|NY|6074344749 +Ybegahd|Gxhdadj|NY|6071351779 +Rcogahd|Wahdadj|NY|8452156700 +Vbigahd|Bshdadj|NY|6075355759 +Ybfgahd|Gwhdadj|NY|6072352779 +Rcqgahd|Wmhdadj|NY|8452356706 +Vckgahd|Bihdadj|NY|6077387779 +Ybhgahd|Gthdadj|NY|6074354779 +Rdsgahd|Wdhdadj|NY|8452556706 +Vclgahd|Bbhdadj|NY|6076078789 +Ycjgahd|Gphdadj|NY|6076356779 +Rdtgahd|Wnhdadj|NY|8452656706 +Vcqgahd|Cmhdadj|NY|6072354383 +Yclgahd|Gbhdadj|NY|6078358744 +Rdwgahd|Wdhdadj|NY|8452956706 +Vdugahd|Cbhdadj|NY|6072758787 +Ycpgahd|Gkhdadj|NY|6072256244 +Scjgahd|Xphdadj|NY|8456376740 +Vdvgahd|Cchdadj|NY|6072859888 +Ydtgahd|Hnhdadj|NY|6072656644 +Scmgahd|Xxhdadj|NY|8459350740 +Vdwgahd|Cdhdadj|NY|6072956989 +Ydwgahd|Hdhdadj|NY|6072956944 +Scrgahd|Ybhdadj|NY|8452455740 +Wbfgahd|Dwhdadj|NY|6072322729 +Ydxgahd|Hehdadj|NY|6072306709 +Sdtgahd|Ynhdadj|NY|8452657740 +Wbhgahd|Dthdadj|NY|6074344749 +Ydygahd|Hfhdadj|NY|6072316719 +Sdugahd|Ybhdadj|NY|8452758740 +Wcogahd|Dahdadj|NY|6072152181 +Ydzgahd|Hghdadj|NY|6072326729 +Sdygahd|Yfhdadj|NY|8452316233 +Wcpgahd|Dkhdadj|NY|6072253282 +Zadgahd|Hyhdadj|NY|6070356744 +Uadgahd|Zyhdadj|NY|8450300733 +Wcqgahd|Emhdadj|NY|6072354383 +Zbfgahd|Hwhdadj|NY|6072356744 +Ubegahd|Zxhdadj|NY|8451311733 +Wdugahd|Ebhdadj|NY|6072758787 +Zbhgahd|Hthdadj|NY|6074356766 +Ubigahd|Zshdadj|NY|8455355733 +Wdxgahd|Eehdadj|NY|6070306109 +Zcjgahd|Iphdadj|NY|6076356766 +Uclgahd|Zbhdadj|NY|8458458733 +Xbigahd|Eshdadj|NY|6075356790 +Zcmgahd|Ixhdadj|NY|6079356766 +Ucmgahd|Axhdadj|NY|8459359733 +Xckgahd|Eihdadj|NY|6077356790 +Zdvgahd|Jchdadj|NY|6072856751 +Ucqgahd|Amhdadj|NY|8452354333 +Xcmgahd|Fxhdadj|NY|6079356790 +Kedgahd|Jyhdadj|NY|6070306751 +Udtgahd|Anhdadj|NY|8452657633 +Xcpgahd|Fkhdadj|NY|6072256779 +Keegahd|Jxhdadj|NY|6071316751 +Udugahd|Abhdadj|NY|8452758733 +Xdvgahd|Fchdadj|NY|6072856779 +Kehgahd|Jthdadj|NY|6074346751 +Udxgahd|Aehdadj|NY|8452306109 +Xdwgahd|Fdhdadj|NY|6072956779 +Kelgahd|Jbhdadj|NY|6076076751 +Vbggahd|Buhdadj|NY|8453333739 +Xdxgahd|Fehdadj|NY|6072306779 +Keqgahd|Kmhdadj|NY|6072354762 +Vcngahd|Cghdadj|NY|8452051080 +Ybigahd|Gshdadj|NY|6075355779 +Ketgahd|Knhdadj|NY|6072657762 +Vcogahd|Cahdadj|NY|8452152181 +Yckgahd|Gihdadj|NY|6077357779 +Kezgahd|Kghdadj|NY|6072326362 +Vcrgahd|Cbhdadj|NY|8452455484 +Ycogahd|Gahdadj|NY|6072156144 +Liggahd|Luhdadj|NY|6073333762 +Vdsgahd|Cdhdadj|NY|8452556585 +Ycqgahd|Gmhdadj|NY|6072356344 +Likgahd|Lihdadj|NY|6077387762 +Vdtgahd|Cnhdadj|NY|8452657686 +Ydsgahd|Hdhdadj|NY|6072556544 +Lilgahd|Lbhdadj|NY|6076078762 +Wbegahd|Dxhdadj|NY|8451311719 +Ydvgahd|Hchdadj|NY|6072856844 +Lipgahd|Lkhdadj|NY|6072253288 +Wbigahd|Dshdadj|NY|8455355759 +Zbegahd|Hxhdadj|NY|6071356744 +Liygahd|Mfhdadj|NY|6072316219 +Wckgahd|Dihdadj|NY|8457387779 +Zcogahd|Iahdadj|NY|6072156766 +Moegahd|Mxhdadj|NY|6071311719 +Wclgahd|Dbhdadj|NY|8458458789 +Zcpgahd|Ikhdadj|NY|6072256766 +Moggahd|Muhdadj|NY|6073333739 +Wcngahd|Dghdadj|NY|8452051080 +Zdwgahd|Jdhdadj|NY|6072956751 +Mohgahd|Mthdadj|NY|6074344749 +Wcrgahd|Ebhdadj|NY|8452455484 +Zdygahd|Jfhdadj|NY|6072316751 +Momgahd|Nxhdadj|NY|6079359799 +Wdsgahd|Edhdadj|NY|8452556585 +Kefgahd|Jwhdadj|NY|6072326751 +Moqgahd|Nmhdadj|NY|6072354383 +Wdtgahd|Enhdadj|NY|8452657686 +Keigahd|Jshdadj|NY|6075356751 +Motgahd|Nnhdadj|NY|6072657686 +Wdwgahd|Edhdadj|NY|8452956989 +Kemgahd|Kxhdadj|NY|6079350751 +Movgahd|Nchdadj|NY|6072859888 +Wdzgahd|Eghdadj|NY|8452326329 +Kengahd|Kghdadj|NY|6072051751 +Mozgahd|Oghdadj|NY|6072326329 +Xadgahd|Eyhdadj|NY|9170356790 +Kepgahd|Kkhdadj|NY|6072253751 +Nufgahd|Owhdadj|NY|6072322729 +Xclgahd|Fbhdadj|NY|9178356790 +Kesgahd|Kdhdadj|NY|6072556762 +Nuggahd|Ouhdadj|NY|6073333739 +Xcogahd|Fahdadj|NY|9172156790 +Kewgahd|Kdhdadj|NY|6072956062 +Nuhgahd|Othdadj|NY|6074344749 +Xcqgahd|Fmhdadj|NY|9172356779 +Kexgahd|Kehdadj|NY|6072306162 +Nukgahd|Oihdadj|NY|6077387779 +Xcrgahd|Fbhdadj|NY|9172456779 +Lidgahd|Lyhdadj|NY|6070300762 +Nulgahd|Pbhdadj|NY|6076078789 +Xdtgahd|Fnhdadj|NY|9172656779 +Liegahd|Lxhdadj|NY|6071311762 +Nuxgahd|Qehdadj|NY|6070306109 +Xdzgahd|Fghdadj|NY|9172326779 +Liigahd|Lshdadj|NY|6075355762 +Nuygahd|Qfhdadj|NY|6071316219 +Ybggahd|Guhdadj|NY|9173353779 +Lijgahd|Lphdadj|NY|6076376762 +Badgahd|Eyhdadj|PA|2150350711 +Ycmgahd|Gxhdadj|NY|9179359744 +Liqgahd|Lmhdadj|NY|6072354388 +Bbfgahd|Ewhdadj|PA|2152352711 +Ycngahd|Gghdadj|NY|9172056044 +Lirgahd|Mbhdadj|NY|6072455488 +Bcjgahd|Fphdadj|PA|2156356711 +Ycrgahd|Gbhdadj|NY|9172456444 +Litgahd|Mnhdadj|NY|6072657688 +Bclgahd|Fbhdadj|PA|2158358700 +Ydugahd|Hbhdadj|NY|9172756744 +Liugahd|Mbhdadj|NY|6072758788 +Bcogahd|Fahdadj|PA|2152156100 +Zbggahd|Huhdadj|NY|9173356766 +Lizgahd|Mghdadj|NY|6072326329 +Bcqgahd|Gmhdadj|PA|2152356300 +Zbigahd|Ishdadj|NY|9175356766 +Modgahd|Myhdadj|NY|6070300709 +Bcrgahd|Gbhdadj|PA|2152456400 +Zckgahd|Iihdadj|NY|9177356766 +Mongahd|Nghdadj|NY|6072031080 +Bdvgahd|Gchdadj|PA|2152856800 +Zclgahd|Ibhdadj|NY|9178356766 +Mopgahd|Nkhdadj|NY|6072253282 +Cadgahd|Iyhdadj|PA|2150356215 +Zcngahd|Ighdadj|NY|9172056766 +Mosgahd|Ndhdadj|NY|6072556585 +Cbegahd|Ixhdadj|PA|2151356215 +Zcqgahd|Imhdadj|NY|9172356766 +Mowgahd|Ndhdadj|NY|6072956989 +Cbhgahd|Ithdadj|PA|2154356215 +Zcrgahd|Ibhdadj|NY|9172456766 +Nudgahd|Oyhdadj|NY|6070300709 +Ccmgahd|Jxhdadj|PA|2159356721 +Zdsgahd|Idhdadj|NY|9172556766 +Nujgahd|Ophdadj|NY|6076376769 +Ccogahd|Jahdadj|PA|2152156721 +Zdtgahd|Inhdadj|NY|9172656766 +Numgahd|Pxhdadj|NY|6079359799 +Ccpgahd|Kkhdadj|PA|2152256721 +Zdugahd|Ibhdadj|NY|9172756766 +Nungahd|Pghdadj|NY|6072031080 +Ccqgahd|Kmhdadj|PA|2152356721 +Zdxgahd|Jehdadj|NY|9172306751 +Nuogahd|Pahdadj|NY|6072152181 +Cdwgahd|Ldhdadj|PA|2152956721 +Zdzgahd|Jghdadj|NY|9172326751 +Nuqgahd|Pmhdadj|NY|6072354383 +Cdzgahd|Lghdadj|PA|2152348422 +Keggahd|Juhdadj|NY|9173336751 +Nurgahd|Pbhdadj|NY|6072455484 +Dbggahd|Muhdadj|PA|2153336722 +Kejgahd|Jphdadj|NY|9176376751 +Nutgahd|Pnhdadj|NY|6072657686 +Dckgahd|Nihdadj|PA|2157386722 +Kekgahd|Jihdadj|NY|9177386751 +Nuugahd|Pbhdadj|NY|6072758787 +Dcogahd|Nahdadj|PA|2152152732 +Keogahd|Kahdadj|NY|9172152751 +Nuzgahd|Qghdadj|NY|6072326329 +Dcrgahd|Obhdadj|PA|2152455732 +Kergahd|Kbhdadj|NY|9172455762 +Aadgahd|Ayhdadj|PA|2150356710 +Ddsgahd|Odhdadj|PA|2152556732 +Keugahd|Kbhdadj|NY|9172758762 +Abhgahd|Athdadj|PA|2154356710 +Ddtgahd|Onhdadj|PA|2152655702 +Kevgahd|Kchdadj|NY|9172859762 +Ackgahd|Bihdadj|PA|2157356710 +Ddugahd|Obhdadj|PA|2152758732 +Keygahd|Kfhdadj|NY|9172316262 +Aclgahd|Bbhdadj|PA|2158356710 +Eadgahd|Ryhdadj|PA|2150300745 +Lifgahd|Lwhdadj|NY|9172322762 +Acmgahd|Bxhdadj|PA|2159356701 +Ebegahd|Rxhdadj|PA|2151311745 +Lihgahd|Lthdadj|NY|9174344762 +Acpgahd|Bkhdadj|PA|2152256701 +Ebfgahd|Rwhdadj|PA|2152322745 +Limgahd|Lxhdadj|NY|9179359762 +Adtgahd|Cnhdadj|PA|2152656701 +Ebhgahd|Rthdadj|PA|2154344745 +Lingahd|Lghdadj|NY|9172091788 +Advgahd|Dchdadj|PA|2152856701 +Eckgahd|Sihdadj|PA|2157387745 +Liogahd|Lahdadj|NY|9172152188 +Adxgahd|Dehdadj|PA|2152306711 +Ecmgahd|Sxhdadj|PA|2159359745 +Lisgahd|Mdhdadj|NY|9172556588 +Adygahd|Dfhdadj|PA|2152316711 +Ecogahd|Tahdadj|PA|2152152145 +Livgahd|Mchdadj|NY|9172859888 +Bbegahd|Axhdadj|PA|2151351711 +Ecrgahd|Tbhdadj|PA|2152455445 +Liwgahd|Mdhdadj|NY|9172956988 +Bckgahd|Fihdadj|PA|2157357700 +Edugahd|Ubhdadj|PA|2152758709 +Lixgahd|Mehdadj|NY|9172306109 +Bcmgahd|Fxhdadj|PA|2159359700 +Edvgahd|Uchdadj|PA|2152859809 +Mofgahd|Mwhdadj|NY|9172322729 +Bcpgahd|Gkhdadj|PA|2152256200 +Edzgahd|Vghdadj|PA|2152326329 +Moigahd|Mshdadj|NY|9175355759 +Bdsgahd|Gdhdadj|PA|2152558130 +Fadgahd|Vyhdadj|PA|2150300709 +Mojgahd|Nphdadj|NY|9176376769 +Bdugahd|Gbhdadj|PA|2152756700 +Fbigahd|Wshdadj|PA|2155355759 +Mokgahd|Nihdadj|NY|9177387779 +Bdwgahd|Hdhdadj|PA|2152956900 +Fcjgahd|Wphdadj|PA|2156376769 +Molgahd|Nbhdadj|NY|9178138789 +Bdzgahd|Hghdadj|PA|2152348429 +Fclgahd|Wbhdadj|PA|2158138789 +Moogahd|Nahdadj|NY|9172152181 +Cbigahd|Ishdadj|PA|2155356215 +Fcngahd|Wghdadj|PA|2152051080 +Morgahd|Nbhdadj|NY|9172455484 +Ccjgahd|Jphdadj|PA|2156356215 +Fcpgahd|Wkhdadj|PA|2152253282 +Mougahd|Nbhdadj|NY|9172758787 +Cckgahd|Jihdadj|PA|2157356215 +Fdtgahd|Xnhdadj|PA|2152657686 +Moxgahd|Nehdadj|NY|9170306109 +Cclgahd|Jbhdadj|PA|2158356721 +Fdygahd|Yfhdadj|PA|2151316219 +Moygahd|Ofhdadj|NY|9171316219 +Ccrgahd|Kbhdadj|PA|2152456721 +Gbigahd|Zshdadj|PA|2155355759 +Nuegahd|Oxhdadj|NY|9171311719 +Cdsgahd|Kdhdadj|PA|2152556721 +Gckgahd|Zihdadj|PA|2157387779 +Nuigahd|Oshdadj|NY|9175355759 +Cdxgahd|Lehdadj|PA|2152306721 +Gcmgahd|Zxhdadj|PA|2159359799 +Nupgahd|Pkhdadj|NY|9172253282 +Dbhgahd|Mthdadj|PA|2154346722 +Gcogahd|Zahdadj|PA|2152152181 +Nusgahd|Pdhdadj|NY|9172556585 +Dbigahd|Nshdadj|PA|2155356722 +Gcpgahd|Zkhdadj|PA|2152253282 +Nuvgahd|Pchdadj|NY|9172859888 +Dclgahd|Nbhdadj|PA|2158136732 +Gdtgahd|Anhdadj|PA|2152657686 +Nuwgahd|Pdhdadj|NY|9172956989 +Dcqgahd|Omhdadj|PA|2152354732 +Gdugahd|Abhdadj|PA|2152758787 +Abegahd|Axhdadj|NY|7181356710 +Ddvgahd|Ochdadj|PA|2152859732 +Gdwgahd|Adhdadj|PA|2152956989 +Abfgahd|Awhdadj|NY|7182356710 +Ddwgahd|Odhdadj|PA|2152956045 +Gdxgahd|Aehdadj|PA|2150306109 +Abggahd|Auhdadj|NY|7183356710 +Ebigahd|Sshdadj|PA|2155355745 +Hadgahd|Byhdadj|PA|4840356799 +Abigahd|Ashdadj|NY|7185356710 +Ecjgahd|Sphdadj|PA|2156376745 +Hbigahd|Bshdadj|PA|4845356799 +Acjgahd|Bphdadj|NY|7186356710 +Eclgahd|Sbhdadj|PA|2158138745 +Hcjgahd|Bphdadj|PA|4846356799 +Acngahd|Bghdadj|NY|7182056701 +Ecngahd|Sghdadj|PA|2152051045 +Hckgahd|Bihdadj|PA|4847356799 +Acogahd|Bahdadj|NY|7182156701 +Edwgahd|Udhdadj|PA|2152956909 +Hclgahd|Bbhdadj|PA|4848356799 +Acqgahd|Cmhdadj|NY|7182356701 +Edygahd|Vfhdadj|PA|2152316219 +Hcngahd|Bghdadj|PA|4842056799 +Acrgahd|Cbhdadj|NY|7182456701 +Fbfgahd|Vwhdadj|PA|2152322729 +Hcpgahd|Ckhdadj|PA|4842256767 +Adsgahd|Cdhdadj|NY|7182556701 +Fcmgahd|Wxhdadj|PA|2159359799 +Hdsgahd|Cdhdadj|PA|4842556767 +Adugahd|Cbhdadj|NY|7182756701 +Fcqgahd|Xmhdadj|PA|2152354383 +Hdtgahd|Cnhdadj|PA|4842656767 +Adwgahd|Ddhdadj|NY|7182956711 +Fcrgahd|Xbhdadj|PA|2152455484 +Hdzgahd|Dghdadj|PA|4842348467 +Adzgahd|Dghdadj|NY|7182326711 +Fdzgahd|Yghdadj|PA|2152326329 +Ibegahd|Dxhdadj|PA|4841351778 +Bbggahd|Euhdadj|NY|7183353711 +Gadgahd|Yyhdadj|PA|2150300709 +Ibfgahd|Dwhdadj|PA|4842352778 +Bbhgahd|Ethdadj|NY|7184354711 +Gbegahd|Yxhdadj|PA|2151311719 +Ibigahd|Dshdadj|PA|4845355778 +Bbigahd|Eshdadj|NY|7185355711 +Gbggahd|Yuhdadj|PA|2153333739 +Icngahd|Eghdadj|PA|4842055708 +Bcngahd|Fghdadj|NY|7182056000 +Gcjgahd|Zphdadj|PA|2156376769 +Icpgahd|Ekhdadj|PA|4842256278 +Bdtgahd|Gnhdadj|NY|7182656600 +Gcngahd|Zghdadj|PA|2152051080 +Icqgahd|Emhdadj|PA|4842356356 +Bdxgahd|Hehdadj|NY|7182306709 +Gdsgahd|Adhdadj|PA|2152556585 +Idugahd|Fbhdadj|PA|4842756756 +Bdygahd|Hfhdadj|NY|7182316719 +Gdzgahd|Aghdadj|PA|2152326329 +Jadgahd|Gyhdadj|PA|4840356701 +Cbfgahd|Iwhdadj|NY|7182356918 +Hbggahd|Buhdadj|PA|4843356799 +Jbegahd|Gxhdadj|PA|4841356701 +Cbggahd|Iuhdadj|NY|7183356918 +Hbhgahd|Bthdadj|PA|4844356799 +Jbfgahd|Gwhdadj|PA|4842356701 +Ccngahd|Jghdadj|NY|7182056721 +Hcmgahd|Bxhdadj|PA|4849356799 +Jbigahd|Gshdadj|PA|4845356701 +Cdtgahd|Knhdadj|NY|7182656721 +Hcogahd|Bahdadj|PA|4842156799 +Jckgahd|Hihdadj|PA|4847356701 +Cdugahd|Kbhdadj|NY|7182756721 +Hcqgahd|Cmhdadj|PA|4842356767 +Jclgahd|Hbhdadj|PA|4848356701 +Cdvgahd|Lchdadj|NY|7182856721 +Hcrgahd|Cbhdadj|PA|4842456767 +Jcrgahd|Hbhdadj|PA|4842456755 +Cdygahd|Lfhdadj|NY|7182316722 +Hdvgahd|Cchdadj|PA|4842856767 +Jdsgahd|Hdhdadj|PA|4842556755 +Dadgahd|Myhdadj|NY|7180306722 +Hdwgahd|Cdhdadj|PA|4842956767 +Jdzgahd|Ighdadj|PA|4842348455 +Dbegahd|Mxhdadj|NY|7181316722 +Hdxgahd|Cehdadj|PA|4842306767 +Kadgahd|Iyhdadj|PA|4840306704 +Dbfgahd|Mwhdadj|NY|7182326722 +Hdygahd|Dfhdadj|PA|4842316767 +Kbegahd|Ixhdadj|PA|4841316704 +Dcjgahd|Nphdadj|NY|7186376722 +Ibggahd|Duhdadj|PA|4843353778 +Kbfgahd|Jwhdadj|PA|4842348404 +Dcmgahd|Nxhdadj|NY|7189350732 +Ickgahd|Eihdadj|PA|4847357778 +Kbigahd|Jshdadj|PA|4845356704 +Dcngahd|Nghdadj|NY|7182051732 +Icogahd|Eahdadj|PA|4842156178 +Kcjgahd|Jphdadj|PA|4846376704 +Dcpgahd|Nkhdadj|NY|7182253732 +Icrgahd|Fbhdadj|PA|4842456456 +Kclgahd|Jbhdadj|PA|4848136704 +Ddxgahd|Pehdadj|NY|7182306145 +Idsgahd|Fdhdadj|PA|4842556556 +Kcqgahd|Kmhdadj|PA|4842354766 +Ddygahd|Pfhdadj|NY|7182316245 +Idtgahd|Fnhdadj|PA|4842656656 +Kcrgahd|Kbhdadj|PA|4842455766 +Ddzgahd|Pghdadj|NY|7182326345 +Idvgahd|Fchdadj|PA|4842856856 +Kdsgahd|Kdhdadj|PA|4842556766 +Ebggahd|Ruhdadj|NY|7183333745 +Idwgahd|Fdhdadj|PA|4842956956 +Kdugahd|Kbhdadj|PA|4842758766 +Ecpgahd|Tkhdadj|NY|7182253245 +Idxgahd|Fehdadj|PA|4842306709 +Kdzgahd|Lghdadj|PA|4842326366 +Ecqgahd|Tmhdadj|NY|7182354345 +Jcogahd|Hahdadj|PA|4842156755 +Lbegahd|Lxhdadj|PA|4841311766 +Edsgahd|Tdhdadj|NY|7182558139 +Jcpgahd|Hkhdadj|PA|4842256755 +Ldsgahd|Mdhdadj|PA|4842556529 +Edtgahd|Unhdadj|NY|7182657609 +Jcqgahd|Hmhdadj|PA|4842356755 +Ldvgahd|Nchdadj|PA|4842859829 +Edxgahd|Uehdadj|NY|7182306109 +Jdugahd|Ibhdadj|PA|4842756755 +Ldwgahd|Ndhdadj|PA|4842956929 +Fbegahd|Vxhdadj|NY|7181311719 +Jdxgahd|Iehdadj|PA|4842306755 +Ldygahd|Nfhdadj|PA|4842316219 +Fbggahd|Vuhdadj|NY|7183333739 +Jdygahd|Ifhdadj|PA|4842316755 +Mbfgahd|Nwhdadj|PA|4842322729 +Fbhgahd|Vthdadj|NY|7184344749 +Kbggahd|Juhdadj|PA|4843336704 +Mclgahd|Obhdadj|PA|4848138789 +Fckgahd|Wihdadj|NY|7187387779 +Kbhgahd|Jthdadj|PA|4844346704 +Mcmgahd|Oxhdadj|PA|4849359799 +Fcogahd|Wahdadj|NY|7182152181 +Kcmgahd|Jxhdadj|PA|4849350704 +Mcqgahd|Omhdadj|PA|4842354383 +Fdsgahd|Xdhdadj|NY|7182556585 +Kcpgahd|Kkhdadj|PA|4842253704 +Mcrgahd|Obhdadj|PA|4842455484 +Fdugahd|Xbhdadj|NY|7182758787 +Kdtgahd|Knhdadj|PA|4842657766 +Mdxgahd|Pehdadj|PA|4840306109 +Fdvgahd|Xchdadj|NY|7182859888 +Kdxgahd|Lehdadj|PA|4842306166 +Ncjgahd|Pphdadj|PA|4846376769 +Fdwgahd|Xdhdadj|NY|7182956989 +Kdygahd|Lfhdadj|PA|4842316266 +Nckgahd|Pihdadj|PA|4847387779 +Fdxgahd|Xehdadj|NY|7180306109 +Lbfgahd|Lwhdadj|PA|4842322766 +Ncrgahd|Qbhdadj|PA|4842455484 +Gbfgahd|Ywhdadj|NY|7182322729 +Lbigahd|Lshdadj|PA|4845355729 +Ndtgahd|Qnhdadj|PA|4842657686 +Gbhgahd|Ythdadj|NY|7184344749 +Lckgahd|Mihdadj|PA|4847387729 +Ndugahd|Qbhdadj|PA|4842758787 +Gclgahd|Zbhdadj|NY|7188138789 +Lcmgahd|Mxhdadj|PA|4849359729 +Ndvgahd|Qchdadj|PA|4842859888 +Gcqgahd|Zmhdadj|NY|7182354383 +Lcqgahd|Mmhdadj|PA|4842354329 +Ndygahd|Rfhdadj|PA|4841316219 +Gcrgahd|Zbhdadj|NY|7182455484 +Ldxgahd|Nehdadj|PA|4842306109 +Ndzgahd|Rghdadj|PA|4842326329 +Gdvgahd|Achdadj|NY|7182859888 +Ldzgahd|Nghdadj|PA|4842326329 +Obggahd|Ruhdadj|PA|7173356776 +Gdygahd|Afhdadj|NY|7181316219 +Mbegahd|Nxhdadj|PA|4841311719 +Obigahd|Rshdadj|PA|7175356776 +Hbegahd|Bxhdadj|NY|6071356799 +Mbigahd|Nshdadj|PA|4845355759 +Oclgahd|Sbhdadj|PA|7178356776 +Hbfgahd|Bwhdadj|NY|6072356799 +Mckgahd|Nihdadj|PA|4847387779 +Ocmgahd|Sxhdadj|PA|7179356776 +Hdugahd|Cbhdadj|NY|6072756767 +Mcngahd|Oghdadj|PA|4842051080 +Ocogahd|Sahdadj|PA|7172156776 +Iadgahd|Dyhdadj|NY|6070350767 +Mcogahd|Oahdadj|PA|4842152181 +Ocqgahd|Smhdadj|PA|7172356776 +Ibhgahd|Dthdadj|NY|6074354778 +Mdtgahd|Onhdadj|PA|4842657686 +Odugahd|Tbhdadj|PA|7172756776 +Icjgahd|Dphdadj|NY|6076356778 +Mdugahd|Obhdadj|PA|4842758787 +Padgahd|Tyhdadj|PA|7170350767 +Iclgahd|Ebhdadj|NY|6078358778 +Mdvgahd|Ochdadj|PA|4842859888 +Pbfgahd|Twhdadj|PA|7172352767 +Icmgahd|Exhdadj|NY|6079359778 +Nbegahd|Pxhdadj|PA|4841311719 +Pbggahd|Tuhdadj|PA|7173353767 +Idygahd|Gfhdadj|NY|6072316719 +Nbigahd|Pshdadj|PA|4845355759 +Pcjgahd|Uphdadj|PA|7176356767 +Idzgahd|Gghdadj|NY|6072326729 +Nclgahd|Qbhdadj|PA|4848138789 +Pckgahd|Uihdadj|PA|7157057767 +Jbggahd|Guhdadj|NY|6073356701 +Ncngahd|Qghdadj|PA|4842051080 +Pcngahd|Ughdadj|PA|7172056067 +Jbhgahd|Gthdadj|NY|6074356701 +Ncqgahd|Qmhdadj|PA|4842354383 +Pdugahd|Ubhdadj|PA|7172756700 +Jcjgahd|Gphdadj|NY|6076356701 +Ndsgahd|Qdhdadj|PA|4842556585 +Pdxgahd|Vehdadj|PA|7172306709 +Jcmgahd|Hxhdadj|NY|6079356701 +Ndxgahd|Rehdadj|PA|4840306109 +Pdygahd|Vfhdadj|PA|7172316719 +Jcngahd|Hghdadj|NY|6072056755 +Obhgahd|Rthdadj|PA|7174356776 +Rbggahd|Vuhdadj|PA|7173356700 +Jdtgahd|Inhdadj|NY|6072656755 +Ocpgahd|Skhdadj|PA|7172256776 +Rbigahd|Vshdadj|PA|7175356700 +Jdvgahd|Ichdadj|NY|6072856755 +Ocrgahd|Sbhdadj|PA|7172456776 +Rcjgahd|Vphdadj|PA|7176356700 +Jdwgahd|Idhdadj|NY|6072956755 +Odsgahd|Sdhdadj|PA|7172556776 +Sbfgahd|Xwhdadj|PA|7172348406 +Kckgahd|Jihdadj|NY|6077386704 +Odvgahd|Tchdadj|PA|7172856776 +Sbggahd|Xuhdadj|PA|7173336706 +Kcngahd|Jghdadj|NY|6072051704 +Odxgahd|Tehdadj|PA|7172306767 +Sbigahd|Xshdadj|PA|7175356740 +Kcogahd|Kahdadj|NY|6072152704 +Odygahd|Tfhdadj|PA|7172316767 +Scngahd|Xghdadj|PA|7172051740 +Kdvgahd|Kchdadj|NY|6072859766 +Odzgahd|Tghdadj|PA|7172348467 +Scpgahd|Ykhdadj|PA|7172253740 +Kdwgahd|Ldhdadj|NY|6072956066 +Pbegahd|Txhdadj|PA|7171351767 +Scqgahd|Ymhdadj|PA|7172354740 +Ladgahd|Lyhdadj|NY|6070300766 +Pbigahd|Tshdadj|PA|7175355767 +Sdzgahd|Yghdadj|PA|7172326333 +Lbggahd|Luhdadj|NY|6073333729 +Pclgahd|Ubhdadj|PA|7178358767 +Ubggahd|Zuhdadj|PA|7173333733 +Lbhgahd|Lthdadj|NY|6074344729 +Pcmgahd|Uxhdadj|PA|7179359767 +Ubhgahd|Zthdadj|PA|7174344733 +Lcjgahd|Lphdadj|NY|6076376729 +Pcpgahd|Ukhdadj|PA|7172256484 +Uckgahd|Zihdadj|PA|7177085703 +Lclgahd|Mbhdadj|NY|6076078729 +Pdsgahd|Udhdadj|PA|7172557170 +Ucngahd|Aghdadj|PA|7172051033 +Lcngahd|Mghdadj|NY|6072031029 +Pdwgahd|Udhdadj|PA|7172956900 +Ucogahd|Aahdadj|PA|7172152133 +Lcogahd|Mahdadj|NY|6072152129 +Pdzgahd|Vghdadj|PA|7172348429 +Ucrgahd|Abhdadj|PA|7172455433 +Lcpgahd|Mkhdadj|NY|6072253229 +Radgahd|Vyhdadj|PA|7170356700 +Udsgahd|Adhdadj|PA|7172556533 +Lcrgahd|Mbhdadj|NY|6072455429 +Rbhgahd|Vthdadj|PA|7174356700 +Udwgahd|Adhdadj|PA|7172956933 +Ldtgahd|Mnhdadj|NY|6072657629 +Rcngahd|Wghdadj|PA|7172056700 +Udzgahd|Bghdadj|PA|7172326329 +Ldugahd|Mbhdadj|NY|6072758729 +Rcpgahd|Wkhdadj|PA|7172256706 +Vbfgahd|Bwhdadj|PA|7172322729 +Madgahd|Nyhdadj|NY|6070300709 +Rcrgahd|Wbhdadj|PA|7172456706 +Vcjgahd|Bphdadj|PA|7176376769 +Mbggahd|Nuhdadj|NY|6073333739 +Rdugahd|Wbhdadj|PA|7172756706 +Vcmgahd|Cxhdadj|PA|7179359799 +Mbhgahd|Nthdadj|NY|6074344749 +Rdvgahd|Wchdadj|PA|7172856706 +Vcpgahd|Ckhdadj|PA|7172253282 +Mcjgahd|Nphdadj|NY|6076376769 +Rdxgahd|Wehdadj|PA|7172306706 +Vdxgahd|Cehdadj|PA|7170306109 +Mcpgahd|Okhdadj|NY|6072253282 +Rdygahd|Wfhdadj|PA|7172316706 +Vdygahd|Cfhdadj|PA|7171316219 +Mdsgahd|Odhdadj|NY|6072556585 +Rdzgahd|Wghdadj|PA|7172348406 +Vdzgahd|Cghdadj|PA|7172326329 +Mdwgahd|Pdhdadj|NY|6072956989 +Sadgahd|Xyhdadj|PA|7170306706 +Wadgahd|Dyhdadj|PA|7170300709 +Mdygahd|Pfhdadj|NY|6071316219 +Sbegahd|Xxhdadj|PA|7171316706 +Wbggahd|Duhdadj|PA|7173333739 +Mdzgahd|Pghdadj|NY|6072326329 +Sbhgahd|Xthdadj|PA|7174346706 +Wcjgahd|Dphdadj|PA|7176376769 +Nadgahd|Pyhdadj|NY|6070300709 +Sckgahd|Xihdadj|PA|7157086740 +Wcmgahd|Dxhdadj|PA|7179359799 +Nbfgahd|Pwhdadj|NY|6072322729 +Sclgahd|Xbhdadj|PA|7177176740 +Wdvgahd|Echdadj|PA|7172859888 +Nbggahd|Puhdadj|NY|6073333739 +Scogahd|Yahdadj|PA|7172152740 +Wdygahd|Efhdadj|PA|7171316219 +Nbhgahd|Pthdadj|NY|6074344749 +Sdsgahd|Ydhdadj|PA|7172556740 +Xbegahd|Exhdadj|PA|4841356790 +Ncmgahd|Qxhdadj|NY|6079359799 +Sdvgahd|Ychdadj|PA|7172859740 +Xbfgahd|Ewhdadj|PA|4842356790 +Ncogahd|Qahdadj|NY|6072152181 +Sdwgahd|Ydhdadj|PA|7172956040 +Xbggahd|Euhdadj|PA|4843356790 +Ncpgahd|Qkhdadj|NY|6072253282 +Sdxgahd|Yehdadj|PA|7172306140 +Xbhgahd|Ethdadj|PA|4844356790 +Ndwgahd|Qdhdadj|NY|6072956989 +Ubfgahd|Zwhdadj|PA|7172322733 +Xcjgahd|Ephdadj|PA|4846356790 +Oadgahd|Ryhdadj|NY|6070356776 +Ucjgahd|Zphdadj|PA|7176376733 +Xcngahd|Fghdadj|PA|4842056790 +Obegahd|Rxhdadj|NY|6071356776 +Ucpgahd|Akhdadj|PA|7172253233 +Xdsgahd|Fdhdadj|PA|4842556779 +Obfgahd|Rwhdadj|NY|6072356776 +Udvgahd|Achdadj|PA|7172859833 +Xdugahd|Fbhdadj|PA|4842756779 +Ocjgahd|Sphdadj|NY|6076356776 +Udygahd|Bfhdadj|PA|7172316219 +Xdygahd|Ffhdadj|PA|4842316779 +Ockgahd|Sihdadj|NY|6077356776 +Vadgahd|Byhdadj|PA|7170300709 +Yadgahd|Gyhdadj|PA|4840350779 +Ocngahd|Sghdadj|NY|6072056776 +Vbegahd|Bxhdadj|PA|7171311719 +Ybegahd|Gxhdadj|PA|4841351779 +Odtgahd|Snhdadj|NY|6072656776 +Vbhgahd|Bthdadj|PA|7174344749 +Ybfgahd|Gwhdadj|PA|4842352779 +Odwgahd|Tdhdadj|NY|6072956776 +Vbigahd|Bshdadj|PA|7175355759 +Ybhgahd|Gthdadj|PA|4844354779 +Pbhgahd|Tthdadj|NY|6074354767 +Vckgahd|Bihdadj|PA|7157087779 +Ycjgahd|Gphdadj|PA|4846356779 +Pcogahd|Uahdadj|NY|6072156167 +Vclgahd|Bbhdadj|PA|7177178789 +Yclgahd|Gbhdadj|PA|4848358744 +Pcqgahd|Umhdadj|NY|6072356367 +Vcqgahd|Cmhdadj|PA|7172354383 +Ycpgahd|Gkhdadj|PA|4842256244 +Pcrgahd|Ubhdadj|NY|6072456467 +Vdugahd|Cbhdadj|PA|7172758787 +Ydtgahd|Hnhdadj|PA|4842656644 +Pdtgahd|Unhdadj|NY|6072656600 +Vdvgahd|Cchdadj|PA|7172859888 +Ydwgahd|Hdhdadj|PA|4842956944 +Pdvgahd|Uchdadj|NY|6072856800 +Vdwgahd|Cdhdadj|PA|7172956989 +Ydxgahd|Hehdadj|PA|4842306709 +Rbegahd|Vxhdadj|NY|6071356700 +Wbfgahd|Dwhdadj|PA|7172322729 +Ydygahd|Hfhdadj|PA|4842316719 +Rbfgahd|Vwhdadj|NY|6072356700 +Wbhgahd|Dthdadj|PA|7174344749 +Ydzgahd|Hghdadj|PA|4842348429 +Rckgahd|Vihdadj|NY|6077356700 +Wcogahd|Dahdadj|PA|7172152181 +Zadgahd|Hyhdadj|PA|4840356744 +Rclgahd|Wbhdadj|NY|6078356700 +Wcpgahd|Dkhdadj|PA|7172253282 +Zbfgahd|Hwhdadj|PA|4842356744 +Rcmgahd|Wxhdadj|NY|6079356700 +Wcqgahd|Emhdadj|PA|7172354383 +Zbhgahd|Hthdadj|PA|4844356766 +Rcogahd|Wahdadj|NY|6072156700 +Wdugahd|Ebhdadj|PA|7172758787 +Zcjgahd|Iphdadj|PA|4846356766 +Rcqgahd|Wmhdadj|NY|6072356706 +Wdxgahd|Eehdadj|PA|7170306109 +Zcmgahd|Ixhdadj|PA|4849356766 +Rdsgahd|Wdhdadj|NY|6072556706 +Xbigahd|Eshdadj|PA|4845356790 +Zdvgahd|Jchdadj|PA|4842856751 +Rdtgahd|Wnhdadj|NY|6072656706 +Xckgahd|Eihdadj|PA|4847356790 +Kedgahd|Jyhdadj|PA|4840306751 +Rdwgahd|Wdhdadj|NY|6072956706 +Xcmgahd|Fxhdadj|PA|4849356790 +Keegahd|Jxhdadj|PA|4841316751 +Scjgahd|Xphdadj|NY|6076376740 +Xcpgahd|Fkhdadj|PA|4842256779 +Kehgahd|Jthdadj|PA|4844346751 +Scmgahd|Xxhdadj|NY|6079350740 +Xdvgahd|Fchdadj|PA|4842856779 +Kelgahd|Jbhdadj|PA|4848136751 +Scrgahd|Ybhdadj|NY|6072455740 +Xdwgahd|Fdhdadj|PA|4842956779 +Keqgahd|Kmhdadj|PA|4842354762 +Sdtgahd|Ynhdadj|NY|6072657740 +Xdxgahd|Fehdadj|PA|4842306779 +Ketgahd|Knhdadj|PA|4842657762 +Sdugahd|Ybhdadj|NY|6072758740 +Ybigahd|Gshdadj|PA|4845355779 +Kezgahd|Kghdadj|PA|4842326362 +Sdygahd|Yfhdadj|NY|6072316233 +Yckgahd|Gihdadj|PA|4847357779 +Liggahd|Luhdadj|PA|4843333762 +Uadgahd|Zyhdadj|NY|6070300733 +Ycogahd|Gahdadj|PA|4842156144 +Likgahd|Lihdadj|PA|4847387762 +Ubegahd|Zxhdadj|NY|6071311733 +Ycqgahd|Gmhdadj|PA|4842356344 +Lilgahd|Lbhdadj|PA|4848138762 +Ubigahd|Zshdadj|NY|6075355733 +Ydsgahd|Hdhdadj|PA|4842556544 +Lipgahd|Lkhdadj|PA|4842253288 +Uclgahd|Zbhdadj|NY|6076078733 +Ydvgahd|Hchdadj|PA|4842856844 +Liygahd|Mfhdadj|PA|4842316219 +Ucmgahd|Axhdadj|NY|6079359733 +Zbegahd|Hxhdadj|PA|4841356744 +Moegahd|Mxhdadj|PA|4841311719 +Ucqgahd|Amhdadj|NY|6072354333 +Zcogahd|Iahdadj|PA|4842156766 +Moggahd|Muhdadj|PA|4843333739 +Udtgahd|Anhdadj|NY|6072657633 +Zcpgahd|Ikhdadj|PA|4842256766 +Mohgahd|Mthdadj|PA|4844344749 +Udugahd|Abhdadj|NY|6072758733 +Zdwgahd|Jdhdadj|PA|4842956751 +Momgahd|Nxhdadj|PA|4849359799 +Udxgahd|Aehdadj|NY|6072306109 +Zdygahd|Jfhdadj|PA|4842316751 +Moqgahd|Nmhdadj|PA|4842354383 +Vbggahd|Buhdadj|NY|6073333739 +Kefgahd|Jwhdadj|PA|4842348451 +Motgahd|Nnhdadj|PA|4842657686 +Vcngahd|Cghdadj|NY|6072031080 +Keigahd|Jshdadj|PA|4845356751 +Movgahd|Nchdadj|PA|4842859888 +Vcogahd|Cahdadj|NY|6072152181 +Kemgahd|Kxhdadj|PA|4849350751 +Mozgahd|Oghdadj|PA|4842326329 +Vcrgahd|Cbhdadj|NY|6072455484 +Kengahd|Kghdadj|PA|4842051751 +Nufgahd|Owhdadj|PA|4842322729 +Vdsgahd|Cdhdadj|NY|6072556585 +Kepgahd|Kkhdadj|PA|4842253751 +Nuggahd|Ouhdadj|PA|4843333739 +Vdtgahd|Cnhdadj|NY|6072657686 +Kesgahd|Kdhdadj|PA|4842556762 +Nuhgahd|Othdadj|PA|4844344749 +Wbegahd|Dxhdadj|NY|6071311719 +Kewgahd|Kdhdadj|PA|4842956062 +Nukgahd|Oihdadj|PA|4847387779 +Wbigahd|Dshdadj|NY|6075355759 +Kexgahd|Kehdadj|PA|4842306162 +Nulgahd|Pbhdadj|PA|4848138789 +Wckgahd|Dihdadj|NY|6077387779 +Lidgahd|Lyhdadj|PA|4840300762 +Nuxgahd|Qehdadj|PA|4840306109 +Wclgahd|Dbhdadj|NY|6076078789 +Liegahd|Lxhdadj|PA|4841311762 +Nuygahd|Qfhdadj|PA|4841316219 +Wcngahd|Dghdadj|NY|6072031080 +Liigahd|Lshdadj|PA|4845355762 +Badgahd|Eyhdadj|PA|7240350711 +Wcrgahd|Ebhdadj|NY|6072455484 +Lijgahd|Lphdadj|PA|4846376762 +Bbfgahd|Ewhdadj|PA|7242352711 +Wdsgahd|Edhdadj|NY|6072556585 +Liqgahd|Lmhdadj|PA|4842354388 +Bcjgahd|Fphdadj|PA|7243356711 +Wdtgahd|Enhdadj|NY|6072657686 +Lirgahd|Mbhdadj|PA|4842455488 +Bclgahd|Fbhdadj|PA|7248358700 +Wdwgahd|Edhdadj|NY|6072956989 +Litgahd|Mnhdadj|PA|4842657688 +Bcogahd|Fahdadj|PA|7242156100 +Wdzgahd|Eghdadj|NY|6072326329 +Liugahd|Mbhdadj|PA|4842758788 +Bcqgahd|Gmhdadj|PA|7242356300 +Xadgahd|Eyhdadj|NY|6070356790 +Lizgahd|Mghdadj|PA|4842326329 +Bcrgahd|Gbhdadj|PA|7242456400 +Xclgahd|Fbhdadj|NY|6078356790 +Modgahd|Myhdadj|PA|4840300709 +Bdvgahd|Gchdadj|PA|7242856800 +Xcogahd|Fahdadj|NY|6072156790 +Mongahd|Nghdadj|PA|4842051080 +Cadgahd|Iyhdadj|PA|7240356215 +Xcqgahd|Fmhdadj|NY|6072356779 +Mopgahd|Nkhdadj|PA|4842253282 +Cbegahd|Ixhdadj|PA|7241356215 +Xcrgahd|Fbhdadj|NY|6072456779 +Mosgahd|Ndhdadj|PA|4842556585 +Cbhgahd|Ithdadj|PA|7244356215 +Xdtgahd|Fnhdadj|NY|6072656779 +Mowgahd|Ndhdadj|PA|4842956989 +Ccmgahd|Jxhdadj|PA|7249356721 +Xdzgahd|Fghdadj|NY|6072326779 +Nudgahd|Oyhdadj|PA|4840300709 +Ccogahd|Jahdadj|PA|7242156721 +Ybggahd|Guhdadj|NY|6073353779 +Nujgahd|Ophdadj|PA|4846376769 +Ccpgahd|Kkhdadj|PA|7242256721 +Ycmgahd|Gxhdadj|NY|6079359744 +Numgahd|Pxhdadj|PA|4849359799 +Ccqgahd|Kmhdadj|PA|7242356721 +Ycngahd|Gghdadj|NY|6072056044 +Nungahd|Pghdadj|PA|4842051080 +Cdwgahd|Ldhdadj|PA|7242956721 +Ycrgahd|Gbhdadj|NY|6072456444 +Nuogahd|Pahdadj|PA|4842152181 +Cdzgahd|Lghdadj|PA|7242348422 +Ydugahd|Hbhdadj|NY|6072756744 +Nuqgahd|Pmhdadj|PA|4842354383 +Dbggahd|Muhdadj|PA|7243336722 +Zbggahd|Huhdadj|NY|6073356766 +Nurgahd|Pbhdadj|PA|4842455484 +Dckgahd|Nihdadj|PA|7247386722 +Zbigahd|Ishdadj|NY|6075356766 +Nutgahd|Pnhdadj|PA|4842657686 +Dcogahd|Nahdadj|PA|7242152732 +Zckgahd|Iihdadj|NY|6077356766 +Nuugahd|Pbhdadj|PA|4842758787 +Dcrgahd|Obhdadj|PA|7242455732 +Zclgahd|Ibhdadj|NY|6078356766 +Nuzgahd|Qghdadj|PA|4842326329 +Ddsgahd|Odhdadj|PA|7242556732 +Zcngahd|Ighdadj|NY|6072056766 +Aadgahd|Ayhdadj|PA|7240356710 +Ddtgahd|Onhdadj|PA|7242655702 +Zcqgahd|Imhdadj|NY|6072356766 +Abhgahd|Athdadj|PA|7244356710 +Ddugahd|Obhdadj|PA|7242758732 +Zcrgahd|Ibhdadj|NY|6072456766 +Ackgahd|Bihdadj|PA|7247356710 +Eadgahd|Ryhdadj|PA|7240300745 +Zdsgahd|Idhdadj|NY|6072556766 +Aclgahd|Bbhdadj|PA|7248356710 +Ebegahd|Rxhdadj|PA|7241311745 +Zdtgahd|Inhdadj|NY|6072656766 +Acmgahd|Bxhdadj|PA|7249356701 +Ebfgahd|Rwhdadj|PA|7242322745 +Zdugahd|Ibhdadj|NY|6072756766 +Acpgahd|Bkhdadj|PA|7242256701 +Ebhgahd|Rthdadj|PA|7244344745 +Zdxgahd|Jehdadj|NY|6072306751 +Adtgahd|Cnhdadj|PA|7242656701 +Eckgahd|Sihdadj|PA|7247387745 +Zdzgahd|Jghdadj|NY|6072326751 +Advgahd|Dchdadj|PA|7242856701 +Ecmgahd|Sxhdadj|PA|7249359745 +Keggahd|Juhdadj|NY|6073336751 +Adxgahd|Dehdadj|PA|7242306711 +Ecogahd|Tahdadj|PA|7242152145 +Kejgahd|Jphdadj|NY|6076376751 +Adygahd|Dfhdadj|PA|7242316711 +Ecrgahd|Tbhdadj|PA|7242455445 +Kekgahd|Jihdadj|NY|6077386751 +Bbegahd|Axhdadj|PA|7241351711 +Edugahd|Ubhdadj|PA|7242758709 +Keogahd|Kahdadj|NY|6072152751 +Bckgahd|Fihdadj|PA|7247357700 +Edvgahd|Uchdadj|PA|7242859809 +Kergahd|Kbhdadj|NY|6072455762 +Bcmgahd|Fxhdadj|PA|7249359700 +Edzgahd|Vghdadj|PA|7242326329 +Keugahd|Kbhdadj|NY|6072758762 +Bcpgahd|Gkhdadj|PA|7242256200 +Fadgahd|Vyhdadj|PA|7240300709 +Kevgahd|Kchdadj|NY|6072859762 +Bdsgahd|Gdhdadj|PA|7242558130 +Fbigahd|Wshdadj|PA|7245355759 +Keygahd|Kfhdadj|NY|6072316262 +Bdugahd|Gbhdadj|PA|7242756700 +Fcjgahd|Wphdadj|PA|4570376769 +Lifgahd|Lwhdadj|NY|6072322762 +Bdwgahd|Hdhdadj|PA|7242956900 +Fclgahd|Wbhdadj|PA|7248138789 +Lihgahd|Lthdadj|NY|6074344762 +Bdzgahd|Hghdadj|PA|7242348429 +Fcngahd|Wghdadj|PA|7242051080 +Limgahd|Lxhdadj|NY|6079359762 +Cbigahd|Ishdadj|PA|7245356215 +Fcpgahd|Wkhdadj|PA|7242253282 +Lingahd|Lghdadj|NY|6072031088 +Ccjgahd|Jphdadj|PA|4570356215 +Fdtgahd|Xnhdadj|PA|7242657686 +Liogahd|Lahdadj|NY|6072152188 +Cckgahd|Jihdadj|PA|7247356215 +Fdygahd|Yfhdadj|PA|7241316219 +Lisgahd|Mdhdadj|NY|6072556588 +Cclgahd|Jbhdadj|PA|7248356721 +Gbigahd|Zshdadj|PA|7245355759 +Livgahd|Mchdadj|NY|6072859888 +Ccrgahd|Kbhdadj|PA|7242456721 +Gckgahd|Zihdadj|PA|7247387779 +Liwgahd|Mdhdadj|NY|6072956988 +Cdsgahd|Kdhdadj|PA|7242556721 +Gcmgahd|Zxhdadj|PA|7249359799 +Lixgahd|Mehdadj|NY|6072306109 +Cdxgahd|Lehdadj|PA|7242306721 +Gcogahd|Zahdadj|PA|7242152181 +Mofgahd|Mwhdadj|NY|6072322729 +Dbhgahd|Mthdadj|PA|7244346722 +Gcpgahd|Zkhdadj|PA|7242253282 +Moigahd|Mshdadj|NY|6075355759 +Dbigahd|Nshdadj|PA|7245356722 +Gdtgahd|Anhdadj|PA|7242657686 +Mojgahd|Nphdadj|NY|6076376769 +Dclgahd|Nbhdadj|PA|7248136732 +Gdugahd|Abhdadj|PA|7242758787 +Mokgahd|Nihdadj|NY|6077387779 +Dcqgahd|Omhdadj|PA|7242354732 +Gdwgahd|Adhdadj|PA|7242956989 +Molgahd|Nbhdadj|NY|6076078789 +Ddvgahd|Ochdadj|PA|7242859732 +Gdxgahd|Aehdadj|PA|7240306109 +Moogahd|Nahdadj|NY|6072152181 +Ddwgahd|Odhdadj|PA|7242956045 +Hadgahd|Byhdadj|PA|5700356799 +Morgahd|Nbhdadj|NY|6072455484 +Ebigahd|Sshdadj|PA|7245355745 +Hbigahd|Bshdadj|PA|5705356799 +Mougahd|Nbhdadj|NY|6072758787 +Ecjgahd|Sphdadj|PA|4570376745 +Hcjgahd|Bphdadj|PA|5706356799 +Moxgahd|Nehdadj|NY|6070306109 +Eclgahd|Sbhdadj|PA|7248138745 +Hckgahd|Bihdadj|PA|5707356799 +Moygahd|Ofhdadj|NY|6071316219 +Ecngahd|Sghdadj|PA|7242051045 +Hclgahd|Bbhdadj|PA|5708356799 +Nuegahd|Oxhdadj|NY|6071311719 +Edwgahd|Udhdadj|PA|7242956909 +Hcngahd|Bghdadj|PA|5702056799 +Nuigahd|Oshdadj|NY|6075355759 +Edygahd|Vfhdadj|PA|7242316219 +Hcpgahd|Ckhdadj|PA|5702256767 +Nupgahd|Pkhdadj|NY|6072253282 +Fbfgahd|Vwhdadj|PA|7242322729 +Hdsgahd|Cdhdadj|PA|5702556767 +Nusgahd|Pdhdadj|NY|6072556585 +Fcmgahd|Wxhdadj|PA|7249359799 +Hdtgahd|Cnhdadj|PA|5702656767 +Nuvgahd|Pchdadj|NY|6072859888 +Fcqgahd|Xmhdadj|PA|7242354383 +Hdzgahd|Dghdadj|PA|5702348467 +Nuwgahd|Pdhdadj|NY|6072956989 +Fcrgahd|Xbhdadj|PA|7242455484 +Ibegahd|Dxhdadj|PA|5701351778 +Abegahd|Axhdadj|PA|2151356710 +Fdzgahd|Yghdadj|PA|7242326329 +Ibfgahd|Dwhdadj|PA|5702352778 +Abfgahd|Awhdadj|PA|2152356710 +Gadgahd|Yyhdadj|PA|7240300709 +Ibigahd|Dshdadj|PA|5705355778 +Abggahd|Auhdadj|PA|2153356710 +Gbegahd|Yxhdadj|PA|7241311719 +Icngahd|Eghdadj|PA|5702055708 +Abigahd|Ashdadj|PA|2155356710 +Gbggahd|Yuhdadj|PA|7243333739 +Icpgahd|Ekhdadj|PA|5702256278 +Acjgahd|Bphdadj|PA|2156356710 +Gcjgahd|Zphdadj|PA|4570376769 +Icqgahd|Emhdadj|PA|5702356356 +Acngahd|Bghdadj|PA|2152056701 +Gcngahd|Zghdadj|PA|7242051080 +Idugahd|Fbhdadj|PA|5702756756 +Acogahd|Bahdadj|PA|2152156701 +Gdsgahd|Adhdadj|PA|7242556585 +Jadgahd|Gyhdadj|PA|5700356701 +Acqgahd|Cmhdadj|PA|2152356701 +Gdzgahd|Aghdadj|PA|7242326329 +Jbegahd|Gxhdadj|PA|5701356701 +Acrgahd|Cbhdadj|PA|2152456701 +Hbggahd|Buhdadj|PA|5703356799 +Jbfgahd|Gwhdadj|PA|5702356701 +Adsgahd|Cdhdadj|PA|2152556701 +Hbhgahd|Bthdadj|PA|5704356799 +Jbigahd|Gshdadj|PA|5705356701 +Adugahd|Cbhdadj|PA|2152756701 +Hcmgahd|Bxhdadj|PA|5709356799 +Jckgahd|Hihdadj|PA|5707356701 +Adwgahd|Ddhdadj|PA|2152956711 +Hcogahd|Bahdadj|PA|5702156799 +Jclgahd|Hbhdadj|PA|5708356701 +Adzgahd|Dghdadj|PA|2152348411 +Hcqgahd|Cmhdadj|PA|5702356767 +Jcrgahd|Hbhdadj|PA|5702456755 +Bbggahd|Euhdadj|PA|2153353711 +Hcrgahd|Cbhdadj|PA|5702456767 +Jdsgahd|Hdhdadj|PA|5702556755 +Bbhgahd|Ethdadj|PA|2154354711 +Hdvgahd|Cchdadj|PA|5702856767 +Jdzgahd|Ighdadj|PA|5702348455 +Bbigahd|Eshdadj|PA|2155355711 +Hdwgahd|Cdhdadj|PA|5702956767 +Kadgahd|Iyhdadj|PA|5700306704 +Bcngahd|Fghdadj|PA|2152056000 +Hdxgahd|Cehdadj|PA|5702306767 +Kbegahd|Ixhdadj|PA|5701316704 +Bdtgahd|Gnhdadj|PA|2152656600 +Hdygahd|Dfhdadj|PA|5702316767 +Kbfgahd|Jwhdadj|PA|5702348404 +Bdxgahd|Hehdadj|PA|2152306709 +Ibggahd|Duhdadj|PA|5703353778 +Kbigahd|Jshdadj|PA|5705356704 +Bdygahd|Hfhdadj|PA|2152316719 +Ickgahd|Eihdadj|PA|5707357778 +Kcjgahd|Jphdadj|PA|5706376704 +Cbfgahd|Iwhdadj|PA|2152356215 +Icogahd|Eahdadj|PA|5702156178 +Kclgahd|Jbhdadj|PA|5708136704 +Cbggahd|Iuhdadj|PA|2153356215 +Icrgahd|Fbhdadj|PA|5702456456 +Kcqgahd|Kmhdadj|PA|5702354766 +Ccngahd|Jghdadj|PA|2152056721 +Idsgahd|Fdhdadj|PA|5702556556 +Kcrgahd|Kbhdadj|PA|5702455766 +Cdtgahd|Knhdadj|PA|2152656721 +Idtgahd|Fnhdadj|PA|5702656656 +Kdsgahd|Kdhdadj|PA|5702556766 +Cdugahd|Kbhdadj|PA|2152756721 +Idvgahd|Fchdadj|PA|5702856856 +Kdugahd|Kbhdadj|PA|5702758766 +Cdvgahd|Lchdadj|PA|2152856721 +Idwgahd|Fdhdadj|PA|5702956956 +Kdzgahd|Lghdadj|PA|5702326366 +Cdygahd|Lfhdadj|PA|2152316722 +Idxgahd|Fehdadj|PA|5702306709 +Lbegahd|Lxhdadj|PA|5701311766 +Dadgahd|Myhdadj|PA|2150306722 +Jcogahd|Hahdadj|PA|5702156755 +Ldsgahd|Mdhdadj|PA|5702556529 +Dbegahd|Mxhdadj|PA|2151316722 +Jcpgahd|Hkhdadj|PA|5702256755 +Ldvgahd|Nchdadj|PA|5702859829 +Dbfgahd|Mwhdadj|PA|2152348422 +Jcqgahd|Hmhdadj|PA|5702356755 +Ldwgahd|Ndhdadj|PA|5702956929 +Dcjgahd|Nphdadj|PA|2156376722 +Jdugahd|Ibhdadj|PA|5702756755 +Ldygahd|Nfhdadj|PA|5702316219 +Dcmgahd|Nxhdadj|PA|2159350732 +Jdxgahd|Iehdadj|PA|5702306755 +Mbfgahd|Nwhdadj|PA|5702322729 +Dcngahd|Nghdadj|PA|2152051732 +Jdygahd|Ifhdadj|PA|5702316755 +Mclgahd|Obhdadj|PA|5708138789 +Dcpgahd|Nkhdadj|PA|2152253732 +Kbggahd|Juhdadj|PA|5703336704 +Mcmgahd|Oxhdadj|PA|5709359799 +Ddxgahd|Pehdadj|PA|2152306145 +Kbhgahd|Jthdadj|PA|5704346704 +Mcqgahd|Omhdadj|PA|5702354383 +Ddygahd|Pfhdadj|PA|2152316245 +Kcmgahd|Jxhdadj|PA|5709350704 +Mcrgahd|Obhdadj|PA|5702455484 +Ddzgahd|Pghdadj|PA|2152326345 +Kcpgahd|Kkhdadj|PA|5702253704 +Mdxgahd|Pehdadj|PA|5700306109 +Ebggahd|Ruhdadj|PA|2153333745 +Kdtgahd|Knhdadj|PA|5702657766 +Ncjgahd|Pphdadj|PA|5706376769 +Ecpgahd|Tkhdadj|PA|2152253245 +Kdxgahd|Lehdadj|PA|5702306166 +Nckgahd|Pihdadj|PA|5707387779 +Ecqgahd|Tmhdadj|PA|2152354345 +Kdygahd|Lfhdadj|PA|5702316266 +Ncrgahd|Qbhdadj|PA|5702455484 +Edsgahd|Tdhdadj|PA|2152558139 +Lbfgahd|Lwhdadj|PA|5702322766 +Ndtgahd|Qnhdadj|PA|5702657686 +Edtgahd|Unhdadj|PA|2152657609 +Lbigahd|Lshdadj|PA|5705355729 +Ndugahd|Qbhdadj|PA|5702758787 +Edxgahd|Uehdadj|PA|2152306109 +Lckgahd|Mihdadj|PA|5707387729 +Ndvgahd|Qchdadj|PA|5702859888 +Fbegahd|Vxhdadj|PA|2151311719 +Lcmgahd|Mxhdadj|PA|5709359729 +Ndygahd|Rfhdadj|PA|5701316219 +Fbggahd|Vuhdadj|PA|2153333739 +Lcqgahd|Mmhdadj|PA|5702354329 +Ndzgahd|Rghdadj|PA|5702326329 +Fbhgahd|Vthdadj|PA|2154344749 +Ldxgahd|Nehdadj|PA|5702306109 +Obggahd|Ruhdadj|PA|8143356776 +Fckgahd|Wihdadj|PA|2157387779 +Ldzgahd|Nghdadj|PA|5702326329 +Obigahd|Rshdadj|PA|8145356776 +Fcogahd|Wahdadj|PA|2152152181 +Mbegahd|Nxhdadj|PA|5701311719 +Oclgahd|Sbhdadj|PA|8148356776 +Fdsgahd|Xdhdadj|PA|2152556585 +Mbigahd|Nshdadj|PA|5705355759 +Ocmgahd|Sxhdadj|PA|8149356776 +Fdugahd|Xbhdadj|PA|2152758787 +Mckgahd|Nihdadj|PA|5707387779 +Ocogahd|Sahdadj|PA|8142156776 +Fdvgahd|Xchdadj|PA|2152859888 +Mcngahd|Oghdadj|PA|5702057080 +Ocqgahd|Smhdadj|PA|8142356776 +Fdwgahd|Xdhdadj|PA|2152956989 +Mcogahd|Oahdadj|PA|5702152181 +Odugahd|Tbhdadj|PA|8142756776 +Fdxgahd|Xehdadj|PA|2150306109 +Mdtgahd|Onhdadj|PA|5702657686 +Padgahd|Tyhdadj|PA|8140350767 +Gbfgahd|Ywhdadj|PA|2152322729 +Mdugahd|Obhdadj|PA|5702758787 +Pbfgahd|Twhdadj|PA|8142352767 +Gbhgahd|Ythdadj|PA|2154344749 +Mdvgahd|Ochdadj|PA|5702859888 +Pbggahd|Tuhdadj|PA|8143353767 +Gclgahd|Zbhdadj|PA|2158138789 +Nbegahd|Pxhdadj|PA|5701311719 +Pcjgahd|Uphdadj|PA|8146356767 +Gcqgahd|Zmhdadj|PA|2152354383 +Nbigahd|Pshdadj|PA|5705355759 +Pckgahd|Uihdadj|PA|8147057767 +Gcrgahd|Zbhdadj|PA|2152455484 +Nclgahd|Qbhdadj|PA|5708138789 +Pcngahd|Ughdadj|PA|8142056067 +Gdvgahd|Achdadj|PA|2152859888 +Ncngahd|Qghdadj|PA|5702057080 +Pdugahd|Ubhdadj|PA|8142756700 +Gdygahd|Afhdadj|PA|2151316219 +Ncqgahd|Qmhdadj|PA|5702354383 +Pdxgahd|Vehdadj|PA|8142306709 +Hbegahd|Bxhdadj|PA|4841356799 +Ndsgahd|Qdhdadj|PA|5702556585 +Pdygahd|Vfhdadj|PA|8142316719 +Hbfgahd|Bwhdadj|PA|4842356799 +Ndxgahd|Rehdadj|PA|5700306109 +Rbggahd|Vuhdadj|PA|8143356700 +Hdugahd|Cbhdadj|PA|4842756767 +Obhgahd|Rthdadj|PA|8144356776 +Rbigahd|Vshdadj|PA|8145356700 +Iadgahd|Dyhdadj|PA|4840350767 +Ocpgahd|Skhdadj|PA|8142256776 +Rcjgahd|Vphdadj|PA|8146356700 +Ibhgahd|Dthdadj|PA|4844354778 +Ocrgahd|Sbhdadj|PA|8142456776 +Sbfgahd|Xwhdadj|PA|8142348406 +Icjgahd|Dphdadj|PA|4846356778 +Odsgahd|Sdhdadj|PA|8142556776 +Sbggahd|Xuhdadj|PA|8143336706 +Iclgahd|Ebhdadj|PA|4848358778 +Odvgahd|Tchdadj|PA|8142856776 +Sbigahd|Xshdadj|PA|8145356740 +Icmgahd|Exhdadj|PA|4849359778 +Odxgahd|Tehdadj|PA|8142306767 +Scngahd|Xghdadj|PA|8142051740 +Idygahd|Gfhdadj|PA|4842316719 +Odygahd|Tfhdadj|PA|8142316767 +Scpgahd|Ykhdadj|PA|8142253740 +Idzgahd|Gghdadj|PA|4842348429 +Odzgahd|Tghdadj|PA|8142348467 +Scqgahd|Ymhdadj|PA|8142354740 +Jbggahd|Guhdadj|PA|4843356701 +Pbegahd|Txhdadj|PA|8141351767 +Sdzgahd|Yghdadj|PA|8142326333 +Jbhgahd|Gthdadj|PA|4844356701 +Pbigahd|Tshdadj|PA|8145355767 +Ubggahd|Zuhdadj|PA|8143333733 +Jcjgahd|Gphdadj|PA|4846356701 +Pclgahd|Ubhdadj|PA|8148358767 +Ubhgahd|Zthdadj|PA|8144344733 +Jcmgahd|Hxhdadj|PA|4849356701 +Pcmgahd|Uxhdadj|PA|8149359767 +Uckgahd|Zihdadj|PA|8147085703 +Jcngahd|Hghdadj|PA|4842056755 +Pcpgahd|Ukhdadj|PA|8142256484 +Ucngahd|Aghdadj|PA|8142051033 +Jdtgahd|Inhdadj|PA|4842656755 +Pdsgahd|Udhdadj|PA|8142558140 +Ucogahd|Aahdadj|PA|8142152133 +Jdvgahd|Ichdadj|PA|4842856755 +Pdwgahd|Udhdadj|PA|8142956900 +Ucrgahd|Abhdadj|PA|8142455433 +Jdwgahd|Idhdadj|PA|4842956755 +Pdzgahd|Vghdadj|PA|8142348429 +Udsgahd|Adhdadj|PA|8142556533 +Kckgahd|Jihdadj|PA|4847386704 +Radgahd|Vyhdadj|PA|8140356700 +Udwgahd|Adhdadj|PA|8142956933 +Kcngahd|Jghdadj|PA|4842051704 +Rbhgahd|Vthdadj|PA|8144356700 +Udzgahd|Bghdadj|PA|8142326329 +Kcogahd|Kahdadj|PA|4842152704 +Rcngahd|Wghdadj|PA|8142056700 +Vbfgahd|Bwhdadj|PA|8142322729 +Kdvgahd|Kchdadj|PA|4842859766 +Rcpgahd|Wkhdadj|PA|8142256706 +Vcjgahd|Bphdadj|PA|8146376769 +Kdwgahd|Ldhdadj|PA|4842956066 +Rcrgahd|Wbhdadj|PA|8142456706 +Vcmgahd|Cxhdadj|PA|8149359799 +Ladgahd|Lyhdadj|PA|4840300766 +Rdugahd|Wbhdadj|PA|8142756706 +Vcpgahd|Ckhdadj|PA|8142253282 +Lbggahd|Luhdadj|PA|4843333729 +Rdvgahd|Wchdadj|PA|8142856706 +Vdxgahd|Cehdadj|PA|8140306109 +Lbhgahd|Lthdadj|PA|4844344729 +Rdxgahd|Wehdadj|PA|8142306706 +Vdygahd|Cfhdadj|PA|8141316219 +Lcjgahd|Lphdadj|PA|4846376729 +Rdygahd|Wfhdadj|PA|8142316706 +Vdzgahd|Cghdadj|PA|8142326329 +Lclgahd|Mbhdadj|PA|4848137179 +Rdzgahd|Wghdadj|PA|8142348406 +Wadgahd|Dyhdadj|PA|8140300709 +Lcngahd|Mghdadj|PA|4842051029 +Sadgahd|Xyhdadj|PA|8140306706 +Wbggahd|Duhdadj|PA|8143333739 +Lcogahd|Mahdadj|PA|4842154849 +Sbegahd|Xxhdadj|PA|8141316706 +Wcjgahd|Dphdadj|PA|8146376769 +Lcpgahd|Mkhdadj|PA|4842253229 +Sbhgahd|Xthdadj|PA|8144346706 +Wcmgahd|Dxhdadj|PA|8149359799 +Lcrgahd|Mbhdadj|PA|4842455429 +Sckgahd|Xihdadj|PA|8147086740 +Wdvgahd|Echdadj|PA|8142859888 +Ldtgahd|Mnhdadj|PA|4842657629 +Sclgahd|Xbhdadj|PA|8148146740 +Wdygahd|Efhdadj|PA|8141316219 +Ldugahd|Mbhdadj|PA|4842757179 +Scogahd|Yahdadj|PA|8142152740 +Xbegahd|Exhdadj|PA|8781356790 +Madgahd|Nyhdadj|PA|4840300709 +Sdsgahd|Ydhdadj|PA|8142556740 +Xbfgahd|Ewhdadj|PA|8782356790 +Mbggahd|Nuhdadj|PA|4843333739 +Sdvgahd|Ychdadj|PA|8142859740 +Xbggahd|Euhdadj|PA|8783356790 +Mbhgahd|Nthdadj|PA|4844344749 +Sdwgahd|Ydhdadj|PA|8142956040 +Xbhgahd|Ethdadj|PA|8784356790 +Mcjgahd|Nphdadj|PA|4846376769 +Sdxgahd|Yehdadj|PA|8142306140 +Xcjgahd|Ephdadj|PA|8786356790 +Mcpgahd|Okhdadj|PA|4842253282 +Ubfgahd|Zwhdadj|PA|8142322733 +Xcngahd|Fghdadj|PA|8782056790 +Mdsgahd|Odhdadj|PA|4842556585 +Ucjgahd|Zphdadj|PA|8146376733 +Xdsgahd|Fdhdadj|PA|8782556779 +Mdwgahd|Pdhdadj|PA|4842956989 +Ucpgahd|Akhdadj|PA|8142253233 +Xdugahd|Fbhdadj|PA|8782756779 +Mdygahd|Pfhdadj|PA|4841316219 +Udvgahd|Achdadj|PA|8142859833 +Xdygahd|Ffhdadj|PA|8782316779 +Mdzgahd|Pghdadj|PA|4842326329 +Udygahd|Bfhdadj|PA|8142316219 +Yadgahd|Gyhdadj|PA|8780350779 +Nadgahd|Pyhdadj|PA|4840300709 +Vadgahd|Byhdadj|PA|8140300709 +Ybegahd|Gxhdadj|PA|8781351779 +Nbfgahd|Pwhdadj|PA|4842322729 +Vbegahd|Bxhdadj|PA|8141311719 +Ybfgahd|Gwhdadj|PA|8782352779 +Nbggahd|Puhdadj|PA|4843333739 +Vbhgahd|Bthdadj|PA|8144344749 +Ybhgahd|Gthdadj|PA|8784354779 +Nbhgahd|Pthdadj|PA|4844344749 +Vbigahd|Bshdadj|PA|8145355759 +Ycjgahd|Gphdadj|PA|8786356779 +Ncmgahd|Qxhdadj|PA|4849359799 +Vckgahd|Bihdadj|PA|8147087779 +Yclgahd|Gbhdadj|PA|8788358744 +Ncogahd|Qahdadj|PA|4842152181 +Vclgahd|Bbhdadj|PA|8148148789 +Ycpgahd|Gkhdadj|PA|8782256244 +Ncpgahd|Qkhdadj|PA|4842253282 +Vcqgahd|Cmhdadj|PA|8142354383 +Ydtgahd|Hnhdadj|PA|8782656644 +Ndwgahd|Qdhdadj|PA|4842956989 +Vdugahd|Cbhdadj|PA|8142758787 +Ydwgahd|Hdhdadj|PA|8782956944 +Oadgahd|Ryhdadj|PA|7170356776 +Vdvgahd|Cchdadj|PA|8142859888 +Ydxgahd|Hehdadj|PA|8782306709 +Obegahd|Rxhdadj|PA|7171356776 +Vdwgahd|Cdhdadj|PA|8142956989 +Ydygahd|Hfhdadj|PA|8782316719 +Obfgahd|Rwhdadj|PA|7172356776 +Wbfgahd|Dwhdadj|PA|8142322729 +Ydzgahd|Hghdadj|PA|8782348429 +Ocjgahd|Sphdadj|PA|7176356776 +Wbhgahd|Dthdadj|PA|8144344749 +Zadgahd|Hyhdadj|PA|8780356744 +Ockgahd|Sihdadj|PA|7157056776 +Wcogahd|Dahdadj|PA|8142152181 +Zbfgahd|Hwhdadj|PA|8782356744 +Ocngahd|Sghdadj|PA|7172056776 +Wcpgahd|Dkhdadj|PA|8142253282 +Zbhgahd|Hthdadj|PA|8784356766 +Odtgahd|Snhdadj|PA|7172656776 +Wcqgahd|Emhdadj|PA|8142354383 +Zcjgahd|Iphdadj|PA|8786356766 +Odwgahd|Tdhdadj|PA|7172956776 +Wdugahd|Ebhdadj|PA|8142758787 +Zcmgahd|Ixhdadj|PA|8789356766 +Pbhgahd|Tthdadj|PA|7174354767 +Wdxgahd|Eehdadj|PA|8140306109 +Zdvgahd|Jchdadj|PA|8782856751 +Pcogahd|Uahdadj|PA|7172156167 +Xbigahd|Eshdadj|PA|8785356790 +Kedgahd|Jyhdadj|PA|8780306751 +Pcqgahd|Umhdadj|PA|7172356367 +Xckgahd|Eihdadj|PA|8787356790 +Keegahd|Jxhdadj|PA|8781316751 +Pcrgahd|Ubhdadj|PA|7172455707 +Xcmgahd|Fxhdadj|PA|8789356790 +Kehgahd|Jthdadj|PA|8784346751 +Pdtgahd|Unhdadj|PA|7172656600 +Xcpgahd|Fkhdadj|PA|8782256779 +Kelgahd|Jbhdadj|PA|8788136751 +Pdvgahd|Uchdadj|PA|7172856800 +Xdvgahd|Fchdadj|PA|8782856779 +Keqgahd|Kmhdadj|PA|8782354762 +Rbegahd|Vxhdadj|PA|7171356700 +Xdwgahd|Fdhdadj|PA|8782956779 +Ketgahd|Knhdadj|PA|8782657762 +Rbfgahd|Vwhdadj|PA|7172356700 +Xdxgahd|Fehdadj|PA|8782306779 +Kezgahd|Kghdadj|PA|8782326362 +Rckgahd|Vihdadj|PA|7157056700 +Ybigahd|Gshdadj|PA|8785355779 +Liggahd|Luhdadj|PA|8783333762 +Rclgahd|Wbhdadj|PA|7178356700 +Yckgahd|Gihdadj|PA|8787357779 +Likgahd|Lihdadj|PA|8787387762 +Rcmgahd|Wxhdadj|PA|7179356700 +Ycogahd|Gahdadj|PA|8782156144 +Lilgahd|Lbhdadj|PA|8788138762 +Rcogahd|Wahdadj|PA|7172156700 +Ycqgahd|Gmhdadj|PA|8782356344 +Lipgahd|Lkhdadj|PA|8782253288 +Rcqgahd|Wmhdadj|PA|7172356706 +Ydsgahd|Hdhdadj|PA|8782556544 +Liygahd|Mfhdadj|PA|8782316219 +Rdsgahd|Wdhdadj|PA|7172556706 +Ydvgahd|Hchdadj|PA|8782856844 +Moegahd|Mxhdadj|PA|8781311719 +Rdtgahd|Wnhdadj|PA|7172656706 +Zbegahd|Hxhdadj|PA|8781356744 +Moggahd|Muhdadj|PA|8783333739 +Rdwgahd|Wdhdadj|PA|7172956706 +Zcogahd|Iahdadj|PA|8782156766 +Mohgahd|Mthdadj|PA|8784344749 +Scjgahd|Xphdadj|PA|7176376740 +Zcpgahd|Ikhdadj|PA|8782256766 +Momgahd|Nxhdadj|PA|8789359799 +Scmgahd|Xxhdadj|PA|7179350740 +Zdwgahd|Jdhdadj|PA|8782956751 +Moqgahd|Nmhdadj|PA|8782354383 +Scrgahd|Ybhdadj|PA|7172455740 +Zdygahd|Jfhdadj|PA|8782316751 +Motgahd|Nnhdadj|PA|8782657686 +Sdtgahd|Ynhdadj|PA|7172657740 +Kefgahd|Jwhdadj|PA|8782348451 +Movgahd|Nchdadj|PA|8782859888 +Sdugahd|Ybhdadj|PA|7172758740 +Keigahd|Jshdadj|PA|8785356751 +Mozgahd|Oghdadj|PA|8782326329 +Sdygahd|Yfhdadj|PA|7172316233 +Kemgahd|Kxhdadj|PA|8789350751 +Nufgahd|Owhdadj|PA|8782322729 +Uadgahd|Zyhdadj|PA|7170300733 +Kengahd|Kghdadj|PA|8782051751 +Nuggahd|Ouhdadj|PA|8783333739 +Ubegahd|Zxhdadj|PA|7171311733 +Kepgahd|Kkhdadj|PA|8782253751 +Nuhgahd|Othdadj|PA|8784344749 +Ubigahd|Zshdadj|PA|7175355733 +Kesgahd|Kdhdadj|PA|8782556762 +Nukgahd|Oihdadj|PA|8787387779 +Uclgahd|Zbhdadj|PA|7177178733 +Kewgahd|Kdhdadj|PA|8782956062 +Nulgahd|Pbhdadj|PA|8788138789 +Ucmgahd|Axhdadj|PA|7179359733 +Kexgahd|Kehdadj|PA|8782306162 +Nuxgahd|Qehdadj|PA|8780306109 +Ucqgahd|Amhdadj|PA|7172354333 +Lidgahd|Lyhdadj|PA|8780300762 +Nuygahd|Qfhdadj|PA|8781316219 +Udtgahd|Anhdadj|PA|7172657633 +Liegahd|Lxhdadj|PA|8781311762 +Badgahd|Eyhdadj|PA|7170350711 +Udugahd|Abhdadj|PA|7172758733 +Liigahd|Lshdadj|PA|8785355762 +Bbfgahd|Ewhdadj|PA|7172352711 +Udxgahd|Aehdadj|PA|7172306109 +Lijgahd|Lphdadj|PA|8786376762 +Bcjgahd|Fphdadj|PA|7176356711 +Vbggahd|Buhdadj|PA|7173333739 +Liqgahd|Lmhdadj|PA|8782354388 +Bclgahd|Fbhdadj|PA|7178358700 +Vcngahd|Cghdadj|PA|7172051080 +Lirgahd|Mbhdadj|PA|8782455488 +Bcogahd|Fahdadj|PA|7172156100 +Vcogahd|Cahdadj|PA|7172152181 +Litgahd|Mnhdadj|PA|8782657688 +Bcqgahd|Gmhdadj|PA|7172356300 +Vcrgahd|Cbhdadj|PA|7172455484 +Liugahd|Mbhdadj|PA|8782758788 +Bcrgahd|Gbhdadj|PA|7172456400 +Vdsgahd|Cdhdadj|PA|7172556585 +Lizgahd|Mghdadj|PA|8782326329 +Bdvgahd|Gchdadj|PA|7172856800 +Vdtgahd|Cnhdadj|PA|7172657686 +Modgahd|Myhdadj|PA|8780300709 +Cadgahd|Iyhdadj|PA|7170356215 +Wbegahd|Dxhdadj|PA|7171311719 +Mongahd|Nghdadj|PA|8782087880 +Cbegahd|Ixhdadj|PA|7171356215 +Wbigahd|Dshdadj|PA|7175355759 +Mopgahd|Nkhdadj|PA|8782253282 +Cbhgahd|Ithdadj|PA|7174356215 +Wckgahd|Dihdadj|PA|7157087779 +Mosgahd|Ndhdadj|PA|8782556585 +Ccmgahd|Jxhdadj|PA|7179356721 +Wclgahd|Dbhdadj|PA|7177178789 +Mowgahd|Ndhdadj|PA|8782956989 +Ccogahd|Jahdadj|PA|7172156721 +Wcngahd|Dghdadj|PA|7172051080 +Nudgahd|Oyhdadj|PA|8780300709 +Ccpgahd|Kkhdadj|PA|7172256721 +Wcrgahd|Ebhdadj|PA|7172455484 +Nujgahd|Ophdadj|PA|8786376769 +Ccqgahd|Kmhdadj|PA|7172356721 +Wdsgahd|Edhdadj|PA|7172556585 +Numgahd|Pxhdadj|PA|8789359799 +Cdwgahd|Ldhdadj|PA|7172956721 +Wdtgahd|Enhdadj|PA|7172657686 +Nungahd|Pghdadj|PA|8782087880 +Cdzgahd|Lghdadj|PA|7172348422 +Wdwgahd|Edhdadj|PA|7172956989 +Nuogahd|Pahdadj|PA|8782152181 +Dbggahd|Muhdadj|PA|7173336722 +Wdzgahd|Eghdadj|PA|7172326329 +Nuqgahd|Pmhdadj|PA|8782354383 +Dckgahd|Nihdadj|PA|7177086722 +Xadgahd|Eyhdadj|PA|4840356790 +Nurgahd|Pbhdadj|PA|8782455484 +Dcogahd|Nahdadj|PA|7172152732 +Xclgahd|Fbhdadj|PA|4848356790 +Nutgahd|Pnhdadj|PA|8782657686 +Dcrgahd|Obhdadj|PA|7172455732 +Xcogahd|Fahdadj|PA|4842156790 +Nuugahd|Pbhdadj|PA|8782758787 +Ddsgahd|Odhdadj|PA|7172556732 +Xcqgahd|Fmhdadj|PA|4842356779 +Nuzgahd|Qghdadj|PA|8782326329 +Ddtgahd|Onhdadj|PA|7172655702 +Xcrgahd|Fbhdadj|PA|4842456779 +Aadgahd|Ayhdadj|PA|7170356710 +Ddugahd|Obhdadj|PA|7172758732 +Xdtgahd|Fnhdadj|PA|4842656779 +Abhgahd|Athdadj|PA|7174356710 +Eadgahd|Ryhdadj|PA|7170300745 +Xdzgahd|Fghdadj|PA|4842348479 +Ackgahd|Bihdadj|PA|7157056710 +Ebegahd|Rxhdadj|PA|7171311745 +Ybggahd|Guhdadj|PA|4843353779 +Aclgahd|Bbhdadj|PA|7178356710 +Ebfgahd|Rwhdadj|PA|7172322745 +Ycmgahd|Gxhdadj|PA|4849359744 +Acmgahd|Bxhdadj|PA|7179356701 +Ebhgahd|Rthdadj|PA|7174344745 +Ycngahd|Gghdadj|PA|4842056044 +Acpgahd|Bkhdadj|PA|7172256701 +Eckgahd|Sihdadj|PA|7177087745 +Ycrgahd|Gbhdadj|PA|4842456444 +Adtgahd|Cnhdadj|PA|7172656701 +Ecmgahd|Sxhdadj|PA|7179359745 +Ydugahd|Hbhdadj|PA|4842756744 +Advgahd|Dchdadj|PA|7172856701 +Ecogahd|Tahdadj|PA|7172152145 +Zbggahd|Huhdadj|PA|4843356766 +Adxgahd|Dehdadj|PA|7172306711 +Ecrgahd|Tbhdadj|PA|7172455445 +Zbigahd|Ishdadj|PA|4845356766 +Adygahd|Dfhdadj|PA|7172316711 +Edugahd|Ubhdadj|PA|7172758709 +Zckgahd|Iihdadj|PA|4847356766 +Bbegahd|Axhdadj|PA|7171351711 +Edvgahd|Uchdadj|PA|7172859809 +Zclgahd|Ibhdadj|PA|4848356766 +Bckgahd|Fihdadj|PA|7177057700 +Edzgahd|Vghdadj|PA|7172326329 +Zcngahd|Ighdadj|PA|4842056766 +Bcmgahd|Fxhdadj|PA|7179359700 +Fadgahd|Vyhdadj|PA|7170300709 +Zcqgahd|Imhdadj|PA|4842356766 +Bcpgahd|Gkhdadj|PA|7172256200 +Fbigahd|Wshdadj|PA|7175355759 +Zcrgahd|Ibhdadj|PA|4842456766 +Bdsgahd|Gdhdadj|PA|7172558130 +Fcjgahd|Wphdadj|PA|7176376769 +Zdsgahd|Idhdadj|PA|4842556766 +Bdugahd|Gbhdadj|PA|7172756700 +Fclgahd|Wbhdadj|PA|7178138789 +Zdtgahd|Inhdadj|PA|4842656766 +Bdwgahd|Hdhdadj|PA|7172956900 +Fcngahd|Wghdadj|PA|7172031080 +Zdugahd|Ibhdadj|PA|4842756766 +Bdzgahd|Hghdadj|PA|7172348429 +Fcpgahd|Wkhdadj|PA|7172253282 +Zdxgahd|Jehdadj|PA|4842306751 +Cbigahd|Ishdadj|PA|7175356215 +Fdtgahd|Xnhdadj|PA|7172657686 +Zdzgahd|Jghdadj|PA|4842348451 +Ccjgahd|Jphdadj|PA|7176356215 +Fdygahd|Yfhdadj|PA|7171316219 +Keggahd|Juhdadj|PA|4843336751 +Cckgahd|Jihdadj|PA|7177056215 +Gbigahd|Zshdadj|PA|7175355759 +Kejgahd|Jphdadj|PA|4846376751 +Cclgahd|Jbhdadj|PA|7178356721 +Gckgahd|Zihdadj|PA|7177087779 +Kekgahd|Jihdadj|PA|4847386751 +Ccrgahd|Kbhdadj|PA|7172456721 +Gcmgahd|Zxhdadj|PA|7179359799 +Keogahd|Kahdadj|PA|4842152751 +Cdsgahd|Kdhdadj|PA|7172556721 +Gcogahd|Zahdadj|PA|7172152181 +Kergahd|Kbhdadj|PA|4842455762 +Cdxgahd|Lehdadj|PA|7172306721 +Gcpgahd|Zkhdadj|PA|7172253282 +Keugahd|Kbhdadj|PA|4842758762 +Dbhgahd|Mthdadj|PA|7174346722 +Gdtgahd|Anhdadj|PA|7172657686 +Kevgahd|Kchdadj|PA|4842859762 +Dbigahd|Nshdadj|PA|7175356722 +Gdugahd|Abhdadj|PA|7172758787 +Keygahd|Kfhdadj|PA|4842316262 +Dclgahd|Nbhdadj|PA|7178136732 +Gdwgahd|Adhdadj|PA|7172956989 +Lifgahd|Lwhdadj|PA|4842322762 +Dcqgahd|Omhdadj|PA|7172354732 +Gdxgahd|Aehdadj|PA|7170306109 +Lihgahd|Lthdadj|PA|4844344762 +Ddvgahd|Ochdadj|PA|7172859732 +Hadgahd|Byhdadj|PA|5700356799 +Limgahd|Lxhdadj|PA|4849359762 +Ddwgahd|Odhdadj|PA|7172956045 +Hbigahd|Bshdadj|PA|5705356799 +Lingahd|Lghdadj|PA|4842051088 +Ebigahd|Sshdadj|PA|7175355745 +Hcjgahd|Bphdadj|PA|5706356799 +Liogahd|Lahdadj|PA|4842152188 +Ecjgahd|Sphdadj|PA|7176376745 +Hckgahd|Bihdadj|PA|5707356799 +Lisgahd|Mdhdadj|PA|4842556588 +Eclgahd|Sbhdadj|PA|7178138745 +Hclgahd|Bbhdadj|PA|5708356799 +Livgahd|Mchdadj|PA|4842859888 +Ecngahd|Sghdadj|PA|7172031045 +Hcngahd|Bghdadj|PA|5702056799 +Liwgahd|Mdhdadj|PA|4842956988 +Edwgahd|Udhdadj|PA|7172956909 +Hcpgahd|Ckhdadj|PA|5702256767 +Lixgahd|Mehdadj|PA|4842306109 +Edygahd|Vfhdadj|PA|7172316219 +Hdsgahd|Cdhdadj|PA|5702556767 +Mofgahd|Mwhdadj|PA|4842322729 +Fbfgahd|Vwhdadj|PA|7172322729 +Hdtgahd|Cnhdadj|PA|5702656767 +Moigahd|Mshdadj|PA|4845355759 +Fcmgahd|Wxhdadj|PA|7179359799 +Hdzgahd|Dghdadj|PA|5702348467 +Mojgahd|Nphdadj|PA|4846376769 +Fcqgahd|Xmhdadj|PA|7172354383 +Ibegahd|Dxhdadj|PA|5701351778 +Mokgahd|Nihdadj|PA|4847387779 +Fcrgahd|Xbhdadj|PA|7172455484 +Ibfgahd|Dwhdadj|PA|5702352778 +Molgahd|Nbhdadj|PA|4848138789 +Fdzgahd|Yghdadj|PA|7172326329 +Ibigahd|Dshdadj|PA|5705355778 +Moogahd|Nahdadj|PA|4842152181 +Gadgahd|Yyhdadj|PA|7170300709 +Icngahd|Eghdadj|PA|5702055708 +Morgahd|Nbhdadj|PA|4842455484 +Gbegahd|Yxhdadj|PA|7171311719 +Icpgahd|Ekhdadj|PA|5702256278 +Mougahd|Nbhdadj|PA|4842758787 +Gbggahd|Yuhdadj|PA|7173333739 +Icqgahd|Emhdadj|PA|5702356356 +Moxgahd|Nehdadj|PA|4840306109 +Gcjgahd|Zphdadj|PA|7176376769 +Idugahd|Fbhdadj|PA|5702756756 +Moygahd|Ofhdadj|PA|4841316219 +Gcngahd|Zghdadj|PA|7172031080 +Jadgahd|Gyhdadj|PA|5700356701 +Nuegahd|Oxhdadj|PA|4841311719 +Gdsgahd|Adhdadj|PA|7172556585 +Jbegahd|Gxhdadj|PA|5701356701 +Nuigahd|Oshdadj|PA|4845355759 +Gdzgahd|Aghdadj|PA|7172326329 +Jbfgahd|Gwhdadj|PA|5702356701 +Nupgahd|Pkhdadj|PA|4842253282 +Hbggahd|Buhdadj|PA|5703356799 +Jbigahd|Gshdadj|PA|5705356701 +Nusgahd|Pdhdadj|PA|4842556585 +Hbhgahd|Bthdadj|PA|5704356799 +Jckgahd|Hihdadj|PA|5707356701 +Nuvgahd|Pchdadj|PA|4842859888 +Hcmgahd|Bxhdadj|PA|5709356799 +Jclgahd|Hbhdadj|PA|5708356701 +Nuwgahd|Pdhdadj|PA|4842956989 +Hcogahd|Bahdadj|PA|5702156799 +Jcrgahd|Hbhdadj|PA|5702456755 +Abegahd|Axhdadj|PA|7241356710 +Hcqgahd|Cmhdadj|PA|5702356767 +Jdsgahd|Hdhdadj|PA|5702556755 +Abfgahd|Awhdadj|PA|7242356710 +Hcrgahd|Cbhdadj|PA|5702456767 +Jdzgahd|Ighdadj|PA|5702348455 +Abggahd|Auhdadj|PA|7243356710 +Hdvgahd|Cchdadj|PA|5702856767 +Kadgahd|Iyhdadj|PA|5700306704 +Abigahd|Ashdadj|PA|7245356710 +Hdwgahd|Cdhdadj|PA|5702956767 +Kbegahd|Ixhdadj|PA|5701316704 +Acjgahd|Bphdadj|PA|7243356710 +Hdxgahd|Cehdadj|PA|5702306767 +Kbfgahd|Jwhdadj|PA|5702348404 +Acngahd|Bghdadj|PA|7242056701 +Hdygahd|Dfhdadj|PA|5702316767 +Kbigahd|Jshdadj|PA|5705356704 +Acogahd|Bahdadj|PA|7242156701 +Ibggahd|Duhdadj|PA|5703353778 +Kcjgahd|Jphdadj|PA|5706376704 +Acqgahd|Cmhdadj|PA|7242356701 +Ickgahd|Eihdadj|PA|5707357778 +Kclgahd|Jbhdadj|PA|5705706704 +Acrgahd|Cbhdadj|PA|7242456701 +Icogahd|Eahdadj|PA|5702156178 +Kcqgahd|Kmhdadj|PA|5702354766 +Adsgahd|Cdhdadj|PA|7242556701 +Icrgahd|Fbhdadj|PA|5702456456 +Kcrgahd|Kbhdadj|PA|5702455766 +Adugahd|Cbhdadj|PA|7242756701 +Idsgahd|Fdhdadj|PA|5702556556 +Kdsgahd|Kdhdadj|PA|5702556766 +Adwgahd|Ddhdadj|PA|7242956711 +Idtgahd|Fnhdadj|PA|5702656656 +Kdugahd|Kbhdadj|PA|5702758766 +Adzgahd|Dghdadj|PA|7242348411 +Idvgahd|Fchdadj|PA|5702856856 +Kdzgahd|Lghdadj|PA|5702326366 +Bbggahd|Euhdadj|PA|7243353711 +Idwgahd|Fdhdadj|PA|5702956956 +Lbegahd|Lxhdadj|PA|5701311766 +Bbhgahd|Ethdadj|PA|7244354711 +Idxgahd|Fehdadj|PA|5702306709 +Ldsgahd|Mdhdadj|PA|5702556529 +Bbigahd|Eshdadj|PA|7245355711 +Jcogahd|Hahdadj|PA|5702156755 +Ldvgahd|Nchdadj|PA|5702859829 +Bcngahd|Fghdadj|PA|7242056000 +Jcpgahd|Hkhdadj|PA|5702256755 +Ldwgahd|Ndhdadj|PA|5702956929 +Bdtgahd|Gnhdadj|PA|7242656600 +Jcqgahd|Hmhdadj|PA|5702356755 +Ldygahd|Nfhdadj|PA|5702316219 +Bdxgahd|Hehdadj|PA|7242306709 +Jdugahd|Ibhdadj|PA|5702756755 +Mbfgahd|Nwhdadj|PA|5702322729 +Bdygahd|Hfhdadj|PA|7242316719 +Jdxgahd|Iehdadj|PA|5702306755 +Mclgahd|Obhdadj|PA|5705708789 +Cbfgahd|Iwhdadj|PA|7242356215 +Jdygahd|Ifhdadj|PA|5702316755 +Mcmgahd|Oxhdadj|PA|5709359799 +Cbggahd|Iuhdadj|PA|7243356215 +Kbggahd|Juhdadj|PA|5703336704 +Mcqgahd|Omhdadj|PA|5702354383 +Ccngahd|Jghdadj|PA|7242056721 +Kbhgahd|Jthdadj|PA|5704346704 +Mcrgahd|Obhdadj|PA|5702455484 +Cdtgahd|Knhdadj|PA|7242656721 +Kcmgahd|Jxhdadj|PA|5709350704 +Mdxgahd|Pehdadj|PA|5700306109 +Cdugahd|Kbhdadj|PA|7242756721 +Kcpgahd|Kkhdadj|PA|5702253704 +Ncjgahd|Pphdadj|PA|5706376769 +Cdvgahd|Lchdadj|PA|7242856721 +Kdtgahd|Knhdadj|PA|5702657766 +Nckgahd|Pihdadj|PA|5707387779 +Cdygahd|Lfhdadj|PA|7242316722 +Kdxgahd|Lehdadj|PA|5702306166 +Ncrgahd|Qbhdadj|PA|5702455484 +Dadgahd|Myhdadj|PA|7240306722 +Kdygahd|Lfhdadj|PA|5702316266 +Ndtgahd|Qnhdadj|PA|5702657686 +Dbegahd|Mxhdadj|PA|7241316722 +Lbfgahd|Lwhdadj|PA|5702322766 +Ndugahd|Qbhdadj|PA|5702758787 +Dbfgahd|Mwhdadj|PA|7242348422 +Lbigahd|Lshdadj|PA|5705355729 +Ndvgahd|Qchdadj|PA|5702859888 +Dcjgahd|Nphdadj|PA|4570376722 +Lckgahd|Mihdadj|PA|5707387729 +Ndygahd|Rfhdadj|PA|5701316219 +Dcmgahd|Nxhdadj|PA|7249350732 +Lcmgahd|Mxhdadj|PA|5709359729 +Ndzgahd|Rghdadj|PA|5702326329 +Dcngahd|Nghdadj|PA|7242051732 +Lcqgahd|Mmhdadj|PA|5702354329 +Obggahd|Ruhdadj|PA|5703356776 +Dcpgahd|Nkhdadj|PA|7242253732 +Ldxgahd|Nehdadj|PA|5702306109 +Obigahd|Rshdadj|PA|5705356776 +Ddxgahd|Pehdadj|PA|7242306145 +Ldzgahd|Nghdadj|PA|5702326329 +Oclgahd|Sbhdadj|PA|5708356776 +Ddygahd|Pfhdadj|PA|7242316245 +Mbegahd|Nxhdadj|PA|5701311719 +Ocmgahd|Sxhdadj|PA|5709356776 +Ddzgahd|Pghdadj|PA|7242326345 +Mbigahd|Nshdadj|PA|5705355759 +Ocogahd|Sahdadj|PA|5702156776 +Ebggahd|Ruhdadj|PA|7243333745 +Mckgahd|Nihdadj|PA|5707387779 +Ocqgahd|Smhdadj|PA|5702356776 +Ecpgahd|Tkhdadj|PA|7242253245 +Mcngahd|Oghdadj|PA|5702031080 +Odugahd|Tbhdadj|PA|5702756776 +Ecqgahd|Tmhdadj|PA|7242354345 +Mcogahd|Oahdadj|PA|5702152181 +Padgahd|Tyhdadj|PA|5700350767 +Edsgahd|Tdhdadj|PA|7242558139 +Mdtgahd|Onhdadj|PA|5702657686 +Pbfgahd|Twhdadj|PA|5702352767 +Edtgahd|Unhdadj|PA|7242657609 +Mdugahd|Obhdadj|PA|5702758787 +Pbggahd|Tuhdadj|PA|5703353767 +Edxgahd|Uehdadj|PA|7242306109 +Mdvgahd|Ochdadj|PA|5702859888 +Pcjgahd|Uphdadj|PA|5706356767 +Fbegahd|Vxhdadj|PA|7241311719 +Nbegahd|Pxhdadj|PA|5701311719 +Pckgahd|Uihdadj|PA|5707357767 +Fbggahd|Vuhdadj|PA|7243333739 +Nbigahd|Pshdadj|PA|5705355759 +Pcngahd|Ughdadj|PA|5702056067 +Fbhgahd|Vthdadj|PA|7244344749 +Nclgahd|Qbhdadj|PA|5705708789 +Pdugahd|Ubhdadj|PA|5702756700 +Fckgahd|Wihdadj|PA|7247387779 +Ncngahd|Qghdadj|PA|5702031080 +Pdxgahd|Vehdadj|PA|5702306709 +Fcogahd|Wahdadj|PA|7242152181 +Ncqgahd|Qmhdadj|PA|5702354383 +Pdygahd|Vfhdadj|PA|5702316719 +Fdsgahd|Xdhdadj|PA|7242556585 +Ndsgahd|Qdhdadj|PA|5702556585 +Rbggahd|Vuhdadj|PA|5703356700 +Fdugahd|Xbhdadj|PA|7242758787 +Ndxgahd|Rehdadj|PA|5700306109 +Rbigahd|Vshdadj|PA|5705356700 +Fdvgahd|Xchdadj|PA|7242859888 +Obhgahd|Rthdadj|PA|5704356776 +Rcjgahd|Vphdadj|PA|5706356700 +Fdwgahd|Xdhdadj|PA|7242956989 +Ocpgahd|Skhdadj|PA|5702256776 +Sbfgahd|Xwhdadj|PA|5702348406 +Fdxgahd|Xehdadj|PA|7240306109 +Ocrgahd|Sbhdadj|PA|5702456776 +Sbggahd|Xuhdadj|PA|5703336706 +Gbfgahd|Ywhdadj|PA|7242322729 +Odsgahd|Sdhdadj|PA|5702556776 +Sbigahd|Xshdadj|PA|5705356740 +Gbhgahd|Ythdadj|PA|7244344749 +Odvgahd|Tchdadj|PA|5702856776 +Scngahd|Xghdadj|PA|5702051740 +Gclgahd|Zbhdadj|PA|7248138789 +Odxgahd|Tehdadj|PA|5702306767 +Scpgahd|Ykhdadj|PA|5702253740 +Gcqgahd|Zmhdadj|PA|7242354383 +Odygahd|Tfhdadj|PA|5702316767 +Scqgahd|Ymhdadj|PA|5702354740 +Gcrgahd|Zbhdadj|PA|7242455484 +Odzgahd|Tghdadj|PA|5702348467 +Sdzgahd|Yghdadj|PA|5702326333 +Gdvgahd|Achdadj|PA|7242859888 +Pbegahd|Txhdadj|PA|5701351767 +Ubggahd|Zuhdadj|PA|5703333733 +Gdygahd|Afhdadj|PA|7241316219 +Pbigahd|Tshdadj|PA|5705355767 +Ubhgahd|Zthdadj|PA|5704344733 +Hbegahd|Bxhdadj|PA|5701356799 +Pclgahd|Ubhdadj|PA|5708358767 +Uckgahd|Zihdadj|PA|5707385703 +Hbfgahd|Bwhdadj|PA|5702356799 +Pcmgahd|Uxhdadj|PA|5709359767 +Ucngahd|Aghdadj|PA|5702031033 +Hdugahd|Cbhdadj|PA|5702756767 +Pcpgahd|Ukhdadj|PA|5702256484 +Ucogahd|Aahdadj|PA|5702152133 +Iadgahd|Dyhdadj|PA|5700350767 +Pdsgahd|Udhdadj|PA|5702555700 +Ucrgahd|Abhdadj|PA|5702455433 +Ibhgahd|Dthdadj|PA|5704354778 +Pdwgahd|Udhdadj|PA|5702956900 +Udsgahd|Adhdadj|PA|5702556533 +Icjgahd|Dphdadj|PA|5706356778 +Pdzgahd|Vghdadj|PA|5702348429 +Udwgahd|Adhdadj|PA|5702956933 +Iclgahd|Ebhdadj|PA|5708358778 +Radgahd|Vyhdadj|PA|5700356700 +Udzgahd|Bghdadj|PA|5702326329 +Icmgahd|Exhdadj|PA|5709359778 +Rbhgahd|Vthdadj|PA|5704356700 +Vbfgahd|Bwhdadj|PA|5702322729 +Idygahd|Gfhdadj|PA|5702316719 +Rcngahd|Wghdadj|PA|5702056700 +Vcjgahd|Bphdadj|PA|5706376769 +Idzgahd|Gghdadj|PA|5702348429 +Rcpgahd|Wkhdadj|PA|5702256706 +Vcmgahd|Cxhdadj|PA|5709359799 +Jbggahd|Guhdadj|PA|5703356701 +Rcrgahd|Wbhdadj|PA|5702456706 +Vcpgahd|Ckhdadj|PA|5702253282 +Jbhgahd|Gthdadj|PA|5704356701 +Rdugahd|Wbhdadj|PA|5702756706 +Vdxgahd|Cehdadj|PA|5700306109 +Jcjgahd|Gphdadj|PA|5706356701 +Rdvgahd|Wchdadj|PA|5702856706 +Vdygahd|Cfhdadj|PA|5701316219 +Jcmgahd|Hxhdadj|PA|5709356701 +Rdxgahd|Wehdadj|PA|5702306706 +Vdzgahd|Cghdadj|PA|5702326329 +Jcngahd|Hghdadj|PA|5702056755 +Rdygahd|Wfhdadj|PA|5702316706 +Wadgahd|Dyhdadj|PA|5700300709 +Jdtgahd|Inhdadj|PA|5702656755 +Rdzgahd|Wghdadj|PA|5702348406 +Wbggahd|Duhdadj|PA|5703333739 +Jdvgahd|Ichdadj|PA|5702856755 +Sadgahd|Xyhdadj|PA|5700306706 +Wcjgahd|Dphdadj|PA|5706376769 +Jdwgahd|Idhdadj|PA|5702956755 +Sbegahd|Xxhdadj|PA|5701316706 +Wcmgahd|Dxhdadj|PA|5709359799 +Kckgahd|Jihdadj|PA|5707386704 +Sbhgahd|Xthdadj|PA|5704346706 +Wdvgahd|Echdadj|PA|5702859888 +Kcngahd|Jghdadj|PA|5702051704 +Sckgahd|Xihdadj|PA|5707386740 +Wdygahd|Efhdadj|PA|5701316219 +Kcogahd|Kahdadj|PA|5702152704 +Sclgahd|Xbhdadj|PA|5705706740 +Xbegahd|Exhdadj|PA|5701356790 +Kdvgahd|Kchdadj|PA|5702859766 +Scogahd|Yahdadj|PA|5702152740 +Xbfgahd|Ewhdadj|PA|5702356790 +Kdwgahd|Ldhdadj|PA|5702956066 +Sdsgahd|Ydhdadj|PA|5702556740 +Xbggahd|Euhdadj|PA|5703356790 +Ladgahd|Lyhdadj|PA|5700300766 +Sdvgahd|Ychdadj|PA|5702859740 +Xbhgahd|Ethdadj|PA|5704356790 +Lbggahd|Luhdadj|PA|5703333729 +Sdwgahd|Ydhdadj|PA|5702956040 +Xcjgahd|Ephdadj|PA|5706356790 +Lbhgahd|Lthdadj|PA|5704344729 +Sdxgahd|Yehdadj|PA|5702306140 +Xcngahd|Fghdadj|PA|5702056790 +Lcjgahd|Lphdadj|PA|5706376729 +Ubfgahd|Zwhdadj|PA|5702322733 +Xdsgahd|Fdhdadj|PA|5702556779 +Lclgahd|Mbhdadj|PA|5708137179 +Ucjgahd|Zphdadj|PA|5706376733 +Xdugahd|Fbhdadj|PA|5702756779 +Lcngahd|Mghdadj|PA|5702057029 +Ucpgahd|Akhdadj|PA|5702253233 +Xdygahd|Ffhdadj|PA|5702316779 +Lcogahd|Mahdadj|PA|5702154849 +Udvgahd|Achdadj|PA|5702859833 +Yadgahd|Gyhdadj|PA|5700350779 +Lcpgahd|Mkhdadj|PA|5702253229 +Udygahd|Bfhdadj|PA|5702316219 +Ybegahd|Gxhdadj|PA|5701351779 +Lcrgahd|Mbhdadj|PA|5702455429 +Vadgahd|Byhdadj|PA|5700300709 +Ybfgahd|Gwhdadj|PA|5702352779 +Ldtgahd|Mnhdadj|PA|5702657629 +Vbegahd|Bxhdadj|PA|5701311719 +Ybhgahd|Gthdadj|PA|5704354779 +Ldugahd|Mbhdadj|PA|5702757179 +Vbhgahd|Bthdadj|PA|5704344749 +Ycjgahd|Gphdadj|PA|5706356779 +Madgahd|Nyhdadj|PA|5700300709 +Vbigahd|Bshdadj|PA|5705355759 +Yclgahd|Gbhdadj|PA|5708358744 +Mbggahd|Nuhdadj|PA|5703333739 +Vckgahd|Bihdadj|PA|5707387779 +Ycpgahd|Gkhdadj|PA|5702256244 +Mbhgahd|Nthdadj|PA|5704344749 +Vclgahd|Bbhdadj|PA|5705708789 +Ydtgahd|Hnhdadj|PA|5702656644 +Mcjgahd|Nphdadj|PA|5706376769 +Vcqgahd|Cmhdadj|PA|5702354383 +Ydwgahd|Hdhdadj|PA|5702956944 +Mcpgahd|Okhdadj|PA|5702253282 +Vdugahd|Cbhdadj|PA|5702758787 +Ydxgahd|Hehdadj|PA|5702306709 +Mdsgahd|Odhdadj|PA|5702556585 +Vdvgahd|Cchdadj|PA|5702859888 +Ydygahd|Hfhdadj|PA|5702316719 +Mdwgahd|Pdhdadj|PA|5702956989 +Vdwgahd|Cdhdadj|PA|5702956989 +Ydzgahd|Hghdadj|PA|5702348429 +Mdygahd|Pfhdadj|PA|5701316219 +Wbfgahd|Dwhdadj|PA|5702322729 +Zadgahd|Hyhdadj|PA|5700356744 +Mdzgahd|Pghdadj|PA|5702326329 +Wbhgahd|Dthdadj|PA|5704344749 +Zbfgahd|Hwhdadj|PA|5702356744 +Nadgahd|Pyhdadj|PA|5700300709 +Wcogahd|Dahdadj|PA|5702152181 +Zbhgahd|Hthdadj|PA|5704356766 +Nbfgahd|Pwhdadj|PA|5702322729 +Wcpgahd|Dkhdadj|PA|5702253282 +Zcjgahd|Iphdadj|PA|5706356766 +Nbggahd|Puhdadj|PA|5703333739 +Wcqgahd|Emhdadj|PA|5702354383 +Zcmgahd|Ixhdadj|PA|5709356766 +Nbhgahd|Pthdadj|PA|5704344749 +Wdugahd|Ebhdadj|PA|5702758787 +Zdvgahd|Jchdadj|PA|5702856751 +Ncmgahd|Qxhdadj|PA|5709359799 +Wdxgahd|Eehdadj|PA|5700306109 +Kedgahd|Jyhdadj|PA|5700306751 +Ncogahd|Qahdadj|PA|5702152181 +Xbigahd|Eshdadj|PA|5705356790 +Keegahd|Jxhdadj|PA|5701316751 +Ncpgahd|Qkhdadj|PA|5702253282 +Xckgahd|Eihdadj|PA|5707356790 +Kehgahd|Jthdadj|PA|5704346751 +Ndwgahd|Qdhdadj|PA|5702956989 +Xcmgahd|Fxhdadj|PA|5709356790 +Kelgahd|Jbhdadj|PA|5705706751 +Oadgahd|Ryhdadj|PA|8140356776 +Xcpgahd|Fkhdadj|PA|5702256779 +Keqgahd|Kmhdadj|PA|5702354762 +Obegahd|Rxhdadj|PA|8141356776 +Xdvgahd|Fchdadj|PA|5702856779 +Ketgahd|Knhdadj|PA|5702657762 +Obfgahd|Rwhdadj|PA|8142356776 +Xdwgahd|Fdhdadj|PA|5702956779 +Kezgahd|Kghdadj|PA|5702326362 +Ocjgahd|Sphdadj|PA|8146356776 +Xdxgahd|Fehdadj|PA|5702306779 +Liggahd|Luhdadj|PA|5703333762 +Ockgahd|Sihdadj|PA|8147056776 +Ybigahd|Gshdadj|PA|5705355779 +Likgahd|Lihdadj|PA|5707387762 +Ocngahd|Sghdadj|PA|8142056776 +Yckgahd|Gihdadj|PA|5707357779 +Lilgahd|Lbhdadj|PA|5705708762 +Odtgahd|Snhdadj|PA|8142656776 +Ycogahd|Gahdadj|PA|5702156144 +Lipgahd|Lkhdadj|PA|5702253288 +Odwgahd|Tdhdadj|PA|8142956776 +Ycqgahd|Gmhdadj|PA|5702356344 +Liygahd|Mfhdadj|PA|5702316219 +Pbhgahd|Tthdadj|PA|8144354767 +Ydsgahd|Hdhdadj|PA|5702556544 +Moegahd|Mxhdadj|PA|5701311719 +Pcogahd|Uahdadj|PA|8142156167 +Ydvgahd|Hchdadj|PA|5702856844 +Moggahd|Muhdadj|PA|5703333739 +Pcqgahd|Umhdadj|PA|8142356367 +Zbegahd|Hxhdadj|PA|5701356744 +Mohgahd|Mthdadj|PA|5704344749 +Pcrgahd|Ubhdadj|PA|8142455707 +Zcogahd|Iahdadj|PA|5702156766 +Momgahd|Nxhdadj|PA|5709359799 +Pdtgahd|Unhdadj|PA|8142656600 +Zcpgahd|Ikhdadj|PA|5702256766 +Moqgahd|Nmhdadj|PA|5702354383 +Pdvgahd|Uchdadj|PA|8142856800 +Zdwgahd|Jdhdadj|PA|5702956751 +Motgahd|Nnhdadj|PA|5702657686 +Rbegahd|Vxhdadj|PA|8141356700 +Zdygahd|Jfhdadj|PA|5702316751 +Movgahd|Nchdadj|PA|5702859888 +Rbfgahd|Vwhdadj|PA|8142356700 +Kefgahd|Jwhdadj|PA|5702348451 +Mozgahd|Oghdadj|PA|5702326329 +Rckgahd|Vihdadj|PA|8147056700 +Keigahd|Jshdadj|PA|5705356751 +Nufgahd|Owhdadj|PA|5702322729 +Rclgahd|Wbhdadj|PA|8148356700 +Kemgahd|Kxhdadj|PA|5709350751 +Nuggahd|Ouhdadj|PA|5703333739 +Rcmgahd|Wxhdadj|PA|8149356700 +Kengahd|Kghdadj|PA|5702051751 +Nuhgahd|Othdadj|PA|5704344749 +Rcogahd|Wahdadj|PA|8142156700 +Kepgahd|Kkhdadj|PA|5702253751 +Nukgahd|Oihdadj|PA|5707387779 +Rcqgahd|Wmhdadj|PA|8142356706 +Kesgahd|Kdhdadj|PA|5702556762 +Nulgahd|Pbhdadj|PA|5705708789 +Rdsgahd|Wdhdadj|PA|8142556706 +Kewgahd|Kdhdadj|PA|5702956062 +Nuxgahd|Qehdadj|PA|5700306109 +Rdtgahd|Wnhdadj|PA|8142656706 +Kexgahd|Kehdadj|PA|5702306162 +Nuygahd|Qfhdadj|PA|5701316219 +Rdwgahd|Wdhdadj|PA|8142956706 +Lidgahd|Lyhdadj|PA|5700300762 +Badgahd|Eyhdadj|TX|8170350711 +Scjgahd|Xphdadj|PA|8146376740 +Liegahd|Lxhdadj|PA|5701311762 +Bbfgahd|Ewhdadj|TX|8172352711 +Scmgahd|Xxhdadj|PA|8149350740 +Liigahd|Lshdadj|PA|5705355762 +Bcjgahd|Fphdadj|TX|8176356711 +Scrgahd|Ybhdadj|PA|8142455740 +Lijgahd|Lphdadj|PA|5706376762 +Bclgahd|Fbhdadj|TX|8178358700 +Sdtgahd|Ynhdadj|PA|8142657740 +Liqgahd|Lmhdadj|PA|5702354388 +Bcogahd|Fahdadj|TX|8172156100 +Sdugahd|Ybhdadj|PA|8142758740 +Lirgahd|Mbhdadj|PA|5702455488 +Bcqgahd|Gmhdadj|TX|8172356300 +Sdygahd|Yfhdadj|PA|8142316233 +Litgahd|Mnhdadj|PA|5702657688 +Bcrgahd|Gbhdadj|TX|8172456400 +Uadgahd|Zyhdadj|PA|8140300733 +Liugahd|Mbhdadj|PA|5702758788 +Bdvgahd|Gchdadj|TX|8172856800 +Ubegahd|Zxhdadj|PA|8141311733 +Lizgahd|Mghdadj|PA|5702326329 +Cadgahd|Iyhdadj|TX|8170356712 +Ubigahd|Zshdadj|PA|8145355733 +Modgahd|Myhdadj|PA|5700300709 +Cbegahd|Ixhdadj|TX|8172656712 +Uclgahd|Zbhdadj|PA|8148148733 +Mongahd|Nghdadj|PA|5702031080 +Cbhgahd|Ithdadj|TX|8174356712 +Ucmgahd|Axhdadj|PA|8149359733 +Mopgahd|Nkhdadj|PA|5702253282 +Ccmgahd|Jxhdadj|TX|8179356721 +Ucqgahd|Amhdadj|PA|8142354333 +Mosgahd|Ndhdadj|PA|5702556585 +Ccogahd|Jahdadj|TX|8172156721 +Udtgahd|Anhdadj|PA|8142657633 +Mowgahd|Ndhdadj|PA|5702956989 +Ccpgahd|Kkhdadj|TX|8172256721 +Udugahd|Abhdadj|PA|8142758733 +Nudgahd|Oyhdadj|PA|5700300709 +Ccqgahd|Kmhdadj|TX|8172356721 +Udxgahd|Aehdadj|PA|8142306109 +Nujgahd|Ophdadj|PA|5706376769 +Cdwgahd|Ldhdadj|TX|8172956721 +Vbggahd|Buhdadj|PA|8143333739 +Numgahd|Pxhdadj|PA|5709359799 +Cdzgahd|Lghdadj|TX|8172326722 +Vcngahd|Cghdadj|PA|8142051080 +Nungahd|Pghdadj|PA|5702031080 +Dbggahd|Muhdadj|TX|8173336722 +Vcogahd|Cahdadj|PA|8142152181 +Nuogahd|Pahdadj|PA|5702152181 +Dckgahd|Nihdadj|TX|8177386722 +Vcrgahd|Cbhdadj|PA|8142455484 +Nuqgahd|Pmhdadj|PA|5702354383 +Dcogahd|Nahdadj|TX|8172152732 +Vdsgahd|Cdhdadj|PA|8142556585 +Nurgahd|Pbhdadj|PA|5702455484 +Dcrgahd|Obhdadj|TX|8172455732 +Vdtgahd|Cnhdadj|PA|8142657686 +Nutgahd|Pnhdadj|PA|5702657686 +Ddsgahd|Odhdadj|TX|8172556732 +Wbegahd|Dxhdadj|PA|8141311719 +Nuugahd|Pbhdadj|PA|5702758787 +Ddtgahd|Onhdadj|TX|8172657732 +Wbigahd|Dshdadj|PA|8145355759 +Nuzgahd|Qghdadj|PA|5702326329 +Ddugahd|Obhdadj|TX|8172758732 +Wckgahd|Dihdadj|PA|8147087779 +Aadgahd|Ayhdadj|TX|8170356710 +Eadgahd|Ryhdadj|TX|8170300745 +Wclgahd|Dbhdadj|PA|8148148789 +Abhgahd|Athdadj|TX|8174356710 +Ebegahd|Rxhdadj|TX|8172611745 +Wcngahd|Dghdadj|PA|8142051080 +Ackgahd|Bihdadj|TX|8177356710 +Ebfgahd|Rwhdadj|TX|8172322745 +Wcrgahd|Ebhdadj|PA|8142455484 +Aclgahd|Bbhdadj|TX|8178356710 +Ebhgahd|Rthdadj|TX|8174344745 +Wdsgahd|Edhdadj|PA|8142556585 +Acmgahd|Bxhdadj|TX|8179356701 +Eckgahd|Sihdadj|TX|8177387745 +Wdtgahd|Enhdadj|PA|8142657686 +Acpgahd|Bkhdadj|TX|8172256701 +Ecmgahd|Sxhdadj|TX|8179359745 +Wdwgahd|Edhdadj|PA|8142956989 +Adtgahd|Cnhdadj|TX|8172656701 +Ecogahd|Tahdadj|TX|8172152145 +Wdzgahd|Eghdadj|PA|8142326329 +Advgahd|Dchdadj|TX|8172856701 +Ecrgahd|Tbhdadj|TX|8172455445 +Xadgahd|Eyhdadj|PA|8780356790 +Adxgahd|Dehdadj|TX|8172306711 +Edugahd|Ubhdadj|TX|8172758709 +Xclgahd|Fbhdadj|PA|8788356790 +Adygahd|Dfhdadj|TX|8172316711 +Edvgahd|Uchdadj|TX|8172859809 +Xcogahd|Fahdadj|PA|8782156790 +Bbegahd|Axhdadj|TX|8172651711 +Edzgahd|Vghdadj|TX|8172326329 +Xcqgahd|Fmhdadj|PA|8782356779 +Bckgahd|Fihdadj|TX|8177357700 +Fadgahd|Vyhdadj|TX|8170300709 +Xcrgahd|Fbhdadj|PA|8782456779 +Bcmgahd|Fxhdadj|TX|8179359700 +Fbigahd|Wshdadj|TX|8175355759 +Xdtgahd|Fnhdadj|PA|8782656779 +Bcpgahd|Gkhdadj|TX|8172256200 +Fcjgahd|Wphdadj|TX|8176376769 +Xdzgahd|Fghdadj|PA|8782348479 +Bdsgahd|Gdhdadj|TX|8172559360 +Fclgahd|Wbhdadj|TX|8179368789 +Ybggahd|Guhdadj|PA|8783353779 +Bdugahd|Gbhdadj|TX|8172756700 +Fcngahd|Wghdadj|TX|8172051280 +Ycmgahd|Gxhdadj|PA|8789359744 +Bdwgahd|Hdhdadj|TX|8172956900 +Fcpgahd|Wkhdadj|TX|8172253282 +Ycngahd|Gghdadj|PA|8782056044 +Bdzgahd|Hghdadj|TX|8172326729 +Fdtgahd|Xnhdadj|TX|8172657686 +Ycrgahd|Gbhdadj|PA|8782456444 +Cbigahd|Ishdadj|TX|8175356712 +Fdygahd|Yfhdadj|TX|8172616219 +Ydugahd|Hbhdadj|PA|8782756744 +Ccjgahd|Jphdadj|TX|8176356712 +Gbigahd|Zshdadj|TX|8175355759 +Zbggahd|Huhdadj|PA|8783356766 +Cckgahd|Jihdadj|TX|8177356712 +Gckgahd|Zihdadj|TX|8177387779 +Zbigahd|Ishdadj|PA|8785356766 +Cclgahd|Jbhdadj|TX|8178356721 +Gcmgahd|Zxhdadj|TX|8179359799 +Zckgahd|Iihdadj|PA|8787356766 +Ccrgahd|Kbhdadj|TX|8172456721 +Gcogahd|Zahdadj|TX|8172152181 +Zclgahd|Ibhdadj|PA|8788356766 +Cdsgahd|Kdhdadj|TX|8172556721 +Gcpgahd|Zkhdadj|TX|8172253282 +Zcngahd|Ighdadj|PA|8782056766 +Cdxgahd|Lehdadj|TX|8172306721 +Gdtgahd|Anhdadj|TX|8172657686 +Zcqgahd|Imhdadj|PA|8782356766 +Dbhgahd|Mthdadj|TX|8174346722 +Gdugahd|Abhdadj|TX|8172758787 +Zcrgahd|Ibhdadj|PA|8782456766 +Dbigahd|Nshdadj|TX|8175356722 +Gdwgahd|Adhdadj|TX|8172956989 +Zdsgahd|Idhdadj|PA|8782556766 +Dclgahd|Nbhdadj|TX|8179366732 +Gdxgahd|Aehdadj|TX|8170306109 +Zdtgahd|Inhdadj|PA|8782656766 +Dcqgahd|Omhdadj|TX|8172354732 +Hadgahd|Byhdadj|TX|6820356799 +Zdugahd|Ibhdadj|PA|8782756766 +Ddvgahd|Ochdadj|TX|8172859732 +Hbigahd|Bshdadj|TX|6825356799 +Zdxgahd|Jehdadj|PA|8782306751 +Ddwgahd|Odhdadj|TX|8172956045 +Hcjgahd|Bphdadj|TX|6826356799 +Zdzgahd|Jghdadj|PA|8782348451 +Ebigahd|Sshdadj|TX|8175355745 +Hckgahd|Bihdadj|TX|6827356799 +Keggahd|Juhdadj|PA|8783336751 +Ecjgahd|Sphdadj|TX|8176376745 +Hclgahd|Bbhdadj|TX|6828356799 +Kejgahd|Jphdadj|PA|8786376751 +Eclgahd|Sbhdadj|TX|8179368745 +Hcngahd|Bghdadj|TX|6822056799 +Kekgahd|Jihdadj|PA|8787386751 +Ecngahd|Sghdadj|TX|8172051245 +Hcpgahd|Ckhdadj|TX|6822256767 +Keogahd|Kahdadj|PA|8782152751 +Edwgahd|Udhdadj|TX|8172956909 +Hdsgahd|Cdhdadj|TX|6822556767 +Kergahd|Kbhdadj|PA|8782455762 +Edygahd|Vfhdadj|TX|8172316219 +Hdtgahd|Cnhdadj|TX|6822656767 +Keugahd|Kbhdadj|PA|8782758762 +Fbfgahd|Vwhdadj|TX|8172322729 +Hdzgahd|Dghdadj|TX|6822326767 +Kevgahd|Kchdadj|PA|8782859762 +Fcmgahd|Wxhdadj|TX|8179359799 +Ibegahd|Dxhdadj|TX|6821351778 +Keygahd|Kfhdadj|PA|8782316262 +Fcqgahd|Xmhdadj|TX|8172354383 +Ibfgahd|Dwhdadj|TX|6822352778 +Lifgahd|Lwhdadj|PA|8782322762 +Fcrgahd|Xbhdadj|TX|8172455484 +Ibigahd|Dshdadj|TX|6825355778 +Lihgahd|Lthdadj|PA|8784344762 +Fdzgahd|Yghdadj|TX|8172326329 +Icngahd|Eghdadj|TX|6822056078 +Limgahd|Lxhdadj|PA|8789359762 +Gadgahd|Yyhdadj|TX|8170300709 +Icpgahd|Ekhdadj|TX|6822256278 +Lingahd|Lghdadj|PA|8782087888 +Gbegahd|Yxhdadj|TX|8172611719 +Icqgahd|Emhdadj|TX|6822356356 +Liogahd|Lahdadj|PA|8782152188 +Gbggahd|Yuhdadj|TX|8173333739 +Idugahd|Fbhdadj|TX|6822756756 +Lisgahd|Mdhdadj|PA|8782556588 +Gcjgahd|Zphdadj|TX|8176376769 +Jadgahd|Gyhdadj|TX|6820356701 +Livgahd|Mchdadj|PA|8782859888 +Gcngahd|Zghdadj|TX|8172051280 +Jbegahd|Gxhdadj|TX|6821356701 +Liwgahd|Mdhdadj|PA|8782956988 +Gdsgahd|Adhdadj|TX|8172556585 +Jbfgahd|Gwhdadj|TX|6822356701 +Lixgahd|Mehdadj|PA|8782306109 +Gdzgahd|Aghdadj|TX|8172326329 +Jbigahd|Gshdadj|TX|6825356701 +Mofgahd|Mwhdadj|PA|8782322729 +Hbggahd|Buhdadj|TX|6823356799 +Jckgahd|Hihdadj|TX|6827356701 +Moigahd|Mshdadj|PA|8785355759 +Hbhgahd|Bthdadj|TX|6824356799 +Jclgahd|Hbhdadj|TX|6828356701 +Mojgahd|Nphdadj|PA|8786376769 +Hcmgahd|Bxhdadj|TX|6829356799 +Jcrgahd|Hbhdadj|TX|6822456755 +Mokgahd|Nihdadj|PA|8787387779 +Hcogahd|Bahdadj|TX|6822156799 +Jdsgahd|Hdhdadj|TX|6822556755 +Molgahd|Nbhdadj|PA|8788138789 +Hcqgahd|Cmhdadj|TX|6822356767 +Jdzgahd|Ighdadj|TX|6822326755 +Moogahd|Nahdadj|PA|8782152181 +Hcrgahd|Cbhdadj|TX|6822456767 +Kadgahd|Iyhdadj|TX|6820306704 +Morgahd|Nbhdadj|PA|8782455484 +Hdvgahd|Cchdadj|TX|6822856767 +Kbegahd|Ixhdadj|TX|6821316704 +Mougahd|Nbhdadj|PA|8782758787 +Hdwgahd|Cdhdadj|TX|6822956767 +Kbfgahd|Jwhdadj|TX|6822326704 +Moxgahd|Nehdadj|PA|8780306109 +Hdxgahd|Cehdadj|TX|6822306767 +Kbigahd|Jshdadj|TX|6825356704 +Moygahd|Ofhdadj|PA|8781316219 +Hdygahd|Dfhdadj|TX|6822316767 +Kcjgahd|Jphdadj|TX|6826376704 +Nuegahd|Oxhdadj|PA|8781311719 +Ibggahd|Duhdadj|TX|6823353778 +Kclgahd|Jbhdadj|TX|6829366704 +Nuigahd|Oshdadj|PA|8785355759 +Ickgahd|Eihdadj|TX|6827357778 +Kcqgahd|Kmhdadj|TX|6822354766 +Nupgahd|Pkhdadj|PA|8782253282 +Icogahd|Eahdadj|TX|6822156178 +Kcrgahd|Kbhdadj|TX|6822455766 +Nusgahd|Pdhdadj|PA|8782556585 +Icrgahd|Fbhdadj|TX|6822456456 +Kdsgahd|Kdhdadj|TX|6822556766 +Nuvgahd|Pchdadj|PA|8782859888 +Idsgahd|Fdhdadj|TX|6822556556 +Kdugahd|Kbhdadj|TX|6822758766 +Nuwgahd|Pdhdadj|PA|8782956989 +Idtgahd|Fnhdadj|TX|6822656656 +Kdzgahd|Lghdadj|TX|6822326366 +Abegahd|Axhdadj|PA|7171356710 +Idvgahd|Fchdadj|TX|6822856856 +Lbegahd|Lxhdadj|TX|6821311766 +Abfgahd|Awhdadj|PA|7172356710 +Idwgahd|Fdhdadj|TX|6822956956 +Ldsgahd|Mdhdadj|TX|6822556529 +Abggahd|Auhdadj|PA|7173356710 +Idxgahd|Fehdadj|TX|6822306709 +Ldvgahd|Nchdadj|TX|6822859829 +Abigahd|Ashdadj|PA|7175356710 +Jcogahd|Hahdadj|TX|6822156755 +Ldwgahd|Ndhdadj|TX|6822956929 +Acjgahd|Bphdadj|PA|7176356710 +Jcpgahd|Hkhdadj|TX|6822256755 +Ldygahd|Nfhdadj|TX|6822316219 +Acngahd|Bghdadj|PA|7172056701 +Jcqgahd|Hmhdadj|TX|6822356755 +Mbfgahd|Nwhdadj|TX|6822322729 +Acogahd|Bahdadj|PA|7172156701 +Jdugahd|Ibhdadj|TX|6822756755 +Mclgahd|Obhdadj|TX|6829368789 +Acqgahd|Cmhdadj|PA|7172356701 +Jdxgahd|Iehdadj|TX|6822306755 +Mcmgahd|Oxhdadj|TX|6829359799 +Acrgahd|Cbhdadj|PA|7172456701 +Jdygahd|Ifhdadj|TX|6822316755 +Mcqgahd|Omhdadj|TX|6822354383 +Adsgahd|Cdhdadj|PA|7172556701 +Kbggahd|Juhdadj|TX|6823336704 +Mcrgahd|Obhdadj|TX|6822455484 +Adugahd|Cbhdadj|PA|7172756701 +Kbhgahd|Jthdadj|TX|6824346704 +Mdxgahd|Pehdadj|TX|6820306109 +Adwgahd|Ddhdadj|PA|7172956711 +Kcmgahd|Jxhdadj|TX|6829350704 +Ncjgahd|Pphdadj|TX|6826376769 +Adzgahd|Dghdadj|PA|7172348411 +Kcpgahd|Kkhdadj|TX|6822253704 +Nckgahd|Pihdadj|TX|6827387779 +Bbggahd|Euhdadj|PA|7173353711 +Kdtgahd|Knhdadj|TX|6822657766 +Ncrgahd|Qbhdadj|TX|6822455484 +Bbhgahd|Ethdadj|PA|7174354711 +Kdxgahd|Lehdadj|TX|6822306166 +Ndtgahd|Qnhdadj|TX|6822657686 +Bbigahd|Eshdadj|PA|7175355711 +Kdygahd|Lfhdadj|TX|6822319366 +Ndugahd|Qbhdadj|TX|6822758787 +Bcngahd|Fghdadj|PA|7172056000 +Lbfgahd|Lwhdadj|TX|6822322766 +Ndvgahd|Qchdadj|TX|6822859888 +Bdtgahd|Gnhdadj|PA|7172656600 +Lbigahd|Lshdadj|TX|6825355729 +Ndygahd|Rfhdadj|TX|6821316219 +Bdxgahd|Hehdadj|PA|7172306709 +Lckgahd|Mihdadj|TX|6827387729 +Ndzgahd|Rghdadj|TX|6822326329 +Bdygahd|Hfhdadj|PA|7172316719 +Lcmgahd|Mxhdadj|TX|6829359729 +Obggahd|Ruhdadj|TX|9363356776 +Cbfgahd|Iwhdadj|PA|7172356215 +Lcqgahd|Mmhdadj|TX|6822354329 +Obigahd|Rshdadj|TX|9365356776 +Cbggahd|Iuhdadj|PA|7173356215 +Ldxgahd|Nehdadj|TX|6822306109 +Oclgahd|Sbhdadj|TX|9368356776 +Ccngahd|Jghdadj|PA|7172056721 +Ldzgahd|Nghdadj|TX|6822326329 +Ocmgahd|Sxhdadj|TX|9369356776 +Cdtgahd|Knhdadj|PA|7172656721 +Mbegahd|Nxhdadj|TX|6821311719 +Ocogahd|Sahdadj|TX|9362156776 +Cdugahd|Kbhdadj|PA|7172756721 +Mbigahd|Nshdadj|TX|6825355759 +Ocqgahd|Smhdadj|TX|9362356776 +Cdvgahd|Lchdadj|PA|7172856721 +Mckgahd|Nihdadj|TX|6827387779 +Odugahd|Tbhdadj|TX|9362756776 +Cdygahd|Lfhdadj|PA|7172316722 +Mcngahd|Oghdadj|TX|6822051280 +Padgahd|Tyhdadj|TX|9360350767 +Dadgahd|Myhdadj|PA|7170306722 +Mcogahd|Oahdadj|TX|6822152181 +Pbfgahd|Twhdadj|TX|9362352767 +Dbegahd|Mxhdadj|PA|7171316722 +Mdtgahd|Onhdadj|TX|6822657686 +Pbggahd|Tuhdadj|TX|9363353767 +Dbfgahd|Mwhdadj|PA|7172348422 +Mdugahd|Obhdadj|TX|6822758787 +Pcjgahd|Uphdadj|TX|9366356767 +Dcjgahd|Nphdadj|PA|7176376722 +Mdvgahd|Ochdadj|TX|6822859888 +Pckgahd|Uihdadj|TX|9367357767 +Dcmgahd|Nxhdadj|PA|7179350732 +Nbegahd|Pxhdadj|TX|6821311719 +Pcngahd|Ughdadj|TX|9362056067 +Dcngahd|Nghdadj|PA|7172051732 +Nbigahd|Pshdadj|TX|6825355759 +Pdugahd|Ubhdadj|TX|9362756700 +Dcpgahd|Nkhdadj|PA|7172253732 +Nclgahd|Qbhdadj|TX|6829368789 +Pdxgahd|Vehdadj|TX|9362306709 +Ddxgahd|Pehdadj|PA|7172306145 +Ncngahd|Qghdadj|TX|6822051280 +Pdygahd|Vfhdadj|TX|9362316719 +Ddygahd|Pfhdadj|PA|7172316245 +Ncqgahd|Qmhdadj|TX|6822354383 +Rbggahd|Vuhdadj|TX|9363356700 +Ddzgahd|Pghdadj|PA|7172326345 +Ndsgahd|Qdhdadj|TX|6822556585 +Rbigahd|Vshdadj|TX|9365356700 +Ebggahd|Ruhdadj|PA|7173333745 +Ndxgahd|Rehdadj|TX|6820306109 +Rcjgahd|Vphdadj|TX|9366356700 +Ecpgahd|Tkhdadj|PA|7172253245 +Obhgahd|Rthdadj|TX|9364356776 +Sbfgahd|Xwhdadj|TX|9362326706 +Ecqgahd|Tmhdadj|PA|7172354345 +Ocpgahd|Skhdadj|TX|9362256776 +Sbggahd|Xuhdadj|TX|9363336706 +Edsgahd|Tdhdadj|PA|7172558139 +Ocrgahd|Sbhdadj|TX|9362456776 +Sbigahd|Xshdadj|TX|9365356740 +Edtgahd|Unhdadj|PA|7172657609 +Odsgahd|Sdhdadj|TX|9362556776 +Scngahd|Xghdadj|TX|9362051740 +Edxgahd|Uehdadj|PA|7172306109 +Odvgahd|Tchdadj|TX|9362856776 +Scpgahd|Ykhdadj|TX|9362253740 +Fbegahd|Vxhdadj|PA|7171311719 +Odxgahd|Tehdadj|TX|9362306767 +Scqgahd|Ymhdadj|TX|9362354740 +Fbggahd|Vuhdadj|PA|7173333739 +Odygahd|Tfhdadj|TX|9362316767 +Sdzgahd|Yghdadj|TX|9362326333 +Fbhgahd|Vthdadj|PA|7174344749 +Odzgahd|Tghdadj|TX|9362326767 +Ubggahd|Zuhdadj|TX|9363333733 +Fckgahd|Wihdadj|PA|7177087779 +Pbegahd|Txhdadj|TX|9361351767 +Ubhgahd|Zthdadj|TX|9364344733 +Fcogahd|Wahdadj|PA|7172152181 +Pbigahd|Tshdadj|TX|9365355767 +Uckgahd|Zihdadj|TX|9367387733 +Fdsgahd|Xdhdadj|PA|7172556585 +Pclgahd|Ubhdadj|TX|9368358767 +Ucngahd|Aghdadj|TX|9362051233 +Fdugahd|Xbhdadj|PA|7172758787 +Pcmgahd|Uxhdadj|TX|9369359767 +Ucogahd|Aahdadj|TX|9362152133 +Fdvgahd|Xchdadj|PA|7172859888 +Pcpgahd|Ukhdadj|TX|9362259367 +Ucrgahd|Abhdadj|TX|9362455433 +Fdwgahd|Xdhdadj|PA|7172956989 +Pdsgahd|Udhdadj|TX|9362559360 +Udsgahd|Adhdadj|TX|9362556533 +Fdxgahd|Xehdadj|PA|7170306109 +Pdwgahd|Udhdadj|TX|9362956900 +Udwgahd|Adhdadj|TX|9362956933 +Gbfgahd|Ywhdadj|PA|7172322729 +Pdzgahd|Vghdadj|TX|9362326729 +Udzgahd|Bghdadj|TX|9362326329 +Gbhgahd|Ythdadj|PA|7174344749 +Radgahd|Vyhdadj|TX|9360356700 +Vbfgahd|Bwhdadj|TX|9362322729 +Gclgahd|Zbhdadj|PA|7178138789 +Rbhgahd|Vthdadj|TX|9364356700 +Vcjgahd|Bphdadj|TX|9366376769 +Gcqgahd|Zmhdadj|PA|7172354383 +Rcngahd|Wghdadj|TX|9362056700 +Vcmgahd|Cxhdadj|TX|9369359799 +Gcrgahd|Zbhdadj|PA|7172455484 +Rcpgahd|Wkhdadj|TX|9362256706 +Vcpgahd|Ckhdadj|TX|9362253282 +Gdvgahd|Achdadj|PA|7172859888 +Rcrgahd|Wbhdadj|TX|9362456706 +Vdxgahd|Cehdadj|TX|9360306109 +Gdygahd|Afhdadj|PA|7171316219 +Rdugahd|Wbhdadj|TX|9362756706 +Vdygahd|Cfhdadj|TX|9361316219 +Hbegahd|Bxhdadj|PA|5701356799 +Rdvgahd|Wchdadj|TX|9362856706 +Vdzgahd|Cghdadj|TX|9362326329 +Hbfgahd|Bwhdadj|PA|5702356799 +Rdxgahd|Wehdadj|TX|9362306706 +Wadgahd|Dyhdadj|TX|9360300709 +Hdugahd|Cbhdadj|PA|5702756767 +Rdygahd|Wfhdadj|TX|9362316706 +Wbggahd|Duhdadj|TX|9363333739 +Iadgahd|Dyhdadj|PA|5700350767 +Rdzgahd|Wghdadj|TX|9362326706 +Wcjgahd|Dphdadj|TX|9366376769 +Ibhgahd|Dthdadj|PA|5704354778 +Sadgahd|Xyhdadj|TX|9360306706 +Wcmgahd|Dxhdadj|TX|9369359799 +Icjgahd|Dphdadj|PA|5706356778 +Sbegahd|Xxhdadj|TX|9361316706 +Wdvgahd|Echdadj|TX|9362859888 +Iclgahd|Ebhdadj|PA|5708358778 +Sbhgahd|Xthdadj|TX|9364346706 +Wdygahd|Efhdadj|TX|9361316219 +Icmgahd|Exhdadj|PA|5709359778 +Sckgahd|Xihdadj|TX|9367386740 +Xbegahd|Exhdadj|TX|6821356790 +Idygahd|Gfhdadj|PA|5702316719 +Sclgahd|Xbhdadj|TX|9369366740 +Xbfgahd|Ewhdadj|TX|6822356790 +Idzgahd|Gghdadj|PA|5702348429 +Scogahd|Yahdadj|TX|9362152740 +Xbggahd|Euhdadj|TX|6823356790 +Jbggahd|Guhdadj|PA|5703356701 +Sdsgahd|Ydhdadj|TX|9362556740 +Xbhgahd|Ethdadj|TX|6824356790 +Jbhgahd|Gthdadj|PA|5704356701 +Sdvgahd|Ychdadj|TX|9362859740 +Xcjgahd|Ephdadj|TX|6826356790 +Jcjgahd|Gphdadj|PA|5706356701 +Sdwgahd|Ydhdadj|TX|9362956040 +Xcngahd|Fghdadj|TX|6822056790 +Jcmgahd|Hxhdadj|PA|5709356701 +Sdxgahd|Yehdadj|TX|9362306140 +Xdsgahd|Fdhdadj|TX|6822556779 +Jcngahd|Hghdadj|PA|5702056755 +Ubfgahd|Zwhdadj|TX|9362322733 +Xdugahd|Fbhdadj|TX|6822756779 +Jdtgahd|Inhdadj|PA|5702656755 +Ucjgahd|Zphdadj|TX|9366376733 +Xdygahd|Ffhdadj|TX|6822316779 +Jdvgahd|Ichdadj|PA|5702856755 +Ucpgahd|Akhdadj|TX|9362253233 +Yadgahd|Gyhdadj|TX|6820350779 +Jdwgahd|Idhdadj|PA|5702956755 +Udvgahd|Achdadj|TX|9362859833 +Ybegahd|Gxhdadj|TX|6821351779 +Kckgahd|Jihdadj|PA|5707386704 +Udygahd|Bfhdadj|TX|9362316219 +Ybfgahd|Gwhdadj|TX|6822352779 +Kcngahd|Jghdadj|PA|5702051704 +Vadgahd|Byhdadj|TX|9360300709 +Ybhgahd|Gthdadj|TX|6824354779 +Kcogahd|Kahdadj|PA|5702152704 +Vbegahd|Bxhdadj|TX|9361311719 +Ycjgahd|Gphdadj|TX|6826356779 +Kdvgahd|Kchdadj|PA|5702859766 +Vbhgahd|Bthdadj|TX|9364344749 +Yclgahd|Gbhdadj|TX|6828358744 +Kdwgahd|Ldhdadj|PA|5702956066 +Vbigahd|Bshdadj|TX|9365355759 +Ycpgahd|Gkhdadj|TX|6822256244 +Ladgahd|Lyhdadj|PA|5700300766 +Vckgahd|Bihdadj|TX|9367387779 +Ydtgahd|Hnhdadj|TX|6822656644 +Lbggahd|Luhdadj|PA|5703333729 +Vclgahd|Bbhdadj|TX|9369368789 +Ydwgahd|Hdhdadj|TX|6822956944 +Lbhgahd|Lthdadj|PA|5704344729 +Vcqgahd|Cmhdadj|TX|9362354383 +Ydxgahd|Hehdadj|TX|6822306709 +Lcjgahd|Lphdadj|PA|5706376729 +Vdugahd|Cbhdadj|TX|9362758787 +Ydygahd|Hfhdadj|TX|6822316719 +Lclgahd|Mbhdadj|PA|5705707179 +Vdvgahd|Cchdadj|TX|9362859888 +Ydzgahd|Hghdadj|TX|6822326729 +Lcngahd|Mghdadj|PA|5702031029 +Vdwgahd|Cdhdadj|TX|9362956989 +Zadgahd|Hyhdadj|TX|6820356744 +Lcogahd|Mahdadj|PA|5702154849 +Wbfgahd|Dwhdadj|TX|9362322729 +Zbfgahd|Hwhdadj|TX|6822356744 +Lcpgahd|Mkhdadj|PA|5702253229 +Wbhgahd|Dthdadj|TX|9364344749 +Zbhgahd|Hthdadj|TX|6824356766 +Lcrgahd|Mbhdadj|PA|5702455429 +Wcogahd|Dahdadj|TX|9362152181 +Zcjgahd|Iphdadj|TX|6826356766 +Ldtgahd|Mnhdadj|PA|5702657629 +Wcpgahd|Dkhdadj|TX|9362253282 +Zcmgahd|Ixhdadj|TX|6829356766 +Ldugahd|Mbhdadj|PA|5702757179 +Wcqgahd|Emhdadj|TX|9362354383 +Zdvgahd|Jchdadj|TX|6822856751 +Madgahd|Nyhdadj|PA|5700300709 +Wdugahd|Ebhdadj|TX|9362758787 +Kedgahd|Jyhdadj|TX|6820306751 +Mbggahd|Nuhdadj|PA|5703333739 +Wdxgahd|Eehdadj|TX|9360306109 +Keegahd|Jxhdadj|TX|6821316751 +Mbhgahd|Nthdadj|PA|5704344749 +Xbigahd|Eshdadj|TX|6825356790 +Kehgahd|Jthdadj|TX|6824346751 +Mcjgahd|Nphdadj|PA|5706376769 +Xckgahd|Eihdadj|TX|6827356790 +Kelgahd|Jbhdadj|TX|6829366751 +Mcpgahd|Okhdadj|PA|5702253282 +Xcmgahd|Fxhdadj|TX|6829356790 +Keqgahd|Kmhdadj|TX|6822354762 +Mdsgahd|Odhdadj|PA|5702556585 +Xcpgahd|Fkhdadj|TX|6822256779 +Ketgahd|Knhdadj|TX|6822657762 +Mdwgahd|Pdhdadj|PA|5702956989 +Xdvgahd|Fchdadj|TX|6822856779 +Kezgahd|Kghdadj|TX|6822326362 +Mdygahd|Pfhdadj|PA|5701316219 +Xdwgahd|Fdhdadj|TX|6822956779 +Liggahd|Luhdadj|TX|6823333762 +Mdzgahd|Pghdadj|PA|5702326329 +Xdxgahd|Fehdadj|TX|6822306779 +Likgahd|Lihdadj|TX|6827387762 +Nadgahd|Pyhdadj|PA|5700300709 +Ybigahd|Gshdadj|TX|6825355779 +Lilgahd|Lbhdadj|TX|6829368762 +Nbfgahd|Pwhdadj|PA|5702322729 +Yckgahd|Gihdadj|TX|6827357779 +Lipgahd|Lkhdadj|TX|6822253288 +Nbggahd|Puhdadj|PA|5703333739 +Ycogahd|Gahdadj|TX|6822156144 +Liygahd|Mfhdadj|TX|6822316219 +Nbhgahd|Pthdadj|PA|5704344749 +Ycqgahd|Gmhdadj|TX|6822356344 +Moegahd|Mxhdadj|TX|6821311719 +Ncmgahd|Qxhdadj|PA|5709359799 +Ydsgahd|Hdhdadj|TX|6822556544 +Moggahd|Muhdadj|TX|6823333739 +Ncogahd|Qahdadj|PA|5702152181 +Ydvgahd|Hchdadj|TX|6822856844 +Mohgahd|Mthdadj|TX|6824344749 +Ncpgahd|Qkhdadj|PA|5702253282 +Zbegahd|Hxhdadj|TX|6821356744 +Momgahd|Nxhdadj|TX|6829359799 +Ndwgahd|Qdhdadj|PA|5702956989 +Zcogahd|Iahdadj|TX|6822156766 +Moqgahd|Nmhdadj|TX|6822354383 +Oadgahd|Ryhdadj|PA|5700356776 +Zcpgahd|Ikhdadj|TX|6822256766 +Motgahd|Nnhdadj|TX|6822657686 +Obegahd|Rxhdadj|PA|5701356776 +Zdwgahd|Jdhdadj|TX|6822956751 +Movgahd|Nchdadj|TX|6822859888 +Obfgahd|Rwhdadj|PA|5702356776 +Zdygahd|Jfhdadj|TX|6822316751 +Mozgahd|Oghdadj|TX|6822326329 +Ocjgahd|Sphdadj|PA|5706356776 +Kefgahd|Jwhdadj|TX|6822326751 +Nufgahd|Owhdadj|TX|6822322729 +Ockgahd|Sihdadj|PA|5707356776 +Keigahd|Jshdadj|TX|6825356751 +Nuggahd|Ouhdadj|TX|6823333739 +Ocngahd|Sghdadj|PA|5702056776 +Kemgahd|Kxhdadj|TX|6829350751 +Nuhgahd|Othdadj|TX|6824344749 +Odtgahd|Snhdadj|PA|5702656776 +Kengahd|Kghdadj|TX|6822051751 +Nukgahd|Oihdadj|TX|6827387779 +Odwgahd|Tdhdadj|PA|5702956776 +Kepgahd|Kkhdadj|TX|6822253751 +Nulgahd|Pbhdadj|TX|6829368789 +Pbhgahd|Tthdadj|PA|5704354767 +Kesgahd|Kdhdadj|TX|6822556762 +Nuxgahd|Qehdadj|TX|6820306109 +Pcogahd|Uahdadj|PA|5702156167 +Kewgahd|Kdhdadj|TX|6822956062 +Nuygahd|Qfhdadj|TX|6821316219 +Pcqgahd|Umhdadj|PA|5702356367 +Kexgahd|Kehdadj|TX|6822306162 +Badgahd|Eyhdadj|TX|2540350711 +Pcrgahd|Ubhdadj|PA|5702455707 +Lidgahd|Lyhdadj|TX|6820300762 +Bbfgahd|Ewhdadj|TX|2542352711 +Pdtgahd|Unhdadj|PA|5702656600 +Liegahd|Lxhdadj|TX|6821311762 +Bcjgahd|Fphdadj|TX|2546356711 +Pdvgahd|Uchdadj|PA|5702856800 +Liigahd|Lshdadj|TX|6825355762 +Bclgahd|Fbhdadj|TX|2548358700 +Rbegahd|Vxhdadj|PA|5701356700 +Lijgahd|Lphdadj|TX|6826376762 +Bcogahd|Fahdadj|TX|2542156100 +Rbfgahd|Vwhdadj|PA|5702356700 +Liqgahd|Lmhdadj|TX|6822354388 +Bcqgahd|Gmhdadj|TX|2542356300 +Rckgahd|Vihdadj|PA|5707356700 +Lirgahd|Mbhdadj|TX|6822455488 +Bcrgahd|Gbhdadj|TX|2542456400 +Rclgahd|Wbhdadj|PA|5708356700 +Litgahd|Mnhdadj|TX|6822657688 +Bdvgahd|Gchdadj|TX|2542856800 +Rcmgahd|Wxhdadj|PA|5709356700 +Liugahd|Mbhdadj|TX|6822758788 +Cadgahd|Iyhdadj|TX|2540356712 +Rcogahd|Wahdadj|PA|5702156700 +Lizgahd|Mghdadj|TX|6822326329 +Cbegahd|Ixhdadj|TX|2541356712 +Rcqgahd|Wmhdadj|PA|5702356706 +Modgahd|Myhdadj|TX|6820300709 +Cbhgahd|Ithdadj|TX|2544356712 +Rdsgahd|Wdhdadj|PA|5702556706 +Mongahd|Nghdadj|TX|6822051280 +Ccmgahd|Jxhdadj|TX|2549356721 +Rdtgahd|Wnhdadj|PA|5702656706 +Mopgahd|Nkhdadj|TX|6822253282 +Ccogahd|Jahdadj|TX|2542156721 +Rdwgahd|Wdhdadj|PA|5702956706 +Mosgahd|Ndhdadj|TX|6822556585 +Ccpgahd|Kkhdadj|TX|2542256721 +Scjgahd|Xphdadj|PA|5706376740 +Mowgahd|Ndhdadj|TX|6822956989 +Ccqgahd|Kmhdadj|TX|2542356721 +Scmgahd|Xxhdadj|PA|5709350740 +Nudgahd|Oyhdadj|TX|6820300709 +Cdwgahd|Ldhdadj|TX|2542956721 +Scrgahd|Ybhdadj|PA|5702455740 +Nujgahd|Ophdadj|TX|6826376769 +Cdzgahd|Lghdadj|TX|2542326722 +Sdtgahd|Ynhdadj|PA|5702657740 +Numgahd|Pxhdadj|TX|6829359799 +Dbggahd|Muhdadj|TX|2543336722 +Sdugahd|Ybhdadj|PA|5702758740 +Nungahd|Pghdadj|TX|6822051280 +Dckgahd|Nihdadj|TX|2547386722 +Sdygahd|Yfhdadj|PA|5702316233 +Nuogahd|Pahdadj|TX|6822152181 +Dcogahd|Nahdadj|TX|2542152732 +Uadgahd|Zyhdadj|PA|5700300733 +Nuqgahd|Pmhdadj|TX|6822354383 +Dcrgahd|Obhdadj|TX|2542455732 +Ubegahd|Zxhdadj|PA|5701311733 +Nurgahd|Pbhdadj|TX|6822455484 +Ddsgahd|Odhdadj|TX|2542556732 +Ubigahd|Zshdadj|PA|5705355733 +Nutgahd|Pnhdadj|TX|6822657686 +Ddtgahd|Onhdadj|TX|2542657732 +Uclgahd|Zbhdadj|PA|5705708733 +Nuugahd|Pbhdadj|TX|6822758787 +Ddugahd|Obhdadj|TX|2542758732 +Ucmgahd|Axhdadj|PA|5709359733 +Nuzgahd|Qghdadj|TX|6822326329 +Eadgahd|Ryhdadj|TX|2540300745 +Ucqgahd|Amhdadj|PA|5702354333 +Aadgahd|Ayhdadj|TX|2540356710 +Ebegahd|Rxhdadj|TX|2541311745 +Udtgahd|Anhdadj|PA|5702657633 +Abhgahd|Athdadj|TX|2544356710 +Ebfgahd|Rwhdadj|TX|2542322745 +Udugahd|Abhdadj|PA|5702758733 +Ackgahd|Bihdadj|TX|2547356710 +Ebhgahd|Rthdadj|TX|2544344745 +Udxgahd|Aehdadj|PA|5702306109 +Aclgahd|Bbhdadj|TX|2548356710 +Eckgahd|Sihdadj|TX|2547387745 +Vbggahd|Buhdadj|PA|5703333739 +Acmgahd|Bxhdadj|TX|2549356701 +Ecmgahd|Sxhdadj|TX|2549359745 +Vcngahd|Cghdadj|PA|5702031080 +Acpgahd|Bkhdadj|TX|2542256701 +Ecogahd|Tahdadj|TX|2542152145 +Vcogahd|Cahdadj|PA|5702152181 +Adtgahd|Cnhdadj|TX|2542656701 +Ecrgahd|Tbhdadj|TX|2542455445 +Vcrgahd|Cbhdadj|PA|5702455484 +Advgahd|Dchdadj|TX|2542856701 +Edugahd|Ubhdadj|TX|2542758709 +Vdsgahd|Cdhdadj|PA|5702556585 +Adxgahd|Dehdadj|TX|2542306711 +Edvgahd|Uchdadj|TX|2542859809 +Vdtgahd|Cnhdadj|PA|5702657686 +Adygahd|Dfhdadj|TX|2542316711 +Edzgahd|Vghdadj|TX|2542326329 +Wbegahd|Dxhdadj|PA|5701311719 +Bbegahd|Axhdadj|TX|2541351711 +Fadgahd|Vyhdadj|TX|2540300709 +Wbigahd|Dshdadj|PA|5705355759 +Bckgahd|Fihdadj|TX|2547357700 +Fbigahd|Wshdadj|TX|2545355759 +Wckgahd|Dihdadj|PA|5707387779 +Bcmgahd|Fxhdadj|TX|2549359700 +Fcjgahd|Wphdadj|TX|2546376769 +Wclgahd|Dbhdadj|PA|5705708789 +Bcpgahd|Gkhdadj|TX|2542256200 +Fclgahd|Wbhdadj|TX|2549368789 +Wcngahd|Dghdadj|PA|5702031080 +Bdsgahd|Gdhdadj|TX|2542559360 +Fcngahd|Wghdadj|TX|2542051280 +Wcrgahd|Ebhdadj|PA|5702455484 +Bdugahd|Gbhdadj|TX|2542756700 +Fcpgahd|Wkhdadj|TX|2542253282 +Wdsgahd|Edhdadj|PA|5702556585 +Bdwgahd|Hdhdadj|TX|2542956900 +Fdtgahd|Xnhdadj|TX|2542657686 +Wdtgahd|Enhdadj|PA|5702657686 +Bdzgahd|Hghdadj|TX|2542326729 +Fdygahd|Yfhdadj|TX|2541316219 +Wdwgahd|Edhdadj|PA|5702956989 +Cbigahd|Ishdadj|TX|2545356712 +Gbigahd|Zshdadj|TX|2545355759 +Wdzgahd|Eghdadj|PA|5702326329 +Ccjgahd|Jphdadj|TX|2546356712 +Gckgahd|Zihdadj|TX|2547387779 +Xadgahd|Eyhdadj|PA|5700356790 +Cckgahd|Jihdadj|TX|2547356712 +Gcmgahd|Zxhdadj|TX|2549359799 +Xclgahd|Fbhdadj|PA|5708356790 +Cclgahd|Jbhdadj|TX|2548356721 +Gcogahd|Zahdadj|TX|2542152181 +Xcogahd|Fahdadj|PA|5702156790 +Ccrgahd|Kbhdadj|TX|2542456721 +Gcpgahd|Zkhdadj|TX|2542253282 +Xcqgahd|Fmhdadj|PA|5702356779 +Cdsgahd|Kdhdadj|TX|2542556721 +Gdtgahd|Anhdadj|TX|2542657686 +Xcrgahd|Fbhdadj|PA|5702456779 +Cdxgahd|Lehdadj|TX|2542306721 +Gdugahd|Abhdadj|TX|2542758787 +Xdtgahd|Fnhdadj|PA|5702656779 +Dbhgahd|Mthdadj|TX|2544346722 +Gdwgahd|Adhdadj|TX|2542956989 +Xdzgahd|Fghdadj|PA|5702348479 +Dbigahd|Nshdadj|TX|2545356722 +Gdxgahd|Aehdadj|TX|2540306109 +Ybggahd|Guhdadj|PA|5703353779 +Dclgahd|Nbhdadj|TX|2549366732 +Hadgahd|Byhdadj|TX|5120356799 +Ycmgahd|Gxhdadj|PA|5709359744 +Dcqgahd|Omhdadj|TX|2542354732 +Hbigahd|Bshdadj|TX|5125356799 +Ycngahd|Gghdadj|PA|5702056044 +Ddvgahd|Ochdadj|TX|2542859732 +Hcjgahd|Bphdadj|TX|5126356799 +Ycrgahd|Gbhdadj|PA|5702456444 +Ddwgahd|Odhdadj|TX|2542956045 +Hckgahd|Bihdadj|TX|5127356799 +Ydugahd|Hbhdadj|PA|5702756744 +Ebigahd|Sshdadj|TX|2545355745 +Hclgahd|Bbhdadj|TX|5128356799 +Zbggahd|Huhdadj|PA|5703356766 +Ecjgahd|Sphdadj|TX|2546376745 +Hcngahd|Bghdadj|TX|5122056799 +Zbigahd|Ishdadj|PA|5705356766 +Eclgahd|Sbhdadj|TX|2549368745 +Hcpgahd|Ckhdadj|TX|5122256767 +Zckgahd|Iihdadj|PA|5707356766 +Ecngahd|Sghdadj|TX|2542051245 +Hdsgahd|Cdhdadj|TX|5122556767 +Zclgahd|Ibhdadj|PA|5708356766 +Edwgahd|Udhdadj|TX|2542956909 +Hdtgahd|Cnhdadj|TX|5122656767 +Zcngahd|Ighdadj|PA|5702056766 +Edygahd|Vfhdadj|TX|2542316219 +Hdzgahd|Dghdadj|TX|5122326767 +Zcqgahd|Imhdadj|PA|5702356766 +Fbfgahd|Vwhdadj|TX|2542322729 +Ibegahd|Dxhdadj|TX|5121351778 +Zcrgahd|Ibhdadj|PA|5702456766 +Fcmgahd|Wxhdadj|TX|2549359799 +Ibfgahd|Dwhdadj|TX|5122352778 +Zdsgahd|Idhdadj|PA|5702556766 +Fcqgahd|Xmhdadj|TX|2542354383 +Ibigahd|Dshdadj|TX|5125355778 +Zdtgahd|Inhdadj|PA|5702656766 +Fcrgahd|Xbhdadj|TX|2542455484 +Icngahd|Eghdadj|TX|5122056078 +Zdugahd|Ibhdadj|PA|5702756766 +Fdzgahd|Yghdadj|TX|2542326329 +Icpgahd|Ekhdadj|TX|5122256278 +Zdxgahd|Jehdadj|PA|5702306751 +Gadgahd|Yyhdadj|TX|2540300709 +Icqgahd|Emhdadj|TX|5122356356 +Zdzgahd|Jghdadj|PA|5702348451 +Gbegahd|Yxhdadj|TX|2541311719 +Idugahd|Fbhdadj|TX|5122756756 +Keggahd|Juhdadj|PA|5703336751 +Gbggahd|Yuhdadj|TX|2543333739 +Jadgahd|Gyhdadj|TX|5120356701 +Kejgahd|Jphdadj|PA|5706376751 +Gcjgahd|Zphdadj|TX|2546376769 +Jbegahd|Gxhdadj|TX|5121356701 +Kekgahd|Jihdadj|PA|5707386751 +Gcngahd|Zghdadj|TX|2542051280 +Jbfgahd|Gwhdadj|TX|5122356701 +Keogahd|Kahdadj|PA|5702152751 +Gdsgahd|Adhdadj|TX|2542556585 +Jbigahd|Gshdadj|TX|5125356701 +Kergahd|Kbhdadj|PA|5702455762 +Gdzgahd|Aghdadj|TX|2542326329 +Jckgahd|Hihdadj|TX|5127356701 +Keugahd|Kbhdadj|PA|5702758762 +Hbggahd|Buhdadj|TX|5123356799 +Jclgahd|Hbhdadj|TX|5128356701 +Kevgahd|Kchdadj|PA|5702859762 +Hbhgahd|Bthdadj|TX|5124356799 +Jcrgahd|Hbhdadj|TX|5122456755 +Keygahd|Kfhdadj|PA|5702316262 +Hcmgahd|Bxhdadj|TX|5129356799 +Jdsgahd|Hdhdadj|TX|5122556755 +Lifgahd|Lwhdadj|PA|5702322762 +Hcogahd|Bahdadj|TX|5122156799 +Jdzgahd|Ighdadj|TX|5122326755 +Lihgahd|Lthdadj|PA|5704344762 +Hcqgahd|Cmhdadj|TX|5122356767 +Kadgahd|Iyhdadj|TX|5120306704 +Limgahd|Lxhdadj|PA|5709359762 +Hcrgahd|Cbhdadj|TX|5122456767 +Kbegahd|Ixhdadj|TX|5121316704 +Lingahd|Lghdadj|PA|5702031088 +Hdvgahd|Cchdadj|TX|5122856767 +Kbfgahd|Jwhdadj|TX|5122326704 +Liogahd|Lahdadj|PA|5702152188 +Hdwgahd|Cdhdadj|TX|5122956767 +Kbigahd|Jshdadj|TX|5125356704 +Lisgahd|Mdhdadj|PA|5702556588 +Hdxgahd|Cehdadj|TX|5122306767 +Kcjgahd|Jphdadj|TX|5126376704 +Livgahd|Mchdadj|PA|5702859888 +Hdygahd|Dfhdadj|TX|5122316767 +Kclgahd|Jbhdadj|TX|5129366704 +Liwgahd|Mdhdadj|PA|5702956988 +Ibggahd|Duhdadj|TX|5123353778 +Kcqgahd|Kmhdadj|TX|5122354766 +Lixgahd|Mehdadj|PA|5702306109 +Ickgahd|Eihdadj|TX|5127357778 +Kcrgahd|Kbhdadj|TX|5122455766 +Mofgahd|Mwhdadj|PA|5702322729 +Icogahd|Eahdadj|TX|5122156178 +Kdsgahd|Kdhdadj|TX|5122556766 +Moigahd|Mshdadj|PA|5705355759 +Icrgahd|Fbhdadj|TX|5122456456 +Kdugahd|Kbhdadj|TX|5122758766 +Mojgahd|Nphdadj|PA|5706376769 +Idsgahd|Fdhdadj|TX|5122556556 +Kdzgahd|Lghdadj|TX|5122326366 +Mokgahd|Nihdadj|PA|5707387779 +Idtgahd|Fnhdadj|TX|5122656656 +Lbegahd|Lxhdadj|TX|5121311766 +Molgahd|Nbhdadj|PA|5705708789 +Idvgahd|Fchdadj|TX|5122856856 +Ldsgahd|Mdhdadj|TX|5122556529 +Moogahd|Nahdadj|PA|5702152181 +Idwgahd|Fdhdadj|TX|5122956956 +Ldvgahd|Nchdadj|TX|5122859829 +Morgahd|Nbhdadj|PA|5702455484 +Idxgahd|Fehdadj|TX|5122306709 +Ldwgahd|Ndhdadj|TX|5122956929 +Mougahd|Nbhdadj|PA|5702758787 +Jcogahd|Hahdadj|TX|5122156755 +Ldygahd|Nfhdadj|TX|5122316219 +Moxgahd|Nehdadj|PA|5700306109 +Jcpgahd|Hkhdadj|TX|5122256755 +Mbfgahd|Nwhdadj|TX|5122322729 +Moygahd|Ofhdadj|PA|5701316219 +Jcqgahd|Hmhdadj|TX|5122356755 +Mclgahd|Obhdadj|TX|5129368789 +Nuegahd|Oxhdadj|PA|5701311719 +Jdugahd|Ibhdadj|TX|5122756755 +Mcmgahd|Oxhdadj|TX|5129359799 +Nuigahd|Oshdadj|PA|5705355759 +Jdxgahd|Iehdadj|TX|5122306755 +Mcqgahd|Omhdadj|TX|5122354383 +Nupgahd|Pkhdadj|PA|5702253282 +Jdygahd|Ifhdadj|TX|5122316755 +Mcrgahd|Obhdadj|TX|5122455484 +Nusgahd|Pdhdadj|PA|5702556585 +Kbggahd|Juhdadj|TX|5123336704 +Mdxgahd|Pehdadj|TX|5120306109 +Nuvgahd|Pchdadj|PA|5702859888 +Kbhgahd|Jthdadj|TX|5124346704 +Ncjgahd|Pphdadj|TX|5126376769 +Nuwgahd|Pdhdadj|PA|5702956989 +Kcmgahd|Jxhdadj|TX|5129350704 +Nckgahd|Pihdadj|TX|5127387779 +Abegahd|Axhdadj|TX|8172656710 +Kcpgahd|Kkhdadj|TX|5122253704 +Ncrgahd|Qbhdadj|TX|5122455484 +Abfgahd|Awhdadj|TX|8172356710 +Kdtgahd|Knhdadj|TX|5122657766 +Ndtgahd|Qnhdadj|TX|5122657686 +Abggahd|Auhdadj|TX|8173356710 +Kdxgahd|Lehdadj|TX|5122306166 +Ndugahd|Qbhdadj|TX|5122758787 +Abigahd|Ashdadj|TX|8175356710 +Kdygahd|Lfhdadj|TX|5122319366 +Ndvgahd|Qchdadj|TX|5122859888 +Acjgahd|Bphdadj|TX|8176356710 +Lbfgahd|Lwhdadj|TX|5122322766 +Ndygahd|Rfhdadj|TX|5121316219 +Acngahd|Bghdadj|TX|8172056701 +Lbigahd|Lshdadj|TX|5125355729 +Ndzgahd|Rghdadj|TX|5122326329 +Acogahd|Bahdadj|TX|8172156701 +Lckgahd|Mihdadj|TX|5127387729 +Obggahd|Ruhdadj|TX|9363356776 +Acqgahd|Cmhdadj|TX|8172356701 +Lcmgahd|Mxhdadj|TX|5129359729 +Obigahd|Rshdadj|TX|9365356776 +Acrgahd|Cbhdadj|TX|8172456701 +Lcqgahd|Mmhdadj|TX|5122354329 +Oclgahd|Sbhdadj|TX|9368356776 +Adsgahd|Cdhdadj|TX|8172556701 +Ldxgahd|Nehdadj|TX|5122306109 +Ocmgahd|Sxhdadj|TX|9369356776 +Adugahd|Cbhdadj|TX|8172756701 +Ldzgahd|Nghdadj|TX|5122326329 +Ocogahd|Sahdadj|TX|9362156776 +Adwgahd|Ddhdadj|TX|8172956711 +Mbegahd|Nxhdadj|TX|5121311719 +Ocqgahd|Smhdadj|TX|9362356776 +Adzgahd|Dghdadj|TX|8172326711 +Mbigahd|Nshdadj|TX|5125355759 +Odugahd|Tbhdadj|TX|9362756776 +Bbggahd|Euhdadj|TX|8173353711 +Mckgahd|Nihdadj|TX|5127387779 +Padgahd|Tyhdadj|TX|9360350767 +Bbhgahd|Ethdadj|TX|8174354711 +Mcngahd|Oghdadj|TX|5122051280 +Pbfgahd|Twhdadj|TX|9362352767 +Bbigahd|Eshdadj|TX|8175355711 +Mcogahd|Oahdadj|TX|5122152181 +Pbggahd|Tuhdadj|TX|9363353767 +Bcngahd|Fghdadj|TX|8172056000 +Mdtgahd|Onhdadj|TX|5122657686 +Pcjgahd|Uphdadj|TX|9366356767 +Bdtgahd|Gnhdadj|TX|8172656600 +Mdugahd|Obhdadj|TX|5122758787 +Pckgahd|Uihdadj|TX|9367357767 +Bdxgahd|Hehdadj|TX|8172306709 +Mdvgahd|Ochdadj|TX|5122859888 +Pcngahd|Ughdadj|TX|9362056067 +Bdygahd|Hfhdadj|TX|8172316719 +Nbegahd|Pxhdadj|TX|5121311719 +Pdugahd|Ubhdadj|TX|9362756700 +Cbfgahd|Iwhdadj|TX|8172356712 +Nbigahd|Pshdadj|TX|5125355759 +Pdxgahd|Vehdadj|TX|9362306709 +Cbggahd|Iuhdadj|TX|8173356712 +Nclgahd|Qbhdadj|TX|5129368789 +Pdygahd|Vfhdadj|TX|9362316719 +Ccngahd|Jghdadj|TX|8172056721 +Ncngahd|Qghdadj|TX|5122051280 +Rbggahd|Vuhdadj|TX|9363356700 +Cdtgahd|Knhdadj|TX|8172656721 +Ncqgahd|Qmhdadj|TX|5122354383 +Rbigahd|Vshdadj|TX|9365356700 +Cdugahd|Kbhdadj|TX|8172756721 +Ndsgahd|Qdhdadj|TX|5122556585 +Rcjgahd|Vphdadj|TX|9366356700 +Cdvgahd|Lchdadj|TX|8172856721 +Ndxgahd|Rehdadj|TX|5120306109 +Sbfgahd|Xwhdadj|TX|9362326706 +Cdygahd|Lfhdadj|TX|8172316722 +Obhgahd|Rthdadj|TX|9364356776 +Sbggahd|Xuhdadj|TX|9363336706 +Dadgahd|Myhdadj|TX|8170306722 +Ocpgahd|Skhdadj|TX|9362256776 +Sbigahd|Xshdadj|TX|9365356740 +Dbegahd|Mxhdadj|TX|8172616722 +Ocrgahd|Sbhdadj|TX|9362456776 +Scngahd|Xghdadj|TX|9362051740 +Dbfgahd|Mwhdadj|TX|8172326722 +Odsgahd|Sdhdadj|TX|9362556776 +Scpgahd|Ykhdadj|TX|9362253740 +Dcjgahd|Nphdadj|TX|8176376722 +Odvgahd|Tchdadj|TX|9362856776 +Scqgahd|Ymhdadj|TX|9362354740 +Dcmgahd|Nxhdadj|TX|8179350732 +Odxgahd|Tehdadj|TX|9362306767 +Sdzgahd|Yghdadj|TX|9362326333 +Dcngahd|Nghdadj|TX|8172051732 +Odygahd|Tfhdadj|TX|9362316767 +Ubggahd|Zuhdadj|TX|9363333733 +Dcpgahd|Nkhdadj|TX|8172253732 +Odzgahd|Tghdadj|TX|9362326767 +Ubhgahd|Zthdadj|TX|9364344733 +Ddxgahd|Pehdadj|TX|8172306145 +Pbegahd|Txhdadj|TX|9361351767 +Uckgahd|Zihdadj|TX|9367387733 +Ddygahd|Pfhdadj|TX|8172316245 +Pbigahd|Tshdadj|TX|9365355767 +Ucngahd|Aghdadj|TX|9362051233 +Ddzgahd|Pghdadj|TX|8172326345 +Pclgahd|Ubhdadj|TX|9368358767 +Ucogahd|Aahdadj|TX|9362152133 +Ebggahd|Ruhdadj|TX|8173333745 +Pcmgahd|Uxhdadj|TX|9369359767 +Ucrgahd|Abhdadj|TX|9362455433 +Ecpgahd|Tkhdadj|TX|8172253245 +Pcpgahd|Ukhdadj|TX|9362259367 +Udsgahd|Adhdadj|TX|9362556533 +Ecqgahd|Tmhdadj|TX|8172354345 +Pdsgahd|Udhdadj|TX|9362559360 +Udwgahd|Adhdadj|TX|9362956933 +Edsgahd|Tdhdadj|TX|8172559369 +Pdwgahd|Udhdadj|TX|9362956900 +Udzgahd|Bghdadj|TX|9362326329 +Edtgahd|Unhdadj|TX|8172657609 +Pdzgahd|Vghdadj|TX|9362326729 +Vbfgahd|Bwhdadj|TX|9362322729 +Edxgahd|Uehdadj|TX|8172306109 +Radgahd|Vyhdadj|TX|9360356700 +Vcjgahd|Bphdadj|TX|9366376769 +Fbegahd|Vxhdadj|TX|8172611719 +Rbhgahd|Vthdadj|TX|9364356700 +Vcmgahd|Cxhdadj|TX|9369359799 +Fbggahd|Vuhdadj|TX|8173333739 +Rcngahd|Wghdadj|TX|9362056700 +Vcpgahd|Ckhdadj|TX|9362253282 +Fbhgahd|Vthdadj|TX|8174344749 +Rcpgahd|Wkhdadj|TX|9362256706 +Vdxgahd|Cehdadj|TX|9360306109 +Fckgahd|Wihdadj|TX|8177387779 +Rcrgahd|Wbhdadj|TX|9362456706 +Vdygahd|Cfhdadj|TX|9361316219 +Fcogahd|Wahdadj|TX|8172152181 +Rdugahd|Wbhdadj|TX|9362756706 +Vdzgahd|Cghdadj|TX|9362326329 +Fdsgahd|Xdhdadj|TX|8172556585 +Rdvgahd|Wchdadj|TX|9362856706 +Wadgahd|Dyhdadj|TX|9360300709 +Fdugahd|Xbhdadj|TX|8172758787 +Rdxgahd|Wehdadj|TX|9362306706 +Wbggahd|Duhdadj|TX|9363333739 +Fdvgahd|Xchdadj|TX|8172859888 +Rdygahd|Wfhdadj|TX|9362316706 +Wcjgahd|Dphdadj|TX|9366376769 +Fdwgahd|Xdhdadj|TX|8172956989 +Rdzgahd|Wghdadj|TX|9362326706 +Wcmgahd|Dxhdadj|TX|9369359799 +Fdxgahd|Xehdadj|TX|8170306109 +Sadgahd|Xyhdadj|TX|9360306706 +Wdvgahd|Echdadj|TX|9362859888 +Gbfgahd|Ywhdadj|TX|8172322729 +Sbegahd|Xxhdadj|TX|9361316706 +Wdygahd|Efhdadj|TX|9361316219 +Gbhgahd|Ythdadj|TX|8174344749 +Sbhgahd|Xthdadj|TX|9364346706 +Xbegahd|Exhdadj|TX|5121356790 +Gclgahd|Zbhdadj|TX|8179368789 +Sckgahd|Xihdadj|TX|9367386740 +Xbfgahd|Ewhdadj|TX|5122356790 +Gcqgahd|Zmhdadj|TX|8172354383 +Sclgahd|Xbhdadj|TX|9369366740 +Xbggahd|Euhdadj|TX|5123356790 +Gcrgahd|Zbhdadj|TX|8172455484 +Scogahd|Yahdadj|TX|9362152740 +Xbhgahd|Ethdadj|TX|5124356790 +Gdvgahd|Achdadj|TX|8172859888 +Sdsgahd|Ydhdadj|TX|9362556740 +Xcjgahd|Ephdadj|TX|5126356790 +Gdygahd|Afhdadj|TX|8172616219 +Sdvgahd|Ychdadj|TX|9362859740 +Xcngahd|Fghdadj|TX|5122056790 +Hbegahd|Bxhdadj|TX|6821356799 +Sdwgahd|Ydhdadj|TX|9362956040 +Xdsgahd|Fdhdadj|TX|5122556779 +Hbfgahd|Bwhdadj|TX|6822356799 +Sdxgahd|Yehdadj|TX|9362306140 +Xdugahd|Fbhdadj|TX|5122756779 +Hdugahd|Cbhdadj|TX|6822756767 +Ubfgahd|Zwhdadj|TX|9362322733 +Xdygahd|Ffhdadj|TX|5122316779 +Iadgahd|Dyhdadj|TX|6820350767 +Ucjgahd|Zphdadj|TX|9366376733 +Yadgahd|Gyhdadj|TX|5120350779 +Ibhgahd|Dthdadj|TX|6824354778 +Ucpgahd|Akhdadj|TX|9362253233 +Ybegahd|Gxhdadj|TX|5121351779 +Icjgahd|Dphdadj|TX|6826356778 +Udvgahd|Achdadj|TX|9362859833 +Ybfgahd|Gwhdadj|TX|5122352779 +Iclgahd|Ebhdadj|TX|6828358778 +Udygahd|Bfhdadj|TX|9362316219 +Ybhgahd|Gthdadj|TX|5124354779 +Icmgahd|Exhdadj|TX|6829359778 +Vadgahd|Byhdadj|TX|9360300709 +Ycjgahd|Gphdadj|TX|5126356779 +Idygahd|Gfhdadj|TX|6822316719 +Vbegahd|Bxhdadj|TX|9361311719 +Yclgahd|Gbhdadj|TX|5128358744 +Idzgahd|Gghdadj|TX|6822326729 +Vbhgahd|Bthdadj|TX|9364344749 +Ycpgahd|Gkhdadj|TX|5122256244 +Jbggahd|Guhdadj|TX|6823356701 +Vbigahd|Bshdadj|TX|9365355759 +Ydtgahd|Hnhdadj|TX|5122656644 +Jbhgahd|Gthdadj|TX|6824356701 +Vckgahd|Bihdadj|TX|9367387779 +Ydwgahd|Hdhdadj|TX|5122956944 +Jcjgahd|Gphdadj|TX|6826356701 +Vclgahd|Bbhdadj|TX|9369368789 +Ydxgahd|Hehdadj|TX|5122306709 +Jcmgahd|Hxhdadj|TX|6829356701 +Vcqgahd|Cmhdadj|TX|9362354383 +Ydygahd|Hfhdadj|TX|5122316719 +Jcngahd|Hghdadj|TX|6822056755 +Vdugahd|Cbhdadj|TX|9362758787 +Ydzgahd|Hghdadj|TX|5122326729 +Jdtgahd|Inhdadj|TX|6822656755 +Vdvgahd|Cchdadj|TX|9362859888 +Zadgahd|Hyhdadj|TX|5120356744 +Jdvgahd|Ichdadj|TX|6822856755 +Vdwgahd|Cdhdadj|TX|9362956989 +Zbfgahd|Hwhdadj|TX|5122356744 +Jdwgahd|Idhdadj|TX|6822956755 +Wbfgahd|Dwhdadj|TX|9362322729 +Zbhgahd|Hthdadj|TX|5124356766 +Kckgahd|Jihdadj|TX|6827386704 +Wbhgahd|Dthdadj|TX|9364344749 +Zcjgahd|Iphdadj|TX|5126356766 +Kcngahd|Jghdadj|TX|6822051704 +Wcogahd|Dahdadj|TX|9362152181 +Zcmgahd|Ixhdadj|TX|5129356766 +Kcogahd|Kahdadj|TX|6822152704 +Wcpgahd|Dkhdadj|TX|9362253282 +Zdvgahd|Jchdadj|TX|5122856751 +Kdvgahd|Kchdadj|TX|6822859766 +Wcqgahd|Emhdadj|TX|9362354383 +Kedgahd|Jyhdadj|TX|5120306751 +Kdwgahd|Ldhdadj|TX|6822956066 +Wdugahd|Ebhdadj|TX|9362758787 +Keegahd|Jxhdadj|TX|5121316751 +Ladgahd|Lyhdadj|TX|6820300766 +Wdxgahd|Eehdadj|TX|9360306109 +Kehgahd|Jthdadj|TX|5124346751 +Lbggahd|Luhdadj|TX|6823333729 +Xbigahd|Eshdadj|TX|5125356790 +Kelgahd|Jbhdadj|TX|5129366751 +Lbhgahd|Lthdadj|TX|6824344729 +Xckgahd|Eihdadj|TX|5127356790 +Keqgahd|Kmhdadj|TX|5122354762 +Lcjgahd|Lphdadj|TX|6826376729 +Xcmgahd|Fxhdadj|TX|5129356790 +Ketgahd|Knhdadj|TX|5122657762 +Lclgahd|Mbhdadj|TX|6829368729 +Xcpgahd|Fkhdadj|TX|5122256779 +Kezgahd|Kghdadj|TX|5122326362 +Lcngahd|Mghdadj|TX|6822051229 +Xdvgahd|Fchdadj|TX|5122856779 +Liggahd|Luhdadj|TX|5123333762 +Lcogahd|Mahdadj|TX|6822152129 +Xdwgahd|Fdhdadj|TX|5122956779 +Likgahd|Lihdadj|TX|5127387762 +Lcpgahd|Mkhdadj|TX|6822253229 +Xdxgahd|Fehdadj|TX|5122306779 +Lilgahd|Lbhdadj|TX|5129368762 +Lcrgahd|Mbhdadj|TX|6822455429 +Ybigahd|Gshdadj|TX|5125355779 +Lipgahd|Lkhdadj|TX|5122253288 +Ldtgahd|Mnhdadj|TX|6822657629 +Yckgahd|Gihdadj|TX|5127357779 +Liygahd|Mfhdadj|TX|5122316219 +Ldugahd|Mbhdadj|TX|6822758729 +Ycogahd|Gahdadj|TX|5122156144 +Moegahd|Mxhdadj|TX|5121311719 +Madgahd|Nyhdadj|TX|6820300709 +Ycqgahd|Gmhdadj|TX|5122356344 +Moggahd|Muhdadj|TX|5123333739 +Mbggahd|Nuhdadj|TX|6823333739 +Ydsgahd|Hdhdadj|TX|5122556544 +Mohgahd|Mthdadj|TX|5124344749 +Mbhgahd|Nthdadj|TX|6824344749 +Ydvgahd|Hchdadj|TX|5122856844 +Momgahd|Nxhdadj|TX|5129359799 +Mcjgahd|Nphdadj|TX|6826376769 +Zbegahd|Hxhdadj|TX|5121356744 +Moqgahd|Nmhdadj|TX|5122354383 +Mcpgahd|Okhdadj|TX|6822253282 +Zcogahd|Iahdadj|TX|5122156766 +Motgahd|Nnhdadj|TX|5122657686 +Mdsgahd|Odhdadj|TX|6822556585 +Zcpgahd|Ikhdadj|TX|5122256766 +Movgahd|Nchdadj|TX|5122859888 +Mdwgahd|Pdhdadj|TX|6822956989 +Zdwgahd|Jdhdadj|TX|5122956751 +Mozgahd|Oghdadj|TX|5122326329 +Mdygahd|Pfhdadj|TX|6821316219 +Zdygahd|Jfhdadj|TX|5122316751 +Nufgahd|Owhdadj|TX|5122322729 +Mdzgahd|Pghdadj|TX|6822326329 +Kefgahd|Jwhdadj|TX|5122326751 +Nuggahd|Ouhdadj|TX|5123333739 +Nadgahd|Pyhdadj|TX|6820300709 +Keigahd|Jshdadj|TX|5125356751 +Nuhgahd|Othdadj|TX|5124344749 +Nbfgahd|Pwhdadj|TX|6822322729 +Kemgahd|Kxhdadj|TX|5129350751 +Nukgahd|Oihdadj|TX|5127387779 +Nbggahd|Puhdadj|TX|6823333739 +Kengahd|Kghdadj|TX|5122051751 +Nulgahd|Pbhdadj|TX|5129368789 +Nbhgahd|Pthdadj|TX|6824344749 +Kepgahd|Kkhdadj|TX|5122253751 +Nuxgahd|Qehdadj|TX|5120306109 +Ncmgahd|Qxhdadj|TX|6829359799 +Kesgahd|Kdhdadj|TX|5122556762 +Nuygahd|Qfhdadj|TX|5121316219 +Ncogahd|Qahdadj|TX|6822152181 +Kewgahd|Kdhdadj|TX|5122956062 +Badgahd|Eyhdadj|TX|9790350711 +Ncpgahd|Qkhdadj|TX|6822253282 +Kexgahd|Kehdadj|TX|5122306162 +Bbfgahd|Ewhdadj|TX|9792352711 +Ndwgahd|Qdhdadj|TX|6822956989 +Lidgahd|Lyhdadj|TX|5120300762 +Bcjgahd|Fphdadj|TX|9796356711 +Oadgahd|Ryhdadj|TX|9360356776 +Liegahd|Lxhdadj|TX|5121311762 +Bclgahd|Fbhdadj|TX|9798358700 +Obegahd|Rxhdadj|TX|9361356776 +Liigahd|Lshdadj|TX|5125355762 +Bcogahd|Fahdadj|TX|9792156100 +Obfgahd|Rwhdadj|TX|9362356776 +Lijgahd|Lphdadj|TX|5126376762 +Bcqgahd|Gmhdadj|TX|9792356300 +Ocjgahd|Sphdadj|TX|9366356776 +Liqgahd|Lmhdadj|TX|5122354388 +Bcrgahd|Gbhdadj|TX|9792456400 +Ockgahd|Sihdadj|TX|9367356776 +Lirgahd|Mbhdadj|TX|5122455488 +Bdvgahd|Gchdadj|TX|9792856800 +Ocngahd|Sghdadj|TX|9362056776 +Litgahd|Mnhdadj|TX|5122657688 +Cadgahd|Iyhdadj|TX|9790356712 +Odtgahd|Snhdadj|TX|9362656776 +Liugahd|Mbhdadj|TX|5122758788 +Cbegahd|Ixhdadj|TX|9793656712 +Odwgahd|Tdhdadj|TX|9362956776 +Lizgahd|Mghdadj|TX|5122326329 +Cbhgahd|Ithdadj|TX|9794356712 +Pbhgahd|Tthdadj|TX|9364354767 +Modgahd|Myhdadj|TX|5120300709 +Ccmgahd|Jxhdadj|TX|9799356721 +Pcogahd|Uahdadj|TX|9362156167 +Mongahd|Nghdadj|TX|5122051280 +Ccogahd|Jahdadj|TX|9792156721 +Pcqgahd|Umhdadj|TX|9362356367 +Mopgahd|Nkhdadj|TX|5122253282 +Ccpgahd|Kkhdadj|TX|9792256721 +Pcrgahd|Ubhdadj|TX|9362456467 +Mosgahd|Ndhdadj|TX|5122556585 +Ccqgahd|Kmhdadj|TX|9792356721 +Pdtgahd|Unhdadj|TX|9362656600 +Mowgahd|Ndhdadj|TX|5122956989 +Cdwgahd|Ldhdadj|TX|9792956721 +Pdvgahd|Uchdadj|TX|9362856800 +Nudgahd|Oyhdadj|TX|5120300709 +Cdzgahd|Lghdadj|TX|9792326722 +Rbegahd|Vxhdadj|TX|9361356700 +Nujgahd|Ophdadj|TX|5126376769 +Dbggahd|Muhdadj|TX|9793336722 +Rbfgahd|Vwhdadj|TX|9362356700 +Numgahd|Pxhdadj|TX|5129359799 +Dckgahd|Nihdadj|TX|9797386722 +Rckgahd|Vihdadj|TX|9367356700 +Nungahd|Pghdadj|TX|5122051280 +Dcogahd|Nahdadj|TX|9792152732 +Rclgahd|Wbhdadj|TX|9368356700 +Nuogahd|Pahdadj|TX|5122152181 +Dcrgahd|Obhdadj|TX|9792455732 +Rcmgahd|Wxhdadj|TX|9369356700 +Nuqgahd|Pmhdadj|TX|5122354383 +Ddsgahd|Odhdadj|TX|9792556732 +Rcogahd|Wahdadj|TX|9362156700 +Nurgahd|Pbhdadj|TX|5122455484 +Ddtgahd|Onhdadj|TX|9792657732 +Rcqgahd|Wmhdadj|TX|9362356706 +Nutgahd|Pnhdadj|TX|5122657686 +Ddugahd|Obhdadj|TX|9792758732 +Rdsgahd|Wdhdadj|TX|9362556706 +Nuugahd|Pbhdadj|TX|5122758787 +Eadgahd|Ryhdadj|TX|9790300745 +Rdtgahd|Wnhdadj|TX|9362656706 +Nuzgahd|Qghdadj|TX|5122326329 +Ebegahd|Rxhdadj|TX|9793611745 +Rdwgahd|Wdhdadj|TX|9362956706 +Aadgahd|Ayhdadj|TX|9790356710 +Ebfgahd|Rwhdadj|TX|9792322745 +Scjgahd|Xphdadj|TX|9366376740 +Abhgahd|Athdadj|TX|9794356710 +Ebhgahd|Rthdadj|TX|9794344745 +Scmgahd|Xxhdadj|TX|9369350740 +Ackgahd|Bihdadj|TX|9797356710 +Eckgahd|Sihdadj|TX|9797387745 +Scrgahd|Ybhdadj|TX|9362455740 +Aclgahd|Bbhdadj|TX|9798356710 +Ecmgahd|Sxhdadj|TX|9799359745 +Sdtgahd|Ynhdadj|TX|9362657740 +Acmgahd|Bxhdadj|TX|9799356701 +Ecogahd|Tahdadj|TX|9792152145 +Sdugahd|Ybhdadj|TX|9362758740 +Acpgahd|Bkhdadj|TX|9792256701 +Ecrgahd|Tbhdadj|TX|9792455445 +Sdygahd|Yfhdadj|TX|9362316233 +Adtgahd|Cnhdadj|TX|9792656701 +Edugahd|Ubhdadj|TX|9792758709 +Uadgahd|Zyhdadj|TX|9360300733 +Advgahd|Dchdadj|TX|9792856701 +Edvgahd|Uchdadj|TX|9792859809 +Ubegahd|Zxhdadj|TX|9361311733 +Adxgahd|Dehdadj|TX|9792306711 +Edzgahd|Vghdadj|TX|9792326329 +Ubigahd|Zshdadj|TX|9365355733 +Adygahd|Dfhdadj|TX|9792316711 +Fadgahd|Vyhdadj|TX|9790300709 +Uclgahd|Zbhdadj|TX|9369368733 +Bbegahd|Axhdadj|TX|9793651711 +Fbigahd|Wshdadj|TX|9795355759 +Ucmgahd|Axhdadj|TX|9369359733 +Bckgahd|Fihdadj|TX|9797357700 +Fcjgahd|Wphdadj|TX|9796376769 +Ucqgahd|Amhdadj|TX|9362354333 +Bcmgahd|Fxhdadj|TX|9799359700 +Fclgahd|Wbhdadj|TX|9799368789 +Udtgahd|Anhdadj|TX|9362657633 +Bcpgahd|Gkhdadj|TX|9792256200 +Fcngahd|Wghdadj|TX|9792031080 +Udugahd|Abhdadj|TX|9362758733 +Bdsgahd|Gdhdadj|TX|9792559360 +Fcpgahd|Wkhdadj|TX|9792253282 +Udxgahd|Aehdadj|TX|9362306109 +Bdugahd|Gbhdadj|TX|9792756700 +Fdtgahd|Xnhdadj|TX|9792657686 +Vbggahd|Buhdadj|TX|9363333739 +Bdwgahd|Hdhdadj|TX|9792956900 +Fdygahd|Yfhdadj|TX|9793616219 +Vcngahd|Cghdadj|TX|9362051280 +Bdzgahd|Hghdadj|TX|9792326729 +Gbigahd|Zshdadj|TX|9795355759 +Vcogahd|Cahdadj|TX|9362152181 +Cbigahd|Ishdadj|TX|9795356712 +Gckgahd|Zihdadj|TX|9797387779 +Vcrgahd|Cbhdadj|TX|9362455484 +Ccjgahd|Jphdadj|TX|9796356712 +Gcmgahd|Zxhdadj|TX|9799359799 +Vdsgahd|Cdhdadj|TX|9362556585 +Cckgahd|Jihdadj|TX|9797356712 +Gcogahd|Zahdadj|TX|9792152181 +Vdtgahd|Cnhdadj|TX|9362657686 +Cclgahd|Jbhdadj|TX|9798356721 +Gcpgahd|Zkhdadj|TX|9792253282 +Wbegahd|Dxhdadj|TX|9361311719 +Ccrgahd|Kbhdadj|TX|9792456721 +Gdtgahd|Anhdadj|TX|9792657686 +Wbigahd|Dshdadj|TX|9365355759 +Cdsgahd|Kdhdadj|TX|9792556721 +Gdugahd|Abhdadj|TX|9792758787 +Wckgahd|Dihdadj|TX|9367387779 +Cdxgahd|Lehdadj|TX|9792306721 +Gdwgahd|Adhdadj|TX|9792956989 +Wclgahd|Dbhdadj|TX|9369368789 +Dbhgahd|Mthdadj|TX|9794346722 +Gdxgahd|Aehdadj|TX|9790306109 +Wcngahd|Dghdadj|TX|9362051280 +Dbigahd|Nshdadj|TX|9795356722 +Hadgahd|Byhdadj|TX|9360356799 +Wcrgahd|Ebhdadj|TX|9362455484 +Dclgahd|Nbhdadj|TX|9799366732 +Hbigahd|Bshdadj|TX|9365356799 +Wdsgahd|Edhdadj|TX|9362556585 +Dcqgahd|Omhdadj|TX|9792354732 +Hcjgahd|Bphdadj|TX|9366356799 +Wdtgahd|Enhdadj|TX|9362657686 +Ddvgahd|Ochdadj|TX|9792859732 +Hckgahd|Bihdadj|TX|9367356799 +Wdwgahd|Edhdadj|TX|9362956989 +Ddwgahd|Odhdadj|TX|9792956045 +Hclgahd|Bbhdadj|TX|9368356799 +Wdzgahd|Eghdadj|TX|9362326329 +Ebigahd|Sshdadj|TX|9795355745 +Hcngahd|Bghdadj|TX|9362056799 +Xadgahd|Eyhdadj|TX|6820356790 +Ecjgahd|Sphdadj|TX|9796376745 +Hcpgahd|Ckhdadj|TX|9362256767 +Xclgahd|Fbhdadj|TX|6828356790 +Eclgahd|Sbhdadj|TX|9799368745 +Hdsgahd|Cdhdadj|TX|9362556767 +Xcogahd|Fahdadj|TX|6822156790 +Ecngahd|Sghdadj|TX|9792031045 +Hdtgahd|Cnhdadj|TX|9362656767 +Xcqgahd|Fmhdadj|TX|6822356779 +Edwgahd|Udhdadj|TX|9792956909 +Hdzgahd|Dghdadj|TX|9362326767 +Xcrgahd|Fbhdadj|TX|6822456779 +Edygahd|Vfhdadj|TX|9792316219 +Ibegahd|Dxhdadj|TX|9361351778 +Xdtgahd|Fnhdadj|TX|6822656779 +Fbfgahd|Vwhdadj|TX|9792322729 +Ibfgahd|Dwhdadj|TX|9362352778 +Xdzgahd|Fghdadj|TX|6822326779 +Fcmgahd|Wxhdadj|TX|9799359799 +Ibigahd|Dshdadj|TX|9365355778 +Ybggahd|Guhdadj|TX|6823353779 +Fcqgahd|Xmhdadj|TX|9792354383 +Icngahd|Eghdadj|TX|9362056078 +Ycmgahd|Gxhdadj|TX|6829359744 +Fcrgahd|Xbhdadj|TX|9792455484 +Icpgahd|Ekhdadj|TX|9362256278 +Ycngahd|Gghdadj|TX|6822056044 +Fdzgahd|Yghdadj|TX|9792326329 +Icqgahd|Emhdadj|TX|9362356356 +Ycrgahd|Gbhdadj|TX|6822456444 +Gadgahd|Yyhdadj|TX|9790300709 +Idugahd|Fbhdadj|TX|9362756756 +Ydugahd|Hbhdadj|TX|6822756744 +Gbegahd|Yxhdadj|TX|9793611719 +Jadgahd|Gyhdadj|TX|9360356701 +Zbggahd|Huhdadj|TX|6823356766 +Gbggahd|Yuhdadj|TX|9793333739 +Jbegahd|Gxhdadj|TX|9361356701 +Zbigahd|Ishdadj|TX|6825356766 +Gcjgahd|Zphdadj|TX|9796376769 +Jbfgahd|Gwhdadj|TX|9362356701 +Zckgahd|Iihdadj|TX|6827356766 +Gcngahd|Zghdadj|TX|9792031080 +Jbigahd|Gshdadj|TX|9365356701 +Zclgahd|Ibhdadj|TX|6828356766 +Gdsgahd|Adhdadj|TX|9792556585 +Jckgahd|Hihdadj|TX|9367356701 +Zcngahd|Ighdadj|TX|6822056766 +Gdzgahd|Aghdadj|TX|9792326329 +Jclgahd|Hbhdadj|TX|9368356701 +Zcqgahd|Imhdadj|TX|6822356766 +Hbggahd|Buhdadj|TX|9363356799 +Jcrgahd|Hbhdadj|TX|9362456755 +Zcrgahd|Ibhdadj|TX|6822456766 +Hbhgahd|Bthdadj|TX|9364356799 +Jdsgahd|Hdhdadj|TX|9362556755 +Zdsgahd|Idhdadj|TX|6822556766 +Hcmgahd|Bxhdadj|TX|9369356799 +Jdzgahd|Ighdadj|TX|9362326755 +Zdtgahd|Inhdadj|TX|6822656766 +Hcogahd|Bahdadj|TX|9362156799 +Kadgahd|Iyhdadj|TX|9360306704 +Zdugahd|Ibhdadj|TX|6822756766 +Hcqgahd|Cmhdadj|TX|9362356767 +Kbegahd|Ixhdadj|TX|9361316704 +Zdxgahd|Jehdadj|TX|6822306751 +Hcrgahd|Cbhdadj|TX|9362456767 +Kbfgahd|Jwhdadj|TX|9362326704 +Zdzgahd|Jghdadj|TX|6822326751 +Hdvgahd|Cchdadj|TX|9362856767 +Kbigahd|Jshdadj|TX|9365356704 +Keggahd|Juhdadj|TX|6823336751 +Hdwgahd|Cdhdadj|TX|9362956767 +Kcjgahd|Jphdadj|TX|9366376704 +Kejgahd|Jphdadj|TX|6826376751 +Hdxgahd|Cehdadj|TX|9362306767 +Kclgahd|Jbhdadj|TX|9369366704 +Kekgahd|Jihdadj|TX|6827386751 +Hdygahd|Dfhdadj|TX|9362316767 +Kcqgahd|Kmhdadj|TX|9362354766 +Keogahd|Kahdadj|TX|6822152751 +Ibggahd|Duhdadj|TX|9363353778 +Kcrgahd|Kbhdadj|TX|9362455766 +Kergahd|Kbhdadj|TX|6822455762 +Ickgahd|Eihdadj|TX|9367357778 +Kdsgahd|Kdhdadj|TX|9362556766 +Keugahd|Kbhdadj|TX|6822758762 +Icogahd|Eahdadj|TX|9362156178 +Kdugahd|Kbhdadj|TX|9362758766 +Kevgahd|Kchdadj|TX|6822859762 +Icrgahd|Fbhdadj|TX|9362456456 +Kdzgahd|Lghdadj|TX|9362326366 +Keygahd|Kfhdadj|TX|6822319362 +Idsgahd|Fdhdadj|TX|9362556556 +Lbegahd|Lxhdadj|TX|9361311766 +Lifgahd|Lwhdadj|TX|6822322762 +Idtgahd|Fnhdadj|TX|9362656656 +Ldsgahd|Mdhdadj|TX|9362556529 +Lihgahd|Lthdadj|TX|6824344762 +Idvgahd|Fchdadj|TX|9362856856 +Ldvgahd|Nchdadj|TX|9362859829 +Limgahd|Lxhdadj|TX|6829359762 +Idwgahd|Fdhdadj|TX|9362956956 +Ldwgahd|Ndhdadj|TX|9362956929 +Lingahd|Lghdadj|TX|6822051288 +Idxgahd|Fehdadj|TX|9362306709 +Ldygahd|Nfhdadj|TX|9362316219 +Liogahd|Lahdadj|TX|6822152188 +Jcogahd|Hahdadj|TX|9362156755 +Mbfgahd|Nwhdadj|TX|9362322729 +Lisgahd|Mdhdadj|TX|6822556588 +Jcpgahd|Hkhdadj|TX|9362256755 +Mclgahd|Obhdadj|TX|9369368789 +Livgahd|Mchdadj|TX|6822859888 +Jcqgahd|Hmhdadj|TX|9362356755 +Mcmgahd|Oxhdadj|TX|9369359799 +Liwgahd|Mdhdadj|TX|6822956988 +Jdugahd|Ibhdadj|TX|9362756755 +Mcqgahd|Omhdadj|TX|9362354383 +Lixgahd|Mehdadj|TX|6822306109 +Jdxgahd|Iehdadj|TX|9362306755 +Mcrgahd|Obhdadj|TX|9362455484 +Mofgahd|Mwhdadj|TX|6822322729 +Jdygahd|Ifhdadj|TX|9362316755 +Mdxgahd|Pehdadj|TX|9360306109 +Moigahd|Mshdadj|TX|6825355759 +Kbggahd|Juhdadj|TX|9363336704 +Ncjgahd|Pphdadj|TX|9366376769 +Mojgahd|Nphdadj|TX|6826376769 +Kbhgahd|Jthdadj|TX|9364346704 +Nckgahd|Pihdadj|TX|9367387779 +Mokgahd|Nihdadj|TX|6827387779 +Kcmgahd|Jxhdadj|TX|9369350704 +Ncrgahd|Qbhdadj|TX|9362455484 +Molgahd|Nbhdadj|TX|6829368789 +Kcpgahd|Kkhdadj|TX|9362253704 +Ndtgahd|Qnhdadj|TX|9362657686 +Moogahd|Nahdadj|TX|6822152181 +Kdtgahd|Knhdadj|TX|9362657766 +Ndugahd|Qbhdadj|TX|9362758787 +Morgahd|Nbhdadj|TX|6822455484 +Kdxgahd|Lehdadj|TX|9362306166 +Ndvgahd|Qchdadj|TX|9362859888 +Mougahd|Nbhdadj|TX|6822758787 +Kdygahd|Lfhdadj|TX|9362319366 +Ndygahd|Rfhdadj|TX|9361316219 +Moxgahd|Nehdadj|TX|6820306109 +Lbfgahd|Lwhdadj|TX|9362322766 +Ndzgahd|Rghdadj|TX|9362326329 +Moygahd|Ofhdadj|TX|6821316219 +Lbigahd|Lshdadj|TX|9365355729 +Obggahd|Ruhdadj|TX|9363356776 +Nuegahd|Oxhdadj|TX|6821311719 +Lckgahd|Mihdadj|TX|9367387729 +Obigahd|Rshdadj|TX|9365356776 +Nuigahd|Oshdadj|TX|6825355759 +Lcmgahd|Mxhdadj|TX|9369359729 +Oclgahd|Sbhdadj|TX|9368356776 +Nupgahd|Pkhdadj|TX|6822253282 +Lcqgahd|Mmhdadj|TX|9362354329 +Ocmgahd|Sxhdadj|TX|9369356776 +Nusgahd|Pdhdadj|TX|6822556585 +Ldxgahd|Nehdadj|TX|9362306109 +Ocogahd|Sahdadj|TX|9362156776 +Nuvgahd|Pchdadj|TX|6822859888 +Ldzgahd|Nghdadj|TX|9362326329 +Ocqgahd|Smhdadj|TX|9362356776 +Nuwgahd|Pdhdadj|TX|6822956989 +Mbegahd|Nxhdadj|TX|9361311719 +Odugahd|Tbhdadj|TX|9362756776 +Abegahd|Axhdadj|TX|2541356710 +Mbigahd|Nshdadj|TX|9365355759 +Padgahd|Tyhdadj|TX|9360350767 +Abfgahd|Awhdadj|TX|2542356710 +Mckgahd|Nihdadj|TX|9367387779 +Pbfgahd|Twhdadj|TX|9362352767 +Abggahd|Auhdadj|TX|2543356710 +Mcngahd|Oghdadj|TX|9362031080 +Pbggahd|Tuhdadj|TX|9363353767 +Abigahd|Ashdadj|TX|2545356710 +Mcogahd|Oahdadj|TX|9362152181 +Pcjgahd|Uphdadj|TX|9366356767 +Acjgahd|Bphdadj|TX|2546356710 +Mdtgahd|Onhdadj|TX|9362657686 +Pckgahd|Uihdadj|TX|9367357767 +Acngahd|Bghdadj|TX|2542056701 +Mdugahd|Obhdadj|TX|9362758787 +Pcngahd|Ughdadj|TX|9362056067 +Acogahd|Bahdadj|TX|2542156701 +Mdvgahd|Ochdadj|TX|9362859888 +Pdugahd|Ubhdadj|TX|9362756700 +Acqgahd|Cmhdadj|TX|2542356701 +Nbegahd|Pxhdadj|TX|9361311719 +Pdxgahd|Vehdadj|TX|9362306709 +Acrgahd|Cbhdadj|TX|2542456701 +Nbigahd|Pshdadj|TX|9365355759 +Pdygahd|Vfhdadj|TX|9362316719 +Adsgahd|Cdhdadj|TX|2542556701 +Nclgahd|Qbhdadj|TX|9369368789 +Rbggahd|Vuhdadj|TX|9363356700 +Adugahd|Cbhdadj|TX|2542756701 +Ncngahd|Qghdadj|TX|9362031080 +Rbigahd|Vshdadj|TX|9365356700 +Adwgahd|Ddhdadj|TX|2542956711 +Ncqgahd|Qmhdadj|TX|9362354383 +Rcjgahd|Vphdadj|TX|9366356700 +Adzgahd|Dghdadj|TX|2542326711 +Ndsgahd|Qdhdadj|TX|9362556585 +Sbfgahd|Xwhdadj|TX|9362326706 +Bbggahd|Euhdadj|TX|2543353711 +Ndxgahd|Rehdadj|TX|9360306109 +Sbggahd|Xuhdadj|TX|9363336706 +Bbhgahd|Ethdadj|TX|2544354711 +Obhgahd|Rthdadj|TX|9364356776 +Sbigahd|Xshdadj|TX|9365356740 +Bbigahd|Eshdadj|TX|2545355711 +Ocpgahd|Skhdadj|TX|9362256776 +Scngahd|Xghdadj|TX|9362051740 +Bcngahd|Fghdadj|TX|2542056000 +Ocrgahd|Sbhdadj|TX|9362456776 +Scpgahd|Ykhdadj|TX|9362253740 +Bdtgahd|Gnhdadj|TX|2542656600 +Odsgahd|Sdhdadj|TX|9362556776 +Scqgahd|Ymhdadj|TX|9362354740 +Bdxgahd|Hehdadj|TX|2542306709 +Odvgahd|Tchdadj|TX|9362856776 +Sdzgahd|Yghdadj|TX|9362326333 +Bdygahd|Hfhdadj|TX|2542316719 +Odxgahd|Tehdadj|TX|9362306767 +Ubggahd|Zuhdadj|TX|9363333733 +Cbfgahd|Iwhdadj|TX|2542356712 +Odygahd|Tfhdadj|TX|9362316767 +Ubhgahd|Zthdadj|TX|9364344733 +Cbggahd|Iuhdadj|TX|2543356712 +Odzgahd|Tghdadj|TX|9362326767 +Uckgahd|Zihdadj|TX|9367387733 +Ccngahd|Jghdadj|TX|2542056721 +Pbegahd|Txhdadj|TX|9361351767 +Ucngahd|Aghdadj|TX|9362031033 +Cdtgahd|Knhdadj|TX|2542656721 +Pbigahd|Tshdadj|TX|9365355767 +Ucogahd|Aahdadj|TX|9362152133 +Cdugahd|Kbhdadj|TX|2542756721 +Pclgahd|Ubhdadj|TX|9368358767 +Ucrgahd|Abhdadj|TX|9362455433 +Cdvgahd|Lchdadj|TX|2542856721 +Pcmgahd|Uxhdadj|TX|9369359767 +Udsgahd|Adhdadj|TX|9362556533 +Cdygahd|Lfhdadj|TX|2542316722 +Pcpgahd|Ukhdadj|TX|9362259367 +Udwgahd|Adhdadj|TX|9362956933 +Dadgahd|Myhdadj|TX|2540306722 +Pdsgahd|Udhdadj|TX|9362559360 +Udzgahd|Bghdadj|TX|9362326329 +Dbegahd|Mxhdadj|TX|2541316722 +Pdwgahd|Udhdadj|TX|9362956900 +Vbfgahd|Bwhdadj|TX|9362322729 +Dbfgahd|Mwhdadj|TX|2542326722 +Pdzgahd|Vghdadj|TX|9362326729 +Vcjgahd|Bphdadj|TX|9366376769 +Dcjgahd|Nphdadj|TX|2546376722 +Radgahd|Vyhdadj|TX|9360356700 +Vcmgahd|Cxhdadj|TX|9369359799 +Dcmgahd|Nxhdadj|TX|2549350732 +Rbhgahd|Vthdadj|TX|9364356700 +Vcpgahd|Ckhdadj|TX|9362253282 +Dcngahd|Nghdadj|TX|2542051732 +Rcngahd|Wghdadj|TX|9362056700 +Vdxgahd|Cehdadj|TX|9360306109 +Dcpgahd|Nkhdadj|TX|2542253732 +Rcpgahd|Wkhdadj|TX|9362256706 +Vdygahd|Cfhdadj|TX|9361316219 +Ddxgahd|Pehdadj|TX|2542306145 +Rcrgahd|Wbhdadj|TX|9362456706 +Vdzgahd|Cghdadj|TX|9362326329 +Ddygahd|Pfhdadj|TX|2542316245 +Rdugahd|Wbhdadj|TX|9362756706 +Wadgahd|Dyhdadj|TX|9360300709 +Ddzgahd|Pghdadj|TX|2542326345 +Rdvgahd|Wchdadj|TX|9362856706 +Wbggahd|Duhdadj|TX|9363333739 +Ebggahd|Ruhdadj|TX|2543333745 +Rdxgahd|Wehdadj|TX|9362306706 +Wcjgahd|Dphdadj|TX|9366376769 +Ecpgahd|Tkhdadj|TX|2542253245 +Rdygahd|Wfhdadj|TX|9362316706 +Wcmgahd|Dxhdadj|TX|9369359799 +Ecqgahd|Tmhdadj|TX|2542354345 +Rdzgahd|Wghdadj|TX|9362326706 +Wdvgahd|Echdadj|TX|9362859888 +Edsgahd|Tdhdadj|TX|2542559369 +Sadgahd|Xyhdadj|TX|9360306706 +Wdygahd|Efhdadj|TX|9361316219 +Edtgahd|Unhdadj|TX|2542657609 +Sbegahd|Xxhdadj|TX|9361316706 +Xbegahd|Exhdadj|TX|9361356790 +Edxgahd|Uehdadj|TX|2542306109 +Sbhgahd|Xthdadj|TX|9364346706 +Xbfgahd|Ewhdadj|TX|9362356790 +Fbegahd|Vxhdadj|TX|2541311719 +Sckgahd|Xihdadj|TX|9367386740 +Xbggahd|Euhdadj|TX|9363356790 +Fbggahd|Vuhdadj|TX|2543333739 +Sclgahd|Xbhdadj|TX|9369366740 +Xbhgahd|Ethdadj|TX|9364356790 +Fbhgahd|Vthdadj|TX|2544344749 +Scogahd|Yahdadj|TX|9362152740 +Xcjgahd|Ephdadj|TX|9366356790 +Fckgahd|Wihdadj|TX|2547387779 +Sdsgahd|Ydhdadj|TX|9362556740 +Xcngahd|Fghdadj|TX|9362056790 +Fcogahd|Wahdadj|TX|2542152181 +Sdvgahd|Ychdadj|TX|9362859740 +Xdsgahd|Fdhdadj|TX|9362556779 +Fdsgahd|Xdhdadj|TX|2542556585 +Sdwgahd|Ydhdadj|TX|9362956040 +Xdugahd|Fbhdadj|TX|9362756779 +Fdugahd|Xbhdadj|TX|2542758787 +Sdxgahd|Yehdadj|TX|9362306140 +Xdygahd|Ffhdadj|TX|9362316779 +Fdvgahd|Xchdadj|TX|2542859888 +Ubfgahd|Zwhdadj|TX|9362322733 +Yadgahd|Gyhdadj|TX|9360350779 +Fdwgahd|Xdhdadj|TX|2542956989 +Ucjgahd|Zphdadj|TX|9366376733 +Ybegahd|Gxhdadj|TX|9361351779 +Fdxgahd|Xehdadj|TX|2540306109 +Ucpgahd|Akhdadj|TX|9362253233 +Ybfgahd|Gwhdadj|TX|9362352779 +Gbfgahd|Ywhdadj|TX|2542322729 +Udvgahd|Achdadj|TX|9362859833 +Ybhgahd|Gthdadj|TX|9364354779 +Gbhgahd|Ythdadj|TX|2544344749 +Udygahd|Bfhdadj|TX|9362316219 +Ycjgahd|Gphdadj|TX|9366356779 +Gclgahd|Zbhdadj|TX|2549368789 +Vadgahd|Byhdadj|TX|9360300709 +Yclgahd|Gbhdadj|TX|9368358744 +Gcqgahd|Zmhdadj|TX|2542354383 +Vbegahd|Bxhdadj|TX|9361311719 +Ycpgahd|Gkhdadj|TX|9362256244 +Gcrgahd|Zbhdadj|TX|2542455484 +Vbhgahd|Bthdadj|TX|9364344749 +Ydtgahd|Hnhdadj|TX|9362656644 +Gdvgahd|Achdadj|TX|2542859888 +Vbigahd|Bshdadj|TX|9365355759 +Ydwgahd|Hdhdadj|TX|9362956944 +Gdygahd|Afhdadj|TX|2541316219 +Vckgahd|Bihdadj|TX|9367387779 +Ydxgahd|Hehdadj|TX|9362306709 +Hbegahd|Bxhdadj|TX|5121356799 +Vclgahd|Bbhdadj|TX|9369368789 +Ydygahd|Hfhdadj|TX|9362316719 +Hbfgahd|Bwhdadj|TX|5122356799 +Vcqgahd|Cmhdadj|TX|9362354383 +Ydzgahd|Hghdadj|TX|9362326729 +Hdugahd|Cbhdadj|TX|5122756767 +Vdugahd|Cbhdadj|TX|9362758787 +Zadgahd|Hyhdadj|TX|9360356744 +Iadgahd|Dyhdadj|TX|5120350767 +Vdvgahd|Cchdadj|TX|9362859888 +Zbfgahd|Hwhdadj|TX|9362356744 +Ibhgahd|Dthdadj|TX|5124354778 +Vdwgahd|Cdhdadj|TX|9362956989 +Zbhgahd|Hthdadj|TX|9364356766 +Icjgahd|Dphdadj|TX|5126356778 +Wbfgahd|Dwhdadj|TX|9362322729 +Zcjgahd|Iphdadj|TX|9366356766 +Iclgahd|Ebhdadj|TX|5128358778 +Wbhgahd|Dthdadj|TX|9364344749 +Zcmgahd|Ixhdadj|TX|9369356766 +Icmgahd|Exhdadj|TX|5129359778 +Wcogahd|Dahdadj|TX|9362152181 +Zdvgahd|Jchdadj|TX|9362856751 +Idygahd|Gfhdadj|TX|5122316719 +Wcpgahd|Dkhdadj|TX|9362253282 +Kedgahd|Jyhdadj|TX|9360306751 +Idzgahd|Gghdadj|TX|5122326729 +Wcqgahd|Emhdadj|TX|9362354383 +Keegahd|Jxhdadj|TX|9361316751 +Jbggahd|Guhdadj|TX|5123356701 +Wdugahd|Ebhdadj|TX|9362758787 +Kehgahd|Jthdadj|TX|9364346751 +Jbhgahd|Gthdadj|TX|5124356701 +Wdxgahd|Eehdadj|TX|9360306109 +Kelgahd|Jbhdadj|TX|9369366751 +Jcjgahd|Gphdadj|TX|5126356701 +Xbigahd|Eshdadj|TX|9365356790 +Keqgahd|Kmhdadj|TX|9362354762 +Jcmgahd|Hxhdadj|TX|5129356701 +Xckgahd|Eihdadj|TX|9367356790 +Ketgahd|Knhdadj|TX|9362657762 +Jcngahd|Hghdadj|TX|5122056755 +Xcmgahd|Fxhdadj|TX|9369356790 +Kezgahd|Kghdadj|TX|9362326362 +Jdtgahd|Inhdadj|TX|5122656755 +Xcpgahd|Fkhdadj|TX|9362256779 +Liggahd|Luhdadj|TX|9363333762 +Jdvgahd|Ichdadj|TX|5122856755 +Xdvgahd|Fchdadj|TX|9362856779 +Likgahd|Lihdadj|TX|9367387762 +Jdwgahd|Idhdadj|TX|5122956755 +Xdwgahd|Fdhdadj|TX|9362956779 +Lilgahd|Lbhdadj|TX|9369368762 +Kckgahd|Jihdadj|TX|5127386704 +Xdxgahd|Fehdadj|TX|9362306779 +Lipgahd|Lkhdadj|TX|9362253288 +Kcngahd|Jghdadj|TX|5122051704 +Ybigahd|Gshdadj|TX|9365355779 +Liygahd|Mfhdadj|TX|9362316219 +Kcogahd|Kahdadj|TX|5122152704 +Yckgahd|Gihdadj|TX|9367357779 +Moegahd|Mxhdadj|TX|9361311719 +Kdvgahd|Kchdadj|TX|5122859766 +Ycogahd|Gahdadj|TX|9362156144 +Moggahd|Muhdadj|TX|9363333739 +Kdwgahd|Ldhdadj|TX|5122956066 +Ycqgahd|Gmhdadj|TX|9362356344 +Mohgahd|Mthdadj|TX|9364344749 +Ladgahd|Lyhdadj|TX|5120300766 +Ydsgahd|Hdhdadj|TX|9362556544 +Momgahd|Nxhdadj|TX|9369359799 +Lbggahd|Luhdadj|TX|5123333729 +Ydvgahd|Hchdadj|TX|9362856844 +Moqgahd|Nmhdadj|TX|9362354383 +Lbhgahd|Lthdadj|TX|5124344729 +Zbegahd|Hxhdadj|TX|9361356744 +Motgahd|Nnhdadj|TX|9362657686 +Lcjgahd|Lphdadj|TX|5126376729 +Zcogahd|Iahdadj|TX|9362156766 +Movgahd|Nchdadj|TX|9362859888 +Lclgahd|Mbhdadj|TX|5129368729 +Zcpgahd|Ikhdadj|TX|9362256766 +Mozgahd|Oghdadj|TX|9362326329 +Lcngahd|Mghdadj|TX|5122051229 +Zdwgahd|Jdhdadj|TX|9362956751 +Nufgahd|Owhdadj|TX|9362322729 +Lcogahd|Mahdadj|TX|5122152129 +Zdygahd|Jfhdadj|TX|9362316751 +Nuggahd|Ouhdadj|TX|9363333739 +Lcpgahd|Mkhdadj|TX|5122253229 +Kefgahd|Jwhdadj|TX|9362326751 +Nuhgahd|Othdadj|TX|9364344749 +Lcrgahd|Mbhdadj|TX|5122455429 +Keigahd|Jshdadj|TX|9365356751 +Nukgahd|Oihdadj|TX|9367387779 +Ldtgahd|Mnhdadj|TX|5122657629 +Kemgahd|Kxhdadj|TX|9369350751 +Nulgahd|Pbhdadj|TX|9369368789 +Ldugahd|Mbhdadj|TX|5122758729 +Kengahd|Kghdadj|TX|9362051751 +Nuxgahd|Qehdadj|TX|9360306109 +Madgahd|Nyhdadj|TX|5120300709 +Kepgahd|Kkhdadj|TX|9362253751 +Nuygahd|Qfhdadj|TX|9361316219 +Mbggahd|Nuhdadj|TX|5123333739 +Kesgahd|Kdhdadj|TX|9362556762 +Mbhgahd|Nthdadj|TX|5124344749 +Kewgahd|Kdhdadj|TX|9362956062 +Mcjgahd|Nphdadj|TX|5126376769 +Kexgahd|Kehdadj|TX|9362306162 +Mcpgahd|Okhdadj|TX|5122253282 +Lidgahd|Lyhdadj|TX|9360300762 +Mdsgahd|Odhdadj|TX|5122556585 +Liegahd|Lxhdadj|TX|9361311762 +Mdwgahd|Pdhdadj|TX|5122956989 +Liigahd|Lshdadj|TX|9365355762 +Mdygahd|Pfhdadj|TX|5121316219 +Lijgahd|Lphdadj|TX|9366376762 +Mdzgahd|Pghdadj|TX|5122326329 +Liqgahd|Lmhdadj|TX|9362354388 +Nadgahd|Pyhdadj|TX|5120300709 +Lirgahd|Mbhdadj|TX|9362455488 +Nbfgahd|Pwhdadj|TX|5122322729 +Litgahd|Mnhdadj|TX|9362657688 +Nbggahd|Puhdadj|TX|5123333739 +Liugahd|Mbhdadj|TX|9362758788 +Nbhgahd|Pthdadj|TX|5124344749 +Lizgahd|Mghdadj|TX|9362326329 +Ncmgahd|Qxhdadj|TX|5129359799 +Modgahd|Myhdadj|TX|9360300709 +Ncogahd|Qahdadj|TX|5122152181 +Mongahd|Nghdadj|TX|9362031080 +Ncpgahd|Qkhdadj|TX|5122253282 +Mopgahd|Nkhdadj|TX|9362253282 +Ndwgahd|Qdhdadj|TX|5122956989 +Mosgahd|Ndhdadj|TX|9362556585 +Oadgahd|Ryhdadj|TX|9360356776 +Mowgahd|Ndhdadj|TX|9362956989 +Obegahd|Rxhdadj|TX|9361356776 +Nudgahd|Oyhdadj|TX|9360300709 +Obfgahd|Rwhdadj|TX|9362356776 +Nujgahd|Ophdadj|TX|9366376769 +Ocjgahd|Sphdadj|TX|9366356776 +Numgahd|Pxhdadj|TX|9369359799 +Ockgahd|Sihdadj|TX|9367356776 +Nungahd|Pghdadj|TX|9362031080 +Ocngahd|Sghdadj|TX|9362056776 +Nuogahd|Pahdadj|TX|9362152181 +Odtgahd|Snhdadj|TX|9362656776 +Nuqgahd|Pmhdadj|TX|9362354383 +Odwgahd|Tdhdadj|TX|9362956776 +Nurgahd|Pbhdadj|TX|9362455484 +Pbhgahd|Tthdadj|TX|9364354767 +Nutgahd|Pnhdadj|TX|9362657686 +Pcogahd|Uahdadj|TX|9362156167 +Nuugahd|Pbhdadj|TX|9362758787 +Pcqgahd|Umhdadj|TX|9362356367 +Nuzgahd|Qghdadj|TX|9362326329 +Pcrgahd|Ubhdadj|TX|9362456467 +Pdtgahd|Unhdadj|TX|9362656600 +Pdvgahd|Uchdadj|TX|9362856800 +Rbegahd|Vxhdadj|TX|9361356700 +Rbfgahd|Vwhdadj|TX|9362356700 +Rckgahd|Vihdadj|TX|9367356700 +Rclgahd|Wbhdadj|TX|9368356700 +Rcmgahd|Wxhdadj|TX|9369356700 +Rcogahd|Wahdadj|TX|9362156700 +Rcqgahd|Wmhdadj|TX|9362356706 +Rdsgahd|Wdhdadj|TX|9362556706 +Rdtgahd|Wnhdadj|TX|9362656706 +Rdwgahd|Wdhdadj|TX|9362956706 +Scjgahd|Xphdadj|TX|9366376740 +Scmgahd|Xxhdadj|TX|9369350740 +Scrgahd|Ybhdadj|TX|9362455740 +Sdtgahd|Ynhdadj|TX|9362657740 +Sdugahd|Ybhdadj|TX|9362758740 +Sdygahd|Yfhdadj|TX|9362316233 +Uadgahd|Zyhdadj|TX|9360300733 +Ubegahd|Zxhdadj|TX|9361311733 +Ubigahd|Zshdadj|TX|9365355733 +Uclgahd|Zbhdadj|TX|9369368733 +Ucmgahd|Axhdadj|TX|9369359733 +Ucqgahd|Amhdadj|TX|9362354333 +Udtgahd|Anhdadj|TX|9362657633 +Udugahd|Abhdadj|TX|9362758733 +Udxgahd|Aehdadj|TX|9362306109 +Vbggahd|Buhdadj|TX|9363333739 +Vcngahd|Cghdadj|TX|9362051280 +Vcogahd|Cahdadj|TX|9362152181 +Vcrgahd|Cbhdadj|TX|9362455484 +Vdsgahd|Cdhdadj|TX|9362556585 +Vdtgahd|Cnhdadj|TX|9362657686 +Wbegahd|Dxhdadj|TX|9361311719 +Wbigahd|Dshdadj|TX|9365355759 +Wckgahd|Dihdadj|TX|9367387779 +Wclgahd|Dbhdadj|TX|9369368789 +Wcngahd|Dghdadj|TX|9362051280 +Wcrgahd|Ebhdadj|TX|9362455484 +Wdsgahd|Edhdadj|TX|9362556585 +Wdtgahd|Enhdadj|TX|9362657686 +Wdwgahd|Edhdadj|TX|9362956989 +Wdzgahd|Eghdadj|TX|9362326329 +Xadgahd|Eyhdadj|TX|5120356790 +Xclgahd|Fbhdadj|TX|5128356790 +Xcogahd|Fahdadj|TX|5122156790 +Xcqgahd|Fmhdadj|TX|5122356779 +Xcrgahd|Fbhdadj|TX|5122456779 +Xdtgahd|Fnhdadj|TX|5122656779 +Xdzgahd|Fghdadj|TX|5122326779 +Ybggahd|Guhdadj|TX|5123353779 +Ycmgahd|Gxhdadj|TX|5129359744 +Ycngahd|Gghdadj|TX|5122056044 +Ycrgahd|Gbhdadj|TX|5122456444 +Ydugahd|Hbhdadj|TX|5122756744 +Zbggahd|Huhdadj|TX|5123356766 +Zbigahd|Ishdadj|TX|5125356766 +Zckgahd|Iihdadj|TX|5127356766 +Zclgahd|Ibhdadj|TX|5128356766 +Zcngahd|Ighdadj|TX|5122056766 +Zcqgahd|Imhdadj|TX|5122356766 +Zcrgahd|Ibhdadj|TX|5122456766 +Zdsgahd|Idhdadj|TX|5122556766 +Zdtgahd|Inhdadj|TX|5122656766 +Zdugahd|Ibhdadj|TX|5122756766 +Zdxgahd|Jehdadj|TX|5122306751 +Zdzgahd|Jghdadj|TX|5122326751 +Keggahd|Juhdadj|TX|5123336751 +Kejgahd|Jphdadj|TX|5126376751 +Kekgahd|Jihdadj|TX|5127386751 +Keogahd|Kahdadj|TX|5122152751 +Kergahd|Kbhdadj|TX|5122455762 +Keugahd|Kbhdadj|TX|5122758762 +Kevgahd|Kchdadj|TX|5122859762 +Keygahd|Kfhdadj|TX|5122319362 +Lifgahd|Lwhdadj|TX|5122322762 +Lihgahd|Lthdadj|TX|5124344762 +Limgahd|Lxhdadj|TX|5129359762 +Lingahd|Lghdadj|TX|5122051288 +Liogahd|Lahdadj|TX|5122152188 +Lisgahd|Mdhdadj|TX|5122556588 +Livgahd|Mchdadj|TX|5122859888 +Liwgahd|Mdhdadj|TX|5122956988 +Lixgahd|Mehdadj|TX|5122306109 +Mofgahd|Mwhdadj|TX|5122322729 +Moigahd|Mshdadj|TX|5125355759 +Mojgahd|Nphdadj|TX|5126376769 +Mokgahd|Nihdadj|TX|5127387779 +Molgahd|Nbhdadj|TX|5129368789 +Moogahd|Nahdadj|TX|5122152181 +Morgahd|Nbhdadj|TX|5122455484 +Mougahd|Nbhdadj|TX|5122758787 +Moxgahd|Nehdadj|TX|5120306109 +Moygahd|Ofhdadj|TX|5121316219 +Nuegahd|Oxhdadj|TX|5121311719 +Nuigahd|Oshdadj|TX|5125355759 +Nupgahd|Pkhdadj|TX|5122253282 +Nusgahd|Pdhdadj|TX|5122556585 +Nuvgahd|Pchdadj|TX|5122859888 +Nuwgahd|Pdhdadj|TX|5122956989 +Abegahd|Axhdadj|TX|9792656710 +Abfgahd|Awhdadj|TX|9792356710 +Abggahd|Auhdadj|TX|9793356710 +Abigahd|Ashdadj|TX|9795356710 +Acjgahd|Bphdadj|TX|9796356710 +Acngahd|Bghdadj|TX|9792056701 +Acogahd|Bahdadj|TX|9792156701 +Acqgahd|Cmhdadj|TX|9792356701 +Acrgahd|Cbhdadj|TX|9792456701 +Adsgahd|Cdhdadj|TX|9792556701 +Adugahd|Cbhdadj|TX|9792756701 +Adwgahd|Ddhdadj|TX|9792956711 +Adzgahd|Dghdadj|TX|9792326711 +Bbggahd|Euhdadj|TX|9793353711 +Bbhgahd|Ethdadj|TX|9794354711 +Bbigahd|Eshdadj|TX|9795355711 +Bcngahd|Fghdadj|TX|9792056000 +Bdtgahd|Gnhdadj|TX|9792656600 +Bdxgahd|Hehdadj|TX|9792306709 +Bdygahd|Hfhdadj|TX|9792316719 +Cbfgahd|Iwhdadj|TX|9792356712 +Cbggahd|Iuhdadj|TX|9793356712 +Ccngahd|Jghdadj|TX|9792056721 +Cdtgahd|Knhdadj|TX|9792656721 +Cdugahd|Kbhdadj|TX|9792756721 +Cdvgahd|Lchdadj|TX|9792856721 +Cdygahd|Lfhdadj|TX|9792316722 +Dadgahd|Myhdadj|TX|9790306722 +Dbegahd|Mxhdadj|TX|9793616722 +Dbfgahd|Mwhdadj|TX|9792326722 +Dcjgahd|Nphdadj|TX|9796376722 +Dcmgahd|Nxhdadj|TX|9799350732 +Dcngahd|Nghdadj|TX|9792051732 +Dcpgahd|Nkhdadj|TX|9792253732 +Ddxgahd|Pehdadj|TX|9792306145 +Ddygahd|Pfhdadj|TX|9792316245 +Ddzgahd|Pghdadj|TX|9792326345 +Ebggahd|Ruhdadj|TX|9793333745 +Ecpgahd|Tkhdadj|TX|9792253245 +Ecqgahd|Tmhdadj|TX|9792354345 +Edsgahd|Tdhdadj|TX|9792559369 +Edtgahd|Unhdadj|TX|9792657609 +Edxgahd|Uehdadj|TX|9792306109 +Fbegahd|Vxhdadj|TX|9793611719 +Fbggahd|Vuhdadj|TX|9793333739 +Fbhgahd|Vthdadj|TX|9794344749 +Fckgahd|Wihdadj|TX|9797387779 +Fcogahd|Wahdadj|TX|9792152181 +Fdsgahd|Xdhdadj|TX|9792556585 +Fdugahd|Xbhdadj|TX|9792758787 +Fdvgahd|Xchdadj|TX|9792859888 +Fdwgahd|Xdhdadj|TX|9792956989 +Fdxgahd|Xehdadj|TX|9790306109 +Gbfgahd|Ywhdadj|TX|9792322729 +Gbhgahd|Ythdadj|TX|9794344749 +Gclgahd|Zbhdadj|TX|9799368789 +Gcqgahd|Zmhdadj|TX|9792354383 +Gcrgahd|Zbhdadj|TX|9792455484 +Gdvgahd|Achdadj|TX|9792859888 +Gdygahd|Afhdadj|TX|9793616219 +Hbegahd|Bxhdadj|TX|9361356799 +Hbfgahd|Bwhdadj|TX|9362356799 +Hdugahd|Cbhdadj|TX|9362756767 +Iadgahd|Dyhdadj|TX|9360350767 +Ibhgahd|Dthdadj|TX|9364354778 +Icjgahd|Dphdadj|TX|9366356778 +Iclgahd|Ebhdadj|TX|9368358778 +Icmgahd|Exhdadj|TX|9369359778 +Idygahd|Gfhdadj|TX|9362316719 +Idzgahd|Gghdadj|TX|9362326729 +Jbggahd|Guhdadj|TX|9363356701 +Jbhgahd|Gthdadj|TX|9364356701 +Jcjgahd|Gphdadj|TX|9366356701 +Jcmgahd|Hxhdadj|TX|9369356701 +Jcngahd|Hghdadj|TX|9362056755 +Jdtgahd|Inhdadj|TX|9362656755 +Jdvgahd|Ichdadj|TX|9362856755 +Jdwgahd|Idhdadj|TX|9362956755 +Kckgahd|Jihdadj|TX|9367386704 +Kcngahd|Jghdadj|TX|9362051704 +Kcogahd|Kahdadj|TX|9362152704 +Kdvgahd|Kchdadj|TX|9362859766 +Kdwgahd|Ldhdadj|TX|9362956066 +Ladgahd|Lyhdadj|TX|9360300766 +Lbggahd|Luhdadj|TX|9363333729 +Lbhgahd|Lthdadj|TX|9364344729 +Lcjgahd|Lphdadj|TX|9366376729 +Lclgahd|Mbhdadj|TX|9369368729 +Lcngahd|Mghdadj|TX|9362031029 +Lcogahd|Mahdadj|TX|9362152129 +Lcpgahd|Mkhdadj|TX|9362253229 +Lcrgahd|Mbhdadj|TX|9362455429 +Ldtgahd|Mnhdadj|TX|9362657629 +Ldugahd|Mbhdadj|TX|9362758729 +Madgahd|Nyhdadj|TX|9360300709 +Mbggahd|Nuhdadj|TX|9363333739 +Mbhgahd|Nthdadj|TX|9364344749 +Mcjgahd|Nphdadj|TX|9366376769 +Mcpgahd|Okhdadj|TX|9362253282 +Mdsgahd|Odhdadj|TX|9362556585 +Mdwgahd|Pdhdadj|TX|9362956989 +Mdygahd|Pfhdadj|TX|9361316219 +Mdzgahd|Pghdadj|TX|9362326329 +Nadgahd|Pyhdadj|TX|9360300709 +Nbfgahd|Pwhdadj|TX|9362322729 +Nbggahd|Puhdadj|TX|9363333739 +Nbhgahd|Pthdadj|TX|9364344749 +Ncmgahd|Qxhdadj|TX|9369359799 +Ncogahd|Qahdadj|TX|9362152181 +Ncpgahd|Qkhdadj|TX|9362253282 +Ndwgahd|Qdhdadj|TX|9362956989 +Oadgahd|Ryhdadj|TX|9360356776 +Obegahd|Rxhdadj|TX|9361356776 +Obfgahd|Rwhdadj|TX|9362356776 +Ocjgahd|Sphdadj|TX|9366356776 +Ockgahd|Sihdadj|TX|9367356776 +Ocngahd|Sghdadj|TX|9362056776 +Odtgahd|Snhdadj|TX|9362656776 +Odwgahd|Tdhdadj|TX|9362956776 +Pbhgahd|Tthdadj|TX|9364354767 +Pcogahd|Uahdadj|TX|9362156167 +Pcqgahd|Umhdadj|TX|9362356367 +Pcrgahd|Ubhdadj|TX|9362456467 +Pdtgahd|Unhdadj|TX|9362656600 +Pdvgahd|Uchdadj|TX|9362856800 +Rbegahd|Vxhdadj|TX|9361356700 +Rbfgahd|Vwhdadj|TX|9362356700 +Rckgahd|Vihdadj|TX|9367356700 +Rclgahd|Wbhdadj|TX|9368356700 +Rcmgahd|Wxhdadj|TX|9369356700 +Rcogahd|Wahdadj|TX|9362156700 +Rcqgahd|Wmhdadj|TX|9362356706 +Rdsgahd|Wdhdadj|TX|9362556706 +Rdtgahd|Wnhdadj|TX|9362656706 +Rdwgahd|Wdhdadj|TX|9362956706 +Scjgahd|Xphdadj|TX|9366376740 +Scmgahd|Xxhdadj|TX|9369350740 +Scrgahd|Ybhdadj|TX|9362455740 +Sdtgahd|Ynhdadj|TX|9362657740 +Sdugahd|Ybhdadj|TX|9362758740 +Sdygahd|Yfhdadj|TX|9362316233 +Uadgahd|Zyhdadj|TX|9360300733 +Ubegahd|Zxhdadj|TX|9361311733 +Ubigahd|Zshdadj|TX|9365355733 +Uclgahd|Zbhdadj|TX|9369368733 +Ucmgahd|Axhdadj|TX|9369359733 +Ucqgahd|Amhdadj|TX|9362354333 +Udtgahd|Anhdadj|TX|9362657633 +Udugahd|Abhdadj|TX|9362758733 +Udxgahd|Aehdadj|TX|9362306109 +Vbggahd|Buhdadj|TX|9363333739 +Vcngahd|Cghdadj|TX|9362031080 +Vcogahd|Cahdadj|TX|9362152181 +Vcrgahd|Cbhdadj|TX|9362455484 +Vdsgahd|Cdhdadj|TX|9362556585 +Vdtgahd|Cnhdadj|TX|9362657686 +Wbegahd|Dxhdadj|TX|9361311719 +Wbigahd|Dshdadj|TX|9365355759 +Wckgahd|Dihdadj|TX|9367387779 +Wclgahd|Dbhdadj|TX|9369368789 +Wcngahd|Dghdadj|TX|9362031080 +Wcrgahd|Ebhdadj|TX|9362455484 +Wdsgahd|Edhdadj|TX|9362556585 +Wdtgahd|Enhdadj|TX|9362657686 +Wdwgahd|Edhdadj|TX|9362956989 +Wdzgahd|Eghdadj|TX|9362326329 +Xadgahd|Eyhdadj|TX|9360356790 +Xclgahd|Fbhdadj|TX|9368356790 +Xcogahd|Fahdadj|TX|9362156790 +Xcqgahd|Fmhdadj|TX|9362356779 +Xcrgahd|Fbhdadj|TX|9362456779 +Xdtgahd|Fnhdadj|TX|9362656779 +Xdzgahd|Fghdadj|TX|9362326779 +Ybggahd|Guhdadj|TX|9363353779 +Ycmgahd|Gxhdadj|TX|9369359744 +Ycngahd|Gghdadj|TX|9362056044 +Ycrgahd|Gbhdadj|TX|9362456444 +Ydugahd|Hbhdadj|TX|9362756744 +Zbggahd|Huhdadj|TX|9363356766 +Zbigahd|Ishdadj|TX|9365356766 +Zckgahd|Iihdadj|TX|9367356766 +Zclgahd|Ibhdadj|TX|9368356766 +Zcngahd|Ighdadj|TX|9362056766 +Zcqgahd|Imhdadj|TX|9362356766 +Zcrgahd|Ibhdadj|TX|9362456766 +Zdsgahd|Idhdadj|TX|9362556766 +Zdtgahd|Inhdadj|TX|9362656766 +Zdugahd|Ibhdadj|TX|9362756766 +Zdxgahd|Jehdadj|TX|9362306751 +Zdzgahd|Jghdadj|TX|9362326751 +Keggahd|Juhdadj|TX|9363336751 +Kejgahd|Jphdadj|TX|9366376751 +Kekgahd|Jihdadj|TX|9367386751 +Keogahd|Kahdadj|TX|9362152751 +Kergahd|Kbhdadj|TX|9362455762 +Keugahd|Kbhdadj|TX|9362758762 +Kevgahd|Kchdadj|TX|9362859762 +Keygahd|Kfhdadj|TX|9362319362 +Lifgahd|Lwhdadj|TX|9362322762 +Lihgahd|Lthdadj|TX|9364344762 +Limgahd|Lxhdadj|TX|9369359762 +Lingahd|Lghdadj|TX|9362031088 +Liogahd|Lahdadj|TX|9362152188 +Lisgahd|Mdhdadj|TX|9362556588 +Livgahd|Mchdadj|TX|9362859888 +Liwgahd|Mdhdadj|TX|9362956988 +Lixgahd|Mehdadj|TX|9362306109 +Mofgahd|Mwhdadj|TX|9362322729 +Moigahd|Mshdadj|TX|9365355759 +Mojgahd|Nphdadj|TX|9366376769 +Mokgahd|Nihdadj|TX|9367387779 +Molgahd|Nbhdadj|TX|9369368789 +Moogahd|Nahdadj|TX|9362152181 +Morgahd|Nbhdadj|TX|9362455484 +Mougahd|Nbhdadj|TX|9362758787 +Moxgahd|Nehdadj|TX|9360306109 +Moygahd|Ofhdadj|TX|9361316219 +Nuegahd|Oxhdadj|TX|9361311719 +Nuigahd|Oshdadj|TX|9365355759 +Nupgahd|Pkhdadj|TX|9362253282 +Nusgahd|Pdhdadj|TX|9362556585 +Nuvgahd|Pchdadj|TX|9362859888 +Nuwgahd|Pdhdadj|TX|9362956989 diff --git a/src/test/singlenode_regress/data/real_city.data b/src/test/singlenode_regress/data/real_city.data new file mode 100644 index 00000000000..79d7a6caba0 --- /dev/null +++ b/src/test/singlenode_regress/data/real_city.data @@ -0,0 +1,5 @@ +0 Oakland ((-122,37.9),(-121.7,37.9),(-121.7,37.4),(-122,37.4)) +0 Oakland ((-121.7,37.4),(-121.7,37),(-122.1,37),(-122.1,37.3),(-122,37.3),(-122,37.4)) +0 Oakland ((-122.1,37.3),(-122.2,37.5),(-122,37.5)) +0 Berkeley ((-122.3,37.9),(-122,37.9),(-122,37.6),(-122.3,37.6)) +0 Lafayette ((-122.3,37.4),(-122.2,37.4),(-122.2,37),(-122.3,37)) diff --git a/src/test/singlenode_regress/data/rect.data b/src/test/singlenode_regress/data/rect.data new file mode 100644 index 00000000000..e32b6fe2513 --- /dev/null +++ b/src/test/singlenode_regress/data/rect.data @@ -0,0 +1,3378 @@ +(12699,9028,12654,8987) +(22689,4680,22614,4626) +(43263,47296,43217,47217) +(6184,8397,6182,8379) +(863,28537,788,28456) +(33783,4733,33746,4693) +(40456,47134,40426,47087) +(45950,8153,45887,8060) +(33433,36474,33399,36460) +(41106,22017,41086,21962) +(19214,36781,19179,36767) +(11582,40823,11498,40737) +(35565,5404,35546,5360) +(26489,17387,26405,17356) +(30874,13849,30796,13814) +(38255,1619,38227,1593) +(4445,32006,4405,31914) +(3923,32921,3876,32913) +(36054,39464,36032,39434) +(46540,6780,46524,6758) +(12184,45811,12118,45787) +(13198,17090,13143,17051) +(30939,44578,30865,44486) +(12502,4939,12431,4902) +(3250,1108,3169,1063) +(34029,41240,33976,41180) +(47057,44018,46967,43927) +(699,10114,686,10058) +(5925,26020,5845,25979) +(9462,39388,9382,39388) +(270,32616,226,32607) +(3959,49145,3861,49115) +(207,40886,179,40879) +(48480,43312,48412,43233) +(37183,37209,37161,37110) +(13576,13505,13521,13487) +(5877,1037,5818,1036) +(6777,16694,6776,16692) +(49362,13905,49299,13845) +(29356,14606,29313,14562) +(5492,6976,5441,6971) +(288,49588,204,49571) +(36698,37213,36682,37158) +(718,41336,645,41272) +(8725,23369,8660,23333) +(40115,9894,40025,9818) +(40051,41181,40015,41153) +(5739,1740,5715,1731) +(25120,27935,25054,27876) +(27475,46084,27447,46003) +\N +(33197,3252,33161,3245) +(10892,15691,10869,15662) +(39012,44712,38995,44640) +(4506,6484,4458,6459) +(13970,26316,13964,26236) +(28009,28104,27968,28030) +(5991,27613,5906,27607) +(23649,6338,23610,6314) +(25942,10008,25911,9928) +(25651,29943,25590,29906) +\N +(24555,40334,24546,40330) +(46870,43762,46789,43709) +\N +(20030,2752,19945,2687) +(30758,26754,30718,26678) +\N +(4320,44673,4286,44625) +\N +(1011,15576,939,15574) +(41936,40699,41854,40655) +(20594,19002,20561,18995) +(9388,41056,9325,41042) +(34771,46693,34751,46645) +(49398,46359,49332,46357) +\N +(23115,35380,23036,35306) +(46305,34840,46283,34765) +(16768,21692,16691,21647) +(28695,3128,28654,3112) +(22182,7107,22107,7074) +(14567,1210,14468,1139) +(14156,37139,14136,37119) +(33500,38351,33477,38286) +(39983,41981,39944,41954) +(26773,20824,26719,20813) +(42516,22947,42460,22932) +(26127,10701,26044,10650) +(17808,13803,17724,13710) +(14913,49873,14849,49836) +(37013,820,36955,736) +(39071,1399,39022,1381) +\N +(9785,42546,9687,42540) +(13423,14066,13354,14052) +(3417,14558,3336,14478) +(25212,46368,25128,46316) +(10124,39848,10027,39820) +(39722,39226,39656,39162) +(6298,28101,6250,28076) +(45852,5846,45809,5750) +(48292,4885,48290,4841) +(18905,4454,18894,4424) +(18965,43474,18902,43444) +(39843,28239,39761,28199) +(18087,44660,18019,44632) +(33886,10382,33794,10286) +(38383,13163,38362,13092) +(18861,25050,18842,24965) +(29887,14326,29806,14274) +(18733,11644,18698,11644) +(5119,37952,5089,37950) +(16191,34884,16149,34864) +(29544,1104,29496,1062) +(27740,41555,27701,41540) +(4672,4087,4633,4060) +(45441,38994,45377,38958) +(3272,1176,3232,1146) +(12820,26606,12790,26575) +(30910,7590,30877,7512) +(42476,39152,42377,39127) +(6562,38490,6542,38447) +(30046,20332,29988,20259) +(40723,15950,40671,15949) +(4945,46857,4908,46817) +(47986,16882,47963,16877) +(9842,22339,9805,22305) +(29831,23169,29818,23122) +(12322,34404,12250,34312) +(22846,11091,22759,10992) +(47627,2424,47603,2397) +(18375,43632,18347,43577) +(40441,974,40394,965) +(34260,10573,34194,10522) +(32914,9549,32828,9503) +(49023,37827,48978,37799) +(22183,10691,22111,10669) +\N +(38036,15828,38014,15759) +(34604,16801,34508,16746) +(26737,29997,26675,29976) +(47375,40298,47293,40210) +(771,2661,732,2649) +(28514,25659,28504,25577) +(13438,46494,13376,46455) +(7187,17877,7125,17786) +(49957,43390,49897,43384) +(26543,20067,26482,20057) +(16416,29803,16385,29724) +(36353,7484,36286,7414) +(26498,3377,26415,3358) +(28990,32205,28936,32193) +(45005,3842,45001,3816) +(21672,23566,21603,23566) +(33360,43465,33302,43429) +\N +(29884,9544,29838,9520) +\N +(5599,15012,5596,14930) +(22396,21481,22344,21422) +(24810,14955,24780,14887) +(47114,18866,47081,18784) +(39013,39245,38953,39237) +(12863,40534,12803,40529) +(351,37068,310,37019) +\N +(12916,34327,12891,34240) +\N +(49191,2694,49170,2628) +(24127,38407,24050,38325) +(3264,23053,3213,23007) +(8172,30385,8144,30336) +(19630,35716,19573,35640) +(42554,5148,42521,5117) +(42168,33453,42136,33426) +(17732,32093,17666,32057) +(1039,16626,1037,16587) +(21287,7757,21265,7679) +(47063,8260,47039,8225) +(38645,16238,38561,16204) +(18258,25358,18196,25341) +(30458,1742,30458,1695) +(35147,9273,35121,9233) +(7670,16625,7642,16545) +(49503,23432,49484,23383) +(31089,23146,31062,23093) +(47758,2734,47670,2703) +\N +(35276,1027,35259,972) +(26337,17603,26313,17579) +(35649,16777,35626,16777) +(42454,5105,42362,5101) +(21682,24951,21646,24920) +\N +(48383,25174,48303,25156) +(14672,3532,14601,3460) +(22570,22587,22515,22512) +(23566,25623,23484,25573) +(9530,24542,9504,24459) +(41271,451,41236,401) +(5556,37528,5502,37527) +(12479,25042,12447,24991) +(16568,22916,16499,22864) +(42700,13084,42676,12992) +\N +(35523,40973,35504,40932) +(32948,16962,32857,16901) +(7808,13469,7712,13469) +(13920,35203,13870,35131) +(22731,31563,22658,31557) +\N +(22909,43956,22900,43857) +(33077,35080,33074,35030) +(48064,29307,48022,29280) +(20232,46682,20212,46613) +(29949,16790,29867,16711) +(30260,32029,30180,31979) +(17184,34503,17110,34482) +(16066,42687,16039,42648) +(2947,19819,2857,19788) +(4900,47934,4818,47894) +(27193,19014,27174,18976) +\N +(15597,27948,15590,27939) +(11090,28623,11002,28589) +(26956,18651,26920,18620) +(3107,47753,3103,47711) +(6745,24151,6711,24083) +(43923,19213,43871,19124) +(33451,23578,33370,23534) +(8944,20605,8862,20601) +(14905,7536,14892,7441) +(2412,18357,2383,18354) +(37060,1443,36974,1366) +(15501,6230,15429,6190) +\N +(30333,50,30273,6) +(35567,9965,35482,9912) +(49847,7128,49798,7067) +\N +(27685,36396,27668,36384) +(43832,18491,43825,18431) +(36849,34600,36785,34589) +(2348,47938,2307,47902) +\N +(20473,22131,20445,22113) +(38486,4293,38471,4288) +(30611,30451,30553,30400) +(3883,21299,3819,21260) +(7696,37555,7644,37534) +(22399,7913,22317,7911) +(42565,38605,42500,38598) +(36595,12151,36500,12106) +(587,35217,571,35123) +(5764,15300,5764,15231) +(12003,21265,11983,21210) +(42564,4803,42470,4737) +(42359,36834,42271,36746) +(44700,14680,44658,14670) +(19690,5627,19620,5607) +(17780,43602,17714,43565) +(45073,3491,45041,3434) +(35043,2136,35017,2084) +\N +(39653,19215,39646,19198) +(23970,25560,23935,25502) +(28698,49233,28600,49223) +(30266,3605,30245,3540) +(25538,7857,25500,7791) +(17711,1757,17708,1756) +(5248,594,5190,587) +(2730,32454,2671,32436) +(1722,49089,1635,49067) +(40954,5743,40921,5722) +\N +(21382,4426,21298,4331) +(7885,18629,7872,18605) +(42838,6459,42748,6451) +(8217,19894,8207,19845) +(20489,18524,20433,18520) +(17383,23559,17309,23515) +(38952,38968,38934,38913) +(44665,18137,44636,18051) +(22416,41220,22383,41213) +(9901,664,9818,646) +(23475,21981,23449,21973) +(41875,17991,41818,17988) +(36517,47731,36509,47713) +(37595,49849,37581,49834) +(38771,32720,38748,32684) +(810,38523,736,38452) +(29695,14942,29665,14907) +(31911,15168,31906,15113) +(3454,36839,3438,36831) +(4832,47554,4820,47473) +\N +(11590,8292,11539,8272) +(8193,33323,8106,33317) +(16043,14799,16001,14710) +(19574,11395,19514,11316) +(26290,41424,26224,41342) +(22844,12516,22807,12471) +\N +(15709,49580,15655,49553) +(13387,28084,13379,28066) +(2780,38807,2690,38711) +(22031,32458,22028,32377) +(13511,3351,13440,3297) +(14648,26473,14614,26383) +(17798,19885,17726,19852) +(32355,27940,32324,27861) +(43773,21031,43767,20985) +(15419,45759,15403,45666) +(770,38863,729,38806) +(21221,35619,21183,35596) +(38924,31021,38894,30961) +(7395,32439,7345,32416) +(2324,25118,2268,25074) +(2958,15089,2935,15087) +(2424,160,2424,81) +(12123,18644,12099,18616) +(7459,30276,7422,30218) +(15847,45488,15814,45428) +(26409,29897,26389,29863) +(12336,34322,12279,34322) +(9440,23550,9396,23466) +(4991,30850,4905,30768) +(47262,11940,47201,11939) +(30584,42868,30555,42838) +(23144,24089,23056,24067) +\N +(35930,11609,35847,11573) +(7812,17271,7789,17203) +(17946,37554,17878,37480) +(27356,32869,27298,32813) +(29971,47783,29933,47697) +(26075,46494,25988,46451) +(39314,41366,39289,41269) +(31708,42900,31688,42865) +(4510,10231,4439,10203) +(43806,8482,43758,8446) +(45990,49694,45927,49617) +(48815,27640,48782,27573) +(41675,26733,41622,26723) +(23229,7709,23175,7693) +(48976,17733,48962,17731) +(10686,41470,10597,41434) +(18053,27059,17989,27012) +\N +(35495,25950,35459,25912) +(41896,45014,41881,44999) +(22654,41896,22572,41801) +(18581,7087,18524,6988) +\N +(14697,22406,14681,22311) +(40092,28122,40043,28030) +(35844,24243,35816,24238) +(1254,25653,1250,25644) +(1603,21730,1556,21640) +(33048,21779,32991,21763) +(29979,1632,29916,1592) +(8620,633,8580,620) +(22992,27035,22932,27008) +(21409,29315,21390,29309) +(3610,44748,3547,44699) +(20402,9318,20343,9267) +(31001,8709,30908,8658) +(46840,47640,46773,47551) +(49173,4705,49143,4630) +(5339,31657,5251,31622) +(8644,49668,8630,49648) +(45387,2893,45309,2885) +(47641,31020,47584,30941) +(40238,10636,40208,10568) +(19247,36924,19227,36924) +(917,19957,827,19887) +(40967,17841,40870,17820) +(15850,4109,15794,4085) +(20181,30916,20085,30870) +(161,24465,107,24374) +(21737,49690,21667,49663) +(10328,20911,10232,20852) +(24187,49823,24128,49768) +(36084,4578,36007,4501) +(38771,31741,38673,31674) +(2202,30102,2111,30006) +(27322,16074,27228,16039) +(6843,17280,6765,17248) +(16972,39744,16912,39700) +(10608,38741,10553,38708) +\N +(4917,34801,4828,34766) +(39281,33659,39268,33618) +(31706,7119,31645,7063) +(3427,44006,3422,44004) +\N +(10134,42608,10044,42599) +(26294,32080,26200,32068) +(21777,34680,21769,34606) +(23373,25957,23314,25915) +(10710,8401,10681,8400) +(42062,19458,42019,19394) +(26530,43036,26458,43004) +(3394,46081,3360,46077) +(38743,33953,38677,33924) +(32438,8226,32345,8160) +(9210,27333,9118,27301) +(19594,1600,19568,1551) +(10003,12278,9952,12255) +(31737,7206,31650,7146) +(16594,15821,16502,15759) +(28208,30296,28189,30278) +(30602,46237,30555,46185) +(20715,5155,20697,5140) +(48892,35271,48793,35210) +(3175,5590,3113,5525) +(34220,27947,34132,27865) +(35105,39792,35011,39727) +(21919,27314,21839,27286) +\N +(23963,3723,23917,3699) +(16312,14078,16236,14045) +(19233,49824,19185,49794) +(1447,11768,1356,11699) +(17311,17709,17224,17653) +(11962,31709,11871,31627) +(21355,40131,21355,40085) +(33750,35273,33724,35180) +(38896,25539,38879,25524) +(39569,44899,39569,44893) +(11075,41547,11039,41500) +(3215,12202,3199,12127) +(46215,33458,46132,33455) +(15121,38012,15083,37974) +(44448,18726,44412,18690) +(3899,38263,3870,38262) +(13854,13353,13786,13298) +(8252,5402,8191,5320) +(46849,37968,46820,37897) +(16422,13957,16376,13897) +(47369,7665,47353,7629) +(11982,40874,11956,40806) +\N +(9552,27580,9496,27562) +(32247,19399,32176,19337) +(32704,2169,32635,2091) +(7471,44213,7411,44130) +(48433,7096,48379,7089) +(37357,6543,37338,6452) +(30460,29624,30433,29535) +(20350,28794,20341,28705) +(6326,32360,6267,32317) +(1711,47519,1654,47430) +(49540,16510,49521,16426) +\N +(26975,618,26908,579) +(24118,30880,24020,30821) +(3675,15477,3625,15418) +(44953,9577,44953,9530) +(38323,7965,38235,7910) +(6629,36482,6579,36448) +(33953,16460,33878,16408) +(49222,16790,49186,16695) +(17308,16951,17274,16904) +(14135,6888,14077,6833) +(38617,47768,38603,47760) +(7345,10992,7290,10914) +(35261,42152,35176,42096) +(28586,4809,28544,4735) +(37521,25299,37495,25217) +(41941,17954,41912,17915) +(1209,46863,1171,46863) +(20103,34947,20048,34896) +(32716,33816,32656,33769) +(11113,6531,11036,6467) +(48635,7321,48563,7262) +(28435,37059,28349,37014) +(12311,17208,12232,17112) +(1466,48010,1379,48008) +(11226,11997,11223,11925) +(46896,32540,46821,32510) +(32661,31255,32632,31187) +(37739,20376,37655,20306) +(44002,43326,43920,43257) +(30337,1023,30271,968) +(34436,23357,34432,23345) +\N +(21367,8168,21353,8091) +(36370,21611,36369,21569) +(4152,36488,4080,36476) +(17696,13924,17664,13853) +(34252,19395,34159,19316) +(12574,3072,12573,2975) +(3995,21243,3943,21167) +(44553,30126,44513,30108) +\N +(4599,45275,4552,45254) +(33191,11404,33176,11348) +\N +(14245,18633,14177,18540) +(32457,20705,32393,20700) +(40052,10499,40016,10457) +(29824,44065,29785,44037) +(31613,12565,31557,12543) +(42692,29000,42652,28996) +\N +(40680,22219,40603,22140) +\N +(33575,27661,33488,27644) +(46194,1385,46184,1355) +(38442,48501,38407,48426) +(25305,21544,25236,21523) +(15562,8226,15561,8208) +\N +(20844,43614,20752,43558) +(22566,30541,22554,30532) +(2760,47802,2672,47789) +(25515,30745,25433,30675) +(48382,45134,48382,45093) +(9940,27094,9871,27087) +\N +(48690,44361,48610,44338) +(18992,11585,18899,11582) +(21551,49983,21492,49885) +(46778,29113,46770,29071) +(43219,9593,43212,9548) +(40291,1248,40224,1190) +(12687,22225,12635,22219) +(49372,38790,49306,38721) +(49503,46808,49411,46798) +(24745,5162,24732,5138) +(5046,26517,5023,26424) +(5583,46538,5495,46531) +(6084,35950,6079,35895) +(3503,23096,3437,23024) +\N +(45275,8420,45244,8418) +(13514,45251,13491,45249) +(42112,2748,42047,2668) +\N +(7810,21907,7806,21878) +(48378,36029,48303,35979) +(32568,48605,32510,48563) +(859,18915,810,18915) +(41963,17950,41939,17915) +\N +(42723,8031,42685,7955) +\N +(19587,5965,19556,5961) +(8713,33083,8629,32996) +(21243,7769,21226,7740) +(43752,43026,43720,42944) +(7883,41311,7859,41242) +(10178,47874,10157,47826) +(32177,48725,32093,48646) +(22960,2784,22953,2774) +(25101,49159,25087,49090) +(32142,48915,32086,48850) +(6636,44887,6590,44825) +(37814,11606,37769,11578) +(2870,23198,2820,23121) +(21025,16364,20947,16271) +(31341,36137,31269,36114) +(38921,7906,38888,7831) +(6966,17259,6922,17199) +(32426,13344,32401,13253) +(8084,30572,8078,30572) +(42230,47674,42150,47603) +(20724,44854,20724,44830) +(27471,38453,27454,38430) +(24590,37973,24544,37941) +(45832,26077,45772,26031) +(9589,24239,9582,24156) +(37484,49472,37409,49432) +(30044,19340,30004,19333) +(16966,14632,16936,14572) +(9439,40491,9403,40482) +(28945,5814,28913,5805) +(43788,41302,43746,41231) +(33631,43451,33614,43354) +(17590,49396,17510,49324) +(15173,32572,15109,32507) +(1912,23580,1840,23504) +(38165,16185,38076,16154) +(6729,1179,6637,1177) +\N +(6994,45406,6983,45325) +(2912,21327,2908,21305) +(14678,14244,14659,14222) +(29944,14959,29898,14900) +(47432,35658,47407,35610) +(25542,39243,25466,39149) +(5330,7206,5304,7165) +(24790,27196,24695,27118) +(38806,1961,38795,1906) +(23290,4487,23212,4416) +\N +(35035,24337,34990,24297) +(5549,38948,5549,38891) +(24558,15492,24501,15425) +(4636,3011,4574,2933) +(26522,39986,26451,39940) +(33486,18424,33410,18366) +(36638,14324,36625,14287) +(35115,41236,35055,41191) +(31927,16896,31841,16806) +(5796,43937,5697,43886) +(25681,41645,25663,41608) +(10962,42777,10894,42732) +(32715,11026,32672,10991) +(45803,20406,45710,20371) +(34730,17672,34658,17606) +(8809,6323,8798,6232) +\N +(39471,23837,39390,23749) +\N +(34078,17435,33987,17433) +(9133,4544,9041,4509) +(47274,29126,47242,29060) +(6404,28488,6403,28475) +(48894,49751,48846,49694) +(17324,43023,17301,42972) +(15599,8433,15557,8386) +(48575,10202,48488,10175) +(27638,24428,27608,24378) +(45277,47456,45240,47422) +(26482,46607,26482,46570) +(41400,33898,41397,33802) +\N +(49853,18504,49848,18503) +(11528,25165,11476,25080) +(49902,41752,49818,41746) +(1956,47506,1922,47424) +(21834,22058,21802,21964) +\N +(19414,21842,19386,21822) +(34801,13722,34744,13681) +(13924,29243,13835,29160) +(47749,21986,47664,21894) +(47051,39582,46974,39489) +(31287,49923,31236,49913) +(47429,8625,47337,8585) +(46987,44364,46901,44277) +(16158,27510,16099,27467) +(41184,6400,41148,6317) +(1847,42471,1829,42426) +\N +(14409,48602,14320,48555) +\N +(38137,42951,38045,42918) +(42875,2312,42832,2243) +(27242,30617,27181,30535) +(24882,44559,24812,44548) +(22021,1596,22015,1581) +(24300,1523,24250,1443) +(43946,35909,43869,35868) +(816,15988,776,15967) +(25243,9401,25237,9332) +(27967,25958,27928,25949) +(6575,33949,6484,33900) +(44812,35980,44800,35913) +(37577,13064,37495,13019) +\N +(30891,29967,30814,29884) +(15829,28836,15753,28807) +(11128,34180,11126,34117) +(9834,12537,9801,12508) +(4899,29069,4809,29024) +(29370,38459,29276,38382) +(40743,46653,40647,46559) +(9618,2723,9578,2631) +(32542,26837,32515,26769) +(5625,13409,5576,13355) +(47490,19229,47472,19203) +(48118,40275,48063,40203) +(19245,20549,19227,20546) +(25312,22243,25280,22164) +(18797,28934,18723,28881) +(31609,49393,31512,49366) +(26183,32888,26135,32824) +(46198,26153,46180,26149) +\N +(45383,16904,45353,16888) +(7132,11408,7091,11338) +(48262,43227,48236,43159) +(31722,12861,31675,12810) +\N +(41695,48924,41691,48921) +(48318,12877,48287,12802) +(12069,32241,11978,32231) +(8395,2694,8380,2661) +(19552,34590,19550,34497) +(12203,26166,12187,26143) +(35745,9571,35654,9542) +(22384,22535,22352,22439) +(21459,28189,21360,28189) +(7418,7203,7343,7182) +(39497,48412,39413,48318) +(1058,11132,979,11051) +(45623,31417,45548,31381) +\N +(23887,31921,23876,31891) +(7797,1244,7785,1155) +(23679,43650,23594,43644) +(21891,30561,21833,30485) +(4069,6870,4019,6785) +(5134,25117,5103,25034) +(36101,41895,36085,41810) +(39617,39211,39544,39191) +(37437,6604,37434,6585) +\N +(7749,32601,7740,32515) +(26203,34991,26159,34946) +(31856,39006,31783,39003) +(45828,24767,45788,24723) +\N +(49836,35965,49757,35871) +(44113,49024,44033,48995) +(38237,22326,38187,22253) +(45235,19087,45190,19005) +(1588,45285,1520,45254) +(46628,8701,46552,8665) +(47707,18258,47668,18250) +(9377,26162,9325,26079) +(28331,16766,28302,16731) +(15792,27875,15727,27809) +(16454,1972,16415,1967) +(21012,15828,20972,15784) +(27465,30603,27390,30560) +(39256,7697,39225,7604) +(25908,32801,25854,32770) +(25215,40109,25201,40106) +\N +(23280,4613,23190,4596) +(32440,30879,32405,30807) +(49156,4224,49126,4126) +(20005,40423,19911,40370) +(20978,8226,20930,8170) +(32127,22611,32126,22579) +(21764,26509,21701,26455) +\N +(32923,2834,32914,2830) +(7499,25331,7426,25300) +(6163,36942,6107,36908) +(41118,14583,41034,14486) +(21211,33369,21208,33331) +(7899,27682,7853,27603) +(16546,48436,16535,48400) +(24898,40195,24855,40174) +(43029,982,43004,952) +(26266,7962,26252,7950) +\N +(11308,44367,11210,44322) +(8902,28402,8808,28334) +(11671,19619,11665,19549) +(47202,23593,47153,23505) +(21981,40220,21905,40160) +(46721,2514,46687,2471) +(3450,33839,3424,33811) +(41854,45864,41762,45792) +(40183,47816,40114,47742) +(26119,33910,26077,33816) +(3430,16518,3365,16500) +(40063,32176,40005,32166) +(38702,15253,38679,15187) +(17719,12291,17658,12257) +(46131,30669,46068,30587) +(42738,10952,42731,10907) +(8721,45155,8650,45076) +(45317,26123,45244,26113) +(42694,11561,42614,11490) +(10043,12479,10009,12391) +(27584,2345,27578,2257) +(30889,8253,30866,8167) +\N +(5176,48928,5107,48838) +(9781,21023,9745,20976) +(32430,27908,32404,27859) +(3984,7391,3973,7352) +(18904,8094,18842,8091) +(20573,5508,20482,5496) +(7806,44368,7753,44297) +(18875,41452,18817,41376) +(6632,12142,6566,12079) +(33066,17865,33055,17854) +(45726,19628,45714,19589) +(26971,18459,26941,18423) +(26554,23641,26515,23592) +(45503,1325,45441,1231) +(11898,20164,11880,20115) +(27868,22837,27843,22776) +(34931,8206,34855,8144) +(42375,33603,42350,33539) +(3184,8308,3129,8238) +(26667,15813,26661,15785) +\N +(5760,49617,5730,49546) +(794,27001,777,26992) +(13518,45289,13459,45235) +\N +(34430,29754,34363,29736) +(37912,24574,37880,24543) +(8130,2270,8083,2258) +\N +(26930,21516,26848,21455) +(3634,33511,3592,33489) +(33080,5036,33035,4972) +(48389,13942,48316,13915) +(9231,5298,9150,5232) +(1357,10601,1321,10548) +\N +(35175,15295,35091,15269) +(33917,36863,33879,36784) +(8279,12052,8239,12021) +(11868,19083,11862,19034) +(24019,30777,24006,30703) +(44619,6959,44618,6938) +(28610,2626,28523,2582) +(29579,41801,29482,41775) +(23448,37609,23396,37534) +(40676,11252,40670,11191) +(39656,14077,39564,13999) +(33060,31042,33033,30950) +(11720,6816,11654,6792) +(13775,28873,13730,28868) +(47851,39121,47802,39084) +(30923,40255,30860,40199) +(44169,15070,44085,15015) +(42574,28664,42558,28590) +(8993,43487,8941,43460) +(40782,11648,40763,11631) +(18516,10143,18423,10137) +(39068,551,39005,491) +\N +(39672,12000,39575,11913) +(18508,37761,18464,37712) +(19083,35318,19079,35280) +(30286,13736,30222,13672) +(7223,9164,7132,9069) +(20764,29286,20700,29210) +(5733,8063,5699,8058) +(8566,43873,8549,43797) +(22126,27444,22062,27366) +(15105,8717,15078,8660) +(43987,33145,43940,33083) +\N +(46833,38652,46755,38612) +(47768,27202,47681,27169) +(22792,1183,22731,1152) +(25650,43310,25562,43247) +(37084,20116,37045,20057) +(47461,32556,47423,32555) +\N +(41225,18124,41215,18117) +(17623,25218,17553,25158) +(13770,21703,13770,21700) +(48958,35441,48870,35388) +(2976,1808,2892,1802) +(45118,22318,45049,22224) +(42287,26616,42281,26560) +(25525,6327,25468,6244) +\N +(40756,31634,40713,31568) +(23105,26565,23078,26565) +(48268,39862,48265,39827) +(41656,26254,41567,26243) +(28062,17920,28045,17825) +(6443,17321,6402,17238) +(10191,45466,10151,45447) +(18097,39706,18043,39649) +(37592,3244,37569,3197) +(29809,5978,29762,5950) +(12145,11251,12130,11202) +(37507,42999,37446,42956) +(10820,2866,10782,2830) +(36440,42904,36421,42832) +(38370,3386,38279,3311) +(9345,17279,9313,17197) +(20477,14864,20395,14807) +(37147,37769,37110,37729) +(15325,36135,15284,36053) +(29034,32897,29009,32854) +(2116,22274,2037,22216) +(15078,38330,15048,38251) +(7968,33600,7914,33573) +(832,23851,770,23786) +(38669,4348,38594,4344) +(8521,48573,8425,48564) +(1060,43320,969,43289) +(26170,10150,26144,10069) +(32324,8539,32285,8506) +(13121,18044,13109,18021) +(1597,9383,1594,9367) +(49539,35164,49505,35065) +(39464,10295,39409,10261) +(8921,37898,8825,37803) +(31171,47076,31093,47039) +(7178,41397,7108,41304) +(16240,34832,16162,34761) +(2829,20119,2782,20091) +(45854,21265,45810,21250) +(6382,12106,6315,12030) +(22301,46291,22291,46274) +(34142,14181,34078,14158) +(11258,29748,11198,29742) +\N +(37450,6943,37398,6882) +(41675,27207,41643,27130) +(13578,49562,13573,49479) +(37132,37397,37081,37301) +(49404,37193,49332,37170) +(33536,31809,33444,31735) +(45990,42751,45893,42708) +(38852,20510,38802,20509) +(27453,15836,27391,15802) +(9347,29004,9284,28946) +(44871,27727,44778,27668) +(14978,19646,14970,19644) +(23243,47091,23166,47080) +(45204,21431,45167,21370) +(14082,22316,14078,22235) +(42778,22694,42744,22606) +(4834,25241,4760,25196) +(20497,18110,20494,18038) +(45738,35524,45706,35496) +(21575,5151,21493,5092) +(2194,10052,2172,9960) +\N +(47735,24472,47682,24460) +(46740,35700,46695,35609) +(24647,42807,24568,42779) +(18000,30576,17975,30506) +(48638,46630,48544,46628) +(48508,33600,48477,33578) +(38703,45408,38670,45313) +(21712,15015,21625,14956) +(5840,42007,5768,41992) +(44011,11138,43953,11117) +(3899,33262,3897,33238) +(30142,23967,30096,23927) +(36950,13226,36908,13141) +(13130,26915,13071,26873) +(38576,35408,38539,35392) +(16776,46244,16700,46176) +(38251,25969,38168,25948) +\N +(3512,32256,3417,32242) +(31923,31225,31832,31197) +(5144,4969,5124,4937) +(34499,46164,34430,46162) +\N +(39432,31907,39388,31828) +(17316,24606,17221,24533) +(20751,49352,20709,49323) +(41673,30418,41623,30377) +(29026,24400,28971,24345) +(21929,30617,21894,30598) +(35539,12421,35536,12355) +(24938,45583,24870,45525) +\N +(27442,33090,27353,33064) +(23949,12046,23949,12036) +(11399,377,11360,294) +(47099,9989,47023,9942) +(641,33118,639,33084) +(13687,41308,13682,41290) +\N +(3682,17727,3645,17660) +(13262,19396,13185,19357) +(18791,389,18774,366) +(12489,45384,12403,45369) +\N +(12065,6364,12015,6325) +\N +(32705,23886,32619,23827) +\N +(7004,37333,6911,37240) +(28594,38078,28530,38050) +(5805,21797,5710,21701) +(41145,18905,41058,18873) +(35599,10002,35591,9956) +(5387,39087,5326,38994) +(11703,14003,11671,13912) +(4093,10472,4091,10470) +\N +(14110,49740,14063,49695) +(4170,470,4097,463) +(22219,17296,22164,17221) +(2505,20879,2446,20842) +\N +(47235,24744,47151,24667) +(30035,23234,30013,23197) +(3489,11659,3461,11607) +(38435,46322,38429,46230) +(12315,32880,12277,32854) +(33350,35297,33317,35263) +(18845,37671,18836,37589) +(24855,23554,24783,23520) +(48251,44461,48188,44408) +(17695,43353,17605,43286) +(4964,21292,4893,21270) +(33919,29907,33852,29878) +(29139,40010,29084,39957) +(41611,37750,41572,37741) +(41773,34717,41682,34700) +(8225,7424,8221,7363) +(1785,28248,1771,28219) +(21553,36307,21505,36257) +(7552,18199,7527,18119) +\N +(14410,30977,14349,30944) +\N +(20940,49142,20901,49069) +(36892,5522,36810,5478) +(40192,20926,40179,20926) +(44702,15182,44641,15117) +(43431,4921,43337,4827) +(41129,21654,41084,21642) +(6205,42785,6113,42722) +(23714,10224,23666,10205) +(9318,35175,9274,35139) +(40698,12676,40618,12627) +(49954,1340,49905,1294) +(32774,33062,32763,33062) +(4336,22183,4241,22157) +(10241,47657,10151,47592) +(6746,16718,6666,16634) +(26842,49694,26839,49680) +(34870,47437,34820,47347) +(26365,22266,26326,22183) +(39859,932,39829,840) +(33995,10888,33902,10793) +(32972,22342,32951,22340) +\N +(19951,10161,19932,10111) +(26779,45188,26745,45151) +(11235,13593,11184,13589) +(27334,20968,27288,20953) +(9586,43102,9488,43085) +(43935,49759,43925,49680) +(10548,37032,10474,36955) +(9326,14927,9295,14848) +(41340,11312,41311,11303) +(6500,44553,6454,44515) +\N +(8198,26841,8104,26749) +(47761,34183,47702,34140) +(43637,17912,43577,17910) +(17623,11138,17590,11122) +(48122,13132,48077,13060) +(27911,39796,27908,39777) +(1108,7918,1080,7832) +(18776,24329,18699,24326) +(1171,37901,1075,37871) +(38437,33948,38364,33907) +(1913,11593,1817,11533) +(22684,266,22656,181) +(13299,17075,13241,17074) +(6924,30196,6851,30113) +\N +(4367,13150,4298,13053) +(37381,6101,37380,6046) +(10307,28383,10270,28349) +(12283,8636,12256,8610) +(20230,32775,20144,32723) +(32942,12812,32905,12714) +(46140,7138,46140,7047) +(37235,29436,37161,29425) +(42486,25454,42478,25444) +(47860,46973,47842,46961) +(41760,21026,41662,20955) +(29663,20088,29566,20026) +(19167,33241,19101,33235) +(12306,37845,12301,37803) +(11288,873,11203,857) +(30309,5120,30282,5060) +(46927,19737,46856,19687) +(16664,20052,16649,19989) +(7330,8675,7296,8613) +(45067,45724,44991,45631) +(45317,10862,45218,10842) +(15012,47009,14998,46956) +(47882,10146,47813,10099) +(31571,46215,31511,46148) +(32257,2619,32187,2531) +(38924,41305,38872,41285) +(49981,34876,49898,34786) +(30501,35099,30418,35011) +\N +(45862,41438,45854,41434) +(38448,31878,38391,31822) +(8278,43463,8274,43378) +(5883,30629,5878,30564) +(49501,40346,49447,40275) +(31651,43116,31560,43106) +(44244,32940,44244,32926) +\N +(17941,18079,17938,18035) +(9518,32524,9470,32511) +(30707,43469,30686,43457) +(3284,46542,3187,46477) +(43423,29642,43393,29602) +(19940,16825,19877,16736) +(26194,47446,26194,47407) +(30386,24675,30333,24652) +(42707,44466,42688,44456) +\N +(43395,18525,43320,18467) +(28346,32259,28276,32196) +(45106,40786,45026,40767) +(36734,20414,36722,20363) +(37140,11569,37099,11475) +(8967,6409,8882,6341) +(31036,27923,30993,27890) +(22442,47682,22347,47663) +(32511,24029,32482,23970) +(22593,34444,22519,34399) +(41534,15495,41518,15455) +\N +(35862,19997,35818,19928) +(31419,8323,31404,8285) +(31036,19023,30978,19000) +(46900,15192,46891,15102) +(12774,9651,12765,9604) +(49985,6436,49927,6338) +(7184,47344,7089,47285) +(12792,45021,12740,45011) +(15019,27192,14940,27096) +(35415,23106,35381,23095) +(42129,14283,42095,14245) +(29375,45807,29347,45743) +(21763,24916,21700,24889) +(47656,8794,47579,8774) +(6139,49571,6059,49472) +(44492,45607,44483,45532) +(22699,4301,22628,4240) +(27407,24241,27335,24158) +\N +(38424,34460,38403,34458) +(46572,48456,46554,48402) +(39676,29056,39643,28981) +(4202,33076,4107,33010) +(32499,10592,32482,10575) +(22504,45417,22459,45378) +(49619,40322,49619,40268) +(14463,9305,14426,9224) +(10070,20300,10035,20211) +(35060,28561,34965,28553) +(23970,47522,23887,47428) +(46803,19155,46790,19131) +\N +(46151,49848,46058,49830) +(45266,40766,45209,40738) +(31041,32195,31007,32110) +(41401,17245,41334,17224) +(37445,654,37435,602) +(45568,31904,45508,31857) +(29326,7923,29285,7896) +(27078,34643,27027,34606) +(34492,43443,34437,43345) +(34109,4307,34083,4265) +(2755,45325,2727,45312) +(12571,24218,12536,24195) +(41224,2454,41149,2445) +(711,34828,655,34788) +(9104,18865,9036,18850) +(3508,26816,3456,26771) +(20159,16212,20116,16160) +(36871,7425,36777,7421) +(2751,45244,2734,45222) +(35867,28071,35769,28052) +(46878,35730,46850,35725) +(20610,35086,20513,35037) +(3903,32612,3887,32517) +(9330,40226,9289,40169) +(6338,28242,6329,28184) +(35668,18344,35606,18304) +(29892,48927,29878,48879) +(26999,646,26932,612) +(36377,38898,36338,38847) +(40289,31459,40236,31436) +(30377,1164,30306,1069) +(7642,12183,7590,12112) +(40325,1716,40296,1662) +(36412,38787,36318,38691) +(3967,33268,3923,33261) +(33914,40774,33873,40763) +(45978,41431,45963,41332) +(39195,12546,39120,12520) +(29962,30878,29941,30846) +(9365,10732,9310,10726) +(28801,23943,28740,23885) +(28934,38858,28928,38807) +(22126,45897,22068,45803) +(2923,33832,2918,33751) +(25116,2276,25083,2272) +(31174,14546,31144,14460) +(11728,9072,11658,9004) +(19804,49195,19730,49125) +(23090,28826,23010,28787) +(33989,27553,33947,27486) +(39702,47613,39641,47553) +(31397,3607,31304,3519) +(5835,9262,5791,9226) +(40112,37022,40038,36926) +(12346,29356,12282,29344) +(28503,9623,28469,9591) +(38449,43143,38378,43066) +(36950,37311,36905,37265) +(34824,5729,34818,5706) +(9288,26969,9225,26900) +(2535,42176,2478,42159) +(29098,49051,29085,49031) +(44759,33326,44727,33230) +(42849,2970,42821,2919) +(46014,27193,45985,27151) +(14506,13713,14417,13626) +(19342,44905,19332,44895) +(38178,37003,38147,36925) +(29179,27310,29084,27288) +(42713,10158,42671,10060) +(43336,38389,43290,38326) +(41260,34410,41245,34327) +(27907,2695,27830,2596) +(16309,44972,16222,44966) +(6230,22262,6214,22249) +\N +(9266,39458,9175,39447) +(33120,33548,33087,33538) +(43659,11416,43599,11375) +(49707,39258,49702,39159) +(23520,22140,23486,22072) +(24736,46502,24668,46412) +(7826,16851,7730,16807) +(39114,6048,39056,5965) +(11859,8753,11764,8701) +(42254,48367,42240,48328) +(26136,49185,26056,49175) +(38395,11209,38334,11137) +(33249,9425,33209,9348) +(22131,38502,22112,38460) +(5306,24344,5267,24268) +(30292,1198,30233,1149) +(9903,10896,9850,10806) +(25568,22911,25487,22868) +(22048,43391,22043,43362) +(20852,25827,20851,25766) +(35204,17119,35114,17093) +(5575,43431,5554,43410) +(17727,13623,17678,13560) +(14721,29520,14709,29461) +(40317,42220,40267,42166) +(31435,31012,31386,30931) +(40655,10103,40645,10006) +(35783,17802,35773,17763) +(34874,10210,34856,10200) +(3694,14279,3610,14239) +(27854,5493,27799,5433) +(34913,7234,34894,7220) +(15758,26445,15738,26421) +(23710,7272,23705,7270) +\N +(33679,13468,33628,13415) +\N +(31271,40495,31178,40461) +(759,187,662,163) +(14419,40434,14402,40381) +(45879,42933,45814,42872) +(167,17214,92,17184) +(9964,12210,9958,12195) +(35834,46257,35817,46211) +(26077,5629,25978,5621) +(46177,44640,46082,44544) +(44780,28753,44707,28692) +(35491,24729,35425,24690) +(33914,34190,33914,34131) +(17709,33253,17668,33227) +(45516,11888,45423,11848) +(24497,24752,24411,24710) +(30333,5952,30331,5886) +(444,12587,430,12497) +(7592,22353,7541,22287) +\N +(13387,37414,13329,37318) +\N +(21504,35227,21449,35210) +(18533,12909,18438,12848) +(41049,27148,41048,27088) +(18205,12222,18151,12140) +(18026,5164,18026,5156) +(34104,29862,34006,29815) +(18520,49686,18454,49602) +(37000,41493,36920,41424) +(43025,25711,42986,25687) +(38620,47018,38535,46934) +(24119,36813,24023,36739) +(48887,26359,48879,26302) +(47827,14625,47810,14609) +(10792,30746,10776,30716) +(30384,40672,30318,40582) +(48417,22790,48358,22746) +(14854,5819,14785,5798) +(19142,44414,19085,44406) +(31179,27081,31145,27005) +\N +(19692,8711,19659,8642) +(39689,14082,39603,14051) +(11181,39091,11119,39002) +(46015,23374,45936,23328) +(12517,49702,12427,49690) +(21926,21137,21841,21111) +(31956,12509,31870,12494) +(5895,2030,5851,2020) +(27094,5447,27014,5377) +(35781,8717,35780,8618) +(14012,12023,13972,12015) +(1702,12442,1696,12419) +(28549,5251,28462,5248) +(26441,21007,26360,20925) +(49820,7990,49771,7967) +(26424,29698,26339,29693) +(35146,6820,35071,6817) +\N +(15438,18788,15435,18729) +(47115,5235,47096,5143) +(33982,9002,33915,8925) +(14206,37041,14174,36955) +(24300,36616,24232,36613) +(44658,1788,44580,1769) +\N +(31539,43550,31463,43464) +\N +(16722,9673,16633,9652) +(44813,20573,44733,20544) +\N +(42114,32559,42040,32552) +(41561,36244,41477,36241) +(39589,33796,39548,33716) +(20365,26770,20329,26709) +(28511,208,28479,114) +(10010,25524,9930,25508) +\N +(1549,45666,1512,45621) +(16193,1927,16166,1869) +(34486,11500,34421,11401) +(14048,37944,13994,37901) +(21692,9594,21617,9496) +(2568,37899,2557,37811) +(4360,24503,4278,24443) +(50027,49230,49951,49214) +(44849,14867,44836,14813) +(16695,34896,16683,34840) +(12600,35217,12593,35129) +(23113,24009,23030,23962) +(49907,30225,49810,30158) +(18026,25208,17970,25208) +(49711,39844,49651,39790) +(5427,42682,5357,42637) +(23901,14221,23802,14184) +(15470,12185,15376,12163) +(47302,34023,47292,34001) +(24336,17418,24315,17393) +(13948,17043,13903,16970) +(8555,8986,8530,8953) +(48830,6038,48743,5986) +(48720,40687,48623,40610) +(21161,30970,21146,30896) +(9507,36316,9411,36261) +\N +(36643,18136,36614,18106) +(1858,7457,1851,7402) +(24452,44306,24372,44252) +\N +(3292,807,3205,806) +(6845,30694,6792,30627) +(21333,25786,21237,25751) +(23008,22574,22999,22511) +(8790,8893,8772,8806) +(43333,47968,43264,47900) +(5377,24103,5302,24076) +(18410,23993,18329,23907) +(24752,19126,24713,19069) +(49772,11378,49696,11293) +(3468,12920,3396,12873) +(1746,40342,1736,40333) +(49187,29737,49139,29681) +(27657,44952,27581,44917) +\N +(35407,30177,35345,30151) +(4071,40568,4058,40544) +(25998,30513,25965,30452) +(8195,45403,8097,45310) +(8276,41689,8183,41670) +\N +(48435,28550,48355,28455) +\N +(8139,25449,8136,25380) +(20302,25574,20297,25531) +\N +(22055,46659,22034,46567) +(3531,49962,3463,49934) +(46828,46938,46739,46902) +(42294,786,42212,739) +(8779,3292,8761,3275) +(48146,46170,48082,46151) +(21571,10000,21531,9919) +(35526,26029,35450,25945) +(38893,22225,38865,22197) +(22189,37520,22132,37497) +(810,43261,751,43198) +(10352,39144,10290,39093) +(8740,35435,8720,35432) +(31657,13551,31583,13484) +(39803,4019,39755,4014) +(46353,7853,46312,7824) +(30078,48975,30021,48970) +(2847,32036,2819,31966) +(25250,10147,25165,10140) +\N +(15643,38953,15585,38947) +(40792,29798,40731,29731) +(43249,26858,43215,26835) +(47229,2199,47201,2134) +(10052,23601,9958,23570) +(38981,21615,38892,21604) +(3651,45004,3570,44917) +(21503,8261,21409,8166) +(13518,34201,13465,34105) +(13899,25117,13836,25114) +(18327,17403,18301,17349) +(19503,13648,19483,13607) +(3554,19487,3529,19466) +(41102,43355,41070,43314) +(4663,45858,4583,45765) +(3971,3023,3931,2975) +(37124,7061,37080,6993) +(48530,47172,48459,47160) +(14575,29843,14509,29750) +(43443,23124,43357,23038) +(8864,48290,8857,48263) +(41597,39852,41577,39791) +(35610,33392,35556,33353) +(36415,17906,36328,17846) +(24919,43933,24839,43883) +(7457,14056,7395,14051) +(43851,4090,43801,4080) +(43567,18468,43471,18388) +(16711,6084,16652,6055) +(45888,45934,45846,45880) +(45630,9313,45585,9248) +(27119,25969,27094,25884) +(36155,11420,36120,11405) +(41880,47111,41808,47049) +\N +(17554,20379,17482,20374) +(38848,5936,38763,5869) +(28324,31019,28276,30944) +(43257,17152,43176,17091) +(42717,24613,42691,24527) +(16786,41486,16763,41403) +(19259,28780,19160,28711) +(25843,28265,25760,28171) +(48645,34816,48546,34755) +(7004,49289,6976,49236) +(30261,21833,30181,21776) +(5290,46672,5219,46661) +(21237,31901,21188,31849) +(23340,38537,23253,38472) +(17269,3682,17183,3586) +\N +(48200,15377,48110,15369) +(16546,22195,16477,22142) +(21436,8460,21378,8449) +\N +(46598,17235,46577,17138) +\N +(30212,36184,30152,36092) +(18037,155,17941,109) +(4945,29201,4933,29184) +(32835,18782,32770,18750) +(34160,33104,34120,33007) +(5151,26989,5149,26909) +(1801,15549,1710,15461) +(48988,34819,48951,34764) +(20904,32547,20856,32497) +\N +(32654,35183,32606,35144) +(14336,11763,14328,11712) +(30546,23808,30463,23773) +(6813,21006,6781,20924) +\N +(14199,22030,14185,21934) +(3783,14709,3747,14658) +(49428,47052,49422,46973) +(29551,27682,29470,27654) +(29170,37260,29151,37181) +(48924,24689,48894,24680) +(48497,34052,48453,33966) +\N +(21263,8203,21242,8176) +(46537,3797,46462,3735) +(18406,14579,18393,14563) +\N +(11583,16529,11536,16471) +(10564,46257,10478,46228) +(49769,34513,49761,34458) +\N +(9202,6482,9138,6391) +(40387,37411,40357,37360) +(11966,11802,11888,11751) +(15551,47438,15486,47406) +(12017,43288,11969,43230) +(9717,22574,9701,22495) +\N +(35083,49443,35075,49355) +(33857,9320,33813,9269) +(32106,10581,32012,10560) +(14345,12485,14273,12424) +(24187,46416,24175,46402) +(43854,42159,43808,42129) +(35399,40707,35359,40646) +(29585,25576,29493,25556) +(24919,7829,24911,7753) +\N +(17049,48390,17022,48304) +(25224,35012,25217,34922) +(47397,20853,47346,20779) +(17221,16558,17181,16516) +(8669,16491,8645,16486) +(23502,44241,23484,44164) +(36169,37046,36072,37010) +(44775,32394,44763,32357) +(30685,36871,30662,36792) +(21783,47642,21714,47630) +(34847,27467,34761,27372) +(43925,49912,43888,49878) +(16455,27861,16364,27813) +(38406,18310,38329,18309) +(5408,9461,5319,9426) +(41856,36900,41784,36854) +(23723,4460,23646,4448) +(18454,40138,18430,40046) +(17505,36822,17418,36763) +(36686,33534,36641,33476) +(11347,9454,11289,9436) +\N +(27816,34752,27745,34736) +(44213,8559,44162,8461) +(45359,26789,45315,26776) +(31249,19475,31224,19421) +(25917,44239,25819,44149) +(47313,40691,47264,40685) +(40577,33848,40513,33794) +(9606,45253,9582,45174) +(30005,24521,29910,24496) +(49332,35375,49309,35299) +\N +(12164,33871,12075,33820) +(19598,43327,19593,43314) +\N +(3818,28584,3815,28504) +\N +(35579,8611,35541,8604) +(8811,20986,8750,20954) +(16139,44777,16128,44686) +(35550,41501,35534,41458) +(43180,11927,43109,11891) +(45798,8465,45711,8460) +(18196,6886,18126,6845) +(1774,32167,1701,32073) +(7030,40790,7029,40711) +(11676,23009,11665,22915) +(33990,22561,33953,22474) +\N +(30366,9447,30284,9353) +(37626,32913,37596,32853) +(7730,42561,7665,42470) +(49347,8403,49315,8387) +(6874,3499,6812,3458) +(44189,16999,44169,16964) +(6312,30167,6231,30083) +(18932,6611,18909,6518) +(32262,13076,32223,13057) +(45989,249,45910,222) +(42710,855,42692,796) +(25562,9849,25535,9802) +(13348,46719,13260,46689) +(30022,42196,30005,42160) +\N +(22263,45954,22243,45950) +(18918,18890,18820,18795) +(31918,12003,31852,11989) +(12252,39453,12211,39398) +(40208,9789,40194,9759) +(35943,21767,35914,21693) +(18439,10706,18383,10618) +(2803,18999,2778,18925) +(14953,27444,14875,27397) +(12587,22025,12545,21928) +(33930,21090,33918,21009) +(10444,2606,10407,2553) +(28700,29782,28665,29703) +\N +(1402,13497,1397,13465) +\N +(24155,3075,24083,3062) +(38378,1864,38339,1849) +(29261,49910,29247,49818) +(38139,37073,38098,37057) +\N +(24468,41130,24418,41053) +(9989,1015,9959,939) +(47001,33561,46994,33518) +(47058,16030,46983,16012) +(35509,1814,35426,1748) +(3630,48019,3597,47923) +(47781,12986,47741,12947) +(16364,9908,16356,9882) +(17290,41508,17287,41410) +(42423,26477,42349,26434) +(10039,920,9952,833) +(16851,21338,16846,21314) +\N +(23104,7700,23062,7688) +(5619,2079,5611,2075) +(31471,49632,31375,49549) +(25793,12526,25783,12456) +(3935,29528,3866,29513) +\N +(5957,1646,5947,1595) +(2467,22376,2429,22349) +(43715,32673,43664,32595) +(6726,13093,6636,12994) +(31477,18347,31421,18299) +(34232,36635,34200,36552) +(49061,14516,49008,14442) +(43996,6129,43955,6074) +(7728,33802,7670,33703) +\N +(6131,36766,6053,36749) +(35791,16361,35696,16329) +(45759,8935,45675,8886) +(43634,2029,43537,1940) +(4916,32233,4844,32181) +(46701,23508,46623,23477) +(29590,4893,29552,4871) +(38647,4423,38574,4396) +(7593,25845,7497,25751) +(8510,43552,8432,43492) +(18791,39181,18730,39162) +(7462,2956,7454,2858) +(1394,26795,1392,26780) +(16707,21993,16609,21932) +(26838,10866,26803,10836) +(31642,29842,31585,29760) +(21891,3502,21863,3406) +(13258,587,13250,507) +(6072,47397,6021,47369) +(16605,49730,16579,49659) +(42830,40981,42791,40981) +(12975,3706,12913,3637) +(30925,21660,30826,21649) +(1455,14229,1410,14156) +\N +(17583,16486,17562,16474) +(33377,3387,33333,3381) +(784,6177,750,6095) +(22111,44110,22106,44013) +(1444,403,1346,344) +(4010,46220,3982,46212) +(17932,8150,17861,8127) +(38685,31466,38636,31416) +(14257,11549,14242,11522) +(14990,15217,14904,15211) +(21395,21533,21307,21520) +\N +(31948,33725,31885,33694) +(433,49033,390,48961) +(45205,609,45173,523) +(25065,35494,25003,35455) +(33265,6677,33224,6611) +(18179,22345,18133,22256) +(3916,13759,3820,13732) +(1696,13478,1604,13436) +(47203,25980,47130,25907) +(24913,13361,24868,13268) +(13824,40177,13792,40130) +(25671,13555,25585,13494) +\N +(20133,37769,20105,37679) +\N +(26368,16734,26288,16726) +(30545,35438,30458,35376) +(48816,22926,48812,22831) +(48807,31389,48739,31330) +(11003,10859,10950,10765) +(17288,8570,17247,8485) +(38377,31415,38331,31379) +\N +(19085,23425,19059,23326) +(40059,17068,40052,17006) +(18811,13493,18734,13394) +(36319,17197,36225,17181) +(14939,38780,14863,38714) +(49539,17656,49479,17629) +(42530,45951,42466,45854) +(27318,26654,27233,26610) +(49980,35004,49937,34963) +(18326,32558,18322,32502) +(45951,28555,45896,28481) +(12104,33531,12014,33501) +(22311,41113,22215,41066) +(25073,18721,25047,18656) +\N +(14524,13486,14510,13390) +(40040,36688,40000,36599) +(21594,11473,21563,11436) +(44031,22274,43938,22187) +(729,30683,668,30601) +(14114,20873,14102,20803) +(28239,41377,28222,41308) +(26404,11922,26317,11843) +(41660,34586,41585,34501) +\N +(21128,2384,21101,2368) +(30209,16952,30156,16858) +(39078,24963,39045,24898) +(5598,1348,5499,1294) +\N +(38474,7436,38450,7364) +(15117,45734,15024,45693) +\N +(23909,39853,23888,39780) +(24292,30183,24282,30148) +(48871,17661,48868,17637) +(918,18752,847,18708) +\N +(43615,16162,43606,16104) +(33763,47410,33751,47409) +(4798,6485,4773,6388) +\N +(18524,41539,18433,41518) +(47745,42449,47651,42364) +(38936,21237,38864,21204) +\N +(5251,3516,5194,3475) +(22269,36269,22183,36228) +(18736,40983,18685,40947) +(38393,15444,38356,15363) +(38134,29898,38103,29862) +(37789,39557,37732,39474) +(31906,23005,31838,23003) +(10647,40094,10560,40040) +(9914,41547,9867,41545) +(44221,443,44125,433) +(41479,10936,41381,10847) +(42586,6301,42563,6235) +(2504,17588,2449,17554) +(7045,18782,7028,18764) +(41840,32018,41768,31938) +(38416,17158,38330,17060) +\N +(8605,39015,8605,38933) +(5764,43548,5719,43496) +\N +(20789,29902,20696,29843) +\N +(36104,47896,36079,47816) +(31736,13834,31722,13832) +(32617,19701,32597,19684) +(1671,18997,1622,18945) +(36007,26545,36005,26535) +(31864,17494,31820,17455) +(27346,28388,27303,28289) +(8191,9653,8133,9589) +(7501,21616,7405,21536) +(35450,9580,35368,9563) +(29281,37276,29247,37255) +(6225,17192,6200,17135) +\N +(43689,8119,43670,8028) +(41917,49601,41835,49563) +(44295,13116,44205,13078) +(22721,44772,22667,44748) +(32640,11107,32636,11050) +(20639,28851,20613,28839) +\N +(32479,10159,32446,10061) +(27251,16978,27196,16959) +(41401,33148,41339,33074) +\N +(49001,8538,48989,8444) +(37958,35843,37874,35802) +(46969,41229,46903,41138) +(18541,8876,18541,8870) +(4080,31634,4061,31627) +(8097,35240,8040,35152) +(18470,21414,18463,21412) +(20914,17897,20838,17869) +(42688,11681,42666,11641) +(47525,25005,47443,24907) +(32439,14438,32397,14400) +\N +(39667,19626,39622,19542) +(1212,44525,1169,44516) +(29766,4433,29668,4401) +(25847,49657,25813,49605) +(33859,17356,33827,17263) +(28989,45953,28904,45854) +(37211,30830,37113,30819) +\N +(45220,26382,45219,26340) +(12312,43250,12234,43246) +(37775,41504,37762,41421) +(45889,33499,45822,33411) +(49461,22601,49369,22553) +(39857,33844,39816,33824) +(46102,15822,46030,15778) +(46605,31239,46598,31170) +(23925,5856,23862,5808) +(15459,4262,15407,4241) +(12019,4907,12015,4818) +(38258,17973,38229,17923) +(40575,29566,40477,29521) +\N +(29715,45919,29697,45891) +(11694,9510,11670,9490) +(7053,44257,7012,44231) +(16465,8603,16391,8505) +(29170,15592,29098,15527) +(20400,37354,20345,37328) +(5281,10265,5252,10184) +(6084,48782,6058,48727) +(11006,6889,10971,6796) +(16299,19461,16286,19411) +(13718,29192,13642,29106) +(3999,2965,3963,2903) +(18509,12235,18430,12208) +(49542,38575,49537,38534) +(15093,41715,15071,41634) +(6802,8385,6714,8300) +(15127,17507,15097,17424) +(36921,3025,36835,2995) +(32117,24327,32101,24262) +(27244,24151,27165,24104) +(36339,42360,36313,42358) +(47288,46252,47245,46184) +(37867,6649,37818,6565) +(14886,22103,14865,22089) +(39611,17952,39513,17951) +(37329,31436,37298,31436) +(5715,39115,5698,39099) +(13266,7364,13203,7296) +(16076,10945,16006,10942) +(7197,41509,7126,41413) +(14411,40868,14330,40772) +(12872,33481,12862,33454) +(17786,19616,17758,19560) +(1052,37358,996,37311) +(42825,12643,42762,12625) +(20007,49858,19921,49778) +(27155,6355,27072,6257) +(14117,40208,14022,40155) +(47280,34069,47279,34028) +(17551,15803,17482,15763) +(1725,6673,1676,6649) +(43984,31128,43961,31105) +(43772,47042,43731,47038) +(46901,47317,46817,47228) +(19877,14179,19837,14168) +(20691,19989,20675,19935) +(4011,18914,3963,18817) +(1023,23378,933,23317) +(30051,46118,29966,46039) +(43499,46488,43496,46409) +\N +(43531,2412,43447,2396) +\N +(16034,32285,15976,32220) +(12817,21365,12740,21298) +(7607,47293,7585,47293) +(32512,12218,32463,12170) +(1848,21496,1839,21439) +(17567,23073,17478,23046) +(35813,31847,35807,31792) +\N +(563,30859,540,30842) +(13145,15488,13063,15433) +(36754,37479,36731,37411) +(1125,26069,1057,25997) +(4539,20676,4519,20618) +(8476,34721,8409,34681) +(7794,25691,7727,25656) +(23842,514,23800,473) +(47678,41396,47668,41365) +(6837,25974,6799,25892) +(13355,11174,13304,11161) +\N +(37243,25548,37158,25471) +(12528,30208,12441,30205) +(14929,1672,14886,1607) +(27263,49026,27263,49010) +(15892,21645,15835,21642) +(29446,48978,29360,48967) +(41304,9892,41211,9825) +(37418,49393,37338,49296) +(41146,32178,41120,32165) +(28738,13326,28722,13266) +(14899,36595,14873,36559) +(1973,31435,1921,31426) +(19485,17742,19421,17661) +(33072,20995,32980,20903) +(47091,30055,47080,30037) +(45753,12998,45686,12992) +\N +(11528,7826,11509,7794) +(21104,13921,21060,13836) +(16768,15491,16747,15470) +(13279,20396,13249,20326) +(4342,49518,4339,49446) +(20413,15476,20349,15447) +(45532,5649,45484,5627) +(18647,27196,18619,27115) +(1326,17473,1261,17400) +(47646,19644,47588,19609) +(35088,1813,35080,1732) +(38461,34839,38410,34838) +(34358,11540,34285,11506) +\N +(26969,7078,26953,6989) +(12629,40352,12617,40264) +(33800,7037,33731,6992) +(24462,13518,24392,13486) +(33164,47357,33096,47329) +(15422,18451,15413,18376) +(19643,12916,19567,12912) +(40860,42125,40770,42050) +(49103,29614,49039,29606) +(36319,35582,36222,35528) +(8924,36083,8873,36018) +(49603,44022,49505,44021) +(7783,40633,7702,40618) +(25388,49107,25346,49042) +(28375,38947,28306,38919) +(47324,22672,47321,22660) +(2287,8808,2266,8719) +(44343,16339,44248,16318) +(2374,28839,2336,28798) +(22913,40710,22819,40688) +\N +(47747,684,47658,627) +(16043,46011,16021,45984) +(34958,32168,34903,32092) +(4840,49328,4752,49258) +(24341,2087,24330,2009) +(18378,19374,18327,19358) +(48165,7217,48156,7141) +(14232,6044,14182,6004) +(23080,4196,22983,4191) +(259,1850,175,1820) +(270,29508,264,29440) +(45088,11375,45050,11295) +(29666,39386,29656,39302) +(8712,8782,8660,8713) +(15900,6650,15855,6561) +(28946,28348,28917,28347) +(32544,25845,32538,25779) +(44047,6957,43951,6942) +(36465,588,36382,503) +\N +(28167,26679,28150,26673) +(16065,4268,15975,4180) +(12950,23494,12893,23494) +(30145,24679,30056,24654) +(3027,16162,3001,16071) +(8259,34537,8202,34484) +(41447,1515,41427,1454) +(18407,28362,18309,28303) +(21393,41872,21328,41816) +(46040,26497,45996,26408) +\N +(49944,25163,49902,25153) +\N +(16195,11843,16159,11831) +(44257,15270,44254,15214) +(49760,4791,49699,4713) +(22558,33709,22519,33681) +(28375,10003,28336,9938) +(18179,24310,18106,24256) +(707,30688,664,30669) +(5851,26118,5822,26037) +(4266,1292,4221,1217) +(16516,11331,16432,11248) +(32374,38277,32313,38245) +(21939,8015,21927,7952) +(34322,32051,34242,32003) +(6262,35977,6260,35953) +(16717,38594,16622,38498) +(14564,3433,14535,3425) +(21078,1000,20994,974) +(28584,956,28575,868) +(5538,9962,5465,9870) +(34183,44102,34175,44085) +\N +(42507,10289,42441,10288) +(12671,19936,12594,19920) +(24835,12179,24770,12173) +(15664,11538,15598,11494) +(28892,24446,28821,24350) +(41654,26720,41570,26632) +(36583,387,36503,357) +(10842,34824,10795,34788) +(11518,42588,11429,42565) +(12577,40322,12486,40266) +(2453,4045,2439,3956) +(31837,33705,31803,33681) +(24403,27711,24383,27705) +(4431,2748,4337,2656) +\N +(3036,2887,3014,2826) +(37664,16118,37615,16022) +(8606,18063,8587,18038) +(24738,25458,24656,25362) +(45756,34022,45671,33948) +(34079,15236,33981,15171) +(9251,22488,9228,22470) +(25136,2809,25126,2717) +(5548,47695,5543,47685) +(13765,40800,13707,40754) +(25216,30678,25144,30677) +(22441,17169,22392,17106) +(1091,4770,1054,4734) +(36311,50073,36258,49987) +(22461,33163,22457,33128) +(35873,28907,35845,28867) +(42907,15848,42904,15785) +(6549,24897,6540,24861) +(21928,37764,21891,37681) +(21237,41132,21139,41086) +(12207,24266,12173,24235) +(40643,49770,40574,49687) +(32833,35686,32815,35674) +\N +(14545,18143,14541,18098) +(33892,42783,33884,42707) +(33933,8381,33921,8369) +(12450,19044,12403,19002) +(10176,45158,10088,45145) +(35828,12080,35732,12022) +(28102,13694,28061,13666) +(49432,31744,49340,31711) +(16192,37743,16162,37697) +(46830,867,46756,790) +(9200,28048,9159,27986) +(13397,19369,13340,19288) +(30879,43562,30785,43545) +(21995,48224,21920,48143) +\N +(11871,47569,11809,47568) +(29366,22196,29280,22154) +(26243,28176,26203,28116) +(28995,35031,28906,35014) +(29384,39276,29352,39183) +(8497,13798,8471,13789) +(7412,27226,7334,27220) +(25403,47678,25363,47654) +(11599,5556,11574,5502) +(44056,5123,44008,5111) +(49603,30877,49579,30840) +(32261,45876,32206,45865) +(35104,41659,35048,41587) +\N +(5457,35844,5376,35782) +(29423,3977,29354,3959) +(18059,3001,17965,2961) +(8509,5691,8463,5620) +\N +(27118,5762,27083,5747) +(2991,48605,2939,48559) +(44482,3484,44425,3459) +(45143,16439,45046,16365) +(2236,37531,2147,37530) +(41561,3217,41490,3210) +\N +(6270,27200,6171,27166) +(49195,24871,49138,24798) +\N +(46985,38881,46897,38845) +(37486,23522,37404,23441) +(26907,14490,26900,14391) +(30829,16111,30756,16056) +(3644,17291,3587,17262) +(20508,49775,20472,49680) +\N +(43279,8972,43198,8936) +(33744,7470,33734,7439) +(46303,20538,46284,20498) +(10365,48246,10291,48154) +(12636,24987,12545,24933) +(40998,46992,40989,46916) +(30536,6073,30531,6018) +(22102,9643,22051,9594) +(18616,34348,18530,34332) +(8222,8907,8123,8848) +(45698,28860,45698,28770) +(26958,1748,26924,1726) +\N +(26735,35073,26659,35025) +(48370,40813,48293,40737) +(13140,993,13108,934) +(10588,22893,10528,22883) +(23645,40789,23567,40698) +(49548,12374,49546,12329) +(41135,39626,41100,39602) +(41374,10856,41328,10769) +(12234,5765,12146,5674) +(12832,46941,12764,46917) +(47886,34532,47851,34500) +(23777,10549,23735,10495) +(1291,16913,1194,16873) +\N +(29239,30554,29202,30500) +\N +(36485,30007,36454,29924) +(7067,11320,7045,11229) +(16939,30482,16904,30462) +(27423,34386,27379,34303) +(35170,32021,35155,31979) +(42570,36477,42474,36457) +(19695,679,19682,594) +(47537,39450,47446,39450) +(19410,22942,19375,22922) +(34216,40166,34152,40158) +(37000,24351,36972,24299) +(24989,1681,24954,1672) +(54,38679,3,38602) +(41461,40693,41411,40599) +(7576,46054,7545,45963) +(35505,28262,35413,28222) +(1158,16976,1145,16927) +(23494,42291,23437,42229) +(32894,32519,32880,32485) +(604,13413,509,13401) +(18396,19712,18355,19646) +\N +(26657,28234,26597,28191) +(24240,47211,24154,47191) +(41778,10741,41766,10730) +(44022,43776,44010,43677) +(35967,30055,35906,29969) +(28878,18042,28806,18027) +(31507,27302,31428,27267) +(13267,21935,13265,21872) +(122,46832,64,46762) +(10348,45916,10306,45844) +(22962,12644,22927,12607) +(6320,22290,6284,22247) +(2297,11372,2216,11298) +(29366,36660,29325,36654) +(13962,39307,13921,39220) +(11094,19151,11092,19143) +(32289,23776,32258,23760) +\N +(36044,17356,35956,17273) +(46304,38692,46232,38675) +(10934,42999,10922,42909) +(4271,21177,4207,21093) +(7837,19926,7747,19905) +(25537,36605,25477,36584) +(22161,14999,22079,14962) +(5127,31243,5074,31213) +\N +(14904,40664,14838,40593) +(29308,8480,29268,8438) +(17731,7410,17699,7352) +(44840,29293,44797,29248) +(15523,31519,15505,31485) +(34429,38479,34421,38478) +(3530,23456,3440,23390) +(4699,6889,4603,6796) +(47405,48524,47389,48514) +\N +(23357,43160,23305,43156) +(16923,1995,16860,1937) +(47592,33853,47537,33758) +(31624,37490,31595,37473) +(42321,13380,42303,13337) +(3088,16094,3079,16060) +(22884,2955,22856,2857) +(17784,23073,17724,23044) +(32638,45577,32553,45512) +(13876,44091,13801,44000) +(27844,24384,27758,24330) +(28178,10225,28155,10167) +(39910,14277,39857,14241) +(30372,19524,30301,19514) +(38732,43151,38724,43151) +(32628,2068,32547,2068) +(13950,28652,13932,28566) +(38996,41070,38919,40993) +(31759,45246,31676,45215) +\N +(5424,34145,5382,34106) +(14727,45600,14699,45547) +\N +(31429,21537,31414,21499) +(14740,3420,14650,3323) +(21793,39498,21743,39471) +(18102,25924,18037,25868) +(33299,683,33213,594) +(45882,48765,45809,48721) +(49215,4098,49180,4067) +(49698,33743,49614,33663) +(21532,5215,21514,5151) +(24840,26877,24826,26808) +(32680,28433,32631,28364) +(20661,27511,20584,27414) +(28048,30385,28009,30315) +(45403,42533,45389,42464) +(46531,36947,46531,36850) +(36943,32817,36865,32737) +\N +(37984,43763,37888,43748) +(20593,10650,20557,10610) +(5387,40595,5326,40585) +(34412,10600,34352,10539) +(7237,47546,7206,47451) +(39931,26644,39915,26598) +(29843,4734,29800,4669) +(37503,8867,37406,8821) +(2583,2373,2570,2294) +(29275,46433,29256,46350) +(3332,45620,3287,45581) +(22472,39287,22472,39257) +(36786,18907,36708,18884) +(45503,28576,45482,28494) +(33262,28386,33163,28365) +(3606,49757,3538,49697) +(2082,49380,1991,49281) +(12065,3734,11983,3663) +(15606,9048,15596,9028) +(14687,19309,14637,19263) +(4568,15461,4499,15428) +\N +(43938,7429,43923,7391) +\N +(2168,50012,2108,49914) +(16022,8934,15963,8928) +(24567,39147,24561,39102) +\N +(42781,14149,42765,14088) +(39501,21084,39468,21078) +(6697,29628,6693,29584) +(11441,16164,11364,16125) +(39946,1920,39868,1844) +\N +(18138,45512,18111,45438) +\N +(20799,41217,20718,41138) +(30264,16697,30240,16639) +\N +(30746,50040,30727,49992) +(37429,43273,37423,43205) +(22854,28863,22789,28810) +(11380,48298,11287,48242) +(16471,37273,16439,37223) +(32737,39842,32661,39811) +(30959,3447,30949,3357) +(36396,13263,36348,13187) +(29607,14625,29531,14619) +(7851,43399,7824,43334) +(38515,14575,38496,14492) +(29125,3289,29086,3264) +(6866,10476,6839,10424) +(318,31489,235,31404) +(1140,7007,1113,6945) +(36574,9291,36484,9275) +\N +(40320,40937,40246,40866) +(588,25849,552,25801) +(6728,42539,6645,42507) +(12180,6185,12123,6123) +(32913,44123,32899,44037) +(25464,16803,25441,16749) +(23711,5829,23695,5750) +(31424,34930,31377,34906) +(42171,8298,42124,8222) +(451,31104,375,31083) +(39996,3278,39943,3260) +(25816,40396,25735,40362) +(34471,28587,34399,28547) +(45344,21540,45297,21496) +(27269,16787,27246,16763) +(18070,4469,18022,4423) +\N +(12668,16367,12645,16295) +(13823,17276,13730,17251) +(20555,45544,20511,45498) +(35893,42189,35861,42177) +(37081,45730,37076,45705) +(17270,15651,17201,15552) +(48690,46034,48667,45945) +(456,16088,368,16023) +(48707,12416,48670,12363) +(29692,11509,29614,11483) +(7005,3668,6981,3574) +(12162,389,12103,309) +(12371,24983,12366,24964) +(6886,48414,6868,48327) +(10653,26234,10624,26142) +(8526,48205,8517,48117) +(10521,31892,10480,31798) +(43353,1086,43281,1071) +(21007,35650,20998,35649) +(2343,4396,2310,4320) +(29379,12895,29284,12891) +(27662,17407,27570,17313) +(9845,29346,9807,29321) +(43855,38669,43790,38599) +\N +(20461,44189,20397,44158) +(11627,17368,11581,17289) +(2971,38855,2938,38807) +(43204,47082,43128,47018) +(9930,46902,9909,46871) +(30561,48461,30536,48365) +(44059,7591,44038,7563) +(46260,16898,46162,16886) +(27491,2891,27396,2814) +(36512,26034,36455,25941) +(31193,20022,31100,19942) +(17057,13643,16960,13621) +(26897,3399,26844,3318) +(1760,5504,1683,5431) +(29347,5511,29346,5450) +(38761,42083,38688,41999) +(11226,4089,11165,4068) +(46427,42983,46361,42970) +(12958,30737,12912,30712) +(44432,46521,44333,46443) +(16124,2948,16113,2852) +\N +(24704,25422,24635,25340) +(30833,46152,30790,46122) +(4487,37006,4473,36968) +(41047,23376,41036,23327) +(16312,49392,16298,49330) +(30081,14687,30042,14660) +(11160,13954,11103,13938) +(33207,23246,33143,23168) +(14872,7635,14860,7585) +(20139,23987,20059,23955) +(10946,49757,10923,49746) +(39438,36158,39426,36134) +(35502,2385,35464,2327) +(17073,42173,16987,42130) +(6079,17258,6068,17195) +(40458,15752,40364,15728) +(23340,7879,23313,7806) +\N +(31819,15096,31762,15059) +(31159,40864,31158,40780) +(26975,32144,26915,32113) +(34530,10378,34440,10298) +(18855,49577,18780,49528) +(16787,16625,16723,16586) +(32330,26538,32314,26458) +(34270,28674,34265,28595) +(10022,16026,10006,15962) +(23143,1479,23095,1469) +(33676,4483,33583,4408) +(31066,22074,31059,22035) +(21603,47121,21563,47082) +(30051,4244,30021,4157) +(30634,39478,30615,39446) +(34404,48724,34393,48724) +(31103,21414,31039,21380) +(22945,47397,22849,47313) +(18133,32025,18073,31941) +(4053,25759,3977,25667) +(39185,39091,39102,39068) +(43287,7407,43225,7314) +(13137,31188,13112,31182) +(46264,1438,46258,1389) +(22804,43892,22769,43822) +(7542,1044,7487,983) +(33022,8321,32925,8267) +(384,39161,286,39073) +(28205,24401,28142,24382) +(31708,39086,31696,39026) +(36626,15708,36560,15690) +(17099,16924,17079,16924) +(10817,6989,10747,6955) +(24338,19293,24291,19277) +(27566,17576,27544,17545) +(23041,38384,22970,38320) +\N +(12786,8485,12702,8435) +(13876,49473,13813,49448) +(31585,46998,31490,46929) +\N +(30227,8768,30206,8715) +(32062,39306,32023,39292) +(25003,35753,24921,35687) +(3281,6758,3232,6704) +\N +(11395,30299,11376,30220) +(5088,15275,5007,15203) +(31100,39538,31003,39444) +(2741,17877,2726,17793) +(42897,48620,42860,48537) +(4230,15778,4181,15776) +(17835,27530,17815,27431) +(34189,10933,34135,10921) +(7537,39974,7494,39973) +(21554,3507,21528,3476) +(9350,32326,9273,32275) +(16455,8874,16420,8793) +\N +(7346,34235,7330,34224) +(16417,48134,16352,48066) +\N +(41916,4971,41849,4886) +(15856,1522,15807,1521) +(41549,40218,41494,40144) +\N +(9978,16226,9972,16181) +(14856,13312,14808,13283) +(38490,41641,38428,41583) +(25828,7438,25807,7378) +(21876,30633,21796,30587) +(1908,14279,1825,14247) +\N +(32207,10251,32121,10184) +(370,9493,328,9441) +(42072,17634,41974,17600) +\N +(47298,9910,47235,9846) +(17856,11266,17782,11225) +(35009,21400,34956,21396) +(18337,11145,18335,11133) +\N +(25425,9139,25381,9085) +(35642,27783,35621,27782) +(3629,33164,3575,33163) +(17151,41255,17115,41204) +(17417,5835,17402,5751) +(33407,14226,33329,14141) +(1930,29955,1889,29931) +(41101,10942,41065,10844) +(36333,27288,36281,27233) +(21423,36868,21367,36825) +(36385,19566,36341,19510) +(27073,38301,27066,38232) +(43989,34187,43984,34174) +(48366,7488,48316,7483) +(37497,36075,37415,36043) +(46917,9891,46887,9870) +(37179,657,37103,634) +(3877,44736,3811,44684) +(30556,2975,30547,2962) +(7629,11447,7547,11416) +(45687,48147,45591,48088) +(5635,7184,5571,7146) +(9611,47327,9541,47246) +(7119,48224,7117,48152) +(15233,26480,15138,26430) +(37468,1526,37466,1513) +\N +(20855,2786,20828,2711) +(30538,44084,30480,44061) +(42231,41527,42149,41454) +(14963,13239,14952,13146) +(26819,43996,26745,43934) +(42172,35953,42086,35928) +(28785,12611,28710,12534) +(14089,1704,14047,1629) +(4343,26242,4341,26169) +(20327,42244,20231,42212) +(33671,12700,33666,12630) +(42144,32642,42128,32569) +(26590,19483,26503,19442) +(21741,46259,21723,46226) +(8822,34700,8760,34693) +\N +(2710,33521,2675,33505) +(26067,19998,26026,19989) +(12244,34509,12202,34489) +\N +(47162,598,47119,499) +(33093,49382,33068,49359) +(35170,26340,35153,26264) +(22552,35785,22490,35735) +(36791,23032,36781,22976) +(22857,10857,22833,10797) +\N +(47207,37405,47138,37365) +(21867,2836,21854,2811) +(3387,31487,3311,31456) +(47174,48121,47167,48101) +(24415,22232,24366,22224) +(7970,29251,7959,29211) +(18635,31294,18539,31221) +(8403,13380,8370,13372) +(738,18097,737,18054) +(37238,19195,37218,19114) +(582,47934,570,47897) +(12359,4635,12350,4619) +(43272,2013,43195,1958) +(47568,27149,47521,27088) +(24695,12827,24661,12796) +(26259,14077,26168,14019) +\N +(48478,36135,48425,36092) +(5230,39250,5206,39174) +(3488,18562,3423,18489) +(39502,16331,39460,16275) +(18296,1478,18233,1471) +\N +(28627,12430,28559,12410) +(25257,21981,25206,21954) +\N +(2410,41192,2325,41142) +(43681,9631,43587,9538) +\N +(15086,45309,15064,45270) +(13824,40807,13759,40787) +(7090,2207,7062,2159) +(3685,2480,3630,2391) +(14810,38335,14801,38275) +(26668,38018,26581,38012) +(45562,1517,45506,1424) +(11001,32481,10962,32402) +(27743,25245,27673,25161) +(15952,10598,15948,10535) +(12705,13308,12694,13232) +(31992,21195,31975,21118) +(25834,16652,25745,16626) +(21022,43625,20990,43576) +(45094,27254,45000,27240) +(9688,42601,9643,42533) +(17746,24659,17694,24616) +(1509,38859,1503,38809) +(2067,20438,2041,20369) +(7885,44528,7839,44444) +(27432,33052,27422,32987) +(26577,17157,26563,17142) +(10815,35985,10734,35908) +(44891,24067,44794,23979) +(48626,1900,48595,1850) +\N +(40659,35541,40659,35489) +(22231,26628,22210,26579) +(37408,23016,37375,22919) +(5920,15916,5906,15895) +\N +(33125,9952,33037,9880) +(12142,29705,12141,29670) +(3672,20995,3649,20899) +(39147,31967,39101,31907) +\N +(33812,48458,33748,48399) +(25038,14639,24978,14586) +(3859,16010,3857,15994) +(31926,39496,31889,39417) +(49300,28064,49297,28026) +(24121,38305,24048,38256) +(9252,4205,9155,4149) +(36124,30451,36056,30395) +(28809,49557,28794,49533) +(30500,44504,30471,44476) +(26866,42395,26822,42332) +(48195,1784,48101,1734) +(46201,14109,46112,14097) +\N +(2415,9975,2354,9914) +(30485,9581,30415,9558) +(6385,36838,6305,36838) +(2799,11189,2723,11095) +(21998,20503,21923,20406) +(29151,10714,29090,10671) +(28850,29276,28757,29207) +(43386,48845,43305,48834) +(25173,8310,25101,8294) +(34244,32352,34204,32342) +(35595,23728,35533,23672) +(1122,13581,1119,13538) +\N +(388,21716,296,21678) +(48782,11064,48701,11005) +(40293,12997,40213,12927) +\N +(28194,46428,28113,46414) +(4791,18118,4708,18105) +(471,29808,448,29775) +(3536,37803,3447,37737) +(1336,28416,1275,28392) +(16484,48478,16422,48454) +(25846,19320,25811,19296) +(48669,27703,48575,27615) +(24032,44217,24029,44127) +(12236,5019,12233,4986) +(1179,29838,1113,29778) +(33893,22049,33867,21955) +(16718,19462,16700,19440) +(17992,49438,17894,49433) +(35163,39941,35081,39885) +(33897,8362,33853,8328) +(2480,6640,2456,6599) +(28011,19729,27937,19679) +(15819,41516,15809,41440) +(29818,9136,29747,9089) +(28551,37016,28529,36941) +(36406,26879,36374,26872) +(16821,48925,16758,48914) +(23692,48163,23595,48160) +\N +(4803,10619,4759,10522) +(46600,33581,46553,33518) +(41349,11767,41310,11710) +(20856,29642,20799,29562) +(16559,46161,16504,46131) +(23041,1300,23003,1287) +(16630,44902,16554,44853) +(43065,14299,43013,14274) +(24818,22397,24796,22348) +(22282,24949,22218,24921) +(36668,28538,36631,28456) +(8080,1220,8018,1146) +(47282,34302,47277,34269) +(35603,33558,35557,33495) +(44764,32189,44700,32175) +\N +(46488,23965,46449,23868) +(46314,15047,46216,15013) +(6348,25381,6286,25363) +(3871,49288,3819,49251) +(462,38894,398,38867) +(23196,29214,23136,29169) +(29024,9775,29016,9759) +(42016,18555,41934,18472) +(8772,45981,8692,45973) +(11028,1351,10986,1278) +(26684,21668,26641,21656) +\N +(37262,26005,37260,25947) +(14899,44069,14814,44066) +\N +(39635,18701,39587,18698) +(28528,22948,28457,22857) +(7755,36528,7681,36454) +(32461,1172,32427,1106) +\N +(18775,27359,18736,27329) +(15379,20031,15337,19934) +(45888,33592,45881,33544) +(44013,24694,43962,24645) +\N +(43347,10699,43343,10699) +(49999,27218,49908,27176) +(13698,17326,13630,17317) +(34850,44313,34775,44302) +(38076,49235,37983,49214) +(35570,40218,35500,40136) +(40062,28973,40032,28878) +(3567,39847,3523,39781) +(498,2442,480,2401) +(29660,43620,29577,43561) +(10946,47356,10878,47351) +(8073,44233,8005,44144) +(9720,13473,9710,13462) +(3643,38014,3598,37932) +(16887,1408,16810,1375) +(7559,27914,7508,27874) +(30356,18573,30275,18569) +(12193,48176,12130,48116) +(11884,7756,11819,7731) +(18293,33272,18227,33234) +(46697,47874,46696,47828) +(35788,32517,35760,32446) +(33877,36987,33821,36958) +(31253,22819,31184,22808) +(7744,23115,7729,23103) +(21291,39817,21219,39778) +(13877,43379,13861,43290) +(42955,1406,42876,1382) +(49232,15950,49210,15880) +(48419,32001,48326,31902) +(18940,43246,18860,43150) +(32317,38240,32310,38201) +(11307,48298,11304,48222) +(38015,18190,38000,18176) +(27821,1177,27818,1131) +(18935,26757,18865,26682) +(42659,48284,42562,48244) +(30185,23350,30146,23291) +\N +(16496,11970,16441,11919) +(162,26040,120,25963) +(24238,47784,24185,47746) +(32326,8612,32274,8568) +(26141,13423,26051,13407) +(40132,22815,40089,22812) +(21151,48794,21056,48740) +\N +(22044,28358,22031,28334) +(6680,14746,6605,14669) +(40686,25139,40632,25070) +(22823,27549,22816,27507) +(2513,22841,2427,22811) +(36316,27787,36218,27728) +(554,35489,540,35441) +(536,30674,534,30609) +\N +(25385,38468,25295,38416) +(19467,47386,19437,47317) +(22425,38591,22387,38536) +(32493,17321,32396,17298) +(40115,47315,40109,47235) +(25002,2107,24963,2104) +(3901,9790,3898,9706) +\N +(40316,1721,40315,1658) +(40089,3454,40074,3443) +(793,17897,761,17897) +(6490,43552,6434,43522) +(10825,487,10820,405) +(47703,36067,47641,36011) +\N +(4480,11671,4468,11653) +(37713,10642,37711,10615) +(12315,5302,12273,5203) +\N +(8709,6617,8647,6557) +(24467,30535,24455,30494) +(40440,32757,40369,32668) +(49449,42447,49426,42428) +(44867,11197,44792,11137) +(39173,33241,39143,33187) +(43836,2212,43803,2184) +(23819,47613,23739,47575) +(20583,2134,20485,2042) +(48922,6169,48889,6111) +(5230,44613,5131,44604) +(37060,8051,37032,7975) +(19148,36711,19112,36704) +(36305,4216,36243,4118) +(6329,39089,6302,39047) +(36703,26367,36623,26307) +(44753,19721,44701,19631) +(42094,43310,42094,43285) +(4276,22377,4241,22352) +(30329,18906,30327,18815) +(21970,19605,21871,19590) +(23722,41924,23709,41861) +(30965,39775,30908,39692) +(32394,37895,32351,37890) +(23968,42162,23873,42095) +(1776,2621,1732,2548) +(24951,47758,24900,47679) +(32917,35771,32847,35753) +(5428,27773,5343,27769) +\N +(19650,142,19630,51) +(39769,17276,39743,17229) +(5171,24562,5119,24470) +(32976,35249,32917,35199) +\N +(4174,24603,4099,24504) +(38565,36960,38535,36926) +(39084,4328,39031,4301) +(32153,38043,32070,37990) +(38085,30640,38041,30603) +(14269,18426,14185,18422) +(42941,30850,42892,30788) +(32403,25999,32339,25960) +(16906,191,16816,139) +(3456,48722,3418,48721) +(3050,18287,3022,18243) +(6331,8439,6234,8364) +(5331,20797,5319,20793) +(39225,37408,39216,37348) +(34510,19838,34488,19810) +(45789,33873,45770,33786) +(369,1457,278,1409) +(16531,43785,16482,43729) +(11974,14789,11973,14730) +(23128,6811,23094,6798) +(43962,33659,43944,33599) +(20967,3115,20947,3079) +(39257,38606,39241,38595) +(22431,8246,22381,8235) +(26007,14672,25996,14593) +(24762,4261,24675,4261) +(35402,32077,35343,31988) +(5141,16476,5139,16393) +(16439,17564,16344,17472) +(36983,46663,36903,46567) +(35170,14144,35162,14048) +(22290,7841,22283,7810) +(22414,38398,22404,38319) +(9011,18177,8932,18150) +\N +(154,4019,138,3990) +(20447,4998,20383,4970) +(38867,35757,38795,35659) +(32322,15845,32227,15804) +\N +(29889,12142,29852,12055) +(36235,36918,36217,36897) +(41620,6581,41568,6581) +(24758,38504,24731,38483) +(42524,12904,42473,12895) +(17954,49975,17865,49915) +(1938,39019,1927,39013) +(4864,33279,4817,33258) +(45373,41967,45313,41885) +(28786,19028,28782,18978) +(41913,44950,41911,44908) +(33408,14698,33392,14681) +(27602,3460,27576,3419) +(3336,3728,3334,3715) +(9099,910,9080,813) +(34141,6403,34071,6367) +(48270,17216,48252,17130) +(2549,16546,2461,16474) +(27802,33669,27735,33642) +(48419,1682,48323,1583) +(5094,41211,5002,41123) +(11192,6217,11190,6146) +(6979,18503,6959,18421) +(41210,48187,41140,48143) +(15303,29527,15273,29441) +(12326,45572,12267,45570) +(29293,5861,29212,5826) +(23847,37241,23761,37178) +(44656,23926,44653,23831) +(30043,16194,29977,16105) +(902,9358,879,9339) +(23850,46501,23834,46494) +(42333,13300,42287,13246) +(25226,18086,25169,18005) +(40252,12082,40183,12038) +(49275,18076,49216,18055) +(8255,28878,8238,28862) +(11325,41286,11320,41235) +(16948,18588,16926,18528) +(31394,1099,31374,1038) +(30705,35772,30637,35766) +(3858,39131,3771,39125) +(17565,24892,17515,24808) +(9221,49715,9216,49661) +(44945,25769,44875,25722) +(33408,13563,33310,13527) +(48505,4407,48408,4373) +(21859,37217,21763,37217) +(39393,14422,39335,14364) +\N +(19905,1154,19841,1098) +(25946,10388,25906,10366) +(10104,13748,10027,13746) +(5822,24629,5820,24599) +(38194,11287,38127,11252) +(15694,46757,15625,46716) +(326,18837,285,18817) +(49611,47078,49533,47052) +(48233,18850,48150,18842) +\N +(29239,9962,29208,9875) +(40062,44554,39973,44460) +(19135,20729,19059,20643) +(31969,40664,31896,40643) +\N +(3725,9191,3711,9095) +(44280,40158,44264,40108) +(37236,42756,37160,42694) +(27958,19055,27888,18959) +(45270,17661,45187,17601) +(12115,39546,12061,39525) +(10227,32295,10168,32231) +(39264,31123,39226,31085) +(6566,40000,6532,39904) +(30058,6975,30012,6903) +(49631,6909,49597,6823) +(42168,10926,42134,10905) +(44892,30042,44858,29970) +(19540,19803,19495,19788) +(18403,25454,18371,25404) +(22929,26795,22841,26722) +(16648,30213,16626,30174) +(3440,7495,3429,7468) +(30708,49028,30643,48998) +(26258,14164,26255,14151) +(44206,31653,44121,31637) +(1510,15179,1426,15130) +(6986,30496,6887,30416) +(7192,43403,7138,43339) +(39921,22071,39866,21976) +(45870,17011,45796,16919) +(15939,9563,15917,9539) +(23728,24737,23691,24725) +(6444,40416,6363,40375) +(21899,23861,21857,23765) +(20610,36765,20533,36742) +(46520,33082,46433,32983) +(21406,20902,21311,20895) +\N +(37913,42300,37814,42269) +(18216,8177,18161,8173) +(32967,8258,32899,8244) +(14978,40230,14971,40149) +(30343,39152,30266,39101) +(25917,5835,25843,5806) +\N +(5169,45366,5141,45314) +\N +(16221,20898,16209,20875) +(13151,19869,13145,19811) +(44399,2801,44337,2713) +\N +(10959,48311,10957,48230) +(4794,11711,4732,11661) +(764,10149,762,10091) +(15985,46067,15898,46028) +(41434,22870,41342,22867) +(43769,23796,43743,23756) +(10017,18440,9919,18384) +(21141,43119,21097,43112) +(7782,13424,7694,13398) +(25088,36224,25059,36150) +(46325,48722,46241,48631) +\N +(11042,33125,11011,33071) +(22347,13460,22290,13375) +(3508,20538,3483,20536) +(5331,42945,5272,42875) +\N +(2368,15537,2339,15503) +(45314,31830,45254,31817) +(34358,2649,34319,2589) +\N +(17576,30407,17572,30323) +(29836,41324,29746,41287) +(21036,39996,21014,39899) +(26886,6460,26787,6400) +(15709,5625,15627,5558) +(37415,15979,37414,15911) +(47761,16860,47728,16813) +(35814,48252,35755,48173) +\N +(28559,20810,28496,20715) +(12034,11921,12002,11905) +(1818,27450,1805,27406) +(33810,45499,33806,45413) +(17376,18175,17323,18138) +(34106,28135,34049,28106) +(44947,23165,44919,23091) +(37670,41904,37616,41840) +(12614,15027,12555,14969) +(43301,75,43227,43) +\N +(27526,15096,27450,15088) +(26947,33409,26853,33333) +(1537,43572,1471,43499) +\N +(21607,35452,21605,35375) +(24869,46565,24818,46531) +(4774,30335,4723,30257) +(11615,18316,11579,18310) +(18444,15819,18354,15763) +(47267,22574,47203,22518) +(22287,49538,22203,49511) +(43010,16270,43010,16202) +\N +(1623,8350,1578,8254) +(21220,43808,21137,43748) +(40397,16471,40358,16434) +\N +(34839,1377,34744,1327) +(17096,5730,17090,5637) +\N +(28156,37782,28155,37723) +(3672,5686,3586,5638) +(21856,48656,21840,48638) +(6907,7791,6892,7761) +(17952,21370,17862,21350) +(37793,13461,37784,13381) +(14740,49655,14709,49604) +(21690,6337,21593,6289) +\N +(10423,33548,10364,33498) +\N +(39187,23274,39136,23197) +\N +(21882,37247,21835,37167) +\N +(11343,16957,11281,16914) +(38279,43400,38264,43352) +(23167,30271,23086,30224) +(46278,6037,46180,5964) +(28626,31165,28605,31095) +\N +(31018,367,30946,333) +(23541,12541,23530,12523) +(49741,14535,49691,14511) +(31444,12702,31425,12612) +\N +(22406,26536,22316,26534) +(6807,9761,6758,9723) +(15698,1941,15687,1848) +(49310,4625,49295,4584) +(21345,18939,21269,18887) +(31433,30493,31411,30439) +(44980,12400,44950,12372) +(25054,13949,24984,13949) +(40538,7253,40483,7212) +(16967,8627,16936,8604) +(26872,3646,26804,3594) +(24575,42883,24530,42883) +(11823,5755,11771,5721) +\N +(2553,46189,2513,46174) +(24993,14552,24898,14470) +(28453,1719,28419,1665) +(8925,22603,8878,22589) +(47635,15380,47546,15378) +(35378,18112,35324,18058) +(27347,22264,27293,22200) +\N +(44323,29044,44273,28958) +(41538,38324,41484,38290) +(19128,49932,19112,49849) +(17904,12548,17867,12503) +(35103,14426,35092,14336) +(29807,10142,29714,10052) +(44507,22903,44462,22847) +(11419,13324,11399,13251) +(8573,42221,8562,42123) +(46798,45843,46765,45765) +(12028,31783,11967,31749) +(10635,45300,10604,45251) +(9626,8248,9587,8194) +(18290,741,18246,732) +(39949,44672,39932,44641) +(7897,11692,7893,11637) +(20165,42246,20112,42168) +(4341,48390,4285,48338) +(30126,28913,30088,28869) +(40565,1733,40472,1721) +(9981,30147,9915,30133) +(47292,25511,47217,25462) +(20137,24489,20104,24392) +(2385,28283,2381,28189) +(20429,10052,20357,10009) +(8395,38568,8348,38480) +(17381,36112,17349,36038) +(37845,30953,37759,30926) +(27452,12732,27411,12652) +(38196,32186,38114,32116) +\N +(6527,49356,6508,49315) +(43891,29789,43856,29723) +(6146,37192,6085,37107) +\N +(42012,28897,41939,28808) +\N +(14909,13815,14846,13757) +(11120,24095,11035,24049) +(3132,41545,3053,41526) +(40084,40315,39994,40261) +(39671,17445,39576,17361) +(47135,35853,47085,35831) +(39297,1941,39290,1911) +(47143,35898,47072,35880) +(16017,6711,15989,6686) +(47110,30305,47087,30213) +(38102,27639,38091,27602) +(17954,22544,17863,22453) +(39891,11791,39815,11739) +(13996,20290,13922,20278) +(22284,23143,22190,23081) +(25345,24019,25313,24017) +(47134,44803,47055,44761) +(41360,16573,41326,16503) +(10464,1071,10457,998) +\N +(23515,47517,23451,47499) +(9308,8452,9238,8392) +(28695,5657,28671,5644) +(45104,9913,45077,9871) +(337,455,240,359) +(11562,45479,11472,45428) +(11952,18466,11931,18425) +\N +(35789,5154,35775,5128) +(19024,18299,18979,18230) +(43056,38113,42975,38067) +(10075,26847,10064,26806) +(3065,8107,3029,8038) +(24766,19059,24749,18985) +(14438,24805,14413,24708) +(9523,3058,9485,2998) +(24516,31262,24478,31204) +(49513,26044,49434,26035) +(14110,38528,14103,38461) +(31679,35618,31619,35618) +(10029,20258,10008,20248) +(39269,37586,39233,37539) +(12343,8197,12247,8113) +(11155,44223,11111,44134) +(25437,20606,25338,20534) +(46604,16156,46570,16131) +(4636,14004,4592,13941) +(15975,29628,15912,29556) +(49887,24274,49805,24184) +(11812,13440,11723,13418) +(21589,38179,21531,38085) +(32255,44463,32219,44454) +(15023,12698,14989,12687) +(28906,48630,28818,48568) +(28886,38905,28861,38832) +(34786,22285,34740,22240) +\N +(46513,46780,46425,46780) +\N +(26626,31759,26551,31677) +(19792,25967,19763,25933) +(20432,14394,20388,14365) +(27092,7301,27052,7278) +(22283,987,22198,928) +(6197,24363,6112,24311) +(46601,49259,46551,49231) +(12392,48052,12363,48038) +(46116,31386,46067,31356) +(7354,16855,7289,16778) +(47501,42808,47495,42761) +(16461,25487,16391,25398) +(42678,18798,42678,18756) +(9466,18207,9419,18185) +(17467,14177,17416,14097) +(28533,31886,28487,31832) +(13225,38472,13188,38395) +(5180,40970,5173,40902) +(83,10271,15,10265) +(2111,6784,2016,6690) +(41835,11064,41798,10995) +(29273,48585,29181,48536) +(29066,21615,28985,21543) +(19805,44143,19727,44128) +(48919,21468,48875,21467) +(28790,34287,28721,34251) +(10911,33074,10869,32989) +(6111,16519,6032,16489) +(43889,33838,43837,33768) +(32323,21685,32304,21644) +(9552,27819,9539,27753) +(38266,49852,38233,49844) +(37672,48362,37663,48277) +(32550,47029,32529,46931) +(46307,6620,46272,6616) +(23192,46608,23105,46566) +(30399,48330,30335,48239) +(36268,25058,36235,24984) +(19181,8120,19089,8098) +(24376,19983,24294,19925) +(18297,18375,18202,18292) +\N +(31608,6215,31575,6168) +(12788,49510,12784,49468) +(46071,13013,46035,12991) +(27647,8218,27582,8201) +(49580,11076,49537,11050) +\N +(35501,33782,35501,33687) +(19969,3148,19964,3082) +(37728,49153,37726,49152) +(5322,48440,5321,48435) +(48003,10096,47904,10005) +(39361,22318,39348,22236) +(30488,7456,30437,7430) +(18533,39476,18481,39394) +(39462,23701,39433,23604) +(26701,18300,26686,18235) +(17405,35577,17387,35517) +(33971,29928,33953,29919) +(6328,10241,6276,10217) +(32459,44259,32453,44217) +(1715,42385,1647,42357) +(48113,6960,48103,6872) +(30561,4255,30476,4240) +(38907,43619,38827,43553) +(29149,20773,29070,20698) +(17006,1543,16970,1497) +\N +(11737,18808,11714,18788) +(13019,30534,13005,30481) +(39224,31729,39191,31683) +(4942,41680,4907,41596) +(12287,37187,12188,37172) +(30758,29579,30725,29531) +\N +(16604,17963,16581,17912) +(19459,15888,19409,15812) +(34696,24783,34600,24725) +(21621,14159,21558,14110) +(12193,46149,12145,46096) +(37781,4715,37692,4635) +(41854,44125,41807,44040) +(23604,23585,23571,23533) +(7853,36967,7797,36908) +(2755,13279,2720,13206) +(4314,15424,4283,15383) +(29584,12685,29493,12594) +(25138,33726,25042,33691) +(38393,10270,38326,10185) +(4247,12615,4225,12567) +(36100,33156,36100,33107) +(20024,40796,20016,40708) +(3927,44892,3914,44843) +(10317,43168,10226,43096) +(22057,3419,22042,3334) +(37097,21814,37025,21811) +(32084,21564,31996,21491) +(34079,39921,34058,39911) +(23078,47459,23018,47373) +(38109,616,38082,568) +(11862,40382,11764,40292) +(33403,33320,33389,33289) +(36639,24829,36623,24829) +(12995,45080,12992,45040) +(16545,19981,16532,19891) +(26155,10659,26154,10634) +(24423,255,24360,213) +(823,22487,781,22442) +(12823,20064,12735,20040) +(19688,11710,19681,11654) +(2892,20452,2836,20424) +(15533,10807,15464,10711) +(46994,41143,46955,41082) +(18155,2421,18069,2392) +(2628,12688,2605,12602) +(35128,8396,35044,8365) +(44765,49615,44758,49524) +(11226,44529,11178,44515) +(31334,32463,31291,32456) +(43224,23387,43168,23364) +(30882,10414,30798,10395) +(29139,967,29139,923) +(29959,45244,29877,45223) +(19946,217,19941,118) +(49732,22033,49642,22012) +(32914,15360,32879,15290) +(47825,21097,47747,21030) +(10788,5131,10746,5086) +\N +(15497,9698,15481,9678) +(10617,47195,10601,47117) +(42392,10583,42340,10550) +(10753,33520,10669,33509) +(5553,21580,5521,21527) +(36840,12336,36817,12320) +(49785,12554,49702,12553) +(17737,38349,17639,38277) +(48000,7823,47956,7814) +(5019,3184,4931,3160) +(30120,3524,30063,3492) +(37044,2016,37001,1942) +(23496,38566,23469,38528) +(17255,48957,17200,48903) +(27815,2138,27808,2090) +(40440,11129,40368,11105) +(35305,21772,35272,21717) +(41308,45065,41229,44973) +(14893,28807,14817,28789) +(30776,45824,30731,45772) +(742,40724,652,40672) +(5985,41133,5927,41097) +(9576,10226,9540,10218) +(21407,23207,21323,23160) +(44880,34228,44877,34169) +(29146,49694,29143,49682) +(28502,34886,28471,34832) +\N +(30662,5584,30604,5528) +(12612,26081,12552,26001) +(17166,49308,17098,49270) +(9586,14116,9488,14104) +(37323,47576,37264,47482) +(48009,49713,48004,49614) +(49308,23780,49297,23760) +(8667,32342,8592,32294) +(37826,48560,37822,48485) +\N +(24493,18653,24486,18616) +(17914,3850,17887,3775) +(34270,43873,34231,43826) +(7753,44715,7660,44651) +(44328,36364,44265,36350) +(10146,3030,10111,2975) +(35273,40106,35269,40062) +\N +(38566,43846,38547,43760) +(12400,41394,12377,41378) +(45196,38286,45153,38250) +(48511,14972,48428,14883) +(25939,36328,25886,36277) +(38997,11007,38979,10917) +(30342,518,30244,453) +(6876,7468,6867,7454) +(17566,27575,17566,27480) +(18869,28538,18858,28475) +(16825,33309,16726,33255) +(14585,26111,14490,26035) +(28743,49392,28664,49349) +(26652,23359,26618,23297) +\N +(40129,33653,40102,33584) +(41074,26393,41038,26389) +(3869,33564,3869,33536) +(28455,14205,28364,14163) +(13866,45603,13770,45543) +(21666,30586,21578,30544) +(29978,11931,29893,11868) +(1594,1043,1517,971) +(948,1201,907,1156) +(27547,13692,27545,13677) +(13661,38184,13566,38154) +(2389,40026,2317,39938) +(35481,46379,35481,46320) +\N +(26917,45698,26864,45689) +(23933,41617,23909,41539) +(8912,8471,8862,8401) +(9625,4747,9558,4692) +(34743,35056,34721,34969) +(39544,21762,39475,21717) +\N +(11741,26330,11656,26293) +(39015,1315,38966,1285) +(13418,44237,13326,44202) +(2107,17672,2093,17616) +(42448,28844,42370,28764) +(49843,5175,49808,5145) +(6536,23000,6467,22958) +(11114,5822,11027,5739) +(48457,11074,48384,11024) +(12343,23110,12310,23074) +(17300,24847,17276,24825) +(8823,8253,8793,8238) +(3449,171,3354,108) +\N +(21650,23955,21605,23883) +(13260,3234,13193,3214) +(25361,10896,25305,10806) +(25051,25042,25011,25001) +(25044,25088,25015,25005) +\N +(25007,25061,25002,25013) +(25066,25105,25003,25007) +(25028,25012,25015,25011) +(25031,25057,25006,25018) +(25015,25042,25004,25012) +(25091,25049,25019,25019) +(25023,25011,25000,25004) +\N +(25053,25104,25010,25012) +(25058,25001,25018,25000) +(25059,25051,25008,25016) +(25043,25069,25007,25004) +(25006,25101,25002,25002) +(25095,25012,25014,25007) +(25054,25052,25019,25013) +(25108,25077,25009,25018) +(25007,25023,25003,25002) +\N +(25076,25098,25002,25016) +(25030,25077,25012,25006) diff --git a/src/test/singlenode_regress/data/region.csv b/src/test/singlenode_regress/data/region.csv new file mode 100644 index 00000000000..17441bf96f1 --- /dev/null +++ b/src/test/singlenode_regress/data/region.csv @@ -0,0 +1,5 @@ +0|AFRICA|lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +1|AMERICA|hs use ironic, even requests. s +2|ASIA|ges. thinly even pinto beans ca +3|EUROPE|ly final courts cajole furiously final excuse +4|MIDDLE EAST|uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl diff --git a/src/test/singlenode_regress/data/region.tbl b/src/test/singlenode_regress/data/region.tbl new file mode 100644 index 00000000000..17441bf96f1 --- /dev/null +++ b/src/test/singlenode_regress/data/region.tbl @@ -0,0 +1,5 @@ +0|AFRICA|lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +1|AMERICA|hs use ironic, even requests. s +2|ASIA|ges. thinly even pinto beans ca +3|EUROPE|ly final courts cajole furiously final excuse +4|MIDDLE EAST|uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl diff --git a/src/test/singlenode_regress/data/streets.data b/src/test/singlenode_regress/data/streets.data new file mode 100644 index 00000000000..935b04582fd --- /dev/null +++ b/src/test/singlenode_regress/data/streets.data @@ -0,0 +1,5124 @@ +A St [(-122.0265,37.049),(-122.0271,37.045)] +A St [(-122.089,37.71),(-122.0886,37.711)] +A St [(-122.0985,37.671),(-122.0981,37.674)] +A St [(-122.0991,37.668),(-122.0988,37.669)] +A St [(-122.103419,37.667),(-122.103439,37.667)] +A St [(-122.103913,37.66632),(-122.104037,37.66611),(-122.104051,37.66609)] +A St [(-122.106469,37.66446),(-122.1067,37.664)] +A St [(-122.107,37.664),(-122.107101,37.66425),(-122.1074,37.665)] +A St [(-122.1172,37.659),(-122.119506,37.65661)] +Abbie St [(-121.867486,37.54243),(-121.868,37.545)] +Acacia Ave [(-122.2353,37.457),(-122.2344,37.461)] +Acacia Ave [(-122.2364,37.436),(-122.2364,37.443)] +Acacia Ave [(-122.2415,37.435),(-122.2407,37.437)] +Acadia Ct [(-121.9007,37.773),(-121.9016,37.768)] +Acapulco Way [(-122.0517,37.91),(-122.0519,37.911)] +Access Rd 162 [(-121.9469,37.993),(-121.9475,37.993)] +Access Rd 25 [(-121.9283,37.894),(-121.9283,37.9)] +Access Rd 29 [(-121.9339,37.854),(-121.9343,37.85)] +Acton Cir [(-122.2824,37.681),(-122.2824,37.688)] +Ada St [(-122.2487,37.398),(-122.2496,37.401)] +Ada St [(-122.2807,37.807),(-122.2797,37.811)] +Adams Ave [(-121.742,37.829),(-121.742,37.822)] +Adams Ave [(-122.1906,37.253),(-122.1893,37.272)] +Adams St [(-122.2349,37.542),(-122.2341,37.537)] +Adams St [(-122.2364,37.553),(-122.2357,37.548)] +Adason Dr [(-122.1315,37.016),(-122.1288,37.009)] +Addison St [(-122.2735,37.705),(-122.2722,37.707)] +Addison St [(-122.2856,37.688),(-122.2854,37.689)] +Addison St [(-122.2874,37.686),(-122.2864,37.688)] +Addison Way [(-121.9044,37.881),(-121.9044,37.889)] +Addison Way [(-121.9044,37.895),(-121.9044,37.899)] +Adelina Common [(-121.925847,37.29985),(-121.925765,37.29493)] +Adeline St [(-122.2728,37.442),(-122.2725,37.451)] +Adeline St [(-122.2785,37.291),(-122.2783,37.296)] +Adelle St [(-121.7793,37.841),(-121.7797,37.849)] +Admirality Lane [(-122.2424,37.323),(-122.2429,37.318)] +Adobe Dr [(-122.0304,37.579),(-122.0278,37.592)] +Adrian Ave [(-122.1019,37.389),(-122.1019,37.369)] +Adriano St [(-122.032,37.663),(-122.0312,37.653)] +Agate Ct [(-121.801,37.653),(-121.8008,37.649)] +Agena Cir [(-122.0694,37.847),(-122.0696,37.839)] +Agua Fria Creek [(-121.909487,37.94485),(-121.910653,37.94809)] +Agua Fria Creek [(-121.9125,37.95367),(-121.9138,37.958)] +Agua Fria Creek [(-121.9254,37.922),(-121.9281,37.889)] +Agua Fria Creek [(-121.935,37.828),(-121.9356,37.826)] +Agua Vista [(-122.0796,37.896),(-122.0792,37.896)] +Agua Vista St [(-122.2089,37.839),(-122.2069,37.819)] +Aileen St [(-122.2612,37.42),(-122.2622,37.421)] +Airport Road [(-122.2085,37.147),(-122.2101,37.154)] +Aladdin Ave [(-122.1532,37.088),(-122.1577,37.068)] +Alameda Ave [(-122.2197,37.68),(-122.2192,37.68)] +Alameda Ave [(-122.2555,37.689),(-122.2534,37.68)] +Alameda Ave [(-122.2605,37.713),(-122.2588,37.704)] +Alameda Dr [(-121.8756,37.746),(-121.8763,37.746)] +Alameda Road [(-122.2955,37.875),(-122.2963,37.871)] +Alameda Belt Line Railroad [(-122.2586,37.769),(-122.2624,37.784)] +Alameda Belt Line Railroad [(-122.2697,37.798),(-122.2709,37.797)] +Alameda Creek [(-121.8283,37.151),(-121.8273,37.142)] +Alameda Creek [(-121.909502,37.93892),(-121.909,37.94)] +Alameda Creek [(-121.930593,37.93785),(-121.930096,37.94011)] +Alameda Creek [(-121.9466,37.974),(-121.9503,37.973)] +Alameda Creek [(-121.9691,37.748),(-121.97,37.73)] +Alameda Creek [(-121.9724,37.727),(-121.9738,37.726)] +Alameda Creek [(-121.978805,37.72143),(-121.9839,37.717)] +Alameda Creek [(-122.0136,37.734),(-122.0165,37.748)] +Alameda Creek [(-122.022956,37.77306),(-122.025,37.781)] +Alameda Creek [(-122.038,37.877),(-122.0446,37.873)] +Alameda Creek [(-122.0513,37.248),(-122.0556,37.215)] +Alameda Diversion [(-121.774647,37.97333),(-121.772718,37.98591)] +Alamo Canal [(-121.910434,37.73476),(-121.9101,37.726)] +Alamo Canal [(-121.9117,37.768),(-121.911261,37.75648)] +Alamo Creek [(-121.910523,37.2611),(-121.910923,37.26374)] +Albany St [(-122.0327,37.129),(-122.0326,37.115)] +Albany Ter [(-122.2864,37.868),(-122.2856,37.867)] +Alborg Ct [(-122.0492,37.154),(-122.0484,37.15)] +Alcatraz Ave [(-122.2525,37.515),(-122.2531,37.514)] +Alcatraz Ave [(-122.2617,37.502),(-122.2624,37.501)] +Alcatraz Ave [(-122.279,37.479),(-122.2773,37.482)] +Alcatraz Ave [(-122.2817,37.475),(-122.2825,37.475)] +Alcosta Blvd [(-121.938,37.237),(-121.9392,37.235)] +Alden Lane [(-121.786092,37.56057),(-121.7837,37.56)] +Alden Lane [(-121.7978,37.561),(-121.795183,37.561)] +Alden Road [(-122.1116,37.817),(-122.110686,37.81989),(-122.1097,37.823)] +Alder Ct [(-122.0117,37.66),(-122.0109,37.653)] +Alexander Ct [(-121.8708,37.845),(-121.8706,37.841)] +Alexander St [(-121.7888,37.724),(-121.7874,37.724)] +Alexandria St [(-122.1411,37.892),(-122.1417,37.892)] +Algonquin Ave [(-121.7851,37.888),(-121.7852,37.891)] +Alhambra Lane [(-122.2107,37.368),(-122.2102,37.367)] +Alicante Dr [(-122.0211,37.587),(-122.0198,37.582)] +Alice St [(-122.086,37.644),(-122.0848,37.625)] +Alice St [(-122.2696,37.967),(-122.2695,37.969)] +Alice St [(-122.2722,37.927),(-122.2714,37.94)] +Alice Way [(-121.7968,37.718),(-121.7958,37.718)] +Alice Way [(-122.0715,37.836),(-122.072,37.833)] +Alida St [(-122.2025,37.06),(-122.2019,37.056)] +Alisal St [(-121.86925,37.34979),(-121.8685,37.326)] +Alisal St [(-121.87,37.382),(-121.8695,37.35)] +Aliso Ave [(-122.1809,37.953),(-122.18,37.946)] +Allegro Ct [(-121.9755,37.201),(-121.9764,37.201)] +Allen Ct [(-122.0131,37.602),(-122.0117,37.597)] +Allendale Ave [(-122.2048,37.863),(-122.2041,37.858),(-122.2035,37.851)] +Allendale Ave [(-122.2067,37.882),(-122.2065,37.879)] +Allison Dr [(-122.0748,37.863),(-122.073,37.855)] +Allston Way [(-122.2799,37.677),(-122.2787,37.681)] +Alma Ct [(-121.9087,37.799),(-121.9089,37.814)] +Almaden Blvd [(-122.0551,37.008),(-122.0551,37.016)] +Almaden Pl [(-121.9603,37.697),(-121.9601,37.693)] +Almeria Dr [(-122.0711,37.224),(-122.0736,37.224)] +Almond Ave [(-121.7387,37.75527),(-121.7387,37.74118)] +Almond Ave [(-121.7388,37.778),(-121.7387,37.772)] +Almond Road [(-122.0818,37.132),(-122.0831,37.116)] +Aloe Ct [(-121.9158,37.922),(-121.9152,37.927)] +Alpine Ter [(-122.2374,37.445),(-122.2377,37.459)] +Alta Dr [(-122.0109,37.424),(-122.0101,37.419)] +Alta Vista Ave [(-122.2483,37.174),(-122.2473,37.167)] +Altamont Creek [(-121.7422,37.178),(-121.7413,37.203)] +Altamont Creek [(-121.7509,37.149),(-121.7474,37.154)] +Altamont Pass Road [(-121.659901,37.44449),(-121.666828,37.41016)] +Altimirano Dr [(-121.8781,37.0193),(-121.8713,37.01707)] +Alton Ct [(-121.9977,37.581),(-121.9981,37.576)] +Alvarado Blvd [(-122.0562,37.829),(-122.055814,37.82723)] +Alvarado Road [(-122.2339,37.608),(-122.2322,37.616)] +Alvarado Road [(-122.2391,37.573),(-122.2397,37.58)] +Alvarado St [(-122.1505,37.05),(-122.1494,37.03)] +Alvarado Niles Road [(-122.0325,37.903),(-122.0316,37.9)] +Alvarado Niles Road [(-122.049848,37.95115),(-122.0473,37.945)] +Alvord Way [(-121.9085,37.891),(-121.9093,37.889)] +Amador St [(-122.0963,37.614),(-122.0962,37.609)] +Amador St [(-122.0981,37.647),(-122.0966,37.635)] +Amador St [(-122.0999,37.664),(-122.099,37.655)] +Amador Valley Blvd [(-121.9198,37.146),(-121.9211,37.138)] +Amador Valley Ct [(-121.9365,37.068),(-121.937909,37.06375)] +Amarillo Ct [(-121.9439,37.044),(-121.9432,37.046)] +Ambar Pl [(-121.9494,37.482),(-121.9479,37.474)] +Amber Ct [(-121.7997,37.708),(-121.7997,37.704)] +Amber Way [(-121.8025,37.707),(-121.8015,37.708)] +American Ave [(-122.1271,37.478),(-122.1281,37.489)] +Ames Ter [(-121.9962,37.763),(-121.9955,37.762)] +Amherst Ct [(-122.1571,37.036),(-122.1575,37.034)] +Anchor Dr [(-122.3027,37.374),(-122.3032,37.383)] +Andrade Road [(-121.8842,37.741),(-121.8841,37.738)] +Andrade Road [(-121.8853,37.565),(-121.8855,37.564)] +Andrea Cir [(-121.733218,37.88641),(-121.733286,37.90617)] +Andrews St [(-121.7814,37.834),(-121.7814,37.829)] +Angela St [(-121.865522,37.55324),(-121.8652,37.552)] +Angela St [(-121.8795,37.607),(-121.8798,37.608)] +Angus Way [(-122.098774,37.86535),(-122.0986,37.861)] +Anita Ct [(-121.9655,37.744),(-121.9653,37.738)] +Ann St [(-121.9888,37.604),(-121.9894,37.603)] +Anna Maria St [(-121.7957,37.756),(-121.7958,37.725)] +Annerley Road [(-122.2328,37.168),(-122.2325,37.17)] +Antelope Ct [(-122.0653,37.773),(-122.0648,37.773)] +Antonio St [(-122.1642,37.251),(-122.1653,37.247)] +Anza St [(-121.9184,37.306),(-121.9197,37.304)] +Anza Way [(-121.7794,37.714),(-121.7788,37.714)] +Apgar St [(-122.2709,37.288),(-122.2719,37.29)] +Apgar St [(-122.278,37.291),(-122.2785,37.291)] +Apollo Cir [(-122.068531,37.87654),(-122.0686,37.877)] +Appian Way [(-122.0022,37.98),(-122.0019,37.983)] +Apple Ave [(-122.0909,37.85),(-122.0901,37.857)] +Applewood St [(-121.9629,37.192),(-121.9616,37.168)] +Apricot Lane [(-121.9471,37.401),(-121.9456,37.392)] +Aquarius Cir [(-122.0669,37.877),(-122.0674,37.88)] +Arbor Dr [(-121.8506,37.576),(-121.8521,37.578)] +Arbor St [(-122.2587,37.758),(-122.2582,37.765)] +Arcade Lane [(-122.2514,37.865),(-122.251558,37.86316)] +Arch St [(-122.2639,37.79),(-122.2638,37.782)] +Arch St [(-122.2647,37.846),(-122.2646,37.844)] +Archer Ave [(-121.9879,37.627),(-121.9888,37.626)] +Arden Road [(-122.0978,37.177),(-122.1,37.177)] +Ardenwood Blvd [(-122.063701,37.59653),(-122.063302,37.58815)] +Ardmore Dr [(-122.1308,37.211),(-122.1293,37.212)] +Ardo St [(-122.0295,37.682),(-122.0302,37.674)] +Ardo St [(-122.0306,37.659),(-122.0312,37.653)] +Arena St [(-122.155014,37.82347),(-122.1559,37.82)] +Arendt Way [(-121.8717,37.606),(-121.871,37.602)] +Argonaut Way [(-121.993,37.475),(-121.9926,37.473)] +Argonne St [(-122.146,37.806),(-122.1455,37.801),(-122.1451,37.796)] +Arizona St [(-122.0381,37.901),(-122.0367,37.898)] +Arizona St [(-122.044507,37.905),(-122.0443,37.904)] +Arizona St [(-122.1985,37.978),(-122.1981,37.974)] +Ark Dr [(-122.1313,37.029),(-122.1313,37.036)] +Arkansas Pl [(-121.9148,37.696),(-121.9149,37.699)] +Arlington Ave [(-122.2699,37.43),(-122.2719,37.428)] +Arlington Ave [(-122.276,37.024),(-122.276,37.014)] +Arlington Ave [(-122.276,37.988),(-122.2753,37.974)] +Arlington Dr [(-121.8802,37.408),(-121.8807,37.394)] +Arlington Road [(-121.7957,37.898),(-121.7956,37.906)] +Armata St [(-121.9236,37.858),(-121.9232,37.853)] +Arnold Ct [(-122.0887,37.669),(-122.0894,37.666)] +Arnold Road [(-121.8923,37.113),(-121.8924,37.111)] +Arnold Road [(-121.8924,37.06),(-121.8924,37.062)] +Arrowhead Dr [(-122.1943,37.389),(-122.1908,37.366)] +Arroyo Dr [(-121.9049,37.509),(-121.9029,37.516)] +Arroyo Road [(-121.749307,37.14717),(-121.7481,37.14957)] +Arroyo Road [(-121.7506,37.189),(-121.75,37.18541)] +Arroyo Road [(-121.7555,37.258),(-121.7556,37.251)] +Arroyo Road [(-121.76696,37.7112),(-121.76687,37.7094)] +Arroyo Road [(-121.7671,37.654),(-121.767086,37.65214),(-121.767,37.641)] +Arroyo de la Laguna [(-121.9064,37.612),(-121.9047,37.551)] +Arroyo del Valle [(-121.607487,37.89841),(-121.612773,37.92638)] +Arroyo del Valle [(-121.654588,37.36507),(-121.656972,37.4088)] +Arroyo del Valle [(-121.75,37.20484),(-121.7584,37.208)] +Arroyo del Valle [(-121.8049,37.539),(-121.7856,37.463)] +Arroyo del Valle [(-121.8751,37.656),(-121.8731,37.646)] +Arroyo Las Positas [(-121.7308,37.87),(-121.72772,37.85435)] +Arroyo Las Positas [(-121.7349,37.943),(-121.734048,37.9262)] +Arroyo Las Positas [(-121.7836,37.997),(-121.783492,37.99605)] +Arroyo Las Positas [(-121.7973,37.997),(-121.7957,37.005)] +Arroyo Las Positas [(-121.8473,37.965),(-121.8312,37.992)] +Arroyo Las Positas [(-121.858962,37.94925),(-121.858919,37.95878)] +Arroyo Mocho [(-121.553409,37.25257),(-121.565204,37.37327)] +Arroyo Mocho [(-121.625,37.83316),(-121.624698,37.83019)] +Arroyo Mocho [(-121.660579,37.01388),(-121.668949,37.027),(-121.682578,37.10817)] +Arroyo Mocho [(-121.7316,37.595),(-121.7186,37.466)] +Arroyo Mocho Canal [(-121.90854,37.78099),(-121.907797,37.78392)] +Arroyo Seco [(-121.655796,37.50684),(-121.657215,37.51096)] +Arroyo Seco [(-121.7073,37.766),(-121.6997,37.729)] +Arroyuelo Ave [(-122.2496,37.271),(-122.249564,37.2728)] +Ascot Dr [(-122.1934,37.217),(-122.1926,37.219)] +Ascot Dr [(-122.1969,37.211),(-122.1951,37.207)] +Ash St [(-122.0384,37.259),(-122.0388,37.276)] +Ash St [(-122.0408,37.31),(-122.04,37.292)] +Ashby Ave [(-122.2494,37.579),(-122.2485,37.579)] +Ashby Ave [(-122.2526,37.574),(-122.2518,37.574)] +Ashby Ave [(-122.264,37.557),(-122.263,37.559)] +Ashland Ave [(-122.1178,37.941),(-122.1178,37.93)] +Ashland Ave [(-122.1179,37.914),(-122.1179,37.913)] +Ashwood Common [(-121.962832,37.21086),(-121.963052,37.21067)] +Asilomar Dr [(-122.2028,37.298),(-122.20355,37.2905)] +Asilomar Dr [(-122.2041,37.333),(-122.204,37.312)] +Aspinwall Road [(-122.2074,37.39),(-122.2068,37.39)] +Aster Ct [(-121.9125,37.72),(-121.9129,37.719)] +At and Sf Railroad [(-122.2765,37.347),(-122.2768,37.339)] +At and Sf Railroad [(-122.2767,37.463),(-122.2766,37.454)] +At and Sf Railroad [(-122.2785,37.544),(-122.2784,37.535)] +At and Sf Railroad [(-122.281389,37.30695),(-122.282488,37.30491)] +At and Sf Railroad [(-122.2827,37.611),(-122.2821,37.603)] +At and Sf Railroad [(-122.2844,37.293),(-122.2848,37.291)] +At and Sf Railroad [(-122.2878,37.788),(-122.2874,37.783)] +At and Sf Railroad [(-122.288,37.3),(-122.288,37.294)] +Atherton St [(-122.0819,37.68),(-122.0809,37.669)] +Atherton St [(-122.0838,37.7),(-122.0829,37.69)] +Atherton St [(-122.1701,37.612),(-122.1696,37.606)] +Athol Ave [(-122.2535,37.01),(-122.2523,37.016)] +Atlantic Ave [(-122.2831,37.804),(-122.2816,37.803)] +Atlantic St [(-122.0371,37.018),(-122.0382,37.018)] +Atlas Ave [(-122.1889,37.964),(-122.1882,37.966)] +Atwater Ct [(-122.0076,37.662),(-122.0084,37.654)] +Auburn Ave [(-122.25,37.489),(-122.25035,37.4945)] +Audrey Dr [(-122.069,37.13),(-122.0683,37.131)] +Audubon St [(-122.0388,37.261),(-122.0383,37.258)] +Aughinbaugh Way [(-122.2491,37.473),(-122.249,37.471)] +Augustine Pl [(-122.0169,37.732),(-122.0163,37.725)] +Aurora Dr [(-122.1804,37.973),(-122.18,37.966)] +Auseon Ave [(-122.1653,37.565),(-122.165,37.567)] +Austin St [(-121.943,37.422),(-121.9435,37.425)] +Autumn Oak Dr [(-121.749435,37.09187),(-121.749806,37.10065)] +Avalon Ave [(-122.2477,37.597),(-122.246,37.598)] +Avenue 130th [(-122.1851,37.044),(-122.1872,37.036)] +Avenue 134th [(-122.1823,37.002),(-122.1851,37.992)] +Avenue 140th [(-122.1656,37.003),(-122.1691,37.988)] +Avenue A [(-122.3005,37.885),(-122.3024,37.885)] +Avenue A [(-122.3035,37.885),(-122.3076,37.886)] +Avenue D [(-122.298,37.848),(-122.3024,37.849)] +Avenue F [(-122.2943,37.831),(-122.2971,37.832)] +Avenue L [(-122.296,37.757),(-122.2985,37.757)] +Avoca Ave [(-122.2211,37.413),(-122.2204,37.416)] +Ayala Ave [(-122.2587,37.429),(-122.2584,37.435)] +Azalea Ct [(-121.7365,37.13),(-121.7357,37.136)] +Azevedo Ave [(-122.0639,37.756),(-122.0641,37.75)] +Aztec Ct [(-121.922,37.92),(-121.921,37.92)] +B St [(-121.8924,37.95133),(-121.8924,37.952)] +B St [(-122.0241,37.05),(-122.0248,37.045)] +B St [(-122.0531,37.434),(-122.0537,37.434)] +B St [(-122.0656,37.823),(-122.0652,37.825)] +B St [(-122.0799,37.742),(-122.0782,37.753)] +B St [(-122.087,37.707),(-122.0863,37.709)] +B St [(-122.0955,37.673),(-122.0944,37.677)] +B St [(-122.1749,37.451),(-122.1743,37.443)] +Bach Ct [(-121.9778,37.295),(-121.9769,37.292)] +Bahama Ave [(-122.1039,37.335),(-122.1031,37.321)] +Bahama Com [(-122.0361,37.72),(-122.036031,37.72046),(-122.0358,37.722)] +Baine Ave [(-122.0089,37.565),(-122.0104,37.546)] +Bairo Ct [(-121.9505,37.398),(-121.9498,37.393)] +Baker St [(-122.2792,37.495),(-122.2791,37.488)] +Balboa Dr [(-122.1982,37.319),(-122.1971,37.333)] +Balboa Way [(-122.0205,37.519),(-122.0207,37.517)] +Baldwin Pl [(-122.0274,37.697),(-122.0265,37.692)] +Ballantyne Dr [(-121.858907,37.985),(-121.8585,37.985)] +Ballantyne Dr [(-121.8611,37.986),(-121.8605,37.985)] +Ballena Blvd [(-122.2854,37.691),(-122.285393,37.68924)] +Ballentine Dr [(-121.859765,37.96825),(-121.860477,37.96784)] +Balmoral Dr [(-122.1639,37.981),(-122.1635,37.988)] +Balmoral Dr [(-122.1658,37.027),(-122.1656,37.042)] +Balmoral St [(-122.055,37.971),(-122.0555,37.979)] +Banbury St [(-122.0943,37.495),(-122.0949,37.493)] +Bancroft Ave [(-122.1475,37.288),(-122.147,37.276)] +Bancroft Ave [(-122.1485,37.311),(-122.1481,37.303)] +Bancroft Ave [(-122.1518,37.358),(-122.1511,37.349)] +Bancroft Ave [(-122.15714,37.4242),(-122.156,37.409)] +Bancroft Ave [(-122.1585,37.445),(-122.1583,37.441)] +Bancroft Ave [(-122.1643,37.523),(-122.1631,37.508),(-122.1621,37.493)] +Bancroft Ave [(-122.1718,37.62),(-122.1715,37.617)] +Bancroft Ave [(-122.1796,37.689),(-122.1792,37.684)] +Bancroft Ave [(-122.1903,37.706),(-122.189,37.705)] +Bancroft Ave [(-122.2041,37.716),(-122.202,37.716)] +Bancroft Ct [(-122.1329,37.109),(-122.1322,37.116)] +Bancroft Way [(-122.2753,37.667),(-122.2742,37.668)] +Bancroft Way [(-122.2846,37.654),(-122.283747,37.655)] +Bancroft Way [(-122.291,37.644),(-122.2899,37.647)] +Bandon Dr [(-121.9311,37.234),(-121.931,37.237)] +Banyan Tree Road [(-121.9901,37.317),(-121.9877,37.304)] +Barbers Point Road [(-122.2957,37.896),(-122.2965,37.894)] +Barcelona Ave [(-122.0896,37.276),(-122.0894,37.253)] +Barcelona St [(-122.1459,37.639),(-122.1445,37.623)] +Barcelona Way [(-122.0787,37.86),(-122.0783,37.858)] +Bardolph Cir [(-122.0583,37.718),(-122.0586,37.726)] +Barlow Dr [(-122.0891,37.034),(-122.088,37.037),(-122.086558,37.03988)] +Barlow Dr [(-122.0915,37.03),(-122.0903,37.032)] +Bart Ramp [(-122.0495,37.208),(-122.0473,37.196)] +Bart Access Road [(-122.0346,37.081),(-122.0329,37.057)] +Bartlett Lane [(-122.111062,37.71771),(-122.10988,37.70276)] +Bartlett St [(-122.2071,37.902),(-122.2053,37.913)] +Barton Dr [(-121.9655,37.744),(-121.9644,37.749)] +Bates Dr [(-122.0328,37.748),(-122.0322,37.745)] +Baumberg Ave [(-122.0987,37.241),(-122.0985,37.237)] +Bautista St [(-121.9227,37.29),(-121.9225,37.284)] +Bay St [(-121.9611,37.33),(-121.9627,37.329)] +Bay St [(-122.2642,37.732),(-122.2641,37.751)] +Bay Area Rapid Transit [(-121.983355,37.64329),(-121.982907,37.63842)] +Bay Area Rapid Transit [(-122.0049,37.816),(-122.004,37.809)] +Bay Area Rapid Transit [(-122.007,37.833),(-122.0062,37.827)] +Bay Area Rapid Transit [(-122.02,37.935),(-122.0193,37.926)] +Bay Area Rapid Transit [(-122.0309,37.057),(-122.0281,37.027),(-122.0262,37.001)] +Bay Area Rapid Transit [(-122.0813,37.661),(-122.0806,37.654)] +Bay Area Rapid Transit [(-122.0981,37.779),(-122.0963,37.767)] +Bay Area Rapid Transit [(-122.1694,37.311),(-122.1679,37.3)] +Bay Area Rapid Transit [(-122.2086,37.641),(-122.2061,37.619)] +Bay Area Rapid Transit [(-122.2129,37.676),(-122.212,37.668)] +Bay Area Rapid Transit [(-122.2172,37.713),(-122.2184,37.719)] +Bay Area Rapid Transit [(-122.231147,37.54912),(-122.229,37.562)] +Bay Area Rapid Transit [(-122.2349,37.525),(-122.2339,37.532)] +Bay Area Rapid Transit [(-122.2571,37.427),(-122.2563,37.431)] +Bay Area Rapid Transit [(-122.2658,37.337),(-122.2644,37.38)] +Bay Area Rapid Transit [(-122.267508,37.25368),(-122.2674,37.258)] +Bay Forest Dr [(-122.2139,37.561),(-122.2142,37.565)] +Bay Walk Road [(-122.2471,37.389),(-122.2462,37.389)] +Bayfield Pl [(-121.9665,37.204),(-121.9664,37.196)] +Baylor St [(-122.0272,37.93),(-122.0284,37.903)] +Bayview Ave [(-122.0584,37.864),(-122.0581,37.855)] +Bayview Dr [(-122.2386,37.511),(-122.2379,37.514)] +Beachwood Way [(-121.8817,37.731),(-121.8807,37.731)] +Beacon St [(-122.2484,37.09),(-122.2472,37.088)] +Beard Road [(-122.0417,37.819),(-122.0424,37.81)] +Beard Road [(-122.0447,37.778),(-122.045,37.775)] +Beaumont Ave [(-122.2263,37.033),(-122.2262,37.04)] +Becket Dr [(-122.0509,37.005),(-122.0509,37.033)] +Bedelio Ter [(-122.019,37.579),(-122.018,37.574)] +Bedford St [(-121.9333,37.403),(-121.9338,37.402)] +Bedford Way [(-121.928,37.149),(-121.9288,37.15)] +Beecham Ct [(-121.8693,37.959),(-121.8704,37.959)] +Beechmont Lane [(-122.0971,37.558),(-122.0984,37.555)] +Begier Ave [(-122.15,37.314),(-122.1488,37.317)] +Begonia Dr [(-122.1334,37.01),(-122.1342,37.01)] +Begonia St [(-122.0153,37.785),(-122.0156,37.772)] +Begonia St [(-122.0218,37.797),(-122.022,37.789)] +Bel Aire St [(-122.0717,37.726),(-122.0714,37.725)] +Bell St [(-121.99126,37.4916),(-121.991407,37.49215)] +Belleview Dr [(-122.1626,37.325),(-122.1635,37.32)] +Bellevue Ave [(-122.2529,37.13),(-122.2521,37.111)] +Bellflower Dr [(-122.0103,37.317),(-122.009979,37.31387)] +Bellhaven Ave [(-122.0354,37.414),(-122.0364,37.405)] +Belmont Ave [(-122.0708,37.588),(-122.0703,37.582)] +Belvedere Ave [(-122.1768,37.918),(-122.1772,37.918)] +Belvedere Ave [(-122.2892,37.767),(-122.2888,37.759)] +Benecia Ave [(-122.0077,37.222),(-122.0076,37.225)] +Benedict Dr [(-122.1326,37.204),(-122.1323,37.199)] +Benner Ct [(-121.9063,37.891),(-121.9076,37.888)] +Bennington Lane [(-122.103818,37.36136),(-122.1045,37.361)] +Benson Road [(-122.083217,37.94765),(-122.0891,37.928)] +Benton St [(-122.2605,37.713),(-122.2605,37.731)] +Berkeley Way [(-122.2747,37.722),(-122.2726,37.725)] +Berlin Way [(-121.7774,37.649),(-121.7766,37.649)] +Bernal Ave [(-121.8556,37.668),(-121.85626,37.68656)] +Bernal Ave [(-121.895208,37.57837),(-121.884914,37.57603)] +Bernhardt Dr [(-122.1852,37.297),(-122.1847,37.292)] +Bernhardt St [(-122.1326,37.399),(-122.1322,37.449)] +Berwind Ave [(-121.7308,37.183),(-121.7303,37.181)] +Besco Dr [(-121.9764,37.32),(-121.9761,37.311)] +Bess Ave [(-121.765239,37.625),(-121.763602,37.625)] +Best Ave [(-122.1622,37.284),(-122.1636,37.278)] +Betlen Dr [(-121.9407,37.026),(-121.9397,37.029)] +Betlen Dr [(-121.9507,37.018),(-121.950121,37.01678)] +Bettencourt St [(-122.0479,37.34),(-122.0473,37.337)] +Beverly Ave [(-122.1578,37.382),(-122.1572,37.375)] +Beverly Ave [(-122.1586,37.395),(-122.1582,37.388)] +Beverly St [(-121.736023,37.85177),(-121.737956,37.84632)] +Bianca Way [(-121.7244,37.946),(-121.7257,37.945)] +Bianca Way [(-121.7281,37.939),(-121.729,37.937)] +Biddle Ave [(-122.0317,37.425),(-122.0329,37.417)] +Bidwell Dr [(-121.9748,37.448),(-121.9763,37.427)] +Bidwell Dr [(-121.9763,37.422),(-121.9764,37.42)] +Biehs Ct [(-122.2289,37.386),(-122.2283,37.391)] +Big Burn Road [(-122.0918,37.802),(-122.1091,37.788)] +Binnacle Hill [(-122.2269,37.533),(-122.2274,37.523)] +Birch St [(-122.0269,37.368),(-122.0254,37.36)] +Birch St [(-122.1617,37.425),(-122.1614,37.417)] +Birch St [(-122.1653,37.478),(-122.1641,37.464)] +Birch St [(-122.1673,37.509),(-122.1661,37.492)] +Birch Creek Dr [(-121.8641,37.629),(-121.8642,37.64)] +Birdsall Ave [(-122.1907,37.774),(-122.1907,37.781)] +Birdsall Ave [(-122.191,37.789),(-122.1911,37.796)] +Birkdale Dr [(-122.0515,37.373),(-122.0521,37.368)] +Birkdale Way [(-122.0406,37.17),(-122.0386,37.153)] +Biscayne Ave [(-122.0734,37.278),(-122.0734,37.274)] +Bishop Ave [(-121.9911,37.635),(-121.9921,37.632)] +Bitterroot Ave [(-122.0091,37.276),(-122.0087,37.282)] +Black Ave [(-121.8816,37.721),(-121.8826,37.721)] +Black Ave [(-121.8909,37.704),(-121.892,37.698)] +Black Ave [(-121.8964,37.701),(-121.8967,37.706)] +Blackbird Way [(-121.8867,37.801),(-121.8876,37.801),(-121.8882,37.801)] +Blackstone Way [(-122.0393,37.724),(-122.0388,37.721)] +Blackstone Way [(-122.0418,37.736),(-122.043,37.743)] +Blacow Road [(-121.9909,37.33),(-121.9895,37.324)] +Blacow Road [(-122.0061,37.409),(-122.0053,37.405)] +Blacow Road [(-122.0179,37.469),(-122.0167,37.465)] +Blair Ave [(-122.2225,37.27),(-122.2217,37.276)] +Blair Ave [(-122.2364,37.263),(-122.2359,37.267)] +Blaisdell Way [(-121.9858,37.816),(-121.9853,37.811)] +Blake St [(-122.2622,37.639),(-122.2599,37.642)] +Blake St [(-122.2864,37.605),(-122.2845,37.608)] +Blanchard St [(-121.97,37.382),(-121.9693,37.382)] +Blanchard St [(-121.9729,37.38),(-121.9709,37.383)] +Blanding Ave [(-122.2313,37.68),(-122.2328,37.686)] +Blewett St [(-121.9732,37.373),(-121.9733,37.369)] +Bloomington Way [(-121.9448,37.205),(-121.9434,37.204)] +Blossom Ct [(-121.8766,37.395),(-121.876493,37.39469)] +Blossom Ct [(-122.0212,37.772),(-122.0213,37.769)] +Blossom Way [(-122.1096,37.758),(-122.1087,37.764),(-122.1057,37.774)] +Blue Coral [(-121.965392,37.69509),(-121.965261,37.70132)] +Bluebell Dr [(-121.74,37.151),(-121.7411,37.161)] +Bluefield Lane [(-122.1024,37.584),(-122.1033,37.561)] +Blythe St [(-122.0704,37.745),(-122.0711,37.739)] +Boar Cir [(-121.912463,37.08667),(-121.912335,37.09052)] +Bobwhite Ter [(-122.046797,37.80224),(-122.046672,37.80179)] +Bockman Road [(-122.1206,37.713),(-122.122,37.712)] +Bodie Ter [(-121.9253,37.884),(-121.9247,37.887)] +Boeing St [(-122.2122,37.34),(-122.2112,37.322)] +Bolero Ave [(-122.0904,37.297),(-122.0913,37.297)] +Bonar St [(-122.2857,37.653),(-122.2856,37.642)] +Bond St [(-122.2071,37.718),(-122.2067,37.716)] +Bond St [(-122.2126,37.75),(-122.2116,37.739)] +Bonde Way [(-122.0077,37.59),(-122.0084,37.58)] +Bonita Ave [(-122.2355,37.306),(-122.235,37.296)] +Bonita Ave [(-122.2727,37.843),(-122.2725,37.835)] +Bonner Ave [(-121.9748,37.635),(-121.976,37.631)] +Bonnie St [(-122.0332,37.381),(-122.0324,37.378)] +Booker Way [(-122.0898,37.464),(-122.0902,37.454)] +Boone Dr [(-121.9825,37.329),(-121.9829,37.324)] +Boone Dr [(-122.0271,37.151),(-122.02815,37.14124)] +Bordeaux St [(-121.7685,37.688),(-121.7687,37.664)] +Boston Ave [(-122.2132,37.961),(-122.2129,37.969)] +Boulevard Way [(-122.2427,37.18),(-122.2423,37.181)] +Bourbon Dr [(-122.0869,37.194),(-122.0878,37.192)] +Bowditch St [(-122.2559,37.665),(-122.2557,37.656)] +Bowie Common [(-122.042847,37.64532),(-122.042808,37.64484)] +Boxwood Way [(-121.9329,37.094),(-121.9335,37.096)] +Bradrick Dr [(-122.138,37.962),(-122.1361,37.963)] +Bradshire Road [(-122.0885,37.204),(-122.0883,37.2)] +Bramble Ct [(-122.0944,37.941),(-122.0951,37.94)] +Brann St [(-122.1806,37.709),(-122.1785,37.705)] +Brayton Ct [(-122.0123,37.423),(-122.0114,37.418)] +Breakwater Ave [(-122.1196,37.294),(-122.1203,37.282)] +Brentford St [(-122.1965,37.581),(-122.1964,37.564)] +Breton Dr [(-122.0435,37.463),(-122.043,37.458)] +Brian St [(-122.0686,37.348),(-122.0693,37.344)] +Briar Cliff Road [(-122.1409,37.647),(-122.1382,37.658)] +Briarwood Dr [(-121.7663,37.915),(-121.7652,37.916)] +Brickell Way [(-122.067,37.104),(-122.067,37.101)] +Bridge Ct [(-122.0879,37.848),(-122.0874,37.844)] +Bridgepointe Dr [(-122.0514,37.305),(-122.0509,37.299)] +Bridgeview Dr [(-122.2112,37.133),(-122.21,37.138)] +Bridgewood Ter [(-122.0042,37.639),(-122.0047,37.632)] +Brier St [(-122.0806,37.959),(-122.0805,37.963)] +Brighton Ave [(-122.2944,37.979),(-122.2934,37.979)] +Brighton Dr [(-121.9263,37.188),(-121.9277,37.189),(-121.9285,37.19)] +Brighton Dr [(-121.931,37.198),(-121.9312,37.197)] +Briscoe Ter [(-121.948491,37.4184),(-121.948634,37.41645)] +Bristol Blvd [(-122.1674,37.353),(-122.1698,37.342)] +Bristolwood Road [(-121.9165,37.78),(-121.9164,37.787)] +Broadmoor Blvd [(-122.147,37.397),(-122.1466,37.399)] +Broadmoor Blvd [(-122.156,37.358),(-122.1546,37.364)] +Broadmoor St [(-121.7313,37.257),(-121.7313,37.263)] +Broadmoor St [(-121.7314,37.194),(-121.7314,37.199)] +Broadmoor St [(-121.7314,37.213),(-121.7314,37.221)] +Broadmore Ave [(-122.095,37.522),(-122.0936,37.497)] +Broadway [(-122.2212,37.5),(-122.2204,37.517)] +Broadway [(-122.2372,37.631),(-122.236753,37.63675)] +Broadway [(-122.2391,37.493),(-122.2386,37.495)] +Broadway [(-122.2409,37.586),(-122.2395,37.601)] +Broadway [(-122.243008,37.55961),(-122.2427,37.563)] +Broadway [(-122.245,37.45),(-122.2443,37.46),(-122.2436,37.469)] +Broadway [(-122.2457,37.528),(-122.2455,37.529)] +Broadway [(-122.2472,37.418),(-122.2468,37.426)] +Broadway [(-122.2539,37.316),(-122.2525,37.337)] +Broadway [(-122.2598,37.222),(-122.2596,37.227)] +Broadway [(-122.2632,37.167),(-122.2626,37.177),(-122.2617,37.19)] +Broadway [(-122.2719,37.028),(-122.2714,37.036)] +Broadway [(-122.2727,37.015),(-122.2723,37.021)] +Broadway Ter [(-122.2429,37.393),(-122.2413,37.397)] +Brookdale Ave [(-122.2043,37.834),(-122.2032,37.824)] +Brookdale Ave [(-122.2092,37.878),(-122.208568,37.87208)] +Brookdale Ave [(-122.2095,37.888),(-122.2088,37.882)] +Brookdale Blvd [(-122.0915,37.164),(-122.0912,37.166)] +Brookdale Blvd [(-122.0965,37.123),(-122.0958,37.133)] +Brooklyn Ave [(-122.2425,37.029),(-122.2416,37.026)] +Brooklyn Ave [(-122.2455,37.04),(-122.2445,37.036)] +Brooklyn Ave [(-122.2502,37.055),(-122.2495,37.053)] +Brookside Ct [(-121.9218,37.902),(-121.9213,37.908)] +Browning Ct [(-122.037289,37.766),(-122.038366,37.76228)] +Browning St [(-122.2874,37.686),(-122.2872,37.669)] +Bruce Ct [(-122.0595,37.084),(-122.0588,37.076)] +Bruce Dr [(-121.9442,37.309),(-121.945,37.312)] +Brunetti Lane [(-122.136,37.91),(-122.1351,37.906)] +Bruns Road [(-121.603992,37.95307),(-121.6046,37.049)] +Brush St [(-122.2788,37.065),(-122.2784,37.07)] +Brush St [(-122.283,37.989),(-122.2827,37.994)] +Brush Ramp St [(-122.2758,37.107),(-122.27511,37.11304),(-122.275,37.114)] +Bryant St [(-121.9216,37.321),(-121.9213,37.316)] +Bryce Canyon Ct [(-121.9008,37.78),(-121.9017,37.78)] +Buchanan St [(-122.3022,37.877),(-122.3014,37.878)] +Buckeye Pl [(-122.0448,37.336),(-122.0452,37.332)] +Buckingham Blvd [(-122.2231,37.59),(-122.2214,37.606)] +Buckingham Way [(-122.0647,37.214),(-122.0653,37.214)] +Buckingham Way [(-122.0689,37.208),(-122.0693,37.207)] +Buckner Ter [(-122.060105,37.62504),(-122.059743,37.62326)] +Bucks Lake St [(-122.0559,37.882),(-122.0546,37.874)] +Buckskin Road [(-121.7421,37.213),(-121.7421,37.22)] +Budwing Ter [(-121.9516,37.136),(-121.951826,37.13555)] +Buena Ave [(-122.2786,37.792),(-122.2773,37.797)] +Buena Ave [(-122.2813,37.781),(-122.2807,37.782)] +Buena Vista Ave [(-122.2301,37.437),(-122.2295,37.424)] +Buena Vista Ave [(-122.2337,37.651),(-122.2328,37.645)] +Buena Vista Ave [(-122.2359,37.47),(-122.2353,37.468)] +Buena Vista Ave [(-122.251,37.735),(-122.2499,37.73)] +Buena Vista Ave [(-122.2687,37.774),(-122.2673,37.773)] +Buena Vista Ave [(-122.271,37.774),(-122.2698,37.774)] +Buena Vista Way [(-122.2609,37.805),(-122.2597,37.809)] +Bullard Dr [(-122.2157,37.297),(-122.2138,37.276)] +Bullard St [(-121.9694,37.355),(-121.97,37.349)] +Burdeck Dr [(-122.1939,37.099),(-122.1932,37.091)] +Burdette St [(-121.9789,37.609),(-121.9795,37.611)] +Burdette St [(-121.98,37.62),(-121.9801,37.626)] +Burdick St [(-122.0273,37.421),(-122.0266,37.418)] +Burk St [(-122.2501,37.101),(-122.2502,37.106)] +Burkhart Ave [(-122.1422,37.856),(-122.1431,37.859)] +Burlington St [(-122.2046,37.057),(-122.2042,37.058)] +Burnett St [(-122.2823,37.539),(-122.281,37.541)] +Burnham Way [(-121.9242,37.176),(-121.9243,37.183)] +Burnside Ct [(-122.0063,37.345),(-122.0069,37.338)] +Busby Ave [(-122.1545,37.79),(-122.154983,37.78916)] +Butte Ct [(-121.783,37.938),(-121.783,37.934)] +Butterfield Dr [(-122.0838,37.002),(-122.0834,37.987)] +C St [(-122.0218,37.05),(-122.0224,37.045)] +C St [(-122.0737,37.767),(-122.0722,37.778)] +C St [(-122.0773,37.742),(-122.0756,37.754)] +C St [(-122.0906,37.681),(-122.0896,37.684)] +C St [(-122.1737,37.418),(-122.1723,37.399),(-122.1716,37.393)] +C St [(-122.1768,37.46),(-122.1749,37.435)] +Cabello St [(-122.078,37.811),(-122.0783,37.807)] +Cabernet Ct [(-121.8636,37.593),(-121.8641,37.582)] +Cabot Blvd [(-122.1334,37.412),(-122.1326,37.399)] +Cabot Ct [(-121.9848,37.583),(-121.9833,37.583)] +Cabral Dr [(-122.0294,37.569),(-122.0288,37.563)] +Cabral Dr [(-122.0348,37.648),(-122.035,37.643)] +Cabrillo Dr [(-122.0153,37.515),(-122.0144,37.511)] +Cabrillo Dr [(-122.0325,37.637),(-122.0318,37.633)] +Cabrillo Dr [(-122.091,37.218),(-122.0932,37.222)] +Cadiz Dr [(-122.0239,37.655),(-122.0235,37.653)] +Calaroga Ave [(-122.0886,37.297),(-122.0885,37.276)] +Calaroga Ave [(-122.0892,37.374),(-122.0888,37.361)] +Calaroga Ave [(-122.09,37.386),(-122.0897,37.38)] +Calaroga Ave [(-122.101,37.493),(-122.1006,37.487)] +Calaveras Ave [(-121.9924,37.364),(-121.9927,37.359)] +Calaveras Ave [(-122.1864,37.845),(-122.1854,37.841)] +Calaveras Road [(-121.8389,37.143),(-121.8338,37.128)] +Calaveras Road [(-121.8476,37.209),(-121.8431,37.178)] +Calaveras Creek [(-121.8203,37.035),(-121.8207,37.931)] +Calaveras Creek [(-121.8531,37.337),(-121.8517,37.316)] +Calaveras Creek [(-121.8637,37.611),(-121.8628,37.587)] +Calcott Ct [(-122.0306,37.822),(-122.0311,37.817)] +Caldecott Lane [(-122.2312,37.512),(-122.2261,37.491)] +Calhoun St [(-122.0542,37.43),(-122.0521,37.428)] +Calhoun St [(-122.2409,37.553),(-122.2405,37.551)] +Caliban Dr [(-122.0553,37.765),(-122.053955,37.75806)] +Caliente Dr [(-122.1393,37.993),(-122.1409,37.99),(-122.1417,37.993)] +California St [(-122.1952,37.942),(-122.1946,37.935)] +California St [(-122.2032,37.005),(-122.2016,37.996)] +California St [(-122.2767,37.563),(-122.2767,37.554)] +California St [(-122.2791,37.698),(-122.2787,37.681)] +California St [(-122.2793,37.743),(-122.2794,37.733)] +California St [(-122.2795,37.761),(-122.2795,37.751)] +California Aqueduct [(-121.587742,37.65201),(-121.600239,37.70939)] +California Aqueduct [(-121.622944,37.98443),(-121.622669,37.98611)] +Call Ave [(-122.0435,37.56),(-122.0436,37.566)] +Calle Alegre [(-121.895178,37.71975),(-121.8946,37.725)] +Calle Altamira [(-121.8994,37.669),(-121.8988,37.656)] +Calle de la Mesa [(-121.905106,37.71532),(-121.906643,37.69977)] +Calle de Monte [(-122.2452,37.344),(-122.2456,37.34)] +Calle Morelia [(-121.9003,37.684),(-121.9006,37.691)] +Calmar Ave [(-122.2384,37.105),(-122.2381,37.113)] +Camanoe Lane [(-122.2339,37.33),(-122.2334,37.326)] +Cambio Ct [(-122.0217,37.558),(-122.0226,37.552)] +Cambridge Ave [(-122.1616,37.335),(-122.1575,37.353)] +Cambridge Way [(-122.2442,37.231),(-122.2419,37.244)] +Camden St [(-121.9932,37.571),(-121.992,37.564)] +Camden St [(-121.9956,37.603),(-121.9955,37.598)] +Camden St [(-122.1823,37.735),(-122.1817,37.73)] +Camelford Pl [(-122.1933,37.211),(-122.1919,37.216)] +Camelia Dr [(-121.7852,37.695),(-121.7852,37.686)] +Camelia St [(-122.2928,37.792),(-122.2916,37.792)] +Camero Pl [(-121.9461,37.463),(-121.9453,37.454)] +Camero Way [(-121.9481,37.459),(-121.9488,37.456)] +Cameron Ave [(-121.86732,37.8431),(-121.865836,37.84371)] +Cameron Ave [(-122.1316,37.502),(-122.1327,37.481)] +Camino del Valle [(-122.2431,37.343),(-122.2437,37.334)] +Camino Santa Barbara [(-121.9314,37.446),(-121.9303,37.436)] +Camino Segura [(-121.900094,37.71647),(-121.9002,37.726)] +Campbell St [(-122.2941,37.123),(-122.2936,37.129)] +Campbell St [(-122.2985,37.066),(-122.2981,37.077)] +Campus Dr [(-122.0578,37.665),(-122.0545,37.66)] +Campus Dr [(-122.1626,37.858),(-122.1611,37.843)] +Campus Dr [(-122.1704,37.905),(-122.1678,37.868),(-122.1671,37.865)] +Canary Ct [(-122.019,37.856),(-122.0192,37.85)] +Canfield Dr [(-121.9952,37.488),(-121.9955,37.482)] +Canon Ave [(-122.21715,37.01951),(-122.2151,37.053)] +Canterbury Lane [(-121.9277,37.141),(-121.9276,37.149)] +Canterbury St [(-121.995,37.573),(-121.9948,37.57)] +Canyon Heights Dr [(-121.9431,37.568),(-121.9433,37.571)] +Canyon Heights Dr [(-121.9513,37.618),(-121.9528,37.627)] +Canyon Heights Dr [(-121.9595,37.76),(-121.9596,37.753)] +Cape Cod Dr [(-122.1351,37.928),(-122.1331,37.928)] +Capella Lane [(-122.2345,37.322),(-122.2352,37.326)] +Capitan Dr [(-121.84488,37.65695),(-121.84458,37.65195)] +Capricorn Ave [(-122.2176,37.404),(-122.2164,37.384)] +Capulet Cir [(-122.057612,37.69268),(-122.0578,37.7)] +Cardinal Dr [(-121.7865,37.805),(-121.7858,37.805)] +Caribbean Com [(-122.0361,37.73),(-122.0366,37.724)] +Carleton St [(-122.2641,37.617),(-122.2619,37.62)] +Carlos Bee Blvd [(-122.065049,37.59928),(-122.0639,37.596)] +Carlston Ave [(-122.23,37.132),(-122.2307,37.141)] +Carmel Ave [(-122.2891,37.979),(-122.2893,37.968),(-122.2893,37.95)] +Carmel Dr [(-122.0965,37.135),(-122.0958,37.133)] +Carmel Way [(-122.1394,37.979),(-122.1386,37.98)] +Carmel Way [(-122.1419,37.98),(-122.1411,37.98)] +Carmen St [(-121.9501,37.38),(-121.9484,37.369)] +Carnation Way [(-121.9975,37.775),(-121.996,37.773)] +Carol Ave [(-121.9537,37.283),(-121.955,37.282)] +Carol Ave [(-121.9574,37.279),(-121.959,37.277)] +Carol Ave [(-121.9657,37.27),(-121.9679,37.268)] +Caroline St [(-122.2676,37.695),(-122.2676,37.706)] +Carolyn St [(-122.1108,37.038),(-122.1091,37.028)] +Carpentier St [(-122.1567,37.203),(-122.1561,37.194)] +Carriage Circle Com [(-122.0128,37.433),(-122.0129,37.431)] +Carrol Road [(-121.659839,37.19494),(-121.659626,37.19326)] +Carson St [(-122.1846,37.9),(-122.1843,37.901)] +Carver Lane [(-121.877,37.057),(-121.8811,37.068)] +Cascade Road [(-122.1832,37.241),(-122.1808,37.216)] +Cascade St [(-122.0839,37.416),(-122.0831,37.416)] +Cascade St [(-122.0894,37.448),(-122.0887,37.431)] +Cassiopia St [(-121.735979,37.18311),(-121.735979,37.19069)] +Castilian Road [(-121.9447,37.135),(-121.9445,37.14)] +Castille Lane [(-122.0826,37.811),(-122.082655,37.8124)] +Castillejo Road [(-121.9397,37.313),(-121.9396,37.304)] +Castle Park Way [(-122.1936,37.15),(-122.1933,37.151)] +Castlewood Dr [(-121.8895,37.376),(-121.8902,37.373)] +Castro St [(-122.1629,37.144),(-122.1636,37.141)] +Castro St [(-122.2739,37.114),(-122.2735,37.121)] +Castro St [(-122.2749,37.1),(-122.2746,37.103)] +Castro St [(-122.2757,37.084),(-122.2753,37.091)] +Castro St [(-122.2782,37.045),(-122.2778,37.052)] +Castro St [(-122.2787,37.03),(-122.2785,37.038)] +Castro Valley Blvd [(-122.0478,37.966),(-122.047,37.969)] +Castro Valley Blvd [(-122.049131,37.96068),(-122.048358,37.96377)] +Castro Valley Blvd [(-122.0604,37.92),(-122.0585,37.925)] +Castro Valley Blvd [(-122.081,37.954),(-122.0801,37.955)] +Castro Valley Blvd [(-122.086,37.939),(-122.0853,37.942)] +Catalina Ave [(-122.2458,37.329),(-122.246102,37.33109)] +Catalina Dr [(-121.7837,37.628),(-121.7834,37.628)] +Catalina Dr [(-121.7892,37.66),(-121.7896,37.649)] +Catalpa Way [(-122.0852,37.218),(-122.088,37.207)] +Cato Ct [(-122.0691,37.944),(-122.0694,37.938)] +Catron Dr [(-122.1716,37.27),(-122.1711,37.275)] +Cavalier Lane [(-121.9361,37.175),(-121.9363,37.189)] +Cavendish Dr [(-122.0477,37.158),(-122.0475,37.151)] +Cavour St [(-122.2555,37.375),(-122.2561,37.379)] +Cayuga Pl [(-121.9205,37.023),(-121.9218,37.02)] +Cayuga Way [(-121.9233,37.013),(-121.9239,37.008)] +Cedar Blvd [(-122.0214,37.402),(-122.0193,37.391)] +Cedar Blvd [(-122.0282,37.446),(-122.0265,37.43)] +Cedar Dr [(-121.7964,37.859),(-121.7941,37.858),(-121.7931,37.858)] +Cedar Lane [(-121.9173,37.08),(-121.9183,37.083),(-121.9196,37.089),(-121.92,37.098)] +Cedar St [(-121.9188,37.277),(-121.92,37.276)] +Cedar St [(-122.260055,37.79558),(-122.2582,37.798)] +Cedar St [(-122.2841,37.764),(-122.2818,37.766)] +Cedar St [(-122.2864,37.76),(-122.2858,37.762)] +Cedar St [(-122.2913,37.755),(-122.2905,37.756)] +Cedar St [(-122.2945,37.75),(-122.2934,37.753)] +Cedar St [(-122.3011,37.737),(-122.2999,37.739)] +Cedar St [(-122.3043,37.729),(-122.3032,37.732)] +Cedar St [(-122.3045,37.078),(-122.3041,37.087)] +Cedarwood Lane [(-121.8746,37.706),(-121.8746,37.721)] +Celia St [(-122.0611,37.3),(-122.0616,37.299)] +Celia St [(-122.0623,37.297),(-122.0631,37.296)] +Center St [(-122.0598,37.052),(-122.0593,37.046)] +Center St [(-122.0599,37.111),(-122.06,37.106)] +Center St [(-122.0606,37.968),(-122.0608,37.958)] +Center St [(-122.2674,37.704),(-122.267,37.704)] +Central Ave [(-122.0064,37.524),(-122.0079,37.505)] +Central Ave [(-122.0118,37.455),(-122.0129,37.443)] +Central Ave [(-122.0148,37.415),(-122.0157,37.404)] +Central Ave [(-122.0302,37.226),(-122.0325,37.196)] +Central Ave [(-122.0487,37.144),(-122.0452,37.158)] +Central Ave [(-122.2309,37.579),(-122.2276,37.557)] +Central Ave [(-122.2343,37.602),(-122.2331,37.595)] +Central Ave [(-122.27,37.715),(-122.2685,37.714)] +Central Ave [(-122.2787,37.718),(-122.2777,37.717),(-122.2762,37.717)] +Central Ave [(-122.2906,37.769),(-122.2905,37.756)] +Central Blvd [(-122.0643,37.553),(-122.0633,37.552),(-122.0622,37.545)] +Central Blvd [(-122.0703,37.582),(-122.0697,37.586)] +Cerrito St [(-122.3023,37.93),(-122.3018,37.918)] +Cerro Vista Pl [(-121.73402,37.74008),(-121.735461,37.73955)] +Chabolyn Ter [(-122.242959,37.5192),(-122.2429,37.519)] +Chabot Ct [(-122.2432,37.489),(-122.2439,37.5)] +Chabot Canal [(-121.9027,37.804),(-121.9027,37.812)] +Chabot Canal [(-121.9036,37.013),(-121.9044,37.017)] +Chabot Canal [(-121.9044,37.017),(-121.9037,37.02)] +Chabot Crest [(-122.2425,37.504),(-122.2427,37.514)] +Chambers Dr [(-122.2004,37.352),(-122.1972,37.368)] +Chambers Lane [(-122.2001,37.359),(-122.1975,37.371)] +Champagne Pl [(-121.950378,37.11376),(-121.949579,37.11174)] +Champion St [(-122.214,37.991),(-122.2147,37.002)] +Champion St [(-122.2146,37.977),(-122.2145,37.982)] +Chance St [(-122.0536,37.259),(-122.0534,37.256)] +Chandler Road [(-122.10851,37.48139),(-122.108787,37.48677)] +Channel St [(-122.1372,37.71),(-122.1369,37.706)] +Channing Way [(-122.2453,37.425),(-122.2466,37.408)] +Channing Way [(-122.2638,37.664),(-122.2629,37.665),(-122.2606,37.669)] +Channing Way [(-122.2695,37.657),(-122.2669,37.66)] +Channing Way [(-122.2727,37.652),(-122.2717,37.653)] +Channing Way [(-122.2806,37.641),(-122.2795,37.641)] +Channing Way [(-122.2842,37.636),(-122.2835,37.637)] +Channing Way [(-122.292641,37.62357),(-122.2925,37.624)] +Chapel Ct [(-122.1508,37.897),(-122.1508,37.894)] +Chapman Dr [(-122.0421,37.504),(-122.0414,37.498)] +Chardonnay Dr [(-121.846993,37.64201),(-121.846448,37.64146)] +Charles St [(-122.0255,37.505),(-122.0252,37.499)] +Charlotte Way [(-121.7247,37.839),(-121.7246,37.836)] +Charlotte Way [(-121.7261,37.856),(-121.7254,37.851)] +Charlotte Way [(-121.733871,37.88044),(-121.734295,37.88051)] +Charter Oaks Dr [(-122.0574,37.212),(-122.0568,37.22)] +Chateau Way [(-121.7627,37.727),(-121.7627,37.723)] +Chateau Park Ct [(-121.9658,37.196),(-121.966,37.193)] +Chatsworth St [(-121.7766,37.502),(-121.7766,37.496)] +Chaucer Dr [(-122.0339,37.813),(-122.0342,37.812)] +Chaucer Dr [(-122.0357,37.794),(-122.0362,37.788)] +Chelsea Dr [(-122.03044,37.5228),(-122.0303,37.522)] +Chelsea Way [(-122.068,37.224),(-122.0686,37.223)] +Chelton Dr [(-122.189,37.293),(-122.1887,37.304)] +Chemult Com [(-121.9254,37.878),(-121.9255,37.881)] +Cherry Lane [(-121.966799,37.63085),(-121.966874,37.63373)] +Cherry St [(-122.0266,37.297),(-122.0258,37.294)] +Cherry St [(-122.040954,37.37918),(-122.04,37.369)] +Cherry St [(-122.0429,37.396),(-122.0424,37.392)] +Cherry St [(-122.0437,37.42),(-122.0434,37.413)] +Cherry St [(-122.1511,37.161),(-122.1503,37.149)] +Cherry St [(-122.1671,37.488),(-122.1661,37.474)] +Cherry St [(-122.1691,37.512),(-122.1684,37.502)] +Cherrywood Dr [(-122.023,37.838),(-122.0237,37.82)] +Cheryl Cir [(-121.8979,37.8),(-121.8957,37.794)] +Cheryl Ann Cir [(-122.0754,37.352),(-122.076,37.358)] +Chester St [(-122.0791,37.955),(-122.079,37.932)] +Chester St [(-122.2949,37.07),(-122.2946,37.078)] +Chestnut St [(-122.2482,37.733),(-122.2475,37.742)] +Chestnut St [(-122.2853,37.069),(-122.2848,37.084)] +Chestnut St [(-122.2873,37.722),(-122.2873,37.711)] +Chetwood Ave [(-121.9591,37.232),(-121.960057,37.23087)] +Chetwood St [(-122.2521,37.167),(-122.2513,37.169)] +Cheyenne River Com [(-122.0521,37.779),(-122.0524,37.775)] +Chiltern Dr [(-121.9414,37.433),(-121.9412,37.424)] +Chiltern Dr [(-121.9447,37.457),(-121.9442,37.454)] +Chimney Rock [(-122.13,37.701),(-122.12905,37.70195)] +Chippendale Dr [(-122.0665,37.843),(-122.068,37.828)] +Chisholm Ct [(-122.0773,37.42),(-122.077,37.409)] +Choctaw Dr [(-121.9179,37.87),(-121.9172,37.876)] +Chris Commons [(-121.73647,37.89437),(-121.736359,37.88665)] +Chrisholm Pl [(-121.9599,37.726),(-121.9592,37.732)] +Christensen Ct [(-122.0863,37.074),(-122.0863,37.065)] +Christensen Lane [(-122.085026,37.06463),(-122.0844,37.064)] +Christensen Road [(-121.625309,37.79774),(-121.621265,37.83993)] +Christina Ct [(-121.8654,37.629),(-121.8651,37.616)] +Christine Dr [(-122.0759,37.739),(-122.0756,37.734)] +Christine St [(-122.0364,37.385),(-122.0357,37.379)] +Christy St [(-121.9662,37.022),(-121.9658,37.019)] +Church St [(-122.179,37.675),(-122.1785,37.678)] +Cindy Lane [(-121.7346,37.8244),(-121.734673,37.83042)] +Circle Way [(-121.9418,37.013),(-121.9422,37.02)] +Citron Way [(-122.1008,37.461),(-122.1017,37.46)] +Civic Terrace Ave [(-122.0251,37.389),(-122.0263,37.374)] +Clara St [(-122.1855,37.377),(-122.1851,37.381)] +Clara St [(-122.187,37.339),(-122.1865,37.357)] +Claremont Ave [(-122.2429,37.607),(-122.2421,37.609)] +Claremont Ave [(-122.243294,37.59318),(-122.2434,37.59)] +Claremont Ave [(-122.246,37.565),(-122.2461,37.562)] +Claremont Ave [(-122.2508,37.509),(-122.2505,37.514)] +Claremont Ave [(-122.2591,37.408),(-122.2586,37.413)] +Claremont Ave [(-122.2612,37.386),(-122.2604,37.393)] +Claremont Pl [(-122.0542,37.995),(-122.0542,37.008)] +Clarendon Cres [(-122.2278,37.126),(-122.2266,37.119)] +Claret Road [(-121.757012,37.72568),(-121.757266,37.71391)] +Clarewood Lane [(-122.2343,37.393),(-122.232365,37.38802)] +Clarke Lane [(-122.236271,37.29202),(-122.236552,37.28906)] +Clarke St [(-122.1568,37.225),(-122.1562,37.217)] +Clausen Ct [(-122.040846,37.6758),(-122.040845,37.66913)] +Clawiter Road [(-122.1186,37.321),(-122.1186,37.308)] +Clawiter Road [(-122.1187,37.442),(-122.1188,37.435)] +Clay St [(-122.2733,37.051),(-122.2729,37.059)] +Clay St [(-122.2755,37.017),(-122.2751,37.024)] +Clement Ave [(-122.2525,37.765),(-122.252147,37.76429)] +Cleveland Ave [(-122.3061,37.895),(-122.3058,37.889)] +Cleveland St [(-122.2435,37.048),(-122.2418,37.042)] +Clifton St [(-122.2526,37.383),(-122.2533,37.388)] +Clipper Dr [(-122.2438,37.42),(-122.2437,37.406)] +Clover St [(-122.023,37.805),(-122.0217,37.801)] +Clubhouse Dr [(-121.8179,37.971),(-121.8181,37.972)] +Clubhouse Dr [(-122.121,37.67),(-122.1215,37.671)] +Clubhouse Dr [(-122.1227,37.671),(-122.1234,37.67)] +Cluny Pl [(-122.0438,37.432),(-122.0433,37.432)] +Coach Dr [(-122.1383,37.735),(-122.1355,37.706)] +Cobblestone Dr [(-122.00122,37.8492),(-122.000944,37.84795)] +Coco Palm Dr [(-121.9905,37.311),(-121.991,37.305)] +Codornices Creek [(-122.2986,37.83),(-122.2994,37.828)] +Codornices Creek [(-122.3069,37.818),(-122.3074,37.817)] +Cody Ct [(-121.9853,37.324),(-121.986,37.316)] +Coit Ave [(-121.9244,37.346),(-121.9244,37.338)] +Coit Ave [(-121.9245,37.352),(-121.924594,37.362)] +Colby St [(-122.1282,37.959),(-122.1279,37.959)] +Cold Water Dr [(-122.0403,37.068),(-122.041,37.069)] +Cole Pl [(-122.057,37.343),(-122.0564,37.334)] +Cole St [(-122.1974,37.724),(-122.1975,37.716)] +Cole St [(-122.1975,37.749),(-122.1962,37.76)] +Coleen St [(-121.79,37.763),(-121.7892,37.744)] +Coleport Landing [(-122.2374,37.426),(-122.2378,37.42)] +Coleport Landing [(-122.237889,37.41293),(-122.2379,37.412)] +Colette St [(-122.063,37.46),(-122.0623,37.451)] +Colette St [(-122.06565,37.4825),(-122.0646,37.479)] +Colgate Dr [(-122.0271,37.94),(-122.0249,37.933)] +Colgate St [(-122.1545,37.019),(-122.1538,37.014)] +Colima Ct [(-122.0251,37.664),(-122.0245,37.661)] +Coliseum Way [(-122.19759,37.4533),(-122.1948,37.444)] +Coliseum Way [(-122.2001,37.47),(-122.1978,37.516)] +Coliseum Way [(-122.2113,37.626),(-122.2085,37.592),(-122.2063,37.568)] +College Ave [(-121.7675,37.745),(-121.7658,37.745)] +College Ave [(-121.7693,37.744),(-121.769,37.744)] +College Ave [(-122.2506,37.367),(-122.2508,37.374)] +College Ave [(-122.2511,37.421),(-122.2512,37.429)] +College Ave [(-122.2516,37.474),(-122.2518,37.483)] +Collier Dr [(-122.1409,37.299),(-122.14,37.302)] +Colonial Loma Verde Dr [(-122.1184,37.849),(-122.117278,37.85528)] +Colony Ct [(-122.061894,37.27773),(-122.061805,37.27497)] +Colorados Dr [(-122.1757,37.281),(-122.1748,37.301)] +Columbia Dr [(-122.0574,37.168),(-122.0568,37.183)] +Columbia Dr [(-122.057463,37.28811),(-122.057463,37.28593)] +Columbian Dr [(-122.1635,37.727),(-122.1627,37.734)] +Columbine Pl [(-122.0122,37.321),(-122.013,37.33)] +Columbus Ave [(-121.776,37.679),(-121.7753,37.682)] +Columbus Ave [(-121.7786,37.68),(-121.7777,37.681)] +Colusa Ave [(-122.2786,37.835),(-122.2784,37.831)] +Colusa Ave [(-122.2794,37.922),(-122.2793,37.916)] +Colusa Ave [(-122.2812,37.943),(-122.2805,37.939)] +Colusa Ave [(-122.2847,37.973),(-122.2846,37.967)] +Colville Pl [(-122.0419,37.709),(-122.0402,37.702)] +Concannon Blvd [(-121.7804,37.608),(-121.779,37.608)] +Concord St [(-121.8551,37.602),(-121.856,37.593)] +Constitution Dr [(-121.816179,37.01178),(-121.816179,37.01023)] +Contra Costa Ave [(-122.0153,37.551),(-122.0141,37.545)] +Contra Costa Ave [(-122.2754,37.944),(-122.2754,37.918)] +Contreras Pl [(-122.0386,37.553),(-122.0387,37.55)] +Conway Ter [(-122.044884,37.64441),(-122.04466,37.64514)] +Coolidge Ave [(-122.2007,37.058),(-122.1992,37.06)] +Coolidge Ave [(-122.2104,37.957),(-122.2099,37.962)] +Coolidge Ave [(-122.2171,37.872),(-122.2169,37.875)] +Coral Road [(-122.1907,37.34),(-122.1902,37.334)] +Core Ter [(-122.047353,37.65391),(-122.047303,37.65185)] +Corey Way [(-122.0699,37.054),(-122.0698,37.046)] +Cormorant Ter [(-122.045468,37.80753),(-122.044829,37.80392)] +Cornell Ave [(-122.2956,37.925),(-122.2949,37.906),(-122.2939,37.875)] +Corning Ct [(-122.0689,37.688),(-122.0685,37.68)] +Cornish Dr [(-122.0228,37.75),(-122.0225,37.754)] +Coronado Lane [(-121.9026,37.843),(-121.9028,37.843)] +Corral Hollow Creek [(-121.590572,37.01116),(-121.599735,37.10676)] +Corriea Way [(-121.9501,37.402),(-121.9505,37.398)] +Corte de Flores [(-121.908126,37.71073),(-121.90924,37.71391)] +Corte Eulalia [(-122.1142,37.78),(-122.1154,37.776)] +Corte Munras [(-121.900576,37.74452),(-121.900804,37.74889)] +Corte Vera Cruz [(-121.9036,37.639),(-121.9038,37.642)] +Corte Yolanda [(-122.1426,37.753),(-122.1423,37.749)] +Cortland Way [(-121.7892,37.934),(-121.7885,37.939)] +Corvair St [(-122.2126,37.364),(-122.2132,37.36)] +Corvallis St [(-122.1527,37.974),(-122.1521,37.97)] +Cosgrave Ave [(-122.1621,37.62),(-122.1616,37.626)] +Cosmic Way [(-121.9659,37.423),(-121.9666,37.414)] +Cottage St [(-122.2593,37.713),(-122.258931,37.71803)] +Cotter Way [(-122.0904,37.818),(-122.0882,37.829)] +Cotton Ct [(-122.0462,37.123),(-122.0469,37.117)] +Cottonwood St [(-121.9116,37.732),(-121.9115,37.725)] +Cottonwood St [(-121.912,37.74),(-121.9118,37.735)] +Country Dr [(-121.9903,37.52),(-121.9916,37.506)] +Court St [(-122.2331,37.583),(-122.2324,37.589),(-122.2314,37.598)] +Courtland Ave [(-122.2041,37.801),(-122.2032,37.815)] +Courtland Ave [(-122.2084,37.76),(-122.2068,37.772)] +Cove Road [(-122.2468,37.425),(-122.2474,37.408)] +Covington Way [(-121.7935,37.936),(-121.7911,37.942)] +Cowing Road [(-122.0002,37.934),(-121.9772,37.782)] +Cowper St [(-122.2908,37.673),(-122.2894,37.675)] +Coyote Hills Slough [(-122.0904,37.85),(-122.0953,37.829)] +Coyote Hills Slough [(-122.1075,37.687),(-122.1285,37.643)] +Coyote River [(-121.931582,37.60707),(-121.932309,37.60824)] +Coyote River [(-121.9505,37.629),(-121.9582,37.646)] +Coyote River [(-121.9746,37.617),(-121.9863,37.648)] +Cragmont Ave [(-122.2616,37.921),(-122.2603,37.911)] +Cragmont Ave [(-122.266,37.95),(-122.2656,37.943)] +Craig St [(-121.9869,37.61),(-121.9864,37.601)] +Crane Ave [(-122.0578,37.103),(-122.058,37.086)] +Creed Road [(-122.2249,37.094),(-122.2256,37.101)] +Creekside Dr [(-121.924308,37.89385),(-121.925368,37.89008)] +Creekside Dr [(-121.926024,37.88774),(-121.926337,37.88663)] +Creekside Ter [(-121.997958,37.64593),(-121.998047,37.63504)] +Creekwood Dr [(-122.043309,37.66911),(-122.041422,37.66099)] +Crellin Road [(-121.846446,37.59189),(-121.846,37.591),(-121.845775,37.59073)] +Crest Ave [(-122.1039,37.067),(-122.1038,37.066)] +Crest Ave [(-122.162,37.699),(-122.1568,37.664)] +Crest Ct [(-122.0566,37.049),(-122.0571,37.05)] +Crest Lane [(-122.0558,37.047),(-122.0546,37.047)] +Crest Road [(-122.2149,37.216),(-122.2153,37.221)] +Crestline Road [(-121.887,37.789),(-121.8846,37.793)] +Crestmont Dr [(-122.1775,37.029),(-122.1798,37.044)] +Creston Road [(-122.2639,37.002),(-122.2613,37.986),(-122.2602,37.978),(-122.2598,37.973)] +Crestwood St [(-121.9589,37.159),(-121.961,37.156)] +Crisfield Lane [(-121.871,37.814),(-121.8718,37.813)] +Crocker Ave [(-122.2242,37.186),(-122.2243,37.171)] +Crockwood Ter [(-122.045255,37.66569),(-122.045487,37.66262)] +Cromwell Way [(-121.7723,37.932),(-121.7713,37.933)] +Crosby St [(-122.146,37.96),(-122.145,37.953)] +Cross Road [(-121.666843,37.7387),(-121.664768,37.7474)] +Crow Ct [(-121.8797,37.911),(-121.8801,37.91)] +Crow Canyon Road [(-122.0106,37.674),(-122.0102,37.675)] +Crow Canyon Road [(-122.0497,37.029),(-122.0479,37.028)] +Crow Canyon Road [(-122.0552,37.938),(-122.0545,37.967)] +Crow Canyon Creek [(-122.0425,37.051),(-122.0426,37.049)] +Crow Canyon Creek [(-122.043,37.905),(-122.0368,37.71)] +Crow Canyon Creek [(-122.046308,37.0015),(-122.046833,37.00133)] +Croxton Ave [(-122.2591,37.219),(-122.2584,37.211)] +Cryer St [(-122.1024,37.357),(-122.1035,37.351)] +Crystal Lane [(-121.868866,37.50763),(-121.870709,37.51024)] +Crystaline Dr [(-121.925856,37),(-121.925869,37.00527)] +Cull Canyon Road [(-122.0536,37.435),(-122.0499,37.315)] +Cull Canyon Reservoir [(-122.0546,37.039),(-122.0553,37.089)] +Cull Creek [(-122.0624,37.875),(-122.0582,37.527)] +Culver St [(-122.1998,37.865),(-122.1996,37.862)] +Cumberland Ave [(-122.1467,37.945),(-122.1507,37.944)] +Curran Way [(-122.2074,37.96),(-122.207,37.966)] +Curtis St [(-121.9765,37.246),(-121.9778,37.229)] +Curtis St [(-122.2866,37.981),(-122.2866,37.968),(-122.2867,37.949)] +Curtis St [(-122.2877,37.65),(-122.2877,37.639)] +Curtis St [(-122.2881,37.848),(-122.2883,37.831)] +Curtner Road [(-121.909,37.928),(-121.9084,37.928)] +Curtner Road [(-121.9117,37.939),(-121.9105,37.93)] +Cutler Ave [(-122.013942,37.74913),(-122.0142,37.745)] +Cypress St [(-122.2883,37.177),(-122.2884,37.184)] +Cypress St [(-122.2886,37.241),(-122.2883,37.247)] +Cypress St [(-122.2899,37.142),(-122.2894,37.156)] +Cypress St [(-122.2908,37.104),(-122.2905,37.113)] +Cypress St [(-122.2931,37.047),(-122.2928,37.055)] +Cypress Point Dr [(-121.7251,37.24),(-121.724,37.24)] +D St [(-122.0239,37.017),(-122.0242,37.015)] +D St [(-122.0529,37.421),(-122.0534,37.42)] +D St [(-122.055,37.798),(-122.0541,37.796),(-122.0529,37.794)] +D St [(-122.056892,37.79896),(-122.0564,37.8)] +D St [(-122.0746,37.745),(-122.0741,37.749)] +D St [(-122.179,37.476),(-122.1785,37.47)] +D St [(-122.1811,37.505),(-122.1805,37.497)] +Dagnino Road [(-121.7462,37.306),(-121.7461,37.379)] +Daisy St [(-122.1817,37.843),(-122.18,37.848),(-122.179,37.851)] +Daisy St [(-122.1857,37.858),(-122.185,37.851)] +Dalgo Road [(-121.947,37.529),(-121.9475,37.524)] +Dalton Way [(-122.0293,37.927),(-122.0297,37.915)] +Dalton Com [(-121.994,37.555),(-121.9944,37.556)] +Damon Slough [(-122.2057,37.533),(-122.2063,37.531)] +Dana St [(-122.2578,37.501),(-122.2579,37.507)] +Dana St [(-122.2583,37.548),(-122.2582,37.541)] +Daniels Dr [(-122.1346,37.317),(-122.1335,37.323)] +Darius Way [(-122.1272,37.18),(-122.1267,37.164)] +Darwin Dr [(-122.0335,37.776),(-122.0349,37.767)] +Darwin Dr [(-122.0359,37.763),(-122.0366,37.755)] +Darwin St [(-122.0996,37.317),(-122.1024,37.311)] +Daryl Ave [(-122.115,37.883),(-122.1149,37.866)] +Dashwood Ave [(-122.177,37.618),(-122.1755,37.627)] +Davenport Ave [(-122.1827,37.892),(-122.1823,37.872)] +David St [(-122.0637,37.958),(-122.0608,37.958)] +Davis St [(-122.1624,37.225),(-122.1632,37.222),(-122.1647,37.218)] +Davis St [(-122.1702,37.203),(-122.171,37.201)] +Davis St [(-122.1719,37.199),(-122.1725,37.198)] +Davis St [(-122.1831,37.165),(-122.1835,37.165)] +Davis St [(-122.1857,37.158),(-122.1921,37.139)] +Davis St [(-122.217903,37.89337),(-122.216,37.885)] +Davona Dr [(-121.9261,37.222),(-121.9278,37.218)] +Davy Ct [(-121.9902,37.629),(-121.99,37.623)] +Dawe Ave [(-122.0783,37.927),(-122.0783,37.912)] +Dawes St [(-122.2122,37.24),(-122.2112,37.226)] +Dawn View Ct [(-122.041,37.144),(-122.0403,37.143)] +Dayle Ct [(-121.943,37.37),(-121.9421,37.369)] +De Brum Commons [(-121.924934,37.30872),(-121.924728,37.30014)] +De la Cruz Road [(-122.0554,37.305),(-122.055,37.301)] +Dearborn St [(-122.0274,37.107),(-122.0275,37.101)] +Decatur Way [(-122.0868,37.296),(-122.0863,37.267)] +Decoto Road [(-122.0159,37.006),(-122.016,37.002),(-122.0164,37.993)] +Decoto Road [(-122.0175,37.961),(-122.0177,37.955)] +Decoto Road [(-122.0189,37.925),(-122.019,37.921)] +Decoto Road [(-122.0292,37.733),(-122.0315,37.707)] +Decoto Road [(-122.0361,37.656),(-122.0364,37.652)] +Deep Creek Road [(-122.049391,37.64053),(-122.04928,37.63888)] +Deep Creek Road [(-122.0533,37.749),(-122.053709,37.74218)] +Deep Creek Road [(-122.0536,37.697),(-122.0517,37.674),(-122.0513,37.668)] +Deer Oaks Dr [(-121.909133,37.54092),(-121.907389,37.54544)] +Deer Park Way [(-122.0279,37.526),(-122.0266,37.524)] +Deer Trail Pl [(-122.0455,37.669),(-122.044472,37.66938)] +Deering St [(-122.2146,37.904),(-122.2126,37.897)] +Deervale Road [(-121.9376,37.178),(-121.9374,37.184)] +Deerwood St [(-122.1775,37.623),(-122.177,37.618)] +Del Valle Pkwy [(-121.875441,37.66004),(-121.874759,37.65728)] +Del Valle Road [(-121.688828,37.70896),(-121.691152,37.7458)] +Delaware Dr [(-121.951,37.203),(-121.9517,37.201)] +Delaware St [(-122.2016,37.926),(-122.2015,37.925)] +Delaware Way [(-121.786362,37.92959),(-121.7863,37.93)] +Delmar Ave [(-121.7889,37.693),(-121.787,37.704)] +Delmar Ave [(-122.2453,37.545),(-122.2444,37.556)] +Delores Dr [(-122.0742,37.735),(-122.0752,37.727)] +Delta Ter [(-121.9592,37.113),(-121.959,37.111)] +Delta Mendota Canal [(-121.562031,37.5571),(-121.573749,37.57374)] +Delta Mendota Canal [(-121.57819,37.7187),(-121.578403,37.71976)] +Delta Mendota Canal [(-121.589243,37.84355),(-121.589222,37.84389)] +Denise Ct [(-121.9418,37.142),(-121.9414,37.127)] +Denise St [(-121.9469,37.37),(-121.945,37.359)] +Denker Dr [(-121.9086,37.861),(-121.9082,37.863),(-121.9079,37.864)] +Dennison St [(-122.2379,37.796),(-122.2374,37.796)] +Dennison St [(-122.2428,37.791),(-122.2412,37.793),(-122.239,37.795)] +Denslowe St [(-122.1851,37.336),(-122.1847,37.332)] +Denton Ave [(-122.1118,37.467),(-122.108659,37.47689)] +Denton Ave [(-122.1118,37.467),(-122.112277,37.46666)] +Depot Road [(-122.127518,37.3808),(-122.1284,37.38)] +Depot Road [(-122.1302,37.38),(-122.1323,37.379)] +Derby St [(-122.246,37.628),(-122.2451,37.629)] +Derby St [(-122.2617,37.612),(-122.2595,37.615)] +Derby St [(-122.2688,37.602),(-122.2663,37.606)] +Dering Pl [(-122.0192,37.701),(-122.0183,37.693)] +Devonshire Ave [(-122.1466,37.926),(-122.1498,37.924)] +Devonshire Ave [(-122.1507,37.924),(-122.1517,37.924)] +Dewey St [(-122.1483,37.862),(-122.1482,37.857)] +Diablo Ave [(-122.1186,37.358),(-122.1236,37.358)] +Diablo Pl [(-122.0543,37.973),(-122.0534,37.974)] +Diamond Dr [(-121.8008,37.669),(-121.7988,37.682)] +Diana Common [(-122.056116,37.61386),(-122.056337,37.62065)] +Dichondra Pl [(-122.009872,37.31128),(-122.009205,37.31438)] +Dillo St [(-122.1303,37.024),(-122.1303,37.016)] +Dimond Ave [(-122.2167,37.994),(-122.2162,37.006)] +Dixon St [(-122.0524,37.32),(-122.0514,37.311)] +Doane St [(-121.9531,37.149),(-121.9562,37.14)] +Doane St [(-121.9581,37.135),(-121.9597,37.13)] +Dobbel Ave [(-122.0319,37.46),(-122.0328,37.463)] +Dobbel Ave [(-122.0417,37.52),(-122.0408,37.515)] +Dohr St [(-122.2805,37.56),(-122.2804,37.548)] +Dolores Ave [(-122.1517,37.224),(-122.1498,37.229)] +Dolores Dr [(-121.8732,37.524),(-121.8724,37.519)] +Dolores Dr [(-121.875651,37.52705),(-121.87384,37.52324)] +Dolores St [(-122.078,37.842),(-122.0779,37.833)] +Dominici Dr [(-122.0149,37.756),(-122.0151,37.75)] +Donalban Cir [(-122.0464,37.71),(-122.0475,37.709)] +Donegal Ct [(-122.0433,37.549),(-122.0421,37.543)] +Donlan Canyon Creek [(-121.9687,37.097),(-121.9584,37.101)] +Donna Way [(-122.1333,37.606),(-122.1316,37.599)] +Donner Way [(-121.9969,37.37),(-121.9945,37.357)] +Donohue Dr [(-121.932,37.091),(-121.9327,37.106)] +Doolittle Dr [(-122.174643,37.98341),(-122.1735,37.965)] +Doolittle Dr [(-122.1793,37.052),(-122.1787,37.043)] +Doolittle Dr [(-122.193162,37.21747),(-122.193,37.216)] +Doolittle Dr [(-122.224088,37.448),(-122.2226,37.448)] +Dorisa Ave [(-122.1462,37.555),(-122.1448,37.572)] +Dorman Road [(-121.9061,37.834),(-121.9063,37.841)] +Dorne Pl [(-121.9455,37.397),(-121.9456,37.392)] +Dorothy Pl [(-122.2301,37.566),(-122.2302,37.571)] +Dorsey Ave [(-121.9992,37.495),(-121.9997,37.489)] +Dorthea Ct [(-121.9064,37.519),(-121.908617,37.52369)] +Dougherty Road [(-121.908447,37.2552),(-121.90838,37.2379)] +Dougherty Road [(-121.9093,37.127),(-121.9093,37.15418)] +Dougherty Road [(-121.909939,37.28669),(-121.909373,37.30234),(-121.9092,37.305)] +Douglas Dr [(-122.1705,37.227),(-122.1698,37.214)] +Dover Way [(-121.7929,37.906),(-121.7917,37.906)] +Dowe Ave [(-122.0439,37.903),(-122.04363,37.91098)] +Dowling Blvd [(-122.1467,37.359),(-122.1447,37.359)] +Dowling Blvd [(-122.1552,37.323),(-122.1542,37.335)] +Downing Pl [(-122.0549,37.035),(-122.0546,37.041)] +Doyle St [(-122.2835,37.337),(-122.2836,37.344)] +Drake Dr [(-122.2056,37.311),(-122.2043,37.302)] +Drew St [(-122.1288,37.938),(-122.1281,37.939)] +Drew Ter [(-121.956729,37.21923),(-121.956991,37.21808)] +Driftwood Dr [(-122.0109,37.482),(-122.0113,37.477)] +Driftwood Way [(-121.919,37.794),(-121.92,37.795)] +Driftwood Way [(-122.1726,37.924),(-122.1734,37.924)] +Driscoll Road [(-121.9482,37.403),(-121.948451,37.39995)] +Dry Creek [(-121.706461,37.12006),(-121.708998,37.15525)] +Dry Creek [(-122.0367,37.88386),(-122.038,37.877)] +Dublin Blvd [(-121.9096,37.047),(-121.9115,37.034)] +Dublin Blvd [(-121.945852,37.98712),(-121.944625,37.99187)] +Dublin Road [(-121.955087,37.97529),(-121.946646,37.94858)] +Dublin Way [(-122.251,37.425),(-122.2513,37.43)] +Dublin Canyon Road [(-121.94428,37.95399),(-121.943721,37.95527)] +Dublin Creek [(-121.9422,37.974),(-121.955,37.984)] +Dublin Green Dr [(-121.939669,37.10516),(-121.9384,37.097)] +Dudley Ave [(-122.222,37.241),(-122.2221,37.234)] +Duffel Pl [(-122.0641,37.434),(-122.0637,37.429)] +Dunbar Pl [(-122.011,37.632),(-122.0121,37.621)] +Dundee Ct [(-122.1458,37.166),(-122.1451,37.16)] +Dunkirk Ave [(-122.1254,37.526),(-122.1228,37.531)] +Dunn Road [(-122.1195,37.452),(-122.1211,37.451)] +Durant Ave [(-122.2603,37.678),(-122.2584,37.68)] +Durant Ave [(-122.2671,37.669),(-122.2652,37.67)] +Durham Road [(-121.9216,37.146),(-121.9234,37.149)] +Durham Road [(-121.957278,37.10033),(-121.957885,37.09857)] +Durham Road [(-121.9605,37.091),(-121.9616,37.087)] +Durham Road [(-121.9634,37.081),(-121.9642,37.078)] +Durham Way [(-122.0321,37.656),(-122.0311,37.642)] +Durillo Dr [(-121.9464,37.446),(-121.9457,37.441)] +Durk Way [(-122.097393,37.57955),(-122.097541,37.58144)] +Dusterberry Way [(-122.0141,37.565),(-122.0135,37.562)] +Dutton Ave [(-122.1403,37.339),(-122.1394,37.34)] +Dutton Ave [(-122.155,37.319),(-122.1534,37.323)] +Dwight Way [(-122.2483,37.662),(-122.2472,37.661)] +Dwight Way [(-122.2546,37.657),(-122.2533,37.659)] +Dwight Way [(-122.2573,37.654),(-122.256,37.656)] +Dwight Way [(-122.286,37.616),(-122.2851,37.617)] +Dwight Way [(-122.2933,37.602),(-122.292,37.605),(-122.291,37.607)] +Dyer St [(-122.0684,37.028),(-122.0691,37.005)] +Dyer St [(-122.0701,37.969),(-122.0703,37.965)] +E St [(-122.019,37.037),(-122.0195,37.032),(-122.0203,37.027),(-122.0208,37.022)] +E St [(-122.1832,37.505),(-122.1826,37.498),(-122.182,37.49)] +Eagle Ave [(-122.2342,37.668),(-122.2335,37.664)] +Eagle Ave [(-122.2539,37.76),(-122.253215,37.75657)] +Earhart Road [(-122.2004,37.256),(-122.2004,37.259)] +Earhart Road [(-122.2086,37.296),(-122.2012,37.255)] +Earhart Road [(-122.2186,37.394),(-122.2181,37.389)] +Earl St [(-122.1564,37.709),(-122.1552,37.697)] +East Ave [(-121.7203,37.799),(-121.7176,37.801)] +East Ave [(-121.7296,37.8),(-121.7251,37.8)] +East Ave [(-121.7424,37.799),(-121.7416,37.799)] +East Ave [(-121.7597,37.798),(-121.7558,37.8)] +East Ave [(-121.7641,37.8),(-121.763,37.8)] +East Ave [(-122.0361,37.719),(-122.0352,37.733)] +Easterday Way [(-121.9916,37.829),(-121.9899,37.814)] +Eastlawn St [(-122.1989,37.629),(-122.1982,37.623)] +Eastlawn St [(-122.2005,37.644),(-122.2,37.638)] +Eastman Ave [(-122.20024,37.86217),(-122.1998,37.865)] +Eastman Ave [(-122.2028,37.845),(-122.2012,37.856)] +Eastman Ct [(-122.0732,37.492),(-122.0722,37.486)] +Eastpark Ter [(-122.041182,37.77686),(-122.042271,37.78226)] +Eastshore Hwy [(-122.3057,37.785),(-122.3051,37.755)] +Ebbetts St [(-122.0061,37.205),(-122.005,37.203)] +Eden Ave [(-122.1143,37.505),(-122.1142,37.491)] +Eden Creek [(-122.0218,37.996),(-122.0222,37.961)] +Eden Creek [(-122.022037,37.00675),(-122.0221,37.998)] +Eden Landing Road [(-122.1204,37.268),(-122.1204,37.267)] +Eden Landing Road [(-122.1213,37.226),(-122.1213,37.223)] +Edenberry St [(-121.9347,37.23),(-121.9349,37.235)] +Edes Ave [(-122.1833,37.363),(-122.1821,37.359)] +Edes Ave [(-122.1948,37.444),(-122.1941,37.444)] +Edgebrook Dr [(-122.057639,37.71523),(-122.057506,37.72472)] +Edgehill Ct [(-122.1305,37.239),(-122.1304,37.232)] +Edgemoor St [(-122.1492,37.918),(-122.1492,37.91)] +Edgewater Dr [(-122.0285,37.526),(-122.028611,37.52295)] +Edgewater Dr [(-122.0306,37.542),(-122.0298,37.538)] +Edgewater Dr [(-122.0327,37.552),(-122.0315,37.546)] +Edgewater Dr [(-122.0387,37.579),(-122.038315,37.57785)] +Edgewater Dr [(-122.0401,37.57),(-122.0405,37.565)] +Edgewater Dr [(-122.201,37.379),(-122.2042,37.41)] +Edison Way [(-121.9443,37.098),(-121.9473,37.084)] +Edith St [(-122.02,37.43),(-122.0197,37.429)] +Edith St [(-122.077,37.638),(-122.0764,37.631)] +Edith St [(-122.2764,37.774),(-122.2763,37.765)] +Edith Way [(-122.0733,37.825),(-122.0716,37.804)] +Edwards Ave [(-122.1652,37.749),(-122.1638,37.759)] +Edwards Lane [(-122.0599,37.016),(-122.058514,37.01551)] +Eggers Ct [(-121.9924,37.585),(-121.991,37.576)] +Eggers Dr [(-122.0002,37.465),(-122.0017,37.451)] +Ehle St [(-122.103,37.973),(-122.1017,37.959)] +Eilene Dr [(-121.869254,37.87019),(-121.869113,37.87253)] +Eilene Dr [(-121.869618,37.86592),(-121.869389,37.86861)] +El Caminito [(-121.7883,37.673),(-121.7852,37.67)] +El Caminito [(-121.7922,37.696),(-121.7907,37.685),(-121.7898,37.681)] +El Camino Real [(-122.2409,37.559),(-122.2407,37.556)] +El Centro Ave [(-122.2191,37.116),(-122.2185,37.118)] +El Dorado Dr [(-121.7803,37.659),(-121.7801,37.647)] +El Monte Ave [(-122.1594,37.624),(-122.1591,37.63)] +El Paseo [(-122.244718,37.33016),(-122.2454,37.333)] +El Portal [(-122.2429,37.359),(-122.2434,37.361)] +El Portal Ave [(-121.9993,37.83),(-121.9997,37.817)] +El Portal Ct [(-122.2554,37.844),(-122.2552,37.85)] +El Rey Ave [(-122.0219,37.536),(-122.0225,37.53)] +Elba Way [(-121.9223,37.143),(-121.923,37.139)] +Elbert St [(-122.2205,37.107),(-122.2195,37.095)] +Elder Way [(-122.0819,37.229),(-122.0827,37.229)] +Eldridge Ave [(-122.0883,37.402),(-122.0878,37.395)] +Eldridge Ave [(-122.0896,37.423),(-122.0888,37.408)] +Elgin St [(-122.1106,37.911),(-122.1102,37.911)] +Elgin St [(-122.113,37.911),(-122.1119,37.911)] +Elgin St [(-122.1222,37.95),(-122.1213,37.945)] +Elk Ct [(-121.912463,37.08667),(-121.913575,37.09125)] +Elko Ct [(-122.1499,37.778),(-122.1496,37.773)] +Ellen Way [(-122.0685,37.83),(-122.0687,37.828)] +Ellen Way [(-122.0711,37.801),(-122.0716,37.796)] +Ellis St [(-122.2726,37.542),(-122.2723,37.524)] +Ellsworth St [(-122.2611,37.575),(-122.2608,37.57)] +Elm St [(-121.7815,37.865),(-121.7807,37.865)] +Elm St [(-122.04,37.27),(-122.0392,37.254)] +Elmhurst St [(-122.0916,37.568),(-122.0918,37.564)] +Elmridge Ct [(-121.8867,37.707),(-121.8871,37.702)] +Elsie Ave [(-122.1497,37.21),(-122.1447,37.223)] +Elverton Dr [(-122.2028,37.487),(-122.2017,37.471)] +Elvessa St [(-122.1296,37.528),(-122.129,37.522)] +Elysian Fields Dr [(-122.1275,37.646),(-122.1275,37.649)] +Elysian Fields Dr [(-122.1336,37.595),(-122.133,37.594)] +Elysian Fields Dr [(-122.1369,37.589),(-122.1361,37.595)] +Embarcadero [(-122.2527,37.894),(-122.246486,37.86908)] +Embarcadero [(-122.276,37.961),(-122.2747,37.956)] +Embarcadero [(-122.2836,37.99),(-122.283,37.989)] +Emerald Ave [(-121.9247,37.13),(-121.925,37.136)] +Emerald St [(-122.2557,37.309),(-122.2557,37.315)] +Emerson St [(-121.9276,37.345),(-121.9284,37.347)] +Emerson St [(-122.2688,37.543),(-122.2678,37.544)] +Emily Ct [(-122.0726,37.121),(-122.0712,37.124)] +Empire Road [(-122.1873,37.278),(-122.1858,37.277)] +Encinitas Way [(-122.0759,37.917),(-122.0756,37.911)] +Encino Dr [(-121.7959,37.688),(-121.7947,37.688)] +Endeavour Way [(-122.0655,37.842),(-122.0647,37.84)] +Endicott St [(-122.1436,37.931),(-122.1435,37.911)] +Enfield Dr [(-122.0273,37.519),(-122.0277,37.507)] +Enos Way [(-121.7677,37.896),(-121.7673,37.91)] +Ensenada Ave [(-122.2833,37.933),(-122.2825,37.928)] +Enterprise Pl [(-121.9568,37.009),(-121.9558,37.002)] +Erica Pl [(-122.0299,37.165),(-122.0293,37.169)] +Erie St [(-122.2419,37.122),(-122.2408,37.134)] +Escher Dr [(-122.1962,37.258),(-122.1988,37.302)] +Essex St [(-122.2677,37.537),(-122.2657,37.539)] +Essex Way [(-121.9735,37.257),(-121.9749,37.249)] +Estabrook St [(-122.1527,37.164),(-122.1535,37.161)] +Estabrook St [(-122.1539,37.16),(-122.1547,37.156)] +Estates Dr [(-122.2136,37.158),(-122.2126,37.169)] +Estates Dr [(-122.2139,37.272),(-122.2135,37.26)] +Estates Dr [(-122.2178,37.33),(-122.2183,37.325)] +Estates Dr [(-122.2225,37.37),(-122.218617,37.34167)] +Estudillo Ave [(-122.1446,37.274),(-122.1425,37.28)] +Estudillo Ave [(-122.1509,37.256),(-122.1498,37.26)] +Estudillo Ave [(-122.1547,37.245),(-122.1551,37.244)] +Estudillo Ave [(-122.1584,37.229),(-122.1595,37.225)] +Estudillo Ave [(-122.1608,37.22),(-122.1621,37.214)] +Estudillo Canal [(-122.1282,37.969),(-122.1288,37.964)] +Estudillo Canal [(-122.1323,37.929),(-122.1363,37.924),(-122.1369,37.924)] +Estudillo Canal [(-122.1397,37.923),(-122.14066,37.92204)] +Estudillo Canal [(-122.1569,37.861),(-122.1587,37.858)] +Eucalyptus Ct [(-122.064324,37.37425),(-122.064548,37.37733)] +Euclid Ave [(-122.2618,37.893),(-122.2612,37.887)] +Euclid Ave [(-122.2627,37.907),(-122.2621,37.902)] +Euclid Ave [(-122.2632,37.942),(-122.2644,37.93)] +Euclid Ave [(-122.2671,37.009),(-122.2666,37.987)] +Eugene St [(-121.963937,37.38628),(-121.9642,37.383)] +Eugene St [(-121.9659,37.364),(-121.9664,37.358)] +Evans St [(-121.7778,37.607),(-121.7777,37.602)] +Evelyn Ave [(-122.2906,37.814),(-122.2903,37.807)] +Evelyn Ave [(-122.2919,37.843),(-122.2909,37.83)] +Everett Ave [(-122.2182,37.02),(-122.2172,37.05)] +Everett Ave [(-122.219,37.094),(-122.218,37.087)] +Everett St [(-122.236,37.678),(-122.2353,37.687)] +Everett St [(-122.2385,37.647),(-122.238,37.653)] +Everglade St [(-122.0822,37.275),(-122.083,37.272)] +Everglades Lane [(-121.8005,37.87),(-121.800259,37.87469)] +Everglades Park Dr [(-121.9703,37.175),(-121.9718,37.164)] +Evergreen Ave [(-122.1367,37.234),(-122.1361,37.224)] +Evergreen St [(-122.0877,37.458),(-122.087,37.455)] +Excelsior Ave [(-122.2224,37.019),(-122.2215,37.016)] +Excelsior Ave [(-122.2338,37.059),(-122.2312,37.051)] +F St [(-122.0191,37.017),(-122.0198,37.013)] +F St [(-122.0223,37.993),(-122.0225,37.993)] +F St [(-122.0246,37.976),(-122.0247,37.974)] +F Bay [(-122.152,37.358),(-122.150473,37.24998)] +F Bay [(-122.2842,37.681),(-122.2841,37.68)] +F Bay [(-122.3138,37.645),(-122.3154,37.643)] +Faber St [(-122.0694,37.105),(-122.075,37.106)] +Fabian Way [(-122.0703,37.27),(-122.0684,37.269)] +Fabian Com [(-121.9951,37.537),(-121.9947,37.534)] +Fair Ave [(-122.0298,37.395),(-122.0304,37.386)] +Fairbrook Ct [(-121.9207,37.829),(-121.9218,37.826)] +Fairfax Ave [(-122.1997,37.733),(-122.1997,37.724)] +Fairfax Ave [(-122.2022,37.784),(-122.2015,37.778)] +Fairlands Dr [(-121.871,37.976),(-121.8719,37.961)] +Fairlands Dr [(-121.8731,37.956),(-121.8738,37.952)] +Fairlands Road [(-122.0583,37.784),(-122.059,37.781)] +Fairmont Dr [(-122.1135,37.144),(-122.1109,37.143)] +Fairmount Ave [(-122.2525,37.23),(-122.2511,37.234)] +Fairmount Ave [(-122.2561,37.194),(-122.2553,37.202)] +Fairview Ave [(-121.999,37.428),(-121.9863,37.351)] +Fairview Ave [(-122.0165,37.549),(-122.016,37.525)] +Fairview Ave [(-122.02765,37.68521),(-122.0274,37.669),(-122.0267,37.646)] +Fairview Ave [(-122.038562,37.76258),(-122.0379,37.762)] +Fairview Ave [(-122.0418,37.748),(-122.0402,37.764)] +Fairview Ave [(-122.0432,37.752),(-122.0428,37.751)] +Fairview Ave [(-122.049,37.788),(-122.0482,37.775)] +Fairview Ave [(-122.2404,37.22),(-122.2401,37.227)] +Fairview St [(-122.2792,37.495),(-122.2776,37.498)] +Fairway Ct [(-122.0536,37.334),(-122.0539,37.33)] +Fairway Dr [(-122.1753,37.994),(-122.176433,37.98933)] +Fairway St [(-122.0353,37.237),(-122.0343,37.238)] +Fairway St [(-122.0375,37.221),(-122.0368,37.226)] +Fairwood St [(-121.9539,37.183),(-121.9573,37.178)] +Fall Creek Road [(-121.910898,37.2702),(-121.909729,37.25584)] +Fallbrook Way [(-122.1285,37.533),(-122.1278,37.522)] +Fallon St [(-122.2637,37.969),(-122.2633,37.977)] +Fallon St [(-122.2661,37.931),(-122.2658,37.935)] +Falls Ter [(-122.048735,37.61624),(-122.048402,37.60954)] +Falmouth Pl [(-122.0301,37.513),(-122.031,37.502)] +Farallon Dr [(-122.1681,37.938),(-122.1698,37.937)] +Fargo Ave [(-122.1468,37.881),(-122.1476,37.887)] +Farm Hill Dr [(-122.0328,37.523),(-122.0333,37.511)] +Farnsworth St [(-122.1507,37.952),(-122.1507,37.944)] +Farwell Dr [(-121.9867,37.255),(-121.9841,37.264)] +Farwell Dr [(-121.996,37.291),(-121.9952,37.287)] +Farwell Dr [(-121.9966,37.316),(-121.9962,37.314)] +Farwell Dr [(-122.0133,37.392),(-122.0125,37.389),(-122.01186,37.3858)] +Faulkner Dr [(-122.0034,37.53),(-122.0049,37.515)] +Feldspar Ct [(-122.0722,37.874),(-122.0734,37.87)] +Fellows St [(-122.0652,37.814),(-122.066,37.805)] +Fellows St [(-122.0682,37.78),(-122.0687,37.775)] +Fenico Ter [(-122.0166,37.562),(-122.0168,37.559)] +Fenwick Way [(-121.947144,37.20116),(-121.9451,37.202)] +Fenwick Way [(-121.9473,37.192),(-121.9472,37.199)] +Fernside Ave [(-122.2337,37.514),(-122.2343,37.509)] +Fernside Blvd [(-122.2256,37.575),(-122.2249,37.581)] +Fernside Blvd [(-122.2271,37.645),(-122.2265,37.64)] +Ferro St [(-122.2996,37.975),(-122.3025,37.968)] +Ferry St [(-122.3128,37.147),(-122.3113,37.159)] +Ferry St [(-122.3185,37.097),(-122.3155,37.122)] +Field St [(-122.1604,37.721),(-122.1596,37.728)] +Fielding Ct [(-122.0393,37.689),(-122.0384,37.688)] +Fiji Way [(-122.1747,37.968),(-122.1753,37.965)] +Filbert St [(-122.036,37.259),(-122.0356,37.252)] +Filbert St [(-122.2779,37.215),(-122.2772,37.233)] +Filbert St [(-122.2802,37.151),(-122.2796,37.168)] +Finback Way [(-122.1783,37.934),(-122.1776,37.936)] +Findlay Way [(-121.7463,37.753),(-121.7454,37.753)] +Fir Ave [(-122.2385,37.318),(-122.2379,37.314)] +Firestone Ct [(-122.1246,37.671),(-122.1246,37.666)] +First St [(-121.7572,37.875),(-121.7576,37.863)] +First St [(-121.7636,37.843),(-121.7644,37.84)] +Firth Ct [(-122.1359,37.93),(-122.1363,37.924)] +Fisk Ct [(-122.155,37.972),(-122.1545,37.968)] +Fitzerald St [(-122.28185,37.26208),(-122.282237,37.26273)] +Flagg St [(-122.0921,37.71),(-122.0914,37.7)] +Fleet Road [(-122.2235,37.085),(-122.2229,37.078)] +Fleming Ave [(-122.1949,37.791),(-122.1948,37.783)] +Fletcher Lane [(-122.0779,37.668),(-122.0762,37.683)] +Flint Ct [(-122.1074,37.711),(-122.1085,37.704)] +Flint River Ter [(-122.054,37.78),(-122.0536,37.778)] +Flora St [(-122.1882,37.625),(-122.1879,37.622)] +Florence Ave [(-122.2253,37.376),(-122.225,37.373)] +Florence Road [(-121.7743,37.711),(-121.7743,37.687)] +Floresta Blvd [(-122.146,37.994),(-122.1478,37.98)] +Florio St [(-122.2504,37.502),(-122.2494,37.504)] +Flynn Road [(-121.657764,37.18891),(-121.657276,37.18952)] +Folsom Ave [(-122.0587,37.271),(-122.0596,37.269)] +Folsom Ave [(-122.0628,37.259),(-122.062855,37.25882)] +Fontaine Ct [(-122.1525,37.685),(-122.1517,37.688)] +Fontana Dr [(-122.2458,37.36),(-122.2463,37.354)] +Fontes Dr [(-121.933352,37.40768),(-121.93251,37.40887)] +Fontonett Ave [(-121.795158,37.619),(-121.7947,37.619)] +Foothill Blvd [(-122.0798,37.709),(-122.0798,37.688)] +Foothill Blvd [(-122.0882,37.829),(-122.0869,37.822)] +Foothill Blvd [(-122.0926,37.862),(-122.0918,37.857)] +Foothill Blvd [(-122.0983,37.907),(-122.0981,37.905)] +Foothill Blvd [(-122.1455,37.421),(-122.145202,37.41752)] +Foothill Blvd [(-122.1775,37.697),(-122.1764,37.696)] +Foothill Blvd [(-122.1948,37.725),(-122.1928,37.721)] +Foothill Blvd [(-122.2018,37.724),(-122.2008,37.724)] +Foothill Blvd [(-122.2136,37.77),(-122.2129,37.763)] +Foothill Blvd [(-122.2216,37.837),(-122.2206,37.833)] +Foothill Blvd [(-122.2289,37.846),(-122.2278,37.845)] +Foothill Blvd [(-122.2414,37.9),(-122.2403,37.893)] +Foothill Blvd [(-122.2454,37.921),(-122.2442,37.91)] +Foothill Lane [(-121.905417,37.52303),(-121.905087,37.51659)] +Foothill Road [(-121.8956,37.413),(-121.8967,37.419)] +Foothill Road [(-121.9075,37.547),(-121.907696,37.55141)] +Foothill Road [(-121.923245,37.81689),(-121.9236,37.82)] +Foothill Road [(-121.932,37.93),(-121.9335,37.958)] +Foothill Knolls Dr [(-121.909407,37.65999),(-121.9094,37.657)] +Fordham Way [(-121.7488,37.869),(-121.7481,37.869),(-121.7472,37.868)] +Forest Pl [(-122.0672,37.051),(-122.0673,37.044)] +Forest St [(-122.2541,37.443),(-122.2547,37.445)] +Forest Glen Pl [(-122.067707,37.01875),(-122.068338,37.01945),(-122.068308,37.0263)] +Forest Hill Ave [(-122.2118,37.034),(-122.2086,37.069)] +Forestland Way [(-122.1886,37.334),(-122.1901,37.329)] +Fortune Way [(-122.1877,37.693),(-122.187,37.688)] +Foster Ct [(-122.0745,37.396),(-122.074447,37.39388)] +Foster St [(-121.9683,37.367),(-121.9664,37.358)] +Fountain St [(-122.2306,37.593),(-122.2293,37.605)] +Foxfire Pl [(-122.063987,37.27349),(-122.064027,37.27459)] +Foxswallow Road [(-121.8776,37.793),(-121.8796,37.794)] +Fraga Road [(-122.0397,37.975),(-122.0393,37.987)] +France Road [(-122.045563,37.6829),(-122.045452,37.68292)] +Francisco St [(-121.8687,37.749),(-121.8696,37.75)] +Francisco St [(-122.286,37.733),(-122.285,37.735),(-122.2839,37.737)] +Franklin Ave [(-122.0605,37.028),(-122.0614,37.039)] +Franklin Dr [(-121.9049,37.954),(-121.9084,37.934)] +Franklin St [(-122.2687,37.055),(-122.2679,37.068)] +Franklin St [(-122.2702,37.03),(-122.2698,37.037)] +Franklin St [(-122.2719,37.003),(-122.2715,37.009)] +Franklin St [(-122.2744,37.961),(-122.2741,37.968)] +Frederick Road [(-122.174,37.244),(-122.1735,37.225)] +Frederiksen Lane [(-121.9251,37.162),(-121.9256,37.162)] +Fredi St [(-122.0764,37.934),(-122.0767,37.93)] +Freedom Ave [(-122.1219,37.081),(-122.1215,37.075)] +Freeman Pl [(-122.0375,37.866),(-122.037548,37.86536)] +Fremont Ave [(-122.1429,37.008),(-122.145652,37.04405)] +Fremont Blvd [(-121.9347,37.663),(-121.9324,37.65)] +Fremont Blvd [(-121.955914,37.22071),(-121.9556,37.213)] +Fremont Blvd [(-121.960056,37.3392),(-121.9584,37.33)] +Fremont Blvd [(-121.964,37.362),(-121.9632,37.357)] +Fremont Blvd [(-122.0043,37.573),(-122.0038,37.57)] +Fremont Blvd [(-122.006647,37.58506),(-122.0071,37.587)] +Fremont Blvd [(-122.02826,37.6908),(-122.02694,37.6842)] +Fremont Blvd [(-122.0348,37.724),(-122.0315,37.707)] +Fremont Blvd [(-122.0373,37.736),(-122.0361,37.73)] +Fremont Blvd [(-122.0392,37.746),(-122.039154,37.74569)] +Fremont St [(-122.284,37.403),(-122.2841,37.407)] +Frontage Road [(-122.3051,37.664),(-122.2994,37.5)] +Frontage Road [(-122.3074,37.781),(-122.3048,37.71)] +Fruitvale Ave [(-122.2158,37.985),(-122.2157,37.987)] +Fruitvale Ave [(-122.2166,37.966),(-122.2163,37.97)] +Fruitvale Ave [(-122.2182,37.923),(-122.218,37.929)] +Fruitvale Ave [(-122.2257,37.754),(-122.2256,37.756)] +Fruitvale Ave [(-122.2272,37.719),(-122.2269,37.725)] +Fruitvale Ave [(-122.2285,37.693),(-122.227522,37.71256)] +Fulmar Ter [(-122.045623,37.80299),(-122.045824,37.80101)] +Funston Gate Ct [(-121.8824,37.847),(-121.883,37.842)] +Fuschia Ct [(-122.0204,37.325),(-122.0199,37.323)] +G St [(-122.0167,37.018),(-122.0174,37.013)] +Gable Dr [(-121.9178,37.798),(-121.9175,37.799)] +Gading Road [(-122.0801,37.343),(-122.08,37.336)] +Gading Road [(-122.0802,37.388),(-122.0802,37.38)] +Gail Dr [(-122.0853,37.858),(-122.0854,37.853)] +Gainsborough Ct [(-122.2448,37.473),(-122.2447,37.461)] +Gainsborough Ter [(-122.0369,37.764),(-122.0369,37.756)] +Galaxy Dr [(-122.0675,37.866),(-122.068,37.86)] +Galindo Dr [(-121.9071,37.895),(-121.9041,37.891)] +Galindo St [(-122.2158,37.84),(-122.2149,37.837)] +Gallegos Ave [(-121.9286,37.324),(-121.9285,37.318)] +Galleon Pl [(-122.178053,37.9223),(-122.177578,37.92252)] +Galloway St [(-121.7473,37.177),(-121.7459,37.18)] +Galloway Common [(-121.7459,37.18),(-121.745647,37.17049)] +Galsworthy Ct [(-121.995,37.586),(-121.9955,37.585)] +Galt St [(-122.1507,37.886),(-122.1507,37.88)] +Galway Bay [(-122.2473,37.389),(-122.2475,37.384)] +Gamay Dr [(-121.9093,37.676),(-121.909,37.67)] +Ganet Ter [(-122.045424,37.79478),(-122.04533,37.79418)] +Ganton Ct [(-122.0379,37.146),(-122.038,37.152)] +Garden Ave [(-122.1077,37.626),(-122.1075,37.61)] +Garfield Ave [(-122.1718,37.638),(-122.1713,37.632)] +Garfield Ave [(-122.1746,37.664),(-122.174,37.66)] +Garin Ave [(-122.033003,37.2842),(-122.032,37.282)] +Garland Ct [(-122.0924,37.192),(-122.0926,37.177)] +Garrison Ave [(-122.0785,37.075),(-122.0785,37.051)] +Garrone Ave [(-122.0498,37.437),(-122.0513,37.434)] +Garwood Glenn Dr [(-122.06406,37.68946),(-122.064269,37.68336)] +Gateview Ave [(-122.3047,37.921),(-122.3033,37.9)] +Gatewood St [(-121.9574,37.185),(-121.9573,37.178)] +Gawain Ct [(-122.0251,37.745),(-122.02374,37.7382)] +Geary Road [(-121.770923,37.99805),(-121.770222,37.9976)] +Geary Road [(-121.7784,37.014),(-121.7986,37.06)] +Geary Road [(-121.8277,37.073),(-121.8279,37.082)] +Gem Ave [(-122.0167,37.823),(-122.0171,37.809)] +Genoa St [(-122.2725,37.46),(-122.2727,37.467)] +Georgean St [(-122.1024,37.877),(-122.1006,37.892)] +Gertrude Dr [(-121.996,37.398),(-121.9966,37.39)] +Gettysburg Ave [(-122.1089,37.366),(-122.1089,37.357)] +Giannini Ct [(-122.0254,37.16),(-122.0256,37.157)] +Gibbons Dr [(-122.2289,37.633),(-122.2283,37.633)] +Gibbons Dr [(-122.2325,37.625),(-122.2317,37.629)] +Gibraltar Dr [(-121.9025,37.96),(-121.9008,37.96)] +Gibraltar Dr [(-122.0202,37.624),(-122.0207,37.619)] +Gibraltar Dr [(-122.0242,37.603),(-122.0252,37.608)] +Gibraltar Dr [(-122.026,37.613),(-122.026476,37.61522)] +Gilbert Pl [(-121.9823,37.655),(-121.9836,37.653)] +Gilman St [(-122.2883,37.813),(-122.2877,37.812)] +Gilman St [(-122.2942,37.808),(-122.2933,37.81)] +Gilman St [(-122.2962,37.803),(-122.2951,37.806)] +Girvin Dr [(-122.1957,37.291),(-122.1904,37.299)] +Gisler Way [(-122.042,37.285),(-122.0392,37.298)] +Glacier Dr [(-121.8016,37.804),(-121.8017,37.809)] +Glade St [(-122.0819,37.592),(-122.08171,37.5977)] +Glen Ave [(-122.2514,37.257),(-122.2505,37.258)] +Glen Dr [(-122.1459,37.316),(-122.1422,37.315)] +Glen Alpine Road [(-122.2198,37.223),(-122.2185,37.239),(-122.217349,37.236)] +Glen Ellen Dr [(-122.0479,37.85),(-122.0475,37.851)] +Glendale Dr [(-122.0074,37.46),(-122.0067,37.456)] +Glenmoor Dr [(-122.0046,37.466),(-122.0038,37.461)] +Glenora Way [(-121.9143,37.317),(-121.9146,37.316)] +Glenview Dr [(-122.001,37.413),(-122.0002,37.409)] +Glenwood St [(-121.7799,37.771),(-121.7794,37.771)] +Gliddon St [(-122.0575,37.066),(-122.058,37.045)] +Godwit Ct [(-122.0141,37.84),(-122.0141,37.845)] +Gold Creek [(-121.922096,37.88859),(-121.920744,37.88463)] +Goldcrest Cir [(-121.8909,37.725),(-121.8917,37.73)] +Golden Gate Way [(-122.2378,37.497),(-122.238055,37.49522)] +Goldengate Ave [(-122.2324,37.451),(-122.232584,37.45192)] +Golf Dr [(-121.7449,37.136),(-121.7443,37.142)] +Golf Links Road [(-122.1425,37.565),(-122.1415,37.569)] +Golf Links Road [(-122.1491,37.533),(-122.1482,37.536)] +Gomes Road [(-121.949156,37.42192),(-121.9493,37.42)] +Gordon St [(-122.0405,37.752),(-122.0408,37.748)] +Gordon St [(-122.2001,37.788),(-122.1998,37.785)] +Gotubin Common [(-122.053546,37.59037),(-122.054013,37.58887)] +Grace Ave [(-122.276,37.431),(-122.2764,37.43)] +Graffian St [(-122.16774,37.3758),(-122.1677,37.375)] +Graham Ave [(-122.0311,37.321),(-122.032,37.31)] +Graham Way [(-122.1328,37.128),(-122.1321,37.134)] +Granada Cir [(-122.0734,37.229),(-122.0736,37.228)] +Granada Cir [(-122.0741,37.234),(-122.0742,37.23)] +Granada Dr [(-122.0734,37.212),(-122.0734,37.207)] +Granada Dr [(-122.0738,37.22),(-122.0736,37.216)] +Grand Ave [(-122.2442,37.18),(-122.244,37.184)] +Grand Ave [(-122.2479,37.111),(-122.2478,37.115)] +Grand Ave [(-122.2684,37.123),(-122.269233,37.12388)] +Grand Ave [(-122.2722,37.128),(-122.2729,37.129)] +Grand Ave [(-122.2812,37.154),(-122.2823,37.156),(-122.2834,37.159)] +Grand St [(-122.2612,37.637),(-122.2609,37.643)] +Grand Lake Dr [(-122.0553,37.89),(-122.056,37.894)] +Grand Lake Dr [(-122.0591,37.864),(-122.0587,37.861)] +Grandbrook Park Ct [(-121.9661,37.136),(-121.9658,37.14)] +Grandview Dr [(-122.229712,37.58234),(-122.230071,37.57618)] +Grange Ter [(-122.04547,37.62805),(-122.045749,37.62695)] +Granger Ave [(-122.0778,37.984),(-122.0784,37.985)] +Grant Ave [(-122.1491,37.732),(-122.1512,37.722)] +Grant Ave [(-122.1523,37.717),(-122.1535,37.712)] +Grant Ave [(-122.1545,37.703),(-122.1567,37.683)] +Grant St [(-122.2725,37.579),(-122.2723,37.57)] +Grant St [(-122.2729,37.597),(-122.2727,37.588)] +Grant St [(-122.2738,37.632),(-122.2735,37.623)] +Grant Line Road [(-121.583469,37.45746),(-121.583118,37.4641)] +Granville Dr [(-122.0105,37.357),(-122.01,37.354)] +Grass Valley Ct [(-122.1194,37.518),(-122.1187,37.516)] +Grass Valley Road [(-122.1246,37.764),(-122.1176,37.634)] +Gray Fox Cir [(-121.84122,37.60072),(-121.841235,37.60161)] +Grayson St [(-122.2883,37.56),(-122.2871,37.563)] +Grayson St [(-122.2916,37.553),(-122.2906,37.556)] +Greenhills [(-122.082437,37.05551),(-122.08375,37.05557)] +Greenly Dr [(-122.1595,37.704),(-122.1578,37.696)] +Greenly Dr [(-122.1635,37.727),(-122.161,37.716)] +Greenridge Road [(-122.0454,37.151),(-122.043982,37.1588),(-122.0441,37.178)] +Greens Lane [(-121.8938,37.339),(-121.894,37.311)] +Greentree Ct [(-121.8851,37.696),(-121.8855,37.692)] +Greenview Dr [(-122.0652,37.907),(-122.064379,37.90817)] +Greenview Dr [(-122.0688,37.905),(-122.0683,37.905),(-122.0663,37.907)] +Greenville Road [(-121.6957,37.798),(-121.6956,37.778)] +Greenville Road [(-121.6959,37.044),(-121.6959,37.034)] +Greenville Road [(-121.6999,37.175),(-121.6993,37.169)] +Greenwood Road [(-121.8795,37.705),(-121.8795,37.721)] +Greenwood Road [(-121.8795,37.745),(-121.8796,37.766)] +Greenwood Road [(-121.8796,37.801),(-121.8796,37.802)] +Greer Ave [(-122.1393,37.889),(-122.1401,37.889)] +Gresel St [(-122.0345,37.178),(-122.0338,37.182)] +Gresham Ct [(-121.8752,37.943),(-121.8754,37.946)] +Grimmer Blvd [(-121.9555,37.054),(-121.9534,37.05)] +Grimmer Blvd [(-121.9625,37.394),(-121.9633,37.383)] +Grimmer Blvd [(-121.9636,37.133),(-121.962341,37.11577)] +Grimmer Blvd [(-121.966619,37.178),(-121.966,37.165)] +Grimmer Blvd [(-121.967,37.332),(-121.9682,37.315)] +Grizzly Peak Blvd [(-122.2112,37.568),(-122.2105,37.561)] +Grizzly Peak Blvd [(-122.2213,37.638),(-122.2127,37.581)] +Grizzly Peak Blvd [(-122.254,37.915),(-122.2536,37.912)] +Grizzly Peak Blvd [(-122.26,37.965),(-122.259,37.952)] +Grizzly Peak Blvd [(-122.2689,37.035),(-122.2667,37.02)] +Grouse Way [(-122.0136,37.821),(-122.013412,37.83099)] +Grove St [(-122.2364,37.582),(-122.2357,37.59)] +Grove Way [(-122.0643,37.884),(-122.062679,37.89162),(-122.061796,37.89578),(-122.0609,37.9)] +Grove Way [(-122.078,37.842),(-122.0759,37.843)] +Grove Way [(-122.1041,37.76),(-122.102947,37.76318)] +Grovenor Dr [(-122.0893,37.224),(-122.0887,37.209)] +Gulfstream St [(-121.8645,37.976),(-121.8645,37.993)] +Gull Ct [(-122.0594,37.775),(-122.0595,37.782)] +Gull Way [(-121.8004,37.846),(-121.7996,37.845)] +Gunn Dr [(-122.1902,37.347),(-122.190933,37.35637),(-122.192,37.357)] +Guthrie St [(-121.861539,37.97796),(-121.860503,37.97781)] +H St [(-121.7625,37.766),(-121.7621,37.756)] +H St [(-122.0204,37.974),(-122.0207,37.972)] +Hacienda Ave [(-122.1192,37.754),(-122.1214,37.746)] +Hacienda Ave [(-122.1225,37.742),(-122.1235,37.738)] +Hacienda Ave [(-122.125,37.729),(-122.1259,37.719)] +Hackamore Lane [(-121.922474,37.86233),(-121.9223,37.863)] +Hackamore Lane [(-121.924324,37.85594),(-121.9239,37.857)] +Hackamore Com [(-121.9233,37.864),(-121.922542,37.86411)] +Haddon Pl [(-122.2416,37.099),(-122.2411,37.103)] +Hagemann Dr [(-121.79953,37.88118),(-121.7995,37.883)] +Haight Ave [(-122.2881,37.767),(-122.2883,37.756)] +Haley St [(-122.0444,37.367),(-122.042309,37.35074)] +Haley St [(-122.0585,37.436),(-122.0579,37.432)] +Halkin Lane [(-122.2684,37.983),(-122.2677,37.985)] +Halliday Ave [(-122.175147,37.63369),(-122.1747,37.629)] +Hamilton Pl [(-122.2592,37.151),(-122.2604,37.16)] +Hamilton St [(-122.188,37.549),(-122.1875,37.544)] +Hamlin St [(-122.009871,37.36805),(-122.0092,37.365)] +Hampel St [(-122.2248,37.078),(-122.2244,37.073)] +Hampton Road [(-122.1086,37.838),(-122.1073,37.84)] +Hampton Road [(-122.2146,37.189),(-122.2139,37.183)] +Hampton Road [(-122.222,37.177),(-122.2209,37.179)] +Hamrick Lane [(-122.0831,37.344),(-122.0839,37.342)] +Hancock Dr [(-121.9569,37.419),(-121.957,37.413)] +Hanly Road [(-122.2137,37.067),(-122.2135,37.075)] +Hannah St [(-122.2854,37.216),(-122.2861,37.237)] +Hanover Ave [(-122.2488,37.034),(-122.2477,37.037)] +Hanover Ave [(-122.2536,37.031),(-122.253,37.031)] +Hanover St [(-121.789629,37.92481),(-121.7892,37.934)] +Hanover St [(-121.7911,37.942),(-121.7923,37.95)] +Hanover St [(-121.7939,37.918),(-121.7928,37.918)] +Hansen Ave [(-122.0121,37.523),(-122.0124,37.519)] +Hansen Dr [(-121.8984,37.7),(-121.898897,37.69774)] +Hansen Road [(-122.0551,37.706),(-122.055,37.712)] +Hansom Dr [(-122.1369,37.75),(-122.1354,37.726)] +Happy Valley Road [(-121.877541,37.35652),(-121.871788,37.33636)] +Happy Valley Road [(-121.879849,37.36461),(-121.877975,37.35804)] +Happyland Ave [(-122.1044,37.666),(-122.104441,37.66152)] +Harbor Bay Pkwy [(-122.233076,37.25225),(-122.236357,37.2515),(-122.2385,37.251)] +Harbor Light Road [(-122.2667,37.606),(-122.2651,37.631)] +Harbor View Ave [(-122.1872,37.927),(-122.1866,37.921)] +Harder Road [(-122.0693,37.506),(-122.0688,37.506)] +Harder Road [(-122.0793,37.489),(-122.0802,37.488)] +Harlan St [(-122.1477,37.195),(-122.151,37.182)] +Harlon Ct [(-122.0223,37.447),(-122.0229,37.445)] +Harmon Ave [(-122.194,37.68),(-122.1924,37.664),(-122.1911,37.652)] +Harpers Ferry Ct [(-121.9019,37.758),(-121.902271,37.7633)] +Harrington Ave [(-122.2115,37.847),(-122.2108,37.851)] +Harris Road [(-122.0659,37.372),(-122.0675,37.363)] +Harris Road [(-122.0681,37.36),(-122.0705,37.347)] +Harrisburg Ave [(-122.011,37.776),(-122.0113,37.773)] +Harrison St [(-122.1539,37.268),(-122.1535,37.259)] +Harrison St [(-122.2544,37.197),(-122.2542,37.199)] +Harrison St [(-122.2577,37.172),(-122.2569,37.176)] +Harrison St [(-122.2621,37.108),(-122.262,37.11)] +Harrison St [(-122.2722,37.952),(-122.2717,37.958)] +Harrison St Ramp [(-122.262,37.11),(-122.2613,37.114)] +Hartford Dr [(-122.0297,37.94),(-122.0295,37.944)] +Hartley Gate Ct [(-121.8803,37.863),(-121.8812,37.871)] +Hartman Road [(-121.7876,37.217),(-121.7953,37.211)] +Harvard Way [(-121.754,37.805),(-121.7508,37.806)] +Harvest Road [(-121.8797,37.687),(-121.8807,37.691)] +Harwood Ave [(-122.2471,37.497),(-122.2466,37.498)] +Harwood Ave [(-122.25,37.489),(-122.2475,37.495)] +Haskell St [(-122.2825,37.512),(-122.2805,37.516)] +Hathaway Ave [(-122.1109,37.742),(-122.1105,37.739)] +Havasu St [(-121.9209,37.887),(-121.9204,37.878)] +Havenscourt Blvd [(-122.1891,37.634),(-122.1888,37.638),(-122.1882,37.643)] +Haverhill Dr [(-122.1938,37.246),(-122.1915,37.242)] +Hawkins St [(-121.969533,37.36702),(-121.9703,37.358)] +Hawley St [(-122.1921,37.531),(-122.1915,37.526)] +Hawthorne Ter [(-122.261,37.825),(-122.262,37.823)] +Hayfield Road [(-121.8292,37.314),(-121.8281,37.295)] +Hays St [(-122.1538,37.203),(-122.1533,37.194)] +Hayward Blvd [(-122.0224,37.563),(-122.0179,37.544)] +Hayward Blvd [(-122.0335,37.552),(-122.032996,37.55094)] +Hayward Blvd [(-122.03757,37.5596),(-122.033997,37.55449)] +Hayward Blvd [(-122.0383,37.556),(-122.0381,37.557)] +Hayward Blvd [(-122.050043,37.58583),(-122.0484,37.574),(-122.047,37.556)] +Hearst Ave [(-122.2551,37.757),(-122.2545,37.758)] +Hearst Ave [(-122.2691,37.738),(-122.268,37.74)] +Hearst Ave [(-122.2726,37.734),(-122.2715,37.735)] +Hearst Ave [(-122.277,37.727),(-122.2748,37.731)] +Hearst Ave [(-122.2858,37.714),(-122.2847,37.715)] +Hearst Ave [(-122.2918,37.704),(-122.2887,37.709)] +Hearst Ave [(-122.3027,37.682),(-122.3019,37.685)] +Heartwood Dr [(-122.2006,37.341),(-122.1992,37.338)] +Heathrow Ter [(-122.057185,37.55699),(-122.056911,37.55223)] +Hebrides Ct [(-122.0343,37.529),(-122.034,37.531)] +Hegenberger Exwy [(-122.1874,37.572),(-122.1891,37.56)] +Hegenberger Exwy [(-122.1946,37.52),(-122.1947,37.497)] +Hegenberger Road [(-122.1953,37.401),(-122.1953,37.404)] +Hegenberger Road [(-122.1955,37.378),(-122.1954,37.385)] +Heidelberg Dr [(-121.7692,37.638),(-121.7714,37.645)] +Heidelberg Dr [(-121.7761,37.614),(-121.7751,37.614)] +Heinz Ave [(-122.2953,37.527),(-122.2912,37.536)] +Hellman St [(-122.1403,37.471),(-122.1406,37.464)] +Helsinki Way [(-121.7753,37.659),(-121.7744,37.658)] +Hemlock Ter [(-121.986875,37.25649),(-121.986744,37.25571)] +Henry St [(-122.2706,37.857),(-122.2704,37.843)] +Heritage Ter [(-121.997217,37.55076),(-121.997913,37.54319)] +Herman Ave [(-121.7163,37.123),(-121.7164,37.142)] +Hermes Ct [(-122.0786,37.516),(-122.0784,37.514)] +Hermitage Ave [(-122.0542,37.384),(-122.0566,37.368)] +Hermitage Ct [(-121.7295,37.263),(-121.729426,37.26819)] +Hermitage Lane [(-122.0362,37.137),(-122.0354,37.136)] +Hermosa Ave [(-122.2309,37.415),(-122.231,37.404),(-122.2301,37.404)] +Herrier St [(-122.1943,37.006),(-122.1936,37.998)] +Herrin Way [(-121.9098,37.888),(-121.91,37.893)] +Hesperian Blvd [(-122.0878,37.182),(-122.0873,37.174)] +Hesperian Blvd [(-122.088064,37.18684),(-122.087886,37.18358)] +Hesperian Blvd [(-122.0916,37.245),(-122.0896,37.214)] +Hesperian Blvd [(-122.097,37.333),(-122.0956,37.31),(-122.0946,37.293)] +Hesperian Blvd [(-122.1079,37.513),(-122.1076,37.507)] +Hesperian Blvd [(-122.1102,37.551),(-122.1091,37.534)] +Hesperian Blvd [(-122.1132,37.6),(-122.1123,37.586)] +Hesperian Blvd [(-122.1257,37.792),(-122.1251,37.781)] +Hesperian Blvd [(-122.1287,37.989),(-122.1287,37.984)] +Hesperian Blvd [(-122.1288,37.922),(-122.1288,37.913)] +Hesse Dr [(-122.0782,37.208),(-122.0782,37.204)] +Hetch Hetchy Aqueduct [(-121.635378,37.0634),(-121.630012,37.07482)] +Hetch Hetchy Aqueduct [(-121.687586,37.92102),(-121.686938,37.92241)] +Hetch Hetchy Aqueduct [(-121.74008,37.81072),(-121.739425,37.81211)] +Hetch Hetchy Aqueduct [(-121.9355,37.477),(-121.9169,37.53)] +Hetch Hetchy Aqueduct [(-121.9465,37.448),(-121.945888,37.4496)] +Hetch Hetchy Aqueduct [(-121.94968,37.4388),(-121.9488,37.441)] +Hetch Hetchy Aqueduct [(-121.9615,37.407),(-121.960853,37.40854)] +Hetch Hetchy Aqueduct [(-122.0007,37.313),(-122.0005,37.313)] +Hetch Hetchy Aqueduct [(-122.0233,37.291),(-122.020432,37.29388)] +Hetch Hetchy Aqueduct [(-122.0255,37.283),(-122.0245,37.286)] +Hetch Hetchy Aqueduct [(-122.039,37.25),(-122.0404,37.247)] +Heyer Ave [(-122.0673,37.044),(-122.0657,37.044)] +Hibiscus Ave [(-121.999801,37.80223),(-121.9993,37.8)] +Hickory Lane [(-121.9163,37.102),(-121.91604,37.1072)] +Hickory St [(-122.0524,37.214),(-122.0523,37.211)] +Hidalgo Ct [(-121.9505,37.614),(-121.9512,37.608)] +Hidden Lane [(-122.0553,37.757),(-122.05301,37.75242),(-122.0503,37.747)] +Higgins Way [(-121.9433,37.392),(-121.9424,37.392)] +High St [(-121.9601,37.381),(-121.95938,37.3774)] +High St [(-122.1901,37.889),(-122.1899,37.891)] +High St [(-122.199,37.845),(-122.1983,37.849)] +High St [(-122.2007,37.837),(-122.1997,37.842)] +High St [(-122.2151,37.712),(-122.2145,37.716)] +High St [(-122.2233,37.647),(-122.2226,37.652)] +High St [(-122.2281,37.605),(-122.2273,37.611),(-122.2267,37.618)] +High St [(-122.2295,37.592),(-122.2288,37.597)] +High St [(-122.2379,37.514),(-122.2367,37.526)] +Highland Ave [(-122.2286,37.21),(-122.2285,37.2)] +Hilgard Ave [(-122.2603,37.787),(-122.2585,37.789)] +Hilgard Ave [(-122.2638,37.782),(-122.2624,37.783)] +Hill Road [(-122.2498,37.881),(-122.2486,37.868)] +Hillcrest Ave [(-121.7472,37.839),(-121.7473,37.834)] +Hillcrest Ave [(-122.0492,37.591),(-122.0485,37.587)] +Hillcroft Cir [(-122.2304,37.089),(-122.2301,37.093)] +Hilldale Ave [(-122.2629,37.96),(-122.2624,37.956)] +Hillegass Ave [(-122.2541,37.503),(-122.2543,37.513)] +Hillegass Ave [(-122.2545,37.561),(-122.2541,37.539)] +Hillegass Ave [(-122.2557,37.619),(-122.2554,37.601)] +Hiller Dr [(-122.2275,37.551),(-122.2263,37.542)] +Hiller Dr [(-122.228415,37.50849),(-122.2284,37.508)] +Hillgirt Cir [(-122.2429,37.079),(-122.2424,37.076)] +Hillside Ave [(-121.997183,37.84571),(-121.998118,37.83759),(-121.9983,37.836)] +Hillside Ct [(-122.2345,37.231),(-122.2342,37.225)] +Hillside St [(-122.1628,37.561),(-122.1625,37.553)] +Hilltop Cres [(-122.2256,37.329),(-122.2246,37.319)] +Hillview Ct [(-121.9178,37.841),(-121.9191,37.838)] +Hillview Road [(-122.253,37.934),(-122.25,37.92)] +Hilsadne Ter [(-122.046919,37.64183),(-122.04699,37.6443)] +Hilton St [(-122.03,37.877),(-122.0305,37.864)] +Hobart Ct [(-121.9108,37.709),(-121.9102,37.711)] +Hochler Dr [(-121.9111,37.317),(-121.9099,37.305)] +Hogan Pl [(-121.7696,37.507),(-121.7689,37.502)] +Holiday St [(-122.0421,37.306),(-122.0418,37.304)] +Holladay Ct [(-121.7773,37.842),(-121.778,37.841)] +Holland Dr [(-121.9115,37.798),(-121.9118,37.801)] +Holland Dr [(-121.9124,37.814),(-121.9126,37.821)] +Holland St [(-122.2038,37.688),(-122.2016,37.677)] +Hollis St [(-122.2851,37.314),(-122.2857,37.332)] +Hollis St [(-122.2866,37.355),(-122.2869,37.362)] +Hollis St [(-122.2885,37.397),(-122.289,37.414)] +Hollis St [(-122.2894,37.428),(-122.2895,37.433)] +Hollis St [(-122.2901,37.45),(-122.2903,37.458)] +Hollis St [(-122.291,37.48),(-122.2913,37.49)] +Holly St [(-122.1715,37.488),(-122.1704,37.472)] +Holly St [(-122.1742,37.532),(-122.1737,37.526)] +Holly St [(-122.2393,37.3),(-122.2395,37.297)] +Hollyhock Dr [(-122.131813,37.99633),(-122.1306,37.997)] +Holmes St [(-121.7784,37.776),(-121.778512,37.7704)] +Holmes St [(-121.7789,37.751),(-121.7789,37.747)] +Holmes St [(-121.7794,37.697),(-121.7794,37.67)] +Holmes St [(-121.7816,37.566),(-121.7818,37.56)] +Holt St [(-122.063,37.813),(-122.063508,37.80257)] +Honeysuckle Road [(-121.7458,37.102),(-121.745,37.096)] +Hooper St [(-121.955964,37.28079),(-121.95582,37.27507)] +Hoover Ave [(-122.2088,37.116),(-122.2086,37.115)] +Hop Ranch Road [(-122.0461,37.942),(-122.045974,37.92945)] +Hopkins Ct [(-122.2829,37.819),(-122.2822,37.822)] +Hopkins St [(-122.0778,37.184),(-122.0775,37.159)] +Hopkins St [(-122.284,37.802),(-122.2834,37.805)] +Hopyard Road [(-121.8828,37.674),(-121.8833,37.678)] +Hopyard Road [(-121.9026,37.975),(-121.9033,37.985)] +Horatio Way [(-122.0499,37.781),(-122.0505,37.774)] +Hospital Dr [(-122.257,37.548),(-122.2559,37.549)] +Hotchkiss St [(-121.9283,37.947),(-121.9287,37.958)] +Howe Ct [(-121.9514,37.252),(-121.9544,37.25)] +Howe St [(-122.2541,37.265),(-122.2537,37.267)] +Hoyt St [(-121.9195,37.842),(-121.9184,37.824)] +Hubbard Ave [(-122.1585,37.914),(-122.1602,37.914)] +Huber Dr [(-122.0904,37.09),(-122.09042,37.0804),(-122.0901,37.074)] +Hudson Lane [(-122.1483,37.14),(-122.149,37.137)] +Hugh Way [(-122.0322,37.185),(-122.0317,37.18)] +Hula Cir [(-122.0465,37.869),(-122.0468,37.875)] +Humboldt Ave [(-122.2145,37.872),(-122.2133,37.879)] +Hummingbird Road [(-121.8824,37.777),(-121.8853,37.773)] +Hummingbird Road [(-121.8862,37.774),(-121.8871,37.774)] +Hunter Ave [(-122.1824,37.312),(-122.1816,37.339)] +Huntington St [(-122.1866,37.895),(-122.186,37.899)] +Huntwood Ave [(-122.0531,37.093),(-122.0531,37.078)] +Huntwood Ave [(-122.06,37.279),(-122.0598,37.273)] +Huntwood Ave [(-122.0641,37.336),(-122.063367,37.32585),(-122.0628,37.318)] +Huntwood Ave [(-122.0781,37.48),(-122.0774,37.473)] +Hutton Ct [(-121.9826,37.274),(-121.9822,37.272)] +Hyde St [(-122.2198,37.883),(-122.2171,37.872)] +I St [(-121.7655,37.798),(-121.7652,37.791)] +I St [(-121.7675,37.848),(-121.7682,37.857)] +I- 205 ((-121.573292,37.41726),(-121.571644,37.42),(-121.563557,37.42641)) +I- 205 [(-121.572819,37.42107),(-121.571705,37.42168),(-121.563557,37.42641),(-121.560856,37.42885),(-121.559467,37.42946),(-121.559055,37.42939),(-121.558781,37.42992),(-121.556644,37.43214),(-121.5559,37.434)] +I- 580 ((-121.628147,37.33089),(-121.605091,37.3605),(-121.589344,37.3946),(-121.58118,37.41062),(-121.573292,37.41726),(-121.571644,37.41779),(-121.55843,37.40406)) +I- 580 ((-121.628147,37.33089),(-121.629246,37.32464),(-121.644337,37.2411),(-121.654377,37.20798),(-121.654356,37.20723),(-121.654926,37.20531),(-121.658827,37.19552)) +I- 580 ((-121.727,37.074),(-121.7255,37.083),(-121.7234,37.092),(-121.723,37.095),(-121.721995,37.09859),(-121.7216,37.1),(-121.7211,37.102),(-121.7188,37.109)) +I- 580 ((-122.1752,37.826),(-122.177,37.833)) +I- 580 ((-122.2029,37.928),(-122.2036,37.933),(-122.2043,37.938)) +I- 580 ((-122.2535,37.196),(-122.2539,37.2)) +I- 580 ((-122.2744,37.262),(-122.2746,37.263),(-122.2774,37.27),(-122.278,37.271),(-122.2792,37.274),(-122.2806,37.275),(-122.2817,37.276),(-122.2828,37.276),(-122.2837,37.276)) +I- 580 ((-122.2837,37.276),(-122.2849,37.273),(-122.286,37.27),(-122.2868,37.269),(-122.2871,37.266),(-122.2882,37.265),(-122.2893,37.266)) +I- 580 [(-121.560856,37.42885),(-121.55843,37.40406),(-121.557655,37.39926),(-121.556,37.389)] +I- 580 [(-121.628757,37.34287),(-121.600742,37.38407),(-121.588856,37.40124),(-121.580494,37.41451),(-121.572819,37.42107)] +I- 580 [(-121.628757,37.34287),(-121.630009,37.33791),(-121.657688,37.20089),(-121.658827,37.19552),(-121.659626,37.19326),(-121.660816,37.18952)] +I- 580 [(-121.664341,37.1822),(-121.662081,37.18693),(-121.661812,37.18746),(-121.660816,37.18952)] +I- 580 [(-121.664341,37.1822),(-121.666965,37.18166),(-121.6697,37.185)] +I- 580 [(-121.727,37.074),(-121.7229,37.093),(-121.722301,37.09522),(-121.721001,37.10005),(-121.7194,37.106),(-121.7188,37.109),(-121.7168,37.12),(-121.7163,37.123),(-121.7145,37.127),(-121.7096,37.148),(-121.707731,37.1568),(-121.7058,37.166),(-121.7055,37.168),(-121.7044,37.174),(-121.7038,37.172),(-121.7037,37.172),(-121.7027,37.175),(-121.7001,37.181),(-121.6957,37.191),(-121.6948,37.192),(-121.6897,37.204),(-121.6697,37.185)] +I- 580 [(-121.727,37.074),(-121.7275,37.072),(-121.7331,37.046)] +I- 580 [(-121.7705,37.013),(-121.769039,37.01504),(-121.7583,37.03),(-121.7557,37.03),(-121.754805,37.02966),(-121.750803,37.02812),(-121.75,37.02738),(-121.7489,37.026),(-121.7453,37.024),(-121.7438,37.024),(-121.7411,37.024),(-121.740416,37.02505),(-121.739035,37.02719),(-121.7379,37.028),(-121.736275,37.03278),(-121.7362,37.033),(-121.7358,37.034),(-121.7331,37.046)] +I- 580 [(-121.8585,37.013),(-121.8521,37.011),(-121.8485,37.011),(-121.8463,37.011),(-121.8455,37.011),(-121.8416,37.011),(-121.8414,37.011),(-121.834001,37.0104),(-121.8292,37.01),(-121.8288,37.009),(-121.82332,37.00833),(-121.8206,37.008)] +I- 580 [(-121.8585,37.013),(-121.863393,37.01213),(-121.8641,37.012)] +I- 580 [(-121.9214,37.015),(-121.9189,37.02),(-121.918,37.02),(-121.9087,37.017),(-121.90609,37.01797),(-121.906,37.018)] +I- 580 [(-121.9214,37.015),(-121.9217,37.014)] +I- 580 [(-121.9322,37.989),(-121.9243,37.006),(-121.9217,37.014)] +I- 580 [(-122.018,37.019),(-122.0009,37.032),(-121.9787,37.983),(-121.958,37.984),(-121.9571,37.986)] +I- 580 [(-122.0911,37.906),(-122.09,37.908),(-122.0882,37.908),(-122.0856,37.909),(-122.078489,37.909),(-122.0726,37.909),(-122.0711,37.91),(-122.068287,37.91137),(-122.0649,37.914)] +I- 580 [(-122.098,37.908),(-122.0965,37.904),(-122.095586,37.903),(-122.0953,37.903),(-122.0943,37.902),(-122.0938,37.903),(-122.093241,37.90351)] +I- 580 [(-122.1108,37.023),(-122.1101,37.02),(-122.108103,37.00764),(-122.108,37.007),(-122.1069,37.998),(-122.1064,37.994),(-122.1053,37.982),(-122.1048,37.977),(-122.1032,37.958),(-122.1026,37.953),(-122.1013,37.938),(-122.0989,37.911),(-122.0984,37.91),(-122.098,37.908)] +I- 580 [(-122.1306,37.157),(-122.1298,37.147),(-122.1277,37.122),(-122.126709,37.11468),(-122.1254,37.105),(-122.125,37.103),(-122.1237,37.096),(-122.1231,37.093),(-122.1214,37.082),(-122.1183,37.066),(-122.116,37.052),(-122.1153,37.048),(-122.1108,37.023)] +I- 580 [(-122.1543,37.703),(-122.1535,37.694),(-122.1512,37.655),(-122.1475,37.603),(-122.1468,37.583),(-122.1472,37.569),(-122.149044,37.54874),(-122.1493,37.546),(-122.1501,37.532),(-122.1506,37.509),(-122.1495,37.482),(-122.1487,37.467),(-122.1477,37.447),(-122.1414,37.383),(-122.1404,37.376),(-122.1398,37.372),(-122.139,37.356),(-122.1388,37.353),(-122.1385,37.34),(-122.1382,37.33),(-122.1378,37.316)] +I- 580 [(-122.1716,37.805),(-122.1703,37.799),(-122.170042,37.79758),(-122.169413,37.79411),(-122.167295,37.78244),(-122.166339,37.77717),(-122.165224,37.77112),(-122.1648,37.769)] +I- 580 [(-122.1716,37.805),(-122.1728,37.811),(-122.1742,37.817)] +I- 580 [(-122.177,37.833),(-122.1789,37.838)] +I- 580 [(-122.2043,37.938),(-122.204734,37.94074),(-122.2062,37.95),(-122.207492,37.95608),(-122.2079,37.958),(-122.2085,37.962)] +I- 580 [(-122.2197,37.99),(-122.22,37.99),(-122.222092,37.99523),(-122.2232,37.998),(-122.224146,37.99963),(-122.2261,37.003),(-122.2278,37.007),(-122.2302,37.026),(-122.2323,37.043),(-122.2344,37.059),(-122.235405,37.06427),(-122.2365,37.07)] +I- 580 [(-122.2535,37.196),(-122.2533,37.196)] +I- 580 [(-122.2539,37.2),(-122.2541,37.201)] +I- 580 [(-122.2613,37.23),(-122.2601,37.22833),(-122.2611,37.231),(-122.2639,37.238),(-122.2646,37.241),(-122.2654,37.242)] +I- 580 [(-122.2613,37.23),(-122.263448,37.23307),(-122.2647,37.23486),(-122.2655,37.236),(-122.2664,37.238)] +I- 580 [(-122.2664,37.238),(-122.2675,37.243)] +I- 580 [(-122.2675,37.243),(-122.2677,37.243),(-122.2681,37.244)] +I- 580 [(-122.2679,37.248),(-122.2681,37.248)] +I- 580 [(-122.2744,37.262),(-122.2734,37.259),(-122.2695,37.247),(-122.268532,37.2449),(-122.268237,37.24426),(-122.2681,37.244)] +I- 580 [(-122.2893,37.266),(-122.2904,37.27),(-122.2909,37.273)] +I- 580 [(-122.2901,37.274),(-122.2905,37.278),(-122.2921,37.286),(-122.2927,37.299)] +I- 580 [(-122.2909,37.273),(-122.2918,37.279),(-122.2923,37.282)] +I- 580 [(-122.2928,37.293),(-122.2931,37.301)] +I- 580 Ramp ((-121.74,37.036),(-121.7393,37.033),(-121.7384,37.032)) +I- 580 Ramp ((-121.7843,37.996),(-121.784294,37.99539),(-121.7842,37.985)) +I- 580 Ramp ((-121.818,37.011),(-121.8187,37.014)) +I- 580 Ramp ((-121.8185,37.008),(-121.8187,37.001)) +I- 580 Ramp ((-121.9025,37.018),(-121.9037,37.022),(-121.9059,37.029)) +I- 580 Ramp ((-121.9335,37.987),(-121.9331,37.979)) +I- 580 Ramp ((-122.0206,37.007),(-122.0203,37.015)) +I- 580 Ramp ((-122.1202,37.085),(-122.1203,37.083)) +I- 580 Ramp ((-122.1522,37.526),(-122.1514,37.524)) +I- 580 Ramp ((-122.2541,37.201),(-122.254,37.205)) +I- 580 Ramp ((-122.2646,37.241),(-122.2653,37.244),(-122.266,37.245)) +I- 580 Ramp ((-122.2654,37.242),(-122.266,37.245),(-122.2671,37.245)) +I- 580 Ramp ((-122.2786,37.288),(-122.2798,37.286),(-122.2804,37.285),(-122.2814,37.282),(-122.2818,37.28)) +I- 580 Ramp ((-122.2796,37.289),(-122.2818,37.283),(-122.2822,37.281)) +I- 580 Ramp [(-121.657688,37.20089),(-121.658176,37.20089),(-121.659977,37.19715),(-121.660232,37.1965),(-121.661524,37.18996),(-121.662081,37.18693)] +I- 580 Ramp [(-121.660816,37.18952),(-121.659428,37.19105),(-121.658115,37.19272),(-121.657078,37.19639),(-121.654926,37.20531)] +I- 580 Ramp [(-121.7218,37.088),(-121.722301,37.09522)] +I- 580 Ramp [(-121.7231,37.108),(-121.7211,37.102)] +I- 580 Ramp [(-121.7232,37.103),(-121.7222,37.103),(-121.721995,37.09859)] +I- 580 Ramp [(-121.7232,37.103),(-121.7234,37.092)] +I- 580 Ramp [(-121.7255,37.083),(-121.7232,37.114)] +I- 580 Ramp [(-121.727,37.074),(-121.7237,37.084),(-121.723311,37.0823),(-121.7221,37.077),(-121.7219,37.081),(-121.720744,37.09257),(-121.7194,37.106)] +I- 580 Ramp [(-121.739,37.02),(-121.738298,37.02506),(-121.737988,37.02686),(-121.7379,37.028)] +I- 580 Ramp [(-121.739,37.02),(-121.7402,37.015)] +I- 580 Ramp [(-121.74,37.034),(-121.7409,37.034),(-121.7401,37.029),(-121.7384,37.032),(-121.7358,37.034)] +I- 580 Ramp [(-121.7411,37.024),(-121.7401,37.018),(-121.7401,37.024)] +I- 580 Ramp [(-121.7438,37.024),(-121.742961,37.02896),(-121.7416,37.037),(-121.74,37.039)] +I- 580 Ramp [(-121.7743,37.006),(-121.7729,37.006),(-121.7705,37.013)] +I- 580 Ramp [(-121.7743,37.006),(-121.7729,37.013),(-121.7705,37.013)] +I- 580 Ramp [(-121.7865,37.995),(-121.7852,37.992),(-121.7842,37.985),(-121.7838,37.966),(-121.7834,37.957)] +I- 580 Ramp [(-121.7891,37.998),(-121.7854,37.999),(-121.78441,37.9963),(-121.7843,37.996)] +I- 580 Ramp [(-121.8195,37.007),(-121.8187,37.014),(-121.8179,37.015)] +I- 580 Ramp [(-121.8206,37.008),(-121.8187,37.001),(-121.8179,37.005)] +I- 580 Ramp [(-121.8454,37.01),(-121.8455,37.011)] +I- 580 Ramp [(-121.8463,37.011),(-121.8496,37.025)] +I- 580 Ramp [(-121.8521,37.011),(-121.8479,37.999),(-121.8476,37.999),(-121.8456,37.01),(-121.8455,37.011)] +I- 580 Ramp [(-121.8521,37.011),(-121.8496,37.025)] +I- 580 Ramp [(-121.866951,37.01385),(-121.871381,37.02608)] +I- 580 Ramp [(-121.8695,37.013),(-121.8712,37.011),(-121.8717,37.001),(-121.8714,37.001)] +I- 580 Ramp [(-121.8713,37.014),(-121.871352,37.02321)] +I- 580 Ramp [(-121.8743,37.014),(-121.8722,37.999),(-121.8714,37.999)] +I- 580 Ramp [(-121.9043,37.998),(-121.9036,37.013),(-121.902632,37.0174),(-121.9025,37.018)] +I- 580 Ramp [(-121.906,37.018),(-121.9056,37.011)] +I- 580 Ramp [(-121.906,37.018),(-121.905635,37.0239),(-121.9065,37.023)] +I- 580 Ramp [(-121.906,37.018),(-121.906044,37.02416),(-121.906177,37.02331),(-121.906315,37.02115)] +I- 580 Ramp [(-121.9068,37.027),(-121.9059,37.029),(-121.9078,37.04)] +I- 580 Ramp [(-121.9087,37.017),(-121.9056,37.003),(-121.905,37.004)] +I- 580 Ramp [(-121.9087,37.017),(-121.907194,37.02619),(-121.9071,37.029),(-121.9072,37.033)] +I- 580 Ramp [(-121.9335,37.987),(-121.9341,37.991),(-121.9345,37.985)] +I- 580 Ramp [(-121.9345,37.985),(-121.9341,37.978)] +I- 580 Ramp [(-121.9364,37.986),(-121.9338,37.971),(-121.9331,37.979),(-121.9322,37.989)] +I- 580 Ramp [(-121.9368,37.986),(-121.936483,37.98832),(-121.9353,37.997),(-121.93504,37.00035),(-121.9346,37.006),(-121.933764,37.00031),(-121.9333,37.997),(-121.9322,37.989)] +I- 580 Ramp [(-121.9562,37.984),(-121.9565,37.98)] +I- 580 Ramp [(-121.9571,37.986),(-121.9565,37.98)] +I- 580 Ramp [(-121.958,37.984),(-121.9565,37.98)] +I- 580 Ramp [(-122.0195,37.012),(-122.0184,37.009),(-122.018,37.019)] +I- 580 Ramp [(-122.0195,37.012),(-122.0203,37.015),(-122.0212,37.02)] +I- 580 Ramp [(-122.0531,37.932),(-122.0544,37.941)] +I- 580 Ramp [(-122.0649,37.914),(-122.0618,37.916),(-122.0604,37.92)] +I- 580 Ramp [(-122.0649,37.914),(-122.0639,37.92),(-122.063,37.923)] +I- 580 Ramp [(-122.0884,37.911),(-122.0856,37.909)] +I- 580 Ramp [(-122.093241,37.90351),(-122.09364,37.89634),(-122.093788,37.89212)] +I- 580 Ramp [(-122.0934,37.896),(-122.09257,37.89961),(-122.0911,37.906)] +I- 580 Ramp [(-122.0941,37.897),(-122.0943,37.902)] +I- 580 Ramp [(-122.0953,37.903),(-122.0971,37.911),(-122.0943,37.902)] +I- 580 Ramp [(-122.096,37.888),(-122.0962,37.891),(-122.0964,37.9)] +I- 580 Ramp [(-122.101,37.898),(-122.1005,37.902),(-122.0989,37.911)] +I- 580 Ramp [(-122.108,37.007),(-122.1093,37.02)] +I- 580 Ramp [(-122.1086,37.003),(-122.1068,37.993),(-122.1066,37.992),(-122.1053,37.982)] +I- 580 Ramp [(-122.1086,37.003),(-122.1103,37.018),(-122.1108,37.023),(-122.1093,37.02)] +I- 580 Ramp [(-122.1206,37.088),(-122.1203,37.083),(-122.1183,37.066)] +I- 580 Ramp [(-122.1215,37.075),(-122.1183,37.066)] +I- 580 Ramp [(-122.1226,37.099),(-122.1238,37.102),(-122.1254,37.105)] +I- 580 Ramp [(-122.1237,37.096),(-122.1234,37.09)] +I- 580 Ramp [(-122.1311,37.177),(-122.1306,37.157)] +I- 580 Ramp [(-122.1338,37.222),(-122.135,37.227)] +I- 580 Ramp [(-122.1362,37.248),(-122.1374,37.249)] +I- 580 Ramp [(-122.1371,37.279),(-122.1367,37.264)] +I- 580 Ramp [(-122.1371,37.279),(-122.1381,37.262)] +I- 580 Ramp [(-122.1378,37.316),(-122.1374,37.311),(-122.1373,37.307),(-122.1367,37.296)] +I- 580 Ramp [(-122.1379,37.282),(-122.1371,37.279)] +I- 580 Ramp [(-122.1391,37.367),(-122.1388,37.353)] +I- 580 Ramp [(-122.1414,37.383),(-122.1407,37.376),(-122.1403,37.372),(-122.139,37.356)] +I- 580 Ramp [(-122.1487,37.467),(-122.1476,37.454)] +I- 580 Ramp [(-122.1493,37.546),(-122.1508,37.535)] +I- 580 Ramp [(-122.1495,37.482),(-122.1489,37.452)] +I- 580 Ramp [(-122.1521,37.529),(-122.1514,37.524),(-122.1506,37.509)] +I- 580 Ramp [(-122.1521,37.682),(-122.151,37.659),(-122.1512,37.655)] +I- 580 Ramp [(-122.1539,37.707),(-122.1535,37.694)] +I- 580 Ramp [(-122.1553,37.706),(-122.1543,37.703)] +I- 580 Ramp [(-122.1567,37.727),(-122.156,37.71)] +I- 580 Ramp [(-122.1648,37.769),(-122.16472,37.7682),(-122.1638,37.759)] +I- 580 Ramp [(-122.1716,37.805),(-122.1725,37.816)] +I- 580 Ramp [(-122.1729,37.803),(-122.1716,37.801),(-122.1703,37.799)] +I- 580 Ramp [(-122.1742,37.817),(-122.1752,37.822),(-122.177,37.833)] +I- 580 Ramp [(-122.1764,37.839),(-122.1756,37.838),(-122.1743,37.833)] +I- 580 Ramp [(-122.1773,37.839),(-122.1764,37.839)] +I- 580 Ramp [(-122.1789,37.838),(-122.1773,37.839)] +I- 580 Ramp [(-122.1823,37.838),(-122.182011,37.83754),(-122.180678,37.83541),(-122.1798,37.834),(-122.1798,37.838)] +I- 580 Ramp [(-122.1873,37.838),(-122.1868,37.841),(-122.1866,37.844),(-122.1854,37.841),(-122.1847,37.84)] +I- 580 Ramp [(-122.1895,37.844),(-122.1886,37.845)] +I- 580 Ramp [(-122.1909,37.85),(-122.1892,37.848),(-122.1879,37.844)] +I- 580 Ramp [(-122.1917,37.853),(-122.1927,37.863)] +I- 580 Ramp [(-122.1924,37.854),(-122.189775,37.84425),(-122.1889,37.841)] +I- 580 Ramp [(-122.1975,37.878),(-122.196458,37.87516),(-122.1964,37.875),(-122.1951,37.871),(-122.1942,37.869)] +I- 580 Ramp [(-122.2017,37.923),(-122.2029,37.928)] +I- 580 Ramp [(-122.2027,37.918),(-122.2037,37.93),(-122.2043,37.938)] +I- 580 Ramp [(-122.2079,37.958),(-122.2099,37.962)] +I- 580 Ramp [(-122.2085,37.962),(-122.209,37.966)] +I- 580 Ramp [(-122.2158,37.985),(-122.2173,37.989),(-122.2178,37.991),(-122.218357,37.99071),(-122.219392,37.99016),(-122.2197,37.99)] +I- 580 Ramp [(-122.2161,37.976),(-122.218,37.982),(-122.218481,37.98426),(-122.2197,37.99)] +I- 580 Ramp [(-122.2271,37.001),(-122.2261,37.003)] +I- 580 Ramp [(-122.2278,37.013),(-122.2261,37.003)] +I- 580 Ramp [(-122.2365,37.07),(-122.2346,37.052),(-122.2338,37.044)] +I- 580 Ramp [(-122.2428,37.096),(-122.2414,37.091),(-122.241182,37.09018),(-122.2406,37.088)] +I- 580 Ramp [(-122.2453,37.095),(-122.2414,37.089)] +I- 580 Ramp [(-122.249,37.121),(-122.2476,37.12)] +I- 580 Ramp [(-122.2491,37.115),(-122.2489,37.113)] +I- 580 Ramp [(-122.2494,37.125),(-122.2489,37.113)] +I- 580 Ramp [(-122.2501,37.148),(-122.249485,37.14041),(-122.2484,37.127)] +I- 580 Ramp [(-122.2529,37.197),(-122.2525,37.192),(-122.2517,37.174)] +I- 580 Ramp [(-122.2535,37.192),(-122.253,37.182)] +I- 580 Ramp [(-122.2535,37.192),(-122.2539,37.2)] +I- 580 Ramp [(-122.2547,37.205),(-122.254,37.205),(-122.2538,37.202),(-122.2535,37.196)] +I- 580 Ramp [(-122.2564,37.213),(-122.2542,37.199),(-122.2538,37.19)] +I- 580 Ramp [(-122.2564,37.213),(-122.2544,37.197),(-122.2538,37.19)] +I- 580 Ramp [(-122.2604,37.222),(-122.2613,37.23)] +I- 580 Ramp [(-122.2639,37.238),(-122.2659,37.239),(-122.2664,37.238),(-122.2676,37.231),(-122.268,37.227)] +I- 580 Ramp [(-122.267,37.261),(-122.2671,37.263)] +I- 580 Ramp [(-122.2671,37.245),(-122.2673,37.248)] +I- 580 Ramp [(-122.2671,37.245),(-122.2675,37.243)] +I- 580 Ramp [(-122.2673,37.248),(-122.2676,37.25),(-122.2677,37.252)] +I- 580 Ramp [(-122.2676,37.273),(-122.267231,37.28349),(-122.266927,37.29214)] +I- 580 Ramp [(-122.2676,37.273),(-122.2679,37.264),(-122.2677,37.252)] +I- 580 Ramp [(-122.2677,37.242),(-122.2675,37.243)] +I- 580 Ramp [(-122.2677,37.242),(-122.2681,37.238),(-122.2678,37.233)] +I- 580 Ramp [(-122.2677,37.242),(-122.2681,37.244)] +I- 580 Ramp [(-122.2677,37.242),(-122.2683,37.243)] +I- 580 Ramp [(-122.2677,37.252),(-122.267508,37.25368),(-122.267,37.261)] +I- 580 Ramp [(-122.2683,37.243),(-122.2685,37.243)] +I- 580 Ramp [(-122.268532,37.2449),(-122.2685,37.243)] +I- 580 Ramp [(-122.2686,37.249),(-122.2682,37.245),(-122.2681,37.244)] +I- 580 Ramp [(-122.2686,37.249),(-122.268532,37.2449)] +I- 580 Ramp [(-122.2686,37.249),(-122.2701,37.255)] +I- 580 Ramp [(-122.2695,37.247),(-122.2686,37.249),(-122.2677,37.252)] +I- 580 Ramp [(-122.2695,37.247),(-122.2692,37.244),(-122.2684,37.234)] +I- 580 Ramp [(-122.2716,37.259),(-122.2734,37.259)] +I- 580 Ramp [(-122.2806,37.275),(-122.2818,37.28),(-122.2822,37.281),(-122.2837,37.276)] +I- 580 Ramp [(-122.2913,37.278),(-122.2917,37.282)] +I- 580 Ramp [(-122.2917,37.282),(-122.2921,37.286)] +I- 580/I-680 Ramp ((-121.9207,37.988),(-121.9192,37.016)) +I- 580/I-680 Ramp ((-121.9218,37.021),(-121.9237,37.017)) +I- 580/I-680 Ramp [(-121.9213,37.005),(-121.9203,37.013),(-121.9192,37.016),(-121.918,37.02)] +I- 580/I-680 Ramp [(-121.922017,37.02317),(-121.9212,37.021)] +I- 580/I-680 Ramp [(-121.9225,37.034),(-121.9218,37.031),(-121.9213,37.026),(-121.919443,37.02043),(-121.921326,37.01739)] +I- 580/I-680 Ramp [(-121.9243,37.006),(-121.9238,37.005),(-121.9225,37.008),(-121.92154,37.0104)] +I- 580/I-680 Ramp [(-121.9243,37.006),(-121.924389,37.00779),(-121.9237,37.017),(-121.9231,37.022),(-121.9227,37.029),(-121.9229,37.039)] +I- 680 ((-121.8706,37.038),(-121.8709,37.047)) +I- 680 ((-121.939,37.15),(-121.9387,37.145),(-121.9373,37.125),(-121.934242,37.07643),(-121.933886,37.0709),(-121.9337,37.068),(-121.933122,37.06139),(-121.932736,37.05698),(-121.93222,37.05108),(-121.931844,37.04678),(-121.930113,37.027),(-121.926829,37),(-121.9265,37.998),(-121.9217,37.96),(-121.9203,37.949),(-121.9184,37.934)) +I- 680 [(-121.8709,37.047),(-121.8831,37.366),(-121.8833,37.376)] +I- 680 [(-121.8852,37.422),(-121.8874,37.444),(-121.8902,37.47),(-121.8905,37.472),(-121.8907,37.474),(-121.8985,37.545),(-121.8994,37.553),(-121.9007,37.565)] +I- 680 [(-121.8867,37.732),(-121.8845,37.744),(-121.8818,37.756),(-121.8761,37.781),(-121.8712,37.857)] +I- 680 [(-121.902447,37.64695),(-121.903435,37.65882)] +I- 680 [(-121.9101,37.715),(-121.909801,37.70519),(-121.909562,37.69734),(-121.909493,37.69507),(-121.9094,37.692),(-121.909295,37.68862),(-121.909145,37.6838),(-121.909103,37.68245),(-121.908715,37.66995),(-121.908524,37.6638),(-121.9082,37.653)] +I- 680 [(-121.9101,37.715),(-121.911269,37.74682),(-121.9119,37.764),(-121.9124,37.776),(-121.9174,37.905),(-121.9194,37.957),(-121.9207,37.988)] +I- 680 [(-121.9139,37.562),(-121.9077,37.609)] +I- 680 [(-121.9139,37.562),(-121.915,37.54),(-121.9156,37.532),(-121.9165,37.519),(-121.9174,37.504),(-121.918,37.493),(-121.92,37.438),(-121.9202,37.435),(-121.9233,37.404),(-121.9238,37.402)] +I- 680 [(-121.9184,37.934),(-121.917,37.913),(-121.9122,37.83),(-121.9052,37.702)] +I- 680 [(-121.92154,37.0104),(-121.9217,37.014)] +I- 680 [(-121.9217,37.014),(-121.9218,37.021)] +I- 680 [(-121.9229,37.039),(-121.9243,37.057),(-121.9286,37.106),(-121.929195,37.11329),(-121.929661,37.119),(-121.932027,37.148),(-121.93391,37.17107),(-121.9357,37.193),(-121.936421,37.20193),(-121.9378,37.219)] +I- 680 [(-121.939,37.15),(-121.9418,37.195)] +I- 680 Ramp ((-121.9007,37.565),(-121.9008,37.558)) +I- 680 Ramp ((-121.921,37.965),(-121.9198,37.96),(-121.9208,37.957),(-121.9199,37.951),(-121.9187,37.941)) +I- 680 Ramp ((-121.9247,37.932),(-121.9211,37.944),(-121.9201,37.944)) +I- 680 Ramp ((-121.9368,37.149),(-121.937,37.144)) +I- 680 Ramp ((-121.9372,37.335),(-121.938,37.32)) +I- 680 Ramp ((-121.9402,37.143),(-121.94,37.139)) +I- 680 Ramp ((-121.9418,37.314),(-121.9414,37.32)) +I- 680 Ramp ((-121.9422,37.314),(-121.9423,37.318)) +I- 680 Ramp [(-121.8698,37.01),(-121.8706,37.038)] +I- 680 Ramp [(-121.8701,37.878),(-121.8681,37.881)] +I- 680 Ramp [(-121.8703,37.891),(-121.8712,37.857),(-121.8678,37.875)] +I- 680 Ramp [(-121.8709,37.924),(-121.8686,37.925)] +I- 680 Ramp [(-121.8712,37.01),(-121.8709,37.047)] +I- 680 Ramp [(-121.8818,37.756),(-121.8842,37.741),(-121.8867,37.732)] +I- 680 Ramp [(-121.8833,37.376),(-121.8833,37.392),(-121.883,37.4),(-121.8835,37.402),(-121.8852,37.422)] +I- 680 Ramp [(-121.8839,37.397),(-121.8847,37.394),(-121.884,37.399)] +I- 680 Ramp [(-121.8985,37.545),(-121.9001,37.565),(-121.8999,37.571),(-121.9008,37.572),(-121.903,37.586)] +I- 680 Ramp [(-121.8994,37.553),(-121.9008,37.558),(-121.9014,37.565)] +I- 680 Ramp [(-121.9027,37.672),(-121.902847,37.6715),(-121.90161,37.64898)] +I- 680 Ramp [(-121.905,37.699),(-121.9004,37.677),(-121.90161,37.64898)] +I- 680 Ramp [(-121.9052,37.702),(-121.9047,37.667),(-121.903435,37.65882)] +I- 680 Ramp [(-121.9077,37.609),(-121.9036,37.614)] +I- 680 Ramp [(-121.9077,37.609),(-121.9053,37.625)] +I- 680 Ramp [(-121.9167,37.5),(-121.9174,37.504)] +I- 680 Ramp [(-121.92,37.438),(-121.9218,37.424),(-121.9238,37.408),(-121.9252,37.392)] +I- 680 Ramp [(-121.921,37.965),(-121.922,37.966),(-121.9214,37.961)] +I- 680 Ramp [(-121.9226,37.394),(-121.9232,37.392),(-121.9252,37.392)] +I- 680 Ramp [(-121.9238,37.402),(-121.9234,37.395),(-121.923,37.399)] +I- 680 Ramp [(-121.9265,37.998),(-121.9242,37.983),(-121.922383,37.9786),(-121.9198,37.975),(-121.9195,37.954),(-121.9187,37.941),(-121.9184,37.934)] +I- 680 Ramp [(-121.9265,37.998),(-121.9249,37.98),(-121.9227,37.963),(-121.9221,37.959),(-121.9214,37.954),(-121.9206,37.947),(-121.9201,37.944),(-121.9184,37.934)] +I- 680 Ramp [(-121.9373,37.148),(-121.937,37.144),(-121.9373,37.125)] +I- 680 Ramp [(-121.9387,37.145),(-121.9376,37.147)] +I- 680 Ramp [(-121.9394,37.144),(-121.9387,37.145)] +I- 680 Ramp [(-121.9401,37.233),(-121.9378,37.219),(-121.937899,37.22791),(-121.938,37.237)] +I- 680 Ramp [(-121.9406,37.142),(-121.94,37.139),(-121.9373,37.125)] +I- 680 Ramp [(-121.9426,37.315),(-121.9423,37.318),(-121.9414,37.32),(-121.9394,37.324),(-121.938,37.32),(-121.9368,37.313)] +I- 80 ((-122.2927,37.299),(-122.2928,37.293),(-122.2932,37.284)) +I- 80 ((-122.2931,37.301),(-122.2949,37.279)) +I- 80 ((-122.2937,37.277),(-122.3016,37.262)) +I- 80 ((-122.2949,37.279),(-122.2962,37.273)) +I- 80 ((-122.2962,37.273),(-122.3004,37.264)) +I- 80 ((-122.3004,37.264),(-122.3016,37.262),(-122.3051,37.254),(-122.3083,37.249)) +I- 80 ((-122.307,37.902),(-122.3074,37.896),(-122.307512,37.89327),(-122.3081,37.879),(-122.3077,37.861)) +I- 80 [(-122.2932,37.284),(-122.2934,37.28)] +I- 80 [(-122.2981,37.492),(-122.2978,37.48),(-122.2976,37.473),(-122.2971,37.452),(-122.2962,37.413)] +I- 80 [(-122.3023,37.644),(-122.2988,37.518)] +I- 80 [(-122.3062,37.774),(-122.3038,37.695)] +I- 80 [(-122.3065,37.935),(-122.3065,37.913),(-122.3067,37.905),(-122.307,37.902)] +I- 80 [(-122.3075,37.828),(-122.3076,37.831)] +I- 80 [(-122.3075,37.828),(-122.3077,37.822),(-122.3074,37.817),(-122.3069,37.801),(-122.3068,37.795)] +I- 80 [(-122.308,37.98),(-122.3066,37.943),(-122.3056,37.912),(-122.3057,37.908),(-122.305805,37.90511),(-122.3061,37.897),(-122.3064,37.893),(-122.3073,37.881),(-122.3073,37.877),(-122.3077,37.861),(-122.3076,37.831)] +I- 80 [(-122.3083,37.249),(-122.3281,37.216),(-122.348,37.175)] +I- 80 Ramp ((-122.2944,37.491),(-122.2956,37.484),(-122.2965,37.478)) +I- 80 Ramp ((-122.2983,37.501),(-122.2979,37.499)) +I- 80 Ramp ((-122.3017,37.67),(-122.3022,37.662)) +I- 80 Ramp [(-122.2871,37.266),(-122.2901,37.274)] +I- 80 Ramp [(-122.2883,37.247),(-122.2904,37.267),(-122.2909,37.273),(-122.2918,37.275),(-122.2937,37.277)] +I- 80 Ramp [(-122.2885,37.254),(-122.2883,37.247)] +I- 80 Ramp [(-122.2885,37.254),(-122.2893,37.266)] +I- 80 Ramp [(-122.2918,37.279),(-122.2926,37.281)] +I- 80 Ramp [(-122.2923,37.282),(-122.2926,37.283),(-122.2932,37.284)] +I- 80 Ramp [(-122.2934,37.28),(-122.2926,37.281)] +I- 80 Ramp [(-122.2934,37.28),(-122.2962,37.273)] +I- 80 Ramp [(-122.2957,37.396),(-122.2946,37.384),(-122.2948,37.367)] +I- 80 Ramp [(-122.2962,37.413),(-122.2959,37.382),(-122.2951,37.372)] +I- 80 Ramp [(-122.2984,37.506),(-122.2977,37.502),(-122.2979,37.499),(-122.2956,37.489),(-122.2962,37.483),(-122.2965,37.478),(-122.2971,37.452)] +I- 80 Ramp [(-122.2988,37.518),(-122.299,37.5),(-122.2994,37.488),(-122.2995,37.477),(-122.2971,37.452)] +I- 80 Ramp [(-122.3038,37.695),(-122.3021,37.67),(-122.3022,37.662),(-122.3023,37.644)] +I- 80 Ramp [(-122.3038,37.695),(-122.3036,37.674),(-122.3034,37.667),(-122.3033,37.661),(-122.3023,37.644)] +I- 80 Ramp [(-122.3044,37.25),(-122.3051,37.254)] +I- 80 Ramp [(-122.3044,37.25),(-122.3083,37.249)] +I- 80 Ramp [(-122.3051,37.254),(-122.3083,37.249)] +I- 80 Ramp [(-122.3051,37.91),(-122.3056,37.912)] +I- 80 Ramp [(-122.3051,37.91),(-122.3057,37.908)] +I- 80 Ramp [(-122.306,37.876),(-122.3066,37.869),(-122.3067,37.843),(-122.3069,37.818)] +I- 80 Ramp [(-122.3068,37.795),(-122.306,37.783),(-122.3062,37.774)] +I- 80 Ramp [(-122.3068,37.795),(-122.3069,37.782),(-122.3062,37.774)] +I- 80 Ramp [(-122.3069,37.925),(-122.3065,37.935)] +I- 80 Ramp [(-122.307,37.902),(-122.3073,37.881)] +I- 80 Ramp [(-122.3072,37.916),(-122.3074,37.896)] +I- 80 Ramp [(-122.307624,37.87781),(-122.307512,37.89327)] +I- 80 Ramp [(-122.3078,37.93),(-122.3081,37.879)] +I- 80 Ramp [(-122.3088,37.885),(-122.3076,37.831)] +I- 880 ((-121.9669,37.075),(-121.9663,37.071),(-121.9656,37.065),(-121.9618,37.037),(-121.95689,37),(-121.948,37.933)) +I- 880 [(-121.9357,37.83),(-121.9356,37.826),(-121.9351,37.819),(-121.9349,37.813),(-121.9337,37.788),(-121.9327,37.767),(-121.9232,37.57),(-121.9229,37.563),(-121.9229,37.561),(-121.922487,37.55412)] +I- 880 [(-121.937,37.852),(-121.9368,37.848)] +I- 880 [(-121.948,37.933),(-121.9471,37.925),(-121.9467,37.923),(-121.946,37.918),(-121.9452,37.912),(-121.937,37.852)] +I- 880 [(-121.9995,37.289),(-121.998758,37.28558),(-121.998013,37.282),(-121.996913,37.27613),(-121.9929,37.255),(-121.9919,37.252),(-121.991111,37.24795),(-121.990277,37.24367),(-121.989597,37.24018),(-121.9882,37.233),(-121.9871,37.229),(-121.9865,37.226),(-121.9848,37.216),(-121.982,37.196),(-121.9805,37.186),(-121.975936,37.14723),(-121.9712,37.107)] +I- 880 [(-122.0219,37.466),(-122.0205,37.447),(-122.020331,37.44447),(-122.020008,37.43962),(-122.0195,37.432),(-122.0193,37.429),(-122.0164,37.393),(-122.010219,37.34771),(-122.0041,37.313)] +I- 880 [(-122.0375,37.632),(-122.0359,37.619),(-122.0358,37.616),(-122.034514,37.60409),(-122.031876,37.57965),(-122.031193,37.57332),(-122.03016,37.56375),(-122.02943,37.55698),(-122.028689,37.54929),(-122.027833,37.53908),(-122.025979,37.51698),(-122.0238,37.491)] +I- 880 [(-122.0469,37.774),(-122.0466,37.765),(-122.0465,37.761),(-122.045041,37.72234),(-122.0445,37.708),(-122.0426,37.686),(-122.041515,37.67425),(-122.0414,37.673),(-122.0398,37.656)] +I- 880 [(-122.0612,37.003),(-122.0604,37.991),(-122.0596,37.982),(-122.0585,37.967),(-122.0583,37.961),(-122.0553,37.918),(-122.053635,37.89475),(-122.050759,37.8546),(-122.05,37.844),(-122.0485,37.817),(-122.0483,37.813),(-122.0482,37.811)] +I- 880 [(-122.0666,37.085),(-122.0656,37.067),(-122.0653,37.062),(-122.0644,37.049),(-122.0635,37.036),(-122.0618,37.011)] +I- 880 [(-122.0831,37.312),(-122.0819,37.296),(-122.081,37.285),(-122.0786,37.248),(-122.078,37.24),(-122.077642,37.23496),(-122.076983,37.22567),(-122.076599,37.22026),(-122.076229,37.21505),(-122.0758,37.209)] +I- 880 [(-122.0978,37.528),(-122.096,37.496),(-122.0931,37.453),(-122.09277,37.4496),(-122.090189,37.41442),(-122.0896,37.405),(-122.085,37.34)] +I- 880 [(-122.1048,37.638),(-122.1045,37.633),(-122.1042,37.63),(-122.1033,37.617),(-122.1029,37.61)] +I- 880 [(-122.1365,37.902),(-122.1358,37.898),(-122.1333,37.881),(-122.1323,37.874),(-122.1311,37.866),(-122.1308,37.865),(-122.1307,37.864),(-122.1289,37.851),(-122.1277,37.843),(-122.1264,37.834),(-122.1231,37.812),(-122.1165,37.766),(-122.1104,37.72),(-122.109695,37.71094),(-122.109,37.702),(-122.108312,37.69168),(-122.1076,37.681)] +I- 880 [(-122.1365,37.902),(-122.1376,37.91)] +I- 880 [(-122.1755,37.185),(-122.1747,37.178),(-122.1742,37.173),(-122.1692,37.126),(-122.167792,37.11594),(-122.16757,37.11435),(-122.1671,37.111),(-122.1655,37.1),(-122.165169,37.09811),(-122.1641,37.092),(-122.1596,37.061),(-122.158381,37.05275),(-122.155991,37.03657),(-122.1531,37.017),(-122.1478,37.98),(-122.1407,37.932),(-122.1394,37.924),(-122.1389,37.92),(-122.1376,37.91)] +I- 880 [(-122.1761,37.191),(-122.1757,37.187)] +I- 880 [(-122.1947,37.394),(-122.194,37.385),(-122.1933,37.378),(-122.1882,37.32),(-122.1879,37.317),(-122.1877,37.315),(-122.1876,37.312),(-122.1873,37.309),(-122.1829,37.26),(-122.1818,37.249),(-122.1804,37.234),(-122.1802,37.231),(-122.1776,37.206),(-122.1768,37.197)] +I- 880 [(-122.2068,37.534),(-122.2066,37.53),(-122.206,37.522),(-122.2005,37.46),(-122.1967,37.418),(-122.1959,37.407)] +I- 880 [(-122.2214,37.711),(-122.2202,37.699),(-122.2199,37.695),(-122.219,37.682),(-122.2184,37.672),(-122.2173,37.652),(-122.2159,37.638),(-122.2144,37.616),(-122.2138,37.612),(-122.2135,37.609),(-122.212,37.592),(-122.2116,37.586),(-122.2111,37.581)] +I- 880 [(-122.236,37.783),(-122.2352,37.767),(-122.2348,37.764),(-122.2339,37.758),(-122.2329,37.752),(-122.2323,37.748),(-122.2319,37.746),(-122.2316,37.746),(-122.2312,37.744),(-122.2301,37.743),(-122.2269,37.73),(-122.2267,37.73),(-122.222,37.713)] +I- 880 [(-122.2707,37.975),(-122.2693,37.972),(-122.2681,37.966),(-122.267,37.962),(-122.2659,37.957),(-122.2648,37.952),(-122.2636,37.946),(-122.2625,37.935),(-122.2617,37.927),(-122.2607,37.921),(-122.2593,37.916),(-122.258,37.911),(-122.2536,37.898),(-122.2432,37.858),(-122.2408,37.845),(-122.2386,37.827),(-122.2374,37.811)] +I- 880 [(-122.291,37.052),(-122.2898,37.042),(-122.2888,37.038),(-122.2878,37.036),(-122.2863,37.032)] +I- 880 Ramp ((-121.9349,37.813),(-121.935,37.828)) +I- 880 Ramp ((-121.9351,37.819),(-121.935,37.828),(-121.9339,37.847)) +I- 880 Ramp ((-121.936,37.837),(-121.9351,37.835)) +I- 880 Ramp ((-121.9368,37.848),(-121.9362,37.835)) +I- 880 Ramp ((-121.9376,37.834),(-121.937,37.836)) +I- 880 Ramp ((-121.9477,37.91),(-121.9469,37.911),(-121.9463,37.911)) +I- 880 Ramp ((-121.9682,37.065),(-121.9686,37.066)) +I- 880 Ramp ((-122.0008,37.31),(-122.0002,37.308)) +I- 880 Ramp ((-122.0013,37.298),(-122.0013,37.287)) +I- 880 Ramp ((-122.0369,37.645),(-122.0364,37.646)) +I- 880 Ramp ((-122.0477,37.798),(-122.0466,37.789),(-122.0461,37.785)) +I- 880 Ramp ((-122.0477,37.798),(-122.0482,37.8)) +I- 880 Ramp ((-122.0585,37.967),(-122.0577,37.974),(-122.0548,37.966),(-122.055168,37.96828),(-122.0577,37.984)) +I- 880 Ramp ((-122.0919,37.465),(-122.0931,37.461)) +I- 880 Ramp ((-122.0932,37.439),(-122.0922,37.437),(-122.0915,37.427)) +I- 880 Ramp ((-122.1005,37.571),(-122.1003,37.565),(-122.0997,37.548)) +I- 880 Ramp ((-122.1286,37.836),(-122.1283,37.839)) +I- 880 Ramp ((-122.1335,37.901),(-122.1358,37.905)) +I- 880 Ramp ((-122.1378,37.923),(-122.1374,37.925)) +I- 880 Ramp ((-122.1757,37.187),(-122.1754,37.191)) +I- 880 Ramp ((-122.1863,37.322),(-122.187,37.322)) +I- 880 Ramp ((-122.1876,37.312),(-122.1877,37.309)) +I- 880 Ramp ((-122.2054,37.542),(-122.2057,37.533),(-122.2059,37.526)) +I- 880 Ramp ((-122.2091,37.532),(-122.2089,37.535),(-122.2072,37.535)) +I- 880 Ramp ((-122.2187,37.684),(-122.219,37.688),(-122.2194,37.697)) +I- 880 Ramp ((-122.2301,37.743),(-122.2316,37.751)) +I- 880 Ramp ((-122.2352,37.767),(-122.2356,37.768),(-122.236,37.768)) +I- 880 Ramp [(-121.9215,37.556),(-121.92179,37.55745),(-121.9229,37.563)] +I- 880 Ramp [(-121.9232,37.57),(-121.9234,37.559),(-121.9229,37.561)] +I- 880 Ramp [(-121.9335,37.851),(-121.9339,37.847),(-121.9351,37.835),(-121.9357,37.83)] +I- 880 Ramp [(-121.9343,37.85),(-121.937,37.852),(-121.937,37.836),(-121.9362,37.835),(-121.9359,37.826),(-121.9349,37.813)] +I- 880 Ramp [(-121.946,37.918),(-121.9463,37.911),(-121.9452,37.912)] +I- 880 Ramp [(-121.9612,37.099),(-121.9615,37.09),(-121.9616,37.087)] +I- 880 Ramp [(-121.9618,37.037),(-121.961998,37.05205),(-121.962212,37.06831),(-121.9623,37.075),(-121.9616,37.087)] +I- 880 Ramp [(-121.9656,37.065),(-121.9678,37.061),(-121.9676,37.065)] +I- 880 Ramp [(-121.9688,37.061),(-121.9686,37.066),(-121.9669,37.075)] +I- 880 Ramp [(-121.9712,37.107),(-121.9643,37.087),(-121.9623,37.085)] +I- 880 Ramp [(-121.986,37.239),(-121.9865,37.236),(-121.9861,37.234)] +I- 880 Ramp [(-121.9865,37.226),(-121.9872,37.22)] +I- 880 Ramp [(-121.9871,37.229),(-121.9863,37.232)] +I- 880 Ramp [(-121.9885,37.211),(-121.9848,37.216)] +I- 880 Ramp [(-122.0019,37.301),(-122.002,37.293)] +I- 880 Ramp [(-122.0041,37.313),(-122.0018,37.315),(-122.0007,37.315),(-122.0005,37.313),(-122.0002,37.308),(-121.9995,37.289)] +I- 880 Ramp [(-122.0041,37.313),(-122.0038,37.308),(-122.0039,37.284),(-122.0013,37.287),(-121.9995,37.289)] +I- 880 Ramp [(-122.0226,37.474),(-122.0214,37.473),(-122.0219,37.466)] +I- 880 Ramp [(-122.0236,37.488),(-122.0231,37.458),(-122.0227,37.458),(-122.0223,37.452),(-122.0205,37.447)] +I- 880 Ramp [(-122.0238,37.491),(-122.0215,37.483),(-122.0211,37.477),(-122.0205,37.447)] +I- 880 Ramp [(-122.0364,37.652),(-122.0364,37.646),(-122.03618,37.63412),(-122.036027,37.62586),(-122.0359,37.619)] +I- 880 Ramp [(-122.0374,37.639),(-122.0375,37.632)] +I- 880 Ramp [(-122.0383,37.64),(-122.0387,37.636),(-122.0387,37.633),(-122.038,37.632)] +I- 880 Ramp [(-122.0392,37.65),(-122.0389,37.625),(-122.0391,37.617),(-122.036099,37.6161),(-122.0358,37.616)] +I- 880 Ramp [(-122.0398,37.656),(-122.0361,37.656)] +I- 880 Ramp [(-122.0482,37.811),(-122.0461,37.785),(-122.0453,37.778),(-122.045,37.775)] +I- 880 Ramp [(-122.0485,37.817),(-122.0484,37.813),(-122.0482,37.8),(-122.0481,37.794),(-122.0478,37.781),(-122.0469,37.774)] +I- 880 Ramp [(-122.059,37.982),(-122.0577,37.984),(-122.0612,37.003)] +I- 880 Ramp [(-122.0604,37.991),(-122.06,37.983),(-122.0605,37.983)] +I- 880 Ramp [(-122.0618,37.011),(-122.0631,37.982),(-122.0585,37.967)] +I- 880 Ramp [(-122.0635,37.036),(-122.064,37.049),(-122.0648,37.069)] +I- 880 Ramp [(-122.0642,37.073),(-122.0648,37.076),(-122.0666,37.085)] +I- 880 Ramp [(-122.0653,37.062),(-122.0663,37.064)] +I- 880 Ramp [(-122.0758,37.209),(-122.073269,37.18911),(-122.073,37.187),(-122.0723,37.183)] +I- 880 Ramp [(-122.0758,37.209),(-122.075697,37.2063),(-122.075,37.188),(-122.0749,37.184)] +I- 880 Ramp [(-122.0837,37.322),(-122.0822,37.316),(-122.0831,37.312)] +I- 880 Ramp [(-122.0837,37.322),(-122.0843,37.316)] +I- 880 Ramp [(-122.085,37.34),(-122.0801,37.316),(-122.081,37.285)] +I- 880 Ramp [(-122.085,37.34),(-122.0866,37.316),(-122.0819,37.296)] +I- 880 Ramp [(-122.0918,37.466),(-122.0896,37.405)] +I- 880 Ramp [(-122.092,37.461),(-122.0923,37.457)] +I- 880 Ramp [(-122.0931,37.453),(-122.0937,37.469),(-122.0931,37.461),(-122.0923,37.457)] +I- 880 Ramp [(-122.096,37.496),(-122.0941,37.464),(-122.0943,37.421),(-122.0915,37.427),(-122.0896,37.405)] +I- 880 Ramp [(-122.0985,37.574),(-122.0986,37.567),(-122.0978,37.528)] +I- 880 Ramp [(-122.0993,37.571),(-122.0999,37.569)] +I- 880 Ramp [(-122.1005,37.571),(-122.1009,37.568)] +I- 880 Ramp [(-122.1022,37.597),(-122.102055,37.59178),(-122.1019,37.562)] +I- 880 Ramp [(-122.1029,37.61),(-122.1013,37.587),(-122.0999,37.569)] +I- 880 Ramp [(-122.1032,37.557),(-122.0997,37.548),(-122.0978,37.528)] +I- 880 Ramp [(-122.1076,37.681),(-122.106243,37.66549),(-122.1062,37.665),(-122.106043,37.66186),(-122.105869,37.65838),(-122.1048,37.638)] +I- 880 Ramp [(-122.1076,37.681),(-122.107021,37.6646),(-122.107,37.664),(-122.106808,37.66184),(-122.1048,37.638)] +I- 880 Ramp [(-122.1287,37.842),(-122.1283,37.839),(-122.1264,37.834)] +I- 880 Ramp [(-122.1289,37.861),(-122.1284,37.855),(-122.1277,37.843)] +I- 880 Ramp [(-122.1296,37.865),(-122.1299,37.866),(-122.1323,37.874)] +I- 880 Ramp [(-122.1318,37.865),(-122.1319,37.866),(-122.1333,37.881)] +I- 880 Ramp [(-122.1376,37.91),(-122.1379,37.909),(-122.1376,37.907),(-122.1365,37.902)] +I- 880 Ramp [(-122.1379,37.891),(-122.1383,37.897),(-122.1377,37.902)] +I- 880 Ramp [(-122.1379,37.931),(-122.137597,37.92736),(-122.1374,37.925),(-122.1373,37.924),(-122.1369,37.914),(-122.1358,37.905),(-122.1365,37.908),(-122.1358,37.898)] +I- 880 Ramp [(-122.1407,37.932),(-122.1397,37.923),(-122.1389,37.917),(-122.1383,37.913)] +I- 880 Ramp [(-122.164,37.106),(-122.1653,37.113),(-122.1651,37.101)] +I- 880 Ramp [(-122.164188,37.10514),(-122.1641,37.092)] +I- 880 Ramp [(-122.1646,37.113),(-122.163,37.111)] +I- 880 Ramp [(-122.1646,37.113),(-122.165458,37.11379),(-122.167792,37.11594)] +I- 880 Ramp [(-122.165757,37.09059),(-122.165169,37.09811)] +I- 880 Ramp [(-122.165757,37.09059),(-122.16635,37.09559)] +I- 880 Ramp [(-122.1675,37.09),(-122.1666,37.089),(-122.165804,37.08972),(-122.1655,37.09),(-122.1641,37.092)] +I- 880 Ramp [(-122.1675,37.09),(-122.16757,37.11435)] +I- 880 Ramp [(-122.173,37.194),(-122.1742,37.173)] +I- 880 Ramp [(-122.1763,37.184),(-122.1761,37.191)] +I- 880 Ramp [(-122.1763,37.193),(-122.1754,37.191),(-122.1745,37.194),(-122.1743,37.192),(-122.1737,37.196),(-122.1725,37.198)] +I- 880 Ramp [(-122.1768,37.197),(-122.1774,37.182),(-122.1769,37.18),(-122.1758,37.181),(-122.1747,37.178)] +I- 880 Ramp [(-122.1868,37.32),(-122.187,37.322),(-122.1873,37.321),(-122.1877,37.319),(-122.1879,37.317)] +I- 880 Ramp [(-122.1893,37.303),(-122.1888,37.305),(-122.1885,37.307),(-122.1877,37.309),(-122.1873,37.309)] +I- 880 Ramp [(-122.1946,37.405),(-122.1942,37.411),(-122.1951,37.411)] +I- 880 Ramp [(-122.1946,37.405),(-122.1947,37.394)] +I- 880 Ramp [(-122.1952,37.418),(-122.1967,37.418)] +I- 880 Ramp [(-122.1954,37.372),(-122.1957,37.378)] +I- 880 Ramp [(-122.1959,37.407),(-122.1958,37.396),(-122.1953,37.396),(-122.1947,37.394)] +I- 880 Ramp [(-122.2065,37.54),(-122.2066,37.535),(-122.2063,37.531),(-122.2059,37.526),(-122.206,37.522)] +I- 880 Ramp [(-122.2092,37.535),(-122.2074,37.536),(-122.2072,37.535),(-122.2066,37.53)] +I- 880 Ramp [(-122.2096,37.565),(-122.2079,37.549),(-122.2061,37.541)] +I- 880 Ramp [(-122.2111,37.581),(-122.2108,37.535)] +I- 880 Ramp [(-122.2176,37.65),(-122.2173,37.652)] +I- 880 Ramp [(-122.2177,37.668),(-122.2168,37.653),(-122.2159,37.638)] +I- 880 Ramp [(-122.218,37.659),(-122.2173,37.652)] +I- 880 Ramp [(-122.2199,37.695),(-122.2194,37.697),(-122.2197,37.7),(-122.2202,37.699)] +I- 880 Ramp [(-122.222,37.713),(-122.2212,37.705),(-122.2207,37.697),(-122.2208,37.694),(-122.2192,37.68),(-122.2184,37.672)] +I- 880 Ramp [(-122.2301,37.743),(-122.2294,37.735)] +I- 880 Ramp [(-122.2316,37.746),(-122.2316,37.751),(-122.2321,37.752),(-122.2329,37.752)] +I- 880 Ramp [(-122.2325,37.743),(-122.2319,37.746)] +I- 880 Ramp [(-122.2361,37.785),(-122.2356,37.781)] +I- 880 Ramp [(-122.237,37.799),(-122.236,37.777),(-122.236,37.768),(-122.2357,37.764),(-122.235,37.754)] +I- 880 Ramp [(-122.2372,37.802),(-122.23638,37.7996),(-122.2361,37.801),(-122.2357,37.801)] +I- 880 Ramp [(-122.2374,37.811),(-122.2374,37.796)] +I- 880 Ramp [(-122.2536,37.898),(-122.254,37.902)] +I- 880 Ramp [(-122.2577,37.914),(-122.258,37.911)] +I- 880 Ramp [(-122.2636,37.946),(-122.2646,37.954)] +I- 880 Ramp [(-122.2636,37.946),(-122.2649,37.95),(-122.2662,37.954)] +I- 880 Ramp [(-122.268,37.969),(-122.2693,37.972)] +I- 880 Ramp [(-122.2685,37.962),(-122.2695,37.969),(-122.2707,37.975)] +I- 880 Ramp [(-122.2729,37.986),(-122.2744,37.986)] +I- 880 Ramp [(-122.274,37.993),(-122.2729,37.986)] +I- 880 Ramp [(-122.2771,37.002),(-122.278,37)] +I- 880 Ramp [(-122.2775,37.007),(-122.2769,37.001)] +I- 880 Ramp [(-122.2849,37.028),(-122.2845,37.026),(-122.2837,37.021)] +I- 880 Ramp [(-122.2863,37.032),(-122.285451,37.03094),(-122.284429,37.02966),(-122.2831,37.028),(-122.2823,37.031)] +I- 880 Ramp [(-122.291454,37.064),(-122.291088,37.06103),(-122.2903,37.05),(-122.2897,37.044),(-122.2888,37.038)] +I- 880 Ramp [(-122.2916,37.052),(-122.2898,37.04),(-122.2888,37.038)] +I- 980 ((-122.268,37.227),(-122.2678,37.233),(-122.2675,37.243)) +I- 980 ((-122.2688,37.2),(-122.2684,37.215),(-122.268,37.227)) +I- 980 [(-122.2675,37.243),(-122.2674,37.246)] +I- 980 [(-122.2681,37.248),(-122.2677,37.252)] +I- 980 [(-122.268237,37.24426),(-122.2682,37.245)] +I- 980 [(-122.2684,37.236),(-122.2683,37.243),(-122.268237,37.24426)] +I- 980 [(-122.2684,37.236),(-122.2684,37.234),(-122.268817,37.22458),(-122.269027,37.21557),(-122.2691,37.213),(-122.2694,37.199),(-122.2693,37.194)] +I- 980 [(-122.2688,37.2),(-122.2688,37.197),(-122.2689,37.191)] +I- 980 [(-122.2699,37.159),(-122.2697,37.165),(-122.2695,37.17),(-122.2693,37.18),(-122.2689,37.191)] +I- 980 [(-122.2701,37.163),(-122.2699,37.172),(-122.2693,37.192),(-122.2693,37.194)] +I- 980 [(-122.2783,37.006),(-122.2787,37.014),(-122.2791,37.024),(-122.279124,37.0254),(-122.2782,37.053),(-122.2778,37.061),(-122.2773,37.068)] +I- 980 [(-122.2789,37.009),(-122.2795,37.022),(-122.279648,37.02711),(-122.2787,37.055),(-122.2782,37.062),(-122.2775,37.075),(-122.2773,37.078),(-122.2763,37.094),(-122.2758,37.1),(-122.274904,37.11235),(-122.274857,37.1131),(-122.2748,37.114)] +I- 980 Ramp [(-122.2688,37.197),(-122.2691,37.191),(-122.2693,37.18)] +I- 980 Ramp [(-122.2688,37.206),(-122.2688,37.203),(-122.2684,37.215)] +I- 980 Ramp [(-122.2691,37.213),(-122.269438,37.20709),(-122.2699,37.199),(-122.27,37.194),(-122.270194,37.18382),(-122.270352,37.17552),(-122.2704,37.173)] +I- 980 Ramp [(-122.2693,37.194),(-122.2691,37.198)] +I- 980 Ramp [(-122.2699,37.159),(-122.2701,37.163)] +I- 980 Ramp [(-122.2739,37.117),(-122.2745,37.119),(-122.2733,37.129)] +I- 980 Ramp [(-122.2773,37.068),(-122.2772,37.061)] +I- 980 Ramp [(-122.2773,37.078),(-122.2766,37.095)] +Idaho St [(-122.28,37.437),(-122.2801,37.446)] +Iglesia Dr [(-121.946443,37.09438),(-121.946833,37.09285)] +Independence Ave [(-121.865283,37.46138),(-121.8634,37.446)] +Independence Dr [(-121.8683,37.521),(-121.868866,37.50763)] +Independence Road [(-121.9474,37.172),(-121.9508,37.163)] +Indian Road [(-122.2209,37.153),(-122.2216,37.142)] +Indian Way [(-122.2066,37.398),(-122.2045,37.411)] +Indian Creek [(-121.7642,37.246),(-121.7655,37.244)] +Indian Creek Road [(-121.7751,37.798),(-121.7646,37.799)] +Indian Creek Road [(-121.7889,37.843),(-121.8,37.791)] +Indian Creek Road [(-121.863754,37.77499),(-121.8644,37.782)] +Indian Joe Creek [(-121.8273,37.142),(-121.806,37.295)] +Indian Rock Path [(-122.2717,37.919),(-122.2727,37.922)] +Industrial Blvd [(-122.1091,37.328),(-122.1085,37.326)] +Industrial Pkwy [(-122.055708,37.21892),(-122.0559,37.217)] +Industrial Pkwy [(-122.0723,37.183),(-122.0731,37.184)] +Industrial St [(-122.1834,37.424),(-122.1833,37.425)] +Inglewood Dr [(-121.9086,37.877),(-121.9088,37.877)] +Inglewood Dr [(-121.909484,37.87762),(-121.9099,37.878)] +Inglewood St [(-122.0802,37.397),(-122.0823,37.397)] +Inglewood Common [(-121.955843,37.36729),(-121.955147,37.36923)] +Innsbruck St [(-121.7706,37.68),(-121.7708,37.668)] +Inverness St [(-122.1521,37.882),(-122.1523,37.877)] +Inverness Way [(-121.752134,37.92412),(-121.751744,37.92413)] +Iroquois Ave [(-121.7876,37.891),(-121.7876,37.899)] +Irvington Ave [(-121.9624,37.308),(-121.9661,37.307)] +Isabel Ave [(-121.8047,37.63301),(-121.8047,37.63248)] +Isherwood Way [(-122.0138,37.733),(-122.0156,37.702)] +Island Dr [(-122.2329,37.463),(-122.2336,37.455)] +Island Dr [(-122.2399,37.334),(-122.2394,37.34),(-122.2383,37.352)] +Island Dr [(-122.2411,37.318),(-122.2406,37.325)] +Island Pine Ct [(-122.069,37.31),(-122.0697,37.31)] +Isle Royal St [(-121.9695,37.178),(-121.9686,37.15),(-121.9683,37.149)] +Isola Ct [(-122.0551,37.815),(-122.0555,37.811)] +Ithaca St [(-122.0318,37.09),(-122.0317,37.087)] +Ivy Dr [(-122.2434,37.01),(-122.2413,37.015)] +J St [(-121.9762,37.754),(-121.9767,37.743)] +Jacaranda Ct [(-121.9431,37.49),(-121.9426,37.486)] +Jacaranda Dr [(-122.0147,37.288),(-122.013,37.287)] +Jackson Ave [(-121.7416,37.868),(-121.7416,37.862)] +Jackson Ct [(-121.9377,37.336),(-121.9383,37.337)] +Jackson St [(-122.0809,37.669),(-122.0804,37.677)] +Jackson St [(-122.0838,37.614),(-122.0832,37.624)] +Jackson St [(-122.0845,37.6),(-122.0842,37.606)] +Jackson St [(-122.0981,37.368),(-122.0988,37.365)] +Jackson St [(-122.2646,37.025),(-122.2641,37.034)] +Jackson St [(-122.2668,37.991),(-122.2664,37.997)] +Jackson St [(-122.2689,37.955),(-122.2685,37.962)] +Jade Cir [(-121.919585,37.25699),(-121.918784,37.24417)] +Jamaica Way [(-122.1785,37.971),(-122.1792,37.969)] +James Ave [(-122.0634,37.055),(-122.0598,37.052)] +Jamestown Road [(-121.947,37.165),(-121.9476,37.163)] +Jamison Way [(-122.075555,37.98023),(-122.073719,37.98074)] +Jaques Ct [(-122.052072,37.68998),(-122.050458,37.69474)] +Jaquiline St [(-121.725054,37.80597),(-121.723604,37.80449)] +Jarvis Ave [(-122.053935,37.43593),(-122.054359,37.43078)] +Jarvis Ave [(-122.055,37.423),(-122.0552,37.42)] +Jason Way [(-122.0044,37.584),(-122.0033,37.577)] +Jayar Pl [(-122.0345,37.206),(-122.0337,37.209)] +Jayne Ave [(-122.2566,37.13),(-122.2549,37.142)] +Jaynes St [(-122.2789,37.779),(-122.2781,37.781)] +Jean Ct [(-122.0755,37.809),(-122.0766,37.798)] +Jean Dr [(-122.0739,37.78),(-122.0734,37.774)] +Jean Dr [(-122.0766,37.798),(-122.0759,37.794)] +Jean St [(-122.2477,37.18),(-122.2468,37.187),(-122.2459,37.196)] +Jeffer St [(-122.0746,37.856),(-122.0739,37.86)] +Jefferson Ave [(-122.2775,37.663),(-122.2774,37.645),(-122.2771,37.627)] +Jefferson St [(-122.2749,37.049),(-122.2745,37.055)] +Jensen Road [(-122.03781,37.03891),(-122.0377,37.04)] +Jensen St [(-121.754,37.805),(-121.754,37.8)] +Jerome Ave [(-121.9239,37.294),(-121.9239,37.287)] +Jerome Ave [(-121.9247,37.314),(-121.9244,37.309)] +Jerrold Road [(-121.6907,37.681),(-121.6908,37.653)] +Jessica Cir [(-122.0472,37.76),(-122.0488,37.748)] +Jewell Ct [(-122.2048,37.467),(-122.2043,37.452)] +Joaquin Miller Road [(-122.1797,37.083),(-122.1778,37.051)] +Joaquin Miller Road [(-122.1914,37.128),(-122.1862,37.119),(-122.1842,37.106)] +Joaquin Murieta Ave [(-121.9958,37.208),(-121.9962,37.201)] +John Dr [(-122.0939,37.925),(-122.0934,37.919)] +Johnson Dr [(-121.9145,37.901),(-121.915,37.877)] +Johnson Industrial Dr [(-121.9096,37.014),(-121.9172,37.016)] +Jones St [(-122.2982,37.755),(-122.2971,37.757)] +Jones St [(-122.301984,37.74755),(-122.3015,37.749)] +Joseph Dr [(-122.0742,37.12),(-122.0732,37.109)] +Joshua St [(-122.0686,37.455),(-122.0686,37.449)] +Jovan Ter [(-122.046671,37.62206),(-122.046466,37.6181)] +Joyce St [(-122.0792,37.604),(-122.0774,37.581)] +Juana Ave [(-122.1417,37.262),(-122.1396,37.267)] +Juana Ave [(-122.1481,37.243),(-122.1459,37.249)] +June Ct [(-122.1041,37.76),(-122.1045,37.769)] +June Ct [(-122.1786,37.316),(-122.178,37.314)] +Juneau St [(-122.1814,37.068),(-122.1801,37.049)] +Juniper Ave [(-122.0464,37.255),(-122.0476,37.251)] +Juniper St [(-121.7823,37.897),(-121.7815,37.9)] +Juniper St [(-122.1592,37.961),(-122.1591,37.955)] +Junipero Com [(-121.9919,37.796),(-121.992,37.791)] +Jupiter Ct [(-122.064459,37.84741),(-122.064255,37.84626)] +Kains Ave [(-122.2923,37.758),(-122.2922,37.754)] +Kains Ave [(-122.2949,37.828),(-122.2948,37.825)] +Kains Ave [(-122.2992,37.983),(-122.2989,37.97),(-122.2984,37.953)] +Kaiser Dr [(-122.067163,37.47821),(-122.060402,37.51961)] +Kaiser Creek Road [(-122.0928,37.885),(-122.0918,37.802)] +Kamp Dr [(-121.867789,37.82326),(-121.867753,37.8292)] +Kansas Way [(-121.9115,37.71),(-121.912,37.706)] +Kathy Way [(-121.7292,37.825),(-121.729061,37.82514)] +Kato Road [(-121.9185,37.626),(-121.9181,37.627)] +Kay Ave [(-122.0968,37.433),(-122.0968,37.427)] +Kay Ave [(-122.0969,37.398),(-122.0971,37.389)] +Kay Ave [(-122.097,37.461),(-122.0969,37.457)] +Kay Ct [(-121.953,37.277),(-121.9535,37.277)] +Kearney Ave [(-122.1981,37.124),(-122.1963,37.135)] +Keeler Ave [(-122.2552,37.892),(-122.2549,37.882)] +Keeler Ave [(-122.2578,37.906),(-122.2579,37.899)] +Keith Ave [(-122.2603,37.894),(-122.26,37.893)] +Keller Ave [(-122.1353,37.702),(-122.1345,37.705)] +Keller Ave [(-122.154,37.723),(-122.1531,37.722)] +Kelly St [(-122.0519,37.852),(-122.0503,37.856)] +Kelly St [(-122.0583,37.842),(-122.058,37.842)] +Kelso Road [(-121.584782,37.94979),(-121.585132,37.94971)] +Kenilworth Ave [(-122.1501,37.376),(-122.1498,37.371)] +Kenilworth Ave [(-122.151,37.393),(-122.1505,37.383)] +Kenita Way [(-122.0508,37.944),(-122.0503,37.944)] +Kenmore Ave [(-122.2378,37.173),(-122.2386,37.162)] +Kenmore Ct [(-122.0713,37.965),(-122.0706,37.967)] +Kennedy Ave [(-122.0201,37.832),(-122.0203,37.824)] +Kennet St [(-122.0309,37.129),(-122.031,37.115)] +Kent Ave [(-122.113,37.891),(-122.1131,37.887)] +Kent Ave [(-122.113,37.937),(-122.113,37.929)] +Kentucky Ave [(-122.2719,37.026),(-122.2706,37.013)] +Kentwood Way [(-121.9235,37.841),(-121.926,37.838)] +Kenwood Dr [(-122.054303,37.63614),(-122.054133,37.62981)] +Keoncrest Dr [(-122.2842,37.77),(-122.2835,37.771)] +Kerlin St [(-121.9986,37.469),(-121.9979,37.465)] +Kerwin Ave [(-122.181,37.296),(-122.1807,37.295)] +Key Ct [(-122.1246,37.545),(-122.1244,37.553)] +Key Route Blvd [(-122.2921,37.91),(-122.292,37.908)] +Keys Pl [(-122.0871,37.253),(-122.0875,37.252)] +Kildare Road [(-122.0968,37.016),(-122.0959,37)] +Kilkenny Pl [(-122.251002,37.40535),(-122.2508,37.403)] +Kimberly Commons [(-121.737774,37.88769),(-121.737673,37.89024)] +King St [(-122.2733,37.504),(-122.2732,37.496)] +King St [(-122.2738,37.558),(-122.2737,37.55)] +King Way [(-121.9176,37.133),(-121.9185,37.13)] +Kings Ct [(-122.0695,37.764),(-122.0689,37.756)] +Kingsland Ave [(-122.1957,37.743),(-122.1956,37.753)] +Kingsley St [(-122.2311,37.042),(-122.2306,37.046)] +Kirkcaldy St [(-121.859937,37.97443),(-121.8601,37.97441)] +Kirkham St [(-122.289,37.122),(-122.2887,37.129)] +Kit Lane [(-122.0237,37.124),(-122.0236,37.132)] +Kitty Hawk Road [(-121.8048,37.797),(-121.8049,37.867)] +Klamath St [(-121.9142,37.982),(-121.9145,37.978)] +Klamath St [(-122.1832,37.035),(-122.1815,37.023)] +Knapp St [(-122.0594,37.062),(-122.0593,37.049)] +Knight Dr [(-122.089468,37.17681),(-122.089434,37.17337)] +Knight St [(-122.18,37.291),(-122.1794,37.288)] +Knoll Way [(-122.0864,37.848),(-122.0839,37.836)] +Knowland Ave [(-122.1957,37.816),(-122.1948,37.823)] +Kofman Ct [(-122.2498,37.422),(-122.2497,37.417)] +Koford Road [(-122.1903,37.296),(-122.1884,37.286)] +Kolln St [(-121.87,37.792),(-121.8705,37.796)] +Koopmann Creek [(-121.9442,37.181),(-121.943465,37.17671)] +Korbel St [(-122.0648,37.742),(-122.0655,37.723)] +Kottinger Dr [(-121.8596,37.58),(-121.859,37.57)] +Kramer St [(-122.1406,37.834),(-122.1416,37.826)] +Kramer St [(-122.143,37.819),(-122.1435,37.812)] +Krause St [(-121.8731,37.863),(-121.8719,37.865)] +L St [(-121.7684,37.772),(-121.768,37.762)] +L St [(-121.7694,37.795),(-121.7692,37.788)] +La Cresta [(-122.2433,37.353),(-122.2425,37.349)] +La Cresta Ave [(-122.2175,37.06),(-122.217,37.073)] +La Loma Ave [(-122.2554,37.844),(-122.2559,37.841)] +La Playa Dr [(-122.1039,37.545),(-122.101,37.493)] +La Salle Ave [(-122.2191,37.176),(-122.2206,37.158)] +La Salle Ave [(-122.2242,37.153),(-122.2255,37.155)] +La Vereda Road [(-122.2562,37.801),(-122.2558,37.792)] +Ladera Ct [(-121.9444,37.068),(-121.9429,37.07)] +Lafayette Ave [(-122.0309,37.474),(-122.0328,37.458)] +Lafayette Ave [(-122.0336,37.451),(-122.0352,37.438)] +Lafayette Ave [(-122.0395,37.411),(-122.0418,37.398)] +Lafayette Ave [(-122.1602,37.293),(-122.1597,37.287)] +Lafayette St [(-122.2559,37.646),(-122.2553,37.654)] +Laguna Ave [(-122.2062,37.027),(-122.2058,37.03)] +Laguna Ave [(-122.2099,37.989),(-122.2089,37)] +Laguna Dr [(-122.1128,37.418),(-122.1132,37.418)] +Laiolo Road [(-121.9715,37.322),(-121.9707,37.318)] +Lake Blvd [(-122.0381,37.533),(-122.0371,37.53)] +Lake Blvd [(-122.0393,37.539),(-122.0387,37.537)] +Lake Chabot [(-122.0753,37.378),(-122.0762,37.367)] +Lake Chabot Road [(-122.0988,37.133),(-122.0977,37.13)] +Lake Chabot Road [(-122.1061,37.171),(-122.1047,37.155)] +Lake Chabot Road [(-122.1323,37.308),(-122.132,37.307)] +Lake Mead Dr [(-122.0533,37.873),(-122.0523,37.858),(-122.0524,37.853)] +Lake Ontario Dr [(-122.0554,37.863),(-122.0557,37.859)] +Lake Ontario Dr [(-122.0562,37.852),(-122.0567,37.847)] +Lake Pillsbury Dr [(-122.0561,37.906),(-122.0573,37.901)] +Lakecrest Ct [(-122.0947,37.107),(-122.0939,37.103)] +Lakehurst Cir [(-122.284729,37.89025),(-122.286096,37.90364)] +Lakeridge Ave [(-122.048299,37.84349),(-122.048127,37.83401)] +Lakeshore Ave [(-122.2586,37.99),(-122.2556,37.006)] +Lakeview Ave [(-122.2225,37.219),(-122.2237,37.221)] +Lakeview Blvd [(-121.9313,37.702),(-121.936,37.784)] +Lakewood Ct [(-122.0261,37.472),(-122.0263,37.469)] +Lakewood Dr [(-122.0288,37.48),(-122.0269,37.477)] +Lakewood St [(-121.9189,37.763),(-121.9191,37.772)] +Lakewood Way [(-122.0795,37.389),(-122.0793,37.366)] +Lambaren Ave [(-121.7825,37.822),(-121.7816,37.821)] +Lambeth Road [(-121.7686,37.942),(-121.7684,37.947)] +Lanai Ct [(-122.0768,37.269),(-122.0768,37.26)] +Landing Road [(-121.947,37.809),(-121.9444,37.82)] +Landon Ave [(-121.9785,37.258),(-121.978,37.255)] +Langmuir Lane [(-121.9199,37.19),(-121.9215,37.197)] +Lansdown Ct [(-121.8659,37.949),(-121.8661,37.96)] +Larchmont Isle [(-122.2667,37.654),(-122.2671,37.647)] +Lark Way [(-122.0563,37.8),(-122.0553,37.797)] +Larkspur Dr [(-121.7431,37.084),(-121.7435,37.09)] +Larkspur St [(-122.0118,37.231),(-122.011,37.227)] +Larmer Ct [(-122.2371,37.215),(-122.2365,37.212)] +Las Palmas Ave [(-121.9521,37.547),(-121.9513,37.539)] +Las Palmas Ct [(-121.944,37.502),(-121.9443,37.513)] +Las Palmas Ct [(-121.950103,37.00582),(-121.949498,37.00835)] +Las Positas Blvd [(-121.7988,37.889),(-121.7984,37.889)] +Las Positas Blvd [(-121.8642,37.957),(-121.8645,37.955)] +Las Positas Blvd [(-121.907779,37.79734),(-121.908481,37.79416)] +Las Positas Blvd [(-121.9094,37.79),(-121.9099,37.787)] +Las Positas Blvd [(-121.915,37.769),(-121.9187,37.759)] +Las Positas Road [(-121.7548,37.025),(-121.75,37.01778)] +Las Positas Road [(-121.764488,37.99199),(-121.75569,37.02022)] +Las Positas Road [(-121.7726,37.976),(-121.76841,37.98426)] +Lassen Road [(-121.7428,37.05),(-121.742211,37.05687)] +Latham Lane [(-122.2572,37.943),(-122.2565,37.947)] +Latham Walk [(-122.2575,37.941),(-122.2572,37.943)] +Lauderdale Ave [(-122.0983,37.344),(-122.0977,37.334)] +Laurel St [(-122.0483,37.265),(-122.0476,37.251)] +Laurette Pl [(-122.0651,37.476),(-122.0646,37.479)] +Lauriston Ct [(-122.2032,37.45),(-122.2034,37.46)] +Laverne Ave [(-122.1938,37.731),(-122.1928,37.721)] +Laverne Dr [(-122.1533,37.821),(-122.1532,37.814)] +Laverne Dr [(-122.1564,37.852),(-122.1549,37.847)] +Lawlor St [(-122.1573,37.533),(-122.1567,37.517)] +Lawrence Dr [(-122.0779,37.133),(-122.0756,37.141)] +Lawton Ave [(-122.2563,37.36),(-122.256,37.366)] +Lee Ave [(-121.7614,37.878),(-121.7615,37.898)] +Lee Ave [(-122.1507,37.298),(-122.1506,37.291)] +Lee St [(-122.2561,37.115),(-122.2569,37.097)] +Leigh St [(-121.9154,37.776),(-121.9153,37.774)] +Leighton St [(-122.0805,37.628),(-122.0797,37.632)] +Leimert Blvd [(-122.2059,37.169),(-122.2048,37.169)] +Leland Way [(-121.7867,37.655),(-121.7859,37.656)] +Lemke Pl [(-121.9882,37.261),(-121.98835,37.2595)] +Leon Ct [(-122.0249,37.525),(-122.0255,37.521)] +Leona St [(-122.1751,37.84),(-122.1739,37.836)] +Leonard Dr [(-122.1731,37.185),(-122.1731,37.172),(-122.1725,37.165)] +Leonardo Way [(-122.1073,37.577),(-122.108,37.575)] +Leroy Ave [(-122.2598,37.819),(-122.259792,37.8182)] +Leslie St [(-121.9639,37.412),(-121.9634,37.405)] +Leslie St [(-121.9729,37.438),(-121.971866,37.43847)] +Lessley Ave [(-122.0727,37.866),(-122.0718,37.867)] +Levine Ct [(-122.0836,37.75),(-122.0831,37.753)] +Lewelling Blvd [(-122.1118,37.868),(-122.1112,37.869)] +Lewelling Blvd [(-122.1219,37.865),(-122.1178,37.866)] +Lewelling Blvd [(-122.1555,37.793),(-122.1572,37.787)] +Lewis Ave [(-122.143,37.359),(-122.1433,37.339)] +Liberty St [(-121.9795,37.499),(-121.9785,37.495)] +Liberty St [(-122.1019,37.934),(-122.1009,37.924)] +Libra Ct [(-121.7389,37.179),(-121.7391,37.187)] +Lilac Loop [(-122.0182,37.805),(-122.0184,37.798)] +Lilac St [(-122.2014,37.799),(-122.2008,37.804)] +Lillian Ave [(-122.1358,37.044),(-122.1337,37.063)] +Lillian St [(-121.7308,37.829),(-121.7307,37.824)] +Lilly St [(-122.078139,37.64103),(-122.0775,37.643)] +Lincoln Ave [(-121.7449,37.849),(-121.745,37.832)] +Lincoln Ave [(-122.1321,37.499),(-122.1349,37.499)] +Lincoln Ave [(-122.2064,37.063),(-122.2059,37.065)] +Lincoln Ave [(-122.2093,37.034),(-122.2087,37.041)] +Lincoln Ave [(-122.251,37.712),(-122.25,37.707)] +Lincoln Ave [(-122.2549,37.729),(-122.2541,37.726)] +Lincoln Ave [(-122.2628,37.751),(-122.2615,37.751)] +Lincoln Ave [(-122.2674,37.752),(-122.2667,37.753)] +Lincoln Ave [(-122.2721,37.754),(-122.2699,37.753)] +Lincoln Ave [(-122.2786,37.756),(-122.276,37.755)] +Lincoln Way [(-122.1987,37.117),(-122.198,37.101)] +Linda Way [(-121.8657,37.573),(-121.866,37.566)] +Lindbergh Ave [(-121.8089,37.973),(-121.8072,37.973)] +Lindbergh Ave [(-121.8151,37.972),(-121.8118,37.971),(-121.8098,37.973)] +Lindemann Road [(-121.558002,37.00213),(-121.558002,37.00663)] +Linden St [(-121.7733,37.876),(-121.772,37.879)] +Linden St [(-121.7782,37.861),(-121.777,37.865),(-121.7757,37.868)] +Linden St [(-122.0692,37.83),(-122.0678,37.833)] +Linden St [(-122.2751,37.344),(-122.275,37.35)] +Linden St [(-122.2832,37.096),(-122.2827,37.112)] +Linden St [(-122.2842,37.067),(-122.2837,37.082)] +Linden St [(-122.2854,37.035),(-122.2853,37.038)] +Linden St [(-122.2867,37.998),(-122.2864,37.008)] +Linmore Dr [(-121.9202,37.39),(-121.9191,37.388)] +Lisbon Ave [(-121.7818,37.71),(-121.7808,37.71)] +Little Foot Dr [(-121.9223,37.064),(-121.9228,37.064)] +Livermore Ave [(-121.7509,37.715),(-121.750474,37.71229)] +Livermore Ave [(-121.7553,37.744),(-121.7539,37.737)] +Livermore Ave [(-121.7589,37.765),(-121.7584,37.763)] +Livermore Ave [(-121.7662,37.811),(-121.7656,37.808)] +Livermore Ave [(-121.7687,37.448),(-121.769,37.375)] +Livermore Ave [(-121.7699,37.863),(-121.7703,37.874)] +Livermore Ave [(-121.772719,37.99085),(-121.7728,37.001)] +Livermore Commons [(-121.926632,37.3099),(-121.926508,37.30113)] +Locksley Ave [(-122.2547,37.422),(-122.2534,37.438)] +Lockwood Ave [(-121.9401,37.366),(-121.9408,37.364)] +Lockwood St [(-122.1802,37.628),(-122.1778,37.601)] +Locust St [(-121.7815,37.876),(-121.7791,37.881)] +Locust St [(-122.0435,37.315),(-122.0435,37.312)] +Locust St [(-122.1606,37.007),(-122.1593,37.987)] +Locust St [(-122.1813,37.578),(-122.1807,37.572)] +Logan Ct [(-122.0053,37.492),(-122.0061,37.484)] +Logan Dr [(-121.9862,37.39),(-121.9856,37.384)] +Logan Dr [(-121.9913,37.423),(-121.990341,37.41763)] +Loma Dr [(-121.9202,37.39),(-121.9204,37.394)] +Loma Vista Ave [(-122.1952,37.942),(-122.1933,37.952)] +Lomitas Ave [(-121.773262,37.59041),(-121.77308,37.59042),(-121.772998,37.59043)] +Lomitas Ave [(-121.7807,37.574),(-121.7804,37.586)] +Longridge Road [(-122.2345,37.096),(-122.2317,37.099)] +Longview Dr [(-121.904,37.486),(-121.9047,37.482)] +Longview Dr [(-122.1277,37.257),(-122.1277,37.252)] +Longwood Ct [(-122.1036,37.606),(-122.1038,37.603)] +Lori Way [(-122.0446,37.845),(-122.0441,37.835)] +Loro Pl [(-121.9447,37.577),(-121.9458,37.582)] +Lorren Dr [(-121.9911,37.491),(-121.9926,37.473)] +Los Banos St [(-122.102,37.914),(-122.1013,37.91)] +Los Banos St [(-122.1064,37.965),(-122.1057,37.956)] +Louise Lane [(-122.0749,37.764),(-122.0754,37.758)] +Lowell St [(-122.275,37.384),(-122.2752,37.389)] +Lowell St [(-122.2757,37.41),(-122.2759,37.417)] +Lowry Road [(-122.052627,37.83339),(-122.0531,37.827),(-122.0538,37.818)] +Lucot St [(-122.1091,37.746),(-122.1096,37.743)] +Luna Ave [(-122.1238,37.117),(-122.123,37.124)] +Lunar Way [(-122.0668,37.883),(-122.0669,37.877)] +Lurene Dr [(-121.918603,37.24972),(-121.919428,37.24785)] +Luzon Ct [(-121.9328,37.28),(-121.9321,37.279)] +Lyman Road [(-122.2124,37.068),(-122.2105,37.093)] +Lynde St [(-122.2195,37.912),(-122.2187,37.91),(-122.2173,37.908)] +Lyndhurst St [(-122.1823,37.354),(-122.1807,37.348)] +Lyra St [(-121.9186,37.766),(-121.9184,37.762)] +M St [(-121.7731,37.842),(-121.7736,37.853)] +M St [(-122.0851,37.754),(-122.0845,37.742)] +Maar Ave [(-121.9573,37.693),(-121.9565,37.701)] +Mabel Ave [(-122.0774,37.029),(-122.0728,37.029)] +Mabel St [(-122.2841,37.591),(-122.284,37.583)] +Mac Arthur Blvd [(-122.139,37.34),(-122.138812,37.34)] +Mac Arthur Blvd [(-122.1394,37.356),(-122.139376,37.35503)] +Mac Arthur Blvd [(-122.1407,37.372),(-122.14,37.364)] +Mac Arthur Blvd [(-122.1495,37.412),(-122.1487,37.408)] +Mac Arthur Blvd [(-122.1552,37.454),(-122.1541,37.446)] +Mac Arthur Blvd [(-122.1605,37.553),(-122.1596,37.525)] +Mac Arthur Blvd [(-122.1636,37.618),(-122.1629,37.612)] +Mac Arthur Blvd [(-122.1697,37.68),(-122.1696,37.679)] +Mac Arthur Blvd [(-122.185,37.757),(-122.1843,37.753)] +Mac Arthur Blvd [(-122.1868,37.773),(-122.1861,37.767)] +Mac Arthur Blvd [(-122.188,37.837),(-122.1871,37.833)] +Mac Arthur Blvd [(-122.207,37.985),(-122.204,37.973)] +Mac Arthur Blvd [(-122.2239,37.007),(-122.2229,37.005)] +Mac Arthur Blvd [(-122.2258,37.01),(-122.2251,37.008)] +Mac Arthur Blvd [(-122.2281,37.014),(-122.2278,37.013)] +Mac Arthur Blvd [(-122.2328,37.039),(-122.2307,37.022)] +Mac Arthur Blvd [(-122.2353,37.054),(-122.2338,37.044)] +Mac Arthur Blvd [(-122.2405,37.072),(-122.2402,37.07)] +Mac Arthur Blvd [(-122.252491,37.17473),(-122.253,37.182)] +Mac Arthur Blvd [(-122.262,37.258),(-122.2631,37.26)] +Mac Arthur Blvd [(-122.2673,37.272),(-122.2676,37.273)] +Mackenzie Pl [(-122.0125,37.698),(-122.0115,37.715)] +Maddux Dr [(-122.1829,37.343),(-122.1823,37.341)] +Maddux Dr [(-122.1848,37.366),(-122.1848,37.36)] +Madelaine Pl [(-122.0401,37.448),(-122.0395,37.448)] +Madera Ave [(-122.19,37.814),(-122.1914,37.824)] +Madison Ave [(-121.7414,37.777),(-121.7415,37.77)] +Madison Ave [(-122.0628,37.078),(-122.063,37.071)] +Madison St [(-122.267,37.962),(-122.2668,37.965)] +Madison St [(-122.2686,37.937),(-122.2682,37.945)] +Magee Ave [(-122.1991,37.928),(-122.1977,37.937)] +Magnolia Cir [(-121.868186,37.81015),(-121.866849,37.80683)] +Magnolia Dr [(-122.2313,37.296),(-122.2317,37.285)] +Magnolia St [(-122.0361,37.306),(-122.0354,37.303)] +Magnolia St [(-122.0409,37.333),(-122.0394,37.325)] +Magnolia St [(-122.0971,37.5),(-122.0962,37.484)] +Magnolia St [(-122.2864,37.104),(-122.286,37.115)] +Magnolia St [(-122.2899,37.005),(-122.2894,37.019)] +Main St [(-121.8743,37.615),(-121.8739,37.624)] +Main St [(-121.8754,37.595),(-121.875,37.604)] +Main St [(-121.8769,37.571),(-121.876403,37.57907)] +Main St [(-121.8875,37.939),(-121.8907,37.936)] +Main St [(-122.0817,37.729),(-122.0807,37.719)] +Main St [(-122.0844,37.758),(-122.0836,37.75)] +Main St [(-122.2907,37.832),(-122.2907,37.839)] +Mairmont Dr [(-121.8725,37.8),(-121.8734,37.8)] +Maitland Dr [(-122.2286,37.273),(-122.2277,37.265)] +Majestic Ave [(-122.1784,37.793),(-122.1789,37.788)] +Majestic Way [(-122.142593,37.98723),(-122.1423,37.98485)] +Malabar Ave [(-122.0727,37.103),(-122.0711,37.103)] +Malcolm Ave [(-122.1269,37.516),(-122.125,37.514)] +Malcolm Ave [(-122.1366,37.469),(-122.1359,37.483)] +Mallard Ct [(-122.0358,37.486),(-122.0367,37.492)] +Malta Ct [(-122.1832,37.273),(-122.1823,37.278)] +Manchester Road [(-122.1125,37.071),(-122.1116,37.071)] +Manchester St [(-121.866725,37.98973),(-121.866734,37.98255)] +Mandalay Road [(-122.2322,37.397),(-122.2321,37.403)] +Manila Ave [(-122.2448,37.425),(-122.2437,37.428)] +Mann Ave [(-122.0165,37.844),(-122.0171,37.83)] +Manor Blvd [(-122.1402,37.912),(-122.1409,37.913)] +Manor Blvd [(-122.1421,37.912),(-122.1426,37.912)] +Manor Blvd [(-122.1452,37.911),(-122.1461,37.91)] +Manor Blvd [(-122.1584,37.906),(-122.1597,37.905)] +Manor Way [(-122.2853,37.857),(-122.2844,37.855)] +Manter Road [(-122.0531,37.984),(-122.0522,37.98)] +Mantilla Ave [(-122.0781,37.31),(-122.079,37.309)] +Manzanita St [(-122.0188,37.263),(-122.0182,37.258)] +Maple Ave [(-122.1987,37.024),(-122.197,37.035)] +Maple Ave [(-122.2051,37.962),(-122.2047,37.965)] +Maple Ave [(-122.21,37.909),(-122.2096,37.915)] +Maple St [(-121.7638,37.824),(-121.7627,37.82)] +Maple St [(-122.2888,37.796),(-122.2872,37.795)] +Maple Leaf Dr [(-121.864615,37.81276),(-121.863868,37.79283)] +Marabu Way [(-121.9503,37.454),(-121.9508,37.45)] +Maraschino Ct [(-122.0249,37.842),(-122.0252,37.833)] +Margery Dr [(-121.9766,37.338),(-121.9772,37.33)] +Marianas [(-122.2426,37.344),(-122.243,37.339)] +Marianas [(-122.244,37.327),(-122.244408,37.32305)] +Marigold Ct [(-121.9177,37.748),(-121.9187,37.746)] +Marigold Road [(-121.7383,37.123),(-121.7393,37.128)] +Marin Ave [(-122.1044,37.614),(-122.1055,37.613)] +Marin Ave [(-122.1101,37.608),(-122.1107,37.607)] +Marin Ave [(-122.258,37.969),(-122.258,37.966)] +Marin Ave [(-122.2741,37.894),(-122.272,37.901)] +Marin Ave [(-122.2865,37.891),(-122.2856,37.895)] +Marin Ave [(-122.2928,37.877),(-122.2925,37.877)] +Marin Ave [(-122.2956,37.871),(-122.2948,37.873)] +Marin Way [(-122.2443,37.898),(-122.2436,37.893)] +Marina Blvd [(-122.163,37.111),(-122.164,37.106)] +Marina Blvd [(-122.164188,37.10514),(-122.1651,37.101)] +Marineview Dr [(-122.1261,37.21),(-122.1254,37.205)] +Marineview Dr [(-122.1318,37.241),(-122.1305,37.239)] +Maritime St [(-122.3072,37.156),(-122.3084,37.142)] +Market Ave [(-122.0229,37.328),(-122.0244,37.312)] +Market St [(-122.2727,37.333),(-122.2725,37.34)] +Market St [(-122.2738,37.292),(-122.2736,37.301)] +Market St [(-122.2741,37.426),(-122.2742,37.433)] +Market St [(-122.2754,37.227),(-122.2751,37.235)] +Market St [(-122.2794,37.109),(-122.2793,37.114)] +Market St [(-122.2826,37.021),(-122.2825,37.023)] +Marlboro Way [(-121.86612,37.9994),(-121.866,37.999)] +Marlin Ct [(-122.044157,37.30406),(-122.044602,37.30052)] +Marlow Dr [(-122.1375,37.346),(-122.1374,37.351)] +Marne St [(-122.148,37.811),(-122.1476,37.805)] +Mars Road [(-121.7834,37.586),(-121.7827,37.575)] +Marsala Ct [(-121.848563,37.64116),(-121.847736,37.63501),(-121.847146,37.63392)] +Marshall St [(-122.0637,37.99),(-122.0638,37.982)] +Marshall Ter [(-122.026173,37.67648),(-122.026375,37.67346)] +Martin Ave [(-121.8618,37.818),(-121.8618,37.82696),(-121.8618,37.848)] +Martin Luther King Jr Way [(-122.2667,37.353),(-122.2666,37.357)] +Martin Luther King Jr Way [(-122.2698,37.223),(-122.2697,37.229)] +Martin Luther King Jr Way [(-122.2703,37.527),(-122.2702,37.517)] +Martin Luther King Jr Way [(-122.2705,37.194),(-122.2704,37.199)] +Martin Luther King Jr Way [(-122.2707,37.563),(-122.2706,37.545)] +Martin Luther King Jr Way [(-122.2709,37.489),(-122.2708,37.481)] +Martin Luther King Jr Way [(-122.2712,37.608),(-122.2711,37.599)] +Martin Luther King Jr Way [(-122.272,37.146),(-122.2715,37.153)] +Martin Luther King Jr Way [(-122.2787,37.014),(-122.2784,37.02),(-122.2779,37.027)] +Martinez Dr [(-121.984,37.793),(-121.984,37.796)] +Martinez St [(-122.159,37.191),(-122.1582,37.185)] +Maryland Ave [(-122.2734,37.031),(-122.272,37.032)] +Marylin Ave [(-121.7857,37.838),(-121.7833,37.837)] +Masonic Ter [(-121.9512,37.123),(-121.9508,37.124)] +Massachusetts St [(-122.0925,37.051),(-122.0909,37.056)] +Mateo Ct [(-122.0266,37.659),(-122.0273,37.65)] +Matthew Ct [(-121.8807,37.394),(-121.8783,37.395)] +Mattos Dr [(-121.9983,37.542),(-121.9992,37.53)] +Mattos Dr [(-122.0002,37.52),(-122.0005,37.513)] +Mattos Dr [(-122.0005,37.502),(-122.000898,37.49683)] +Mattox Road [(-122.0958,37.872),(-122.0957,37.876)] +Maubert Ave [(-122.1114,37.009),(-122.1096,37.995)] +Maud Ave [(-122.1387,37.25),(-122.1379,37.252)] +Mauna Loa Park Dr [(-121.9723,37.191),(-121.972,37.196)] +Mavis Ct [(-121.8584,37.606),(-121.8577,37.603)] +Mavis Dr [(-121.86,37.628),(-121.8598,37.606)] +Maxwelton Road [(-122.2248,37.31),(-122.2252,37.32)] +May Ct [(-122.0589,37.323),(-122.0577,37.331)] +May Road [(-122.0168,37.083),(-122.015,37.095)] +Maya St [(-121.9148,37.792),(-121.9143,37.784)] +Maybelle Ave [(-122.1957,37.878),(-122.1948,37.883)] +Maybelle Way [(-122.1974,37.873),(-122.1971,37.874)] +Mayfair Park Ave [(-121.9631,37.148),(-121.9629,37.143)] +Mayhews Landing Road [(-122.0417,37.346),(-122.0424,37.341)] +Mayhews Landing Road [(-122.0458,37.318),(-122.0468,37.309)] +Mayhews Landing Road [(-122.0482,37.299),(-122.0489,37.295)] +Mayport Cir [(-122.283588,37.88064),(-122.284724,37.87992)] +Mayview Way [(-121.7869,37.637),(-121.7848,37.636)] +Mc Clary Ave [(-122.1924,37.443),(-122.1917,37.448)] +Mc Farlane Lane [(-122.0823,37.377),(-122.0863,37.374)] +Mc Gee Ave [(-122.2755,37.611),(-122.2754,37.603)] +Mc Gee Ave [(-122.2768,37.709),(-122.2768,37.702)] +Mc Gee Ave [(-122.2772,37.746),(-122.2771,37.736)] +Mc Millan St [(-122.2479,37.454),(-122.248,37.457)] +McClure Ave [(-122.1431,37.001),(-122.1436,37.998)] +McGlinchey Dr [(-121.7721,37.745),(-121.7722,37.729)] +McKeown Ct [(-122.0676,37.681),(-122.0671,37.674)] +McKeown Ter [(-121.992,37.825),(-121.992203,37.82275)] +McSherry Way [(-122.235166,37.29199),(-122.234053,37.27635)] +Meadowbrook Ave [(-122.0406,37.198),(-122.0389,37.183)] +Meadowbrook Com [(-122.0043,37.608),(-122.0036,37.609)] +Meadowlark Dr [(-122.0692,37.985),(-122.0692,37.973)] +Mecartney Road [(-122.2473,37.374),(-122.2455,37.369)] +Mecartney Road [(-122.24835,37.37769),(-122.247665,37.3761)] +Medacino Ter [(-122.043321,37.65121),(-122.043914,37.64881)] +Medallion Dr [(-122.0502,37.08),(-122.0502,37.059)] +Medallion Dr [(-122.0502,37.929),(-122.0502,37.936)] +Medellion Dr [(-122.050194,37.95738),(-122.050187,37.96407)] +Medford Ave [(-122.1017,37.828),(-122.1015,37.829),(-122.1002,37.832)] +Medlar Dr [(-122.0627,37.378),(-122.0625,37.375)] +Meek Ave [(-122.0919,37.641),(-122.0897,37.642)] +Meekland Ave [(-122.113,37.812),(-122.1128,37.809)] +Meiggs St [(-121.9596,37.267),(-121.9593,37.255)] +Melbourne Ave [(-122.0842,37.285),(-122.0837,37.269)] +Melcher St [(-122.1792,37.21),(-122.1778,37.198)] +Mellow Way [(-122.0387,37.846),(-122.0377,37.841)] +Melrose Ave [(-122.2032,37.736),(-122.2029,37.733)] +Melrose Ave [(-122.2075,37.756),(-122.2072,37.754)] +Melrose Ave [(-122.2328,37.331),(-122.2319,37.335)] +Mendenhall Road [(-121.681342,37.03354),(-121.684794,37.0443)] +Mendenhall Road [(-122.134,37.677),(-122.1324,37.685)] +Merced St [(-122.1708,37.102),(-122.1707,37.099)] +Mercury St [(-122.0598,37.291),(-122.0595,37.284)] +Merle Ct [(-122.1467,37.373),(-122.1467,37.366)] +Merle Ct [(-122.1482,37.368),(-122.1479,37.358)] +Merol Ave [(-121.9924,37.453),(-121.9918,37.45)] +Merriewood Dr [(-122.2136,37.373),(-122.2128,37.389)] +Merrill Ave [(-121.9205,37.807),(-121.9196,37.811)] +Merrimac River St [(-122.032907,37.70666),(-122.0332,37.703)] +Merritt Ave [(-122.2471,37.078),(-122.2446,37.078)] +Merritt Ave [(-122.2495,37.053),(-122.2487,37.066)] +Merritt Channel [(-122.2591,37.968),(-122.2606,37.942)] +Mesa Ave [(-122.233,37.304),(-122.2322,37.291)] +Meteor Dr [(-122.0713,37.868),(-122.0702,37.862)] +Miami Ave [(-122.0812,37.234),(-122.0812,37.229)] +Michael Ave [(-121.9605,37.208),(-121.961,37.206)] +Michell Ct [(-121.7588,37.897),(-121.7583,37.893)] +Michelle St [(-121.9691,37.461),(-121.968214,37.45771)] +Middlefield Ave [(-121.9442,37.309),(-121.9426,37.311)] +Midvale Ave [(-122.2016,37.933),(-122.2009,37.938)] +Midway Road [(-121.572056,37.50049),(-121.574787,37.51247)] +Milani Ave [(-122.0235,37.438),(-122.024,37.432)] +Milburn Ter [(-122.058937,37.54931),(-122.058337,37.5373)] +Mildred Ct [(-122.0002,37.388),(-121.9998,37.386)] +Mildred Dr [(-121.9958,37.44),(-121.9964,37.433)] +Mildred Dr [(-121.9973,37.421),(-121.9977,37.417)] +Miles Ave [(-122.2599,37.373),(-122.2589,37.382)] +Miller Ave [(-122.2322,37.844),(-122.2319,37.848)] +Miller Ave [(-122.2353,37.806),(-122.235,37.809)] +Miller Road [(-122.0902,37.645),(-122.0865,37.545)] +Miller St [(-122.1627,37.048),(-122.1614,37.032)] +Mills Ave [(-122.1222,37.917),(-122.1222,37.908)] +Milmar Blvd [(-122.0785,37.108),(-122.0783,37.101)] +Milvia St [(-122.2689,37.593),(-122.2687,37.585)] +Milvia St [(-122.2692,37.637),(-122.2691,37.629)] +Milvia St [(-122.2707,37.772),(-122.2707,37.763)] +Milvia St [(-122.2711,37.817),(-122.2708,37.8),(-122.2707,37.781)] +Minerva St [(-122.0652,37.282),(-122.066,37.28)] +Mines Road [(-121.531666,37.83219),(-121.534092,37.94366)] +Mines Road [(-121.536341,37),(-121.536966,37.00198)] +Mines Road [(-121.570515,37.78068),(-121.568708,37.80183)] +Mines Road [(-121.633014,37.95741),(-121.642288,37.98874)] +Minivet Ct [(-121.8834,37.805),(-121.8838,37.811)] +Minturn Ct [(-122.0545,37.944),(-122.0538,37.946)] +Mira Vista Dr [(-122.0829,37.22),(-122.0827,37.213)] +Mirador Ct [(-121.8644,37.556),(-121.8633,37.552)] +Miramar Ave [(-122.1009,37.025),(-122.099089,37.03209)] +Miramonte Ave [(-122.1052,37.986),(-122.1042,37.997)] +Miranda St [(-122.0715,37.211),(-122.0717,37.206)] +Miranda Way [(-121.7837,37.649),(-121.7807,37.648)] +Mission Blvd [(-121.918886,37),(-121.9194,37.976),(-121.9198,37.975)] +Mission Blvd [(-121.920783,37.37168),(-121.9204,37.367)] +Mission Blvd [(-121.9214,37.961),(-121.9217,37.96)] +Mission Blvd [(-121.924901,37.92912),(-121.9254,37.922)] +Mission Blvd [(-121.928695,37.43767),(-121.925,37.417)] +Mission Blvd [(-121.937204,37.48803),(-121.936483,37.48336)] +Mission Blvd [(-121.9418,37.517),(-121.9389,37.499)] +Mission Blvd [(-121.9449,37.536),(-121.9438,37.53)] +Mission Blvd [(-121.949133,37.56339),(-121.948176,37.5572)] +Mission Blvd [(-121.9562,37.607),(-121.9548,37.598)] +Mission Blvd [(-121.9632,37.683),(-121.96315,37.6825)] +Mission Blvd [(-121.971801,37.77041),(-121.9706,37.762)] +Mission Blvd [(-121.9823,37.791),(-121.9765,37.788),(-121.9751,37.786)] +Mission Blvd [(-122.0006,37.896),(-121.9989,37.88)] +Mission Blvd [(-122.0221,37.084),(-122.021325,37.07762)] +Mission Blvd [(-122.0641,37.491),(-122.062,37.464)] +Mission Blvd [(-122.07,37.567),(-122.0692,37.555)] +Mission Blvd [(-122.0798,37.688),(-122.0779,37.668)] +Mission Blvd [(-122.0928,37.802),(-122.0919,37.796),(-122.0916,37.793)] +Mission Blvd [(-122.0955,37.824),(-122.0947,37.817)] +Mission Blvd [(-122.1031,37.882),(-122.1024,37.877)] +Mission Ct [(-121.929057,37.90595),(-121.929602,37.90063)] +Mission Dr [(-121.879,37.526),(-121.8788,37.526)] +Mission Creek [(-121.9244,37.614),(-121.9238,37.608)] +Mistflower Ave [(-122.0195,37.329),(-122.0199,37.323)] +Mitchell Ave [(-122.1438,37.376),(-122.1439,37.374)] +Mitchell St [(-122.2257,37.844),(-122.2249,37.852)] +Moccasin St [(-122.0302,37.085),(-122.0297,37.078)] +Mocine Ave [(-122.0751,37.497),(-122.0748,37.476)] +Mockingbird Lane [(-122.0862,37.419),(-122.0861,37.412)] +Mohr Ave [(-121.8495,37.819),(-121.8618,37.818)] +Mohr Ave [(-121.877,37.819),(-121.8793,37.816),(-121.8799,37.819)] +Mohr Dr [(-122.1132,37.466),(-122.113,37.46)] +Molaka Cir [(-122.0476,37.863),(-122.0479,37.871)] +Monaco Ave [(-122.0024,37.966),(-122.0023,37.967)] +Monaco Ct [(-121.8762,37.544),(-121.8766,37.538)] +Monika Lane [(-122.051987,37.88553),(-122.052536,37.88171)] +Montcalm Ave [(-122.0394,37.373),(-122.04,37.369)] +Monte Vista Dr [(-122.1127,37.4),(-122.1126,37.388)] +Montecito Ave [(-122.2602,37.114),(-122.2589,37.122)] +Montecito Cir [(-121.789,37.97),(-121.7883,37.967),(-121.7867,37.962)] +Montecito Cir [(-121.789,37.97),(-121.78927,37.9709)] +Montecito Dr [(-121.9899,37.743),(-121.9892,37.762)] +Montego Bay [(-122.2491,37.389),(-122.2485,37.396)] +Monterey Ave [(-122.2793,37.863),(-122.2799,37.857)] +Monterey Blvd [(-122.1494,37.018),(-122.1486,37.013)] +Monterey Blvd [(-122.189,37.987),(-122.1891,37.971)] +Monterey Blvd [(-122.1931,37.068),(-122.1918,37.051)] +Monterey Blvd [(-122.1971,37.103),(-122.1961,37.096)] +Monterey Blvd [(-122.2029,37.167),(-122.2012,37.146)] +Monterey Dr [(-121.909595,37.12732),(-121.910168,37.15444)] +Montgomery Ave [(-122.0971,37.824),(-122.0955,37.811)] +Montgomery Ave [(-122.0989,37.838),(-122.0977,37.829)] +Montgomery St [(-122.0882,37.738),(-122.0875,37.727)] +Montgomery St [(-122.2489,37.316),(-122.2471,37.33)] +Montgomery St [(-122.2518,37.292),(-122.2504,37.305)] +Monticello Ave [(-122.2,37.771),(-122.199,37.778)] +Monticello St [(-122.0561,37.37),(-122.0554,37.374)] +Mooney Ave [(-122.1234,37.972),(-122.1234,37.978)] +Moonflower Way [(-121.7297,37.075),(-121.7322,37.071)] +Moore Dr [(-122.1901,37.335),(-122.1884,37.351)] +Moores Ave [(-122.0087,37.301),(-122.0094,37.292)] +Moores Ave [(-122.0098,37.287),(-122.0102,37.281)] +Moores Ave [(-122.0138,37.237),(-122.014,37.233)] +Morada Ct [(-121.93541,37.49248),(-121.935229,37.49155)] +Moraga Ave [(-122.2096,37.265),(-122.2088,37.254)] +Moraga Ave [(-122.225,37.3),(-122.2243,37.3)] +Moraga Ave [(-122.2447,37.288),(-122.2423,37.302)] +Moraga Dr [(-121.7915,37.701),(-121.7906,37.705)] +Morcom Pl [(-122.1901,37.826),(-122.1897,37.829)] +Moreland Dr [(-122.0802,37.11),(-122.0793,37.109)] +Morengo Way [(-121.9209,37.837),(-121.9203,37.84)] +Mound St [(-122.2346,37.582),(-122.2339,37.588)] +Mound St [(-122.2402,37.531),(-122.2395,37.537)] +Mount Hamilton Ct [(-122.030097,37.11348),(-122.030412,37.11049)] +Mountain Ave [(-122.2267,37.24),(-122.2261,37.231)] +Mountain Ave [(-122.2291,37.256),(-122.2288,37.257)] +Mountain Blvd [(-122.151,37.659),(-122.1484,37.64)] +Mountain Blvd [(-122.1535,37.702),(-122.153,37.696)] +Mountain Blvd [(-122.1765,37.857),(-122.177,37.85)] +Mountain Blvd [(-122.1774,37.889),(-122.1771,37.887)] +Mountain Blvd [(-122.1789,37.934),(-122.1787,37.93)] +Mountain Blvd [(-122.2013,37.164),(-122.2004,37.15)] +Mountain Blvd [(-122.2085,37.261),(-122.2088,37.254)] +Mountain Blvd [(-122.211,37.308),(-122.2102,37.297)] +Mountain Blvd [(-122.222,37.435),(-122.2204,37.436)] +Mountain Blvd [(-122.2261,37.465),(-122.2241,37.451)] +Mountaingate Way [(-122.1999,37.198),(-122.1994,37.193)] +Mowry Ave [(-121.9745,37.659),(-121.975803,37.65155)] +Mowry Ave [(-121.976381,37.64822),(-121.9769,37.646)] +Mowry Ave [(-121.9807,37.567),(-121.9809,37.565)] +Mowry Ave [(-121.9825,37.547),(-121.9838,37.532)] +Mowry Ave [(-121.9896,37.459),(-121.9904,37.449)] +Mowry Ave [(-122.0074,37.245),(-122.008,37.236)] +Mowry Ave [(-122.0113,37.158),(-122.0129,37.124)] +Mowry Slough [(-122.0393,37.918),(-122.0552,37.908)] +Msn Creek Dr [(-121.9354,37.428),(-121.9344,37.427)] +Mtn House Road [(-121.576862,37.78355),(-121.576389,37.80422)] +Mtn House Road [(-121.579578,37.73807),(-121.578037,37.75356)] +Mtn House Creek [(-121.558979,37.69672),(-121.558765,37.69123),(-121.564396,37.65095)] +Mtn House Creek [(-121.570759,37.60189),(-121.566196,37.63889)] +Mtn House Creek [(-121.577,37.50431),(-121.578144,37.49554)] +Muir St [(-122.0761,37.529),(-122.0756,37.524)] +Muir St [(-122.0787,37.562),(-122.0779,37.553)] +Muirwood Dr [(-121.9162,37.824),(-121.9168,37.831)] +Mulberry Pl [(-121.9221,37.234),(-121.9225,37.232)] +Mulberry Pl [(-121.9238,37.249),(-121.9249,37.261)] +Mulberry St [(-122.0363,37.332),(-122.034,37.32)] +Murcia St [(-122.076,37.235),(-122.0758,37.23)] +Murdell Lane [(-121.7977,37.619),(-121.797719,37.60774)] +Murdell Lane [(-121.8001,37.746),(-121.7998,37.741)] +Murdock Ct [(-122.1828,37.753),(-122.1832,37.756)] +Murray St [(-122.2885,37.513),(-122.288,37.514)] +Murrieta Blvd [(-121.7825,37.758),(-121.7816,37.758)] +Murrieta Blvd [(-121.7847,37.94),(-121.7842,37.942)] +Murrieta Blvd [(-121.7864,37.791),(-121.7866,37.797)] +Murrieta Blvd [(-121.7865,37.934),(-121.7858,37.936)] +Murrieta Blvd [(-121.788409,37.80906),(-121.7885,37.815)] +Myers St [(-122.1511,37.423),(-122.151,37.415)] +Myra Ct [(-122.108083,37.47375),(-122.108278,37.47677)] +Myrtle St [(-122.0924,37.685),(-122.0919,37.676)] +Myrtle St [(-122.2812,37.092),(-122.2805,37.108)] +N St [(-121.7737,37.824),(-121.7739,37.829)] +Nandina Ct [(-121.9274,37.299),(-121.9281,37.297)] +Nansa Ct [(-121.9188,37.259),(-121.918711,37.25453)] +Natalie Ave [(-121.9792,37.307),(-121.9799,37.296)] +National Ave [(-122.1192,37.5),(-122.1281,37.489)] +Navajo Ct [(-121.8779,37.901),(-121.8783,37.9)] +Navy Roadway [(-122.3093,37.092),(-122.3123,37.109)] +Neal St [(-121.8692,37.577),(-121.8683,37.574)] +Nelson Ct [(-121.864163,37.4684),(-121.86436,37.4745)] +Nelson Pl [(-122.0366,37.522),(-122.0368,37.519)] +Nelson St [(-121.9822,37.362),(-121.9846,37.348)] +Neptune Dr [(-122.1878,37.989),(-122.1853,37.958)] +Neptune Dr [(-122.1881,37.032),(-122.1875,37.007)] +Neptune Road [(-121.7885,37.607),(-121.7885,37.599)] +Nevada St [(-122.0313,37.891),(-122.0317,37.882)] +Nevada St [(-122.1821,37.37),(-122.1815,37.376)] +New England Village Dr [(-122.058,37.237),(-122.0585,37.235)] +Newark Blvd [(-122.0329,37.398),(-122.032,37.382)] +Newark Blvd [(-122.0352,37.438),(-122.0341,37.423)] +Newberry St [(-122.2671,37.568),(-122.2668,37.554)] +Newcastle Lane [(-121.918,37.167),(-121.9191,37.182)] +Newport St [(-122.1059,37.328),(-122.1054,37.315)] +Nicol Ave [(-122.2174,37.943),(-122.2164,37.94)] +Nicolet Ave [(-122.0174,37.696),(-122.0183,37.693)] +Nicolet Ave [(-122.0238,37.615),(-122.0238,37.61)] +Nicolet Ave [(-122.0264,37.574),(-122.0269,37.567)] +Nicolet Ct [(-122.0242,37.641),(-122.0236,37.638)] +Nielsen Lane [(-121.744,37.777),(-121.744,37.77)] +Niles Blvd [(-121.9933,37.803),(-121.9929,37.803)] +Niles Canyon Road [(-121.881448,37.92865),(-121.8812,37.929)] +Niles Canyon Road [(-121.8954,37.94),(-121.89496,37.93963)] +Niles Canyon Road [(-121.909,37.94),(-121.9034,37.957)] +Niles Canyon Road [(-121.9292,37.955),(-121.925931,37.9815)] +Niles Canyon Road [(-121.9333,37.913),(-121.9317,37.919)] +Niles Canyon Road [(-121.9352,37.912),(-121.9346,37.91)] +Nobhill Ct [(-122.0354,37.523),(-122.0353,37.517)] +Norbridge Ave [(-122.084,37.911),(-122.0829,37.911)] +Norene Way [(-122.1365,37.286),(-122.136,37.287)] +Norfolk Road [(-122.2936,37.877),(-122.2937,37.859)] +Norfolk Road [(-122.2937,37.848),(-122.2941,37.845)] +Noria Ct [(-121.9319,37.288),(-121.9324,37.286)] +Norissa Cir [(-122.0486,37.763),(-122.0484,37.77)] +Normandie Ave [(-122.1902,37.783),(-122.1886,37.768)] +Normandy Ct [(-122.0629,37.971),(-122.063,37.968)] +Normandy Dr [(-122.0501,37.457),(-122.0506,37.451)] +Norris Canyon Road [(-122.015,37.545),(-122.0103,37.541)] +Norris Canyon Road [(-122.0329,37.332),(-122.0278,37.371)] +North Blvd [(-122.1768,37.243),(-122.1775,37.242)] +North Hill Ct [(-122.231,37.533),(-122.2325,37.541)] +Northland Ter [(-122.059106,37.55559),(-122.05922,37.55498)] +Northrup St [(-122.2141,37.371),(-122.215,37.381)] +Northvale Road [(-122.2361,37.088),(-122.2335,37.083)] +Northview Dr [(-122.0504,37.887),(-122.0511,37.892)] +Northway Road [(-121.8857,37.748),(-121.8871,37.75)] +Northwood Dr [(-122.2299,37.64),(-122.2291,37.638)] +Northwood Dr [(-122.2317,37.629),(-122.2311,37.637)] +Northwood Com [(-121.7885,37.815),(-121.788231,37.80962)] +Norton Ave [(-122.1977,37.967),(-122.196855,37.97165)] +Norwood Pl [(-121.7807,37.534),(-121.7811,37.534)] +Nottingham Ct [(-122.0297,37.528),(-122.0303,37.522)] +Nova Dr [(-122.2397,37.213),(-122.2394,37.214)] +Novara Road [(-122.2377,37.47),(-122.2368,37.472)] +Novato St [(-122.0628,37.731),(-122.0633,37.723)] +Nula Way [(-122.0553,37.865),(-122.0552,37.855)] +Nursery Ave [(-121.9897,37.802),(-121.9901,37.795)] +O Connell Lane [(-121.9941,37.985),(-121.9917,37.974)] +O Connell Lane [(-122.00235,37.9875),(-121.9964,37.995)] +O Connell Lane [(-122.0038,37.972),(-122.0036,37.975)] +Oak St [(-122.2383,37.713),(-122.238,37.719)] +Oak St [(-122.2437,37.636),(-122.2431,37.644)] +Oak St [(-122.265,37.877),(-122.264,37.879)] +Oak St [(-122.2653,37.967),(-122.2649,37.974)] +Oak St [(-122.2666,37.947),(-122.2664,37.95)] +Oak Creek Ct [(-121.9153,37.737),(-121.9171,37.735)] +Oak Hill Road [(-122.1409,37.647),(-122.1382,37.658)] +Oak Knoll Blvd [(-122.151,37.559),(-122.1504,37.556)] +Oakbrook Ct [(-121.865488,37.96653),(-121.8661,37.965)] +Oakdale St [(-122.0648,37.767),(-122.0654,37.761)] +Oakes Blvd [(-122.1523,37.316),(-122.1511,37.318)] +Oakes Dr [(-122.034734,37.62423),(-122.0329,37.618)] +Oakland Ave [(-121.8703,37.85305),(-121.8703,37.866)] +Oakland Ave [(-122.2332,37.258),(-122.2319,37.262)] +Oakland Ave [(-122.24,37.235),(-122.2393,37.237),(-122.2387,37.24)] +Oakland Ave [(-122.2529,37.197),(-122.2521,37.203)] +Oakland Ave [(-122.2583,37.162),(-122.2569,37.167)] +Oakland Inner Harbor [(-122.2625,37.913),(-122.260016,37.89484)] +Oakmont Ave [(-122.231698,37.17113),(-122.2321,37.168)] +Oakport St [(-122.1975,37.422),(-122.1963,37.386)] +Oakport St [(-122.2123,37.59),(-122.2117,37.585)] +Oakridge Road [(-121.7646,37.841),(-121.768787,37.84142)] +Oakridge Road [(-121.8182,37.93),(-121.8207,37.931)] +Oakridge Road [(-121.8316,37.049),(-121.828382,37)] +Oakview Dr [(-122.2079,37.123),(-122.2074,37.116)] +Oakwood Dr [(-122.1989,37.424),(-122.198,37.437)] +Ocaso Camino [(-121.9293,37.261),(-121.9303,37.252)] +Occidental Road [(-122.1102,37.403),(-122.110496,37.40277)] +Ocie Way [(-122.0966,37.605),(-122.097,37.603)] +Octavia St [(-122.2026,37.906),(-122.2013,37.906)] +Ogden Dr [(-121.978963,37.36863),(-121.9808,37.368)] +Olazaba Ter [(-121.9176,37.247),(-121.917664,37.24323)] +Old Bernal Ave [(-121.879084,37.58027),(-121.878944,37.57993)] +Old Canyon Road [(-121.965,37.794),(-121.963,37.8)] +Old Santa Rita Road [(-121.877505,37.9429),(-121.8776,37.96)] +Old Tower Road [(-121.7722,37.729),(-121.7704,37.729)] +Old Warm Springs Blvd [(-121.9482,37.092),(-121.9473,37.084)] +Oleander Ave [(-122.2338,37.296),(-122.2346,37.295)] +Oleander Ave [(-122.2358,37.302),(-122.236192,37.30424)] +Oleander St [(-121.7471,37.126),(-121.7459,37.129)] +Olive Ave [(-121.9326,37.36),(-121.9333,37.356)] +Olive Ave [(-121.9458,37.34),(-121.9493,37.337)] +Olive Ave [(-122.2462,37.219),(-122.2451,37.202)] +Oliver Way [(-121.9665,37.739),(-121.966295,37.73644)] +Olivina Ave [(-121.7791,37.829),(-121.7787,37.829)] +Olympic Ct [(-122.0509,37.321),(-122.0518,37.31)] +Olympus Ave [(-122.2512,37.834),(-122.2502,37.818)] +Omak St [(-121.9209,37.064),(-121.9209,37.071)] +Omar St [(-121.9719,37.221),(-121.9724,37.222)] +Omar St [(-121.9825,37.255),(-121.9831,37.259)] +Omega Ave [(-122.0678,37.988),(-122.0664,37.989)] +Oneil Ave [(-122.073989,37.5886),(-122.073631,37.58413)] +Oneil Ave [(-122.076754,37.62476),(-122.0745,37.595)] +Onondaga Dr [(-121.9288,37.054),(-121.9282,37.048)] +Onondaga Dr [(-121.9312,37.054),(-121.93,37.058)] +Opal Way [(-121.7984,37.679),(-121.7975,37.679)] +Orange Ave [(-122.0787,37.867),(-122.0789,37.842)] +Orchard Ave [(-122.0858,37.555),(-122.0833,37.551)] +Orchard Lane [(-122.2475,37.694),(-122.2467,37.692)] +Orchid Dr [(-122.1416,37.098),(-122.1397,37.085)] +Oregon St [(-122.2589,37.588),(-122.2565,37.591)] +Oregon St [(-122.2794,37.561),(-122.2789,37.562)] +Orin Dr [(-122.2623,37.133),(-122.2626,37.142)] +Oriole Ave [(-121.7879,37.827),(-121.7879,37.851)] +Oriole Ave [(-122.1209,37.051),(-122.1205,37.071)] +Orleans Dr [(-122.046,37.393),(-122.0464,37.383)] +Orleans Dr [(-122.0473,37.438),(-122.0463,37.412)] +Orloff Dr [(-121.8659,37.767),(-121.865,37.765)] +Orloff Dr [(-121.8677,37.768),(-121.8669,37.768)] +Osgood Road [(-121.9371,37.071),(-121.9363,37.06)] +Osgood Road [(-121.949,37.262),(-121.946,37.208)] +Ostrander Road [(-122.2364,37.413),(-122.2356,37.429)] +Otis Dr [(-122.2564,37.619),(-122.256,37.618)] +Otis Dr [(-122.2605,37.627),(-122.2593,37.625)] +Outlook Ave [(-122.1616,37.636),(-122.1612,37.632)] +Outlook Ave [(-122.168,37.698),(-122.1678,37.697)] +Outlook Ave [(-122.1743,37.75),(-122.1736,37.746)] +Outlook Ave [(-122.1789,37.788),(-122.1786,37.787)] +Outrigger Dr [(-122.1802,37.95),(-122.178449,37.9197)] +Overacker Ave [(-121.9617,37.652),(-121.9614,37.648),(-121.9607,37.643)] +Owl Ct [(-121.91654,37.19636),(-121.915693,37.19031)] +Oxford Pl [(-121.7752,37.532),(-121.7747,37.535)] +Oxford St [(-122.2651,37.702),(-122.2651,37.699)] +Oxford St [(-122.2657,37.742),(-122.2656,37.734)] +Oyster Pond Road [(-122.2408,37.407),(-122.2404,37.403)] +Oyster Shoals [(-122.2372,37.394),(-122.2365,37.393)] +Pacific Ave [(-121.754552,37.76177),(-121.753824,37.76164)] +Pacific Ave [(-122.1632,37.171),(-122.1621,37.156),(-122.1613,37.15)] +Pacific Ave [(-122.1661,37.214),(-122.1654,37.204)] +Pacific Ave [(-122.2419,37.683),(-122.2408,37.678)] +Pacific Ave [(-122.2535,37.735),(-122.2527,37.731)] +Pacific St [(-122.0342,37.962),(-122.0371,37.962)] +Pacific St [(-122.0544,37.294),(-122.0548,37.297)] +Packet Landing Road [(-122.2376,37.471),(-122.2372,37.458)] +Pagano Ct [(-122.1371,37.959),(-122.1379,37.954)] +Pala Ave [(-122.2328,37.28),(-122.2319,37.283)] +Palatka Lane [(-122.0915,37.35),(-122.0927,37.354)] +Palm Ave [(-121.932,37.329),(-121.9319,37.319)] +Palm Dr [(-122.0503,37.898),(-122.0501,37.897)] +Palm Dr [(-122.052051,37.88751),(-122.0519,37.885)] +Palmer Dr [(-121.86601,37.85873),(-121.865793,37.84778)] +Palmer Dr [(-122.003005,37.52852),(-122.0026,37.527)] +Palmetto Dr [(-122.0189,37.111),(-122.018,37.106)] +Palo Verde Road [(-122.0242,37.959),(-122.023,37.955),(-122.0222,37.961)] +Paloma Ave [(-122.2347,37.126),(-122.2353,37.136)] +Palomares Road [(-121.9404,37.123),(-121.9407,37.11)] +Palomares Road [(-121.9501,37.318),(-121.948,37.304)] +Palomares Road [(-121.9683,37.439),(-121.9686,37.436)] +Palomares Road [(-121.9976,37.676),(-121.997,37.674)] +Palomares Road [(-122.0191,37.873),(-122.0056,37.744)] +Palomino Dr [(-121.8536,37.59),(-121.852,37.589)] +Pampas Ave [(-122.188335,37.87635),(-122.1878,37.872)] +Panda Way [(-122.0668,37.773),(-122.0662,37.762)] +Panitz St [(-122.0553,37.686),(-122.0553,37.679)] +Panorama Trl [(-121.8996,37.291),(-121.9098,37.262)] +Panorama Trl [(-121.9023,37.342),(-121.8995,37.303)] +Panorama Trl [(-121.9096,37.37),(-121.9098,37.371)] +Panorama Trl [(-121.9148,37.366),(-121.9141,37.356)] +Panoramic Way [(-122.2454,37.695),(-122.2436,37.688)] +Papago St [(-121.9155,37.826),(-121.9147,37.811)] +Parada St [(-121.9949,37.166),(-121.9931,37.153)] +Pardee Ave [(-121.9885,37.367),(-121.9893,37.359)] +Pardee Dr [(-122.1991,37.286),(-122.1974,37.27)] +Parish Ct [(-122.236048,37.33387),(-122.235406,37.3307)] +Park Ave [(-122.2407,37.634),(-122.2404,37.638)] +Park Ave [(-122.242,37.616),(-122.2416,37.621)] +Park Ave [(-122.2461,37.565),(-122.2443,37.589)] +Park Ave [(-122.2841,37.316),(-122.2851,37.314)] +Park Blvd [(-122.2058,37.222),(-122.2047,37.23)] +Park Blvd [(-122.218,37.087),(-122.2173,37.091)] +Park Blvd [(-122.2312,37.051),(-122.2303,37.049)] +Park Blvd [(-122.2387,37.027),(-122.2377,37.028),(-122.2362,37.031)] +Park Blvd [(-122.2461,37.013),(-122.2457,37.013)] +Park Lane [(-122.2309,37.163),(-122.2313,37.166)] +Park St [(-121.7711,37.86),(-121.7699,37.863)] +Park St [(-122.2377,37.686),(-122.237,37.695)] +Park St [(-122.2491,37.541),(-122.247562,37.56407)] +Park St [(-122.2825,37.544),(-122.282424,37.5421)] +Park Way [(-122.0875,37.97),(-122.087418,37.96824)] +Park Way [(-122.2339,37.288),(-122.2332,37.288)] +Park Way [(-122.2366,37.289),(-122.2357,37.288)] +Park Way [(-122.3038,37.798),(-122.3031,37.8)] +Park Blvd Way [(-122.2303,37.049),(-122.2287,37.049)] +Park Center Lane [(-121.9793,37.431),(-121.9798,37.425)] +Parker Ave [(-122.1647,37.685),(-122.1643,37.686)] +Parker Road [(-122.0876,37.181),(-122.0859,37.17)] +Parker St [(-122.2664,37.623),(-122.2643,37.626)] +Parkmeadow Dr [(-121.9319,37.062),(-121.9322,37.066)] +Parkmeadow Dr [(-121.9324,37.099),(-121.9317,37.104)] +Parkridge Dr [(-122.1438,37.884),(-122.1428,37.9)] +Parkside Dr [(-121.886474,37.83325),(-121.8863,37.834)] +Parkside Dr [(-121.8925,37.806),(-121.8916,37.809)] +Parkside Dr [(-121.895065,37.79588),(-121.8949,37.797)] +Parkside Dr [(-121.9836,37.598),(-121.9851,37.594),(-121.9861,37.592)] +Parkside Dr [(-122.0475,37.603),(-122.0443,37.596)] +Parkside Dr [(-122.0595,37.008),(-122.0592,37.012)] +Parkview Road [(-122.0548,37.023),(-122.0548,37.02)] +Parnassus Road [(-122.2525,37.814),(-122.2518,37.814)] +Parsons Ct [(-122.082,37.056),(-122.0812,37.053)] +Partridge Ave [(-122.1597,37.655),(-122.1584,37.652)] +Partridge Com [(-121.7876,37.877),(-121.7876,37.882)] +Paru St [(-122.2583,37.712),(-122.2574,37.725)] +Paru St [(-122.2601,37.687),(-122.2594,37.695)] +Pasatiempo St [(-121.7252,37.262),(-121.7252,37.27)] +Paseo del Cajon [(-121.8901,37.699),(-121.889101,37.68411)] +Paseo del Rio [(-122.1309,37.842),(-122.1332,37.836),(-122.134,37.835)] +Paseo Grande [(-122.1197,37.83),(-122.1204,37.826)] +Paseo Grande [(-122.1231,37.812),(-122.1234,37.809)] +Paseo Largavista [(-122.1287,37.822),(-122.1281,37.811)] +Paseo Padre Pkwy [(-121.9143,37.005),(-121.913522,37)] +Paseo Padre Pkwy [(-121.9188,37.004),(-121.9177,37.004)] +Paseo Padre Pkwy [(-121.9292,37.083),(-121.9295,37.088)] +Paseo Padre Pkwy [(-121.9302,37.137),(-121.9298,37.146)] +Paseo Padre Pkwy [(-121.9357,37.342),(-121.9327,37.318)] +Paseo Padre Pkwy [(-121.9594,37.433),(-121.9569,37.419)] +Paseo Padre Pkwy [(-121.960768,37.44248),(-121.9599,37.437)] +Paseo Padre Pkwy [(-121.9643,37.462),(-121.9618,37.449)] +Paseo Padre Pkwy [(-121.9885,37.578),(-121.9877,37.574)] +Paseo Padre Pkwy [(-122.0021,37.639),(-121.996,37.628)] +Paseo Padre Pkwy [(-122.0332,37.819),(-122.0307,37.809)] +Paseo Padre Pkwy [(-122.0414,37.734),(-122.0445,37.708)] +Paseo Padre Pkwy [(-122.045898,37.70023),(-122.047,37.695)] +Paseo Padre Pkwy [(-122.049,37.684),(-122.05,37.67999)] +Paseo Padre Pkwy [(-122.051153,37.67586),(-122.0517,37.674)] +Paseo Santa Cruz [(-121.9052,37.65),(-121.904,37.65)] +Paseo Santa Cruz [(-121.906145,37.66172),(-121.905945,37.65817)] +Patterson Pass Road [(-121.556654,37.14753),(-121.556,37.148)] +Patterson Pass Road [(-121.574131,37.07538),(-121.573093,37.09003)] +Patterson Ranch Road [(-122.0702,37.545),(-122.0855,37.509),(-122.0902,37.515)] +Paxton Ct [(-122.0092,37.388),(-122.0101,37.378)] +Payne Ct [(-121.9133,37.841),(-121.9139,37.84)] +Peach Ct [(-122.0477,37.295),(-122.0473,37.293)] +Peach St [(-122.2339,37.527),(-122.2334,37.532),(-122.2328,37.537)] +Peach St [(-122.2352,37.502),(-122.2354,37.514)] +Peachtree Ave [(-122.0511,37.277),(-122.0517,37.275)] +Peachtree Dr [(-122.091,37.209),(-122.0913,37.199)] +Pearl St [(-122.2319,37.672),(-122.2316,37.676)] +Pearl St [(-122.2337,37.651),(-122.2329,37.661)] +Pearl St [(-122.2383,37.594),(-122.2366,37.615)] +Pearl St [(-122.2551,37.179),(-122.2546,37.174)] +Peary Ct [(-121.769,37.711),(-121.7686,37.706)] +Pecan Ct [(-121.9126,37.743),(-121.9142,37.739)] +Peladeau St [(-122.2888,37.383),(-122.2889,37.386)] +Pelican Ct [(-121.7907,37.839),(-121.7902,37.832)] +Penniman Ave [(-122.2018,37.863),(-122.2012,37.856)] +Pennsylvania Ave [(-121.9854,37.532),(-121.9862,37.523)] +Peony Ct [(-121.9798,37.204),(-121.9804,37.198)] +Pepperdine St [(-122.1501,37.989),(-122.1488,37.98)] +Peppertree Ct [(-121.9416,37.16),(-121.9412,37.163)] +Peppertree Road [(-121.9421,37.127),(-121.94222,37.1302)] +Peralta Ave [(-122.1585,37.293),(-122.1592,37.29)] +Peralta Ave [(-122.1639,37.267),(-122.1653,37.27)] +Peralta Blvd [(-121.9856,37.63),(-121.9867,37.627)] +Peralta Blvd [(-122.0022,37.595),(-122.0045,37.591)] +Peralta Blvd [(-122.0073,37.573),(-122.0082,37.562)] +Peralta St [(-122.2832,37.243),(-122.2829,37.246)] +Peralta St [(-122.2933,37.113),(-122.2926,37.116)] +Peralta St [(-122.2943,37.103),(-122.2937,37.111)] +Peralta St [(-122.2974,37.061),(-122.2973,37.063)] +Peridot Dr [(-121.8024,37.648),(-121.8024,37.645)] +Periwinkle Road [(-122.0451,37.301),(-122.044758,37.29844)] +Perkins St [(-122.0185,37.617),(-122.0177,37.613)] +Perkins St [(-122.2553,37.105),(-122.2557,37.096)] +Perlata Creek [(-122.2027,37.941),(-122.2031,37.936)] +Perlata Creek [(-122.2059,37.92),(-122.2092,37.906)] +Perlata Creek [(-122.2133,37.891),(-122.214,37.885)] +Perlata Creek [(-122.2158,37.753),(-122.2155,37.739)] +Perlata Creek [(-122.21853,37.83163),(-122.2188,37.826)] +Perry Road [(-122.0265,37.846),(-122.0256,37.844)] +Pershing Dr [(-122.1618,37.278),(-122.1613,37.271),(-122.1609,37.266)] +Pershing Dr [(-122.1633,37.299),(-122.1628,37.291)] +Pershing Dr [(-122.165,37.321),(-122.1645,37.315)] +Pershing Dr [(-122.1662,37.339),(-122.1658,37.333)] +Pestana Pl [(-121.7578,37.84),(-121.757776,37.84644)] +Peterman Ave [(-122.0945,37.392),(-122.0918,37.421)] +Peters Ave [(-121.8769,37.6),(-121.8763,37.608)] +Peters St [(-122.1287,37.068),(-122.128,37.073)] +Peterson St [(-122.232,37.733),(-122.2316,37.739)] +Peterson Way [(-122.0967,37.162),(-122.0952,37.159)] +Petroleum St [(-122.3168,37.13),(-122.3177,37.13)] +Petronave Dr [(-121.8344,37.469),(-121.83751,37.55738)] +Pickering Ave [(-121.9596,37.722),(-121.958868,37.72618)] +Pickering Ave [(-121.964,37.698),(-121.9637,37.7)] +Pico Road [(-121.9165,37.524),(-121.9177,37.505)] +Piedmont Ave [(-122.2511,37.644),(-122.251,37.624)] +Piedmont Ave [(-122.2527,37.263),(-122.2521,37.268)] +Piedmont Cres [(-122.2513,37.671),(-122.2503,37.661)] +Pierce Ave [(-122.1683,37.186),(-122.1672,37.168)] +Pierce St [(-122.3045,37.891),(-122.3042,37.884)] +Pike Ct [(-121.9219,37.08),(-121.9224,37.079)] +Pimlico Dr [(-121.8616,37.998),(-121.8618,37.008)] +Pine St [(-121.7758,37.902),(-121.7746,37.906)] +Pine St [(-121.7784,37.894),(-121.7776,37.897)] +Pine St [(-121.7869,37.882),(-121.7864,37.883)] +Pine St [(-121.9216,37.243),(-121.9226,37.235)] +Pine St [(-122.303,37.074),(-122.3026,37.084)] +Pine St [(-122.3034,37.063),(-122.3032,37.069)] +Pine Needle Dr [(-122.2127,37.478),(-122.2125,37.473)] +Pinewood Road [(-122.2219,37.424),(-122.2211,37.429)] +Pinto Ct [(-122.0228,37.08),(-122.0224,37.073)] +Piper St [(-122.216,37.39),(-122.2155,37.385)] +Pippin St [(-122.1747,37.344),(-122.1734,37.332)] +Pizarro Dr [(-122.025,37.556),(-122.026,37.544)] +Placer Way [(-121.9789,37.415),(-121.9769,37.407)] +Plata Way [(-121.9402,37.066),(-121.9394,37.069)] +Pleasant Way [(-122.1653,37.311),(-122.1646,37.302)] +Pleasant Hill Road [(-121.9264,37.854),(-121.9268,37.86)] +Pleasant Valley Ct [(-122.2455,37.298),(-122.2439,37.305)] +Pleasanton Ave [(-121.8782,37.636),(-121.8784,37.63)] +Pleasanton Ave [(-121.8819,37.586),(-121.882761,37.5753)] +Pleasanton Canal [(-121.886052,37.82228),(-121.8833,37.835)] +Pleasanton Sunol Road [(-121.8765,37.987),(-121.8775,37.982)] +Pleasanton Sunol Road [(-121.8851,37.39),(-121.8858,37.387)] +Pleitner Ave [(-122.2098,37.946),(-122.2094,37.953)] +Plomosa Road [(-121.9106,37.703),(-121.9102,37.696)] +Plummer Creek [(-122.0778,37.095),(-122.0852,37.069)] +Plymouth Ave [(-121.9369,37.422),(-121.9378,37.424)] +Plymouth Dr [(-122.0798,37.132),(-122.0802,37.11)] +Plymouth St [(-122.1643,37.425),(-122.1641,37.418)] +Plymouth St [(-122.1661,37.454),(-122.1652,37.44)] +Plymouth St [(-122.1763,37.593),(-122.1758,37.586)] +Poda Ct [(-121.9321,37.308),(-121.9315,37.312)] +Poinciana Pl [(-121.9946,37.341),(-121.994,37.337)] +Point Eden Way [(-122.1208,37.255),(-122.1262,37.256)] +Polaris Ave [(-122.064185,37.84562),(-122.0647,37.84)] +Polk Way [(-121.745,37.867),(-121.745,37.858)] +Polvorosa Ct [(-122.0178,37.594),(-122.0174,37.591)] +Pomar Vista Ave [(-122.0989,37.958),(-122.0973,37.969)] +Pomona Way [(-121.743614,37.84357),(-121.7427,37.839)] +Ponderosa Dr [(-121.749629,37.12363),(-121.74967,37.11779)] +Pontiac St [(-122.165,37.365),(-122.1647,37.359),(-122.1643,37.354)] +Pontiac St [(-122.1665,37.383),(-122.166309,37.3779)] +Poplar Ave [(-122.1018,37.704),(-122.098,37.721)] +Poplar Path [(-122.2678,37.968),(-122.2687,37.967)] +Port Sailwood Dr [(-122.0261,37.467),(-122.0265,37.463)] +Portage Road [(-121.9241,37.092),(-121.9257,37.109)] +Portal Ave [(-122.2281,37.148),(-122.2282,37.157)] +Portland Ave [(-122.2861,37.949),(-122.2858,37.949)] +Portland Ave [(-122.2945,37.945),(-122.2937,37.946)] +Portofino Cir [(-122.123984,37.08583),(-122.124375,37.08809)] +Portola Ave [(-121.7822,37.948),(-121.7806,37.94),(-121.7794,37.935)] +Portola Ave [(-122.2723,37.696),(-122.2713,37.691)] +Portola Dr [(-122.019284,37.56839),(-122.0199,37.563)] +Portola Dr [(-122.1482,37.024),(-122.1488,37.021)] +Portola Dr [(-122.1505,37.019),(-122.1516,37.016)] +Portsmouth Ave [(-122.1023,37.262),(-122.1013,37.254)] +Portsmouth Ave [(-122.1064,37.315),(-122.1064,37.308)] +Portwood Ave [(-122.2322,37.76),(-122.2317,37.765)] +Posen Ave [(-122.2828,37.848),(-122.2822,37.85)] +Posey Loop [(-122.276,37.854),(-122.276,37.859)] +Potawatami Dr [(-121.9238,37.063),(-121.924,37.056)] +Powell St [(-122.2926,37.388),(-122.2937,37.387)] +Powell St [(-122.3101,37.375),(-122.3108,37.375)] +Prairie Dr [(-121.9124,37.667),(-121.9123,37.664)] +Prarie Dr [(-121.9102,37.652),(-121.910115,37.65226)] +Preda St [(-122.1686,37.244),(-122.1691,37.255)] +Presley Way [(-122.2461,37.462),(-122.2462,37.465)] +Preston Ct [(-121.733536,37.01447),(-121.733204,37.00955)] +Preston Ct [(-121.9666,37.659),(-121.9652,37.668)] +Prestwick Ave [(-122.0369,37.208),(-122.0363,37.202)] +Prince Dr [(-121.9164,37.155),(-121.9185,37.145)] +Prince St [(-122.2582,37.541),(-122.2568,37.543)] +Prince St [(-122.2723,37.524),(-122.2713,37.525)] +Prince St [(-122.2802,37.512),(-122.2794,37.514)] +Princeton Ter [(-121.977476,37.61102),(-121.977871,37.61066)] +Princeton Way [(-121.75,37.814),(-121.7472,37.814)] +Proctor Ave [(-122.2222,37.364),(-122.2217,37.36)] +Proctor Ave [(-122.2267,37.406),(-122.2251,37.386)] +Proctor Road [(-122.0671,37.192),(-122.067,37.2)] +Proctor Road [(-122.0761,37.177),(-122.073739,37.1724)] +Prospect St [(-122.2492,37.699),(-122.249,37.695)] +Prosperity Way [(-122.1033,37.031),(-122.1044,37.042)] +Pueblo Dr [(-122.1748,37.269),(-122.1743,37.269)] +Pueblo Creek [(-122.0958,37.203),(-122.0965,37.205)] +Pueblo Serena [(-122.0958,37.222),(-122.0958,37.203)] +Pueblo Spring [(-122.0964,37.238),(-122.0965,37.222)] +Puerto Vallarta [(-121.8719,37.54),(-121.8728,37.528)] +Pulaski Dr [(-122.0262,37.107),(-122.0254,37.1)] +Pulsar Ave [(-121.7892,37.58955),(-121.7892,37.60011)] +Purcell Pl [(-122.0249,37.718),(-122.0224,37.699)] +Purdue St [(-122.1555,37.95),(-122.1565,37.949)] +Pyramid St [(-121.768592,37.56164),(-121.768329,37.56198)] +Quail Run Road [(-122.0448,37.808),(-122.0439,37.805)] +Quebec Ave [(-122.1528,37.786),(-122.1535,37.785)] +Quebec Common [(-122.051368,37.60756),(-122.05282,37.60102)] +Queen Anne Dr [(-122.0751,37.883),(-122.077,37.865)] +Quercus Ct [(-122.0267,37.59),(-122.0269,37.572)] +Quigley Pl [(-122.1962,37.867),(-122.1957,37.861)] +Quinn Lane [(-122.066405,37.74794),(-122.066039,37.73557)] +Quintana Ct [(-121.9516,37.464),(-121.9522,37.463)] +Quintana Way [(-121.9504,37.49),(-121.9508,37.489)] +Rachelle St [(-121.7257,37.945),(-121.7257,37.932)] +Racine St [(-122.2622,37.494),(-122.2624,37.501)] +Racoon Hallow Ct [(-121.914577,37.63603),(-121.913452,37.63738)] +Radele Ct [(-122.0101,37.363),(-122.0105,37.357)] +Ragland St [(-122.109,37.877),(-122.1089,37.872)] +Railroad Ave [(-121.7661,37.841),(-121.7654,37.842)] +Railroad Ave [(-121.771533,37.82472),(-121.771,37.826)] +Railroad Ave [(-121.779215,37.79798),(-121.779265,37.79635)] +Railroad Ave [(-121.891,37.94),(-121.8924,37.941)] +Railroad Ave [(-122.0245,37.013),(-122.0234,37.003),(-122.0223,37.993)] +Railroad Ave [(-122.1835,37.394),(-122.1828,37.388)] +Rainier Ave [(-121.8009,37.803),(-121.7999,37.804)] +Ralston Com [(-121.9775,37.428),(-121.9771,37.432)] +Ramona Ave [(-122.2391,37.291),(-122.2373,37.293)] +Ramona Ave [(-122.244153,37.31499),(-122.243523,37.31109)] +Rancho Arroyo Pkwy [(-121.9932,37.785),(-121.9929,37.774),(-121.9926,37.769)] +Rancho Higuera Road [(-121.9112,37.96),(-121.9105,37.959)] +Randall Ct [(-122.0749,37.976),(-122.0756,37.968)] +Randicik Ct [(-121.863424,37.95818),(-121.863445,37.9654)] +Randy St [(-122.1517,37.809),(-122.1523,37.807)] +Ranker Pl [(-122.0725,37.4),(-122.0737,37.395)] +Ranspot Dr [(-122.0972,37.999),(-122.0959,37)] +Raymond Road [(-121.7462,37.306),(-121.7326,37.305)] +Reading Ave [(-122.0779,37.874),(-122.0735,37.875)] +Redbud Lane [(-122.0969,37.627),(-122.0978,37.627)] +Redding Pl [(-122.1919,37.843),(-122.1921,37.841)] +Redding St [(-122.191432,37.84242),(-122.1911,37.842)] +Redding St [(-122.1943,37.858),(-122.1934,37.854)] +Redding St [(-122.1978,37.901),(-122.1975,37.895)] +Redwood Ct [(-121.9142,37.69),(-121.9144,37.696)] +Redwood Road [(-122.0726,37.155),(-122.0726,37.139)] +Redwood Road [(-122.0726,37.18079),(-122.0726,37.179)] +Redwood Road [(-122.0726,37.909),(-122.0727,37.906)] +Redwood Road [(-122.0727,37.955),(-122.0727,37.948)] +Redwood Road [(-122.0736,37.393),(-122.075736,37.37634)] +Redwood Road [(-122.1493,37.98),(-122.1437,37.001)] +Redwood Road [(-122.174191,37.96191),(-122.174,37.966)] +Redwood Road [(-122.1819,37.978),(-122.1811,37.968)] +Redwood Road [(-122.1882,37.986),(-122.1877,37.986)] +Redwood Creek [(-122.1366,37.968),(-122.1302,37.918)] +Reed Ave [(-121.7581,37.516),(-121.7559,37.516)] +Regailia Ave [(-121.86701,37.62944),(-121.867052,37.62182)] +Regal Ave [(-122.0839,37.468),(-122.0857,37.449)] +Regents Blvd [(-122.0662,37.779),(-122.066625,37.77216)] +Regents Blvd [(-122.0673,37.759),(-122.0677,37.751)] +Regents Blvd [(-122.0681,37.74),(-122.068,37.73)] +Regents Blvd [(-122.068594,37.80778),(-122.0681,37.805)] +Regents Blvd [(-122.077,37.865),(-122.0761,37.862)] +Regional St [(-121.9328,37.029),(-121.9347,37.072)] +Reinhardt Dr [(-122.1831,37.922),(-122.1828,37.918)] +Renwick St [(-122.1989,37.797),(-122.1982,37.802)] +Republic Ave [(-122.1688,37.046),(-122.1721,37.032)] +Requa Road [(-122.2323,37.199),(-122.2293,37.21)] +Revere Ave [(-122.03,37.129),(-122.0287,37.129)] +Revere Ave [(-122.1347,37.359),(-122.134,37.362)] +Reyes Dr [(-122.0791,37.873),(-122.0787,37.873)] +Reynolds Dr [(-122.0036,37.671),(-122.002954,37.66809)] +Rhine Way [(-121.84112,37.58518),(-121.840944,37.56363)] +Rhododendron Dr [(-121.74419,37.09645),(-121.7445,37.105)] +Ribera Ct [(-122.0292,37.644),(-122.0286,37.641)] +Ricardo Ave [(-122.1176,37.761),(-122.1148,37.745)] +Rich Ave [(-122.0351,37.309),(-122.0354,37.303)] +Richardson Way [(-122.2263,37.224),(-122.225,37.22)] +Richmond Ave [(-121.9969,37.452),(-121.9975,37.442)] +Richmond Blvd [(-122.2584,37.211),(-122.2573,37.218)] +Richmond Blvd [(-122.2592,37.195),(-122.2587,37.201)] +Ridge Trl [(-121.8615,37.438),(-121.859211,37.42899)] +Ridge Top Road [(-122.1538,37.164),(-122.1566,37.179)] +Ridgeview Ter [(-121.970517,37.63559),(-121.970862,37.63332)] +Ridgeway Ave [(-122.2513,37.286),(-122.2518,37.292)] +Ridgeway Ave [(-122.2539,37.299),(-122.2548,37.302)] +Ridgewood Dr [(-122.051305,37.59386),(-122.053772,37.58263)] +Ridley Dr [(-121.9794,37.65),(-121.979,37.644)] +Riley Dr [(-122.2999,37.858),(-122.299,37.86)] +Rincon Ave [(-121.7824,37.828),(-121.7824,37.837)] +Rispen Dr [(-122.2342,37.621),(-122.2326,37.634)] +Riverdale Ct [(-121.9198,37.891),(-121.9201,37.893)] +Riverside Ave [(-121.9758,37.74),(-121.9764,37.725)] +Riviera Dr [(-122.0003,37.954),(-122.0003,37.957)] +Riviera Dr [(-122.0003,37.96),(-122.0003,37.968)] +Roberts Ave [(-121.9554,37.299),(-121.955,37.282)] +Robertson Ave [(-122.0164,37.33),(-122.0173,37.318)] +Robertson Ave [(-122.021,37.275),(-122.0213,37.27)] +Robin St [(-121.9701,37.297),(-121.9698,37.287)] +Robinson Dr [(-122.1825,37.096),(-122.1807,37.054)] +Robledo Dr [(-122.1734,37.304),(-122.1706,37.281)] +Roca Dr [(-122.0335,37.609),(-122.0314,37.599)] +Rochelle Ave [(-122.0603,37.347),(-122.0594,37.329)] +Rockford Road [(-122.0848,37.819),(-122.0842,37.814)] +Rockingham Dr [(-121.8681,37.948),(-121.8689,37.944)] +Rocklin Dr [(-122.070801,37.71701),(-122.0712,37.713)] +Rocklin Dr [(-122.0719,37.698),(-122.0722,37.689)] +Rockridge Blvd [(-122.242,37.457),(-122.2416,37.464)] +Rockridge Blvd [(-122.2424,37.454),(-122.2417,37.453)] +Rockrose Dr [(-122.0105,37.248),(-122.0114,37.252)] +Rockwood Dr [(-122.0128,37.492),(-122.0109,37.482)] +Rodney Com [(-121.9562,37.385),(-121.9555,37.382)] +Rogers Ave [(-122.0044,37.43),(-122.0061,37.409)] +Rolling Hills Dr [(-121.948386,37.07126),(-121.947082,37.07103)] +Rolling Hills Dr [(-121.950806,37.10304),(-121.950378,37.11376)] +Rollinghills Cir [(-121.945273,37.06404),(-121.945249,37.0671)] +Romeo Pl [(-122.0562,37.692),(-122.0571,37.694)] +Romey Lane [(-122.0603,37.825),(-122.0587,37.825)] +Ronald Ct [(-121.9528,37.259),(-121.9537,37.259)] +Ronda St [(-122.125,37.865),(-122.1251,37.856)] +Roosevelt Pl [(-121.9918,37.267),(-121.9923,37.263)] +Rosario Ct [(-122.110662,37.79847),(-122.109931,37.78596)] +Rose Ave [(-121.8792,37.616),(-121.8838,37.656)] +Rose Ave [(-122.244329,37.28237),(-122.2441,37.284),(-122.2438,37.287)] +Rose Ave [(-122.2476,37.256),(-122.2469,37.268)] +Rose Dr [(-122.1451,37.142),(-122.1445,37.138)] +Rose St [(-121.757,37.84),(-121.757,37.831)] +Rose St [(-122.2586,37.834),(-122.2575,37.836)] +Rose St [(-122.2644,37.83),(-122.263462,37.83335)] +Rose St [(-122.2696,37.82),(-122.2689,37.82)] +Rose St [(-122.2843,37.782),(-122.2829,37.787)] +Rose St [(-122.2882,37.769),(-122.287,37.771)] +Rosedale Ct [(-121.9232,37.9),(-121.924,37.897)] +Rosegate Ter [(-121.969628,37.63263),(-121.970152,37.638)] +Roselli Dr [(-121.7848,37.636),(-121.7848,37.628)] +Rosemary Ct [(-121.9314,37.088),(-121.9314,37.085)] +Rosewood Ct [(-122.0622,37.37),(-122.0618,37.372)] +Rosewood Common [(-121.964615,37.21789),(-121.964292,37.213)] +Ross Cir [(-122.2466,37.502),(-122.2474,37.514)] +Ross Gate Way [(-121.8794,37.845),(-121.8818,37.836)] +Rothchild Ct [(-121.950257,37.08452),(-121.951086,37.08115)] +Roundhill Dr [(-122.0376,37.542),(-122.0377,37.536)] +Rousillon Ave [(-122.046,37.672),(-122.0451,37.674)] +Roxanne St [(-121.7288,37.853),(-121.7287,37.849)] +Roxbury Ave [(-122.1354,37.339),(-122.1346,37.336)] +Roxbury Lane [(-122.0333,37.615),(-122.0329,37.618)] +Roxbury Lane [(-122.0359,37.623),(-122.0356,37.619)] +Royal Ann Dr [(-122.0267,37.889),(-122.0268,37.88)] +Royal Ann Dr [(-122.0273,37.871),(-122.0278,37.862)] +Royal Ann St [(-122.1696,37.367),(-122.1691,37.362)] +Royal Ann St [(-122.1705,37.38),(-122.1702,37.376)] +Royal Palm Dr [(-121.9945,37.315),(-121.9922,37.303)] +Ruby Road [(-121.8029,37.688),(-121.8023,37.68)] +Ruby St [(-122.0765,37.815),(-122.0751,37.802)] +Rudsdale St [(-122.1855,37.552),(-122.1849,37.547)] +Rugby Ave [(-122.274,37.045),(-122.2738,37.037)] +Running Hills Ave [(-121.7262,37.22),(-121.7238,37.213)] +Ruschin Dr [(-122.0397,37.459),(-122.0393,37.465)] +Russell Ave [(-122.1694,37.819),(-122.1687,37.845)] +Russell St [(-122.2661,37.569),(-122.2652,37.571)] +Russell St [(-122.2695,37.564),(-122.2684,37.566)] +Russell Way [(-122.08,37.771),(-122.0781,37.783)] +Russet St [(-122.1758,37.361),(-122.1753,37.355)] +Rutgers Way [(-121.7421,37.744),(-121.742,37.739)] +Ruth Ct [(-122.1301,37.004),(-122.1288,37.002)] +Ruth Way [(-121.7928,37.766),(-121.792,37.767)] +Ruth Glen [(-121.9121,37.281),(-121.9124,37.278)] +Ruus Road [(-122.0667,37.296),(-122.066,37.28)] +Sabercat Road [(-121.9396,37.176),(-121.9388,37.165),(-121.937,37.159)] +Sabercat Road [(-121.9453,37.266),(-121.944385,37.25156),(-121.9408,37.195)] +Sable Pointe [(-122.2393,37.439),(-122.24,37.434)] +Sable Pointe [(-122.241,37.424),(-122.2416,37.418)] +Sacramento Ave [(-121.9861,37.44),(-121.9865,37.436)] +Sacramento St [(-122.277606,37.50815),(-122.277616,37.50591)] +Sacramento St [(-122.2799,37.606),(-122.2797,37.597)] +Sacramento St [(-122.2813,37.703),(-122.2811,37.695)] +Saddle Brook Dr [(-122.1478,37.909),(-122.1454,37.904),(-122.1451,37.888)] +Saginaw Ct [(-121.8803,37.898),(-121.8806,37.901)] +Saguare Com [(-121.9049,37.022),(-121.9043,37.017)] +Sailway Dr [(-121.9673,37.495),(-121.9686,37.502)] +Salem St [(-122.2794,37.361),(-122.2796,37.368)] +Salem St [(-122.2832,37.474),(-122.2835,37.479)] +Salinas Pl [(-122.041,37.689),(-122.0404,37.686)] +Salisbury St [(-122.2162,37.863),(-122.2146,37.848)] +Salton Sea Lane [(-122.0597,37.88),(-122.0591,37.869)] +San Andreas Dr [(-122.0592,37.957),(-122.0585,37.954)] +San Andreas Dr [(-122.0609,37.9),(-122.0614,37.895)] +San Andreas Dr [(-122.0621,37.973),(-122.0614,37.972)] +San Andreas Dr [(-122.0635,37.878),(-122.0648,37.891)] +San Andreas Dr [(-122.0658,37.907),(-122.0661,37.914)] +San Andreas Dr [(-122.0668,37.926),(-122.0672,37.931)] +San Antonio Ave [(-122.2585,37.679),(-122.2566,37.672)] +San Antonio St [(-122.0472,37.155),(-122.0477,37.108)] +San Antonio Way [(-122.2323,37.891),(-122.2314,37.886)] +San Antonio Creek [(-121.8722,37.759),(-121.8641,37.771)] +San Antonio Reservoir [(-121.8487,37.728),(-121.8359,37.67)] +San Bernardino Way [(-122.0621,37.936),(-122.0628,37.933)] +San Carlos Ave [(-122.0912,37.941),(-122.0899,37.94)] +San Carlos Ave [(-122.2886,37.931),(-122.2885,37.91)] +San Carlos Walk [(-122.2087,37.795),(-122.208,37.789)] +San Clemente St [(-122.0511,37.188),(-122.051,37.177)] +San Franciscan Dr [(-122.0589,37.24),(-122.0582,37.246)] +San Francisco Bay [(-122.108,37.032),(-122.1048,37.001)] +San Francisco Bay [(-122.3115,37.814),(-122.3096,37.777)] +San Francisco Bay [(-122.3176,37.669),(-122.3108,37.652)] +San Jose Ave [(-122.2423,37.594),(-122.2409,37.586)] +San Jose Ave [(-122.2455,37.609),(-122.2445,37.605)] +San Jose Ave [(-122.2543,37.65),(-122.251,37.635)] +San Jose Ct [(-122.0563,37.922),(-122.055864,37.91921)] +San Juan St [(-122.2158,37.803),(-122.2149,37.795)] +San Leandro Blvd [(-122.1557,37.174),(-122.1545,37.168)] +San Leandro St [(-122.1703,37.323),(-122.1689,37.312)] +San Leandro St [(-122.1717,37.335),(-122.1709,37.329)] +San Leandro St [(-122.2195,37.721),(-122.2186,37.716)] +San Leandro St [(-122.2251,37.748),(-122.2242,37.743)] +San Leandro Bay [(-122.2241,37.553),(-122.2253,37.542)] +San Leandro Creek [(-122.154489,37.27978),(-122.155,37.281)] +San Leandro Creek [(-122.175792,37.24864),(-122.1807,37.247)] +San Leandro Creek Canal [(-122.2081,37.409),(-122.2076,37.401)] +San Lorenzo Ave [(-122.2861,37.93),(-122.2857,37.929)] +San Lorenzo Creek [(-122.0544,37.907),(-122.0547,37.908)] +San Lorenzo Creek [(-122.063257,37.85966),(-122.064271,37.85339)] +San Lorenzo Creek [(-122.0741,37.799),(-122.0757,37.789)] +San Lorenzo Creek [(-122.117293,37.85868),(-122.120139,37.85739)] +San Lorenzo Creek [(-122.124957,37.853),(-122.1271,37.849)] +San Lorenzo Creek [(-122.1539,37.747),(-122.1616,37.703)] +San Luces Way [(-122.0672,37.963),(-122.0695,37.954)] +San Luis Ct [(-121.8768,37.483),(-121.8766,37.474)] +San Luis Ct [(-122.065,37.975),(-122.0657,37.973)] +San Luis Road [(-122.271,37.959),(-122.2701,37.933)] +San Marco Way [(-122.0666,37.95),(-122.0687,37.942)] +San Mateo Road [(-122.2724,37.925),(-122.2728,37.928)] +San Mateo Way [(-122.0609,37.926),(-122.061842,37.92391)] +San Miguel Ave [(-122.0793,37.052),(-122.079224,37.0254)] +San Miguel Ave [(-122.0801,37.927),(-122.08,37.911)] +San Moreno Ct [(-121.954,37.576),(-121.9532,37.558)] +San Pablo Ave [(-122.2718,37.084),(-122.2721,37.093)] +San Pablo Ave [(-122.2797,37.326),(-122.2798,37.332)] +San Pablo Ave [(-122.2822,37.405),(-122.2824,37.411)] +San Pablo Ave [(-122.2834,37.442),(-122.2838,37.45)] +San Pablo Ave [(-122.2859,37.518),(-122.2857,37.515)] +San Pablo Ave [(-122.2864,37.537),(-122.2862,37.532)] +San Pablo Ave [(-122.2922,37.725),(-122.2922,37.716),(-122.2918,37.704)] +San Pablo Ave [(-122.2961,37.84),(-122.2959,37.832)] +San Rafael St [(-122.1398,37.225),(-122.1395,37.219)] +San Ramon Road [(-121.937288,37.09164),(-121.937307,37.0922)] +San Sabana Road [(-121.9402,37.066),(-121.9402,37.095)] +Sandalwood St [(-122.0347,37.493),(-122.0327,37.483)] +Sandburg Way [(-122.0625,37.226),(-122.0625,37.203)] +Sandelin Ave [(-122.1351,37.294),(-122.1343,37.298)] +Sandringham Road [(-122.2139,37.183),(-122.2142,37.179)] +Sandringham Road [(-122.2155,37.175),(-122.2163,37.165)] +Sandy Road [(-122.0643,37.089),(-122.0645,37.086)] +Sandy Hook Dr [(-122.0615,37.22),(-122.062,37.221)] +Sanford St [(-122.1546,37.737),(-122.1543,37.728)] +Sangamore St [(-122.1069,37.471),(-122.1076,37.468)] +Santa Barbara Road [(-122.2679,37.928),(-122.2666,37.92)] +Santa Clara Ave [(-122.2509,37.695),(-122.2479,37.682)] +Santa Clara Ave [(-122.254714,37.71317),(-122.254,37.71)] +Santa Clara Ave [(-122.2551,37.211),(-122.254,37.205)] +Santa Clara Ave [(-122.2787,37.736),(-122.2761,37.736)] +Santa Clara Ave [(-122.2791,37.994),(-122.2798,37.989)] +Santa Clara St [(-122.0901,37.496),(-122.0885,37.485)] +Santa Clara St [(-122.0923,37.51),(-122.0919,37.504)] +Santa Clara St [(-122.1009,37.618),(-122.1006,37.613)] +Santa Clara St [(-122.1012,37.667),(-122.1012,37.66389),(-122.1012,37.65718)] +Santa Clara Way [(-121.7539,37.854),(-121.7508,37.856),(-121.75,37.856)] +Santa Fe Ave [(-122.2899,37.817),(-122.2899,37.815)] +Santa Maria Ave [(-122.0773,37),(-122.0773,37.98)] +Santa Maria Dr [(-122.0633,37.965),(-122.0624,37.961)] +Santa Paula [(-122.1607,37.848),(-122.1596,37.834)] +Santa Ray Ave [(-122.2393,37.122),(-122.2381,37.113)] +Santa Rita Road [(-121.872608,37.75282),(-121.8731,37.766)] +Santa Rita Road [(-121.877461,37.9142),(-121.8775,37.922)] +Santa Rita St [(-122.2065,37.804),(-122.2058,37.796)] +Santa Rita St [(-122.2129,37.832),(-122.2104,37.839)] +Santa Rosa St [(-122.1506,37.247),(-122.1502,37.238)] +Santa Rosa St [(-122.1513,37.265),(-122.1509,37.256)] +Santa Teresa [(-122.1576,37.826),(-122.1565,37.812),(-122.1553,37.797)] +Santa Teresa Com [(-121.9505,37.564),(-121.9496,37.559)] +Santee Road [(-122.0371,37.691),(-122.0376,37.685)] +Santiago Road [(-122.176,37.962),(-122.1756,37.956)] +Santo Ct [(-121.946172,37.10869),(-121.947136,37.10367)] +Saratoga St [(-122.1024,37.997),(-122.1019,37.997)] +Sarazen Ave [(-122.1539,37.58),(-122.1532,37.585)] +Saroni Dr [(-122.1954,37.345),(-122.1944,37.347)] +Saturn Dr [(-122.1283,37.145),(-122.1238,37.117)] +Sausal Creek [(-122.2126,37.122),(-122.213944,37.10691)] +Sausal Creek [(-122.215521,37.03532),(-122.216544,37.01827)] +Sausal Creek [(-122.2175,37.985),(-122.218,37.982)] +Sausal Creek [(-122.218,37.982),(-122.218834,37.9583)] +Sausal Creek [(-122.219108,37.9487),(-122.2193,37.942),(-122.219513,37.93313)] +Sausal Creek [(-122.2217,37.893),(-122.2221,37.884)] +Sausal Creek [(-122.2228,37.862),(-122.2232,37.856)] +Scarborough Dr [(-122.0362,37.568),(-122.0362,37.556)] +Scarborough Dr [(-122.1993,37.214),(-122.1999,37.24),(-122.1994,37.241)] +Scenic Ave [(-121.7262,37.171),(-121.7232,37.171)] +Scenic Ave [(-121.7314,37.171),(-121.7305,37.17)] +Scenic Ave [(-121.7414,37.166),(-121.73802,37.16978)] +Scenic Ave [(-122.2282,37.278),(-122.2284,37.296)] +Scenic Ave [(-122.2619,37.762),(-122.2617,37.749)] +Scenicview Dr [(-122.1354,37.26),(-122.1325,37.252)] +School St [(-122.1378,37.209),(-122.1369,37.199),(-122.1364,37.197)] +School St [(-122.2116,37.945),(-122.2103,37.94)] +School Way [(-122.0838,37.18),(-122.0833,37.177)] +Schooner Hill [(-122.2263,37.56),(-122.2269,37.564)] +Schuster Ave [(-122.0854,37.081),(-122.0854,37.074)] +Scott Pl [(-122.0802,37.38),(-122.0815,37.381)] +Scott Creek [(-121.8694,37.814),(-121.8694,37.803)] +Scott Creek Road [(-121.8999,37.678),(-121.8975,37.685)] +Scott Creek Road [(-121.9047,37.667),(-121.9034,37.67)] +Scott Creek Road [(-121.9098,37.651),(-121.9086,37.655)] +Sea Bridge Way [(-122.2364,37.426),(-122.2359,37.417)] +Sea View Pkwy [(-122.242913,37.47248),(-122.2421,37.472),(-122.2411,37.471)] +Sea View Pkwy [(-122.2499,37.466),(-122.2496,37.468)] +Sea View Pkwy [(-122.253,37.455),(-122.2519,37.457)] +Sea View Pkwy [(-122.2547,37.434),(-122.255,37.439)] +Seal Rock Ter [(-122.033374,37.69186),(-122.0335,37.692),(-122.0338,37.694)] +Seaver St [(-122.1016,37.427),(-122.1016,37.419)] +Seaview Ave [(-122.0623,37.113),(-122.0599,37.111)] +Seawall Dr [(-122.316154,37.63126),(-122.315489,37.60045)] +Segovia Pl [(-121.9478,37.596),(-121.9489,37.585)] +Selkirk St [(-121.9798,37.336),(-121.9796,37.331)] +Seminary Ave [(-122.1772,37.796),(-122.1756,37.798)] +Seminary Ave [(-122.1814,37.772),(-122.1807,37.778)] +Seneca St [(-122.03,37.122),(-122.03,37.115)] +Seneca Park Ave [(-121.9649,37.17),(-121.9653,37.167)] +Senior Ave [(-122.2487,37.826),(-122.2473,37.827)] +Sequoia Road [(-122.0013,37.617),(-122.001192,37.61346)] +Sequoia Ter [(-121.997978,37.6571),(-121.997403,37.66696)] +Seven Hills Road [(-122.0876,37.1),(-122.086344,37.1012),(-122.0855,37.102)] +Severn Dr [(-122.0359,37.584),(-122.0368,37.571)] +Severn Pl [(-122.0363,37.586),(-122.0367,37.581)] +Sevilla Road [(-122.0829,37.809),(-122.0831,37.81)] +Seville Pl [(-121.9514,37.522),(-121.9522,37.518)] +Sextus Road [(-122.1938,37.33),(-122.1896,37.327)] +Seymour Pl [(-122.0357,37.84),(-122.0367,37.837)] +Shadow Ridge Dr [(-122.041,37.144),(-122.0411,37.162)] +Shady Creek Road [(-121.913106,37.24701),(-121.914087,37.24475)] +Shafer Creek [(-121.681036,37.12545),(-121.694801,37.25112)] +Shafter Ave [(-122.2539,37.418),(-122.2527,37.434)] +Shafter Ave [(-122.2569,37.383),(-122.2556,37.399)] +Shafter Ave [(-122.2586,37.313),(-122.2583,37.323)] +Shamrock Pl [(-121.929,37.24),(-121.9295,37.247)] +Shannon Ave [(-121.94218,37.14137),(-121.9418,37.142)] +Shasta St [(-121.802842,37.889),(-121.802801,37.8826)] +Shattuck Ave [(-122.053676,37.61223),(-122.052619,37.61591)] +Shattuck Ave [(-122.2633,37.339),(-122.2634,37.347)] +Shattuck Ave [(-122.2648,37.468),(-122.2648,37.474)] +Shattuck Ave [(-122.2675,37.712),(-122.2674,37.704)] +Shattuck Ave [(-122.2683,37.776),(-122.2683,37.766)] +Shattuck Ave [(-122.2686,37.904),(-122.2686,37.897)] +Shaw St [(-122.1518,37.459),(-122.1511,37.455)] +Sheffield Lane [(-122.0511,37.006),(-122.051292,37.00178)] +Sheffield Road [(-122.1032,37.097),(-122.1026,37.095)] +Sheffield Road [(-122.241,37.45),(-122.2413,37.446)] +Sheffield Road [(-122.2421,37.44),(-122.2427,37.437)] +Sheffield Road [(-122.2457,37.441),(-122.2448,37.44)] +Sheila St [(-122.0453,37.852),(-122.045,37.847)] +Sheldon St [(-122.146,37.455),(-122.1454,37.451)] +Shepherd Ave [(-122.0707,37.383),(-122.0737,37.367)] +Shepherd Canyon Road [(-122.1845,37.355),(-122.1835,37.355)] +Shepherd Canyon Road [(-122.1988,37.302),(-122.196132,37.31137)] +Shepherd Canyon Road [(-122.2052,37.245),(-122.2027,37.236)] +Sheridan Road [(-121.901114,37.58914),(-121.899,37.574)] +Sheridan Road [(-122.2279,37.425),(-122.2253,37.411),(-122.2223,37.377)] +Sherman St [(-122.2628,37.781),(-122.2627,37.787)] +Sherman St [(-122.263,37.695),(-122.262932,37.70799)] +Sherman St [(-122.2631,37.667),(-122.2631,37.674)] +Sherry Ct [(-121.7642,37.736),(-121.76437,37.73958)] +Sherwood Lane [(-122.2474,37.467),(-122.246514,37.45985)] +Shiela Way [(-122.0734,37.757),(-122.073,37.75)] +Shinn St [(-121.9818,37.64),(-121.9817,37.636)] +Shirley Ave [(-122.1157,37.717),(-122.117,37.712)] +Shoreline Dr [(-122.2638,37.596),(-122.2607,37.584)] +Shoreline Dr [(-122.2657,37.603),(-122.2648,37.6)] +Shoreline Dr [(-122.2714,37.626),(-122.2691,37.616)] +Shylock Dr [(-122.0488,37.748),(-122.0486,37.74)] +Sidney Ave [(-122.1279,37.096),(-122.1274,37.1)] +Sigourney Elysian Fields Dr [(-122.127563,37.66495),(-122.1275,37.649)] +Sigourney Elysian Fields Dr [(-122.128,37.674),(-122.1277,37.667)] +Silva Lane [(-122.237019,37.28132),(-122.235461,37.27888)] +Silvergate Dr [(-121.941,37.097),(-121.9402,37.095)] +Simm Ct [(-121.9757,37.15),(-121.9748,37.153)] +Simmons St [(-122.1881,37.803),(-122.1874,37.805)] +Sims Dr [(-122.21,37.207),(-122.2101,37.237)] +Simson St [(-122.1693,37.737),(-122.1687,37.74)] +Sinbad Creek [(-121.9177,37.343),(-121.9202,37.366)] +Sinbad Creek [(-121.9498,37.613),(-121.9556,37.643)] +Singing Hills Ave [(-121.7262,37.199),(-121.7237,37.206)] +Singleton Ave [(-122.2896,37.87397),(-122.288161,37.87394)] +Sioux Ct [(-121.926147,37.14374),(-121.9248,37.122)] +Sioux Dr [(-121.928,37.142),(-121.926147,37.14374)] +Siward Dr [(-122.043286,37.63282),(-122.043581,37.63639)] +Siward Dr [(-122.044259,37.64617),(-122.044499,37.6493)] +Siward Dr [(-122.046199,37.68158),(-122.046,37.672)] +Siward Dr [(-122.047527,37.71764),(-122.0475,37.716)] +Skylark Dr [(-122.0117,37.839),(-122.011,37.835)] +Skylark Dr [(-122.0192,37.85),(-122.0186,37.848)] +Skyline Blvd [(-122.1409,37.819),(-122.1307,37.73)] +Skyline Blvd [(-122.144,37.851),(-122.1409,37.829)] +Skyline Blvd [(-122.1701,37.988),(-122.167,37.982)] +Skyline Blvd [(-122.1738,37.01),(-122.1714,37.996)] +Skyline Blvd [(-122.1772,37.039),(-122.1774,37.037)] +Skyline Blvd [(-122.1865,37.25),(-122.186,37.247)] +Skyline Blvd [(-122.1885,37.275),(-122.1873,37.266)] +Skyline Blvd [(-122.1965,37.405),(-122.190866,37.38122)] +Skyline Blvd [(-122.2091,37.506),(-122.2076,37.506)] +Skyline Dr [(-122.0277,37.5),(-122.0284,37.498)] +Skyview Dr [(-122.1276,37.242),(-122.1274,37.244)] +Skywest Dr [(-122.1161,37.62),(-122.1123,37.586)] +Sleepy Hollow Ave [(-122.093,37.35),(-122.0927,37.343)] +Sleepy Hollow Ave [(-122.1003,37.335),(-122.1008,37.332)] +Sleepy Hollow Ave [(-122.1045,37.316),(-122.1054,37.315)] +Slender Ct [(-122.0565,37.73),(-122.055,37.735)] +Smalley Ave [(-122.095194,37.69714),(-122.0945,37.7)] +Smith St [(-122.0727,37.965),(-122.0742,37.964)] +Smith St [(-122.0759,37.963),(-122.0778,37.964)] +Snake Road [(-122.206567,37.27603),(-122.2062,37.281),(-122.2057,37.292)] +Snake Road [(-122.2066,37.331),(-122.2048,37.345)] +Sodaville Ct [(-121.9266,37.029),(-121.9278,37.033)] +Solano Ave [(-122.1131,37.735),(-122.1161,37.724)] +Solano Ave [(-122.2829,37.912),(-122.2819,37.913)] +Solano Ave [(-122.2871,37.91),(-122.2867,37.91)] +Solano Ave [(-122.289,37.909),(-122.2885,37.91)] +Solano Way [(-122.0773,37.921),(-122.0785,37.921)] +Solano Way [(-122.2451,37.889),(-122.2443,37.885)] +Solomon Lane [(-122.2372,37.299),(-122.2374,37.3)] +Somerset Ave [(-122.0827,37.016),(-122.0811,37.016)] +Somerset Ave [(-122.0893,37.006),(-122.0885,37.008)] +Somerset Ave [(-122.0907,37.003),(-122.0899,37.005)] +Somerset Ave [(-122.0936,37.994),(-122.0922,37.998)] +Somerset Pl [(-122.0295,37.49),(-122.0299,37.485)] +Somerset Pl [(-122.2732,37.949),(-122.27246,37.94689)] +Sonoma Ave [(-122.2776,37.858),(-122.2765,37.856)] +Sonoma Dr [(-121.8796,37.487),(-121.8799,37.488)] +Soquel St [(-122.0664,37.711),(-122.0657,37.707)] +Sora Com [(-122.043,37.743),(-122.0428,37.746)] +Sorani Way [(-122.0785,37.172),(-122.0782,37.171)] +Soto Road [(-122.0812,37.561),(-122.0798,37.545)] +South Road [(-121.8941,37.283),(-121.894,37.279)] +South Bay Aqueduct [(-121.6786,37.942),(-121.676067,37.8981)] +South Dry Creek Branch [(-122.0168,37.083),(-122.0173,37.084)] +South Fork Trout Creek [(-121.658085,37.99874),(-121.657591,37.02423)] +South Front Road [(-121.7116,37.134),(-121.7092,37.145)] +South Front Road [(-121.723953,37.0797),(-121.722,37.062)] +South Front Road [(-121.738379,37.02183),(-121.737947,37.02335)] +Southampton Ave [(-122.2745,37.948),(-122.2742,37.962)] +Southern Pacific Railroad [(-121.558002,37.00663),(-121.576,37.136)] +Southern Pacific Railroad [(-121.6695,37.391),(-121.666889,37.41337)] +Southern Pacific Railroad [(-121.7674,37.843),(-121.7686,37.84)] +Southern Pacific Railroad [(-122.3002,37.674),(-122.2999,37.661)] +Southlake Com [(-121.9572,37.113),(-121.9565,37.116)] +Southwick Ct [(-121.9441,37.185),(-121.9436,37.18)] +Sp Railroad [(-121.7182,37.017),(-121.7162,37.025)] +Sp Railroad [(-121.8204,37.746),(-121.8139,37.753)] +Sp Railroad [(-121.8591,37.701),(-121.8586,37.705)] +Sp Railroad [(-121.8699,37.631),(-121.8678,37.651)] +Sp Railroad [(-121.87958,37.88603),(-121.880675,37.89396)] +Sp Railroad [(-121.893564,37.99009),(-121.897,37.016)] +Sp Railroad [(-121.8977,37.022),(-121.9022,37.054)] +Sp Railroad [(-121.9271,37.788),(-121.9185,37.626)] +Sp Railroad [(-121.950757,37.25243),(-121.9506,37.25)] +Sp Railroad [(-121.9565,37.898),(-121.9562,37.9)] +Sp Railroad [(-121.9684,37.715),(-121.9669,37.701),(-121.9655,37.69)] +Sp Railroad [(-121.9736,37.616),(-121.9737,37.608)] +Sp Railroad [(-121.993831,37.81669),(-121.992146,37.8107)] +Sp Railroad [(-122.0257,37.349),(-122.0289,37.31)] +Sp Railroad [(-122.0315,37.251),(-122.0292,37.24)] +Sp Railroad [(-122.0321,37.271),(-122.0347,37.265)] +Sp Railroad [(-122.0386,37.133),(-122.0335,37.089)] +Sp Railroad [(-122.0414,37.268),(-122.042509,37.26338)] +Sp Railroad [(-122.0553,37.212),(-122.0652,37.134),(-122.0654,37.131)] +Sp Railroad [(-122.0594,37.75),(-122.0593,37.743)] +Sp Railroad [(-122.0626,37.857),(-122.0616,37.845)] +Sp Railroad [(-122.0734,37.001),(-122.0734,37.997)] +Sp Railroad [(-122.076691,37.99914),(-122.075907,37.99243)] +Sp Railroad [(-122.086,37.079),(-122.081,37.036)] +Sp Railroad [(-122.0914,37.601),(-122.087,37.56),(-122.086408,37.5551)] +Sp Railroad [(-122.10629,37.73042),(-122.1054,37.723)] +Sp Railroad [(-122.1129,37.315),(-122.1125,37.311)] +Sp Railroad [(-122.121,37.857),(-122.1187,37.837)] +Sp Railroad [(-122.137,37.576),(-122.1327,37.53)] +Sp Railroad [(-122.137792,37.003),(-122.1365,37.992),(-122.131257,37.94612)] +Sp Railroad [(-122.172213,37.03399),(-122.1678,37.059)] +Sp Railroad [(-122.1748,37.322),(-122.174,37.315)] +Sp Railroad [(-122.1785,37.355),(-122.178,37.351)] +Sp Railroad [(-122.17894,37.32386),(-122.179281,37.31827),(-122.1807,37.295)] +Sp Railroad [(-122.1801,37.115),(-122.178,37.088)] +Sp Railroad [(-122.1947,37.497),(-122.193328,37.4848)] +Sp Railroad [(-122.2269,37.73),(-122.2272,37.726)] +Sp Railroad [(-122.2281,37.761),(-122.2268,37.753)] +Sp Railroad [(-122.2346,37.727),(-122.2343,37.726)] +Sp Railroad [(-122.2411,37.85),(-122.2359,37.814)] +Sp Railroad [(-122.2506,37.891),(-122.2501,37.889)] +Sp Railroad [(-122.2724,37.946),(-122.2713,37.942)] +Sp Railroad [(-122.2737,37.774),(-122.2731,37.765)] +Sp Railroad [(-122.2744,37.802),(-122.2743,37.795)] +Sp Railroad [(-122.275429,37.88474),(-122.2754,37.883)] +Sp Railroad [(-122.2853,37.355),(-122.2847,37.334)] +Sp Railroad [(-122.2864,37.393),(-122.2881,37.387)] +Sp Railroad [(-122.2888,37.383),(-122.2893,37.38)] +Sp Railroad [(-122.2898,37.349),(-122.2887,37.319),(-122.2883,37.307)] +Sp Railroad [(-122.2939,37.484),(-122.2936,37.475)] +Sp Railroad [(-122.2965,37.56),(-122.2959,37.545)] +Sp Railroad [(-122.305229,37.83926),(-122.3049,37.822)] +Sp Railroad [(-122.3086,37.087),(-122.31,37.085)] +Spady St [(-121.9689,37.424),(-121.969174,37.41761)] +Sparrow Dr [(-121.9331,37.139),(-121.9328,37.134)] +Sparrow Road [(-122.0827,37.209),(-122.0826,37.203)] +Spence Ave [(-121.9733,37.616),(-121.9728,37.619)] +Spetti Dr [(-121.9684,37.665),(-121.9696,37.658)] +Spinnaker Way [(-122.3138,37.694),(-122.3171,37.687)] +Spoonbill Common [(-122.043662,37.66522),(-122.043425,37.66065)] +Spring St [(-121.8702,37.62),(-121.871,37.621)] +Springbrook Lane [(-122.057162,37.29952),(-122.056705,37.29151)] +Springdale Ave [(-121.9196,37.845),(-121.92,37.854)] +Springdale Ave [(-121.9229,37.884),(-121.9233,37.888)] +Springfield St [(-122.1598,37.485),(-122.1597,37.477)] +Springhouse Dr [(-121.883683,37.89587),(-121.880871,37.89125)] +Springlake Dr [(-122.133113,37.93134),(-122.134,37.93)] +Springtown Blvd [(-121.74,37.039),(-121.7407,37.059)] +Springtown Blvd [(-121.743242,37.07568),(-121.745,37.088)] +Spruce St [(-122.0506,37.327),(-122.0496,37.322)] +Spruce St [(-122.0566,37.368),(-122.0565,37.361)] +Spruce St [(-122.1578,37.994),(-122.1586,37.991)] +Spruce St [(-122.2398,37.048),(-122.2393,37.056)] +Spruce St [(-122.2659,37.849),(-122.2655,37.839)] +Spruce St [(-122.2698,37.99),(-122.2693,37.981)] +St Anthony Dr [(-121.939,37.474),(-121.9385,37.471)] +St Charles St [(-122.2654,37.763),(-122.2653,37.773)] +St Johns St [(-121.8764,37.643),(-121.8777,37.646)] +St Matthew Dr [(-122.024,37.394),(-122.0234,37.391)] +St Michael Cir [(-121.853648,37.6251),(-121.853779,37.61796)] +Stacy St [(-122.1218,37.544),(-122.1199,37.532)] +Stadium Way [(-121.758155,37.66715),(-121.757912,37.66728)] +Stagecoach Road [(-121.921401,37.27049),(-121.9218,37.277)] +Stalker Way [(-122.264,37.807),(-122.2672,37.816)] +Stanford Ave [(-122.2764,37.438),(-122.2773,37.433)] +Stanford Ave [(-122.2781,37.43),(-122.2802,37.42)] +Stanford Way [(-121.7451,37.826),(-121.743925,37.82264)] +Stanford Way [(-121.7473,37.828),(-121.7459,37.826)] +Stanley Ave [(-121.9621,37.242),(-121.9632,37.24)] +Stanley Ave [(-122.1504,37.485),(-122.15,37.478),(-122.1498,37.469)] +Stanley Blvd [(-121.7971,37.769),(-121.7948,37.772)] +Stanley Blvd [(-121.8705,37.659),(-121.871,37.66)] +Stannage Ave [(-122.2939,37.844),(-122.2939,37.828)] +Stannage Ave [(-122.297,37.939),(-122.2965,37.923)] +Stanton Ave [(-122.0889,37.939),(-122.0885,37.928)] +Stanton Ave [(-122.0953,37.027),(-122.0944,37.022)] +Stanton Ave [(-122.100392,37.0697),(-122.099513,37.06052)] +Stanton Hill Road [(-122.0935,37.963),(-122.0929,37.964)] +Stanwood Ave [(-122.0839,37.416),(-122.0839,37.409)] +Star View Ct [(-122.2251,37.516),(-122.2248,37.511)] +Starflower Way [(-121.7298,37.099),(-121.7323,37.095)] +Starling Dr [(-122.015929,37.82489),(-122.0171,37.83)] +Starlite Way [(-121.9167,37.738),(-121.9162,37.745)] +Starr Ct [(-121.9238,37.371),(-121.9246,37.373)] +Starr Ct [(-121.9249,37.373),(-121.92514,37.3722)] +Starr St [(-121.9213,37.378),(-121.9216,37.376)] +Starview Dr [(-122.1248,37.197),(-122.1231,37.201)] +Starward Dr [(-121.9356,37.103),(-121.936,37.109)] +Starward Dr [(-121.9361,37.115),(-121.9363,37.128)] +State Hwy 123 [(-122.3004,37.986),(-122.2998,37.969),(-122.2995,37.962),(-122.2992,37.952),(-122.299,37.942),(-122.2987,37.935),(-122.2984,37.924),(-122.2982,37.92),(-122.2976,37.904),(-122.297,37.88),(-122.2966,37.869),(-122.2959,37.848),(-122.2961,37.843)] +State Hwy 13 [(-122.1797,37.943),(-122.179871,37.91849),(-122.18,37.9),(-122.179023,37.86615),(-122.1787,37.862),(-122.1781,37.851),(-122.1777,37.845),(-122.1773,37.839),(-122.177,37.833)] +State Hwy 13 [(-122.1828,37.974),(-122.1799,37.948)] +State Hwy 13 [(-122.2049,37.2),(-122.20328,37.17975),(-122.1989,37.125),(-122.198078,37.11641),(-122.1975,37.11)] +State Hwy 13 [(-122.2213,37.388),(-122.218753,37.36402),(-122.2168,37.336),(-122.2163,37.328),(-122.2144,37.313),(-122.211744,37.28221),(-122.21,37.262),(-122.2087,37.244),(-122.207,37.224),(-122.2065,37.218),(-122.2058,37.209)] +State Hwy 13 [(-122.2319,37.515),(-122.2316,37.511),(-122.2305,37.498),(-122.2296,37.489),(-122.2286,37.478),(-122.2244,37.427)] +State Hwy 13 Ramp [(-122.1781,37.851),(-122.1782,37.847),(-122.1777,37.845)] +State Hwy 13 Ramp [(-122.1799,37.948),(-122.1797,37.943)] +State Hwy 13 Ramp [(-122.1819,37.978),(-122.1828,37.974)] +State Hwy 13 Ramp [(-122.1835,37.98),(-122.1852,37.985)] +State Hwy 13 Ramp [(-122.1854,37.996),(-122.1861,37.986)] +State Hwy 13 Ramp [(-122.1937,37.078),(-122.1943,37.08)] +State Hwy 13 Ramp [(-122.1942,37.084),(-122.1964,37.107)] +State Hwy 13 Ramp [(-122.1975,37.11),(-122.1964,37.107)] +State Hwy 13 Ramp [(-122.1989,37.125),(-122.1984,37.117),(-122.1981,37.112)] +State Hwy 13 Ramp [(-122.2054,37.205),(-122.2048,37.209)] +State Hwy 13 Ramp [(-122.2055,37.197),(-122.2049,37.2)] +State Hwy 13 Ramp [(-122.2058,37.209),(-122.2049,37.211)] +State Hwy 13 Ramp [(-122.2069,37.213),(-122.2072,37.216),(-122.2065,37.218)] +State Hwy 13 Ramp [(-122.2073,37.221),(-122.207,37.224)] +State Hwy 13 Ramp [(-122.2163,37.328),(-122.2149,37.321),(-122.2144,37.313)] +State Hwy 13 Ramp [(-122.2168,37.336),(-122.2168,37.328)] +State Hwy 13 Ramp [(-122.2232,37.41),(-122.2247,37.422)] +State Hwy 13 Ramp [(-122.2244,37.427),(-122.223,37.414),(-122.2214,37.396),(-122.2213,37.388)] +State Hwy 13 Ramp [(-122.2244,37.427),(-122.2247,37.422)] +State Hwy 13 Ramp [(-122.2307,37.487),(-122.2286,37.478)] +State Hwy 17 [(-122.3107,37.976),(-122.3078,37.93),(-122.3072,37.916),(-122.307,37.902)] +State Hwy 17 Ramp ((-122.2877,37.234),(-122.2881,37.237)) +State Hwy 17 Ramp [(-122.2882,37.233),(-122.2881,37.237),(-122.2882,37.242),(-122.2883,37.247),(-122.2885,37.254)] +State Hwy 17 Ramp [(-122.2899,37.128),(-122.2898,37.132),(-122.2897,37.142)] +State Hwy 17 Ramp [(-122.291,37.113),(-122.2906,37.118)] +State Hwy 17 Ramp [(-122.2915,37.083),(-122.29137,37.07065),(-122.290561,37.06224)] +State Hwy 238 ((-122.098,37.908),(-122.0983,37.907),(-122.099,37.905),(-122.101,37.898),(-122.101535,37.89711),(-122.103173,37.89438),(-122.1046,37.892),(-122.106,37.89)) +State Hwy 238 [(-122.106,37.89),(-122.1061,37.89),(-122.1064,37.89),(-122.1073,37.889)] +State Hwy 238 Ramp ((-122.1064,37.89),(-122.1067,37.899)) +State Hwy 238 Ramp ((-122.1288,37.892),(-122.1293,37.895)) +State Hwy 238 Ramp ((-122.1288,37.913),(-122.1294,37.917)) +State Hwy 238 Ramp [(-122.1073,37.889),(-122.1067,37.899),(-122.1056,37.899)] +State Hwy 238 Ramp [(-122.1073,37.889),(-122.1068,37.881),(-122.106574,37.88354),(-122.106,37.89)] +State Hwy 238 Ramp [(-122.1288,37.9),(-122.1293,37.895),(-122.1296,37.906)] +State Hwy 238 Ramp [(-122.1288,37.922),(-122.1294,37.917),(-122.1296,37.906)] +State Hwy 24 [(-122.2206,37.531),(-122.2204,37.536),(-122.2194,37.541),(-122.217,37.546),(-122.2151,37.551),(-122.2139,37.561),(-122.2121,37.577)] +State Hwy 24 [(-122.2674,37.246),(-122.2673,37.248),(-122.267,37.261),(-122.2668,37.271),(-122.2663,37.298),(-122.2659,37.315),(-122.2655,37.336),(-122.265007,37.35882),(-122.264443,37.37286),(-122.2641,37.381),(-122.2638,37.388),(-122.2631,37.396),(-122.2617,37.405),(-122.2615,37.407),(-122.2605,37.412)] +State Hwy 24 [(-122.2681,37.244),(-122.2679,37.248),(-122.2677,37.252)] +State Hwy 24 Ramp ((-122.2191,37.537),(-122.2197,37.535)) +State Hwy 24 Ramp ((-122.2204,37.536),(-122.2211,37.533)) +State Hwy 24 Ramp [(-122.2194,37.541),(-122.2197,37.535),(-122.2197,37.531)] +State Hwy 24 Ramp [(-122.2211,37.542),(-122.2211,37.533),(-122.2209,37.526)] +State Hwy 24 Ramp [(-122.2218,37.517),(-122.2214,37.507)] +State Hwy 24 Ramp [(-122.2224,37.497),(-122.2219,37.494),(-122.2215,37.492)] +State Hwy 24 Ramp [(-122.2279,37.486),(-122.2284,37.485)] +State Hwy 24 Ramp [(-122.2279,37.486),(-122.2305,37.498)] +State Hwy 24 Ramp [(-122.2286,37.478),(-122.2284,37.485)] +State Hwy 24 Ramp [(-122.2551,37.435),(-122.2568,37.436),(-122.2585,37.428),(-122.259722,37.42438),(-122.260592,37.4218),(-122.2612,37.42)] +State Hwy 24 Ramp [(-122.257,37.433),(-122.258,37.427)] +State Hwy 24 Ramp [(-122.2605,37.412),(-122.2601,37.412),(-122.2599,37.412),(-122.2586,37.413)] +State Hwy 24 Ramp [(-122.2623,37.409),(-122.2614,37.411),(-122.260282,37.41626),(-122.258,37.427)] +State Hwy 24 Ramp [(-122.2657,37.351),(-122.2665,37.36)] +State Hwy 24 Ramp [(-122.266,37.348),(-122.2661,37.35),(-122.2668,37.35)] +State Hwy 24 Ramp [(-122.2677,37.252),(-122.2674,37.258),(-122.2671,37.263),(-122.2672,37.267),(-122.2673,37.272)] +State Hwy 84 [(-121.7673,37.82),(-121.7664,37.828),(-121.7654,37.835),(-121.765,37.837)] +State Hwy 84 [(-121.9565,37.898),(-121.956589,37.89911),(-121.9569,37.903),(-121.956,37.91),(-121.9553,37.919)] +State Hwy 84 [(-121.9725,37.749),(-121.972151,37.75144),(-121.9715,37.756),(-121.9706,37.762),(-121.9692,37.778),(-121.9673,37.793),(-121.9637,37.813),(-121.9637,37.854),(-121.9576,37.891)] +State Hwy 84 [(-122.0484,37.539),(-122.0443,37.564),(-122.0423,37.577)] +State Hwy 84 [(-122.0484,37.539),(-122.0514,37.52),(-122.051557,37.51906),(-122.0544,37.502)] +State Hwy 84 [(-122.0671,37.426),(-122.0658,37.432)] +State Hwy 84 [(-122.0671,37.426),(-122.07,37.402),(-122.074,37.37),(-122.0773,37.338)] +State Hwy 84 Ramp [(-122.0544,37.502),(-122.052622,37.50902),(-122.0506,37.517),(-122.0484,37.539)] +State Hwy 92 [(-122.1085,37.326),(-122.1095,37.322),(-122.1111,37.316),(-122.1119,37.313),(-122.1125,37.311),(-122.1131,37.308),(-122.1167,37.292),(-122.1187,37.285),(-122.12,37.28)] +State Hwy 92 Ramp ((-122.1091,37.328),(-122.1101,37.332)) +State Hwy 92 Ramp [(-122.099,37.368),(-122.0994,37.363)] +State Hwy 92 Ramp [(-122.1086,37.321),(-122.1089,37.315),(-122.1111,37.316)] +State Hwy 92 Ramp [(-122.1091,37.328),(-122.1101,37.332),(-122.1101,37.327),(-122.1095,37.322)] +State Hwy 92 Ramp [(-122.1167,37.292),(-122.1185,37.295),(-122.1191,37.298)] +State Hwy 92 Ramp [(-122.1187,37.285),(-122.1186,37.292),(-122.1193,37.29)] +State Hwy 92 Ramp [(-122.12,37.28),(-122.1207,37.269),(-122.1204,37.27)] +State Hwy 92 Ramp [(-122.1204,37.267),(-122.123,37.271)] +Staten Ave [(-122.2533,37.103),(-122.2534,37.094)] +Stearns Ave [(-122.1564,37.533),(-122.1533,37.512)] +Steele St [(-122.188,37.892),(-122.1874,37.886)] +Steinmetz Way [(-122.1979,37.061),(-122.1976,37.051)] +Stella St [(-122.14272,37.4824),(-122.1418,37.469)] +Stenhammer Dr [(-121.9612,37.84),(-121.9607,37.826)] +Sterne Pl [(-122.0318,37.838),(-122.0327,37.835)] +Steuben Ct [(-121.9547,37.227),(-121.9553,37.225)] +Stevens St [(-122.0718,37.999),(-122.0707,37.999)] +Stevenson Blvd [(-121.9758,37.367),(-121.9782,37.334)] +Stevenson Blvd [(-121.982964,37.27715),(-121.983567,37.27017)] +Stewart Ave [(-121.9797,37.174),(-121.9821,37.149)] +Stoakes Ave [(-122.161722,37.31574),(-122.16195,37.31467)] +Stonedale Dr [(-121.9171,37.877),(-121.9173,37.882)] +Stonehenge Road [(-122.037162,37.84679),(-122.0377,37.841)] +Stoneridge Dr [(-121.894,37.919),(-121.8902,37.925)] +Stoneridge Dr [(-121.9082,37.905),(-121.9089,37.904)] +Stoneridge Mall Road [(-121.9274,37.926),(-121.925,37.925)] +Stoneridge Mall Road [(-121.9287,37.963),(-121.9283,37.941)] +Stonewall Ave [(-122.1076,37.568),(-122.1067,37.554)] +Stony Brook [(-121.9429,37.244),(-121.9432,37.21)] +Storer Ave [(-122.1944,37.852),(-122.1934,37.854)] +Stow Ave [(-122.2508,37.042),(-122.2491,37.043)] +Strang Ave [(-122.1087,37.034),(-122.1076,37.037)] +Stratford Ave [(-121.9696,37.271),(-121.9732,37.254)] +Stratton Common [(-121.983399,37.43226),(-121.983217,37.43097)] +Stream [(-121.574573,37.54948),(-121.574039,37.57213)] +Stream [(-121.648853,37.05723),(-121.651539,37.14924)] +Strobridge Ave [(-122.0884,37.911),(-122.0882,37.908)] +Strong Way [(-122.102446,37.04885),(-122.101424,37.05337)] +Stuart St [(-122.2518,37.6),(-122.2507,37.601),(-122.2491,37.606)] +Stuart St [(-122.2554,37.601),(-122.2541,37.602)] +Suddard Ct [(-121.9057,37.823),(-121.9064,37.822)] +Sueirro St [(-122.1113,37.628),(-122.1121,37.627)] +Suffolk Way [(-121.8699,37.932),(-121.8732,37.92)] +Sulphur Dr [(-122.0517,37.719),(-122.0506,37.715)] +Sulphur Creek [(-122.058701,37.76216),(-122.0609,37.772)] +Sulphur Creek [(-122.0655,37.766),(-122.0659,37.764)] +Sumatra St [(-122.0743,37.277),(-122.0751,37.276)] +Summit Road [(-122.2464,37.816),(-122.2447,37.82)] +Summit Road [(-122.2479,37.874),(-122.2478,37.87)] +Sun Valley Dr [(-122.1174,37.493),(-122.1173,37.488)] +Sun Valley Dr [(-122.1191,37.47),(-122.1201,37.465)] +Sundale Dr [(-121.976,37.481),(-121.9776,37.464)] +Sundale Dr [(-121.982028,37.41595),(-121.98231,37.41254)] +Sundale Dr [(-121.9836,37.315),(-121.9809,37.301)] +Sundale Dr [(-121.9868,37.342),(-121.9867,37.338)] +Sundance Dr [(-121.9113,37.988),(-121.9097,37.992)] +Sundberg Ave [(-122.1667,37.119),(-122.1659,37.116)] +Sunnybank Pl [(-122.051879,37.78503),(-122.052,37.782)] +Sunnydale Ct [(-122.0429,37.203),(-122.0429,37.2)] +Sunnyhills Road [(-122.2257,37.111),(-122.2246,37.114)] +Sunnymere Ave [(-122.1681,37.776),(-122.1672,37.77)] +Sunnymere Ave [(-122.1707,37.791),(-122.1699,37.786)] +Sunnymere Ave [(-122.1729,37.803),(-122.1718,37.795)] +Sunnyside Ave [(-122.2469,37.232),(-122.2453,37.221)] +Sunnyside St [(-122.1564,37.386),(-122.1559,37.38)] +Sunnyside St [(-122.1611,37.462),(-122.1604,37.453)] +Sunol Blvd [(-121.8805,37.447),(-121.8807,37.422)] +Sunol Road [(-122.1254,37.671),(-122.1254,37.666)] +Sunol Ridge Trl [(-121.9419,37.455),(-121.9345,37.38)] +Sunrise Dr [(-121.7347,37.066),(-121.7343,37.069)] +Sunset Ave [(-122.2176,37.901),(-122.2173,37.908)] +Sunset Blvd [(-122.0899,37.779),(-122.0888,37.788)] +Sunset Blvd [(-122.0932,37.755),(-122.0921,37.761)] +Sunset Blvd [(-122.0944,37.75),(-122.0941,37.751)] +Sunset Trl [(-122.2375,37.574),(-122.2372,37.571)] +Sunshine Pl [(-122.097403,37.11209),(-122.096541,37.11436)] +Sunstream Lane [(-121.7345,37.059),(-121.7347,37.066)] +Sunwood Dr [(-121.9332,37.113),(-121.9335,37.132)] +Superior Ave [(-122.142,37.324),(-122.1422,37.315)] +Superior Dr [(-121.7724,37.543),(-121.7727,37.543)] +Surry Pl [(-122.0052,37.685),(-122.006,37.679)] +Sussex Way [(-122.0657,37.227),(-122.0669,37.222),(-122.0673,37.219)] +Suter St [(-122.2009,37.89),(-122.2007,37.888)] +Suter St [(-122.2072,37.94),(-122.2061,37.931)] +Sutter Dr [(-121.9893,37.359),(-121.987,37.35)] +Sutter Dr [(-121.9951,37.377),(-121.9943,37.373)] +Sutter Gate Ave [(-121.8838,37.866),(-121.8845,37.864)] +Sutton Loop [(-121.9994,37.586),(-121.9981,37.576)] +Swan Dr [(-121.7996,37.845),(-121.7991,37.834)] +Sybil Ave [(-122.1443,37.213),(-122.1435,37.215)] +Sycamore Ave [(-122.0759,37.633),(-122.0752,37.636)] +Sycamore Ave [(-122.0826,37.609),(-122.0818,37.606)] +Sycamore St [(-122.0361,37.294),(-122.0354,37.291)] +Sycamore St [(-122.2715,37.16),(-122.2739,37.163)] +Sydney Ave [(-121.7678,37.636),(-121.7669,37.636)] +Sydney Cir [(-122.098211,37.07652),(-122.09723,37.06547)] +Sylvan Glen [(-122.065238,37.685),(-122.065615,37.67879)] +Sylvaner Dr [(-121.8475,37.61),(-121.8482,37.607)] +Sylvaner Way [(-121.907301,37.67596),(-121.908111,37.67419)] +Sylvester Dr [(-122.041,37.815),(-122.0405,37.812)] +Sylvia Cir [(-121.860125,37.6435),(-121.8603,37.64325)] +Tacchella Way [(-121.994785,37.62496),(-121.994311,37.61417)] +Tahiti Lane [(-122.2411,37.343),(-122.240607,37.3499),(-122.2401,37.357)] +Talbot Ave [(-122.2925,37.847),(-122.2925,37.843)] +Talbot Ave [(-122.2967,37.989),(-122.2964,37.975),(-122.2959,37.959)] +Tallahassee St [(-122.0989,37.352),(-122.1012,37.345)] +Tamalpais Path [(-122.2596,37.866),(-122.2599,37.872)] +Tamalpais Road [(-122.2593,37.836),(-122.2588,37.842)] +Tamarack Dr [(-121.9207,37.159),(-121.922,37.155)] +Tamarack Dr [(-121.9255,37.155),(-121.9266,37.156)] +Tamarack Dr [(-121.9304,37.16),(-121.9313,37.163)] +Tamarack Dr [(-121.932412,37.17516),(-121.9327,37.179)] +Tamayo St [(-122.0184,37.732),(-122.019,37.729)] +Tamayo St [(-122.0201,37.723),(-122.0204,37.72)] +Tampa Ave [(-122.0747,37.327),(-122.0747,37.314),(-122.0746,37.308)] +Tanager Dr [(-121.8775,37.831),(-121.8778,37.838)] +Tanglewood Path [(-122.2431,37.628),(-122.2427,37.626)] +Tarraville Creek [(-121.52544,37.95569),(-121.525089,37.948)] +Tarraville Creek [(-121.528505,37.9837),(-121.528147,37.97997)] +Tarraville Creek [(-121.53429,37.98943),(-121.532627,37.98722)] +Tarraville Creek [(-121.536091,37.99721),(-121.536763,37)] +Tarraville Creek Road [(-121.52582,37.96459),(-121.525715,37.96296)] +Tarraville Creek Road [(-121.530642,37.9828),(-121.530608,37.98278)] +Tartarian St [(-122.1774,37.35),(-122.1768,37.352)] +Tassajara Road [(-121.8709,37.099),(-121.8713,37.048)] +Tassajara Creek [(-121.87866,37.98898),(-121.8782,37.015)] +Tassajara Creek [(-121.8862,37.901),(-121.8847,37.924)] +Taurus Ave [(-122.2159,37.416),(-122.2128,37.389)] +Taylor Ave [(-122.0547,37.245),(-122.0541,37.241),(-122.0535,37.237)] +Taylor Ave [(-122.280873,37.72975),(-122.280388,37.72958)] +Teakwood St [(-122.1109,37.58),(-122.1104,37.574)] +Technology Dr [(-121.9539,37.109),(-121.9536,37.099)] +Telegraph Ave [(-122.2581,37.635),(-122.2583,37.625)] +Telegraph Ave [(-122.2585,37.616),(-122.2586,37.607)] +Telegraph Ave [(-122.2589,37.588),(-122.2591,37.578)] +Telegraph Ave [(-122.2594,37.547),(-122.2596,37.541)] +Telegraph Ave [(-122.2614,37.411),(-122.2613,37.414)] +Telegraph Ave [(-122.2618,37.384),(-122.261742,37.38806)] +Telegraph Ave [(-122.2625,37.353),(-122.2623,37.361)] +Telegraph Ave [(-122.2647,37.266),(-122.2647,37.274)] +Telegraph Ave [(-122.2679,37.147),(-122.2678,37.149)] +Telegraph Ave [(-122.2688,37.109),(-122.2686,37.114)] +Telegraph Ave [(-122.2693,37.089),(-122.2691,37.096)] +Telegraph Ave [(-122.2699,37.067),(-122.2697,37.074)] +Temescal Cir [(-122.282639,37.36326),(-122.28206,37.3665)] +Temescal Creek [(-122.284945,37.36017),(-122.2855,37.359)] +Temescal Creek [(-122.2922,37.344),(-122.2937,37.341)] +Tennyson Road [(-122.056941,37.35835),(-122.0562,37.36)] +Tennyson Road [(-122.0605,37.352),(-122.0602,37.354)] +Tennyson Road [(-122.062,37.345),(-122.0625,37.343)] +Tennyson Road [(-122.0682,37.318),(-122.0685,37.317)] +Tennyson Road [(-122.0891,37.317),(-122.0927,37.317)] +Tennyson Road [(-122.1035,37.272),(-122.1041,37.268)] +Terrace St [(-122.2539,37.299),(-122.2523,37.321)] +Terrace Walk [(-122.2719,37.89),(-122.2705,37.884)] +Tesla Road [(-121.570042,37.38752),(-121.573978,37.37661)] +Tesla Road [(-121.588398,37.4085),(-121.596897,37.4397)] +Tesla Road [(-121.613819,37.51806),(-121.62334,37.46389)] +Tesla Road [(-121.646458,37.4545),(-121.646946,37.45847)] +Tesla Road [(-121.6705,37.607),(-121.667684,37.55608)] +Tesla Road [(-121.6774,37.632),(-121.675,37.633)] +Tevis St [(-122.2011,37.621),(-122.2007,37.616)] +Tevlin St [(-122.2866,37.83),(-122.2871,37.819)] +Texas St [(-122.2087,37.942),(-122.2076,37.937)] +Thackeray Ave [(-122.072,37.305),(-122.0715,37.298)] +The Cir [(-122.2721,37.904),(-122.2718,37.905)] +The Cres [(-122.2534,37.945),(-122.254,37.941)] +The Alameda [(-122.2749,37.863),(-122.2744,37.855)] +The Alameda [(-122.276,37.89),(-122.2759,37.882)] +The Alameda [(-122.2765,37.916),(-122.2762,37.902)] +The Alameda [(-122.2805,37.996),(-122.2808,37.988)] +The South Crossways [(-122.2442,37.529),(-122.2443,37.522)] +The Uplands [(-122.2477,37.545),(-122.246,37.543),(-122.245,37.538)] +Theresa Way [(-121.7273,37.877),(-121.7272,37.868)] +Theresa Way [(-121.7289,37.906),(-121.728,37.899)] +Theta St [(-122.0181,37.565),(-122.018394,37.56324)] +Theta St [(-122.0197,37.553),(-122.02,37.55)] +Thomas Ave [(-122.2487,37.375),(-122.2479,37.39)] +Thornhill Dr [(-122.204,37.39),(-122.201,37.389)] +Thornhill Dr [(-122.2131,37.335),(-122.2112,37.35)] +Thornton Ave [(-122.0036,37.671),(-122.0048,37.66)] +Thornton Ave [(-122.0068,37.644),(-122.0083,37.63)] +Thornton Ave [(-122.0127,37.583),(-122.0132,37.575)] +Thornton Ave [(-122.0164,37.537),(-122.0175,37.523)] +Thornton Ave [(-122.0211,37.477),(-122.0214,37.473)] +Thornton Ave [(-122.0291,37.379),(-122.03,37.37)] +Thornton Ave [(-122.0636,37.335),(-122.0626,37.303)] +Thornton St [(-122.1505,37.215),(-122.1526,37.206)] +Thornton St [(-122.1572,37.189),(-122.1576,37.188)] +Thousand Oaks Blvd [(-122.2799,37.975),(-122.2779,37.972)] +Thousand Oaks Blvd [(-122.283,37.972),(-122.2824,37.974)] +Tidal Canal [(-122.2302,37.697),(-122.229,37.694)] +Tidal Canal [(-122.2428,37.791),(-122.2386,37.745)] +Tidewater Ave [(-122.2193,37.625),(-122.2174,37.609)] +Tideway Dr [(-122.2877,37.692),(-122.2854,37.704)] +Tiffin Road [(-122.2086,37.069),(-122.2076,37.07)] +Tilgrim Way [(-122.0831,37.211),(-122.084,37.211)] +Timber St [(-122.0175,37.38),(-122.0139,37.362)] +Timbercreek Ter [(-121.9527,37.351),(-121.952496,37.35039)] +Timpanogas Cir [(-121.963,37.752),(-121.962723,37.74924)] +Tina Way [(-122.0322,37.185),(-122.0305,37.196)] +Tinder Ct [(-122.0496,37.109),(-122.0488,37.12)] +Tioga Ct [(-121.847804,37.6667),(-121.848197,37.66978)] +Tissiack Way [(-121.920364,37),(-121.9208,37.995)] +Toler Ave [(-122.1575,37.269),(-122.1593,37.261)] +Tonopah Ct [(-121.914,37.684),(-121.9138,37.682)] +Topawa Dr [(-121.9204,37.878),(-121.9197,37.88)] +Toroges Creek [(-121.9217,37.808),(-121.922457,37.80485)] +Toroges Creek [(-121.925,37.795),(-121.9268,37.789)] +Torrano Ave [(-122.0685,37.547),(-122.0679,37.551)] +Tory Way [(-121.9162,37.139),(-121.917,37.132)] +Totterdell St [(-122.187,37.228),(-122.1864,37.224)] +Touriga Dr [(-121.8512,37.611),(-121.851283,37.60893)] +Touriga Dr [(-121.8512,37.644),(-121.8511,37.648)] +Touriga Dr [(-121.8521,37.566),(-121.8523,37.559)] +Towers St [(-122.1296,37.096),(-122.1286,37.089)] +Toyon Pl [(-122.0469,37.951),(-122.0464,37.953)] +Tozier St [(-122.0502,37.394),(-122.0497,37.39)] +Trade Wind Lane [(-121.9887,37.294),(-121.9891,37.288)] +Trafalgar Ave [(-122.1036,37.369),(-122.1043,37.375)] +Treeview St [(-122.0379,37.267),(-122.0375,37.262)] +Treeview St [(-122.039,37.282),(-122.0387,37.278)] +Tremont St [(-122.267,37.503),(-122.2672,37.514)] +Trenery Dr [(-121.866449,37.88045),(-121.866515,37.88044)] +Trenton Dr [(-122.0655,37.155),(-122.0647,37.142)] +Trestle Glen Road [(-122.221239,37.12059),(-122.2207,37.125),(-122.2201,37.133)] +Trimingham Dr [(-121.871338,37.76396),(-121.872239,37.76736)] +Trojan Ave [(-122.144,37.868),(-122.1446,37.867)] +Trojan Ave [(-122.1467,37.864),(-122.1483,37.862)] +Trojan Ave [(-122.1514,37.858),(-122.1522,37.857)] +Trombas Ave [(-122.1428,37.217),(-122.1425,37.211)] +Tropicana Way [(-122.0492,37.892),(-122.050057,37.88256),(-122.0513,37.874)] +Truman Pl [(-121.9933,37.285),(-121.9938,37.279)] +Tudor Road [(-122.1808,37.216),(-122.1801,37.216)] +Tulare Ave [(-122.2811,37.889),(-122.2816,37.868)] +Tule Lake Lane [(-122.0568,37.871),(-122.0559,37.866)] +Tulip Ave [(-122.1901,37.881),(-122.1898,37.877)] +Tumbleweed Ct [(-122.0715,37.906),(-122.0718,37.908)] +Tunnel Road [(-122.2382,37.555),(-122.2374,37.553)] +Tunnel Road [(-122.2405,37.574),(-122.2402,37.57)] +Tunnel Road [(-122.2427,37.581),(-122.2414,37.579)] +Tunnel Creek [(-121.610752,37.58239),(-121.624698,37.83019)] +Tupelo Ter [(-122.059087,37.6113),(-122.057021,37.59942)] +Tupelo Ter [(-122.061851,37.62675),(-122.0606,37.62)] +Turban Ct [(-121.9737,37.141),(-121.9729,37.143)] +Turnstone Ct [(-121.7967,37.812),(-121.7967,37.814)] +Turquoise St [(-121.918671,37.20347),(-121.918562,37.20173)] +Twain Ave [(-122.2574,37.904),(-122.2563,37.907)] +Twin Peaks Ter [(-121.9785,37.427),(-121.9783,37.431)] +Tyee Ct [(-122.084,37.918),(-122.084,37.913)] +Tyler Lane [(-122.0674,37.157),(-122.066,37.146)] +Tyler Pl [(-121.9973,37.293),(-121.9986,37.289)] +Tyler St [(-122.2782,37.525),(-122.278041,37.52523)] +Tyrrell Ave [(-122.0709,37.334),(-122.0708,37.329)] +Tyrrell Ave [(-122.0751,37.441),(-122.0759,37.428)] +Ulmeca Pl [(-121.9129,37.786),(-121.9125,37.779)] +Underwood Ave [(-122.0823,37.477),(-122.0822,37.469)] +Underwood Ave [(-122.1852,37.828),(-122.1846,37.809)] +Union St [(-121.9578,37.334),(-121.9584,37.33)] +Union St [(-122.2527,37.731),(-122.2521,37.739)] +Union St [(-122.2555,37.689),(-122.2549,37.698)] +Union St [(-122.2579,37.654),(-122.2573,37.663)] +Union St [(-122.2839,37.21),(-122.2833,37.227)] +Union St [(-122.2854,37.164),(-122.2852,37.178),(-122.2844,37.195)] +Union St [(-122.2862,37.14),(-122.2858,37.152)] +Union St [(-122.2881,37.092),(-122.2876,37.107)] +Union St [(-122.2898,37.042),(-122.2897,37.044)] +Union City Blvd [(-122.0674,37.657),(-122.0669,37.654)] +Union City Blvd [(-122.078284,37.74531),(-122.078001,37.74022)] +Union City Blvd [(-122.0791,37.76),(-122.0786,37.751)] +Union City Blvd [(-122.0795,37.923),(-122.0797,37.907)] +Union City Blvd [(-122.0797,37.883),(-122.0797,37.878)] +Union City Blvd [(-122.0797,37.964),(-122.0797,37.959)] +Union City Blvd [(-122.0805,37.986),(-122.0804,37.972)] +University Ave [(-122.2711,37.718),(-122.27,37.719)] +University Dr [(-122.0275,37.971),(-122.0264,37.97)] +Upton Ave [(-122.1298,37.99),(-122.1297,37.984)] +Urban St [(-121.9714,37.412),(-121.971,37.41)] +Usher St [(-122.1276,37.885),(-122.1275,37.865)] +Utah St [(-121.8591,37.68),(-121.8584,37.682)] +Vaca Dr [(-121.9531,37.448),(-121.9531,37.442)] +Val St [(-121.9739,37.325),(-121.9746,37.324)] +Valita Dr [(-122.1417,37.192),(-122.141,37.195)] +Valle Vista Ave [(-122.246,37.162),(-122.2461,37.168)] +Vallecitos Road [(-121.7875,37.454),(-121.7856,37.463),(-121.7822,37.482)] +Vallecitos Road [(-121.8177,37.142),(-121.836,37.053)] +Vallecitos Road [(-121.8631,37.951),(-121.868,37.93)] +Vallecitos Road [(-121.8699,37.916),(-121.8703,37.891)] +Vallecitos Creek [(-121.8423,37.033),(-121.8379,37.094)] +Vallejo St [(-121.9718,37.765),(-121.9719,37.769)] +Vallejo St [(-122.2869,37.46),(-122.2872,37.466)] +Valley Ave [(-121.8591,37.733),(-121.8628,37.76)] +Valley Ave [(-121.8673,37.761),(-121.8677,37.76)] +Valley Ave [(-121.887,37.767),(-121.8878,37.767),(-121.8888,37.767)] +Valley Ave [(-121.8962,37.644),(-121.89632,37.6086),(-121.896359,37.59716)] +Valley Dr [(-121.863815,37.76063),(-121.8644,37.761)] +Valley Dr [(-121.8967,37.761),(-121.8982,37.746)] +Valley Dr [(-121.897701,37.6866),(-121.8972,37.677),(-121.89692,37.66207)] +Valley St [(-122.17,37.16),(-122.1707,37.158)] +Valley Brook Ct [(-122.0479,37.871),(-122.0478,37.867)] +Valley Trails Dr [(-121.9038,37.75),(-121.9029,37.754)] +Valley Trails Dr [(-121.9066,37.776),(-121.9075,37.775),(-121.9084,37.774)] +Valley Trails Dr [(-121.908,37.739),(-121.9075,37.739)] +Valley Trails Dr [(-121.9098,37.756),(-121.91,37.753)] +Valpey Park Ave [(-121.9748,37.188),(-121.9756,37.186)] +Van Ave [(-122.1212,37.142),(-122.1206,37.128)] +Van Buren Ave [(-122.2521,37.111),(-122.2512,37.113)] +Van Mourik Ave [(-122.1718,37.795),(-122.1716,37.801)] +Vancouver Way [(-121.7753,37.665),(-121.7742,37.666)] +Vancouver Way [(-121.7775,37.667),(-121.7768,37.666)] +Vanda Way [(-121.9989,37.807),(-121.9993,37.8)] +Vanderbilt St [(-122.039,37.254),(-122.0386,37.243)] +Vane Common [(-122.056732,37.54797),(-122.056633,37.54543)] +Vargas Road [(-121.9161,37.512),(-121.9165,37.504)] +Vasco Road [(-121.717311,37.99316),(-121.7174,37.971)] +Vasco Road [(-121.7177,37.70674),(-121.7177,37.68228)] +Vasco Road [(-121.7217,37.062),(-121.72,37.039)] +Vasco Road [(-121.7229,37.093),(-121.7228,37.089)] +Vasco Road [(-121.7231,37.108),(-121.7232,37.114)] +Vasco Road [(-121.737,37.725),(-121.7282,37.489)] +Vasquez Ct [(-122.0252,37.029),(-122.025392,37.02756)] +Vassar Ave [(-122.1245,37.952),(-122.1246,37.945)] +Vaughn Ave [(-121.7118,37.061),(-121.7074,37.08)] +Vaughn Ave [(-122.0802,37.053),(-122.0801,37.026)] +Vegas Ave [(-122.075906,37.8929),(-122.0726,37.894)] +Ventura Ave [(-122.2832,37.864),(-122.283509,37.8555)] +Vera Ave [(-122.1318,37.984),(-122.1317,37.977)] +Verdemar Dr [(-122.2454,37.333),(-122.2453,37.335)] +Vergil St [(-122.0685,37.886),(-122.0681,37.88)] +Vermont St [(-122.2424,37.16),(-122.2415,37.168)] +Vernetti Way [(-122.064379,37.90817),(-122.063821,37.90117)] +Vernon Ave [(-122.0039,37.383),(-122.006,37.358)] +Vernon St [(-122.2509,37.179),(-122.2503,37.184)] +Verona Ave [(-121.7808,37.721),(-121.7801,37.721)] +Versailles Ave [(-122.2383,37.577),(-122.2374,37.589)] +Via Alamitos [(-122.1302,37.675),(-122.13,37.668)] +Via Alamitos [(-122.1302,37.704),(-122.1303,37.697)] +Via Amigos [(-122.1406,37.731),(-122.1424,37.722)] +Via Annette [(-122.1389,37.65),(-122.1388,37.631)] +Via Arriba [(-122.122,37.712),(-122.1216,37.702)] +Via Arroyo [(-122.1256,37.835),(-122.1236,37.823)] +Via Barrett [(-122.1495,37.736),(-122.1503,37.733)] +Via Bellita [(-122.121893,37.82393),(-122.12257,37.81959)] +Via Buena Vista [(-122.1366,37.652),(-122.1374,37.651)] +Via Carmen [(-122.1401,37.674),(-122.1397,37.65)] +Via Chiquita [(-122.1321,37.693),(-122.1319,37.681)] +Via Chiquita [(-122.1322,37.708),(-122.1321,37.702)] +Via Chiquita [(-122.1337,37.731),(-122.1333,37.724)] +Via Cordoba [(-122.1246,37.853),(-122.1239,37.853)] +Via de Los Cerros [(-121.901117,37.7212),(-121.900094,37.71647)] +Via de Los Milagros [(-121.8982,37.746),(-121.8975,37.743)] +Via del Prado [(-122.135,37.797),(-122.1339,37.78)] +Via del Sol [(-121.7899,37.624),(-121.7901,37.615)] +Via Diego [(-122.118617,37.81903),(-122.1194,37.814)] +Via el Cerrito [(-122.1337,37.691),(-122.1336,37.676)] +Via Enrico [(-122.1379,37.82),(-122.1389,37.818)] +Via Enrico [(-122.139846,37.81379),(-122.1407,37.81)] +Via Escondido [(-122.1409,37.747),(-122.141278,37.74521)] +Via Escondido [(-122.142774,37.73812),(-122.143583,37.73429)] +Via Esperanza [(-122.1273,37.676),(-122.1302,37.675)] +Via Frances [(-122.1387,37.68),(-122.1386,37.666)] +Via Granada [(-122.121893,37.82393),(-122.1217,37.822)] +Via Harriet [(-122.1474,37.709),(-122.1473,37.691),(-122.1456,37.674)] +Via Hermana [(-122.1433,37.791),(-122.1442,37.786)] +Via la Jolla [(-122.1346,37.699),(-122.1345,37.691)] +Via Lacqua [(-122.1463,37.734),(-122.1471,37.73)] +Via Lucas [(-122.1381,37.71),(-122.1396,37.71)] +Via Manzanas [(-122.1248,37.761),(-122.1265,37.753)] +Via Matero [(-122.116,37.806),(-122.1175,37.797)] +Via Montalvo [(-121.7867,37.962),(-121.7861,37.967)] +Via Natal [(-122.1434,37.684),(-122.1441,37.68)] +Via Natal [(-122.1449,37.677),(-122.1456,37.674)] +Via Nueva [(-122.1461,37.743),(-122.1456,37.738)] +Via Paro [(-122.129,37.78),(-122.1276,37.757)] +Via Peralta [(-121.8941,37.729),(-121.8938,37.726)] +Via Perdido [(-122.1295,37.741),(-122.1281,37.727)] +Via Pinale [(-122.1333,37.793),(-122.1315,37.773)] +Via Primero [(-122.1223,37.774),(-122.1211,37.755)] +Via Redondo [(-122.141,37.7),(-122.1423,37.707)] +Via Rodriguez [(-122.1234,37.809),(-122.1233,37.806)] +Via Segundo [(-122.1207,37.778),(-122.1189,37.765)] +Via Tovita [(-122.1336,37.64),(-122.1356,37.638)] +Via Vega [(-122.1388,37.837),(-122.1389,37.818)] +Via Verde [(-122.1165,37.788),(-122.1175,37.782)] +Via Vista [(-122.1364,37.745),(-122.1391,37.735)] +Via Zapata [(-121.9434,37.147),(-121.9441,37.161)] +Vicente Pl [(-122.2329,37.572),(-122.232,37.578)] +Vicente St [(-122.2598,37.427),(-122.2598,37.432)] +Victor Ave [(-122.1914,37.972),(-122.1901,37.964)] +Victor Ave [(-122.1922,37.987),(-122.1918,37.981)] +Victoria Ave [(-122.0739,37.905),(-122.0759,37.903)] +Victoria Lane [(-121.663807,37.54316),(-121.663944,37.56139)] +Victoria Bay [(-122.2363,37.399),(-122.2365,37.393)] +Victory Dr [(-122.1091,37.635),(-122.109281,37.6426)] +View Dr [(-122.1364,37.276),(-122.1295,37.271)] +View Crest Ct [(-122.165164,37.82551),(-122.164162,37.826)] +Village Dr [(-122.0773,37.967),(-122.0766,37.967)] +Village Pkwy [(-121.9256,37.098),(-121.9267,37.113)] +Villareal Dr [(-122.019699,37.15004),(-122.018295,37.15912)] +Villareal Dr [(-122.0204,37.147),(-122.0217,37.142)] +Villareal Dr [(-122.022433,37.10266),(-122.023425,37.09294)] +Vine St [(-121.8603,37.64036),(-121.8601,37.64044)] +Vine St [(-122.2755,37.793),(-122.2743,37.794)] +Vineyard Ave [(-121.8463,37.647),(-121.846448,37.64711)] +Vineyard Ave [(-121.8524,37.648),(-121.8511,37.648)] +Vineyard Ave [(-121.853754,37.648),(-121.853805,37.648)] +Vineyard Road [(-121.919,37.056),(-121.9128,37.069)] +Vineyard Road [(-122.0878,37.2),(-122.0877,37.191)] +Virginia St [(-122.0748,37.47),(-122.0697,37.477)] +Virginia St [(-122.2582,37.78),(-122.2565,37.782),(-122.2557,37.784)] +Virginia St [(-122.2751,37.756),(-122.2739,37.759)] +Virgo Road [(-122.2152,37.415),(-122.2146,37.435)] +Vista Ct [(-121.755,37.84),(-121.7551,37.838)] +Vista del Plaza Lane [(-122.0834,37.809),(-122.0829,37.804)] +Vistamont Ave [(-122.265432,37.0356),(-122.2643,37.029)] +Vivian St [(-122.0831,37.895),(-122.082,37.895)] +Vomac Road [(-121.9367,37.166),(-121.937,37.173)] +Wadsworth Ct [(-121.97,37.249),(-121.9708,37.241)] +Wagner St [(-122.1254,37.959),(-122.1245,37.952)] +Wagoner Dr [(-121.784,37.67),(-121.784,37.663)] +Walker Ave [(-122.2437,37.153),(-122.2433,37.161)] +Walker Pl [(-121.7692,37.537),(-121.7693,37.544)] +Wall St [(-121.7904,37.776),(-121.7893,37.767)] +Walnut Ave [(-121.9689,37.601),(-121.969899,37.59434)] +Walnut Ave [(-121.9804,37.471),(-121.9817,37.456)] +Walnut Ave [(-121.983083,37.44159),(-121.983361,37.43869)] +Walnut St [(-121.769,37.877),(-121.7683,37.88)] +Walnut St [(-121.774,37.863),(-121.7728,37.866)] +Walnut St [(-122.0425,37.262),(-122.0417,37.246)] +Walnut St [(-122.1913,37.734),(-122.1909,37.729)] +Walnut St [(-122.1948,37.763),(-122.1923,37.742)] +Walnut St [(-122.2442,37.682),(-122.2437,37.69)] +Walnut St [(-122.2465,37.648),(-122.2459,37.658)] +Walnut St [(-122.2489,37.613),(-122.2483,37.622)] +Walnut St [(-122.2675,37.804),(-122.2672,37.785)] +Walpert St [(-122.07476,37.6893),(-122.073488,37.69487)] +Warbler Loop [(-122.0601,37.813),(-122.0597,37.793)] +Ward St [(-122.2838,37.575),(-122.2827,37.575)] +Ward Creek [(-122.0568,37.644),(-122.058701,37.64815)] +Ward Creek [(-122.0717,37.679),(-122.077,37.657)] +Ward Creek Branch [(-122.0615,37.62),(-122.069914,37.64417)] +Warfield Ave [(-122.2403,37.16),(-122.2382,37.178)] +Warfield Ave [(-122.2404,37.153),(-122.2402,37.157)] +Warfield Ave [(-122.244,37.124),(-122.2435,37.13)] +Warm Springs Blvd [(-121.9184,37.728),(-121.9168,37.703)] +Warm Springs Blvd [(-121.9209,37.769),(-121.9198,37.751)] +Warm Springs Blvd [(-121.9258,37.851),(-121.9247,37.833)] +Warm Springs Blvd [(-121.933956,37),(-121.9343,37.97)] +Warner Ave [(-122.0249,37.096),(-122.024,37.103)] +Warner Ave [(-122.1579,37.477),(-122.1571,37.482)] +Warren Ave [(-121.9285,37.866),(-121.9302,37.859)] +Warren Ave [(-121.9314,37.855),(-121.933,37.849)] +Warsaw Ave [(-121.7714,37.623),(-121.77064,37.6268)] +Warwick Pl [(-122.0498,37.647),(-122.0487,37.634)] +Warwick Road [(-122.0279,37.791),(-122.0282,37.787)] +Warwick Road [(-122.029,37.777),(-122.0298,37.768)] +Wasatch Dr [(-121.962,37.752),(-121.9623,37.756)] +Washburn Dr [(-121.9877,37.739),(-121.9881,37.728)] +Washington Ave [(-122.1378,37.897),(-122.1379,37.891)] +Washington Ave [(-122.1379,37.959),(-122.1379,37.954)] +Washington Ave [(-122.1491,37.154),(-122.149,37.151),(-122.1485,37.144)] +Washington Ave [(-122.1536,37.222),(-122.1534,37.217)] +Washington Ave [(-122.2912,37.932),(-122.2903,37.931)] +Washington Ave [(-122.301,37.919),(-122.3001,37.921)] +Washington Ave [(-122.3033,37.9),(-122.3023,37.905)] +Washington Blvd [(-121.9418,37.314),(-121.9422,37.314)] +Washington Blvd [(-121.9512,37.335),(-121.9522,37.335)] +Washington Blvd [(-121.9557,37.328),(-121.9584,37.33)] +Washington St [(-121.8615,37.684),(-121.8596,37.694)] +Washington St [(-122.2355,37.537),(-122.2347,37.532)] +Washington St [(-122.2378,37.553),(-122.237,37.548)] +Washington St [(-122.2405,37.568),(-122.24,37.566)] +Washington St [(-122.2772,37.965),(-122.2769,37.97)] +Washo Dr [(-121.9213,37.117),(-121.9204,37.114)] +Waterfall Isle [(-122.2699,37.668),(-122.2694,37.677)] +Waterford Pl [(-122.0472,37.026),(-122.0473,37.021)] +Watts St [(-122.2805,37.28),(-122.2804,37.285)] +Waverly Way [(-121.7634,37.94),(-121.762632,37.94055)] +Webb Ave [(-122.0975,37.89),(-122.0971,37.894)] +Webster St [(-122.0593,37.39),(-122.0587,37.393)] +Webster St [(-122.2474,37.563),(-122.2461,37.562)] +Webster St [(-122.2595,37.33),(-122.2596,37.337)] +Webster St [(-122.2599,37.305),(-122.2596,37.313)] +Webster St [(-122.2643,37.145),(-122.2642,37.152)] +Webster St [(-122.2691,37.026),(-122.2687,37.033)] +Webster St [(-122.2703,37.005),(-122.2699,37.011)] +Webster St [(-122.2724,37.97),(-122.272,37.977)] +Webster St [(-122.2752,37.925),(-122.2746,37.936)] +Webster St [(-122.276,37.775),(-122.276,37.785)] +Webster St [(-122.276,37.809),(-122.276,37.841)] +Webster St [(-122.276,37.903),(-122.276,37.913)] +Welch Creek [(-121.8107,37.349),(-121.8012,37.397)] +Welch Creek Road [(-121.7695,37.386),(-121.7737,37.413)] +Welch Creek Road [(-121.7895,37.36),(-121.7717,37.218)] +Welch Creek Road [(-121.844,37.37),(-121.8289,37.315)] +Weld St [(-122.1827,37.64),(-122.181,37.623)] +Welk Com [(-122.036356,37.86914),(-122.036265,37.8618)] +Wellington Pl [(-122.0242,37.628),(-122.0227,37.632)] +Wente St [(-121.7486,37.661),(-121.7486,37.65715)] +Wentworth Ave [(-122.1997,37.698),(-122.1986,37.698)] +Wesley Ave [(-122.2457,37.068),(-122.2446,37.078)] +Wesley Ave [(-122.2482,37.056),(-122.2476,37.059)] +West St [(-122.1066,37.48),(-122.108083,37.47375)] +West St [(-122.2719,37.243),(-122.2717,37.251)] +West St [(-122.2754,37.136),(-122.2751,37.141)] +West St [(-122.276,37.124),(-122.2756,37.131)] +West Loop Road [(-122.0576,37.604),(-122.0602,37.586)] +Westbrook Pl [(-121.7787,37.565),(-121.7784,37.564)] +Westchester St [(-122.031,37.135),(-122.0293,37.136)] +Western Ave [(-122.1365,37.049),(-122.1358,37.044)] +Western Blvd [(-122.1004,37.792),(-122.0983,37.778)] +Western Blvd [(-122.1043,37.819),(-122.1023,37.805)] +Western Pacific Railroad [(-121.628112,37.31406),(-121.628315,37.31524)] +Western Pacific Railroad [(-121.6953,37.215),(-121.6955,37.223)] +Western Pacific Railroad [(-121.95686,37.6508),(-121.9548,37.598)] +Western Pacific Railroad [(-122.0302,37.963),(-122.0302,37.99)] +Western Pacific Railroad Spur [(-122.0394,37.018),(-122.0394,37.961)] +Westminster Dr [(-122.2409,37.406),(-122.2391,37.413)] +Westover Dr [(-122.1985,37.286),(-122.1959,37.302)] +Westview Pl [(-122.2309,37.588),(-122.2303,37.585)] +Westwood Ave [(-122.0079,37.454),(-122.008033,37.45)] +Westwood Pl [(-122.0773,37.36),(-122.078,37.362)] +Whalebone Way [(-122.0592,37.244),(-122.059,37.242)] +Whimbrel Road [(-122.0439,37.832),(-122.0432,37.828)] +Whimbrel Road [(-122.045,37.842),(-122.0447,37.839)] +Whipple Road [(-122.0532,37.059),(-122.0576,37.059)] +Whipple Road [(-122.0676,37.055),(-122.0678,37.057),(-122.0752,37.057)] +Whispering Pine Ct [(-122.06,37.222),(-122.0608,37.226)] +Whitaker Ave [(-122.2555,37.909),(-122.2554,37.912)] +Whitecap Way [(-121.991567,37.28508),(-121.99096,37.28222)] +Whitlock Creek [(-121.74683,37.91276),(-121.733107,37)] +Whitman St [(-122.0633,37.399),(-122.063,37.392)] +Whitman St [(-122.072,37.54),(-122.0712,37.53)] +Whitney Pl [(-121.9168,37.703),(-121.9188,37.695)] +Wicks Blvd [(-122.1596,37.856),(-122.1578,37.833)] +Wicks Blvd [(-122.163486,37.97094),(-122.1632,37.966),(-122.1624,37.936)] +Wilbeam Ave [(-122.0759,37.936),(-122.076,37.932)] +Wilbur St [(-122.21,37.039),(-122.2093,37.034)] +Wild Current Way [(-122.1987,37.395),(-122.1993,37.402)] +Wildcat Ct [(-121.94693,37.08767),(-121.947193,37.08295)] +Wildcat Canyon Road [(-122.2628,37.035),(-122.264,37.041)] +Wildcat Canyon Road [(-122.2658,37.046),(-122.264,37.041)] +Wildwood Ave [(-122.2341,37.194),(-122.2328,37.199)] +Wiley St [(-122.1553,37.93),(-122.1548,37.921),(-122.1546,37.916)] +Willard Way [(-122.0871,37.169),(-122.0843,37.177)] +Williams St [(-122.1568,37.179),(-122.1577,37.175)] +Williams St [(-122.1634,37.151),(-122.164,37.148)] +Williams St [(-122.1649,37.143),(-122.1655,37.141)] +Willimet Way [(-122.0964,37.517),(-122.0949,37.493)] +Willow Ave [(-122.1012,37.748),(-122.1002,37.754)] +Willow Ave [(-122.16,37.961),(-122.1608,37.96)] +Willow St [(-122.0519,37.279),(-122.0517,37.275)] +Willow St [(-122.2459,37.711),(-122.2453,37.72)] +Willow St [(-122.2494,37.661),(-122.2487,37.67)] +Willow St [(-122.2516,37.627),(-122.251,37.635)] +Willow St [(-122.2559,37.567),(-122.2551,37.58)] +Willow St [(-122.2913,37.184),(-122.2901,37.198),(-122.2891,37.212)] +Willow St [(-122.2998,37.077),(-122.2996,37.081)] +Willow Walk [(-122.2364,37.572),(-122.23664,37.5678)] +Willowood Dr [(-122.0126,37.498),(-122.0096,37.483)] +Wilson Ave [(-122.0751,37.073),(-122.0727,37.07)] +Wilson Cir [(-122.246849,37.81463),(-122.2468,37.815)] +Winding Lane [(-121.931438,37.07849),(-121.9306,37.078)] +Windmill Ct [(-121.9163,37.948),(-121.9167,37.944)] +Windmill Lane [(-121.8688,37.531),(-121.8678,37.532)] +Windsor Dr [(-122.1125,37.071),(-122.1105,37.048)] +Windsor Dr [(-122.2303,37.673),(-122.2289,37.665)] +Windsor Pl [(-121.7781,37.521),(-121.7781,37.525)] +Windsor Way [(-121.7772,37.521),(-121.7762,37.521)] +Wingate Way [(-122.0652,37.838),(-122.0643,37.846)] +Winslow Ter [(-122.059185,37.53928),(-122.058347,37.5363)] +Winsor Ave [(-122.2356,37.203),(-122.2351,37.203)] +Winthrope St [(-122.1559,37.694),(-122.1548,37.678)] +Winton Ave [(-122.1151,37.533),(-122.1165,37.532)] +Winton Ave [(-122.1231,37.533),(-122.1231,37.53)] +Wisconsin St [(-122.1927,37.945),(-122.1921,37.94)] +Wisconsin St [(-122.1945,37.965),(-122.1939,37.959)] +Wisconsin St [(-122.1994,37.017),(-122.1975,37.998),(-122.1971,37.994)] +Wistaria Way [(-122.2251,37.182),(-122.2249,37.188)] +Wisteria Dr [(-121.9362,37.373),(-121.9363,37.367)] +Wisteria Dr [(-121.9369,37.398),(-121.9369,37.391)] +Wisteria Way [(-121.7322,37.118),(-121.7332,37.114)] +Wixon Dr [(-121.9613,37.199),(-121.9604,37.18)] +Wolcott Dr [(-121.9568,37.393),(-121.9564,37.389)] +Wood Dr [(-122.2194,37.28),(-122.2174,37.266)] +Wood St [(-121.762,37.839),(-121.7611,37.834)] +Wood St [(-122.2993,37.107),(-122.2988,37.113)] +Wood St [(-122.302,37.06),(-122.3019,37.066)] +Woodcrest Dr [(-121.9579,37.225),(-121.9589,37.224)] +Woodhaven Way [(-122.208,37.417),(-122.2045,37.411)] +Woodhue Ter [(-122.046987,37.6207),(-122.047212,37.62529)] +Woodridge Dr [(-122.0631,37.836),(-122.0616,37.82)] +Woodroe Ave [(-122.0536,37.855),(-122.0534,37.847)] +Woodroe Ave [(-122.0539,37.888),(-122.054,37.891)] +Woodruff Ave [(-122.2214,37.03),(-122.2206,37.057)] +Woolsey St [(-122.2553,37.538),(-122.2545,37.538)] +Wooster Ct [(-122.023499,37.15118),(-122.0237,37.147)] +Worth St [(-122.1903,37.362),(-122.1903,37.365)] +Worth St [(-122.1915,37.378),(-122.1916,37.379)] +Wp Railroad [(-121.7675,37.848),(-121.765632,37.85375),(-121.7636,37.86)] +Wp Railroad [(-121.7864,37.791),(-121.7761,37.822)] +Wp Railroad [(-121.813721,37.75618),(-121.8049,37.765)] +Wp Railroad [(-121.8346,37.733),(-121.8259,37.743)] +Wp Railroad [(-121.874759,37.65728),(-121.8727,37.665)] +Wp Railroad [(-121.8804,37.27),(-121.8806,37.272),(-121.88678,37.36528)] +Wp Railroad [(-121.882149,37.57458),(-121.8813,37.585)] +Wp Railroad [(-121.8861,37.94),(-121.8847,37.952)] +Wp Railroad [(-121.9304,37.856),(-121.9268,37.789)] +Wp Railroad [(-121.958612,37.67823),(-121.9581,37.67)] +Wp Railroad [(-122.0223,37.959),(-122.0211,37.949)] +Wp Railroad [(-122.0476,37.214),(-122.0473,37.196)] +Wp Railroad [(-122.0755,37.589),(-122.0731,37.56)] +Wp Railroad [(-122.1877,37.466),(-122.1834,37.43)] +Wp Railroad [(-122.2043,37.608),(-122.203628,37.60237)] +Wp Railroad [(-122.2145,37.694),(-122.2137,37.688)] +Wp Railroad [(-122.2342,37.806),(-122.2295,37.777)] +Wp Railroad [(-122.2434,37.865),(-122.241,37.851)] +Wp Railroad [(-122.254,37.902),(-122.2506,37.891)] +Wp Railroad [(-122.262,37.923),(-122.2607,37.921)] +Wp Railroad [(-122.2693,37.949),(-122.2682,37.945)] +Wrenn St [(-122.2063,37.117),(-122.2056,37.117)] +Wyndham Pl [(-122.027,37.724),(-122.0286,37.73)] +Xavier Way [(-121.7458,37.778),(-121.7459,37.77)] +Xavier Common [(-122.049697,37.64509),(-122.050346,37.64313)] +Yale Ave [(-122.1205,37.913),(-122.1205,37.907)] +Yale Way [(-121.9443,37.098),(-121.9482,37.092)] +Yampa Way [(-121.9117,37.641),(-121.9109,37.644)] +Yellowstone Park Dr [(-121.9686,37.111),(-121.9705,37.117)] +Yerba Buena Ave [(-122.2789,37.301),(-122.2843,37.29)] +Yerba Buena Pl [(-121.9602,37.678),(-121.9595,37.683)] +Yerba Buena St [(-121.960541,37.6819),(-121.9602,37.678)] +Ygnacio Ave [(-122.2103,37.756),(-122.2098,37.754)] +Yolo Ave [(-122.274,37.85),(-122.273,37.855)] +York Dr [(-121.9212,37.098),(-121.9227,37.104)] +York Dr [(-122.2415,37.283),(-122.2406,37.261)] +Yorktown Road [(-121.9507,37.173),(-121.9513,37.172)] +Yosemite Pl [(-121.8019,37.853),(-121.8024,37.855)] +Yosemite Road [(-122.2767,37.968),(-122.2757,37.958)] +Yosemite Way [(-122.1108,37.4803),(-122.109445,37.48415)] +Zacate Ave [(-121.9575,37.646),(-121.9567,37.64)] +Zacate Ave [(-121.9594,37.662),(-121.9589,37.654)] +Zapata Ct [(-121.9456,37.171),(-121.94565,37.1705)] +Zapotec Dr [(-121.9108,37.899),(-121.9097,37.898)] +Zephyr Ave [(-122.0572,37.107),(-122.0556,37.107)] +Zephyr Ave [(-122.0584,37.107),(-122.0609,37.107)] +Ziegler Ave [(-122.1258,37.483),(-122.125,37.499)] +Zircon Ter [(-122.051254,37.64038),(-122.051126,37.63696)] +100th Ave [(-122.1657,37.429),(-122.1647,37.432)] +100th Ave [(-122.1789,37.364),(-122.1785,37.367)] +101st Ave [(-122.1595,37.438),(-122.1583,37.441)] +104th Ave [(-122.1583,37.417),(-122.1573,37.423)] +104th Ave [(-122.1612,37.411),(-122.1587,37.417)] +104th Ave [(-122.1697,37.375),(-122.1681,37.383)] +105th Ave [(-122.1774,37.325),(-122.1771,37.327)] +106th Ave [(-122.158,37.404),(-122.156,37.409)] +107th Ave [(-122.1555,37.403),(-122.1531,37.41)] +108th Ave [(-122.1474,37.419),(-122.1468,37.423)] +10th St [(-122.0211,37.969),(-122.0198,37.958)] +10th St [(-122.0603,37.402),(-122.0593,37.39)] +10th St [(-122.2541,37.924),(-122.2537,37.92)] +10th St [(-122.2553,37.935),(-122.2545,37.927)] +10th St [(-122.2675,37.002),(-122.2687,37.007)] +10th St [(-122.2886,37.57),(-122.2883,37.56)] +10th St [(-122.2916,37.662),(-122.291,37.644)] +10th St [(-122.2918,37.084),(-122.292,37.085)] +10th St [(-122.2945,37.75),(-122.2939,37.732)] +11th Ave [(-122.2493,37.91),(-122.2483,37.916)] +11th St [(-122.0206,37.952),(-122.0192,37.941),(-122.0185,37.934)] +120 Canal [(-121.587482,37.88204),(-121.587833,37.8825)] +12th Ave [(-122.2396,37.958),(-122.2385,37.965)] +12th St [(-121.896,37.194),(-121.8932,37.194)] +12th St [(-121.9026,37.204),(-121.900288,37.19771),(-121.896959,37.19973)] +12th St [(-122.2163,37.718),(-122.2151,37.712)] +12th St [(-122.2469,37.891),(-122.2459,37.882)] +12th St [(-122.2566,37.974),(-122.256,37.971)] +12th St [(-122.2611,37.996),(-122.262,37.998)] +12th St [(-122.2644,37.006),(-122.2655,37.011)] +12th St [(-122.2807,37.073),(-122.2796,37.068)] +12th St [(-122.2889,37.094),(-122.29,37.094)] +12th St [(-122.2926,37.103),(-122.2937,37.102)] +12th St [(-122.2943,37.103),(-122.2955,37.109),(-122.2964,37.113)] +136th Ave [(-122.1399,37.158),(-122.1371,37.18)] +137th Ave [(-122.1366,37.176),(-122.1351,37.18)] +13th Ave [(-122.235,37.984),(-122.2345,37.99)] +13th Ave [(-122.2396,37.944),(-122.2387,37.95)] +13th St [(-122.0242,37.962),(-122.0231,37.954)] +13th St [(-122.0565,37.386),(-122.0554,37.374)] +13th St [(-122.2628,37.009),(-122.2639,37.014)] +140th Ave [(-122.1386,37.13),(-122.1374,37.14)] +141st Ave [(-122.1368,37.136),(-122.1355,37.147)] +142nd Ave [(-122.1348,37.142),(-122.1336,37.153)] +143rd Ave [(-122.1408,37.077),(-122.1397,37.085)] +145th Ave [(-122.1368,37.082),(-122.1359,37.09)] +148th Ave [(-122.1284,37.119),(-122.1277,37.122)] +14th Ave [(-122.2244,37.028),(-122.2242,37.036)] +14th Ave [(-122.2245,37.036),(-122.2238,37.062)] +14th Ave [(-122.2285,37.981),(-122.2283,37.988)] +14th Ave [(-122.232,37.965),(-122.2293,37.975)] +14th Ave [(-122.2342,37.957),(-122.2332,37.961)] +14th Ave [(-122.2357,37.953),(-122.2354,37.953)] +14th Ave [(-122.2408,37.923),(-122.2407,37.925)] +14th Ave [(-122.2426,37.911),(-122.2419,37.916)] +14th St [(-122.0238,37.949),(-122.0226,37.938)] +14th St [(-122.1178,37.983),(-122.116,37.971)] +14th St [(-122.1212,37.007),(-122.1206,37.002)] +14th St [(-122.1241,37.027),(-122.1235,37.023),(-122.1226,37.017)] +14th St [(-122.1316,37.081),(-122.1287,37.06)] +14th St [(-122.1378,37.124),(-122.1376,37.123)] +14th St [(-122.141,37.147),(-122.1397,37.138)] +14th St [(-122.1457,37.181),(-122.145,37.176)] +14th St [(-122.1562,37.262),(-122.1557,37.253)] +14th St [(-122.1626,37.348),(-122.1621,37.344)] +14th St [(-122.1655,37.387),(-122.165101,37.38001)] +14th St [(-122.1682,37.422),(-122.168,37.419)] +14th St [(-122.1709,37.459),(-122.1704,37.453)] +14th St [(-122.1761,37.529),(-122.1757,37.524),(-122.1754,37.52)] +14th St [(-122.1771,37.544),(-122.1768,37.54)] +14th St [(-122.1845,37.581),(-122.1839,37.579)] +14th St [(-122.1945,37.629),(-122.1936,37.625)] +14th St [(-122.2128,37.717),(-122.2118,37.713)] +14th St [(-122.2288,37.798),(-122.228,37.792)] +14th St [(-122.2419,37.877),(-122.2408,37.871)] +14th St [(-122.2659,37.03),(-122.2671,37.035)] +14th St [(-122.2755,37.068),(-122.2741,37.063)] +14th St [(-122.277,37.073),(-122.2765,37.071)] +14th St [(-122.299,37.147),(-122.3,37.148)] +150th Ave [(-122.1241,37.085),(-122.123984,37.08583)] +150th Ave [(-122.1266,37.065),(-122.1258,37.071)] +152nd Ave [(-122.1218,37.072),(-122.1215,37.075)] +15th St [(-122.0564,37.416),(-122.056,37.411)] +15th St [(-122.2264,37.794),(-122.2258,37.791),(-122.2251,37.789)] +15th St [(-122.241,37.885),(-122.2401,37.879)] +15th St [(-122.2472,37.923),(-122.2464,37.915)] +15th St [(-122.2534,37.976),(-122.2525,37.969)] +163rd Ave [(-122.1108,37.985),(-122.1096,37.995)] +164th Ave [(-122.1068,37.993),(-122.1069,37.998)] +164th Ave [(-122.1101,37.964),(-122.1096,37.968)] +166th Ave [(-122.1008,37.99),(-122.1006,37.997)] +167th Ave [(-122.1012,37.966),(-122.1006,37.973)] +168th Ave [(-122.1046,37.934),(-122.1041,37.938)] +16th Ave [(-122.2391,37.924),(-122.2387,37.928)] +16th Ave [(-122.2422,37.892),(-122.2418,37.896)] +16th Ave [(-122.2438,37.874),(-122.2438,37.876)] +16th St [(-122.054,37.414),(-122.0534,37.405)] +16th St [(-122.231,37.837),(-122.2306,37.834)] +16th St [(-122.2699,37.067),(-122.2713,37.069)] +16th St [(-122.2923,37.129),(-122.2926,37.132)] +170th Ave [(-122.1029,37.924),(-122.1025,37.93)] +170th Ave [(-122.1083,37.891),(-122.1075,37.893)] +171st Ave [(-122.1042,37.908),(-122.1031,37.916)] +173rd Ave [(-122.0984,37.935),(-122.0976,37.936)] +17th Ave [(-122.238,37.918),(-122.2377,37.921)] +17th St [(-122.1947,37.648),(-122.1934,37.637)] +17th St [(-122.2385,37.895),(-122.2375,37.889)] +17th St [(-122.2514,37.99),(-122.2507,37.982)] +17th St [(-122.2607,37.043),(-122.2619,37.047)] +17th St [(-122.2642,37.057),(-122.2655,37.059)] +17th St [(-122.2743,37.087),(-122.2729,37.082)] +17th St [(-122.2898,37.132),(-122.29,37.132)] +17th St [(-122.2938,37.149),(-122.295,37.155)] +18th Ave [(-122.2385,37.895),(-122.2381,37.899)] +18th St [(-122.2205,37.811),(-122.219,37.806)] +18th St [(-122.2424,37.924),(-122.2416,37.918)] +18th St [(-122.2461,37.957),(-122.2453,37.95)] +18th St [(-122.254,37.012),(-122.2535,37.01)] +18th St [(-122.2775,37.106),(-122.2762,37.101)] +18th St [(-122.2775,37.106),(-122.2794,37.109)] +18th St [(-122.2803,37.116),(-122.2814,37.119)] +19th Ave [(-122.2355,37.91),(-122.2351,37.914),(-122.2344,37.922)] +19th Ave [(-122.2366,37.897),(-122.2359,37.905)] +19th Ave [(-122.2386,37.877),(-122.2382,37.881)] +19th Ave [(-122.2394,37.868),(-122.239,37.873)] +19th Ave [(-122.2408,37.854),(-122.2406,37.856)] +19th St [(-122.2488,37.994),(-122.2479,37.986)] +19th St [(-122.2672,37.079),(-122.2685,37.084)] +1st Ave [(-122.2567,37.992),(-122.2558,37.999)] +1st St [(-121.7401,37.018),(-121.7401,37.024)] +1st St [(-121.7402,37.015),(-121.7401,37.018)] +1st St [(-121.7425,37.976),(-121.7417,37.986)] +1st St [(-121.75508,37.89294),(-121.753581,37.90031)] +1st St [(-121.7716,37.805),(-121.7702,37.809)] +1st St [(-121.8728,37.596),(-121.8738,37.587)] +20th Ave [(-122.238,37.867),(-122.2376,37.871)] +20th St [(-122.2327,37.887),(-122.2308,37.876)] +20th St [(-122.2433,37.963),(-122.2424,37.955)] +20th St [(-122.2468,37.994),(-122.2459,37.985)] +20th St [(-122.2912,37.163),(-122.2926,37.17)] +21st Ave [(-122.2341,37.89),(-122.2337,37.893)] +21st Ave [(-122.2368,37.859),(-122.2365,37.865)] +21st Ave [(-122.2385,37.843),(-122.238,37.847)] +21st St [(-122.243,37.975),(-122.2423,37.97)] +21st St [(-122.2624,37.099),(-122.2643,37.102)] +21st St [(-122.2688,37.109),(-122.2719,37.114)] +22nd Ave [(-122.2343,37.871),(-122.2338,37.875)] +22nd St [(-122.2227,37.854),(-122.222,37.851)] +22nd St [(-122.265,37.114),(-122.2655,37.114)] +22nd St [(-122.2756,37.131),(-122.2769,37.136)] +23rd Ave [(-122.2272,37.914),(-122.2266,37.92)] +23rd Ave [(-122.2298,37.892),(-122.2298,37.894)] +23rd Ave [(-122.2339,37.841),(-122.233,37.849)] +23rd Ave [(-122.2357,37.824),(-122.2356,37.825)] +23rd Ave [(-122.2359,37.817),(-122.236,37.82)] +23rd St [(-122.2258,37.878),(-122.2252,37.875)] +23rd St [(-122.228,37.896),(-122.2271,37.89)] +23rd St [(-122.2404,37.982),(-122.2395,37.974)] +23rd St [(-122.2648,37.124),(-122.2658,37.125)] +23rd Av Ovps [(-122.2356,37.768),(-122.235,37.754)] +23rd Av Ovps [(-122.236,37.783),(-122.2356,37.768)] +24th Ave [(-122.2285,37.873),(-122.2277,37.88),(-122.2271,37.89)] +24th St [(-122.233,37.936),(-122.2309,37.923)] +24th St [(-122.2352,37.95),(-122.235,37.948)] +24th St [(-122.2868,37.183),(-122.2877,37.186)] +24th St [(-122.2901,37.198),(-122.2914,37.204)] +25th Ave [(-122.2222,37.94),(-122.222,37.942)] +26th Ave [(-122.2252,37.875),(-122.2244,37.884)] +26th St [(-122.2294,37.939),(-122.2289,37.936)] +26th St [(-122.2739,37.171),(-122.2749,37.172)] +26th St [(-122.2791,37.183),(-122.28,37.185)] +27th Ave [(-122.234,37.773),(-122.2335,37.778)] +27th St [(-122.2224,37.918),(-122.2216,37.912)] +27th St [(-122.2243,37.928),(-122.2231,37.921)] +27th St [(-122.2287,37.945),(-122.2278,37.939)] +27th St [(-122.2625,37.151),(-122.2626,37.154)] +27th St [(-122.2751,37.181),(-122.276,37.18)] +28th St [(-122.2356,37.999),(-122.235,37.994)] +28th St [(-122.2671,37.176),(-122.2684,37.179)] +28th St [(-122.2754,37.192),(-122.2764,37.193)] +29th St [(-122.2633,37.179),(-122.264,37.181)] +29th St [(-122.266,37.183),(-122.2668,37.184)] +29th St [(-122.2693,37.192),(-122.27,37.194)] +29th St [(-122.2707,37.189),(-122.2733,37.194)] +29th Av Ovps [(-122.2323,37.748),(-122.2321,37.752)] +2nd St [(-121.9787,37.76),(-121.9775,37.757)] +2nd St [(-121.9825,37.768),(-121.9806,37.763)] +2nd St [(-121.986342,37.77609),(-121.9854,37.774),(-121.9842,37.772)] +2nd St [(-122.0522,37.685),(-122.05205,37.6854)] +2nd St [(-122.0553,37.679),(-122.0539,37.682)] +2nd St [(-122.0697,37.696),(-122.0674,37.688)] +2nd St [(-122.2781,37.975),(-122.2792,37.979)] +30th St [(-122.2789,37.218),(-122.2801,37.22)] +31st Ave [(-122.2259,37.771),(-122.2254,37.779)] +31st St [(-122.2252,37.982),(-122.224,37.979)] +31st St [(-122.2323,37.995),(-122.2303,37.992)] +31st St [(-122.2728,37.212),(-122.2756,37.217)] +32nd St [(-122.225,37.99),(-122.2244,37.988)] +32nd St [(-122.2754,37.227),(-122.2765,37.228)] +32nd St [(-122.2839,37.242),(-122.285,37.239)] +32nd St [(-122.2893,37.23),(-122.2901,37.229)] +33rd Ave [(-122.2235,37.776),(-122.2225,37.798)] +34th Ave [(-122.2205,37.811),(-122.2196,37.829)] +34th Ave [(-122.2232,37.755),(-122.2225,37.765)] +34th Ave [(-122.2251,37.728),(-122.2246,37.737)] +34th St [(-122.2637,37.223),(-122.2647,37.225)] +35th Ave [(-122.1914,37.983),(-122.1909,37.988)] +35th Ave [(-122.2005,37.929),(-122.1996,37.935)] +35th Ave [(-122.214,37.85),(-122.2138,37.852)] +35th Ave [(-122.2243,37.724),(-122.2238,37.731)] +35th St [(-122.2685,37.243),(-122.2692,37.244)] +35th St [(-122.2746,37.257),(-122.2779,37.266)] +35th St [(-122.2783,37.266),(-122.2792,37.269)] +36th Ave [(-122.2196,37.778),(-122.218,37.802)] +36th Ave [(-122.2214,37.746),(-122.2206,37.755)] +36th Ave [(-122.2221,37.737),(-122.222,37.738)] +36th Ave [(-122.2233,37.721),(-122.223,37.725)] +36th Ave [(-122.22414,37.70988),(-122.2238,37.716)] +36th St [(-122.228,37.022),(-122.227,37.02)] +36th St [(-122.2779,37.273),(-122.279,37.277)] +37th Ave [(-122.2211,37.732),(-122.221,37.733)] +37th St [(-122.2613,37.249),(-122.265,37.257)] +37th St [(-122.265,37.26),(-122.2663,37.271)] +37th St [(-122.2743,37.274),(-122.2768,37.278)] +38th Ave [(-122.1963,37.907),(-122.1954,37.912)] +38th Ave [(-122.2202,37.729),(-122.2197,37.734)] +38th St [(-122.2204,37.029),(-122.2199,37.028)] +38th St [(-122.2571,37.266),(-122.2583,37.268)] +38th St [(-122.2587,37.268),(-122.2597,37.269)] +39th Ave [(-122.2054,37.85),(-122.205,37.852)] +39th Ave [(-122.2163,37.763),(-122.216,37.768)] +3rd St [(-121.892355,37.95759),(-121.8908,37.957)] +3rd St [(-122.2872,37.803),(-122.287191,37.8084)] +3rd St [(-122.2873,37.767),(-122.2873,37.775)] +3rd St [(-122.2874,37.739),(-122.2874,37.748)] +3rd St [(-122.2894,37.019),(-122.2905,37.021)] +3rd St [(-122.2972,37.034),(-122.2982,37.036)] +40th Ave [(-122.2156,37.76),(-122.2152,37.764)] +40th St [(-122.2585,37.286),(-122.2594,37.288)] +41st Ave [(-122.214,37.75),(-122.2135,37.756)] +41st Ave [(-122.2153,37.735),(-122.2151,37.738)] +41st Ave [(-122.217,37.719),(-122.2169,37.721)] +41st St [(-122.2562,37.29),(-122.2571,37.291)] +41st St [(-122.2655,37.305),(-122.2653,37.314)] +41st St [(-122.2671,37.308),(-122.2677,37.308)] +41st St [(-122.2768,37.324),(-122.2773,37.325)] +42nd Ave [(-122.2104,37.767),(-122.2097,37.773)] +42nd St [(-122.2755,37.33),(-122.2765,37.332)] +43rd St [(-122.2673,37.325),(-122.2698,37.329)] +43rd St [(-122.2763,37.338),(-122.2768,37.339)] +45th Ave [(-122.2088,37.749),(-122.208,37.758)] +45th Ave [(-122.2118,37.713),(-122.2109,37.724)] +45th St [(-122.2814,37.341),(-122.2825,37.339)] +46th Ave [(-122.214,37.685),(-122.2137,37.688)] +46th St [(-122.2669,37.345),(-122.2694,37.349)] +47th Ave [(-122.2086,37.719),(-122.2082,37.723)] +48th Ave [(-122.2059,37.736),(-122.2052,37.745)] +48th St [(-122.2633,37.354),(-122.2643,37.356)] +48th St [(-122.2782,37.373),(-122.2782,37.37224)] +49th St [(-122.2545,37.348),(-122.2552,37.349)] +4th Ave [(-122.2534,37.976),(-122.2524,37.983)] +4th St [(-121.7778,37.76),(-121.7753,37.769),(-121.7741,37.772)] +4th St [(-122.0775,37.831),(-122.0772,37.824)] +4th St [(-122.2773,37.988),(-122.2784,37.993)] +4th St [(-122.2853,37.738),(-122.2854,37.742)] +4th St [(-122.3005,37.885),(-122.3006,37.871)] +50th Ave [(-122.2059,37.718),(-122.2054,37.724)] +50th Ave [(-122.2108,37.663),(-122.2096,37.675)] +50th Ave [(-122.2135,37.638),(-122.2123,37.65)] +51st Ave [(-122.2103,37.658),(-122.21,37.661)] +52nd Ave [(-122.2096,37.653),(-122.2092,37.657)] +52nd St [(-122.268,37.376),(-122.2683,37.376)] +52nd St [(-122.2706,37.372),(-122.2728,37.369)] +53rd Ave [(-122.2075,37.659),(-122.205,37.679)] +54th Ave [(-122.2076,37.649),(-122.2068,37.654)] +54th St [(-122.2733,37.386),(-122.275,37.384)] +55th Ave [(-122.1886,37.768),(-122.1883,37.77)] +55th Ave [(-122.197,37.709),(-122.1963,37.714)] +55th Ave [(-122.1996,37.689),(-122.1991,37.695)] +55th St [(-122.2641,37.408),(-122.2667,37.404)] +55th St [(-122.2824,37.386),(-122.2834,37.384)] +56th St [(-122.2692,37.409),(-122.2695,37.409)] +56th St [(-122.2735,37.404),(-122.2743,37.403)] +57th Ave [(-122.1933,37.711),(-122.1928,37.721)] +57th Ave [(-122.1969,37.686),(-122.1964,37.689)] +57th St [(-122.2609,37.433),(-122.262,37.435)] +57th St [(-122.2661,37.428),(-122.2671,37.426)] +57th St [(-122.274,37.418),(-122.2759,37.417)] +57th St [(-122.2798,37.409),(-122.2822,37.405)] +58th Ave [(-122.1876,37.749),(-122.1867,37.755)] +58th St [(-122.2663,37.437),(-122.2673,37.435)] +58th St [(-122.2701,37.437),(-122.272,37.435)] +59th St [(-122.2587,37.456),(-122.2608,37.454)] +59th St [(-122.2665,37.445),(-122.2675,37.445)] +59th St [(-122.2863,37.42),(-122.2872,37.418)] +5th Ave [(-122.2516,37.975),(-122.2507,37.982)] +5th St [(-121.7638,37.795),(-121.7633,37.795)] +5th St [(-121.7713,37.772),(-121.7701,37.775)] +5th St [(-121.7737,37.765),(-121.7727,37.769)] +5th St [(-121.7766,37.757),(-121.7751,37.761)] +5th St [(-121.9082,37.114),(-121.9045,37.113)] +5th St [(-122.0235,37.054),(-122.0224,37.045)] +5th St [(-122.071,37.754),(-122.0707,37.749)] +5th St [(-122.0732,37.8),(-122.0725,37.789)] +5th St [(-122.2732,37.981),(-122.2744,37.986)] +5th St [(-122.2756,37.991),(-122.2768,37.995)] +5th St [(-122.278,37),(-122.2792,37.005),(-122.2803,37.009)] +5th St [(-122.2815,37.766),(-122.2814,37.777)] +5th St [(-122.2816,37.747),(-122.2816,37.757)] +5th St [(-122.2901,37.036),(-122.292,37.04)] +5th St [(-122.2933,37.041),(-122.2946,37.045)] +5th St [(-122.296,37.615),(-122.2953,37.598)] +5th St [(-122.2977,37.665),(-122.2972,37.651),(-122.2966,37.633)] +5th St [(-122.2979,37.866),(-122.2979,37.87)] +5th St [(-122.3011,37.775),(-122.3008,37.763)] +60th Ave [(-122.1881,37.712),(-122.1868,37.722)] +60th St [(-122.2606,37.469),(-122.2615,37.466)] +60th St [(-122.2816,37.435),(-122.2831,37.432)] +61st Ave [(-122.1973,37.643),(-122.1962,37.65)] +61st St [(-122.2861,37.436),(-122.2877,37.433)] +62nd Ave [(-122.1794,37.751),(-122.1787,37.755)] +62nd Ave [(-122.1916,37.67),(-122.1911,37.673)] +62nd Ave [(-122.1992,37.617),(-122.1982,37.623)] +62nd St [(-122.254,37.494),(-122.2563,37.491)] +62nd St [(-122.268,37.477),(-122.2685,37.476)] +62nd St [(-122.2755,37.466),(-122.2749,37.467)] +62nd St [(-122.2761,37.465),(-122.276639,37.4632),(-122.2767,37.463)] +63rd Ave [(-122.1853,37.7),(-122.1844,37.706)] +63rd St [(-122.2563,37.495),(-122.2576,37.493),(-122.2596,37.49)] +63rd St [(-122.2604,37.49),(-122.2621,37.487)] +63rd St [(-122.2622,37.492),(-122.2651,37.489)] +63rd St [(-122.2708,37.481),(-122.269,37.484)] +64th Ave [(-122.1758,37.76),(-122.1753,37.767)] +64th Ave [(-122.188,37.673),(-122.1852,37.691)] +64th Ave [(-122.1921,37.645),(-122.1911,37.652)] +64th St [(-122.2869,37.46),(-122.2884,37.455)] +64th St [(-122.2945,37.441),(-122.2962,37.439)] +64th Av Pl [(-122.1784,37.734),(-122.1767,37.744)] +65th St [(-122.2653,37.505),(-122.2661,37.504)] +65th St [(-122.2847,37.481),(-122.2874,37.476)] +66th Ave [(-122.2013,37.556),(-122.1997,37.564)] +66th Ave [(-122.2054,37.542),(-122.2042,37.546)] +67th St [(-122.2828,37.504),(-122.283232,37.5031)] +67th St [(-122.28407,37.50135),(-122.2852,37.499)] +67th St [(-122.2887,37.495),(-122.2913,37.49)] +69th Ave [(-122.1927,37.582),(-122.1919,37.587)] +69th Ave [(-122.1959,37.56),(-122.1954,37.563)] +6th St [(-121.7634,37.785),(-121.7624,37.789)] +6th St [(-122.0219,37.032),(-122.0208,37.022)] +6th St [(-122.2691,37.975),(-122.2704,37.98)] +6th St [(-122.274,37.993),(-122.2752,37.998)] +6th St [(-122.2965,37.668),(-122.296,37.653)] +6th St [(-122.2982,37.724),(-122.2977,37.705)] +6th St [(-122.3012,37.813),(-122.3006,37.795)] +6th St [(-122.3016,37.831),(-122.3016,37.826)] +70 Canal [(-121.576176,37.91958),(-121.57645,37.91996)] +70th Ave [(-122.187,37.611),(-122.1862,37.616)] +71st Ave [(-122.1908,37.576),(-122.189,37.588)] +71st Ave [(-122.195,37.548),(-122.1944,37.553)] +73rd Ave [(-122.1746,37.664),(-122.1724,37.68)] +73rd Ave [(-122.1768,37.651),(-122.1761,37.655)] +73rd Ave [(-122.1802,37.628),(-122.1794,37.633)] +73rd Ave [(-122.1837,37.606),(-122.1829,37.611)] +73rd Ave [(-122.1915,37.554),(-122.1897,37.565)] +74th Ave [(-122.175,37.653),(-122.174,37.66)] +77th Ave [(-122.17,37.656),(-122.1682,37.668)] +78th Ave [(-122.1697,37.652),(-122.1674,37.663)] +78th Ave [(-122.1791,37.593),(-122.1784,37.597)] +79th Ave [(-122.1686,37.639),(-122.1662,37.65)] +7th Ave [(-122.2413,37.015),(-122.2406,37.021)] +7th Ave [(-122.2459,37.985),(-122.2449,37.991)] +7th Ave [(-122.2528,37.94),(-122.2518,37.947)] +7th St [(-121.7606,37.79),(-121.7597,37.798)] +7th St [(-121.7618,37.779),(-121.7615,37.783)] +7th St [(-122.0047,37.916),(-122.0041,37.92)] +7th St [(-122.0168,37.978),(-122.0149,37.974)] +7th St [(-122.0674,37.771),(-122.0667,37.761)] +7th St [(-122.0693,37.803),(-122.0687,37.793)] +7th St [(-122.2362,37.753),(-122.235,37.754)] +7th St [(-122.2759,37.009),(-122.2771,37.014)] +7th St [(-122.2864,37.041),(-122.2875,37.043)] +7th St [(-122.2903,37.511),(-122.2902,37.508)] +7th St [(-122.2916,37.052),(-122.2926,37.055)] +7th St [(-122.2918,37.562),(-122.2916,37.553)] +7th St [(-122.2945,37.635),(-122.2938,37.62)] +7th St [(-122.2996,37.797),(-122.299,37.779),(-122.2985,37.767)] +7th St [(-122.3215,37.099),(-122.326,37.102)] +80th Ave [(-122.1807,37.563),(-122.1793,37.57)] +81st Ave [(-122.1912,37.493),(-122.191,37.495)] +82nd Ave [(-122.1659,37.614),(-122.1653,37.619)] +82nd Ave [(-122.1695,37.596),(-122.1681,37.603)] +82nd Ave [(-122.1764,37.562),(-122.1747,37.57)] +83rd Ave [(-122.1741,37.563),(-122.1724,37.571)] +83rd Ave [(-122.1799,37.531),(-122.179,37.535)] +84th Ave [(-122.1683,37.58),(-122.1665,37.589)] +85th Ave [(-122.1677,37.573),(-122.166,37.581)] +85th Ave [(-122.173,37.548),(-122.1713,37.556)] +85th Ave [(-122.1763,37.533),(-122.1748,37.54)] +85th Ave [(-122.1877,37.466),(-122.186,37.476)] +87th Ave [(-122.1646,37.561),(-122.1643,37.563)] +87th Ave [(-122.1698,37.536),(-122.1681,37.544)] +87th Ave [(-122.1834,37.474),(-122.1814,37.484)] +88th Ave [(-122.1728,37.514),(-122.1711,37.521)] +89th Ave [(-122.1822,37.459),(-122.1803,37.471)] +8th Ave [(-122.2489,37.952),(-122.248,37.958)] +8th St [(-121.9083,37.161),(-121.9081,37.16)] +8th St [(-122.2459,37.882),(-122.2456,37.879)] +8th St [(-122.2546,37.914),(-122.2533,37.909)] +8th St [(-122.2572,37.935),(-122.256523,37.92898)] +8th St [(-122.2755,37.017),(-122.2766,37.022)] +8th St [(-122.2955,37.709),(-122.2952,37.698)] +8th St [(-122.296,37.748),(-122.296,37.733)] +8th St [(-122.2969,37.751),(-122.2967,37.746)] +90th Ave [(-122.1769,37.477),(-122.1753,37.485)] +90th Ave [(-122.1798,37.464),(-122.1785,37.47)] +92nd Ave [(-122.1759,37.464),(-122.1742,37.472)] +94th Ave [(-122.1714,37.466),(-122.1704,37.472)] +96th Ave [(-122.1621,37.493),(-122.161,37.498)] +98th Ave [(-122.1568,37.498),(-122.1558,37.502)] +98th Ave [(-122.1693,37.438),(-122.1682,37.444)] +98th Ave [(-122.1767,37.401),(-122.1758,37.408)] +98th Ave [(-122.1783,37.388),(-122.1773,37.396)] +98th Ave [(-122.1791,37.382),(-122.1788,37.384)] +98th Ave [(-122.1914,37.294),(-122.1904,37.298)] +98th Ave [(-122.2001,37.258),(-122.1974,37.27)] +99th Av Ct [(-122.1698,37.427),(-122.1694,37.422)] +9th Ave [(-122.2491,37.938),(-122.248,37.945)] +9th Ave [(-122.2516,37.922),(-122.2511,37.925)] +9th St [(-122.2349,37.779),(-122.234,37.773)] +9th St [(-122.27,37.725),(-122.27,37.734)] +9th St [(-122.2899,37.576),(-122.2897,37.567)] diff --git a/src/test/singlenode_regress/data/stud_emp.data b/src/test/singlenode_regress/data/stud_emp.data new file mode 100644 index 00000000000..4ad7566edd7 --- /dev/null +++ b/src/test/singlenode_regress/data/stud_emp.data @@ -0,0 +1,3 @@ +jeff 23 (8,7.7) 600 sharon 3.50000000000000000e+00 \N +cim 30 (10.5,4.7) 400 \N 3.39999999999999990e+00 \N +linda 19 (0.9,6.1) 100 \N 2.89999999999999990e+00 \N diff --git a/src/test/singlenode_regress/data/student.data b/src/test/singlenode_regress/data/student.data new file mode 100644 index 00000000000..f7e29e460e5 --- /dev/null +++ b/src/test/singlenode_regress/data/student.data @@ -0,0 +1,2 @@ +fred 28 (3.1,-1.5) 3.70000000000000020e+00 +larry 60 (21.8,4.9) 3.10000000000000010e+00 diff --git a/src/test/singlenode_regress/data/supplier.csv b/src/test/singlenode_regress/data/supplier.csv new file mode 100644 index 00000000000..304732cbe0c --- /dev/null +++ b/src/test/singlenode_regress/data/supplier.csv @@ -0,0 +1,100 @@ +1|Supplier#000000001| N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ|17|27-918-335-1736|5755.94|each slyly above the careful +2|Supplier#000000002|89eJ5ksX3ImxJQBvxObC,|5|15-679-861-2259|4032.68| slyly bold instructions. idle dependen +3|Supplier#000000003|q1,G3Pj6OjIuUYfUoH18BFTKP5aU9bEV3|1|11-383-516-1199|4192.40|blithely silent requests after the express dependencies are sl +4|Supplier#000000004|Bk7ah4CK8SYQTepEmvMkkgMwg|15|25-843-787-7479|4641.08|riously even requests above the exp +5|Supplier#000000005|Gcdm2rJRzl5qlTVzc|11|21-151-690-3663|-283.84|. slyly regular pinto bea +6|Supplier#000000006|tQxuVm7s7CnK|14|24-696-997-4969|1365.79|final accounts. regular dolphins use against the furiously ironic decoys. +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 +8|Supplier#000000008|9Sq4bBH2FQEmaFOocY45sRTxo6yuoG|17|27-498-742-3860|7627.85|al pinto beans. asymptotes haggl +9|Supplier#000000009|1KhUgZegwM3ua7dsYmekYBsK|10|20-403-398-8662|5302.37|s. unusual, even requests along the furiously regular pac +10|Supplier#000000010|Saygah3gYWMp72i PY|24|34-852-489-8585|3891.91|ing waters. regular requests ar +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 +12|Supplier#000000012|aLIW q0HYd|8|18-179-925-7181|1432.69|al packages nag alongside of the bold instructions. express, daring accounts +13|Supplier#000000013|HK71HQyWoqRWOX8GI FpgAifW,2PoH|3|13-727-620-7813|9107.22|requests engage regularly instructions. furiously special requests ar +14|Supplier#000000014|EXsnO5pTNj4iZRm|15|25-656-247-5058|9189.82|l accounts boost. fluffily bold warhorses wake +15|Supplier#000000015|olXVbNBfVzRqgokr1T,Ie|8|18-453-357-6394|308.56| across the furiously regular platelets wake even deposits. quickly express she +16|Supplier#000000016|YjP5C55zHDXL7LalK27zfQnwejdpin4AMpvh|22|32-822-502-4215|2972.26|ously express ideas haggle quickly dugouts? fu +17|Supplier#000000017|c2d,ESHRSkK3WYnxpgw6aOqN0q|19|29-601-884-9219|1687.81|eep against the furiously bold ideas. fluffily bold packa +18|Supplier#000000018|PGGVE5PWAMwKDZw |16|26-729-551-1115|7040.82|accounts snooze slyly furiously bold +19|Supplier#000000019|edZT3es,nBFD8lBXTGeTl|24|34-278-310-2731|6150.38|refully final foxes across the dogged theodolites sleep slyly abou +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 +21|Supplier#000000021|81CavellcrJ0PQ3CPBID0Z0JwyJm0ka5igEs|2|12-253-590-5816|9365.80|d. instructions integrate sometimes slyly pending instructions. accounts nag among the +22|Supplier#000000022|okiiQFk 8lm6EVX6Q0,bEcO|4|14-144-830-2814|-966.20| ironically among the deposits. closely expre +23|Supplier#000000023|ssetugTcXc096qlD7 2TL5crEEeS3zk|9|19-559-422-5776|5926.41|ges could have to are ironic deposits. regular, even request +24|Supplier#000000024|C4nPvLrVmKPPabFCj|0|10-620-939-2254|9170.71|usly pending deposits. slyly final accounts run +25|Supplier#000000025|RCQKONXMFnrodzz6w7fObFVV6CUm2q|22|32-431-945-3541|9198.31|ely regular deposits. carefully regular sauternes engage furiously above the regular accounts. idly +26|Supplier#000000026|iV,MHzAx6Z939uzFNkq09M0a1 MBfH7|21|31-758-894-4436|21.18| ideas poach carefully after the blithely bold asymptotes. furiously pending theodoli +27|Supplier#000000027|lC4CjKwNHUr6L4xIpzOBK4NlHkFTg|18|28-708-999-2028|1887.62|s according to the quickly regular hockey playe +28|Supplier#000000028|GBhvoRh,7YIN V|0|10-538-384-8460|-891.99|ld requests across the pinto beans are carefully against the quickly final courts. accounts sleep +29|Supplier#000000029|658tEqXLPvRd6xpFdqC2|1|11-555-705-5922|-811.62|y express ideas play furiously. even accounts sleep fluffily across the accounts. careful +30|Supplier#000000030|84NmC1rmQfO0fj3zkobLT|16|26-940-594-4852|8080.14|ias. carefully silent accounts cajole blithely. pending, special accounts cajole quickly above the f +31|Supplier#000000031|fRJimA7zchyApqRLHcQeocVpP|16|26-515-530-4159|5916.91|into beans wake after the special packages. slyly fluffy requests cajole furio +32|Supplier#000000032|yvoD3TtZSx1skQNCK8agk5bZlZLug|23|33-484-637-7873|3556.47|usly even depths. quickly ironic theodolites s +33|Supplier#000000033|gfeKpYw3400L0SDywXA6Ya1Qmq1w6YB9f3R|7|17-138-897-9374|8564.12|n sauternes along the regular asymptotes are regularly along the +34|Supplier#000000034|mYRe3KvA2O4lL4HhxDKkkrPUDPMKRCSp,Xpa|10|20-519-982-2343|237.31|eposits. slyly final deposits toward the slyly regular dependencies sleep among the excu +35|Supplier#000000035|QymmGXxjVVQ5OuABCXVVsu,4eF gU0Qc6|21|31-720-790-5245|4381.41| ironic deposits! final, bold platelets haggle quickly quickly pendin +36|Supplier#000000036|mzSpBBJvbjdx3UKTW3bLFewRD78D91lAC879|13|23-273-493-3679|2371.51|ular theodolites must haggle regular, bold accounts. slyly final pinto beans bo +37|Supplier#000000037|cqjyB5h1nV|0|10-470-144-1330|3017.47|iously final instructions. quickly special accounts hang fluffily above the accounts. deposits +38|Supplier#000000038|xEcx45vD0FXHT7c9mvWFY|4|14-361-296-6426|2512.41|ins. fluffily special accounts haggle slyly af +39|Supplier#000000039|ZM, nSYpEPWr1yAFHaC91qjFcijjeU5eH|8|18-851-856-5633|6115.65|le slyly requests. special packages shall are blithely. slyly unusual packages sleep +40|Supplier#000000040|zyIeWzbbpkTV37vm1nmSGBxSgd2Kp|22|32-231-247-6991|-290.06| final patterns. accounts haggle idly pas +41|Supplier#000000041|G 1FKHR435 wMKFmyt|18|28-739-447-2525|6942.67|odolites boost across the furiously regular fo +42|Supplier#000000042|1Y5lwEgpe3j2vbUBYj3SwLhK62JlwEMtDC|22|32-698-298-6317|6565.11| fluffily even requests cajole blithely fu +43|Supplier#000000043|Z5mLuAoTUEeKY5v22VnnA4D87Ao6jF2LvMYnlX8h|12|22-421-568-4862|7773.41|unts. unusual, final asymptotes +44|Supplier#000000044|kERxlLDnlIZJdN66zAPHklyL|7|17-713-930-5667|9759.38|x. carefully quiet account +45|Supplier#000000045|LcKnsa8XGtIO0WYSB7hkOrH rnzRg1|9|19-189-635-8862|2944.23|iously according to the ironic, silent accounts. +46|Supplier#000000046|e0URUXfDOYMdKe16Z5h5StMRbzGmTs,D2cjap|24|34-748-308-3215|3580.35|gular, regular ideas across th +47|Supplier#000000047|3XM1x,Pcxqw,HK4XNlgbnZMbLhBHLA|14|24-810-354-4471|2958.09|sly ironic deposits sleep carefully along t +48|Supplier#000000048|jg0U FNPMQDuyuKvTnLXXaLf3Wl6OtONA6mQlWJ|14|24-722-551-9498|5630.62|xpress instructions affix. fluffily even requests boos +49|Supplier#000000049|Nvq 6macF4GtJvz|24|34-211-567-6800|9915.24|the finally bold dependencies. dependencies after the fluffily final foxes boost fluffi +50|Supplier#000000050|rGobqSMMYz0ErrPhCGS|9|19-561-560-7437|4515.87|warhorses. ironic, regular accounts detect slyly after the quickly f +51|Supplier#000000051|rDkBXb01POIKjOwrij62uM8O4|9|19-475-537-1368|7241.40|ges nag at the blithely busy instructions. fluffy packages wake quickly. even, ironic ideas boost b +52|Supplier#000000052|WCk XCHYzBA1dvJDSol4ZJQQcQN,|19|29-974-934-4713|287.16|dolites are slyly against the furiously regular packages. ironic, final deposits cajole quickly +53|Supplier#000000053|i9v3 EsYCfLKFU6PIt8iihBOHBB37yR7b3GD7Rt|7|17-886-101-6083|6177.35|onic, special deposits wake furio +54|Supplier#000000054|J1s,Wxb5pg|12|22-966-435-7200|2733.69|blithely pending dolphins. quickly regular theodolites haggle slyly +55|Supplier#000000055|OqdYSiOQeG4eGi636Tj|24|34-876-912-6007|7162.15|kages. blithely even foxes cajole special, final accounts. blithely even dependencies r +56|Supplier#000000056|fUVtlUVal GiHBOuYoUQ XQ9NfNLQR3Gl|16|26-471-195-5486|-632.16| sleep special deposits. unusual requests wake blithely slyly regular ideas. +57|Supplier#000000057|bEWqUVRR f0mb2o18Y|17|27-681-514-6892|-831.07|detect according to the furiously br +58|Supplier#000000058|01dEADIZoCULZXg|16|26-659-969-5586|92.44|refully final foxes are. even, express courts according to the b +59|Supplier#000000059|N8lKbYjMnVlEHmTPRmBgtLiX8rrJx|17|27-249-395-9123|586.16|ffily along the even decoys. final instructions abov +60|Supplier#000000060|cb08ntDTARo47WmnBcYXu|8|18-550-360-2464|4515.80|thely express ideas use blithely +61|Supplier#000000061|Oz0M1qBR9I|8|18-396-489-9719|6096.58|s the slyly regular ideas shall +62|Supplier#000000062|bSmlFYUKBeRsqJxwC9 zS6xpFdEf5jNTb|19|29-603-653-2494|9202.57|ts. furiously ironic pinto beans are permanently after the bold ideas. regular, express f +63|Supplier#000000063|NlV0OQyIoPvPkw5AYuWGomX,hgqm1|5|15-781-401-3047|5742.03|ar deposits. blithely bold accounts against the slyly final pinto beans sleep about the exp +64|Supplier#000000064|w80JjnIP lGoLdUjRutbv81gGlqqpW4PQBeOtSYU|24|34-278-790-7004|1309.70|uickly regular requests use. carefully i +65|Supplier#000000065|BsAnHUmSFArppKrM|22|32-444-835-2434|-963.79|l ideas wake carefully around the regular packages. furiously ruthless pinto bea +66|Supplier#000000066|qYdruFJQJYYiKvnNVmYfCVydVB8bcW,AW,U6SOV3|23|33-300-836-9529|2455.98|ar requests. express orbits de +67|Supplier#000000067|7YrEKJncHFk5D W7ZaqfAXV|4|14-563-538-1657|3576.55|ray slyly final foxes. furio +68|Supplier#000000068|Ue6N50wH2CwE4PPgTGLmat,ibGYYlDoOb3xQwtgb|21|31-267-327-4328|5119.38|inal requests. ruthlessly ironic packages cajole +69|Supplier#000000069|T2Dl9,f97e333eRuMi2z |4|14-491-707-8310|8466.50|! carefully ironic instructions nag quickly pending requests. fluffily even deposits sleep a +70|Supplier#000000070|INWNH2w,OOWgNDq0BRCcBwOMQc6PdFDc4|6|16-821-608-1166|9508.37|ests sleep quickly express ideas. ironic ideas haggle about the final T +71|Supplier#000000071|YFo8an7P6wi Q|1|11-743-919-7272|8179.68| final accounts. bold, final escapades must have to cajole about the special platelets. fu +72|Supplier#000000072|mKpAJojtawk2alqV4 ZEbJ3PH3wfYqy AM8rGq1|18|28-113-898-6643|7014.50| theodolites sublate furiously about the regularly e +73|Supplier#000000073|HBZA1NHvrswQCxTTjg 5XrfSOGgMRKNCe2ovE|16|26-758-310-7496|3793.13|. never pending asymptotes a +74|Supplier#000000074|uM3yV5NOc6b5wNdpxF69CW 8QvDxqvKubRJtA|20|30-166-486-1559|4170.51|carefully along the quickly regular sentiments. ironic accounts sleep. regular deposits are blith +75|Supplier#000000075|7f3gN4rP1livII|18|28-716-704-8686|-224.84|eans. even, silent packages c +76|Supplier#000000076|JBhSBa3cLYvNgHUYtUHmtECCD|14|24-228-763-7840|2971.10|, even instructions. furiously unusual deposits wake slyly about the ev +77|Supplier#000000077|wVtcr0uH3CyrSiWMLsqnB09Syo,UuZxPMeBghlY|7|17-281-345-4863|4186.95|the slyly final asymptotes. blithely pending theodoli +78|Supplier#000000078|9y3OZ2CV hGrsrQxzB7V3zTtygHVHlG3SD6yrz|5|15-670-998-6860|1044.10|, regular packages wake quickly bold requests. carefully unusual requests about the unusual request +79|Supplier#000000079|p0u3tztSXUD2J8vFfLNFNKsrRRv7qyUtTBTA|14|24-402-227-9600|1191.94|nto beans integrate slyly across the fluffily pending multipliers. carefully ste +80|Supplier#000000080|cJ2MHSEJ13rIL2Wj3D5i6hRo30,ZiNUXhqn|21|31-646-289-1906|-40.45|ackages. blithely bold requests wake quickly. carefully regular foxes are slyly instructions. caref +81|Supplier#000000081|SLlacbhgpKmVa,gF3saYv12e0|12|22-535-310-6971|166.32|oost carefully quickly regular packages. carefully final excuses sleep blithely slyly pendi +82|Supplier#000000082|WyTKA7ZpF15t1aCNlT3|18|28-177-572-9691|-724.31|xpress multipliers wake furiously even foxes. furiously iro +83|Supplier#000000083|WRJUkzCn050seVz57oAfrbCuw|14|24-529-559-2461|1467.77|ly pending courts would cajole enticingly even deposits. slyly express +84|Supplier#000000084|DcYjWMiZGQqEKOJi4wAmIV08ikx|24|34-869-118-7803|4780.93|even depths. regular foxes use slyly. theod +85|Supplier#000000085|Ckls9RtlzKSF|7|17-167-806-8199|7174.74|egular packages. bold pinto beans wake fur +86|Supplier#000000086|J1fgg5QaqnN|19|29-903-665-7065|1883.37|cajole furiously special, final requests: furiously spec +87|Supplier#000000087|WCw7URDj8zoZ7tqC3cpm7|24|34-860-229-1674|4746.66|all are quickly after the ironic platelets. pending dolphins are. final the +88|Supplier#000000088|yOshY8wwzMgS|11|21-191-938-9469|3086.13|furiously special excuses aff +89|Supplier#000000089|fhtzZcSorhud1|9|19-259-876-1014|1638.02|en instructions across the slyly ironic requests engage +90|Supplier#000000090|bPE6Uhz1f2m3gwSGMrnRt,g,3gq37r5kxgphqss1|6|16-380-123-9217|6201.77|hely fluffily regular theodoli +91|Supplier#000000091|YV45D7TkfdQanOOZ7q9QxkyGUapU1oOWU6q3|3|13-604-986-9056|6255.87|nstructions use carefully according to the special packages: quickly silent th +92|Supplier#000000092|n48Wy4QI3lml8T217rk|2|12-701-432-8346|2470.84| even theodolites wake against the blithely fluffy packages +93|Supplier#000000093|wd1djjKXT,4zBm|16|26-528-528-1157|368.76|yly final accounts could are carefully. fluffily ironic instruct +94|Supplier#000000094|lK,pLPjAMVGJOXN80zPZuNQjpChliE|4|14-728-888-8882|2766.80|usly. furiously slow theodolites could haggle carefully fina +95|Supplier#000000095|p2 2hBfH5TD|19|29-142-539-1403|2588.83|sual instructions cajole slyly with the final ac +96|Supplier#000000096|Lbxp3WIipye o2wZme1i9iJx,xTt1Mp|12|22-888-654-7193|3437.24|efully unusual excuses wake fluffily regular theodo +97|Supplier#000000097|MrCQha2G6ndX1fp6CA|4|14-618-678-1789|6642.22|s, regular accounts. furiously bold ideas u +98|Supplier#000000098|ogHn8dpXB5Q|21|31-914-775-1978|5873.07|esias use slyly under the ironic foxes. re +99|Supplier#000000099|4SxkTHG28nZrtT0,MnVF9H|18|28-272-909-1617|3671.34|nic dependencies dazzle flu +100|Supplier#000000100|rIlN li8zvW22l2slbcx ECP4fL|21|31-351-324-5062|3191.70|es. regular instructions sleep carefully. slyly ironic packages across the foxes boost diff --git a/src/test/singlenode_regress/data/tenk.data b/src/test/singlenode_regress/data/tenk.data new file mode 100644 index 00000000000..c9064c9c032 --- /dev/null +++ b/src/test/singlenode_regress/data/tenk.data @@ -0,0 +1,10000 @@ +8800 0 0 0 0 0 0 800 800 3800 8800 0 1 MAAAAA AAAAAA AAAAxx +1891 1 1 3 1 11 91 891 1891 1891 1891 182 183 TUAAAA BAAAAA HHHHxx +3420 2 0 0 0 0 20 420 1420 3420 3420 40 41 OBAAAA CAAAAA OOOOxx +9850 3 0 2 0 10 50 850 1850 4850 9850 100 101 WOAAAA DAAAAA VVVVxx +7164 4 0 0 4 4 64 164 1164 2164 7164 128 129 OPAAAA EAAAAA AAAAxx +8009 5 1 1 9 9 9 9 9 3009 8009 18 19 BWAAAA FAAAAA HHHHxx +5057 6 1 1 7 17 57 57 1057 57 5057 114 115 NMAAAA GAAAAA OOOOxx +6701 7 1 1 1 1 1 701 701 1701 6701 2 3 TXAAAA HAAAAA VVVVxx +4321 8 1 1 1 1 21 321 321 4321 4321 42 43 FKAAAA IAAAAA AAAAxx +3043 9 1 3 3 3 43 43 1043 3043 3043 86 87 BNAAAA JAAAAA HHHHxx +1314 10 0 2 4 14 14 314 1314 1314 1314 28 29 OYAAAA KAAAAA OOOOxx +1504 11 0 0 4 4 4 504 1504 1504 1504 8 9 WFAAAA LAAAAA VVVVxx +5222 12 0 2 2 2 22 222 1222 222 5222 44 45 WSAAAA MAAAAA AAAAxx +6243 13 1 3 3 3 43 243 243 1243 6243 86 87 DGAAAA NAAAAA HHHHxx +5471 14 1 3 1 11 71 471 1471 471 5471 142 143 LCAAAA OAAAAA OOOOxx +5006 15 0 2 6 6 6 6 1006 6 5006 12 13 OKAAAA PAAAAA VVVVxx +5387 16 1 3 7 7 87 387 1387 387 5387 174 175 FZAAAA QAAAAA AAAAxx +5785 17 1 1 5 5 85 785 1785 785 5785 170 171 NOAAAA RAAAAA HHHHxx +6621 18 1 1 1 1 21 621 621 1621 6621 42 43 RUAAAA SAAAAA OOOOxx +6969 19 1 1 9 9 69 969 969 1969 6969 138 139 BIAAAA TAAAAA VVVVxx +9460 20 0 0 0 0 60 460 1460 4460 9460 120 121 WZAAAA UAAAAA AAAAxx +59 21 1 3 9 19 59 59 59 59 59 118 119 HCAAAA VAAAAA HHHHxx +8020 22 0 0 0 0 20 20 20 3020 8020 40 41 MWAAAA WAAAAA OOOOxx +7695 23 1 3 5 15 95 695 1695 2695 7695 190 191 ZJAAAA XAAAAA VVVVxx +3442 24 0 2 2 2 42 442 1442 3442 3442 84 85 KCAAAA YAAAAA AAAAxx +5119 25 1 3 9 19 19 119 1119 119 5119 38 39 XOAAAA ZAAAAA HHHHxx +646 26 0 2 6 6 46 646 646 646 646 92 93 WYAAAA ABAAAA OOOOxx +9605 27 1 1 5 5 5 605 1605 4605 9605 10 11 LFAAAA BBAAAA VVVVxx +263 28 1 3 3 3 63 263 263 263 263 126 127 DKAAAA CBAAAA AAAAxx +3269 29 1 1 9 9 69 269 1269 3269 3269 138 139 TVAAAA DBAAAA HHHHxx +1839 30 1 3 9 19 39 839 1839 1839 1839 78 79 TSAAAA EBAAAA OOOOxx +9144 31 0 0 4 4 44 144 1144 4144 9144 88 89 SNAAAA FBAAAA VVVVxx +2513 32 1 1 3 13 13 513 513 2513 2513 26 27 RSAAAA GBAAAA AAAAxx +8850 33 0 2 0 10 50 850 850 3850 8850 100 101 KCAAAA HBAAAA HHHHxx +236 34 0 0 6 16 36 236 236 236 236 72 73 CJAAAA IBAAAA OOOOxx +3162 35 0 2 2 2 62 162 1162 3162 3162 124 125 QRAAAA JBAAAA VVVVxx +4380 36 0 0 0 0 80 380 380 4380 4380 160 161 MMAAAA KBAAAA AAAAxx +8095 37 1 3 5 15 95 95 95 3095 8095 190 191 JZAAAA LBAAAA HHHHxx +209 38 1 1 9 9 9 209 209 209 209 18 19 BIAAAA MBAAAA OOOOxx +3055 39 1 3 5 15 55 55 1055 3055 3055 110 111 NNAAAA NBAAAA VVVVxx +6921 40 1 1 1 1 21 921 921 1921 6921 42 43 FGAAAA OBAAAA AAAAxx +7046 41 0 2 6 6 46 46 1046 2046 7046 92 93 ALAAAA PBAAAA HHHHxx +7912 42 0 0 2 12 12 912 1912 2912 7912 24 25 ISAAAA QBAAAA OOOOxx +7267 43 1 3 7 7 67 267 1267 2267 7267 134 135 NTAAAA RBAAAA VVVVxx +3599 44 1 3 9 19 99 599 1599 3599 3599 198 199 LIAAAA SBAAAA AAAAxx +923 45 1 3 3 3 23 923 923 923 923 46 47 NJAAAA TBAAAA HHHHxx +1437 46 1 1 7 17 37 437 1437 1437 1437 74 75 HDAAAA UBAAAA OOOOxx +6439 47 1 3 9 19 39 439 439 1439 6439 78 79 RNAAAA VBAAAA VVVVxx +6989 48 1 1 9 9 89 989 989 1989 6989 178 179 VIAAAA WBAAAA AAAAxx +8798 49 0 2 8 18 98 798 798 3798 8798 196 197 KAAAAA XBAAAA HHHHxx +5960 50 0 0 0 0 60 960 1960 960 5960 120 121 GVAAAA YBAAAA OOOOxx +5832 51 0 0 2 12 32 832 1832 832 5832 64 65 IQAAAA ZBAAAA VVVVxx +6066 52 0 2 6 6 66 66 66 1066 6066 132 133 IZAAAA ACAAAA AAAAxx +322 53 0 2 2 2 22 322 322 322 322 44 45 KMAAAA BCAAAA HHHHxx +8321 54 1 1 1 1 21 321 321 3321 8321 42 43 BIAAAA CCAAAA OOOOxx +734 55 0 2 4 14 34 734 734 734 734 68 69 GCAAAA DCAAAA VVVVxx +688 56 0 0 8 8 88 688 688 688 688 176 177 MAAAAA ECAAAA AAAAxx +4212 57 0 0 2 12 12 212 212 4212 4212 24 25 AGAAAA FCAAAA HHHHxx +9653 58 1 1 3 13 53 653 1653 4653 9653 106 107 HHAAAA GCAAAA OOOOxx +2677 59 1 1 7 17 77 677 677 2677 2677 154 155 ZYAAAA HCAAAA VVVVxx +5423 60 1 3 3 3 23 423 1423 423 5423 46 47 PAAAAA ICAAAA AAAAxx +2592 61 0 0 2 12 92 592 592 2592 2592 184 185 SVAAAA JCAAAA HHHHxx +3233 62 1 1 3 13 33 233 1233 3233 3233 66 67 JUAAAA KCAAAA OOOOxx +5032 63 0 0 2 12 32 32 1032 32 5032 64 65 OLAAAA LCAAAA VVVVxx +2525 64 1 1 5 5 25 525 525 2525 2525 50 51 DTAAAA MCAAAA AAAAxx +4450 65 0 2 0 10 50 450 450 4450 4450 100 101 EPAAAA NCAAAA HHHHxx +5778 66 0 2 8 18 78 778 1778 778 5778 156 157 GOAAAA OCAAAA OOOOxx +5852 67 0 0 2 12 52 852 1852 852 5852 104 105 CRAAAA PCAAAA VVVVxx +5404 68 0 0 4 4 4 404 1404 404 5404 8 9 WZAAAA QCAAAA AAAAxx +6223 69 1 3 3 3 23 223 223 1223 6223 46 47 JFAAAA RCAAAA HHHHxx +6133 70 1 1 3 13 33 133 133 1133 6133 66 67 XBAAAA SCAAAA OOOOxx +9112 71 0 0 2 12 12 112 1112 4112 9112 24 25 MMAAAA TCAAAA VVVVxx +7575 72 1 3 5 15 75 575 1575 2575 7575 150 151 JFAAAA UCAAAA AAAAxx +7414 73 0 2 4 14 14 414 1414 2414 7414 28 29 EZAAAA VCAAAA HHHHxx +9741 74 1 1 1 1 41 741 1741 4741 9741 82 83 RKAAAA WCAAAA OOOOxx +3767 75 1 3 7 7 67 767 1767 3767 3767 134 135 XOAAAA XCAAAA VVVVxx +9372 76 0 0 2 12 72 372 1372 4372 9372 144 145 MWAAAA YCAAAA AAAAxx +8976 77 0 0 6 16 76 976 976 3976 8976 152 153 GHAAAA ZCAAAA HHHHxx +4071 78 1 3 1 11 71 71 71 4071 4071 142 143 PAAAAA ADAAAA OOOOxx +1311 79 1 3 1 11 11 311 1311 1311 1311 22 23 LYAAAA BDAAAA VVVVxx +2604 80 0 0 4 4 4 604 604 2604 2604 8 9 EWAAAA CDAAAA AAAAxx +8840 81 0 0 0 0 40 840 840 3840 8840 80 81 ACAAAA DDAAAA HHHHxx +567 82 1 3 7 7 67 567 567 567 567 134 135 VVAAAA EDAAAA OOOOxx +5215 83 1 3 5 15 15 215 1215 215 5215 30 31 PSAAAA FDAAAA VVVVxx +5474 84 0 2 4 14 74 474 1474 474 5474 148 149 OCAAAA GDAAAA AAAAxx +3906 85 0 2 6 6 6 906 1906 3906 3906 12 13 GUAAAA HDAAAA HHHHxx +1769 86 1 1 9 9 69 769 1769 1769 1769 138 139 BQAAAA IDAAAA OOOOxx +1454 87 0 2 4 14 54 454 1454 1454 1454 108 109 YDAAAA JDAAAA VVVVxx +6877 88 1 1 7 17 77 877 877 1877 6877 154 155 NEAAAA KDAAAA AAAAxx +6501 89 1 1 1 1 1 501 501 1501 6501 2 3 BQAAAA LDAAAA HHHHxx +934 90 0 2 4 14 34 934 934 934 934 68 69 YJAAAA MDAAAA OOOOxx +4075 91 1 3 5 15 75 75 75 4075 4075 150 151 TAAAAA NDAAAA VVVVxx +3180 92 0 0 0 0 80 180 1180 3180 3180 160 161 ISAAAA ODAAAA AAAAxx +7787 93 1 3 7 7 87 787 1787 2787 7787 174 175 NNAAAA PDAAAA HHHHxx +6401 94 1 1 1 1 1 401 401 1401 6401 2 3 FMAAAA QDAAAA OOOOxx +4244 95 0 0 4 4 44 244 244 4244 4244 88 89 GHAAAA RDAAAA VVVVxx +4591 96 1 3 1 11 91 591 591 4591 4591 182 183 PUAAAA SDAAAA AAAAxx +4113 97 1 1 3 13 13 113 113 4113 4113 26 27 FCAAAA TDAAAA HHHHxx +5925 98 1 1 5 5 25 925 1925 925 5925 50 51 XTAAAA UDAAAA OOOOxx +1987 99 1 3 7 7 87 987 1987 1987 1987 174 175 LYAAAA VDAAAA VVVVxx +8248 100 0 0 8 8 48 248 248 3248 8248 96 97 GFAAAA WDAAAA AAAAxx +4151 101 1 3 1 11 51 151 151 4151 4151 102 103 RDAAAA XDAAAA HHHHxx +8670 102 0 2 0 10 70 670 670 3670 8670 140 141 MVAAAA YDAAAA OOOOxx +6194 103 0 2 4 14 94 194 194 1194 6194 188 189 GEAAAA ZDAAAA VVVVxx +88 104 0 0 8 8 88 88 88 88 88 176 177 KDAAAA AEAAAA AAAAxx +4058 105 0 2 8 18 58 58 58 4058 4058 116 117 CAAAAA BEAAAA HHHHxx +2742 106 0 2 2 2 42 742 742 2742 2742 84 85 MBAAAA CEAAAA OOOOxx +8275 107 1 3 5 15 75 275 275 3275 8275 150 151 HGAAAA DEAAAA VVVVxx +4258 108 0 2 8 18 58 258 258 4258 4258 116 117 UHAAAA EEAAAA AAAAxx +6129 109 1 1 9 9 29 129 129 1129 6129 58 59 TBAAAA FEAAAA HHHHxx +7243 110 1 3 3 3 43 243 1243 2243 7243 86 87 PSAAAA GEAAAA OOOOxx +2392 111 0 0 2 12 92 392 392 2392 2392 184 185 AOAAAA HEAAAA VVVVxx +9853 112 1 1 3 13 53 853 1853 4853 9853 106 107 ZOAAAA IEAAAA AAAAxx +6064 113 0 0 4 4 64 64 64 1064 6064 128 129 GZAAAA JEAAAA HHHHxx +4391 114 1 3 1 11 91 391 391 4391 4391 182 183 XMAAAA KEAAAA OOOOxx +726 115 0 2 6 6 26 726 726 726 726 52 53 YBAAAA LEAAAA VVVVxx +6957 116 1 1 7 17 57 957 957 1957 6957 114 115 PHAAAA MEAAAA AAAAxx +3853 117 1 1 3 13 53 853 1853 3853 3853 106 107 FSAAAA NEAAAA HHHHxx +4524 118 0 0 4 4 24 524 524 4524 4524 48 49 ASAAAA OEAAAA OOOOxx +5330 119 0 2 0 10 30 330 1330 330 5330 60 61 AXAAAA PEAAAA VVVVxx +6671 120 1 3 1 11 71 671 671 1671 6671 142 143 PWAAAA QEAAAA AAAAxx +5314 121 0 2 4 14 14 314 1314 314 5314 28 29 KWAAAA REAAAA HHHHxx +9202 122 0 2 2 2 2 202 1202 4202 9202 4 5 YPAAAA SEAAAA OOOOxx +4596 123 0 0 6 16 96 596 596 4596 4596 192 193 UUAAAA TEAAAA VVVVxx +8951 124 1 3 1 11 51 951 951 3951 8951 102 103 HGAAAA UEAAAA AAAAxx +9902 125 0 2 2 2 2 902 1902 4902 9902 4 5 WQAAAA VEAAAA HHHHxx +1440 126 0 0 0 0 40 440 1440 1440 1440 80 81 KDAAAA WEAAAA OOOOxx +5339 127 1 3 9 19 39 339 1339 339 5339 78 79 JXAAAA XEAAAA VVVVxx +3371 128 1 3 1 11 71 371 1371 3371 3371 142 143 RZAAAA YEAAAA AAAAxx +4467 129 1 3 7 7 67 467 467 4467 4467 134 135 VPAAAA ZEAAAA HHHHxx +6216 130 0 0 6 16 16 216 216 1216 6216 32 33 CFAAAA AFAAAA OOOOxx +5364 131 0 0 4 4 64 364 1364 364 5364 128 129 IYAAAA BFAAAA VVVVxx +7547 132 1 3 7 7 47 547 1547 2547 7547 94 95 HEAAAA CFAAAA AAAAxx +4338 133 0 2 8 18 38 338 338 4338 4338 76 77 WKAAAA DFAAAA HHHHxx +3481 134 1 1 1 1 81 481 1481 3481 3481 162 163 XDAAAA EFAAAA OOOOxx +826 135 0 2 6 6 26 826 826 826 826 52 53 UFAAAA FFAAAA VVVVxx +3647 136 1 3 7 7 47 647 1647 3647 3647 94 95 HKAAAA GFAAAA AAAAxx +3337 137 1 1 7 17 37 337 1337 3337 3337 74 75 JYAAAA HFAAAA HHHHxx +3591 138 1 3 1 11 91 591 1591 3591 3591 182 183 DIAAAA IFAAAA OOOOxx +7192 139 0 0 2 12 92 192 1192 2192 7192 184 185 QQAAAA JFAAAA VVVVxx +1078 140 0 2 8 18 78 78 1078 1078 1078 156 157 MPAAAA KFAAAA AAAAxx +1310 141 0 2 0 10 10 310 1310 1310 1310 20 21 KYAAAA LFAAAA HHHHxx +9642 142 0 2 2 2 42 642 1642 4642 9642 84 85 WGAAAA MFAAAA OOOOxx +39 143 1 3 9 19 39 39 39 39 39 78 79 NBAAAA NFAAAA VVVVxx +8682 144 0 2 2 2 82 682 682 3682 8682 164 165 YVAAAA OFAAAA AAAAxx +1794 145 0 2 4 14 94 794 1794 1794 1794 188 189 ARAAAA PFAAAA HHHHxx +5630 146 0 2 0 10 30 630 1630 630 5630 60 61 OIAAAA QFAAAA OOOOxx +6748 147 0 0 8 8 48 748 748 1748 6748 96 97 OZAAAA RFAAAA VVVVxx +3766 148 0 2 6 6 66 766 1766 3766 3766 132 133 WOAAAA SFAAAA AAAAxx +6403 149 1 3 3 3 3 403 403 1403 6403 6 7 HMAAAA TFAAAA HHHHxx +175 150 1 3 5 15 75 175 175 175 175 150 151 TGAAAA UFAAAA OOOOxx +2179 151 1 3 9 19 79 179 179 2179 2179 158 159 VFAAAA VFAAAA VVVVxx +7897 152 1 1 7 17 97 897 1897 2897 7897 194 195 TRAAAA WFAAAA AAAAxx +2760 153 0 0 0 0 60 760 760 2760 2760 120 121 ECAAAA XFAAAA HHHHxx +1675 154 1 3 5 15 75 675 1675 1675 1675 150 151 LMAAAA YFAAAA OOOOxx +2564 155 0 0 4 4 64 564 564 2564 2564 128 129 QUAAAA ZFAAAA VVVVxx +157 156 1 1 7 17 57 157 157 157 157 114 115 BGAAAA AGAAAA AAAAxx +8779 157 1 3 9 19 79 779 779 3779 8779 158 159 RZAAAA BGAAAA HHHHxx +9591 158 1 3 1 11 91 591 1591 4591 9591 182 183 XEAAAA CGAAAA OOOOxx +8732 159 0 0 2 12 32 732 732 3732 8732 64 65 WXAAAA DGAAAA VVVVxx +139 160 1 3 9 19 39 139 139 139 139 78 79 JFAAAA EGAAAA AAAAxx +5372 161 0 0 2 12 72 372 1372 372 5372 144 145 QYAAAA FGAAAA HHHHxx +1278 162 0 2 8 18 78 278 1278 1278 1278 156 157 EXAAAA GGAAAA OOOOxx +4697 163 1 1 7 17 97 697 697 4697 4697 194 195 RYAAAA HGAAAA VVVVxx +8610 164 0 2 0 10 10 610 610 3610 8610 20 21 ETAAAA IGAAAA AAAAxx +8180 165 0 0 0 0 80 180 180 3180 8180 160 161 QCAAAA JGAAAA HHHHxx +2399 166 1 3 9 19 99 399 399 2399 2399 198 199 HOAAAA KGAAAA OOOOxx +615 167 1 3 5 15 15 615 615 615 615 30 31 RXAAAA LGAAAA VVVVxx +7629 168 1 1 9 9 29 629 1629 2629 7629 58 59 LHAAAA MGAAAA AAAAxx +7628 169 0 0 8 8 28 628 1628 2628 7628 56 57 KHAAAA NGAAAA HHHHxx +4659 170 1 3 9 19 59 659 659 4659 4659 118 119 FXAAAA OGAAAA OOOOxx +5865 171 1 1 5 5 65 865 1865 865 5865 130 131 PRAAAA PGAAAA VVVVxx +3973 172 1 1 3 13 73 973 1973 3973 3973 146 147 VWAAAA QGAAAA AAAAxx +552 173 0 0 2 12 52 552 552 552 552 104 105 GVAAAA RGAAAA HHHHxx +708 174 0 0 8 8 8 708 708 708 708 16 17 GBAAAA SGAAAA OOOOxx +3550 175 0 2 0 10 50 550 1550 3550 3550 100 101 OGAAAA TGAAAA VVVVxx +5547 176 1 3 7 7 47 547 1547 547 5547 94 95 JFAAAA UGAAAA AAAAxx +489 177 1 1 9 9 89 489 489 489 489 178 179 VSAAAA VGAAAA HHHHxx +3794 178 0 2 4 14 94 794 1794 3794 3794 188 189 YPAAAA WGAAAA OOOOxx +9479 179 1 3 9 19 79 479 1479 4479 9479 158 159 PAAAAA XGAAAA VVVVxx +6435 180 1 3 5 15 35 435 435 1435 6435 70 71 NNAAAA YGAAAA AAAAxx +5120 181 0 0 0 0 20 120 1120 120 5120 40 41 YOAAAA ZGAAAA HHHHxx +3615 182 1 3 5 15 15 615 1615 3615 3615 30 31 BJAAAA AHAAAA OOOOxx +8399 183 1 3 9 19 99 399 399 3399 8399 198 199 BLAAAA BHAAAA VVVVxx +2155 184 1 3 5 15 55 155 155 2155 2155 110 111 XEAAAA CHAAAA AAAAxx +6690 185 0 2 0 10 90 690 690 1690 6690 180 181 IXAAAA DHAAAA HHHHxx +1683 186 1 3 3 3 83 683 1683 1683 1683 166 167 TMAAAA EHAAAA OOOOxx +6302 187 0 2 2 2 2 302 302 1302 6302 4 5 KIAAAA FHAAAA VVVVxx +516 188 0 0 6 16 16 516 516 516 516 32 33 WTAAAA GHAAAA AAAAxx +3901 189 1 1 1 1 1 901 1901 3901 3901 2 3 BUAAAA HHAAAA HHHHxx +6938 190 0 2 8 18 38 938 938 1938 6938 76 77 WGAAAA IHAAAA OOOOxx +7484 191 0 0 4 4 84 484 1484 2484 7484 168 169 WBAAAA JHAAAA VVVVxx +7424 192 0 0 4 4 24 424 1424 2424 7424 48 49 OZAAAA KHAAAA AAAAxx +9410 193 0 2 0 10 10 410 1410 4410 9410 20 21 YXAAAA LHAAAA HHHHxx +1714 194 0 2 4 14 14 714 1714 1714 1714 28 29 YNAAAA MHAAAA OOOOxx +8278 195 0 2 8 18 78 278 278 3278 8278 156 157 KGAAAA NHAAAA VVVVxx +3158 196 0 2 8 18 58 158 1158 3158 3158 116 117 MRAAAA OHAAAA AAAAxx +2511 197 1 3 1 11 11 511 511 2511 2511 22 23 PSAAAA PHAAAA HHHHxx +2912 198 0 0 2 12 12 912 912 2912 2912 24 25 AIAAAA QHAAAA OOOOxx +2648 199 0 0 8 8 48 648 648 2648 2648 96 97 WXAAAA RHAAAA VVVVxx +9385 200 1 1 5 5 85 385 1385 4385 9385 170 171 ZWAAAA SHAAAA AAAAxx +7545 201 1 1 5 5 45 545 1545 2545 7545 90 91 FEAAAA THAAAA HHHHxx +8407 202 1 3 7 7 7 407 407 3407 8407 14 15 JLAAAA UHAAAA OOOOxx +5893 203 1 1 3 13 93 893 1893 893 5893 186 187 RSAAAA VHAAAA VVVVxx +7049 204 1 1 9 9 49 49 1049 2049 7049 98 99 DLAAAA WHAAAA AAAAxx +6812 205 0 0 2 12 12 812 812 1812 6812 24 25 ACAAAA XHAAAA HHHHxx +3649 206 1 1 9 9 49 649 1649 3649 3649 98 99 JKAAAA YHAAAA OOOOxx +9275 207 1 3 5 15 75 275 1275 4275 9275 150 151 TSAAAA ZHAAAA VVVVxx +1179 208 1 3 9 19 79 179 1179 1179 1179 158 159 JTAAAA AIAAAA AAAAxx +969 209 1 1 9 9 69 969 969 969 969 138 139 HLAAAA BIAAAA HHHHxx +7920 210 0 0 0 0 20 920 1920 2920 7920 40 41 QSAAAA CIAAAA OOOOxx +998 211 0 2 8 18 98 998 998 998 998 196 197 KMAAAA DIAAAA VVVVxx +3958 212 0 2 8 18 58 958 1958 3958 3958 116 117 GWAAAA EIAAAA AAAAxx +6052 213 0 0 2 12 52 52 52 1052 6052 104 105 UYAAAA FIAAAA HHHHxx +8791 214 1 3 1 11 91 791 791 3791 8791 182 183 DAAAAA GIAAAA OOOOxx +5191 215 1 3 1 11 91 191 1191 191 5191 182 183 RRAAAA HIAAAA VVVVxx +4267 216 1 3 7 7 67 267 267 4267 4267 134 135 DIAAAA IIAAAA AAAAxx +2829 217 1 1 9 9 29 829 829 2829 2829 58 59 VEAAAA JIAAAA HHHHxx +6396 218 0 0 6 16 96 396 396 1396 6396 192 193 AMAAAA KIAAAA OOOOxx +9413 219 1 1 3 13 13 413 1413 4413 9413 26 27 BYAAAA LIAAAA VVVVxx +614 220 0 2 4 14 14 614 614 614 614 28 29 QXAAAA MIAAAA AAAAxx +4660 221 0 0 0 0 60 660 660 4660 4660 120 121 GXAAAA NIAAAA HHHHxx +8834 222 0 2 4 14 34 834 834 3834 8834 68 69 UBAAAA OIAAAA OOOOxx +2767 223 1 3 7 7 67 767 767 2767 2767 134 135 LCAAAA PIAAAA VVVVxx +2444 224 0 0 4 4 44 444 444 2444 2444 88 89 AQAAAA QIAAAA AAAAxx +4129 225 1 1 9 9 29 129 129 4129 4129 58 59 VCAAAA RIAAAA HHHHxx +3394 226 0 2 4 14 94 394 1394 3394 3394 188 189 OAAAAA SIAAAA OOOOxx +2705 227 1 1 5 5 5 705 705 2705 2705 10 11 BAAAAA TIAAAA VVVVxx +8499 228 1 3 9 19 99 499 499 3499 8499 198 199 XOAAAA UIAAAA AAAAxx +8852 229 0 0 2 12 52 852 852 3852 8852 104 105 MCAAAA VIAAAA HHHHxx +6174 230 0 2 4 14 74 174 174 1174 6174 148 149 MDAAAA WIAAAA OOOOxx +750 231 0 2 0 10 50 750 750 750 750 100 101 WCAAAA XIAAAA VVVVxx +8164 232 0 0 4 4 64 164 164 3164 8164 128 129 ACAAAA YIAAAA AAAAxx +4930 233 0 2 0 10 30 930 930 4930 4930 60 61 QHAAAA ZIAAAA HHHHxx +9904 234 0 0 4 4 4 904 1904 4904 9904 8 9 YQAAAA AJAAAA OOOOxx +7378 235 0 2 8 18 78 378 1378 2378 7378 156 157 UXAAAA BJAAAA VVVVxx +2927 236 1 3 7 7 27 927 927 2927 2927 54 55 PIAAAA CJAAAA AAAAxx +7155 237 1 3 5 15 55 155 1155 2155 7155 110 111 FPAAAA DJAAAA HHHHxx +1302 238 0 2 2 2 2 302 1302 1302 1302 4 5 CYAAAA EJAAAA OOOOxx +5904 239 0 0 4 4 4 904 1904 904 5904 8 9 CTAAAA FJAAAA VVVVxx +9687 240 1 3 7 7 87 687 1687 4687 9687 174 175 PIAAAA GJAAAA AAAAxx +3553 241 1 1 3 13 53 553 1553 3553 3553 106 107 RGAAAA HJAAAA HHHHxx +4447 242 1 3 7 7 47 447 447 4447 4447 94 95 BPAAAA IJAAAA OOOOxx +6878 243 0 2 8 18 78 878 878 1878 6878 156 157 OEAAAA JJAAAA VVVVxx +9470 244 0 2 0 10 70 470 1470 4470 9470 140 141 GAAAAA KJAAAA AAAAxx +9735 245 1 3 5 15 35 735 1735 4735 9735 70 71 LKAAAA LJAAAA HHHHxx +5967 246 1 3 7 7 67 967 1967 967 5967 134 135 NVAAAA MJAAAA OOOOxx +6601 247 1 1 1 1 1 601 601 1601 6601 2 3 XTAAAA NJAAAA VVVVxx +7631 248 1 3 1 11 31 631 1631 2631 7631 62 63 NHAAAA OJAAAA AAAAxx +3559 249 1 3 9 19 59 559 1559 3559 3559 118 119 XGAAAA PJAAAA HHHHxx +2247 250 1 3 7 7 47 247 247 2247 2247 94 95 LIAAAA QJAAAA OOOOxx +9649 251 1 1 9 9 49 649 1649 4649 9649 98 99 DHAAAA RJAAAA VVVVxx +808 252 0 0 8 8 8 808 808 808 808 16 17 CFAAAA SJAAAA AAAAxx +240 253 0 0 0 0 40 240 240 240 240 80 81 GJAAAA TJAAAA HHHHxx +5031 254 1 3 1 11 31 31 1031 31 5031 62 63 NLAAAA UJAAAA OOOOxx +9563 255 1 3 3 3 63 563 1563 4563 9563 126 127 VDAAAA VJAAAA VVVVxx +5656 256 0 0 6 16 56 656 1656 656 5656 112 113 OJAAAA WJAAAA AAAAxx +3886 257 0 2 6 6 86 886 1886 3886 3886 172 173 MTAAAA XJAAAA HHHHxx +2431 258 1 3 1 11 31 431 431 2431 2431 62 63 NPAAAA YJAAAA OOOOxx +5560 259 0 0 0 0 60 560 1560 560 5560 120 121 WFAAAA ZJAAAA VVVVxx +9065 260 1 1 5 5 65 65 1065 4065 9065 130 131 RKAAAA AKAAAA AAAAxx +8130 261 0 2 0 10 30 130 130 3130 8130 60 61 SAAAAA BKAAAA HHHHxx +4054 262 0 2 4 14 54 54 54 4054 4054 108 109 YZAAAA CKAAAA OOOOxx +873 263 1 1 3 13 73 873 873 873 873 146 147 PHAAAA DKAAAA VVVVxx +3092 264 0 0 2 12 92 92 1092 3092 3092 184 185 YOAAAA EKAAAA AAAAxx +6697 265 1 1 7 17 97 697 697 1697 6697 194 195 PXAAAA FKAAAA HHHHxx +2452 266 0 0 2 12 52 452 452 2452 2452 104 105 IQAAAA GKAAAA OOOOxx +7867 267 1 3 7 7 67 867 1867 2867 7867 134 135 PQAAAA HKAAAA VVVVxx +3753 268 1 1 3 13 53 753 1753 3753 3753 106 107 JOAAAA IKAAAA AAAAxx +7834 269 0 2 4 14 34 834 1834 2834 7834 68 69 IPAAAA JKAAAA HHHHxx +5846 270 0 2 6 6 46 846 1846 846 5846 92 93 WQAAAA KKAAAA OOOOxx +7604 271 0 0 4 4 4 604 1604 2604 7604 8 9 MGAAAA LKAAAA VVVVxx +3452 272 0 0 2 12 52 452 1452 3452 3452 104 105 UCAAAA MKAAAA AAAAxx +4788 273 0 0 8 8 88 788 788 4788 4788 176 177 ECAAAA NKAAAA HHHHxx +8600 274 0 0 0 0 0 600 600 3600 8600 0 1 USAAAA OKAAAA OOOOxx +8511 275 1 3 1 11 11 511 511 3511 8511 22 23 JPAAAA PKAAAA VVVVxx +4452 276 0 0 2 12 52 452 452 4452 4452 104 105 GPAAAA QKAAAA AAAAxx +1709 277 1 1 9 9 9 709 1709 1709 1709 18 19 TNAAAA RKAAAA HHHHxx +3440 278 0 0 0 0 40 440 1440 3440 3440 80 81 ICAAAA SKAAAA OOOOxx +9188 279 0 0 8 8 88 188 1188 4188 9188 176 177 KPAAAA TKAAAA VVVVxx +3058 280 0 2 8 18 58 58 1058 3058 3058 116 117 QNAAAA UKAAAA AAAAxx +5821 281 1 1 1 1 21 821 1821 821 5821 42 43 XPAAAA VKAAAA HHHHxx +3428 282 0 0 8 8 28 428 1428 3428 3428 56 57 WBAAAA WKAAAA OOOOxx +3581 283 1 1 1 1 81 581 1581 3581 3581 162 163 THAAAA XKAAAA VVVVxx +7523 284 1 3 3 3 23 523 1523 2523 7523 46 47 JDAAAA YKAAAA AAAAxx +3131 285 1 3 1 11 31 131 1131 3131 3131 62 63 LQAAAA ZKAAAA HHHHxx +2404 286 0 0 4 4 4 404 404 2404 2404 8 9 MOAAAA ALAAAA OOOOxx +5453 287 1 1 3 13 53 453 1453 453 5453 106 107 TBAAAA BLAAAA VVVVxx +1599 288 1 3 9 19 99 599 1599 1599 1599 198 199 NJAAAA CLAAAA AAAAxx +7081 289 1 1 1 1 81 81 1081 2081 7081 162 163 JMAAAA DLAAAA HHHHxx +1750 290 0 2 0 10 50 750 1750 1750 1750 100 101 IPAAAA ELAAAA OOOOxx +5085 291 1 1 5 5 85 85 1085 85 5085 170 171 PNAAAA FLAAAA VVVVxx +9777 292 1 1 7 17 77 777 1777 4777 9777 154 155 BMAAAA GLAAAA AAAAxx +574 293 0 2 4 14 74 574 574 574 574 148 149 CWAAAA HLAAAA HHHHxx +5984 294 0 0 4 4 84 984 1984 984 5984 168 169 EWAAAA ILAAAA OOOOxx +7039 295 1 3 9 19 39 39 1039 2039 7039 78 79 TKAAAA JLAAAA VVVVxx +7143 296 1 3 3 3 43 143 1143 2143 7143 86 87 TOAAAA KLAAAA AAAAxx +5702 297 0 2 2 2 2 702 1702 702 5702 4 5 ILAAAA LLAAAA HHHHxx +362 298 0 2 2 2 62 362 362 362 362 124 125 YNAAAA MLAAAA OOOOxx +6997 299 1 1 7 17 97 997 997 1997 6997 194 195 DJAAAA NLAAAA VVVVxx +2529 300 1 1 9 9 29 529 529 2529 2529 58 59 HTAAAA OLAAAA AAAAxx +6319 301 1 3 9 19 19 319 319 1319 6319 38 39 BJAAAA PLAAAA HHHHxx +954 302 0 2 4 14 54 954 954 954 954 108 109 SKAAAA QLAAAA OOOOxx +3413 303 1 1 3 13 13 413 1413 3413 3413 26 27 HBAAAA RLAAAA VVVVxx +9081 304 1 1 1 1 81 81 1081 4081 9081 162 163 HLAAAA SLAAAA AAAAxx +5599 305 1 3 9 19 99 599 1599 599 5599 198 199 JHAAAA TLAAAA HHHHxx +4772 306 0 0 2 12 72 772 772 4772 4772 144 145 OBAAAA ULAAAA OOOOxx +1124 307 0 0 4 4 24 124 1124 1124 1124 48 49 GRAAAA VLAAAA VVVVxx +7793 308 1 1 3 13 93 793 1793 2793 7793 186 187 TNAAAA WLAAAA AAAAxx +4201 309 1 1 1 1 1 201 201 4201 4201 2 3 PFAAAA XLAAAA HHHHxx +7015 310 1 3 5 15 15 15 1015 2015 7015 30 31 VJAAAA YLAAAA OOOOxx +5936 311 0 0 6 16 36 936 1936 936 5936 72 73 IUAAAA ZLAAAA VVVVxx +4625 312 1 1 5 5 25 625 625 4625 4625 50 51 XVAAAA AMAAAA AAAAxx +4989 313 1 1 9 9 89 989 989 4989 4989 178 179 XJAAAA BMAAAA HHHHxx +4949 314 1 1 9 9 49 949 949 4949 4949 98 99 JIAAAA CMAAAA OOOOxx +6273 315 1 1 3 13 73 273 273 1273 6273 146 147 HHAAAA DMAAAA VVVVxx +4478 316 0 2 8 18 78 478 478 4478 4478 156 157 GQAAAA EMAAAA AAAAxx +8854 317 0 2 4 14 54 854 854 3854 8854 108 109 OCAAAA FMAAAA HHHHxx +2105 318 1 1 5 5 5 105 105 2105 2105 10 11 ZCAAAA GMAAAA OOOOxx +8345 319 1 1 5 5 45 345 345 3345 8345 90 91 ZIAAAA HMAAAA VVVVxx +1941 320 1 1 1 1 41 941 1941 1941 1941 82 83 RWAAAA IMAAAA AAAAxx +1765 321 1 1 5 5 65 765 1765 1765 1765 130 131 XPAAAA JMAAAA HHHHxx +9592 322 0 0 2 12 92 592 1592 4592 9592 184 185 YEAAAA KMAAAA OOOOxx +1694 323 0 2 4 14 94 694 1694 1694 1694 188 189 ENAAAA LMAAAA VVVVxx +8940 324 0 0 0 0 40 940 940 3940 8940 80 81 WFAAAA MMAAAA AAAAxx +7264 325 0 0 4 4 64 264 1264 2264 7264 128 129 KTAAAA NMAAAA HHHHxx +4699 326 1 3 9 19 99 699 699 4699 4699 198 199 TYAAAA OMAAAA OOOOxx +4541 327 1 1 1 1 41 541 541 4541 4541 82 83 RSAAAA PMAAAA VVVVxx +5768 328 0 0 8 8 68 768 1768 768 5768 136 137 WNAAAA QMAAAA AAAAxx +6183 329 1 3 3 3 83 183 183 1183 6183 166 167 VDAAAA RMAAAA HHHHxx +7457 330 1 1 7 17 57 457 1457 2457 7457 114 115 VAAAAA SMAAAA OOOOxx +7317 331 1 1 7 17 17 317 1317 2317 7317 34 35 LVAAAA TMAAAA VVVVxx +1944 332 0 0 4 4 44 944 1944 1944 1944 88 89 UWAAAA UMAAAA AAAAxx +665 333 1 1 5 5 65 665 665 665 665 130 131 PZAAAA VMAAAA HHHHxx +5974 334 0 2 4 14 74 974 1974 974 5974 148 149 UVAAAA WMAAAA OOOOxx +7370 335 0 2 0 10 70 370 1370 2370 7370 140 141 MXAAAA XMAAAA VVVVxx +9196 336 0 0 6 16 96 196 1196 4196 9196 192 193 SPAAAA YMAAAA AAAAxx +6796 337 0 0 6 16 96 796 796 1796 6796 192 193 KBAAAA ZMAAAA HHHHxx +6180 338 0 0 0 0 80 180 180 1180 6180 160 161 SDAAAA ANAAAA OOOOxx +8557 339 1 1 7 17 57 557 557 3557 8557 114 115 DRAAAA BNAAAA VVVVxx +928 340 0 0 8 8 28 928 928 928 928 56 57 SJAAAA CNAAAA AAAAxx +6275 341 1 3 5 15 75 275 275 1275 6275 150 151 JHAAAA DNAAAA HHHHxx +409 342 1 1 9 9 9 409 409 409 409 18 19 TPAAAA ENAAAA OOOOxx +6442 343 0 2 2 2 42 442 442 1442 6442 84 85 UNAAAA FNAAAA VVVVxx +5889 344 1 1 9 9 89 889 1889 889 5889 178 179 NSAAAA GNAAAA AAAAxx +5180 345 0 0 0 0 80 180 1180 180 5180 160 161 GRAAAA HNAAAA HHHHxx +1629 346 1 1 9 9 29 629 1629 1629 1629 58 59 RKAAAA INAAAA OOOOxx +6088 347 0 0 8 8 88 88 88 1088 6088 176 177 EAAAAA JNAAAA VVVVxx +5598 348 0 2 8 18 98 598 1598 598 5598 196 197 IHAAAA KNAAAA AAAAxx +1803 349 1 3 3 3 3 803 1803 1803 1803 6 7 JRAAAA LNAAAA HHHHxx +2330 350 0 2 0 10 30 330 330 2330 2330 60 61 QLAAAA MNAAAA OOOOxx +5901 351 1 1 1 1 1 901 1901 901 5901 2 3 ZSAAAA NNAAAA VVVVxx +780 352 0 0 0 0 80 780 780 780 780 160 161 AEAAAA ONAAAA AAAAxx +7171 353 1 3 1 11 71 171 1171 2171 7171 142 143 VPAAAA PNAAAA HHHHxx +8778 354 0 2 8 18 78 778 778 3778 8778 156 157 QZAAAA QNAAAA OOOOxx +6622 355 0 2 2 2 22 622 622 1622 6622 44 45 SUAAAA RNAAAA VVVVxx +9938 356 0 2 8 18 38 938 1938 4938 9938 76 77 GSAAAA SNAAAA AAAAxx +8254 357 0 2 4 14 54 254 254 3254 8254 108 109 MFAAAA TNAAAA HHHHxx +1951 358 1 3 1 11 51 951 1951 1951 1951 102 103 BXAAAA UNAAAA OOOOxx +1434 359 0 2 4 14 34 434 1434 1434 1434 68 69 EDAAAA VNAAAA VVVVxx +7539 360 1 3 9 19 39 539 1539 2539 7539 78 79 ZDAAAA WNAAAA AAAAxx +600 361 0 0 0 0 0 600 600 600 600 0 1 CXAAAA XNAAAA HHHHxx +3122 362 0 2 2 2 22 122 1122 3122 3122 44 45 CQAAAA YNAAAA OOOOxx +5704 363 0 0 4 4 4 704 1704 704 5704 8 9 KLAAAA ZNAAAA VVVVxx +6300 364 0 0 0 0 0 300 300 1300 6300 0 1 IIAAAA AOAAAA AAAAxx +4585 365 1 1 5 5 85 585 585 4585 4585 170 171 JUAAAA BOAAAA HHHHxx +6313 366 1 1 3 13 13 313 313 1313 6313 26 27 VIAAAA COAAAA OOOOxx +3154 367 0 2 4 14 54 154 1154 3154 3154 108 109 IRAAAA DOAAAA VVVVxx +642 368 0 2 2 2 42 642 642 642 642 84 85 SYAAAA EOAAAA AAAAxx +7736 369 0 0 6 16 36 736 1736 2736 7736 72 73 OLAAAA FOAAAA HHHHxx +5087 370 1 3 7 7 87 87 1087 87 5087 174 175 RNAAAA GOAAAA OOOOxx +5708 371 0 0 8 8 8 708 1708 708 5708 16 17 OLAAAA HOAAAA VVVVxx +8169 372 1 1 9 9 69 169 169 3169 8169 138 139 FCAAAA IOAAAA AAAAxx +9768 373 0 0 8 8 68 768 1768 4768 9768 136 137 SLAAAA JOAAAA HHHHxx +3874 374 0 2 4 14 74 874 1874 3874 3874 148 149 ATAAAA KOAAAA OOOOxx +6831 375 1 3 1 11 31 831 831 1831 6831 62 63 TCAAAA LOAAAA VVVVxx +18 376 0 2 8 18 18 18 18 18 18 36 37 SAAAAA MOAAAA AAAAxx +6375 377 1 3 5 15 75 375 375 1375 6375 150 151 FLAAAA NOAAAA HHHHxx +7106 378 0 2 6 6 6 106 1106 2106 7106 12 13 INAAAA OOAAAA OOOOxx +5926 379 0 2 6 6 26 926 1926 926 5926 52 53 YTAAAA POAAAA VVVVxx +4956 380 0 0 6 16 56 956 956 4956 4956 112 113 QIAAAA QOAAAA AAAAxx +7042 381 0 2 2 2 42 42 1042 2042 7042 84 85 WKAAAA ROAAAA HHHHxx +6043 382 1 3 3 3 43 43 43 1043 6043 86 87 LYAAAA SOAAAA OOOOxx +2084 383 0 0 4 4 84 84 84 2084 2084 168 169 ECAAAA TOAAAA VVVVxx +6038 384 0 2 8 18 38 38 38 1038 6038 76 77 GYAAAA UOAAAA AAAAxx +7253 385 1 1 3 13 53 253 1253 2253 7253 106 107 ZSAAAA VOAAAA HHHHxx +2061 386 1 1 1 1 61 61 61 2061 2061 122 123 HBAAAA WOAAAA OOOOxx +7800 387 0 0 0 0 0 800 1800 2800 7800 0 1 AOAAAA XOAAAA VVVVxx +4970 388 0 2 0 10 70 970 970 4970 4970 140 141 EJAAAA YOAAAA AAAAxx +8580 389 0 0 0 0 80 580 580 3580 8580 160 161 ASAAAA ZOAAAA HHHHxx +9173 390 1 1 3 13 73 173 1173 4173 9173 146 147 VOAAAA APAAAA OOOOxx +8558 391 0 2 8 18 58 558 558 3558 8558 116 117 ERAAAA BPAAAA VVVVxx +3897 392 1 1 7 17 97 897 1897 3897 3897 194 195 XTAAAA CPAAAA AAAAxx +5069 393 1 1 9 9 69 69 1069 69 5069 138 139 ZMAAAA DPAAAA HHHHxx +2301 394 1 1 1 1 1 301 301 2301 2301 2 3 NKAAAA EPAAAA OOOOxx +9863 395 1 3 3 3 63 863 1863 4863 9863 126 127 JPAAAA FPAAAA VVVVxx +5733 396 1 1 3 13 33 733 1733 733 5733 66 67 NMAAAA GPAAAA AAAAxx +2338 397 0 2 8 18 38 338 338 2338 2338 76 77 YLAAAA HPAAAA HHHHxx +9639 398 1 3 9 19 39 639 1639 4639 9639 78 79 TGAAAA IPAAAA OOOOxx +1139 399 1 3 9 19 39 139 1139 1139 1139 78 79 VRAAAA JPAAAA VVVVxx +2293 400 1 1 3 13 93 293 293 2293 2293 186 187 FKAAAA KPAAAA AAAAxx +6125 401 1 1 5 5 25 125 125 1125 6125 50 51 PBAAAA LPAAAA HHHHxx +5374 402 0 2 4 14 74 374 1374 374 5374 148 149 SYAAAA MPAAAA OOOOxx +7216 403 0 0 6 16 16 216 1216 2216 7216 32 33 ORAAAA NPAAAA VVVVxx +2285 404 1 1 5 5 85 285 285 2285 2285 170 171 XJAAAA OPAAAA AAAAxx +2387 405 1 3 7 7 87 387 387 2387 2387 174 175 VNAAAA PPAAAA HHHHxx +5015 406 1 3 5 15 15 15 1015 15 5015 30 31 XKAAAA QPAAAA OOOOxx +2087 407 1 3 7 7 87 87 87 2087 2087 174 175 HCAAAA RPAAAA VVVVxx +4938 408 0 2 8 18 38 938 938 4938 4938 76 77 YHAAAA SPAAAA AAAAxx +3635 409 1 3 5 15 35 635 1635 3635 3635 70 71 VJAAAA TPAAAA HHHHxx +7737 410 1 1 7 17 37 737 1737 2737 7737 74 75 PLAAAA UPAAAA OOOOxx +8056 411 0 0 6 16 56 56 56 3056 8056 112 113 WXAAAA VPAAAA VVVVxx +4502 412 0 2 2 2 2 502 502 4502 4502 4 5 ERAAAA WPAAAA AAAAxx +54 413 0 2 4 14 54 54 54 54 54 108 109 CCAAAA XPAAAA HHHHxx +3182 414 0 2 2 2 82 182 1182 3182 3182 164 165 KSAAAA YPAAAA OOOOxx +3718 415 0 2 8 18 18 718 1718 3718 3718 36 37 ANAAAA ZPAAAA VVVVxx +3989 416 1 1 9 9 89 989 1989 3989 3989 178 179 LXAAAA AQAAAA AAAAxx +8028 417 0 0 8 8 28 28 28 3028 8028 56 57 UWAAAA BQAAAA HHHHxx +1426 418 0 2 6 6 26 426 1426 1426 1426 52 53 WCAAAA CQAAAA OOOOxx +3801 419 1 1 1 1 1 801 1801 3801 3801 2 3 FQAAAA DQAAAA VVVVxx +241 420 1 1 1 1 41 241 241 241 241 82 83 HJAAAA EQAAAA AAAAxx +8000 421 0 0 0 0 0 0 0 3000 8000 0 1 SVAAAA FQAAAA HHHHxx +8357 422 1 1 7 17 57 357 357 3357 8357 114 115 LJAAAA GQAAAA OOOOxx +7548 423 0 0 8 8 48 548 1548 2548 7548 96 97 IEAAAA HQAAAA VVVVxx +7307 424 1 3 7 7 7 307 1307 2307 7307 14 15 BVAAAA IQAAAA AAAAxx +2275 425 1 3 5 15 75 275 275 2275 2275 150 151 NJAAAA JQAAAA HHHHxx +2718 426 0 2 8 18 18 718 718 2718 2718 36 37 OAAAAA KQAAAA OOOOxx +7068 427 0 0 8 8 68 68 1068 2068 7068 136 137 WLAAAA LQAAAA VVVVxx +3181 428 1 1 1 1 81 181 1181 3181 3181 162 163 JSAAAA MQAAAA AAAAxx +749 429 1 1 9 9 49 749 749 749 749 98 99 VCAAAA NQAAAA HHHHxx +5195 430 1 3 5 15 95 195 1195 195 5195 190 191 VRAAAA OQAAAA OOOOxx +6136 431 0 0 6 16 36 136 136 1136 6136 72 73 ACAAAA PQAAAA VVVVxx +8012 432 0 0 2 12 12 12 12 3012 8012 24 25 EWAAAA QQAAAA AAAAxx +3957 433 1 1 7 17 57 957 1957 3957 3957 114 115 FWAAAA RQAAAA HHHHxx +3083 434 1 3 3 3 83 83 1083 3083 3083 166 167 POAAAA SQAAAA OOOOxx +9997 435 1 1 7 17 97 997 1997 4997 9997 194 195 NUAAAA TQAAAA VVVVxx +3299 436 1 3 9 19 99 299 1299 3299 3299 198 199 XWAAAA UQAAAA AAAAxx +846 437 0 2 6 6 46 846 846 846 846 92 93 OGAAAA VQAAAA HHHHxx +2985 438 1 1 5 5 85 985 985 2985 2985 170 171 VKAAAA WQAAAA OOOOxx +9238 439 0 2 8 18 38 238 1238 4238 9238 76 77 IRAAAA XQAAAA VVVVxx +1403 440 1 3 3 3 3 403 1403 1403 1403 6 7 ZBAAAA YQAAAA AAAAxx +5563 441 1 3 3 3 63 563 1563 563 5563 126 127 ZFAAAA ZQAAAA HHHHxx +7965 442 1 1 5 5 65 965 1965 2965 7965 130 131 JUAAAA ARAAAA OOOOxx +4512 443 0 0 2 12 12 512 512 4512 4512 24 25 ORAAAA BRAAAA VVVVxx +9730 444 0 2 0 10 30 730 1730 4730 9730 60 61 GKAAAA CRAAAA AAAAxx +1129 445 1 1 9 9 29 129 1129 1129 1129 58 59 LRAAAA DRAAAA HHHHxx +2624 446 0 0 4 4 24 624 624 2624 2624 48 49 YWAAAA ERAAAA OOOOxx +8178 447 0 2 8 18 78 178 178 3178 8178 156 157 OCAAAA FRAAAA VVVVxx +6468 448 0 0 8 8 68 468 468 1468 6468 136 137 UOAAAA GRAAAA AAAAxx +3027 449 1 3 7 7 27 27 1027 3027 3027 54 55 LMAAAA HRAAAA HHHHxx +3845 450 1 1 5 5 45 845 1845 3845 3845 90 91 XRAAAA IRAAAA OOOOxx +786 451 0 2 6 6 86 786 786 786 786 172 173 GEAAAA JRAAAA VVVVxx +4971 452 1 3 1 11 71 971 971 4971 4971 142 143 FJAAAA KRAAAA AAAAxx +1542 453 0 2 2 2 42 542 1542 1542 1542 84 85 IHAAAA LRAAAA HHHHxx +7967 454 1 3 7 7 67 967 1967 2967 7967 134 135 LUAAAA MRAAAA OOOOxx +443 455 1 3 3 3 43 443 443 443 443 86 87 BRAAAA NRAAAA VVVVxx +7318 456 0 2 8 18 18 318 1318 2318 7318 36 37 MVAAAA ORAAAA AAAAxx +4913 457 1 1 3 13 13 913 913 4913 4913 26 27 ZGAAAA PRAAAA HHHHxx +9466 458 0 2 6 6 66 466 1466 4466 9466 132 133 CAAAAA QRAAAA OOOOxx +7866 459 0 2 6 6 66 866 1866 2866 7866 132 133 OQAAAA RRAAAA VVVVxx +784 460 0 0 4 4 84 784 784 784 784 168 169 EEAAAA SRAAAA AAAAxx +9040 461 0 0 0 0 40 40 1040 4040 9040 80 81 SJAAAA TRAAAA HHHHxx +3954 462 0 2 4 14 54 954 1954 3954 3954 108 109 CWAAAA URAAAA OOOOxx +4183 463 1 3 3 3 83 183 183 4183 4183 166 167 XEAAAA VRAAAA VVVVxx +3608 464 0 0 8 8 8 608 1608 3608 3608 16 17 UIAAAA WRAAAA AAAAxx +7630 465 0 2 0 10 30 630 1630 2630 7630 60 61 MHAAAA XRAAAA HHHHxx +590 466 0 2 0 10 90 590 590 590 590 180 181 SWAAAA YRAAAA OOOOxx +3453 467 1 1 3 13 53 453 1453 3453 3453 106 107 VCAAAA ZRAAAA VVVVxx +7757 468 1 1 7 17 57 757 1757 2757 7757 114 115 JMAAAA ASAAAA AAAAxx +7394 469 0 2 4 14 94 394 1394 2394 7394 188 189 KYAAAA BSAAAA HHHHxx +396 470 0 0 6 16 96 396 396 396 396 192 193 GPAAAA CSAAAA OOOOxx +7873 471 1 1 3 13 73 873 1873 2873 7873 146 147 VQAAAA DSAAAA VVVVxx +1553 472 1 1 3 13 53 553 1553 1553 1553 106 107 THAAAA ESAAAA AAAAxx +598 473 0 2 8 18 98 598 598 598 598 196 197 AXAAAA FSAAAA HHHHxx +7191 474 1 3 1 11 91 191 1191 2191 7191 182 183 PQAAAA GSAAAA OOOOxx +8116 475 0 0 6 16 16 116 116 3116 8116 32 33 EAAAAA HSAAAA VVVVxx +2516 476 0 0 6 16 16 516 516 2516 2516 32 33 USAAAA ISAAAA AAAAxx +7750 477 0 2 0 10 50 750 1750 2750 7750 100 101 CMAAAA JSAAAA HHHHxx +6625 478 1 1 5 5 25 625 625 1625 6625 50 51 VUAAAA KSAAAA OOOOxx +8838 479 0 2 8 18 38 838 838 3838 8838 76 77 YBAAAA LSAAAA VVVVxx +4636 480 0 0 6 16 36 636 636 4636 4636 72 73 IWAAAA MSAAAA AAAAxx +7627 481 1 3 7 7 27 627 1627 2627 7627 54 55 JHAAAA NSAAAA HHHHxx +1690 482 0 2 0 10 90 690 1690 1690 1690 180 181 ANAAAA OSAAAA OOOOxx +7071 483 1 3 1 11 71 71 1071 2071 7071 142 143 ZLAAAA PSAAAA VVVVxx +2081 484 1 1 1 1 81 81 81 2081 2081 162 163 BCAAAA QSAAAA AAAAxx +7138 485 0 2 8 18 38 138 1138 2138 7138 76 77 OOAAAA RSAAAA HHHHxx +864 486 0 0 4 4 64 864 864 864 864 128 129 GHAAAA SSAAAA OOOOxx +6392 487 0 0 2 12 92 392 392 1392 6392 184 185 WLAAAA TSAAAA VVVVxx +7544 488 0 0 4 4 44 544 1544 2544 7544 88 89 EEAAAA USAAAA AAAAxx +5438 489 0 2 8 18 38 438 1438 438 5438 76 77 EBAAAA VSAAAA HHHHxx +7099 490 1 3 9 19 99 99 1099 2099 7099 198 199 BNAAAA WSAAAA OOOOxx +5157 491 1 1 7 17 57 157 1157 157 5157 114 115 JQAAAA XSAAAA VVVVxx +3391 492 1 3 1 11 91 391 1391 3391 3391 182 183 LAAAAA YSAAAA AAAAxx +3805 493 1 1 5 5 5 805 1805 3805 3805 10 11 JQAAAA ZSAAAA HHHHxx +2110 494 0 2 0 10 10 110 110 2110 2110 20 21 EDAAAA ATAAAA OOOOxx +3176 495 0 0 6 16 76 176 1176 3176 3176 152 153 ESAAAA BTAAAA VVVVxx +5918 496 0 2 8 18 18 918 1918 918 5918 36 37 QTAAAA CTAAAA AAAAxx +1218 497 0 2 8 18 18 218 1218 1218 1218 36 37 WUAAAA DTAAAA HHHHxx +6683 498 1 3 3 3 83 683 683 1683 6683 166 167 BXAAAA ETAAAA OOOOxx +914 499 0 2 4 14 14 914 914 914 914 28 29 EJAAAA FTAAAA VVVVxx +4737 500 1 1 7 17 37 737 737 4737 4737 74 75 FAAAAA GTAAAA AAAAxx +7286 501 0 2 6 6 86 286 1286 2286 7286 172 173 GUAAAA HTAAAA HHHHxx +9975 502 1 3 5 15 75 975 1975 4975 9975 150 151 RTAAAA ITAAAA OOOOxx +8030 503 0 2 0 10 30 30 30 3030 8030 60 61 WWAAAA JTAAAA VVVVxx +7364 504 0 0 4 4 64 364 1364 2364 7364 128 129 GXAAAA KTAAAA AAAAxx +1389 505 1 1 9 9 89 389 1389 1389 1389 178 179 LBAAAA LTAAAA HHHHxx +4025 506 1 1 5 5 25 25 25 4025 4025 50 51 VYAAAA MTAAAA OOOOxx +4835 507 1 3 5 15 35 835 835 4835 4835 70 71 ZDAAAA NTAAAA VVVVxx +8045 508 1 1 5 5 45 45 45 3045 8045 90 91 LXAAAA OTAAAA AAAAxx +1864 509 0 0 4 4 64 864 1864 1864 1864 128 129 STAAAA PTAAAA HHHHxx +3313 510 1 1 3 13 13 313 1313 3313 3313 26 27 LXAAAA QTAAAA OOOOxx +2384 511 0 0 4 4 84 384 384 2384 2384 168 169 SNAAAA RTAAAA VVVVxx +6115 512 1 3 5 15 15 115 115 1115 6115 30 31 FBAAAA STAAAA AAAAxx +5705 513 1 1 5 5 5 705 1705 705 5705 10 11 LLAAAA TTAAAA HHHHxx +9269 514 1 1 9 9 69 269 1269 4269 9269 138 139 NSAAAA UTAAAA OOOOxx +3379 515 1 3 9 19 79 379 1379 3379 3379 158 159 ZZAAAA VTAAAA VVVVxx +8205 516 1 1 5 5 5 205 205 3205 8205 10 11 PDAAAA WTAAAA AAAAxx +6575 517 1 3 5 15 75 575 575 1575 6575 150 151 XSAAAA XTAAAA HHHHxx +486 518 0 2 6 6 86 486 486 486 486 172 173 SSAAAA YTAAAA OOOOxx +4894 519 0 2 4 14 94 894 894 4894 4894 188 189 GGAAAA ZTAAAA VVVVxx +3090 520 0 2 0 10 90 90 1090 3090 3090 180 181 WOAAAA AUAAAA AAAAxx +759 521 1 3 9 19 59 759 759 759 759 118 119 FDAAAA BUAAAA HHHHxx +4864 522 0 0 4 4 64 864 864 4864 4864 128 129 CFAAAA CUAAAA OOOOxx +4083 523 1 3 3 3 83 83 83 4083 4083 166 167 BBAAAA DUAAAA VVVVxx +6918 524 0 2 8 18 18 918 918 1918 6918 36 37 CGAAAA EUAAAA AAAAxx +8146 525 0 2 6 6 46 146 146 3146 8146 92 93 IBAAAA FUAAAA HHHHxx +1523 526 1 3 3 3 23 523 1523 1523 1523 46 47 PGAAAA GUAAAA OOOOxx +1591 527 1 3 1 11 91 591 1591 1591 1591 182 183 FJAAAA HUAAAA VVVVxx +3343 528 1 3 3 3 43 343 1343 3343 3343 86 87 PYAAAA IUAAAA AAAAxx +1391 529 1 3 1 11 91 391 1391 1391 1391 182 183 NBAAAA JUAAAA HHHHxx +9963 530 1 3 3 3 63 963 1963 4963 9963 126 127 FTAAAA KUAAAA OOOOxx +2423 531 1 3 3 3 23 423 423 2423 2423 46 47 FPAAAA LUAAAA VVVVxx +1822 532 0 2 2 2 22 822 1822 1822 1822 44 45 CSAAAA MUAAAA AAAAxx +8706 533 0 2 6 6 6 706 706 3706 8706 12 13 WWAAAA NUAAAA HHHHxx +3001 534 1 1 1 1 1 1 1001 3001 3001 2 3 LLAAAA OUAAAA OOOOxx +6707 535 1 3 7 7 7 707 707 1707 6707 14 15 ZXAAAA PUAAAA VVVVxx +2121 536 1 1 1 1 21 121 121 2121 2121 42 43 PDAAAA QUAAAA AAAAxx +5814 537 0 2 4 14 14 814 1814 814 5814 28 29 QPAAAA RUAAAA HHHHxx +2659 538 1 3 9 19 59 659 659 2659 2659 118 119 HYAAAA SUAAAA OOOOxx +2016 539 0 0 6 16 16 16 16 2016 2016 32 33 OZAAAA TUAAAA VVVVxx +4286 540 0 2 6 6 86 286 286 4286 4286 172 173 WIAAAA UUAAAA AAAAxx +9205 541 1 1 5 5 5 205 1205 4205 9205 10 11 BQAAAA VUAAAA HHHHxx +3496 542 0 0 6 16 96 496 1496 3496 3496 192 193 MEAAAA WUAAAA OOOOxx +5333 543 1 1 3 13 33 333 1333 333 5333 66 67 DXAAAA XUAAAA VVVVxx +5571 544 1 3 1 11 71 571 1571 571 5571 142 143 HGAAAA YUAAAA AAAAxx +1696 545 0 0 6 16 96 696 1696 1696 1696 192 193 GNAAAA ZUAAAA HHHHxx +4871 546 1 3 1 11 71 871 871 4871 4871 142 143 JFAAAA AVAAAA OOOOxx +4852 547 0 0 2 12 52 852 852 4852 4852 104 105 QEAAAA BVAAAA VVVVxx +8483 548 1 3 3 3 83 483 483 3483 8483 166 167 HOAAAA CVAAAA AAAAxx +1376 549 0 0 6 16 76 376 1376 1376 1376 152 153 YAAAAA DVAAAA HHHHxx +5456 550 0 0 6 16 56 456 1456 456 5456 112 113 WBAAAA EVAAAA OOOOxx +499 551 1 3 9 19 99 499 499 499 499 198 199 FTAAAA FVAAAA VVVVxx +3463 552 1 3 3 3 63 463 1463 3463 3463 126 127 FDAAAA GVAAAA AAAAxx +7426 553 0 2 6 6 26 426 1426 2426 7426 52 53 QZAAAA HVAAAA HHHHxx +5341 554 1 1 1 1 41 341 1341 341 5341 82 83 LXAAAA IVAAAA OOOOxx +9309 555 1 1 9 9 9 309 1309 4309 9309 18 19 BUAAAA JVAAAA VVVVxx +2055 556 1 3 5 15 55 55 55 2055 2055 110 111 BBAAAA KVAAAA AAAAxx +2199 557 1 3 9 19 99 199 199 2199 2199 198 199 PGAAAA LVAAAA HHHHxx +7235 558 1 3 5 15 35 235 1235 2235 7235 70 71 HSAAAA MVAAAA OOOOxx +8661 559 1 1 1 1 61 661 661 3661 8661 122 123 DVAAAA NVAAAA VVVVxx +9494 560 0 2 4 14 94 494 1494 4494 9494 188 189 EBAAAA OVAAAA AAAAxx +935 561 1 3 5 15 35 935 935 935 935 70 71 ZJAAAA PVAAAA HHHHxx +7044 562 0 0 4 4 44 44 1044 2044 7044 88 89 YKAAAA QVAAAA OOOOxx +1974 563 0 2 4 14 74 974 1974 1974 1974 148 149 YXAAAA RVAAAA VVVVxx +9679 564 1 3 9 19 79 679 1679 4679 9679 158 159 HIAAAA SVAAAA AAAAxx +9822 565 0 2 2 2 22 822 1822 4822 9822 44 45 UNAAAA TVAAAA HHHHxx +4088 566 0 0 8 8 88 88 88 4088 4088 176 177 GBAAAA UVAAAA OOOOxx +1749 567 1 1 9 9 49 749 1749 1749 1749 98 99 HPAAAA VVAAAA VVVVxx +2116 568 0 0 6 16 16 116 116 2116 2116 32 33 KDAAAA WVAAAA AAAAxx +976 569 0 0 6 16 76 976 976 976 976 152 153 OLAAAA XVAAAA HHHHxx +8689 570 1 1 9 9 89 689 689 3689 8689 178 179 FWAAAA YVAAAA OOOOxx +2563 571 1 3 3 3 63 563 563 2563 2563 126 127 PUAAAA ZVAAAA VVVVxx +7195 572 1 3 5 15 95 195 1195 2195 7195 190 191 TQAAAA AWAAAA AAAAxx +9985 573 1 1 5 5 85 985 1985 4985 9985 170 171 BUAAAA BWAAAA HHHHxx +7699 574 1 3 9 19 99 699 1699 2699 7699 198 199 DKAAAA CWAAAA OOOOxx +5311 575 1 3 1 11 11 311 1311 311 5311 22 23 HWAAAA DWAAAA VVVVxx +295 576 1 3 5 15 95 295 295 295 295 190 191 JLAAAA EWAAAA AAAAxx +8214 577 0 2 4 14 14 214 214 3214 8214 28 29 YDAAAA FWAAAA HHHHxx +3275 578 1 3 5 15 75 275 1275 3275 3275 150 151 ZVAAAA GWAAAA OOOOxx +9646 579 0 2 6 6 46 646 1646 4646 9646 92 93 AHAAAA HWAAAA VVVVxx +1908 580 0 0 8 8 8 908 1908 1908 1908 16 17 KVAAAA IWAAAA AAAAxx +3858 581 0 2 8 18 58 858 1858 3858 3858 116 117 KSAAAA JWAAAA HHHHxx +9362 582 0 2 2 2 62 362 1362 4362 9362 124 125 CWAAAA KWAAAA OOOOxx +9307 583 1 3 7 7 7 307 1307 4307 9307 14 15 ZTAAAA LWAAAA VVVVxx +6124 584 0 0 4 4 24 124 124 1124 6124 48 49 OBAAAA MWAAAA AAAAxx +2405 585 1 1 5 5 5 405 405 2405 2405 10 11 NOAAAA NWAAAA HHHHxx +8422 586 0 2 2 2 22 422 422 3422 8422 44 45 YLAAAA OWAAAA OOOOxx +393 587 1 1 3 13 93 393 393 393 393 186 187 DPAAAA PWAAAA VVVVxx +8973 588 1 1 3 13 73 973 973 3973 8973 146 147 DHAAAA QWAAAA AAAAxx +5171 589 1 3 1 11 71 171 1171 171 5171 142 143 XQAAAA RWAAAA HHHHxx +4929 590 1 1 9 9 29 929 929 4929 4929 58 59 PHAAAA SWAAAA OOOOxx +6935 591 1 3 5 15 35 935 935 1935 6935 70 71 TGAAAA TWAAAA VVVVxx +8584 592 0 0 4 4 84 584 584 3584 8584 168 169 ESAAAA UWAAAA AAAAxx +1035 593 1 3 5 15 35 35 1035 1035 1035 70 71 VNAAAA VWAAAA HHHHxx +3734 594 0 2 4 14 34 734 1734 3734 3734 68 69 QNAAAA WWAAAA OOOOxx +1458 595 0 2 8 18 58 458 1458 1458 1458 116 117 CEAAAA XWAAAA VVVVxx +8746 596 0 2 6 6 46 746 746 3746 8746 92 93 KYAAAA YWAAAA AAAAxx +1677 597 1 1 7 17 77 677 1677 1677 1677 154 155 NMAAAA ZWAAAA HHHHxx +8502 598 0 2 2 2 2 502 502 3502 8502 4 5 APAAAA AXAAAA OOOOxx +7752 599 0 0 2 12 52 752 1752 2752 7752 104 105 EMAAAA BXAAAA VVVVxx +2556 600 0 0 6 16 56 556 556 2556 2556 112 113 IUAAAA CXAAAA AAAAxx +6426 601 0 2 6 6 26 426 426 1426 6426 52 53 ENAAAA DXAAAA HHHHxx +8420 602 0 0 0 0 20 420 420 3420 8420 40 41 WLAAAA EXAAAA OOOOxx +4462 603 0 2 2 2 62 462 462 4462 4462 124 125 QPAAAA FXAAAA VVVVxx +1378 604 0 2 8 18 78 378 1378 1378 1378 156 157 ABAAAA GXAAAA AAAAxx +1387 605 1 3 7 7 87 387 1387 1387 1387 174 175 JBAAAA HXAAAA HHHHxx +8094 606 0 2 4 14 94 94 94 3094 8094 188 189 IZAAAA IXAAAA OOOOxx +7247 607 1 3 7 7 47 247 1247 2247 7247 94 95 TSAAAA JXAAAA VVVVxx +4261 608 1 1 1 1 61 261 261 4261 4261 122 123 XHAAAA KXAAAA AAAAxx +5029 609 1 1 9 9 29 29 1029 29 5029 58 59 LLAAAA LXAAAA HHHHxx +3625 610 1 1 5 5 25 625 1625 3625 3625 50 51 LJAAAA MXAAAA OOOOxx +8068 611 0 0 8 8 68 68 68 3068 8068 136 137 IYAAAA NXAAAA VVVVxx +102 612 0 2 2 2 2 102 102 102 102 4 5 YDAAAA OXAAAA AAAAxx +5596 613 0 0 6 16 96 596 1596 596 5596 192 193 GHAAAA PXAAAA HHHHxx +5872 614 0 0 2 12 72 872 1872 872 5872 144 145 WRAAAA QXAAAA OOOOxx +4742 615 0 2 2 2 42 742 742 4742 4742 84 85 KAAAAA RXAAAA VVVVxx +2117 616 1 1 7 17 17 117 117 2117 2117 34 35 LDAAAA SXAAAA AAAAxx +3945 617 1 1 5 5 45 945 1945 3945 3945 90 91 TVAAAA TXAAAA HHHHxx +7483 618 1 3 3 3 83 483 1483 2483 7483 166 167 VBAAAA UXAAAA OOOOxx +4455 619 1 3 5 15 55 455 455 4455 4455 110 111 JPAAAA VXAAAA VVVVxx +609 620 1 1 9 9 9 609 609 609 609 18 19 LXAAAA WXAAAA AAAAxx +9829 621 1 1 9 9 29 829 1829 4829 9829 58 59 BOAAAA XXAAAA HHHHxx +4857 622 1 1 7 17 57 857 857 4857 4857 114 115 VEAAAA YXAAAA OOOOxx +3314 623 0 2 4 14 14 314 1314 3314 3314 28 29 MXAAAA ZXAAAA VVVVxx +5353 624 1 1 3 13 53 353 1353 353 5353 106 107 XXAAAA AYAAAA AAAAxx +4909 625 1 1 9 9 9 909 909 4909 4909 18 19 VGAAAA BYAAAA HHHHxx +7597 626 1 1 7 17 97 597 1597 2597 7597 194 195 FGAAAA CYAAAA OOOOxx +2683 627 1 3 3 3 83 683 683 2683 2683 166 167 FZAAAA DYAAAA VVVVxx +3223 628 1 3 3 3 23 223 1223 3223 3223 46 47 ZTAAAA EYAAAA AAAAxx +5363 629 1 3 3 3 63 363 1363 363 5363 126 127 HYAAAA FYAAAA HHHHxx +4578 630 0 2 8 18 78 578 578 4578 4578 156 157 CUAAAA GYAAAA OOOOxx +5544 631 0 0 4 4 44 544 1544 544 5544 88 89 GFAAAA HYAAAA VVVVxx +1589 632 1 1 9 9 89 589 1589 1589 1589 178 179 DJAAAA IYAAAA AAAAxx +7412 633 0 0 2 12 12 412 1412 2412 7412 24 25 CZAAAA JYAAAA HHHHxx +3803 634 1 3 3 3 3 803 1803 3803 3803 6 7 HQAAAA KYAAAA OOOOxx +6179 635 1 3 9 19 79 179 179 1179 6179 158 159 RDAAAA LYAAAA VVVVxx +5588 636 0 0 8 8 88 588 1588 588 5588 176 177 YGAAAA MYAAAA AAAAxx +2134 637 0 2 4 14 34 134 134 2134 2134 68 69 CEAAAA NYAAAA HHHHxx +4383 638 1 3 3 3 83 383 383 4383 4383 166 167 PMAAAA OYAAAA OOOOxx +6995 639 1 3 5 15 95 995 995 1995 6995 190 191 BJAAAA PYAAAA VVVVxx +6598 640 0 2 8 18 98 598 598 1598 6598 196 197 UTAAAA QYAAAA AAAAxx +8731 641 1 3 1 11 31 731 731 3731 8731 62 63 VXAAAA RYAAAA HHHHxx +7177 642 1 1 7 17 77 177 1177 2177 7177 154 155 BQAAAA SYAAAA OOOOxx +6578 643 0 2 8 18 78 578 578 1578 6578 156 157 ATAAAA TYAAAA VVVVxx +9393 644 1 1 3 13 93 393 1393 4393 9393 186 187 HXAAAA UYAAAA AAAAxx +1276 645 0 0 6 16 76 276 1276 1276 1276 152 153 CXAAAA VYAAAA HHHHxx +8766 646 0 2 6 6 66 766 766 3766 8766 132 133 EZAAAA WYAAAA OOOOxx +1015 647 1 3 5 15 15 15 1015 1015 1015 30 31 BNAAAA XYAAAA VVVVxx +4396 648 0 0 6 16 96 396 396 4396 4396 192 193 CNAAAA YYAAAA AAAAxx +5564 649 0 0 4 4 64 564 1564 564 5564 128 129 AGAAAA ZYAAAA HHHHxx +927 650 1 3 7 7 27 927 927 927 927 54 55 RJAAAA AZAAAA OOOOxx +3306 651 0 2 6 6 6 306 1306 3306 3306 12 13 EXAAAA BZAAAA VVVVxx +1615 652 1 3 5 15 15 615 1615 1615 1615 30 31 DKAAAA CZAAAA AAAAxx +4550 653 0 2 0 10 50 550 550 4550 4550 100 101 ATAAAA DZAAAA HHHHxx +2468 654 0 0 8 8 68 468 468 2468 2468 136 137 YQAAAA EZAAAA OOOOxx +5336 655 0 0 6 16 36 336 1336 336 5336 72 73 GXAAAA FZAAAA VVVVxx +4471 656 1 3 1 11 71 471 471 4471 4471 142 143 ZPAAAA GZAAAA AAAAxx +8085 657 1 1 5 5 85 85 85 3085 8085 170 171 ZYAAAA HZAAAA HHHHxx +540 658 0 0 0 0 40 540 540 540 540 80 81 UUAAAA IZAAAA OOOOxx +5108 659 0 0 8 8 8 108 1108 108 5108 16 17 MOAAAA JZAAAA VVVVxx +8015 660 1 3 5 15 15 15 15 3015 8015 30 31 HWAAAA KZAAAA AAAAxx +2857 661 1 1 7 17 57 857 857 2857 2857 114 115 XFAAAA LZAAAA HHHHxx +9472 662 0 0 2 12 72 472 1472 4472 9472 144 145 IAAAAA MZAAAA OOOOxx +5666 663 0 2 6 6 66 666 1666 666 5666 132 133 YJAAAA NZAAAA VVVVxx +3555 664 1 3 5 15 55 555 1555 3555 3555 110 111 TGAAAA OZAAAA AAAAxx +378 665 0 2 8 18 78 378 378 378 378 156 157 OOAAAA PZAAAA HHHHxx +4466 666 0 2 6 6 66 466 466 4466 4466 132 133 UPAAAA QZAAAA OOOOxx +3247 667 1 3 7 7 47 247 1247 3247 3247 94 95 XUAAAA RZAAAA VVVVxx +6570 668 0 2 0 10 70 570 570 1570 6570 140 141 SSAAAA SZAAAA AAAAxx +5655 669 1 3 5 15 55 655 1655 655 5655 110 111 NJAAAA TZAAAA HHHHxx +917 670 1 1 7 17 17 917 917 917 917 34 35 HJAAAA UZAAAA OOOOxx +3637 671 1 1 7 17 37 637 1637 3637 3637 74 75 XJAAAA VZAAAA VVVVxx +3668 672 0 0 8 8 68 668 1668 3668 3668 136 137 CLAAAA WZAAAA AAAAxx +5644 673 0 0 4 4 44 644 1644 644 5644 88 89 CJAAAA XZAAAA HHHHxx +8286 674 0 2 6 6 86 286 286 3286 8286 172 173 SGAAAA YZAAAA OOOOxx +6896 675 0 0 6 16 96 896 896 1896 6896 192 193 GFAAAA ZZAAAA VVVVxx +2870 676 0 2 0 10 70 870 870 2870 2870 140 141 KGAAAA AABAAA AAAAxx +8041 677 1 1 1 1 41 41 41 3041 8041 82 83 HXAAAA BABAAA HHHHxx +8137 678 1 1 7 17 37 137 137 3137 8137 74 75 ZAAAAA CABAAA OOOOxx +4823 679 1 3 3 3 23 823 823 4823 4823 46 47 NDAAAA DABAAA VVVVxx +2438 680 0 2 8 18 38 438 438 2438 2438 76 77 UPAAAA EABAAA AAAAxx +6329 681 1 1 9 9 29 329 329 1329 6329 58 59 LJAAAA FABAAA HHHHxx +623 682 1 3 3 3 23 623 623 623 623 46 47 ZXAAAA GABAAA OOOOxx +1360 683 0 0 0 0 60 360 1360 1360 1360 120 121 IAAAAA HABAAA VVVVxx +7987 684 1 3 7 7 87 987 1987 2987 7987 174 175 FVAAAA IABAAA AAAAxx +9788 685 0 0 8 8 88 788 1788 4788 9788 176 177 MMAAAA JABAAA HHHHxx +3212 686 0 0 2 12 12 212 1212 3212 3212 24 25 OTAAAA KABAAA OOOOxx +2725 687 1 1 5 5 25 725 725 2725 2725 50 51 VAAAAA LABAAA VVVVxx +7837 688 1 1 7 17 37 837 1837 2837 7837 74 75 LPAAAA MABAAA AAAAxx +4746 689 0 2 6 6 46 746 746 4746 4746 92 93 OAAAAA NABAAA HHHHxx +3986 690 0 2 6 6 86 986 1986 3986 3986 172 173 IXAAAA OABAAA OOOOxx +9128 691 0 0 8 8 28 128 1128 4128 9128 56 57 CNAAAA PABAAA VVVVxx +5044 692 0 0 4 4 44 44 1044 44 5044 88 89 AMAAAA QABAAA AAAAxx +8132 693 0 0 2 12 32 132 132 3132 8132 64 65 UAAAAA RABAAA HHHHxx +9992 694 0 0 2 12 92 992 1992 4992 9992 184 185 IUAAAA SABAAA OOOOxx +8468 695 0 0 8 8 68 468 468 3468 8468 136 137 SNAAAA TABAAA VVVVxx +6876 696 0 0 6 16 76 876 876 1876 6876 152 153 MEAAAA UABAAA AAAAxx +3532 697 0 0 2 12 32 532 1532 3532 3532 64 65 WFAAAA VABAAA HHHHxx +2140 698 0 0 0 0 40 140 140 2140 2140 80 81 IEAAAA WABAAA OOOOxx +2183 699 1 3 3 3 83 183 183 2183 2183 166 167 ZFAAAA XABAAA VVVVxx +9766 700 0 2 6 6 66 766 1766 4766 9766 132 133 QLAAAA YABAAA AAAAxx +7943 701 1 3 3 3 43 943 1943 2943 7943 86 87 NTAAAA ZABAAA HHHHxx +9243 702 1 3 3 3 43 243 1243 4243 9243 86 87 NRAAAA ABBAAA OOOOxx +6241 703 1 1 1 1 41 241 241 1241 6241 82 83 BGAAAA BBBAAA VVVVxx +9540 704 0 0 0 0 40 540 1540 4540 9540 80 81 YCAAAA CBBAAA AAAAxx +7418 705 0 2 8 18 18 418 1418 2418 7418 36 37 IZAAAA DBBAAA HHHHxx +1603 706 1 3 3 3 3 603 1603 1603 1603 6 7 RJAAAA EBBAAA OOOOxx +8950 707 0 2 0 10 50 950 950 3950 8950 100 101 GGAAAA FBBAAA VVVVxx +6933 708 1 1 3 13 33 933 933 1933 6933 66 67 RGAAAA GBBAAA AAAAxx +2646 709 0 2 6 6 46 646 646 2646 2646 92 93 UXAAAA HBBAAA HHHHxx +3447 710 1 3 7 7 47 447 1447 3447 3447 94 95 PCAAAA IBBAAA OOOOxx +9957 711 1 1 7 17 57 957 1957 4957 9957 114 115 ZSAAAA JBBAAA VVVVxx +4623 712 1 3 3 3 23 623 623 4623 4623 46 47 VVAAAA KBBAAA AAAAxx +9058 713 0 2 8 18 58 58 1058 4058 9058 116 117 KKAAAA LBBAAA HHHHxx +7361 714 1 1 1 1 61 361 1361 2361 7361 122 123 DXAAAA MBBAAA OOOOxx +2489 715 1 1 9 9 89 489 489 2489 2489 178 179 TRAAAA NBBAAA VVVVxx +7643 716 1 3 3 3 43 643 1643 2643 7643 86 87 ZHAAAA OBBAAA AAAAxx +9166 717 0 2 6 6 66 166 1166 4166 9166 132 133 OOAAAA PBBAAA HHHHxx +7789 718 1 1 9 9 89 789 1789 2789 7789 178 179 PNAAAA QBBAAA OOOOxx +2332 719 0 0 2 12 32 332 332 2332 2332 64 65 SLAAAA RBBAAA VVVVxx +1832 720 0 0 2 12 32 832 1832 1832 1832 64 65 MSAAAA SBBAAA AAAAxx +8375 721 1 3 5 15 75 375 375 3375 8375 150 151 DKAAAA TBBAAA HHHHxx +948 722 0 0 8 8 48 948 948 948 948 96 97 MKAAAA UBBAAA OOOOxx +5613 723 1 1 3 13 13 613 1613 613 5613 26 27 XHAAAA VBBAAA VVVVxx +6310 724 0 2 0 10 10 310 310 1310 6310 20 21 SIAAAA WBBAAA AAAAxx +4254 725 0 2 4 14 54 254 254 4254 4254 108 109 QHAAAA XBBAAA HHHHxx +4260 726 0 0 0 0 60 260 260 4260 4260 120 121 WHAAAA YBBAAA OOOOxx +2060 727 0 0 0 0 60 60 60 2060 2060 120 121 GBAAAA ZBBAAA VVVVxx +4831 728 1 3 1 11 31 831 831 4831 4831 62 63 VDAAAA ACBAAA AAAAxx +6176 729 0 0 6 16 76 176 176 1176 6176 152 153 ODAAAA BCBAAA HHHHxx +6688 730 0 0 8 8 88 688 688 1688 6688 176 177 GXAAAA CCBAAA OOOOxx +5752 731 0 0 2 12 52 752 1752 752 5752 104 105 GNAAAA DCBAAA VVVVxx +8714 732 0 2 4 14 14 714 714 3714 8714 28 29 EXAAAA ECBAAA AAAAxx +6739 733 1 3 9 19 39 739 739 1739 6739 78 79 FZAAAA FCBAAA HHHHxx +7066 734 0 2 6 6 66 66 1066 2066 7066 132 133 ULAAAA GCBAAA OOOOxx +7250 735 0 2 0 10 50 250 1250 2250 7250 100 101 WSAAAA HCBAAA VVVVxx +3161 736 1 1 1 1 61 161 1161 3161 3161 122 123 PRAAAA ICBAAA AAAAxx +1411 737 1 3 1 11 11 411 1411 1411 1411 22 23 HCAAAA JCBAAA HHHHxx +9301 738 1 1 1 1 1 301 1301 4301 9301 2 3 TTAAAA KCBAAA OOOOxx +8324 739 0 0 4 4 24 324 324 3324 8324 48 49 EIAAAA LCBAAA VVVVxx +9641 740 1 1 1 1 41 641 1641 4641 9641 82 83 VGAAAA MCBAAA AAAAxx +7077 741 1 1 7 17 77 77 1077 2077 7077 154 155 FMAAAA NCBAAA HHHHxx +9888 742 0 0 8 8 88 888 1888 4888 9888 176 177 IQAAAA OCBAAA OOOOxx +9909 743 1 1 9 9 9 909 1909 4909 9909 18 19 DRAAAA PCBAAA VVVVxx +2209 744 1 1 9 9 9 209 209 2209 2209 18 19 ZGAAAA QCBAAA AAAAxx +6904 745 0 0 4 4 4 904 904 1904 6904 8 9 OFAAAA RCBAAA HHHHxx +6608 746 0 0 8 8 8 608 608 1608 6608 16 17 EUAAAA SCBAAA OOOOxx +8400 747 0 0 0 0 0 400 400 3400 8400 0 1 CLAAAA TCBAAA VVVVxx +5124 748 0 0 4 4 24 124 1124 124 5124 48 49 CPAAAA UCBAAA AAAAxx +5484 749 0 0 4 4 84 484 1484 484 5484 168 169 YCAAAA VCBAAA HHHHxx +3575 750 1 3 5 15 75 575 1575 3575 3575 150 151 NHAAAA WCBAAA OOOOxx +9723 751 1 3 3 3 23 723 1723 4723 9723 46 47 ZJAAAA XCBAAA VVVVxx +360 752 0 0 0 0 60 360 360 360 360 120 121 WNAAAA YCBAAA AAAAxx +1059 753 1 3 9 19 59 59 1059 1059 1059 118 119 TOAAAA ZCBAAA HHHHxx +4941 754 1 1 1 1 41 941 941 4941 4941 82 83 BIAAAA ADBAAA OOOOxx +2535 755 1 3 5 15 35 535 535 2535 2535 70 71 NTAAAA BDBAAA VVVVxx +4119 756 1 3 9 19 19 119 119 4119 4119 38 39 LCAAAA CDBAAA AAAAxx +3725 757 1 1 5 5 25 725 1725 3725 3725 50 51 HNAAAA DDBAAA HHHHxx +4758 758 0 2 8 18 58 758 758 4758 4758 116 117 ABAAAA EDBAAA OOOOxx +9593 759 1 1 3 13 93 593 1593 4593 9593 186 187 ZEAAAA FDBAAA VVVVxx +4663 760 1 3 3 3 63 663 663 4663 4663 126 127 JXAAAA GDBAAA AAAAxx +7734 761 0 2 4 14 34 734 1734 2734 7734 68 69 MLAAAA HDBAAA HHHHxx +9156 762 0 0 6 16 56 156 1156 4156 9156 112 113 EOAAAA IDBAAA OOOOxx +8120 763 0 0 0 0 20 120 120 3120 8120 40 41 IAAAAA JDBAAA VVVVxx +4385 764 1 1 5 5 85 385 385 4385 4385 170 171 RMAAAA KDBAAA AAAAxx +2926 765 0 2 6 6 26 926 926 2926 2926 52 53 OIAAAA LDBAAA HHHHxx +4186 766 0 2 6 6 86 186 186 4186 4186 172 173 AFAAAA MDBAAA OOOOxx +2508 767 0 0 8 8 8 508 508 2508 2508 16 17 MSAAAA NDBAAA VVVVxx +4012 768 0 0 2 12 12 12 12 4012 4012 24 25 IYAAAA ODBAAA AAAAxx +6266 769 0 2 6 6 66 266 266 1266 6266 132 133 AHAAAA PDBAAA HHHHxx +3709 770 1 1 9 9 9 709 1709 3709 3709 18 19 RMAAAA QDBAAA OOOOxx +7289 771 1 1 9 9 89 289 1289 2289 7289 178 179 JUAAAA RDBAAA VVVVxx +8875 772 1 3 5 15 75 875 875 3875 8875 150 151 JDAAAA SDBAAA AAAAxx +4412 773 0 0 2 12 12 412 412 4412 4412 24 25 SNAAAA TDBAAA HHHHxx +3033 774 1 1 3 13 33 33 1033 3033 3033 66 67 RMAAAA UDBAAA OOOOxx +1645 775 1 1 5 5 45 645 1645 1645 1645 90 91 HLAAAA VDBAAA VVVVxx +3557 776 1 1 7 17 57 557 1557 3557 3557 114 115 VGAAAA WDBAAA AAAAxx +6316 777 0 0 6 16 16 316 316 1316 6316 32 33 YIAAAA XDBAAA HHHHxx +2054 778 0 2 4 14 54 54 54 2054 2054 108 109 ABAAAA YDBAAA OOOOxx +7031 779 1 3 1 11 31 31 1031 2031 7031 62 63 LKAAAA ZDBAAA VVVVxx +3405 780 1 1 5 5 5 405 1405 3405 3405 10 11 ZAAAAA AEBAAA AAAAxx +5343 781 1 3 3 3 43 343 1343 343 5343 86 87 NXAAAA BEBAAA HHHHxx +5240 782 0 0 0 0 40 240 1240 240 5240 80 81 OTAAAA CEBAAA OOOOxx +9650 783 0 2 0 10 50 650 1650 4650 9650 100 101 EHAAAA DEBAAA VVVVxx +3777 784 1 1 7 17 77 777 1777 3777 3777 154 155 HPAAAA EEBAAA AAAAxx +9041 785 1 1 1 1 41 41 1041 4041 9041 82 83 TJAAAA FEBAAA HHHHxx +6923 786 1 3 3 3 23 923 923 1923 6923 46 47 HGAAAA GEBAAA OOOOxx +2977 787 1 1 7 17 77 977 977 2977 2977 154 155 NKAAAA HEBAAA VVVVxx +5500 788 0 0 0 0 0 500 1500 500 5500 0 1 ODAAAA IEBAAA AAAAxx +1044 789 0 0 4 4 44 44 1044 1044 1044 88 89 EOAAAA JEBAAA HHHHxx +434 790 0 2 4 14 34 434 434 434 434 68 69 SQAAAA KEBAAA OOOOxx +611 791 1 3 1 11 11 611 611 611 611 22 23 NXAAAA LEBAAA VVVVxx +5760 792 0 0 0 0 60 760 1760 760 5760 120 121 ONAAAA MEBAAA AAAAxx +2445 793 1 1 5 5 45 445 445 2445 2445 90 91 BQAAAA NEBAAA HHHHxx +7098 794 0 2 8 18 98 98 1098 2098 7098 196 197 ANAAAA OEBAAA OOOOxx +2188 795 0 0 8 8 88 188 188 2188 2188 176 177 EGAAAA PEBAAA VVVVxx +4597 796 1 1 7 17 97 597 597 4597 4597 194 195 VUAAAA QEBAAA AAAAxx +1913 797 1 1 3 13 13 913 1913 1913 1913 26 27 PVAAAA REBAAA HHHHxx +8696 798 0 0 6 16 96 696 696 3696 8696 192 193 MWAAAA SEBAAA OOOOxx +3332 799 0 0 2 12 32 332 1332 3332 3332 64 65 EYAAAA TEBAAA VVVVxx +8760 800 0 0 0 0 60 760 760 3760 8760 120 121 YYAAAA UEBAAA AAAAxx +3215 801 1 3 5 15 15 215 1215 3215 3215 30 31 RTAAAA VEBAAA HHHHxx +1625 802 1 1 5 5 25 625 1625 1625 1625 50 51 NKAAAA WEBAAA OOOOxx +4219 803 1 3 9 19 19 219 219 4219 4219 38 39 HGAAAA XEBAAA VVVVxx +415 804 1 3 5 15 15 415 415 415 415 30 31 ZPAAAA YEBAAA AAAAxx +4242 805 0 2 2 2 42 242 242 4242 4242 84 85 EHAAAA ZEBAAA HHHHxx +8660 806 0 0 0 0 60 660 660 3660 8660 120 121 CVAAAA AFBAAA OOOOxx +6525 807 1 1 5 5 25 525 525 1525 6525 50 51 ZQAAAA BFBAAA VVVVxx +2141 808 1 1 1 1 41 141 141 2141 2141 82 83 JEAAAA CFBAAA AAAAxx +5152 809 0 0 2 12 52 152 1152 152 5152 104 105 EQAAAA DFBAAA HHHHxx +8560 810 0 0 0 0 60 560 560 3560 8560 120 121 GRAAAA EFBAAA OOOOxx +9835 811 1 3 5 15 35 835 1835 4835 9835 70 71 HOAAAA FFBAAA VVVVxx +2657 812 1 1 7 17 57 657 657 2657 2657 114 115 FYAAAA GFBAAA AAAAxx +6085 813 1 1 5 5 85 85 85 1085 6085 170 171 BAAAAA HFBAAA HHHHxx +6698 814 0 2 8 18 98 698 698 1698 6698 196 197 QXAAAA IFBAAA OOOOxx +5421 815 1 1 1 1 21 421 1421 421 5421 42 43 NAAAAA JFBAAA VVVVxx +6661 816 1 1 1 1 61 661 661 1661 6661 122 123 FWAAAA KFBAAA AAAAxx +5645 817 1 1 5 5 45 645 1645 645 5645 90 91 DJAAAA LFBAAA HHHHxx +1248 818 0 0 8 8 48 248 1248 1248 1248 96 97 AWAAAA MFBAAA OOOOxx +5690 819 0 2 0 10 90 690 1690 690 5690 180 181 WKAAAA NFBAAA VVVVxx +4762 820 0 2 2 2 62 762 762 4762 4762 124 125 EBAAAA OFBAAA AAAAxx +1455 821 1 3 5 15 55 455 1455 1455 1455 110 111 ZDAAAA PFBAAA HHHHxx +9846 822 0 2 6 6 46 846 1846 4846 9846 92 93 SOAAAA QFBAAA OOOOxx +5295 823 1 3 5 15 95 295 1295 295 5295 190 191 RVAAAA RFBAAA VVVVxx +2826 824 0 2 6 6 26 826 826 2826 2826 52 53 SEAAAA SFBAAA AAAAxx +7496 825 0 0 6 16 96 496 1496 2496 7496 192 193 ICAAAA TFBAAA HHHHxx +3024 826 0 0 4 4 24 24 1024 3024 3024 48 49 IMAAAA UFBAAA OOOOxx +4945 827 1 1 5 5 45 945 945 4945 4945 90 91 FIAAAA VFBAAA VVVVxx +4404 828 0 0 4 4 4 404 404 4404 4404 8 9 KNAAAA WFBAAA AAAAxx +9302 829 0 2 2 2 2 302 1302 4302 9302 4 5 UTAAAA XFBAAA HHHHxx +1286 830 0 2 6 6 86 286 1286 1286 1286 172 173 MXAAAA YFBAAA OOOOxx +8435 831 1 3 5 15 35 435 435 3435 8435 70 71 LMAAAA ZFBAAA VVVVxx +8969 832 1 1 9 9 69 969 969 3969 8969 138 139 ZGAAAA AGBAAA AAAAxx +3302 833 0 2 2 2 2 302 1302 3302 3302 4 5 AXAAAA BGBAAA HHHHxx +9753 834 1 1 3 13 53 753 1753 4753 9753 106 107 DLAAAA CGBAAA OOOOxx +9374 835 0 2 4 14 74 374 1374 4374 9374 148 149 OWAAAA DGBAAA VVVVxx +4907 836 1 3 7 7 7 907 907 4907 4907 14 15 TGAAAA EGBAAA AAAAxx +1659 837 1 3 9 19 59 659 1659 1659 1659 118 119 VLAAAA FGBAAA HHHHxx +5095 838 1 3 5 15 95 95 1095 95 5095 190 191 ZNAAAA GGBAAA OOOOxx +9446 839 0 2 6 6 46 446 1446 4446 9446 92 93 IZAAAA HGBAAA VVVVxx +8528 840 0 0 8 8 28 528 528 3528 8528 56 57 AQAAAA IGBAAA AAAAxx +4890 841 0 2 0 10 90 890 890 4890 4890 180 181 CGAAAA JGBAAA HHHHxx +1221 842 1 1 1 1 21 221 1221 1221 1221 42 43 ZUAAAA KGBAAA OOOOxx +5583 843 1 3 3 3 83 583 1583 583 5583 166 167 TGAAAA LGBAAA VVVVxx +7303 844 1 3 3 3 3 303 1303 2303 7303 6 7 XUAAAA MGBAAA AAAAxx +406 845 0 2 6 6 6 406 406 406 406 12 13 QPAAAA NGBAAA HHHHxx +7542 846 0 2 2 2 42 542 1542 2542 7542 84 85 CEAAAA OGBAAA OOOOxx +9507 847 1 3 7 7 7 507 1507 4507 9507 14 15 RBAAAA PGBAAA VVVVxx +9511 848 1 3 1 11 11 511 1511 4511 9511 22 23 VBAAAA QGBAAA AAAAxx +1373 849 1 1 3 13 73 373 1373 1373 1373 146 147 VAAAAA RGBAAA HHHHxx +6556 850 0 0 6 16 56 556 556 1556 6556 112 113 ESAAAA SGBAAA OOOOxx +4117 851 1 1 7 17 17 117 117 4117 4117 34 35 JCAAAA TGBAAA VVVVxx +7794 852 0 2 4 14 94 794 1794 2794 7794 188 189 UNAAAA UGBAAA AAAAxx +7170 853 0 2 0 10 70 170 1170 2170 7170 140 141 UPAAAA VGBAAA HHHHxx +5809 854 1 1 9 9 9 809 1809 809 5809 18 19 LPAAAA WGBAAA OOOOxx +7828 855 0 0 8 8 28 828 1828 2828 7828 56 57 CPAAAA XGBAAA VVVVxx +8046 856 0 2 6 6 46 46 46 3046 8046 92 93 MXAAAA YGBAAA AAAAxx +4833 857 1 1 3 13 33 833 833 4833 4833 66 67 XDAAAA ZGBAAA HHHHxx +2107 858 1 3 7 7 7 107 107 2107 2107 14 15 BDAAAA AHBAAA OOOOxx +4276 859 0 0 6 16 76 276 276 4276 4276 152 153 MIAAAA BHBAAA VVVVxx +9536 860 0 0 6 16 36 536 1536 4536 9536 72 73 UCAAAA CHBAAA AAAAxx +5549 861 1 1 9 9 49 549 1549 549 5549 98 99 LFAAAA DHBAAA HHHHxx +6427 862 1 3 7 7 27 427 427 1427 6427 54 55 FNAAAA EHBAAA OOOOxx +1382 863 0 2 2 2 82 382 1382 1382 1382 164 165 EBAAAA FHBAAA VVVVxx +3256 864 0 0 6 16 56 256 1256 3256 3256 112 113 GVAAAA GHBAAA AAAAxx +3270 865 0 2 0 10 70 270 1270 3270 3270 140 141 UVAAAA HHBAAA HHHHxx +4808 866 0 0 8 8 8 808 808 4808 4808 16 17 YCAAAA IHBAAA OOOOxx +7938 867 0 2 8 18 38 938 1938 2938 7938 76 77 ITAAAA JHBAAA VVVVxx +4405 868 1 1 5 5 5 405 405 4405 4405 10 11 LNAAAA KHBAAA AAAAxx +2264 869 0 0 4 4 64 264 264 2264 2264 128 129 CJAAAA LHBAAA HHHHxx +80 870 0 0 0 0 80 80 80 80 80 160 161 CDAAAA MHBAAA OOOOxx +320 871 0 0 0 0 20 320 320 320 320 40 41 IMAAAA NHBAAA VVVVxx +2383 872 1 3 3 3 83 383 383 2383 2383 166 167 RNAAAA OHBAAA AAAAxx +3146 873 0 2 6 6 46 146 1146 3146 3146 92 93 ARAAAA PHBAAA HHHHxx +6911 874 1 3 1 11 11 911 911 1911 6911 22 23 VFAAAA QHBAAA OOOOxx +7377 875 1 1 7 17 77 377 1377 2377 7377 154 155 TXAAAA RHBAAA VVVVxx +9965 876 1 1 5 5 65 965 1965 4965 9965 130 131 HTAAAA SHBAAA AAAAxx +8361 877 1 1 1 1 61 361 361 3361 8361 122 123 PJAAAA THBAAA HHHHxx +9417 878 1 1 7 17 17 417 1417 4417 9417 34 35 FYAAAA UHBAAA OOOOxx +2483 879 1 3 3 3 83 483 483 2483 2483 166 167 NRAAAA VHBAAA VVVVxx +9843 880 1 3 3 3 43 843 1843 4843 9843 86 87 POAAAA WHBAAA AAAAxx +6395 881 1 3 5 15 95 395 395 1395 6395 190 191 ZLAAAA XHBAAA HHHHxx +6444 882 0 0 4 4 44 444 444 1444 6444 88 89 WNAAAA YHBAAA OOOOxx +1820 883 0 0 0 0 20 820 1820 1820 1820 40 41 ASAAAA ZHBAAA VVVVxx +2768 884 0 0 8 8 68 768 768 2768 2768 136 137 MCAAAA AIBAAA AAAAxx +5413 885 1 1 3 13 13 413 1413 413 5413 26 27 FAAAAA BIBAAA HHHHxx +2923 886 1 3 3 3 23 923 923 2923 2923 46 47 LIAAAA CIBAAA OOOOxx +5286 887 0 2 6 6 86 286 1286 286 5286 172 173 IVAAAA DIBAAA VVVVxx +6126 888 0 2 6 6 26 126 126 1126 6126 52 53 QBAAAA EIBAAA AAAAxx +8343 889 1 3 3 3 43 343 343 3343 8343 86 87 XIAAAA FIBAAA HHHHxx +6010 890 0 2 0 10 10 10 10 1010 6010 20 21 EXAAAA GIBAAA OOOOxx +4177 891 1 1 7 17 77 177 177 4177 4177 154 155 REAAAA HIBAAA VVVVxx +5808 892 0 0 8 8 8 808 1808 808 5808 16 17 KPAAAA IIBAAA AAAAxx +4859 893 1 3 9 19 59 859 859 4859 4859 118 119 XEAAAA JIBAAA HHHHxx +9252 894 0 0 2 12 52 252 1252 4252 9252 104 105 WRAAAA KIBAAA OOOOxx +2941 895 1 1 1 1 41 941 941 2941 2941 82 83 DJAAAA LIBAAA VVVVxx +8693 896 1 1 3 13 93 693 693 3693 8693 186 187 JWAAAA MIBAAA AAAAxx +4432 897 0 0 2 12 32 432 432 4432 4432 64 65 MOAAAA NIBAAA HHHHxx +2371 898 1 3 1 11 71 371 371 2371 2371 142 143 FNAAAA OIBAAA OOOOxx +7546 899 0 2 6 6 46 546 1546 2546 7546 92 93 GEAAAA PIBAAA VVVVxx +1369 900 1 1 9 9 69 369 1369 1369 1369 138 139 RAAAAA QIBAAA AAAAxx +4687 901 1 3 7 7 87 687 687 4687 4687 174 175 HYAAAA RIBAAA HHHHxx +8941 902 1 1 1 1 41 941 941 3941 8941 82 83 XFAAAA SIBAAA OOOOxx +226 903 0 2 6 6 26 226 226 226 226 52 53 SIAAAA TIBAAA VVVVxx +3493 904 1 1 3 13 93 493 1493 3493 3493 186 187 JEAAAA UIBAAA AAAAxx +6433 905 1 1 3 13 33 433 433 1433 6433 66 67 LNAAAA VIBAAA HHHHxx +9189 906 1 1 9 9 89 189 1189 4189 9189 178 179 LPAAAA WIBAAA OOOOxx +6027 907 1 3 7 7 27 27 27 1027 6027 54 55 VXAAAA XIBAAA VVVVxx +4615 908 1 3 5 15 15 615 615 4615 4615 30 31 NVAAAA YIBAAA AAAAxx +5320 909 0 0 0 0 20 320 1320 320 5320 40 41 QWAAAA ZIBAAA HHHHxx +7002 910 0 2 2 2 2 2 1002 2002 7002 4 5 IJAAAA AJBAAA OOOOxx +7367 911 1 3 7 7 67 367 1367 2367 7367 134 135 JXAAAA BJBAAA VVVVxx +289 912 1 1 9 9 89 289 289 289 289 178 179 DLAAAA CJBAAA AAAAxx +407 913 1 3 7 7 7 407 407 407 407 14 15 RPAAAA DJBAAA HHHHxx +504 914 0 0 4 4 4 504 504 504 504 8 9 KTAAAA EJBAAA OOOOxx +8301 915 1 1 1 1 1 301 301 3301 8301 2 3 HHAAAA FJBAAA VVVVxx +1396 916 0 0 6 16 96 396 1396 1396 1396 192 193 SBAAAA GJBAAA AAAAxx +4794 917 0 2 4 14 94 794 794 4794 4794 188 189 KCAAAA HJBAAA HHHHxx +6400 918 0 0 0 0 0 400 400 1400 6400 0 1 EMAAAA IJBAAA OOOOxx +1275 919 1 3 5 15 75 275 1275 1275 1275 150 151 BXAAAA JJBAAA VVVVxx +5797 920 1 1 7 17 97 797 1797 797 5797 194 195 ZOAAAA KJBAAA AAAAxx +2221 921 1 1 1 1 21 221 221 2221 2221 42 43 LHAAAA LJBAAA HHHHxx +2504 922 0 0 4 4 4 504 504 2504 2504 8 9 ISAAAA MJBAAA OOOOxx +2143 923 1 3 3 3 43 143 143 2143 2143 86 87 LEAAAA NJBAAA VVVVxx +1083 924 1 3 3 3 83 83 1083 1083 1083 166 167 RPAAAA OJBAAA AAAAxx +6148 925 0 0 8 8 48 148 148 1148 6148 96 97 MCAAAA PJBAAA HHHHxx +3612 926 0 0 2 12 12 612 1612 3612 3612 24 25 YIAAAA QJBAAA OOOOxx +9499 927 1 3 9 19 99 499 1499 4499 9499 198 199 JBAAAA RJBAAA VVVVxx +5773 928 1 1 3 13 73 773 1773 773 5773 146 147 BOAAAA SJBAAA AAAAxx +1014 929 0 2 4 14 14 14 1014 1014 1014 28 29 ANAAAA TJBAAA HHHHxx +1427 930 1 3 7 7 27 427 1427 1427 1427 54 55 XCAAAA UJBAAA OOOOxx +6770 931 0 2 0 10 70 770 770 1770 6770 140 141 KAAAAA VJBAAA VVVVxx +9042 932 0 2 2 2 42 42 1042 4042 9042 84 85 UJAAAA WJBAAA AAAAxx +9892 933 0 0 2 12 92 892 1892 4892 9892 184 185 MQAAAA XJBAAA HHHHxx +1771 934 1 3 1 11 71 771 1771 1771 1771 142 143 DQAAAA YJBAAA OOOOxx +7392 935 0 0 2 12 92 392 1392 2392 7392 184 185 IYAAAA ZJBAAA VVVVxx +4465 936 1 1 5 5 65 465 465 4465 4465 130 131 TPAAAA AKBAAA AAAAxx +278 937 0 2 8 18 78 278 278 278 278 156 157 SKAAAA BKBAAA HHHHxx +7776 938 0 0 6 16 76 776 1776 2776 7776 152 153 CNAAAA CKBAAA OOOOxx +3763 939 1 3 3 3 63 763 1763 3763 3763 126 127 TOAAAA DKBAAA VVVVxx +7503 940 1 3 3 3 3 503 1503 2503 7503 6 7 PCAAAA EKBAAA AAAAxx +3793 941 1 1 3 13 93 793 1793 3793 3793 186 187 XPAAAA FKBAAA HHHHxx +6510 942 0 2 0 10 10 510 510 1510 6510 20 21 KQAAAA GKBAAA OOOOxx +7641 943 1 1 1 1 41 641 1641 2641 7641 82 83 XHAAAA HKBAAA VVVVxx +3228 944 0 0 8 8 28 228 1228 3228 3228 56 57 EUAAAA IKBAAA AAAAxx +194 945 0 2 4 14 94 194 194 194 194 188 189 MHAAAA JKBAAA HHHHxx +8555 946 1 3 5 15 55 555 555 3555 8555 110 111 BRAAAA KKBAAA OOOOxx +4997 947 1 1 7 17 97 997 997 4997 4997 194 195 FKAAAA LKBAAA VVVVxx +8687 948 1 3 7 7 87 687 687 3687 8687 174 175 DWAAAA MKBAAA AAAAxx +6632 949 0 0 2 12 32 632 632 1632 6632 64 65 CVAAAA NKBAAA HHHHxx +9607 950 1 3 7 7 7 607 1607 4607 9607 14 15 NFAAAA OKBAAA OOOOxx +6201 951 1 1 1 1 1 201 201 1201 6201 2 3 NEAAAA PKBAAA VVVVxx +857 952 1 1 7 17 57 857 857 857 857 114 115 ZGAAAA QKBAAA AAAAxx +5623 953 1 3 3 3 23 623 1623 623 5623 46 47 HIAAAA RKBAAA HHHHxx +5979 954 1 3 9 19 79 979 1979 979 5979 158 159 ZVAAAA SKBAAA OOOOxx +2201 955 1 1 1 1 1 201 201 2201 2201 2 3 RGAAAA TKBAAA VVVVxx +3166 956 0 2 6 6 66 166 1166 3166 3166 132 133 URAAAA UKBAAA AAAAxx +6249 957 1 1 9 9 49 249 249 1249 6249 98 99 JGAAAA VKBAAA HHHHxx +3271 958 1 3 1 11 71 271 1271 3271 3271 142 143 VVAAAA WKBAAA OOOOxx +7777 959 1 1 7 17 77 777 1777 2777 7777 154 155 DNAAAA XKBAAA VVVVxx +6732 960 0 0 2 12 32 732 732 1732 6732 64 65 YYAAAA YKBAAA AAAAxx +6297 961 1 1 7 17 97 297 297 1297 6297 194 195 FIAAAA ZKBAAA HHHHxx +5685 962 1 1 5 5 85 685 1685 685 5685 170 171 RKAAAA ALBAAA OOOOxx +9931 963 1 3 1 11 31 931 1931 4931 9931 62 63 ZRAAAA BLBAAA VVVVxx +7485 964 1 1 5 5 85 485 1485 2485 7485 170 171 XBAAAA CLBAAA AAAAxx +386 965 0 2 6 6 86 386 386 386 386 172 173 WOAAAA DLBAAA HHHHxx +8204 966 0 0 4 4 4 204 204 3204 8204 8 9 ODAAAA ELBAAA OOOOxx +3606 967 0 2 6 6 6 606 1606 3606 3606 12 13 SIAAAA FLBAAA VVVVxx +1692 968 0 0 2 12 92 692 1692 1692 1692 184 185 CNAAAA GLBAAA AAAAxx +3002 969 0 2 2 2 2 2 1002 3002 3002 4 5 MLAAAA HLBAAA HHHHxx +9676 970 0 0 6 16 76 676 1676 4676 9676 152 153 EIAAAA ILBAAA OOOOxx +915 971 1 3 5 15 15 915 915 915 915 30 31 FJAAAA JLBAAA VVVVxx +7706 972 0 2 6 6 6 706 1706 2706 7706 12 13 KKAAAA KLBAAA AAAAxx +6080 973 0 0 0 0 80 80 80 1080 6080 160 161 WZAAAA LLBAAA HHHHxx +1860 974 0 0 0 0 60 860 1860 1860 1860 120 121 OTAAAA MLBAAA OOOOxx +1444 975 0 0 4 4 44 444 1444 1444 1444 88 89 ODAAAA NLBAAA VVVVxx +7208 976 0 0 8 8 8 208 1208 2208 7208 16 17 GRAAAA OLBAAA AAAAxx +8554 977 0 2 4 14 54 554 554 3554 8554 108 109 ARAAAA PLBAAA HHHHxx +2028 978 0 0 8 8 28 28 28 2028 2028 56 57 AAAAAA QLBAAA OOOOxx +9893 979 1 1 3 13 93 893 1893 4893 9893 186 187 NQAAAA RLBAAA VVVVxx +4740 980 0 0 0 0 40 740 740 4740 4740 80 81 IAAAAA SLBAAA AAAAxx +6186 981 0 2 6 6 86 186 186 1186 6186 172 173 YDAAAA TLBAAA HHHHxx +6357 982 1 1 7 17 57 357 357 1357 6357 114 115 NKAAAA ULBAAA OOOOxx +3699 983 1 3 9 19 99 699 1699 3699 3699 198 199 HMAAAA VLBAAA VVVVxx +7620 984 0 0 0 0 20 620 1620 2620 7620 40 41 CHAAAA WLBAAA AAAAxx +921 985 1 1 1 1 21 921 921 921 921 42 43 LJAAAA XLBAAA HHHHxx +5506 986 0 2 6 6 6 506 1506 506 5506 12 13 UDAAAA YLBAAA OOOOxx +8851 987 1 3 1 11 51 851 851 3851 8851 102 103 LCAAAA ZLBAAA VVVVxx +3205 988 1 1 5 5 5 205 1205 3205 3205 10 11 HTAAAA AMBAAA AAAAxx +1956 989 0 0 6 16 56 956 1956 1956 1956 112 113 GXAAAA BMBAAA HHHHxx +6272 990 0 0 2 12 72 272 272 1272 6272 144 145 GHAAAA CMBAAA OOOOxx +1509 991 1 1 9 9 9 509 1509 1509 1509 18 19 BGAAAA DMBAAA VVVVxx +53 992 1 1 3 13 53 53 53 53 53 106 107 BCAAAA EMBAAA AAAAxx +213 993 1 1 3 13 13 213 213 213 213 26 27 FIAAAA FMBAAA HHHHxx +4924 994 0 0 4 4 24 924 924 4924 4924 48 49 KHAAAA GMBAAA OOOOxx +2097 995 1 1 7 17 97 97 97 2097 2097 194 195 RCAAAA HMBAAA VVVVxx +4607 996 1 3 7 7 7 607 607 4607 4607 14 15 FVAAAA IMBAAA AAAAxx +1582 997 0 2 2 2 82 582 1582 1582 1582 164 165 WIAAAA JMBAAA HHHHxx +6643 998 1 3 3 3 43 643 643 1643 6643 86 87 NVAAAA KMBAAA OOOOxx +2238 999 0 2 8 18 38 238 238 2238 2238 76 77 CIAAAA LMBAAA VVVVxx +2942 1000 0 2 2 2 42 942 942 2942 2942 84 85 EJAAAA MMBAAA AAAAxx +1655 1001 1 3 5 15 55 655 1655 1655 1655 110 111 RLAAAA NMBAAA HHHHxx +3226 1002 0 2 6 6 26 226 1226 3226 3226 52 53 CUAAAA OMBAAA OOOOxx +4263 1003 1 3 3 3 63 263 263 4263 4263 126 127 ZHAAAA PMBAAA VVVVxx +960 1004 0 0 0 0 60 960 960 960 960 120 121 YKAAAA QMBAAA AAAAxx +1213 1005 1 1 3 13 13 213 1213 1213 1213 26 27 RUAAAA RMBAAA HHHHxx +1845 1006 1 1 5 5 45 845 1845 1845 1845 90 91 ZSAAAA SMBAAA OOOOxx +6944 1007 0 0 4 4 44 944 944 1944 6944 88 89 CHAAAA TMBAAA VVVVxx +5284 1008 0 0 4 4 84 284 1284 284 5284 168 169 GVAAAA UMBAAA AAAAxx +188 1009 0 0 8 8 88 188 188 188 188 176 177 GHAAAA VMBAAA HHHHxx +748 1010 0 0 8 8 48 748 748 748 748 96 97 UCAAAA WMBAAA OOOOxx +2226 1011 0 2 6 6 26 226 226 2226 2226 52 53 QHAAAA XMBAAA VVVVxx +7342 1012 0 2 2 2 42 342 1342 2342 7342 84 85 KWAAAA YMBAAA AAAAxx +6120 1013 0 0 0 0 20 120 120 1120 6120 40 41 KBAAAA ZMBAAA HHHHxx +536 1014 0 0 6 16 36 536 536 536 536 72 73 QUAAAA ANBAAA OOOOxx +3239 1015 1 3 9 19 39 239 1239 3239 3239 78 79 PUAAAA BNBAAA VVVVxx +2832 1016 0 0 2 12 32 832 832 2832 2832 64 65 YEAAAA CNBAAA AAAAxx +5296 1017 0 0 6 16 96 296 1296 296 5296 192 193 SVAAAA DNBAAA HHHHxx +5795 1018 1 3 5 15 95 795 1795 795 5795 190 191 XOAAAA ENBAAA OOOOxx +6290 1019 0 2 0 10 90 290 290 1290 6290 180 181 YHAAAA FNBAAA VVVVxx +4916 1020 0 0 6 16 16 916 916 4916 4916 32 33 CHAAAA GNBAAA AAAAxx +8366 1021 0 2 6 6 66 366 366 3366 8366 132 133 UJAAAA HNBAAA HHHHxx +4248 1022 0 0 8 8 48 248 248 4248 4248 96 97 KHAAAA INBAAA OOOOxx +6460 1023 0 0 0 0 60 460 460 1460 6460 120 121 MOAAAA JNBAAA VVVVxx +9296 1024 0 0 6 16 96 296 1296 4296 9296 192 193 OTAAAA KNBAAA AAAAxx +3486 1025 0 2 6 6 86 486 1486 3486 3486 172 173 CEAAAA LNBAAA HHHHxx +5664 1026 0 0 4 4 64 664 1664 664 5664 128 129 WJAAAA MNBAAA OOOOxx +7624 1027 0 0 4 4 24 624 1624 2624 7624 48 49 GHAAAA NNBAAA VVVVxx +2790 1028 0 2 0 10 90 790 790 2790 2790 180 181 IDAAAA ONBAAA AAAAxx +682 1029 0 2 2 2 82 682 682 682 682 164 165 GAAAAA PNBAAA HHHHxx +6412 1030 0 0 2 12 12 412 412 1412 6412 24 25 QMAAAA QNBAAA OOOOxx +6882 1031 0 2 2 2 82 882 882 1882 6882 164 165 SEAAAA RNBAAA VVVVxx +1332 1032 0 0 2 12 32 332 1332 1332 1332 64 65 GZAAAA SNBAAA AAAAxx +4911 1033 1 3 1 11 11 911 911 4911 4911 22 23 XGAAAA TNBAAA HHHHxx +3528 1034 0 0 8 8 28 528 1528 3528 3528 56 57 SFAAAA UNBAAA OOOOxx +271 1035 1 3 1 11 71 271 271 271 271 142 143 LKAAAA VNBAAA VVVVxx +7007 1036 1 3 7 7 7 7 1007 2007 7007 14 15 NJAAAA WNBAAA AAAAxx +2198 1037 0 2 8 18 98 198 198 2198 2198 196 197 OGAAAA XNBAAA HHHHxx +4266 1038 0 2 6 6 66 266 266 4266 4266 132 133 CIAAAA YNBAAA OOOOxx +9867 1039 1 3 7 7 67 867 1867 4867 9867 134 135 NPAAAA ZNBAAA VVVVxx +7602 1040 0 2 2 2 2 602 1602 2602 7602 4 5 KGAAAA AOBAAA AAAAxx +7521 1041 1 1 1 1 21 521 1521 2521 7521 42 43 HDAAAA BOBAAA HHHHxx +7200 1042 0 0 0 0 0 200 1200 2200 7200 0 1 YQAAAA COBAAA OOOOxx +4816 1043 0 0 6 16 16 816 816 4816 4816 32 33 GDAAAA DOBAAA VVVVxx +1669 1044 1 1 9 9 69 669 1669 1669 1669 138 139 FMAAAA EOBAAA AAAAxx +4764 1045 0 0 4 4 64 764 764 4764 4764 128 129 GBAAAA FOBAAA HHHHxx +7393 1046 1 1 3 13 93 393 1393 2393 7393 186 187 JYAAAA GOBAAA OOOOxx +7434 1047 0 2 4 14 34 434 1434 2434 7434 68 69 YZAAAA HOBAAA VVVVxx +9079 1048 1 3 9 19 79 79 1079 4079 9079 158 159 FLAAAA IOBAAA AAAAxx +9668 1049 0 0 8 8 68 668 1668 4668 9668 136 137 WHAAAA JOBAAA HHHHxx +7184 1050 0 0 4 4 84 184 1184 2184 7184 168 169 IQAAAA KOBAAA OOOOxx +7347 1051 1 3 7 7 47 347 1347 2347 7347 94 95 PWAAAA LOBAAA VVVVxx +951 1052 1 3 1 11 51 951 951 951 951 102 103 PKAAAA MOBAAA AAAAxx +4513 1053 1 1 3 13 13 513 513 4513 4513 26 27 PRAAAA NOBAAA HHHHxx +2692 1054 0 0 2 12 92 692 692 2692 2692 184 185 OZAAAA OOBAAA OOOOxx +9930 1055 0 2 0 10 30 930 1930 4930 9930 60 61 YRAAAA POBAAA VVVVxx +4516 1056 0 0 6 16 16 516 516 4516 4516 32 33 SRAAAA QOBAAA AAAAxx +1592 1057 0 0 2 12 92 592 1592 1592 1592 184 185 GJAAAA ROBAAA HHHHxx +6312 1058 0 0 2 12 12 312 312 1312 6312 24 25 UIAAAA SOBAAA OOOOxx +185 1059 1 1 5 5 85 185 185 185 185 170 171 DHAAAA TOBAAA VVVVxx +1848 1060 0 0 8 8 48 848 1848 1848 1848 96 97 CTAAAA UOBAAA AAAAxx +5844 1061 0 0 4 4 44 844 1844 844 5844 88 89 UQAAAA VOBAAA HHHHxx +1666 1062 0 2 6 6 66 666 1666 1666 1666 132 133 CMAAAA WOBAAA OOOOxx +5864 1063 0 0 4 4 64 864 1864 864 5864 128 129 ORAAAA XOBAAA VVVVxx +1004 1064 0 0 4 4 4 4 1004 1004 1004 8 9 QMAAAA YOBAAA AAAAxx +1758 1065 0 2 8 18 58 758 1758 1758 1758 116 117 QPAAAA ZOBAAA HHHHxx +8823 1066 1 3 3 3 23 823 823 3823 8823 46 47 JBAAAA APBAAA OOOOxx +129 1067 1 1 9 9 29 129 129 129 129 58 59 ZEAAAA BPBAAA VVVVxx +5703 1068 1 3 3 3 3 703 1703 703 5703 6 7 JLAAAA CPBAAA AAAAxx +3331 1069 1 3 1 11 31 331 1331 3331 3331 62 63 DYAAAA DPBAAA HHHHxx +5791 1070 1 3 1 11 91 791 1791 791 5791 182 183 TOAAAA EPBAAA OOOOxx +4421 1071 1 1 1 1 21 421 421 4421 4421 42 43 BOAAAA FPBAAA VVVVxx +9740 1072 0 0 0 0 40 740 1740 4740 9740 80 81 QKAAAA GPBAAA AAAAxx +798 1073 0 2 8 18 98 798 798 798 798 196 197 SEAAAA HPBAAA HHHHxx +571 1074 1 3 1 11 71 571 571 571 571 142 143 ZVAAAA IPBAAA OOOOxx +7084 1075 0 0 4 4 84 84 1084 2084 7084 168 169 MMAAAA JPBAAA VVVVxx +650 1076 0 2 0 10 50 650 650 650 650 100 101 AZAAAA KPBAAA AAAAxx +1467 1077 1 3 7 7 67 467 1467 1467 1467 134 135 LEAAAA LPBAAA HHHHxx +5446 1078 0 2 6 6 46 446 1446 446 5446 92 93 MBAAAA MPBAAA OOOOxx +830 1079 0 2 0 10 30 830 830 830 830 60 61 YFAAAA NPBAAA VVVVxx +5516 1080 0 0 6 16 16 516 1516 516 5516 32 33 EEAAAA OPBAAA AAAAxx +8520 1081 0 0 0 0 20 520 520 3520 8520 40 41 SPAAAA PPBAAA HHHHxx +1152 1082 0 0 2 12 52 152 1152 1152 1152 104 105 ISAAAA QPBAAA OOOOxx +862 1083 0 2 2 2 62 862 862 862 862 124 125 EHAAAA RPBAAA VVVVxx +454 1084 0 2 4 14 54 454 454 454 454 108 109 MRAAAA SPBAAA AAAAxx +9956 1085 0 0 6 16 56 956 1956 4956 9956 112 113 YSAAAA TPBAAA HHHHxx +1654 1086 0 2 4 14 54 654 1654 1654 1654 108 109 QLAAAA UPBAAA OOOOxx +257 1087 1 1 7 17 57 257 257 257 257 114 115 XJAAAA VPBAAA VVVVxx +5469 1088 1 1 9 9 69 469 1469 469 5469 138 139 JCAAAA WPBAAA AAAAxx +9075 1089 1 3 5 15 75 75 1075 4075 9075 150 151 BLAAAA XPBAAA HHHHxx +7799 1090 1 3 9 19 99 799 1799 2799 7799 198 199 ZNAAAA YPBAAA OOOOxx +2001 1091 1 1 1 1 1 1 1 2001 2001 2 3 ZYAAAA ZPBAAA VVVVxx +9786 1092 0 2 6 6 86 786 1786 4786 9786 172 173 KMAAAA AQBAAA AAAAxx +7281 1093 1 1 1 1 81 281 1281 2281 7281 162 163 BUAAAA BQBAAA HHHHxx +5137 1094 1 1 7 17 37 137 1137 137 5137 74 75 PPAAAA CQBAAA OOOOxx +4053 1095 1 1 3 13 53 53 53 4053 4053 106 107 XZAAAA DQBAAA VVVVxx +7911 1096 1 3 1 11 11 911 1911 2911 7911 22 23 HSAAAA EQBAAA AAAAxx +4298 1097 0 2 8 18 98 298 298 4298 4298 196 197 IJAAAA FQBAAA HHHHxx +4805 1098 1 1 5 5 5 805 805 4805 4805 10 11 VCAAAA GQBAAA OOOOxx +9038 1099 0 2 8 18 38 38 1038 4038 9038 76 77 QJAAAA HQBAAA VVVVxx +8023 1100 1 3 3 3 23 23 23 3023 8023 46 47 PWAAAA IQBAAA AAAAxx +6595 1101 1 3 5 15 95 595 595 1595 6595 190 191 RTAAAA JQBAAA HHHHxx +9831 1102 1 3 1 11 31 831 1831 4831 9831 62 63 DOAAAA KQBAAA OOOOxx +788 1103 0 0 8 8 88 788 788 788 788 176 177 IEAAAA LQBAAA VVVVxx +902 1104 0 2 2 2 2 902 902 902 902 4 5 SIAAAA MQBAAA AAAAxx +9137 1105 1 1 7 17 37 137 1137 4137 9137 74 75 LNAAAA NQBAAA HHHHxx +1744 1106 0 0 4 4 44 744 1744 1744 1744 88 89 CPAAAA OQBAAA OOOOxx +7285 1107 1 1 5 5 85 285 1285 2285 7285 170 171 FUAAAA PQBAAA VVVVxx +7006 1108 0 2 6 6 6 6 1006 2006 7006 12 13 MJAAAA QQBAAA AAAAxx +9236 1109 0 0 6 16 36 236 1236 4236 9236 72 73 GRAAAA RQBAAA HHHHxx +5472 1110 0 0 2 12 72 472 1472 472 5472 144 145 MCAAAA SQBAAA OOOOxx +7975 1111 1 3 5 15 75 975 1975 2975 7975 150 151 TUAAAA TQBAAA VVVVxx +4181 1112 1 1 1 1 81 181 181 4181 4181 162 163 VEAAAA UQBAAA AAAAxx +7677 1113 1 1 7 17 77 677 1677 2677 7677 154 155 HJAAAA VQBAAA HHHHxx +35 1114 1 3 5 15 35 35 35 35 35 70 71 JBAAAA WQBAAA OOOOxx +6813 1115 1 1 3 13 13 813 813 1813 6813 26 27 BCAAAA XQBAAA VVVVxx +6618 1116 0 2 8 18 18 618 618 1618 6618 36 37 OUAAAA YQBAAA AAAAxx +8069 1117 1 1 9 9 69 69 69 3069 8069 138 139 JYAAAA ZQBAAA HHHHxx +3071 1118 1 3 1 11 71 71 1071 3071 3071 142 143 DOAAAA ARBAAA OOOOxx +4390 1119 0 2 0 10 90 390 390 4390 4390 180 181 WMAAAA BRBAAA VVVVxx +7764 1120 0 0 4 4 64 764 1764 2764 7764 128 129 QMAAAA CRBAAA AAAAxx +8163 1121 1 3 3 3 63 163 163 3163 8163 126 127 ZBAAAA DRBAAA HHHHxx +1961 1122 1 1 1 1 61 961 1961 1961 1961 122 123 LXAAAA ERBAAA OOOOxx +1103 1123 1 3 3 3 3 103 1103 1103 1103 6 7 LQAAAA FRBAAA VVVVxx +5486 1124 0 2 6 6 86 486 1486 486 5486 172 173 ADAAAA GRBAAA AAAAxx +9513 1125 1 1 3 13 13 513 1513 4513 9513 26 27 XBAAAA HRBAAA HHHHxx +7311 1126 1 3 1 11 11 311 1311 2311 7311 22 23 FVAAAA IRBAAA OOOOxx +4144 1127 0 0 4 4 44 144 144 4144 4144 88 89 KDAAAA JRBAAA VVVVxx +7901 1128 1 1 1 1 1 901 1901 2901 7901 2 3 XRAAAA KRBAAA AAAAxx +4629 1129 1 1 9 9 29 629 629 4629 4629 58 59 BWAAAA LRBAAA HHHHxx +6858 1130 0 2 8 18 58 858 858 1858 6858 116 117 UDAAAA MRBAAA OOOOxx +125 1131 1 1 5 5 25 125 125 125 125 50 51 VEAAAA NRBAAA VVVVxx +3834 1132 0 2 4 14 34 834 1834 3834 3834 68 69 MRAAAA ORBAAA AAAAxx +8155 1133 1 3 5 15 55 155 155 3155 8155 110 111 RBAAAA PRBAAA HHHHxx +8230 1134 0 2 0 10 30 230 230 3230 8230 60 61 OEAAAA QRBAAA OOOOxx +744 1135 0 0 4 4 44 744 744 744 744 88 89 QCAAAA RRBAAA VVVVxx +357 1136 1 1 7 17 57 357 357 357 357 114 115 TNAAAA SRBAAA AAAAxx +2159 1137 1 3 9 19 59 159 159 2159 2159 118 119 BFAAAA TRBAAA HHHHxx +8559 1138 1 3 9 19 59 559 559 3559 8559 118 119 FRAAAA URBAAA OOOOxx +6866 1139 0 2 6 6 66 866 866 1866 6866 132 133 CEAAAA VRBAAA VVVVxx +3863 1140 1 3 3 3 63 863 1863 3863 3863 126 127 PSAAAA WRBAAA AAAAxx +4193 1141 1 1 3 13 93 193 193 4193 4193 186 187 HFAAAA XRBAAA HHHHxx +3277 1142 1 1 7 17 77 277 1277 3277 3277 154 155 BWAAAA YRBAAA OOOOxx +5577 1143 1 1 7 17 77 577 1577 577 5577 154 155 NGAAAA ZRBAAA VVVVxx +9503 1144 1 3 3 3 3 503 1503 4503 9503 6 7 NBAAAA ASBAAA AAAAxx +7642 1145 0 2 2 2 42 642 1642 2642 7642 84 85 YHAAAA BSBAAA HHHHxx +6197 1146 1 1 7 17 97 197 197 1197 6197 194 195 JEAAAA CSBAAA OOOOxx +8995 1147 1 3 5 15 95 995 995 3995 8995 190 191 ZHAAAA DSBAAA VVVVxx +440 1148 0 0 0 0 40 440 440 440 440 80 81 YQAAAA ESBAAA AAAAxx +8418 1149 0 2 8 18 18 418 418 3418 8418 36 37 ULAAAA FSBAAA HHHHxx +8531 1150 1 3 1 11 31 531 531 3531 8531 62 63 DQAAAA GSBAAA OOOOxx +3790 1151 0 2 0 10 90 790 1790 3790 3790 180 181 UPAAAA HSBAAA VVVVxx +7610 1152 0 2 0 10 10 610 1610 2610 7610 20 21 SGAAAA ISBAAA AAAAxx +1252 1153 0 0 2 12 52 252 1252 1252 1252 104 105 EWAAAA JSBAAA HHHHxx +7559 1154 1 3 9 19 59 559 1559 2559 7559 118 119 TEAAAA KSBAAA OOOOxx +9945 1155 1 1 5 5 45 945 1945 4945 9945 90 91 NSAAAA LSBAAA VVVVxx +9023 1156 1 3 3 3 23 23 1023 4023 9023 46 47 BJAAAA MSBAAA AAAAxx +3516 1157 0 0 6 16 16 516 1516 3516 3516 32 33 GFAAAA NSBAAA HHHHxx +4671 1158 1 3 1 11 71 671 671 4671 4671 142 143 RXAAAA OSBAAA OOOOxx +1465 1159 1 1 5 5 65 465 1465 1465 1465 130 131 JEAAAA PSBAAA VVVVxx +9515 1160 1 3 5 15 15 515 1515 4515 9515 30 31 ZBAAAA QSBAAA AAAAxx +3242 1161 0 2 2 2 42 242 1242 3242 3242 84 85 SUAAAA RSBAAA HHHHxx +1732 1162 0 0 2 12 32 732 1732 1732 1732 64 65 QOAAAA SSBAAA OOOOxx +1678 1163 0 2 8 18 78 678 1678 1678 1678 156 157 OMAAAA TSBAAA VVVVxx +1464 1164 0 0 4 4 64 464 1464 1464 1464 128 129 IEAAAA USBAAA AAAAxx +6546 1165 0 2 6 6 46 546 546 1546 6546 92 93 URAAAA VSBAAA HHHHxx +4448 1166 0 0 8 8 48 448 448 4448 4448 96 97 CPAAAA WSBAAA OOOOxx +9847 1167 1 3 7 7 47 847 1847 4847 9847 94 95 TOAAAA XSBAAA VVVVxx +8264 1168 0 0 4 4 64 264 264 3264 8264 128 129 WFAAAA YSBAAA AAAAxx +1620 1169 0 0 0 0 20 620 1620 1620 1620 40 41 IKAAAA ZSBAAA HHHHxx +9388 1170 0 0 8 8 88 388 1388 4388 9388 176 177 CXAAAA ATBAAA OOOOxx +6445 1171 1 1 5 5 45 445 445 1445 6445 90 91 XNAAAA BTBAAA VVVVxx +4789 1172 1 1 9 9 89 789 789 4789 4789 178 179 FCAAAA CTBAAA AAAAxx +1562 1173 0 2 2 2 62 562 1562 1562 1562 124 125 CIAAAA DTBAAA HHHHxx +7305 1174 1 1 5 5 5 305 1305 2305 7305 10 11 ZUAAAA ETBAAA OOOOxx +6344 1175 0 0 4 4 44 344 344 1344 6344 88 89 AKAAAA FTBAAA VVVVxx +5130 1176 0 2 0 10 30 130 1130 130 5130 60 61 IPAAAA GTBAAA AAAAxx +3284 1177 0 0 4 4 84 284 1284 3284 3284 168 169 IWAAAA HTBAAA HHHHxx +6346 1178 0 2 6 6 46 346 346 1346 6346 92 93 CKAAAA ITBAAA OOOOxx +1061 1179 1 1 1 1 61 61 1061 1061 1061 122 123 VOAAAA JTBAAA VVVVxx +872 1180 0 0 2 12 72 872 872 872 872 144 145 OHAAAA KTBAAA AAAAxx +123 1181 1 3 3 3 23 123 123 123 123 46 47 TEAAAA LTBAAA HHHHxx +7903 1182 1 3 3 3 3 903 1903 2903 7903 6 7 ZRAAAA MTBAAA OOOOxx +560 1183 0 0 0 0 60 560 560 560 560 120 121 OVAAAA NTBAAA VVVVxx +4446 1184 0 2 6 6 46 446 446 4446 4446 92 93 APAAAA OTBAAA AAAAxx +3909 1185 1 1 9 9 9 909 1909 3909 3909 18 19 JUAAAA PTBAAA HHHHxx +669 1186 1 1 9 9 69 669 669 669 669 138 139 TZAAAA QTBAAA OOOOxx +7843 1187 1 3 3 3 43 843 1843 2843 7843 86 87 RPAAAA RTBAAA VVVVxx +2546 1188 0 2 6 6 46 546 546 2546 2546 92 93 YTAAAA STBAAA AAAAxx +6757 1189 1 1 7 17 57 757 757 1757 6757 114 115 XZAAAA TTBAAA HHHHxx +466 1190 0 2 6 6 66 466 466 466 466 132 133 YRAAAA UTBAAA OOOOxx +5556 1191 0 0 6 16 56 556 1556 556 5556 112 113 SFAAAA VTBAAA VVVVxx +7196 1192 0 0 6 16 96 196 1196 2196 7196 192 193 UQAAAA WTBAAA AAAAxx +2947 1193 1 3 7 7 47 947 947 2947 2947 94 95 JJAAAA XTBAAA HHHHxx +6493 1194 1 1 3 13 93 493 493 1493 6493 186 187 TPAAAA YTBAAA OOOOxx +7203 1195 1 3 3 3 3 203 1203 2203 7203 6 7 BRAAAA ZTBAAA VVVVxx +3716 1196 0 0 6 16 16 716 1716 3716 3716 32 33 YMAAAA AUBAAA AAAAxx +8058 1197 0 2 8 18 58 58 58 3058 8058 116 117 YXAAAA BUBAAA HHHHxx +433 1198 1 1 3 13 33 433 433 433 433 66 67 RQAAAA CUBAAA OOOOxx +7649 1199 1 1 9 9 49 649 1649 2649 7649 98 99 FIAAAA DUBAAA VVVVxx +6966 1200 0 2 6 6 66 966 966 1966 6966 132 133 YHAAAA EUBAAA AAAAxx +553 1201 1 1 3 13 53 553 553 553 553 106 107 HVAAAA FUBAAA HHHHxx +3677 1202 1 1 7 17 77 677 1677 3677 3677 154 155 LLAAAA GUBAAA OOOOxx +2344 1203 0 0 4 4 44 344 344 2344 2344 88 89 EMAAAA HUBAAA VVVVxx +7439 1204 1 3 9 19 39 439 1439 2439 7439 78 79 DAAAAA IUBAAA AAAAxx +3910 1205 0 2 0 10 10 910 1910 3910 3910 20 21 KUAAAA JUBAAA HHHHxx +3638 1206 0 2 8 18 38 638 1638 3638 3638 76 77 YJAAAA KUBAAA OOOOxx +6637 1207 1 1 7 17 37 637 637 1637 6637 74 75 HVAAAA LUBAAA VVVVxx +4438 1208 0 2 8 18 38 438 438 4438 4438 76 77 SOAAAA MUBAAA AAAAxx +171 1209 1 3 1 11 71 171 171 171 171 142 143 PGAAAA NUBAAA HHHHxx +310 1210 0 2 0 10 10 310 310 310 310 20 21 YLAAAA OUBAAA OOOOxx +2714 1211 0 2 4 14 14 714 714 2714 2714 28 29 KAAAAA PUBAAA VVVVxx +5199 1212 1 3 9 19 99 199 1199 199 5199 198 199 ZRAAAA QUBAAA AAAAxx +8005 1213 1 1 5 5 5 5 5 3005 8005 10 11 XVAAAA RUBAAA HHHHxx +3188 1214 0 0 8 8 88 188 1188 3188 3188 176 177 QSAAAA SUBAAA OOOOxx +1518 1215 0 2 8 18 18 518 1518 1518 1518 36 37 KGAAAA TUBAAA VVVVxx +6760 1216 0 0 0 0 60 760 760 1760 6760 120 121 AAAAAA UUBAAA AAAAxx +9373 1217 1 1 3 13 73 373 1373 4373 9373 146 147 NWAAAA VUBAAA HHHHxx +1938 1218 0 2 8 18 38 938 1938 1938 1938 76 77 OWAAAA WUBAAA OOOOxx +2865 1219 1 1 5 5 65 865 865 2865 2865 130 131 FGAAAA XUBAAA VVVVxx +3203 1220 1 3 3 3 3 203 1203 3203 3203 6 7 FTAAAA YUBAAA AAAAxx +6025 1221 1 1 5 5 25 25 25 1025 6025 50 51 TXAAAA ZUBAAA HHHHxx +8684 1222 0 0 4 4 84 684 684 3684 8684 168 169 AWAAAA AVBAAA OOOOxx +7732 1223 0 0 2 12 32 732 1732 2732 7732 64 65 KLAAAA BVBAAA VVVVxx +3218 1224 0 2 8 18 18 218 1218 3218 3218 36 37 UTAAAA CVBAAA AAAAxx +525 1225 1 1 5 5 25 525 525 525 525 50 51 FUAAAA DVBAAA HHHHxx +601 1226 1 1 1 1 1 601 601 601 601 2 3 DXAAAA EVBAAA OOOOxx +6091 1227 1 3 1 11 91 91 91 1091 6091 182 183 HAAAAA FVBAAA VVVVxx +4498 1228 0 2 8 18 98 498 498 4498 4498 196 197 ARAAAA GVBAAA AAAAxx +8192 1229 0 0 2 12 92 192 192 3192 8192 184 185 CDAAAA HVBAAA HHHHxx +8006 1230 0 2 6 6 6 6 6 3006 8006 12 13 YVAAAA IVBAAA OOOOxx +6157 1231 1 1 7 17 57 157 157 1157 6157 114 115 VCAAAA JVBAAA VVVVxx +312 1232 0 0 2 12 12 312 312 312 312 24 25 AMAAAA KVBAAA AAAAxx +8652 1233 0 0 2 12 52 652 652 3652 8652 104 105 UUAAAA LVBAAA HHHHxx +2787 1234 1 3 7 7 87 787 787 2787 2787 174 175 FDAAAA MVBAAA OOOOxx +1782 1235 0 2 2 2 82 782 1782 1782 1782 164 165 OQAAAA NVBAAA VVVVxx +23 1236 1 3 3 3 23 23 23 23 23 46 47 XAAAAA OVBAAA AAAAxx +1206 1237 0 2 6 6 6 206 1206 1206 1206 12 13 KUAAAA PVBAAA HHHHxx +1076 1238 0 0 6 16 76 76 1076 1076 1076 152 153 KPAAAA QVBAAA OOOOxx +5379 1239 1 3 9 19 79 379 1379 379 5379 158 159 XYAAAA RVBAAA VVVVxx +2047 1240 1 3 7 7 47 47 47 2047 2047 94 95 TAAAAA SVBAAA AAAAxx +6262 1241 0 2 2 2 62 262 262 1262 6262 124 125 WGAAAA TVBAAA HHHHxx +1840 1242 0 0 0 0 40 840 1840 1840 1840 80 81 USAAAA UVBAAA OOOOxx +2106 1243 0 2 6 6 6 106 106 2106 2106 12 13 ADAAAA VVBAAA VVVVxx +1307 1244 1 3 7 7 7 307 1307 1307 1307 14 15 HYAAAA WVBAAA AAAAxx +735 1245 1 3 5 15 35 735 735 735 735 70 71 HCAAAA XVBAAA HHHHxx +3657 1246 1 1 7 17 57 657 1657 3657 3657 114 115 RKAAAA YVBAAA OOOOxx +3006 1247 0 2 6 6 6 6 1006 3006 3006 12 13 QLAAAA ZVBAAA VVVVxx +1538 1248 0 2 8 18 38 538 1538 1538 1538 76 77 EHAAAA AWBAAA AAAAxx +6098 1249 0 2 8 18 98 98 98 1098 6098 196 197 OAAAAA BWBAAA HHHHxx +5267 1250 1 3 7 7 67 267 1267 267 5267 134 135 PUAAAA CWBAAA OOOOxx +9757 1251 1 1 7 17 57 757 1757 4757 9757 114 115 HLAAAA DWBAAA VVVVxx +1236 1252 0 0 6 16 36 236 1236 1236 1236 72 73 OVAAAA EWBAAA AAAAxx +83 1253 1 3 3 3 83 83 83 83 83 166 167 FDAAAA FWBAAA HHHHxx +9227 1254 1 3 7 7 27 227 1227 4227 9227 54 55 XQAAAA GWBAAA OOOOxx +8772 1255 0 0 2 12 72 772 772 3772 8772 144 145 KZAAAA HWBAAA VVVVxx +8822 1256 0 2 2 2 22 822 822 3822 8822 44 45 IBAAAA IWBAAA AAAAxx +7167 1257 1 3 7 7 67 167 1167 2167 7167 134 135 RPAAAA JWBAAA HHHHxx +6909 1258 1 1 9 9 9 909 909 1909 6909 18 19 TFAAAA KWBAAA OOOOxx +1439 1259 1 3 9 19 39 439 1439 1439 1439 78 79 JDAAAA LWBAAA VVVVxx +2370 1260 0 2 0 10 70 370 370 2370 2370 140 141 ENAAAA MWBAAA AAAAxx +4577 1261 1 1 7 17 77 577 577 4577 4577 154 155 BUAAAA NWBAAA HHHHxx +2575 1262 1 3 5 15 75 575 575 2575 2575 150 151 BVAAAA OWBAAA OOOOxx +2795 1263 1 3 5 15 95 795 795 2795 2795 190 191 NDAAAA PWBAAA VVVVxx +5520 1264 0 0 0 0 20 520 1520 520 5520 40 41 IEAAAA QWBAAA AAAAxx +382 1265 0 2 2 2 82 382 382 382 382 164 165 SOAAAA RWBAAA HHHHxx +6335 1266 1 3 5 15 35 335 335 1335 6335 70 71 RJAAAA SWBAAA OOOOxx +8430 1267 0 2 0 10 30 430 430 3430 8430 60 61 GMAAAA TWBAAA VVVVxx +4131 1268 1 3 1 11 31 131 131 4131 4131 62 63 XCAAAA UWBAAA AAAAxx +9332 1269 0 0 2 12 32 332 1332 4332 9332 64 65 YUAAAA VWBAAA HHHHxx +293 1270 1 1 3 13 93 293 293 293 293 186 187 HLAAAA WWBAAA OOOOxx +2276 1271 0 0 6 16 76 276 276 2276 2276 152 153 OJAAAA XWBAAA VVVVxx +5687 1272 1 3 7 7 87 687 1687 687 5687 174 175 TKAAAA YWBAAA AAAAxx +5862 1273 0 2 2 2 62 862 1862 862 5862 124 125 MRAAAA ZWBAAA HHHHxx +5073 1274 1 1 3 13 73 73 1073 73 5073 146 147 DNAAAA AXBAAA OOOOxx +4170 1275 0 2 0 10 70 170 170 4170 4170 140 141 KEAAAA BXBAAA VVVVxx +5039 1276 1 3 9 19 39 39 1039 39 5039 78 79 VLAAAA CXBAAA AAAAxx +3294 1277 0 2 4 14 94 294 1294 3294 3294 188 189 SWAAAA DXBAAA HHHHxx +6015 1278 1 3 5 15 15 15 15 1015 6015 30 31 JXAAAA EXBAAA OOOOxx +9015 1279 1 3 5 15 15 15 1015 4015 9015 30 31 TIAAAA FXBAAA VVVVxx +9785 1280 1 1 5 5 85 785 1785 4785 9785 170 171 JMAAAA GXBAAA AAAAxx +4312 1281 0 0 2 12 12 312 312 4312 4312 24 25 WJAAAA HXBAAA HHHHxx +6343 1282 1 3 3 3 43 343 343 1343 6343 86 87 ZJAAAA IXBAAA OOOOxx +2161 1283 1 1 1 1 61 161 161 2161 2161 122 123 DFAAAA JXBAAA VVVVxx +4490 1284 0 2 0 10 90 490 490 4490 4490 180 181 SQAAAA KXBAAA AAAAxx +4454 1285 0 2 4 14 54 454 454 4454 4454 108 109 IPAAAA LXBAAA HHHHxx +7647 1286 1 3 7 7 47 647 1647 2647 7647 94 95 DIAAAA MXBAAA OOOOxx +1028 1287 0 0 8 8 28 28 1028 1028 1028 56 57 ONAAAA NXBAAA VVVVxx +2965 1288 1 1 5 5 65 965 965 2965 2965 130 131 BKAAAA OXBAAA AAAAxx +9900 1289 0 0 0 0 0 900 1900 4900 9900 0 1 UQAAAA PXBAAA HHHHxx +5509 1290 1 1 9 9 9 509 1509 509 5509 18 19 XDAAAA QXBAAA OOOOxx +7751 1291 1 3 1 11 51 751 1751 2751 7751 102 103 DMAAAA RXBAAA VVVVxx +9594 1292 0 2 4 14 94 594 1594 4594 9594 188 189 AFAAAA SXBAAA AAAAxx +7632 1293 0 0 2 12 32 632 1632 2632 7632 64 65 OHAAAA TXBAAA HHHHxx +6528 1294 0 0 8 8 28 528 528 1528 6528 56 57 CRAAAA UXBAAA OOOOxx +1041 1295 1 1 1 1 41 41 1041 1041 1041 82 83 BOAAAA VXBAAA VVVVxx +1534 1296 0 2 4 14 34 534 1534 1534 1534 68 69 AHAAAA WXBAAA AAAAxx +4229 1297 1 1 9 9 29 229 229 4229 4229 58 59 RGAAAA XXBAAA HHHHxx +84 1298 0 0 4 4 84 84 84 84 84 168 169 GDAAAA YXBAAA OOOOxx +2189 1299 1 1 9 9 89 189 189 2189 2189 178 179 FGAAAA ZXBAAA VVVVxx +7566 1300 0 2 6 6 66 566 1566 2566 7566 132 133 AFAAAA AYBAAA AAAAxx +707 1301 1 3 7 7 7 707 707 707 707 14 15 FBAAAA BYBAAA HHHHxx +581 1302 1 1 1 1 81 581 581 581 581 162 163 JWAAAA CYBAAA OOOOxx +6753 1303 1 1 3 13 53 753 753 1753 6753 106 107 TZAAAA DYBAAA VVVVxx +8604 1304 0 0 4 4 4 604 604 3604 8604 8 9 YSAAAA EYBAAA AAAAxx +373 1305 1 1 3 13 73 373 373 373 373 146 147 JOAAAA FYBAAA HHHHxx +9635 1306 1 3 5 15 35 635 1635 4635 9635 70 71 PGAAAA GYBAAA OOOOxx +9277 1307 1 1 7 17 77 277 1277 4277 9277 154 155 VSAAAA HYBAAA VVVVxx +7117 1308 1 1 7 17 17 117 1117 2117 7117 34 35 TNAAAA IYBAAA AAAAxx +8564 1309 0 0 4 4 64 564 564 3564 8564 128 129 KRAAAA JYBAAA HHHHxx +1697 1310 1 1 7 17 97 697 1697 1697 1697 194 195 HNAAAA KYBAAA OOOOxx +7840 1311 0 0 0 0 40 840 1840 2840 7840 80 81 OPAAAA LYBAAA VVVVxx +3646 1312 0 2 6 6 46 646 1646 3646 3646 92 93 GKAAAA MYBAAA AAAAxx +368 1313 0 0 8 8 68 368 368 368 368 136 137 EOAAAA NYBAAA HHHHxx +4797 1314 1 1 7 17 97 797 797 4797 4797 194 195 NCAAAA OYBAAA OOOOxx +5300 1315 0 0 0 0 0 300 1300 300 5300 0 1 WVAAAA PYBAAA VVVVxx +7664 1316 0 0 4 4 64 664 1664 2664 7664 128 129 UIAAAA QYBAAA AAAAxx +1466 1317 0 2 6 6 66 466 1466 1466 1466 132 133 KEAAAA RYBAAA HHHHxx +2477 1318 1 1 7 17 77 477 477 2477 2477 154 155 HRAAAA SYBAAA OOOOxx +2036 1319 0 0 6 16 36 36 36 2036 2036 72 73 IAAAAA TYBAAA VVVVxx +3624 1320 0 0 4 4 24 624 1624 3624 3624 48 49 KJAAAA UYBAAA AAAAxx +5099 1321 1 3 9 19 99 99 1099 99 5099 198 199 DOAAAA VYBAAA HHHHxx +1308 1322 0 0 8 8 8 308 1308 1308 1308 16 17 IYAAAA WYBAAA OOOOxx +3704 1323 0 0 4 4 4 704 1704 3704 3704 8 9 MMAAAA XYBAAA VVVVxx +2451 1324 1 3 1 11 51 451 451 2451 2451 102 103 HQAAAA YYBAAA AAAAxx +4898 1325 0 2 8 18 98 898 898 4898 4898 196 197 KGAAAA ZYBAAA HHHHxx +4959 1326 1 3 9 19 59 959 959 4959 4959 118 119 TIAAAA AZBAAA OOOOxx +5942 1327 0 2 2 2 42 942 1942 942 5942 84 85 OUAAAA BZBAAA VVVVxx +2425 1328 1 1 5 5 25 425 425 2425 2425 50 51 HPAAAA CZBAAA AAAAxx +7760 1329 0 0 0 0 60 760 1760 2760 7760 120 121 MMAAAA DZBAAA HHHHxx +6294 1330 0 2 4 14 94 294 294 1294 6294 188 189 CIAAAA EZBAAA OOOOxx +6785 1331 1 1 5 5 85 785 785 1785 6785 170 171 ZAAAAA FZBAAA VVVVxx +3542 1332 0 2 2 2 42 542 1542 3542 3542 84 85 GGAAAA GZBAAA AAAAxx +1809 1333 1 1 9 9 9 809 1809 1809 1809 18 19 PRAAAA HZBAAA HHHHxx +130 1334 0 2 0 10 30 130 130 130 130 60 61 AFAAAA IZBAAA OOOOxx +8672 1335 0 0 2 12 72 672 672 3672 8672 144 145 OVAAAA JZBAAA VVVVxx +2125 1336 1 1 5 5 25 125 125 2125 2125 50 51 TDAAAA KZBAAA AAAAxx +7683 1337 1 3 3 3 83 683 1683 2683 7683 166 167 NJAAAA LZBAAA HHHHxx +7842 1338 0 2 2 2 42 842 1842 2842 7842 84 85 QPAAAA MZBAAA OOOOxx +9584 1339 0 0 4 4 84 584 1584 4584 9584 168 169 QEAAAA NZBAAA VVVVxx +7963 1340 1 3 3 3 63 963 1963 2963 7963 126 127 HUAAAA OZBAAA AAAAxx +8581 1341 1 1 1 1 81 581 581 3581 8581 162 163 BSAAAA PZBAAA HHHHxx +2135 1342 1 3 5 15 35 135 135 2135 2135 70 71 DEAAAA QZBAAA OOOOxx +7352 1343 0 0 2 12 52 352 1352 2352 7352 104 105 UWAAAA RZBAAA VVVVxx +5789 1344 1 1 9 9 89 789 1789 789 5789 178 179 ROAAAA SZBAAA AAAAxx +8490 1345 0 2 0 10 90 490 490 3490 8490 180 181 OOAAAA TZBAAA HHHHxx +2145 1346 1 1 5 5 45 145 145 2145 2145 90 91 NEAAAA UZBAAA OOOOxx +7021 1347 1 1 1 1 21 21 1021 2021 7021 42 43 BKAAAA VZBAAA VVVVxx +3736 1348 0 0 6 16 36 736 1736 3736 3736 72 73 SNAAAA WZBAAA AAAAxx +7396 1349 0 0 6 16 96 396 1396 2396 7396 192 193 MYAAAA XZBAAA HHHHxx +6334 1350 0 2 4 14 34 334 334 1334 6334 68 69 QJAAAA YZBAAA OOOOxx +5461 1351 1 1 1 1 61 461 1461 461 5461 122 123 BCAAAA ZZBAAA VVVVxx +5337 1352 1 1 7 17 37 337 1337 337 5337 74 75 HXAAAA AACAAA AAAAxx +7440 1353 0 0 0 0 40 440 1440 2440 7440 80 81 EAAAAA BACAAA HHHHxx +6879 1354 1 3 9 19 79 879 879 1879 6879 158 159 PEAAAA CACAAA OOOOxx +2432 1355 0 0 2 12 32 432 432 2432 2432 64 65 OPAAAA DACAAA VVVVxx +8529 1356 1 1 9 9 29 529 529 3529 8529 58 59 BQAAAA EACAAA AAAAxx +7859 1357 1 3 9 19 59 859 1859 2859 7859 118 119 HQAAAA FACAAA HHHHxx +15 1358 1 3 5 15 15 15 15 15 15 30 31 PAAAAA GACAAA OOOOxx +7475 1359 1 3 5 15 75 475 1475 2475 7475 150 151 NBAAAA HACAAA VVVVxx +717 1360 1 1 7 17 17 717 717 717 717 34 35 PBAAAA IACAAA AAAAxx +250 1361 0 2 0 10 50 250 250 250 250 100 101 QJAAAA JACAAA HHHHxx +4700 1362 0 0 0 0 0 700 700 4700 4700 0 1 UYAAAA KACAAA OOOOxx +7510 1363 0 2 0 10 10 510 1510 2510 7510 20 21 WCAAAA LACAAA VVVVxx +4562 1364 0 2 2 2 62 562 562 4562 4562 124 125 MTAAAA MACAAA AAAAxx +8075 1365 1 3 5 15 75 75 75 3075 8075 150 151 PYAAAA NACAAA HHHHxx +871 1366 1 3 1 11 71 871 871 871 871 142 143 NHAAAA OACAAA OOOOxx +7161 1367 1 1 1 1 61 161 1161 2161 7161 122 123 LPAAAA PACAAA VVVVxx +9109 1368 1 1 9 9 9 109 1109 4109 9109 18 19 JMAAAA QACAAA AAAAxx +8675 1369 1 3 5 15 75 675 675 3675 8675 150 151 RVAAAA RACAAA HHHHxx +1025 1370 1 1 5 5 25 25 1025 1025 1025 50 51 LNAAAA SACAAA OOOOxx +4065 1371 1 1 5 5 65 65 65 4065 4065 130 131 JAAAAA TACAAA VVVVxx +3511 1372 1 3 1 11 11 511 1511 3511 3511 22 23 BFAAAA UACAAA AAAAxx +9840 1373 0 0 0 0 40 840 1840 4840 9840 80 81 MOAAAA VACAAA HHHHxx +7495 1374 1 3 5 15 95 495 1495 2495 7495 190 191 HCAAAA WACAAA OOOOxx +55 1375 1 3 5 15 55 55 55 55 55 110 111 DCAAAA XACAAA VVVVxx +6151 1376 1 3 1 11 51 151 151 1151 6151 102 103 PCAAAA YACAAA AAAAxx +2512 1377 0 0 2 12 12 512 512 2512 2512 24 25 QSAAAA ZACAAA HHHHxx +5881 1378 1 1 1 1 81 881 1881 881 5881 162 163 FSAAAA ABCAAA OOOOxx +1442 1379 0 2 2 2 42 442 1442 1442 1442 84 85 MDAAAA BBCAAA VVVVxx +1270 1380 0 2 0 10 70 270 1270 1270 1270 140 141 WWAAAA CBCAAA AAAAxx +959 1381 1 3 9 19 59 959 959 959 959 118 119 XKAAAA DBCAAA HHHHxx +8251 1382 1 3 1 11 51 251 251 3251 8251 102 103 JFAAAA EBCAAA OOOOxx +3051 1383 1 3 1 11 51 51 1051 3051 3051 102 103 JNAAAA FBCAAA VVVVxx +5052 1384 0 0 2 12 52 52 1052 52 5052 104 105 IMAAAA GBCAAA AAAAxx +1863 1385 1 3 3 3 63 863 1863 1863 1863 126 127 RTAAAA HBCAAA HHHHxx +344 1386 0 0 4 4 44 344 344 344 344 88 89 GNAAAA IBCAAA OOOOxx +3590 1387 0 2 0 10 90 590 1590 3590 3590 180 181 CIAAAA JBCAAA VVVVxx +4223 1388 1 3 3 3 23 223 223 4223 4223 46 47 LGAAAA KBCAAA AAAAxx +2284 1389 0 0 4 4 84 284 284 2284 2284 168 169 WJAAAA LBCAAA HHHHxx +9425 1390 1 1 5 5 25 425 1425 4425 9425 50 51 NYAAAA MBCAAA OOOOxx +6221 1391 1 1 1 1 21 221 221 1221 6221 42 43 HFAAAA NBCAAA VVVVxx +195 1392 1 3 5 15 95 195 195 195 195 190 191 NHAAAA OBCAAA AAAAxx +1517 1393 1 1 7 17 17 517 1517 1517 1517 34 35 JGAAAA PBCAAA HHHHxx +3791 1394 1 3 1 11 91 791 1791 3791 3791 182 183 VPAAAA QBCAAA OOOOxx +572 1395 0 0 2 12 72 572 572 572 572 144 145 AWAAAA RBCAAA VVVVxx +46 1396 0 2 6 6 46 46 46 46 46 92 93 UBAAAA SBCAAA AAAAxx +9451 1397 1 3 1 11 51 451 1451 4451 9451 102 103 NZAAAA TBCAAA HHHHxx +3359 1398 1 3 9 19 59 359 1359 3359 3359 118 119 FZAAAA UBCAAA OOOOxx +8867 1399 1 3 7 7 67 867 867 3867 8867 134 135 BDAAAA VBCAAA VVVVxx +674 1400 0 2 4 14 74 674 674 674 674 148 149 YZAAAA WBCAAA AAAAxx +2674 1401 0 2 4 14 74 674 674 2674 2674 148 149 WYAAAA XBCAAA HHHHxx +6523 1402 1 3 3 3 23 523 523 1523 6523 46 47 XQAAAA YBCAAA OOOOxx +6210 1403 0 2 0 10 10 210 210 1210 6210 20 21 WEAAAA ZBCAAA VVVVxx +7564 1404 0 0 4 4 64 564 1564 2564 7564 128 129 YEAAAA ACCAAA AAAAxx +4776 1405 0 0 6 16 76 776 776 4776 4776 152 153 SBAAAA BCCAAA HHHHxx +2993 1406 1 1 3 13 93 993 993 2993 2993 186 187 DLAAAA CCCAAA OOOOxx +2969 1407 1 1 9 9 69 969 969 2969 2969 138 139 FKAAAA DCCAAA VVVVxx +1762 1408 0 2 2 2 62 762 1762 1762 1762 124 125 UPAAAA ECCAAA AAAAxx +685 1409 1 1 5 5 85 685 685 685 685 170 171 JAAAAA FCCAAA HHHHxx +5312 1410 0 0 2 12 12 312 1312 312 5312 24 25 IWAAAA GCCAAA OOOOxx +3264 1411 0 0 4 4 64 264 1264 3264 3264 128 129 OVAAAA HCCAAA VVVVxx +7008 1412 0 0 8 8 8 8 1008 2008 7008 16 17 OJAAAA ICCAAA AAAAxx +5167 1413 1 3 7 7 67 167 1167 167 5167 134 135 TQAAAA JCCAAA HHHHxx +3060 1414 0 0 0 0 60 60 1060 3060 3060 120 121 SNAAAA KCCAAA OOOOxx +1752 1415 0 0 2 12 52 752 1752 1752 1752 104 105 KPAAAA LCCAAA VVVVxx +1016 1416 0 0 6 16 16 16 1016 1016 1016 32 33 CNAAAA MCCAAA AAAAxx +7365 1417 1 1 5 5 65 365 1365 2365 7365 130 131 HXAAAA NCCAAA HHHHxx +4358 1418 0 2 8 18 58 358 358 4358 4358 116 117 QLAAAA OCCAAA OOOOxx +2819 1419 1 3 9 19 19 819 819 2819 2819 38 39 LEAAAA PCCAAA VVVVxx +6727 1420 1 3 7 7 27 727 727 1727 6727 54 55 TYAAAA QCCAAA AAAAxx +1459 1421 1 3 9 19 59 459 1459 1459 1459 118 119 DEAAAA RCCAAA HHHHxx +1708 1422 0 0 8 8 8 708 1708 1708 1708 16 17 SNAAAA SCCAAA OOOOxx +471 1423 1 3 1 11 71 471 471 471 471 142 143 DSAAAA TCCAAA VVVVxx +387 1424 1 3 7 7 87 387 387 387 387 174 175 XOAAAA UCCAAA AAAAxx +1166 1425 0 2 6 6 66 166 1166 1166 1166 132 133 WSAAAA VCCAAA HHHHxx +2400 1426 0 0 0 0 0 400 400 2400 2400 0 1 IOAAAA WCCAAA OOOOxx +3584 1427 0 0 4 4 84 584 1584 3584 3584 168 169 WHAAAA XCCAAA VVVVxx +6423 1428 1 3 3 3 23 423 423 1423 6423 46 47 BNAAAA YCCAAA AAAAxx +9520 1429 0 0 0 0 20 520 1520 4520 9520 40 41 ECAAAA ZCCAAA HHHHxx +8080 1430 0 0 0 0 80 80 80 3080 8080 160 161 UYAAAA ADCAAA OOOOxx +5709 1431 1 1 9 9 9 709 1709 709 5709 18 19 PLAAAA BDCAAA VVVVxx +1131 1432 1 3 1 11 31 131 1131 1131 1131 62 63 NRAAAA CDCAAA AAAAxx +8562 1433 0 2 2 2 62 562 562 3562 8562 124 125 IRAAAA DDCAAA HHHHxx +5766 1434 0 2 6 6 66 766 1766 766 5766 132 133 UNAAAA EDCAAA OOOOxx +245 1435 1 1 5 5 45 245 245 245 245 90 91 LJAAAA FDCAAA VVVVxx +9869 1436 1 1 9 9 69 869 1869 4869 9869 138 139 PPAAAA GDCAAA AAAAxx +3533 1437 1 1 3 13 33 533 1533 3533 3533 66 67 XFAAAA HDCAAA HHHHxx +5109 1438 1 1 9 9 9 109 1109 109 5109 18 19 NOAAAA IDCAAA OOOOxx +977 1439 1 1 7 17 77 977 977 977 977 154 155 PLAAAA JDCAAA VVVVxx +1651 1440 1 3 1 11 51 651 1651 1651 1651 102 103 NLAAAA KDCAAA AAAAxx +1357 1441 1 1 7 17 57 357 1357 1357 1357 114 115 FAAAAA LDCAAA HHHHxx +9087 1442 1 3 7 7 87 87 1087 4087 9087 174 175 NLAAAA MDCAAA OOOOxx +3399 1443 1 3 9 19 99 399 1399 3399 3399 198 199 TAAAAA NDCAAA VVVVxx +7543 1444 1 3 3 3 43 543 1543 2543 7543 86 87 DEAAAA ODCAAA AAAAxx +2469 1445 1 1 9 9 69 469 469 2469 2469 138 139 ZQAAAA PDCAAA HHHHxx +8305 1446 1 1 5 5 5 305 305 3305 8305 10 11 LHAAAA QDCAAA OOOOxx +3265 1447 1 1 5 5 65 265 1265 3265 3265 130 131 PVAAAA RDCAAA VVVVxx +9977 1448 1 1 7 17 77 977 1977 4977 9977 154 155 TTAAAA SDCAAA AAAAxx +3961 1449 1 1 1 1 61 961 1961 3961 3961 122 123 JWAAAA TDCAAA HHHHxx +4952 1450 0 0 2 12 52 952 952 4952 4952 104 105 MIAAAA UDCAAA OOOOxx +5173 1451 1 1 3 13 73 173 1173 173 5173 146 147 ZQAAAA VDCAAA VVVVxx +860 1452 0 0 0 0 60 860 860 860 860 120 121 CHAAAA WDCAAA AAAAxx +4523 1453 1 3 3 3 23 523 523 4523 4523 46 47 ZRAAAA XDCAAA HHHHxx +2361 1454 1 1 1 1 61 361 361 2361 2361 122 123 VMAAAA YDCAAA OOOOxx +7877 1455 1 1 7 17 77 877 1877 2877 7877 154 155 ZQAAAA ZDCAAA VVVVxx +3422 1456 0 2 2 2 22 422 1422 3422 3422 44 45 QBAAAA AECAAA AAAAxx +5781 1457 1 1 1 1 81 781 1781 781 5781 162 163 JOAAAA BECAAA HHHHxx +4752 1458 0 0 2 12 52 752 752 4752 4752 104 105 UAAAAA CECAAA OOOOxx +1786 1459 0 2 6 6 86 786 1786 1786 1786 172 173 SQAAAA DECAAA VVVVxx +1892 1460 0 0 2 12 92 892 1892 1892 1892 184 185 UUAAAA EECAAA AAAAxx +6389 1461 1 1 9 9 89 389 389 1389 6389 178 179 TLAAAA FECAAA HHHHxx +8644 1462 0 0 4 4 44 644 644 3644 8644 88 89 MUAAAA GECAAA OOOOxx +9056 1463 0 0 6 16 56 56 1056 4056 9056 112 113 IKAAAA HECAAA VVVVxx +1423 1464 1 3 3 3 23 423 1423 1423 1423 46 47 TCAAAA IECAAA AAAAxx +4901 1465 1 1 1 1 1 901 901 4901 4901 2 3 NGAAAA JECAAA HHHHxx +3859 1466 1 3 9 19 59 859 1859 3859 3859 118 119 LSAAAA KECAAA OOOOxx +2324 1467 0 0 4 4 24 324 324 2324 2324 48 49 KLAAAA LECAAA VVVVxx +8101 1468 1 1 1 1 1 101 101 3101 8101 2 3 PZAAAA MECAAA AAAAxx +8016 1469 0 0 6 16 16 16 16 3016 8016 32 33 IWAAAA NECAAA HHHHxx +5826 1470 0 2 6 6 26 826 1826 826 5826 52 53 CQAAAA OECAAA OOOOxx +8266 1471 0 2 6 6 66 266 266 3266 8266 132 133 YFAAAA PECAAA VVVVxx +7558 1472 0 2 8 18 58 558 1558 2558 7558 116 117 SEAAAA QECAAA AAAAxx +6976 1473 0 0 6 16 76 976 976 1976 6976 152 153 IIAAAA RECAAA HHHHxx +222 1474 0 2 2 2 22 222 222 222 222 44 45 OIAAAA SECAAA OOOOxx +1624 1475 0 0 4 4 24 624 1624 1624 1624 48 49 MKAAAA TECAAA VVVVxx +1250 1476 0 2 0 10 50 250 1250 1250 1250 100 101 CWAAAA UECAAA AAAAxx +1621 1477 1 1 1 1 21 621 1621 1621 1621 42 43 JKAAAA VECAAA HHHHxx +2350 1478 0 2 0 10 50 350 350 2350 2350 100 101 KMAAAA WECAAA OOOOxx +5239 1479 1 3 9 19 39 239 1239 239 5239 78 79 NTAAAA XECAAA VVVVxx +6681 1480 1 1 1 1 81 681 681 1681 6681 162 163 ZWAAAA YECAAA AAAAxx +4983 1481 1 3 3 3 83 983 983 4983 4983 166 167 RJAAAA ZECAAA HHHHxx +7149 1482 1 1 9 9 49 149 1149 2149 7149 98 99 ZOAAAA AFCAAA OOOOxx +3502 1483 0 2 2 2 2 502 1502 3502 3502 4 5 SEAAAA BFCAAA VVVVxx +3133 1484 1 1 3 13 33 133 1133 3133 3133 66 67 NQAAAA CFCAAA AAAAxx +8342 1485 0 2 2 2 42 342 342 3342 8342 84 85 WIAAAA DFCAAA HHHHxx +3041 1486 1 1 1 1 41 41 1041 3041 3041 82 83 ZMAAAA EFCAAA OOOOxx +5383 1487 1 3 3 3 83 383 1383 383 5383 166 167 BZAAAA FFCAAA VVVVxx +3916 1488 0 0 6 16 16 916 1916 3916 3916 32 33 QUAAAA GFCAAA AAAAxx +1438 1489 0 2 8 18 38 438 1438 1438 1438 76 77 IDAAAA HFCAAA HHHHxx +9408 1490 0 0 8 8 8 408 1408 4408 9408 16 17 WXAAAA IFCAAA OOOOxx +5783 1491 1 3 3 3 83 783 1783 783 5783 166 167 LOAAAA JFCAAA VVVVxx +683 1492 1 3 3 3 83 683 683 683 683 166 167 HAAAAA KFCAAA AAAAxx +9381 1493 1 1 1 1 81 381 1381 4381 9381 162 163 VWAAAA LFCAAA HHHHxx +5676 1494 0 0 6 16 76 676 1676 676 5676 152 153 IKAAAA MFCAAA OOOOxx +3224 1495 0 0 4 4 24 224 1224 3224 3224 48 49 AUAAAA NFCAAA VVVVxx +8332 1496 0 0 2 12 32 332 332 3332 8332 64 65 MIAAAA OFCAAA AAAAxx +3372 1497 0 0 2 12 72 372 1372 3372 3372 144 145 SZAAAA PFCAAA HHHHxx +7436 1498 0 0 6 16 36 436 1436 2436 7436 72 73 AAAAAA QFCAAA OOOOxx +5010 1499 0 2 0 10 10 10 1010 10 5010 20 21 SKAAAA RFCAAA VVVVxx +7256 1500 0 0 6 16 56 256 1256 2256 7256 112 113 CTAAAA SFCAAA AAAAxx +961 1501 1 1 1 1 61 961 961 961 961 122 123 ZKAAAA TFCAAA HHHHxx +4182 1502 0 2 2 2 82 182 182 4182 4182 164 165 WEAAAA UFCAAA OOOOxx +639 1503 1 3 9 19 39 639 639 639 639 78 79 PYAAAA VFCAAA VVVVxx +8836 1504 0 0 6 16 36 836 836 3836 8836 72 73 WBAAAA WFCAAA AAAAxx +8705 1505 1 1 5 5 5 705 705 3705 8705 10 11 VWAAAA XFCAAA HHHHxx +32 1506 0 0 2 12 32 32 32 32 32 64 65 GBAAAA YFCAAA OOOOxx +7913 1507 1 1 3 13 13 913 1913 2913 7913 26 27 JSAAAA ZFCAAA VVVVxx +229 1508 1 1 9 9 29 229 229 229 229 58 59 VIAAAA AGCAAA AAAAxx +2393 1509 1 1 3 13 93 393 393 2393 2393 186 187 BOAAAA BGCAAA HHHHxx +2815 1510 1 3 5 15 15 815 815 2815 2815 30 31 HEAAAA CGCAAA OOOOxx +4858 1511 0 2 8 18 58 858 858 4858 4858 116 117 WEAAAA DGCAAA VVVVxx +6283 1512 1 3 3 3 83 283 283 1283 6283 166 167 RHAAAA EGCAAA AAAAxx +4147 1513 1 3 7 7 47 147 147 4147 4147 94 95 NDAAAA FGCAAA HHHHxx +6801 1514 1 1 1 1 1 801 801 1801 6801 2 3 PBAAAA GGCAAA OOOOxx +1011 1515 1 3 1 11 11 11 1011 1011 1011 22 23 XMAAAA HGCAAA VVVVxx +2527 1516 1 3 7 7 27 527 527 2527 2527 54 55 FTAAAA IGCAAA AAAAxx +381 1517 1 1 1 1 81 381 381 381 381 162 163 ROAAAA JGCAAA HHHHxx +3366 1518 0 2 6 6 66 366 1366 3366 3366 132 133 MZAAAA KGCAAA OOOOxx +9636 1519 0 0 6 16 36 636 1636 4636 9636 72 73 QGAAAA LGCAAA VVVVxx +2239 1520 1 3 9 19 39 239 239 2239 2239 78 79 DIAAAA MGCAAA AAAAxx +5911 1521 1 3 1 11 11 911 1911 911 5911 22 23 JTAAAA NGCAAA HHHHxx +449 1522 1 1 9 9 49 449 449 449 449 98 99 HRAAAA OGCAAA OOOOxx +5118 1523 0 2 8 18 18 118 1118 118 5118 36 37 WOAAAA PGCAAA VVVVxx +7684 1524 0 0 4 4 84 684 1684 2684 7684 168 169 OJAAAA QGCAAA AAAAxx +804 1525 0 0 4 4 4 804 804 804 804 8 9 YEAAAA RGCAAA HHHHxx +8378 1526 0 2 8 18 78 378 378 3378 8378 156 157 GKAAAA SGCAAA OOOOxx +9855 1527 1 3 5 15 55 855 1855 4855 9855 110 111 BPAAAA TGCAAA VVVVxx +1995 1528 1 3 5 15 95 995 1995 1995 1995 190 191 TYAAAA UGCAAA AAAAxx +1979 1529 1 3 9 19 79 979 1979 1979 1979 158 159 DYAAAA VGCAAA HHHHxx +4510 1530 0 2 0 10 10 510 510 4510 4510 20 21 MRAAAA WGCAAA OOOOxx +3792 1531 0 0 2 12 92 792 1792 3792 3792 184 185 WPAAAA XGCAAA VVVVxx +3541 1532 1 1 1 1 41 541 1541 3541 3541 82 83 FGAAAA YGCAAA AAAAxx +8847 1533 1 3 7 7 47 847 847 3847 8847 94 95 HCAAAA ZGCAAA HHHHxx +1336 1534 0 0 6 16 36 336 1336 1336 1336 72 73 KZAAAA AHCAAA OOOOxx +6780 1535 0 0 0 0 80 780 780 1780 6780 160 161 UAAAAA BHCAAA VVVVxx +8711 1536 1 3 1 11 11 711 711 3711 8711 22 23 BXAAAA CHCAAA AAAAxx +7839 1537 1 3 9 19 39 839 1839 2839 7839 78 79 NPAAAA DHCAAA HHHHxx +677 1538 1 1 7 17 77 677 677 677 677 154 155 BAAAAA EHCAAA OOOOxx +1574 1539 0 2 4 14 74 574 1574 1574 1574 148 149 OIAAAA FHCAAA VVVVxx +2905 1540 1 1 5 5 5 905 905 2905 2905 10 11 THAAAA GHCAAA AAAAxx +1879 1541 1 3 9 19 79 879 1879 1879 1879 158 159 HUAAAA HHCAAA HHHHxx +7820 1542 0 0 0 0 20 820 1820 2820 7820 40 41 UOAAAA IHCAAA OOOOxx +4308 1543 0 0 8 8 8 308 308 4308 4308 16 17 SJAAAA JHCAAA VVVVxx +4474 1544 0 2 4 14 74 474 474 4474 4474 148 149 CQAAAA KHCAAA AAAAxx +6985 1545 1 1 5 5 85 985 985 1985 6985 170 171 RIAAAA LHCAAA HHHHxx +6929 1546 1 1 9 9 29 929 929 1929 6929 58 59 NGAAAA MHCAAA OOOOxx +777 1547 1 1 7 17 77 777 777 777 777 154 155 XDAAAA NHCAAA VVVVxx +8271 1548 1 3 1 11 71 271 271 3271 8271 142 143 DGAAAA OHCAAA AAAAxx +2389 1549 1 1 9 9 89 389 389 2389 2389 178 179 XNAAAA PHCAAA HHHHxx +946 1550 0 2 6 6 46 946 946 946 946 92 93 KKAAAA QHCAAA OOOOxx +9682 1551 0 2 2 2 82 682 1682 4682 9682 164 165 KIAAAA RHCAAA VVVVxx +8722 1552 0 2 2 2 22 722 722 3722 8722 44 45 MXAAAA SHCAAA AAAAxx +470 1553 0 2 0 10 70 470 470 470 470 140 141 CSAAAA THCAAA HHHHxx +7425 1554 1 1 5 5 25 425 1425 2425 7425 50 51 PZAAAA UHCAAA OOOOxx +2372 1555 0 0 2 12 72 372 372 2372 2372 144 145 GNAAAA VHCAAA VVVVxx +508 1556 0 0 8 8 8 508 508 508 508 16 17 OTAAAA WHCAAA AAAAxx +163 1557 1 3 3 3 63 163 163 163 163 126 127 HGAAAA XHCAAA HHHHxx +6579 1558 1 3 9 19 79 579 579 1579 6579 158 159 BTAAAA YHCAAA OOOOxx +2355 1559 1 3 5 15 55 355 355 2355 2355 110 111 PMAAAA ZHCAAA VVVVxx +70 1560 0 2 0 10 70 70 70 70 70 140 141 SCAAAA AICAAA AAAAxx +651 1561 1 3 1 11 51 651 651 651 651 102 103 BZAAAA BICAAA HHHHxx +4436 1562 0 0 6 16 36 436 436 4436 4436 72 73 QOAAAA CICAAA OOOOxx +4240 1563 0 0 0 0 40 240 240 4240 4240 80 81 CHAAAA DICAAA VVVVxx +2722 1564 0 2 2 2 22 722 722 2722 2722 44 45 SAAAAA EICAAA AAAAxx +8937 1565 1 1 7 17 37 937 937 3937 8937 74 75 TFAAAA FICAAA HHHHxx +8364 1566 0 0 4 4 64 364 364 3364 8364 128 129 SJAAAA GICAAA OOOOxx +8317 1567 1 1 7 17 17 317 317 3317 8317 34 35 XHAAAA HICAAA VVVVxx +8872 1568 0 0 2 12 72 872 872 3872 8872 144 145 GDAAAA IICAAA AAAAxx +5512 1569 0 0 2 12 12 512 1512 512 5512 24 25 AEAAAA JICAAA HHHHxx +6651 1570 1 3 1 11 51 651 651 1651 6651 102 103 VVAAAA KICAAA OOOOxx +5976 1571 0 0 6 16 76 976 1976 976 5976 152 153 WVAAAA LICAAA VVVVxx +3301 1572 1 1 1 1 1 301 1301 3301 3301 2 3 ZWAAAA MICAAA AAAAxx +6784 1573 0 0 4 4 84 784 784 1784 6784 168 169 YAAAAA NICAAA HHHHxx +573 1574 1 1 3 13 73 573 573 573 573 146 147 BWAAAA OICAAA OOOOxx +3015 1575 1 3 5 15 15 15 1015 3015 3015 30 31 ZLAAAA PICAAA VVVVxx +8245 1576 1 1 5 5 45 245 245 3245 8245 90 91 DFAAAA QICAAA AAAAxx +5251 1577 1 3 1 11 51 251 1251 251 5251 102 103 ZTAAAA RICAAA HHHHxx +2281 1578 1 1 1 1 81 281 281 2281 2281 162 163 TJAAAA SICAAA OOOOxx +518 1579 0 2 8 18 18 518 518 518 518 36 37 YTAAAA TICAAA VVVVxx +9839 1580 1 3 9 19 39 839 1839 4839 9839 78 79 LOAAAA UICAAA AAAAxx +4526 1581 0 2 6 6 26 526 526 4526 4526 52 53 CSAAAA VICAAA HHHHxx +1261 1582 1 1 1 1 61 261 1261 1261 1261 122 123 NWAAAA WICAAA OOOOxx +4259 1583 1 3 9 19 59 259 259 4259 4259 118 119 VHAAAA XICAAA VVVVxx +9098 1584 0 2 8 18 98 98 1098 4098 9098 196 197 YLAAAA YICAAA AAAAxx +6037 1585 1 1 7 17 37 37 37 1037 6037 74 75 FYAAAA ZICAAA HHHHxx +4284 1586 0 0 4 4 84 284 284 4284 4284 168 169 UIAAAA AJCAAA OOOOxx +3267 1587 1 3 7 7 67 267 1267 3267 3267 134 135 RVAAAA BJCAAA VVVVxx +5908 1588 0 0 8 8 8 908 1908 908 5908 16 17 GTAAAA CJCAAA AAAAxx +1549 1589 1 1 9 9 49 549 1549 1549 1549 98 99 PHAAAA DJCAAA HHHHxx +8736 1590 0 0 6 16 36 736 736 3736 8736 72 73 AYAAAA EJCAAA OOOOxx +2008 1591 0 0 8 8 8 8 8 2008 2008 16 17 GZAAAA FJCAAA VVVVxx +548 1592 0 0 8 8 48 548 548 548 548 96 97 CVAAAA GJCAAA AAAAxx +8846 1593 0 2 6 6 46 846 846 3846 8846 92 93 GCAAAA HJCAAA HHHHxx +8374 1594 0 2 4 14 74 374 374 3374 8374 148 149 CKAAAA IJCAAA OOOOxx +7986 1595 0 2 6 6 86 986 1986 2986 7986 172 173 EVAAAA JJCAAA VVVVxx +6819 1596 1 3 9 19 19 819 819 1819 6819 38 39 HCAAAA KJCAAA AAAAxx +4418 1597 0 2 8 18 18 418 418 4418 4418 36 37 YNAAAA LJCAAA HHHHxx +833 1598 1 1 3 13 33 833 833 833 833 66 67 BGAAAA MJCAAA OOOOxx +4416 1599 0 0 6 16 16 416 416 4416 4416 32 33 WNAAAA NJCAAA VVVVxx +4902 1600 0 2 2 2 2 902 902 4902 4902 4 5 OGAAAA OJCAAA AAAAxx +6828 1601 0 0 8 8 28 828 828 1828 6828 56 57 QCAAAA PJCAAA HHHHxx +1118 1602 0 2 8 18 18 118 1118 1118 1118 36 37 ARAAAA QJCAAA OOOOxx +9993 1603 1 1 3 13 93 993 1993 4993 9993 186 187 JUAAAA RJCAAA VVVVxx +1430 1604 0 2 0 10 30 430 1430 1430 1430 60 61 ADAAAA SJCAAA AAAAxx +5670 1605 0 2 0 10 70 670 1670 670 5670 140 141 CKAAAA TJCAAA HHHHxx +5424 1606 0 0 4 4 24 424 1424 424 5424 48 49 QAAAAA UJCAAA OOOOxx +5561 1607 1 1 1 1 61 561 1561 561 5561 122 123 XFAAAA VJCAAA VVVVxx +2027 1608 1 3 7 7 27 27 27 2027 2027 54 55 ZZAAAA WJCAAA AAAAxx +6924 1609 0 0 4 4 24 924 924 1924 6924 48 49 IGAAAA XJCAAA HHHHxx +5946 1610 0 2 6 6 46 946 1946 946 5946 92 93 SUAAAA YJCAAA OOOOxx +4294 1611 0 2 4 14 94 294 294 4294 4294 188 189 EJAAAA ZJCAAA VVVVxx +2936 1612 0 0 6 16 36 936 936 2936 2936 72 73 YIAAAA AKCAAA AAAAxx +3855 1613 1 3 5 15 55 855 1855 3855 3855 110 111 HSAAAA BKCAAA HHHHxx +455 1614 1 3 5 15 55 455 455 455 455 110 111 NRAAAA CKCAAA OOOOxx +2918 1615 0 2 8 18 18 918 918 2918 2918 36 37 GIAAAA DKCAAA VVVVxx +448 1616 0 0 8 8 48 448 448 448 448 96 97 GRAAAA EKCAAA AAAAxx +2149 1617 1 1 9 9 49 149 149 2149 2149 98 99 REAAAA FKCAAA HHHHxx +8890 1618 0 2 0 10 90 890 890 3890 8890 180 181 YDAAAA GKCAAA OOOOxx +8919 1619 1 3 9 19 19 919 919 3919 8919 38 39 BFAAAA HKCAAA VVVVxx +4957 1620 1 1 7 17 57 957 957 4957 4957 114 115 RIAAAA IKCAAA AAAAxx +4 1621 0 0 4 4 4 4 4 4 4 8 9 EAAAAA JKCAAA HHHHxx +4837 1622 1 1 7 17 37 837 837 4837 4837 74 75 BEAAAA KKCAAA OOOOxx +3976 1623 0 0 6 16 76 976 1976 3976 3976 152 153 YWAAAA LKCAAA VVVVxx +9459 1624 1 3 9 19 59 459 1459 4459 9459 118 119 VZAAAA MKCAAA AAAAxx +7097 1625 1 1 7 17 97 97 1097 2097 7097 194 195 ZMAAAA NKCAAA HHHHxx +9226 1626 0 2 6 6 26 226 1226 4226 9226 52 53 WQAAAA OKCAAA OOOOxx +5803 1627 1 3 3 3 3 803 1803 803 5803 6 7 FPAAAA PKCAAA VVVVxx +21 1628 1 1 1 1 21 21 21 21 21 42 43 VAAAAA QKCAAA AAAAxx +5275 1629 1 3 5 15 75 275 1275 275 5275 150 151 XUAAAA RKCAAA HHHHxx +3488 1630 0 0 8 8 88 488 1488 3488 3488 176 177 EEAAAA SKCAAA OOOOxx +1595 1631 1 3 5 15 95 595 1595 1595 1595 190 191 JJAAAA TKCAAA VVVVxx +5212 1632 0 0 2 12 12 212 1212 212 5212 24 25 MSAAAA UKCAAA AAAAxx +6574 1633 0 2 4 14 74 574 574 1574 6574 148 149 WSAAAA VKCAAA HHHHxx +7524 1634 0 0 4 4 24 524 1524 2524 7524 48 49 KDAAAA WKCAAA OOOOxx +6100 1635 0 0 0 0 0 100 100 1100 6100 0 1 QAAAAA XKCAAA VVVVxx +1198 1636 0 2 8 18 98 198 1198 1198 1198 196 197 CUAAAA YKCAAA AAAAxx +7345 1637 1 1 5 5 45 345 1345 2345 7345 90 91 NWAAAA ZKCAAA HHHHxx +5020 1638 0 0 0 0 20 20 1020 20 5020 40 41 CLAAAA ALCAAA OOOOxx +6925 1639 1 1 5 5 25 925 925 1925 6925 50 51 JGAAAA BLCAAA VVVVxx +8915 1640 1 3 5 15 15 915 915 3915 8915 30 31 XEAAAA CLCAAA AAAAxx +3088 1641 0 0 8 8 88 88 1088 3088 3088 176 177 UOAAAA DLCAAA HHHHxx +4828 1642 0 0 8 8 28 828 828 4828 4828 56 57 SDAAAA ELCAAA OOOOxx +7276 1643 0 0 6 16 76 276 1276 2276 7276 152 153 WTAAAA FLCAAA VVVVxx +299 1644 1 3 9 19 99 299 299 299 299 198 199 NLAAAA GLCAAA AAAAxx +76 1645 0 0 6 16 76 76 76 76 76 152 153 YCAAAA HLCAAA HHHHxx +8458 1646 0 2 8 18 58 458 458 3458 8458 116 117 INAAAA ILCAAA OOOOxx +7207 1647 1 3 7 7 7 207 1207 2207 7207 14 15 FRAAAA JLCAAA VVVVxx +5585 1648 1 1 5 5 85 585 1585 585 5585 170 171 VGAAAA KLCAAA AAAAxx +3234 1649 0 2 4 14 34 234 1234 3234 3234 68 69 KUAAAA LLCAAA HHHHxx +8001 1650 1 1 1 1 1 1 1 3001 8001 2 3 TVAAAA MLCAAA OOOOxx +1319 1651 1 3 9 19 19 319 1319 1319 1319 38 39 TYAAAA NLCAAA VVVVxx +6342 1652 0 2 2 2 42 342 342 1342 6342 84 85 YJAAAA OLCAAA AAAAxx +9199 1653 1 3 9 19 99 199 1199 4199 9199 198 199 VPAAAA PLCAAA HHHHxx +5696 1654 0 0 6 16 96 696 1696 696 5696 192 193 CLAAAA QLCAAA OOOOxx +2562 1655 0 2 2 2 62 562 562 2562 2562 124 125 OUAAAA RLCAAA VVVVxx +4226 1656 0 2 6 6 26 226 226 4226 4226 52 53 OGAAAA SLCAAA AAAAxx +1184 1657 0 0 4 4 84 184 1184 1184 1184 168 169 OTAAAA TLCAAA HHHHxx +5807 1658 1 3 7 7 7 807 1807 807 5807 14 15 JPAAAA ULCAAA OOOOxx +1890 1659 0 2 0 10 90 890 1890 1890 1890 180 181 SUAAAA VLCAAA VVVVxx +451 1660 1 3 1 11 51 451 451 451 451 102 103 JRAAAA WLCAAA AAAAxx +1049 1661 1 1 9 9 49 49 1049 1049 1049 98 99 JOAAAA XLCAAA HHHHxx +5272 1662 0 0 2 12 72 272 1272 272 5272 144 145 UUAAAA YLCAAA OOOOxx +4588 1663 0 0 8 8 88 588 588 4588 4588 176 177 MUAAAA ZLCAAA VVVVxx +5213 1664 1 1 3 13 13 213 1213 213 5213 26 27 NSAAAA AMCAAA AAAAxx +9543 1665 1 3 3 3 43 543 1543 4543 9543 86 87 BDAAAA BMCAAA HHHHxx +6318 1666 0 2 8 18 18 318 318 1318 6318 36 37 AJAAAA CMCAAA OOOOxx +7992 1667 0 0 2 12 92 992 1992 2992 7992 184 185 KVAAAA DMCAAA VVVVxx +4619 1668 1 3 9 19 19 619 619 4619 4619 38 39 RVAAAA EMCAAA AAAAxx +7189 1669 1 1 9 9 89 189 1189 2189 7189 178 179 NQAAAA FMCAAA HHHHxx +2178 1670 0 2 8 18 78 178 178 2178 2178 156 157 UFAAAA GMCAAA OOOOxx +4928 1671 0 0 8 8 28 928 928 4928 4928 56 57 OHAAAA HMCAAA VVVVxx +3966 1672 0 2 6 6 66 966 1966 3966 3966 132 133 OWAAAA IMCAAA AAAAxx +9790 1673 0 2 0 10 90 790 1790 4790 9790 180 181 OMAAAA JMCAAA HHHHxx +9150 1674 0 2 0 10 50 150 1150 4150 9150 100 101 YNAAAA KMCAAA OOOOxx +313 1675 1 1 3 13 13 313 313 313 313 26 27 BMAAAA LMCAAA VVVVxx +1614 1676 0 2 4 14 14 614 1614 1614 1614 28 29 CKAAAA MMCAAA AAAAxx +1581 1677 1 1 1 1 81 581 1581 1581 1581 162 163 VIAAAA NMCAAA HHHHxx +3674 1678 0 2 4 14 74 674 1674 3674 3674 148 149 ILAAAA OMCAAA OOOOxx +3444 1679 0 0 4 4 44 444 1444 3444 3444 88 89 MCAAAA PMCAAA VVVVxx +1050 1680 0 2 0 10 50 50 1050 1050 1050 100 101 KOAAAA QMCAAA AAAAxx +8241 1681 1 1 1 1 41 241 241 3241 8241 82 83 ZEAAAA RMCAAA HHHHxx +3382 1682 0 2 2 2 82 382 1382 3382 3382 164 165 CAAAAA SMCAAA OOOOxx +7105 1683 1 1 5 5 5 105 1105 2105 7105 10 11 HNAAAA TMCAAA VVVVxx +2957 1684 1 1 7 17 57 957 957 2957 2957 114 115 TJAAAA UMCAAA AAAAxx +6162 1685 0 2 2 2 62 162 162 1162 6162 124 125 ADAAAA VMCAAA HHHHxx +5150 1686 0 2 0 10 50 150 1150 150 5150 100 101 CQAAAA WMCAAA OOOOxx +2622 1687 0 2 2 2 22 622 622 2622 2622 44 45 WWAAAA XMCAAA VVVVxx +2240 1688 0 0 0 0 40 240 240 2240 2240 80 81 EIAAAA YMCAAA AAAAxx +8880 1689 0 0 0 0 80 880 880 3880 8880 160 161 ODAAAA ZMCAAA HHHHxx +9250 1690 0 2 0 10 50 250 1250 4250 9250 100 101 URAAAA ANCAAA OOOOxx +7010 1691 0 2 0 10 10 10 1010 2010 7010 20 21 QJAAAA BNCAAA VVVVxx +1098 1692 0 2 8 18 98 98 1098 1098 1098 196 197 GQAAAA CNCAAA AAAAxx +648 1693 0 0 8 8 48 648 648 648 648 96 97 YYAAAA DNCAAA HHHHxx +5536 1694 0 0 6 16 36 536 1536 536 5536 72 73 YEAAAA ENCAAA OOOOxx +7858 1695 0 2 8 18 58 858 1858 2858 7858 116 117 GQAAAA FNCAAA VVVVxx +7053 1696 1 1 3 13 53 53 1053 2053 7053 106 107 HLAAAA GNCAAA AAAAxx +8681 1697 1 1 1 1 81 681 681 3681 8681 162 163 XVAAAA HNCAAA HHHHxx +8832 1698 0 0 2 12 32 832 832 3832 8832 64 65 SBAAAA INCAAA OOOOxx +6836 1699 0 0 6 16 36 836 836 1836 6836 72 73 YCAAAA JNCAAA VVVVxx +4856 1700 0 0 6 16 56 856 856 4856 4856 112 113 UEAAAA KNCAAA AAAAxx +345 1701 1 1 5 5 45 345 345 345 345 90 91 HNAAAA LNCAAA HHHHxx +6559 1702 1 3 9 19 59 559 559 1559 6559 118 119 HSAAAA MNCAAA OOOOxx +3017 1703 1 1 7 17 17 17 1017 3017 3017 34 35 BMAAAA NNCAAA VVVVxx +4176 1704 0 0 6 16 76 176 176 4176 4176 152 153 QEAAAA ONCAAA AAAAxx +2839 1705 1 3 9 19 39 839 839 2839 2839 78 79 FFAAAA PNCAAA HHHHxx +6065 1706 1 1 5 5 65 65 65 1065 6065 130 131 HZAAAA QNCAAA OOOOxx +7360 1707 0 0 0 0 60 360 1360 2360 7360 120 121 CXAAAA RNCAAA VVVVxx +9527 1708 1 3 7 7 27 527 1527 4527 9527 54 55 LCAAAA SNCAAA AAAAxx +8849 1709 1 1 9 9 49 849 849 3849 8849 98 99 JCAAAA TNCAAA HHHHxx +7274 1710 0 2 4 14 74 274 1274 2274 7274 148 149 UTAAAA UNCAAA OOOOxx +4368 1711 0 0 8 8 68 368 368 4368 4368 136 137 AMAAAA VNCAAA VVVVxx +2488 1712 0 0 8 8 88 488 488 2488 2488 176 177 SRAAAA WNCAAA AAAAxx +4674 1713 0 2 4 14 74 674 674 4674 4674 148 149 UXAAAA XNCAAA HHHHxx +365 1714 1 1 5 5 65 365 365 365 365 130 131 BOAAAA YNCAAA OOOOxx +5897 1715 1 1 7 17 97 897 1897 897 5897 194 195 VSAAAA ZNCAAA VVVVxx +8918 1716 0 2 8 18 18 918 918 3918 8918 36 37 AFAAAA AOCAAA AAAAxx +1988 1717 0 0 8 8 88 988 1988 1988 1988 176 177 MYAAAA BOCAAA HHHHxx +1210 1718 0 2 0 10 10 210 1210 1210 1210 20 21 OUAAAA COCAAA OOOOxx +2945 1719 1 1 5 5 45 945 945 2945 2945 90 91 HJAAAA DOCAAA VVVVxx +555 1720 1 3 5 15 55 555 555 555 555 110 111 JVAAAA EOCAAA AAAAxx +9615 1721 1 3 5 15 15 615 1615 4615 9615 30 31 VFAAAA FOCAAA HHHHxx +9939 1722 1 3 9 19 39 939 1939 4939 9939 78 79 HSAAAA GOCAAA OOOOxx +1216 1723 0 0 6 16 16 216 1216 1216 1216 32 33 UUAAAA HOCAAA VVVVxx +745 1724 1 1 5 5 45 745 745 745 745 90 91 RCAAAA IOCAAA AAAAxx +3326 1725 0 2 6 6 26 326 1326 3326 3326 52 53 YXAAAA JOCAAA HHHHxx +953 1726 1 1 3 13 53 953 953 953 953 106 107 RKAAAA KOCAAA OOOOxx +444 1727 0 0 4 4 44 444 444 444 444 88 89 CRAAAA LOCAAA VVVVxx +280 1728 0 0 0 0 80 280 280 280 280 160 161 UKAAAA MOCAAA AAAAxx +3707 1729 1 3 7 7 7 707 1707 3707 3707 14 15 PMAAAA NOCAAA HHHHxx +1351 1730 1 3 1 11 51 351 1351 1351 1351 102 103 ZZAAAA OOCAAA OOOOxx +1280 1731 0 0 0 0 80 280 1280 1280 1280 160 161 GXAAAA POCAAA VVVVxx +628 1732 0 0 8 8 28 628 628 628 628 56 57 EYAAAA QOCAAA AAAAxx +6198 1733 0 2 8 18 98 198 198 1198 6198 196 197 KEAAAA ROCAAA HHHHxx +1957 1734 1 1 7 17 57 957 1957 1957 1957 114 115 HXAAAA SOCAAA OOOOxx +9241 1735 1 1 1 1 41 241 1241 4241 9241 82 83 LRAAAA TOCAAA VVVVxx +303 1736 1 3 3 3 3 303 303 303 303 6 7 RLAAAA UOCAAA AAAAxx +1945 1737 1 1 5 5 45 945 1945 1945 1945 90 91 VWAAAA VOCAAA HHHHxx +3634 1738 0 2 4 14 34 634 1634 3634 3634 68 69 UJAAAA WOCAAA OOOOxx +4768 1739 0 0 8 8 68 768 768 4768 4768 136 137 KBAAAA XOCAAA VVVVxx +9262 1740 0 2 2 2 62 262 1262 4262 9262 124 125 GSAAAA YOCAAA AAAAxx +2610 1741 0 2 0 10 10 610 610 2610 2610 20 21 KWAAAA ZOCAAA HHHHxx +6640 1742 0 0 0 0 40 640 640 1640 6640 80 81 KVAAAA APCAAA OOOOxx +3338 1743 0 2 8 18 38 338 1338 3338 3338 76 77 KYAAAA BPCAAA VVVVxx +6560 1744 0 0 0 0 60 560 560 1560 6560 120 121 ISAAAA CPCAAA AAAAxx +5986 1745 0 2 6 6 86 986 1986 986 5986 172 173 GWAAAA DPCAAA HHHHxx +2970 1746 0 2 0 10 70 970 970 2970 2970 140 141 GKAAAA EPCAAA OOOOxx +4731 1747 1 3 1 11 31 731 731 4731 4731 62 63 ZZAAAA FPCAAA VVVVxx +9486 1748 0 2 6 6 86 486 1486 4486 9486 172 173 WAAAAA GPCAAA AAAAxx +7204 1749 0 0 4 4 4 204 1204 2204 7204 8 9 CRAAAA HPCAAA HHHHxx +6685 1750 1 1 5 5 85 685 685 1685 6685 170 171 DXAAAA IPCAAA OOOOxx +6852 1751 0 0 2 12 52 852 852 1852 6852 104 105 ODAAAA JPCAAA VVVVxx +2325 1752 1 1 5 5 25 325 325 2325 2325 50 51 LLAAAA KPCAAA AAAAxx +1063 1753 1 3 3 3 63 63 1063 1063 1063 126 127 XOAAAA LPCAAA HHHHxx +6810 1754 0 2 0 10 10 810 810 1810 6810 20 21 YBAAAA MPCAAA OOOOxx +7718 1755 0 2 8 18 18 718 1718 2718 7718 36 37 WKAAAA NPCAAA VVVVxx +1680 1756 0 0 0 0 80 680 1680 1680 1680 160 161 QMAAAA OPCAAA AAAAxx +7402 1757 0 2 2 2 2 402 1402 2402 7402 4 5 SYAAAA PPCAAA HHHHxx +4134 1758 0 2 4 14 34 134 134 4134 4134 68 69 ADAAAA QPCAAA OOOOxx +8232 1759 0 0 2 12 32 232 232 3232 8232 64 65 QEAAAA RPCAAA VVVVxx +6682 1760 0 2 2 2 82 682 682 1682 6682 164 165 AXAAAA SPCAAA AAAAxx +7952 1761 0 0 2 12 52 952 1952 2952 7952 104 105 WTAAAA TPCAAA HHHHxx +5943 1762 1 3 3 3 43 943 1943 943 5943 86 87 PUAAAA UPCAAA OOOOxx +5394 1763 0 2 4 14 94 394 1394 394 5394 188 189 MZAAAA VPCAAA VVVVxx +6554 1764 0 2 4 14 54 554 554 1554 6554 108 109 CSAAAA WPCAAA AAAAxx +8186 1765 0 2 6 6 86 186 186 3186 8186 172 173 WCAAAA XPCAAA HHHHxx +199 1766 1 3 9 19 99 199 199 199 199 198 199 RHAAAA YPCAAA OOOOxx +3386 1767 0 2 6 6 86 386 1386 3386 3386 172 173 GAAAAA ZPCAAA VVVVxx +8974 1768 0 2 4 14 74 974 974 3974 8974 148 149 EHAAAA AQCAAA AAAAxx +8140 1769 0 0 0 0 40 140 140 3140 8140 80 81 CBAAAA BQCAAA HHHHxx +3723 1770 1 3 3 3 23 723 1723 3723 3723 46 47 FNAAAA CQCAAA OOOOxx +8827 1771 1 3 7 7 27 827 827 3827 8827 54 55 NBAAAA DQCAAA VVVVxx +1998 1772 0 2 8 18 98 998 1998 1998 1998 196 197 WYAAAA EQCAAA AAAAxx +879 1773 1 3 9 19 79 879 879 879 879 158 159 VHAAAA FQCAAA HHHHxx +892 1774 0 0 2 12 92 892 892 892 892 184 185 IIAAAA GQCAAA OOOOxx +9468 1775 0 0 8 8 68 468 1468 4468 9468 136 137 EAAAAA HQCAAA VVVVxx +3797 1776 1 1 7 17 97 797 1797 3797 3797 194 195 BQAAAA IQCAAA AAAAxx +8379 1777 1 3 9 19 79 379 379 3379 8379 158 159 HKAAAA JQCAAA HHHHxx +2817 1778 1 1 7 17 17 817 817 2817 2817 34 35 JEAAAA KQCAAA OOOOxx +789 1779 1 1 9 9 89 789 789 789 789 178 179 JEAAAA LQCAAA VVVVxx +3871 1780 1 3 1 11 71 871 1871 3871 3871 142 143 XSAAAA MQCAAA AAAAxx +7931 1781 1 3 1 11 31 931 1931 2931 7931 62 63 BTAAAA NQCAAA HHHHxx +3636 1782 0 0 6 16 36 636 1636 3636 3636 72 73 WJAAAA OQCAAA OOOOxx +699 1783 1 3 9 19 99 699 699 699 699 198 199 XAAAAA PQCAAA VVVVxx +6850 1784 0 2 0 10 50 850 850 1850 6850 100 101 MDAAAA QQCAAA AAAAxx +6394 1785 0 2 4 14 94 394 394 1394 6394 188 189 YLAAAA RQCAAA HHHHxx +3475 1786 1 3 5 15 75 475 1475 3475 3475 150 151 RDAAAA SQCAAA OOOOxx +3026 1787 0 2 6 6 26 26 1026 3026 3026 52 53 KMAAAA TQCAAA VVVVxx +876 1788 0 0 6 16 76 876 876 876 876 152 153 SHAAAA UQCAAA AAAAxx +1992 1789 0 0 2 12 92 992 1992 1992 1992 184 185 QYAAAA VQCAAA HHHHxx +3079 1790 1 3 9 19 79 79 1079 3079 3079 158 159 LOAAAA WQCAAA OOOOxx +8128 1791 0 0 8 8 28 128 128 3128 8128 56 57 QAAAAA XQCAAA VVVVxx +8123 1792 1 3 3 3 23 123 123 3123 8123 46 47 LAAAAA YQCAAA AAAAxx +3285 1793 1 1 5 5 85 285 1285 3285 3285 170 171 JWAAAA ZQCAAA HHHHxx +9315 1794 1 3 5 15 15 315 1315 4315 9315 30 31 HUAAAA ARCAAA OOOOxx +9862 1795 0 2 2 2 62 862 1862 4862 9862 124 125 IPAAAA BRCAAA VVVVxx +2764 1796 0 0 4 4 64 764 764 2764 2764 128 129 ICAAAA CRCAAA AAAAxx +3544 1797 0 0 4 4 44 544 1544 3544 3544 88 89 IGAAAA DRCAAA HHHHxx +7747 1798 1 3 7 7 47 747 1747 2747 7747 94 95 ZLAAAA ERCAAA OOOOxx +7725 1799 1 1 5 5 25 725 1725 2725 7725 50 51 DLAAAA FRCAAA VVVVxx +2449 1800 1 1 9 9 49 449 449 2449 2449 98 99 FQAAAA GRCAAA AAAAxx +8967 1801 1 3 7 7 67 967 967 3967 8967 134 135 XGAAAA HRCAAA HHHHxx +7371 1802 1 3 1 11 71 371 1371 2371 7371 142 143 NXAAAA IRCAAA OOOOxx +2158 1803 0 2 8 18 58 158 158 2158 2158 116 117 AFAAAA JRCAAA VVVVxx +5590 1804 0 2 0 10 90 590 1590 590 5590 180 181 AHAAAA KRCAAA AAAAxx +8072 1805 0 0 2 12 72 72 72 3072 8072 144 145 MYAAAA LRCAAA HHHHxx +1971 1806 1 3 1 11 71 971 1971 1971 1971 142 143 VXAAAA MRCAAA OOOOxx +772 1807 0 0 2 12 72 772 772 772 772 144 145 SDAAAA NRCAAA VVVVxx +3433 1808 1 1 3 13 33 433 1433 3433 3433 66 67 BCAAAA ORCAAA AAAAxx +8419 1809 1 3 9 19 19 419 419 3419 8419 38 39 VLAAAA PRCAAA HHHHxx +1493 1810 1 1 3 13 93 493 1493 1493 1493 186 187 LFAAAA QRCAAA OOOOxx +2584 1811 0 0 4 4 84 584 584 2584 2584 168 169 KVAAAA RRCAAA VVVVxx +9502 1812 0 2 2 2 2 502 1502 4502 9502 4 5 MBAAAA SRCAAA AAAAxx +4673 1813 1 1 3 13 73 673 673 4673 4673 146 147 TXAAAA TRCAAA HHHHxx +7403 1814 1 3 3 3 3 403 1403 2403 7403 6 7 TYAAAA URCAAA OOOOxx +7103 1815 1 3 3 3 3 103 1103 2103 7103 6 7 FNAAAA VRCAAA VVVVxx +7026 1816 0 2 6 6 26 26 1026 2026 7026 52 53 GKAAAA WRCAAA AAAAxx +8574 1817 0 2 4 14 74 574 574 3574 8574 148 149 URAAAA XRCAAA HHHHxx +1366 1818 0 2 6 6 66 366 1366 1366 1366 132 133 OAAAAA YRCAAA OOOOxx +5787 1819 1 3 7 7 87 787 1787 787 5787 174 175 POAAAA ZRCAAA VVVVxx +2552 1820 0 0 2 12 52 552 552 2552 2552 104 105 EUAAAA ASCAAA AAAAxx +4557 1821 1 1 7 17 57 557 557 4557 4557 114 115 HTAAAA BSCAAA HHHHxx +3237 1822 1 1 7 17 37 237 1237 3237 3237 74 75 NUAAAA CSCAAA OOOOxx +6901 1823 1 1 1 1 1 901 901 1901 6901 2 3 LFAAAA DSCAAA VVVVxx +7708 1824 0 0 8 8 8 708 1708 2708 7708 16 17 MKAAAA ESCAAA AAAAxx +2011 1825 1 3 1 11 11 11 11 2011 2011 22 23 JZAAAA FSCAAA HHHHxx +9455 1826 1 3 5 15 55 455 1455 4455 9455 110 111 RZAAAA GSCAAA OOOOxx +5228 1827 0 0 8 8 28 228 1228 228 5228 56 57 CTAAAA HSCAAA VVVVxx +4043 1828 1 3 3 3 43 43 43 4043 4043 86 87 NZAAAA ISCAAA AAAAxx +8242 1829 0 2 2 2 42 242 242 3242 8242 84 85 AFAAAA JSCAAA HHHHxx +6351 1830 1 3 1 11 51 351 351 1351 6351 102 103 HKAAAA KSCAAA OOOOxx +5899 1831 1 3 9 19 99 899 1899 899 5899 198 199 XSAAAA LSCAAA VVVVxx +4849 1832 1 1 9 9 49 849 849 4849 4849 98 99 NEAAAA MSCAAA AAAAxx +9583 1833 1 3 3 3 83 583 1583 4583 9583 166 167 PEAAAA NSCAAA HHHHxx +4994 1834 0 2 4 14 94 994 994 4994 4994 188 189 CKAAAA OSCAAA OOOOxx +9787 1835 1 3 7 7 87 787 1787 4787 9787 174 175 LMAAAA PSCAAA VVVVxx +243 1836 1 3 3 3 43 243 243 243 243 86 87 JJAAAA QSCAAA AAAAxx +3931 1837 1 3 1 11 31 931 1931 3931 3931 62 63 FVAAAA RSCAAA HHHHxx +5945 1838 1 1 5 5 45 945 1945 945 5945 90 91 RUAAAA SSCAAA OOOOxx +1325 1839 1 1 5 5 25 325 1325 1325 1325 50 51 ZYAAAA TSCAAA VVVVxx +4142 1840 0 2 2 2 42 142 142 4142 4142 84 85 IDAAAA USCAAA AAAAxx +1963 1841 1 3 3 3 63 963 1963 1963 1963 126 127 NXAAAA VSCAAA HHHHxx +7041 1842 1 1 1 1 41 41 1041 2041 7041 82 83 VKAAAA WSCAAA OOOOxx +3074 1843 0 2 4 14 74 74 1074 3074 3074 148 149 GOAAAA XSCAAA VVVVxx +3290 1844 0 2 0 10 90 290 1290 3290 3290 180 181 OWAAAA YSCAAA AAAAxx +4146 1845 0 2 6 6 46 146 146 4146 4146 92 93 MDAAAA ZSCAAA HHHHxx +3832 1846 0 0 2 12 32 832 1832 3832 3832 64 65 KRAAAA ATCAAA OOOOxx +2217 1847 1 1 7 17 17 217 217 2217 2217 34 35 HHAAAA BTCAAA VVVVxx +635 1848 1 3 5 15 35 635 635 635 635 70 71 LYAAAA CTCAAA AAAAxx +6967 1849 1 3 7 7 67 967 967 1967 6967 134 135 ZHAAAA DTCAAA HHHHxx +3522 1850 0 2 2 2 22 522 1522 3522 3522 44 45 MFAAAA ETCAAA OOOOxx +2471 1851 1 3 1 11 71 471 471 2471 2471 142 143 BRAAAA FTCAAA VVVVxx +4236 1852 0 0 6 16 36 236 236 4236 4236 72 73 YGAAAA GTCAAA AAAAxx +853 1853 1 1 3 13 53 853 853 853 853 106 107 VGAAAA HTCAAA HHHHxx +3754 1854 0 2 4 14 54 754 1754 3754 3754 108 109 KOAAAA ITCAAA OOOOxx +796 1855 0 0 6 16 96 796 796 796 796 192 193 QEAAAA JTCAAA VVVVxx +4640 1856 0 0 0 0 40 640 640 4640 4640 80 81 MWAAAA KTCAAA AAAAxx +9496 1857 0 0 6 16 96 496 1496 4496 9496 192 193 GBAAAA LTCAAA HHHHxx +6873 1858 1 1 3 13 73 873 873 1873 6873 146 147 JEAAAA MTCAAA OOOOxx +4632 1859 0 0 2 12 32 632 632 4632 4632 64 65 EWAAAA NTCAAA VVVVxx +5758 1860 0 2 8 18 58 758 1758 758 5758 116 117 MNAAAA OTCAAA AAAAxx +6514 1861 0 2 4 14 14 514 514 1514 6514 28 29 OQAAAA PTCAAA HHHHxx +9510 1862 0 2 0 10 10 510 1510 4510 9510 20 21 UBAAAA QTCAAA OOOOxx +8411 1863 1 3 1 11 11 411 411 3411 8411 22 23 NLAAAA RTCAAA VVVVxx +7762 1864 0 2 2 2 62 762 1762 2762 7762 124 125 OMAAAA STCAAA AAAAxx +2225 1865 1 1 5 5 25 225 225 2225 2225 50 51 PHAAAA TTCAAA HHHHxx +4373 1866 1 1 3 13 73 373 373 4373 4373 146 147 FMAAAA UTCAAA OOOOxx +7326 1867 0 2 6 6 26 326 1326 2326 7326 52 53 UVAAAA VTCAAA VVVVxx +8651 1868 1 3 1 11 51 651 651 3651 8651 102 103 TUAAAA WTCAAA AAAAxx +9825 1869 1 1 5 5 25 825 1825 4825 9825 50 51 XNAAAA XTCAAA HHHHxx +2988 1870 0 0 8 8 88 988 988 2988 2988 176 177 YKAAAA YTCAAA OOOOxx +8138 1871 0 2 8 18 38 138 138 3138 8138 76 77 ABAAAA ZTCAAA VVVVxx +7792 1872 0 0 2 12 92 792 1792 2792 7792 184 185 SNAAAA AUCAAA AAAAxx +1232 1873 0 0 2 12 32 232 1232 1232 1232 64 65 KVAAAA BUCAAA HHHHxx +8221 1874 1 1 1 1 21 221 221 3221 8221 42 43 FEAAAA CUCAAA OOOOxx +4044 1875 0 0 4 4 44 44 44 4044 4044 88 89 OZAAAA DUCAAA VVVVxx +1204 1876 0 0 4 4 4 204 1204 1204 1204 8 9 IUAAAA EUCAAA AAAAxx +5145 1877 1 1 5 5 45 145 1145 145 5145 90 91 XPAAAA FUCAAA HHHHxx +7791 1878 1 3 1 11 91 791 1791 2791 7791 182 183 RNAAAA GUCAAA OOOOxx +8270 1879 0 2 0 10 70 270 270 3270 8270 140 141 CGAAAA HUCAAA VVVVxx +9427 1880 1 3 7 7 27 427 1427 4427 9427 54 55 PYAAAA IUCAAA AAAAxx +2152 1881 0 0 2 12 52 152 152 2152 2152 104 105 UEAAAA JUCAAA HHHHxx +7790 1882 0 2 0 10 90 790 1790 2790 7790 180 181 QNAAAA KUCAAA OOOOxx +5301 1883 1 1 1 1 1 301 1301 301 5301 2 3 XVAAAA LUCAAA VVVVxx +626 1884 0 2 6 6 26 626 626 626 626 52 53 CYAAAA MUCAAA AAAAxx +260 1885 0 0 0 0 60 260 260 260 260 120 121 AKAAAA NUCAAA HHHHxx +4369 1886 1 1 9 9 69 369 369 4369 4369 138 139 BMAAAA OUCAAA OOOOxx +5457 1887 1 1 7 17 57 457 1457 457 5457 114 115 XBAAAA PUCAAA VVVVxx +3468 1888 0 0 8 8 68 468 1468 3468 3468 136 137 KDAAAA QUCAAA AAAAxx +2257 1889 1 1 7 17 57 257 257 2257 2257 114 115 VIAAAA RUCAAA HHHHxx +9318 1890 0 2 8 18 18 318 1318 4318 9318 36 37 KUAAAA SUCAAA OOOOxx +8762 1891 0 2 2 2 62 762 762 3762 8762 124 125 AZAAAA TUCAAA VVVVxx +9153 1892 1 1 3 13 53 153 1153 4153 9153 106 107 BOAAAA UUCAAA AAAAxx +9220 1893 0 0 0 0 20 220 1220 4220 9220 40 41 QQAAAA VUCAAA HHHHxx +8003 1894 1 3 3 3 3 3 3 3003 8003 6 7 VVAAAA WUCAAA OOOOxx +7257 1895 1 1 7 17 57 257 1257 2257 7257 114 115 DTAAAA XUCAAA VVVVxx +3930 1896 0 2 0 10 30 930 1930 3930 3930 60 61 EVAAAA YUCAAA AAAAxx +2976 1897 0 0 6 16 76 976 976 2976 2976 152 153 MKAAAA ZUCAAA HHHHxx +2531 1898 1 3 1 11 31 531 531 2531 2531 62 63 JTAAAA AVCAAA OOOOxx +2250 1899 0 2 0 10 50 250 250 2250 2250 100 101 OIAAAA BVCAAA VVVVxx +8549 1900 1 1 9 9 49 549 549 3549 8549 98 99 VQAAAA CVCAAA AAAAxx +7197 1901 1 1 7 17 97 197 1197 2197 7197 194 195 VQAAAA DVCAAA HHHHxx +5916 1902 0 0 6 16 16 916 1916 916 5916 32 33 OTAAAA EVCAAA OOOOxx +5287 1903 1 3 7 7 87 287 1287 287 5287 174 175 JVAAAA FVCAAA VVVVxx +9095 1904 1 3 5 15 95 95 1095 4095 9095 190 191 VLAAAA GVCAAA AAAAxx +7137 1905 1 1 7 17 37 137 1137 2137 7137 74 75 NOAAAA HVCAAA HHHHxx +7902 1906 0 2 2 2 2 902 1902 2902 7902 4 5 YRAAAA IVCAAA OOOOxx +7598 1907 0 2 8 18 98 598 1598 2598 7598 196 197 GGAAAA JVCAAA VVVVxx +5652 1908 0 0 2 12 52 652 1652 652 5652 104 105 KJAAAA KVCAAA AAAAxx +2017 1909 1 1 7 17 17 17 17 2017 2017 34 35 PZAAAA LVCAAA HHHHxx +7255 1910 1 3 5 15 55 255 1255 2255 7255 110 111 BTAAAA MVCAAA OOOOxx +7999 1911 1 3 9 19 99 999 1999 2999 7999 198 199 RVAAAA NVCAAA VVVVxx +5388 1912 0 0 8 8 88 388 1388 388 5388 176 177 GZAAAA OVCAAA AAAAxx +8754 1913 0 2 4 14 54 754 754 3754 8754 108 109 SYAAAA PVCAAA HHHHxx +5415 1914 1 3 5 15 15 415 1415 415 5415 30 31 HAAAAA QVCAAA OOOOxx +8861 1915 1 1 1 1 61 861 861 3861 8861 122 123 VCAAAA RVCAAA VVVVxx +2874 1916 0 2 4 14 74 874 874 2874 2874 148 149 OGAAAA SVCAAA AAAAxx +9910 1917 0 2 0 10 10 910 1910 4910 9910 20 21 ERAAAA TVCAAA HHHHxx +5178 1918 0 2 8 18 78 178 1178 178 5178 156 157 ERAAAA UVCAAA OOOOxx +5698 1919 0 2 8 18 98 698 1698 698 5698 196 197 ELAAAA VVCAAA VVVVxx +8500 1920 0 0 0 0 0 500 500 3500 8500 0 1 YOAAAA WVCAAA AAAAxx +1814 1921 0 2 4 14 14 814 1814 1814 1814 28 29 URAAAA XVCAAA HHHHxx +4968 1922 0 0 8 8 68 968 968 4968 4968 136 137 CJAAAA YVCAAA OOOOxx +2642 1923 0 2 2 2 42 642 642 2642 2642 84 85 QXAAAA ZVCAAA VVVVxx +1578 1924 0 2 8 18 78 578 1578 1578 1578 156 157 SIAAAA AWCAAA AAAAxx +4774 1925 0 2 4 14 74 774 774 4774 4774 148 149 QBAAAA BWCAAA HHHHxx +7062 1926 0 2 2 2 62 62 1062 2062 7062 124 125 QLAAAA CWCAAA OOOOxx +5381 1927 1 1 1 1 81 381 1381 381 5381 162 163 ZYAAAA DWCAAA VVVVxx +7985 1928 1 1 5 5 85 985 1985 2985 7985 170 171 DVAAAA EWCAAA AAAAxx +3850 1929 0 2 0 10 50 850 1850 3850 3850 100 101 CSAAAA FWCAAA HHHHxx +5624 1930 0 0 4 4 24 624 1624 624 5624 48 49 IIAAAA GWCAAA OOOOxx +8948 1931 0 0 8 8 48 948 948 3948 8948 96 97 EGAAAA HWCAAA VVVVxx +995 1932 1 3 5 15 95 995 995 995 995 190 191 HMAAAA IWCAAA AAAAxx +5058 1933 0 2 8 18 58 58 1058 58 5058 116 117 OMAAAA JWCAAA HHHHxx +9670 1934 0 2 0 10 70 670 1670 4670 9670 140 141 YHAAAA KWCAAA OOOOxx +3115 1935 1 3 5 15 15 115 1115 3115 3115 30 31 VPAAAA LWCAAA VVVVxx +4935 1936 1 3 5 15 35 935 935 4935 4935 70 71 VHAAAA MWCAAA AAAAxx +4735 1937 1 3 5 15 35 735 735 4735 4735 70 71 DAAAAA NWCAAA HHHHxx +1348 1938 0 0 8 8 48 348 1348 1348 1348 96 97 WZAAAA OWCAAA OOOOxx +2380 1939 0 0 0 0 80 380 380 2380 2380 160 161 ONAAAA PWCAAA VVVVxx +4246 1940 0 2 6 6 46 246 246 4246 4246 92 93 IHAAAA QWCAAA AAAAxx +522 1941 0 2 2 2 22 522 522 522 522 44 45 CUAAAA RWCAAA HHHHxx +1701 1942 1 1 1 1 1 701 1701 1701 1701 2 3 LNAAAA SWCAAA OOOOxx +9709 1943 1 1 9 9 9 709 1709 4709 9709 18 19 LJAAAA TWCAAA VVVVxx +8829 1944 1 1 9 9 29 829 829 3829 8829 58 59 PBAAAA UWCAAA AAAAxx +7936 1945 0 0 6 16 36 936 1936 2936 7936 72 73 GTAAAA VWCAAA HHHHxx +8474 1946 0 2 4 14 74 474 474 3474 8474 148 149 YNAAAA WWCAAA OOOOxx +4676 1947 0 0 6 16 76 676 676 4676 4676 152 153 WXAAAA XWCAAA VVVVxx +6303 1948 1 3 3 3 3 303 303 1303 6303 6 7 LIAAAA YWCAAA AAAAxx +3485 1949 1 1 5 5 85 485 1485 3485 3485 170 171 BEAAAA ZWCAAA HHHHxx +2695 1950 1 3 5 15 95 695 695 2695 2695 190 191 RZAAAA AXCAAA OOOOxx +8830 1951 0 2 0 10 30 830 830 3830 8830 60 61 QBAAAA BXCAAA VVVVxx +898 1952 0 2 8 18 98 898 898 898 898 196 197 OIAAAA CXCAAA AAAAxx +7268 1953 0 0 8 8 68 268 1268 2268 7268 136 137 OTAAAA DXCAAA HHHHxx +6568 1954 0 0 8 8 68 568 568 1568 6568 136 137 QSAAAA EXCAAA OOOOxx +9724 1955 0 0 4 4 24 724 1724 4724 9724 48 49 AKAAAA FXCAAA VVVVxx +3329 1956 1 1 9 9 29 329 1329 3329 3329 58 59 BYAAAA GXCAAA AAAAxx +9860 1957 0 0 0 0 60 860 1860 4860 9860 120 121 GPAAAA HXCAAA HHHHxx +6833 1958 1 1 3 13 33 833 833 1833 6833 66 67 VCAAAA IXCAAA OOOOxx +5956 1959 0 0 6 16 56 956 1956 956 5956 112 113 CVAAAA JXCAAA VVVVxx +3963 1960 1 3 3 3 63 963 1963 3963 3963 126 127 LWAAAA KXCAAA AAAAxx +883 1961 1 3 3 3 83 883 883 883 883 166 167 ZHAAAA LXCAAA HHHHxx +2761 1962 1 1 1 1 61 761 761 2761 2761 122 123 FCAAAA MXCAAA OOOOxx +4644 1963 0 0 4 4 44 644 644 4644 4644 88 89 QWAAAA NXCAAA VVVVxx +1358 1964 0 2 8 18 58 358 1358 1358 1358 116 117 GAAAAA OXCAAA AAAAxx +2049 1965 1 1 9 9 49 49 49 2049 2049 98 99 VAAAAA PXCAAA HHHHxx +2193 1966 1 1 3 13 93 193 193 2193 2193 186 187 JGAAAA QXCAAA OOOOxx +9435 1967 1 3 5 15 35 435 1435 4435 9435 70 71 XYAAAA RXCAAA VVVVxx +5890 1968 0 2 0 10 90 890 1890 890 5890 180 181 OSAAAA SXCAAA AAAAxx +8149 1969 1 1 9 9 49 149 149 3149 8149 98 99 LBAAAA TXCAAA HHHHxx +423 1970 1 3 3 3 23 423 423 423 423 46 47 HQAAAA UXCAAA OOOOxx +7980 1971 0 0 0 0 80 980 1980 2980 7980 160 161 YUAAAA VXCAAA VVVVxx +9019 1972 1 3 9 19 19 19 1019 4019 9019 38 39 XIAAAA WXCAAA AAAAxx +1647 1973 1 3 7 7 47 647 1647 1647 1647 94 95 JLAAAA XXCAAA HHHHxx +9495 1974 1 3 5 15 95 495 1495 4495 9495 190 191 FBAAAA YXCAAA OOOOxx +3904 1975 0 0 4 4 4 904 1904 3904 3904 8 9 EUAAAA ZXCAAA VVVVxx +5838 1976 0 2 8 18 38 838 1838 838 5838 76 77 OQAAAA AYCAAA AAAAxx +3866 1977 0 2 6 6 66 866 1866 3866 3866 132 133 SSAAAA BYCAAA HHHHxx +3093 1978 1 1 3 13 93 93 1093 3093 3093 186 187 ZOAAAA CYCAAA OOOOxx +9666 1979 0 2 6 6 66 666 1666 4666 9666 132 133 UHAAAA DYCAAA VVVVxx +1246 1980 0 2 6 6 46 246 1246 1246 1246 92 93 YVAAAA EYCAAA AAAAxx +9759 1981 1 3 9 19 59 759 1759 4759 9759 118 119 JLAAAA FYCAAA HHHHxx +7174 1982 0 2 4 14 74 174 1174 2174 7174 148 149 YPAAAA GYCAAA OOOOxx +7678 1983 0 2 8 18 78 678 1678 2678 7678 156 157 IJAAAA HYCAAA VVVVxx +3004 1984 0 0 4 4 4 4 1004 3004 3004 8 9 OLAAAA IYCAAA AAAAxx +5607 1985 1 3 7 7 7 607 1607 607 5607 14 15 RHAAAA JYCAAA HHHHxx +8510 1986 0 2 0 10 10 510 510 3510 8510 20 21 IPAAAA KYCAAA OOOOxx +1483 1987 1 3 3 3 83 483 1483 1483 1483 166 167 BFAAAA LYCAAA VVVVxx +2915 1988 1 3 5 15 15 915 915 2915 2915 30 31 DIAAAA MYCAAA AAAAxx +1548 1989 0 0 8 8 48 548 1548 1548 1548 96 97 OHAAAA NYCAAA HHHHxx +5767 1990 1 3 7 7 67 767 1767 767 5767 134 135 VNAAAA OYCAAA OOOOxx +3214 1991 0 2 4 14 14 214 1214 3214 3214 28 29 QTAAAA PYCAAA VVVVxx +8663 1992 1 3 3 3 63 663 663 3663 8663 126 127 FVAAAA QYCAAA AAAAxx +5425 1993 1 1 5 5 25 425 1425 425 5425 50 51 RAAAAA RYCAAA HHHHxx +8530 1994 0 2 0 10 30 530 530 3530 8530 60 61 CQAAAA SYCAAA OOOOxx +821 1995 1 1 1 1 21 821 821 821 821 42 43 PFAAAA TYCAAA VVVVxx +8816 1996 0 0 6 16 16 816 816 3816 8816 32 33 CBAAAA UYCAAA AAAAxx +9367 1997 1 3 7 7 67 367 1367 4367 9367 134 135 HWAAAA VYCAAA HHHHxx +4138 1998 0 2 8 18 38 138 138 4138 4138 76 77 EDAAAA WYCAAA OOOOxx +94 1999 0 2 4 14 94 94 94 94 94 188 189 QDAAAA XYCAAA VVVVxx +1858 2000 0 2 8 18 58 858 1858 1858 1858 116 117 MTAAAA YYCAAA AAAAxx +5513 2001 1 1 3 13 13 513 1513 513 5513 26 27 BEAAAA ZYCAAA HHHHxx +9620 2002 0 0 0 0 20 620 1620 4620 9620 40 41 AGAAAA AZCAAA OOOOxx +4770 2003 0 2 0 10 70 770 770 4770 4770 140 141 MBAAAA BZCAAA VVVVxx +5193 2004 1 1 3 13 93 193 1193 193 5193 186 187 TRAAAA CZCAAA AAAAxx +198 2005 0 2 8 18 98 198 198 198 198 196 197 QHAAAA DZCAAA HHHHxx +417 2006 1 1 7 17 17 417 417 417 417 34 35 BQAAAA EZCAAA OOOOxx +173 2007 1 1 3 13 73 173 173 173 173 146 147 RGAAAA FZCAAA VVVVxx +6248 2008 0 0 8 8 48 248 248 1248 6248 96 97 IGAAAA GZCAAA AAAAxx +302 2009 0 2 2 2 2 302 302 302 302 4 5 QLAAAA HZCAAA HHHHxx +8983 2010 1 3 3 3 83 983 983 3983 8983 166 167 NHAAAA IZCAAA OOOOxx +4840 2011 0 0 0 0 40 840 840 4840 4840 80 81 EEAAAA JZCAAA VVVVxx +2876 2012 0 0 6 16 76 876 876 2876 2876 152 153 QGAAAA KZCAAA AAAAxx +5841 2013 1 1 1 1 41 841 1841 841 5841 82 83 RQAAAA LZCAAA HHHHxx +2766 2014 0 2 6 6 66 766 766 2766 2766 132 133 KCAAAA MZCAAA OOOOxx +9482 2015 0 2 2 2 82 482 1482 4482 9482 164 165 SAAAAA NZCAAA VVVVxx +5335 2016 1 3 5 15 35 335 1335 335 5335 70 71 FXAAAA OZCAAA AAAAxx +1502 2017 0 2 2 2 2 502 1502 1502 1502 4 5 UFAAAA PZCAAA HHHHxx +9291 2018 1 3 1 11 91 291 1291 4291 9291 182 183 JTAAAA QZCAAA OOOOxx +8655 2019 1 3 5 15 55 655 655 3655 8655 110 111 XUAAAA RZCAAA VVVVxx +1687 2020 1 3 7 7 87 687 1687 1687 1687 174 175 XMAAAA SZCAAA AAAAxx +8171 2021 1 3 1 11 71 171 171 3171 8171 142 143 HCAAAA TZCAAA HHHHxx +5699 2022 1 3 9 19 99 699 1699 699 5699 198 199 FLAAAA UZCAAA OOOOxx +1462 2023 0 2 2 2 62 462 1462 1462 1462 124 125 GEAAAA VZCAAA VVVVxx +608 2024 0 0 8 8 8 608 608 608 608 16 17 KXAAAA WZCAAA AAAAxx +6860 2025 0 0 0 0 60 860 860 1860 6860 120 121 WDAAAA XZCAAA HHHHxx +6063 2026 1 3 3 3 63 63 63 1063 6063 126 127 FZAAAA YZCAAA OOOOxx +1422 2027 0 2 2 2 22 422 1422 1422 1422 44 45 SCAAAA ZZCAAA VVVVxx +1932 2028 0 0 2 12 32 932 1932 1932 1932 64 65 IWAAAA AADAAA AAAAxx +5065 2029 1 1 5 5 65 65 1065 65 5065 130 131 VMAAAA BADAAA HHHHxx +432 2030 0 0 2 12 32 432 432 432 432 64 65 QQAAAA CADAAA OOOOxx +4680 2031 0 0 0 0 80 680 680 4680 4680 160 161 AYAAAA DADAAA VVVVxx +8172 2032 0 0 2 12 72 172 172 3172 8172 144 145 ICAAAA EADAAA AAAAxx +8668 2033 0 0 8 8 68 668 668 3668 8668 136 137 KVAAAA FADAAA HHHHxx +256 2034 0 0 6 16 56 256 256 256 256 112 113 WJAAAA GADAAA OOOOxx +2500 2035 0 0 0 0 0 500 500 2500 2500 0 1 ESAAAA HADAAA VVVVxx +274 2036 0 2 4 14 74 274 274 274 274 148 149 OKAAAA IADAAA AAAAxx +5907 2037 1 3 7 7 7 907 1907 907 5907 14 15 FTAAAA JADAAA HHHHxx +8587 2038 1 3 7 7 87 587 587 3587 8587 174 175 HSAAAA KADAAA OOOOxx +9942 2039 0 2 2 2 42 942 1942 4942 9942 84 85 KSAAAA LADAAA VVVVxx +116 2040 0 0 6 16 16 116 116 116 116 32 33 MEAAAA MADAAA AAAAxx +7134 2041 0 2 4 14 34 134 1134 2134 7134 68 69 KOAAAA NADAAA HHHHxx +9002 2042 0 2 2 2 2 2 1002 4002 9002 4 5 GIAAAA OADAAA OOOOxx +1209 2043 1 1 9 9 9 209 1209 1209 1209 18 19 NUAAAA PADAAA VVVVxx +9983 2044 1 3 3 3 83 983 1983 4983 9983 166 167 ZTAAAA QADAAA AAAAxx +1761 2045 1 1 1 1 61 761 1761 1761 1761 122 123 TPAAAA RADAAA HHHHxx +7723 2046 1 3 3 3 23 723 1723 2723 7723 46 47 BLAAAA SADAAA OOOOxx +6518 2047 0 2 8 18 18 518 518 1518 6518 36 37 SQAAAA TADAAA VVVVxx +1372 2048 0 0 2 12 72 372 1372 1372 1372 144 145 UAAAAA UADAAA AAAAxx +3587 2049 1 3 7 7 87 587 1587 3587 3587 174 175 ZHAAAA VADAAA HHHHxx +5323 2050 1 3 3 3 23 323 1323 323 5323 46 47 TWAAAA WADAAA OOOOxx +5902 2051 0 2 2 2 2 902 1902 902 5902 4 5 ATAAAA XADAAA VVVVxx +3749 2052 1 1 9 9 49 749 1749 3749 3749 98 99 FOAAAA YADAAA AAAAxx +5965 2053 1 1 5 5 65 965 1965 965 5965 130 131 LVAAAA ZADAAA HHHHxx +663 2054 1 3 3 3 63 663 663 663 663 126 127 NZAAAA ABDAAA OOOOxx +36 2055 0 0 6 16 36 36 36 36 36 72 73 KBAAAA BBDAAA VVVVxx +9782 2056 0 2 2 2 82 782 1782 4782 9782 164 165 GMAAAA CBDAAA AAAAxx +5412 2057 0 0 2 12 12 412 1412 412 5412 24 25 EAAAAA DBDAAA HHHHxx +9961 2058 1 1 1 1 61 961 1961 4961 9961 122 123 DTAAAA EBDAAA OOOOxx +6492 2059 0 0 2 12 92 492 492 1492 6492 184 185 SPAAAA FBDAAA VVVVxx +4234 2060 0 2 4 14 34 234 234 4234 4234 68 69 WGAAAA GBDAAA AAAAxx +4922 2061 0 2 2 2 22 922 922 4922 4922 44 45 IHAAAA HBDAAA HHHHxx +6166 2062 0 2 6 6 66 166 166 1166 6166 132 133 EDAAAA IBDAAA OOOOxx +7019 2063 1 3 9 19 19 19 1019 2019 7019 38 39 ZJAAAA JBDAAA VVVVxx +7805 2064 1 1 5 5 5 805 1805 2805 7805 10 11 FOAAAA KBDAAA AAAAxx +9808 2065 0 0 8 8 8 808 1808 4808 9808 16 17 GNAAAA LBDAAA HHHHxx +2550 2066 0 2 0 10 50 550 550 2550 2550 100 101 CUAAAA MBDAAA OOOOxx +8626 2067 0 2 6 6 26 626 626 3626 8626 52 53 UTAAAA NBDAAA VVVVxx +5649 2068 1 1 9 9 49 649 1649 649 5649 98 99 HJAAAA OBDAAA AAAAxx +3117 2069 1 1 7 17 17 117 1117 3117 3117 34 35 XPAAAA PBDAAA HHHHxx +866 2070 0 2 6 6 66 866 866 866 866 132 133 IHAAAA QBDAAA OOOOxx +2323 2071 1 3 3 3 23 323 323 2323 2323 46 47 JLAAAA RBDAAA VVVVxx +5132 2072 0 0 2 12 32 132 1132 132 5132 64 65 KPAAAA SBDAAA AAAAxx +9222 2073 0 2 2 2 22 222 1222 4222 9222 44 45 SQAAAA TBDAAA HHHHxx +3934 2074 0 2 4 14 34 934 1934 3934 3934 68 69 IVAAAA UBDAAA OOOOxx +4845 2075 1 1 5 5 45 845 845 4845 4845 90 91 JEAAAA VBDAAA VVVVxx +7714 2076 0 2 4 14 14 714 1714 2714 7714 28 29 SKAAAA WBDAAA AAAAxx +9818 2077 0 2 8 18 18 818 1818 4818 9818 36 37 QNAAAA XBDAAA HHHHxx +2219 2078 1 3 9 19 19 219 219 2219 2219 38 39 JHAAAA YBDAAA OOOOxx +6573 2079 1 1 3 13 73 573 573 1573 6573 146 147 VSAAAA ZBDAAA VVVVxx +4555 2080 1 3 5 15 55 555 555 4555 4555 110 111 FTAAAA ACDAAA AAAAxx +7306 2081 0 2 6 6 6 306 1306 2306 7306 12 13 AVAAAA BCDAAA HHHHxx +9313 2082 1 1 3 13 13 313 1313 4313 9313 26 27 FUAAAA CCDAAA OOOOxx +3924 2083 0 0 4 4 24 924 1924 3924 3924 48 49 YUAAAA DCDAAA VVVVxx +5176 2084 0 0 6 16 76 176 1176 176 5176 152 153 CRAAAA ECDAAA AAAAxx +9767 2085 1 3 7 7 67 767 1767 4767 9767 134 135 RLAAAA FCDAAA HHHHxx +905 2086 1 1 5 5 5 905 905 905 905 10 11 VIAAAA GCDAAA OOOOxx +8037 2087 1 1 7 17 37 37 37 3037 8037 74 75 DXAAAA HCDAAA VVVVxx +8133 2088 1 1 3 13 33 133 133 3133 8133 66 67 VAAAAA ICDAAA AAAAxx +2954 2089 0 2 4 14 54 954 954 2954 2954 108 109 QJAAAA JCDAAA HHHHxx +7262 2090 0 2 2 2 62 262 1262 2262 7262 124 125 ITAAAA KCDAAA OOOOxx +8768 2091 0 0 8 8 68 768 768 3768 8768 136 137 GZAAAA LCDAAA VVVVxx +6953 2092 1 1 3 13 53 953 953 1953 6953 106 107 LHAAAA MCDAAA AAAAxx +1984 2093 0 0 4 4 84 984 1984 1984 1984 168 169 IYAAAA NCDAAA HHHHxx +9348 2094 0 0 8 8 48 348 1348 4348 9348 96 97 OVAAAA OCDAAA OOOOxx +7769 2095 1 1 9 9 69 769 1769 2769 7769 138 139 VMAAAA PCDAAA VVVVxx +2994 2096 0 2 4 14 94 994 994 2994 2994 188 189 ELAAAA QCDAAA AAAAxx +5938 2097 0 2 8 18 38 938 1938 938 5938 76 77 KUAAAA RCDAAA HHHHxx +556 2098 0 0 6 16 56 556 556 556 556 112 113 KVAAAA SCDAAA OOOOxx +2577 2099 1 1 7 17 77 577 577 2577 2577 154 155 DVAAAA TCDAAA VVVVxx +8733 2100 1 1 3 13 33 733 733 3733 8733 66 67 XXAAAA UCDAAA AAAAxx +3108 2101 0 0 8 8 8 108 1108 3108 3108 16 17 OPAAAA VCDAAA HHHHxx +4166 2102 0 2 6 6 66 166 166 4166 4166 132 133 GEAAAA WCDAAA OOOOxx +3170 2103 0 2 0 10 70 170 1170 3170 3170 140 141 YRAAAA XCDAAA VVVVxx +8118 2104 0 2 8 18 18 118 118 3118 8118 36 37 GAAAAA YCDAAA AAAAxx +8454 2105 0 2 4 14 54 454 454 3454 8454 108 109 ENAAAA ZCDAAA HHHHxx +5338 2106 0 2 8 18 38 338 1338 338 5338 76 77 IXAAAA ADDAAA OOOOxx +402 2107 0 2 2 2 2 402 402 402 402 4 5 MPAAAA BDDAAA VVVVxx +5673 2108 1 1 3 13 73 673 1673 673 5673 146 147 FKAAAA CDDAAA AAAAxx +4324 2109 0 0 4 4 24 324 324 4324 4324 48 49 IKAAAA DDDAAA HHHHxx +1943 2110 1 3 3 3 43 943 1943 1943 1943 86 87 TWAAAA EDDAAA OOOOxx +7703 2111 1 3 3 3 3 703 1703 2703 7703 6 7 HKAAAA FDDAAA VVVVxx +7180 2112 0 0 0 0 80 180 1180 2180 7180 160 161 EQAAAA GDDAAA AAAAxx +5478 2113 0 2 8 18 78 478 1478 478 5478 156 157 SCAAAA HDDAAA HHHHxx +5775 2114 1 3 5 15 75 775 1775 775 5775 150 151 DOAAAA IDDAAA OOOOxx +6952 2115 0 0 2 12 52 952 952 1952 6952 104 105 KHAAAA JDDAAA VVVVxx +9022 2116 0 2 2 2 22 22 1022 4022 9022 44 45 AJAAAA KDDAAA AAAAxx +547 2117 1 3 7 7 47 547 547 547 547 94 95 BVAAAA LDDAAA HHHHxx +5877 2118 1 1 7 17 77 877 1877 877 5877 154 155 BSAAAA MDDAAA OOOOxx +9580 2119 0 0 0 0 80 580 1580 4580 9580 160 161 MEAAAA NDDAAA VVVVxx +6094 2120 0 2 4 14 94 94 94 1094 6094 188 189 KAAAAA ODDAAA AAAAxx +3398 2121 0 2 8 18 98 398 1398 3398 3398 196 197 SAAAAA PDDAAA HHHHxx +4574 2122 0 2 4 14 74 574 574 4574 4574 148 149 YTAAAA QDDAAA OOOOxx +3675 2123 1 3 5 15 75 675 1675 3675 3675 150 151 JLAAAA RDDAAA VVVVxx +6413 2124 1 1 3 13 13 413 413 1413 6413 26 27 RMAAAA SDDAAA AAAAxx +9851 2125 1 3 1 11 51 851 1851 4851 9851 102 103 XOAAAA TDDAAA HHHHxx +126 2126 0 2 6 6 26 126 126 126 126 52 53 WEAAAA UDDAAA OOOOxx +6803 2127 1 3 3 3 3 803 803 1803 6803 6 7 RBAAAA VDDAAA VVVVxx +6949 2128 1 1 9 9 49 949 949 1949 6949 98 99 HHAAAA WDDAAA AAAAxx +115 2129 1 3 5 15 15 115 115 115 115 30 31 LEAAAA XDDAAA HHHHxx +4165 2130 1 1 5 5 65 165 165 4165 4165 130 131 FEAAAA YDDAAA OOOOxx +201 2131 1 1 1 1 1 201 201 201 201 2 3 THAAAA ZDDAAA VVVVxx +9324 2132 0 0 4 4 24 324 1324 4324 9324 48 49 QUAAAA AEDAAA AAAAxx +6562 2133 0 2 2 2 62 562 562 1562 6562 124 125 KSAAAA BEDAAA HHHHxx +1917 2134 1 1 7 17 17 917 1917 1917 1917 34 35 TVAAAA CEDAAA OOOOxx +558 2135 0 2 8 18 58 558 558 558 558 116 117 MVAAAA DEDAAA VVVVxx +8515 2136 1 3 5 15 15 515 515 3515 8515 30 31 NPAAAA EEDAAA AAAAxx +6321 2137 1 1 1 1 21 321 321 1321 6321 42 43 DJAAAA FEDAAA HHHHxx +6892 2138 0 0 2 12 92 892 892 1892 6892 184 185 CFAAAA GEDAAA OOOOxx +1001 2139 1 1 1 1 1 1 1001 1001 1001 2 3 NMAAAA HEDAAA VVVVxx +2858 2140 0 2 8 18 58 858 858 2858 2858 116 117 YFAAAA IEDAAA AAAAxx +2434 2141 0 2 4 14 34 434 434 2434 2434 68 69 QPAAAA JEDAAA HHHHxx +4460 2142 0 0 0 0 60 460 460 4460 4460 120 121 OPAAAA KEDAAA OOOOxx +5447 2143 1 3 7 7 47 447 1447 447 5447 94 95 NBAAAA LEDAAA VVVVxx +3799 2144 1 3 9 19 99 799 1799 3799 3799 198 199 DQAAAA MEDAAA AAAAxx +4310 2145 0 2 0 10 10 310 310 4310 4310 20 21 UJAAAA NEDAAA HHHHxx +405 2146 1 1 5 5 5 405 405 405 405 10 11 PPAAAA OEDAAA OOOOxx +4573 2147 1 1 3 13 73 573 573 4573 4573 146 147 XTAAAA PEDAAA VVVVxx +706 2148 0 2 6 6 6 706 706 706 706 12 13 EBAAAA QEDAAA AAAAxx +7619 2149 1 3 9 19 19 619 1619 2619 7619 38 39 BHAAAA REDAAA HHHHxx +7959 2150 1 3 9 19 59 959 1959 2959 7959 118 119 DUAAAA SEDAAA OOOOxx +6712 2151 0 0 2 12 12 712 712 1712 6712 24 25 EYAAAA TEDAAA VVVVxx +6959 2152 1 3 9 19 59 959 959 1959 6959 118 119 RHAAAA UEDAAA AAAAxx +9791 2153 1 3 1 11 91 791 1791 4791 9791 182 183 PMAAAA VEDAAA HHHHxx +2112 2154 0 0 2 12 12 112 112 2112 2112 24 25 GDAAAA WEDAAA OOOOxx +9114 2155 0 2 4 14 14 114 1114 4114 9114 28 29 OMAAAA XEDAAA VVVVxx +3506 2156 0 2 6 6 6 506 1506 3506 3506 12 13 WEAAAA YEDAAA AAAAxx +5002 2157 0 2 2 2 2 2 1002 2 5002 4 5 KKAAAA ZEDAAA HHHHxx +3518 2158 0 2 8 18 18 518 1518 3518 3518 36 37 IFAAAA AFDAAA OOOOxx +602 2159 0 2 2 2 2 602 602 602 602 4 5 EXAAAA BFDAAA VVVVxx +9060 2160 0 0 0 0 60 60 1060 4060 9060 120 121 MKAAAA CFDAAA AAAAxx +3292 2161 0 0 2 12 92 292 1292 3292 3292 184 185 QWAAAA DFDAAA HHHHxx +77 2162 1 1 7 17 77 77 77 77 77 154 155 ZCAAAA EFDAAA OOOOxx +1420 2163 0 0 0 0 20 420 1420 1420 1420 40 41 QCAAAA FFDAAA VVVVxx +6001 2164 1 1 1 1 1 1 1 1001 6001 2 3 VWAAAA GFDAAA AAAAxx +7477 2165 1 1 7 17 77 477 1477 2477 7477 154 155 PBAAAA HFDAAA HHHHxx +6655 2166 1 3 5 15 55 655 655 1655 6655 110 111 ZVAAAA IFDAAA OOOOxx +7845 2167 1 1 5 5 45 845 1845 2845 7845 90 91 TPAAAA JFDAAA VVVVxx +8484 2168 0 0 4 4 84 484 484 3484 8484 168 169 IOAAAA KFDAAA AAAAxx +4345 2169 1 1 5 5 45 345 345 4345 4345 90 91 DLAAAA LFDAAA HHHHxx +4250 2170 0 2 0 10 50 250 250 4250 4250 100 101 MHAAAA MFDAAA OOOOxx +2391 2171 1 3 1 11 91 391 391 2391 2391 182 183 ZNAAAA NFDAAA VVVVxx +6884 2172 0 0 4 4 84 884 884 1884 6884 168 169 UEAAAA OFDAAA AAAAxx +7270 2173 0 2 0 10 70 270 1270 2270 7270 140 141 QTAAAA PFDAAA HHHHxx +2499 2174 1 3 9 19 99 499 499 2499 2499 198 199 DSAAAA QFDAAA OOOOxx +7312 2175 0 0 2 12 12 312 1312 2312 7312 24 25 GVAAAA RFDAAA VVVVxx +7113 2176 1 1 3 13 13 113 1113 2113 7113 26 27 PNAAAA SFDAAA AAAAxx +6695 2177 1 3 5 15 95 695 695 1695 6695 190 191 NXAAAA TFDAAA HHHHxx +6521 2178 1 1 1 1 21 521 521 1521 6521 42 43 VQAAAA UFDAAA OOOOxx +272 2179 0 0 2 12 72 272 272 272 272 144 145 MKAAAA VFDAAA VVVVxx +9976 2180 0 0 6 16 76 976 1976 4976 9976 152 153 STAAAA WFDAAA AAAAxx +992 2181 0 0 2 12 92 992 992 992 992 184 185 EMAAAA XFDAAA HHHHxx +6158 2182 0 2 8 18 58 158 158 1158 6158 116 117 WCAAAA YFDAAA OOOOxx +3281 2183 1 1 1 1 81 281 1281 3281 3281 162 163 FWAAAA ZFDAAA VVVVxx +7446 2184 0 2 6 6 46 446 1446 2446 7446 92 93 KAAAAA AGDAAA AAAAxx +4679 2185 1 3 9 19 79 679 679 4679 4679 158 159 ZXAAAA BGDAAA HHHHxx +5203 2186 1 3 3 3 3 203 1203 203 5203 6 7 DSAAAA CGDAAA OOOOxx +9874 2187 0 2 4 14 74 874 1874 4874 9874 148 149 UPAAAA DGDAAA VVVVxx +8371 2188 1 3 1 11 71 371 371 3371 8371 142 143 ZJAAAA EGDAAA AAAAxx +9086 2189 0 2 6 6 86 86 1086 4086 9086 172 173 MLAAAA FGDAAA HHHHxx +430 2190 0 2 0 10 30 430 430 430 430 60 61 OQAAAA GGDAAA OOOOxx +8749 2191 1 1 9 9 49 749 749 3749 8749 98 99 NYAAAA HGDAAA VVVVxx +577 2192 1 1 7 17 77 577 577 577 577 154 155 FWAAAA IGDAAA AAAAxx +4884 2193 0 0 4 4 84 884 884 4884 4884 168 169 WFAAAA JGDAAA HHHHxx +3421 2194 1 1 1 1 21 421 1421 3421 3421 42 43 PBAAAA KGDAAA OOOOxx +2812 2195 0 0 2 12 12 812 812 2812 2812 24 25 EEAAAA LGDAAA VVVVxx +5958 2196 0 2 8 18 58 958 1958 958 5958 116 117 EVAAAA MGDAAA AAAAxx +9901 2197 1 1 1 1 1 901 1901 4901 9901 2 3 VQAAAA NGDAAA HHHHxx +8478 2198 0 2 8 18 78 478 478 3478 8478 156 157 COAAAA OGDAAA OOOOxx +6545 2199 1 1 5 5 45 545 545 1545 6545 90 91 TRAAAA PGDAAA VVVVxx +1479 2200 1 3 9 19 79 479 1479 1479 1479 158 159 XEAAAA QGDAAA AAAAxx +1046 2201 0 2 6 6 46 46 1046 1046 1046 92 93 GOAAAA RGDAAA HHHHxx +6372 2202 0 0 2 12 72 372 372 1372 6372 144 145 CLAAAA SGDAAA OOOOxx +8206 2203 0 2 6 6 6 206 206 3206 8206 12 13 QDAAAA TGDAAA VVVVxx +9544 2204 0 0 4 4 44 544 1544 4544 9544 88 89 CDAAAA UGDAAA AAAAxx +9287 2205 1 3 7 7 87 287 1287 4287 9287 174 175 FTAAAA VGDAAA HHHHxx +6786 2206 0 2 6 6 86 786 786 1786 6786 172 173 ABAAAA WGDAAA OOOOxx +6511 2207 1 3 1 11 11 511 511 1511 6511 22 23 LQAAAA XGDAAA VVVVxx +603 2208 1 3 3 3 3 603 603 603 603 6 7 FXAAAA YGDAAA AAAAxx +2022 2209 0 2 2 2 22 22 22 2022 2022 44 45 UZAAAA ZGDAAA HHHHxx +2086 2210 0 2 6 6 86 86 86 2086 2086 172 173 GCAAAA AHDAAA OOOOxx +1969 2211 1 1 9 9 69 969 1969 1969 1969 138 139 TXAAAA BHDAAA VVVVxx +4841 2212 1 1 1 1 41 841 841 4841 4841 82 83 FEAAAA CHDAAA AAAAxx +5845 2213 1 1 5 5 45 845 1845 845 5845 90 91 VQAAAA DHDAAA HHHHxx +4635 2214 1 3 5 15 35 635 635 4635 4635 70 71 HWAAAA EHDAAA OOOOxx +4658 2215 0 2 8 18 58 658 658 4658 4658 116 117 EXAAAA FHDAAA VVVVxx +2896 2216 0 0 6 16 96 896 896 2896 2896 192 193 KHAAAA GHDAAA AAAAxx +5179 2217 1 3 9 19 79 179 1179 179 5179 158 159 FRAAAA HHDAAA HHHHxx +8667 2218 1 3 7 7 67 667 667 3667 8667 134 135 JVAAAA IHDAAA OOOOxx +7294 2219 0 2 4 14 94 294 1294 2294 7294 188 189 OUAAAA JHDAAA VVVVxx +3706 2220 0 2 6 6 6 706 1706 3706 3706 12 13 OMAAAA KHDAAA AAAAxx +8389 2221 1 1 9 9 89 389 389 3389 8389 178 179 RKAAAA LHDAAA HHHHxx +2486 2222 0 2 6 6 86 486 486 2486 2486 172 173 QRAAAA MHDAAA OOOOxx +8743 2223 1 3 3 3 43 743 743 3743 8743 86 87 HYAAAA NHDAAA VVVVxx +2777 2224 1 1 7 17 77 777 777 2777 2777 154 155 VCAAAA OHDAAA AAAAxx +2113 2225 1 1 3 13 13 113 113 2113 2113 26 27 HDAAAA PHDAAA HHHHxx +2076 2226 0 0 6 16 76 76 76 2076 2076 152 153 WBAAAA QHDAAA OOOOxx +2300 2227 0 0 0 0 0 300 300 2300 2300 0 1 MKAAAA RHDAAA VVVVxx +6894 2228 0 2 4 14 94 894 894 1894 6894 188 189 EFAAAA SHDAAA AAAAxx +6939 2229 1 3 9 19 39 939 939 1939 6939 78 79 XGAAAA THDAAA HHHHxx +446 2230 0 2 6 6 46 446 446 446 446 92 93 ERAAAA UHDAAA OOOOxx +6218 2231 0 2 8 18 18 218 218 1218 6218 36 37 EFAAAA VHDAAA VVVVxx +1295 2232 1 3 5 15 95 295 1295 1295 1295 190 191 VXAAAA WHDAAA AAAAxx +5135 2233 1 3 5 15 35 135 1135 135 5135 70 71 NPAAAA XHDAAA HHHHxx +8122 2234 0 2 2 2 22 122 122 3122 8122 44 45 KAAAAA YHDAAA OOOOxx +316 2235 0 0 6 16 16 316 316 316 316 32 33 EMAAAA ZHDAAA VVVVxx +514 2236 0 2 4 14 14 514 514 514 514 28 29 UTAAAA AIDAAA AAAAxx +7970 2237 0 2 0 10 70 970 1970 2970 7970 140 141 OUAAAA BIDAAA HHHHxx +9350 2238 0 2 0 10 50 350 1350 4350 9350 100 101 QVAAAA CIDAAA OOOOxx +3700 2239 0 0 0 0 0 700 1700 3700 3700 0 1 IMAAAA DIDAAA VVVVxx +582 2240 0 2 2 2 82 582 582 582 582 164 165 KWAAAA EIDAAA AAAAxx +9722 2241 0 2 2 2 22 722 1722 4722 9722 44 45 YJAAAA FIDAAA HHHHxx +7398 2242 0 2 8 18 98 398 1398 2398 7398 196 197 OYAAAA GIDAAA OOOOxx +2265 2243 1 1 5 5 65 265 265 2265 2265 130 131 DJAAAA HIDAAA VVVVxx +3049 2244 1 1 9 9 49 49 1049 3049 3049 98 99 HNAAAA IIDAAA AAAAxx +9121 2245 1 1 1 1 21 121 1121 4121 9121 42 43 VMAAAA JIDAAA HHHHxx +4275 2246 1 3 5 15 75 275 275 4275 4275 150 151 LIAAAA KIDAAA OOOOxx +6567 2247 1 3 7 7 67 567 567 1567 6567 134 135 PSAAAA LIDAAA VVVVxx +6755 2248 1 3 5 15 55 755 755 1755 6755 110 111 VZAAAA MIDAAA AAAAxx +4535 2249 1 3 5 15 35 535 535 4535 4535 70 71 LSAAAA NIDAAA HHHHxx +7968 2250 0 0 8 8 68 968 1968 2968 7968 136 137 MUAAAA OIDAAA OOOOxx +3412 2251 0 0 2 12 12 412 1412 3412 3412 24 25 GBAAAA PIDAAA VVVVxx +6112 2252 0 0 2 12 12 112 112 1112 6112 24 25 CBAAAA QIDAAA AAAAxx +6805 2253 1 1 5 5 5 805 805 1805 6805 10 11 TBAAAA RIDAAA HHHHxx +2880 2254 0 0 0 0 80 880 880 2880 2880 160 161 UGAAAA SIDAAA OOOOxx +7710 2255 0 2 0 10 10 710 1710 2710 7710 20 21 OKAAAA TIDAAA VVVVxx +7949 2256 1 1 9 9 49 949 1949 2949 7949 98 99 TTAAAA UIDAAA AAAAxx +7043 2257 1 3 3 3 43 43 1043 2043 7043 86 87 XKAAAA VIDAAA HHHHxx +9012 2258 0 0 2 12 12 12 1012 4012 9012 24 25 QIAAAA WIDAAA OOOOxx +878 2259 0 2 8 18 78 878 878 878 878 156 157 UHAAAA XIDAAA VVVVxx +7930 2260 0 2 0 10 30 930 1930 2930 7930 60 61 ATAAAA YIDAAA AAAAxx +667 2261 1 3 7 7 67 667 667 667 667 134 135 RZAAAA ZIDAAA HHHHxx +1905 2262 1 1 5 5 5 905 1905 1905 1905 10 11 HVAAAA AJDAAA OOOOxx +4958 2263 0 2 8 18 58 958 958 4958 4958 116 117 SIAAAA BJDAAA VVVVxx +2973 2264 1 1 3 13 73 973 973 2973 2973 146 147 JKAAAA CJDAAA AAAAxx +3631 2265 1 3 1 11 31 631 1631 3631 3631 62 63 RJAAAA DJDAAA HHHHxx +5868 2266 0 0 8 8 68 868 1868 868 5868 136 137 SRAAAA EJDAAA OOOOxx +2873 2267 1 1 3 13 73 873 873 2873 2873 146 147 NGAAAA FJDAAA VVVVxx +6941 2268 1 1 1 1 41 941 941 1941 6941 82 83 ZGAAAA GJDAAA AAAAxx +6384 2269 0 0 4 4 84 384 384 1384 6384 168 169 OLAAAA HJDAAA HHHHxx +3806 2270 0 2 6 6 6 806 1806 3806 3806 12 13 KQAAAA IJDAAA OOOOxx +5079 2271 1 3 9 19 79 79 1079 79 5079 158 159 JNAAAA JJDAAA VVVVxx +1970 2272 0 2 0 10 70 970 1970 1970 1970 140 141 UXAAAA KJDAAA AAAAxx +7810 2273 0 2 0 10 10 810 1810 2810 7810 20 21 KOAAAA LJDAAA HHHHxx +4639 2274 1 3 9 19 39 639 639 4639 4639 78 79 LWAAAA MJDAAA OOOOxx +6527 2275 1 3 7 7 27 527 527 1527 6527 54 55 BRAAAA NJDAAA VVVVxx +8079 2276 1 3 9 19 79 79 79 3079 8079 158 159 TYAAAA OJDAAA AAAAxx +2740 2277 0 0 0 0 40 740 740 2740 2740 80 81 KBAAAA PJDAAA HHHHxx +2337 2278 1 1 7 17 37 337 337 2337 2337 74 75 XLAAAA QJDAAA OOOOxx +6670 2279 0 2 0 10 70 670 670 1670 6670 140 141 OWAAAA RJDAAA VVVVxx +2345 2280 1 1 5 5 45 345 345 2345 2345 90 91 FMAAAA SJDAAA AAAAxx +401 2281 1 1 1 1 1 401 401 401 401 2 3 LPAAAA TJDAAA HHHHxx +2704 2282 0 0 4 4 4 704 704 2704 2704 8 9 AAAAAA UJDAAA OOOOxx +5530 2283 0 2 0 10 30 530 1530 530 5530 60 61 SEAAAA VJDAAA VVVVxx +51 2284 1 3 1 11 51 51 51 51 51 102 103 ZBAAAA WJDAAA AAAAxx +4282 2285 0 2 2 2 82 282 282 4282 4282 164 165 SIAAAA XJDAAA HHHHxx +7336 2286 0 0 6 16 36 336 1336 2336 7336 72 73 EWAAAA YJDAAA OOOOxx +8320 2287 0 0 0 0 20 320 320 3320 8320 40 41 AIAAAA ZJDAAA VVVVxx +7772 2288 0 0 2 12 72 772 1772 2772 7772 144 145 YMAAAA AKDAAA AAAAxx +1894 2289 0 2 4 14 94 894 1894 1894 1894 188 189 WUAAAA BKDAAA HHHHxx +2320 2290 0 0 0 0 20 320 320 2320 2320 40 41 GLAAAA CKDAAA OOOOxx +6232 2291 0 0 2 12 32 232 232 1232 6232 64 65 SFAAAA DKDAAA VVVVxx +2833 2292 1 1 3 13 33 833 833 2833 2833 66 67 ZEAAAA EKDAAA AAAAxx +8265 2293 1 1 5 5 65 265 265 3265 8265 130 131 XFAAAA FKDAAA HHHHxx +4589 2294 1 1 9 9 89 589 589 4589 4589 178 179 NUAAAA GKDAAA OOOOxx +8182 2295 0 2 2 2 82 182 182 3182 8182 164 165 SCAAAA HKDAAA VVVVxx +8337 2296 1 1 7 17 37 337 337 3337 8337 74 75 RIAAAA IKDAAA AAAAxx +8210 2297 0 2 0 10 10 210 210 3210 8210 20 21 UDAAAA JKDAAA HHHHxx +1406 2298 0 2 6 6 6 406 1406 1406 1406 12 13 CCAAAA KKDAAA OOOOxx +4463 2299 1 3 3 3 63 463 463 4463 4463 126 127 RPAAAA LKDAAA VVVVxx +4347 2300 1 3 7 7 47 347 347 4347 4347 94 95 FLAAAA MKDAAA AAAAxx +181 2301 1 1 1 1 81 181 181 181 181 162 163 ZGAAAA NKDAAA HHHHxx +9986 2302 0 2 6 6 86 986 1986 4986 9986 172 173 CUAAAA OKDAAA OOOOxx +661 2303 1 1 1 1 61 661 661 661 661 122 123 LZAAAA PKDAAA VVVVxx +4105 2304 1 1 5 5 5 105 105 4105 4105 10 11 XBAAAA QKDAAA AAAAxx +2187 2305 1 3 7 7 87 187 187 2187 2187 174 175 DGAAAA RKDAAA HHHHxx +1628 2306 0 0 8 8 28 628 1628 1628 1628 56 57 QKAAAA SKDAAA OOOOxx +3119 2307 1 3 9 19 19 119 1119 3119 3119 38 39 ZPAAAA TKDAAA VVVVxx +6804 2308 0 0 4 4 4 804 804 1804 6804 8 9 SBAAAA UKDAAA AAAAxx +9918 2309 0 2 8 18 18 918 1918 4918 9918 36 37 MRAAAA VKDAAA HHHHxx +8916 2310 0 0 6 16 16 916 916 3916 8916 32 33 YEAAAA WKDAAA OOOOxx +6057 2311 1 1 7 17 57 57 57 1057 6057 114 115 ZYAAAA XKDAAA VVVVxx +3622 2312 0 2 2 2 22 622 1622 3622 3622 44 45 IJAAAA YKDAAA AAAAxx +9168 2313 0 0 8 8 68 168 1168 4168 9168 136 137 QOAAAA ZKDAAA HHHHxx +3720 2314 0 0 0 0 20 720 1720 3720 3720 40 41 CNAAAA ALDAAA OOOOxx +9927 2315 1 3 7 7 27 927 1927 4927 9927 54 55 VRAAAA BLDAAA VVVVxx +5616 2316 0 0 6 16 16 616 1616 616 5616 32 33 AIAAAA CLDAAA AAAAxx +5210 2317 0 2 0 10 10 210 1210 210 5210 20 21 KSAAAA DLDAAA HHHHxx +636 2318 0 0 6 16 36 636 636 636 636 72 73 MYAAAA ELDAAA OOOOxx +9936 2319 0 0 6 16 36 936 1936 4936 9936 72 73 ESAAAA FLDAAA VVVVxx +2316 2320 0 0 6 16 16 316 316 2316 2316 32 33 CLAAAA GLDAAA AAAAxx +4363 2321 1 3 3 3 63 363 363 4363 4363 126 127 VLAAAA HLDAAA HHHHxx +7657 2322 1 1 7 17 57 657 1657 2657 7657 114 115 NIAAAA ILDAAA OOOOxx +697 2323 1 1 7 17 97 697 697 697 697 194 195 VAAAAA JLDAAA VVVVxx +912 2324 0 0 2 12 12 912 912 912 912 24 25 CJAAAA KLDAAA AAAAxx +8806 2325 0 2 6 6 6 806 806 3806 8806 12 13 SAAAAA LLDAAA HHHHxx +9698 2326 0 2 8 18 98 698 1698 4698 9698 196 197 AJAAAA MLDAAA OOOOxx +6191 2327 1 3 1 11 91 191 191 1191 6191 182 183 DEAAAA NLDAAA VVVVxx +1188 2328 0 0 8 8 88 188 1188 1188 1188 176 177 STAAAA OLDAAA AAAAxx +7676 2329 0 0 6 16 76 676 1676 2676 7676 152 153 GJAAAA PLDAAA HHHHxx +7073 2330 1 1 3 13 73 73 1073 2073 7073 146 147 BMAAAA QLDAAA OOOOxx +8019 2331 1 3 9 19 19 19 19 3019 8019 38 39 LWAAAA RLDAAA VVVVxx +4726 2332 0 2 6 6 26 726 726 4726 4726 52 53 UZAAAA SLDAAA AAAAxx +4648 2333 0 0 8 8 48 648 648 4648 4648 96 97 UWAAAA TLDAAA HHHHxx +3227 2334 1 3 7 7 27 227 1227 3227 3227 54 55 DUAAAA ULDAAA OOOOxx +7232 2335 0 0 2 12 32 232 1232 2232 7232 64 65 ESAAAA VLDAAA VVVVxx +9761 2336 1 1 1 1 61 761 1761 4761 9761 122 123 LLAAAA WLDAAA AAAAxx +3105 2337 1 1 5 5 5 105 1105 3105 3105 10 11 LPAAAA XLDAAA HHHHxx +5266 2338 0 2 6 6 66 266 1266 266 5266 132 133 OUAAAA YLDAAA OOOOxx +6788 2339 0 0 8 8 88 788 788 1788 6788 176 177 CBAAAA ZLDAAA VVVVxx +2442 2340 0 2 2 2 42 442 442 2442 2442 84 85 YPAAAA AMDAAA AAAAxx +8198 2341 0 2 8 18 98 198 198 3198 8198 196 197 IDAAAA BMDAAA HHHHxx +5806 2342 0 2 6 6 6 806 1806 806 5806 12 13 IPAAAA CMDAAA OOOOxx +8928 2343 0 0 8 8 28 928 928 3928 8928 56 57 KFAAAA DMDAAA VVVVxx +1657 2344 1 1 7 17 57 657 1657 1657 1657 114 115 TLAAAA EMDAAA AAAAxx +9164 2345 0 0 4 4 64 164 1164 4164 9164 128 129 MOAAAA FMDAAA HHHHxx +1851 2346 1 3 1 11 51 851 1851 1851 1851 102 103 FTAAAA GMDAAA OOOOxx +4744 2347 0 0 4 4 44 744 744 4744 4744 88 89 MAAAAA HMDAAA VVVVxx +8055 2348 1 3 5 15 55 55 55 3055 8055 110 111 VXAAAA IMDAAA AAAAxx +1533 2349 1 1 3 13 33 533 1533 1533 1533 66 67 ZGAAAA JMDAAA HHHHxx +1260 2350 0 0 0 0 60 260 1260 1260 1260 120 121 MWAAAA KMDAAA OOOOxx +1290 2351 0 2 0 10 90 290 1290 1290 1290 180 181 QXAAAA LMDAAA VVVVxx +297 2352 1 1 7 17 97 297 297 297 297 194 195 LLAAAA MMDAAA AAAAxx +4145 2353 1 1 5 5 45 145 145 4145 4145 90 91 LDAAAA NMDAAA HHHHxx +863 2354 1 3 3 3 63 863 863 863 863 126 127 FHAAAA OMDAAA OOOOxx +3423 2355 1 3 3 3 23 423 1423 3423 3423 46 47 RBAAAA PMDAAA VVVVxx +8750 2356 0 2 0 10 50 750 750 3750 8750 100 101 OYAAAA QMDAAA AAAAxx +3546 2357 0 2 6 6 46 546 1546 3546 3546 92 93 KGAAAA RMDAAA HHHHxx +3678 2358 0 2 8 18 78 678 1678 3678 3678 156 157 MLAAAA SMDAAA OOOOxx +5313 2359 1 1 3 13 13 313 1313 313 5313 26 27 JWAAAA TMDAAA VVVVxx +6233 2360 1 1 3 13 33 233 233 1233 6233 66 67 TFAAAA UMDAAA AAAAxx +5802 2361 0 2 2 2 2 802 1802 802 5802 4 5 EPAAAA VMDAAA HHHHxx +7059 2362 1 3 9 19 59 59 1059 2059 7059 118 119 NLAAAA WMDAAA OOOOxx +6481 2363 1 1 1 1 81 481 481 1481 6481 162 163 HPAAAA XMDAAA VVVVxx +1596 2364 0 0 6 16 96 596 1596 1596 1596 192 193 KJAAAA YMDAAA AAAAxx +8181 2365 1 1 1 1 81 181 181 3181 8181 162 163 RCAAAA ZMDAAA HHHHxx +5368 2366 0 0 8 8 68 368 1368 368 5368 136 137 MYAAAA ANDAAA OOOOxx +9416 2367 0 0 6 16 16 416 1416 4416 9416 32 33 EYAAAA BNDAAA VVVVxx +9521 2368 1 1 1 1 21 521 1521 4521 9521 42 43 FCAAAA CNDAAA AAAAxx +1042 2369 0 2 2 2 42 42 1042 1042 1042 84 85 COAAAA DNDAAA HHHHxx +4503 2370 1 3 3 3 3 503 503 4503 4503 6 7 FRAAAA ENDAAA OOOOxx +3023 2371 1 3 3 3 23 23 1023 3023 3023 46 47 HMAAAA FNDAAA VVVVxx +1976 2372 0 0 6 16 76 976 1976 1976 1976 152 153 AYAAAA GNDAAA AAAAxx +5610 2373 0 2 0 10 10 610 1610 610 5610 20 21 UHAAAA HNDAAA HHHHxx +7410 2374 0 2 0 10 10 410 1410 2410 7410 20 21 AZAAAA INDAAA OOOOxx +7872 2375 0 0 2 12 72 872 1872 2872 7872 144 145 UQAAAA JNDAAA VVVVxx +8591 2376 1 3 1 11 91 591 591 3591 8591 182 183 LSAAAA KNDAAA AAAAxx +1804 2377 0 0 4 4 4 804 1804 1804 1804 8 9 KRAAAA LNDAAA HHHHxx +5299 2378 1 3 9 19 99 299 1299 299 5299 198 199 VVAAAA MNDAAA OOOOxx +4695 2379 1 3 5 15 95 695 695 4695 4695 190 191 PYAAAA NNDAAA VVVVxx +2672 2380 0 0 2 12 72 672 672 2672 2672 144 145 UYAAAA ONDAAA AAAAxx +585 2381 1 1 5 5 85 585 585 585 585 170 171 NWAAAA PNDAAA HHHHxx +8622 2382 0 2 2 2 22 622 622 3622 8622 44 45 QTAAAA QNDAAA OOOOxx +3780 2383 0 0 0 0 80 780 1780 3780 3780 160 161 KPAAAA RNDAAA VVVVxx +7941 2384 1 1 1 1 41 941 1941 2941 7941 82 83 LTAAAA SNDAAA AAAAxx +3305 2385 1 1 5 5 5 305 1305 3305 3305 10 11 DXAAAA TNDAAA HHHHxx +8653 2386 1 1 3 13 53 653 653 3653 8653 106 107 VUAAAA UNDAAA OOOOxx +5756 2387 0 0 6 16 56 756 1756 756 5756 112 113 KNAAAA VNDAAA VVVVxx +576 2388 0 0 6 16 76 576 576 576 576 152 153 EWAAAA WNDAAA AAAAxx +1915 2389 1 3 5 15 15 915 1915 1915 1915 30 31 RVAAAA XNDAAA HHHHxx +4627 2390 1 3 7 7 27 627 627 4627 4627 54 55 ZVAAAA YNDAAA OOOOxx +920 2391 0 0 0 0 20 920 920 920 920 40 41 KJAAAA ZNDAAA VVVVxx +2537 2392 1 1 7 17 37 537 537 2537 2537 74 75 PTAAAA AODAAA AAAAxx +50 2393 0 2 0 10 50 50 50 50 50 100 101 YBAAAA BODAAA HHHHxx +1313 2394 1 1 3 13 13 313 1313 1313 1313 26 27 NYAAAA CODAAA OOOOxx +8542 2395 0 2 2 2 42 542 542 3542 8542 84 85 OQAAAA DODAAA VVVVxx +6428 2396 0 0 8 8 28 428 428 1428 6428 56 57 GNAAAA EODAAA AAAAxx +4351 2397 1 3 1 11 51 351 351 4351 4351 102 103 JLAAAA FODAAA HHHHxx +2050 2398 0 2 0 10 50 50 50 2050 2050 100 101 WAAAAA GODAAA OOOOxx +5162 2399 0 2 2 2 62 162 1162 162 5162 124 125 OQAAAA HODAAA VVVVxx +8229 2400 1 1 9 9 29 229 229 3229 8229 58 59 NEAAAA IODAAA AAAAxx +7782 2401 0 2 2 2 82 782 1782 2782 7782 164 165 INAAAA JODAAA HHHHxx +1563 2402 1 3 3 3 63 563 1563 1563 1563 126 127 DIAAAA KODAAA OOOOxx +267 2403 1 3 7 7 67 267 267 267 267 134 135 HKAAAA LODAAA VVVVxx +5138 2404 0 2 8 18 38 138 1138 138 5138 76 77 QPAAAA MODAAA AAAAxx +7022 2405 0 2 2 2 22 22 1022 2022 7022 44 45 CKAAAA NODAAA HHHHxx +6705 2406 1 1 5 5 5 705 705 1705 6705 10 11 XXAAAA OODAAA OOOOxx +6190 2407 0 2 0 10 90 190 190 1190 6190 180 181 CEAAAA PODAAA VVVVxx +8226 2408 0 2 6 6 26 226 226 3226 8226 52 53 KEAAAA QODAAA AAAAxx +8882 2409 0 2 2 2 82 882 882 3882 8882 164 165 QDAAAA RODAAA HHHHxx +5181 2410 1 1 1 1 81 181 1181 181 5181 162 163 HRAAAA SODAAA OOOOxx +4598 2411 0 2 8 18 98 598 598 4598 4598 196 197 WUAAAA TODAAA VVVVxx +4882 2412 0 2 2 2 82 882 882 4882 4882 164 165 UFAAAA UODAAA AAAAxx +7490 2413 0 2 0 10 90 490 1490 2490 7490 180 181 CCAAAA VODAAA HHHHxx +5224 2414 0 0 4 4 24 224 1224 224 5224 48 49 YSAAAA WODAAA OOOOxx +2174 2415 0 2 4 14 74 174 174 2174 2174 148 149 QFAAAA XODAAA VVVVxx +3059 2416 1 3 9 19 59 59 1059 3059 3059 118 119 RNAAAA YODAAA AAAAxx +8790 2417 0 2 0 10 90 790 790 3790 8790 180 181 CAAAAA ZODAAA HHHHxx +2222 2418 0 2 2 2 22 222 222 2222 2222 44 45 MHAAAA APDAAA OOOOxx +5473 2419 1 1 3 13 73 473 1473 473 5473 146 147 NCAAAA BPDAAA VVVVxx +937 2420 1 1 7 17 37 937 937 937 937 74 75 BKAAAA CPDAAA AAAAxx +2975 2421 1 3 5 15 75 975 975 2975 2975 150 151 LKAAAA DPDAAA HHHHxx +9569 2422 1 1 9 9 69 569 1569 4569 9569 138 139 BEAAAA EPDAAA OOOOxx +3456 2423 0 0 6 16 56 456 1456 3456 3456 112 113 YCAAAA FPDAAA VVVVxx +6657 2424 1 1 7 17 57 657 657 1657 6657 114 115 BWAAAA GPDAAA AAAAxx +3776 2425 0 0 6 16 76 776 1776 3776 3776 152 153 GPAAAA HPDAAA HHHHxx +6072 2426 0 0 2 12 72 72 72 1072 6072 144 145 OZAAAA IPDAAA OOOOxx +8129 2427 1 1 9 9 29 129 129 3129 8129 58 59 RAAAAA JPDAAA VVVVxx +1085 2428 1 1 5 5 85 85 1085 1085 1085 170 171 TPAAAA KPDAAA AAAAxx +2079 2429 1 3 9 19 79 79 79 2079 2079 158 159 ZBAAAA LPDAAA HHHHxx +1200 2430 0 0 0 0 0 200 1200 1200 1200 0 1 EUAAAA MPDAAA OOOOxx +3276 2431 0 0 6 16 76 276 1276 3276 3276 152 153 AWAAAA NPDAAA VVVVxx +2608 2432 0 0 8 8 8 608 608 2608 2608 16 17 IWAAAA OPDAAA AAAAxx +702 2433 0 2 2 2 2 702 702 702 702 4 5 ABAAAA PPDAAA HHHHxx +5750 2434 0 2 0 10 50 750 1750 750 5750 100 101 ENAAAA QPDAAA OOOOxx +2776 2435 0 0 6 16 76 776 776 2776 2776 152 153 UCAAAA RPDAAA VVVVxx +9151 2436 1 3 1 11 51 151 1151 4151 9151 102 103 ZNAAAA SPDAAA AAAAxx +3282 2437 0 2 2 2 82 282 1282 3282 3282 164 165 GWAAAA TPDAAA HHHHxx +408 2438 0 0 8 8 8 408 408 408 408 16 17 SPAAAA UPDAAA OOOOxx +3473 2439 1 1 3 13 73 473 1473 3473 3473 146 147 PDAAAA VPDAAA VVVVxx +7095 2440 1 3 5 15 95 95 1095 2095 7095 190 191 XMAAAA WPDAAA AAAAxx +3288 2441 0 0 8 8 88 288 1288 3288 3288 176 177 MWAAAA XPDAAA HHHHxx +8215 2442 1 3 5 15 15 215 215 3215 8215 30 31 ZDAAAA YPDAAA OOOOxx +6244 2443 0 0 4 4 44 244 244 1244 6244 88 89 EGAAAA ZPDAAA VVVVxx +8440 2444 0 0 0 0 40 440 440 3440 8440 80 81 QMAAAA AQDAAA AAAAxx +3800 2445 0 0 0 0 0 800 1800 3800 3800 0 1 EQAAAA BQDAAA HHHHxx +7279 2446 1 3 9 19 79 279 1279 2279 7279 158 159 ZTAAAA CQDAAA OOOOxx +9206 2447 0 2 6 6 6 206 1206 4206 9206 12 13 CQAAAA DQDAAA VVVVxx +6465 2448 1 1 5 5 65 465 465 1465 6465 130 131 ROAAAA EQDAAA AAAAxx +4127 2449 1 3 7 7 27 127 127 4127 4127 54 55 TCAAAA FQDAAA HHHHxx +7463 2450 1 3 3 3 63 463 1463 2463 7463 126 127 BBAAAA GQDAAA OOOOxx +5117 2451 1 1 7 17 17 117 1117 117 5117 34 35 VOAAAA HQDAAA VVVVxx +4715 2452 1 3 5 15 15 715 715 4715 4715 30 31 JZAAAA IQDAAA AAAAxx +2010 2453 0 2 0 10 10 10 10 2010 2010 20 21 IZAAAA JQDAAA HHHHxx +6486 2454 0 2 6 6 86 486 486 1486 6486 172 173 MPAAAA KQDAAA OOOOxx +6434 2455 0 2 4 14 34 434 434 1434 6434 68 69 MNAAAA LQDAAA VVVVxx +2151 2456 1 3 1 11 51 151 151 2151 2151 102 103 TEAAAA MQDAAA AAAAxx +4821 2457 1 1 1 1 21 821 821 4821 4821 42 43 LDAAAA NQDAAA HHHHxx +6507 2458 1 3 7 7 7 507 507 1507 6507 14 15 HQAAAA OQDAAA OOOOxx +8741 2459 1 1 1 1 41 741 741 3741 8741 82 83 FYAAAA PQDAAA VVVVxx +6846 2460 0 2 6 6 46 846 846 1846 6846 92 93 IDAAAA QQDAAA AAAAxx +4525 2461 1 1 5 5 25 525 525 4525 4525 50 51 BSAAAA RQDAAA HHHHxx +8299 2462 1 3 9 19 99 299 299 3299 8299 198 199 FHAAAA SQDAAA OOOOxx +5465 2463 1 1 5 5 65 465 1465 465 5465 130 131 FCAAAA TQDAAA VVVVxx +7206 2464 0 2 6 6 6 206 1206 2206 7206 12 13 ERAAAA UQDAAA AAAAxx +2616 2465 0 0 6 16 16 616 616 2616 2616 32 33 QWAAAA VQDAAA HHHHxx +4440 2466 0 0 0 0 40 440 440 4440 4440 80 81 UOAAAA WQDAAA OOOOxx +6109 2467 1 1 9 9 9 109 109 1109 6109 18 19 ZAAAAA XQDAAA VVVVxx +7905 2468 1 1 5 5 5 905 1905 2905 7905 10 11 BSAAAA YQDAAA AAAAxx +6498 2469 0 2 8 18 98 498 498 1498 6498 196 197 YPAAAA ZQDAAA HHHHxx +2034 2470 0 2 4 14 34 34 34 2034 2034 68 69 GAAAAA ARDAAA OOOOxx +7693 2471 1 1 3 13 93 693 1693 2693 7693 186 187 XJAAAA BRDAAA VVVVxx +7511 2472 1 3 1 11 11 511 1511 2511 7511 22 23 XCAAAA CRDAAA AAAAxx +7531 2473 1 3 1 11 31 531 1531 2531 7531 62 63 RDAAAA DRDAAA HHHHxx +6869 2474 1 1 9 9 69 869 869 1869 6869 138 139 FEAAAA ERDAAA OOOOxx +2763 2475 1 3 3 3 63 763 763 2763 2763 126 127 HCAAAA FRDAAA VVVVxx +575 2476 1 3 5 15 75 575 575 575 575 150 151 DWAAAA GRDAAA AAAAxx +8953 2477 1 1 3 13 53 953 953 3953 8953 106 107 JGAAAA HRDAAA HHHHxx +5833 2478 1 1 3 13 33 833 1833 833 5833 66 67 JQAAAA IRDAAA OOOOxx +9035 2479 1 3 5 15 35 35 1035 4035 9035 70 71 NJAAAA JRDAAA VVVVxx +9123 2480 1 3 3 3 23 123 1123 4123 9123 46 47 XMAAAA KRDAAA AAAAxx +206 2481 0 2 6 6 6 206 206 206 206 12 13 YHAAAA LRDAAA HHHHxx +4155 2482 1 3 5 15 55 155 155 4155 4155 110 111 VDAAAA MRDAAA OOOOxx +532 2483 0 0 2 12 32 532 532 532 532 64 65 MUAAAA NRDAAA VVVVxx +1370 2484 0 2 0 10 70 370 1370 1370 1370 140 141 SAAAAA ORDAAA AAAAxx +7656 2485 0 0 6 16 56 656 1656 2656 7656 112 113 MIAAAA PRDAAA HHHHxx +7735 2486 1 3 5 15 35 735 1735 2735 7735 70 71 NLAAAA QRDAAA OOOOxx +2118 2487 0 2 8 18 18 118 118 2118 2118 36 37 MDAAAA RRDAAA VVVVxx +6914 2488 0 2 4 14 14 914 914 1914 6914 28 29 YFAAAA SRDAAA AAAAxx +6277 2489 1 1 7 17 77 277 277 1277 6277 154 155 LHAAAA TRDAAA HHHHxx +6347 2490 1 3 7 7 47 347 347 1347 6347 94 95 DKAAAA URDAAA OOOOxx +4030 2491 0 2 0 10 30 30 30 4030 4030 60 61 AZAAAA VRDAAA VVVVxx +9673 2492 1 1 3 13 73 673 1673 4673 9673 146 147 BIAAAA WRDAAA AAAAxx +2015 2493 1 3 5 15 15 15 15 2015 2015 30 31 NZAAAA XRDAAA HHHHxx +1317 2494 1 1 7 17 17 317 1317 1317 1317 34 35 RYAAAA YRDAAA OOOOxx +404 2495 0 0 4 4 4 404 404 404 404 8 9 OPAAAA ZRDAAA VVVVxx +1604 2496 0 0 4 4 4 604 1604 1604 1604 8 9 SJAAAA ASDAAA AAAAxx +1912 2497 0 0 2 12 12 912 1912 1912 1912 24 25 OVAAAA BSDAAA HHHHxx +5727 2498 1 3 7 7 27 727 1727 727 5727 54 55 HMAAAA CSDAAA OOOOxx +4538 2499 0 2 8 18 38 538 538 4538 4538 76 77 OSAAAA DSDAAA VVVVxx +6868 2500 0 0 8 8 68 868 868 1868 6868 136 137 EEAAAA ESDAAA AAAAxx +9801 2501 1 1 1 1 1 801 1801 4801 9801 2 3 ZMAAAA FSDAAA HHHHxx +1781 2502 1 1 1 1 81 781 1781 1781 1781 162 163 NQAAAA GSDAAA OOOOxx +7061 2503 1 1 1 1 61 61 1061 2061 7061 122 123 PLAAAA HSDAAA VVVVxx +2412 2504 0 0 2 12 12 412 412 2412 2412 24 25 UOAAAA ISDAAA AAAAxx +9191 2505 1 3 1 11 91 191 1191 4191 9191 182 183 NPAAAA JSDAAA HHHHxx +1958 2506 0 2 8 18 58 958 1958 1958 1958 116 117 IXAAAA KSDAAA OOOOxx +2203 2507 1 3 3 3 3 203 203 2203 2203 6 7 TGAAAA LSDAAA VVVVxx +9104 2508 0 0 4 4 4 104 1104 4104 9104 8 9 EMAAAA MSDAAA AAAAxx +3837 2509 1 1 7 17 37 837 1837 3837 3837 74 75 PRAAAA NSDAAA HHHHxx +7055 2510 1 3 5 15 55 55 1055 2055 7055 110 111 JLAAAA OSDAAA OOOOxx +4612 2511 0 0 2 12 12 612 612 4612 4612 24 25 KVAAAA PSDAAA VVVVxx +6420 2512 0 0 0 0 20 420 420 1420 6420 40 41 YMAAAA QSDAAA AAAAxx +613 2513 1 1 3 13 13 613 613 613 613 26 27 PXAAAA RSDAAA HHHHxx +1691 2514 1 3 1 11 91 691 1691 1691 1691 182 183 BNAAAA SSDAAA OOOOxx +33 2515 1 1 3 13 33 33 33 33 33 66 67 HBAAAA TSDAAA VVVVxx +875 2516 1 3 5 15 75 875 875 875 875 150 151 RHAAAA USDAAA AAAAxx +9030 2517 0 2 0 10 30 30 1030 4030 9030 60 61 IJAAAA VSDAAA HHHHxx +4285 2518 1 1 5 5 85 285 285 4285 4285 170 171 VIAAAA WSDAAA OOOOxx +6236 2519 0 0 6 16 36 236 236 1236 6236 72 73 WFAAAA XSDAAA VVVVxx +4702 2520 0 2 2 2 2 702 702 4702 4702 4 5 WYAAAA YSDAAA AAAAxx +3441 2521 1 1 1 1 41 441 1441 3441 3441 82 83 JCAAAA ZSDAAA HHHHxx +2150 2522 0 2 0 10 50 150 150 2150 2150 100 101 SEAAAA ATDAAA OOOOxx +1852 2523 0 0 2 12 52 852 1852 1852 1852 104 105 GTAAAA BTDAAA VVVVxx +7713 2524 1 1 3 13 13 713 1713 2713 7713 26 27 RKAAAA CTDAAA AAAAxx +6849 2525 1 1 9 9 49 849 849 1849 6849 98 99 LDAAAA DTDAAA HHHHxx +3425 2526 1 1 5 5 25 425 1425 3425 3425 50 51 TBAAAA ETDAAA OOOOxx +4681 2527 1 1 1 1 81 681 681 4681 4681 162 163 BYAAAA FTDAAA VVVVxx +1134 2528 0 2 4 14 34 134 1134 1134 1134 68 69 QRAAAA GTDAAA AAAAxx +7462 2529 0 2 2 2 62 462 1462 2462 7462 124 125 ABAAAA HTDAAA HHHHxx +2148 2530 0 0 8 8 48 148 148 2148 2148 96 97 QEAAAA ITDAAA OOOOxx +5921 2531 1 1 1 1 21 921 1921 921 5921 42 43 TTAAAA JTDAAA VVVVxx +118 2532 0 2 8 18 18 118 118 118 118 36 37 OEAAAA KTDAAA AAAAxx +3065 2533 1 1 5 5 65 65 1065 3065 3065 130 131 XNAAAA LTDAAA HHHHxx +6590 2534 0 2 0 10 90 590 590 1590 6590 180 181 MTAAAA MTDAAA OOOOxx +4993 2535 1 1 3 13 93 993 993 4993 4993 186 187 BKAAAA NTDAAA VVVVxx +6818 2536 0 2 8 18 18 818 818 1818 6818 36 37 GCAAAA OTDAAA AAAAxx +1449 2537 1 1 9 9 49 449 1449 1449 1449 98 99 TDAAAA PTDAAA HHHHxx +2039 2538 1 3 9 19 39 39 39 2039 2039 78 79 LAAAAA QTDAAA OOOOxx +2524 2539 0 0 4 4 24 524 524 2524 2524 48 49 CTAAAA RTDAAA VVVVxx +1481 2540 1 1 1 1 81 481 1481 1481 1481 162 163 ZEAAAA STDAAA AAAAxx +6984 2541 0 0 4 4 84 984 984 1984 6984 168 169 QIAAAA TTDAAA HHHHxx +3960 2542 0 0 0 0 60 960 1960 3960 3960 120 121 IWAAAA UTDAAA OOOOxx +1983 2543 1 3 3 3 83 983 1983 1983 1983 166 167 HYAAAA VTDAAA VVVVxx +6379 2544 1 3 9 19 79 379 379 1379 6379 158 159 JLAAAA WTDAAA AAAAxx +8975 2545 1 3 5 15 75 975 975 3975 8975 150 151 FHAAAA XTDAAA HHHHxx +1102 2546 0 2 2 2 2 102 1102 1102 1102 4 5 KQAAAA YTDAAA OOOOxx +2517 2547 1 1 7 17 17 517 517 2517 2517 34 35 VSAAAA ZTDAAA VVVVxx +712 2548 0 0 2 12 12 712 712 712 712 24 25 KBAAAA AUDAAA AAAAxx +5419 2549 1 3 9 19 19 419 1419 419 5419 38 39 LAAAAA BUDAAA HHHHxx +723 2550 1 3 3 3 23 723 723 723 723 46 47 VBAAAA CUDAAA OOOOxx +8057 2551 1 1 7 17 57 57 57 3057 8057 114 115 XXAAAA DUDAAA VVVVxx +7471 2552 1 3 1 11 71 471 1471 2471 7471 142 143 JBAAAA EUDAAA AAAAxx +8855 2553 1 3 5 15 55 855 855 3855 8855 110 111 PCAAAA FUDAAA HHHHxx +5074 2554 0 2 4 14 74 74 1074 74 5074 148 149 ENAAAA GUDAAA OOOOxx +7139 2555 1 3 9 19 39 139 1139 2139 7139 78 79 POAAAA HUDAAA VVVVxx +3833 2556 1 1 3 13 33 833 1833 3833 3833 66 67 LRAAAA IUDAAA AAAAxx +5186 2557 0 2 6 6 86 186 1186 186 5186 172 173 MRAAAA JUDAAA HHHHxx +9436 2558 0 0 6 16 36 436 1436 4436 9436 72 73 YYAAAA KUDAAA OOOOxx +8859 2559 1 3 9 19 59 859 859 3859 8859 118 119 TCAAAA LUDAAA VVVVxx +6943 2560 1 3 3 3 43 943 943 1943 6943 86 87 BHAAAA MUDAAA AAAAxx +2315 2561 1 3 5 15 15 315 315 2315 2315 30 31 BLAAAA NUDAAA HHHHxx +1394 2562 0 2 4 14 94 394 1394 1394 1394 188 189 QBAAAA OUDAAA OOOOxx +8863 2563 1 3 3 3 63 863 863 3863 8863 126 127 XCAAAA PUDAAA VVVVxx +8812 2564 0 0 2 12 12 812 812 3812 8812 24 25 YAAAAA QUDAAA AAAAxx +7498 2565 0 2 8 18 98 498 1498 2498 7498 196 197 KCAAAA RUDAAA HHHHxx +8962 2566 0 2 2 2 62 962 962 3962 8962 124 125 SGAAAA SUDAAA OOOOxx +2533 2567 1 1 3 13 33 533 533 2533 2533 66 67 LTAAAA TUDAAA VVVVxx +8188 2568 0 0 8 8 88 188 188 3188 8188 176 177 YCAAAA UUDAAA AAAAxx +6137 2569 1 1 7 17 37 137 137 1137 6137 74 75 BCAAAA VUDAAA HHHHxx +974 2570 0 2 4 14 74 974 974 974 974 148 149 MLAAAA WUDAAA OOOOxx +2751 2571 1 3 1 11 51 751 751 2751 2751 102 103 VBAAAA XUDAAA VVVVxx +4975 2572 1 3 5 15 75 975 975 4975 4975 150 151 JJAAAA YUDAAA AAAAxx +3411 2573 1 3 1 11 11 411 1411 3411 3411 22 23 FBAAAA ZUDAAA HHHHxx +3143 2574 1 3 3 3 43 143 1143 3143 3143 86 87 XQAAAA AVDAAA OOOOxx +8011 2575 1 3 1 11 11 11 11 3011 8011 22 23 DWAAAA BVDAAA VVVVxx +988 2576 0 0 8 8 88 988 988 988 988 176 177 AMAAAA CVDAAA AAAAxx +4289 2577 1 1 9 9 89 289 289 4289 4289 178 179 ZIAAAA DVDAAA HHHHxx +8105 2578 1 1 5 5 5 105 105 3105 8105 10 11 TZAAAA EVDAAA OOOOxx +9885 2579 1 1 5 5 85 885 1885 4885 9885 170 171 FQAAAA FVDAAA VVVVxx +1002 2580 0 2 2 2 2 2 1002 1002 1002 4 5 OMAAAA GVDAAA AAAAxx +5827 2581 1 3 7 7 27 827 1827 827 5827 54 55 DQAAAA HVDAAA HHHHxx +1228 2582 0 0 8 8 28 228 1228 1228 1228 56 57 GVAAAA IVDAAA OOOOxx +6352 2583 0 0 2 12 52 352 352 1352 6352 104 105 IKAAAA JVDAAA VVVVxx +8868 2584 0 0 8 8 68 868 868 3868 8868 136 137 CDAAAA KVDAAA AAAAxx +3643 2585 1 3 3 3 43 643 1643 3643 3643 86 87 DKAAAA LVDAAA HHHHxx +1468 2586 0 0 8 8 68 468 1468 1468 1468 136 137 MEAAAA MVDAAA OOOOxx +8415 2587 1 3 5 15 15 415 415 3415 8415 30 31 RLAAAA NVDAAA VVVVxx +9631 2588 1 3 1 11 31 631 1631 4631 9631 62 63 LGAAAA OVDAAA AAAAxx +7408 2589 0 0 8 8 8 408 1408 2408 7408 16 17 YYAAAA PVDAAA HHHHxx +1934 2590 0 2 4 14 34 934 1934 1934 1934 68 69 KWAAAA QVDAAA OOOOxx +996 2591 0 0 6 16 96 996 996 996 996 192 193 IMAAAA RVDAAA VVVVxx +8027 2592 1 3 7 7 27 27 27 3027 8027 54 55 TWAAAA SVDAAA AAAAxx +8464 2593 0 0 4 4 64 464 464 3464 8464 128 129 ONAAAA TVDAAA HHHHxx +5007 2594 1 3 7 7 7 7 1007 7 5007 14 15 PKAAAA UVDAAA OOOOxx +8356 2595 0 0 6 16 56 356 356 3356 8356 112 113 KJAAAA VVDAAA VVVVxx +4579 2596 1 3 9 19 79 579 579 4579 4579 158 159 DUAAAA WVDAAA AAAAxx +8513 2597 1 1 3 13 13 513 513 3513 8513 26 27 LPAAAA XVDAAA HHHHxx +383 2598 1 3 3 3 83 383 383 383 383 166 167 TOAAAA YVDAAA OOOOxx +9304 2599 0 0 4 4 4 304 1304 4304 9304 8 9 WTAAAA ZVDAAA VVVVxx +7224 2600 0 0 4 4 24 224 1224 2224 7224 48 49 WRAAAA AWDAAA AAAAxx +6023 2601 1 3 3 3 23 23 23 1023 6023 46 47 RXAAAA BWDAAA HHHHxx +2746 2602 0 2 6 6 46 746 746 2746 2746 92 93 QBAAAA CWDAAA OOOOxx +137 2603 1 1 7 17 37 137 137 137 137 74 75 HFAAAA DWDAAA VVVVxx +9441 2604 1 1 1 1 41 441 1441 4441 9441 82 83 DZAAAA EWDAAA AAAAxx +3690 2605 0 2 0 10 90 690 1690 3690 3690 180 181 YLAAAA FWDAAA HHHHxx +913 2606 1 1 3 13 13 913 913 913 913 26 27 DJAAAA GWDAAA OOOOxx +1768 2607 0 0 8 8 68 768 1768 1768 1768 136 137 AQAAAA HWDAAA VVVVxx +8492 2608 0 0 2 12 92 492 492 3492 8492 184 185 QOAAAA IWDAAA AAAAxx +8083 2609 1 3 3 3 83 83 83 3083 8083 166 167 XYAAAA JWDAAA HHHHxx +4609 2610 1 1 9 9 9 609 609 4609 4609 18 19 HVAAAA KWDAAA OOOOxx +7520 2611 0 0 0 0 20 520 1520 2520 7520 40 41 GDAAAA LWDAAA VVVVxx +4231 2612 1 3 1 11 31 231 231 4231 4231 62 63 TGAAAA MWDAAA AAAAxx +6022 2613 0 2 2 2 22 22 22 1022 6022 44 45 QXAAAA NWDAAA HHHHxx +9784 2614 0 0 4 4 84 784 1784 4784 9784 168 169 IMAAAA OWDAAA OOOOxx +1343 2615 1 3 3 3 43 343 1343 1343 1343 86 87 RZAAAA PWDAAA VVVVxx +7549 2616 1 1 9 9 49 549 1549 2549 7549 98 99 JEAAAA QWDAAA AAAAxx +269 2617 1 1 9 9 69 269 269 269 269 138 139 JKAAAA RWDAAA HHHHxx +1069 2618 1 1 9 9 69 69 1069 1069 1069 138 139 DPAAAA SWDAAA OOOOxx +4610 2619 0 2 0 10 10 610 610 4610 4610 20 21 IVAAAA TWDAAA VVVVxx +482 2620 0 2 2 2 82 482 482 482 482 164 165 OSAAAA UWDAAA AAAAxx +3025 2621 1 1 5 5 25 25 1025 3025 3025 50 51 JMAAAA VWDAAA HHHHxx +7914 2622 0 2 4 14 14 914 1914 2914 7914 28 29 KSAAAA WWDAAA OOOOxx +3198 2623 0 2 8 18 98 198 1198 3198 3198 196 197 ATAAAA XWDAAA VVVVxx +1187 2624 1 3 7 7 87 187 1187 1187 1187 174 175 RTAAAA YWDAAA AAAAxx +4707 2625 1 3 7 7 7 707 707 4707 4707 14 15 BZAAAA ZWDAAA HHHHxx +8279 2626 1 3 9 19 79 279 279 3279 8279 158 159 LGAAAA AXDAAA OOOOxx +6127 2627 1 3 7 7 27 127 127 1127 6127 54 55 RBAAAA BXDAAA VVVVxx +1305 2628 1 1 5 5 5 305 1305 1305 1305 10 11 FYAAAA CXDAAA AAAAxx +4804 2629 0 0 4 4 4 804 804 4804 4804 8 9 UCAAAA DXDAAA HHHHxx +6069 2630 1 1 9 9 69 69 69 1069 6069 138 139 LZAAAA EXDAAA OOOOxx +9229 2631 1 1 9 9 29 229 1229 4229 9229 58 59 ZQAAAA FXDAAA VVVVxx +4703 2632 1 3 3 3 3 703 703 4703 4703 6 7 XYAAAA GXDAAA AAAAxx +6410 2633 0 2 0 10 10 410 410 1410 6410 20 21 OMAAAA HXDAAA HHHHxx +944 2634 0 0 4 4 44 944 944 944 944 88 89 IKAAAA IXDAAA OOOOxx +3744 2635 0 0 4 4 44 744 1744 3744 3744 88 89 AOAAAA JXDAAA VVVVxx +1127 2636 1 3 7 7 27 127 1127 1127 1127 54 55 JRAAAA KXDAAA AAAAxx +6693 2637 1 1 3 13 93 693 693 1693 6693 186 187 LXAAAA LXDAAA HHHHxx +583 2638 1 3 3 3 83 583 583 583 583 166 167 LWAAAA MXDAAA OOOOxx +2684 2639 0 0 4 4 84 684 684 2684 2684 168 169 GZAAAA NXDAAA VVVVxx +6192 2640 0 0 2 12 92 192 192 1192 6192 184 185 EEAAAA OXDAAA AAAAxx +4157 2641 1 1 7 17 57 157 157 4157 4157 114 115 XDAAAA PXDAAA HHHHxx +6470 2642 0 2 0 10 70 470 470 1470 6470 140 141 WOAAAA QXDAAA OOOOxx +8965 2643 1 1 5 5 65 965 965 3965 8965 130 131 VGAAAA RXDAAA VVVVxx +1433 2644 1 1 3 13 33 433 1433 1433 1433 66 67 DDAAAA SXDAAA AAAAxx +4570 2645 0 2 0 10 70 570 570 4570 4570 140 141 UTAAAA TXDAAA HHHHxx +1806 2646 0 2 6 6 6 806 1806 1806 1806 12 13 MRAAAA UXDAAA OOOOxx +1230 2647 0 2 0 10 30 230 1230 1230 1230 60 61 IVAAAA VXDAAA VVVVxx +2283 2648 1 3 3 3 83 283 283 2283 2283 166 167 VJAAAA WXDAAA AAAAxx +6456 2649 0 0 6 16 56 456 456 1456 6456 112 113 IOAAAA XXDAAA HHHHxx +7427 2650 1 3 7 7 27 427 1427 2427 7427 54 55 RZAAAA YXDAAA OOOOxx +8310 2651 0 2 0 10 10 310 310 3310 8310 20 21 QHAAAA ZXDAAA VVVVxx +8103 2652 1 3 3 3 3 103 103 3103 8103 6 7 RZAAAA AYDAAA AAAAxx +3947 2653 1 3 7 7 47 947 1947 3947 3947 94 95 VVAAAA BYDAAA HHHHxx +3414 2654 0 2 4 14 14 414 1414 3414 3414 28 29 IBAAAA CYDAAA OOOOxx +2043 2655 1 3 3 3 43 43 43 2043 2043 86 87 PAAAAA DYDAAA VVVVxx +4393 2656 1 1 3 13 93 393 393 4393 4393 186 187 ZMAAAA EYDAAA AAAAxx +6664 2657 0 0 4 4 64 664 664 1664 6664 128 129 IWAAAA FYDAAA HHHHxx +4545 2658 1 1 5 5 45 545 545 4545 4545 90 91 VSAAAA GYDAAA OOOOxx +7637 2659 1 1 7 17 37 637 1637 2637 7637 74 75 THAAAA HYDAAA VVVVxx +1359 2660 1 3 9 19 59 359 1359 1359 1359 118 119 HAAAAA IYDAAA AAAAxx +5018 2661 0 2 8 18 18 18 1018 18 5018 36 37 ALAAAA JYDAAA HHHHxx +987 2662 1 3 7 7 87 987 987 987 987 174 175 ZLAAAA KYDAAA OOOOxx +1320 2663 0 0 0 0 20 320 1320 1320 1320 40 41 UYAAAA LYDAAA VVVVxx +9311 2664 1 3 1 11 11 311 1311 4311 9311 22 23 DUAAAA MYDAAA AAAAxx +7993 2665 1 1 3 13 93 993 1993 2993 7993 186 187 LVAAAA NYDAAA HHHHxx +7588 2666 0 0 8 8 88 588 1588 2588 7588 176 177 WFAAAA OYDAAA OOOOxx +5983 2667 1 3 3 3 83 983 1983 983 5983 166 167 DWAAAA PYDAAA VVVVxx +4070 2668 0 2 0 10 70 70 70 4070 4070 140 141 OAAAAA QYDAAA AAAAxx +8349 2669 1 1 9 9 49 349 349 3349 8349 98 99 DJAAAA RYDAAA HHHHxx +3810 2670 0 2 0 10 10 810 1810 3810 3810 20 21 OQAAAA SYDAAA OOOOxx +6948 2671 0 0 8 8 48 948 948 1948 6948 96 97 GHAAAA TYDAAA VVVVxx +7153 2672 1 1 3 13 53 153 1153 2153 7153 106 107 DPAAAA UYDAAA AAAAxx +5371 2673 1 3 1 11 71 371 1371 371 5371 142 143 PYAAAA VYDAAA HHHHxx +8316 2674 0 0 6 16 16 316 316 3316 8316 32 33 WHAAAA WYDAAA OOOOxx +5903 2675 1 3 3 3 3 903 1903 903 5903 6 7 BTAAAA XYDAAA VVVVxx +6718 2676 0 2 8 18 18 718 718 1718 6718 36 37 KYAAAA YYDAAA AAAAxx +4759 2677 1 3 9 19 59 759 759 4759 4759 118 119 BBAAAA ZYDAAA HHHHxx +2555 2678 1 3 5 15 55 555 555 2555 2555 110 111 HUAAAA AZDAAA OOOOxx +3457 2679 1 1 7 17 57 457 1457 3457 3457 114 115 ZCAAAA BZDAAA VVVVxx +9626 2680 0 2 6 6 26 626 1626 4626 9626 52 53 GGAAAA CZDAAA AAAAxx +2570 2681 0 2 0 10 70 570 570 2570 2570 140 141 WUAAAA DZDAAA HHHHxx +7964 2682 0 0 4 4 64 964 1964 2964 7964 128 129 IUAAAA EZDAAA OOOOxx +1543 2683 1 3 3 3 43 543 1543 1543 1543 86 87 JHAAAA FZDAAA VVVVxx +929 2684 1 1 9 9 29 929 929 929 929 58 59 TJAAAA GZDAAA AAAAxx +9244 2685 0 0 4 4 44 244 1244 4244 9244 88 89 ORAAAA HZDAAA HHHHxx +9210 2686 0 2 0 10 10 210 1210 4210 9210 20 21 GQAAAA IZDAAA OOOOxx +8334 2687 0 2 4 14 34 334 334 3334 8334 68 69 OIAAAA JZDAAA VVVVxx +9310 2688 0 2 0 10 10 310 1310 4310 9310 20 21 CUAAAA KZDAAA AAAAxx +5024 2689 0 0 4 4 24 24 1024 24 5024 48 49 GLAAAA LZDAAA HHHHxx +8794 2690 0 2 4 14 94 794 794 3794 8794 188 189 GAAAAA MZDAAA OOOOxx +4091 2691 1 3 1 11 91 91 91 4091 4091 182 183 JBAAAA NZDAAA VVVVxx +649 2692 1 1 9 9 49 649 649 649 649 98 99 ZYAAAA OZDAAA AAAAxx +8505 2693 1 1 5 5 5 505 505 3505 8505 10 11 DPAAAA PZDAAA HHHHxx +6652 2694 0 0 2 12 52 652 652 1652 6652 104 105 WVAAAA QZDAAA OOOOxx +8945 2695 1 1 5 5 45 945 945 3945 8945 90 91 BGAAAA RZDAAA VVVVxx +2095 2696 1 3 5 15 95 95 95 2095 2095 190 191 PCAAAA SZDAAA AAAAxx +8676 2697 0 0 6 16 76 676 676 3676 8676 152 153 SVAAAA TZDAAA HHHHxx +3994 2698 0 2 4 14 94 994 1994 3994 3994 188 189 QXAAAA UZDAAA OOOOxx +2859 2699 1 3 9 19 59 859 859 2859 2859 118 119 ZFAAAA VZDAAA VVVVxx +5403 2700 1 3 3 3 3 403 1403 403 5403 6 7 VZAAAA WZDAAA AAAAxx +3254 2701 0 2 4 14 54 254 1254 3254 3254 108 109 EVAAAA XZDAAA HHHHxx +7339 2702 1 3 9 19 39 339 1339 2339 7339 78 79 HWAAAA YZDAAA OOOOxx +7220 2703 0 0 0 0 20 220 1220 2220 7220 40 41 SRAAAA ZZDAAA VVVVxx +4154 2704 0 2 4 14 54 154 154 4154 4154 108 109 UDAAAA AAEAAA AAAAxx +7570 2705 0 2 0 10 70 570 1570 2570 7570 140 141 EFAAAA BAEAAA HHHHxx +2576 2706 0 0 6 16 76 576 576 2576 2576 152 153 CVAAAA CAEAAA OOOOxx +5764 2707 0 0 4 4 64 764 1764 764 5764 128 129 SNAAAA DAEAAA VVVVxx +4314 2708 0 2 4 14 14 314 314 4314 4314 28 29 YJAAAA EAEAAA AAAAxx +2274 2709 0 2 4 14 74 274 274 2274 2274 148 149 MJAAAA FAEAAA HHHHxx +9756 2710 0 0 6 16 56 756 1756 4756 9756 112 113 GLAAAA GAEAAA OOOOxx +8274 2711 0 2 4 14 74 274 274 3274 8274 148 149 GGAAAA HAEAAA VVVVxx +1289 2712 1 1 9 9 89 289 1289 1289 1289 178 179 PXAAAA IAEAAA AAAAxx +7335 2713 1 3 5 15 35 335 1335 2335 7335 70 71 DWAAAA JAEAAA HHHHxx +5351 2714 1 3 1 11 51 351 1351 351 5351 102 103 VXAAAA KAEAAA OOOOxx +8978 2715 0 2 8 18 78 978 978 3978 8978 156 157 IHAAAA LAEAAA VVVVxx +2 2716 0 2 2 2 2 2 2 2 2 4 5 CAAAAA MAEAAA AAAAxx +8906 2717 0 2 6 6 6 906 906 3906 8906 12 13 OEAAAA NAEAAA HHHHxx +6388 2718 0 0 8 8 88 388 388 1388 6388 176 177 SLAAAA OAEAAA OOOOxx +5675 2719 1 3 5 15 75 675 1675 675 5675 150 151 HKAAAA PAEAAA VVVVxx +255 2720 1 3 5 15 55 255 255 255 255 110 111 VJAAAA QAEAAA AAAAxx +9538 2721 0 2 8 18 38 538 1538 4538 9538 76 77 WCAAAA RAEAAA HHHHxx +1480 2722 0 0 0 0 80 480 1480 1480 1480 160 161 YEAAAA SAEAAA OOOOxx +4015 2723 1 3 5 15 15 15 15 4015 4015 30 31 LYAAAA TAEAAA VVVVxx +5166 2724 0 2 6 6 66 166 1166 166 5166 132 133 SQAAAA UAEAAA AAAAxx +91 2725 1 3 1 11 91 91 91 91 91 182 183 NDAAAA VAEAAA HHHHxx +2958 2726 0 2 8 18 58 958 958 2958 2958 116 117 UJAAAA WAEAAA OOOOxx +9131 2727 1 3 1 11 31 131 1131 4131 9131 62 63 FNAAAA XAEAAA VVVVxx +3944 2728 0 0 4 4 44 944 1944 3944 3944 88 89 SVAAAA YAEAAA AAAAxx +4514 2729 0 2 4 14 14 514 514 4514 4514 28 29 QRAAAA ZAEAAA HHHHxx +5661 2730 1 1 1 1 61 661 1661 661 5661 122 123 TJAAAA ABEAAA OOOOxx +8724 2731 0 0 4 4 24 724 724 3724 8724 48 49 OXAAAA BBEAAA VVVVxx +6408 2732 0 0 8 8 8 408 408 1408 6408 16 17 MMAAAA CBEAAA AAAAxx +5013 2733 1 1 3 13 13 13 1013 13 5013 26 27 VKAAAA DBEAAA HHHHxx +6156 2734 0 0 6 16 56 156 156 1156 6156 112 113 UCAAAA EBEAAA OOOOxx +7350 2735 0 2 0 10 50 350 1350 2350 7350 100 101 SWAAAA FBEAAA VVVVxx +9858 2736 0 2 8 18 58 858 1858 4858 9858 116 117 EPAAAA GBEAAA AAAAxx +895 2737 1 3 5 15 95 895 895 895 895 190 191 LIAAAA HBEAAA HHHHxx +8368 2738 0 0 8 8 68 368 368 3368 8368 136 137 WJAAAA IBEAAA OOOOxx +179 2739 1 3 9 19 79 179 179 179 179 158 159 XGAAAA JBEAAA VVVVxx +4048 2740 0 0 8 8 48 48 48 4048 4048 96 97 SZAAAA KBEAAA AAAAxx +3073 2741 1 1 3 13 73 73 1073 3073 3073 146 147 FOAAAA LBEAAA HHHHxx +321 2742 1 1 1 1 21 321 321 321 321 42 43 JMAAAA MBEAAA OOOOxx +5352 2743 0 0 2 12 52 352 1352 352 5352 104 105 WXAAAA NBEAAA VVVVxx +1940 2744 0 0 0 0 40 940 1940 1940 1940 80 81 QWAAAA OBEAAA AAAAxx +8803 2745 1 3 3 3 3 803 803 3803 8803 6 7 PAAAAA PBEAAA HHHHxx +791 2746 1 3 1 11 91 791 791 791 791 182 183 LEAAAA QBEAAA OOOOxx +9809 2747 1 1 9 9 9 809 1809 4809 9809 18 19 HNAAAA RBEAAA VVVVxx +5519 2748 1 3 9 19 19 519 1519 519 5519 38 39 HEAAAA SBEAAA AAAAxx +7420 2749 0 0 0 0 20 420 1420 2420 7420 40 41 KZAAAA TBEAAA HHHHxx +7541 2750 1 1 1 1 41 541 1541 2541 7541 82 83 BEAAAA UBEAAA OOOOxx +6538 2751 0 2 8 18 38 538 538 1538 6538 76 77 MRAAAA VBEAAA VVVVxx +710 2752 0 2 0 10 10 710 710 710 710 20 21 IBAAAA WBEAAA AAAAxx +9488 2753 0 0 8 8 88 488 1488 4488 9488 176 177 YAAAAA XBEAAA HHHHxx +3135 2754 1 3 5 15 35 135 1135 3135 3135 70 71 PQAAAA YBEAAA OOOOxx +4273 2755 1 1 3 13 73 273 273 4273 4273 146 147 JIAAAA ZBEAAA VVVVxx +629 2756 1 1 9 9 29 629 629 629 629 58 59 FYAAAA ACEAAA AAAAxx +9167 2757 1 3 7 7 67 167 1167 4167 9167 134 135 POAAAA BCEAAA HHHHxx +751 2758 1 3 1 11 51 751 751 751 751 102 103 XCAAAA CCEAAA OOOOxx +1126 2759 0 2 6 6 26 126 1126 1126 1126 52 53 IRAAAA DCEAAA VVVVxx +3724 2760 0 0 4 4 24 724 1724 3724 3724 48 49 GNAAAA ECEAAA AAAAxx +1789 2761 1 1 9 9 89 789 1789 1789 1789 178 179 VQAAAA FCEAAA HHHHxx +792 2762 0 0 2 12 92 792 792 792 792 184 185 MEAAAA GCEAAA OOOOxx +2771 2763 1 3 1 11 71 771 771 2771 2771 142 143 PCAAAA HCEAAA VVVVxx +4313 2764 1 1 3 13 13 313 313 4313 4313 26 27 XJAAAA ICEAAA AAAAxx +9312 2765 0 0 2 12 12 312 1312 4312 9312 24 25 EUAAAA JCEAAA HHHHxx +955 2766 1 3 5 15 55 955 955 955 955 110 111 TKAAAA KCEAAA OOOOxx +6382 2767 0 2 2 2 82 382 382 1382 6382 164 165 MLAAAA LCEAAA VVVVxx +7875 2768 1 3 5 15 75 875 1875 2875 7875 150 151 XQAAAA MCEAAA AAAAxx +7491 2769 1 3 1 11 91 491 1491 2491 7491 182 183 DCAAAA NCEAAA HHHHxx +8193 2770 1 1 3 13 93 193 193 3193 8193 186 187 DDAAAA OCEAAA OOOOxx +968 2771 0 0 8 8 68 968 968 968 968 136 137 GLAAAA PCEAAA VVVVxx +4951 2772 1 3 1 11 51 951 951 4951 4951 102 103 LIAAAA QCEAAA AAAAxx +2204 2773 0 0 4 4 4 204 204 2204 2204 8 9 UGAAAA RCEAAA HHHHxx +2066 2774 0 2 6 6 66 66 66 2066 2066 132 133 MBAAAA SCEAAA OOOOxx +2631 2775 1 3 1 11 31 631 631 2631 2631 62 63 FXAAAA TCEAAA VVVVxx +8947 2776 1 3 7 7 47 947 947 3947 8947 94 95 DGAAAA UCEAAA AAAAxx +8033 2777 1 1 3 13 33 33 33 3033 8033 66 67 ZWAAAA VCEAAA HHHHxx +6264 2778 0 0 4 4 64 264 264 1264 6264 128 129 YGAAAA WCEAAA OOOOxx +7778 2779 0 2 8 18 78 778 1778 2778 7778 156 157 ENAAAA XCEAAA VVVVxx +9701 2780 1 1 1 1 1 701 1701 4701 9701 2 3 DJAAAA YCEAAA AAAAxx +5091 2781 1 3 1 11 91 91 1091 91 5091 182 183 VNAAAA ZCEAAA HHHHxx +7577 2782 1 1 7 17 77 577 1577 2577 7577 154 155 LFAAAA ADEAAA OOOOxx +3345 2783 1 1 5 5 45 345 1345 3345 3345 90 91 RYAAAA BDEAAA VVVVxx +7329 2784 1 1 9 9 29 329 1329 2329 7329 58 59 XVAAAA CDEAAA AAAAxx +7551 2785 1 3 1 11 51 551 1551 2551 7551 102 103 LEAAAA DDEAAA HHHHxx +6207 2786 1 3 7 7 7 207 207 1207 6207 14 15 TEAAAA EDEAAA OOOOxx +8664 2787 0 0 4 4 64 664 664 3664 8664 128 129 GVAAAA FDEAAA VVVVxx +8394 2788 0 2 4 14 94 394 394 3394 8394 188 189 WKAAAA GDEAAA AAAAxx +7324 2789 0 0 4 4 24 324 1324 2324 7324 48 49 SVAAAA HDEAAA HHHHxx +2713 2790 1 1 3 13 13 713 713 2713 2713 26 27 JAAAAA IDEAAA OOOOxx +2230 2791 0 2 0 10 30 230 230 2230 2230 60 61 UHAAAA JDEAAA VVVVxx +9211 2792 1 3 1 11 11 211 1211 4211 9211 22 23 HQAAAA KDEAAA AAAAxx +1296 2793 0 0 6 16 96 296 1296 1296 1296 192 193 WXAAAA LDEAAA HHHHxx +8104 2794 0 0 4 4 4 104 104 3104 8104 8 9 SZAAAA MDEAAA OOOOxx +6916 2795 0 0 6 16 16 916 916 1916 6916 32 33 AGAAAA NDEAAA VVVVxx +2208 2796 0 0 8 8 8 208 208 2208 2208 16 17 YGAAAA ODEAAA AAAAxx +3935 2797 1 3 5 15 35 935 1935 3935 3935 70 71 JVAAAA PDEAAA HHHHxx +7814 2798 0 2 4 14 14 814 1814 2814 7814 28 29 OOAAAA QDEAAA OOOOxx +6508 2799 0 0 8 8 8 508 508 1508 6508 16 17 IQAAAA RDEAAA VVVVxx +1703 2800 1 3 3 3 3 703 1703 1703 1703 6 7 NNAAAA SDEAAA AAAAxx +5640 2801 0 0 0 0 40 640 1640 640 5640 80 81 YIAAAA TDEAAA HHHHxx +6417 2802 1 1 7 17 17 417 417 1417 6417 34 35 VMAAAA UDEAAA OOOOxx +1713 2803 1 1 3 13 13 713 1713 1713 1713 26 27 XNAAAA VDEAAA VVVVxx +5309 2804 1 1 9 9 9 309 1309 309 5309 18 19 FWAAAA WDEAAA AAAAxx +4364 2805 0 0 4 4 64 364 364 4364 4364 128 129 WLAAAA XDEAAA HHHHxx +619 2806 1 3 9 19 19 619 619 619 619 38 39 VXAAAA YDEAAA OOOOxx +9498 2807 0 2 8 18 98 498 1498 4498 9498 196 197 IBAAAA ZDEAAA VVVVxx +2804 2808 0 0 4 4 4 804 804 2804 2804 8 9 WDAAAA AEEAAA AAAAxx +2220 2809 0 0 0 0 20 220 220 2220 2220 40 41 KHAAAA BEEAAA HHHHxx +9542 2810 0 2 2 2 42 542 1542 4542 9542 84 85 ADAAAA CEEAAA OOOOxx +3349 2811 1 1 9 9 49 349 1349 3349 3349 98 99 VYAAAA DEEAAA VVVVxx +9198 2812 0 2 8 18 98 198 1198 4198 9198 196 197 UPAAAA EEEAAA AAAAxx +2727 2813 1 3 7 7 27 727 727 2727 2727 54 55 XAAAAA FEEAAA HHHHxx +3768 2814 0 0 8 8 68 768 1768 3768 3768 136 137 YOAAAA GEEAAA OOOOxx +2334 2815 0 2 4 14 34 334 334 2334 2334 68 69 ULAAAA HEEAAA VVVVxx +7770 2816 0 2 0 10 70 770 1770 2770 7770 140 141 WMAAAA IEEAAA AAAAxx +5963 2817 1 3 3 3 63 963 1963 963 5963 126 127 JVAAAA JEEAAA HHHHxx +4732 2818 0 0 2 12 32 732 732 4732 4732 64 65 AAAAAA KEEAAA OOOOxx +2448 2819 0 0 8 8 48 448 448 2448 2448 96 97 EQAAAA LEEAAA VVVVxx +5998 2820 0 2 8 18 98 998 1998 998 5998 196 197 SWAAAA MEEAAA AAAAxx +8577 2821 1 1 7 17 77 577 577 3577 8577 154 155 XRAAAA NEEAAA HHHHxx +266 2822 0 2 6 6 66 266 266 266 266 132 133 GKAAAA OEEAAA OOOOxx +2169 2823 1 1 9 9 69 169 169 2169 2169 138 139 LFAAAA PEEAAA VVVVxx +8228 2824 0 0 8 8 28 228 228 3228 8228 56 57 MEAAAA QEEAAA AAAAxx +4813 2825 1 1 3 13 13 813 813 4813 4813 26 27 DDAAAA REEAAA HHHHxx +2769 2826 1 1 9 9 69 769 769 2769 2769 138 139 NCAAAA SEEAAA OOOOxx +8382 2827 0 2 2 2 82 382 382 3382 8382 164 165 KKAAAA TEEAAA VVVVxx +1717 2828 1 1 7 17 17 717 1717 1717 1717 34 35 BOAAAA UEEAAA AAAAxx +7178 2829 0 2 8 18 78 178 1178 2178 7178 156 157 CQAAAA VEEAAA HHHHxx +9547 2830 1 3 7 7 47 547 1547 4547 9547 94 95 FDAAAA WEEAAA OOOOxx +8187 2831 1 3 7 7 87 187 187 3187 8187 174 175 XCAAAA XEEAAA VVVVxx +3168 2832 0 0 8 8 68 168 1168 3168 3168 136 137 WRAAAA YEEAAA AAAAxx +2180 2833 0 0 0 0 80 180 180 2180 2180 160 161 WFAAAA ZEEAAA HHHHxx +859 2834 1 3 9 19 59 859 859 859 859 118 119 BHAAAA AFEAAA OOOOxx +1554 2835 0 2 4 14 54 554 1554 1554 1554 108 109 UHAAAA BFEAAA VVVVxx +3567 2836 1 3 7 7 67 567 1567 3567 3567 134 135 FHAAAA CFEAAA AAAAxx +5985 2837 1 1 5 5 85 985 1985 985 5985 170 171 FWAAAA DFEAAA HHHHxx +1 2838 1 1 1 1 1 1 1 1 1 2 3 BAAAAA EFEAAA OOOOxx +5937 2839 1 1 7 17 37 937 1937 937 5937 74 75 JUAAAA FFEAAA VVVVxx +7594 2840 0 2 4 14 94 594 1594 2594 7594 188 189 CGAAAA GFEAAA AAAAxx +3783 2841 1 3 3 3 83 783 1783 3783 3783 166 167 NPAAAA HFEAAA HHHHxx +6841 2842 1 1 1 1 41 841 841 1841 6841 82 83 DDAAAA IFEAAA OOOOxx +9694 2843 0 2 4 14 94 694 1694 4694 9694 188 189 WIAAAA JFEAAA VVVVxx +4322 2844 0 2 2 2 22 322 322 4322 4322 44 45 GKAAAA KFEAAA AAAAxx +6012 2845 0 0 2 12 12 12 12 1012 6012 24 25 GXAAAA LFEAAA HHHHxx +108 2846 0 0 8 8 8 108 108 108 108 16 17 EEAAAA MFEAAA OOOOxx +3396 2847 0 0 6 16 96 396 1396 3396 3396 192 193 QAAAAA NFEAAA VVVVxx +8643 2848 1 3 3 3 43 643 643 3643 8643 86 87 LUAAAA OFEAAA AAAAxx +6087 2849 1 3 7 7 87 87 87 1087 6087 174 175 DAAAAA PFEAAA HHHHxx +2629 2850 1 1 9 9 29 629 629 2629 2629 58 59 DXAAAA QFEAAA OOOOxx +3009 2851 1 1 9 9 9 9 1009 3009 3009 18 19 TLAAAA RFEAAA VVVVxx +438 2852 0 2 8 18 38 438 438 438 438 76 77 WQAAAA SFEAAA AAAAxx +2480 2853 0 0 0 0 80 480 480 2480 2480 160 161 KRAAAA TFEAAA HHHHxx +936 2854 0 0 6 16 36 936 936 936 936 72 73 AKAAAA UFEAAA OOOOxx +6 2855 0 2 6 6 6 6 6 6 6 12 13 GAAAAA VFEAAA VVVVxx +768 2856 0 0 8 8 68 768 768 768 768 136 137 ODAAAA WFEAAA AAAAxx +1564 2857 0 0 4 4 64 564 1564 1564 1564 128 129 EIAAAA XFEAAA HHHHxx +3236 2858 0 0 6 16 36 236 1236 3236 3236 72 73 MUAAAA YFEAAA OOOOxx +3932 2859 0 0 2 12 32 932 1932 3932 3932 64 65 GVAAAA ZFEAAA VVVVxx +8914 2860 0 2 4 14 14 914 914 3914 8914 28 29 WEAAAA AGEAAA AAAAxx +119 2861 1 3 9 19 19 119 119 119 119 38 39 PEAAAA BGEAAA HHHHxx +6034 2862 0 2 4 14 34 34 34 1034 6034 68 69 CYAAAA CGEAAA OOOOxx +5384 2863 0 0 4 4 84 384 1384 384 5384 168 169 CZAAAA DGEAAA VVVVxx +6885 2864 1 1 5 5 85 885 885 1885 6885 170 171 VEAAAA EGEAAA AAAAxx +232 2865 0 0 2 12 32 232 232 232 232 64 65 YIAAAA FGEAAA HHHHxx +1293 2866 1 1 3 13 93 293 1293 1293 1293 186 187 TXAAAA GGEAAA OOOOxx +9204 2867 0 0 4 4 4 204 1204 4204 9204 8 9 AQAAAA HGEAAA VVVVxx +527 2868 1 3 7 7 27 527 527 527 527 54 55 HUAAAA IGEAAA AAAAxx +6539 2869 1 3 9 19 39 539 539 1539 6539 78 79 NRAAAA JGEAAA HHHHxx +3679 2870 1 3 9 19 79 679 1679 3679 3679 158 159 NLAAAA KGEAAA OOOOxx +8282 2871 0 2 2 2 82 282 282 3282 8282 164 165 OGAAAA LGEAAA VVVVxx +5027 2872 1 3 7 7 27 27 1027 27 5027 54 55 JLAAAA MGEAAA AAAAxx +7694 2873 0 2 4 14 94 694 1694 2694 7694 188 189 YJAAAA NGEAAA HHHHxx +473 2874 1 1 3 13 73 473 473 473 473 146 147 FSAAAA OGEAAA OOOOxx +6325 2875 1 1 5 5 25 325 325 1325 6325 50 51 HJAAAA PGEAAA VVVVxx +8761 2876 1 1 1 1 61 761 761 3761 8761 122 123 ZYAAAA QGEAAA AAAAxx +6184 2877 0 0 4 4 84 184 184 1184 6184 168 169 WDAAAA RGEAAA HHHHxx +419 2878 1 3 9 19 19 419 419 419 419 38 39 DQAAAA SGEAAA OOOOxx +6111 2879 1 3 1 11 11 111 111 1111 6111 22 23 BBAAAA TGEAAA VVVVxx +3836 2880 0 0 6 16 36 836 1836 3836 3836 72 73 ORAAAA UGEAAA AAAAxx +4086 2881 0 2 6 6 86 86 86 4086 4086 172 173 EBAAAA VGEAAA HHHHxx +5818 2882 0 2 8 18 18 818 1818 818 5818 36 37 UPAAAA WGEAAA OOOOxx +4528 2883 0 0 8 8 28 528 528 4528 4528 56 57 ESAAAA XGEAAA VVVVxx +7199 2884 1 3 9 19 99 199 1199 2199 7199 198 199 XQAAAA YGEAAA AAAAxx +1847 2885 1 3 7 7 47 847 1847 1847 1847 94 95 BTAAAA ZGEAAA HHHHxx +2875 2886 1 3 5 15 75 875 875 2875 2875 150 151 PGAAAA AHEAAA OOOOxx +2872 2887 0 0 2 12 72 872 872 2872 2872 144 145 MGAAAA BHEAAA VVVVxx +3972 2888 0 0 2 12 72 972 1972 3972 3972 144 145 UWAAAA CHEAAA AAAAxx +7590 2889 0 2 0 10 90 590 1590 2590 7590 180 181 YFAAAA DHEAAA HHHHxx +1914 2890 0 2 4 14 14 914 1914 1914 1914 28 29 QVAAAA EHEAAA OOOOxx +1658 2891 0 2 8 18 58 658 1658 1658 1658 116 117 ULAAAA FHEAAA VVVVxx +2126 2892 0 2 6 6 26 126 126 2126 2126 52 53 UDAAAA GHEAAA AAAAxx +645 2893 1 1 5 5 45 645 645 645 645 90 91 VYAAAA HHEAAA HHHHxx +6636 2894 0 0 6 16 36 636 636 1636 6636 72 73 GVAAAA IHEAAA OOOOxx +1469 2895 1 1 9 9 69 469 1469 1469 1469 138 139 NEAAAA JHEAAA VVVVxx +1377 2896 1 1 7 17 77 377 1377 1377 1377 154 155 ZAAAAA KHEAAA AAAAxx +8425 2897 1 1 5 5 25 425 425 3425 8425 50 51 BMAAAA LHEAAA HHHHxx +9300 2898 0 0 0 0 0 300 1300 4300 9300 0 1 STAAAA MHEAAA OOOOxx +5355 2899 1 3 5 15 55 355 1355 355 5355 110 111 ZXAAAA NHEAAA VVVVxx +840 2900 0 0 0 0 40 840 840 840 840 80 81 IGAAAA OHEAAA AAAAxx +5185 2901 1 1 5 5 85 185 1185 185 5185 170 171 LRAAAA PHEAAA HHHHxx +6467 2902 1 3 7 7 67 467 467 1467 6467 134 135 TOAAAA QHEAAA OOOOxx +58 2903 0 2 8 18 58 58 58 58 58 116 117 GCAAAA RHEAAA VVVVxx +5051 2904 1 3 1 11 51 51 1051 51 5051 102 103 HMAAAA SHEAAA AAAAxx +8901 2905 1 1 1 1 1 901 901 3901 8901 2 3 JEAAAA THEAAA HHHHxx +1550 2906 0 2 0 10 50 550 1550 1550 1550 100 101 QHAAAA UHEAAA OOOOxx +1698 2907 0 2 8 18 98 698 1698 1698 1698 196 197 INAAAA VHEAAA VVVVxx +802 2908 0 2 2 2 2 802 802 802 802 4 5 WEAAAA WHEAAA AAAAxx +2440 2909 0 0 0 0 40 440 440 2440 2440 80 81 WPAAAA XHEAAA HHHHxx +2260 2910 0 0 0 0 60 260 260 2260 2260 120 121 YIAAAA YHEAAA OOOOxx +8218 2911 0 2 8 18 18 218 218 3218 8218 36 37 CEAAAA ZHEAAA VVVVxx +5144 2912 0 0 4 4 44 144 1144 144 5144 88 89 WPAAAA AIEAAA AAAAxx +4822 2913 0 2 2 2 22 822 822 4822 4822 44 45 MDAAAA BIEAAA HHHHxx +9476 2914 0 0 6 16 76 476 1476 4476 9476 152 153 MAAAAA CIEAAA OOOOxx +7535 2915 1 3 5 15 35 535 1535 2535 7535 70 71 VDAAAA DIEAAA VVVVxx +8738 2916 0 2 8 18 38 738 738 3738 8738 76 77 CYAAAA EIEAAA AAAAxx +7946 2917 0 2 6 6 46 946 1946 2946 7946 92 93 QTAAAA FIEAAA HHHHxx +8143 2918 1 3 3 3 43 143 143 3143 8143 86 87 FBAAAA GIEAAA OOOOxx +2623 2919 1 3 3 3 23 623 623 2623 2623 46 47 XWAAAA HIEAAA VVVVxx +5209 2920 1 1 9 9 9 209 1209 209 5209 18 19 JSAAAA IIEAAA AAAAxx +7674 2921 0 2 4 14 74 674 1674 2674 7674 148 149 EJAAAA JIEAAA HHHHxx +1135 2922 1 3 5 15 35 135 1135 1135 1135 70 71 RRAAAA KIEAAA OOOOxx +424 2923 0 0 4 4 24 424 424 424 424 48 49 IQAAAA LIEAAA VVVVxx +942 2924 0 2 2 2 42 942 942 942 942 84 85 GKAAAA MIEAAA AAAAxx +7813 2925 1 1 3 13 13 813 1813 2813 7813 26 27 NOAAAA NIEAAA HHHHxx +3539 2926 1 3 9 19 39 539 1539 3539 3539 78 79 DGAAAA OIEAAA OOOOxx +2909 2927 1 1 9 9 9 909 909 2909 2909 18 19 XHAAAA PIEAAA VVVVxx +3748 2928 0 0 8 8 48 748 1748 3748 3748 96 97 EOAAAA QIEAAA AAAAxx +2996 2929 0 0 6 16 96 996 996 2996 2996 192 193 GLAAAA RIEAAA HHHHxx +1869 2930 1 1 9 9 69 869 1869 1869 1869 138 139 XTAAAA SIEAAA OOOOxx +8151 2931 1 3 1 11 51 151 151 3151 8151 102 103 NBAAAA TIEAAA VVVVxx +6361 2932 1 1 1 1 61 361 361 1361 6361 122 123 RKAAAA UIEAAA AAAAxx +5568 2933 0 0 8 8 68 568 1568 568 5568 136 137 EGAAAA VIEAAA HHHHxx +2796 2934 0 0 6 16 96 796 796 2796 2796 192 193 ODAAAA WIEAAA OOOOxx +8489 2935 1 1 9 9 89 489 489 3489 8489 178 179 NOAAAA XIEAAA VVVVxx +9183 2936 1 3 3 3 83 183 1183 4183 9183 166 167 FPAAAA YIEAAA AAAAxx +8227 2937 1 3 7 7 27 227 227 3227 8227 54 55 LEAAAA ZIEAAA HHHHxx +1844 2938 0 0 4 4 44 844 1844 1844 1844 88 89 YSAAAA AJEAAA OOOOxx +3975 2939 1 3 5 15 75 975 1975 3975 3975 150 151 XWAAAA BJEAAA VVVVxx +6490 2940 0 2 0 10 90 490 490 1490 6490 180 181 QPAAAA CJEAAA AAAAxx +8303 2941 1 3 3 3 3 303 303 3303 8303 6 7 JHAAAA DJEAAA HHHHxx +7334 2942 0 2 4 14 34 334 1334 2334 7334 68 69 CWAAAA EJEAAA OOOOxx +2382 2943 0 2 2 2 82 382 382 2382 2382 164 165 QNAAAA FJEAAA VVVVxx +177 2944 1 1 7 17 77 177 177 177 177 154 155 VGAAAA GJEAAA AAAAxx +8117 2945 1 1 7 17 17 117 117 3117 8117 34 35 FAAAAA HJEAAA HHHHxx +5485 2946 1 1 5 5 85 485 1485 485 5485 170 171 ZCAAAA IJEAAA OOOOxx +6544 2947 0 0 4 4 44 544 544 1544 6544 88 89 SRAAAA JJEAAA VVVVxx +8517 2948 1 1 7 17 17 517 517 3517 8517 34 35 PPAAAA KJEAAA AAAAxx +2252 2949 0 0 2 12 52 252 252 2252 2252 104 105 QIAAAA LJEAAA HHHHxx +4480 2950 0 0 0 0 80 480 480 4480 4480 160 161 IQAAAA MJEAAA OOOOxx +4785 2951 1 1 5 5 85 785 785 4785 4785 170 171 BCAAAA NJEAAA VVVVxx +9700 2952 0 0 0 0 0 700 1700 4700 9700 0 1 CJAAAA OJEAAA AAAAxx +2122 2953 0 2 2 2 22 122 122 2122 2122 44 45 QDAAAA PJEAAA HHHHxx +8783 2954 1 3 3 3 83 783 783 3783 8783 166 167 VZAAAA QJEAAA OOOOxx +1453 2955 1 1 3 13 53 453 1453 1453 1453 106 107 XDAAAA RJEAAA VVVVxx +3908 2956 0 0 8 8 8 908 1908 3908 3908 16 17 IUAAAA SJEAAA AAAAxx +7707 2957 1 3 7 7 7 707 1707 2707 7707 14 15 LKAAAA TJEAAA HHHHxx +9049 2958 1 1 9 9 49 49 1049 4049 9049 98 99 BKAAAA UJEAAA OOOOxx +654 2959 0 2 4 14 54 654 654 654 654 108 109 EZAAAA VJEAAA VVVVxx +3336 2960 0 0 6 16 36 336 1336 3336 3336 72 73 IYAAAA WJEAAA AAAAxx +622 2961 0 2 2 2 22 622 622 622 622 44 45 YXAAAA XJEAAA HHHHxx +8398 2962 0 2 8 18 98 398 398 3398 8398 196 197 ALAAAA YJEAAA OOOOxx +9193 2963 1 1 3 13 93 193 1193 4193 9193 186 187 PPAAAA ZJEAAA VVVVxx +7896 2964 0 0 6 16 96 896 1896 2896 7896 192 193 SRAAAA AKEAAA AAAAxx +9798 2965 0 2 8 18 98 798 1798 4798 9798 196 197 WMAAAA BKEAAA HHHHxx +2881 2966 1 1 1 1 81 881 881 2881 2881 162 163 VGAAAA CKEAAA OOOOxx +672 2967 0 0 2 12 72 672 672 672 672 144 145 WZAAAA DKEAAA VVVVxx +6743 2968 1 3 3 3 43 743 743 1743 6743 86 87 JZAAAA EKEAAA AAAAxx +8935 2969 1 3 5 15 35 935 935 3935 8935 70 71 RFAAAA FKEAAA HHHHxx +2426 2970 0 2 6 6 26 426 426 2426 2426 52 53 IPAAAA GKEAAA OOOOxx +722 2971 0 2 2 2 22 722 722 722 722 44 45 UBAAAA HKEAAA VVVVxx +5088 2972 0 0 8 8 88 88 1088 88 5088 176 177 SNAAAA IKEAAA AAAAxx +8677 2973 1 1 7 17 77 677 677 3677 8677 154 155 TVAAAA JKEAAA HHHHxx +6963 2974 1 3 3 3 63 963 963 1963 6963 126 127 VHAAAA KKEAAA OOOOxx +1653 2975 1 1 3 13 53 653 1653 1653 1653 106 107 PLAAAA LKEAAA VVVVxx +7295 2976 1 3 5 15 95 295 1295 2295 7295 190 191 PUAAAA MKEAAA AAAAxx +6675 2977 1 3 5 15 75 675 675 1675 6675 150 151 TWAAAA NKEAAA HHHHxx +7183 2978 1 3 3 3 83 183 1183 2183 7183 166 167 HQAAAA OKEAAA OOOOxx +4378 2979 0 2 8 18 78 378 378 4378 4378 156 157 KMAAAA PKEAAA VVVVxx +2157 2980 1 1 7 17 57 157 157 2157 2157 114 115 ZEAAAA QKEAAA AAAAxx +2621 2981 1 1 1 1 21 621 621 2621 2621 42 43 VWAAAA RKEAAA HHHHxx +9278 2982 0 2 8 18 78 278 1278 4278 9278 156 157 WSAAAA SKEAAA OOOOxx +79 2983 1 3 9 19 79 79 79 79 79 158 159 BDAAAA TKEAAA VVVVxx +7358 2984 0 2 8 18 58 358 1358 2358 7358 116 117 AXAAAA UKEAAA AAAAxx +3589 2985 1 1 9 9 89 589 1589 3589 3589 178 179 BIAAAA VKEAAA HHHHxx +1254 2986 0 2 4 14 54 254 1254 1254 1254 108 109 GWAAAA WKEAAA OOOOxx +3490 2987 0 2 0 10 90 490 1490 3490 3490 180 181 GEAAAA XKEAAA VVVVxx +7533 2988 1 1 3 13 33 533 1533 2533 7533 66 67 TDAAAA YKEAAA AAAAxx +2800 2989 0 0 0 0 0 800 800 2800 2800 0 1 SDAAAA ZKEAAA HHHHxx +351 2990 1 3 1 11 51 351 351 351 351 102 103 NNAAAA ALEAAA OOOOxx +4359 2991 1 3 9 19 59 359 359 4359 4359 118 119 RLAAAA BLEAAA VVVVxx +5788 2992 0 0 8 8 88 788 1788 788 5788 176 177 QOAAAA CLEAAA AAAAxx +5521 2993 1 1 1 1 21 521 1521 521 5521 42 43 JEAAAA DLEAAA HHHHxx +3351 2994 1 3 1 11 51 351 1351 3351 3351 102 103 XYAAAA ELEAAA OOOOxx +5129 2995 1 1 9 9 29 129 1129 129 5129 58 59 HPAAAA FLEAAA VVVVxx +315 2996 1 3 5 15 15 315 315 315 315 30 31 DMAAAA GLEAAA AAAAxx +7552 2997 0 0 2 12 52 552 1552 2552 7552 104 105 MEAAAA HLEAAA HHHHxx +9176 2998 0 0 6 16 76 176 1176 4176 9176 152 153 YOAAAA ILEAAA OOOOxx +7458 2999 0 2 8 18 58 458 1458 2458 7458 116 117 WAAAAA JLEAAA VVVVxx +279 3000 1 3 9 19 79 279 279 279 279 158 159 TKAAAA KLEAAA AAAAxx +738 3001 0 2 8 18 38 738 738 738 738 76 77 KCAAAA LLEAAA HHHHxx +2557 3002 1 1 7 17 57 557 557 2557 2557 114 115 JUAAAA MLEAAA OOOOxx +9395 3003 1 3 5 15 95 395 1395 4395 9395 190 191 JXAAAA NLEAAA VVVVxx +7214 3004 0 2 4 14 14 214 1214 2214 7214 28 29 MRAAAA OLEAAA AAAAxx +6354 3005 0 2 4 14 54 354 354 1354 6354 108 109 KKAAAA PLEAAA HHHHxx +4799 3006 1 3 9 19 99 799 799 4799 4799 198 199 PCAAAA QLEAAA OOOOxx +1231 3007 1 3 1 11 31 231 1231 1231 1231 62 63 JVAAAA RLEAAA VVVVxx +5252 3008 0 0 2 12 52 252 1252 252 5252 104 105 AUAAAA SLEAAA AAAAxx +5250 3009 0 2 0 10 50 250 1250 250 5250 100 101 YTAAAA TLEAAA HHHHxx +9319 3010 1 3 9 19 19 319 1319 4319 9319 38 39 LUAAAA ULEAAA OOOOxx +1724 3011 0 0 4 4 24 724 1724 1724 1724 48 49 IOAAAA VLEAAA VVVVxx +7947 3012 1 3 7 7 47 947 1947 2947 7947 94 95 RTAAAA WLEAAA AAAAxx +1105 3013 1 1 5 5 5 105 1105 1105 1105 10 11 NQAAAA XLEAAA HHHHxx +1417 3014 1 1 7 17 17 417 1417 1417 1417 34 35 NCAAAA YLEAAA OOOOxx +7101 3015 1 1 1 1 1 101 1101 2101 7101 2 3 DNAAAA ZLEAAA VVVVxx +1088 3016 0 0 8 8 88 88 1088 1088 1088 176 177 WPAAAA AMEAAA AAAAxx +979 3017 1 3 9 19 79 979 979 979 979 158 159 RLAAAA BMEAAA HHHHxx +7589 3018 1 1 9 9 89 589 1589 2589 7589 178 179 XFAAAA CMEAAA OOOOxx +8952 3019 0 0 2 12 52 952 952 3952 8952 104 105 IGAAAA DMEAAA VVVVxx +2864 3020 0 0 4 4 64 864 864 2864 2864 128 129 EGAAAA EMEAAA AAAAxx +234 3021 0 2 4 14 34 234 234 234 234 68 69 AJAAAA FMEAAA HHHHxx +7231 3022 1 3 1 11 31 231 1231 2231 7231 62 63 DSAAAA GMEAAA OOOOxx +6792 3023 0 0 2 12 92 792 792 1792 6792 184 185 GBAAAA HMEAAA VVVVxx +4311 3024 1 3 1 11 11 311 311 4311 4311 22 23 VJAAAA IMEAAA AAAAxx +3374 3025 0 2 4 14 74 374 1374 3374 3374 148 149 UZAAAA JMEAAA HHHHxx +3367 3026 1 3 7 7 67 367 1367 3367 3367 134 135 NZAAAA KMEAAA OOOOxx +2598 3027 0 2 8 18 98 598 598 2598 2598 196 197 YVAAAA LMEAAA VVVVxx +1033 3028 1 1 3 13 33 33 1033 1033 1033 66 67 TNAAAA MMEAAA AAAAxx +7803 3029 1 3 3 3 3 803 1803 2803 7803 6 7 DOAAAA NMEAAA HHHHxx +3870 3030 0 2 0 10 70 870 1870 3870 3870 140 141 WSAAAA OMEAAA OOOOxx +4962 3031 0 2 2 2 62 962 962 4962 4962 124 125 WIAAAA PMEAAA VVVVxx +4842 3032 0 2 2 2 42 842 842 4842 4842 84 85 GEAAAA QMEAAA AAAAxx +8814 3033 0 2 4 14 14 814 814 3814 8814 28 29 ABAAAA RMEAAA HHHHxx +3429 3034 1 1 9 9 29 429 1429 3429 3429 58 59 XBAAAA SMEAAA OOOOxx +6550 3035 0 2 0 10 50 550 550 1550 6550 100 101 YRAAAA TMEAAA VVVVxx +6317 3036 1 1 7 17 17 317 317 1317 6317 34 35 ZIAAAA UMEAAA AAAAxx +5023 3037 1 3 3 3 23 23 1023 23 5023 46 47 FLAAAA VMEAAA HHHHxx +5825 3038 1 1 5 5 25 825 1825 825 5825 50 51 BQAAAA WMEAAA OOOOxx +5297 3039 1 1 7 17 97 297 1297 297 5297 194 195 TVAAAA XMEAAA VVVVxx +8764 3040 0 0 4 4 64 764 764 3764 8764 128 129 CZAAAA YMEAAA AAAAxx +5084 3041 0 0 4 4 84 84 1084 84 5084 168 169 ONAAAA ZMEAAA HHHHxx +6808 3042 0 0 8 8 8 808 808 1808 6808 16 17 WBAAAA ANEAAA OOOOxx +1780 3043 0 0 0 0 80 780 1780 1780 1780 160 161 MQAAAA BNEAAA VVVVxx +4092 3044 0 0 2 12 92 92 92 4092 4092 184 185 KBAAAA CNEAAA AAAAxx +3618 3045 0 2 8 18 18 618 1618 3618 3618 36 37 EJAAAA DNEAAA HHHHxx +7299 3046 1 3 9 19 99 299 1299 2299 7299 198 199 TUAAAA ENEAAA OOOOxx +8544 3047 0 0 4 4 44 544 544 3544 8544 88 89 QQAAAA FNEAAA VVVVxx +2359 3048 1 3 9 19 59 359 359 2359 2359 118 119 TMAAAA GNEAAA AAAAxx +1939 3049 1 3 9 19 39 939 1939 1939 1939 78 79 PWAAAA HNEAAA HHHHxx +5834 3050 0 2 4 14 34 834 1834 834 5834 68 69 KQAAAA INEAAA OOOOxx +1997 3051 1 1 7 17 97 997 1997 1997 1997 194 195 VYAAAA JNEAAA VVVVxx +7917 3052 1 1 7 17 17 917 1917 2917 7917 34 35 NSAAAA KNEAAA AAAAxx +2098 3053 0 2 8 18 98 98 98 2098 2098 196 197 SCAAAA LNEAAA HHHHxx +7576 3054 0 0 6 16 76 576 1576 2576 7576 152 153 KFAAAA MNEAAA OOOOxx +376 3055 0 0 6 16 76 376 376 376 376 152 153 MOAAAA NNEAAA VVVVxx +8535 3056 1 3 5 15 35 535 535 3535 8535 70 71 HQAAAA ONEAAA AAAAxx +5659 3057 1 3 9 19 59 659 1659 659 5659 118 119 RJAAAA PNEAAA HHHHxx +2786 3058 0 2 6 6 86 786 786 2786 2786 172 173 EDAAAA QNEAAA OOOOxx +8820 3059 0 0 0 0 20 820 820 3820 8820 40 41 GBAAAA RNEAAA VVVVxx +1229 3060 1 1 9 9 29 229 1229 1229 1229 58 59 HVAAAA SNEAAA AAAAxx +9321 3061 1 1 1 1 21 321 1321 4321 9321 42 43 NUAAAA TNEAAA HHHHxx +7662 3062 0 2 2 2 62 662 1662 2662 7662 124 125 SIAAAA UNEAAA OOOOxx +5535 3063 1 3 5 15 35 535 1535 535 5535 70 71 XEAAAA VNEAAA VVVVxx +4889 3064 1 1 9 9 89 889 889 4889 4889 178 179 BGAAAA WNEAAA AAAAxx +8259 3065 1 3 9 19 59 259 259 3259 8259 118 119 RFAAAA XNEAAA HHHHxx +6789 3066 1 1 9 9 89 789 789 1789 6789 178 179 DBAAAA YNEAAA OOOOxx +5411 3067 1 3 1 11 11 411 1411 411 5411 22 23 DAAAAA ZNEAAA VVVVxx +6992 3068 0 0 2 12 92 992 992 1992 6992 184 185 YIAAAA AOEAAA AAAAxx +7698 3069 0 2 8 18 98 698 1698 2698 7698 196 197 CKAAAA BOEAAA HHHHxx +2342 3070 0 2 2 2 42 342 342 2342 2342 84 85 CMAAAA COEAAA OOOOxx +1501 3071 1 1 1 1 1 501 1501 1501 1501 2 3 TFAAAA DOEAAA VVVVxx +6322 3072 0 2 2 2 22 322 322 1322 6322 44 45 EJAAAA EOEAAA AAAAxx +9861 3073 1 1 1 1 61 861 1861 4861 9861 122 123 HPAAAA FOEAAA HHHHxx +9802 3074 0 2 2 2 2 802 1802 4802 9802 4 5 ANAAAA GOEAAA OOOOxx +4750 3075 0 2 0 10 50 750 750 4750 4750 100 101 SAAAAA HOEAAA VVVVxx +5855 3076 1 3 5 15 55 855 1855 855 5855 110 111 FRAAAA IOEAAA AAAAxx +4304 3077 0 0 4 4 4 304 304 4304 4304 8 9 OJAAAA JOEAAA HHHHxx +2605 3078 1 1 5 5 5 605 605 2605 2605 10 11 FWAAAA KOEAAA OOOOxx +1802 3079 0 2 2 2 2 802 1802 1802 1802 4 5 IRAAAA LOEAAA VVVVxx +9368 3080 0 0 8 8 68 368 1368 4368 9368 136 137 IWAAAA MOEAAA AAAAxx +7107 3081 1 3 7 7 7 107 1107 2107 7107 14 15 JNAAAA NOEAAA HHHHxx +8895 3082 1 3 5 15 95 895 895 3895 8895 190 191 DEAAAA OOEAAA OOOOxx +3750 3083 0 2 0 10 50 750 1750 3750 3750 100 101 GOAAAA POEAAA VVVVxx +8934 3084 0 2 4 14 34 934 934 3934 8934 68 69 QFAAAA QOEAAA AAAAxx +9464 3085 0 0 4 4 64 464 1464 4464 9464 128 129 AAAAAA ROEAAA HHHHxx +1928 3086 0 0 8 8 28 928 1928 1928 1928 56 57 EWAAAA SOEAAA OOOOxx +3196 3087 0 0 6 16 96 196 1196 3196 3196 192 193 YSAAAA TOEAAA VVVVxx +5256 3088 0 0 6 16 56 256 1256 256 5256 112 113 EUAAAA UOEAAA AAAAxx +7119 3089 1 3 9 19 19 119 1119 2119 7119 38 39 VNAAAA VOEAAA HHHHxx +4495 3090 1 3 5 15 95 495 495 4495 4495 190 191 XQAAAA WOEAAA OOOOxx +9292 3091 0 0 2 12 92 292 1292 4292 9292 184 185 KTAAAA XOEAAA VVVVxx +1617 3092 1 1 7 17 17 617 1617 1617 1617 34 35 FKAAAA YOEAAA AAAAxx +481 3093 1 1 1 1 81 481 481 481 481 162 163 NSAAAA ZOEAAA HHHHxx +56 3094 0 0 6 16 56 56 56 56 56 112 113 ECAAAA APEAAA OOOOxx +9120 3095 0 0 0 0 20 120 1120 4120 9120 40 41 UMAAAA BPEAAA VVVVxx +1306 3096 0 2 6 6 6 306 1306 1306 1306 12 13 GYAAAA CPEAAA AAAAxx +7773 3097 1 1 3 13 73 773 1773 2773 7773 146 147 ZMAAAA DPEAAA HHHHxx +4863 3098 1 3 3 3 63 863 863 4863 4863 126 127 BFAAAA EPEAAA OOOOxx +1114 3099 0 2 4 14 14 114 1114 1114 1114 28 29 WQAAAA FPEAAA VVVVxx +8124 3100 0 0 4 4 24 124 124 3124 8124 48 49 MAAAAA GPEAAA AAAAxx +6254 3101 0 2 4 14 54 254 254 1254 6254 108 109 OGAAAA HPEAAA HHHHxx +8109 3102 1 1 9 9 9 109 109 3109 8109 18 19 XZAAAA IPEAAA OOOOxx +1747 3103 1 3 7 7 47 747 1747 1747 1747 94 95 FPAAAA JPEAAA VVVVxx +6185 3104 1 1 5 5 85 185 185 1185 6185 170 171 XDAAAA KPEAAA AAAAxx +3388 3105 0 0 8 8 88 388 1388 3388 3388 176 177 IAAAAA LPEAAA HHHHxx +4905 3106 1 1 5 5 5 905 905 4905 4905 10 11 RGAAAA MPEAAA OOOOxx +5728 3107 0 0 8 8 28 728 1728 728 5728 56 57 IMAAAA NPEAAA VVVVxx +7507 3108 1 3 7 7 7 507 1507 2507 7507 14 15 TCAAAA OPEAAA AAAAxx +5662 3109 0 2 2 2 62 662 1662 662 5662 124 125 UJAAAA PPEAAA HHHHxx +1686 3110 0 2 6 6 86 686 1686 1686 1686 172 173 WMAAAA QPEAAA OOOOxx +5202 3111 0 2 2 2 2 202 1202 202 5202 4 5 CSAAAA RPEAAA VVVVxx +6905 3112 1 1 5 5 5 905 905 1905 6905 10 11 PFAAAA SPEAAA AAAAxx +9577 3113 1 1 7 17 77 577 1577 4577 9577 154 155 JEAAAA TPEAAA HHHHxx +7194 3114 0 2 4 14 94 194 1194 2194 7194 188 189 SQAAAA UPEAAA OOOOxx +7016 3115 0 0 6 16 16 16 1016 2016 7016 32 33 WJAAAA VPEAAA VVVVxx +8905 3116 1 1 5 5 5 905 905 3905 8905 10 11 NEAAAA WPEAAA AAAAxx +3419 3117 1 3 9 19 19 419 1419 3419 3419 38 39 NBAAAA XPEAAA HHHHxx +6881 3118 1 1 1 1 81 881 881 1881 6881 162 163 REAAAA YPEAAA OOOOxx +8370 3119 0 2 0 10 70 370 370 3370 8370 140 141 YJAAAA ZPEAAA VVVVxx +6117 3120 1 1 7 17 17 117 117 1117 6117 34 35 HBAAAA AQEAAA AAAAxx +1636 3121 0 0 6 16 36 636 1636 1636 1636 72 73 YKAAAA BQEAAA HHHHxx +6857 3122 1 1 7 17 57 857 857 1857 6857 114 115 TDAAAA CQEAAA OOOOxx +7163 3123 1 3 3 3 63 163 1163 2163 7163 126 127 NPAAAA DQEAAA VVVVxx +5040 3124 0 0 0 0 40 40 1040 40 5040 80 81 WLAAAA EQEAAA AAAAxx +6263 3125 1 3 3 3 63 263 263 1263 6263 126 127 XGAAAA FQEAAA HHHHxx +4809 3126 1 1 9 9 9 809 809 4809 4809 18 19 ZCAAAA GQEAAA OOOOxx +900 3127 0 0 0 0 0 900 900 900 900 0 1 QIAAAA HQEAAA VVVVxx +3199 3128 1 3 9 19 99 199 1199 3199 3199 198 199 BTAAAA IQEAAA AAAAxx +4156 3129 0 0 6 16 56 156 156 4156 4156 112 113 WDAAAA JQEAAA HHHHxx +3501 3130 1 1 1 1 1 501 1501 3501 3501 2 3 REAAAA KQEAAA OOOOxx +164 3131 0 0 4 4 64 164 164 164 164 128 129 IGAAAA LQEAAA VVVVxx +9548 3132 0 0 8 8 48 548 1548 4548 9548 96 97 GDAAAA MQEAAA AAAAxx +1149 3133 1 1 9 9 49 149 1149 1149 1149 98 99 FSAAAA NQEAAA HHHHxx +1962 3134 0 2 2 2 62 962 1962 1962 1962 124 125 MXAAAA OQEAAA OOOOxx +4072 3135 0 0 2 12 72 72 72 4072 4072 144 145 QAAAAA PQEAAA VVVVxx +4280 3136 0 0 0 0 80 280 280 4280 4280 160 161 QIAAAA QQEAAA AAAAxx +1398 3137 0 2 8 18 98 398 1398 1398 1398 196 197 UBAAAA RQEAAA HHHHxx +725 3138 1 1 5 5 25 725 725 725 725 50 51 XBAAAA SQEAAA OOOOxx +3988 3139 0 0 8 8 88 988 1988 3988 3988 176 177 KXAAAA TQEAAA VVVVxx +5059 3140 1 3 9 19 59 59 1059 59 5059 118 119 PMAAAA UQEAAA AAAAxx +2632 3141 0 0 2 12 32 632 632 2632 2632 64 65 GXAAAA VQEAAA HHHHxx +1909 3142 1 1 9 9 9 909 1909 1909 1909 18 19 LVAAAA WQEAAA OOOOxx +6827 3143 1 3 7 7 27 827 827 1827 6827 54 55 PCAAAA XQEAAA VVVVxx +8156 3144 0 0 6 16 56 156 156 3156 8156 112 113 SBAAAA YQEAAA AAAAxx +1192 3145 0 0 2 12 92 192 1192 1192 1192 184 185 WTAAAA ZQEAAA HHHHxx +9545 3146 1 1 5 5 45 545 1545 4545 9545 90 91 DDAAAA AREAAA OOOOxx +2249 3147 1 1 9 9 49 249 249 2249 2249 98 99 NIAAAA BREAAA VVVVxx +5580 3148 0 0 0 0 80 580 1580 580 5580 160 161 QGAAAA CREAAA AAAAxx +8403 3149 1 3 3 3 3 403 403 3403 8403 6 7 FLAAAA DREAAA HHHHxx +4024 3150 0 0 4 4 24 24 24 4024 4024 48 49 UYAAAA EREAAA OOOOxx +1866 3151 0 2 6 6 66 866 1866 1866 1866 132 133 UTAAAA FREAAA VVVVxx +9251 3152 1 3 1 11 51 251 1251 4251 9251 102 103 VRAAAA GREAAA AAAAxx +9979 3153 1 3 9 19 79 979 1979 4979 9979 158 159 VTAAAA HREAAA HHHHxx +9899 3154 1 3 9 19 99 899 1899 4899 9899 198 199 TQAAAA IREAAA OOOOxx +2540 3155 0 0 0 0 40 540 540 2540 2540 80 81 STAAAA JREAAA VVVVxx +8957 3156 1 1 7 17 57 957 957 3957 8957 114 115 NGAAAA KREAAA AAAAxx +7702 3157 0 2 2 2 2 702 1702 2702 7702 4 5 GKAAAA LREAAA HHHHxx +4211 3158 1 3 1 11 11 211 211 4211 4211 22 23 ZFAAAA MREAAA OOOOxx +6684 3159 0 0 4 4 84 684 684 1684 6684 168 169 CXAAAA NREAAA VVVVxx +3883 3160 1 3 3 3 83 883 1883 3883 3883 166 167 JTAAAA OREAAA AAAAxx +3531 3161 1 3 1 11 31 531 1531 3531 3531 62 63 VFAAAA PREAAA HHHHxx +9178 3162 0 2 8 18 78 178 1178 4178 9178 156 157 APAAAA QREAAA OOOOxx +3389 3163 1 1 9 9 89 389 1389 3389 3389 178 179 JAAAAA RREAAA VVVVxx +7874 3164 0 2 4 14 74 874 1874 2874 7874 148 149 WQAAAA SREAAA AAAAxx +4522 3165 0 2 2 2 22 522 522 4522 4522 44 45 YRAAAA TREAAA HHHHxx +9399 3166 1 3 9 19 99 399 1399 4399 9399 198 199 NXAAAA UREAAA OOOOxx +9083 3167 1 3 3 3 83 83 1083 4083 9083 166 167 JLAAAA VREAAA VVVVxx +1530 3168 0 2 0 10 30 530 1530 1530 1530 60 61 WGAAAA WREAAA AAAAxx +2360 3169 0 0 0 0 60 360 360 2360 2360 120 121 UMAAAA XREAAA HHHHxx +4908 3170 0 0 8 8 8 908 908 4908 4908 16 17 UGAAAA YREAAA OOOOxx +4628 3171 0 0 8 8 28 628 628 4628 4628 56 57 AWAAAA ZREAAA VVVVxx +3889 3172 1 1 9 9 89 889 1889 3889 3889 178 179 PTAAAA ASEAAA AAAAxx +1331 3173 1 3 1 11 31 331 1331 1331 1331 62 63 FZAAAA BSEAAA HHHHxx +1942 3174 0 2 2 2 42 942 1942 1942 1942 84 85 SWAAAA CSEAAA OOOOxx +4734 3175 0 2 4 14 34 734 734 4734 4734 68 69 CAAAAA DSEAAA VVVVxx +8386 3176 0 2 6 6 86 386 386 3386 8386 172 173 OKAAAA ESEAAA AAAAxx +3586 3177 0 2 6 6 86 586 1586 3586 3586 172 173 YHAAAA FSEAAA HHHHxx +2354 3178 0 2 4 14 54 354 354 2354 2354 108 109 OMAAAA GSEAAA OOOOxx +7108 3179 0 0 8 8 8 108 1108 2108 7108 16 17 KNAAAA HSEAAA VVVVxx +1857 3180 1 1 7 17 57 857 1857 1857 1857 114 115 LTAAAA ISEAAA AAAAxx +2544 3181 0 0 4 4 44 544 544 2544 2544 88 89 WTAAAA JSEAAA HHHHxx +819 3182 1 3 9 19 19 819 819 819 819 38 39 NFAAAA KSEAAA OOOOxx +2878 3183 0 2 8 18 78 878 878 2878 2878 156 157 SGAAAA LSEAAA VVVVxx +1772 3184 0 0 2 12 72 772 1772 1772 1772 144 145 EQAAAA MSEAAA AAAAxx +354 3185 0 2 4 14 54 354 354 354 354 108 109 QNAAAA NSEAAA HHHHxx +3259 3186 1 3 9 19 59 259 1259 3259 3259 118 119 JVAAAA OSEAAA OOOOxx +2170 3187 0 2 0 10 70 170 170 2170 2170 140 141 MFAAAA PSEAAA VVVVxx +1190 3188 0 2 0 10 90 190 1190 1190 1190 180 181 UTAAAA QSEAAA AAAAxx +3607 3189 1 3 7 7 7 607 1607 3607 3607 14 15 TIAAAA RSEAAA HHHHxx +4661 3190 1 1 1 1 61 661 661 4661 4661 122 123 HXAAAA SSEAAA OOOOxx +1796 3191 0 0 6 16 96 796 1796 1796 1796 192 193 CRAAAA TSEAAA VVVVxx +1561 3192 1 1 1 1 61 561 1561 1561 1561 122 123 BIAAAA USEAAA AAAAxx +4336 3193 0 0 6 16 36 336 336 4336 4336 72 73 UKAAAA VSEAAA HHHHxx +7550 3194 0 2 0 10 50 550 1550 2550 7550 100 101 KEAAAA WSEAAA OOOOxx +3238 3195 0 2 8 18 38 238 1238 3238 3238 76 77 OUAAAA XSEAAA VVVVxx +9870 3196 0 2 0 10 70 870 1870 4870 9870 140 141 QPAAAA YSEAAA AAAAxx +6502 3197 0 2 2 2 2 502 502 1502 6502 4 5 CQAAAA ZSEAAA HHHHxx +3903 3198 1 3 3 3 3 903 1903 3903 3903 6 7 DUAAAA ATEAAA OOOOxx +2869 3199 1 1 9 9 69 869 869 2869 2869 138 139 JGAAAA BTEAAA VVVVxx +5072 3200 0 0 2 12 72 72 1072 72 5072 144 145 CNAAAA CTEAAA AAAAxx +1201 3201 1 1 1 1 1 201 1201 1201 1201 2 3 FUAAAA DTEAAA HHHHxx +6245 3202 1 1 5 5 45 245 245 1245 6245 90 91 FGAAAA ETEAAA OOOOxx +1402 3203 0 2 2 2 2 402 1402 1402 1402 4 5 YBAAAA FTEAAA VVVVxx +2594 3204 0 2 4 14 94 594 594 2594 2594 188 189 UVAAAA GTEAAA AAAAxx +9171 3205 1 3 1 11 71 171 1171 4171 9171 142 143 TOAAAA HTEAAA HHHHxx +2620 3206 0 0 0 0 20 620 620 2620 2620 40 41 UWAAAA ITEAAA OOOOxx +6309 3207 1 1 9 9 9 309 309 1309 6309 18 19 RIAAAA JTEAAA VVVVxx +1285 3208 1 1 5 5 85 285 1285 1285 1285 170 171 LXAAAA KTEAAA AAAAxx +5466 3209 0 2 6 6 66 466 1466 466 5466 132 133 GCAAAA LTEAAA HHHHxx +168 3210 0 0 8 8 68 168 168 168 168 136 137 MGAAAA MTEAAA OOOOxx +1410 3211 0 2 0 10 10 410 1410 1410 1410 20 21 GCAAAA NTEAAA VVVVxx +6332 3212 0 0 2 12 32 332 332 1332 6332 64 65 OJAAAA OTEAAA AAAAxx +9530 3213 0 2 0 10 30 530 1530 4530 9530 60 61 OCAAAA PTEAAA HHHHxx +7749 3214 1 1 9 9 49 749 1749 2749 7749 98 99 BMAAAA QTEAAA OOOOxx +3656 3215 0 0 6 16 56 656 1656 3656 3656 112 113 QKAAAA RTEAAA VVVVxx +37 3216 1 1 7 17 37 37 37 37 37 74 75 LBAAAA STEAAA AAAAxx +2744 3217 0 0 4 4 44 744 744 2744 2744 88 89 OBAAAA TTEAAA HHHHxx +4206 3218 0 2 6 6 6 206 206 4206 4206 12 13 UFAAAA UTEAAA OOOOxx +1846 3219 0 2 6 6 46 846 1846 1846 1846 92 93 ATAAAA VTEAAA VVVVxx +9913 3220 1 1 3 13 13 913 1913 4913 9913 26 27 HRAAAA WTEAAA AAAAxx +4078 3221 0 2 8 18 78 78 78 4078 4078 156 157 WAAAAA XTEAAA HHHHxx +2080 3222 0 0 0 0 80 80 80 2080 2080 160 161 ACAAAA YTEAAA OOOOxx +4169 3223 1 1 9 9 69 169 169 4169 4169 138 139 JEAAAA ZTEAAA VVVVxx +2070 3224 0 2 0 10 70 70 70 2070 2070 140 141 QBAAAA AUEAAA AAAAxx +4500 3225 0 0 0 0 0 500 500 4500 4500 0 1 CRAAAA BUEAAA HHHHxx +4123 3226 1 3 3 3 23 123 123 4123 4123 46 47 PCAAAA CUEAAA OOOOxx +5594 3227 0 2 4 14 94 594 1594 594 5594 188 189 EHAAAA DUEAAA VVVVxx +9941 3228 1 1 1 1 41 941 1941 4941 9941 82 83 JSAAAA EUEAAA AAAAxx +7154 3229 0 2 4 14 54 154 1154 2154 7154 108 109 EPAAAA FUEAAA HHHHxx +8340 3230 0 0 0 0 40 340 340 3340 8340 80 81 UIAAAA GUEAAA OOOOxx +7110 3231 0 2 0 10 10 110 1110 2110 7110 20 21 MNAAAA HUEAAA VVVVxx +7795 3232 1 3 5 15 95 795 1795 2795 7795 190 191 VNAAAA IUEAAA AAAAxx +132 3233 0 0 2 12 32 132 132 132 132 64 65 CFAAAA JUEAAA HHHHxx +4603 3234 1 3 3 3 3 603 603 4603 4603 6 7 BVAAAA KUEAAA OOOOxx +9720 3235 0 0 0 0 20 720 1720 4720 9720 40 41 WJAAAA LUEAAA VVVVxx +1460 3236 0 0 0 0 60 460 1460 1460 1460 120 121 EEAAAA MUEAAA AAAAxx +4677 3237 1 1 7 17 77 677 677 4677 4677 154 155 XXAAAA NUEAAA HHHHxx +9272 3238 0 0 2 12 72 272 1272 4272 9272 144 145 QSAAAA OUEAAA OOOOxx +2279 3239 1 3 9 19 79 279 279 2279 2279 158 159 RJAAAA PUEAAA VVVVxx +4587 3240 1 3 7 7 87 587 587 4587 4587 174 175 LUAAAA QUEAAA AAAAxx +2244 3241 0 0 4 4 44 244 244 2244 2244 88 89 IIAAAA RUEAAA HHHHxx +742 3242 0 2 2 2 42 742 742 742 742 84 85 OCAAAA SUEAAA OOOOxx +4426 3243 0 2 6 6 26 426 426 4426 4426 52 53 GOAAAA TUEAAA VVVVxx +4571 3244 1 3 1 11 71 571 571 4571 4571 142 143 VTAAAA UUEAAA AAAAxx +4775 3245 1 3 5 15 75 775 775 4775 4775 150 151 RBAAAA VUEAAA HHHHxx +24 3246 0 0 4 4 24 24 24 24 24 48 49 YAAAAA WUEAAA OOOOxx +4175 3247 1 3 5 15 75 175 175 4175 4175 150 151 PEAAAA XUEAAA VVVVxx +9877 3248 1 1 7 17 77 877 1877 4877 9877 154 155 XPAAAA YUEAAA AAAAxx +7271 3249 1 3 1 11 71 271 1271 2271 7271 142 143 RTAAAA ZUEAAA HHHHxx +5468 3250 0 0 8 8 68 468 1468 468 5468 136 137 ICAAAA AVEAAA OOOOxx +6106 3251 0 2 6 6 6 106 106 1106 6106 12 13 WAAAAA BVEAAA VVVVxx +9005 3252 1 1 5 5 5 5 1005 4005 9005 10 11 JIAAAA CVEAAA AAAAxx +109 3253 1 1 9 9 9 109 109 109 109 18 19 FEAAAA DVEAAA HHHHxx +6365 3254 1 1 5 5 65 365 365 1365 6365 130 131 VKAAAA EVEAAA OOOOxx +7437 3255 1 1 7 17 37 437 1437 2437 7437 74 75 BAAAAA FVEAAA VVVVxx +7979 3256 1 3 9 19 79 979 1979 2979 7979 158 159 XUAAAA GVEAAA AAAAxx +6050 3257 0 2 0 10 50 50 50 1050 6050 100 101 SYAAAA HVEAAA HHHHxx +2853 3258 1 1 3 13 53 853 853 2853 2853 106 107 TFAAAA IVEAAA OOOOxx +7603 3259 1 3 3 3 3 603 1603 2603 7603 6 7 LGAAAA JVEAAA VVVVxx +483 3260 1 3 3 3 83 483 483 483 483 166 167 PSAAAA KVEAAA AAAAxx +5994 3261 0 2 4 14 94 994 1994 994 5994 188 189 OWAAAA LVEAAA HHHHxx +6708 3262 0 0 8 8 8 708 708 1708 6708 16 17 AYAAAA MVEAAA OOOOxx +5090 3263 0 2 0 10 90 90 1090 90 5090 180 181 UNAAAA NVEAAA VVVVxx +4608 3264 0 0 8 8 8 608 608 4608 4608 16 17 GVAAAA OVEAAA AAAAxx +4551 3265 1 3 1 11 51 551 551 4551 4551 102 103 BTAAAA PVEAAA HHHHxx +5437 3266 1 1 7 17 37 437 1437 437 5437 74 75 DBAAAA QVEAAA OOOOxx +4130 3267 0 2 0 10 30 130 130 4130 4130 60 61 WCAAAA RVEAAA VVVVxx +6363 3268 1 3 3 3 63 363 363 1363 6363 126 127 TKAAAA SVEAAA AAAAxx +1499 3269 1 3 9 19 99 499 1499 1499 1499 198 199 RFAAAA TVEAAA HHHHxx +384 3270 0 0 4 4 84 384 384 384 384 168 169 UOAAAA UVEAAA OOOOxx +2266 3271 0 2 6 6 66 266 266 2266 2266 132 133 EJAAAA VVEAAA VVVVxx +6018 3272 0 2 8 18 18 18 18 1018 6018 36 37 MXAAAA WVEAAA AAAAxx +7915 3273 1 3 5 15 15 915 1915 2915 7915 30 31 LSAAAA XVEAAA HHHHxx +6167 3274 1 3 7 7 67 167 167 1167 6167 134 135 FDAAAA YVEAAA OOOOxx +9988 3275 0 0 8 8 88 988 1988 4988 9988 176 177 EUAAAA ZVEAAA VVVVxx +6599 3276 1 3 9 19 99 599 599 1599 6599 198 199 VTAAAA AWEAAA AAAAxx +1693 3277 1 1 3 13 93 693 1693 1693 1693 186 187 DNAAAA BWEAAA HHHHxx +5971 3278 1 3 1 11 71 971 1971 971 5971 142 143 RVAAAA CWEAAA OOOOxx +8470 3279 0 2 0 10 70 470 470 3470 8470 140 141 UNAAAA DWEAAA VVVVxx +2807 3280 1 3 7 7 7 807 807 2807 2807 14 15 ZDAAAA EWEAAA AAAAxx +1120 3281 0 0 0 0 20 120 1120 1120 1120 40 41 CRAAAA FWEAAA HHHHxx +5924 3282 0 0 4 4 24 924 1924 924 5924 48 49 WTAAAA GWEAAA OOOOxx +9025 3283 1 1 5 5 25 25 1025 4025 9025 50 51 DJAAAA HWEAAA VVVVxx +9454 3284 0 2 4 14 54 454 1454 4454 9454 108 109 QZAAAA IWEAAA AAAAxx +2259 3285 1 3 9 19 59 259 259 2259 2259 118 119 XIAAAA JWEAAA HHHHxx +5249 3286 1 1 9 9 49 249 1249 249 5249 98 99 XTAAAA KWEAAA OOOOxx +6350 3287 0 2 0 10 50 350 350 1350 6350 100 101 GKAAAA LWEAAA VVVVxx +2930 3288 0 2 0 10 30 930 930 2930 2930 60 61 SIAAAA MWEAAA AAAAxx +6055 3289 1 3 5 15 55 55 55 1055 6055 110 111 XYAAAA NWEAAA HHHHxx +7691 3290 1 3 1 11 91 691 1691 2691 7691 182 183 VJAAAA OWEAAA OOOOxx +1573 3291 1 1 3 13 73 573 1573 1573 1573 146 147 NIAAAA PWEAAA VVVVxx +9943 3292 1 3 3 3 43 943 1943 4943 9943 86 87 LSAAAA QWEAAA AAAAxx +3085 3293 1 1 5 5 85 85 1085 3085 3085 170 171 ROAAAA RWEAAA HHHHxx +5928 3294 0 0 8 8 28 928 1928 928 5928 56 57 AUAAAA SWEAAA OOOOxx +887 3295 1 3 7 7 87 887 887 887 887 174 175 DIAAAA TWEAAA VVVVxx +4630 3296 0 2 0 10 30 630 630 4630 4630 60 61 CWAAAA UWEAAA AAAAxx +9827 3297 1 3 7 7 27 827 1827 4827 9827 54 55 ZNAAAA VWEAAA HHHHxx +8926 3298 0 2 6 6 26 926 926 3926 8926 52 53 IFAAAA WWEAAA OOOOxx +5726 3299 0 2 6 6 26 726 1726 726 5726 52 53 GMAAAA XWEAAA VVVVxx +1569 3300 1 1 9 9 69 569 1569 1569 1569 138 139 JIAAAA YWEAAA AAAAxx +8074 3301 0 2 4 14 74 74 74 3074 8074 148 149 OYAAAA ZWEAAA HHHHxx +7909 3302 1 1 9 9 9 909 1909 2909 7909 18 19 FSAAAA AXEAAA OOOOxx +8367 3303 1 3 7 7 67 367 367 3367 8367 134 135 VJAAAA BXEAAA VVVVxx +7217 3304 1 1 7 17 17 217 1217 2217 7217 34 35 PRAAAA CXEAAA AAAAxx +5254 3305 0 2 4 14 54 254 1254 254 5254 108 109 CUAAAA DXEAAA HHHHxx +1181 3306 1 1 1 1 81 181 1181 1181 1181 162 163 LTAAAA EXEAAA OOOOxx +6907 3307 1 3 7 7 7 907 907 1907 6907 14 15 RFAAAA FXEAAA VVVVxx +5508 3308 0 0 8 8 8 508 1508 508 5508 16 17 WDAAAA GXEAAA AAAAxx +4782 3309 0 2 2 2 82 782 782 4782 4782 164 165 YBAAAA HXEAAA HHHHxx +793 3310 1 1 3 13 93 793 793 793 793 186 187 NEAAAA IXEAAA OOOOxx +5740 3311 0 0 0 0 40 740 1740 740 5740 80 81 UMAAAA JXEAAA VVVVxx +3107 3312 1 3 7 7 7 107 1107 3107 3107 14 15 NPAAAA KXEAAA AAAAxx +1197 3313 1 1 7 17 97 197 1197 1197 1197 194 195 BUAAAA LXEAAA HHHHxx +4376 3314 0 0 6 16 76 376 376 4376 4376 152 153 IMAAAA MXEAAA OOOOxx +6226 3315 0 2 6 6 26 226 226 1226 6226 52 53 MFAAAA NXEAAA VVVVxx +5033 3316 1 1 3 13 33 33 1033 33 5033 66 67 PLAAAA OXEAAA AAAAxx +5494 3317 0 2 4 14 94 494 1494 494 5494 188 189 IDAAAA PXEAAA HHHHxx +3244 3318 0 0 4 4 44 244 1244 3244 3244 88 89 UUAAAA QXEAAA OOOOxx +7670 3319 0 2 0 10 70 670 1670 2670 7670 140 141 AJAAAA RXEAAA VVVVxx +9273 3320 1 1 3 13 73 273 1273 4273 9273 146 147 RSAAAA SXEAAA AAAAxx +5248 3321 0 0 8 8 48 248 1248 248 5248 96 97 WTAAAA TXEAAA HHHHxx +3381 3322 1 1 1 1 81 381 1381 3381 3381 162 163 BAAAAA UXEAAA OOOOxx +4136 3323 0 0 6 16 36 136 136 4136 4136 72 73 CDAAAA VXEAAA VVVVxx +4163 3324 1 3 3 3 63 163 163 4163 4163 126 127 DEAAAA WXEAAA AAAAxx +4270 3325 0 2 0 10 70 270 270 4270 4270 140 141 GIAAAA XXEAAA HHHHxx +1729 3326 1 1 9 9 29 729 1729 1729 1729 58 59 NOAAAA YXEAAA OOOOxx +2778 3327 0 2 8 18 78 778 778 2778 2778 156 157 WCAAAA ZXEAAA VVVVxx +5082 3328 0 2 2 2 82 82 1082 82 5082 164 165 MNAAAA AYEAAA AAAAxx +870 3329 0 2 0 10 70 870 870 870 870 140 141 MHAAAA BYEAAA HHHHxx +4192 3330 0 0 2 12 92 192 192 4192 4192 184 185 GFAAAA CYEAAA OOOOxx +308 3331 0 0 8 8 8 308 308 308 308 16 17 WLAAAA DYEAAA VVVVxx +6783 3332 1 3 3 3 83 783 783 1783 6783 166 167 XAAAAA EYEAAA AAAAxx +7611 3333 1 3 1 11 11 611 1611 2611 7611 22 23 TGAAAA FYEAAA HHHHxx +4221 3334 1 1 1 1 21 221 221 4221 4221 42 43 JGAAAA GYEAAA OOOOxx +6353 3335 1 1 3 13 53 353 353 1353 6353 106 107 JKAAAA HYEAAA VVVVxx +1830 3336 0 2 0 10 30 830 1830 1830 1830 60 61 KSAAAA IYEAAA AAAAxx +2437 3337 1 1 7 17 37 437 437 2437 2437 74 75 TPAAAA JYEAAA HHHHxx +3360 3338 0 0 0 0 60 360 1360 3360 3360 120 121 GZAAAA KYEAAA OOOOxx +1829 3339 1 1 9 9 29 829 1829 1829 1829 58 59 JSAAAA LYEAAA VVVVxx +9475 3340 1 3 5 15 75 475 1475 4475 9475 150 151 LAAAAA MYEAAA AAAAxx +4566 3341 0 2 6 6 66 566 566 4566 4566 132 133 QTAAAA NYEAAA HHHHxx +9944 3342 0 0 4 4 44 944 1944 4944 9944 88 89 MSAAAA OYEAAA OOOOxx +6054 3343 0 2 4 14 54 54 54 1054 6054 108 109 WYAAAA PYEAAA VVVVxx +4722 3344 0 2 2 2 22 722 722 4722 4722 44 45 QZAAAA QYEAAA AAAAxx +2779 3345 1 3 9 19 79 779 779 2779 2779 158 159 XCAAAA RYEAAA HHHHxx +8051 3346 1 3 1 11 51 51 51 3051 8051 102 103 RXAAAA SYEAAA OOOOxx +9671 3347 1 3 1 11 71 671 1671 4671 9671 142 143 ZHAAAA TYEAAA VVVVxx +6084 3348 0 0 4 4 84 84 84 1084 6084 168 169 AAAAAA UYEAAA AAAAxx +3729 3349 1 1 9 9 29 729 1729 3729 3729 58 59 LNAAAA VYEAAA HHHHxx +6627 3350 1 3 7 7 27 627 627 1627 6627 54 55 XUAAAA WYEAAA OOOOxx +4769 3351 1 1 9 9 69 769 769 4769 4769 138 139 LBAAAA XYEAAA VVVVxx +2224 3352 0 0 4 4 24 224 224 2224 2224 48 49 OHAAAA YYEAAA AAAAxx +1404 3353 0 0 4 4 4 404 1404 1404 1404 8 9 ACAAAA ZYEAAA HHHHxx +8532 3354 0 0 2 12 32 532 532 3532 8532 64 65 EQAAAA AZEAAA OOOOxx +6759 3355 1 3 9 19 59 759 759 1759 6759 118 119 ZZAAAA BZEAAA VVVVxx +6404 3356 0 0 4 4 4 404 404 1404 6404 8 9 IMAAAA CZEAAA AAAAxx +3144 3357 0 0 4 4 44 144 1144 3144 3144 88 89 YQAAAA DZEAAA HHHHxx +973 3358 1 1 3 13 73 973 973 973 973 146 147 LLAAAA EZEAAA OOOOxx +9789 3359 1 1 9 9 89 789 1789 4789 9789 178 179 NMAAAA FZEAAA VVVVxx +6181 3360 1 1 1 1 81 181 181 1181 6181 162 163 TDAAAA GZEAAA AAAAxx +1519 3361 1 3 9 19 19 519 1519 1519 1519 38 39 LGAAAA HZEAAA HHHHxx +9729 3362 1 1 9 9 29 729 1729 4729 9729 58 59 FKAAAA IZEAAA OOOOxx +8167 3363 1 3 7 7 67 167 167 3167 8167 134 135 DCAAAA JZEAAA VVVVxx +3830 3364 0 2 0 10 30 830 1830 3830 3830 60 61 IRAAAA KZEAAA AAAAxx +6286 3365 0 2 6 6 86 286 286 1286 6286 172 173 UHAAAA LZEAAA HHHHxx +3047 3366 1 3 7 7 47 47 1047 3047 3047 94 95 FNAAAA MZEAAA OOOOxx +3183 3367 1 3 3 3 83 183 1183 3183 3183 166 167 LSAAAA NZEAAA VVVVxx +6687 3368 1 3 7 7 87 687 687 1687 6687 174 175 FXAAAA OZEAAA AAAAxx +2783 3369 1 3 3 3 83 783 783 2783 2783 166 167 BDAAAA PZEAAA HHHHxx +9920 3370 0 0 0 0 20 920 1920 4920 9920 40 41 ORAAAA QZEAAA OOOOxx +4847 3371 1 3 7 7 47 847 847 4847 4847 94 95 LEAAAA RZEAAA VVVVxx +3645 3372 1 1 5 5 45 645 1645 3645 3645 90 91 FKAAAA SZEAAA AAAAxx +7406 3373 0 2 6 6 6 406 1406 2406 7406 12 13 WYAAAA TZEAAA HHHHxx +6003 3374 1 3 3 3 3 3 3 1003 6003 6 7 XWAAAA UZEAAA OOOOxx +3408 3375 0 0 8 8 8 408 1408 3408 3408 16 17 CBAAAA VZEAAA VVVVxx +4243 3376 1 3 3 3 43 243 243 4243 4243 86 87 FHAAAA WZEAAA AAAAxx +1622 3377 0 2 2 2 22 622 1622 1622 1622 44 45 KKAAAA XZEAAA HHHHxx +5319 3378 1 3 9 19 19 319 1319 319 5319 38 39 PWAAAA YZEAAA OOOOxx +4033 3379 1 1 3 13 33 33 33 4033 4033 66 67 DZAAAA ZZEAAA VVVVxx +8573 3380 1 1 3 13 73 573 573 3573 8573 146 147 TRAAAA AAFAAA AAAAxx +8404 3381 0 0 4 4 4 404 404 3404 8404 8 9 GLAAAA BAFAAA HHHHxx +6993 3382 1 1 3 13 93 993 993 1993 6993 186 187 ZIAAAA CAFAAA OOOOxx +660 3383 0 0 0 0 60 660 660 660 660 120 121 KZAAAA DAFAAA VVVVxx +1136 3384 0 0 6 16 36 136 1136 1136 1136 72 73 SRAAAA EAFAAA AAAAxx +3393 3385 1 1 3 13 93 393 1393 3393 3393 186 187 NAAAAA FAFAAA HHHHxx +9743 3386 1 3 3 3 43 743 1743 4743 9743 86 87 TKAAAA GAFAAA OOOOxx +9705 3387 1 1 5 5 5 705 1705 4705 9705 10 11 HJAAAA HAFAAA VVVVxx +6960 3388 0 0 0 0 60 960 960 1960 6960 120 121 SHAAAA IAFAAA AAAAxx +2753 3389 1 1 3 13 53 753 753 2753 2753 106 107 XBAAAA JAFAAA HHHHxx +906 3390 0 2 6 6 6 906 906 906 906 12 13 WIAAAA KAFAAA OOOOxx +999 3391 1 3 9 19 99 999 999 999 999 198 199 LMAAAA LAFAAA VVVVxx +6927 3392 1 3 7 7 27 927 927 1927 6927 54 55 LGAAAA MAFAAA AAAAxx +4846 3393 0 2 6 6 46 846 846 4846 4846 92 93 KEAAAA NAFAAA HHHHxx +676 3394 0 0 6 16 76 676 676 676 676 152 153 AAAAAA OAFAAA OOOOxx +8612 3395 0 0 2 12 12 612 612 3612 8612 24 25 GTAAAA PAFAAA VVVVxx +4111 3396 1 3 1 11 11 111 111 4111 4111 22 23 DCAAAA QAFAAA AAAAxx +9994 3397 0 2 4 14 94 994 1994 4994 9994 188 189 KUAAAA RAFAAA HHHHxx +4399 3398 1 3 9 19 99 399 399 4399 4399 198 199 FNAAAA SAFAAA OOOOxx +4464 3399 0 0 4 4 64 464 464 4464 4464 128 129 SPAAAA TAFAAA VVVVxx +7316 3400 0 0 6 16 16 316 1316 2316 7316 32 33 KVAAAA UAFAAA AAAAxx +8982 3401 0 2 2 2 82 982 982 3982 8982 164 165 MHAAAA VAFAAA HHHHxx +1871 3402 1 3 1 11 71 871 1871 1871 1871 142 143 ZTAAAA WAFAAA OOOOxx +4082 3403 0 2 2 2 82 82 82 4082 4082 164 165 ABAAAA XAFAAA VVVVxx +3949 3404 1 1 9 9 49 949 1949 3949 3949 98 99 XVAAAA YAFAAA AAAAxx +9352 3405 0 0 2 12 52 352 1352 4352 9352 104 105 SVAAAA ZAFAAA HHHHxx +9638 3406 0 2 8 18 38 638 1638 4638 9638 76 77 SGAAAA ABFAAA OOOOxx +8177 3407 1 1 7 17 77 177 177 3177 8177 154 155 NCAAAA BBFAAA VVVVxx +3499 3408 1 3 9 19 99 499 1499 3499 3499 198 199 PEAAAA CBFAAA AAAAxx +4233 3409 1 1 3 13 33 233 233 4233 4233 66 67 VGAAAA DBFAAA HHHHxx +1953 3410 1 1 3 13 53 953 1953 1953 1953 106 107 DXAAAA EBFAAA OOOOxx +7372 3411 0 0 2 12 72 372 1372 2372 7372 144 145 OXAAAA FBFAAA VVVVxx +5127 3412 1 3 7 7 27 127 1127 127 5127 54 55 FPAAAA GBFAAA AAAAxx +4384 3413 0 0 4 4 84 384 384 4384 4384 168 169 QMAAAA HBFAAA HHHHxx +9964 3414 0 0 4 4 64 964 1964 4964 9964 128 129 GTAAAA IBFAAA OOOOxx +5392 3415 0 0 2 12 92 392 1392 392 5392 184 185 KZAAAA JBFAAA VVVVxx +616 3416 0 0 6 16 16 616 616 616 616 32 33 SXAAAA KBFAAA AAAAxx +591 3417 1 3 1 11 91 591 591 591 591 182 183 TWAAAA LBFAAA HHHHxx +6422 3418 0 2 2 2 22 422 422 1422 6422 44 45 ANAAAA MBFAAA OOOOxx +6551 3419 1 3 1 11 51 551 551 1551 6551 102 103 ZRAAAA NBFAAA VVVVxx +9286 3420 0 2 6 6 86 286 1286 4286 9286 172 173 ETAAAA OBFAAA AAAAxx +3817 3421 1 1 7 17 17 817 1817 3817 3817 34 35 VQAAAA PBFAAA HHHHxx +7717 3422 1 1 7 17 17 717 1717 2717 7717 34 35 VKAAAA QBFAAA OOOOxx +8718 3423 0 2 8 18 18 718 718 3718 8718 36 37 IXAAAA RBFAAA VVVVxx +8608 3424 0 0 8 8 8 608 608 3608 8608 16 17 CTAAAA SBFAAA AAAAxx +2242 3425 0 2 2 2 42 242 242 2242 2242 84 85 GIAAAA TBFAAA HHHHxx +4811 3426 1 3 1 11 11 811 811 4811 4811 22 23 BDAAAA UBFAAA OOOOxx +6838 3427 0 2 8 18 38 838 838 1838 6838 76 77 ADAAAA VBFAAA VVVVxx +787 3428 1 3 7 7 87 787 787 787 787 174 175 HEAAAA WBFAAA AAAAxx +7940 3429 0 0 0 0 40 940 1940 2940 7940 80 81 KTAAAA XBFAAA HHHHxx +336 3430 0 0 6 16 36 336 336 336 336 72 73 YMAAAA YBFAAA OOOOxx +9859 3431 1 3 9 19 59 859 1859 4859 9859 118 119 FPAAAA ZBFAAA VVVVxx +3864 3432 0 0 4 4 64 864 1864 3864 3864 128 129 QSAAAA ACFAAA AAAAxx +7162 3433 0 2 2 2 62 162 1162 2162 7162 124 125 MPAAAA BCFAAA HHHHxx +2071 3434 1 3 1 11 71 71 71 2071 2071 142 143 RBAAAA CCFAAA OOOOxx +7469 3435 1 1 9 9 69 469 1469 2469 7469 138 139 HBAAAA DCFAAA VVVVxx +2917 3436 1 1 7 17 17 917 917 2917 2917 34 35 FIAAAA ECFAAA AAAAxx +7486 3437 0 2 6 6 86 486 1486 2486 7486 172 173 YBAAAA FCFAAA HHHHxx +3355 3438 1 3 5 15 55 355 1355 3355 3355 110 111 BZAAAA GCFAAA OOOOxx +6998 3439 0 2 8 18 98 998 998 1998 6998 196 197 EJAAAA HCFAAA VVVVxx +5498 3440 0 2 8 18 98 498 1498 498 5498 196 197 MDAAAA ICFAAA AAAAxx +5113 3441 1 1 3 13 13 113 1113 113 5113 26 27 ROAAAA JCFAAA HHHHxx +2846 3442 0 2 6 6 46 846 846 2846 2846 92 93 MFAAAA KCFAAA OOOOxx +6834 3443 0 2 4 14 34 834 834 1834 6834 68 69 WCAAAA LCFAAA VVVVxx +8925 3444 1 1 5 5 25 925 925 3925 8925 50 51 HFAAAA MCFAAA AAAAxx +2757 3445 1 1 7 17 57 757 757 2757 2757 114 115 BCAAAA NCFAAA HHHHxx +2775 3446 1 3 5 15 75 775 775 2775 2775 150 151 TCAAAA OCFAAA OOOOxx +6182 3447 0 2 2 2 82 182 182 1182 6182 164 165 UDAAAA PCFAAA VVVVxx +4488 3448 0 0 8 8 88 488 488 4488 4488 176 177 QQAAAA QCFAAA AAAAxx +8523 3449 1 3 3 3 23 523 523 3523 8523 46 47 VPAAAA RCFAAA HHHHxx +52 3450 0 0 2 12 52 52 52 52 52 104 105 ACAAAA SCFAAA OOOOxx +7251 3451 1 3 1 11 51 251 1251 2251 7251 102 103 XSAAAA TCFAAA VVVVxx +6130 3452 0 2 0 10 30 130 130 1130 6130 60 61 UBAAAA UCFAAA AAAAxx +205 3453 1 1 5 5 5 205 205 205 205 10 11 XHAAAA VCFAAA HHHHxx +1186 3454 0 2 6 6 86 186 1186 1186 1186 172 173 QTAAAA WCFAAA OOOOxx +1738 3455 0 2 8 18 38 738 1738 1738 1738 76 77 WOAAAA XCFAAA VVVVxx +9485 3456 1 1 5 5 85 485 1485 4485 9485 170 171 VAAAAA YCFAAA AAAAxx +4235 3457 1 3 5 15 35 235 235 4235 4235 70 71 XGAAAA ZCFAAA HHHHxx +7891 3458 1 3 1 11 91 891 1891 2891 7891 182 183 NRAAAA ADFAAA OOOOxx +4960 3459 0 0 0 0 60 960 960 4960 4960 120 121 UIAAAA BDFAAA VVVVxx +8911 3460 1 3 1 11 11 911 911 3911 8911 22 23 TEAAAA CDFAAA AAAAxx +1219 3461 1 3 9 19 19 219 1219 1219 1219 38 39 XUAAAA DDFAAA HHHHxx +9652 3462 0 0 2 12 52 652 1652 4652 9652 104 105 GHAAAA EDFAAA OOOOxx +9715 3463 1 3 5 15 15 715 1715 4715 9715 30 31 RJAAAA FDFAAA VVVVxx +6629 3464 1 1 9 9 29 629 629 1629 6629 58 59 ZUAAAA GDFAAA AAAAxx +700 3465 0 0 0 0 0 700 700 700 700 0 1 YAAAAA HDFAAA HHHHxx +9819 3466 1 3 9 19 19 819 1819 4819 9819 38 39 RNAAAA IDFAAA OOOOxx +5188 3467 0 0 8 8 88 188 1188 188 5188 176 177 ORAAAA JDFAAA VVVVxx +5367 3468 1 3 7 7 67 367 1367 367 5367 134 135 LYAAAA KDFAAA AAAAxx +6447 3469 1 3 7 7 47 447 447 1447 6447 94 95 ZNAAAA LDFAAA HHHHxx +720 3470 0 0 0 0 20 720 720 720 720 40 41 SBAAAA MDFAAA OOOOxx +9157 3471 1 1 7 17 57 157 1157 4157 9157 114 115 FOAAAA NDFAAA VVVVxx +1082 3472 0 2 2 2 82 82 1082 1082 1082 164 165 QPAAAA ODFAAA AAAAxx +3179 3473 1 3 9 19 79 179 1179 3179 3179 158 159 HSAAAA PDFAAA HHHHxx +4818 3474 0 2 8 18 18 818 818 4818 4818 36 37 IDAAAA QDFAAA OOOOxx +7607 3475 1 3 7 7 7 607 1607 2607 7607 14 15 PGAAAA RDFAAA VVVVxx +2352 3476 0 0 2 12 52 352 352 2352 2352 104 105 MMAAAA SDFAAA AAAAxx +1170 3477 0 2 0 10 70 170 1170 1170 1170 140 141 ATAAAA TDFAAA HHHHxx +4269 3478 1 1 9 9 69 269 269 4269 4269 138 139 FIAAAA UDFAAA OOOOxx +8767 3479 1 3 7 7 67 767 767 3767 8767 134 135 FZAAAA VDFAAA VVVVxx +3984 3480 0 0 4 4 84 984 1984 3984 3984 168 169 GXAAAA WDFAAA AAAAxx +3190 3481 0 2 0 10 90 190 1190 3190 3190 180 181 SSAAAA XDFAAA HHHHxx +7456 3482 0 0 6 16 56 456 1456 2456 7456 112 113 UAAAAA YDFAAA OOOOxx +4348 3483 0 0 8 8 48 348 348 4348 4348 96 97 GLAAAA ZDFAAA VVVVxx +3150 3484 0 2 0 10 50 150 1150 3150 3150 100 101 ERAAAA AEFAAA AAAAxx +8780 3485 0 0 0 0 80 780 780 3780 8780 160 161 SZAAAA BEFAAA HHHHxx +2553 3486 1 1 3 13 53 553 553 2553 2553 106 107 FUAAAA CEFAAA OOOOxx +7526 3487 0 2 6 6 26 526 1526 2526 7526 52 53 MDAAAA DEFAAA VVVVxx +2031 3488 1 3 1 11 31 31 31 2031 2031 62 63 DAAAAA EEFAAA AAAAxx +8793 3489 1 1 3 13 93 793 793 3793 8793 186 187 FAAAAA FEFAAA HHHHxx +1122 3490 0 2 2 2 22 122 1122 1122 1122 44 45 ERAAAA GEFAAA OOOOxx +1855 3491 1 3 5 15 55 855 1855 1855 1855 110 111 JTAAAA HEFAAA VVVVxx +6613 3492 1 1 3 13 13 613 613 1613 6613 26 27 JUAAAA IEFAAA AAAAxx +3231 3493 1 3 1 11 31 231 1231 3231 3231 62 63 HUAAAA JEFAAA HHHHxx +9101 3494 1 1 1 1 1 101 1101 4101 9101 2 3 BMAAAA KEFAAA OOOOxx +4937 3495 1 1 7 17 37 937 937 4937 4937 74 75 XHAAAA LEFAAA VVVVxx +666 3496 0 2 6 6 66 666 666 666 666 132 133 QZAAAA MEFAAA AAAAxx +8943 3497 1 3 3 3 43 943 943 3943 8943 86 87 ZFAAAA NEFAAA HHHHxx +6164 3498 0 0 4 4 64 164 164 1164 6164 128 129 CDAAAA OEFAAA OOOOxx +1081 3499 1 1 1 1 81 81 1081 1081 1081 162 163 PPAAAA PEFAAA VVVVxx +210 3500 0 2 0 10 10 210 210 210 210 20 21 CIAAAA QEFAAA AAAAxx +6024 3501 0 0 4 4 24 24 24 1024 6024 48 49 SXAAAA REFAAA HHHHxx +5715 3502 1 3 5 15 15 715 1715 715 5715 30 31 VLAAAA SEFAAA OOOOxx +8938 3503 0 2 8 18 38 938 938 3938 8938 76 77 UFAAAA TEFAAA VVVVxx +1326 3504 0 2 6 6 26 326 1326 1326 1326 52 53 AZAAAA UEFAAA AAAAxx +7111 3505 1 3 1 11 11 111 1111 2111 7111 22 23 NNAAAA VEFAAA HHHHxx +757 3506 1 1 7 17 57 757 757 757 757 114 115 DDAAAA WEFAAA OOOOxx +8933 3507 1 1 3 13 33 933 933 3933 8933 66 67 PFAAAA XEFAAA VVVVxx +6495 3508 1 3 5 15 95 495 495 1495 6495 190 191 VPAAAA YEFAAA AAAAxx +3134 3509 0 2 4 14 34 134 1134 3134 3134 68 69 OQAAAA ZEFAAA HHHHxx +1304 3510 0 0 4 4 4 304 1304 1304 1304 8 9 EYAAAA AFFAAA OOOOxx +1835 3511 1 3 5 15 35 835 1835 1835 1835 70 71 PSAAAA BFFAAA VVVVxx +7275 3512 1 3 5 15 75 275 1275 2275 7275 150 151 VTAAAA CFFAAA AAAAxx +7337 3513 1 1 7 17 37 337 1337 2337 7337 74 75 FWAAAA DFFAAA HHHHxx +1282 3514 0 2 2 2 82 282 1282 1282 1282 164 165 IXAAAA EFFAAA OOOOxx +6566 3515 0 2 6 6 66 566 566 1566 6566 132 133 OSAAAA FFFAAA VVVVxx +3786 3516 0 2 6 6 86 786 1786 3786 3786 172 173 QPAAAA GFFAAA AAAAxx +5741 3517 1 1 1 1 41 741 1741 741 5741 82 83 VMAAAA HFFAAA HHHHxx +6076 3518 0 0 6 16 76 76 76 1076 6076 152 153 SZAAAA IFFAAA OOOOxx +9998 3519 0 2 8 18 98 998 1998 4998 9998 196 197 OUAAAA JFFAAA VVVVxx +6268 3520 0 0 8 8 68 268 268 1268 6268 136 137 CHAAAA KFFAAA AAAAxx +9647 3521 1 3 7 7 47 647 1647 4647 9647 94 95 BHAAAA LFFAAA HHHHxx +4877 3522 1 1 7 17 77 877 877 4877 4877 154 155 PFAAAA MFFAAA OOOOxx +2652 3523 0 0 2 12 52 652 652 2652 2652 104 105 AYAAAA NFFAAA VVVVxx +1247 3524 1 3 7 7 47 247 1247 1247 1247 94 95 ZVAAAA OFFAAA AAAAxx +2721 3525 1 1 1 1 21 721 721 2721 2721 42 43 RAAAAA PFFAAA HHHHxx +5968 3526 0 0 8 8 68 968 1968 968 5968 136 137 OVAAAA QFFAAA OOOOxx +9570 3527 0 2 0 10 70 570 1570 4570 9570 140 141 CEAAAA RFFAAA VVVVxx +6425 3528 1 1 5 5 25 425 425 1425 6425 50 51 DNAAAA SFFAAA AAAAxx +5451 3529 1 3 1 11 51 451 1451 451 5451 102 103 RBAAAA TFFAAA HHHHxx +5668 3530 0 0 8 8 68 668 1668 668 5668 136 137 AKAAAA UFFAAA OOOOxx +9493 3531 1 1 3 13 93 493 1493 4493 9493 186 187 DBAAAA VFFAAA VVVVxx +7973 3532 1 1 3 13 73 973 1973 2973 7973 146 147 RUAAAA WFFAAA AAAAxx +8250 3533 0 2 0 10 50 250 250 3250 8250 100 101 IFAAAA XFFAAA HHHHxx +82 3534 0 2 2 2 82 82 82 82 82 164 165 EDAAAA YFFAAA OOOOxx +6258 3535 0 2 8 18 58 258 258 1258 6258 116 117 SGAAAA ZFFAAA VVVVxx +9978 3536 0 2 8 18 78 978 1978 4978 9978 156 157 UTAAAA AGFAAA AAAAxx +6930 3537 0 2 0 10 30 930 930 1930 6930 60 61 OGAAAA BGFAAA HHHHxx +3746 3538 0 2 6 6 46 746 1746 3746 3746 92 93 COAAAA CGFAAA OOOOxx +7065 3539 1 1 5 5 65 65 1065 2065 7065 130 131 TLAAAA DGFAAA VVVVxx +4281 3540 1 1 1 1 81 281 281 4281 4281 162 163 RIAAAA EGFAAA AAAAxx +4367 3541 1 3 7 7 67 367 367 4367 4367 134 135 ZLAAAA FGFAAA HHHHxx +9526 3542 0 2 6 6 26 526 1526 4526 9526 52 53 KCAAAA GGFAAA OOOOxx +5880 3543 0 0 0 0 80 880 1880 880 5880 160 161 ESAAAA HGFAAA VVVVxx +8480 3544 0 0 0 0 80 480 480 3480 8480 160 161 EOAAAA IGFAAA AAAAxx +2476 3545 0 0 6 16 76 476 476 2476 2476 152 153 GRAAAA JGFAAA HHHHxx +9074 3546 0 2 4 14 74 74 1074 4074 9074 148 149 ALAAAA KGFAAA OOOOxx +4830 3547 0 2 0 10 30 830 830 4830 4830 60 61 UDAAAA LGFAAA VVVVxx +3207 3548 1 3 7 7 7 207 1207 3207 3207 14 15 JTAAAA MGFAAA AAAAxx +7894 3549 0 2 4 14 94 894 1894 2894 7894 188 189 QRAAAA NGFAAA HHHHxx +3860 3550 0 0 0 0 60 860 1860 3860 3860 120 121 MSAAAA OGFAAA OOOOxx +5293 3551 1 1 3 13 93 293 1293 293 5293 186 187 PVAAAA PGFAAA VVVVxx +6895 3552 1 3 5 15 95 895 895 1895 6895 190 191 FFAAAA QGFAAA AAAAxx +9908 3553 0 0 8 8 8 908 1908 4908 9908 16 17 CRAAAA RGFAAA HHHHxx +9247 3554 1 3 7 7 47 247 1247 4247 9247 94 95 RRAAAA SGFAAA OOOOxx +8110 3555 0 2 0 10 10 110 110 3110 8110 20 21 YZAAAA TGFAAA VVVVxx +4716 3556 0 0 6 16 16 716 716 4716 4716 32 33 KZAAAA UGFAAA AAAAxx +4979 3557 1 3 9 19 79 979 979 4979 4979 158 159 NJAAAA VGFAAA HHHHxx +5280 3558 0 0 0 0 80 280 1280 280 5280 160 161 CVAAAA WGFAAA OOOOxx +8326 3559 0 2 6 6 26 326 326 3326 8326 52 53 GIAAAA XGFAAA VVVVxx +5572 3560 0 0 2 12 72 572 1572 572 5572 144 145 IGAAAA YGFAAA AAAAxx +4665 3561 1 1 5 5 65 665 665 4665 4665 130 131 LXAAAA ZGFAAA HHHHxx +3665 3562 1 1 5 5 65 665 1665 3665 3665 130 131 ZKAAAA AHFAAA OOOOxx +6744 3563 0 0 4 4 44 744 744 1744 6744 88 89 KZAAAA BHFAAA VVVVxx +1897 3564 1 1 7 17 97 897 1897 1897 1897 194 195 ZUAAAA CHFAAA AAAAxx +1220 3565 0 0 0 0 20 220 1220 1220 1220 40 41 YUAAAA DHFAAA HHHHxx +2614 3566 0 2 4 14 14 614 614 2614 2614 28 29 OWAAAA EHFAAA OOOOxx +8509 3567 1 1 9 9 9 509 509 3509 8509 18 19 HPAAAA FHFAAA VVVVxx +8521 3568 1 1 1 1 21 521 521 3521 8521 42 43 TPAAAA GHFAAA AAAAxx +4121 3569 1 1 1 1 21 121 121 4121 4121 42 43 NCAAAA HHFAAA HHHHxx +9663 3570 1 3 3 3 63 663 1663 4663 9663 126 127 RHAAAA IHFAAA OOOOxx +2346 3571 0 2 6 6 46 346 346 2346 2346 92 93 GMAAAA JHFAAA VVVVxx +3370 3572 0 2 0 10 70 370 1370 3370 3370 140 141 QZAAAA KHFAAA AAAAxx +1498 3573 0 2 8 18 98 498 1498 1498 1498 196 197 QFAAAA LHFAAA HHHHxx +7422 3574 0 2 2 2 22 422 1422 2422 7422 44 45 MZAAAA MHFAAA OOOOxx +3472 3575 0 0 2 12 72 472 1472 3472 3472 144 145 ODAAAA NHFAAA VVVVxx +4126 3576 0 2 6 6 26 126 126 4126 4126 52 53 SCAAAA OHFAAA AAAAxx +4494 3577 0 2 4 14 94 494 494 4494 4494 188 189 WQAAAA PHFAAA HHHHxx +6323 3578 1 3 3 3 23 323 323 1323 6323 46 47 FJAAAA QHFAAA OOOOxx +2823 3579 1 3 3 3 23 823 823 2823 2823 46 47 PEAAAA RHFAAA VVVVxx +8596 3580 0 0 6 16 96 596 596 3596 8596 192 193 QSAAAA SHFAAA AAAAxx +6642 3581 0 2 2 2 42 642 642 1642 6642 84 85 MVAAAA THFAAA HHHHxx +9276 3582 0 0 6 16 76 276 1276 4276 9276 152 153 USAAAA UHFAAA OOOOxx +4148 3583 0 0 8 8 48 148 148 4148 4148 96 97 ODAAAA VHFAAA VVVVxx +9770 3584 0 2 0 10 70 770 1770 4770 9770 140 141 ULAAAA WHFAAA AAAAxx +9812 3585 0 0 2 12 12 812 1812 4812 9812 24 25 KNAAAA XHFAAA HHHHxx +4419 3586 1 3 9 19 19 419 419 4419 4419 38 39 ZNAAAA YHFAAA OOOOxx +3802 3587 0 2 2 2 2 802 1802 3802 3802 4 5 GQAAAA ZHFAAA VVVVxx +3210 3588 0 2 0 10 10 210 1210 3210 3210 20 21 MTAAAA AIFAAA AAAAxx +6794 3589 0 2 4 14 94 794 794 1794 6794 188 189 IBAAAA BIFAAA HHHHxx +242 3590 0 2 2 2 42 242 242 242 242 84 85 IJAAAA CIFAAA OOOOxx +962 3591 0 2 2 2 62 962 962 962 962 124 125 ALAAAA DIFAAA VVVVxx +7151 3592 1 3 1 11 51 151 1151 2151 7151 102 103 BPAAAA EIFAAA AAAAxx +9440 3593 0 0 0 0 40 440 1440 4440 9440 80 81 CZAAAA FIFAAA HHHHxx +721 3594 1 1 1 1 21 721 721 721 721 42 43 TBAAAA GIFAAA OOOOxx +2119 3595 1 3 9 19 19 119 119 2119 2119 38 39 NDAAAA HIFAAA VVVVxx +9883 3596 1 3 3 3 83 883 1883 4883 9883 166 167 DQAAAA IIFAAA AAAAxx +5071 3597 1 3 1 11 71 71 1071 71 5071 142 143 BNAAAA JIFAAA HHHHxx +8239 3598 1 3 9 19 39 239 239 3239 8239 78 79 XEAAAA KIFAAA OOOOxx +7451 3599 1 3 1 11 51 451 1451 2451 7451 102 103 PAAAAA LIFAAA VVVVxx +9517 3600 1 1 7 17 17 517 1517 4517 9517 34 35 BCAAAA MIFAAA AAAAxx +9180 3601 0 0 0 0 80 180 1180 4180 9180 160 161 CPAAAA NIFAAA HHHHxx +9327 3602 1 3 7 7 27 327 1327 4327 9327 54 55 TUAAAA OIFAAA OOOOxx +5462 3603 0 2 2 2 62 462 1462 462 5462 124 125 CCAAAA PIFAAA VVVVxx +8306 3604 0 2 6 6 6 306 306 3306 8306 12 13 MHAAAA QIFAAA AAAAxx +6234 3605 0 2 4 14 34 234 234 1234 6234 68 69 UFAAAA RIFAAA HHHHxx +8771 3606 1 3 1 11 71 771 771 3771 8771 142 143 JZAAAA SIFAAA OOOOxx +5853 3607 1 1 3 13 53 853 1853 853 5853 106 107 DRAAAA TIFAAA VVVVxx +8373 3608 1 1 3 13 73 373 373 3373 8373 146 147 BKAAAA UIFAAA AAAAxx +5017 3609 1 1 7 17 17 17 1017 17 5017 34 35 ZKAAAA VIFAAA HHHHxx +8025 3610 1 1 5 5 25 25 25 3025 8025 50 51 RWAAAA WIFAAA OOOOxx +2526 3611 0 2 6 6 26 526 526 2526 2526 52 53 ETAAAA XIFAAA VVVVxx +7419 3612 1 3 9 19 19 419 1419 2419 7419 38 39 JZAAAA YIFAAA AAAAxx +4572 3613 0 0 2 12 72 572 572 4572 4572 144 145 WTAAAA ZIFAAA HHHHxx +7744 3614 0 0 4 4 44 744 1744 2744 7744 88 89 WLAAAA AJFAAA OOOOxx +8825 3615 1 1 5 5 25 825 825 3825 8825 50 51 LBAAAA BJFAAA VVVVxx +6067 3616 1 3 7 7 67 67 67 1067 6067 134 135 JZAAAA CJFAAA AAAAxx +3291 3617 1 3 1 11 91 291 1291 3291 3291 182 183 PWAAAA DJFAAA HHHHxx +7115 3618 1 3 5 15 15 115 1115 2115 7115 30 31 RNAAAA EJFAAA OOOOxx +2626 3619 0 2 6 6 26 626 626 2626 2626 52 53 AXAAAA FJFAAA VVVVxx +4109 3620 1 1 9 9 9 109 109 4109 4109 18 19 BCAAAA GJFAAA AAAAxx +4056 3621 0 0 6 16 56 56 56 4056 4056 112 113 AAAAAA HJFAAA HHHHxx +6811 3622 1 3 1 11 11 811 811 1811 6811 22 23 ZBAAAA IJFAAA OOOOxx +680 3623 0 0 0 0 80 680 680 680 680 160 161 EAAAAA JJFAAA VVVVxx +474 3624 0 2 4 14 74 474 474 474 474 148 149 GSAAAA KJFAAA AAAAxx +9294 3625 0 2 4 14 94 294 1294 4294 9294 188 189 MTAAAA LJFAAA HHHHxx +7555 3626 1 3 5 15 55 555 1555 2555 7555 110 111 PEAAAA MJFAAA OOOOxx +8076 3627 0 0 6 16 76 76 76 3076 8076 152 153 QYAAAA NJFAAA VVVVxx +3840 3628 0 0 0 0 40 840 1840 3840 3840 80 81 SRAAAA OJFAAA AAAAxx +5955 3629 1 3 5 15 55 955 1955 955 5955 110 111 BVAAAA PJFAAA HHHHxx +994 3630 0 2 4 14 94 994 994 994 994 188 189 GMAAAA QJFAAA OOOOxx +2089 3631 1 1 9 9 89 89 89 2089 2089 178 179 JCAAAA RJFAAA VVVVxx +869 3632 1 1 9 9 69 869 869 869 869 138 139 LHAAAA SJFAAA AAAAxx +1223 3633 1 3 3 3 23 223 1223 1223 1223 46 47 BVAAAA TJFAAA HHHHxx +1514 3634 0 2 4 14 14 514 1514 1514 1514 28 29 GGAAAA UJFAAA OOOOxx +4891 3635 1 3 1 11 91 891 891 4891 4891 182 183 DGAAAA VJFAAA VVVVxx +4190 3636 0 2 0 10 90 190 190 4190 4190 180 181 EFAAAA WJFAAA AAAAxx +4377 3637 1 1 7 17 77 377 377 4377 4377 154 155 JMAAAA XJFAAA HHHHxx +9195 3638 1 3 5 15 95 195 1195 4195 9195 190 191 RPAAAA YJFAAA OOOOxx +3827 3639 1 3 7 7 27 827 1827 3827 3827 54 55 FRAAAA ZJFAAA VVVVxx +7386 3640 0 2 6 6 86 386 1386 2386 7386 172 173 CYAAAA AKFAAA AAAAxx +6665 3641 1 1 5 5 65 665 665 1665 6665 130 131 JWAAAA BKFAAA HHHHxx +7514 3642 0 2 4 14 14 514 1514 2514 7514 28 29 ADAAAA CKFAAA OOOOxx +6431 3643 1 3 1 11 31 431 431 1431 6431 62 63 JNAAAA DKFAAA VVVVxx +3251 3644 1 3 1 11 51 251 1251 3251 3251 102 103 BVAAAA EKFAAA AAAAxx +8439 3645 1 3 9 19 39 439 439 3439 8439 78 79 PMAAAA FKFAAA HHHHxx +831 3646 1 3 1 11 31 831 831 831 831 62 63 ZFAAAA GKFAAA OOOOxx +8485 3647 1 1 5 5 85 485 485 3485 8485 170 171 JOAAAA HKFAAA VVVVxx +7314 3648 0 2 4 14 14 314 1314 2314 7314 28 29 IVAAAA IKFAAA AAAAxx +3044 3649 0 0 4 4 44 44 1044 3044 3044 88 89 CNAAAA JKFAAA HHHHxx +4283 3650 1 3 3 3 83 283 283 4283 4283 166 167 TIAAAA KKFAAA OOOOxx +298 3651 0 2 8 18 98 298 298 298 298 196 197 MLAAAA LKFAAA VVVVxx +7114 3652 0 2 4 14 14 114 1114 2114 7114 28 29 QNAAAA MKFAAA AAAAxx +9664 3653 0 0 4 4 64 664 1664 4664 9664 128 129 SHAAAA NKFAAA HHHHxx +5315 3654 1 3 5 15 15 315 1315 315 5315 30 31 LWAAAA OKFAAA OOOOxx +2164 3655 0 0 4 4 64 164 164 2164 2164 128 129 GFAAAA PKFAAA VVVVxx +3390 3656 0 2 0 10 90 390 1390 3390 3390 180 181 KAAAAA QKFAAA AAAAxx +836 3657 0 0 6 16 36 836 836 836 836 72 73 EGAAAA RKFAAA HHHHxx +3316 3658 0 0 6 16 16 316 1316 3316 3316 32 33 OXAAAA SKFAAA OOOOxx +1284 3659 0 0 4 4 84 284 1284 1284 1284 168 169 KXAAAA TKFAAA VVVVxx +2497 3660 1 1 7 17 97 497 497 2497 2497 194 195 BSAAAA UKFAAA AAAAxx +1374 3661 0 2 4 14 74 374 1374 1374 1374 148 149 WAAAAA VKFAAA HHHHxx +9525 3662 1 1 5 5 25 525 1525 4525 9525 50 51 JCAAAA WKFAAA OOOOxx +2911 3663 1 3 1 11 11 911 911 2911 2911 22 23 ZHAAAA XKFAAA VVVVxx +9686 3664 0 2 6 6 86 686 1686 4686 9686 172 173 OIAAAA YKFAAA AAAAxx +584 3665 0 0 4 4 84 584 584 584 584 168 169 MWAAAA ZKFAAA HHHHxx +5653 3666 1 1 3 13 53 653 1653 653 5653 106 107 LJAAAA ALFAAA OOOOxx +4986 3667 0 2 6 6 86 986 986 4986 4986 172 173 UJAAAA BLFAAA VVVVxx +6049 3668 1 1 9 9 49 49 49 1049 6049 98 99 RYAAAA CLFAAA AAAAxx +9891 3669 1 3 1 11 91 891 1891 4891 9891 182 183 LQAAAA DLFAAA HHHHxx +8809 3670 1 1 9 9 9 809 809 3809 8809 18 19 VAAAAA ELFAAA OOOOxx +8598 3671 0 2 8 18 98 598 598 3598 8598 196 197 SSAAAA FLFAAA VVVVxx +2573 3672 1 1 3 13 73 573 573 2573 2573 146 147 ZUAAAA GLFAAA AAAAxx +6864 3673 0 0 4 4 64 864 864 1864 6864 128 129 AEAAAA HLFAAA HHHHxx +7932 3674 0 0 2 12 32 932 1932 2932 7932 64 65 CTAAAA ILFAAA OOOOxx +6605 3675 1 1 5 5 5 605 605 1605 6605 10 11 BUAAAA JLFAAA VVVVxx +9500 3676 0 0 0 0 0 500 1500 4500 9500 0 1 KBAAAA KLFAAA AAAAxx +8742 3677 0 2 2 2 42 742 742 3742 8742 84 85 GYAAAA LLFAAA HHHHxx +9815 3678 1 3 5 15 15 815 1815 4815 9815 30 31 NNAAAA MLFAAA OOOOxx +3319 3679 1 3 9 19 19 319 1319 3319 3319 38 39 RXAAAA NLFAAA VVVVxx +184 3680 0 0 4 4 84 184 184 184 184 168 169 CHAAAA OLFAAA AAAAxx +8886 3681 0 2 6 6 86 886 886 3886 8886 172 173 UDAAAA PLFAAA HHHHxx +7050 3682 0 2 0 10 50 50 1050 2050 7050 100 101 ELAAAA QLFAAA OOOOxx +9781 3683 1 1 1 1 81 781 1781 4781 9781 162 163 FMAAAA RLFAAA VVVVxx +2443 3684 1 3 3 3 43 443 443 2443 2443 86 87 ZPAAAA SLFAAA AAAAxx +1160 3685 0 0 0 0 60 160 1160 1160 1160 120 121 QSAAAA TLFAAA HHHHxx +4600 3686 0 0 0 0 0 600 600 4600 4600 0 1 YUAAAA ULFAAA OOOOxx +813 3687 1 1 3 13 13 813 813 813 813 26 27 HFAAAA VLFAAA VVVVxx +5078 3688 0 2 8 18 78 78 1078 78 5078 156 157 INAAAA WLFAAA AAAAxx +9008 3689 0 0 8 8 8 8 1008 4008 9008 16 17 MIAAAA XLFAAA HHHHxx +9016 3690 0 0 6 16 16 16 1016 4016 9016 32 33 UIAAAA YLFAAA OOOOxx +2747 3691 1 3 7 7 47 747 747 2747 2747 94 95 RBAAAA ZLFAAA VVVVxx +3106 3692 0 2 6 6 6 106 1106 3106 3106 12 13 MPAAAA AMFAAA AAAAxx +8235 3693 1 3 5 15 35 235 235 3235 8235 70 71 TEAAAA BMFAAA HHHHxx +5582 3694 0 2 2 2 82 582 1582 582 5582 164 165 SGAAAA CMFAAA OOOOxx +4334 3695 0 2 4 14 34 334 334 4334 4334 68 69 SKAAAA DMFAAA VVVVxx +1612 3696 0 0 2 12 12 612 1612 1612 1612 24 25 AKAAAA EMFAAA AAAAxx +5650 3697 0 2 0 10 50 650 1650 650 5650 100 101 IJAAAA FMFAAA HHHHxx +6086 3698 0 2 6 6 86 86 86 1086 6086 172 173 CAAAAA GMFAAA OOOOxx +9667 3699 1 3 7 7 67 667 1667 4667 9667 134 135 VHAAAA HMFAAA VVVVxx +4215 3700 1 3 5 15 15 215 215 4215 4215 30 31 DGAAAA IMFAAA AAAAxx +8553 3701 1 1 3 13 53 553 553 3553 8553 106 107 ZQAAAA JMFAAA HHHHxx +9066 3702 0 2 6 6 66 66 1066 4066 9066 132 133 SKAAAA KMFAAA OOOOxx +1092 3703 0 0 2 12 92 92 1092 1092 1092 184 185 AQAAAA LMFAAA VVVVxx +2848 3704 0 0 8 8 48 848 848 2848 2848 96 97 OFAAAA MMFAAA AAAAxx +2765 3705 1 1 5 5 65 765 765 2765 2765 130 131 JCAAAA NMFAAA HHHHxx +6513 3706 1 1 3 13 13 513 513 1513 6513 26 27 NQAAAA OMFAAA OOOOxx +6541 3707 1 1 1 1 41 541 541 1541 6541 82 83 PRAAAA PMFAAA VVVVxx +9617 3708 1 1 7 17 17 617 1617 4617 9617 34 35 XFAAAA QMFAAA AAAAxx +5870 3709 0 2 0 10 70 870 1870 870 5870 140 141 URAAAA RMFAAA HHHHxx +8811 3710 1 3 1 11 11 811 811 3811 8811 22 23 XAAAAA SMFAAA OOOOxx +4529 3711 1 1 9 9 29 529 529 4529 4529 58 59 FSAAAA TMFAAA VVVVxx +161 3712 1 1 1 1 61 161 161 161 161 122 123 FGAAAA UMFAAA AAAAxx +641 3713 1 1 1 1 41 641 641 641 641 82 83 RYAAAA VMFAAA HHHHxx +4767 3714 1 3 7 7 67 767 767 4767 4767 134 135 JBAAAA WMFAAA OOOOxx +6293 3715 1 1 3 13 93 293 293 1293 6293 186 187 BIAAAA XMFAAA VVVVxx +3816 3716 0 0 6 16 16 816 1816 3816 3816 32 33 UQAAAA YMFAAA AAAAxx +4748 3717 0 0 8 8 48 748 748 4748 4748 96 97 QAAAAA ZMFAAA HHHHxx +9924 3718 0 0 4 4 24 924 1924 4924 9924 48 49 SRAAAA ANFAAA OOOOxx +6716 3719 0 0 6 16 16 716 716 1716 6716 32 33 IYAAAA BNFAAA VVVVxx +8828 3720 0 0 8 8 28 828 828 3828 8828 56 57 OBAAAA CNFAAA AAAAxx +4967 3721 1 3 7 7 67 967 967 4967 4967 134 135 BJAAAA DNFAAA HHHHxx +9680 3722 0 0 0 0 80 680 1680 4680 9680 160 161 IIAAAA ENFAAA OOOOxx +2784 3723 0 0 4 4 84 784 784 2784 2784 168 169 CDAAAA FNFAAA VVVVxx +2882 3724 0 2 2 2 82 882 882 2882 2882 164 165 WGAAAA GNFAAA AAAAxx +3641 3725 1 1 1 1 41 641 1641 3641 3641 82 83 BKAAAA HNFAAA HHHHxx +5537 3726 1 1 7 17 37 537 1537 537 5537 74 75 ZEAAAA INFAAA OOOOxx +820 3727 0 0 0 0 20 820 820 820 820 40 41 OFAAAA JNFAAA VVVVxx +5847 3728 1 3 7 7 47 847 1847 847 5847 94 95 XQAAAA KNFAAA AAAAxx +566 3729 0 2 6 6 66 566 566 566 566 132 133 UVAAAA LNFAAA HHHHxx +2246 3730 0 2 6 6 46 246 246 2246 2246 92 93 KIAAAA MNFAAA OOOOxx +6680 3731 0 0 0 0 80 680 680 1680 6680 160 161 YWAAAA NNFAAA VVVVxx +2014 3732 0 2 4 14 14 14 14 2014 2014 28 29 MZAAAA ONFAAA AAAAxx +8355 3733 1 3 5 15 55 355 355 3355 8355 110 111 JJAAAA PNFAAA HHHHxx +1610 3734 0 2 0 10 10 610 1610 1610 1610 20 21 YJAAAA QNFAAA OOOOxx +9719 3735 1 3 9 19 19 719 1719 4719 9719 38 39 VJAAAA RNFAAA VVVVxx +8498 3736 0 2 8 18 98 498 498 3498 8498 196 197 WOAAAA SNFAAA AAAAxx +5883 3737 1 3 3 3 83 883 1883 883 5883 166 167 HSAAAA TNFAAA HHHHxx +7380 3738 0 0 0 0 80 380 1380 2380 7380 160 161 WXAAAA UNFAAA OOOOxx +8865 3739 1 1 5 5 65 865 865 3865 8865 130 131 ZCAAAA VNFAAA VVVVxx +4743 3740 1 3 3 3 43 743 743 4743 4743 86 87 LAAAAA WNFAAA AAAAxx +5086 3741 0 2 6 6 86 86 1086 86 5086 172 173 QNAAAA XNFAAA HHHHxx +2739 3742 1 3 9 19 39 739 739 2739 2739 78 79 JBAAAA YNFAAA OOOOxx +9375 3743 1 3 5 15 75 375 1375 4375 9375 150 151 PWAAAA ZNFAAA VVVVxx +7876 3744 0 0 6 16 76 876 1876 2876 7876 152 153 YQAAAA AOFAAA AAAAxx +453 3745 1 1 3 13 53 453 453 453 453 106 107 LRAAAA BOFAAA HHHHxx +6987 3746 1 3 7 7 87 987 987 1987 6987 174 175 TIAAAA COFAAA OOOOxx +2860 3747 0 0 0 0 60 860 860 2860 2860 120 121 AGAAAA DOFAAA VVVVxx +8372 3748 0 0 2 12 72 372 372 3372 8372 144 145 AKAAAA EOFAAA AAAAxx +2048 3749 0 0 8 8 48 48 48 2048 2048 96 97 UAAAAA FOFAAA HHHHxx +9231 3750 1 3 1 11 31 231 1231 4231 9231 62 63 BRAAAA GOFAAA OOOOxx +634 3751 0 2 4 14 34 634 634 634 634 68 69 KYAAAA HOFAAA VVVVxx +3998 3752 0 2 8 18 98 998 1998 3998 3998 196 197 UXAAAA IOFAAA AAAAxx +4728 3753 0 0 8 8 28 728 728 4728 4728 56 57 WZAAAA JOFAAA HHHHxx +579 3754 1 3 9 19 79 579 579 579 579 158 159 HWAAAA KOFAAA OOOOxx +815 3755 1 3 5 15 15 815 815 815 815 30 31 JFAAAA LOFAAA VVVVxx +1009 3756 1 1 9 9 9 9 1009 1009 1009 18 19 VMAAAA MOFAAA AAAAxx +6596 3757 0 0 6 16 96 596 596 1596 6596 192 193 STAAAA NOFAAA HHHHxx +2793 3758 1 1 3 13 93 793 793 2793 2793 186 187 LDAAAA OOFAAA OOOOxx +9589 3759 1 1 9 9 89 589 1589 4589 9589 178 179 VEAAAA POFAAA VVVVxx +2794 3760 0 2 4 14 94 794 794 2794 2794 188 189 MDAAAA QOFAAA AAAAxx +2551 3761 1 3 1 11 51 551 551 2551 2551 102 103 DUAAAA ROFAAA HHHHxx +1588 3762 0 0 8 8 88 588 1588 1588 1588 176 177 CJAAAA SOFAAA OOOOxx +4443 3763 1 3 3 3 43 443 443 4443 4443 86 87 XOAAAA TOFAAA VVVVxx +5009 3764 1 1 9 9 9 9 1009 9 5009 18 19 RKAAAA UOFAAA AAAAxx +4287 3765 1 3 7 7 87 287 287 4287 4287 174 175 XIAAAA VOFAAA HHHHxx +2167 3766 1 3 7 7 67 167 167 2167 2167 134 135 JFAAAA WOFAAA OOOOxx +2290 3767 0 2 0 10 90 290 290 2290 2290 180 181 CKAAAA XOFAAA VVVVxx +7225 3768 1 1 5 5 25 225 1225 2225 7225 50 51 XRAAAA YOFAAA AAAAxx +8992 3769 0 0 2 12 92 992 992 3992 8992 184 185 WHAAAA ZOFAAA HHHHxx +1540 3770 0 0 0 0 40 540 1540 1540 1540 80 81 GHAAAA APFAAA OOOOxx +2029 3771 1 1 9 9 29 29 29 2029 2029 58 59 BAAAAA BPFAAA VVVVxx +2855 3772 1 3 5 15 55 855 855 2855 2855 110 111 VFAAAA CPFAAA AAAAxx +3534 3773 0 2 4 14 34 534 1534 3534 3534 68 69 YFAAAA DPFAAA HHHHxx +8078 3774 0 2 8 18 78 78 78 3078 8078 156 157 SYAAAA EPFAAA OOOOxx +9778 3775 0 2 8 18 78 778 1778 4778 9778 156 157 CMAAAA FPFAAA VVVVxx +3543 3776 1 3 3 3 43 543 1543 3543 3543 86 87 HGAAAA GPFAAA AAAAxx +4778 3777 0 2 8 18 78 778 778 4778 4778 156 157 UBAAAA HPFAAA HHHHxx +8931 3778 1 3 1 11 31 931 931 3931 8931 62 63 NFAAAA IPFAAA OOOOxx +557 3779 1 1 7 17 57 557 557 557 557 114 115 LVAAAA JPFAAA VVVVxx +5546 3780 0 2 6 6 46 546 1546 546 5546 92 93 IFAAAA KPFAAA AAAAxx +7527 3781 1 3 7 7 27 527 1527 2527 7527 54 55 NDAAAA LPFAAA HHHHxx +5000 3782 0 0 0 0 0 0 1000 0 5000 0 1 IKAAAA MPFAAA OOOOxx +7587 3783 1 3 7 7 87 587 1587 2587 7587 174 175 VFAAAA NPFAAA VVVVxx +3014 3784 0 2 4 14 14 14 1014 3014 3014 28 29 YLAAAA OPFAAA AAAAxx +5276 3785 0 0 6 16 76 276 1276 276 5276 152 153 YUAAAA PPFAAA HHHHxx +6457 3786 1 1 7 17 57 457 457 1457 6457 114 115 JOAAAA QPFAAA OOOOxx +389 3787 1 1 9 9 89 389 389 389 389 178 179 ZOAAAA RPFAAA VVVVxx +7104 3788 0 0 4 4 4 104 1104 2104 7104 8 9 GNAAAA SPFAAA AAAAxx +9995 3789 1 3 5 15 95 995 1995 4995 9995 190 191 LUAAAA TPFAAA HHHHxx +7368 3790 0 0 8 8 68 368 1368 2368 7368 136 137 KXAAAA UPFAAA OOOOxx +3258 3791 0 2 8 18 58 258 1258 3258 3258 116 117 IVAAAA VPFAAA VVVVxx +9208 3792 0 0 8 8 8 208 1208 4208 9208 16 17 EQAAAA WPFAAA AAAAxx +2396 3793 0 0 6 16 96 396 396 2396 2396 192 193 EOAAAA XPFAAA HHHHxx +1715 3794 1 3 5 15 15 715 1715 1715 1715 30 31 ZNAAAA YPFAAA OOOOxx +1240 3795 0 0 0 0 40 240 1240 1240 1240 80 81 SVAAAA ZPFAAA VVVVxx +1952 3796 0 0 2 12 52 952 1952 1952 1952 104 105 CXAAAA AQFAAA AAAAxx +4403 3797 1 3 3 3 3 403 403 4403 4403 6 7 JNAAAA BQFAAA HHHHxx +6333 3798 1 1 3 13 33 333 333 1333 6333 66 67 PJAAAA CQFAAA OOOOxx +2492 3799 0 0 2 12 92 492 492 2492 2492 184 185 WRAAAA DQFAAA VVVVxx +6543 3800 1 3 3 3 43 543 543 1543 6543 86 87 RRAAAA EQFAAA AAAAxx +5548 3801 0 0 8 8 48 548 1548 548 5548 96 97 KFAAAA FQFAAA HHHHxx +3458 3802 0 2 8 18 58 458 1458 3458 3458 116 117 ADAAAA GQFAAA OOOOxx +2588 3803 0 0 8 8 88 588 588 2588 2588 176 177 OVAAAA HQFAAA VVVVxx +1364 3804 0 0 4 4 64 364 1364 1364 1364 128 129 MAAAAA IQFAAA AAAAxx +9856 3805 0 0 6 16 56 856 1856 4856 9856 112 113 CPAAAA JQFAAA HHHHxx +4964 3806 0 0 4 4 64 964 964 4964 4964 128 129 YIAAAA KQFAAA OOOOxx +773 3807 1 1 3 13 73 773 773 773 773 146 147 TDAAAA LQFAAA VVVVxx +6402 3808 0 2 2 2 2 402 402 1402 6402 4 5 GMAAAA MQFAAA AAAAxx +7213 3809 1 1 3 13 13 213 1213 2213 7213 26 27 LRAAAA NQFAAA HHHHxx +3385 3810 1 1 5 5 85 385 1385 3385 3385 170 171 FAAAAA OQFAAA OOOOxx +6005 3811 1 1 5 5 5 5 5 1005 6005 10 11 ZWAAAA PQFAAA VVVVxx +9346 3812 0 2 6 6 46 346 1346 4346 9346 92 93 MVAAAA QQFAAA AAAAxx +1831 3813 1 3 1 11 31 831 1831 1831 1831 62 63 LSAAAA RQFAAA HHHHxx +5406 3814 0 2 6 6 6 406 1406 406 5406 12 13 YZAAAA SQFAAA OOOOxx +2154 3815 0 2 4 14 54 154 154 2154 2154 108 109 WEAAAA TQFAAA VVVVxx +3721 3816 1 1 1 1 21 721 1721 3721 3721 42 43 DNAAAA UQFAAA AAAAxx +2889 3817 1 1 9 9 89 889 889 2889 2889 178 179 DHAAAA VQFAAA HHHHxx +4410 3818 0 2 0 10 10 410 410 4410 4410 20 21 QNAAAA WQFAAA OOOOxx +7102 3819 0 2 2 2 2 102 1102 2102 7102 4 5 ENAAAA XQFAAA VVVVxx +4057 3820 1 1 7 17 57 57 57 4057 4057 114 115 BAAAAA YQFAAA AAAAxx +9780 3821 0 0 0 0 80 780 1780 4780 9780 160 161 EMAAAA ZQFAAA HHHHxx +9481 3822 1 1 1 1 81 481 1481 4481 9481 162 163 RAAAAA ARFAAA OOOOxx +2366 3823 0 2 6 6 66 366 366 2366 2366 132 133 ANAAAA BRFAAA VVVVxx +2708 3824 0 0 8 8 8 708 708 2708 2708 16 17 EAAAAA CRFAAA AAAAxx +7399 3825 1 3 9 19 99 399 1399 2399 7399 198 199 PYAAAA DRFAAA HHHHxx +5234 3826 0 2 4 14 34 234 1234 234 5234 68 69 ITAAAA ERFAAA OOOOxx +1843 3827 1 3 3 3 43 843 1843 1843 1843 86 87 XSAAAA FRFAAA VVVVxx +1006 3828 0 2 6 6 6 6 1006 1006 1006 12 13 SMAAAA GRFAAA AAAAxx +7696 3829 0 0 6 16 96 696 1696 2696 7696 192 193 AKAAAA HRFAAA HHHHxx +6411 3830 1 3 1 11 11 411 411 1411 6411 22 23 PMAAAA IRFAAA OOOOxx +3913 3831 1 1 3 13 13 913 1913 3913 3913 26 27 NUAAAA JRFAAA VVVVxx +2538 3832 0 2 8 18 38 538 538 2538 2538 76 77 QTAAAA KRFAAA AAAAxx +3019 3833 1 3 9 19 19 19 1019 3019 3019 38 39 DMAAAA LRFAAA HHHHxx +107 3834 1 3 7 7 7 107 107 107 107 14 15 DEAAAA MRFAAA OOOOxx +427 3835 1 3 7 7 27 427 427 427 427 54 55 LQAAAA NRFAAA VVVVxx +9849 3836 1 1 9 9 49 849 1849 4849 9849 98 99 VOAAAA ORFAAA AAAAxx +4195 3837 1 3 5 15 95 195 195 4195 4195 190 191 JFAAAA PRFAAA HHHHxx +9215 3838 1 3 5 15 15 215 1215 4215 9215 30 31 LQAAAA QRFAAA OOOOxx +3165 3839 1 1 5 5 65 165 1165 3165 3165 130 131 TRAAAA RRFAAA VVVVxx +3280 3840 0 0 0 0 80 280 1280 3280 3280 160 161 EWAAAA SRFAAA AAAAxx +4477 3841 1 1 7 17 77 477 477 4477 4477 154 155 FQAAAA TRFAAA HHHHxx +5885 3842 1 1 5 5 85 885 1885 885 5885 170 171 JSAAAA URFAAA OOOOxx +3311 3843 1 3 1 11 11 311 1311 3311 3311 22 23 JXAAAA VRFAAA VVVVxx +6453 3844 1 1 3 13 53 453 453 1453 6453 106 107 FOAAAA WRFAAA AAAAxx +8527 3845 1 3 7 7 27 527 527 3527 8527 54 55 ZPAAAA XRFAAA HHHHxx +1921 3846 1 1 1 1 21 921 1921 1921 1921 42 43 XVAAAA YRFAAA OOOOxx +2427 3847 1 3 7 7 27 427 427 2427 2427 54 55 JPAAAA ZRFAAA VVVVxx +3691 3848 1 3 1 11 91 691 1691 3691 3691 182 183 ZLAAAA ASFAAA AAAAxx +3882 3849 0 2 2 2 82 882 1882 3882 3882 164 165 ITAAAA BSFAAA HHHHxx +562 3850 0 2 2 2 62 562 562 562 562 124 125 QVAAAA CSFAAA OOOOxx +377 3851 1 1 7 17 77 377 377 377 377 154 155 NOAAAA DSFAAA VVVVxx +1497 3852 1 1 7 17 97 497 1497 1497 1497 194 195 PFAAAA ESFAAA AAAAxx +4453 3853 1 1 3 13 53 453 453 4453 4453 106 107 HPAAAA FSFAAA HHHHxx +4678 3854 0 2 8 18 78 678 678 4678 4678 156 157 YXAAAA GSFAAA OOOOxx +2234 3855 0 2 4 14 34 234 234 2234 2234 68 69 YHAAAA HSFAAA VVVVxx +1073 3856 1 1 3 13 73 73 1073 1073 1073 146 147 HPAAAA ISFAAA AAAAxx +6479 3857 1 3 9 19 79 479 479 1479 6479 158 159 FPAAAA JSFAAA HHHHxx +5665 3858 1 1 5 5 65 665 1665 665 5665 130 131 XJAAAA KSFAAA OOOOxx +586 3859 0 2 6 6 86 586 586 586 586 172 173 OWAAAA LSFAAA VVVVxx +1584 3860 0 0 4 4 84 584 1584 1584 1584 168 169 YIAAAA MSFAAA AAAAxx +2574 3861 0 2 4 14 74 574 574 2574 2574 148 149 AVAAAA NSFAAA HHHHxx +9833 3862 1 1 3 13 33 833 1833 4833 9833 66 67 FOAAAA OSFAAA OOOOxx +6726 3863 0 2 6 6 26 726 726 1726 6726 52 53 SYAAAA PSFAAA VVVVxx +8497 3864 1 1 7 17 97 497 497 3497 8497 194 195 VOAAAA QSFAAA AAAAxx +2914 3865 0 2 4 14 14 914 914 2914 2914 28 29 CIAAAA RSFAAA HHHHxx +8586 3866 0 2 6 6 86 586 586 3586 8586 172 173 GSAAAA SSFAAA OOOOxx +6973 3867 1 1 3 13 73 973 973 1973 6973 146 147 FIAAAA TSFAAA VVVVxx +1322 3868 0 2 2 2 22 322 1322 1322 1322 44 45 WYAAAA USFAAA AAAAxx +5242 3869 0 2 2 2 42 242 1242 242 5242 84 85 QTAAAA VSFAAA HHHHxx +5581 3870 1 1 1 1 81 581 1581 581 5581 162 163 RGAAAA WSFAAA OOOOxx +1365 3871 1 1 5 5 65 365 1365 1365 1365 130 131 NAAAAA XSFAAA VVVVxx +2818 3872 0 2 8 18 18 818 818 2818 2818 36 37 KEAAAA YSFAAA AAAAxx +3758 3873 0 2 8 18 58 758 1758 3758 3758 116 117 OOAAAA ZSFAAA HHHHxx +2665 3874 1 1 5 5 65 665 665 2665 2665 130 131 NYAAAA ATFAAA OOOOxx +9823 3875 1 3 3 3 23 823 1823 4823 9823 46 47 VNAAAA BTFAAA VVVVxx +7057 3876 1 1 7 17 57 57 1057 2057 7057 114 115 LLAAAA CTFAAA AAAAxx +543 3877 1 3 3 3 43 543 543 543 543 86 87 XUAAAA DTFAAA HHHHxx +4008 3878 0 0 8 8 8 8 8 4008 4008 16 17 EYAAAA ETFAAA OOOOxx +4397 3879 1 1 7 17 97 397 397 4397 4397 194 195 DNAAAA FTFAAA VVVVxx +8533 3880 1 1 3 13 33 533 533 3533 8533 66 67 FQAAAA GTFAAA AAAAxx +9728 3881 0 0 8 8 28 728 1728 4728 9728 56 57 EKAAAA HTFAAA HHHHxx +5198 3882 0 2 8 18 98 198 1198 198 5198 196 197 YRAAAA ITFAAA OOOOxx +5036 3883 0 0 6 16 36 36 1036 36 5036 72 73 SLAAAA JTFAAA VVVVxx +4394 3884 0 2 4 14 94 394 394 4394 4394 188 189 ANAAAA KTFAAA AAAAxx +9633 3885 1 1 3 13 33 633 1633 4633 9633 66 67 NGAAAA LTFAAA HHHHxx +3339 3886 1 3 9 19 39 339 1339 3339 3339 78 79 LYAAAA MTFAAA OOOOxx +9529 3887 1 1 9 9 29 529 1529 4529 9529 58 59 NCAAAA NTFAAA VVVVxx +4780 3888 0 0 0 0 80 780 780 4780 4780 160 161 WBAAAA OTFAAA AAAAxx +4862 3889 0 2 2 2 62 862 862 4862 4862 124 125 AFAAAA PTFAAA HHHHxx +8152 3890 0 0 2 12 52 152 152 3152 8152 104 105 OBAAAA QTFAAA OOOOxx +9330 3891 0 2 0 10 30 330 1330 4330 9330 60 61 WUAAAA RTFAAA VVVVxx +4362 3892 0 2 2 2 62 362 362 4362 4362 124 125 ULAAAA STFAAA AAAAxx +4688 3893 0 0 8 8 88 688 688 4688 4688 176 177 IYAAAA TTFAAA HHHHxx +1903 3894 1 3 3 3 3 903 1903 1903 1903 6 7 FVAAAA UTFAAA OOOOxx +9027 3895 1 3 7 7 27 27 1027 4027 9027 54 55 FJAAAA VTFAAA VVVVxx +5385 3896 1 1 5 5 85 385 1385 385 5385 170 171 DZAAAA WTFAAA AAAAxx +9854 3897 0 2 4 14 54 854 1854 4854 9854 108 109 APAAAA XTFAAA HHHHxx +9033 3898 1 1 3 13 33 33 1033 4033 9033 66 67 LJAAAA YTFAAA OOOOxx +3185 3899 1 1 5 5 85 185 1185 3185 3185 170 171 NSAAAA ZTFAAA VVVVxx +2618 3900 0 2 8 18 18 618 618 2618 2618 36 37 SWAAAA AUFAAA AAAAxx +371 3901 1 3 1 11 71 371 371 371 371 142 143 HOAAAA BUFAAA HHHHxx +3697 3902 1 1 7 17 97 697 1697 3697 3697 194 195 FMAAAA CUFAAA OOOOxx +1682 3903 0 2 2 2 82 682 1682 1682 1682 164 165 SMAAAA DUFAAA VVVVxx +3333 3904 1 1 3 13 33 333 1333 3333 3333 66 67 FYAAAA EUFAAA AAAAxx +1722 3905 0 2 2 2 22 722 1722 1722 1722 44 45 GOAAAA FUFAAA HHHHxx +2009 3906 1 1 9 9 9 9 9 2009 2009 18 19 HZAAAA GUFAAA OOOOxx +3517 3907 1 1 7 17 17 517 1517 3517 3517 34 35 HFAAAA HUFAAA VVVVxx +7640 3908 0 0 0 0 40 640 1640 2640 7640 80 81 WHAAAA IUFAAA AAAAxx +259 3909 1 3 9 19 59 259 259 259 259 118 119 ZJAAAA JUFAAA HHHHxx +1400 3910 0 0 0 0 0 400 1400 1400 1400 0 1 WBAAAA KUFAAA OOOOxx +6663 3911 1 3 3 3 63 663 663 1663 6663 126 127 HWAAAA LUFAAA VVVVxx +1576 3912 0 0 6 16 76 576 1576 1576 1576 152 153 QIAAAA MUFAAA AAAAxx +8843 3913 1 3 3 3 43 843 843 3843 8843 86 87 DCAAAA NUFAAA HHHHxx +9474 3914 0 2 4 14 74 474 1474 4474 9474 148 149 KAAAAA OUFAAA OOOOxx +1597 3915 1 1 7 17 97 597 1597 1597 1597 194 195 LJAAAA PUFAAA VVVVxx +1143 3916 1 3 3 3 43 143 1143 1143 1143 86 87 ZRAAAA QUFAAA AAAAxx +4162 3917 0 2 2 2 62 162 162 4162 4162 124 125 CEAAAA RUFAAA HHHHxx +1301 3918 1 1 1 1 1 301 1301 1301 1301 2 3 BYAAAA SUFAAA OOOOxx +2935 3919 1 3 5 15 35 935 935 2935 2935 70 71 XIAAAA TUFAAA VVVVxx +886 3920 0 2 6 6 86 886 886 886 886 172 173 CIAAAA UUFAAA AAAAxx +1661 3921 1 1 1 1 61 661 1661 1661 1661 122 123 XLAAAA VUFAAA HHHHxx +1026 3922 0 2 6 6 26 26 1026 1026 1026 52 53 MNAAAA WUFAAA OOOOxx +7034 3923 0 2 4 14 34 34 1034 2034 7034 68 69 OKAAAA XUFAAA VVVVxx +2305 3924 1 1 5 5 5 305 305 2305 2305 10 11 RKAAAA YUFAAA AAAAxx +1725 3925 1 1 5 5 25 725 1725 1725 1725 50 51 JOAAAA ZUFAAA HHHHxx +909 3926 1 1 9 9 9 909 909 909 909 18 19 ZIAAAA AVFAAA OOOOxx +9906 3927 0 2 6 6 6 906 1906 4906 9906 12 13 ARAAAA BVFAAA VVVVxx +3309 3928 1 1 9 9 9 309 1309 3309 3309 18 19 HXAAAA CVFAAA AAAAxx +515 3929 1 3 5 15 15 515 515 515 515 30 31 VTAAAA DVFAAA HHHHxx +932 3930 0 0 2 12 32 932 932 932 932 64 65 WJAAAA EVFAAA OOOOxx +8144 3931 0 0 4 4 44 144 144 3144 8144 88 89 GBAAAA FVFAAA VVVVxx +5592 3932 0 0 2 12 92 592 1592 592 5592 184 185 CHAAAA GVFAAA AAAAxx +4003 3933 1 3 3 3 3 3 3 4003 4003 6 7 ZXAAAA HVFAAA HHHHxx +9566 3934 0 2 6 6 66 566 1566 4566 9566 132 133 YDAAAA IVFAAA OOOOxx +4556 3935 0 0 6 16 56 556 556 4556 4556 112 113 GTAAAA JVFAAA VVVVxx +268 3936 0 0 8 8 68 268 268 268 268 136 137 IKAAAA KVFAAA AAAAxx +8107 3937 1 3 7 7 7 107 107 3107 8107 14 15 VZAAAA LVFAAA HHHHxx +5816 3938 0 0 6 16 16 816 1816 816 5816 32 33 SPAAAA MVFAAA OOOOxx +8597 3939 1 1 7 17 97 597 597 3597 8597 194 195 RSAAAA NVFAAA VVVVxx +9611 3940 1 3 1 11 11 611 1611 4611 9611 22 23 RFAAAA OVFAAA AAAAxx +8070 3941 0 2 0 10 70 70 70 3070 8070 140 141 KYAAAA PVFAAA HHHHxx +6040 3942 0 0 0 0 40 40 40 1040 6040 80 81 IYAAAA QVFAAA OOOOxx +3184 3943 0 0 4 4 84 184 1184 3184 3184 168 169 MSAAAA RVFAAA VVVVxx +9656 3944 0 0 6 16 56 656 1656 4656 9656 112 113 KHAAAA SVFAAA AAAAxx +1577 3945 1 1 7 17 77 577 1577 1577 1577 154 155 RIAAAA TVFAAA HHHHxx +1805 3946 1 1 5 5 5 805 1805 1805 1805 10 11 LRAAAA UVFAAA OOOOxx +8268 3947 0 0 8 8 68 268 268 3268 8268 136 137 AGAAAA VVFAAA VVVVxx +3489 3948 1 1 9 9 89 489 1489 3489 3489 178 179 FEAAAA WVFAAA AAAAxx +4564 3949 0 0 4 4 64 564 564 4564 4564 128 129 OTAAAA XVFAAA HHHHxx +4006 3950 0 2 6 6 6 6 6 4006 4006 12 13 CYAAAA YVFAAA OOOOxx +8466 3951 0 2 6 6 66 466 466 3466 8466 132 133 QNAAAA ZVFAAA VVVVxx +938 3952 0 2 8 18 38 938 938 938 938 76 77 CKAAAA AWFAAA AAAAxx +5944 3953 0 0 4 4 44 944 1944 944 5944 88 89 QUAAAA BWFAAA HHHHxx +8363 3954 1 3 3 3 63 363 363 3363 8363 126 127 RJAAAA CWFAAA OOOOxx +5348 3955 0 0 8 8 48 348 1348 348 5348 96 97 SXAAAA DWFAAA VVVVxx +71 3956 1 3 1 11 71 71 71 71 71 142 143 TCAAAA EWFAAA AAAAxx +3620 3957 0 0 0 0 20 620 1620 3620 3620 40 41 GJAAAA FWFAAA HHHHxx +3230 3958 0 2 0 10 30 230 1230 3230 3230 60 61 GUAAAA GWFAAA OOOOxx +6132 3959 0 0 2 12 32 132 132 1132 6132 64 65 WBAAAA HWFAAA VVVVxx +6143 3960 1 3 3 3 43 143 143 1143 6143 86 87 HCAAAA IWFAAA AAAAxx +8781 3961 1 1 1 1 81 781 781 3781 8781 162 163 TZAAAA JWFAAA HHHHxx +5522 3962 0 2 2 2 22 522 1522 522 5522 44 45 KEAAAA KWFAAA OOOOxx +6320 3963 0 0 0 0 20 320 320 1320 6320 40 41 CJAAAA LWFAAA VVVVxx +3923 3964 1 3 3 3 23 923 1923 3923 3923 46 47 XUAAAA MWFAAA AAAAxx +2207 3965 1 3 7 7 7 207 207 2207 2207 14 15 XGAAAA NWFAAA HHHHxx +966 3966 0 2 6 6 66 966 966 966 966 132 133 ELAAAA OWFAAA OOOOxx +9020 3967 0 0 0 0 20 20 1020 4020 9020 40 41 YIAAAA PWFAAA VVVVxx +4616 3968 0 0 6 16 16 616 616 4616 4616 32 33 OVAAAA QWFAAA AAAAxx +8289 3969 1 1 9 9 89 289 289 3289 8289 178 179 VGAAAA RWFAAA HHHHxx +5796 3970 0 0 6 16 96 796 1796 796 5796 192 193 YOAAAA SWFAAA OOOOxx +9259 3971 1 3 9 19 59 259 1259 4259 9259 118 119 DSAAAA TWFAAA VVVVxx +3710 3972 0 2 0 10 10 710 1710 3710 3710 20 21 SMAAAA UWFAAA AAAAxx +251 3973 1 3 1 11 51 251 251 251 251 102 103 RJAAAA VWFAAA HHHHxx +7669 3974 1 1 9 9 69 669 1669 2669 7669 138 139 ZIAAAA WWFAAA OOOOxx +6304 3975 0 0 4 4 4 304 304 1304 6304 8 9 MIAAAA XWFAAA VVVVxx +6454 3976 0 2 4 14 54 454 454 1454 6454 108 109 GOAAAA YWFAAA AAAAxx +1489 3977 1 1 9 9 89 489 1489 1489 1489 178 179 HFAAAA ZWFAAA HHHHxx +715 3978 1 3 5 15 15 715 715 715 715 30 31 NBAAAA AXFAAA OOOOxx +4319 3979 1 3 9 19 19 319 319 4319 4319 38 39 DKAAAA BXFAAA VVVVxx +7112 3980 0 0 2 12 12 112 1112 2112 7112 24 25 ONAAAA CXFAAA AAAAxx +3726 3981 0 2 6 6 26 726 1726 3726 3726 52 53 INAAAA DXFAAA HHHHxx +7727 3982 1 3 7 7 27 727 1727 2727 7727 54 55 FLAAAA EXFAAA OOOOxx +8387 3983 1 3 7 7 87 387 387 3387 8387 174 175 PKAAAA FXFAAA VVVVxx +6555 3984 1 3 5 15 55 555 555 1555 6555 110 111 DSAAAA GXFAAA AAAAxx +1148 3985 0 0 8 8 48 148 1148 1148 1148 96 97 ESAAAA HXFAAA HHHHxx +9000 3986 0 0 0 0 0 0 1000 4000 9000 0 1 EIAAAA IXFAAA OOOOxx +5278 3987 0 2 8 18 78 278 1278 278 5278 156 157 AVAAAA JXFAAA VVVVxx +2388 3988 0 0 8 8 88 388 388 2388 2388 176 177 WNAAAA KXFAAA AAAAxx +7984 3989 0 0 4 4 84 984 1984 2984 7984 168 169 CVAAAA LXFAAA HHHHxx +881 3990 1 1 1 1 81 881 881 881 881 162 163 XHAAAA MXFAAA OOOOxx +6830 3991 0 2 0 10 30 830 830 1830 6830 60 61 SCAAAA NXFAAA VVVVxx +7056 3992 0 0 6 16 56 56 1056 2056 7056 112 113 KLAAAA OXFAAA AAAAxx +7581 3993 1 1 1 1 81 581 1581 2581 7581 162 163 PFAAAA PXFAAA HHHHxx +5214 3994 0 2 4 14 14 214 1214 214 5214 28 29 OSAAAA QXFAAA OOOOxx +2505 3995 1 1 5 5 5 505 505 2505 2505 10 11 JSAAAA RXFAAA VVVVxx +5112 3996 0 0 2 12 12 112 1112 112 5112 24 25 QOAAAA SXFAAA AAAAxx +9884 3997 0 0 4 4 84 884 1884 4884 9884 168 169 EQAAAA TXFAAA HHHHxx +8040 3998 0 0 0 0 40 40 40 3040 8040 80 81 GXAAAA UXFAAA OOOOxx +7033 3999 1 1 3 13 33 33 1033 2033 7033 66 67 NKAAAA VXFAAA VVVVxx +9343 4000 1 3 3 3 43 343 1343 4343 9343 86 87 JVAAAA WXFAAA AAAAxx +2931 4001 1 3 1 11 31 931 931 2931 2931 62 63 TIAAAA XXFAAA HHHHxx +9024 4002 0 0 4 4 24 24 1024 4024 9024 48 49 CJAAAA YXFAAA OOOOxx +6485 4003 1 1 5 5 85 485 485 1485 6485 170 171 LPAAAA ZXFAAA VVVVxx +3465 4004 1 1 5 5 65 465 1465 3465 3465 130 131 HDAAAA AYFAAA AAAAxx +3357 4005 1 1 7 17 57 357 1357 3357 3357 114 115 DZAAAA BYFAAA HHHHxx +2929 4006 1 1 9 9 29 929 929 2929 2929 58 59 RIAAAA CYFAAA OOOOxx +3086 4007 0 2 6 6 86 86 1086 3086 3086 172 173 SOAAAA DYFAAA VVVVxx +8897 4008 1 1 7 17 97 897 897 3897 8897 194 195 FEAAAA EYFAAA AAAAxx +9688 4009 0 0 8 8 88 688 1688 4688 9688 176 177 QIAAAA FYFAAA HHHHxx +6522 4010 0 2 2 2 22 522 522 1522 6522 44 45 WQAAAA GYFAAA OOOOxx +3241 4011 1 1 1 1 41 241 1241 3241 3241 82 83 RUAAAA HYFAAA VVVVxx +8770 4012 0 2 0 10 70 770 770 3770 8770 140 141 IZAAAA IYFAAA AAAAxx +2884 4013 0 0 4 4 84 884 884 2884 2884 168 169 YGAAAA JYFAAA HHHHxx +9579 4014 1 3 9 19 79 579 1579 4579 9579 158 159 LEAAAA KYFAAA OOOOxx +3125 4015 1 1 5 5 25 125 1125 3125 3125 50 51 FQAAAA LYFAAA VVVVxx +4604 4016 0 0 4 4 4 604 604 4604 4604 8 9 CVAAAA MYFAAA AAAAxx +2682 4017 0 2 2 2 82 682 682 2682 2682 164 165 EZAAAA NYFAAA HHHHxx +254 4018 0 2 4 14 54 254 254 254 254 108 109 UJAAAA OYFAAA OOOOxx +6569 4019 1 1 9 9 69 569 569 1569 6569 138 139 RSAAAA PYFAAA VVVVxx +2686 4020 0 2 6 6 86 686 686 2686 2686 172 173 IZAAAA QYFAAA AAAAxx +2123 4021 1 3 3 3 23 123 123 2123 2123 46 47 RDAAAA RYFAAA HHHHxx +1745 4022 1 1 5 5 45 745 1745 1745 1745 90 91 DPAAAA SYFAAA OOOOxx +247 4023 1 3 7 7 47 247 247 247 247 94 95 NJAAAA TYFAAA VVVVxx +5800 4024 0 0 0 0 0 800 1800 800 5800 0 1 CPAAAA UYFAAA AAAAxx +1121 4025 1 1 1 1 21 121 1121 1121 1121 42 43 DRAAAA VYFAAA HHHHxx +8893 4026 1 1 3 13 93 893 893 3893 8893 186 187 BEAAAA WYFAAA OOOOxx +7819 4027 1 3 9 19 19 819 1819 2819 7819 38 39 TOAAAA XYFAAA VVVVxx +1339 4028 1 3 9 19 39 339 1339 1339 1339 78 79 NZAAAA YYFAAA AAAAxx +5680 4029 0 0 0 0 80 680 1680 680 5680 160 161 MKAAAA ZYFAAA HHHHxx +5093 4030 1 1 3 13 93 93 1093 93 5093 186 187 XNAAAA AZFAAA OOOOxx +3508 4031 0 0 8 8 8 508 1508 3508 3508 16 17 YEAAAA BZFAAA VVVVxx +933 4032 1 1 3 13 33 933 933 933 933 66 67 XJAAAA CZFAAA AAAAxx +1106 4033 0 2 6 6 6 106 1106 1106 1106 12 13 OQAAAA DZFAAA HHHHxx +4386 4034 0 2 6 6 86 386 386 4386 4386 172 173 SMAAAA EZFAAA OOOOxx +5895 4035 1 3 5 15 95 895 1895 895 5895 190 191 TSAAAA FZFAAA VVVVxx +2980 4036 0 0 0 0 80 980 980 2980 2980 160 161 QKAAAA GZFAAA AAAAxx +4400 4037 0 0 0 0 0 400 400 4400 4400 0 1 GNAAAA HZFAAA HHHHxx +7433 4038 1 1 3 13 33 433 1433 2433 7433 66 67 XZAAAA IZFAAA OOOOxx +6110 4039 0 2 0 10 10 110 110 1110 6110 20 21 ABAAAA JZFAAA VVVVxx +867 4040 1 3 7 7 67 867 867 867 867 134 135 JHAAAA KZFAAA AAAAxx +5292 4041 0 0 2 12 92 292 1292 292 5292 184 185 OVAAAA LZFAAA HHHHxx +3926 4042 0 2 6 6 26 926 1926 3926 3926 52 53 AVAAAA MZFAAA OOOOxx +1107 4043 1 3 7 7 7 107 1107 1107 1107 14 15 PQAAAA NZFAAA VVVVxx +7355 4044 1 3 5 15 55 355 1355 2355 7355 110 111 XWAAAA OZFAAA AAAAxx +4689 4045 1 1 9 9 89 689 689 4689 4689 178 179 JYAAAA PZFAAA HHHHxx +4872 4046 0 0 2 12 72 872 872 4872 4872 144 145 KFAAAA QZFAAA OOOOxx +7821 4047 1 1 1 1 21 821 1821 2821 7821 42 43 VOAAAA RZFAAA VVVVxx +7277 4048 1 1 7 17 77 277 1277 2277 7277 154 155 XTAAAA SZFAAA AAAAxx +3268 4049 0 0 8 8 68 268 1268 3268 3268 136 137 SVAAAA TZFAAA HHHHxx +8877 4050 1 1 7 17 77 877 877 3877 8877 154 155 LDAAAA UZFAAA OOOOxx +343 4051 1 3 3 3 43 343 343 343 343 86 87 FNAAAA VZFAAA VVVVxx +621 4052 1 1 1 1 21 621 621 621 621 42 43 XXAAAA WZFAAA AAAAxx +5429 4053 1 1 9 9 29 429 1429 429 5429 58 59 VAAAAA XZFAAA HHHHxx +392 4054 0 0 2 12 92 392 392 392 392 184 185 CPAAAA YZFAAA OOOOxx +6004 4055 0 0 4 4 4 4 4 1004 6004 8 9 YWAAAA ZZFAAA VVVVxx +6377 4056 1 1 7 17 77 377 377 1377 6377 154 155 HLAAAA AAGAAA AAAAxx +3037 4057 1 1 7 17 37 37 1037 3037 3037 74 75 VMAAAA BAGAAA HHHHxx +3514 4058 0 2 4 14 14 514 1514 3514 3514 28 29 EFAAAA CAGAAA OOOOxx +8740 4059 0 0 0 0 40 740 740 3740 8740 80 81 EYAAAA DAGAAA VVVVxx +3877 4060 1 1 7 17 77 877 1877 3877 3877 154 155 DTAAAA EAGAAA AAAAxx +5731 4061 1 3 1 11 31 731 1731 731 5731 62 63 LMAAAA FAGAAA HHHHxx +6407 4062 1 3 7 7 7 407 407 1407 6407 14 15 LMAAAA GAGAAA OOOOxx +2044 4063 0 0 4 4 44 44 44 2044 2044 88 89 QAAAAA HAGAAA VVVVxx +7362 4064 0 2 2 2 62 362 1362 2362 7362 124 125 EXAAAA IAGAAA AAAAxx +5458 4065 0 2 8 18 58 458 1458 458 5458 116 117 YBAAAA JAGAAA HHHHxx +6437 4066 1 1 7 17 37 437 437 1437 6437 74 75 PNAAAA KAGAAA OOOOxx +1051 4067 1 3 1 11 51 51 1051 1051 1051 102 103 LOAAAA LAGAAA VVVVxx +1203 4068 1 3 3 3 3 203 1203 1203 1203 6 7 HUAAAA MAGAAA AAAAxx +2176 4069 0 0 6 16 76 176 176 2176 2176 152 153 SFAAAA NAGAAA HHHHxx +8997 4070 1 1 7 17 97 997 997 3997 8997 194 195 BIAAAA OAGAAA OOOOxx +6378 4071 0 2 8 18 78 378 378 1378 6378 156 157 ILAAAA PAGAAA VVVVxx +6006 4072 0 2 6 6 6 6 6 1006 6006 12 13 AXAAAA QAGAAA AAAAxx +2308 4073 0 0 8 8 8 308 308 2308 2308 16 17 UKAAAA RAGAAA HHHHxx +625 4074 1 1 5 5 25 625 625 625 625 50 51 BYAAAA SAGAAA OOOOxx +7298 4075 0 2 8 18 98 298 1298 2298 7298 196 197 SUAAAA TAGAAA VVVVxx +5575 4076 1 3 5 15 75 575 1575 575 5575 150 151 LGAAAA UAGAAA AAAAxx +3565 4077 1 1 5 5 65 565 1565 3565 3565 130 131 DHAAAA VAGAAA HHHHxx +47 4078 1 3 7 7 47 47 47 47 47 94 95 VBAAAA WAGAAA OOOOxx +2413 4079 1 1 3 13 13 413 413 2413 2413 26 27 VOAAAA XAGAAA VVVVxx +2153 4080 1 1 3 13 53 153 153 2153 2153 106 107 VEAAAA YAGAAA AAAAxx +752 4081 0 0 2 12 52 752 752 752 752 104 105 YCAAAA ZAGAAA HHHHxx +4095 4082 1 3 5 15 95 95 95 4095 4095 190 191 NBAAAA ABGAAA OOOOxx +2518 4083 0 2 8 18 18 518 518 2518 2518 36 37 WSAAAA BBGAAA VVVVxx +3681 4084 1 1 1 1 81 681 1681 3681 3681 162 163 PLAAAA CBGAAA AAAAxx +4213 4085 1 1 3 13 13 213 213 4213 4213 26 27 BGAAAA DBGAAA HHHHxx +2615 4086 1 3 5 15 15 615 615 2615 2615 30 31 PWAAAA EBGAAA OOOOxx +1471 4087 1 3 1 11 71 471 1471 1471 1471 142 143 PEAAAA FBGAAA VVVVxx +7315 4088 1 3 5 15 15 315 1315 2315 7315 30 31 JVAAAA GBGAAA AAAAxx +6013 4089 1 1 3 13 13 13 13 1013 6013 26 27 HXAAAA HBGAAA HHHHxx +3077 4090 1 1 7 17 77 77 1077 3077 3077 154 155 JOAAAA IBGAAA OOOOxx +2190 4091 0 2 0 10 90 190 190 2190 2190 180 181 GGAAAA JBGAAA VVVVxx +528 4092 0 0 8 8 28 528 528 528 528 56 57 IUAAAA KBGAAA AAAAxx +9508 4093 0 0 8 8 8 508 1508 4508 9508 16 17 SBAAAA LBGAAA HHHHxx +2473 4094 1 1 3 13 73 473 473 2473 2473 146 147 DRAAAA MBGAAA OOOOxx +167 4095 1 3 7 7 67 167 167 167 167 134 135 LGAAAA NBGAAA VVVVxx +8448 4096 0 0 8 8 48 448 448 3448 8448 96 97 YMAAAA OBGAAA AAAAxx +7538 4097 0 2 8 18 38 538 1538 2538 7538 76 77 YDAAAA PBGAAA HHHHxx +7638 4098 0 2 8 18 38 638 1638 2638 7638 76 77 UHAAAA QBGAAA OOOOxx +4328 4099 0 0 8 8 28 328 328 4328 4328 56 57 MKAAAA RBGAAA VVVVxx +3812 4100 0 0 2 12 12 812 1812 3812 3812 24 25 QQAAAA SBGAAA AAAAxx +2879 4101 1 3 9 19 79 879 879 2879 2879 158 159 TGAAAA TBGAAA HHHHxx +4741 4102 1 1 1 1 41 741 741 4741 4741 82 83 JAAAAA UBGAAA OOOOxx +9155 4103 1 3 5 15 55 155 1155 4155 9155 110 111 DOAAAA VBGAAA VVVVxx +5151 4104 1 3 1 11 51 151 1151 151 5151 102 103 DQAAAA WBGAAA AAAAxx +5591 4105 1 3 1 11 91 591 1591 591 5591 182 183 BHAAAA XBGAAA HHHHxx +1034 4106 0 2 4 14 34 34 1034 1034 1034 68 69 UNAAAA YBGAAA OOOOxx +765 4107 1 1 5 5 65 765 765 765 765 130 131 LDAAAA ZBGAAA VVVVxx +2664 4108 0 0 4 4 64 664 664 2664 2664 128 129 MYAAAA ACGAAA AAAAxx +6854 4109 0 2 4 14 54 854 854 1854 6854 108 109 QDAAAA BCGAAA HHHHxx +8263 4110 1 3 3 3 63 263 263 3263 8263 126 127 VFAAAA CCGAAA OOOOxx +8658 4111 0 2 8 18 58 658 658 3658 8658 116 117 AVAAAA DCGAAA VVVVxx +587 4112 1 3 7 7 87 587 587 587 587 174 175 PWAAAA ECGAAA AAAAxx +4553 4113 1 1 3 13 53 553 553 4553 4553 106 107 DTAAAA FCGAAA HHHHxx +1368 4114 0 0 8 8 68 368 1368 1368 1368 136 137 QAAAAA GCGAAA OOOOxx +1718 4115 0 2 8 18 18 718 1718 1718 1718 36 37 COAAAA HCGAAA VVVVxx +140 4116 0 0 0 0 40 140 140 140 140 80 81 KFAAAA ICGAAA AAAAxx +8341 4117 1 1 1 1 41 341 341 3341 8341 82 83 VIAAAA JCGAAA HHHHxx +72 4118 0 0 2 12 72 72 72 72 72 144 145 UCAAAA KCGAAA OOOOxx +6589 4119 1 1 9 9 89 589 589 1589 6589 178 179 LTAAAA LCGAAA VVVVxx +2024 4120 0 0 4 4 24 24 24 2024 2024 48 49 WZAAAA MCGAAA AAAAxx +8024 4121 0 0 4 4 24 24 24 3024 8024 48 49 QWAAAA NCGAAA HHHHxx +9564 4122 0 0 4 4 64 564 1564 4564 9564 128 129 WDAAAA OCGAAA OOOOxx +8625 4123 1 1 5 5 25 625 625 3625 8625 50 51 TTAAAA PCGAAA VVVVxx +2680 4124 0 0 0 0 80 680 680 2680 2680 160 161 CZAAAA QCGAAA AAAAxx +4323 4125 1 3 3 3 23 323 323 4323 4323 46 47 HKAAAA RCGAAA HHHHxx +8981 4126 1 1 1 1 81 981 981 3981 8981 162 163 LHAAAA SCGAAA OOOOxx +8909 4127 1 1 9 9 9 909 909 3909 8909 18 19 REAAAA TCGAAA VVVVxx +5288 4128 0 0 8 8 88 288 1288 288 5288 176 177 KVAAAA UCGAAA AAAAxx +2057 4129 1 1 7 17 57 57 57 2057 2057 114 115 DBAAAA VCGAAA HHHHxx +5931 4130 1 3 1 11 31 931 1931 931 5931 62 63 DUAAAA WCGAAA OOOOxx +9794 4131 0 2 4 14 94 794 1794 4794 9794 188 189 SMAAAA XCGAAA VVVVxx +1012 4132 0 0 2 12 12 12 1012 1012 1012 24 25 YMAAAA YCGAAA AAAAxx +5496 4133 0 0 6 16 96 496 1496 496 5496 192 193 KDAAAA ZCGAAA HHHHxx +9182 4134 0 2 2 2 82 182 1182 4182 9182 164 165 EPAAAA ADGAAA OOOOxx +5258 4135 0 2 8 18 58 258 1258 258 5258 116 117 GUAAAA BDGAAA VVVVxx +3050 4136 0 2 0 10 50 50 1050 3050 3050 100 101 INAAAA CDGAAA AAAAxx +2083 4137 1 3 3 3 83 83 83 2083 2083 166 167 DCAAAA DDGAAA HHHHxx +3069 4138 1 1 9 9 69 69 1069 3069 3069 138 139 BOAAAA EDGAAA OOOOxx +8459 4139 1 3 9 19 59 459 459 3459 8459 118 119 JNAAAA FDGAAA VVVVxx +169 4140 1 1 9 9 69 169 169 169 169 138 139 NGAAAA GDGAAA AAAAxx +4379 4141 1 3 9 19 79 379 379 4379 4379 158 159 LMAAAA HDGAAA HHHHxx +5126 4142 0 2 6 6 26 126 1126 126 5126 52 53 EPAAAA IDGAAA OOOOxx +1415 4143 1 3 5 15 15 415 1415 1415 1415 30 31 LCAAAA JDGAAA VVVVxx +1163 4144 1 3 3 3 63 163 1163 1163 1163 126 127 TSAAAA KDGAAA AAAAxx +3500 4145 0 0 0 0 0 500 1500 3500 3500 0 1 QEAAAA LDGAAA HHHHxx +7202 4146 0 2 2 2 2 202 1202 2202 7202 4 5 ARAAAA MDGAAA OOOOxx +747 4147 1 3 7 7 47 747 747 747 747 94 95 TCAAAA NDGAAA VVVVxx +9264 4148 0 0 4 4 64 264 1264 4264 9264 128 129 ISAAAA ODGAAA AAAAxx +8548 4149 0 0 8 8 48 548 548 3548 8548 96 97 UQAAAA PDGAAA HHHHxx +4228 4150 0 0 8 8 28 228 228 4228 4228 56 57 QGAAAA QDGAAA OOOOxx +7122 4151 0 2 2 2 22 122 1122 2122 7122 44 45 YNAAAA RDGAAA VVVVxx +3395 4152 1 3 5 15 95 395 1395 3395 3395 190 191 PAAAAA SDGAAA AAAAxx +5674 4153 0 2 4 14 74 674 1674 674 5674 148 149 GKAAAA TDGAAA HHHHxx +7293 4154 1 1 3 13 93 293 1293 2293 7293 186 187 NUAAAA UDGAAA OOOOxx +737 4155 1 1 7 17 37 737 737 737 737 74 75 JCAAAA VDGAAA VVVVxx +9595 4156 1 3 5 15 95 595 1595 4595 9595 190 191 BFAAAA WDGAAA AAAAxx +594 4157 0 2 4 14 94 594 594 594 594 188 189 WWAAAA XDGAAA HHHHxx +5322 4158 0 2 2 2 22 322 1322 322 5322 44 45 SWAAAA YDGAAA OOOOxx +2933 4159 1 1 3 13 33 933 933 2933 2933 66 67 VIAAAA ZDGAAA VVVVxx +4955 4160 1 3 5 15 55 955 955 4955 4955 110 111 PIAAAA AEGAAA AAAAxx +4073 4161 1 1 3 13 73 73 73 4073 4073 146 147 RAAAAA BEGAAA HHHHxx +7249 4162 1 1 9 9 49 249 1249 2249 7249 98 99 VSAAAA CEGAAA OOOOxx +192 4163 0 0 2 12 92 192 192 192 192 184 185 KHAAAA DEGAAA VVVVxx +2617 4164 1 1 7 17 17 617 617 2617 2617 34 35 RWAAAA EEGAAA AAAAxx +7409 4165 1 1 9 9 9 409 1409 2409 7409 18 19 ZYAAAA FEGAAA HHHHxx +4903 4166 1 3 3 3 3 903 903 4903 4903 6 7 PGAAAA GEGAAA OOOOxx +9797 4167 1 1 7 17 97 797 1797 4797 9797 194 195 VMAAAA HEGAAA VVVVxx +9919 4168 1 3 9 19 19 919 1919 4919 9919 38 39 NRAAAA IEGAAA AAAAxx +1878 4169 0 2 8 18 78 878 1878 1878 1878 156 157 GUAAAA JEGAAA HHHHxx +4851 4170 1 3 1 11 51 851 851 4851 4851 102 103 PEAAAA KEGAAA OOOOxx +5514 4171 0 2 4 14 14 514 1514 514 5514 28 29 CEAAAA LEGAAA VVVVxx +2582 4172 0 2 2 2 82 582 582 2582 2582 164 165 IVAAAA MEGAAA AAAAxx +3564 4173 0 0 4 4 64 564 1564 3564 3564 128 129 CHAAAA NEGAAA HHHHxx +7085 4174 1 1 5 5 85 85 1085 2085 7085 170 171 NMAAAA OEGAAA OOOOxx +3619 4175 1 3 9 19 19 619 1619 3619 3619 38 39 FJAAAA PEGAAA VVVVxx +261 4176 1 1 1 1 61 261 261 261 261 122 123 BKAAAA QEGAAA AAAAxx +7338 4177 0 2 8 18 38 338 1338 2338 7338 76 77 GWAAAA REGAAA HHHHxx +4251 4178 1 3 1 11 51 251 251 4251 4251 102 103 NHAAAA SEGAAA OOOOxx +5360 4179 0 0 0 0 60 360 1360 360 5360 120 121 EYAAAA TEGAAA VVVVxx +5678 4180 0 2 8 18 78 678 1678 678 5678 156 157 KKAAAA UEGAAA AAAAxx +9162 4181 0 2 2 2 62 162 1162 4162 9162 124 125 KOAAAA VEGAAA HHHHxx +5920 4182 0 0 0 0 20 920 1920 920 5920 40 41 STAAAA WEGAAA OOOOxx +7156 4183 0 0 6 16 56 156 1156 2156 7156 112 113 GPAAAA XEGAAA VVVVxx +4271 4184 1 3 1 11 71 271 271 4271 4271 142 143 HIAAAA YEGAAA AAAAxx +4698 4185 0 2 8 18 98 698 698 4698 4698 196 197 SYAAAA ZEGAAA HHHHxx +1572 4186 0 0 2 12 72 572 1572 1572 1572 144 145 MIAAAA AFGAAA OOOOxx +6974 4187 0 2 4 14 74 974 974 1974 6974 148 149 GIAAAA BFGAAA VVVVxx +4291 4188 1 3 1 11 91 291 291 4291 4291 182 183 BJAAAA CFGAAA AAAAxx +4036 4189 0 0 6 16 36 36 36 4036 4036 72 73 GZAAAA DFGAAA HHHHxx +7473 4190 1 1 3 13 73 473 1473 2473 7473 146 147 LBAAAA EFGAAA OOOOxx +4786 4191 0 2 6 6 86 786 786 4786 4786 172 173 CCAAAA FFGAAA VVVVxx +2662 4192 0 2 2 2 62 662 662 2662 2662 124 125 KYAAAA GFGAAA AAAAxx +916 4193 0 0 6 16 16 916 916 916 916 32 33 GJAAAA HFGAAA HHHHxx +668 4194 0 0 8 8 68 668 668 668 668 136 137 SZAAAA IFGAAA OOOOxx +4874 4195 0 2 4 14 74 874 874 4874 4874 148 149 MFAAAA JFGAAA VVVVxx +3752 4196 0 0 2 12 52 752 1752 3752 3752 104 105 IOAAAA KFGAAA AAAAxx +4865 4197 1 1 5 5 65 865 865 4865 4865 130 131 DFAAAA LFGAAA HHHHxx +7052 4198 0 0 2 12 52 52 1052 2052 7052 104 105 GLAAAA MFGAAA OOOOxx +5712 4199 0 0 2 12 12 712 1712 712 5712 24 25 SLAAAA NFGAAA VVVVxx +31 4200 1 3 1 11 31 31 31 31 31 62 63 FBAAAA OFGAAA AAAAxx +4944 4201 0 0 4 4 44 944 944 4944 4944 88 89 EIAAAA PFGAAA HHHHxx +1435 4202 1 3 5 15 35 435 1435 1435 1435 70 71 FDAAAA QFGAAA OOOOxx +501 4203 1 1 1 1 1 501 501 501 501 2 3 HTAAAA RFGAAA VVVVxx +9401 4204 1 1 1 1 1 401 1401 4401 9401 2 3 PXAAAA SFGAAA AAAAxx +5014 4205 0 2 4 14 14 14 1014 14 5014 28 29 WKAAAA TFGAAA HHHHxx +9125 4206 1 1 5 5 25 125 1125 4125 9125 50 51 ZMAAAA UFGAAA OOOOxx +6144 4207 0 0 4 4 44 144 144 1144 6144 88 89 ICAAAA VFGAAA VVVVxx +1743 4208 1 3 3 3 43 743 1743 1743 1743 86 87 BPAAAA WFGAAA AAAAxx +4316 4209 0 0 6 16 16 316 316 4316 4316 32 33 AKAAAA XFGAAA HHHHxx +8212 4210 0 0 2 12 12 212 212 3212 8212 24 25 WDAAAA YFGAAA OOOOxx +7344 4211 0 0 4 4 44 344 1344 2344 7344 88 89 MWAAAA ZFGAAA VVVVxx +2051 4212 1 3 1 11 51 51 51 2051 2051 102 103 XAAAAA AGGAAA AAAAxx +8131 4213 1 3 1 11 31 131 131 3131 8131 62 63 TAAAAA BGGAAA HHHHxx +7023 4214 1 3 3 3 23 23 1023 2023 7023 46 47 DKAAAA CGGAAA OOOOxx +9674 4215 0 2 4 14 74 674 1674 4674 9674 148 149 CIAAAA DGGAAA VVVVxx +4984 4216 0 0 4 4 84 984 984 4984 4984 168 169 SJAAAA EGGAAA AAAAxx +111 4217 1 3 1 11 11 111 111 111 111 22 23 HEAAAA FGGAAA HHHHxx +2296 4218 0 0 6 16 96 296 296 2296 2296 192 193 IKAAAA GGGAAA OOOOxx +5025 4219 1 1 5 5 25 25 1025 25 5025 50 51 HLAAAA HGGAAA VVVVxx +1756 4220 0 0 6 16 56 756 1756 1756 1756 112 113 OPAAAA IGGAAA AAAAxx +2885 4221 1 1 5 5 85 885 885 2885 2885 170 171 ZGAAAA JGGAAA HHHHxx +2541 4222 1 1 1 1 41 541 541 2541 2541 82 83 TTAAAA KGGAAA OOOOxx +1919 4223 1 3 9 19 19 919 1919 1919 1919 38 39 VVAAAA LGGAAA VVVVxx +6496 4224 0 0 6 16 96 496 496 1496 6496 192 193 WPAAAA MGGAAA AAAAxx +6103 4225 1 3 3 3 3 103 103 1103 6103 6 7 TAAAAA NGGAAA HHHHxx +98 4226 0 2 8 18 98 98 98 98 98 196 197 UDAAAA OGGAAA OOOOxx +3727 4227 1 3 7 7 27 727 1727 3727 3727 54 55 JNAAAA PGGAAA VVVVxx +689 4228 1 1 9 9 89 689 689 689 689 178 179 NAAAAA QGGAAA AAAAxx +7181 4229 1 1 1 1 81 181 1181 2181 7181 162 163 FQAAAA RGGAAA HHHHxx +8447 4230 1 3 7 7 47 447 447 3447 8447 94 95 XMAAAA SGGAAA OOOOxx +4569 4231 1 1 9 9 69 569 569 4569 4569 138 139 TTAAAA TGGAAA VVVVxx +8844 4232 0 0 4 4 44 844 844 3844 8844 88 89 ECAAAA UGGAAA AAAAxx +2436 4233 0 0 6 16 36 436 436 2436 2436 72 73 SPAAAA VGGAAA HHHHxx +391 4234 1 3 1 11 91 391 391 391 391 182 183 BPAAAA WGGAAA OOOOxx +3035 4235 1 3 5 15 35 35 1035 3035 3035 70 71 TMAAAA XGGAAA VVVVxx +7583 4236 1 3 3 3 83 583 1583 2583 7583 166 167 RFAAAA YGGAAA AAAAxx +1145 4237 1 1 5 5 45 145 1145 1145 1145 90 91 BSAAAA ZGGAAA HHHHxx +93 4238 1 1 3 13 93 93 93 93 93 186 187 PDAAAA AHGAAA OOOOxx +8896 4239 0 0 6 16 96 896 896 3896 8896 192 193 EEAAAA BHGAAA VVVVxx +6719 4240 1 3 9 19 19 719 719 1719 6719 38 39 LYAAAA CHGAAA AAAAxx +7728 4241 0 0 8 8 28 728 1728 2728 7728 56 57 GLAAAA DHGAAA HHHHxx +1349 4242 1 1 9 9 49 349 1349 1349 1349 98 99 XZAAAA EHGAAA OOOOxx +5349 4243 1 1 9 9 49 349 1349 349 5349 98 99 TXAAAA FHGAAA VVVVxx +3040 4244 0 0 0 0 40 40 1040 3040 3040 80 81 YMAAAA GHGAAA AAAAxx +2414 4245 0 2 4 14 14 414 414 2414 2414 28 29 WOAAAA HHGAAA HHHHxx +5122 4246 0 2 2 2 22 122 1122 122 5122 44 45 APAAAA IHGAAA OOOOxx +9553 4247 1 1 3 13 53 553 1553 4553 9553 106 107 LDAAAA JHGAAA VVVVxx +5987 4248 1 3 7 7 87 987 1987 987 5987 174 175 HWAAAA KHGAAA AAAAxx +5939 4249 1 3 9 19 39 939 1939 939 5939 78 79 LUAAAA LHGAAA HHHHxx +3525 4250 1 1 5 5 25 525 1525 3525 3525 50 51 PFAAAA MHGAAA OOOOxx +1371 4251 1 3 1 11 71 371 1371 1371 1371 142 143 TAAAAA NHGAAA VVVVxx +618 4252 0 2 8 18 18 618 618 618 618 36 37 UXAAAA OHGAAA AAAAxx +6529 4253 1 1 9 9 29 529 529 1529 6529 58 59 DRAAAA PHGAAA HHHHxx +4010 4254 0 2 0 10 10 10 10 4010 4010 20 21 GYAAAA QHGAAA OOOOxx +328 4255 0 0 8 8 28 328 328 328 328 56 57 QMAAAA RHGAAA VVVVxx +6121 4256 1 1 1 1 21 121 121 1121 6121 42 43 LBAAAA SHGAAA AAAAxx +3505 4257 1 1 5 5 5 505 1505 3505 3505 10 11 VEAAAA THGAAA HHHHxx +2033 4258 1 1 3 13 33 33 33 2033 2033 66 67 FAAAAA UHGAAA OOOOxx +4724 4259 0 0 4 4 24 724 724 4724 4724 48 49 SZAAAA VHGAAA VVVVxx +8717 4260 1 1 7 17 17 717 717 3717 8717 34 35 HXAAAA WHGAAA AAAAxx +5639 4261 1 3 9 19 39 639 1639 639 5639 78 79 XIAAAA XHGAAA HHHHxx +3448 4262 0 0 8 8 48 448 1448 3448 3448 96 97 QCAAAA YHGAAA OOOOxx +2919 4263 1 3 9 19 19 919 919 2919 2919 38 39 HIAAAA ZHGAAA VVVVxx +3417 4264 1 1 7 17 17 417 1417 3417 3417 34 35 LBAAAA AIGAAA AAAAxx +943 4265 1 3 3 3 43 943 943 943 943 86 87 HKAAAA BIGAAA HHHHxx +775 4266 1 3 5 15 75 775 775 775 775 150 151 VDAAAA CIGAAA OOOOxx +2333 4267 1 1 3 13 33 333 333 2333 2333 66 67 TLAAAA DIGAAA VVVVxx +4801 4268 1 1 1 1 1 801 801 4801 4801 2 3 RCAAAA EIGAAA AAAAxx +7169 4269 1 1 9 9 69 169 1169 2169 7169 138 139 TPAAAA FIGAAA HHHHxx +2840 4270 0 0 0 0 40 840 840 2840 2840 80 81 GFAAAA GIGAAA OOOOxx +9034 4271 0 2 4 14 34 34 1034 4034 9034 68 69 MJAAAA HIGAAA VVVVxx +6154 4272 0 2 4 14 54 154 154 1154 6154 108 109 SCAAAA IIGAAA AAAAxx +1412 4273 0 0 2 12 12 412 1412 1412 1412 24 25 ICAAAA JIGAAA HHHHxx +2263 4274 1 3 3 3 63 263 263 2263 2263 126 127 BJAAAA KIGAAA OOOOxx +7118 4275 0 2 8 18 18 118 1118 2118 7118 36 37 UNAAAA LIGAAA VVVVxx +1526 4276 0 2 6 6 26 526 1526 1526 1526 52 53 SGAAAA MIGAAA AAAAxx +491 4277 1 3 1 11 91 491 491 491 491 182 183 XSAAAA NIGAAA HHHHxx +9732 4278 0 0 2 12 32 732 1732 4732 9732 64 65 IKAAAA OIGAAA OOOOxx +7067 4279 1 3 7 7 67 67 1067 2067 7067 134 135 VLAAAA PIGAAA VVVVxx +212 4280 0 0 2 12 12 212 212 212 212 24 25 EIAAAA QIGAAA AAAAxx +1955 4281 1 3 5 15 55 955 1955 1955 1955 110 111 FXAAAA RIGAAA HHHHxx +3303 4282 1 3 3 3 3 303 1303 3303 3303 6 7 BXAAAA SIGAAA OOOOxx +2715 4283 1 3 5 15 15 715 715 2715 2715 30 31 LAAAAA TIGAAA VVVVxx +8168 4284 0 0 8 8 68 168 168 3168 8168 136 137 ECAAAA UIGAAA AAAAxx +6799 4285 1 3 9 19 99 799 799 1799 6799 198 199 NBAAAA VIGAAA HHHHxx +5080 4286 0 0 0 0 80 80 1080 80 5080 160 161 KNAAAA WIGAAA OOOOxx +4939 4287 1 3 9 19 39 939 939 4939 4939 78 79 ZHAAAA XIGAAA VVVVxx +6604 4288 0 0 4 4 4 604 604 1604 6604 8 9 AUAAAA YIGAAA AAAAxx +6531 4289 1 3 1 11 31 531 531 1531 6531 62 63 FRAAAA ZIGAAA HHHHxx +9948 4290 0 0 8 8 48 948 1948 4948 9948 96 97 QSAAAA AJGAAA OOOOxx +7923 4291 1 3 3 3 23 923 1923 2923 7923 46 47 TSAAAA BJGAAA VVVVxx +9905 4292 1 1 5 5 5 905 1905 4905 9905 10 11 ZQAAAA CJGAAA AAAAxx +340 4293 0 0 0 0 40 340 340 340 340 80 81 CNAAAA DJGAAA HHHHxx +1721 4294 1 1 1 1 21 721 1721 1721 1721 42 43 FOAAAA EJGAAA OOOOxx +9047 4295 1 3 7 7 47 47 1047 4047 9047 94 95 ZJAAAA FJGAAA VVVVxx +4723 4296 1 3 3 3 23 723 723 4723 4723 46 47 RZAAAA GJGAAA AAAAxx +5748 4297 0 0 8 8 48 748 1748 748 5748 96 97 CNAAAA HJGAAA HHHHxx +6845 4298 1 1 5 5 45 845 845 1845 6845 90 91 HDAAAA IJGAAA OOOOxx +1556 4299 0 0 6 16 56 556 1556 1556 1556 112 113 WHAAAA JJGAAA VVVVxx +9505 4300 1 1 5 5 5 505 1505 4505 9505 10 11 PBAAAA KJGAAA AAAAxx +3573 4301 1 1 3 13 73 573 1573 3573 3573 146 147 LHAAAA LJGAAA HHHHxx +3785 4302 1 1 5 5 85 785 1785 3785 3785 170 171 PPAAAA MJGAAA OOOOxx +2772 4303 0 0 2 12 72 772 772 2772 2772 144 145 QCAAAA NJGAAA VVVVxx +7282 4304 0 2 2 2 82 282 1282 2282 7282 164 165 CUAAAA OJGAAA AAAAxx +8106 4305 0 2 6 6 6 106 106 3106 8106 12 13 UZAAAA PJGAAA HHHHxx +2847 4306 1 3 7 7 47 847 847 2847 2847 94 95 NFAAAA QJGAAA OOOOxx +9803 4307 1 3 3 3 3 803 1803 4803 9803 6 7 BNAAAA RJGAAA VVVVxx +7719 4308 1 3 9 19 19 719 1719 2719 7719 38 39 XKAAAA SJGAAA AAAAxx +4649 4309 1 1 9 9 49 649 649 4649 4649 98 99 VWAAAA TJGAAA HHHHxx +6196 4310 0 0 6 16 96 196 196 1196 6196 192 193 IEAAAA UJGAAA OOOOxx +6026 4311 0 2 6 6 26 26 26 1026 6026 52 53 UXAAAA VJGAAA VVVVxx +1646 4312 0 2 6 6 46 646 1646 1646 1646 92 93 ILAAAA WJGAAA AAAAxx +6526 4313 0 2 6 6 26 526 526 1526 6526 52 53 ARAAAA XJGAAA HHHHxx +5110 4314 0 2 0 10 10 110 1110 110 5110 20 21 OOAAAA YJGAAA OOOOxx +3946 4315 0 2 6 6 46 946 1946 3946 3946 92 93 UVAAAA ZJGAAA VVVVxx +445 4316 1 1 5 5 45 445 445 445 445 90 91 DRAAAA AKGAAA AAAAxx +3249 4317 1 1 9 9 49 249 1249 3249 3249 98 99 ZUAAAA BKGAAA HHHHxx +2501 4318 1 1 1 1 1 501 501 2501 2501 2 3 FSAAAA CKGAAA OOOOxx +3243 4319 1 3 3 3 43 243 1243 3243 3243 86 87 TUAAAA DKGAAA VVVVxx +4701 4320 1 1 1 1 1 701 701 4701 4701 2 3 VYAAAA EKGAAA AAAAxx +472 4321 0 0 2 12 72 472 472 472 472 144 145 ESAAAA FKGAAA HHHHxx +3356 4322 0 0 6 16 56 356 1356 3356 3356 112 113 CZAAAA GKGAAA OOOOxx +9967 4323 1 3 7 7 67 967 1967 4967 9967 134 135 JTAAAA HKGAAA VVVVxx +4292 4324 0 0 2 12 92 292 292 4292 4292 184 185 CJAAAA IKGAAA AAAAxx +7005 4325 1 1 5 5 5 5 1005 2005 7005 10 11 LJAAAA JKGAAA HHHHxx +6267 4326 1 3 7 7 67 267 267 1267 6267 134 135 BHAAAA KKGAAA OOOOxx +6678 4327 0 2 8 18 78 678 678 1678 6678 156 157 WWAAAA LKGAAA VVVVxx +6083 4328 1 3 3 3 83 83 83 1083 6083 166 167 ZZAAAA MKGAAA AAAAxx +760 4329 0 0 0 0 60 760 760 760 760 120 121 GDAAAA NKGAAA HHHHxx +7833 4330 1 1 3 13 33 833 1833 2833 7833 66 67 HPAAAA OKGAAA OOOOxx +2877 4331 1 1 7 17 77 877 877 2877 2877 154 155 RGAAAA PKGAAA VVVVxx +8810 4332 0 2 0 10 10 810 810 3810 8810 20 21 WAAAAA QKGAAA AAAAxx +1560 4333 0 0 0 0 60 560 1560 1560 1560 120 121 AIAAAA RKGAAA HHHHxx +1367 4334 1 3 7 7 67 367 1367 1367 1367 134 135 PAAAAA SKGAAA OOOOxx +8756 4335 0 0 6 16 56 756 756 3756 8756 112 113 UYAAAA TKGAAA VVVVxx +1346 4336 0 2 6 6 46 346 1346 1346 1346 92 93 UZAAAA UKGAAA AAAAxx +6449 4337 1 1 9 9 49 449 449 1449 6449 98 99 BOAAAA VKGAAA HHHHxx +6658 4338 0 2 8 18 58 658 658 1658 6658 116 117 CWAAAA WKGAAA OOOOxx +6745 4339 1 1 5 5 45 745 745 1745 6745 90 91 LZAAAA XKGAAA VVVVxx +4866 4340 0 2 6 6 66 866 866 4866 4866 132 133 EFAAAA YKGAAA AAAAxx +14 4341 0 2 4 14 14 14 14 14 14 28 29 OAAAAA ZKGAAA HHHHxx +4506 4342 0 2 6 6 6 506 506 4506 4506 12 13 IRAAAA ALGAAA OOOOxx +1923 4343 1 3 3 3 23 923 1923 1923 1923 46 47 ZVAAAA BLGAAA VVVVxx +8365 4344 1 1 5 5 65 365 365 3365 8365 130 131 TJAAAA CLGAAA AAAAxx +1279 4345 1 3 9 19 79 279 1279 1279 1279 158 159 FXAAAA DLGAAA HHHHxx +7666 4346 0 2 6 6 66 666 1666 2666 7666 132 133 WIAAAA ELGAAA OOOOxx +7404 4347 0 0 4 4 4 404 1404 2404 7404 8 9 UYAAAA FLGAAA VVVVxx +65 4348 1 1 5 5 65 65 65 65 65 130 131 NCAAAA GLGAAA AAAAxx +5820 4349 0 0 0 0 20 820 1820 820 5820 40 41 WPAAAA HLGAAA HHHHxx +459 4350 1 3 9 19 59 459 459 459 459 118 119 RRAAAA ILGAAA OOOOxx +4787 4351 1 3 7 7 87 787 787 4787 4787 174 175 DCAAAA JLGAAA VVVVxx +5631 4352 1 3 1 11 31 631 1631 631 5631 62 63 PIAAAA KLGAAA AAAAxx +9717 4353 1 1 7 17 17 717 1717 4717 9717 34 35 TJAAAA LLGAAA HHHHxx +2560 4354 0 0 0 0 60 560 560 2560 2560 120 121 MUAAAA MLGAAA OOOOxx +8295 4355 1 3 5 15 95 295 295 3295 8295 190 191 BHAAAA NLGAAA VVVVxx +3596 4356 0 0 6 16 96 596 1596 3596 3596 192 193 IIAAAA OLGAAA AAAAxx +2023 4357 1 3 3 3 23 23 23 2023 2023 46 47 VZAAAA PLGAAA HHHHxx +5055 4358 1 3 5 15 55 55 1055 55 5055 110 111 LMAAAA QLGAAA OOOOxx +763 4359 1 3 3 3 63 763 763 763 763 126 127 JDAAAA RLGAAA VVVVxx +6733 4360 1 1 3 13 33 733 733 1733 6733 66 67 ZYAAAA SLGAAA AAAAxx +9266 4361 0 2 6 6 66 266 1266 4266 9266 132 133 KSAAAA TLGAAA HHHHxx +4479 4362 1 3 9 19 79 479 479 4479 4479 158 159 HQAAAA ULGAAA OOOOxx +1816 4363 0 0 6 16 16 816 1816 1816 1816 32 33 WRAAAA VLGAAA VVVVxx +899 4364 1 3 9 19 99 899 899 899 899 198 199 PIAAAA WLGAAA AAAAxx +230 4365 0 2 0 10 30 230 230 230 230 60 61 WIAAAA XLGAAA HHHHxx +5362 4366 0 2 2 2 62 362 1362 362 5362 124 125 GYAAAA YLGAAA OOOOxx +1609 4367 1 1 9 9 9 609 1609 1609 1609 18 19 XJAAAA ZLGAAA VVVVxx +6750 4368 0 2 0 10 50 750 750 1750 6750 100 101 QZAAAA AMGAAA AAAAxx +9704 4369 0 0 4 4 4 704 1704 4704 9704 8 9 GJAAAA BMGAAA HHHHxx +3991 4370 1 3 1 11 91 991 1991 3991 3991 182 183 NXAAAA CMGAAA OOOOxx +3959 4371 1 3 9 19 59 959 1959 3959 3959 118 119 HWAAAA DMGAAA VVVVxx +9021 4372 1 1 1 1 21 21 1021 4021 9021 42 43 ZIAAAA EMGAAA AAAAxx +7585 4373 1 1 5 5 85 585 1585 2585 7585 170 171 TFAAAA FMGAAA HHHHxx +7083 4374 1 3 3 3 83 83 1083 2083 7083 166 167 LMAAAA GMGAAA OOOOxx +7688 4375 0 0 8 8 88 688 1688 2688 7688 176 177 SJAAAA HMGAAA VVVVxx +2673 4376 1 1 3 13 73 673 673 2673 2673 146 147 VYAAAA IMGAAA AAAAxx +3554 4377 0 2 4 14 54 554 1554 3554 3554 108 109 SGAAAA JMGAAA HHHHxx +7416 4378 0 0 6 16 16 416 1416 2416 7416 32 33 GZAAAA KMGAAA OOOOxx +5672 4379 0 0 2 12 72 672 1672 672 5672 144 145 EKAAAA LMGAAA VVVVxx +1355 4380 1 3 5 15 55 355 1355 1355 1355 110 111 DAAAAA MMGAAA AAAAxx +3149 4381 1 1 9 9 49 149 1149 3149 3149 98 99 DRAAAA NMGAAA HHHHxx +5811 4382 1 3 1 11 11 811 1811 811 5811 22 23 NPAAAA OMGAAA OOOOxx +3759 4383 1 3 9 19 59 759 1759 3759 3759 118 119 POAAAA PMGAAA VVVVxx +5634 4384 0 2 4 14 34 634 1634 634 5634 68 69 SIAAAA QMGAAA AAAAxx +8617 4385 1 1 7 17 17 617 617 3617 8617 34 35 LTAAAA RMGAAA HHHHxx +8949 4386 1 1 9 9 49 949 949 3949 8949 98 99 FGAAAA SMGAAA OOOOxx +3964 4387 0 0 4 4 64 964 1964 3964 3964 128 129 MWAAAA TMGAAA VVVVxx +3852 4388 0 0 2 12 52 852 1852 3852 3852 104 105 ESAAAA UMGAAA AAAAxx +1555 4389 1 3 5 15 55 555 1555 1555 1555 110 111 VHAAAA VMGAAA HHHHxx +6536 4390 0 0 6 16 36 536 536 1536 6536 72 73 KRAAAA WMGAAA OOOOxx +4779 4391 1 3 9 19 79 779 779 4779 4779 158 159 VBAAAA XMGAAA VVVVxx +1893 4392 1 1 3 13 93 893 1893 1893 1893 186 187 VUAAAA YMGAAA AAAAxx +9358 4393 0 2 8 18 58 358 1358 4358 9358 116 117 YVAAAA ZMGAAA HHHHxx +7438 4394 0 2 8 18 38 438 1438 2438 7438 76 77 CAAAAA ANGAAA OOOOxx +941 4395 1 1 1 1 41 941 941 941 941 82 83 FKAAAA BNGAAA VVVVxx +4844 4396 0 0 4 4 44 844 844 4844 4844 88 89 IEAAAA CNGAAA AAAAxx +4745 4397 1 1 5 5 45 745 745 4745 4745 90 91 NAAAAA DNGAAA HHHHxx +1017 4398 1 1 7 17 17 17 1017 1017 1017 34 35 DNAAAA ENGAAA OOOOxx +327 4399 1 3 7 7 27 327 327 327 327 54 55 PMAAAA FNGAAA VVVVxx +3152 4400 0 0 2 12 52 152 1152 3152 3152 104 105 GRAAAA GNGAAA AAAAxx +4711 4401 1 3 1 11 11 711 711 4711 4711 22 23 FZAAAA HNGAAA HHHHxx +141 4402 1 1 1 1 41 141 141 141 141 82 83 LFAAAA INGAAA OOOOxx +1303 4403 1 3 3 3 3 303 1303 1303 1303 6 7 DYAAAA JNGAAA VVVVxx +8873 4404 1 1 3 13 73 873 873 3873 8873 146 147 HDAAAA KNGAAA AAAAxx +8481 4405 1 1 1 1 81 481 481 3481 8481 162 163 FOAAAA LNGAAA HHHHxx +5445 4406 1 1 5 5 45 445 1445 445 5445 90 91 LBAAAA MNGAAA OOOOxx +7868 4407 0 0 8 8 68 868 1868 2868 7868 136 137 QQAAAA NNGAAA VVVVxx +6722 4408 0 2 2 2 22 722 722 1722 6722 44 45 OYAAAA ONGAAA AAAAxx +6628 4409 0 0 8 8 28 628 628 1628 6628 56 57 YUAAAA PNGAAA HHHHxx +7738 4410 0 2 8 18 38 738 1738 2738 7738 76 77 QLAAAA QNGAAA OOOOxx +1018 4411 0 2 8 18 18 18 1018 1018 1018 36 37 ENAAAA RNGAAA VVVVxx +3296 4412 0 0 6 16 96 296 1296 3296 3296 192 193 UWAAAA SNGAAA AAAAxx +1946 4413 0 2 6 6 46 946 1946 1946 1946 92 93 WWAAAA TNGAAA HHHHxx +6603 4414 1 3 3 3 3 603 603 1603 6603 6 7 ZTAAAA UNGAAA OOOOxx +3562 4415 0 2 2 2 62 562 1562 3562 3562 124 125 AHAAAA VNGAAA VVVVxx +1147 4416 1 3 7 7 47 147 1147 1147 1147 94 95 DSAAAA WNGAAA AAAAxx +6031 4417 1 3 1 11 31 31 31 1031 6031 62 63 ZXAAAA XNGAAA HHHHxx +6484 4418 0 0 4 4 84 484 484 1484 6484 168 169 KPAAAA YNGAAA OOOOxx +496 4419 0 0 6 16 96 496 496 496 496 192 193 CTAAAA ZNGAAA VVVVxx +4563 4420 1 3 3 3 63 563 563 4563 4563 126 127 NTAAAA AOGAAA AAAAxx +1037 4421 1 1 7 17 37 37 1037 1037 1037 74 75 XNAAAA BOGAAA HHHHxx +9672 4422 0 0 2 12 72 672 1672 4672 9672 144 145 AIAAAA COGAAA OOOOxx +9053 4423 1 1 3 13 53 53 1053 4053 9053 106 107 FKAAAA DOGAAA VVVVxx +2523 4424 1 3 3 3 23 523 523 2523 2523 46 47 BTAAAA EOGAAA AAAAxx +8519 4425 1 3 9 19 19 519 519 3519 8519 38 39 RPAAAA FOGAAA HHHHxx +8190 4426 0 2 0 10 90 190 190 3190 8190 180 181 ADAAAA GOGAAA OOOOxx +2068 4427 0 0 8 8 68 68 68 2068 2068 136 137 OBAAAA HOGAAA VVVVxx +8569 4428 1 1 9 9 69 569 569 3569 8569 138 139 PRAAAA IOGAAA AAAAxx +6535 4429 1 3 5 15 35 535 535 1535 6535 70 71 JRAAAA JOGAAA HHHHxx +1810 4430 0 2 0 10 10 810 1810 1810 1810 20 21 QRAAAA KOGAAA OOOOxx +3099 4431 1 3 9 19 99 99 1099 3099 3099 198 199 FPAAAA LOGAAA VVVVxx +7466 4432 0 2 6 6 66 466 1466 2466 7466 132 133 EBAAAA MOGAAA AAAAxx +4017 4433 1 1 7 17 17 17 17 4017 4017 34 35 NYAAAA NOGAAA HHHHxx +1097 4434 1 1 7 17 97 97 1097 1097 1097 194 195 FQAAAA OOGAAA OOOOxx +7686 4435 0 2 6 6 86 686 1686 2686 7686 172 173 QJAAAA POGAAA VVVVxx +6742 4436 0 2 2 2 42 742 742 1742 6742 84 85 IZAAAA QOGAAA AAAAxx +5966 4437 0 2 6 6 66 966 1966 966 5966 132 133 MVAAAA ROGAAA HHHHxx +3632 4438 0 0 2 12 32 632 1632 3632 3632 64 65 SJAAAA SOGAAA OOOOxx +8837 4439 1 1 7 17 37 837 837 3837 8837 74 75 XBAAAA TOGAAA VVVVxx +1667 4440 1 3 7 7 67 667 1667 1667 1667 134 135 DMAAAA UOGAAA AAAAxx +8833 4441 1 1 3 13 33 833 833 3833 8833 66 67 TBAAAA VOGAAA HHHHxx +9805 4442 1 1 5 5 5 805 1805 4805 9805 10 11 DNAAAA WOGAAA OOOOxx +3650 4443 0 2 0 10 50 650 1650 3650 3650 100 101 KKAAAA XOGAAA VVVVxx +2237 4444 1 1 7 17 37 237 237 2237 2237 74 75 BIAAAA YOGAAA AAAAxx +9980 4445 0 0 0 0 80 980 1980 4980 9980 160 161 WTAAAA ZOGAAA HHHHxx +2861 4446 1 1 1 1 61 861 861 2861 2861 122 123 BGAAAA APGAAA OOOOxx +1334 4447 0 2 4 14 34 334 1334 1334 1334 68 69 IZAAAA BPGAAA VVVVxx +842 4448 0 2 2 2 42 842 842 842 842 84 85 KGAAAA CPGAAA AAAAxx +1116 4449 0 0 6 16 16 116 1116 1116 1116 32 33 YQAAAA DPGAAA HHHHxx +4055 4450 1 3 5 15 55 55 55 4055 4055 110 111 ZZAAAA EPGAAA OOOOxx +3842 4451 0 2 2 2 42 842 1842 3842 3842 84 85 URAAAA FPGAAA VVVVxx +1886 4452 0 2 6 6 86 886 1886 1886 1886 172 173 OUAAAA GPGAAA AAAAxx +8589 4453 1 1 9 9 89 589 589 3589 8589 178 179 JSAAAA HPGAAA HHHHxx +5873 4454 1 1 3 13 73 873 1873 873 5873 146 147 XRAAAA IPGAAA OOOOxx +7711 4455 1 3 1 11 11 711 1711 2711 7711 22 23 PKAAAA JPGAAA VVVVxx +911 4456 1 3 1 11 11 911 911 911 911 22 23 BJAAAA KPGAAA AAAAxx +5837 4457 1 1 7 17 37 837 1837 837 5837 74 75 NQAAAA LPGAAA HHHHxx +897 4458 1 1 7 17 97 897 897 897 897 194 195 NIAAAA MPGAAA OOOOxx +4299 4459 1 3 9 19 99 299 299 4299 4299 198 199 JJAAAA NPGAAA VVVVxx +7774 4460 0 2 4 14 74 774 1774 2774 7774 148 149 ANAAAA OPGAAA AAAAxx +7832 4461 0 0 2 12 32 832 1832 2832 7832 64 65 GPAAAA PPGAAA HHHHxx +9915 4462 1 3 5 15 15 915 1915 4915 9915 30 31 JRAAAA QPGAAA OOOOxx +9 4463 1 1 9 9 9 9 9 9 9 18 19 JAAAAA RPGAAA VVVVxx +9675 4464 1 3 5 15 75 675 1675 4675 9675 150 151 DIAAAA SPGAAA AAAAxx +7953 4465 1 1 3 13 53 953 1953 2953 7953 106 107 XTAAAA TPGAAA HHHHxx +8912 4466 0 0 2 12 12 912 912 3912 8912 24 25 UEAAAA UPGAAA OOOOxx +4188 4467 0 0 8 8 88 188 188 4188 4188 176 177 CFAAAA VPGAAA VVVVxx +8446 4468 0 2 6 6 46 446 446 3446 8446 92 93 WMAAAA WPGAAA AAAAxx +1600 4469 0 0 0 0 0 600 1600 1600 1600 0 1 OJAAAA XPGAAA HHHHxx +43 4470 1 3 3 3 43 43 43 43 43 86 87 RBAAAA YPGAAA OOOOxx +544 4471 0 0 4 4 44 544 544 544 544 88 89 YUAAAA ZPGAAA VVVVxx +6977 4472 1 1 7 17 77 977 977 1977 6977 154 155 JIAAAA AQGAAA AAAAxx +3191 4473 1 3 1 11 91 191 1191 3191 3191 182 183 TSAAAA BQGAAA HHHHxx +418 4474 0 2 8 18 18 418 418 418 418 36 37 CQAAAA CQGAAA OOOOxx +3142 4475 0 2 2 2 42 142 1142 3142 3142 84 85 WQAAAA DQGAAA VVVVxx +5042 4476 0 2 2 2 42 42 1042 42 5042 84 85 YLAAAA EQGAAA AAAAxx +2194 4477 0 2 4 14 94 194 194 2194 2194 188 189 KGAAAA FQGAAA HHHHxx +2397 4478 1 1 7 17 97 397 397 2397 2397 194 195 FOAAAA GQGAAA OOOOxx +4684 4479 0 0 4 4 84 684 684 4684 4684 168 169 EYAAAA HQGAAA VVVVxx +34 4480 0 2 4 14 34 34 34 34 34 68 69 IBAAAA IQGAAA AAAAxx +3844 4481 0 0 4 4 44 844 1844 3844 3844 88 89 WRAAAA JQGAAA HHHHxx +7824 4482 0 0 4 4 24 824 1824 2824 7824 48 49 YOAAAA KQGAAA OOOOxx +6177 4483 1 1 7 17 77 177 177 1177 6177 154 155 PDAAAA LQGAAA VVVVxx +9657 4484 1 1 7 17 57 657 1657 4657 9657 114 115 LHAAAA MQGAAA AAAAxx +4546 4485 0 2 6 6 46 546 546 4546 4546 92 93 WSAAAA NQGAAA HHHHxx +599 4486 1 3 9 19 99 599 599 599 599 198 199 BXAAAA OQGAAA OOOOxx +153 4487 1 1 3 13 53 153 153 153 153 106 107 XFAAAA PQGAAA VVVVxx +6910 4488 0 2 0 10 10 910 910 1910 6910 20 21 UFAAAA QQGAAA AAAAxx +4408 4489 0 0 8 8 8 408 408 4408 4408 16 17 ONAAAA RQGAAA HHHHxx +1164 4490 0 0 4 4 64 164 1164 1164 1164 128 129 USAAAA SQGAAA OOOOxx +6469 4491 1 1 9 9 69 469 469 1469 6469 138 139 VOAAAA TQGAAA VVVVxx +5996 4492 0 0 6 16 96 996 1996 996 5996 192 193 QWAAAA UQGAAA AAAAxx +2639 4493 1 3 9 19 39 639 639 2639 2639 78 79 NXAAAA VQGAAA HHHHxx +2678 4494 0 2 8 18 78 678 678 2678 2678 156 157 AZAAAA WQGAAA OOOOxx +8392 4495 0 0 2 12 92 392 392 3392 8392 184 185 UKAAAA XQGAAA VVVVxx +1386 4496 0 2 6 6 86 386 1386 1386 1386 172 173 IBAAAA YQGAAA AAAAxx +5125 4497 1 1 5 5 25 125 1125 125 5125 50 51 DPAAAA ZQGAAA HHHHxx +8453 4498 1 1 3 13 53 453 453 3453 8453 106 107 DNAAAA ARGAAA OOOOxx +2369 4499 1 1 9 9 69 369 369 2369 2369 138 139 DNAAAA BRGAAA VVVVxx +1608 4500 0 0 8 8 8 608 1608 1608 1608 16 17 WJAAAA CRGAAA AAAAxx +3781 4501 1 1 1 1 81 781 1781 3781 3781 162 163 LPAAAA DRGAAA HHHHxx +903 4502 1 3 3 3 3 903 903 903 903 6 7 TIAAAA ERGAAA OOOOxx +2099 4503 1 3 9 19 99 99 99 2099 2099 198 199 TCAAAA FRGAAA VVVVxx +538 4504 0 2 8 18 38 538 538 538 538 76 77 SUAAAA GRGAAA AAAAxx +9177 4505 1 1 7 17 77 177 1177 4177 9177 154 155 ZOAAAA HRGAAA HHHHxx +420 4506 0 0 0 0 20 420 420 420 420 40 41 EQAAAA IRGAAA OOOOxx +9080 4507 0 0 0 0 80 80 1080 4080 9080 160 161 GLAAAA JRGAAA VVVVxx +2630 4508 0 2 0 10 30 630 630 2630 2630 60 61 EXAAAA KRGAAA AAAAxx +5978 4509 0 2 8 18 78 978 1978 978 5978 156 157 YVAAAA LRGAAA HHHHxx +9239 4510 1 3 9 19 39 239 1239 4239 9239 78 79 JRAAAA MRGAAA OOOOxx +4372 4511 0 0 2 12 72 372 372 4372 4372 144 145 EMAAAA NRGAAA VVVVxx +4357 4512 1 1 7 17 57 357 357 4357 4357 114 115 PLAAAA ORGAAA AAAAxx +9857 4513 1 1 7 17 57 857 1857 4857 9857 114 115 DPAAAA PRGAAA HHHHxx +7933 4514 1 1 3 13 33 933 1933 2933 7933 66 67 DTAAAA QRGAAA OOOOxx +9574 4515 0 2 4 14 74 574 1574 4574 9574 148 149 GEAAAA RRGAAA VVVVxx +8294 4516 0 2 4 14 94 294 294 3294 8294 188 189 AHAAAA SRGAAA AAAAxx +627 4517 1 3 7 7 27 627 627 627 627 54 55 DYAAAA TRGAAA HHHHxx +3229 4518 1 1 9 9 29 229 1229 3229 3229 58 59 FUAAAA URGAAA OOOOxx +3163 4519 1 3 3 3 63 163 1163 3163 3163 126 127 RRAAAA VRGAAA VVVVxx +7349 4520 1 1 9 9 49 349 1349 2349 7349 98 99 RWAAAA WRGAAA AAAAxx +6889 4521 1 1 9 9 89 889 889 1889 6889 178 179 ZEAAAA XRGAAA HHHHxx +2101 4522 1 1 1 1 1 101 101 2101 2101 2 3 VCAAAA YRGAAA OOOOxx +6476 4523 0 0 6 16 76 476 476 1476 6476 152 153 CPAAAA ZRGAAA VVVVxx +6765 4524 1 1 5 5 65 765 765 1765 6765 130 131 FAAAAA ASGAAA AAAAxx +4204 4525 0 0 4 4 4 204 204 4204 4204 8 9 SFAAAA BSGAAA HHHHxx +5915 4526 1 3 5 15 15 915 1915 915 5915 30 31 NTAAAA CSGAAA OOOOxx +2318 4527 0 2 8 18 18 318 318 2318 2318 36 37 ELAAAA DSGAAA VVVVxx +294 4528 0 2 4 14 94 294 294 294 294 188 189 ILAAAA ESGAAA AAAAxx +5245 4529 1 1 5 5 45 245 1245 245 5245 90 91 TTAAAA FSGAAA HHHHxx +4481 4530 1 1 1 1 81 481 481 4481 4481 162 163 JQAAAA GSGAAA OOOOxx +7754 4531 0 2 4 14 54 754 1754 2754 7754 108 109 GMAAAA HSGAAA VVVVxx +8494 4532 0 2 4 14 94 494 494 3494 8494 188 189 SOAAAA ISGAAA AAAAxx +4014 4533 0 2 4 14 14 14 14 4014 4014 28 29 KYAAAA JSGAAA HHHHxx +2197 4534 1 1 7 17 97 197 197 2197 2197 194 195 NGAAAA KSGAAA OOOOxx +1297 4535 1 1 7 17 97 297 1297 1297 1297 194 195 XXAAAA LSGAAA VVVVxx +1066 4536 0 2 6 6 66 66 1066 1066 1066 132 133 APAAAA MSGAAA AAAAxx +5710 4537 0 2 0 10 10 710 1710 710 5710 20 21 QLAAAA NSGAAA HHHHxx +4100 4538 0 0 0 0 0 100 100 4100 4100 0 1 SBAAAA OSGAAA OOOOxx +7356 4539 0 0 6 16 56 356 1356 2356 7356 112 113 YWAAAA PSGAAA VVVVxx +7658 4540 0 2 8 18 58 658 1658 2658 7658 116 117 OIAAAA QSGAAA AAAAxx +3666 4541 0 2 6 6 66 666 1666 3666 3666 132 133 ALAAAA RSGAAA HHHHxx +9713 4542 1 1 3 13 13 713 1713 4713 9713 26 27 PJAAAA SSGAAA OOOOxx +691 4543 1 3 1 11 91 691 691 691 691 182 183 PAAAAA TSGAAA VVVVxx +3112 4544 0 0 2 12 12 112 1112 3112 3112 24 25 SPAAAA USGAAA AAAAxx +6035 4545 1 3 5 15 35 35 35 1035 6035 70 71 DYAAAA VSGAAA HHHHxx +8353 4546 1 1 3 13 53 353 353 3353 8353 106 107 HJAAAA WSGAAA OOOOxx +5679 4547 1 3 9 19 79 679 1679 679 5679 158 159 LKAAAA XSGAAA VVVVxx +2124 4548 0 0 4 4 24 124 124 2124 2124 48 49 SDAAAA YSGAAA AAAAxx +4714 4549 0 2 4 14 14 714 714 4714 4714 28 29 IZAAAA ZSGAAA HHHHxx +9048 4550 0 0 8 8 48 48 1048 4048 9048 96 97 AKAAAA ATGAAA OOOOxx +7692 4551 0 0 2 12 92 692 1692 2692 7692 184 185 WJAAAA BTGAAA VVVVxx +4542 4552 0 2 2 2 42 542 542 4542 4542 84 85 SSAAAA CTGAAA AAAAxx +8737 4553 1 1 7 17 37 737 737 3737 8737 74 75 BYAAAA DTGAAA HHHHxx +4977 4554 1 1 7 17 77 977 977 4977 4977 154 155 LJAAAA ETGAAA OOOOxx +9349 4555 1 1 9 9 49 349 1349 4349 9349 98 99 PVAAAA FTGAAA VVVVxx +731 4556 1 3 1 11 31 731 731 731 731 62 63 DCAAAA GTGAAA AAAAxx +1788 4557 0 0 8 8 88 788 1788 1788 1788 176 177 UQAAAA HTGAAA HHHHxx +7830 4558 0 2 0 10 30 830 1830 2830 7830 60 61 EPAAAA ITGAAA OOOOxx +3977 4559 1 1 7 17 77 977 1977 3977 3977 154 155 ZWAAAA JTGAAA VVVVxx +2421 4560 1 1 1 1 21 421 421 2421 2421 42 43 DPAAAA KTGAAA AAAAxx +5891 4561 1 3 1 11 91 891 1891 891 5891 182 183 PSAAAA LTGAAA HHHHxx +1111 4562 1 3 1 11 11 111 1111 1111 1111 22 23 TQAAAA MTGAAA OOOOxx +9224 4563 0 0 4 4 24 224 1224 4224 9224 48 49 UQAAAA NTGAAA VVVVxx +9872 4564 0 0 2 12 72 872 1872 4872 9872 144 145 SPAAAA OTGAAA AAAAxx +2433 4565 1 1 3 13 33 433 433 2433 2433 66 67 PPAAAA PTGAAA HHHHxx +1491 4566 1 3 1 11 91 491 1491 1491 1491 182 183 JFAAAA QTGAAA OOOOxx +6653 4567 1 1 3 13 53 653 653 1653 6653 106 107 XVAAAA RTGAAA VVVVxx +1907 4568 1 3 7 7 7 907 1907 1907 1907 14 15 JVAAAA STGAAA AAAAxx +889 4569 1 1 9 9 89 889 889 889 889 178 179 FIAAAA TTGAAA HHHHxx +561 4570 1 1 1 1 61 561 561 561 561 122 123 PVAAAA UTGAAA OOOOxx +7415 4571 1 3 5 15 15 415 1415 2415 7415 30 31 FZAAAA VTGAAA VVVVxx +2703 4572 1 3 3 3 3 703 703 2703 2703 6 7 ZZAAAA WTGAAA AAAAxx +2561 4573 1 1 1 1 61 561 561 2561 2561 122 123 NUAAAA XTGAAA HHHHxx +1257 4574 1 1 7 17 57 257 1257 1257 1257 114 115 JWAAAA YTGAAA OOOOxx +2390 4575 0 2 0 10 90 390 390 2390 2390 180 181 YNAAAA ZTGAAA VVVVxx +3915 4576 1 3 5 15 15 915 1915 3915 3915 30 31 PUAAAA AUGAAA AAAAxx +8476 4577 0 0 6 16 76 476 476 3476 8476 152 153 AOAAAA BUGAAA HHHHxx +607 4578 1 3 7 7 7 607 607 607 607 14 15 JXAAAA CUGAAA OOOOxx +3891 4579 1 3 1 11 91 891 1891 3891 3891 182 183 RTAAAA DUGAAA VVVVxx +7269 4580 1 1 9 9 69 269 1269 2269 7269 138 139 PTAAAA EUGAAA AAAAxx +9537 4581 1 1 7 17 37 537 1537 4537 9537 74 75 VCAAAA FUGAAA HHHHxx +8518 4582 0 2 8 18 18 518 518 3518 8518 36 37 QPAAAA GUGAAA OOOOxx +5221 4583 1 1 1 1 21 221 1221 221 5221 42 43 VSAAAA HUGAAA VVVVxx +3274 4584 0 2 4 14 74 274 1274 3274 3274 148 149 YVAAAA IUGAAA AAAAxx +6677 4585 1 1 7 17 77 677 677 1677 6677 154 155 VWAAAA JUGAAA HHHHxx +3114 4586 0 2 4 14 14 114 1114 3114 3114 28 29 UPAAAA KUGAAA OOOOxx +1966 4587 0 2 6 6 66 966 1966 1966 1966 132 133 QXAAAA LUGAAA VVVVxx +5941 4588 1 1 1 1 41 941 1941 941 5941 82 83 NUAAAA MUGAAA AAAAxx +9463 4589 1 3 3 3 63 463 1463 4463 9463 126 127 ZZAAAA NUGAAA HHHHxx +8966 4590 0 2 6 6 66 966 966 3966 8966 132 133 WGAAAA OUGAAA OOOOxx +4402 4591 0 2 2 2 2 402 402 4402 4402 4 5 INAAAA PUGAAA VVVVxx +3364 4592 0 0 4 4 64 364 1364 3364 3364 128 129 KZAAAA QUGAAA AAAAxx +3698 4593 0 2 8 18 98 698 1698 3698 3698 196 197 GMAAAA RUGAAA HHHHxx +4651 4594 1 3 1 11 51 651 651 4651 4651 102 103 XWAAAA SUGAAA OOOOxx +2127 4595 1 3 7 7 27 127 127 2127 2127 54 55 VDAAAA TUGAAA VVVVxx +3614 4596 0 2 4 14 14 614 1614 3614 3614 28 29 AJAAAA UUGAAA AAAAxx +5430 4597 0 2 0 10 30 430 1430 430 5430 60 61 WAAAAA VUGAAA HHHHxx +3361 4598 1 1 1 1 61 361 1361 3361 3361 122 123 HZAAAA WUGAAA OOOOxx +4798 4599 0 2 8 18 98 798 798 4798 4798 196 197 OCAAAA XUGAAA VVVVxx +8269 4600 1 1 9 9 69 269 269 3269 8269 138 139 BGAAAA YUGAAA AAAAxx +6458 4601 0 2 8 18 58 458 458 1458 6458 116 117 KOAAAA ZUGAAA HHHHxx +3358 4602 0 2 8 18 58 358 1358 3358 3358 116 117 EZAAAA AVGAAA OOOOxx +5898 4603 0 2 8 18 98 898 1898 898 5898 196 197 WSAAAA BVGAAA VVVVxx +1880 4604 0 0 0 0 80 880 1880 1880 1880 160 161 IUAAAA CVGAAA AAAAxx +782 4605 0 2 2 2 82 782 782 782 782 164 165 CEAAAA DVGAAA HHHHxx +3102 4606 0 2 2 2 2 102 1102 3102 3102 4 5 IPAAAA EVGAAA OOOOxx +6366 4607 0 2 6 6 66 366 366 1366 6366 132 133 WKAAAA FVGAAA VVVVxx +399 4608 1 3 9 19 99 399 399 399 399 198 199 JPAAAA GVGAAA AAAAxx +6773 4609 1 1 3 13 73 773 773 1773 6773 146 147 NAAAAA HVGAAA HHHHxx +7942 4610 0 2 2 2 42 942 1942 2942 7942 84 85 MTAAAA IVGAAA OOOOxx +6274 4611 0 2 4 14 74 274 274 1274 6274 148 149 IHAAAA JVGAAA VVVVxx +7447 4612 1 3 7 7 47 447 1447 2447 7447 94 95 LAAAAA KVGAAA AAAAxx +7648 4613 0 0 8 8 48 648 1648 2648 7648 96 97 EIAAAA LVGAAA HHHHxx +3997 4614 1 1 7 17 97 997 1997 3997 3997 194 195 TXAAAA MVGAAA OOOOxx +1759 4615 1 3 9 19 59 759 1759 1759 1759 118 119 RPAAAA NVGAAA VVVVxx +1785 4616 1 1 5 5 85 785 1785 1785 1785 170 171 RQAAAA OVGAAA AAAAxx +8930 4617 0 2 0 10 30 930 930 3930 8930 60 61 MFAAAA PVGAAA HHHHxx +7595 4618 1 3 5 15 95 595 1595 2595 7595 190 191 DGAAAA QVGAAA OOOOxx +6752 4619 0 0 2 12 52 752 752 1752 6752 104 105 SZAAAA RVGAAA VVVVxx +5635 4620 1 3 5 15 35 635 1635 635 5635 70 71 TIAAAA SVGAAA AAAAxx +1579 4621 1 3 9 19 79 579 1579 1579 1579 158 159 TIAAAA TVGAAA HHHHxx +7743 4622 1 3 3 3 43 743 1743 2743 7743 86 87 VLAAAA UVGAAA OOOOxx +5856 4623 0 0 6 16 56 856 1856 856 5856 112 113 GRAAAA VVGAAA VVVVxx +7273 4624 1 1 3 13 73 273 1273 2273 7273 146 147 TTAAAA WVGAAA AAAAxx +1399 4625 1 3 9 19 99 399 1399 1399 1399 198 199 VBAAAA XVGAAA HHHHxx +3694 4626 0 2 4 14 94 694 1694 3694 3694 188 189 CMAAAA YVGAAA OOOOxx +2782 4627 0 2 2 2 82 782 782 2782 2782 164 165 ADAAAA ZVGAAA VVVVxx +6951 4628 1 3 1 11 51 951 951 1951 6951 102 103 JHAAAA AWGAAA AAAAxx +6053 4629 1 1 3 13 53 53 53 1053 6053 106 107 VYAAAA BWGAAA HHHHxx +1753 4630 1 1 3 13 53 753 1753 1753 1753 106 107 LPAAAA CWGAAA OOOOxx +3985 4631 1 1 5 5 85 985 1985 3985 3985 170 171 HXAAAA DWGAAA VVVVxx +6159 4632 1 3 9 19 59 159 159 1159 6159 118 119 XCAAAA EWGAAA AAAAxx +6250 4633 0 2 0 10 50 250 250 1250 6250 100 101 KGAAAA FWGAAA HHHHxx +6240 4634 0 0 0 0 40 240 240 1240 6240 80 81 AGAAAA GWGAAA OOOOxx +6571 4635 1 3 1 11 71 571 571 1571 6571 142 143 TSAAAA HWGAAA VVVVxx +8624 4636 0 0 4 4 24 624 624 3624 8624 48 49 STAAAA IWGAAA AAAAxx +9718 4637 0 2 8 18 18 718 1718 4718 9718 36 37 UJAAAA JWGAAA HHHHxx +5529 4638 1 1 9 9 29 529 1529 529 5529 58 59 REAAAA KWGAAA OOOOxx +7089 4639 1 1 9 9 89 89 1089 2089 7089 178 179 RMAAAA LWGAAA VVVVxx +5488 4640 0 0 8 8 88 488 1488 488 5488 176 177 CDAAAA MWGAAA AAAAxx +5444 4641 0 0 4 4 44 444 1444 444 5444 88 89 KBAAAA NWGAAA HHHHxx +4899 4642 1 3 9 19 99 899 899 4899 4899 198 199 LGAAAA OWGAAA OOOOxx +7928 4643 0 0 8 8 28 928 1928 2928 7928 56 57 YSAAAA PWGAAA VVVVxx +4736 4644 0 0 6 16 36 736 736 4736 4736 72 73 EAAAAA QWGAAA AAAAxx +4317 4645 1 1 7 17 17 317 317 4317 4317 34 35 BKAAAA RWGAAA HHHHxx +1174 4646 0 2 4 14 74 174 1174 1174 1174 148 149 ETAAAA SWGAAA OOOOxx +6138 4647 0 2 8 18 38 138 138 1138 6138 76 77 CCAAAA TWGAAA VVVVxx +3943 4648 1 3 3 3 43 943 1943 3943 3943 86 87 RVAAAA UWGAAA AAAAxx +1545 4649 1 1 5 5 45 545 1545 1545 1545 90 91 LHAAAA VWGAAA HHHHxx +6867 4650 1 3 7 7 67 867 867 1867 6867 134 135 DEAAAA WWGAAA OOOOxx +6832 4651 0 0 2 12 32 832 832 1832 6832 64 65 UCAAAA XWGAAA VVVVxx +2987 4652 1 3 7 7 87 987 987 2987 2987 174 175 XKAAAA YWGAAA AAAAxx +5169 4653 1 1 9 9 69 169 1169 169 5169 138 139 VQAAAA ZWGAAA HHHHxx +8998 4654 0 2 8 18 98 998 998 3998 8998 196 197 CIAAAA AXGAAA OOOOxx +9347 4655 1 3 7 7 47 347 1347 4347 9347 94 95 NVAAAA BXGAAA VVVVxx +4800 4656 0 0 0 0 0 800 800 4800 4800 0 1 QCAAAA CXGAAA AAAAxx +4200 4657 0 0 0 0 0 200 200 4200 4200 0 1 OFAAAA DXGAAA HHHHxx +4046 4658 0 2 6 6 46 46 46 4046 4046 92 93 QZAAAA EXGAAA OOOOxx +7142 4659 0 2 2 2 42 142 1142 2142 7142 84 85 SOAAAA FXGAAA VVVVxx +2733 4660 1 1 3 13 33 733 733 2733 2733 66 67 DBAAAA GXGAAA AAAAxx +1568 4661 0 0 8 8 68 568 1568 1568 1568 136 137 IIAAAA HXGAAA HHHHxx +5105 4662 1 1 5 5 5 105 1105 105 5105 10 11 JOAAAA IXGAAA OOOOxx +9115 4663 1 3 5 15 15 115 1115 4115 9115 30 31 PMAAAA JXGAAA VVVVxx +6475 4664 1 3 5 15 75 475 475 1475 6475 150 151 BPAAAA KXGAAA AAAAxx +3796 4665 0 0 6 16 96 796 1796 3796 3796 192 193 AQAAAA LXGAAA HHHHxx +5410 4666 0 2 0 10 10 410 1410 410 5410 20 21 CAAAAA MXGAAA OOOOxx +4023 4667 1 3 3 3 23 23 23 4023 4023 46 47 TYAAAA NXGAAA VVVVxx +8904 4668 0 0 4 4 4 904 904 3904 8904 8 9 MEAAAA OXGAAA AAAAxx +450 4669 0 2 0 10 50 450 450 450 450 100 101 IRAAAA PXGAAA HHHHxx +8087 4670 1 3 7 7 87 87 87 3087 8087 174 175 BZAAAA QXGAAA OOOOxx +6478 4671 0 2 8 18 78 478 478 1478 6478 156 157 EPAAAA RXGAAA VVVVxx +2696 4672 0 0 6 16 96 696 696 2696 2696 192 193 SZAAAA SXGAAA AAAAxx +1792 4673 0 0 2 12 92 792 1792 1792 1792 184 185 YQAAAA TXGAAA HHHHxx +9699 4674 1 3 9 19 99 699 1699 4699 9699 198 199 BJAAAA UXGAAA OOOOxx +9160 4675 0 0 0 0 60 160 1160 4160 9160 120 121 IOAAAA VXGAAA VVVVxx +9989 4676 1 1 9 9 89 989 1989 4989 9989 178 179 FUAAAA WXGAAA AAAAxx +9568 4677 0 0 8 8 68 568 1568 4568 9568 136 137 AEAAAA XXGAAA HHHHxx +487 4678 1 3 7 7 87 487 487 487 487 174 175 TSAAAA YXGAAA OOOOxx +7863 4679 1 3 3 3 63 863 1863 2863 7863 126 127 LQAAAA ZXGAAA VVVVxx +1884 4680 0 0 4 4 84 884 1884 1884 1884 168 169 MUAAAA AYGAAA AAAAxx +2651 4681 1 3 1 11 51 651 651 2651 2651 102 103 ZXAAAA BYGAAA HHHHxx +8285 4682 1 1 5 5 85 285 285 3285 8285 170 171 RGAAAA CYGAAA OOOOxx +3927 4683 1 3 7 7 27 927 1927 3927 3927 54 55 BVAAAA DYGAAA VVVVxx +4076 4684 0 0 6 16 76 76 76 4076 4076 152 153 UAAAAA EYGAAA AAAAxx +6149 4685 1 1 9 9 49 149 149 1149 6149 98 99 NCAAAA FYGAAA HHHHxx +6581 4686 1 1 1 1 81 581 581 1581 6581 162 163 DTAAAA GYGAAA OOOOxx +8293 4687 1 1 3 13 93 293 293 3293 8293 186 187 ZGAAAA HYGAAA VVVVxx +7665 4688 1 1 5 5 65 665 1665 2665 7665 130 131 VIAAAA IYGAAA AAAAxx +4435 4689 1 3 5 15 35 435 435 4435 4435 70 71 POAAAA JYGAAA HHHHxx +1271 4690 1 3 1 11 71 271 1271 1271 1271 142 143 XWAAAA KYGAAA OOOOxx +3928 4691 0 0 8 8 28 928 1928 3928 3928 56 57 CVAAAA LYGAAA VVVVxx +7045 4692 1 1 5 5 45 45 1045 2045 7045 90 91 ZKAAAA MYGAAA AAAAxx +4943 4693 1 3 3 3 43 943 943 4943 4943 86 87 DIAAAA NYGAAA HHHHxx +8473 4694 1 1 3 13 73 473 473 3473 8473 146 147 XNAAAA OYGAAA OOOOxx +1707 4695 1 3 7 7 7 707 1707 1707 1707 14 15 RNAAAA PYGAAA VVVVxx +7509 4696 1 1 9 9 9 509 1509 2509 7509 18 19 VCAAAA QYGAAA AAAAxx +1593 4697 1 1 3 13 93 593 1593 1593 1593 186 187 HJAAAA RYGAAA HHHHxx +9281 4698 1 1 1 1 81 281 1281 4281 9281 162 163 ZSAAAA SYGAAA OOOOxx +8986 4699 0 2 6 6 86 986 986 3986 8986 172 173 QHAAAA TYGAAA VVVVxx +3740 4700 0 0 0 0 40 740 1740 3740 3740 80 81 WNAAAA UYGAAA AAAAxx +9265 4701 1 1 5 5 65 265 1265 4265 9265 130 131 JSAAAA VYGAAA HHHHxx +1510 4702 0 2 0 10 10 510 1510 1510 1510 20 21 CGAAAA WYGAAA OOOOxx +3022 4703 0 2 2 2 22 22 1022 3022 3022 44 45 GMAAAA XYGAAA VVVVxx +9014 4704 0 2 4 14 14 14 1014 4014 9014 28 29 SIAAAA YYGAAA AAAAxx +6816 4705 0 0 6 16 16 816 816 1816 6816 32 33 ECAAAA ZYGAAA HHHHxx +5518 4706 0 2 8 18 18 518 1518 518 5518 36 37 GEAAAA AZGAAA OOOOxx +4451 4707 1 3 1 11 51 451 451 4451 4451 102 103 FPAAAA BZGAAA VVVVxx +8747 4708 1 3 7 7 47 747 747 3747 8747 94 95 LYAAAA CZGAAA AAAAxx +4646 4709 0 2 6 6 46 646 646 4646 4646 92 93 SWAAAA DZGAAA HHHHxx +7296 4710 0 0 6 16 96 296 1296 2296 7296 192 193 QUAAAA EZGAAA OOOOxx +9644 4711 0 0 4 4 44 644 1644 4644 9644 88 89 YGAAAA FZGAAA VVVVxx +5977 4712 1 1 7 17 77 977 1977 977 5977 154 155 XVAAAA GZGAAA AAAAxx +6270 4713 0 2 0 10 70 270 270 1270 6270 140 141 EHAAAA HZGAAA HHHHxx +5578 4714 0 2 8 18 78 578 1578 578 5578 156 157 OGAAAA IZGAAA OOOOxx +2465 4715 1 1 5 5 65 465 465 2465 2465 130 131 VQAAAA JZGAAA VVVVxx +6436 4716 0 0 6 16 36 436 436 1436 6436 72 73 ONAAAA KZGAAA AAAAxx +8089 4717 1 1 9 9 89 89 89 3089 8089 178 179 DZAAAA LZGAAA HHHHxx +2409 4718 1 1 9 9 9 409 409 2409 2409 18 19 ROAAAA MZGAAA OOOOxx +284 4719 0 0 4 4 84 284 284 284 284 168 169 YKAAAA NZGAAA VVVVxx +5576 4720 0 0 6 16 76 576 1576 576 5576 152 153 MGAAAA OZGAAA AAAAxx +6534 4721 0 2 4 14 34 534 534 1534 6534 68 69 IRAAAA PZGAAA HHHHxx +8848 4722 0 0 8 8 48 848 848 3848 8848 96 97 ICAAAA QZGAAA OOOOxx +4305 4723 1 1 5 5 5 305 305 4305 4305 10 11 PJAAAA RZGAAA VVVVxx +5574 4724 0 2 4 14 74 574 1574 574 5574 148 149 KGAAAA SZGAAA AAAAxx +596 4725 0 0 6 16 96 596 596 596 596 192 193 YWAAAA TZGAAA HHHHxx +1253 4726 1 1 3 13 53 253 1253 1253 1253 106 107 FWAAAA UZGAAA OOOOxx +521 4727 1 1 1 1 21 521 521 521 521 42 43 BUAAAA VZGAAA VVVVxx +8739 4728 1 3 9 19 39 739 739 3739 8739 78 79 DYAAAA WZGAAA AAAAxx +908 4729 0 0 8 8 8 908 908 908 908 16 17 YIAAAA XZGAAA HHHHxx +6937 4730 1 1 7 17 37 937 937 1937 6937 74 75 VGAAAA YZGAAA OOOOxx +4515 4731 1 3 5 15 15 515 515 4515 4515 30 31 RRAAAA ZZGAAA VVVVxx +8630 4732 0 2 0 10 30 630 630 3630 8630 60 61 YTAAAA AAHAAA AAAAxx +7518 4733 0 2 8 18 18 518 1518 2518 7518 36 37 EDAAAA BAHAAA HHHHxx +8300 4734 0 0 0 0 0 300 300 3300 8300 0 1 GHAAAA CAHAAA OOOOxx +8434 4735 0 2 4 14 34 434 434 3434 8434 68 69 KMAAAA DAHAAA VVVVxx +6000 4736 0 0 0 0 0 0 0 1000 6000 0 1 UWAAAA EAHAAA AAAAxx +4508 4737 0 0 8 8 8 508 508 4508 4508 16 17 KRAAAA FAHAAA HHHHxx +7861 4738 1 1 1 1 61 861 1861 2861 7861 122 123 JQAAAA GAHAAA OOOOxx +5953 4739 1 1 3 13 53 953 1953 953 5953 106 107 ZUAAAA HAHAAA VVVVxx +5063 4740 1 3 3 3 63 63 1063 63 5063 126 127 TMAAAA IAHAAA AAAAxx +4501 4741 1 1 1 1 1 501 501 4501 4501 2 3 DRAAAA JAHAAA HHHHxx +7092 4742 0 0 2 12 92 92 1092 2092 7092 184 185 UMAAAA KAHAAA OOOOxx +4388 4743 0 0 8 8 88 388 388 4388 4388 176 177 UMAAAA LAHAAA VVVVxx +1826 4744 0 2 6 6 26 826 1826 1826 1826 52 53 GSAAAA MAHAAA AAAAxx +568 4745 0 0 8 8 68 568 568 568 568 136 137 WVAAAA NAHAAA HHHHxx +8184 4746 0 0 4 4 84 184 184 3184 8184 168 169 UCAAAA OAHAAA OOOOxx +4268 4747 0 0 8 8 68 268 268 4268 4268 136 137 EIAAAA PAHAAA VVVVxx +5798 4748 0 2 8 18 98 798 1798 798 5798 196 197 APAAAA QAHAAA AAAAxx +5190 4749 0 2 0 10 90 190 1190 190 5190 180 181 QRAAAA RAHAAA HHHHxx +1298 4750 0 2 8 18 98 298 1298 1298 1298 196 197 YXAAAA SAHAAA OOOOxx +4035 4751 1 3 5 15 35 35 35 4035 4035 70 71 FZAAAA TAHAAA VVVVxx +4504 4752 0 0 4 4 4 504 504 4504 4504 8 9 GRAAAA UAHAAA AAAAxx +5992 4753 0 0 2 12 92 992 1992 992 5992 184 185 MWAAAA VAHAAA HHHHxx +770 4754 0 2 0 10 70 770 770 770 770 140 141 QDAAAA WAHAAA OOOOxx +7502 4755 0 2 2 2 2 502 1502 2502 7502 4 5 OCAAAA XAHAAA VVVVxx +824 4756 0 0 4 4 24 824 824 824 824 48 49 SFAAAA YAHAAA AAAAxx +7716 4757 0 0 6 16 16 716 1716 2716 7716 32 33 UKAAAA ZAHAAA HHHHxx +5749 4758 1 1 9 9 49 749 1749 749 5749 98 99 DNAAAA ABHAAA OOOOxx +9814 4759 0 2 4 14 14 814 1814 4814 9814 28 29 MNAAAA BBHAAA VVVVxx +350 4760 0 2 0 10 50 350 350 350 350 100 101 MNAAAA CBHAAA AAAAxx +1390 4761 0 2 0 10 90 390 1390 1390 1390 180 181 MBAAAA DBHAAA HHHHxx +6994 4762 0 2 4 14 94 994 994 1994 6994 188 189 AJAAAA EBHAAA OOOOxx +3629 4763 1 1 9 9 29 629 1629 3629 3629 58 59 PJAAAA FBHAAA VVVVxx +9937 4764 1 1 7 17 37 937 1937 4937 9937 74 75 FSAAAA GBHAAA AAAAxx +5285 4765 1 1 5 5 85 285 1285 285 5285 170 171 HVAAAA HBHAAA HHHHxx +3157 4766 1 1 7 17 57 157 1157 3157 3157 114 115 LRAAAA IBHAAA OOOOxx +9549 4767 1 1 9 9 49 549 1549 4549 9549 98 99 HDAAAA JBHAAA VVVVxx +4118 4768 0 2 8 18 18 118 118 4118 4118 36 37 KCAAAA KBHAAA AAAAxx +756 4769 0 0 6 16 56 756 756 756 756 112 113 CDAAAA LBHAAA HHHHxx +5964 4770 0 0 4 4 64 964 1964 964 5964 128 129 KVAAAA MBHAAA OOOOxx +7701 4771 1 1 1 1 1 701 1701 2701 7701 2 3 FKAAAA NBHAAA VVVVxx +1242 4772 0 2 2 2 42 242 1242 1242 1242 84 85 UVAAAA OBHAAA AAAAxx +7890 4773 0 2 0 10 90 890 1890 2890 7890 180 181 MRAAAA PBHAAA HHHHxx +1991 4774 1 3 1 11 91 991 1991 1991 1991 182 183 PYAAAA QBHAAA OOOOxx +110 4775 0 2 0 10 10 110 110 110 110 20 21 GEAAAA RBHAAA VVVVxx +9334 4776 0 2 4 14 34 334 1334 4334 9334 68 69 AVAAAA SBHAAA AAAAxx +6231 4777 1 3 1 11 31 231 231 1231 6231 62 63 RFAAAA TBHAAA HHHHxx +9871 4778 1 3 1 11 71 871 1871 4871 9871 142 143 RPAAAA UBHAAA OOOOxx +9471 4779 1 3 1 11 71 471 1471 4471 9471 142 143 HAAAAA VBHAAA VVVVxx +2697 4780 1 1 7 17 97 697 697 2697 2697 194 195 TZAAAA WBHAAA AAAAxx +4761 4781 1 1 1 1 61 761 761 4761 4761 122 123 DBAAAA XBHAAA HHHHxx +8493 4782 1 1 3 13 93 493 493 3493 8493 186 187 ROAAAA YBHAAA OOOOxx +1045 4783 1 1 5 5 45 45 1045 1045 1045 90 91 FOAAAA ZBHAAA VVVVxx +3403 4784 1 3 3 3 3 403 1403 3403 3403 6 7 XAAAAA ACHAAA AAAAxx +9412 4785 0 0 2 12 12 412 1412 4412 9412 24 25 AYAAAA BCHAAA HHHHxx +7652 4786 0 0 2 12 52 652 1652 2652 7652 104 105 IIAAAA CCHAAA OOOOxx +5866 4787 0 2 6 6 66 866 1866 866 5866 132 133 QRAAAA DCHAAA VVVVxx +6942 4788 0 2 2 2 42 942 942 1942 6942 84 85 AHAAAA ECHAAA AAAAxx +9353 4789 1 1 3 13 53 353 1353 4353 9353 106 107 TVAAAA FCHAAA HHHHxx +2600 4790 0 0 0 0 0 600 600 2600 2600 0 1 AWAAAA GCHAAA OOOOxx +6971 4791 1 3 1 11 71 971 971 1971 6971 142 143 DIAAAA HCHAAA VVVVxx +5391 4792 1 3 1 11 91 391 1391 391 5391 182 183 JZAAAA ICHAAA AAAAxx +7654 4793 0 2 4 14 54 654 1654 2654 7654 108 109 KIAAAA JCHAAA HHHHxx +1797 4794 1 1 7 17 97 797 1797 1797 1797 194 195 DRAAAA KCHAAA OOOOxx +4530 4795 0 2 0 10 30 530 530 4530 4530 60 61 GSAAAA LCHAAA VVVVxx +3130 4796 0 2 0 10 30 130 1130 3130 3130 60 61 KQAAAA MCHAAA AAAAxx +9442 4797 0 2 2 2 42 442 1442 4442 9442 84 85 EZAAAA NCHAAA HHHHxx +6659 4798 1 3 9 19 59 659 659 1659 6659 118 119 DWAAAA OCHAAA OOOOxx +9714 4799 0 2 4 14 14 714 1714 4714 9714 28 29 QJAAAA PCHAAA VVVVxx +3660 4800 0 0 0 0 60 660 1660 3660 3660 120 121 UKAAAA QCHAAA AAAAxx +1906 4801 0 2 6 6 6 906 1906 1906 1906 12 13 IVAAAA RCHAAA HHHHxx +7927 4802 1 3 7 7 27 927 1927 2927 7927 54 55 XSAAAA SCHAAA OOOOxx +1767 4803 1 3 7 7 67 767 1767 1767 1767 134 135 ZPAAAA TCHAAA VVVVxx +5523 4804 1 3 3 3 23 523 1523 523 5523 46 47 LEAAAA UCHAAA AAAAxx +9289 4805 1 1 9 9 89 289 1289 4289 9289 178 179 HTAAAA VCHAAA HHHHxx +2717 4806 1 1 7 17 17 717 717 2717 2717 34 35 NAAAAA WCHAAA OOOOxx +4099 4807 1 3 9 19 99 99 99 4099 4099 198 199 RBAAAA XCHAAA VVVVxx +4387 4808 1 3 7 7 87 387 387 4387 4387 174 175 TMAAAA YCHAAA AAAAxx +8864 4809 0 0 4 4 64 864 864 3864 8864 128 129 YCAAAA ZCHAAA HHHHxx +1774 4810 0 2 4 14 74 774 1774 1774 1774 148 149 GQAAAA ADHAAA OOOOxx +6292 4811 0 0 2 12 92 292 292 1292 6292 184 185 AIAAAA BDHAAA VVVVxx +847 4812 1 3 7 7 47 847 847 847 847 94 95 PGAAAA CDHAAA AAAAxx +5954 4813 0 2 4 14 54 954 1954 954 5954 108 109 AVAAAA DDHAAA HHHHxx +8032 4814 0 0 2 12 32 32 32 3032 8032 64 65 YWAAAA EDHAAA OOOOxx +3295 4815 1 3 5 15 95 295 1295 3295 3295 190 191 TWAAAA FDHAAA VVVVxx +8984 4816 0 0 4 4 84 984 984 3984 8984 168 169 OHAAAA GDHAAA AAAAxx +7809 4817 1 1 9 9 9 809 1809 2809 7809 18 19 JOAAAA HDHAAA HHHHxx +1670 4818 0 2 0 10 70 670 1670 1670 1670 140 141 GMAAAA IDHAAA OOOOxx +7733 4819 1 1 3 13 33 733 1733 2733 7733 66 67 LLAAAA JDHAAA VVVVxx +6187 4820 1 3 7 7 87 187 187 1187 6187 174 175 ZDAAAA KDHAAA AAAAxx +9326 4821 0 2 6 6 26 326 1326 4326 9326 52 53 SUAAAA LDHAAA HHHHxx +2493 4822 1 1 3 13 93 493 493 2493 2493 186 187 XRAAAA MDHAAA OOOOxx +9512 4823 0 0 2 12 12 512 1512 4512 9512 24 25 WBAAAA NDHAAA VVVVxx +4342 4824 0 2 2 2 42 342 342 4342 4342 84 85 ALAAAA ODHAAA AAAAxx +5350 4825 0 2 0 10 50 350 1350 350 5350 100 101 UXAAAA PDHAAA HHHHxx +6009 4826 1 1 9 9 9 9 9 1009 6009 18 19 DXAAAA QDHAAA OOOOxx +1208 4827 0 0 8 8 8 208 1208 1208 1208 16 17 MUAAAA RDHAAA VVVVxx +7014 4828 0 2 4 14 14 14 1014 2014 7014 28 29 UJAAAA SDHAAA AAAAxx +2967 4829 1 3 7 7 67 967 967 2967 2967 134 135 DKAAAA TDHAAA HHHHxx +5831 4830 1 3 1 11 31 831 1831 831 5831 62 63 HQAAAA UDHAAA OOOOxx +3097 4831 1 1 7 17 97 97 1097 3097 3097 194 195 DPAAAA VDHAAA VVVVxx +1528 4832 0 0 8 8 28 528 1528 1528 1528 56 57 UGAAAA WDHAAA AAAAxx +6429 4833 1 1 9 9 29 429 429 1429 6429 58 59 HNAAAA XDHAAA HHHHxx +7320 4834 0 0 0 0 20 320 1320 2320 7320 40 41 OVAAAA YDHAAA OOOOxx +844 4835 0 0 4 4 44 844 844 844 844 88 89 MGAAAA ZDHAAA VVVVxx +7054 4836 0 2 4 14 54 54 1054 2054 7054 108 109 ILAAAA AEHAAA AAAAxx +1643 4837 1 3 3 3 43 643 1643 1643 1643 86 87 FLAAAA BEHAAA HHHHxx +7626 4838 0 2 6 6 26 626 1626 2626 7626 52 53 IHAAAA CEHAAA OOOOxx +8728 4839 0 0 8 8 28 728 728 3728 8728 56 57 SXAAAA DEHAAA VVVVxx +8277 4840 1 1 7 17 77 277 277 3277 8277 154 155 JGAAAA EEHAAA AAAAxx +189 4841 1 1 9 9 89 189 189 189 189 178 179 HHAAAA FEHAAA HHHHxx +3717 4842 1 1 7 17 17 717 1717 3717 3717 34 35 ZMAAAA GEHAAA OOOOxx +1020 4843 0 0 0 0 20 20 1020 1020 1020 40 41 GNAAAA HEHAAA VVVVxx +9234 4844 0 2 4 14 34 234 1234 4234 9234 68 69 ERAAAA IEHAAA AAAAxx +9541 4845 1 1 1 1 41 541 1541 4541 9541 82 83 ZCAAAA JEHAAA HHHHxx +380 4846 0 0 0 0 80 380 380 380 380 160 161 QOAAAA KEHAAA OOOOxx +397 4847 1 1 7 17 97 397 397 397 397 194 195 HPAAAA LEHAAA VVVVxx +835 4848 1 3 5 15 35 835 835 835 835 70 71 DGAAAA MEHAAA AAAAxx +347 4849 1 3 7 7 47 347 347 347 347 94 95 JNAAAA NEHAAA HHHHxx +2490 4850 0 2 0 10 90 490 490 2490 2490 180 181 URAAAA OEHAAA OOOOxx +605 4851 1 1 5 5 5 605 605 605 605 10 11 HXAAAA PEHAAA VVVVxx +7960 4852 0 0 0 0 60 960 1960 2960 7960 120 121 EUAAAA QEHAAA AAAAxx +9681 4853 1 1 1 1 81 681 1681 4681 9681 162 163 JIAAAA REHAAA HHHHxx +5753 4854 1 1 3 13 53 753 1753 753 5753 106 107 HNAAAA SEHAAA OOOOxx +1676 4855 0 0 6 16 76 676 1676 1676 1676 152 153 MMAAAA TEHAAA VVVVxx +5533 4856 1 1 3 13 33 533 1533 533 5533 66 67 VEAAAA UEHAAA AAAAxx +8958 4857 0 2 8 18 58 958 958 3958 8958 116 117 OGAAAA VEHAAA HHHHxx +664 4858 0 0 4 4 64 664 664 664 664 128 129 OZAAAA WEHAAA OOOOxx +3005 4859 1 1 5 5 5 5 1005 3005 3005 10 11 PLAAAA XEHAAA VVVVxx +8576 4860 0 0 6 16 76 576 576 3576 8576 152 153 WRAAAA YEHAAA AAAAxx +7304 4861 0 0 4 4 4 304 1304 2304 7304 8 9 YUAAAA ZEHAAA HHHHxx +3375 4862 1 3 5 15 75 375 1375 3375 3375 150 151 VZAAAA AFHAAA OOOOxx +6336 4863 0 0 6 16 36 336 336 1336 6336 72 73 SJAAAA BFHAAA VVVVxx +1392 4864 0 0 2 12 92 392 1392 1392 1392 184 185 OBAAAA CFHAAA AAAAxx +2925 4865 1 1 5 5 25 925 925 2925 2925 50 51 NIAAAA DFHAAA HHHHxx +1217 4866 1 1 7 17 17 217 1217 1217 1217 34 35 VUAAAA EFHAAA OOOOxx +3714 4867 0 2 4 14 14 714 1714 3714 3714 28 29 WMAAAA FFHAAA VVVVxx +2120 4868 0 0 0 0 20 120 120 2120 2120 40 41 ODAAAA GFHAAA AAAAxx +2845 4869 1 1 5 5 45 845 845 2845 2845 90 91 LFAAAA HFHAAA HHHHxx +3865 4870 1 1 5 5 65 865 1865 3865 3865 130 131 RSAAAA IFHAAA OOOOxx +124 4871 0 0 4 4 24 124 124 124 124 48 49 UEAAAA JFHAAA VVVVxx +865 4872 1 1 5 5 65 865 865 865 865 130 131 HHAAAA KFHAAA AAAAxx +9361 4873 1 1 1 1 61 361 1361 4361 9361 122 123 BWAAAA LFHAAA HHHHxx +6338 4874 0 2 8 18 38 338 338 1338 6338 76 77 UJAAAA MFHAAA OOOOxx +7330 4875 0 2 0 10 30 330 1330 2330 7330 60 61 YVAAAA NFHAAA VVVVxx +513 4876 1 1 3 13 13 513 513 513 513 26 27 TTAAAA OFHAAA AAAAxx +5001 4877 1 1 1 1 1 1 1001 1 5001 2 3 JKAAAA PFHAAA HHHHxx +549 4878 1 1 9 9 49 549 549 549 549 98 99 DVAAAA QFHAAA OOOOxx +1808 4879 0 0 8 8 8 808 1808 1808 1808 16 17 ORAAAA RFHAAA VVVVxx +7168 4880 0 0 8 8 68 168 1168 2168 7168 136 137 SPAAAA SFHAAA AAAAxx +9878 4881 0 2 8 18 78 878 1878 4878 9878 156 157 YPAAAA TFHAAA HHHHxx +233 4882 1 1 3 13 33 233 233 233 233 66 67 ZIAAAA UFHAAA OOOOxx +4262 4883 0 2 2 2 62 262 262 4262 4262 124 125 YHAAAA VFHAAA VVVVxx +7998 4884 0 2 8 18 98 998 1998 2998 7998 196 197 QVAAAA WFHAAA AAAAxx +2419 4885 1 3 9 19 19 419 419 2419 2419 38 39 BPAAAA XFHAAA HHHHxx +9960 4886 0 0 0 0 60 960 1960 4960 9960 120 121 CTAAAA YFHAAA OOOOxx +3523 4887 1 3 3 3 23 523 1523 3523 3523 46 47 NFAAAA ZFHAAA VVVVxx +5440 4888 0 0 0 0 40 440 1440 440 5440 80 81 GBAAAA AGHAAA AAAAxx +3030 4889 0 2 0 10 30 30 1030 3030 3030 60 61 OMAAAA BGHAAA HHHHxx +2745 4890 1 1 5 5 45 745 745 2745 2745 90 91 PBAAAA CGHAAA OOOOxx +7175 4891 1 3 5 15 75 175 1175 2175 7175 150 151 ZPAAAA DGHAAA VVVVxx +640 4892 0 0 0 0 40 640 640 640 640 80 81 QYAAAA EGHAAA AAAAxx +1798 4893 0 2 8 18 98 798 1798 1798 1798 196 197 ERAAAA FGHAAA HHHHxx +7499 4894 1 3 9 19 99 499 1499 2499 7499 198 199 LCAAAA GGHAAA OOOOxx +1924 4895 0 0 4 4 24 924 1924 1924 1924 48 49 AWAAAA HGHAAA VVVVxx +1327 4896 1 3 7 7 27 327 1327 1327 1327 54 55 BZAAAA IGHAAA AAAAxx +73 4897 1 1 3 13 73 73 73 73 73 146 147 VCAAAA JGHAAA HHHHxx +9558 4898 0 2 8 18 58 558 1558 4558 9558 116 117 QDAAAA KGHAAA OOOOxx +818 4899 0 2 8 18 18 818 818 818 818 36 37 MFAAAA LGHAAA VVVVxx +9916 4900 0 0 6 16 16 916 1916 4916 9916 32 33 KRAAAA MGHAAA AAAAxx +2978 4901 0 2 8 18 78 978 978 2978 2978 156 157 OKAAAA NGHAAA HHHHxx +8469 4902 1 1 9 9 69 469 469 3469 8469 138 139 TNAAAA OGHAAA OOOOxx +9845 4903 1 1 5 5 45 845 1845 4845 9845 90 91 ROAAAA PGHAAA VVVVxx +2326 4904 0 2 6 6 26 326 326 2326 2326 52 53 MLAAAA QGHAAA AAAAxx +4032 4905 0 0 2 12 32 32 32 4032 4032 64 65 CZAAAA RGHAAA HHHHxx +5604 4906 0 0 4 4 4 604 1604 604 5604 8 9 OHAAAA SGHAAA OOOOxx +9610 4907 0 2 0 10 10 610 1610 4610 9610 20 21 QFAAAA TGHAAA VVVVxx +5101 4908 1 1 1 1 1 101 1101 101 5101 2 3 FOAAAA UGHAAA AAAAxx +7246 4909 0 2 6 6 46 246 1246 2246 7246 92 93 SSAAAA VGHAAA HHHHxx +1292 4910 0 0 2 12 92 292 1292 1292 1292 184 185 SXAAAA WGHAAA OOOOxx +6235 4911 1 3 5 15 35 235 235 1235 6235 70 71 VFAAAA XGHAAA VVVVxx +1733 4912 1 1 3 13 33 733 1733 1733 1733 66 67 ROAAAA YGHAAA AAAAxx +4647 4913 1 3 7 7 47 647 647 4647 4647 94 95 TWAAAA ZGHAAA HHHHxx +258 4914 0 2 8 18 58 258 258 258 258 116 117 YJAAAA AHHAAA OOOOxx +8438 4915 0 2 8 18 38 438 438 3438 8438 76 77 OMAAAA BHHAAA VVVVxx +7869 4916 1 1 9 9 69 869 1869 2869 7869 138 139 RQAAAA CHHAAA AAAAxx +9691 4917 1 3 1 11 91 691 1691 4691 9691 182 183 TIAAAA DHHAAA HHHHxx +5422 4918 0 2 2 2 22 422 1422 422 5422 44 45 OAAAAA EHHAAA OOOOxx +9630 4919 0 2 0 10 30 630 1630 4630 9630 60 61 KGAAAA FHHAAA VVVVxx +4439 4920 1 3 9 19 39 439 439 4439 4439 78 79 TOAAAA GHHAAA AAAAxx +3140 4921 0 0 0 0 40 140 1140 3140 3140 80 81 UQAAAA HHHAAA HHHHxx +9111 4922 1 3 1 11 11 111 1111 4111 9111 22 23 LMAAAA IHHAAA OOOOxx +4606 4923 0 2 6 6 6 606 606 4606 4606 12 13 EVAAAA JHHAAA VVVVxx +8620 4924 0 0 0 0 20 620 620 3620 8620 40 41 OTAAAA KHHAAA AAAAxx +7849 4925 1 1 9 9 49 849 1849 2849 7849 98 99 XPAAAA LHHAAA HHHHxx +346 4926 0 2 6 6 46 346 346 346 346 92 93 INAAAA MHHAAA OOOOxx +9528 4927 0 0 8 8 28 528 1528 4528 9528 56 57 MCAAAA NHHAAA VVVVxx +1811 4928 1 3 1 11 11 811 1811 1811 1811 22 23 RRAAAA OHHAAA AAAAxx +6068 4929 0 0 8 8 68 68 68 1068 6068 136 137 KZAAAA PHHAAA HHHHxx +6260 4930 0 0 0 0 60 260 260 1260 6260 120 121 UGAAAA QHHAAA OOOOxx +5909 4931 1 1 9 9 9 909 1909 909 5909 18 19 HTAAAA RHHAAA VVVVxx +4518 4932 0 2 8 18 18 518 518 4518 4518 36 37 URAAAA SHHAAA AAAAxx +7530 4933 0 2 0 10 30 530 1530 2530 7530 60 61 QDAAAA THHAAA HHHHxx +3900 4934 0 0 0 0 0 900 1900 3900 3900 0 1 AUAAAA UHHAAA OOOOxx +3969 4935 1 1 9 9 69 969 1969 3969 3969 138 139 RWAAAA VHHAAA VVVVxx +8690 4936 0 2 0 10 90 690 690 3690 8690 180 181 GWAAAA WHHAAA AAAAxx +5532 4937 0 0 2 12 32 532 1532 532 5532 64 65 UEAAAA XHHAAA HHHHxx +5989 4938 1 1 9 9 89 989 1989 989 5989 178 179 JWAAAA YHHAAA OOOOxx +1870 4939 0 2 0 10 70 870 1870 1870 1870 140 141 YTAAAA ZHHAAA VVVVxx +1113 4940 1 1 3 13 13 113 1113 1113 1113 26 27 VQAAAA AIHAAA AAAAxx +5155 4941 1 3 5 15 55 155 1155 155 5155 110 111 HQAAAA BIHAAA HHHHxx +7460 4942 0 0 0 0 60 460 1460 2460 7460 120 121 YAAAAA CIHAAA OOOOxx +6217 4943 1 1 7 17 17 217 217 1217 6217 34 35 DFAAAA DIHAAA VVVVxx +8333 4944 1 1 3 13 33 333 333 3333 8333 66 67 NIAAAA EIHAAA AAAAxx +6341 4945 1 1 1 1 41 341 341 1341 6341 82 83 XJAAAA FIHAAA HHHHxx +6230 4946 0 2 0 10 30 230 230 1230 6230 60 61 QFAAAA GIHAAA OOOOxx +6902 4947 0 2 2 2 2 902 902 1902 6902 4 5 MFAAAA HIHAAA VVVVxx +670 4948 0 2 0 10 70 670 670 670 670 140 141 UZAAAA IIHAAA AAAAxx +805 4949 1 1 5 5 5 805 805 805 805 10 11 ZEAAAA JIHAAA HHHHxx +1340 4950 0 0 0 0 40 340 1340 1340 1340 80 81 OZAAAA KIHAAA OOOOxx +8649 4951 1 1 9 9 49 649 649 3649 8649 98 99 RUAAAA LIHAAA VVVVxx +3887 4952 1 3 7 7 87 887 1887 3887 3887 174 175 NTAAAA MIHAAA AAAAxx +5400 4953 0 0 0 0 0 400 1400 400 5400 0 1 SZAAAA NIHAAA HHHHxx +4354 4954 0 2 4 14 54 354 354 4354 4354 108 109 MLAAAA OIHAAA OOOOxx +950 4955 0 2 0 10 50 950 950 950 950 100 101 OKAAAA PIHAAA VVVVxx +1544 4956 0 0 4 4 44 544 1544 1544 1544 88 89 KHAAAA QIHAAA AAAAxx +3898 4957 0 2 8 18 98 898 1898 3898 3898 196 197 YTAAAA RIHAAA HHHHxx +8038 4958 0 2 8 18 38 38 38 3038 8038 76 77 EXAAAA SIHAAA OOOOxx +1095 4959 1 3 5 15 95 95 1095 1095 1095 190 191 DQAAAA TIHAAA VVVVxx +1748 4960 0 0 8 8 48 748 1748 1748 1748 96 97 GPAAAA UIHAAA AAAAxx +9154 4961 0 2 4 14 54 154 1154 4154 9154 108 109 COAAAA VIHAAA HHHHxx +2182 4962 0 2 2 2 82 182 182 2182 2182 164 165 YFAAAA WIHAAA OOOOxx +6797 4963 1 1 7 17 97 797 797 1797 6797 194 195 LBAAAA XIHAAA VVVVxx +9149 4964 1 1 9 9 49 149 1149 4149 9149 98 99 XNAAAA YIHAAA AAAAxx +7351 4965 1 3 1 11 51 351 1351 2351 7351 102 103 TWAAAA ZIHAAA HHHHxx +2820 4966 0 0 0 0 20 820 820 2820 2820 40 41 MEAAAA AJHAAA OOOOxx +9696 4967 0 0 6 16 96 696 1696 4696 9696 192 193 YIAAAA BJHAAA VVVVxx +253 4968 1 1 3 13 53 253 253 253 253 106 107 TJAAAA CJHAAA AAAAxx +3600 4969 0 0 0 0 0 600 1600 3600 3600 0 1 MIAAAA DJHAAA HHHHxx +3892 4970 0 0 2 12 92 892 1892 3892 3892 184 185 STAAAA EJHAAA OOOOxx +231 4971 1 3 1 11 31 231 231 231 231 62 63 XIAAAA FJHAAA VVVVxx +8331 4972 1 3 1 11 31 331 331 3331 8331 62 63 LIAAAA GJHAAA AAAAxx +403 4973 1 3 3 3 3 403 403 403 403 6 7 NPAAAA HJHAAA HHHHxx +8642 4974 0 2 2 2 42 642 642 3642 8642 84 85 KUAAAA IJHAAA OOOOxx +3118 4975 0 2 8 18 18 118 1118 3118 3118 36 37 YPAAAA JJHAAA VVVVxx +3835 4976 1 3 5 15 35 835 1835 3835 3835 70 71 NRAAAA KJHAAA AAAAxx +1117 4977 1 1 7 17 17 117 1117 1117 1117 34 35 ZQAAAA LJHAAA HHHHxx +7024 4978 0 0 4 4 24 24 1024 2024 7024 48 49 EKAAAA MJHAAA OOOOxx +2636 4979 0 0 6 16 36 636 636 2636 2636 72 73 KXAAAA NJHAAA VVVVxx +3778 4980 0 2 8 18 78 778 1778 3778 3778 156 157 IPAAAA OJHAAA AAAAxx +2003 4981 1 3 3 3 3 3 3 2003 2003 6 7 BZAAAA PJHAAA HHHHxx +5717 4982 1 1 7 17 17 717 1717 717 5717 34 35 XLAAAA QJHAAA OOOOxx +4869 4983 1 1 9 9 69 869 869 4869 4869 138 139 HFAAAA RJHAAA VVVVxx +8921 4984 1 1 1 1 21 921 921 3921 8921 42 43 DFAAAA SJHAAA AAAAxx +888 4985 0 0 8 8 88 888 888 888 888 176 177 EIAAAA TJHAAA HHHHxx +7599 4986 1 3 9 19 99 599 1599 2599 7599 198 199 HGAAAA UJHAAA OOOOxx +8621 4987 1 1 1 1 21 621 621 3621 8621 42 43 PTAAAA VJHAAA VVVVxx +811 4988 1 3 1 11 11 811 811 811 811 22 23 FFAAAA WJHAAA AAAAxx +9147 4989 1 3 7 7 47 147 1147 4147 9147 94 95 VNAAAA XJHAAA HHHHxx +1413 4990 1 1 3 13 13 413 1413 1413 1413 26 27 JCAAAA YJHAAA OOOOxx +5232 4991 0 0 2 12 32 232 1232 232 5232 64 65 GTAAAA ZJHAAA VVVVxx +5912 4992 0 0 2 12 12 912 1912 912 5912 24 25 KTAAAA AKHAAA AAAAxx +3418 4993 0 2 8 18 18 418 1418 3418 3418 36 37 MBAAAA BKHAAA HHHHxx +3912 4994 0 0 2 12 12 912 1912 3912 3912 24 25 MUAAAA CKHAAA OOOOxx +9576 4995 0 0 6 16 76 576 1576 4576 9576 152 153 IEAAAA DKHAAA VVVVxx +4225 4996 1 1 5 5 25 225 225 4225 4225 50 51 NGAAAA EKHAAA AAAAxx +8222 4997 0 2 2 2 22 222 222 3222 8222 44 45 GEAAAA FKHAAA HHHHxx +7013 4998 1 1 3 13 13 13 1013 2013 7013 26 27 TJAAAA GKHAAA OOOOxx +7037 4999 1 1 7 17 37 37 1037 2037 7037 74 75 RKAAAA HKHAAA VVVVxx +1205 5000 1 1 5 5 5 205 1205 1205 1205 10 11 JUAAAA IKHAAA AAAAxx +8114 5001 0 2 4 14 14 114 114 3114 8114 28 29 CAAAAA JKHAAA HHHHxx +6585 5002 1 1 5 5 85 585 585 1585 6585 170 171 HTAAAA KKHAAA OOOOxx +155 5003 1 3 5 15 55 155 155 155 155 110 111 ZFAAAA LKHAAA VVVVxx +2841 5004 1 1 1 1 41 841 841 2841 2841 82 83 HFAAAA MKHAAA AAAAxx +1996 5005 0 0 6 16 96 996 1996 1996 1996 192 193 UYAAAA NKHAAA HHHHxx +4948 5006 0 0 8 8 48 948 948 4948 4948 96 97 IIAAAA OKHAAA OOOOxx +3304 5007 0 0 4 4 4 304 1304 3304 3304 8 9 CXAAAA PKHAAA VVVVxx +5684 5008 0 0 4 4 84 684 1684 684 5684 168 169 QKAAAA QKHAAA AAAAxx +6962 5009 0 2 2 2 62 962 962 1962 6962 124 125 UHAAAA RKHAAA HHHHxx +8691 5010 1 3 1 11 91 691 691 3691 8691 182 183 HWAAAA SKHAAA OOOOxx +8501 5011 1 1 1 1 1 501 501 3501 8501 2 3 ZOAAAA TKHAAA VVVVxx +4783 5012 1 3 3 3 83 783 783 4783 4783 166 167 ZBAAAA UKHAAA AAAAxx +3762 5013 0 2 2 2 62 762 1762 3762 3762 124 125 SOAAAA VKHAAA HHHHxx +4534 5014 0 2 4 14 34 534 534 4534 4534 68 69 KSAAAA WKHAAA OOOOxx +4999 5015 1 3 9 19 99 999 999 4999 4999 198 199 HKAAAA XKHAAA VVVVxx +4618 5016 0 2 8 18 18 618 618 4618 4618 36 37 QVAAAA YKHAAA AAAAxx +4220 5017 0 0 0 0 20 220 220 4220 4220 40 41 IGAAAA ZKHAAA HHHHxx +3384 5018 0 0 4 4 84 384 1384 3384 3384 168 169 EAAAAA ALHAAA OOOOxx +3036 5019 0 0 6 16 36 36 1036 3036 3036 72 73 UMAAAA BLHAAA VVVVxx +545 5020 1 1 5 5 45 545 545 545 545 90 91 ZUAAAA CLHAAA AAAAxx +9946 5021 0 2 6 6 46 946 1946 4946 9946 92 93 OSAAAA DLHAAA HHHHxx +1985 5022 1 1 5 5 85 985 1985 1985 1985 170 171 JYAAAA ELHAAA OOOOxx +2310 5023 0 2 0 10 10 310 310 2310 2310 20 21 WKAAAA FLHAAA VVVVxx +6563 5024 1 3 3 3 63 563 563 1563 6563 126 127 LSAAAA GLHAAA AAAAxx +4886 5025 0 2 6 6 86 886 886 4886 4886 172 173 YFAAAA HLHAAA HHHHxx +9359 5026 1 3 9 19 59 359 1359 4359 9359 118 119 ZVAAAA ILHAAA OOOOxx +400 5027 0 0 0 0 0 400 400 400 400 0 1 KPAAAA JLHAAA VVVVxx +9742 5028 0 2 2 2 42 742 1742 4742 9742 84 85 SKAAAA KLHAAA AAAAxx +6736 5029 0 0 6 16 36 736 736 1736 6736 72 73 CZAAAA LLHAAA HHHHxx +8166 5030 0 2 6 6 66 166 166 3166 8166 132 133 CCAAAA MLHAAA OOOOxx +861 5031 1 1 1 1 61 861 861 861 861 122 123 DHAAAA NLHAAA VVVVxx +7492 5032 0 0 2 12 92 492 1492 2492 7492 184 185 ECAAAA OLHAAA AAAAxx +1155 5033 1 3 5 15 55 155 1155 1155 1155 110 111 LSAAAA PLHAAA HHHHxx +9769 5034 1 1 9 9 69 769 1769 4769 9769 138 139 TLAAAA QLHAAA OOOOxx +6843 5035 1 3 3 3 43 843 843 1843 6843 86 87 FDAAAA RLHAAA VVVVxx +5625 5036 1 1 5 5 25 625 1625 625 5625 50 51 JIAAAA SLHAAA AAAAxx +1910 5037 0 2 0 10 10 910 1910 1910 1910 20 21 MVAAAA TLHAAA HHHHxx +9796 5038 0 0 6 16 96 796 1796 4796 9796 192 193 UMAAAA ULHAAA OOOOxx +6950 5039 0 2 0 10 50 950 950 1950 6950 100 101 IHAAAA VLHAAA VVVVxx +3084 5040 0 0 4 4 84 84 1084 3084 3084 168 169 QOAAAA WLHAAA AAAAxx +2959 5041 1 3 9 19 59 959 959 2959 2959 118 119 VJAAAA XLHAAA HHHHxx +2093 5042 1 1 3 13 93 93 93 2093 2093 186 187 NCAAAA YLHAAA OOOOxx +2738 5043 0 2 8 18 38 738 738 2738 2738 76 77 IBAAAA ZLHAAA VVVVxx +6406 5044 0 2 6 6 6 406 406 1406 6406 12 13 KMAAAA AMHAAA AAAAxx +9082 5045 0 2 2 2 82 82 1082 4082 9082 164 165 ILAAAA BMHAAA HHHHxx +8568 5046 0 0 8 8 68 568 568 3568 8568 136 137 ORAAAA CMHAAA OOOOxx +3566 5047 0 2 6 6 66 566 1566 3566 3566 132 133 EHAAAA DMHAAA VVVVxx +3016 5048 0 0 6 16 16 16 1016 3016 3016 32 33 AMAAAA EMHAAA AAAAxx +1207 5049 1 3 7 7 7 207 1207 1207 1207 14 15 LUAAAA FMHAAA HHHHxx +4045 5050 1 1 5 5 45 45 45 4045 4045 90 91 PZAAAA GMHAAA OOOOxx +4173 5051 1 1 3 13 73 173 173 4173 4173 146 147 NEAAAA HMHAAA VVVVxx +3939 5052 1 3 9 19 39 939 1939 3939 3939 78 79 NVAAAA IMHAAA AAAAxx +9683 5053 1 3 3 3 83 683 1683 4683 9683 166 167 LIAAAA JMHAAA HHHHxx +1684 5054 0 0 4 4 84 684 1684 1684 1684 168 169 UMAAAA KMHAAA OOOOxx +9271 5055 1 3 1 11 71 271 1271 4271 9271 142 143 PSAAAA LMHAAA VVVVxx +9317 5056 1 1 7 17 17 317 1317 4317 9317 34 35 JUAAAA MMHAAA AAAAxx +5793 5057 1 1 3 13 93 793 1793 793 5793 186 187 VOAAAA NMHAAA HHHHxx +352 5058 0 0 2 12 52 352 352 352 352 104 105 ONAAAA OMHAAA OOOOxx +7328 5059 0 0 8 8 28 328 1328 2328 7328 56 57 WVAAAA PMHAAA VVVVxx +4582 5060 0 2 2 2 82 582 582 4582 4582 164 165 GUAAAA QMHAAA AAAAxx +7413 5061 1 1 3 13 13 413 1413 2413 7413 26 27 DZAAAA RMHAAA HHHHxx +6772 5062 0 0 2 12 72 772 772 1772 6772 144 145 MAAAAA SMHAAA OOOOxx +4973 5063 1 1 3 13 73 973 973 4973 4973 146 147 HJAAAA TMHAAA VVVVxx +7480 5064 0 0 0 0 80 480 1480 2480 7480 160 161 SBAAAA UMHAAA AAAAxx +5555 5065 1 3 5 15 55 555 1555 555 5555 110 111 RFAAAA VMHAAA HHHHxx +4227 5066 1 3 7 7 27 227 227 4227 4227 54 55 PGAAAA WMHAAA OOOOxx +4153 5067 1 1 3 13 53 153 153 4153 4153 106 107 TDAAAA XMHAAA VVVVxx +4601 5068 1 1 1 1 1 601 601 4601 4601 2 3 ZUAAAA YMHAAA AAAAxx +3782 5069 0 2 2 2 82 782 1782 3782 3782 164 165 MPAAAA ZMHAAA HHHHxx +3872 5070 0 0 2 12 72 872 1872 3872 3872 144 145 YSAAAA ANHAAA OOOOxx +893 5071 1 1 3 13 93 893 893 893 893 186 187 JIAAAA BNHAAA VVVVxx +2430 5072 0 2 0 10 30 430 430 2430 2430 60 61 MPAAAA CNHAAA AAAAxx +2591 5073 1 3 1 11 91 591 591 2591 2591 182 183 RVAAAA DNHAAA HHHHxx +264 5074 0 0 4 4 64 264 264 264 264 128 129 EKAAAA ENHAAA OOOOxx +6238 5075 0 2 8 18 38 238 238 1238 6238 76 77 YFAAAA FNHAAA VVVVxx +633 5076 1 1 3 13 33 633 633 633 633 66 67 JYAAAA GNHAAA AAAAxx +1029 5077 1 1 9 9 29 29 1029 1029 1029 58 59 PNAAAA HNHAAA HHHHxx +5934 5078 0 2 4 14 34 934 1934 934 5934 68 69 GUAAAA INHAAA OOOOxx +8694 5079 0 2 4 14 94 694 694 3694 8694 188 189 KWAAAA JNHAAA VVVVxx +7401 5080 1 1 1 1 1 401 1401 2401 7401 2 3 RYAAAA KNHAAA AAAAxx +1165 5081 1 1 5 5 65 165 1165 1165 1165 130 131 VSAAAA LNHAAA HHHHxx +9438 5082 0 2 8 18 38 438 1438 4438 9438 76 77 AZAAAA MNHAAA OOOOxx +4790 5083 0 2 0 10 90 790 790 4790 4790 180 181 GCAAAA NNHAAA VVVVxx +4531 5084 1 3 1 11 31 531 531 4531 4531 62 63 HSAAAA ONHAAA AAAAxx +6099 5085 1 3 9 19 99 99 99 1099 6099 198 199 PAAAAA PNHAAA HHHHxx +8236 5086 0 0 6 16 36 236 236 3236 8236 72 73 UEAAAA QNHAAA OOOOxx +8551 5087 1 3 1 11 51 551 551 3551 8551 102 103 XQAAAA RNHAAA VVVVxx +3128 5088 0 0 8 8 28 128 1128 3128 3128 56 57 IQAAAA SNHAAA AAAAxx +3504 5089 0 0 4 4 4 504 1504 3504 3504 8 9 UEAAAA TNHAAA HHHHxx +9071 5090 1 3 1 11 71 71 1071 4071 9071 142 143 XKAAAA UNHAAA OOOOxx +5930 5091 0 2 0 10 30 930 1930 930 5930 60 61 CUAAAA VNHAAA VVVVxx +6825 5092 1 1 5 5 25 825 825 1825 6825 50 51 NCAAAA WNHAAA AAAAxx +2218 5093 0 2 8 18 18 218 218 2218 2218 36 37 IHAAAA XNHAAA HHHHxx +3604 5094 0 0 4 4 4 604 1604 3604 3604 8 9 QIAAAA YNHAAA OOOOxx +5761 5095 1 1 1 1 61 761 1761 761 5761 122 123 PNAAAA ZNHAAA VVVVxx +5414 5096 0 2 4 14 14 414 1414 414 5414 28 29 GAAAAA AOHAAA AAAAxx +5892 5097 0 0 2 12 92 892 1892 892 5892 184 185 QSAAAA BOHAAA HHHHxx +4080 5098 0 0 0 0 80 80 80 4080 4080 160 161 YAAAAA COHAAA OOOOxx +8018 5099 0 2 8 18 18 18 18 3018 8018 36 37 KWAAAA DOHAAA VVVVxx +1757 5100 1 1 7 17 57 757 1757 1757 1757 114 115 PPAAAA EOHAAA AAAAxx +5854 5101 0 2 4 14 54 854 1854 854 5854 108 109 ERAAAA FOHAAA HHHHxx +1335 5102 1 3 5 15 35 335 1335 1335 1335 70 71 JZAAAA GOHAAA OOOOxx +3811 5103 1 3 1 11 11 811 1811 3811 3811 22 23 PQAAAA HOHAAA VVVVxx +9917 5104 1 1 7 17 17 917 1917 4917 9917 34 35 LRAAAA IOHAAA AAAAxx +5947 5105 1 3 7 7 47 947 1947 947 5947 94 95 TUAAAA JOHAAA HHHHxx +7263 5106 1 3 3 3 63 263 1263 2263 7263 126 127 JTAAAA KOHAAA OOOOxx +1730 5107 0 2 0 10 30 730 1730 1730 1730 60 61 OOAAAA LOHAAA VVVVxx +5747 5108 1 3 7 7 47 747 1747 747 5747 94 95 BNAAAA MOHAAA AAAAxx +3876 5109 0 0 6 16 76 876 1876 3876 3876 152 153 CTAAAA NOHAAA HHHHxx +2762 5110 0 2 2 2 62 762 762 2762 2762 124 125 GCAAAA OOHAAA OOOOxx +7613 5111 1 1 3 13 13 613 1613 2613 7613 26 27 VGAAAA POHAAA VVVVxx +152 5112 0 0 2 12 52 152 152 152 152 104 105 WFAAAA QOHAAA AAAAxx +3941 5113 1 1 1 1 41 941 1941 3941 3941 82 83 PVAAAA ROHAAA HHHHxx +5614 5114 0 2 4 14 14 614 1614 614 5614 28 29 YHAAAA SOHAAA OOOOxx +9279 5115 1 3 9 19 79 279 1279 4279 9279 158 159 XSAAAA TOHAAA VVVVxx +3048 5116 0 0 8 8 48 48 1048 3048 3048 96 97 GNAAAA UOHAAA AAAAxx +6152 5117 0 0 2 12 52 152 152 1152 6152 104 105 QCAAAA VOHAAA HHHHxx +5481 5118 1 1 1 1 81 481 1481 481 5481 162 163 VCAAAA WOHAAA OOOOxx +4675 5119 1 3 5 15 75 675 675 4675 4675 150 151 VXAAAA XOHAAA VVVVxx +3334 5120 0 2 4 14 34 334 1334 3334 3334 68 69 GYAAAA YOHAAA AAAAxx +4691 5121 1 3 1 11 91 691 691 4691 4691 182 183 LYAAAA ZOHAAA HHHHxx +803 5122 1 3 3 3 3 803 803 803 803 6 7 XEAAAA APHAAA OOOOxx +5409 5123 1 1 9 9 9 409 1409 409 5409 18 19 BAAAAA BPHAAA VVVVxx +1054 5124 0 2 4 14 54 54 1054 1054 1054 108 109 OOAAAA CPHAAA AAAAxx +103 5125 1 3 3 3 3 103 103 103 103 6 7 ZDAAAA DPHAAA HHHHxx +8565 5126 1 1 5 5 65 565 565 3565 8565 130 131 LRAAAA EPHAAA OOOOxx +4666 5127 0 2 6 6 66 666 666 4666 4666 132 133 MXAAAA FPHAAA VVVVxx +6634 5128 0 2 4 14 34 634 634 1634 6634 68 69 EVAAAA GPHAAA AAAAxx +5538 5129 0 2 8 18 38 538 1538 538 5538 76 77 AFAAAA HPHAAA HHHHxx +3789 5130 1 1 9 9 89 789 1789 3789 3789 178 179 TPAAAA IPHAAA OOOOxx +4641 5131 1 1 1 1 41 641 641 4641 4641 82 83 NWAAAA JPHAAA VVVVxx +2458 5132 0 2 8 18 58 458 458 2458 2458 116 117 OQAAAA KPHAAA AAAAxx +5667 5133 1 3 7 7 67 667 1667 667 5667 134 135 ZJAAAA LPHAAA HHHHxx +6524 5134 0 0 4 4 24 524 524 1524 6524 48 49 YQAAAA MPHAAA OOOOxx +9179 5135 1 3 9 19 79 179 1179 4179 9179 158 159 BPAAAA NPHAAA VVVVxx +6358 5136 0 2 8 18 58 358 358 1358 6358 116 117 OKAAAA OPHAAA AAAAxx +6668 5137 0 0 8 8 68 668 668 1668 6668 136 137 MWAAAA PPHAAA HHHHxx +6414 5138 0 2 4 14 14 414 414 1414 6414 28 29 SMAAAA QPHAAA OOOOxx +2813 5139 1 1 3 13 13 813 813 2813 2813 26 27 FEAAAA RPHAAA VVVVxx +8927 5140 1 3 7 7 27 927 927 3927 8927 54 55 JFAAAA SPHAAA AAAAxx +8695 5141 1 3 5 15 95 695 695 3695 8695 190 191 LWAAAA TPHAAA HHHHxx +363 5142 1 3 3 3 63 363 363 363 363 126 127 ZNAAAA UPHAAA OOOOxx +9966 5143 0 2 6 6 66 966 1966 4966 9966 132 133 ITAAAA VPHAAA VVVVxx +1323 5144 1 3 3 3 23 323 1323 1323 1323 46 47 XYAAAA WPHAAA AAAAxx +8211 5145 1 3 1 11 11 211 211 3211 8211 22 23 VDAAAA XPHAAA HHHHxx +4375 5146 1 3 5 15 75 375 375 4375 4375 150 151 HMAAAA YPHAAA OOOOxx +3257 5147 1 1 7 17 57 257 1257 3257 3257 114 115 HVAAAA ZPHAAA VVVVxx +6239 5148 1 3 9 19 39 239 239 1239 6239 78 79 ZFAAAA AQHAAA AAAAxx +3602 5149 0 2 2 2 2 602 1602 3602 3602 4 5 OIAAAA BQHAAA HHHHxx +9830 5150 0 2 0 10 30 830 1830 4830 9830 60 61 COAAAA CQHAAA OOOOxx +7826 5151 0 2 6 6 26 826 1826 2826 7826 52 53 APAAAA DQHAAA VVVVxx +2108 5152 0 0 8 8 8 108 108 2108 2108 16 17 CDAAAA EQHAAA AAAAxx +7245 5153 1 1 5 5 45 245 1245 2245 7245 90 91 RSAAAA FQHAAA HHHHxx +8330 5154 0 2 0 10 30 330 330 3330 8330 60 61 KIAAAA GQHAAA OOOOxx +7441 5155 1 1 1 1 41 441 1441 2441 7441 82 83 FAAAAA HQHAAA VVVVxx +9848 5156 0 0 8 8 48 848 1848 4848 9848 96 97 UOAAAA IQHAAA AAAAxx +1226 5157 0 2 6 6 26 226 1226 1226 1226 52 53 EVAAAA JQHAAA HHHHxx +414 5158 0 2 4 14 14 414 414 414 414 28 29 YPAAAA KQHAAA OOOOxx +1273 5159 1 1 3 13 73 273 1273 1273 1273 146 147 ZWAAAA LQHAAA VVVVxx +9866 5160 0 2 6 6 66 866 1866 4866 9866 132 133 MPAAAA MQHAAA AAAAxx +4633 5161 1 1 3 13 33 633 633 4633 4633 66 67 FWAAAA NQHAAA HHHHxx +8727 5162 1 3 7 7 27 727 727 3727 8727 54 55 RXAAAA OQHAAA OOOOxx +5308 5163 0 0 8 8 8 308 1308 308 5308 16 17 EWAAAA PQHAAA VVVVxx +1395 5164 1 3 5 15 95 395 1395 1395 1395 190 191 RBAAAA QQHAAA AAAAxx +1825 5165 1 1 5 5 25 825 1825 1825 1825 50 51 FSAAAA RQHAAA HHHHxx +7606 5166 0 2 6 6 6 606 1606 2606 7606 12 13 OGAAAA SQHAAA OOOOxx +9390 5167 0 2 0 10 90 390 1390 4390 9390 180 181 EXAAAA TQHAAA VVVVxx +2376 5168 0 0 6 16 76 376 376 2376 2376 152 153 KNAAAA UQHAAA AAAAxx +2377 5169 1 1 7 17 77 377 377 2377 2377 154 155 LNAAAA VQHAAA HHHHxx +5346 5170 0 2 6 6 46 346 1346 346 5346 92 93 QXAAAA WQHAAA OOOOxx +4140 5171 0 0 0 0 40 140 140 4140 4140 80 81 GDAAAA XQHAAA VVVVxx +6032 5172 0 0 2 12 32 32 32 1032 6032 64 65 AYAAAA YQHAAA AAAAxx +9453 5173 1 1 3 13 53 453 1453 4453 9453 106 107 PZAAAA ZQHAAA HHHHxx +9297 5174 1 1 7 17 97 297 1297 4297 9297 194 195 PTAAAA ARHAAA OOOOxx +6455 5175 1 3 5 15 55 455 455 1455 6455 110 111 HOAAAA BRHAAA VVVVxx +4458 5176 0 2 8 18 58 458 458 4458 4458 116 117 MPAAAA CRHAAA AAAAxx +9516 5177 0 0 6 16 16 516 1516 4516 9516 32 33 ACAAAA DRHAAA HHHHxx +6211 5178 1 3 1 11 11 211 211 1211 6211 22 23 XEAAAA ERHAAA OOOOxx +526 5179 0 2 6 6 26 526 526 526 526 52 53 GUAAAA FRHAAA VVVVxx +3570 5180 0 2 0 10 70 570 1570 3570 3570 140 141 IHAAAA GRHAAA AAAAxx +4885 5181 1 1 5 5 85 885 885 4885 4885 170 171 XFAAAA HRHAAA HHHHxx +6390 5182 0 2 0 10 90 390 390 1390 6390 180 181 ULAAAA IRHAAA OOOOxx +1606 5183 0 2 6 6 6 606 1606 1606 1606 12 13 UJAAAA JRHAAA VVVVxx +7850 5184 0 2 0 10 50 850 1850 2850 7850 100 101 YPAAAA KRHAAA AAAAxx +3315 5185 1 3 5 15 15 315 1315 3315 3315 30 31 NXAAAA LRHAAA HHHHxx +8322 5186 0 2 2 2 22 322 322 3322 8322 44 45 CIAAAA MRHAAA OOOOxx +3703 5187 1 3 3 3 3 703 1703 3703 3703 6 7 LMAAAA NRHAAA VVVVxx +9489 5188 1 1 9 9 89 489 1489 4489 9489 178 179 ZAAAAA ORHAAA AAAAxx +6104 5189 0 0 4 4 4 104 104 1104 6104 8 9 UAAAAA PRHAAA HHHHxx +3067 5190 1 3 7 7 67 67 1067 3067 3067 134 135 ZNAAAA QRHAAA OOOOxx +2521 5191 1 1 1 1 21 521 521 2521 2521 42 43 ZSAAAA RRHAAA VVVVxx +2581 5192 1 1 1 1 81 581 581 2581 2581 162 163 HVAAAA SRHAAA AAAAxx +595 5193 1 3 5 15 95 595 595 595 595 190 191 XWAAAA TRHAAA HHHHxx +8291 5194 1 3 1 11 91 291 291 3291 8291 182 183 XGAAAA URHAAA OOOOxx +1727 5195 1 3 7 7 27 727 1727 1727 1727 54 55 LOAAAA VRHAAA VVVVxx +6847 5196 1 3 7 7 47 847 847 1847 6847 94 95 JDAAAA WRHAAA AAAAxx +7494 5197 0 2 4 14 94 494 1494 2494 7494 188 189 GCAAAA XRHAAA HHHHxx +7093 5198 1 1 3 13 93 93 1093 2093 7093 186 187 VMAAAA YRHAAA OOOOxx +7357 5199 1 1 7 17 57 357 1357 2357 7357 114 115 ZWAAAA ZRHAAA VVVVxx +620 5200 0 0 0 0 20 620 620 620 620 40 41 WXAAAA ASHAAA AAAAxx +2460 5201 0 0 0 0 60 460 460 2460 2460 120 121 QQAAAA BSHAAA HHHHxx +1598 5202 0 2 8 18 98 598 1598 1598 1598 196 197 MJAAAA CSHAAA OOOOxx +4112 5203 0 0 2 12 12 112 112 4112 4112 24 25 ECAAAA DSHAAA VVVVxx +2956 5204 0 0 6 16 56 956 956 2956 2956 112 113 SJAAAA ESHAAA AAAAxx +3193 5205 1 1 3 13 93 193 1193 3193 3193 186 187 VSAAAA FSHAAA HHHHxx +6356 5206 0 0 6 16 56 356 356 1356 6356 112 113 MKAAAA GSHAAA OOOOxx +730 5207 0 2 0 10 30 730 730 730 730 60 61 CCAAAA HSHAAA VVVVxx +8826 5208 0 2 6 6 26 826 826 3826 8826 52 53 MBAAAA ISHAAA AAAAxx +9036 5209 0 0 6 16 36 36 1036 4036 9036 72 73 OJAAAA JSHAAA HHHHxx +2085 5210 1 1 5 5 85 85 85 2085 2085 170 171 FCAAAA KSHAAA OOOOxx +9007 5211 1 3 7 7 7 7 1007 4007 9007 14 15 LIAAAA LSHAAA VVVVxx +6047 5212 1 3 7 7 47 47 47 1047 6047 94 95 PYAAAA MSHAAA AAAAxx +3953 5213 1 1 3 13 53 953 1953 3953 3953 106 107 BWAAAA NSHAAA HHHHxx +1214 5214 0 2 4 14 14 214 1214 1214 1214 28 29 SUAAAA OSHAAA OOOOxx +4814 5215 0 2 4 14 14 814 814 4814 4814 28 29 EDAAAA PSHAAA VVVVxx +5738 5216 0 2 8 18 38 738 1738 738 5738 76 77 SMAAAA QSHAAA AAAAxx +7176 5217 0 0 6 16 76 176 1176 2176 7176 152 153 AQAAAA RSHAAA HHHHxx +3609 5218 1 1 9 9 9 609 1609 3609 3609 18 19 VIAAAA SSHAAA OOOOxx +592 5219 0 0 2 12 92 592 592 592 592 184 185 UWAAAA TSHAAA VVVVxx +9391 5220 1 3 1 11 91 391 1391 4391 9391 182 183 FXAAAA USHAAA AAAAxx +5345 5221 1 1 5 5 45 345 1345 345 5345 90 91 PXAAAA VSHAAA HHHHxx +1171 5222 1 3 1 11 71 171 1171 1171 1171 142 143 BTAAAA WSHAAA OOOOxx +7238 5223 0 2 8 18 38 238 1238 2238 7238 76 77 KSAAAA XSHAAA VVVVxx +7561 5224 1 1 1 1 61 561 1561 2561 7561 122 123 VEAAAA YSHAAA AAAAxx +5876 5225 0 0 6 16 76 876 1876 876 5876 152 153 ASAAAA ZSHAAA HHHHxx +6611 5226 1 3 1 11 11 611 611 1611 6611 22 23 HUAAAA ATHAAA OOOOxx +7300 5227 0 0 0 0 0 300 1300 2300 7300 0 1 UUAAAA BTHAAA VVVVxx +1506 5228 0 2 6 6 6 506 1506 1506 1506 12 13 YFAAAA CTHAAA AAAAxx +1153 5229 1 1 3 13 53 153 1153 1153 1153 106 107 JSAAAA DTHAAA HHHHxx +3831 5230 1 3 1 11 31 831 1831 3831 3831 62 63 JRAAAA ETHAAA OOOOxx +9255 5231 1 3 5 15 55 255 1255 4255 9255 110 111 ZRAAAA FTHAAA VVVVxx +1841 5232 1 1 1 1 41 841 1841 1841 1841 82 83 VSAAAA GTHAAA AAAAxx +5075 5233 1 3 5 15 75 75 1075 75 5075 150 151 FNAAAA HTHAAA HHHHxx +101 5234 1 1 1 1 1 101 101 101 101 2 3 XDAAAA ITHAAA OOOOxx +2627 5235 1 3 7 7 27 627 627 2627 2627 54 55 BXAAAA JTHAAA VVVVxx +7078 5236 0 2 8 18 78 78 1078 2078 7078 156 157 GMAAAA KTHAAA AAAAxx +2850 5237 0 2 0 10 50 850 850 2850 2850 100 101 QFAAAA LTHAAA HHHHxx +8703 5238 1 3 3 3 3 703 703 3703 8703 6 7 TWAAAA MTHAAA OOOOxx +4101 5239 1 1 1 1 1 101 101 4101 4101 2 3 TBAAAA NTHAAA VVVVxx +318 5240 0 2 8 18 18 318 318 318 318 36 37 GMAAAA OTHAAA AAAAxx +6452 5241 0 0 2 12 52 452 452 1452 6452 104 105 EOAAAA PTHAAA HHHHxx +5558 5242 0 2 8 18 58 558 1558 558 5558 116 117 UFAAAA QTHAAA OOOOxx +3127 5243 1 3 7 7 27 127 1127 3127 3127 54 55 HQAAAA RTHAAA VVVVxx +535 5244 1 3 5 15 35 535 535 535 535 70 71 PUAAAA STHAAA AAAAxx +270 5245 0 2 0 10 70 270 270 270 270 140 141 KKAAAA TTHAAA HHHHxx +4038 5246 0 2 8 18 38 38 38 4038 4038 76 77 IZAAAA UTHAAA OOOOxx +3404 5247 0 0 4 4 4 404 1404 3404 3404 8 9 YAAAAA VTHAAA VVVVxx +2374 5248 0 2 4 14 74 374 374 2374 2374 148 149 INAAAA WTHAAA AAAAxx +6446 5249 0 2 6 6 46 446 446 1446 6446 92 93 YNAAAA XTHAAA HHHHxx +7758 5250 0 2 8 18 58 758 1758 2758 7758 116 117 KMAAAA YTHAAA OOOOxx +356 5251 0 0 6 16 56 356 356 356 356 112 113 SNAAAA ZTHAAA VVVVxx +9197 5252 1 1 7 17 97 197 1197 4197 9197 194 195 TPAAAA AUHAAA AAAAxx +9765 5253 1 1 5 5 65 765 1765 4765 9765 130 131 PLAAAA BUHAAA HHHHxx +4974 5254 0 2 4 14 74 974 974 4974 4974 148 149 IJAAAA CUHAAA OOOOxx +442 5255 0 2 2 2 42 442 442 442 442 84 85 ARAAAA DUHAAA VVVVxx +4349 5256 1 1 9 9 49 349 349 4349 4349 98 99 HLAAAA EUHAAA AAAAxx +6119 5257 1 3 9 19 19 119 119 1119 6119 38 39 JBAAAA FUHAAA HHHHxx +7574 5258 0 2 4 14 74 574 1574 2574 7574 148 149 IFAAAA GUHAAA OOOOxx +4445 5259 1 1 5 5 45 445 445 4445 4445 90 91 ZOAAAA HUHAAA VVVVxx +940 5260 0 0 0 0 40 940 940 940 940 80 81 EKAAAA IUHAAA AAAAxx +1875 5261 1 3 5 15 75 875 1875 1875 1875 150 151 DUAAAA JUHAAA HHHHxx +5951 5262 1 3 1 11 51 951 1951 951 5951 102 103 XUAAAA KUHAAA OOOOxx +9132 5263 0 0 2 12 32 132 1132 4132 9132 64 65 GNAAAA LUHAAA VVVVxx +6913 5264 1 1 3 13 13 913 913 1913 6913 26 27 XFAAAA MUHAAA AAAAxx +3308 5265 0 0 8 8 8 308 1308 3308 3308 16 17 GXAAAA NUHAAA HHHHxx +7553 5266 1 1 3 13 53 553 1553 2553 7553 106 107 NEAAAA OUHAAA OOOOxx +2138 5267 0 2 8 18 38 138 138 2138 2138 76 77 GEAAAA PUHAAA VVVVxx +6252 5268 0 0 2 12 52 252 252 1252 6252 104 105 MGAAAA QUHAAA AAAAxx +2171 5269 1 3 1 11 71 171 171 2171 2171 142 143 NFAAAA RUHAAA HHHHxx +4159 5270 1 3 9 19 59 159 159 4159 4159 118 119 ZDAAAA SUHAAA OOOOxx +2401 5271 1 1 1 1 1 401 401 2401 2401 2 3 JOAAAA TUHAAA VVVVxx +6553 5272 1 1 3 13 53 553 553 1553 6553 106 107 BSAAAA UUHAAA AAAAxx +5217 5273 1 1 7 17 17 217 1217 217 5217 34 35 RSAAAA VUHAAA HHHHxx +1405 5274 1 1 5 5 5 405 1405 1405 1405 10 11 BCAAAA WUHAAA OOOOxx +1494 5275 0 2 4 14 94 494 1494 1494 1494 188 189 MFAAAA XUHAAA VVVVxx +5553 5276 1 1 3 13 53 553 1553 553 5553 106 107 PFAAAA YUHAAA AAAAxx +8296 5277 0 0 6 16 96 296 296 3296 8296 192 193 CHAAAA ZUHAAA HHHHxx +6565 5278 1 1 5 5 65 565 565 1565 6565 130 131 NSAAAA AVHAAA OOOOxx +817 5279 1 1 7 17 17 817 817 817 817 34 35 LFAAAA BVHAAA VVVVxx +6947 5280 1 3 7 7 47 947 947 1947 6947 94 95 FHAAAA CVHAAA AAAAxx +4184 5281 0 0 4 4 84 184 184 4184 4184 168 169 YEAAAA DVHAAA HHHHxx +6577 5282 1 1 7 17 77 577 577 1577 6577 154 155 ZSAAAA EVHAAA OOOOxx +6424 5283 0 0 4 4 24 424 424 1424 6424 48 49 CNAAAA FVHAAA VVVVxx +2482 5284 0 2 2 2 82 482 482 2482 2482 164 165 MRAAAA GVHAAA AAAAxx +6874 5285 0 2 4 14 74 874 874 1874 6874 148 149 KEAAAA HVHAAA HHHHxx +7601 5286 1 1 1 1 1 601 1601 2601 7601 2 3 JGAAAA IVHAAA OOOOxx +4552 5287 0 0 2 12 52 552 552 4552 4552 104 105 CTAAAA JVHAAA VVVVxx +8406 5288 0 2 6 6 6 406 406 3406 8406 12 13 ILAAAA KVHAAA AAAAxx +2924 5289 0 0 4 4 24 924 924 2924 2924 48 49 MIAAAA LVHAAA HHHHxx +8255 5290 1 3 5 15 55 255 255 3255 8255 110 111 NFAAAA MVHAAA OOOOxx +4920 5291 0 0 0 0 20 920 920 4920 4920 40 41 GHAAAA NVHAAA VVVVxx +228 5292 0 0 8 8 28 228 228 228 228 56 57 UIAAAA OVHAAA AAAAxx +9431 5293 1 3 1 11 31 431 1431 4431 9431 62 63 TYAAAA PVHAAA HHHHxx +4021 5294 1 1 1 1 21 21 21 4021 4021 42 43 RYAAAA QVHAAA OOOOxx +2966 5295 0 2 6 6 66 966 966 2966 2966 132 133 CKAAAA RVHAAA VVVVxx +2862 5296 0 2 2 2 62 862 862 2862 2862 124 125 CGAAAA SVHAAA AAAAxx +4303 5297 1 3 3 3 3 303 303 4303 4303 6 7 NJAAAA TVHAAA HHHHxx +9643 5298 1 3 3 3 43 643 1643 4643 9643 86 87 XGAAAA UVHAAA OOOOxx +3008 5299 0 0 8 8 8 8 1008 3008 3008 16 17 SLAAAA VVHAAA VVVVxx +7476 5300 0 0 6 16 76 476 1476 2476 7476 152 153 OBAAAA WVHAAA AAAAxx +3686 5301 0 2 6 6 86 686 1686 3686 3686 172 173 ULAAAA XVHAAA HHHHxx +9051 5302 1 3 1 11 51 51 1051 4051 9051 102 103 DKAAAA YVHAAA OOOOxx +6592 5303 0 0 2 12 92 592 592 1592 6592 184 185 OTAAAA ZVHAAA VVVVxx +924 5304 0 0 4 4 24 924 924 924 924 48 49 OJAAAA AWHAAA AAAAxx +4406 5305 0 2 6 6 6 406 406 4406 4406 12 13 MNAAAA BWHAAA HHHHxx +5233 5306 1 1 3 13 33 233 1233 233 5233 66 67 HTAAAA CWHAAA OOOOxx +8881 5307 1 1 1 1 81 881 881 3881 8881 162 163 PDAAAA DWHAAA VVVVxx +2212 5308 0 0 2 12 12 212 212 2212 2212 24 25 CHAAAA EWHAAA AAAAxx +5804 5309 0 0 4 4 4 804 1804 804 5804 8 9 GPAAAA FWHAAA HHHHxx +2990 5310 0 2 0 10 90 990 990 2990 2990 180 181 ALAAAA GWHAAA OOOOxx +4069 5311 1 1 9 9 69 69 69 4069 4069 138 139 NAAAAA HWHAAA VVVVxx +5380 5312 0 0 0 0 80 380 1380 380 5380 160 161 YYAAAA IWHAAA AAAAxx +5016 5313 0 0 6 16 16 16 1016 16 5016 32 33 YKAAAA JWHAAA HHHHxx +5056 5314 0 0 6 16 56 56 1056 56 5056 112 113 MMAAAA KWHAAA OOOOxx +3732 5315 0 0 2 12 32 732 1732 3732 3732 64 65 ONAAAA LWHAAA VVVVxx +5527 5316 1 3 7 7 27 527 1527 527 5527 54 55 PEAAAA MWHAAA AAAAxx +1151 5317 1 3 1 11 51 151 1151 1151 1151 102 103 HSAAAA NWHAAA HHHHxx +7900 5318 0 0 0 0 0 900 1900 2900 7900 0 1 WRAAAA OWHAAA OOOOxx +1660 5319 0 0 0 0 60 660 1660 1660 1660 120 121 WLAAAA PWHAAA VVVVxx +8064 5320 0 0 4 4 64 64 64 3064 8064 128 129 EYAAAA QWHAAA AAAAxx +8240 5321 0 0 0 0 40 240 240 3240 8240 80 81 YEAAAA RWHAAA HHHHxx +413 5322 1 1 3 13 13 413 413 413 413 26 27 XPAAAA SWHAAA OOOOxx +8311 5323 1 3 1 11 11 311 311 3311 8311 22 23 RHAAAA TWHAAA VVVVxx +1065 5324 1 1 5 5 65 65 1065 1065 1065 130 131 ZOAAAA UWHAAA AAAAxx +2741 5325 1 1 1 1 41 741 741 2741 2741 82 83 LBAAAA VWHAAA HHHHxx +5306 5326 0 2 6 6 6 306 1306 306 5306 12 13 CWAAAA WWHAAA OOOOxx +5464 5327 0 0 4 4 64 464 1464 464 5464 128 129 ECAAAA XWHAAA VVVVxx +4237 5328 1 1 7 17 37 237 237 4237 4237 74 75 ZGAAAA YWHAAA AAAAxx +3822 5329 0 2 2 2 22 822 1822 3822 3822 44 45 ARAAAA ZWHAAA HHHHxx +2548 5330 0 0 8 8 48 548 548 2548 2548 96 97 AUAAAA AXHAAA OOOOxx +2688 5331 0 0 8 8 88 688 688 2688 2688 176 177 KZAAAA BXHAAA VVVVxx +8061 5332 1 1 1 1 61 61 61 3061 8061 122 123 BYAAAA CXHAAA AAAAxx +9340 5333 0 0 0 0 40 340 1340 4340 9340 80 81 GVAAAA DXHAAA HHHHxx +4031 5334 1 3 1 11 31 31 31 4031 4031 62 63 BZAAAA EXHAAA OOOOxx +2635 5335 1 3 5 15 35 635 635 2635 2635 70 71 JXAAAA FXHAAA VVVVxx +809 5336 1 1 9 9 9 809 809 809 809 18 19 DFAAAA GXHAAA AAAAxx +3209 5337 1 1 9 9 9 209 1209 3209 3209 18 19 LTAAAA HXHAAA HHHHxx +3825 5338 1 1 5 5 25 825 1825 3825 3825 50 51 DRAAAA IXHAAA OOOOxx +1448 5339 0 0 8 8 48 448 1448 1448 1448 96 97 SDAAAA JXHAAA VVVVxx +9077 5340 1 1 7 17 77 77 1077 4077 9077 154 155 DLAAAA KXHAAA AAAAxx +3730 5341 0 2 0 10 30 730 1730 3730 3730 60 61 MNAAAA LXHAAA HHHHxx +9596 5342 0 0 6 16 96 596 1596 4596 9596 192 193 CFAAAA MXHAAA OOOOxx +3563 5343 1 3 3 3 63 563 1563 3563 3563 126 127 BHAAAA NXHAAA VVVVxx +4116 5344 0 0 6 16 16 116 116 4116 4116 32 33 ICAAAA OXHAAA AAAAxx +4825 5345 1 1 5 5 25 825 825 4825 4825 50 51 PDAAAA PXHAAA HHHHxx +8376 5346 0 0 6 16 76 376 376 3376 8376 152 153 EKAAAA QXHAAA OOOOxx +3917 5347 1 1 7 17 17 917 1917 3917 3917 34 35 RUAAAA RXHAAA VVVVxx +4407 5348 1 3 7 7 7 407 407 4407 4407 14 15 NNAAAA SXHAAA AAAAxx +8202 5349 0 2 2 2 2 202 202 3202 8202 4 5 MDAAAA TXHAAA HHHHxx +7675 5350 1 3 5 15 75 675 1675 2675 7675 150 151 FJAAAA UXHAAA OOOOxx +4104 5351 0 0 4 4 4 104 104 4104 4104 8 9 WBAAAA VXHAAA VVVVxx +9225 5352 1 1 5 5 25 225 1225 4225 9225 50 51 VQAAAA WXHAAA AAAAxx +2834 5353 0 2 4 14 34 834 834 2834 2834 68 69 AFAAAA XXHAAA HHHHxx +1227 5354 1 3 7 7 27 227 1227 1227 1227 54 55 FVAAAA YXHAAA OOOOxx +3383 5355 1 3 3 3 83 383 1383 3383 3383 166 167 DAAAAA ZXHAAA VVVVxx +67 5356 1 3 7 7 67 67 67 67 67 134 135 PCAAAA AYHAAA AAAAxx +1751 5357 1 3 1 11 51 751 1751 1751 1751 102 103 JPAAAA BYHAAA HHHHxx +8054 5358 0 2 4 14 54 54 54 3054 8054 108 109 UXAAAA CYHAAA OOOOxx +8571 5359 1 3 1 11 71 571 571 3571 8571 142 143 RRAAAA DYHAAA VVVVxx +2466 5360 0 2 6 6 66 466 466 2466 2466 132 133 WQAAAA EYHAAA AAAAxx +9405 5361 1 1 5 5 5 405 1405 4405 9405 10 11 TXAAAA FYHAAA HHHHxx +6883 5362 1 3 3 3 83 883 883 1883 6883 166 167 TEAAAA GYHAAA OOOOxx +4301 5363 1 1 1 1 1 301 301 4301 4301 2 3 LJAAAA HYHAAA VVVVxx +3705 5364 1 1 5 5 5 705 1705 3705 3705 10 11 NMAAAA IYHAAA AAAAxx +5420 5365 0 0 0 0 20 420 1420 420 5420 40 41 MAAAAA JYHAAA HHHHxx +3692 5366 0 0 2 12 92 692 1692 3692 3692 184 185 AMAAAA KYHAAA OOOOxx +6851 5367 1 3 1 11 51 851 851 1851 6851 102 103 NDAAAA LYHAAA VVVVxx +9363 5368 1 3 3 3 63 363 1363 4363 9363 126 127 DWAAAA MYHAAA AAAAxx +2269 5369 1 1 9 9 69 269 269 2269 2269 138 139 HJAAAA NYHAAA HHHHxx +4918 5370 0 2 8 18 18 918 918 4918 4918 36 37 EHAAAA OYHAAA OOOOxx +4297 5371 1 1 7 17 97 297 297 4297 4297 194 195 HJAAAA PYHAAA VVVVxx +1836 5372 0 0 6 16 36 836 1836 1836 1836 72 73 QSAAAA QYHAAA AAAAxx +237 5373 1 1 7 17 37 237 237 237 237 74 75 DJAAAA RYHAAA HHHHxx +6131 5374 1 3 1 11 31 131 131 1131 6131 62 63 VBAAAA SYHAAA OOOOxx +3174 5375 0 2 4 14 74 174 1174 3174 3174 148 149 CSAAAA TYHAAA VVVVxx +9987 5376 1 3 7 7 87 987 1987 4987 9987 174 175 DUAAAA UYHAAA AAAAxx +3630 5377 0 2 0 10 30 630 1630 3630 3630 60 61 QJAAAA VYHAAA HHHHxx +2899 5378 1 3 9 19 99 899 899 2899 2899 198 199 NHAAAA WYHAAA OOOOxx +4079 5379 1 3 9 19 79 79 79 4079 4079 158 159 XAAAAA XYHAAA VVVVxx +5049 5380 1 1 9 9 49 49 1049 49 5049 98 99 FMAAAA YYHAAA AAAAxx +2963 5381 1 3 3 3 63 963 963 2963 2963 126 127 ZJAAAA ZYHAAA HHHHxx +3962 5382 0 2 2 2 62 962 1962 3962 3962 124 125 KWAAAA AZHAAA OOOOxx +7921 5383 1 1 1 1 21 921 1921 2921 7921 42 43 RSAAAA BZHAAA VVVVxx +3967 5384 1 3 7 7 67 967 1967 3967 3967 134 135 PWAAAA CZHAAA AAAAxx +2752 5385 0 0 2 12 52 752 752 2752 2752 104 105 WBAAAA DZHAAA HHHHxx +7944 5386 0 0 4 4 44 944 1944 2944 7944 88 89 OTAAAA EZHAAA OOOOxx +2205 5387 1 1 5 5 5 205 205 2205 2205 10 11 VGAAAA FZHAAA VVVVxx +5035 5388 1 3 5 15 35 35 1035 35 5035 70 71 RLAAAA GZHAAA AAAAxx +1425 5389 1 1 5 5 25 425 1425 1425 1425 50 51 VCAAAA HZHAAA HHHHxx +832 5390 0 0 2 12 32 832 832 832 832 64 65 AGAAAA IZHAAA OOOOxx +1447 5391 1 3 7 7 47 447 1447 1447 1447 94 95 RDAAAA JZHAAA VVVVxx +6108 5392 0 0 8 8 8 108 108 1108 6108 16 17 YAAAAA KZHAAA AAAAxx +4936 5393 0 0 6 16 36 936 936 4936 4936 72 73 WHAAAA LZHAAA HHHHxx +7704 5394 0 0 4 4 4 704 1704 2704 7704 8 9 IKAAAA MZHAAA OOOOxx +142 5395 0 2 2 2 42 142 142 142 142 84 85 MFAAAA NZHAAA VVVVxx +4272 5396 0 0 2 12 72 272 272 4272 4272 144 145 IIAAAA OZHAAA AAAAxx +7667 5397 1 3 7 7 67 667 1667 2667 7667 134 135 XIAAAA PZHAAA HHHHxx +366 5398 0 2 6 6 66 366 366 366 366 132 133 COAAAA QZHAAA OOOOxx +8866 5399 0 2 6 6 66 866 866 3866 8866 132 133 ADAAAA RZHAAA VVVVxx +7712 5400 0 0 2 12 12 712 1712 2712 7712 24 25 QKAAAA SZHAAA AAAAxx +3880 5401 0 0 0 0 80 880 1880 3880 3880 160 161 GTAAAA TZHAAA HHHHxx +4631 5402 1 3 1 11 31 631 631 4631 4631 62 63 DWAAAA UZHAAA OOOOxx +2789 5403 1 1 9 9 89 789 789 2789 2789 178 179 HDAAAA VZHAAA VVVVxx +7720 5404 0 0 0 0 20 720 1720 2720 7720 40 41 YKAAAA WZHAAA AAAAxx +7618 5405 0 2 8 18 18 618 1618 2618 7618 36 37 AHAAAA XZHAAA HHHHxx +4990 5406 0 2 0 10 90 990 990 4990 4990 180 181 YJAAAA YZHAAA OOOOxx +7918 5407 0 2 8 18 18 918 1918 2918 7918 36 37 OSAAAA ZZHAAA VVVVxx +5067 5408 1 3 7 7 67 67 1067 67 5067 134 135 XMAAAA AAIAAA AAAAxx +6370 5409 0 2 0 10 70 370 370 1370 6370 140 141 ALAAAA BAIAAA HHHHxx +2268 5410 0 0 8 8 68 268 268 2268 2268 136 137 GJAAAA CAIAAA OOOOxx +1949 5411 1 1 9 9 49 949 1949 1949 1949 98 99 ZWAAAA DAIAAA VVVVxx +5503 5412 1 3 3 3 3 503 1503 503 5503 6 7 RDAAAA EAIAAA AAAAxx +9951 5413 1 3 1 11 51 951 1951 4951 9951 102 103 TSAAAA FAIAAA HHHHxx +6823 5414 1 3 3 3 23 823 823 1823 6823 46 47 LCAAAA GAIAAA OOOOxx +6287 5415 1 3 7 7 87 287 287 1287 6287 174 175 VHAAAA HAIAAA VVVVxx +6016 5416 0 0 6 16 16 16 16 1016 6016 32 33 KXAAAA IAIAAA AAAAxx +1977 5417 1 1 7 17 77 977 1977 1977 1977 154 155 BYAAAA JAIAAA HHHHxx +8579 5418 1 3 9 19 79 579 579 3579 8579 158 159 ZRAAAA KAIAAA OOOOxx +6204 5419 0 0 4 4 4 204 204 1204 6204 8 9 QEAAAA LAIAAA VVVVxx +9764 5420 0 0 4 4 64 764 1764 4764 9764 128 129 OLAAAA MAIAAA AAAAxx +2005 5421 1 1 5 5 5 5 5 2005 2005 10 11 DZAAAA NAIAAA HHHHxx +1648 5422 0 0 8 8 48 648 1648 1648 1648 96 97 KLAAAA OAIAAA OOOOxx +2457 5423 1 1 7 17 57 457 457 2457 2457 114 115 NQAAAA PAIAAA VVVVxx +2698 5424 0 2 8 18 98 698 698 2698 2698 196 197 UZAAAA QAIAAA AAAAxx +7730 5425 0 2 0 10 30 730 1730 2730 7730 60 61 ILAAAA RAIAAA HHHHxx +7287 5426 1 3 7 7 87 287 1287 2287 7287 174 175 HUAAAA SAIAAA OOOOxx +2937 5427 1 1 7 17 37 937 937 2937 2937 74 75 ZIAAAA TAIAAA VVVVxx +6824 5428 0 0 4 4 24 824 824 1824 6824 48 49 MCAAAA UAIAAA AAAAxx +9256 5429 0 0 6 16 56 256 1256 4256 9256 112 113 ASAAAA VAIAAA HHHHxx +4810 5430 0 2 0 10 10 810 810 4810 4810 20 21 ADAAAA WAIAAA OOOOxx +3869 5431 1 1 9 9 69 869 1869 3869 3869 138 139 VSAAAA XAIAAA VVVVxx +1993 5432 1 1 3 13 93 993 1993 1993 1993 186 187 RYAAAA YAIAAA AAAAxx +6048 5433 0 0 8 8 48 48 48 1048 6048 96 97 QYAAAA ZAIAAA HHHHxx +6922 5434 0 2 2 2 22 922 922 1922 6922 44 45 GGAAAA ABIAAA OOOOxx +8 5435 0 0 8 8 8 8 8 8 8 16 17 IAAAAA BBIAAA VVVVxx +6706 5436 0 2 6 6 6 706 706 1706 6706 12 13 YXAAAA CBIAAA AAAAxx +9159 5437 1 3 9 19 59 159 1159 4159 9159 118 119 HOAAAA DBIAAA HHHHxx +7020 5438 0 0 0 0 20 20 1020 2020 7020 40 41 AKAAAA EBIAAA OOOOxx +767 5439 1 3 7 7 67 767 767 767 767 134 135 NDAAAA FBIAAA VVVVxx +8602 5440 0 2 2 2 2 602 602 3602 8602 4 5 WSAAAA GBIAAA AAAAxx +4442 5441 0 2 2 2 42 442 442 4442 4442 84 85 WOAAAA HBIAAA HHHHxx +2040 5442 0 0 0 0 40 40 40 2040 2040 80 81 MAAAAA IBIAAA OOOOxx +5493 5443 1 1 3 13 93 493 1493 493 5493 186 187 HDAAAA JBIAAA VVVVxx +275 5444 1 3 5 15 75 275 275 275 275 150 151 PKAAAA KBIAAA AAAAxx +8876 5445 0 0 6 16 76 876 876 3876 8876 152 153 KDAAAA LBIAAA HHHHxx +7381 5446 1 1 1 1 81 381 1381 2381 7381 162 163 XXAAAA MBIAAA OOOOxx +1827 5447 1 3 7 7 27 827 1827 1827 1827 54 55 HSAAAA NBIAAA VVVVxx +3537 5448 1 1 7 17 37 537 1537 3537 3537 74 75 BGAAAA OBIAAA AAAAxx +6978 5449 0 2 8 18 78 978 978 1978 6978 156 157 KIAAAA PBIAAA HHHHxx +6160 5450 0 0 0 0 60 160 160 1160 6160 120 121 YCAAAA QBIAAA OOOOxx +9219 5451 1 3 9 19 19 219 1219 4219 9219 38 39 PQAAAA RBIAAA VVVVxx +5034 5452 0 2 4 14 34 34 1034 34 5034 68 69 QLAAAA SBIAAA AAAAxx +8463 5453 1 3 3 3 63 463 463 3463 8463 126 127 NNAAAA TBIAAA HHHHxx +2038 5454 0 2 8 18 38 38 38 2038 2038 76 77 KAAAAA UBIAAA OOOOxx +9562 5455 0 2 2 2 62 562 1562 4562 9562 124 125 UDAAAA VBIAAA VVVVxx +2687 5456 1 3 7 7 87 687 687 2687 2687 174 175 JZAAAA WBIAAA AAAAxx +5092 5457 0 0 2 12 92 92 1092 92 5092 184 185 WNAAAA XBIAAA HHHHxx +539 5458 1 3 9 19 39 539 539 539 539 78 79 TUAAAA YBIAAA OOOOxx +2139 5459 1 3 9 19 39 139 139 2139 2139 78 79 HEAAAA ZBIAAA VVVVxx +9221 5460 1 1 1 1 21 221 1221 4221 9221 42 43 RQAAAA ACIAAA AAAAxx +965 5461 1 1 5 5 65 965 965 965 965 130 131 DLAAAA BCIAAA HHHHxx +6051 5462 1 3 1 11 51 51 51 1051 6051 102 103 TYAAAA CCIAAA OOOOxx +5822 5463 0 2 2 2 22 822 1822 822 5822 44 45 YPAAAA DCIAAA VVVVxx +6397 5464 1 1 7 17 97 397 397 1397 6397 194 195 BMAAAA ECIAAA AAAAxx +2375 5465 1 3 5 15 75 375 375 2375 2375 150 151 JNAAAA FCIAAA HHHHxx +9415 5466 1 3 5 15 15 415 1415 4415 9415 30 31 DYAAAA GCIAAA OOOOxx +6552 5467 0 0 2 12 52 552 552 1552 6552 104 105 ASAAAA HCIAAA VVVVxx +2248 5468 0 0 8 8 48 248 248 2248 2248 96 97 MIAAAA ICIAAA AAAAxx +2611 5469 1 3 1 11 11 611 611 2611 2611 22 23 LWAAAA JCIAAA HHHHxx +9609 5470 1 1 9 9 9 609 1609 4609 9609 18 19 PFAAAA KCIAAA OOOOxx +2132 5471 0 0 2 12 32 132 132 2132 2132 64 65 AEAAAA LCIAAA VVVVxx +8452 5472 0 0 2 12 52 452 452 3452 8452 104 105 CNAAAA MCIAAA AAAAxx +9407 5473 1 3 7 7 7 407 1407 4407 9407 14 15 VXAAAA NCIAAA HHHHxx +2814 5474 0 2 4 14 14 814 814 2814 2814 28 29 GEAAAA OCIAAA OOOOxx +1889 5475 1 1 9 9 89 889 1889 1889 1889 178 179 RUAAAA PCIAAA VVVVxx +7489 5476 1 1 9 9 89 489 1489 2489 7489 178 179 BCAAAA QCIAAA AAAAxx +2255 5477 1 3 5 15 55 255 255 2255 2255 110 111 TIAAAA RCIAAA HHHHxx +3380 5478 0 0 0 0 80 380 1380 3380 3380 160 161 AAAAAA SCIAAA OOOOxx +1167 5479 1 3 7 7 67 167 1167 1167 1167 134 135 XSAAAA TCIAAA VVVVxx +5369 5480 1 1 9 9 69 369 1369 369 5369 138 139 NYAAAA UCIAAA AAAAxx +2378 5481 0 2 8 18 78 378 378 2378 2378 156 157 MNAAAA VCIAAA HHHHxx +8315 5482 1 3 5 15 15 315 315 3315 8315 30 31 VHAAAA WCIAAA OOOOxx +2934 5483 0 2 4 14 34 934 934 2934 2934 68 69 WIAAAA XCIAAA VVVVxx +7924 5484 0 0 4 4 24 924 1924 2924 7924 48 49 USAAAA YCIAAA AAAAxx +2867 5485 1 3 7 7 67 867 867 2867 2867 134 135 HGAAAA ZCIAAA HHHHxx +9141 5486 1 1 1 1 41 141 1141 4141 9141 82 83 PNAAAA ADIAAA OOOOxx +3613 5487 1 1 3 13 13 613 1613 3613 3613 26 27 ZIAAAA BDIAAA VVVVxx +2461 5488 1 1 1 1 61 461 461 2461 2461 122 123 RQAAAA CDIAAA AAAAxx +4567 5489 1 3 7 7 67 567 567 4567 4567 134 135 RTAAAA DDIAAA HHHHxx +2906 5490 0 2 6 6 6 906 906 2906 2906 12 13 UHAAAA EDIAAA OOOOxx +4848 5491 0 0 8 8 48 848 848 4848 4848 96 97 MEAAAA FDIAAA VVVVxx +6614 5492 0 2 4 14 14 614 614 1614 6614 28 29 KUAAAA GDIAAA AAAAxx +6200 5493 0 0 0 0 0 200 200 1200 6200 0 1 MEAAAA HDIAAA HHHHxx +7895 5494 1 3 5 15 95 895 1895 2895 7895 190 191 RRAAAA IDIAAA OOOOxx +6829 5495 1 1 9 9 29 829 829 1829 6829 58 59 RCAAAA JDIAAA VVVVxx +4087 5496 1 3 7 7 87 87 87 4087 4087 174 175 FBAAAA KDIAAA AAAAxx +8787 5497 1 3 7 7 87 787 787 3787 8787 174 175 ZZAAAA LDIAAA HHHHxx +3322 5498 0 2 2 2 22 322 1322 3322 3322 44 45 UXAAAA MDIAAA OOOOxx +9091 5499 1 3 1 11 91 91 1091 4091 9091 182 183 RLAAAA NDIAAA VVVVxx +5268 5500 0 0 8 8 68 268 1268 268 5268 136 137 QUAAAA ODIAAA AAAAxx +2719 5501 1 3 9 19 19 719 719 2719 2719 38 39 PAAAAA PDIAAA HHHHxx +30 5502 0 2 0 10 30 30 30 30 30 60 61 EBAAAA QDIAAA OOOOxx +1975 5503 1 3 5 15 75 975 1975 1975 1975 150 151 ZXAAAA RDIAAA VVVVxx +2641 5504 1 1 1 1 41 641 641 2641 2641 82 83 PXAAAA SDIAAA AAAAxx +8616 5505 0 0 6 16 16 616 616 3616 8616 32 33 KTAAAA TDIAAA HHHHxx +5980 5506 0 0 0 0 80 980 1980 980 5980 160 161 AWAAAA UDIAAA OOOOxx +5170 5507 0 2 0 10 70 170 1170 170 5170 140 141 WQAAAA VDIAAA VVVVxx +1960 5508 0 0 0 0 60 960 1960 1960 1960 120 121 KXAAAA WDIAAA AAAAxx +8141 5509 1 1 1 1 41 141 141 3141 8141 82 83 DBAAAA XDIAAA HHHHxx +6692 5510 0 0 2 12 92 692 692 1692 6692 184 185 KXAAAA YDIAAA OOOOxx +7621 5511 1 1 1 1 21 621 1621 2621 7621 42 43 DHAAAA ZDIAAA VVVVxx +3890 5512 0 2 0 10 90 890 1890 3890 3890 180 181 QTAAAA AEIAAA AAAAxx +4300 5513 0 0 0 0 0 300 300 4300 4300 0 1 KJAAAA BEIAAA HHHHxx +736 5514 0 0 6 16 36 736 736 736 736 72 73 ICAAAA CEIAAA OOOOxx +6626 5515 0 2 6 6 26 626 626 1626 6626 52 53 WUAAAA DEIAAA VVVVxx +1800 5516 0 0 0 0 0 800 1800 1800 1800 0 1 GRAAAA EEIAAA AAAAxx +3430 5517 0 2 0 10 30 430 1430 3430 3430 60 61 YBAAAA FEIAAA HHHHxx +9519 5518 1 3 9 19 19 519 1519 4519 9519 38 39 DCAAAA GEIAAA OOOOxx +5111 5519 1 3 1 11 11 111 1111 111 5111 22 23 POAAAA HEIAAA VVVVxx +6915 5520 1 3 5 15 15 915 915 1915 6915 30 31 ZFAAAA IEIAAA AAAAxx +9246 5521 0 2 6 6 46 246 1246 4246 9246 92 93 QRAAAA JEIAAA HHHHxx +5141 5522 1 1 1 1 41 141 1141 141 5141 82 83 TPAAAA KEIAAA OOOOxx +5922 5523 0 2 2 2 22 922 1922 922 5922 44 45 UTAAAA LEIAAA VVVVxx +3087 5524 1 3 7 7 87 87 1087 3087 3087 174 175 TOAAAA MEIAAA AAAAxx +1859 5525 1 3 9 19 59 859 1859 1859 1859 118 119 NTAAAA NEIAAA HHHHxx +8482 5526 0 2 2 2 82 482 482 3482 8482 164 165 GOAAAA OEIAAA OOOOxx +8414 5527 0 2 4 14 14 414 414 3414 8414 28 29 QLAAAA PEIAAA VVVVxx +6662 5528 0 2 2 2 62 662 662 1662 6662 124 125 GWAAAA QEIAAA AAAAxx +8614 5529 0 2 4 14 14 614 614 3614 8614 28 29 ITAAAA REIAAA HHHHxx +42 5530 0 2 2 2 42 42 42 42 42 84 85 QBAAAA SEIAAA OOOOxx +7582 5531 0 2 2 2 82 582 1582 2582 7582 164 165 QFAAAA TEIAAA VVVVxx +8183 5532 1 3 3 3 83 183 183 3183 8183 166 167 TCAAAA UEIAAA AAAAxx +1299 5533 1 3 9 19 99 299 1299 1299 1299 198 199 ZXAAAA VEIAAA HHHHxx +7004 5534 0 0 4 4 4 4 1004 2004 7004 8 9 KJAAAA WEIAAA OOOOxx +3298 5535 0 2 8 18 98 298 1298 3298 3298 196 197 WWAAAA XEIAAA VVVVxx +7884 5536 0 0 4 4 84 884 1884 2884 7884 168 169 GRAAAA YEIAAA AAAAxx +4191 5537 1 3 1 11 91 191 191 4191 4191 182 183 FFAAAA ZEIAAA HHHHxx +7346 5538 0 2 6 6 46 346 1346 2346 7346 92 93 OWAAAA AFIAAA OOOOxx +7989 5539 1 1 9 9 89 989 1989 2989 7989 178 179 HVAAAA BFIAAA VVVVxx +5719 5540 1 3 9 19 19 719 1719 719 5719 38 39 ZLAAAA CFIAAA AAAAxx +800 5541 0 0 0 0 0 800 800 800 800 0 1 UEAAAA DFIAAA HHHHxx +6509 5542 1 1 9 9 9 509 509 1509 6509 18 19 JQAAAA EFIAAA OOOOxx +4672 5543 0 0 2 12 72 672 672 4672 4672 144 145 SXAAAA FFIAAA VVVVxx +4434 5544 0 2 4 14 34 434 434 4434 4434 68 69 OOAAAA GFIAAA AAAAxx +8309 5545 1 1 9 9 9 309 309 3309 8309 18 19 PHAAAA HFIAAA HHHHxx +5134 5546 0 2 4 14 34 134 1134 134 5134 68 69 MPAAAA IFIAAA OOOOxx +5153 5547 1 1 3 13 53 153 1153 153 5153 106 107 FQAAAA JFIAAA VVVVxx +1522 5548 0 2 2 2 22 522 1522 1522 1522 44 45 OGAAAA KFIAAA AAAAxx +8629 5549 1 1 9 9 29 629 629 3629 8629 58 59 XTAAAA LFIAAA HHHHxx +4549 5550 1 1 9 9 49 549 549 4549 4549 98 99 ZSAAAA MFIAAA OOOOxx +9506 5551 0 2 6 6 6 506 1506 4506 9506 12 13 QBAAAA NFIAAA VVVVxx +6542 5552 0 2 2 2 42 542 542 1542 6542 84 85 QRAAAA OFIAAA AAAAxx +2579 5553 1 3 9 19 79 579 579 2579 2579 158 159 FVAAAA PFIAAA HHHHxx +4664 5554 0 0 4 4 64 664 664 4664 4664 128 129 KXAAAA QFIAAA OOOOxx +696 5555 0 0 6 16 96 696 696 696 696 192 193 UAAAAA RFIAAA VVVVxx +7950 5556 0 2 0 10 50 950 1950 2950 7950 100 101 UTAAAA SFIAAA AAAAxx +5 5557 1 1 5 5 5 5 5 5 5 10 11 FAAAAA TFIAAA HHHHxx +7806 5558 0 2 6 6 6 806 1806 2806 7806 12 13 GOAAAA UFIAAA OOOOxx +2770 5559 0 2 0 10 70 770 770 2770 2770 140 141 OCAAAA VFIAAA VVVVxx +1344 5560 0 0 4 4 44 344 1344 1344 1344 88 89 SZAAAA WFIAAA AAAAxx +511 5561 1 3 1 11 11 511 511 511 511 22 23 RTAAAA XFIAAA HHHHxx +9070 5562 0 2 0 10 70 70 1070 4070 9070 140 141 WKAAAA YFIAAA OOOOxx +2961 5563 1 1 1 1 61 961 961 2961 2961 122 123 XJAAAA ZFIAAA VVVVxx +8031 5564 1 3 1 11 31 31 31 3031 8031 62 63 XWAAAA AGIAAA AAAAxx +326 5565 0 2 6 6 26 326 326 326 326 52 53 OMAAAA BGIAAA HHHHxx +183 5566 1 3 3 3 83 183 183 183 183 166 167 BHAAAA CGIAAA OOOOxx +5917 5567 1 1 7 17 17 917 1917 917 5917 34 35 PTAAAA DGIAAA VVVVxx +8256 5568 0 0 6 16 56 256 256 3256 8256 112 113 OFAAAA EGIAAA AAAAxx +7889 5569 1 1 9 9 89 889 1889 2889 7889 178 179 LRAAAA FGIAAA HHHHxx +9029 5570 1 1 9 9 29 29 1029 4029 9029 58 59 HJAAAA GGIAAA OOOOxx +1316 5571 0 0 6 16 16 316 1316 1316 1316 32 33 QYAAAA HGIAAA VVVVxx +7442 5572 0 2 2 2 42 442 1442 2442 7442 84 85 GAAAAA IGIAAA AAAAxx +2810 5573 0 2 0 10 10 810 810 2810 2810 20 21 CEAAAA JGIAAA HHHHxx +20 5574 0 0 0 0 20 20 20 20 20 40 41 UAAAAA KGIAAA OOOOxx +2306 5575 0 2 6 6 6 306 306 2306 2306 12 13 SKAAAA LGIAAA VVVVxx +4694 5576 0 2 4 14 94 694 694 4694 4694 188 189 OYAAAA MGIAAA AAAAxx +9710 5577 0 2 0 10 10 710 1710 4710 9710 20 21 MJAAAA NGIAAA HHHHxx +1791 5578 1 3 1 11 91 791 1791 1791 1791 182 183 XQAAAA OGIAAA OOOOxx +6730 5579 0 2 0 10 30 730 730 1730 6730 60 61 WYAAAA PGIAAA VVVVxx +359 5580 1 3 9 19 59 359 359 359 359 118 119 VNAAAA QGIAAA AAAAxx +8097 5581 1 1 7 17 97 97 97 3097 8097 194 195 LZAAAA RGIAAA HHHHxx +6147 5582 1 3 7 7 47 147 147 1147 6147 94 95 LCAAAA SGIAAA OOOOxx +643 5583 1 3 3 3 43 643 643 643 643 86 87 TYAAAA TGIAAA VVVVxx +698 5584 0 2 8 18 98 698 698 698 698 196 197 WAAAAA UGIAAA AAAAxx +3881 5585 1 1 1 1 81 881 1881 3881 3881 162 163 HTAAAA VGIAAA HHHHxx +7600 5586 0 0 0 0 0 600 1600 2600 7600 0 1 IGAAAA WGIAAA OOOOxx +1583 5587 1 3 3 3 83 583 1583 1583 1583 166 167 XIAAAA XGIAAA VVVVxx +9612 5588 0 0 2 12 12 612 1612 4612 9612 24 25 SFAAAA YGIAAA AAAAxx +1032 5589 0 0 2 12 32 32 1032 1032 1032 64 65 SNAAAA ZGIAAA HHHHxx +4834 5590 0 2 4 14 34 834 834 4834 4834 68 69 YDAAAA AHIAAA OOOOxx +5076 5591 0 0 6 16 76 76 1076 76 5076 152 153 GNAAAA BHIAAA VVVVxx +3070 5592 0 2 0 10 70 70 1070 3070 3070 140 141 COAAAA CHIAAA AAAAxx +1421 5593 1 1 1 1 21 421 1421 1421 1421 42 43 RCAAAA DHIAAA HHHHxx +8970 5594 0 2 0 10 70 970 970 3970 8970 140 141 AHAAAA EHIAAA OOOOxx +6271 5595 1 3 1 11 71 271 271 1271 6271 142 143 FHAAAA FHIAAA VVVVxx +8547 5596 1 3 7 7 47 547 547 3547 8547 94 95 TQAAAA GHIAAA AAAAxx +1259 5597 1 3 9 19 59 259 1259 1259 1259 118 119 LWAAAA HHIAAA HHHHxx +8328 5598 0 0 8 8 28 328 328 3328 8328 56 57 IIAAAA IHIAAA OOOOxx +1503 5599 1 3 3 3 3 503 1503 1503 1503 6 7 VFAAAA JHIAAA VVVVxx +2253 5600 1 1 3 13 53 253 253 2253 2253 106 107 RIAAAA KHIAAA AAAAxx +7449 5601 1 1 9 9 49 449 1449 2449 7449 98 99 NAAAAA LHIAAA HHHHxx +3579 5602 1 3 9 19 79 579 1579 3579 3579 158 159 RHAAAA MHIAAA OOOOxx +1585 5603 1 1 5 5 85 585 1585 1585 1585 170 171 ZIAAAA NHIAAA VVVVxx +5543 5604 1 3 3 3 43 543 1543 543 5543 86 87 FFAAAA OHIAAA AAAAxx +8627 5605 1 3 7 7 27 627 627 3627 8627 54 55 VTAAAA PHIAAA HHHHxx +8618 5606 0 2 8 18 18 618 618 3618 8618 36 37 MTAAAA QHIAAA OOOOxx +1911 5607 1 3 1 11 11 911 1911 1911 1911 22 23 NVAAAA RHIAAA VVVVxx +2758 5608 0 2 8 18 58 758 758 2758 2758 116 117 CCAAAA SHIAAA AAAAxx +5744 5609 0 0 4 4 44 744 1744 744 5744 88 89 YMAAAA THIAAA HHHHxx +4976 5610 0 0 6 16 76 976 976 4976 4976 152 153 KJAAAA UHIAAA OOOOxx +6380 5611 0 0 0 0 80 380 380 1380 6380 160 161 KLAAAA VHIAAA VVVVxx +1937 5612 1 1 7 17 37 937 1937 1937 1937 74 75 NWAAAA WHIAAA AAAAxx +9903 5613 1 3 3 3 3 903 1903 4903 9903 6 7 XQAAAA XHIAAA HHHHxx +4409 5614 1 1 9 9 9 409 409 4409 4409 18 19 PNAAAA YHIAAA OOOOxx +4133 5615 1 1 3 13 33 133 133 4133 4133 66 67 ZCAAAA ZHIAAA VVVVxx +5263 5616 1 3 3 3 63 263 1263 263 5263 126 127 LUAAAA AIIAAA AAAAxx +7888 5617 0 0 8 8 88 888 1888 2888 7888 176 177 KRAAAA BIIAAA HHHHxx +6060 5618 0 0 0 0 60 60 60 1060 6060 120 121 CZAAAA CIIAAA OOOOxx +2522 5619 0 2 2 2 22 522 522 2522 2522 44 45 ATAAAA DIIAAA VVVVxx +5550 5620 0 2 0 10 50 550 1550 550 5550 100 101 MFAAAA EIIAAA AAAAxx +9396 5621 0 0 6 16 96 396 1396 4396 9396 192 193 KXAAAA FIIAAA HHHHxx +176 5622 0 0 6 16 76 176 176 176 176 152 153 UGAAAA GIIAAA OOOOxx +5148 5623 0 0 8 8 48 148 1148 148 5148 96 97 AQAAAA HIIAAA VVVVxx +6691 5624 1 3 1 11 91 691 691 1691 6691 182 183 JXAAAA IIIAAA AAAAxx +4652 5625 0 0 2 12 52 652 652 4652 4652 104 105 YWAAAA JIIAAA HHHHxx +5096 5626 0 0 6 16 96 96 1096 96 5096 192 193 AOAAAA KIIAAA OOOOxx +2408 5627 0 0 8 8 8 408 408 2408 2408 16 17 QOAAAA LIIAAA VVVVxx +7322 5628 0 2 2 2 22 322 1322 2322 7322 44 45 QVAAAA MIIAAA AAAAxx +6782 5629 0 2 2 2 82 782 782 1782 6782 164 165 WAAAAA NIIAAA HHHHxx +4642 5630 0 2 2 2 42 642 642 4642 4642 84 85 OWAAAA OIIAAA OOOOxx +5427 5631 1 3 7 7 27 427 1427 427 5427 54 55 TAAAAA PIIAAA VVVVxx +4461 5632 1 1 1 1 61 461 461 4461 4461 122 123 PPAAAA QIIAAA AAAAxx +8416 5633 0 0 6 16 16 416 416 3416 8416 32 33 SLAAAA RIIAAA HHHHxx +2593 5634 1 1 3 13 93 593 593 2593 2593 186 187 TVAAAA SIIAAA OOOOxx +6202 5635 0 2 2 2 2 202 202 1202 6202 4 5 OEAAAA TIIAAA VVVVxx +3826 5636 0 2 6 6 26 826 1826 3826 3826 52 53 ERAAAA UIIAAA AAAAxx +4417 5637 1 1 7 17 17 417 417 4417 4417 34 35 XNAAAA VIIAAA HHHHxx +7871 5638 1 3 1 11 71 871 1871 2871 7871 142 143 TQAAAA WIIAAA OOOOxx +5622 5639 0 2 2 2 22 622 1622 622 5622 44 45 GIAAAA XIIAAA VVVVxx +3010 5640 0 2 0 10 10 10 1010 3010 3010 20 21 ULAAAA YIIAAA AAAAxx +3407 5641 1 3 7 7 7 407 1407 3407 3407 14 15 BBAAAA ZIIAAA HHHHxx +1274 5642 0 2 4 14 74 274 1274 1274 1274 148 149 AXAAAA AJIAAA OOOOxx +2828 5643 0 0 8 8 28 828 828 2828 2828 56 57 UEAAAA BJIAAA VVVVxx +3427 5644 1 3 7 7 27 427 1427 3427 3427 54 55 VBAAAA CJIAAA AAAAxx +612 5645 0 0 2 12 12 612 612 612 612 24 25 OXAAAA DJIAAA HHHHxx +8729 5646 1 1 9 9 29 729 729 3729 8729 58 59 TXAAAA EJIAAA OOOOxx +1239 5647 1 3 9 19 39 239 1239 1239 1239 78 79 RVAAAA FJIAAA VVVVxx +8990 5648 0 2 0 10 90 990 990 3990 8990 180 181 UHAAAA GJIAAA AAAAxx +5609 5649 1 1 9 9 9 609 1609 609 5609 18 19 THAAAA HJIAAA HHHHxx +4441 5650 1 1 1 1 41 441 441 4441 4441 82 83 VOAAAA IJIAAA OOOOxx +9078 5651 0 2 8 18 78 78 1078 4078 9078 156 157 ELAAAA JJIAAA VVVVxx +6699 5652 1 3 9 19 99 699 699 1699 6699 198 199 RXAAAA KJIAAA AAAAxx +8390 5653 0 2 0 10 90 390 390 3390 8390 180 181 SKAAAA LJIAAA HHHHxx +5455 5654 1 3 5 15 55 455 1455 455 5455 110 111 VBAAAA MJIAAA OOOOxx +7537 5655 1 1 7 17 37 537 1537 2537 7537 74 75 XDAAAA NJIAAA VVVVxx +4669 5656 1 1 9 9 69 669 669 4669 4669 138 139 PXAAAA OJIAAA AAAAxx +5534 5657 0 2 4 14 34 534 1534 534 5534 68 69 WEAAAA PJIAAA HHHHxx +1920 5658 0 0 0 0 20 920 1920 1920 1920 40 41 WVAAAA QJIAAA OOOOxx +9465 5659 1 1 5 5 65 465 1465 4465 9465 130 131 BAAAAA RJIAAA VVVVxx +4897 5660 1 1 7 17 97 897 897 4897 4897 194 195 JGAAAA SJIAAA AAAAxx +1990 5661 0 2 0 10 90 990 1990 1990 1990 180 181 OYAAAA TJIAAA HHHHxx +7148 5662 0 0 8 8 48 148 1148 2148 7148 96 97 YOAAAA UJIAAA OOOOxx +533 5663 1 1 3 13 33 533 533 533 533 66 67 NUAAAA VJIAAA VVVVxx +4339 5664 1 3 9 19 39 339 339 4339 4339 78 79 XKAAAA WJIAAA AAAAxx +6450 5665 0 2 0 10 50 450 450 1450 6450 100 101 COAAAA XJIAAA HHHHxx +9627 5666 1 3 7 7 27 627 1627 4627 9627 54 55 HGAAAA YJIAAA OOOOxx +5539 5667 1 3 9 19 39 539 1539 539 5539 78 79 BFAAAA ZJIAAA VVVVxx +6758 5668 0 2 8 18 58 758 758 1758 6758 116 117 YZAAAA AKIAAA AAAAxx +3435 5669 1 3 5 15 35 435 1435 3435 3435 70 71 DCAAAA BKIAAA HHHHxx +4350 5670 0 2 0 10 50 350 350 4350 4350 100 101 ILAAAA CKIAAA OOOOxx +9088 5671 0 0 8 8 88 88 1088 4088 9088 176 177 OLAAAA DKIAAA VVVVxx +6368 5672 0 0 8 8 68 368 368 1368 6368 136 137 YKAAAA EKIAAA AAAAxx +6337 5673 1 1 7 17 37 337 337 1337 6337 74 75 TJAAAA FKIAAA HHHHxx +4361 5674 1 1 1 1 61 361 361 4361 4361 122 123 TLAAAA GKIAAA OOOOxx +1719 5675 1 3 9 19 19 719 1719 1719 1719 38 39 DOAAAA HKIAAA VVVVxx +3109 5676 1 1 9 9 9 109 1109 3109 3109 18 19 PPAAAA IKIAAA AAAAxx +7135 5677 1 3 5 15 35 135 1135 2135 7135 70 71 LOAAAA JKIAAA HHHHxx +1964 5678 0 0 4 4 64 964 1964 1964 1964 128 129 OXAAAA KKIAAA OOOOxx +3 5679 1 3 3 3 3 3 3 3 3 6 7 DAAAAA LKIAAA VVVVxx +1868 5680 0 0 8 8 68 868 1868 1868 1868 136 137 WTAAAA MKIAAA AAAAxx +5182 5681 0 2 2 2 82 182 1182 182 5182 164 165 IRAAAA NKIAAA HHHHxx +7567 5682 1 3 7 7 67 567 1567 2567 7567 134 135 BFAAAA OKIAAA OOOOxx +3676 5683 0 0 6 16 76 676 1676 3676 3676 152 153 KLAAAA PKIAAA VVVVxx +9382 5684 0 2 2 2 82 382 1382 4382 9382 164 165 WWAAAA QKIAAA AAAAxx +8645 5685 1 1 5 5 45 645 645 3645 8645 90 91 NUAAAA RKIAAA HHHHxx +2018 5686 0 2 8 18 18 18 18 2018 2018 36 37 QZAAAA SKIAAA OOOOxx +217 5687 1 1 7 17 17 217 217 217 217 34 35 JIAAAA TKIAAA VVVVxx +6793 5688 1 1 3 13 93 793 793 1793 6793 186 187 HBAAAA UKIAAA AAAAxx +7280 5689 0 0 0 0 80 280 1280 2280 7280 160 161 AUAAAA VKIAAA HHHHxx +2168 5690 0 0 8 8 68 168 168 2168 2168 136 137 KFAAAA WKIAAA OOOOxx +5259 5691 1 3 9 19 59 259 1259 259 5259 118 119 HUAAAA XKIAAA VVVVxx +6019 5692 1 3 9 19 19 19 19 1019 6019 38 39 NXAAAA YKIAAA AAAAxx +877 5693 1 1 7 17 77 877 877 877 877 154 155 THAAAA ZKIAAA HHHHxx +4961 5694 1 1 1 1 61 961 961 4961 4961 122 123 VIAAAA ALIAAA OOOOxx +1873 5695 1 1 3 13 73 873 1873 1873 1873 146 147 BUAAAA BLIAAA VVVVxx +13 5696 1 1 3 13 13 13 13 13 13 26 27 NAAAAA CLIAAA AAAAxx +1537 5697 1 1 7 17 37 537 1537 1537 1537 74 75 DHAAAA DLIAAA HHHHxx +3129 5698 1 1 9 9 29 129 1129 3129 3129 58 59 JQAAAA ELIAAA OOOOxx +6473 5699 1 1 3 13 73 473 473 1473 6473 146 147 ZOAAAA FLIAAA VVVVxx +7865 5700 1 1 5 5 65 865 1865 2865 7865 130 131 NQAAAA GLIAAA AAAAxx +7822 5701 0 2 2 2 22 822 1822 2822 7822 44 45 WOAAAA HLIAAA HHHHxx +239 5702 1 3 9 19 39 239 239 239 239 78 79 FJAAAA ILIAAA OOOOxx +2062 5703 0 2 2 2 62 62 62 2062 2062 124 125 IBAAAA JLIAAA VVVVxx +762 5704 0 2 2 2 62 762 762 762 762 124 125 IDAAAA KLIAAA AAAAxx +3764 5705 0 0 4 4 64 764 1764 3764 3764 128 129 UOAAAA LLIAAA HHHHxx +465 5706 1 1 5 5 65 465 465 465 465 130 131 XRAAAA MLIAAA OOOOxx +2587 5707 1 3 7 7 87 587 587 2587 2587 174 175 NVAAAA NLIAAA VVVVxx +8402 5708 0 2 2 2 2 402 402 3402 8402 4 5 ELAAAA OLIAAA AAAAxx +1055 5709 1 3 5 15 55 55 1055 1055 1055 110 111 POAAAA PLIAAA HHHHxx +3072 5710 0 0 2 12 72 72 1072 3072 3072 144 145 EOAAAA QLIAAA OOOOxx +7359 5711 1 3 9 19 59 359 1359 2359 7359 118 119 BXAAAA RLIAAA VVVVxx +6558 5712 0 2 8 18 58 558 558 1558 6558 116 117 GSAAAA SLIAAA AAAAxx +48 5713 0 0 8 8 48 48 48 48 48 96 97 WBAAAA TLIAAA HHHHxx +5382 5714 0 2 2 2 82 382 1382 382 5382 164 165 AZAAAA ULIAAA OOOOxx +947 5715 1 3 7 7 47 947 947 947 947 94 95 LKAAAA VLIAAA VVVVxx +2644 5716 0 0 4 4 44 644 644 2644 2644 88 89 SXAAAA WLIAAA AAAAxx +7516 5717 0 0 6 16 16 516 1516 2516 7516 32 33 CDAAAA XLIAAA HHHHxx +2362 5718 0 2 2 2 62 362 362 2362 2362 124 125 WMAAAA YLIAAA OOOOxx +839 5719 1 3 9 19 39 839 839 839 839 78 79 HGAAAA ZLIAAA VVVVxx +2216 5720 0 0 6 16 16 216 216 2216 2216 32 33 GHAAAA AMIAAA AAAAxx +7673 5721 1 1 3 13 73 673 1673 2673 7673 146 147 DJAAAA BMIAAA HHHHxx +8173 5722 1 1 3 13 73 173 173 3173 8173 146 147 JCAAAA CMIAAA OOOOxx +1630 5723 0 2 0 10 30 630 1630 1630 1630 60 61 SKAAAA DMIAAA VVVVxx +9057 5724 1 1 7 17 57 57 1057 4057 9057 114 115 JKAAAA EMIAAA AAAAxx +4392 5725 0 0 2 12 92 392 392 4392 4392 184 185 YMAAAA FMIAAA HHHHxx +3695 5726 1 3 5 15 95 695 1695 3695 3695 190 191 DMAAAA GMIAAA OOOOxx +5751 5727 1 3 1 11 51 751 1751 751 5751 102 103 FNAAAA HMIAAA VVVVxx +5745 5728 1 1 5 5 45 745 1745 745 5745 90 91 ZMAAAA IMIAAA AAAAxx +7945 5729 1 1 5 5 45 945 1945 2945 7945 90 91 PTAAAA JMIAAA HHHHxx +5174 5730 0 2 4 14 74 174 1174 174 5174 148 149 ARAAAA KMIAAA OOOOxx +3829 5731 1 1 9 9 29 829 1829 3829 3829 58 59 HRAAAA LMIAAA VVVVxx +3317 5732 1 1 7 17 17 317 1317 3317 3317 34 35 PXAAAA MMIAAA AAAAxx +4253 5733 1 1 3 13 53 253 253 4253 4253 106 107 PHAAAA NMIAAA HHHHxx +1291 5734 1 3 1 11 91 291 1291 1291 1291 182 183 RXAAAA OMIAAA OOOOxx +3266 5735 0 2 6 6 66 266 1266 3266 3266 132 133 QVAAAA PMIAAA VVVVxx +2939 5736 1 3 9 19 39 939 939 2939 2939 78 79 BJAAAA QMIAAA AAAAxx +2755 5737 1 3 5 15 55 755 755 2755 2755 110 111 ZBAAAA RMIAAA HHHHxx +6844 5738 0 0 4 4 44 844 844 1844 6844 88 89 GDAAAA SMIAAA OOOOxx +8594 5739 0 2 4 14 94 594 594 3594 8594 188 189 OSAAAA TMIAAA VVVVxx +704 5740 0 0 4 4 4 704 704 704 704 8 9 CBAAAA UMIAAA AAAAxx +1681 5741 1 1 1 1 81 681 1681 1681 1681 162 163 RMAAAA VMIAAA HHHHxx +364 5742 0 0 4 4 64 364 364 364 364 128 129 AOAAAA WMIAAA OOOOxx +2928 5743 0 0 8 8 28 928 928 2928 2928 56 57 QIAAAA XMIAAA VVVVxx +117 5744 1 1 7 17 17 117 117 117 117 34 35 NEAAAA YMIAAA AAAAxx +96 5745 0 0 6 16 96 96 96 96 96 192 193 SDAAAA ZMIAAA HHHHxx +7796 5746 0 0 6 16 96 796 1796 2796 7796 192 193 WNAAAA ANIAAA OOOOxx +3101 5747 1 1 1 1 1 101 1101 3101 3101 2 3 HPAAAA BNIAAA VVVVxx +3397 5748 1 1 7 17 97 397 1397 3397 3397 194 195 RAAAAA CNIAAA AAAAxx +1605 5749 1 1 5 5 5 605 1605 1605 1605 10 11 TJAAAA DNIAAA HHHHxx +4881 5750 1 1 1 1 81 881 881 4881 4881 162 163 TFAAAA ENIAAA OOOOxx +4521 5751 1 1 1 1 21 521 521 4521 4521 42 43 XRAAAA FNIAAA VVVVxx +6430 5752 0 2 0 10 30 430 430 1430 6430 60 61 INAAAA GNIAAA AAAAxx +282 5753 0 2 2 2 82 282 282 282 282 164 165 WKAAAA HNIAAA HHHHxx +9645 5754 1 1 5 5 45 645 1645 4645 9645 90 91 ZGAAAA INIAAA OOOOxx +8946 5755 0 2 6 6 46 946 946 3946 8946 92 93 CGAAAA JNIAAA VVVVxx +5064 5756 0 0 4 4 64 64 1064 64 5064 128 129 UMAAAA KNIAAA AAAAxx +7470 5757 0 2 0 10 70 470 1470 2470 7470 140 141 IBAAAA LNIAAA HHHHxx +5886 5758 0 2 6 6 86 886 1886 886 5886 172 173 KSAAAA MNIAAA OOOOxx +6280 5759 0 0 0 0 80 280 280 1280 6280 160 161 OHAAAA NNIAAA VVVVxx +5247 5760 1 3 7 7 47 247 1247 247 5247 94 95 VTAAAA ONIAAA AAAAxx +412 5761 0 0 2 12 12 412 412 412 412 24 25 WPAAAA PNIAAA HHHHxx +5342 5762 0 2 2 2 42 342 1342 342 5342 84 85 MXAAAA QNIAAA OOOOxx +2271 5763 1 3 1 11 71 271 271 2271 2271 142 143 JJAAAA RNIAAA VVVVxx +849 5764 1 1 9 9 49 849 849 849 849 98 99 RGAAAA SNIAAA AAAAxx +1885 5765 1 1 5 5 85 885 1885 1885 1885 170 171 NUAAAA TNIAAA HHHHxx +5620 5766 0 0 0 0 20 620 1620 620 5620 40 41 EIAAAA UNIAAA OOOOxx +7079 5767 1 3 9 19 79 79 1079 2079 7079 158 159 HMAAAA VNIAAA VVVVxx +5819 5768 1 3 9 19 19 819 1819 819 5819 38 39 VPAAAA WNIAAA AAAAxx +7497 5769 1 1 7 17 97 497 1497 2497 7497 194 195 JCAAAA XNIAAA HHHHxx +5993 5770 1 1 3 13 93 993 1993 993 5993 186 187 NWAAAA YNIAAA OOOOxx +3739 5771 1 3 9 19 39 739 1739 3739 3739 78 79 VNAAAA ZNIAAA VVVVxx +6296 5772 0 0 6 16 96 296 296 1296 6296 192 193 EIAAAA AOIAAA AAAAxx +2716 5773 0 0 6 16 16 716 716 2716 2716 32 33 MAAAAA BOIAAA HHHHxx +1130 5774 0 2 0 10 30 130 1130 1130 1130 60 61 MRAAAA COIAAA OOOOxx +5593 5775 1 1 3 13 93 593 1593 593 5593 186 187 DHAAAA DOIAAA VVVVxx +6972 5776 0 0 2 12 72 972 972 1972 6972 144 145 EIAAAA EOIAAA AAAAxx +8360 5777 0 0 0 0 60 360 360 3360 8360 120 121 OJAAAA FOIAAA HHHHxx +6448 5778 0 0 8 8 48 448 448 1448 6448 96 97 AOAAAA GOIAAA OOOOxx +3689 5779 1 1 9 9 89 689 1689 3689 3689 178 179 XLAAAA HOIAAA VVVVxx +7951 5780 1 3 1 11 51 951 1951 2951 7951 102 103 VTAAAA IOIAAA AAAAxx +2974 5781 0 2 4 14 74 974 974 2974 2974 148 149 KKAAAA JOIAAA HHHHxx +6600 5782 0 0 0 0 0 600 600 1600 6600 0 1 WTAAAA KOIAAA OOOOxx +4662 5783 0 2 2 2 62 662 662 4662 4662 124 125 IXAAAA LOIAAA VVVVxx +4765 5784 1 1 5 5 65 765 765 4765 4765 130 131 HBAAAA MOIAAA AAAAxx +355 5785 1 3 5 15 55 355 355 355 355 110 111 RNAAAA NOIAAA HHHHxx +6228 5786 0 0 8 8 28 228 228 1228 6228 56 57 OFAAAA OOIAAA OOOOxx +964 5787 0 0 4 4 64 964 964 964 964 128 129 CLAAAA POIAAA VVVVxx +3082 5788 0 2 2 2 82 82 1082 3082 3082 164 165 OOAAAA QOIAAA AAAAxx +7028 5789 0 0 8 8 28 28 1028 2028 7028 56 57 IKAAAA ROIAAA HHHHxx +4505 5790 1 1 5 5 5 505 505 4505 4505 10 11 HRAAAA SOIAAA OOOOxx +8961 5791 1 1 1 1 61 961 961 3961 8961 122 123 RGAAAA TOIAAA VVVVxx +9571 5792 1 3 1 11 71 571 1571 4571 9571 142 143 DEAAAA UOIAAA AAAAxx +9394 5793 0 2 4 14 94 394 1394 4394 9394 188 189 IXAAAA VOIAAA HHHHxx +4245 5794 1 1 5 5 45 245 245 4245 4245 90 91 HHAAAA WOIAAA OOOOxx +7560 5795 0 0 0 0 60 560 1560 2560 7560 120 121 UEAAAA XOIAAA VVVVxx +2907 5796 1 3 7 7 7 907 907 2907 2907 14 15 VHAAAA YOIAAA AAAAxx +7817 5797 1 1 7 17 17 817 1817 2817 7817 34 35 ROAAAA ZOIAAA HHHHxx +5408 5798 0 0 8 8 8 408 1408 408 5408 16 17 AAAAAA APIAAA OOOOxx +8092 5799 0 0 2 12 92 92 92 3092 8092 184 185 GZAAAA BPIAAA VVVVxx +1309 5800 1 1 9 9 9 309 1309 1309 1309 18 19 JYAAAA CPIAAA AAAAxx +6673 5801 1 1 3 13 73 673 673 1673 6673 146 147 RWAAAA DPIAAA HHHHxx +1245 5802 1 1 5 5 45 245 1245 1245 1245 90 91 XVAAAA EPIAAA OOOOxx +6790 5803 0 2 0 10 90 790 790 1790 6790 180 181 EBAAAA FPIAAA VVVVxx +8380 5804 0 0 0 0 80 380 380 3380 8380 160 161 IKAAAA GPIAAA AAAAxx +5786 5805 0 2 6 6 86 786 1786 786 5786 172 173 OOAAAA HPIAAA HHHHxx +9590 5806 0 2 0 10 90 590 1590 4590 9590 180 181 WEAAAA IPIAAA OOOOxx +5763 5807 1 3 3 3 63 763 1763 763 5763 126 127 RNAAAA JPIAAA VVVVxx +1345 5808 1 1 5 5 45 345 1345 1345 1345 90 91 TZAAAA KPIAAA AAAAxx +3480 5809 0 0 0 0 80 480 1480 3480 3480 160 161 WDAAAA LPIAAA HHHHxx +7864 5810 0 0 4 4 64 864 1864 2864 7864 128 129 MQAAAA MPIAAA OOOOxx +4853 5811 1 1 3 13 53 853 853 4853 4853 106 107 REAAAA NPIAAA VVVVxx +1445 5812 1 1 5 5 45 445 1445 1445 1445 90 91 PDAAAA OPIAAA AAAAxx +170 5813 0 2 0 10 70 170 170 170 170 140 141 OGAAAA PPIAAA HHHHxx +7348 5814 0 0 8 8 48 348 1348 2348 7348 96 97 QWAAAA QPIAAA OOOOxx +3920 5815 0 0 0 0 20 920 1920 3920 3920 40 41 UUAAAA RPIAAA VVVVxx +3307 5816 1 3 7 7 7 307 1307 3307 3307 14 15 FXAAAA SPIAAA AAAAxx +4584 5817 0 0 4 4 84 584 584 4584 4584 168 169 IUAAAA TPIAAA HHHHxx +3344 5818 0 0 4 4 44 344 1344 3344 3344 88 89 QYAAAA UPIAAA OOOOxx +4360 5819 0 0 0 0 60 360 360 4360 4360 120 121 SLAAAA VPIAAA VVVVxx +8757 5820 1 1 7 17 57 757 757 3757 8757 114 115 VYAAAA WPIAAA AAAAxx +4315 5821 1 3 5 15 15 315 315 4315 4315 30 31 ZJAAAA XPIAAA HHHHxx +5243 5822 1 3 3 3 43 243 1243 243 5243 86 87 RTAAAA YPIAAA OOOOxx +8550 5823 0 2 0 10 50 550 550 3550 8550 100 101 WQAAAA ZPIAAA VVVVxx +159 5824 1 3 9 19 59 159 159 159 159 118 119 DGAAAA AQIAAA AAAAxx +4710 5825 0 2 0 10 10 710 710 4710 4710 20 21 EZAAAA BQIAAA HHHHxx +7179 5826 1 3 9 19 79 179 1179 2179 7179 158 159 DQAAAA CQIAAA OOOOxx +2509 5827 1 1 9 9 9 509 509 2509 2509 18 19 NSAAAA DQIAAA VVVVxx +6981 5828 1 1 1 1 81 981 981 1981 6981 162 163 NIAAAA EQIAAA AAAAxx +5060 5829 0 0 0 0 60 60 1060 60 5060 120 121 QMAAAA FQIAAA HHHHxx +5601 5830 1 1 1 1 1 601 1601 601 5601 2 3 LHAAAA GQIAAA OOOOxx +703 5831 1 3 3 3 3 703 703 703 703 6 7 BBAAAA HQIAAA VVVVxx +8719 5832 1 3 9 19 19 719 719 3719 8719 38 39 JXAAAA IQIAAA AAAAxx +1570 5833 0 2 0 10 70 570 1570 1570 1570 140 141 KIAAAA JQIAAA HHHHxx +1036 5834 0 0 6 16 36 36 1036 1036 1036 72 73 WNAAAA KQIAAA OOOOxx +6703 5835 1 3 3 3 3 703 703 1703 6703 6 7 VXAAAA LQIAAA VVVVxx +252 5836 0 0 2 12 52 252 252 252 252 104 105 SJAAAA MQIAAA AAAAxx +631 5837 1 3 1 11 31 631 631 631 631 62 63 HYAAAA NQIAAA HHHHxx +5098 5838 0 2 8 18 98 98 1098 98 5098 196 197 COAAAA OQIAAA OOOOxx +8346 5839 0 2 6 6 46 346 346 3346 8346 92 93 AJAAAA PQIAAA VVVVxx +4910 5840 0 2 0 10 10 910 910 4910 4910 20 21 WGAAAA QQIAAA AAAAxx +559 5841 1 3 9 19 59 559 559 559 559 118 119 NVAAAA RQIAAA HHHHxx +1477 5842 1 1 7 17 77 477 1477 1477 1477 154 155 VEAAAA SQIAAA OOOOxx +5115 5843 1 3 5 15 15 115 1115 115 5115 30 31 TOAAAA TQIAAA VVVVxx +8784 5844 0 0 4 4 84 784 784 3784 8784 168 169 WZAAAA UQIAAA AAAAxx +4422 5845 0 2 2 2 22 422 422 4422 4422 44 45 COAAAA VQIAAA HHHHxx +2702 5846 0 2 2 2 2 702 702 2702 2702 4 5 YZAAAA WQIAAA OOOOxx +9599 5847 1 3 9 19 99 599 1599 4599 9599 198 199 FFAAAA XQIAAA VVVVxx +2463 5848 1 3 3 3 63 463 463 2463 2463 126 127 TQAAAA YQIAAA AAAAxx +498 5849 0 2 8 18 98 498 498 498 498 196 197 ETAAAA ZQIAAA HHHHxx +494 5850 0 2 4 14 94 494 494 494 494 188 189 ATAAAA ARIAAA OOOOxx +8632 5851 0 0 2 12 32 632 632 3632 8632 64 65 AUAAAA BRIAAA VVVVxx +3449 5852 1 1 9 9 49 449 1449 3449 3449 98 99 RCAAAA CRIAAA AAAAxx +5888 5853 0 0 8 8 88 888 1888 888 5888 176 177 MSAAAA DRIAAA HHHHxx +2211 5854 1 3 1 11 11 211 211 2211 2211 22 23 BHAAAA ERIAAA OOOOxx +2835 5855 1 3 5 15 35 835 835 2835 2835 70 71 BFAAAA FRIAAA VVVVxx +4196 5856 0 0 6 16 96 196 196 4196 4196 192 193 KFAAAA GRIAAA AAAAxx +2177 5857 1 1 7 17 77 177 177 2177 2177 154 155 TFAAAA HRIAAA HHHHxx +1959 5858 1 3 9 19 59 959 1959 1959 1959 118 119 JXAAAA IRIAAA OOOOxx +5172 5859 0 0 2 12 72 172 1172 172 5172 144 145 YQAAAA JRIAAA VVVVxx +7898 5860 0 2 8 18 98 898 1898 2898 7898 196 197 URAAAA KRIAAA AAAAxx +5729 5861 1 1 9 9 29 729 1729 729 5729 58 59 JMAAAA LRIAAA HHHHxx +469 5862 1 1 9 9 69 469 469 469 469 138 139 BSAAAA MRIAAA OOOOxx +4456 5863 0 0 6 16 56 456 456 4456 4456 112 113 KPAAAA NRIAAA VVVVxx +3578 5864 0 2 8 18 78 578 1578 3578 3578 156 157 QHAAAA ORIAAA AAAAxx +8623 5865 1 3 3 3 23 623 623 3623 8623 46 47 RTAAAA PRIAAA HHHHxx +6749 5866 1 1 9 9 49 749 749 1749 6749 98 99 PZAAAA QRIAAA OOOOxx +6735 5867 1 3 5 15 35 735 735 1735 6735 70 71 BZAAAA RRIAAA VVVVxx +5197 5868 1 1 7 17 97 197 1197 197 5197 194 195 XRAAAA SRIAAA AAAAxx +2067 5869 1 3 7 7 67 67 67 2067 2067 134 135 NBAAAA TRIAAA HHHHxx +5600 5870 0 0 0 0 0 600 1600 600 5600 0 1 KHAAAA URIAAA OOOOxx +7741 5871 1 1 1 1 41 741 1741 2741 7741 82 83 TLAAAA VRIAAA VVVVxx +9925 5872 1 1 5 5 25 925 1925 4925 9925 50 51 TRAAAA WRIAAA AAAAxx +9685 5873 1 1 5 5 85 685 1685 4685 9685 170 171 NIAAAA XRIAAA HHHHxx +7622 5874 0 2 2 2 22 622 1622 2622 7622 44 45 EHAAAA YRIAAA OOOOxx +6859 5875 1 3 9 19 59 859 859 1859 6859 118 119 VDAAAA ZRIAAA VVVVxx +3094 5876 0 2 4 14 94 94 1094 3094 3094 188 189 APAAAA ASIAAA AAAAxx +2628 5877 0 0 8 8 28 628 628 2628 2628 56 57 CXAAAA BSIAAA HHHHxx +40 5878 0 0 0 0 40 40 40 40 40 80 81 OBAAAA CSIAAA OOOOxx +1644 5879 0 0 4 4 44 644 1644 1644 1644 88 89 GLAAAA DSIAAA VVVVxx +588 5880 0 0 8 8 88 588 588 588 588 176 177 QWAAAA ESIAAA AAAAxx +7522 5881 0 2 2 2 22 522 1522 2522 7522 44 45 IDAAAA FSIAAA HHHHxx +162 5882 0 2 2 2 62 162 162 162 162 124 125 GGAAAA GSIAAA OOOOxx +3610 5883 0 2 0 10 10 610 1610 3610 3610 20 21 WIAAAA HSIAAA VVVVxx +3561 5884 1 1 1 1 61 561 1561 3561 3561 122 123 ZGAAAA ISIAAA AAAAxx +8185 5885 1 1 5 5 85 185 185 3185 8185 170 171 VCAAAA JSIAAA HHHHxx +7237 5886 1 1 7 17 37 237 1237 2237 7237 74 75 JSAAAA KSIAAA OOOOxx +4592 5887 0 0 2 12 92 592 592 4592 4592 184 185 QUAAAA LSIAAA VVVVxx +7082 5888 0 2 2 2 82 82 1082 2082 7082 164 165 KMAAAA MSIAAA AAAAxx +4719 5889 1 3 9 19 19 719 719 4719 4719 38 39 NZAAAA NSIAAA HHHHxx +3879 5890 1 3 9 19 79 879 1879 3879 3879 158 159 FTAAAA OSIAAA OOOOxx +1662 5891 0 2 2 2 62 662 1662 1662 1662 124 125 YLAAAA PSIAAA VVVVxx +3995 5892 1 3 5 15 95 995 1995 3995 3995 190 191 RXAAAA QSIAAA AAAAxx +5828 5893 0 0 8 8 28 828 1828 828 5828 56 57 EQAAAA RSIAAA HHHHxx +4197 5894 1 1 7 17 97 197 197 4197 4197 194 195 LFAAAA SSIAAA OOOOxx +5146 5895 0 2 6 6 46 146 1146 146 5146 92 93 YPAAAA TSIAAA VVVVxx +753 5896 1 1 3 13 53 753 753 753 753 106 107 ZCAAAA USIAAA AAAAxx +7064 5897 0 0 4 4 64 64 1064 2064 7064 128 129 SLAAAA VSIAAA HHHHxx +1312 5898 0 0 2 12 12 312 1312 1312 1312 24 25 MYAAAA WSIAAA OOOOxx +5573 5899 1 1 3 13 73 573 1573 573 5573 146 147 JGAAAA XSIAAA VVVVxx +7634 5900 0 2 4 14 34 634 1634 2634 7634 68 69 QHAAAA YSIAAA AAAAxx +2459 5901 1 3 9 19 59 459 459 2459 2459 118 119 PQAAAA ZSIAAA HHHHxx +8636 5902 0 0 6 16 36 636 636 3636 8636 72 73 EUAAAA ATIAAA OOOOxx +5318 5903 0 2 8 18 18 318 1318 318 5318 36 37 OWAAAA BTIAAA VVVVxx +1064 5904 0 0 4 4 64 64 1064 1064 1064 128 129 YOAAAA CTIAAA AAAAxx +9779 5905 1 3 9 19 79 779 1779 4779 9779 158 159 DMAAAA DTIAAA HHHHxx +6512 5906 0 0 2 12 12 512 512 1512 6512 24 25 MQAAAA ETIAAA OOOOxx +3572 5907 0 0 2 12 72 572 1572 3572 3572 144 145 KHAAAA FTIAAA VVVVxx +816 5908 0 0 6 16 16 816 816 816 816 32 33 KFAAAA GTIAAA AAAAxx +3978 5909 0 2 8 18 78 978 1978 3978 3978 156 157 AXAAAA HTIAAA HHHHxx +5390 5910 0 2 0 10 90 390 1390 390 5390 180 181 IZAAAA ITIAAA OOOOxx +4685 5911 1 1 5 5 85 685 685 4685 4685 170 171 FYAAAA JTIAAA VVVVxx +3003 5912 1 3 3 3 3 3 1003 3003 3003 6 7 NLAAAA KTIAAA AAAAxx +2638 5913 0 2 8 18 38 638 638 2638 2638 76 77 MXAAAA LTIAAA HHHHxx +9716 5914 0 0 6 16 16 716 1716 4716 9716 32 33 SJAAAA MTIAAA OOOOxx +9598 5915 0 2 8 18 98 598 1598 4598 9598 196 197 EFAAAA NTIAAA VVVVxx +9501 5916 1 1 1 1 1 501 1501 4501 9501 2 3 LBAAAA OTIAAA AAAAxx +1704 5917 0 0 4 4 4 704 1704 1704 1704 8 9 ONAAAA PTIAAA HHHHxx +8609 5918 1 1 9 9 9 609 609 3609 8609 18 19 DTAAAA QTIAAA OOOOxx +5211 5919 1 3 1 11 11 211 1211 211 5211 22 23 LSAAAA RTIAAA VVVVxx +3605 5920 1 1 5 5 5 605 1605 3605 3605 10 11 RIAAAA STIAAA AAAAxx +8730 5921 0 2 0 10 30 730 730 3730 8730 60 61 UXAAAA TTIAAA HHHHxx +4208 5922 0 0 8 8 8 208 208 4208 4208 16 17 WFAAAA UTIAAA OOOOxx +7784 5923 0 0 4 4 84 784 1784 2784 7784 168 169 KNAAAA VTIAAA VVVVxx +7501 5924 1 1 1 1 1 501 1501 2501 7501 2 3 NCAAAA WTIAAA AAAAxx +7862 5925 0 2 2 2 62 862 1862 2862 7862 124 125 KQAAAA XTIAAA HHHHxx +8922 5926 0 2 2 2 22 922 922 3922 8922 44 45 EFAAAA YTIAAA OOOOxx +3857 5927 1 1 7 17 57 857 1857 3857 3857 114 115 JSAAAA ZTIAAA VVVVxx +6393 5928 1 1 3 13 93 393 393 1393 6393 186 187 XLAAAA AUIAAA AAAAxx +506 5929 0 2 6 6 6 506 506 506 506 12 13 MTAAAA BUIAAA HHHHxx +4232 5930 0 0 2 12 32 232 232 4232 4232 64 65 UGAAAA CUIAAA OOOOxx +8991 5931 1 3 1 11 91 991 991 3991 8991 182 183 VHAAAA DUIAAA VVVVxx +8578 5932 0 2 8 18 78 578 578 3578 8578 156 157 YRAAAA EUIAAA AAAAxx +3235 5933 1 3 5 15 35 235 1235 3235 3235 70 71 LUAAAA FUIAAA HHHHxx +963 5934 1 3 3 3 63 963 963 963 963 126 127 BLAAAA GUIAAA OOOOxx +113 5935 1 1 3 13 13 113 113 113 113 26 27 JEAAAA HUIAAA VVVVxx +8234 5936 0 2 4 14 34 234 234 3234 8234 68 69 SEAAAA IUIAAA AAAAxx +2613 5937 1 1 3 13 13 613 613 2613 2613 26 27 NWAAAA JUIAAA HHHHxx +5540 5938 0 0 0 0 40 540 1540 540 5540 80 81 CFAAAA KUIAAA OOOOxx +9727 5939 1 3 7 7 27 727 1727 4727 9727 54 55 DKAAAA LUIAAA VVVVxx +2229 5940 1 1 9 9 29 229 229 2229 2229 58 59 THAAAA MUIAAA AAAAxx +6242 5941 0 2 2 2 42 242 242 1242 6242 84 85 CGAAAA NUIAAA HHHHxx +2502 5942 0 2 2 2 2 502 502 2502 2502 4 5 GSAAAA OUIAAA OOOOxx +6212 5943 0 0 2 12 12 212 212 1212 6212 24 25 YEAAAA PUIAAA VVVVxx +3495 5944 1 3 5 15 95 495 1495 3495 3495 190 191 LEAAAA QUIAAA AAAAxx +2364 5945 0 0 4 4 64 364 364 2364 2364 128 129 YMAAAA RUIAAA HHHHxx +6777 5946 1 1 7 17 77 777 777 1777 6777 154 155 RAAAAA SUIAAA OOOOxx +9811 5947 1 3 1 11 11 811 1811 4811 9811 22 23 JNAAAA TUIAAA VVVVxx +1450 5948 0 2 0 10 50 450 1450 1450 1450 100 101 UDAAAA UUIAAA AAAAxx +5008 5949 0 0 8 8 8 8 1008 8 5008 16 17 QKAAAA VUIAAA HHHHxx +1318 5950 0 2 8 18 18 318 1318 1318 1318 36 37 SYAAAA WUIAAA OOOOxx +3373 5951 1 1 3 13 73 373 1373 3373 3373 146 147 TZAAAA XUIAAA VVVVxx +398 5952 0 2 8 18 98 398 398 398 398 196 197 IPAAAA YUIAAA AAAAxx +3804 5953 0 0 4 4 4 804 1804 3804 3804 8 9 IQAAAA ZUIAAA HHHHxx +9148 5954 0 0 8 8 48 148 1148 4148 9148 96 97 WNAAAA AVIAAA OOOOxx +4382 5955 0 2 2 2 82 382 382 4382 4382 164 165 OMAAAA BVIAAA VVVVxx +4026 5956 0 2 6 6 26 26 26 4026 4026 52 53 WYAAAA CVIAAA AAAAxx +7804 5957 0 0 4 4 4 804 1804 2804 7804 8 9 EOAAAA DVIAAA HHHHxx +6839 5958 1 3 9 19 39 839 839 1839 6839 78 79 BDAAAA EVIAAA OOOOxx +3756 5959 0 0 6 16 56 756 1756 3756 3756 112 113 MOAAAA FVIAAA VVVVxx +6734 5960 0 2 4 14 34 734 734 1734 6734 68 69 AZAAAA GVIAAA AAAAxx +2228 5961 0 0 8 8 28 228 228 2228 2228 56 57 SHAAAA HVIAAA HHHHxx +3273 5962 1 1 3 13 73 273 1273 3273 3273 146 147 XVAAAA IVIAAA OOOOxx +3708 5963 0 0 8 8 8 708 1708 3708 3708 16 17 QMAAAA JVIAAA VVVVxx +4320 5964 0 0 0 0 20 320 320 4320 4320 40 41 EKAAAA KVIAAA AAAAxx +74 5965 0 2 4 14 74 74 74 74 74 148 149 WCAAAA LVIAAA HHHHxx +2520 5966 0 0 0 0 20 520 520 2520 2520 40 41 YSAAAA MVIAAA OOOOxx +9619 5967 1 3 9 19 19 619 1619 4619 9619 38 39 ZFAAAA NVIAAA VVVVxx +1801 5968 1 1 1 1 1 801 1801 1801 1801 2 3 HRAAAA OVIAAA AAAAxx +6399 5969 1 3 9 19 99 399 399 1399 6399 198 199 DMAAAA PVIAAA HHHHxx +8313 5970 1 1 3 13 13 313 313 3313 8313 26 27 THAAAA QVIAAA OOOOxx +7003 5971 1 3 3 3 3 3 1003 2003 7003 6 7 JJAAAA RVIAAA VVVVxx +329 5972 1 1 9 9 29 329 329 329 329 58 59 RMAAAA SVIAAA AAAAxx +9090 5973 0 2 0 10 90 90 1090 4090 9090 180 181 QLAAAA TVIAAA HHHHxx +2299 5974 1 3 9 19 99 299 299 2299 2299 198 199 LKAAAA UVIAAA OOOOxx +3925 5975 1 1 5 5 25 925 1925 3925 3925 50 51 ZUAAAA VVIAAA VVVVxx +8145 5976 1 1 5 5 45 145 145 3145 8145 90 91 HBAAAA WVIAAA AAAAxx +8561 5977 1 1 1 1 61 561 561 3561 8561 122 123 HRAAAA XVIAAA HHHHxx +2797 5978 1 1 7 17 97 797 797 2797 2797 194 195 PDAAAA YVIAAA OOOOxx +1451 5979 1 3 1 11 51 451 1451 1451 1451 102 103 VDAAAA ZVIAAA VVVVxx +7977 5980 1 1 7 17 77 977 1977 2977 7977 154 155 VUAAAA AWIAAA AAAAxx +112 5981 0 0 2 12 12 112 112 112 112 24 25 IEAAAA BWIAAA HHHHxx +5265 5982 1 1 5 5 65 265 1265 265 5265 130 131 NUAAAA CWIAAA OOOOxx +3819 5983 1 3 9 19 19 819 1819 3819 3819 38 39 XQAAAA DWIAAA VVVVxx +3648 5984 0 0 8 8 48 648 1648 3648 3648 96 97 IKAAAA EWIAAA AAAAxx +6306 5985 0 2 6 6 6 306 306 1306 6306 12 13 OIAAAA FWIAAA HHHHxx +2385 5986 1 1 5 5 85 385 385 2385 2385 170 171 TNAAAA GWIAAA OOOOxx +9084 5987 0 0 4 4 84 84 1084 4084 9084 168 169 KLAAAA HWIAAA VVVVxx +4499 5988 1 3 9 19 99 499 499 4499 4499 198 199 BRAAAA IWIAAA AAAAxx +1154 5989 0 2 4 14 54 154 1154 1154 1154 108 109 KSAAAA JWIAAA HHHHxx +6800 5990 0 0 0 0 0 800 800 1800 6800 0 1 OBAAAA KWIAAA OOOOxx +8049 5991 1 1 9 9 49 49 49 3049 8049 98 99 PXAAAA LWIAAA VVVVxx +3733 5992 1 1 3 13 33 733 1733 3733 3733 66 67 PNAAAA MWIAAA AAAAxx +8496 5993 0 0 6 16 96 496 496 3496 8496 192 193 UOAAAA NWIAAA HHHHxx +9952 5994 0 0 2 12 52 952 1952 4952 9952 104 105 USAAAA OWIAAA OOOOxx +9792 5995 0 0 2 12 92 792 1792 4792 9792 184 185 QMAAAA PWIAAA VVVVxx +5081 5996 1 1 1 1 81 81 1081 81 5081 162 163 LNAAAA QWIAAA AAAAxx +7908 5997 0 0 8 8 8 908 1908 2908 7908 16 17 ESAAAA RWIAAA HHHHxx +5398 5998 0 2 8 18 98 398 1398 398 5398 196 197 QZAAAA SWIAAA OOOOxx +8423 5999 1 3 3 3 23 423 423 3423 8423 46 47 ZLAAAA TWIAAA VVVVxx +3362 6000 0 2 2 2 62 362 1362 3362 3362 124 125 IZAAAA UWIAAA AAAAxx +7767 6001 1 3 7 7 67 767 1767 2767 7767 134 135 TMAAAA VWIAAA HHHHxx +7063 6002 1 3 3 3 63 63 1063 2063 7063 126 127 RLAAAA WWIAAA OOOOxx +8350 6003 0 2 0 10 50 350 350 3350 8350 100 101 EJAAAA XWIAAA VVVVxx +6779 6004 1 3 9 19 79 779 779 1779 6779 158 159 TAAAAA YWIAAA AAAAxx +5742 6005 0 2 2 2 42 742 1742 742 5742 84 85 WMAAAA ZWIAAA HHHHxx +9045 6006 1 1 5 5 45 45 1045 4045 9045 90 91 XJAAAA AXIAAA OOOOxx +8792 6007 0 0 2 12 92 792 792 3792 8792 184 185 EAAAAA BXIAAA VVVVxx +8160 6008 0 0 0 0 60 160 160 3160 8160 120 121 WBAAAA CXIAAA AAAAxx +3061 6009 1 1 1 1 61 61 1061 3061 3061 122 123 TNAAAA DXIAAA HHHHxx +4721 6010 1 1 1 1 21 721 721 4721 4721 42 43 PZAAAA EXIAAA OOOOxx +9817 6011 1 1 7 17 17 817 1817 4817 9817 34 35 PNAAAA FXIAAA VVVVxx +9257 6012 1 1 7 17 57 257 1257 4257 9257 114 115 BSAAAA GXIAAA AAAAxx +7779 6013 1 3 9 19 79 779 1779 2779 7779 158 159 FNAAAA HXIAAA HHHHxx +2663 6014 1 3 3 3 63 663 663 2663 2663 126 127 LYAAAA IXIAAA OOOOxx +3885 6015 1 1 5 5 85 885 1885 3885 3885 170 171 LTAAAA JXIAAA VVVVxx +9469 6016 1 1 9 9 69 469 1469 4469 9469 138 139 FAAAAA KXIAAA AAAAxx +6766 6017 0 2 6 6 66 766 766 1766 6766 132 133 GAAAAA LXIAAA HHHHxx +7173 6018 1 1 3 13 73 173 1173 2173 7173 146 147 XPAAAA MXIAAA OOOOxx +4709 6019 1 1 9 9 9 709 709 4709 4709 18 19 DZAAAA NXIAAA VVVVxx +4210 6020 0 2 0 10 10 210 210 4210 4210 20 21 YFAAAA OXIAAA AAAAxx +3715 6021 1 3 5 15 15 715 1715 3715 3715 30 31 XMAAAA PXIAAA HHHHxx +5089 6022 1 1 9 9 89 89 1089 89 5089 178 179 TNAAAA QXIAAA OOOOxx +1639 6023 1 3 9 19 39 639 1639 1639 1639 78 79 BLAAAA RXIAAA VVVVxx +5757 6024 1 1 7 17 57 757 1757 757 5757 114 115 LNAAAA SXIAAA AAAAxx +3545 6025 1 1 5 5 45 545 1545 3545 3545 90 91 JGAAAA TXIAAA HHHHxx +709 6026 1 1 9 9 9 709 709 709 709 18 19 HBAAAA UXIAAA OOOOxx +6519 6027 1 3 9 19 19 519 519 1519 6519 38 39 TQAAAA VXIAAA VVVVxx +4341 6028 1 1 1 1 41 341 341 4341 4341 82 83 ZKAAAA WXIAAA AAAAxx +2381 6029 1 1 1 1 81 381 381 2381 2381 162 163 PNAAAA XXIAAA HHHHxx +7215 6030 1 3 5 15 15 215 1215 2215 7215 30 31 NRAAAA YXIAAA OOOOxx +9323 6031 1 3 3 3 23 323 1323 4323 9323 46 47 PUAAAA ZXIAAA VVVVxx +3593 6032 1 1 3 13 93 593 1593 3593 3593 186 187 FIAAAA AYIAAA AAAAxx +3123 6033 1 3 3 3 23 123 1123 3123 3123 46 47 DQAAAA BYIAAA HHHHxx +8673 6034 1 1 3 13 73 673 673 3673 8673 146 147 PVAAAA CYIAAA OOOOxx +5094 6035 0 2 4 14 94 94 1094 94 5094 188 189 YNAAAA DYIAAA VVVVxx +6477 6036 1 1 7 17 77 477 477 1477 6477 154 155 DPAAAA EYIAAA AAAAxx +9734 6037 0 2 4 14 34 734 1734 4734 9734 68 69 KKAAAA FYIAAA HHHHxx +2998 6038 0 2 8 18 98 998 998 2998 2998 196 197 ILAAAA GYIAAA OOOOxx +7807 6039 1 3 7 7 7 807 1807 2807 7807 14 15 HOAAAA HYIAAA VVVVxx +5739 6040 1 3 9 19 39 739 1739 739 5739 78 79 TMAAAA IYIAAA AAAAxx +138 6041 0 2 8 18 38 138 138 138 138 76 77 IFAAAA JYIAAA HHHHxx +2403 6042 1 3 3 3 3 403 403 2403 2403 6 7 LOAAAA KYIAAA OOOOxx +2484 6043 0 0 4 4 84 484 484 2484 2484 168 169 ORAAAA LYIAAA VVVVxx +2805 6044 1 1 5 5 5 805 805 2805 2805 10 11 XDAAAA MYIAAA AAAAxx +5189 6045 1 1 9 9 89 189 1189 189 5189 178 179 PRAAAA NYIAAA HHHHxx +8336 6046 0 0 6 16 36 336 336 3336 8336 72 73 QIAAAA OYIAAA OOOOxx +5241 6047 1 1 1 1 41 241 1241 241 5241 82 83 PTAAAA PYIAAA VVVVxx +2612 6048 0 0 2 12 12 612 612 2612 2612 24 25 MWAAAA QYIAAA AAAAxx +2571 6049 1 3 1 11 71 571 571 2571 2571 142 143 XUAAAA RYIAAA HHHHxx +926 6050 0 2 6 6 26 926 926 926 926 52 53 QJAAAA SYIAAA OOOOxx +337 6051 1 1 7 17 37 337 337 337 337 74 75 ZMAAAA TYIAAA VVVVxx +2821 6052 1 1 1 1 21 821 821 2821 2821 42 43 NEAAAA UYIAAA AAAAxx +2658 6053 0 2 8 18 58 658 658 2658 2658 116 117 GYAAAA VYIAAA HHHHxx +9054 6054 0 2 4 14 54 54 1054 4054 9054 108 109 GKAAAA WYIAAA OOOOxx +5492 6055 0 0 2 12 92 492 1492 492 5492 184 185 GDAAAA XYIAAA VVVVxx +7313 6056 1 1 3 13 13 313 1313 2313 7313 26 27 HVAAAA YYIAAA AAAAxx +75 6057 1 3 5 15 75 75 75 75 75 150 151 XCAAAA ZYIAAA HHHHxx +5489 6058 1 1 9 9 89 489 1489 489 5489 178 179 DDAAAA AZIAAA OOOOxx +8413 6059 1 1 3 13 13 413 413 3413 8413 26 27 PLAAAA BZIAAA VVVVxx +3693 6060 1 1 3 13 93 693 1693 3693 3693 186 187 BMAAAA CZIAAA AAAAxx +9820 6061 0 0 0 0 20 820 1820 4820 9820 40 41 SNAAAA DZIAAA HHHHxx +8157 6062 1 1 7 17 57 157 157 3157 8157 114 115 TBAAAA EZIAAA OOOOxx +4161 6063 1 1 1 1 61 161 161 4161 4161 122 123 BEAAAA FZIAAA VVVVxx +8339 6064 1 3 9 19 39 339 339 3339 8339 78 79 TIAAAA GZIAAA AAAAxx +4141 6065 1 1 1 1 41 141 141 4141 4141 82 83 HDAAAA HZIAAA HHHHxx +9001 6066 1 1 1 1 1 1 1001 4001 9001 2 3 FIAAAA IZIAAA OOOOxx +8247 6067 1 3 7 7 47 247 247 3247 8247 94 95 FFAAAA JZIAAA VVVVxx +1182 6068 0 2 2 2 82 182 1182 1182 1182 164 165 MTAAAA KZIAAA AAAAxx +9876 6069 0 0 6 16 76 876 1876 4876 9876 152 153 WPAAAA LZIAAA HHHHxx +4302 6070 0 2 2 2 2 302 302 4302 4302 4 5 MJAAAA MZIAAA OOOOxx +6674 6071 0 2 4 14 74 674 674 1674 6674 148 149 SWAAAA NZIAAA VVVVxx +4214 6072 0 2 4 14 14 214 214 4214 4214 28 29 CGAAAA OZIAAA AAAAxx +5584 6073 0 0 4 4 84 584 1584 584 5584 168 169 UGAAAA PZIAAA HHHHxx +265 6074 1 1 5 5 65 265 265 265 265 130 131 FKAAAA QZIAAA OOOOxx +9207 6075 1 3 7 7 7 207 1207 4207 9207 14 15 DQAAAA RZIAAA VVVVxx +9434 6076 0 2 4 14 34 434 1434 4434 9434 68 69 WYAAAA SZIAAA AAAAxx +2921 6077 1 1 1 1 21 921 921 2921 2921 42 43 JIAAAA TZIAAA HHHHxx +9355 6078 1 3 5 15 55 355 1355 4355 9355 110 111 VVAAAA UZIAAA OOOOxx +8538 6079 0 2 8 18 38 538 538 3538 8538 76 77 KQAAAA VZIAAA VVVVxx +4559 6080 1 3 9 19 59 559 559 4559 4559 118 119 JTAAAA WZIAAA AAAAxx +9175 6081 1 3 5 15 75 175 1175 4175 9175 150 151 XOAAAA XZIAAA HHHHxx +4489 6082 1 1 9 9 89 489 489 4489 4489 178 179 RQAAAA YZIAAA OOOOxx +1485 6083 1 1 5 5 85 485 1485 1485 1485 170 171 DFAAAA ZZIAAA VVVVxx +8853 6084 1 1 3 13 53 853 853 3853 8853 106 107 NCAAAA AAJAAA AAAAxx +9143 6085 1 3 3 3 43 143 1143 4143 9143 86 87 RNAAAA BAJAAA HHHHxx +9551 6086 1 3 1 11 51 551 1551 4551 9551 102 103 JDAAAA CAJAAA OOOOxx +49 6087 1 1 9 9 49 49 49 49 49 98 99 XBAAAA DAJAAA VVVVxx +8351 6088 1 3 1 11 51 351 351 3351 8351 102 103 FJAAAA EAJAAA AAAAxx +9748 6089 0 0 8 8 48 748 1748 4748 9748 96 97 YKAAAA FAJAAA HHHHxx +4536 6090 0 0 6 16 36 536 536 4536 4536 72 73 MSAAAA GAJAAA OOOOxx +930 6091 0 2 0 10 30 930 930 930 930 60 61 UJAAAA HAJAAA VVVVxx +2206 6092 0 2 6 6 6 206 206 2206 2206 12 13 WGAAAA IAJAAA AAAAxx +8004 6093 0 0 4 4 4 4 4 3004 8004 8 9 WVAAAA JAJAAA HHHHxx +219 6094 1 3 9 19 19 219 219 219 219 38 39 LIAAAA KAJAAA OOOOxx +2724 6095 0 0 4 4 24 724 724 2724 2724 48 49 UAAAAA LAJAAA VVVVxx +4868 6096 0 0 8 8 68 868 868 4868 4868 136 137 GFAAAA MAJAAA AAAAxx +5952 6097 0 0 2 12 52 952 1952 952 5952 104 105 YUAAAA NAJAAA HHHHxx +2094 6098 0 2 4 14 94 94 94 2094 2094 188 189 OCAAAA OAJAAA OOOOxx +5707 6099 1 3 7 7 7 707 1707 707 5707 14 15 NLAAAA PAJAAA VVVVxx +5200 6100 0 0 0 0 0 200 1200 200 5200 0 1 ASAAAA QAJAAA AAAAxx +967 6101 1 3 7 7 67 967 967 967 967 134 135 FLAAAA RAJAAA HHHHxx +1982 6102 0 2 2 2 82 982 1982 1982 1982 164 165 GYAAAA SAJAAA OOOOxx +3410 6103 0 2 0 10 10 410 1410 3410 3410 20 21 EBAAAA TAJAAA VVVVxx +174 6104 0 2 4 14 74 174 174 174 174 148 149 SGAAAA UAJAAA AAAAxx +9217 6105 1 1 7 17 17 217 1217 4217 9217 34 35 NQAAAA VAJAAA HHHHxx +9103 6106 1 3 3 3 3 103 1103 4103 9103 6 7 DMAAAA WAJAAA OOOOxx +868 6107 0 0 8 8 68 868 868 868 868 136 137 KHAAAA XAJAAA VVVVxx +8261 6108 1 1 1 1 61 261 261 3261 8261 122 123 TFAAAA YAJAAA AAAAxx +2720 6109 0 0 0 0 20 720 720 2720 2720 40 41 QAAAAA ZAJAAA HHHHxx +2999 6110 1 3 9 19 99 999 999 2999 2999 198 199 JLAAAA ABJAAA OOOOxx +769 6111 1 1 9 9 69 769 769 769 769 138 139 PDAAAA BBJAAA VVVVxx +4533 6112 1 1 3 13 33 533 533 4533 4533 66 67 JSAAAA CBJAAA AAAAxx +2030 6113 0 2 0 10 30 30 30 2030 2030 60 61 CAAAAA DBJAAA HHHHxx +5824 6114 0 0 4 4 24 824 1824 824 5824 48 49 AQAAAA EBJAAA OOOOxx +2328 6115 0 0 8 8 28 328 328 2328 2328 56 57 OLAAAA FBJAAA VVVVxx +9970 6116 0 2 0 10 70 970 1970 4970 9970 140 141 MTAAAA GBJAAA AAAAxx +3192 6117 0 0 2 12 92 192 1192 3192 3192 184 185 USAAAA HBJAAA HHHHxx +3387 6118 1 3 7 7 87 387 1387 3387 3387 174 175 HAAAAA IBJAAA OOOOxx +1936 6119 0 0 6 16 36 936 1936 1936 1936 72 73 MWAAAA JBJAAA VVVVxx +6934 6120 0 2 4 14 34 934 934 1934 6934 68 69 SGAAAA KBJAAA AAAAxx +5615 6121 1 3 5 15 15 615 1615 615 5615 30 31 ZHAAAA LBJAAA HHHHxx +2241 6122 1 1 1 1 41 241 241 2241 2241 82 83 FIAAAA MBJAAA OOOOxx +1842 6123 0 2 2 2 42 842 1842 1842 1842 84 85 WSAAAA NBJAAA VVVVxx +8044 6124 0 0 4 4 44 44 44 3044 8044 88 89 KXAAAA OBJAAA AAAAxx +8902 6125 0 2 2 2 2 902 902 3902 8902 4 5 KEAAAA PBJAAA HHHHxx +4519 6126 1 3 9 19 19 519 519 4519 4519 38 39 VRAAAA QBJAAA OOOOxx +492 6127 0 0 2 12 92 492 492 492 492 184 185 YSAAAA RBJAAA VVVVxx +2694 6128 0 2 4 14 94 694 694 2694 2694 188 189 QZAAAA SBJAAA AAAAxx +5861 6129 1 1 1 1 61 861 1861 861 5861 122 123 LRAAAA TBJAAA HHHHxx +2104 6130 0 0 4 4 4 104 104 2104 2104 8 9 YCAAAA UBJAAA OOOOxx +5376 6131 0 0 6 16 76 376 1376 376 5376 152 153 UYAAAA VBJAAA VVVVxx +3147 6132 1 3 7 7 47 147 1147 3147 3147 94 95 BRAAAA WBJAAA AAAAxx +9880 6133 0 0 0 0 80 880 1880 4880 9880 160 161 AQAAAA XBJAAA HHHHxx +6171 6134 1 3 1 11 71 171 171 1171 6171 142 143 JDAAAA YBJAAA OOOOxx +1850 6135 0 2 0 10 50 850 1850 1850 1850 100 101 ETAAAA ZBJAAA VVVVxx +1775 6136 1 3 5 15 75 775 1775 1775 1775 150 151 HQAAAA ACJAAA AAAAxx +9261 6137 1 1 1 1 61 261 1261 4261 9261 122 123 FSAAAA BCJAAA HHHHxx +9648 6138 0 0 8 8 48 648 1648 4648 9648 96 97 CHAAAA CCJAAA OOOOxx +7846 6139 0 2 6 6 46 846 1846 2846 7846 92 93 UPAAAA DCJAAA VVVVxx +1446 6140 0 2 6 6 46 446 1446 1446 1446 92 93 QDAAAA ECJAAA AAAAxx +3139 6141 1 3 9 19 39 139 1139 3139 3139 78 79 TQAAAA FCJAAA HHHHxx +6142 6142 0 2 2 2 42 142 142 1142 6142 84 85 GCAAAA GCJAAA OOOOxx +5812 6143 0 0 2 12 12 812 1812 812 5812 24 25 OPAAAA HCJAAA VVVVxx +6728 6144 0 0 8 8 28 728 728 1728 6728 56 57 UYAAAA ICJAAA AAAAxx +4428 6145 0 0 8 8 28 428 428 4428 4428 56 57 IOAAAA JCJAAA HHHHxx +502 6146 0 2 2 2 2 502 502 502 502 4 5 ITAAAA KCJAAA OOOOxx +2363 6147 1 3 3 3 63 363 363 2363 2363 126 127 XMAAAA LCJAAA VVVVxx +3808 6148 0 0 8 8 8 808 1808 3808 3808 16 17 MQAAAA MCJAAA AAAAxx +1010 6149 0 2 0 10 10 10 1010 1010 1010 20 21 WMAAAA NCJAAA HHHHxx +9565 6150 1 1 5 5 65 565 1565 4565 9565 130 131 XDAAAA OCJAAA OOOOxx +1587 6151 1 3 7 7 87 587 1587 1587 1587 174 175 BJAAAA PCJAAA VVVVxx +1474 6152 0 2 4 14 74 474 1474 1474 1474 148 149 SEAAAA QCJAAA AAAAxx +6215 6153 1 3 5 15 15 215 215 1215 6215 30 31 BFAAAA RCJAAA HHHHxx +2395 6154 1 3 5 15 95 395 395 2395 2395 190 191 DOAAAA SCJAAA OOOOxx +8753 6155 1 1 3 13 53 753 753 3753 8753 106 107 RYAAAA TCJAAA VVVVxx +2446 6156 0 2 6 6 46 446 446 2446 2446 92 93 CQAAAA UCJAAA AAAAxx +60 6157 0 0 0 0 60 60 60 60 60 120 121 ICAAAA VCJAAA HHHHxx +982 6158 0 2 2 2 82 982 982 982 982 164 165 ULAAAA WCJAAA OOOOxx +6489 6159 1 1 9 9 89 489 489 1489 6489 178 179 PPAAAA XCJAAA VVVVxx +5334 6160 0 2 4 14 34 334 1334 334 5334 68 69 EXAAAA YCJAAA AAAAxx +8540 6161 0 0 0 0 40 540 540 3540 8540 80 81 MQAAAA ZCJAAA HHHHxx +490 6162 0 2 0 10 90 490 490 490 490 180 181 WSAAAA ADJAAA OOOOxx +6763 6163 1 3 3 3 63 763 763 1763 6763 126 127 DAAAAA BDJAAA VVVVxx +8273 6164 1 1 3 13 73 273 273 3273 8273 146 147 FGAAAA CDJAAA AAAAxx +8327 6165 1 3 7 7 27 327 327 3327 8327 54 55 HIAAAA DDJAAA HHHHxx +8541 6166 1 1 1 1 41 541 541 3541 8541 82 83 NQAAAA EDJAAA OOOOxx +3459 6167 1 3 9 19 59 459 1459 3459 3459 118 119 BDAAAA FDJAAA VVVVxx +5557 6168 1 1 7 17 57 557 1557 557 5557 114 115 TFAAAA GDJAAA AAAAxx +158 6169 0 2 8 18 58 158 158 158 158 116 117 CGAAAA HDJAAA HHHHxx +1741 6170 1 1 1 1 41 741 1741 1741 1741 82 83 ZOAAAA IDJAAA OOOOxx +8385 6171 1 1 5 5 85 385 385 3385 8385 170 171 NKAAAA JDJAAA VVVVxx +617 6172 1 1 7 17 17 617 617 617 617 34 35 TXAAAA KDJAAA AAAAxx +3560 6173 0 0 0 0 60 560 1560 3560 3560 120 121 YGAAAA LDJAAA HHHHxx +5216 6174 0 0 6 16 16 216 1216 216 5216 32 33 QSAAAA MDJAAA OOOOxx +8443 6175 1 3 3 3 43 443 443 3443 8443 86 87 TMAAAA NDJAAA VVVVxx +2700 6176 0 0 0 0 0 700 700 2700 2700 0 1 WZAAAA ODJAAA AAAAxx +3661 6177 1 1 1 1 61 661 1661 3661 3661 122 123 VKAAAA PDJAAA HHHHxx +4875 6178 1 3 5 15 75 875 875 4875 4875 150 151 NFAAAA QDJAAA OOOOxx +6721 6179 1 1 1 1 21 721 721 1721 6721 42 43 NYAAAA RDJAAA VVVVxx +3659 6180 1 3 9 19 59 659 1659 3659 3659 118 119 TKAAAA SDJAAA AAAAxx +8944 6181 0 0 4 4 44 944 944 3944 8944 88 89 AGAAAA TDJAAA HHHHxx +9133 6182 1 1 3 13 33 133 1133 4133 9133 66 67 HNAAAA UDJAAA OOOOxx +9882 6183 0 2 2 2 82 882 1882 4882 9882 164 165 CQAAAA VDJAAA VVVVxx +2102 6184 0 2 2 2 2 102 102 2102 2102 4 5 WCAAAA WDJAAA AAAAxx +9445 6185 1 1 5 5 45 445 1445 4445 9445 90 91 HZAAAA XDJAAA HHHHxx +5559 6186 1 3 9 19 59 559 1559 559 5559 118 119 VFAAAA YDJAAA OOOOxx +6096 6187 0 0 6 16 96 96 96 1096 6096 192 193 MAAAAA ZDJAAA VVVVxx +9336 6188 0 0 6 16 36 336 1336 4336 9336 72 73 CVAAAA AEJAAA AAAAxx +2162 6189 0 2 2 2 62 162 162 2162 2162 124 125 EFAAAA BEJAAA HHHHxx +7459 6190 1 3 9 19 59 459 1459 2459 7459 118 119 XAAAAA CEJAAA OOOOxx +3248 6191 0 0 8 8 48 248 1248 3248 3248 96 97 YUAAAA DEJAAA VVVVxx +9539 6192 1 3 9 19 39 539 1539 4539 9539 78 79 XCAAAA EEJAAA AAAAxx +4449 6193 1 1 9 9 49 449 449 4449 4449 98 99 DPAAAA FEJAAA HHHHxx +2809 6194 1 1 9 9 9 809 809 2809 2809 18 19 BEAAAA GEJAAA OOOOxx +7058 6195 0 2 8 18 58 58 1058 2058 7058 116 117 MLAAAA HEJAAA VVVVxx +3512 6196 0 0 2 12 12 512 1512 3512 3512 24 25 CFAAAA IEJAAA AAAAxx +2802 6197 0 2 2 2 2 802 802 2802 2802 4 5 UDAAAA JEJAAA HHHHxx +6289 6198 1 1 9 9 89 289 289 1289 6289 178 179 XHAAAA KEJAAA OOOOxx +1947 6199 1 3 7 7 47 947 1947 1947 1947 94 95 XWAAAA LEJAAA VVVVxx +9572 6200 0 0 2 12 72 572 1572 4572 9572 144 145 EEAAAA MEJAAA AAAAxx +2356 6201 0 0 6 16 56 356 356 2356 2356 112 113 QMAAAA NEJAAA HHHHxx +3039 6202 1 3 9 19 39 39 1039 3039 3039 78 79 XMAAAA OEJAAA OOOOxx +9452 6203 0 0 2 12 52 452 1452 4452 9452 104 105 OZAAAA PEJAAA VVVVxx +6328 6204 0 0 8 8 28 328 328 1328 6328 56 57 KJAAAA QEJAAA AAAAxx +7661 6205 1 1 1 1 61 661 1661 2661 7661 122 123 RIAAAA REJAAA HHHHxx +2566 6206 0 2 6 6 66 566 566 2566 2566 132 133 SUAAAA SEJAAA OOOOxx +6095 6207 1 3 5 15 95 95 95 1095 6095 190 191 LAAAAA TEJAAA VVVVxx +6367 6208 1 3 7 7 67 367 367 1367 6367 134 135 XKAAAA UEJAAA AAAAxx +3368 6209 0 0 8 8 68 368 1368 3368 3368 136 137 OZAAAA VEJAAA HHHHxx +5567 6210 1 3 7 7 67 567 1567 567 5567 134 135 DGAAAA WEJAAA OOOOxx +9834 6211 0 2 4 14 34 834 1834 4834 9834 68 69 GOAAAA XEJAAA VVVVxx +9695 6212 1 3 5 15 95 695 1695 4695 9695 190 191 XIAAAA YEJAAA AAAAxx +7291 6213 1 3 1 11 91 291 1291 2291 7291 182 183 LUAAAA ZEJAAA HHHHxx +4806 6214 0 2 6 6 6 806 806 4806 4806 12 13 WCAAAA AFJAAA OOOOxx +2000 6215 0 0 0 0 0 0 0 2000 2000 0 1 YYAAAA BFJAAA VVVVxx +6817 6216 1 1 7 17 17 817 817 1817 6817 34 35 FCAAAA CFJAAA AAAAxx +8487 6217 1 3 7 7 87 487 487 3487 8487 174 175 LOAAAA DFJAAA HHHHxx +3245 6218 1 1 5 5 45 245 1245 3245 3245 90 91 VUAAAA EFJAAA OOOOxx +632 6219 0 0 2 12 32 632 632 632 632 64 65 IYAAAA FFJAAA VVVVxx +8067 6220 1 3 7 7 67 67 67 3067 8067 134 135 HYAAAA GFJAAA AAAAxx +7140 6221 0 0 0 0 40 140 1140 2140 7140 80 81 QOAAAA HFJAAA HHHHxx +6802 6222 0 2 2 2 2 802 802 1802 6802 4 5 QBAAAA IFJAAA OOOOxx +3980 6223 0 0 0 0 80 980 1980 3980 3980 160 161 CXAAAA JFJAAA VVVVxx +1321 6224 1 1 1 1 21 321 1321 1321 1321 42 43 VYAAAA KFJAAA AAAAxx +2273 6225 1 1 3 13 73 273 273 2273 2273 146 147 LJAAAA LFJAAA HHHHxx +6787 6226 1 3 7 7 87 787 787 1787 6787 174 175 BBAAAA MFJAAA OOOOxx +9480 6227 0 0 0 0 80 480 1480 4480 9480 160 161 QAAAAA NFJAAA VVVVxx +9404 6228 0 0 4 4 4 404 1404 4404 9404 8 9 SXAAAA OFJAAA AAAAxx +3914 6229 0 2 4 14 14 914 1914 3914 3914 28 29 OUAAAA PFJAAA HHHHxx +5507 6230 1 3 7 7 7 507 1507 507 5507 14 15 VDAAAA QFJAAA OOOOxx +1813 6231 1 1 3 13 13 813 1813 1813 1813 26 27 TRAAAA RFJAAA VVVVxx +1999 6232 1 3 9 19 99 999 1999 1999 1999 198 199 XYAAAA SFJAAA AAAAxx +3848 6233 0 0 8 8 48 848 1848 3848 3848 96 97 ASAAAA TFJAAA HHHHxx +9693 6234 1 1 3 13 93 693 1693 4693 9693 186 187 VIAAAA UFJAAA OOOOxx +1353 6235 1 1 3 13 53 353 1353 1353 1353 106 107 BAAAAA VFJAAA VVVVxx +7218 6236 0 2 8 18 18 218 1218 2218 7218 36 37 QRAAAA WFJAAA AAAAxx +8223 6237 1 3 3 3 23 223 223 3223 8223 46 47 HEAAAA XFJAAA HHHHxx +9982 6238 0 2 2 2 82 982 1982 4982 9982 164 165 YTAAAA YFJAAA OOOOxx +8799 6239 1 3 9 19 99 799 799 3799 8799 198 199 LAAAAA ZFJAAA VVVVxx +8929 6240 1 1 9 9 29 929 929 3929 8929 58 59 LFAAAA AGJAAA AAAAxx +4626 6241 0 2 6 6 26 626 626 4626 4626 52 53 YVAAAA BGJAAA HHHHxx +7958 6242 0 2 8 18 58 958 1958 2958 7958 116 117 CUAAAA CGJAAA OOOOxx +3743 6243 1 3 3 3 43 743 1743 3743 3743 86 87 ZNAAAA DGJAAA VVVVxx +8165 6244 1 1 5 5 65 165 165 3165 8165 130 131 BCAAAA EGJAAA AAAAxx +7899 6245 1 3 9 19 99 899 1899 2899 7899 198 199 VRAAAA FGJAAA HHHHxx +8698 6246 0 2 8 18 98 698 698 3698 8698 196 197 OWAAAA GGJAAA OOOOxx +9270 6247 0 2 0 10 70 270 1270 4270 9270 140 141 OSAAAA HGJAAA VVVVxx +6348 6248 0 0 8 8 48 348 348 1348 6348 96 97 EKAAAA IGJAAA AAAAxx +6999 6249 1 3 9 19 99 999 999 1999 6999 198 199 FJAAAA JGJAAA HHHHxx +8467 6250 1 3 7 7 67 467 467 3467 8467 134 135 RNAAAA KGJAAA OOOOxx +3907 6251 1 3 7 7 7 907 1907 3907 3907 14 15 HUAAAA LGJAAA VVVVxx +4738 6252 0 2 8 18 38 738 738 4738 4738 76 77 GAAAAA MGJAAA AAAAxx +248 6253 0 0 8 8 48 248 248 248 248 96 97 OJAAAA NGJAAA HHHHxx +8769 6254 1 1 9 9 69 769 769 3769 8769 138 139 HZAAAA OGJAAA OOOOxx +9922 6255 0 2 2 2 22 922 1922 4922 9922 44 45 QRAAAA PGJAAA VVVVxx +778 6256 0 2 8 18 78 778 778 778 778 156 157 YDAAAA QGJAAA AAAAxx +1233 6257 1 1 3 13 33 233 1233 1233 1233 66 67 LVAAAA RGJAAA HHHHxx +1183 6258 1 3 3 3 83 183 1183 1183 1183 166 167 NTAAAA SGJAAA OOOOxx +2838 6259 0 2 8 18 38 838 838 2838 2838 76 77 EFAAAA TGJAAA VVVVxx +3096 6260 0 0 6 16 96 96 1096 3096 3096 192 193 CPAAAA UGJAAA AAAAxx +8566 6261 0 2 6 6 66 566 566 3566 8566 132 133 MRAAAA VGJAAA HHHHxx +7635 6262 1 3 5 15 35 635 1635 2635 7635 70 71 RHAAAA WGJAAA OOOOxx +5428 6263 0 0 8 8 28 428 1428 428 5428 56 57 UAAAAA XGJAAA VVVVxx +7430 6264 0 2 0 10 30 430 1430 2430 7430 60 61 UZAAAA YGJAAA AAAAxx +7210 6265 0 2 0 10 10 210 1210 2210 7210 20 21 IRAAAA ZGJAAA HHHHxx +4485 6266 1 1 5 5 85 485 485 4485 4485 170 171 NQAAAA AHJAAA OOOOxx +9623 6267 1 3 3 3 23 623 1623 4623 9623 46 47 DGAAAA BHJAAA VVVVxx +3670 6268 0 2 0 10 70 670 1670 3670 3670 140 141 ELAAAA CHJAAA AAAAxx +1575 6269 1 3 5 15 75 575 1575 1575 1575 150 151 PIAAAA DHJAAA HHHHxx +5874 6270 0 2 4 14 74 874 1874 874 5874 148 149 YRAAAA EHJAAA OOOOxx +673 6271 1 1 3 13 73 673 673 673 673 146 147 XZAAAA FHJAAA VVVVxx +9712 6272 0 0 2 12 12 712 1712 4712 9712 24 25 OJAAAA GHJAAA AAAAxx +7729 6273 1 1 9 9 29 729 1729 2729 7729 58 59 HLAAAA HHJAAA HHHHxx +4318 6274 0 2 8 18 18 318 318 4318 4318 36 37 CKAAAA IHJAAA OOOOxx +4143 6275 1 3 3 3 43 143 143 4143 4143 86 87 JDAAAA JHJAAA VVVVxx +4932 6276 0 0 2 12 32 932 932 4932 4932 64 65 SHAAAA KHJAAA AAAAxx +5835 6277 1 3 5 15 35 835 1835 835 5835 70 71 LQAAAA LHJAAA HHHHxx +4966 6278 0 2 6 6 66 966 966 4966 4966 132 133 AJAAAA MHJAAA OOOOxx +6711 6279 1 3 1 11 11 711 711 1711 6711 22 23 DYAAAA NHJAAA VVVVxx +3990 6280 0 2 0 10 90 990 1990 3990 3990 180 181 MXAAAA OHJAAA AAAAxx +990 6281 0 2 0 10 90 990 990 990 990 180 181 CMAAAA PHJAAA HHHHxx +220 6282 0 0 0 0 20 220 220 220 220 40 41 MIAAAA QHJAAA OOOOxx +5693 6283 1 1 3 13 93 693 1693 693 5693 186 187 ZKAAAA RHJAAA VVVVxx +3662 6284 0 2 2 2 62 662 1662 3662 3662 124 125 WKAAAA SHJAAA AAAAxx +7844 6285 0 0 4 4 44 844 1844 2844 7844 88 89 SPAAAA THJAAA HHHHxx +5515 6286 1 3 5 15 15 515 1515 515 5515 30 31 DEAAAA UHJAAA OOOOxx +5551 6287 1 3 1 11 51 551 1551 551 5551 102 103 NFAAAA VHJAAA VVVVxx +2358 6288 0 2 8 18 58 358 358 2358 2358 116 117 SMAAAA WHJAAA AAAAxx +8977 6289 1 1 7 17 77 977 977 3977 8977 154 155 HHAAAA XHJAAA HHHHxx +7040 6290 0 0 0 0 40 40 1040 2040 7040 80 81 UKAAAA YHJAAA OOOOxx +105 6291 1 1 5 5 5 105 105 105 105 10 11 BEAAAA ZHJAAA VVVVxx +4496 6292 0 0 6 16 96 496 496 4496 4496 192 193 YQAAAA AIJAAA AAAAxx +2254 6293 0 2 4 14 54 254 254 2254 2254 108 109 SIAAAA BIJAAA HHHHxx +411 6294 1 3 1 11 11 411 411 411 411 22 23 VPAAAA CIJAAA OOOOxx +2373 6295 1 1 3 13 73 373 373 2373 2373 146 147 HNAAAA DIJAAA VVVVxx +3477 6296 1 1 7 17 77 477 1477 3477 3477 154 155 TDAAAA EIJAAA AAAAxx +8964 6297 0 0 4 4 64 964 964 3964 8964 128 129 UGAAAA FIJAAA HHHHxx +8471 6298 1 3 1 11 71 471 471 3471 8471 142 143 VNAAAA GIJAAA OOOOxx +5776 6299 0 0 6 16 76 776 1776 776 5776 152 153 EOAAAA HIJAAA VVVVxx +9921 6300 1 1 1 1 21 921 1921 4921 9921 42 43 PRAAAA IIJAAA AAAAxx +7816 6301 0 0 6 16 16 816 1816 2816 7816 32 33 QOAAAA JIJAAA HHHHxx +2439 6302 1 3 9 19 39 439 439 2439 2439 78 79 VPAAAA KIJAAA OOOOxx +9298 6303 0 2 8 18 98 298 1298 4298 9298 196 197 QTAAAA LIJAAA VVVVxx +9424 6304 0 0 4 4 24 424 1424 4424 9424 48 49 MYAAAA MIJAAA AAAAxx +3252 6305 0 0 2 12 52 252 1252 3252 3252 104 105 CVAAAA NIJAAA HHHHxx +1401 6306 1 1 1 1 1 401 1401 1401 1401 2 3 XBAAAA OIJAAA OOOOxx +9632 6307 0 0 2 12 32 632 1632 4632 9632 64 65 MGAAAA PIJAAA VVVVxx +370 6308 0 2 0 10 70 370 370 370 370 140 141 GOAAAA QIJAAA AAAAxx +728 6309 0 0 8 8 28 728 728 728 728 56 57 ACAAAA RIJAAA HHHHxx +2888 6310 0 0 8 8 88 888 888 2888 2888 176 177 CHAAAA SIJAAA OOOOxx +1441 6311 1 1 1 1 41 441 1441 1441 1441 82 83 LDAAAA TIJAAA VVVVxx +8308 6312 0 0 8 8 8 308 308 3308 8308 16 17 OHAAAA UIJAAA AAAAxx +2165 6313 1 1 5 5 65 165 165 2165 2165 130 131 HFAAAA VIJAAA HHHHxx +6359 6314 1 3 9 19 59 359 359 1359 6359 118 119 PKAAAA WIJAAA OOOOxx +9637 6315 1 1 7 17 37 637 1637 4637 9637 74 75 RGAAAA XIJAAA VVVVxx +5208 6316 0 0 8 8 8 208 1208 208 5208 16 17 ISAAAA YIJAAA AAAAxx +4705 6317 1 1 5 5 5 705 705 4705 4705 10 11 ZYAAAA ZIJAAA HHHHxx +2341 6318 1 1 1 1 41 341 341 2341 2341 82 83 BMAAAA AJJAAA OOOOxx +8539 6319 1 3 9 19 39 539 539 3539 8539 78 79 LQAAAA BJJAAA VVVVxx +7528 6320 0 0 8 8 28 528 1528 2528 7528 56 57 ODAAAA CJJAAA AAAAxx +7969 6321 1 1 9 9 69 969 1969 2969 7969 138 139 NUAAAA DJJAAA HHHHxx +6381 6322 1 1 1 1 81 381 381 1381 6381 162 163 LLAAAA EJJAAA OOOOxx +4906 6323 0 2 6 6 6 906 906 4906 4906 12 13 SGAAAA FJJAAA VVVVxx +8697 6324 1 1 7 17 97 697 697 3697 8697 194 195 NWAAAA GJJAAA AAAAxx +6301 6325 1 1 1 1 1 301 301 1301 6301 2 3 JIAAAA HJJAAA HHHHxx +7554 6326 0 2 4 14 54 554 1554 2554 7554 108 109 OEAAAA IJJAAA OOOOxx +5107 6327 1 3 7 7 7 107 1107 107 5107 14 15 LOAAAA JJJAAA VVVVxx +5046 6328 0 2 6 6 46 46 1046 46 5046 92 93 CMAAAA KJJAAA AAAAxx +4063 6329 1 3 3 3 63 63 63 4063 4063 126 127 HAAAAA LJJAAA HHHHxx +7580 6330 0 0 0 0 80 580 1580 2580 7580 160 161 OFAAAA MJJAAA OOOOxx +2245 6331 1 1 5 5 45 245 245 2245 2245 90 91 JIAAAA NJJAAA VVVVxx +3711 6332 1 3 1 11 11 711 1711 3711 3711 22 23 TMAAAA OJJAAA AAAAxx +3220 6333 0 0 0 0 20 220 1220 3220 3220 40 41 WTAAAA PJJAAA HHHHxx +6463 6334 1 3 3 3 63 463 463 1463 6463 126 127 POAAAA QJJAAA OOOOxx +8196 6335 0 0 6 16 96 196 196 3196 8196 192 193 GDAAAA RJJAAA VVVVxx +9875 6336 1 3 5 15 75 875 1875 4875 9875 150 151 VPAAAA SJJAAA AAAAxx +1333 6337 1 1 3 13 33 333 1333 1333 1333 66 67 HZAAAA TJJAAA HHHHxx +7880 6338 0 0 0 0 80 880 1880 2880 7880 160 161 CRAAAA UJJAAA OOOOxx +2322 6339 0 2 2 2 22 322 322 2322 2322 44 45 ILAAAA VJJAAA VVVVxx +2163 6340 1 3 3 3 63 163 163 2163 2163 126 127 FFAAAA WJJAAA AAAAxx +421 6341 1 1 1 1 21 421 421 421 421 42 43 FQAAAA XJJAAA HHHHxx +2042 6342 0 2 2 2 42 42 42 2042 2042 84 85 OAAAAA YJJAAA OOOOxx +1424 6343 0 0 4 4 24 424 1424 1424 1424 48 49 UCAAAA ZJJAAA VVVVxx +7870 6344 0 2 0 10 70 870 1870 2870 7870 140 141 SQAAAA AKJAAA AAAAxx +2653 6345 1 1 3 13 53 653 653 2653 2653 106 107 BYAAAA BKJAAA HHHHxx +4216 6346 0 0 6 16 16 216 216 4216 4216 32 33 EGAAAA CKJAAA OOOOxx +1515 6347 1 3 5 15 15 515 1515 1515 1515 30 31 HGAAAA DKJAAA VVVVxx +7860 6348 0 0 0 0 60 860 1860 2860 7860 120 121 IQAAAA EKJAAA AAAAxx +2984 6349 0 0 4 4 84 984 984 2984 2984 168 169 UKAAAA FKJAAA HHHHxx +6269 6350 1 1 9 9 69 269 269 1269 6269 138 139 DHAAAA GKJAAA OOOOxx +2609 6351 1 1 9 9 9 609 609 2609 2609 18 19 JWAAAA HKJAAA VVVVxx +3671 6352 1 3 1 11 71 671 1671 3671 3671 142 143 FLAAAA IKJAAA AAAAxx +4544 6353 0 0 4 4 44 544 544 4544 4544 88 89 USAAAA JKJAAA HHHHxx +4668 6354 0 0 8 8 68 668 668 4668 4668 136 137 OXAAAA KKJAAA OOOOxx +2565 6355 1 1 5 5 65 565 565 2565 2565 130 131 RUAAAA LKJAAA VVVVxx +3126 6356 0 2 6 6 26 126 1126 3126 3126 52 53 GQAAAA MKJAAA AAAAxx +7573 6357 1 1 3 13 73 573 1573 2573 7573 146 147 HFAAAA NKJAAA HHHHxx +1476 6358 0 0 6 16 76 476 1476 1476 1476 152 153 UEAAAA OKJAAA OOOOxx +2146 6359 0 2 6 6 46 146 146 2146 2146 92 93 OEAAAA PKJAAA VVVVxx +9990 6360 0 2 0 10 90 990 1990 4990 9990 180 181 GUAAAA QKJAAA AAAAxx +2530 6361 0 2 0 10 30 530 530 2530 2530 60 61 ITAAAA RKJAAA HHHHxx +9288 6362 0 0 8 8 88 288 1288 4288 9288 176 177 GTAAAA SKJAAA OOOOxx +9755 6363 1 3 5 15 55 755 1755 4755 9755 110 111 FLAAAA TKJAAA VVVVxx +5305 6364 1 1 5 5 5 305 1305 305 5305 10 11 BWAAAA UKJAAA AAAAxx +2495 6365 1 3 5 15 95 495 495 2495 2495 190 191 ZRAAAA VKJAAA HHHHxx +5443 6366 1 3 3 3 43 443 1443 443 5443 86 87 JBAAAA WKJAAA OOOOxx +1930 6367 0 2 0 10 30 930 1930 1930 1930 60 61 GWAAAA XKJAAA VVVVxx +9134 6368 0 2 4 14 34 134 1134 4134 9134 68 69 INAAAA YKJAAA AAAAxx +2844 6369 0 0 4 4 44 844 844 2844 2844 88 89 KFAAAA ZKJAAA HHHHxx +896 6370 0 0 6 16 96 896 896 896 896 192 193 MIAAAA ALJAAA OOOOxx +1330 6371 0 2 0 10 30 330 1330 1330 1330 60 61 EZAAAA BLJAAA VVVVxx +8980 6372 0 0 0 0 80 980 980 3980 8980 160 161 KHAAAA CLJAAA AAAAxx +5940 6373 0 0 0 0 40 940 1940 940 5940 80 81 MUAAAA DLJAAA HHHHxx +6494 6374 0 2 4 14 94 494 494 1494 6494 188 189 UPAAAA ELJAAA OOOOxx +165 6375 1 1 5 5 65 165 165 165 165 130 131 JGAAAA FLJAAA VVVVxx +2510 6376 0 2 0 10 10 510 510 2510 2510 20 21 OSAAAA GLJAAA AAAAxx +9950 6377 0 2 0 10 50 950 1950 4950 9950 100 101 SSAAAA HLJAAA HHHHxx +3854 6378 0 2 4 14 54 854 1854 3854 3854 108 109 GSAAAA ILJAAA OOOOxx +7493 6379 1 1 3 13 93 493 1493 2493 7493 186 187 FCAAAA JLJAAA VVVVxx +4124 6380 0 0 4 4 24 124 124 4124 4124 48 49 QCAAAA KLJAAA AAAAxx +8563 6381 1 3 3 3 63 563 563 3563 8563 126 127 JRAAAA LLJAAA HHHHxx +8735 6382 1 3 5 15 35 735 735 3735 8735 70 71 ZXAAAA MLJAAA OOOOxx +9046 6383 0 2 6 6 46 46 1046 4046 9046 92 93 YJAAAA NLJAAA VVVVxx +1754 6384 0 2 4 14 54 754 1754 1754 1754 108 109 MPAAAA OLJAAA AAAAxx +6954 6385 0 2 4 14 54 954 954 1954 6954 108 109 MHAAAA PLJAAA HHHHxx +4953 6386 1 1 3 13 53 953 953 4953 4953 106 107 NIAAAA QLJAAA OOOOxx +8142 6387 0 2 2 2 42 142 142 3142 8142 84 85 EBAAAA RLJAAA VVVVxx +9661 6388 1 1 1 1 61 661 1661 4661 9661 122 123 PHAAAA SLJAAA AAAAxx +6415 6389 1 3 5 15 15 415 415 1415 6415 30 31 TMAAAA TLJAAA HHHHxx +5782 6390 0 2 2 2 82 782 1782 782 5782 164 165 KOAAAA ULJAAA OOOOxx +7721 6391 1 1 1 1 21 721 1721 2721 7721 42 43 ZKAAAA VLJAAA VVVVxx +580 6392 0 0 0 0 80 580 580 580 580 160 161 IWAAAA WLJAAA AAAAxx +3784 6393 0 0 4 4 84 784 1784 3784 3784 168 169 OPAAAA XLJAAA HHHHxx +9810 6394 0 2 0 10 10 810 1810 4810 9810 20 21 INAAAA YLJAAA OOOOxx +8488 6395 0 0 8 8 88 488 488 3488 8488 176 177 MOAAAA ZLJAAA VVVVxx +6214 6396 0 2 4 14 14 214 214 1214 6214 28 29 AFAAAA AMJAAA AAAAxx +9433 6397 1 1 3 13 33 433 1433 4433 9433 66 67 VYAAAA BMJAAA HHHHxx +9959 6398 1 3 9 19 59 959 1959 4959 9959 118 119 BTAAAA CMJAAA OOOOxx +554 6399 0 2 4 14 54 554 554 554 554 108 109 IVAAAA DMJAAA VVVVxx +6646 6400 0 2 6 6 46 646 646 1646 6646 92 93 QVAAAA EMJAAA AAAAxx +1138 6401 0 2 8 18 38 138 1138 1138 1138 76 77 URAAAA FMJAAA HHHHxx +9331 6402 1 3 1 11 31 331 1331 4331 9331 62 63 XUAAAA GMJAAA OOOOxx +7331 6403 1 3 1 11 31 331 1331 2331 7331 62 63 ZVAAAA HMJAAA VVVVxx +3482 6404 0 2 2 2 82 482 1482 3482 3482 164 165 YDAAAA IMJAAA AAAAxx +3795 6405 1 3 5 15 95 795 1795 3795 3795 190 191 ZPAAAA JMJAAA HHHHxx +2441 6406 1 1 1 1 41 441 441 2441 2441 82 83 XPAAAA KMJAAA OOOOxx +5229 6407 1 1 9 9 29 229 1229 229 5229 58 59 DTAAAA LMJAAA VVVVxx +7012 6408 0 0 2 12 12 12 1012 2012 7012 24 25 SJAAAA MMJAAA AAAAxx +7036 6409 0 0 6 16 36 36 1036 2036 7036 72 73 QKAAAA NMJAAA HHHHxx +8243 6410 1 3 3 3 43 243 243 3243 8243 86 87 BFAAAA OMJAAA OOOOxx +9320 6411 0 0 0 0 20 320 1320 4320 9320 40 41 MUAAAA PMJAAA VVVVxx +4693 6412 1 1 3 13 93 693 693 4693 4693 186 187 NYAAAA QMJAAA AAAAxx +6741 6413 1 1 1 1 41 741 741 1741 6741 82 83 HZAAAA RMJAAA HHHHxx +2997 6414 1 1 7 17 97 997 997 2997 2997 194 195 HLAAAA SMJAAA OOOOxx +4838 6415 0 2 8 18 38 838 838 4838 4838 76 77 CEAAAA TMJAAA VVVVxx +6945 6416 1 1 5 5 45 945 945 1945 6945 90 91 DHAAAA UMJAAA AAAAxx +8253 6417 1 1 3 13 53 253 253 3253 8253 106 107 LFAAAA VMJAAA HHHHxx +8989 6418 1 1 9 9 89 989 989 3989 8989 178 179 THAAAA WMJAAA OOOOxx +2640 6419 0 0 0 0 40 640 640 2640 2640 80 81 OXAAAA XMJAAA VVVVxx +5647 6420 1 3 7 7 47 647 1647 647 5647 94 95 FJAAAA YMJAAA AAAAxx +7186 6421 0 2 6 6 86 186 1186 2186 7186 172 173 KQAAAA ZMJAAA HHHHxx +3278 6422 0 2 8 18 78 278 1278 3278 3278 156 157 CWAAAA ANJAAA OOOOxx +8546 6423 0 2 6 6 46 546 546 3546 8546 92 93 SQAAAA BNJAAA VVVVxx +8297 6424 1 1 7 17 97 297 297 3297 8297 194 195 DHAAAA CNJAAA AAAAxx +9534 6425 0 2 4 14 34 534 1534 4534 9534 68 69 SCAAAA DNJAAA HHHHxx +9618 6426 0 2 8 18 18 618 1618 4618 9618 36 37 YFAAAA ENJAAA OOOOxx +8839 6427 1 3 9 19 39 839 839 3839 8839 78 79 ZBAAAA FNJAAA VVVVxx +7605 6428 1 1 5 5 5 605 1605 2605 7605 10 11 NGAAAA GNJAAA AAAAxx +6421 6429 1 1 1 1 21 421 421 1421 6421 42 43 ZMAAAA HNJAAA HHHHxx +3582 6430 0 2 2 2 82 582 1582 3582 3582 164 165 UHAAAA INJAAA OOOOxx +485 6431 1 1 5 5 85 485 485 485 485 170 171 RSAAAA JNJAAA VVVVxx +1925 6432 1 1 5 5 25 925 1925 1925 1925 50 51 BWAAAA KNJAAA AAAAxx +4296 6433 0 0 6 16 96 296 296 4296 4296 192 193 GJAAAA LNJAAA HHHHxx +8874 6434 0 2 4 14 74 874 874 3874 8874 148 149 IDAAAA MNJAAA OOOOxx +1443 6435 1 3 3 3 43 443 1443 1443 1443 86 87 NDAAAA NNJAAA VVVVxx +4239 6436 1 3 9 19 39 239 239 4239 4239 78 79 BHAAAA ONJAAA AAAAxx +9760 6437 0 0 0 0 60 760 1760 4760 9760 120 121 KLAAAA PNJAAA HHHHxx +136 6438 0 0 6 16 36 136 136 136 136 72 73 GFAAAA QNJAAA OOOOxx +6472 6439 0 0 2 12 72 472 472 1472 6472 144 145 YOAAAA RNJAAA VVVVxx +4896 6440 0 0 6 16 96 896 896 4896 4896 192 193 IGAAAA SNJAAA AAAAxx +9028 6441 0 0 8 8 28 28 1028 4028 9028 56 57 GJAAAA TNJAAA HHHHxx +8354 6442 0 2 4 14 54 354 354 3354 8354 108 109 IJAAAA UNJAAA OOOOxx +8648 6443 0 0 8 8 48 648 648 3648 8648 96 97 QUAAAA VNJAAA VVVVxx +918 6444 0 2 8 18 18 918 918 918 918 36 37 IJAAAA WNJAAA AAAAxx +6606 6445 0 2 6 6 6 606 606 1606 6606 12 13 CUAAAA XNJAAA HHHHxx +2462 6446 0 2 2 2 62 462 462 2462 2462 124 125 SQAAAA YNJAAA OOOOxx +7536 6447 0 0 6 16 36 536 1536 2536 7536 72 73 WDAAAA ZNJAAA VVVVxx +1700 6448 0 0 0 0 0 700 1700 1700 1700 0 1 KNAAAA AOJAAA AAAAxx +6740 6449 0 0 0 0 40 740 740 1740 6740 80 81 GZAAAA BOJAAA HHHHxx +28 6450 0 0 8 8 28 28 28 28 28 56 57 CBAAAA COJAAA OOOOxx +6044 6451 0 0 4 4 44 44 44 1044 6044 88 89 MYAAAA DOJAAA VVVVxx +5053 6452 1 1 3 13 53 53 1053 53 5053 106 107 JMAAAA EOJAAA AAAAxx +4832 6453 0 0 2 12 32 832 832 4832 4832 64 65 WDAAAA FOJAAA HHHHxx +9145 6454 1 1 5 5 45 145 1145 4145 9145 90 91 TNAAAA GOJAAA OOOOxx +5482 6455 0 2 2 2 82 482 1482 482 5482 164 165 WCAAAA HOJAAA VVVVxx +7644 6456 0 0 4 4 44 644 1644 2644 7644 88 89 AIAAAA IOJAAA AAAAxx +2128 6457 0 0 8 8 28 128 128 2128 2128 56 57 WDAAAA JOJAAA HHHHxx +6583 6458 1 3 3 3 83 583 583 1583 6583 166 167 FTAAAA KOJAAA OOOOxx +4224 6459 0 0 4 4 24 224 224 4224 4224 48 49 MGAAAA LOJAAA VVVVxx +5253 6460 1 1 3 13 53 253 1253 253 5253 106 107 BUAAAA MOJAAA AAAAxx +8219 6461 1 3 9 19 19 219 219 3219 8219 38 39 DEAAAA NOJAAA HHHHxx +8113 6462 1 1 3 13 13 113 113 3113 8113 26 27 BAAAAA OOJAAA OOOOxx +3616 6463 0 0 6 16 16 616 1616 3616 3616 32 33 CJAAAA POJAAA VVVVxx +1361 6464 1 1 1 1 61 361 1361 1361 1361 122 123 JAAAAA QOJAAA AAAAxx +949 6465 1 1 9 9 49 949 949 949 949 98 99 NKAAAA ROJAAA HHHHxx +8582 6466 0 2 2 2 82 582 582 3582 8582 164 165 CSAAAA SOJAAA OOOOxx +5104 6467 0 0 4 4 4 104 1104 104 5104 8 9 IOAAAA TOJAAA VVVVxx +6146 6468 0 2 6 6 46 146 146 1146 6146 92 93 KCAAAA UOJAAA AAAAxx +7681 6469 1 1 1 1 81 681 1681 2681 7681 162 163 LJAAAA VOJAAA HHHHxx +1904 6470 0 0 4 4 4 904 1904 1904 1904 8 9 GVAAAA WOJAAA OOOOxx +1989 6471 1 1 9 9 89 989 1989 1989 1989 178 179 NYAAAA XOJAAA VVVVxx +4179 6472 1 3 9 19 79 179 179 4179 4179 158 159 TEAAAA YOJAAA AAAAxx +1739 6473 1 3 9 19 39 739 1739 1739 1739 78 79 XOAAAA ZOJAAA HHHHxx +2447 6474 1 3 7 7 47 447 447 2447 2447 94 95 DQAAAA APJAAA OOOOxx +3029 6475 1 1 9 9 29 29 1029 3029 3029 58 59 NMAAAA BPJAAA VVVVxx +9783 6476 1 3 3 3 83 783 1783 4783 9783 166 167 HMAAAA CPJAAA AAAAxx +8381 6477 1 1 1 1 81 381 381 3381 8381 162 163 JKAAAA DPJAAA HHHHxx +8755 6478 1 3 5 15 55 755 755 3755 8755 110 111 TYAAAA EPJAAA OOOOxx +8384 6479 0 0 4 4 84 384 384 3384 8384 168 169 MKAAAA FPJAAA VVVVxx +7655 6480 1 3 5 15 55 655 1655 2655 7655 110 111 LIAAAA GPJAAA AAAAxx +4766 6481 0 2 6 6 66 766 766 4766 4766 132 133 IBAAAA HPJAAA HHHHxx +3324 6482 0 0 4 4 24 324 1324 3324 3324 48 49 WXAAAA IPJAAA OOOOxx +5022 6483 0 2 2 2 22 22 1022 22 5022 44 45 ELAAAA JPJAAA VVVVxx +2856 6484 0 0 6 16 56 856 856 2856 2856 112 113 WFAAAA KPJAAA AAAAxx +6503 6485 1 3 3 3 3 503 503 1503 6503 6 7 DQAAAA LPJAAA HHHHxx +6872 6486 0 0 2 12 72 872 872 1872 6872 144 145 IEAAAA MPJAAA OOOOxx +1663 6487 1 3 3 3 63 663 1663 1663 1663 126 127 ZLAAAA NPJAAA VVVVxx +6964 6488 0 0 4 4 64 964 964 1964 6964 128 129 WHAAAA OPJAAA AAAAxx +4622 6489 0 2 2 2 22 622 622 4622 4622 44 45 UVAAAA PPJAAA HHHHxx +6089 6490 1 1 9 9 89 89 89 1089 6089 178 179 FAAAAA QPJAAA OOOOxx +8567 6491 1 3 7 7 67 567 567 3567 8567 134 135 NRAAAA RPJAAA VVVVxx +597 6492 1 1 7 17 97 597 597 597 597 194 195 ZWAAAA SPJAAA AAAAxx +4222 6493 0 2 2 2 22 222 222 4222 4222 44 45 KGAAAA TPJAAA HHHHxx +9322 6494 0 2 2 2 22 322 1322 4322 9322 44 45 OUAAAA UPJAAA OOOOxx +624 6495 0 0 4 4 24 624 624 624 624 48 49 AYAAAA VPJAAA VVVVxx +4329 6496 1 1 9 9 29 329 329 4329 4329 58 59 NKAAAA WPJAAA AAAAxx +6781 6497 1 1 1 1 81 781 781 1781 6781 162 163 VAAAAA XPJAAA HHHHxx +1673 6498 1 1 3 13 73 673 1673 1673 1673 146 147 JMAAAA YPJAAA OOOOxx +6633 6499 1 1 3 13 33 633 633 1633 6633 66 67 DVAAAA ZPJAAA VVVVxx +2569 6500 1 1 9 9 69 569 569 2569 2569 138 139 VUAAAA AQJAAA AAAAxx +4995 6501 1 3 5 15 95 995 995 4995 4995 190 191 DKAAAA BQJAAA HHHHxx +2749 6502 1 1 9 9 49 749 749 2749 2749 98 99 TBAAAA CQJAAA OOOOxx +9044 6503 0 0 4 4 44 44 1044 4044 9044 88 89 WJAAAA DQJAAA VVVVxx +5823 6504 1 3 3 3 23 823 1823 823 5823 46 47 ZPAAAA EQJAAA AAAAxx +9366 6505 0 2 6 6 66 366 1366 4366 9366 132 133 GWAAAA FQJAAA HHHHxx +1169 6506 1 1 9 9 69 169 1169 1169 1169 138 139 ZSAAAA GQJAAA OOOOxx +1300 6507 0 0 0 0 0 300 1300 1300 1300 0 1 AYAAAA HQJAAA VVVVxx +9973 6508 1 1 3 13 73 973 1973 4973 9973 146 147 PTAAAA IQJAAA AAAAxx +2092 6509 0 0 2 12 92 92 92 2092 2092 184 185 MCAAAA JQJAAA HHHHxx +9776 6510 0 0 6 16 76 776 1776 4776 9776 152 153 AMAAAA KQJAAA OOOOxx +7612 6511 0 0 2 12 12 612 1612 2612 7612 24 25 UGAAAA LQJAAA VVVVxx +7190 6512 0 2 0 10 90 190 1190 2190 7190 180 181 OQAAAA MQJAAA AAAAxx +5147 6513 1 3 7 7 47 147 1147 147 5147 94 95 ZPAAAA NQJAAA HHHHxx +3722 6514 0 2 2 2 22 722 1722 3722 3722 44 45 ENAAAA OQJAAA OOOOxx +5858 6515 0 2 8 18 58 858 1858 858 5858 116 117 IRAAAA PQJAAA VVVVxx +3204 6516 0 0 4 4 4 204 1204 3204 3204 8 9 GTAAAA QQJAAA AAAAxx +8994 6517 0 2 4 14 94 994 994 3994 8994 188 189 YHAAAA RQJAAA HHHHxx +7478 6518 0 2 8 18 78 478 1478 2478 7478 156 157 QBAAAA SQJAAA OOOOxx +9624 6519 0 0 4 4 24 624 1624 4624 9624 48 49 EGAAAA TQJAAA VVVVxx +6639 6520 1 3 9 19 39 639 639 1639 6639 78 79 JVAAAA UQJAAA AAAAxx +369 6521 1 1 9 9 69 369 369 369 369 138 139 FOAAAA VQJAAA HHHHxx +7766 6522 0 2 6 6 66 766 1766 2766 7766 132 133 SMAAAA WQJAAA OOOOxx +4094 6523 0 2 4 14 94 94 94 4094 4094 188 189 MBAAAA XQJAAA VVVVxx +9556 6524 0 0 6 16 56 556 1556 4556 9556 112 113 ODAAAA YQJAAA AAAAxx +4887 6525 1 3 7 7 87 887 887 4887 4887 174 175 ZFAAAA ZQJAAA HHHHxx +2321 6526 1 1 1 1 21 321 321 2321 2321 42 43 HLAAAA ARJAAA OOOOxx +9201 6527 1 1 1 1 1 201 1201 4201 9201 2 3 XPAAAA BRJAAA VVVVxx +1627 6528 1 3 7 7 27 627 1627 1627 1627 54 55 PKAAAA CRJAAA AAAAxx +150 6529 0 2 0 10 50 150 150 150 150 100 101 UFAAAA DRJAAA HHHHxx +8010 6530 0 2 0 10 10 10 10 3010 8010 20 21 CWAAAA ERJAAA OOOOxx +8026 6531 0 2 6 6 26 26 26 3026 8026 52 53 SWAAAA FRJAAA VVVVxx +5495 6532 1 3 5 15 95 495 1495 495 5495 190 191 JDAAAA GRJAAA AAAAxx +6213 6533 1 1 3 13 13 213 213 1213 6213 26 27 ZEAAAA HRJAAA HHHHxx +6464 6534 0 0 4 4 64 464 464 1464 6464 128 129 QOAAAA IRJAAA OOOOxx +1158 6535 0 2 8 18 58 158 1158 1158 1158 116 117 OSAAAA JRJAAA VVVVxx +8669 6536 1 1 9 9 69 669 669 3669 8669 138 139 LVAAAA KRJAAA AAAAxx +3225 6537 1 1 5 5 25 225 1225 3225 3225 50 51 BUAAAA LRJAAA HHHHxx +1294 6538 0 2 4 14 94 294 1294 1294 1294 188 189 UXAAAA MRJAAA OOOOxx +2166 6539 0 2 6 6 66 166 166 2166 2166 132 133 IFAAAA NRJAAA VVVVxx +9328 6540 0 0 8 8 28 328 1328 4328 9328 56 57 UUAAAA ORJAAA AAAAxx +8431 6541 1 3 1 11 31 431 431 3431 8431 62 63 HMAAAA PRJAAA HHHHxx +7100 6542 0 0 0 0 0 100 1100 2100 7100 0 1 CNAAAA QRJAAA OOOOxx +8126 6543 0 2 6 6 26 126 126 3126 8126 52 53 OAAAAA RRJAAA VVVVxx +2185 6544 1 1 5 5 85 185 185 2185 2185 170 171 BGAAAA SRJAAA AAAAxx +5697 6545 1 1 7 17 97 697 1697 697 5697 194 195 DLAAAA TRJAAA HHHHxx +5531 6546 1 3 1 11 31 531 1531 531 5531 62 63 TEAAAA URJAAA OOOOxx +3020 6547 0 0 0 0 20 20 1020 3020 3020 40 41 EMAAAA VRJAAA VVVVxx +3076 6548 0 0 6 16 76 76 1076 3076 3076 152 153 IOAAAA WRJAAA AAAAxx +9228 6549 0 0 8 8 28 228 1228 4228 9228 56 57 YQAAAA XRJAAA HHHHxx +1734 6550 0 2 4 14 34 734 1734 1734 1734 68 69 SOAAAA YRJAAA OOOOxx +7616 6551 0 0 6 16 16 616 1616 2616 7616 32 33 YGAAAA ZRJAAA VVVVxx +9059 6552 1 3 9 19 59 59 1059 4059 9059 118 119 LKAAAA ASJAAA AAAAxx +323 6553 1 3 3 3 23 323 323 323 323 46 47 LMAAAA BSJAAA HHHHxx +1283 6554 1 3 3 3 83 283 1283 1283 1283 166 167 JXAAAA CSJAAA OOOOxx +9535 6555 1 3 5 15 35 535 1535 4535 9535 70 71 TCAAAA DSJAAA VVVVxx +2580 6556 0 0 0 0 80 580 580 2580 2580 160 161 GVAAAA ESJAAA AAAAxx +7633 6557 1 1 3 13 33 633 1633 2633 7633 66 67 PHAAAA FSJAAA HHHHxx +9497 6558 1 1 7 17 97 497 1497 4497 9497 194 195 HBAAAA GSJAAA OOOOxx +9842 6559 0 2 2 2 42 842 1842 4842 9842 84 85 OOAAAA HSJAAA VVVVxx +3426 6560 0 2 6 6 26 426 1426 3426 3426 52 53 UBAAAA ISJAAA AAAAxx +7650 6561 0 2 0 10 50 650 1650 2650 7650 100 101 GIAAAA JSJAAA HHHHxx +9935 6562 1 3 5 15 35 935 1935 4935 9935 70 71 DSAAAA KSJAAA OOOOxx +9354 6563 0 2 4 14 54 354 1354 4354 9354 108 109 UVAAAA LSJAAA VVVVxx +5569 6564 1 1 9 9 69 569 1569 569 5569 138 139 FGAAAA MSJAAA AAAAxx +5765 6565 1 1 5 5 65 765 1765 765 5765 130 131 TNAAAA NSJAAA HHHHxx +7283 6566 1 3 3 3 83 283 1283 2283 7283 166 167 DUAAAA OSJAAA OOOOxx +1068 6567 0 0 8 8 68 68 1068 1068 1068 136 137 CPAAAA PSJAAA VVVVxx +1641 6568 1 1 1 1 41 641 1641 1641 1641 82 83 DLAAAA QSJAAA AAAAxx +1688 6569 0 0 8 8 88 688 1688 1688 1688 176 177 YMAAAA RSJAAA HHHHxx +1133 6570 1 1 3 13 33 133 1133 1133 1133 66 67 PRAAAA SSJAAA OOOOxx +4493 6571 1 1 3 13 93 493 493 4493 4493 186 187 VQAAAA TSJAAA VVVVxx +3354 6572 0 2 4 14 54 354 1354 3354 3354 108 109 AZAAAA USJAAA AAAAxx +4029 6573 1 1 9 9 29 29 29 4029 4029 58 59 ZYAAAA VSJAAA HHHHxx +6704 6574 0 0 4 4 4 704 704 1704 6704 8 9 WXAAAA WSJAAA OOOOxx +3221 6575 1 1 1 1 21 221 1221 3221 3221 42 43 XTAAAA XSJAAA VVVVxx +9432 6576 0 0 2 12 32 432 1432 4432 9432 64 65 UYAAAA YSJAAA AAAAxx +6990 6577 0 2 0 10 90 990 990 1990 6990 180 181 WIAAAA ZSJAAA HHHHxx +1760 6578 0 0 0 0 60 760 1760 1760 1760 120 121 SPAAAA ATJAAA OOOOxx +4754 6579 0 2 4 14 54 754 754 4754 4754 108 109 WAAAAA BTJAAA VVVVxx +7724 6580 0 0 4 4 24 724 1724 2724 7724 48 49 CLAAAA CTJAAA AAAAxx +9487 6581 1 3 7 7 87 487 1487 4487 9487 174 175 XAAAAA DTJAAA HHHHxx +166 6582 0 2 6 6 66 166 166 166 166 132 133 KGAAAA ETJAAA OOOOxx +5479 6583 1 3 9 19 79 479 1479 479 5479 158 159 TCAAAA FTJAAA VVVVxx +8744 6584 0 0 4 4 44 744 744 3744 8744 88 89 IYAAAA GTJAAA AAAAxx +5746 6585 0 2 6 6 46 746 1746 746 5746 92 93 ANAAAA HTJAAA HHHHxx +907 6586 1 3 7 7 7 907 907 907 907 14 15 XIAAAA ITJAAA OOOOxx +3968 6587 0 0 8 8 68 968 1968 3968 3968 136 137 QWAAAA JTJAAA VVVVxx +5721 6588 1 1 1 1 21 721 1721 721 5721 42 43 BMAAAA KTJAAA AAAAxx +6738 6589 0 2 8 18 38 738 738 1738 6738 76 77 EZAAAA LTJAAA HHHHxx +4097 6590 1 1 7 17 97 97 97 4097 4097 194 195 PBAAAA MTJAAA OOOOxx +8456 6591 0 0 6 16 56 456 456 3456 8456 112 113 GNAAAA NTJAAA VVVVxx +1269 6592 1 1 9 9 69 269 1269 1269 1269 138 139 VWAAAA OTJAAA AAAAxx +7997 6593 1 1 7 17 97 997 1997 2997 7997 194 195 PVAAAA PTJAAA HHHHxx +9457 6594 1 1 7 17 57 457 1457 4457 9457 114 115 TZAAAA QTJAAA OOOOxx +1159 6595 1 3 9 19 59 159 1159 1159 1159 118 119 PSAAAA RTJAAA VVVVxx +1631 6596 1 3 1 11 31 631 1631 1631 1631 62 63 TKAAAA STJAAA AAAAxx +2019 6597 1 3 9 19 19 19 19 2019 2019 38 39 RZAAAA TTJAAA HHHHxx +3186 6598 0 2 6 6 86 186 1186 3186 3186 172 173 OSAAAA UTJAAA OOOOxx +5587 6599 1 3 7 7 87 587 1587 587 5587 174 175 XGAAAA VTJAAA VVVVxx +9172 6600 0 0 2 12 72 172 1172 4172 9172 144 145 UOAAAA WTJAAA AAAAxx +5589 6601 1 1 9 9 89 589 1589 589 5589 178 179 ZGAAAA XTJAAA HHHHxx +5103 6602 1 3 3 3 3 103 1103 103 5103 6 7 HOAAAA YTJAAA OOOOxx +3177 6603 1 1 7 17 77 177 1177 3177 3177 154 155 FSAAAA ZTJAAA VVVVxx +8887 6604 1 3 7 7 87 887 887 3887 8887 174 175 VDAAAA AUJAAA AAAAxx +12 6605 0 0 2 12 12 12 12 12 12 24 25 MAAAAA BUJAAA HHHHxx +8575 6606 1 3 5 15 75 575 575 3575 8575 150 151 VRAAAA CUJAAA OOOOxx +4335 6607 1 3 5 15 35 335 335 4335 4335 70 71 TKAAAA DUJAAA VVVVxx +4581 6608 1 1 1 1 81 581 581 4581 4581 162 163 FUAAAA EUJAAA AAAAxx +4444 6609 0 0 4 4 44 444 444 4444 4444 88 89 YOAAAA FUJAAA HHHHxx +7978 6610 0 2 8 18 78 978 1978 2978 7978 156 157 WUAAAA GUJAAA OOOOxx +3081 6611 1 1 1 1 81 81 1081 3081 3081 162 163 NOAAAA HUJAAA VVVVxx +4059 6612 1 3 9 19 59 59 59 4059 4059 118 119 DAAAAA IUJAAA AAAAxx +5711 6613 1 3 1 11 11 711 1711 711 5711 22 23 RLAAAA JUJAAA HHHHxx +7069 6614 1 1 9 9 69 69 1069 2069 7069 138 139 XLAAAA KUJAAA OOOOxx +6150 6615 0 2 0 10 50 150 150 1150 6150 100 101 OCAAAA LUJAAA VVVVxx +9550 6616 0 2 0 10 50 550 1550 4550 9550 100 101 IDAAAA MUJAAA AAAAxx +7087 6617 1 3 7 7 87 87 1087 2087 7087 174 175 PMAAAA NUJAAA HHHHxx +9557 6618 1 1 7 17 57 557 1557 4557 9557 114 115 PDAAAA OUJAAA OOOOxx +7856 6619 0 0 6 16 56 856 1856 2856 7856 112 113 EQAAAA PUJAAA VVVVxx +1115 6620 1 3 5 15 15 115 1115 1115 1115 30 31 XQAAAA QUJAAA AAAAxx +1086 6621 0 2 6 6 86 86 1086 1086 1086 172 173 UPAAAA RUJAAA HHHHxx +5048 6622 0 0 8 8 48 48 1048 48 5048 96 97 EMAAAA SUJAAA OOOOxx +5168 6623 0 0 8 8 68 168 1168 168 5168 136 137 UQAAAA TUJAAA VVVVxx +6029 6624 1 1 9 9 29 29 29 1029 6029 58 59 XXAAAA UUJAAA AAAAxx +546 6625 0 2 6 6 46 546 546 546 546 92 93 AVAAAA VUJAAA HHHHxx +2908 6626 0 0 8 8 8 908 908 2908 2908 16 17 WHAAAA WUJAAA OOOOxx +779 6627 1 3 9 19 79 779 779 779 779 158 159 ZDAAAA XUJAAA VVVVxx +4202 6628 0 2 2 2 2 202 202 4202 4202 4 5 QFAAAA YUJAAA AAAAxx +9984 6629 0 0 4 4 84 984 1984 4984 9984 168 169 AUAAAA ZUJAAA HHHHxx +4730 6630 0 2 0 10 30 730 730 4730 4730 60 61 YZAAAA AVJAAA OOOOxx +6517 6631 1 1 7 17 17 517 517 1517 6517 34 35 RQAAAA BVJAAA VVVVxx +8410 6632 0 2 0 10 10 410 410 3410 8410 20 21 MLAAAA CVJAAA AAAAxx +4793 6633 1 1 3 13 93 793 793 4793 4793 186 187 JCAAAA DVJAAA HHHHxx +3431 6634 1 3 1 11 31 431 1431 3431 3431 62 63 ZBAAAA EVJAAA OOOOxx +2481 6635 1 1 1 1 81 481 481 2481 2481 162 163 LRAAAA FVJAAA VVVVxx +3905 6636 1 1 5 5 5 905 1905 3905 3905 10 11 FUAAAA GVJAAA AAAAxx +8807 6637 1 3 7 7 7 807 807 3807 8807 14 15 TAAAAA HVJAAA HHHHxx +2660 6638 0 0 0 0 60 660 660 2660 2660 120 121 IYAAAA IVJAAA OOOOxx +4985 6639 1 1 5 5 85 985 985 4985 4985 170 171 TJAAAA JVJAAA VVVVxx +3080 6640 0 0 0 0 80 80 1080 3080 3080 160 161 MOAAAA KVJAAA AAAAxx +1090 6641 0 2 0 10 90 90 1090 1090 1090 180 181 YPAAAA LVJAAA HHHHxx +6917 6642 1 1 7 17 17 917 917 1917 6917 34 35 BGAAAA MVJAAA OOOOxx +5177 6643 1 1 7 17 77 177 1177 177 5177 154 155 DRAAAA NVJAAA VVVVxx +2729 6644 1 1 9 9 29 729 729 2729 2729 58 59 ZAAAAA OVJAAA AAAAxx +9706 6645 0 2 6 6 6 706 1706 4706 9706 12 13 IJAAAA PVJAAA HHHHxx +9929 6646 1 1 9 9 29 929 1929 4929 9929 58 59 XRAAAA QVJAAA OOOOxx +1547 6647 1 3 7 7 47 547 1547 1547 1547 94 95 NHAAAA RVJAAA VVVVxx +2798 6648 0 2 8 18 98 798 798 2798 2798 196 197 QDAAAA SVJAAA AAAAxx +4420 6649 0 0 0 0 20 420 420 4420 4420 40 41 AOAAAA TVJAAA HHHHxx +6771 6650 1 3 1 11 71 771 771 1771 6771 142 143 LAAAAA UVJAAA OOOOxx +2004 6651 0 0 4 4 4 4 4 2004 2004 8 9 CZAAAA VVJAAA VVVVxx +8686 6652 0 2 6 6 86 686 686 3686 8686 172 173 CWAAAA WVJAAA AAAAxx +3663 6653 1 3 3 3 63 663 1663 3663 3663 126 127 XKAAAA XVJAAA HHHHxx +806 6654 0 2 6 6 6 806 806 806 806 12 13 AFAAAA YVJAAA OOOOxx +4309 6655 1 1 9 9 9 309 309 4309 4309 18 19 TJAAAA ZVJAAA VVVVxx +7443 6656 1 3 3 3 43 443 1443 2443 7443 86 87 HAAAAA AWJAAA AAAAxx +5779 6657 1 3 9 19 79 779 1779 779 5779 158 159 HOAAAA BWJAAA HHHHxx +8821 6658 1 1 1 1 21 821 821 3821 8821 42 43 HBAAAA CWJAAA OOOOxx +4198 6659 0 2 8 18 98 198 198 4198 4198 196 197 MFAAAA DWJAAA VVVVxx +8115 6660 1 3 5 15 15 115 115 3115 8115 30 31 DAAAAA EWJAAA AAAAxx +9554 6661 0 2 4 14 54 554 1554 4554 9554 108 109 MDAAAA FWJAAA HHHHxx +8956 6662 0 0 6 16 56 956 956 3956 8956 112 113 MGAAAA GWJAAA OOOOxx +4733 6663 1 1 3 13 33 733 733 4733 4733 66 67 BAAAAA HWJAAA VVVVxx +5417 6664 1 1 7 17 17 417 1417 417 5417 34 35 JAAAAA IWJAAA AAAAxx +4792 6665 0 0 2 12 92 792 792 4792 4792 184 185 ICAAAA JWJAAA HHHHxx +462 6666 0 2 2 2 62 462 462 462 462 124 125 URAAAA KWJAAA OOOOxx +3687 6667 1 3 7 7 87 687 1687 3687 3687 174 175 VLAAAA LWJAAA VVVVxx +2013 6668 1 1 3 13 13 13 13 2013 2013 26 27 LZAAAA MWJAAA AAAAxx +5386 6669 0 2 6 6 86 386 1386 386 5386 172 173 EZAAAA NWJAAA HHHHxx +2816 6670 0 0 6 16 16 816 816 2816 2816 32 33 IEAAAA OWJAAA OOOOxx +7827 6671 1 3 7 7 27 827 1827 2827 7827 54 55 BPAAAA PWJAAA VVVVxx +5077 6672 1 1 7 17 77 77 1077 77 5077 154 155 HNAAAA QWJAAA AAAAxx +6039 6673 1 3 9 19 39 39 39 1039 6039 78 79 HYAAAA RWJAAA HHHHxx +215 6674 1 3 5 15 15 215 215 215 215 30 31 HIAAAA SWJAAA OOOOxx +855 6675 1 3 5 15 55 855 855 855 855 110 111 XGAAAA TWJAAA VVVVxx +9692 6676 0 0 2 12 92 692 1692 4692 9692 184 185 UIAAAA UWJAAA AAAAxx +8391 6677 1 3 1 11 91 391 391 3391 8391 182 183 TKAAAA VWJAAA HHHHxx +8424 6678 0 0 4 4 24 424 424 3424 8424 48 49 AMAAAA WWJAAA OOOOxx +6331 6679 1 3 1 11 31 331 331 1331 6331 62 63 NJAAAA XWJAAA VVVVxx +6561 6680 1 1 1 1 61 561 561 1561 6561 122 123 JSAAAA YWJAAA AAAAxx +8955 6681 1 3 5 15 55 955 955 3955 8955 110 111 LGAAAA ZWJAAA HHHHxx +1764 6682 0 0 4 4 64 764 1764 1764 1764 128 129 WPAAAA AXJAAA OOOOxx +6623 6683 1 3 3 3 23 623 623 1623 6623 46 47 TUAAAA BXJAAA VVVVxx +2900 6684 0 0 0 0 0 900 900 2900 2900 0 1 OHAAAA CXJAAA AAAAxx +7048 6685 0 0 8 8 48 48 1048 2048 7048 96 97 CLAAAA DXJAAA HHHHxx +3843 6686 1 3 3 3 43 843 1843 3843 3843 86 87 VRAAAA EXJAAA OOOOxx +4855 6687 1 3 5 15 55 855 855 4855 4855 110 111 TEAAAA FXJAAA VVVVxx +7383 6688 1 3 3 3 83 383 1383 2383 7383 166 167 ZXAAAA GXJAAA AAAAxx +7765 6689 1 1 5 5 65 765 1765 2765 7765 130 131 RMAAAA HXJAAA HHHHxx +1125 6690 1 1 5 5 25 125 1125 1125 1125 50 51 HRAAAA IXJAAA OOOOxx +755 6691 1 3 5 15 55 755 755 755 755 110 111 BDAAAA JXJAAA VVVVxx +2995 6692 1 3 5 15 95 995 995 2995 2995 190 191 FLAAAA KXJAAA AAAAxx +8907 6693 1 3 7 7 7 907 907 3907 8907 14 15 PEAAAA LXJAAA HHHHxx +9357 6694 1 1 7 17 57 357 1357 4357 9357 114 115 XVAAAA MXJAAA OOOOxx +4469 6695 1 1 9 9 69 469 469 4469 4469 138 139 XPAAAA NXJAAA VVVVxx +2147 6696 1 3 7 7 47 147 147 2147 2147 94 95 PEAAAA OXJAAA AAAAxx +2952 6697 0 0 2 12 52 952 952 2952 2952 104 105 OJAAAA PXJAAA HHHHxx +1324 6698 0 0 4 4 24 324 1324 1324 1324 48 49 YYAAAA QXJAAA OOOOxx +1173 6699 1 1 3 13 73 173 1173 1173 1173 146 147 DTAAAA RXJAAA VVVVxx +3169 6700 1 1 9 9 69 169 1169 3169 3169 138 139 XRAAAA SXJAAA AAAAxx +5149 6701 1 1 9 9 49 149 1149 149 5149 98 99 BQAAAA TXJAAA HHHHxx +9660 6702 0 0 0 0 60 660 1660 4660 9660 120 121 OHAAAA UXJAAA OOOOxx +3446 6703 0 2 6 6 46 446 1446 3446 3446 92 93 OCAAAA VXJAAA VVVVxx +6988 6704 0 0 8 8 88 988 988 1988 6988 176 177 UIAAAA WXJAAA AAAAxx +5829 6705 1 1 9 9 29 829 1829 829 5829 58 59 FQAAAA XXJAAA HHHHxx +7166 6706 0 2 6 6 66 166 1166 2166 7166 132 133 QPAAAA YXJAAA OOOOxx +3940 6707 0 0 0 0 40 940 1940 3940 3940 80 81 OVAAAA ZXJAAA VVVVxx +2645 6708 1 1 5 5 45 645 645 2645 2645 90 91 TXAAAA AYJAAA AAAAxx +478 6709 0 2 8 18 78 478 478 478 478 156 157 KSAAAA BYJAAA HHHHxx +1156 6710 0 0 6 16 56 156 1156 1156 1156 112 113 MSAAAA CYJAAA OOOOxx +2731 6711 1 3 1 11 31 731 731 2731 2731 62 63 BBAAAA DYJAAA VVVVxx +5637 6712 1 1 7 17 37 637 1637 637 5637 74 75 VIAAAA EYJAAA AAAAxx +7517 6713 1 1 7 17 17 517 1517 2517 7517 34 35 DDAAAA FYJAAA HHHHxx +5331 6714 1 3 1 11 31 331 1331 331 5331 62 63 BXAAAA GYJAAA OOOOxx +9640 6715 0 0 0 0 40 640 1640 4640 9640 80 81 UGAAAA HYJAAA VVVVxx +4108 6716 0 0 8 8 8 108 108 4108 4108 16 17 ACAAAA IYJAAA AAAAxx +1087 6717 1 3 7 7 87 87 1087 1087 1087 174 175 VPAAAA JYJAAA HHHHxx +8017 6718 1 1 7 17 17 17 17 3017 8017 34 35 JWAAAA KYJAAA OOOOxx +8795 6719 1 3 5 15 95 795 795 3795 8795 190 191 HAAAAA LYJAAA VVVVxx +7060 6720 0 0 0 0 60 60 1060 2060 7060 120 121 OLAAAA MYJAAA AAAAxx +9450 6721 0 2 0 10 50 450 1450 4450 9450 100 101 MZAAAA NYJAAA HHHHxx +390 6722 0 2 0 10 90 390 390 390 390 180 181 APAAAA OYJAAA OOOOxx +66 6723 0 2 6 6 66 66 66 66 66 132 133 OCAAAA PYJAAA VVVVxx +8789 6724 1 1 9 9 89 789 789 3789 8789 178 179 BAAAAA QYJAAA AAAAxx +9260 6725 0 0 0 0 60 260 1260 4260 9260 120 121 ESAAAA RYJAAA HHHHxx +6679 6726 1 3 9 19 79 679 679 1679 6679 158 159 XWAAAA SYJAAA OOOOxx +9052 6727 0 0 2 12 52 52 1052 4052 9052 104 105 EKAAAA TYJAAA VVVVxx +9561 6728 1 1 1 1 61 561 1561 4561 9561 122 123 TDAAAA UYJAAA AAAAxx +9725 6729 1 1 5 5 25 725 1725 4725 9725 50 51 BKAAAA VYJAAA HHHHxx +6298 6730 0 2 8 18 98 298 298 1298 6298 196 197 GIAAAA WYJAAA OOOOxx +8654 6731 0 2 4 14 54 654 654 3654 8654 108 109 WUAAAA XYJAAA VVVVxx +8725 6732 1 1 5 5 25 725 725 3725 8725 50 51 PXAAAA YYJAAA AAAAxx +9377 6733 1 1 7 17 77 377 1377 4377 9377 154 155 RWAAAA ZYJAAA HHHHxx +3807 6734 1 3 7 7 7 807 1807 3807 3807 14 15 LQAAAA AZJAAA OOOOxx +8048 6735 0 0 8 8 48 48 48 3048 8048 96 97 OXAAAA BZJAAA VVVVxx +764 6736 0 0 4 4 64 764 764 764 764 128 129 KDAAAA CZJAAA AAAAxx +9702 6737 0 2 2 2 2 702 1702 4702 9702 4 5 EJAAAA DZJAAA HHHHxx +8060 6738 0 0 0 0 60 60 60 3060 8060 120 121 AYAAAA EZJAAA OOOOxx +6371 6739 1 3 1 11 71 371 371 1371 6371 142 143 BLAAAA FZJAAA VVVVxx +5237 6740 1 1 7 17 37 237 1237 237 5237 74 75 LTAAAA GZJAAA AAAAxx +743 6741 1 3 3 3 43 743 743 743 743 86 87 PCAAAA HZJAAA HHHHxx +7395 6742 1 3 5 15 95 395 1395 2395 7395 190 191 LYAAAA IZJAAA OOOOxx +3365 6743 1 1 5 5 65 365 1365 3365 3365 130 131 LZAAAA JZJAAA VVVVxx +6667 6744 1 3 7 7 67 667 667 1667 6667 134 135 LWAAAA KZJAAA AAAAxx +3445 6745 1 1 5 5 45 445 1445 3445 3445 90 91 NCAAAA LZJAAA HHHHxx +4019 6746 1 3 9 19 19 19 19 4019 4019 38 39 PYAAAA MZJAAA OOOOxx +7035 6747 1 3 5 15 35 35 1035 2035 7035 70 71 PKAAAA NZJAAA VVVVxx +5274 6748 0 2 4 14 74 274 1274 274 5274 148 149 WUAAAA OZJAAA AAAAxx +519 6749 1 3 9 19 19 519 519 519 519 38 39 ZTAAAA PZJAAA HHHHxx +2801 6750 1 1 1 1 1 801 801 2801 2801 2 3 TDAAAA QZJAAA OOOOxx +3320 6751 0 0 0 0 20 320 1320 3320 3320 40 41 SXAAAA RZJAAA VVVVxx +3153 6752 1 1 3 13 53 153 1153 3153 3153 106 107 HRAAAA SZJAAA AAAAxx +7680 6753 0 0 0 0 80 680 1680 2680 7680 160 161 KJAAAA TZJAAA HHHHxx +8942 6754 0 2 2 2 42 942 942 3942 8942 84 85 YFAAAA UZJAAA OOOOxx +3195 6755 1 3 5 15 95 195 1195 3195 3195 190 191 XSAAAA VZJAAA VVVVxx +2287 6756 1 3 7 7 87 287 287 2287 2287 174 175 ZJAAAA WZJAAA AAAAxx +8325 6757 1 1 5 5 25 325 325 3325 8325 50 51 FIAAAA XZJAAA HHHHxx +2603 6758 1 3 3 3 3 603 603 2603 2603 6 7 DWAAAA YZJAAA OOOOxx +5871 6759 1 3 1 11 71 871 1871 871 5871 142 143 VRAAAA ZZJAAA VVVVxx +1773 6760 1 1 3 13 73 773 1773 1773 1773 146 147 FQAAAA AAKAAA AAAAxx +3323 6761 1 3 3 3 23 323 1323 3323 3323 46 47 VXAAAA BAKAAA HHHHxx +2053 6762 1 1 3 13 53 53 53 2053 2053 106 107 ZAAAAA CAKAAA OOOOxx +4062 6763 0 2 2 2 62 62 62 4062 4062 124 125 GAAAAA DAKAAA VVVVxx +4611 6764 1 3 1 11 11 611 611 4611 4611 22 23 JVAAAA EAKAAA AAAAxx +3451 6765 1 3 1 11 51 451 1451 3451 3451 102 103 TCAAAA FAKAAA HHHHxx +1819 6766 1 3 9 19 19 819 1819 1819 1819 38 39 ZRAAAA GAKAAA OOOOxx +9806 6767 0 2 6 6 6 806 1806 4806 9806 12 13 ENAAAA HAKAAA VVVVxx +6619 6768 1 3 9 19 19 619 619 1619 6619 38 39 PUAAAA IAKAAA AAAAxx +1031 6769 1 3 1 11 31 31 1031 1031 1031 62 63 RNAAAA JAKAAA HHHHxx +1865 6770 1 1 5 5 65 865 1865 1865 1865 130 131 TTAAAA KAKAAA OOOOxx +6282 6771 0 2 2 2 82 282 282 1282 6282 164 165 QHAAAA LAKAAA VVVVxx +1178 6772 0 2 8 18 78 178 1178 1178 1178 156 157 ITAAAA MAKAAA AAAAxx +8007 6773 1 3 7 7 7 7 7 3007 8007 14 15 ZVAAAA NAKAAA HHHHxx +9126 6774 0 2 6 6 26 126 1126 4126 9126 52 53 ANAAAA OAKAAA OOOOxx +9113 6775 1 1 3 13 13 113 1113 4113 9113 26 27 NMAAAA PAKAAA VVVVxx +537 6776 1 1 7 17 37 537 537 537 537 74 75 RUAAAA QAKAAA AAAAxx +6208 6777 0 0 8 8 8 208 208 1208 6208 16 17 UEAAAA RAKAAA HHHHxx +1626 6778 0 2 6 6 26 626 1626 1626 1626 52 53 OKAAAA SAKAAA OOOOxx +7188 6779 0 0 8 8 88 188 1188 2188 7188 176 177 MQAAAA TAKAAA VVVVxx +9216 6780 0 0 6 16 16 216 1216 4216 9216 32 33 MQAAAA UAKAAA AAAAxx +6134 6781 0 2 4 14 34 134 134 1134 6134 68 69 YBAAAA VAKAAA HHHHxx +2074 6782 0 2 4 14 74 74 74 2074 2074 148 149 UBAAAA WAKAAA OOOOxx +6369 6783 1 1 9 9 69 369 369 1369 6369 138 139 ZKAAAA XAKAAA VVVVxx +9306 6784 0 2 6 6 6 306 1306 4306 9306 12 13 YTAAAA YAKAAA AAAAxx +3155 6785 1 3 5 15 55 155 1155 3155 3155 110 111 JRAAAA ZAKAAA HHHHxx +3611 6786 1 3 1 11 11 611 1611 3611 3611 22 23 XIAAAA ABKAAA OOOOxx +6530 6787 0 2 0 10 30 530 530 1530 6530 60 61 ERAAAA BBKAAA VVVVxx +6979 6788 1 3 9 19 79 979 979 1979 6979 158 159 LIAAAA CBKAAA AAAAxx +9129 6789 1 1 9 9 29 129 1129 4129 9129 58 59 DNAAAA DBKAAA HHHHxx +8013 6790 1 1 3 13 13 13 13 3013 8013 26 27 FWAAAA EBKAAA OOOOxx +6926 6791 0 2 6 6 26 926 926 1926 6926 52 53 KGAAAA FBKAAA VVVVxx +1877 6792 1 1 7 17 77 877 1877 1877 1877 154 155 FUAAAA GBKAAA AAAAxx +1882 6793 0 2 2 2 82 882 1882 1882 1882 164 165 KUAAAA HBKAAA HHHHxx +6720 6794 0 0 0 0 20 720 720 1720 6720 40 41 MYAAAA IBKAAA OOOOxx +690 6795 0 2 0 10 90 690 690 690 690 180 181 OAAAAA JBKAAA VVVVxx +143 6796 1 3 3 3 43 143 143 143 143 86 87 NFAAAA KBKAAA AAAAxx +7241 6797 1 1 1 1 41 241 1241 2241 7241 82 83 NSAAAA LBKAAA HHHHxx +6461 6798 1 1 1 1 61 461 461 1461 6461 122 123 NOAAAA MBKAAA OOOOxx +2258 6799 0 2 8 18 58 258 258 2258 2258 116 117 WIAAAA NBKAAA VVVVxx +2280 6800 0 0 0 0 80 280 280 2280 2280 160 161 SJAAAA OBKAAA AAAAxx +7556 6801 0 0 6 16 56 556 1556 2556 7556 112 113 QEAAAA PBKAAA HHHHxx +1038 6802 0 2 8 18 38 38 1038 1038 1038 76 77 YNAAAA QBKAAA OOOOxx +2634 6803 0 2 4 14 34 634 634 2634 2634 68 69 IXAAAA RBKAAA VVVVxx +7847 6804 1 3 7 7 47 847 1847 2847 7847 94 95 VPAAAA SBKAAA AAAAxx +4415 6805 1 3 5 15 15 415 415 4415 4415 30 31 VNAAAA TBKAAA HHHHxx +1933 6806 1 1 3 13 33 933 1933 1933 1933 66 67 JWAAAA UBKAAA OOOOxx +8034 6807 0 2 4 14 34 34 34 3034 8034 68 69 AXAAAA VBKAAA VVVVxx +9233 6808 1 1 3 13 33 233 1233 4233 9233 66 67 DRAAAA WBKAAA AAAAxx +6572 6809 0 0 2 12 72 572 572 1572 6572 144 145 USAAAA XBKAAA HHHHxx +1586 6810 0 2 6 6 86 586 1586 1586 1586 172 173 AJAAAA YBKAAA OOOOxx +8512 6811 0 0 2 12 12 512 512 3512 8512 24 25 KPAAAA ZBKAAA VVVVxx +7421 6812 1 1 1 1 21 421 1421 2421 7421 42 43 LZAAAA ACKAAA AAAAxx +503 6813 1 3 3 3 3 503 503 503 503 6 7 JTAAAA BCKAAA HHHHxx +5332 6814 0 0 2 12 32 332 1332 332 5332 64 65 CXAAAA CCKAAA OOOOxx +2602 6815 0 2 2 2 2 602 602 2602 2602 4 5 CWAAAA DCKAAA VVVVxx +2902 6816 0 2 2 2 2 902 902 2902 2902 4 5 QHAAAA ECKAAA AAAAxx +2979 6817 1 3 9 19 79 979 979 2979 2979 158 159 PKAAAA FCKAAA HHHHxx +1431 6818 1 3 1 11 31 431 1431 1431 1431 62 63 BDAAAA GCKAAA OOOOxx +8639 6819 1 3 9 19 39 639 639 3639 8639 78 79 HUAAAA HCKAAA VVVVxx +4218 6820 0 2 8 18 18 218 218 4218 4218 36 37 GGAAAA ICKAAA AAAAxx +7453 6821 1 1 3 13 53 453 1453 2453 7453 106 107 RAAAAA JCKAAA HHHHxx +5448 6822 0 0 8 8 48 448 1448 448 5448 96 97 OBAAAA KCKAAA OOOOxx +6768 6823 0 0 8 8 68 768 768 1768 6768 136 137 IAAAAA LCKAAA VVVVxx +3104 6824 0 0 4 4 4 104 1104 3104 3104 8 9 KPAAAA MCKAAA AAAAxx +2297 6825 1 1 7 17 97 297 297 2297 2297 194 195 JKAAAA NCKAAA HHHHxx +7994 6826 0 2 4 14 94 994 1994 2994 7994 188 189 MVAAAA OCKAAA OOOOxx +550 6827 0 2 0 10 50 550 550 550 550 100 101 EVAAAA PCKAAA VVVVxx +4777 6828 1 1 7 17 77 777 777 4777 4777 154 155 TBAAAA QCKAAA AAAAxx +5962 6829 0 2 2 2 62 962 1962 962 5962 124 125 IVAAAA RCKAAA HHHHxx +1763 6830 1 3 3 3 63 763 1763 1763 1763 126 127 VPAAAA SCKAAA OOOOxx +3654 6831 0 2 4 14 54 654 1654 3654 3654 108 109 OKAAAA TCKAAA VVVVxx +4106 6832 0 2 6 6 6 106 106 4106 4106 12 13 YBAAAA UCKAAA AAAAxx +5156 6833 0 0 6 16 56 156 1156 156 5156 112 113 IQAAAA VCKAAA HHHHxx +422 6834 0 2 2 2 22 422 422 422 422 44 45 GQAAAA WCKAAA OOOOxx +5011 6835 1 3 1 11 11 11 1011 11 5011 22 23 TKAAAA XCKAAA VVVVxx +218 6836 0 2 8 18 18 218 218 218 218 36 37 KIAAAA YCKAAA AAAAxx +9762 6837 0 2 2 2 62 762 1762 4762 9762 124 125 MLAAAA ZCKAAA HHHHxx +6074 6838 0 2 4 14 74 74 74 1074 6074 148 149 QZAAAA ADKAAA OOOOxx +4060 6839 0 0 0 0 60 60 60 4060 4060 120 121 EAAAAA BDKAAA VVVVxx +8680 6840 0 0 0 0 80 680 680 3680 8680 160 161 WVAAAA CDKAAA AAAAxx +5863 6841 1 3 3 3 63 863 1863 863 5863 126 127 NRAAAA DDKAAA HHHHxx +8042 6842 0 2 2 2 42 42 42 3042 8042 84 85 IXAAAA EDKAAA OOOOxx +2964 6843 0 0 4 4 64 964 964 2964 2964 128 129 AKAAAA FDKAAA VVVVxx +6931 6844 1 3 1 11 31 931 931 1931 6931 62 63 PGAAAA GDKAAA AAAAxx +6715 6845 1 3 5 15 15 715 715 1715 6715 30 31 HYAAAA HDKAAA HHHHxx +5859 6846 1 3 9 19 59 859 1859 859 5859 118 119 JRAAAA IDKAAA OOOOxx +6173 6847 1 1 3 13 73 173 173 1173 6173 146 147 LDAAAA JDKAAA VVVVxx +7788 6848 0 0 8 8 88 788 1788 2788 7788 176 177 ONAAAA KDKAAA AAAAxx +9370 6849 0 2 0 10 70 370 1370 4370 9370 140 141 KWAAAA LDKAAA HHHHxx +3038 6850 0 2 8 18 38 38 1038 3038 3038 76 77 WMAAAA MDKAAA OOOOxx +6483 6851 1 3 3 3 83 483 483 1483 6483 166 167 JPAAAA NDKAAA VVVVxx +7534 6852 0 2 4 14 34 534 1534 2534 7534 68 69 UDAAAA ODKAAA AAAAxx +5769 6853 1 1 9 9 69 769 1769 769 5769 138 139 XNAAAA PDKAAA HHHHxx +9152 6854 0 0 2 12 52 152 1152 4152 9152 104 105 AOAAAA QDKAAA OOOOxx +6251 6855 1 3 1 11 51 251 251 1251 6251 102 103 LGAAAA RDKAAA VVVVxx +9209 6856 1 1 9 9 9 209 1209 4209 9209 18 19 FQAAAA SDKAAA AAAAxx +5365 6857 1 1 5 5 65 365 1365 365 5365 130 131 JYAAAA TDKAAA HHHHxx +509 6858 1 1 9 9 9 509 509 509 509 18 19 PTAAAA UDKAAA OOOOxx +3132 6859 0 0 2 12 32 132 1132 3132 3132 64 65 MQAAAA VDKAAA VVVVxx +5373 6860 1 1 3 13 73 373 1373 373 5373 146 147 RYAAAA WDKAAA AAAAxx +4247 6861 1 3 7 7 47 247 247 4247 4247 94 95 JHAAAA XDKAAA HHHHxx +3491 6862 1 3 1 11 91 491 1491 3491 3491 182 183 HEAAAA YDKAAA OOOOxx +495 6863 1 3 5 15 95 495 495 495 495 190 191 BTAAAA ZDKAAA VVVVxx +1594 6864 0 2 4 14 94 594 1594 1594 1594 188 189 IJAAAA AEKAAA AAAAxx +2243 6865 1 3 3 3 43 243 243 2243 2243 86 87 HIAAAA BEKAAA HHHHxx +7780 6866 0 0 0 0 80 780 1780 2780 7780 160 161 GNAAAA CEKAAA OOOOxx +5632 6867 0 0 2 12 32 632 1632 632 5632 64 65 QIAAAA DEKAAA VVVVxx +2679 6868 1 3 9 19 79 679 679 2679 2679 158 159 BZAAAA EEKAAA AAAAxx +1354 6869 0 2 4 14 54 354 1354 1354 1354 108 109 CAAAAA FEKAAA HHHHxx +180 6870 0 0 0 0 80 180 180 180 180 160 161 YGAAAA GEKAAA OOOOxx +7017 6871 1 1 7 17 17 17 1017 2017 7017 34 35 XJAAAA HEKAAA VVVVxx +1867 6872 1 3 7 7 67 867 1867 1867 1867 134 135 VTAAAA IEKAAA AAAAxx +2213 6873 1 1 3 13 13 213 213 2213 2213 26 27 DHAAAA JEKAAA HHHHxx +8773 6874 1 1 3 13 73 773 773 3773 8773 146 147 LZAAAA KEKAAA OOOOxx +1784 6875 0 0 4 4 84 784 1784 1784 1784 168 169 QQAAAA LEKAAA VVVVxx +5961 6876 1 1 1 1 61 961 1961 961 5961 122 123 HVAAAA MEKAAA AAAAxx +8801 6877 1 1 1 1 1 801 801 3801 8801 2 3 NAAAAA NEKAAA HHHHxx +4860 6878 0 0 0 0 60 860 860 4860 4860 120 121 YEAAAA OEKAAA OOOOxx +2214 6879 0 2 4 14 14 214 214 2214 2214 28 29 EHAAAA PEKAAA VVVVxx +1735 6880 1 3 5 15 35 735 1735 1735 1735 70 71 TOAAAA QEKAAA AAAAxx +578 6881 0 2 8 18 78 578 578 578 578 156 157 GWAAAA REKAAA HHHHxx +7853 6882 1 1 3 13 53 853 1853 2853 7853 106 107 BQAAAA SEKAAA OOOOxx +2215 6883 1 3 5 15 15 215 215 2215 2215 30 31 FHAAAA TEKAAA VVVVxx +4704 6884 0 0 4 4 4 704 704 4704 4704 8 9 YYAAAA UEKAAA AAAAxx +9379 6885 1 3 9 19 79 379 1379 4379 9379 158 159 TWAAAA VEKAAA HHHHxx +9745 6886 1 1 5 5 45 745 1745 4745 9745 90 91 VKAAAA WEKAAA OOOOxx +5636 6887 0 0 6 16 36 636 1636 636 5636 72 73 UIAAAA XEKAAA VVVVxx +4548 6888 0 0 8 8 48 548 548 4548 4548 96 97 YSAAAA YEKAAA AAAAxx +6537 6889 1 1 7 17 37 537 537 1537 6537 74 75 LRAAAA ZEKAAA HHHHxx +7748 6890 0 0 8 8 48 748 1748 2748 7748 96 97 AMAAAA AFKAAA OOOOxx +687 6891 1 3 7 7 87 687 687 687 687 174 175 LAAAAA BFKAAA VVVVxx +1243 6892 1 3 3 3 43 243 1243 1243 1243 86 87 VVAAAA CFKAAA AAAAxx +852 6893 0 0 2 12 52 852 852 852 852 104 105 UGAAAA DFKAAA HHHHxx +785 6894 1 1 5 5 85 785 785 785 785 170 171 FEAAAA EFKAAA OOOOxx +2002 6895 0 2 2 2 2 2 2 2002 2002 4 5 AZAAAA FFKAAA VVVVxx +2748 6896 0 0 8 8 48 748 748 2748 2748 96 97 SBAAAA GFKAAA AAAAxx +6075 6897 1 3 5 15 75 75 75 1075 6075 150 151 RZAAAA HFKAAA HHHHxx +7029 6898 1 1 9 9 29 29 1029 2029 7029 58 59 JKAAAA IFKAAA OOOOxx +7474 6899 0 2 4 14 74 474 1474 2474 7474 148 149 MBAAAA JFKAAA VVVVxx +7755 6900 1 3 5 15 55 755 1755 2755 7755 110 111 HMAAAA KFKAAA AAAAxx +1456 6901 0 0 6 16 56 456 1456 1456 1456 112 113 AEAAAA LFKAAA HHHHxx +2808 6902 0 0 8 8 8 808 808 2808 2808 16 17 AEAAAA MFKAAA OOOOxx +4089 6903 1 1 9 9 89 89 89 4089 4089 178 179 HBAAAA NFKAAA VVVVxx +4718 6904 0 2 8 18 18 718 718 4718 4718 36 37 MZAAAA OFKAAA AAAAxx +910 6905 0 2 0 10 10 910 910 910 910 20 21 AJAAAA PFKAAA HHHHxx +2868 6906 0 0 8 8 68 868 868 2868 2868 136 137 IGAAAA QFKAAA OOOOxx +2103 6907 1 3 3 3 3 103 103 2103 2103 6 7 XCAAAA RFKAAA VVVVxx +2407 6908 1 3 7 7 7 407 407 2407 2407 14 15 POAAAA SFKAAA AAAAxx +4353 6909 1 1 3 13 53 353 353 4353 4353 106 107 LLAAAA TFKAAA HHHHxx +7988 6910 0 0 8 8 88 988 1988 2988 7988 176 177 GVAAAA UFKAAA OOOOxx +2750 6911 0 2 0 10 50 750 750 2750 2750 100 101 UBAAAA VFKAAA VVVVxx +2006 6912 0 2 6 6 6 6 6 2006 2006 12 13 EZAAAA WFKAAA AAAAxx +4617 6913 1 1 7 17 17 617 617 4617 4617 34 35 PVAAAA XFKAAA HHHHxx +1251 6914 1 3 1 11 51 251 1251 1251 1251 102 103 DWAAAA YFKAAA OOOOxx +4590 6915 0 2 0 10 90 590 590 4590 4590 180 181 OUAAAA ZFKAAA VVVVxx +1144 6916 0 0 4 4 44 144 1144 1144 1144 88 89 ASAAAA AGKAAA AAAAxx +7131 6917 1 3 1 11 31 131 1131 2131 7131 62 63 HOAAAA BGKAAA HHHHxx +95 6918 1 3 5 15 95 95 95 95 95 190 191 RDAAAA CGKAAA OOOOxx +4827 6919 1 3 7 7 27 827 827 4827 4827 54 55 RDAAAA DGKAAA VVVVxx +4307 6920 1 3 7 7 7 307 307 4307 4307 14 15 RJAAAA EGKAAA AAAAxx +1505 6921 1 1 5 5 5 505 1505 1505 1505 10 11 XFAAAA FGKAAA HHHHxx +8191 6922 1 3 1 11 91 191 191 3191 8191 182 183 BDAAAA GGKAAA OOOOxx +5037 6923 1 1 7 17 37 37 1037 37 5037 74 75 TLAAAA HGKAAA VVVVxx +7363 6924 1 3 3 3 63 363 1363 2363 7363 126 127 FXAAAA IGKAAA AAAAxx +8427 6925 1 3 7 7 27 427 427 3427 8427 54 55 DMAAAA JGKAAA HHHHxx +5231 6926 1 3 1 11 31 231 1231 231 5231 62 63 FTAAAA KGKAAA OOOOxx +2943 6927 1 3 3 3 43 943 943 2943 2943 86 87 FJAAAA LGKAAA VVVVxx +4624 6928 0 0 4 4 24 624 624 4624 4624 48 49 WVAAAA MGKAAA AAAAxx +2020 6929 0 0 0 0 20 20 20 2020 2020 40 41 SZAAAA NGKAAA HHHHxx +6155 6930 1 3 5 15 55 155 155 1155 6155 110 111 TCAAAA OGKAAA OOOOxx +4381 6931 1 1 1 1 81 381 381 4381 4381 162 163 NMAAAA PGKAAA VVVVxx +1057 6932 1 1 7 17 57 57 1057 1057 1057 114 115 ROAAAA QGKAAA AAAAxx +9010 6933 0 2 0 10 10 10 1010 4010 9010 20 21 OIAAAA RGKAAA HHHHxx +4947 6934 1 3 7 7 47 947 947 4947 4947 94 95 HIAAAA SGKAAA OOOOxx +335 6935 1 3 5 15 35 335 335 335 335 70 71 XMAAAA TGKAAA VVVVxx +6890 6936 0 2 0 10 90 890 890 1890 6890 180 181 AFAAAA UGKAAA AAAAxx +5070 6937 0 2 0 10 70 70 1070 70 5070 140 141 ANAAAA VGKAAA HHHHxx +5270 6938 0 2 0 10 70 270 1270 270 5270 140 141 SUAAAA WGKAAA OOOOxx +8657 6939 1 1 7 17 57 657 657 3657 8657 114 115 ZUAAAA XGKAAA VVVVxx +7625 6940 1 1 5 5 25 625 1625 2625 7625 50 51 HHAAAA YGKAAA AAAAxx +5759 6941 1 3 9 19 59 759 1759 759 5759 118 119 NNAAAA ZGKAAA HHHHxx +9483 6942 1 3 3 3 83 483 1483 4483 9483 166 167 TAAAAA AHKAAA OOOOxx +8304 6943 0 0 4 4 4 304 304 3304 8304 8 9 KHAAAA BHKAAA VVVVxx +296 6944 0 0 6 16 96 296 296 296 296 192 193 KLAAAA CHKAAA AAAAxx +1176 6945 0 0 6 16 76 176 1176 1176 1176 152 153 GTAAAA DHKAAA HHHHxx +2069 6946 1 1 9 9 69 69 69 2069 2069 138 139 PBAAAA EHKAAA OOOOxx +1531 6947 1 3 1 11 31 531 1531 1531 1531 62 63 XGAAAA FHKAAA VVVVxx +5329 6948 1 1 9 9 29 329 1329 329 5329 58 59 ZWAAAA GHKAAA AAAAxx +3702 6949 0 2 2 2 2 702 1702 3702 3702 4 5 KMAAAA HHKAAA HHHHxx +6520 6950 0 0 0 0 20 520 520 1520 6520 40 41 UQAAAA IHKAAA OOOOxx +7310 6951 0 2 0 10 10 310 1310 2310 7310 20 21 EVAAAA JHKAAA VVVVxx +1175 6952 1 3 5 15 75 175 1175 1175 1175 150 151 FTAAAA KHKAAA AAAAxx +9107 6953 1 3 7 7 7 107 1107 4107 9107 14 15 HMAAAA LHKAAA HHHHxx +2737 6954 1 1 7 17 37 737 737 2737 2737 74 75 HBAAAA MHKAAA OOOOxx +3437 6955 1 1 7 17 37 437 1437 3437 3437 74 75 FCAAAA NHKAAA VVVVxx +281 6956 1 1 1 1 81 281 281 281 281 162 163 VKAAAA OHKAAA AAAAxx +6676 6957 0 0 6 16 76 676 676 1676 6676 152 153 UWAAAA PHKAAA HHHHxx +145 6958 1 1 5 5 45 145 145 145 145 90 91 PFAAAA QHKAAA OOOOxx +3172 6959 0 0 2 12 72 172 1172 3172 3172 144 145 ASAAAA RHKAAA VVVVxx +4049 6960 1 1 9 9 49 49 49 4049 4049 98 99 TZAAAA SHKAAA AAAAxx +6042 6961 0 2 2 2 42 42 42 1042 6042 84 85 KYAAAA THKAAA HHHHxx +9122 6962 0 2 2 2 22 122 1122 4122 9122 44 45 WMAAAA UHKAAA OOOOxx +7244 6963 0 0 4 4 44 244 1244 2244 7244 88 89 QSAAAA VHKAAA VVVVxx +5361 6964 1 1 1 1 61 361 1361 361 5361 122 123 FYAAAA WHKAAA AAAAxx +8647 6965 1 3 7 7 47 647 647 3647 8647 94 95 PUAAAA XHKAAA HHHHxx +7956 6966 0 0 6 16 56 956 1956 2956 7956 112 113 AUAAAA YHKAAA OOOOxx +7812 6967 0 0 2 12 12 812 1812 2812 7812 24 25 MOAAAA ZHKAAA VVVVxx +570 6968 0 2 0 10 70 570 570 570 570 140 141 YVAAAA AIKAAA AAAAxx +4115 6969 1 3 5 15 15 115 115 4115 4115 30 31 HCAAAA BIKAAA HHHHxx +1856 6970 0 0 6 16 56 856 1856 1856 1856 112 113 KTAAAA CIKAAA OOOOxx +9582 6971 0 2 2 2 82 582 1582 4582 9582 164 165 OEAAAA DIKAAA VVVVxx +2025 6972 1 1 5 5 25 25 25 2025 2025 50 51 XZAAAA EIKAAA AAAAxx +986 6973 0 2 6 6 86 986 986 986 986 172 173 YLAAAA FIKAAA HHHHxx +8358 6974 0 2 8 18 58 358 358 3358 8358 116 117 MJAAAA GIKAAA OOOOxx +510 6975 0 2 0 10 10 510 510 510 510 20 21 QTAAAA HIKAAA VVVVxx +6101 6976 1 1 1 1 1 101 101 1101 6101 2 3 RAAAAA IIKAAA AAAAxx +4167 6977 1 3 7 7 67 167 167 4167 4167 134 135 HEAAAA JIKAAA HHHHxx +6139 6978 1 3 9 19 39 139 139 1139 6139 78 79 DCAAAA KIKAAA OOOOxx +6912 6979 0 0 2 12 12 912 912 1912 6912 24 25 WFAAAA LIKAAA VVVVxx +339 6980 1 3 9 19 39 339 339 339 339 78 79 BNAAAA MIKAAA AAAAxx +8759 6981 1 3 9 19 59 759 759 3759 8759 118 119 XYAAAA NIKAAA HHHHxx +246 6982 0 2 6 6 46 246 246 246 246 92 93 MJAAAA OIKAAA OOOOxx +2831 6983 1 3 1 11 31 831 831 2831 2831 62 63 XEAAAA PIKAAA VVVVxx +2327 6984 1 3 7 7 27 327 327 2327 2327 54 55 NLAAAA QIKAAA AAAAxx +7001 6985 1 1 1 1 1 1 1001 2001 7001 2 3 HJAAAA RIKAAA HHHHxx +4398 6986 0 2 8 18 98 398 398 4398 4398 196 197 ENAAAA SIKAAA OOOOxx +1495 6987 1 3 5 15 95 495 1495 1495 1495 190 191 NFAAAA TIKAAA VVVVxx +8522 6988 0 2 2 2 22 522 522 3522 8522 44 45 UPAAAA UIKAAA AAAAxx +7090 6989 0 2 0 10 90 90 1090 2090 7090 180 181 SMAAAA VIKAAA HHHHxx +8457 6990 1 1 7 17 57 457 457 3457 8457 114 115 HNAAAA WIKAAA OOOOxx +4238 6991 0 2 8 18 38 238 238 4238 4238 76 77 AHAAAA XIKAAA VVVVxx +6791 6992 1 3 1 11 91 791 791 1791 6791 182 183 FBAAAA YIKAAA AAAAxx +1342 6993 0 2 2 2 42 342 1342 1342 1342 84 85 QZAAAA ZIKAAA HHHHxx +4580 6994 0 0 0 0 80 580 580 4580 4580 160 161 EUAAAA AJKAAA OOOOxx +1475 6995 1 3 5 15 75 475 1475 1475 1475 150 151 TEAAAA BJKAAA VVVVxx +9184 6996 0 0 4 4 84 184 1184 4184 9184 168 169 GPAAAA CJKAAA AAAAxx +1189 6997 1 1 9 9 89 189 1189 1189 1189 178 179 TTAAAA DJKAAA HHHHxx +638 6998 0 2 8 18 38 638 638 638 638 76 77 OYAAAA EJKAAA OOOOxx +5867 6999 1 3 7 7 67 867 1867 867 5867 134 135 RRAAAA FJKAAA VVVVxx +9911 7000 1 3 1 11 11 911 1911 4911 9911 22 23 FRAAAA GJKAAA AAAAxx +8147 7001 1 3 7 7 47 147 147 3147 8147 94 95 JBAAAA HJKAAA HHHHxx +4492 7002 0 0 2 12 92 492 492 4492 4492 184 185 UQAAAA IJKAAA OOOOxx +385 7003 1 1 5 5 85 385 385 385 385 170 171 VOAAAA JJKAAA VVVVxx +5235 7004 1 3 5 15 35 235 1235 235 5235 70 71 JTAAAA KJKAAA AAAAxx +4812 7005 0 0 2 12 12 812 812 4812 4812 24 25 CDAAAA LJKAAA HHHHxx +9807 7006 1 3 7 7 7 807 1807 4807 9807 14 15 FNAAAA MJKAAA OOOOxx +9588 7007 0 0 8 8 88 588 1588 4588 9588 176 177 UEAAAA NJKAAA VVVVxx +9832 7008 0 0 2 12 32 832 1832 4832 9832 64 65 EOAAAA OJKAAA AAAAxx +3757 7009 1 1 7 17 57 757 1757 3757 3757 114 115 NOAAAA PJKAAA HHHHxx +9703 7010 1 3 3 3 3 703 1703 4703 9703 6 7 FJAAAA QJKAAA OOOOxx +1022 7011 0 2 2 2 22 22 1022 1022 1022 44 45 INAAAA RJKAAA VVVVxx +5165 7012 1 1 5 5 65 165 1165 165 5165 130 131 RQAAAA SJKAAA AAAAxx +7129 7013 1 1 9 9 29 129 1129 2129 7129 58 59 FOAAAA TJKAAA HHHHxx +4164 7014 0 0 4 4 64 164 164 4164 4164 128 129 EEAAAA UJKAAA OOOOxx +7239 7015 1 3 9 19 39 239 1239 2239 7239 78 79 LSAAAA VJKAAA VVVVxx +523 7016 1 3 3 3 23 523 523 523 523 46 47 DUAAAA WJKAAA AAAAxx +4670 7017 0 2 0 10 70 670 670 4670 4670 140 141 QXAAAA XJKAAA HHHHxx +8503 7018 1 3 3 3 3 503 503 3503 8503 6 7 BPAAAA YJKAAA OOOOxx +714 7019 0 2 4 14 14 714 714 714 714 28 29 MBAAAA ZJKAAA VVVVxx +1350 7020 0 2 0 10 50 350 1350 1350 1350 100 101 YZAAAA AKKAAA AAAAxx +8318 7021 0 2 8 18 18 318 318 3318 8318 36 37 YHAAAA BKKAAA HHHHxx +1834 7022 0 2 4 14 34 834 1834 1834 1834 68 69 OSAAAA CKKAAA OOOOxx +4306 7023 0 2 6 6 6 306 306 4306 4306 12 13 QJAAAA DKKAAA VVVVxx +8543 7024 1 3 3 3 43 543 543 3543 8543 86 87 PQAAAA EKKAAA AAAAxx +9397 7025 1 1 7 17 97 397 1397 4397 9397 194 195 LXAAAA FKKAAA HHHHxx +3145 7026 1 1 5 5 45 145 1145 3145 3145 90 91 ZQAAAA GKKAAA OOOOxx +3942 7027 0 2 2 2 42 942 1942 3942 3942 84 85 QVAAAA HKKAAA VVVVxx +8583 7028 1 3 3 3 83 583 583 3583 8583 166 167 DSAAAA IKKAAA AAAAxx +8073 7029 1 1 3 13 73 73 73 3073 8073 146 147 NYAAAA JKKAAA HHHHxx +4940 7030 0 0 0 0 40 940 940 4940 4940 80 81 AIAAAA KKKAAA OOOOxx +9573 7031 1 1 3 13 73 573 1573 4573 9573 146 147 FEAAAA LKKAAA VVVVxx +5325 7032 1 1 5 5 25 325 1325 325 5325 50 51 VWAAAA MKKAAA AAAAxx +1833 7033 1 1 3 13 33 833 1833 1833 1833 66 67 NSAAAA NKKAAA HHHHxx +1337 7034 1 1 7 17 37 337 1337 1337 1337 74 75 LZAAAA OKKAAA OOOOxx +9749 7035 1 1 9 9 49 749 1749 4749 9749 98 99 ZKAAAA PKKAAA VVVVxx +7505 7036 1 1 5 5 5 505 1505 2505 7505 10 11 RCAAAA QKKAAA AAAAxx +9731 7037 1 3 1 11 31 731 1731 4731 9731 62 63 HKAAAA RKKAAA HHHHxx +4098 7038 0 2 8 18 98 98 98 4098 4098 196 197 QBAAAA SKKAAA OOOOxx +1418 7039 0 2 8 18 18 418 1418 1418 1418 36 37 OCAAAA TKKAAA VVVVxx +63 7040 1 3 3 3 63 63 63 63 63 126 127 LCAAAA UKKAAA AAAAxx +9889 7041 1 1 9 9 89 889 1889 4889 9889 178 179 JQAAAA VKKAAA HHHHxx +2871 7042 1 3 1 11 71 871 871 2871 2871 142 143 LGAAAA WKKAAA OOOOxx +1003 7043 1 3 3 3 3 3 1003 1003 1003 6 7 PMAAAA XKKAAA VVVVxx +8796 7044 0 0 6 16 96 796 796 3796 8796 192 193 IAAAAA YKKAAA AAAAxx +22 7045 0 2 2 2 22 22 22 22 22 44 45 WAAAAA ZKKAAA HHHHxx +8244 7046 0 0 4 4 44 244 244 3244 8244 88 89 CFAAAA ALKAAA OOOOxx +2282 7047 0 2 2 2 82 282 282 2282 2282 164 165 UJAAAA BLKAAA VVVVxx +3487 7048 1 3 7 7 87 487 1487 3487 3487 174 175 DEAAAA CLKAAA AAAAxx +8633 7049 1 1 3 13 33 633 633 3633 8633 66 67 BUAAAA DLKAAA HHHHxx +6418 7050 0 2 8 18 18 418 418 1418 6418 36 37 WMAAAA ELKAAA OOOOxx +4682 7051 0 2 2 2 82 682 682 4682 4682 164 165 CYAAAA FLKAAA VVVVxx +4103 7052 1 3 3 3 3 103 103 4103 4103 6 7 VBAAAA GLKAAA AAAAxx +6256 7053 0 0 6 16 56 256 256 1256 6256 112 113 QGAAAA HLKAAA HHHHxx +4040 7054 0 0 0 0 40 40 40 4040 4040 80 81 KZAAAA ILKAAA OOOOxx +9342 7055 0 2 2 2 42 342 1342 4342 9342 84 85 IVAAAA JLKAAA VVVVxx +9969 7056 1 1 9 9 69 969 1969 4969 9969 138 139 LTAAAA KLKAAA AAAAxx +223 7057 1 3 3 3 23 223 223 223 223 46 47 PIAAAA LLKAAA HHHHxx +4593 7058 1 1 3 13 93 593 593 4593 4593 186 187 RUAAAA MLKAAA OOOOxx +44 7059 0 0 4 4 44 44 44 44 44 88 89 SBAAAA NLKAAA VVVVxx +3513 7060 1 1 3 13 13 513 1513 3513 3513 26 27 DFAAAA OLKAAA AAAAxx +5771 7061 1 3 1 11 71 771 1771 771 5771 142 143 ZNAAAA PLKAAA HHHHxx +5083 7062 1 3 3 3 83 83 1083 83 5083 166 167 NNAAAA QLKAAA OOOOxx +3839 7063 1 3 9 19 39 839 1839 3839 3839 78 79 RRAAAA RLKAAA VVVVxx +2986 7064 0 2 6 6 86 986 986 2986 2986 172 173 WKAAAA SLKAAA AAAAxx +2200 7065 0 0 0 0 0 200 200 2200 2200 0 1 QGAAAA TLKAAA HHHHxx +197 7066 1 1 7 17 97 197 197 197 197 194 195 PHAAAA ULKAAA OOOOxx +7455 7067 1 3 5 15 55 455 1455 2455 7455 110 111 TAAAAA VLKAAA VVVVxx +1379 7068 1 3 9 19 79 379 1379 1379 1379 158 159 BBAAAA WLKAAA AAAAxx +4356 7069 0 0 6 16 56 356 356 4356 4356 112 113 OLAAAA XLKAAA HHHHxx +6888 7070 0 0 8 8 88 888 888 1888 6888 176 177 YEAAAA YLKAAA OOOOxx +9139 7071 1 3 9 19 39 139 1139 4139 9139 78 79 NNAAAA ZLKAAA VVVVxx +7682 7072 0 2 2 2 82 682 1682 2682 7682 164 165 MJAAAA AMKAAA AAAAxx +4873 7073 1 1 3 13 73 873 873 4873 4873 146 147 LFAAAA BMKAAA HHHHxx +783 7074 1 3 3 3 83 783 783 783 783 166 167 DEAAAA CMKAAA OOOOxx +6071 7075 1 3 1 11 71 71 71 1071 6071 142 143 NZAAAA DMKAAA VVVVxx +5160 7076 0 0 0 0 60 160 1160 160 5160 120 121 MQAAAA EMKAAA AAAAxx +2291 7077 1 3 1 11 91 291 291 2291 2291 182 183 DKAAAA FMKAAA HHHHxx +187 7078 1 3 7 7 87 187 187 187 187 174 175 FHAAAA GMKAAA OOOOxx +7786 7079 0 2 6 6 86 786 1786 2786 7786 172 173 MNAAAA HMKAAA VVVVxx +3432 7080 0 0 2 12 32 432 1432 3432 3432 64 65 ACAAAA IMKAAA AAAAxx +5450 7081 0 2 0 10 50 450 1450 450 5450 100 101 QBAAAA JMKAAA HHHHxx +2699 7082 1 3 9 19 99 699 699 2699 2699 198 199 VZAAAA KMKAAA OOOOxx +692 7083 0 0 2 12 92 692 692 692 692 184 185 QAAAAA LMKAAA VVVVxx +6081 7084 1 1 1 1 81 81 81 1081 6081 162 163 XZAAAA MMKAAA AAAAxx +4829 7085 1 1 9 9 29 829 829 4829 4829 58 59 TDAAAA NMKAAA HHHHxx +238 7086 0 2 8 18 38 238 238 238 238 76 77 EJAAAA OMKAAA OOOOxx +9100 7087 0 0 0 0 0 100 1100 4100 9100 0 1 AMAAAA PMKAAA VVVVxx +1968 7088 0 0 8 8 68 968 1968 1968 1968 136 137 SXAAAA QMKAAA AAAAxx +1872 7089 0 0 2 12 72 872 1872 1872 1872 144 145 AUAAAA RMKAAA HHHHxx +7051 7090 1 3 1 11 51 51 1051 2051 7051 102 103 FLAAAA SMKAAA OOOOxx +2743 7091 1 3 3 3 43 743 743 2743 2743 86 87 NBAAAA TMKAAA VVVVxx +1237 7092 1 1 7 17 37 237 1237 1237 1237 74 75 PVAAAA UMKAAA AAAAxx +3052 7093 0 0 2 12 52 52 1052 3052 3052 104 105 KNAAAA VMKAAA HHHHxx +8021 7094 1 1 1 1 21 21 21 3021 8021 42 43 NWAAAA WMKAAA OOOOxx +657 7095 1 1 7 17 57 657 657 657 657 114 115 HZAAAA XMKAAA VVVVxx +2236 7096 0 0 6 16 36 236 236 2236 2236 72 73 AIAAAA YMKAAA AAAAxx +7011 7097 1 3 1 11 11 11 1011 2011 7011 22 23 RJAAAA ZMKAAA HHHHxx +4067 7098 1 3 7 7 67 67 67 4067 4067 134 135 LAAAAA ANKAAA OOOOxx +9449 7099 1 1 9 9 49 449 1449 4449 9449 98 99 LZAAAA BNKAAA VVVVxx +7428 7100 0 0 8 8 28 428 1428 2428 7428 56 57 SZAAAA CNKAAA AAAAxx +1272 7101 0 0 2 12 72 272 1272 1272 1272 144 145 YWAAAA DNKAAA HHHHxx +6897 7102 1 1 7 17 97 897 897 1897 6897 194 195 HFAAAA ENKAAA OOOOxx +5839 7103 1 3 9 19 39 839 1839 839 5839 78 79 PQAAAA FNKAAA VVVVxx +6835 7104 1 3 5 15 35 835 835 1835 6835 70 71 XCAAAA GNKAAA AAAAxx +1887 7105 1 3 7 7 87 887 1887 1887 1887 174 175 PUAAAA HNKAAA HHHHxx +1551 7106 1 3 1 11 51 551 1551 1551 1551 102 103 RHAAAA INKAAA OOOOxx +4667 7107 1 3 7 7 67 667 667 4667 4667 134 135 NXAAAA JNKAAA VVVVxx +9603 7108 1 3 3 3 3 603 1603 4603 9603 6 7 JFAAAA KNKAAA AAAAxx +4332 7109 0 0 2 12 32 332 332 4332 4332 64 65 QKAAAA LNKAAA HHHHxx +5681 7110 1 1 1 1 81 681 1681 681 5681 162 163 NKAAAA MNKAAA OOOOxx +8062 7111 0 2 2 2 62 62 62 3062 8062 124 125 CYAAAA NNKAAA VVVVxx +2302 7112 0 2 2 2 2 302 302 2302 2302 4 5 OKAAAA ONKAAA AAAAxx +2825 7113 1 1 5 5 25 825 825 2825 2825 50 51 REAAAA PNKAAA HHHHxx +4527 7114 1 3 7 7 27 527 527 4527 4527 54 55 DSAAAA QNKAAA OOOOxx +4230 7115 0 2 0 10 30 230 230 4230 4230 60 61 SGAAAA RNKAAA VVVVxx +3053 7116 1 1 3 13 53 53 1053 3053 3053 106 107 LNAAAA SNKAAA AAAAxx +983 7117 1 3 3 3 83 983 983 983 983 166 167 VLAAAA TNKAAA HHHHxx +9458 7118 0 2 8 18 58 458 1458 4458 9458 116 117 UZAAAA UNKAAA OOOOxx +4128 7119 0 0 8 8 28 128 128 4128 4128 56 57 UCAAAA VNKAAA VVVVxx +425 7120 1 1 5 5 25 425 425 425 425 50 51 JQAAAA WNKAAA AAAAxx +3911 7121 1 3 1 11 11 911 1911 3911 3911 22 23 LUAAAA XNKAAA HHHHxx +6607 7122 1 3 7 7 7 607 607 1607 6607 14 15 DUAAAA YNKAAA OOOOxx +5431 7123 1 3 1 11 31 431 1431 431 5431 62 63 XAAAAA ZNKAAA VVVVxx +6330 7124 0 2 0 10 30 330 330 1330 6330 60 61 MJAAAA AOKAAA AAAAxx +3592 7125 0 0 2 12 92 592 1592 3592 3592 184 185 EIAAAA BOKAAA HHHHxx +154 7126 0 2 4 14 54 154 154 154 154 108 109 YFAAAA COKAAA OOOOxx +9879 7127 1 3 9 19 79 879 1879 4879 9879 158 159 ZPAAAA DOKAAA VVVVxx +3202 7128 0 2 2 2 2 202 1202 3202 3202 4 5 ETAAAA EOKAAA AAAAxx +3056 7129 0 0 6 16 56 56 1056 3056 3056 112 113 ONAAAA FOKAAA HHHHxx +9890 7130 0 2 0 10 90 890 1890 4890 9890 180 181 KQAAAA GOKAAA OOOOxx +5840 7131 0 0 0 0 40 840 1840 840 5840 80 81 QQAAAA HOKAAA VVVVxx +9804 7132 0 0 4 4 4 804 1804 4804 9804 8 9 CNAAAA IOKAAA AAAAxx +681 7133 1 1 1 1 81 681 681 681 681 162 163 FAAAAA JOKAAA HHHHxx +3443 7134 1 3 3 3 43 443 1443 3443 3443 86 87 LCAAAA KOKAAA OOOOxx +8088 7135 0 0 8 8 88 88 88 3088 8088 176 177 CZAAAA LOKAAA VVVVxx +9447 7136 1 3 7 7 47 447 1447 4447 9447 94 95 JZAAAA MOKAAA AAAAxx +1490 7137 0 2 0 10 90 490 1490 1490 1490 180 181 IFAAAA NOKAAA HHHHxx +3684 7138 0 0 4 4 84 684 1684 3684 3684 168 169 SLAAAA OOKAAA OOOOxx +3113 7139 1 1 3 13 13 113 1113 3113 3113 26 27 TPAAAA POKAAA VVVVxx +9004 7140 0 0 4 4 4 4 1004 4004 9004 8 9 IIAAAA QOKAAA AAAAxx +7147 7141 1 3 7 7 47 147 1147 2147 7147 94 95 XOAAAA ROKAAA HHHHxx +7571 7142 1 3 1 11 71 571 1571 2571 7571 142 143 FFAAAA SOKAAA OOOOxx +5545 7143 1 1 5 5 45 545 1545 545 5545 90 91 HFAAAA TOKAAA VVVVxx +4558 7144 0 2 8 18 58 558 558 4558 4558 116 117 ITAAAA UOKAAA AAAAxx +6206 7145 0 2 6 6 6 206 206 1206 6206 12 13 SEAAAA VOKAAA HHHHxx +5695 7146 1 3 5 15 95 695 1695 695 5695 190 191 BLAAAA WOKAAA OOOOxx +9600 7147 0 0 0 0 0 600 1600 4600 9600 0 1 GFAAAA XOKAAA VVVVxx +5432 7148 0 0 2 12 32 432 1432 432 5432 64 65 YAAAAA YOKAAA AAAAxx +9299 7149 1 3 9 19 99 299 1299 4299 9299 198 199 RTAAAA ZOKAAA HHHHxx +2386 7150 0 2 6 6 86 386 386 2386 2386 172 173 UNAAAA APKAAA OOOOxx +2046 7151 0 2 6 6 46 46 46 2046 2046 92 93 SAAAAA BPKAAA VVVVxx +3293 7152 1 1 3 13 93 293 1293 3293 3293 186 187 RWAAAA CPKAAA AAAAxx +3046 7153 0 2 6 6 46 46 1046 3046 3046 92 93 ENAAAA DPKAAA HHHHxx +214 7154 0 2 4 14 14 214 214 214 214 28 29 GIAAAA EPKAAA OOOOxx +7893 7155 1 1 3 13 93 893 1893 2893 7893 186 187 PRAAAA FPKAAA VVVVxx +891 7156 1 3 1 11 91 891 891 891 891 182 183 HIAAAA GPKAAA AAAAxx +6499 7157 1 3 9 19 99 499 499 1499 6499 198 199 ZPAAAA HPKAAA HHHHxx +5003 7158 1 3 3 3 3 3 1003 3 5003 6 7 LKAAAA IPKAAA OOOOxx +6487 7159 1 3 7 7 87 487 487 1487 6487 174 175 NPAAAA JPKAAA VVVVxx +9403 7160 1 3 3 3 3 403 1403 4403 9403 6 7 RXAAAA KPKAAA AAAAxx +945 7161 1 1 5 5 45 945 945 945 945 90 91 JKAAAA LPKAAA HHHHxx +6713 7162 1 1 3 13 13 713 713 1713 6713 26 27 FYAAAA MPKAAA OOOOxx +9928 7163 0 0 8 8 28 928 1928 4928 9928 56 57 WRAAAA NPKAAA VVVVxx +8585 7164 1 1 5 5 85 585 585 3585 8585 170 171 FSAAAA OPKAAA AAAAxx +4004 7165 0 0 4 4 4 4 4 4004 4004 8 9 AYAAAA PPKAAA HHHHxx +2528 7166 0 0 8 8 28 528 528 2528 2528 56 57 GTAAAA QPKAAA OOOOxx +3350 7167 0 2 0 10 50 350 1350 3350 3350 100 101 WYAAAA RPKAAA VVVVxx +2160 7168 0 0 0 0 60 160 160 2160 2160 120 121 CFAAAA SPKAAA AAAAxx +1521 7169 1 1 1 1 21 521 1521 1521 1521 42 43 NGAAAA TPKAAA HHHHxx +5660 7170 0 0 0 0 60 660 1660 660 5660 120 121 SJAAAA UPKAAA OOOOxx +5755 7171 1 3 5 15 55 755 1755 755 5755 110 111 JNAAAA VPKAAA VVVVxx +7614 7172 0 2 4 14 14 614 1614 2614 7614 28 29 WGAAAA WPKAAA AAAAxx +3121 7173 1 1 1 1 21 121 1121 3121 3121 42 43 BQAAAA XPKAAA HHHHxx +2735 7174 1 3 5 15 35 735 735 2735 2735 70 71 FBAAAA YPKAAA OOOOxx +7506 7175 0 2 6 6 6 506 1506 2506 7506 12 13 SCAAAA ZPKAAA VVVVxx +2693 7176 1 1 3 13 93 693 693 2693 2693 186 187 PZAAAA AQKAAA AAAAxx +2892 7177 0 0 2 12 92 892 892 2892 2892 184 185 GHAAAA BQKAAA HHHHxx +3310 7178 0 2 0 10 10 310 1310 3310 3310 20 21 IXAAAA CQKAAA OOOOxx +3484 7179 0 0 4 4 84 484 1484 3484 3484 168 169 AEAAAA DQKAAA VVVVxx +9733 7180 1 1 3 13 33 733 1733 4733 9733 66 67 JKAAAA EQKAAA AAAAxx +29 7181 1 1 9 9 29 29 29 29 29 58 59 DBAAAA FQKAAA HHHHxx +9013 7182 1 1 3 13 13 13 1013 4013 9013 26 27 RIAAAA GQKAAA OOOOxx +3847 7183 1 3 7 7 47 847 1847 3847 3847 94 95 ZRAAAA HQKAAA VVVVxx +6724 7184 0 0 4 4 24 724 724 1724 6724 48 49 QYAAAA IQKAAA AAAAxx +2559 7185 1 3 9 19 59 559 559 2559 2559 118 119 LUAAAA JQKAAA HHHHxx +5326 7186 0 2 6 6 26 326 1326 326 5326 52 53 WWAAAA KQKAAA OOOOxx +4802 7187 0 2 2 2 2 802 802 4802 4802 4 5 SCAAAA LQKAAA VVVVxx +131 7188 1 3 1 11 31 131 131 131 131 62 63 BFAAAA MQKAAA AAAAxx +1634 7189 0 2 4 14 34 634 1634 1634 1634 68 69 WKAAAA NQKAAA HHHHxx +919 7190 1 3 9 19 19 919 919 919 919 38 39 JJAAAA OQKAAA OOOOxx +9575 7191 1 3 5 15 75 575 1575 4575 9575 150 151 HEAAAA PQKAAA VVVVxx +1256 7192 0 0 6 16 56 256 1256 1256 1256 112 113 IWAAAA QQKAAA AAAAxx +9428 7193 0 0 8 8 28 428 1428 4428 9428 56 57 QYAAAA RQKAAA HHHHxx +5121 7194 1 1 1 1 21 121 1121 121 5121 42 43 ZOAAAA SQKAAA OOOOxx +6584 7195 0 0 4 4 84 584 584 1584 6584 168 169 GTAAAA TQKAAA VVVVxx +7193 7196 1 1 3 13 93 193 1193 2193 7193 186 187 RQAAAA UQKAAA AAAAxx +4047 7197 1 3 7 7 47 47 47 4047 4047 94 95 RZAAAA VQKAAA HHHHxx +104 7198 0 0 4 4 4 104 104 104 104 8 9 AEAAAA WQKAAA OOOOxx +1527 7199 1 3 7 7 27 527 1527 1527 1527 54 55 TGAAAA XQKAAA VVVVxx +3460 7200 0 0 0 0 60 460 1460 3460 3460 120 121 CDAAAA YQKAAA AAAAxx +8526 7201 0 2 6 6 26 526 526 3526 8526 52 53 YPAAAA ZQKAAA HHHHxx +8959 7202 1 3 9 19 59 959 959 3959 8959 118 119 PGAAAA ARKAAA OOOOxx +3633 7203 1 1 3 13 33 633 1633 3633 3633 66 67 TJAAAA BRKAAA VVVVxx +1799 7204 1 3 9 19 99 799 1799 1799 1799 198 199 FRAAAA CRKAAA AAAAxx +461 7205 1 1 1 1 61 461 461 461 461 122 123 TRAAAA DRKAAA HHHHxx +718 7206 0 2 8 18 18 718 718 718 718 36 37 QBAAAA ERKAAA OOOOxx +3219 7207 1 3 9 19 19 219 1219 3219 3219 38 39 VTAAAA FRKAAA VVVVxx +3494 7208 0 2 4 14 94 494 1494 3494 3494 188 189 KEAAAA GRKAAA AAAAxx +9402 7209 0 2 2 2 2 402 1402 4402 9402 4 5 QXAAAA HRKAAA HHHHxx +7983 7210 1 3 3 3 83 983 1983 2983 7983 166 167 BVAAAA IRKAAA OOOOxx +7919 7211 1 3 9 19 19 919 1919 2919 7919 38 39 PSAAAA JRKAAA VVVVxx +8036 7212 0 0 6 16 36 36 36 3036 8036 72 73 CXAAAA KRKAAA AAAAxx +5164 7213 0 0 4 4 64 164 1164 164 5164 128 129 QQAAAA LRKAAA HHHHxx +4160 7214 0 0 0 0 60 160 160 4160 4160 120 121 AEAAAA MRKAAA OOOOxx +5370 7215 0 2 0 10 70 370 1370 370 5370 140 141 OYAAAA NRKAAA VVVVxx +5347 7216 1 3 7 7 47 347 1347 347 5347 94 95 RXAAAA ORKAAA AAAAxx +7109 7217 1 1 9 9 9 109 1109 2109 7109 18 19 LNAAAA PRKAAA HHHHxx +4826 7218 0 2 6 6 26 826 826 4826 4826 52 53 QDAAAA QRKAAA OOOOxx +1338 7219 0 2 8 18 38 338 1338 1338 1338 76 77 MZAAAA RRKAAA VVVVxx +2711 7220 1 3 1 11 11 711 711 2711 2711 22 23 HAAAAA SRKAAA AAAAxx +6299 7221 1 3 9 19 99 299 299 1299 6299 198 199 HIAAAA TRKAAA HHHHxx +1616 7222 0 0 6 16 16 616 1616 1616 1616 32 33 EKAAAA URKAAA OOOOxx +7519 7223 1 3 9 19 19 519 1519 2519 7519 38 39 FDAAAA VRKAAA VVVVxx +1262 7224 0 2 2 2 62 262 1262 1262 1262 124 125 OWAAAA WRKAAA AAAAxx +7228 7225 0 0 8 8 28 228 1228 2228 7228 56 57 ASAAAA XRKAAA HHHHxx +7892 7226 0 0 2 12 92 892 1892 2892 7892 184 185 ORAAAA YRKAAA OOOOxx +7929 7227 1 1 9 9 29 929 1929 2929 7929 58 59 ZSAAAA ZRKAAA VVVVxx +7705 7228 1 1 5 5 5 705 1705 2705 7705 10 11 JKAAAA ASKAAA AAAAxx +3111 7229 1 3 1 11 11 111 1111 3111 3111 22 23 RPAAAA BSKAAA HHHHxx +3066 7230 0 2 6 6 66 66 1066 3066 3066 132 133 YNAAAA CSKAAA OOOOxx +9559 7231 1 3 9 19 59 559 1559 4559 9559 118 119 RDAAAA DSKAAA VVVVxx +3787 7232 1 3 7 7 87 787 1787 3787 3787 174 175 RPAAAA ESKAAA AAAAxx +8710 7233 0 2 0 10 10 710 710 3710 8710 20 21 AXAAAA FSKAAA HHHHxx +4870 7234 0 2 0 10 70 870 870 4870 4870 140 141 IFAAAA GSKAAA OOOOxx +1883 7235 1 3 3 3 83 883 1883 1883 1883 166 167 LUAAAA HSKAAA VVVVxx +9689 7236 1 1 9 9 89 689 1689 4689 9689 178 179 RIAAAA ISKAAA AAAAxx +9491 7237 1 3 1 11 91 491 1491 4491 9491 182 183 BBAAAA JSKAAA HHHHxx +2035 7238 1 3 5 15 35 35 35 2035 2035 70 71 HAAAAA KSKAAA OOOOxx +655 7239 1 3 5 15 55 655 655 655 655 110 111 FZAAAA LSKAAA VVVVxx +6305 7240 1 1 5 5 5 305 305 1305 6305 10 11 NIAAAA MSKAAA AAAAxx +9423 7241 1 3 3 3 23 423 1423 4423 9423 46 47 LYAAAA NSKAAA HHHHxx +283 7242 1 3 3 3 83 283 283 283 283 166 167 XKAAAA OSKAAA OOOOxx +2607 7243 1 3 7 7 7 607 607 2607 2607 14 15 HWAAAA PSKAAA VVVVxx +7740 7244 0 0 0 0 40 740 1740 2740 7740 80 81 SLAAAA QSKAAA AAAAxx +6956 7245 0 0 6 16 56 956 956 1956 6956 112 113 OHAAAA RSKAAA HHHHxx +884 7246 0 0 4 4 84 884 884 884 884 168 169 AIAAAA SSKAAA OOOOxx +5730 7247 0 2 0 10 30 730 1730 730 5730 60 61 KMAAAA TSKAAA VVVVxx +3438 7248 0 2 8 18 38 438 1438 3438 3438 76 77 GCAAAA USKAAA AAAAxx +3250 7249 0 2 0 10 50 250 1250 3250 3250 100 101 AVAAAA VSKAAA HHHHxx +5470 7250 0 2 0 10 70 470 1470 470 5470 140 141 KCAAAA WSKAAA OOOOxx +2037 7251 1 1 7 17 37 37 37 2037 2037 74 75 JAAAAA XSKAAA VVVVxx +6593 7252 1 1 3 13 93 593 593 1593 6593 186 187 PTAAAA YSKAAA AAAAxx +3893 7253 1 1 3 13 93 893 1893 3893 3893 186 187 TTAAAA ZSKAAA HHHHxx +3200 7254 0 0 0 0 0 200 1200 3200 3200 0 1 CTAAAA ATKAAA OOOOxx +7125 7255 1 1 5 5 25 125 1125 2125 7125 50 51 BOAAAA BTKAAA VVVVxx +2295 7256 1 3 5 15 95 295 295 2295 2295 190 191 HKAAAA CTKAAA AAAAxx +2056 7257 0 0 6 16 56 56 56 2056 2056 112 113 CBAAAA DTKAAA HHHHxx +2962 7258 0 2 2 2 62 962 962 2962 2962 124 125 YJAAAA ETKAAA OOOOxx +993 7259 1 1 3 13 93 993 993 993 993 186 187 FMAAAA FTKAAA VVVVxx +9127 7260 1 3 7 7 27 127 1127 4127 9127 54 55 BNAAAA GTKAAA AAAAxx +2075 7261 1 3 5 15 75 75 75 2075 2075 150 151 VBAAAA HTKAAA HHHHxx +9338 7262 0 2 8 18 38 338 1338 4338 9338 76 77 EVAAAA ITKAAA OOOOxx +8100 7263 0 0 0 0 0 100 100 3100 8100 0 1 OZAAAA JTKAAA VVVVxx +5047 7264 1 3 7 7 47 47 1047 47 5047 94 95 DMAAAA KTKAAA AAAAxx +7032 7265 0 0 2 12 32 32 1032 2032 7032 64 65 MKAAAA LTKAAA HHHHxx +6374 7266 0 2 4 14 74 374 374 1374 6374 148 149 ELAAAA MTKAAA OOOOxx +4137 7267 1 1 7 17 37 137 137 4137 4137 74 75 DDAAAA NTKAAA VVVVxx +7132 7268 0 0 2 12 32 132 1132 2132 7132 64 65 IOAAAA OTKAAA AAAAxx +3064 7269 0 0 4 4 64 64 1064 3064 3064 128 129 WNAAAA PTKAAA HHHHxx +3621 7270 1 1 1 1 21 621 1621 3621 3621 42 43 HJAAAA QTKAAA OOOOxx +6199 7271 1 3 9 19 99 199 199 1199 6199 198 199 LEAAAA RTKAAA VVVVxx +4926 7272 0 2 6 6 26 926 926 4926 4926 52 53 MHAAAA STKAAA AAAAxx +8035 7273 1 3 5 15 35 35 35 3035 8035 70 71 BXAAAA TTKAAA HHHHxx +2195 7274 1 3 5 15 95 195 195 2195 2195 190 191 LGAAAA UTKAAA OOOOxx +5366 7275 0 2 6 6 66 366 1366 366 5366 132 133 KYAAAA VTKAAA VVVVxx +3478 7276 0 2 8 18 78 478 1478 3478 3478 156 157 UDAAAA WTKAAA AAAAxx +1926 7277 0 2 6 6 26 926 1926 1926 1926 52 53 CWAAAA XTKAAA HHHHxx +7265 7278 1 1 5 5 65 265 1265 2265 7265 130 131 LTAAAA YTKAAA OOOOxx +7668 7279 0 0 8 8 68 668 1668 2668 7668 136 137 YIAAAA ZTKAAA VVVVxx +3335 7280 1 3 5 15 35 335 1335 3335 3335 70 71 HYAAAA AUKAAA AAAAxx +7660 7281 0 0 0 0 60 660 1660 2660 7660 120 121 QIAAAA BUKAAA HHHHxx +9604 7282 0 0 4 4 4 604 1604 4604 9604 8 9 KFAAAA CUKAAA OOOOxx +7301 7283 1 1 1 1 1 301 1301 2301 7301 2 3 VUAAAA DUKAAA VVVVxx +4475 7284 1 3 5 15 75 475 475 4475 4475 150 151 DQAAAA EUKAAA AAAAxx +9954 7285 0 2 4 14 54 954 1954 4954 9954 108 109 WSAAAA FUKAAA HHHHxx +5723 7286 1 3 3 3 23 723 1723 723 5723 46 47 DMAAAA GUKAAA OOOOxx +2669 7287 1 1 9 9 69 669 669 2669 2669 138 139 RYAAAA HUKAAA VVVVxx +1685 7288 1 1 5 5 85 685 1685 1685 1685 170 171 VMAAAA IUKAAA AAAAxx +2233 7289 1 1 3 13 33 233 233 2233 2233 66 67 XHAAAA JUKAAA HHHHxx +8111 7290 1 3 1 11 11 111 111 3111 8111 22 23 ZZAAAA KUKAAA OOOOxx +7685 7291 1 1 5 5 85 685 1685 2685 7685 170 171 PJAAAA LUKAAA VVVVxx +3773 7292 1 1 3 13 73 773 1773 3773 3773 146 147 DPAAAA MUKAAA AAAAxx +7172 7293 0 0 2 12 72 172 1172 2172 7172 144 145 WPAAAA NUKAAA HHHHxx +1740 7294 0 0 0 0 40 740 1740 1740 1740 80 81 YOAAAA OUKAAA OOOOxx +5416 7295 0 0 6 16 16 416 1416 416 5416 32 33 IAAAAA PUKAAA VVVVxx +1823 7296 1 3 3 3 23 823 1823 1823 1823 46 47 DSAAAA QUKAAA AAAAxx +1668 7297 0 0 8 8 68 668 1668 1668 1668 136 137 EMAAAA RUKAAA HHHHxx +1795 7298 1 3 5 15 95 795 1795 1795 1795 190 191 BRAAAA SUKAAA OOOOxx +8599 7299 1 3 9 19 99 599 599 3599 8599 198 199 TSAAAA TUKAAA VVVVxx +5542 7300 0 2 2 2 42 542 1542 542 5542 84 85 EFAAAA UUKAAA AAAAxx +5658 7301 0 2 8 18 58 658 1658 658 5658 116 117 QJAAAA VUKAAA HHHHxx +9824 7302 0 0 4 4 24 824 1824 4824 9824 48 49 WNAAAA WUKAAA OOOOxx +19 7303 1 3 9 19 19 19 19 19 19 38 39 TAAAAA XUKAAA VVVVxx +9344 7304 0 0 4 4 44 344 1344 4344 9344 88 89 KVAAAA YUKAAA AAAAxx +5900 7305 0 0 0 0 0 900 1900 900 5900 0 1 YSAAAA ZUKAAA HHHHxx +7818 7306 0 2 8 18 18 818 1818 2818 7818 36 37 SOAAAA AVKAAA OOOOxx +8377 7307 1 1 7 17 77 377 377 3377 8377 154 155 FKAAAA BVKAAA VVVVxx +6886 7308 0 2 6 6 86 886 886 1886 6886 172 173 WEAAAA CVKAAA AAAAxx +3201 7309 1 1 1 1 1 201 1201 3201 3201 2 3 DTAAAA DVKAAA HHHHxx +87 7310 1 3 7 7 87 87 87 87 87 174 175 JDAAAA EVKAAA OOOOxx +1089 7311 1 1 9 9 89 89 1089 1089 1089 178 179 XPAAAA FVKAAA VVVVxx +3948 7312 0 0 8 8 48 948 1948 3948 3948 96 97 WVAAAA GVKAAA AAAAxx +6383 7313 1 3 3 3 83 383 383 1383 6383 166 167 NLAAAA HVKAAA HHHHxx +837 7314 1 1 7 17 37 837 837 837 837 74 75 FGAAAA IVKAAA OOOOxx +6285 7315 1 1 5 5 85 285 285 1285 6285 170 171 THAAAA JVKAAA VVVVxx +78 7316 0 2 8 18 78 78 78 78 78 156 157 ADAAAA KVKAAA AAAAxx +4389 7317 1 1 9 9 89 389 389 4389 4389 178 179 VMAAAA LVKAAA HHHHxx +4795 7318 1 3 5 15 95 795 795 4795 4795 190 191 LCAAAA MVKAAA OOOOxx +9369 7319 1 1 9 9 69 369 1369 4369 9369 138 139 JWAAAA NVKAAA VVVVxx +69 7320 1 1 9 9 69 69 69 69 69 138 139 RCAAAA OVKAAA AAAAxx +7689 7321 1 1 9 9 89 689 1689 2689 7689 178 179 TJAAAA PVKAAA HHHHxx +5642 7322 0 2 2 2 42 642 1642 642 5642 84 85 AJAAAA QVKAAA OOOOxx +2348 7323 0 0 8 8 48 348 348 2348 2348 96 97 IMAAAA RVKAAA VVVVxx +9308 7324 0 0 8 8 8 308 1308 4308 9308 16 17 AUAAAA SVKAAA AAAAxx +9093 7325 1 1 3 13 93 93 1093 4093 9093 186 187 TLAAAA TVKAAA HHHHxx +1199 7326 1 3 9 19 99 199 1199 1199 1199 198 199 DUAAAA UVKAAA OOOOxx +307 7327 1 3 7 7 7 307 307 307 307 14 15 VLAAAA VVKAAA VVVVxx +3814 7328 0 2 4 14 14 814 1814 3814 3814 28 29 SQAAAA WVKAAA AAAAxx +8817 7329 1 1 7 17 17 817 817 3817 8817 34 35 DBAAAA XVKAAA HHHHxx +2329 7330 1 1 9 9 29 329 329 2329 2329 58 59 PLAAAA YVKAAA OOOOxx +2932 7331 0 0 2 12 32 932 932 2932 2932 64 65 UIAAAA ZVKAAA VVVVxx +1986 7332 0 2 6 6 86 986 1986 1986 1986 172 173 KYAAAA AWKAAA AAAAxx +5279 7333 1 3 9 19 79 279 1279 279 5279 158 159 BVAAAA BWKAAA HHHHxx +5357 7334 1 1 7 17 57 357 1357 357 5357 114 115 BYAAAA CWKAAA OOOOxx +6778 7335 0 2 8 18 78 778 778 1778 6778 156 157 SAAAAA DWKAAA VVVVxx +2773 7336 1 1 3 13 73 773 773 2773 2773 146 147 RCAAAA EWKAAA AAAAxx +244 7337 0 0 4 4 44 244 244 244 244 88 89 KJAAAA FWKAAA HHHHxx +6900 7338 0 0 0 0 0 900 900 1900 6900 0 1 KFAAAA GWKAAA OOOOxx +4739 7339 1 3 9 19 39 739 739 4739 4739 78 79 HAAAAA HWKAAA VVVVxx +3217 7340 1 1 7 17 17 217 1217 3217 3217 34 35 TTAAAA IWKAAA AAAAxx +7563 7341 1 3 3 3 63 563 1563 2563 7563 126 127 XEAAAA JWKAAA HHHHxx +1807 7342 1 3 7 7 7 807 1807 1807 1807 14 15 NRAAAA KWKAAA OOOOxx +4199 7343 1 3 9 19 99 199 199 4199 4199 198 199 NFAAAA LWKAAA VVVVxx +1077 7344 1 1 7 17 77 77 1077 1077 1077 154 155 LPAAAA MWKAAA AAAAxx +8348 7345 0 0 8 8 48 348 348 3348 8348 96 97 CJAAAA NWKAAA HHHHxx +841 7346 1 1 1 1 41 841 841 841 841 82 83 JGAAAA OWKAAA OOOOxx +8154 7347 0 2 4 14 54 154 154 3154 8154 108 109 QBAAAA PWKAAA VVVVxx +5261 7348 1 1 1 1 61 261 1261 261 5261 122 123 JUAAAA QWKAAA AAAAxx +1950 7349 0 2 0 10 50 950 1950 1950 1950 100 101 AXAAAA RWKAAA HHHHxx +8472 7350 0 0 2 12 72 472 472 3472 8472 144 145 WNAAAA SWKAAA OOOOxx +8745 7351 1 1 5 5 45 745 745 3745 8745 90 91 JYAAAA TWKAAA VVVVxx +8715 7352 1 3 5 15 15 715 715 3715 8715 30 31 FXAAAA UWKAAA AAAAxx +9708 7353 0 0 8 8 8 708 1708 4708 9708 16 17 KJAAAA VWKAAA HHHHxx +5860 7354 0 0 0 0 60 860 1860 860 5860 120 121 KRAAAA WWKAAA OOOOxx +9142 7355 0 2 2 2 42 142 1142 4142 9142 84 85 QNAAAA XWKAAA VVVVxx +6582 7356 0 2 2 2 82 582 582 1582 6582 164 165 ETAAAA YWKAAA AAAAxx +1255 7357 1 3 5 15 55 255 1255 1255 1255 110 111 HWAAAA ZWKAAA HHHHxx +6459 7358 1 3 9 19 59 459 459 1459 6459 118 119 LOAAAA AXKAAA OOOOxx +6327 7359 1 3 7 7 27 327 327 1327 6327 54 55 JJAAAA BXKAAA VVVVxx +4692 7360 0 0 2 12 92 692 692 4692 4692 184 185 MYAAAA CXKAAA AAAAxx +3772 7361 0 0 2 12 72 772 1772 3772 3772 144 145 CPAAAA DXKAAA HHHHxx +4203 7362 1 3 3 3 3 203 203 4203 4203 6 7 RFAAAA EXKAAA OOOOxx +2946 7363 0 2 6 6 46 946 946 2946 2946 92 93 IJAAAA FXKAAA VVVVxx +3524 7364 0 0 4 4 24 524 1524 3524 3524 48 49 OFAAAA GXKAAA AAAAxx +8409 7365 1 1 9 9 9 409 409 3409 8409 18 19 LLAAAA HXKAAA HHHHxx +1824 7366 0 0 4 4 24 824 1824 1824 1824 48 49 ESAAAA IXKAAA OOOOxx +4637 7367 1 1 7 17 37 637 637 4637 4637 74 75 JWAAAA JXKAAA VVVVxx +589 7368 1 1 9 9 89 589 589 589 589 178 179 RWAAAA KXKAAA AAAAxx +484 7369 0 0 4 4 84 484 484 484 484 168 169 QSAAAA LXKAAA HHHHxx +8963 7370 1 3 3 3 63 963 963 3963 8963 126 127 TGAAAA MXKAAA OOOOxx +5502 7371 0 2 2 2 2 502 1502 502 5502 4 5 QDAAAA NXKAAA VVVVxx +6982 7372 0 2 2 2 82 982 982 1982 6982 164 165 OIAAAA OXKAAA AAAAxx +8029 7373 1 1 9 9 29 29 29 3029 8029 58 59 VWAAAA PXKAAA HHHHxx +4395 7374 1 3 5 15 95 395 395 4395 4395 190 191 BNAAAA QXKAAA OOOOxx +2595 7375 1 3 5 15 95 595 595 2595 2595 190 191 VVAAAA RXKAAA VVVVxx +2133 7376 1 1 3 13 33 133 133 2133 2133 66 67 BEAAAA SXKAAA AAAAxx +1414 7377 0 2 4 14 14 414 1414 1414 1414 28 29 KCAAAA TXKAAA HHHHxx +8201 7378 1 1 1 1 1 201 201 3201 8201 2 3 LDAAAA UXKAAA OOOOxx +4706 7379 0 2 6 6 6 706 706 4706 4706 12 13 AZAAAA VXKAAA VVVVxx +5310 7380 0 2 0 10 10 310 1310 310 5310 20 21 GWAAAA WXKAAA AAAAxx +7333 7381 1 1 3 13 33 333 1333 2333 7333 66 67 BWAAAA XXKAAA HHHHxx +9420 7382 0 0 0 0 20 420 1420 4420 9420 40 41 IYAAAA YXKAAA OOOOxx +1383 7383 1 3 3 3 83 383 1383 1383 1383 166 167 FBAAAA ZXKAAA VVVVxx +6225 7384 1 1 5 5 25 225 225 1225 6225 50 51 LFAAAA AYKAAA AAAAxx +2064 7385 0 0 4 4 64 64 64 2064 2064 128 129 KBAAAA BYKAAA HHHHxx +6700 7386 0 0 0 0 0 700 700 1700 6700 0 1 SXAAAA CYKAAA OOOOxx +1352 7387 0 0 2 12 52 352 1352 1352 1352 104 105 AAAAAA DYKAAA VVVVxx +4249 7388 1 1 9 9 49 249 249 4249 4249 98 99 LHAAAA EYKAAA AAAAxx +9429 7389 1 1 9 9 29 429 1429 4429 9429 58 59 RYAAAA FYKAAA HHHHxx +8090 7390 0 2 0 10 90 90 90 3090 8090 180 181 EZAAAA GYKAAA OOOOxx +5378 7391 0 2 8 18 78 378 1378 378 5378 156 157 WYAAAA HYKAAA VVVVxx +9085 7392 1 1 5 5 85 85 1085 4085 9085 170 171 LLAAAA IYKAAA AAAAxx +7468 7393 0 0 8 8 68 468 1468 2468 7468 136 137 GBAAAA JYKAAA HHHHxx +9955 7394 1 3 5 15 55 955 1955 4955 9955 110 111 XSAAAA KYKAAA OOOOxx +8692 7395 0 0 2 12 92 692 692 3692 8692 184 185 IWAAAA LYKAAA VVVVxx +1463 7396 1 3 3 3 63 463 1463 1463 1463 126 127 HEAAAA MYKAAA AAAAxx +3577 7397 1 1 7 17 77 577 1577 3577 3577 154 155 PHAAAA NYKAAA HHHHxx +5654 7398 0 2 4 14 54 654 1654 654 5654 108 109 MJAAAA OYKAAA OOOOxx +7955 7399 1 3 5 15 55 955 1955 2955 7955 110 111 ZTAAAA PYKAAA VVVVxx +4843 7400 1 3 3 3 43 843 843 4843 4843 86 87 HEAAAA QYKAAA AAAAxx +1776 7401 0 0 6 16 76 776 1776 1776 1776 152 153 IQAAAA RYKAAA HHHHxx +2223 7402 1 3 3 3 23 223 223 2223 2223 46 47 NHAAAA SYKAAA OOOOxx +8442 7403 0 2 2 2 42 442 442 3442 8442 84 85 SMAAAA TYKAAA VVVVxx +9738 7404 0 2 8 18 38 738 1738 4738 9738 76 77 OKAAAA UYKAAA AAAAxx +4867 7405 1 3 7 7 67 867 867 4867 4867 134 135 FFAAAA VYKAAA HHHHxx +2983 7406 1 3 3 3 83 983 983 2983 2983 166 167 TKAAAA WYKAAA OOOOxx +3300 7407 0 0 0 0 0 300 1300 3300 3300 0 1 YWAAAA XYKAAA VVVVxx +3815 7408 1 3 5 15 15 815 1815 3815 3815 30 31 TQAAAA YYKAAA AAAAxx +1779 7409 1 3 9 19 79 779 1779 1779 1779 158 159 LQAAAA ZYKAAA HHHHxx +1123 7410 1 3 3 3 23 123 1123 1123 1123 46 47 FRAAAA AZKAAA OOOOxx +4824 7411 0 0 4 4 24 824 824 4824 4824 48 49 ODAAAA BZKAAA VVVVxx +5407 7412 1 3 7 7 7 407 1407 407 5407 14 15 ZZAAAA CZKAAA AAAAxx +5123 7413 1 3 3 3 23 123 1123 123 5123 46 47 BPAAAA DZKAAA HHHHxx +2515 7414 1 3 5 15 15 515 515 2515 2515 30 31 TSAAAA EZKAAA OOOOxx +4781 7415 1 1 1 1 81 781 781 4781 4781 162 163 XBAAAA FZKAAA VVVVxx +7831 7416 1 3 1 11 31 831 1831 2831 7831 62 63 FPAAAA GZKAAA AAAAxx +6946 7417 0 2 6 6 46 946 946 1946 6946 92 93 EHAAAA HZKAAA HHHHxx +1215 7418 1 3 5 15 15 215 1215 1215 1215 30 31 TUAAAA IZKAAA OOOOxx +7783 7419 1 3 3 3 83 783 1783 2783 7783 166 167 JNAAAA JZKAAA VVVVxx +4532 7420 0 0 2 12 32 532 532 4532 4532 64 65 ISAAAA KZKAAA AAAAxx +9068 7421 0 0 8 8 68 68 1068 4068 9068 136 137 UKAAAA LZKAAA HHHHxx +7030 7422 0 2 0 10 30 30 1030 2030 7030 60 61 KKAAAA MZKAAA OOOOxx +436 7423 0 0 6 16 36 436 436 436 436 72 73 UQAAAA NZKAAA VVVVxx +6549 7424 1 1 9 9 49 549 549 1549 6549 98 99 XRAAAA OZKAAA AAAAxx +3348 7425 0 0 8 8 48 348 1348 3348 3348 96 97 UYAAAA PZKAAA HHHHxx +6229 7426 1 1 9 9 29 229 229 1229 6229 58 59 PFAAAA QZKAAA OOOOxx +3933 7427 1 1 3 13 33 933 1933 3933 3933 66 67 HVAAAA RZKAAA VVVVxx +1876 7428 0 0 6 16 76 876 1876 1876 1876 152 153 EUAAAA SZKAAA AAAAxx +8920 7429 0 0 0 0 20 920 920 3920 8920 40 41 CFAAAA TZKAAA HHHHxx +7926 7430 0 2 6 6 26 926 1926 2926 7926 52 53 WSAAAA UZKAAA OOOOxx +8805 7431 1 1 5 5 5 805 805 3805 8805 10 11 RAAAAA VZKAAA VVVVxx +6729 7432 1 1 9 9 29 729 729 1729 6729 58 59 VYAAAA WZKAAA AAAAxx +7397 7433 1 1 7 17 97 397 1397 2397 7397 194 195 NYAAAA XZKAAA HHHHxx +9303 7434 1 3 3 3 3 303 1303 4303 9303 6 7 VTAAAA YZKAAA OOOOxx +4255 7435 1 3 5 15 55 255 255 4255 4255 110 111 RHAAAA ZZKAAA VVVVxx +7229 7436 1 1 9 9 29 229 1229 2229 7229 58 59 BSAAAA AALAAA AAAAxx +854 7437 0 2 4 14 54 854 854 854 854 108 109 WGAAAA BALAAA HHHHxx +6723 7438 1 3 3 3 23 723 723 1723 6723 46 47 PYAAAA CALAAA OOOOxx +9597 7439 1 1 7 17 97 597 1597 4597 9597 194 195 DFAAAA DALAAA VVVVxx +6532 7440 0 0 2 12 32 532 532 1532 6532 64 65 GRAAAA EALAAA AAAAxx +2910 7441 0 2 0 10 10 910 910 2910 2910 20 21 YHAAAA FALAAA HHHHxx +6717 7442 1 1 7 17 17 717 717 1717 6717 34 35 JYAAAA GALAAA OOOOxx +1790 7443 0 2 0 10 90 790 1790 1790 1790 180 181 WQAAAA HALAAA VVVVxx +3761 7444 1 1 1 1 61 761 1761 3761 3761 122 123 ROAAAA IALAAA AAAAxx +1565 7445 1 1 5 5 65 565 1565 1565 1565 130 131 FIAAAA JALAAA HHHHxx +6205 7446 1 1 5 5 5 205 205 1205 6205 10 11 REAAAA KALAAA OOOOxx +2726 7447 0 2 6 6 26 726 726 2726 2726 52 53 WAAAAA LALAAA VVVVxx +799 7448 1 3 9 19 99 799 799 799 799 198 199 TEAAAA MALAAA AAAAxx +3540 7449 0 0 0 0 40 540 1540 3540 3540 80 81 EGAAAA NALAAA HHHHxx +5878 7450 0 2 8 18 78 878 1878 878 5878 156 157 CSAAAA OALAAA OOOOxx +2542 7451 0 2 2 2 42 542 542 2542 2542 84 85 UTAAAA PALAAA VVVVxx +4888 7452 0 0 8 8 88 888 888 4888 4888 176 177 AGAAAA QALAAA AAAAxx +5290 7453 0 2 0 10 90 290 1290 290 5290 180 181 MVAAAA RALAAA HHHHxx +7995 7454 1 3 5 15 95 995 1995 2995 7995 190 191 NVAAAA SALAAA OOOOxx +3519 7455 1 3 9 19 19 519 1519 3519 3519 38 39 JFAAAA TALAAA VVVVxx +3571 7456 1 3 1 11 71 571 1571 3571 3571 142 143 JHAAAA UALAAA AAAAxx +7854 7457 0 2 4 14 54 854 1854 2854 7854 108 109 CQAAAA VALAAA HHHHxx +5184 7458 0 0 4 4 84 184 1184 184 5184 168 169 KRAAAA WALAAA OOOOxx +3498 7459 0 2 8 18 98 498 1498 3498 3498 196 197 OEAAAA XALAAA VVVVxx +1264 7460 0 0 4 4 64 264 1264 1264 1264 128 129 QWAAAA YALAAA AAAAxx +3159 7461 1 3 9 19 59 159 1159 3159 3159 118 119 NRAAAA ZALAAA HHHHxx +5480 7462 0 0 0 0 80 480 1480 480 5480 160 161 UCAAAA ABLAAA OOOOxx +1706 7463 0 2 6 6 6 706 1706 1706 1706 12 13 QNAAAA BBLAAA VVVVxx +4540 7464 0 0 0 0 40 540 540 4540 4540 80 81 QSAAAA CBLAAA AAAAxx +2799 7465 1 3 9 19 99 799 799 2799 2799 198 199 RDAAAA DBLAAA HHHHxx +7389 7466 1 1 9 9 89 389 1389 2389 7389 178 179 FYAAAA EBLAAA OOOOxx +5565 7467 1 1 5 5 65 565 1565 565 5565 130 131 BGAAAA FBLAAA VVVVxx +3896 7468 0 0 6 16 96 896 1896 3896 3896 192 193 WTAAAA GBLAAA AAAAxx +2100 7469 0 0 0 0 0 100 100 2100 2100 0 1 UCAAAA HBLAAA HHHHxx +3507 7470 1 3 7 7 7 507 1507 3507 3507 14 15 XEAAAA IBLAAA OOOOxx +7971 7471 1 3 1 11 71 971 1971 2971 7971 142 143 PUAAAA JBLAAA VVVVxx +2312 7472 0 0 2 12 12 312 312 2312 2312 24 25 YKAAAA KBLAAA AAAAxx +2494 7473 0 2 4 14 94 494 494 2494 2494 188 189 YRAAAA LBLAAA HHHHxx +2474 7474 0 2 4 14 74 474 474 2474 2474 148 149 ERAAAA MBLAAA OOOOxx +3136 7475 0 0 6 16 36 136 1136 3136 3136 72 73 QQAAAA NBLAAA VVVVxx +7242 7476 0 2 2 2 42 242 1242 2242 7242 84 85 OSAAAA OBLAAA AAAAxx +9430 7477 0 2 0 10 30 430 1430 4430 9430 60 61 SYAAAA PBLAAA HHHHxx +1052 7478 0 0 2 12 52 52 1052 1052 1052 104 105 MOAAAA QBLAAA OOOOxx +4172 7479 0 0 2 12 72 172 172 4172 4172 144 145 MEAAAA RBLAAA VVVVxx +970 7480 0 2 0 10 70 970 970 970 970 140 141 ILAAAA SBLAAA AAAAxx +882 7481 0 2 2 2 82 882 882 882 882 164 165 YHAAAA TBLAAA HHHHxx +9799 7482 1 3 9 19 99 799 1799 4799 9799 198 199 XMAAAA UBLAAA OOOOxx +5850 7483 0 2 0 10 50 850 1850 850 5850 100 101 ARAAAA VBLAAA VVVVxx +9473 7484 1 1 3 13 73 473 1473 4473 9473 146 147 JAAAAA WBLAAA AAAAxx +8635 7485 1 3 5 15 35 635 635 3635 8635 70 71 DUAAAA XBLAAA HHHHxx +2349 7486 1 1 9 9 49 349 349 2349 2349 98 99 JMAAAA YBLAAA OOOOxx +2270 7487 0 2 0 10 70 270 270 2270 2270 140 141 IJAAAA ZBLAAA VVVVxx +7887 7488 1 3 7 7 87 887 1887 2887 7887 174 175 JRAAAA ACLAAA AAAAxx +3091 7489 1 3 1 11 91 91 1091 3091 3091 182 183 XOAAAA BCLAAA HHHHxx +3728 7490 0 0 8 8 28 728 1728 3728 3728 56 57 KNAAAA CCLAAA OOOOxx +3658 7491 0 2 8 18 58 658 1658 3658 3658 116 117 SKAAAA DCLAAA VVVVxx +5975 7492 1 3 5 15 75 975 1975 975 5975 150 151 VVAAAA ECLAAA AAAAxx +332 7493 0 0 2 12 32 332 332 332 332 64 65 UMAAAA FCLAAA HHHHxx +7990 7494 0 2 0 10 90 990 1990 2990 7990 180 181 IVAAAA GCLAAA OOOOxx +8688 7495 0 0 8 8 88 688 688 3688 8688 176 177 EWAAAA HCLAAA VVVVxx +9601 7496 1 1 1 1 1 601 1601 4601 9601 2 3 HFAAAA ICLAAA AAAAxx +8401 7497 1 1 1 1 1 401 401 3401 8401 2 3 DLAAAA JCLAAA HHHHxx +8093 7498 1 1 3 13 93 93 93 3093 8093 186 187 HZAAAA KCLAAA OOOOxx +4278 7499 0 2 8 18 78 278 278 4278 4278 156 157 OIAAAA LCLAAA VVVVxx +5467 7500 1 3 7 7 67 467 1467 467 5467 134 135 HCAAAA MCLAAA AAAAxx +3137 7501 1 1 7 17 37 137 1137 3137 3137 74 75 RQAAAA NCLAAA HHHHxx +204 7502 0 0 4 4 4 204 204 204 204 8 9 WHAAAA OCLAAA OOOOxx +8224 7503 0 0 4 4 24 224 224 3224 8224 48 49 IEAAAA PCLAAA VVVVxx +2944 7504 0 0 4 4 44 944 944 2944 2944 88 89 GJAAAA QCLAAA AAAAxx +7593 7505 1 1 3 13 93 593 1593 2593 7593 186 187 BGAAAA RCLAAA HHHHxx +814 7506 0 2 4 14 14 814 814 814 814 28 29 IFAAAA SCLAAA OOOOxx +8047 7507 1 3 7 7 47 47 47 3047 8047 94 95 NXAAAA TCLAAA VVVVxx +7802 7508 0 2 2 2 2 802 1802 2802 7802 4 5 COAAAA UCLAAA AAAAxx +901 7509 1 1 1 1 1 901 901 901 901 2 3 RIAAAA VCLAAA HHHHxx +6168 7510 0 0 8 8 68 168 168 1168 6168 136 137 GDAAAA WCLAAA OOOOxx +2950 7511 0 2 0 10 50 950 950 2950 2950 100 101 MJAAAA XCLAAA VVVVxx +5393 7512 1 1 3 13 93 393 1393 393 5393 186 187 LZAAAA YCLAAA AAAAxx +3585 7513 1 1 5 5 85 585 1585 3585 3585 170 171 XHAAAA ZCLAAA HHHHxx +9392 7514 0 0 2 12 92 392 1392 4392 9392 184 185 GXAAAA ADLAAA OOOOxx +8314 7515 0 2 4 14 14 314 314 3314 8314 28 29 UHAAAA BDLAAA VVVVxx +9972 7516 0 0 2 12 72 972 1972 4972 9972 144 145 OTAAAA CDLAAA AAAAxx +9130 7517 0 2 0 10 30 130 1130 4130 9130 60 61 ENAAAA DDLAAA HHHHxx +975 7518 1 3 5 15 75 975 975 975 975 150 151 NLAAAA EDLAAA OOOOxx +5720 7519 0 0 0 0 20 720 1720 720 5720 40 41 AMAAAA FDLAAA VVVVxx +3769 7520 1 1 9 9 69 769 1769 3769 3769 138 139 ZOAAAA GDLAAA AAAAxx +5303 7521 1 3 3 3 3 303 1303 303 5303 6 7 ZVAAAA HDLAAA HHHHxx +6564 7522 0 0 4 4 64 564 564 1564 6564 128 129 MSAAAA IDLAAA OOOOxx +7855 7523 1 3 5 15 55 855 1855 2855 7855 110 111 DQAAAA JDLAAA VVVVxx +8153 7524 1 1 3 13 53 153 153 3153 8153 106 107 PBAAAA KDLAAA AAAAxx +2292 7525 0 0 2 12 92 292 292 2292 2292 184 185 EKAAAA LDLAAA HHHHxx +3156 7526 0 0 6 16 56 156 1156 3156 3156 112 113 KRAAAA MDLAAA OOOOxx +6580 7527 0 0 0 0 80 580 580 1580 6580 160 161 CTAAAA NDLAAA VVVVxx +5324 7528 0 0 4 4 24 324 1324 324 5324 48 49 UWAAAA ODLAAA AAAAxx +8871 7529 1 3 1 11 71 871 871 3871 8871 142 143 FDAAAA PDLAAA HHHHxx +2543 7530 1 3 3 3 43 543 543 2543 2543 86 87 VTAAAA QDLAAA OOOOxx +7857 7531 1 1 7 17 57 857 1857 2857 7857 114 115 FQAAAA RDLAAA VVVVxx +4084 7532 0 0 4 4 84 84 84 4084 4084 168 169 CBAAAA SDLAAA AAAAxx +9887 7533 1 3 7 7 87 887 1887 4887 9887 174 175 HQAAAA TDLAAA HHHHxx +6940 7534 0 0 0 0 40 940 940 1940 6940 80 81 YGAAAA UDLAAA OOOOxx +3415 7535 1 3 5 15 15 415 1415 3415 3415 30 31 JBAAAA VDLAAA VVVVxx +5012 7536 0 0 2 12 12 12 1012 12 5012 24 25 UKAAAA WDLAAA AAAAxx +3187 7537 1 3 7 7 87 187 1187 3187 3187 174 175 PSAAAA XDLAAA HHHHxx +8556 7538 0 0 6 16 56 556 556 3556 8556 112 113 CRAAAA YDLAAA OOOOxx +7966 7539 0 2 6 6 66 966 1966 2966 7966 132 133 KUAAAA ZDLAAA VVVVxx +7481 7540 1 1 1 1 81 481 1481 2481 7481 162 163 TBAAAA AELAAA AAAAxx +8524 7541 0 0 4 4 24 524 524 3524 8524 48 49 WPAAAA BELAAA HHHHxx +3021 7542 1 1 1 1 21 21 1021 3021 3021 42 43 FMAAAA CELAAA OOOOxx +6045 7543 1 1 5 5 45 45 45 1045 6045 90 91 NYAAAA DELAAA VVVVxx +8022 7544 0 2 2 2 22 22 22 3022 8022 44 45 OWAAAA EELAAA AAAAxx +3626 7545 0 2 6 6 26 626 1626 3626 3626 52 53 MJAAAA FELAAA HHHHxx +1030 7546 0 2 0 10 30 30 1030 1030 1030 60 61 QNAAAA GELAAA OOOOxx +8903 7547 1 3 3 3 3 903 903 3903 8903 6 7 LEAAAA HELAAA VVVVxx +7488 7548 0 0 8 8 88 488 1488 2488 7488 176 177 ACAAAA IELAAA AAAAxx +9293 7549 1 1 3 13 93 293 1293 4293 9293 186 187 LTAAAA JELAAA HHHHxx +4586 7550 0 2 6 6 86 586 586 4586 4586 172 173 KUAAAA KELAAA OOOOxx +9282 7551 0 2 2 2 82 282 1282 4282 9282 164 165 ATAAAA LELAAA VVVVxx +1948 7552 0 0 8 8 48 948 1948 1948 1948 96 97 YWAAAA MELAAA AAAAxx +2534 7553 0 2 4 14 34 534 534 2534 2534 68 69 MTAAAA NELAAA HHHHxx +1150 7554 0 2 0 10 50 150 1150 1150 1150 100 101 GSAAAA OELAAA OOOOxx +4931 7555 1 3 1 11 31 931 931 4931 4931 62 63 RHAAAA PELAAA VVVVxx +2866 7556 0 2 6 6 66 866 866 2866 2866 132 133 GGAAAA QELAAA AAAAxx +6172 7557 0 0 2 12 72 172 172 1172 6172 144 145 KDAAAA RELAAA HHHHxx +4819 7558 1 3 9 19 19 819 819 4819 4819 38 39 JDAAAA SELAAA OOOOxx +569 7559 1 1 9 9 69 569 569 569 569 138 139 XVAAAA TELAAA VVVVxx +1146 7560 0 2 6 6 46 146 1146 1146 1146 92 93 CSAAAA UELAAA AAAAxx +3062 7561 0 2 2 2 62 62 1062 3062 3062 124 125 UNAAAA VELAAA HHHHxx +7690 7562 0 2 0 10 90 690 1690 2690 7690 180 181 UJAAAA WELAAA OOOOxx +8611 7563 1 3 1 11 11 611 611 3611 8611 22 23 FTAAAA XELAAA VVVVxx +1142 7564 0 2 2 2 42 142 1142 1142 1142 84 85 YRAAAA YELAAA AAAAxx +1193 7565 1 1 3 13 93 193 1193 1193 1193 186 187 XTAAAA ZELAAA HHHHxx +2507 7566 1 3 7 7 7 507 507 2507 2507 14 15 LSAAAA AFLAAA OOOOxx +1043 7567 1 3 3 3 43 43 1043 1043 1043 86 87 DOAAAA BFLAAA VVVVxx +7472 7568 0 0 2 12 72 472 1472 2472 7472 144 145 KBAAAA CFLAAA AAAAxx +1817 7569 1 1 7 17 17 817 1817 1817 1817 34 35 XRAAAA DFLAAA HHHHxx +3868 7570 0 0 8 8 68 868 1868 3868 3868 136 137 USAAAA EFLAAA OOOOxx +9031 7571 1 3 1 11 31 31 1031 4031 9031 62 63 JJAAAA FFLAAA VVVVxx +7254 7572 0 2 4 14 54 254 1254 2254 7254 108 109 ATAAAA GFLAAA AAAAxx +5030 7573 0 2 0 10 30 30 1030 30 5030 60 61 MLAAAA HFLAAA HHHHxx +6594 7574 0 2 4 14 94 594 594 1594 6594 188 189 QTAAAA IFLAAA OOOOxx +6862 7575 0 2 2 2 62 862 862 1862 6862 124 125 YDAAAA JFLAAA VVVVxx +1994 7576 0 2 4 14 94 994 1994 1994 1994 188 189 SYAAAA KFLAAA AAAAxx +9017 7577 1 1 7 17 17 17 1017 4017 9017 34 35 VIAAAA LFLAAA HHHHxx +5716 7578 0 0 6 16 16 716 1716 716 5716 32 33 WLAAAA MFLAAA OOOOxx +1900 7579 0 0 0 0 0 900 1900 1900 1900 0 1 CVAAAA NFLAAA VVVVxx +120 7580 0 0 0 0 20 120 120 120 120 40 41 QEAAAA OFLAAA AAAAxx +9003 7581 1 3 3 3 3 3 1003 4003 9003 6 7 HIAAAA PFLAAA HHHHxx +4178 7582 0 2 8 18 78 178 178 4178 4178 156 157 SEAAAA QFLAAA OOOOxx +8777 7583 1 1 7 17 77 777 777 3777 8777 154 155 PZAAAA RFLAAA VVVVxx +3653 7584 1 1 3 13 53 653 1653 3653 3653 106 107 NKAAAA SFLAAA AAAAxx +1137 7585 1 1 7 17 37 137 1137 1137 1137 74 75 TRAAAA TFLAAA HHHHxx +6362 7586 0 2 2 2 62 362 362 1362 6362 124 125 SKAAAA UFLAAA OOOOxx +8537 7587 1 1 7 17 37 537 537 3537 8537 74 75 JQAAAA VFLAAA VVVVxx +1590 7588 0 2 0 10 90 590 1590 1590 1590 180 181 EJAAAA WFLAAA AAAAxx +374 7589 0 2 4 14 74 374 374 374 374 148 149 KOAAAA XFLAAA HHHHxx +2597 7590 1 1 7 17 97 597 597 2597 2597 194 195 XVAAAA YFLAAA OOOOxx +8071 7591 1 3 1 11 71 71 71 3071 8071 142 143 LYAAAA ZFLAAA VVVVxx +9009 7592 1 1 9 9 9 9 1009 4009 9009 18 19 NIAAAA AGLAAA AAAAxx +1978 7593 0 2 8 18 78 978 1978 1978 1978 156 157 CYAAAA BGLAAA HHHHxx +1541 7594 1 1 1 1 41 541 1541 1541 1541 82 83 HHAAAA CGLAAA OOOOxx +4998 7595 0 2 8 18 98 998 998 4998 4998 196 197 GKAAAA DGLAAA VVVVxx +1649 7596 1 1 9 9 49 649 1649 1649 1649 98 99 LLAAAA EGLAAA AAAAxx +5426 7597 0 2 6 6 26 426 1426 426 5426 52 53 SAAAAA FGLAAA HHHHxx +1492 7598 0 0 2 12 92 492 1492 1492 1492 184 185 KFAAAA GGLAAA OOOOxx +9622 7599 0 2 2 2 22 622 1622 4622 9622 44 45 CGAAAA HGLAAA VVVVxx +701 7600 1 1 1 1 1 701 701 701 701 2 3 ZAAAAA IGLAAA AAAAxx +2781 7601 1 1 1 1 81 781 781 2781 2781 162 163 ZCAAAA JGLAAA HHHHxx +3982 7602 0 2 2 2 82 982 1982 3982 3982 164 165 EXAAAA KGLAAA OOOOxx +7259 7603 1 3 9 19 59 259 1259 2259 7259 118 119 FTAAAA LGLAAA VVVVxx +9868 7604 0 0 8 8 68 868 1868 4868 9868 136 137 OPAAAA MGLAAA AAAAxx +564 7605 0 0 4 4 64 564 564 564 564 128 129 SVAAAA NGLAAA HHHHxx +6315 7606 1 3 5 15 15 315 315 1315 6315 30 31 XIAAAA OGLAAA OOOOxx +9092 7607 0 0 2 12 92 92 1092 4092 9092 184 185 SLAAAA PGLAAA VVVVxx +8237 7608 1 1 7 17 37 237 237 3237 8237 74 75 VEAAAA QGLAAA AAAAxx +1513 7609 1 1 3 13 13 513 1513 1513 1513 26 27 FGAAAA RGLAAA HHHHxx +1922 7610 0 2 2 2 22 922 1922 1922 1922 44 45 YVAAAA SGLAAA OOOOxx +5396 7611 0 0 6 16 96 396 1396 396 5396 192 193 OZAAAA TGLAAA VVVVxx +2485 7612 1 1 5 5 85 485 485 2485 2485 170 171 PRAAAA UGLAAA AAAAxx +5774 7613 0 2 4 14 74 774 1774 774 5774 148 149 COAAAA VGLAAA HHHHxx +3983 7614 1 3 3 3 83 983 1983 3983 3983 166 167 FXAAAA WGLAAA OOOOxx +221 7615 1 1 1 1 21 221 221 221 221 42 43 NIAAAA XGLAAA VVVVxx +8662 7616 0 2 2 2 62 662 662 3662 8662 124 125 EVAAAA YGLAAA AAAAxx +2456 7617 0 0 6 16 56 456 456 2456 2456 112 113 MQAAAA ZGLAAA HHHHxx +9736 7618 0 0 6 16 36 736 1736 4736 9736 72 73 MKAAAA AHLAAA OOOOxx +8936 7619 0 0 6 16 36 936 936 3936 8936 72 73 SFAAAA BHLAAA VVVVxx +5395 7620 1 3 5 15 95 395 1395 395 5395 190 191 NZAAAA CHLAAA AAAAxx +9523 7621 1 3 3 3 23 523 1523 4523 9523 46 47 HCAAAA DHLAAA HHHHxx +6980 7622 0 0 0 0 80 980 980 1980 6980 160 161 MIAAAA EHLAAA OOOOxx +2091 7623 1 3 1 11 91 91 91 2091 2091 182 183 LCAAAA FHLAAA VVVVxx +6807 7624 1 3 7 7 7 807 807 1807 6807 14 15 VBAAAA GHLAAA AAAAxx +8818 7625 0 2 8 18 18 818 818 3818 8818 36 37 EBAAAA HHLAAA HHHHxx +5298 7626 0 2 8 18 98 298 1298 298 5298 196 197 UVAAAA IHLAAA OOOOxx +1726 7627 0 2 6 6 26 726 1726 1726 1726 52 53 KOAAAA JHLAAA VVVVxx +3878 7628 0 2 8 18 78 878 1878 3878 3878 156 157 ETAAAA KHLAAA AAAAxx +8700 7629 0 0 0 0 0 700 700 3700 8700 0 1 QWAAAA LHLAAA HHHHxx +5201 7630 1 1 1 1 1 201 1201 201 5201 2 3 BSAAAA MHLAAA OOOOxx +3936 7631 0 0 6 16 36 936 1936 3936 3936 72 73 KVAAAA NHLAAA VVVVxx +776 7632 0 0 6 16 76 776 776 776 776 152 153 WDAAAA OHLAAA AAAAxx +5302 7633 0 2 2 2 2 302 1302 302 5302 4 5 YVAAAA PHLAAA HHHHxx +3595 7634 1 3 5 15 95 595 1595 3595 3595 190 191 HIAAAA QHLAAA OOOOxx +9061 7635 1 1 1 1 61 61 1061 4061 9061 122 123 NKAAAA RHLAAA VVVVxx +6261 7636 1 1 1 1 61 261 261 1261 6261 122 123 VGAAAA SHLAAA AAAAxx +8878 7637 0 2 8 18 78 878 878 3878 8878 156 157 MDAAAA THLAAA HHHHxx +3312 7638 0 0 2 12 12 312 1312 3312 3312 24 25 KXAAAA UHLAAA OOOOxx +9422 7639 0 2 2 2 22 422 1422 4422 9422 44 45 KYAAAA VHLAAA VVVVxx +7321 7640 1 1 1 1 21 321 1321 2321 7321 42 43 PVAAAA WHLAAA AAAAxx +3813 7641 1 1 3 13 13 813 1813 3813 3813 26 27 RQAAAA XHLAAA HHHHxx +5848 7642 0 0 8 8 48 848 1848 848 5848 96 97 YQAAAA YHLAAA OOOOxx +3535 7643 1 3 5 15 35 535 1535 3535 3535 70 71 ZFAAAA ZHLAAA VVVVxx +1040 7644 0 0 0 0 40 40 1040 1040 1040 80 81 AOAAAA AILAAA AAAAxx +8572 7645 0 0 2 12 72 572 572 3572 8572 144 145 SRAAAA BILAAA HHHHxx +5435 7646 1 3 5 15 35 435 1435 435 5435 70 71 BBAAAA CILAAA OOOOxx +8199 7647 1 3 9 19 99 199 199 3199 8199 198 199 JDAAAA DILAAA VVVVxx +8775 7648 1 3 5 15 75 775 775 3775 8775 150 151 NZAAAA EILAAA AAAAxx +7722 7649 0 2 2 2 22 722 1722 2722 7722 44 45 ALAAAA FILAAA HHHHxx +3549 7650 1 1 9 9 49 549 1549 3549 3549 98 99 NGAAAA GILAAA OOOOxx +2578 7651 0 2 8 18 78 578 578 2578 2578 156 157 EVAAAA HILAAA VVVVxx +1695 7652 1 3 5 15 95 695 1695 1695 1695 190 191 FNAAAA IILAAA AAAAxx +1902 7653 0 2 2 2 2 902 1902 1902 1902 4 5 EVAAAA JILAAA HHHHxx +6058 7654 0 2 8 18 58 58 58 1058 6058 116 117 AZAAAA KILAAA OOOOxx +6591 7655 1 3 1 11 91 591 591 1591 6591 182 183 NTAAAA LILAAA VVVVxx +7962 7656 0 2 2 2 62 962 1962 2962 7962 124 125 GUAAAA MILAAA AAAAxx +5612 7657 0 0 2 12 12 612 1612 612 5612 24 25 WHAAAA NILAAA HHHHxx +3341 7658 1 1 1 1 41 341 1341 3341 3341 82 83 NYAAAA OILAAA OOOOxx +5460 7659 0 0 0 0 60 460 1460 460 5460 120 121 ACAAAA PILAAA VVVVxx +2368 7660 0 0 8 8 68 368 368 2368 2368 136 137 CNAAAA QILAAA AAAAxx +8646 7661 0 2 6 6 46 646 646 3646 8646 92 93 OUAAAA RILAAA HHHHxx +4987 7662 1 3 7 7 87 987 987 4987 4987 174 175 VJAAAA SILAAA OOOOxx +9018 7663 0 2 8 18 18 18 1018 4018 9018 36 37 WIAAAA TILAAA VVVVxx +8685 7664 1 1 5 5 85 685 685 3685 8685 170 171 BWAAAA UILAAA AAAAxx +694 7665 0 2 4 14 94 694 694 694 694 188 189 SAAAAA VILAAA HHHHxx +2012 7666 0 0 2 12 12 12 12 2012 2012 24 25 KZAAAA WILAAA OOOOxx +2417 7667 1 1 7 17 17 417 417 2417 2417 34 35 ZOAAAA XILAAA VVVVxx +4022 7668 0 2 2 2 22 22 22 4022 4022 44 45 SYAAAA YILAAA AAAAxx +5935 7669 1 3 5 15 35 935 1935 935 5935 70 71 HUAAAA ZILAAA HHHHxx +1656 7670 0 0 6 16 56 656 1656 1656 1656 112 113 SLAAAA AJLAAA OOOOxx +6195 7671 1 3 5 15 95 195 195 1195 6195 190 191 HEAAAA BJLAAA VVVVxx +3057 7672 1 1 7 17 57 57 1057 3057 3057 114 115 PNAAAA CJLAAA AAAAxx +2852 7673 0 0 2 12 52 852 852 2852 2852 104 105 SFAAAA DJLAAA HHHHxx +4634 7674 0 2 4 14 34 634 634 4634 4634 68 69 GWAAAA EJLAAA OOOOxx +1689 7675 1 1 9 9 89 689 1689 1689 1689 178 179 ZMAAAA FJLAAA VVVVxx +4102 7676 0 2 2 2 2 102 102 4102 4102 4 5 UBAAAA GJLAAA AAAAxx +3287 7677 1 3 7 7 87 287 1287 3287 3287 174 175 LWAAAA HJLAAA HHHHxx +5246 7678 0 2 6 6 46 246 1246 246 5246 92 93 UTAAAA IJLAAA OOOOxx +7450 7679 0 2 0 10 50 450 1450 2450 7450 100 101 OAAAAA JJLAAA VVVVxx +6548 7680 0 0 8 8 48 548 548 1548 6548 96 97 WRAAAA KJLAAA AAAAxx +379 7681 1 3 9 19 79 379 379 379 379 158 159 POAAAA LJLAAA HHHHxx +7435 7682 1 3 5 15 35 435 1435 2435 7435 70 71 ZZAAAA MJLAAA OOOOxx +2041 7683 1 1 1 1 41 41 41 2041 2041 82 83 NAAAAA NJLAAA VVVVxx +8462 7684 0 2 2 2 62 462 462 3462 8462 124 125 MNAAAA OJLAAA AAAAxx +9076 7685 0 0 6 16 76 76 1076 4076 9076 152 153 CLAAAA PJLAAA HHHHxx +761 7686 1 1 1 1 61 761 761 761 761 122 123 HDAAAA QJLAAA OOOOxx +795 7687 1 3 5 15 95 795 795 795 795 190 191 PEAAAA RJLAAA VVVVxx +1671 7688 1 3 1 11 71 671 1671 1671 1671 142 143 HMAAAA SJLAAA AAAAxx +695 7689 1 3 5 15 95 695 695 695 695 190 191 TAAAAA TJLAAA HHHHxx +4981 7690 1 1 1 1 81 981 981 4981 4981 162 163 PJAAAA UJLAAA OOOOxx +1211 7691 1 3 1 11 11 211 1211 1211 1211 22 23 PUAAAA VJLAAA VVVVxx +5914 7692 0 2 4 14 14 914 1914 914 5914 28 29 MTAAAA WJLAAA AAAAxx +9356 7693 0 0 6 16 56 356 1356 4356 9356 112 113 WVAAAA XJLAAA HHHHxx +1500 7694 0 0 0 0 0 500 1500 1500 1500 0 1 SFAAAA YJLAAA OOOOxx +3353 7695 1 1 3 13 53 353 1353 3353 3353 106 107 ZYAAAA ZJLAAA VVVVxx +1060 7696 0 0 0 0 60 60 1060 1060 1060 120 121 UOAAAA AKLAAA AAAAxx +7910 7697 0 2 0 10 10 910 1910 2910 7910 20 21 GSAAAA BKLAAA HHHHxx +1329 7698 1 1 9 9 29 329 1329 1329 1329 58 59 DZAAAA CKLAAA OOOOxx +6011 7699 1 3 1 11 11 11 11 1011 6011 22 23 FXAAAA DKLAAA VVVVxx +7146 7700 0 2 6 6 46 146 1146 2146 7146 92 93 WOAAAA EKLAAA AAAAxx +4602 7701 0 2 2 2 2 602 602 4602 4602 4 5 AVAAAA FKLAAA HHHHxx +6751 7702 1 3 1 11 51 751 751 1751 6751 102 103 RZAAAA GKLAAA OOOOxx +2666 7703 0 2 6 6 66 666 666 2666 2666 132 133 OYAAAA HKLAAA VVVVxx +2785 7704 1 1 5 5 85 785 785 2785 2785 170 171 DDAAAA IKLAAA AAAAxx +5851 7705 1 3 1 11 51 851 1851 851 5851 102 103 BRAAAA JKLAAA HHHHxx +2435 7706 1 3 5 15 35 435 435 2435 2435 70 71 RPAAAA KKLAAA OOOOxx +7429 7707 1 1 9 9 29 429 1429 2429 7429 58 59 TZAAAA LKLAAA VVVVxx +4241 7708 1 1 1 1 41 241 241 4241 4241 82 83 DHAAAA MKLAAA AAAAxx +5691 7709 1 3 1 11 91 691 1691 691 5691 182 183 XKAAAA NKLAAA HHHHxx +7731 7710 1 3 1 11 31 731 1731 2731 7731 62 63 JLAAAA OKLAAA OOOOxx +249 7711 1 1 9 9 49 249 249 249 249 98 99 PJAAAA PKLAAA VVVVxx +1731 7712 1 3 1 11 31 731 1731 1731 1731 62 63 POAAAA QKLAAA AAAAxx +8716 7713 0 0 6 16 16 716 716 3716 8716 32 33 GXAAAA RKLAAA HHHHxx +2670 7714 0 2 0 10 70 670 670 2670 2670 140 141 SYAAAA SKLAAA OOOOxx +4654 7715 0 2 4 14 54 654 654 4654 4654 108 109 AXAAAA TKLAAA VVVVxx +1027 7716 1 3 7 7 27 27 1027 1027 1027 54 55 NNAAAA UKLAAA AAAAxx +1099 7717 1 3 9 19 99 99 1099 1099 1099 198 199 HQAAAA VKLAAA HHHHxx +3617 7718 1 1 7 17 17 617 1617 3617 3617 34 35 DJAAAA WKLAAA OOOOxx +4330 7719 0 2 0 10 30 330 330 4330 4330 60 61 OKAAAA XKLAAA VVVVxx +9750 7720 0 2 0 10 50 750 1750 4750 9750 100 101 ALAAAA YKLAAA AAAAxx +467 7721 1 3 7 7 67 467 467 467 467 134 135 ZRAAAA ZKLAAA HHHHxx +8525 7722 1 1 5 5 25 525 525 3525 8525 50 51 XPAAAA ALLAAA OOOOxx +5990 7723 0 2 0 10 90 990 1990 990 5990 180 181 KWAAAA BLLAAA VVVVxx +4839 7724 1 3 9 19 39 839 839 4839 4839 78 79 DEAAAA CLLAAA AAAAxx +9914 7725 0 2 4 14 14 914 1914 4914 9914 28 29 IRAAAA DLLAAA HHHHxx +7047 7726 1 3 7 7 47 47 1047 2047 7047 94 95 BLAAAA ELLAAA OOOOxx +874 7727 0 2 4 14 74 874 874 874 874 148 149 QHAAAA FLLAAA VVVVxx +6061 7728 1 1 1 1 61 61 61 1061 6061 122 123 DZAAAA GLLAAA AAAAxx +5491 7729 1 3 1 11 91 491 1491 491 5491 182 183 FDAAAA HLLAAA HHHHxx +4344 7730 0 0 4 4 44 344 344 4344 4344 88 89 CLAAAA ILLAAA OOOOxx +1281 7731 1 1 1 1 81 281 1281 1281 1281 162 163 HXAAAA JLLAAA VVVVxx +3597 7732 1 1 7 17 97 597 1597 3597 3597 194 195 JIAAAA KLLAAA AAAAxx +4992 7733 0 0 2 12 92 992 992 4992 4992 184 185 AKAAAA LLLAAA HHHHxx +3849 7734 1 1 9 9 49 849 1849 3849 3849 98 99 BSAAAA MLLAAA OOOOxx +2655 7735 1 3 5 15 55 655 655 2655 2655 110 111 DYAAAA NLLAAA VVVVxx +147 7736 1 3 7 7 47 147 147 147 147 94 95 RFAAAA OLLAAA AAAAxx +9110 7737 0 2 0 10 10 110 1110 4110 9110 20 21 KMAAAA PLLAAA HHHHxx +1637 7738 1 1 7 17 37 637 1637 1637 1637 74 75 ZKAAAA QLLAAA OOOOxx +9826 7739 0 2 6 6 26 826 1826 4826 9826 52 53 YNAAAA RLLAAA VVVVxx +5957 7740 1 1 7 17 57 957 1957 957 5957 114 115 DVAAAA SLLAAA AAAAxx +6932 7741 0 0 2 12 32 932 932 1932 6932 64 65 QGAAAA TLLAAA HHHHxx +9684 7742 0 0 4 4 84 684 1684 4684 9684 168 169 MIAAAA ULLAAA OOOOxx +4653 7743 1 1 3 13 53 653 653 4653 4653 106 107 ZWAAAA VLLAAA VVVVxx +8065 7744 1 1 5 5 65 65 65 3065 8065 130 131 FYAAAA WLLAAA AAAAxx +1202 7745 0 2 2 2 2 202 1202 1202 1202 4 5 GUAAAA XLLAAA HHHHxx +9214 7746 0 2 4 14 14 214 1214 4214 9214 28 29 KQAAAA YLLAAA OOOOxx +196 7747 0 0 6 16 96 196 196 196 196 192 193 OHAAAA ZLLAAA VVVVxx +4486 7748 0 2 6 6 86 486 486 4486 4486 172 173 OQAAAA AMLAAA AAAAxx +2585 7749 1 1 5 5 85 585 585 2585 2585 170 171 LVAAAA BMLAAA HHHHxx +2464 7750 0 0 4 4 64 464 464 2464 2464 128 129 UQAAAA CMLAAA OOOOxx +3467 7751 1 3 7 7 67 467 1467 3467 3467 134 135 JDAAAA DMLAAA VVVVxx +9295 7752 1 3 5 15 95 295 1295 4295 9295 190 191 NTAAAA EMLAAA AAAAxx +517 7753 1 1 7 17 17 517 517 517 517 34 35 XTAAAA FMLAAA HHHHxx +6870 7754 0 2 0 10 70 870 870 1870 6870 140 141 GEAAAA GMLAAA OOOOxx +5732 7755 0 0 2 12 32 732 1732 732 5732 64 65 MMAAAA HMLAAA VVVVxx +9376 7756 0 0 6 16 76 376 1376 4376 9376 152 153 QWAAAA IMLAAA AAAAxx +838 7757 0 2 8 18 38 838 838 838 838 76 77 GGAAAA JMLAAA HHHHxx +9254 7758 0 2 4 14 54 254 1254 4254 9254 108 109 YRAAAA KMLAAA OOOOxx +8879 7759 1 3 9 19 79 879 879 3879 8879 158 159 NDAAAA LMLAAA VVVVxx +6281 7760 1 1 1 1 81 281 281 1281 6281 162 163 PHAAAA MMLAAA AAAAxx +8216 7761 0 0 6 16 16 216 216 3216 8216 32 33 AEAAAA NMLAAA HHHHxx +9213 7762 1 1 3 13 13 213 1213 4213 9213 26 27 JQAAAA OMLAAA OOOOxx +7234 7763 0 2 4 14 34 234 1234 2234 7234 68 69 GSAAAA PMLAAA VVVVxx +5692 7764 0 0 2 12 92 692 1692 692 5692 184 185 YKAAAA QMLAAA AAAAxx +693 7765 1 1 3 13 93 693 693 693 693 186 187 RAAAAA RMLAAA HHHHxx +9050 7766 0 2 0 10 50 50 1050 4050 9050 100 101 CKAAAA SMLAAA OOOOxx +3623 7767 1 3 3 3 23 623 1623 3623 3623 46 47 JJAAAA TMLAAA VVVVxx +2130 7768 0 2 0 10 30 130 130 2130 2130 60 61 YDAAAA UMLAAA AAAAxx +2514 7769 0 2 4 14 14 514 514 2514 2514 28 29 SSAAAA VMLAAA HHHHxx +1812 7770 0 0 2 12 12 812 1812 1812 1812 24 25 SRAAAA WMLAAA OOOOxx +9037 7771 1 1 7 17 37 37 1037 4037 9037 74 75 PJAAAA XMLAAA VVVVxx +5054 7772 0 2 4 14 54 54 1054 54 5054 108 109 KMAAAA YMLAAA AAAAxx +7801 7773 1 1 1 1 1 801 1801 2801 7801 2 3 BOAAAA ZMLAAA HHHHxx +7939 7774 1 3 9 19 39 939 1939 2939 7939 78 79 JTAAAA ANLAAA OOOOxx +7374 7775 0 2 4 14 74 374 1374 2374 7374 148 149 QXAAAA BNLAAA VVVVxx +1058 7776 0 2 8 18 58 58 1058 1058 1058 116 117 SOAAAA CNLAAA AAAAxx +1972 7777 0 0 2 12 72 972 1972 1972 1972 144 145 WXAAAA DNLAAA HHHHxx +3741 7778 1 1 1 1 41 741 1741 3741 3741 82 83 XNAAAA ENLAAA OOOOxx +2227 7779 1 3 7 7 27 227 227 2227 2227 54 55 RHAAAA FNLAAA VVVVxx +304 7780 0 0 4 4 4 304 304 304 304 8 9 SLAAAA GNLAAA AAAAxx +4914 7781 0 2 4 14 14 914 914 4914 4914 28 29 AHAAAA HNLAAA HHHHxx +2428 7782 0 0 8 8 28 428 428 2428 2428 56 57 KPAAAA INLAAA OOOOxx +6660 7783 0 0 0 0 60 660 660 1660 6660 120 121 EWAAAA JNLAAA VVVVxx +2676 7784 0 0 6 16 76 676 676 2676 2676 152 153 YYAAAA KNLAAA AAAAxx +2454 7785 0 2 4 14 54 454 454 2454 2454 108 109 KQAAAA LNLAAA HHHHxx +3798 7786 0 2 8 18 98 798 1798 3798 3798 196 197 CQAAAA MNLAAA OOOOxx +1341 7787 1 1 1 1 41 341 1341 1341 1341 82 83 PZAAAA NNLAAA VVVVxx +1611 7788 1 3 1 11 11 611 1611 1611 1611 22 23 ZJAAAA ONLAAA AAAAxx +2681 7789 1 1 1 1 81 681 681 2681 2681 162 163 DZAAAA PNLAAA HHHHxx +7292 7790 0 0 2 12 92 292 1292 2292 7292 184 185 MUAAAA QNLAAA OOOOxx +7775 7791 1 3 5 15 75 775 1775 2775 7775 150 151 BNAAAA RNLAAA VVVVxx +794 7792 0 2 4 14 94 794 794 794 794 188 189 OEAAAA SNLAAA AAAAxx +8709 7793 1 1 9 9 9 709 709 3709 8709 18 19 ZWAAAA TNLAAA HHHHxx +1901 7794 1 1 1 1 1 901 1901 1901 1901 2 3 DVAAAA UNLAAA OOOOxx +3089 7795 1 1 9 9 89 89 1089 3089 3089 178 179 VOAAAA VNLAAA VVVVxx +7797 7796 1 1 7 17 97 797 1797 2797 7797 194 195 XNAAAA WNLAAA AAAAxx +6070 7797 0 2 0 10 70 70 70 1070 6070 140 141 MZAAAA XNLAAA HHHHxx +2191 7798 1 3 1 11 91 191 191 2191 2191 182 183 HGAAAA YNLAAA OOOOxx +3497 7799 1 1 7 17 97 497 1497 3497 3497 194 195 NEAAAA ZNLAAA VVVVxx +8302 7800 0 2 2 2 2 302 302 3302 8302 4 5 IHAAAA AOLAAA AAAAxx +4365 7801 1 1 5 5 65 365 365 4365 4365 130 131 XLAAAA BOLAAA HHHHxx +3588 7802 0 0 8 8 88 588 1588 3588 3588 176 177 AIAAAA COLAAA OOOOxx +8292 7803 0 0 2 12 92 292 292 3292 8292 184 185 YGAAAA DOLAAA VVVVxx +4696 7804 0 0 6 16 96 696 696 4696 4696 192 193 QYAAAA EOLAAA AAAAxx +5641 7805 1 1 1 1 41 641 1641 641 5641 82 83 ZIAAAA FOLAAA HHHHxx +9386 7806 0 2 6 6 86 386 1386 4386 9386 172 173 AXAAAA GOLAAA OOOOxx +507 7807 1 3 7 7 7 507 507 507 507 14 15 NTAAAA HOLAAA VVVVxx +7201 7808 1 1 1 1 1 201 1201 2201 7201 2 3 ZQAAAA IOLAAA AAAAxx +7785 7809 1 1 5 5 85 785 1785 2785 7785 170 171 LNAAAA JOLAAA HHHHxx +463 7810 1 3 3 3 63 463 463 463 463 126 127 VRAAAA KOLAAA OOOOxx +6656 7811 0 0 6 16 56 656 656 1656 6656 112 113 AWAAAA LOLAAA VVVVxx +807 7812 1 3 7 7 7 807 807 807 807 14 15 BFAAAA MOLAAA AAAAxx +7278 7813 0 2 8 18 78 278 1278 2278 7278 156 157 YTAAAA NOLAAA HHHHxx +6237 7814 1 1 7 17 37 237 237 1237 6237 74 75 XFAAAA OOLAAA OOOOxx +7671 7815 1 3 1 11 71 671 1671 2671 7671 142 143 BJAAAA POLAAA VVVVxx +2235 7816 1 3 5 15 35 235 235 2235 2235 70 71 ZHAAAA QOLAAA AAAAxx +4042 7817 0 2 2 2 42 42 42 4042 4042 84 85 MZAAAA ROLAAA HHHHxx +5273 7818 1 1 3 13 73 273 1273 273 5273 146 147 VUAAAA SOLAAA OOOOxx +7557 7819 1 1 7 17 57 557 1557 2557 7557 114 115 REAAAA TOLAAA VVVVxx +4007 7820 1 3 7 7 7 7 7 4007 4007 14 15 DYAAAA UOLAAA AAAAxx +1428 7821 0 0 8 8 28 428 1428 1428 1428 56 57 YCAAAA VOLAAA HHHHxx +9739 7822 1 3 9 19 39 739 1739 4739 9739 78 79 PKAAAA WOLAAA OOOOxx +7836 7823 0 0 6 16 36 836 1836 2836 7836 72 73 KPAAAA XOLAAA VVVVxx +1777 7824 1 1 7 17 77 777 1777 1777 1777 154 155 JQAAAA YOLAAA AAAAxx +5192 7825 0 0 2 12 92 192 1192 192 5192 184 185 SRAAAA ZOLAAA HHHHxx +7236 7826 0 0 6 16 36 236 1236 2236 7236 72 73 ISAAAA APLAAA OOOOxx +1623 7827 1 3 3 3 23 623 1623 1623 1623 46 47 LKAAAA BPLAAA VVVVxx +8288 7828 0 0 8 8 88 288 288 3288 8288 176 177 UGAAAA CPLAAA AAAAxx +2827 7829 1 3 7 7 27 827 827 2827 2827 54 55 TEAAAA DPLAAA HHHHxx +458 7830 0 2 8 18 58 458 458 458 458 116 117 QRAAAA EPLAAA OOOOxx +1818 7831 0 2 8 18 18 818 1818 1818 1818 36 37 YRAAAA FPLAAA VVVVxx +6837 7832 1 1 7 17 37 837 837 1837 6837 74 75 ZCAAAA GPLAAA AAAAxx +7825 7833 1 1 5 5 25 825 1825 2825 7825 50 51 ZOAAAA HPLAAA HHHHxx +9146 7834 0 2 6 6 46 146 1146 4146 9146 92 93 UNAAAA IPLAAA OOOOxx +8451 7835 1 3 1 11 51 451 451 3451 8451 102 103 BNAAAA JPLAAA VVVVxx +6438 7836 0 2 8 18 38 438 438 1438 6438 76 77 QNAAAA KPLAAA AAAAxx +4020 7837 0 0 0 0 20 20 20 4020 4020 40 41 QYAAAA LPLAAA HHHHxx +4068 7838 0 0 8 8 68 68 68 4068 4068 136 137 MAAAAA MPLAAA OOOOxx +2411 7839 1 3 1 11 11 411 411 2411 2411 22 23 TOAAAA NPLAAA VVVVxx +6222 7840 0 2 2 2 22 222 222 1222 6222 44 45 IFAAAA OPLAAA AAAAxx +3164 7841 0 0 4 4 64 164 1164 3164 3164 128 129 SRAAAA PPLAAA HHHHxx +311 7842 1 3 1 11 11 311 311 311 311 22 23 ZLAAAA QPLAAA OOOOxx +5683 7843 1 3 3 3 83 683 1683 683 5683 166 167 PKAAAA RPLAAA VVVVxx +3993 7844 1 1 3 13 93 993 1993 3993 3993 186 187 PXAAAA SPLAAA AAAAxx +9897 7845 1 1 7 17 97 897 1897 4897 9897 194 195 RQAAAA TPLAAA HHHHxx +6609 7846 1 1 9 9 9 609 609 1609 6609 18 19 FUAAAA UPLAAA OOOOxx +1362 7847 0 2 2 2 62 362 1362 1362 1362 124 125 KAAAAA VPLAAA VVVVxx +3918 7848 0 2 8 18 18 918 1918 3918 3918 36 37 SUAAAA WPLAAA AAAAxx +7376 7849 0 0 6 16 76 376 1376 2376 7376 152 153 SXAAAA XPLAAA HHHHxx +6996 7850 0 0 6 16 96 996 996 1996 6996 192 193 CJAAAA YPLAAA OOOOxx +9567 7851 1 3 7 7 67 567 1567 4567 9567 134 135 ZDAAAA ZPLAAA VVVVxx +7525 7852 1 1 5 5 25 525 1525 2525 7525 50 51 LDAAAA AQLAAA AAAAxx +9069 7853 1 1 9 9 69 69 1069 4069 9069 138 139 VKAAAA BQLAAA HHHHxx +9999 7854 1 3 9 19 99 999 1999 4999 9999 198 199 PUAAAA CQLAAA OOOOxx +9237 7855 1 1 7 17 37 237 1237 4237 9237 74 75 HRAAAA DQLAAA VVVVxx +8441 7856 1 1 1 1 41 441 441 3441 8441 82 83 RMAAAA EQLAAA AAAAxx +6769 7857 1 1 9 9 69 769 769 1769 6769 138 139 JAAAAA FQLAAA HHHHxx +6073 7858 1 1 3 13 73 73 73 1073 6073 146 147 PZAAAA GQLAAA OOOOxx +1091 7859 1 3 1 11 91 91 1091 1091 1091 182 183 ZPAAAA HQLAAA VVVVxx +9886 7860 0 2 6 6 86 886 1886 4886 9886 172 173 GQAAAA IQLAAA AAAAxx +3971 7861 1 3 1 11 71 971 1971 3971 3971 142 143 TWAAAA JQLAAA HHHHxx +4621 7862 1 1 1 1 21 621 621 4621 4621 42 43 TVAAAA KQLAAA OOOOxx +3120 7863 0 0 0 0 20 120 1120 3120 3120 40 41 AQAAAA LQLAAA VVVVxx +9773 7864 1 1 3 13 73 773 1773 4773 9773 146 147 XLAAAA MQLAAA AAAAxx +8712 7865 0 0 2 12 12 712 712 3712 8712 24 25 CXAAAA NQLAAA HHHHxx +801 7866 1 1 1 1 1 801 801 801 801 2 3 VEAAAA OQLAAA OOOOxx +9478 7867 0 2 8 18 78 478 1478 4478 9478 156 157 OAAAAA PQLAAA VVVVxx +3466 7868 0 2 6 6 66 466 1466 3466 3466 132 133 IDAAAA QQLAAA AAAAxx +6326 7869 0 2 6 6 26 326 326 1326 6326 52 53 IJAAAA RQLAAA HHHHxx +1723 7870 1 3 3 3 23 723 1723 1723 1723 46 47 HOAAAA SQLAAA OOOOxx +4978 7871 0 2 8 18 78 978 978 4978 4978 156 157 MJAAAA TQLAAA VVVVxx +2311 7872 1 3 1 11 11 311 311 2311 2311 22 23 XKAAAA UQLAAA AAAAxx +9532 7873 0 0 2 12 32 532 1532 4532 9532 64 65 QCAAAA VQLAAA HHHHxx +3680 7874 0 0 0 0 80 680 1680 3680 3680 160 161 OLAAAA WQLAAA OOOOxx +1244 7875 0 0 4 4 44 244 1244 1244 1244 88 89 WVAAAA XQLAAA VVVVxx +3821 7876 1 1 1 1 21 821 1821 3821 3821 42 43 ZQAAAA YQLAAA AAAAxx +9586 7877 0 2 6 6 86 586 1586 4586 9586 172 173 SEAAAA ZQLAAA HHHHxx +3894 7878 0 2 4 14 94 894 1894 3894 3894 188 189 UTAAAA ARLAAA OOOOxx +6169 7879 1 1 9 9 69 169 169 1169 6169 138 139 HDAAAA BRLAAA VVVVxx +5919 7880 1 3 9 19 19 919 1919 919 5919 38 39 RTAAAA CRLAAA AAAAxx +4187 7881 1 3 7 7 87 187 187 4187 4187 174 175 BFAAAA DRLAAA HHHHxx +5477 7882 1 1 7 17 77 477 1477 477 5477 154 155 RCAAAA ERLAAA OOOOxx +2806 7883 0 2 6 6 6 806 806 2806 2806 12 13 YDAAAA FRLAAA VVVVxx +8158 7884 0 2 8 18 58 158 158 3158 8158 116 117 UBAAAA GRLAAA AAAAxx +7130 7885 0 2 0 10 30 130 1130 2130 7130 60 61 GOAAAA HRLAAA HHHHxx +7133 7886 1 1 3 13 33 133 1133 2133 7133 66 67 JOAAAA IRLAAA OOOOxx +6033 7887 1 1 3 13 33 33 33 1033 6033 66 67 BYAAAA JRLAAA VVVVxx +2415 7888 1 3 5 15 15 415 415 2415 2415 30 31 XOAAAA KRLAAA AAAAxx +8091 7889 1 3 1 11 91 91 91 3091 8091 182 183 FZAAAA LRLAAA HHHHxx +8347 7890 1 3 7 7 47 347 347 3347 8347 94 95 BJAAAA MRLAAA OOOOxx +7879 7891 1 3 9 19 79 879 1879 2879 7879 158 159 BRAAAA NRLAAA VVVVxx +9360 7892 0 0 0 0 60 360 1360 4360 9360 120 121 AWAAAA ORLAAA AAAAxx +3369 7893 1 1 9 9 69 369 1369 3369 3369 138 139 PZAAAA PRLAAA HHHHxx +8536 7894 0 0 6 16 36 536 536 3536 8536 72 73 IQAAAA QRLAAA OOOOxx +8628 7895 0 0 8 8 28 628 628 3628 8628 56 57 WTAAAA RRLAAA VVVVxx +1580 7896 0 0 0 0 80 580 1580 1580 1580 160 161 UIAAAA SRLAAA AAAAxx +705 7897 1 1 5 5 5 705 705 705 705 10 11 DBAAAA TRLAAA HHHHxx +4650 7898 0 2 0 10 50 650 650 4650 4650 100 101 WWAAAA URLAAA OOOOxx +9165 7899 1 1 5 5 65 165 1165 4165 9165 130 131 NOAAAA VRLAAA VVVVxx +4820 7900 0 0 0 0 20 820 820 4820 4820 40 41 KDAAAA WRLAAA AAAAxx +3538 7901 0 2 8 18 38 538 1538 3538 3538 76 77 CGAAAA XRLAAA HHHHxx +9947 7902 1 3 7 7 47 947 1947 4947 9947 94 95 PSAAAA YRLAAA OOOOxx +4954 7903 0 2 4 14 54 954 954 4954 4954 108 109 OIAAAA ZRLAAA VVVVxx +1104 7904 0 0 4 4 4 104 1104 1104 1104 8 9 MQAAAA ASLAAA AAAAxx +8455 7905 1 3 5 15 55 455 455 3455 8455 110 111 FNAAAA BSLAAA HHHHxx +8307 7906 1 3 7 7 7 307 307 3307 8307 14 15 NHAAAA CSLAAA OOOOxx +9203 7907 1 3 3 3 3 203 1203 4203 9203 6 7 ZPAAAA DSLAAA VVVVxx +7565 7908 1 1 5 5 65 565 1565 2565 7565 130 131 ZEAAAA ESLAAA AAAAxx +7745 7909 1 1 5 5 45 745 1745 2745 7745 90 91 XLAAAA FSLAAA HHHHxx +1787 7910 1 3 7 7 87 787 1787 1787 1787 174 175 TQAAAA GSLAAA OOOOxx +4861 7911 1 1 1 1 61 861 861 4861 4861 122 123 ZEAAAA HSLAAA VVVVxx +5183 7912 1 3 3 3 83 183 1183 183 5183 166 167 JRAAAA ISLAAA AAAAxx +529 7913 1 1 9 9 29 529 529 529 529 58 59 JUAAAA JSLAAA HHHHxx +2470 7914 0 2 0 10 70 470 470 2470 2470 140 141 ARAAAA KSLAAA OOOOxx +1267 7915 1 3 7 7 67 267 1267 1267 1267 134 135 TWAAAA LSLAAA VVVVxx +2059 7916 1 3 9 19 59 59 59 2059 2059 118 119 FBAAAA MSLAAA AAAAxx +1862 7917 0 2 2 2 62 862 1862 1862 1862 124 125 QTAAAA NSLAAA HHHHxx +7382 7918 0 2 2 2 82 382 1382 2382 7382 164 165 YXAAAA OSLAAA OOOOxx +4796 7919 0 0 6 16 96 796 796 4796 4796 192 193 MCAAAA PSLAAA VVVVxx +2331 7920 1 3 1 11 31 331 331 2331 2331 62 63 RLAAAA QSLAAA AAAAxx +8870 7921 0 2 0 10 70 870 870 3870 8870 140 141 EDAAAA RSLAAA HHHHxx +9581 7922 1 1 1 1 81 581 1581 4581 9581 162 163 NEAAAA SSLAAA OOOOxx +9063 7923 1 3 3 3 63 63 1063 4063 9063 126 127 PKAAAA TSLAAA VVVVxx +2192 7924 0 0 2 12 92 192 192 2192 2192 184 185 IGAAAA USLAAA AAAAxx +6466 7925 0 2 6 6 66 466 466 1466 6466 132 133 SOAAAA VSLAAA HHHHxx +7096 7926 0 0 6 16 96 96 1096 2096 7096 192 193 YMAAAA WSLAAA OOOOxx +6257 7927 1 1 7 17 57 257 257 1257 6257 114 115 RGAAAA XSLAAA VVVVxx +7009 7928 1 1 9 9 9 9 1009 2009 7009 18 19 PJAAAA YSLAAA AAAAxx +8136 7929 0 0 6 16 36 136 136 3136 8136 72 73 YAAAAA ZSLAAA HHHHxx +1854 7930 0 2 4 14 54 854 1854 1854 1854 108 109 ITAAAA ATLAAA OOOOxx +3644 7931 0 0 4 4 44 644 1644 3644 3644 88 89 EKAAAA BTLAAA VVVVxx +4437 7932 1 1 7 17 37 437 437 4437 4437 74 75 ROAAAA CTLAAA AAAAxx +7209 7933 1 1 9 9 9 209 1209 2209 7209 18 19 HRAAAA DTLAAA HHHHxx +1516 7934 0 0 6 16 16 516 1516 1516 1516 32 33 IGAAAA ETLAAA OOOOxx +822 7935 0 2 2 2 22 822 822 822 822 44 45 QFAAAA FTLAAA VVVVxx +1778 7936 0 2 8 18 78 778 1778 1778 1778 156 157 KQAAAA GTLAAA AAAAxx +8161 7937 1 1 1 1 61 161 161 3161 8161 122 123 XBAAAA HTLAAA HHHHxx +6030 7938 0 2 0 10 30 30 30 1030 6030 60 61 YXAAAA ITLAAA OOOOxx +3515 7939 1 3 5 15 15 515 1515 3515 3515 30 31 FFAAAA JTLAAA VVVVxx +1702 7940 0 2 2 2 2 702 1702 1702 1702 4 5 MNAAAA KTLAAA AAAAxx +2671 7941 1 3 1 11 71 671 671 2671 2671 142 143 TYAAAA LTLAAA HHHHxx +7623 7942 1 3 3 3 23 623 1623 2623 7623 46 47 FHAAAA MTLAAA OOOOxx +9828 7943 0 0 8 8 28 828 1828 4828 9828 56 57 AOAAAA NTLAAA VVVVxx +1888 7944 0 0 8 8 88 888 1888 1888 1888 176 177 QUAAAA OTLAAA AAAAxx +4520 7945 0 0 0 0 20 520 520 4520 4520 40 41 WRAAAA PTLAAA HHHHxx +3461 7946 1 1 1 1 61 461 1461 3461 3461 122 123 DDAAAA QTLAAA OOOOxx +1488 7947 0 0 8 8 88 488 1488 1488 1488 176 177 GFAAAA RTLAAA VVVVxx +7753 7948 1 1 3 13 53 753 1753 2753 7753 106 107 FMAAAA STLAAA AAAAxx +5525 7949 1 1 5 5 25 525 1525 525 5525 50 51 NEAAAA TTLAAA HHHHxx +5220 7950 0 0 0 0 20 220 1220 220 5220 40 41 USAAAA UTLAAA OOOOxx +305 7951 1 1 5 5 5 305 305 305 305 10 11 TLAAAA VTLAAA VVVVxx +7883 7952 1 3 3 3 83 883 1883 2883 7883 166 167 FRAAAA WTLAAA AAAAxx +1222 7953 0 2 2 2 22 222 1222 1222 1222 44 45 AVAAAA XTLAAA HHHHxx +8552 7954 0 0 2 12 52 552 552 3552 8552 104 105 YQAAAA YTLAAA OOOOxx +6097 7955 1 1 7 17 97 97 97 1097 6097 194 195 NAAAAA ZTLAAA VVVVxx +2298 7956 0 2 8 18 98 298 298 2298 2298 196 197 KKAAAA AULAAA AAAAxx +956 7957 0 0 6 16 56 956 956 956 956 112 113 UKAAAA BULAAA HHHHxx +9351 7958 1 3 1 11 51 351 1351 4351 9351 102 103 RVAAAA CULAAA OOOOxx +6669 7959 1 1 9 9 69 669 669 1669 6669 138 139 NWAAAA DULAAA VVVVxx +9383 7960 1 3 3 3 83 383 1383 4383 9383 166 167 XWAAAA EULAAA AAAAxx +1607 7961 1 3 7 7 7 607 1607 1607 1607 14 15 VJAAAA FULAAA HHHHxx +812 7962 0 0 2 12 12 812 812 812 812 24 25 GFAAAA GULAAA OOOOxx +2109 7963 1 1 9 9 9 109 109 2109 2109 18 19 DDAAAA HULAAA VVVVxx +207 7964 1 3 7 7 7 207 207 207 207 14 15 ZHAAAA IULAAA AAAAxx +7124 7965 0 0 4 4 24 124 1124 2124 7124 48 49 AOAAAA JULAAA HHHHxx +9333 7966 1 1 3 13 33 333 1333 4333 9333 66 67 ZUAAAA KULAAA OOOOxx +3262 7967 0 2 2 2 62 262 1262 3262 3262 124 125 MVAAAA LULAAA VVVVxx +1070 7968 0 2 0 10 70 70 1070 1070 1070 140 141 EPAAAA MULAAA AAAAxx +7579 7969 1 3 9 19 79 579 1579 2579 7579 158 159 NFAAAA NULAAA HHHHxx +9283 7970 1 3 3 3 83 283 1283 4283 9283 166 167 BTAAAA OULAAA OOOOxx +4917 7971 1 1 7 17 17 917 917 4917 4917 34 35 DHAAAA PULAAA VVVVxx +1328 7972 0 0 8 8 28 328 1328 1328 1328 56 57 CZAAAA QULAAA AAAAxx +3042 7973 0 2 2 2 42 42 1042 3042 3042 84 85 ANAAAA RULAAA HHHHxx +8352 7974 0 0 2 12 52 352 352 3352 8352 104 105 GJAAAA SULAAA OOOOxx +2710 7975 0 2 0 10 10 710 710 2710 2710 20 21 GAAAAA TULAAA VVVVxx +3330 7976 0 2 0 10 30 330 1330 3330 3330 60 61 CYAAAA UULAAA AAAAxx +2822 7977 0 2 2 2 22 822 822 2822 2822 44 45 OEAAAA VULAAA HHHHxx +5627 7978 1 3 7 7 27 627 1627 627 5627 54 55 LIAAAA WULAAA OOOOxx +7848 7979 0 0 8 8 48 848 1848 2848 7848 96 97 WPAAAA XULAAA VVVVxx +7384 7980 0 0 4 4 84 384 1384 2384 7384 168 169 AYAAAA YULAAA AAAAxx +727 7981 1 3 7 7 27 727 727 727 727 54 55 ZBAAAA ZULAAA HHHHxx +9926 7982 0 2 6 6 26 926 1926 4926 9926 52 53 URAAAA AVLAAA OOOOxx +2647 7983 1 3 7 7 47 647 647 2647 2647 94 95 VXAAAA BVLAAA VVVVxx +6416 7984 0 0 6 16 16 416 416 1416 6416 32 33 UMAAAA CVLAAA AAAAxx +8751 7985 1 3 1 11 51 751 751 3751 8751 102 103 PYAAAA DVLAAA HHHHxx +6515 7986 1 3 5 15 15 515 515 1515 6515 30 31 PQAAAA EVLAAA OOOOxx +2472 7987 0 0 2 12 72 472 472 2472 2472 144 145 CRAAAA FVLAAA VVVVxx +7205 7988 1 1 5 5 5 205 1205 2205 7205 10 11 DRAAAA GVLAAA AAAAxx +9654 7989 0 2 4 14 54 654 1654 4654 9654 108 109 IHAAAA HVLAAA HHHHxx +5646 7990 0 2 6 6 46 646 1646 646 5646 92 93 EJAAAA IVLAAA OOOOxx +4217 7991 1 1 7 17 17 217 217 4217 4217 34 35 FGAAAA JVLAAA VVVVxx +4484 7992 0 0 4 4 84 484 484 4484 4484 168 169 MQAAAA KVLAAA AAAAxx +6654 7993 0 2 4 14 54 654 654 1654 6654 108 109 YVAAAA LVLAAA HHHHxx +4876 7994 0 0 6 16 76 876 876 4876 4876 152 153 OFAAAA MVLAAA OOOOxx +9690 7995 0 2 0 10 90 690 1690 4690 9690 180 181 SIAAAA NVLAAA VVVVxx +2453 7996 1 1 3 13 53 453 453 2453 2453 106 107 JQAAAA OVLAAA AAAAxx +829 7997 1 1 9 9 29 829 829 829 829 58 59 XFAAAA PVLAAA HHHHxx +2547 7998 1 3 7 7 47 547 547 2547 2547 94 95 ZTAAAA QVLAAA OOOOxx +9726 7999 0 2 6 6 26 726 1726 4726 9726 52 53 CKAAAA RVLAAA VVVVxx +9267 8000 1 3 7 7 67 267 1267 4267 9267 134 135 LSAAAA SVLAAA AAAAxx +7448 8001 0 0 8 8 48 448 1448 2448 7448 96 97 MAAAAA TVLAAA HHHHxx +610 8002 0 2 0 10 10 610 610 610 610 20 21 MXAAAA UVLAAA OOOOxx +2791 8003 1 3 1 11 91 791 791 2791 2791 182 183 JDAAAA VVLAAA VVVVxx +3651 8004 1 3 1 11 51 651 1651 3651 3651 102 103 LKAAAA WVLAAA AAAAxx +5206 8005 0 2 6 6 6 206 1206 206 5206 12 13 GSAAAA XVLAAA HHHHxx +8774 8006 0 2 4 14 74 774 774 3774 8774 148 149 MZAAAA YVLAAA OOOOxx +4753 8007 1 1 3 13 53 753 753 4753 4753 106 107 VAAAAA ZVLAAA VVVVxx +4755 8008 1 3 5 15 55 755 755 4755 4755 110 111 XAAAAA AWLAAA AAAAxx +686 8009 0 2 6 6 86 686 686 686 686 172 173 KAAAAA BWLAAA HHHHxx +8281 8010 1 1 1 1 81 281 281 3281 8281 162 163 NGAAAA CWLAAA OOOOxx +2058 8011 0 2 8 18 58 58 58 2058 2058 116 117 EBAAAA DWLAAA VVVVxx +8900 8012 0 0 0 0 0 900 900 3900 8900 0 1 IEAAAA EWLAAA AAAAxx +8588 8013 0 0 8 8 88 588 588 3588 8588 176 177 ISAAAA FWLAAA HHHHxx +2904 8014 0 0 4 4 4 904 904 2904 2904 8 9 SHAAAA GWLAAA OOOOxx +8917 8015 1 1 7 17 17 917 917 3917 8917 34 35 ZEAAAA HWLAAA VVVVxx +9026 8016 0 2 6 6 26 26 1026 4026 9026 52 53 EJAAAA IWLAAA AAAAxx +2416 8017 0 0 6 16 16 416 416 2416 2416 32 33 YOAAAA JWLAAA HHHHxx +1053 8018 1 1 3 13 53 53 1053 1053 1053 106 107 NOAAAA KWLAAA OOOOxx +7141 8019 1 1 1 1 41 141 1141 2141 7141 82 83 ROAAAA LWLAAA VVVVxx +9771 8020 1 3 1 11 71 771 1771 4771 9771 142 143 VLAAAA MWLAAA AAAAxx +2774 8021 0 2 4 14 74 774 774 2774 2774 148 149 SCAAAA NWLAAA HHHHxx +3213 8022 1 1 3 13 13 213 1213 3213 3213 26 27 PTAAAA OWLAAA OOOOxx +5694 8023 0 2 4 14 94 694 1694 694 5694 188 189 ALAAAA PWLAAA VVVVxx +6631 8024 1 3 1 11 31 631 631 1631 6631 62 63 BVAAAA QWLAAA AAAAxx +6638 8025 0 2 8 18 38 638 638 1638 6638 76 77 IVAAAA RWLAAA HHHHxx +7407 8026 1 3 7 7 7 407 1407 2407 7407 14 15 XYAAAA SWLAAA OOOOxx +8972 8027 0 0 2 12 72 972 972 3972 8972 144 145 CHAAAA TWLAAA VVVVxx +2202 8028 0 2 2 2 2 202 202 2202 2202 4 5 SGAAAA UWLAAA AAAAxx +6135 8029 1 3 5 15 35 135 135 1135 6135 70 71 ZBAAAA VWLAAA HHHHxx +5043 8030 1 3 3 3 43 43 1043 43 5043 86 87 ZLAAAA WWLAAA OOOOxx +5163 8031 1 3 3 3 63 163 1163 163 5163 126 127 PQAAAA XWLAAA VVVVxx +1191 8032 1 3 1 11 91 191 1191 1191 1191 182 183 VTAAAA YWLAAA AAAAxx +6576 8033 0 0 6 16 76 576 576 1576 6576 152 153 YSAAAA ZWLAAA HHHHxx +3455 8034 1 3 5 15 55 455 1455 3455 3455 110 111 XCAAAA AXLAAA OOOOxx +3688 8035 0 0 8 8 88 688 1688 3688 3688 176 177 WLAAAA BXLAAA VVVVxx +4982 8036 0 2 2 2 82 982 982 4982 4982 164 165 QJAAAA CXLAAA AAAAxx +4180 8037 0 0 0 0 80 180 180 4180 4180 160 161 UEAAAA DXLAAA HHHHxx +4708 8038 0 0 8 8 8 708 708 4708 4708 16 17 CZAAAA EXLAAA OOOOxx +1241 8039 1 1 1 1 41 241 1241 1241 1241 82 83 TVAAAA FXLAAA VVVVxx +4921 8040 1 1 1 1 21 921 921 4921 4921 42 43 HHAAAA GXLAAA AAAAxx +3197 8041 1 1 7 17 97 197 1197 3197 3197 194 195 ZSAAAA HXLAAA HHHHxx +8225 8042 1 1 5 5 25 225 225 3225 8225 50 51 JEAAAA IXLAAA OOOOxx +5913 8043 1 1 3 13 13 913 1913 913 5913 26 27 LTAAAA JXLAAA VVVVxx +6387 8044 1 3 7 7 87 387 387 1387 6387 174 175 RLAAAA KXLAAA AAAAxx +2706 8045 0 2 6 6 6 706 706 2706 2706 12 13 CAAAAA LXLAAA HHHHxx +1461 8046 1 1 1 1 61 461 1461 1461 1461 122 123 FEAAAA MXLAAA OOOOxx +7646 8047 0 2 6 6 46 646 1646 2646 7646 92 93 CIAAAA NXLAAA VVVVxx +8066 8048 0 2 6 6 66 66 66 3066 8066 132 133 GYAAAA OXLAAA AAAAxx +4171 8049 1 3 1 11 71 171 171 4171 4171 142 143 LEAAAA PXLAAA HHHHxx +8008 8050 0 0 8 8 8 8 8 3008 8008 16 17 AWAAAA QXLAAA OOOOxx +2088 8051 0 0 8 8 88 88 88 2088 2088 176 177 ICAAAA RXLAAA VVVVxx +7907 8052 1 3 7 7 7 907 1907 2907 7907 14 15 DSAAAA SXLAAA AAAAxx +2429 8053 1 1 9 9 29 429 429 2429 2429 58 59 LPAAAA TXLAAA HHHHxx +9629 8054 1 1 9 9 29 629 1629 4629 9629 58 59 JGAAAA UXLAAA OOOOxx +1470 8055 0 2 0 10 70 470 1470 1470 1470 140 141 OEAAAA VXLAAA VVVVxx +4346 8056 0 2 6 6 46 346 346 4346 4346 92 93 ELAAAA WXLAAA AAAAxx +7219 8057 1 3 9 19 19 219 1219 2219 7219 38 39 RRAAAA XXLAAA HHHHxx +1185 8058 1 1 5 5 85 185 1185 1185 1185 170 171 PTAAAA YXLAAA OOOOxx +8776 8059 0 0 6 16 76 776 776 3776 8776 152 153 OZAAAA ZXLAAA VVVVxx +684 8060 0 0 4 4 84 684 684 684 684 168 169 IAAAAA AYLAAA AAAAxx +2343 8061 1 3 3 3 43 343 343 2343 2343 86 87 DMAAAA BYLAAA HHHHxx +4470 8062 0 2 0 10 70 470 470 4470 4470 140 141 YPAAAA CYLAAA OOOOxx +5116 8063 0 0 6 16 16 116 1116 116 5116 32 33 UOAAAA DYLAAA VVVVxx +1746 8064 0 2 6 6 46 746 1746 1746 1746 92 93 EPAAAA EYLAAA AAAAxx +3216 8065 0 0 6 16 16 216 1216 3216 3216 32 33 STAAAA FYLAAA HHHHxx +4594 8066 0 2 4 14 94 594 594 4594 4594 188 189 SUAAAA GYLAAA OOOOxx +3013 8067 1 1 3 13 13 13 1013 3013 3013 26 27 XLAAAA HYLAAA VVVVxx +2307 8068 1 3 7 7 7 307 307 2307 2307 14 15 TKAAAA IYLAAA AAAAxx +7663 8069 1 3 3 3 63 663 1663 2663 7663 126 127 TIAAAA JYLAAA HHHHxx +8504 8070 0 0 4 4 4 504 504 3504 8504 8 9 CPAAAA KYLAAA OOOOxx +3683 8071 1 3 3 3 83 683 1683 3683 3683 166 167 RLAAAA LYLAAA VVVVxx +144 8072 0 0 4 4 44 144 144 144 144 88 89 OFAAAA MYLAAA AAAAxx +203 8073 1 3 3 3 3 203 203 203 203 6 7 VHAAAA NYLAAA HHHHxx +5255 8074 1 3 5 15 55 255 1255 255 5255 110 111 DUAAAA OYLAAA OOOOxx +4150 8075 0 2 0 10 50 150 150 4150 4150 100 101 QDAAAA PYLAAA VVVVxx +5701 8076 1 1 1 1 1 701 1701 701 5701 2 3 HLAAAA QYLAAA AAAAxx +7400 8077 0 0 0 0 0 400 1400 2400 7400 0 1 QYAAAA RYLAAA HHHHxx +8203 8078 1 3 3 3 3 203 203 3203 8203 6 7 NDAAAA SYLAAA OOOOxx +637 8079 1 1 7 17 37 637 637 637 637 74 75 NYAAAA TYLAAA VVVVxx +2898 8080 0 2 8 18 98 898 898 2898 2898 196 197 MHAAAA UYLAAA AAAAxx +1110 8081 0 2 0 10 10 110 1110 1110 1110 20 21 SQAAAA VYLAAA HHHHxx +6255 8082 1 3 5 15 55 255 255 1255 6255 110 111 PGAAAA WYLAAA OOOOxx +1071 8083 1 3 1 11 71 71 1071 1071 1071 142 143 FPAAAA XYLAAA VVVVxx +541 8084 1 1 1 1 41 541 541 541 541 82 83 VUAAAA YYLAAA AAAAxx +8077 8085 1 1 7 17 77 77 77 3077 8077 154 155 RYAAAA ZYLAAA HHHHxx +6809 8086 1 1 9 9 9 809 809 1809 6809 18 19 XBAAAA AZLAAA OOOOxx +4749 8087 1 1 9 9 49 749 749 4749 4749 98 99 RAAAAA BZLAAA VVVVxx +2886 8088 0 2 6 6 86 886 886 2886 2886 172 173 AHAAAA CZLAAA AAAAxx +5510 8089 0 2 0 10 10 510 1510 510 5510 20 21 YDAAAA DZLAAA HHHHxx +713 8090 1 1 3 13 13 713 713 713 713 26 27 LBAAAA EZLAAA OOOOxx +8388 8091 0 0 8 8 88 388 388 3388 8388 176 177 QKAAAA FZLAAA VVVVxx +9524 8092 0 0 4 4 24 524 1524 4524 9524 48 49 ICAAAA GZLAAA AAAAxx +9949 8093 1 1 9 9 49 949 1949 4949 9949 98 99 RSAAAA HZLAAA HHHHxx +885 8094 1 1 5 5 85 885 885 885 885 170 171 BIAAAA IZLAAA OOOOxx +8699 8095 1 3 9 19 99 699 699 3699 8699 198 199 PWAAAA JZLAAA VVVVxx +2232 8096 0 0 2 12 32 232 232 2232 2232 64 65 WHAAAA KZLAAA AAAAxx +5142 8097 0 2 2 2 42 142 1142 142 5142 84 85 UPAAAA LZLAAA HHHHxx +8891 8098 1 3 1 11 91 891 891 3891 8891 182 183 ZDAAAA MZLAAA OOOOxx +1881 8099 1 1 1 1 81 881 1881 1881 1881 162 163 JUAAAA NZLAAA VVVVxx +3751 8100 1 3 1 11 51 751 1751 3751 3751 102 103 HOAAAA OZLAAA AAAAxx +1896 8101 0 0 6 16 96 896 1896 1896 1896 192 193 YUAAAA PZLAAA HHHHxx +8258 8102 0 2 8 18 58 258 258 3258 8258 116 117 QFAAAA QZLAAA OOOOxx +3820 8103 0 0 0 0 20 820 1820 3820 3820 40 41 YQAAAA RZLAAA VVVVxx +6617 8104 1 1 7 17 17 617 617 1617 6617 34 35 NUAAAA SZLAAA AAAAxx +5100 8105 0 0 0 0 0 100 1100 100 5100 0 1 EOAAAA TZLAAA HHHHxx +4277 8106 1 1 7 17 77 277 277 4277 4277 154 155 NIAAAA UZLAAA OOOOxx +2498 8107 0 2 8 18 98 498 498 2498 2498 196 197 CSAAAA VZLAAA VVVVxx +4343 8108 1 3 3 3 43 343 343 4343 4343 86 87 BLAAAA WZLAAA AAAAxx +8319 8109 1 3 9 19 19 319 319 3319 8319 38 39 ZHAAAA XZLAAA HHHHxx +4803 8110 1 3 3 3 3 803 803 4803 4803 6 7 TCAAAA YZLAAA OOOOxx +3100 8111 0 0 0 0 0 100 1100 3100 3100 0 1 GPAAAA ZZLAAA VVVVxx +428 8112 0 0 8 8 28 428 428 428 428 56 57 MQAAAA AAMAAA AAAAxx +2811 8113 1 3 1 11 11 811 811 2811 2811 22 23 DEAAAA BAMAAA HHHHxx +2989 8114 1 1 9 9 89 989 989 2989 2989 178 179 ZKAAAA CAMAAA OOOOxx +1100 8115 0 0 0 0 0 100 1100 1100 1100 0 1 IQAAAA DAMAAA VVVVxx +6586 8116 0 2 6 6 86 586 586 1586 6586 172 173 ITAAAA EAMAAA AAAAxx +3124 8117 0 0 4 4 24 124 1124 3124 3124 48 49 EQAAAA FAMAAA HHHHxx +1635 8118 1 3 5 15 35 635 1635 1635 1635 70 71 XKAAAA GAMAAA OOOOxx +3888 8119 0 0 8 8 88 888 1888 3888 3888 176 177 OTAAAA HAMAAA VVVVxx +8369 8120 1 1 9 9 69 369 369 3369 8369 138 139 XJAAAA IAMAAA AAAAxx +3148 8121 0 0 8 8 48 148 1148 3148 3148 96 97 CRAAAA JAMAAA HHHHxx +2842 8122 0 2 2 2 42 842 842 2842 2842 84 85 IFAAAA KAMAAA OOOOxx +4965 8123 1 1 5 5 65 965 965 4965 4965 130 131 ZIAAAA LAMAAA VVVVxx +3742 8124 0 2 2 2 42 742 1742 3742 3742 84 85 YNAAAA MAMAAA AAAAxx +5196 8125 0 0 6 16 96 196 1196 196 5196 192 193 WRAAAA NAMAAA HHHHxx +9105 8126 1 1 5 5 5 105 1105 4105 9105 10 11 FMAAAA OAMAAA OOOOxx +6806 8127 0 2 6 6 6 806 806 1806 6806 12 13 UBAAAA PAMAAA VVVVxx +5849 8128 1 1 9 9 49 849 1849 849 5849 98 99 ZQAAAA QAMAAA AAAAxx +6504 8129 0 0 4 4 4 504 504 1504 6504 8 9 EQAAAA RAMAAA HHHHxx +9841 8130 1 1 1 1 41 841 1841 4841 9841 82 83 NOAAAA SAMAAA OOOOxx +457 8131 1 1 7 17 57 457 457 457 457 114 115 PRAAAA TAMAAA VVVVxx +8856 8132 0 0 6 16 56 856 856 3856 8856 112 113 QCAAAA UAMAAA AAAAxx +8043 8133 1 3 3 3 43 43 43 3043 8043 86 87 JXAAAA VAMAAA HHHHxx +5933 8134 1 1 3 13 33 933 1933 933 5933 66 67 FUAAAA WAMAAA OOOOxx +5725 8135 1 1 5 5 25 725 1725 725 5725 50 51 FMAAAA XAMAAA VVVVxx +8607 8136 1 3 7 7 7 607 607 3607 8607 14 15 BTAAAA YAMAAA AAAAxx +9280 8137 0 0 0 0 80 280 1280 4280 9280 160 161 YSAAAA ZAMAAA HHHHxx +6017 8138 1 1 7 17 17 17 17 1017 6017 34 35 LXAAAA ABMAAA OOOOxx +4946 8139 0 2 6 6 46 946 946 4946 4946 92 93 GIAAAA BBMAAA VVVVxx +7373 8140 1 1 3 13 73 373 1373 2373 7373 146 147 PXAAAA CBMAAA AAAAxx +8096 8141 0 0 6 16 96 96 96 3096 8096 192 193 KZAAAA DBMAAA HHHHxx +3178 8142 0 2 8 18 78 178 1178 3178 3178 156 157 GSAAAA EBMAAA OOOOxx +1849 8143 1 1 9 9 49 849 1849 1849 1849 98 99 DTAAAA FBMAAA VVVVxx +8813 8144 1 1 3 13 13 813 813 3813 8813 26 27 ZAAAAA GBMAAA AAAAxx +460 8145 0 0 0 0 60 460 460 460 460 120 121 SRAAAA HBMAAA HHHHxx +7756 8146 0 0 6 16 56 756 1756 2756 7756 112 113 IMAAAA IBMAAA OOOOxx +4425 8147 1 1 5 5 25 425 425 4425 4425 50 51 FOAAAA JBMAAA VVVVxx +1602 8148 0 2 2 2 2 602 1602 1602 1602 4 5 QJAAAA KBMAAA AAAAxx +5981 8149 1 1 1 1 81 981 1981 981 5981 162 163 BWAAAA LBMAAA HHHHxx +8139 8150 1 3 9 19 39 139 139 3139 8139 78 79 BBAAAA MBMAAA OOOOxx +754 8151 0 2 4 14 54 754 754 754 754 108 109 ADAAAA NBMAAA VVVVxx +26 8152 0 2 6 6 26 26 26 26 26 52 53 ABAAAA OBMAAA AAAAxx +106 8153 0 2 6 6 6 106 106 106 106 12 13 CEAAAA PBMAAA HHHHxx +7465 8154 1 1 5 5 65 465 1465 2465 7465 130 131 DBAAAA QBMAAA OOOOxx +1048 8155 0 0 8 8 48 48 1048 1048 1048 96 97 IOAAAA RBMAAA VVVVxx +2303 8156 1 3 3 3 3 303 303 2303 2303 6 7 PKAAAA SBMAAA AAAAxx +5794 8157 0 2 4 14 94 794 1794 794 5794 188 189 WOAAAA TBMAAA HHHHxx +3321 8158 1 1 1 1 21 321 1321 3321 3321 42 43 TXAAAA UBMAAA OOOOxx +6122 8159 0 2 2 2 22 122 122 1122 6122 44 45 MBAAAA VBMAAA VVVVxx +6474 8160 0 2 4 14 74 474 474 1474 6474 148 149 APAAAA WBMAAA AAAAxx +827 8161 1 3 7 7 27 827 827 827 827 54 55 VFAAAA XBMAAA HHHHxx +6616 8162 0 0 6 16 16 616 616 1616 6616 32 33 MUAAAA YBMAAA OOOOxx +2131 8163 1 3 1 11 31 131 131 2131 2131 62 63 ZDAAAA ZBMAAA VVVVxx +5483 8164 1 3 3 3 83 483 1483 483 5483 166 167 XCAAAA ACMAAA AAAAxx +606 8165 0 2 6 6 6 606 606 606 606 12 13 IXAAAA BCMAAA HHHHxx +922 8166 0 2 2 2 22 922 922 922 922 44 45 MJAAAA CCMAAA OOOOxx +8475 8167 1 3 5 15 75 475 475 3475 8475 150 151 ZNAAAA DCMAAA VVVVxx +7645 8168 1 1 5 5 45 645 1645 2645 7645 90 91 BIAAAA ECMAAA AAAAxx +5097 8169 1 1 7 17 97 97 1097 97 5097 194 195 BOAAAA FCMAAA HHHHxx +5377 8170 1 1 7 17 77 377 1377 377 5377 154 155 VYAAAA GCMAAA OOOOxx +6116 8171 0 0 6 16 16 116 116 1116 6116 32 33 GBAAAA HCMAAA VVVVxx +8674 8172 0 2 4 14 74 674 674 3674 8674 148 149 QVAAAA ICMAAA AAAAxx +8063 8173 1 3 3 3 63 63 63 3063 8063 126 127 DYAAAA JCMAAA HHHHxx +5271 8174 1 3 1 11 71 271 1271 271 5271 142 143 TUAAAA KCMAAA OOOOxx +1619 8175 1 3 9 19 19 619 1619 1619 1619 38 39 HKAAAA LCMAAA VVVVxx +6419 8176 1 3 9 19 19 419 419 1419 6419 38 39 XMAAAA MCMAAA AAAAxx +7651 8177 1 3 1 11 51 651 1651 2651 7651 102 103 HIAAAA NCMAAA HHHHxx +2897 8178 1 1 7 17 97 897 897 2897 2897 194 195 LHAAAA OCMAAA OOOOxx +8148 8179 0 0 8 8 48 148 148 3148 8148 96 97 KBAAAA PCMAAA VVVVxx +7461 8180 1 1 1 1 61 461 1461 2461 7461 122 123 ZAAAAA QCMAAA AAAAxx +9186 8181 0 2 6 6 86 186 1186 4186 9186 172 173 IPAAAA RCMAAA HHHHxx +7127 8182 1 3 7 7 27 127 1127 2127 7127 54 55 DOAAAA SCMAAA OOOOxx +8233 8183 1 1 3 13 33 233 233 3233 8233 66 67 REAAAA TCMAAA VVVVxx +9651 8184 1 3 1 11 51 651 1651 4651 9651 102 103 FHAAAA UCMAAA AAAAxx +6746 8185 0 2 6 6 46 746 746 1746 6746 92 93 MZAAAA VCMAAA HHHHxx +7835 8186 1 3 5 15 35 835 1835 2835 7835 70 71 JPAAAA WCMAAA OOOOxx +8815 8187 1 3 5 15 15 815 815 3815 8815 30 31 BBAAAA XCMAAA VVVVxx +6398 8188 0 2 8 18 98 398 398 1398 6398 196 197 CMAAAA YCMAAA AAAAxx +5344 8189 0 0 4 4 44 344 1344 344 5344 88 89 OXAAAA ZCMAAA HHHHxx +8209 8190 1 1 9 9 9 209 209 3209 8209 18 19 TDAAAA ADMAAA OOOOxx +8444 8191 0 0 4 4 44 444 444 3444 8444 88 89 UMAAAA BDMAAA VVVVxx +5669 8192 1 1 9 9 69 669 1669 669 5669 138 139 BKAAAA CDMAAA AAAAxx +2455 8193 1 3 5 15 55 455 455 2455 2455 110 111 LQAAAA DDMAAA HHHHxx +6767 8194 1 3 7 7 67 767 767 1767 6767 134 135 HAAAAA EDMAAA OOOOxx +135 8195 1 3 5 15 35 135 135 135 135 70 71 FFAAAA FDMAAA VVVVxx +3503 8196 1 3 3 3 3 503 1503 3503 3503 6 7 TEAAAA GDMAAA AAAAxx +6102 8197 0 2 2 2 2 102 102 1102 6102 4 5 SAAAAA HDMAAA HHHHxx +7136 8198 0 0 6 16 36 136 1136 2136 7136 72 73 MOAAAA IDMAAA OOOOxx +4933 8199 1 1 3 13 33 933 933 4933 4933 66 67 THAAAA JDMAAA VVVVxx +8804 8200 0 0 4 4 4 804 804 3804 8804 8 9 QAAAAA KDMAAA AAAAxx +3760 8201 0 0 0 0 60 760 1760 3760 3760 120 121 QOAAAA LDMAAA HHHHxx +8603 8202 1 3 3 3 3 603 603 3603 8603 6 7 XSAAAA MDMAAA OOOOxx +7411 8203 1 3 1 11 11 411 1411 2411 7411 22 23 BZAAAA NDMAAA VVVVxx +834 8204 0 2 4 14 34 834 834 834 834 68 69 CGAAAA ODMAAA AAAAxx +7385 8205 1 1 5 5 85 385 1385 2385 7385 170 171 BYAAAA PDMAAA HHHHxx +3696 8206 0 0 6 16 96 696 1696 3696 3696 192 193 EMAAAA QDMAAA OOOOxx +8720 8207 0 0 0 0 20 720 720 3720 8720 40 41 KXAAAA RDMAAA VVVVxx +4539 8208 1 3 9 19 39 539 539 4539 4539 78 79 PSAAAA SDMAAA AAAAxx +9837 8209 1 1 7 17 37 837 1837 4837 9837 74 75 JOAAAA TDMAAA HHHHxx +8595 8210 1 3 5 15 95 595 595 3595 8595 190 191 PSAAAA UDMAAA OOOOxx +3673 8211 1 1 3 13 73 673 1673 3673 3673 146 147 HLAAAA VDMAAA VVVVxx +475 8212 1 3 5 15 75 475 475 475 475 150 151 HSAAAA WDMAAA AAAAxx +2256 8213 0 0 6 16 56 256 256 2256 2256 112 113 UIAAAA XDMAAA HHHHxx +6349 8214 1 1 9 9 49 349 349 1349 6349 98 99 FKAAAA YDMAAA OOOOxx +9968 8215 0 0 8 8 68 968 1968 4968 9968 136 137 KTAAAA ZDMAAA VVVVxx +7261 8216 1 1 1 1 61 261 1261 2261 7261 122 123 HTAAAA AEMAAA AAAAxx +5799 8217 1 3 9 19 99 799 1799 799 5799 198 199 BPAAAA BEMAAA HHHHxx +8159 8218 1 3 9 19 59 159 159 3159 8159 118 119 VBAAAA CEMAAA OOOOxx +92 8219 0 0 2 12 92 92 92 92 92 184 185 ODAAAA DEMAAA VVVVxx +5927 8220 1 3 7 7 27 927 1927 927 5927 54 55 ZTAAAA EEMAAA AAAAxx +7925 8221 1 1 5 5 25 925 1925 2925 7925 50 51 VSAAAA FEMAAA HHHHxx +5836 8222 0 0 6 16 36 836 1836 836 5836 72 73 MQAAAA GEMAAA OOOOxx +7935 8223 1 3 5 15 35 935 1935 2935 7935 70 71 FTAAAA HEMAAA VVVVxx +5505 8224 1 1 5 5 5 505 1505 505 5505 10 11 TDAAAA IEMAAA AAAAxx +5882 8225 0 2 2 2 82 882 1882 882 5882 164 165 GSAAAA JEMAAA HHHHxx +4411 8226 1 3 1 11 11 411 411 4411 4411 22 23 RNAAAA KEMAAA OOOOxx +64 8227 0 0 4 4 64 64 64 64 64 128 129 MCAAAA LEMAAA VVVVxx +2851 8228 1 3 1 11 51 851 851 2851 2851 102 103 RFAAAA MEMAAA AAAAxx +1665 8229 1 1 5 5 65 665 1665 1665 1665 130 131 BMAAAA NEMAAA HHHHxx +2895 8230 1 3 5 15 95 895 895 2895 2895 190 191 JHAAAA OEMAAA OOOOxx +2210 8231 0 2 0 10 10 210 210 2210 2210 20 21 AHAAAA PEMAAA VVVVxx +9873 8232 1 1 3 13 73 873 1873 4873 9873 146 147 TPAAAA QEMAAA AAAAxx +5402 8233 0 2 2 2 2 402 1402 402 5402 4 5 UZAAAA REMAAA HHHHxx +285 8234 1 1 5 5 85 285 285 285 285 170 171 ZKAAAA SEMAAA OOOOxx +8545 8235 1 1 5 5 45 545 545 3545 8545 90 91 RQAAAA TEMAAA VVVVxx +5328 8236 0 0 8 8 28 328 1328 328 5328 56 57 YWAAAA UEMAAA AAAAxx +733 8237 1 1 3 13 33 733 733 733 733 66 67 FCAAAA VEMAAA HHHHxx +7726 8238 0 2 6 6 26 726 1726 2726 7726 52 53 ELAAAA WEMAAA OOOOxx +5418 8239 0 2 8 18 18 418 1418 418 5418 36 37 KAAAAA XEMAAA VVVVxx +7761 8240 1 1 1 1 61 761 1761 2761 7761 122 123 NMAAAA YEMAAA AAAAxx +9263 8241 1 3 3 3 63 263 1263 4263 9263 126 127 HSAAAA ZEMAAA HHHHxx +5579 8242 1 3 9 19 79 579 1579 579 5579 158 159 PGAAAA AFMAAA OOOOxx +5434 8243 0 2 4 14 34 434 1434 434 5434 68 69 ABAAAA BFMAAA VVVVxx +5230 8244 0 2 0 10 30 230 1230 230 5230 60 61 ETAAAA CFMAAA AAAAxx +9981 8245 1 1 1 1 81 981 1981 4981 9981 162 163 XTAAAA DFMAAA HHHHxx +5830 8246 0 2 0 10 30 830 1830 830 5830 60 61 GQAAAA EFMAAA OOOOxx +128 8247 0 0 8 8 28 128 128 128 128 56 57 YEAAAA FFMAAA VVVVxx +2734 8248 0 2 4 14 34 734 734 2734 2734 68 69 EBAAAA GFMAAA AAAAxx +4537 8249 1 1 7 17 37 537 537 4537 4537 74 75 NSAAAA HFMAAA HHHHxx +3899 8250 1 3 9 19 99 899 1899 3899 3899 198 199 ZTAAAA IFMAAA OOOOxx +1000 8251 0 0 0 0 0 0 1000 1000 1000 0 1 MMAAAA JFMAAA VVVVxx +9896 8252 0 0 6 16 96 896 1896 4896 9896 192 193 QQAAAA KFMAAA AAAAxx +3640 8253 0 0 0 0 40 640 1640 3640 3640 80 81 AKAAAA LFMAAA HHHHxx +2568 8254 0 0 8 8 68 568 568 2568 2568 136 137 UUAAAA MFMAAA OOOOxx +2026 8255 0 2 6 6 26 26 26 2026 2026 52 53 YZAAAA NFMAAA VVVVxx +3955 8256 1 3 5 15 55 955 1955 3955 3955 110 111 DWAAAA OFMAAA AAAAxx +7152 8257 0 0 2 12 52 152 1152 2152 7152 104 105 CPAAAA PFMAAA HHHHxx +2402 8258 0 2 2 2 2 402 402 2402 2402 4 5 KOAAAA QFMAAA OOOOxx +9522 8259 0 2 2 2 22 522 1522 4522 9522 44 45 GCAAAA RFMAAA VVVVxx +4011 8260 1 3 1 11 11 11 11 4011 4011 22 23 HYAAAA SFMAAA AAAAxx +3297 8261 1 1 7 17 97 297 1297 3297 3297 194 195 VWAAAA TFMAAA HHHHxx +4915 8262 1 3 5 15 15 915 915 4915 4915 30 31 BHAAAA UFMAAA OOOOxx +5397 8263 1 1 7 17 97 397 1397 397 5397 194 195 PZAAAA VFMAAA VVVVxx +5454 8264 0 2 4 14 54 454 1454 454 5454 108 109 UBAAAA WFMAAA AAAAxx +4568 8265 0 0 8 8 68 568 568 4568 4568 136 137 STAAAA XFMAAA HHHHxx +5875 8266 1 3 5 15 75 875 1875 875 5875 150 151 ZRAAAA YFMAAA OOOOxx +3642 8267 0 2 2 2 42 642 1642 3642 3642 84 85 CKAAAA ZFMAAA VVVVxx +8506 8268 0 2 6 6 6 506 506 3506 8506 12 13 EPAAAA AGMAAA AAAAxx +9621 8269 1 1 1 1 21 621 1621 4621 9621 42 43 BGAAAA BGMAAA HHHHxx +7739 8270 1 3 9 19 39 739 1739 2739 7739 78 79 RLAAAA CGMAAA OOOOxx +3987 8271 1 3 7 7 87 987 1987 3987 3987 174 175 JXAAAA DGMAAA VVVVxx +2090 8272 0 2 0 10 90 90 90 2090 2090 180 181 KCAAAA EGMAAA AAAAxx +3838 8273 0 2 8 18 38 838 1838 3838 3838 76 77 QRAAAA FGMAAA HHHHxx +17 8274 1 1 7 17 17 17 17 17 17 34 35 RAAAAA GGMAAA OOOOxx +3406 8275 0 2 6 6 6 406 1406 3406 3406 12 13 ABAAAA HGMAAA VVVVxx +8312 8276 0 0 2 12 12 312 312 3312 8312 24 25 SHAAAA IGMAAA AAAAxx +4034 8277 0 2 4 14 34 34 34 4034 4034 68 69 EZAAAA JGMAAA HHHHxx +1535 8278 1 3 5 15 35 535 1535 1535 1535 70 71 BHAAAA KGMAAA OOOOxx +7198 8279 0 2 8 18 98 198 1198 2198 7198 196 197 WQAAAA LGMAAA VVVVxx +8885 8280 1 1 5 5 85 885 885 3885 8885 170 171 TDAAAA MGMAAA AAAAxx +4081 8281 1 1 1 1 81 81 81 4081 4081 162 163 ZAAAAA NGMAAA HHHHxx +980 8282 0 0 0 0 80 980 980 980 980 160 161 SLAAAA OGMAAA OOOOxx +551 8283 1 3 1 11 51 551 551 551 551 102 103 FVAAAA PGMAAA VVVVxx +7746 8284 0 2 6 6 46 746 1746 2746 7746 92 93 YLAAAA QGMAAA AAAAxx +4756 8285 0 0 6 16 56 756 756 4756 4756 112 113 YAAAAA RGMAAA HHHHxx +3655 8286 1 3 5 15 55 655 1655 3655 3655 110 111 PKAAAA SGMAAA OOOOxx +7075 8287 1 3 5 15 75 75 1075 2075 7075 150 151 DMAAAA TGMAAA VVVVxx +3950 8288 0 2 0 10 50 950 1950 3950 3950 100 101 YVAAAA UGMAAA AAAAxx +2314 8289 0 2 4 14 14 314 314 2314 2314 28 29 ALAAAA VGMAAA HHHHxx +8432 8290 0 0 2 12 32 432 432 3432 8432 64 65 IMAAAA WGMAAA OOOOxx +62 8291 0 2 2 2 62 62 62 62 62 124 125 KCAAAA XGMAAA VVVVxx +6920 8292 0 0 0 0 20 920 920 1920 6920 40 41 EGAAAA YGMAAA AAAAxx +4077 8293 1 1 7 17 77 77 77 4077 4077 154 155 VAAAAA ZGMAAA HHHHxx +9118 8294 0 2 8 18 18 118 1118 4118 9118 36 37 SMAAAA AHMAAA OOOOxx +5375 8295 1 3 5 15 75 375 1375 375 5375 150 151 TYAAAA BHMAAA VVVVxx +178 8296 0 2 8 18 78 178 178 178 178 156 157 WGAAAA CHMAAA AAAAxx +1079 8297 1 3 9 19 79 79 1079 1079 1079 158 159 NPAAAA DHMAAA HHHHxx +4279 8298 1 3 9 19 79 279 279 4279 4279 158 159 PIAAAA EHMAAA OOOOxx +8436 8299 0 0 6 16 36 436 436 3436 8436 72 73 MMAAAA FHMAAA VVVVxx +1931 8300 1 3 1 11 31 931 1931 1931 1931 62 63 HWAAAA GHMAAA AAAAxx +2096 8301 0 0 6 16 96 96 96 2096 2096 192 193 QCAAAA HHMAAA HHHHxx +1638 8302 0 2 8 18 38 638 1638 1638 1638 76 77 ALAAAA IHMAAA OOOOxx +2788 8303 0 0 8 8 88 788 788 2788 2788 176 177 GDAAAA JHMAAA VVVVxx +4751 8304 1 3 1 11 51 751 751 4751 4751 102 103 TAAAAA KHMAAA AAAAxx +8824 8305 0 0 4 4 24 824 824 3824 8824 48 49 KBAAAA LHMAAA HHHHxx +3098 8306 0 2 8 18 98 98 1098 3098 3098 196 197 EPAAAA MHMAAA OOOOxx +4497 8307 1 1 7 17 97 497 497 4497 4497 194 195 ZQAAAA NHMAAA VVVVxx +5223 8308 1 3 3 3 23 223 1223 223 5223 46 47 XSAAAA OHMAAA AAAAxx +9212 8309 0 0 2 12 12 212 1212 4212 9212 24 25 IQAAAA PHMAAA HHHHxx +4265 8310 1 1 5 5 65 265 265 4265 4265 130 131 BIAAAA QHMAAA OOOOxx +6898 8311 0 2 8 18 98 898 898 1898 6898 196 197 IFAAAA RHMAAA VVVVxx +8808 8312 0 0 8 8 8 808 808 3808 8808 16 17 UAAAAA SHMAAA AAAAxx +5629 8313 1 1 9 9 29 629 1629 629 5629 58 59 NIAAAA THMAAA HHHHxx +3779 8314 1 3 9 19 79 779 1779 3779 3779 158 159 JPAAAA UHMAAA OOOOxx +4972 8315 0 0 2 12 72 972 972 4972 4972 144 145 GJAAAA VHMAAA VVVVxx +4511 8316 1 3 1 11 11 511 511 4511 4511 22 23 NRAAAA WHMAAA AAAAxx +6761 8317 1 1 1 1 61 761 761 1761 6761 122 123 BAAAAA XHMAAA HHHHxx +2335 8318 1 3 5 15 35 335 335 2335 2335 70 71 VLAAAA YHMAAA OOOOxx +732 8319 0 0 2 12 32 732 732 732 732 64 65 ECAAAA ZHMAAA VVVVxx +4757 8320 1 1 7 17 57 757 757 4757 4757 114 115 ZAAAAA AIMAAA AAAAxx +6624 8321 0 0 4 4 24 624 624 1624 6624 48 49 UUAAAA BIMAAA HHHHxx +5869 8322 1 1 9 9 69 869 1869 869 5869 138 139 TRAAAA CIMAAA OOOOxx +5842 8323 0 2 2 2 42 842 1842 842 5842 84 85 SQAAAA DIMAAA VVVVxx +5735 8324 1 3 5 15 35 735 1735 735 5735 70 71 PMAAAA EIMAAA AAAAxx +8276 8325 0 0 6 16 76 276 276 3276 8276 152 153 IGAAAA FIMAAA HHHHxx +7227 8326 1 3 7 7 27 227 1227 2227 7227 54 55 ZRAAAA GIMAAA OOOOxx +4923 8327 1 3 3 3 23 923 923 4923 4923 46 47 JHAAAA HIMAAA VVVVxx +9135 8328 1 3 5 15 35 135 1135 4135 9135 70 71 JNAAAA IIMAAA AAAAxx +5813 8329 1 1 3 13 13 813 1813 813 5813 26 27 PPAAAA JIMAAA HHHHxx +9697 8330 1 1 7 17 97 697 1697 4697 9697 194 195 ZIAAAA KIMAAA OOOOxx +3222 8331 0 2 2 2 22 222 1222 3222 3222 44 45 YTAAAA LIMAAA VVVVxx +2394 8332 0 2 4 14 94 394 394 2394 2394 188 189 COAAAA MIMAAA AAAAxx +5784 8333 0 0 4 4 84 784 1784 784 5784 168 169 MOAAAA NIMAAA HHHHxx +3652 8334 0 0 2 12 52 652 1652 3652 3652 104 105 MKAAAA OIMAAA OOOOxx +8175 8335 1 3 5 15 75 175 175 3175 8175 150 151 LCAAAA PIMAAA VVVVxx +7568 8336 0 0 8 8 68 568 1568 2568 7568 136 137 CFAAAA QIMAAA AAAAxx +6645 8337 1 1 5 5 45 645 645 1645 6645 90 91 PVAAAA RIMAAA HHHHxx +8176 8338 0 0 6 16 76 176 176 3176 8176 152 153 MCAAAA SIMAAA OOOOxx +530 8339 0 2 0 10 30 530 530 530 530 60 61 KUAAAA TIMAAA VVVVxx +5439 8340 1 3 9 19 39 439 1439 439 5439 78 79 FBAAAA UIMAAA AAAAxx +61 8341 1 1 1 1 61 61 61 61 61 122 123 JCAAAA VIMAAA HHHHxx +3951 8342 1 3 1 11 51 951 1951 3951 3951 102 103 ZVAAAA WIMAAA OOOOxx +5283 8343 1 3 3 3 83 283 1283 283 5283 166 167 FVAAAA XIMAAA VVVVxx +7226 8344 0 2 6 6 26 226 1226 2226 7226 52 53 YRAAAA YIMAAA AAAAxx +1954 8345 0 2 4 14 54 954 1954 1954 1954 108 109 EXAAAA ZIMAAA HHHHxx +334 8346 0 2 4 14 34 334 334 334 334 68 69 WMAAAA AJMAAA OOOOxx +3921 8347 1 1 1 1 21 921 1921 3921 3921 42 43 VUAAAA BJMAAA VVVVxx +6276 8348 0 0 6 16 76 276 276 1276 6276 152 153 KHAAAA CJMAAA AAAAxx +3378 8349 0 2 8 18 78 378 1378 3378 3378 156 157 YZAAAA DJMAAA HHHHxx +5236 8350 0 0 6 16 36 236 1236 236 5236 72 73 KTAAAA EJMAAA OOOOxx +7781 8351 1 1 1 1 81 781 1781 2781 7781 162 163 HNAAAA FJMAAA VVVVxx +8601 8352 1 1 1 1 1 601 601 3601 8601 2 3 VSAAAA GJMAAA AAAAxx +1473 8353 1 1 3 13 73 473 1473 1473 1473 146 147 REAAAA HJMAAA HHHHxx +3246 8354 0 2 6 6 46 246 1246 3246 3246 92 93 WUAAAA IJMAAA OOOOxx +3601 8355 1 1 1 1 1 601 1601 3601 3601 2 3 NIAAAA JJMAAA VVVVxx +6861 8356 1 1 1 1 61 861 861 1861 6861 122 123 XDAAAA KJMAAA AAAAxx +9032 8357 0 0 2 12 32 32 1032 4032 9032 64 65 KJAAAA LJMAAA HHHHxx +216 8358 0 0 6 16 16 216 216 216 216 32 33 IIAAAA MJMAAA OOOOxx +3824 8359 0 0 4 4 24 824 1824 3824 3824 48 49 CRAAAA NJMAAA VVVVxx +8486 8360 0 2 6 6 86 486 486 3486 8486 172 173 KOAAAA OJMAAA AAAAxx +276 8361 0 0 6 16 76 276 276 276 276 152 153 QKAAAA PJMAAA HHHHxx +1838 8362 0 2 8 18 38 838 1838 1838 1838 76 77 SSAAAA QJMAAA OOOOxx +6175 8363 1 3 5 15 75 175 175 1175 6175 150 151 NDAAAA RJMAAA VVVVxx +3719 8364 1 3 9 19 19 719 1719 3719 3719 38 39 BNAAAA SJMAAA AAAAxx +6958 8365 0 2 8 18 58 958 958 1958 6958 116 117 QHAAAA TJMAAA HHHHxx +6822 8366 0 2 2 2 22 822 822 1822 6822 44 45 KCAAAA UJMAAA OOOOxx +3318 8367 0 2 8 18 18 318 1318 3318 3318 36 37 QXAAAA VJMAAA VVVVxx +7222 8368 0 2 2 2 22 222 1222 2222 7222 44 45 URAAAA WJMAAA AAAAxx +85 8369 1 1 5 5 85 85 85 85 85 170 171 HDAAAA XJMAAA HHHHxx +5158 8370 0 2 8 18 58 158 1158 158 5158 116 117 KQAAAA YJMAAA OOOOxx +6360 8371 0 0 0 0 60 360 360 1360 6360 120 121 QKAAAA ZJMAAA VVVVxx +2599 8372 1 3 9 19 99 599 599 2599 2599 198 199 ZVAAAA AKMAAA AAAAxx +4002 8373 0 2 2 2 2 2 2 4002 4002 4 5 YXAAAA BKMAAA HHHHxx +6597 8374 1 1 7 17 97 597 597 1597 6597 194 195 TTAAAA CKMAAA OOOOxx +5762 8375 0 2 2 2 62 762 1762 762 5762 124 125 QNAAAA DKMAAA VVVVxx +8383 8376 1 3 3 3 83 383 383 3383 8383 166 167 LKAAAA EKMAAA AAAAxx +4686 8377 0 2 6 6 86 686 686 4686 4686 172 173 GYAAAA FKMAAA HHHHxx +5972 8378 0 0 2 12 72 972 1972 972 5972 144 145 SVAAAA GKMAAA OOOOxx +1432 8379 0 0 2 12 32 432 1432 1432 1432 64 65 CDAAAA HKMAAA VVVVxx +1601 8380 1 1 1 1 1 601 1601 1601 1601 2 3 PJAAAA IKMAAA AAAAxx +3012 8381 0 0 2 12 12 12 1012 3012 3012 24 25 WLAAAA JKMAAA HHHHxx +9345 8382 1 1 5 5 45 345 1345 4345 9345 90 91 LVAAAA KKMAAA OOOOxx +8869 8383 1 1 9 9 69 869 869 3869 8869 138 139 DDAAAA LKMAAA VVVVxx +6612 8384 0 0 2 12 12 612 612 1612 6612 24 25 IUAAAA MKMAAA AAAAxx +262 8385 0 2 2 2 62 262 262 262 262 124 125 CKAAAA NKMAAA HHHHxx +300 8386 0 0 0 0 0 300 300 300 300 0 1 OLAAAA OKMAAA OOOOxx +3045 8387 1 1 5 5 45 45 1045 3045 3045 90 91 DNAAAA PKMAAA VVVVxx +7252 8388 0 0 2 12 52 252 1252 2252 7252 104 105 YSAAAA QKMAAA AAAAxx +9099 8389 1 3 9 19 99 99 1099 4099 9099 198 199 ZLAAAA RKMAAA HHHHxx +9006 8390 0 2 6 6 6 6 1006 4006 9006 12 13 KIAAAA SKMAAA OOOOxx +3078 8391 0 2 8 18 78 78 1078 3078 3078 156 157 KOAAAA TKMAAA VVVVxx +5159 8392 1 3 9 19 59 159 1159 159 5159 118 119 LQAAAA UKMAAA AAAAxx +9329 8393 1 1 9 9 29 329 1329 4329 9329 58 59 VUAAAA VKMAAA HHHHxx +1393 8394 1 1 3 13 93 393 1393 1393 1393 186 187 PBAAAA WKMAAA OOOOxx +5894 8395 0 2 4 14 94 894 1894 894 5894 188 189 SSAAAA XKMAAA VVVVxx +11 8396 1 3 1 11 11 11 11 11 11 22 23 LAAAAA YKMAAA AAAAxx +5606 8397 0 2 6 6 6 606 1606 606 5606 12 13 QHAAAA ZKMAAA HHHHxx +5541 8398 1 1 1 1 41 541 1541 541 5541 82 83 DFAAAA ALMAAA OOOOxx +2689 8399 1 1 9 9 89 689 689 2689 2689 178 179 LZAAAA BLMAAA VVVVxx +1023 8400 1 3 3 3 23 23 1023 1023 1023 46 47 JNAAAA CLMAAA AAAAxx +8134 8401 0 2 4 14 34 134 134 3134 8134 68 69 WAAAAA DLMAAA HHHHxx +5923 8402 1 3 3 3 23 923 1923 923 5923 46 47 VTAAAA ELMAAA OOOOxx +6056 8403 0 0 6 16 56 56 56 1056 6056 112 113 YYAAAA FLMAAA VVVVxx +653 8404 1 1 3 13 53 653 653 653 653 106 107 DZAAAA GLMAAA AAAAxx +367 8405 1 3 7 7 67 367 367 367 367 134 135 DOAAAA HLMAAA HHHHxx +1828 8406 0 0 8 8 28 828 1828 1828 1828 56 57 ISAAAA ILMAAA OOOOxx +6506 8407 0 2 6 6 6 506 506 1506 6506 12 13 GQAAAA JLMAAA VVVVxx +5772 8408 0 0 2 12 72 772 1772 772 5772 144 145 AOAAAA KLMAAA AAAAxx +8052 8409 0 0 2 12 52 52 52 3052 8052 104 105 SXAAAA LLMAAA HHHHxx +2633 8410 1 1 3 13 33 633 633 2633 2633 66 67 HXAAAA MLMAAA OOOOxx +4878 8411 0 2 8 18 78 878 878 4878 4878 156 157 QFAAAA NLMAAA VVVVxx +5621 8412 1 1 1 1 21 621 1621 621 5621 42 43 FIAAAA OLMAAA AAAAxx +41 8413 1 1 1 1 41 41 41 41 41 82 83 PBAAAA PLMAAA HHHHxx +4613 8414 1 1 3 13 13 613 613 4613 4613 26 27 LVAAAA QLMAAA OOOOxx +9389 8415 1 1 9 9 89 389 1389 4389 9389 178 179 DXAAAA RLMAAA VVVVxx +9414 8416 0 2 4 14 14 414 1414 4414 9414 28 29 CYAAAA SLMAAA AAAAxx +3583 8417 1 3 3 3 83 583 1583 3583 3583 166 167 VHAAAA TLMAAA HHHHxx +3454 8418 0 2 4 14 54 454 1454 3454 3454 108 109 WCAAAA ULMAAA OOOOxx +719 8419 1 3 9 19 19 719 719 719 719 38 39 RBAAAA VLMAAA VVVVxx +6188 8420 0 0 8 8 88 188 188 1188 6188 176 177 AEAAAA WLMAAA AAAAxx +2288 8421 0 0 8 8 88 288 288 2288 2288 176 177 AKAAAA XLMAAA HHHHxx +1287 8422 1 3 7 7 87 287 1287 1287 1287 174 175 NXAAAA YLMAAA OOOOxx +1397 8423 1 1 7 17 97 397 1397 1397 1397 194 195 TBAAAA ZLMAAA VVVVxx +7763 8424 1 3 3 3 63 763 1763 2763 7763 126 127 PMAAAA AMMAAA AAAAxx +5194 8425 0 2 4 14 94 194 1194 194 5194 188 189 URAAAA BMMAAA HHHHxx +3167 8426 1 3 7 7 67 167 1167 3167 3167 134 135 VRAAAA CMMAAA OOOOxx +9218 8427 0 2 8 18 18 218 1218 4218 9218 36 37 OQAAAA DMMAAA VVVVxx +2065 8428 1 1 5 5 65 65 65 2065 2065 130 131 LBAAAA EMMAAA AAAAxx +9669 8429 1 1 9 9 69 669 1669 4669 9669 138 139 XHAAAA FMMAAA HHHHxx +146 8430 0 2 6 6 46 146 146 146 146 92 93 QFAAAA GMMAAA OOOOxx +6141 8431 1 1 1 1 41 141 141 1141 6141 82 83 FCAAAA HMMAAA VVVVxx +2843 8432 1 3 3 3 43 843 843 2843 2843 86 87 JFAAAA IMMAAA AAAAxx +7934 8433 0 2 4 14 34 934 1934 2934 7934 68 69 ETAAAA JMMAAA HHHHxx +2536 8434 0 0 6 16 36 536 536 2536 2536 72 73 OTAAAA KMMAAA OOOOxx +7088 8435 0 0 8 8 88 88 1088 2088 7088 176 177 QMAAAA LMMAAA VVVVxx +2519 8436 1 3 9 19 19 519 519 2519 2519 38 39 XSAAAA MMMAAA AAAAxx +6650 8437 0 2 0 10 50 650 650 1650 6650 100 101 UVAAAA NMMAAA HHHHxx +3007 8438 1 3 7 7 7 7 1007 3007 3007 14 15 RLAAAA OMMAAA OOOOxx +4507 8439 1 3 7 7 7 507 507 4507 4507 14 15 JRAAAA PMMAAA VVVVxx +4892 8440 0 0 2 12 92 892 892 4892 4892 184 185 EGAAAA QMMAAA AAAAxx +7159 8441 1 3 9 19 59 159 1159 2159 7159 118 119 JPAAAA RMMAAA HHHHxx +3171 8442 1 3 1 11 71 171 1171 3171 3171 142 143 ZRAAAA SMMAAA OOOOxx +1080 8443 0 0 0 0 80 80 1080 1080 1080 160 161 OPAAAA TMMAAA VVVVxx +7248 8444 0 0 8 8 48 248 1248 2248 7248 96 97 USAAAA UMMAAA AAAAxx +7230 8445 0 2 0 10 30 230 1230 2230 7230 60 61 CSAAAA VMMAAA HHHHxx +3823 8446 1 3 3 3 23 823 1823 3823 3823 46 47 BRAAAA WMMAAA OOOOxx +5517 8447 1 1 7 17 17 517 1517 517 5517 34 35 FEAAAA XMMAAA VVVVxx +1482 8448 0 2 2 2 82 482 1482 1482 1482 164 165 AFAAAA YMMAAA AAAAxx +9953 8449 1 1 3 13 53 953 1953 4953 9953 106 107 VSAAAA ZMMAAA HHHHxx +2754 8450 0 2 4 14 54 754 754 2754 2754 108 109 YBAAAA ANMAAA OOOOxx +3875 8451 1 3 5 15 75 875 1875 3875 3875 150 151 BTAAAA BNMAAA VVVVxx +9800 8452 0 0 0 0 0 800 1800 4800 9800 0 1 YMAAAA CNMAAA AAAAxx +8819 8453 1 3 9 19 19 819 819 3819 8819 38 39 FBAAAA DNMAAA HHHHxx +8267 8454 1 3 7 7 67 267 267 3267 8267 134 135 ZFAAAA ENMAAA OOOOxx +520 8455 0 0 0 0 20 520 520 520 520 40 41 AUAAAA FNMAAA VVVVxx +5770 8456 0 2 0 10 70 770 1770 770 5770 140 141 YNAAAA GNMAAA AAAAxx +2114 8457 0 2 4 14 14 114 114 2114 2114 28 29 IDAAAA HNMAAA HHHHxx +5045 8458 1 1 5 5 45 45 1045 45 5045 90 91 BMAAAA INMAAA OOOOxx +1094 8459 0 2 4 14 94 94 1094 1094 1094 188 189 CQAAAA JNMAAA VVVVxx +8786 8460 0 2 6 6 86 786 786 3786 8786 172 173 YZAAAA KNMAAA AAAAxx +353 8461 1 1 3 13 53 353 353 353 353 106 107 PNAAAA LNMAAA HHHHxx +290 8462 0 2 0 10 90 290 290 290 290 180 181 ELAAAA MNMAAA OOOOxx +3376 8463 0 0 6 16 76 376 1376 3376 3376 152 153 WZAAAA NNMAAA VVVVxx +9305 8464 1 1 5 5 5 305 1305 4305 9305 10 11 XTAAAA ONMAAA AAAAxx +186 8465 0 2 6 6 86 186 186 186 186 172 173 EHAAAA PNMAAA HHHHxx +4817 8466 1 1 7 17 17 817 817 4817 4817 34 35 HDAAAA QNMAAA OOOOxx +4638 8467 0 2 8 18 38 638 638 4638 4638 76 77 KWAAAA RNMAAA VVVVxx +3558 8468 0 2 8 18 58 558 1558 3558 3558 116 117 WGAAAA SNMAAA AAAAxx +9285 8469 1 1 5 5 85 285 1285 4285 9285 170 171 DTAAAA TNMAAA HHHHxx +848 8470 0 0 8 8 48 848 848 848 848 96 97 QGAAAA UNMAAA OOOOxx +8923 8471 1 3 3 3 23 923 923 3923 8923 46 47 FFAAAA VNMAAA VVVVxx +6826 8472 0 2 6 6 26 826 826 1826 6826 52 53 OCAAAA WNMAAA AAAAxx +5187 8473 1 3 7 7 87 187 1187 187 5187 174 175 NRAAAA XNMAAA HHHHxx +2398 8474 0 2 8 18 98 398 398 2398 2398 196 197 GOAAAA YNMAAA OOOOxx +7653 8475 1 1 3 13 53 653 1653 2653 7653 106 107 JIAAAA ZNMAAA VVVVxx +8835 8476 1 3 5 15 35 835 835 3835 8835 70 71 VBAAAA AOMAAA AAAAxx +5736 8477 0 0 6 16 36 736 1736 736 5736 72 73 QMAAAA BOMAAA HHHHxx +1238 8478 0 2 8 18 38 238 1238 1238 1238 76 77 QVAAAA COMAAA OOOOxx +6021 8479 1 1 1 1 21 21 21 1021 6021 42 43 PXAAAA DOMAAA VVVVxx +6815 8480 1 3 5 15 15 815 815 1815 6815 30 31 DCAAAA EOMAAA AAAAxx +2549 8481 1 1 9 9 49 549 549 2549 2549 98 99 BUAAAA FOMAAA HHHHxx +5657 8482 1 1 7 17 57 657 1657 657 5657 114 115 PJAAAA GOMAAA OOOOxx +6855 8483 1 3 5 15 55 855 855 1855 6855 110 111 RDAAAA HOMAAA VVVVxx +1225 8484 1 1 5 5 25 225 1225 1225 1225 50 51 DVAAAA IOMAAA AAAAxx +7452 8485 0 0 2 12 52 452 1452 2452 7452 104 105 QAAAAA JOMAAA HHHHxx +2479 8486 1 3 9 19 79 479 479 2479 2479 158 159 JRAAAA KOMAAA OOOOxx +7974 8487 0 2 4 14 74 974 1974 2974 7974 148 149 SUAAAA LOMAAA VVVVxx +1212 8488 0 0 2 12 12 212 1212 1212 1212 24 25 QUAAAA MOMAAA AAAAxx +8883 8489 1 3 3 3 83 883 883 3883 8883 166 167 RDAAAA NOMAAA HHHHxx +8150 8490 0 2 0 10 50 150 150 3150 8150 100 101 MBAAAA OOMAAA OOOOxx +3392 8491 0 0 2 12 92 392 1392 3392 3392 184 185 MAAAAA POMAAA VVVVxx +6774 8492 0 2 4 14 74 774 774 1774 6774 148 149 OAAAAA QOMAAA AAAAxx +904 8493 0 0 4 4 4 904 904 904 904 8 9 UIAAAA ROMAAA HHHHxx +5068 8494 0 0 8 8 68 68 1068 68 5068 136 137 YMAAAA SOMAAA OOOOxx +9339 8495 1 3 9 19 39 339 1339 4339 9339 78 79 FVAAAA TOMAAA VVVVxx +1062 8496 0 2 2 2 62 62 1062 1062 1062 124 125 WOAAAA UOMAAA AAAAxx +3841 8497 1 1 1 1 41 841 1841 3841 3841 82 83 TRAAAA VOMAAA HHHHxx +8924 8498 0 0 4 4 24 924 924 3924 8924 48 49 GFAAAA WOMAAA OOOOxx +9795 8499 1 3 5 15 95 795 1795 4795 9795 190 191 TMAAAA XOMAAA VVVVxx +3981 8500 1 1 1 1 81 981 1981 3981 3981 162 163 DXAAAA YOMAAA AAAAxx +4290 8501 0 2 0 10 90 290 290 4290 4290 180 181 AJAAAA ZOMAAA HHHHxx +1067 8502 1 3 7 7 67 67 1067 1067 1067 134 135 BPAAAA APMAAA OOOOxx +8679 8503 1 3 9 19 79 679 679 3679 8679 158 159 VVAAAA BPMAAA VVVVxx +2894 8504 0 2 4 14 94 894 894 2894 2894 188 189 IHAAAA CPMAAA AAAAxx +9248 8505 0 0 8 8 48 248 1248 4248 9248 96 97 SRAAAA DPMAAA HHHHxx +1072 8506 0 0 2 12 72 72 1072 1072 1072 144 145 GPAAAA EPMAAA OOOOxx +3510 8507 0 2 0 10 10 510 1510 3510 3510 20 21 AFAAAA FPMAAA VVVVxx +6871 8508 1 3 1 11 71 871 871 1871 6871 142 143 HEAAAA GPMAAA AAAAxx +8701 8509 1 1 1 1 1 701 701 3701 8701 2 3 RWAAAA HPMAAA HHHHxx +8170 8510 0 2 0 10 70 170 170 3170 8170 140 141 GCAAAA IPMAAA OOOOxx +2730 8511 0 2 0 10 30 730 730 2730 2730 60 61 ABAAAA JPMAAA VVVVxx +2668 8512 0 0 8 8 68 668 668 2668 2668 136 137 QYAAAA KPMAAA AAAAxx +8723 8513 1 3 3 3 23 723 723 3723 8723 46 47 NXAAAA LPMAAA HHHHxx +3439 8514 1 3 9 19 39 439 1439 3439 3439 78 79 HCAAAA MPMAAA OOOOxx +6219 8515 1 3 9 19 19 219 219 1219 6219 38 39 FFAAAA NPMAAA VVVVxx +4264 8516 0 0 4 4 64 264 264 4264 4264 128 129 AIAAAA OPMAAA AAAAxx +3929 8517 1 1 9 9 29 929 1929 3929 3929 58 59 DVAAAA PPMAAA HHHHxx +7 8518 1 3 7 7 7 7 7 7 7 14 15 HAAAAA QPMAAA OOOOxx +3737 8519 1 1 7 17 37 737 1737 3737 3737 74 75 TNAAAA RPMAAA VVVVxx +358 8520 0 2 8 18 58 358 358 358 358 116 117 UNAAAA SPMAAA AAAAxx +5128 8521 0 0 8 8 28 128 1128 128 5128 56 57 GPAAAA TPMAAA HHHHxx +7353 8522 1 1 3 13 53 353 1353 2353 7353 106 107 VWAAAA UPMAAA OOOOxx +8758 8523 0 2 8 18 58 758 758 3758 8758 116 117 WYAAAA VPMAAA VVVVxx +7284 8524 0 0 4 4 84 284 1284 2284 7284 168 169 EUAAAA WPMAAA AAAAxx +4037 8525 1 1 7 17 37 37 37 4037 4037 74 75 HZAAAA XPMAAA HHHHxx +435 8526 1 3 5 15 35 435 435 435 435 70 71 TQAAAA YPMAAA OOOOxx +3580 8527 0 0 0 0 80 580 1580 3580 3580 160 161 SHAAAA ZPMAAA VVVVxx +4554 8528 0 2 4 14 54 554 554 4554 4554 108 109 ETAAAA AQMAAA AAAAxx +4337 8529 1 1 7 17 37 337 337 4337 4337 74 75 VKAAAA BQMAAA HHHHxx +512 8530 0 0 2 12 12 512 512 512 512 24 25 STAAAA CQMAAA OOOOxx +2032 8531 0 0 2 12 32 32 32 2032 2032 64 65 EAAAAA DQMAAA VVVVxx +1755 8532 1 3 5 15 55 755 1755 1755 1755 110 111 NPAAAA EQMAAA AAAAxx +9923 8533 1 3 3 3 23 923 1923 4923 9923 46 47 RRAAAA FQMAAA HHHHxx +3747 8534 1 3 7 7 47 747 1747 3747 3747 94 95 DOAAAA GQMAAA OOOOxx +27 8535 1 3 7 7 27 27 27 27 27 54 55 BBAAAA HQMAAA VVVVxx +3075 8536 1 3 5 15 75 75 1075 3075 3075 150 151 HOAAAA IQMAAA AAAAxx +6259 8537 1 3 9 19 59 259 259 1259 6259 118 119 TGAAAA JQMAAA HHHHxx +2940 8538 0 0 0 0 40 940 940 2940 2940 80 81 CJAAAA KQMAAA OOOOxx +5724 8539 0 0 4 4 24 724 1724 724 5724 48 49 EMAAAA LQMAAA VVVVxx +5638 8540 0 2 8 18 38 638 1638 638 5638 76 77 WIAAAA MQMAAA AAAAxx +479 8541 1 3 9 19 79 479 479 479 479 158 159 LSAAAA NQMAAA HHHHxx +4125 8542 1 1 5 5 25 125 125 4125 4125 50 51 RCAAAA OQMAAA OOOOxx +1525 8543 1 1 5 5 25 525 1525 1525 1525 50 51 RGAAAA PQMAAA VVVVxx +7529 8544 1 1 9 9 29 529 1529 2529 7529 58 59 PDAAAA QQMAAA AAAAxx +931 8545 1 3 1 11 31 931 931 931 931 62 63 VJAAAA RQMAAA HHHHxx +5175 8546 1 3 5 15 75 175 1175 175 5175 150 151 BRAAAA SQMAAA OOOOxx +6798 8547 0 2 8 18 98 798 798 1798 6798 196 197 MBAAAA TQMAAA VVVVxx +2111 8548 1 3 1 11 11 111 111 2111 2111 22 23 FDAAAA UQMAAA AAAAxx +6145 8549 1 1 5 5 45 145 145 1145 6145 90 91 JCAAAA VQMAAA HHHHxx +4712 8550 0 0 2 12 12 712 712 4712 4712 24 25 GZAAAA WQMAAA OOOOxx +3110 8551 0 2 0 10 10 110 1110 3110 3110 20 21 QPAAAA XQMAAA VVVVxx +97 8552 1 1 7 17 97 97 97 97 97 194 195 TDAAAA YQMAAA AAAAxx +758 8553 0 2 8 18 58 758 758 758 758 116 117 EDAAAA ZQMAAA HHHHxx +1895 8554 1 3 5 15 95 895 1895 1895 1895 190 191 XUAAAA ARMAAA OOOOxx +5289 8555 1 1 9 9 89 289 1289 289 5289 178 179 LVAAAA BRMAAA VVVVxx +5026 8556 0 2 6 6 26 26 1026 26 5026 52 53 ILAAAA CRMAAA AAAAxx +4725 8557 1 1 5 5 25 725 725 4725 4725 50 51 TZAAAA DRMAAA HHHHxx +1679 8558 1 3 9 19 79 679 1679 1679 1679 158 159 PMAAAA ERMAAA OOOOxx +4433 8559 1 1 3 13 33 433 433 4433 4433 66 67 NOAAAA FRMAAA VVVVxx +5340 8560 0 0 0 0 40 340 1340 340 5340 80 81 KXAAAA GRMAAA AAAAxx +6340 8561 0 0 0 0 40 340 340 1340 6340 80 81 WJAAAA HRMAAA HHHHxx +3261 8562 1 1 1 1 61 261 1261 3261 3261 122 123 LVAAAA IRMAAA OOOOxx +8108 8563 0 0 8 8 8 108 108 3108 8108 16 17 WZAAAA JRMAAA VVVVxx +8785 8564 1 1 5 5 85 785 785 3785 8785 170 171 XZAAAA KRMAAA AAAAxx +7391 8565 1 3 1 11 91 391 1391 2391 7391 182 183 HYAAAA LRMAAA HHHHxx +1496 8566 0 0 6 16 96 496 1496 1496 1496 192 193 OFAAAA MRMAAA OOOOxx +1484 8567 0 0 4 4 84 484 1484 1484 1484 168 169 CFAAAA NRMAAA VVVVxx +5884 8568 0 0 4 4 84 884 1884 884 5884 168 169 ISAAAA ORMAAA AAAAxx +342 8569 0 2 2 2 42 342 342 342 342 84 85 ENAAAA PRMAAA HHHHxx +7659 8570 1 3 9 19 59 659 1659 2659 7659 118 119 PIAAAA QRMAAA OOOOxx +6635 8571 1 3 5 15 35 635 635 1635 6635 70 71 FVAAAA RRMAAA VVVVxx +8507 8572 1 3 7 7 7 507 507 3507 8507 14 15 FPAAAA SRMAAA AAAAxx +2583 8573 1 3 3 3 83 583 583 2583 2583 166 167 JVAAAA TRMAAA HHHHxx +6533 8574 1 1 3 13 33 533 533 1533 6533 66 67 HRAAAA URMAAA OOOOxx +5879 8575 1 3 9 19 79 879 1879 879 5879 158 159 DSAAAA VRMAAA VVVVxx +5511 8576 1 3 1 11 11 511 1511 511 5511 22 23 ZDAAAA WRMAAA AAAAxx +3682 8577 0 2 2 2 82 682 1682 3682 3682 164 165 QLAAAA XRMAAA HHHHxx +7182 8578 0 2 2 2 82 182 1182 2182 7182 164 165 GQAAAA YRMAAA OOOOxx +1409 8579 1 1 9 9 9 409 1409 1409 1409 18 19 FCAAAA ZRMAAA VVVVxx +3363 8580 1 3 3 3 63 363 1363 3363 3363 126 127 JZAAAA ASMAAA AAAAxx +729 8581 1 1 9 9 29 729 729 729 729 58 59 BCAAAA BSMAAA HHHHxx +5857 8582 1 1 7 17 57 857 1857 857 5857 114 115 HRAAAA CSMAAA OOOOxx +235 8583 1 3 5 15 35 235 235 235 235 70 71 BJAAAA DSMAAA VVVVxx +193 8584 1 1 3 13 93 193 193 193 193 186 187 LHAAAA ESMAAA AAAAxx +5586 8585 0 2 6 6 86 586 1586 586 5586 172 173 WGAAAA FSMAAA HHHHxx +6203 8586 1 3 3 3 3 203 203 1203 6203 6 7 PEAAAA GSMAAA OOOOxx +6795 8587 1 3 5 15 95 795 795 1795 6795 190 191 JBAAAA HSMAAA VVVVxx +3211 8588 1 3 1 11 11 211 1211 3211 3211 22 23 NTAAAA ISMAAA AAAAxx +9763 8589 1 3 3 3 63 763 1763 4763 9763 126 127 NLAAAA JSMAAA HHHHxx +9043 8590 1 3 3 3 43 43 1043 4043 9043 86 87 VJAAAA KSMAAA OOOOxx +2854 8591 0 2 4 14 54 854 854 2854 2854 108 109 UFAAAA LSMAAA VVVVxx +565 8592 1 1 5 5 65 565 565 565 565 130 131 TVAAAA MSMAAA AAAAxx +9284 8593 0 0 4 4 84 284 1284 4284 9284 168 169 CTAAAA NSMAAA HHHHxx +7886 8594 0 2 6 6 86 886 1886 2886 7886 172 173 IRAAAA OSMAAA OOOOxx +122 8595 0 2 2 2 22 122 122 122 122 44 45 SEAAAA PSMAAA VVVVxx +4934 8596 0 2 4 14 34 934 934 4934 4934 68 69 UHAAAA QSMAAA AAAAxx +1766 8597 0 2 6 6 66 766 1766 1766 1766 132 133 YPAAAA RSMAAA HHHHxx +2554 8598 0 2 4 14 54 554 554 2554 2554 108 109 GUAAAA SSMAAA OOOOxx +488 8599 0 0 8 8 88 488 488 488 488 176 177 USAAAA TSMAAA VVVVxx +825 8600 1 1 5 5 25 825 825 825 825 50 51 TFAAAA USMAAA AAAAxx +678 8601 0 2 8 18 78 678 678 678 678 156 157 CAAAAA VSMAAA HHHHxx +4543 8602 1 3 3 3 43 543 543 4543 4543 86 87 TSAAAA WSMAAA OOOOxx +1699 8603 1 3 9 19 99 699 1699 1699 1699 198 199 JNAAAA XSMAAA VVVVxx +3771 8604 1 3 1 11 71 771 1771 3771 3771 142 143 BPAAAA YSMAAA AAAAxx +1234 8605 0 2 4 14 34 234 1234 1234 1234 68 69 MVAAAA ZSMAAA HHHHxx +4152 8606 0 0 2 12 52 152 152 4152 4152 104 105 SDAAAA ATMAAA OOOOxx +1632 8607 0 0 2 12 32 632 1632 1632 1632 64 65 UKAAAA BTMAAA VVVVxx +4988 8608 0 0 8 8 88 988 988 4988 4988 176 177 WJAAAA CTMAAA AAAAxx +1980 8609 0 0 0 0 80 980 1980 1980 1980 160 161 EYAAAA DTMAAA HHHHxx +7479 8610 1 3 9 19 79 479 1479 2479 7479 158 159 RBAAAA ETMAAA OOOOxx +2586 8611 0 2 6 6 86 586 586 2586 2586 172 173 MVAAAA FTMAAA VVVVxx +5433 8612 1 1 3 13 33 433 1433 433 5433 66 67 ZAAAAA GTMAAA AAAAxx +2261 8613 1 1 1 1 61 261 261 2261 2261 122 123 ZIAAAA HTMAAA HHHHxx +1180 8614 0 0 0 0 80 180 1180 1180 1180 160 161 KTAAAA ITMAAA OOOOxx +3938 8615 0 2 8 18 38 938 1938 3938 3938 76 77 MVAAAA JTMAAA VVVVxx +6714 8616 0 2 4 14 14 714 714 1714 6714 28 29 GYAAAA KTMAAA AAAAxx +2890 8617 0 2 0 10 90 890 890 2890 2890 180 181 EHAAAA LTMAAA HHHHxx +7379 8618 1 3 9 19 79 379 1379 2379 7379 158 159 VXAAAA MTMAAA OOOOxx +5896 8619 0 0 6 16 96 896 1896 896 5896 192 193 USAAAA NTMAAA VVVVxx +5949 8620 1 1 9 9 49 949 1949 949 5949 98 99 VUAAAA OTMAAA AAAAxx +3194 8621 0 2 4 14 94 194 1194 3194 3194 188 189 WSAAAA PTMAAA HHHHxx +9325 8622 1 1 5 5 25 325 1325 4325 9325 50 51 RUAAAA QTMAAA OOOOxx +9531 8623 1 3 1 11 31 531 1531 4531 9531 62 63 PCAAAA RTMAAA VVVVxx +711 8624 1 3 1 11 11 711 711 711 711 22 23 JBAAAA STMAAA AAAAxx +2450 8625 0 2 0 10 50 450 450 2450 2450 100 101 GQAAAA TTMAAA HHHHxx +1929 8626 1 1 9 9 29 929 1929 1929 1929 58 59 FWAAAA UTMAAA OOOOxx +6165 8627 1 1 5 5 65 165 165 1165 6165 130 131 DDAAAA VTMAAA VVVVxx +4050 8628 0 2 0 10 50 50 50 4050 4050 100 101 UZAAAA WTMAAA AAAAxx +9011 8629 1 3 1 11 11 11 1011 4011 9011 22 23 PIAAAA XTMAAA HHHHxx +7916 8630 0 0 6 16 16 916 1916 2916 7916 32 33 MSAAAA YTMAAA OOOOxx +9136 8631 0 0 6 16 36 136 1136 4136 9136 72 73 KNAAAA ZTMAAA VVVVxx +8782 8632 0 2 2 2 82 782 782 3782 8782 164 165 UZAAAA AUMAAA AAAAxx +8491 8633 1 3 1 11 91 491 491 3491 8491 182 183 POAAAA BUMAAA HHHHxx +5114 8634 0 2 4 14 14 114 1114 114 5114 28 29 SOAAAA CUMAAA OOOOxx +5815 8635 1 3 5 15 15 815 1815 815 5815 30 31 RPAAAA DUMAAA VVVVxx +5628 8636 0 0 8 8 28 628 1628 628 5628 56 57 MIAAAA EUMAAA AAAAxx +810 8637 0 2 0 10 10 810 810 810 810 20 21 EFAAAA FUMAAA HHHHxx +6178 8638 0 2 8 18 78 178 178 1178 6178 156 157 QDAAAA GUMAAA OOOOxx +2619 8639 1 3 9 19 19 619 619 2619 2619 38 39 TWAAAA HUMAAA VVVVxx +3340 8640 0 0 0 0 40 340 1340 3340 3340 80 81 MYAAAA IUMAAA AAAAxx +2491 8641 1 3 1 11 91 491 491 2491 2491 182 183 VRAAAA JUMAAA HHHHxx +3574 8642 0 2 4 14 74 574 1574 3574 3574 148 149 MHAAAA KUMAAA OOOOxx +6754 8643 0 2 4 14 54 754 754 1754 6754 108 109 UZAAAA LUMAAA VVVVxx +1566 8644 0 2 6 6 66 566 1566 1566 1566 132 133 GIAAAA MUMAAA AAAAxx +9174 8645 0 2 4 14 74 174 1174 4174 9174 148 149 WOAAAA NUMAAA HHHHxx +1520 8646 0 0 0 0 20 520 1520 1520 1520 40 41 MGAAAA OUMAAA OOOOxx +2691 8647 1 3 1 11 91 691 691 2691 2691 182 183 NZAAAA PUMAAA VVVVxx +6961 8648 1 1 1 1 61 961 961 1961 6961 122 123 THAAAA QUMAAA AAAAxx +5722 8649 0 2 2 2 22 722 1722 722 5722 44 45 CMAAAA RUMAAA HHHHxx +9707 8650 1 3 7 7 7 707 1707 4707 9707 14 15 JJAAAA SUMAAA OOOOxx +2891 8651 1 3 1 11 91 891 891 2891 2891 182 183 FHAAAA TUMAAA VVVVxx +341 8652 1 1 1 1 41 341 341 341 341 82 83 DNAAAA UUMAAA AAAAxx +4690 8653 0 2 0 10 90 690 690 4690 4690 180 181 KYAAAA VUMAAA HHHHxx +7841 8654 1 1 1 1 41 841 1841 2841 7841 82 83 PPAAAA WUMAAA OOOOxx +6615 8655 1 3 5 15 15 615 615 1615 6615 30 31 LUAAAA XUMAAA VVVVxx +9169 8656 1 1 9 9 69 169 1169 4169 9169 138 139 ROAAAA YUMAAA AAAAxx +6689 8657 1 1 9 9 89 689 689 1689 6689 178 179 HXAAAA ZUMAAA HHHHxx +8721 8658 1 1 1 1 21 721 721 3721 8721 42 43 LXAAAA AVMAAA OOOOxx +7508 8659 0 0 8 8 8 508 1508 2508 7508 16 17 UCAAAA BVMAAA VVVVxx +8631 8660 1 3 1 11 31 631 631 3631 8631 62 63 ZTAAAA CVMAAA AAAAxx +480 8661 0 0 0 0 80 480 480 480 480 160 161 MSAAAA DVMAAA HHHHxx +7094 8662 0 2 4 14 94 94 1094 2094 7094 188 189 WMAAAA EVMAAA OOOOxx +319 8663 1 3 9 19 19 319 319 319 319 38 39 HMAAAA FVMAAA VVVVxx +9421 8664 1 1 1 1 21 421 1421 4421 9421 42 43 JYAAAA GVMAAA AAAAxx +4352 8665 0 0 2 12 52 352 352 4352 4352 104 105 KLAAAA HVMAAA HHHHxx +5019 8666 1 3 9 19 19 19 1019 19 5019 38 39 BLAAAA IVMAAA OOOOxx +3956 8667 0 0 6 16 56 956 1956 3956 3956 112 113 EWAAAA JVMAAA VVVVxx +114 8668 0 2 4 14 14 114 114 114 114 28 29 KEAAAA KVMAAA AAAAxx +1196 8669 0 0 6 16 96 196 1196 1196 1196 192 193 AUAAAA LVMAAA HHHHxx +1407 8670 1 3 7 7 7 407 1407 1407 1407 14 15 DCAAAA MVMAAA OOOOxx +7432 8671 0 0 2 12 32 432 1432 2432 7432 64 65 WZAAAA NVMAAA VVVVxx +3141 8672 1 1 1 1 41 141 1141 3141 3141 82 83 VQAAAA OVMAAA AAAAxx +2073 8673 1 1 3 13 73 73 73 2073 2073 146 147 TBAAAA PVMAAA HHHHxx +3400 8674 0 0 0 0 0 400 1400 3400 3400 0 1 UAAAAA QVMAAA OOOOxx +505 8675 1 1 5 5 5 505 505 505 505 10 11 LTAAAA RVMAAA VVVVxx +1263 8676 1 3 3 3 63 263 1263 1263 1263 126 127 PWAAAA SVMAAA AAAAxx +190 8677 0 2 0 10 90 190 190 190 190 180 181 IHAAAA TVMAAA HHHHxx +6686 8678 0 2 6 6 86 686 686 1686 6686 172 173 EXAAAA UVMAAA OOOOxx +9821 8679 1 1 1 1 21 821 1821 4821 9821 42 43 TNAAAA VVMAAA VVVVxx +1119 8680 1 3 9 19 19 119 1119 1119 1119 38 39 BRAAAA WVMAAA AAAAxx +2955 8681 1 3 5 15 55 955 955 2955 2955 110 111 RJAAAA XVMAAA HHHHxx +224 8682 0 0 4 4 24 224 224 224 224 48 49 QIAAAA YVMAAA OOOOxx +7562 8683 0 2 2 2 62 562 1562 2562 7562 124 125 WEAAAA ZVMAAA VVVVxx +8845 8684 1 1 5 5 45 845 845 3845 8845 90 91 FCAAAA AWMAAA AAAAxx +5405 8685 1 1 5 5 5 405 1405 405 5405 10 11 XZAAAA BWMAAA HHHHxx +9192 8686 0 0 2 12 92 192 1192 4192 9192 184 185 OPAAAA CWMAAA OOOOxx +4927 8687 1 3 7 7 27 927 927 4927 4927 54 55 NHAAAA DWMAAA VVVVxx +997 8688 1 1 7 17 97 997 997 997 997 194 195 JMAAAA EWMAAA AAAAxx +989 8689 1 1 9 9 89 989 989 989 989 178 179 BMAAAA FWMAAA HHHHxx +7258 8690 0 2 8 18 58 258 1258 2258 7258 116 117 ETAAAA GWMAAA OOOOxx +6899 8691 1 3 9 19 99 899 899 1899 6899 198 199 JFAAAA HWMAAA VVVVxx +1770 8692 0 2 0 10 70 770 1770 1770 1770 140 141 CQAAAA IWMAAA AAAAxx +4423 8693 1 3 3 3 23 423 423 4423 4423 46 47 DOAAAA JWMAAA HHHHxx +5671 8694 1 3 1 11 71 671 1671 671 5671 142 143 DKAAAA KWMAAA OOOOxx +8393 8695 1 1 3 13 93 393 393 3393 8393 186 187 VKAAAA LWMAAA VVVVxx +4355 8696 1 3 5 15 55 355 355 4355 4355 110 111 NLAAAA MWMAAA AAAAxx +3919 8697 1 3 9 19 19 919 1919 3919 3919 38 39 TUAAAA NWMAAA HHHHxx +338 8698 0 2 8 18 38 338 338 338 338 76 77 ANAAAA OWMAAA OOOOxx +5790 8699 0 2 0 10 90 790 1790 790 5790 180 181 SOAAAA PWMAAA VVVVxx +1452 8700 0 0 2 12 52 452 1452 1452 1452 104 105 WDAAAA QWMAAA AAAAxx +939 8701 1 3 9 19 39 939 939 939 939 78 79 DKAAAA RWMAAA HHHHxx +8913 8702 1 1 3 13 13 913 913 3913 8913 26 27 VEAAAA SWMAAA OOOOxx +7157 8703 1 1 7 17 57 157 1157 2157 7157 114 115 HPAAAA TWMAAA VVVVxx +7240 8704 0 0 0 0 40 240 1240 2240 7240 80 81 MSAAAA UWMAAA AAAAxx +3492 8705 0 0 2 12 92 492 1492 3492 3492 184 185 IEAAAA VWMAAA HHHHxx +3464 8706 0 0 4 4 64 464 1464 3464 3464 128 129 GDAAAA WWMAAA OOOOxx +388 8707 0 0 8 8 88 388 388 388 388 176 177 YOAAAA XWMAAA VVVVxx +4135 8708 1 3 5 15 35 135 135 4135 4135 70 71 BDAAAA YWMAAA AAAAxx +1194 8709 0 2 4 14 94 194 1194 1194 1194 188 189 YTAAAA ZWMAAA HHHHxx +5476 8710 0 0 6 16 76 476 1476 476 5476 152 153 QCAAAA AXMAAA OOOOxx +9844 8711 0 0 4 4 44 844 1844 4844 9844 88 89 QOAAAA BXMAAA VVVVxx +9364 8712 0 0 4 4 64 364 1364 4364 9364 128 129 EWAAAA CXMAAA AAAAxx +5238 8713 0 2 8 18 38 238 1238 238 5238 76 77 MTAAAA DXMAAA HHHHxx +3712 8714 0 0 2 12 12 712 1712 3712 3712 24 25 UMAAAA EXMAAA OOOOxx +6189 8715 1 1 9 9 89 189 189 1189 6189 178 179 BEAAAA FXMAAA VVVVxx +5257 8716 1 1 7 17 57 257 1257 257 5257 114 115 FUAAAA GXMAAA AAAAxx +81 8717 1 1 1 1 81 81 81 81 81 162 163 DDAAAA HXMAAA HHHHxx +3289 8718 1 1 9 9 89 289 1289 3289 3289 178 179 NWAAAA IXMAAA OOOOxx +1177 8719 1 1 7 17 77 177 1177 1177 1177 154 155 HTAAAA JXMAAA VVVVxx +5038 8720 0 2 8 18 38 38 1038 38 5038 76 77 ULAAAA KXMAAA AAAAxx +325 8721 1 1 5 5 25 325 325 325 325 50 51 NMAAAA LXMAAA HHHHxx +7221 8722 1 1 1 1 21 221 1221 2221 7221 42 43 TRAAAA MXMAAA OOOOxx +7123 8723 1 3 3 3 23 123 1123 2123 7123 46 47 ZNAAAA NXMAAA VVVVxx +6364 8724 0 0 4 4 64 364 364 1364 6364 128 129 UKAAAA OXMAAA AAAAxx +4468 8725 0 0 8 8 68 468 468 4468 4468 136 137 WPAAAA PXMAAA HHHHxx +9185 8726 1 1 5 5 85 185 1185 4185 9185 170 171 HPAAAA QXMAAA OOOOxx +4158 8727 0 2 8 18 58 158 158 4158 4158 116 117 YDAAAA RXMAAA VVVVxx +9439 8728 1 3 9 19 39 439 1439 4439 9439 78 79 BZAAAA SXMAAA AAAAxx +7759 8729 1 3 9 19 59 759 1759 2759 7759 118 119 LMAAAA TXMAAA HHHHxx +3325 8730 1 1 5 5 25 325 1325 3325 3325 50 51 XXAAAA UXMAAA OOOOxx +7991 8731 1 3 1 11 91 991 1991 2991 7991 182 183 JVAAAA VXMAAA VVVVxx +1650 8732 0 2 0 10 50 650 1650 1650 1650 100 101 MLAAAA WXMAAA AAAAxx +8395 8733 1 3 5 15 95 395 395 3395 8395 190 191 XKAAAA XXMAAA HHHHxx +286 8734 0 2 6 6 86 286 286 286 286 172 173 ALAAAA YXMAAA OOOOxx +1507 8735 1 3 7 7 7 507 1507 1507 1507 14 15 ZFAAAA ZXMAAA VVVVxx +4122 8736 0 2 2 2 22 122 122 4122 4122 44 45 OCAAAA AYMAAA AAAAxx +2625 8737 1 1 5 5 25 625 625 2625 2625 50 51 ZWAAAA BYMAAA HHHHxx +1140 8738 0 0 0 0 40 140 1140 1140 1140 80 81 WRAAAA CYMAAA OOOOxx +5262 8739 0 2 2 2 62 262 1262 262 5262 124 125 KUAAAA DYMAAA VVVVxx +4919 8740 1 3 9 19 19 919 919 4919 4919 38 39 FHAAAA EYMAAA AAAAxx +7266 8741 0 2 6 6 66 266 1266 2266 7266 132 133 MTAAAA FYMAAA HHHHxx +630 8742 0 2 0 10 30 630 630 630 630 60 61 GYAAAA GYMAAA OOOOxx +2129 8743 1 1 9 9 29 129 129 2129 2129 58 59 XDAAAA HYMAAA VVVVxx +9552 8744 0 0 2 12 52 552 1552 4552 9552 104 105 KDAAAA IYMAAA AAAAxx +3018 8745 0 2 8 18 18 18 1018 3018 3018 36 37 CMAAAA JYMAAA HHHHxx +7145 8746 1 1 5 5 45 145 1145 2145 7145 90 91 VOAAAA KYMAAA OOOOxx +1633 8747 1 1 3 13 33 633 1633 1633 1633 66 67 VKAAAA LYMAAA VVVVxx +7957 8748 1 1 7 17 57 957 1957 2957 7957 114 115 BUAAAA MYMAAA AAAAxx +774 8749 0 2 4 14 74 774 774 774 774 148 149 UDAAAA NYMAAA HHHHxx +9371 8750 1 3 1 11 71 371 1371 4371 9371 142 143 LWAAAA OYMAAA OOOOxx +6007 8751 1 3 7 7 7 7 7 1007 6007 14 15 BXAAAA PYMAAA VVVVxx +5277 8752 1 1 7 17 77 277 1277 277 5277 154 155 ZUAAAA QYMAAA AAAAxx +9426 8753 0 2 6 6 26 426 1426 4426 9426 52 53 OYAAAA RYMAAA HHHHxx +9190 8754 0 2 0 10 90 190 1190 4190 9190 180 181 MPAAAA SYMAAA OOOOxx +8996 8755 0 0 6 16 96 996 996 3996 8996 192 193 AIAAAA TYMAAA VVVVxx +3409 8756 1 1 9 9 9 409 1409 3409 3409 18 19 DBAAAA UYMAAA AAAAxx +7212 8757 0 0 2 12 12 212 1212 2212 7212 24 25 KRAAAA VYMAAA HHHHxx +416 8758 0 0 6 16 16 416 416 416 416 32 33 AQAAAA WYMAAA OOOOxx +7211 8759 1 3 1 11 11 211 1211 2211 7211 22 23 JRAAAA XYMAAA VVVVxx +7454 8760 0 2 4 14 54 454 1454 2454 7454 108 109 SAAAAA YYMAAA AAAAxx +8417 8761 1 1 7 17 17 417 417 3417 8417 34 35 TLAAAA ZYMAAA HHHHxx +5562 8762 0 2 2 2 62 562 1562 562 5562 124 125 YFAAAA AZMAAA OOOOxx +4996 8763 0 0 6 16 96 996 996 4996 4996 192 193 EKAAAA BZMAAA VVVVxx +5718 8764 0 2 8 18 18 718 1718 718 5718 36 37 YLAAAA CZMAAA AAAAxx +7838 8765 0 2 8 18 38 838 1838 2838 7838 76 77 MPAAAA DZMAAA HHHHxx +7715 8766 1 3 5 15 15 715 1715 2715 7715 30 31 TKAAAA EZMAAA OOOOxx +2780 8767 0 0 0 0 80 780 780 2780 2780 160 161 YCAAAA FZMAAA VVVVxx +1013 8768 1 1 3 13 13 13 1013 1013 1013 26 27 ZMAAAA GZMAAA AAAAxx +8465 8769 1 1 5 5 65 465 465 3465 8465 130 131 PNAAAA HZMAAA HHHHxx +7976 8770 0 0 6 16 76 976 1976 2976 7976 152 153 UUAAAA IZMAAA OOOOxx +7150 8771 0 2 0 10 50 150 1150 2150 7150 100 101 APAAAA JZMAAA VVVVxx +6471 8772 1 3 1 11 71 471 471 1471 6471 142 143 XOAAAA KZMAAA AAAAxx +1927 8773 1 3 7 7 27 927 1927 1927 1927 54 55 DWAAAA LZMAAA HHHHxx +227 8774 1 3 7 7 27 227 227 227 227 54 55 TIAAAA MZMAAA OOOOxx +6462 8775 0 2 2 2 62 462 462 1462 6462 124 125 OOAAAA NZMAAA VVVVxx +5227 8776 1 3 7 7 27 227 1227 227 5227 54 55 BTAAAA OZMAAA AAAAxx +1074 8777 0 2 4 14 74 74 1074 1074 1074 148 149 IPAAAA PZMAAA HHHHxx +9448 8778 0 0 8 8 48 448 1448 4448 9448 96 97 KZAAAA QZMAAA OOOOxx +4459 8779 1 3 9 19 59 459 459 4459 4459 118 119 NPAAAA RZMAAA VVVVxx +2478 8780 0 2 8 18 78 478 478 2478 2478 156 157 IRAAAA SZMAAA AAAAxx +5005 8781 1 1 5 5 5 5 1005 5 5005 10 11 NKAAAA TZMAAA HHHHxx +2418 8782 0 2 8 18 18 418 418 2418 2418 36 37 APAAAA UZMAAA OOOOxx +6991 8783 1 3 1 11 91 991 991 1991 6991 182 183 XIAAAA VZMAAA VVVVxx +4729 8784 1 1 9 9 29 729 729 4729 4729 58 59 XZAAAA WZMAAA AAAAxx +3548 8785 0 0 8 8 48 548 1548 3548 3548 96 97 MGAAAA XZMAAA HHHHxx +9616 8786 0 0 6 16 16 616 1616 4616 9616 32 33 WFAAAA YZMAAA OOOOxx +2901 8787 1 1 1 1 1 901 901 2901 2901 2 3 PHAAAA ZZMAAA VVVVxx +10 8788 0 2 0 10 10 10 10 10 10 20 21 KAAAAA AANAAA AAAAxx +2637 8789 1 1 7 17 37 637 637 2637 2637 74 75 LXAAAA BANAAA HHHHxx +6747 8790 1 3 7 7 47 747 747 1747 6747 94 95 NZAAAA CANAAA OOOOxx +797 8791 1 1 7 17 97 797 797 797 797 194 195 REAAAA DANAAA VVVVxx +7609 8792 1 1 9 9 9 609 1609 2609 7609 18 19 RGAAAA EANAAA AAAAxx +8290 8793 0 2 0 10 90 290 290 3290 8290 180 181 WGAAAA FANAAA HHHHxx +8765 8794 1 1 5 5 65 765 765 3765 8765 130 131 DZAAAA GANAAA OOOOxx +8053 8795 1 1 3 13 53 53 53 3053 8053 106 107 TXAAAA HANAAA VVVVxx +5602 8796 0 2 2 2 2 602 1602 602 5602 4 5 MHAAAA IANAAA AAAAxx +3672 8797 0 0 2 12 72 672 1672 3672 3672 144 145 GLAAAA JANAAA HHHHxx +7513 8798 1 1 3 13 13 513 1513 2513 7513 26 27 ZCAAAA KANAAA OOOOxx +3462 8799 0 2 2 2 62 462 1462 3462 3462 124 125 EDAAAA LANAAA VVVVxx +4457 8800 1 1 7 17 57 457 457 4457 4457 114 115 LPAAAA MANAAA AAAAxx +6547 8801 1 3 7 7 47 547 547 1547 6547 94 95 VRAAAA NANAAA HHHHxx +7417 8802 1 1 7 17 17 417 1417 2417 7417 34 35 HZAAAA OANAAA OOOOxx +8641 8803 1 1 1 1 41 641 641 3641 8641 82 83 JUAAAA PANAAA VVVVxx +149 8804 1 1 9 9 49 149 149 149 149 98 99 TFAAAA QANAAA AAAAxx +5041 8805 1 1 1 1 41 41 1041 41 5041 82 83 XLAAAA RANAAA HHHHxx +9232 8806 0 0 2 12 32 232 1232 4232 9232 64 65 CRAAAA SANAAA OOOOxx +3603 8807 1 3 3 3 3 603 1603 3603 3603 6 7 PIAAAA TANAAA VVVVxx +2792 8808 0 0 2 12 92 792 792 2792 2792 184 185 KDAAAA UANAAA AAAAxx +6620 8809 0 0 0 0 20 620 620 1620 6620 40 41 QUAAAA VANAAA HHHHxx +4000 8810 0 0 0 0 0 0 0 4000 4000 0 1 WXAAAA WANAAA OOOOxx +659 8811 1 3 9 19 59 659 659 659 659 118 119 JZAAAA XANAAA VVVVxx +8174 8812 0 2 4 14 74 174 174 3174 8174 148 149 KCAAAA YANAAA AAAAxx +4599 8813 1 3 9 19 99 599 599 4599 4599 198 199 XUAAAA ZANAAA HHHHxx +7851 8814 1 3 1 11 51 851 1851 2851 7851 102 103 ZPAAAA ABNAAA OOOOxx +6284 8815 0 0 4 4 84 284 284 1284 6284 168 169 SHAAAA BBNAAA VVVVxx +7116 8816 0 0 6 16 16 116 1116 2116 7116 32 33 SNAAAA CBNAAA AAAAxx +5595 8817 1 3 5 15 95 595 1595 595 5595 190 191 FHAAAA DBNAAA HHHHxx +2903 8818 1 3 3 3 3 903 903 2903 2903 6 7 RHAAAA EBNAAA OOOOxx +5948 8819 0 0 8 8 48 948 1948 948 5948 96 97 UUAAAA FBNAAA VVVVxx +225 8820 1 1 5 5 25 225 225 225 225 50 51 RIAAAA GBNAAA AAAAxx +524 8821 0 0 4 4 24 524 524 524 524 48 49 EUAAAA HBNAAA HHHHxx +7639 8822 1 3 9 19 39 639 1639 2639 7639 78 79 VHAAAA IBNAAA OOOOxx +7297 8823 1 1 7 17 97 297 1297 2297 7297 194 195 RUAAAA JBNAAA VVVVxx +2606 8824 0 2 6 6 6 606 606 2606 2606 12 13 GWAAAA KBNAAA AAAAxx +4771 8825 1 3 1 11 71 771 771 4771 4771 142 143 NBAAAA LBNAAA HHHHxx +8162 8826 0 2 2 2 62 162 162 3162 8162 124 125 YBAAAA MBNAAA OOOOxx +8999 8827 1 3 9 19 99 999 999 3999 8999 198 199 DIAAAA NBNAAA VVVVxx +2309 8828 1 1 9 9 9 309 309 2309 2309 18 19 VKAAAA OBNAAA AAAAxx +3594 8829 0 2 4 14 94 594 1594 3594 3594 188 189 GIAAAA PBNAAA HHHHxx +6092 8830 0 0 2 12 92 92 92 1092 6092 184 185 IAAAAA QBNAAA OOOOxx +7467 8831 1 3 7 7 67 467 1467 2467 7467 134 135 FBAAAA RBNAAA VVVVxx +6986 8832 0 2 6 6 86 986 986 1986 6986 172 173 SIAAAA SBNAAA AAAAxx +9898 8833 0 2 8 18 98 898 1898 4898 9898 196 197 SQAAAA TBNAAA HHHHxx +9578 8834 0 2 8 18 78 578 1578 4578 9578 156 157 KEAAAA UBNAAA OOOOxx +156 8835 0 0 6 16 56 156 156 156 156 112 113 AGAAAA VBNAAA VVVVxx +5810 8836 0 2 0 10 10 810 1810 810 5810 20 21 MPAAAA WBNAAA AAAAxx +790 8837 0 2 0 10 90 790 790 790 790 180 181 KEAAAA XBNAAA HHHHxx +6840 8838 0 0 0 0 40 840 840 1840 6840 80 81 CDAAAA YBNAAA OOOOxx +6725 8839 1 1 5 5 25 725 725 1725 6725 50 51 RYAAAA ZBNAAA VVVVxx +5528 8840 0 0 8 8 28 528 1528 528 5528 56 57 QEAAAA ACNAAA AAAAxx +4120 8841 0 0 0 0 20 120 120 4120 4120 40 41 MCAAAA BCNAAA HHHHxx +6694 8842 0 2 4 14 94 694 694 1694 6694 188 189 MXAAAA CCNAAA OOOOxx +3552 8843 0 0 2 12 52 552 1552 3552 3552 104 105 QGAAAA DCNAAA VVVVxx +1478 8844 0 2 8 18 78 478 1478 1478 1478 156 157 WEAAAA ECNAAA AAAAxx +8084 8845 0 0 4 4 84 84 84 3084 8084 168 169 YYAAAA FCNAAA HHHHxx +7578 8846 0 2 8 18 78 578 1578 2578 7578 156 157 MFAAAA GCNAAA OOOOxx +6314 8847 0 2 4 14 14 314 314 1314 6314 28 29 WIAAAA HCNAAA VVVVxx +6123 8848 1 3 3 3 23 123 123 1123 6123 46 47 NBAAAA ICNAAA AAAAxx +9443 8849 1 3 3 3 43 443 1443 4443 9443 86 87 FZAAAA JCNAAA HHHHxx +9628 8850 0 0 8 8 28 628 1628 4628 9628 56 57 IGAAAA KCNAAA OOOOxx +8508 8851 0 0 8 8 8 508 508 3508 8508 16 17 GPAAAA LCNAAA VVVVxx +5552 8852 0 0 2 12 52 552 1552 552 5552 104 105 OFAAAA MCNAAA AAAAxx +5327 8853 1 3 7 7 27 327 1327 327 5327 54 55 XWAAAA NCNAAA HHHHxx +7771 8854 1 3 1 11 71 771 1771 2771 7771 142 143 XMAAAA OCNAAA OOOOxx +8932 8855 0 0 2 12 32 932 932 3932 8932 64 65 OFAAAA PCNAAA VVVVxx +3526 8856 0 2 6 6 26 526 1526 3526 3526 52 53 QFAAAA QCNAAA AAAAxx +4340 8857 0 0 0 0 40 340 340 4340 4340 80 81 YKAAAA RCNAAA HHHHxx +9419 8858 1 3 9 19 19 419 1419 4419 9419 38 39 HYAAAA SCNAAA OOOOxx +8421 8859 1 1 1 1 21 421 421 3421 8421 42 43 XLAAAA TCNAAA VVVVxx +7431 8860 1 3 1 11 31 431 1431 2431 7431 62 63 VZAAAA UCNAAA AAAAxx +172 8861 0 0 2 12 72 172 172 172 172 144 145 QGAAAA VCNAAA HHHHxx +3279 8862 1 3 9 19 79 279 1279 3279 3279 158 159 DWAAAA WCNAAA OOOOxx +1508 8863 0 0 8 8 8 508 1508 1508 1508 16 17 AGAAAA XCNAAA VVVVxx +7091 8864 1 3 1 11 91 91 1091 2091 7091 182 183 TMAAAA YCNAAA AAAAxx +1419 8865 1 3 9 19 19 419 1419 1419 1419 38 39 PCAAAA ZCNAAA HHHHxx +3032 8866 0 0 2 12 32 32 1032 3032 3032 64 65 QMAAAA ADNAAA OOOOxx +8683 8867 1 3 3 3 83 683 683 3683 8683 166 167 ZVAAAA BDNAAA VVVVxx +4763 8868 1 3 3 3 63 763 763 4763 4763 126 127 FBAAAA CDNAAA AAAAxx +4424 8869 0 0 4 4 24 424 424 4424 4424 48 49 EOAAAA DDNAAA HHHHxx +8640 8870 0 0 0 0 40 640 640 3640 8640 80 81 IUAAAA EDNAAA OOOOxx +7187 8871 1 3 7 7 87 187 1187 2187 7187 174 175 LQAAAA FDNAAA VVVVxx +6247 8872 1 3 7 7 47 247 247 1247 6247 94 95 HGAAAA GDNAAA AAAAxx +7340 8873 0 0 0 0 40 340 1340 2340 7340 80 81 IWAAAA HDNAAA HHHHxx +182 8874 0 2 2 2 82 182 182 182 182 164 165 AHAAAA IDNAAA OOOOxx +2948 8875 0 0 8 8 48 948 948 2948 2948 96 97 KJAAAA JDNAAA VVVVxx +9462 8876 0 2 2 2 62 462 1462 4462 9462 124 125 YZAAAA KDNAAA AAAAxx +5997 8877 1 1 7 17 97 997 1997 997 5997 194 195 RWAAAA LDNAAA HHHHxx +5608 8878 0 0 8 8 8 608 1608 608 5608 16 17 SHAAAA MDNAAA OOOOxx +1472 8879 0 0 2 12 72 472 1472 1472 1472 144 145 QEAAAA NDNAAA VVVVxx +277 8880 1 1 7 17 77 277 277 277 277 154 155 RKAAAA ODNAAA AAAAxx +4807 8881 1 3 7 7 7 807 807 4807 4807 14 15 XCAAAA PDNAAA HHHHxx +4969 8882 1 1 9 9 69 969 969 4969 4969 138 139 DJAAAA QDNAAA OOOOxx +5611 8883 1 3 1 11 11 611 1611 611 5611 22 23 VHAAAA RDNAAA VVVVxx +372 8884 0 0 2 12 72 372 372 372 372 144 145 IOAAAA SDNAAA AAAAxx +6666 8885 0 2 6 6 66 666 666 1666 6666 132 133 KWAAAA TDNAAA HHHHxx +476 8886 0 0 6 16 76 476 476 476 476 152 153 ISAAAA UDNAAA OOOOxx +5225 8887 1 1 5 5 25 225 1225 225 5225 50 51 ZSAAAA VDNAAA VVVVxx +5143 8888 1 3 3 3 43 143 1143 143 5143 86 87 VPAAAA WDNAAA AAAAxx +1853 8889 1 1 3 13 53 853 1853 1853 1853 106 107 HTAAAA XDNAAA HHHHxx +675 8890 1 3 5 15 75 675 675 675 675 150 151 ZZAAAA YDNAAA OOOOxx +5643 8891 1 3 3 3 43 643 1643 643 5643 86 87 BJAAAA ZDNAAA VVVVxx +5317 8892 1 1 7 17 17 317 1317 317 5317 34 35 NWAAAA AENAAA AAAAxx +8102 8893 0 2 2 2 2 102 102 3102 8102 4 5 QZAAAA BENAAA HHHHxx +978 8894 0 2 8 18 78 978 978 978 978 156 157 QLAAAA CENAAA OOOOxx +4620 8895 0 0 0 0 20 620 620 4620 4620 40 41 SVAAAA DENAAA VVVVxx +151 8896 1 3 1 11 51 151 151 151 151 102 103 VFAAAA EENAAA AAAAxx +972 8897 0 0 2 12 72 972 972 972 972 144 145 KLAAAA FENAAA HHHHxx +6820 8898 0 0 0 0 20 820 820 1820 6820 40 41 ICAAAA GENAAA OOOOxx +7387 8899 1 3 7 7 87 387 1387 2387 7387 174 175 DYAAAA HENAAA VVVVxx +9634 8900 0 2 4 14 34 634 1634 4634 9634 68 69 OGAAAA IENAAA AAAAxx +6308 8901 0 0 8 8 8 308 308 1308 6308 16 17 QIAAAA JENAAA HHHHxx +8323 8902 1 3 3 3 23 323 323 3323 8323 46 47 DIAAAA KENAAA OOOOxx +6672 8903 0 0 2 12 72 672 672 1672 6672 144 145 QWAAAA LENAAA VVVVxx +8283 8904 1 3 3 3 83 283 283 3283 8283 166 167 PGAAAA MENAAA AAAAxx +7996 8905 0 0 6 16 96 996 1996 2996 7996 192 193 OVAAAA NENAAA HHHHxx +6488 8906 0 0 8 8 88 488 488 1488 6488 176 177 OPAAAA OENAAA OOOOxx +2365 8907 1 1 5 5 65 365 365 2365 2365 130 131 ZMAAAA PENAAA VVVVxx +9746 8908 0 2 6 6 46 746 1746 4746 9746 92 93 WKAAAA QENAAA AAAAxx +8605 8909 1 1 5 5 5 605 605 3605 8605 10 11 ZSAAAA RENAAA HHHHxx +3342 8910 0 2 2 2 42 342 1342 3342 3342 84 85 OYAAAA SENAAA OOOOxx +8429 8911 1 1 9 9 29 429 429 3429 8429 58 59 FMAAAA TENAAA VVVVxx +1162 8912 0 2 2 2 62 162 1162 1162 1162 124 125 SSAAAA UENAAA AAAAxx +531 8913 1 3 1 11 31 531 531 531 531 62 63 LUAAAA VENAAA HHHHxx +8408 8914 0 0 8 8 8 408 408 3408 8408 16 17 KLAAAA WENAAA OOOOxx +8862 8915 0 2 2 2 62 862 862 3862 8862 124 125 WCAAAA XENAAA VVVVxx +5843 8916 1 3 3 3 43 843 1843 843 5843 86 87 TQAAAA YENAAA AAAAxx +8704 8917 0 0 4 4 4 704 704 3704 8704 8 9 UWAAAA ZENAAA HHHHxx +7070 8918 0 2 0 10 70 70 1070 2070 7070 140 141 YLAAAA AFNAAA OOOOxx +9119 8919 1 3 9 19 19 119 1119 4119 9119 38 39 TMAAAA BFNAAA VVVVxx +8344 8920 0 0 4 4 44 344 344 3344 8344 88 89 YIAAAA CFNAAA AAAAxx +8979 8921 1 3 9 19 79 979 979 3979 8979 158 159 JHAAAA DFNAAA HHHHxx +2971 8922 1 3 1 11 71 971 971 2971 2971 142 143 HKAAAA EFNAAA OOOOxx +7700 8923 0 0 0 0 0 700 1700 2700 7700 0 1 EKAAAA FFNAAA VVVVxx +8280 8924 0 0 0 0 80 280 280 3280 8280 160 161 MGAAAA GFNAAA AAAAxx +9096 8925 0 0 6 16 96 96 1096 4096 9096 192 193 WLAAAA HFNAAA HHHHxx +99 8926 1 3 9 19 99 99 99 99 99 198 199 VDAAAA IFNAAA OOOOxx +6696 8927 0 0 6 16 96 696 696 1696 6696 192 193 OXAAAA JFNAAA VVVVxx +9490 8928 0 2 0 10 90 490 1490 4490 9490 180 181 ABAAAA KFNAAA AAAAxx +9073 8929 1 1 3 13 73 73 1073 4073 9073 146 147 ZKAAAA LFNAAA HHHHxx +1861 8930 1 1 1 1 61 861 1861 1861 1861 122 123 PTAAAA MFNAAA OOOOxx +4413 8931 1 1 3 13 13 413 413 4413 4413 26 27 TNAAAA NFNAAA VVVVxx +6002 8932 0 2 2 2 2 2 2 1002 6002 4 5 WWAAAA OFNAAA AAAAxx +439 8933 1 3 9 19 39 439 439 439 439 78 79 XQAAAA PFNAAA HHHHxx +5449 8934 1 1 9 9 49 449 1449 449 5449 98 99 PBAAAA QFNAAA OOOOxx +9737 8935 1 1 7 17 37 737 1737 4737 9737 74 75 NKAAAA RFNAAA VVVVxx +1898 8936 0 2 8 18 98 898 1898 1898 1898 196 197 AVAAAA SFNAAA AAAAxx +4189 8937 1 1 9 9 89 189 189 4189 4189 178 179 DFAAAA TFNAAA HHHHxx +1408 8938 0 0 8 8 8 408 1408 1408 1408 16 17 ECAAAA UFNAAA OOOOxx +394 8939 0 2 4 14 94 394 394 394 394 188 189 EPAAAA VFNAAA VVVVxx +1935 8940 1 3 5 15 35 935 1935 1935 1935 70 71 LWAAAA WFNAAA AAAAxx +3965 8941 1 1 5 5 65 965 1965 3965 3965 130 131 NWAAAA XFNAAA HHHHxx +6821 8942 1 1 1 1 21 821 821 1821 6821 42 43 JCAAAA YFNAAA OOOOxx +349 8943 1 1 9 9 49 349 349 349 349 98 99 LNAAAA ZFNAAA VVVVxx +8428 8944 0 0 8 8 28 428 428 3428 8428 56 57 EMAAAA AGNAAA AAAAxx +8200 8945 0 0 0 0 0 200 200 3200 8200 0 1 KDAAAA BGNAAA HHHHxx +1737 8946 1 1 7 17 37 737 1737 1737 1737 74 75 VOAAAA CGNAAA OOOOxx +6516 8947 0 0 6 16 16 516 516 1516 6516 32 33 QQAAAA DGNAAA VVVVxx +5441 8948 1 1 1 1 41 441 1441 441 5441 82 83 HBAAAA EGNAAA AAAAxx +5999 8949 1 3 9 19 99 999 1999 999 5999 198 199 TWAAAA FGNAAA HHHHxx +1539 8950 1 3 9 19 39 539 1539 1539 1539 78 79 FHAAAA GGNAAA OOOOxx +9067 8951 1 3 7 7 67 67 1067 4067 9067 134 135 TKAAAA HGNAAA VVVVxx +4061 8952 1 1 1 1 61 61 61 4061 4061 122 123 FAAAAA IGNAAA AAAAxx +1642 8953 0 2 2 2 42 642 1642 1642 1642 84 85 ELAAAA JGNAAA HHHHxx +4657 8954 1 1 7 17 57 657 657 4657 4657 114 115 DXAAAA KGNAAA OOOOxx +9934 8955 0 2 4 14 34 934 1934 4934 9934 68 69 CSAAAA LGNAAA VVVVxx +6385 8956 1 1 5 5 85 385 385 1385 6385 170 171 PLAAAA MGNAAA AAAAxx +6775 8957 1 3 5 15 75 775 775 1775 6775 150 151 PAAAAA NGNAAA HHHHxx +3873 8958 1 1 3 13 73 873 1873 3873 3873 146 147 ZSAAAA OGNAAA OOOOxx +3862 8959 0 2 2 2 62 862 1862 3862 3862 124 125 OSAAAA PGNAAA VVVVxx +1224 8960 0 0 4 4 24 224 1224 1224 1224 48 49 CVAAAA QGNAAA AAAAxx +4483 8961 1 3 3 3 83 483 483 4483 4483 166 167 LQAAAA RGNAAA HHHHxx +3685 8962 1 1 5 5 85 685 1685 3685 3685 170 171 TLAAAA SGNAAA OOOOxx +6082 8963 0 2 2 2 82 82 82 1082 6082 164 165 YZAAAA TGNAAA VVVVxx +7798 8964 0 2 8 18 98 798 1798 2798 7798 196 197 YNAAAA UGNAAA AAAAxx +9039 8965 1 3 9 19 39 39 1039 4039 9039 78 79 RJAAAA VGNAAA HHHHxx +985 8966 1 1 5 5 85 985 985 985 985 170 171 XLAAAA WGNAAA OOOOxx +5389 8967 1 1 9 9 89 389 1389 389 5389 178 179 HZAAAA XGNAAA VVVVxx +1716 8968 0 0 6 16 16 716 1716 1716 1716 32 33 AOAAAA YGNAAA AAAAxx +4209 8969 1 1 9 9 9 209 209 4209 4209 18 19 XFAAAA ZGNAAA HHHHxx +746 8970 0 2 6 6 46 746 746 746 746 92 93 SCAAAA AHNAAA OOOOxx +6295 8971 1 3 5 15 95 295 295 1295 6295 190 191 DIAAAA BHNAAA VVVVxx +9754 8972 0 2 4 14 54 754 1754 4754 9754 108 109 ELAAAA CHNAAA AAAAxx +2336 8973 0 0 6 16 36 336 336 2336 2336 72 73 WLAAAA DHNAAA HHHHxx +3701 8974 1 1 1 1 1 701 1701 3701 3701 2 3 JMAAAA EHNAAA OOOOxx +3551 8975 1 3 1 11 51 551 1551 3551 3551 102 103 PGAAAA FHNAAA VVVVxx +8516 8976 0 0 6 16 16 516 516 3516 8516 32 33 OPAAAA GHNAAA AAAAxx +9290 8977 0 2 0 10 90 290 1290 4290 9290 180 181 ITAAAA HHNAAA HHHHxx +5686 8978 0 2 6 6 86 686 1686 686 5686 172 173 SKAAAA IHNAAA OOOOxx +2893 8979 1 1 3 13 93 893 893 2893 2893 186 187 HHAAAA JHNAAA VVVVxx +6279 8980 1 3 9 19 79 279 279 1279 6279 158 159 NHAAAA KHNAAA AAAAxx +2278 8981 0 2 8 18 78 278 278 2278 2278 156 157 QJAAAA LHNAAA HHHHxx +1618 8982 0 2 8 18 18 618 1618 1618 1618 36 37 GKAAAA MHNAAA OOOOxx +3450 8983 0 2 0 10 50 450 1450 3450 3450 100 101 SCAAAA NHNAAA VVVVxx +8857 8984 1 1 7 17 57 857 857 3857 8857 114 115 RCAAAA OHNAAA AAAAxx +1005 8985 1 1 5 5 5 5 1005 1005 1005 10 11 RMAAAA PHNAAA HHHHxx +4727 8986 1 3 7 7 27 727 727 4727 4727 54 55 VZAAAA QHNAAA OOOOxx +7617 8987 1 1 7 17 17 617 1617 2617 7617 34 35 ZGAAAA RHNAAA VVVVxx +2021 8988 1 1 1 1 21 21 21 2021 2021 42 43 TZAAAA SHNAAA AAAAxx +9124 8989 0 0 4 4 24 124 1124 4124 9124 48 49 YMAAAA THNAAA HHHHxx +3175 8990 1 3 5 15 75 175 1175 3175 3175 150 151 DSAAAA UHNAAA OOOOxx +2949 8991 1 1 9 9 49 949 949 2949 2949 98 99 LJAAAA VHNAAA VVVVxx +2424 8992 0 0 4 4 24 424 424 2424 2424 48 49 GPAAAA WHNAAA AAAAxx +4791 8993 1 3 1 11 91 791 791 4791 4791 182 183 HCAAAA XHNAAA HHHHxx +7500 8994 0 0 0 0 0 500 1500 2500 7500 0 1 MCAAAA YHNAAA OOOOxx +4893 8995 1 1 3 13 93 893 893 4893 4893 186 187 FGAAAA ZHNAAA VVVVxx +121 8996 1 1 1 1 21 121 121 121 121 42 43 REAAAA AINAAA AAAAxx +1965 8997 1 1 5 5 65 965 1965 1965 1965 130 131 PXAAAA BINAAA HHHHxx +2972 8998 0 0 2 12 72 972 972 2972 2972 144 145 IKAAAA CINAAA OOOOxx +662 8999 0 2 2 2 62 662 662 662 662 124 125 MZAAAA DINAAA VVVVxx +7074 9000 0 2 4 14 74 74 1074 2074 7074 148 149 CMAAAA EINAAA AAAAxx +981 9001 1 1 1 1 81 981 981 981 981 162 163 TLAAAA FINAAA HHHHxx +3520 9002 0 0 0 0 20 520 1520 3520 3520 40 41 KFAAAA GINAAA OOOOxx +6540 9003 0 0 0 0 40 540 540 1540 6540 80 81 ORAAAA HINAAA VVVVxx +6648 9004 0 0 8 8 48 648 648 1648 6648 96 97 SVAAAA IINAAA AAAAxx +7076 9005 0 0 6 16 76 76 1076 2076 7076 152 153 EMAAAA JINAAA HHHHxx +6919 9006 1 3 9 19 19 919 919 1919 6919 38 39 DGAAAA KINAAA OOOOxx +1108 9007 0 0 8 8 8 108 1108 1108 1108 16 17 QQAAAA LINAAA VVVVxx +317 9008 1 1 7 17 17 317 317 317 317 34 35 FMAAAA MINAAA AAAAxx +3483 9009 1 3 3 3 83 483 1483 3483 3483 166 167 ZDAAAA NINAAA HHHHxx +6764 9010 0 0 4 4 64 764 764 1764 6764 128 129 EAAAAA OINAAA OOOOxx +1235 9011 1 3 5 15 35 235 1235 1235 1235 70 71 NVAAAA PINAAA VVVVxx +7121 9012 1 1 1 1 21 121 1121 2121 7121 42 43 XNAAAA QINAAA AAAAxx +426 9013 0 2 6 6 26 426 426 426 426 52 53 KQAAAA RINAAA HHHHxx +6880 9014 0 0 0 0 80 880 880 1880 6880 160 161 QEAAAA SINAAA OOOOxx +5401 9015 1 1 1 1 1 401 1401 401 5401 2 3 TZAAAA TINAAA VVVVxx +7323 9016 1 3 3 3 23 323 1323 2323 7323 46 47 RVAAAA UINAAA AAAAxx +9751 9017 1 3 1 11 51 751 1751 4751 9751 102 103 BLAAAA VINAAA HHHHxx +3436 9018 0 0 6 16 36 436 1436 3436 3436 72 73 ECAAAA WINAAA OOOOxx +7319 9019 1 3 9 19 19 319 1319 2319 7319 38 39 NVAAAA XINAAA VVVVxx +7882 9020 0 2 2 2 82 882 1882 2882 7882 164 165 ERAAAA YINAAA AAAAxx +8260 9021 0 0 0 0 60 260 260 3260 8260 120 121 SFAAAA ZINAAA HHHHxx +9758 9022 0 2 8 18 58 758 1758 4758 9758 116 117 ILAAAA AJNAAA OOOOxx +4205 9023 1 1 5 5 5 205 205 4205 4205 10 11 TFAAAA BJNAAA VVVVxx +8884 9024 0 0 4 4 84 884 884 3884 8884 168 169 SDAAAA CJNAAA AAAAxx +1112 9025 0 0 2 12 12 112 1112 1112 1112 24 25 UQAAAA DJNAAA HHHHxx +2186 9026 0 2 6 6 86 186 186 2186 2186 172 173 CGAAAA EJNAAA OOOOxx +8666 9027 0 2 6 6 66 666 666 3666 8666 132 133 IVAAAA FJNAAA VVVVxx +4325 9028 1 1 5 5 25 325 325 4325 4325 50 51 JKAAAA GJNAAA AAAAxx +4912 9029 0 0 2 12 12 912 912 4912 4912 24 25 YGAAAA HJNAAA HHHHxx +6497 9030 1 1 7 17 97 497 497 1497 6497 194 195 XPAAAA IJNAAA OOOOxx +9072 9031 0 0 2 12 72 72 1072 4072 9072 144 145 YKAAAA JJNAAA VVVVxx +8899 9032 1 3 9 19 99 899 899 3899 8899 198 199 HEAAAA KJNAAA AAAAxx +5619 9033 1 3 9 19 19 619 1619 619 5619 38 39 DIAAAA LJNAAA HHHHxx +4110 9034 0 2 0 10 10 110 110 4110 4110 20 21 CCAAAA MJNAAA OOOOxx +7025 9035 1 1 5 5 25 25 1025 2025 7025 50 51 FKAAAA NJNAAA VVVVxx +5605 9036 1 1 5 5 5 605 1605 605 5605 10 11 PHAAAA OJNAAA AAAAxx +2572 9037 0 0 2 12 72 572 572 2572 2572 144 145 YUAAAA PJNAAA HHHHxx +3895 9038 1 3 5 15 95 895 1895 3895 3895 190 191 VTAAAA QJNAAA OOOOxx +9138 9039 0 2 8 18 38 138 1138 4138 9138 76 77 MNAAAA RJNAAA VVVVxx +4713 9040 1 1 3 13 13 713 713 4713 4713 26 27 HZAAAA SJNAAA AAAAxx +6079 9041 1 3 9 19 79 79 79 1079 6079 158 159 VZAAAA TJNAAA HHHHxx +8898 9042 0 2 8 18 98 898 898 3898 8898 196 197 GEAAAA UJNAAA OOOOxx +2650 9043 0 2 0 10 50 650 650 2650 2650 100 101 YXAAAA VJNAAA VVVVxx +5316 9044 0 0 6 16 16 316 1316 316 5316 32 33 MWAAAA WJNAAA AAAAxx +5133 9045 1 1 3 13 33 133 1133 133 5133 66 67 LPAAAA XJNAAA HHHHxx +2184 9046 0 0 4 4 84 184 184 2184 2184 168 169 AGAAAA YJNAAA OOOOxx +2728 9047 0 0 8 8 28 728 728 2728 2728 56 57 YAAAAA ZJNAAA VVVVxx +6737 9048 1 1 7 17 37 737 737 1737 6737 74 75 DZAAAA AKNAAA AAAAxx +1128 9049 0 0 8 8 28 128 1128 1128 1128 56 57 KRAAAA BKNAAA HHHHxx +9662 9050 0 2 2 2 62 662 1662 4662 9662 124 125 QHAAAA CKNAAA OOOOxx +9384 9051 0 0 4 4 84 384 1384 4384 9384 168 169 YWAAAA DKNAAA VVVVxx +4576 9052 0 0 6 16 76 576 576 4576 4576 152 153 AUAAAA EKNAAA AAAAxx +9613 9053 1 1 3 13 13 613 1613 4613 9613 26 27 TFAAAA FKNAAA HHHHxx +4001 9054 1 1 1 1 1 1 1 4001 4001 2 3 XXAAAA GKNAAA OOOOxx +3628 9055 0 0 8 8 28 628 1628 3628 3628 56 57 OJAAAA HKNAAA VVVVxx +6968 9056 0 0 8 8 68 968 968 1968 6968 136 137 AIAAAA IKNAAA AAAAxx +6491 9057 1 3 1 11 91 491 491 1491 6491 182 183 RPAAAA JKNAAA HHHHxx +1265 9058 1 1 5 5 65 265 1265 1265 1265 130 131 RWAAAA KKNAAA OOOOxx +6128 9059 0 0 8 8 28 128 128 1128 6128 56 57 SBAAAA LKNAAA VVVVxx +4274 9060 0 2 4 14 74 274 274 4274 4274 148 149 KIAAAA MKNAAA AAAAxx +3598 9061 0 2 8 18 98 598 1598 3598 3598 196 197 KIAAAA NKNAAA HHHHxx +7961 9062 1 1 1 1 61 961 1961 2961 7961 122 123 FUAAAA OKNAAA OOOOxx +2643 9063 1 3 3 3 43 643 643 2643 2643 86 87 RXAAAA PKNAAA VVVVxx +4547 9064 1 3 7 7 47 547 547 4547 4547 94 95 XSAAAA QKNAAA AAAAxx +3568 9065 0 0 8 8 68 568 1568 3568 3568 136 137 GHAAAA RKNAAA HHHHxx +8954 9066 0 2 4 14 54 954 954 3954 8954 108 109 KGAAAA SKNAAA OOOOxx +8802 9067 0 2 2 2 2 802 802 3802 8802 4 5 OAAAAA TKNAAA VVVVxx +7829 9068 1 1 9 9 29 829 1829 2829 7829 58 59 DPAAAA UKNAAA AAAAxx +1008 9069 0 0 8 8 8 8 1008 1008 1008 16 17 UMAAAA VKNAAA HHHHxx +3627 9070 1 3 7 7 27 627 1627 3627 3627 54 55 NJAAAA WKNAAA OOOOxx +3999 9071 1 3 9 19 99 999 1999 3999 3999 198 199 VXAAAA XKNAAA VVVVxx +7697 9072 1 1 7 17 97 697 1697 2697 7697 194 195 BKAAAA YKNAAA AAAAxx +9380 9073 0 0 0 0 80 380 1380 4380 9380 160 161 UWAAAA ZKNAAA HHHHxx +2707 9074 1 3 7 7 7 707 707 2707 2707 14 15 DAAAAA ALNAAA OOOOxx +4430 9075 0 2 0 10 30 430 430 4430 4430 60 61 KOAAAA BLNAAA VVVVxx +6440 9076 0 0 0 0 40 440 440 1440 6440 80 81 SNAAAA CLNAAA AAAAxx +9958 9077 0 2 8 18 58 958 1958 4958 9958 116 117 ATAAAA DLNAAA HHHHxx +7592 9078 0 0 2 12 92 592 1592 2592 7592 184 185 AGAAAA ELNAAA OOOOxx +7852 9079 0 0 2 12 52 852 1852 2852 7852 104 105 AQAAAA FLNAAA VVVVxx +9253 9080 1 1 3 13 53 253 1253 4253 9253 106 107 XRAAAA GLNAAA AAAAxx +5910 9081 0 2 0 10 10 910 1910 910 5910 20 21 ITAAAA HLNAAA HHHHxx +7487 9082 1 3 7 7 87 487 1487 2487 7487 174 175 ZBAAAA ILNAAA OOOOxx +6324 9083 0 0 4 4 24 324 324 1324 6324 48 49 GJAAAA JLNAAA VVVVxx +5792 9084 0 0 2 12 92 792 1792 792 5792 184 185 UOAAAA KLNAAA AAAAxx +7390 9085 0 2 0 10 90 390 1390 2390 7390 180 181 GYAAAA LLNAAA HHHHxx +8534 9086 0 2 4 14 34 534 534 3534 8534 68 69 GQAAAA MLNAAA OOOOxx +2690 9087 0 2 0 10 90 690 690 2690 2690 180 181 MZAAAA NLNAAA VVVVxx +3992 9088 0 0 2 12 92 992 1992 3992 3992 184 185 OXAAAA OLNAAA AAAAxx +6928 9089 0 0 8 8 28 928 928 1928 6928 56 57 MGAAAA PLNAAA HHHHxx +7815 9090 1 3 5 15 15 815 1815 2815 7815 30 31 POAAAA QLNAAA OOOOxx +9477 9091 1 1 7 17 77 477 1477 4477 9477 154 155 NAAAAA RLNAAA VVVVxx +497 9092 1 1 7 17 97 497 497 497 497 194 195 DTAAAA SLNAAA AAAAxx +7532 9093 0 0 2 12 32 532 1532 2532 7532 64 65 SDAAAA TLNAAA HHHHxx +9838 9094 0 2 8 18 38 838 1838 4838 9838 76 77 KOAAAA ULNAAA OOOOxx +1557 9095 1 1 7 17 57 557 1557 1557 1557 114 115 XHAAAA VLNAAA VVVVxx +2467 9096 1 3 7 7 67 467 467 2467 2467 134 135 XQAAAA WLNAAA AAAAxx +2367 9097 1 3 7 7 67 367 367 2367 2367 134 135 BNAAAA XLNAAA HHHHxx +5677 9098 1 1 7 17 77 677 1677 677 5677 154 155 JKAAAA YLNAAA OOOOxx +6193 9099 1 1 3 13 93 193 193 1193 6193 186 187 FEAAAA ZLNAAA VVVVxx +7126 9100 0 2 6 6 26 126 1126 2126 7126 52 53 COAAAA AMNAAA AAAAxx +5264 9101 0 0 4 4 64 264 1264 264 5264 128 129 MUAAAA BMNAAA HHHHxx +850 9102 0 2 0 10 50 850 850 850 850 100 101 SGAAAA CMNAAA OOOOxx +4854 9103 0 2 4 14 54 854 854 4854 4854 108 109 SEAAAA DMNAAA VVVVxx +4414 9104 0 2 4 14 14 414 414 4414 4414 28 29 UNAAAA EMNAAA AAAAxx +8971 9105 1 3 1 11 71 971 971 3971 8971 142 143 BHAAAA FMNAAA HHHHxx +9240 9106 0 0 0 0 40 240 1240 4240 9240 80 81 KRAAAA GMNAAA OOOOxx +7341 9107 1 1 1 1 41 341 1341 2341 7341 82 83 JWAAAA HMNAAA VVVVxx +3151 9108 1 3 1 11 51 151 1151 3151 3151 102 103 FRAAAA IMNAAA AAAAxx +1742 9109 0 2 2 2 42 742 1742 1742 1742 84 85 APAAAA JMNAAA HHHHxx +1347 9110 1 3 7 7 47 347 1347 1347 1347 94 95 VZAAAA KMNAAA OOOOxx +9418 9111 0 2 8 18 18 418 1418 4418 9418 36 37 GYAAAA LMNAAA VVVVxx +5452 9112 0 0 2 12 52 452 1452 452 5452 104 105 SBAAAA MMNAAA AAAAxx +8637 9113 1 1 7 17 37 637 637 3637 8637 74 75 FUAAAA NMNAAA HHHHxx +8287 9114 1 3 7 7 87 287 287 3287 8287 174 175 TGAAAA OMNAAA OOOOxx +9865 9115 1 1 5 5 65 865 1865 4865 9865 130 131 LPAAAA PMNAAA VVVVxx +1664 9116 0 0 4 4 64 664 1664 1664 1664 128 129 AMAAAA QMNAAA AAAAxx +9933 9117 1 1 3 13 33 933 1933 4933 9933 66 67 BSAAAA RMNAAA HHHHxx +3416 9118 0 0 6 16 16 416 1416 3416 3416 32 33 KBAAAA SMNAAA OOOOxx +7981 9119 1 1 1 1 81 981 1981 2981 7981 162 163 ZUAAAA TMNAAA VVVVxx +1981 9120 1 1 1 1 81 981 1981 1981 1981 162 163 FYAAAA UMNAAA AAAAxx +441 9121 1 1 1 1 41 441 441 441 441 82 83 ZQAAAA VMNAAA HHHHxx +1380 9122 0 0 0 0 80 380 1380 1380 1380 160 161 CBAAAA WMNAAA OOOOxx +7325 9123 1 1 5 5 25 325 1325 2325 7325 50 51 TVAAAA XMNAAA VVVVxx +5682 9124 0 2 2 2 82 682 1682 682 5682 164 165 OKAAAA YMNAAA AAAAxx +1024 9125 0 0 4 4 24 24 1024 1024 1024 48 49 KNAAAA ZMNAAA HHHHxx +1096 9126 0 0 6 16 96 96 1096 1096 1096 192 193 EQAAAA ANNAAA OOOOxx +4717 9127 1 1 7 17 17 717 717 4717 4717 34 35 LZAAAA BNNAAA VVVVxx +7948 9128 0 0 8 8 48 948 1948 2948 7948 96 97 STAAAA CNNAAA AAAAxx +4074 9129 0 2 4 14 74 74 74 4074 4074 148 149 SAAAAA DNNAAA HHHHxx +211 9130 1 3 1 11 11 211 211 211 211 22 23 DIAAAA ENNAAA OOOOxx +8993 9131 1 1 3 13 93 993 993 3993 8993 186 187 XHAAAA FNNAAA VVVVxx +4509 9132 1 1 9 9 9 509 509 4509 4509 18 19 LRAAAA GNNAAA AAAAxx +823 9133 1 3 3 3 23 823 823 823 823 46 47 RFAAAA HNNAAA HHHHxx +4747 9134 1 3 7 7 47 747 747 4747 4747 94 95 PAAAAA INNAAA OOOOxx +6955 9135 1 3 5 15 55 955 955 1955 6955 110 111 NHAAAA JNNAAA VVVVxx +7922 9136 0 2 2 2 22 922 1922 2922 7922 44 45 SSAAAA KNNAAA AAAAxx +6936 9137 0 0 6 16 36 936 936 1936 6936 72 73 UGAAAA LNNAAA HHHHxx +1546 9138 0 2 6 6 46 546 1546 1546 1546 92 93 MHAAAA MNNAAA OOOOxx +9836 9139 0 0 6 16 36 836 1836 4836 9836 72 73 IOAAAA NNNAAA VVVVxx +5626 9140 0 2 6 6 26 626 1626 626 5626 52 53 KIAAAA ONNAAA AAAAxx +4879 9141 1 3 9 19 79 879 879 4879 4879 158 159 RFAAAA PNNAAA HHHHxx +8590 9142 0 2 0 10 90 590 590 3590 8590 180 181 KSAAAA QNNAAA OOOOxx +8842 9143 0 2 2 2 42 842 842 3842 8842 84 85 CCAAAA RNNAAA VVVVxx +6505 9144 1 1 5 5 5 505 505 1505 6505 10 11 FQAAAA SNNAAA AAAAxx +2803 9145 1 3 3 3 3 803 803 2803 2803 6 7 VDAAAA TNNAAA HHHHxx +9258 9146 0 2 8 18 58 258 1258 4258 9258 116 117 CSAAAA UNNAAA OOOOxx +741 9147 1 1 1 1 41 741 741 741 741 82 83 NCAAAA VNNAAA VVVVxx +1457 9148 1 1 7 17 57 457 1457 1457 1457 114 115 BEAAAA WNNAAA AAAAxx +5777 9149 1 1 7 17 77 777 1777 777 5777 154 155 FOAAAA XNNAAA HHHHxx +2883 9150 1 3 3 3 83 883 883 2883 2883 166 167 XGAAAA YNNAAA OOOOxx +6610 9151 0 2 0 10 10 610 610 1610 6610 20 21 GUAAAA ZNNAAA VVVVxx +4331 9152 1 3 1 11 31 331 331 4331 4331 62 63 PKAAAA AONAAA AAAAxx +2712 9153 0 0 2 12 12 712 712 2712 2712 24 25 IAAAAA BONAAA HHHHxx +9268 9154 0 0 8 8 68 268 1268 4268 9268 136 137 MSAAAA CONAAA OOOOxx +410 9155 0 2 0 10 10 410 410 410 410 20 21 UPAAAA DONAAA VVVVxx +9411 9156 1 3 1 11 11 411 1411 4411 9411 22 23 ZXAAAA EONAAA AAAAxx +4683 9157 1 3 3 3 83 683 683 4683 4683 166 167 DYAAAA FONAAA HHHHxx +7072 9158 0 0 2 12 72 72 1072 2072 7072 144 145 AMAAAA GONAAA OOOOxx +5050 9159 0 2 0 10 50 50 1050 50 5050 100 101 GMAAAA HONAAA VVVVxx +5932 9160 0 0 2 12 32 932 1932 932 5932 64 65 EUAAAA IONAAA AAAAxx +2756 9161 0 0 6 16 56 756 756 2756 2756 112 113 ACAAAA JONAAA HHHHxx +9813 9162 1 1 3 13 13 813 1813 4813 9813 26 27 LNAAAA KONAAA OOOOxx +7388 9163 0 0 8 8 88 388 1388 2388 7388 176 177 EYAAAA LONAAA VVVVxx +2596 9164 0 0 6 16 96 596 596 2596 2596 192 193 WVAAAA MONAAA AAAAxx +5102 9165 0 2 2 2 2 102 1102 102 5102 4 5 GOAAAA NONAAA HHHHxx +208 9166 0 0 8 8 8 208 208 208 208 16 17 AIAAAA OONAAA OOOOxx +86 9167 0 2 6 6 86 86 86 86 86 172 173 IDAAAA PONAAA VVVVxx +8127 9168 1 3 7 7 27 127 127 3127 8127 54 55 PAAAAA QONAAA AAAAxx +5154 9169 0 2 4 14 54 154 1154 154 5154 108 109 GQAAAA RONAAA HHHHxx +4491 9170 1 3 1 11 91 491 491 4491 4491 182 183 TQAAAA SONAAA OOOOxx +7423 9171 1 3 3 3 23 423 1423 2423 7423 46 47 NZAAAA TONAAA VVVVxx +6441 9172 1 1 1 1 41 441 441 1441 6441 82 83 TNAAAA UONAAA AAAAxx +2920 9173 0 0 0 0 20 920 920 2920 2920 40 41 IIAAAA VONAAA HHHHxx +6386 9174 0 2 6 6 86 386 386 1386 6386 172 173 QLAAAA WONAAA OOOOxx +9744 9175 0 0 4 4 44 744 1744 4744 9744 88 89 UKAAAA XONAAA VVVVxx +2667 9176 1 3 7 7 67 667 667 2667 2667 134 135 PYAAAA YONAAA AAAAxx +5754 9177 0 2 4 14 54 754 1754 754 5754 108 109 INAAAA ZONAAA HHHHxx +4645 9178 1 1 5 5 45 645 645 4645 4645 90 91 RWAAAA APNAAA OOOOxx +4327 9179 1 3 7 7 27 327 327 4327 4327 54 55 LKAAAA BPNAAA VVVVxx +843 9180 1 3 3 3 43 843 843 843 843 86 87 LGAAAA CPNAAA AAAAxx +4085 9181 1 1 5 5 85 85 85 4085 4085 170 171 DBAAAA DPNAAA HHHHxx +2849 9182 1 1 9 9 49 849 849 2849 2849 98 99 PFAAAA EPNAAA OOOOxx +5734 9183 0 2 4 14 34 734 1734 734 5734 68 69 OMAAAA FPNAAA VVVVxx +5307 9184 1 3 7 7 7 307 1307 307 5307 14 15 DWAAAA GPNAAA AAAAxx +8433 9185 1 1 3 13 33 433 433 3433 8433 66 67 JMAAAA HPNAAA HHHHxx +3031 9186 1 3 1 11 31 31 1031 3031 3031 62 63 PMAAAA IPNAAA OOOOxx +5714 9187 0 2 4 14 14 714 1714 714 5714 28 29 ULAAAA JPNAAA VVVVxx +5969 9188 1 1 9 9 69 969 1969 969 5969 138 139 PVAAAA KPNAAA AAAAxx +2532 9189 0 0 2 12 32 532 532 2532 2532 64 65 KTAAAA LPNAAA HHHHxx +5219 9190 1 3 9 19 19 219 1219 219 5219 38 39 TSAAAA MPNAAA OOOOxx +7343 9191 1 3 3 3 43 343 1343 2343 7343 86 87 LWAAAA NPNAAA VVVVxx +9089 9192 1 1 9 9 89 89 1089 4089 9089 178 179 PLAAAA OPNAAA AAAAxx +9337 9193 1 1 7 17 37 337 1337 4337 9337 74 75 DVAAAA PPNAAA HHHHxx +5131 9194 1 3 1 11 31 131 1131 131 5131 62 63 JPAAAA QPNAAA OOOOxx +6253 9195 1 1 3 13 53 253 253 1253 6253 106 107 NGAAAA RPNAAA VVVVxx +5140 9196 0 0 0 0 40 140 1140 140 5140 80 81 SPAAAA SPNAAA AAAAxx +2953 9197 1 1 3 13 53 953 953 2953 2953 106 107 PJAAAA TPNAAA HHHHxx +4293 9198 1 1 3 13 93 293 293 4293 4293 186 187 DJAAAA UPNAAA OOOOxx +9974 9199 0 2 4 14 74 974 1974 4974 9974 148 149 QTAAAA VPNAAA VVVVxx +5061 9200 1 1 1 1 61 61 1061 61 5061 122 123 RMAAAA WPNAAA AAAAxx +8570 9201 0 2 0 10 70 570 570 3570 8570 140 141 QRAAAA XPNAAA HHHHxx +9504 9202 0 0 4 4 4 504 1504 4504 9504 8 9 OBAAAA YPNAAA OOOOxx +604 9203 0 0 4 4 4 604 604 604 604 8 9 GXAAAA ZPNAAA VVVVxx +4991 9204 1 3 1 11 91 991 991 4991 4991 182 183 ZJAAAA AQNAAA AAAAxx +880 9205 0 0 0 0 80 880 880 880 880 160 161 WHAAAA BQNAAA HHHHxx +3861 9206 1 1 1 1 61 861 1861 3861 3861 122 123 NSAAAA CQNAAA OOOOxx +8262 9207 0 2 2 2 62 262 262 3262 8262 124 125 UFAAAA DQNAAA VVVVxx +5689 9208 1 1 9 9 89 689 1689 689 5689 178 179 VKAAAA EQNAAA AAAAxx +1793 9209 1 1 3 13 93 793 1793 1793 1793 186 187 ZQAAAA FQNAAA HHHHxx +2661 9210 1 1 1 1 61 661 661 2661 2661 122 123 JYAAAA GQNAAA OOOOxx +7954 9211 0 2 4 14 54 954 1954 2954 7954 108 109 YTAAAA HQNAAA VVVVxx +1874 9212 0 2 4 14 74 874 1874 1874 1874 148 149 CUAAAA IQNAAA AAAAxx +2982 9213 0 2 2 2 82 982 982 2982 2982 164 165 SKAAAA JQNAAA HHHHxx +331 9214 1 3 1 11 31 331 331 331 331 62 63 TMAAAA KQNAAA OOOOxx +5021 9215 1 1 1 1 21 21 1021 21 5021 42 43 DLAAAA LQNAAA VVVVxx +9894 9216 0 2 4 14 94 894 1894 4894 9894 188 189 OQAAAA MQNAAA AAAAxx +7709 9217 1 1 9 9 9 709 1709 2709 7709 18 19 NKAAAA NQNAAA HHHHxx +4980 9218 0 0 0 0 80 980 980 4980 4980 160 161 OJAAAA OQNAAA OOOOxx +8249 9219 1 1 9 9 49 249 249 3249 8249 98 99 HFAAAA PQNAAA VVVVxx +7120 9220 0 0 0 0 20 120 1120 2120 7120 40 41 WNAAAA QQNAAA AAAAxx +7464 9221 0 0 4 4 64 464 1464 2464 7464 128 129 CBAAAA RQNAAA HHHHxx +8086 9222 0 2 6 6 86 86 86 3086 8086 172 173 AZAAAA SQNAAA OOOOxx +3509 9223 1 1 9 9 9 509 1509 3509 3509 18 19 ZEAAAA TQNAAA VVVVxx +3902 9224 0 2 2 2 2 902 1902 3902 3902 4 5 CUAAAA UQNAAA AAAAxx +9907 9225 1 3 7 7 7 907 1907 4907 9907 14 15 BRAAAA VQNAAA HHHHxx +6278 9226 0 2 8 18 78 278 278 1278 6278 156 157 MHAAAA WQNAAA OOOOxx +9316 9227 0 0 6 16 16 316 1316 4316 9316 32 33 IUAAAA XQNAAA VVVVxx +2824 9228 0 0 4 4 24 824 824 2824 2824 48 49 QEAAAA YQNAAA AAAAxx +1558 9229 0 2 8 18 58 558 1558 1558 1558 116 117 YHAAAA ZQNAAA HHHHxx +5436 9230 0 0 6 16 36 436 1436 436 5436 72 73 CBAAAA ARNAAA OOOOxx +1161 9231 1 1 1 1 61 161 1161 1161 1161 122 123 RSAAAA BRNAAA VVVVxx +7569 9232 1 1 9 9 69 569 1569 2569 7569 138 139 DFAAAA CRNAAA AAAAxx +9614 9233 0 2 4 14 14 614 1614 4614 9614 28 29 UFAAAA DRNAAA HHHHxx +6970 9234 0 2 0 10 70 970 970 1970 6970 140 141 CIAAAA ERNAAA OOOOxx +2422 9235 0 2 2 2 22 422 422 2422 2422 44 45 EPAAAA FRNAAA VVVVxx +8860 9236 0 0 0 0 60 860 860 3860 8860 120 121 UCAAAA GRNAAA AAAAxx +9912 9237 0 0 2 12 12 912 1912 4912 9912 24 25 GRAAAA HRNAAA HHHHxx +1109 9238 1 1 9 9 9 109 1109 1109 1109 18 19 RQAAAA IRNAAA OOOOxx +3286 9239 0 2 6 6 86 286 1286 3286 3286 172 173 KWAAAA JRNAAA VVVVxx +2277 9240 1 1 7 17 77 277 277 2277 2277 154 155 PJAAAA KRNAAA AAAAxx +8656 9241 0 0 6 16 56 656 656 3656 8656 112 113 YUAAAA LRNAAA HHHHxx +4656 9242 0 0 6 16 56 656 656 4656 4656 112 113 CXAAAA MRNAAA OOOOxx +6965 9243 1 1 5 5 65 965 965 1965 6965 130 131 XHAAAA NRNAAA VVVVxx +7591 9244 1 3 1 11 91 591 1591 2591 7591 182 183 ZFAAAA ORNAAA AAAAxx +4883 9245 1 3 3 3 83 883 883 4883 4883 166 167 VFAAAA PRNAAA HHHHxx +452 9246 0 0 2 12 52 452 452 452 452 104 105 KRAAAA QRNAAA OOOOxx +4018 9247 0 2 8 18 18 18 18 4018 4018 36 37 OYAAAA RRNAAA VVVVxx +4066 9248 0 2 6 6 66 66 66 4066 4066 132 133 KAAAAA SRNAAA AAAAxx +6480 9249 0 0 0 0 80 480 480 1480 6480 160 161 GPAAAA TRNAAA HHHHxx +8634 9250 0 2 4 14 34 634 634 3634 8634 68 69 CUAAAA URNAAA OOOOxx +9387 9251 1 3 7 7 87 387 1387 4387 9387 174 175 BXAAAA VRNAAA VVVVxx +3476 9252 0 0 6 16 76 476 1476 3476 3476 152 153 SDAAAA WRNAAA AAAAxx +5995 9253 1 3 5 15 95 995 1995 995 5995 190 191 PWAAAA XRNAAA HHHHxx +9677 9254 1 1 7 17 77 677 1677 4677 9677 154 155 FIAAAA YRNAAA OOOOxx +3884 9255 0 0 4 4 84 884 1884 3884 3884 168 169 KTAAAA ZRNAAA VVVVxx +6500 9256 0 0 0 0 0 500 500 1500 6500 0 1 AQAAAA ASNAAA AAAAxx +7972 9257 0 0 2 12 72 972 1972 2972 7972 144 145 QUAAAA BSNAAA HHHHxx +5281 9258 1 1 1 1 81 281 1281 281 5281 162 163 DVAAAA CSNAAA OOOOxx +1288 9259 0 0 8 8 88 288 1288 1288 1288 176 177 OXAAAA DSNAAA VVVVxx +4366 9260 0 2 6 6 66 366 366 4366 4366 132 133 YLAAAA ESNAAA AAAAxx +6557 9261 1 1 7 17 57 557 557 1557 6557 114 115 FSAAAA FSNAAA HHHHxx +7086 9262 0 2 6 6 86 86 1086 2086 7086 172 173 OMAAAA GSNAAA OOOOxx +6588 9263 0 0 8 8 88 588 588 1588 6588 176 177 KTAAAA HSNAAA VVVVxx +9062 9264 0 2 2 2 62 62 1062 4062 9062 124 125 OKAAAA ISNAAA AAAAxx +9230 9265 0 2 0 10 30 230 1230 4230 9230 60 61 ARAAAA JSNAAA HHHHxx +7672 9266 0 0 2 12 72 672 1672 2672 7672 144 145 CJAAAA KSNAAA OOOOxx +5204 9267 0 0 4 4 4 204 1204 204 5204 8 9 ESAAAA LSNAAA VVVVxx +2836 9268 0 0 6 16 36 836 836 2836 2836 72 73 CFAAAA MSNAAA AAAAxx +7165 9269 1 1 5 5 65 165 1165 2165 7165 130 131 PPAAAA NSNAAA HHHHxx +971 9270 1 3 1 11 71 971 971 971 971 142 143 JLAAAA OSNAAA OOOOxx +3851 9271 1 3 1 11 51 851 1851 3851 3851 102 103 DSAAAA PSNAAA VVVVxx +8593 9272 1 1 3 13 93 593 593 3593 8593 186 187 NSAAAA QSNAAA AAAAxx +7742 9273 0 2 2 2 42 742 1742 2742 7742 84 85 ULAAAA RSNAAA HHHHxx +2887 9274 1 3 7 7 87 887 887 2887 2887 174 175 BHAAAA SSNAAA OOOOxx +8479 9275 1 3 9 19 79 479 479 3479 8479 158 159 DOAAAA TSNAAA VVVVxx +9514 9276 0 2 4 14 14 514 1514 4514 9514 28 29 YBAAAA USNAAA AAAAxx +273 9277 1 1 3 13 73 273 273 273 273 146 147 NKAAAA VSNAAA HHHHxx +2938 9278 0 2 8 18 38 938 938 2938 2938 76 77 AJAAAA WSNAAA OOOOxx +9793 9279 1 1 3 13 93 793 1793 4793 9793 186 187 RMAAAA XSNAAA VVVVxx +8050 9280 0 2 0 10 50 50 50 3050 8050 100 101 QXAAAA YSNAAA AAAAxx +6702 9281 0 2 2 2 2 702 702 1702 6702 4 5 UXAAAA ZSNAAA HHHHxx +7290 9282 0 2 0 10 90 290 1290 2290 7290 180 181 KUAAAA ATNAAA OOOOxx +1837 9283 1 1 7 17 37 837 1837 1837 1837 74 75 RSAAAA BTNAAA VVVVxx +3206 9284 0 2 6 6 6 206 1206 3206 3206 12 13 ITAAAA CTNAAA AAAAxx +4925 9285 1 1 5 5 25 925 925 4925 4925 50 51 LHAAAA DTNAAA HHHHxx +5066 9286 0 2 6 6 66 66 1066 66 5066 132 133 WMAAAA ETNAAA OOOOxx +3401 9287 1 1 1 1 1 401 1401 3401 3401 2 3 VAAAAA FTNAAA VVVVxx +3474 9288 0 2 4 14 74 474 1474 3474 3474 148 149 QDAAAA GTNAAA AAAAxx +57 9289 1 1 7 17 57 57 57 57 57 114 115 FCAAAA HTNAAA HHHHxx +2082 9290 0 2 2 2 82 82 82 2082 2082 164 165 CCAAAA ITNAAA OOOOxx +100 9291 0 0 0 0 0 100 100 100 100 0 1 WDAAAA JTNAAA VVVVxx +9665 9292 1 1 5 5 65 665 1665 4665 9665 130 131 THAAAA KTNAAA AAAAxx +8284 9293 0 0 4 4 84 284 284 3284 8284 168 169 QGAAAA LTNAAA HHHHxx +958 9294 0 2 8 18 58 958 958 958 958 116 117 WKAAAA MTNAAA OOOOxx +5282 9295 0 2 2 2 82 282 1282 282 5282 164 165 EVAAAA NTNAAA VVVVxx +4257 9296 1 1 7 17 57 257 257 4257 4257 114 115 THAAAA OTNAAA AAAAxx +3160 9297 0 0 0 0 60 160 1160 3160 3160 120 121 ORAAAA PTNAAA HHHHxx +8449 9298 1 1 9 9 49 449 449 3449 8449 98 99 ZMAAAA QTNAAA OOOOxx +500 9299 0 0 0 0 0 500 500 500 500 0 1 GTAAAA RTNAAA VVVVxx +6432 9300 0 0 2 12 32 432 432 1432 6432 64 65 KNAAAA STNAAA AAAAxx +6220 9301 0 0 0 0 20 220 220 1220 6220 40 41 GFAAAA TTNAAA HHHHxx +7233 9302 1 1 3 13 33 233 1233 2233 7233 66 67 FSAAAA UTNAAA OOOOxx +2723 9303 1 3 3 3 23 723 723 2723 2723 46 47 TAAAAA VTNAAA VVVVxx +1899 9304 1 3 9 19 99 899 1899 1899 1899 198 199 BVAAAA WTNAAA AAAAxx +7158 9305 0 2 8 18 58 158 1158 2158 7158 116 117 IPAAAA XTNAAA HHHHxx +202 9306 0 2 2 2 2 202 202 202 202 4 5 UHAAAA YTNAAA OOOOxx +2286 9307 0 2 6 6 86 286 286 2286 2286 172 173 YJAAAA ZTNAAA VVVVxx +5356 9308 0 0 6 16 56 356 1356 356 5356 112 113 AYAAAA AUNAAA AAAAxx +3809 9309 1 1 9 9 9 809 1809 3809 3809 18 19 NQAAAA BUNAAA HHHHxx +3979 9310 1 3 9 19 79 979 1979 3979 3979 158 159 BXAAAA CUNAAA OOOOxx +8359 9311 1 3 9 19 59 359 359 3359 8359 118 119 NJAAAA DUNAAA VVVVxx +3479 9312 1 3 9 19 79 479 1479 3479 3479 158 159 VDAAAA EUNAAA AAAAxx +4895 9313 1 3 5 15 95 895 895 4895 4895 190 191 HGAAAA FUNAAA HHHHxx +6059 9314 1 3 9 19 59 59 59 1059 6059 118 119 BZAAAA GUNAAA OOOOxx +9560 9315 0 0 0 0 60 560 1560 4560 9560 120 121 SDAAAA HUNAAA VVVVxx +6756 9316 0 0 6 16 56 756 756 1756 6756 112 113 WZAAAA IUNAAA AAAAxx +7504 9317 0 0 4 4 4 504 1504 2504 7504 8 9 QCAAAA JUNAAA HHHHxx +6762 9318 0 2 2 2 62 762 762 1762 6762 124 125 CAAAAA KUNAAA OOOOxx +5304 9319 0 0 4 4 4 304 1304 304 5304 8 9 AWAAAA LUNAAA VVVVxx +9533 9320 1 1 3 13 33 533 1533 4533 9533 66 67 RCAAAA MUNAAA AAAAxx +6649 9321 1 1 9 9 49 649 649 1649 6649 98 99 TVAAAA NUNAAA HHHHxx +38 9322 0 2 8 18 38 38 38 38 38 76 77 MBAAAA OUNAAA OOOOxx +5713 9323 1 1 3 13 13 713 1713 713 5713 26 27 TLAAAA PUNAAA VVVVxx +3000 9324 0 0 0 0 0 0 1000 3000 3000 0 1 KLAAAA QUNAAA AAAAxx +3738 9325 0 2 8 18 38 738 1738 3738 3738 76 77 UNAAAA RUNAAA HHHHxx +3327 9326 1 3 7 7 27 327 1327 3327 3327 54 55 ZXAAAA SUNAAA OOOOxx +3922 9327 0 2 2 2 22 922 1922 3922 3922 44 45 WUAAAA TUNAAA VVVVxx +9245 9328 1 1 5 5 45 245 1245 4245 9245 90 91 PRAAAA UUNAAA AAAAxx +2172 9329 0 0 2 12 72 172 172 2172 2172 144 145 OFAAAA VUNAAA HHHHxx +7128 9330 0 0 8 8 28 128 1128 2128 7128 56 57 EOAAAA WUNAAA OOOOxx +1195 9331 1 3 5 15 95 195 1195 1195 1195 190 191 ZTAAAA XUNAAA VVVVxx +8445 9332 1 1 5 5 45 445 445 3445 8445 90 91 VMAAAA YUNAAA AAAAxx +8638 9333 0 2 8 18 38 638 638 3638 8638 76 77 GUAAAA ZUNAAA HHHHxx +1249 9334 1 1 9 9 49 249 1249 1249 1249 98 99 BWAAAA AVNAAA OOOOxx +8659 9335 1 3 9 19 59 659 659 3659 8659 118 119 BVAAAA BVNAAA VVVVxx +3556 9336 0 0 6 16 56 556 1556 3556 3556 112 113 UGAAAA CVNAAA AAAAxx +3347 9337 1 3 7 7 47 347 1347 3347 3347 94 95 TYAAAA DVNAAA HHHHxx +3260 9338 0 0 0 0 60 260 1260 3260 3260 120 121 KVAAAA EVNAAA OOOOxx +5139 9339 1 3 9 19 39 139 1139 139 5139 78 79 RPAAAA FVNAAA VVVVxx +9991 9340 1 3 1 11 91 991 1991 4991 9991 182 183 HUAAAA GVNAAA AAAAxx +5499 9341 1 3 9 19 99 499 1499 499 5499 198 199 NDAAAA HVNAAA HHHHxx +8082 9342 0 2 2 2 82 82 82 3082 8082 164 165 WYAAAA IVNAAA OOOOxx +1640 9343 0 0 0 0 40 640 1640 1640 1640 80 81 CLAAAA JVNAAA VVVVxx +8726 9344 0 2 6 6 26 726 726 3726 8726 52 53 QXAAAA KVNAAA AAAAxx +2339 9345 1 3 9 19 39 339 339 2339 2339 78 79 ZLAAAA LVNAAA HHHHxx +2601 9346 1 1 1 1 1 601 601 2601 2601 2 3 BWAAAA MVNAAA OOOOxx +9940 9347 0 0 0 0 40 940 1940 4940 9940 80 81 ISAAAA NVNAAA VVVVxx +4185 9348 1 1 5 5 85 185 185 4185 4185 170 171 ZEAAAA OVNAAA AAAAxx +9546 9349 0 2 6 6 46 546 1546 4546 9546 92 93 EDAAAA PVNAAA HHHHxx +5218 9350 0 2 8 18 18 218 1218 218 5218 36 37 SSAAAA QVNAAA OOOOxx +4374 9351 0 2 4 14 74 374 374 4374 4374 148 149 GMAAAA RVNAAA VVVVxx +288 9352 0 0 8 8 88 288 288 288 288 176 177 CLAAAA SVNAAA AAAAxx +7445 9353 1 1 5 5 45 445 1445 2445 7445 90 91 JAAAAA TVNAAA HHHHxx +1710 9354 0 2 0 10 10 710 1710 1710 1710 20 21 UNAAAA UVNAAA OOOOxx +6409 9355 1 1 9 9 9 409 409 1409 6409 18 19 NMAAAA VVNAAA VVVVxx +7982 9356 0 2 2 2 82 982 1982 2982 7982 164 165 AVAAAA WVNAAA AAAAxx +4950 9357 0 2 0 10 50 950 950 4950 4950 100 101 KIAAAA XVNAAA HHHHxx +9242 9358 0 2 2 2 42 242 1242 4242 9242 84 85 MRAAAA YVNAAA OOOOxx +3272 9359 0 0 2 12 72 272 1272 3272 3272 144 145 WVAAAA ZVNAAA VVVVxx +739 9360 1 3 9 19 39 739 739 739 739 78 79 LCAAAA AWNAAA AAAAxx +5526 9361 0 2 6 6 26 526 1526 526 5526 52 53 OEAAAA BWNAAA HHHHxx +8189 9362 1 1 9 9 89 189 189 3189 8189 178 179 ZCAAAA CWNAAA OOOOxx +9106 9363 0 2 6 6 6 106 1106 4106 9106 12 13 GMAAAA DWNAAA VVVVxx +9775 9364 1 3 5 15 75 775 1775 4775 9775 150 151 ZLAAAA EWNAAA AAAAxx +4643 9365 1 3 3 3 43 643 643 4643 4643 86 87 PWAAAA FWNAAA HHHHxx +8396 9366 0 0 6 16 96 396 396 3396 8396 192 193 YKAAAA GWNAAA OOOOxx +3255 9367 1 3 5 15 55 255 1255 3255 3255 110 111 FVAAAA HWNAAA VVVVxx +301 9368 1 1 1 1 1 301 301 301 301 2 3 PLAAAA IWNAAA AAAAxx +6014 9369 0 2 4 14 14 14 14 1014 6014 28 29 IXAAAA JWNAAA HHHHxx +6046 9370 0 2 6 6 46 46 46 1046 6046 92 93 OYAAAA KWNAAA OOOOxx +984 9371 0 0 4 4 84 984 984 984 984 168 169 WLAAAA LWNAAA VVVVxx +2420 9372 0 0 0 0 20 420 420 2420 2420 40 41 CPAAAA MWNAAA AAAAxx +2922 9373 0 2 2 2 22 922 922 2922 2922 44 45 KIAAAA NWNAAA HHHHxx +2317 9374 1 1 7 17 17 317 317 2317 2317 34 35 DLAAAA OWNAAA OOOOxx +7332 9375 0 0 2 12 32 332 1332 2332 7332 64 65 AWAAAA PWNAAA VVVVxx +6451 9376 1 3 1 11 51 451 451 1451 6451 102 103 DOAAAA QWNAAA AAAAxx +2589 9377 1 1 9 9 89 589 589 2589 2589 178 179 PVAAAA RWNAAA HHHHxx +4333 9378 1 1 3 13 33 333 333 4333 4333 66 67 RKAAAA SWNAAA OOOOxx +8650 9379 0 2 0 10 50 650 650 3650 8650 100 101 SUAAAA TWNAAA VVVVxx +6856 9380 0 0 6 16 56 856 856 1856 6856 112 113 SDAAAA UWNAAA AAAAxx +4194 9381 0 2 4 14 94 194 194 4194 4194 188 189 IFAAAA VWNAAA HHHHxx +6246 9382 0 2 6 6 46 246 246 1246 6246 92 93 GGAAAA WWNAAA OOOOxx +4371 9383 1 3 1 11 71 371 371 4371 4371 142 143 DMAAAA XWNAAA VVVVxx +1388 9384 0 0 8 8 88 388 1388 1388 1388 176 177 KBAAAA YWNAAA AAAAxx +1056 9385 0 0 6 16 56 56 1056 1056 1056 112 113 QOAAAA ZWNAAA HHHHxx +6041 9386 1 1 1 1 41 41 41 1041 6041 82 83 JYAAAA AXNAAA OOOOxx +6153 9387 1 1 3 13 53 153 153 1153 6153 106 107 RCAAAA BXNAAA VVVVxx +8450 9388 0 2 0 10 50 450 450 3450 8450 100 101 ANAAAA CXNAAA AAAAxx +3469 9389 1 1 9 9 69 469 1469 3469 3469 138 139 LDAAAA DXNAAA HHHHxx +5226 9390 0 2 6 6 26 226 1226 226 5226 52 53 ATAAAA EXNAAA OOOOxx +8112 9391 0 0 2 12 12 112 112 3112 8112 24 25 AAAAAA FXNAAA VVVVxx +647 9392 1 3 7 7 47 647 647 647 647 94 95 XYAAAA GXNAAA AAAAxx +2567 9393 1 3 7 7 67 567 567 2567 2567 134 135 TUAAAA HXNAAA HHHHxx +9064 9394 0 0 4 4 64 64 1064 4064 9064 128 129 QKAAAA IXNAAA OOOOxx +5161 9395 1 1 1 1 61 161 1161 161 5161 122 123 NQAAAA JXNAAA VVVVxx +5260 9396 0 0 0 0 60 260 1260 260 5260 120 121 IUAAAA KXNAAA AAAAxx +8988 9397 0 0 8 8 88 988 988 3988 8988 176 177 SHAAAA LXNAAA HHHHxx +9678 9398 0 2 8 18 78 678 1678 4678 9678 156 157 GIAAAA MXNAAA OOOOxx +6853 9399 1 1 3 13 53 853 853 1853 6853 106 107 PDAAAA NXNAAA VVVVxx +5294 9400 0 2 4 14 94 294 1294 294 5294 188 189 QVAAAA OXNAAA AAAAxx +9864 9401 0 0 4 4 64 864 1864 4864 9864 128 129 KPAAAA PXNAAA HHHHxx +8702 9402 0 2 2 2 2 702 702 3702 8702 4 5 SWAAAA QXNAAA OOOOxx +1132 9403 0 0 2 12 32 132 1132 1132 1132 64 65 ORAAAA RXNAAA VVVVxx +1524 9404 0 0 4 4 24 524 1524 1524 1524 48 49 QGAAAA SXNAAA AAAAxx +4560 9405 0 0 0 0 60 560 560 4560 4560 120 121 KTAAAA TXNAAA HHHHxx +2137 9406 1 1 7 17 37 137 137 2137 2137 74 75 FEAAAA UXNAAA OOOOxx +3283 9407 1 3 3 3 83 283 1283 3283 3283 166 167 HWAAAA VXNAAA VVVVxx +3377 9408 1 1 7 17 77 377 1377 3377 3377 154 155 XZAAAA WXNAAA AAAAxx +2267 9409 1 3 7 7 67 267 267 2267 2267 134 135 FJAAAA XXNAAA HHHHxx +8987 9410 1 3 7 7 87 987 987 3987 8987 174 175 RHAAAA YXNAAA OOOOxx +6709 9411 1 1 9 9 9 709 709 1709 6709 18 19 BYAAAA ZXNAAA VVVVxx +8059 9412 1 3 9 19 59 59 59 3059 8059 118 119 ZXAAAA AYNAAA AAAAxx +3402 9413 0 2 2 2 2 402 1402 3402 3402 4 5 WAAAAA BYNAAA HHHHxx +6443 9414 1 3 3 3 43 443 443 1443 6443 86 87 VNAAAA CYNAAA OOOOxx +8858 9415 0 2 8 18 58 858 858 3858 8858 116 117 SCAAAA DYNAAA VVVVxx +3974 9416 0 2 4 14 74 974 1974 3974 3974 148 149 WWAAAA EYNAAA AAAAxx +3521 9417 1 1 1 1 21 521 1521 3521 3521 42 43 LFAAAA FYNAAA HHHHxx +9509 9418 1 1 9 9 9 509 1509 4509 9509 18 19 TBAAAA GYNAAA OOOOxx +5442 9419 0 2 2 2 42 442 1442 442 5442 84 85 IBAAAA HYNAAA VVVVxx +8968 9420 0 0 8 8 68 968 968 3968 8968 136 137 YGAAAA IYNAAA AAAAxx +333 9421 1 1 3 13 33 333 333 333 333 66 67 VMAAAA JYNAAA HHHHxx +952 9422 0 0 2 12 52 952 952 952 952 104 105 QKAAAA KYNAAA OOOOxx +7482 9423 0 2 2 2 82 482 1482 2482 7482 164 165 UBAAAA LYNAAA VVVVxx +1486 9424 0 2 6 6 86 486 1486 1486 1486 172 173 EFAAAA MYNAAA AAAAxx +1815 9425 1 3 5 15 15 815 1815 1815 1815 30 31 VRAAAA NYNAAA HHHHxx +7937 9426 1 1 7 17 37 937 1937 2937 7937 74 75 HTAAAA OYNAAA OOOOxx +1436 9427 0 0 6 16 36 436 1436 1436 1436 72 73 GDAAAA PYNAAA VVVVxx +3470 9428 0 2 0 10 70 470 1470 3470 3470 140 141 MDAAAA QYNAAA AAAAxx +8195 9429 1 3 5 15 95 195 195 3195 8195 190 191 FDAAAA RYNAAA HHHHxx +6906 9430 0 2 6 6 6 906 906 1906 6906 12 13 QFAAAA SYNAAA OOOOxx +2539 9431 1 3 9 19 39 539 539 2539 2539 78 79 RTAAAA TYNAAA VVVVxx +5988 9432 0 0 8 8 88 988 1988 988 5988 176 177 IWAAAA UYNAAA AAAAxx +8908 9433 0 0 8 8 8 908 908 3908 8908 16 17 QEAAAA VYNAAA HHHHxx +2319 9434 1 3 9 19 19 319 319 2319 2319 38 39 FLAAAA WYNAAA OOOOxx +3263 9435 1 3 3 3 63 263 1263 3263 3263 126 127 NVAAAA XYNAAA VVVVxx +4039 9436 1 3 9 19 39 39 39 4039 4039 78 79 JZAAAA YYNAAA AAAAxx +6373 9437 1 1 3 13 73 373 373 1373 6373 146 147 DLAAAA ZYNAAA HHHHxx +1168 9438 0 0 8 8 68 168 1168 1168 1168 136 137 YSAAAA AZNAAA OOOOxx +8338 9439 0 2 8 18 38 338 338 3338 8338 76 77 SIAAAA BZNAAA VVVVxx +1172 9440 0 0 2 12 72 172 1172 1172 1172 144 145 CTAAAA CZNAAA AAAAxx +200 9441 0 0 0 0 0 200 200 200 200 0 1 SHAAAA DZNAAA HHHHxx +6355 9442 1 3 5 15 55 355 355 1355 6355 110 111 LKAAAA EZNAAA OOOOxx +7768 9443 0 0 8 8 68 768 1768 2768 7768 136 137 UMAAAA FZNAAA VVVVxx +25 9444 1 1 5 5 25 25 25 25 25 50 51 ZAAAAA GZNAAA AAAAxx +7144 9445 0 0 4 4 44 144 1144 2144 7144 88 89 UOAAAA HZNAAA HHHHxx +8671 9446 1 3 1 11 71 671 671 3671 8671 142 143 NVAAAA IZNAAA OOOOxx +9163 9447 1 3 3 3 63 163 1163 4163 9163 126 127 LOAAAA JZNAAA VVVVxx +8889 9448 1 1 9 9 89 889 889 3889 8889 178 179 XDAAAA KZNAAA AAAAxx +5950 9449 0 2 0 10 50 950 1950 950 5950 100 101 WUAAAA LZNAAA HHHHxx +6163 9450 1 3 3 3 63 163 163 1163 6163 126 127 BDAAAA MZNAAA OOOOxx +8119 9451 1 3 9 19 19 119 119 3119 8119 38 39 HAAAAA NZNAAA VVVVxx +1416 9452 0 0 6 16 16 416 1416 1416 1416 32 33 MCAAAA OZNAAA AAAAxx +4132 9453 0 0 2 12 32 132 132 4132 4132 64 65 YCAAAA PZNAAA HHHHxx +2294 9454 0 2 4 14 94 294 294 2294 2294 188 189 GKAAAA QZNAAA OOOOxx +9094 9455 0 2 4 14 94 94 1094 4094 9094 188 189 ULAAAA RZNAAA VVVVxx +4168 9456 0 0 8 8 68 168 168 4168 4168 136 137 IEAAAA SZNAAA AAAAxx +9108 9457 0 0 8 8 8 108 1108 4108 9108 16 17 IMAAAA TZNAAA HHHHxx +5706 9458 0 2 6 6 6 706 1706 706 5706 12 13 MLAAAA UZNAAA OOOOxx +2231 9459 1 3 1 11 31 231 231 2231 2231 62 63 VHAAAA VZNAAA VVVVxx +2173 9460 1 1 3 13 73 173 173 2173 2173 146 147 PFAAAA WZNAAA AAAAxx +90 9461 0 2 0 10 90 90 90 90 90 180 181 MDAAAA XZNAAA HHHHxx +9996 9462 0 0 6 16 96 996 1996 4996 9996 192 193 MUAAAA YZNAAA OOOOxx +330 9463 0 2 0 10 30 330 330 330 330 60 61 SMAAAA ZZNAAA VVVVxx +2052 9464 0 0 2 12 52 52 52 2052 2052 104 105 YAAAAA AAOAAA AAAAxx +1093 9465 1 1 3 13 93 93 1093 1093 1093 186 187 BQAAAA BAOAAA HHHHxx +5817 9466 1 1 7 17 17 817 1817 817 5817 34 35 TPAAAA CAOAAA OOOOxx +1559 9467 1 3 9 19 59 559 1559 1559 1559 118 119 ZHAAAA DAOAAA VVVVxx +8405 9468 1 1 5 5 5 405 405 3405 8405 10 11 HLAAAA EAOAAA AAAAxx +9962 9469 0 2 2 2 62 962 1962 4962 9962 124 125 ETAAAA FAOAAA HHHHxx +9461 9470 1 1 1 1 61 461 1461 4461 9461 122 123 XZAAAA GAOAAA OOOOxx +3028 9471 0 0 8 8 28 28 1028 3028 3028 56 57 MMAAAA HAOAAA VVVVxx +6814 9472 0 2 4 14 14 814 814 1814 6814 28 29 CCAAAA IAOAAA AAAAxx +9587 9473 1 3 7 7 87 587 1587 4587 9587 174 175 TEAAAA JAOAAA HHHHxx +6863 9474 1 3 3 3 63 863 863 1863 6863 126 127 ZDAAAA KAOAAA OOOOxx +4963 9475 1 3 3 3 63 963 963 4963 4963 126 127 XIAAAA LAOAAA VVVVxx +7811 9476 1 3 1 11 11 811 1811 2811 7811 22 23 LOAAAA MAOAAA AAAAxx +7608 9477 0 0 8 8 8 608 1608 2608 7608 16 17 QGAAAA NAOAAA HHHHxx +5321 9478 1 1 1 1 21 321 1321 321 5321 42 43 RWAAAA OAOAAA OOOOxx +9971 9479 1 3 1 11 71 971 1971 4971 9971 142 143 NTAAAA PAOAAA VVVVxx +6161 9480 1 1 1 1 61 161 161 1161 6161 122 123 ZCAAAA QAOAAA AAAAxx +2181 9481 1 1 1 1 81 181 181 2181 2181 162 163 XFAAAA RAOAAA HHHHxx +3828 9482 0 0 8 8 28 828 1828 3828 3828 56 57 GRAAAA SAOAAA OOOOxx +348 9483 0 0 8 8 48 348 348 348 348 96 97 KNAAAA TAOAAA VVVVxx +5459 9484 1 3 9 19 59 459 1459 459 5459 118 119 ZBAAAA UAOAAA AAAAxx +9406 9485 0 2 6 6 6 406 1406 4406 9406 12 13 UXAAAA VAOAAA HHHHxx +9852 9486 0 0 2 12 52 852 1852 4852 9852 104 105 YOAAAA WAOAAA OOOOxx +3095 9487 1 3 5 15 95 95 1095 3095 3095 190 191 BPAAAA XAOAAA VVVVxx +5597 9488 1 1 7 17 97 597 1597 597 5597 194 195 HHAAAA YAOAAA AAAAxx +8841 9489 1 1 1 1 41 841 841 3841 8841 82 83 BCAAAA ZAOAAA HHHHxx +3536 9490 0 0 6 16 36 536 1536 3536 3536 72 73 AGAAAA ABOAAA OOOOxx +4009 9491 1 1 9 9 9 9 9 4009 4009 18 19 FYAAAA BBOAAA VVVVxx +7366 9492 0 2 6 6 66 366 1366 2366 7366 132 133 IXAAAA CBOAAA AAAAxx +7327 9493 1 3 7 7 27 327 1327 2327 7327 54 55 VVAAAA DBOAAA HHHHxx +1613 9494 1 1 3 13 13 613 1613 1613 1613 26 27 BKAAAA EBOAAA OOOOxx +8619 9495 1 3 9 19 19 619 619 3619 8619 38 39 NTAAAA FBOAAA VVVVxx +4880 9496 0 0 0 0 80 880 880 4880 4880 160 161 SFAAAA GBOAAA AAAAxx +1552 9497 0 0 2 12 52 552 1552 1552 1552 104 105 SHAAAA HBOAAA HHHHxx +7636 9498 0 0 6 16 36 636 1636 2636 7636 72 73 SHAAAA IBOAAA OOOOxx +8397 9499 1 1 7 17 97 397 397 3397 8397 194 195 ZKAAAA JBOAAA VVVVxx +6224 9500 0 0 4 4 24 224 224 1224 6224 48 49 KFAAAA KBOAAA AAAAxx +9102 9501 0 2 2 2 2 102 1102 4102 9102 4 5 CMAAAA LBOAAA HHHHxx +7906 9502 0 2 6 6 6 906 1906 2906 7906 12 13 CSAAAA MBOAAA OOOOxx +9467 9503 1 3 7 7 67 467 1467 4467 9467 134 135 DAAAAA NBOAAA VVVVxx +828 9504 0 0 8 8 28 828 828 828 828 56 57 WFAAAA OBOAAA AAAAxx +9585 9505 1 1 5 5 85 585 1585 4585 9585 170 171 REAAAA PBOAAA HHHHxx +925 9506 1 1 5 5 25 925 925 925 925 50 51 PJAAAA QBOAAA OOOOxx +7375 9507 1 3 5 15 75 375 1375 2375 7375 150 151 RXAAAA RBOAAA VVVVxx +4027 9508 1 3 7 7 27 27 27 4027 4027 54 55 XYAAAA SBOAAA AAAAxx +766 9509 0 2 6 6 66 766 766 766 766 132 133 MDAAAA TBOAAA HHHHxx +5633 9510 1 1 3 13 33 633 1633 633 5633 66 67 RIAAAA UBOAAA OOOOxx +5648 9511 0 0 8 8 48 648 1648 648 5648 96 97 GJAAAA VBOAAA VVVVxx +148 9512 0 0 8 8 48 148 148 148 148 96 97 SFAAAA WBOAAA AAAAxx +2072 9513 0 0 2 12 72 72 72 2072 2072 144 145 SBAAAA XBOAAA HHHHxx +431 9514 1 3 1 11 31 431 431 431 431 62 63 PQAAAA YBOAAA OOOOxx +1711 9515 1 3 1 11 11 711 1711 1711 1711 22 23 VNAAAA ZBOAAA VVVVxx +9378 9516 0 2 8 18 78 378 1378 4378 9378 156 157 SWAAAA ACOAAA AAAAxx +6776 9517 0 0 6 16 76 776 776 1776 6776 152 153 QAAAAA BCOAAA HHHHxx +6842 9518 0 2 2 2 42 842 842 1842 6842 84 85 EDAAAA CCOAAA OOOOxx +2656 9519 0 0 6 16 56 656 656 2656 2656 112 113 EYAAAA DCOAAA VVVVxx +3116 9520 0 0 6 16 16 116 1116 3116 3116 32 33 WPAAAA ECOAAA AAAAxx +7904 9521 0 0 4 4 4 904 1904 2904 7904 8 9 ASAAAA FCOAAA HHHHxx +3529 9522 1 1 9 9 29 529 1529 3529 3529 58 59 TFAAAA GCOAAA OOOOxx +3240 9523 0 0 0 0 40 240 1240 3240 3240 80 81 QUAAAA HCOAAA VVVVxx +5801 9524 1 1 1 1 1 801 1801 801 5801 2 3 DPAAAA ICOAAA AAAAxx +4090 9525 0 2 0 10 90 90 90 4090 4090 180 181 IBAAAA JCOAAA HHHHxx +7687 9526 1 3 7 7 87 687 1687 2687 7687 174 175 RJAAAA KCOAAA OOOOxx +9711 9527 1 3 1 11 11 711 1711 4711 9711 22 23 NJAAAA LCOAAA VVVVxx +4760 9528 0 0 0 0 60 760 760 4760 4760 120 121 CBAAAA MCOAAA AAAAxx +5524 9529 0 0 4 4 24 524 1524 524 5524 48 49 MEAAAA NCOAAA HHHHxx +2251 9530 1 3 1 11 51 251 251 2251 2251 102 103 PIAAAA OCOAAA OOOOxx +1511 9531 1 3 1 11 11 511 1511 1511 1511 22 23 DGAAAA PCOAAA VVVVxx +5991 9532 1 3 1 11 91 991 1991 991 5991 182 183 LWAAAA QCOAAA AAAAxx +7808 9533 0 0 8 8 8 808 1808 2808 7808 16 17 IOAAAA RCOAAA HHHHxx +8708 9534 0 0 8 8 8 708 708 3708 8708 16 17 YWAAAA SCOAAA OOOOxx +8939 9535 1 3 9 19 39 939 939 3939 8939 78 79 VFAAAA TCOAAA VVVVxx +4295 9536 1 3 5 15 95 295 295 4295 4295 190 191 FJAAAA UCOAAA AAAAxx +5905 9537 1 1 5 5 5 905 1905 905 5905 10 11 DTAAAA VCOAAA HHHHxx +2649 9538 1 1 9 9 49 649 649 2649 2649 98 99 XXAAAA WCOAAA OOOOxx +2347 9539 1 3 7 7 47 347 347 2347 2347 94 95 HMAAAA XCOAAA VVVVxx +6339 9540 1 3 9 19 39 339 339 1339 6339 78 79 VJAAAA YCOAAA AAAAxx +292 9541 0 0 2 12 92 292 292 292 292 184 185 GLAAAA ZCOAAA HHHHxx +9314 9542 0 2 4 14 14 314 1314 4314 9314 28 29 GUAAAA ADOAAA OOOOxx +6893 9543 1 1 3 13 93 893 893 1893 6893 186 187 DFAAAA BDOAAA VVVVxx +3970 9544 0 2 0 10 70 970 1970 3970 3970 140 141 SWAAAA CDOAAA AAAAxx +1652 9545 0 0 2 12 52 652 1652 1652 1652 104 105 OLAAAA DDOAAA HHHHxx +4326 9546 0 2 6 6 26 326 326 4326 4326 52 53 KKAAAA EDOAAA OOOOxx +7881 9547 1 1 1 1 81 881 1881 2881 7881 162 163 DRAAAA FDOAAA VVVVxx +5291 9548 1 3 1 11 91 291 1291 291 5291 182 183 NVAAAA GDOAAA AAAAxx +957 9549 1 1 7 17 57 957 957 957 957 114 115 VKAAAA HDOAAA HHHHxx +2313 9550 1 1 3 13 13 313 313 2313 2313 26 27 ZKAAAA IDOAAA OOOOxx +5463 9551 1 3 3 3 63 463 1463 463 5463 126 127 DCAAAA JDOAAA VVVVxx +1268 9552 0 0 8 8 68 268 1268 1268 1268 136 137 UWAAAA KDOAAA AAAAxx +5028 9553 0 0 8 8 28 28 1028 28 5028 56 57 KLAAAA LDOAAA HHHHxx +656 9554 0 0 6 16 56 656 656 656 656 112 113 GZAAAA MDOAAA OOOOxx +9274 9555 0 2 4 14 74 274 1274 4274 9274 148 149 SSAAAA NDOAAA VVVVxx +8217 9556 1 1 7 17 17 217 217 3217 8217 34 35 BEAAAA ODOAAA AAAAxx +2175 9557 1 3 5 15 75 175 175 2175 2175 150 151 RFAAAA PDOAAA HHHHxx +6028 9558 0 0 8 8 28 28 28 1028 6028 56 57 WXAAAA QDOAAA OOOOxx +7584 9559 0 0 4 4 84 584 1584 2584 7584 168 169 SFAAAA RDOAAA VVVVxx +4114 9560 0 2 4 14 14 114 114 4114 4114 28 29 GCAAAA SDOAAA AAAAxx +8894 9561 0 2 4 14 94 894 894 3894 8894 188 189 CEAAAA TDOAAA HHHHxx +781 9562 1 1 1 1 81 781 781 781 781 162 163 BEAAAA UDOAAA OOOOxx +133 9563 1 1 3 13 33 133 133 133 133 66 67 DFAAAA VDOAAA VVVVxx +7572 9564 0 0 2 12 72 572 1572 2572 7572 144 145 GFAAAA WDOAAA AAAAxx +8514 9565 0 2 4 14 14 514 514 3514 8514 28 29 MPAAAA XDOAAA HHHHxx +3352 9566 0 0 2 12 52 352 1352 3352 3352 104 105 YYAAAA YDOAAA OOOOxx +8098 9567 0 2 8 18 98 98 98 3098 8098 196 197 MZAAAA ZDOAAA VVVVxx +9116 9568 0 0 6 16 16 116 1116 4116 9116 32 33 QMAAAA AEOAAA AAAAxx +9444 9569 0 0 4 4 44 444 1444 4444 9444 88 89 GZAAAA BEOAAA HHHHxx +2590 9570 0 2 0 10 90 590 590 2590 2590 180 181 QVAAAA CEOAAA OOOOxx +7302 9571 0 2 2 2 2 302 1302 2302 7302 4 5 WUAAAA DEOAAA VVVVxx +7444 9572 0 0 4 4 44 444 1444 2444 7444 88 89 IAAAAA EEOAAA AAAAxx +8748 9573 0 0 8 8 48 748 748 3748 8748 96 97 MYAAAA FEOAAA HHHHxx +7615 9574 1 3 5 15 15 615 1615 2615 7615 30 31 XGAAAA GEOAAA OOOOxx +6090 9575 0 2 0 10 90 90 90 1090 6090 180 181 GAAAAA HEOAAA VVVVxx +1529 9576 1 1 9 9 29 529 1529 1529 1529 58 59 VGAAAA IEOAAA AAAAxx +9398 9577 0 2 8 18 98 398 1398 4398 9398 196 197 MXAAAA JEOAAA HHHHxx +6114 9578 0 2 4 14 14 114 114 1114 6114 28 29 EBAAAA KEOAAA OOOOxx +2736 9579 0 0 6 16 36 736 736 2736 2736 72 73 GBAAAA LEOAAA VVVVxx +468 9580 0 0 8 8 68 468 468 468 468 136 137 ASAAAA MEOAAA AAAAxx +1487 9581 1 3 7 7 87 487 1487 1487 1487 174 175 FFAAAA NEOAAA HHHHxx +4784 9582 0 0 4 4 84 784 784 4784 4784 168 169 ACAAAA OEOAAA OOOOxx +6731 9583 1 3 1 11 31 731 731 1731 6731 62 63 XYAAAA PEOAAA VVVVxx +3328 9584 0 0 8 8 28 328 1328 3328 3328 56 57 AYAAAA QEOAAA AAAAxx +6891 9585 1 3 1 11 91 891 891 1891 6891 182 183 BFAAAA REOAAA HHHHxx +8039 9586 1 3 9 19 39 39 39 3039 8039 78 79 FXAAAA SEOAAA OOOOxx +4064 9587 0 0 4 4 64 64 64 4064 4064 128 129 IAAAAA TEOAAA VVVVxx +542 9588 0 2 2 2 42 542 542 542 542 84 85 WUAAAA UEOAAA AAAAxx +1039 9589 1 3 9 19 39 39 1039 1039 1039 78 79 ZNAAAA VEOAAA HHHHxx +5603 9590 1 3 3 3 3 603 1603 603 5603 6 7 NHAAAA WEOAAA OOOOxx +6641 9591 1 1 1 1 41 641 641 1641 6641 82 83 LVAAAA XEOAAA VVVVxx +6307 9592 1 3 7 7 7 307 307 1307 6307 14 15 PIAAAA YEOAAA AAAAxx +5354 9593 0 2 4 14 54 354 1354 354 5354 108 109 YXAAAA ZEOAAA HHHHxx +7878 9594 0 2 8 18 78 878 1878 2878 7878 156 157 ARAAAA AFOAAA OOOOxx +6391 9595 1 3 1 11 91 391 391 1391 6391 182 183 VLAAAA BFOAAA VVVVxx +4575 9596 1 3 5 15 75 575 575 4575 4575 150 151 ZTAAAA CFOAAA AAAAxx +6644 9597 0 0 4 4 44 644 644 1644 6644 88 89 OVAAAA DFOAAA HHHHxx +5207 9598 1 3 7 7 7 207 1207 207 5207 14 15 HSAAAA EFOAAA OOOOxx +1736 9599 0 0 6 16 36 736 1736 1736 1736 72 73 UOAAAA FFOAAA VVVVxx +3547 9600 1 3 7 7 47 547 1547 3547 3547 94 95 LGAAAA GFOAAA AAAAxx +6647 9601 1 3 7 7 47 647 647 1647 6647 94 95 RVAAAA HFOAAA HHHHxx +4107 9602 1 3 7 7 7 107 107 4107 4107 14 15 ZBAAAA IFOAAA OOOOxx +8125 9603 1 1 5 5 25 125 125 3125 8125 50 51 NAAAAA JFOAAA VVVVxx +9223 9604 1 3 3 3 23 223 1223 4223 9223 46 47 TQAAAA KFOAAA AAAAxx +6903 9605 1 3 3 3 3 903 903 1903 6903 6 7 NFAAAA LFOAAA HHHHxx +3639 9606 1 3 9 19 39 639 1639 3639 3639 78 79 ZJAAAA MFOAAA OOOOxx +9606 9607 0 2 6 6 6 606 1606 4606 9606 12 13 MFAAAA NFOAAA VVVVxx +3232 9608 0 0 2 12 32 232 1232 3232 3232 64 65 IUAAAA OFOAAA AAAAxx +2063 9609 1 3 3 3 63 63 63 2063 2063 126 127 JBAAAA PFOAAA HHHHxx +3731 9610 1 3 1 11 31 731 1731 3731 3731 62 63 NNAAAA QFOAAA OOOOxx +2558 9611 0 2 8 18 58 558 558 2558 2558 116 117 KUAAAA RFOAAA VVVVxx +2357 9612 1 1 7 17 57 357 357 2357 2357 114 115 RMAAAA SFOAAA AAAAxx +6008 9613 0 0 8 8 8 8 8 1008 6008 16 17 CXAAAA TFOAAA HHHHxx +8246 9614 0 2 6 6 46 246 246 3246 8246 92 93 EFAAAA UFOAAA OOOOxx +8220 9615 0 0 0 0 20 220 220 3220 8220 40 41 EEAAAA VFOAAA VVVVxx +1075 9616 1 3 5 15 75 75 1075 1075 1075 150 151 JPAAAA WFOAAA AAAAxx +2410 9617 0 2 0 10 10 410 410 2410 2410 20 21 SOAAAA XFOAAA HHHHxx +3253 9618 1 1 3 13 53 253 1253 3253 3253 106 107 DVAAAA YFOAAA OOOOxx +4370 9619 0 2 0 10 70 370 370 4370 4370 140 141 CMAAAA ZFOAAA VVVVxx +8426 9620 0 2 6 6 26 426 426 3426 8426 52 53 CMAAAA AGOAAA AAAAxx +2262 9621 0 2 2 2 62 262 262 2262 2262 124 125 AJAAAA BGOAAA HHHHxx +4149 9622 1 1 9 9 49 149 149 4149 4149 98 99 PDAAAA CGOAAA OOOOxx +2732 9623 0 0 2 12 32 732 732 2732 2732 64 65 CBAAAA DGOAAA VVVVxx +8606 9624 0 2 6 6 6 606 606 3606 8606 12 13 ATAAAA EGOAAA AAAAxx +6311 9625 1 3 1 11 11 311 311 1311 6311 22 23 TIAAAA FGOAAA HHHHxx +7223 9626 1 3 3 3 23 223 1223 2223 7223 46 47 VRAAAA GGOAAA OOOOxx +3054 9627 0 2 4 14 54 54 1054 3054 3054 108 109 MNAAAA HGOAAA VVVVxx +3952 9628 0 0 2 12 52 952 1952 3952 3952 104 105 AWAAAA IGOAAA AAAAxx +8252 9629 0 0 2 12 52 252 252 3252 8252 104 105 KFAAAA JGOAAA HHHHxx +6020 9630 0 0 0 0 20 20 20 1020 6020 40 41 OXAAAA KGOAAA OOOOxx +3846 9631 0 2 6 6 46 846 1846 3846 3846 92 93 YRAAAA LGOAAA VVVVxx +3755 9632 1 3 5 15 55 755 1755 3755 3755 110 111 LOAAAA MGOAAA AAAAxx +3765 9633 1 1 5 5 65 765 1765 3765 3765 130 131 VOAAAA NGOAAA HHHHxx +3434 9634 0 2 4 14 34 434 1434 3434 3434 68 69 CCAAAA OGOAAA OOOOxx +1381 9635 1 1 1 1 81 381 1381 1381 1381 162 163 DBAAAA PGOAAA VVVVxx +287 9636 1 3 7 7 87 287 287 287 287 174 175 BLAAAA QGOAAA AAAAxx +4476 9637 0 0 6 16 76 476 476 4476 4476 152 153 EQAAAA RGOAAA HHHHxx +2916 9638 0 0 6 16 16 916 916 2916 2916 32 33 EIAAAA SGOAAA OOOOxx +4517 9639 1 1 7 17 17 517 517 4517 4517 34 35 TRAAAA TGOAAA VVVVxx +4561 9640 1 1 1 1 61 561 561 4561 4561 122 123 LTAAAA UGOAAA AAAAxx +5106 9641 0 2 6 6 6 106 1106 106 5106 12 13 KOAAAA VGOAAA HHHHxx +2077 9642 1 1 7 17 77 77 77 2077 2077 154 155 XBAAAA WGOAAA OOOOxx +5269 9643 1 1 9 9 69 269 1269 269 5269 138 139 RUAAAA XGOAAA VVVVxx +5688 9644 0 0 8 8 88 688 1688 688 5688 176 177 UKAAAA YGOAAA AAAAxx +8831 9645 1 3 1 11 31 831 831 3831 8831 62 63 RBAAAA ZGOAAA HHHHxx +3867 9646 1 3 7 7 67 867 1867 3867 3867 134 135 TSAAAA AHOAAA OOOOxx +6062 9647 0 2 2 2 62 62 62 1062 6062 124 125 EZAAAA BHOAAA VVVVxx +8460 9648 0 0 0 0 60 460 460 3460 8460 120 121 KNAAAA CHOAAA AAAAxx +3138 9649 0 2 8 18 38 138 1138 3138 3138 76 77 SQAAAA DHOAAA HHHHxx +3173 9650 1 1 3 13 73 173 1173 3173 3173 146 147 BSAAAA EHOAAA OOOOxx +7018 9651 0 2 8 18 18 18 1018 2018 7018 36 37 YJAAAA FHOAAA VVVVxx +4836 9652 0 0 6 16 36 836 836 4836 4836 72 73 AEAAAA GHOAAA AAAAxx +1007 9653 1 3 7 7 7 7 1007 1007 1007 14 15 TMAAAA HHOAAA HHHHxx +658 9654 0 2 8 18 58 658 658 658 658 116 117 IZAAAA IHOAAA OOOOxx +5205 9655 1 1 5 5 5 205 1205 205 5205 10 11 FSAAAA JHOAAA VVVVxx +5805 9656 1 1 5 5 5 805 1805 805 5805 10 11 HPAAAA KHOAAA AAAAxx +5959 9657 1 3 9 19 59 959 1959 959 5959 118 119 FVAAAA LHOAAA HHHHxx +2863 9658 1 3 3 3 63 863 863 2863 2863 126 127 DGAAAA MHOAAA OOOOxx +7272 9659 0 0 2 12 72 272 1272 2272 7272 144 145 STAAAA NHOAAA VVVVxx +8437 9660 1 1 7 17 37 437 437 3437 8437 74 75 NMAAAA OHOAAA AAAAxx +4900 9661 0 0 0 0 0 900 900 4900 4900 0 1 MGAAAA PHOAAA HHHHxx +890 9662 0 2 0 10 90 890 890 890 890 180 181 GIAAAA QHOAAA OOOOxx +3530 9663 0 2 0 10 30 530 1530 3530 3530 60 61 UFAAAA RHOAAA VVVVxx +6209 9664 1 1 9 9 9 209 209 1209 6209 18 19 VEAAAA SHOAAA AAAAxx +4595 9665 1 3 5 15 95 595 595 4595 4595 190 191 TUAAAA THOAAA HHHHxx +5982 9666 0 2 2 2 82 982 1982 982 5982 164 165 CWAAAA UHOAAA OOOOxx +1101 9667 1 1 1 1 1 101 1101 1101 1101 2 3 JQAAAA VHOAAA VVVVxx +9555 9668 1 3 5 15 55 555 1555 4555 9555 110 111 NDAAAA WHOAAA AAAAxx +1918 9669 0 2 8 18 18 918 1918 1918 1918 36 37 UVAAAA XHOAAA HHHHxx +3527 9670 1 3 7 7 27 527 1527 3527 3527 54 55 RFAAAA YHOAAA OOOOxx +7309 9671 1 1 9 9 9 309 1309 2309 7309 18 19 DVAAAA ZHOAAA VVVVxx +8213 9672 1 1 3 13 13 213 213 3213 8213 26 27 XDAAAA AIOAAA AAAAxx +306 9673 0 2 6 6 6 306 306 306 306 12 13 ULAAAA BIOAAA HHHHxx +845 9674 1 1 5 5 45 845 845 845 845 90 91 NGAAAA CIOAAA OOOOxx +16 9675 0 0 6 16 16 16 16 16 16 32 33 QAAAAA DIOAAA VVVVxx +437 9676 1 1 7 17 37 437 437 437 437 74 75 VQAAAA EIOAAA AAAAxx +9518 9677 0 2 8 18 18 518 1518 4518 9518 36 37 CCAAAA FIOAAA HHHHxx +2142 9678 0 2 2 2 42 142 142 2142 2142 84 85 KEAAAA GIOAAA OOOOxx +8121 9679 1 1 1 1 21 121 121 3121 8121 42 43 JAAAAA HIOAAA VVVVxx +7354 9680 0 2 4 14 54 354 1354 2354 7354 108 109 WWAAAA IIOAAA AAAAxx +1720 9681 0 0 0 0 20 720 1720 1720 1720 40 41 EOAAAA JIOAAA HHHHxx +6078 9682 0 2 8 18 78 78 78 1078 6078 156 157 UZAAAA KIOAAA OOOOxx +5929 9683 1 1 9 9 29 929 1929 929 5929 58 59 BUAAAA LIOAAA VVVVxx +3856 9684 0 0 6 16 56 856 1856 3856 3856 112 113 ISAAAA MIOAAA AAAAxx +3424 9685 0 0 4 4 24 424 1424 3424 3424 48 49 SBAAAA NIOAAA HHHHxx +1712 9686 0 0 2 12 12 712 1712 1712 1712 24 25 WNAAAA OIOAAA OOOOxx +2340 9687 0 0 0 0 40 340 340 2340 2340 80 81 AMAAAA PIOAAA VVVVxx +5570 9688 0 2 0 10 70 570 1570 570 5570 140 141 GGAAAA QIOAAA AAAAxx +8734 9689 0 2 4 14 34 734 734 3734 8734 68 69 YXAAAA RIOAAA HHHHxx +6077 9690 1 1 7 17 77 77 77 1077 6077 154 155 TZAAAA SIOAAA OOOOxx +2960 9691 0 0 0 0 60 960 960 2960 2960 120 121 WJAAAA TIOAAA VVVVxx +5062 9692 0 2 2 2 62 62 1062 62 5062 124 125 SMAAAA UIOAAA AAAAxx +1532 9693 0 0 2 12 32 532 1532 1532 1532 64 65 YGAAAA VIOAAA HHHHxx +8298 9694 0 2 8 18 98 298 298 3298 8298 196 197 EHAAAA WIOAAA OOOOxx +2496 9695 0 0 6 16 96 496 496 2496 2496 192 193 ASAAAA XIOAAA VVVVxx +8412 9696 0 0 2 12 12 412 412 3412 8412 24 25 OLAAAA YIOAAA AAAAxx +724 9697 0 0 4 4 24 724 724 724 724 48 49 WBAAAA ZIOAAA HHHHxx +1019 9698 1 3 9 19 19 19 1019 1019 1019 38 39 FNAAAA AJOAAA OOOOxx +6265 9699 1 1 5 5 65 265 265 1265 6265 130 131 ZGAAAA BJOAAA VVVVxx +740 9700 0 0 0 0 40 740 740 740 740 80 81 MCAAAA CJOAAA AAAAxx +8495 9701 1 3 5 15 95 495 495 3495 8495 190 191 TOAAAA DJOAAA HHHHxx +6983 9702 1 3 3 3 83 983 983 1983 6983 166 167 PIAAAA EJOAAA OOOOxx +991 9703 1 3 1 11 91 991 991 991 991 182 183 DMAAAA FJOAAA VVVVxx +3189 9704 1 1 9 9 89 189 1189 3189 3189 178 179 RSAAAA GJOAAA AAAAxx +4487 9705 1 3 7 7 87 487 487 4487 4487 174 175 PQAAAA HJOAAA HHHHxx +5554 9706 0 2 4 14 54 554 1554 554 5554 108 109 QFAAAA IJOAAA OOOOxx +1258 9707 0 2 8 18 58 258 1258 1258 1258 116 117 KWAAAA JJOAAA VVVVxx +5359 9708 1 3 9 19 59 359 1359 359 5359 118 119 DYAAAA KJOAAA AAAAxx +2709 9709 1 1 9 9 9 709 709 2709 2709 18 19 FAAAAA LJOAAA HHHHxx +361 9710 1 1 1 1 61 361 361 361 361 122 123 XNAAAA MJOAAA OOOOxx +4028 9711 0 0 8 8 28 28 28 4028 4028 56 57 YYAAAA NJOAAA VVVVxx +3735 9712 1 3 5 15 35 735 1735 3735 3735 70 71 RNAAAA OJOAAA AAAAxx +4427 9713 1 3 7 7 27 427 427 4427 4427 54 55 HOAAAA PJOAAA HHHHxx +7540 9714 0 0 0 0 40 540 1540 2540 7540 80 81 AEAAAA QJOAAA OOOOxx +3569 9715 1 1 9 9 69 569 1569 3569 3569 138 139 HHAAAA RJOAAA VVVVxx +1916 9716 0 0 6 16 16 916 1916 1916 1916 32 33 SVAAAA SJOAAA AAAAxx +7596 9717 0 0 6 16 96 596 1596 2596 7596 192 193 EGAAAA TJOAAA HHHHxx +9721 9718 1 1 1 1 21 721 1721 4721 9721 42 43 XJAAAA UJOAAA OOOOxx +4429 9719 1 1 9 9 29 429 429 4429 4429 58 59 JOAAAA VJOAAA VVVVxx +3471 9720 1 3 1 11 71 471 1471 3471 3471 142 143 NDAAAA WJOAAA AAAAxx +1157 9721 1 1 7 17 57 157 1157 1157 1157 114 115 NSAAAA XJOAAA HHHHxx +5700 9722 0 0 0 0 0 700 1700 700 5700 0 1 GLAAAA YJOAAA OOOOxx +4431 9723 1 3 1 11 31 431 431 4431 4431 62 63 LOAAAA ZJOAAA VVVVxx +9409 9724 1 1 9 9 9 409 1409 4409 9409 18 19 XXAAAA AKOAAA AAAAxx +8752 9725 0 0 2 12 52 752 752 3752 8752 104 105 QYAAAA BKOAAA HHHHxx +9484 9726 0 0 4 4 84 484 1484 4484 9484 168 169 UAAAAA CKOAAA OOOOxx +1266 9727 0 2 6 6 66 266 1266 1266 1266 132 133 SWAAAA DKOAAA VVVVxx +9097 9728 1 1 7 17 97 97 1097 4097 9097 194 195 XLAAAA EKOAAA AAAAxx +3068 9729 0 0 8 8 68 68 1068 3068 3068 136 137 AOAAAA FKOAAA HHHHxx +5490 9730 0 2 0 10 90 490 1490 490 5490 180 181 EDAAAA GKOAAA OOOOxx +1375 9731 1 3 5 15 75 375 1375 1375 1375 150 151 XAAAAA HKOAAA VVVVxx +2487 9732 1 3 7 7 87 487 487 2487 2487 174 175 RRAAAA IKOAAA AAAAxx +1705 9733 1 1 5 5 5 705 1705 1705 1705 10 11 PNAAAA JKOAAA HHHHxx +1571 9734 1 3 1 11 71 571 1571 1571 1571 142 143 LIAAAA KKOAAA OOOOxx +4005 9735 1 1 5 5 5 5 5 4005 4005 10 11 BYAAAA LKOAAA VVVVxx +5497 9736 1 1 7 17 97 497 1497 497 5497 194 195 LDAAAA MKOAAA AAAAxx +2144 9737 0 0 4 4 44 144 144 2144 2144 88 89 MEAAAA NKOAAA HHHHxx +4052 9738 0 0 2 12 52 52 52 4052 4052 104 105 WZAAAA OKOAAA OOOOxx +4942 9739 0 2 2 2 42 942 942 4942 4942 84 85 CIAAAA PKOAAA VVVVxx +5504 9740 0 0 4 4 4 504 1504 504 5504 8 9 SDAAAA QKOAAA AAAAxx +2913 9741 1 1 3 13 13 913 913 2913 2913 26 27 BIAAAA RKOAAA HHHHxx +5617 9742 1 1 7 17 17 617 1617 617 5617 34 35 BIAAAA SKOAAA OOOOxx +8179 9743 1 3 9 19 79 179 179 3179 8179 158 159 PCAAAA TKOAAA VVVVxx +9437 9744 1 1 7 17 37 437 1437 4437 9437 74 75 ZYAAAA UKOAAA AAAAxx +1821 9745 1 1 1 1 21 821 1821 1821 1821 42 43 BSAAAA VKOAAA HHHHxx +5737 9746 1 1 7 17 37 737 1737 737 5737 74 75 RMAAAA WKOAAA OOOOxx +4207 9747 1 3 7 7 7 207 207 4207 4207 14 15 VFAAAA XKOAAA VVVVxx +4815 9748 1 3 5 15 15 815 815 4815 4815 30 31 FDAAAA YKOAAA AAAAxx +8707 9749 1 3 7 7 7 707 707 3707 8707 14 15 XWAAAA ZKOAAA HHHHxx +5970 9750 0 2 0 10 70 970 1970 970 5970 140 141 QVAAAA ALOAAA OOOOxx +5501 9751 1 1 1 1 1 501 1501 501 5501 2 3 PDAAAA BLOAAA VVVVxx +4013 9752 1 1 3 13 13 13 13 4013 4013 26 27 JYAAAA CLOAAA AAAAxx +9235 9753 1 3 5 15 35 235 1235 4235 9235 70 71 FRAAAA DLOAAA HHHHxx +2503 9754 1 3 3 3 3 503 503 2503 2503 6 7 HSAAAA ELOAAA OOOOxx +9181 9755 1 1 1 1 81 181 1181 4181 9181 162 163 DPAAAA FLOAAA VVVVxx +2289 9756 1 1 9 9 89 289 289 2289 2289 178 179 BKAAAA GLOAAA AAAAxx +4256 9757 0 0 6 16 56 256 256 4256 4256 112 113 SHAAAA HLOAAA HHHHxx +191 9758 1 3 1 11 91 191 191 191 191 182 183 JHAAAA ILOAAA OOOOxx +9655 9759 1 3 5 15 55 655 1655 4655 9655 110 111 JHAAAA JLOAAA VVVVxx +8615 9760 1 3 5 15 15 615 615 3615 8615 30 31 JTAAAA KLOAAA AAAAxx +3011 9761 1 3 1 11 11 11 1011 3011 3011 22 23 VLAAAA LLOAAA HHHHxx +6376 9762 0 0 6 16 76 376 376 1376 6376 152 153 GLAAAA MLOAAA OOOOxx +68 9763 0 0 8 8 68 68 68 68 68 136 137 QCAAAA NLOAAA VVVVxx +4720 9764 0 0 0 0 20 720 720 4720 4720 40 41 OZAAAA OLOAAA AAAAxx +6848 9765 0 0 8 8 48 848 848 1848 6848 96 97 KDAAAA PLOAAA HHHHxx +456 9766 0 0 6 16 56 456 456 456 456 112 113 ORAAAA QLOAAA OOOOxx +5887 9767 1 3 7 7 87 887 1887 887 5887 174 175 LSAAAA RLOAAA VVVVxx +9249 9768 1 1 9 9 49 249 1249 4249 9249 98 99 TRAAAA SLOAAA AAAAxx +4041 9769 1 1 1 1 41 41 41 4041 4041 82 83 LZAAAA TLOAAA HHHHxx +2304 9770 0 0 4 4 4 304 304 2304 2304 8 9 QKAAAA ULOAAA OOOOxx +8763 9771 1 3 3 3 63 763 763 3763 8763 126 127 BZAAAA VLOAAA VVVVxx +2115 9772 1 3 5 15 15 115 115 2115 2115 30 31 JDAAAA WLOAAA AAAAxx +8014 9773 0 2 4 14 14 14 14 3014 8014 28 29 GWAAAA XLOAAA HHHHxx +9895 9774 1 3 5 15 95 895 1895 4895 9895 190 191 PQAAAA YLOAAA OOOOxx +671 9775 1 3 1 11 71 671 671 671 671 142 143 VZAAAA ZLOAAA VVVVxx +3774 9776 0 2 4 14 74 774 1774 3774 3774 148 149 EPAAAA AMOAAA AAAAxx +134 9777 0 2 4 14 34 134 134 134 134 68 69 EFAAAA BMOAAA HHHHxx +534 9778 0 2 4 14 34 534 534 534 534 68 69 OUAAAA CMOAAA OOOOxx +7308 9779 0 0 8 8 8 308 1308 2308 7308 16 17 CVAAAA DMOAAA VVVVxx +5244 9780 0 0 4 4 44 244 1244 244 5244 88 89 STAAAA EMOAAA AAAAxx +1512 9781 0 0 2 12 12 512 1512 1512 1512 24 25 EGAAAA FMOAAA HHHHxx +8960 9782 0 0 0 0 60 960 960 3960 8960 120 121 QGAAAA GMOAAA OOOOxx +6602 9783 0 2 2 2 2 602 602 1602 6602 4 5 YTAAAA HMOAAA VVVVxx +593 9784 1 1 3 13 93 593 593 593 593 186 187 VWAAAA IMOAAA AAAAxx +2353 9785 1 1 3 13 53 353 353 2353 2353 106 107 NMAAAA JMOAAA HHHHxx +4139 9786 1 3 9 19 39 139 139 4139 4139 78 79 FDAAAA KMOAAA OOOOxx +3063 9787 1 3 3 3 63 63 1063 3063 3063 126 127 VNAAAA LMOAAA VVVVxx +652 9788 0 0 2 12 52 652 652 652 652 104 105 CZAAAA MMOAAA AAAAxx +7405 9789 1 1 5 5 5 405 1405 2405 7405 10 11 VYAAAA NMOAAA HHHHxx +3034 9790 0 2 4 14 34 34 1034 3034 3034 68 69 SMAAAA OMOAAA OOOOxx +4614 9791 0 2 4 14 14 614 614 4614 4614 28 29 MVAAAA PMOAAA VVVVxx +2351 9792 1 3 1 11 51 351 351 2351 2351 102 103 LMAAAA QMOAAA AAAAxx +8208 9793 0 0 8 8 8 208 208 3208 8208 16 17 SDAAAA RMOAAA HHHHxx +5475 9794 1 3 5 15 75 475 1475 475 5475 150 151 PCAAAA SMOAAA OOOOxx +6875 9795 1 3 5 15 75 875 875 1875 6875 150 151 LEAAAA TMOAAA VVVVxx +563 9796 1 3 3 3 63 563 563 563 563 126 127 RVAAAA UMOAAA AAAAxx +3346 9797 0 2 6 6 46 346 1346 3346 3346 92 93 SYAAAA VMOAAA HHHHxx +291 9798 1 3 1 11 91 291 291 291 291 182 183 FLAAAA WMOAAA OOOOxx +6345 9799 1 1 5 5 45 345 345 1345 6345 90 91 BKAAAA XMOAAA VVVVxx +8099 9800 1 3 9 19 99 99 99 3099 8099 198 199 NZAAAA YMOAAA AAAAxx +2078 9801 0 2 8 18 78 78 78 2078 2078 156 157 YBAAAA ZMOAAA HHHHxx +8238 9802 0 2 8 18 38 238 238 3238 8238 76 77 WEAAAA ANOAAA OOOOxx +4482 9803 0 2 2 2 82 482 482 4482 4482 164 165 KQAAAA BNOAAA VVVVxx +716 9804 0 0 6 16 16 716 716 716 716 32 33 OBAAAA CNOAAA AAAAxx +7288 9805 0 0 8 8 88 288 1288 2288 7288 176 177 IUAAAA DNOAAA HHHHxx +5906 9806 0 2 6 6 6 906 1906 906 5906 12 13 ETAAAA ENOAAA OOOOxx +5618 9807 0 2 8 18 18 618 1618 618 5618 36 37 CIAAAA FNOAAA VVVVxx +1141 9808 1 1 1 1 41 141 1141 1141 1141 82 83 XRAAAA GNOAAA AAAAxx +8231 9809 1 3 1 11 31 231 231 3231 8231 62 63 PEAAAA HNOAAA HHHHxx +3713 9810 1 1 3 13 13 713 1713 3713 3713 26 27 VMAAAA INOAAA OOOOxx +9158 9811 0 2 8 18 58 158 1158 4158 9158 116 117 GOAAAA JNOAAA VVVVxx +4051 9812 1 3 1 11 51 51 51 4051 4051 102 103 VZAAAA KNOAAA AAAAxx +1973 9813 1 1 3 13 73 973 1973 1973 1973 146 147 XXAAAA LNOAAA HHHHxx +6710 9814 0 2 0 10 10 710 710 1710 6710 20 21 CYAAAA MNOAAA OOOOxx +1021 9815 1 1 1 1 21 21 1021 1021 1021 42 43 HNAAAA NNOAAA VVVVxx +2196 9816 0 0 6 16 96 196 196 2196 2196 192 193 MGAAAA ONOAAA AAAAxx +8335 9817 1 3 5 15 35 335 335 3335 8335 70 71 PIAAAA PNOAAA HHHHxx +2272 9818 0 0 2 12 72 272 272 2272 2272 144 145 KJAAAA QNOAAA OOOOxx +3818 9819 0 2 8 18 18 818 1818 3818 3818 36 37 WQAAAA RNOAAA VVVVxx +679 9820 1 3 9 19 79 679 679 679 679 158 159 DAAAAA SNOAAA AAAAxx +7512 9821 0 0 2 12 12 512 1512 2512 7512 24 25 YCAAAA TNOAAA HHHHxx +493 9822 1 1 3 13 93 493 493 493 493 186 187 ZSAAAA UNOAAA OOOOxx +5663 9823 1 3 3 3 63 663 1663 663 5663 126 127 VJAAAA VNOAAA VVVVxx +4655 9824 1 3 5 15 55 655 655 4655 4655 110 111 BXAAAA WNOAAA AAAAxx +3996 9825 0 0 6 16 96 996 1996 3996 3996 192 193 SXAAAA XNOAAA HHHHxx +8797 9826 1 1 7 17 97 797 797 3797 8797 194 195 JAAAAA YNOAAA OOOOxx +2991 9827 1 3 1 11 91 991 991 2991 2991 182 183 BLAAAA ZNOAAA VVVVxx +7038 9828 0 2 8 18 38 38 1038 2038 7038 76 77 SKAAAA AOOAAA AAAAxx +4174 9829 0 2 4 14 74 174 174 4174 4174 148 149 OEAAAA BOOAAA HHHHxx +6908 9830 0 0 8 8 8 908 908 1908 6908 16 17 SFAAAA COOAAA OOOOxx +8477 9831 1 1 7 17 77 477 477 3477 8477 154 155 BOAAAA DOOAAA VVVVxx +3576 9832 0 0 6 16 76 576 1576 3576 3576 152 153 OHAAAA EOOAAA AAAAxx +2685 9833 1 1 5 5 85 685 685 2685 2685 170 171 HZAAAA FOOAAA HHHHxx +9161 9834 1 1 1 1 61 161 1161 4161 9161 122 123 JOAAAA GOOAAA OOOOxx +2951 9835 1 3 1 11 51 951 951 2951 2951 102 103 NJAAAA HOOAAA VVVVxx +8362 9836 0 2 2 2 62 362 362 3362 8362 124 125 QJAAAA IOOAAA AAAAxx +2379 9837 1 3 9 19 79 379 379 2379 2379 158 159 NNAAAA JOOAAA HHHHxx +1277 9838 1 1 7 17 77 277 1277 1277 1277 154 155 DXAAAA KOOAAA OOOOxx +1728 9839 0 0 8 8 28 728 1728 1728 1728 56 57 MOAAAA LOOAAA VVVVxx +9816 9840 0 0 6 16 16 816 1816 4816 9816 32 33 ONAAAA MOOAAA AAAAxx +6288 9841 0 0 8 8 88 288 288 1288 6288 176 177 WHAAAA NOOAAA HHHHxx +8985 9842 1 1 5 5 85 985 985 3985 8985 170 171 PHAAAA OOOAAA OOOOxx +771 9843 1 3 1 11 71 771 771 771 771 142 143 RDAAAA POOAAA VVVVxx +464 9844 0 0 4 4 64 464 464 464 464 128 129 WRAAAA QOOAAA AAAAxx +9625 9845 1 1 5 5 25 625 1625 4625 9625 50 51 FGAAAA ROOAAA HHHHxx +9608 9846 0 0 8 8 8 608 1608 4608 9608 16 17 OFAAAA SOOAAA OOOOxx +9170 9847 0 2 0 10 70 170 1170 4170 9170 140 141 SOAAAA TOOAAA VVVVxx +9658 9848 0 2 8 18 58 658 1658 4658 9658 116 117 MHAAAA UOOAAA AAAAxx +7515 9849 1 3 5 15 15 515 1515 2515 7515 30 31 BDAAAA VOOAAA HHHHxx +9400 9850 0 0 0 0 0 400 1400 4400 9400 0 1 OXAAAA WOOAAA OOOOxx +2045 9851 1 1 5 5 45 45 45 2045 2045 90 91 RAAAAA XOOAAA VVVVxx +324 9852 0 0 4 4 24 324 324 324 324 48 49 MMAAAA YOOAAA AAAAxx +4252 9853 0 0 2 12 52 252 252 4252 4252 104 105 OHAAAA ZOOAAA HHHHxx +8329 9854 1 1 9 9 29 329 329 3329 8329 58 59 JIAAAA APOAAA OOOOxx +4472 9855 0 0 2 12 72 472 472 4472 4472 144 145 AQAAAA BPOAAA VVVVxx +1047 9856 1 3 7 7 47 47 1047 1047 1047 94 95 HOAAAA CPOAAA AAAAxx +9341 9857 1 1 1 1 41 341 1341 4341 9341 82 83 HVAAAA DPOAAA HHHHxx +7000 9858 0 0 0 0 0 0 1000 2000 7000 0 1 GJAAAA EPOAAA OOOOxx +1429 9859 1 1 9 9 29 429 1429 1429 1429 58 59 ZCAAAA FPOAAA VVVVxx +2701 9860 1 1 1 1 1 701 701 2701 2701 2 3 XZAAAA GPOAAA AAAAxx +6630 9861 0 2 0 10 30 630 630 1630 6630 60 61 AVAAAA HPOAAA HHHHxx +3669 9862 1 1 9 9 69 669 1669 3669 3669 138 139 DLAAAA IPOAAA OOOOxx +8613 9863 1 1 3 13 13 613 613 3613 8613 26 27 HTAAAA JPOAAA VVVVxx +7080 9864 0 0 0 0 80 80 1080 2080 7080 160 161 IMAAAA KPOAAA AAAAxx +8788 9865 0 0 8 8 88 788 788 3788 8788 176 177 AAAAAA LPOAAA HHHHxx +6291 9866 1 3 1 11 91 291 291 1291 6291 182 183 ZHAAAA MPOAAA OOOOxx +7885 9867 1 1 5 5 85 885 1885 2885 7885 170 171 HRAAAA NPOAAA VVVVxx +7160 9868 0 0 0 0 60 160 1160 2160 7160 120 121 KPAAAA OPOAAA AAAAxx +6140 9869 0 0 0 0 40 140 140 1140 6140 80 81 ECAAAA PPOAAA HHHHxx +9881 9870 1 1 1 1 81 881 1881 4881 9881 162 163 BQAAAA QPOAAA OOOOxx +9140 9871 0 0 0 0 40 140 1140 4140 9140 80 81 ONAAAA RPOAAA VVVVxx +644 9872 0 0 4 4 44 644 644 644 644 88 89 UYAAAA SPOAAA AAAAxx +3667 9873 1 3 7 7 67 667 1667 3667 3667 134 135 BLAAAA TPOAAA HHHHxx +2675 9874 1 3 5 15 75 675 675 2675 2675 150 151 XYAAAA UPOAAA OOOOxx +9492 9875 0 0 2 12 92 492 1492 4492 9492 184 185 CBAAAA VPOAAA VVVVxx +5004 9876 0 0 4 4 4 4 1004 4 5004 8 9 MKAAAA WPOAAA AAAAxx +9456 9877 0 0 6 16 56 456 1456 4456 9456 112 113 SZAAAA XPOAAA HHHHxx +8197 9878 1 1 7 17 97 197 197 3197 8197 194 195 HDAAAA YPOAAA OOOOxx +2837 9879 1 1 7 17 37 837 837 2837 2837 74 75 DFAAAA ZPOAAA VVVVxx +127 9880 1 3 7 7 27 127 127 127 127 54 55 XEAAAA AQOAAA AAAAxx +9772 9881 0 0 2 12 72 772 1772 4772 9772 144 145 WLAAAA BQOAAA HHHHxx +5743 9882 1 3 3 3 43 743 1743 743 5743 86 87 XMAAAA CQOAAA OOOOxx +2007 9883 1 3 7 7 7 7 7 2007 2007 14 15 FZAAAA DQOAAA VVVVxx +7586 9884 0 2 6 6 86 586 1586 2586 7586 172 173 UFAAAA EQOAAA AAAAxx +45 9885 1 1 5 5 45 45 45 45 45 90 91 TBAAAA FQOAAA HHHHxx +6482 9886 0 2 2 2 82 482 482 1482 6482 164 165 IPAAAA GQOAAA OOOOxx +4565 9887 1 1 5 5 65 565 565 4565 4565 130 131 PTAAAA HQOAAA VVVVxx +6975 9888 1 3 5 15 75 975 975 1975 6975 150 151 HIAAAA IQOAAA AAAAxx +7260 9889 0 0 0 0 60 260 1260 2260 7260 120 121 GTAAAA JQOAAA HHHHxx +2830 9890 0 2 0 10 30 830 830 2830 2830 60 61 WEAAAA KQOAAA OOOOxx +9365 9891 1 1 5 5 65 365 1365 4365 9365 130 131 FWAAAA LQOAAA VVVVxx +8207 9892 1 3 7 7 7 207 207 3207 8207 14 15 RDAAAA MQOAAA AAAAxx +2506 9893 0 2 6 6 6 506 506 2506 2506 12 13 KSAAAA NQOAAA HHHHxx +8081 9894 1 1 1 1 81 81 81 3081 8081 162 163 VYAAAA OQOAAA OOOOxx +8678 9895 0 2 8 18 78 678 678 3678 8678 156 157 UVAAAA PQOAAA VVVVxx +9932 9896 0 0 2 12 32 932 1932 4932 9932 64 65 ASAAAA QQOAAA AAAAxx +447 9897 1 3 7 7 47 447 447 447 447 94 95 FRAAAA RQOAAA HHHHxx +9187 9898 1 3 7 7 87 187 1187 4187 9187 174 175 JPAAAA SQOAAA OOOOxx +89 9899 1 1 9 9 89 89 89 89 89 178 179 LDAAAA TQOAAA VVVVxx +7027 9900 1 3 7 7 27 27 1027 2027 7027 54 55 HKAAAA UQOAAA AAAAxx +1536 9901 0 0 6 16 36 536 1536 1536 1536 72 73 CHAAAA VQOAAA HHHHxx +160 9902 0 0 0 0 60 160 160 160 160 120 121 EGAAAA WQOAAA OOOOxx +7679 9903 1 3 9 19 79 679 1679 2679 7679 158 159 JJAAAA XQOAAA VVVVxx +5973 9904 1 1 3 13 73 973 1973 973 5973 146 147 TVAAAA YQOAAA AAAAxx +4401 9905 1 1 1 1 1 401 401 4401 4401 2 3 HNAAAA ZQOAAA HHHHxx +395 9906 1 3 5 15 95 395 395 395 395 190 191 FPAAAA AROAAA OOOOxx +4904 9907 0 0 4 4 4 904 904 4904 4904 8 9 QGAAAA BROAAA VVVVxx +2759 9908 1 3 9 19 59 759 759 2759 2759 118 119 DCAAAA CROAAA AAAAxx +8713 9909 1 1 3 13 13 713 713 3713 8713 26 27 DXAAAA DROAAA HHHHxx +3770 9910 0 2 0 10 70 770 1770 3770 3770 140 141 APAAAA EROAAA OOOOxx +8272 9911 0 0 2 12 72 272 272 3272 8272 144 145 EGAAAA FROAAA VVVVxx +5358 9912 0 2 8 18 58 358 1358 358 5358 116 117 CYAAAA GROAAA AAAAxx +9747 9913 1 3 7 7 47 747 1747 4747 9747 94 95 XKAAAA HROAAA HHHHxx +1567 9914 1 3 7 7 67 567 1567 1567 1567 134 135 HIAAAA IROAAA OOOOxx +2136 9915 0 0 6 16 36 136 136 2136 2136 72 73 EEAAAA JROAAA VVVVxx +314 9916 0 2 4 14 14 314 314 314 314 28 29 CMAAAA KROAAA AAAAxx +4583 9917 1 3 3 3 83 583 583 4583 4583 166 167 HUAAAA LROAAA HHHHxx +375 9918 1 3 5 15 75 375 375 375 375 150 151 LOAAAA MROAAA OOOOxx +5566 9919 0 2 6 6 66 566 1566 566 5566 132 133 CGAAAA NROAAA VVVVxx +6865 9920 1 1 5 5 65 865 865 1865 6865 130 131 BEAAAA OROAAA AAAAxx +894 9921 0 2 4 14 94 894 894 894 894 188 189 KIAAAA PROAAA HHHHxx +5399 9922 1 3 9 19 99 399 1399 399 5399 198 199 RZAAAA QROAAA OOOOxx +1385 9923 1 1 5 5 85 385 1385 1385 1385 170 171 HBAAAA RROAAA VVVVxx +2156 9924 0 0 6 16 56 156 156 2156 2156 112 113 YEAAAA SROAAA AAAAxx +9659 9925 1 3 9 19 59 659 1659 4659 9659 118 119 NHAAAA TROAAA HHHHxx +477 9926 1 1 7 17 77 477 477 477 477 154 155 JSAAAA UROAAA OOOOxx +8194 9927 0 2 4 14 94 194 194 3194 8194 188 189 EDAAAA VROAAA VVVVxx +3937 9928 1 1 7 17 37 937 1937 3937 3937 74 75 LVAAAA WROAAA AAAAxx +3745 9929 1 1 5 5 45 745 1745 3745 3745 90 91 BOAAAA XROAAA HHHHxx +4096 9930 0 0 6 16 96 96 96 4096 4096 192 193 OBAAAA YROAAA OOOOxx +5487 9931 1 3 7 7 87 487 1487 487 5487 174 175 BDAAAA ZROAAA VVVVxx +2475 9932 1 3 5 15 75 475 475 2475 2475 150 151 FRAAAA ASOAAA AAAAxx +6105 9933 1 1 5 5 5 105 105 1105 6105 10 11 VAAAAA BSOAAA HHHHxx +6036 9934 0 0 6 16 36 36 36 1036 6036 72 73 EYAAAA CSOAAA OOOOxx +1315 9935 1 3 5 15 15 315 1315 1315 1315 30 31 PYAAAA DSOAAA VVVVxx +4473 9936 1 1 3 13 73 473 473 4473 4473 146 147 BQAAAA ESOAAA AAAAxx +4016 9937 0 0 6 16 16 16 16 4016 4016 32 33 MYAAAA FSOAAA HHHHxx +8135 9938 1 3 5 15 35 135 135 3135 8135 70 71 XAAAAA GSOAAA OOOOxx +8892 9939 0 0 2 12 92 892 892 3892 8892 184 185 AEAAAA HSOAAA VVVVxx +4850 9940 0 2 0 10 50 850 850 4850 4850 100 101 OEAAAA ISOAAA AAAAxx +2545 9941 1 1 5 5 45 545 545 2545 2545 90 91 XTAAAA JSOAAA HHHHxx +3788 9942 0 0 8 8 88 788 1788 3788 3788 176 177 SPAAAA KSOAAA OOOOxx +1672 9943 0 0 2 12 72 672 1672 1672 1672 144 145 IMAAAA LSOAAA VVVVxx +3664 9944 0 0 4 4 64 664 1664 3664 3664 128 129 YKAAAA MSOAAA AAAAxx +3775 9945 1 3 5 15 75 775 1775 3775 3775 150 151 FPAAAA NSOAAA HHHHxx +3103 9946 1 3 3 3 3 103 1103 3103 3103 6 7 JPAAAA OSOAAA OOOOxx +9335 9947 1 3 5 15 35 335 1335 4335 9335 70 71 BVAAAA PSOAAA VVVVxx +9200 9948 0 0 0 0 0 200 1200 4200 9200 0 1 WPAAAA QSOAAA AAAAxx +8665 9949 1 1 5 5 65 665 665 3665 8665 130 131 HVAAAA RSOAAA HHHHxx +1356 9950 0 0 6 16 56 356 1356 1356 1356 112 113 EAAAAA SSOAAA OOOOxx +6118 9951 0 2 8 18 18 118 118 1118 6118 36 37 IBAAAA TSOAAA VVVVxx +4605 9952 1 1 5 5 5 605 605 4605 4605 10 11 DVAAAA USOAAA AAAAxx +5651 9953 1 3 1 11 51 651 1651 651 5651 102 103 JJAAAA VSOAAA HHHHxx +9055 9954 1 3 5 15 55 55 1055 4055 9055 110 111 HKAAAA WSOAAA OOOOxx +8461 9955 1 1 1 1 61 461 461 3461 8461 122 123 LNAAAA XSOAAA VVVVxx +6107 9956 1 3 7 7 7 107 107 1107 6107 14 15 XAAAAA YSOAAA AAAAxx +1967 9957 1 3 7 7 67 967 1967 1967 1967 134 135 RXAAAA ZSOAAA HHHHxx +8910 9958 0 2 0 10 10 910 910 3910 8910 20 21 SEAAAA ATOAAA OOOOxx +8257 9959 1 1 7 17 57 257 257 3257 8257 114 115 PFAAAA BTOAAA VVVVxx +851 9960 1 3 1 11 51 851 851 851 851 102 103 TGAAAA CTOAAA AAAAxx +7823 9961 1 3 3 3 23 823 1823 2823 7823 46 47 XOAAAA DTOAAA HHHHxx +3208 9962 0 0 8 8 8 208 1208 3208 3208 16 17 KTAAAA ETOAAA OOOOxx +856 9963 0 0 6 16 56 856 856 856 856 112 113 YGAAAA FTOAAA VVVVxx +2654 9964 0 2 4 14 54 654 654 2654 2654 108 109 CYAAAA GTOAAA AAAAxx +7185 9965 1 1 5 5 85 185 1185 2185 7185 170 171 JQAAAA HTOAAA HHHHxx +309 9966 1 1 9 9 9 309 309 309 309 18 19 XLAAAA ITOAAA OOOOxx +9752 9967 0 0 2 12 52 752 1752 4752 9752 104 105 CLAAAA JTOAAA VVVVxx +6405 9968 1 1 5 5 5 405 405 1405 6405 10 11 JMAAAA KTOAAA AAAAxx +6113 9969 1 1 3 13 13 113 113 1113 6113 26 27 DBAAAA LTOAAA HHHHxx +9774 9970 0 2 4 14 74 774 1774 4774 9774 148 149 YLAAAA MTOAAA OOOOxx +1674 9971 0 2 4 14 74 674 1674 1674 1674 148 149 KMAAAA NTOAAA VVVVxx +9602 9972 0 2 2 2 2 602 1602 4602 9602 4 5 IFAAAA OTOAAA AAAAxx +1363 9973 1 3 3 3 63 363 1363 1363 1363 126 127 LAAAAA PTOAAA HHHHxx +6887 9974 1 3 7 7 87 887 887 1887 6887 174 175 XEAAAA QTOAAA OOOOxx +6170 9975 0 2 0 10 70 170 170 1170 6170 140 141 IDAAAA RTOAAA VVVVxx +8888 9976 0 0 8 8 88 888 888 3888 8888 176 177 WDAAAA STOAAA AAAAxx +2981 9977 1 1 1 1 81 981 981 2981 2981 162 163 RKAAAA TTOAAA HHHHxx +7369 9978 1 1 9 9 69 369 1369 2369 7369 138 139 LXAAAA UTOAAA OOOOxx +6227 9979 1 3 7 7 27 227 227 1227 6227 54 55 NFAAAA VTOAAA VVVVxx +8002 9980 0 2 2 2 2 2 2 3002 8002 4 5 UVAAAA WTOAAA AAAAxx +4288 9981 0 0 8 8 88 288 288 4288 4288 176 177 YIAAAA XTOAAA HHHHxx +5136 9982 0 0 6 16 36 136 1136 136 5136 72 73 OPAAAA YTOAAA OOOOxx +1084 9983 0 0 4 4 84 84 1084 1084 1084 168 169 SPAAAA ZTOAAA VVVVxx +9117 9984 1 1 7 17 17 117 1117 4117 9117 34 35 RMAAAA AUOAAA AAAAxx +2406 9985 0 2 6 6 6 406 406 2406 2406 12 13 OOAAAA BUOAAA HHHHxx +1384 9986 0 0 4 4 84 384 1384 1384 1384 168 169 GBAAAA CUOAAA OOOOxx +9194 9987 0 2 4 14 94 194 1194 4194 9194 188 189 QPAAAA DUOAAA VVVVxx +858 9988 0 2 8 18 58 858 858 858 858 116 117 AHAAAA EUOAAA AAAAxx +8592 9989 0 0 2 12 92 592 592 3592 8592 184 185 MSAAAA FUOAAA HHHHxx +4773 9990 1 1 3 13 73 773 773 4773 4773 146 147 PBAAAA GUOAAA OOOOxx +4093 9991 1 1 3 13 93 93 93 4093 4093 186 187 LBAAAA HUOAAA VVVVxx +6587 9992 1 3 7 7 87 587 587 1587 6587 174 175 JTAAAA IUOAAA AAAAxx +6093 9993 1 1 3 13 93 93 93 1093 6093 186 187 JAAAAA JUOAAA HHHHxx +429 9994 1 1 9 9 29 429 429 429 429 58 59 NQAAAA KUOAAA OOOOxx +5780 9995 0 0 0 0 80 780 1780 780 5780 160 161 IOAAAA LUOAAA VVVVxx +1783 9996 1 3 3 3 83 783 1783 1783 1783 166 167 PQAAAA MUOAAA AAAAxx +2992 9997 0 0 2 12 92 992 992 2992 2992 184 185 CLAAAA NUOAAA HHHHxx +0 9998 0 0 0 0 0 0 0 0 0 0 1 AAAAAA OUOAAA OOOOxx +2968 9999 0 0 8 8 68 968 968 2968 2968 136 137 EKAAAA PUOAAA VVVVxx diff --git a/src/test/singlenode_regress/data/tsearch.data b/src/test/singlenode_regress/data/tsearch.data new file mode 100644 index 00000000000..a60f39b234d --- /dev/null +++ b/src/test/singlenode_regress/data/tsearch.data @@ -0,0 +1,508 @@ +\n +\n +\n +\n +\n +\n +\n +\n +\n i8 hy qo xa jl wr le l5 ja jx zf ro vw wd wa cc mm wh fn yd td l8 ec rv th oc ix ir sm y4 gh pr qg ue cx ww zv c9 zv tx eo f5 gd km b9 wb rm ym yl xj u7 xz uk iq tm ux di if uc hc ge +\n gr ty ph jh po wa iw ag wq r3 yd ow rb ip et ej yl a9 dk pu y6 su ov hf xe qe sd qr zt kp ml ea tp pg dq e3 s3 hh gn hz j7 hb qs qd v0 v4 w0 nu ee wk ez un rd sz wx e7 pn yf gh uh ki kx rb qv f1 bh sr yj ry r2 +\n q1 q8 wp w9 vs ww rq de qt wo qp sa rv mc sn u8 yl +\n hv ra sa fr qs ps 4w z5 ls wt ad wy q6 zg bd vt wa e4 ft w7 ld es yg et ic pm sw ja qv ov jm ma b3 wu wi qy ug hs wh ex rt tj en ur e2 ut gv as ui dy qy du qo gv cy lx kw xm fl x2 hd ny nu hh dt wg wh rs wb wz yy yu tj ha ak rw sw io h1 ux ku v6 wc qa rv xb s8 qd f2 zo k2 ew w4 yh yu yi +\n rs tt gp qh wt q6 lg zh vr b8 uy uu lh px jm ww qe xu fp fd rs qu ki dr fn gq gw jv oq zt 2r lc ke wg l9 x3 x5 7g vs ar e7 u2 s8 t0 av dj kl nm u2 zp gf yw ee oc tw a1 +\n qs uz wr gq q9 rl e0 pe dj a9 hp qw aw er kq pp uu pl zo wp fr r6 ej pv u5 hh av lw ko qc pn qj ez n8 wn eu tq +\n po h9 rd qs hr la u0 um me wp 0p rl mv rc ab r0 fe fj fk qn jh iy cn lb bl ln b5 ll yg yh qt qp uz od dq as gn cr qa wa cu fy zy vo xk eq vg mr ns yy t7 yi op th yo ov pv em tc hg az io s5 ct os wu lq dr mp hk si gx +\n hm k5 pw a5 qh nb q3 ql wr wt z7 oz wu wh kv q8 c3 mt mg hb a3 rz pz uo y1 rb av us ek dz q0 d3 qw j2 ls wy qq jf ng eo gl ed ix em he qt du hp jc f2 m9 qp hb l4 gy zf l6 qr dn cp x1 oh qk kk s3 hy wg zs ot wj sl oz ie e9 ay it u5 ai hm gh py hz qk ki h8 ja zu qb ei vc qj hg ev h6 yh u0 tb id +\n qg d1 bt c5 r3 iv g6 d7 rc ml gk uh yn y0 zo uh qd wh ib uo u4 om qg ql yz +\n hb a3 q5 pl yj lo qy ki sy fo rj kk zq dl wn 7a zi wn wm yr w3 tv r1 +\n ft k6 iz qn qj q2 q3 bl zd av ro wo lk tg ea ew ed y1 ia yl ic g6 po aw sc zm qn gl wq qw zr jp wt j5 gs vt qt yc rr op yw tl ye hr i8 tb uu j0 xd lz vu nl qd fu wg pf wj bt ee wh t2 tp sz um oo tg ha u4 f5 sw pq pr ju qk mh ki zb vj ob cx df hj ef cj q6 u9 tv rv o4 sy ru fq ir +\n ps ko uk tz vv um t9 uk k2 ja o6 ob +\n qs nb gh ld q7 jc sp el w0 py qx i2 qe la rl qw tu ti dq ue iv oi wa qr ed t3 fg oa of rr fv qz xn wu wq te hx +\n yb ty pq az fi qg qn la bu ji lg wg q8 mi cv rl up lg om oq ym pv in aq gg js ha on ww qr bj vn pv he b5 mh qe cc mk qt rb eu qy rw tr qo ec op sn oh e2 ao iv e4 hy dt s6 qt p1 hb ih qs wg x1 bd l1 t1 ro r9 uv wb aw gu os t0 ah e0 s0 hj pe or qj zz ql fd ks qv bq qm bg ec ry oj u8 u0 yj ru r1 yx o7 +\n z4 wr qz cg nq ir bb gb w7 e5 zc pj e9 px uo fp ts aq db q9 iy qe zv xu a9 l1 mb qw tc qu fi hw ur de e4 hk lj wo wf fi ep rl wh vh ek vp oi sv rh ay hj px aa er tv do ir +\n tr o9 gb tt pp qa qs a5 ps rf q1 kj by ub ru ox co o8 ny wp wa ws rd kk b1 zc rl rz uo ts ig fh db qm q0 bg rr fu ld lr wb en nd cw vr hy rn qr en em au p8 so oh ut hz gq wp ow be ky wj dw t1 pl er wc ot na r9 wl ou un um wx iq sc e8 sn re rr f7 hz h4 ce wz qx wx kp px tl tx ai wq hf ec 6u rz og yt ok yy yp +\n sa pp a7 qm qh of je qj lo ph wt h0 ji cg z8 2v xs zl mo ik hm on tu d8 av ot pn iv ez ja qn pq wy 7r mq qu p1 tu p6 ti ur pj uy ui qo i9 qa nj xm s1 ya fb 7j ro wn t6 wz yu iq yi go en pb aj f5 hf ug uh hk av pr wl wz im ja v9 u2 ks it br wv wn se ia o5 ox ei r2 ig aj sp +\n sa tn z8 ew uo eh g8 zt wy 27 ff uh te en pd eh hv 2e wh ty oi sw xx 2p qs mx wb q3 rl eq aa eu +\n d4 ef ta zq j2 em c0 vv wf kj dw uk ql y9 rn +\n sq nm kl w8 ur kz c1 pc y1 g4 oi jv wr zy ew by se ec yn ti gq gt rd l5 ej yp tk da qz qx ir wm on q2 to ew +\n rd gu z2 kj qk bl 6d wy nw xq iu 8t ri uc kq nx ql oa vi kd o6 +\n ra gr he wy q0 ow ti ia pb ha qr lv ms qu pu qw qr ml qt ep sv i5 of fm oe nl xh x1 xz u4 ha ao fc ug pw nh n9 qv kh vx uq w1 u0 ei if +\n q1 d2 qz zd jd qb wj nt ah mj ea ed y1 et fj qe en b8 ty iv ht fv tn tm sg jb ky ai en us tl ud iu zj ql u1 ci ru iw tw +\n fr ub h9 pd ub jk vh z6 wu wh wp 5z yt w9 w0 uy om tl rc r6 ax d7 et y2 tw dz se vf ii m3 lf b4 jf vr qw qy uf es qp en tl to ye ue ph e3 uy i0 jl pz oe qo zp wp ft ka zf qd wd kr qf l9 mm wf qx ef t3 x8 ex rg ev s8 ys it da rw al hn tc f6 fv nd nc ad fj nr x0 bx yq ti rx ok tb hx o8 dp +\n o0 jq un xu q8 wo qq gg ta oj ec az dl bl wb +\n o9 ij pq gu gp nv qk gg la q4 nw bo z8 9a iw wu q8 eh wi nt jk ut ys c1 r5 up y1 yl py oy ht gd td db qn cz qw lp re c7 dh j5 ia bz dj qr qt wd wf qi rt sv ul uz tl ta yr e4 tm sg pc jv hc hv lc xg xm br vf r8 na wl ou td wc up rj s8 e8 ir ys ii qk p0 lt ho wb x8 bv lw w1 rz ew aa rv ry gx o8 +\n tt hn gn un db fu uq qf d4 q3 pp ji lf wu bx q8 hx kb ny t5 bn hb ex yf ef yj g1 g2 to yk g3 ej sk hy dv qc gj qv sy bg wr na wy bx z0 rc rm ml ug te qp i5 ue oj s4 im oq qt gx sa gt l4 sv at v3 bq mv wd x3 80 x8 aq xk rg yp en gs us dq ak tz al tx o2 dg f9 kv or h4 jy k1 jo h8 kp lt os kh as tn eu ul tm su an tw sp +\n za yi pe sh pv y4 y5 hy th jg qy qt ke ti ue qk yy ie cq wl p0 lw mf er w5 +\n k9 bt xu kc me is o5 z9 kb gv ur rc oe sk qn ve wi mm rn eu to ue uy qa xf by t1 td t7 aw up yf pr dk cg zr sc 3d at rw ec rl st zo rn do +\n o9 z5 wy vi ya ea ee fo gf va ov ww rr wr lb ro qq vr gj nw ru ym iv s4 hu tm wo wp zs br fs wg ej du y1 yt yu e7 eb em dd pq v7 cr um ae oz 0z kc tq rw zl rt wb y9 xv tm tq di eo te gc +\n tt un qs qn a7 qh je qj k0 o1 wr q6 wy ab q9 qm wr ea er eh pi hi sc hs m6 w1 bv lo zr tn yk ep op es ve xx sb ux hg sa gq qp wd n2 zh wf xf wj y3 wl e7 os u4 on ip kn ko qp s7 ly zn ba wu u4 kh f4 zo y9 q6 oh iw tq +\n qa a4 gu a7 cp z1 he ma q7 lu dp w7 ea rc ee d8 y4 tw ez im ae bv ii qe vb zt lc lv wm ro lk qr hp re tw yv es fp as zu oe qu qi bp wg cp p7 v4 ek rd wc ar rj tj e8 od e0 pm h2 h4 in qf wu wi 19 bj rl rc ee yj et tw ep +\n gv qd kj cd t3 c3 ih ws rg mc rx lh fd g8 gh cc vw b7 qe at j7 qo ws wg oy t6 t9 go eb e8 us u5 rq oe zj jy oz cj wb be ei pm og se w4 yu xw su yx if +\n o9 ub rd hw gs z3 ql nq ru wg jc 1t kv mr zm ah dd jk w8 ej aq ig y8 pp fj li wq jj cc qr no wy wu en bx yr qy oo es fy pd tk ix ph yr sf vx pn p2 jq fs ed oy yk os ie s9 u5 ak ud gd uf kb xc u1 xm eu xw 19 wn vh w1 to ee er aa rb rn ru an r1 ei +\n se kl 7h b6 xs ym tp an ta qb gn uo pt xi cl qp qy op vr ym ri ti tl i5 e1 e4 i9 ff i5 qp jx ht ql uo en pe ku h7 iw wn w4 ey ia si +\n ql xt wi k6 ew sf eg up eh oy sq ja g9 i3 qe cv l1 qq bv w2 la eu wg ec ef oh fs tb pc xd qs nl qu fn dy oi iu yf re fc hj hk xv zn zz w1 ew +\n po al hm qk jt cd ju nm li rs w9 ev ut ea 2f r4 d6 ey im pa nu wr m4 is bc xz w3 eu tb ha ft p4 ti to hr dy af i6 iz r4 jb x7 wj xg na rf gi at pn gd re wq qz ze bo wc vz sm zo my ye u7 oh dk w5 is yx tw fe dp +\n jl za gk cm wu vq jc zc iu mb oe fo fp ic sc 2l hy qr eb p5 pf dq pa fy lc td sz oo aw u1 rj fl tz nx aq xx oz xb 55 y0 +\n uq wr lh jv ri i7 ss qo gy bt s3 u1 dy ox hg it +\n ps hr lf jx bn qq up eh ab yl pn jg ng bz gd qr yw i9 j8 zi 3v oz at hd cx oj u9 rt uz ro ov +\n sq ga ny se cj id rg r3 pk kv ee sh ek dk sz pp q0 mn az kp ei qi ry em ph p9 gw hc m0 cp ea mn yf t1 5y wx ol e6 ec u2 e7 uh uj uk av ql lw qx zr qv mw qg cq ww wb pw tu w2 mf ut gk af yo ie ob +\n hn um a6 q7 af du r4 up tp ej sk lo le m8 rp eu ei qi ky op of tp ur oj hu tb dy qu gt tf oz wc s7 e7 ua pw ax nb wx wy fj wn 18 wv es yq ok w4 uz yx yc +\n pa qg qh q4 fv qz kx q6 cp gb c6 pr eh id in qw we bk wn qq b6 qy qu es ic s1 og gn wp op qf ic ro os yp rj fj ag oc ay da fv wl qp f1 yx n7 ea w2 ly yj iq iw rm o5 +\n o9 ps d3 lp wr qc md e5 rk w0 pm gx lf ku qt qp to tc pk fb tb qi lh nt yd vt ot ra tg gd zx wx vj rq cr hm ma jp vg u8 rt ei it +\n dx dv h9 rf qf uw a8 qh uv k3 ri is yr r3 eq uu tz yn y6 qc ps jf wq xe wx lc qr j4 ku xx nb 4z sr tr uq p6 uz of i6 s1 fs pj tc hu qu hz f1 hp lj s4 qx tg yp gs ob tz ds sw pm ug hm ip ql le vl wq tb xv eq w2 yg w4 st o6 +\n qd q4 pa z6 qz ia 70 r3 mb iu es r5 gh t9 cj vz qw mb ko vt qr qt gh qo ty eb kq n1 xb ef rp ek gu rg s7 rj sn ai hg o1 uj pr jt fg v0 tq tx ww bj bm ct w1 zi rn ox iw ri +\n al rd w8 vp yd yk r0 pi po se sr qa l0 qk ir e9 hm kc rz aa w6 +\n un pq qd a8 z2 qk z5 ws bi xy qx wg wp t4 mj gv qm rg c6 w7 w9 es y1 g2 ej yz gg qc qn wq qw m9 wx qe kr 27 fp fq m7 xp 3p qr rr tr ij il eh au s1 uc fx ut qu sj j8 j9 ya nr rz wg wh eg x8 sl t7 yu vf ay ds ap re dh qg qh qj hz qk zz qx k3 cy iq ox qv eu nx n6 6r lq n0 y0 uq tb sy iw fm an +\n yv dc qs gm q2 cv ok wt b2 cj wu mr zj kn e5 iu pz r8 pe fp ot tq a9 y5 sz ez cl wq qq wv a7 ln ky jd qe qr yx rm qi ea ln te y9 ev en eh iv tx e3 as tn j8 wf xh co fl nc wk xz es rx ee wh ub aq u1 ar e7 up it iu o2 wl ko jo cu pc wo al hm uq rn ul yz ro +\n pw na wu jd yf oe qr xr sk wa hw ql wg x6 s9 u7 am +\n uv tr ub k7 qg he u6 jt gs z3 by tn bi av z7 jc ck q7 2n ny cx km mk rf pj xi lh sf up yj to ia ab tq fq pm fd qc qv ps su qw fu xu cm zb bc qr qt tn ei rw gl p1 xi qo tt ed ef ri iz yw oh tc uy tv as qu l4 qr t4 wx e5 ae op oa em tz gd dq rw ug dr ux qj be ko cg nl je aj xw q1 vv ax rl w2 yt aa u0 eu ah +\n dc ph sq jt ql un q5 cg lk w9 ur uy pz uo sx qv qq cc ln fu ym ho su pn qa bq pd wj wj yk ou wl rk o2 pt uc km ja wm ry rm ob +\n gb pw qf we q3 ls q4 sy bl lg q8 t3 wl rg ed io ef if oi hp lo kw wy qw ei yz rt es p6 fp hi qo bn qw wg cy np uv yy oa uo ir of em ug x9 qh nj n8 ea u8 er w6 +\n ij dg cd lw gk wu zl dd eb eq sg ia am in wq xt nk wr xj qq p5 pd pk as sd fn lj jw fk l9 nt wl oo fj sb u4 gs fx hg o1 dr fb hj h8 xc yq ch er e2 aa af ah ob +\n a2 o0 hn pd iz hw jg q1 jl qz ip le me wi bb r3 z7 g1 eh td sw g9 qq c9 vy ud qo es ec tj uw dq ur hj dy oe zp lk l5 fl wj ys t2 ej t4 ek rs sl yu oa u3 gd pm rw h1 pr h2 py wl 2p s7 wq 6r mi 10 ox o6 +\n i3 qw ee ur cy nx r2 wj t2 ub ir aj cl qm u0 oz +\n qd qn un qz xy nq an kg hc c6 w8 93 eq ts g9 wy mg w3 rb 3f wf rw kt op es ef at em s6 pc wg bw x1 xl wg hl yk yo eb ud hm hl py wb u4 zp bj bm se sr sy ox am +\n rc ix qs ls qy at ut pk yo ys ec hs lq xv ks +\n yb al zf ws cn ac ih th ww vb kt b3 xo qe qi te ea p8 tn qd ci ix xk pk bg rc tl f4 wb rb ru +\n iy qd a5 jq jw qh sw fv oz cj hc qq ya ee yn pr av or us iv fa qb q9 bh ns d0 qe i1 b0 fh qy qu qi ry os ul hq ri ix e1 ao p0 qt sf qi uh ll ko lx nz sg jz hq sh p8 x3 wg rd sx yo yp u3 pv rq ds tc rr wx lr xb wn ep hh bk yw q6 og yr yg si tq do if +\n hv qa qf jg he q1 kj qz bh lr kn rj th kz ef eh av pp i1 ar gl ur lr bz xp yr ze qt tn es fl hw s5 qa ed t4 wz sx rg sv e9 fz hf al h1 av bg ym ee yg +\n k8 nn jy q4 wd lf xu q9 a1 4v yd mb r6 yh pb ta g6 dn d3 pl j1 jk wc cn wy 26 rr te ti fa e4 uy fb gr hb kd lc qf p5 wh au fa iv xo hf ot eg ra wv tp ec yo ah iu pw hj ac h3 py k2 u1 wb rl rz yt er w6 ru af yo ep +\n qd uq qh qm q3 vg qc c5 rd vp ut eq on yn ii xp up r8 d0 sz qx ue pl lx qe wr qr lm nh qt ha qo ki ri e2 tx iv ao s3 ow kp xf rh ya r2 rk cw nt by wd j8 t1 hk y1 ns t6 wc ev sq rq yf ux aw ch qs u2 zn sm rt wb bk yq dh 8w w3 rc yg o3 yi ox ov ir +\n u0 q7 qb ml or nu b5 1l xb tr tp in qt hz so v6 dq o2 qh wl nb rv fw +\n ss jr zf zh xt oy hy aw y8 js ob wq ny or vy fi en tb qi j9 gt ib ot oy rd e5 y6 tg th pt gq wz rt rl ew fm ie ri ir ro ah +\n o0 qj h9 wy ee g9 gk jd fg qt 3d fu ru iz tl fd tv ad hl wp oo wf nb ez sv tl f4 dr oy rp +\n ak il k6 qh q2 vd k3 zd bo lj k7 km 5c ut rz yd up ua is r0 qn zq wq j1 qe cv pw fu md bw yw qq ra rw qu ex ik at y0 ru ti yw fz ic ao ow gm jc i7 nf p4 fj xg kr br xk bs mb pk hl wl ta ez sv e9 us om rw ap gq wl k2 qz h8 gu kf et ru tq ag uz rp +\n yb az dd fu rf hw qg we u9 o3 q5 q6 ag c2 o7 wa kh w8 vo mc yg tu ua uh ta tw ih hu fj su bg ww bh kw ry ru wy ky wu wi fw 20 b9 qo ik oa ev hw s1 e1 e3 fc uu s5 tn qy hz jc do ou jq gb kf pf xl x3 yv lz iq eb e8 os sn fx dw qg ql wc ka n8 gf ly se tv yk di si o7 r2 rp +\n il mj vi sd ia y6 wq rm p5 ux ho nr ef ej wq iq fn +\n ft cs uo io er ic tw ig mm c9 xk ab ze uw i5 s1 e4 pl ui f2 lj p4 sf x4 kz ej ez eb ov of rw dy av qh f0 h5 ki qx cx eb og gk oz uc +\n ul io zd kn w9 y3 wt qq wp jl i9 jk ca h5 wx wb tm do +\n iy hv cs a2 ee yz y6 gk kq em qy uq ts w0 rq rr vt pb nc q5 +\n qn q3 vt vu yk ej fp tw zm qq qy y9 hh wo wg rh ep x5 wk mr el l9 av hz w5 +\n hq qz wy cx rh ur w9 e8 r4 fq im fj gj dm qn gl jn iz l1 yh mz rw e2 qo wh nt wk zw t7 e5 iq fh eb sn ud az uv fh sv dq q1 ku zs eb ue xq rn o6 do +\n ub lo sq wr d1 mt o7 ts t5 rd xe iu yg ot gg se pp qc js lu xt j3 j4 wt pc vz 5o yr qw zw qr eu db sy eb em fo i0 ad gw m9 ig ih lc od n4 pg rx bi ni kq wl aw e7 az jo mk bo wb ei mi ep wb eq di do +\n q1 ub xt db wt ws ik pl ee or to ej ic is fr jk ls c9 qq yg qt eo rw tp p8 dy pz gm hz or xs bt x8 t4 t8 s7 oj lt wv vx u7 w4 et ox yo +\n po o9 ih dx qa rf qf pd d2 kl ad lh kb bd qm bb b1 z8 ew d6 yg d7 ym ti eh ic iv oi y6 sz dx qn ut qm gz pj zw jj 4d bk wb lm xb ke yx oo qp yb yn en fo yw fp e4 aa fd jz qu gw qa zs nl v9 wf qt qi vg ni wx hk 9f sz tg t0 ga de re io av h2 jt x0 h4 wx wc fg rb rn nc yz iy zp ds ep zw pr xv rz yh yk zp do hc ep +\n hb ty z2 qz qz zh gw mg kb ve zz ti tp py el jp tg qc ar qv gx la qr cn lr nd ng ve qt 6g ml op pd uq uw eh i8 uy dt ho j8 wp wd qe xm w0 x4 qk el e9 pb sm pn tc gt ce oj jr mi ds wb ym ew u8 +\n ij yb hn u7 cd gj co dp lp b2 r5 ed ti pn qx g0 jb jn jj we bl ri ot pi rb yc sv ty oh ph hh e4 hy sd wp ll ft l7 wh ca ys wf wb t7 sv uo sb sn ha pb sw de un qc bz wo en as tb eu af eo +\n d2 k0 wr q4 q5 c2 sj iv pm g8 m1 l1 5s ij aa lb xm vf ej ta ar th od sm cw gy bu qd q1 u8 ry rn +\n qa ux q3 mj ex yu zx rk gi rl ya is py am tw ja js db ps dn qb qn gn lc pe qq vr qr eo qi ec oa ev uz yq of in ho qo jj jk wk wd zp wf lz t8 tk ha pv fz pn ug o2 pe uk kv gq v7 oi qv wv dj tv fn fw +\n dx a3 k5 um uq jd og nn q5 qx cu wp rd ws d6 px ac oe rb up tp ej ek ih ff qc gj qm xk b4 dz jg sq jh eu yx eo re es ul yw tp i6 pj ho qi qf sn og xo yv pk wj wb go ar uo eb ir iy pq uh qg h6 vt wv sn n0 rx af uz hx eo +\n yv ub ty gn gu fu dm ca q2 d4 cn ad iw k6 bf zl zz 2o w7 uo ee yk ix g3 am fw oi jo se ha vs qn iy qq 24 bl j6 g4 cw jv 1l ei qy ke j4 qi ep of ao hh tb gm sh lh vc uf vu wd p6 xm qt kh rk l9 s4 wh mr t4 oi rf iq op ox u4 e9 fk u5 it re uk f0 kb nd qk ce jp lr cy js qd qb sb tq n7 n8 ed ue tn ox o6 id r2 it +\n qa pa jd qn qg jt gh q5 lg ag qv ah qn vr da rh w7 b2 rz rx d6 d7 eg eh yl a9 ek dl tw sc hp ha su gz lo qe le ns kt qy qi 1h kp mz qu es yb yn p6 eh fs ok as im dy px gq qp qs l6 iv rl zw dr 4r hi wj rp t6 go s8 e8 at e9 f3 ak dg f9 qh pt dz ww rv wb oc pv be wq cs q1 xr xx eq yr u9 sr tb yl tq if hc ig +\n a5 co dh bt lw ck lh w7 3e mp r3 rz yf yh uh eh td y8 fg pa ar va dm su q9 d5 qw re vh he jc 1g ib xz qq qw yg vt rn rb cb ry ym em i7 hr ff f2 qp rd lx wg lb kh va jv qi xd wh wc el un sz tf gu oz ae e9 e0 iu dr io dt fb dh jo um wx s5 oa kx ly rn oc zy f3 hb tt wb u9 oz hx if ig +\n ak o0 qd q7 eq g1 y2 pt dk g8 qb vs qe dh 5i pt yh qo ul tp oj sp oq di uh zg xn rx tp tf ie f6 cg rv zm xw zq 5f md sr yk ru ro +\n a2 tt ub rs ij ml ow pe el gd va ue zm sa pq lc yw qi qw lv ep qo uj ym tl ye hj s6 uf qp 82 fk y1 wl oi t8 fk pb tx o1 sk lm oo xv n2 ad fk n6 dp on q6 rv +\n qf jf kk nm oz q7 b2 xo fw kj rh ua oe yl gh vd qe gn wb pt wi z0 se gj 48 of i5 oh so hz wp ae wg nc kg xf ev pv ov au iy az f7 qb q5 eq yr tv yy ol ry o4 oc di ep +\n po o9 dc a5 jd z1 sq ws b7 ti r9 sl ez aw tg zm si ng qe ky b5 pp eb od jl ff oe ce qp gy yv qk r4 xf kw iw sn tx gg uh cq ql qa 2s mt eq rb dp +\n qs qz cd dl se q0 lv eu yi rw qo uh uj ul en tx wo qd e6 pv gg je zx kp qc q3 ye en +\n un qs qh se ws lf so eq yf ef y3 g4 zb hs q0 no qw j2 y0 uu fb di f1 kq oa ul t3 ot fh ak yf fv dt f8 jo sx wx at wn cs lq zc +\n ub qa qs ik pw uq a6 pd dm d1 qm d2 qk cv zd bi wd ne ah qb kg kh ij 1p rk w9 wt r5 d5 px uf eh yk oy pm i2 hp st qn si qm zw we ls px lr ri qr sr db hp qu xk fy os eg en uc ur i7 sa hp vn qs kw dn od rh xj w9 wk ph ap yh el oi oo e7 gp ay s0 f4 gf az jy qk ql qx 1k v9 qc jq zy n5 kg hd ww wv bj hj ur er rn ry eo o7 +\n df a6 dn je ql no q6 ox wo zl bn rh ya mv e0 yn pr gd pi y8 i4 c7 g1 j6 wo rv eu xg eo c0 yx ea sv os wp qw wl ou un t6 u2 os of f6 dt f0 jt wc ja ae qv rm ds pq y7 qk ck aa ux +\n db iz jk zd wy wh c3 zk 2o rj hw vp on ed ac to g2 r0 id ta th qb dm pj m8 np oe pu bb tc gh ml rq uf tu eh ye tx gv pk jv j8 lk xs kd fi mx be wd t3 mr wk wl td eb ie tz dw rw pm re fb dj h6 ql wz wx qx qv u3 vz xe ex 2w ty ew xm oz an +\n ty a6 we wi ro lj bn rh r5 g4 aw jd q0 gz xy m6 wu qq et oo ex qp tr y0 fi au e3 oj gm px lg wk tu ek tg u2 ov em dg uk nd qj cy hp wq mi bj q4 ia fm r1 ei ie ux +\n tr qg h7 qk jl kc jr am mo w8 e8 td gl kw sd jo qr vl gs qe b9 mm fh eo uh ft ik e2 i0 uu ff qu f2 jq v2 wg kg ek aq wm yi yo s8 e8 sq ab cw wt ck pb pn xl bj yq wm ew xq su r2 +\n qk wa q6 jj ws ut gd gf ly ec pj sa pd wl e5 wc da kx zk zz zb wv rm te +\n jq uz nv ql as jx z8 q7 o7 yt rl ea e0 ym y2 pr ia sz sq sr qq qr vk oe pe lr bl ll rm yx y0 eg ti e1 ue uu ui jx zd oq kd rg lv lb r1 fx ro me ts ay f6 fc io qg py qj qk qs ky qh y9 ok o4 am +\n qh dl jt wy a2 yk y2 i4 zq kq we bb dg m6 qq zw rt ta tc ff xs xd qf g0 1d yg du wz iy sw tc dd hj hk mh ov zi wn hk ee yj af +\n ra ak uw q3 cb ji wy fw gw t4 mu ts qw ww rj vo rl yd ug d9 gj i3 zw qw wy md qq bv rn qy pd tl ic p9 hr dr hh ui sf f1 i6 ws cy es ef t5 kr ek oo t7 ec e8 u4 od dq ji ch jr zm jy q1 zp yq 2e og yo tm +\n tr tt qa qd jf pg qh jr sw ao q3 qz za wt js bl vw q9 ws uu w0 ya pl yf rx ee tu r7 gg dv it lo ww up js qq qe lz eu qy rr yb ri ay ye ta tv im sh ss uk qd qf bw ro sl wl t5 e5 um th ha fx re ii fv je hk ot cq km h8 ks bk vl qn xe te tt rl u7 iq ry ag dp o8 +\n sa z1 qj q2 nn wr z5 mq xu q7 gv t6 w7 r4 c1 mb sd ed ym ot ta ht ts tw gd tf g8 se ar gh fh qv qn zm hs qw qe oq wc xj vz xl wo rn i2 sr rq at yq uw s1 tx hy fm pc wo hv gy vu wd lc ul p8 wk wk el oz oa rh gp pn gf fx fc f7 rr dy x9 uk f0 py wl v7 cr ch qs wv nz lv lu 5o xe ym ly er yi ia gl ox r1 dp +\n uv qd hm qf gp k9 kj we lf bs ej 2i el wl t7 rj w0 rz yf ys r8 tp py tq tw dl im qc db qq sd ry c9 oe if qw aw qu uh tt p5 p7 p8 oj zi oe qu qi lk j9 sk zs ka lc wh wk zq mq vh t2 ej r9 mr ez t6 e5 op rk ga pb dq ap f9 py qk qz wc kd pv bd sm dr u7 mf o3 yk di r2 +\n po a3 uw q5 q7 ck kb zj td zz yf jd wq xh ld qr w4 p1 ij fu tp qq sv y2 yt t6 e5 op dw iu pw jp ka qv 4u qf rm vb w6 +\n fy a6 qg cs z3 ql dc jz wy me cj o6 ba kv wp w8 ea r5 uo fw ib ig g7 gg sy bg qr cb cq ro xl xv ex tt ru pd hg im oq gq ao rl pl aq sz t7 e6 os uf ug gg pr ql qz vt mj px wb ci qf ov be bg ww mp mi rz u7 w3 ei yc +\n gh cm ca rg uy pm y7 g8 lx yc qi re uh yn uq eh tz ph wo cr sv fp kh sl oi sx ov ga iu h1 je fd rv qv wi jy yy ry o4 tq si +\n qd iz qh q3 cg lf wy xa ez eq om ug eg yj fo fp yz qx qe wb or jg xb c9 p4 tj y0 iz tc oj tb i6 p1 ka zf qe yp wj mv ra ez rd uh pt zl lm sz wc lr bq oc zq sr af gl ei ux it +\n a2 qa h9 qh q3 fn kx ve wz us sj yz fd g7 vh c9 xq xj ln tz wp wf kg kk by vf j9 5y un yi e6 rh sn tx hj kn rb +\n un qs fi qm jk js bd o8 bx vt eq ya xp yg pz ym dj fp tp ta oy dl qc cx qq m1 rt wn d0 wm yr qw aq qt tb ha p1 uk yn ef tj gv im sd hk pz jx zi wa wf ba l0 wd mq ej wv t5 ek iq pv ov f3 em ak rq hn hh f7 uk qh ot ju ng ji h7 wz cr v9 bj bk rc er ia is iw ei id ov pu hc aj +\n pw gm qd jf u6 z3 jl q4 wt bi lr id wa wz w8 ya ev ew r6 yn ee io r8 ip ej td im si j2 jo d7 m4 pv iv yg qi il ti i6 ta ib ap fb hz wd vu wf wh kt kh og kk nm rp ti ek ns t7 y5 wc ae ir pv hf ub wc ho wb wn mi rn w6 yk tm te rp +\n o9 un h0 a6 pf iq xi tg w8 z7 r5 om oq eg or y4 sr fh zv vw zq tc ws rq db rw eo ym tl fv i9 pz jx j7 hx oi qf x2 l9 x3 qj by to el sx ys yd ao az uj hl dl tj nz wn kg kh on wv w1 w5 gl ei +\n gv az ql nm rc r7 yl ja zn q9 xw no iz qt pk x4 l4 tg u3 of zk wc go qb mo eq u7 tv rm ig fe +\n o0 ik qd um qg k9 mb bu wy bx ny ws hm ea mb iu pe eg ey sh uh g2 ic iv aq td qx ja qb ha 2j lp xr wc vl wn wi sl tx qt rq ec vw of uw sm ic qy j7 ns hb 2q kw wf vp 1f x1 5c zs y1 rg tg oz e7 fh eb ie up e0 ap ve wq zz cr wz h8 wv go ly fk az pr rz h4 ew w2 ok w5 ia si ro am +\n dv d2 cd qc zt 25 xp wd te es sh eo wn f4 wo tv oc +\n uv qd qn hr bj b1 mw lg io sh lo qq xh m6 28 rn xx p7 im qt jn jw bm qf r1 mn ny ed em ii dd wn cz ds vc wb hh q4 yw ur rt ie o6 ux r2 +\n rs dh z1 jr cb vq r3 eq om y1 sg r9 if tw qb qn m2 vy dc b0 ik fa ib aa jz qu sg qs 1s be of w9 oz sv t9 oc pv rw dd o2 dh lq ka lu 1m qk q4 y0 ye yq w2 w6 si ob it +\n o9 db iz fi qn qj mw 3v wp li e3 km zz yy mo ya rz mv yg r7 yh pc or r9 pm a0 td ih db lt pg jf gl re ww qw m4 j5 xi wi yd nh yg qr rm et ey ug re rr y9 y0 sb tu od ay of iv oh i8 ok uu sf gq lg wa nn uj qs cu kd xb wg cs 3k yv hk pn ii hh cw km wz wx wc n3 jr wm qn bd zo mo jo wm q6 w3 rt an hx ah am uc dp +\n ps pt vq kc bs vu vo xu ee ib hv wj x3 nu ud yf qh wb lb gz +\n ra o9 qs ty rd ps db pu qj u6 k9 nb qk oj ql wt jx bo ri xo o0 mk rh bm mj ut mb rc yn et yl pm ih i1 g9 qm xq oq bj wt jp xu pt bc eo ep qi ky sv uk fy ri i5 im dy hk ui tm f2 uf ug qd kf nc s3 fs 12 t2 ro du wk ek yt ej t7 s7 oc ay s9 pv fl s0 gf tx fc ac py v5 qk ce qz cr jp ck hp u3 zm xr ii yv ea cf hj ye w3 tp do tw ux +\n o9 qa ik wt kc q8 wk sp yy w8 w0 ys ea om tu yz pn fe ae g9 ps g0 i4 qb fk qn qm ut j1 d6 4d cb vj vk xy j5 be wi ve qq gf qr j3 ug qo p4 sm s2 ut fd pl qt jz ui qy qu qa nk fj iz xh wk iv qz fb ro x6 ti sl rs hc oi wm us ai dw o1 hh ab qh qj ju ng wl zr vk tw 5a vc hk md yr u7 w2 yt tn eu ul ah +\n uv ra qs ty jh q4 o4 bc vr o9 rg jz mc r4 ui g1 ey g3 sj am sq fj qn it xt ln dl jh b9 g8 dv qt yz ea ue ss w9 wj kk bi ym tg t0 ob ys iu uj qk nf v6 nj ox qb wy mw 1n pq eq w1 rx rp ge +\n a2 pa e4 xy yd sj vs jj xj lm qy qp ri ux p8 pj tv xs wd wf oz gd sw rw uj uk qj k1 xx um eu bx my em ey +\n az h0 qz iq bl kb xp yf y8 qn rv hx oc re gt k2 bo qg cf rl +\n yv uj d2 mq hx ws w7 mv yn r8 ab an ae jn xw al up be qr zr ep re qo ec ur ap hp pn wp i9 rf wf vo qk t8 eb yd uk kv ww wx wt ox kh mi eq yj oz fn ie am rp +\n ik df qg jg k9 wy kc ro wi ve bb rl ew io or eh sq oi qc qe d7 m4 pu gd db oo yv yq ix eh fl pg ib hu pl cr fr xd cy ke mx yh wk ag hf hk qg sj we mz gp u4 ak ma rz rv af ox di yx ob +\n hn pa pw qd il qh q1 z3 wr t3 wo ws vu uu ld pe fo dj ot dx pp vl qq rr ls j4 fs dl ve c6 rq ln xk ec rt ty ik y0 tu yq fz s5 sd sh jn wa uj ws lx qr ca rz wd nu ek yy yi y6 uo os up f4 fz qk h8 qc wr at 18 ca ww rv sy ox o6 +\n dv wu wo uo m2 we rp b6 qe ik e1 bq w8 x5 ez fh u4 iy jy wu li f5 u8 w3 yl te +\n sa ds qd no q5 ra jd qo ru r7 uo ar ud on ak fv dg wl qx qv ye yl ep ge +\n ss rf qn bu gj rj uo yz tf m1 kw zr oo y0 pf tc dy qu v6 xh t4 oo um df je qh dz v8 ho wn wo 0w dj rv o3 du ro +\n ij uj k7 me lg ih hv ws rj pl sd uo y1 yk d0 pt y4 g4 ou tw sq td fj ha qm qq 4a kw d7 xy m5 bx c9 yx nw tr qo uj fu en p6 s1 ht tb qo zp kq x2 wk wj wk yt wz sz ae iw ay fk ao ug pq qg k1 ql xx qc cl qk 56 bn oj yt et ut uy tw ir yc +\n k5 pg cp z5 wr no zd tk ej an qx gj i3 su we up 3q yq fx ib tv qp ik wj yf u1 os rk jt qo qx n9 w1 rb +\n k9 uv gs wr 3b mh km bm we w9 es or yk r0 g5 aq gf nq qv ll m5 yd zq qt qp sv ed p5 of eh i7 pz hl sg jn wa m0 nm kf w8 wj de e7 ar iy pn ly wn fx w3 rb ey am +\n o9 d2 vg gk ex rf rc hy qm j4 ga qw rm ls yl cm en tl tp fp tb i3 qy qo j9 vn zf wf qg mb kj qi jb mq wl rj s8 lw um zt wb f4 xw f9 +\n ra go ls qx wi c6 b0 rw g1 yz fe g8 ow qq ra mz ex oa fu iz tl uc e1 p6 x1 tf rh tk fz ap hl qh k3 xb mw zm yb yw q5 aa rp +\n yu qx sc xe j2 oq gs i6 i9 l0 +\n yv ss tt gu fi qj bt ql ls io nw gk hl up zv gl ni xt wy dz qe ud nw rw qu uw e4 qy px qf zw za ty ek t7 pv dg ho wn uq rx yx ep +\n ga 1w ld wy o7 xr pk r9 g6 hu jg lx sd no xt wr zy ku l2 nw 9r rt i5 to tp tc s6 f1 ud ko xb rj qy es t0 f4 fx ii rr hm hj fb ji oi n1 vk ci 9e mt yc 2r tv gk yp ux +\n hb hn k0 wy m4 w7 rc ts y6 j3 qe ve qy rt so di qo dp lk xf mq wl em f5 pr wl wn 3k ew yt w4 ri +\n qa ss lq wr bx t3 r5 ed eg sx dn we 7n ra qe b9 rm wd rw eo oa ri e1 e2 ut ap hu qo ws uz ai tz nl cu wq ln wn ie aj +\n yb rs un hm dg qm qk ao mw fn kv ur uo pj e9 sf ia tp tw a0 td sx fg su xq m1 om na vk wy xk em l1 z0 nh b0 mz qy p2 ru au iv p9 pz ug lz xn wf xg fk zu wj wd u1 e9 tl ak hf sw o1 pw dt gq v5 lm h7 nn nl wq uq zt o3 ad ry id ig +\n a3 pp dv qs gn u6 jy kk io dt wt ck rg ua yd ya yh ax ac y1 pe pc pv fp fw dc qv zb dn q0 ju jj m1 ui lx qe qr t9 ja he wi vw m7 l1 jn qe wa qt xg rq qy yi qu p3 yb ed en tz so s3 tb ho fm px gw zo lx wf sm mc dq wj yg l4 uv yk tp t5 wz ol fk f4 pe kc dj wz qb zm wi br zk ww ty 6i vm eb lt eq w2 ey yp yz o6 ei +\n fu ga io nt wp jz yf rv oe eh pt dz ih sx qx g0 qm hf xe lz gc d5 bh 2z cn d9 1r sz li bv qe 6d bb er xv yx p2 ea tj p5 ay uq dq pg oh qt s6 px sh ko qa nn oa bq cs kk hh cr wg tu y4 t6 e5 oz th sn ov u5 dw qg dh uk n1 zr qv 3d n4 yx xe wv eb h4 yo ro hx o8 rp +\n ra gu hm a7 jw qm qh jr gs k0 ql xt q5 dt ru wy k5 wh fw lu kb am m6 bx vy qq ev rk 2s mc yd es io pc pv g2 ek tq tw in ih ae qc d5 ui qe wt qq m8 vr nb ee hu rw rr tt ed fi em e1 e3 hh hi sh zp qo wp l4 ws qf qf pg eg to un gu u1 t9 ox e7 u4 od ds de hh py ql h7 gy js vz gf y8 uq se do ro rp +\n qs qg gk ta bf r3 hw r7 r9 sh ua g3 sq td g7 ha lu qw xr wy wu rz ko bb i6 uy as di qi za hv jw rf 1f 2u va ap qi rc du wk yt t7 u2 ob re ax v8 cg qb wy wn kg pn yi rn ru +\n gr ra jq qf go ga jh gs q3 tm q8 k7 o8 mj ym er ip ua ej hy i1 dv qb vg cv m5 wy xk g5 wi ng w3 3w ud rw ug ep hq ta fc fd aa i5 hx qp wp v7 qs l6 l9 l0 jn ty t6 ie rj tk od ys on pq tc zl nh qc xv wc cu ks ei lm vm cj yi ad r1 si sp +\n qa hm a3 ac q9 na rj if qw rr vw tj ib su qu wo dp j0 wf pf 2y wk ym ra wb ae ga gs f8 gq im ar pb ec f9 yu rm +\n t8 ej an y4 td ez ln z9 lj qy sm uw dq us cp nu tg vn +\n qa ds k5 hw k8 k0 ql hl 1r wi fw c6 w7 mz rj xy r4 e0 ym yh eg r0 us fs ib oi qv q0 ww lp gm ln bx nc qi l1 qe wg ea qo eb tk eg to ur jc oe dp hv wa 2q nk at rg wf wg ca xk jn pk yg er ot uv wb aq ol wx e6 ev sv uo vf eb ah ud da pe qg jr kn ju ng ae wv n3 iw ly kf cl pb wv tt vn eb vm u7 ew aa w6 rm gx r2 o8 +\n q4 q6 vk d6 eg pc pv r0 tw i3 q0 we tw sm e4 ow sn kg up hm qx zv nz wm u9 ul ri do +\n po uv dc qs qd hm qg q2 jj sw kl me q8 xa wa xf z5 yd r4 rq sf px ti ia r9 yl dj dk ek qx i2 sr qv qb lb wi nf wu qe tv fh qo rr yb fy eb ri ai ok qt pc ud qi qa ws qs lc zh nc x2 cs t2 di ke wk sz oc yp s9 ys ai ln wz cg wc wv os qb f2 ec y8 dg wm rz yr ee rn sy du su eu fm ei o6 dp hc +\n ft qj q6 wq up ut lg er uw db ll ws of og e4 1i r0 wx fh th vf re hm zi +\n a3 ty pw ph cg uo r7 oi q0 lb c0 vl xx mh hu b9 qy tt sv p5 eh to hh ow tm oe si sk oi gt kq cu vi j5 wf el tf yu u3 ya uj dy qh ql ct wc el y0 o3 o6 if ge +\n a3 dd by wt lf 2v bl 7c bn cf yo go yf ii et ey yl aq aw g8 ho i3 qb dn qn lu vf vg 2k le ml wy t0 4h xk qw b7 bb eu xr qu tt y0 os sn tl pf og tz tx pl ss us xd cu oa qd xn ke qf vp kh ny wk r8 ej rd t7 sc e6 rh ud tx al gg re hj ux qj gw xx zv xm iy ca vb yw en oh u9 aa w5 w6 ul oc an uc +\n qa un dn hq hw d1 jr jy kk kl wt kz zf z7 cm q7 me xp wp mj rh ue e7 ys rz eq ew ed xp ee yj y1 to fw aq po i2 jn li on m2 na vq wu ck er yu db yi gl ty eh uw fp tx e2 fs uu sf jx oe jb qp cy bn qd wg 3z nu j9 mr t6 gp pv ha tl ai fx uf fc kx qh gw xb zt qv qb ir cq vb y9 ct ol fn ah hx sp +\n db wt cm ch jc wi dd ys on td po y8 q0 wq kt eu tc tv or fr s3 na e7 uf gg re f5 tt aa tb ie +\n a5 jw qh q1 qj oj xy my b6 es yg yl y5 zm pv qw qt qo ea ri ao in s4 gv i0 ad lh wa qf gm rk vs oy r0 ez ab lm qs qh ry ox +\n ga ca z6 nr wo rg bm vu uu rj e0 ui io pe eh d9 ab tw fe tf fk wy ln md rk sk qq qw hy kp dc qy y0 p5 p6 p7 ic pg e4 jb ge wp qa bn xf ks zi oy e5 um wx ie yp fv je ng oj ja v9 bp qv er an pu +\n a4 jw a8 o1 q3 un gh le nq q8 ig rg rl ea io er tu fp dk hy sq ae lo qq wt wy 5i xj cw dz oo qo yn ty y9 y0 sb ef tj uw ta ur i8 tb oq af hz qi wo sk zs qs vi wf kt nb y1 oy wk r0 ol ex ec tg t9 eb ap fv qk ji cr s6 et xq bf ep mi ax rt yu iq af am yc +\n gr uv hv tr a3 qs lo u7 jy qz kl z6 gk gz ag kn rg k0 w7 wr rl pj ii yh up ac ot d0 g6 td y6 fr se pp dc g9 cl gx qw pl m1 ii qr vz oy nf eu eo p1 os y0 ri ix au uc ai fx p9 nm jj lz pa kw ul rg gw qh 4m eo qc l5 rp oy ej un yy yu t8 sv ud fx ac dy av gq qj ve sl bu th u3 rn nz n5 zm yz bd tx el ex n9 es rt rz rx ol sy rn yo +\n ph cb jx wu ib vb ih ty oy tl vu +\n df qd k7 z2 q2 ju jz zf cm mw yr gu rx yh ym ef pc qx jd q0 ow pw wt rj xo mf xl qq qw ud tw ku ik oa od ti hk f1 xs qd wf dm s2 ph xo ou sx ae iw t9 eb u3 rk ak hf dw ax oe zl zz wm sm el cx cw lq za tu yw rx yu rn fn yi ei +\n a6 ql wr jx z7 wu xi ym fo if a0 dv ww lx zv dk tu sn hh ff hu zo ws rf wf aa ni kq uv t7 um go e8 ob sm tz hl uc zz ol lr kc n6 bk ry if +\n qs gm tn rp iu pi qe ec to l1 wh ra wl it kx fd vx q1 ri +\n gu pw qg we d4 ws q4 cn q5 me qv zj zl ex wr xo yg r7 eg et ey us iv po aw se cx az lb nz nc qq ew rs rq yx ep tj uq eh fz hg gv jc di wp sa nc ya cs fv qz ti wn aw e7 ox u6 pn re o2 hm fv qg hl dl v9 qv tz 6y rl ye rx ur tn eo +\n gr qj z6 ld tm jw hc ed y5 se ke ht tn jb 12 yt ek ao io wv ew ey fm tw ir +\n gv fr ak o0 gb rd dv gu qf qg qh jg ux qj ph k0 oj wa jz bi ja eg c1 fe qn b5 rs rg b1 vo z7 us d5 r5 ii tu yh y1 or ek sl pm hy dc th sy ww ze vb wt m6 iv mj qe 6f qt gk tq ru yq au ap dr hh qy sf qa ik kt wd rz ej t3 ot ej ub wx oz th s7 t0 ag ga pv em fz sw o1 ip qh nd h5 et ho cu yz tq wq wn et tn yo si ov a1 +\n ij rs rd qd pd qg qh z4 ql ip nq q5 xu bz lh o7 my 3w xe ws 2p w9 rk es er d8 pu y6 qc gl bv qa rv qt rb os ru fn qy qu hx or wa qs at zg mx xo bg yh ec os eb hd rw dw ip vw ki ok qx cu wb sn wm yj o3 tm ei ah +\n tr rd pq qd um qj u7 q3 cf db k4 gl mr gw c3 bs k8 vi 4v kz cg rz et ey tp fq y5 el gd dx qx hp mn cz wq xh m4 av t0 vz m6 qw tv rq ei il sb tk eg uq tc wo qo zs rd nx 2y fo j5 l0 l1 hy vy t3 t4 yt va y5 rg e7 uo ox at ir ys hd uf fx re rr ac kc cq qk cw h6 kp xn zu bd cz ca pn pq w1 rx vc w6 yo is fw ir ov +\n ra ij a3 qs qn jf qm nv cs cv kz q5 um q7 q8 km ya ys rx yn d8 sh pt fe se js ue rk m7 wp et ei qy to tz s4 af 3i lc wk ej hc ex t7 oc sm s0 tl fx re fb jr jp qc kc jr cc w3 yl oc ob ep +\n sa yb qn k8 lf d1 c3 wp vr wl yd iu kb sz g7 mn jm lz sd m3 lv qq j1 ex qo ry ru em pk i3 hi rf fk nc wd vu yt td sc tg s9 tz tx dh x9 qh ku dz my yr w3 oj se ei gz tq hx ah fe +\n w9 rl rc or fq a9 pp db gj hs lc qr ec p4 ph hb x1 ez u5 qx ea 6t tn +\n a3 qa dd qf qn qm qj vj wi ag wo ig e3 wz r6 d7 ax pe rb ey r9 is ot tq oy if hy se qx ar qb vd qw qe np xy nd wi in gj qu y9 ev ti tb qt px ud wo ll cy wd hw kh fp wk wg wh ym vo ub rd t7 iq yo ox eb yp ys au u6 rq ii io pe qh nz vl be n8 wv hk og rc er yu u0 rn yl is do eo +\n dd nn oc el yu tl rc rv r7 y2 hi qc qm wu cq qw xc kp tr fu ib zi qu wp vi ci qj nu zw t1 wl fh ev os f4 f6 f7 cd zc qx zy wu bs qn u0 +\n o9 gr fu a7 qk xu q7 wp el yu fp ou y5 pm pp qm jm st op uc fx tn hl zs kp bq p7 hi ys qj ki qc qa n6 oj ey w6 yk si +\n q7 xo sr he uu sd s6 gy ws iz fk sw al v6 lq fh ie oh uz pu +\n of ch zj rk rx rc g8 i1 jk tv ul fi e1 ic sp in jl jv j7 nm rp r8 go hf wx tb oz tw it +\n se kc tj rx yh eh td pa zb qv c8 j5 ri eq b9 rm ik ev ul ti p6 en ok tn wp jm ws ke br wj rp en gd rq f6 ac ab zc rz ew tb ro +\n qd wr d6 i3 j1 ww if qt yn fd e4 qf j5 yh t8 u1 ev qc wv pw u7 oj ok yz tw o8 +\n un pa jd qh qm dz pi z3 ny gs k0 wt xy z6 cj k5 gl bz d1 fq ye yr rh t7 ot if g6 im pa ps fk zw lx kr lv na wu vw eo cm te qo tr ec ty sb y0 i5 to ye so tc i5 sg ct qs sc ws qr xj 2u n5 rl cw dw ys qj yn qc y1 sl t9 ox sv s8 ya s0 tl ys rw tx fx ds rr cq cd ql qa au qg vg rx yt iq tn yl uz ei si r2 ob +\n rs gm qk gg m3 rj eq mv yf sk gx ve eh iv i7 n3 pb uf gh uj tg ox ww bg oz su o6 +\n ih a3 uj rd qs df h0 jd d2 kj q2 ap wr ol nw bz q7 fq ir ra w0 eq ya r6 d6 eg ej pn py pp sr qb jb wq ni xe we lm be xo w2 qo mj qr hp tr qo qp ef of yw ai e2 i8 fb tm do dp i8 l4 wd p5 sn pf gr vs rx kz vh t2 wj ot ar t9 at ir dw qj nc cw fd sx qc mz lt pv br wv dr q3 yq vn ye yw dk oh rc w3 yt se ov ge +\n ds h0 jw he qh jr jt ql me na ah xa tf wt pj pk om 97 rc yg ym oe yj eg dl fe sz g9 lo qq qw wx rr c8 ns vq m7 xl gs vr qw qr kq qi qo eb tk ue dw e2 i8 i9 hy hh qt f1 pc vv qs bn ij i0 uj xh wk qz ns ej un oi yi rh od ha tl re tc o1 uh ac ip qj we qh lq eb w3 w4 ia oz eu ri uz ep +\n fr ij dl qk z3 qz wt z9 gq mr wo zz rd dd rz ee sw pp g0 sy vg ww iu pz uo cb t9 ld qr ei yx rw es ts zi wp wd gw wj hf r4 tt x8 wl t6 hc gp eb aj ai iu o2 nh qv ey kg dp wq f5 rt cg yw sr tb gj rb fm ro ah ig +\n ss ux q4 ji xa mj mi ld rl pj r4 rx yg ti ix a9 ig gj j1 ww ii qe j3 mz vl qq ye m8 b8 yl qp ik ki eg uq fi ok fb oq fm sf oe hp v4 nk wg mx kt vs j8 yn wc wj ot td wn iw os u4 tl u5 rq de io x9 dl ql n2 ji wb if hx +\n iy jk ql q4 wt kz fb q7 vy w8 ur ax uf ym yl py ou dl pm in sq ho j1 qr ls j6 ic sl ko xq jm qe qr qt yc es ry pf he i8 s3 pj tm oe qo lk wp j9 nb yd bu rs e5 yi ar rh ga ud al hh oe wx s6 do kv be pm w5 fn ey du do pu +\n po rd qs il rf uq of jf nf ih w8 b0 ur pl us ed tz tu ef rb sj tf ff i1 pa dv ue fk m2 qr wt j5 c0 vw xo b7 p7 qt zi wo gt qa oo qd bt nt zq x8 ou e5 u2 fj s0 yd sw re cd qx jp wc ja ga jt bh hm eq rv hx gx +\n iy ij pa gy qd qg he d2 qk d4 qz q5 nw wu am qm ft w7 rq yn ef oe pv ek fq sk y4 ts am fd qx q9 jf ju wy lm zw wp er sy qu oa ta jl ss gq fe wa p2 kq ws 2w dn xz t2 ej rp rs yy e6 iq ag e0 u5 tx dd pq fv jr qj ku oj ql wz fd s5 nj qx zt 2d qb nx pm ce f9 w3 er tw rp aj it +\n ss qa gm dm qk c1 jd k0 t8 mk rk tk om yn tz r7 px ac av ot ts if fw ez y6 se qb ha su qn cl wx we qr zt kr mj rc qo es tj ym iz tk i6 fa i7 s3 pl jx du qu j0 ws v2 wj ys yv wd s4 wf nm dt wv ub ez ta wx e0 fz al ap qg wr ar wb fj n4 cz qg wq fc mp yq ev se eu am gx dp te +\n a2 hv yb nv h7 jt lw xt lu wp yr rg 2o 93 uo pr ej ez jb lz ww az oq bk b5 wi qw rq hs te ea es ed fu ti uz fd tm jc do qi j9 zs j0 wd xv iz hr wx el ns oi t8 sc t9 sb fk hg cd rb mz wn 4i ov ln yr oz tm ro o8 +\n iy pi jt kz st tm rh ya b2 om ef eh tp el in sc qc g0 ps zq nu pq j3 oe a7 ja js ng tc qe pp eo em fc s3 hh i9 jl qy i8 lk wa ae 1p vh ox rk em hf dd jt rn tq is oc o6 so pi +\n qs gm qn gw qb cx w8 ur yp up uy ek ez ar sy qb hd bx rl qt yi nw tt eb fl eh pg oh ib qy qi bp jz lf eo ph wh oy y5 om az tc ab wv wb kg ww eq ok aa uy w6 ag ig pi +\n ra a5 db co qn d4 bu qz kx me nr q8 my lp t8 gu rk yn et y1 ej g7 yq d0 j6 b6 qq rn kw ei yc uq e2 s3 oj s6 jl kf rl ny wg mw t2 co el yy ez eb e0 al qg km k3 n2 zr tk qb n5 n7 et tm ul +\n po uv a2 o0 rd hq dh hw a8 d4 wi z2 vt ww kb d7 pv tq fa ta dl oi y6 im ff ae qv sy si wq pq bn b3 lm b5 wi ku qu ru ul ri tx fb ss or sk wp qd w7 kh nn es hy wh rp um sx e6 rh rk pn sq rr hm dt ip dh pt wl h8 qc vj ly bq zn gd wn q4 hj yq xb mf ok tm ge +\n ub pa fy qf dh qj q4 wt mw cm k5 gw kb el w7 w8 mx ya ii dj dk gd dc gh st qb iu jk qr bz vz ab b5 mf pu qe xd nq eo yb pd i6 ue dq e1 qo wo sp 1o n1 4v at qf fi of xj rj dq ew nm x5 wh na ub e5 um sb ob em pb re ip x9 h7 zv xm bw 1v mp zr w3 xm ee yg rv rt ia is ro ep +\n cm bp hc rx y4 sr q9 jj rt qo uk ev to ff so bg eg y4 l0 go os ay tx qh hl qc wb +\n z3 nn o9 xf fs gd g8 ns ec p0 tb wf uv iw jt wr dq bj u7 e2 +\n da td ta tw tf tt ay dq sf gi ae rl e1 gk af dp +\n un fi dx wt m5 vo ys j3 i5 ad nr wj mn tg ox bs ia +\n hv yv qa qf dg qj do ek w0 is sl ez sr i2 ww we rl vr qw y9 tu p5 uc hj i6 ud ws l5 qf xh kh lg wf wj uv tf t7 e7 dt qz ka xn cx xe fn it +\n iy yv rs qg uw oh q3 lr vq bz ab zm wa ds b1 w9 rl rz uy wy om uo ef fo py tw fe qx i2 qc qb qn ww vg ke wr j5 j6 oy qq ng sl qw mj yh xf yk xg qu te p2 ft y9 uk ym uq so fx ff fn qy du f1 na lh wo qo ge sk v1 wg mc dq wj iv 1h pk 3s ej oy ek td ex ae yi t9 go e8 rk tz ud rq ax hz dk qz kf wm yq cy w4 h6 rt ry tn r1 gz ux pi +\n d2 we aa cb o3 xi tu ti gd wq pl xg wc lm de e4 sj hc ic wc ra wc go o1 dd ip wl in wx js tv rx yi yc +\n ty um hq co ux ql q6 wi bc kn q0 r7 yz ib pm g7 po qv re we bh 8j ru xo ra eu ud qy uh ec ty ry yn hw sm e1 pg p0 dr qy oe lc x1 kt xz pl t4 el t5 ex sn us dq rq ao f8 pr md ql v7 v0 n7 kh vn wm u7 cz et w6 gl yo ei di tw +\n ub jg ph q1 q2 d4 q4 qz kl ld cn ji z9 ro ek gb w7 rh pk ea ax yj pv ot yl an sl y5 po im i1 zb fj qb i4 gl xq si m1 jj lb l2 ul sn ue s1 ta hg zu lh nd j9 ci qu wd bh ef ro ra aq t7 ex t8 od en fz fc df h7 qz n1 v9 zy 4a tc bb ea yw mf ia yp eo aj rp ob +\n o9 qa h9 dn vo a7 qj jt ji ne kc cj zh wo q0 w7 e5 ui vi ya wy c2 r6 ui px yh y2 to pr ab dj pn a9 pm tw sq ig hi bg ni ry lv wy ic bc li qe im dv rq xy ki i5 fa fv uu af do vv za l3 bi kd nx w8 nt lh hu ra ub un ec rj ua fk ir s0 f4 uf dw jt k2 kz ml cl km wv vv es tb yj w5 rn yo af ru ah ig +\n vg wr zh wo on ew ef ae ha id uf eg p9 ef gi al ng 16 rz o3 +\n qs jw qh cv z4 ok wt k8 kg km wa uu us sj oy iv tw jm c9 fo nd 20 qw w3 yi re qo yv rr op qp ue oh s3 uu px jc hx wf v2 br ep wg pz t7 t9 au re zj kn xc bo kg 1v hb wv tt u9 gj yu ry iw dp o8 +\n qd wi ij rh ef fe jm kw xj wh uk ef ti e2 j8 ou xo ny wh rp wj ub s7 pb nb qv ev o6 o7 yx +\n gr dc ft qs gm qd dn k6 lo k9 nb as zg bz lw ui ee g4 dl qv q9 lu jg rx w4 yj ep oo sv uq hq yw ao fc e3 ui dy du sk gc gy qs l7 kz ed ej wl un yu wm oc gq qk qc ks tk ti eq em ly vl er ry sy yo ro eo +\n lq d7 i4 7w y0 qt gw ch o6 eo +\n fr hb dc o0 yb hn gi jh sw kj we o1 vg nm q8 bz zk bf ml ev ed r8 iv ht fg th qv vz d3 ng xj 0h 42 ew vt yg qr qt ha qu hs qp ij yn eg of tl p8 fz oh iv jl ss dy zu or sk uj co kt rp wb wx fg ev t9 rj yp u5 us ys ak rw al io kc dt jr hl ln wl wz gy wy qv qb mu hd ky ku zp ww yw rl oh ee w4 yz +\n fu dg qf pg jg o1 dc by q4 st t3 lj ve jr am 2i rz ea lh pl ed pz y4 g8 i2 db g0 fj q9 qn bl en hr m8 qw rn qt yi ei yk qu xi uh fy yn ix uy gn jx f2 gr fi x2 zo pl vh ek sz u1 s7 ya em u5 da re f7 hl qh ju oz ar zb ci tk ob n7 vh og w1 ok er o5 ri ro tw rp it +\n gv ra fr ub h0 hm pf qj kk zf zh rj eq d7 oe eh ib oi gg i4 jd ph nu gc qw rr m3 vj ry is dk qi rm qy qu ep p3 ed pd ta s3 tc fd sa im ow jc oe qi j0 gt bm vm zf nj rg w7 x2 nr wf hi rp wk co t6 t7 e6 ag eb u3 e9 f4 om o2 dk h4 gq jo cr oz ka kx rn wn do ep wb vn ef rz ew yi r2 ro so ob +\n ft a4 qs pq iz pd u5 cs q3 qz ra rh w7 rk mv kv ee y1 to dj sj ta pn oi tf i2 th q0 vx vf ww 2l cb wt yq ku ye gs qe w4 qy qi xi tt es qp ed ef ti i7 tc pl jz ho zo qi za fy zy rk x2 r3 ht yv ex op ae iq u2 ag pb of dd h4 lq wx cy cu zy wm ry ef dj vx st ia ey te +\n rs al qd uq ga qj sw we pa bi ba e4 yy mo d6 er et ti rb py ek am ib fe y7 fh jv mn qe qr oe c0 l1 qi mh 44 xe ei ev hq ix e1 pg pj ui hp pm fr qs kd nk 1v wj fa wf yt t5 vp ex wx fh pn ug fc pq io gh dg oy nf v6 bt jo qz gu me wm n7 br tx mt q1 su eu di uz am if uc aj +\n da a6 q1 ph uv oj ji mp t5 mi rj cf jl w0 pk ew ii rv oe r9 ic id sl se su q9 vd we j3 ac d9 yw ew w3 y0 tk ao hr in e4 hu du qu jb wp cr qs v9 p5 vi xm kf s1 ea t2 wh y1 co iq yo au iy on ds fx yf qa zv qv f1 y8 wm u8 rc o3 +\n iu r5 el dz rt m9 hb lc x2 zp aw uz +\n k0 px qe qr i2 yz qo ap t1 ou n4 +\n qg q1 wr wt wu 5x ij rg lq eg ia r9 is dl aw g9 xx w2 qt au i7 us jc f2 ge qa gt l7 lb mc x3 3p tz u6 kx f8 fb ku ag hd oj o3 fn tw +\n ds rs k5 go qg ga qj gs by q3 xy q6 k5 4k o8 ws td mo w8 th ys eq pk yf r5 uo rb r9 td y8 tg ho qn gz li m0 oq kw qr g1 wy iv b7 vt qr qu ti to ta ut sa i0 pl oq sd ho qa gy qq l4 ks fu wg qg kj eh ez yu tf s7 os s9 ya em pq tc fv qg ve sx af ci ah qj bj df ry rl wm zy tv ol ey ox ri ie tq ir yc +\n ak ra yb ds gt fy qh d3 ql jk jl ni zs q5 zf lf so wo mu yt wa w8 kl ue e7 2d mb yn tu ac pv id pm sq sw jo dv jd jg qq qw qe wr j5 wu 1h b6 vr yf cx lz rn ho gh qi es ev ty p7 fx fs s5 pl sf lh sh i8 qa xs 1o kq zg qh wk fs vo wl ez iq uo tj u3 gs ii je jr hk ql xx 1j v8 nz kf vz ww yw yt w4 rb ol o4 rn ux ig sp gc +\n yv fr qa rd gm ps jd a8 qh ls vg q5 lg eh z0 vt mi vy rg lp ex ew d6 yg rv oe fs sz g6 sy ha cx qq wy j6 dk hr l1 qe gl ex ln uk sv ty at ru uc ts hi hl lg jv qi vc m0 fy xg qg eo hf mu mo kz ot np oy na el yy wz fh gp up ir e9 s9 f4 gf pw uh uj jr ab qh uc wl ce qz h8 v9 wv ie 37 eu gf yv 1m ma yw wm oh dk sr oc ei o8 +\n qn cd zf y4 oi dv xq q0 lc av cw ki xd lx qi gn bh em uf we ja ox iw qb wn my zs y9 ux +\n qd qf we ls lf k4 eg bc e5 rl ea r4 oq er ip g2 yl ot iv ps gx qr wy xj vz xl bx 3o qr eu qi uj p7 uc ph in pk qt i4 gq wp v6 kw kd xk zw 11 yj wj rd oz th yo eb ya tl au tx qj wl dz wz cg zv qa rb wm 7a zs vj yw ee eo +\n jd go qg d2 ji qn wa bf t8 ys eq ui d6 ed yn r7 is qb q9 lp lz qe c0 wu tx wa te qp 64 uq in qt qy wp j0 lz l5 og ca sz un ec rh pb pw h2 kv aw wy qf 16 rw ew tb aj +\n a2 gr qs fu db qn q1 uc jr qk cn q6 b2 ne lg q7 q8 wi wp b1 ec rk yj pc fo iv sk gk jb qm zw m1 wx zt xy wy em 41 ee gh xg cn yv qp sn od ao pj fs ut s5 tb ad jc j9 xa uj ws kf wg vp nv fa wk mq x6 vh wv t4 ex iq 7r y6 sv ox ev eb rj rk em aj pq gh f8 th os sb mt ak q1 xr yw ti ee tb as ox o5 yo gx uc +\n qj lp z0 aj wp vr wa bb xt w9 ya on ew ym ia ix pt tw dz jo ae cc qe lc qr cn b3 c0 ib ml qi uj qp pf p8 e1 s3 tn ui sg pn i8 hb ij qw pd ld fo ap ty ro 3b r0 sz ie gp rj e9 fk gd pw rr uj cf qz zr rq 4p kp pr vj w5 iq ey rn ie eo ir pi +\n gr rs gy pw qd ga jj z3 kj ql nn bg dm zz uy pl e0 lh ef oe am y5 fd qx hi uw i4 q9 hs jb vd cx ni qw wx zt qr d0 wi 43 w3 cc b9 qa rw oa ev ry p4 en tk ti yq pd i5 og ic ye so tc de pj ff hl oe sj qs wf v9 xn gm wg xm 1f ph dr vg wk ns t6 um oa e8 sb t0 gs sm fx o1 de h1 uk qh zj zk ng ct gp nx xe 3z wm rz yk tn ro +\n qa pt k7 og kl wy rp hx wp wa ui mx eb 95 ac eg dj yz aq in ih i2 q0 cz cb dg xi cq jc qe qt es ed sb en iz fp ta fc tv tn gw ka i0 lz sd il qf 1s iz qf nc xj xk ep r7 rp gu t7 wc t0 en tl iy iu pw kn km ql ct qp ch fl wm n6 rw eo qm vx ty ee ru ig +\n um rf qd db qf od d1 mb u0 le xu wy q6 mt bc qw cm uu us r5 uf or tq ek sx i1 it la cb ax t0 wu ab 1t qq g6 ko g7 mk qr ey ha ea qp y0 en ue tv ho i6 i8 sp xs qf v9 jl kt rk qy ot 14 na ub aq op yo en tk ob on tx f0 qk jp vi iw tj x9 zi n6 wo wb se aa ag oc gx +\n iy ub gy pt pd qf me xp w7 rj tk r4 rx ui ii r7 us pb pt g5 fw gf dm wi w1 eu re tq oo es pd ri tl og s2 fx ap ok i4 di lh f2 1i vm cp bh wj wx of on tx dt h2 hl qk wq qz lr tl f3 ce kp yr yg ro yx +\n k6 qf cp la wp gv es pl uo eg am tf y7 i3 hd jk we d7 rl b8 gg ug es rt p5 eg em tz ow 3y eo wg t1 lc wk ol tj en ak fc f6 df gt ol qc rn tz wv rx di ov +\n pp qd iz qm vk jg r4 pl ym y7 sc qn jf qy rq p8 yr di qu hb wd rf ks gw qg s1 x7 ec ae iw eb ai sq v8 h8 le ea vh yw yp +\n ik a7 cp sq q1 lq ql wa qz lr zh rp ra gb w9 ys ui ym px up r9 pr ek qv qb hs bg wt ku pu dc p1 qo ik uk y9 y0 en hr tx ts pk jl ce lj l5 p6 v4 wk nu vg oy aq aw rg os az uj kc py ql oj qc pc fj jr bf cx es vn q4 y0 og w2 ue u8 is ag ie yc +\n rs dd ik k5 hm dg k7 go q1 qk wt q7 wi ws t6 k0 go ii ee io ym ey sl sz sw jg si d3 qq qw nh lp cc kw xt m3 ip ln nf zm qq tc ex ry at iz p7 ux of he og dq e1 i7 pj sp s4 ok qt gt sd xf ow qr pd hd wj qh x3 yb lx wx um e6 t8 s7 uo u2 it sw pm rr qg h3 aq ze h8 ks zb kb bh ec wb vb w2 oj af +\n ak ds dh jg cp ws q5 nq wy su q7 kb o7 ys sf et r9 ta sq y6 dn sy cx na j6 jc qi qw qe qr rb tn 3g eo uh tr ft ri uw of i5 ue ta fs s3 uy as ss qu ns lj wp zf wg sm x1 ix mc va mi rx ej yy y4 t7 ex u1 y6 u3 up en au ds ap kv qh kn gw k1 zv eu lu kh tx qk dr dh wm ti h5 o4 w6 yk af fq so aj +\n uv sa hb ps q4 as wi ej qm zc yd yn fp y3 td hy ue qw qy es tu uq tx e3 jz ud sv l6 fu xh dq wk wx yi dj qz v0 qd ga mp wm yy tn fn yx +\n qh qz ar qq ma kq rx qa st ei +\n dc df il he c1 jt qn yd yn pe et pn pi d7 ke g2 j6 rl sk ng z0 m8 mh qw j1 eu qu rr es ec uk ev ul pf e4 sg jv m9 qf vd wk gu rh e9 f3 on qv vj dh aa ru ux yx o8 a1 +\n ra qs h0 qh bf q3 dv bl mr if ws df ev b2 pl om tz ax yk ta y7 aw dn zr ax qt m5 xx wp qy qi qo at ti p7 tv i0 fm qu sh so lk qp hb p5 xk ib vd hk t2 np ek yt um u1 ir sm yf ug az qj v5 wr fg zv af qv ck ay cs ww pq wn w1 yh as yk ei +\n tr yb df um qf iz k7 q3 we cb cj ne zg a2 e6 ya r3 ut on rq io ow qx ja qv cx cv bh vj qr lv pc 3a rm ep uk ed ev au p8 so fx p0 ts e4 fb hj qt dy px sf f1 zo vx qa wa sa qs vm wf xg kf fz r3 bu t1 tu ez t7 va e6 fl tz uf gg io qg qj h5 zz nh qz zt et ba lu tq vz xe bb md u7 oh 5k rv rt tb yu tn ah +\n gr da ty qj by we ls av kc qc wi wo xr mx cm yg oe xs pr ua pt dk oy hp qm qq zw vk xi ln he rx ko dz yt qe tv eu qi yz tt y9 ev ry ym ay uq pg oj aa s4 sg hp f1 qu wp qa bn vi os iz hw kt t2 rs wl r0 ez rf pv hs om dd f8 uj dj pt dk km k1 qz qx wc n3 nl wv qn zo vx ww dr yr oj r1 tq +\n ra jg jr ao c1 wh rj fp gz iy lo gc dh qw qr 8p eo ev fu tl i5 uy uu ui qp mb hk yt ou aq oi e9 ip dt k2 qx vb mf id +\n rd h0 qn ql la vg qz lw q8 ra sp ts pr av qc vs vg ku am z0 lo ry ev eh i8 aa pl dt du i4 zs w7 wj xl yg yh ra ex u4 pn lw gu pc on n9 n0 wm em tn +\n gb ik rd ql xi bd yr e3 qq w7 ex rz on ui yg ax fo pv ab ta jp qw xi wi qw qe fh mz eo gk qu uj ed ev en fo ux ye fv jv ws lx kr kf n5 qj ea s4 vh ez um tj ir od ga tk f5 dh uk pr pt in v9 js sv qb zn wb vl zj wm ca mu zs ef rl yw u8 er id uz ah +\n iy ij ub qs lo ql jk dv h0 wy cm q7 wu eh fq w8 hm w9 mv yd rz rx rv r9 eh pr ek dk el hi qc sy i4 qq lp jj we m2 g2 fo j5 wy m6 ve tx yg w3 rv rn rq qy hs tt y9 ry ym eh to e1 ur ff hk do wa kq jw p7 yp ky r2 wx oy uv ra yt t6 yy sz t7 wc s0 of ds om kx ng ql qz vj wt wb ly wm lw dh md ew w3 tv er as yu an gz si ro do +\n o9 k7 q2 dt 1i wa uu t8 ut mv ef uo g3 gj hp jn nt cm rj ms wi b6 im qu eo yc ex qp eg sf do sh i8 ih qa wa wf kd yo xj ql wf ek un wx t7 s8 rj f9 qh qk k1 lq h7 in nj um bu qv ov n7 bh bn 3z w1 yt et o4 gl +\n a2 gt rs ty rd rf qd qn jf qh k8 q1 qj ql d4 cg wt q5 z7 lr wf wu q7 sd yg yh g1 eg to el ih sw tf fg qx dv q0 wq qq uu px vl xi js jd ze la ud qy rr ky ft i5 em p8 p9 i8 hg im as jz tn qo ul wg 8d vs ap mq x6 no t3 ub wl tf iw rh ox ua pv ir us pb tx pw dg h1 uk ux cr sz ko wx jw vl rc tv af du ei +\n gm we cm jx lf vq vw kb wk e3 df r3 r4 ew yf ti id fe fr su xr sl jg rq rw uq tp ss qy ws od nv wg ro t7 ar th ak da yf sw io jt cq v9 kb iy u9 +\n qd ga q1 h8 xt um wt nq wy wp a2 rg w7 hm cf tj ut r3 ch oe r8 pa qb jb zw mm wq pl m2 wr wy mh hi ei qy nw uf yv s1 fx ut sa tb ss hl qu qi zp nf zd ar l5 5h gm vo ix xk wk wf vf el r0 sx e6 uo rj f3 em dd uh qj cf wz n9 ga tc qk mu rt ye w4 o4 ad ag +\n qa jr kz c3 c6 vp e0 ng wu ug ty uk tu to hr sp ud m0 ar pa qf wf kr fi ya kk wl xs ed mp x6 ub gu fh rj e9 ya om wl vj ha ex y0 id +\n qm q2 oh cd q7 kk ld ys yd rv yk id wt qy iz ri fi i5 ic e1 ht 5z iq ha ai sq pn al gh un kt wq mi dr ax u8 u9 gk ru ov hc ep +\n iy sa un h9 rf fi he uc u6 cd q6 wu zl zz rk lf yd rx d7 ef er rb d9 r9 im hu zv ps qb jf qm m8 qq ji g2 kt qq ew la xy qo es ft ik tl ye ur as tb m9 i8 qa ka qs bm zg ix ya kl t1 wj r9 oi um aw yo ie ys yf hg gq nh zc sb nw qf xm bc xr bj es rx w3 yj iq tm di gx o7 pi aj sp +\n il qf pd k6 h0 na is q8 4p zl jl z5 hm ec io sf dk if gd qw 1a ld lf qr yx re tq y9 pd iz yw sa wp bn jq w6 v3 x2 br ta yi ha en o1 io ip pr kp nl lt kd eu kf kn n8 zs rx ux +\n ih db gm jd wr zj xp vp qb c8 pc g7 uf uz p7 sh or xh xm wh mt no fh dh wv tk li qm vb ms if +\n he ql wi bn c1 rc ip ia av or y8 mx yr dx ex gz 1p ic wf aj kn 51 bj wn o6 +\n hb ty dv gu ps qj ls qz ch q8 zh xp bs vt rh oe ot pb y5 y6 fr ih sc q0 re zx lm id xp yy qr ry ay p6 he dq s4 ff qt sd vx jb qo qp gb ws wd sd co fp kg s1 nm rp cu 8l y2 tf ev sn au us fz hj qg wc u4 au qh wv bn eq r1 +\n uw vr eq rx et rb fa ek id qx ui kr wn uf p4 tl au hw tx im sf yd dz bo wb xw +\n uv yb ik qd gm gp k8 qk ao z6 ps mw zf jc eg a1 wa 7c zz rh yi lf pl r7 yh d8 g2 r0 tq su cz pl qe qe wr wv ku ho qt yv uj ij es ec ik yn ym uw tl sm he p8 fa ho wo gy ws zf bw nb 5q ql t1 ro rp ej xg uv el l8 rd wz rg go rh sv fh ya it pn hd ao az tc dr ac dy ot sj nd qz ok um ol sx xb wb wi n8 ji rz yr sr h6 et o3 ru rm pi +\n rs fi ag c3 lw ys ef sg qu qi uq eh e4 gy qt ya ro hx oa f5 1j qa cl wq rl yh pu +\n ub rd qd fi jl zk oq r8 y1 tp sl i2 qn sd cq 6d mj w3 p6 ta fm bo nv qi wh yj e0 ao uh kn h6 r2 +\n pa q1 fm c4 ig ex 2a yi mx ek ez dv jf qw qe 4s xt ld dh qq mg qr yc eh s4 hj yy s9 pv rr uj or qj cd wc ly x0 wv hh ye ew yh rb yk o5 tm +\n pp q3 mw rd up td j2 lv af ih hb ee xh yy ua ug aa tb +\n sa tr ds az qd fi dn hw qg dh qh nt z3 qz ad q7 q8 tf vu ue mx vp lg tz er yj to hy fr sw th qn hf gx jj pz wt lb cm m7 wi b7 vr lo yl qi ry ef sn uq ri fx oh i3 sd i4 ho vb wa qa ik uk ar hw l8 ya cw s4 wg r7 ot wk gu u1 fh th rk en sm u5 iy iu re pr hk qg kn gq cf h8 nj ct gp wb qg hj wm cy ok er tv u0 sy fq o6 gx eo sp ob +\n yv ak ra co wy zj e7 ew tl fo ek ez im q0 jm bj lc tc rm ec ou bn sd os x2 lh wj ot oi y6 e6 yp ob sq p0 js qh el bg rr rc xw pu +\n ih um k9 q4 ls jx ej om sf uh dz oi qx cl zm qw qr zc qe i2 i6 uu qp wp ws qd sd fj mx qk yn wj ub gu ar pn rr qg ln dl al vg mf w6 +\n tr ub ds jd gp qk jk d4 kv xo ws gi yo sj sl el tw i3 ow qe zx nx b4 qq ee eu uf uh ex p2 rr ea ry ef eb y0 en ri eh e1 oh fx fv sj jn xf qd vi l7 wg x7 r9 uv ek yt ns aw sx sc vf tk ud ds o2 pr kv ab gt v6 un qz wr wv rb os ie u4 rm zm rw n8 vc za q3 zu yy o3 yi ag pu +\n ij a4 uj gg jy dt 1w rj a6 r3 ii pe r0 ej ta ts ff i2 ho ov wq kw qt ot m7 qq xv ei lv kr yx yb ri fa ur de pj hi si jq wg r4 x5 hj oy 5i u3 tx tc nd v6 oz wc qv bz qb qj zl dg ed ka vh w3 yt ey w6 +\n o9 ft az ps hq uq a8 ql we wg z8 ye wk bf rs wa c6 dd ys rl wy om pe ix y3 g4 dz gf se tg pa va jn jj al qw sf ma j5 qy wu xo dc rn se eu xb nw qu qi p4 ef ru sm eh im ad gm jv pm zd g0 wg qf ai qz ym qc t8 op iw ox ay tc av k1 ko vj qb zo wq bg q2 n0 rl yt as rn uz +\n o0 jq qf he qh 7k q7 kb wp z5 tl ew yg et or ez jp g9 jv gk lx vk vw qa qo ou qg kk xz rx ro wc oa us ip x0 ku hp jr o3 +\n pp dc gi fi qf ql by we la za un qz q4 jc zh wp kg o9 qm bm wt r6 rw eg ix yl tp am a0 aw i2 fh th xq gc eq xx yr qt xt nw qu ri uq tl ue pj p0 hk vx uf jm kq ws jl 1s p6 ca he x2 wk wd r5 wg bi hk ro wj t5 sx fh sv e9 ya aj e0 pn ao ug ac kn h4 gq nj wr cu qs kf vx xw k1 og yt u0 yk di gx dp +\n ij tt ss dv a6 uz gp qk cv lq ql un kz gj wt 4y fq lh z0 6h w8 vp r5 ee tu sg pv y4 pu a0 tg q9 gx qq qw we la wx rr ls zy qu wi xz wi xp ew qe rn ei qo uj rt fy ik tr tk sn pf i5 tc sp s4 in gv i0 f1 si ks nl kw bq co mu eh oi ec sc wc u3 ga fk sm om kb wx bo zj hv y0 en og q6 er tv tb rb u0 w6 tm +\n rd ik og q3 q5 cn xp c4 ig mi e0 rc ym id tq ou po gg qb sy ob hf pk xr qr up j6 ng xx b0 qt tm eo vw ux yw pg tc e4 gy p4 xv pd wg n5 r3 wk iv rl ht oy uv ub wc ar t9 ga s0 em pw x0 pt bw wm vv vm yg fn ad af do +\n hb gg kl q5 t1 mi a4 b9 r4 ee up pr g8 gl q0 cc kr c9 vq yy wa qy mz ty yn yq ai og tx tn nd ws 1d ky x3 sz td gu t8 op gs tz de av sk cy zm be wv qk og uc +\n ph qj d2 cd q3 q4 bi wp vt oq y1 ps cw kn gz ij p4 sp e4 wa sx nj v1 w7 me s7 e9 tc k1 lw zc vj wb kb tw a1 aj +\n rd a5 hq qg qh q1 la cd kl mp k8 mj vy zz yu ut uo sg yz hi gk sy q0 m1 qw b5 wi dz qw rc aw eu zr uk ti em yr lk kw nz wg fx tt wg x7 rr lm ju th tt eq oc o6 yx ro o8 a1 +\n a2 dm wy ej rh rg pe a9 oi y7 zt vk ga yf pp fh ml tj p5 sn tk im jv v6 lb pf zq ty wh t5 go sv e8 it f7 ac p9 cu bw kg qk f7 w2 ee w5 tq ep +\n vs rg rj 70 ys nq uf ex hh jn kg ep e0 +\n df q3 u9 4j bn rj hw up td i1 dc hi zb wv g3 l1 rz qt qy ty tj ef eg sm tx ap in px af mx r3 r6 t2 t4 rd uo e0 iy ii hh qg zc v8 qc ch px zy zi ye og er tm if +\n gr pq se pp qe lq n1 cy qb wb ey +\n gn q1 ji sc nh pe yh qt ss rw hf kx zm o6 gx +\n ih hq ap bl wi wa 3y er pc eh r0 yl ta ts dl gg fg i3 hp kw lc ls rl ff wg qi uh uk yq yw ok as wp gc jm qf to yy fh e9 pn qk sz nm li q1 vb yq 2e rl tv sy di sp +\n o0 yb rf k6 qm fv q5 wi rp fe dd mz rz ee oe ia yz am ig hp fj su gl li we m2 ls xj md z0 uh yx eb eh ur i8 qy oe i5 jv ce jb jm lx ci kg oy hx e5 u2 tj kv qh qo af pv tz az vg yz ri ge +\n il z2 d2 cs ba wa 1o ys uy ed er d8 sh qx sr qb jd ov xq nu lv g1 ku pu rp qq ee et rm eu xh i5 p8 tx in i3 bn v3 ap r5 oy sl oo dr dg hj lm sk ff vu cu wb kd zi wv mu w3 yt ok rv ol ey yx ah +\n hv qs qf qm ph o2 zg wa a2 rl pz ow uo y2 ey ix us d0 ek fg ww j4 wv a7 wu qq bv te tr uj tp ue ts do qo cy uk j5 ra ou aq iq ev tj u5 tx gg df dg h4 qj nc wz v7 im kv jt y8 rz w2 yy ei ge +\n gt df jg og k0 lq kz zf iw kh gv cn ur ea eq yj ix id ez dc qc st wq c0 lm fa lj qq mj sw qe xb rq qo yn ru at e1 p9 s2 ts i8 s5 i3 sf jc xa hb qq gy wd p5 ow qf wj 1n wd qz yt ex e5 op at sm ud tz yf tc ax f7 dg qg ve sl qv tl wn 2h ky yv f8 rt o8 +\n yv dh kj jl wr bi kc 4j nt c5 lo z3 e8 on or g3 g8 uq sr qm hd ll c0 nh ws qu ug ph tc dy oq qo nj wn t7 ox zj qj km h6 ql zz qz qc hn bk fw ob +\n un qs fu k7 co je gp o1 bg dt vu rj mc rz rx r6 g3 ek qc uw fj li qw lx ku z9 br b6 mz yc ty tl yw yr e4 i3 ud ce i9 rf bq xh ep wf ej rp vu wl u1 os ay of pm ap gg dt hk ab ql lq qs lt nl u3 wq n7 bm ef xm yh w6 ru fq tw +\n qn ql zj rg ed hs we qw re p7 p8 yr tv pc lh gx i8 wp lz cp fv lq 1b di +\n rs q0 is q0 yq rl qq vr qa v3 tu in h7 zy u9 o7 +\n ak pw af z0 wa jh tf to ey r0 ta fe tf th wt m5 xu wu xo l1 b7 bv se w4 qi es dy ge vm l8 nv kh l0 j9 bi ez iw ux f0 gt zc 6w bf cx u8 w6 yo o6 fw +\n gb py gp pg ql um lf bx 6q ra w7 vu rj ui pj tl ii y1 r8 ac eg yl sj tp y3 py im tg zv ll ip wt av fq qw dc yu ei uf qu tw y9 em tl dq fx hk oq zu jx hb i9 bq iz mv wd qi pz lx ek aw fg ag u4 ir tk of pb az f7 qk wz le qs wy wn dd bj mp yq zb cj rc tm yo +\n o0 pa rd qf dn qg nm ji q6 cm wp ec uu ax r8 us aq se lt g1 bl vz jc mj 6h ul en yw e1 ye tc i0 do ge gn v2 r1 7f ed x8 rf oo t8 s9 u5 pb fc ug ab pt uc ce qz h8 u3 ga fl bc yq iq iw id o6 r2 te +\n da qf qn nm wr jw c2 ig rj vi ys pl ed ii ax y1 ua r9 ia ab tq an ek dl sl jo g8 qv gl hs jf d5 c7 kt ix wy wi lm qq dz ko qe ff pp qt eu wd yx ec p3 rt ty ik p6 pg i6 e3 sa fd dr gb jl as hz qo j9 j0 qs qd wf p7 br wd x5 hh t2 wl el rf tg ar rj tk em ud pn rw av iq nl qv x8 ov wq wb ec vm y0 w2 ew 5k w6 fw a1 +\n a4 a5 z1 hr qk q3 mq zf qc wu q8 bd a3 xf es yn rc et d8 pr or yl fa se dv dn uy vz wu en mb qa tj uq i6 pl du jx f1 xs qs qd vm kd wh kh mv ed rp ra co tg oa u2 ie ha ir da pr cq uv oy qb qb eo ye rz rc ei o6 id if do yc +\n a3 qs w0 po gx xo nh uj e1 lz os wj uv ud tx rr gq ve ch cs xz +\n rs rd qs qd hw dh q1 ql dy mj zz ws vy pj ea mv yf om uf sg up ix pb ab ej tq fr tg i3 nq dn gc wx wc qr wr lv t0 cm wy wu ko qe qr ze ug oa ed ym p5 os uq i5 tp pg s1 ok tb fb vx ns p1 wa qs ka qd lx ps sf zy kj pl ro rs rd wz tf ev gp e8 u3 ir od f5 dh qj cw qk h6 ql ad qb fj tl al zs h2 rl eq rx er w5 eu yz id pu hc te +\n pa pw q0 j4 4f vq iv yu ry fa e4 kw xm wj t3 ff ye w1 oj rv ul ep +\n mw di ec wt rx ko i4 qo l3 iq iw py yl +\n dx uv yv qa a3 ij ps qh cg qc 2n mc ut eq rz ea kc pz sj dl in db fk su qm qe m2 we 1q ke bn xy wb yq qq vr qw xc gf tn re oo qo p8 iv e2 tc e3 e4 fv ff pl sd qy qi si pm ws aa zw bu hu fn yj pv hs gh o2 dy ln v5 qv zb tk bq 4p qj zz wv 8n h1 y9 wm yw og mf u7 tq ov sp +\n iy wt gx nd t5 r0 yl tg dc qc th wt ld nd zn tc ke qu qo qp tk fa hh gn qp 5d qd ar rg oz fh at ag 2a kd nx w2 w5 +\n il wp ee ym tu ef dl el qb cl qn ob qe qr m6 mf xq i2 ud fn pc gw m9 l7 fs eh gi e7 fk ys pe ok 30 mf o8 uc +\n db k5 a7 je kj q3 we wt q6 ie ck kg kn gr lf pj io us id in aq jo qx su hd qm li qq jm we lc wc ld d8 lb xj em rn j4 tq oo eg fl sm he ue so hg ok dt qt px j7 qi nz l9 lj x8 wj na wk ez ex rg e7 u5 h4 kn ad cu oa qd do q4 eq w3 yy sy su r1 ri if yc uc +\n fr ij ft db dn gp qh ph ga gg kl ws wt ab q8 lk wp mi w9 tj pk yf ew us yz id gd y7 dc qx hp qv gl jn q0 d4 qw re qe cn cq pt wu lm dk cz yy qr rq te qi rr ea ex ye dq ok qt sg qa nk wh kt bt bd lh wf yb hu mw el rd rg sb em on qg wq oj zx wv n4 bo qf bf re wb ev yq cl yu w5 ad ag id a1 gc +\n qd ga dt ej kn r5 ax sg ix av am pu g5 ez fe qm nu ii zt wr vm qt jd im rb ml yx yv ru hr gv ad dw x4 ub hx wz rd ol oo rg yf f6 ii uk dl wl yw yu ie id +\n yv ga z3 kk pp nq le lr bp qc t1 c2 hc vt lw jl w9 ur r3 ys iu es rc ud yj r9 pb ot ta sk gj jm gx xg sf lc qr ht ve sl g7 qy nw vw fo ta tb oq fn qu hc qp op nz ow wk zo zq yg wg ke yt kr yy sb tk rk tz iu o1 rr pr qh dl dz p0 n2 ci cd vn ms aa yh ry w6 af du gc +\n q1 q2 mw bz k6 xf ec r4 rx yg ed d8 pv is sj qc q9 zw vf gc cv d0 xx rn ex uj ij ts ff ge i8 zg 4m x5 vh oy yy y5 wc tg at fk ob fv f9 ql bo k4 zn be ww ea ry tv w4 ru ov +\n tu g2 tq od pk tm fi y1 uf ku wn ew +\n hn rd um qg qh ph aa zn bc gv w8 rj ea es ui r7 r8 ey fw gh jf qn nu cc la 3u bx ve po et ei eo ea qp ul i7 uu fb dt pz qt m0 zf l8 kl t1 ej wj oy rf th rk gs sm em ap hg o2 ub wx ka hd br q2 hg y8 2e eq tb an oc it ep +\n tt um gi qh lp kl lw q4 q6 ro b1 if y6 qc th g0 q9 qm j2 we xt xi nd is ng bc ku yw sm ye dw e2 f1 lg qo wp zs gy l4 ul lv w9 br xl ql vf as yg y3 t5 wc ec iy hf ii f6 re hk qz jp oo qx xv v0 f2 vx cd vb yq ew zu yx +\n lo dt mt z3 rg av us pa xq wq qe qt yx y9 ev ry tk hu oe oi r1 x7 wk wz td jy ww qc 15 ba hd mo 72 +\n rs wi vt rh we jl ur tz tw ht y8 fh i3 qb qm b3 qy ep op yn tu ay hw fd ug qp qd x7 rs yy td u1 t9 sm uh dz ql 4t rw kn wn rc eo +\n a4 d3 kk q5 q6 wf wg m4 2b vt w7 ur uo rw pc g2 sl if y8 fj va rr ld wn xo qw rn ml la qu ep re rr qo pd eg og e1 i8 ui qt px i4 jc gq oe jj ws ks qd ul zh sm ql tf go e8 os tk rk ay us u6 dw dh pr qh qj oy lm jo cf ff wm br k1 en og aa rb yj o4 te +\n gb dd rd qd a6 qj wt jx z7 xi q7 kv mv uy pk or yk ek el y5 ez aq dx qx th sy jn pe vl fp xz m8 ng jh kq qr la ei ft p9 oh hj tn ho ud xs wa jq vn il zg p7 fp ic qk wd bu e7 go hd sq ug hh ip sl ch qc px wb hs rq qh bk rl ef yw dj yt u9 st yi uz uc a1 +\n al tt pq um uq un z6 wa vu w8 ed sj r0 tq pu dz qx js 2j na ip vz lm qq qe yj ud ei wf qi te p1 tu il tk iv dy i0 xg sf ix gp fk ai qk lm ql ch fg qv vg yw rl yy rv rm pu uc +\n rd ik qd jd ph gs k0 q3 qz ia q6 af q7 6w o8 tg gi sj ou aq po ja qn q0 qq gc nh xt wr fs m8 qw aq wp ho qu rm uh tr qp tj ay fi ao i8 aa i9 tv gv qu wo lj vv wa jm qa qd uk nl g0 qd dn gw ic kj nn wf wg dy ej rp y3 rs yy e6 wc oz fh eb e0 of hd yf uf ab gw qc ww yc cd ji y7 n0 wn cg u0 rn yp ie a1 dp o8 +\n ih h9 qd xy yl ez g9 lt qm on vg rz dx qa kt p1 ex yx od uz e3 in sd oi qa cq dr me e8 ua ya dk wx bw 4p vx tn o7 pu +\n ij rf fu jt gs ld wu q7 wo 2u bd k8 rg ws gi oe yl if sq hi dn jn qw bb cb wt lm sq vr qe wd qi qo tk uc hp i0 pa w6 fo v4 1m x3 t7 u5 sq ai hg ap hm ju fl tz wv w4 ry tn yl fm gl ox +\n ql db ch wu rl ih qc 25 pb qq ty yw fp ao qy sp p1 qa rf iu rw qg uk gq km dz wv at qb jo eq ur rb ad +\n ra fy gm iz qk qz lf bp kc is nr ws mb es tl d6 up pe ey sj fq ek iv pn sx ly qb jd jn q0 lp m2 xl fs xx rs b8 hu rn ey qo yn vr yq ti ai e1 so ts jz du do oi sa i0 oq ow 3r 1a wg qg r4 yv ty r8 wk wl s7 u4 of e0 gd pm yf h1 qg n1 lt sv qb eu wi mt ez w2 yk su dp +\n rd qf dz aa bo pd pm qw rn tf ah wu +\n dv jd he jt ao ql zg eq pz oe dj fw sc fj nt io fi lr xu ns mx qe qt ei rq qy yw em e1 i8 sp in jv wo ci fa x6 fn ej wv oi um yi oc au yf mt te az yv yi ad yo yz +\n uv hv ty qd nv jh qj q1 ql we fv vj q7 gw fe wl vu w8 vp 6k yd r7 yj ia ey ot g6 dx tf im hu ae qx fh g9 lt fk hs su ov lo m1 cn t9 wi ki qq qw xx aw nw es yb vw yn ry pd ix em so ut oj du f2 lj qp jm w5 xh ny wg 13 wc qc ek el sx oo th uo yo at pv hn uh hj qj zk ql lw zx qv cc wv en yr w3 yy st uy iq ox an ah +\n rs pa df il iz qm k9 bu jz bi ji du lo ts yy xf cv gu mc ii rc up d8 ey pv av to yz y5 fd qx sc qv jv qr xt bk m6 ot md qq qt rq ex p2 yn sb xc fp pj qt ce wp i8 j0 wa qd gn ps qf be qt wh ky l9 za wg rp wn fh rh em vn dh vw ng wz k2 h8 f1 nz zh yz q5 zy e1 yh ad tw ep te +\n db wr a1 pk ew uu r7 d0 pn fe g8 la qq b0 ef os oh pk fm wa wk yi ev ua sq wu n5 tw xc er +\n fr yb qa hm d2 q2 o1 oj ox dm oc km kj r5 px rb et r9 y7 vs pj q0 4s lm gs qe eu ep ti tl of jq od pf nr nb ea ej yy rh u2 iu qh dk zl qv xe 2k vc vb zb xn yg gk ox tw +\n hb dc rd fu gu zd js wu xa c5 a5 w9 vo r5 d0 g3 oy ib i3 ha jm nu rr wy m8 b9 ws qu ru eg uz hw eh hg sp sf do jb zp dp nz wj wv fg ae ah ob hd dd gh dz qz xc s5 vi je n4 re bh ma wm as st tn yl +\n wi w7 om ug qa x4 yn r7 gi re n3 n7 +\n ij pa qd qg uw qm d4 z4 q8 t3 mu yp uf ia pm ez ih qn jm nu kw qr j6 qw bb yu qs rw wf re qi ru jz tm gw lh ce xa wa xs bn nl ys t1 wk r9 gu oc u4 hd ku hp yg rv as yz ro dp +\n qa ss dc gu qk cs cv fv nm z7 lf z8 xs a3 rk r5 ys eg y1 po qv cl jf xq vh we wr qr b3 bv yr wf re qo sv tj ti eg dq ic fx jz du qp vb ws nl wd wj zq vg t2 zf wb tf yu ex yi yp tj en ua ud dr pe qk dl lq qz h7 ol v8 cy vi wv ck el gd q2 yw w1 ye xq w5 gk o6 ob +\n k5 hr jk ju k3 jq q6 zg wi id bb wa gb rf rq g1 et ot pn ht dc ww c7 we c8 cm xo mg w1 1l yx tr p2 oo lm ry ao e2 i9 e4 hi tn di lv cp ca 2u t2 no ub ex rk ys pw qg av py ql qo lb pn eo wb er tb yk ie id r2 tw o8 +\n ra qa qd ph jh d2 dx d4 2z jl q5 ld cm wu wi 2t wa dd lg ui to id in uq ww rr g2 wu rl qe 1l qi qo ec yn ed uw p8 ut sj ig p4 zh xm p8 vs vg x7 ot cu l6 sx gu yp t0 gs az pe nf wl qz nj lr cy wr qv tj s7 u2 ly be br ym w2 af ri it ob +\n pp uv nb bu kz wi ah z3 c6 rg la vi oe ia ot pm dv gk 2h xq kq xg bv qr b9 j2 ec od ay p8 qi wp zd ay kg ea mq 6b qc un fh tl u5 av ub ji zx k2 wc zy 1x kc ah rw vc wv yq zv e2 rp +\n a2 iy sa ft pp un qn qz ol lf mg wo fr vu ya rk w0 pj pl el dz i3 jd su ob c8 pb id b9 ep yn ru tk s3 sh sj xa l3 wa nj ke kr ic xl bd ej rg yo f3 al f5 sw re uh h2 av cq bo vk kf bd mu wq wm ew ue tv ol tb o3 ul ov +\n iy a5 gu q2 se ls dt zf o4 dm ez jj uu ik ue w0 ya ea on ui tu rv y1 et r9 tq y5 ht dc fg i2 vs q0 av iv ku in il en ri p7 uc e2 ut sp fv qt gn f2 wo qa op v7 ws l6 wh ys zq t2 wc y3 sx yi t9 t0 ys of rq ug o2 av kn h5 ju ji ko v0 nz wn kf te dw u8 yt fn r1 ie yc it +\n qj lw ji eq oe g7 jf jc yr qo v7 p7 wd ma xg wz qb u7 w3 +\n un ol eh g5 px b8 rr og gn mx yf wv sl on jo uz +\n qg qm q5 wy eg ri bm mz d5 rx pt ek fs pi td ez ho gh q0 ll pl kq wr d0 l1 qq ko er qt wf ei p2 ru uq ye tx s4 hc zd vn ps ix zo wk t4 y3 xh ez rf u3 up ys ou xx zv qa wb at rm eu qj wv za zs eq zy rv ry tn tq yc ob +\n ss qa pp rd jf a7 lp h8 um kc q7 wl rg r3 w0 wy tl a0 ih ly qm qq m1 xg qr up ja b8 yh dc lx rw ep ea ev ay ux to p7 tp tb i3 qu gq do gr za l8 rj og oy ub e5 ae tg t0 sq tx hj ad gs it vc bh yb eb w2 yg u9 w5 fn iw si di ah hc +\n ub o0 ik ps qd q1 ga lp cf kl m3 z7 q8 ue ee ud ix g5 ib gd aq fh th pa qc pg ue ur xw ww qr vj m5 jd ng in tx ff xc er qs eo qi p2 ky pd eg e1 yr ut ib oj tb hi hk ho gm qu qi hc ou gn wg sn wh ix wj wj wg ot ra wl un e5 rg s7 t0 oc sm tz hf fx pw x0 wz th qv 1z zt n4 qb cl wn xq xr y8 rt y9 rz tb iw vb +\n qn lq bu eg iw wi 2u 3q t6 k0 yd sd ed rb eh ek yz if pu y6 in fr qc qm ob il ma b4 en wu dk nh b8 qe bb mj ws qt ho yl ug qi ea tw uh p5 eg tl yr i9 pl lh ce i7 wp qa xs dn 7p kr p7 eo vs mb pk ni yh ef rp wj ej y2 iq y6 u5 em e0 ii md jy lw nj fh bq pc xm km q2 wv k1 rx u7 ut et gj tb iw gx fw yx +\n qa pw k6 qn qg qh as u0 dy q7 wp hv 4z 4c w0 d7 et aw wr bl mx md j6 an wi qt lc yx ec tj ri fx ht in gm ua qo qa ik ys eq n7 wh rs wz wx e7 eb ak gg ip sj py ka rl su ag +\n gb uz q2 qz wr q4 z7 ia ad je am my vi zc mx ym r7 yk ua pt g6 hy y7 sx ih qx pa hp jd sy gk nh no qq yg rc 3s qy ep p2 yb oa tr eb p5 en ic yr dw tc in hk qt zp i8 lz ks ci lg x3 wd xa x5 zf yt y5 op u1 oa iw fh oc rk ay pb pw uh qg zj qh h5 nf cd nv qx kp qs qb 6q cl kh xe u7 ew tv sr as rt o4 ey tn is +\n hv qj bo ru z9 t3 lj q9 rg vi rj sd r8 g2 sj yl aq fe po pa qv jf dm qq re we la wt wu qq vt gj ei yz rr xk uk pf so pk im zu ua sg j8 sk zd sd xz zw kl wk ol um yi rh sv u5 pb tz dl oi wz h7 s8 qf wn cx f4 mo wb ed oh ee er ry eu ei oc fw +\n hn a7 cv q6 cj q8 fs jv rl qq qi od dt l5 co qr zq ex u2 ah on pr wx kp wb yh gx +\n gv qg je zg jc q8 fr r6 yn ii g1 pe sj ta el jo sr jv ni jj zr bj ns qr qi ur hz vu wh cs ep s3 hu ez rh u2 t0 dw uj oi wx n5 18 bf wb yq oh ov +\n gb dc um jr mn we bl t6 vi pj c4 d7 rb ia yz tf qn dm ke xb ft au ix tv xd qq xg rx x6 vg r8 wz op h3 qj qx lr xv qc kc wp lq ea rn rm ri eo yx +\n ra gt qs dv ik gn co qg qm qj cb qz z6 wt ji q6 dy qc b4 ws ds vu cf on yg d8 eh py hu tg qc hp qn d3 wq c9 pv pr or qq ml eo ug tw es il os fi uw to em ic oj ho px wo qp m0 qa 1o ks 7o cp wh wk wg x5 ee yn bi ef wj ns r0 ez um u1 iw eb ir fk ov s0 fl hn h1 pr x0 ux cd wz aq jp im k4 qv bp wm n0 vm u7 w4 gj tm uz te a1 +\n gv il ps db he nb wr ql kc zh tf mp lw ab us pn a0 tg pa th ps hf wc 1a yw l1 fs eq wp qr rw yv tr eh so i0 qf wf l7 wg na ou ah ay f4 io ip f8 cd h7 nj rn wb qb qn wp oj w3 w6 di id pu eo +\n hm fu pd qk bi wf q6 wu b2 q7 q8 oc lj c3 o7 6s a1 jh rg rj 2s z7 ya id ez fr gh vl cl zq hd jh xh ru c0 bz wu dl qw km kp b9 rn eu yc yc p4 ru tk ux fo ue p9 iv tv s5 do l4 cu rg w6 os fi 4b uz l7 ld l8 fx jb ee wx rp ek tg e8 uf de qh hz h4 qj gq nb wx qc sv go wm zi zo tc 3k ez ec rz ye oh ck w2 sy ia gk rm ei si dp +\n gi go z5 qz wj mg kl yh g5 y6 g9 xt p6 eh ap sa qu dw j8 ql yg aw t7 ir zj v5 v7 ba tw yq cz gc +\n ps qn z3 sw gs q4 ie gx ye wz r3 us ef d9 pb y6 tg y8 qb gc ww az c8 cb lv wy a9 qq qw l2 c8 qu uf yx qo ic de ut e4 uu tb fn oe dp wa uj bq sg mx lv v3 ya xk wd by n7 ra cp gu va yo u2 sv rk ir ya hf kc kp bo qb gp qb yc ku q3 dj o3 ey ad si o7 tw ge uc +\n dx yv ij pw a8 qm ph k9 dz q1 q3 cn wo wp my el bb uo on eh id yz am fe hy sw ha m8 vg wt vl wm qq w3 ls gj yx eo ef en ta e3 i3 zu hl m0 wd co zy l9 nn ea yj e5 rg gi fg gp u4 ir tl tz pm dd kc p9 zx sx qc qv kf ln on qm lw vn vm ew yg se as is di ro gc +\n al tt gu qf qj xo q8 c4 ws e5 ur vp ea rz g3 fw sx th db kq wt sv tb ad hv 1u gt ss xk wj qj pk rp e7 ha fk f6 dr rr hk dk nf qo lr ka ie fk cz yz q3 ym ks gl +\n gb q1 qk we q3 q4 t1 ox di ny wa ws gi ea rx yg r6 io ow y1 d8 ey ab g3 is ek pu ez dx qx th i3 jv fk io xh wt oe kr nd md pb vz wi ro se b9 tr yb p4 i5 p7 ux fp p8 sp in ok hj qy hz wa qq zd qd 3t wj aa dy 5u el yi uo go t0 u5 tl dq gd rw uf gg kb ux dj qj go wb zm lu tx vc es ev ry zt w2 tp w5 tn o6 +\n ra ps hm qf qg 4q we ql q4 z6 d1 wp vt xs tg 2s e7 r3 ys oq ef c4 av dj pn aw sr th hf gx uy wr ac zv m6 wn ko c5 qt qy yl yc uh od ri uq fz dq i7 tx fc aa uu qt oe i5 ge ce wa gb vn xg wh og ya xk fs ea yf zw wh ub 8x th iw rj ah ya e9 tl yd tx yf ii fc kx hl zj or qj mh ww kf zm lb ob qn wp ww wn ym u7 rv ie pu +\n uj by wo ml dl qx m3 8i 2y r1 u4 hj h6 qa xv rn rm +\n qa gm qh ql u9 ls e3 yk fa ts wr vj ac en id ud ke ye i7 fn tn f1 ks at me l8 kl hk lx rp ek l6 ek oi e6 wc u4 2h pn 9y zq qk ec cf yq oj vz tb o4 iw ox gx te +\n gt ub hn qd qf hq dh q1 lp qk by ql lq we wr sy wy lh z0 ge k9 w8 th vp pz yg ti fo tp r0 g4 yz ig sx im i1 jv qn q0 wq nu 5t pw wm id qe gg qt xg wh en uc tz pj e4 tv i0 ff qt gm dp jb qp cr gr qa nk ws os wf ne wd mm wf t1 vu wz t8 e7 t0 od hs dq df av km v5 kl we fg cx al ax yq y9 rx yh ul hc +\n we cf q4 cj bf ws ww yd tk ef ek y8 qv fk wt ko qe ep rt ik ut op mr j0 ej t3 s8 ir pt qk km ww cg wc gi lu n6 yr rc oc +\n ak ft gy rd hn a6 uq q2 q4 lr ia eg d1 eb on sj dj pn pp qv i4 hs gx ww xj m8 ko im rt fi tc uy tb pl qy pc uf kf kt mv l0 qj x7 oi um tf ap uk wl ql zb vj wv tk re y7 de q4 rc ad rm ul is fq yx r2 +\n dx gb he dl k9 z3 qk lf ad ch js o5 vq zl rj wr th r4 tu uo r8 fp ic g4 fs g6 im fr wq bg no wt dg ru ln rp wi yd qq xz ew i1 kq qt rq wg sb pj hk qu vx oi jm pa vi x5 wf ni ro ot oy di un y6 yo rh sb us tz ac f8 av ve h5 ji mj n2 ci rm yx ep rt 5f yq u9 rb hx aj +\n ih a3 pi mt do w7 zc nh qe wv rs xc qr ts ut pj im hp xa lv x3 ph tt sc od rr qh km oc rq xl vv jp ef st tw +\n ft ik a7 lp jz jx k4 hz wo bv q9 6t ur rl qx qv js dm fw wd re ea fd hu jc qu zo p3 lx pf wk vf fj 2o wx sb gs it ol yp di eo ro +\n tr ih yv h9 k5 qj qk nb wy gk q8 c6 mj a5 yi ur rl uy eq up yj r8 xs sh a0 ez oi y8 ly lp lx fu il ke zy cj sk xq 7u ey p2 uh yv qp rt y9 eg pf so ph tx tc uy e4 tn j0 gy ik vm ul mt nm mm x6 wj rp eh sb u4 ov of tc jt pt qj jy k1 s5 qs 7z do zi cx wq wb ma wm uw sr w5 o3 o5 su r1 yx fe +\n h9 gm cp z2 fb zd gk ve o7 mt bc wp bd rg w8 rk kx mv uu rb or yk eh r0 y5 ht pu tf se ar fj hp su m2 cb c9 c0 b3 ns qq qw rv gg ij y9 oa od of pg i7 hk do pm 2n sj wa vm zw vg yy om qx nj v9 f3 ee w5 w6 iw sp ep +\n da jq iz z1 ls z5 cg nt zk 1i gt w7 yi r3 xi yn pc fa ta ez in i2 qc uw si qw d5 kw il b4 fa ib 6c ud rq yl wg tr qp p4 ry sm ut s5 hi qi do j7 jn j0 qs iz p7 wg aq ex go ax ku nc h8 n3 v0 oc ah wm li zp rl h5 is eu o6 +\n gr sa a4 ik dm gp q1 wy m5 fw a2 t6 rj mx e9 et ej q0 ot wu em fa mj qe yg gh j2 te tj p5 eg tk em ao i7 di lh ce m9 wa wf ys eq l1 t3 ej el tf t9 rk u4 ay rw gg dr hj ac qg zk h6 dz ok zy kc mr fz iu hk yj oz ey ag id r2 ov +\n ds fu ps vo qf qn pf a8 ph q4 cb le cn h0 jg gy b9 rk r3 pj yd oe ht pu ig ez hu q0 qm nu ww qw ow xh b4 is a0 qq hu bb cn xh oo qo y0 fz ue e2 yr fa pj in sa hj ui sp nj zg wj ge wk xg ra ex vs oz eb pv tl iu x0 ln cq xx iq s7 wv qs zn tl wn lr yr r2 +\n az qf fi qn u5 we jq zh wh c4 sd is y5 po oq ki sz qe rm qy yv p4 ye tb ho 1u gq r3 pl td ov u4 hg ax zj wz wb vl vv se 5k eo +\n tt gi pd jk lq q6 wi gx mj ut ax av g7 qv zm lo 5y dh cw xo ve vy xg yv iv i0 qq xg jv l2 yi sc ga pv pn iu ug gy k3 cl oj tv yl di +\n qk se pd gt rz uu d6 io d7 tq gf em ym tu ib oe v3 si wa nm wf qf wg rk kz yd hl wx cy bp mx et +\n uv yb dd k9 ph q4 me o6 nr xa mu ld r5 rb g2 or fe pa fj hp db lu qn nr j2 bk kt xl rn wf qp tl uc dq i7 tx fv ar sf xm mx x1 zw yh lz mr t6 l9 s8 ah u6 x7 yw ol tq eo gc pi +\n ia ys jh wy sb i0 cp u3 ql kl kh +\n po al qg qm d2 gs q2 ap qz q4 q7 kv ah o8 rs 2o ex zx qw z5 r4 r8 y1 is ts y8 qc dm ll we wr sg lb jx wu jv qe ee qt qy es ed ym hw to tx hr s2 oh dt dy af di do qo oo qa w5 uz wh kh x1 t1 hk no r7 rp na sl ej op ev tj eb sb ya pb u5 tx ds o1 hz v6 lw jp k4 wv do wn aj bc wn yw to w4 as ey yk is ig rp o8 +\n rs ty q1 wt wy xp e3 wa yd d7 ht ts sz fk su kw xg bw cw qw oo fu od ix sd zu jn qd ci fi xh mo cp ev th ua e0 em kc lm cu u3 n8 xr yq ti yj fm yx tw +\n dx z2 ga kb yo sf sk fd gf i2 vs qw vj vw qe eu mz tu sp xs qs es t0 eb ak uh hl n1 v9 wv kd o8 rp +\n ds qn qj qz cb kz bo wi o6 z9 fq wq ml cv cb lf eq r6 r8 ic y4 am sz sx po jp g8 ze we wu en ew qw 3q lz kw tt ty ti e1 fx ut tc uu s6 ow gm sh qp vn l4 uj op xn wh qk wz rc wh uv um ar e7 uf az uh py h5 lq vt nz lu li lm dd rl er rt yu o4 eu yz if +\n iz ld me z1 y2 dj ar qb b4 l1 mz ij ry to ad xs sd wf eo hj wl ex ie u5 pr zj gt oi wc kg my ex zt ks yg eu aj +\n gr iy ft pq um qj dz wt gj cn ru kx q8 ws ue rk eb ee fo jb jf la ji ke qq qi qw rq yb qp il eb y0 iv ff zp l3 xm fi x4 r5 xd r0 ol wc t8 ae iw ox fk of pb qj ku xc ct wc ie xn zi wm rz w2 tb u0 su pi +\n a3 ss je un zf vq zg wo mx d7 pm gd vn eu yk tq ik fu ai qt qf j0 to yy at ii qk wz lw n7 ly +\n ub dz rv qt rm wg ea pc j9 qa mr h8 +\n a4 wp td ur px qq ki yx go wc tm an +\n po gn rf a5 uw qn q1 nn we is z8 wj ca t5 ij eb tz ef pr ix g3 ek ta a0 y6 sq pa wq cx kq qw we rt c0 mz pv py wi cw mj qt qu 0e oa tj ux pf to hr ao tx yr ts fd fv s5 ui qu j7 gw ug ss cy ks qf xm fk wg vp kt mv qj mn lk vh yt ol rf th os e8 tj ua rk on pq dg kv km wq kp ad bp os bw pb qh wp zs q6 u0 gj yu o5 if a1 +\n a6 he pu vd cd q4 jz z6 qc jc bz eh wi b1 ed ym eg fo us ib td y8 gj zm pk lc qr wu mh qw sw fi ue j0 xm kz y2 ev aj df h3 qk qc tx rr rl rc ut ad so ro tw +\n a2 pa we kk eg q7 lh zj wp 4z gi yd yg rc io ix r9 jb xe rr iz jd ij tz p9 qi l4 pa g9 s4 vi tj pb hd f4 qh qk lq qs hn ro +\n gn k9 qz aw wu ki yf e2 pk v8 xk wg 5y t3 sl u4 ya gd hn ql zr oj ig +\n fr qn qh ph k0 q2 nq wi zz rh rx ee ef uo d7 ix el fh qv dm vg px wi m8 qq gh ud qy ec fu yw uw sa tb lg us sk wf 5h qf sh vp wk qk zw qz wg aq of ys ak al f5 re f8 pr ku qx wc u1 lr qs wb f4 cw k2 ka hk mf yr w3 ro ir +\n gr qh ql wh kv e4 r4 oy lu qw pb et uj tb tn xs kr dt td t8 e8 uc xn eq yi af +\n q5 dt ed y1 am qv ut gx m7 yt rr yq yr dy sh mt wd wm th bv ym +\n tr qs ca lp uv q3 wu o5 c1 rx om ee er ta ou i1 jb rt ry os ti fc ss px jn gy jz vp ea tg ay rq u6 al de qc zt wn ez rz eq aa rm ox +\n uv ds h9 fy rf jq he qh h8 d4 wr wf du ck wi km yp ut rv io g1 rb av y4 tw a0 hy sz qx gh ha q9 qw ze 1a bz bx bv qw po ee wa qi xk ri i6 ic he tm hl sj jb qp wp jk qr kf sm l8 be x3 qu ql t1 x6 yy fg rj ua ug qg kv k1 wl v7 xx bj ae wc n3 zy tl tz zk wq re n0 yw oh yr oz eu fm do ux uc +\n hb pa h0 pg q3 mw q6 mg ls lh am sc gz al j2 wt t9 lm qe j2 rm re rr ry fl yw ux i0 2e eo bt vh ra ys sm pb on tx re ff wn wv tu rt ox ul ge +\n al fw zb p6 hi qy ay ou rg sx ag rz uy +\n bx wi kv t5 3w e7 sh ht ff nu la xo qi s3 uy jb 1o vm vi l6 be x3 ny pk aw u1 rk fx km qc be rw yn ey eo ro +\n dn q3 jf w0 e0 lh rv zv js j2 xg ld hr qe mk s3 dr kw kc dh h2 ql cg zv n3 ym yt aa as +\n ft ty qh pi d3 qz ip wu wi q8 wj a1 mg mj ut wt r3 om ua y3 ou fd dc zw lp xe cn dh ng qe kp qt mz xy ef ay od tz p8 i0 hu hz qo kw jw qf kf 3y v3 qj w0 ib ew t4 fg oc e9 ua ov hs u6 f9 h6 vj qv li wq iu yv xv rc w6 rm r2 +\n d2 d4 av jc si rs ut 5q pa mm s4 e5 tc km +\n qa uk uw qh vd d3 q4 xo wo c3 wl wa w7 w9 mc r4 y2 fp r0 tw fr g8 ae qn lp sd bk en vr gd hu j1 xv xg rw ep wh ed fu ul eb fl fz i7 ht jx ns v3 ll zs j0 op xf qf l6 l7 sn wk zw wg ej ti wb wz t6 oz rh rj uf je av dj h6 ql wl oi im v8 zr qv wn ku wb bj ef o4 yl r1 ei so if uc +\n k7 qg q5 kx oz mu wl ws rh b2 rk yh qn qe 6o 1y mj ei pf ye e1 dw hj hx do qo gc rh v2 zw x5 t1 t3 yu th e9 em au qh f0 qk km ql kp wc 5p vx bg ea ev wn wm w2 rx o3 yk ru +\n a2 gr qa az dd gm d1 k9 hr we bz lg mg ny wp xd mp yo pj uy xs ua pt g4 tw ez jv q9 qn wr nd md nf qq ng pi bb j2 eu yl ij ty sb os eh hw i6 hg m9 nj wa qs w5 qf nz zh hw wh be zo fs rz me yk y3 ub t7 t8 u2 u3 en ha fl yd hf qh qk wc 1x ze w1 oj ee w3 ey du uz id ah pi +\n o0 hn qz q5 du 2b bn a4 ex rj y1 dj yz y5 ig tf th js qv 5e gc j3 ls d8 yw bc cz tx mb wf ij ty ai as hi lh l3 qd n1 7o wf wh qh wg ot ra l6 el e5 s8 dg vm 3f 7o wn yw gj tb et +\n fu a5 cp ch hx hc rd eh tg g4 li sw sf il eg eb zj 2o cg ew uc +\n qs uc rp ml eb yd if pa c7 oq vk wu ot yq rl uz tv gb zu vm w0 sc tf ud qk wm ko yy er tw +\n ak tt ub pa pq il jq q1 hr k0 uv ql q3 kk zs q5 z8 is lh q8 w7 qw es ii av yz dl ht td g6 vs jm zr px bj no g2 g7 la c7 xt mz yx tt ym os to s1 ur ta s3 gv pl qy pc qi sh jv j8 gr l3 bi oa wd fy v1 s1 zp hg 5e t1 rp wj ms wl t5 el wm at fl e0 sq h3 dl qz ka ox tj qb wb wq re xr rx em ee yu ri do uc a1 rp +\n uv rs un qs um il ul q2 jy kl wo a1 rj tj pk ys r5 yn uo oe y4 ou y5 ar zb g0 qn gx zt lb 2v rm qy nw yz lm eg og i7 ht ss qy qi ge wf bw lv lb wh cs wk hf 7g yb zw hk ns ol rh th yo f4 rq dt uj qo fd wx nk rv ka fl mu rr q3 w2 oj ee rt w6 ru ul +\n qs hq qf qn d1 k0 q2 kk o5 na si bv mx e9 tz d8 tq dl ez qv jf zw ww wu xo b8 w3 i2 te p3 ry iz s1 ut as s5 hk wo wa l6 wh bq xk wj wd ra gu yi u1 t0 ak ai tc ax ip uj nf zb wv bd wo fz qm qj pe md ew rv gj ol yk tn iq yl is si ie r2 +\n d3 ni wr ws li mj ds sh sl qx vs rp ft ik e1 sd af ho xn wg zh 6b rp eb f3 u5 uf df py k1 wz vk vx k2 dg wm er rv rb +\n gv iz qz wo o7 k0 oq ti r9 us ib ps g0 jm jb tq ue iv pj sa cr kh t1 ot wc at e9 ys o2 ab qj ww za rn yi +\n ty qn qh nt ql la q3 kl wt q5 mp mg o9 ls lh g2 id ez sw hu qb cx nu pl kw wt vz v2 1t wi mh qr eu rm qs xb ei ij uj yb sn ai iv pj oj de hy gv ka lz pa nx wg wj kj cw zp wk eq wj t5 ns rf e6 rh ev t9 eb ir e0 sm gs gd ds f5 dd de fc f8 x0 lm qz wz xc wc kx cu wv ks lv kv wn pv ei wm ju ww yv zy yt e2 rb w6 oc o6 tq ig +\n q2 o2 gj q6 zh mg li mo vo ch tl ax ip ho wt ln ro wo qr tr tt os fo e1 de hg gb sk w5 fp kg mm l6 yi u3 fl hs u6 fx re rr dl wb jr el rw pm rt to rx w4 gx +\n yv a3 qa uz k9 q2 o2 bp ny zl mj vo tk rx ui g5 pu qx nr xt ls lm rv qs yv ik fz tv wp nk gn qh qi yf ek e5 pb au tc ac kc br qz 4t qc mx ly wm kb ez w2 u8 ei o8 +\n rf vo q1 o2 wt q5 oc 5l a2 es oe sc cx wq qw ky em tx rm p2 qo ft ed uq fs i9 ok lz v3 au xj v4 wf l3 eg ej ex wl rv qv ak mi hm cj yr w4 si +\n a2 tr qa fy qd qh oh kk lq dy bz oc jf wa k0 ip pm po qx wq cx we wr bj j5 yq qe gg rq rr oo ru od ix qt af or sj qo jn gr sk wd nc xo xl wk hh yf eh ek aq ex ar en tl ys rq pm ug ql qz wb wn yw og xw an if it +\n ak kk wu ig df w0 rb y4 fr gg i2 qb qw yf j1 ij ue s2 qt ad i5 yp ai l9 wk km ql zn yb ee rb ir te +\n hb q2 ld wt q7 qm km ws w7 vi iu yf rc g1 pr ot a9 pn dk ib qx hi qc jd jg hd q0 lo jj cn wb mz ec qp uj y9 tu yq au tp hg pl jx vx j7 wd 3y ca au rq kv qg dh k2 ok cf qa wv bp dw iu de k2 rt hj wm rc er o3 ey fn si if so +\n hq q1 qj d3 ws as ld mu rj ut d8 ey ou ib ez gf y7 qx qn vz qm vd zw ww d8 xu v1 av b6 mg gs bb g8 rm qy yv rr ry oa tb dt jb qa j0 qs l5 nz qg wj t4 td t6 eb ua s0 pn ii ac x9 qj k4 wc v9 s7 cj zy wo 10 hn yq vz u0 fm uz ux +\n ra pp qd d2 vg wj qn rh we ht st jm bv wu wi qy y9 de gw wa sb uz r1 qu pz ot td rg go e8 sn iy zr wc s0 ww ea pw ac w1 h4 w6 rp +\n fr uv pa jt qk q4 ls wu wi mt xa vu tk ed rb pe fp am sr hp qv m1 gc en yw qq qt ud ey eo p3 tj tu en ix ux ye tp ic s3 ad hz qi uf qa kr wh vd lk yn 5t u1 t0 od rr x9 f0 zj kn nk wp zs se rv ei pi +\n yb dc qs py qk nb jj ql q5 m3 mg zz e5 i1 zr lc zx xu vq hr xp by ei yx gl qi qp ij eg ai ph ap tn dy zp qp bp kf j5 ib vd eg el yy td yo ie ag em fc kx zx h8 wv sv q1 te wv vm yq ol if a1 +\n ak rd rf qg lo nq xy z6 q6 mw c1 cu z8 q7 vw wp a2 zz w8 yo uu ee yn r8 av yz y6 pp uq dv i3 db jv q9 2l xg rp ib lj sq tx tc mj mk qr rw te p3 ik eg pj e3 i9 im tb tn fm na j7 lj wa ct rg v4 he x3 kl bi r7 wj y1 l6 wk el 9f t6 gu tj od e9 tz re uh o2 zk ki cf lw jp sc s6 qs qb yn yw ms md w3 rv as yi ox du yz ir yc dp hc +\n yv gy ik k5 db gm ux qj gc w8 ea g6 dx po jb 5t pv wi rz qp jv v1 ea en al ii dt qj py w4 if ux +\n iy pd yg qq p4 in qa y1 yy ta fb zk s6 lu +\n ql ws rv yj jk ke lm ff lb fx s4 av uv wl n1 rv dp +\n qh d3 rs ih rc aq we 7y ud t3 h2 zt cu oc +\n fr hn k6 je q3 k4 tm zh lj aj li a4 t7 w7 kx ut pl rc ih th hp wq pl ls ma oe lf wu l1 ve lp qt qy fi ti he oh hi ow tm cu p7 nr va r3 tt wk wc s8 s0 hs al o2 hk x0 qj lm v5 wl qz 7u iw os lu ah wm hk e1 o4 rm fq ro so +\n gr sa rd um pf ca ga ql qz wt ld z6 vw kv my xt cn wr eq tk rw fe qx qc qr qr rk qa qi ex p3 p5 dq ff pc sh cy oq v4 wg s7 yo ya od rq dt un bw zm da bg q5 ru ah +\n iy qd k6 dm oj qz zd vr w0 r7 d8 et y1 eg yj gz qq p3 il i8 ge wp sx s1 wj t4 lm jo qp pw xc vm sr uz ig +\n qf u8 iq rg rk g4 im ih oq fp a0 ib tc uj tn nc kz ll u1 un qv ck lv vv +\n a4 df um jg z2 lq wr tn xu id wo ez rk rz ew d5 ti ix to r0 sk fa fe fr hp jk wr v1 ms wu jm rc qt tr ex uk vr to tz ut hl sg hb qd xn rj jc 6x mo wz rp ek y4 oi oo ae sc e9 od pn hg wz js qv ln ju rx yg as rn gk o7 so it +\n dd qs qd py k9 lw wt db gk zf nw wh t2 nf zx w8 rj ue w0 tl ew r6 ui ef g1 or ej pn an tq ou ff qv gj jv q0 kq 2l uo oe ku wi w1 tx qe rv 1l ws eu lv p4 ru fo tz ph ib fv uu i3 qu oe pc gw wp sx zd kw w6 bo w9 cs cw my qz zf rg fh e8 ay yd fz rw fc ng qz cg wx qp oz qv ly ha cx al iu rt mp e1 ee w4 tn ul ru o6 ag aj +\n qa kv e5 bm yj j4 m5 rj qe ri ht oi qf qe t6 e5 aw t8 wc dw un yb +\n iy jg jj d4 ju ol wy bs wk wq t8 a9 y4 ta dx jp qc q9 su si ut q0 m8 qq 4a zy qq zq sw po qe qt la sn p6 ht oj hy hh qi gc bn w7 au ya kz na oa ox ov je fb or wl qx ze cg we fk tz tv cg uq w6 +\n dx sa qa qs db go lo z3 lf ox jc wj 93 tj tk yf ii ef fo ua sk g5 fs el oi fr sx fg se q9 xq qw j3 m6 4h qq l2 eu rq qu qi hs uh p6 ix fx qa i0 wf ke bq ne wh xl ms un ex sx yi ua pb s0 rq ak ao fc pr qj cw wq vy wv u2 3h wq re yw eb gl eu +\n hv gv il jd go qh d3 we q4 q5 ej lk my gv a2 ds ex e7 rk yf fq pu ff qx ho js gx j1 qe kw gm ja ns wy ln d0 cz xt te xu tt sb em ix ic p0 i8 im ui di gt ws os r1 qy pz l6 e5 e6 op sb pv sn ii rr v6 ql le zy pv mt da yq ol w6 yz ag it +\n ds gy dg jf qg uw qj uv q5 q8 q8 q0 qm e5 rk yd tz pv if qn ju cv xy ki qw mj ls yv ru of tz so yr oq qi m9 sc kw qf zh jx wh kg l0 t1 pz un fj os ha sn f3 e0 om ab cw ct nj zy wn fl ww vn fn tn ie ov +\n co qh jr jj cb bi wt q6 ra qm zx ur r5 an fw tg jm re j5 vl em sl xz qe wa 45 nq ex yb ed ef ph e4 tb s6 qy lz cu gm pd gq mc ca 85 yf wf hu sb eb fk fv dt cq lq qz ww wv xr n0 eq ok er et iw r2 o7 fe it +\n ra dx og wd wt o9 i4 it pk qo ic dt hj jl oq sf lz wd ca hi fg f5 ap x9 gq nd iy q6 ep +\n o9 gb a5 z5 q6 wu w0 tl r9 dj if ts ig it zq ll qw qy ep ed ry p5 ut hh dr i0 hl qp qa zs wd ya ot xk s7 e9 om io dl ki k2 wv q1 5g er rb rm +\n qs w0 om ed tk ta th gf ii av og 6o ee o8 +\n po ty rf qf he qc hz bv c5 mi rh ew tu ef sh ix r0 d0 pb tq fw ig g8 fh i2 uw hf qw qr sf cn wi fh qt hp nq yv fy tj od ux ut fb hu tn qt oi qs oa xm dm fa nm qx yy oo ec ev ox sb ya rk ys ud jy dz zv qc zb qb 17 tb lt yt u9 w4 rb st et ry yl o5 di ux +\n gb gt az uk gm qh d3 bt qz wd ld o3 bl cm q7 ck k7 we b2 yd ua ew tl rq yg us tq js fk jb gz jn jg qq in qr rq qy 3h c0 qp p3 yn ef sb ym jl sf sh hv qd p4 fj od ix kz ni wj wz tg t0 tj e0 sm om kx ku cw nb zc aw cy qv bq kg wq pn zz wv cd wn yr se o6 pu eo gc +\n gy rf qf k6 qh qj cd q3 kk cj fw b4 fr mj w7 bm wr ya z7 wt w0 r8 ip ti is pn am y5 qb hs jf qw uu wr np qt wi 1t bx qq qw aw er cv qy rw eo oa iz fp iv qi jm nk kr qf xm eo nr w0 qj bi t3 uv wk ek wn ex e5 rf rh ga it f5 pm hm f8 qj gy jp le wc qc lt s9 zu lb q1 ju w1 uw w3 oj tn tq ir r2 te +\n ak gn pw a5 qh k9 qk nb 2l qz wr kv mt gt w7 zx ii oe ug ix sz qx qc ar sr zb su vg qe np yg qt yj sv uk pd uq pf of eh jb sk gy ws ke kd be og kh x6 me wz e6 yo iw ah rw pm rr qg pt lm ql qz wz qs ly wb wn q3 ry rx gj ia o5 ge +\n gy qm d3 q3 ia c1 ta ex e5 e8 eg sy cl jf qe nj nh m9 qa w6 ek iw kv qg ab n4 w5 iq do +\n uv gv qa un az jd qm eg iw nr q8 zj ny c5 vu rl rx yn et ia ua is ot pt hu im gj qv vv xe xu 1g wo vt qt st qy rw qi wh ft es uk hw to p8 fn f1 hp qu sk p2 l4 zf qf g0 fi l7 be ky iv mn xp nn dt 6b ro kw uv ra tp e6 sv s8 sn tl fz iy qh hz ve v8 h8 th wc wy qb xm s9 hs wq zs yq tu en zt w4 dp yc +\n sa ak gi hw qm gp pp qz fm id lh 6w 9h xr w7 ui ow rb oe ia us fq g5 y5 ig oi y6 im gk ze qe gn 3o ye xz jh qe db qi p1 ep re op te y9 os pj e3 p0 zp qa ih l4 cu zg wg sn rh lf fz ic kh ni wh vh wx th ag u3 f6 uj jy k3 2a wc kv lu wo hb eq w1 rb xw yo ei o7 gx +\n hw wd r0 g4 sz b7 pi sn tc in qt zs rg eu +\n iy hv hb hq qf z3 q2 xy ia tm zf jw wq a3 rk w0 d6 eg et is id po tg gh ob jj wr np no wt ja wy xl l2 yr bt bb tc cx qr rn qt lc rw sy ex y0 ru od to tz og ye hr pj de tv e4 qt ad oo qa jq fj l7 fo wh nt pl ro wl vp yy tf va e6 fg th ar s7 os at s8 re df pe hj f0 qx qc x7 lu nc zo tx bf ww pq cg w1 rx id pu it fe +\n qf fi ld 4o ge da t5 zz mo zx vi ui w9 pj rl rz r4 uy r5 sf av ot fq tw sc zv g9 qv i4 ut iy m1 wy xo b0 ud cb qy rq ug wg sn fo ix uc aa i9 ss sd di sh j8 qp xa ep w0 7h wl t7 iw tj ya hs e0 fz hd u6 hh dr dh uk qj qk wx ol xb qv wb s8 15 wy zm jr nx it eo fx ww yv zy to ee yu yi iq ey iw rm uz yz ob +\n po ra ik qd qf je jr lp wr ji ne wu 2b nt wa e7 rx xo ia yl ta ig ff hp gk jf q9 vd si gc qe rk wu by yg rq sb os fu eh em ux ic ao pj hy im du qy cr 2e l5 qw v1 lf mv wk rx dy rp ra rg gi eb hs au ap bo oa sn zi f6 h1 zt ey yz do +\n lj vu y2 if qr wr ta so kg 3k ol u1 f5 +\n yb cv mq lf zz ue ui dx qe tv qu ex tz hh tb dy ds wi rb +\n hb gt qa h9 rf qf qg k9 q1 lo q3 ql z8 gl zg q8 1t wo vr rg ez ws mo w9 yo r3 yd e9 ea sf a0 im tg y8 ar qb ni wr qr wv m4 ix d9 nz yq fa if yr bt qr mz qi ea rr xx at ic pk qi za hv kq w7 co xj wd x4 zs wh y3 rf ec u2 e9 ah s0 uh io un h8 iq zb bs nr be zo fz vb wm pr yw md rc ur er ia yl ox ei ux eo tw o8 +\n qs rd rh yf px ow d8 tq ig ih cl qr yw qq in qy wc ek rh ya qg cd x9 qm lq to o3 ul a1 +\n a2 cp as gk kc 4u zj z2 t5 zz rb eh sh sx fg fh g9 hp vd gx oq cv pe wv b8 qe cc nw tr il tl e3 qu l4 mt wk wh aq td e9 gf lm qz bu jq my wp vb dg y0 ye yq w6 r1 +\n ij az qn ph qv bv bf mz iu is y8 ar fh q9 hd qq ji sf ld up qo p2 at sp in qi nk l5 e0 rw px 5o ew oc te +\n qd jr pa q5 w9 hw hu y8 dn qn zw wr ma ei xl dq i7 i9 vb sx wf wh na wl um e7 s0 h2 nh nk fj yl wn iu u7 as ad ey so uc +\n la up ic g5 ay ic x8 u2 ar eb wb yr aj +\n po da rd un qg uw lq m2 4r wg q8 z9 t3 zc d9 ae st q0 li qw wt kr qu ry en sm qf kf kh ny yt gi rh u5 em tc kv h8 qx lr jq ef +\n a2 dh qh q1 h8 qz z6 kx z8 bv 3q df pk tl d8 tq tf g8 zb qw 5p zm qe cv yb ec uz iv e2 gq wp uh kq ws lc wk x3 t8 rj fc io je dk lr lt wv wt bw be eo q4 ye yy rv ok yo yp ir ig +\n rs ij ty ps ul wr bh kb rs z4 z8 er px uo up y1 rb fo jo gg dv ph q0 jn xw ww d8 rp yd yf tx b0 op yn of jl tm px fm jc zf qd pk wh rp uv tp t9 ir yf ug qg v5 ku qz fd k4 cu mw zn iu bg lq ly rv su +\n ik dm cm or tw pu lp eh qd kk j0 em ng tw +\n ra ds qk cg q7 k6 4p t6 yu lq go yd eq r8 fw am dm xy cm v1 cz eo qi ij yn eg hq tc sj qa i0 oa l6 p6 wj vd wf mr yt ex e6 yo t9 ev s8 en rr bq kg hb lm re bj ms w1 et du +\n o9 gy bl wz t8 hq iu ix av y5 y8 jn j1 np xt t9 vw qq 43 xv 9w yi ft es hy op lg vs hg wd ef wx ou ox sw dr ze xr st fm ah +\n a3 wr fb jc c2 w8 rx fe q9 hd xq qq wi te y9 e1 qt qi qs nl ca bh u2 md tv hx +\n ra jh q3 aa t3 1o eq lh rv fo us pt dj pm pi qn zr bj xj cm ix a0 ra hi eu nw yc p3 ru ri ue e2 jl hi wo g9 xn qh wl wx go yp rr dj nd ch u3 fj bd jy vn w1 ia ox tm uz +\n ma y5 bl qi g7 ri fl ap 7a yo ko rp +\n um dh pg wq r5 sf ia ta an hs ne q9 wt sh rk yi ym of tb oq do hv wj ic oi sc pe sc wq wb wm tq +\n hq qm gg q4 xu k4 k7 uo wt kb et fo ey aw g0 xi am in qy eo qi eb ay ue og nt kl wx s9 df qg f9 v6 rv sv pc tl my bj wb eq h4 o3 ri +\n tt uq qh nb qz wt jx ya on om io ow ha qp e2 fd e4 hp hx p2 vm xg xn ra l8 iu yf jr qh k4 1l oa tk zp yw rz sy ul yx eo ep +\n ij yb qs fi ul qk by ql jl wr bi q5 bl tm q7 xp k7 vy gi tj rl rx yf ym tu er r8 pe ip ej y4 fd jn gx zt vj xt xh rj kt cm ri nh zq pp eu rw to pg e1 ue dw e2 so tb gm qi jb nk gy pa v1 xj fl kh 3k kl ed wx wc ek yy ez wc iq yo u4 it tz ak hn f8 h2 hl uv wz h8 gi nk ch zt wt bw kn yq e1 tv zp ag it +\n qs rf jq go qh a8 jj xt le wu qq yd d6 d0 ff qc su c7 lc wp ty y0 tu ti pf ta aa ug vb rf vi rx no un yu e5 7r up rj ag ha hs fc wz bo qv bp tv ki er +\n yb qa rd lo ok q6 o6 ba r6 ow or yl am aq gd dc ho cx c0 wu g4 ib c5 ep re qo ed yw iv ta hy jc pn xs oq xn bo zg ps kr iz yp wh wj xl xo zq me na ek wl wx wc rg uo ir tk aj da rw hm io uj fb jt qj dk nh zx jp qx wc zr zy zu nc xe ww wv vn h2 q6 en ew ad yl af eo if r2 +\n yb o0 dn z1 q1 sw qk po xt wr ls z8 ox wu jd ro q8 lh mh wa rg ea c3 pz tu g2 is a9 pn tw po qc sa jj vh ax xh kt wy jv mg nh kp b9 qi od ht e4 uu ij qf sf nc wk ap wd qz rd yi s7 tk pb it f7 o2 f9 kv qh h4 ln wz gi qd zn xm sn 39 yn rz u7 yr yj is ie ag ir tw +\n po dx uv pq jd dm d2 hr cs gs d3 q4 wr np ab di mh vt w7 w0 on tl ia ta aq dz y7 i1 qc pg q0 wq j2 c7 la cb il wr lv na ru 4g vz nf bc sl qq qp qt ud rq wg ex uw he tz ye p9 ui ou vu at ix w0 vf bi ed yh wh ra y6 wc u1 t8 fj ov iy tz kx h1 hj jy qj h6 ng jo wz cj ie mt rq te n9 mp ma q5 8w rb o7 sp ob +\n po ra dg ca qj q2 is kn rd ws lq tu ym yl y5 tg pp qw we cn a7 1t jd m7 wo yr sz qa hp ei qy ec p4 hw p7 to au iv ht qt qy qo l4 lz xm wd yf wg ez s7 en f3 tx yf rr f8 cw ji qv yz ry ew w2 oj w4 w5 st rn oz ri o6 dp aj +\n gm jg ju q5 np lf q7 xo 1y qn k0 jo pp qx th q9 4f or ro pu bv eu nw uq ao dy jb j9 gr rd nz wj wj r9 co ta rk od dd gg hm df pr km ng oj qc sb qd wb tz cq ex wb vb ty eq tv iw +\n fu uq co qk jl cg ld lg wo vr gc bd rj r3 yd rz iu ew d6 io to sh y7 jp db dn qn qm si xg qr ls jo lr wy rk wn m7 qu bb es op qp ru en ta e3 in hy dy hl vc gc gt jw ke 2t wh rk lj hg oy e6 yo ev em fz rw pq re dg qk ku oi qz k4 qv li rq n8 ec 4d yb wb e1 iw id o6 ir do ux pi ep +\n a2 wu jd ef dc mn 5e qp pl xd ag ay +\n yv o9 al a5 uq qg jw pi z2 jt cd q5 3m zl ez vu rg jl rz yf ix sj fp d0 tq ff ha hs zw om ni m0 xg c8 a7 ki qw cc ei xg j3 tt tu il p6 ix tp tx ib sp hg p0 fc pj su qu jv sj lk qp ws qs gm 1x mx lv wj qu l1 dt wh wv un aq fg rg e6 uo ar ie up it sw tx f6 o2 h3 qc qa ho vj u3 kd zy n6 my ww vc lr em w2 se rt o4 yc a1 te +\n qs:1 dv:2 pa:3 ty:4 iz:5 uw:6 qh:7 jj:8 z3:9 tn:10 jc:11 eg:12 e4:13 qq:14 w7:15 ut:16 r3:17 uu:18 kb:19 up:20 g1:21 fo:22 iv:23 if:24 fd:25 gd:26 sc:27 qm:28 qe:29 xg:30 ia:31 wb:32 he:33 ky:34 hu:35 tv:36 rw:37 qu:38 rr:39 es:40 p3:41 ue:42 s2:43 as:44 i0:45 dt:46 qt:47 hz:48 jm:49 j0:50 gy:51 ci:52 fi:53 hw:54 nv:55 ea:56 kk:57 vf:58 rx:59 68:60 ti:61 rp:62 wl:63 oi:64 vp:65 at:66 om:67 io:68 uk:69 pt:70 qh:71 qj:72 dl:73 cf:74 lr:75 cx:76 wq:77 ku:78 ki:79 w2:80 yh:81 af:82 ul:83 sp:84 yc:85 +\n ub:1 yb:2 dc:3 ty:4 gm:5 dm:6 go:7 nv:8 we:9 ql:10 by:11 la:12 o1:13 ju:14 o3:15 jx:16 fm:17 aj:18 wa:19 rg:20 e4:21 vi:22 a6:23 r4:24 xo:25 tz:26 oe:27 ip:28 pv:29 dk:30 tq:31 a0:32 tf:33 fg:34 tg:35 i4:36 pz:37 sd:38 ry:39 ky:40 mg:41 hy:42 g7:43 eu:44 qy:45 yi:46 rw:47 qp:48 eg:49 yw:50 hw:51 sm:52 uc:53 i7:54 dw:55 fx:56 s3:57 sf:58 zo:59 m9:60 xs:61 vn:62 rf:63 ci:64 nz:65 kr:66 qt:67 9y:68 pj:69 lk:70 ee:71 pz:72 ef:73 rk:74 e0:75 fx:76 uf:77 az:78 fc:79 qg:80 jr:81 oy:82 lq:83 cg:84 qp:85 um:86 ad:87 wc:88 zn:89 bw:90 n6:91 my:92 xr:93 mp:94 tu:95 en:96 o3:97 iq:98 ir:99 +\n da:1 a3:2 d1:3 jr:4 dz:5 ca:6 ql:7 nu:8 q3:9 cf:10 o6:11 nr:12 mt:13 lk:14 yr:15 rs:16 lp:17 w7:18 a5:19 pj:20 ys:21 ym:22 r8:23 ey:24 to:25 fs:26 dz:27 im:28 ih:29 sw:30 qx:31 qv:32 zn:33 gl:34 j1:35 xe:36 lc:37 zc:38 vw:39 6a:40 mh:41 b9:42 qt:43 rm:44 re:45 oo:46 qp:47 p4:48 tk:49 ix:50 p7:51 og:52 tz:53 yr:54 sp:55 aa:56 hk:57 ih:58 lx:59 qd:60 mx:61 4n:62 kk:63 vf:64 el:65 oo:66 td:67 ae:68 yo:69 fj:70 uf:71 pr:72 hl:73 qj:74 qk:75 wr:76 qc:77 qv:78 kf:79 yz:80 my:81 wq:82 hn:83 zs:84 dr:85 ee:86 u8:87 rv:88 et:89 ru:90 ie:91 ag:92 +\n gt:1 ph:2 z0:3 zl:4 mu:5 ui:6 av:7 zm:8 om:9 ui:10 vh:11 qr:12 he:13 qr:14 es:15 fl:16 ws:17 w6:18 nc:19 ra:20 rk:21 kp:22 ol:23 wm:24 yu:25 +\n dd:1 df:2 jq:3 jd:4 ux:5 ql:6 el:7 3r:8 ya:9 uu:10 iu:11 ee:12 eh:13 g3:14 sj:15 us:16 ib:17 pp:18 qc:19 jv:20 hd:21 bh:22 zt:23 uo:24 d8:25 b3:26 xu:27 bc:28 rq:29 te:30 uh:31 ex:32 tt:33 eb:34 il:35 qu:36 pc:37 ge:38 sj:39 qp:40 ih:41 xf:42 3r:43 gr:44 yh:45 qx:46 tu:47 wl:48 wn:49 sz:50 up:51 ay:52 it:53 ab:54 jt:55 qz:56 v7:57 wn:58 li:59 za:60 6o:61 w3:62 fn:63 yk:64 eu:65 ie:66 gz:67 +\n yv:1 o9:2 qf:3 eg:4 eh:5 mh:6 jh:7 rh:8 r3:9 rv:10 ix:11 y3:12 a0:13 sr:14 qc:15 qq:16 qr:17 wr:18 qe:19 bx:20 ki:21 m8:22 mk:23 qi:24 lm:25 uk:26 eb:27 ai:28 ur:29 e2:30 xd:31 nc:32 ca:33 eo:34 mb:35 ed:36 uv:37 rs:38 up:39 ya:40 of:41 hn:42 lw:43 wz:44 qz:45 et:46 qh:47 wm:48 zr:49 rc:50 o3:51 +\n ss:1 qg:2 qj:3 ph:4 qk:5 q2:6 cs:7 z4:8 bi:9 qc:10 cj:11 q8:12 qn:13 w7:14 rj:15 ys:16 ea:17 r4:18 uy:19 om:20 rc:21 ii:22 fp:23 sj:24 ej:25 yz:26 el:27 qx:28 qv:29 zn:30 gk:31 q9:32 hs:33 m2:34 ii:35 d7:36 nk:37 c8:38 j4:39 qq:40 dl:41 gg:42 pp:43 ei:44 qo:45 yc:46 od:47 fo:48 eh:49 fp:50 ta:51 hy:52 ok:53 tv:54 uu:55 us:56 dp:57 qf:58 sb:59 zg:60 ks:61 sg:62 n3:63 wh:64 x2:65 nr:66 cs:67 wk:68 kh:69 wk:70 wf:71 ew:72 7h:73 7k:74 oy:75 t6:76 gi:77 rg:78 yp:79 s9:80 ya:81 e9:82 pb:83 tc:84 dt:85 dh:86 hk:87 h2:88 pt:89 qh:90 h7:91 wz:92 n1:93 qv:94 kd:95 pm:96 cc:97 xr:98 kp:99 yk:100 tm:101 +\n gr:1 qa:2 ft:3 tt:4 gn:5 qs:6 pw:7 pu:8 ca:9 ph:10 ls:11 cg:12 cn:13 zf:14 bz:15 q7:16 z0:17 c3:18 qn:19 gv:20 w7:21 rg:22 ut:23 e8:24 ii:25 er:26 ip:27 sg:28 y3:29 oy:30 ek:31 ht:32 gd:33 qx:34 g0:35 qv:36 db:37 su:38 jn:39 qq:40 lz:41 uu:42 jo:43 ru:44 an:45 wi:46 kn:47 sq:48 nh:49 qr:50 qy:51 yx:52 eo:53 qi:54 xz:55 y9:56 ru:57 pd:58 au:59 p7:60 dq:61 he:62 ut:63 ok:64 fd:65 jz:66 ui:67 hc:68 j9:69 l3:70 hb:71 xd:72 jq:73 gy:74 kh:75 wf:76 xs:77 sl:78 rs:79 aq:80 ez:81 y4:82 ts:83 um:84 yi:85 e0:86 gh:87 dk:88 py:89 v5:90 qk:91 ql:92 ko:93 jq:94 wc:95 nk:96 v0:97 wb:98 qv:99 br:100 iu:101 wm:102 6p:103 sr:104 gk:105 yp:106 +\n o0:1 pa:2 pf:3 z3:4 jt:5 jy:6 z7:7 cm:8 ne:9 w8:10 yz:11 fd:12 fg:13 zn:14 qq:15 ll:16 vg:17 wr:18 wb:19 ia:20 xx:21 yj:22 ty:23 eh:24 e1:25 so:26 ts:27 tc:28 s4:29 i0:30 tn:31 wo:32 wp:33 wa:34 op:35 va:36 wk:37 x3:38 vg:39 qx:40 rs:41 sn:42 au:43 f3:44 tz:45 sq:46 hn:47 rr:48 o2:49 fv:50 un:51 k2:52 vj:53 ey:54 +\n iy:1 ra:2 ij:3 ty:4 a4:5 un:6 rf:7 qg:8 dm:9 jr:10 kj:11 uv:12 we:13 cv:14 gk:15 wy:16 z8:17 oc:18 wp:19 mo:20 jl:21 mz:22 ev:23 ch:24 rv:25 tu:26 ax:27 y2:28 g3:29 oy:30 y6:31 im:32 uq:33 qv:34 hp:35 qb:36 hd:37 iy:38 lp:39 nk:40 w2:41 bb:42 ho:43 ep:44 tr:45 os:46 en:47 sm:48 p8:49 p9:50 hy:51 ss:52 ui:53 gm:54 qi:55 oo:56 vn:57 ae:58 qd:59 w6:60 ps:61 dn:62 wd:63 wg:64 ro:65 mr:66 yt:67 ol:68 oz:69 rg:70 s7:71 u5:72 tl:73 yd:74 rr:75 ax:76 f0:77 cq:78 ku:79 qx:80 ze:81 n4:82 wn:83 kt:84 ca:85 jy:86 bg:87 yc:88 zs:89 yw:90 rz:91 w1:92 eu:93 rm:94 +\n hv:1 fu:2 ca:3 q8:4 mt:5 la:6 r3:7 pl:8 yh:9 to:10 sy:11 yh:12 tv:13 x4:14 tg:15 yp:16 ov:17 wn:18 ze:19 +\n o9:1 qa:2 az:3 gm:4 qd:5 pw:6 hq:7 pd:8 ga:9 qj:10 cd:11 q3:12 jk:13 pd:14 du:15 c2:16 zk:17 xf:18 t8:19 eq:20 om:21 es:22 rc:23 ua:24 y3:25 pu:26 ig:27 qx:28 se:29 qv:30 db:31 st:32 qn:33 ii:34 lx:35 qe:36 wt:37 xk:38 nx:39 ku:40 br:41 qe:42 qr:43 qt:44 rm:45 eu:46 xf:47 xb:48 rn:49 qu:50 qi:51 ep:52 qo:53 rr:54 ex:55 xk:56 p5:57 ym:58 fi:59 uq:60 to:61 ux:62 ix:63 ai:64 hj:65 gn:66 zi:67 oq:68 qf:69 kd:70 wf:71 xn:72 kr:73 w8:74 rl:75 kk:76 mq:77 rp:78 rf:79 u1:80 s7:81 oa:82 fh:83 e7:84 yp:85 e0:86 pr:87 ql:88 sx:89 ck:90 ag:91 kg:92 kt:93 mp:94 eb:95 rl:96 em:97 ee:98 w6:99 du:100 rm:101 yz:102 if:103 +\n qs:1 pi:2 am:3 6a:4 ut:5 r4:6 ii:7 sd:8 ua:9 ib:10 y6:11 pa:12 kt:13 pb:14 wm:15 qq:16 dz:17 qt:18 qp:19 y0:20 he:21 p8:22 ue:23 tb:24 qu:25 or:26 qo:27 wh:28 40:29 8j:30 t4:31 sl:32 rf:33 iu:34 gh:35 hh:36 qc:37 iq:38 bf:39 rl:40 wm:41 mf:42 oh:43 ew:44 is:45 +\n da:1 ps:2 a7:3 jr:4 z4:5 q3:6 bu:7 xt:8 ip:9 jx:10 q6:11 np:12 z7:13 bp:14 lg:15 bz:16 ye:17 wo:18 ig:19 bb:20 ww:21 rf:22 om:23 uu:24 ef:25 r8:26 ey:27 pt:28 ta:29 pn:30 y7:31 gg:32 th:33 dn:34 pg:35 qb:36 ri:37 qq:38 42:39 qw:40 zw:41 b9:42 b0:43 xb:44 qt:45 qy:46 yl:47 wh:48 xk:49 ft:50 at:51 yw:52 i7:53 sp:54 de:55 pz:56 fn:57 qy:58 si:59 m0:60 ik:61 wf:62 sg:63 cq:64 ql:65 hk:66 er:67 eg:68 lc:69 ek:70 na:71 wc:72 iw:73 ir:74 rk:75 ua:76 e0:77 ak:78 iu:79 sw:80 ap:81 uj:82 av:83 ab:84 hl:85 uv:86 zc:87 qa:88 wc:89 jw:90 vj:91 qv:92 vk:93 ay:94 kg:95 xw:96 on:97 rw:98 1b:99 wn:100 rl:101 eb:102 vm:103 eq:104 h4:105 yt:106 oz:107 eu:108 +\n a2:1 qa:2 rd:3 cp:4 qh:5 ub:6 vg:7 ws:8 u0:9 4g:10 bp:11 da:12 yo:13 ev:14 kz:15 eq:16 uu:17 ee:18 ef:19 yk:20 pr:21 sj:22 sk:23 fe:24 oi:25 lt:26 uy:27 j2:28 gn:29 io:30 vk:31 ns:32 27:33 ln:34 wu:35 ve:36 yr:37 l2:38 qu:39 qi:40 ry:41 il:42 ul:43 tj:44 eg:45 ux:46 i5:47 yr:48 tx:49 ph:50 oj:51 gq:52 or:53 zp:54 wa:55 qs:56 gy:57 iz:58 v0:59 qt:60 wj:61 ic:62 ca:63 lh:64 yb:65 np:66 ej:67 sl:68 td:69 l8:70 yi:71 iw:72 s8:73 e8:74 ys:75 yd:76 sq:77 al:78 dt:79 pt:80 tg:81 te:82 yb:83 eu:84 tq:85 r1:86 ir:87 +\n tr:1 h9:2 go:3 qj:4 b1:5 wu:6 q7:7 zh:8 el:9 tg:10 mb:11 ys:12 ed:13 ii:14 er:15 r8:16 xs:17 pe:18 r0:19 sw:20 db:21 ov:22 m7:23 d3:24 re:25 no:26 nu:27 zr:28 pq:29 ji:30 wr:31 lc:32 or:33 qw:34 ee:35 yy:36 qr:37 rn:38 rm:39 re:40 qi:41 te:42 ea:43 qo:44 yb:45 yn:46 y0:47 uz:48 uq:49 iz:50 tl:51 yr:52 i0:53 fm:54 wp:55 qs:56 qd:57 he:58 wk:59 kl:60 ew:61 as:62 hl:63 ez:64 oo:65 ox:66 ie:67 s0:68 f4:69 dl:70 wq:71 wl:72 ww:73 lr:74 qc:75 qv:76 vk:77 mt:78 my:79 kn:80 ep:81 em:82 yt:83 sy:84 am:85 so:86 rp:87 +\n ak:1 ft:2 qg:3 bg:4 ji:5 q6:6 bk:7 xi:8 tf:9 mo:10 ur:11 pj:12 yk:13 ua:14 qv:15 wq:16 gc:17 qe:18 ke:19 ef:20 eb:21 tk:22 uq:23 i6:24 oh:25 iv:26 gb:27 qs:28 rx:29 el:30 yo:31 rr:32 pe:33 wz:34 wx:35 ho:36 xq:37 tc:38 mo:39 yk:40 du:41 r1:42 tq:43 oc:44 hc:45 +\n ra:1 ub:2 qj:3 jh:4 jt:5 dx:6 ql:7 q6:8 da:9 tf:10 r3:11 ew:12 iu:13 sg:14 tp:15 yl:16 el:17 gc:18 6n:19 tt:20 ry:21 pd:22 ye:23 ff:24 lz:25 kt:26 yp:27 fl:28 yf:29 dl:30 +\n o9:1 hb:2 h9:3 qd:4 dh:5 qg:6 q1:7 qj:8 jy:9 se:10 q5:11 wt:12 nr:13 qv:14 ge:15 c5:16 el:17 6y:18 uo:19 rv:20 ax:21 pe:22 et:23 r0:24 fe:25 y6:26 dx:27 qx:28 ha:29 qq:30 lo:31 we:32 zy:33 v1:34 wy:35 dl:36 vr:37 wa:38 qr:39 rm:40 qi:41 qp:42 yn:43 tz:44 pg:45 ph:46 de:47 p0:48 do:49 qp:50 wp:51 wf:52 bw:53 xh:54 ky:55 xz:56 wh:57 hl:58 to:59 ek:60 rd:61 sv:62 rj:63 rq:64 re:65 h1:66 qg:67 qh:68 kl:69 f1:70 zm:71 18:72 ez:73 xe:74 vm:75 en:76 5j:77 o3:78 rn:79 fw:80 fe:81 +\n db:1 c2:2 bb:3 o0:4 w8:5 kl:6 kc:7 y4:8 qx:9 zm:10 pk:11 cw:12 id:13 ve:14 mh:15 lp:16 rq:17 jb:18 fl:19 x1:20 qi:21 wd:22 lx:23 f3:24 cy:25 bq:26 dd:27 ye:28 fn:29 diff --git a/src/test/singlenode_regress/data/venue_pipe.txt b/src/test/singlenode_regress/data/venue_pipe.txt new file mode 100644 index 00000000000..1469f9c6cbc --- /dev/null +++ b/src/test/singlenode_regress/data/venue_pipe.txt @@ -0,0 +1,10 @@ +250|Sahara Hotel|Las Vegas|NV|\N +251|Paris Hotel|Las Vegas|NV|\N +252|Hilton Hotel|Las Vegas|NV|\N +253|Mirage Hotel|Las Vegas|NV|\N +254|Caesars Palace|Las Vegas|NV|\N +255|Venetian Hotel|Las Vegas|NV|\N +256|Paris MGM Grand|Las Vegas|NV|\N +257|Luxor Hotel|Las Vegas|NV|\N +258|Tropicana Hotel|Las Vegas|NV|\N +264|New York New York|Las Vegas|NV|\N diff --git a/src/test/singlenode_regress/expected/.gitignore b/src/test/singlenode_regress/expected/.gitignore new file mode 100644 index 00000000000..bc2f6bcc6e7 --- /dev/null +++ b/src/test/singlenode_regress/expected/.gitignore @@ -0,0 +1,62 @@ +/constraints.out +/copy.out +/create_function_0.out +/create_function_1.out +/create_function_2.out +/largeobject.out +/largeobject_1.out +/misc.out +/security_label.out +/tablespace.out + +# GPDB specific ignores +# autogenerated out files from output dir source files +/alter_db_set_tablespace.out +/aocs.out +/appendonly.out +/auth_constraint.out +/autovacuum.out +/autovacuum-segment.out +/autovacuum-template0-segment.out +/bb_memory_quota.out +/bb_mpph.out +/collect_tabstat.out +/constraints_optimizer.out +/createdb.out +/default_tablespace.out +/dispatch.out +/dropdb_check_shared_buffer_cache.out +/external_table.out +/filespace.out +/gpcopy.out +/gp_dispatch_keepalives.out +/gp_tablespace.out +/gp_tablespace_path_too_long.out +/gp_tablespace_with_faults.out +/gptokencheck.out +/gp_transactions.out +/guc_env_var.out +/hooktest.out +/oid_wraparound.out +/partition_ddl.out +/pgstat_qd_tabstat.out +/qp_gist_indexes2_optimizer.out +/qp_gist_indexes2.out +/qp_regexp.out +/query_info_hook_test.out +/resource_queue_function.out +/resource_queue_function_resgroup.out +/rpt_tpch.out +/session_reset.out +/sreh.out +/table_functions_optimizer.out +/table_functions.out +/temp_relation.out +/temp_tablespaces.out +/transient_types.out +/trigger_sets_oid.out +/workfile_mgr_test.out +/external_table_persistent_error_log.out + +# CBDB specific ignores +/singlenode_compatibility_cbdb.out diff --git a/src/test/singlenode_regress/expected/AOCO_Compression.out b/src/test/singlenode_regress/expected/AOCO_Compression.out new file mode 100644 index 00000000000..a83b7ec502c --- /dev/null +++ b/src/test/singlenode_regress/expected/AOCO_Compression.out @@ -0,0 +1,3623 @@ +-- Two helper functions used to insert data to the test tables we will create. +\set HIDE_TABLEAM off +create function data1( + out a1 int, + out a2 char(5), + out a3 numeric, + out a4 boolean, + out a5 char, + out a6 text, + out a7 timestamp, + out a8 character varying(705), + out a9 bigint, + out a10 date, + out a11 varchar(600), + out a12 text, + out a13 decimal, + out a14 real, + out a15 bigint, + out a16 int4, + out a17 bytea, + out a18 timestamp with time zone, + out a19 timetz, + out a20 path, + out a21 box, + out a22 macaddr, + out a23 interval, + out a24 character varying(800), + out a25 lseg, + out a26 point, + out a27 double precision, + out a28 circle, + out a29 int4, + out a30 numeric(8), + out a31 polygon, + out a32 date, + out a33 real, + out a34 money, + out a35 cidr, + out a36 inet, + out a37 time, + out a38 text, + out a39 bit, + out a40 bit varying(5), + out a41 smallint, + out a42 int +) returns setof record as $$ +select g % 20 + 1 as a1, + 'M' as a2, + 2011::numeric as a3, + 't'::bool as a4, + 'a' as a5, + 'This is news of today: Deadlock between Republicans and Democrats over how best to reduce the U.S. deficit, and over what period, has blocked an agreement to allow the raising of the $14.3 trillion debt ceiling' as a6, + '2001-12-24 02:26:11'::timestamp as a7, + 'U.S. House of Representatives Speaker John Boehner, the top Republican in Congress who has put forward a deficit reduction plan to be voted on later on Thursday said he had no control over whether his bill would avert a credit downgrade.' as a8, + (g % 16 + 2490)::bigint as a9, + '2011-10-11'::date as a10, + 'The Republican-controlled House is tentatively scheduled to vote on Boehner proposal this afternoon at around 6 p.m. EDT (2200 GMT). The main Republican vote counter in the House, Kevin McCarthy, would not say if there were enough votes to pass the bill.' as a11, + 'WASHINGTON:House Speaker John Boehner says his plan mixing spending cuts in exchange for raising the nations $14.3 trillion debt limit is not perfect but is as large a step that a divided government can take that is doable and signable by President Barack Obama.The Ohio Republican says the measure is an honest and sincere attempt at compromise and was negotiated with Democrats last weekend and that passing it would end the ongoing debt crisis. The plan blends $900 billion-plus in spending cuts with a companion increase in the nations borrowing cap.' as a12, + '1234.56'::numeric as a13, + 323453::real as a14, + (g % 11 + 3452)::bigint as a15, + 7845 as a16, + '0011'::bytea as a17, + '2005-07-16 01:51:15+1359'::timestamp with time zone as a18, + '2001-12-13 01:51:15'::timetz as a19, + '((1,2),(0,3),(2,1))'::path as a20, + '((2,3)(4,5))'::box as a21, + '08:00:2b:01:02:03'::macaddr as a22, + '1-2'::interval as a23, + 'Republicans had been working throughout the day Thursday to lock down support for their plan to raise the nations debt ceiling, even as Senate Democrats vowed to swiftly kill it if passed.' as a24, + '((2,3)(4,5))'::lseg as a25, + '(6,7)'::point as a26, + 11.222::float8 as a27, + '((4,5),7)'::circle as a28, + 32 as a29, + 3214::numeric as a30, + '(1,0,2,3)'::polygon as a31, + '2010-02-21'::date as a32, + 43564::real as a33, + '$1,000.00'::money as a34, + '192.168.1'::cidr as a35, + '126.1.3.4'::inet as a36, + '12:30:45'::time as a37, + 'Johnson & Johnsons McNeil Consumer Healthcare announced the voluntary dosage reduction today. Labels will carry new dosing instructions this fall.The company says it will cut the maximum dosage of Regular Strength Tylenol and other acetaminophen-containing products in 2012.Acetaminophen is safe when used as directed, says Edwin Kuffner, MD, McNeil vice president of over-the-counter medical affairs. But, when too much is taken, it can cause liver damage.The action is intended to cut the risk of such accidental overdoses, the company says in a news release.' as a38, + '1'::bit as a39, + '0'::bit varying as a40, + 12::smallint as a41, + 23 as a42 +from generate_series(0,879) as g; +$$ language sql SET LC_monetary='en_US.utf8'; +create function data2( + out a1 int, + out a2 char(5), + out a3 numeric, + out a4 boolean, + out a5 char, + out a6 text, + out a7 timestamp, + out a8 character varying(705), + out a9 bigint, + out a10 date, + out a11 varchar(600), + out a12 text, + out a13 decimal, + out a14 real, + out a15 bigint, + out a16 int4, + out a17 bytea, + out a18 timestamp with time zone, + out a19 timetz, + out a20 path, + out a21 box, + out a22 macaddr, + out a23 interval, + out a24 character varying(800), + out a25 lseg, + out a26 point, + out a27 double precision, + out a28 circle, + out a29 int4, + out a30 numeric(8), + out a31 polygon, + out a32 date, + out a33 real, + out a34 money, + out a35 cidr, + out a36 inet, + out a37 time, + out a38 text, + out a39 bit, + out a40 bit varying(5), + out a41 smallint, + out a42 int +) returns setof record as $$ +select g % 11 + 500 as a1, + 'F' as a2, + 2010::numeric as a3, + 'f'::bool as a4, + 'b' as a5, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child' as a6, + '2001-12-25 02:22:11'::timestamp as a7, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child' as a8, + (g % 17 + 2500)::bigint as a9, + '2011-10-12'::date as a10, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child' as a11, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child The type integer is the usual choice, as it offers the best balance between range, storage size, and performance The type integer is the usual choice, as it offers the best balance between range, storage size, and performanceThe type integer is the usual choice, as it offers the best balance between range, storage size, and performanceThe type integer is the usual choice, as it offers the best balance between range, storage size, and performanceThe type integer ' as a12, + '1134.26'::numeric as a13, + 311353::real as a14, + (g % 11 + 3982)::bigint as a15, + 7885 as a16, + '0101'::bytea as a17, + '2002-02-12 01:31:14+1344'::timestamp with time zone as a18, + '2003-11-14 01:41:15'::timetz as a19, + '((1,1),(0,1),(1,1))'::path as a20, + '((2,1)(1,5))'::box as a21, + '08:00:2b:01:01:03'::macaddr as a22, + '1-3'::interval as a23, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child The types smallint, integer, and bigint store whole numbers, that is, numbers without fractional components, of various ranges. The types smallint, integer, and bigint store whole numbers, that is, numbers without fractional components, of various ranges. Attempts to store values outside of the allowed range will result in an errorThe types smallint, integer, and bigint store whole numbers, that is, numbers without fractional components, of various ranges.' as a24, + '((6,5)(4,2))'::lseg as a25, + '(3,6)'::point as a26, + 12.233::float8 as a27, + '((5,4),2)'::circle as a28, + 12 as a29, + 3114::numeric as a30, + '(1,1,0,3)'::polygon as a31, + '2010-03-21'::date as a32, + 43164::real as a33, + '$1,500.00'::money as a34, + '192.167.2'::cidr as a35, + '126.1.1.1'::inet as a36, + '10:30:55'::time as a37, + 'Parents and other family members are always welcome at Stratford. After the first two weeks ofschool' as a38, + '0'::bit as a39, + '1'::bit varying as a40, + 33::smallint as a41, + 44 as a42 +from generate_series(0,186) as g; +$$ language sql SET LC_monetary='en_US.utf8'; +-- +-- Drop table if exists +-- +DROP TABLE if exists co_crtb_with_strg_dir_and_col_ref_1 cascade; +NOTICE: table "co_crtb_with_strg_dir_and_col_ref_1" does not exist, skipping +DROP TABLE if exists co_crtb_with_strg_dir_and_col_ref_1_uncompr cascade; +NOTICE: table "co_crtb_with_strg_dir_and_col_ref_1_uncompr" does not exist, skipping +-- +-- Create table +-- +CREATE TABLE co_crtb_with_strg_dir_and_col_ref_1 ( + id SERIAL,a1 int ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a2 char(5) ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a3 numeric ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a4 boolean DEFAULT false ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a5 char DEFAULT 'd' ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a6 text ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a7 timestamp ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a8 character varying(705) ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a9 bigint ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a10 date ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a11 varchar(600) ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a12 text ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a13 decimal ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a14 real ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a15 bigint ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a16 int4 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a17 bytea ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a18 timestamp with time zone ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a19 timetz ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a20 path ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a21 box ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a22 macaddr ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a23 interval ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a24 character varying(800) ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a25 lseg ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a26 point ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a27 double precision ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a28 circle ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a29 int4 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a30 numeric(8) ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a31 polygon ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a32 date ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a33 real ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a34 money ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a35 cidr ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a36 inet ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a37 time ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a38 text ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a39 bit ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a40 bit varying(5) ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a41 smallint ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a42 int ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), COLUMN a1 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a2 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a3 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a4 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a5 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a6 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a7 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a8 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a9 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a10 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a11 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a12 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a13 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a14 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a15 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a16 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a17 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a18 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a19 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a20 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a21 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a22 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a23 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a24 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a25 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a26 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a27 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a28 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a29 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a30 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a31 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a32 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a33 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a34 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a35 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a36 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a37 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a38 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a39 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a40 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a41 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a42 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768),DEFAULT COLUMN ENCODING (compresstype=zlib,blocksize=8192)) WITH (appendonly=true, orientation=column); +-- +-- Create Indexes +-- +CREATE INDEX co_crtb_with_strg_dir_and_col_ref_1_idx_bitmap ON co_crtb_with_strg_dir_and_col_ref_1 USING bitmap (a1); +CREATE INDEX co_crtb_with_strg_dir_and_col_ref_1_idx_btree ON co_crtb_with_strg_dir_and_col_ref_1(a9); +-- +-- Insert data to the table +-- +INSERT INTO co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +-- More data for bigger block size +--Create Uncompressed table of same schema definition +CREATE TABLE co_crtb_with_strg_dir_and_col_ref_1_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column); +-- +-- Insert to uncompressed table +-- +INSERT INTO co_crtb_with_strg_dir_and_col_ref_1_uncompr select * from co_crtb_with_strg_dir_and_col_ref_1; +-- More data for bigger block size +-- +-- ********Validation******* +-- +\d+ co_crtb_with_strg_dir_and_col_ref_1 + Table "public.co_crtb_with_strg_dir_and_col_ref_1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+-----------------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_crtb_with_strg_dir_and_col_ref_1_id_seq'::regclass) | plain | | zlib | 1 | 8192 | + a1 | integer | | | | plain | | zlib | 1 | 1048576 | + a2 | character(5) | | | | extended | | zlib | 1 | 32768 | + a3 | numeric | | | | main | | rle_type | 1 | 65536 | + a4 | boolean | | | false | plain | | zlib | 1 | 1048576 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 1048576 | + a6 | text | | | | extended | | zlib | 1 | 32768 | + a7 | timestamp without time zone | | | | plain | | rle_type | 1 | 65536 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 1048576 | + a9 | bigint | | | | plain | | zlib | 1 | 1048576 | + a10 | date | | | | plain | | zlib | 1 | 32768 | + a11 | character varying(600) | | | | extended | | rle_type | 1 | 65536 | + a12 | text | | | | extended | | zlib | 1 | 1048576 | + a13 | numeric | | | | main | | zlib | 1 | 1048576 | + a14 | real | | | | plain | | zlib | 1 | 32768 | + a15 | bigint | | | | plain | | rle_type | 1 | 65536 | + a16 | integer | | | | plain | | zlib | 1 | 1048576 | + a17 | bytea | | | | extended | | zlib | 1 | 1048576 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 32768 | + a19 | time with time zone | | | | plain | | rle_type | 1 | 65536 | + a20 | path | | | | extended | | zlib | 1 | 1048576 | + a21 | box | | | | plain | | zlib | 1 | 1048576 | + a22 | macaddr | | | | plain | | zlib | 1 | 32768 | + a23 | interval | | | | plain | | rle_type | 1 | 65536 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 1048576 | + a25 | lseg | | | | plain | | zlib | 1 | 1048576 | + a26 | point | | | | plain | | zlib | 1 | 32768 | + a27 | double precision | | | | plain | | rle_type | 1 | 65536 | + a28 | circle | | | | plain | | zlib | 1 | 1048576 | + a29 | integer | | | | plain | | zlib | 1 | 1048576 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 32768 | + a31 | polygon | | | | extended | | rle_type | 1 | 65536 | + a32 | date | | | | plain | | zlib | 1 | 1048576 | + a33 | real | | | | plain | | zlib | 1 | 1048576 | + a34 | money | | | | plain | | zlib | 1 | 32768 | + a35 | cidr | | | | main | | rle_type | 1 | 65536 | + a36 | inet | | | | main | | zlib | 1 | 1048576 | + a37 | time without time zone | | | | plain | | zlib | 1 | 1048576 | + a38 | text | | | | extended | | zlib | 1 | 32768 | + a39 | bit(1) | | | | extended | | rle_type | 1 | 65536 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 1048576 | + a41 | smallint | | | | plain | | zlib | 1 | 1048576 | + a42 | integer | | | | plain | | zlib | 1 | 32768 | +Checksum: t +Indexes: + "co_crtb_with_strg_dir_and_col_ref_1_idx_bitmap" bitmap (a1) + "co_crtb_with_strg_dir_and_col_ref_1_idx_btree" btree (a9) +Distributed randomly +Access method: ao_column + +--Select from pg_attribute_encoding to see the table entry +select attrelid::regclass as relname, attnum, attoptions from pg_class c, pg_attribute_encoding e where c.relname = 'co_crtb_with_strg_dir_and_col_ref_1' and c.oid=e.attrelid order by relname, attnum limit 3; + relname | attnum | attoptions +-------------------------------------+--------+------------------------------------------------------- + co_crtb_with_strg_dir_and_col_ref_1 | 1 | {compresstype=zlib,blocksize=8192,compresslevel=1} + co_crtb_with_strg_dir_and_col_ref_1 | 2 | {compresstype=zlib,compresslevel=1,blocksize=1048576} + co_crtb_with_strg_dir_and_col_ref_1 | 3 | {compresstype=zlib,compresslevel=1,blocksize=32768} +(3 rows) + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_crtb_with_strg_dir_and_col_ref_1_uncompr ; + count_uncompressed +-------------------- + 1067 +(1 row) + +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_crtb_with_strg_dir_and_col_ref_1; + count_compressed +------------------ + 1067 +(1 row) + +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_crtb_with_strg_dir_and_col_ref_1 t1 full outer join co_crtb_with_strg_dir_and_col_ref_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +-- +-- Truncate the table +-- +TRUNCATE table co_crtb_with_strg_dir_and_col_ref_1; +-- +-- Insert data again +-- +insert into co_crtb_with_strg_dir_and_col_ref_1 select * from co_crtb_with_strg_dir_and_col_ref_1_uncompr order by a1; +analyze co_crtb_with_strg_dir_and_col_ref_1; +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_crtb_with_strg_dir_and_col_ref_1 t1 full outer join co_crtb_with_strg_dir_and_col_ref_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +--Alter table alter type of a column +Alter table co_crtb_with_strg_dir_and_col_ref_1 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_crtb_with_strg_dir_and_col_ref_1 where id =10; +Select count(*) from co_crtb_with_strg_dir_and_col_ref_1; + count +------- + 1068 +(1 row) + +--Alter table drop a column +Alter table co_crtb_with_strg_dir_and_col_ref_1 Drop column a12; +Insert into co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_crtb_with_strg_dir_and_col_ref_1 where id =10; +Select count(*) from co_crtb_with_strg_dir_and_col_ref_1; + count +------- + 1069 +(1 row) + +--Alter table rename a column +Alter table co_crtb_with_strg_dir_and_col_ref_1 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_crtb_with_strg_dir_and_col_ref_1 where id =10; +Select count(*) from co_crtb_with_strg_dir_and_col_ref_1; + count +------- + 1070 +(1 row) + +--Alter table add a column +Alter table co_crtb_with_strg_dir_and_col_ref_1 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_crtb_with_strg_dir_and_col_ref_1 where id =10; +Select count(*) from co_crtb_with_strg_dir_and_col_ref_1; + count +------- + 1071 +(1 row) + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_cr_sub_partzlib8192_1 cascade; +NOTICE: table "co_cr_sub_partzlib8192_1" does not exist, skipping +DROP TABLE if exists co_cr_sub_partzlib8192_1_uncompr cascade; +NOTICE: table "co_cr_sub_partzlib8192_1_uncompr" does not exist, skipping +-- +-- Create table +-- +CREATE TABLE co_cr_sub_partzlib8192_1 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) WITH (appendonly=true, orientation=column) + Partition by range(a1) Subpartition by list(a2) subpartition template ( default subpartition df_sp, subpartition sp1 values('M') , subpartition sp2 values('F') , + COLUMN a2 ENCODING (compresstype=zlib,compresslevel=1,blocksize=8192), + COLUMN a1 encoding (compresstype = zlib), + COLUMN a5 ENCODING (compresstype=zlib,compresslevel=1, blocksize=8192), + DEFAULT COLUMN ENCODING (compresstype=zlib,compresslevel=1,blocksize=8192)) (start(1) end(5000) every(1000)); +-- +-- Create Indexes +-- +CREATE INDEX co_cr_sub_partzlib8192_1_idx_bitmap ON co_cr_sub_partzlib8192_1 USING bitmap (a1); +CREATE INDEX co_cr_sub_partzlib8192_1_idx_btree ON co_cr_sub_partzlib8192_1(a9); +-- +-- Insert data to the table +-- +INSERT INTO co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +ANALYZE co_cr_sub_partzlib8192_1; +--Create Uncompressed table of same schema definition +CREATE TABLE co_cr_sub_partzlib8192_1_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column) Partition by range(a1) Subpartition by list(a2) subpartition template ( subpartition sp1 values('M') , subpartition sp2 values('F') ) (start(1) end(5000) every(1000)) ; +-- +-- Insert to uncompressed table +-- +INSERT INTO co_cr_sub_partzlib8192_1_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_cr_sub_partzlib8192_1_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +-- +-- ********Validation******* +-- +\d+ co_cr_sub_partzlib8192_1_1_prt_1_2_prt_sp2 + Table "public.co_cr_sub_partzlib8192_1_1_prt_1_2_prt_sp2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_id_seq'::regclass) | plain | | zlib | 1 | 8192 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 8192 | + a3 | numeric | | | | main | | zlib | 1 | 8192 | + a4 | boolean | | | false | plain | | zlib | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 8192 | + a6 | text | | | | extended | | zlib | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 8192 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 8192 | + a9 | bigint | | | | plain | | zlib | 1 | 8192 | + a10 | date | | | | plain | | zlib | 1 | 8192 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 8192 | + a12 | text | | | | extended | | zlib | 1 | 8192 | + a13 | numeric | | | | main | | zlib | 1 | 8192 | + a14 | real | | | | plain | | zlib | 1 | 8192 | + a15 | bigint | | | | plain | | zlib | 1 | 8192 | + a16 | integer | | | | plain | | zlib | 1 | 8192 | + a17 | bytea | | | | extended | | zlib | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 8192 | + a19 | time with time zone | | | | plain | | zlib | 1 | 8192 | + a20 | path | | | | extended | | zlib | 1 | 8192 | + a21 | box | | | | plain | | zlib | 1 | 8192 | + a22 | macaddr | | | | plain | | zlib | 1 | 8192 | + a23 | interval | | | | plain | | zlib | 1 | 8192 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 8192 | + a25 | lseg | | | | plain | | zlib | 1 | 8192 | + a26 | point | | | | plain | | zlib | 1 | 8192 | + a27 | double precision | | | | plain | | zlib | 1 | 8192 | + a28 | circle | | | | plain | | zlib | 1 | 8192 | + a29 | integer | | | | plain | | zlib | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 8192 | + a31 | polygon | | | | extended | | zlib | 1 | 8192 | + a32 | date | | | | plain | | zlib | 1 | 8192 | + a33 | real | | | | plain | | zlib | 1 | 8192 | + a34 | money | | | | plain | | zlib | 1 | 8192 | + a35 | cidr | | | | main | | zlib | 1 | 8192 | + a36 | inet | | | | main | | zlib | 1 | 8192 | + a37 | time without time zone | | | | plain | | zlib | 1 | 8192 | + a38 | text | | | | extended | | zlib | 1 | 8192 | + a39 | bit(1) | | | | extended | | zlib | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 8192 | + a41 | smallint | | | | plain | | zlib | 1 | 8192 | + a42 | integer | | | | plain | | zlib | 1 | 8192 | +Partition of: co_cr_sub_partzlib8192_1_1_prt_1 FOR VALUES IN ('F ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001) AND (a2 IS NOT NULL) AND (a2 = 'F '::character(5))) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_1_prt_1_2_prt_sp2_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_1_prt_1_2_prt_sp2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_cr_sub_partzlib8192_1_uncompr ; + count_uncompressed +-------------------- + 1067 +(1 row) + +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_cr_sub_partzlib8192_1; + count_compressed +------------------ + 1067 +(1 row) + +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_cr_sub_partzlib8192_1 t1 full outer join co_cr_sub_partzlib8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +-- +-- Truncate the table +-- +TRUNCATE table co_cr_sub_partzlib8192_1; +-- +-- Insert data again +-- +insert into co_cr_sub_partzlib8192_1 select * from co_cr_sub_partzlib8192_1_uncompr order by a1; +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_cr_sub_partzlib8192_1 t1 full outer join co_cr_sub_partzlib8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +--Alter table Add Partition +alter table co_cr_sub_partzlib8192_1 add partition new_p start(5050) end (6051) with (appendonly=true, orientation=column); +--Validation with psql utility + \d+ co_cr_sub_partzlib8192_1_1_prt_new_p_2_prt_sp1 + Table "public.co_cr_sub_partzlib8192_1_1_prt_new_p_2_prt_sp1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_id_seq'::regclass) | plain | | zlib | 1 | 8192 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 8192 | + a3 | numeric | | | | main | | zlib | 1 | 8192 | + a4 | boolean | | | false | plain | | zlib | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 8192 | + a6 | text | | | | extended | | zlib | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 8192 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 8192 | + a9 | bigint | | | | plain | | zlib | 1 | 8192 | + a10 | date | | | | plain | | zlib | 1 | 8192 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 8192 | + a12 | text | | | | extended | | zlib | 1 | 8192 | + a13 | numeric | | | | main | | zlib | 1 | 8192 | + a14 | real | | | | plain | | zlib | 1 | 8192 | + a15 | bigint | | | | plain | | zlib | 1 | 8192 | + a16 | integer | | | | plain | | zlib | 1 | 8192 | + a17 | bytea | | | | extended | | zlib | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 8192 | + a19 | time with time zone | | | | plain | | zlib | 1 | 8192 | + a20 | path | | | | extended | | zlib | 1 | 8192 | + a21 | box | | | | plain | | zlib | 1 | 8192 | + a22 | macaddr | | | | plain | | zlib | 1 | 8192 | + a23 | interval | | | | plain | | zlib | 1 | 8192 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 8192 | + a25 | lseg | | | | plain | | zlib | 1 | 8192 | + a26 | point | | | | plain | | zlib | 1 | 8192 | + a27 | double precision | | | | plain | | zlib | 1 | 8192 | + a28 | circle | | | | plain | | zlib | 1 | 8192 | + a29 | integer | | | | plain | | zlib | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 8192 | + a31 | polygon | | | | extended | | zlib | 1 | 8192 | + a32 | date | | | | plain | | zlib | 1 | 8192 | + a33 | real | | | | plain | | zlib | 1 | 8192 | + a34 | money | | | | plain | | zlib | 1 | 8192 | + a35 | cidr | | | | main | | zlib | 1 | 8192 | + a36 | inet | | | | main | | zlib | 1 | 8192 | + a37 | time without time zone | | | | plain | | zlib | 1 | 8192 | + a38 | text | | | | extended | | zlib | 1 | 8192 | + a39 | bit(1) | | | | extended | | zlib | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 8192 | + a41 | smallint | | | | plain | | zlib | 1 | 8192 | + a42 | integer | | | | plain | | zlib | 1 | 8192 | +Partition of: co_cr_sub_partzlib8192_1_1_prt_new_p FOR VALUES IN ('M ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 5050) AND (a1 < 6051) AND (a2 IS NOT NULL) AND (a2 = 'M '::character(5))) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_1_prt_new_p_2_prt_sp1_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_1_prt_new_p_2_prt_sp1_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column + +alter table co_cr_sub_partzlib8192_1 add default partition df_p with (appendonly=true, orientation=column); +--Validation with psql utility + \d+ co_cr_sub_partzlib8192_1_1_prt_df_p_2_prt_sp2 + Table "public.co_cr_sub_partzlib8192_1_1_prt_df_p_2_prt_sp2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_id_seq'::regclass) | plain | | zlib | 1 | 8192 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 8192 | + a3 | numeric | | | | main | | zlib | 1 | 8192 | + a4 | boolean | | | false | plain | | zlib | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 8192 | + a6 | text | | | | extended | | zlib | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 8192 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 8192 | + a9 | bigint | | | | plain | | zlib | 1 | 8192 | + a10 | date | | | | plain | | zlib | 1 | 8192 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 8192 | + a12 | text | | | | extended | | zlib | 1 | 8192 | + a13 | numeric | | | | main | | zlib | 1 | 8192 | + a14 | real | | | | plain | | zlib | 1 | 8192 | + a15 | bigint | | | | plain | | zlib | 1 | 8192 | + a16 | integer | | | | plain | | zlib | 1 | 8192 | + a17 | bytea | | | | extended | | zlib | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 8192 | + a19 | time with time zone | | | | plain | | zlib | 1 | 8192 | + a20 | path | | | | extended | | zlib | 1 | 8192 | + a21 | box | | | | plain | | zlib | 1 | 8192 | + a22 | macaddr | | | | plain | | zlib | 1 | 8192 | + a23 | interval | | | | plain | | zlib | 1 | 8192 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 8192 | + a25 | lseg | | | | plain | | zlib | 1 | 8192 | + a26 | point | | | | plain | | zlib | 1 | 8192 | + a27 | double precision | | | | plain | | zlib | 1 | 8192 | + a28 | circle | | | | plain | | zlib | 1 | 8192 | + a29 | integer | | | | plain | | zlib | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 8192 | + a31 | polygon | | | | extended | | zlib | 1 | 8192 | + a32 | date | | | | plain | | zlib | 1 | 8192 | + a33 | real | | | | plain | | zlib | 1 | 8192 | + a34 | money | | | | plain | | zlib | 1 | 8192 | + a35 | cidr | | | | main | | zlib | 1 | 8192 | + a36 | inet | | | | main | | zlib | 1 | 8192 | + a37 | time without time zone | | | | plain | | zlib | 1 | 8192 | + a38 | text | | | | extended | | zlib | 1 | 8192 | + a39 | bit(1) | | | | extended | | zlib | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 8192 | + a41 | smallint | | | | plain | | zlib | 1 | 8192 | + a42 | integer | | | | plain | | zlib | 1 | 8192 | +Partition of: co_cr_sub_partzlib8192_1_1_prt_df_p FOR VALUES IN ('F ') +Partition constraint: ((NOT ((a1 IS NOT NULL) AND (((a1 >= 1) AND (a1 < 1001)) OR ((a1 >= 1001) AND (a1 < 2001)) OR ((a1 >= 2001) AND (a1 < 3001)) OR ((a1 >= 3001) AND (a1 < 4001)) OR ((a1 >= 4001) AND (a1 < 5000)) OR ((a1 >= 5050) AND (a1 < 6051))))) AND (a2 IS NOT NULL) AND (a2 = 'F '::character(5))) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_1_prt_df_p_2_prt_sp2_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_1_prt_df_p_2_prt_sp2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column + +-- Insert data +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists co_cr_sub_partzlib8192_1_exch; +NOTICE: table "co_cr_sub_partzlib8192_1_exch" does not exist, skipping + CREATE TABLE co_cr_sub_partzlib8192_1_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Drop Table if exists co_cr_sub_partzlib8192_1_defexch; +NOTICE: table "co_cr_sub_partzlib8192_1_defexch" does not exist, skipping + CREATE TABLE co_cr_sub_partzlib8192_1_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Insert into co_cr_sub_partzlib8192_1_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where a1=10 and a2!='C'; +Insert into co_cr_sub_partzlib8192_1_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where a1 =10 and a2!='C'; +CREATE INDEX ON co_cr_sub_partzlib8192_1_exch USING bitmap (a1); +CREATE INDEX ON co_cr_sub_partzlib8192_1_exch (a9); +Alter table co_cr_sub_partzlib8192_1 alter partition FOR (1) exchange partition sp1 with table co_cr_sub_partzlib8192_1_exch; +\d+ co_cr_sub_partzlib8192_1_1_prt_1_2_prt_sp1 + Table "public.co_cr_sub_partzlib8192_1_1_prt_1_2_prt_sp1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+-----------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_exch_id_seq'::regclass) | plain | | zlib | 1 | 32768 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 32768 | + a3 | numeric | | | | main | | zlib | 1 | 32768 | + a4 | boolean | | | false | plain | | zlib | 1 | 32768 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 32768 | + a6 | text | | | | extended | | zlib | 1 | 32768 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 32768 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 32768 | + a9 | bigint | | | | plain | | zlib | 1 | 32768 | + a10 | date | | | | plain | | zlib | 1 | 32768 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 32768 | + a12 | text | | | | extended | | zlib | 1 | 32768 | + a13 | numeric | | | | main | | zlib | 1 | 32768 | + a14 | real | | | | plain | | zlib | 1 | 32768 | + a15 | bigint | | | | plain | | zlib | 1 | 32768 | + a16 | integer | | | | plain | | zlib | 1 | 32768 | + a17 | bytea | | | | extended | | zlib | 1 | 32768 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 32768 | + a19 | time with time zone | | | | plain | | zlib | 1 | 32768 | + a20 | path | | | | extended | | zlib | 1 | 32768 | + a21 | box | | | | plain | | zlib | 1 | 32768 | + a22 | macaddr | | | | plain | | zlib | 1 | 32768 | + a23 | interval | | | | plain | | zlib | 1 | 32768 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 32768 | + a25 | lseg | | | | plain | | zlib | 1 | 32768 | + a26 | point | | | | plain | | zlib | 1 | 32768 | + a27 | double precision | | | | plain | | zlib | 1 | 32768 | + a28 | circle | | | | plain | | zlib | 1 | 32768 | + a29 | integer | | | | plain | | zlib | 1 | 32768 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 32768 | + a31 | polygon | | | | extended | | zlib | 1 | 32768 | + a32 | date | | | | plain | | zlib | 1 | 32768 | + a33 | real | | | | plain | | zlib | 1 | 32768 | + a34 | money | | | | plain | | zlib | 1 | 32768 | + a35 | cidr | | | | main | | zlib | 1 | 32768 | + a36 | inet | | | | main | | zlib | 1 | 32768 | + a37 | time without time zone | | | | plain | | zlib | 1 | 32768 | + a38 | text | | | | extended | | zlib | 1 | 32768 | + a39 | bit(1) | | | | extended | | zlib | 1 | 32768 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 32768 | + a41 | smallint | | | | plain | | zlib | 1 | 32768 | + a42 | integer | | | | plain | | zlib | 1 | 32768 | +Partition of: co_cr_sub_partzlib8192_1_1_prt_1 FOR VALUES IN ('M ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001) AND (a2 IS NOT NULL) AND (a2 = 'M '::character(5))) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_exch_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_exch_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=zlib + +Select count(*) from co_cr_sub_partzlib8192_1; + count +------- + 5231 +(1 row) + +--Alter table Drop Partition +alter table co_cr_sub_partzlib8192_1 drop partition new_p; +-- Drop the default partition +alter table co_cr_sub_partzlib8192_1 drop default partition; +--Alter table alter type of a column +Alter table co_cr_sub_partzlib8192_1 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1; + count +------- + 5231 +(1 row) + +--Alter table drop a column +Alter table co_cr_sub_partzlib8192_1 Drop column a12; +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1; + count +------- + 5232 +(1 row) + +--Alter table rename a column +Alter table co_cr_sub_partzlib8192_1 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1; + count +------- + 5233 +(1 row) + +--Alter table add a column +Alter table co_cr_sub_partzlib8192_1 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1; + count +------- + 5234 +(1 row) + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_cr_sub_partzlib8192_1_2 cascade; +NOTICE: table "co_cr_sub_partzlib8192_1_2" does not exist, skipping +DROP TABLE if exists co_cr_sub_partzlib8192_1_2_uncompr cascade; +NOTICE: table "co_cr_sub_partzlib8192_1_2_uncompr" does not exist, skipping +-- +-- Create table +-- +CREATE TABLE co_cr_sub_partzlib8192_1_2 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) WITH (appendonly=true, orientation=column) + Partition by list(a2) Subpartition by range(a1) subpartition template (default subpartition df_sp, start(1) end(5000) every(1000), + COLUMN a2 ENCODING (compresstype=zlib,compresslevel=1,blocksize=8192), + COLUMN a1 encoding (compresstype = zlib), + COLUMN a5 ENCODING (compresstype=zlib,compresslevel=1, blocksize=8192), + DEFAULT COLUMN ENCODING (compresstype=zlib,compresslevel=1,blocksize=8192)) (partition p1 values('F'), partition p2 values ('M')); +-- +-- Create Indexes +-- +CREATE INDEX co_cr_sub_partzlib8192_1_2_idx_bitmap ON co_cr_sub_partzlib8192_1_2 USING bitmap (a1); +CREATE INDEX co_cr_sub_partzlib8192_1_2_idx_btree ON co_cr_sub_partzlib8192_1_2(a9); +-- +-- Insert data to the table +-- +INSERT INTO co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +--Create Uncompressed table of same schema definition +CREATE TABLE co_cr_sub_partzlib8192_1_2_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column) Partition by list(a2) Subpartition by range(a1) subpartition template (start(1) end(5000) every(1000)) (default partition p1 , partition p2 values ('M') ); +-- +-- Insert to uncompressed table +-- +INSERT INTO co_cr_sub_partzlib8192_1_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_cr_sub_partzlib8192_1_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +-- +-- ********Validation******* +-- +\d+ co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_2 + Table "public.co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+--------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_2_id_seq'::regclass) | plain | | zlib | 1 | 8192 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 8192 | + a3 | numeric | | | | main | | zlib | 1 | 8192 | + a4 | boolean | | | false | plain | | zlib | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 8192 | + a6 | text | | | | extended | | zlib | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 8192 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 8192 | + a9 | bigint | | | | plain | | zlib | 1 | 8192 | + a10 | date | | | | plain | | zlib | 1 | 8192 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 8192 | + a12 | text | | | | extended | | zlib | 1 | 8192 | + a13 | numeric | | | | main | | zlib | 1 | 8192 | + a14 | real | | | | plain | | zlib | 1 | 8192 | + a15 | bigint | | | | plain | | zlib | 1 | 8192 | + a16 | integer | | | | plain | | zlib | 1 | 8192 | + a17 | bytea | | | | extended | | zlib | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 8192 | + a19 | time with time zone | | | | plain | | zlib | 1 | 8192 | + a20 | path | | | | extended | | zlib | 1 | 8192 | + a21 | box | | | | plain | | zlib | 1 | 8192 | + a22 | macaddr | | | | plain | | zlib | 1 | 8192 | + a23 | interval | | | | plain | | zlib | 1 | 8192 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 8192 | + a25 | lseg | | | | plain | | zlib | 1 | 8192 | + a26 | point | | | | plain | | zlib | 1 | 8192 | + a27 | double precision | | | | plain | | zlib | 1 | 8192 | + a28 | circle | | | | plain | | zlib | 1 | 8192 | + a29 | integer | | | | plain | | zlib | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 8192 | + a31 | polygon | | | | extended | | zlib | 1 | 8192 | + a32 | date | | | | plain | | zlib | 1 | 8192 | + a33 | real | | | | plain | | zlib | 1 | 8192 | + a34 | money | | | | plain | | zlib | 1 | 8192 | + a35 | cidr | | | | main | | zlib | 1 | 8192 | + a36 | inet | | | | main | | zlib | 1 | 8192 | + a37 | time without time zone | | | | plain | | zlib | 1 | 8192 | + a38 | text | | | | extended | | zlib | 1 | 8192 | + a39 | bit(1) | | | | extended | | zlib | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 8192 | + a41 | smallint | | | | plain | | zlib | 1 | 8192 | + a42 | integer | | | | plain | | zlib | 1 | 8192 | +Partition of: co_cr_sub_partzlib8192_1_2_1_prt_p1 FOR VALUES FROM (1) TO (1001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'F '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_2_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_cr_sub_partzlib8192_1_2_uncompr ; + count_uncompressed +-------------------- + 1067 +(1 row) + +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_cr_sub_partzlib8192_1_2; + count_compressed +------------------ + 1067 +(1 row) + +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_cr_sub_partzlib8192_1_2 t1 full outer join co_cr_sub_partzlib8192_1_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +-- +-- Truncate the table +-- +TRUNCATE table co_cr_sub_partzlib8192_1_2; +-- +-- Insert data again +-- +insert into co_cr_sub_partzlib8192_1_2 select * from co_cr_sub_partzlib8192_1_2_uncompr order by a1; +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_cr_sub_partzlib8192_1_2 t1 full outer join co_cr_sub_partzlib8192_1_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +--Alter table Add Partition +alter table co_cr_sub_partzlib8192_1_2 add partition new_p values('C') with (appendonly=true, orientation=column); +--Validation with psql utility + \d+ co_cr_sub_partzlib8192_1_2_1_prt_new_p_2_prt_3 + Table "public.co_cr_sub_partzlib8192_1_2_1_prt_new_p_2_prt_3" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+--------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_2_id_seq'::regclass) | plain | | zlib | 1 | 8192 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 8192 | + a3 | numeric | | | | main | | zlib | 1 | 8192 | + a4 | boolean | | | false | plain | | zlib | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 8192 | + a6 | text | | | | extended | | zlib | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 8192 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 8192 | + a9 | bigint | | | | plain | | zlib | 1 | 8192 | + a10 | date | | | | plain | | zlib | 1 | 8192 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 8192 | + a12 | text | | | | extended | | zlib | 1 | 8192 | + a13 | numeric | | | | main | | zlib | 1 | 8192 | + a14 | real | | | | plain | | zlib | 1 | 8192 | + a15 | bigint | | | | plain | | zlib | 1 | 8192 | + a16 | integer | | | | plain | | zlib | 1 | 8192 | + a17 | bytea | | | | extended | | zlib | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 8192 | + a19 | time with time zone | | | | plain | | zlib | 1 | 8192 | + a20 | path | | | | extended | | zlib | 1 | 8192 | + a21 | box | | | | plain | | zlib | 1 | 8192 | + a22 | macaddr | | | | plain | | zlib | 1 | 8192 | + a23 | interval | | | | plain | | zlib | 1 | 8192 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 8192 | + a25 | lseg | | | | plain | | zlib | 1 | 8192 | + a26 | point | | | | plain | | zlib | 1 | 8192 | + a27 | double precision | | | | plain | | zlib | 1 | 8192 | + a28 | circle | | | | plain | | zlib | 1 | 8192 | + a29 | integer | | | | plain | | zlib | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 8192 | + a31 | polygon | | | | extended | | zlib | 1 | 8192 | + a32 | date | | | | plain | | zlib | 1 | 8192 | + a33 | real | | | | plain | | zlib | 1 | 8192 | + a34 | money | | | | plain | | zlib | 1 | 8192 | + a35 | cidr | | | | main | | zlib | 1 | 8192 | + a36 | inet | | | | main | | zlib | 1 | 8192 | + a37 | time without time zone | | | | plain | | zlib | 1 | 8192 | + a38 | text | | | | extended | | zlib | 1 | 8192 | + a39 | bit(1) | | | | extended | | zlib | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 8192 | + a41 | smallint | | | | plain | | zlib | 1 | 8192 | + a42 | integer | | | | plain | | zlib | 1 | 8192 | +Partition of: co_cr_sub_partzlib8192_1_2_1_prt_new_p FOR VALUES FROM (1001) TO (2001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'C '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1001) AND (a1 < 2001)) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_2_1_prt_new_p_2_prt_3_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_2_1_prt_new_p_2_prt_3_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column + +alter table co_cr_sub_partzlib8192_1_2 add default partition df_p with (appendonly=true, orientation=column); +--Validation with psql utility + \d+ co_cr_sub_partzlib8192_1_2_1_prt_df_p_2_prt_2 + Table "public.co_cr_sub_partzlib8192_1_2_1_prt_df_p_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+--------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_2_id_seq'::regclass) | plain | | zlib | 1 | 8192 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 8192 | + a3 | numeric | | | | main | | zlib | 1 | 8192 | + a4 | boolean | | | false | plain | | zlib | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 8192 | + a6 | text | | | | extended | | zlib | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 8192 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 8192 | + a9 | bigint | | | | plain | | zlib | 1 | 8192 | + a10 | date | | | | plain | | zlib | 1 | 8192 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 8192 | + a12 | text | | | | extended | | zlib | 1 | 8192 | + a13 | numeric | | | | main | | zlib | 1 | 8192 | + a14 | real | | | | plain | | zlib | 1 | 8192 | + a15 | bigint | | | | plain | | zlib | 1 | 8192 | + a16 | integer | | | | plain | | zlib | 1 | 8192 | + a17 | bytea | | | | extended | | zlib | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 8192 | + a19 | time with time zone | | | | plain | | zlib | 1 | 8192 | + a20 | path | | | | extended | | zlib | 1 | 8192 | + a21 | box | | | | plain | | zlib | 1 | 8192 | + a22 | macaddr | | | | plain | | zlib | 1 | 8192 | + a23 | interval | | | | plain | | zlib | 1 | 8192 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 8192 | + a25 | lseg | | | | plain | | zlib | 1 | 8192 | + a26 | point | | | | plain | | zlib | 1 | 8192 | + a27 | double precision | | | | plain | | zlib | 1 | 8192 | + a28 | circle | | | | plain | | zlib | 1 | 8192 | + a29 | integer | | | | plain | | zlib | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 8192 | + a31 | polygon | | | | extended | | zlib | 1 | 8192 | + a32 | date | | | | plain | | zlib | 1 | 8192 | + a33 | real | | | | plain | | zlib | 1 | 8192 | + a34 | money | | | | plain | | zlib | 1 | 8192 | + a35 | cidr | | | | main | | zlib | 1 | 8192 | + a36 | inet | | | | main | | zlib | 1 | 8192 | + a37 | time without time zone | | | | plain | | zlib | 1 | 8192 | + a38 | text | | | | extended | | zlib | 1 | 8192 | + a39 | bit(1) | | | | extended | | zlib | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 8192 | + a41 | smallint | | | | plain | | zlib | 1 | 8192 | + a42 | integer | | | | plain | | zlib | 1 | 8192 | +Partition of: co_cr_sub_partzlib8192_1_2_1_prt_df_p FOR VALUES FROM (1) TO (1001) +Partition constraint: ((NOT ((a2 IS NOT NULL) AND (a2 = ANY (ARRAY['C '::character(5), 'F '::character(5), 'M '::character(5)])))) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_2_1_prt_df_p_2_prt_2_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_2_1_prt_df_p_2_prt_2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column + +-- Insert data +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists co_cr_sub_partzlib8192_1_2_exch; +NOTICE: table "co_cr_sub_partzlib8192_1_2_exch" does not exist, skipping + CREATE TABLE co_cr_sub_partzlib8192_1_2_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Drop Table if exists co_cr_sub_partzlib8192_1_2_defexch; +NOTICE: table "co_cr_sub_partzlib8192_1_2_defexch" does not exist, skipping + CREATE TABLE co_cr_sub_partzlib8192_1_2_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Insert into co_cr_sub_partzlib8192_1_2_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where a1=10 and a2!='C'; +Insert into co_cr_sub_partzlib8192_1_2_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where a1 =10 and a2!='C'; +CREATE INDEX ON co_cr_sub_partzlib8192_1_2_exch USING bitmap (a1); +CREATE INDEX ON co_cr_sub_partzlib8192_1_2_exch(a9); +Alter table co_cr_sub_partzlib8192_1_2 alter partition p2 exchange partition FOR (1) with table co_cr_sub_partzlib8192_1_2_exch; +\d+ co_cr_sub_partzlib8192_1_2_1_prt_p2_2_prt_2 + Table "public.co_cr_sub_partzlib8192_1_2_1_prt_p2_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+-------------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_2_exch_id_seq'::regclass) | plain | | zlib | 1 | 32768 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 32768 | + a3 | numeric | | | | main | | zlib | 1 | 32768 | + a4 | boolean | | | false | plain | | zlib | 1 | 32768 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 32768 | + a6 | text | | | | extended | | zlib | 1 | 32768 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 32768 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 32768 | + a9 | bigint | | | | plain | | zlib | 1 | 32768 | + a10 | date | | | | plain | | zlib | 1 | 32768 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 32768 | + a12 | text | | | | extended | | zlib | 1 | 32768 | + a13 | numeric | | | | main | | zlib | 1 | 32768 | + a14 | real | | | | plain | | zlib | 1 | 32768 | + a15 | bigint | | | | plain | | zlib | 1 | 32768 | + a16 | integer | | | | plain | | zlib | 1 | 32768 | + a17 | bytea | | | | extended | | zlib | 1 | 32768 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 32768 | + a19 | time with time zone | | | | plain | | zlib | 1 | 32768 | + a20 | path | | | | extended | | zlib | 1 | 32768 | + a21 | box | | | | plain | | zlib | 1 | 32768 | + a22 | macaddr | | | | plain | | zlib | 1 | 32768 | + a23 | interval | | | | plain | | zlib | 1 | 32768 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 32768 | + a25 | lseg | | | | plain | | zlib | 1 | 32768 | + a26 | point | | | | plain | | zlib | 1 | 32768 | + a27 | double precision | | | | plain | | zlib | 1 | 32768 | + a28 | circle | | | | plain | | zlib | 1 | 32768 | + a29 | integer | | | | plain | | zlib | 1 | 32768 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 32768 | + a31 | polygon | | | | extended | | zlib | 1 | 32768 | + a32 | date | | | | plain | | zlib | 1 | 32768 | + a33 | real | | | | plain | | zlib | 1 | 32768 | + a34 | money | | | | plain | | zlib | 1 | 32768 | + a35 | cidr | | | | main | | zlib | 1 | 32768 | + a36 | inet | | | | main | | zlib | 1 | 32768 | + a37 | time without time zone | | | | plain | | zlib | 1 | 32768 | + a38 | text | | | | extended | | zlib | 1 | 32768 | + a39 | bit(1) | | | | extended | | zlib | 1 | 32768 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 32768 | + a41 | smallint | | | | plain | | zlib | 1 | 32768 | + a42 | integer | | | | plain | | zlib | 1 | 32768 | +Partition of: co_cr_sub_partzlib8192_1_2_1_prt_p2 FOR VALUES FROM (1) TO (1001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'M '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_2_exch_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_2_exch_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=zlib + +--Alter table Split Partition + Alter table co_cr_sub_partzlib8192_1_2 alter partition p1 split partition FOR (3001) at(4000) into (partition splita,partition splitb) ; +\d+ co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_splita + Table "public.co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_splita" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+--------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_cr_sub_partzlib8192_1_2_id_seq'::regclass) | plain | | zlib | 1 | 8192 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 8192 | + a3 | numeric | | | | main | | zlib | 1 | 8192 | + a4 | boolean | | | false | plain | | zlib | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 8192 | + a6 | text | | | | extended | | zlib | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 8192 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 8192 | + a9 | bigint | | | | plain | | zlib | 1 | 8192 | + a10 | date | | | | plain | | zlib | 1 | 8192 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 8192 | + a12 | text | | | | extended | | zlib | 1 | 8192 | + a13 | numeric | | | | main | | zlib | 1 | 8192 | + a14 | real | | | | plain | | zlib | 1 | 8192 | + a15 | bigint | | | | plain | | zlib | 1 | 8192 | + a16 | integer | | | | plain | | zlib | 1 | 8192 | + a17 | bytea | | | | extended | | zlib | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 8192 | + a19 | time with time zone | | | | plain | | zlib | 1 | 8192 | + a20 | path | | | | extended | | zlib | 1 | 8192 | + a21 | box | | | | plain | | zlib | 1 | 8192 | + a22 | macaddr | | | | plain | | zlib | 1 | 8192 | + a23 | interval | | | | plain | | zlib | 1 | 8192 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 8192 | + a25 | lseg | | | | plain | | zlib | 1 | 8192 | + a26 | point | | | | plain | | zlib | 1 | 8192 | + a27 | double precision | | | | plain | | zlib | 1 | 8192 | + a28 | circle | | | | plain | | zlib | 1 | 8192 | + a29 | integer | | | | plain | | zlib | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 8192 | + a31 | polygon | | | | extended | | zlib | 1 | 8192 | + a32 | date | | | | plain | | zlib | 1 | 8192 | + a33 | real | | | | plain | | zlib | 1 | 8192 | + a34 | money | | | | plain | | zlib | 1 | 8192 | + a35 | cidr | | | | main | | zlib | 1 | 8192 | + a36 | inet | | | | main | | zlib | 1 | 8192 | + a37 | time without time zone | | | | plain | | zlib | 1 | 8192 | + a38 | text | | | | extended | | zlib | 1 | 8192 | + a39 | bit(1) | | | | extended | | zlib | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 8192 | + a41 | smallint | | | | plain | | zlib | 1 | 8192 | + a42 | integer | | | | plain | | zlib | 1 | 8192 | +Partition of: co_cr_sub_partzlib8192_1_2_1_prt_p1 FOR VALUES FROM (3001) TO (4000) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'F '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 3001) AND (a1 < 4000)) +Checksum: t +Indexes: + "co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_splita_a1_idx" bitmap (a1) + "co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_splita_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column + +Select count(*) from co_cr_sub_partzlib8192_1_2; + count +------- + 5231 +(1 row) + +--Alter table Drop Partition +alter table co_cr_sub_partzlib8192_1_2 drop partition new_p; +-- Drop the default partition +alter table co_cr_sub_partzlib8192_1_2 drop default partition; +--Alter table alter type of a column +Alter table co_cr_sub_partzlib8192_1_2 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1_2; + count +------- + 232 +(1 row) + +--Alter table drop a column +Alter table co_cr_sub_partzlib8192_1_2 Drop column a12; +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1_2; + count +------- + 233 +(1 row) + +--Alter table rename a column +Alter table co_cr_sub_partzlib8192_1_2 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1_2; + count +------- + 234 +(1 row) + +--Alter table add a column +Alter table co_cr_sub_partzlib8192_1_2 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1_2; + count +------- + 235 +(1 row) + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_wt_sub_partrle_type8192_1 cascade; +NOTICE: table "co_wt_sub_partrle_type8192_1" does not exist, skipping +DROP TABLE if exists co_wt_sub_partrle_type8192_1_uncompr cascade; +NOTICE: table "co_wt_sub_partrle_type8192_1_uncompr" does not exist, skipping +-- +-- Create table +-- +CREATE TABLE co_wt_sub_partrle_type8192_1 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=column) Partition by range(a1) Subpartition by list(a2) subpartition template ( default subpartition df_sp, subpartition sp1 values('M') , subpartition sp2 values('F') + WITH (appendonly=true, orientation=column,compresstype=rle_type,compresslevel=1,blocksize=8192)) (start(1) end(5000) every(1000) ); +-- +-- Create Indexes +-- +CREATE INDEX co_wt_sub_partrle_type8192_1_idx_bitmap ON co_wt_sub_partrle_type8192_1 USING bitmap (a1); +CREATE INDEX co_wt_sub_partrle_type8192_1_idx_btree ON co_wt_sub_partrle_type8192_1(a9); +-- +-- Insert data to the table +-- +INSERT INTO co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +ANALYZE co_wt_sub_partrle_type8192_1; +--Create Uncompressed table of same schema definition +CREATE TABLE co_wt_sub_partrle_type8192_1_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column) Partition by range(a1) Subpartition by list(a2) subpartition template ( subpartition sp1 values('M') , subpartition sp2 values('F') ) (start(1) end(5000) every(1000)) ; +-- +-- Insert to uncompressed table +-- +INSERT INTO co_wt_sub_partrle_type8192_1_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_wt_sub_partrle_type8192_1_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +-- +-- ********Validation******* +-- +\d+ co_wt_sub_partrle_type8192_1_1_prt_1_2_prt_sp2 + Table "public.co_wt_sub_partrle_type8192_1_1_prt_1_2_prt_sp2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+----------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_id_seq'::regclass) | plain | | rle_type | 1 | 8192 | + a1 | integer | | | | plain | | rle_type | 1 | 8192 | + a2 | character(5) | | | | extended | | rle_type | 1 | 8192 | + a3 | numeric | | | | main | | rle_type | 1 | 8192 | + a4 | boolean | | | false | plain | | rle_type | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | rle_type | 1 | 8192 | + a6 | text | | | | extended | | rle_type | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | rle_type | 1 | 8192 | + a8 | character varying(705) | | | | extended | | rle_type | 1 | 8192 | + a9 | bigint | | | | plain | | rle_type | 1 | 8192 | + a10 | date | | | | plain | | rle_type | 1 | 8192 | + a11 | character varying(600) | | | | extended | | rle_type | 1 | 8192 | + a12 | text | | | | extended | | rle_type | 1 | 8192 | + a13 | numeric | | | | main | | rle_type | 1 | 8192 | + a14 | real | | | | plain | | rle_type | 1 | 8192 | + a15 | bigint | | | | plain | | rle_type | 1 | 8192 | + a16 | integer | | | | plain | | rle_type | 1 | 8192 | + a17 | bytea | | | | extended | | rle_type | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | rle_type | 1 | 8192 | + a19 | time with time zone | | | | plain | | rle_type | 1 | 8192 | + a20 | path | | | | extended | | rle_type | 1 | 8192 | + a21 | box | | | | plain | | rle_type | 1 | 8192 | + a22 | macaddr | | | | plain | | rle_type | 1 | 8192 | + a23 | interval | | | | plain | | rle_type | 1 | 8192 | + a24 | character varying(800) | | | | extended | | rle_type | 1 | 8192 | + a25 | lseg | | | | plain | | rle_type | 1 | 8192 | + a26 | point | | | | plain | | rle_type | 1 | 8192 | + a27 | double precision | | | | plain | | rle_type | 1 | 8192 | + a28 | circle | | | | plain | | rle_type | 1 | 8192 | + a29 | integer | | | | plain | | rle_type | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | rle_type | 1 | 8192 | + a31 | polygon | | | | extended | | rle_type | 1 | 8192 | + a32 | date | | | | plain | | rle_type | 1 | 8192 | + a33 | real | | | | plain | | rle_type | 1 | 8192 | + a34 | money | | | | plain | | rle_type | 1 | 8192 | + a35 | cidr | | | | main | | rle_type | 1 | 8192 | + a36 | inet | | | | main | | rle_type | 1 | 8192 | + a37 | time without time zone | | | | plain | | rle_type | 1 | 8192 | + a38 | text | | | | extended | | rle_type | 1 | 8192 | + a39 | bit(1) | | | | extended | | rle_type | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | rle_type | 1 | 8192 | + a41 | smallint | | | | plain | | rle_type | 1 | 8192 | + a42 | integer | | | | plain | | rle_type | 1 | 8192 | +Partition of: co_wt_sub_partrle_type8192_1_1_prt_1 FOR VALUES IN ('F ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001) AND (a2 IS NOT NULL) AND (a2 = 'F '::character(5))) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_1_prt_1_2_prt_sp2_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_1_prt_1_2_prt_sp2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=rle_type, compresslevel=1, blocksize=8192 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_wt_sub_partrle_type8192_1_uncompr ; + count_uncompressed +-------------------- + 1067 +(1 row) + +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_wt_sub_partrle_type8192_1; + count_compressed +------------------ + 1067 +(1 row) + +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_wt_sub_partrle_type8192_1 t1 full outer join co_wt_sub_partrle_type8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +-- +-- Truncate the table +-- +TRUNCATE table co_wt_sub_partrle_type8192_1; +-- +-- Insert data again +-- +insert into co_wt_sub_partrle_type8192_1 select * from co_wt_sub_partrle_type8192_1_uncompr order by a1; +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_wt_sub_partrle_type8192_1 t1 full outer join co_wt_sub_partrle_type8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +--Alter table Add Partition +alter table co_wt_sub_partrle_type8192_1 add partition new_p start(5050) end (6051) WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); +--Validation with psql utility + \d+ co_wt_sub_partrle_type8192_1_1_prt_new_p_2_prt_sp1 + Table "public.co_wt_sub_partrle_type8192_1_1_prt_new_p_2_prt_sp1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+----------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_id_seq'::regclass) | plain | | zlib | 1 | 32768 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 32768 | + a3 | numeric | | | | main | | zlib | 1 | 32768 | + a4 | boolean | | | false | plain | | zlib | 1 | 32768 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 32768 | + a6 | text | | | | extended | | zlib | 1 | 32768 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 32768 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 32768 | + a9 | bigint | | | | plain | | zlib | 1 | 32768 | + a10 | date | | | | plain | | zlib | 1 | 32768 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 32768 | + a12 | text | | | | extended | | zlib | 1 | 32768 | + a13 | numeric | | | | main | | zlib | 1 | 32768 | + a14 | real | | | | plain | | zlib | 1 | 32768 | + a15 | bigint | | | | plain | | zlib | 1 | 32768 | + a16 | integer | | | | plain | | zlib | 1 | 32768 | + a17 | bytea | | | | extended | | zlib | 1 | 32768 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 32768 | + a19 | time with time zone | | | | plain | | zlib | 1 | 32768 | + a20 | path | | | | extended | | zlib | 1 | 32768 | + a21 | box | | | | plain | | zlib | 1 | 32768 | + a22 | macaddr | | | | plain | | zlib | 1 | 32768 | + a23 | interval | | | | plain | | zlib | 1 | 32768 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 32768 | + a25 | lseg | | | | plain | | zlib | 1 | 32768 | + a26 | point | | | | plain | | zlib | 1 | 32768 | + a27 | double precision | | | | plain | | zlib | 1 | 32768 | + a28 | circle | | | | plain | | zlib | 1 | 32768 | + a29 | integer | | | | plain | | zlib | 1 | 32768 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 32768 | + a31 | polygon | | | | extended | | zlib | 1 | 32768 | + a32 | date | | | | plain | | zlib | 1 | 32768 | + a33 | real | | | | plain | | zlib | 1 | 32768 | + a34 | money | | | | plain | | zlib | 1 | 32768 | + a35 | cidr | | | | main | | zlib | 1 | 32768 | + a36 | inet | | | | main | | zlib | 1 | 32768 | + a37 | time without time zone | | | | plain | | zlib | 1 | 32768 | + a38 | text | | | | extended | | zlib | 1 | 32768 | + a39 | bit(1) | | | | extended | | zlib | 1 | 32768 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 32768 | + a41 | smallint | | | | plain | | zlib | 1 | 32768 | + a42 | integer | | | | plain | | zlib | 1 | 32768 | +Partition of: co_wt_sub_partrle_type8192_1_1_prt_new_p FOR VALUES IN ('M ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 5050) AND (a1 < 6051) AND (a2 IS NOT NULL) AND (a2 = 'M '::character(5))) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_1_prt_new_p_2_prt_sp1_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_1_prt_new_p_2_prt_sp1_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=zlib, compresslevel=1 + +alter table co_wt_sub_partrle_type8192_1 add default partition df_p ; +--Validation with psql utility + \d+ co_wt_sub_partrle_type8192_1_1_prt_df_p_2_prt_sp2 + Table "public.co_wt_sub_partrle_type8192_1_1_prt_df_p_2_prt_sp2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+----------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_id_seq'::regclass) | plain | | rle_type | 1 | 8192 | + a1 | integer | | | | plain | | rle_type | 1 | 8192 | + a2 | character(5) | | | | extended | | rle_type | 1 | 8192 | + a3 | numeric | | | | main | | rle_type | 1 | 8192 | + a4 | boolean | | | false | plain | | rle_type | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | rle_type | 1 | 8192 | + a6 | text | | | | extended | | rle_type | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | rle_type | 1 | 8192 | + a8 | character varying(705) | | | | extended | | rle_type | 1 | 8192 | + a9 | bigint | | | | plain | | rle_type | 1 | 8192 | + a10 | date | | | | plain | | rle_type | 1 | 8192 | + a11 | character varying(600) | | | | extended | | rle_type | 1 | 8192 | + a12 | text | | | | extended | | rle_type | 1 | 8192 | + a13 | numeric | | | | main | | rle_type | 1 | 8192 | + a14 | real | | | | plain | | rle_type | 1 | 8192 | + a15 | bigint | | | | plain | | rle_type | 1 | 8192 | + a16 | integer | | | | plain | | rle_type | 1 | 8192 | + a17 | bytea | | | | extended | | rle_type | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | rle_type | 1 | 8192 | + a19 | time with time zone | | | | plain | | rle_type | 1 | 8192 | + a20 | path | | | | extended | | rle_type | 1 | 8192 | + a21 | box | | | | plain | | rle_type | 1 | 8192 | + a22 | macaddr | | | | plain | | rle_type | 1 | 8192 | + a23 | interval | | | | plain | | rle_type | 1 | 8192 | + a24 | character varying(800) | | | | extended | | rle_type | 1 | 8192 | + a25 | lseg | | | | plain | | rle_type | 1 | 8192 | + a26 | point | | | | plain | | rle_type | 1 | 8192 | + a27 | double precision | | | | plain | | rle_type | 1 | 8192 | + a28 | circle | | | | plain | | rle_type | 1 | 8192 | + a29 | integer | | | | plain | | rle_type | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | rle_type | 1 | 8192 | + a31 | polygon | | | | extended | | rle_type | 1 | 8192 | + a32 | date | | | | plain | | rle_type | 1 | 8192 | + a33 | real | | | | plain | | rle_type | 1 | 8192 | + a34 | money | | | | plain | | rle_type | 1 | 8192 | + a35 | cidr | | | | main | | rle_type | 1 | 8192 | + a36 | inet | | | | main | | rle_type | 1 | 8192 | + a37 | time without time zone | | | | plain | | rle_type | 1 | 8192 | + a38 | text | | | | extended | | rle_type | 1 | 8192 | + a39 | bit(1) | | | | extended | | rle_type | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | rle_type | 1 | 8192 | + a41 | smallint | | | | plain | | rle_type | 1 | 8192 | + a42 | integer | | | | plain | | rle_type | 1 | 8192 | +Partition of: co_wt_sub_partrle_type8192_1_1_prt_df_p FOR VALUES IN ('F ') +Partition constraint: ((NOT ((a1 IS NOT NULL) AND (((a1 >= 1) AND (a1 < 1001)) OR ((a1 >= 1001) AND (a1 < 2001)) OR ((a1 >= 2001) AND (a1 < 3001)) OR ((a1 >= 3001) AND (a1 < 4001)) OR ((a1 >= 4001) AND (a1 < 5000)) OR ((a1 >= 5050) AND (a1 < 6051))))) AND (a2 IS NOT NULL) AND (a2 = 'F '::character(5))) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_1_prt_df_p_2_prt_sp2_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_1_prt_df_p_2_prt_sp2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=rle_type, compresslevel=1, blocksize=8192 + +-- Insert data +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists co_wt_sub_partrle_type8192_1_exch; +NOTICE: table "co_wt_sub_partrle_type8192_1_exch" does not exist, skipping + CREATE TABLE co_wt_sub_partrle_type8192_1_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Drop Table if exists co_wt_sub_partrle_type8192_1_defexch; +NOTICE: table "co_wt_sub_partrle_type8192_1_defexch" does not exist, skipping + CREATE TABLE co_wt_sub_partrle_type8192_1_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Insert into co_wt_sub_partrle_type8192_1_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where a1=10 and a2!='C'; +Insert into co_wt_sub_partrle_type8192_1_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where a1 =10 and a2!='C'; +CREATE INDEX ON co_wt_sub_partrle_type8192_1_exch USING bitmap (a1); +CREATE INDEX ON co_wt_sub_partrle_type8192_1_exch(a9); +Alter table co_wt_sub_partrle_type8192_1 alter partition FOR (1) exchange partition sp1 with table co_wt_sub_partrle_type8192_1_exch; +\d+ co_wt_sub_partrle_type8192_1_1_prt_1_2_prt_sp1 + Table "public.co_wt_sub_partrle_type8192_1_1_prt_1_2_prt_sp1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+---------------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_exch_id_seq'::regclass) | plain | | zlib | 1 | 32768 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 32768 | + a3 | numeric | | | | main | | zlib | 1 | 32768 | + a4 | boolean | | | false | plain | | zlib | 1 | 32768 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 32768 | + a6 | text | | | | extended | | zlib | 1 | 32768 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 32768 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 32768 | + a9 | bigint | | | | plain | | zlib | 1 | 32768 | + a10 | date | | | | plain | | zlib | 1 | 32768 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 32768 | + a12 | text | | | | extended | | zlib | 1 | 32768 | + a13 | numeric | | | | main | | zlib | 1 | 32768 | + a14 | real | | | | plain | | zlib | 1 | 32768 | + a15 | bigint | | | | plain | | zlib | 1 | 32768 | + a16 | integer | | | | plain | | zlib | 1 | 32768 | + a17 | bytea | | | | extended | | zlib | 1 | 32768 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 32768 | + a19 | time with time zone | | | | plain | | zlib | 1 | 32768 | + a20 | path | | | | extended | | zlib | 1 | 32768 | + a21 | box | | | | plain | | zlib | 1 | 32768 | + a22 | macaddr | | | | plain | | zlib | 1 | 32768 | + a23 | interval | | | | plain | | zlib | 1 | 32768 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 32768 | + a25 | lseg | | | | plain | | zlib | 1 | 32768 | + a26 | point | | | | plain | | zlib | 1 | 32768 | + a27 | double precision | | | | plain | | zlib | 1 | 32768 | + a28 | circle | | | | plain | | zlib | 1 | 32768 | + a29 | integer | | | | plain | | zlib | 1 | 32768 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 32768 | + a31 | polygon | | | | extended | | zlib | 1 | 32768 | + a32 | date | | | | plain | | zlib | 1 | 32768 | + a33 | real | | | | plain | | zlib | 1 | 32768 | + a34 | money | | | | plain | | zlib | 1 | 32768 | + a35 | cidr | | | | main | | zlib | 1 | 32768 | + a36 | inet | | | | main | | zlib | 1 | 32768 | + a37 | time without time zone | | | | plain | | zlib | 1 | 32768 | + a38 | text | | | | extended | | zlib | 1 | 32768 | + a39 | bit(1) | | | | extended | | zlib | 1 | 32768 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 32768 | + a41 | smallint | | | | plain | | zlib | 1 | 32768 | + a42 | integer | | | | plain | | zlib | 1 | 32768 | +Partition of: co_wt_sub_partrle_type8192_1_1_prt_1 FOR VALUES IN ('M ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001) AND (a2 IS NOT NULL) AND (a2 = 'M '::character(5))) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_exch_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_exch_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=zlib + +Select count(*) from co_wt_sub_partrle_type8192_1; + count +------- + 5231 +(1 row) + +--Alter table Drop Partition +alter table co_wt_sub_partrle_type8192_1 drop partition new_p; +-- Drop the default partition +alter table co_wt_sub_partrle_type8192_1 drop default partition; +--Alter table alter type of a column +Alter table co_wt_sub_partrle_type8192_1 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1; + count +------- + 5231 +(1 row) + +--Alter table drop a column +Alter table co_wt_sub_partrle_type8192_1 Drop column a12; +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1; + count +------- + 5232 +(1 row) + +--Alter table rename a column +Alter table co_wt_sub_partrle_type8192_1 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1; + count +------- + 5233 +(1 row) + +--Alter table add a column +Alter table co_wt_sub_partrle_type8192_1 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1; + count +------- + 5234 +(1 row) + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_wt_sub_partrle_type8192_1_2 cascade; +NOTICE: table "co_wt_sub_partrle_type8192_1_2" does not exist, skipping +DROP TABLE if exists co_wt_sub_partrle_type8192_1_2_uncompr cascade; +NOTICE: table "co_wt_sub_partrle_type8192_1_2_uncompr" does not exist, skipping +-- +-- Create table +-- +CREATE TABLE co_wt_sub_partrle_type8192_1_2 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=column) Partition by list(a2) Subpartition by range(a1) subpartition template (default subpartition df_sp, start(1) end(5000) every(1000) + WITH (appendonly=true, orientation=column,compresstype=rle_type,compresslevel=1,blocksize=8192)) (partition p1 values ('M'), partition p2 values ('F')); +-- +-- Create Indexes +-- +CREATE INDEX co_wt_sub_partrle_type8192_1_2_idx_bitmap ON co_wt_sub_partrle_type8192_1_2 USING bitmap (a1); +CREATE INDEX co_wt_sub_partrle_type8192_1_2_idx_btree ON co_wt_sub_partrle_type8192_1_2(a9); +-- +-- Insert data to the table +-- +INSERT INTO co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +--Create Uncompressed table of same schema definition +CREATE TABLE co_wt_sub_partrle_type8192_1_2_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column) Partition by list(a2) Subpartition by range(a1) subpartition template (start(1) end(5000) every(1000)) (default partition p1 , partition p2 values ('M') ); +-- +-- Insert to uncompressed table +-- +INSERT INTO co_wt_sub_partrle_type8192_1_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO co_wt_sub_partrle_type8192_1_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +-- +-- ********Validation******* +-- +\d+ co_wt_sub_partrle_type8192_1_2_1_prt_p1_2_prt_2 + Table "public.co_wt_sub_partrle_type8192_1_2_1_prt_p1_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_2_id_seq'::regclass) | plain | | rle_type | 1 | 8192 | + a1 | integer | | | | plain | | rle_type | 1 | 8192 | + a2 | character(5) | | | | extended | | rle_type | 1 | 8192 | + a3 | numeric | | | | main | | rle_type | 1 | 8192 | + a4 | boolean | | | false | plain | | rle_type | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | rle_type | 1 | 8192 | + a6 | text | | | | extended | | rle_type | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | rle_type | 1 | 8192 | + a8 | character varying(705) | | | | extended | | rle_type | 1 | 8192 | + a9 | bigint | | | | plain | | rle_type | 1 | 8192 | + a10 | date | | | | plain | | rle_type | 1 | 8192 | + a11 | character varying(600) | | | | extended | | rle_type | 1 | 8192 | + a12 | text | | | | extended | | rle_type | 1 | 8192 | + a13 | numeric | | | | main | | rle_type | 1 | 8192 | + a14 | real | | | | plain | | rle_type | 1 | 8192 | + a15 | bigint | | | | plain | | rle_type | 1 | 8192 | + a16 | integer | | | | plain | | rle_type | 1 | 8192 | + a17 | bytea | | | | extended | | rle_type | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | rle_type | 1 | 8192 | + a19 | time with time zone | | | | plain | | rle_type | 1 | 8192 | + a20 | path | | | | extended | | rle_type | 1 | 8192 | + a21 | box | | | | plain | | rle_type | 1 | 8192 | + a22 | macaddr | | | | plain | | rle_type | 1 | 8192 | + a23 | interval | | | | plain | | rle_type | 1 | 8192 | + a24 | character varying(800) | | | | extended | | rle_type | 1 | 8192 | + a25 | lseg | | | | plain | | rle_type | 1 | 8192 | + a26 | point | | | | plain | | rle_type | 1 | 8192 | + a27 | double precision | | | | plain | | rle_type | 1 | 8192 | + a28 | circle | | | | plain | | rle_type | 1 | 8192 | + a29 | integer | | | | plain | | rle_type | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | rle_type | 1 | 8192 | + a31 | polygon | | | | extended | | rle_type | 1 | 8192 | + a32 | date | | | | plain | | rle_type | 1 | 8192 | + a33 | real | | | | plain | | rle_type | 1 | 8192 | + a34 | money | | | | plain | | rle_type | 1 | 8192 | + a35 | cidr | | | | main | | rle_type | 1 | 8192 | + a36 | inet | | | | main | | rle_type | 1 | 8192 | + a37 | time without time zone | | | | plain | | rle_type | 1 | 8192 | + a38 | text | | | | extended | | rle_type | 1 | 8192 | + a39 | bit(1) | | | | extended | | rle_type | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | rle_type | 1 | 8192 | + a41 | smallint | | | | plain | | rle_type | 1 | 8192 | + a42 | integer | | | | plain | | rle_type | 1 | 8192 | +Partition of: co_wt_sub_partrle_type8192_1_2_1_prt_p1 FOR VALUES FROM (1) TO (1001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'M '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_2_1_prt_p1_2_prt_2_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_2_1_prt_p1_2_prt_2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=rle_type, compresslevel=1, blocksize=8192 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_wt_sub_partrle_type8192_1_2_uncompr ; + count_uncompressed +-------------------- + 1067 +(1 row) + +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_wt_sub_partrle_type8192_1_2; + count_compressed +------------------ + 1067 +(1 row) + +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_wt_sub_partrle_type8192_1_2 t1 full outer join co_wt_sub_partrle_type8192_1_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +-- +-- Truncate the table +-- +TRUNCATE table co_wt_sub_partrle_type8192_1_2; +-- +-- Insert data again +-- +insert into co_wt_sub_partrle_type8192_1_2 select * from co_wt_sub_partrle_type8192_1_2_uncompr order by a1; +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_wt_sub_partrle_type8192_1_2 t1 full outer join co_wt_sub_partrle_type8192_1_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +--Alter table Add Partition +alter table co_wt_sub_partrle_type8192_1_2 add partition new_p values('C') WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); +--Validation with psql utility + \d+ co_wt_sub_partrle_type8192_1_2_1_prt_new_p_2_prt_3 + Table "public.co_wt_sub_partrle_type8192_1_2_1_prt_new_p_2_prt_3" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_2_id_seq'::regclass) | plain | | rle_type | 1 | 8192 | + a1 | integer | | | | plain | | rle_type | 1 | 8192 | + a2 | character(5) | | | | extended | | rle_type | 1 | 8192 | + a3 | numeric | | | | main | | rle_type | 1 | 8192 | + a4 | boolean | | | false | plain | | rle_type | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | rle_type | 1 | 8192 | + a6 | text | | | | extended | | rle_type | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | rle_type | 1 | 8192 | + a8 | character varying(705) | | | | extended | | rle_type | 1 | 8192 | + a9 | bigint | | | | plain | | rle_type | 1 | 8192 | + a10 | date | | | | plain | | rle_type | 1 | 8192 | + a11 | character varying(600) | | | | extended | | rle_type | 1 | 8192 | + a12 | text | | | | extended | | rle_type | 1 | 8192 | + a13 | numeric | | | | main | | rle_type | 1 | 8192 | + a14 | real | | | | plain | | rle_type | 1 | 8192 | + a15 | bigint | | | | plain | | rle_type | 1 | 8192 | + a16 | integer | | | | plain | | rle_type | 1 | 8192 | + a17 | bytea | | | | extended | | rle_type | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | rle_type | 1 | 8192 | + a19 | time with time zone | | | | plain | | rle_type | 1 | 8192 | + a20 | path | | | | extended | | rle_type | 1 | 8192 | + a21 | box | | | | plain | | rle_type | 1 | 8192 | + a22 | macaddr | | | | plain | | rle_type | 1 | 8192 | + a23 | interval | | | | plain | | rle_type | 1 | 8192 | + a24 | character varying(800) | | | | extended | | rle_type | 1 | 8192 | + a25 | lseg | | | | plain | | rle_type | 1 | 8192 | + a26 | point | | | | plain | | rle_type | 1 | 8192 | + a27 | double precision | | | | plain | | rle_type | 1 | 8192 | + a28 | circle | | | | plain | | rle_type | 1 | 8192 | + a29 | integer | | | | plain | | rle_type | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | rle_type | 1 | 8192 | + a31 | polygon | | | | extended | | rle_type | 1 | 8192 | + a32 | date | | | | plain | | rle_type | 1 | 8192 | + a33 | real | | | | plain | | rle_type | 1 | 8192 | + a34 | money | | | | plain | | rle_type | 1 | 8192 | + a35 | cidr | | | | main | | rle_type | 1 | 8192 | + a36 | inet | | | | main | | rle_type | 1 | 8192 | + a37 | time without time zone | | | | plain | | rle_type | 1 | 8192 | + a38 | text | | | | extended | | rle_type | 1 | 8192 | + a39 | bit(1) | | | | extended | | rle_type | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | rle_type | 1 | 8192 | + a41 | smallint | | | | plain | | rle_type | 1 | 8192 | + a42 | integer | | | | plain | | rle_type | 1 | 8192 | +Partition of: co_wt_sub_partrle_type8192_1_2_1_prt_new_p FOR VALUES FROM (1001) TO (2001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'C '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1001) AND (a1 < 2001)) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_2_1_prt_new_p_2_prt_3_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_2_1_prt_new_p_2_prt_3_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=rle_type, compresslevel=1, blocksize=8192 + +alter table co_wt_sub_partrle_type8192_1_2 add default partition df_p ; +--Validation with psql utility + \d+ co_wt_sub_partrle_type8192_1_2_1_prt_df_p_2_prt_2 + Table "public.co_wt_sub_partrle_type8192_1_2_1_prt_df_p_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_2_id_seq'::regclass) | plain | | rle_type | 1 | 8192 | + a1 | integer | | | | plain | | rle_type | 1 | 8192 | + a2 | character(5) | | | | extended | | rle_type | 1 | 8192 | + a3 | numeric | | | | main | | rle_type | 1 | 8192 | + a4 | boolean | | | false | plain | | rle_type | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | rle_type | 1 | 8192 | + a6 | text | | | | extended | | rle_type | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | rle_type | 1 | 8192 | + a8 | character varying(705) | | | | extended | | rle_type | 1 | 8192 | + a9 | bigint | | | | plain | | rle_type | 1 | 8192 | + a10 | date | | | | plain | | rle_type | 1 | 8192 | + a11 | character varying(600) | | | | extended | | rle_type | 1 | 8192 | + a12 | text | | | | extended | | rle_type | 1 | 8192 | + a13 | numeric | | | | main | | rle_type | 1 | 8192 | + a14 | real | | | | plain | | rle_type | 1 | 8192 | + a15 | bigint | | | | plain | | rle_type | 1 | 8192 | + a16 | integer | | | | plain | | rle_type | 1 | 8192 | + a17 | bytea | | | | extended | | rle_type | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | rle_type | 1 | 8192 | + a19 | time with time zone | | | | plain | | rle_type | 1 | 8192 | + a20 | path | | | | extended | | rle_type | 1 | 8192 | + a21 | box | | | | plain | | rle_type | 1 | 8192 | + a22 | macaddr | | | | plain | | rle_type | 1 | 8192 | + a23 | interval | | | | plain | | rle_type | 1 | 8192 | + a24 | character varying(800) | | | | extended | | rle_type | 1 | 8192 | + a25 | lseg | | | | plain | | rle_type | 1 | 8192 | + a26 | point | | | | plain | | rle_type | 1 | 8192 | + a27 | double precision | | | | plain | | rle_type | 1 | 8192 | + a28 | circle | | | | plain | | rle_type | 1 | 8192 | + a29 | integer | | | | plain | | rle_type | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | rle_type | 1 | 8192 | + a31 | polygon | | | | extended | | rle_type | 1 | 8192 | + a32 | date | | | | plain | | rle_type | 1 | 8192 | + a33 | real | | | | plain | | rle_type | 1 | 8192 | + a34 | money | | | | plain | | rle_type | 1 | 8192 | + a35 | cidr | | | | main | | rle_type | 1 | 8192 | + a36 | inet | | | | main | | rle_type | 1 | 8192 | + a37 | time without time zone | | | | plain | | rle_type | 1 | 8192 | + a38 | text | | | | extended | | rle_type | 1 | 8192 | + a39 | bit(1) | | | | extended | | rle_type | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | rle_type | 1 | 8192 | + a41 | smallint | | | | plain | | rle_type | 1 | 8192 | + a42 | integer | | | | plain | | rle_type | 1 | 8192 | +Partition of: co_wt_sub_partrle_type8192_1_2_1_prt_df_p FOR VALUES FROM (1) TO (1001) +Partition constraint: ((NOT ((a2 IS NOT NULL) AND (a2 = ANY (ARRAY['C '::character(5), 'F '::character(5), 'M '::character(5)])))) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_2_1_prt_df_p_2_prt_2_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_2_1_prt_df_p_2_prt_2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=rle_type, compresslevel=1, blocksize=8192 + +-- Insert data +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists co_wt_sub_partrle_type8192_1_2_exch; +NOTICE: table "co_wt_sub_partrle_type8192_1_2_exch" does not exist, skipping + CREATE TABLE co_wt_sub_partrle_type8192_1_2_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Drop Table if exists co_wt_sub_partrle_type8192_1_2_defexch; +NOTICE: table "co_wt_sub_partrle_type8192_1_2_defexch" does not exist, skipping + CREATE TABLE co_wt_sub_partrle_type8192_1_2_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Insert into co_wt_sub_partrle_type8192_1_2_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where a1=10 and a2!='C'; +Insert into co_wt_sub_partrle_type8192_1_2_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where a1 =10 and a2!='C'; +CREATE INDEX ON co_wt_sub_partrle_type8192_1_2_exch USING bitmap (a1); +CREATE INDEX ON co_wt_sub_partrle_type8192_1_2_exch (a9); +Alter table co_wt_sub_partrle_type8192_1_2 alter partition p1 exchange partition FOR (1) with table co_wt_sub_partrle_type8192_1_2_exch; +\d+ co_wt_sub_partrle_type8192_1_2_1_prt_p1_2_prt_2 + Table "public.co_wt_sub_partrle_type8192_1_2_1_prt_p1_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+-----------------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_2_exch_id_seq'::regclass) | plain | | zlib | 1 | 32768 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 32768 | + a3 | numeric | | | | main | | zlib | 1 | 32768 | + a4 | boolean | | | false | plain | | zlib | 1 | 32768 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 32768 | + a6 | text | | | | extended | | zlib | 1 | 32768 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 32768 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 32768 | + a9 | bigint | | | | plain | | zlib | 1 | 32768 | + a10 | date | | | | plain | | zlib | 1 | 32768 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 32768 | + a12 | text | | | | extended | | zlib | 1 | 32768 | + a13 | numeric | | | | main | | zlib | 1 | 32768 | + a14 | real | | | | plain | | zlib | 1 | 32768 | + a15 | bigint | | | | plain | | zlib | 1 | 32768 | + a16 | integer | | | | plain | | zlib | 1 | 32768 | + a17 | bytea | | | | extended | | zlib | 1 | 32768 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 32768 | + a19 | time with time zone | | | | plain | | zlib | 1 | 32768 | + a20 | path | | | | extended | | zlib | 1 | 32768 | + a21 | box | | | | plain | | zlib | 1 | 32768 | + a22 | macaddr | | | | plain | | zlib | 1 | 32768 | + a23 | interval | | | | plain | | zlib | 1 | 32768 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 32768 | + a25 | lseg | | | | plain | | zlib | 1 | 32768 | + a26 | point | | | | plain | | zlib | 1 | 32768 | + a27 | double precision | | | | plain | | zlib | 1 | 32768 | + a28 | circle | | | | plain | | zlib | 1 | 32768 | + a29 | integer | | | | plain | | zlib | 1 | 32768 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 32768 | + a31 | polygon | | | | extended | | zlib | 1 | 32768 | + a32 | date | | | | plain | | zlib | 1 | 32768 | + a33 | real | | | | plain | | zlib | 1 | 32768 | + a34 | money | | | | plain | | zlib | 1 | 32768 | + a35 | cidr | | | | main | | zlib | 1 | 32768 | + a36 | inet | | | | main | | zlib | 1 | 32768 | + a37 | time without time zone | | | | plain | | zlib | 1 | 32768 | + a38 | text | | | | extended | | zlib | 1 | 32768 | + a39 | bit(1) | | | | extended | | zlib | 1 | 32768 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 32768 | + a41 | smallint | | | | plain | | zlib | 1 | 32768 | + a42 | integer | | | | plain | | zlib | 1 | 32768 | +Partition of: co_wt_sub_partrle_type8192_1_2_1_prt_p1 FOR VALUES FROM (1) TO (1001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'M '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_2_exch_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_2_exch_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=zlib + +--Alter table Split Partition + Alter table co_wt_sub_partrle_type8192_1_2 alter partition p2 split partition FOR (3001) at(4000) into (partition splita,partition splitb) ; +\d+ co_wt_sub_partrle_type8192_1_2_1_prt_p2_2_prt_splita + Table "public.co_wt_sub_partrle_type8192_1_2_1_prt_p2_2_prt_splita" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_wt_sub_partrle_type8192_1_2_id_seq'::regclass) | plain | | rle_type | 1 | 8192 | + a1 | integer | | | | plain | | rle_type | 1 | 8192 | + a2 | character(5) | | | | extended | | rle_type | 1 | 8192 | + a3 | numeric | | | | main | | rle_type | 1 | 8192 | + a4 | boolean | | | false | plain | | rle_type | 1 | 8192 | + a5 | character(1) | | | 'd'::bpchar | extended | | rle_type | 1 | 8192 | + a6 | text | | | | extended | | rle_type | 1 | 8192 | + a7 | timestamp without time zone | | | | plain | | rle_type | 1 | 8192 | + a8 | character varying(705) | | | | extended | | rle_type | 1 | 8192 | + a9 | bigint | | | | plain | | rle_type | 1 | 8192 | + a10 | date | | | | plain | | rle_type | 1 | 8192 | + a11 | character varying(600) | | | | extended | | rle_type | 1 | 8192 | + a12 | text | | | | extended | | rle_type | 1 | 8192 | + a13 | numeric | | | | main | | rle_type | 1 | 8192 | + a14 | real | | | | plain | | rle_type | 1 | 8192 | + a15 | bigint | | | | plain | | rle_type | 1 | 8192 | + a16 | integer | | | | plain | | rle_type | 1 | 8192 | + a17 | bytea | | | | extended | | rle_type | 1 | 8192 | + a18 | timestamp with time zone | | | | plain | | rle_type | 1 | 8192 | + a19 | time with time zone | | | | plain | | rle_type | 1 | 8192 | + a20 | path | | | | extended | | rle_type | 1 | 8192 | + a21 | box | | | | plain | | rle_type | 1 | 8192 | + a22 | macaddr | | | | plain | | rle_type | 1 | 8192 | + a23 | interval | | | | plain | | rle_type | 1 | 8192 | + a24 | character varying(800) | | | | extended | | rle_type | 1 | 8192 | + a25 | lseg | | | | plain | | rle_type | 1 | 8192 | + a26 | point | | | | plain | | rle_type | 1 | 8192 | + a27 | double precision | | | | plain | | rle_type | 1 | 8192 | + a28 | circle | | | | plain | | rle_type | 1 | 8192 | + a29 | integer | | | | plain | | rle_type | 1 | 8192 | + a30 | numeric(8,0) | | | | main | | rle_type | 1 | 8192 | + a31 | polygon | | | | extended | | rle_type | 1 | 8192 | + a32 | date | | | | plain | | rle_type | 1 | 8192 | + a33 | real | | | | plain | | rle_type | 1 | 8192 | + a34 | money | | | | plain | | rle_type | 1 | 8192 | + a35 | cidr | | | | main | | rle_type | 1 | 8192 | + a36 | inet | | | | main | | rle_type | 1 | 8192 | + a37 | time without time zone | | | | plain | | rle_type | 1 | 8192 | + a38 | text | | | | extended | | rle_type | 1 | 8192 | + a39 | bit(1) | | | | extended | | rle_type | 1 | 8192 | + a40 | bit varying(5) | | | | extended | | rle_type | 1 | 8192 | + a41 | smallint | | | | plain | | rle_type | 1 | 8192 | + a42 | integer | | | | plain | | rle_type | 1 | 8192 | +Partition of: co_wt_sub_partrle_type8192_1_2_1_prt_p2 FOR VALUES FROM (3001) TO (4000) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'F '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 3001) AND (a1 < 4000)) +Checksum: t +Indexes: + "co_wt_sub_partrle_type8192_1_2_1_prt_p2_2_prt_splita_a1_idx" bitmap (a1) + "co_wt_sub_partrle_type8192_1_2_1_prt_p2_2_prt_splita_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=rle_type, compresslevel=1, blocksize=8192 + +Select count(*) from co_wt_sub_partrle_type8192_1_2; + count +------- + 5231 +(1 row) + +--Alter table Drop Partition +alter table co_wt_sub_partrle_type8192_1_2 drop partition new_p; +-- Drop the default partition +alter table co_wt_sub_partrle_type8192_1_2 drop default partition; +--Alter table alter type of a column +Alter table co_wt_sub_partrle_type8192_1_2 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1_2; + count +------- + 232 +(1 row) + +--Alter table drop a column +Alter table co_wt_sub_partrle_type8192_1_2 Drop column a12; +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1_2; + count +------- + 233 +(1 row) + +--Alter table rename a column +Alter table co_wt_sub_partrle_type8192_1_2 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1_2; + count +------- + 234 +(1 row) + +--Alter table add a column +Alter table co_wt_sub_partrle_type8192_1_2 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1_2; + count +------- + 235 +(1 row) + +-- +-- Drop table if exists +-- +DROP TABLE if exists ao_wt_sub_partzlib8192_5 cascade; +NOTICE: table "ao_wt_sub_partzlib8192_5" does not exist, skipping +DROP TABLE if exists ao_wt_sub_partzlib8192_5_uncompr cascade; +NOTICE: table "ao_wt_sub_partzlib8192_5_uncompr" does not exist, skipping +-- +-- Create table +-- +CREATE TABLE ao_wt_sub_partzlib8192_5 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=row) Partition by range(a1) Subpartition by list(a2) subpartition template ( default subpartition df_sp, subpartition sp1 values('M') , subpartition sp2 values('F') + WITH (appendonly=true, orientation=row,compresstype=zlib,compresslevel=5,blocksize=8192)) (start(1) end(5000) every(1000) ); +-- +-- Create Indexes +-- +CREATE INDEX ao_wt_sub_partzlib8192_5_idx_bitmap ON ao_wt_sub_partzlib8192_5 USING bitmap (a1); +CREATE INDEX ao_wt_sub_partzlib8192_5_idx_btree ON ao_wt_sub_partzlib8192_5(a9); +-- +-- Insert data to the table +-- +INSERT INTO ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +ANALYZE ao_wt_sub_partzlib8192_5; +--Create Uncompressed table of same schema definition +CREATE TABLE ao_wt_sub_partzlib8192_5_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row) Partition by range(a1) Subpartition by list(a2) subpartition template ( subpartition sp1 values('M') , subpartition sp2 values('F') ) (start(1) end(5000) every(1000)) ; +-- +-- Insert to uncompressed table +-- +INSERT INTO ao_wt_sub_partzlib8192_5_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO ao_wt_sub_partzlib8192_5_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +-- +-- ********Validation******* +-- +\d+ ao_wt_sub_partzlib8192_5_1_prt_1_2_prt_sp2 + Table "public.ao_wt_sub_partzlib8192_5_1_prt_1_2_prt_sp2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Partition of: ao_wt_sub_partzlib8192_5_1_prt_1 FOR VALUES IN ('F ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001) AND (a2 IS NOT NULL) AND (a2 = 'F '::character(5))) +Compression Type: zlib +Compression Level: 5 +Block Size: 8192 +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_1_prt_1_2_prt_sp2_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_1_prt_1_2_prt_sp2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib, compresslevel=5, blocksize=8192 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from ao_wt_sub_partzlib8192_5_uncompr ; + count_uncompressed +-------------------- + 1067 +(1 row) + +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from ao_wt_sub_partzlib8192_5; + count_compressed +------------------ + 1067 +(1 row) + +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from ao_wt_sub_partzlib8192_5 t1 full outer join ao_wt_sub_partzlib8192_5_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +-- +-- Truncate the table +-- +TRUNCATE table ao_wt_sub_partzlib8192_5; +-- +-- Insert data again +-- +insert into ao_wt_sub_partzlib8192_5 select * from ao_wt_sub_partzlib8192_5_uncompr order by a1; +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from ao_wt_sub_partzlib8192_5 t1 full outer join ao_wt_sub_partzlib8192_5_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +--Alter table Add Partition +alter table ao_wt_sub_partzlib8192_5 add partition new_p start(5050) end (6051) WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); +--Validation with psql utility + \d+ ao_wt_sub_partzlib8192_5_1_prt_new_p_2_prt_sp1 + Table "public.ao_wt_sub_partzlib8192_5_1_prt_new_p_2_prt_sp1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------+----------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_id_seq'::regclass) | plain | | zlib | 1 | 32768 | + a1 | integer | | | | plain | | zlib | 1 | 32768 | + a2 | character(5) | | | | extended | | zlib | 1 | 32768 | + a3 | numeric | | | | main | | zlib | 1 | 32768 | + a4 | boolean | | | false | plain | | zlib | 1 | 32768 | + a5 | character(1) | | | 'd'::bpchar | extended | | zlib | 1 | 32768 | + a6 | text | | | | extended | | zlib | 1 | 32768 | + a7 | timestamp without time zone | | | | plain | | zlib | 1 | 32768 | + a8 | character varying(705) | | | | extended | | zlib | 1 | 32768 | + a9 | bigint | | | | plain | | zlib | 1 | 32768 | + a10 | date | | | | plain | | zlib | 1 | 32768 | + a11 | character varying(600) | | | | extended | | zlib | 1 | 32768 | + a12 | text | | | | extended | | zlib | 1 | 32768 | + a13 | numeric | | | | main | | zlib | 1 | 32768 | + a14 | real | | | | plain | | zlib | 1 | 32768 | + a15 | bigint | | | | plain | | zlib | 1 | 32768 | + a16 | integer | | | | plain | | zlib | 1 | 32768 | + a17 | bytea | | | | extended | | zlib | 1 | 32768 | + a18 | timestamp with time zone | | | | plain | | zlib | 1 | 32768 | + a19 | time with time zone | | | | plain | | zlib | 1 | 32768 | + a20 | path | | | | extended | | zlib | 1 | 32768 | + a21 | box | | | | plain | | zlib | 1 | 32768 | + a22 | macaddr | | | | plain | | zlib | 1 | 32768 | + a23 | interval | | | | plain | | zlib | 1 | 32768 | + a24 | character varying(800) | | | | extended | | zlib | 1 | 32768 | + a25 | lseg | | | | plain | | zlib | 1 | 32768 | + a26 | point | | | | plain | | zlib | 1 | 32768 | + a27 | double precision | | | | plain | | zlib | 1 | 32768 | + a28 | circle | | | | plain | | zlib | 1 | 32768 | + a29 | integer | | | | plain | | zlib | 1 | 32768 | + a30 | numeric(8,0) | | | | main | | zlib | 1 | 32768 | + a31 | polygon | | | | extended | | zlib | 1 | 32768 | + a32 | date | | | | plain | | zlib | 1 | 32768 | + a33 | real | | | | plain | | zlib | 1 | 32768 | + a34 | money | | | | plain | | zlib | 1 | 32768 | + a35 | cidr | | | | main | | zlib | 1 | 32768 | + a36 | inet | | | | main | | zlib | 1 | 32768 | + a37 | time without time zone | | | | plain | | zlib | 1 | 32768 | + a38 | text | | | | extended | | zlib | 1 | 32768 | + a39 | bit(1) | | | | extended | | zlib | 1 | 32768 | + a40 | bit varying(5) | | | | extended | | zlib | 1 | 32768 | + a41 | smallint | | | | plain | | zlib | 1 | 32768 | + a42 | integer | | | | plain | | zlib | 1 | 32768 | +Partition of: ao_wt_sub_partzlib8192_5_1_prt_new_p FOR VALUES IN ('M ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 5050) AND (a1 < 6051) AND (a2 IS NOT NULL) AND (a2 = 'M '::character(5))) +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_1_prt_new_p_2_prt_sp1_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_1_prt_new_p_2_prt_sp1_a9_idx" btree (a9) +Distributed randomly +Access method: ao_column +Options: compresstype=zlib, compresslevel=1 + +alter table ao_wt_sub_partzlib8192_5 add default partition df_p ; +--Validation with psql utility + \d+ ao_wt_sub_partzlib8192_5_1_prt_df_p_2_prt_sp2 + Table "public.ao_wt_sub_partzlib8192_5_1_prt_df_p_2_prt_sp2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Partition of: ao_wt_sub_partzlib8192_5_1_prt_df_p FOR VALUES IN ('F ') +Partition constraint: ((NOT ((a1 IS NOT NULL) AND (((a1 >= 1) AND (a1 < 1001)) OR ((a1 >= 1001) AND (a1 < 2001)) OR ((a1 >= 2001) AND (a1 < 3001)) OR ((a1 >= 3001) AND (a1 < 4001)) OR ((a1 >= 4001) AND (a1 < 5000)) OR ((a1 >= 5050) AND (a1 < 6051))))) AND (a2 IS NOT NULL) AND (a2 = 'F '::character(5))) +Compression Type: zlib +Compression Level: 5 +Block Size: 8192 +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_1_prt_df_p_2_prt_sp2_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_1_prt_df_p_2_prt_sp2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib, compresslevel=5, blocksize=8192 + +-- Insert data +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists ao_wt_sub_partzlib8192_5_exch; +NOTICE: table "ao_wt_sub_partzlib8192_5_exch" does not exist, skipping + CREATE TABLE ao_wt_sub_partzlib8192_5_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row, compresstype=zlib) ; + +Drop Table if exists ao_wt_sub_partzlib8192_5_defexch; +NOTICE: table "ao_wt_sub_partzlib8192_5_defexch" does not exist, skipping + CREATE TABLE ao_wt_sub_partzlib8192_5_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row, compresstype=zlib) ; + +Insert into ao_wt_sub_partzlib8192_5_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where a1=10 and a2!='C'; +Insert into ao_wt_sub_partzlib8192_5_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where a1 =10 and a2!='C'; +CREATE INDEX ON ao_wt_sub_partzlib8192_5_exch USING bitmap (a1); +CREATE INDEX ON ao_wt_sub_partzlib8192_5_exch (a9); +Alter table ao_wt_sub_partzlib8192_5 alter partition FOR (1) exchange partition sp1 with table ao_wt_sub_partzlib8192_5_exch; +\d+ ao_wt_sub_partzlib8192_5_1_prt_1_2_prt_sp1 + Table "public.ao_wt_sub_partzlib8192_5_1_prt_1_2_prt_sp1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+-----------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_exch_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Partition of: ao_wt_sub_partzlib8192_5_1_prt_1 FOR VALUES IN ('M ') +Partition constraint: ((a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001) AND (a2 IS NOT NULL) AND (a2 = 'M '::character(5))) +Compression Type: zlib +Compression Level: 1 +Block Size: 32768 +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_exch_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_exch_a9_idx" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib + +Select count(*) from ao_wt_sub_partzlib8192_5; + count +------- + 5231 +(1 row) + +--Alter table Drop Partition +alter table ao_wt_sub_partzlib8192_5 drop partition new_p; +-- Drop the default partition +alter table ao_wt_sub_partzlib8192_5 drop default partition; +--Alter table alter type of a column +Alter table ao_wt_sub_partzlib8192_5 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5; + count +------- + 5231 +(1 row) + +--Alter table drop a column +Alter table ao_wt_sub_partzlib8192_5 Drop column a12; +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5; + count +------- + 5232 +(1 row) + +--Alter table rename a column +Alter table ao_wt_sub_partzlib8192_5 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5; + count +------- + 5233 +(1 row) + +--Alter table add a column +Alter table ao_wt_sub_partzlib8192_5 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5; + count +------- + 5234 +(1 row) + +-- +-- Drop table if exists +-- +DROP TABLE if exists ao_wt_sub_partzlib8192_5_2 cascade; +NOTICE: table "ao_wt_sub_partzlib8192_5_2" does not exist, skipping +DROP TABLE if exists ao_wt_sub_partzlib8192_5_2_uncompr cascade; +NOTICE: table "ao_wt_sub_partzlib8192_5_2_uncompr" does not exist, skipping +-- +-- Create table +-- +CREATE TABLE ao_wt_sub_partzlib8192_5_2 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=row) Partition by list(a2) Subpartition by range(a1) subpartition template (default subpartition df_sp, start(1) end(5000) every(1000) + WITH (appendonly=true, orientation=row,compresstype=zlib,compresslevel=5,blocksize=8192)) (partition p1 values ('M'), partition p2 values ('F')); +-- +-- Create Indexes +-- +CREATE INDEX ao_wt_sub_partzlib8192_5_2_idx_bitmap ON ao_wt_sub_partzlib8192_5_2 USING bitmap (a1); +CREATE INDEX ao_wt_sub_partzlib8192_5_2_idx_btree ON ao_wt_sub_partzlib8192_5_2(a9); +-- +-- Insert data to the table +-- +INSERT INTO ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +--Create Uncompressed table of same schema definition +CREATE TABLE ao_wt_sub_partzlib8192_5_2_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row) Partition by list(a2) Subpartition by range(a1) subpartition template (start(1) end(5000) every(1000)) (default partition p1 , partition p2 values ('M') ); +-- +-- Insert to uncompressed table +-- +INSERT INTO ao_wt_sub_partzlib8192_5_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO ao_wt_sub_partzlib8192_5_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +-- +-- ********Validation******* +-- +\d+ ao_wt_sub_partzlib8192_5_2_1_prt_p1_2_prt_2 + Table "public.ao_wt_sub_partzlib8192_5_2_1_prt_p1_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+--------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_2_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Partition of: ao_wt_sub_partzlib8192_5_2_1_prt_p1 FOR VALUES FROM (1) TO (1001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'M '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Compression Type: zlib +Compression Level: 5 +Block Size: 8192 +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_2_1_prt_p1_2_prt_2_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_2_1_prt_p1_2_prt_2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib, compresslevel=5, blocksize=8192 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from ao_wt_sub_partzlib8192_5_2_uncompr ; + count_uncompressed +-------------------- + 1067 +(1 row) + +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from ao_wt_sub_partzlib8192_5_2; + count_compressed +------------------ + 1067 +(1 row) + +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from ao_wt_sub_partzlib8192_5_2 t1 full outer join ao_wt_sub_partzlib8192_5_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +-- +-- Truncate the table +-- +TRUNCATE table ao_wt_sub_partzlib8192_5_2; +-- +-- Insert data again +-- +insert into ao_wt_sub_partzlib8192_5_2 select * from ao_wt_sub_partzlib8192_5_2_uncompr order by a1; +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from ao_wt_sub_partzlib8192_5_2 t1 full outer join ao_wt_sub_partzlib8192_5_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +--Alter table Add Partition +alter table ao_wt_sub_partzlib8192_5_2 add partition new_p values('C') WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); +--Validation with psql utility + \d+ ao_wt_sub_partzlib8192_5_2_1_prt_new_p_2_prt_3 + Table "public.ao_wt_sub_partzlib8192_5_2_1_prt_new_p_2_prt_3" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+--------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_2_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Partition of: ao_wt_sub_partzlib8192_5_2_1_prt_new_p FOR VALUES FROM (1001) TO (2001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'C '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1001) AND (a1 < 2001)) +Compression Type: zlib +Compression Level: 5 +Block Size: 8192 +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_2_1_prt_new_p_2_prt_3_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_2_1_prt_new_p_2_prt_3_a9_idx" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib, compresslevel=5, blocksize=8192 + +alter table ao_wt_sub_partzlib8192_5_2 add default partition df_p ; +--Validation with psql utility + \d+ ao_wt_sub_partzlib8192_5_2_1_prt_df_p_2_prt_2 + Table "public.ao_wt_sub_partzlib8192_5_2_1_prt_df_p_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+--------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_2_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Partition of: ao_wt_sub_partzlib8192_5_2_1_prt_df_p FOR VALUES FROM (1) TO (1001) +Partition constraint: ((NOT ((a2 IS NOT NULL) AND (a2 = ANY (ARRAY['C '::character(5), 'F '::character(5), 'M '::character(5)])))) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Compression Type: zlib +Compression Level: 5 +Block Size: 8192 +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_2_1_prt_df_p_2_prt_2_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_2_1_prt_df_p_2_prt_2_a9_idx" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib, compresslevel=5, blocksize=8192 + +-- Insert data +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists ao_wt_sub_partzlib8192_5_2_exch; +NOTICE: table "ao_wt_sub_partzlib8192_5_2_exch" does not exist, skipping + CREATE TABLE ao_wt_sub_partzlib8192_5_2_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row, compresstype=zlib) ; + +Drop Table if exists ao_wt_sub_partzlib8192_5_2_defexch; +NOTICE: table "ao_wt_sub_partzlib8192_5_2_defexch" does not exist, skipping + CREATE TABLE ao_wt_sub_partzlib8192_5_2_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row, compresstype=zlib) ; + +Insert into ao_wt_sub_partzlib8192_5_2_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where a1=10 and a2!='C'; +Insert into ao_wt_sub_partzlib8192_5_2_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where a1 =10 and a2!='C'; +CREATE INDEX ON ao_wt_sub_partzlib8192_5_2_exch USING bitmap (a1); +CREATE INDEX ON ao_wt_sub_partzlib8192_5_2_exch (a9); +Alter table ao_wt_sub_partzlib8192_5_2 alter partition p1 exchange partition FOR (1) with table ao_wt_sub_partzlib8192_5_2_exch; +\d+ ao_wt_sub_partzlib8192_5_2_1_prt_p1_2_prt_2 + Table "public.ao_wt_sub_partzlib8192_5_2_1_prt_p1_2_prt_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+-------------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_2_exch_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Partition of: ao_wt_sub_partzlib8192_5_2_1_prt_p1 FOR VALUES FROM (1) TO (1001) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'M '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 1) AND (a1 < 1001)) +Compression Type: zlib +Compression Level: 1 +Block Size: 32768 +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_2_exch_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_2_exch_a9_idx" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib + +--Alter table Split Partition + Alter table ao_wt_sub_partzlib8192_5_2 alter partition p2 split partition FOR (3001) at(4000) into (partition splita,partition splitb) ; +\d+ ao_wt_sub_partzlib8192_5_2_1_prt_p2_2_prt_splita + Table "public.ao_wt_sub_partzlib8192_5_2_1_prt_p2_2_prt_splita" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+--------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_wt_sub_partzlib8192_5_2_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Partition of: ao_wt_sub_partzlib8192_5_2_1_prt_p2 FOR VALUES FROM (3001) TO (4000) +Partition constraint: ((a2 IS NOT NULL) AND (a2 = 'F '::character(5)) AND (a1 IS NOT NULL) AND (a1 >= 3001) AND (a1 < 4000)) +Compression Type: zlib +Compression Level: 5 +Block Size: 8192 +Checksum: t +Indexes: + "ao_wt_sub_partzlib8192_5_2_1_prt_p2_2_prt_splita_a1_idx" bitmap (a1) + "ao_wt_sub_partzlib8192_5_2_1_prt_p2_2_prt_splita_a9_idx" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib, compresslevel=5, blocksize=8192 + +Select count(*) from ao_wt_sub_partzlib8192_5_2; + count +------- + 5231 +(1 row) + +--Alter table Drop Partition +alter table ao_wt_sub_partzlib8192_5_2 drop partition new_p; +-- Drop the default partition +alter table ao_wt_sub_partzlib8192_5_2 drop default partition; +--Alter table alter type of a column +Alter table ao_wt_sub_partzlib8192_5_2 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5_2; + count +------- + 232 +(1 row) + +--Alter table drop a column +Alter table ao_wt_sub_partzlib8192_5_2 Drop column a12; +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5_2; + count +------- + 233 +(1 row) + +--Alter table rename a column +Alter table ao_wt_sub_partzlib8192_5_2 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5_2; + count +------- + 234 +(1 row) + +--Alter table add a column +Alter table ao_wt_sub_partzlib8192_5_2 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5_2; + count +------- + 235 +(1 row) + +-- +-- Drop table if exists +-- +DROP TABLE if exists ao_crtb_with_row_zlib_8192_1 cascade; +NOTICE: table "ao_crtb_with_row_zlib_8192_1" does not exist, skipping +DROP TABLE if exists ao_crtb_with_row_zlib_8192_1_uncompr cascade; +NOTICE: table "ao_crtb_with_row_zlib_8192_1_uncompr" does not exist, skipping +-- +-- Create table +-- +CREATE TABLE ao_crtb_with_row_zlib_8192_1 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=row,compresstype=zlib,compresslevel=1,blocksize=8192); +-- +-- Create Indexes +-- +CREATE INDEX ao_crtb_with_row_zlib_8192_1_idx_bitmap ON ao_crtb_with_row_zlib_8192_1 USING bitmap (a1); +CREATE INDEX ao_crtb_with_row_zlib_8192_1_idx_btree ON ao_crtb_with_row_zlib_8192_1(a9); +-- +-- Insert data to the table +-- +INSERT INTO ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +--Create Uncompressed table of same schema definition +CREATE TABLE ao_crtb_with_row_zlib_8192_1_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row); +-- +-- Insert to uncompressed table +-- +INSERT INTO ao_crtb_with_row_zlib_8192_1_uncompr select * from ao_crtb_with_row_zlib_8192_1; +-- +-- ********Validation******* +-- +\d+ ao_crtb_with_row_zlib_8192_1 + Table "public.ao_crtb_with_row_zlib_8192_1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+----------------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('ao_crtb_with_row_zlib_8192_1_id_seq'::regclass) | plain | | + a1 | integer | | | | plain | | + a2 | character(5) | | | | extended | | + a3 | numeric | | | | main | | + a4 | boolean | | | false | plain | | + a5 | character(1) | | | 'd'::bpchar | extended | | + a6 | text | | | | extended | | + a7 | timestamp without time zone | | | | plain | | + a8 | character varying(705) | | | | extended | | + a9 | bigint | | | | plain | | + a10 | date | | | | plain | | + a11 | character varying(600) | | | | extended | | + a12 | text | | | | extended | | + a13 | numeric | | | | main | | + a14 | real | | | | plain | | + a15 | bigint | | | | plain | | + a16 | integer | | | | plain | | + a17 | bytea | | | | extended | | + a18 | timestamp with time zone | | | | plain | | + a19 | time with time zone | | | | plain | | + a20 | path | | | | extended | | + a21 | box | | | | plain | | + a22 | macaddr | | | | plain | | + a23 | interval | | | | plain | | + a24 | character varying(800) | | | | extended | | + a25 | lseg | | | | plain | | + a26 | point | | | | plain | | + a27 | double precision | | | | plain | | + a28 | circle | | | | plain | | + a29 | integer | | | | plain | | + a30 | numeric(8,0) | | | | main | | + a31 | polygon | | | | extended | | + a32 | date | | | | plain | | + a33 | real | | | | plain | | + a34 | money | | | | plain | | + a35 | cidr | | | | main | | + a36 | inet | | | | main | | + a37 | time without time zone | | | | plain | | + a38 | text | | | | extended | | + a39 | bit(1) | | | | extended | | + a40 | bit varying(5) | | | | extended | | + a41 | smallint | | | | plain | | + a42 | integer | | | | plain | | +Compression Type: zlib +Compression Level: 1 +Block Size: 8192 +Checksum: t +Indexes: + "ao_crtb_with_row_zlib_8192_1_idx_bitmap" bitmap (a1) + "ao_crtb_with_row_zlib_8192_1_idx_btree" btree (a9) +Distributed randomly +Access method: ao_row +Options: compresstype=zlib, compresslevel=1, blocksize=8192 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from ao_crtb_with_row_zlib_8192_1_uncompr ; + count_uncompressed +-------------------- + 1067 +(1 row) + +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from ao_crtb_with_row_zlib_8192_1; + count_compressed +------------------ + 1067 +(1 row) + +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from ao_crtb_with_row_zlib_8192_1 t1 full outer join ao_crtb_with_row_zlib_8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +-- +-- Truncate the table +-- +TRUNCATE table ao_crtb_with_row_zlib_8192_1; +-- +-- Insert data again +-- +insert into ao_crtb_with_row_zlib_8192_1 select * from ao_crtb_with_row_zlib_8192_1_uncompr order by a1; +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from ao_crtb_with_row_zlib_8192_1 t1 full outer join ao_crtb_with_row_zlib_8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + count_join +------------ + 1067 +(1 row) + +--Alter table alter type of a column +Alter table ao_crtb_with_row_zlib_8192_1 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_crtb_with_row_zlib_8192_1 where id =10; +Select count(*) from ao_crtb_with_row_zlib_8192_1; + count +------- + 1068 +(1 row) + +--Alter table drop a column +Alter table ao_crtb_with_row_zlib_8192_1 Drop column a12; +Insert into ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_crtb_with_row_zlib_8192_1 where id =10; +Select count(*) from ao_crtb_with_row_zlib_8192_1; + count +------- + 1069 +(1 row) + +--Alter table rename a column +Alter table ao_crtb_with_row_zlib_8192_1 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_crtb_with_row_zlib_8192_1 where id =10; +Select count(*) from ao_crtb_with_row_zlib_8192_1; + count +------- + 1070 +(1 row) + +--Alter table add a column +Alter table ao_crtb_with_row_zlib_8192_1 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_crtb_with_row_zlib_8192_1 where id =10; +Select count(*) from ao_crtb_with_row_zlib_8192_1; + count +------- + 1071 +(1 row) + +--Drop table +DROP table ao_crtb_with_row_zlib_8192_1; +--Create table again and insert data +CREATE TABLE ao_crtb_with_row_zlib_8192_1 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=row,compresstype=zlib,compresslevel=1,blocksize=8192); +INSERT INTO ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); +INSERT INTO ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +--Alter table drop a column +Alter table ao_crtb_with_row_zlib_8192_1 Drop column a12; +--Create CTAS table + Drop table if exists ao_crtb_with_row_zlib_8192_1_ctas ; +NOTICE: table "ao_crtb_with_row_zlib_8192_1_ctas" does not exist, skipping +--Create a CTAS table +CREATE TABLE ao_crtb_with_row_zlib_8192_1_ctas WITH (appendonly=true, orientation=column) AS Select * from ao_crtb_with_row_zlib_8192_1; +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'id' as the Cloudberry Database 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. +DROP type if exists int_rle_type cascade ; +NOTICE: type "int_rle_type" does not exist, skipping +CREATE type int_rle_type; +CREATE FUNCTION int_rle_type_in(cstring) + RETURNS int_rle_type + AS 'int4in' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: return type int_rle_type is only a shell +CREATE FUNCTION int_rle_type_out(int_rle_type) + RETURNS cstring + AS 'int4out' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type int_rle_type is only a shell +CREATE TYPE int_rle_type( + input = int_rle_type_in , + output = int_rle_type_out , + internallength = 4, + default =55, + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +--Drop and recreate the data type + Drop type if exists int_rle_type cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function int_rle_type_in(cstring) +drop cascades to function int_rle_type_out(int_rle_type) +CREATE FUNCTION int_rle_type_in(cstring) + RETURNS int_rle_type + AS 'int4in' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: type "int_rle_type" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION int_rle_type_out(int_rle_type) + RETURNS cstring + AS 'int4out' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type int_rle_type is only a shell +CREATE TYPE int_rle_type( + input = int_rle_type_in , + output = int_rle_type_out , + internallength = 4, + default =55, + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +select typoptions from pg_type_encoding where typid='int_rle_type '::regtype; + typoptions +-------------------------------------------------------- + {compresstype=rle_type,blocksize=8192,compresslevel=4} +(1 row) + +DROP type if exists char_rle_type cascade ; +NOTICE: type "char_rle_type" does not exist, skipping +CREATE type char_rle_type; +CREATE FUNCTION char_rle_type_in(cstring) + RETURNS char_rle_type + AS 'charin' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: return type char_rle_type is only a shell +CREATE FUNCTION char_rle_type_out(char_rle_type) + RETURNS cstring + AS 'charout' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type char_rle_type is only a shell +CREATE TYPE char_rle_type( + input = char_rle_type_in , + output = char_rle_type_out , + internallength = 4, + default = 'asd' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +--Drop and recreate the data type + Drop type if exists char_rle_type cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function char_rle_type_in(cstring) +drop cascades to function char_rle_type_out(char_rle_type) +CREATE FUNCTION char_rle_type_in(cstring) + RETURNS char_rle_type + AS 'charin' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: type "char_rle_type" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION char_rle_type_out(char_rle_type) + RETURNS cstring + AS 'charout' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type char_rle_type is only a shell +CREATE TYPE char_rle_type( + input = char_rle_type_in , + output = char_rle_type_out , + internallength = 4, + default = 'asd' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +select typoptions from pg_type_encoding where typid='char_rle_type '::regtype; + typoptions +-------------------------------------------------------- + {compresstype=rle_type,blocksize=8192,compresslevel=4} +(1 row) + +DROP type if exists text_rle_type cascade ; +NOTICE: type "text_rle_type" does not exist, skipping +CREATE type text_rle_type; +CREATE FUNCTION text_rle_type_in(cstring) + RETURNS text_rle_type + AS 'textin' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: return type text_rle_type is only a shell +CREATE FUNCTION text_rle_type_out(text_rle_type) + RETURNS cstring + AS 'textout' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type text_rle_type is only a shell +CREATE TYPE text_rle_type( + input = text_rle_type_in , + output = text_rle_type_out , + internallength = variable, + default = 'hfkdshfkjsdhflkshadfkhsadflkh' , + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +--Drop and recreate the data type + Drop type if exists text_rle_type cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function text_rle_type_in(cstring) +drop cascades to function text_rle_type_out(text_rle_type) +CREATE FUNCTION text_rle_type_in(cstring) + RETURNS text_rle_type + AS 'textin' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: type "text_rle_type" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION text_rle_type_out(text_rle_type) + RETURNS cstring + AS 'textout' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type text_rle_type is only a shell +CREATE TYPE text_rle_type( + input = text_rle_type_in , + output = text_rle_type_out , + internallength = variable, + default = 'hfkdshfkjsdhflkshadfkhsadflkh' , + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +select typoptions from pg_type_encoding where typid='text_rle_type '::regtype; + typoptions +-------------------------------------------------------- + {compresstype=rle_type,blocksize=8192,compresslevel=4} +(1 row) + +DROP type if exists varchar_rle_type cascade ; +NOTICE: type "varchar_rle_type" does not exist, skipping +CREATE type varchar_rle_type; +CREATE FUNCTION varchar_rle_type_in(cstring) + RETURNS varchar_rle_type + AS 'varcharin' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: return type varchar_rle_type is only a shell +CREATE FUNCTION varchar_rle_type_out(varchar_rle_type) + RETURNS cstring + AS 'varcharout' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type varchar_rle_type is only a shell +CREATE TYPE varchar_rle_type( + input = varchar_rle_type_in , + output = varchar_rle_type_out , + internallength = variable, + default = 'ajhgdjagdjasdkjashk' , + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +--Drop and recreate the data type + Drop type if exists varchar_rle_type cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function varchar_rle_type_in(cstring) +drop cascades to function varchar_rle_type_out(varchar_rle_type) +CREATE FUNCTION varchar_rle_type_in(cstring) + RETURNS varchar_rle_type + AS 'varcharin' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: type "varchar_rle_type" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION varchar_rle_type_out(varchar_rle_type) + RETURNS cstring + AS 'varcharout' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type varchar_rle_type is only a shell +CREATE TYPE varchar_rle_type( + input = varchar_rle_type_in , + output = varchar_rle_type_out , + internallength = variable, + default = 'ajhgdjagdjasdkjashk' , + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +select typoptions from pg_type_encoding where typid='varchar_rle_type '::regtype; + typoptions +-------------------------------------------------------- + {compresstype=rle_type,blocksize=8192,compresslevel=4} +(1 row) + +DROP type if exists date_rle_type cascade ; +NOTICE: type "date_rle_type" does not exist, skipping +CREATE type date_rle_type; +CREATE FUNCTION date_rle_type_in(cstring) + RETURNS date_rle_type + AS 'date_in' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: return type date_rle_type is only a shell +CREATE FUNCTION date_rle_type_out(date_rle_type) + RETURNS cstring + AS 'date_out' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type date_rle_type is only a shell +CREATE TYPE date_rle_type( + input = date_rle_type_in , + output = date_rle_type_out , + internallength = 4, + default = '2001-12-11' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +--Drop and recreate the data type + Drop type if exists date_rle_type cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function date_rle_type_in(cstring) +drop cascades to function date_rle_type_out(date_rle_type) +CREATE FUNCTION date_rle_type_in(cstring) + RETURNS date_rle_type + AS 'date_in' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: type "date_rle_type" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION date_rle_type_out(date_rle_type) + RETURNS cstring + AS 'date_out' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type date_rle_type is only a shell +CREATE TYPE date_rle_type( + input = date_rle_type_in , + output = date_rle_type_out , + internallength = 4, + default = '2001-12-11' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +select typoptions from pg_type_encoding where typid='date_rle_type '::regtype; + typoptions +-------------------------------------------------------- + {compresstype=rle_type,blocksize=8192,compresslevel=4} +(1 row) + +DROP type if exists timestamp_rle_type cascade ; +NOTICE: type "timestamp_rle_type" does not exist, skipping +CREATE type timestamp_rle_type; +CREATE FUNCTION timestamp_rle_type_in(cstring) + RETURNS timestamp_rle_type + AS 'timestamp_in' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: return type timestamp_rle_type is only a shell +CREATE FUNCTION timestamp_rle_type_out(timestamp_rle_type) + RETURNS cstring + AS 'timestamp_out' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type timestamp_rle_type is only a shell +CREATE TYPE timestamp_rle_type( + input = timestamp_rle_type_in , + output = timestamp_rle_type_out , + internallength = 4, + default = '2001-12-24 02:26:11' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +--Drop and recreate the data type + Drop type if exists timestamp_rle_type cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function timestamp_rle_type_in(cstring) +drop cascades to function timestamp_rle_type_out(timestamp_rle_type) +CREATE FUNCTION timestamp_rle_type_in(cstring) + RETURNS timestamp_rle_type + AS 'timestamp_in' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: type "timestamp_rle_type" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION timestamp_rle_type_out(timestamp_rle_type) + RETURNS cstring + AS 'timestamp_out' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type timestamp_rle_type is only a shell +CREATE TYPE timestamp_rle_type( + input = timestamp_rle_type_in , + output = timestamp_rle_type_out , + internallength = 4, + default = '2001-12-24 02:26:11' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); +select typoptions from pg_type_encoding where typid='timestamp_rle_type '::regtype; + typoptions +-------------------------------------------------------- + {compresstype=rle_type,blocksize=8192,compresslevel=4} +(1 row) + +DROP table if exists co_create_type_rle_type_8192_4; +NOTICE: table "co_create_type_rle_type_8192_4" does not exist, skipping +-- Create table +CREATE TABLE co_create_type_rle_type_8192_4 + (id serial, a1 int_rle_type, a2 char_rle_type, a3 text_rle_type, a4 date_rle_type, a5 varchar_rle_type, a6 timestamp_rle_type ) WITH (appendonly=true, orientation=column); +\d+ co_create_type_rle_type_8192_4 + Table "public.co_create_type_rle_type_8192_4" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+--------------------+-----------+----------+------------------------------------------------------------+---------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_create_type_rle_type_8192_4_id_seq'::regclass) | plain | | none | 0 | 32768 | + a1 | int_rle_type | | | | plain | | rle_type | 4 | 8192 | + a2 | char_rle_type | | | | plain | | rle_type | 4 | 8192 | + a3 | text_rle_type | | | | plain | | rle_type | 4 | 8192 | + a4 | date_rle_type | | | | plain | | rle_type | 4 | 8192 | + a5 | varchar_rle_type | | | | plain | | rle_type | 4 | 8192 | + a6 | timestamp_rle_type | | | | plain | | rle_type | 4 | 8192 | +Checksum: t +Distributed randomly +Access method: ao_column + +INSERT into co_create_type_rle_type_8192_4 DEFAULT VALUES ; +--Select * from co_create_type_rle_type_8192_4; +Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +--Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +--Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +--Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +--Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +Select * from co_create_type_rle_type_8192_4; + id | a1 | a2 | a3 | a4 | a5 | a6 +----+----+----+-------------------------------+------------+---------------------+--------------------------------- + 1 | 55 | a | hfkdshfkjsdhflkshadfkhsadflkh | 12-11-2001 | ajhgdjagdjasdkjashk | Sat Jan 01 00:22:56.712384 2000 + 1 | 55 | a | hfkdshfkjsdhflkshadfkhsadflkh | 12-11-2001 | ajhgdjagdjasdkjashk | Sat Jan 01 00:22:56.712384 2000 + 1 | 55 | a | hfkdshfkjsdhflkshadfkhsadflkh | 12-11-2001 | ajhgdjagdjasdkjashk | Sat Jan 01 00:22:56.712384 2000 + 1 | 55 | a | hfkdshfkjsdhflkshadfkhsadflkh | 12-11-2001 | ajhgdjagdjasdkjashk | Sat Jan 01 00:22:56.712384 2000 +(4 rows) + +--Alter table drop a column +Alter table co_create_type_rle_type_8192_4 Drop column a2; +Insert into co_create_type_rle_type_8192_4(a1,a3,a4,a5,a6) select a1,a3,a4,a5,a6 from co_create_type_rle_type_8192_4 ; +Select count(*) from co_create_type_rle_type_8192_4; + count +------- + 8 +(1 row) + +--Alter table rename a column +Alter table co_create_type_rle_type_8192_4 Rename column a3 TO after_rename_a3; +--Insert data to the table, select count(*) +Insert into co_create_type_rle_type_8192_4(a1,after_rename_a3,a4,a5,a6) select a1,after_rename_a3,a4,a5,a6 from co_create_type_rle_type_8192_4 ; +Select count(*) from co_create_type_rle_type_8192_4; + count +------- + 16 +(1 row) + +Alter type int_rle_type set default encoding (compresstype=zlib,compresslevel=1); +--Add a column + Alter table co_create_type_rle_type_8192_4 Add column new_cl int_rle_type default '5'; +\d+ co_create_type_rle_type_8192_4 + Table "public.co_create_type_rle_type_8192_4" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +-----------------+--------------------+-----------+----------+------------------------------------------------------------+---------+--------------+------------------+-------------------+------------+------------- + id | integer | | not null | nextval('co_create_type_rle_type_8192_4_id_seq'::regclass) | plain | | none | 0 | 32768 | + a1 | int_rle_type | | | | plain | | rle_type | 4 | 8192 | + after_rename_a3 | text_rle_type | | | | plain | | rle_type | 4 | 8192 | + a4 | date_rle_type | | | | plain | | rle_type | 4 | 8192 | + a5 | varchar_rle_type | | | | plain | | rle_type | 4 | 8192 | + a6 | timestamp_rle_type | | | | plain | | rle_type | 4 | 8192 | + new_cl | int_rle_type | | | '5'::int_rle_type | plain | | zlib | 1 | 32768 | +Checksum: t +Distributed randomly +Access method: ao_column + +Insert into co_create_type_rle_type_8192_4(a1,after_rename_a3,a4,a5,a6) select a1,after_rename_a3,a4,a5,a6 from co_create_type_rle_type_8192_4 ; +Select count(*) from co_create_type_rle_type_8192_4; + count +------- + 32 +(1 row) + +-- Given an AO/CO with zlib type compression +Drop table if exists mpp17012_compress_test2; +NOTICE: table "mpp17012_compress_test2" does not exist, skipping +create table mpp17012_compress_test2 ( +col1 character(2), +col2 int, +col3 varchar, +col4 character(44), +DEFAULT COLUMN ENCODING (COMPRESSTYPE=zlib, compresslevel=5) +) +WITH (APPENDONLY=true, ORIENTATION=column, OIDS=FALSE); +select pg_size_pretty(pg_relation_size('mpp17012_compress_test2')), +get_ao_compression_ratio('mpp17012_compress_test2'); + pg_size_pretty | get_ao_compression_ratio +----------------+-------------------------- + 0 bytes | -1 +(1 row) + +\d+ mpp17012_compress_test2 + Table "public.mpp17012_compress_test2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+-------------------+-----------+----------+---------+----------+--------------+------------------+-------------------+------------+------------- + col1 | character(2) | | | | extended | | zlib | 5 | 32768 | + col2 | integer | | | | plain | | zlib | 5 | 32768 | + col3 | character varying | | | | extended | | zlib | 5 | 32768 | + col4 | character(44) | | | | extended | | zlib | 5 | 32768 | +Checksum: t +Distributed by: (col1) +Access method: ao_column + +-- When I insert data +insert into mpp17012_compress_test2 values('a',generate_series(1,250),'ksjdhfksdhfksdhfksjhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh','bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'); +-- Then the data will be compressed according to a consistent compression ratio +select pg_size_pretty(pg_relation_size('mpp17012_compress_test2')), +get_ao_compression_ratio('mpp17012_compress_test2'); + pg_size_pretty | get_ao_compression_ratio +----------------+-------------------------- + 712 bytes | 36.75 +(1 row) + +-- Test that an AO/CO table with compresstype zlib and invalid compress level will error at create +create table a_aoco_table_with_zlib_and_invalid_compression_level(col text) WITH (APPENDONLY=true, COMPRESSTYPE=zlib, compresslevel=-1, ORIENTATION=column); +ERROR: value -1 out of bounds for option "compresslevel" +DETAIL: Valid values are between "0" and "19". +-- Check that callbacks are registered +SELECT * FROM pg_compression WHERE compname='zlib'; + compname | compconstructor | compdestructor | compcompressor | compdecompressor | compvalidator | compowner +----------+---------------------+--------------------+------------------+--------------------+-------------------+----------- + zlib | gp_zlib_constructor | gp_zlib_destructor | gp_zlib_compress | gp_zlib_decompress | gp_zlib_validator | 10 +(1 row) + +-- Given an AO/CO with RLE type compression +create table a_aoco_table_with_rle_type_compression(col int) WITH (APPENDONLY=true, COMPRESSTYPE=rle_type, compresslevel=1, ORIENTATION=column); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'col' as the Cloudberry Database 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. +select pg_size_pretty(pg_relation_size('a_aoco_table_with_rle_type_compression')), + get_ao_compression_ratio('a_aoco_table_with_rle_type_compression'); + pg_size_pretty | get_ao_compression_ratio +----------------+-------------------------- + 0 bytes | -1 +(1 row) + +-- When I insert data +insert into a_aoco_table_with_rle_type_compression select i from generate_series(1,100)i; +-- Then the data will be compressed according to a consistent compression ratio +select pg_size_pretty(pg_relation_size('a_aoco_table_with_rle_type_compression')), + get_ao_compression_ratio('a_aoco_table_with_rle_type_compression'); + pg_size_pretty | get_ao_compression_ratio +----------------+-------------------------- + 176 bytes | 2.55 +(1 row) + +-- Test that an AO/CO table with compresstype rle and invalid compress level will error at create +create table a_aoco_table_with_rle_type_and_invalid_compression_level(col int) WITH (APPENDONLY=true, COMPRESSTYPE=rle_type, compresslevel=-1, ORIENTATION=column); +ERROR: value -1 out of bounds for option "compresslevel" +DETAIL: Valid values are between "0" and "19". +-- Check that callbacks are registered +SELECT * FROM pg_compression WHERE compname='rle_type'; + compname | compconstructor | compdestructor | compcompressor | compdecompressor | compvalidator | compowner +----------+-------------------------+------------------------+----------------------+------------------------+-----------------------+----------- + rle_type | gp_rle_type_constructor | gp_rle_type_destructor | gp_rle_type_compress | gp_rle_type_decompress | gp_rle_type_validator | 10 +(1 row) + diff --git a/src/test/singlenode_regress/expected/AORO_Compression.out b/src/test/singlenode_regress/expected/AORO_Compression.out new file mode 100644 index 00000000000..0bec66a11cd --- /dev/null +++ b/src/test/singlenode_regress/expected/AORO_Compression.out @@ -0,0 +1,27 @@ +-- Test basic create table for AO/RO table succeeds for zlib compression +-- Given a row-oriented table with compresstype zlib +CREATE TABLE a_aoro_table_with_zlib_compression(col int) WITH (APPENDONLY=true, COMPRESSTYPE=zlib, COMPRESSLEVEL=1, ORIENTATION=row); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'col' as the Cloudberry Database 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. +SELECT pg_size_pretty(pg_relation_size('a_aoro_table_with_zlib_compression')), + get_ao_compression_ratio('a_aoro_table_with_zlib_compression'); + pg_size_pretty | get_ao_compression_ratio +----------------+-------------------------- + 0 bytes | 1 +(1 row) + +-- When I insert data +INSERT INTO a_aoro_table_with_zlib_compression SELECT i from generate_series(1, 100)i; +-- Then the data will be compressed according to a consistent compression ratio +SELECT pg_size_pretty(pg_relation_size('a_aoro_table_with_zlib_compression')), + get_ao_compression_ratio('a_aoro_table_with_zlib_compression'); + pg_size_pretty | get_ao_compression_ratio +----------------+-------------------------- + 392 bytes | 2.63 +(1 row) + +-- Test basic create table for AO/RO table fails for rle compression. rle is only supported for columnar tables. +CREATE TABLE a_aoro_table_with_rle_type_compression(col int) WITH (APPENDONLY=true, COMPRESSTYPE=rle_type, COMPRESSLEVEL=1, ORIENTATION=row); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'col' as the Cloudberry Database 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. +ERROR: rle_type cannot be used with Append Only relations row orientation diff --git a/src/test/singlenode_regress/expected/advisory_lock.out b/src/test/singlenode_regress/expected/advisory_lock.out new file mode 100644 index 00000000000..2a2df6f7e4b --- /dev/null +++ b/src/test/singlenode_regress/expected/advisory_lock.out @@ -0,0 +1,275 @@ +-- +-- ADVISORY LOCKS +-- +BEGIN; +SELECT + pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), + pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); + pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock | pg_advisory_xact_lock_shared +-----------------------+------------------------------+-----------------------+------------------------------ + | | | +(1 row) + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + locktype | classid | objid | objsubid | mode | granted +----------+---------+-------+----------+---------------+--------- + advisory | 0 | 1 | 1 | ExclusiveLock | t + advisory | 0 | 2 | 1 | ShareLock | t + advisory | 1 | 1 | 2 | ExclusiveLock | t + advisory | 2 | 2 | 2 | ShareLock | t +(4 rows) + +-- pg_advisory_unlock_all() shouldn't release xact locks +SELECT pg_advisory_unlock_all(); + pg_advisory_unlock_all +------------------------ + +(1 row) + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + count +------- + 4 +(1 row) + +-- can't unlock xact locks +SELECT + pg_advisory_unlock(1), pg_advisory_unlock_shared(2), + pg_advisory_unlock(1, 1), pg_advisory_unlock_shared(2, 2); +WARNING: you don't own a lock of type ExclusiveLock +WARNING: you don't own a lock of type ShareLock +WARNING: you don't own a lock of type ExclusiveLock +WARNING: you don't own a lock of type ShareLock + pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock | pg_advisory_unlock_shared +--------------------+---------------------------+--------------------+--------------------------- + f | f | f | f +(1 row) + +-- automatically release xact locks at commit +COMMIT; +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + count +------- + 0 +(1 row) + +BEGIN; +-- holding both session and xact locks on the same objects, xact first +SELECT + pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), + pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); + pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock | pg_advisory_xact_lock_shared +-----------------------+------------------------------+-----------------------+------------------------------ + | | | +(1 row) + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + locktype | classid | objid | objsubid | mode | granted +----------+---------+-------+----------+---------------+--------- + advisory | 0 | 1 | 1 | ExclusiveLock | t + advisory | 0 | 2 | 1 | ShareLock | t + advisory | 1 | 1 | 2 | ExclusiveLock | t + advisory | 2 | 2 | 2 | ShareLock | t +(4 rows) + +SELECT + pg_advisory_lock(1), pg_advisory_lock_shared(2), + pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2); + pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock | pg_advisory_lock_shared +------------------+-------------------------+------------------+------------------------- + | | | +(1 row) + +ROLLBACK; +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + locktype | classid | objid | objsubid | mode | granted +----------+---------+-------+----------+---------------+--------- + advisory | 0 | 1 | 1 | ExclusiveLock | t + advisory | 0 | 2 | 1 | ShareLock | t + advisory | 1 | 1 | 2 | ExclusiveLock | t + advisory | 2 | 2 | 2 | ShareLock | t +(4 rows) + +-- unlocking session locks +SELECT + pg_advisory_unlock(1), pg_advisory_unlock(1), + pg_advisory_unlock_shared(2), pg_advisory_unlock_shared(2), + pg_advisory_unlock(1, 1), pg_advisory_unlock(1, 1), + pg_advisory_unlock_shared(2, 2), pg_advisory_unlock_shared(2, 2); +WARNING: you don't own a lock of type ExclusiveLock +WARNING: you don't own a lock of type ShareLock +WARNING: you don't own a lock of type ExclusiveLock +WARNING: you don't own a lock of type ShareLock + pg_advisory_unlock | pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock_shared | pg_advisory_unlock | pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock_shared +--------------------+--------------------+---------------------------+---------------------------+--------------------+--------------------+---------------------------+--------------------------- + t | f | t | f | t | f | t | f +(1 row) + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + count +------- + 0 +(1 row) + +BEGIN; +-- holding both session and xact locks on the same objects, session first +SELECT + pg_advisory_lock(1), pg_advisory_lock_shared(2), + pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2); + pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock | pg_advisory_lock_shared +------------------+-------------------------+------------------+------------------------- + | | | +(1 row) + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + locktype | classid | objid | objsubid | mode | granted +----------+---------+-------+----------+---------------+--------- + advisory | 0 | 1 | 1 | ExclusiveLock | t + advisory | 0 | 2 | 1 | ShareLock | t + advisory | 1 | 1 | 2 | ExclusiveLock | t + advisory | 2 | 2 | 2 | ShareLock | t +(4 rows) + +SELECT + pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), + pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); + pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock | pg_advisory_xact_lock_shared +-----------------------+------------------------------+-----------------------+------------------------------ + | | | +(1 row) + +ROLLBACK; +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + locktype | classid | objid | objsubid | mode | granted +----------+---------+-------+----------+---------------+--------- + advisory | 0 | 1 | 1 | ExclusiveLock | t + advisory | 0 | 2 | 1 | ShareLock | t + advisory | 1 | 1 | 2 | ExclusiveLock | t + advisory | 2 | 2 | 2 | ShareLock | t +(4 rows) + +-- releasing all session locks +SELECT pg_advisory_unlock_all(); + pg_advisory_unlock_all +------------------------ + +(1 row) + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + count +------- + 0 +(1 row) + +BEGIN; +-- grabbing txn locks multiple times +SELECT + pg_advisory_xact_lock(1), pg_advisory_xact_lock(1), + pg_advisory_xact_lock_shared(2), pg_advisory_xact_lock_shared(2), + pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock(1, 1), + pg_advisory_xact_lock_shared(2, 2), pg_advisory_xact_lock_shared(2, 2); + pg_advisory_xact_lock | pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock_shared | pg_advisory_xact_lock | pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock_shared +-----------------------+-----------------------+------------------------------+------------------------------+-----------------------+-----------------------+------------------------------+------------------------------ + | | | | | | | +(1 row) + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + locktype | classid | objid | objsubid | mode | granted +----------+---------+-------+----------+---------------+--------- + advisory | 0 | 1 | 1 | ExclusiveLock | t + advisory | 0 | 2 | 1 | ShareLock | t + advisory | 1 | 1 | 2 | ExclusiveLock | t + advisory | 2 | 2 | 2 | ShareLock | t +(4 rows) + +COMMIT; +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + count +------- + 0 +(1 row) + +-- grabbing session locks multiple times +SELECT + pg_advisory_lock(1), pg_advisory_lock(1), + pg_advisory_lock_shared(2), pg_advisory_lock_shared(2), + pg_advisory_lock(1, 1), pg_advisory_lock(1, 1), + pg_advisory_lock_shared(2, 2), pg_advisory_lock_shared(2, 2); + pg_advisory_lock | pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock_shared | pg_advisory_lock | pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock_shared +------------------+------------------+-------------------------+-------------------------+------------------+------------------+-------------------------+------------------------- + | | | | | | | +(1 row) + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + locktype | classid | objid | objsubid | mode | granted +----------+---------+-------+----------+---------------+--------- + advisory | 0 | 1 | 1 | ExclusiveLock | t + advisory | 0 | 2 | 1 | ShareLock | t + advisory | 1 | 1 | 2 | ExclusiveLock | t + advisory | 2 | 2 | 2 | ShareLock | t +(4 rows) + +SELECT + pg_advisory_unlock(1), pg_advisory_unlock(1), + pg_advisory_unlock_shared(2), pg_advisory_unlock_shared(2), + pg_advisory_unlock(1, 1), pg_advisory_unlock(1, 1), + pg_advisory_unlock_shared(2, 2), pg_advisory_unlock_shared(2, 2); + pg_advisory_unlock | pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock_shared | pg_advisory_unlock | pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock_shared +--------------------+--------------------+---------------------------+---------------------------+--------------------+--------------------+---------------------------+--------------------------- + t | t | t | t | t | t | t | t +(1 row) + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + count +------- + 0 +(1 row) + +-- .. and releasing them all at once +SELECT + pg_advisory_lock(1), pg_advisory_lock(1), + pg_advisory_lock_shared(2), pg_advisory_lock_shared(2), + pg_advisory_lock(1, 1), pg_advisory_lock(1, 1), + pg_advisory_lock_shared(2, 2), pg_advisory_lock_shared(2, 2); + pg_advisory_lock | pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock_shared | pg_advisory_lock | pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock_shared +------------------+------------------+-------------------------+-------------------------+------------------+------------------+-------------------------+------------------------- + | | | | | | | +(1 row) + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + locktype | classid | objid | objsubid | mode | granted +----------+---------+-------+----------+---------------+--------- + advisory | 0 | 1 | 1 | ExclusiveLock | t + advisory | 0 | 2 | 1 | ShareLock | t + advisory | 1 | 1 | 2 | ExclusiveLock | t + advisory | 2 | 2 | 2 | ShareLock | t +(4 rows) + +SELECT pg_advisory_unlock_all(); + pg_advisory_unlock_all +------------------------ + +(1 row) + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + count +------- + 0 +(1 row) + diff --git a/src/test/singlenode_regress/expected/agg_pushdown.out b/src/test/singlenode_regress/expected/agg_pushdown.out new file mode 100644 index 00000000000..debe4d5c685 --- /dev/null +++ b/src/test/singlenode_regress/expected/agg_pushdown.out @@ -0,0 +1,1055 @@ +-- disable ORCA +SET optimizer TO off; +-- Test case group 1: basic functions +CREATE TABLE agg_pushdown_parent ( + i int primary key, + x int); +CREATE TABLE agg_pushdown_child1 ( + j int, + parent int, + v double precision, + PRIMARY KEY (j, parent)); +CREATE INDEX ON agg_pushdown_child1(parent); +CREATE TABLE agg_pushdown_child2 ( + k int, + parent int, + v double precision, + PRIMARY KEY (k, parent));; +INSERT INTO agg_pushdown_parent(i, x) +SELECT n, n +FROM generate_series(0, 7) AS s(n); +INSERT INTO agg_pushdown_child1(j, parent, v) +SELECT 128 * i + n, i, random() +FROM generate_series(0, 127) AS s(n), agg_pushdown_parent; +INSERT INTO agg_pushdown_child2(k, parent, v) +SELECT 128 * i + n, i, random() +FROM generate_series(0, 127) AS s(n), agg_pushdown_parent; +ANALYZE agg_pushdown_parent; +ANALYZE agg_pushdown_child1; +ANALYZE agg_pushdown_child2; +SET enable_nestloop TO on; +SET enable_hashjoin TO off; +SET enable_mergejoin TO off; +-- Perform scan of a table, aggregate the result, join it to the other table +-- and finalize the aggregation. +-- +-- In addition, check that functionally dependent column "p.x" can be +-- referenced by SELECT although GROUP BY references "p.i". +SET gp_enable_agg_pushdown TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.x, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------- + HashAggregate + Output: p.x, avg(c1.v), p.i + Group Key: p.i + -> Nested Loop + Output: p.i, p.x, c1.v + Inner Unique: true + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Memoize + Output: p.x, p.i + Cache Key: c1.parent + Cache Mode: logical + -> Index Scan using agg_pushdown_parent_pkey on public.agg_pushdown_parent p + Output: p.x, p.i + Index Cond: (p.i = c1.parent) + Settings: enable_hashjoin = 'off', enable_mergejoin = 'off', enable_nestloop = 'on', gp_enable_agg_pushdown = 'off', optimizer = 'off' + Optimizer: Postgres query optimizer +(17 rows) + +SET gp_enable_agg_pushdown TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.x, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: p.x, avg(c1.v), p.i + Group Key: p.i + -> Sort + Output: p.i, p.x, (PARTIAL avg(c1.v)) + Sort Key: p.i + -> Nested Loop + Output: p.i, p.x, (PARTIAL avg(c1.v)) + Inner Unique: true + -> Partial HashAggregate + Output: c1.parent, PARTIAL avg(c1.v) + Group Key: c1.parent + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Index Scan using agg_pushdown_parent_pkey on public.agg_pushdown_parent p + Output: p.i, p.x + Index Cond: (p.i = c1.parent) + Settings: enable_hashjoin = 'off', enable_mergejoin = 'off', enable_nestloop = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(19 rows) + +-- The same for hash join. +SET enable_nestloop TO off; +SET enable_hashjoin TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: p.i, avg(c1.v) + Group Key: p.i + -> Sort + Output: p.i, (PARTIAL avg(c1.v)) + Sort Key: p.i + -> Hash Join + Output: p.i, (PARTIAL avg(c1.v)) + Hash Cond: (p.i = c1.parent) + -> Seq Scan on public.agg_pushdown_parent p + Output: p.i, p.x + -> Hash + Output: c1.parent, (PARTIAL avg(c1.v)) + -> Partial HashAggregate + Output: c1.parent, PARTIAL avg(c1.v) + Group Key: c1.parent + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(20 rows) + +-- The same for merge join. +SET enable_hashjoin TO off; +SET enable_mergejoin TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: p.i, avg(c1.v) + Group Key: p.i + -> Merge Join + Output: p.i, (PARTIAL avg(c1.v)) + Merge Cond: (p.i = c1.parent) + -> Sort + Output: p.i + Sort Key: p.i + -> Seq Scan on public.agg_pushdown_parent p + Output: p.i + -> Sort + Output: c1.parent, (PARTIAL avg(c1.v)) + Sort Key: c1.parent + -> Partial HashAggregate + Output: c1.parent, PARTIAL avg(c1.v) + Group Key: c1.parent + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + Settings: enable_hashjoin = 'off', enable_mergejoin = 'on', enable_nestloop = 'off', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(21 rows) + +-- Restore the default values. +SET enable_nestloop TO on; +SET enable_hashjoin TO on; +-- Scan index on agg_pushdown_child1(parent) column and aggregate the result +-- using AGG_SORTED strategy. +SET gp_enable_agg_pushdown TO off; +SET enable_seqscan TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + HashAggregate + Output: p.i, avg(c1.v) + Group Key: p.i + -> Nested Loop + Output: p.i, c1.v + Inner Unique: true + -> Bitmap Heap Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Bitmap Index Scan on agg_pushdown_child1_parent_idx + -> Memoize + Output: p.i + Cache Key: c1.parent + Cache Mode: logical + -> Index Only Scan using agg_pushdown_parent_pkey on public.agg_pushdown_parent p + Output: p.i + Index Cond: (p.i = c1.parent) + Settings: enable_hashjoin = 'on', enable_mergejoin = 'on', enable_nestloop = 'on', enable_seqscan = 'off', gp_enable_agg_pushdown = 'off', optimizer = 'off' + Optimizer: Postgres query optimizer +(18 rows) + +SET gp_enable_agg_pushdown TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: p.i, avg(c1.v) + Group Key: p.i + -> Sort + Output: p.i, (PARTIAL avg(c1.v)) + Sort Key: p.i + -> Nested Loop + Output: p.i, (PARTIAL avg(c1.v)) + Inner Unique: true + -> Partial HashAggregate + Output: c1.parent, PARTIAL avg(c1.v) + Group Key: c1.parent + -> Bitmap Heap Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Bitmap Index Scan on agg_pushdown_child1_parent_idx + -> Index Only Scan using agg_pushdown_parent_pkey on public.agg_pushdown_parent p + Output: p.i + Index Cond: (p.i = c1.parent) + Settings: enable_hashjoin = 'on', enable_mergejoin = 'on', enable_nestloop = 'on', enable_seqscan = 'off', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(20 rows) + +SET enable_seqscan TO on; +-- Join "c1" to "p.x" column, i.e. one that is not in the GROUP BY clause. The +-- planner should still use "c1.parent" as grouping expression for partial +-- aggregation, although it's not in the same equivalence class as the GROUP +-- BY expression ("p.i"). The reason to use "c1.parent" for partial +-- aggregation is that this is the only way for "c1" to provide the join +-- expression with input data. +SET gp_enable_agg_pushdown TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.x GROUP BY p.i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + HashAggregate + Output: p.i, avg(c1.v) + Group Key: p.i + -> Hash Join + Output: p.i, c1.v + Hash Cond: (c1.parent = p.x) + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Hash + Output: p.i, p.x + -> Seq Scan on public.agg_pushdown_parent p + Output: p.i, p.x + Settings: enable_hashjoin = 'on', enable_mergejoin = 'on', enable_nestloop = 'on', enable_seqscan = 'on', gp_enable_agg_pushdown = 'off', optimizer = 'off' + Optimizer: Postgres query optimizer +(14 rows) + +SET gp_enable_agg_pushdown TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.x GROUP BY p.i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------ + Finalize GroupAggregate + Output: p.i, avg(c1.v) + Group Key: p.i + -> Sort + Output: p.i, (PARTIAL avg(c1.v)) + Sort Key: p.i + -> Hash Join + Output: p.i, (PARTIAL avg(c1.v)) + Hash Cond: (p.x = c1.parent) + -> Seq Scan on public.agg_pushdown_parent p + Output: p.i, p.x + -> Hash + Output: c1.parent, (PARTIAL avg(c1.v)) + -> Partial HashAggregate + Output: c1.parent, PARTIAL avg(c1.v) + Group Key: c1.parent + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + Settings: enable_hashjoin = 'on', enable_mergejoin = 'on', enable_nestloop = 'on', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(20 rows) + +-- Perform nestloop join between agg_pushdown_child1 and agg_pushdown_child2 +-- and aggregate the result. +SET enable_nestloop TO on; +SET enable_hashjoin TO off; +SET enable_mergejoin TO off; +SET gp_enable_agg_pushdown TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v + c2.v) FROM agg_pushdown_parent AS p JOIN +agg_pushdown_child1 AS c1 ON c1.parent = p.i JOIN agg_pushdown_child2 AS c2 ON +c2.parent = p.i WHERE c1.j = c2.k GROUP BY p.i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------- + HashAggregate + Output: p.i, avg((c1.v + c2.v)) + Group Key: p.i + -> Nested Loop + Output: p.i, c1.v, c2.v + Inner Unique: true + -> Nested Loop + Output: c1.v, c1.parent, c2.v, c2.parent + Inner Unique: true + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Index Scan using agg_pushdown_child2_pkey on public.agg_pushdown_child2 c2 + Output: c2.k, c2.parent, c2.v + Index Cond: ((c2.k = c1.j) AND (c2.parent = c1.parent)) + -> Memoize + Output: p.i + Cache Key: c1.parent + Cache Mode: logical + -> Index Only Scan using agg_pushdown_parent_pkey on public.agg_pushdown_parent p + Output: p.i + Index Cond: (p.i = c1.parent) + Settings: enable_hashjoin = 'off', enable_mergejoin = 'off', enable_nestloop = 'on', enable_seqscan = 'on', gp_enable_agg_pushdown = 'off', optimizer = 'off' + Optimizer: Postgres query optimizer +(23 rows) + +SET gp_enable_agg_pushdown TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v + c2.v) FROM agg_pushdown_parent AS p JOIN +agg_pushdown_child1 AS c1 ON c1.parent = p.i JOIN agg_pushdown_child2 AS c2 ON +c2.parent = p.i WHERE c1.j = c2.k GROUP BY p.i; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: p.i, avg((c1.v + c2.v)) + Group Key: p.i + -> Sort + Output: p.i, (PARTIAL avg((c1.v + c2.v))) + Sort Key: p.i + -> Nested Loop + Output: p.i, (PARTIAL avg((c1.v + c2.v))) + Inner Unique: true + -> Partial HashAggregate + Output: c1.parent, c2.parent, PARTIAL avg((c1.v + c2.v)) + Group Key: c1.parent + -> Nested Loop + Output: c1.v, c1.parent, c2.v, c2.parent + Inner Unique: true + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Index Scan using agg_pushdown_child2_pkey on public.agg_pushdown_child2 c2 + Output: c2.k, c2.parent, c2.v + Index Cond: ((c2.k = c1.j) AND (c2.parent = c1.parent)) + -> Index Only Scan using agg_pushdown_parent_pkey on public.agg_pushdown_parent p + Output: p.i + Index Cond: (p.i = c1.parent) + Settings: enable_hashjoin = 'off', enable_mergejoin = 'off', enable_nestloop = 'on', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(25 rows) + +-- The same for hash join. +SET enable_nestloop TO off; +SET enable_hashjoin TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v + c2.v) FROM agg_pushdown_parent AS p JOIN +agg_pushdown_child1 AS c1 ON c1.parent = p.i JOIN agg_pushdown_child2 AS c2 ON +c2.parent = p.i WHERE c1.j = c2.k GROUP BY p.i; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: p.i, avg((c1.v + c2.v)) + Group Key: p.i + -> Sort + Output: p.i, (PARTIAL avg((c1.v + c2.v))) + Sort Key: p.i + -> Hash Join + Output: p.i, (PARTIAL avg((c1.v + c2.v))) + Hash Cond: (p.i = c1.parent) + -> Seq Scan on public.agg_pushdown_parent p + Output: p.i, p.x + -> Hash + Output: c1.parent, c2.parent, (PARTIAL avg((c1.v + c2.v))) + -> Partial HashAggregate + Output: c1.parent, c2.parent, PARTIAL avg((c1.v + c2.v)) + Group Key: c1.parent + -> Hash Join + Output: c1.v, c1.parent, c2.v, c2.parent + Inner Unique: true + Hash Cond: ((c1.parent = c2.parent) AND (c1.j = c2.k)) + -> Seq Scan on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Hash + Output: c2.v, c2.parent, c2.k + -> Seq Scan on public.agg_pushdown_child2 c2 + Output: c2.v, c2.parent, c2.k + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(28 rows) + +-- The same for merge join. +SET enable_hashjoin TO off; +SET enable_mergejoin TO on; +SET enable_seqscan TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v + c2.v) FROM agg_pushdown_parent AS p JOIN +agg_pushdown_child1 AS c1 ON c1.parent = p.i JOIN agg_pushdown_child2 AS c2 ON +c2.parent = p.i WHERE c1.j = c2.k GROUP BY p.i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: p.i, avg((c1.v + c2.v)) + Group Key: p.i + -> Merge Join + Output: p.i, (PARTIAL avg((c1.v + c2.v))) + Inner Unique: true + Merge Cond: (c1.parent = p.i) + -> Sort + Output: c1.parent, c2.parent, (PARTIAL avg((c1.v + c2.v))) + Sort Key: c1.parent + -> Partial HashAggregate + Output: c1.parent, c2.parent, PARTIAL avg((c1.v + c2.v)) + Group Key: c1.parent + -> Merge Join + Output: c1.v, c1.parent, c2.v, c2.parent + Inner Unique: true + Merge Cond: ((c1.j = c2.k) AND (c1.parent = c2.parent)) + -> Index Scan using agg_pushdown_child1_pkey on public.agg_pushdown_child1 c1 + Output: c1.j, c1.parent, c1.v + -> Index Scan using agg_pushdown_child2_pkey on public.agg_pushdown_child2 c2 + Output: c2.k, c2.parent, c2.v + -> Index Only Scan using agg_pushdown_parent_pkey on public.agg_pushdown_parent p + Output: p.i + Settings: enable_hashjoin = 'off', enable_mergejoin = 'on', enable_nestloop = 'off', enable_seqscan = 'off', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(25 rows) + +SET enable_seqscan TO on; +-- Clear tables +DROP TABLE agg_pushdown_child1; +DROP TABLE agg_pushdown_child2; +DROP TABLE agg_pushdown_parent; +-- Test case group 2: Pushdown with different join keys and group keys. +DROP TABLE IF EXISTS t1, t2; +NOTICE: table "t1" does not exist, skipping +NOTICE: table "t2" does not exist, skipping +CREATE TABLE t1 (id int, val int, comment VARCHAR(20)); +CREATE TABLE t2 (id int, val int); +SET enable_nestloop TO off; +SET enable_hashjoin TO on; +SET enable_mergejoin TO off; +SET gp_enable_agg_pushdown TO ON; +-- Join key and group key are the same. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t1.id; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize HashAggregate + Output: t1.id, sum(t1.val) + Group Key: t1.id + -> Hash Join + Output: t1.id, (PARTIAL sum(t1.val)) + Hash Cond: (t2.id = t1.id) + -> Seq Scan on public.t2 + Output: t2.id, t2.val + -> Hash + Output: t1.id, (PARTIAL sum(t1.val)) + -> Partial HashAggregate + Output: t1.id, PARTIAL sum(t1.val) + Group Key: t1.id + -> Seq Scan on public.t1 + Output: t1.id, t1.val, t1.comment + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(17 rows) + +-- Join key and group key are different. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.val, SUM(t1.id) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t1.val; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize HashAggregate + Output: t1.val, sum(t1.id) + Group Key: t1.val + -> Hash Join + Output: t1.val, (PARTIAL sum(t1.id)) + Hash Cond: (t2.id = t1.id) + -> Seq Scan on public.t2 + Output: t2.id, t2.val + -> Hash + Output: t1.val, t1.id, (PARTIAL sum(t1.id)) + -> Partial HashAggregate + Output: t1.val, t1.id, PARTIAL sum(t1.id) + Group Key: t1.val, t1.id + -> Seq Scan on public.t1 + Output: t1.id, t1.val, t1.comment + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(17 rows) + +-- Pushdown with equivclass. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t2.id, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t2.id; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize HashAggregate + Output: t2.id, sum(t1.val) + Group Key: t2.id + -> Hash Join + Output: t2.id, (PARTIAL sum(t1.val)) + Hash Cond: (t2.id = t1.id) + -> Seq Scan on public.t2 + Output: t2.id, t2.val + -> Hash + Output: t1.id, (PARTIAL sum(t1.val)) + -> Partial HashAggregate + Output: t1.id, PARTIAL sum(t1.val) + Group Key: t1.id + -> Seq Scan on public.t1 + Output: t1.id, t1.val, t1.comment + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(17 rows) + +-- Group by column from t2 and aggregate column from t1. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t2.val, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t2.val; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize HashAggregate + Output: t2.val, sum(t1.val) + Group Key: t2.val + -> Hash Join + Output: t2.val, (PARTIAL sum(t1.val)) + Hash Cond: (t2.id = t1.id) + -> Seq Scan on public.t2 + Output: t2.id, t2.val + -> Hash + Output: t1.id, (PARTIAL sum(t1.val)) + -> Partial HashAggregate + Output: t1.id, PARTIAL sum(t1.val) + Group Key: t1.id + -> Seq Scan on public.t1 + Output: t1.id, t1.val, t1.comment + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(17 rows) + +-- Pushdown with multiply group keys. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, t1.comment, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t1.id, t1.comment; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize HashAggregate + Output: t1.id, t1.comment, sum(t1.val) + Group Key: t1.id, t1.comment + -> Hash Join + Output: t1.id, t1.comment, (PARTIAL sum(t1.val)) + Hash Cond: (t2.id = t1.id) + -> Seq Scan on public.t2 + Output: t2.id, t2.val + -> Hash + Output: t1.id, t1.comment, (PARTIAL sum(t1.val)) + -> Partial HashAggregate + Output: t1.id, t1.comment, PARTIAL sum(t1.val) + Group Key: t1.id, t1.comment + -> Seq Scan on public.t1 + Output: t1.id, t1.val, t1.comment + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(17 rows) + +-- Pushdown with multiply join keys. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, t1.comment, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id and t1.val = t2.val GROUP BY t1.id, t1.comment; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: t1.id, t1.comment, sum(t1.val) + Group Key: t1.id, t1.comment + -> Sort + Output: t1.id, t1.comment, (PARTIAL sum(t1.val)) + Sort Key: t1.id, t1.comment + -> Hash Join + Output: t1.id, t1.comment, (PARTIAL sum(t1.val)) + Hash Cond: ((t2.id = t1.id) AND (t2.val = t1.val)) + -> Seq Scan on public.t2 + Output: t2.id, t2.val + -> Hash + Output: t1.id, t1.comment, t1.val, (PARTIAL sum(t1.val)) + -> Partial HashAggregate + Output: t1.id, t1.comment, t1.val, PARTIAL sum(t1.val) + Group Key: t1.id, t1.comment, t1.val + -> Seq Scan on public.t1 + Output: t1.id, t1.val, t1.comment + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(20 rows) + +-- Test above case with different data distributions +INSERT INTO t1 SELECT i, i, 'asd' FROM generate_series(1, 10000) s(i); +ANALYZE t1; +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, t1.comment, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id and t1.val = t2.val GROUP BY t1.id, t1.comment; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + GroupAggregate + Output: t1.id, t1.comment, sum(t1.val) + Group Key: t1.id, t1.comment + -> Sort + Output: t1.id, t1.comment, t1.val + Sort Key: t1.id, t1.comment + -> Hash Join + Output: t1.id, t1.comment, t1.val + Hash Cond: ((t2.id = t1.id) AND (t2.val = t1.val)) + -> Seq Scan on public.t2 + Output: t2.id, t2.val + -> Hash + Output: t1.id, t1.comment, t1.val + -> Seq Scan on public.t1 + Output: t1.id, t1.comment, t1.val + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(17 rows) + +DELETE FROM t1; +INSERT INTO t1 SELECT i % 10, 1, 'asd' FROM generate_series(1, 10000) s(i); +ANALYZE t1; +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, t1.comment, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id and t1.val = t2.val GROUP BY t1.id, t1.comment; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: t1.id, t1.comment, sum(t1.val) + Group Key: t1.id, t1.comment + -> Sort + Output: t1.id, t1.comment, (PARTIAL sum(t1.val)) + Sort Key: t1.id, t1.comment + -> Hash Join + Output: t1.id, t1.comment, (PARTIAL sum(t1.val)) + Hash Cond: ((t2.id = t1.id) AND (t2.val = t1.val)) + -> Seq Scan on public.t2 + Output: t2.id, t2.val + -> Hash + Output: t1.id, t1.comment, t1.val, (PARTIAL sum(t1.val)) + -> Partial HashAggregate + Output: t1.id, t1.comment, t1.val, PARTIAL sum(t1.val) + Group Key: t1.id, t1.comment, t1.val + -> Seq Scan on public.t1 + Output: t1.id, t1.val, t1.comment + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(20 rows) + +-- Clear tables +DROP TABLE t1, t2; +-- Test case group 3: Pushdown in subquery and group from subquery. +DROP TABLE IF EXISTS part, lineitem; +NOTICE: table "part" does not exist, skipping +NOTICE: table "lineitem" does not exist, skipping +CREATE TABLE part (p_partkey int, p_size int, p_price int); +CREATE TABLE lineitem (l_orderkey int, l_partkey int, l_amount int); +SET enable_nestloop TO off; +SET enable_hashjoin TO on; +SET enable_mergejoin TO off; +SET gp_enable_agg_pushdown TO ON; +-- Pushdown within subquery. +EXPLAIN (VERBOSE on, COSTS off) +SELECT SUM(slp) FROM + (SELECT l_partkey, SUM(p_price) from lineitem, part + WHERE l_partkey = p_partkey AND p_size < 40 + GROUP BY l_partkey + ORDER BY l_partkey + LIMIT 100) temp(lp, slp) + WHERE slp > 10; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + Output: sum(temp.slp) + -> Subquery Scan on temp + Output: temp.lp, temp.slp + Filter: (temp.slp > 10) + -> Limit + Output: lineitem.l_partkey, (sum(part.p_price)) + -> Sort + Output: lineitem.l_partkey, (sum(part.p_price)) + Sort Key: lineitem.l_partkey + -> Finalize HashAggregate + Output: lineitem.l_partkey, sum(part.p_price) + Group Key: lineitem.l_partkey + -> Hash Join + Output: lineitem.l_partkey, (PARTIAL sum(part.p_price)) + Hash Cond: (lineitem.l_partkey = part.p_partkey) + -> Seq Scan on public.lineitem + Output: lineitem.l_orderkey, lineitem.l_partkey, lineitem.l_amount + -> Hash + Output: part.p_partkey, (PARTIAL sum(part.p_price)) + -> Partial HashAggregate + Output: part.p_partkey, PARTIAL sum(part.p_price) + Group Key: part.p_partkey + -> Seq Scan on public.part + Output: part.p_partkey, part.p_size, part.p_price + Filter: (part.p_size < 40) + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(28 rows) + +-- Group base on subquery. +EXPLAIN (VERBOSE on, COSTS off) +SELECT p_partkey, SUM(l_amount) FROM + part, (SELECT l_partkey, l_amount + 10 + FROM lineitem ORDER BY l_partkey LIMIT 10000) li(l_partkey, l_amount) + WHERE l_partkey = p_partkey + GROUP BY p_partkey; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize HashAggregate + Output: part.p_partkey, sum(((lineitem.l_amount + 10))) + Group Key: part.p_partkey + -> Hash Join + Output: part.p_partkey, (PARTIAL sum(((lineitem.l_amount + 10)))) + Hash Cond: (part.p_partkey = lineitem.l_partkey) + -> Seq Scan on public.part + Output: part.p_partkey, part.p_size, part.p_price + -> Hash + Output: lineitem.l_partkey, (PARTIAL sum(((lineitem.l_amount + 10)))) + -> Partial GroupAggregate + Output: lineitem.l_partkey, PARTIAL sum(((lineitem.l_amount + 10))) + Group Key: lineitem.l_partkey + -> Limit + Output: lineitem.l_partkey, ((lineitem.l_amount + 10)) + -> Sort + Output: lineitem.l_partkey, ((lineitem.l_amount + 10)) + Sort Key: lineitem.l_partkey + -> Seq Scan on public.lineitem + Output: lineitem.l_partkey, (lineitem.l_amount + 10) + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(22 rows) + +-- Clear tables +DROP TABLE part, lineitem; +-- Test case group 4: construct grouped join rel from 2 plain rels +DROP TABLE IF EXISTS vendor_pd, customer_pd, nation_pd; +NOTICE: table "vendor_pd" does not exist, skipping +NOTICE: table "customer_pd" does not exist, skipping +NOTICE: table "nation_pd" does not exist, skipping +CREATE TABLE vendor_pd (v_id int, v_name VARCHAR(20)) WITH (APPENDONLY=true, ORIENTATION=column); +CREATE TABLE customer_pd (c_id int primary key, c_v_id int, c_n_id int, c_type int, c_consumption int); +CREATE TABLE nation_pd (n_id int, n_name VARCHAR(20), n_type int, n_population int) WITH (APPENDONLY=true, ORIENTATION=column); +INSERT INTO nation_pd SELECT i, 'abc', 1, 1 from generate_series(1, 100) s(i); +INSERT INTO customer_pd SELECT i, i % 100, i % 100, 1, 100 from generate_series(1, 10000) s(i); +ANALYZE nation_pd, customer_pd; +-- For each vendor, calculate the total consumption of qualified customers +EXPLAIN (VERBOSE on, COSTS off) +SELECT v_id, v_name, SUM(c_consumption) + FROM vendor_pd, customer_pd, nation_pd + WHERE v_id = c_v_id AND c_n_id = n_id AND c_id > n_population + GROUP BY v_id, v_name; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: vendor_pd.v_id, vendor_pd.v_name, sum(customer_pd.c_consumption) + Group Key: vendor_pd.v_id, vendor_pd.v_name + -> Sort + Output: vendor_pd.v_id, vendor_pd.v_name, (PARTIAL sum(customer_pd.c_consumption)) + Sort Key: vendor_pd.v_id, vendor_pd.v_name + -> Hash Join + Output: vendor_pd.v_id, vendor_pd.v_name, (PARTIAL sum(customer_pd.c_consumption)) + Hash Cond: (nation_pd.n_id = customer_pd.c_n_id) + Join Filter: (customer_pd.c_id > nation_pd.n_population) + -> Seq Scan on public.nation_pd + Output: nation_pd.n_id, nation_pd.n_population + -> Hash + Output: vendor_pd.v_id, vendor_pd.v_name, customer_pd.c_n_id, customer_pd.c_id, (PARTIAL sum(customer_pd.c_consumption)) + -> Partial HashAggregate + Output: vendor_pd.v_id, vendor_pd.v_name, customer_pd.c_n_id, customer_pd.c_id, PARTIAL sum(customer_pd.c_consumption) + Group Key: vendor_pd.v_id, vendor_pd.v_name, customer_pd.c_n_id, customer_pd.c_id + -> Hash Join + Output: vendor_pd.v_id, vendor_pd.v_name, customer_pd.c_consumption, customer_pd.c_n_id, customer_pd.c_id + Hash Cond: (customer_pd.c_v_id = vendor_pd.v_id) + -> Seq Scan on public.customer_pd + Output: customer_pd.c_id, customer_pd.c_v_id, customer_pd.c_n_id, customer_pd.c_type, customer_pd.c_consumption + -> Hash + Output: vendor_pd.v_id, vendor_pd.v_name + -> Seq Scan on public.vendor_pd + Output: vendor_pd.v_id, vendor_pd.v_name + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(28 rows) + +-- For each vendor/c_type/n_type, calculate the total consumption of qualified customers +EXPLAIN (VERBOSE on, COSTS off) +SELECT v_id, c_type, n_type, SUM(c_consumption) + FROM vendor_pd, customer_pd, nation_pd + WHERE v_id = c_v_id AND c_n_id = n_id AND c_id > n_population + GROUP BY v_id, c_type, n_type; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize GroupAggregate + Output: vendor_pd.v_id, customer_pd.c_type, nation_pd.n_type, sum(customer_pd.c_consumption) + Group Key: vendor_pd.v_id, customer_pd.c_type, nation_pd.n_type + -> Sort + Output: vendor_pd.v_id, customer_pd.c_type, nation_pd.n_type, (PARTIAL sum(customer_pd.c_consumption)) + Sort Key: vendor_pd.v_id, customer_pd.c_type, nation_pd.n_type + -> Hash Join + Output: vendor_pd.v_id, customer_pd.c_type, nation_pd.n_type, (PARTIAL sum(customer_pd.c_consumption)) + Hash Cond: (nation_pd.n_id = customer_pd.c_n_id) + Join Filter: (customer_pd.c_id > nation_pd.n_population) + -> Seq Scan on public.nation_pd + Output: nation_pd.n_type, nation_pd.n_id, nation_pd.n_population + -> Hash + Output: vendor_pd.v_id, customer_pd.c_type, customer_pd.c_n_id, customer_pd.c_id, (PARTIAL sum(customer_pd.c_consumption)) + -> Partial HashAggregate + Output: vendor_pd.v_id, customer_pd.c_type, customer_pd.c_n_id, customer_pd.c_id, PARTIAL sum(customer_pd.c_consumption) + Group Key: vendor_pd.v_id, customer_pd.c_type, customer_pd.c_n_id, customer_pd.c_id + -> Hash Join + Output: vendor_pd.v_id, customer_pd.c_type, customer_pd.c_consumption, customer_pd.c_n_id, customer_pd.c_id + Hash Cond: (customer_pd.c_v_id = vendor_pd.v_id) + -> Seq Scan on public.customer_pd + Output: customer_pd.c_id, customer_pd.c_v_id, customer_pd.c_n_id, customer_pd.c_type, customer_pd.c_consumption + -> Hash + Output: vendor_pd.v_id + -> Seq Scan on public.vendor_pd + Output: vendor_pd.v_id + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(28 rows) + +-- For each vendor/n_type, calculate the total consumption of customers from nation with condition. +EXPLAIN (VERBOSE on, COSTS off) +SELECT v_id, v_name, n_type, SUM(c_consumption) + FROM vendor_pd, customer_pd, nation_pd + WHERE v_id = c_v_id AND c_n_id = n_id AND n_population > 100 + GROUP BY v_id, v_name, n_type; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + GroupAggregate + Output: vendor_pd.v_id, vendor_pd.v_name, nation_pd.n_type, sum(customer_pd.c_consumption) + Group Key: vendor_pd.v_id, vendor_pd.v_name, nation_pd.n_type + -> Sort + Output: vendor_pd.v_id, vendor_pd.v_name, nation_pd.n_type, customer_pd.c_consumption + Sort Key: vendor_pd.v_id, vendor_pd.v_name, nation_pd.n_type + -> Hash Join + Output: vendor_pd.v_id, vendor_pd.v_name, nation_pd.n_type, customer_pd.c_consumption + Hash Cond: (customer_pd.c_v_id = vendor_pd.v_id) + -> Hash Join + Output: customer_pd.c_consumption, customer_pd.c_v_id, nation_pd.n_type + Hash Cond: (customer_pd.c_n_id = nation_pd.n_id) + -> Seq Scan on public.customer_pd + Output: customer_pd.c_id, customer_pd.c_v_id, customer_pd.c_n_id, customer_pd.c_type, customer_pd.c_consumption + -> Hash + Output: nation_pd.n_type, nation_pd.n_id + -> Seq Scan on public.nation_pd + Output: nation_pd.n_type, nation_pd.n_id + Filter: (nation_pd.n_population > 100) + -> Hash + Output: vendor_pd.v_id, vendor_pd.v_name + -> Seq Scan on public.vendor_pd + Output: vendor_pd.v_id, vendor_pd.v_name + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(25 rows) + +-- Clear tables +DROP TABLE vendor_pd, customer_pd, nation_pd; +-- Test case group 4: OLAP-like cases +DROP TABLE IF EXISTS fact, dim; +NOTICE: table "fact" does not exist, skipping +NOTICE: table "dim" does not exist, skipping +CREATE TABLE fact (id int, did int, fact_time int, val int) WITH (APPENDONLY=true, ORIENTATION=column); +CREATE TABLE dim (did int, proj_name varchar(20), brand int, model int); +INSERT INTO dim SELECT i % 100, 1, 1 FROM generate_series(1, 100) s(i); +INSERT INTO fact SELECT i % 10, i % 100, 30, 1 FROM generate_series(1, 10000) s(i); +ANALYZE dim, fact; +-- Test sum fact vals group by dim column +EXPLAIN (VERBOSE on, COSTS off) +SELECT dim.did, sum(val) + FROM fact JOIN dim ON fact.did = dim.did + WHERE fact_time > 10 AND fact_time < 2000 + GROUP BY dim.did; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize HashAggregate + Output: dim.did, sum(fact.val) + Group Key: dim.did + -> Hash Join + Output: dim.did, (PARTIAL sum(fact.val)) + Hash Cond: (dim.did = fact.did) + -> Seq Scan on public.dim + Output: dim.did, dim.proj_name, dim.brand, dim.model + -> Hash + Output: fact.did, (PARTIAL sum(fact.val)) + -> Partial HashAggregate + Output: fact.did, PARTIAL sum(fact.val) + Group Key: fact.did + -> Seq Scan on public.fact + Output: fact.val, fact.did + Filter: ((fact.fact_time > 10) AND (fact.fact_time < 2000)) + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(18 rows) + +EXPLAIN (VERBOSE on, COSTS off) +SELECT dim.proj_name, sum(val) + FROM fact JOIN dim ON fact.did = dim.did + WHERE fact_time > 10 AND fact_time < 2000 + GROUP BY dim.proj_name; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + Finalize HashAggregate + Output: dim.proj_name, sum(fact.val) + Group Key: dim.proj_name + -> Hash Join + Output: dim.proj_name, (PARTIAL sum(fact.val)) + Hash Cond: (dim.did = fact.did) + -> Seq Scan on public.dim + Output: dim.did, dim.proj_name, dim.brand, dim.model + -> Hash + Output: fact.did, (PARTIAL sum(fact.val)) + -> Partial HashAggregate + Output: fact.did, PARTIAL sum(fact.val) + Group Key: fact.did + -> Seq Scan on public.fact + Output: fact.val, fact.did + Filter: ((fact.fact_time > 10) AND (fact.fact_time < 2000)) + Settings: enable_hashjoin = 'on', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(18 rows) + +-- Clear tables +DROP TABLE dim, fact; +-- Test case group 5: partition table and inherit table +SET enable_incremental_sort TO off; +DROP TABLE IF EXISTS pagg_pd; +NOTICE: table "pagg_pd" does not exist, skipping +CREATE TABLE pagg_pd (a int, b int, c text, d int) PARTITION BY LIST(c); +CREATE TABLE pagg_pd_p1 PARTITION OF pagg_pd FOR VALUES IN ('0000', '0001', '0002', '0003', '0004'); +CREATE TABLE pagg_pd_p2 PARTITION OF pagg_pd FOR VALUES IN ('0005', '0006', '0007', '0008'); +CREATE TABLE pagg_pd_p3 PARTITION OF pagg_pd FOR VALUES IN ('0009', '0010', '0011'); +INSERT INTO pagg_pd SELECT i % 20, i % 30, to_char(i % 12, 'FM0000'), i % 30 FROM generate_series(0, 2999) i; +ANALYZE pagg_pd; +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.c, sum(t1.a) + FROM pagg_pd t1 JOIN pagg_pd t2 ON t1.c < t2.c + GROUP BY t1.c + ORDER BY 1, 2; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: t1.c, (sum(t1.a)) + Sort Key: t1.c, (sum(t1.a)) + -> Finalize GroupAggregate + Output: t1.c, sum(t1.a) + Group Key: t1.c + -> Sort + Output: t1.c, (PARTIAL sum(t1.a)) + Sort Key: t1.c + -> Nested Loop + Output: t1.c, (PARTIAL sum(t1.a)) + Join Filter: (t1.c < t2.c) + -> Append + -> Seq Scan on public.pagg_pd_p1 t2_1 + Output: t2_1.c + -> Seq Scan on public.pagg_pd_p2 t2_2 + Output: t2_2.c + -> Seq Scan on public.pagg_pd_p3 t2_3 + Output: t2_3.c + -> Materialize + Output: t1.c, (PARTIAL sum(t1.a)) + -> Partial HashAggregate + Output: t1.c, PARTIAL sum(t1.a) + Group Key: t1.c + -> Append + -> Seq Scan on public.pagg_pd_p1 t1_1 + Output: t1_1.c, t1_1.a + -> Seq Scan on public.pagg_pd_p2 t1_2 + Output: t1_2.c, t1_2.a + -> Seq Scan on public.pagg_pd_p3 t1_3 + Output: t1_3.c, t1_3.a + Settings: enable_hashjoin = 'on', enable_incremental_sort = 'off', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(33 rows) + +SELECT t1.c, sum(t1.a) + FROM pagg_pd t1 JOIN pagg_pd t2 ON t1.c < t2.c + GROUP BY t1.c + ORDER BY 1, 2; + c | sum +------+--------- + 0000 | 5500000 + 0001 | 5625000 + 0002 | 5625000 + 0003 | 5500000 + 0004 | 3500000 + 0005 | 3375000 + 0006 | 3125000 + 0007 | 2750000 + 0008 | 1500000 + 0009 | 1125000 + 0010 | 625000 +(11 rows) + +DROP TABLE pagg_pd; +CREATE TABLE pagg_pd_p (a int, b int); +CREATE TABLE pagg_pd (c text, d int) inherits (pagg_pd_p) PARTITION BY LIST(c); +ERROR: cannot create partitioned table as inheritance child +DROP TABLE IF EXISTS pagg_pd, pagg_pd_p; +NOTICE: table "pagg_pd" does not exist, skipping +CREATE TABLE pagg_pd_p (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE pagg_pd (d int) inherits (pagg_pd_p); +ERROR: cannot inherit from partitioned table "pagg_pd_p" +DROP TABLE IF EXISTS pagg_pd, pagg_pd_p; +NOTICE: table "pagg_pd" does not exist, skipping +CREATE TABLE pagg_pd_p (a int, b int); +CREATE TABLE pagg_pd (c text, d int) inherits (pagg_pd_p); +INSERT INTO pagg_pd SELECT i % 20, i % 30, to_char(i % 12, 'FM0000'), i % 30 FROM generate_series(0, 2999) i; +ANALYZE pagg_pd; +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.c, sum(t1.a) + FROM pagg_pd t1 JOIN pagg_pd t2 ON t1.c < t2.c + GROUP BY t1.c + ORDER BY 1, 2; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: t1.c, (sum(t1.a)) + Sort Key: t1.c, (sum(t1.a)) + -> Finalize GroupAggregate + Output: t1.c, sum(t1.a) + Group Key: t1.c + -> Sort + Output: t1.c, (PARTIAL sum(t1.a)) + Sort Key: t1.c + -> Nested Loop + Output: t1.c, (PARTIAL sum(t1.a)) + Join Filter: (t1.c < t2.c) + -> Seq Scan on public.pagg_pd t2 + Output: t2.a, t2.b, t2.c, t2.d + -> Materialize + Output: t1.c, (PARTIAL sum(t1.a)) + -> Partial HashAggregate + Output: t1.c, PARTIAL sum(t1.a) + Group Key: t1.c + -> Seq Scan on public.pagg_pd t1 + Output: t1.a, t1.b, t1.c, t1.d + Settings: enable_hashjoin = 'on', enable_incremental_sort = 'off', enable_mergejoin = 'off', enable_nestloop = 'off', enable_seqscan = 'on', gp_enable_agg_pushdown = 'on', optimizer = 'off' + Optimizer: Postgres query optimizer +(23 rows) + +SELECT t1.c, sum(t1.a) + FROM pagg_pd t1 JOIN pagg_pd t2 ON t1.c < t2.c + GROUP BY t1.c + ORDER BY 1, 2; + c | sum +------+--------- + 0000 | 5500000 + 0001 | 5625000 + 0002 | 5625000 + 0003 | 5500000 + 0004 | 3500000 + 0005 | 3375000 + 0006 | 3125000 + 0007 | 2750000 + 0008 | 1500000 + 0009 | 1125000 + 0010 | 625000 +(11 rows) + +DROP TABLE pagg_pd, pagg_pd_p; +RESET enable_incremental_sort; +-- Clear settings +SET optimizer TO default; +SET gp_enable_agg_pushdown TO off; +SET enable_seqscan TO on; +SET enable_nestloop TO on; +SET enable_hashjoin TO on; +SET enable_mergejoin TO on; diff --git a/src/test/singlenode_regress/expected/aggregates.out b/src/test/singlenode_regress/expected/aggregates.out new file mode 100644 index 00000000000..6cde5430002 --- /dev/null +++ b/src/test/singlenode_regress/expected/aggregates.out @@ -0,0 +1,3257 @@ +-- +-- AGGREGATES +-- +-- start_ignore +SET optimizer_trace_fallback to on; +-- end_ignore +-- avoid bit-exact output here because operations may not be bit-exact. +SET extra_float_digits = 0; +SELECT avg(four) AS avg_1 FROM onek; + avg_1 +-------------------- + 1.5000000000000000 +(1 row) + +SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100; + avg_32 +--------------------- + 32.6666666666666667 +(1 row) + +-- In 7.1, avg(float4) is computed using float8 arithmetic. +-- Round the result to 3 digits to avoid platform-specific results. +SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest; + avg_107_943 +------------- + 107.943 +(1 row) + +SELECT avg(gpa) AS avg_3_4 FROM ONLY student; + avg_3_4 +--------- + 3.4 +(1 row) + +SELECT sum(four) AS sum_1500 FROM onek; + sum_1500 +---------- + 1500 +(1 row) + +SELECT sum(a) AS sum_198 FROM aggtest; + sum_198 +--------- + 198 +(1 row) + +SELECT sum(b) AS avg_431_773 FROM aggtest; + avg_431_773 +------------- + 431.773 +(1 row) + +SELECT sum(gpa) AS avg_6_8 FROM ONLY student; + avg_6_8 +--------- + 6.8 +(1 row) + +SELECT max(four) AS max_3 FROM onek; + max_3 +------- + 3 +(1 row) + +SELECT max(a) AS max_100 FROM aggtest; + max_100 +--------- + 100 +(1 row) + +SELECT max(aggtest.b) AS max_324_78 FROM aggtest; + max_324_78 +------------ + 324.78 +(1 row) + +SELECT max(student.gpa) AS max_3_7 FROM student; + max_3_7 +--------- + 3.7 +(1 row) + +SELECT stddev_pop(b) FROM aggtest; + stddev_pop +----------------- + 131.10703231895 +(1 row) + +SELECT stddev_samp(b) FROM aggtest; + stddev_samp +------------------ + 151.389360803998 +(1 row) + +SELECT var_pop(b) FROM aggtest; + var_pop +------------------ + 17189.0539234823 +(1 row) + +SELECT var_samp(b) FROM aggtest; + var_samp +------------------ + 22918.7385646431 +(1 row) + +SELECT stddev_pop(b::numeric) FROM aggtest; + stddev_pop +------------------ + 131.107032862199 +(1 row) + +SELECT stddev_samp(b::numeric) FROM aggtest; + stddev_samp +------------------ + 151.389361431288 +(1 row) + +SELECT var_pop(b::numeric) FROM aggtest; + var_pop +-------------------- + 17189.054065929769 +(1 row) + +SELECT var_samp(b::numeric) FROM aggtest; + var_samp +-------------------- + 22918.738754573025 +(1 row) + +-- population variance is defined for a single tuple, sample variance +-- is not +SELECT var_pop(1.0::float8), var_samp(2.0::float8); + var_pop | var_samp +---------+---------- + 0 | +(1 row) + +SELECT stddev_pop(3.0::float8), stddev_samp(4.0::float8); + stddev_pop | stddev_samp +------------+------------- + 0 | +(1 row) + +SELECT var_pop('inf'::float8), var_samp('inf'::float8); + var_pop | var_samp +---------+---------- + NaN | +(1 row) + +SELECT stddev_pop('inf'::float8), stddev_samp('inf'::float8); + stddev_pop | stddev_samp +------------+------------- + NaN | +(1 row) + +SELECT var_pop('nan'::float8), var_samp('nan'::float8); + var_pop | var_samp +---------+---------- + NaN | +(1 row) + +SELECT stddev_pop('nan'::float8), stddev_samp('nan'::float8); + stddev_pop | stddev_samp +------------+------------- + NaN | +(1 row) + +SELECT var_pop(1.0::float4), var_samp(2.0::float4); + var_pop | var_samp +---------+---------- + 0 | +(1 row) + +SELECT stddev_pop(3.0::float4), stddev_samp(4.0::float4); + stddev_pop | stddev_samp +------------+------------- + 0 | +(1 row) + +SELECT var_pop('inf'::float4), var_samp('inf'::float4); + var_pop | var_samp +---------+---------- + NaN | +(1 row) + +SELECT stddev_pop('inf'::float4), stddev_samp('inf'::float4); + stddev_pop | stddev_samp +------------+------------- + NaN | +(1 row) + +SELECT var_pop('nan'::float4), var_samp('nan'::float4); + var_pop | var_samp +---------+---------- + NaN | +(1 row) + +SELECT stddev_pop('nan'::float4), stddev_samp('nan'::float4); + stddev_pop | stddev_samp +------------+------------- + NaN | +(1 row) + +SELECT var_pop(1.0::numeric), var_samp(2.0::numeric); + var_pop | var_samp +---------+---------- + 0 | +(1 row) + +SELECT stddev_pop(3.0::numeric), stddev_samp(4.0::numeric); + stddev_pop | stddev_samp +------------+------------- + 0 | +(1 row) + +SELECT var_pop('inf'::numeric), var_samp('inf'::numeric); + var_pop | var_samp +---------+---------- + NaN | +(1 row) + +SELECT stddev_pop('inf'::numeric), stddev_samp('inf'::numeric); + stddev_pop | stddev_samp +------------+------------- + NaN | +(1 row) + +SELECT var_pop('nan'::numeric), var_samp('nan'::numeric); + var_pop | var_samp +---------+---------- + NaN | +(1 row) + +SELECT stddev_pop('nan'::numeric), stddev_samp('nan'::numeric); + stddev_pop | stddev_samp +------------+------------- + NaN | +(1 row) + +-- verify correct results for null and NaN inputs +select sum(null::int4) from generate_series(1,3); + sum +----- + +(1 row) + +select sum(null::int8) from generate_series(1,3); + sum +----- + +(1 row) + +select sum(null::numeric) from generate_series(1,3); + sum +----- + +(1 row) + +select sum(null::float8) from generate_series(1,3); + sum +----- + +(1 row) + +select avg(null::int4) from generate_series(1,3); + avg +----- + +(1 row) + +select avg(null::int8) from generate_series(1,3); + avg +----- + +(1 row) + +select avg(null::numeric) from generate_series(1,3); + avg +----- + +(1 row) + +select avg(null::float8) from generate_series(1,3); + avg +----- + +(1 row) + +select sum('NaN'::numeric) from generate_series(1,3); + sum +----- + NaN +(1 row) + +select avg('NaN'::numeric) from generate_series(1,3); + avg +----- + NaN +(1 row) + +-- verify correct results for infinite inputs +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('1'), ('infinity')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('infinity'), ('1')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('infinity'), ('infinity')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('-infinity'), ('infinity')) v(x); + sum | avg | var_pop +-----+-----+--------- + NaN | NaN | NaN +(1 row) + +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('-infinity'), ('-infinity')) v(x); + sum | avg | var_pop +-----------+-----------+--------- + -Infinity | -Infinity | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('1'), ('infinity')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('1')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('infinity')) v(x); + sum | avg | var_pop +----------+----------+--------- + Infinity | Infinity | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('infinity')) v(x); + sum | avg | var_pop +-----+-----+--------- + NaN | NaN | NaN +(1 row) + +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('-infinity')) v(x); + sum | avg | var_pop +-----------+-----------+--------- + -Infinity | -Infinity | NaN +(1 row) + +-- test accuracy with a large input offset +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x); + avg | var_pop +-----------+--------- + 100000005 | 2.5 +(1 row) + +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (7000000000005), (7000000000007)) v(x); + avg | var_pop +---------------+--------- + 7000000000006 | 1 +(1 row) + +-- SQL2003 binary aggregates +SELECT regr_count(b, a) FROM aggtest; + regr_count +------------ + 4 +(1 row) + +SELECT regr_sxx(b, a) FROM aggtest; + regr_sxx +---------- + 5099 +(1 row) + +SELECT regr_syy(b, a) FROM aggtest; + regr_syy +------------------ + 68756.2156939293 +(1 row) + +SELECT regr_sxy(b, a) FROM aggtest; + regr_sxy +------------------ + 2614.51582155004 +(1 row) + +SELECT regr_avgx(b, a), regr_avgy(b, a) FROM aggtest; + regr_avgx | regr_avgy +-----------+------------------ + 49.5 | 107.943152273074 +(1 row) + +SELECT regr_r2(b, a) FROM aggtest; + regr_r2 +-------------------- + 0.0194977982031803 +(1 row) + +SELECT regr_slope(b, a), regr_intercept(b, a) FROM aggtest; + regr_slope | regr_intercept +-------------------+------------------ + 0.512750700441271 | 82.5619926012309 +(1 row) + +SELECT covar_pop(b, a), covar_samp(b, a) FROM aggtest; + covar_pop | covar_samp +-----------------+------------------ + 653.62895538751 | 871.505273850014 +(1 row) + +SELECT corr(b, a) FROM aggtest; + corr +------------------- + 0.139634516517873 +(1 row) + +-- check single-tuple behavior +SELECT covar_pop(1::float8,2::float8), covar_samp(3::float8,4::float8); + covar_pop | covar_samp +-----------+------------ + 0 | +(1 row) + +SELECT covar_pop(1::float8,'inf'::float8), covar_samp(3::float8,'inf'::float8); + covar_pop | covar_samp +-----------+------------ + NaN | +(1 row) + +SELECT covar_pop(1::float8,'nan'::float8), covar_samp(3::float8,'nan'::float8); + covar_pop | covar_samp +-----------+------------ + NaN | +(1 row) + +-- test accum and combine functions directly +CREATE TABLE regr_test (x float8, y float8); +INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200); +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (10,20,30,80); + count | sum | regr_sxx | sum | regr_syy | regr_sxy +-------+-----+----------+------+----------+---------- + 4 | 140 | 2900 | 1290 | 83075 | 15050 +(1 row) + +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test; + count | sum | regr_sxx | sum | regr_syy | regr_sxy +-------+-----+----------+------+----------+---------- + 5 | 240 | 6280 | 1490 | 95080 | 8680 +(1 row) + +SELECT float8_accum('{4,140,2900}'::float8[], 100); + float8_accum +-------------- + {5,240,6280} +(1 row) + +SELECT float8_regr_accum('{4,140,2900,1290,83075,15050}'::float8[], 200, 100); + float8_regr_accum +------------------------------ + {5,240,6280,1490,95080,8680} +(1 row) + +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (10,20,30); + count | sum | regr_sxx | sum | regr_syy | regr_sxy +-------+-----+----------+-----+----------+---------- + 3 | 60 | 200 | 750 | 20000 | 2000 +(1 row) + +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (80,100); + count | sum | regr_sxx | sum | regr_syy | regr_sxy +-------+-----+----------+-----+----------+---------- + 2 | 180 | 200 | 740 | 57800 | -3400 +(1 row) + +SELECT float8_combine('{3,60,200}'::float8[], '{0,0,0}'::float8[]); + float8_combine +---------------- + {3,60,200} +(1 row) + +SELECT float8_combine('{0,0,0}'::float8[], '{2,180,200}'::float8[]); + float8_combine +---------------- + {2,180,200} +(1 row) + +SELECT float8_combine('{3,60,200}'::float8[], '{2,180,200}'::float8[]); + float8_combine +---------------- + {5,240,6280} +(1 row) + +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{0,0,0,0,0,0}'::float8[]); + float8_regr_combine +--------------------------- + {3,60,200,750,20000,2000} +(1 row) + +SELECT float8_regr_combine('{0,0,0,0,0,0}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); + float8_regr_combine +----------------------------- + {2,180,200,740,57800,-3400} +(1 row) + +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); + float8_regr_combine +------------------------------ + {5,240,6280,1490,95080,8680} +(1 row) + +DROP TABLE regr_test; +-- test count, distinct +SELECT count(four) AS cnt_1000 FROM onek; + cnt_1000 +---------- + 1000 +(1 row) + +SELECT count(DISTINCT four) AS cnt_4 FROM onek; + cnt_4 +------- + 4 +(1 row) + +select ten, count(*), sum(four) from onek +group by ten order by ten; + ten | count | sum +-----+-------+----- + 0 | 100 | 100 + 1 | 100 | 200 + 2 | 100 | 100 + 3 | 100 | 200 + 4 | 100 | 100 + 5 | 100 | 200 + 6 | 100 | 100 + 7 | 100 | 200 + 8 | 100 | 100 + 9 | 100 | 200 +(10 rows) + +select ten, count(four), sum(DISTINCT four) from onek +group by ten order by ten; + ten | count | sum +-----+-------+----- + 0 | 100 | 2 + 1 | 100 | 4 + 2 | 100 | 2 + 3 | 100 | 4 + 4 | 100 | 2 + 5 | 100 | 4 + 6 | 100 | 2 + 7 | 100 | 4 + 8 | 100 | 2 + 9 | 100 | 4 +(10 rows) + +-- user-defined aggregates +SELECT newavg(four) AS avg_1 FROM onek; + avg_1 +-------------------- + 1.5000000000000000 +(1 row) + +SELECT newsum(four) AS sum_1500 FROM onek; + sum_1500 +---------- + 1500 +(1 row) + +SELECT newcnt(four) AS cnt_1000 FROM onek; + cnt_1000 +---------- + 1000 +(1 row) + +SELECT newcnt(*) AS cnt_1000 FROM onek; + cnt_1000 +---------- + 1000 +(1 row) + +SELECT oldcnt(*) AS cnt_1000 FROM onek; + cnt_1000 +---------- + 1000 +(1 row) + +SELECT sum2(q1,q2) FROM int8_tbl; + sum2 +------------------- + 18271560493827981 +(1 row) + +-- test for outer-level aggregates +-- this should work +select ten, sum(distinct four) from onek a +group by ten +having exists (select 1 from onek b where sum(distinct a.four) = b.four); + ten | sum +-----+----- + 0 | 2 + 2 | 2 + 4 | 2 + 6 | 2 + 8 | 2 +(5 rows) + +-- this should fail because subquery has an agg of its own in WHERE +select ten, sum(distinct four) from onek a +group by ten +having exists (select 1 from onek b + where sum(distinct a.four + b.four) = b.four); +ERROR: aggregate functions are not allowed in WHERE +LINE 4: where sum(distinct a.four + b.four) = b.four)... + ^ +-- Test handling of sublinks within outer-level aggregates. +-- Per bug report from Daniel Grace. +select + (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1))) +from tenk1 o; + max +------ + 9999 +(1 row) + +-- Test handling of Params within aggregate arguments in hashed aggregation. +-- Per bug report from Jeevan Chalke. +explain (verbose, costs off) +select s1, s2, sm +from generate_series(1, 3) s1, + lateral (select s2, sum(s1 + s2) sm + from generate_series(1, 3) s2 group by s2) ss +order by 1, 2; + QUERY PLAN +------------------------------------------------------------------------ + Sort + Output: s1.s1, s2.s2, (sum((s1.s1 + s2.s2))) + Sort Key: s1.s1, s2.s2 + -> Nested Loop + Output: s1.s1, s2.s2, (sum((s1.s1 + s2.s2))) + -> Function Scan on pg_catalog.generate_series s1 + Output: s1.s1 + Function Call: generate_series(1, 3) + -> Materialize + Output: s2.s2, (sum((s1.s1 + s2.s2))) + -> HashAggregate + Output: s2.s2, sum((s1.s1 + s2.s2)) + Group Key: s2.s2 + -> Function Scan on pg_catalog.generate_series s2 + Output: s2.s2 + Function Call: generate_series(1, 3) + Optimizer: Postgres query optimizer +(17 rows) + +select s1, s2, sm +from generate_series(1, 3) s1, + lateral (select s2, sum(s1 + s2) sm + from generate_series(1, 3) s2 group by s2) ss +order by 1, 2; + s1 | s2 | sm +----+----+---- + 1 | 1 | 2 + 1 | 2 | 3 + 1 | 3 | 4 + 2 | 1 | 3 + 2 | 2 | 4 + 2 | 3 | 5 + 3 | 1 | 4 + 3 | 2 | 5 + 3 | 3 | 6 +(9 rows) + +explain (verbose, costs off) +select array(select sum(x+y) s + from generate_series(1,3) y group by y order by s) + from generate_series(1,3) x; + QUERY PLAN +------------------------------------------------------------------- + Function Scan on pg_catalog.generate_series x + Output: (SubPlan 1) + Function Call: generate_series(1, 3) + SubPlan 1 + -> Sort + Output: (sum((x.x + y.y))), y.y + Sort Key: (sum((x.x + y.y))) + -> HashAggregate + Output: sum((x.x + y.y)), y.y + Group Key: y.y + -> Function Scan on pg_catalog.generate_series y + Output: y.y + Function Call: generate_series(1, 3) + Optimizer: Postgres query optimizer +(14 rows) + +select array(select sum(x+y) s + from generate_series(1,3) y group by y order by s) + from generate_series(1,3) x; + array +--------- + {2,3,4} + {3,4,5} + {4,5,6} +(3 rows) + +-- +-- test for bitwise integer aggregates +-- +CREATE TEMPORARY TABLE bitwise_test( + i2 INT2, + i4 INT4, + i8 INT8, + i INTEGER, + x INT2, + y BIT(4) +); +-- empty case +SELECT + BIT_AND(i2) AS "?", + BIT_OR(i4) AS "?", + BIT_XOR(i8) AS "?" +FROM bitwise_test; + ? | ? | ? +---+---+--- + | | +(1 row) + +COPY bitwise_test FROM STDIN NULL 'null'; +SELECT + BIT_AND(i2) AS "1", + BIT_AND(i4) AS "1", + BIT_AND(i8) AS "1", + BIT_AND(i) AS "?", + BIT_AND(x) AS "0", + BIT_AND(y) AS "0100", + BIT_OR(i2) AS "7", + BIT_OR(i4) AS "7", + BIT_OR(i8) AS "7", + BIT_OR(i) AS "?", + BIT_OR(x) AS "7", + BIT_OR(y) AS "1101", + BIT_XOR(i2) AS "5", + BIT_XOR(i4) AS "5", + BIT_XOR(i8) AS "5", + BIT_XOR(i) AS "?", + BIT_XOR(x) AS "7", + BIT_XOR(y) AS "1101" +FROM bitwise_test; + 1 | 1 | 1 | ? | 0 | 0100 | 7 | 7 | 7 | ? | 7 | 1101 | 5 | 5 | 5 | ? | 7 | 1101 +---+---+---+---+---+------+---+---+---+---+---+------+---+---+---+---+---+------ + 1 | 1 | 1 | 1 | 0 | 0100 | 7 | 7 | 7 | 3 | 7 | 1101 | 5 | 5 | 5 | 2 | 7 | 1101 +(1 row) + +-- +-- test boolean aggregates +-- +-- first test all possible transition and final states +SELECT + -- boolean and transitions + -- null because strict + booland_statefunc(NULL, NULL) IS NULL AS "t", + booland_statefunc(TRUE, NULL) IS NULL AS "t", + booland_statefunc(FALSE, NULL) IS NULL AS "t", + booland_statefunc(NULL, TRUE) IS NULL AS "t", + booland_statefunc(NULL, FALSE) IS NULL AS "t", + -- and actual computations + booland_statefunc(TRUE, TRUE) AS "t", + NOT booland_statefunc(TRUE, FALSE) AS "t", + NOT booland_statefunc(FALSE, TRUE) AS "t", + NOT booland_statefunc(FALSE, FALSE) AS "t"; + t | t | t | t | t | t | t | t | t +---+---+---+---+---+---+---+---+--- + t | t | t | t | t | t | t | t | t +(1 row) + +SELECT + -- boolean or transitions + -- null because strict + boolor_statefunc(NULL, NULL) IS NULL AS "t", + boolor_statefunc(TRUE, NULL) IS NULL AS "t", + boolor_statefunc(FALSE, NULL) IS NULL AS "t", + boolor_statefunc(NULL, TRUE) IS NULL AS "t", + boolor_statefunc(NULL, FALSE) IS NULL AS "t", + -- actual computations + boolor_statefunc(TRUE, TRUE) AS "t", + boolor_statefunc(TRUE, FALSE) AS "t", + boolor_statefunc(FALSE, TRUE) AS "t", + NOT boolor_statefunc(FALSE, FALSE) AS "t"; + t | t | t | t | t | t | t | t | t +---+---+---+---+---+---+---+---+--- + t | t | t | t | t | t | t | t | t +(1 row) + +CREATE TEMPORARY TABLE bool_test( + b1 BOOL, + b2 BOOL, + b3 BOOL, + b4 BOOL); +-- empty case +SELECT + BOOL_AND(b1) AS "n", + BOOL_OR(b3) AS "n" +FROM bool_test; + n | n +---+--- + | +(1 row) + +COPY bool_test FROM STDIN NULL 'null'; +SELECT + BOOL_AND(b1) AS "f", + BOOL_AND(b2) AS "t", + BOOL_AND(b3) AS "f", + BOOL_AND(b4) AS "n", + BOOL_AND(NOT b2) AS "f", + BOOL_AND(NOT b3) AS "t" +FROM bool_test; + f | t | f | n | f | t +---+---+---+---+---+--- + f | t | f | | f | t +(1 row) + +SELECT + EVERY(b1) AS "f", + EVERY(b2) AS "t", + EVERY(b3) AS "f", + EVERY(b4) AS "n", + EVERY(NOT b2) AS "f", + EVERY(NOT b3) AS "t" +FROM bool_test; + f | t | f | n | f | t +---+---+---+---+---+--- + f | t | f | | f | t +(1 row) + +SELECT + BOOL_OR(b1) AS "t", + BOOL_OR(b2) AS "t", + BOOL_OR(b3) AS "f", + BOOL_OR(b4) AS "n", + BOOL_OR(NOT b2) AS "f", + BOOL_OR(NOT b3) AS "t" +FROM bool_test; + t | t | f | n | f | t +---+---+---+---+---+--- + t | t | f | | f | t +(1 row) + +-- +-- Test cases that should be optimized into indexscans instead of +-- the generic aggregate implementation. +-- +-- Basic cases +explain (costs off) + select min(unique1) from tenk1; + QUERY PLAN +------------------------------------------------------------ + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 IS NOT NULL) + Optimizer: Postgres query optimizer +(6 rows) + +select min(unique1) from tenk1; + min +----- + 0 +(1 row) + +explain (costs off) + select max(unique1) from tenk1; + QUERY PLAN +--------------------------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique1 on tenk1 + Index Cond: (unique1 IS NOT NULL) + Optimizer: Postgres query optimizer +(6 rows) + +select max(unique1) from tenk1; + max +------ + 9999 +(1 row) + +explain (costs off) + select max(unique1) from tenk1 where unique1 < 42; + QUERY PLAN +------------------------------------------------------------------------ + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique1 on tenk1 + Index Cond: ((unique1 IS NOT NULL) AND (unique1 < 42)) + Optimizer: Postgres query optimizer +(6 rows) + +select max(unique1) from tenk1 where unique1 < 42; + max +----- + 41 +(1 row) + +explain (costs off) + select max(unique1) from tenk1 where unique1 > 42; + QUERY PLAN +------------------------------------------------------------------------ + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique1 on tenk1 + Index Cond: ((unique1 IS NOT NULL) AND (unique1 > 42)) + Optimizer: Postgres query optimizer +(6 rows) + +select max(unique1) from tenk1 where unique1 > 42; + max +------ + 9999 +(1 row) + +-- the planner may choose a generic aggregate here if parallel query is +-- enabled, since that plan will be parallel safe and the "optimized" +-- plan, which has almost identical cost, will not be. we want to test +-- the optimized plan, so temporarily disable parallel query. +begin; +set local max_parallel_workers_per_gather = 0; +-- In GPDB, we also need to disable seqscans and bitmap scans. +set local enable_seqscan=off; +set local enable_bitmapscan=off; +explain (costs off) + select max(unique1) from tenk1 where unique1 > 42000; + QUERY PLAN +--------------------------------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique1 on tenk1 + Index Cond: ((unique1 IS NOT NULL) AND (unique1 > 42000)) + Optimizer: Postgres query optimizer +(6 rows) + +select max(unique1) from tenk1 where unique1 > 42000; + max +----- + +(1 row) + +rollback; +-- multi-column index (uses tenk1_thous_tenthous) +explain (costs off) + select max(tenthous) from tenk1 where thousand = 33; + QUERY PLAN +---------------------------------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_thous_tenthous on tenk1 + Index Cond: ((thousand = 33) AND (tenthous IS NOT NULL)) + Optimizer: Postgres query optimizer +(6 rows) + +select max(tenthous) from tenk1 where thousand = 33; + max +------ + 9033 +(1 row) + +explain (costs off) + select min(tenthous) from tenk1 where thousand = 33; + QUERY PLAN +-------------------------------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan using tenk1_thous_tenthous on tenk1 + Index Cond: ((thousand = 33) AND (tenthous IS NOT NULL)) + Optimizer: Postgres query optimizer +(6 rows) + +select min(tenthous) from tenk1 where thousand = 33; + min +----- + 33 +(1 row) + +-- check parameter propagation into an indexscan subquery +-- In GPDB, this cannot use the MIN/MAX optimization, because the subplan +-- parameter cannot be pushed through a Motion node. +explain (costs off) + select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt + from int4_tbl; + QUERY PLAN +----------------------------------------------------------------------------------------- + Seq Scan on int4_tbl + SubPlan 2 + -> Result + InitPlan 1 (returns $1) + -> Limit + -> Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 IS NOT NULL) AND (unique1 > int4_tbl.f1)) + Optimizer: Postgres query optimizer +(8 rows) + +select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt + from int4_tbl; + f1 | gt +-------------+---- + 0 | 1 + 123456 | + -123456 | 0 + 2147483647 | + -2147483647 | 0 +(5 rows) + +-- check some cases that were handled incorrectly in 8.3.0 +explain (costs off) + select distinct max(unique2) from tenk1; + QUERY PLAN +--------------------------------------------------------------------- + HashAggregate + Group Key: $0 + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique2 on tenk1 + Index Cond: (unique2 IS NOT NULL) + -> Result + Optimizer: Postgres query optimizer +(8 rows) + +select distinct max(unique2) from tenk1; + max +------ + 9999 +(1 row) + +explain (costs off) + select max(unique2) from tenk1 order by 1; + QUERY PLAN +--------------------------------------------------------------------- + Sort + Sort Key: ($0) + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique2 on tenk1 + Index Cond: (unique2 IS NOT NULL) + -> Result + Optimizer: Postgres query optimizer +(8 rows) + +select max(unique2) from tenk1 order by 1; + max +------ + 9999 +(1 row) + +explain (costs off) + select max(unique2) from tenk1 order by max(unique2); + QUERY PLAN +--------------------------------------------------------------------- + Sort + Sort Key: ($0) + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique2 on tenk1 + Index Cond: (unique2 IS NOT NULL) + -> Result + Optimizer: Postgres query optimizer +(8 rows) + +select max(unique2) from tenk1 order by max(unique2); + max +------ + 9999 +(1 row) + +explain (costs off) + select max(unique2) from tenk1 order by max(unique2)+1; + QUERY PLAN +--------------------------------------------------------------------- + Sort + Sort Key: (($0 + 1)) + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique2 on tenk1 + Index Cond: (unique2 IS NOT NULL) + -> Result + Optimizer: Postgres query optimizer +(8 rows) + +select max(unique2) from tenk1 order by max(unique2)+1; + max +------ + 9999 +(1 row) + +explain (costs off) + select max(unique2), generate_series(1,3) as g from tenk1 order by g desc; + QUERY PLAN +--------------------------------------------------------------------- + Sort + Sort Key: (generate_series(1, 3)) DESC + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan Backward using tenk1_unique2 on tenk1 + Index Cond: (unique2 IS NOT NULL) + -> ProjectSet + -> Result + Optimizer: Postgres query optimizer +(9 rows) + +select max(unique2), generate_series(1,3) as g from tenk1 order by g desc; + max | g +------+--- + 9999 | 3 + 9999 | 2 + 9999 | 1 +(3 rows) + +-- interesting corner case: constant gets optimized into a seqscan +explain (costs off) + select max(100) from tenk1; + QUERY PLAN +---------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Result + One-Time Filter: (100 IS NOT NULL) + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(7 rows) + +select max(100) from tenk1; + max +----- + 100 +(1 row) + +-- try it on an inheritance tree +create table minmaxtest(f1 int); +create table minmaxtest1() inherits (minmaxtest); +create table minmaxtest2() inherits (minmaxtest); +create table minmaxtest3() inherits (minmaxtest); +create index minmaxtesti on minmaxtest(f1); +create index minmaxtest1i on minmaxtest1(f1); +create index minmaxtest2i on minmaxtest2(f1 desc); +create index minmaxtest3i on minmaxtest3(f1) where f1 is not null; +insert into minmaxtest values(11), (12); +insert into minmaxtest1 values(13), (14); +insert into minmaxtest2 values(15), (16); +insert into minmaxtest3 values(17), (18); +analyze minmaxtest; +analyze minmaxtest1; +analyze minmaxtest2; +analyze minmaxtest3; +set enable_seqscan=off; +explain (costs off) + select min(f1), max(f1) from minmaxtest; + QUERY PLAN +--------------------------------------------------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Merge Append + Sort Key: minmaxtest.f1 + -> Index Only Scan using minmaxtesti on minmaxtest minmaxtest_1 + Index Cond: (f1 IS NOT NULL) + -> Index Only Scan using minmaxtest1i on minmaxtest1 minmaxtest_2 + Index Cond: (f1 IS NOT NULL) + -> Index Only Scan Backward using minmaxtest2i on minmaxtest2 minmaxtest_3 + Index Cond: (f1 IS NOT NULL) + -> Index Only Scan using minmaxtest3i on minmaxtest3 minmaxtest_4 + InitPlan 2 (returns $1) + -> Limit + -> Merge Append + Sort Key: minmaxtest_5.f1 DESC + -> Index Only Scan Backward using minmaxtesti on minmaxtest minmaxtest_6 + Index Cond: (f1 IS NOT NULL) + -> Index Only Scan Backward using minmaxtest1i on minmaxtest1 minmaxtest_7 + Index Cond: (f1 IS NOT NULL) + -> Index Only Scan using minmaxtest2i on minmaxtest2 minmaxtest_8 + Index Cond: (f1 IS NOT NULL) + -> Index Only Scan Backward using minmaxtest3i on minmaxtest3 minmaxtest_9 + Optimizer: Postgres query optimizer +(24 rows) + +select min(f1), max(f1) from minmaxtest; + min | max +-----+----- + 11 | 18 +(1 row) + +reset enable_seqscan; +-- DISTINCT doesn't do anything useful here, but it shouldn't fail +explain (costs off) + select distinct min(f1), max(f1) from minmaxtest; + QUERY PLAN +-------------------------------------------------------------- + Unique + Group Key: (min(minmaxtest.f1)), (max(minmaxtest.f1)) + -> Sort + Sort Key: (min(minmaxtest.f1)), (max(minmaxtest.f1)) + -> Aggregate + -> Append + -> Seq Scan on minmaxtest minmaxtest_1 + -> Seq Scan on minmaxtest1 minmaxtest_2 + -> Seq Scan on minmaxtest2 minmaxtest_3 + -> Seq Scan on minmaxtest3 minmaxtest_4 + Optimizer: Postgres query optimizer +(11 rows) + +select distinct min(f1), max(f1) from minmaxtest; + min | max +-----+----- + 11 | 18 +(1 row) + +drop table minmaxtest cascade; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table minmaxtest1 +drop cascades to table minmaxtest2 +drop cascades to table minmaxtest3 +-- check for correct detection of nested-aggregate errors +select max(min(unique1)) from tenk1; +ERROR: aggregate function calls cannot be nested +LINE 1: select max(min(unique1)) from tenk1; + ^ +select (select max(min(unique1)) from int8_tbl) from tenk1; +ERROR: aggregate function calls cannot be nested +LINE 1: select (select max(min(unique1)) from int8_tbl) from tenk1; + ^ +select avg((select avg(a1.col1 order by (select avg(a2.col2) from tenk1 a3)) + from tenk1 a1(col1))) +from tenk1 a2(col2); +ERROR: aggregate function calls cannot be nested +LINE 1: select avg((select avg(a1.col1 order by (select avg(a2.col2)... + ^ +-- +-- Test removal of redundant GROUP BY columns +-- +create temp table t1 (a int, b int, c int, d int, primary key (a, b)); +create temp table t2 (x int, y int, z int, primary key (x, y)); +create temp table t3 (a int, b int, c int, primary key(a, b) deferrable); +-- Non-primary-key columns can be removed from GROUP BY +explain (costs off) select * from t1 group by a,b,c,d; + QUERY PLAN +------------------------------------- + HashAggregate + Group Key: a, b + -> Seq Scan on t1 + Optimizer: Postgres query optimizer +(4 rows) + +-- No removal can happen if the complete PK is not present in GROUP BY +explain (costs off) select a,c from t1 group by a,c,d; + QUERY PLAN +------------------------------------- + HashAggregate + Group Key: a, c, d + -> Seq Scan on t1 + Optimizer: Postgres query optimizer +(4 rows) + +-- Test removal across multiple relations +explain (costs off) select * +from t1 inner join t2 on t1.a = t2.x and t1.b = t2.y +group by t1.a,t1.b,t1.c,t1.d,t2.x,t2.y,t2.z; + QUERY PLAN +------------------------------------------------------------ + GroupAggregate + Group Key: t1.a, t1.b, t2.x, t2.y + -> Sort + Sort Key: t1.a, t1.b + -> Hash Join + Hash Cond: ((t2.x = t1.a) AND (t2.y = t1.b)) + -> Seq Scan on t2 + -> Hash + -> Seq Scan on t1 + Optimizer: Postgres query optimizer +(10 rows) + +-- Test case where t1 can be optimized but not t2 +explain (costs off) select t1.*,t2.x,t2.z +from t1 inner join t2 on t1.a = t2.x and t1.b = t2.y +group by t1.a,t1.b,t1.c,t1.d,t2.x,t2.z; + QUERY PLAN +------------------------------------------------------------ + GroupAggregate + Group Key: t1.a, t1.b, t2.x, t2.z + -> Sort + Sort Key: t1.a, t1.b, t2.z + -> Hash Join + Hash Cond: ((t2.x = t1.a) AND (t2.y = t1.b)) + -> Seq Scan on t2 + -> Hash + -> Seq Scan on t1 + Optimizer: Postgres query optimizer +(10 rows) + +-- Cannot optimize when PK is deferrable +explain (costs off) select * from t3 group by a,b,c; + QUERY PLAN +------------------------------------- + HashAggregate + Group Key: a, b, c + -> Seq Scan on t3 + Optimizer: Postgres query optimizer +(4 rows) + +create temp table t1c () inherits (t1); +-- Ensure we don't remove any columns when t1 has a child table +explain (costs off) select * from t1 group by a,b,c,d; + QUERY PLAN +------------------------------------- + HashAggregate + Group Key: t1.a, t1.b, t1.c, t1.d + -> Append + -> Seq Scan on t1 t1_1 + -> Seq Scan on t1c t1_2 + Optimizer: Postgres query optimizer +(6 rows) + +-- Okay to remove columns if we're only querying the parent. +explain (costs off) select * from only t1 group by a,b,c,d; + QUERY PLAN +------------------------------------- + HashAggregate + Group Key: a, b + -> Seq Scan on t1 + Optimizer: Postgres query optimizer +(4 rows) + +create temp table p_t1 ( + a int, + b int, + c int, + d int, + primary key(a,b) +) partition by list(a); +create temp table p_t1_1 partition of p_t1 for values in(1); +create temp table p_t1_2 partition of p_t1 for values in(2); +-- Ensure we can remove non-PK columns for partitioned tables. +explain (costs off) select * from p_t1 group by a,b,c,d; + QUERY PLAN +------------------------------------- + HashAggregate + Group Key: p_t1.a, p_t1.b + -> Append + -> Seq Scan on p_t1_1 + -> Seq Scan on p_t1_2 + Optimizer: Postgres query optimizer +(6 rows) + +drop table t1 cascade; +NOTICE: drop cascades to table t1c +drop table t2; +drop table t3; +drop table p_t1; +-- +-- Test GROUP BY matching of join columns that are type-coerced due to USING +-- +create temp table t1(f1 int, f2 bigint); +create temp table t2(f1 bigint, f22 bigint); +select f1 from t1 left join t2 using (f1) group by f1; + f1 +---- +(0 rows) + +select f1 from t1 left join t2 using (f1) group by t1.f1; + f1 +---- +(0 rows) + +select t1.f1 from t1 left join t2 using (f1) group by t1.f1; + f1 +---- +(0 rows) + +-- only this one should fail: +select t1.f1 from t1 left join t2 using (f1) group by f1; +ERROR: column "t1.f1" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: select t1.f1 from t1 left join t2 using (f1) group by f1; + ^ +drop table t1, t2; +-- +-- Test combinations of DISTINCT and/or ORDER BY +-- +select array_agg(a order by b) + from (values (1,4),(2,3),(3,1),(4,2)) v(a,b); + array_agg +----------- + {3,4,2,1} +(1 row) + +select array_agg(a order by a) + from (values (1,4),(2,3),(3,1),(4,2)) v(a,b); + array_agg +----------- + {1,2,3,4} +(1 row) + +select array_agg(a order by a desc) + from (values (1,4),(2,3),(3,1),(4,2)) v(a,b); + array_agg +----------- + {4,3,2,1} +(1 row) + +select array_agg(b order by a desc) + from (values (1,4),(2,3),(3,1),(4,2)) v(a,b); + array_agg +----------- + {2,1,3,4} +(1 row) + +select array_agg(distinct a) + from (values (1),(2),(1),(3),(null),(2)) v(a); + array_agg +-------------- + {1,2,3,NULL} +(1 row) + +select array_agg(distinct a order by a) + from (values (1),(2),(1),(3),(null),(2)) v(a); + array_agg +-------------- + {1,2,3,NULL} +(1 row) + +select array_agg(distinct a order by a desc) + from (values (1),(2),(1),(3),(null),(2)) v(a); + array_agg +-------------- + {NULL,3,2,1} +(1 row) + +select array_agg(distinct a order by a desc nulls last) + from (values (1),(2),(1),(3),(null),(2)) v(a); + array_agg +-------------- + {3,2,1,NULL} +(1 row) + +-- multi-arg aggs, strict/nonstrict, distinct/order by +select aggfstr(a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); + aggfstr +--------------------------------------- + {"(1,3,foo)","(2,2,bar)","(3,1,baz)"} +(1 row) + +select aggfns(a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); + aggfns +----------------------------------------------- + {"(1,3,foo)","(0,,)","(2,2,bar)","(3,1,baz)"} +(1 row) + +select aggfstr(distinct a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; + aggfstr +--------------------------------------- + {"(1,3,foo)","(2,2,bar)","(3,1,baz)"} +(1 row) + +select aggfns(distinct a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; + aggfns +----------------------------------------------- + {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"} +(1 row) + +select aggfstr(distinct a,b,c order by b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; + aggfstr +--------------------------------------- + {"(3,1,baz)","(2,2,bar)","(1,3,foo)"} +(1 row) + +select aggfns(distinct a,b,c order by b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; + aggfns +----------------------------------------------- + {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"} +(1 row) + +-- test specific code paths +select aggfns(distinct a,a,c order by c using ~<~,a) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + aggfns +------------------------------------------------ + {"(2,2,bar)","(3,3,baz)","(1,1,foo)","(0,0,)"} +(1 row) + +select aggfns(distinct a,a,c order by c using ~<~) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + aggfns +------------------------------------------------ + {"(2,2,bar)","(3,3,baz)","(1,1,foo)","(0,0,)"} +(1 row) + +select aggfns(distinct a,a,c order by a) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + aggfns +------------------------------------------------ + {"(0,0,)","(1,1,foo)","(2,2,bar)","(3,3,baz)"} +(1 row) + +select aggfns(distinct a,b,c order by a,c using ~<~,b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + aggfns +----------------------------------------------- + {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"} +(1 row) + +-- check node I/O via view creation and usage, also deparsing logic +-- start_ignore +-- pg_get_viewdef() runs some internal queries on catalogs, and we don't want +-- fallback notices about those. +reset optimizer_trace_fallback; +-- end_ignore +create view agg_view1 as + select aggfns(a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); +select * from agg_view1; + aggfns +----------------------------------------------- + {"(1,3,foo)","(0,,)","(2,2,bar)","(3,1,baz)"} +(1 row) + +select pg_get_viewdef('agg_view1'::regclass); + pg_get_viewdef +--------------------------------------------------------------------------------------------------------------------- + SELECT aggfns(v.a, v.b, v.c) AS aggfns + + FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c); +(1 row) + +create or replace view agg_view1 as + select aggfns(distinct a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; +select * from agg_view1; + aggfns +----------------------------------------------- + {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"} +(1 row) + +select pg_get_viewdef('agg_view1'::regclass); + pg_get_viewdef +--------------------------------------------------------------------------------------------------------------------- + SELECT aggfns(DISTINCT v.a, v.b, v.c) AS aggfns + + FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c),+ + generate_series(1, 3) i(i); +(1 row) + +create or replace view agg_view1 as + select aggfns(distinct a,b,c order by b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; +select * from agg_view1; + aggfns +----------------------------------------------- + {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"} +(1 row) + +select pg_get_viewdef('agg_view1'::regclass); + pg_get_viewdef +--------------------------------------------------------------------------------------------------------------------- + SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.b) AS aggfns + + FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c),+ + generate_series(1, 3) i(i); +(1 row) + +create or replace view agg_view1 as + select aggfns(a,b,c order by b+1) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); +select * from agg_view1; + aggfns +----------------------------------------------- + {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"} +(1 row) + +select pg_get_viewdef('agg_view1'::regclass); + pg_get_viewdef +--------------------------------------------------------------------------------------------------------------------- + SELECT aggfns(v.a, v.b, v.c ORDER BY (v.b + 1)) AS aggfns + + FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c); +(1 row) + +create or replace view agg_view1 as + select aggfns(a,a,c order by b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); +select * from agg_view1; + aggfns +------------------------------------------------ + {"(3,3,baz)","(2,2,bar)","(1,1,foo)","(0,0,)"} +(1 row) + +select pg_get_viewdef('agg_view1'::regclass); + pg_get_viewdef +--------------------------------------------------------------------------------------------------------------------- + SELECT aggfns(v.a, v.a, v.c ORDER BY v.b) AS aggfns + + FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c); +(1 row) + +create or replace view agg_view1 as + select aggfns(a,b,c order by c using ~<~) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); +select * from agg_view1; + aggfns +----------------------------------------------- + {"(2,2,bar)","(3,1,baz)","(1,3,foo)","(0,,)"} +(1 row) + +select pg_get_viewdef('agg_view1'::regclass); + pg_get_viewdef +--------------------------------------------------------------------------------------------------------------------- + SELECT aggfns(v.a, v.b, v.c ORDER BY v.c USING ~<~ NULLS LAST) AS aggfns + + FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c); +(1 row) + +create or replace view agg_view1 as + select aggfns(distinct a,b,c order by a,c using ~<~,b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; +select * from agg_view1; + aggfns +----------------------------------------------- + {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"} +(1 row) + +select pg_get_viewdef('agg_view1'::regclass); + pg_get_viewdef +--------------------------------------------------------------------------------------------------------------------- + SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.a, v.c USING ~<~ NULLS LAST, v.b) AS aggfns + + FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c),+ + generate_series(1, 2) i(i); +(1 row) + +drop view agg_view1; +-- start_ignore +SET optimizer_trace_fallback to on; +-- end_ignore +-- incorrect DISTINCT usage errors +select aggfns(distinct a,b,c order by i) + from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i; +ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list +LINE 1: select aggfns(distinct a,b,c order by i) + ^ +select aggfns(distinct a,b,c order by a,b+1) + from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i; +ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list +LINE 1: select aggfns(distinct a,b,c order by a,b+1) + ^ +select aggfns(distinct a,b,c order by a,b,i,c) + from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i; +ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list +LINE 1: select aggfns(distinct a,b,c order by a,b,i,c) + ^ +select aggfns(distinct a,a,c order by a,b) + from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i; +ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list +LINE 1: select aggfns(distinct a,a,c order by a,b) + ^ +-- string_agg tests +select string_agg(a,',') from (values('aaaa'),('bbbb'),('cccc')) g(a); + string_agg +---------------- + aaaa,bbbb,cccc +(1 row) + +select string_agg(a,',') from (values('aaaa'),(null),('bbbb'),('cccc')) g(a); + string_agg +---------------- + aaaa,bbbb,cccc +(1 row) + +select string_agg(a,'AB') from (values(null),(null),('bbbb'),('cccc')) g(a); + string_agg +------------ + bbbbABcccc +(1 row) + +select string_agg(a,',') from (values(null),(null)) g(a); + string_agg +------------ + +(1 row) + +-- check some implicit casting cases, as per bug #5564 +select string_agg(distinct f1, ',' order by f1) from varchar_tbl; -- ok + string_agg +------------ + a,ab,abcd +(1 row) + +select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not ok +ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list +LINE 1: select string_agg(distinct f1::text, ',' order by f1) from v... + ^ +select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok +ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list +LINE 1: select string_agg(distinct f1, ',' order by f1::text) from v... + ^ +select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok + string_agg +------------ + a,ab,abcd +(1 row) + +-- FILTER tests +select min(unique1) filter (where unique1 > 100) from tenk1; + min +----- + 101 +(1 row) + +select ten, sum(distinct four) filter (where four::text ~ '123') from onek a +group by ten; + ten | sum +-----+----- + 0 | + 1 | + 2 | + 3 | + 4 | + 5 | + 6 | + 7 | + 8 | + 9 | +(10 rows) + +select ten, sum(distinct four) filter (where four > 10) from onek a +group by ten +having exists (select 1 from onek b where sum(distinct a.four) = b.four); + ten | sum +-----+----- + 0 | + 2 | + 4 | + 6 | + 8 | +(5 rows) + +select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0') +from (values ('a', 'b')) AS v(foo,bar); + max +----- + a +(1 row) + +-- outer reference in FILTER (PostgreSQL extension) +select (select count(*) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- inner query is aggregation query + count +------- + 1 + 1 +(2 rows) + +select (select count(*) filter (where outer_c <> 0) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- outer query is aggregation query + count +------- + 2 +(1 row) + +select (select count(inner_c) filter (where outer_c <> 0) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- inner query is aggregation query + count +------- + 1 + 1 +(2 rows) + +select + (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1)) + filter (where o.unique1 < 10)) +from tenk1 o; -- outer query is aggregation query + max +------ + 9998 +(1 row) + +-- subquery in FILTER clause (PostgreSQL extension) +select sum(unique1) FILTER (WHERE + unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1; + sum +------ + 4950 +(1 row) + +-- exercise lots of aggregate parts with FILTER +select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + aggfns +--------------------------- + {"(2,2,bar)","(3,1,baz)"} +(1 row) + +-- ordered-set aggregates +select p, percentile_cont(p) within group (order by x::float8) +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + p | percentile_cont +------+----------------- + 0 | 1 + 0.1 | 1.4 + 0.25 | 2 + 0.4 | 2.6 + 0.5 | 3 + 0.6 | 3.4 + 0.75 | 4 + 0.9 | 4.6 + 1 | 5 +(9 rows) + +select p, percentile_cont(p order by p) within group (order by x) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; +ERROR: cannot use multiple ORDER BY clauses with WITHIN GROUP +LINE 1: select p, percentile_cont(p order by p) within group (order ... + ^ +select p, sum() within group (order by x::float8) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; +ERROR: sum is not an ordered-set aggregate, so it cannot have WITHIN GROUP +LINE 1: select p, sum() within group (order by x::float8) + ^ +select p, percentile_cont(p,p) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; +ERROR: WITHIN GROUP is required for ordered-set aggregate percentile_cont +LINE 1: select p, percentile_cont(p,p) + ^ +select percentile_cont(0.5) within group (order by b) from aggtest; + percentile_cont +------------------ + 53.4485001564026 +(1 row) + +select percentile_cont(0.5) within group (order by b), sum(b) from aggtest; + percentile_cont | sum +------------------+--------- + 53.4485001564026 | 431.773 +(1 row) + +select percentile_cont(0.5) within group (order by thousand) from tenk1; + percentile_cont +----------------- + 499.5 +(1 row) + +select percentile_disc(0.5) within group (order by thousand) from tenk1; + percentile_disc +----------------- + 499 +(1 row) + +select rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + rank +------ + 5 +(1 row) + +select cume_dist(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + cume_dist +----------- + 0.875 +(1 row) + +select percent_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4),(5)) v(x); + percent_rank +-------------- + 0.5 +(1 row) + +select dense_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + dense_rank +------------ + 3 +(1 row) + +select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand) +from tenk1; + percentile_disc +---------------------------- + {0,99,249,499,749,899,999} +(1 row) + +select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand) +from tenk1; + percentile_cont +----------------------------- + {0,249.75,499.5,749.25,999} +(1 row) + +select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand) +from tenk1; + percentile_disc +--------------------------------- + {{NULL,999,499},{749,249,NULL}} +(1 row) + +select percentile_cont(array[0,1,0.25,0.75,0.5,1]) within group (order by x) +from generate_series(1,6) x; + percentile_cont +----------------------- + {1,6,2.25,4.75,3.5,6} +(1 row) + +select ten, mode() within group (order by string4) from tenk1 group by ten order by ten; + ten | mode +-----+-------- + 0 | HHHHxx + 1 | OOOOxx + 2 | VVVVxx + 3 | OOOOxx + 4 | HHHHxx + 5 | HHHHxx + 6 | OOOOxx + 7 | AAAAxx + 8 | VVVVxx + 9 | VVVVxx +(10 rows) + +select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) +from unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]) u(x); + percentile_disc +----------------- + {fred,jill,jim} +(1 row) + +-- check collation propagates up in suitable cases: +select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) + from (values ('fred'),('jim')) v(x); + pg_collation_for +------------------ + "POSIX" +(1 row) + +-- ordered-set aggs created with CREATE AGGREGATE +select test_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + test_rank +----------- + 5 +(1 row) + +select test_percentile_disc(0.5) within group (order by thousand) from tenk1; + test_percentile_disc +---------------------- + 499 +(1 row) + +-- ordered-set aggs can't use ungrouped vars in direct args: +select rank(x) within group (order by x) from generate_series(1,5) x; +ERROR: column "x.x" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: select rank(x) within group (order by x) from generate_serie... + ^ +DETAIL: Direct arguments of an ordered-set aggregate must use only grouped columns. +-- outer-level agg can't use a grouped arg of a lower level, either: +select array(select percentile_disc(a) within group (order by x) + from (values (0.3),(0.7)) v(a) group by a) + from generate_series(1,5) g(x); +ERROR: outer-level aggregate cannot contain a lower-level variable in its direct arguments +LINE 1: select array(select percentile_disc(a) within group (order b... + ^ +-- agg in the direct args is a grouping violation, too: +select rank(sum(x)) within group (order by x) from generate_series(1,5) x; +ERROR: aggregate function calls cannot be nested +LINE 1: select rank(sum(x)) within group (order by x) from generate_... + ^ +-- hypothetical-set type unification and argument-count failures: +select rank(3) within group (order by x) from (values ('fred'),('jim')) v(x); +ERROR: WITHIN GROUP types text and integer cannot be matched +LINE 1: select rank(3) within group (order by x) from (values ('fred... + ^ +select rank(3) within group (order by stringu1,stringu2) from tenk1; +ERROR: function rank(integer, name, name) does not exist +LINE 1: select rank(3) within group (order by stringu1,stringu2) fro... + ^ +HINT: To use the hypothetical-set aggregate rank, the number of hypothetical direct arguments (here 1) must match the number of ordering columns (here 2). +select rank('fred') within group (order by x) from generate_series(1,5) x; +ERROR: invalid input syntax for type integer: "fred" +LINE 1: select rank('fred') within group (order by x) from generate_... + ^ +select rank('adam'::text collate "C") within group (order by x collate "POSIX") + from (values ('fred'),('jim')) v(x); +ERROR: collation mismatch between explicit collations "C" and "POSIX" +LINE 1: ...adam'::text collate "C") within group (order by x collate "P... + ^ +-- hypothetical-set type unification successes: +select rank('adam'::varchar) within group (order by x) from (values ('fred'),('jim')) v(x); + rank +------ + 1 +(1 row) + +select rank('3') within group (order by x) from generate_series(1,5) x; + rank +------ + 3 +(1 row) + +-- divide by zero check +select percent_rank(0) within group (order by x) from generate_series(1,0) x; + percent_rank +-------------- + 0 +(1 row) + +-- deparse and multiple features: +create view aggordview1 as +select ten, + percentile_disc(0.5) within group (order by thousand) as p50, + percentile_disc(0.5) within group (order by thousand) filter (where hundred=1) as px, + rank(5,'AZZZZ',50) within group (order by hundred, string4 desc, hundred) + from tenk1 + group by ten order by ten; +-- start_ignore +-- pg_get_viewdef() runs some internal queries on catalogs, and we don't want +-- fallback notices about those. +reset optimizer_trace_fallback; +-- end_ignore +select pg_get_viewdef('aggordview1'); + pg_get_viewdef +------------------------------------------------------------------------------------------------------------------------------- + SELECT tenk1.ten, + + percentile_disc((0.5)::double precision) WITHIN GROUP (ORDER BY tenk1.thousand) AS p50, + + percentile_disc((0.5)::double precision) WITHIN GROUP (ORDER BY tenk1.thousand) FILTER (WHERE (tenk1.hundred = 1)) AS px,+ + rank(5, 'AZZZZ'::name, 50) WITHIN GROUP (ORDER BY tenk1.hundred, tenk1.string4 DESC, tenk1.hundred) AS rank + + FROM tenk1 + + GROUP BY tenk1.ten + + ORDER BY tenk1.ten; +(1 row) + +-- start_ignore +SET optimizer_trace_fallback to on; +-- end_ignore +select * from aggordview1 order by ten; + ten | p50 | px | rank +-----+-----+-----+------ + 0 | 490 | | 101 + 1 | 491 | 401 | 101 + 2 | 492 | | 101 + 3 | 493 | | 101 + 4 | 494 | | 101 + 5 | 495 | | 67 + 6 | 496 | | 1 + 7 | 497 | | 1 + 8 | 498 | | 1 + 9 | 499 | | 1 +(10 rows) + +drop view aggordview1; +-- variadic aggregates +select least_agg(q1,q2) from int8_tbl; + least_agg +------------------- + -4567890123456789 +(1 row) + +select least_agg(variadic array[q1,q2]) from int8_tbl; + least_agg +------------------- + -4567890123456789 +(1 row) + +-- string_agg bytea tests +create table bytea_test_table(gpDistKey int, v bytea); +select string_agg(v, '') from bytea_test_table; + string_agg +------------ + +(1 row) + +insert into bytea_test_table(v) values(decode('ff','hex')); +select string_agg(v, '') from bytea_test_table; + string_agg +------------ + \xff +(1 row) + +insert into bytea_test_table(v) values(decode('aa','hex')); +select string_agg(v, '') from bytea_test_table; + string_agg +------------ + \xffaa +(1 row) + +select string_agg(v, NULL) from bytea_test_table; + string_agg +------------ + \xffaa +(1 row) + +select string_agg(v, decode('ee', 'hex')) from bytea_test_table; + string_agg +------------ + \xffeeaa +(1 row) + +drop table bytea_test_table; +-- FILTER tests +select min(unique1) filter (where unique1 > 100) from tenk1; + min +----- + 101 +(1 row) + +select sum(1/ten) filter (where ten > 0) from tenk1; + sum +------ + 1000 +(1 row) + +select ten, sum(distinct four) filter (where four::text ~ '123') from onek a +group by ten; + ten | sum +-----+----- + 0 | + 1 | + 2 | + 3 | + 4 | + 5 | + 6 | + 7 | + 8 | + 9 | +(10 rows) + +select ten, sum(distinct four) filter (where four > 10) from onek a +group by ten +having exists (select 1 from onek b where sum(distinct a.four) = b.four); + ten | sum +-----+----- + 0 | + 2 | + 4 | + 6 | + 8 | +(5 rows) + +select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0') +from (values ('a', 'b')) AS v(foo,bar); + max +----- + a +(1 row) + +-- outer reference in FILTER (PostgreSQL extension) +select (select count(*) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- inner query is aggregation query + count +------- + 1 + 1 +(2 rows) + +select (select count(*) filter (where outer_c <> 0) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- outer query is aggregation query + count +------- + 2 +(1 row) + +select (select count(inner_c) filter (where outer_c <> 0) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- inner query is aggregation query + count +------- + 1 + 1 +(2 rows) + +select + (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1)) + filter (where o.unique1 < 10)) +from tenk1 o; -- outer query is aggregation query + max +------ + 9998 +(1 row) + +-- subquery in FILTER clause (PostgreSQL extension) +select sum(unique1) FILTER (WHERE + unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1; + sum +------ + 4950 +(1 row) + +-- exercise lots of aggregate parts with FILTER +select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + aggfns +--------------------------- + {"(2,2,bar)","(3,1,baz)"} +(1 row) + +-- check handling of bare boolean Var in FILTER +select max(0) filter (where b1) from bool_test; + max +----- + 0 +(1 row) + +select (select max(0) filter (where b1)) from bool_test; + max +----- + 0 +(1 row) + +-- check for correct detection of nested-aggregate errors in FILTER +select max(unique1) filter (where sum(ten) > 0) from tenk1; +ERROR: aggregate functions are not allowed in FILTER +LINE 1: select max(unique1) filter (where sum(ten) > 0) from tenk1; + ^ +select (select max(unique1) filter (where sum(ten) > 0) from int8_tbl) from tenk1; +ERROR: aggregate function calls cannot be nested +LINE 1: select (select max(unique1) filter (where sum(ten) > 0) from... + ^ +select max(unique1) filter (where bool_or(ten > 0)) from tenk1; +ERROR: aggregate functions are not allowed in FILTER +LINE 1: select max(unique1) filter (where bool_or(ten > 0)) from ten... + ^ +select (select max(unique1) filter (where bool_or(ten > 0)) from int8_tbl) from tenk1; +ERROR: aggregate function calls cannot be nested +LINE 1: select (select max(unique1) filter (where bool_or(ten > 0)) ... + ^ +-- ordered-set aggregates +select p, percentile_cont(p) within group (order by x::float8) +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + p | percentile_cont +------+----------------- + 0 | 1 + 0.1 | 1.4 + 0.25 | 2 + 0.4 | 2.6 + 0.5 | 3 + 0.6 | 3.4 + 0.75 | 4 + 0.9 | 4.6 + 1 | 5 +(9 rows) + +select p, percentile_cont(p order by p) within group (order by x) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; +ERROR: cannot use multiple ORDER BY clauses with WITHIN GROUP +LINE 1: select p, percentile_cont(p order by p) within group (order ... + ^ +select p, sum() within group (order by x::float8) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; +ERROR: sum is not an ordered-set aggregate, so it cannot have WITHIN GROUP +LINE 1: select p, sum() within group (order by x::float8) + ^ +select p, percentile_cont(p,p) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; +ERROR: WITHIN GROUP is required for ordered-set aggregate percentile_cont +LINE 1: select p, percentile_cont(p,p) + ^ +select percentile_cont(0.5) within group (order by b) from aggtest; + percentile_cont +------------------ + 53.4485001564026 +(1 row) + +select percentile_cont(0.5) within group (order by b), sum(b) from aggtest; + percentile_cont | sum +------------------+--------- + 53.4485001564026 | 431.773 +(1 row) + +select percentile_cont(0.5) within group (order by thousand) from tenk1; + percentile_cont +----------------- + 499.5 +(1 row) + +select percentile_disc(0.5) within group (order by thousand) from tenk1; + percentile_disc +----------------- + 499 +(1 row) + +select rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + rank +------ + 5 +(1 row) + +select cume_dist(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + cume_dist +----------- + 0.875 +(1 row) + +select percent_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4),(5)) v(x); + percent_rank +-------------- + 0.5 +(1 row) + +select dense_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + dense_rank +------------ + 3 +(1 row) + +select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand) +from tenk1; + percentile_disc +---------------------------- + {0,99,249,499,749,899,999} +(1 row) + +select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand) +from tenk1; + percentile_cont +----------------------------- + {0,249.75,499.5,749.25,999} +(1 row) + +select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand) +from tenk1; + percentile_disc +--------------------------------- + {{NULL,999,499},{749,249,NULL}} +(1 row) + +select percentile_cont(array[0,1,0.25,0.75,0.5,1,0.3,0.32,0.35,0.38,0.4]) within group (order by x) +from generate_series(1,6) x; + percentile_cont +------------------------------------------ + {1,6,2.25,4.75,3.5,6,2.5,2.6,2.75,2.9,3} +(1 row) + +select ten, mode() within group (order by string4) from tenk1 group by ten; + ten | mode +-----+-------- + 0 | HHHHxx + 1 | OOOOxx + 2 | VVVVxx + 3 | OOOOxx + 4 | HHHHxx + 5 | HHHHxx + 6 | OOOOxx + 7 | AAAAxx + 8 | VVVVxx + 9 | VVVVxx +(10 rows) + +select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) +from unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]) u(x); + percentile_disc +----------------- + {fred,jill,jim} +(1 row) + +-- check collation propagates up in suitable cases: +select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) + from (values ('fred'),('jim')) v(x); + pg_collation_for +------------------ + "POSIX" +(1 row) + +-- ordered-set aggs created with CREATE AGGREGATE +select test_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + test_rank +----------- + 5 +(1 row) + +select test_percentile_disc(0.5) within group (order by thousand) from tenk1; + test_percentile_disc +---------------------- + 499 +(1 row) + +-- ordered-set aggs can't use ungrouped vars in direct args: +select rank(x) within group (order by x) from generate_series(1,5) x; +ERROR: column "x.x" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: select rank(x) within group (order by x) from generate_serie... + ^ +DETAIL: Direct arguments of an ordered-set aggregate must use only grouped columns. +-- outer-level agg can't use a grouped arg of a lower level, either: +select array(select percentile_disc(a) within group (order by x) + from (values (0.3),(0.7)) v(a) group by a) + from generate_series(1,5) g(x); +ERROR: outer-level aggregate cannot contain a lower-level variable in its direct arguments +LINE 1: select array(select percentile_disc(a) within group (order b... + ^ +-- agg in the direct args is a grouping violation, too: +select rank(sum(x)) within group (order by x) from generate_series(1,5) x; +ERROR: aggregate function calls cannot be nested +LINE 1: select rank(sum(x)) within group (order by x) from generate_... + ^ +-- hypothetical-set type unification and argument-count failures: +select rank(3) within group (order by x) from (values ('fred'),('jim')) v(x); +ERROR: WITHIN GROUP types text and integer cannot be matched +LINE 1: select rank(3) within group (order by x) from (values ('fred... + ^ +select rank(3) within group (order by stringu1,stringu2) from tenk1; +ERROR: function rank(integer, name, name) does not exist +LINE 1: select rank(3) within group (order by stringu1,stringu2) fro... + ^ +HINT: To use the hypothetical-set aggregate rank, the number of hypothetical direct arguments (here 1) must match the number of ordering columns (here 2). +select rank('fred') within group (order by x) from generate_series(1,5) x; +ERROR: invalid input syntax for type integer: "fred" +LINE 1: select rank('fred') within group (order by x) from generate_... + ^ +select rank('adam'::text collate "C") within group (order by x collate "POSIX") + from (values ('fred'),('jim')) v(x); +ERROR: collation mismatch between explicit collations "C" and "POSIX" +LINE 1: ...adam'::text collate "C") within group (order by x collate "P... + ^ +-- hypothetical-set type unification successes: +select rank('adam'::varchar) within group (order by x) from (values ('fred'),('jim')) v(x); + rank +------ + 1 +(1 row) + +select rank('3') within group (order by x) from generate_series(1,5) x; + rank +------ + 3 +(1 row) + +-- divide by zero check +select percent_rank(0) within group (order by x) from generate_series(1,0) x; + percent_rank +-------------- + 0 +(1 row) + +-- deparse and multiple features: +create view aggordview1 as +select ten, + percentile_disc(0.5) within group (order by thousand) as p50, + percentile_disc(0.5) within group (order by thousand) filter (where hundred=1) as px, + rank(5,'AZZZZ',50) within group (order by hundred, string4 desc, hundred) + from tenk1 + group by ten order by ten; +-- start_ignore +-- pg_get_viewdef() runs some internal queries on catalogs, and we don't want +-- fallback notices about those. +reset optimizer_trace_fallback; +-- end_ignore +select pg_get_viewdef('aggordview1'); + pg_get_viewdef +------------------------------------------------------------------------------------------------------------------------------- + SELECT tenk1.ten, + + percentile_disc((0.5)::double precision) WITHIN GROUP (ORDER BY tenk1.thousand) AS p50, + + percentile_disc((0.5)::double precision) WITHIN GROUP (ORDER BY tenk1.thousand) FILTER (WHERE (tenk1.hundred = 1)) AS px,+ + rank(5, 'AZZZZ'::name, 50) WITHIN GROUP (ORDER BY tenk1.hundred, tenk1.string4 DESC, tenk1.hundred) AS rank + + FROM tenk1 + + GROUP BY tenk1.ten + + ORDER BY tenk1.ten; +(1 row) + +-- start_ignore +SET optimizer_trace_fallback to on; +-- end_ignore +select * from aggordview1 order by ten; + ten | p50 | px | rank +-----+-----+-----+------ + 0 | 490 | | 101 + 1 | 491 | 401 | 101 + 2 | 492 | | 101 + 3 | 493 | | 101 + 4 | 494 | | 101 + 5 | 495 | | 67 + 6 | 496 | | 1 + 7 | 497 | | 1 + 8 | 498 | | 1 + 9 | 499 | | 1 +(10 rows) + +drop view aggordview1; +-- variadic aggregates +select least_agg(q1,q2) from int8_tbl; + least_agg +------------------- + -4567890123456789 +(1 row) + +select least_agg(variadic array[q1,q2]) from int8_tbl; + least_agg +------------------- + -4567890123456789 +(1 row) + +select cleast_agg(q1,q2) from int8_tbl; + cleast_agg +------------------- + -4567890123456789 +(1 row) + +select cleast_agg(4.5,f1) from int4_tbl; + cleast_agg +------------- + -2147483647 +(1 row) + +select cleast_agg(variadic array[4.5,f1]) from int4_tbl; + cleast_agg +------------- + -2147483647 +(1 row) + +select pg_typeof(cleast_agg(variadic array[4.5,f1])) from int4_tbl; + pg_typeof +----------- + numeric +(1 row) + +-- test aggregates with common transition functions share the same states +begin work; +create type avg_state as (total bigint, count bigint); +create or replace function avg_transfn(state avg_state, n int) returns avg_state as +$$ +declare new_state avg_state; +begin + raise notice 'avg_transfn called with %', n; + if state is null then + if n is not null then + new_state.total := n; + new_state.count := 1; + return new_state; + end if; + return null; + elsif n is not null then + state.total := state.total + n; + state.count := state.count + 1; + return state; + end if; + + return null; +end +$$ language plpgsql; +create function avg_finalfn(state avg_state) returns int4 as +$$ +begin + if state is null then + return NULL; + else + return state.total / state.count; + end if; +end +$$ language plpgsql; +create function sum_finalfn(state avg_state) returns int4 as +$$ +begin + if state is null then + return NULL; + else + return state.total; + end if; +end +$$ language plpgsql; +create aggregate my_avg(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = avg_finalfn +); +create aggregate my_sum(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = sum_finalfn +); +-- aggregate state should be shared as aggs are the same. +select my_avg(one),my_avg(one) from (values(1),(3)) t(one); +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 3 + my_avg | my_avg +--------+-------- + 2 | 2 +(1 row) + +-- aggregate state should be shared as transfn is the same for both aggs. +select my_avg(one),my_sum(one) from (values(1),(3)) t(one); +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 3 + my_avg | my_sum +--------+-------- + 2 | 4 +(1 row) + +-- same as previous one, but with DISTINCT, which requires sorting the input. +select my_avg(distinct one),my_sum(distinct one) from (values(1),(3),(1)) t(one); +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 3 + my_avg | my_sum +--------+-------- + 2 | 4 +(1 row) + +-- shouldn't share states due to the distinctness not matching. +select my_avg(distinct one),my_sum(one) from (values(1),(3)) t(one); +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 3 +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 3 + my_avg | my_sum +--------+-------- + 2 | 4 +(1 row) + +-- shouldn't share states due to the filter clause not matching. +select my_avg(one) filter (where one > 1),my_sum(one) from (values(1),(3)) t(one); +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 3 +NOTICE: avg_transfn called with 3 + my_avg | my_sum +--------+-------- + 3 | 4 +(1 row) + +-- this should not share the state due to different input columns. +select my_avg(one),my_sum(two) from (values(1,2),(3,4)) t(one,two); +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 2 +NOTICE: avg_transfn called with 3 +NOTICE: avg_transfn called with 4 + my_avg | my_sum +--------+-------- + 2 | 6 +(1 row) + +-- exercise cases where OSAs share state +select + percentile_cont(0.5) within group (order by a), + percentile_disc(0.5) within group (order by a) +from (values(1::float8),(3),(5),(7)) t(a); + percentile_cont | percentile_disc +-----------------+----------------- + 4 | 3 +(1 row) + +select + percentile_cont(0.25) within group (order by a), + percentile_disc(0.5) within group (order by a) +from (values(1::float8),(3),(5),(7)) t(a); + percentile_cont | percentile_disc +-----------------+----------------- + 2.5 | 3 +(1 row) + +-- these can't share state currently +select + rank(4) within group (order by a), + dense_rank(4) within group (order by a) +from (values(1),(3),(5),(7)) t(a); + rank | dense_rank +------+------------ + 3 | 3 +(1 row) + +-- test that aggs with the same sfunc and initcond share the same agg state +create aggregate my_sum_init(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = sum_finalfn, + initcond = '(10,0)' +); +create aggregate my_avg_init(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = avg_finalfn, + initcond = '(10,0)' +); +create aggregate my_avg_init2(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = avg_finalfn, + initcond = '(4,0)' +); +-- state should be shared if INITCONDs are matching +select my_sum_init(one),my_avg_init(one) from (values(1),(3)) t(one); +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 3 + my_sum_init | my_avg_init +-------------+------------- + 14 | 7 +(1 row) + +-- Varying INITCONDs should cause the states not to be shared. +select my_sum_init(one),my_avg_init2(one) from (values(1),(3)) t(one); +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 1 +NOTICE: avg_transfn called with 3 +NOTICE: avg_transfn called with 3 + my_sum_init | my_avg_init2 +-------------+-------------- + 14 | 4 +(1 row) + +rollback; +-- test aggregate state sharing to ensure it works if one aggregate has a +-- finalfn and the other one has none. +begin work; +create or replace function sum_transfn(state int4, n int4) returns int4 as +$$ +declare new_state int4; +begin + raise notice 'sum_transfn called with %', n; + if state is null then + if n is not null then + new_state := n; + return new_state; + end if; + return null; + elsif n is not null then + state := state + n; + return state; + end if; + + return null; +end +$$ language plpgsql; +create function halfsum_finalfn(state int4) returns int4 as +$$ +begin + if state is null then + return NULL; + else + return state / 2; + end if; +end +$$ language plpgsql; +create aggregate my_sum(int4) +( + stype = int4, + sfunc = sum_transfn +); +create aggregate my_half_sum(int4) +( + stype = int4, + sfunc = sum_transfn, + finalfunc = halfsum_finalfn +); +-- Agg state should be shared even though my_sum has no finalfn +select my_sum(one),my_half_sum(one) from (values(1),(2),(3),(4)) t(one); +NOTICE: sum_transfn called with 1 +NOTICE: sum_transfn called with 2 +NOTICE: sum_transfn called with 3 +NOTICE: sum_transfn called with 4 + my_sum | my_half_sum +--------+------------- + 10 | 5 +(1 row) + +rollback; +-- test that the aggregate transition logic correctly handles +-- transition / combine functions returning NULL +-- First test the case of a normal transition function returning NULL +BEGIN; +CREATE FUNCTION balkifnull(int8, int4) +RETURNS int8 +STRICT +LANGUAGE plpgsql AS $$ +BEGIN + IF $1 IS NULL THEN + RAISE 'erroneously called with NULL argument'; + END IF; + RETURN NULL; +END$$; +CREATE AGGREGATE balk(int4) +( + SFUNC = balkifnull(int8, int4), + STYPE = int8, + PARALLEL = SAFE, + INITCOND = '0' +); +SELECT balk(hundred) FROM tenk1; + balk +------ + +(1 row) + +ROLLBACK; +-- Secondly test the case of a parallel aggregate combiner function +-- returning NULL. For that use normal transition function, but a +-- combiner function returning NULL. +BEGIN; +CREATE FUNCTION balkifnull(int8, int8) +RETURNS int8 +PARALLEL SAFE +STRICT +LANGUAGE plpgsql AS $$ +BEGIN + IF $1 IS NULL THEN + RAISE 'erroneously called with NULL argument'; + END IF; + RETURN NULL; +END$$; +CREATE AGGREGATE balk(int4) +( + SFUNC = int4_sum(int8, int4), + STYPE = int8, + COMBINEFUNC = balkifnull(int8, int8), + PARALLEL = SAFE, + INITCOND = '0' +); +-- force use of parallelism +-- In single-node, we don't have mutliple-stage aggregation. +-- Thus we don't call combine function, and the result it not empty. +ALTER TABLE tenk1 set (parallel_workers = 4); +SET LOCAL parallel_setup_cost=0; +SET LOCAL max_parallel_workers_per_gather=4; +EXPLAIN (COSTS OFF) SELECT balk(hundred) FROM tenk1; + QUERY PLAN +---------------------------------------------------- + Aggregate + -> Index Only Scan using tenk1_hundred on tenk1 + Optimizer: Postgres query optimizer +(3 rows) + +SELECT balk(hundred) FROM tenk1; + balk +-------- + 495000 +(1 row) + +ROLLBACK; +-- test coverage for aggregate combine/serial/deserial functions +BEGIN; +SET parallel_setup_cost = 0; +SET parallel_tuple_cost = 0; +SET min_parallel_table_scan_size = 0; +SET max_parallel_workers_per_gather = 4; +SET parallel_leader_participation = off; +SET enable_indexonlyscan = off; +-- variance(int4) covers numeric_poly_combine +-- sum(int8) covers int8_avg_combine +-- regr_count(float8, float8) covers int8inc_float8_float8 and aggregates with > 1 arg +EXPLAIN (COSTS OFF, VERBOSE) +SELECT variance(unique1::int4), sum(unique1::int8), regr_count(unique1::float8, unique1::float8) +FROM (SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1) u; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + Output: variance(tenk1.unique1), sum((tenk1.unique1)::bigint), regr_count((tenk1.unique1)::double precision, (tenk1.unique1)::double precision) + -> Append + -> Seq Scan on public.tenk1 + Output: tenk1.unique1 + -> Seq Scan on public.tenk1 tenk1_1 + Output: tenk1_1.unique1 + -> Seq Scan on public.tenk1 tenk1_2 + Output: tenk1_2.unique1 + -> Seq Scan on public.tenk1 tenk1_3 + Output: tenk1_3.unique1 + Settings: enable_indexonlyscan = 'off', min_parallel_table_scan_size = '0', parallel_setup_cost = '0', parallel_tuple_cost = '0' + Optimizer: Postgres query optimizer +(13 rows) + +SELECT variance(unique1::int4), sum(unique1::int8), regr_count(unique1::float8, unique1::float8) +FROM (SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1) u; + variance | sum | regr_count +----------------------+-----------+------------ + 8333541.588539713493 | 199980000 | 40000 +(1 row) + +-- variance(int8) covers numeric_combine +-- avg(numeric) covers numeric_avg_combine +EXPLAIN (COSTS OFF, VERBOSE) +SELECT variance(unique1::int8), avg(unique1::numeric) +FROM (SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1) u; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------- + Aggregate + Output: variance((tenk1.unique1)::bigint), avg((tenk1.unique1)::numeric) + -> Append + -> Seq Scan on public.tenk1 + Output: tenk1.unique1 + -> Seq Scan on public.tenk1 tenk1_1 + Output: tenk1_1.unique1 + -> Seq Scan on public.tenk1 tenk1_2 + Output: tenk1_2.unique1 + -> Seq Scan on public.tenk1 tenk1_3 + Output: tenk1_3.unique1 + Settings: enable_indexonlyscan = 'off', min_parallel_table_scan_size = '0', parallel_setup_cost = '0', parallel_tuple_cost = '0' + Optimizer: Postgres query optimizer +(13 rows) + +SELECT variance(unique1::int8), avg(unique1::numeric) +FROM (SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1) u; + variance | avg +----------------------+----------------------- + 8333541.588539713493 | 4999.5000000000000000 +(1 row) + +ROLLBACK; +-- test coverage for dense_rank +SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(1),(2),(2),(3),(3)) v(x) GROUP BY (x) ORDER BY 1; + dense_rank +------------ + 1 + 1 + 1 +(3 rows) + +-- Ensure that the STRICT checks for aggregates does not take NULLness +-- of ORDER BY columns into account. See bug report around +-- 2a505161-2727-2473-7c46-591ed108ac52@email.cz +SELECT min(x ORDER BY y) FROM (VALUES(1, NULL)) AS d(x,y); + min +----- + 1 +(1 row) + +SELECT min(x ORDER BY y) FROM (VALUES(1, 2)) AS d(x,y); + min +----- + 1 +(1 row) + +-- check collation-sensitive matching between grouping expressions +select v||'a', case v||'a' when 'aa' then 1 else 0 end, count(*) + from unnest(array['a','b']) u(v) + group by v||'a' order by 1; + ?column? | case | count +----------+------+------- + aa | 1 | 1 + ba | 0 | 1 +(2 rows) + +select v||'a', case when v||'a' = 'aa' then 1 else 0 end, count(*) + from unnest(array['a','b']) u(v) + group by v||'a' order by 1; + ?column? | case | count +----------+------+------- + aa | 1 | 1 + ba | 0 | 1 +(2 rows) + +-- Make sure that generation of HashAggregate for uniqification purposes +-- does not lead to array overflow due to unexpected duplicate hash keys +-- see CAFeeJoKKu0u+A_A9R9316djW-YW3-+Gtgvy3ju655qRHR3jtdA@mail.gmail.com +set enable_memoize to off; +explain (costs off) + select 1 from tenk1 + where (hundred, thousand) in (select twothousand, twothousand from onek); + QUERY PLAN +------------------------------------------------------------- + Hash Join + Hash Cond: (tenk1.hundred = onek.twothousand) + -> Seq Scan on tenk1 + Filter: (hundred = thousand) + -> Hash + -> HashAggregate + Group Key: onek.twothousand, onek.twothousand + -> Seq Scan on onek + Optimizer: Postgres query optimizer +(9 rows) + +reset enable_memoize; +-- +-- Hash Aggregation Spill tests +-- +set enable_sort=false; +set work_mem='64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select unique1, count(*), sum(twothousand) from tenk1 +group by unique1 +having sum(fivethous) > 4975 +order by sum(twothousand); + unique1 | count | sum +---------+-------+------ + 4976 | 1 | 976 + 4977 | 1 | 977 + 4978 | 1 | 978 + 4979 | 1 | 979 + 4980 | 1 | 980 + 4981 | 1 | 981 + 4982 | 1 | 982 + 4983 | 1 | 983 + 4984 | 1 | 984 + 4985 | 1 | 985 + 4986 | 1 | 986 + 4987 | 1 | 987 + 4988 | 1 | 988 + 4989 | 1 | 989 + 4990 | 1 | 990 + 4991 | 1 | 991 + 4992 | 1 | 992 + 4993 | 1 | 993 + 4994 | 1 | 994 + 4995 | 1 | 995 + 4996 | 1 | 996 + 4997 | 1 | 997 + 4998 | 1 | 998 + 4999 | 1 | 999 + 9976 | 1 | 1976 + 9977 | 1 | 1977 + 9978 | 1 | 1978 + 9979 | 1 | 1979 + 9980 | 1 | 1980 + 9981 | 1 | 1981 + 9982 | 1 | 1982 + 9983 | 1 | 1983 + 9984 | 1 | 1984 + 9985 | 1 | 1985 + 9986 | 1 | 1986 + 9987 | 1 | 1987 + 9988 | 1 | 1988 + 9989 | 1 | 1989 + 9990 | 1 | 1990 + 9991 | 1 | 1991 + 9992 | 1 | 1992 + 9993 | 1 | 1993 + 9994 | 1 | 1994 + 9995 | 1 | 1995 + 9996 | 1 | 1996 + 9997 | 1 | 1997 + 9998 | 1 | 1998 + 9999 | 1 | 1999 +(48 rows) + +set work_mem to default; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set enable_sort to default; +-- +-- Compare results between plans using sorting and plans using hash +-- aggregation. Force spilling in both cases by setting work_mem low. +-- +set work_mem='64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +create table agg_data_2k as +select g from generate_series(0, 1999) g; +analyze agg_data_2k; +create table agg_data_20k as +select g from generate_series(0, 19999) g; +analyze agg_data_20k; +-- Produce results with sorting. +set enable_hashagg = false; +set jit_above_cost = 0; +explain (costs off) +select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3 + from agg_data_20k group by g%10000; + QUERY PLAN +-------------------------------------- + GroupAggregate + Group Key: ((g % 10000)) + -> Sort + Sort Key: ((g % 10000)) + -> Seq Scan on agg_data_20k + Optimizer: Postgres query optimizer +(6 rows) + +create table agg_group_1 as +select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3 + from agg_data_20k group by g%10000; +/* + * create table agg_group_2 as + * select * from + * (values (100), (300), (500)) as r(a), + * lateral ( + * select (g/2)::numeric as c1, + * array_agg(g::numeric) as c2, + * count(*) as c3 + * from generate_series(0, 1999) g + * where g < r.a + * group by g/2) as s; + */ +set jit_above_cost to default; +create table agg_group_3 as +select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3 + from agg_data_2k group by g/2; +create table agg_group_4 as +select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3 + from agg_data_2k group by g/2; +-- Produce results with hash aggregation +set enable_hashagg = true; +set enable_sort = false; +set jit_above_cost = 0; +explain (costs off) +select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3 + from agg_data_20k group by g%10000; + QUERY PLAN +------------------------------------- + HashAggregate + Group Key: (g % 10000) + -> Seq Scan on agg_data_20k + Optimizer: Postgres query optimizer +(4 rows) + +create table agg_hash_1 as +select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3 + from agg_data_20k group by g%10000; +/* + * create table agg_hash_2 as + * select * from + * (values (100), (300), (500)) as r(a), + * lateral ( + * select (g/2)::numeric as c1, + * array_agg(g::numeric) as c2, + * count(*) as c3 + * from generate_series(0, 1999) g + * where g < r.a + * group by g/2) as s; + */ +set jit_above_cost to default; +create table agg_hash_3 as +select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3 + from agg_data_2k group by g/2; +create table agg_hash_4 as +select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3 + from agg_data_2k group by g/2; +set enable_sort = true; +set work_mem to default; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- Compare group aggregation results to hash aggregation results +(select * from agg_hash_1 except select * from agg_group_1) + union all +(select * from agg_group_1 except select * from agg_hash_1); + c1 | c2 | c3 +----+----+---- +(0 rows) + +--(select * from agg_hash_2 except select * from agg_group_2) +-- union all +--(select * from agg_group_2 except select * from agg_hash_2); +(select * from agg_hash_3 except select * from agg_group_3) + union all +(select * from agg_group_3 except select * from agg_hash_3); + c1 | c2 | c3 +----+----+---- +(0 rows) + +-- CBDB: array_agg() makes the result unstable, so ignore this check +--(select * from agg_hash_4 except select * from agg_group_4) +-- union all +--(select * from agg_group_4 except select * from agg_hash_4); +drop table agg_group_1; +-- drop table agg_group_2; +drop table agg_group_3; +drop table agg_group_4; +drop table agg_hash_1; +-- drop table agg_hash_2; +drop table agg_hash_3; +drop table agg_hash_4; +-- fix github issue #12061 numsegments of general locus is not -1 on create_minmaxagg_path +/* + * On the arm platform, `Seq Scan` is executed frequently, resulting in unstable output. + */ +set enable_indexonlyscan = off; +explain analyze select count(*) from pg_class, (select count(*) >0 from (select count(*) from pg_class where relname like 't%')x)y; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------ + Aggregate (cost=10000000047.47..10000000047.48 rows=1 width=8) (actual time=0.515..0.516 rows=1 loops=1) + -> Nested Loop (cost=10000000000.02..10000000043.98 rows=1397 width=0) (actual time=0.014..0.460 rows=889 loops=1) + -> Aggregate (cost=0.02..0.03 rows=1 width=1) (actual time=0.004..0.005 rows=1 loops=1) + -> Result (cost=0.00..0.01 rows=1 width=8) (actual time=0.001..0.002 rows=1 loops=1) + -> Seq Scan on pg_class (cost=0.00..29.97 rows=1397 width=0) (actual time=0.009..0.371 rows=889 loops=1) + Planning Time: 0.760 ms + (slice0) Executor memory: 128K bytes. + Memory used: 128000kB + Optimizer: Postgres query optimizer + Execution Time: 0.603 ms +(10 rows) + diff --git a/src/test/singlenode_regress/expected/alter_generic.out b/src/test/singlenode_regress/expected/alter_generic.out new file mode 100644 index 00000000000..8953c5c7d71 --- /dev/null +++ b/src/test/singlenode_regress/expected/alter_generic.out @@ -0,0 +1,748 @@ +-- +-- Test for ALTER some_object {RENAME TO, OWNER TO, SET SCHEMA} +-- +-- Clean up in case a prior regression run failed +SET client_min_messages TO 'warning'; +DROP ROLE IF EXISTS regress_alter_generic_user1; +DROP ROLE IF EXISTS regress_alter_generic_user2; +DROP ROLE IF EXISTS regress_alter_generic_user3; +RESET client_min_messages; +CREATE USER regress_alter_generic_user3; +CREATE USER regress_alter_generic_user2; +CREATE USER regress_alter_generic_user1 IN ROLE regress_alter_generic_user3; +CREATE SCHEMA alt_nsp1; +CREATE SCHEMA alt_nsp2; +GRANT ALL ON SCHEMA alt_nsp1, alt_nsp2 TO public; +SET search_path = alt_nsp1, public; +-- +-- Function and Aggregate +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE FUNCTION alt_func1(int) RETURNS int LANGUAGE sql + AS 'SELECT $1 + 1'; +CREATE FUNCTION alt_func2(int) RETURNS int LANGUAGE sql + AS 'SELECT $1 - 1'; +CREATE AGGREGATE alt_agg1 ( + sfunc1 = int4pl, basetype = int4, stype1 = int4, initcond = 0 +); +CREATE AGGREGATE alt_agg2 ( + sfunc1 = int4mi, basetype = int4, stype1 = int4, initcond = 0 +); +ALTER AGGREGATE alt_func1(int) RENAME TO alt_func3; -- failed (not aggregate) +ERROR: function alt_func1(integer) is not an aggregate +ALTER AGGREGATE alt_func1(int) OWNER TO regress_alter_generic_user3; -- failed (not aggregate) +ERROR: function alt_func1(integer) is not an aggregate +ALTER AGGREGATE alt_func1(int) SET SCHEMA alt_nsp2; -- failed (not aggregate) +ERROR: function alt_func1(integer) is not an aggregate +ALTER FUNCTION alt_func1(int) RENAME TO alt_func2; -- failed (name conflict) +ERROR: function alt_func2(integer) already exists in schema "alt_nsp1" +ALTER FUNCTION alt_func1(int) RENAME TO alt_func3; -- OK +ALTER FUNCTION alt_func2(int) OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER FUNCTION alt_func2(int) OWNER TO regress_alter_generic_user3; -- OK +ALTER FUNCTION alt_func2(int) SET SCHEMA alt_nsp1; -- OK, already there +ALTER FUNCTION alt_func2(int) SET SCHEMA alt_nsp2; -- OK +ALTER AGGREGATE alt_agg1(int) RENAME TO alt_agg2; -- failed (name conflict) +ERROR: function alt_agg2(integer) already exists in schema "alt_nsp1" +ALTER AGGREGATE alt_agg1(int) RENAME TO alt_agg3; -- OK +ALTER AGGREGATE alt_agg2(int) OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER AGGREGATE alt_agg2(int) OWNER TO regress_alter_generic_user3; -- OK +ALTER AGGREGATE alt_agg2(int) SET SCHEMA alt_nsp2; -- OK +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE FUNCTION alt_func1(int) RETURNS int LANGUAGE sql + AS 'SELECT $1 + 2'; +CREATE FUNCTION alt_func2(int) RETURNS int LANGUAGE sql + AS 'SELECT $1 - 2'; +CREATE AGGREGATE alt_agg1 ( + sfunc1 = int4pl, basetype = int4, stype1 = int4, initcond = 100 +); +CREATE AGGREGATE alt_agg2 ( + sfunc1 = int4mi, basetype = int4, stype1 = int4, initcond = -100 +); +ALTER FUNCTION alt_func3(int) RENAME TO alt_func4; -- failed (not owner) +ERROR: must be owner of function alt_func3 +ALTER FUNCTION alt_func1(int) RENAME TO alt_func4; -- OK +ALTER FUNCTION alt_func3(int) OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of function alt_func3 +ALTER FUNCTION alt_func2(int) OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER FUNCTION alt_func3(int) SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of function alt_func3 +ALTER FUNCTION alt_func2(int) SET SCHEMA alt_nsp2; -- failed (name conflicts) +ERROR: function alt_func2(integer) already exists in schema "alt_nsp2" +ALTER AGGREGATE alt_agg3(int) RENAME TO alt_agg4; -- failed (not owner) +ERROR: must be owner of function alt_agg3 +ALTER AGGREGATE alt_agg1(int) RENAME TO alt_agg4; -- OK +ALTER AGGREGATE alt_agg3(int) OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of function alt_agg3 +ALTER AGGREGATE alt_agg2(int) OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER AGGREGATE alt_agg3(int) SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of function alt_agg3 +ALTER AGGREGATE alt_agg2(int) SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: function alt_agg2(integer) already exists in schema "alt_nsp2" +RESET SESSION AUTHORIZATION; +SELECT n.nspname, proname, prorettype::regtype, prokind, a.rolname + FROM pg_proc p, pg_namespace n, pg_authid a + WHERE p.pronamespace = n.oid AND p.proowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, proname; + nspname | proname | prorettype | prokind | rolname +----------+-----------+------------+---------+----------------------------- + alt_nsp1 | alt_agg2 | integer | a | regress_alter_generic_user2 + alt_nsp1 | alt_agg3 | integer | a | regress_alter_generic_user1 + alt_nsp1 | alt_agg4 | integer | a | regress_alter_generic_user2 + alt_nsp1 | alt_func2 | integer | f | regress_alter_generic_user2 + alt_nsp1 | alt_func3 | integer | f | regress_alter_generic_user1 + alt_nsp1 | alt_func4 | integer | f | regress_alter_generic_user2 + alt_nsp2 | alt_agg2 | integer | a | regress_alter_generic_user3 + alt_nsp2 | alt_func2 | integer | f | regress_alter_generic_user3 +(8 rows) + +-- +-- We would test collations here, but it's not possible because the error +-- messages tend to be nonportable. +-- +-- +-- Conversion +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE CONVERSION alt_conv1 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +CREATE CONVERSION alt_conv2 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +ALTER CONVERSION alt_conv1 RENAME TO alt_conv2; -- failed (name conflict) +ERROR: conversion "alt_conv2" already exists in schema "alt_nsp1" +ALTER CONVERSION alt_conv1 RENAME TO alt_conv3; -- OK +ALTER CONVERSION alt_conv2 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER CONVERSION alt_conv2 OWNER TO regress_alter_generic_user3; -- OK +ALTER CONVERSION alt_conv2 SET SCHEMA alt_nsp2; -- OK +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE CONVERSION alt_conv1 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +CREATE CONVERSION alt_conv2 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +ALTER CONVERSION alt_conv3 RENAME TO alt_conv4; -- failed (not owner) +ERROR: must be owner of conversion alt_conv3 +ALTER CONVERSION alt_conv1 RENAME TO alt_conv4; -- OK +ALTER CONVERSION alt_conv3 OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of conversion alt_conv3 +ALTER CONVERSION alt_conv2 OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER CONVERSION alt_conv3 SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of conversion alt_conv3 +ALTER CONVERSION alt_conv2 SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: conversion "alt_conv2" already exists in schema "alt_nsp2" +RESET SESSION AUTHORIZATION; +SELECT n.nspname, c.conname, a.rolname + FROM pg_conversion c, pg_namespace n, pg_authid a + WHERE c.connamespace = n.oid AND c.conowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, conname; + nspname | conname | rolname +----------+-----------+----------------------------- + alt_nsp1 | alt_conv2 | regress_alter_generic_user2 + alt_nsp1 | alt_conv3 | regress_alter_generic_user1 + alt_nsp1 | alt_conv4 | regress_alter_generic_user2 + alt_nsp2 | alt_conv2 | regress_alter_generic_user3 +(4 rows) + +-- +-- Foreign Data Wrapper and Foreign Server +-- +CREATE FOREIGN DATA WRAPPER alt_fdw1; +CREATE FOREIGN DATA WRAPPER alt_fdw2; +CREATE SERVER alt_fserv1 FOREIGN DATA WRAPPER alt_fdw1; +CREATE SERVER alt_fserv2 FOREIGN DATA WRAPPER alt_fdw2; +ALTER FOREIGN DATA WRAPPER alt_fdw1 RENAME TO alt_fdw2; -- failed (name conflict) +ERROR: foreign-data wrapper "alt_fdw2" already exists +ALTER FOREIGN DATA WRAPPER alt_fdw1 RENAME TO alt_fdw3; -- OK +ALTER SERVER alt_fserv1 RENAME TO alt_fserv2; -- failed (name conflict) +ERROR: server "alt_fserv2" already exists +ALTER SERVER alt_fserv1 RENAME TO alt_fserv3; -- OK +SELECT fdwname FROM pg_foreign_data_wrapper WHERE fdwname like 'alt_fdw%'; + fdwname +---------- + alt_fdw2 + alt_fdw3 +(2 rows) + +SELECT srvname FROM pg_foreign_server WHERE srvname like 'alt_fserv%'; + srvname +------------ + alt_fserv2 + alt_fserv3 +(2 rows) + +-- +-- Procedural Language +-- +CREATE LANGUAGE alt_lang1 HANDLER plpgsql_call_handler; +CREATE LANGUAGE alt_lang2 HANDLER plpgsql_call_handler; +ALTER LANGUAGE alt_lang1 OWNER TO regress_alter_generic_user1; -- OK +ALTER LANGUAGE alt_lang2 OWNER TO regress_alter_generic_user2; -- OK +SET SESSION AUTHORIZATION regress_alter_generic_user1; +ALTER LANGUAGE alt_lang1 RENAME TO alt_lang2; -- failed (name conflict) +ERROR: language "alt_lang2" already exists +ALTER LANGUAGE alt_lang2 RENAME TO alt_lang3; -- failed (not owner) +ERROR: must be owner of language alt_lang2 +ALTER LANGUAGE alt_lang1 RENAME TO alt_lang3; -- OK +ALTER LANGUAGE alt_lang2 OWNER TO regress_alter_generic_user3; -- failed (not owner) +ERROR: must be owner of language alt_lang2 +ALTER LANGUAGE alt_lang3 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER LANGUAGE alt_lang3 OWNER TO regress_alter_generic_user3; -- OK +RESET SESSION AUTHORIZATION; +SELECT lanname, a.rolname + FROM pg_language l, pg_authid a + WHERE l.lanowner = a.oid AND l.lanname like 'alt_lang%' + ORDER BY lanname; + lanname | rolname +-----------+----------------------------- + alt_lang2 | regress_alter_generic_user2 + alt_lang3 | regress_alter_generic_user3 +(2 rows) + +-- +-- Operator +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE OPERATOR @-@ ( leftarg = int4, rightarg = int4, procedure = int4mi ); +CREATE OPERATOR @+@ ( leftarg = int4, rightarg = int4, procedure = int4pl ); +ALTER OPERATOR @+@(int4, int4) OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER OPERATOR @+@(int4, int4) OWNER TO regress_alter_generic_user3; -- OK +ALTER OPERATOR @-@(int4, int4) SET SCHEMA alt_nsp2; -- OK +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE OPERATOR @-@ ( leftarg = int4, rightarg = int4, procedure = int4mi ); +ALTER OPERATOR @+@(int4, int4) OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of operator @+@ +ALTER OPERATOR @-@(int4, int4) OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER OPERATOR @+@(int4, int4) SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of operator @+@ +-- can't test this: the error message includes the raw oid of namespace +-- ALTER OPERATOR @-@(int4, int4) SET SCHEMA alt_nsp2; -- failed (name conflict) +RESET SESSION AUTHORIZATION; +SELECT n.nspname, oprname, a.rolname, + oprleft::regtype, oprright::regtype, oprcode::regproc + FROM pg_operator o, pg_namespace n, pg_authid a + WHERE o.oprnamespace = n.oid AND o.oprowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, oprname; + nspname | oprname | rolname | oprleft | oprright | oprcode +----------+---------+-----------------------------+---------+----------+--------- + alt_nsp1 | @+@ | regress_alter_generic_user3 | integer | integer | int4pl + alt_nsp1 | @-@ | regress_alter_generic_user2 | integer | integer | int4mi + alt_nsp2 | @-@ | regress_alter_generic_user1 | integer | integer | int4mi +(3 rows) + +-- +-- OpFamily and OpClass +-- +CREATE OPERATOR FAMILY alt_opf1 USING hash; +CREATE OPERATOR FAMILY alt_opf2 USING hash; +ALTER OPERATOR FAMILY alt_opf1 USING hash OWNER TO regress_alter_generic_user1; +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user1; +CREATE OPERATOR CLASS alt_opc1 FOR TYPE uuid USING hash AS STORAGE uuid; +CREATE OPERATOR CLASS alt_opc2 FOR TYPE uuid USING hash AS STORAGE uuid; +ALTER OPERATOR CLASS alt_opc1 USING hash OWNER TO regress_alter_generic_user1; +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user1; +SET SESSION AUTHORIZATION regress_alter_generic_user1; +ALTER OPERATOR FAMILY alt_opf1 USING hash RENAME TO alt_opf2; -- failed (name conflict) +ERROR: operator family "alt_opf2" for access method "hash" already exists in schema "alt_nsp1" +ALTER OPERATOR FAMILY alt_opf1 USING hash RENAME TO alt_opf3; -- OK +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user3; -- OK +ALTER OPERATOR FAMILY alt_opf2 USING hash SET SCHEMA alt_nsp2; -- OK +ALTER OPERATOR CLASS alt_opc1 USING hash RENAME TO alt_opc2; -- failed (name conflict) +ERROR: operator class "alt_opc2" for access method "hash" already exists in schema "alt_nsp1" +ALTER OPERATOR CLASS alt_opc1 USING hash RENAME TO alt_opc3; -- OK +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user3; -- OK +ALTER OPERATOR CLASS alt_opc2 USING hash SET SCHEMA alt_nsp2; -- OK +RESET SESSION AUTHORIZATION; +CREATE OPERATOR FAMILY alt_opf1 USING hash; +CREATE OPERATOR FAMILY alt_opf2 USING hash; +ALTER OPERATOR FAMILY alt_opf1 USING hash OWNER TO regress_alter_generic_user2; +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user2; +CREATE OPERATOR CLASS alt_opc1 FOR TYPE macaddr USING hash AS STORAGE macaddr; +CREATE OPERATOR CLASS alt_opc2 FOR TYPE macaddr USING hash AS STORAGE macaddr; +ALTER OPERATOR CLASS alt_opc1 USING hash OWNER TO regress_alter_generic_user2; +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user2; +SET SESSION AUTHORIZATION regress_alter_generic_user2; +ALTER OPERATOR FAMILY alt_opf3 USING hash RENAME TO alt_opf4; -- failed (not owner) +ERROR: must be owner of operator family alt_opf3 +ALTER OPERATOR FAMILY alt_opf1 USING hash RENAME TO alt_opf4; -- OK +ALTER OPERATOR FAMILY alt_opf3 USING hash OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of operator family alt_opf3 +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER OPERATOR FAMILY alt_opf3 USING hash SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of operator family alt_opf3 +ALTER OPERATOR FAMILY alt_opf2 USING hash SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: operator family "alt_opf2" for access method "hash" already exists in schema "alt_nsp2" +ALTER OPERATOR CLASS alt_opc3 USING hash RENAME TO alt_opc4; -- failed (not owner) +ERROR: must be owner of operator class alt_opc3 +ALTER OPERATOR CLASS alt_opc1 USING hash RENAME TO alt_opc4; -- OK +ALTER OPERATOR CLASS alt_opc3 USING hash OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of operator class alt_opc3 +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER OPERATOR CLASS alt_opc3 USING hash SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of operator class alt_opc3 +ALTER OPERATOR CLASS alt_opc2 USING hash SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: operator class "alt_opc2" for access method "hash" already exists in schema "alt_nsp2" +RESET SESSION AUTHORIZATION; +SELECT nspname, opfname, amname, rolname + FROM pg_opfamily o, pg_am m, pg_namespace n, pg_authid a + WHERE o.opfmethod = m.oid AND o.opfnamespace = n.oid AND o.opfowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + AND NOT opfname LIKE 'alt_opc%' + ORDER BY nspname, opfname; + nspname | opfname | amname | rolname +----------+----------+--------+----------------------------- + alt_nsp1 | alt_opf2 | hash | regress_alter_generic_user2 + alt_nsp1 | alt_opf3 | hash | regress_alter_generic_user1 + alt_nsp1 | alt_opf4 | hash | regress_alter_generic_user2 + alt_nsp2 | alt_opf2 | hash | regress_alter_generic_user3 +(4 rows) + +SELECT nspname, opcname, amname, rolname + FROM pg_opclass o, pg_am m, pg_namespace n, pg_authid a + WHERE o.opcmethod = m.oid AND o.opcnamespace = n.oid AND o.opcowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, opcname; + nspname | opcname | amname | rolname +----------+----------+--------+----------------------------- + alt_nsp1 | alt_opc2 | hash | regress_alter_generic_user2 + alt_nsp1 | alt_opc3 | hash | regress_alter_generic_user1 + alt_nsp1 | alt_opc4 | hash | regress_alter_generic_user2 + alt_nsp2 | alt_opc2 | hash | regress_alter_generic_user3 +(4 rows) + +-- ALTER OPERATOR FAMILY ... ADD/DROP +-- Should work. Textbook case of CREATE / ALTER ADD / ALTER DROP / DROP +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf4 USING btree; +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD + -- int4 vs int2 + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); +ALTER OPERATOR FAMILY alt_opf4 USING btree DROP + -- int4 vs int2 + OPERATOR 1 (int4, int2) , + OPERATOR 2 (int4, int2) , + OPERATOR 3 (int4, int2) , + OPERATOR 4 (int4, int2) , + OPERATOR 5 (int4, int2) , + FUNCTION 1 (int4, int2) ; +DROP OPERATOR FAMILY alt_opf4 USING btree; +ROLLBACK; +-- Should fail. Invalid values for ALTER OPERATOR FAMILY .. ADD / DROP +CREATE OPERATOR FAMILY alt_opf4 USING btree; +ALTER OPERATOR FAMILY alt_opf4 USING invalid_index_method ADD OPERATOR 1 < (int4, int2); -- invalid indexing_method +ERROR: access method "invalid_index_method" does not exist +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 6 < (int4, int2); -- operator number should be between 1 and 5 +ERROR: invalid operator number 6, must be between 1 and 5 +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 0 < (int4, int2); -- operator number should be between 1 and 5 +ERROR: invalid operator number 0, must be between 1 and 5 +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 1 < ; -- operator without argument types +ERROR: operator argument types must be specified in ALTER OPERATOR FAMILY +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD FUNCTION 0 btint42cmp(int4, int2); -- invalid options parsing function +ERROR: invalid function number 0, must be between 1 and 5 +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD FUNCTION 6 btint42cmp(int4, int2); -- function number should be between 1 and 5 +ERROR: invalid function number 6, must be between 1 and 5 +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD STORAGE invalid_storage; -- Ensure STORAGE is not a part of ALTER OPERATOR FAMILY +ERROR: STORAGE cannot be specified in ALTER OPERATOR FAMILY +DROP OPERATOR FAMILY alt_opf4 USING btree; +-- Should fail. Need to be SUPERUSER to do ALTER OPERATOR FAMILY .. ADD / DROP +BEGIN TRANSACTION; +CREATE ROLE regress_alter_generic_user5 NOSUPERUSER; +CREATE OPERATOR FAMILY alt_opf5 USING btree; +SET ROLE regress_alter_generic_user5; +ALTER OPERATOR FAMILY alt_opf5 USING btree ADD OPERATOR 1 < (int4, int2), FUNCTION 1 btint42cmp(int4, int2); +ERROR: must be superuser to alter an operator family +RESET ROLE; +ERROR: current transaction is aborted, commands ignored until end of transaction block +DROP OPERATOR FAMILY alt_opf5 USING btree; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- Should fail. Need rights to namespace for ALTER OPERATOR FAMILY .. ADD / DROP +BEGIN TRANSACTION; +CREATE ROLE regress_alter_generic_user6; +CREATE SCHEMA alt_nsp6; +REVOKE ALL ON SCHEMA alt_nsp6 FROM regress_alter_generic_user6; +NOTICE: no privileges could be revoked +CREATE OPERATOR FAMILY alt_nsp6.alt_opf6 USING btree; +SET ROLE regress_alter_generic_user6; +ALTER OPERATOR FAMILY alt_nsp6.alt_opf6 USING btree ADD OPERATOR 1 < (int4, int2); +ERROR: permission denied for schema alt_nsp6 +ROLLBACK; +-- Should fail. Only two arguments required for ALTER OPERATOR FAMILY ... DROP OPERATOR +CREATE OPERATOR FAMILY alt_opf7 USING btree; +ALTER OPERATOR FAMILY alt_opf7 USING btree ADD OPERATOR 1 < (int4, int2); +ALTER OPERATOR FAMILY alt_opf7 USING btree DROP OPERATOR 1 (int4, int2, int8); +ERROR: one or two argument types must be specified +DROP OPERATOR FAMILY alt_opf7 USING btree; +-- Should work. During ALTER OPERATOR FAMILY ... DROP OPERATOR +-- when left type is the same as right type, a DROP with only one argument type should work +CREATE OPERATOR FAMILY alt_opf8 USING btree; +ALTER OPERATOR FAMILY alt_opf8 USING btree ADD OPERATOR 1 < (int4, int4); +DROP OPERATOR FAMILY alt_opf8 USING btree; +-- Should work. Textbook case of ALTER OPERATOR FAMILY ... ADD OPERATOR with FOR ORDER BY +CREATE OPERATOR FAMILY alt_opf9 USING gist; +ALTER OPERATOR FAMILY alt_opf9 USING gist ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops; +DROP OPERATOR FAMILY alt_opf9 USING gist; +-- Should fail. Ensure correct ordering methods in ALTER OPERATOR FAMILY ... ADD OPERATOR .. FOR ORDER BY +CREATE OPERATOR FAMILY alt_opf10 USING btree; +ALTER OPERATOR FAMILY alt_opf10 USING btree ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops; +ERROR: access method "btree" does not support ordering operators +DROP OPERATOR FAMILY alt_opf10 USING btree; +-- Should work. Textbook case of ALTER OPERATOR FAMILY ... ADD OPERATOR with FOR ORDER BY +CREATE OPERATOR FAMILY alt_opf11 USING gist; +ALTER OPERATOR FAMILY alt_opf11 USING gist ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops; +ALTER OPERATOR FAMILY alt_opf11 USING gist DROP OPERATOR 1 (int4, int4); +DROP OPERATOR FAMILY alt_opf11 USING gist; +-- Should fail. btree comparison functions should return INTEGER in ALTER OPERATOR FAMILY ... ADD FUNCTION +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf12 USING btree; +CREATE FUNCTION fn_opf12 (int4, int2) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL; +ALTER OPERATOR FAMILY alt_opf12 USING btree ADD FUNCTION 1 fn_opf12(int4, int2); +ERROR: btree comparison functions must return integer +DROP OPERATOR FAMILY alt_opf12 USING btree; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- Should fail. hash comparison functions should return INTEGER in ALTER OPERATOR FAMILY ... ADD FUNCTION +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf13 USING hash; +CREATE FUNCTION fn_opf13 (int4) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL; +ALTER OPERATOR FAMILY alt_opf13 USING hash ADD FUNCTION 1 fn_opf13(int4); +ERROR: hash function 1 must return integer +DROP OPERATOR FAMILY alt_opf13 USING hash; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- Should fail. btree comparison functions should have two arguments in ALTER OPERATOR FAMILY ... ADD FUNCTION +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf14 USING btree; +CREATE FUNCTION fn_opf14 (int4) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL; +ALTER OPERATOR FAMILY alt_opf14 USING btree ADD FUNCTION 1 fn_opf14(int4); +ERROR: btree comparison functions must have two arguments +DROP OPERATOR FAMILY alt_opf14 USING btree; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- Should fail. hash comparison functions should have one argument in ALTER OPERATOR FAMILY ... ADD FUNCTION +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf15 USING hash; +CREATE FUNCTION fn_opf15 (int4, int2) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL; +ALTER OPERATOR FAMILY alt_opf15 USING hash ADD FUNCTION 1 fn_opf15(int4, int2); +ERROR: hash function 1 must have one argument +DROP OPERATOR FAMILY alt_opf15 USING hash; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- Should fail. In gist throw an error when giving different data types for function argument +-- without defining left / right type in ALTER OPERATOR FAMILY ... ADD FUNCTION +CREATE OPERATOR FAMILY alt_opf16 USING gist; +ALTER OPERATOR FAMILY alt_opf16 USING gist ADD FUNCTION 1 btint42cmp(int4, int2); +ERROR: associated data types must be specified for index support function +DROP OPERATOR FAMILY alt_opf16 USING gist; +-- Should fail. duplicate operator number / function number in ALTER OPERATOR FAMILY ... ADD FUNCTION +CREATE OPERATOR FAMILY alt_opf17 USING btree; +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4), OPERATOR 1 < (int4, int4); -- operator # appears twice in same statement +ERROR: operator number 1 for (integer,integer) appears more than once +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4); -- operator 1 requested first-time +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4); -- operator 1 requested again in separate statement +ERROR: operator 1(integer,integer) already exists in operator family "alt_opf17" +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 appears twice in same statement +ERROR: function number 1 for (integer,smallint) appears more than once +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 appears first time +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 requested again in separate statement +ERROR: operator 1(integer,smallint) already exists in operator family "alt_opf17" +DROP OPERATOR FAMILY alt_opf17 USING btree; +-- Should fail. Ensure that DROP requests for missing OPERATOR / FUNCTIONS +-- return appropriate message in ALTER OPERATOR FAMILY ... DROP OPERATOR / FUNCTION +CREATE OPERATOR FAMILY alt_opf18 USING btree; +ALTER OPERATOR FAMILY alt_opf18 USING btree DROP OPERATOR 1 (int4, int4); +ERROR: operator 1(integer,integer) does not exist in operator family "alt_opf18" +ALTER OPERATOR FAMILY alt_opf18 USING btree ADD + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); +-- Should fail. Not allowed to have cross-type equalimage function. +ALTER OPERATOR FAMILY alt_opf18 USING btree + ADD FUNCTION 4 (int4, int2) btequalimage(oid); +ERROR: btree equal image functions must not be cross-type +ALTER OPERATOR FAMILY alt_opf18 USING btree DROP FUNCTION 2 (int4, int4); +ERROR: function 2(integer,integer) does not exist in operator family "alt_opf18" +DROP OPERATOR FAMILY alt_opf18 USING btree; +-- Should fail. Invalid opclass options function (#5) specifications. +CREATE OPERATOR FAMILY alt_opf19 USING btree; +ALTER OPERATOR FAMILY alt_opf19 USING btree ADD FUNCTION 5 test_opclass_options_func(internal, text[], bool); +ERROR: function test_opclass_options_func(internal, text[], boolean) does not exist +ALTER OPERATOR FAMILY alt_opf19 USING btree ADD FUNCTION 5 (int4) btint42cmp(int4, int2); +ERROR: invalid operator class options parsing function +HINT: Valid signature of operator class options parsing function is (internal) RETURNS void. +ALTER OPERATOR FAMILY alt_opf19 USING btree ADD FUNCTION 5 (int4, int2) btint42cmp(int4, int2); +ERROR: left and right associated data types for operator class options parsing functions must match +ALTER OPERATOR FAMILY alt_opf19 USING btree ADD FUNCTION 5 (int4) test_opclass_options_func(internal); -- Ok +ALTER OPERATOR FAMILY alt_opf19 USING btree DROP FUNCTION 5 (int4, int4); +DROP OPERATOR FAMILY alt_opf19 USING btree; +-- +-- Statistics +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE TABLE alt_regress_1 (a INTEGER, b INTEGER); +CREATE STATISTICS alt_stat1 ON a, b FROM alt_regress_1; +CREATE STATISTICS alt_stat2 ON a, b FROM alt_regress_1; +ALTER STATISTICS alt_stat1 RENAME TO alt_stat2; -- failed (name conflict) +ERROR: statistics object "alt_stat2" already exists in schema "alt_nsp1" +ALTER STATISTICS alt_stat1 RENAME TO alt_stat3; -- OK +ALTER STATISTICS alt_stat2 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER STATISTICS alt_stat2 OWNER TO regress_alter_generic_user3; -- OK +ALTER STATISTICS alt_stat2 SET SCHEMA alt_nsp2; -- OK +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE TABLE alt_regress_2 (a INTEGER, b INTEGER); +CREATE STATISTICS alt_stat1 ON a, b FROM alt_regress_2; +CREATE STATISTICS alt_stat2 ON a, b FROM alt_regress_2; +ALTER STATISTICS alt_stat3 RENAME TO alt_stat4; -- failed (not owner) +ERROR: must be owner of statistics object alt_stat3 +ALTER STATISTICS alt_stat1 RENAME TO alt_stat4; -- OK +ALTER STATISTICS alt_stat3 OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of statistics object alt_stat3 +ALTER STATISTICS alt_stat2 OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER STATISTICS alt_stat3 SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of statistics object alt_stat3 +ALTER STATISTICS alt_stat2 SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: statistics object "alt_stat2" already exists in schema "alt_nsp2" +RESET SESSION AUTHORIZATION; +SELECT nspname, stxname, rolname + FROM pg_statistic_ext s, pg_namespace n, pg_authid a + WHERE s.stxnamespace = n.oid AND s.stxowner = a.oid + AND n.nspname in ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, stxname; + nspname | stxname | rolname +----------+-----------+----------------------------- + alt_nsp1 | alt_stat2 | regress_alter_generic_user2 + alt_nsp1 | alt_stat3 | regress_alter_generic_user1 + alt_nsp1 | alt_stat4 | regress_alter_generic_user2 + alt_nsp2 | alt_stat2 | regress_alter_generic_user3 +(4 rows) + +-- +-- Text Search Dictionary +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE TEXT SEARCH DICTIONARY alt_ts_dict1 (template=simple); +CREATE TEXT SEARCH DICTIONARY alt_ts_dict2 (template=simple); +ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict2; -- failed (name conflict) +ERROR: text search dictionary "alt_ts_dict2" already exists in schema "alt_nsp1" +ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict3; -- OK +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user3; -- OK +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 SET SCHEMA alt_nsp2; -- OK +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE TEXT SEARCH DICTIONARY alt_ts_dict1 (template=simple); +CREATE TEXT SEARCH DICTIONARY alt_ts_dict2 (template=simple); +ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 RENAME TO alt_ts_dict4; -- failed (not owner) +ERROR: must be owner of text search dictionary alt_ts_dict3 +ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict4; -- OK +ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of text search dictionary alt_ts_dict3 +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of text search dictionary alt_ts_dict3 +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: text search dictionary "alt_ts_dict2" already exists in schema "alt_nsp2" +RESET SESSION AUTHORIZATION; +SELECT nspname, dictname, rolname + FROM pg_ts_dict t, pg_namespace n, pg_authid a + WHERE t.dictnamespace = n.oid AND t.dictowner = a.oid + AND n.nspname in ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, dictname; + nspname | dictname | rolname +----------+--------------+----------------------------- + alt_nsp1 | alt_ts_dict2 | regress_alter_generic_user2 + alt_nsp1 | alt_ts_dict3 | regress_alter_generic_user1 + alt_nsp1 | alt_ts_dict4 | regress_alter_generic_user2 + alt_nsp2 | alt_ts_dict2 | regress_alter_generic_user3 +(4 rows) + +-- +-- Text Search Configuration +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE TEXT SEARCH CONFIGURATION alt_ts_conf1 (copy=english); +CREATE TEXT SEARCH CONFIGURATION alt_ts_conf2 (copy=english); +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf2; -- failed (name conflict) +ERROR: text search configuration "alt_ts_conf2" already exists in schema "alt_nsp1" +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf3; -- OK +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user2" +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user3; -- OK +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 SET SCHEMA alt_nsp2; -- OK +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE TEXT SEARCH CONFIGURATION alt_ts_conf1 (copy=english); +CREATE TEXT SEARCH CONFIGURATION alt_ts_conf2 (copy=english); +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 RENAME TO alt_ts_conf4; -- failed (not owner) +ERROR: must be owner of text search configuration alt_ts_conf3 +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf4; -- OK +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 OWNER TO regress_alter_generic_user2; -- failed (not owner) +ERROR: must be owner of text search configuration alt_ts_conf3 +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ERROR: must be member of role "regress_alter_generic_user3" +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 SET SCHEMA alt_nsp2; -- failed (not owner) +ERROR: must be owner of text search configuration alt_ts_conf3 +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: text search configuration "alt_ts_conf2" already exists in schema "alt_nsp2" +RESET SESSION AUTHORIZATION; +SELECT nspname, cfgname, rolname + FROM pg_ts_config t, pg_namespace n, pg_authid a + WHERE t.cfgnamespace = n.oid AND t.cfgowner = a.oid + AND n.nspname in ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, cfgname; + nspname | cfgname | rolname +----------+--------------+----------------------------- + alt_nsp1 | alt_ts_conf2 | regress_alter_generic_user2 + alt_nsp1 | alt_ts_conf3 | regress_alter_generic_user1 + alt_nsp1 | alt_ts_conf4 | regress_alter_generic_user2 + alt_nsp2 | alt_ts_conf2 | regress_alter_generic_user3 +(4 rows) + +-- +-- Text Search Template +-- +CREATE TEXT SEARCH TEMPLATE alt_ts_temp1 (lexize=dsimple_lexize); +CREATE TEXT SEARCH TEMPLATE alt_ts_temp2 (lexize=dsimple_lexize); +ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp2; -- failed (name conflict) +ERROR: text search template "alt_ts_temp2" already exists in schema "alt_nsp1" +ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp3; -- OK +ALTER TEXT SEARCH TEMPLATE alt_ts_temp2 SET SCHEMA alt_nsp2; -- OK +CREATE TEXT SEARCH TEMPLATE alt_ts_temp2 (lexize=dsimple_lexize); +ALTER TEXT SEARCH TEMPLATE alt_ts_temp2 SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: text search template "alt_ts_temp2" already exists in schema "alt_nsp2" +-- invalid: non-lowercase quoted identifiers +CREATE TEXT SEARCH TEMPLATE tstemp_case ("Init" = init_function); +ERROR: text search template parameter "Init" not recognized +SELECT nspname, tmplname + FROM pg_ts_template t, pg_namespace n + WHERE t.tmplnamespace = n.oid AND nspname like 'alt_nsp%' + ORDER BY nspname, tmplname; + nspname | tmplname +----------+-------------- + alt_nsp1 | alt_ts_temp2 + alt_nsp1 | alt_ts_temp3 + alt_nsp2 | alt_ts_temp2 +(3 rows) + +-- +-- Text Search Parser +-- +CREATE TEXT SEARCH PARSER alt_ts_prs1 + (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +CREATE TEXT SEARCH PARSER alt_ts_prs2 + (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs2; -- failed (name conflict) +ERROR: text search parser "alt_ts_prs2" already exists in schema "alt_nsp1" +ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs3; -- OK +ALTER TEXT SEARCH PARSER alt_ts_prs2 SET SCHEMA alt_nsp2; -- OK +CREATE TEXT SEARCH PARSER alt_ts_prs2 + (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +ALTER TEXT SEARCH PARSER alt_ts_prs2 SET SCHEMA alt_nsp2; -- failed (name conflict) +ERROR: text search parser "alt_ts_prs2" already exists in schema "alt_nsp2" +-- invalid: non-lowercase quoted identifiers +CREATE TEXT SEARCH PARSER tspars_case ("Start" = start_function); +ERROR: text search parser parameter "Start" not recognized +SELECT nspname, prsname + FROM pg_ts_parser t, pg_namespace n + WHERE t.prsnamespace = n.oid AND nspname like 'alt_nsp%' + ORDER BY nspname, prsname; + nspname | prsname +----------+------------- + alt_nsp1 | alt_ts_prs2 + alt_nsp1 | alt_ts_prs3 + alt_nsp2 | alt_ts_prs2 +(3 rows) + +--- +--- Cleanup resources +--- +DROP FOREIGN DATA WRAPPER alt_fdw2 CASCADE; +NOTICE: drop cascades to server alt_fserv2 +DROP FOREIGN DATA WRAPPER alt_fdw3 CASCADE; +NOTICE: drop cascades to server alt_fserv3 +DROP LANGUAGE alt_lang2 CASCADE; +DROP LANGUAGE alt_lang3 CASCADE; +DROP SCHEMA alt_nsp1 CASCADE; +NOTICE: drop cascades to 28 other objects +DETAIL: drop cascades to function alt_func3(integer) +drop cascades to function alt_agg3(integer) +drop cascades to function alt_func4(integer) +drop cascades to function alt_func2(integer) +drop cascades to function alt_agg4(integer) +drop cascades to function alt_agg2(integer) +drop cascades to conversion alt_conv3 +drop cascades to conversion alt_conv4 +drop cascades to conversion alt_conv2 +drop cascades to operator @+@(integer,integer) +drop cascades to operator @-@(integer,integer) +drop cascades to operator family alt_opf3 for access method hash +drop cascades to operator family alt_opc1 for access method hash +drop cascades to operator family alt_opc2 for access method hash +drop cascades to operator family alt_opf4 for access method hash +drop cascades to operator family alt_opf2 for access method hash +drop cascades to table alt_regress_1 +drop cascades to table alt_regress_2 +drop cascades to text search dictionary alt_ts_dict3 +drop cascades to text search dictionary alt_ts_dict4 +drop cascades to text search dictionary alt_ts_dict2 +drop cascades to text search configuration alt_ts_conf3 +drop cascades to text search configuration alt_ts_conf4 +drop cascades to text search configuration alt_ts_conf2 +drop cascades to text search template alt_ts_temp3 +drop cascades to text search template alt_ts_temp2 +drop cascades to text search parser alt_ts_prs3 +drop cascades to text search parser alt_ts_prs2 +DROP SCHEMA alt_nsp2 CASCADE; +NOTICE: drop cascades to 9 other objects +DETAIL: drop cascades to function alt_nsp2.alt_func2(integer) +drop cascades to function alt_nsp2.alt_agg2(integer) +drop cascades to conversion alt_nsp2.alt_conv2 +drop cascades to operator alt_nsp2.@-@(integer,integer) +drop cascades to operator family alt_nsp2.alt_opf2 for access method hash +drop cascades to text search dictionary alt_nsp2.alt_ts_dict2 +drop cascades to text search configuration alt_nsp2.alt_ts_conf2 +drop cascades to text search template alt_nsp2.alt_ts_temp2 +drop cascades to text search parser alt_nsp2.alt_ts_prs2 +DROP USER regress_alter_generic_user1; +DROP USER regress_alter_generic_user2; +DROP USER regress_alter_generic_user3; diff --git a/src/test/singlenode_regress/expected/alter_operator.out b/src/test/singlenode_regress/expected/alter_operator.out new file mode 100644 index 00000000000..71bd4842821 --- /dev/null +++ b/src/test/singlenode_regress/expected/alter_operator.out @@ -0,0 +1,139 @@ +CREATE FUNCTION alter_op_test_fn(boolean, boolean) +RETURNS boolean AS $$ SELECT NULL::BOOLEAN; $$ LANGUAGE sql IMMUTABLE; +CREATE FUNCTION customcontsel(internal, oid, internal, integer) +RETURNS float8 AS 'contsel' LANGUAGE internal STABLE STRICT; +CREATE OPERATOR === ( + LEFTARG = boolean, + RIGHTARG = boolean, + PROCEDURE = alter_op_test_fn, + COMMUTATOR = ===, + NEGATOR = !==, + RESTRICT = customcontsel, + JOIN = contjoinsel, + HASHES, MERGES +); +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + ref | deptype +-------------------------------------------------------+--------- + function alter_op_test_fn(boolean,boolean) | n + function customcontsel(internal,oid,internal,integer) | n + schema public | n +(3 rows) + +-- +-- Reset and set params +-- +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE); +ALTER OPERATOR === (boolean, boolean) SET (JOIN = NONE); +SELECT oprrest, oprjoin FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'boolean'::regtype; + oprrest | oprjoin +---------+--------- + - | - +(1 row) + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + ref | deptype +--------------------------------------------+--------- + function alter_op_test_fn(boolean,boolean) | n + schema public | n +(2 rows) + +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = contsel); +ALTER OPERATOR === (boolean, boolean) SET (JOIN = contjoinsel); +SELECT oprrest, oprjoin FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'boolean'::regtype; + oprrest | oprjoin +---------+------------- + contsel | contjoinsel +(1 row) + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + ref | deptype +--------------------------------------------+--------- + function alter_op_test_fn(boolean,boolean) | n + schema public | n +(2 rows) + +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE, JOIN = NONE); +SELECT oprrest, oprjoin FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'boolean'::regtype; + oprrest | oprjoin +---------+--------- + - | - +(1 row) + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + ref | deptype +--------------------------------------------+--------- + function alter_op_test_fn(boolean,boolean) | n + schema public | n +(2 rows) + +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = customcontsel, JOIN = contjoinsel); +SELECT oprrest, oprjoin FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'boolean'::regtype; + oprrest | oprjoin +---------------+------------- + customcontsel | contjoinsel +(1 row) + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + ref | deptype +-------------------------------------------------------+--------- + function alter_op_test_fn(boolean,boolean) | n + function customcontsel(internal,oid,internal,integer) | n + schema public | n +(3 rows) + +-- +-- Test invalid options. +-- +ALTER OPERATOR === (boolean, boolean) SET (COMMUTATOR = ====); +ERROR: operator attribute "commutator" cannot be changed +ALTER OPERATOR === (boolean, boolean) SET (NEGATOR = ====); +ERROR: operator attribute "negator" cannot be changed +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = non_existent_func); +ERROR: function non_existent_func(internal, oid, internal, integer) does not exist +ALTER OPERATOR === (boolean, boolean) SET (JOIN = non_existent_func); +ERROR: function non_existent_func(internal, oid, internal, smallint, internal) does not exist +ALTER OPERATOR === (boolean, boolean) SET (COMMUTATOR = !==); +ERROR: operator attribute "commutator" cannot be changed +ALTER OPERATOR === (boolean, boolean) SET (NEGATOR = !==); +ERROR: operator attribute "negator" cannot be changed +-- invalid: non-lowercase quoted identifiers +ALTER OPERATOR & (bit, bit) SET ("Restrict" = _int_contsel, "Join" = _int_contjoinsel); +ERROR: operator attribute "Restrict" not recognized +-- +-- Test permission check. Must be owner to ALTER OPERATOR. +-- +CREATE USER regress_alter_op_user; +SET SESSION AUTHORIZATION regress_alter_op_user; +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE); +ERROR: must be owner of operator === +-- Clean up +RESET SESSION AUTHORIZATION; +DROP USER regress_alter_op_user; +DROP OPERATOR === (boolean, boolean); +DROP FUNCTION customcontsel(internal, oid, internal, integer); +DROP FUNCTION alter_op_test_fn(boolean, boolean); diff --git a/src/test/singlenode_regress/expected/alter_table.out b/src/test/singlenode_regress/expected/alter_table.out new file mode 100644 index 00000000000..27f5e271a9d --- /dev/null +++ b/src/test/singlenode_regress/expected/alter_table.out @@ -0,0 +1,4671 @@ +set optimizer_print_missing_stats = off; +-- +-- ALTER_TABLE +-- +-- Clean up in case a prior regression run failed +SET client_min_messages TO 'warning'; +DROP ROLE IF EXISTS regress_alter_table_user1; +RESET client_min_messages; +CREATE USER regress_alter_table_user1; +-- +-- add attribute +-- +CREATE TABLE attmp (initial int4); +COMMENT ON TABLE attmp_wrong IS 'table comment'; +ERROR: relation "attmp_wrong" does not exist +COMMENT ON TABLE attmp IS 'table comment'; +COMMENT ON TABLE attmp IS NULL; +ALTER TABLE attmp ADD COLUMN xmin integer; -- fails +ERROR: column name "xmin" conflicts with a system column name +ALTER TABLE attmp ADD COLUMN a int4 default 3; +ALTER TABLE attmp ADD COLUMN b name; +ALTER TABLE attmp ADD COLUMN c text; +ALTER TABLE attmp ADD COLUMN d float8; +ALTER TABLE attmp ADD COLUMN e float4; +ALTER TABLE attmp ADD COLUMN f int2; +ALTER TABLE attmp ADD COLUMN g polygon; +ALTER TABLE attmp ADD COLUMN i char; +ALTER TABLE attmp ADD COLUMN k int4; +ALTER TABLE attmp ADD COLUMN l tid; +ALTER TABLE attmp ADD COLUMN m xid; +ALTER TABLE attmp ADD COLUMN n oidvector; +--ALTER TABLE attmp ADD COLUMN o lock; +ALTER TABLE attmp ADD COLUMN p boolean; +ALTER TABLE attmp ADD COLUMN q point; +ALTER TABLE attmp ADD COLUMN r lseg; +ALTER TABLE attmp ADD COLUMN s path; +ALTER TABLE attmp ADD COLUMN t box; +ALTER TABLE attmp ADD COLUMN v timestamp; +ALTER TABLE attmp ADD COLUMN w interval; +ALTER TABLE attmp ADD COLUMN x float8[]; +ALTER TABLE attmp ADD COLUMN y float4[]; +ALTER TABLE attmp ADD COLUMN z int2[]; +INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, + v, w, x, y, z) + VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)', + 'c', + 314159, '(1,1)', '512', + '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', + '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', + 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); +SELECT * FROM attmp; + initial | a | b | c | d | e | f | g | i | k | l | m | n | p | q | r | s | t | v | w | x | y | z +---------+---+------+------+-----+-----+---+-----------------------+---+--------+-------+-----+-----------------+---+-----------+-----------------------+-----------------------------+---------------------+--------------------------+------------------+-----------+-----------+----------- + | 4 | name | text | 4.1 | 4.1 | 2 | ((4.1,4.1),(3.1,3.1)) | c | 314159 | (1,1) | 512 | 1 2 3 4 5 6 7 8 | t | (1.1,1.1) | [(4.1,4.1),(3.1,3.1)] | ((0,2),(4.1,4.1),(3.1,3.1)) | (4.1,4.1),(3.1,3.1) | Thu Jan 01 00:00:00 1970 | @ 1 hour 10 secs | {1,2,3,4} | {1,2,3,4} | {1,2,3,4} +(1 row) + +DROP TABLE attmp; +-- the wolf bug - schema mods caused inconsistent row descriptors +CREATE TABLE attmp ( + initial int4 +); +ALTER TABLE attmp ADD COLUMN a int4; +ALTER TABLE attmp ADD COLUMN b name; +ALTER TABLE attmp ADD COLUMN c text; +ALTER TABLE attmp ADD COLUMN d float8; +ALTER TABLE attmp ADD COLUMN e float4; +ALTER TABLE attmp ADD COLUMN f int2; +ALTER TABLE attmp ADD COLUMN g polygon; +ALTER TABLE attmp ADD COLUMN i char; +ALTER TABLE attmp ADD COLUMN k int4; +ALTER TABLE attmp ADD COLUMN l tid; +ALTER TABLE attmp ADD COLUMN m xid; +ALTER TABLE attmp ADD COLUMN n oidvector; +--ALTER TABLE attmp ADD COLUMN o lock; +ALTER TABLE attmp ADD COLUMN p boolean; +ALTER TABLE attmp ADD COLUMN q point; +ALTER TABLE attmp ADD COLUMN r lseg; +ALTER TABLE attmp ADD COLUMN s path; +ALTER TABLE attmp ADD COLUMN t box; +ALTER TABLE attmp ADD COLUMN v timestamp; +ALTER TABLE attmp ADD COLUMN w interval; +ALTER TABLE attmp ADD COLUMN x float8[]; +ALTER TABLE attmp ADD COLUMN y float4[]; +ALTER TABLE attmp ADD COLUMN z int2[]; +INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, + v, w, x, y, z) + VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)', + 'c', + 314159, '(1,1)', '512', + '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', + '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', + 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); +SELECT * FROM attmp; + initial | a | b | c | d | e | f | g | i | k | l | m | n | p | q | r | s | t | v | w | x | y | z +---------+---+------+------+-----+-----+---+-----------------------+---+--------+-------+-----+-----------------+---+-----------+-----------------------+-----------------------------+---------------------+--------------------------+------------------+-----------+-----------+----------- + | 4 | name | text | 4.1 | 4.1 | 2 | ((4.1,4.1),(3.1,3.1)) | c | 314159 | (1,1) | 512 | 1 2 3 4 5 6 7 8 | t | (1.1,1.1) | [(4.1,4.1),(3.1,3.1)] | ((0,2),(4.1,4.1),(3.1,3.1)) | (4.1,4.1),(3.1,3.1) | Thu Jan 01 00:00:00 1970 | @ 1 hour 10 secs | {1,2,3,4} | {1,2,3,4} | {1,2,3,4} +(1 row) + +CREATE INDEX attmp_idx ON attmp (a, (d + e), b); +ALTER INDEX attmp_idx ALTER COLUMN 0 SET STATISTICS 1000; +ERROR: column number must be in range from 1 to 32767 +LINE 1: ALTER INDEX attmp_idx ALTER COLUMN 0 SET STATISTICS 1000; + ^ +ALTER INDEX attmp_idx ALTER COLUMN 1 SET STATISTICS 1000; +ERROR: cannot alter statistics on non-expression column "a" of index "attmp_idx" +HINT: Alter statistics on table column instead. +ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS 1000; +\d+ attmp_idx + Index "public.attmp_idx" + Column | Type | Key? | Definition | Storage | Stats target +--------+------------------+------+------------+---------+-------------- + a | integer | yes | a | plain | + expr | double precision | yes | (d + e) | plain | 1000 + b | cstring | yes | b | plain | +btree, for table "public.attmp" + +ALTER INDEX attmp_idx ALTER COLUMN 3 SET STATISTICS 1000; +ERROR: cannot alter statistics on non-expression column "b" of index "attmp_idx" +HINT: Alter statistics on table column instead. +ALTER INDEX attmp_idx ALTER COLUMN 4 SET STATISTICS 1000; +ERROR: column number 4 of relation "attmp_idx" does not exist +ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1; +DROP TABLE attmp; +-- fails with incorrect object type +CREATE VIEW at_v1 AS SELECT 1 as a; +ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; +ERROR: "at_v1" is not a table, materialized view, index, partitioned index, or foreign table +DROP VIEW at_v1; +-- +-- rename - check on both non-temp and temp tables +-- +CREATE TABLE attmp (regtable int); +CREATE TEMP TABLE attmp (attmptable int); +ALTER TABLE attmp RENAME TO attmp_new; +SELECT * FROM attmp; + regtable +---------- +(0 rows) + +SELECT * FROM attmp_new; + attmptable +------------ +(0 rows) + +ALTER TABLE attmp RENAME TO attmp_new2; +SELECT * FROM attmp; -- should fail +ERROR: relation "attmp" does not exist +LINE 1: SELECT * FROM attmp; + ^ +SELECT * FROM attmp_new; + attmptable +------------ +(0 rows) + +SELECT * FROM attmp_new2; + regtable +---------- +(0 rows) + +DROP TABLE attmp_new; +DROP TABLE attmp_new2; +-- check rename of partitioned tables and indexes also +CREATE TABLE part_attmp (a int primary key) partition by range (a); +CREATE TABLE part_attmp1 PARTITION OF part_attmp FOR VALUES FROM (0) TO (100); +ALTER INDEX part_attmp_pkey RENAME TO part_attmp_index; +ALTER INDEX part_attmp1_pkey RENAME TO part_attmp1_index; +ALTER TABLE part_attmp RENAME TO part_at2tmp; +-- ALTER TABLE part_attmp1 RENAME TO part_at2tmp1; -- GPDB cascades parent rename to child partition +SET ROLE regress_alter_table_user1; +ALTER INDEX part_attmp_index RENAME TO fail; +ERROR: must be owner of index part_attmp_index +ALTER INDEX part_attmp1_index RENAME TO fail; +ERROR: must be owner of index part_attmp1_index +ALTER TABLE part_at2tmp RENAME TO fail; +ERROR: must be owner of table part_at2tmp +-- ALTER TABLE part_at2tmp1 RENAME TO fail; -- GPDB cascades parent rename to child partiti +RESET ROLE; +DROP TABLE part_at2tmp; +-- +-- check renaming to a table's array type's autogenerated name +-- (the array type's name should get out of the way) +-- +CREATE TABLE attmp_array (id int); +CREATE TABLE attmp_array2 (id int); +SELECT typname FROM pg_type WHERE oid = 'attmp_array[]'::regtype; + typname +-------------- + _attmp_array +(1 row) + +SELECT typname FROM pg_type WHERE oid = 'attmp_array2[]'::regtype; + typname +--------------- + _attmp_array2 +(1 row) + +ALTER TABLE attmp_array2 RENAME TO _attmp_array; +SELECT typname FROM pg_type WHERE oid = 'attmp_array[]'::regtype; + typname +--------------- + __attmp_array +(1 row) + +SELECT typname FROM pg_type WHERE oid = '_attmp_array[]'::regtype; + typname +----------------- + __attmp_array_1 +(1 row) + +DROP TABLE _attmp_array; +DROP TABLE attmp_array; +-- renaming to table's own array type's name is an interesting corner case +CREATE TABLE attmp_array (id int); +SELECT typname FROM pg_type WHERE oid = 'attmp_array[]'::regtype; + typname +-------------- + _attmp_array +(1 row) + +ALTER TABLE attmp_array RENAME TO _attmp_array; +SELECT typname FROM pg_type WHERE oid = '_attmp_array[]'::regtype; + typname +--------------- + __attmp_array +(1 row) + +DROP TABLE _attmp_array; +-- ALTER TABLE ... RENAME on non-table relations +-- renaming indexes (FIXME: this should probably test the index's functionality) +ALTER INDEX IF EXISTS __onek_unique1 RENAME TO attmp_onek_unique1; +NOTICE: relation "__onek_unique1" does not exist, skipping +ALTER INDEX IF EXISTS __attmp_onek_unique1 RENAME TO onek_unique1; +NOTICE: relation "__attmp_onek_unique1" does not exist, skipping +ALTER INDEX onek_unique1 RENAME TO attmp_onek_unique1; +ALTER INDEX attmp_onek_unique1 RENAME TO onek_unique1; +SET ROLE regress_alter_table_user1; +ALTER INDEX onek_unique1 RENAME TO fail; -- permission denied +ERROR: must be owner of index onek_unique1 +RESET ROLE; +-- rename statements with mismatching statement and object types +CREATE TABLE alter_idx_rename_test (a INT); +CREATE INDEX alter_idx_rename_test_idx ON alter_idx_rename_test (a); +CREATE TABLE alter_idx_rename_test_parted (a INT) PARTITION BY LIST (a); +CREATE INDEX alter_idx_rename_test_parted_idx ON alter_idx_rename_test_parted (a); +BEGIN; +ALTER INDEX alter_idx_rename_test RENAME TO alter_idx_rename_test_2; +ALTER INDEX alter_idx_rename_test_parted RENAME TO alter_idx_rename_test_parted_2; +SELECT relation::regclass, mode FROM pg_locks +WHERE pid = pg_backend_pid() AND locktype = 'relation' + AND relation::regclass::text LIKE 'alter\_idx%' +ORDER BY relation::regclass::text COLLATE "C"; + relation | mode +--------------------------------+--------------------- + alter_idx_rename_test_2 | AccessExclusiveLock + alter_idx_rename_test_parted_2 | AccessExclusiveLock +(2 rows) + +COMMIT; +BEGIN; +ALTER INDEX alter_idx_rename_test_idx RENAME TO alter_idx_rename_test_idx_2; +ALTER INDEX alter_idx_rename_test_parted_idx RENAME TO alter_idx_rename_test_parted_idx_2; +SELECT relation::regclass, mode FROM pg_locks +WHERE pid = pg_backend_pid() AND locktype = 'relation' + AND relation::regclass::text LIKE 'alter\_idx%' +ORDER BY relation::regclass::text COLLATE "C"; + relation | mode +------------------------------------+-------------------------- + alter_idx_rename_test_idx_2 | ShareUpdateExclusiveLock + alter_idx_rename_test_parted_idx_2 | ShareUpdateExclusiveLock +(2 rows) + +COMMIT; +BEGIN; +ALTER TABLE alter_idx_rename_test_idx_2 RENAME TO alter_idx_rename_test_idx_3; +ALTER TABLE alter_idx_rename_test_parted_idx_2 RENAME TO alter_idx_rename_test_parted_idx_3; +SELECT relation::regclass, mode FROM pg_locks +WHERE pid = pg_backend_pid() AND locktype = 'relation' + AND relation::regclass::text LIKE 'alter\_idx%' +ORDER BY relation::regclass::text COLLATE "C"; + relation | mode +------------------------------------+--------------------- + alter_idx_rename_test_idx_3 | AccessExclusiveLock + alter_idx_rename_test_parted_idx_3 | AccessExclusiveLock +(2 rows) + +COMMIT; +DROP TABLE alter_idx_rename_test_2; +-- renaming views +CREATE VIEW attmp_view (unique1) AS SELECT unique1 FROM tenk1; +ALTER TABLE attmp_view RENAME TO attmp_view_new; +SET ROLE regress_alter_table_user1; +ALTER VIEW attmp_view_new RENAME TO fail; -- permission denied +ERROR: must be owner of view attmp_view_new +RESET ROLE; +-- hack to ensure we get an indexscan here +set enable_seqscan to off; +set enable_bitmapscan to off; +-- 5 values, sorted +SELECT unique1 FROM tenk1 WHERE unique1 < 5 ORDER BY 1; + unique1 +--------- + 0 + 1 + 2 + 3 + 4 +(5 rows) + +reset enable_seqscan; +reset enable_bitmapscan; +DROP VIEW attmp_view_new; +-- toast-like relation name +alter table stud_emp rename to pg_toast_stud_emp; +alter table pg_toast_stud_emp rename to stud_emp; +-- renaming index should rename constraint as well +ALTER TABLE onek ADD CONSTRAINT onek_unique1_constraint UNIQUE (unique1); +ALTER INDEX onek_unique1_constraint RENAME TO onek_unique1_constraint_foo; +ALTER TABLE onek DROP CONSTRAINT onek_unique1_constraint_foo; +-- renaming constraint +ALTER TABLE onek ADD CONSTRAINT onek_check_constraint CHECK (unique1 >= 0); +ALTER TABLE onek RENAME CONSTRAINT onek_check_constraint TO onek_check_constraint_foo; +ALTER TABLE onek DROP CONSTRAINT onek_check_constraint_foo; +-- renaming constraint should rename index as well +ALTER TABLE onek ADD CONSTRAINT onek_unique1_constraint UNIQUE (unique1); +DROP INDEX onek_unique1_constraint; -- to see whether it's there +ERROR: cannot drop index onek_unique1_constraint because constraint onek_unique1_constraint on table onek requires it +HINT: You can drop constraint onek_unique1_constraint on table onek instead. +ALTER TABLE onek RENAME CONSTRAINT onek_unique1_constraint TO onek_unique1_constraint_foo; +DROP INDEX onek_unique1_constraint_foo; -- to see whether it's there +ERROR: cannot drop index onek_unique1_constraint_foo because constraint onek_unique1_constraint_foo on table onek requires it +HINT: You can drop constraint onek_unique1_constraint_foo on table onek instead. +ALTER TABLE onek DROP CONSTRAINT onek_unique1_constraint_foo; +-- renaming constraints vs. inheritance +CREATE TABLE constraint_rename_test (a int CONSTRAINT con1 CHECK (a > 0), b int, c int); +\d constraint_rename_test + Table "public.constraint_rename_test" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Check constraints: + "con1" CHECK (a > 0) + +CREATE TABLE constraint_rename_test2 (a int CONSTRAINT con1 CHECK (a > 0), d int) INHERITS (constraint_rename_test); +NOTICE: merging column "a" with inherited definition +NOTICE: merging constraint "con1" with inherited definition +\d constraint_rename_test2 + Table "public.constraint_rename_test2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | + d | integer | | | +Check constraints: + "con1" CHECK (a > 0) +Inherits: constraint_rename_test + +ALTER TABLE constraint_rename_test2 RENAME CONSTRAINT con1 TO con1foo; -- fail +ERROR: cannot rename inherited constraint "con1" +ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con1 TO con1foo; -- fail +ERROR: inherited constraint "con1" must be renamed in child tables too +ALTER TABLE constraint_rename_test RENAME CONSTRAINT con1 TO con1foo; -- ok +\d constraint_rename_test + Table "public.constraint_rename_test" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Check constraints: + "con1foo" CHECK (a > 0) +Number of child tables: 1 (Use \d+ to list them.) + +\d constraint_rename_test2 + Table "public.constraint_rename_test2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | + d | integer | | | +Check constraints: + "con1foo" CHECK (a > 0) +Inherits: constraint_rename_test + +ALTER TABLE constraint_rename_test ADD CONSTRAINT con2 CHECK (b > 0) NO INHERIT; +ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con2 TO con2foo; -- ok +ALTER TABLE constraint_rename_test RENAME CONSTRAINT con2foo TO con2bar; -- ok +\d constraint_rename_test + Table "public.constraint_rename_test" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Check constraints: + "con1foo" CHECK (a > 0) + "con2bar" CHECK (b > 0) NO INHERIT +Number of child tables: 1 (Use \d+ to list them.) + +\d constraint_rename_test2 + Table "public.constraint_rename_test2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | + d | integer | | | +Check constraints: + "con1foo" CHECK (a > 0) +Inherits: constraint_rename_test + +ALTER TABLE constraint_rename_test ADD CONSTRAINT con3 PRIMARY KEY (a); +ALTER TABLE constraint_rename_test RENAME CONSTRAINT con3 TO con3foo; -- ok +\d constraint_rename_test + Table "public.constraint_rename_test" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | + b | integer | | | + c | integer | | | +Indexes: + "con3foo" PRIMARY KEY, btree (a) +Check constraints: + "con1foo" CHECK (a > 0) + "con2bar" CHECK (b > 0) NO INHERIT +Number of child tables: 1 (Use \d+ to list them.) + +\d constraint_rename_test2 + Table "public.constraint_rename_test2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | + b | integer | | | + c | integer | | | + d | integer | | | +Check constraints: + "con1foo" CHECK (a > 0) +Inherits: constraint_rename_test + +DROP TABLE constraint_rename_test2; +DROP TABLE constraint_rename_test; +ALTER TABLE IF EXISTS constraint_not_exist RENAME CONSTRAINT con3 TO con3foo; -- ok +NOTICE: relation "constraint_not_exist" does not exist, skipping +ALTER TABLE IF EXISTS constraint_rename_test ADD CONSTRAINT con4 UNIQUE (a); +NOTICE: relation "constraint_rename_test" does not exist, skipping +-- renaming constraints with cache reset of target relation +CREATE TABLE constraint_rename_cache (a int, + CONSTRAINT chk_a CHECK (a > 0), + PRIMARY KEY (a)); +ALTER TABLE constraint_rename_cache + RENAME CONSTRAINT chk_a TO chk_a_new; +ALTER TABLE constraint_rename_cache + RENAME CONSTRAINT constraint_rename_cache_pkey TO constraint_rename_pkey_new; +CREATE TABLE like_constraint_rename_cache + (LIKE constraint_rename_cache INCLUDING ALL); +\d like_constraint_rename_cache + Table "public.like_constraint_rename_cache" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | +Indexes: + "like_constraint_rename_cache_pkey" PRIMARY KEY, btree (a) +Check constraints: + "chk_a_new" CHECK (a > 0) + +DROP TABLE constraint_rename_cache; +DROP TABLE like_constraint_rename_cache; +-- FOREIGN KEY CONSTRAINT adding TEST +CREATE TABLE attmp2 (a int primary key); +CREATE TABLE attmp3 (a int, b int); +CREATE TABLE attmp4 (a int, b int, unique(a,b)); +CREATE TABLE attmp5 (a int, b int); +-- Insert rows into attmp2 (pktable) +INSERT INTO attmp2 values (1); +INSERT INTO attmp2 values (2); +INSERT INTO attmp2 values (3); +INSERT INTO attmp2 values (4); +-- Insert rows into attmp3 +INSERT INTO attmp3 values (1,10); +INSERT INTO attmp3 values (1,20); +INSERT INTO attmp3 values (5,50); +-- Try (and fail) to add constraint due to invalid source columns +ALTER TABLE attmp3 add constraint attmpconstr foreign key(c) references attmp2 match full; +ERROR: column "c" referenced in foreign key constraint does not exist +-- Try (and fail) to add constraint due to invalid destination columns explicitly given +ALTER TABLE attmp3 add constraint attmpconstr foreign key(a) references attmp2(b) match full; +ERROR: column "b" referenced in foreign key constraint does not exist +-- Try (and fail) to add constraint due to invalid data +-- (passes on GPDB, because GPDB doesn't enforce foreign keys) +ALTER TABLE attmp3 add constraint attmpconstr foreign key (a) references attmp2 match full; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +-- Delete failing row +DELETE FROM attmp3 where a=5; +-- Try (and succeed) +ALTER TABLE attmp3 add constraint attmpconstr foreign key (a) references attmp2 match full; +ERROR: constraint "attmpconstr" for relation "attmp3" already exists +ALTER TABLE attmp3 drop constraint attmpconstr; +INSERT INTO attmp3 values (5,50); +-- Try NOT VALID and then VALIDATE CONSTRAINT, but fails. Delete failure then re-validate +ALTER TABLE attmp3 add constraint attmpconstr foreign key (a) references attmp2 match full NOT VALID; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +-- FK constraints are not supported in GPDB +--start_ignore +ALTER TABLE attmp3 validate constraint attmpconstr; +--end_ignore +-- Delete failing row +DELETE FROM attmp3 where a=5; +-- Try (and succeed) and repeat to show it works on already valid constraint +--start_ignore +ALTER TABLE attmp3 validate constraint attmpconstr; +ALTER TABLE attmp3 validate constraint attmpconstr; +--end_ignore +-- Try a non-verified CHECK constraint +ALTER TABLE attmp3 ADD CONSTRAINT b_greater_than_ten CHECK (b > 10); -- fail +ERROR: check constraint "b_greater_than_ten" of relation "attmp3" is violated by some row +ALTER TABLE attmp3 ADD CONSTRAINT b_greater_than_ten CHECK (b > 10) NOT VALID; -- succeeds +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_greater_than_ten; -- fails +ERROR: check constraint "b_greater_than_ten" of relation "attmp3" is violated by some row +DELETE FROM attmp3 WHERE NOT b > 10; +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_greater_than_ten; -- succeeds +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_greater_than_ten; -- succeeds +-- Test inherited NOT VALID CHECK constraints +select * from attmp3; + a | b +---+---- + 1 | 20 +(1 row) + +CREATE TABLE attmp6 () INHERITS (attmp3); +CREATE TABLE attmp7 () INHERITS (attmp3); +INSERT INTO attmp6 VALUES (6, 30), (7, 16); +ALTER TABLE attmp3 ADD CONSTRAINT b_le_20 CHECK (b <= 20) NOT VALID; +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_le_20; -- fails +ERROR: check constraint "b_le_20" of relation "attmp6" is violated by some row +DELETE FROM attmp6 WHERE b > 20; +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_le_20; -- succeeds +-- An already validated constraint must not be revalidated +CREATE FUNCTION boo(int) RETURNS int IMMUTABLE STRICT LANGUAGE plpgsql AS $$ BEGIN RAISE NOTICE 'boo: %', $1; RETURN $1; END; $$; +INSERT INTO attmp7 VALUES (8, 18); +ALTER TABLE attmp7 ADD CONSTRAINT identity CHECK (b = boo(b)); +NOTICE: boo: 18 +ALTER TABLE attmp3 ADD CONSTRAINT IDENTITY check (b = boo(b)) NOT VALID; +NOTICE: merging constraint "identity" with inherited definition +ALTER TABLE attmp3 VALIDATE CONSTRAINT identity; +NOTICE: boo: 20 +NOTICE: boo: 16 +-- A NO INHERIT constraint should not be looked for in children during VALIDATE CONSTRAINT +create table parent_noinh_convalid (a int); +create table child_noinh_convalid () inherits (parent_noinh_convalid); +insert into parent_noinh_convalid values (1); +insert into child_noinh_convalid values (1); +alter table parent_noinh_convalid add constraint check_a_is_2 check (a = 2) no inherit not valid; +-- fail, because of the row in parent +alter table parent_noinh_convalid validate constraint check_a_is_2; +ERROR: check constraint "check_a_is_2" of relation "parent_noinh_convalid" is violated by some row +delete from only parent_noinh_convalid; +-- ok (parent itself contains no violating rows) +alter table parent_noinh_convalid validate constraint check_a_is_2; +select convalidated from pg_constraint where conrelid = 'parent_noinh_convalid'::regclass and conname = 'check_a_is_2'; + convalidated +-------------- + t +(1 row) + +-- cleanup +drop table parent_noinh_convalid, child_noinh_convalid; +-- Try (and fail) to create constraint from attmp5(a) to attmp4(a) - unique constraint on +-- attmp4 is a,b +ALTER TABLE attmp5 add constraint attmpconstr foreign key(a) references attmp4(a) match full; +ERROR: there is no unique constraint matching given keys for referenced table "attmp4" +DROP TABLE attmp7; +DROP TABLE attmp6; +DROP TABLE attmp5; +DROP TABLE attmp4; +DROP TABLE attmp3; +DROP TABLE attmp2; +-- NOT VALID with plan invalidation -- ensure we don't use a constraint for +-- exclusion until validated +set constraint_exclusion TO 'partition'; +create table nv_parent (d date, check (false) no inherit not valid); +-- not valid constraint added at creation time should automatically become valid +\d nv_parent + Table "public.nv_parent" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + d | date | | | +Check constraints: + "nv_parent_check" CHECK (false) NO INHERIT + +create table nv_child_2010 () inherits (nv_parent); +create table nv_child_2011 () inherits (nv_parent); +alter table nv_child_2010 add check (d between '2010-01-01'::date and '2010-12-31'::date) not valid; +alter table nv_child_2011 add check (d between '2011-01-01'::date and '2011-12-31'::date) not valid; +explain (costs off) select * from nv_parent where d between '2011-08-01' and '2011-08-31'; + QUERY PLAN +--------------------------------------------------------------------------- + Append + -> Seq Scan on nv_parent nv_parent_1 + Filter: ((d >= '08-01-2011'::date) AND (d <= '08-31-2011'::date)) + -> Seq Scan on nv_child_2010 nv_parent_2 + Filter: ((d >= '08-01-2011'::date) AND (d <= '08-31-2011'::date)) + -> Seq Scan on nv_child_2011 nv_parent_3 + Filter: ((d >= '08-01-2011'::date) AND (d <= '08-31-2011'::date)) + Optimizer: Postgres query optimizer +(8 rows) + +create table nv_child_2009 (check (d between '2009-01-01'::date and '2009-12-31'::date)) inherits (nv_parent); +explain (costs off) select * from nv_parent where d between '2011-08-01'::date and '2011-08-31'::date; + QUERY PLAN +--------------------------------------------------------------------------- + Append + -> Seq Scan on nv_parent nv_parent_1 + Filter: ((d >= '08-01-2011'::date) AND (d <= '08-31-2011'::date)) + -> Seq Scan on nv_child_2010 nv_parent_2 + Filter: ((d >= '08-01-2011'::date) AND (d <= '08-31-2011'::date)) + -> Seq Scan on nv_child_2011 nv_parent_3 + Filter: ((d >= '08-01-2011'::date) AND (d <= '08-31-2011'::date)) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from nv_parent where d between '2009-08-01'::date and '2009-08-31'::date; + QUERY PLAN +--------------------------------------------------------------------------- + Append + -> Seq Scan on nv_parent nv_parent_1 + Filter: ((d >= '08-01-2009'::date) AND (d <= '08-31-2009'::date)) + -> Seq Scan on nv_child_2010 nv_parent_2 + Filter: ((d >= '08-01-2009'::date) AND (d <= '08-31-2009'::date)) + -> Seq Scan on nv_child_2011 nv_parent_3 + Filter: ((d >= '08-01-2009'::date) AND (d <= '08-31-2009'::date)) + -> Seq Scan on nv_child_2009 nv_parent_4 + Filter: ((d >= '08-01-2009'::date) AND (d <= '08-31-2009'::date)) + Optimizer: Postgres query optimizer +(10 rows) + +-- after validation, the constraint should be used +alter table nv_child_2011 VALIDATE CONSTRAINT nv_child_2011_d_check; +explain (costs off) select * from nv_parent where d between '2009-08-01'::date and '2009-08-31'::date; + QUERY PLAN +--------------------------------------------------------------------------- + Append + -> Seq Scan on nv_parent nv_parent_1 + Filter: ((d >= '08-01-2009'::date) AND (d <= '08-31-2009'::date)) + -> Seq Scan on nv_child_2010 nv_parent_2 + Filter: ((d >= '08-01-2009'::date) AND (d <= '08-31-2009'::date)) + -> Seq Scan on nv_child_2009 nv_parent_3 + Filter: ((d >= '08-01-2009'::date) AND (d <= '08-31-2009'::date)) + Optimizer: Postgres query optimizer +(8 rows) + +-- add an inherited NOT VALID constraint +alter table nv_parent add check (d between '2001-01-01'::date and '2099-12-31'::date) not valid; +\d nv_child_2009 + Table "public.nv_child_2009" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + d | date | | | +Check constraints: + "nv_child_2009_d_check" CHECK (d >= '01-01-2009'::date AND d <= '12-31-2009'::date) + "nv_parent_d_check" CHECK (d >= '01-01-2001'::date AND d <= '12-31-2099'::date) NOT VALID +Inherits: nv_parent + +-- we leave nv_parent and children around to help test pg_dump logic +-- Foreign key adding test with mixed types +-- Note: these tables are TEMP to avoid name conflicts when this test +-- is run in parallel with foreign_key.sql. +CREATE TEMP TABLE PKTABLE (ptest1 int PRIMARY KEY); +INSERT INTO PKTABLE VALUES(42); +CREATE TEMP TABLE FKTABLE (ftest1 inet); +-- This next should fail, because int=inet does not exist +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; +ERROR: foreign key constraint "fktable_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: inet and integer. +-- This should also fail for the same reason, but here we +-- give the column name +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable(ptest1); +ERROR: foreign key constraint "fktable_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: inet and integer. +DROP TABLE FKTABLE; +-- This should succeed, even though they are different types, +-- because int=int8 exists and is a member of the integer opfamily +CREATE TEMP TABLE FKTABLE (ftest1 int8); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +-- Check it actually works +INSERT INTO FKTABLE VALUES(42); -- should succeed +INSERT INTO FKTABLE VALUES(43); -- should fail +DROP TABLE FKTABLE; +-- This should fail, because we'd have to cast numeric to int which is +-- not an implicit coercion (or use numeric=numeric, but that's not part +-- of the integer opfamily) +CREATE TEMP TABLE FKTABLE (ftest1 numeric); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; +ERROR: foreign key constraint "fktable_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: numeric and integer. +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- On the other hand, this should work because int implicitly promotes to +-- numeric, and we allow promotion on the FK side +CREATE TEMP TABLE PKTABLE (ptest1 numeric PRIMARY KEY); +INSERT INTO PKTABLE VALUES(42); +CREATE TEMP TABLE FKTABLE (ftest1 int); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +-- Check it actually works +INSERT INTO FKTABLE VALUES(42); -- should succeed +INSERT INTO FKTABLE VALUES(43); -- should fail +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +CREATE TEMP TABLE PKTABLE (ptest1 int, ptest2 inet, + PRIMARY KEY(ptest1, ptest2)); +-- This should fail, because we just chose really odd types +CREATE TEMP TABLE FKTABLE (ftest1 cidr, ftest2 timestamp); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1, ftest2) references pktable; +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: cidr and integer. +DROP TABLE FKTABLE; +-- Again, so should this... +CREATE TEMP TABLE FKTABLE (ftest1 cidr, ftest2 timestamp); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1, ftest2) + references pktable(ptest1, ptest2); +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: cidr and integer. +DROP TABLE FKTABLE; +-- This fails because we mixed up the column ordering +CREATE TEMP TABLE FKTABLE (ftest1 int, ftest2 inet); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1, ftest2) + references pktable(ptest2, ptest1); +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest2" are of incompatible types: integer and inet. +-- As does this... +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest2, ftest1) + references pktable(ptest1, ptest2); +ERROR: foreign key constraint "fktable_ftest2_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest2" and "ptest1" are of incompatible types: inet and integer. +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- Test that ALTER CONSTRAINT updates trigger deferrability properly +CREATE TEMP TABLE PKTABLE (ptest1 int primary key); +CREATE TEMP TABLE FKTABLE (ftest1 int); +ALTER TABLE FKTABLE ADD CONSTRAINT fknd FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION NOT DEFERRABLE; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +ALTER TABLE FKTABLE ADD CONSTRAINT fkdd FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY DEFERRED; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +ALTER TABLE FKTABLE ADD CONSTRAINT fkdi FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY IMMEDIATE; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +ALTER TABLE FKTABLE ADD CONSTRAINT fknd2 FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY DEFERRED; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +ALTER TABLE FKTABLE ALTER CONSTRAINT fknd2 NOT DEFERRABLE; +ALTER TABLE FKTABLE ADD CONSTRAINT fkdd2 FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION NOT DEFERRABLE; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +ALTER TABLE FKTABLE ALTER CONSTRAINT fkdd2 DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE FKTABLE ADD CONSTRAINT fkdi2 FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION NOT DEFERRABLE; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +ALTER TABLE FKTABLE ALTER CONSTRAINT fkdi2 DEFERRABLE INITIALLY IMMEDIATE; +SELECT conname, tgfoid::regproc, tgtype, tgdeferrable, tginitdeferred +FROM pg_trigger JOIN pg_constraint con ON con.oid = tgconstraint +WHERE tgrelid = 'pktable'::regclass +ORDER BY 1,2,3; + conname | tgfoid | tgtype | tgdeferrable | tginitdeferred +---------+------------------------+--------+--------------+---------------- + fkdd | "RI_FKey_cascade_del" | 9 | f | f + fkdd | "RI_FKey_noaction_upd" | 17 | t | t + fkdd2 | "RI_FKey_cascade_del" | 9 | f | f + fkdd2 | "RI_FKey_noaction_upd" | 17 | t | t + fkdi | "RI_FKey_cascade_del" | 9 | f | f + fkdi | "RI_FKey_noaction_upd" | 17 | t | f + fkdi2 | "RI_FKey_cascade_del" | 9 | f | f + fkdi2 | "RI_FKey_noaction_upd" | 17 | t | f + fknd | "RI_FKey_cascade_del" | 9 | f | f + fknd | "RI_FKey_noaction_upd" | 17 | f | f + fknd2 | "RI_FKey_cascade_del" | 9 | f | f + fknd2 | "RI_FKey_noaction_upd" | 17 | f | f +(12 rows) + +SELECT conname, tgfoid::regproc, tgtype, tgdeferrable, tginitdeferred +FROM pg_trigger JOIN pg_constraint con ON con.oid = tgconstraint +WHERE tgrelid = 'fktable'::regclass +ORDER BY 1,2,3; + conname | tgfoid | tgtype | tgdeferrable | tginitdeferred +---------+---------------------+--------+--------------+---------------- + fkdd | "RI_FKey_check_ins" | 5 | t | t + fkdd | "RI_FKey_check_upd" | 17 | t | t + fkdd2 | "RI_FKey_check_ins" | 5 | t | t + fkdd2 | "RI_FKey_check_upd" | 17 | t | t + fkdi | "RI_FKey_check_ins" | 5 | t | f + fkdi | "RI_FKey_check_upd" | 17 | t | f + fkdi2 | "RI_FKey_check_ins" | 5 | t | f + fkdi2 | "RI_FKey_check_upd" | 17 | t | f + fknd | "RI_FKey_check_ins" | 5 | f | f + fknd | "RI_FKey_check_upd" | 17 | f | f + fknd2 | "RI_FKey_check_ins" | 5 | f | f + fknd2 | "RI_FKey_check_upd" | 17 | f | f +(12 rows) + +-- temp tables should go away by themselves, need not drop them. +-- test check constraint adding +create table atacc1 ( test int ); +-- add a check constraint +alter table atacc1 add constraint atacc_test1 check (test>3); +-- start_ignore +-- Known_opt_diff: MPP-21330 +-- end_ignore +-- should fail +insert into atacc1 (test) values (2); +ERROR: new row for relation "atacc1" violates check constraint "atacc_test1" +DETAIL: Failing row contains (2). +-- should succeed +insert into atacc1 (test) values (4); +drop table atacc1; +-- let's do one where the check fails when added +create table atacc1 ( test int ); +-- insert a soon to be failing row +insert into atacc1 (test) values (2); +-- add a check constraint (fails) +alter table atacc1 add constraint atacc_test1 check (test>3); +ERROR: check constraint "atacc_test1" of relation "atacc1" is violated by some row +insert into atacc1 (test) values (4); +drop table atacc1; +-- let's do one where the check fails because the column doesn't exist +create table atacc1 ( test int ); +-- add a check constraint (fails) +alter table atacc1 add constraint atacc_test1 check (test1>3); +ERROR: column "test1" does not exist +HINT: Perhaps you meant to reference the column "atacc1.test". +drop table atacc1; +-- something a little more complicated +create table atacc1 ( test int, test2 int, test3 int); +-- add a check constraint (fails) +alter table atacc1 add constraint atacc_test1 check (test+test23), test2 int); +alter table atacc1 add check (test2>test); +-- should fail for $2 +insert into atacc1 (test2, test) values (3, 4); +ERROR: new row for relation "atacc1" violates check constraint "atacc1_check" +DETAIL: Failing row contains (4, 3). +drop table atacc1; +-- inheritance related tests +create table atacc1 (test int); +create table atacc2 (test2 int); +create table atacc3 (test3 int) inherits (atacc1, atacc2); +alter table atacc2 add constraint foo check (test2>0); +-- fail and then succeed on atacc2 +insert into atacc2 (test2) values (-3); +ERROR: new row for relation "atacc2" violates check constraint "foo" +DETAIL: Failing row contains (-3). +insert into atacc2 (test2) values (3); +-- fail and then succeed on atacc3 +insert into atacc3 (test2) values (-3); +ERROR: new row for relation "atacc3" violates check constraint "foo" +DETAIL: Failing row contains (null, -3, null). +insert into atacc3 (test2) values (3); +drop table atacc3; +drop table atacc2; +drop table atacc1; +-- same things with one created with INHERIT +create table atacc1 (test int); +create table atacc2 (test2 int); +create table atacc3 (test3 int) inherits (atacc1, atacc2); +alter table atacc3 no inherit atacc2; +-- fail +alter table atacc3 no inherit atacc2; +ERROR: relation "atacc2" is not a parent of relation "atacc3" +-- make sure it really isn't a child +insert into atacc3 (test2) values (3); +select test2 from atacc2; + test2 +------- +(0 rows) + +-- fail due to missing constraint +alter table atacc2 add constraint foo check (test2>0); +alter table atacc3 inherit atacc2; +ERROR: child table is missing constraint "foo" +-- fail due to missing column +alter table atacc3 rename test2 to testx; +alter table atacc3 inherit atacc2; +ERROR: child table is missing column "test2" +-- fail due to mismatched data type +alter table atacc3 add test2 bool; +alter table atacc3 inherit atacc2; +ERROR: child table "atacc3" has different type for column "test2" +alter table atacc3 drop test2; +-- succeed +alter table atacc3 add test2 int; +update atacc3 set test2 = 4 where test2 is null; +alter table atacc3 add constraint foo check (test2>0); +alter table atacc3 inherit atacc2; +-- fail due to duplicates and circular inheritance +alter table atacc3 inherit atacc2; +ERROR: relation "atacc2" would be inherited from more than once +alter table atacc2 inherit atacc3; +ERROR: circular inheritance not allowed +DETAIL: "atacc3" is already a child of "atacc2". +alter table atacc2 inherit atacc2; +ERROR: circular inheritance not allowed +DETAIL: "atacc2" is already a child of "atacc2". +-- test that we really are a child now (should see 4 not 3 and cascade should go through) +select test2 from atacc2; + test2 +------- + 4 +(1 row) + +drop table atacc2 cascade; +NOTICE: drop cascades to table atacc3 +drop table atacc1; +-- adding only to a parent is allowed as of 9.2 +create table atacc1 (test int); +create table atacc2 (test2 int) inherits (atacc1); +-- ok: +alter table atacc1 add constraint foo check (test>0) no inherit; +-- check constraint is not there on child +insert into atacc2 (test) values (-3); +-- check constraint is there on parent +insert into atacc1 (test) values (-3); +ERROR: new row for relation "atacc1" violates check constraint "foo" +DETAIL: Failing row contains (-3). +insert into atacc1 (test) values (3); +-- fail, violating row: +alter table atacc2 add constraint foo check (test>0) no inherit; +ERROR: check constraint "foo" of relation "atacc2" is violated by some row +drop table atacc2; +drop table atacc1; +-- test unique constraint adding +create table atacc1 ( test int ); +-- add a unique constraint +alter table atacc1 add constraint atacc_test1 unique (test); +-- insert first value +insert into atacc1 (test) values (2); +-- should fail +insert into atacc1 (test) values (2); +ERROR: duplicate key value violates unique constraint "atacc_test1" +DETAIL: Key (test)=(2) already exists. +-- should succeed +insert into atacc1 (test) values (4); +-- try to create duplicates via alter table using - should fail +alter table atacc1 alter column test type integer using 0; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +drop table atacc1; +-- let's do one where the unique constraint fails when added +create table atacc1 ( test int ); +-- insert soon to be failing rows +insert into atacc1 (test) values (2); +insert into atacc1 (test) values (2); +-- add a unique constraint (fails) +alter table atacc1 add constraint atacc_test1 unique (test); +ERROR: could not create unique index "atacc_test1" +DETAIL: Key (test)=(2) is duplicated. +insert into atacc1 (test) values (3); +drop table atacc1; +-- let's do one where the unique constraint fails +-- because the column doesn't exist +create table atacc1 ( test int ); +-- add a unique constraint (fails) +alter table atacc1 add constraint atacc_test1 unique (test1); +ERROR: column "test1" named in key does not exist +drop table atacc1; +-- something a little more complicated +create table atacc1 ( test int, test2 int); +-- add a unique constraint +alter table atacc1 add constraint atacc_test1 unique (test, test2); +-- insert initial value +insert into atacc1 (test,test2) values (4,4); +-- should fail +insert into atacc1 (test,test2) values (4,4); +ERROR: duplicate key value violates unique constraint "atacc_test1" +DETAIL: Key (test, test2)=(4, 4) already exists. +-- should all succeed +insert into atacc1 (test,test2) values (4,5); +insert into atacc1 (test,test2) values (5,4); +insert into atacc1 (test,test2) values (5,5); +drop table atacc1; +-- lets do some naming tests +create table atacc1 (test int, test2 int, unique(test)); +alter table atacc1 add unique (test2); +-- should fail for @@ second one @@ +insert into atacc1 (test2, test) values (3, 3); +insert into atacc1 (test2, test) values (2, 3); +ERROR: duplicate key value violates unique constraint "atacc1_test_key" +DETAIL: Key (test)=(3) already exists. +drop table atacc1; +-- test primary key constraint adding +create table atacc1 ( id serial, test int); +-- add a primary key constraint +alter table atacc1 add constraint atacc_test1 primary key (test); +-- insert first value +insert into atacc1 (test) values (2); +-- should fail +insert into atacc1 (test) values (2); +ERROR: duplicate key value violates unique constraint "atacc_test1" +DETAIL: Key (test)=(2) already exists. +-- should succeed +insert into atacc1 (test) values (4); +-- inserting NULL should fail +insert into atacc1 (test) values(NULL); +ERROR: null value in column "test" of relation "atacc1" violates not-null constraint +DETAIL: Failing row contains (4, null). +-- try adding a second primary key (should fail) +alter table atacc1 add constraint atacc_oid1 primary key(id); +ERROR: multiple primary keys for table "atacc1" are not allowed +-- drop first primary key constraint +alter table atacc1 drop constraint atacc_test1 restrict; +-- try adding a primary key on oid (should succeed) +alter table atacc1 add constraint atacc_oid1 primary key(id); +drop table atacc1; +-- let's do one where the primary key constraint fails when added +create table atacc1 ( test int ); +-- insert soon to be failing rows +insert into atacc1 (test) values (2); +insert into atacc1 (test) values (2); +-- add a primary key (fails) +alter table atacc1 add constraint atacc_test1 primary key (test); +ERROR: could not create unique index "atacc_test1" +DETAIL: Key (test)=(2) is duplicated. +insert into atacc1 (test) values (3); +drop table atacc1; +-- let's do another one where the primary key constraint fails when added +create table atacc1 ( test int ); +-- insert soon to be failing row +insert into atacc1 (test) values (NULL); +-- add a primary key (fails) +alter table atacc1 add constraint atacc_test1 primary key (test); +ERROR: column "test" of relation "atacc1" contains null values +insert into atacc1 (test) values (3); +drop table atacc1; +-- let's do one where the primary key constraint fails +-- because the column doesn't exist +create table atacc1 ( test int ); +-- add a primary key constraint (fails) +alter table atacc1 add constraint atacc_test1 primary key (test1); +ERROR: column "test1" of relation "atacc1" does not exist +drop table atacc1; +-- adding a new column as primary key to a non-empty table. +-- should fail unless the column has a non-null default value. +create table atacc1 ( test int ); +insert into atacc1 (test) values (0); +-- add a primary key column without a default (fails). +alter table atacc1 add column test2 int primary key; +ERROR: column "test2" of relation "atacc1" contains null values +-- now add a primary key column with a default (succeeds). +alter table atacc1 add column test2 int default 0 primary key; +drop table atacc1; +-- this combination used to have order-of-execution problems (bug #15580) +create table atacc1 (a int); +insert into atacc1 values(1); +alter table atacc1 + add column b float8 not null default random(), + add primary key(a); +drop table atacc1; +-- additionally, we've seen issues with foreign key validation not being +-- properly delayed until after a table rewrite. Check that works ok. +create table atacc1 (a int primary key); +alter table atacc1 add constraint atacc1_fkey foreign key (a) references atacc1 (a) not valid; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +alter table atacc1 validate constraint atacc1_fkey, alter a type bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +drop table atacc1; +-- we've also seen issues with check constraints being validated at the wrong +-- time when there's a pending table rewrite. +create table atacc1 (a bigint, b int); +insert into atacc1 values(1,1); +alter table atacc1 add constraint atacc1_chk check(b = 1) not valid; +alter table atacc1 validate constraint atacc1_chk, alter a type int; +drop table atacc1; +-- same as above, but ensure the constraint violation is detected +create table atacc1 (a bigint, b int); +insert into atacc1 values(1,2); +alter table atacc1 add constraint atacc1_chk check(b = 1) not valid; +alter table atacc1 validate constraint atacc1_chk, alter a type int; +ERROR: check constraint "atacc1_chk" of relation "atacc1" is violated by some row +drop table atacc1; +-- something a little more complicated +create table atacc1 ( test int, test2 int); +-- add a primary key constraint +alter table atacc1 add constraint atacc_test1 primary key (test, test2); +-- try adding a second primary key - should fail +alter table atacc1 add constraint atacc_test2 primary key (test); +ERROR: multiple primary keys for table "atacc1" are not allowed +-- insert initial value +insert into atacc1 (test,test2) values (4,4); +-- should fail +insert into atacc1 (test,test2) values (4,4); +ERROR: duplicate key value violates unique constraint "atacc_test1" +DETAIL: Key (test, test2)=(4, 4) already exists. +insert into atacc1 (test,test2) values (NULL,3); +ERROR: null value in column "test" of relation "atacc1" violates not-null constraint +DETAIL: Failing row contains (null, 3). +insert into atacc1 (test,test2) values (3, NULL); +ERROR: null value in column "test2" of relation "atacc1" violates not-null constraint +DETAIL: Failing row contains (3, null). +insert into atacc1 (test,test2) values (NULL,NULL); +ERROR: null value in column "test" of relation "atacc1" violates not-null constraint +DETAIL: Failing row contains (null, null). +-- should all succeed +insert into atacc1 (test,test2) values (4,5); +insert into atacc1 (test,test2) values (5,4); +insert into atacc1 (test,test2) values (5,5); +drop table atacc1; +-- lets do some naming tests +create table atacc1 (test int, test2 int, primary key(test)); +-- only first should succeed +insert into atacc1 (test2, test) values (3, 3); +insert into atacc1 (test2, test) values (2, 3); +ERROR: duplicate key value violates unique constraint "atacc1_pkey" +DETAIL: Key (test)=(3) already exists. +insert into atacc1 (test2, test) values (1, NULL); +ERROR: null value in column "test" of relation "atacc1" violates not-null constraint +DETAIL: Failing row contains (null, 1). +drop table atacc1; +-- alter table / alter column [set/drop] not null tests +-- try altering system catalogs, should fail +alter table pg_class alter column relname drop not null; +ERROR: permission denied: "pg_class" is a system catalog +alter table pg_class alter relname set not null; +ERROR: permission denied: "pg_class" is a system catalog +-- try altering non-existent table, should fail +alter table non_existent alter column bar set not null; +ERROR: relation "non_existent" does not exist +alter table non_existent alter column bar drop not null; +ERROR: relation "non_existent" does not exist +-- test setting columns to null and not null and vice versa +-- test checking for null values and primary key +create table atacc1 (test int not null); +alter table atacc1 add constraint "atacc1_pkey" primary key (test); +alter table atacc1 alter column test drop not null; +ERROR: column "test" is in a primary key +alter table atacc1 drop constraint "atacc1_pkey"; +alter table atacc1 alter column test drop not null; +insert into atacc1 values (null); +alter table atacc1 alter test set not null; +ERROR: column "test" of relation "atacc1" contains null values +delete from atacc1; +alter table atacc1 alter test set not null; +-- try altering a non-existent column, should fail +alter table atacc1 alter bar set not null; +ERROR: column "bar" of relation "atacc1" does not exist +alter table atacc1 alter bar drop not null; +ERROR: column "bar" of relation "atacc1" does not exist +-- try creating a view and altering that, should fail +create view myview as select * from atacc1; +alter table myview alter column test drop not null; +ERROR: "myview" is not a table or foreign table +alter table myview alter column test set not null; +ERROR: "myview" is not a table or foreign table +drop view myview; +drop table atacc1; +-- set not null verified by constraints +create table atacc1 (test_a int, test_b int); +insert into atacc1 values (null, 1); +-- constraint not cover all values, should fail +alter table atacc1 add constraint atacc1_constr_or check(test_a is not null or test_b < 10); +alter table atacc1 alter test_a set not null; +ERROR: column "test_a" of relation "atacc1" contains null values +alter table atacc1 drop constraint atacc1_constr_or; +-- not valid constraint, should fail +alter table atacc1 add constraint atacc1_constr_invalid check(test_a is not null) not valid; +alter table atacc1 alter test_a set not null; +ERROR: column "test_a" of relation "atacc1" contains null values +alter table atacc1 drop constraint atacc1_constr_invalid; +-- with valid constraint +update atacc1 set test_a = 1; +alter table atacc1 add constraint atacc1_constr_a_valid check(test_a is not null); +alter table atacc1 alter test_a set not null; +delete from atacc1; +insert into atacc1 values (2, null); +alter table atacc1 alter test_a drop not null; +-- test multiple set not null at same time +-- test_a checked by atacc1_constr_a_valid, test_b should fail by table scan +alter table atacc1 alter test_a set not null, alter test_b set not null; +ERROR: column "test_b" of relation "atacc1" contains null values +-- commands order has no importance +alter table atacc1 alter test_b set not null, alter test_a set not null; +ERROR: column "test_b" of relation "atacc1" contains null values +-- valid one by table scan, one by check constraints +update atacc1 set test_b = 1; +alter table atacc1 alter test_b set not null, alter test_a set not null; +alter table atacc1 alter test_a drop not null, alter test_b drop not null; +-- both column has check constraints +alter table atacc1 add constraint atacc1_constr_b_valid check(test_b is not null); +alter table atacc1 alter test_b set not null, alter test_a set not null; +drop table atacc1; +-- test inheritance +create table parent (a int); +create table child (b varchar(255)) inherits (parent); +alter table parent alter a set not null; +insert into parent values (NULL); +ERROR: null value in column "a" of relation "parent" violates not-null constraint +DETAIL: Failing row contains (null). +insert into child (a, b) values (NULL, 'foo'); +ERROR: null value in column "a" of relation "child" violates not-null constraint +DETAIL: Failing row contains (null, foo). +alter table parent alter a drop not null; +insert into parent values (NULL); +insert into child (a, b) values (NULL, 'foo'); +alter table only parent alter a set not null; +ERROR: column "a" of relation "parent" contains null values +alter table child alter a set not null; +ERROR: column "a" of relation "child" contains null values +delete from parent; +alter table only parent alter a set not null; +insert into parent values (NULL); +ERROR: null value in column "a" of relation "parent" violates not-null constraint +DETAIL: Failing row contains (null). +alter table child alter a set not null; +insert into child (a, b) values (NULL, 'foo'); +ERROR: null value in column "a" of relation "child" violates not-null constraint +DETAIL: Failing row contains (null, foo). +delete from child; +alter table child alter a set not null; +insert into child (a, b) values (NULL, 'foo'); +ERROR: null value in column "a" of relation "child" violates not-null constraint +DETAIL: Failing row contains (null, foo). +drop table child; +drop table parent; +-- test setting and removing default values +create table def_test ( + c1 int4 default 5, + c2 text default 'initial_default' +); +insert into def_test default values; +alter table def_test alter column c1 drop default; +insert into def_test default values; +alter table def_test alter column c2 drop default; +insert into def_test default values; +alter table def_test alter column c1 set default 10; +alter table def_test alter column c2 set default 'new_default'; +insert into def_test default values; +select * from def_test; + c1 | c2 +----+----------------- + 5 | initial_default + | initial_default + | + 10 | new_default +(4 rows) + +-- set defaults to an incorrect type: this should fail +alter table def_test alter column c1 set default 'wrong_datatype'; +ERROR: invalid input syntax for type integer: "wrong_datatype" +alter table def_test alter column c2 set default 20; +-- set defaults on a non-existent column: this should fail +alter table def_test alter column c3 set default 30; +ERROR: column "c3" of relation "def_test" does not exist +-- set defaults on views: we need to create a view, add a rule +-- to allow insertions into it, and then alter the view to add +-- a default +create view def_view_test as select * from def_test; +create rule def_view_test_ins as + on insert to def_view_test + do instead insert into def_test select new.*; +insert into def_view_test default values; +alter table def_view_test alter column c1 set default 45; +insert into def_view_test default values; +alter table def_view_test alter column c2 set default 'view_default'; +insert into def_view_test default values; +select * from def_view_test; + c1 | c2 +----+----------------- + 5 | initial_default + | initial_default + | + 10 | new_default + | + 45 | + 45 | view_default +(7 rows) + +drop rule def_view_test_ins on def_view_test; +drop view def_view_test; +drop table def_test; +-- alter table / drop column tests +-- try altering system catalogs, should fail +alter table pg_class drop column relname; +ERROR: permission denied: "pg_class" is a system catalog +-- try altering non-existent table, should fail +alter table nosuchtable drop column bar; +ERROR: relation "nosuchtable" does not exist +-- test dropping columns +create table atacc1 (a int4 not null, b int4, c int4 not null, d int4); +insert into atacc1 values (1, 2, 3, 4); +alter table atacc1 drop a; +alter table atacc1 drop a; +ERROR: column "a" of relation "atacc1" does not exist +-- SELECTs +select * from atacc1; + b | c | d +---+---+--- + 2 | 3 | 4 +(1 row) + +select * from atacc1 order by a; +ERROR: column "a" does not exist +LINE 1: select * from atacc1 order by a; + ^ +select * from atacc1 order by "........pg.dropped.1........"; +ERROR: column "........pg.dropped.1........" does not exist +LINE 1: select * from atacc1 order by "........pg.dropped.1........"... + ^ +select * from atacc1 group by a; +ERROR: column "a" does not exist +LINE 1: select * from atacc1 group by a; + ^ +select * from atacc1 group by "........pg.dropped.1........"; +ERROR: column "........pg.dropped.1........" does not exist +LINE 1: select * from atacc1 group by "........pg.dropped.1........"... + ^ +select atacc1.* from atacc1; + b | c | d +---+---+--- + 2 | 3 | 4 +(1 row) + +select a from atacc1; +ERROR: column "a" does not exist +LINE 1: select a from atacc1; + ^ +select atacc1.a from atacc1; +ERROR: column atacc1.a does not exist +LINE 1: select atacc1.a from atacc1; + ^ +select b,c,d from atacc1; + b | c | d +---+---+--- + 2 | 3 | 4 +(1 row) + +select a,b,c,d from atacc1; +ERROR: column "a" does not exist +LINE 1: select a,b,c,d from atacc1; + ^ +select * from atacc1 where a = 1; +ERROR: column "a" does not exist +LINE 1: select * from atacc1 where a = 1; + ^ +select "........pg.dropped.1........" from atacc1; +ERROR: column "........pg.dropped.1........" does not exist +LINE 1: select "........pg.dropped.1........" from atacc1; + ^ +select atacc1."........pg.dropped.1........" from atacc1; +ERROR: column atacc1.........pg.dropped.1........ does not exist +LINE 1: select atacc1."........pg.dropped.1........" from atacc1; + ^ +select "........pg.dropped.1........",b,c,d from atacc1; +ERROR: column "........pg.dropped.1........" does not exist +LINE 1: select "........pg.dropped.1........",b,c,d from atacc1; + ^ +select * from atacc1 where "........pg.dropped.1........" = 1; +ERROR: column "........pg.dropped.1........" does not exist +LINE 1: select * from atacc1 where "........pg.dropped.1........" = ... + ^ +-- UPDATEs +update atacc1 set a = 3; +ERROR: column "a" of relation "atacc1" does not exist +LINE 1: update atacc1 set a = 3; + ^ +update atacc1 set b = 2 where a = 3; +ERROR: column "a" does not exist +LINE 1: update atacc1 set b = 2 where a = 3; + ^ +update atacc1 set "........pg.dropped.1........" = 3; +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +LINE 1: update atacc1 set "........pg.dropped.1........" = 3; + ^ +update atacc1 set b = 2 where "........pg.dropped.1........" = 3; +ERROR: column "........pg.dropped.1........" does not exist +LINE 1: update atacc1 set b = 2 where "........pg.dropped.1........"... + ^ +-- INSERTs +insert into atacc1 values (10, 11, 12, 13); +ERROR: INSERT has more expressions than target columns +LINE 1: insert into atacc1 values (10, 11, 12, 13); + ^ +insert into atacc1 values (default, 11, 12, 13); +ERROR: INSERT has more expressions than target columns +LINE 1: insert into atacc1 values (default, 11, 12, 13); + ^ +insert into atacc1 values (11, 12, 13); +insert into atacc1 (a) values (10); +ERROR: column "a" of relation "atacc1" does not exist +LINE 1: insert into atacc1 (a) values (10); + ^ +insert into atacc1 (a) values (default); +ERROR: column "a" of relation "atacc1" does not exist +LINE 1: insert into atacc1 (a) values (default); + ^ +insert into atacc1 (a,b,c,d) values (10,11,12,13); +ERROR: column "a" of relation "atacc1" does not exist +LINE 1: insert into atacc1 (a,b,c,d) values (10,11,12,13); + ^ +insert into atacc1 (a,b,c,d) values (default,11,12,13); +ERROR: column "a" of relation "atacc1" does not exist +LINE 1: insert into atacc1 (a,b,c,d) values (default,11,12,13); + ^ +insert into atacc1 (b,c,d) values (11,12,13); +insert into atacc1 ("........pg.dropped.1........") values (10); +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +LINE 1: insert into atacc1 ("........pg.dropped.1........") values (... + ^ +insert into atacc1 ("........pg.dropped.1........") values (default); +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +LINE 1: insert into atacc1 ("........pg.dropped.1........") values (... + ^ +insert into atacc1 ("........pg.dropped.1........",b,c,d) values (10,11,12,13); +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +LINE 1: insert into atacc1 ("........pg.dropped.1........",b,c,d) va... + ^ +insert into atacc1 ("........pg.dropped.1........",b,c,d) values (default,11,12,13); +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +LINE 1: insert into atacc1 ("........pg.dropped.1........",b,c,d) va... + ^ +-- DELETEs +delete from atacc1 where a = 3; +ERROR: column "a" does not exist +LINE 1: delete from atacc1 where a = 3; + ^ +delete from atacc1 where "........pg.dropped.1........" = 3; +ERROR: column "........pg.dropped.1........" does not exist +LINE 1: delete from atacc1 where "........pg.dropped.1........" = 3; + ^ +delete from atacc1; +-- try dropping a non-existent column, should fail +alter table atacc1 drop bar; +ERROR: column "bar" of relation "atacc1" does not exist +-- try removing an oid column, should succeed (as it's nonexistent) +alter table atacc1 SET WITHOUT OIDS; +-- try adding an oid column, should fail (not supported) +alter table atacc1 SET WITH OIDS; +ERROR: syntax error at or near "OIDS" +LINE 1: alter table atacc1 SET WITH OIDS; + ^ +-- try dropping the xmin column, should fail +alter table atacc1 drop xmin; +ERROR: cannot drop system column "xmin" +-- try creating a view and altering that, should fail +create view myview as select * from atacc1; +select * from myview; + b | c | d +---+---+--- +(0 rows) + +alter table myview drop d; +ERROR: "myview" is not a table, composite type, or foreign table +drop view myview; +-- test some commands to make sure they fail on the dropped column +analyze atacc1(a); +ERROR: column "a" of relation "atacc1" does not exist +analyze atacc1("........pg.dropped.1........"); +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +vacuum analyze atacc1(a); +ERROR: column "a" of relation "atacc1" does not exist +vacuum analyze atacc1("........pg.dropped.1........"); +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +comment on column atacc1.a is 'testing'; +ERROR: column "a" of relation "atacc1" does not exist +comment on column atacc1."........pg.dropped.1........" is 'testing'; +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +alter table atacc1 alter a set storage plain; +ERROR: column "a" of relation "atacc1" does not exist +alter table atacc1 alter "........pg.dropped.1........" set storage plain; +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +alter table atacc1 alter a set statistics 0; +ERROR: column "a" of relation "atacc1" does not exist +alter table atacc1 alter "........pg.dropped.1........" set statistics 0; +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +alter table atacc1 alter a set default 3; +ERROR: column "a" of relation "atacc1" does not exist +alter table atacc1 alter "........pg.dropped.1........" set default 3; +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +alter table atacc1 alter a drop default; +ERROR: column "a" of relation "atacc1" does not exist +alter table atacc1 alter "........pg.dropped.1........" drop default; +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +alter table atacc1 alter a set not null; +ERROR: column "a" of relation "atacc1" does not exist +alter table atacc1 alter "........pg.dropped.1........" set not null; +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +alter table atacc1 alter a drop not null; +ERROR: column "a" of relation "atacc1" does not exist +alter table atacc1 alter "........pg.dropped.1........" drop not null; +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +alter table atacc1 rename a to x; +ERROR: column "a" does not exist +alter table atacc1 rename "........pg.dropped.1........" to x; +ERROR: column "........pg.dropped.1........" does not exist +alter table atacc1 add primary key(a); +ERROR: column "a" of relation "atacc1" does not exist +alter table atacc1 add primary key("........pg.dropped.1........"); +ERROR: column "........pg.dropped.1........" of relation "atacc1" does not exist +alter table atacc1 add unique(a); +ERROR: column "a" named in key does not exist +alter table atacc1 add unique("........pg.dropped.1........"); +ERROR: column "........pg.dropped.1........" named in key does not exist +alter table atacc1 add check (a > 3); +ERROR: column "a" does not exist +alter table atacc1 add check ("........pg.dropped.1........" > 3); +ERROR: column "........pg.dropped.1........" does not exist +create table atacc2 (id int4 unique); +alter table atacc1 add foreign key (a) references atacc2(id); +ERROR: column "a" referenced in foreign key constraint does not exist +alter table atacc1 add foreign key ("........pg.dropped.1........") references atacc2(id); +ERROR: column "........pg.dropped.1........" referenced in foreign key constraint does not exist +alter table atacc2 add foreign key (id) references atacc1(a); +ERROR: column "a" referenced in foreign key constraint does not exist +alter table atacc2 add foreign key (id) references atacc1("........pg.dropped.1........"); +ERROR: column "........pg.dropped.1........" referenced in foreign key constraint does not exist +drop table atacc2; +create index "testing_idx" on atacc1(a); +ERROR: column "a" does not exist +create index "testing_idx" on atacc1("........pg.dropped.1........"); +ERROR: column "........pg.dropped.1........" does not exist +-- test create as and select into +insert into atacc1 values (21, 22, 23); +create table attest1 as select * from atacc1; +select * from attest1; + b | c | d +----+----+---- + 21 | 22 | 23 +(1 row) + +drop table attest1; +select * into attest2 from atacc1; +select * from attest2; + b | c | d +----+----+---- + 21 | 22 | 23 +(1 row) + +drop table attest2; +-- try dropping all columns +alter table atacc1 drop c; +alter table atacc1 drop d; +alter table atacc1 drop b; +select * from atacc1; +-- +(1 row) + +drop table atacc1; +-- test constraint error reporting in presence of dropped columns +create table atacc1 (id serial primary key, value int check (value < 10)); +insert into atacc1(value) values (100); +ERROR: new row for relation "atacc1" violates check constraint "atacc1_value_check" +DETAIL: Failing row contains (1, 100). +alter table atacc1 drop column value; +alter table atacc1 add column value int check (value < 10); +insert into atacc1(value) values (100); +ERROR: new row for relation "atacc1" violates check constraint "atacc1_value_check" +DETAIL: Failing row contains (2, 100). +insert into atacc1(id, value) values (null, 0); +ERROR: null value in column "id" of relation "atacc1" violates not-null constraint +DETAIL: Failing row contains (null, 0). +drop table atacc1; +-- test inheritance +create table parent (a int, b int, c int); +insert into parent values (1, 2, 3); +alter table parent drop a; +create table child (d varchar(255)) inherits (parent); +insert into child values (12, 13, 'testing'); +select * from parent; + b | c +----+---- + 2 | 3 + 12 | 13 +(2 rows) + +select * from child; + b | c | d +----+----+--------- + 12 | 13 | testing +(1 row) + +alter table parent drop c; +select * from parent; + b +---- + 2 + 12 +(2 rows) + +select * from child; + b | d +----+--------- + 12 | testing +(1 row) + +drop table child; +drop table parent; +-- check error cases for inheritance column merging +create table parent (a float8, b numeric(10,4), c text collate "C"); +create table child (a float4) inherits (parent); -- fail +NOTICE: merging column "a" with inherited definition +ERROR: column "a" has a type conflict +DETAIL: double precision versus real +create table child (b decimal(10,7)) inherits (parent); -- fail +NOTICE: moving and merging column "b" with inherited definition +DETAIL: User-specified column moved to the position of the inherited column. +ERROR: column "b" has a type conflict +DETAIL: numeric(10,4) versus numeric(10,7) +create table child (c text collate "POSIX") inherits (parent); -- fail +NOTICE: moving and merging column "c" with inherited definition +DETAIL: User-specified column moved to the position of the inherited column. +ERROR: column "c" has a collation conflict +DETAIL: "C" versus "POSIX" +create table child (a double precision, b decimal(10,4)) inherits (parent); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +drop table child; +drop table parent; +-- test copy in/out +create table attest (a int4, b int4, c int4); +insert into attest values (1,2,3); +alter table attest drop a; +copy attest to stdout; +2 3 +copy attest(a) to stdout; +ERROR: column "a" of relation "attest" does not exist +copy attest("........pg.dropped.1........") to stdout; +ERROR: column "........pg.dropped.1........" of relation "attest" does not exist +copy attest from stdin; +ERROR: extra data after last expected column +CONTEXT: COPY attest, line 1: "10 11 12" +select * from attest; + b | c +---+--- + 2 | 3 +(1 row) + +copy attest from stdin; +select * from attest; + b | c +----+---- + 2 | 3 + 21 | 22 +(2 rows) + +copy attest(a) from stdin; +ERROR: column "a" of relation "attest" does not exist +copy attest("........pg.dropped.1........") from stdin; +ERROR: column "........pg.dropped.1........" of relation "attest" does not exist +copy attest(b,c) from stdin; +select * from attest; + b | c +----+---- + 2 | 3 + 21 | 22 + 31 | 32 +(3 rows) + +drop table attest; +-- test inheritance +create table dropColumn (a int, b int, e int); +create table dropColumnChild (c int) inherits (dropColumn); +create table dropColumnAnother (d int) inherits (dropColumnChild); +-- these two should fail +alter table dropColumnchild drop column a; +ERROR: cannot drop inherited column "a" +alter table only dropColumnChild drop column b; +ERROR: cannot drop inherited column "b" +-- these three should work +alter table only dropColumn drop column e; +alter table dropColumnChild drop column c; +alter table dropColumn drop column a; +create table renameColumn (a int); +create table renameColumnChild (b int) inherits (renameColumn); +create table renameColumnAnother (c int) inherits (renameColumnChild); +-- these three should fail +alter table renameColumnChild rename column a to d; +ERROR: cannot rename inherited column "a" +alter table only renameColumnChild rename column a to d; +ERROR: inherited column "a" must be renamed in child tables too +alter table only renameColumn rename column a to d; +ERROR: inherited column "a" must be renamed in child tables too +-- these should work +alter table renameColumn rename column a to d; +alter table renameColumnChild rename column b to a; +-- these should work +alter table if exists doesnt_exist_tab rename column a to d; +NOTICE: relation "doesnt_exist_tab" does not exist, skipping +alter table if exists doesnt_exist_tab rename column b to a; +NOTICE: relation "doesnt_exist_tab" does not exist, skipping +-- this should work +alter table renameColumn add column w int; +-- this should fail +alter table only renameColumn add column x int; +ERROR: column must be added to child tables too +-- Test corner cases in dropping of inherited columns +create table p1 (f1 int, f2 int); +create table c1 (f1 int not null) inherits(p1); +NOTICE: merging column "f1" with inherited definition +-- should be rejected since c1.f1 is inherited +alter table c1 drop column f1; +ERROR: cannot drop inherited column "f1" +-- should work +alter table p1 drop column f1; +-- c1.f1 is still there, but no longer inherited +select f1 from c1; + f1 +---- +(0 rows) + +alter table c1 drop column f1; +select f1 from c1; +ERROR: column "f1" does not exist +LINE 1: select f1 from c1; + ^ +HINT: Perhaps you meant to reference the column "c1.f2". +drop table p1 cascade; +NOTICE: drop cascades to table c1 +create table p1 (f1 int, f2 int); +create table c1 () inherits(p1); +-- should be rejected since c1.f1 is inherited +alter table c1 drop column f1; +ERROR: cannot drop inherited column "f1" +alter table p1 drop column f1; +-- c1.f1 is dropped now, since there is no local definition for it +select f1 from c1; +ERROR: column "f1" does not exist +LINE 1: select f1 from c1; + ^ +HINT: Perhaps you meant to reference the column "c1.f2". +drop table p1 cascade; +NOTICE: drop cascades to table c1 +create table p1 (f1 int, f2 int); +create table c1 () inherits(p1); +-- should be rejected since c1.f1 is inherited +alter table c1 drop column f1; +ERROR: cannot drop inherited column "f1" +alter table only p1 drop column f1; +-- c1.f1 is NOT dropped, but must now be considered non-inherited +alter table c1 drop column f1; +drop table p1 cascade; +NOTICE: drop cascades to table c1 +create table p1 (f1 int, f2 int); +create table c1 (f1 int not null) inherits(p1); +NOTICE: merging column "f1" with inherited definition +-- should be rejected since c1.f1 is inherited +alter table c1 drop column f1; +ERROR: cannot drop inherited column "f1" +alter table only p1 drop column f1; +-- c1.f1 is still there, but no longer inherited +alter table c1 drop column f1; +drop table p1 cascade; +NOTICE: drop cascades to table c1 +create table p1(id int, name text); +create table p2(id2 int, name text, height int); +create table c1(age int) inherits(p1,p2); +NOTICE: merging multiple inherited definitions of column "name" +create table gc1() inherits (c1); +select relname, attname, attinhcount, attislocal +from pg_class join pg_attribute on (pg_class.oid = pg_attribute.attrelid) +where relname in ('p1','p2','c1','gc1') and attnum > 0 and not attisdropped +order by relname, attnum; + relname | attname | attinhcount | attislocal +---------+---------+-------------+------------ + c1 | id | 1 | f + c1 | name | 2 | f + c1 | id2 | 1 | f + c1 | height | 1 | f + c1 | age | 0 | t + gc1 | id | 1 | f + gc1 | name | 1 | f + gc1 | id2 | 1 | f + gc1 | height | 1 | f + gc1 | age | 1 | f + p1 | id | 0 | t + p1 | name | 0 | t + p2 | id2 | 0 | t + p2 | name | 0 | t + p2 | height | 0 | t +(15 rows) + +-- should work +alter table only p1 drop column name; +-- should work. Now c1.name is local and inhcount is 0. +alter table p2 drop column name; +-- should be rejected since its inherited +alter table gc1 drop column name; +ERROR: cannot drop inherited column "name" +-- should work, and drop gc1.name along +alter table c1 drop column name; +-- should fail: column does not exist +alter table gc1 drop column name; +ERROR: column "name" of relation "gc1" does not exist +-- should work and drop the attribute in all tables +alter table p2 drop column height; +-- IF EXISTS test +create table dropColumnExists (); +alter table dropColumnExists drop column non_existing; --fail +ERROR: column "non_existing" of relation "dropcolumnexists" does not exist +alter table dropColumnExists drop column if exists non_existing; --succeed +NOTICE: column "non_existing" of relation "dropcolumnexists" does not exist, skipping +select relname, attname, attinhcount, attislocal +from pg_class join pg_attribute on (pg_class.oid = pg_attribute.attrelid) +where relname in ('p1','p2','c1','gc1') and attnum > 0 and not attisdropped +order by relname, attnum; + relname | attname | attinhcount | attislocal +---------+---------+-------------+------------ + c1 | id | 1 | f + c1 | id2 | 1 | f + c1 | age | 0 | t + gc1 | id | 1 | f + gc1 | id2 | 1 | f + gc1 | age | 1 | f + p1 | id | 0 | t + p2 | id2 | 0 | t +(8 rows) + +drop table p1, p2 cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table c1 +drop cascades to table gc1 +-- test attinhcount tracking with merged columns +create table depth0(); +create table depth1(c text) inherits (depth0); +create table depth2() inherits (depth1); +alter table depth0 add c text; +NOTICE: merging definition of column "c" for child "depth1" +select attrelid::regclass, attname, attinhcount, attislocal +from pg_attribute +where attnum > 0 and attrelid::regclass in ('depth0', 'depth1', 'depth2') +order by attrelid::regclass::text, attnum; + attrelid | attname | attinhcount | attislocal +----------+---------+-------------+------------ + depth0 | c | 0 | t + depth1 | c | 1 | t + depth2 | c | 1 | f +(3 rows) + +-- test renumbering of child-table columns in inherited operations +create table p1 (f1 int); +create table c1 (f2 text, f3 int) inherits (p1); +alter table p1 add column a1 int check (a1 > 0); +alter table p1 add column f2 text; +NOTICE: merging definition of column "f2" for child "c1" +insert into p1 values (1,2,'abc'); +insert into c1 values(11,'xyz',33,0); -- should fail +ERROR: new row for relation "c1" violates check constraint "p1_a1_check" +DETAIL: Failing row contains (11, xyz, 33, 0). +insert into c1 values(11,'xyz',33,22); +select * from p1; + f1 | a1 | f2 +----+----+----- + 1 | 2 | abc + 11 | 22 | xyz +(2 rows) + +update p1 set a1 = a1 + 1, f2 = upper(f2); +select * from p1; + f1 | a1 | f2 +----+----+----- + 1 | 3 | ABC + 11 | 23 | XYZ +(2 rows) + +drop table p1 cascade; +NOTICE: drop cascades to table c1 +-- test that operations with a dropped column do not try to reference +-- its datatype +create domain mytype as text; +create temp table foo (f1 text, f2 mytype, f3 text); +insert into foo values('bb','cc','dd'); +select * from foo; + f1 | f2 | f3 +----+----+---- + bb | cc | dd +(1 row) + +drop domain mytype cascade; +NOTICE: drop cascades to column f2 of table foo +select * from foo; + f1 | f3 +----+---- + bb | dd +(1 row) + +insert into foo values('qq','rr'); +select * from foo; + f1 | f3 +----+---- + bb | dd + qq | rr +(2 rows) + +update foo set f3 = 'zz'; +select * from foo; + f1 | f3 +----+---- + bb | zz + qq | zz +(2 rows) + +select f3,max(f1) from foo group by f3; + f3 | max +----+----- + zz | qq +(1 row) + +-- Simple tests for alter table column type +alter table foo alter f1 TYPE integer; -- fails +ERROR: column "f1" cannot be cast automatically to type integer +HINT: You might need to specify "USING f1::integer". +alter table foo alter f1 TYPE varchar(10); +create table anothertab (atcol1 serial8, atcol2 boolean, + constraint anothertab_chk check (atcol1 <= 3)); +insert into anothertab (atcol1, atcol2) values (default, true); +insert into anothertab (atcol1, atcol2) values (default, false); +select * from anothertab; + atcol1 | atcol2 +--------+-------- + 1 | t + 2 | f +(2 rows) + +alter table anothertab alter column atcol1 type boolean; -- fails +ERROR: column "atcol1" cannot be cast automatically to type boolean +HINT: You might need to specify "USING atcol1::boolean". +alter table anothertab alter column atcol1 type boolean using atcol1::int; -- fails +ERROR: result of USING clause for column "atcol1" cannot be cast automatically to type boolean +HINT: You might need to add an explicit cast. +alter table anothertab alter column atcol1 type integer; +select * from anothertab; + atcol1 | atcol2 +--------+-------- + 1 | t + 2 | f +(2 rows) + +insert into anothertab (atcol1, atcol2) values (45, null); -- fails +ERROR: new row for relation "anothertab" violates check constraint "anothertab_chk" +DETAIL: Failing row contains (45, null). +insert into anothertab (atcol1, atcol2) values (default, null); +select * from anothertab; + atcol1 | atcol2 +--------+-------- + 1 | t + 2 | f + 3 | +(3 rows) + +alter table anothertab alter column atcol2 type text + using case when atcol2 is true then 'IT WAS TRUE' + when atcol2 is false then 'IT WAS FALSE' + else 'IT WAS NULL!' end; +select * from anothertab; + atcol1 | atcol2 +--------+-------------- + 1 | IT WAS TRUE + 2 | IT WAS FALSE + 3 | IT WAS NULL! +(3 rows) + +alter table anothertab alter column atcol1 type boolean + using case when atcol1 % 2 = 0 then true else false end; -- fails +ERROR: default for column "atcol1" cannot be cast automatically to type boolean +alter table anothertab alter column atcol1 drop default; +alter table anothertab alter column atcol1 type boolean + using case when atcol1 % 2 = 0 then true else false end; -- fails +ERROR: operator does not exist: boolean <= integer +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +alter table anothertab drop constraint anothertab_chk; +alter table anothertab drop constraint anothertab_chk; -- fails +ERROR: constraint "anothertab_chk" of relation "anothertab" does not exist +alter table anothertab drop constraint IF EXISTS anothertab_chk; -- succeeds +NOTICE: constraint "anothertab_chk" of relation "anothertab" does not exist, skipping +alter table anothertab alter column atcol1 type boolean + using case when atcol1 % 2 = 0 then true else false end; +select * from anothertab; + atcol1 | atcol2 +--------+-------------- + f | IT WAS TRUE + t | IT WAS FALSE + f | IT WAS NULL! +(3 rows) + +drop table anothertab; +-- Test index handling in alter table column type (cf. bugs #15835, #15865) +create table anothertab(f1 int primary key, f2 int unique, + f3 int, f4 int, f5 int); +alter table anothertab + add exclude using btree (f3 with =); +alter table anothertab + add exclude using btree (f4 with =) where (f4 is not null); +alter table anothertab + add exclude using btree (f4 with =) where (f5 > 0); +alter table anothertab + add unique(f1,f4); +create index on anothertab(f2,f3); +create unique index on anothertab(f4); +\d anothertab + Table "public.anothertab" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | not null | + f2 | integer | | | + f3 | integer | | | + f4 | integer | | | + f5 | integer | | | +Indexes: + "anothertab_pkey" PRIMARY KEY, btree (f1) + "anothertab_f1_f4_key" UNIQUE CONSTRAINT, btree (f1, f4) + "anothertab_f2_f3_idx" btree (f2, f3) + "anothertab_f2_key" UNIQUE CONSTRAINT, btree (f2) + "anothertab_f3_excl" EXCLUDE USING btree (f3 WITH =) + "anothertab_f4_excl" EXCLUDE USING btree (f4 WITH =) WHERE (f4 IS NOT NULL) + "anothertab_f4_excl1" EXCLUDE USING btree (f4 WITH =) WHERE (f5 > 0) + "anothertab_f4_idx" UNIQUE, btree (f4) + +-- In GPDB, you cannot change the type of a column that's part of a unique key +alter table anothertab drop constraint anothertab_pkey; +alter table anothertab drop constraint anothertab_f1_f4_key ; +alter table anothertab drop constraint anothertab_f2_key; +drop index anothertab_f4_idx; +alter table anothertab alter column f1 type bigint; +alter table anothertab + alter column f2 type bigint, + alter column f3 type bigint, + alter column f4 type bigint; +alter table anothertab alter column f5 type bigint; +-- restore primary and unique keys +alter table anothertab add constraint anothertab_pkey primary key (f1); +alter table anothertab add constraint anothertab_f1_f4_key unique (f1, f4); +create unique index on anothertab(f4); +alter table anothertab add constraint anothertab_f2_key unique (f2); +\d anothertab + Table "public.anothertab" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+--------- + f1 | bigint | | not null | + f2 | bigint | | | + f3 | bigint | | | + f4 | bigint | | | + f5 | bigint | | | +Indexes: + "anothertab_pkey" PRIMARY KEY, btree (f1) + "anothertab_f1_f4_key" UNIQUE CONSTRAINT, btree (f1, f4) + "anothertab_f2_f3_idx" btree (f2, f3) + "anothertab_f2_key" UNIQUE CONSTRAINT, btree (f2) + "anothertab_f3_excl" EXCLUDE USING btree (f3 WITH =) + "anothertab_f4_excl" EXCLUDE USING btree (f4 WITH =) WHERE (f4 IS NOT NULL) + "anothertab_f4_excl1" EXCLUDE USING btree (f4 WITH =) WHERE (f5 > 0) + "anothertab_f4_idx" UNIQUE, btree (f4) + +drop table anothertab; +-- test that USING expressions are parsed before column alter type / drop steps +create table another (f1 int, f2 text, f3 text); +insert into another values(1, 'one', 'uno'); +insert into another values(2, 'two', 'due'); +insert into another values(3, 'three', 'tre'); +select * from another; + f1 | f2 | f3 +----+-------+----- + 1 | one | uno + 2 | two | due + 3 | three | tre +(3 rows) + +alter table another + alter f1 type text using f2 || ' and ' || f3 || ' more', + alter f2 type bigint using f1 * 10, + drop column f3; +select * from another; + f1 | f2 +--------------------+---- + one and uno more | 10 + two and due more | 20 + three and tre more | 30 +(3 rows) + +drop table another; +-- Create an index that skips WAL, then perform a SET DATA TYPE that skips +-- rewriting the index. +begin; +create table skip_wal_skip_rewrite_index (c varchar(10) primary key); +alter table skip_wal_skip_rewrite_index alter c type varchar(20); +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +commit; +-- We disallow changing table's row type if it's used for storage +create table at_tab1 (a int, b text); +create table at_tab2 (x int, y at_tab1); +alter table at_tab1 alter column b type varchar; -- fails +ERROR: cannot alter table "at_tab1" because column "at_tab2.y" uses its row type +drop table at_tab2; +-- Use of row type in an expression is defended differently +create table at_tab2 (x int, y text, check((x,y)::at_tab1 = (1,'42')::at_tab1)); +alter table at_tab1 alter column b type varchar; -- allowed, but ... +insert into at_tab2 values(1,'42'); -- ... this will fail +ERROR: ROW() column has type text instead of type character varying +drop table at_tab1, at_tab2; +-- Check it for a partitioned table, too +create table at_tab1 (a int, b text) partition by list(a); +create table at_tab2 (x int, y at_tab1); +alter table at_tab1 alter column b type varchar; -- fails +ERROR: cannot alter table "at_tab1" because column "at_tab2.y" uses its row type +drop table at_tab1, at_tab2; +-- Alter column type that's part of a partitioned index +create table at_partitioned (a int, b text) partition by range (a); +create table at_part_1 partition of at_partitioned for values from (0) to (1000); +insert into at_partitioned values (512, '0.123'); +create table at_part_2 (b text, a int); +insert into at_part_2 values ('1.234', 1024); +create index on at_partitioned (b); +create index on at_partitioned (a); +\d at_part_1 + Table "public.at_part_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | | | +Partition of: at_partitioned FOR VALUES FROM (0) TO (1000) +Indexes: + "at_part_1_a_idx" btree (a) + "at_part_1_b_idx" btree (b) + +\d at_part_2 + Table "public.at_part_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + b | text | | | + a | integer | | | + +alter table at_partitioned attach partition at_part_2 for values from (1000) to (2000); +\d at_part_2 + Table "public.at_part_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + b | text | | | + a | integer | | | +Partition of: at_partitioned FOR VALUES FROM (1000) TO (2000) +Indexes: + "at_part_2_a_idx" btree (a) + "at_part_2_b_idx" btree (b) + +alter table at_partitioned alter column b type numeric using b::numeric; +\d at_part_1 + Table "public.at_part_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | numeric | | | +Partition of: at_partitioned FOR VALUES FROM (0) TO (1000) +Indexes: + "at_part_1_a_idx" btree (a) + "at_part_1_b_idx" btree (b) + +\d at_part_2 + Table "public.at_part_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + b | numeric | | | + a | integer | | | +Partition of: at_partitioned FOR VALUES FROM (1000) TO (2000) +Indexes: + "at_part_2_a_idx" btree (a) + "at_part_2_b_idx" btree (b) + +drop table at_partitioned; +-- Alter column type when no table rewrite is required +-- Also check that comments are preserved +create table at_partitioned(id int, name varchar(64), unique (id, name)) + partition by hash(id); +comment on constraint at_partitioned_id_name_key on at_partitioned is 'parent constraint'; +comment on index at_partitioned_id_name_key is 'parent index'; +create table at_partitioned_0 partition of at_partitioned + for values with (modulus 2, remainder 0); +comment on constraint at_partitioned_0_id_name_key on at_partitioned_0 is 'child 0 constraint'; +comment on index at_partitioned_0_id_name_key is 'child 0 index'; +create table at_partitioned_1 partition of at_partitioned + for values with (modulus 2, remainder 1); +comment on constraint at_partitioned_1_id_name_key on at_partitioned_1 is 'child 1 constraint'; +comment on index at_partitioned_1_id_name_key is 'child 1 index'; +insert into at_partitioned values(1, 'foo'); +insert into at_partitioned values(3, 'bar'); +create temp table old_oids as + select relname, oid as oldoid, relfilenode as oldfilenode + from pg_class where relname like 'at_partitioned%'; +-- GPDB: the output for these queries differ from upstream, because GPDB +-- assigns a new relfilenode for every table, it never uses the table's +-- OID as the relfilenode like Postgres does. +select relname, + c.oid = oldoid as orig_oid, + case relfilenode + when 0 then 'none' + when c.oid then 'own' + when oldfilenode then 'orig' + else 'OTHER' + end as storage, + obj_description(c.oid, 'pg_class') as desc + from pg_class c left join old_oids using (relname) + where relname like 'at_partitioned%' + order by relname; + relname | orig_oid | storage | desc +------------------------------+----------+---------+--------------- + at_partitioned | t | none | + at_partitioned_0 | t | orig | + at_partitioned_0_id_name_key | t | orig | child 0 index + at_partitioned_1 | t | orig | + at_partitioned_1_id_name_key | t | orig | child 1 index + at_partitioned_id_name_key | t | none | parent index +(6 rows) + +select conname, obj_description(oid, 'pg_constraint') as desc + from pg_constraint where conname like 'at_partitioned%' + order by conname; + conname | desc +------------------------------+-------------------- + at_partitioned_0_id_name_key | child 0 constraint + at_partitioned_1_id_name_key | child 1 constraint + at_partitioned_id_name_key | parent constraint +(3 rows) + +-- this doesn't work in GPDB, which makes the rest of the test quite pointless. +alter table at_partitioned alter column name type varchar(127); +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +-- Note: these tests currently show the wrong behavior for comments :-( +select relname, + c.oid = oldoid as orig_oid, + case relfilenode + when 0 then 'none' + when c.oid then 'own' + when oldfilenode then 'orig' + else 'OTHER' + end as storage, + obj_description(c.oid, 'pg_class') as desc + from pg_class c left join old_oids using (relname) + where relname like 'at_partitioned%' + order by relname; + relname | orig_oid | storage | desc +------------------------------+----------+---------+--------------- + at_partitioned | t | none | + at_partitioned_0 | t | orig | + at_partitioned_0_id_name_key | t | orig | child 0 index + at_partitioned_1 | t | orig | + at_partitioned_1_id_name_key | t | orig | child 1 index + at_partitioned_id_name_key | t | none | parent index +(6 rows) + +select conname, obj_description(oid, 'pg_constraint') as desc + from pg_constraint where conname like 'at_partitioned%' + order by conname; + conname | desc +------------------------------+-------------------- + at_partitioned_0_id_name_key | child 0 constraint + at_partitioned_1_id_name_key | child 1 constraint + at_partitioned_id_name_key | parent constraint +(3 rows) + +-- Don't remove this DROP, it exposes bug #15672 +drop table at_partitioned; +-- disallow recursive containment of row types +create temp table recur1 (f1 int); +alter table recur1 add column f2 recur1; -- fails +ERROR: composite type recur1 cannot be made a member of itself +alter table recur1 add column f2 recur1[]; -- fails +ERROR: composite type recur1 cannot be made a member of itself +create domain array_of_recur1 as recur1[]; +alter table recur1 add column f2 array_of_recur1; -- fails +ERROR: composite type recur1 cannot be made a member of itself +create temp table recur2 (f1 int, f2 recur1); +alter table recur1 add column f2 recur2; -- fails +ERROR: composite type recur1 cannot be made a member of itself +alter table recur1 add column f2 int; +alter table recur1 alter column f2 type recur2; -- fails +ERROR: composite type recur1 cannot be made a member of itself +-- SET STORAGE may need to add a TOAST table +create table test_storage (a text); +alter table test_storage alter a set storage plain; +alter table test_storage add b int default 0; -- rewrite table to remove its TOAST table +alter table test_storage alter a set storage extended; -- re-add TOAST table +select reltoastrelid <> 0 as has_toast_table +from pg_class +where oid = 'test_storage'::regclass; + has_toast_table +----------------- + t +(1 row) + +-- test that SET STORAGE propagates to index correctly +create index test_storage_idx on test_storage (b, a); +alter table test_storage alter column a set storage external; +\d+ test_storage + Table "public.test_storage" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | external | | + b | integer | | | 0 | plain | | +Indexes: + "test_storage_idx" btree (b, a) + +\d+ test_storage_idx + Index "public.test_storage_idx" + Column | Type | Key? | Definition | Storage | Stats target +--------+---------+------+------------+----------+-------------- + b | integer | yes | b | plain | + a | text | yes | a | external | +btree, for table "public.test_storage" + +-- ALTER COLUMN TYPE with a check constraint and a child table (bug #13779) +CREATE TABLE test_inh_check (a float check (a > 10.2), b float); +CREATE TABLE test_inh_check_child() INHERITS(test_inh_check); +\d test_inh_check + Table "public.test_inh_check" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+--------- + a | double precision | | | + b | double precision | | | +Check constraints: + "test_inh_check_a_check" CHECK (a > 10.2::double precision) +Number of child tables: 1 (Use \d+ to list them.) + +\d test_inh_check_child + Table "public.test_inh_check_child" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+--------- + a | double precision | | | + b | double precision | | | +Check constraints: + "test_inh_check_a_check" CHECK (a > 10.2::double precision) +Inherits: test_inh_check + +select relname, conname, coninhcount, conislocal, connoinherit + from pg_constraint c, pg_class r + where relname like 'test_inh_check%' and c.conrelid = r.oid + order by 1, 2; + relname | conname | coninhcount | conislocal | connoinherit +----------------------+------------------------+-------------+------------+-------------- + test_inh_check | test_inh_check_a_check | 0 | t | f + test_inh_check_child | test_inh_check_a_check | 1 | f | f +(2 rows) + +ALTER TABLE test_inh_check ALTER COLUMN a TYPE numeric; +\d test_inh_check + Table "public.test_inh_check" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+--------- + a | numeric | | | + b | double precision | | | +Check constraints: + "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) +Number of child tables: 1 (Use \d+ to list them.) + +\d test_inh_check_child + Table "public.test_inh_check_child" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+--------- + a | numeric | | | + b | double precision | | | +Check constraints: + "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) +Inherits: test_inh_check + +select relname, conname, coninhcount, conislocal, connoinherit + from pg_constraint c, pg_class r + where relname like 'test_inh_check%' and c.conrelid = r.oid + order by 1, 2; + relname | conname | coninhcount | conislocal | connoinherit +----------------------+------------------------+-------------+------------+-------------- + test_inh_check | test_inh_check_a_check | 0 | t | f + test_inh_check_child | test_inh_check_a_check | 1 | f | f +(2 rows) + +-- also try noinherit, local, and local+inherited cases +ALTER TABLE test_inh_check ADD CONSTRAINT bnoinherit CHECK (b > 100) NO INHERIT; +ALTER TABLE test_inh_check_child ADD CONSTRAINT blocal CHECK (b < 1000); +ALTER TABLE test_inh_check_child ADD CONSTRAINT bmerged CHECK (b > 1); +ALTER TABLE test_inh_check ADD CONSTRAINT bmerged CHECK (b > 1); +NOTICE: merging constraint "bmerged" with inherited definition +\d test_inh_check + Table "public.test_inh_check" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+--------- + a | numeric | | | + b | double precision | | | +Check constraints: + "bmerged" CHECK (b > 1::double precision) + "bnoinherit" CHECK (b > 100::double precision) NO INHERIT + "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) +Number of child tables: 1 (Use \d+ to list them.) + +\d test_inh_check_child + Table "public.test_inh_check_child" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+--------- + a | numeric | | | + b | double precision | | | +Check constraints: + "blocal" CHECK (b < 1000::double precision) + "bmerged" CHECK (b > 1::double precision) + "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) +Inherits: test_inh_check + +select relname, conname, coninhcount, conislocal, connoinherit + from pg_constraint c, pg_class r + where relname like 'test_inh_check%' and c.conrelid = r.oid + order by 1, 2; + relname | conname | coninhcount | conislocal | connoinherit +----------------------+------------------------+-------------+------------+-------------- + test_inh_check | bmerged | 0 | t | f + test_inh_check | bnoinherit | 0 | t | t + test_inh_check | test_inh_check_a_check | 0 | t | f + test_inh_check_child | blocal | 0 | t | f + test_inh_check_child | bmerged | 1 | t | f + test_inh_check_child | test_inh_check_a_check | 1 | f | f +(6 rows) + +ALTER TABLE test_inh_check ALTER COLUMN b TYPE numeric; +NOTICE: merging constraint "bmerged" with inherited definition +\d test_inh_check + Table "public.test_inh_check" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | numeric | | | + b | numeric | | | +Check constraints: + "bmerged" CHECK (b::double precision > 1::double precision) + "bnoinherit" CHECK (b::double precision > 100::double precision) NO INHERIT + "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) +Number of child tables: 1 (Use \d+ to list them.) + +\d test_inh_check_child + Table "public.test_inh_check_child" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | numeric | | | + b | numeric | | | +Check constraints: + "blocal" CHECK (b::double precision < 1000::double precision) + "bmerged" CHECK (b::double precision > 1::double precision) + "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) +Inherits: test_inh_check + +select relname, conname, coninhcount, conislocal, connoinherit + from pg_constraint c, pg_class r + where relname like 'test_inh_check%' and c.conrelid = r.oid + order by 1, 2; + relname | conname | coninhcount | conislocal | connoinherit +----------------------+------------------------+-------------+------------+-------------- + test_inh_check | bmerged | 0 | t | f + test_inh_check | bnoinherit | 0 | t | t + test_inh_check | test_inh_check_a_check | 0 | t | f + test_inh_check_child | blocal | 0 | t | f + test_inh_check_child | bmerged | 1 | t | f + test_inh_check_child | test_inh_check_a_check | 1 | f | f +(6 rows) + +-- ALTER COLUMN TYPE with different schema in children +-- Bug at https://postgr.es/m/20170102225618.GA10071@telsasoft.com +CREATE TABLE test_type_diff (f1 int); +CREATE TABLE test_type_diff_c (extra smallint) INHERITS (test_type_diff); +ALTER TABLE test_type_diff ADD COLUMN f2 int; +INSERT INTO test_type_diff_c VALUES (1, 2, 3); +ALTER TABLE test_type_diff ALTER COLUMN f2 TYPE bigint USING f2::bigint; +CREATE TABLE test_type_diff2 (int_two int2, int_four int4, int_eight int8); +CREATE TABLE test_type_diff2_c1 (int_four int4, int_eight int8, int_two int2); +CREATE TABLE test_type_diff2_c2 (int_eight int8, int_two int2, int_four int4); +CREATE TABLE test_type_diff2_c3 (int_two int2, int_four int4, int_eight int8); +ALTER TABLE test_type_diff2_c1 INHERIT test_type_diff2; +ALTER TABLE test_type_diff2_c2 INHERIT test_type_diff2; +ALTER TABLE test_type_diff2_c3 INHERIT test_type_diff2; +INSERT INTO test_type_diff2_c1 VALUES (1, 2, 3); +INSERT INTO test_type_diff2_c2 VALUES (4, 5, 6); +INSERT INTO test_type_diff2_c3 VALUES (7, 8, 9); +ALTER TABLE test_type_diff2 ALTER COLUMN int_four TYPE int8 USING int_four::int8; +-- whole-row references are disallowed +ALTER TABLE test_type_diff2 ALTER COLUMN int_four TYPE int4 USING (pg_column_size(test_type_diff2)); +ERROR: cannot convert whole-row table reference +DETAIL: USING expression contains a whole-row table reference. +-- check for rollback of ANALYZE corrupting table property flags (bug #11638) +CREATE TABLE check_fk_presence_1 (id int PRIMARY KEY, t text); +CREATE TABLE check_fk_presence_2 (id int REFERENCES check_fk_presence_1, t text); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +BEGIN; +ALTER TABLE check_fk_presence_2 DROP CONSTRAINT check_fk_presence_2_id_fkey; +ANALYZE check_fk_presence_2; +ROLLBACK; +\d check_fk_presence_2 + Table "public.check_fk_presence_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | | + t | text | | | +Foreign-key constraints: + "check_fk_presence_2_id_fkey" FOREIGN KEY (id) REFERENCES check_fk_presence_1(id) + +DROP TABLE check_fk_presence_1, check_fk_presence_2; +-- check column addition within a view (bug #14876) +create table at_base_table(id int, stuff text); +insert into at_base_table values (23, 'skidoo'); +create view at_view_1 as select * from at_base_table bt; +create view at_view_2 as select *, to_json(v1) as j from at_view_1 v1; +\d+ at_view_1 + View "public.at_view_1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + id | integer | | | | plain | + stuff | text | | | | extended | +View definition: + SELECT bt.id, + bt.stuff + FROM at_base_table bt; + +\d+ at_view_2 + View "public.at_view_2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + id | integer | | | | plain | + stuff | text | | | | extended | + j | json | | | | extended | +View definition: + SELECT v1.id, + v1.stuff, + to_json(v1.*) AS j + FROM at_view_1 v1; + +explain (verbose, costs off) select * from at_view_2; + QUERY PLAN +---------------------------------------------------------- + Seq Scan on public.at_base_table bt + Output: bt.id, bt.stuff, to_json(ROW(bt.id, bt.stuff)) + Settings: constraint_exclusion = 'partition' + Optimizer: Postgres query optimizer +(4 rows) + +select * from at_view_2; + id | stuff | j +----+--------+---------------------------- + 23 | skidoo | {"id":23,"stuff":"skidoo"} +(1 row) + +create or replace view at_view_1 as select *, 2+2 as more from at_base_table bt; +\d+ at_view_1 + View "public.at_view_1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + id | integer | | | | plain | + stuff | text | | | | extended | + more | integer | | | | plain | +View definition: + SELECT bt.id, + bt.stuff, + 2 + 2 AS more + FROM at_base_table bt; + +\d+ at_view_2 + View "public.at_view_2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + id | integer | | | | plain | + stuff | text | | | | extended | + j | json | | | | extended | +View definition: + SELECT v1.id, + v1.stuff, + to_json(v1.*) AS j + FROM at_view_1 v1; + +explain (verbose, costs off) select * from at_view_2; + QUERY PLAN +---------------------------------------------------------------- + Seq Scan on public.at_base_table bt + Output: bt.id, bt.stuff, to_json(ROW(bt.id, bt.stuff, NULL)) + Settings: constraint_exclusion = 'partition' + Optimizer: Postgres query optimizer +(4 rows) + +select * from at_view_2; + id | stuff | j +----+--------+---------------------------------------- + 23 | skidoo | {"id":23,"stuff":"skidoo","more":null} +(1 row) + +drop view at_view_2; +drop view at_view_1; +drop table at_base_table; +-- check adding a column not iself requiring a rewrite, together with +-- a column requiring a default (bug #16038) +-- ensure that rewrites aren't silently optimized away, removing the +-- value of the test +CREATE FUNCTION check_ddl_rewrite(p_tablename regclass, p_ddl text) +RETURNS boolean +LANGUAGE plpgsql AS $$ +DECLARE + v_relfilenode oid; +BEGIN + v_relfilenode := relfilenode FROM pg_class WHERE oid = p_tablename; + + EXECUTE p_ddl; + + RETURN v_relfilenode <> (SELECT relfilenode FROM pg_class WHERE oid = p_tablename); +END; +$$; +CREATE TABLE rewrite_test(col text); +INSERT INTO rewrite_test VALUES ('something'); +INSERT INTO rewrite_test VALUES (NULL); +-- empty[12] don't need rewrite, but notempty[12]_rewrite will force one +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN empty1 text, + ADD COLUMN notempty1_rewrite serial; +$$); + check_ddl_rewrite +------------------- + t +(1 row) + +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN notempty2_rewrite serial, + ADD COLUMN empty2 text; +$$); + check_ddl_rewrite +------------------- + t +(1 row) + +-- also check that fast defaults cause no problem, first without rewrite +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN empty3 text, + ADD COLUMN notempty3_norewrite int default 42; +$$); + check_ddl_rewrite +------------------- + f +(1 row) + +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN notempty4_norewrite int default 42, + ADD COLUMN empty4 text; +$$); + check_ddl_rewrite +------------------- + f +(1 row) + +-- then with rewrite +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN empty5 text, + ADD COLUMN notempty5_norewrite int default 42, + ADD COLUMN notempty5_rewrite serial; +$$); + check_ddl_rewrite +------------------- + t +(1 row) + +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN notempty6_rewrite serial, + ADD COLUMN empty6 text, + ADD COLUMN notempty6_norewrite int default 42; +$$); + check_ddl_rewrite +------------------- + t +(1 row) + +-- cleanup +DROP FUNCTION check_ddl_rewrite(regclass, text); +DROP TABLE rewrite_test; +-- +-- lock levels +-- +drop type lockmodes; +ERROR: type "lockmodes" does not exist +create type lockmodes as enum ( + 'SIReadLock' +,'AccessShareLock' +,'RowShareLock' +,'RowExclusiveLock' +,'ShareUpdateExclusiveLock' +,'ShareLock' +,'ShareRowExclusiveLock' +,'ExclusiveLock' +,'AccessExclusiveLock' +); +drop view my_locks; +ERROR: view "my_locks" does not exist +create or replace view my_locks as +select case when c.relname like 'pg_toast%' then 'pg_toast' else c.relname end, max(mode::lockmodes) as max_lockmode +from pg_locks l join pg_class c on l.relation = c.oid +where virtualtransaction = ( + select virtualtransaction + from pg_locks + where transactionid = pg_current_xact_id()::xid) +and locktype = 'relation' +and relnamespace != (select oid from pg_namespace where nspname = 'pg_catalog') +and c.relname != 'my_locks' +group by c.relname; +create table alterlock (f1 int primary key, f2 text); +insert into alterlock values (1, 'foo'); +create table alterlock2 (f3 int primary key, f1 int); +insert into alterlock2 values (1, 1); +begin; alter table alterlock alter column f2 set statistics 150; +select * from my_locks order by 1; + relname | max_lockmode +-----------+-------------------------- + alterlock | ShareUpdateExclusiveLock +(1 row) + +rollback; +begin; alter table alterlock cluster on alterlock_pkey; +select * from my_locks order by 1; + relname | max_lockmode +----------------+-------------------------- + alterlock | ShareUpdateExclusiveLock + alterlock_pkey | ShareUpdateExclusiveLock +(2 rows) + +commit; +begin; alter table alterlock set without cluster; +select * from my_locks order by 1; + relname | max_lockmode +-----------+-------------------------- + alterlock | ShareUpdateExclusiveLock +(1 row) + +commit; +begin; alter table alterlock set (fillfactor = 100); +select * from my_locks order by 1; + relname | max_lockmode +-----------+-------------------------- + alterlock | ShareUpdateExclusiveLock + pg_toast | ShareUpdateExclusiveLock +(2 rows) + +commit; +begin; alter table alterlock reset (fillfactor); +select * from my_locks order by 1; + relname | max_lockmode +-----------+-------------------------- + alterlock | ShareUpdateExclusiveLock + pg_toast | ShareUpdateExclusiveLock +(2 rows) + +commit; +begin; alter table alterlock set (toast.autovacuum_enabled = off); +WARNING: autovacuum is not supported in Cloudberry +select * from my_locks order by 1; + relname | max_lockmode +-----------+-------------------------- + alterlock | ShareUpdateExclusiveLock + pg_toast | ShareUpdateExclusiveLock +(2 rows) + +commit; +begin; alter table alterlock set (autovacuum_enabled = off); +WARNING: autovacuum is not supported in Cloudberry +select * from my_locks order by 1; + relname | max_lockmode +-----------+-------------------------- + alterlock | ShareUpdateExclusiveLock + pg_toast | ShareUpdateExclusiveLock +(2 rows) + +commit; +begin; alter table alterlock alter column f2 set (n_distinct = 1); +select * from my_locks order by 1; + relname | max_lockmode +-----------+-------------------------- + alterlock | ShareUpdateExclusiveLock +(1 row) + +rollback; +-- test that mixing options with different lock levels works as expected +begin; alter table alterlock set (autovacuum_enabled = off, fillfactor = 80); +WARNING: autovacuum is not supported in Cloudberry +select * from my_locks order by 1; + relname | max_lockmode +-----------+-------------------------- + alterlock | ShareUpdateExclusiveLock + pg_toast | ShareUpdateExclusiveLock +(2 rows) + +commit; +begin; alter table alterlock alter column f2 set storage extended; +select * from my_locks order by 1; + relname | max_lockmode +-----------+--------------------- + alterlock | AccessExclusiveLock +(1 row) + +rollback; +begin; alter table alterlock alter column f2 set default 'x'; +select * from my_locks order by 1; + relname | max_lockmode +-----------+--------------------- + alterlock | AccessExclusiveLock +(1 row) + +rollback; +begin; +create trigger ttdummy + before delete or update on alterlock + for each row + execute procedure + ttdummy (1, 1); +select * from my_locks order by 1; + relname | max_lockmode +-----------+----------------------- + alterlock | ShareRowExclusiveLock +(1 row) + +rollback; +begin; +select * from my_locks order by 1; + relname | max_lockmode +---------+-------------- +(0 rows) + +alter table alterlock2 add foreign key (f1) references alterlock (f1); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +select * from my_locks order by 1; + relname | max_lockmode +------------+----------------------- + alterlock | ShareRowExclusiveLock + alterlock2 | ShareRowExclusiveLock +(2 rows) + +rollback; +begin; +alter table alterlock2 +add constraint alterlock2nv foreign key (f1) references alterlock (f1) NOT VALID; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +select * from my_locks order by 1; + relname | max_lockmode +------------+----------------------- + alterlock | ShareRowExclusiveLock + alterlock2 | ShareRowExclusiveLock +(2 rows) + +commit; +begin; +alter table alterlock2 validate constraint alterlock2nv; +select * from my_locks order by 1; + relname | max_lockmode +------------+-------------------------- + alterlock2 | ShareUpdateExclusiveLock +(1 row) + +rollback; +create or replace view my_locks as +select case when c.relname like 'pg_toast%' then 'pg_toast' else c.relname end, max(mode::lockmodes) as max_lockmode +from pg_locks l join pg_class c on l.relation = c.oid +where virtualtransaction = ( + select virtualtransaction + from pg_locks + where transactionid = pg_current_xact_id()::xid) +and locktype = 'relation' +and relnamespace != (select oid from pg_namespace where nspname = 'pg_catalog') +and c.relname = 'my_locks' +group by c.relname; +-- raise exception +alter table my_locks set (autovacuum_enabled = false); +WARNING: autovacuum is not supported in Cloudberry +ERROR: unrecognized parameter "autovacuum_enabled" +alter view my_locks set (autovacuum_enabled = false); +WARNING: autovacuum is not supported in Cloudberry +ERROR: unrecognized parameter "autovacuum_enabled" +alter table my_locks reset (autovacuum_enabled); +WARNING: autovacuum is not supported in Cloudberry +alter view my_locks reset (autovacuum_enabled); +WARNING: autovacuum is not supported in Cloudberry +begin; +alter view my_locks set (security_barrier=off); +select * from my_locks order by 1; + relname | max_lockmode +----------+--------------------- + my_locks | AccessExclusiveLock +(1 row) + +alter view my_locks reset (security_barrier); +rollback; +-- this test intentionally applies the ALTER TABLE command against a view, but +-- uses a view option so we expect this to succeed. This form of SQL is +-- accepted for historical reasons, as shown in the docs for ALTER VIEW +begin; +alter table my_locks set (security_barrier=off); +select * from my_locks order by 1; + relname | max_lockmode +----------+--------------------- + my_locks | AccessExclusiveLock +(1 row) + +alter table my_locks reset (security_barrier); +rollback; +-- cleanup +drop table alterlock2; +drop table alterlock; +drop view my_locks; +drop type lockmodes; +-- +-- alter function +-- +create function test_strict(text) returns text as + 'select coalesce($1, ''got passed a null'');' + language sql CONTAINS SQL returns null on null input; +select test_strict(NULL); + test_strict +------------- + +(1 row) + +alter function test_strict(text) called on null input; +select test_strict(NULL); + test_strict +------------------- + got passed a null +(1 row) + +create function non_strict(text) returns text as + 'select coalesce($1, ''got passed a null'');' + language sql CONTAINS SQL called on null input; +select non_strict(NULL); + non_strict +------------------- + got passed a null +(1 row) + +alter function non_strict(text) returns null on null input; +select non_strict(NULL); + non_strict +------------ + +(1 row) + +-- +-- alter object set schema +-- +create schema alter1; +create schema alter2; +create table alter1.t1(f1 serial primary key, f2 int check (f2 > 0)); +create view alter1.v1 as select * from alter1.t1; +create function alter1.plus1(int) returns int as 'select $1+1' language sql CONTAINS SQL; +create domain alter1.posint integer check (value > 0); +create type alter1.ctype as (f1 int, f2 text); +create function alter1.same(alter1.ctype, alter1.ctype) returns boolean language sql +as 'select $1.f1 is not distinct from $2.f1 and $1.f2 is not distinct from $2.f2'; +create operator alter1.=(procedure = alter1.same, leftarg = alter1.ctype, rightarg = alter1.ctype); +create operator class alter1.ctype_hash_ops default for type alter1.ctype using hash as + operator 1 alter1.=(alter1.ctype, alter1.ctype); +create conversion alter1.latin1_to_utf8 for 'latin1' to 'utf8' from iso8859_1_to_utf8; +create text search parser alter1.prs(start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +create text search configuration alter1.cfg(parser = alter1.prs); +create text search template alter1.tmpl(init = dsimple_init, lexize = dsimple_lexize); +create text search dictionary alter1.dict(template = alter1.tmpl); +insert into alter1.t1(f2) values(11); +insert into alter1.t1(f2) values(12); +alter table alter1.t1 set schema alter1; -- no-op, same schema +alter table alter1.t1 set schema alter2; +alter table alter1.v1 set schema alter2; +alter function alter1.plus1(int) set schema alter2; +alter domain alter1.posint set schema alter2; +alter operator class alter1.ctype_hash_ops using hash set schema alter2; +alter operator family alter1.ctype_hash_ops using hash set schema alter2; +alter operator alter1.=(alter1.ctype, alter1.ctype) set schema alter2; +alter function alter1.same(alter1.ctype, alter1.ctype) set schema alter2; +alter type alter1.ctype set schema alter1; -- no-op, same schema +alter type alter1.ctype set schema alter2; +alter conversion alter1.latin1_to_utf8 set schema alter2; +alter text search parser alter1.prs set schema alter2; +alter text search configuration alter1.cfg set schema alter2; +alter text search template alter1.tmpl set schema alter2; +alter text search dictionary alter1.dict set schema alter2; +-- this should succeed because nothing is left in alter1 +drop schema alter1; +insert into alter2.t1(f2) values(13); +insert into alter2.t1(f2) values(14); +select * from alter2.t1; + f1 | f2 +----+---- + 1 | 11 + 2 | 12 + 3 | 13 + 4 | 14 +(4 rows) + +select * from alter2.v1; + f1 | f2 +----+---- + 1 | 11 + 2 | 12 + 3 | 13 + 4 | 14 +(4 rows) + +select alter2.plus1(41); + plus1 +------- + 42 +(1 row) + +-- clean up +drop schema alter2 cascade; +NOTICE: drop cascades to 13 other objects +DETAIL: drop cascades to table alter2.t1 +drop cascades to view alter2.v1 +drop cascades to function alter2.plus1(integer) +drop cascades to type alter2.posint +drop cascades to type alter2.ctype +drop cascades to function alter2.same(alter2.ctype,alter2.ctype) +drop cascades to operator alter2.=(alter2.ctype,alter2.ctype) +drop cascades to operator family alter2.ctype_hash_ops for access method hash +drop cascades to conversion alter2.latin1_to_utf8 +drop cascades to text search parser alter2.prs +drop cascades to text search configuration alter2.cfg +drop cascades to text search template alter2.tmpl +drop cascades to text search dictionary alter2.dict +-- +-- composite types +-- +CREATE TYPE test_type AS (a int); +\d test_type + Composite type "public.test_type" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + +ALTER TYPE nosuchtype ADD ATTRIBUTE b text; -- fails +ERROR: relation "nosuchtype" does not exist +ALTER TYPE test_type ADD ATTRIBUTE b text; +\d test_type + Composite type "public.test_type" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | | | + +ALTER TYPE test_type ADD ATTRIBUTE b text; -- fails +ERROR: column "b" of relation "test_type" already exists +ALTER TYPE test_type ALTER ATTRIBUTE b SET DATA TYPE varchar; +\d test_type + Composite type "public.test_type" + Column | Type | Collation | Nullable | Default +--------+-------------------+-----------+----------+--------- + a | integer | | | + b | character varying | | | + +ALTER TYPE test_type ALTER ATTRIBUTE b SET DATA TYPE integer; +\d test_type + Composite type "public.test_type" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + +ALTER TYPE test_type DROP ATTRIBUTE b; +\d test_type + Composite type "public.test_type" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + +ALTER TYPE test_type DROP ATTRIBUTE c; -- fails +ERROR: column "c" of relation "test_type" does not exist +ALTER TYPE test_type DROP ATTRIBUTE IF EXISTS c; +NOTICE: column "c" of relation "test_type" does not exist, skipping +ALTER TYPE test_type DROP ATTRIBUTE a, ADD ATTRIBUTE d boolean; +\d test_type + Composite type "public.test_type" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + d | boolean | | | + +ALTER TYPE test_type RENAME ATTRIBUTE a TO aa; +ERROR: column "a" does not exist +ALTER TYPE test_type RENAME ATTRIBUTE d TO dd; +\d test_type + Composite type "public.test_type" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + dd | boolean | | | + +DROP TYPE test_type; +CREATE TYPE test_type1 AS (a int, b text); +CREATE TABLE test_tbl1 (x int, y test_type1); +ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails +ERROR: cannot alter type "test_type1" because column "test_tbl1.y" uses it +CREATE TYPE test_type2 AS (a int, b text); +CREATE TABLE test_tbl2 OF test_type2; +CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2); +\d test_type2 + Composite type "public.test_type2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | | | + +\d test_tbl2 + Table "public.test_tbl2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | | | +Number of child tables: 1 (Use \d+ to list them.) +Typed table of type: test_type2 + +ALTER TYPE test_type2 ADD ATTRIBUTE c text; -- fails +ERROR: cannot alter type "test_type2" because it is the type of a typed table +HINT: Use ALTER ... CASCADE to alter the typed tables too. +ALTER TYPE test_type2 ADD ATTRIBUTE c text CASCADE; +\d test_type2 + Composite type "public.test_type2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | | | + c | text | | | + +\d test_tbl2 + Table "public.test_tbl2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | | | + c | text | | | +Number of child tables: 1 (Use \d+ to list them.) +Typed table of type: test_type2 + +ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar; -- fails +ERROR: cannot alter type "test_type2" because it is the type of a typed table +HINT: Use ALTER ... CASCADE to alter the typed tables too. +ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar CASCADE; +\d test_type2 + Composite type "public.test_type2" + Column | Type | Collation | Nullable | Default +--------+-------------------+-----------+----------+--------- + a | integer | | | + b | character varying | | | + c | text | | | + +\d test_tbl2 + Table "public.test_tbl2" + Column | Type | Collation | Nullable | Default +--------+-------------------+-----------+----------+--------- + a | integer | | | + b | character varying | | | + c | text | | | +Number of child tables: 1 (Use \d+ to list them.) +Typed table of type: test_type2 + +ALTER TYPE test_type2 DROP ATTRIBUTE b; -- fails +ERROR: cannot alter type "test_type2" because it is the type of a typed table +HINT: Use ALTER ... CASCADE to alter the typed tables too. +ALTER TYPE test_type2 DROP ATTRIBUTE b CASCADE; +\d test_type2 + Composite type "public.test_type2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + c | text | | | + +\d test_tbl2 + Table "public.test_tbl2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + c | text | | | +Number of child tables: 1 (Use \d+ to list them.) +Typed table of type: test_type2 + +ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa; -- fails +ERROR: cannot alter type "test_type2" because it is the type of a typed table +HINT: Use ALTER ... CASCADE to alter the typed tables too. +ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa CASCADE; +\d test_type2 + Composite type "public.test_type2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + aa | integer | | | + c | text | | | + +\d test_tbl2 + Table "public.test_tbl2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + aa | integer | | | + c | text | | | +Number of child tables: 1 (Use \d+ to list them.) +Typed table of type: test_type2 + +\d test_tbl2_subclass + Table "public.test_tbl2_subclass" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + aa | integer | | | + c | text | | | +Inherits: test_tbl2 + +DROP TABLE test_tbl2_subclass; +CREATE TYPE test_typex AS (a int, b text); +CREATE TABLE test_tblx (x int, y test_typex check ((y).a > 0)); +ALTER TYPE test_typex DROP ATTRIBUTE a; -- fails +ERROR: cannot drop column a of composite type test_typex because other objects depend on it +DETAIL: constraint test_tblx_y_check on table test_tblx depends on column a of composite type test_typex +HINT: Use DROP ... CASCADE to drop the dependent objects too. +ALTER TYPE test_typex DROP ATTRIBUTE a CASCADE; +NOTICE: drop cascades to constraint test_tblx_y_check on table test_tblx +\d test_tblx + Table "public.test_tblx" + Column | Type | Collation | Nullable | Default +--------+------------+-----------+----------+--------- + x | integer | | | + y | test_typex | | | + +DROP TABLE test_tblx; +DROP TYPE test_typex; +-- This test isn't that interesting on its own, but the purpose is to leave +-- behind a table to test pg_upgrade with. The table has a composite type +-- column in it, and the composite type has a dropped attribute. +CREATE TYPE test_type3 AS (a int); +CREATE TABLE test_tbl3 (c) AS SELECT '(1)'::test_type3; +ALTER TYPE test_type3 DROP ATTRIBUTE a, ADD ATTRIBUTE b int; +CREATE TYPE test_type_empty AS (); +DROP TYPE test_type_empty; +-- +-- typed tables: OF / NOT OF +-- +CREATE TYPE tt_t0 AS (z inet, x int, y numeric(8,2)); +ALTER TYPE tt_t0 DROP ATTRIBUTE z; +CREATE TABLE tt0 (x int NOT NULL, y numeric(8,2)); -- OK +CREATE TABLE tt1 (x int, y bigint); -- wrong base type +CREATE TABLE tt2 (x int, y numeric(9,2)); -- wrong typmod +CREATE TABLE tt3 (y numeric(8,2), x int); -- wrong column order +CREATE TABLE tt4 (x int); -- too few columns +CREATE TABLE tt5 (x int, y numeric(8,2), z int); -- too few columns +CREATE TABLE tt6 () INHERITS (tt0); -- can't have a parent +CREATE TABLE tt7 (x int, q text, y numeric(8,2)); +ALTER TABLE tt7 DROP q; -- OK +ALTER TABLE tt0 OF tt_t0; +ALTER TABLE tt1 OF tt_t0; +ERROR: table "tt1" has different type for column "y" +ALTER TABLE tt2 OF tt_t0; +ERROR: table "tt2" has different type for column "y" +ALTER TABLE tt3 OF tt_t0; +ERROR: table has column "y" where type requires "x" +ALTER TABLE tt4 OF tt_t0; +ERROR: table is missing column "y" +ALTER TABLE tt5 OF tt_t0; +ERROR: table has extra column "z" +ALTER TABLE tt6 OF tt_t0; +ERROR: typed tables cannot inherit +ALTER TABLE tt7 OF tt_t0; +CREATE TYPE tt_t1 AS (x int, y numeric(8,2)); +ALTER TABLE tt7 OF tt_t1; -- reassign an already-typed table +ALTER TABLE tt7 NOT OF; +\d tt7 + Table "public.tt7" + Column | Type | Collation | Nullable | Default +--------+--------------+-----------+----------+--------- + x | integer | | | + y | numeric(8,2) | | | + +-- make sure we can drop a constraint on the parent but it remains on the child +CREATE TABLE test_drop_constr_parent (c text CHECK (c IS NOT NULL)); +CREATE TABLE test_drop_constr_child () INHERITS (test_drop_constr_parent); +ALTER TABLE ONLY test_drop_constr_parent DROP CONSTRAINT "test_drop_constr_parent_c_check"; +-- should fail +INSERT INTO test_drop_constr_child (c) VALUES (NULL); +ERROR: new row for relation "test_drop_constr_child" violates check constraint "test_drop_constr_parent_c_check" +DETAIL: Failing row contains (null). +DROP TABLE test_drop_constr_parent CASCADE; +NOTICE: drop cascades to table test_drop_constr_child +-- +-- IF EXISTS test +-- +ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 ADD CONSTRAINT xxx PRIMARY KEY(f); +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 ADD CHECK (f BETWEEN 0 AND 10); +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 ALTER COLUMN f SET DEFAULT 0; +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 RENAME COLUMN f TO f1; +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 SET SCHEMA alter2; +NOTICE: relation "tt8" does not exist, skipping +CREATE TABLE tt8(a int); +CREATE SCHEMA alter2; +ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; +ALTER TABLE IF EXISTS tt8 ADD CONSTRAINT xxx PRIMARY KEY(f); +ALTER TABLE IF EXISTS tt8 ADD CHECK (f BETWEEN 0 AND 10); +ALTER TABLE IF EXISTS tt8 ALTER COLUMN f SET DEFAULT 0; +ALTER TABLE IF EXISTS tt8 RENAME COLUMN f TO f1; +ALTER TABLE IF EXISTS tt8 SET SCHEMA alter2; +\d alter2.tt8 + Table "alter2.tt8" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + f1 | integer | | not null | 0 +Indexes: + "xxx" PRIMARY KEY, btree (f1) +Check constraints: + "tt8_f_check" CHECK (f1 >= 0 AND f1 <= 10) + +DROP TABLE alter2.tt8; +DROP SCHEMA alter2; +-- +-- Check conflicts between index and CHECK constraint names +-- +CREATE TABLE tt9(c integer); +ALTER TABLE tt9 ADD CHECK(c > 1); +ALTER TABLE tt9 ADD CHECK(c > 2); -- picks nonconflicting name +ALTER TABLE tt9 ADD CONSTRAINT foo CHECK(c > 3); +ALTER TABLE tt9 ADD CONSTRAINT foo CHECK(c > 4); -- fail, dup name +ERROR: constraint "foo" for relation "tt9" already exists +ALTER TABLE tt9 ADD UNIQUE(c); +ALTER TABLE tt9 ADD UNIQUE(c); -- picks nonconflicting name +ALTER TABLE tt9 ADD CONSTRAINT tt9_c_key UNIQUE(c); -- fail, dup name +ERROR: relation "tt9_c_key" already exists +ALTER TABLE tt9 ADD CONSTRAINT foo UNIQUE(c); -- fail, dup name +ERROR: constraint "foo" for relation "tt9" already exists +ALTER TABLE tt9 ADD CONSTRAINT tt9_c_key CHECK(c > 5); -- fail, dup name +ERROR: constraint "tt9_c_key" for relation "tt9" already exists +ALTER TABLE tt9 ADD CONSTRAINT tt9_c_key2 CHECK(c > 6); +ALTER TABLE tt9 ADD UNIQUE(c); -- picks nonconflicting name +\d tt9 + Table "public.tt9" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c | integer | | | +Indexes: + "tt9_c_key" UNIQUE CONSTRAINT, btree (c) + "tt9_c_key1" UNIQUE CONSTRAINT, btree (c) + "tt9_c_key3" UNIQUE CONSTRAINT, btree (c) +Check constraints: + "foo" CHECK (c > 3) + "tt9_c_check" CHECK (c > 1) + "tt9_c_check1" CHECK (c > 2) + "tt9_c_key2" CHECK (c > 6) + +DROP TABLE tt9; +-- Check that comments on constraints and indexes are not lost at ALTER TABLE. +CREATE TABLE comment_test ( + id int, + positive_col int CHECK (positive_col > 0), + indexed_col int, + CONSTRAINT comment_test_pk PRIMARY KEY (id)); +CREATE INDEX comment_test_index ON comment_test(indexed_col); +COMMENT ON COLUMN comment_test.id IS 'Column ''id'' on comment_test'; +COMMENT ON INDEX comment_test_index IS 'Simple index on comment_test'; +COMMENT ON CONSTRAINT comment_test_positive_col_check ON comment_test IS 'CHECK constraint on comment_test.positive_col'; +COMMENT ON CONSTRAINT comment_test_pk ON comment_test IS 'PRIMARY KEY constraint of comment_test'; +COMMENT ON INDEX comment_test_pk IS 'Index backing the PRIMARY KEY of comment_test'; +SELECT col_description('comment_test'::regclass, 1) as comment; + comment +----------------------------- + Column 'id' on comment_test +(1 row) + +SELECT indexrelid::regclass::text as index, obj_description(indexrelid, 'pg_class') as comment FROM pg_index where indrelid = 'comment_test'::regclass ORDER BY 1, 2; + index | comment +--------------------+----------------------------------------------- + comment_test_index | Simple index on comment_test + comment_test_pk | Index backing the PRIMARY KEY of comment_test +(2 rows) + +SELECT conname as constraint, obj_description(oid, 'pg_constraint') as comment FROM pg_constraint where conrelid = 'comment_test'::regclass ORDER BY 1, 2; + constraint | comment +---------------------------------+----------------------------------------------- + comment_test_pk | PRIMARY KEY constraint of comment_test + comment_test_positive_col_check | CHECK constraint on comment_test.positive_col +(2 rows) + +-- Change the datatype of all the columns. ALTER TABLE is optimized to not +-- rebuild an index if the new data type is binary compatible with the old +-- one. Check do a dummy ALTER TABLE that doesn't change the datatype +-- first, to test that no-op codepath, and another one that does. +ALTER TABLE comment_test ALTER COLUMN indexed_col SET DATA TYPE int; +ALTER TABLE comment_test ALTER COLUMN indexed_col SET DATA TYPE text; +-- Changing the data type of an indexed column is not supported in GPDB as of fecd245 +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE int; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE text; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +ALTER TABLE comment_test DROP CONSTRAINT comment_test_pk; +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE text; +ALTER TABLE comment_test ADD CONSTRAINT comment_test_pk PRIMARY KEY (id); +ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE int; +ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE bigint; +-- Check that the comments are intact. +SELECT col_description('comment_test'::regclass, 1) as comment; + comment +----------------------------- + Column 'id' on comment_test +(1 row) + +SELECT indexrelid::regclass::text as index, obj_description(indexrelid, 'pg_class') as comment FROM pg_index where indrelid = 'comment_test'::regclass ORDER BY 1, 2; + index | comment +--------------------+------------------------------ + comment_test_index | Simple index on comment_test + comment_test_pk | +(2 rows) + +SELECT conname as constraint, obj_description(oid, 'pg_constraint') as comment FROM pg_constraint where conrelid = 'comment_test'::regclass ORDER BY 1, 2; + constraint | comment +---------------------------------+----------------------------------------------- + comment_test_pk | + comment_test_positive_col_check | CHECK constraint on comment_test.positive_col +(2 rows) + +-- Check compatibility for foreign keys and comments. This is done +-- separately as rebuilding the column type of the parent leads +-- to an error and would reduce the test scope. +CREATE TABLE comment_test_child ( + id text CONSTRAINT comment_test_child_fk REFERENCES comment_test); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +CREATE INDEX comment_test_child_fk ON comment_test_child(id); +COMMENT ON COLUMN comment_test_child.id IS 'Column ''id'' on comment_test_child'; +COMMENT ON INDEX comment_test_child_fk IS 'Index backing the FOREIGN KEY of comment_test_child'; +COMMENT ON CONSTRAINT comment_test_child_fk ON comment_test_child IS 'FOREIGN KEY constraint of comment_test_child'; +-- Change column type of parent +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE text; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE int USING id::integer; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +-- Comments should be intact +SELECT col_description('comment_test_child'::regclass, 1) as comment; + comment +----------------------------------- + Column 'id' on comment_test_child +(1 row) + +SELECT indexrelid::regclass::text as index, obj_description(indexrelid, 'pg_class') as comment FROM pg_index where indrelid = 'comment_test_child'::regclass ORDER BY 1, 2; + index | comment +-----------------------+----------------------------------------------------- + comment_test_child_fk | Index backing the FOREIGN KEY of comment_test_child +(1 row) + +SELECT conname as constraint, obj_description(oid, 'pg_constraint') as comment FROM pg_constraint where conrelid = 'comment_test_child'::regclass ORDER BY 1, 2; + constraint | comment +-----------------------+---------------------------------------------- + comment_test_child_fk | FOREIGN KEY constraint of comment_test_child +(1 row) + +-- Check that we map relation oids to filenodes and back correctly. Only +-- display bad mappings so the test output doesn't change all the time. A +-- filenode function call can return NULL for a relation dropped concurrently +-- with the call's surrounding query, so ignore a NULL mapped_oid for +-- relations that no longer exist after all calls finish. +CREATE TEMP TABLE filenode_mapping AS +SELECT + oid, mapped_oid, reltablespace, relfilenode, relname +FROM pg_class, + pg_filenode_relation(reltablespace, pg_relation_filenode(oid)) AS mapped_oid +WHERE relkind IN ('r', 'i', 'S', 't', 'm') AND mapped_oid IS DISTINCT FROM oid; +SELECT m.* FROM filenode_mapping m LEFT JOIN pg_class c ON c.oid = m.oid +WHERE c.oid IS NOT NULL OR m.mapped_oid IS NOT NULL; + oid | mapped_oid | reltablespace | relfilenode | relname +-----+------------+---------------+-------------+--------- +(0 rows) + +-- Checks on creating and manipulation of user defined relations in +-- pg_catalog. +SHOW allow_system_table_mods; + allow_system_table_mods +------------------------- + off +(1 row) + +-- disallowed because of search_path issues with pg_dump +CREATE TABLE pg_catalog.new_system_table(); +ERROR: permission denied to create "pg_catalog.new_system_table" +DETAIL: System catalog modifications are currently disallowed. +-- instead create in public first, move to catalog +CREATE TABLE new_system_table(id serial primary key, othercol text); +ALTER TABLE new_system_table SET SCHEMA pg_catalog; +ALTER TABLE new_system_table SET SCHEMA public; +ALTER TABLE new_system_table SET SCHEMA pg_catalog; +-- will be ignored -- already there: +ALTER TABLE new_system_table SET SCHEMA pg_catalog; +ALTER TABLE new_system_table RENAME TO old_system_table; +CREATE INDEX old_system_table__othercol ON old_system_table (othercol); +INSERT INTO old_system_table(othercol) VALUES ('somedata'), ('otherdata'); +UPDATE old_system_table SET id = -id; +DELETE FROM old_system_table WHERE othercol = 'somedata'; +TRUNCATE old_system_table; +ALTER TABLE old_system_table DROP CONSTRAINT new_system_table_pkey; +ALTER TABLE old_system_table DROP COLUMN othercol; +DROP TABLE old_system_table; +-- set logged +CREATE UNLOGGED TABLE unlogged1(f1 SERIAL PRIMARY KEY, f2 TEXT); +-- check relpersistence of an unlogged table +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1' +UNION ALL +SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' +UNION ALL +SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' +ORDER BY relname; + relname | relkind | relpersistence +------------------+---------+---------------- + toast index | i | u + toast table | t | u + unlogged1 | r | u + unlogged1_f1_seq | S | p + unlogged1_pkey | i | u +(5 rows) + +CREATE UNLOGGED TABLE unlogged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged1); -- foreign key +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +CREATE UNLOGGED TABLE unlogged3(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged3); -- self-referencing foreign key +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +ALTER TABLE unlogged3 SET LOGGED; -- skip self-referencing foreign key +ALTER TABLE unlogged2 SET LOGGED; -- fails because a foreign key to an unlogged table exists +ERROR: could not change table "unlogged2" to logged because it references unlogged table "unlogged1" +ALTER TABLE unlogged1 SET LOGGED; +-- check relpersistence of an unlogged table after changing to permanent +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1' +UNION ALL +SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' +UNION ALL +SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' +ORDER BY relname; + relname | relkind | relpersistence +------------------+---------+---------------- + toast index | i | p + toast table | t | p + unlogged1 | r | p + unlogged1_f1_seq | S | p + unlogged1_pkey | i | p +(5 rows) + +ALTER TABLE unlogged1 SET LOGGED; -- silently do nothing +DROP TABLE unlogged3; +DROP TABLE unlogged2; +DROP TABLE unlogged1; +-- set unlogged +CREATE TABLE logged1(f1 SERIAL PRIMARY KEY, f2 TEXT); +-- check relpersistence of a permanent table +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1' +UNION ALL +SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' +UNION ALL +SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' +ORDER BY relname; + relname | relkind | relpersistence +----------------+---------+---------------- + logged1 | r | p + logged1_f1_seq | S | p + logged1_pkey | i | p + toast index | i | p + toast table | t | p +(5 rows) + +CREATE TABLE logged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged1); -- foreign key +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +CREATE TABLE logged3(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged3); -- self-referencing foreign key +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +ALTER TABLE logged1 SET UNLOGGED; -- fails because a foreign key from a permanent table exists +ERROR: could not change table "logged1" to unlogged because it references logged table "logged2" +ALTER TABLE logged3 SET UNLOGGED; -- skip self-referencing foreign key +ALTER TABLE logged2 SET UNLOGGED; +ALTER TABLE logged1 SET UNLOGGED; +-- check relpersistence of a permanent table after changing to unlogged +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1' +UNION ALL +SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' +UNION ALL +SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' +ORDER BY relname; + relname | relkind | relpersistence +----------------+---------+---------------- + logged1 | r | u + logged1_f1_seq | S | p + logged1_pkey | i | u + toast index | i | u + toast table | t | u +(5 rows) + +ALTER TABLE logged1 SET UNLOGGED; -- silently do nothing +DROP TABLE logged3; +DROP TABLE logged2; +DROP TABLE logged1; +-- test ADD COLUMN IF NOT EXISTS +CREATE TABLE test_add_column(c1 integer); +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + +ALTER TABLE test_add_column + ADD COLUMN c2 integer; +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + +ALTER TABLE test_add_column + ADD COLUMN c2 integer; -- fail because c2 already exists +ERROR: column "c2" of relation "test_add_column" already exists +ALTER TABLE ONLY test_add_column + ADD COLUMN c2 integer; -- fail because c2 already exists +ERROR: column "c2" of relation "test_add_column" already exists +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c2 integer; -- skipping because c2 already exists +NOTICE: column "c2" of relation "test_add_column" already exists, skipping +ALTER TABLE ONLY test_add_column + ADD COLUMN IF NOT EXISTS c2 integer; -- skipping because c2 already exists +NOTICE: column "c2" of relation "test_add_column" already exists, skipping +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + +ALTER TABLE test_add_column + ADD COLUMN c2 integer, -- fail because c2 already exists + ADD COLUMN c3 integer primary key; +ERROR: column "c2" of relation "test_add_column" already exists +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c2 integer, -- skipping because c2 already exists + ADD COLUMN c3 integer primary key; +NOTICE: column "c2" of relation "test_add_column" already exists, skipping +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + c3 | integer | | not null | +Indexes: + "test_add_column_pkey" PRIMARY KEY, btree (c3) + +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c2 integer, -- skipping because c2 already exists + ADD COLUMN IF NOT EXISTS c3 integer primary key; -- skipping because c3 already exists +NOTICE: column "c2" of relation "test_add_column" already exists, skipping +NOTICE: column "c3" of relation "test_add_column" already exists, skipping +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + c3 | integer | | not null | +Indexes: + "test_add_column_pkey" PRIMARY KEY, btree (c3) + +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c2 integer, -- skipping because c2 already exists + ADD COLUMN IF NOT EXISTS c3 integer, -- skipping because c3 already exists + ADD COLUMN c4 integer REFERENCES test_add_column; +NOTICE: column "c2" of relation "test_add_column" already exists, skipping +NOTICE: column "c3" of relation "test_add_column" already exists, skipping +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + c3 | integer | | not null | + c4 | integer | | | +Indexes: + "test_add_column_pkey" PRIMARY KEY, btree (c3) +Foreign-key constraints: + "test_add_column_c4_fkey" FOREIGN KEY (c4) REFERENCES test_add_column(c3) +Referenced by: + TABLE "test_add_column" CONSTRAINT "test_add_column_c4_fkey" FOREIGN KEY (c4) REFERENCES test_add_column(c3) + +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c4 integer REFERENCES test_add_column; +NOTICE: column "c4" of relation "test_add_column" already exists, skipping +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + c3 | integer | | not null | + c4 | integer | | | +Indexes: + "test_add_column_pkey" PRIMARY KEY, btree (c3) +Foreign-key constraints: + "test_add_column_c4_fkey" FOREIGN KEY (c4) REFERENCES test_add_column(c3) +Referenced by: + TABLE "test_add_column" CONSTRAINT "test_add_column_c4_fkey" FOREIGN KEY (c4) REFERENCES test_add_column(c3) + +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c5 SERIAL CHECK (c5 > 8); +\d test_add_column + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------------------------------------------- + c1 | integer | | | + c2 | integer | | | + c3 | integer | | not null | + c4 | integer | | | + c5 | integer | | not null | nextval('test_add_column_c5_seq'::regclass) +Indexes: + "test_add_column_pkey" PRIMARY KEY, btree (c3) +Check constraints: + "test_add_column_c5_check" CHECK (c5 > 8) +Foreign-key constraints: + "test_add_column_c4_fkey" FOREIGN KEY (c4) REFERENCES test_add_column(c3) +Referenced by: + TABLE "test_add_column" CONSTRAINT "test_add_column_c4_fkey" FOREIGN KEY (c4) REFERENCES test_add_column(c3) + +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c5 SERIAL CHECK (c5 > 10); +NOTICE: column "c5" of relation "test_add_column" already exists, skipping +\d test_add_column* + Table "public.test_add_column" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------------------------------------------- + c1 | integer | | | + c2 | integer | | | + c3 | integer | | not null | + c4 | integer | | | + c5 | integer | | not null | nextval('test_add_column_c5_seq'::regclass) +Indexes: + "test_add_column_pkey" PRIMARY KEY, btree (c3) +Check constraints: + "test_add_column_c5_check" CHECK (c5 > 8) +Foreign-key constraints: + "test_add_column_c4_fkey" FOREIGN KEY (c4) REFERENCES test_add_column(c3) +Referenced by: + TABLE "test_add_column" CONSTRAINT "test_add_column_c4_fkey" FOREIGN KEY (c4) REFERENCES test_add_column(c3) + + Sequence "public.test_add_column_c5_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Owned by: public.test_add_column.c5 + + Index "public.test_add_column_pkey" + Column | Type | Key? | Definition +--------+---------+------+------------ + c3 | integer | yes | c3 +primary key, btree, for table "public.test_add_column" + +DROP TABLE test_add_column; +\d test_add_column* +-- assorted cases with multiple ALTER TABLE steps +CREATE TABLE ataddindex(f1 INT); +INSERT INTO ataddindex VALUES (42), (43); +CREATE UNIQUE INDEX ataddindexi0 ON ataddindex(f1); +ALTER TABLE ataddindex + ADD PRIMARY KEY USING INDEX ataddindexi0, + ALTER f1 TYPE BIGINT; +\d ataddindex + Table "public.ataddindex" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+--------- + f1 | bigint | | not null | +Indexes: + "ataddindexi0" PRIMARY KEY, btree (f1) + +DROP TABLE ataddindex; +CREATE TABLE ataddindex(f1 VARCHAR(10)); +INSERT INTO ataddindex(f1) VALUES ('foo'), ('a'); +ALTER TABLE ataddindex + ALTER f1 SET DATA TYPE TEXT, + ADD EXCLUDE ((f1 LIKE 'a') WITH =); +\d ataddindex + Table "public.ataddindex" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + f1 | text | | | +Indexes: + "ataddindex_expr_excl" EXCLUDE USING btree ((f1 ~~ 'a'::text) WITH =) + +DROP TABLE ataddindex; +CREATE TABLE ataddindex(id int, ref_id int); +ALTER TABLE ataddindex + ADD PRIMARY KEY (id), + ADD FOREIGN KEY (ref_id) REFERENCES ataddindex; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +\d ataddindex + Table "public.ataddindex" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | + ref_id | integer | | | +Indexes: + "ataddindex_pkey" PRIMARY KEY, btree (id) +Foreign-key constraints: + "ataddindex_ref_id_fkey" FOREIGN KEY (ref_id) REFERENCES ataddindex(id) +Referenced by: + TABLE "ataddindex" CONSTRAINT "ataddindex_ref_id_fkey" FOREIGN KEY (ref_id) REFERENCES ataddindex(id) + +DROP TABLE ataddindex; +CREATE TABLE ataddindex(id int, ref_id int); +ALTER TABLE ataddindex + ADD UNIQUE (id), + ADD FOREIGN KEY (ref_id) REFERENCES ataddindex (id); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +\d ataddindex + Table "public.ataddindex" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | | + ref_id | integer | | | +Indexes: + "ataddindex_id_key" UNIQUE CONSTRAINT, btree (id) +Foreign-key constraints: + "ataddindex_ref_id_fkey" FOREIGN KEY (ref_id) REFERENCES ataddindex(id) +Referenced by: + TABLE "ataddindex" CONSTRAINT "ataddindex_ref_id_fkey" FOREIGN KEY (ref_id) REFERENCES ataddindex(id) + +DROP TABLE ataddindex; +-- unsupported constraint types for partitioned tables +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (a, (a+b+1)); +ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); +ERROR: exclusion constraints are not supported on partitioned tables +LINE 1: ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); + ^ +-- cannot drop column that is part of the partition key +ALTER TABLE partitioned DROP COLUMN a; +ERROR: cannot drop column "a" because it is part of the partition key of relation "partitioned" +ALTER TABLE partitioned ALTER COLUMN a TYPE char(5); +ERROR: cannot alter column "a" because it is part of the partition key of relation "partitioned" +ALTER TABLE partitioned DROP COLUMN b; +ERROR: cannot drop column "b" because it is part of the partition key of relation "partitioned" +ALTER TABLE partitioned ALTER COLUMN b TYPE char(5); +ERROR: cannot alter column "b" because it is part of the partition key of relation "partitioned" +-- partitioned table cannot participate in regular inheritance +CREATE TABLE nonpartitioned ( + a int, + b int +); +ALTER TABLE partitioned INHERIT nonpartitioned; +ERROR: cannot change inheritance of partitioned table +ALTER TABLE nonpartitioned INHERIT partitioned; +ERROR: cannot inherit from partitioned table "partitioned" +-- cannot add NO INHERIT constraint to partitioned tables +ALTER TABLE partitioned ADD CONSTRAINT chk_a CHECK (a > 0) NO INHERIT; +ERROR: cannot add NO INHERIT constraint to partitioned table "partitioned" +DROP TABLE partitioned, nonpartitioned; +-- +-- ATTACH PARTITION +-- +-- check that target table is partitioned +CREATE TABLE unparted ( + a int +); +CREATE TABLE fail_part (like unparted); +ALTER TABLE unparted ATTACH PARTITION fail_part FOR VALUES IN ('a'); +ERROR: table "unparted" is not partitioned +DROP TABLE unparted, fail_part; +-- check that partition bound is compatible +CREATE TABLE list_parted ( + a int NOT NULL, + b char(2) COLLATE "C", + CONSTRAINT check_a CHECK (a > 0) +) PARTITION BY LIST (a); +CREATE TABLE fail_part (LIKE list_parted); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES FROM (1) TO (10); +ERROR: invalid bound specification for a list partition +LINE 1: ...list_parted ATTACH PARTITION fail_part FOR VALUES FROM (1) T... + ^ +DROP TABLE fail_part; +-- check that the table being attached exists +ALTER TABLE list_parted ATTACH PARTITION nonexistent FOR VALUES IN (1); +ERROR: relation "nonexistent" does not exist +-- check ownership of the source table +CREATE ROLE regress_test_me; +CREATE ROLE regress_test_not_me; +CREATE TABLE not_owned_by_me (LIKE list_parted); +ALTER TABLE not_owned_by_me OWNER TO regress_test_not_me; +SET SESSION AUTHORIZATION regress_test_me; +CREATE TABLE owned_by_me ( + a int +) PARTITION BY LIST (a); +ALTER TABLE owned_by_me ATTACH PARTITION not_owned_by_me FOR VALUES IN (1); +ERROR: must be owner of table not_owned_by_me +RESET SESSION AUTHORIZATION; +DROP TABLE owned_by_me, not_owned_by_me; +DROP ROLE regress_test_not_me; +DROP ROLE regress_test_me; +-- check that the table being attached is not part of regular inheritance +CREATE TABLE parent (LIKE list_parted); +CREATE TABLE child () INHERITS (parent); +ALTER TABLE list_parted ATTACH PARTITION child FOR VALUES IN (1); +ERROR: cannot attach inheritance child as partition +ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1); +ERROR: cannot attach inheritance parent as partition +DROP TABLE parent CASCADE; +NOTICE: drop cascades to table child +-- check any TEMP-ness +CREATE TEMP TABLE temp_parted (a int) PARTITION BY LIST (a); +CREATE TABLE perm_part (a int); +ALTER TABLE temp_parted ATTACH PARTITION perm_part FOR VALUES IN (1); +ERROR: cannot attach a permanent relation as partition of temporary relation "temp_parted" +DROP TABLE temp_parted, perm_part; +-- check that the table being attached is not a typed table +CREATE TYPE mytype AS (a int); +CREATE TABLE fail_part OF mytype; +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ERROR: cannot attach a typed table as partition +DROP TYPE mytype CASCADE; +NOTICE: drop cascades to table fail_part +-- check that the table being attached has only columns present in the parent +CREATE TABLE fail_part (like list_parted, c int); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ERROR: table "fail_part" contains column "c" not found in parent "list_parted" +DETAIL: The new partition may contain only the columns present in parent. +DROP TABLE fail_part; +-- check that the table being attached has every column of the parent +CREATE TABLE fail_part (a int NOT NULL); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ERROR: child table is missing column "b" +DROP TABLE fail_part; +-- check that columns match in type, collation and NOT NULL status +CREATE TABLE fail_part ( + b char(3), + a int NOT NULL +); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ERROR: child table "fail_part" has different type for column "b" +ALTER TABLE fail_part ALTER b TYPE char (2) COLLATE "POSIX"; +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ERROR: child table "fail_part" has different collation for column "b" +DROP TABLE fail_part; +-- check that the table being attached has all constraints of the parent +CREATE TABLE fail_part ( + b char(2) COLLATE "C", + a int NOT NULL +); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ERROR: child table is missing constraint "check_a" +-- check that the constraint matches in definition with parent's constraint +ALTER TABLE fail_part ADD CONSTRAINT check_a CHECK (a >= 0); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ERROR: child table "fail_part" has different definition for check constraint "check_a" +DROP TABLE fail_part; +-- check the attributes and constraints after partition is attached +CREATE TABLE part_1 ( + a int NOT NULL, + b char(2) COLLATE "C", + CONSTRAINT check_a CHECK (a > 0) +); +ALTER TABLE list_parted ATTACH PARTITION part_1 FOR VALUES IN (1); +-- attislocal and conislocal are always false for merged attributes and constraints respectively. +SELECT attislocal, attinhcount FROM pg_attribute WHERE attrelid = 'part_1'::regclass AND attnum > 0; + attislocal | attinhcount +------------+------------- + f | 1 + f | 1 +(2 rows) + +SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_1'::regclass AND conname = 'check_a'; + conislocal | coninhcount +------------+------------- + f | 1 +(1 row) + +-- check that the new partition won't overlap with an existing partition +CREATE TABLE fail_part (LIKE part_1 INCLUDING CONSTRAINTS); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ERROR: partition "fail_part" would overlap partition "part_1" +LINE 1: ...LE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); + ^ +DROP TABLE fail_part; +-- check that an existing table can be attached as a default partition +CREATE TABLE def_part (LIKE list_parted INCLUDING CONSTRAINTS); +ALTER TABLE list_parted ATTACH PARTITION def_part DEFAULT; +-- check attaching default partition fails if a default partition already +-- exists +CREATE TABLE fail_def_part (LIKE part_1 INCLUDING CONSTRAINTS); +ALTER TABLE list_parted ATTACH PARTITION fail_def_part DEFAULT; +ERROR: partition "fail_def_part" conflicts with existing default partition "def_part" +LINE 1: ...ER TABLE list_parted ATTACH PARTITION fail_def_part DEFAULT; + ^ +-- check validation when attaching list partitions +CREATE TABLE list_parted2 ( + a int, + b char +) PARTITION BY LIST (a); +-- check that violating rows are correctly reported +CREATE TABLE part_2 (LIKE list_parted2); +INSERT INTO part_2 VALUES (3, 'a'); +ALTER TABLE list_parted2 ATTACH PARTITION part_2 FOR VALUES IN (2); +ERROR: partition constraint of relation "part_2" is violated by some row +-- should be ok after deleting the bad row +DELETE FROM part_2; +ALTER TABLE list_parted2 ATTACH PARTITION part_2 FOR VALUES IN (2); +-- check partition cannot be attached if default has some row for its values +CREATE TABLE list_parted2_def PARTITION OF list_parted2 DEFAULT; +INSERT INTO list_parted2_def VALUES (11, 'z'); +CREATE TABLE part_3 (LIKE list_parted2); +ALTER TABLE list_parted2 ATTACH PARTITION part_3 FOR VALUES IN (11); +ERROR: updated partition constraint for default partition "list_parted2_def" would be violated by some row +-- should be ok after deleting the bad row +DELETE FROM list_parted2_def WHERE a = 11; +ALTER TABLE list_parted2 ATTACH PARTITION part_3 FOR VALUES IN (11); +-- adding constraints that describe the desired partition constraint +-- (or more restrictive) will help skip the validation scan +CREATE TABLE part_3_4 ( + LIKE list_parted2, + CONSTRAINT check_a CHECK (a IN (3)) +); +-- however, if a list partition does not accept nulls, there should be +-- an explicit NOT NULL constraint on the partition key column for the +-- validation scan to be skipped; +ALTER TABLE list_parted2 ATTACH PARTITION part_3_4 FOR VALUES IN (3, 4); +-- adding a NOT NULL constraint will cause the scan to be skipped +ALTER TABLE list_parted2 DETACH PARTITION part_3_4; +ALTER TABLE part_3_4 ALTER a SET NOT NULL; +ALTER TABLE list_parted2 ATTACH PARTITION part_3_4 FOR VALUES IN (3, 4); +-- check if default partition scan skipped +ALTER TABLE list_parted2_def ADD CONSTRAINT check_a CHECK (a IN (5, 6)); +CREATE TABLE part_55_66 PARTITION OF list_parted2 FOR VALUES IN (55, 66); +-- check validation when attaching range partitions +CREATE TABLE range_parted ( + a int, + b int +) PARTITION BY RANGE (a, b); +-- check that violating rows are correctly reported +CREATE TABLE part1 ( + a int NOT NULL CHECK (a = 1), + b int NOT NULL CHECK (b >= 1 AND b <= 10) +); +INSERT INTO part1 VALUES (1, 10); +-- Remember the TO bound is exclusive +ALTER TABLE range_parted ATTACH PARTITION part1 FOR VALUES FROM (1, 1) TO (1, 10); +ERROR: partition constraint of relation "part1" is violated by some row +-- should be ok after deleting the bad row +DELETE FROM part1; +ALTER TABLE range_parted ATTACH PARTITION part1 FOR VALUES FROM (1, 1) TO (1, 10); +-- adding constraints that describe the desired partition constraint +-- (or more restrictive) will help skip the validation scan +CREATE TABLE part2 ( + a int NOT NULL CHECK (a = 1), + b int NOT NULL CHECK (b >= 10 AND b < 18) +); +ALTER TABLE range_parted ATTACH PARTITION part2 FOR VALUES FROM (1, 10) TO (1, 20); +-- Create default partition +CREATE TABLE partr_def1 PARTITION OF range_parted DEFAULT; +-- Only one default partition is allowed, hence, following should give error +CREATE TABLE partr_def2 (LIKE part1 INCLUDING CONSTRAINTS); +ALTER TABLE range_parted ATTACH PARTITION partr_def2 DEFAULT; +ERROR: partition "partr_def2" conflicts with existing default partition "partr_def1" +LINE 1: ...LTER TABLE range_parted ATTACH PARTITION partr_def2 DEFAULT; + ^ +-- Overlapping partitions cannot be attached, hence, following should give error +INSERT INTO partr_def1 VALUES (2, 10); +CREATE TABLE part3 (LIKE range_parted); +ALTER TABLE range_parted ATTACH partition part3 FOR VALUES FROM (2, 10) TO (2, 20); +ERROR: updated partition constraint for default partition "partr_def1" would be violated by some row +-- Attaching partitions should be successful when there are no overlapping rows +ALTER TABLE range_parted ATTACH partition part3 FOR VALUES FROM (3, 10) TO (3, 20); +-- check that leaf partitions are scanned when attaching a partitioned +-- table +CREATE TABLE part_5 ( + LIKE list_parted2 +) PARTITION BY LIST (b); +-- check that violating rows are correctly reported +CREATE TABLE part_5_a PARTITION OF part_5 FOR VALUES IN ('a'); +INSERT INTO part_5_a (a, b) VALUES (6, 'a'); +ALTER TABLE list_parted2 ATTACH PARTITION part_5 FOR VALUES IN (5); +ERROR: partition constraint of relation "part_5_a" is violated by some row +-- delete the faulting row and also add a constraint to skip the scan +DELETE FROM part_5_a WHERE a NOT IN (3); +ALTER TABLE part_5 ADD CONSTRAINT check_a CHECK (a IS NOT NULL AND a = 5); +ALTER TABLE list_parted2 ATTACH PARTITION part_5 FOR VALUES IN (5); +ALTER TABLE list_parted2 DETACH PARTITION part_5; +ALTER TABLE part_5 DROP CONSTRAINT check_a; +-- scan should again be skipped, even though NOT NULL is now a column property +ALTER TABLE part_5 ADD CONSTRAINT check_a CHECK (a IN (5)), ALTER a SET NOT NULL; +ALTER TABLE list_parted2 ATTACH PARTITION part_5 FOR VALUES IN (5); +-- Check the case where attnos of the partitioning columns in the table being +-- attached differs from the parent. It should not affect the constraint- +-- checking logic that allows to skip the scan. +CREATE TABLE part_6 ( + c int, + LIKE list_parted2, + CONSTRAINT check_a CHECK (a IS NOT NULL AND a = 6) +); +ALTER TABLE part_6 DROP c; +ALTER TABLE list_parted2 ATTACH PARTITION part_6 FOR VALUES IN (6); +-- Similar to above, but the table being attached is a partitioned table +-- whose partition has still different attnos for the root partitioning +-- columns. +CREATE TABLE part_7 ( + LIKE list_parted2, + CONSTRAINT check_a CHECK (a IS NOT NULL AND a = 7) +) PARTITION BY LIST (b); +CREATE TABLE part_7_a_null ( + c int, + d int, + e int, + LIKE list_parted2, -- 'a' will have attnum = 4 + CONSTRAINT check_b CHECK (b IS NULL OR b = 'a'), + CONSTRAINT check_a CHECK (a IS NOT NULL AND a = 7) +); +ALTER TABLE part_7_a_null DROP c, DROP d, DROP e; +ALTER TABLE part_7 ATTACH PARTITION part_7_a_null FOR VALUES IN ('a', null); +ALTER TABLE list_parted2 ATTACH PARTITION part_7 FOR VALUES IN (7); +-- Same example, but check this time that the constraint correctly detects +-- violating rows +ALTER TABLE list_parted2 DETACH PARTITION part_7; +ALTER TABLE part_7 DROP CONSTRAINT check_a; -- thusly, scan won't be skipped +INSERT INTO part_7 (a, b) VALUES (8, null), (9, 'a'); +SELECT tableoid::regclass, a, b FROM part_7 order by a; + tableoid | a | b +---------------+---+--- + part_7_a_null | 8 | + part_7_a_null | 9 | a +(2 rows) + +ALTER TABLE list_parted2 ATTACH PARTITION part_7 FOR VALUES IN (7); +ERROR: partition constraint of relation "part_7_a_null" is violated by some row +-- check that leaf partitions of default partition are scanned when +-- attaching a partitioned table. +ALTER TABLE part_5 DROP CONSTRAINT check_a; +CREATE TABLE part5_def PARTITION OF part_5 DEFAULT PARTITION BY LIST(a); +CREATE TABLE part5_def_p1 PARTITION OF part5_def FOR VALUES IN (5); +INSERT INTO part5_def_p1 VALUES (5, 'y'); +CREATE TABLE part5_p1 (LIKE part_5); +ALTER TABLE part_5 ATTACH PARTITION part5_p1 FOR VALUES IN ('y'); +ERROR: updated partition constraint for default partition "part5_def_p1" would be violated by some row +-- should be ok after deleting the bad row +DELETE FROM part5_def_p1 WHERE b = 'y'; +ALTER TABLE part_5 ATTACH PARTITION part5_p1 FOR VALUES IN ('y'); +-- check that the table being attached is not already a partition +ALTER TABLE list_parted2 ATTACH PARTITION part_2 FOR VALUES IN (2); +ERROR: "part_2" is already a partition +-- check that circular inheritance is not allowed +ALTER TABLE part_5 ATTACH PARTITION list_parted2 FOR VALUES IN ('b'); +ERROR: circular inheritance not allowed +DETAIL: "part_5" is already a child of "list_parted2". +ALTER TABLE list_parted2 ATTACH PARTITION list_parted2 FOR VALUES IN (0); +ERROR: circular inheritance not allowed +DETAIL: "list_parted2" is already a child of "list_parted2". +-- If a partitioned table being created or an existing table being attached +-- as a partition does not have a constraint that would allow validation scan +-- to be skipped, but an individual partition does, then the partition's +-- validation scan is skipped. +CREATE TABLE quuux (a int, b text) PARTITION BY LIST (a); +CREATE TABLE quuux_default PARTITION OF quuux DEFAULT PARTITION BY LIST (b); +CREATE TABLE quuux_default1 PARTITION OF quuux_default ( + CONSTRAINT check_1 CHECK (a IS NOT NULL AND a = 1) +) FOR VALUES IN ('b'); +CREATE TABLE quuux1 (a int, b text); +ALTER TABLE quuux ATTACH PARTITION quuux1 FOR VALUES IN (1); -- validate! +CREATE TABLE quuux2 (a int, b text); +ALTER TABLE quuux ATTACH PARTITION quuux2 FOR VALUES IN (2); -- skip validation +DROP TABLE quuux1, quuux2; +-- should validate for quuux1, but not for quuux2 +CREATE TABLE quuux1 PARTITION OF quuux FOR VALUES IN (1); +CREATE TABLE quuux2 PARTITION OF quuux FOR VALUES IN (2); +DROP TABLE quuux; +-- check validation when attaching hash partitions +-- Use hand-rolled hash functions and operator class to get predictable result +-- on different machines. part_test_int4_ops is defined in insert.sql. +-- check that the new partition won't overlap with an existing partition +CREATE TABLE hash_parted ( + a int, + b int +) PARTITION BY HASH (a part_test_int4_ops); +CREATE TABLE hpart_1 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 4, REMAINDER 0); +CREATE TABLE fail_part (LIKE hpart_1); +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 8, REMAINDER 4); +ERROR: partition "fail_part" would overlap partition "hpart_1" +LINE 1: ...hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODU... + ^ +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 8, REMAINDER 0); +ERROR: partition "fail_part" would overlap partition "hpart_1" +LINE 1: ...hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODU... + ^ +DROP TABLE fail_part; +-- check validation when attaching hash partitions +-- check that violating rows are correctly reported +CREATE TABLE hpart_2 (LIKE hash_parted); +INSERT INTO hpart_2 VALUES (3, 0); +ALTER TABLE hash_parted ATTACH PARTITION hpart_2 FOR VALUES WITH (MODULUS 4, REMAINDER 1); +ERROR: partition constraint of relation "hpart_2" is violated by some row +-- should be ok after deleting the bad row +DELETE FROM hpart_2; +ALTER TABLE hash_parted ATTACH PARTITION hpart_2 FOR VALUES WITH (MODULUS 4, REMAINDER 1); +-- check that leaf partitions are scanned when attaching a partitioned +-- table +CREATE TABLE hpart_5 ( + LIKE hash_parted +) PARTITION BY LIST (b); +-- check that violating rows are correctly reported +CREATE TABLE hpart_5_a PARTITION OF hpart_5 FOR VALUES IN ('1', '2', '3'); +INSERT INTO hpart_5_a (a, b) VALUES (7, 1); +ALTER TABLE hash_parted ATTACH PARTITION hpart_5 FOR VALUES WITH (MODULUS 4, REMAINDER 2); +ERROR: partition constraint of relation "hpart_5_a" is violated by some row +-- should be ok after deleting the bad row +DELETE FROM hpart_5_a; +ALTER TABLE hash_parted ATTACH PARTITION hpart_5 FOR VALUES WITH (MODULUS 4, REMAINDER 2); +-- check that the table being attach is with valid modulus and remainder value +CREATE TABLE fail_part(LIKE hash_parted); +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 0, REMAINDER 1); +ERROR: modulus for hash partition must be an integer value greater than zero +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 8, REMAINDER 8); +ERROR: remainder for hash partition must be less than modulus +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 3, REMAINDER 2); +ERROR: every hash partition modulus must be a factor of the next larger modulus +DETAIL: The new modulus 3 is not a factor of 4, the modulus of existing partition "hpart_1". +DROP TABLE fail_part; +-- fails with incorrect object type +CREATE VIEW at_v1 AS SELECT 1 as a; +ALTER TABLE at_v1 ATTACH PARTITION dummy default; +ERROR: "at_v1" is not a table or partitioned index +DROP VIEW at_v1; +-- +-- DETACH PARTITION +-- +-- check that the table is partitioned at all +CREATE TABLE regular_table (a int); +ALTER TABLE regular_table DETACH PARTITION any_name; +ERROR: table "regular_table" is not partitioned +DROP TABLE regular_table; +-- check that the partition being detached exists at all +ALTER TABLE list_parted2 DETACH PARTITION part_4; +ERROR: relation "part_4" does not exist +ALTER TABLE hash_parted DETACH PARTITION hpart_4; +ERROR: relation "hpart_4" does not exist +-- check that the partition being detached is actually a partition of the parent +CREATE TABLE not_a_part (a int); +ALTER TABLE list_parted2 DETACH PARTITION not_a_part; +ERROR: relation "not_a_part" is not a partition of relation "list_parted2" +ALTER TABLE list_parted2 DETACH PARTITION part_1; +ERROR: relation "part_1" is not a partition of relation "list_parted2" +ALTER TABLE hash_parted DETACH PARTITION not_a_part; +ERROR: relation "not_a_part" is not a partition of relation "hash_parted" +DROP TABLE not_a_part; +-- check that, after being detached, attinhcount/coninhcount is dropped to 0 and +-- attislocal/conislocal is set to true +ALTER TABLE list_parted2 DETACH PARTITION part_3_4; +SELECT attinhcount, attislocal FROM pg_attribute WHERE attrelid = 'part_3_4'::regclass AND attnum > 0; + attinhcount | attislocal +-------------+------------ + 0 | t + 0 | t +(2 rows) + +SELECT coninhcount, conislocal FROM pg_constraint WHERE conrelid = 'part_3_4'::regclass AND conname = 'check_a'; + coninhcount | conislocal +-------------+------------ + 0 | t +(1 row) + +DROP TABLE part_3_4; +-- check that a detached partition is not dropped on dropping a partitioned table +CREATE TABLE range_parted2 ( + a int +) PARTITION BY RANGE(a); +CREATE TABLE part_rp PARTITION OF range_parted2 FOR VALUES FROM (0) to (100); +ALTER TABLE range_parted2 DETACH PARTITION part_rp; +DROP TABLE range_parted2; +SELECT * from part_rp; + a +--- +(0 rows) + +DROP TABLE part_rp; +-- concurrent detach +CREATE TABLE range_parted2 ( + a int +) PARTITION BY RANGE(a); +CREATE TABLE part_rp PARTITION OF range_parted2 FOR VALUES FROM (0) to (100); +BEGIN; +-- doesn't work in a partition block +ALTER TABLE range_parted2 DETACH PARTITION part_rp CONCURRENTLY; +ERROR: ALTER TABLE ... DETACH CONCURRENTLY cannot run inside a transaction block +COMMIT; +CREATE TABLE part_rpd PARTITION OF range_parted2 DEFAULT; +-- doesn't work if there's a default partition +ALTER TABLE range_parted2 DETACH PARTITION part_rp CONCURRENTLY; +ERROR: cannot support detach partitions concurrently now +-- doesn't work for the default partition +ALTER TABLE range_parted2 DETACH PARTITION part_rpd CONCURRENTLY; +ERROR: cannot support detach partitions concurrently now +DROP TABLE part_rpd; +-- works fine +ALTER TABLE range_parted2 DETACH PARTITION part_rp CONCURRENTLY; +ERROR: cannot support detach partitions concurrently now +\d+ range_parted2 + Partitioned table "public.range_parted2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | +Partition key: RANGE (a) +Partitions: part_rp FOR VALUES FROM (0) TO (100) + +-- constraint should be created +\d part_rp + Table "public.part_rp" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: range_parted2 FOR VALUES FROM (0) TO (100) + +CREATE TABLE part_rp100 PARTITION OF range_parted2 (CHECK (a>=123 AND a<133 AND a IS NOT NULL)) FOR VALUES FROM (100) to (200); +ALTER TABLE range_parted2 DETACH PARTITION part_rp100 CONCURRENTLY; +ERROR: cannot support detach partitions concurrently now +-- redundant constraint should not be created +\d part_rp100 + Table "public.part_rp100" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: range_parted2 FOR VALUES FROM (100) TO (200) +Check constraints: + "part_rp100_a_check" CHECK (a >= 123 AND a < 133 AND a IS NOT NULL) + +DROP TABLE range_parted2; +-- Check ALTER TABLE commands for partitioned tables and partitions +-- cannot add/drop column to/from *only* the parent +ALTER TABLE ONLY list_parted2 ADD COLUMN c int; +ERROR: column must be added to child tables too +ALTER TABLE ONLY list_parted2 DROP COLUMN b; +ERROR: cannot drop column from only the partitioned table when partitions exist +HINT: Do not specify the ONLY keyword. +-- cannot add a column to partition or drop an inherited one +ALTER TABLE part_2 ADD COLUMN c text; +ERROR: cannot add column to a partition +ALTER TABLE part_2 DROP COLUMN b; +ERROR: cannot drop inherited column "b" +-- Nor rename, alter type +ALTER TABLE part_2 RENAME COLUMN b to c; +ERROR: cannot rename inherited column "b" +ALTER TABLE part_2 ALTER COLUMN b TYPE text; +ERROR: cannot alter inherited column "b" +-- cannot add/drop NOT NULL or check constraints to *only* the parent, when +-- partitions exist +ALTER TABLE ONLY list_parted2 ALTER b SET NOT NULL; +ERROR: constraint must be added to child tables too +DETAIL: Column "b" of relation "part_2" is not already NOT NULL. +HINT: Do not specify the ONLY keyword. +ALTER TABLE ONLY list_parted2 ADD CONSTRAINT check_b CHECK (b <> 'zz'); +ERROR: constraint must be added to child tables too +ALTER TABLE list_parted2 ALTER b SET NOT NULL; +ALTER TABLE ONLY list_parted2 ALTER b DROP NOT NULL; +ERROR: cannot remove constraint from only the partitioned table when partitions exist +HINT: Do not specify the ONLY keyword. +ALTER TABLE list_parted2 ADD CONSTRAINT check_b CHECK (b <> 'zz'); +ALTER TABLE ONLY list_parted2 DROP CONSTRAINT check_b; +ERROR: cannot remove constraint from only the partitioned table when partitions exist +HINT: Do not specify the ONLY keyword. +-- It's alright though, if no partitions are yet created +CREATE TABLE parted_no_parts (a int) PARTITION BY LIST (a); +ALTER TABLE ONLY parted_no_parts ALTER a SET NOT NULL; +ALTER TABLE ONLY parted_no_parts ADD CONSTRAINT check_a CHECK (a > 0); +ALTER TABLE ONLY parted_no_parts ALTER a DROP NOT NULL; +ALTER TABLE ONLY parted_no_parts DROP CONSTRAINT check_a; +DROP TABLE parted_no_parts; +-- cannot drop inherited NOT NULL or check constraints from partition +ALTER TABLE list_parted2 ALTER b SET NOT NULL, ADD CONSTRAINT check_a2 CHECK (a > 0); +ALTER TABLE part_2 ALTER b DROP NOT NULL; +ERROR: column "b" is marked NOT NULL in parent table +ALTER TABLE part_2 DROP CONSTRAINT check_a2; +ERROR: cannot drop inherited constraint "check_a2" of relation "part_2" +-- Doesn't make sense to add NO INHERIT constraints on partitioned tables +ALTER TABLE list_parted2 add constraint check_b2 check (b <> 'zz') NO INHERIT; +ERROR: cannot add NO INHERIT constraint to partitioned table "list_parted2" +-- check that a partition cannot participate in regular inheritance +CREATE TABLE inh_test () INHERITS (part_2); +ERROR: cannot inherit from partition "part_2" +CREATE TABLE inh_test (LIKE part_2); +ALTER TABLE inh_test INHERIT part_2; +ERROR: cannot inherit from a partition +ALTER TABLE part_2 INHERIT inh_test; +ERROR: cannot change inheritance of a partition +-- cannot drop or alter type of partition key columns of lower level +-- partitioned tables; for example, part_5, which is list_parted2's +-- partition, is partitioned on b; +ALTER TABLE list_parted2 DROP COLUMN b; +ERROR: cannot drop column "b" because it is part of the partition key of relation "part_5" +ALTER TABLE list_parted2 ALTER COLUMN b TYPE text; +ERROR: cannot alter column "b" because it is part of the partition key of relation "part_5" +-- dropping non-partition key columns should be allowed on the parent table. +ALTER TABLE list_parted DROP COLUMN b; +SELECT * FROM list_parted; + a +--- +(0 rows) + +-- cleanup +DROP TABLE list_parted, list_parted2, range_parted; +DROP TABLE fail_def_part; +DROP TABLE hash_parted; +-- more tests for certain multi-level partitioning scenarios +create table p (a int, b int) partition by range (a, b); +create table p1 (b int, a int not null) partition by range (b); +create table p11 (like p1); +alter table p11 drop a; +alter table p11 add a int; +alter table p11 drop a; +alter table p11 add a int not null; +-- attnum for key attribute 'a' is different in p, p1, and p11 +select attrelid::regclass, attname, attnum +from pg_attribute +where attname = 'a' + and (attrelid = 'p'::regclass + or attrelid = 'p1'::regclass + or attrelid = 'p11'::regclass) +order by attrelid::regclass::text; + attrelid | attname | attnum +----------+---------+-------- + p | a | 1 + p1 | a | 2 + p11 | a | 4 +(3 rows) + +alter table p1 attach partition p11 for values from (2) to (5); +insert into p1 (a, b) values (2, 3); +-- check that partition validation scan correctly detects violating rows +alter table p attach partition p1 for values from (1, 2) to (1, 10); +ERROR: partition constraint of relation "p11" is violated by some row +-- cleanup +drop table p; +drop table p1; +-- validate constraint on partitioned tables should only scan leaf partitions +create table parted_validate_test (a int) partition by list (a); +create table parted_validate_test_1 partition of parted_validate_test for values in (0, 1); +alter table parted_validate_test add constraint parted_validate_test_chka check (a > 0) not valid; +alter table parted_validate_test validate constraint parted_validate_test_chka; +drop table parted_validate_test; +-- test alter column options +CREATE TABLE attmp(i integer); +INSERT INTO attmp VALUES (1); +ALTER TABLE attmp ALTER COLUMN i SET (n_distinct = 1, n_distinct_inherited = 2); +ALTER TABLE attmp ALTER COLUMN i RESET (n_distinct_inherited); +ANALYZE attmp; +DROP TABLE attmp; +DROP USER regress_alter_table_user1; +-- check that violating rows are correctly reported when attaching as the +-- default partition +create table defpart_attach_test (a int) partition by list (a); +create table defpart_attach_test1 partition of defpart_attach_test for values in (1); +create table defpart_attach_test_d (b int, a int); +alter table defpart_attach_test_d drop b; +insert into defpart_attach_test_d values (1), (2); +-- error because its constraint as the default partition would be violated +-- by the row containing 1 +alter table defpart_attach_test attach partition defpart_attach_test_d default; +ERROR: partition constraint of relation "defpart_attach_test_d" is violated by some row +delete from defpart_attach_test_d where a = 1; +alter table defpart_attach_test_d add check (a > 1); +-- should be attached successfully and without needing to be scanned +alter table defpart_attach_test attach partition defpart_attach_test_d default; +-- check that attaching a partition correctly reports any rows in the default +-- partition that should not be there for the new partition to be attached +-- successfully +create table defpart_attach_test_2 (like defpart_attach_test_d); +alter table defpart_attach_test attach partition defpart_attach_test_2 for values in (2); +ERROR: updated partition constraint for default partition "defpart_attach_test_d" would be violated by some row +drop table defpart_attach_test; +-- check combinations of temporary and permanent relations when attaching +-- partitions. +create table perm_part_parent (a int) partition by list (a); +create temp table temp_part_parent (a int) partition by list (a); +create table perm_part_child (a int); +create temp table temp_part_child (a int); +alter table temp_part_parent attach partition perm_part_child default; -- error +ERROR: cannot attach a permanent relation as partition of temporary relation "temp_part_parent" +alter table perm_part_parent attach partition temp_part_child default; -- error +ERROR: cannot attach a temporary relation as partition of permanent relation "perm_part_parent" +alter table temp_part_parent attach partition temp_part_child default; -- ok +drop table perm_part_parent cascade; +drop table temp_part_parent cascade; +-- check that attaching partitions to a table while it is being used is +-- prevented +create table tab_part_attach (a int) partition by list (a); +create or replace function func_part_attach() returns trigger + language plpgsql as $$ + begin + execute 'create table tab_part_attach_1 (a int)'; + execute 'alter table tab_part_attach attach partition tab_part_attach_1 for values in (1)'; + return null; + end $$; +create trigger trig_part_attach before insert on tab_part_attach + for each statement execute procedure func_part_attach(); +ERROR: Triggers for statements are not yet supported +insert into tab_part_attach values (1); +ERROR: no partition of relation "tab_part_attach" found for row +DETAIL: Partition key of the failing row contains (a) = (1). +drop table tab_part_attach; +drop function func_part_attach(); +-- test case where the partitioning operator is a SQL function whose +-- evaluation results in the table's relcache being rebuilt partway through +-- the execution of an ATTACH PARTITION command +create function at_test_sql_partop (int4, int4) returns int language sql +as $$ select case when $1 = $2 then 0 when $1 > $2 then 1 else -1 end; $$; +create operator class at_test_sql_partop for type int4 using btree as + operator 1 < (int4, int4), operator 2 <= (int4, int4), + operator 3 = (int4, int4), operator 4 >= (int4, int4), + operator 5 > (int4, int4), function 1 at_test_sql_partop(int4, int4); +create table at_test_sql_partop (a int) partition by range (a at_test_sql_partop); +create table at_test_sql_partop_1 (a int); +alter table at_test_sql_partop attach partition at_test_sql_partop_1 for values from (0) to (10); +drop table at_test_sql_partop; +drop operator class at_test_sql_partop using btree; +drop function at_test_sql_partop; +/* Test case for bug #16242 */ +-- We create a parent and child where the child has missing +-- non-null attribute values, and arrange to pass them through +-- tuple conversion from the child to the parent tupdesc +create table bar1 (a integer, b integer not null default 1) + partition by range (a); +create table bar2 (a integer); +insert into bar2 values (1); +alter table bar2 add column b integer not null default 1; +-- (at this point bar2 contains tuple with natts=1) +alter table bar1 attach partition bar2 default; +-- this works: +select * from bar1; + a | b +---+--- + 1 | 1 +(1 row) + +-- this exercises tuple conversion: +create function xtrig() + returns trigger language plpgsql +as $$ + declare + r record; + begin + for r in select * from old loop + raise info 'a=%, b=%', r.a, r.b; + end loop; + return NULL; + end; +$$; +create trigger xtrig + after update on bar1 + referencing old table as old + for each statement execute procedure xtrig(); +ERROR: Triggers for statements are not yet supported +update bar1 set a = a + 1; +/* End test case for bug #16242 */ +/* Test case for bug #17409 */ +create table attbl (p1 int constraint pk_attbl primary key); +create table atref (c1 int references attbl(p1)); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +cluster attbl using pk_attbl; +alter table attbl alter column p1 set data type bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +alter table atref alter column c1 set data type bigint; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +drop table attbl, atref; +create table attbl (p1 int constraint pk_attbl primary key); +alter table attbl replica identity using index pk_attbl; +create table atref (c1 int references attbl(p1)); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +alter table attbl alter column p1 set data type bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +alter table atref alter column c1 set data type bigint; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +drop table attbl, atref; +/* End test case for bug #17409 */ +-- Test that ALTER TABLE rewrite preserves a clustered index +-- for normal indexes and indexes on constraints. +create table alttype_cluster (a int); +alter table alttype_cluster add primary key (a); +create index alttype_cluster_ind on alttype_cluster (a); +alter table alttype_cluster cluster on alttype_cluster_ind; +-- Normal index remains clustered. +select indexrelid::regclass, indisclustered from pg_index + where indrelid = 'alttype_cluster'::regclass + order by indexrelid::regclass::text; + indexrelid | indisclustered +----------------------+---------------- + alttype_cluster_ind | t + alttype_cluster_pkey | f +(2 rows) + +alter table alttype_cluster alter a type bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +select indexrelid::regclass, indisclustered from pg_index + where indrelid = 'alttype_cluster'::regclass + order by indexrelid::regclass::text; + indexrelid | indisclustered +----------------------+---------------- + alttype_cluster_ind | t + alttype_cluster_pkey | f +(2 rows) + +-- Constraint index remains clustered. +alter table alttype_cluster cluster on alttype_cluster_pkey; +select indexrelid::regclass, indisclustered from pg_index + where indrelid = 'alttype_cluster'::regclass + order by indexrelid::regclass::text; + indexrelid | indisclustered +----------------------+---------------- + alttype_cluster_ind | f + alttype_cluster_pkey | t +(2 rows) + +alter table alttype_cluster alter a type int; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +select indexrelid::regclass, indisclustered from pg_index + where indrelid = 'alttype_cluster'::regclass + order by indexrelid::regclass::text; + indexrelid | indisclustered +----------------------+---------------- + alttype_cluster_ind | f + alttype_cluster_pkey | t +(2 rows) + +drop table alttype_cluster; +-- +-- Check that attaching or detaching a partitioned partition correctly leads +-- to its partitions' constraint being updated to reflect the parent's +-- newly added/removed constraint +create table target_parted (a int, b int) partition by list (a); +create table attach_parted (a int, b int) partition by list (b); +create table attach_parted_part1 partition of attach_parted for values in (1); +-- insert a row directly into the leaf partition so that its partition +-- constraint is built and stored in the relcache +insert into attach_parted_part1 values (1, 1); +-- the following better invalidate the partition constraint of the leaf +-- partition too... +alter table target_parted attach partition attach_parted for values in (1); +-- ...such that the following insert fails +insert into attach_parted_part1 values (2, 1); +ERROR: new row for relation "attach_parted_part1" violates partition constraint +DETAIL: Failing row contains (2, 1). +-- ...and doesn't when the partition is detached along with its own partition +alter table target_parted detach partition attach_parted; +insert into attach_parted_part1 values (2, 1); diff --git a/src/test/singlenode_regress/expected/amutils.out b/src/test/singlenode_regress/expected/amutils.out new file mode 100644 index 00000000000..02e1389cb18 --- /dev/null +++ b/src/test/singlenode_regress/expected/amutils.out @@ -0,0 +1,260 @@ +-- +-- Test index AM property-reporting functions +-- +select prop, + pg_indexam_has_property(a.oid, prop) as "AM", + pg_index_has_property('onek_hundred'::regclass, prop) as "Index", + pg_index_column_has_property('onek_hundred'::regclass, 1, prop) as "Column" + from pg_am a, + unnest(array['asc', 'desc', 'nulls_first', 'nulls_last', + 'orderable', 'distance_orderable', 'returnable', + 'search_array', 'search_nulls', + 'clusterable', 'index_scan', 'bitmap_scan', + 'backward_scan', + 'can_order', 'can_unique', 'can_multi_col', + 'can_exclude', 'can_include', + 'bogus']::text[]) + with ordinality as u(prop,ord) + where a.amname = 'btree' + order by ord; + prop | AM | Index | Column +--------------------+----+-------+-------- + asc | | | t + desc | | | f + nulls_first | | | f + nulls_last | | | t + orderable | | | t + distance_orderable | | | f + returnable | | | t + search_array | | | t + search_nulls | | | t + clusterable | | t | + index_scan | | t | + bitmap_scan | | t | + backward_scan | | t | + can_order | t | | + can_unique | t | | + can_multi_col | t | | + can_exclude | t | | + can_include | t | | + bogus | | | +(19 rows) + +select prop, + pg_indexam_has_property(a.oid, prop) as "AM", + pg_index_has_property('gcircleind'::regclass, prop) as "Index", + pg_index_column_has_property('gcircleind'::regclass, 1, prop) as "Column" + from pg_am a, + unnest(array['asc', 'desc', 'nulls_first', 'nulls_last', + 'orderable', 'distance_orderable', 'returnable', + 'search_array', 'search_nulls', + 'clusterable', 'index_scan', 'bitmap_scan', + 'backward_scan', + 'can_order', 'can_unique', 'can_multi_col', + 'can_exclude', 'can_include', + 'bogus']::text[]) + with ordinality as u(prop,ord) + where a.amname = 'gist' + order by ord; + prop | AM | Index | Column +--------------------+----+-------+-------- + asc | | | f + desc | | | f + nulls_first | | | f + nulls_last | | | f + orderable | | | f + distance_orderable | | | t + returnable | | | f + search_array | | | f + search_nulls | | | t + clusterable | | t | + index_scan | | t | + bitmap_scan | | t | + backward_scan | | f | + can_order | f | | + can_unique | f | | + can_multi_col | t | | + can_exclude | t | | + can_include | t | | + bogus | | | +(19 rows) + +select prop, + pg_index_column_has_property('onek_hundred'::regclass, 1, prop) as btree, + pg_index_column_has_property('hash_i4_index'::regclass, 1, prop) as hash, + pg_index_column_has_property('gcircleind'::regclass, 1, prop) as gist, + pg_index_column_has_property('sp_radix_ind'::regclass, 1, prop) as spgist_radix, + pg_index_column_has_property('sp_quad_ind'::regclass, 1, prop) as spgist_quad, + pg_index_column_has_property('botharrayidx'::regclass, 1, prop) as gin, + pg_index_column_has_property('brinidx'::regclass, 1, prop) as brin + from unnest(array['asc', 'desc', 'nulls_first', 'nulls_last', + 'orderable', 'distance_orderable', 'returnable', + 'search_array', 'search_nulls', + 'bogus']::text[]) + with ordinality as u(prop,ord) + order by ord; + prop | btree | hash | gist | spgist_radix | spgist_quad | gin | brin +--------------------+-------+------+------+--------------+-------------+-----+------ + asc | t | f | f | f | f | f | f + desc | f | f | f | f | f | f | f + nulls_first | f | f | f | f | f | f | f + nulls_last | t | f | f | f | f | f | f + orderable | t | f | f | f | f | f | f + distance_orderable | f | f | t | f | t | f | f + returnable | t | f | f | t | t | f | f + search_array | t | f | f | f | f | f | f + search_nulls | t | f | t | t | t | f | t + bogus | | | | | | | +(10 rows) + +select prop, + pg_index_has_property('onek_hundred'::regclass, prop) as btree, + pg_index_has_property('hash_i4_index'::regclass, prop) as hash, + pg_index_has_property('gcircleind'::regclass, prop) as gist, + pg_index_has_property('sp_radix_ind'::regclass, prop) as spgist, + pg_index_has_property('botharrayidx'::regclass, prop) as gin, + pg_index_has_property('brinidx'::regclass, prop) as brin + from unnest(array['clusterable', 'index_scan', 'bitmap_scan', + 'backward_scan', + 'bogus']::text[]) + with ordinality as u(prop,ord) + order by ord; + prop | btree | hash | gist | spgist | gin | brin +---------------+-------+------+------+--------+-----+------ + clusterable | t | f | t | f | f | f + index_scan | t | t | t | t | f | f + bitmap_scan | t | t | t | t | t | t + backward_scan | t | t | f | f | f | f + bogus | | | | | | +(5 rows) + +select amname, prop, pg_indexam_has_property(a.oid, prop) as p + from pg_am a, + unnest(array['can_order', 'can_unique', 'can_multi_col', + 'can_exclude', 'can_include', 'bogus']::text[]) + with ordinality as u(prop,ord) + where amtype = 'i' + order by amname, ord; + amname | prop | p +--------+---------------+--- + bitmap | can_order | f + bitmap | can_unique | t + bitmap | can_multi_col | t + bitmap | can_exclude | t + bitmap | can_include | f + bitmap | bogus | + brin | can_order | f + brin | can_unique | f + brin | can_multi_col | t + brin | can_exclude | f + brin | can_include | f + brin | bogus | + btree | can_order | t + btree | can_unique | t + btree | can_multi_col | t + btree | can_exclude | t + btree | can_include | t + btree | bogus | + gin | can_order | f + gin | can_unique | f + gin | can_multi_col | t + gin | can_exclude | f + gin | can_include | f + gin | bogus | + gist | can_order | f + gist | can_unique | f + gist | can_multi_col | t + gist | can_exclude | t + gist | can_include | t + gist | bogus | + hash | can_order | f + hash | can_unique | f + hash | can_multi_col | f + hash | can_exclude | t + hash | can_include | f + hash | bogus | + spgist | can_order | f + spgist | can_unique | f + spgist | can_multi_col | f + spgist | can_exclude | t + spgist | can_include | t + spgist | bogus | +(42 rows) + +-- +-- additional checks for pg_index_column_has_property +-- +CREATE TEMP TABLE foo (f1 int, f2 int, f3 int, f4 int); +CREATE INDEX fooindex ON foo (f1 desc, f2 asc, f3 nulls first, f4 nulls last); +select col, prop, pg_index_column_has_property(o, col, prop) + from (values ('fooindex'::regclass)) v1(o), + (values (1,'orderable'),(2,'asc'),(3,'desc'), + (4,'nulls_first'),(5,'nulls_last'), + (6, 'bogus')) v2(idx,prop), + generate_series(1,4) col + order by col, idx; + col | prop | pg_index_column_has_property +-----+-------------+------------------------------ + 1 | orderable | t + 1 | asc | f + 1 | desc | t + 1 | nulls_first | t + 1 | nulls_last | f + 1 | bogus | + 2 | orderable | t + 2 | asc | t + 2 | desc | f + 2 | nulls_first | f + 2 | nulls_last | t + 2 | bogus | + 3 | orderable | t + 3 | asc | t + 3 | desc | f + 3 | nulls_first | t + 3 | nulls_last | f + 3 | bogus | + 4 | orderable | t + 4 | asc | t + 4 | desc | f + 4 | nulls_first | f + 4 | nulls_last | t + 4 | bogus | +(24 rows) + +CREATE INDEX foocover ON foo (f1) INCLUDE (f2,f3); +select col, prop, pg_index_column_has_property(o, col, prop) + from (values ('foocover'::regclass)) v1(o), + (values (1,'orderable'),(2,'asc'),(3,'desc'), + (4,'nulls_first'),(5,'nulls_last'), + (6,'distance_orderable'),(7,'returnable'), + (8, 'bogus')) v2(idx,prop), + generate_series(1,3) col + order by col, idx; + col | prop | pg_index_column_has_property +-----+--------------------+------------------------------ + 1 | orderable | t + 1 | asc | t + 1 | desc | f + 1 | nulls_first | f + 1 | nulls_last | t + 1 | distance_orderable | f + 1 | returnable | t + 1 | bogus | + 2 | orderable | f + 2 | asc | + 2 | desc | + 2 | nulls_first | + 2 | nulls_last | + 2 | distance_orderable | f + 2 | returnable | t + 2 | bogus | + 3 | orderable | f + 3 | asc | + 3 | desc | + 3 | nulls_first | + 3 | nulls_last | + 3 | distance_orderable | f + 3 | returnable | t + 3 | bogus | +(24 rows) + diff --git a/src/test/singlenode_regress/expected/aoco_privileges.out b/src/test/singlenode_regress/expected/aoco_privileges.out new file mode 100644 index 00000000000..a770a388d3f --- /dev/null +++ b/src/test/singlenode_regress/expected/aoco_privileges.out @@ -0,0 +1,128 @@ +-- Create roles. -- +CREATE ROLE new_aoco_table_owner; +NOTICE: resource queue required -- using default resource queue "pg_default" +CREATE ROLE user_with_privileges_from_first_owner; +NOTICE: resource queue required -- using default resource queue "pg_default" +CREATE ROLE user_with_privileges_from_second_owner; +NOTICE: resource queue required -- using default resource queue "pg_default" +CREATE ROLE user_with_no_privileges; +NOTICE: resource queue required -- using default resource queue "pg_default" +-- Create the table. -- +CREATE TABLE aoco_privileges_table (a int) WITH (appendonly=true, orientation=column); +-- Grant privileges to only one user +GRANT ALL ON aoco_privileges_table TO user_with_privileges_from_first_owner; +SELECT has_table_privilege('user_with_privileges_from_first_owner', 'aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + t +(1 row) + +-- The original owner should have privileges +SELECT has_table_privilege('aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + t +(1 row) + +-- The following users should not have privileges +SELECT has_table_privilege('new_aoco_table_owner', 'aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + f +(1 row) + +SELECT has_table_privilege('user_with_privileges_from_second_owner', 'aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + f +(1 row) + +SELECT has_table_privilege('user_with_no_privileges', 'aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + f +(1 row) + +SET ROLE user_with_no_privileges; +SELECT * FROM aoco_privileges_table; +ERROR: permission denied for table aoco_privileges_table +RESET ROLE; +-- Now change ownership to the new owner +ALTER TABLE aoco_privileges_table OWNER TO new_aoco_table_owner; +-- The original owner should still have privileges +SELECT has_table_privilege('aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + t +(1 row) + +SELECT * FROM aoco_privileges_table; + a +--- +(0 rows) + +-- The people to whom the original owner granted privileges should still have privileges +SELECT has_table_privilege('user_with_privileges_from_first_owner', 'aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + t +(1 row) + +SET ROLE user_with_privileges_from_first_owner; +SELECT * FROM aoco_privileges_table; + a +--- +(0 rows) + +-- The new owner of the table should have privileges +SET ROLE new_aoco_table_owner; +SELECT has_table_privilege('aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + t +(1 row) + +SELECT * FROM aoco_privileges_table; + a +--- +(0 rows) + +-- The new owner should be able to grant privileges +GRANT ALL ON aoco_privileges_table TO user_with_privileges_from_second_owner; +SELECT has_table_privilege('user_with_privileges_from_second_owner', 'aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + t +(1 row) + +SET ROLE user_with_privileges_from_second_owner; +SELECT * FROM aoco_privileges_table; + a +--- +(0 rows) + +-- The no privileges user should have no privileges still +SET ROLE user_with_no_privileges; +SELECT has_table_privilege('aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + f +(1 row) + +SELECT * FROM aoco_privileges_table; +ERROR: permission denied for table aoco_privileges_table +-- Revoke privileges +RESET ROLE; +REVOKE ALL ON aoco_privileges_table FROM user_with_privileges_from_first_owner; +SELECT has_table_privilege('user_with_privileges_from_first_owner', 'aoco_privileges_table', 'SELECT'); + has_table_privilege +--------------------- + f +(1 row) + +-- Clean up +DROP TABLE aoco_privileges_table; +DROP ROLE new_aoco_table_owner; +DROP ROLE user_with_privileges_from_first_owner; +DROP ROLE user_with_privileges_from_second_owner; +DROP ROLE user_with_no_privileges; diff --git a/src/test/singlenode_regress/expected/aocs_sample.out b/src/test/singlenode_regress/expected/aocs_sample.out new file mode 100644 index 00000000000..cf969dfd0d3 --- /dev/null +++ b/src/test/singlenode_regress/expected/aocs_sample.out @@ -0,0 +1,404 @@ +CREATE TABLE test_aocs_tablesample_append (dist int, id int, name text) WITH (appendonly=true, orientation=column); +-- use fillfactor so we don't have to load too much data to get multiple pages +-- Changed the column length in order to match the expected results based on relation's blocksz +INSERT INTO test_aocs_tablesample_append SELECT 0, i, repeat(i::text, 875) FROM generate_series(0, 9) s(i) ORDER BY i; +INSERT INTO test_aocs_tablesample_append SELECT 3, i, repeat(i::text, 875) FROM generate_series(10, 19) s(i) ORDER BY i; +INSERT INTO test_aocs_tablesample_append SELECT 5, i, repeat(i::text, 875) FROM generate_series(20, 29) s(i) ORDER BY i; +-- Verify that each segment has the same amount of rows; +SELECT gp_segment_id, count(dist) FROM test_aocs_tablesample_append GROUP BY 1 ORDER BY 1; + gp_segment_id | count +---------------+------- + -1 | 30 +(1 row) + +SELECT t.id FROM test_aocs_tablesample_append AS t TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 1 + 2 + 4 + 8 + 9 + 10 + 11 + 12 + 13 + 17 + 19 + 20 + 22 + 24 + 26 + 27 + 29 +(17 rows) + +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (100.0/11) REPEATABLE (0); + id +---- + 13 + 17 + 26 +(3 rows) + +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 1 + 2 + 4 + 8 + 9 + 10 + 11 + 12 + 13 + 17 + 19 + 20 + 22 + 24 + 26 + 27 + 29 +(17 rows) + +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE BERNOULLI (50) REPEATABLE (0); + id +---- + 1 + 2 + 4 + 8 + 9 + 10 + 11 + 12 + 13 + 17 + 19 + 20 + 22 + 24 + 26 + 27 + 29 +(17 rows) + +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE BERNOULLI (5.5) REPEATABLE (0); + id +---- + 26 +(1 row) + +-- 100% should give repeatable count results (ie, all rows) in any case +SELECT count(*) FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (100); + count +------- + 30 +(1 row) + +SELECT count(*) FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (100) REPEATABLE (1+2); + count +------- + 30 +(1 row) + +SELECT count(*) FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (100) REPEATABLE (0.4); + count +------- + 30 +(1 row) + +CREATE VIEW test_aocs_tablesample_append_v1 AS + SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (10*2) REPEATABLE (2); +CREATE VIEW test_aocs_tablesample_append_v2 AS + SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (99); +\d+ test_aocs_tablesample_append_v1 + View "public.test_aocs_tablesample_append_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + id | integer | | | | plain | +View definition: + SELECT test_aocs_tablesample_append.id + FROM test_aocs_tablesample_append TABLESAMPLE system ((10 * 2)) REPEATABLE (2); + +\d+ test_aocs_tablesample_append_v2 + View "public.test_aocs_tablesample_append_v2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + id | integer | | | | plain | +View definition: + SELECT test_aocs_tablesample_append.id + FROM test_aocs_tablesample_append TABLESAMPLE system (99); + +-- check a sampled query doesn't affect cursor in progress +BEGIN; +DECLARE tablesample_cur CURSOR FOR + SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; + id +---- + 1 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 2 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 4 +(1 row) + +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 1 + 2 + 4 + 8 + 9 + 10 + 11 + 12 + 13 + 17 + 19 + 20 + 22 + 24 + 26 + 27 + 29 +(17 rows) + +FETCH NEXT FROM tablesample_cur; + id +---- + 8 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 9 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 10 +(1 row) + +-- Cloudberry: Going backwards on cursors is not supported. By closing the +-- cursor and starting again we pass the tests and keep the file closer to +-- upstream. We do test the rescan methods of tablesample afterwards. +CLOSE tablesample_cur; +DECLARE tablesample_cur CURSOR FOR SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; + id +---- + 1 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 2 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 4 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 8 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 9 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 10 +(1 row) + +CLOSE tablesample_cur; +END; +EXPLAIN (COSTS OFF) + SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (2); + QUERY PLAN +-------------------------------------------------------------------- + Sample Scan on test_aocs_tablesample_append + Sampling: system ('50'::real) REPEATABLE ('2'::double precision) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) + SELECT * FROM test_aocs_tablesample_append_v1; + QUERY PLAN +-------------------------------------------------------------------- + Sample Scan on test_aocs_tablesample_append + Sampling: system ('20'::real) REPEATABLE ('2'::double precision) + Optimizer: Postgres query optimizer +(3 rows) + +-- Cloudberry: Test rescan paths by forcing a nested loop +CREATE TABLE ttr1_aocs_append (a int, b int) with(appendonly=true, orientation=column); +CREATE TABLE ttr2_aocs_append (a int, b int) with(appendonly=true, orientation=column); +INSERT INTO ttr1_aocs_append VALUES (1, 1), (12, 1), (31, 1), (NULL, NULL); +INSERT INTO ttr2_aocs_append VALUES (1, 2), (12, 2), (31, 2), (NULL, 6); +ANALYZE ttr1_aocs_append; +ANALYZE ttr2_aocs_append; +SET enable_hashjoin TO OFF; +SET enable_mergejoin TO OFF; +SET enable_nestloop TO ON; +EXPLAIN (COSTS OFF) SELECT * FROM ttr1_aocs_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2_aocs_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1_aocs_append.a = ttr2_aocs_append.a; + QUERY PLAN +----------------------------------------------------------------------------------- + Nested Loop + Join Filter: (ttr1_aocs_append.a = ttr2_aocs_append.a) + -> Sample Scan on ttr1_aocs_append + Sampling: bernoulli ('50'::real) REPEATABLE ('1'::double precision) + -> Materialize + -> Sample Scan on ttr2_aocs_append + Sampling: bernoulli ('50'::real) REPEATABLE ('1'::double precision) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM ttr1_aocs_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2_aocs_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1_aocs_append.a = ttr2_aocs_append.a; + a | b | a | b +----+---+----+--- + 1 | 1 | 1 | 2 + 12 | 1 | 12 | 2 + 31 | 1 | 31 | 2 +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM ttr1_aocs_append TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2_aocs_append TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1_aocs_append.a = ttr2_aocs_append.a; + QUERY PLAN +-------------------------------------------------------------------------------- + Nested Loop + Join Filter: (ttr1_aocs_append.a = ttr2_aocs_append.a) + -> Sample Scan on ttr1_aocs_append + Sampling: system ('50'::real) REPEATABLE ('1'::double precision) + -> Materialize + -> Sample Scan on ttr2_aocs_append + Sampling: system ('50'::real) REPEATABLE ('1'::double precision) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM ttr1_aocs_append TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2_aocs_append TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1_aocs_append.a = ttr2_aocs_append.a; + a | b | a | b +----+---+----+--- + 1 | 1 | 1 | 2 + 12 | 1 | 12 | 2 + 31 | 1 | 31 | 2 +(3 rows) + +RESET enable_hashjoin; +RESET enable_mergejoin; +RESET enable_nestloop; +-- check behavior during rescans, as well as correct handling of min/max pct +-- Cloudberry: does not support laterals completely, rescan specific tests above +-- start_ignore +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample bernoulli (pct)) ss; + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample system (pct)) ss; + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +explain (costs off) +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; + QUERY PLAN +-------------------------------------------------------------- + GroupAggregate + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Nested Loop + -> Values Scan on "*VALUES*" + -> Sample Scan on tenk1 + Sampling: bernoulli ("*VALUES*".column1) + Optimizer: Postgres query optimizer +(9 rows) + +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; + pct | count +-----+------- + 100 | 10000 +(1 row) + +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample system (pct)) ss + group by pct; + pct | count +-----+------- + 100 | 10000 +(1 row) + +-- end_ignore +-- errors +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE FOOBAR (1); +ERROR: tablesample method foobar does not exist +LINE 1: ... id FROM test_aocs_tablesample_append TABLESAMPLE FOOBAR (1)... + ^ +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (NULL); +ERROR: TABLESAMPLE parameter cannot be null +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (NULL); +ERROR: TABLESAMPLE REPEATABLE parameter cannot be null +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE BERNOULLI (-1); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE BERNOULLI (200); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (-1); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (200); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_aocs_tablesample_append_v1 TABLESAMPLE BERNOULLI (1); +ERROR: TABLESAMPLE clause can only be applied to tables and materialized views +LINE 1: SELECT id FROM test_aocs_tablesample_append_v1 TABLESAMPLE B... + ^ +INSERT INTO test_aocs_tablesample_append_v1 VALUES(1); +ERROR: cannot insert into view "test_aocs_tablesample_append_v1" +DETAIL: Views containing TABLESAMPLE are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +WITH query_select AS (SELECT * FROM test_aocs_tablesample_append) +SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEATABLE (1); +ERROR: TABLESAMPLE clause can only be applied to tables and materialized views +LINE 2: SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEA... + ^ +SELECT q.* FROM (SELECT * FROM test_aocs_tablesample_append) as q TABLESAMPLE BERNOULLI (5); +ERROR: syntax error at or near "TABLESAMPLE" +LINE 1: ...(SELECT * FROM test_aocs_tablesample_append) as q TABLESAMPL... + ^ diff --git a/src/test/singlenode_regress/expected/appendonly_sample.out b/src/test/singlenode_regress/expected/appendonly_sample.out new file mode 100644 index 00000000000..d43307e6a3b --- /dev/null +++ b/src/test/singlenode_regress/expected/appendonly_sample.out @@ -0,0 +1,404 @@ +CREATE TABLE test_tablesample_append (dist int, id int, name text) WITH (appendonly=true); +-- use fillfactor so we don't have to load too much data to get multiple pages +-- Changed the column length in order to match the expected results based on relation's blocksz +INSERT INTO test_tablesample_append SELECT 0, i, repeat(i::text, 875) FROM generate_series(0, 9) s(i) ORDER BY i; +INSERT INTO test_tablesample_append SELECT 3, i, repeat(i::text, 875) FROM generate_series(10, 19) s(i) ORDER BY i; +INSERT INTO test_tablesample_append SELECT 5, i, repeat(i::text, 875) FROM generate_series(20, 29) s(i) ORDER BY i; +-- Verify that each segment has the same amount of rows; +SELECT gp_segment_id, count(dist) FROM test_tablesample_append GROUP BY 1 ORDER BY 1; + gp_segment_id | count +---------------+------- + -1 | 30 +(1 row) + +SELECT t.id FROM test_tablesample_append AS t TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 1 + 2 + 4 + 8 + 9 + 10 + 11 + 12 + 13 + 17 + 19 + 20 + 22 + 24 + 26 + 27 + 29 +(17 rows) + +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (100.0/11) REPEATABLE (0); + id +---- + 13 + 17 + 26 +(3 rows) + +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 1 + 2 + 4 + 8 + 9 + 10 + 11 + 12 + 13 + 17 + 19 + 20 + 22 + 24 + 26 + 27 + 29 +(17 rows) + +SELECT id FROM test_tablesample_append TABLESAMPLE BERNOULLI (50) REPEATABLE (0); + id +---- + 1 + 2 + 4 + 8 + 9 + 10 + 11 + 12 + 13 + 17 + 19 + 20 + 22 + 24 + 26 + 27 + 29 +(17 rows) + +SELECT id FROM test_tablesample_append TABLESAMPLE BERNOULLI (5.5) REPEATABLE (0); + id +---- + 26 +(1 row) + +-- 100% should give repeatable count results (ie, all rows) in any case +SELECT count(*) FROM test_tablesample_append TABLESAMPLE SYSTEM (100); + count +------- + 30 +(1 row) + +SELECT count(*) FROM test_tablesample_append TABLESAMPLE SYSTEM (100) REPEATABLE (1+2); + count +------- + 30 +(1 row) + +SELECT count(*) FROM test_tablesample_append TABLESAMPLE SYSTEM (100) REPEATABLE (0.4); + count +------- + 30 +(1 row) + +CREATE VIEW test_tablesample_append_v1 AS + SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (10*2) REPEATABLE (2); +CREATE VIEW test_tablesample_append_v2 AS + SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (99); +\d+ test_tablesample_append_v1 + View "public.test_tablesample_append_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + id | integer | | | | plain | +View definition: + SELECT test_tablesample_append.id + FROM test_tablesample_append TABLESAMPLE system ((10 * 2)) REPEATABLE (2); + +\d+ test_tablesample_append_v2 + View "public.test_tablesample_append_v2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + id | integer | | | | plain | +View definition: + SELECT test_tablesample_append.id + FROM test_tablesample_append TABLESAMPLE system (99); + +-- check a sampled query doesn't affect cursor in progress +BEGIN; +DECLARE tablesample_cur CURSOR FOR + SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; + id +---- + 1 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 2 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 4 +(1 row) + +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 1 + 2 + 4 + 8 + 9 + 10 + 11 + 12 + 13 + 17 + 19 + 20 + 22 + 24 + 26 + 27 + 29 +(17 rows) + +FETCH NEXT FROM tablesample_cur; + id +---- + 8 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 9 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 10 +(1 row) + +-- Cloudberry: Going backwards on cursors is not supported. By closing the +-- cursor and starting again we pass the tests and keep the file closer to +-- upstream. We do test the rescan methods of tablesample afterwards. +CLOSE tablesample_cur; +DECLARE tablesample_cur CURSOR FOR SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; + id +---- + 1 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 2 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 4 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 8 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 9 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 10 +(1 row) + +CLOSE tablesample_cur; +END; +EXPLAIN (COSTS OFF) + SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (2); + QUERY PLAN +-------------------------------------------------------------------- + Sample Scan on test_tablesample_append + Sampling: system ('50'::real) REPEATABLE ('2'::double precision) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) + SELECT * FROM test_tablesample_append_v1; + QUERY PLAN +-------------------------------------------------------------------- + Sample Scan on test_tablesample_append + Sampling: system ('20'::real) REPEATABLE ('2'::double precision) + Optimizer: Postgres query optimizer +(3 rows) + +-- Cloudberry: Test rescan paths by forcing a nested loop +CREATE TABLE ttr1_append (a int, b int) with(appendonly=true); +CREATE TABLE ttr2_append (a int, b int) with(appendonly=true); +INSERT INTO ttr1_append VALUES (1, 1), (12, 1), (31, 1), (NULL, NULL); +INSERT INTO ttr2_append VALUES (1, 2), (12, 2), (31, 2), (NULL, 6); +ANALYZE ttr1_append; +ANALYZE ttr2_append; +SET enable_hashjoin TO OFF; +SET enable_mergejoin TO OFF; +SET enable_nestloop TO ON; +EXPLAIN (COSTS OFF) SELECT * FROM ttr1_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1_append.a = ttr2_append.a; + QUERY PLAN +----------------------------------------------------------------------------------- + Nested Loop + Join Filter: (ttr1_append.a = ttr2_append.a) + -> Sample Scan on ttr1_append + Sampling: bernoulli ('50'::real) REPEATABLE ('1'::double precision) + -> Materialize + -> Sample Scan on ttr2_append + Sampling: bernoulli ('50'::real) REPEATABLE ('1'::double precision) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM ttr1_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1_append.a = ttr2_append.a; + a | b | a | b +----+---+----+--- + 1 | 1 | 1 | 2 + 12 | 1 | 12 | 2 + 31 | 1 | 31 | 2 +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM ttr1_append TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2_append TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1_append.a = ttr2_append.a; + QUERY PLAN +-------------------------------------------------------------------------------- + Nested Loop + Join Filter: (ttr1_append.a = ttr2_append.a) + -> Sample Scan on ttr1_append + Sampling: system ('50'::real) REPEATABLE ('1'::double precision) + -> Materialize + -> Sample Scan on ttr2_append + Sampling: system ('50'::real) REPEATABLE ('1'::double precision) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM ttr1_append TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2_append TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1_append.a = ttr2_append.a; + a | b | a | b +----+---+----+--- + 1 | 1 | 1 | 2 + 12 | 1 | 12 | 2 + 31 | 1 | 31 | 2 +(3 rows) + +RESET enable_hashjoin; +RESET enable_mergejoin; +RESET enable_nestloop; +-- check behavior during rescans, as well as correct handling of min/max pct +-- Cloudberry: does not support laterals completely, rescan specific tests above +-- start_ignore +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample bernoulli (pct)) ss; + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample system (pct)) ss; + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +explain (costs off) +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; + QUERY PLAN +-------------------------------------------------------------- + GroupAggregate + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Nested Loop + -> Values Scan on "*VALUES*" + -> Sample Scan on tenk1 + Sampling: bernoulli ("*VALUES*".column1) + Optimizer: Postgres query optimizer +(9 rows) + +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; + pct | count +-----+------- + 100 | 10000 +(1 row) + +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample system (pct)) ss + group by pct; + pct | count +-----+------- + 100 | 10000 +(1 row) + +-- end_ignore +-- errors +SELECT id FROM test_tablesample_append TABLESAMPLE FOOBAR (1); +ERROR: tablesample method foobar does not exist +LINE 1: ...ELECT id FROM test_tablesample_append TABLESAMPLE FOOBAR (1)... + ^ +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (NULL); +ERROR: TABLESAMPLE parameter cannot be null +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (NULL); +ERROR: TABLESAMPLE REPEATABLE parameter cannot be null +SELECT id FROM test_tablesample_append TABLESAMPLE BERNOULLI (-1); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_tablesample_append TABLESAMPLE BERNOULLI (200); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (-1); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (200); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_tablesample_append_v1 TABLESAMPLE BERNOULLI (1); +ERROR: TABLESAMPLE clause can only be applied to tables and materialized views +LINE 1: SELECT id FROM test_tablesample_append_v1 TABLESAMPLE BERNOU... + ^ +INSERT INTO test_tablesample_append_v1 VALUES(1); +ERROR: cannot insert into view "test_tablesample_append_v1" +DETAIL: Views containing TABLESAMPLE are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +WITH query_select AS (SELECT * FROM test_tablesample_append) +SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEATABLE (1); +ERROR: TABLESAMPLE clause can only be applied to tables and materialized views +LINE 2: SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEA... + ^ +SELECT q.* FROM (SELECT * FROM test_tablesample_append) as q TABLESAMPLE BERNOULLI (5); +ERROR: syntax error at or near "TABLESAMPLE" +LINE 1: ...FROM (SELECT * FROM test_tablesample_append) as q TABLESAMPL... + ^ diff --git a/src/test/singlenode_regress/expected/arrays.out b/src/test/singlenode_regress/expected/arrays.out new file mode 100644 index 00000000000..82ad64d0f8b --- /dev/null +++ b/src/test/singlenode_regress/expected/arrays.out @@ -0,0 +1,2434 @@ +-- +-- ARRAYS +-- +CREATE TABLE arrtest ( + a int2[], + b int4[][][], + c name[], + d text[][], + e float8[], + f char(5)[], + g varchar(5)[] +); +-- +-- only the 'e' array is 0-based, the others are 1-based. +-- +INSERT INTO arrtest (a[1:5], b[1:1][1:2][1:2], c, d, f, g) + VALUES ('{1,2,3,4,5}', '{{{0,0},{1,2}}}', '{}', '{}', '{}', '{}'); +UPDATE arrtest SET e[0] = '1.1'; +UPDATE arrtest SET e[1] = '2.2'; +INSERT INTO arrtest (f) + VALUES ('{"too long"}'); +ERROR: value too long for type character(5) +INSERT INTO arrtest (a, b[1:2][1:2], c, d, e, f, g) + VALUES ('{11,12,23}', '{{3,4},{4,5}}', '{"foobar"}', + '{{"elt1", "elt2"}}', '{"3.4", "6.7"}', + '{"abc","abcde"}', '{"abc","abcde"}'); +INSERT INTO arrtest (a, b[1:2], c, d[1:2]) + VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}'); +INSERT INTO arrtest (b[2]) VALUES(now()); -- error, type mismatch +ERROR: subscripted assignment to "b" requires type integer but expression is of type timestamp with time zone +LINE 1: INSERT INTO arrtest (b[2]) VALUES(now()); + ^ +HINT: You will need to rewrite or cast the expression. +INSERT INTO arrtest (b[1:2]) VALUES(now()); -- error, type mismatch +ERROR: subscripted assignment to "b" requires type integer[] but expression is of type timestamp with time zone +LINE 1: INSERT INTO arrtest (b[1:2]) VALUES(now()); + ^ +HINT: You will need to rewrite or cast the expression. +SELECT * FROM arrtest; + a | b | c | d | e | f | g +-------------+-----------------+-----------+---------------+-----------------+-----------------+------------- + {1,2,3,4,5} | {{{0,0},{1,2}}} | {} | {} | [0:1]={1.1,2.2} | {} | {} + {11,12,23} | {{3,4},{4,5}} | {foobar} | {{elt1,elt2}} | {3.4,6.7} | {"abc ",abcde} | {abc,abcde} + {} | {3,4} | {foo,bar} | {bar,foo} | | | +(3 rows) + +SELECT arrtest.a[1], + arrtest.b[1][1][1], + arrtest.c[1], + arrtest.d[1][1], + arrtest.e[0] + FROM arrtest; + a | b | c | d | e +----+---+--------+------+----- + 1 | 0 | | | 1.1 + 11 | | foobar | elt1 | + | | foo | | +(3 rows) + +SELECT a[1], b[1][1][1], c[1], d[1][1], e[0] + FROM arrtest; + a | b | c | d | e +----+---+--------+------+----- + 1 | 0 | | | 1.1 + 11 | | foobar | elt1 | + | | foo | | +(3 rows) + +SELECT a[1:3], + b[1:1][1:2][1:2], + c[1:2], + d[1:1][1:2] + FROM arrtest; + a | b | c | d +------------+-----------------+-----------+--------------- + {1,2,3} | {{{0,0},{1,2}}} | {} | {} + {11,12,23} | {} | {foobar} | {{elt1,elt2}} + {} | {} | {foo,bar} | {} +(3 rows) + +SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + FROM arrtest; + a | b | c +---+---+--- + 1 | 3 | + 1 | 2 | 1 + | 1 | 1 +(3 rows) + +SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + FROM arrtest; + a | b | c +-------+-----------------+------- + [1:5] | [1:1][1:2][1:2] | + [1:3] | [1:2][1:2] | [1:1] + | [1:2] | [1:2] +(3 rows) + +-- returns nothing +SELECT * + FROM arrtest + WHERE a[1] < 5 and + c = '{"foobar"}'::_name; + a | b | c | d | e | f | g +---+---+---+---+---+---+--- +(0 rows) + +UPDATE arrtest + SET a[1:2] = '{16,25}' + WHERE NOT a = '{}'::_int2; +UPDATE arrtest + SET b[1:1][1:1][1:2] = '{113, 117}', + b[1:1][1:2][2:2] = '{142, 147}' + WHERE array_dims(b) = '[1:1][1:2][1:2]'; +UPDATE arrtest + SET c[2:2] = '{"new_word"}' + WHERE array_dims(c) is not null; +SELECT a,b,c FROM arrtest; + a | b | c +---------------+-----------------------+------------------- + {16,25,3,4,5} | {{{113,142},{1,147}}} | {} + {} | {3,4} | {foo,new_word} + {16,25,23} | {{3,4},{4,5}} | {foobar,new_word} +(3 rows) + +SELECT a[1:3], + b[1:1][1:2][1:2], + c[1:2], + d[1:1][2:2] + FROM arrtest; + a | b | c | d +------------+-----------------------+-------------------+---------- + {16,25,3} | {{{113,142},{1,147}}} | {} | {} + {} | {} | {foo,new_word} | {} + {16,25,23} | {} | {foobar,new_word} | {{elt2}} +(3 rows) + +SELECT b[1:1][2][2], + d[1:1][2] + FROM arrtest; + b | d +-----------------------+--------------- + {{{113,142},{1,147}}} | {} + {} | {} + {} | {{elt1,elt2}} +(3 rows) + +INSERT INTO arrtest(a) VALUES('{1,null,3}'); +SELECT a FROM arrtest; + a +--------------- + {16,25,3,4,5} + {} + {16,25,23} + {1,NULL,3} +(4 rows) + +UPDATE arrtest SET a[4] = NULL WHERE a[2] IS NULL; +SELECT a FROM arrtest WHERE a[2] IS NULL; + a +----------------- + [4:4]={NULL} + {1,NULL,3,NULL} +(2 rows) + +DELETE FROM arrtest WHERE a[2] IS NULL AND b IS NULL; +SELECT a,b,c FROM arrtest; + a | b | c +---------------+-----------------------+------------------- + {16,25,3,4,5} | {{{113,142},{1,147}}} | {} + {16,25,23} | {{3,4},{4,5}} | {foobar,new_word} + [4:4]={NULL} | {3,4} | {foo,new_word} +(3 rows) + +-- test mixed slice/scalar subscripting +select '{{1,2,3},{4,5,6},{7,8,9}}'::int[]; + int4 +--------------------------- + {{1,2,3},{4,5,6},{7,8,9}} +(1 row) + +select ('{{1,2,3},{4,5,6},{7,8,9}}'::int[])[1:2][2]; + int4 +--------------- + {{1,2},{4,5}} +(1 row) + +select '[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[]; + int4 +-------------------------------------- + [0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}} +(1 row) + +select ('[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[])[1:2][2]; + int4 +--------------- + {{5,6},{8,9}} +(1 row) + +-- +-- check subscription corner cases +-- +-- More subscripts than MAXDIM (6) +SELECT ('{}'::int[])[1][2][3][4][5][6][7]; +ERROR: number of array dimensions (7) exceeds the maximum allowed (6) +-- NULL index yields NULL when selecting +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL][1]; + int4 +------ + +(1 row) + +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL:1][1]; + int4 +------ + +(1 row) + +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][1:NULL][1]; + int4 +------ + +(1 row) + +-- NULL index in assignment is an error +UPDATE arrtest + SET c[NULL] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +ERROR: array subscript in assignment must not be null +UPDATE arrtest + SET c[NULL:1] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +ERROR: array subscript in assignment must not be null +UPDATE arrtest + SET c[1:NULL] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +ERROR: array subscript in assignment must not be null +-- Un-subscriptable type +SELECT (now())[1]; +ERROR: cannot subscript type timestamp with time zone because it does not support subscripting +LINE 1: SELECT (now())[1]; + ^ +-- test slices with empty lower and/or upper index +CREATE TEMP TABLE arrtest_s ( + a int2[], + b int2[][] +); +INSERT INTO arrtest_s VALUES ('{1,2,3,4,5}', '{{1,2,3}, {4,5,6}, {7,8,9}}'); +INSERT INTO arrtest_s VALUES ('[0:4]={1,2,3,4,5}', '[0:2][0:2]={{1,2,3}, {4,5,6}, {7,8,9}}'); +SELECT * FROM arrtest_s; + a | b +-------------------+-------------------------------------- + {1,2,3,4,5} | {{1,2,3},{4,5,6},{7,8,9}} + [0:4]={1,2,3,4,5} | [0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}} +(2 rows) + +SELECT a[:3], b[:2][:2] FROM arrtest_s; + a | b +-----------+--------------------------- + {1,2,3} | {{1,2},{4,5}} + {1,2,3,4} | {{1,2,3},{4,5,6},{7,8,9}} +(2 rows) + +SELECT a[2:], b[2:][2:] FROM arrtest_s; + a | b +-----------+--------------- + {2,3,4,5} | {{5,6},{8,9}} + {3,4,5} | {{9}} +(2 rows) + +SELECT a[:], b[:] FROM arrtest_s; + a | b +-------------+--------------------------- + {1,2,3,4,5} | {{1,2,3},{4,5,6},{7,8,9}} + {1,2,3,4,5} | {{1,2,3},{4,5,6},{7,8,9}} +(2 rows) + +-- updates +UPDATE arrtest_s SET a[:3] = '{11, 12, 13}', b[:2][:2] = '{{11,12}, {14,15}}' + WHERE array_lower(a,1) = 1; +SELECT * FROM arrtest_s; + a | b +-------------------+-------------------------------------- + [0:4]={1,2,3,4,5} | [0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}} + {11,12,13,4,5} | {{11,12,3},{14,15,6},{7,8,9}} +(2 rows) + +UPDATE arrtest_s SET a[3:] = '{23, 24, 25}', b[2:][2:] = '{{25,26}, {28,29}}'; +SELECT * FROM arrtest_s; + a | b +---------------------+--------------------------------------- + [0:4]={1,2,3,23,24} | [0:2][0:2]={{1,2,3},{4,5,6},{7,8,25}} + {11,12,23,24,25} | {{11,12,3},{14,25,26},{7,28,29}} +(2 rows) + +UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; +SELECT * FROM arrtest_s; + a | b +------------------------+--------------------------------------- + [0:4]={11,12,13,14,15} | [0:2][0:2]={{1,2,3},{4,5,6},{7,8,25}} + {11,12,13,14,15} | {{11,12,3},{14,25,26},{7,28,29}} +(2 rows) + +UPDATE arrtest_s SET a[:] = '{23, 24, 25}'; -- fail, too small +ERROR: source array too small +INSERT INTO arrtest_s VALUES(NULL, NULL); +UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; -- fail, no good with null +ERROR: array slice subscript must provide both boundaries +DETAIL: When assigning to a slice of an empty array value, slice boundaries must be fully specified. +-- check with fixed-length-array type, such as point +SELECT f1[0:1] FROM POINT_TBL; +ERROR: slices of fixed-length arrays not implemented +SELECT f1[0:] FROM POINT_TBL; +ERROR: slices of fixed-length arrays not implemented +SELECT f1[:1] FROM POINT_TBL; +ERROR: slices of fixed-length arrays not implemented +SELECT f1[:] FROM POINT_TBL; +ERROR: slices of fixed-length arrays not implemented +-- subscript assignments to fixed-width result in NULL if previous value is NULL +UPDATE point_tbl SET f1[0] = 10 WHERE f1 IS NULL RETURNING *; + f1 +---- + +(1 row) + +INSERT INTO point_tbl(f1[0]) VALUES(0) RETURNING *; + f1 +---- + +(1 row) + +-- NULL assignments get ignored +UPDATE point_tbl SET f1[0] = NULL WHERE f1::text = '(10,10)'::point::text RETURNING *; + f1 +--------- + (10,10) +(1 row) + +-- but non-NULL subscript assignments work +UPDATE point_tbl SET f1[0] = -10, f1[1] = -10 WHERE f1::text = '(10,10)'::point::text RETURNING *; + f1 +----------- + (-10,-10) +(1 row) + +-- but not to expand the range +UPDATE point_tbl SET f1[3] = 10 WHERE f1::text = '(-10,-10)'::point::text RETURNING *; +ERROR: array subscript out of range +-- +-- test array extension +-- +CREATE TEMP TABLE arrtest1 (i int[], t text[]); +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +select * from arrtest1; + i | t +--------------+--------------------- + {1,2,NULL,4} | {one,two,NULL,four} +(1 row) + +update arrtest1 set i[2] = 22, t[2] = 'twenty-two'; +select * from arrtest1; + i | t +---------------+---------------------------- + {1,22,NULL,4} | {one,twenty-two,NULL,four} +(1 row) + +update arrtest1 set i[5] = 5, t[5] = 'five'; +select * from arrtest1; + i | t +-----------------+--------------------------------- + {1,22,NULL,4,5} | {one,twenty-two,NULL,four,five} +(1 row) + +update arrtest1 set i[8] = 8, t[8] = 'eight'; +select * from arrtest1; + i | t +-----------------------------+------------------------------------------------- + {1,22,NULL,4,5,NULL,NULL,8} | {one,twenty-two,NULL,four,five,NULL,NULL,eight} +(1 row) + +update arrtest1 set i[0] = 0, t[0] = 'zero'; +select * from arrtest1; + i | t +-------------------------------------+------------------------------------------------------------ + [0:8]={0,1,22,NULL,4,5,NULL,NULL,8} | [0:8]={zero,one,twenty-two,NULL,four,five,NULL,NULL,eight} +(1 row) + +update arrtest1 set i[-3] = -3, t[-3] = 'minus-three'; +select * from arrtest1; + i | t +---------------------------------------------------+----------------------------------------------------------------------------------- + [-3:8]={-3,NULL,NULL,0,1,22,NULL,4,5,NULL,NULL,8} | [-3:8]={minus-three,NULL,NULL,zero,one,twenty-two,NULL,four,five,NULL,NULL,eight} +(1 row) + +update arrtest1 set i[0:2] = array[10,11,12], t[0:2] = array['ten','eleven','twelve']; +select * from arrtest1; + i | t +-----------------------------------------------------+--------------------------------------------------------------------------------- + [-3:8]={-3,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,8} | [-3:8]={minus-three,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,eight} +(1 row) + +update arrtest1 set i[8:10] = array[18,null,20], t[8:10] = array['p18',null,'p20']; +select * from arrtest1; + i | t +---------------------------------------------------------------+----------------------------------------------------------------------------------------- + [-3:10]={-3,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20} | [-3:10]={minus-three,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20} +(1 row) + +update arrtest1 set i[11:12] = array[null,22], t[11:12] = array[null,'p22']; +select * from arrtest1; + i | t +-----------------------------------------------------------------------+-------------------------------------------------------------------------------------------------- + [-3:12]={-3,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22} | [-3:12]={minus-three,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22} +(1 row) + +update arrtest1 set i[15:16] = array[null,26], t[15:16] = array[null,'p26']; +select * from arrtest1; + i | t +-----------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------- + [-3:16]={-3,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22,NULL,NULL,NULL,26} | [-3:16]={minus-three,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22,NULL,NULL,NULL,p26} +(1 row) + +update arrtest1 set i[-5:-3] = array[-15,-14,-13], t[-5:-3] = array['m15','m14','m13']; +select * from arrtest1; + i | t +--------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------- + [-5:16]={-15,-14,-13,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22,NULL,NULL,NULL,26} | [-5:16]={m15,m14,m13,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22,NULL,NULL,NULL,p26} +(1 row) + +update arrtest1 set i[-7:-6] = array[-17,null], t[-7:-6] = array['m17',null]; +select * from arrtest1; + i | t +-----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------ + [-7:16]={-17,NULL,-15,-14,-13,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22,NULL,NULL,NULL,26} | [-7:16]={m17,NULL,m15,m14,m13,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22,NULL,NULL,NULL,p26} +(1 row) + +update arrtest1 set i[-12:-10] = array[-22,null,-20], t[-12:-10] = array['m22',null,'m20']; +select * from arrtest1; + i | t +-----------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------ + [-12:16]={-22,NULL,-20,NULL,NULL,-17,NULL,-15,-14,-13,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22,NULL,NULL,NULL,26} | [-12:16]={m22,NULL,m20,NULL,NULL,m17,NULL,m15,m14,m13,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22,NULL,NULL,NULL,p26} +(1 row) + +delete from arrtest1; +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +select * from arrtest1; + i | t +--------------+--------------------- + {1,2,NULL,4} | {one,two,NULL,four} +(1 row) + +update arrtest1 set i[0:5] = array[0,1,2,null,4,5], t[0:5] = array['z','p1','p2',null,'p4','p5']; +select * from arrtest1; + i | t +------------------------+---------------------------- + [0:5]={0,1,2,NULL,4,5} | [0:5]={z,p1,p2,NULL,p4,p5} +(1 row) + +-- +-- array expressions and operators +-- +-- table creation and INSERTs +CREATE TEMP TABLE arrtest2 (i integer ARRAY[4], f float8[], n numeric[], t text[], d timestamp[]); +INSERT INTO arrtest2 VALUES( + ARRAY[[[113,142],[1,147]]], + ARRAY[1.1,1.2,1.3]::float8[], + ARRAY[1.1,1.2,1.3], + ARRAY[[['aaa','aab'],['aba','abb'],['aca','acb']],[['baa','bab'],['bba','bbb'],['bca','bcb']]], + ARRAY['19620326','19931223','19970117']::timestamp[] +); +-- some more test data +CREATE TEMP TABLE arrtest_f (f0 int, f1 text, f2 float8); +insert into arrtest_f values(1,'cat1',1.21); +insert into arrtest_f values(2,'cat1',1.24); +insert into arrtest_f values(3,'cat1',1.18); +insert into arrtest_f values(4,'cat1',1.26); +insert into arrtest_f values(5,'cat1',1.15); +insert into arrtest_f values(6,'cat2',1.15); +insert into arrtest_f values(7,'cat2',1.26); +insert into arrtest_f values(8,'cat2',1.32); +insert into arrtest_f values(9,'cat2',1.30); +CREATE TEMP TABLE arrtest_i (f0 int, f1 text, f2 int); +insert into arrtest_i values(1,'cat1',21); +insert into arrtest_i values(2,'cat1',24); +insert into arrtest_i values(3,'cat1',18); +insert into arrtest_i values(4,'cat1',26); +insert into arrtest_i values(5,'cat1',15); +insert into arrtest_i values(6,'cat2',15); +insert into arrtest_i values(7,'cat2',26); +insert into arrtest_i values(8,'cat2',32); +insert into arrtest_i values(9,'cat2',30); +-- expressions +SELECT t.f[1][3][1] AS "131", t.f[2][2][1] AS "221" FROM ( + SELECT ARRAY[[[111,112],[121,122],[131,132]],[[211,212],[221,122],[231,232]]] AS f +) AS t; + 131 | 221 +-----+----- + 131 | 221 +(1 row) + +SELECT ARRAY[[[[[['hello'],['world']]]]]]; + array +--------------------------- + {{{{{{hello},{world}}}}}} +(1 row) + +SELECT ARRAY[ARRAY['hello'],ARRAY['world']]; + array +------------------- + {{hello},{world}} +(1 row) + +SELECT ARRAY(select f2 from arrtest_f order by f2) AS "ARRAY"; + ARRAY +----------------------------------------------- + {1.15,1.15,1.18,1.21,1.24,1.26,1.26,1.3,1.32} +(1 row) + +-- with nulls +SELECT '{1,null,3}'::int[]; + int4 +------------ + {1,NULL,3} +(1 row) + +SELECT ARRAY[1,NULL,3]; + array +------------ + {1,NULL,3} +(1 row) + +-- functions +SELECT array_append(array[42], 6) AS "{42,6}"; + {42,6} +-------- + {42,6} +(1 row) + +SELECT array_prepend(6, array[42]) AS "{6,42}"; + {6,42} +-------- + {6,42} +(1 row) + +SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}"; + {1,2,3,4} +----------- + {1,2,3,4} +(1 row) + +SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; + {{1,2},{3,4},{5,6}} +--------------------- + {{1,2},{3,4},{5,6}} +(1 row) + +SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}"; + {{3,4},{5,6},{1,2}} +--------------------- + {{3,4},{5,6},{1,2}} +(1 row) + +SELECT array_position(ARRAY[1,2,3,4,5], 4); + array_position +---------------- + 4 +(1 row) + +SELECT array_position(ARRAY[5,3,4,2,1], 4); + array_position +---------------- + 3 +(1 row) + +SELECT array_position(ARRAY[[1,2],[3,4]], 3); +ERROR: searching for elements in multidimensional arrays is not supported +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon'); + array_position +---------------- + 2 +(1 row) + +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'sat'); + array_position +---------------- + 7 +(1 row) + +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], NULL); + array_position +---------------- + +(1 row) + +SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], NULL); + array_position +---------------- + 6 +(1 row) + +SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], 'sat'); + array_position +---------------- + 8 +(1 row) + +SELECT array_positions(NULL, 10); + array_positions +----------------- + +(1 row) + +SELECT array_positions(NULL, NULL::int); + array_positions +----------------- + +(1 row) + +SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], 4); + array_positions +----------------- + {4,10} +(1 row) + +SELECT array_positions(ARRAY[[1,2],[3,4]], 4); +ERROR: searching for elements in multidimensional arrays is not supported +SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], NULL); + array_positions +----------------- + {} +(1 row) + +SELECT array_positions(ARRAY[1,2,3,NULL,5,6,1,2,3,NULL,5,6], NULL); + array_positions +----------------- + {4,10} +(1 row) + +SELECT array_length(array_positions(ARRAY(SELECT 'AAAAAAAAAAAAAAAAAAAAAAAAA'::text || i % 10 + FROM generate_series(1,100) g(i)), + 'AAAAAAAAAAAAAAAAAAAAAAAAA5'), 1); + array_length +-------------- + 10 +(1 row) + +DO $$ +DECLARE + o int; + a int[] := ARRAY[1,2,3,2,3,1,2]; +BEGIN + o := array_position(a, 2); + WHILE o IS NOT NULL + LOOP + RAISE NOTICE '%', o; + o := array_position(a, 2, o + 1); + END LOOP; +END +$$ LANGUAGE plpgsql; +NOTICE: 2 +NOTICE: 4 +NOTICE: 7 +SELECT array_position('[2:4]={1,2,3}'::int[], 1); + array_position +---------------- + 2 +(1 row) + +SELECT array_positions('[2:4]={1,2,3}'::int[], 1); + array_positions +----------------- + {2} +(1 row) + +SELECT + array_position(ids, (1, 1)), + array_positions(ids, (1, 1)) + FROM +(VALUES + (ARRAY[(0, 0), (1, 1)]), + (ARRAY[(1, 1)]) +) AS f (ids); + array_position | array_positions +----------------+----------------- + 2 | {2} + 1 | {1} +(2 rows) + +-- operators +SELECT a FROM arrtest WHERE b = ARRAY[[[113,142],[1,147]]]; + a +--------------- + {16,25,3,4,5} +(1 row) + +SELECT NOT ARRAY[1.1,1.2,1.3] = ARRAY[1.1,1.2,1.3] AS "FALSE"; + FALSE +------- + f +(1 row) + +SELECT ARRAY[1,2] || 3 AS "{1,2,3}"; + {1,2,3} +--------- + {1,2,3} +(1 row) + +SELECT 0 || ARRAY[1,2] AS "{0,1,2}"; + {0,1,2} +--------- + {0,1,2} +(1 row) + +SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}"; + {1,2,3,4} +----------- + {1,2,3,4} +(1 row) + +SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; + ARRAY +-------------------------------------- + {{{hello,world}},{{happy,birthday}}} +(1 row) + +SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; + {{1,2},{3,4},{5,6}} +--------------------- + {{1,2},{3,4},{5,6}} +(1 row) + +SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; + {0,0,1,1,2,2} +--------------- + {0,0,1,1,2,2} +(1 row) + +SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; + {0,1,2,3} +----------- + {0,1,2,3} +(1 row) + +SELECT ARRAY[1.1] || ARRAY[2,3,4]; + ?column? +------------- + {1.1,2,3,4} +(1 row) + +SELECT array_agg(x) || array_agg(x) FROM (VALUES (ROW(1,2)), (ROW(3,4))) v(x); + ?column? +----------------------------------- + {"(1,2)","(3,4)","(1,2)","(3,4)"} +(1 row) + +SELECT ROW(1,2) || array_agg(x) FROM (VALUES (ROW(3,4)), (ROW(5,6))) v(x); + ?column? +--------------------------- + {"(1,2)","(3,4)","(5,6)"} +(1 row) + +SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(6 rows) + +SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(6 rows) + +SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 53 | {38,17} | {AAAAAAAAAAA21658} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} +(8 rows) + +SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 53 | {38,17} | {AAAAAAAAAAA21658} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} +(8 rows) + +SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} +(3 rows) + +SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 53 | {38,17} | {AAAAAAAAAAA21658} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(11 rows) + +SELECT * FROM array_op_test WHERE i <@ '{38,34,32,89}' ORDER BY seqno; + seqno | i | t +-------+---------------+---------------------------------------------------------------------------------------------------------------------------- + 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 101 | {} | {} +(4 rows) + +SELECT * FROM array_op_test WHERE i = '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +SELECT * FROM array_op_test WHERE i @> '{}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | {92,75,71,52,64,83} | {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} + 2 | {3,6} | {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} + 3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} + 4 | {71,39,99,55,33,75,45} | {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} + 5 | {50,42,77,50,4} | {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 7 | {12,51,88,64,8} | {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} + 8 | {60,84} | {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} + 9 | {56,52,35,27,80,44,81,22} | {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} + 10 | {71,5,45} | {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} + 11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 13 | {3,52,34,23} | {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} + 14 | {78,57,19} | {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 16 | {14,63,85,11} | {AAAAAA66777} + 17 | {7,10,81,85} | {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} + 18 | {1} | {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 20 | {72,89,70,51,54,37,8,49,79} | {AAAAAA58494} + 21 | {2,8,65,10,5,79,43} | {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} + 24 | {94,61,99,35,48} | {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} + 25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449} + 26 | {71,10,9,69,75} | {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} + 27 | {94} | {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} + 28 | {14,33,6,34,14} | {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} + 29 | {39,21} | {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} + 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} + 31 | {80,24,18,21,54} | {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} + 32 | {58,79,82,80,67,75,98,10,41} | {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} + 33 | {74,73} | {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} + 34 | {70,45} | {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} + 35 | {23,40} | {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} + 36 | {79,82,14,52,30,5,79} | {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} + 37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} + 38 | {59,5,4,95,28} | {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} + 39 | {82,43,99,16,74} | {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} + 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} + 41 | {19,26,63,12,93,73,27,94} | {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} + 42 | {15,76,82,75,8,91} | {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} + 43 | {39,87,91,97,79,28} | {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} + 44 | {40,58,68,29,54} | {AAAAAAA81898,AAAAAA66777,AAAAAA98232} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 46 | {53,24} | {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} + 47 | {98,23,64,12,75,61} | {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} + 48 | {76,14} | {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} + 49 | {56,5,54,37,49} | {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} + 50 | {20,12,37,64,93} | {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} + 51 | {47} | {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} + 52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} + 53 | {38,17} | {AAAAAAAAAAA21658} + 54 | {70,47} | {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} + 55 | {47,79,47,64,72,25,71,24,93} | {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} + 56 | {33,7,60,54,93,90,77,85,39} | {AAAAAAAAAAAAAAAAAA32918,AA42406} + 57 | {23,45,10,42,36,21,9,96} | {AAAAAAAAAAAAAAAAAAA70415} + 58 | {92} | {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} + 59 | {9,69,46,77} | {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} + 60 | {62,2,59,38,89} | {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} + 61 | {72,2,44,95,54,54,13} | {AAAAAAAAAAAAAAAAAAA91804} + 62 | {83,72,29,73} | {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} + 63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} + 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 66 | {31,23,70,52,4,33,48,25} | {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} + 67 | {31,94,7,10} | {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} + 68 | {90,43,38} | {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} + 69 | {67,35,99,85,72,86,44} | {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} + 70 | {56,70,83} | {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} + 71 | {74,26} | {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 73 | {88,25,96,78,65,15,29,19} | {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 75 | {12,96,83,24,71,89,55} | {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} + 76 | {92,55,10,7} | {AAAAAAAAAAAAAAA67062} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 78 | {55,89,44,84,34} | {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 80 | {74,89,44,80,0} | {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} + 81 | {63,77,54,48,61,53,97} | {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} + 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} + 83 | {14,10} | {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} + 84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} + 85 | {39,60} | {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} + 86 | {33,81,72,74,45,36,82} | {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} + 87 | {57,27,50,12,97,68} | {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} + 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 90 | {88,75} | {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} + 91 | {78} | {AAAAAAAAAAAAA62007,AAA99043} + 92 | {85,63,49,45} | {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} + 93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} + 94 | {98,9,85,62,88,91,60,61,38,86} | {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} + 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} + 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 99 | {37,86} | {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} + 101 | {} | {} + 102 | {NULL} | {NULL} +(102 rows) + +SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; + seqno | i | t +-------+--------+-------- + 102 | {NULL} | {NULL} +(1 row) + +SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; + seqno | i | t +-------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} +(4 rows) + +SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno; + seqno | i | t +-------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} +(4 rows) + +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno; + seqno | i | t +-------+------------------+-------------------------------------------------------------------- + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} +(3 rows) + +SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno; + seqno | i | t +-------+------------------+-------------------------------------------------------------------- + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} +(3 rows) + +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; + seqno | i | t +-------+------+-------------------------------------------------------------------- + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} +(1 row) + +SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; + seqno | i | t +-------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} +(6 rows) + +SELECT * FROM array_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}' ORDER BY seqno; + seqno | i | t +-------+--------------------+----------------------------------------------------------------------------------------------------------- + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 101 | {} | {} +(3 rows) + +SELECT * FROM array_op_test WHERE t = '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +SELECT * FROM array_op_test WHERE t @> '{}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | {92,75,71,52,64,83} | {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} + 2 | {3,6} | {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} + 3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} + 4 | {71,39,99,55,33,75,45} | {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} + 5 | {50,42,77,50,4} | {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 7 | {12,51,88,64,8} | {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} + 8 | {60,84} | {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} + 9 | {56,52,35,27,80,44,81,22} | {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} + 10 | {71,5,45} | {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} + 11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 13 | {3,52,34,23} | {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} + 14 | {78,57,19} | {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 16 | {14,63,85,11} | {AAAAAA66777} + 17 | {7,10,81,85} | {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} + 18 | {1} | {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 20 | {72,89,70,51,54,37,8,49,79} | {AAAAAA58494} + 21 | {2,8,65,10,5,79,43} | {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} + 24 | {94,61,99,35,48} | {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} + 25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449} + 26 | {71,10,9,69,75} | {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} + 27 | {94} | {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} + 28 | {14,33,6,34,14} | {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} + 29 | {39,21} | {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} + 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} + 31 | {80,24,18,21,54} | {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} + 32 | {58,79,82,80,67,75,98,10,41} | {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} + 33 | {74,73} | {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} + 34 | {70,45} | {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} + 35 | {23,40} | {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} + 36 | {79,82,14,52,30,5,79} | {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} + 37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} + 38 | {59,5,4,95,28} | {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} + 39 | {82,43,99,16,74} | {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} + 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} + 41 | {19,26,63,12,93,73,27,94} | {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} + 42 | {15,76,82,75,8,91} | {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} + 43 | {39,87,91,97,79,28} | {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} + 44 | {40,58,68,29,54} | {AAAAAAA81898,AAAAAA66777,AAAAAA98232} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 46 | {53,24} | {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} + 47 | {98,23,64,12,75,61} | {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} + 48 | {76,14} | {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} + 49 | {56,5,54,37,49} | {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} + 50 | {20,12,37,64,93} | {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} + 51 | {47} | {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} + 52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} + 53 | {38,17} | {AAAAAAAAAAA21658} + 54 | {70,47} | {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} + 55 | {47,79,47,64,72,25,71,24,93} | {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} + 56 | {33,7,60,54,93,90,77,85,39} | {AAAAAAAAAAAAAAAAAA32918,AA42406} + 57 | {23,45,10,42,36,21,9,96} | {AAAAAAAAAAAAAAAAAAA70415} + 58 | {92} | {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} + 59 | {9,69,46,77} | {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} + 60 | {62,2,59,38,89} | {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} + 61 | {72,2,44,95,54,54,13} | {AAAAAAAAAAAAAAAAAAA91804} + 62 | {83,72,29,73} | {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} + 63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} + 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 66 | {31,23,70,52,4,33,48,25} | {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} + 67 | {31,94,7,10} | {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} + 68 | {90,43,38} | {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} + 69 | {67,35,99,85,72,86,44} | {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} + 70 | {56,70,83} | {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} + 71 | {74,26} | {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 73 | {88,25,96,78,65,15,29,19} | {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 75 | {12,96,83,24,71,89,55} | {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} + 76 | {92,55,10,7} | {AAAAAAAAAAAAAAA67062} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 78 | {55,89,44,84,34} | {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 80 | {74,89,44,80,0} | {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} + 81 | {63,77,54,48,61,53,97} | {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} + 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} + 83 | {14,10} | {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} + 84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} + 85 | {39,60} | {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} + 86 | {33,81,72,74,45,36,82} | {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} + 87 | {57,27,50,12,97,68} | {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} + 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 90 | {88,75} | {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} + 91 | {78} | {AAAAAAAAAAAAA62007,AAA99043} + 92 | {85,63,49,45} | {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} + 93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} + 94 | {98,9,85,62,88,91,60,61,38,86} | {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} + 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} + 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 99 | {37,86} | {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} + 101 | {} | {} + 102 | {NULL} | {NULL} +(102 rows) + +SELECT * FROM array_op_test WHERE t && '{}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_op_test WHERE t <@ '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +-- array casts +SELECT ARRAY[1,2,3]::text[]::int[]::float8[] AS "{1,2,3}"; + {1,2,3} +--------- + {1,2,3} +(1 row) + +SELECT pg_typeof(ARRAY[1,2,3]::text[]::int[]::float8[]) AS "double precision[]"; + double precision[] +-------------------- + double precision[] +(1 row) + +SELECT ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[] AS "{{a,bc},{def,hijk}}"; + {{a,bc},{def,hijk}} +--------------------- + {{a,bc},{def,hijk}} +(1 row) + +SELECT pg_typeof(ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[]) AS "character varying[]"; + character varying[] +--------------------- + character varying[] +(1 row) + +SELECT CAST(ARRAY[[[[[['a','bb','ccc']]]]]] as text[]) as "{{{{{{a,bb,ccc}}}}}}"; + {{{{{{a,bb,ccc}}}}}} +---------------------- + {{{{{{a,bb,ccc}}}}}} +(1 row) + +SELECT NULL::text[]::int[] AS "NULL"; + NULL +------ + +(1 row) + +-- scalar op any/all (array) +select 33 = any ('{1,2,3}'); + ?column? +---------- + f +(1 row) + +select 33 = any ('{1,2,33}'); + ?column? +---------- + t +(1 row) + +select 33 = all ('{1,2,33}'); + ?column? +---------- + f +(1 row) + +select 33 >= all ('{1,2,33}'); + ?column? +---------- + t +(1 row) + +-- boundary cases +select null::int >= all ('{1,2,33}'); + ?column? +---------- + +(1 row) + +select null::int >= all ('{}'); + ?column? +---------- + t +(1 row) + +select null::int >= any ('{}'); + ?column? +---------- + f +(1 row) + +-- cross-datatype +select 33.4 = any (array[1,2,3]); + ?column? +---------- + f +(1 row) + +select 33.4 > all (array[1,2,3]); + ?column? +---------- + t +(1 row) + +-- errors +select 33 * any ('{1,2,3}'); +ERROR: op ANY/ALL (array) requires operator to yield boolean +LINE 1: select 33 * any ('{1,2,3}'); + ^ +select 33 * any (44); +ERROR: op ANY/ALL (array) requires array on right side +LINE 1: select 33 * any (44); + ^ +-- nulls +select 33 = any (null::int[]); + ?column? +---------- + +(1 row) + +select null::int = any ('{1,2,3}'); + ?column? +---------- + +(1 row) + +select 33 = any ('{1,null,3}'); + ?column? +---------- + +(1 row) + +select 33 = any ('{1,null,33}'); + ?column? +---------- + t +(1 row) + +select 33 = all (null::int[]); + ?column? +---------- + +(1 row) + +select null::int = all ('{1,2,3}'); + ?column? +---------- + +(1 row) + +select 33 = all ('{1,null,3}'); + ?column? +---------- + f +(1 row) + +select 33 = all ('{33,null,33}'); + ?column? +---------- + +(1 row) + +-- nulls later in the bitmap +SELECT -1 != ALL(ARRAY(SELECT NULLIF(g.i, 900) FROM generate_series(1,1000) g(i))); + ?column? +---------- + +(1 row) + +-- test indexes on arrays +create temp table arr_tbl (f1 int[] unique); +insert into arr_tbl values ('{1,2,3}'); +insert into arr_tbl values ('{1,2}'); +-- failure expected: +insert into arr_tbl values ('{1,2,3}'); +ERROR: duplicate key value violates unique constraint "arr_tbl_f1_key" +DETAIL: Key (f1)=({1,2,3}) already exists. +insert into arr_tbl values ('{2,3,4}'); +insert into arr_tbl values ('{1,5,3}'); +insert into arr_tbl values ('{1,2,10}'); +set enable_seqscan to off; +set enable_bitmapscan to off; +select * from arr_tbl where f1 > '{1,2,3}' and f1 <= '{1,5,3}'; + f1 +---------- + {1,2,10} + {1,5,3} +(2 rows) + +select * from arr_tbl where f1 >= '{1,2,3}' and f1 < '{1,5,3}'; + f1 +---------- + {1,2,3} + {1,2,10} +(2 rows) + +-- test ON CONFLICT DO UPDATE with arrays +create temp table arr_pk_tbl (pk int4 primary key, f1 int[]); +insert into arr_pk_tbl values (1, '{1,2,3}'); +insert into arr_pk_tbl values (1, '{3,4,5}') on conflict (pk) + do update set f1[1] = excluded.f1[1], f1[3] = excluded.f1[3] + returning pk, f1; + pk | f1 +----+--------- + 1 | {3,2,5} +(1 row) + +insert into arr_pk_tbl(pk, f1[1:2]) values (1, '{6,7,8}') on conflict (pk) + do update set f1[1] = excluded.f1[1], + f1[2] = excluded.f1[2], + f1[3] = excluded.f1[3] + returning pk, f1; + pk | f1 +----+------------ + 1 | {6,7,NULL} +(1 row) + +-- note: if above selects don't produce the expected tuple order, +-- then you didn't get an indexscan plan, and something is busted. +reset enable_seqscan; +reset enable_bitmapscan; +-- test [not] (like|ilike) (any|all) (...) +select 'foo' like any (array['%a', '%o']); -- t + ?column? +---------- + t +(1 row) + +select 'foo' like any (array['%a', '%b']); -- f + ?column? +---------- + f +(1 row) + +select 'foo' like all (array['f%', '%o']); -- t + ?column? +---------- + t +(1 row) + +select 'foo' like all (array['f%', '%b']); -- f + ?column? +---------- + f +(1 row) + +select 'foo' not like any (array['%a', '%b']); -- t + ?column? +---------- + t +(1 row) + +select 'foo' not like all (array['%a', '%o']); -- f + ?column? +---------- + f +(1 row) + +select 'foo' ilike any (array['%A', '%O']); -- t + ?column? +---------- + t +(1 row) + +select 'foo' ilike all (array['F%', '%O']); -- t + ?column? +---------- + t +(1 row) + +-- +-- General array parser tests +-- +-- none of the following should be accepted +select '{{1,{2}},{2,3}}'::text[]; +ERROR: malformed array literal: "{{1,{2}},{2,3}}" +LINE 1: select '{{1,{2}},{2,3}}'::text[]; + ^ +DETAIL: Unexpected "{" character. +select '{{},{}}'::text[]; +ERROR: malformed array literal: "{{},{}}" +LINE 1: select '{{},{}}'::text[]; + ^ +DETAIL: Unexpected "}" character. +select E'{{1,2},\\{2,3}}'::text[]; +ERROR: malformed array literal: "{{1,2},\{2,3}}" +LINE 1: select E'{{1,2},\\{2,3}}'::text[]; + ^ +DETAIL: Unexpected "\" character. +select '{{"1 2" x},{3}}'::text[]; +ERROR: malformed array literal: "{{"1 2" x},{3}}" +LINE 1: select '{{"1 2" x},{3}}'::text[]; + ^ +DETAIL: Unexpected array element. +select '{}}'::text[]; +ERROR: malformed array literal: "{}}" +LINE 1: select '{}}'::text[]; + ^ +DETAIL: Junk after closing right brace. +select '{ }}'::text[]; +ERROR: malformed array literal: "{ }}" +LINE 1: select '{ }}'::text[]; + ^ +DETAIL: Junk after closing right brace. +select array[]; +ERROR: cannot determine type of empty array +LINE 1: select array[]; + ^ +HINT: Explicitly cast to the desired type, for example ARRAY[]::integer[]. +-- none of the above should be accepted +-- all of the following should be accepted +select '{}'::text[]; + text +------ + {} +(1 row) + +select '{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[]; + text +----------------------------------------------- + {{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}} +(1 row) + +select '{0 second ,0 second}'::interval[]; + interval +--------------- + {"@ 0","@ 0"} +(1 row) + +select '{ { "," } , { 3 } }'::text[]; + text +------------- + {{","},{3}} +(1 row) + +select ' { { " 0 second " , 0 second } }'::text[]; + text +------------------------------- + {{" 0 second ","0 second"}} +(1 row) + +select '{ + 0 second, + @ 1 hour @ 42 minutes @ 20 seconds + }'::interval[]; + interval +------------------------------------ + {"@ 0","@ 1 hour 42 mins 20 secs"} +(1 row) + +select array[]::text[]; + array +------- + {} +(1 row) + +select '[0:1]={1.1,2.2}'::float8[]; + float8 +----------------- + [0:1]={1.1,2.2} +(1 row) + +-- all of the above should be accepted +-- tests for array aggregates +CREATE TEMP TABLE arraggtest ( f1 INT[], f2 TEXT[][], f3 FLOAT[]); +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{1,2,3,4}','{{grey,red},{blue,blue}}','{1.6, 0.0}'); +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{1,2,3}','{{grey,red},{grey,blue}}','{1.6}'); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + max | min | max | min | max | min +-----------+---------+--------------------------+--------------------------+---------+------- + {1,2,3,4} | {1,2,3} | {{grey,red},{grey,blue}} | {{grey,red},{blue,blue}} | {1.6,0} | {1.6} +(1 row) + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{3,3,2,4,5,6}','{{white,yellow},{pink,orange}}','{2.1,3.3,1.8,1.7,1.6}'); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + max | min | max | min | max | min +---------------+---------+--------------------------------+--------------------------+-----------------------+------- + {3,3,2,4,5,6} | {1,2,3} | {{white,yellow},{pink,orange}} | {{grey,red},{blue,blue}} | {2.1,3.3,1.8,1.7,1.6} | {1.6} +(1 row) + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{2}','{{black,red},{green,orange}}','{1.6,2.2,2.6,0.4}'); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + max | min | max | min | max | min +---------------+---------+--------------------------------+------------------------------+-----------------------+------- + {3,3,2,4,5,6} | {1,2,3} | {{white,yellow},{pink,orange}} | {{black,red},{green,orange}} | {2.1,3.3,1.8,1.7,1.6} | {1.6} +(1 row) + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{4,2,6,7,8,1}','{{red},{black},{purple},{blue},{blue}}',NULL); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + max | min | max | min | max | min +---------------+---------+--------------------------------+------------------------------+-----------------------+------- + {4,2,6,7,8,1} | {1,2,3} | {{white,yellow},{pink,orange}} | {{black,red},{green,orange}} | {2.1,3.3,1.8,1.7,1.6} | {1.6} +(1 row) + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{}','{{pink,white,blue,red,grey,orange}}','{2.1,1.87,1.4,2.2}'); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + max | min | max | min | max | min +---------------+-----+--------------------------------+------------------------------+-----------------------+------- + {4,2,6,7,8,1} | {} | {{white,yellow},{pink,orange}} | {{black,red},{green,orange}} | {2.1,3.3,1.8,1.7,1.6} | {1.6} +(1 row) + +-- A few simple tests for arrays of composite types +create type comptype as (f1 int, f2 text); +create table comptable (c1 comptype, c2 comptype[]); +-- XXX would like to not have to specify row() construct types here ... +insert into comptable + values (row(1,'foo'), array[row(2,'bar')::comptype, row(3,'baz')::comptype]); +-- check that implicitly named array type _comptype isn't a problem +create type _comptype as enum('fooey'); +select * from comptable; + c1 | c2 +---------+----------------------- + (1,foo) | {"(2,bar)","(3,baz)"} +(1 row) + +select c2[2].f2 from comptable; + f2 +----- + baz +(1 row) + +drop type _comptype; +drop table comptable; +drop type comptype; +create or replace function unnest1(anyarray) +returns setof anyelement as $$ +select $1[s] from generate_subscripts($1,1) g(s); +$$ language sql immutable; +create or replace function unnest2(anyarray) +returns setof anyelement as $$ +select $1[s1][s2] from generate_subscripts($1,1) g1(s1), + generate_subscripts($1,2) g2(s2); +$$ language sql immutable; +select * from unnest1(array[1,2,3]); + unnest1 +--------- + 1 + 2 + 3 +(3 rows) + +select * from unnest2(array[[1,2,3],[4,5,6]]); + unnest2 +--------- + 1 + 2 + 3 + 4 + 5 + 6 +(6 rows) + +drop function unnest1(anyarray); +drop function unnest2(anyarray); +select array_fill(null::integer, array[3,3],array[2,2]); + array_fill +----------------------------------------------------------------- + [2:4][2:4]={{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}} +(1 row) + +select array_fill(null::integer, array[3,3]); + array_fill +------------------------------------------------------ + {{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}} +(1 row) + +select array_fill(null::text, array[3,3],array[2,2]); + array_fill +----------------------------------------------------------------- + [2:4][2:4]={{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}} +(1 row) + +select array_fill(null::text, array[3,3]); + array_fill +------------------------------------------------------ + {{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}} +(1 row) + +select array_fill(7, array[3,3],array[2,2]); + array_fill +-------------------------------------- + [2:4][2:4]={{7,7,7},{7,7,7},{7,7,7}} +(1 row) + +select array_fill(7, array[3,3]); + array_fill +--------------------------- + {{7,7,7},{7,7,7},{7,7,7}} +(1 row) + +select array_fill('juhu'::text, array[3,3],array[2,2]); + array_fill +----------------------------------------------------------------- + [2:4][2:4]={{juhu,juhu,juhu},{juhu,juhu,juhu},{juhu,juhu,juhu}} +(1 row) + +select array_fill('juhu'::text, array[3,3]); + array_fill +------------------------------------------------------ + {{juhu,juhu,juhu},{juhu,juhu,juhu},{juhu,juhu,juhu}} +(1 row) + +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, array[0]) as a) ss; + a | is_eq | array_dims +----+-------+------------ + {} | t | +(1 row) + +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, '{}') as a) ss; + a | is_eq | array_dims +----+-------+------------ + {} | t | +(1 row) + +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, '{}', '{}') as a) ss; + a | is_eq | array_dims +----+-------+------------ + {} | t | +(1 row) + +-- raise exception +select array_fill(1, null, array[2,2]); +ERROR: dimension array or low bound array cannot be null +select array_fill(1, array[2,2], null); +ERROR: dimension array or low bound array cannot be null +select array_fill(1, array[2,2], '{}'); +ERROR: wrong number of array subscripts +DETAIL: Low bound array has different size than dimensions array. +select array_fill(1, array[3,3], array[1,1,1]); +ERROR: wrong number of array subscripts +DETAIL: Low bound array has different size than dimensions array. +select array_fill(1, array[1,2,null]); +ERROR: dimension values cannot be null +select array_fill(1, array[[1,2],[3,4]]); +ERROR: wrong number of array subscripts +DETAIL: Dimension array must be one dimensional. +select string_to_array('1|2|3', '|'); + string_to_array +----------------- + {1,2,3} +(1 row) + +select string_to_array('1|2|3|', '|'); + string_to_array +----------------- + {1,2,3,""} +(1 row) + +select string_to_array('1||2|3||', '||'); + string_to_array +----------------- + {1,2|3,""} +(1 row) + +select string_to_array('1|2|3', ''); + string_to_array +----------------- + {1|2|3} +(1 row) + +select string_to_array('', '|'); + string_to_array +----------------- + {} +(1 row) + +select string_to_array('1|2|3', NULL); + string_to_array +----------------- + {1,|,2,|,3} +(1 row) + +select string_to_array(NULL, '|') IS NULL; + ?column? +---------- + t +(1 row) + +select string_to_array('abc', ''); + string_to_array +----------------- + {abc} +(1 row) + +select string_to_array('abc', '', 'abc'); + string_to_array +----------------- + {NULL} +(1 row) + +select string_to_array('abc', ','); + string_to_array +----------------- + {abc} +(1 row) + +select string_to_array('abc', ',', 'abc'); + string_to_array +----------------- + {NULL} +(1 row) + +select string_to_array('1,2,3,4,,6', ','); + string_to_array +----------------- + {1,2,3,4,"",6} +(1 row) + +select string_to_array('1,2,3,4,,6', ',', ''); + string_to_array +------------------ + {1,2,3,4,NULL,6} +(1 row) + +select string_to_array('1,2,3,4,*,6', ',', '*'); + string_to_array +------------------ + {1,2,3,4,NULL,6} +(1 row) + +select v, v is null as "is null" from string_to_table('1|2|3', '|') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f +(3 rows) + +select v, v is null as "is null" from string_to_table('1|2|3|', '|') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f + | f +(4 rows) + +select v, v is null as "is null" from string_to_table('1||2|3||', '||') g(v); + v | is null +-----+--------- + 1 | f + 2|3 | f + | f +(3 rows) + +select v, v is null as "is null" from string_to_table('1|2|3', '') g(v); + v | is null +-------+--------- + 1|2|3 | f +(1 row) + +select v, v is null as "is null" from string_to_table('', '|') g(v); + v | is null +---+--------- +(0 rows) + +select v, v is null as "is null" from string_to_table('1|2|3', NULL) g(v); + v | is null +---+--------- + 1 | f + | | f + 2 | f + | | f + 3 | f +(5 rows) + +select v, v is null as "is null" from string_to_table(NULL, '|') g(v); + v | is null +---+--------- +(0 rows) + +select v, v is null as "is null" from string_to_table('abc', '') g(v); + v | is null +-----+--------- + abc | f +(1 row) + +select v, v is null as "is null" from string_to_table('abc', '', 'abc') g(v); + v | is null +---+--------- + | t +(1 row) + +select v, v is null as "is null" from string_to_table('abc', ',') g(v); + v | is null +-----+--------- + abc | f +(1 row) + +select v, v is null as "is null" from string_to_table('abc', ',', 'abc') g(v); + v | is null +---+--------- + | t +(1 row) + +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f + 4 | f + | f + 6 | f +(6 rows) + +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',', '') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f + 4 | f + | t + 6 | f +(6 rows) + +select v, v is null as "is null" from string_to_table('1,2,3,4,*,6', ',', '*') g(v); + v | is null +---+--------- + 1 | f + 2 | f + 3 | f + 4 | f + | t + 6 | f +(6 rows) + +select array_to_string(NULL::int4[], ',') IS NULL; + ?column? +---------- + t +(1 row) + +select array_to_string('{}'::int4[], ','); + array_to_string +----------------- + +(1 row) + +select array_to_string(array[1,2,3,4,NULL,6], ','); + array_to_string +----------------- + 1,2,3,4,6 +(1 row) + +select array_to_string(array[1,2,3,4,NULL,6], ',', '*'); + array_to_string +----------------- + 1,2,3,4,*,6 +(1 row) + +select array_to_string(array[1,2,3,4,NULL,6], NULL); + array_to_string +----------------- + +(1 row) + +select array_to_string(array[1,2,3,4,NULL,6], ',', NULL); + array_to_string +----------------- + 1,2,3,4,6 +(1 row) + +select array_to_string(string_to_array('1|2|3', '|'), '|'); + array_to_string +----------------- + 1|2|3 +(1 row) + +select array_length(array[1,2,3], 1); + array_length +-------------- + 3 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 0); + array_length +-------------- + +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 1); + array_length +-------------- + 2 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 2); + array_length +-------------- + 3 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 3); + array_length +-------------- + +(1 row) + +select cardinality(NULL::int[]); + cardinality +------------- + +(1 row) + +select cardinality('{}'::int[]); + cardinality +------------- + 0 +(1 row) + +select cardinality(array[1,2,3]); + cardinality +------------- + 3 +(1 row) + +select cardinality('[2:4]={5,6,7}'::int[]); + cardinality +------------- + 3 +(1 row) + +select cardinality('{{1,2}}'::int[]); + cardinality +------------- + 2 +(1 row) + +select cardinality('{{1,2},{3,4},{5,6}}'::int[]); + cardinality +------------- + 6 +(1 row) + +select cardinality('{{{1,9},{5,6}},{{2,3},{3,4}}}'::int[]); + cardinality +------------- + 8 +(1 row) + +-- array_agg(anynonarray) +select array_agg(unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss; + array_agg +-------------------------------------- + {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14} +(1 row) + +select array_agg(ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss; + array_agg +--------------------------------- + {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4} +(1 row) + +select array_agg(nullif(ten, 4)) from (select ten from tenk1 where unique1 < 15 order by unique1) ss; + array_agg +--------------------------------------- + {0,1,2,3,NULL,5,6,7,8,9,0,1,2,3,NULL} +(1 row) + +select array_agg(unique1) from tenk1 where unique1 < -15; + array_agg +----------- + +(1 row) + +-- array_agg(anyarray) +select array_agg(ar) + from (values ('{1,2}'::int[]), ('{3,4}'::int[])) v(ar); + array_agg +--------------- + {{1,2},{3,4}} +(1 row) + +select array_agg(distinct ar order by ar desc) + from (select array[i / 2] from generate_series(1,10) a(i)) b(ar); + array_agg +--------------------------- + {{5},{4},{3},{2},{1},{0}} +(1 row) + +select array_agg(ar) + from (select array_agg(array[i, i+1, i-1]) + from generate_series(1,2) a(i)) b(ar); + array_agg +--------------------- + {{{1,2,0},{2,3,1}}} +(1 row) + +select array_agg(array[i+1.2, i+1.3, i+1.4]) from generate_series(1,3) g(i); + array_agg +--------------------------------------------- + {{2.2,2.3,2.4},{3.2,3.3,3.4},{4.2,4.3,4.4}} +(1 row) + +select array_agg(array['Hello', i::text]) from generate_series(9,11) g(i); + array_agg +----------------------------------- + {{Hello,9},{Hello,10},{Hello,11}} +(1 row) + +select array_agg(array[i, nullif(i, 3), i+1]) from generate_series(1,4) g(i); + array_agg +-------------------------------------- + {{1,1,2},{2,2,3},{3,NULL,4},{4,4,5}} +(1 row) + +-- errors +select array_agg('{}'::int[]) from generate_series(1,2); +ERROR: data type anyarray is not an array type +select array_agg(null::int[]) from generate_series(1,2); +ERROR: data type anyarray is not an array type +select array_agg(ar) + from (values ('{1,2}'::int[]), ('{3}'::int[])) v(ar); +ERROR: cannot accumulate arrays of different dimensionality +select unnest(array[1,2,3]); + unnest +-------- + 1 + 2 + 3 +(3 rows) + +select * from unnest(array[1,2,3]); + unnest +-------- + 1 + 2 + 3 +(3 rows) + +select unnest(array[1,2,3,4.5]::float8[]); + unnest +-------- + 1 + 2 + 3 + 4.5 +(4 rows) + +select unnest(array[1,2,3,4.5]::numeric[]); + unnest +-------- + 1 + 2 + 3 + 4.5 +(4 rows) + +select unnest(array[1,2,3,null,4,null,null,5,6]); + unnest +-------- + 1 + 2 + 3 + + 4 + + + 5 + 6 +(9 rows) + +select unnest(array[1,2,3,null,4,null,null,5,6]::text[]); + unnest +-------- + 1 + 2 + 3 + + 4 + + + 5 + 6 +(9 rows) + +select abs(unnest(array[1,2,null,-3])); + abs +----- + 1 + 2 + + 3 +(4 rows) + +select array_remove(array[1,2,2,3], 2); + array_remove +-------------- + {1,3} +(1 row) + +select array_remove(array[1,2,2,3], 5); + array_remove +-------------- + {1,2,2,3} +(1 row) + +select array_remove(array[1,NULL,NULL,3], NULL); + array_remove +-------------- + {1,3} +(1 row) + +select array_remove(array['A','CC','D','C','RR'], 'RR'); + array_remove +-------------- + {A,CC,D,C} +(1 row) + +select array_remove(array[1.0, 2.1, 3.3], 1); + array_remove +-------------- + {2.1,3.3} +(1 row) + +select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed +ERROR: removing elements from multidimensional arrays is not supported +select array_remove(array['X','X','X'], 'X') = '{}'; + ?column? +---------- + t +(1 row) + +select array_replace(array[1,2,5,4],5,3); + array_replace +--------------- + {1,2,3,4} +(1 row) + +select array_replace(array[1,2,5,4],5,NULL); + array_replace +--------------- + {1,2,NULL,4} +(1 row) + +select array_replace(array[1,2,NULL,4,NULL],NULL,5); + array_replace +--------------- + {1,2,5,4,5} +(1 row) + +select array_replace(array['A','B','DD','B'],'B','CC'); + array_replace +--------------- + {A,CC,DD,CC} +(1 row) + +select array_replace(array[1,NULL,3],NULL,NULL); + array_replace +--------------- + {1,NULL,3} +(1 row) + +select array_replace(array['AB',NULL,'CDE'],NULL,'12'); + array_replace +--------------- + {AB,12,CDE} +(1 row) + +-- array(select array-value ...) +select array(select array[i,i/2] from generate_series(1,5) i); + array +--------------------------------- + {{1,0},{2,1},{3,1},{4,2},{5,2}} +(1 row) + +select array(select array['Hello', i::text] from generate_series(9,11) i); + array +----------------------------------- + {{Hello,9},{Hello,10},{Hello,11}} +(1 row) + +-- Insert/update on a column that is array of composite +create temp table t1 (f1 int8_tbl[]); +insert into t1 (f1[5].q1) values(42); +select * from t1; + f1 +----------------- + [5:5]={"(42,)"} +(1 row) + +update t1 set f1[5].q2 = 43; +select * from t1; + f1 +------------------- + [5:5]={"(42,43)"} +(1 row) + +-- Check that arrays of composites are safely detoasted when needed +create temp table src (f1 text); +insert into src + select string_agg(random()::text,'') from generate_series(1,10000); +create type textandtext as (c1 text, c2 text); +create temp table dest (f1 textandtext[]); +insert into dest select array[row(f1,f1)::textandtext] from src; +select length(md5((f1[1]).c2)) from dest; + length +-------- + 32 +(1 row) + +delete from src; +select length(md5((f1[1]).c2)) from dest; + length +-------- + 32 +(1 row) + +truncate table src; +drop table src; +select length(md5((f1[1]).c2)) from dest; + length +-------- + 32 +(1 row) + +drop table dest; +drop type textandtext; +-- Tests for polymorphic-array form of width_bucket() +-- this exercises the varwidth and float8 code paths +SELECT + op, + width_bucket(op::numeric, ARRAY[1, 3, 5, 10.0]::numeric[]) AS wb_n1, + width_bucket(op::numeric, ARRAY[0, 5.5, 9.99]::numeric[]) AS wb_n2, + width_bucket(op::numeric, ARRAY[-6, -5, 2.0]::numeric[]) AS wb_n3, + width_bucket(op::float8, ARRAY[1, 3, 5, 10.0]::float8[]) AS wb_f1, + width_bucket(op::float8, ARRAY[0, 5.5, 9.99]::float8[]) AS wb_f2, + width_bucket(op::float8, ARRAY[-6, -5, 2.0]::float8[]) AS wb_f3 +FROM (VALUES + (-5.2), + (-0.0000000001), + (0.000000000001), + (1), + (1.99999999999999), + (2), + (2.00000000000001), + (3), + (4), + (4.5), + (5), + (5.5), + (6), + (7), + (8), + (9), + (9.99999999999999), + (10), + (10.0000000000001) +) v(op); + op | wb_n1 | wb_n2 | wb_n3 | wb_f1 | wb_f2 | wb_f3 +------------------+-------+-------+-------+-------+-------+------- + -5.2 | 0 | 0 | 1 | 0 | 0 | 1 + -0.0000000001 | 0 | 0 | 2 | 0 | 0 | 2 + 0.000000000001 | 0 | 1 | 2 | 0 | 1 | 2 + 1 | 1 | 1 | 2 | 1 | 1 | 2 + 1.99999999999999 | 1 | 1 | 2 | 1 | 1 | 2 + 2 | 1 | 1 | 3 | 1 | 1 | 3 + 2.00000000000001 | 1 | 1 | 3 | 1 | 1 | 3 + 3 | 2 | 1 | 3 | 2 | 1 | 3 + 4 | 2 | 1 | 3 | 2 | 1 | 3 + 4.5 | 2 | 1 | 3 | 2 | 1 | 3 + 5 | 3 | 1 | 3 | 3 | 1 | 3 + 5.5 | 3 | 2 | 3 | 3 | 2 | 3 + 6 | 3 | 2 | 3 | 3 | 2 | 3 + 7 | 3 | 2 | 3 | 3 | 2 | 3 + 8 | 3 | 2 | 3 | 3 | 2 | 3 + 9 | 3 | 2 | 3 | 3 | 2 | 3 + 9.99999999999999 | 3 | 3 | 3 | 3 | 3 | 3 + 10 | 4 | 3 | 3 | 4 | 3 | 3 + 10.0000000000001 | 4 | 3 | 3 | 4 | 3 | 3 +(19 rows) + +-- ensure float8 path handles NaN properly +SELECT + op, + width_bucket(op, ARRAY[1, 3, 9, 'NaN', 'NaN']::float8[]) AS wb +FROM (VALUES + (-5.2::float8), + (4::float8), + (77::float8), + ('NaN'::float8) +) v(op); + op | wb +------+---- + -5.2 | 0 + 4 | 2 + 77 | 3 + NaN | 5 +(4 rows) + +-- these exercise the generic fixed-width code path +SELECT + op, + width_bucket(op, ARRAY[1, 3, 5, 10]) AS wb_1 +FROM generate_series(0,11) as op; + op | wb_1 +----+------ + 0 | 0 + 1 | 1 + 2 | 1 + 3 | 2 + 4 | 2 + 5 | 3 + 6 | 3 + 7 | 3 + 8 | 3 + 9 | 3 + 10 | 4 + 11 | 4 +(12 rows) + +SELECT width_bucket(now(), + array['yesterday', 'today', 'tomorrow']::timestamptz[]); + width_bucket +-------------- + 2 +(1 row) + +-- corner cases +SELECT width_bucket(5, ARRAY[3]); + width_bucket +-------------- + 1 +(1 row) + +SELECT width_bucket(5, '{}'); + width_bucket +-------------- + 0 +(1 row) + +-- error cases +SELECT width_bucket('5'::text, ARRAY[3, 4]::integer[]); +ERROR: function width_bucket(text, integer[]) does not exist +LINE 1: SELECT width_bucket('5'::text, ARRAY[3, 4]::integer[]); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +SELECT width_bucket(5, ARRAY[3, 4, NULL]); +ERROR: thresholds array must not contain NULLs +SELECT width_bucket(5, ARRAY[ARRAY[1, 2], ARRAY[3, 4]]); +ERROR: thresholds must be one-dimensional array +-- trim_array +SELECT arr, trim_array(arr, 2) +FROM +(VALUES ('{1,2,3,4,5,6}'::bigint[]), + ('{1,2}'), + ('[10:16]={1,2,3,4,5,6,7}'), + ('[-15:-10]={1,2,3,4,5,6}'), + ('{{1,10},{2,20},{3,30},{4,40}}')) v(arr); + arr | trim_array +-------------------------------+----------------- + {1,2,3,4,5,6} | {1,2,3,4} + {1,2} | {} + [10:16]={1,2,3,4,5,6,7} | {1,2,3,4,5} + [-15:-10]={1,2,3,4,5,6} | {1,2,3,4} + {{1,10},{2,20},{3,30},{4,40}} | {{1,10},{2,20}} +(5 rows) + +SELECT trim_array(ARRAY[1, 2, 3], -1); -- fail +ERROR: number of elements to trim must be between 0 and 3 +SELECT trim_array(ARRAY[1, 2, 3], 10); -- fail +ERROR: number of elements to trim must be between 0 and 3 diff --git a/src/test/singlenode_regress/expected/async.out b/src/test/singlenode_regress/expected/async.out new file mode 100644 index 00000000000..19cbe38e636 --- /dev/null +++ b/src/test/singlenode_regress/expected/async.out @@ -0,0 +1,42 @@ +-- +-- ASYNC +-- +--Should work. Send a valid message via a valid channel name +SELECT pg_notify('notify_async1','sample message1'); + pg_notify +----------- + +(1 row) + +SELECT pg_notify('notify_async1',''); + pg_notify +----------- + +(1 row) + +SELECT pg_notify('notify_async1',NULL); + pg_notify +----------- + +(1 row) + +-- Should fail. Send a valid message via an invalid channel name +SELECT pg_notify('','sample message1'); +ERROR: channel name cannot be empty +SELECT pg_notify(NULL,'sample message1'); +ERROR: channel name cannot be empty +SELECT pg_notify('notify_async_channel_name_too_long______________________________','sample_message1'); +ERROR: channel name too long +--Should work. Valid NOTIFY/LISTEN/UNLISTEN commands +NOTIFY notify_async2; +LISTEN notify_async2; +UNLISTEN notify_async2; +UNLISTEN *; +-- Should return zero while there are no pending notifications. +-- src/test/isolation/specs/async-notify.spec tests for actual usage. +SELECT pg_notification_queue_usage(); + pg_notification_queue_usage +----------------------------- + 0 +(1 row) + diff --git a/src/test/singlenode_regress/expected/bfv_aggregate.out b/src/test/singlenode_regress/expected/bfv_aggregate.out new file mode 100644 index 00000000000..14f4d4a1dad --- /dev/null +++ b/src/test/singlenode_regress/expected/bfv_aggregate.out @@ -0,0 +1,1778 @@ +create schema bfv_aggregate; +set search_path=bfv_aggregate; +-- +-- Window function with outer references in PARTITION BY/ORDER BY clause +-- +-- SETUP +create table x_outer (a int, b int, c int); +create table y_inner (d int, e int); +insert into x_outer select i%3, i, i from generate_series(1,10) i; +insert into y_inner select i%3, i from generate_series(1,10) i; +analyze x_outer; +analyze y_inner; +-- TEST +select * from x_outer where a in (select row_number() over(partition by a) from y_inner) order by 1, 2; + a | b | c +---+----+---- + 1 | 1 | 1 + 1 | 4 | 4 + 1 | 7 | 7 + 1 | 10 | 10 + 2 | 2 | 2 + 2 | 5 | 5 + 2 | 8 | 8 +(7 rows) + +select * from x_outer where a in (select rank() over(order by a) from y_inner) order by 1, 2; + a | b | c +---+----+---- + 1 | 1 | 1 + 1 | 4 | 4 + 1 | 7 | 7 + 1 | 10 | 10 +(4 rows) + +select * from x_outer where a not in (select rank() over(order by a) from y_inner) order by 1, 2; + a | b | c +---+---+--- + 0 | 3 | 3 + 0 | 6 | 6 + 0 | 9 | 9 + 2 | 2 | 2 + 2 | 5 | 5 + 2 | 8 | 8 +(6 rows) + +select * from x_outer where exists (select rank() over(order by a) from y_inner where d = a) order by 1, 2; + a | b | c +---+----+---- + 0 | 3 | 3 + 0 | 6 | 6 + 0 | 9 | 9 + 1 | 1 | 1 + 1 | 4 | 4 + 1 | 7 | 7 + 1 | 10 | 10 + 2 | 2 | 2 + 2 | 5 | 5 + 2 | 8 | 8 +(10 rows) + +select * from x_outer where not exists (select rank() over(order by a) from y_inner where d = a) order by 1, 2; + a | b | c +---+---+--- +(0 rows) + +select * from x_outer where a in (select last_value(d) over(partition by b order by e rows between e preceding and e+1 following) from y_inner) order by 1, 2; + a | b | c +---+----+---- + 0 | 3 | 3 + 0 | 6 | 6 + 0 | 9 | 9 + 1 | 1 | 1 + 1 | 4 | 4 + 1 | 7 | 7 + 1 | 10 | 10 + 2 | 2 | 2 + 2 | 5 | 5 + 2 | 8 | 8 +(10 rows) + +-- +-- Testing aggregation in a query +-- +-- SETUP +create table d (col1 timestamp, col2 int); +insert into d select to_date('2014-01-01', 'YYYY-DD-MM'), generate_series(1,100); +-- TEST +select 1, to_char(col1, 'YYYY'), median(col2) from d group by 1, 2; + ?column? | to_char | median +----------+---------+-------- + 1 | 2014 | 50.5 +(1 row) + +-- +-- Testing if aggregate derived window function produces incorrect results +-- +-- SETUP +create table toy(id,val) as select i,i from generate_series(1,5) i; +create aggregate mysum1(int4) (sfunc = int4_sum, combinefunc=int8pl, stype=bigint); +create aggregate mysum2(int4) (sfunc = int4_sum, stype=bigint); +-- TEST +select + id, val, + sum(val) over (w), + mysum1(val) over (w), + mysum2(val) over (w) +from toy +window w as (order by id rows 2 preceding); + id | val | sum | mysum1 | mysum2 +----+-----+-----+--------+-------- + 1 | 1 | 1 | 1 | 1 + 2 | 2 | 3 | 3 | 3 + 3 | 3 | 6 | 6 | 6 + 4 | 4 | 9 | 9 | 9 + 5 | 5 | 12 | 12 | 12 +(5 rows) + +-- +-- Error executing for aggregate with anyarray as return type +-- +-- SETUP +CREATE OR REPLACE FUNCTION tfp(anyarray,anyelement) RETURNS anyarray AS +'select $1 || $2' LANGUAGE SQL; +CREATE OR REPLACE FUNCTION ffp(anyarray) RETURNS anyarray AS +'select $1' LANGUAGE SQL; +CREATE AGGREGATE myaggp20a(BASETYPE = anyelement, SFUNC = tfp, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); +-- Adding a sql function to sory the array +CREATE OR REPLACE FUNCTION array_sort (ANYARRAY) +RETURNS ANYARRAY LANGUAGE SQL +AS $$ +SELECT ARRAY(SELECT unnest($1) ORDER BY 1) +$$; +create temp table t(f1 int, f2 int[], f3 text); +-- TEST +insert into t values(1,array[1],'a'); +insert into t values(1,array[11],'b'); +insert into t values(1,array[111],'c'); +insert into t values(2,array[2],'a'); +insert into t values(2,array[22],'b'); +insert into t values(2,array[222],'c'); +insert into t values(3,array[3],'a'); +insert into t values(3,array[3],'b'); +select f3, array_sort(myaggp20a(f1)) from t group by f3 order by f3; + f3 | array_sort +----+------------ + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +-- start_ignore +create language plpython3u; +-- end_ignore +create or replace function count_operator(query text, operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; +-- +-- Testing adding a traceflag to favor multi-stage aggregation +-- +-- SETUP +create table multi_stage_test(a int, b int); +insert into multi_stage_test select i, i%4 from generate_series(1,10) i; +analyze multi_stage_test; +-- TEST +set optimizer_segments=2; +set optimizer_force_multistage_agg = on; +select count_operator('select count(*) from multi_stage_test group by b;','GroupAggregate'); + count_operator +---------------- + 0 +(1 row) + +set optimizer_force_multistage_agg = off; +select count_operator('select count(*) from multi_stage_test group by b;','GroupAggregate'); + count_operator +---------------- + 0 +(1 row) + +--CLEANUP +reset optimizer_segments; +reset optimizer_force_multistage_agg; +-- Testing not picking HashAgg for aggregates without combine functions +-- In previous version, a HashAggregate is not chosen when an aggregate misses +-- combine functions in GPDB Hybrid Hash Agg. HashAggregate can spill to disk, +-- and it requires the combine function for that(combine function is used to +-- deserialize the aggregate states loaded from the spill file). But that got +-- reverted in current version. Currently, this does choose a Hash Agg, because +-- we spill the raw tuple rather than transvalue to disk now. +-- SETUP +set optimizer_print_missing_stats = off; +CREATE TABLE attribute_table (product_id integer, attribute_id integer,attribute text, attribute2 text,attribute_ref_lists text,short_name text,attribute6 text,attribute5 text,measure double precision,unit character varying(60)); +-- create the transition function +CREATE OR REPLACE FUNCTION do_concat(text,text) +RETURNS text +--concatenates 2 strings +AS 'SELECT CASE WHEN $1 IS NULL THEN $2 +WHEN $2 IS NULL THEN $1 +ELSE $1 || $2 END;' + LANGUAGE SQL + IMMUTABLE + RETURNS NULL ON NULL INPUT; +-- UDA definition. No COMBINEFUNC exists +CREATE AGGREGATE concat(text) ( + --text/string concatenation + SFUNC = do_concat, --Function to call for each string that builds the aggregate + STYPE = text,--FINALFUNC=final_func, --Function to call after everything has been aggregated + INITCOND = '' --Initialize as an empty string when starting +); +-- TEST +-- cook some stats +set allow_system_table_mods=true; +UPDATE pg_class set reltuples=524592::real, relpages=2708::integer where oid = 'attribute_table'::regclass; +select count_operator('select product_id,concat(E''#attribute_''||attribute_id::varchar||E'':''||attribute) as attr FROM attribute_table GROUP BY product_id;','HashAggregate'); + count_operator +---------------- + 1 +(1 row) + +-- CLEANUP +-- +-- Testing fallback to planner when the agg used in window does not have +-- a combine function. +-- +-- SETUP +create table foo(a int, b text); +-- TEST +insert into foo values (1,'aaa'), (2,'bbb'), (3,'ccc'); +-- should fall back +select string_agg(b, '') over (partition by a) from foo order by 1; + string_agg +------------ + aaa + bbb + ccc +(3 rows) + +select string_agg(b, '') over (partition by a,b) from foo order by 1; + string_agg +------------ + aaa + bbb + ccc +(3 rows) + +-- should not fall back +select max(b) over (partition by a) from foo order by 1; + max +----- + aaa + bbb + ccc +(3 rows) + +select count_operator('select max(b) over (partition by a) from foo order by 1;', 'Pivotal Optimizer (GPORCA)'); + count_operator +---------------- + 0 +(1 row) + +-- fall back +select string_agg(b, '') over (partition by a+1) from foo order by 1; + string_agg +------------ + aaa + bbb + ccc +(3 rows) + +select string_agg(b || 'txt', '') over (partition by a) from foo order by 1; + string_agg +------------ + aaatxt + bbbtxt + ccctxt +(3 rows) + +select string_agg(b || 'txt', '') over (partition by a+1) from foo order by 1; + string_agg +------------ + aaatxt + bbbtxt + ccctxt +(3 rows) + +-- fall back +select string_agg(b, '') over (partition by a order by a) from foo order by 1; + string_agg +------------ + aaa + bbb + ccc +(3 rows) + +select string_agg(b || 'txt', '') over (partition by a,b order by a,b) from foo order by 1; + string_agg +------------ + aaatxt + bbbtxt + ccctxt +(3 rows) + +select '1' || string_agg(b, '') over (partition by a+1 order by a+1) from foo; + ?column? +---------- + 1aaa + 1bbb + 1ccc +(3 rows) + +-- Test for a bug in memtuple compute_null_save() function, where the result value +-- was a 16-bit integer, which overflowed with a tuple with enough NULL attributes. +-- That bug wasn't related to aggregates per se, but this is one way to construct +-- such a memtuple, and seems useful to test a query that has a huge number of +-- aggregates anyway. +create temporary table mtup1( +c0 text, +c1 text, +c3 int, +c4 int +) +with (appendonly = true, compresstype=zlib) +; +insert into mtup1 values + ('foo', '2015-09-1.1', 1), + ('foo', '2015-09-1.1', 2), + ('foo', '2015-09-1.1', 3), + ('foo', '2015-09-1.1', 4), + ('foo', '2015-09-1.1', 5), + ('foo', '2015-09-1.1', 6), + ('foo', '2015-09-1.1', 7), + ('foo', '2015-09-1.1', 8), + ('foo', '2015-09-1.1', 9); +-- The number of SUMs is a chosen so that it it's enough to trigger the bug with NULL +-- attributes, but not much more than that. There's some O(n^2) code in ExecInitAgg +-- to detect duplicate AggRefs, so this starts to get really slow as you add more +-- aggregates. +-- we use MinimalTuples in Motions now, and the support for passing around MemTuples +-- in TupleTableSlots was removed, so it no longer can exercise the original bug. +-- In GPDB6, it generates a multiphase agg plan in default, but it will get an error +-- from exceeding the limit in GPDB7 with that plan(a MinimalTuple has a limit of 1600 +-- columns). So set the parameter to off to prevent error happens. +set gp_enable_multiphase_agg=off; +select c0, c1, array_length(ARRAY[ + SUM(c4 % 2), SUM(c4 % 3), SUM(c4 % 4), + SUM(c4 % 5), SUM(c4 % 6), SUM(c4 % 7), SUM(c4 % 8), SUM(c4 % 9), + SUM(c4 % 10), SUM(c4 % 11), SUM(c4 % 12), SUM(c4 % 13), SUM(c4 % 14), + SUM(c4 % 15), SUM(c4 % 16), SUM(c4 % 17), SUM(c4 % 18), SUM(c4 % 19), + SUM(c4 % 20), SUM(c4 % 21), SUM(c4 % 22), SUM(c4 % 23), SUM(c4 % 24), + SUM(c4 % 25), SUM(c4 % 26), SUM(c4 % 27), SUM(c4 % 28), SUM(c4 % 29), + SUM(c4 % 30), SUM(c4 % 31), SUM(c4 % 32), SUM(c4 % 33), SUM(c4 % 34), + SUM(c4 % 35), SUM(c4 % 36), SUM(c4 % 37), SUM(c4 % 38), SUM(c4 % 39), + SUM(c4 % 40), SUM(c4 % 41), SUM(c4 % 42), SUM(c4 % 43), SUM(c4 % 44), + SUM(c4 % 45), SUM(c4 % 46), SUM(c4 % 47), SUM(c4 % 48), SUM(c4 % 49), + SUM(c4 % 50), SUM(c4 % 51), SUM(c4 % 52), SUM(c4 % 53), SUM(c4 % 54), + SUM(c4 % 55), SUM(c4 % 56), SUM(c4 % 57), SUM(c4 % 58), SUM(c4 % 59), + SUM(c4 % 60), SUM(c4 % 61), SUM(c4 % 62), SUM(c4 % 63), SUM(c4 % 64), + SUM(c4 % 65), SUM(c4 % 66), SUM(c4 % 67), SUM(c4 % 68), SUM(c4 % 69), + SUM(c4 % 70), SUM(c4 % 71), SUM(c4 % 72), SUM(c4 % 73), SUM(c4 % 74), + SUM(c4 % 75), SUM(c4 % 76), SUM(c4 % 77), SUM(c4 % 78), SUM(c4 % 79), + SUM(c4 % 80), SUM(c4 % 81), SUM(c4 % 82), SUM(c4 % 83), SUM(c4 % 84), + SUM(c4 % 85), SUM(c4 % 86), SUM(c4 % 87), SUM(c4 % 88), SUM(c4 % 89), + SUM(c4 % 90), SUM(c4 % 91), SUM(c4 % 92), SUM(c4 % 93), SUM(c4 % 94), + SUM(c4 % 95), SUM(c4 % 96), SUM(c4 % 97), SUM(c4 % 98), SUM(c4 % 99), + SUM(c4 % 100), SUM(c4 % 101), SUM(c4 % 102), SUM(c4 % 103), SUM(c4 % 104), + SUM(c4 % 105), SUM(c4 % 106), SUM(c4 % 107), SUM(c4 % 108), SUM(c4 % 109), + SUM(c4 % 110), SUM(c4 % 111), SUM(c4 % 112), SUM(c4 % 113), SUM(c4 % 114), + SUM(c4 % 115), SUM(c4 % 116), SUM(c4 % 117), SUM(c4 % 118), SUM(c4 % 119), + SUM(c4 % 120), SUM(c4 % 121), SUM(c4 % 122), SUM(c4 % 123), SUM(c4 % 124), + SUM(c4 % 125), SUM(c4 % 126), SUM(c4 % 127), SUM(c4 % 128), SUM(c4 % 129), + SUM(c4 % 130), SUM(c4 % 131), SUM(c4 % 132), SUM(c4 % 133), SUM(c4 % 134), + SUM(c4 % 135), SUM(c4 % 136), SUM(c4 % 137), SUM(c4 % 138), SUM(c4 % 139), + SUM(c4 % 140), SUM(c4 % 141), SUM(c4 % 142), SUM(c4 % 143), SUM(c4 % 144), + SUM(c4 % 145), SUM(c4 % 146), SUM(c4 % 147), SUM(c4 % 148), SUM(c4 % 149), + SUM(c4 % 150), SUM(c4 % 151), SUM(c4 % 152), SUM(c4 % 153), SUM(c4 % 154), + SUM(c4 % 155), SUM(c4 % 156), SUM(c4 % 157), SUM(c4 % 158), SUM(c4 % 159), + SUM(c4 % 160), SUM(c4 % 161), SUM(c4 % 162), SUM(c4 % 163), SUM(c4 % 164), + SUM(c4 % 165), SUM(c4 % 166), SUM(c4 % 167), SUM(c4 % 168), SUM(c4 % 169), + SUM(c4 % 170), SUM(c4 % 171), SUM(c4 % 172), SUM(c4 % 173), SUM(c4 % 174), + SUM(c4 % 175), SUM(c4 % 176), SUM(c4 % 177), SUM(c4 % 178), SUM(c4 % 179), + SUM(c4 % 180), SUM(c4 % 181), SUM(c4 % 182), SUM(c4 % 183), SUM(c4 % 184), + SUM(c4 % 185), SUM(c4 % 186), SUM(c4 % 187), SUM(c4 % 188), SUM(c4 % 189), + SUM(c4 % 190), SUM(c4 % 191), SUM(c4 % 192), SUM(c4 % 193), SUM(c4 % 194), + SUM(c4 % 195), SUM(c4 % 196), SUM(c4 % 197), SUM(c4 % 198), SUM(c4 % 199), + SUM(c4 % 200), SUM(c4 % 201), SUM(c4 % 202), SUM(c4 % 203), SUM(c4 % 204), + SUM(c4 % 205), SUM(c4 % 206), SUM(c4 % 207), SUM(c4 % 208), SUM(c4 % 209), + SUM(c4 % 210), SUM(c4 % 211), SUM(c4 % 212), SUM(c4 % 213), SUM(c4 % 214), + SUM(c4 % 215), SUM(c4 % 216), SUM(c4 % 217), SUM(c4 % 218), SUM(c4 % 219), + SUM(c4 % 220), SUM(c4 % 221), SUM(c4 % 222), SUM(c4 % 223), SUM(c4 % 224), + SUM(c4 % 225), SUM(c4 % 226), SUM(c4 % 227), SUM(c4 % 228), SUM(c4 % 229), + SUM(c4 % 230), SUM(c4 % 231), SUM(c4 % 232), SUM(c4 % 233), SUM(c4 % 234), + SUM(c4 % 235), SUM(c4 % 236), SUM(c4 % 237), SUM(c4 % 238), SUM(c4 % 239), + SUM(c4 % 240), SUM(c4 % 241), SUM(c4 % 242), SUM(c4 % 243), SUM(c4 % 244), + SUM(c4 % 245), SUM(c4 % 246), SUM(c4 % 247), SUM(c4 % 248), SUM(c4 % 249), + SUM(c4 % 250), SUM(c4 % 251), SUM(c4 % 252), SUM(c4 % 253), SUM(c4 % 254), + SUM(c4 % 255), SUM(c4 % 256), SUM(c4 % 257), SUM(c4 % 258), SUM(c4 % 259), + SUM(c4 % 260), SUM(c4 % 261), SUM(c4 % 262), SUM(c4 % 263), SUM(c4 % 264), + SUM(c4 % 265), SUM(c4 % 266), SUM(c4 % 267), SUM(c4 % 268), SUM(c4 % 269), + SUM(c4 % 270), SUM(c4 % 271), SUM(c4 % 272), SUM(c4 % 273), SUM(c4 % 274), + SUM(c4 % 275), SUM(c4 % 276), SUM(c4 % 277), SUM(c4 % 278), SUM(c4 % 279), + SUM(c4 % 280), SUM(c4 % 281), SUM(c4 % 282), SUM(c4 % 283), SUM(c4 % 284), + SUM(c4 % 285), SUM(c4 % 286), SUM(c4 % 287), SUM(c4 % 288), SUM(c4 % 289), + SUM(c4 % 290), SUM(c4 % 291), SUM(c4 % 292), SUM(c4 % 293), SUM(c4 % 294), + SUM(c4 % 295), SUM(c4 % 296), SUM(c4 % 297), SUM(c4 % 298), SUM(c4 % 299), + SUM(c4 % 300), SUM(c4 % 301), SUM(c4 % 302), SUM(c4 % 303), SUM(c4 % 304), + SUM(c4 % 305), SUM(c4 % 306), SUM(c4 % 307), SUM(c4 % 308), SUM(c4 % 309), + SUM(c4 % 310), SUM(c4 % 311), SUM(c4 % 312), SUM(c4 % 313), SUM(c4 % 314), + SUM(c4 % 315), SUM(c4 % 316), SUM(c4 % 317), SUM(c4 % 318), SUM(c4 % 319), + SUM(c4 % 320), SUM(c4 % 321), SUM(c4 % 322), SUM(c4 % 323), SUM(c4 % 324), + SUM(c4 % 325), SUM(c4 % 326), SUM(c4 % 327), SUM(c4 % 328), SUM(c4 % 329), + SUM(c4 % 330), SUM(c4 % 331), SUM(c4 % 332), SUM(c4 % 333), SUM(c4 % 334), + SUM(c4 % 335), SUM(c4 % 336), SUM(c4 % 337), SUM(c4 % 338), SUM(c4 % 339), + SUM(c4 % 340), SUM(c4 % 341), SUM(c4 % 342), SUM(c4 % 343), SUM(c4 % 344), + SUM(c4 % 345), SUM(c4 % 346), SUM(c4 % 347), SUM(c4 % 348), SUM(c4 % 349), + SUM(c4 % 350), SUM(c4 % 351), SUM(c4 % 352), SUM(c4 % 353), SUM(c4 % 354), + SUM(c4 % 355), SUM(c4 % 356), SUM(c4 % 357), SUM(c4 % 358), SUM(c4 % 359), + SUM(c4 % 360), SUM(c4 % 361), SUM(c4 % 362), SUM(c4 % 363), SUM(c4 % 364), + SUM(c4 % 365), SUM(c4 % 366), SUM(c4 % 367), SUM(c4 % 368), SUM(c4 % 369), + SUM(c4 % 370), SUM(c4 % 371), SUM(c4 % 372), SUM(c4 % 373), SUM(c4 % 374), + SUM(c4 % 375), SUM(c4 % 376), SUM(c4 % 377), SUM(c4 % 378), SUM(c4 % 379), + SUM(c4 % 380), SUM(c4 % 381), SUM(c4 % 382), SUM(c4 % 383), SUM(c4 % 384), + SUM(c4 % 385), SUM(c4 % 386), SUM(c4 % 387), SUM(c4 % 388), SUM(c4 % 389), + SUM(c4 % 390), SUM(c4 % 391), SUM(c4 % 392), SUM(c4 % 393), SUM(c4 % 394), + SUM(c4 % 395), SUM(c4 % 396), SUM(c4 % 397), SUM(c4 % 398), SUM(c4 % 399), + SUM(c4 % 400), SUM(c4 % 401), SUM(c4 % 402), SUM(c4 % 403), SUM(c4 % 404), + SUM(c4 % 405), SUM(c4 % 406), SUM(c4 % 407), SUM(c4 % 408), SUM(c4 % 409), + SUM(c4 % 410), SUM(c4 % 411), SUM(c4 % 412), SUM(c4 % 413), SUM(c4 % 414), + SUM(c4 % 415), SUM(c4 % 416), SUM(c4 % 417), SUM(c4 % 418), SUM(c4 % 419), + SUM(c4 % 420), SUM(c4 % 421), SUM(c4 % 422), SUM(c4 % 423), SUM(c4 % 424), + SUM(c4 % 425), SUM(c4 % 426), SUM(c4 % 427), SUM(c4 % 428), SUM(c4 % 429), + SUM(c4 % 430), SUM(c4 % 431), SUM(c4 % 432), SUM(c4 % 433), SUM(c4 % 434), + SUM(c4 % 435), SUM(c4 % 436), SUM(c4 % 437), SUM(c4 % 438), SUM(c4 % 439), + SUM(c4 % 440), SUM(c4 % 441), SUM(c4 % 442), SUM(c4 % 443), SUM(c4 % 444), + SUM(c4 % 445), SUM(c4 % 446), SUM(c4 % 447), SUM(c4 % 448), SUM(c4 % 449), + SUM(c4 % 450), SUM(c4 % 451), SUM(c4 % 452), SUM(c4 % 453), SUM(c4 % 454), + SUM(c4 % 455), SUM(c4 % 456), SUM(c4 % 457), SUM(c4 % 458), SUM(c4 % 459), + SUM(c4 % 460), SUM(c4 % 461), SUM(c4 % 462), SUM(c4 % 463), SUM(c4 % 464), + SUM(c4 % 465), SUM(c4 % 466), SUM(c4 % 467), SUM(c4 % 468), SUM(c4 % 469), + SUM(c4 % 470), SUM(c4 % 471), SUM(c4 % 472), SUM(c4 % 473), SUM(c4 % 474), + SUM(c4 % 475), SUM(c4 % 476), SUM(c4 % 477), SUM(c4 % 478), SUM(c4 % 479), + SUM(c4 % 480), SUM(c4 % 481), SUM(c4 % 482), SUM(c4 % 483), SUM(c4 % 484), + SUM(c4 % 485), SUM(c4 % 486), SUM(c4 % 487), SUM(c4 % 488), SUM(c4 % 489), + SUM(c4 % 490), SUM(c4 % 491), SUM(c4 % 492), SUM(c4 % 493), SUM(c4 % 494), + SUM(c4 % 495), SUM(c4 % 496), SUM(c4 % 497), SUM(c4 % 498), SUM(c4 % 499), + SUM(c4 % 500), SUM(c4 % 501), SUM(c4 % 502), SUM(c4 % 503), SUM(c4 % 504), + SUM(c4 % 505), SUM(c4 % 506), SUM(c4 % 507), SUM(c4 % 508), SUM(c4 % 509), + SUM(c4 % 510), SUM(c4 % 511), SUM(c4 % 512), SUM(c4 % 513), SUM(c4 % 514), + SUM(c4 % 515), SUM(c4 % 516), SUM(c4 % 517), SUM(c4 % 518), SUM(c4 % 519), + SUM(c4 % 520), SUM(c4 % 521), SUM(c4 % 522), SUM(c4 % 523), SUM(c4 % 524), + SUM(c4 % 525), SUM(c4 % 526), SUM(c4 % 527), SUM(c4 % 528), SUM(c4 % 529), + SUM(c4 % 530), SUM(c4 % 531), SUM(c4 % 532), SUM(c4 % 533), SUM(c4 % 534), + SUM(c4 % 535), SUM(c4 % 536), SUM(c4 % 537), SUM(c4 % 538), SUM(c4 % 539), + SUM(c4 % 540), SUM(c4 % 541), SUM(c4 % 542), SUM(c4 % 543), SUM(c4 % 544), + SUM(c4 % 545), SUM(c4 % 546), SUM(c4 % 547), SUM(c4 % 548), SUM(c4 % 549), + SUM(c4 % 550), SUM(c4 % 551), SUM(c4 % 552), SUM(c4 % 553), SUM(c4 % 554), + SUM(c4 % 555), SUM(c4 % 556), SUM(c4 % 557), SUM(c4 % 558), SUM(c4 % 559), + SUM(c4 % 560), SUM(c4 % 561), SUM(c4 % 562), SUM(c4 % 563), SUM(c4 % 564), + SUM(c4 % 565), SUM(c4 % 566), SUM(c4 % 567), SUM(c4 % 568), SUM(c4 % 569), + SUM(c4 % 570), SUM(c4 % 571), SUM(c4 % 572), SUM(c4 % 573), SUM(c4 % 574), + SUM(c4 % 575), SUM(c4 % 576), SUM(c4 % 577), SUM(c4 % 578), SUM(c4 % 579), + SUM(c4 % 580), SUM(c4 % 581), SUM(c4 % 582), SUM(c4 % 583), SUM(c4 % 584), + SUM(c4 % 585), SUM(c4 % 586), SUM(c4 % 587), SUM(c4 % 588), SUM(c4 % 589), + SUM(c4 % 590), SUM(c4 % 591), SUM(c4 % 592), SUM(c4 % 593), SUM(c4 % 594), + SUM(c4 % 595), SUM(c4 % 596), SUM(c4 % 597), SUM(c4 % 598), SUM(c4 % 599), + SUM(c4 % 600), SUM(c4 % 601), SUM(c4 % 602), SUM(c4 % 603), SUM(c4 % 604), + SUM(c4 % 605), SUM(c4 % 606), SUM(c4 % 607), SUM(c4 % 608), SUM(c4 % 609), + SUM(c4 % 610), SUM(c4 % 611), SUM(c4 % 612), SUM(c4 % 613), SUM(c4 % 614), + SUM(c4 % 615), SUM(c4 % 616), SUM(c4 % 617), SUM(c4 % 618), SUM(c4 % 619), + SUM(c4 % 620), SUM(c4 % 621), SUM(c4 % 622), SUM(c4 % 623), SUM(c4 % 624), + SUM(c4 % 625), SUM(c4 % 626), SUM(c4 % 627), SUM(c4 % 628), SUM(c4 % 629), + SUM(c4 % 630), SUM(c4 % 631), SUM(c4 % 632), SUM(c4 % 633), SUM(c4 % 634), + SUM(c4 % 635), SUM(c4 % 636), SUM(c4 % 637), SUM(c4 % 638), SUM(c4 % 639), + SUM(c4 % 640), SUM(c4 % 641), SUM(c4 % 642), SUM(c4 % 643), SUM(c4 % 644), + SUM(c4 % 645), SUM(c4 % 646), SUM(c4 % 647), SUM(c4 % 648), SUM(c4 % 649), + SUM(c4 % 650), SUM(c4 % 651), SUM(c4 % 652), SUM(c4 % 653), SUM(c4 % 654), + SUM(c4 % 655), SUM(c4 % 656), SUM(c4 % 657), SUM(c4 % 658), SUM(c4 % 659), + SUM(c4 % 660), SUM(c4 % 661), SUM(c4 % 662), SUM(c4 % 663), SUM(c4 % 664), + SUM(c4 % 665), SUM(c4 % 666), SUM(c4 % 667), SUM(c4 % 668), SUM(c4 % 669), + SUM(c4 % 670), SUM(c4 % 671), SUM(c4 % 672), SUM(c4 % 673), SUM(c4 % 674), + SUM(c4 % 675), SUM(c4 % 676), SUM(c4 % 677), SUM(c4 % 678), SUM(c4 % 679), + SUM(c4 % 680), SUM(c4 % 681), SUM(c4 % 682), SUM(c4 % 683), SUM(c4 % 684), + SUM(c4 % 685), SUM(c4 % 686), SUM(c4 % 687), SUM(c4 % 688), SUM(c4 % 689), + SUM(c4 % 690), SUM(c4 % 691), SUM(c4 % 692), SUM(c4 % 693), SUM(c4 % 694), + SUM(c4 % 695), SUM(c4 % 696), SUM(c4 % 697), SUM(c4 % 698), SUM(c4 % 699), + SUM(c4 % 700), SUM(c4 % 701), SUM(c4 % 702), SUM(c4 % 703), SUM(c4 % 704), + SUM(c4 % 705), SUM(c4 % 706), SUM(c4 % 707), SUM(c4 % 708), SUM(c4 % 709), + SUM(c4 % 710), SUM(c4 % 711), SUM(c4 % 712), SUM(c4 % 713), SUM(c4 % 714), + SUM(c4 % 715), SUM(c4 % 716), SUM(c4 % 717), SUM(c4 % 718), SUM(c4 % 719), + SUM(c4 % 720), SUM(c4 % 721), SUM(c4 % 722), SUM(c4 % 723), SUM(c4 % 724), + SUM(c4 % 725), SUM(c4 % 726), SUM(c4 % 727), SUM(c4 % 728), SUM(c4 % 729), + SUM(c4 % 730), SUM(c4 % 731), SUM(c4 % 732), SUM(c4 % 733), SUM(c4 % 734), + SUM(c4 % 735), SUM(c4 % 736), SUM(c4 % 737), SUM(c4 % 738), SUM(c4 % 739), + SUM(c4 % 740), SUM(c4 % 741), SUM(c4 % 742), SUM(c4 % 743), SUM(c4 % 744), + SUM(c4 % 745), SUM(c4 % 746), SUM(c4 % 747), SUM(c4 % 748), SUM(c4 % 749), + SUM(c4 % 750), SUM(c4 % 751), SUM(c4 % 752), SUM(c4 % 753), SUM(c4 % 754), + SUM(c4 % 755), SUM(c4 % 756), SUM(c4 % 757), SUM(c4 % 758), SUM(c4 % 759), + SUM(c4 % 760), SUM(c4 % 761), SUM(c4 % 762), SUM(c4 % 763), SUM(c4 % 764), + SUM(c4 % 765), SUM(c4 % 766), SUM(c4 % 767), SUM(c4 % 768), SUM(c4 % 769), + SUM(c4 % 770), SUM(c4 % 771), SUM(c4 % 772), SUM(c4 % 773), SUM(c4 % 774), + SUM(c4 % 775), SUM(c4 % 776), SUM(c4 % 777), SUM(c4 % 778), SUM(c4 % 779), + SUM(c4 % 780), SUM(c4 % 781), SUM(c4 % 782), SUM(c4 % 783), SUM(c4 % 784), + SUM(c4 % 785), SUM(c4 % 786), SUM(c4 % 787), SUM(c4 % 788), SUM(c4 % 789), + SUM(c4 % 790), SUM(c4 % 791), SUM(c4 % 792), SUM(c4 % 793), SUM(c4 % 794), + SUM(c4 % 795), SUM(c4 % 796), SUM(c4 % 797), SUM(c4 % 798), SUM(c4 % 799), + SUM(c4 % 800), SUM(c4 % 801), SUM(c4 % 802), SUM(c4 % 803), SUM(c4 % 804), + SUM(c4 % 805), SUM(c4 % 806), SUM(c4 % 807), SUM(c4 % 808), SUM(c4 % 809), + SUM(c4 % 810), SUM(c4 % 811), SUM(c4 % 812), SUM(c4 % 813), SUM(c4 % 814), + SUM(c4 % 815), SUM(c4 % 816), SUM(c4 % 817), SUM(c4 % 818), SUM(c4 % 819), + SUM(c4 % 820), SUM(c4 % 821), SUM(c4 % 822), SUM(c4 % 823), SUM(c4 % 824), + SUM(c4 % 825), SUM(c4 % 826), SUM(c4 % 827), SUM(c4 % 828), SUM(c4 % 829), + SUM(c4 % 830), SUM(c4 % 831), SUM(c4 % 832), SUM(c4 % 833), SUM(c4 % 834), + SUM(c4 % 835), SUM(c4 % 836), SUM(c4 % 837), SUM(c4 % 838), SUM(c4 % 839), + SUM(c4 % 840), SUM(c4 % 841), SUM(c4 % 842), SUM(c4 % 843), SUM(c4 % 844), + SUM(c4 % 845), SUM(c4 % 846), SUM(c4 % 847), SUM(c4 % 848), SUM(c4 % 849), + SUM(c4 % 850), SUM(c4 % 851), SUM(c4 % 852), SUM(c4 % 853), SUM(c4 % 854), + SUM(c4 % 855), SUM(c4 % 856), SUM(c4 % 857), SUM(c4 % 858), SUM(c4 % 859), + SUM(c4 % 860), SUM(c4 % 861), SUM(c4 % 862), SUM(c4 % 863), SUM(c4 % 864), + SUM(c4 % 865), SUM(c4 % 866), SUM(c4 % 867), SUM(c4 % 868), SUM(c4 % 869), + SUM(c4 % 870), SUM(c4 % 871), SUM(c4 % 872), SUM(c4 % 873), SUM(c4 % 874), + SUM(c4 % 875), SUM(c4 % 876), SUM(c4 % 877), SUM(c4 % 878), SUM(c4 % 879), + SUM(c4 % 880), SUM(c4 % 881), SUM(c4 % 882), SUM(c4 % 883), SUM(c4 % 884), + SUM(c4 % 885), SUM(c4 % 886), SUM(c4 % 887), SUM(c4 % 888), SUM(c4 % 889), + SUM(c4 % 890), SUM(c4 % 891), SUM(c4 % 892), SUM(c4 % 893), SUM(c4 % 894), + SUM(c4 % 895), SUM(c4 % 896), SUM(c4 % 897), SUM(c4 % 898), SUM(c4 % 899), + SUM(c4 % 900), SUM(c4 % 901), SUM(c4 % 902), SUM(c4 % 903), SUM(c4 % 904), + SUM(c4 % 905), SUM(c4 % 906), SUM(c4 % 907), SUM(c4 % 908), SUM(c4 % 909), + SUM(c4 % 910), SUM(c4 % 911), SUM(c4 % 912), SUM(c4 % 913), SUM(c4 % 914), + SUM(c4 % 915), SUM(c4 % 916), SUM(c4 % 917), SUM(c4 % 918), SUM(c4 % 919), + SUM(c4 % 920), SUM(c4 % 921), SUM(c4 % 922), SUM(c4 % 923), SUM(c4 % 924), + SUM(c4 % 925), SUM(c4 % 926), SUM(c4 % 927), SUM(c4 % 928), SUM(c4 % 929), + SUM(c4 % 930), SUM(c4 % 931), SUM(c4 % 932), SUM(c4 % 933), SUM(c4 % 934), + SUM(c4 % 935), SUM(c4 % 936), SUM(c4 % 937), SUM(c4 % 938), SUM(c4 % 939), + SUM(c4 % 940), SUM(c4 % 941), SUM(c4 % 942), SUM(c4 % 943), SUM(c4 % 944), + SUM(c4 % 945), SUM(c4 % 946), SUM(c4 % 947), SUM(c4 % 948), SUM(c4 % 949), + SUM(c4 % 950), SUM(c4 % 951), SUM(c4 % 952), SUM(c4 % 953), SUM(c4 % 954), + SUM(c4 % 955), SUM(c4 % 956), SUM(c4 % 957), SUM(c4 % 958), SUM(c4 % 959), + SUM(c4 % 960), SUM(c4 % 961), SUM(c4 % 962), SUM(c4 % 963), SUM(c4 % 964), + SUM(c4 % 965), SUM(c4 % 966), SUM(c4 % 967), SUM(c4 % 968), SUM(c4 % 969), + SUM(c4 % 970), SUM(c4 % 971), SUM(c4 % 972), SUM(c4 % 973), SUM(c4 % 974), + SUM(c4 % 975), SUM(c4 % 976), SUM(c4 % 977), SUM(c4 % 978), SUM(c4 % 979), + SUM(c4 % 980), SUM(c4 % 981), SUM(c4 % 982), SUM(c4 % 983), SUM(c4 % 984), + SUM(c4 % 985), SUM(c4 % 986), SUM(c4 % 987), SUM(c4 % 988), SUM(c4 % 989), + SUM(c4 % 990), SUM(c4 % 991), SUM(c4 % 992), SUM(c4 % 993), SUM(c4 % 994), + SUM(c4 % 995), SUM(c4 % 996), SUM(c4 % 997), SUM(c4 % 998), SUM(c4 % 999), + SUM(c4 % 1000), SUM(c4 % 1001), SUM(c4 % 1002), SUM(c4 % 1003), SUM(c4 % 1004), + SUM(c4 % 1005), SUM(c4 % 1006), SUM(c4 % 1007), SUM(c4 % 1008), SUM(c4 % 1009), + SUM(c4 % 1010), SUM(c4 % 1011), SUM(c4 % 1012), SUM(c4 % 1013), SUM(c4 % 1014), + SUM(c4 % 1015), SUM(c4 % 1016), SUM(c4 % 1017), SUM(c4 % 1018), SUM(c4 % 1019), + SUM(c4 % 1020), SUM(c4 % 1021), SUM(c4 % 1022), SUM(c4 % 1023), SUM(c4 % 1024), + SUM(c4 % 1025), SUM(c4 % 1026), SUM(c4 % 1027), SUM(c4 % 1028), SUM(c4 % 1029), + SUM(c4 % 1030), SUM(c4 % 1031), SUM(c4 % 1032), SUM(c4 % 1033), SUM(c4 % 1034), + SUM(c4 % 1035), SUM(c4 % 1036), SUM(c4 % 1037), SUM(c4 % 1038), SUM(c4 % 1039), + SUM(c4 % 1040), SUM(c4 % 1041), SUM(c4 % 1042), SUM(c4 % 1043), SUM(c4 % 1044), + SUM(c4 % 1045), SUM(c4 % 1046), SUM(c4 % 1047), SUM(c4 % 1048), SUM(c4 % 1049), + SUM(c4 % 1050), SUM(c4 % 1051), SUM(c4 % 1052), SUM(c4 % 1053), SUM(c4 % 1054), + SUM(c4 % 1055), SUM(c4 % 1056), SUM(c4 % 1057), SUM(c4 % 1058), SUM(c4 % 1059), + SUM(c4 % 1060), SUM(c4 % 1061), SUM(c4 % 1062), SUM(c4 % 1063), SUM(c4 % 1064), + SUM(c4 % 1065), SUM(c4 % 1066), SUM(c4 % 1067), SUM(c4 % 1068), SUM(c4 % 1069), + SUM(c4 % 1070), SUM(c4 % 1071), SUM(c4 % 1072), SUM(c4 % 1073), SUM(c4 % 1074), + SUM(c4 % 1075), SUM(c4 % 1076), SUM(c4 % 1077), SUM(c4 % 1078), SUM(c4 % 1079), + SUM(c4 % 1080), SUM(c4 % 1081), SUM(c4 % 1082), SUM(c4 % 1083), SUM(c4 % 1084), + SUM(c4 % 1085), SUM(c4 % 1086), SUM(c4 % 1087), SUM(c4 % 1088), SUM(c4 % 1089), + SUM(c4 % 1090), SUM(c4 % 1091), SUM(c4 % 1092), SUM(c4 % 1093), SUM(c4 % 1094), + SUM(c4 % 1095), SUM(c4 % 1096), SUM(c4 % 1097), SUM(c4 % 1098), SUM(c4 % 1099), + SUM(c4 % 1100), SUM(c4 % 1101), SUM(c4 % 1102), SUM(c4 % 1103), SUM(c4 % 1104), + SUM(c4 % 1105), SUM(c4 % 1106), SUM(c4 % 1107), SUM(c4 % 1108), SUM(c4 % 1109), + SUM(c4 % 1110), SUM(c4 % 1111), SUM(c4 % 1112), SUM(c4 % 1113), SUM(c4 % 1114), + SUM(c4 % 1115), SUM(c4 % 1116), SUM(c4 % 1117), SUM(c4 % 1118), SUM(c4 % 1119), + SUM(c4 % 1120), SUM(c4 % 1121), SUM(c4 % 1122), SUM(c4 % 1123), SUM(c4 % 1124), + SUM(c4 % 1125), SUM(c4 % 1126), SUM(c4 % 1127), SUM(c4 % 1128), SUM(c4 % 1129), + SUM(c4 % 1130), SUM(c4 % 1131), SUM(c4 % 1132), SUM(c4 % 1133), SUM(c4 % 1134), + SUM(c4 % 1135), SUM(c4 % 1136), SUM(c4 % 1137), SUM(c4 % 1138), SUM(c4 % 1139), + SUM(c4 % 1140), SUM(c4 % 1141), SUM(c4 % 1142), SUM(c4 % 1143), SUM(c4 % 1144), + SUM(c4 % 1145), SUM(c4 % 1146), SUM(c4 % 1147), SUM(c4 % 1148), SUM(c4 % 1149), + SUM(c4 % 1150), SUM(c4 % 1151), SUM(c4 % 1152), SUM(c4 % 1153), SUM(c4 % 1154), + SUM(c4 % 1155), SUM(c4 % 1156), SUM(c4 % 1157), SUM(c4 % 1158), SUM(c4 % 1159), + SUM(c4 % 1160), SUM(c4 % 1161), SUM(c4 % 1162), SUM(c4 % 1163), SUM(c4 % 1164), + SUM(c4 % 1165), SUM(c4 % 1166), SUM(c4 % 1167), SUM(c4 % 1168), SUM(c4 % 1169), + SUM(c4 % 1170), SUM(c4 % 1171), SUM(c4 % 1172), SUM(c4 % 1173), SUM(c4 % 1174), + SUM(c4 % 1175), SUM(c4 % 1176), SUM(c4 % 1177), SUM(c4 % 1178), SUM(c4 % 1179), + SUM(c4 % 1180), SUM(c4 % 1181), SUM(c4 % 1182), SUM(c4 % 1183), SUM(c4 % 1184), + SUM(c4 % 1185), SUM(c4 % 1186), SUM(c4 % 1187), SUM(c4 % 1188), SUM(c4 % 1189), + SUM(c4 % 1190), SUM(c4 % 1191), SUM(c4 % 1192), SUM(c4 % 1193), SUM(c4 % 1194), + SUM(c4 % 1195), SUM(c4 % 1196), SUM(c4 % 1197), SUM(c4 % 1198), SUM(c4 % 1199), + SUM(c4 % 1200), SUM(c4 % 1201), SUM(c4 % 1202), SUM(c4 % 1203), SUM(c4 % 1204), + SUM(c4 % 1205), SUM(c4 % 1206), SUM(c4 % 1207), SUM(c4 % 1208), SUM(c4 % 1209), + SUM(c4 % 1210), SUM(c4 % 1211), SUM(c4 % 1212), SUM(c4 % 1213), SUM(c4 % 1214), + SUM(c4 % 1215), SUM(c4 % 1216), SUM(c4 % 1217), SUM(c4 % 1218), SUM(c4 % 1219), + SUM(c4 % 1220), SUM(c4 % 1221), SUM(c4 % 1222), SUM(c4 % 1223), SUM(c4 % 1224), + SUM(c4 % 1225), SUM(c4 % 1226), SUM(c4 % 1227), SUM(c4 % 1228), SUM(c4 % 1229), + SUM(c4 % 1230), SUM(c4 % 1231), SUM(c4 % 1232), SUM(c4 % 1233), SUM(c4 % 1234), + SUM(c4 % 1235), SUM(c4 % 1236), SUM(c4 % 1237), SUM(c4 % 1238), SUM(c4 % 1239), + SUM(c4 % 1240), SUM(c4 % 1241), SUM(c4 % 1242), SUM(c4 % 1243), SUM(c4 % 1244), + SUM(c4 % 1245), SUM(c4 % 1246), SUM(c4 % 1247), SUM(c4 % 1248), SUM(c4 % 1249), + SUM(c4 % 1250), SUM(c4 % 1251), SUM(c4 % 1252), SUM(c4 % 1253), SUM(c4 % 1254), + SUM(c4 % 1255), SUM(c4 % 1256), SUM(c4 % 1257), SUM(c4 % 1258), SUM(c4 % 1259), + SUM(c4 % 1260), SUM(c4 % 1261), SUM(c4 % 1262), SUM(c4 % 1263), SUM(c4 % 1264), + SUM(c4 % 1265), SUM(c4 % 1266), SUM(c4 % 1267), SUM(c4 % 1268), SUM(c4 % 1269), + SUM(c4 % 1270), SUM(c4 % 1271), SUM(c4 % 1272), SUM(c4 % 1273), SUM(c4 % 1274), + SUM(c4 % 1275), SUM(c4 % 1276), SUM(c4 % 1277), SUM(c4 % 1278), SUM(c4 % 1279), + SUM(c4 % 1280), SUM(c4 % 1281), SUM(c4 % 1282), SUM(c4 % 1283), SUM(c4 % 1284), + SUM(c4 % 1285), SUM(c4 % 1286), SUM(c4 % 1287), SUM(c4 % 1288), SUM(c4 % 1289), + SUM(c4 % 1290), SUM(c4 % 1291), SUM(c4 % 1292), SUM(c4 % 1293), SUM(c4 % 1294), + SUM(c4 % 1295), SUM(c4 % 1296), SUM(c4 % 1297), SUM(c4 % 1298), SUM(c4 % 1299), + SUM(c4 % 1300), SUM(c4 % 1301), SUM(c4 % 1302), SUM(c4 % 1303), SUM(c4 % 1304), + SUM(c4 % 1305), SUM(c4 % 1306), SUM(c4 % 1307), SUM(c4 % 1308), SUM(c4 % 1309), + SUM(c4 % 1310), SUM(c4 % 1311), SUM(c4 % 1312), SUM(c4 % 1313), SUM(c4 % 1314), + SUM(c4 % 1315), SUM(c4 % 1316), SUM(c4 % 1317), SUM(c4 % 1318), SUM(c4 % 1319), + SUM(c4 % 1320), SUM(c4 % 1321), SUM(c4 % 1322), SUM(c4 % 1323), SUM(c4 % 1324), + SUM(c4 % 1325), SUM(c4 % 1326), SUM(c4 % 1327), SUM(c4 % 1328), SUM(c4 % 1329), + SUM(c4 % 1330), SUM(c4 % 1331), SUM(c4 % 1332), SUM(c4 % 1333), SUM(c4 % 1334), + SUM(c4 % 1335), SUM(c4 % 1336), SUM(c4 % 1337), SUM(c4 % 1338), SUM(c4 % 1339), + SUM(c4 % 1340), SUM(c4 % 1341), SUM(c4 % 1342), SUM(c4 % 1343), SUM(c4 % 1344), + SUM(c4 % 1345), SUM(c4 % 1346), SUM(c4 % 1347), SUM(c4 % 1348), SUM(c4 % 1349), + SUM(c4 % 1350), SUM(c4 % 1351), SUM(c4 % 1352), SUM(c4 % 1353), SUM(c4 % 1354), + SUM(c4 % 1355), SUM(c4 % 1356), SUM(c4 % 1357), SUM(c4 % 1358), SUM(c4 % 1359), + SUM(c4 % 1360), SUM(c4 % 1361), SUM(c4 % 1362), SUM(c4 % 1363), SUM(c4 % 1364), + SUM(c4 % 1365), SUM(c4 % 1366), SUM(c4 % 1367), SUM(c4 % 1368), SUM(c4 % 1369), + SUM(c4 % 1370), SUM(c4 % 1371), SUM(c4 % 1372), SUM(c4 % 1373), SUM(c4 % 1374), + SUM(c4 % 1375), SUM(c4 % 1376), SUM(c4 % 1377), SUM(c4 % 1378), SUM(c4 % 1379), + SUM(c4 % 1380), SUM(c4 % 1381), SUM(c4 % 1382), SUM(c4 % 1383), SUM(c4 % 1384), + SUM(c4 % 1385), SUM(c4 % 1386), SUM(c4 % 1387), SUM(c4 % 1388), SUM(c4 % 1389), + SUM(c4 % 1390), SUM(c4 % 1391), SUM(c4 % 1392), SUM(c4 % 1393), SUM(c4 % 1394), + SUM(c4 % 1395), SUM(c4 % 1396), SUM(c4 % 1397), SUM(c4 % 1398), SUM(c4 % 1399), + SUM(c4 % 1400), SUM(c4 % 1401), SUM(c4 % 1402), SUM(c4 % 1403), SUM(c4 % 1404), + SUM(c4 % 1405), SUM(c4 % 1406), SUM(c4 % 1407), SUM(c4 % 1408), SUM(c4 % 1409), + SUM(c4 % 1410), SUM(c4 % 1411), SUM(c4 % 1412), SUM(c4 % 1413), SUM(c4 % 1414), + SUM(c4 % 1415), SUM(c4 % 1416), SUM(c4 % 1417), SUM(c4 % 1418), SUM(c4 % 1419), + SUM(c4 % 1420), SUM(c4 % 1421), SUM(c4 % 1422), SUM(c4 % 1423), SUM(c4 % 1424), + SUM(c4 % 1425), SUM(c4 % 1426), SUM(c4 % 1427), SUM(c4 % 1428), SUM(c4 % 1429), + SUM(c4 % 1430), SUM(c4 % 1431), SUM(c4 % 1432), SUM(c4 % 1433), SUM(c4 % 1434), + SUM(c4 % 1435), SUM(c4 % 1436), SUM(c4 % 1437), SUM(c4 % 1438), SUM(c4 % 1439), + SUM(c4 % 1440), SUM(c4 % 1441), SUM(c4 % 1442), SUM(c4 % 1443), SUM(c4 % 1444), + SUM(c4 % 1445), SUM(c4 % 1446), SUM(c4 % 1447), SUM(c4 % 1448), SUM(c4 % 1449), + SUM(c4 % 1450), SUM(c4 % 1451), SUM(c4 % 1452), SUM(c4 % 1453), SUM(c4 % 1454), + SUM(c4 % 1455), SUM(c4 % 1456), SUM(c4 % 1457), SUM(c4 % 1458), SUM(c4 % 1459), + SUM(c4 % 1460), SUM(c4 % 1461), SUM(c4 % 1462), SUM(c4 % 1463), SUM(c4 % 1464), + SUM(c4 % 1465), SUM(c4 % 1466), SUM(c4 % 1467), SUM(c4 % 1468), SUM(c4 % 1469), + SUM(c4 % 1470), SUM(c4 % 1471), SUM(c4 % 1472), SUM(c4 % 1473), SUM(c4 % 1474), + SUM(c4 % 1475), SUM(c4 % 1476), SUM(c4 % 1477), SUM(c4 % 1478), SUM(c4 % 1479), + SUM(c4 % 1480), SUM(c4 % 1481), SUM(c4 % 1482), SUM(c4 % 1483), SUM(c4 % 1484), + SUM(c4 % 1485), SUM(c4 % 1486), SUM(c4 % 1487), SUM(c4 % 1488), SUM(c4 % 1489), + SUM(c4 % 1490), SUM(c4 % 1491), SUM(c4 % 1492), SUM(c4 % 1493), SUM(c4 % 1494), + SUM(c4 % 1495), SUM(c4 % 1496), SUM(c4 % 1497), SUM(c4 % 1498), SUM(c4 % 1499), + SUM(c4 % 1500), SUM(c4 % 1501), SUM(c4 % 1502), SUM(c4 % 1503), SUM(c4 % 1504), + SUM(c4 % 1505), SUM(c4 % 1506), SUM(c4 % 1507), SUM(c4 % 1508), SUM(c4 % 1509), + SUM(c4 % 1510), SUM(c4 % 1511), SUM(c4 % 1512), SUM(c4 % 1513), SUM(c4 % 1514), + SUM(c4 % 1515), SUM(c4 % 1516), SUM(c4 % 1517), SUM(c4 % 1518), SUM(c4 % 1519), + SUM(c4 % 1520), SUM(c4 % 1521), SUM(c4 % 1522), SUM(c4 % 1523), SUM(c4 % 1524), + SUM(c4 % 1525), SUM(c4 % 1526), SUM(c4 % 1527), SUM(c4 % 1528), SUM(c4 % 1529), + SUM(c4 % 1530), SUM(c4 % 1531), SUM(c4 % 1532), SUM(c4 % 1533), SUM(c4 % 1534), + SUM(c4 % 1535), SUM(c4 % 1536), SUM(c4 % 1537), SUM(c4 % 1538), SUM(c4 % 1539), + SUM(c4 % 1540), SUM(c4 % 1541), SUM(c4 % 1542), SUM(c4 % 1543), SUM(c4 % 1544), + SUM(c4 % 1545), SUM(c4 % 1546), SUM(c4 % 1547), SUM(c4 % 1548), SUM(c4 % 1549), + SUM(c4 % 1550), SUM(c4 % 1551), SUM(c4 % 1552), SUM(c4 % 1553), SUM(c4 % 1554), + SUM(c4 % 1555), SUM(c4 % 1556), SUM(c4 % 1557), SUM(c4 % 1558), SUM(c4 % 1559), + SUM(c4 % 1560), SUM(c4 % 1561), SUM(c4 % 1562), SUM(c4 % 1563), SUM(c4 % 1564), + SUM(c4 % 1565), SUM(c4 % 1566), SUM(c4 % 1567), SUM(c4 % 1568), SUM(c4 % 1569), + SUM(c4 % 1570), SUM(c4 % 1571), SUM(c4 % 1572), SUM(c4 % 1573), SUM(c4 % 1574), + SUM(c4 % 1575), SUM(c4 % 1576), SUM(c4 % 1577), SUM(c4 % 1578), SUM(c4 % 1579), + SUM(c4 % 1580), SUM(c4 % 1581), SUM(c4 % 1582), SUM(c4 % 1583), SUM(c4 % 1584), + SUM(c4 % 1585), SUM(c4 % 1586), SUM(c4 % 1587), SUM(c4 % 1588), SUM(c4 % 1589), + SUM(c4 % 1590), SUM(c4 % 1591), SUM(c4 % 1592), SUM(c4 % 1593), SUM(c4 % 1594), + SUM(c4 % 1595), SUM(c4 % 1596), SUM(c4 % 1597), SUM(c4 % 1598), SUM(c4 % 1599), + SUM(c4 % 1600), SUM(c4 % 1601), SUM(c4 % 1602), SUM(c4 % 1603), SUM(c4 % 1604), + SUM(c4 % 1605), SUM(c4 % 1606), SUM(c4 % 1607), SUM(c4 % 1608), SUM(c4 % 1609), + SUM(c4 % 1610), SUM(c4 % 1611), SUM(c4 % 1612), SUM(c4 % 1613), SUM(c4 % 1614), + SUM(c4 % 1615), SUM(c4 % 1616), SUM(c4 % 1617), SUM(c4 % 1618), SUM(c4 % 1619), + SUM(c4 % 1620), SUM(c4 % 1621), SUM(c4 % 1622), SUM(c4 % 1623), SUM(c4 % 1624), + SUM(c4 % 1625), SUM(c4 % 1626), SUM(c4 % 1627), SUM(c4 % 1628), SUM(c4 % 1629), + SUM(c4 % 1630), SUM(c4 % 1631), SUM(c4 % 1632), SUM(c4 % 1633), SUM(c4 % 1634), + SUM(c4 % 1635), SUM(c4 % 1636), SUM(c4 % 1637), SUM(c4 % 1638), SUM(c4 % 1639), + SUM(c4 % 1640), SUM(c4 % 1641), SUM(c4 % 1642), SUM(c4 % 1643), SUM(c4 % 1644), + SUM(c4 % 1645), SUM(c4 % 1646), SUM(c4 % 1647), SUM(c4 % 1648), SUM(c4 % 1649), + SUM(c4 % 1650), SUM(c4 % 1651), SUM(c4 % 1652), SUM(c4 % 1653), SUM(c4 % 1654), + SUM(c4 % 1655), SUM(c4 % 1656), SUM(c4 % 1657), SUM(c4 % 1658), SUM(c4 % 1659), + SUM(c4 % 1660), SUM(c4 % 1661), SUM(c4 % 1662), SUM(c4 % 1663), SUM(c4 % 1664), + SUM(c4 % 1665), SUM(c4 % 1666), SUM(c4 % 1667), SUM(c4 % 1668), SUM(c4 % 1669), + SUM(c4 % 1670), SUM(c4 % 1671), SUM(c4 % 1672), SUM(c4 % 1673), SUM(c4 % 1674), + SUM(c4 % 1675), SUM(c4 % 1676), SUM(c4 % 1677), SUM(c4 % 1678), SUM(c4 % 1679), + SUM(c4 % 1680), SUM(c4 % 1681), SUM(c4 % 1682), SUM(c4 % 1683), SUM(c4 % 1684), + SUM(c4 % 1685), SUM(c4 % 1686), SUM(c4 % 1687), SUM(c4 % 1688), SUM(c4 % 1689), + SUM(c4 % 1690), SUM(c4 % 1691), SUM(c4 % 1692), SUM(c4 % 1693), SUM(c4 % 1694), + SUM(c4 % 1695), SUM(c4 % 1696), SUM(c4 % 1697), SUM(c4 % 1698), SUM(c4 % 1699), + SUM(c4 % 1700), SUM(c4 % 1701), SUM(c4 % 1702), SUM(c4 % 1703), SUM(c4 % 1704), + SUM(c4 % 1705), SUM(c4 % 1706), SUM(c4 % 1707), SUM(c4 % 1708), SUM(c4 % 1709), + SUM(c4 % 1710), SUM(c4 % 1711), SUM(c4 % 1712), SUM(c4 % 1713), SUM(c4 % 1714), + SUM(c4 % 1715), SUM(c4 % 1716), SUM(c4 % 1717), SUM(c4 % 1718), SUM(c4 % 1719), + SUM(c4 % 1720), SUM(c4 % 1721), SUM(c4 % 1722), SUM(c4 % 1723), SUM(c4 % 1724), + SUM(c4 % 1725), SUM(c4 % 1726), SUM(c4 % 1727), SUM(c4 % 1728), SUM(c4 % 1729), + SUM(c4 % 1730), SUM(c4 % 1731), SUM(c4 % 1732), SUM(c4 % 1733), SUM(c4 % 1734), + SUM(c4 % 1735), SUM(c4 % 1736), SUM(c4 % 1737), SUM(c4 % 1738), SUM(c4 % 1739), + SUM(c4 % 1740), SUM(c4 % 1741), SUM(c4 % 1742), SUM(c4 % 1743), SUM(c4 % 1744), + SUM(c4 % 1745), SUM(c4 % 1746), SUM(c4 % 1747), SUM(c4 % 1748), SUM(c4 % 1749), + SUM(c4 % 1750), SUM(c4 % 1751), SUM(c4 % 1752), SUM(c4 % 1753), SUM(c4 % 1754), + SUM(c4 % 1755), SUM(c4 % 1756), SUM(c4 % 1757), SUM(c4 % 1758), SUM(c4 % 1759), + SUM(c4 % 1760), SUM(c4 % 1761), SUM(c4 % 1762), SUM(c4 % 1763), SUM(c4 % 1764), + SUM(c4 % 1765), SUM(c4 % 1766), SUM(c4 % 1767), SUM(c4 % 1768), SUM(c4 % 1769), + SUM(c4 % 1770), SUM(c4 % 1771), SUM(c4 % 1772), SUM(c4 % 1773), SUM(c4 % 1774), + SUM(c4 % 1775), SUM(c4 % 1776), SUM(c4 % 1777), SUM(c4 % 1778), SUM(c4 % 1779), + SUM(c4 % 1780), SUM(c4 % 1781), SUM(c4 % 1782), SUM(c4 % 1783), SUM(c4 % 1784), + SUM(c4 % 1785), SUM(c4 % 1786), SUM(c4 % 1787), SUM(c4 % 1788), SUM(c4 % 1789), + SUM(c4 % 1790), SUM(c4 % 1791), SUM(c4 % 1792), SUM(c4 % 1793), SUM(c4 % 1794), + SUM(c4 % 1795), SUM(c4 % 1796), SUM(c4 % 1797), SUM(c4 % 1798), SUM(c4 % 1799), + SUM(c4 % 1800), SUM(c4 % 1801), SUM(c4 % 1802), SUM(c4 % 1803), SUM(c4 % 1804), + SUM(c4 % 1805), SUM(c4 % 1806), SUM(c4 % 1807), SUM(c4 % 1808), SUM(c4 % 1809), + SUM(c4 % 1810), SUM(c4 % 1811), SUM(c4 % 1812), SUM(c4 % 1813), SUM(c4 % 1814), + SUM(c4 % 1815), SUM(c4 % 1816), SUM(c4 % 1817), SUM(c4 % 1818), SUM(c4 % 1819), + SUM(c4 % 1820), SUM(c4 % 1821), SUM(c4 % 1822), SUM(c4 % 1823), SUM(c4 % 1824), + SUM(c4 % 1825), SUM(c4 % 1826), SUM(c4 % 1827), SUM(c4 % 1828), SUM(c4 % 1829), + SUM(c4 % 1830), SUM(c4 % 1831), SUM(c4 % 1832), SUM(c4 % 1833), SUM(c4 % 1834), + SUM(c4 % 1835), SUM(c4 % 1836), SUM(c4 % 1837), SUM(c4 % 1838), SUM(c4 % 1839), + SUM(c4 % 1840), SUM(c4 % 1841), SUM(c4 % 1842), SUM(c4 % 1843), SUM(c4 % 1844), + SUM(c4 % 1845), SUM(c4 % 1846), SUM(c4 % 1847), SUM(c4 % 1848), SUM(c4 % 1849), + SUM(c4 % 1850), SUM(c4 % 1851), SUM(c4 % 1852), SUM(c4 % 1853), SUM(c4 % 1854), + SUM(c4 % 1855), SUM(c4 % 1856), SUM(c4 % 1857), SUM(c4 % 1858), SUM(c4 % 1859), + SUM(c4 % 1860), SUM(c4 % 1861), SUM(c4 % 1862), SUM(c4 % 1863), SUM(c4 % 1864), + SUM(c4 % 1865), SUM(c4 % 1866), SUM(c4 % 1867), SUM(c4 % 1868), SUM(c4 % 1869), + SUM(c4 % 1870), SUM(c4 % 1871), SUM(c4 % 1872), SUM(c4 % 1873), SUM(c4 % 1874), + SUM(c4 % 1875), SUM(c4 % 1876), SUM(c4 % 1877), SUM(c4 % 1878), SUM(c4 % 1879), + SUM(c4 % 1880), SUM(c4 % 1881), SUM(c4 % 1882), SUM(c4 % 1883), SUM(c4 % 1884), + SUM(c4 % 1885), SUM(c4 % 1886), SUM(c4 % 1887), SUM(c4 % 1888), SUM(c4 % 1889), + SUM(c4 % 1890), SUM(c4 % 1891), SUM(c4 % 1892), SUM(c4 % 1893), SUM(c4 % 1894), + SUM(c4 % 1895), SUM(c4 % 1896), SUM(c4 % 1897), SUM(c4 % 1898), SUM(c4 % 1899), + SUM(c4 % 1900), SUM(c4 % 1901), SUM(c4 % 1902), SUM(c4 % 1903), SUM(c4 % 1904), + SUM(c4 % 1905), SUM(c4 % 1906), SUM(c4 % 1907), SUM(c4 % 1908), SUM(c4 % 1909), + SUM(c4 % 1910), SUM(c4 % 1911), SUM(c4 % 1912), SUM(c4 % 1913), SUM(c4 % 1914), + SUM(c4 % 1915), SUM(c4 % 1916), SUM(c4 % 1917), SUM(c4 % 1918), SUM(c4 % 1919), + SUM(c4 % 1920), SUM(c4 % 1921), SUM(c4 % 1922), SUM(c4 % 1923), SUM(c4 % 1924), + SUM(c4 % 1925), SUM(c4 % 1926), SUM(c4 % 1927), SUM(c4 % 1928), SUM(c4 % 1929), + SUM(c4 % 1930), SUM(c4 % 1931), SUM(c4 % 1932), SUM(c4 % 1933), SUM(c4 % 1934), + SUM(c4 % 1935), SUM(c4 % 1936), SUM(c4 % 1937), SUM(c4 % 1938), SUM(c4 % 1939), + SUM(c4 % 1940), SUM(c4 % 1941), SUM(c4 % 1942), SUM(c4 % 1943), SUM(c4 % 1944), + SUM(c4 % 1945), SUM(c4 % 1946), SUM(c4 % 1947), SUM(c4 % 1948), SUM(c4 % 1949), + SUM(c4 % 1950), SUM(c4 % 1951), SUM(c4 % 1952), SUM(c4 % 1953), SUM(c4 % 1954), + SUM(c4 % 1955), SUM(c4 % 1956), SUM(c4 % 1957), SUM(c4 % 1958), SUM(c4 % 1959), + SUM(c4 % 1960), SUM(c4 % 1961), SUM(c4 % 1962), SUM(c4 % 1963), SUM(c4 % 1964), + SUM(c4 % 1965), SUM(c4 % 1966), SUM(c4 % 1967), SUM(c4 % 1968), SUM(c4 % 1969), + SUM(c4 % 1970), SUM(c4 % 1971), SUM(c4 % 1972), SUM(c4 % 1973), SUM(c4 % 1974), + SUM(c4 % 1975), SUM(c4 % 1976), SUM(c4 % 1977), SUM(c4 % 1978), SUM(c4 % 1979), + SUM(c4 % 1980), SUM(c4 % 1981), SUM(c4 % 1982), SUM(c4 % 1983), SUM(c4 % 1984), + SUM(c4 % 1985), SUM(c4 % 1986), SUM(c4 % 1987), SUM(c4 % 1988), SUM(c4 % 1989), + SUM(c4 % 1990), SUM(c4 % 1991), SUM(c4 % 1992), SUM(c4 % 1993), SUM(c4 % 1994), + SUM(c4 % 1995), SUM(c4 % 1996), SUM(c4 % 1997), SUM(c4 % 1998), SUM(c4 % 1999), + SUM(c4 % 2000), SUM(c4 % 2001), SUM(c4 % 2002), SUM(c4 % 2003), SUM(c4 % 2004), + SUM(c4 % 2005), SUM(c4 % 2006), SUM(c4 % 2007), SUM(c4 % 2008), SUM(c4 % 2009), + SUM(c4 % 2010), SUM(c4 % 2011), SUM(c4 % 2012), SUM(c4 % 2013), SUM(c4 % 2014), + SUM(c4 % 2015), SUM(c4 % 2016), SUM(c4 % 2017), SUM(c4 % 2018), SUM(c4 % 2019), + SUM(c4 % 2020), SUM(c4 % 2021), SUM(c4 % 2022), SUM(c4 % 2023), SUM(c4 % 2024), + SUM(c4 % 2025), SUM(c4 % 2026), SUM(c4 % 2027), SUM(c4 % 2028), SUM(c4 % 2029), + SUM(c4 % 2030), SUM(c4 % 2031), SUM(c4 % 2032), SUM(c4 % 2033), SUM(c4 % 2034), + SUM(c4 % 2035), SUM(c4 % 2036), SUM(c4 % 2037), SUM(c4 % 2038), SUM(c4 % 2039), + SUM(c4 % 2040), SUM(c4 % 2041), SUM(c4 % 2042), SUM(c4 % 2043), SUM(c4 % 2044), + SUM(c4 % 2045), SUM(c4 % 2046), SUM(c4 % 2047), SUM(c4 % 2048), SUM(c4 % 2049), + SUM(c4 % 2050), SUM(c4 % 2051), SUM(c4 % 2052), SUM(c4 % 2053), SUM(c4 % 2054), + SUM(c4 % 2055), SUM(c4 % 2056), SUM(c4 % 2057), SUM(c4 % 2058), SUM(c4 % 2059), + SUM(c4 % 2060), SUM(c4 % 2061), SUM(c4 % 2062), SUM(c4 % 2063), SUM(c4 % 2064), + SUM(c4 % 2065), SUM(c4 % 2066), SUM(c4 % 2067), SUM(c4 % 2068), SUM(c4 % 2069), + SUM(c4 % 2070), SUM(c4 % 2071), SUM(c4 % 2072), SUM(c4 % 2073), SUM(c4 % 2074), + SUM(c4 % 2075), SUM(c4 % 2076), SUM(c4 % 2077), SUM(c4 % 2078), SUM(c4 % 2079), + SUM(c4 % 2080), SUM(c4 % 2081), SUM(c4 % 2082), SUM(c4 % 2083), SUM(c4 % 2084), + SUM(c4 % 2085), SUM(c4 % 2086), SUM(c4 % 2087), SUM(c4 % 2088), SUM(c4 % 2089), + SUM(c4 % 2090), SUM(c4 % 2091), SUM(c4 % 2092), SUM(c4 % 2093), SUM(c4 % 2094), + SUM(c4 % 2095), SUM(c4 % 2096), SUM(c4 % 2097), SUM(c4 % 2098), SUM(c4 % 2099), + SUM(c4 % 2100), SUM(c4 % 2101), SUM(c4 % 2102), SUM(c4 % 2103), SUM(c4 % 2104), + SUM(c4 % 2105), SUM(c4 % 2106), SUM(c4 % 2107), SUM(c4 % 2108), SUM(c4 % 2109), + SUM(c4 % 2110), SUM(c4 % 2111), SUM(c4 % 2112), SUM(c4 % 2113), SUM(c4 % 2114), + SUM(c4 % 2115), SUM(c4 % 2116), SUM(c4 % 2117), SUM(c4 % 2118), SUM(c4 % 2119), + SUM(c4 % 2120), SUM(c4 % 2121), SUM(c4 % 2122), SUM(c4 % 2123), SUM(c4 % 2124), + SUM(c4 % 2125), SUM(c4 % 2126), SUM(c4 % 2127), SUM(c4 % 2128), SUM(c4 % 2129), + SUM(c4 % 2130), SUM(c4 % 2131), SUM(c4 % 2132), SUM(c4 % 2133), SUM(c4 % 2134), + SUM(c4 % 2135), SUM(c4 % 2136), SUM(c4 % 2137), SUM(c4 % 2138), SUM(c4 % 2139), + SUM(c4 % 2140), SUM(c4 % 2141), SUM(c4 % 2142), SUM(c4 % 2143), SUM(c4 % 2144), + SUM(c4 % 2145), SUM(c4 % 2146), SUM(c4 % 2147), SUM(c4 % 2148), SUM(c4 % 2149), + SUM(c4 % 2150), SUM(c4 % 2151), SUM(c4 % 2152), SUM(c4 % 2153), SUM(c4 % 2154), + SUM(c4 % 2155), SUM(c4 % 2156), SUM(c4 % 2157), SUM(c4 % 2158), SUM(c4 % 2159), + SUM(c4 % 2160), SUM(c4 % 2161), SUM(c4 % 2162), SUM(c4 % 2163), SUM(c4 % 2164), + SUM(c4 % 2165), SUM(c4 % 2166), SUM(c4 % 2167), SUM(c4 % 2168), SUM(c4 % 2169), + SUM(c4 % 2170), SUM(c4 % 2171), SUM(c4 % 2172), SUM(c4 % 2173), SUM(c4 % 2174), + SUM(c4 % 2175), SUM(c4 % 2176), SUM(c4 % 2177), SUM(c4 % 2178), SUM(c4 % 2179), + SUM(c4 % 2180), SUM(c4 % 2181), SUM(c4 % 2182), SUM(c4 % 2183), SUM(c4 % 2184), + SUM(c4 % 2185), SUM(c4 % 2186), SUM(c4 % 2187), SUM(c4 % 2188), SUM(c4 % 2189), + SUM(c4 % 2190), SUM(c4 % 2191), SUM(c4 % 2192), SUM(c4 % 2193), SUM(c4 % 2194), + SUM(c4 % 2195), SUM(c4 % 2196), SUM(c4 % 2197), SUM(c4 % 2198), SUM(c4 % 2199), + SUM(c4 % 2200), SUM(c4 % 2201), SUM(c4 % 2202), SUM(c4 % 2203), SUM(c4 % 2204), + SUM(c4 % 2205), SUM(c4 % 2206), SUM(c4 % 2207), SUM(c4 % 2208), SUM(c4 % 2209), + SUM(c4 % 2210), SUM(c4 % 2211), SUM(c4 % 2212), SUM(c4 % 2213), SUM(c4 % 2214), + SUM(c4 % 2215), SUM(c4 % 2216), SUM(c4 % 2217), SUM(c4 % 2218), SUM(c4 % 2219), + SUM(c4 % 2220), SUM(c4 % 2221), SUM(c4 % 2222), SUM(c4 % 2223), SUM(c4 % 2224), + SUM(c4 % 2225), SUM(c4 % 2226), SUM(c4 % 2227), SUM(c4 % 2228), SUM(c4 % 2229), + SUM(c4 % 2230), SUM(c4 % 2231), SUM(c4 % 2232), SUM(c4 % 2233), SUM(c4 % 2234), + SUM(c4 % 2235), SUM(c4 % 2236), SUM(c4 % 2237), SUM(c4 % 2238), SUM(c4 % 2239), + SUM(c4 % 2240), SUM(c4 % 2241), SUM(c4 % 2242), SUM(c4 % 2243), SUM(c4 % 2244), + SUM(c4 % 2245), SUM(c4 % 2246), SUM(c4 % 2247), SUM(c4 % 2248), SUM(c4 % 2249), + SUM(c4 % 2250), SUM(c4 % 2251), SUM(c4 % 2252), SUM(c4 % 2253), SUM(c4 % 2254), + SUM(c4 % 2255), SUM(c4 % 2256), SUM(c4 % 2257), SUM(c4 % 2258), SUM(c4 % 2259), + SUM(c4 % 2260), SUM(c4 % 2261), SUM(c4 % 2262), SUM(c4 % 2263), SUM(c4 % 2264), + SUM(c4 % 2265), SUM(c4 % 2266), SUM(c4 % 2267), SUM(c4 % 2268), SUM(c4 % 2269), + SUM(c4 % 2270), SUM(c4 % 2271), SUM(c4 % 2272), SUM(c4 % 2273), SUM(c4 % 2274), + SUM(c4 % 2275), SUM(c4 % 2276), SUM(c4 % 2277), SUM(c4 % 2278), SUM(c4 % 2279), + SUM(c4 % 2280), SUM(c4 % 2281), SUM(c4 % 2282), SUM(c4 % 2283), SUM(c4 % 2284), + SUM(c4 % 2285), SUM(c4 % 2286), SUM(c4 % 2287), SUM(c4 % 2288), SUM(c4 % 2289), + SUM(c4 % 2290), SUM(c4 % 2291), SUM(c4 % 2292), SUM(c4 % 2293), SUM(c4 % 2294), + SUM(c4 % 2295), SUM(c4 % 2296), SUM(c4 % 2297), SUM(c4 % 2298), SUM(c4 % 2299), + SUM(c4 % 2300), SUM(c4 % 2301), SUM(c4 % 2302), SUM(c4 % 2303), SUM(c4 % 2304), + SUM(c4 % 2305), SUM(c4 % 2306), SUM(c4 % 2307), SUM(c4 % 2308), SUM(c4 % 2309), + SUM(c4 % 2310), SUM(c4 % 2311), SUM(c4 % 2312), SUM(c4 % 2313), SUM(c4 % 2314), + SUM(c4 % 2315), SUM(c4 % 2316), SUM(c4 % 2317), SUM(c4 % 2318), SUM(c4 % 2319), + SUM(c4 % 2320), SUM(c4 % 2321), SUM(c4 % 2322), SUM(c4 % 2323), SUM(c4 % 2324), + SUM(c4 % 2325), SUM(c4 % 2326), SUM(c4 % 2327), SUM(c4 % 2328), SUM(c4 % 2329), + SUM(c4 % 2330), SUM(c4 % 2331), SUM(c4 % 2332), SUM(c4 % 2333), SUM(c4 % 2334), + SUM(c4 % 2335), SUM(c4 % 2336), SUM(c4 % 2337), SUM(c4 % 2338), SUM(c4 % 2339), + SUM(c4 % 2340), SUM(c4 % 2341), SUM(c4 % 2342), SUM(c4 % 2343), SUM(c4 % 2344), + SUM(c4 % 2345), SUM(c4 % 2346), SUM(c4 % 2347), SUM(c4 % 2348), SUM(c4 % 2349), + SUM(c4 % 2350), SUM(c4 % 2351), SUM(c4 % 2352), SUM(c4 % 2353), SUM(c4 % 2354), + SUM(c4 % 2355), SUM(c4 % 2356), SUM(c4 % 2357), SUM(c4 % 2358), SUM(c4 % 2359), + SUM(c4 % 2360), SUM(c4 % 2361), SUM(c4 % 2362), SUM(c4 % 2363), SUM(c4 % 2364), + SUM(c4 % 2365), SUM(c4 % 2366), SUM(c4 % 2367), SUM(c4 % 2368), SUM(c4 % 2369), + SUM(c4 % 2370), SUM(c4 % 2371), SUM(c4 % 2372), SUM(c4 % 2373), SUM(c4 % 2374), + SUM(c4 % 2375), SUM(c4 % 2376), SUM(c4 % 2377), SUM(c4 % 2378), SUM(c4 % 2379), + SUM(c4 % 2380), SUM(c4 % 2381), SUM(c4 % 2382), SUM(c4 % 2383), SUM(c4 % 2384), + SUM(c4 % 2385), SUM(c4 % 2386), SUM(c4 % 2387), SUM(c4 % 2388), SUM(c4 % 2389), + SUM(c4 % 2390), SUM(c4 % 2391), SUM(c4 % 2392), SUM(c4 % 2393), SUM(c4 % 2394), + SUM(c4 % 2395), SUM(c4 % 2396), SUM(c4 % 2397), SUM(c4 % 2398), SUM(c4 % 2399), + SUM(c4 % 2400), SUM(c4 % 2401), SUM(c4 % 2402), SUM(c4 % 2403), SUM(c4 % 2404), + SUM(c4 % 2405), SUM(c4 % 2406), SUM(c4 % 2407), SUM(c4 % 2408), SUM(c4 % 2409), + SUM(c4 % 2410), SUM(c4 % 2411), SUM(c4 % 2412), SUM(c4 % 2413), SUM(c4 % 2414), + SUM(c4 % 2415), SUM(c4 % 2416), SUM(c4 % 2417), SUM(c4 % 2418), SUM(c4 % 2419), + SUM(c4 % 2420), SUM(c4 % 2421), SUM(c4 % 2422), SUM(c4 % 2423), SUM(c4 % 2424), + SUM(c4 % 2425), SUM(c4 % 2426), SUM(c4 % 2427), SUM(c4 % 2428), SUM(c4 % 2429), + SUM(c4 % 2430), SUM(c4 % 2431), SUM(c4 % 2432), SUM(c4 % 2433), SUM(c4 % 2434), + SUM(c4 % 2435), SUM(c4 % 2436), SUM(c4 % 2437), SUM(c4 % 2438), SUM(c4 % 2439), + SUM(c4 % 2440), SUM(c4 % 2441), SUM(c4 % 2442), SUM(c4 % 2443), SUM(c4 % 2444), + SUM(c4 % 2445), SUM(c4 % 2446), SUM(c4 % 2447), SUM(c4 % 2448), SUM(c4 % 2449), + SUM(c4 % 2450), SUM(c4 % 2451), SUM(c4 % 2452), SUM(c4 % 2453), SUM(c4 % 2454), + SUM(c4 % 2455), SUM(c4 % 2456), SUM(c4 % 2457), SUM(c4 % 2458), SUM(c4 % 2459), + SUM(c4 % 2460), SUM(c4 % 2461), SUM(c4 % 2462), SUM(c4 % 2463), SUM(c4 % 2464), + SUM(c4 % 2465), SUM(c4 % 2466), SUM(c4 % 2467), SUM(c4 % 2468), SUM(c4 % 2469), + SUM(c4 % 2470), SUM(c4 % 2471), SUM(c4 % 2472), SUM(c4 % 2473), SUM(c4 % 2474), + SUM(c4 % 2475), SUM(c4 % 2476), SUM(c4 % 2477), SUM(c4 % 2478), SUM(c4 % 2479), + SUM(c4 % 2480), SUM(c4 % 2481), SUM(c4 % 2482), SUM(c4 % 2483), SUM(c4 % 2484), + SUM(c4 % 2485), SUM(c4 % 2486), SUM(c4 % 2487), SUM(c4 % 2488), SUM(c4 % 2489), + SUM(c4 % 2490), SUM(c4 % 2491), SUM(c4 % 2492), SUM(c4 % 2493), SUM(c4 % 2494), + SUM(c4 % 2495), SUM(c4 % 2496), SUM(c4 % 2497), SUM(c4 % 2498), SUM(c4 % 2499), + SUM(c4 % 2500), SUM(c4 % 2501), SUM(c4 % 2502), SUM(c4 % 2503), SUM(c4 % 2504), + SUM(c4 % 2505), SUM(c4 % 2506), SUM(c4 % 2507), SUM(c4 % 2508), SUM(c4 % 2509), + SUM(c4 % 2510), SUM(c4 % 2511), SUM(c4 % 2512), SUM(c4 % 2513), SUM(c4 % 2514), + SUM(c4 % 2515), SUM(c4 % 2516), SUM(c4 % 2517), SUM(c4 % 2518), SUM(c4 % 2519), + SUM(c4 % 2520), SUM(c4 % 2521), SUM(c4 % 2522), SUM(c4 % 2523), SUM(c4 % 2524), + SUM(c4 % 2525), SUM(c4 % 2526), SUM(c4 % 2527), SUM(c4 % 2528), SUM(c4 % 2529), + SUM(c4 % 2530), SUM(c4 % 2531), SUM(c4 % 2532), SUM(c4 % 2533), SUM(c4 % 2534), + SUM(c4 % 2535), SUM(c4 % 2536), SUM(c4 % 2537), SUM(c4 % 2538), SUM(c4 % 2539), + SUM(c4 % 2540), SUM(c4 % 2541), SUM(c4 % 2542), SUM(c4 % 2543), SUM(c4 % 2544), + SUM(c4 % 2545), SUM(c4 % 2546), SUM(c4 % 2547), SUM(c4 % 2548), SUM(c4 % 2549), + SUM(c4 % 2550), SUM(c4 % 2551), SUM(c4 % 2552), SUM(c4 % 2553), SUM(c4 % 2554), + SUM(c4 % 2555), SUM(c4 % 2556), SUM(c4 % 2557), SUM(c4 % 2558), SUM(c4 % 2559), + SUM(c4 % 2560), SUM(c4 % 2561), SUM(c4 % 2562), SUM(c4 % 2563), SUM(c4 % 2564), + SUM(c4 % 2565), SUM(c4 % 2566), SUM(c4 % 2567), SUM(c4 % 2568), SUM(c4 % 2569), + SUM(c4 % 2570), SUM(c4 % 2571), SUM(c4 % 2572), SUM(c4 % 2573), SUM(c4 % 2574), + SUM(c4 % 2575), SUM(c4 % 2576), SUM(c4 % 2577), SUM(c4 % 2578), SUM(c4 % 2579), + SUM(c4 % 2580), SUM(c4 % 2581), SUM(c4 % 2582), SUM(c4 % 2583), SUM(c4 % 2584), + SUM(c4 % 2585), SUM(c4 % 2586), SUM(c4 % 2587), SUM(c4 % 2588), SUM(c4 % 2589), + SUM(c4 % 2590), SUM(c4 % 2591), SUM(c4 % 2592), SUM(c4 % 2593), SUM(c4 % 2594), + SUM(c4 % 2595), SUM(c4 % 2596), SUM(c4 % 2597), SUM(c4 % 2598), SUM(c4 % 2599), + SUM(c4 % 2600), SUM(c4 % 2601), SUM(c4 % 2602), SUM(c4 % 2603), SUM(c4 % 2604), + SUM(c4 % 2605), SUM(c4 % 2606), SUM(c4 % 2607), SUM(c4 % 2608), SUM(c4 % 2609), + SUM(c4 % 2610), SUM(c4 % 2611), SUM(c4 % 2612), SUM(c4 % 2613), SUM(c4 % 2614), + SUM(c4 % 2615), SUM(c4 % 2616), SUM(c4 % 2617), SUM(c4 % 2618), SUM(c4 % 2619), + SUM(c4 % 2620), SUM(c4 % 2621), SUM(c4 % 2622), SUM(c4 % 2623), SUM(c4 % 2624), + SUM(c4 % 2625), SUM(c4 % 2626), SUM(c4 % 2627), SUM(c4 % 2628), SUM(c4 % 2629), + SUM(c4 % 2630), SUM(c4 % 2631), SUM(c4 % 2632), SUM(c4 % 2633), SUM(c4 % 2634), + SUM(c4 % 2635), SUM(c4 % 2636), SUM(c4 % 2637), SUM(c4 % 2638), SUM(c4 % 2639), + SUM(c4 % 2640), SUM(c4 % 2641), SUM(c4 % 2642), SUM(c4 % 2643), SUM(c4 % 2644), + SUM(c4 % 2645), SUM(c4 % 2646), SUM(c4 % 2647), SUM(c4 % 2648), SUM(c4 % 2649), + SUM(c4 % 2650), SUM(c4 % 2651), SUM(c4 % 2652), SUM(c4 % 2653), SUM(c4 % 2654), + SUM(c4 % 2655), SUM(c4 % 2656), SUM(c4 % 2657), SUM(c4 % 2658), SUM(c4 % 2659), + SUM(c4 % 2660), SUM(c4 % 2661), SUM(c4 % 2662), SUM(c4 % 2663), SUM(c4 % 2664), + SUM(c4 % 2665), SUM(c4 % 2666), SUM(c4 % 2667), SUM(c4 % 2668), SUM(c4 % 2669), + SUM(c4 % 2670), SUM(c4 % 2671), SUM(c4 % 2672), SUM(c4 % 2673), SUM(c4 % 2674), + SUM(c4 % 2675), SUM(c4 % 2676), SUM(c4 % 2677), SUM(c4 % 2678), SUM(c4 % 2679), + SUM(c4 % 2680), SUM(c4 % 2681), SUM(c4 % 2682), SUM(c4 % 2683), SUM(c4 % 2684), + SUM(c4 % 2685), SUM(c4 % 2686), SUM(c4 % 2687), SUM(c4 % 2688), SUM(c4 % 2689), + SUM(c4 % 2690), SUM(c4 % 2691), SUM(c4 % 2692), SUM(c4 % 2693), SUM(c4 % 2694), + SUM(c4 % 2695), SUM(c4 % 2696), SUM(c4 % 2697), SUM(c4 % 2698), SUM(c4 % 2699), + SUM(c4 % 2700), SUM(c4 % 2701), SUM(c4 % 2702), SUM(c4 % 2703), SUM(c4 % 2704), + SUM(c4 % 2705), SUM(c4 % 2706), SUM(c4 % 2707), SUM(c4 % 2708), SUM(c4 % 2709), + SUM(c4 % 2710), SUM(c4 % 2711), SUM(c4 % 2712), SUM(c4 % 2713), SUM(c4 % 2714), + SUM(c4 % 2715), SUM(c4 % 2716), SUM(c4 % 2717), SUM(c4 % 2718), SUM(c4 % 2719), + SUM(c4 % 2720), SUM(c4 % 2721), SUM(c4 % 2722), SUM(c4 % 2723), SUM(c4 % 2724), + SUM(c4 % 2725), SUM(c4 % 2726), SUM(c4 % 2727), SUM(c4 % 2728), SUM(c4 % 2729), + SUM(c4 % 2730), SUM(c4 % 2731), SUM(c4 % 2732), SUM(c4 % 2733), SUM(c4 % 2734), + SUM(c4 % 2735), SUM(c4 % 2736), SUM(c4 % 2737), SUM(c4 % 2738), SUM(c4 % 2739), + SUM(c4 % 2740), SUM(c4 % 2741), SUM(c4 % 2742), SUM(c4 % 2743), SUM(c4 % 2744), + SUM(c4 % 2745), SUM(c4 % 2746), SUM(c4 % 2747), SUM(c4 % 2748), SUM(c4 % 2749), + SUM(c4 % 2750), SUM(c4 % 2751), SUM(c4 % 2752), SUM(c4 % 2753), SUM(c4 % 2754), + SUM(c4 % 2755), SUM(c4 % 2756), SUM(c4 % 2757), SUM(c4 % 2758), SUM(c4 % 2759), + SUM(c4 % 2760), SUM(c4 % 2761), SUM(c4 % 2762), SUM(c4 % 2763), SUM(c4 % 2764), + SUM(c4 % 2765), SUM(c4 % 2766), SUM(c4 % 2767), SUM(c4 % 2768), SUM(c4 % 2769), + SUM(c4 % 2770), SUM(c4 % 2771), SUM(c4 % 2772), SUM(c4 % 2773), SUM(c4 % 2774), + SUM(c4 % 2775), SUM(c4 % 2776), SUM(c4 % 2777), SUM(c4 % 2778), SUM(c4 % 2779), + SUM(c4 % 2780), SUM(c4 % 2781), SUM(c4 % 2782), SUM(c4 % 2783), SUM(c4 % 2784), + SUM(c4 % 2785), SUM(c4 % 2786), SUM(c4 % 2787), SUM(c4 % 2788), SUM(c4 % 2789), + SUM(c4 % 2790), SUM(c4 % 2791), SUM(c4 % 2792), SUM(c4 % 2793), SUM(c4 % 2794), + SUM(c4 % 2795), SUM(c4 % 2796), SUM(c4 % 2797), SUM(c4 % 2798), SUM(c4 % 2799), + SUM(c4 % 2800), SUM(c4 % 2801), SUM(c4 % 2802), SUM(c4 % 2803), SUM(c4 % 2804), + SUM(c4 % 2805), SUM(c4 % 2806), SUM(c4 % 2807), SUM(c4 % 2808), SUM(c4 % 2809), + SUM(c4 % 2810), SUM(c4 % 2811), SUM(c4 % 2812), SUM(c4 % 2813), SUM(c4 % 2814), + SUM(c4 % 2815), SUM(c4 % 2816), SUM(c4 % 2817), SUM(c4 % 2818), SUM(c4 % 2819), + SUM(c4 % 2820), SUM(c4 % 2821), SUM(c4 % 2822), SUM(c4 % 2823), SUM(c4 % 2824), + SUM(c4 % 2825), SUM(c4 % 2826), SUM(c4 % 2827), SUM(c4 % 2828), SUM(c4 % 2829), + SUM(c4 % 2830), SUM(c4 % 2831), SUM(c4 % 2832), SUM(c4 % 2833), SUM(c4 % 2834), + SUM(c4 % 2835), SUM(c4 % 2836), SUM(c4 % 2837), SUM(c4 % 2838), SUM(c4 % 2839), + SUM(c4 % 2840), SUM(c4 % 2841), SUM(c4 % 2842), SUM(c4 % 2843), SUM(c4 % 2844), + SUM(c4 % 2845), SUM(c4 % 2846), SUM(c4 % 2847), SUM(c4 % 2848), SUM(c4 % 2849), + SUM(c4 % 2850), SUM(c4 % 2851), SUM(c4 % 2852), SUM(c4 % 2853), SUM(c4 % 2854), + SUM(c4 % 2855), SUM(c4 % 2856), SUM(c4 % 2857), SUM(c4 % 2858), SUM(c4 % 2859), + SUM(c4 % 2860), SUM(c4 % 2861), SUM(c4 % 2862), SUM(c4 % 2863), SUM(c4 % 2864), + SUM(c4 % 2865), SUM(c4 % 2866), SUM(c4 % 2867), SUM(c4 % 2868), SUM(c4 % 2869), + SUM(c4 % 2870), SUM(c4 % 2871), SUM(c4 % 2872), SUM(c4 % 2873), SUM(c4 % 2874), + SUM(c4 % 2875), SUM(c4 % 2876), SUM(c4 % 2877), SUM(c4 % 2878), SUM(c4 % 2879), + SUM(c4 % 2880), SUM(c4 % 2881), SUM(c4 % 2882), SUM(c4 % 2883), SUM(c4 % 2884), + SUM(c4 % 2885), SUM(c4 % 2886), SUM(c4 % 2887), SUM(c4 % 2888), SUM(c4 % 2889), + SUM(c4 % 2890), SUM(c4 % 2891), SUM(c4 % 2892), SUM(c4 % 2893), SUM(c4 % 2894), + SUM(c4 % 2895), SUM(c4 % 2896), SUM(c4 % 2897), SUM(c4 % 2898), SUM(c4 % 2899), + SUM(c4 % 2900), SUM(c4 % 2901), SUM(c4 % 2902), SUM(c4 % 2903), SUM(c4 % 2904), + SUM(c4 % 2905), SUM(c4 % 2906), SUM(c4 % 2907), SUM(c4 % 2908), SUM(c4 % 2909), + SUM(c4 % 2910), SUM(c4 % 2911), SUM(c4 % 2912), SUM(c4 % 2913), SUM(c4 % 2914), + SUM(c4 % 2915), SUM(c4 % 2916), SUM(c4 % 2917), SUM(c4 % 2918), SUM(c4 % 2919), + SUM(c4 % 2920), SUM(c4 % 2921), SUM(c4 % 2922), SUM(c4 % 2923), SUM(c4 % 2924), + SUM(c4 % 2925), SUM(c4 % 2926), SUM(c4 % 2927), SUM(c4 % 2928), SUM(c4 % 2929), + SUM(c4 % 2930), SUM(c4 % 2931), SUM(c4 % 2932), SUM(c4 % 2933), SUM(c4 % 2934), + SUM(c4 % 2935), SUM(c4 % 2936), SUM(c4 % 2937), SUM(c4 % 2938), SUM(c4 % 2939), + SUM(c4 % 2940), SUM(c4 % 2941), SUM(c4 % 2942), SUM(c4 % 2943), SUM(c4 % 2944), + SUM(c4 % 2945), SUM(c4 % 2946), SUM(c4 % 2947), SUM(c4 % 2948), SUM(c4 % 2949), + SUM(c4 % 2950), SUM(c4 % 2951), SUM(c4 % 2952), SUM(c4 % 2953), SUM(c4 % 2954), + SUM(c4 % 2955), SUM(c4 % 2956), SUM(c4 % 2957), SUM(c4 % 2958), SUM(c4 % 2959), + SUM(c4 % 2960), SUM(c4 % 2961), SUM(c4 % 2962), SUM(c4 % 2963), SUM(c4 % 2964), + SUM(c4 % 2965), SUM(c4 % 2966), SUM(c4 % 2967), SUM(c4 % 2968), SUM(c4 % 2969), + SUM(c4 % 2970), SUM(c4 % 2971), SUM(c4 % 2972), SUM(c4 % 2973), SUM(c4 % 2974), + SUM(c4 % 2975), SUM(c4 % 2976), SUM(c4 % 2977), SUM(c4 % 2978), SUM(c4 % 2979), + SUM(c4 % 2980), SUM(c4 % 2981), SUM(c4 % 2982), SUM(c4 % 2983), SUM(c4 % 2984), + SUM(c4 % 2985), SUM(c4 % 2986), SUM(c4 % 2987), SUM(c4 % 2988), SUM(c4 % 2989), + SUM(c4 % 2990), SUM(c4 % 2991), SUM(c4 % 2992), SUM(c4 % 2993), SUM(c4 % 2994), + SUM(c4 % 2995), SUM(c4 % 2996), SUM(c4 % 2997), SUM(c4 % 2998), SUM(c4 % 2999), + SUM(c4 % 3000), SUM(c4 % 3001), SUM(c4 % 3002), SUM(c4 % 3003), SUM(c4 % 3004), + SUM(c4 % 3005), SUM(c4 % 3006), SUM(c4 % 3007), SUM(c4 % 3008), SUM(c4 % 3009), + SUM(c4 % 3010), SUM(c4 % 3011), SUM(c4 % 3012), SUM(c4 % 3013), SUM(c4 % 3014), + SUM(c4 % 3015), SUM(c4 % 3016), SUM(c4 % 3017), SUM(c4 % 3018), SUM(c4 % 3019), + SUM(c4 % 3020), SUM(c4 % 3021), SUM(c4 % 3022), SUM(c4 % 3023), SUM(c4 % 3024), + SUM(c4 % 3025), SUM(c4 % 3026), SUM(c4 % 3027), SUM(c4 % 3028), SUM(c4 % 3029), + SUM(c4 % 3030), SUM(c4 % 3031), SUM(c4 % 3032), SUM(c4 % 3033), SUM(c4 % 3034), + SUM(c4 % 3035), SUM(c4 % 3036), SUM(c4 % 3037), SUM(c4 % 3038), SUM(c4 % 3039), + SUM(c4 % 3040), SUM(c4 % 3041), SUM(c4 % 3042), SUM(c4 % 3043), SUM(c4 % 3044), + SUM(c4 % 3045), SUM(c4 % 3046), SUM(c4 % 3047), SUM(c4 % 3048), SUM(c4 % 3049), + SUM(c4 % 3050), SUM(c4 % 3051), SUM(c4 % 3052), SUM(c4 % 3053), SUM(c4 % 3054), + SUM(c4 % 3055), SUM(c4 % 3056), SUM(c4 % 3057), SUM(c4 % 3058), SUM(c4 % 3059), + SUM(c4 % 3060), SUM(c4 % 3061), SUM(c4 % 3062), SUM(c4 % 3063), SUM(c4 % 3064), + SUM(c4 % 3065), SUM(c4 % 3066), SUM(c4 % 3067), SUM(c4 % 3068), SUM(c4 % 3069), + SUM(c4 % 3070), SUM(c4 % 3071), SUM(c4 % 3072), SUM(c4 % 3073), SUM(c4 % 3074), + SUM(c4 % 3075), SUM(c4 % 3076), SUM(c4 % 3077), SUM(c4 % 3078), SUM(c4 % 3079), + SUM(c4 % 3080), SUM(c4 % 3081), SUM(c4 % 3082), SUM(c4 % 3083), SUM(c4 % 3084), + SUM(c4 % 3085), SUM(c4 % 3086), SUM(c4 % 3087), SUM(c4 % 3088), SUM(c4 % 3089), + SUM(c4 % 3090), SUM(c4 % 3091), SUM(c4 % 3092), SUM(c4 % 3093), SUM(c4 % 3094), + SUM(c4 % 3095), SUM(c4 % 3096), SUM(c4 % 3097), SUM(c4 % 3098), SUM(c4 % 3099), + SUM(c4 % 3100), SUM(c4 % 3101), SUM(c4 % 3102), SUM(c4 % 3103), SUM(c4 % 3104), + SUM(c4 % 3105), SUM(c4 % 3106), SUM(c4 % 3107), SUM(c4 % 3108), SUM(c4 % 3109), + SUM(c4 % 3110), SUM(c4 % 3111), SUM(c4 % 3112), SUM(c4 % 3113), SUM(c4 % 3114), + SUM(c4 % 3115), SUM(c4 % 3116), SUM(c4 % 3117), SUM(c4 % 3118), SUM(c4 % 3119), + SUM(c4 % 3120), SUM(c4 % 3121), SUM(c4 % 3122), SUM(c4 % 3123), SUM(c4 % 3124), + SUM(c4 % 3125), SUM(c4 % 3126), SUM(c4 % 3127), SUM(c4 % 3128), SUM(c4 % 3129), + SUM(c4 % 3130), SUM(c4 % 3131), SUM(c4 % 3132), SUM(c4 % 3133), SUM(c4 % 3134), + SUM(c4 % 3135), SUM(c4 % 3136), SUM(c4 % 3137), SUM(c4 % 3138), SUM(c4 % 3139), + SUM(c4 % 3140), SUM(c4 % 3141), SUM(c4 % 3142), SUM(c4 % 3143), SUM(c4 % 3144), + SUM(c4 % 3145), SUM(c4 % 3146), SUM(c4 % 3147), SUM(c4 % 3148), SUM(c4 % 3149), + SUM(c4 % 3150), SUM(c4 % 3151), SUM(c4 % 3152), SUM(c4 % 3153), SUM(c4 % 3154), + SUM(c4 % 3155), SUM(c4 % 3156), SUM(c4 % 3157), SUM(c4 % 3158), SUM(c4 % 3159), + SUM(c4 % 3160), SUM(c4 % 3161), SUM(c4 % 3162), SUM(c4 % 3163), SUM(c4 % 3164), + SUM(c4 % 3165), SUM(c4 % 3166), SUM(c4 % 3167), SUM(c4 % 3168), SUM(c4 % 3169), + SUM(c4 % 3170), SUM(c4 % 3171), SUM(c4 % 3172), SUM(c4 % 3173), SUM(c4 % 3174), + SUM(c4 % 3175), SUM(c4 % 3176), SUM(c4 % 3177), SUM(c4 % 3178), SUM(c4 % 3179), + SUM(c4 % 3180), SUM(c4 % 3181), SUM(c4 % 3182), SUM(c4 % 3183), SUM(c4 % 3184), + SUM(c4 % 3185), SUM(c4 % 3186), SUM(c4 % 3187), SUM(c4 % 3188), SUM(c4 % 3189), + SUM(c4 % 3190), SUM(c4 % 3191), SUM(c4 % 3192), SUM(c4 % 3193), SUM(c4 % 3194), + SUM(c4 % 3195), SUM(c4 % 3196), SUM(c4 % 3197), SUM(c4 % 3198), SUM(c4 % 3199), + SUM(c4 % 3200), SUM(c4 % 3201), SUM(c4 % 3202), SUM(c4 % 3203), SUM(c4 % 3204), + SUM(c4 % 3205), SUM(c4 % 3206), SUM(c4 % 3207), SUM(c4 % 3208), SUM(c4 % 3209), + SUM(c4 % 3210), SUM(c4 % 3211), SUM(c4 % 3212), SUM(c4 % 3213), SUM(c4 % 3214), + SUM(c4 % 3215), SUM(c4 % 3216), SUM(c4 % 3217), SUM(c4 % 3218), SUM(c4 % 3219), + SUM(c4 % 3220), SUM(c4 % 3221), SUM(c4 % 3222), SUM(c4 % 3223), SUM(c4 % 3224), + SUM(c4 % 3225), SUM(c4 % 3226), SUM(c4 % 3227), SUM(c4 % 3228), SUM(c4 % 3229), + SUM(c4 % 3230), SUM(c4 % 3231), SUM(c4 % 3232), SUM(c4 % 3233), SUM(c4 % 3234), + SUM(c4 % 3235), SUM(c4 % 3236), SUM(c4 % 3237), SUM(c4 % 3238), SUM(c4 % 3239), + SUM(c4 % 3240), SUM(c4 % 3241), SUM(c4 % 3242), SUM(c4 % 3243), SUM(c4 % 3244), + SUM(c4 % 3245), SUM(c4 % 3246), SUM(c4 % 3247), SUM(c4 % 3248), SUM(c4 % 3249), + SUM(c4 % 3250), SUM(c4 % 3251), SUM(c4 % 3252), SUM(c4 % 3253), SUM(c4 % 3254), + SUM(c4 % 3255), SUM(c4 % 3256), SUM(c4 % 3257), SUM(c4 % 3258), SUM(c4 % 3259), + SUM(c4 % 3260), SUM(c4 % 3261), SUM(c4 % 3262), SUM(c4 % 3263), SUM(c4 % 3264), + SUM(c4 % 3265), SUM(c4 % 3266), SUM(c4 % 3267), SUM(c4 % 3268), SUM(c4 % 3269), + SUM(c4 % 3270), SUM(c4 % 3271), SUM(c4 % 3272), SUM(c4 % 3273), SUM(c4 % 3274), + SUM(c4 % 3275), SUM(c4 % 3276), SUM(c4 % 3277), SUM(c4 % 3278), SUM(c4 % 3279), + SUM(c4 % 3280), SUM(c4 % 3281), SUM(c4 % 3282), SUM(c4 % 3283), SUM(c4 % 3284), + SUM(c4 % 3285), SUM(c4 % 3286), SUM(c4 % 3287), SUM(c4 % 3288), SUM(c4 % 3289), + SUM(c4 % 3290), SUM(c4 % 3291), SUM(c4 % 3292), SUM(c4 % 3293), SUM(c4 % 3294), + SUM(c4 % 3295), SUM(c4 % 3296), SUM(c4 % 3297), SUM(c4 % 3298), SUM(c4 % 3299), + SUM(c4 % 3300), SUM(c4 % 3301), SUM(c4 % 3302), SUM(c4 % 3303), SUM(c4 % 3304), + SUM(c4 % 3305), SUM(c4 % 3306), SUM(c4 % 3307), SUM(c4 % 3308), SUM(c4 % 3309), + SUM(c4 % 3310), SUM(c4 % 3311), SUM(c4 % 3312), SUM(c4 % 3313), SUM(c4 % 3314), + SUM(c4 % 3315), SUM(c4 % 3316), SUM(c4 % 3317), SUM(c4 % 3318), SUM(c4 % 3319), + SUM(c4 % 3320), SUM(c4 % 3321), SUM(c4 % 3322), SUM(c4 % 3323), SUM(c4 % 3324), + SUM(c4 % 3325), SUM(c4 % 3326), SUM(c4 % 3327), SUM(c4 % 3328), SUM(c4 % 3329), + SUM(c4 % 3330), SUM(c4 % 3331), SUM(c4 % 3332), SUM(c4 % 3333), SUM(c4 % 3334), + SUM(c4 % 3335), SUM(c4 % 3336), SUM(c4 % 3337), SUM(c4 % 3338), SUM(c4 % 3339), + SUM(c4 % 3340), SUM(c4 % 3341), SUM(c4 % 3342), SUM(c4 % 3343), SUM(c4 % 3344), + SUM(c4 % 3345), SUM(c4 % 3346), SUM(c4 % 3347), SUM(c4 % 3348), SUM(c4 % 3349), + SUM(c4 % 3350), SUM(c4 % 3351), SUM(c4 % 3352), SUM(c4 % 3353), SUM(c4 % 3354), + SUM(c4 % 3355), SUM(c4 % 3356), SUM(c4 % 3357), SUM(c4 % 3358), SUM(c4 % 3359), + SUM(c4 % 3360), SUM(c4 % 3361), SUM(c4 % 3362), SUM(c4 % 3363), SUM(c4 % 3364), + SUM(c4 % 3365), SUM(c4 % 3366), SUM(c4 % 3367), SUM(c4 % 3368), SUM(c4 % 3369), + SUM(c4 % 3370), SUM(c4 % 3371), SUM(c4 % 3372), SUM(c4 % 3373), SUM(c4 % 3374), + SUM(c4 % 3375), SUM(c4 % 3376), SUM(c4 % 3377), SUM(c4 % 3378), SUM(c4 % 3379), + SUM(c4 % 3380), SUM(c4 % 3381), SUM(c4 % 3382), SUM(c4 % 3383), SUM(c4 % 3384), + SUM(c4 % 3385), SUM(c4 % 3386), SUM(c4 % 3387), SUM(c4 % 3388), SUM(c4 % 3389), + SUM(c4 % 3390), SUM(c4 % 3391), SUM(c4 % 3392), SUM(c4 % 3393), SUM(c4 % 3394), + SUM(c4 % 3395), SUM(c4 % 3396), SUM(c4 % 3397), SUM(c4 % 3398), SUM(c4 % 3399), + SUM(c4 % 3400), SUM(c4 % 3401), SUM(c4 % 3402), SUM(c4 % 3403), SUM(c4 % 3404), + SUM(c4 % 3405), SUM(c4 % 3406), SUM(c4 % 3407), SUM(c4 % 3408), SUM(c4 % 3409), + SUM(c4 % 3410), SUM(c4 % 3411), SUM(c4 % 3412), SUM(c4 % 3413), SUM(c4 % 3414), + SUM(c4 % 3415), SUM(c4 % 3416), SUM(c4 % 3417), SUM(c4 % 3418), SUM(c4 % 3419), + SUM(c4 % 3420), SUM(c4 % 3421), SUM(c4 % 3422), SUM(c4 % 3423), SUM(c4 % 3424), + SUM(c4 % 3425), SUM(c4 % 3426), SUM(c4 % 3427), SUM(c4 % 3428), SUM(c4 % 3429), + SUM(c4 % 3430), SUM(c4 % 3431), SUM(c4 % 3432), SUM(c4 % 3433), SUM(c4 % 3434), + SUM(c4 % 3435), SUM(c4 % 3436), SUM(c4 % 3437), SUM(c4 % 3438), SUM(c4 % 3439), + SUM(c4 % 3440), SUM(c4 % 3441), SUM(c4 % 3442), SUM(c4 % 3443), SUM(c4 % 3444), + SUM(c4 % 3445), SUM(c4 % 3446), SUM(c4 % 3447), SUM(c4 % 3448), SUM(c4 % 3449), + SUM(c4 % 3450), SUM(c4 % 3451), SUM(c4 % 3452), SUM(c4 % 3453), SUM(c4 % 3454), + SUM(c4 % 3455), SUM(c4 % 3456), SUM(c4 % 3457), SUM(c4 % 3458), SUM(c4 % 3459), + SUM(c4 % 3460), SUM(c4 % 3461), SUM(c4 % 3462), SUM(c4 % 3463), SUM(c4 % 3464), + SUM(c4 % 3465), SUM(c4 % 3466), SUM(c4 % 3467), SUM(c4 % 3468), SUM(c4 % 3469), + SUM(c4 % 3470), SUM(c4 % 3471), SUM(c4 % 3472), SUM(c4 % 3473), SUM(c4 % 3474), + SUM(c4 % 3475), SUM(c4 % 3476), SUM(c4 % 3477), SUM(c4 % 3478), SUM(c4 % 3479), + SUM(c4 % 3480), SUM(c4 % 3481), SUM(c4 % 3482), SUM(c4 % 3483), SUM(c4 % 3484), + SUM(c4 % 3485), SUM(c4 % 3486), SUM(c4 % 3487), SUM(c4 % 3488), SUM(c4 % 3489), + SUM(c4 % 3490), SUM(c4 % 3491), SUM(c4 % 3492), SUM(c4 % 3493), SUM(c4 % 3494), + SUM(c4 % 3495), SUM(c4 % 3496), SUM(c4 % 3497), SUM(c4 % 3498), SUM(c4 % 3499), + SUM(c4 % 3500), SUM(c4 % 3501), SUM(c4 % 3502), SUM(c4 % 3503), SUM(c4 % 3504), + SUM(c4 % 3505), SUM(c4 % 3506), SUM(c4 % 3507), SUM(c4 % 3508), SUM(c4 % 3509), + SUM(c4 % 3510), SUM(c4 % 3511), SUM(c4 % 3512), SUM(c4 % 3513), SUM(c4 % 3514), + SUM(c4 % 3515), SUM(c4 % 3516), SUM(c4 % 3517), SUM(c4 % 3518), SUM(c4 % 3519), + SUM(c4 % 3520), SUM(c4 % 3521), SUM(c4 % 3522), SUM(c4 % 3523), SUM(c4 % 3524), + SUM(c4 % 3525), SUM(c4 % 3526), SUM(c4 % 3527), SUM(c4 % 3528), SUM(c4 % 3529), + SUM(c4 % 3530), SUM(c4 % 3531), SUM(c4 % 3532), SUM(c4 % 3533), SUM(c4 % 3534), + SUM(c4 % 3535), SUM(c4 % 3536), SUM(c4 % 3537), SUM(c4 % 3538), SUM(c4 % 3539), + SUM(c4 % 3540), SUM(c4 % 3541), SUM(c4 % 3542), SUM(c4 % 3543), SUM(c4 % 3544), + SUM(c4 % 3545), SUM(c4 % 3546), SUM(c4 % 3547), SUM(c4 % 3548), SUM(c4 % 3549), + SUM(c4 % 3550), SUM(c4 % 3551), SUM(c4 % 3552), SUM(c4 % 3553), SUM(c4 % 3554), + SUM(c4 % 3555), SUM(c4 % 3556), SUM(c4 % 3557), SUM(c4 % 3558), SUM(c4 % 3559), + SUM(c4 % 3560), SUM(c4 % 3561), SUM(c4 % 3562), SUM(c4 % 3563), SUM(c4 % 3564), + SUM(c4 % 3565), SUM(c4 % 3566), SUM(c4 % 3567), SUM(c4 % 3568), SUM(c4 % 3569), + SUM(c4 % 3570), SUM(c4 % 3571), SUM(c4 % 3572), SUM(c4 % 3573), SUM(c4 % 3574), + SUM(c4 % 3575), SUM(c4 % 3576), SUM(c4 % 3577), SUM(c4 % 3578), SUM(c4 % 3579), + SUM(c4 % 3580), SUM(c4 % 3581), SUM(c4 % 3582), SUM(c4 % 3583), SUM(c4 % 3584), + SUM(c4 % 3585), SUM(c4 % 3586), SUM(c4 % 3587), SUM(c4 % 3588), SUM(c4 % 3589), + SUM(c4 % 3590), SUM(c4 % 3591), SUM(c4 % 3592), SUM(c4 % 3593), SUM(c4 % 3594), + SUM(c4 % 3595), SUM(c4 % 3596), SUM(c4 % 3597), SUM(c4 % 3598), SUM(c4 % 3599), + SUM(c4 % 3600), SUM(c4 % 3601), SUM(c4 % 3602), SUM(c4 % 3603), SUM(c4 % 3604), + SUM(c4 % 3605), SUM(c4 % 3606), SUM(c4 % 3607), SUM(c4 % 3608), SUM(c4 % 3609), + SUM(c4 % 3610), SUM(c4 % 3611), SUM(c4 % 3612), SUM(c4 % 3613), SUM(c4 % 3614), + SUM(c4 % 3615), SUM(c4 % 3616), SUM(c4 % 3617), SUM(c4 % 3618), SUM(c4 % 3619), + SUM(c4 % 3620), SUM(c4 % 3621), SUM(c4 % 3622), SUM(c4 % 3623), SUM(c4 % 3624), + SUM(c4 % 3625), SUM(c4 % 3626), SUM(c4 % 3627), SUM(c4 % 3628), SUM(c4 % 3629), + SUM(c4 % 3630), SUM(c4 % 3631), SUM(c4 % 3632), SUM(c4 % 3633), SUM(c4 % 3634), + SUM(c4 % 3635), SUM(c4 % 3636), SUM(c4 % 3637), SUM(c4 % 3638), SUM(c4 % 3639), + SUM(c4 % 3640), SUM(c4 % 3641), SUM(c4 % 3642), SUM(c4 % 3643), SUM(c4 % 3644), + SUM(c4 % 3645), SUM(c4 % 3646), SUM(c4 % 3647), SUM(c4 % 3648), SUM(c4 % 3649), + SUM(c4 % 3650), SUM(c4 % 3651), SUM(c4 % 3652), SUM(c4 % 3653), SUM(c4 % 3654), + SUM(c4 % 3655), SUM(c4 % 3656), SUM(c4 % 3657), SUM(c4 % 3658), SUM(c4 % 3659), + SUM(c4 % 3660), SUM(c4 % 3661), SUM(c4 % 3662), SUM(c4 % 3663), SUM(c4 % 3664), + SUM(c4 % 3665), SUM(c4 % 3666), SUM(c4 % 3667), SUM(c4 % 3668), SUM(c4 % 3669), + SUM(c4 % 3670), SUM(c4 % 3671), SUM(c4 % 3672), SUM(c4 % 3673), SUM(c4 % 3674), + SUM(c4 % 3675), SUM(c4 % 3676), SUM(c4 % 3677), SUM(c4 % 3678), SUM(c4 % 3679), + SUM(c4 % 3680), SUM(c4 % 3681), SUM(c4 % 3682), SUM(c4 % 3683), SUM(c4 % 3684), + SUM(c4 % 3685), SUM(c4 % 3686), SUM(c4 % 3687), SUM(c4 % 3688), SUM(c4 % 3689), + SUM(c4 % 3690), SUM(c4 % 3691), SUM(c4 % 3692), SUM(c4 % 3693), SUM(c4 % 3694), + SUM(c4 % 3695), SUM(c4 % 3696), SUM(c4 % 3697), SUM(c4 % 3698), SUM(c4 % 3699), + SUM(c4 % 3700), SUM(c4 % 3701), SUM(c4 % 3702), SUM(c4 % 3703), SUM(c4 % 3704), + SUM(c4 % 3705), SUM(c4 % 3706), SUM(c4 % 3707), SUM(c4 % 3708), SUM(c4 % 3709), + SUM(c4 % 3710), SUM(c4 % 3711), SUM(c4 % 3712), SUM(c4 % 3713), SUM(c4 % 3714), + SUM(c4 % 3715), SUM(c4 % 3716), SUM(c4 % 3717), SUM(c4 % 3718), SUM(c4 % 3719), + SUM(c4 % 3720), SUM(c4 % 3721), SUM(c4 % 3722), SUM(c4 % 3723), SUM(c4 % 3724), + SUM(c4 % 3725), SUM(c4 % 3726), SUM(c4 % 3727), SUM(c4 % 3728), SUM(c4 % 3729), + SUM(c4 % 3730), SUM(c4 % 3731), SUM(c4 % 3732), SUM(c4 % 3733), SUM(c4 % 3734), + SUM(c4 % 3735), SUM(c4 % 3736), SUM(c4 % 3737), SUM(c4 % 3738), SUM(c4 % 3739), + SUM(c4 % 3740), SUM(c4 % 3741), SUM(c4 % 3742), SUM(c4 % 3743), SUM(c4 % 3744), + SUM(c4 % 3745), SUM(c4 % 3746), SUM(c4 % 3747), SUM(c4 % 3748), SUM(c4 % 3749), + SUM(c4 % 3750), SUM(c4 % 3751), SUM(c4 % 3752), SUM(c4 % 3753), SUM(c4 % 3754), + SUM(c4 % 3755), SUM(c4 % 3756), SUM(c4 % 3757), SUM(c4 % 3758), SUM(c4 % 3759), + SUM(c4 % 3760), SUM(c4 % 3761), SUM(c4 % 3762), SUM(c4 % 3763), SUM(c4 % 3764), + SUM(c4 % 3765), SUM(c4 % 3766), SUM(c4 % 3767), SUM(c4 % 3768), SUM(c4 % 3769), + SUM(c4 % 3770), SUM(c4 % 3771), SUM(c4 % 3772), SUM(c4 % 3773), SUM(c4 % 3774), + SUM(c4 % 3775), SUM(c4 % 3776), SUM(c4 % 3777), SUM(c4 % 3778), SUM(c4 % 3779), + SUM(c4 % 3780), SUM(c4 % 3781), SUM(c4 % 3782), SUM(c4 % 3783), SUM(c4 % 3784), + SUM(c4 % 3785), SUM(c4 % 3786), SUM(c4 % 3787), SUM(c4 % 3788), SUM(c4 % 3789), + SUM(c4 % 3790), SUM(c4 % 3791), SUM(c4 % 3792), SUM(c4 % 3793), SUM(c4 % 3794), + SUM(c4 % 3795), SUM(c4 % 3796), SUM(c4 % 3797), SUM(c4 % 3798), SUM(c4 % 3799), + SUM(c4 % 3800), SUM(c4 % 3801), SUM(c4 % 3802), SUM(c4 % 3803), SUM(c4 % 3804), + SUM(c4 % 3805), SUM(c4 % 3806), SUM(c4 % 3807), SUM(c4 % 3808), SUM(c4 % 3809), + SUM(c4 % 3810), SUM(c4 % 3811), SUM(c4 % 3812), SUM(c4 % 3813), SUM(c4 % 3814), + SUM(c4 % 3815), SUM(c4 % 3816), SUM(c4 % 3817), SUM(c4 % 3818), SUM(c4 % 3819), + SUM(c4 % 3820), SUM(c4 % 3821), SUM(c4 % 3822), SUM(c4 % 3823), SUM(c4 % 3824), + SUM(c4 % 3825), SUM(c4 % 3826), SUM(c4 % 3827), SUM(c4 % 3828), SUM(c4 % 3829), + SUM(c4 % 3830), SUM(c4 % 3831), SUM(c4 % 3832), SUM(c4 % 3833), SUM(c4 % 3834), + SUM(c4 % 3835), SUM(c4 % 3836), SUM(c4 % 3837), SUM(c4 % 3838), SUM(c4 % 3839), + SUM(c4 % 3840), SUM(c4 % 3841), SUM(c4 % 3842), SUM(c4 % 3843), SUM(c4 % 3844), + SUM(c4 % 3845), SUM(c4 % 3846), SUM(c4 % 3847), SUM(c4 % 3848), SUM(c4 % 3849), + SUM(c4 % 3850), SUM(c4 % 3851), SUM(c4 % 3852), SUM(c4 % 3853), SUM(c4 % 3854), + SUM(c4 % 3855), SUM(c4 % 3856), SUM(c4 % 3857), SUM(c4 % 3858), SUM(c4 % 3859), + SUM(c4 % 3860), SUM(c4 % 3861), SUM(c4 % 3862), SUM(c4 % 3863), SUM(c4 % 3864), + SUM(c4 % 3865), SUM(c4 % 3866), SUM(c4 % 3867), SUM(c4 % 3868), SUM(c4 % 3869), + SUM(c4 % 3870), SUM(c4 % 3871), SUM(c4 % 3872), SUM(c4 % 3873), SUM(c4 % 3874), + SUM(c4 % 3875), SUM(c4 % 3876), SUM(c4 % 3877), SUM(c4 % 3878), SUM(c4 % 3879), + SUM(c4 % 3880), SUM(c4 % 3881), SUM(c4 % 3882), SUM(c4 % 3883), SUM(c4 % 3884), + SUM(c4 % 3885), SUM(c4 % 3886), SUM(c4 % 3887), SUM(c4 % 3888), SUM(c4 % 3889), + SUM(c4 % 3890), SUM(c4 % 3891), SUM(c4 % 3892), SUM(c4 % 3893), SUM(c4 % 3894), + SUM(c4 % 3895), SUM(c4 % 3896), SUM(c4 % 3897), SUM(c4 % 3898), SUM(c4 % 3899), + SUM(c4 % 3900), SUM(c4 % 3901), SUM(c4 % 3902), SUM(c4 % 3903), SUM(c4 % 3904), + SUM(c4 % 3905), SUM(c4 % 3906), SUM(c4 % 3907), SUM(c4 % 3908), SUM(c4 % 3909), + SUM(c4 % 3910), SUM(c4 % 3911), SUM(c4 % 3912), SUM(c4 % 3913), SUM(c4 % 3914), + SUM(c4 % 3915), SUM(c4 % 3916), SUM(c4 % 3917), SUM(c4 % 3918), SUM(c4 % 3919), + SUM(c4 % 3920), SUM(c4 % 3921), SUM(c4 % 3922), SUM(c4 % 3923), SUM(c4 % 3924), + SUM(c4 % 3925), SUM(c4 % 3926), SUM(c4 % 3927), SUM(c4 % 3928), SUM(c4 % 3929), + SUM(c4 % 3930), SUM(c4 % 3931), SUM(c4 % 3932), SUM(c4 % 3933), SUM(c4 % 3934), + SUM(c4 % 3935), SUM(c4 % 3936), SUM(c4 % 3937), SUM(c4 % 3938), SUM(c4 % 3939), + SUM(c4 % 3940), SUM(c4 % 3941), SUM(c4 % 3942), SUM(c4 % 3943), SUM(c4 % 3944), + SUM(c4 % 3945), SUM(c4 % 3946), SUM(c4 % 3947), SUM(c4 % 3948), SUM(c4 % 3949), + SUM(c4 % 3950), SUM(c4 % 3951), SUM(c4 % 3952), SUM(c4 % 3953), SUM(c4 % 3954), + SUM(c4 % 3955), SUM(c4 % 3956), SUM(c4 % 3957), SUM(c4 % 3958), SUM(c4 % 3959), + SUM(c4 % 3960), SUM(c4 % 3961), SUM(c4 % 3962), SUM(c4 % 3963), SUM(c4 % 3964), + SUM(c4 % 3965), SUM(c4 % 3966), SUM(c4 % 3967), SUM(c4 % 3968), SUM(c4 % 3969), + SUM(c4 % 3970), SUM(c4 % 3971), SUM(c4 % 3972), SUM(c4 % 3973), SUM(c4 % 3974), + SUM(c4 % 3975), SUM(c4 % 3976), SUM(c4 % 3977), SUM(c4 % 3978), SUM(c4 % 3979), + SUM(c4 % 3980), SUM(c4 % 3981), SUM(c4 % 3982), SUM(c4 % 3983), SUM(c4 % 3984), + SUM(c4 % 3985), SUM(c4 % 3986), SUM(c4 % 3987), SUM(c4 % 3988), SUM(c4 % 3989), + SUM(c4 % 3990), SUM(c4 % 3991), SUM(c4 % 3992), SUM(c4 % 3993), SUM(c4 % 3994), + SUM(c4 % 3995), SUM(c4 % 3996), SUM(c4 % 3997), SUM(c4 % 3998), SUM(c4 % 3999), + SUM(c4 % 4000), SUM(c4 % 4001), SUM(c4 % 4002), SUM(c4 % 4003), SUM(c4 % 4004), + SUM(c4 % 4005), SUM(c4 % 4006), SUM(c4 % 4007), SUM(c4 % 4008), SUM(c4 % 4009), + SUM(c4 % 4010), SUM(c4 % 4011), SUM(c4 % 4012), SUM(c4 % 4013), SUM(c4 % 4014), + SUM(c4 % 4015), SUM(c4 % 4016), SUM(c4 % 4017), SUM(c4 % 4018), SUM(c4 % 4019), + SUM(c4 % 4020), SUM(c4 % 4021), SUM(c4 % 4022), SUM(c4 % 4023), SUM(c4 % 4024), + SUM(c4 % 4025), SUM(c4 % 4026), SUM(c4 % 4027), SUM(c4 % 4028), SUM(c4 % 4029), + SUM(c4 % 4030), SUM(c4 % 4031), SUM(c4 % 4032), SUM(c4 % 4033), SUM(c4 % 4034), + SUM(c4 % 4035), SUM(c4 % 4036), SUM(c4 % 4037), SUM(c4 % 4038), SUM(c4 % 4039), + SUM(c4 % 4040), SUM(c4 % 4041), SUM(c4 % 4042), SUM(c4 % 4043), SUM(c4 % 4044), + SUM(c4 % 4045), SUM(c4 % 4046), SUM(c4 % 4047), SUM(c4 % 4048), SUM(c4 % 4049), + SUM(c4 % 4050), SUM(c4 % 4051), SUM(c4 % 4052), SUM(c4 % 4053), SUM(c4 % 4054), + SUM(c4 % 4055), SUM(c4 % 4056), SUM(c4 % 4057), SUM(c4 % 4058), SUM(c4 % 4059), + SUM(c4 % 4060), SUM(c4 % 4061), SUM(c4 % 4062), SUM(c4 % 4063), SUM(c4 % 4064), + SUM(c4 % 4065), SUM(c4 % 4066), SUM(c4 % 4067), SUM(c4 % 4068), SUM(c4 % 4069), + SUM(c4 % 4070), SUM(c4 % 4071), SUM(c4 % 4072), SUM(c4 % 4073), SUM(c4 % 4074), + SUM(c4 % 4075), SUM(c4 % 4076), SUM(c4 % 4077), SUM(c4 % 4078), SUM(c4 % 4079), + SUM(c4 % 4080), SUM(c4 % 4081), SUM(c4 % 4082), SUM(c4 % 4083), SUM(c4 % 4084), + SUM(c4 % 4085), SUM(c4 % 4086), SUM(c4 % 4087), SUM(c4 % 4088), SUM(c4 % 4089), + SUM(c4 % 4090), SUM(c4 % 4091), SUM(c4 % 4092), SUM(c4 % 4093), SUM(c4 % 4094), + SUM(c4 % 4095), SUM(c4 % 4096), SUM(c4 % 4097), SUM(c4 % 4098), SUM(c4 % 4099), + SUM(c4 % 4100), SUM(c4 % 4101), SUM(c4 % 4102), SUM(c4 % 4103), SUM(c4 % 4104), + SUM(c4 % 4105), SUM(c4 % 4106), SUM(c4 % 4107), SUM(c4 % 4108), SUM(c4 % 4109), + SUM(c4 % 4110), SUM(c4 % 4111), SUM(c4 % 4112), SUM(c4 % 4113), SUM(c4 % 4114), + SUM(c4 % 4115), SUM(c4 % 4116), SUM(c4 % 4117), SUM(c4 % 4118), SUM(c4 % 4119), + SUM(c4 % 4120), SUM(c4 % 4121), SUM(c4 % 4122), SUM(c4 % 4123), SUM(c4 % 4124), + SUM(c4 % 4125), SUM(c4 % 4126), SUM(c4 % 4127), SUM(c4 % 4128), SUM(c4 % 4129), + SUM(c4 % 4130), SUM(c4 % 4131), SUM(c4 % 4132), SUM(c4 % 4133), SUM(c4 % 4134), + SUM(c4 % 4135), SUM(c4 % 4136), SUM(c4 % 4137), SUM(c4 % 4138), SUM(c4 % 4139), + SUM(c4 % 4140), SUM(c4 % 4141), SUM(c4 % 4142), SUM(c4 % 4143), SUM(c4 % 4144), + SUM(c4 % 4145), SUM(c4 % 4146), SUM(c4 % 4147), SUM(c4 % 4148), SUM(c4 % 4149), + SUM(c4 % 4150), SUM(c4 % 4151), SUM(c4 % 4152), SUM(c4 % 4153), SUM(c4 % 4154), + SUM(c4 % 4155), SUM(c4 % 4156), SUM(c4 % 4157), SUM(c4 % 4158), SUM(c4 % 4159), + SUM(c4 % 4160), SUM(c4 % 4161), SUM(c4 % 4162), SUM(c4 % 4163), SUM(c4 % 4164), + SUM(c4 % 4165), SUM(c4 % 4166), SUM(c4 % 4167), SUM(c4 % 4168), SUM(c4 % 4169), + SUM(c4 % 4170), SUM(c4 % 4171), SUM(c4 % 4172), SUM(c4 % 4173), SUM(c4 % 4174), + SUM(c4 % 4175), SUM(c4 % 4176), SUM(c4 % 4177), SUM(c4 % 4178), SUM(c4 % 4179), + SUM(c4 % 4180), SUM(c4 % 4181), SUM(c4 % 4182), SUM(c4 % 4183), SUM(c4 % 4184), + SUM(c4 % 4185), SUM(c4 % 4186), SUM(c4 % 4187), SUM(c4 % 4188), SUM(c4 % 4189), + SUM(c4 % 4190), SUM(c4 % 4191), SUM(c4 % 4192), SUM(c4 % 4193), SUM(c4 % 4194), + SUM(c4 % 4195), SUM(c4 % 4196), SUM(c4 % 4197), SUM(c4 % 4198), SUM(c4 % 4199), + SUM(c4 % 4200), SUM(c4 % 4201), SUM(c4 % 4202), SUM(c4 % 4203), SUM(c4 % 4204), + SUM(c4 % 4205), SUM(c4 % 4206), SUM(c4 % 4207), SUM(c4 % 4208), SUM(c4 % 4209), + SUM(c4 % 4210), SUM(c4 % 4211), SUM(c4 % 4212), SUM(c4 % 4213), SUM(c4 % 4214), + SUM(c4 % 4215), SUM(c4 % 4216), SUM(c4 % 4217), SUM(c4 % 4218), SUM(c4 % 4219), + SUM(c4 % 4220), SUM(c4 % 4221), SUM(c4 % 4222), SUM(c4 % 4223), SUM(c4 % 4224), + SUM(c4 % 4225), SUM(c4 % 4226), SUM(c4 % 4227), SUM(c4 % 4228), SUM(c4 % 4229), + SUM(c4 % 4230), SUM(c4 % 4231), SUM(c4 % 4232), SUM(c4 % 4233), SUM(c4 % 4234), + SUM(c4 % 4235), SUM(c4 % 4236), SUM(c4 % 4237), SUM(c4 % 4238), SUM(c4 % 4239), + SUM(c4 % 4240), SUM(c4 % 4241), SUM(c4 % 4242), SUM(c4 % 4243), SUM(c4 % 4244), + SUM(c4 % 4245), SUM(c4 % 4246), SUM(c4 % 4247), SUM(c4 % 4248), SUM(c4 % 4249), + SUM(c4 % 4250), SUM(c4 % 4251), SUM(c4 % 4252), SUM(c4 % 4253), SUM(c4 % 4254), + SUM(c4 % 4255), SUM(c4 % 4256), SUM(c4 % 4257), SUM(c4 % 4258), SUM(c4 % 4259), + SUM(c4 % 4260), SUM(c4 % 4261), SUM(c4 % 4262), SUM(c4 % 4263), SUM(c4 % 4264), + SUM(c4 % 4265), SUM(c4 % 4266), SUM(c4 % 4267), SUM(c4 % 4268), SUM(c4 % 4269), + SUM(c4 % 4270), SUM(c4 % 4271), SUM(c4 % 4272), SUM(c4 % 4273), SUM(c4 % 4274), + SUM(c4 % 4275), SUM(c4 % 4276), SUM(c4 % 4277), SUM(c4 % 4278), SUM(c4 % 4279), + SUM(c4 % 4280), SUM(c4 % 4281), SUM(c4 % 4282), SUM(c4 % 4283), SUM(c4 % 4284), + SUM(c4 % 4285), SUM(c4 % 4286), SUM(c4 % 4287), SUM(c4 % 4288), SUM(c4 % 4289), + SUM(c4 % 4290), SUM(c4 % 4291), SUM(c4 % 4292), SUM(c4 % 4293), SUM(c4 % 4294), + SUM(c4 % 4295), SUM(c4 % 4296), SUM(c4 % 4297), SUM(c4 % 4298), SUM(c4 % 4299), + SUM(c4 % 4300), SUM(c4 % 4301), SUM(c4 % 4302), SUM(c4 % 4303), SUM(c4 % 4304), + SUM(c4 % 4305), SUM(c4 % 4306), SUM(c4 % 4307), SUM(c4 % 4308), SUM(c4 % 4309), + SUM(c4 % 4310), SUM(c4 % 4311), SUM(c4 % 4312), SUM(c4 % 4313), SUM(c4 % 4314), + SUM(c4 % 4315), SUM(c4 % 4316), SUM(c4 % 4317), SUM(c4 % 4318), SUM(c4 % 4319), + SUM(c4 % 4320), SUM(c4 % 4321), SUM(c4 % 4322), SUM(c4 % 4323), SUM(c4 % 4324), + SUM(c4 % 4325), SUM(c4 % 4326), SUM(c4 % 4327), SUM(c4 % 4328), SUM(c4 % 4329), + SUM(c4 % 4330), SUM(c4 % 4331), SUM(c4 % 4332), SUM(c4 % 4333), SUM(c4 % 4334), + SUM(c4 % 4335), SUM(c4 % 4336), SUM(c4 % 4337), SUM(c4 % 4338), SUM(c4 % 4339), + SUM(c4 % 4340), SUM(c4 % 4341), SUM(c4 % 4342), SUM(c4 % 4343), SUM(c4 % 4344), + SUM(c4 % 4345), SUM(c4 % 4346), SUM(c4 % 4347), SUM(c4 % 4348), SUM(c4 % 4349), + SUM(c4 % 4350), SUM(c4 % 4351), SUM(c4 % 4352), SUM(c4 % 4353), SUM(c4 % 4354), + SUM(c4 % 4355), SUM(c4 % 4356), SUM(c4 % 4357), SUM(c4 % 4358), SUM(c4 % 4359), + SUM(c4 % 4360), SUM(c4 % 4361), SUM(c4 % 4362), SUM(c4 % 4363), SUM(c4 % 4364), + SUM(c4 % 4365), SUM(c4 % 4366), SUM(c4 % 4367), SUM(c4 % 4368), SUM(c4 % 4369), + SUM(c4 % 4370), SUM(c4 % 4371), SUM(c4 % 4372), SUM(c4 % 4373), SUM(c4 % 4374), + SUM(c4 % 4375), SUM(c4 % 4376), SUM(c4 % 4377), SUM(c4 % 4378), SUM(c4 % 4379), + SUM(c4 % 4380), SUM(c4 % 4381), SUM(c4 % 4382), SUM(c4 % 4383), SUM(c4 % 4384), + SUM(c4 % 4385), SUM(c4 % 4386), SUM(c4 % 4387), SUM(c4 % 4388), SUM(c4 % 4389), + SUM(c4 % 4390), SUM(c4 % 4391), SUM(c4 % 4392), SUM(c4 % 4393), SUM(c4 % 4394), + SUM(c4 % 4395), SUM(c4 % 4396), SUM(c4 % 4397), SUM(c4 % 4398), SUM(c4 % 4399), + SUM(c4 % 4400), SUM(c4 % 4401), SUM(c4 % 4402), SUM(c4 % 4403), SUM(c4 % 4404), + SUM(c4 % 4405), SUM(c4 % 4406), SUM(c4 % 4407), SUM(c4 % 4408), SUM(c4 % 4409), + SUM(c4 % 4410), SUM(c4 % 4411), SUM(c4 % 4412), SUM(c4 % 4413), SUM(c4 % 4414), + SUM(c4 % 4415), SUM(c4 % 4416), SUM(c4 % 4417), SUM(c4 % 4418), SUM(c4 % 4419), + SUM(c4 % 4420), SUM(c4 % 4421), SUM(c4 % 4422), SUM(c4 % 4423), SUM(c4 % 4424), + SUM(c4 % 4425), SUM(c4 % 4426), SUM(c4 % 4427), SUM(c4 % 4428), SUM(c4 % 4429), + SUM(c4 % 4430), SUM(c4 % 4431), SUM(c4 % 4432), SUM(c4 % 4433), SUM(c4 % 4434), + SUM(c4 % 4435), SUM(c4 % 4436), SUM(c4 % 4437), SUM(c4 % 4438), SUM(c4 % 4439), + SUM(c4 % 4440), SUM(c4 % 4441), SUM(c4 % 4442), SUM(c4 % 4443), SUM(c4 % 4444), + SUM(c4 % 4445), SUM(c4 % 4446), SUM(c4 % 4447), SUM(c4 % 4448), SUM(c4 % 4449), + SUM(c4 % 4450), SUM(c4 % 4451), SUM(c4 % 4452), SUM(c4 % 4453), SUM(c4 % 4454), + SUM(c4 % 4455), SUM(c4 % 4456), SUM(c4 % 4457), SUM(c4 % 4458), SUM(c4 % 4459), + SUM(c4 % 4460), SUM(c4 % 4461), SUM(c4 % 4462), SUM(c4 % 4463), SUM(c4 % 4464), + SUM(c4 % 4465), SUM(c4 % 4466), SUM(c4 % 4467), SUM(c4 % 4468), SUM(c4 % 4469), + SUM(c4 % 4470), SUM(c4 % 4471), SUM(c4 % 4472), SUM(c4 % 4473), SUM(c4 % 4474), + SUM(c4 % 4475), SUM(c4 % 4476), SUM(c4 % 4477), SUM(c4 % 4478), SUM(c4 % 4479), + SUM(c4 % 4480), SUM(c4 % 4481), SUM(c4 % 4482), SUM(c4 % 4483), SUM(c4 % 4484), + SUM(c4 % 4485), SUM(c4 % 4486), SUM(c4 % 4487), SUM(c4 % 4488), SUM(c4 % 4489), + SUM(c4 % 4490), SUM(c4 % 4491), SUM(c4 % 4492), SUM(c4 % 4493), SUM(c4 % 4494), + SUM(c4 % 4495), SUM(c4 % 4496), SUM(c4 % 4497), SUM(c4 % 4498), SUM(c4 % 4499), + SUM(c4 % 4500), SUM(c4 % 4501), SUM(c4 % 4502), SUM(c4 % 4503), SUM(c4 % 4504), + SUM(c4 % 4505), SUM(c4 % 4506), SUM(c4 % 4507), SUM(c4 % 4508), SUM(c4 % 4509), + SUM(c4 % 4510), SUM(c4 % 4511), SUM(c4 % 4512), SUM(c4 % 4513), SUM(c4 % 4514), + SUM(c4 % 4515), SUM(c4 % 4516), SUM(c4 % 4517), SUM(c4 % 4518), SUM(c4 % 4519), + SUM(c4 % 4520), SUM(c4 % 4521), SUM(c4 % 4522), SUM(c4 % 4523), SUM(c4 % 4524), + SUM(c4 % 4525), SUM(c4 % 4526), SUM(c4 % 4527), SUM(c4 % 4528), SUM(c4 % 4529), + SUM(c4 % 4530), SUM(c4 % 4531), SUM(c4 % 4532), SUM(c4 % 4533), SUM(c4 % 4534), + SUM(c4 % 4535), SUM(c4 % 4536), SUM(c4 % 4537), SUM(c4 % 4538), SUM(c4 % 4539), + SUM(c4 % 4540), SUM(c4 % 4541), SUM(c4 % 4542), SUM(c4 % 4543), SUM(c4 % 4544), + SUM(c4 % 4545), SUM(c4 % 4546), SUM(c4 % 4547), SUM(c4 % 4548), SUM(c4 % 4549), + SUM(c4 % 4550), SUM(c4 % 4551), SUM(c4 % 4552), SUM(c4 % 4553), SUM(c4 % 4554), + SUM(c4 % 4555), SUM(c4 % 4556), SUM(c4 % 4557), SUM(c4 % 4558), SUM(c4 % 4559), + SUM(c4 % 4560), SUM(c4 % 4561), SUM(c4 % 4562), SUM(c4 % 4563), SUM(c4 % 4564), + SUM(c4 % 4565), SUM(c4 % 4566), SUM(c4 % 4567), SUM(c4 % 4568), SUM(c4 % 4569), + SUM(c4 % 4570), SUM(c4 % 4571), SUM(c4 % 4572), SUM(c4 % 4573), SUM(c4 % 4574), + SUM(c4 % 4575), SUM(c4 % 4576), SUM(c4 % 4577), SUM(c4 % 4578), SUM(c4 % 4579), + SUM(c4 % 4580), SUM(c4 % 4581), SUM(c4 % 4582), SUM(c4 % 4583), SUM(c4 % 4584), + SUM(c4 % 4585), SUM(c4 % 4586), SUM(c4 % 4587), SUM(c4 % 4588), SUM(c4 % 4589), + SUM(c4 % 4590), SUM(c4 % 4591), SUM(c4 % 4592), SUM(c4 % 4593), SUM(c4 % 4594), + SUM(c4 % 4595), SUM(c4 % 4596), SUM(c4 % 4597), SUM(c4 % 4598), SUM(c4 % 4599), + SUM(c4 % 4600), SUM(c4 % 4601), SUM(c4 % 4602), SUM(c4 % 4603), SUM(c4 % 4604), + SUM(c4 % 4605), SUM(c4 % 4606), SUM(c4 % 4607), SUM(c4 % 4608), SUM(c4 % 4609), + SUM(c4 % 4610), SUM(c4 % 4611), SUM(c4 % 4612), SUM(c4 % 4613), SUM(c4 % 4614), + SUM(c4 % 4615), SUM(c4 % 4616), SUM(c4 % 4617), SUM(c4 % 4618), SUM(c4 % 4619), + SUM(c4 % 4620), SUM(c4 % 4621), SUM(c4 % 4622), SUM(c4 % 4623), SUM(c4 % 4624), + SUM(c4 % 4625), SUM(c4 % 4626), SUM(c4 % 4627), SUM(c4 % 4628), SUM(c4 % 4629), + SUM(c4 % 4630), SUM(c4 % 4631), SUM(c4 % 4632), SUM(c4 % 4633), SUM(c4 % 4634), + SUM(c4 % 4635), SUM(c4 % 4636), SUM(c4 % 4637), SUM(c4 % 4638), SUM(c4 % 4639), + SUM(c4 % 4640), SUM(c4 % 4641), SUM(c4 % 4642), SUM(c4 % 4643), SUM(c4 % 4644), + SUM(c4 % 4645), SUM(c4 % 4646), SUM(c4 % 4647), SUM(c4 % 4648), SUM(c4 % 4649), + SUM(c4 % 4650), SUM(c4 % 4651), SUM(c4 % 4652), SUM(c4 % 4653), SUM(c4 % 4654), + SUM(c4 % 4655), SUM(c4 % 4656), SUM(c4 % 4657), SUM(c4 % 4658), SUM(c4 % 4659), + SUM(c4 % 4660), SUM(c4 % 4661), SUM(c4 % 4662), SUM(c4 % 4663), SUM(c4 % 4664), + SUM(c4 % 4665), SUM(c4 % 4666), SUM(c4 % 4667), SUM(c4 % 4668), SUM(c4 % 4669), + SUM(c4 % 4670), SUM(c4 % 4671), SUM(c4 % 4672), SUM(c4 % 4673), SUM(c4 % 4674), + SUM(c4 % 4675), SUM(c4 % 4676), SUM(c4 % 4677), SUM(c4 % 4678), SUM(c4 % 4679), + SUM(c4 % 4680), SUM(c4 % 4681), SUM(c4 % 4682), SUM(c4 % 4683), SUM(c4 % 4684), + SUM(c4 % 4685), SUM(c4 % 4686), SUM(c4 % 4687), SUM(c4 % 4688), SUM(c4 % 4689), + SUM(c4 % 4690), SUM(c4 % 4691), SUM(c4 % 4692), SUM(c4 % 4693), SUM(c4 % 4694), + SUM(c4 % 4695), SUM(c4 % 4696), SUM(c4 % 4697), SUM(c4 % 4698), SUM(c4 % 4699), + SUM(c4 % 4700), SUM(c4 % 4701), SUM(c4 % 4702), SUM(c4 % 4703), SUM(c4 % 4704), + SUM(c4 % 4705), SUM(c4 % 4706), SUM(c4 % 4707), SUM(c4 % 4708), SUM(c4 % 4709), + SUM(c4 % 4710), SUM(c4 % 4711), SUM(c4 % 4712), SUM(c4 % 4713), SUM(c4 % 4714), + SUM(c4 % 4715), SUM(c4 % 4716), SUM(c4 % 4717), SUM(c4 % 4718), SUM(c4 % 4719), + SUM(c4 % 4720), SUM(c4 % 4721), SUM(c4 % 4722), SUM(c4 % 4723), SUM(c4 % 4724), + SUM(c4 % 4725), SUM(c4 % 4726), SUM(c4 % 4727), SUM(c4 % 4728), SUM(c4 % 4729), + SUM(c4 % 4730), SUM(c4 % 4731), SUM(c4 % 4732), SUM(c4 % 4733), SUM(c4 % 4734), + SUM(c4 % 4735), SUM(c4 % 4736), SUM(c4 % 4737), SUM(c4 % 4738), SUM(c4 % 4739), + SUM(c4 % 4740), SUM(c4 % 4741), SUM(c4 % 4742), SUM(c4 % 4743), SUM(c4 % 4744), + SUM(c4 % 4745), SUM(c4 % 4746), SUM(c4 % 4747), SUM(c4 % 4748), SUM(c4 % 4749), + SUM(c4 % 4750), SUM(c4 % 4751), SUM(c4 % 4752), SUM(c4 % 4753), SUM(c4 % 4754), + SUM(c4 % 4755), SUM(c4 % 4756), SUM(c4 % 4757), SUM(c4 % 4758), SUM(c4 % 4759), + SUM(c4 % 4760), SUM(c4 % 4761), SUM(c4 % 4762), SUM(c4 % 4763), SUM(c4 % 4764), + SUM(c4 % 4765), SUM(c4 % 4766), SUM(c4 % 4767), SUM(c4 % 4768), SUM(c4 % 4769), + SUM(c4 % 4770), SUM(c4 % 4771), SUM(c4 % 4772), SUM(c4 % 4773), SUM(c4 % 4774), + SUM(c4 % 4775), SUM(c4 % 4776), SUM(c4 % 4777), SUM(c4 % 4778), SUM(c4 % 4779), + SUM(c4 % 4780), SUM(c4 % 4781), SUM(c4 % 4782), SUM(c4 % 4783), SUM(c4 % 4784), + SUM(c4 % 4785), SUM(c4 % 4786), SUM(c4 % 4787), SUM(c4 % 4788), SUM(c4 % 4789), + SUM(c4 % 4790), SUM(c4 % 4791), SUM(c4 % 4792), SUM(c4 % 4793), SUM(c4 % 4794), + SUM(c4 % 4795), SUM(c4 % 4796), SUM(c4 % 4797), SUM(c4 % 4798), SUM(c4 % 4799), + SUM(c4 % 4800), SUM(c4 % 4801), SUM(c4 % 4802), SUM(c4 % 4803), SUM(c4 % 4804), + SUM(c4 % 4805), SUM(c4 % 4806), SUM(c4 % 4807), SUM(c4 % 4808), SUM(c4 % 4809), + SUM(c4 % 4810), SUM(c4 % 4811), SUM(c4 % 4812), SUM(c4 % 4813), SUM(c4 % 4814), + SUM(c4 % 4815), SUM(c4 % 4816), SUM(c4 % 4817), SUM(c4 % 4818), SUM(c4 % 4819), + SUM(c4 % 4820), SUM(c4 % 4821), SUM(c4 % 4822), SUM(c4 % 4823), SUM(c4 % 4824), + SUM(c4 % 4825), SUM(c4 % 4826), SUM(c4 % 4827), SUM(c4 % 4828), SUM(c4 % 4829), + SUM(c4 % 4830), SUM(c4 % 4831), SUM(c4 % 4832), SUM(c4 % 4833), SUM(c4 % 4834), + SUM(c4 % 4835), SUM(c4 % 4836), SUM(c4 % 4837), SUM(c4 % 4838), SUM(c4 % 4839), + SUM(c4 % 4840), SUM(c4 % 4841), SUM(c4 % 4842), SUM(c4 % 4843), SUM(c4 % 4844), + SUM(c4 % 4845), SUM(c4 % 4846), SUM(c4 % 4847), SUM(c4 % 4848), SUM(c4 % 4849), + SUM(c4 % 4850), SUM(c4 % 4851), SUM(c4 % 4852), SUM(c4 % 4853), SUM(c4 % 4854), + SUM(c4 % 4855), SUM(c4 % 4856), SUM(c4 % 4857), SUM(c4 % 4858), SUM(c4 % 4859), + SUM(c4 % 4860), SUM(c4 % 4861), SUM(c4 % 4862), SUM(c4 % 4863), SUM(c4 % 4864), + SUM(c4 % 4865), SUM(c4 % 4866), SUM(c4 % 4867), SUM(c4 % 4868), SUM(c4 % 4869), + SUM(c4 % 4870), SUM(c4 % 4871), SUM(c4 % 4872), SUM(c4 % 4873), SUM(c4 % 4874), + SUM(c4 % 4875), SUM(c4 % 4876), SUM(c4 % 4877), SUM(c4 % 4878), SUM(c4 % 4879), + SUM(c4 % 4880), SUM(c4 % 4881), SUM(c4 % 4882), SUM(c4 % 4883), SUM(c4 % 4884), + SUM(c4 % 4885), SUM(c4 % 4886), SUM(c4 % 4887), SUM(c4 % 4888), SUM(c4 % 4889), + SUM(c4 % 4890), SUM(c4 % 4891), SUM(c4 % 4892), SUM(c4 % 4893), SUM(c4 % 4894), + SUM(c4 % 4895), SUM(c4 % 4896), SUM(c4 % 4897), SUM(c4 % 4898), SUM(c4 % 4899), + SUM(c4 % 4900), SUM(c4 % 4901), SUM(c4 % 4902), SUM(c4 % 4903), SUM(c4 % 4904), + SUM(c4 % 4905), SUM(c4 % 4906), SUM(c4 % 4907), SUM(c4 % 4908), SUM(c4 % 4909), + SUM(c4 % 4910), SUM(c4 % 4911), SUM(c4 % 4912), SUM(c4 % 4913), SUM(c4 % 4914), + SUM(c4 % 4915), SUM(c4 % 4916), SUM(c4 % 4917), SUM(c4 % 4918), SUM(c4 % 4919), + SUM(c4 % 4920), SUM(c4 % 4921), SUM(c4 % 4922), SUM(c4 % 4923), SUM(c4 % 4924), + SUM(c4 % 4925), SUM(c4 % 4926), SUM(c4 % 4927), SUM(c4 % 4928), SUM(c4 % 4929), + SUM(c4 % 4930), SUM(c4 % 4931), SUM(c4 % 4932), SUM(c4 % 4933), SUM(c4 % 4934), + SUM(c4 % 4935), SUM(c4 % 4936), SUM(c4 % 4937), SUM(c4 % 4938), SUM(c4 % 4939), + SUM(c4 % 4940), SUM(c4 % 4941), SUM(c4 % 4942), SUM(c4 % 4943), SUM(c4 % 4944), + SUM(c4 % 4945), SUM(c4 % 4946), SUM(c4 % 4947), SUM(c4 % 4948), SUM(c4 % 4949), + SUM(c4 % 4950), SUM(c4 % 4951), SUM(c4 % 4952), SUM(c4 % 4953), SUM(c4 % 4954), + SUM(c4 % 4955), SUM(c4 % 4956), SUM(c4 % 4957), SUM(c4 % 4958), SUM(c4 % 4959), + SUM(c4 % 4960), SUM(c4 % 4961), SUM(c4 % 4962), SUM(c4 % 4963), SUM(c4 % 4964), + SUM(c4 % 4965), SUM(c4 % 4966), SUM(c4 % 4967), SUM(c4 % 4968), SUM(c4 % 4969), + SUM(c4 % 4970), SUM(c4 % 4971), SUM(c4 % 4972), SUM(c4 % 4973), SUM(c4 % 4974), + SUM(c4 % 4975), SUM(c4 % 4976), SUM(c4 % 4977), SUM(c4 % 4978), SUM(c4 % 4979), + SUM(c4 % 4980), SUM(c4 % 4981), SUM(c4 % 4982), SUM(c4 % 4983), SUM(c4 % 4984), + SUM(c4 % 4985), SUM(c4 % 4986), SUM(c4 % 4987), SUM(c4 % 4988), SUM(c4 % 4989), + SUM(c4 % 4990), SUM(c4 % 4991), SUM(c4 % 4992), SUM(c4 % 4993), SUM(c4 % 4994), + SUM(c4 % 4995), SUM(c4 % 4996), SUM(c4 % 4997), SUM(c4 % 4998), SUM(c4 % 4999), + SUM(c4 % 5000), SUM(c4 % 5001), SUM(c4 % 5002), SUM(c4 % 5003), SUM(c4 % 5004), + SUM(c4 % 5005), SUM(c4 % 5006), SUM(c4 % 5007), SUM(c4 % 5008), SUM(c4 % 5009), + SUM(c4 % 5010), SUM(c4 % 5011), SUM(c4 % 5012), SUM(c4 % 5013), SUM(c4 % 5014), + SUM(c4 % 5015), SUM(c4 % 5016), SUM(c4 % 5017), SUM(c4 % 5018), SUM(c4 % 5019), + SUM(c4 % 5020), SUM(c4 % 5021), SUM(c4 % 5022), SUM(c4 % 5023), SUM(c4 % 5024), + SUM(c4 % 5025), SUM(c4 % 5026), SUM(c4 % 5027), SUM(c4 % 5028), SUM(c4 % 5029), + SUM(c4 % 5030), SUM(c4 % 5031), SUM(c4 % 5032), SUM(c4 % 5033), SUM(c4 % 5034), + SUM(c4 % 5035), SUM(c4 % 5036), SUM(c4 % 5037), SUM(c4 % 5038), SUM(c4 % 5039), + SUM(c4 % 5040), SUM(c4 % 5041), SUM(c4 % 5042), SUM(c4 % 5043), SUM(c4 % 5044), + SUM(c4 % 5045), SUM(c4 % 5046), SUM(c4 % 5047), SUM(c4 % 5048), SUM(c4 % 5049), + SUM(c4 % 5050), SUM(c4 % 5051), SUM(c4 % 5052), SUM(c4 % 5053), SUM(c4 % 5054), + SUM(c4 % 5055), SUM(c4 % 5056), SUM(c4 % 5057), SUM(c4 % 5058), SUM(c4 % 5059), + SUM(c4 % 5060), SUM(c4 % 5061), SUM(c4 % 5062), SUM(c4 % 5063), SUM(c4 % 5064), + SUM(c4 % 5065), SUM(c4 % 5066), SUM(c4 % 5067), SUM(c4 % 5068), SUM(c4 % 5069), + SUM(c4 % 5070), SUM(c4 % 5071), SUM(c4 % 5072), SUM(c4 % 5073), SUM(c4 % 5074), + SUM(c4 % 5075), SUM(c4 % 5076), SUM(c4 % 5077), SUM(c4 % 5078), SUM(c4 % 5079), + SUM(c4 % 5080), SUM(c4 % 5081), SUM(c4 % 5082), SUM(c4 % 5083), SUM(c4 % 5084), + SUM(c4 % 5085), SUM(c4 % 5086), SUM(c4 % 5087), SUM(c4 % 5088), SUM(c4 % 5089), + SUM(c4 % 5090), SUM(c4 % 5091), SUM(c4 % 5092), SUM(c4 % 5093), SUM(c4 % 5094), + SUM(c4 % 5095), SUM(c4 % 5096), SUM(c4 % 5097), SUM(c4 % 5098), SUM(c4 % 5099), + SUM(c4 % 5100), SUM(c4 % 5101), SUM(c4 % 5102), SUM(c4 % 5103), SUM(c4 % 5104), + SUM(c4 % 5105), SUM(c4 % 5106), SUM(c4 % 5107), SUM(c4 % 5108), SUM(c4 % 5109), + SUM(c4 % 5110), SUM(c4 % 5111), SUM(c4 % 5112), SUM(c4 % 5113), SUM(c4 % 5114), + SUM(c4 % 5115), SUM(c4 % 5116), SUM(c4 % 5117), SUM(c4 % 5118), SUM(c4 % 5119), + SUM(c4 % 5120), SUM(c4 % 5121), SUM(c4 % 5122), SUM(c4 % 5123), SUM(c4 % 5124), + SUM(c4 % 5125), SUM(c4 % 5126), SUM(c4 % 5127), SUM(c4 % 5128), SUM(c4 % 5129), + SUM(c4 % 5130), SUM(c4 % 5131), SUM(c4 % 5132), SUM(c4 % 5133), SUM(c4 % 5134), + SUM(c4 % 5135), SUM(c4 % 5136), SUM(c4 % 5137), SUM(c4 % 5138), SUM(c4 % 5139), + SUM(c4 % 5140), SUM(c4 % 5141), SUM(c4 % 5142), SUM(c4 % 5143), SUM(c4 % 5144), + SUM(c4 % 5145), SUM(c4 % 5146), SUM(c4 % 5147), SUM(c4 % 5148), SUM(c4 % 5149), + SUM(c4 % 5150), SUM(c4 % 5151), SUM(c4 % 5152), SUM(c4 % 5153), SUM(c4 % 5154), + SUM(c4 % 5155), SUM(c4 % 5156), SUM(c4 % 5157), SUM(c4 % 5158), SUM(c4 % 5159), + SUM(c4 % 5160), SUM(c4 % 5161), SUM(c4 % 5162), SUM(c4 % 5163), SUM(c4 % 5164), + SUM(c4 % 5165), SUM(c4 % 5166), SUM(c4 % 5167), SUM(c4 % 5168), SUM(c4 % 5169), + SUM(c4 % 5170), SUM(c4 % 5171), SUM(c4 % 5172), SUM(c4 % 5173), SUM(c4 % 5174), + SUM(c4 % 5175), SUM(c4 % 5176), SUM(c4 % 5177), SUM(c4 % 5178), SUM(c4 % 5179), + SUM(c4 % 5180), SUM(c4 % 5181), SUM(c4 % 5182), SUM(c4 % 5183), SUM(c4 % 5184), + SUM(c4 % 5185), SUM(c4 % 5186), SUM(c4 % 5187), SUM(c4 % 5188), SUM(c4 % 5189), + SUM(c4 % 5190), SUM(c4 % 5191), SUM(c4 % 5192), SUM(c4 % 5193), SUM(c4 % 5194), + SUM(c4 % 5195), SUM(c4 % 5196), SUM(c4 % 5197), SUM(c4 % 5198), SUM(c4 % 5199), + SUM(c4 % 5200), SUM(c4 % 5201), SUM(c4 % 5202), SUM(c4 % 5203), SUM(c4 % 5204), + SUM(c4 % 5205), SUM(c4 % 5206), SUM(c4 % 5207), SUM(c4 % 5208), SUM(c4 % 5209), + SUM(c4 % 5210), SUM(c4 % 5211), SUM(c4 % 5212), SUM(c4 % 5213), SUM(c4 % 5214), + SUM(c4 % 5215), SUM(c4 % 5216), SUM(c4 % 5217), SUM(c4 % 5218), SUM(c4 % 5219), + SUM(c4 % 5220), SUM(c4 % 5221), SUM(c4 % 5222), SUM(c4 % 5223), SUM(c4 % 5224), + SUM(c4 % 5225), SUM(c4 % 5226), SUM(c4 % 5227), SUM(c4 % 5228), SUM(c4 % 5229), + SUM(c4 % 5230), SUM(c4 % 5231), SUM(c4 % 5232), SUM(c4 % 5233), SUM(c4 % 5234), + SUM(c4 % 5235), SUM(c4 % 5236), SUM(c4 % 5237), SUM(c4 % 5238), SUM(c4 % 5239), + SUM(c4 % 5240), SUM(c4 % 5241), SUM(c4 % 5242), SUM(c4 % 5243), SUM(c4 % 5244), + SUM(c4 % 5245), SUM(c4 % 5246), SUM(c4 % 5247), SUM(c4 % 5248), SUM(c4 % 5249), + SUM(c4 % 5250), SUM(c4 % 5251), SUM(c4 % 5252), SUM(c4 % 5253), SUM(c4 % 5254), + SUM(c4 % 5255), SUM(c4 % 5256), SUM(c4 % 5257), SUM(c4 % 5258), SUM(c4 % 5259), + SUM(c4 % 5260), SUM(c4 % 5261), SUM(c4 % 5262), SUM(c4 % 5263), SUM(c4 % 5264), + SUM(c4 % 5265), SUM(c4 % 5266), SUM(c4 % 5267), SUM(c4 % 5268), SUM(c4 % 5269), + SUM(c4 % 5270), SUM(c4 % 5271), SUM(c4 % 5272), SUM(c4 % 5273), SUM(c4 % 5274), + SUM(c4 % 5275), SUM(c4 % 5276), SUM(c4 % 5277), SUM(c4 % 5278), SUM(c4 % 5279), + SUM(c4 % 5280), SUM(c4 % 5281), SUM(c4 % 5282), SUM(c4 % 5283), SUM(c4 % 5284), + SUM(c4 % 5285), SUM(c4 % 5286), SUM(c4 % 5287), SUM(c4 % 5288), SUM(c4 % 5289), + SUM(c4 % 5290), SUM(c4 % 5291), SUM(c4 % 5292), SUM(c4 % 5293), SUM(c4 % 5294), + SUM(c4 % 5295), SUM(c4 % 5296), SUM(c4 % 5297), SUM(c4 % 5298), SUM(c4 % 5299), + SUM(c4 % 5300), SUM(c4 % 5301), SUM(c4 % 5302), SUM(c4 % 5303), SUM(c4 % 5304), + SUM(c4 % 5305), SUM(c4 % 5306), SUM(c4 % 5307), SUM(c4 % 5308), SUM(c4 % 5309), + SUM(c4 % 5310), SUM(c4 % 5311), SUM(c4 % 5312), SUM(c4 % 5313), SUM(c4 % 5314), + SUM(c4 % 5315), SUM(c4 % 5316), SUM(c4 % 5317), SUM(c4 % 5318), SUM(c4 % 5319), + SUM(c4 % 5320), SUM(c4 % 5321), SUM(c4 % 5322), SUM(c4 % 5323), SUM(c4 % 5324), + SUM(c4 % 5325), SUM(c4 % 5326), SUM(c4 % 5327), SUM(c4 % 5328), SUM(c4 % 5329), + SUM(c4 % 5330), SUM(c4 % 5331), SUM(c4 % 5332), SUM(c4 % 5333), SUM(c4 % 5334), + SUM(c4 % 5335), SUM(c4 % 5336), SUM(c4 % 5337), SUM(c4 % 5338), SUM(c4 % 5339), + SUM(c4 % 5340), SUM(c4 % 5341), SUM(c4 % 5342), SUM(c4 % 5343), SUM(c4 % 5344), + SUM(c4 % 5345), SUM(c4 % 5346), SUM(c4 % 5347), SUM(c4 % 5348), SUM(c4 % 5349), + SUM(c4 % 5350), SUM(c4 % 5351), SUM(c4 % 5352), SUM(c4 % 5353), SUM(c4 % 5354), + SUM(c4 % 5355), SUM(c4 % 5356), SUM(c4 % 5357), SUM(c4 % 5358), SUM(c4 % 5359), + SUM(c4 % 5360), SUM(c4 % 5361), SUM(c4 % 5362), SUM(c4 % 5363), SUM(c4 % 5364), + SUM(c4 % 5365), SUM(c4 % 5366), SUM(c4 % 5367), SUM(c4 % 5368), SUM(c4 % 5369), + SUM(c4 % 5370), SUM(c4 % 5371), SUM(c4 % 5372), SUM(c4 % 5373), SUM(c4 % 5374), + SUM(c4 % 5375), SUM(c4 % 5376), SUM(c4 % 5377), SUM(c4 % 5378), SUM(c4 % 5379), + SUM(c4 % 5380), SUM(c4 % 5381), SUM(c4 % 5382), SUM(c4 % 5383), SUM(c4 % 5384), + SUM(c4 % 5385), SUM(c4 % 5386), SUM(c4 % 5387), SUM(c4 % 5388), SUM(c4 % 5389), + SUM(c4 % 5390), SUM(c4 % 5391), SUM(c4 % 5392), SUM(c4 % 5393), SUM(c4 % 5394), + SUM(c4 % 5395), SUM(c4 % 5396), SUM(c4 % 5397), SUM(c4 % 5398), SUM(c4 % 5399), + SUM(c4 % 5400), SUM(c4 % 5401), SUM(c4 % 5402), SUM(c4 % 5403), SUM(c4 % 5404), + SUM(c4 % 5405), SUM(c4 % 5406), SUM(c4 % 5407), SUM(c4 % 5408), SUM(c4 % 5409), + SUM(c4 % 5410), SUM(c4 % 5411), SUM(c4 % 5412), SUM(c4 % 5413), SUM(c4 % 5414), + SUM(c4 % 5415), SUM(c4 % 5416), SUM(c4 % 5417), SUM(c4 % 5418), SUM(c4 % 5419), + SUM(c4 % 5420), SUM(c4 % 5421), SUM(c4 % 5422), SUM(c4 % 5423), SUM(c4 % 5424), + SUM(c4 % 5425), SUM(c4 % 5426), SUM(c4 % 5427), SUM(c4 % 5428), SUM(c4 % 5429), + SUM(c4 % 5430), SUM(c4 % 5431), SUM(c4 % 5432), SUM(c4 % 5433), SUM(c4 % 5434), + SUM(c4 % 5435), SUM(c4 % 5436), SUM(c4 % 5437), SUM(c4 % 5438), SUM(c4 % 5439), + SUM(c4 % 5440), SUM(c4 % 5441), SUM(c4 % 5442), SUM(c4 % 5443), SUM(c4 % 5444), + SUM(c4 % 5445), SUM(c4 % 5446), SUM(c4 % 5447), SUM(c4 % 5448), SUM(c4 % 5449), + SUM(c4 % 5450), SUM(c4 % 5451), SUM(c4 % 5452), SUM(c4 % 5453), SUM(c4 % 5454), + SUM(c4 % 5455), SUM(c4 % 5456), SUM(c4 % 5457), SUM(c4 % 5458), SUM(c4 % 5459), + SUM(c4 % 5460), SUM(c4 % 5461), SUM(c4 % 5462), SUM(c4 % 5463), SUM(c4 % 5464), + SUM(c4 % 5465), SUM(c4 % 5466), SUM(c4 % 5467), SUM(c4 % 5468), SUM(c4 % 5469), + SUM(c4 % 5470), SUM(c4 % 5471), SUM(c4 % 5472), SUM(c4 % 5473), SUM(c4 % 5474), + SUM(c4 % 5475), SUM(c4 % 5476), SUM(c4 % 5477), SUM(c4 % 5478), SUM(c4 % 5479), + SUM(c4 % 5480), SUM(c4 % 5481), SUM(c4 % 5482), SUM(c4 % 5483), SUM(c4 % 5484), + SUM(c4 % 5485), SUM(c4 % 5486), SUM(c4 % 5487), SUM(c4 % 5488), SUM(c4 % 5489), + SUM(c4 % 5490), SUM(c4 % 5491), SUM(c4 % 5492), SUM(c4 % 5493), SUM(c4 % 5494), + SUM(c4 % 5495), SUM(c4 % 5496), SUM(c4 % 5497), SUM(c4 % 5498), SUM(c4 % 5499), + SUM(c4 % 5500), SUM(c4 % 5501), SUM(c4 % 5502), SUM(c4 % 5503), SUM(c4 % 5504), + SUM(c4 % 5505), SUM(c4 % 5506), SUM(c4 % 5507), SUM(c4 % 5508), SUM(c4 % 5509), + SUM(c4 % 5510), SUM(c4 % 5511), SUM(c4 % 5512), SUM(c4 % 5513), SUM(c4 % 5514), + SUM(c4 % 5515), SUM(c4 % 5516), SUM(c4 % 5517), SUM(c4 % 5518), SUM(c4 % 5519), + SUM(c4 % 5520), SUM(c4 % 5521), SUM(c4 % 5522), SUM(c4 % 5523), SUM(c4 % 5524), + SUM(c4 % 5525), SUM(c4 % 5526), SUM(c4 % 5527), SUM(c4 % 5528), SUM(c4 % 5529), + SUM(c4 % 5530), SUM(c4 % 5531), SUM(c4 % 5532), SUM(c4 % 5533), SUM(c4 % 5534), + SUM(c4 % 5535), SUM(c4 % 5536), SUM(c4 % 5537), SUM(c4 % 5538), SUM(c4 % 5539), + SUM(c4 % 5540), SUM(c4 % 5541), SUM(c4 % 5542), SUM(c4 % 5543), SUM(c4 % 5544), + SUM(c4 % 5545), SUM(c4 % 5546), SUM(c4 % 5547), SUM(c4 % 5548), SUM(c4 % 5549), + SUM(c4 % 5550), SUM(c4 % 5551), SUM(c4 % 5552), SUM(c4 % 5553), SUM(c4 % 5554), + SUM(c4 % 5555), SUM(c4 % 5556), SUM(c4 % 5557), SUM(c4 % 5558), SUM(c4 % 5559), + SUM(c4 % 5560), SUM(c4 % 5561), SUM(c4 % 5562), SUM(c4 % 5563), SUM(c4 % 5564), + SUM(c4 % 5565), SUM(c4 % 5566), SUM(c4 % 5567), SUM(c4 % 5568), SUM(c4 % 5569), + SUM(c4 % 5570), SUM(c4 % 5571), SUM(c4 % 5572), SUM(c4 % 5573), SUM(c4 % 5574), + SUM(c4 % 5575), SUM(c4 % 5576), SUM(c4 % 5577), SUM(c4 % 5578), SUM(c4 % 5579), + SUM(c4 % 5580), SUM(c4 % 5581), SUM(c4 % 5582), SUM(c4 % 5583), SUM(c4 % 5584), + SUM(c4 % 5585), SUM(c4 % 5586), SUM(c4 % 5587), SUM(c4 % 5588), SUM(c4 % 5589), + SUM(c4 % 5590), SUM(c4 % 5591), SUM(c4 % 5592), SUM(c4 % 5593), SUM(c4 % 5594), + SUM(c4 % 5595), SUM(c4 % 5596), SUM(c4 % 5597), SUM(c4 % 5598), SUM(c4 % 5599), + SUM(c4 % 5600), SUM(c4 % 5601), SUM(c4 % 5602), SUM(c4 % 5603), SUM(c4 % 5604), + SUM(c4 % 5605), SUM(c4 % 5606), SUM(c4 % 5607), SUM(c4 % 5608), SUM(c4 % 5609), + SUM(c4 % 5610), SUM(c4 % 5611), SUM(c4 % 5612), SUM(c4 % 5613), SUM(c4 % 5614), + SUM(c4 % 5615), SUM(c4 % 5616), SUM(c4 % 5617), SUM(c4 % 5618), SUM(c4 % 5619), + SUM(c4 % 5620), SUM(c4 % 5621), SUM(c4 % 5622), SUM(c4 % 5623), SUM(c4 % 5624), + SUM(c4 % 5625), SUM(c4 % 5626), SUM(c4 % 5627), SUM(c4 % 5628), SUM(c4 % 5629), + SUM(c4 % 5630), SUM(c4 % 5631), SUM(c4 % 5632), SUM(c4 % 5633), SUM(c4 % 5634), + SUM(c4 % 5635), SUM(c4 % 5636), SUM(c4 % 5637), SUM(c4 % 5638), SUM(c4 % 5639), + SUM(c4 % 5640), SUM(c4 % 5641), SUM(c4 % 5642), SUM(c4 % 5643), SUM(c4 % 5644), + SUM(c4 % 5645), SUM(c4 % 5646), SUM(c4 % 5647), SUM(c4 % 5648), SUM(c4 % 5649), + SUM(c4 % 5650), SUM(c4 % 5651), SUM(c4 % 5652), SUM(c4 % 5653), SUM(c4 % 5654), + SUM(c4 % 5655), SUM(c4 % 5656), SUM(c4 % 5657), SUM(c4 % 5658), SUM(c4 % 5659), + SUM(c4 % 5660), SUM(c4 % 5661), SUM(c4 % 5662), SUM(c4 % 5663), SUM(c4 % 5664), + SUM(c4 % 5665), SUM(c4 % 5666), SUM(c4 % 5667), SUM(c4 % 5668), SUM(c4 % 5669), + SUM(c4 % 5670), SUM(c4 % 5671)], 1) +from mtup1 where c0 = 'foo' group by c0, c1 limit 10; + c0 | c1 | array_length +-----+-------------+-------------- + foo | 2015-09-1.1 | 5670 +(1 row) + +reset gp_enable_multiphase_agg; +-- MPP-29042 Multistage aggregation plans should have consistent targetlists in +-- case of same column aliases and grouping on them. +DROP TABLE IF EXISTS t1; +NOTICE: table "t1" does not exist, skipping +CREATE TABLE t1 (a varchar, b character varying); +INSERT INTO t1 VALUES ('aaaaaaa', 'cccccccccc'); +INSERT INTO t1 VALUES ('aaaaaaa', 'ddddd'); +INSERT INTO t1 VALUES ('bbbbbbb', 'eeee'); +INSERT INTO t1 VALUES ('bbbbbbb', 'eeef'); +INSERT INTO t1 VALUES ('bbbbb', 'dfafa'); +SELECT substr(a, 1) as a FROM (SELECT ('-'||a)::varchar as a FROM (SELECT a FROM t1) t2) t3 GROUP BY a ORDER BY a; + a +---------- + -aaaaaaa + -bbbbb + -bbbbbbb +(3 rows) + +SELECT array_agg(f ORDER BY f) FROM (SELECT b::text as f FROM t1 GROUP BY b ORDER BY b) q; + array_agg +------------------------------------ + {cccccccccc,ddddd,dfafa,eeee,eeef} +(1 row) + +-- Check that ORDER BY NULLS FIRST/LAST in an aggregate is respected (these are +-- variants of similar query in PostgreSQL's aggregates test) +create temporary table aggordertest (a int4, b int4); +insert into aggordertest values (1,1), (2,2), (1,3), (3,4), (null,5), (2,null); +select array_agg(a order by a nulls first) from aggordertest; + array_agg +------------------ + {NULL,1,1,2,2,3} +(1 row) + +select array_agg(a order by a nulls last) from aggordertest; + array_agg +------------------ + {1,1,2,2,3,NULL} +(1 row) + +select array_agg(a order by a desc nulls first) from aggordertest; + array_agg +------------------ + {NULL,3,2,2,1,1} +(1 row) + +select array_agg(a order by a desc nulls last) from aggordertest; + array_agg +------------------ + {3,2,2,1,1,NULL} +(1 row) + +select array_agg(a order by b nulls first) from aggordertest; + array_agg +------------------ + {2,1,2,1,3,NULL} +(1 row) + +select array_agg(a order by b nulls last) from aggordertest; + array_agg +------------------ + {1,2,1,3,NULL,2} +(1 row) + +select array_agg(a order by b desc nulls first) from aggordertest; + array_agg +------------------ + {2,NULL,3,1,2,1} +(1 row) + +select array_agg(a order by b desc nulls last) from aggordertest; + array_agg +------------------ + {NULL,3,1,2,1,2} +(1 row) + +-- begin MPP-14125: if combine function is missing, do not choose hash agg. +-- Like in the 'attribute_table' and 'concat' test earlier in this file, a +-- Hash Agg is currently OK, since we lost the Hybrid Hash Agg spilling code +-- in the merge. +create temp table mpp14125 as select repeat('a', a) a, a % 10 b from generate_series(1, 100)a; +explain select string_agg(a, '') from mpp14125 group by b; + QUERY PLAN +------------------------------------------------------------------- + HashAggregate (cost=86.65..99.15 rows=1000 width=36) + Group Key: b + -> Seq Scan on mpp14125 (cost=0.00..61.10 rows=5110 width=36) + Optimizer: Postgres query optimizer +(4 rows) + +-- end MPP-14125 +-- Test that integer AVG() aggregate is accurate with large values. We used to +-- use float8 to hold the running sums, which did not have enough precision +-- for this. +select avg('1000000000000000000'::int8) from generate_series(1, 100000); + avg +--------------------- + 1000000000000000000 +(1 row) + +-- Test cases where the planner would like to distribute on a column, to implement +-- grouping or distinct, but can't because the datatype isn't GPDB-hashable. +-- These are all variants of the same issue; all of these used to miss the +-- check on whether the column is GPDB_hashble, producing an assertion failure. +create table int2vectortab (distkey int, t int2vector,t2 int2vector); +insert into int2vectortab values + (1, '1', '1'), + (2, '1 2', '1 2'), + (3, '1 2 3', '1 2 3'), + (22,'22', '1 2 3 4'), + (22,'1 2', '1 2 3 4 5'); +select distinct t from int2vectortab group by distkey, t; + t +------- + 1 + 1 2 + 1 2 3 + 22 +(4 rows) + +select t from int2vectortab union select t from int2vectortab; + t +------- + 1 + 1 2 + 1 2 3 + 22 +(4 rows) + +select count(*) over (partition by t) from int2vectortab; + count +------- + 1 + 1 + 1 + 2 + 2 +(5 rows) + +select count(distinct t) from int2vectortab; + count +------- + 4 +(1 row) + +select count(distinct t), count(distinct t2) from int2vectortab; + count | count +-------+------- + 4 | 5 +(1 row) + +-- +-- Testing aggregate above FULL JOIN +-- +-- SETUP +CREATE TABLE pagg_tab1(x int, y int); +CREATE TABLE pagg_tab2(x int, y int); +INSERT INTO pagg_tab1 SELECT i % 30, i % 20 FROM generate_series(0, 299, 2) i; +INSERT INTO pagg_tab2 SELECT i % 20, i % 30 FROM generate_series(0, 299, 3) i; +ANALYZE pagg_tab1; +ANALYZE pagg_tab2; +-- TEST +-- should have Redistribute Motion above the FULL JOIN +EXPLAIN (COSTS OFF) +SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x ORDER BY 1 NULLS LAST; + QUERY PLAN +------------------------------------------------- + Sort + Sort Key: a.x + -> HashAggregate + Group Key: a.x + -> Hash Full Join + Hash Cond: (a.x = b.y) + -> Seq Scan on pagg_tab1 a + -> Hash + -> Seq Scan on pagg_tab2 b + Optimizer: Postgres query optimizer +(10 rows) + +SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x ORDER BY 1 NULLS LAST; + x | sum +----+------ + 0 | 500 + 2 | + 4 | + 6 | 1100 + 8 | + 10 | + 12 | 700 + 14 | + 16 | + 18 | 1300 + 20 | + 22 | + 24 | 900 + 26 | + 28 | + | 500 +(16 rows) + +EXPLAIN (COSTS OFF) +SELECT a.x, b.y, count(*) FROM pagg_tab1 a FULL JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x, b.y; + QUERY PLAN +------------------------------------------- + HashAggregate + Group Key: a.x, b.y + -> Hash Full Join + Hash Cond: (a.x = b.y) + -> Seq Scan on pagg_tab1 a + -> Hash + -> Seq Scan on pagg_tab2 b + Optimizer: Postgres query optimizer +(8 rows) + +SELECT a.x, b.y, count(*) FROM pagg_tab1 a FULL JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x, b.y; + x | y | count +----+----+------- + 26 | | 10 + 28 | | 10 + 4 | | 10 + | 15 | 10 + 6 | 6 | 100 + 8 | | 10 + 2 | | 10 + 22 | | 10 + 10 | | 10 + | 9 | 10 + | 21 | 10 + 0 | 0 | 100 + 14 | | 10 + 12 | 12 | 100 + | 3 | 10 + 16 | | 10 + | 27 | 10 + 18 | 18 | 100 + 20 | | 10 + 24 | 24 | 100 +(20 rows) + +-- +-- Test GROUP BY with a constant +-- +create temp table group_by_const (col1 int, col2 int); +insert into group_by_const select i from generate_series(1, 1000) i; +analyze group_by_const; +explain (costs off) +select 1, sum(col1) from group_by_const group by 1; + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: 1 + -> Seq Scan on group_by_const + Optimizer: Postgres query optimizer +(4 rows) + +select 1, sum(col1) from group_by_const group by 1; + ?column? | sum +----------+-------- + 1 | 500500 +(1 row) + +-- Same, but using an aggregate that doesn't have a combine function, so +-- that you get a one-phase aggregate plan. +explain (costs off) +select 1, median(col1) from group_by_const group by 1; + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: 1 + -> Seq Scan on group_by_const + Optimizer: Postgres query optimizer +(4 rows) + +select 1, median(col1) from group_by_const group by 1; + ?column? | median +----------+-------- + 1 | 500.5 +(1 row) + +-- CLEANUP +set client_min_messages='warning'; +drop schema bfv_aggregate cascade; diff --git a/src/test/singlenode_regress/expected/bfv_catalog.out b/src/test/singlenode_regress/expected/bfv_catalog.out new file mode 100644 index 00000000000..4ba9dea31f4 --- /dev/null +++ b/src/test/singlenode_regress/expected/bfv_catalog.out @@ -0,0 +1,622 @@ +create schema bfv_catalog; +set search_path=bfv_catalog; +-- count number of certain operators in a given plan +-- start_ignore +create language plpython3u; +-- end_ignore +create or replace function count_operator(query text, operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; +-- +-- Testing queries with subqueries with nested scalar functions +-- +create table q68t792_temp(u_vtgnr varchar(6), u_zj varchar(2), u_folio varchar(2)); +insert into q68t792_temp select x ||'1' , x || '', x || '' from generate_series(30,99) x; +SELECT u_vtgnr, u_zj, u_folio +FROM q68t792_temp a +WHERE +u_zj = +(SELECT substr(max(case when cast(u_zj as integer) < 50 then '20' || u_zj else '19' || u_zj end),3,2) + FROM q68t792_temp b WHERE a.u_vtgnr = b.u_vtgnr) +AND u_folio = (SELECT max(u_folio) FROM q68t792_temp c WHERE a.u_vtgnr = c.u_vtgnr and a.u_zj = c.u_zj) +order by u_vtgnr, u_zj, u_folio; + u_vtgnr | u_zj | u_folio +---------+------+--------- + 301 | 30 | 30 + 311 | 31 | 31 + 321 | 32 | 32 + 331 | 33 | 33 + 341 | 34 | 34 + 351 | 35 | 35 + 361 | 36 | 36 + 371 | 37 | 37 + 381 | 38 | 38 + 391 | 39 | 39 + 401 | 40 | 40 + 411 | 41 | 41 + 421 | 42 | 42 + 431 | 43 | 43 + 441 | 44 | 44 + 451 | 45 | 45 + 461 | 46 | 46 + 471 | 47 | 47 + 481 | 48 | 48 + 491 | 49 | 49 + 501 | 50 | 50 + 511 | 51 | 51 + 521 | 52 | 52 + 531 | 53 | 53 + 541 | 54 | 54 + 551 | 55 | 55 + 561 | 56 | 56 + 571 | 57 | 57 + 581 | 58 | 58 + 591 | 59 | 59 + 601 | 60 | 60 + 611 | 61 | 61 + 621 | 62 | 62 + 631 | 63 | 63 + 641 | 64 | 64 + 651 | 65 | 65 + 661 | 66 | 66 + 671 | 67 | 67 + 681 | 68 | 68 + 691 | 69 | 69 + 701 | 70 | 70 + 711 | 71 | 71 + 721 | 72 | 72 + 731 | 73 | 73 + 741 | 74 | 74 + 751 | 75 | 75 + 761 | 76 | 76 + 771 | 77 | 77 + 781 | 78 | 78 + 791 | 79 | 79 + 801 | 80 | 80 + 811 | 81 | 81 + 821 | 82 | 82 + 831 | 83 | 83 + 841 | 84 | 84 + 851 | 85 | 85 + 861 | 86 | 86 + 871 | 87 | 87 + 881 | 88 | 88 + 891 | 89 | 89 + 901 | 90 | 90 + 911 | 91 | 91 + 921 | 92 | 92 + 931 | 93 | 93 + 941 | 94 | 94 + 951 | 95 | 95 + 961 | 96 | 96 + 971 | 97 | 97 + 981 | 98 | 98 + 991 | 99 | 99 +(70 rows) + +SELECT u_vtgnr, u_zj, u_folio +FROM q68t792_temp a +WHERE +u_zj = +(SELECT substr(max(case when cast(u_zj as integer) < 50 then '20' || u_zj else '19' || u_zj end),3,2) + FROM q68t792_temp b WHERE a.u_vtgnr <= b.u_vtgnr) +AND u_folio = (SELECT max(u_folio) FROM q68t792_temp c WHERE a.u_vtgnr <= c.u_vtgnr and a.u_zj <= c.u_zj) +order by u_vtgnr, u_zj, u_folio; + u_vtgnr | u_zj | u_folio +---------+------+--------- + 991 | 99 | 99 +(1 row) + +-- Fix bug in Expression to DXL translation for correlated queries when optimizer is turned on. +CREATE TABLE t1 (a int, b int); +CREATE TABLE t2 (a int, b int); +CREATE TABLE x (a int); +select * from x where a= (select sum(t1.a) from t1 inner join (select x.a as outer_ref, * from t2) as foo on (foo.a=t1.a+ outer_ref) group by foo.a); + a +--- +(0 rows) + +SET statement_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = off; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET escape_string_warning = off; +SET default_with_oids = false; +CREATE TABLE test_r_rvv_stada_dim_konst ( + dim_bezei character varying(50) NOT NULL, + dim_elem_lvl smallint NOT NULL, + dim_elem_nr character varying(12) NOT NULL, + dim_elem_id character varying(12) NOT NULL, + dim_elem_bezei character varying(50) NOT NULL, + dim_parent_nr smallint, + dim_bed character varying(150) +); +CREATE TABLE test_sf_dd_land_vm ( + land_elem_nr smallint NOT NULL, + land_elem_bezei character varying(50) NOT NULL, + land_typ smallint NOT NULL, + land_id character varying(2), + land_nr smallint, + land_bezei character varying(50), + land_bezei_krz character varying(15), + land_abc_kz character varying(1), + land_seg_qis_nr smallint, + land_seg_qis_bezei character varying(50), + land_seg_geo_nr smallint, + land_seg_geo_bezei character varying(50), + region_nr smallint, + region_bezei character varying(50), + sm_region_nr smallint, + sm_region_bezei character varying(50), + land_ges_nr smallint NOT NULL, + land_ges_bezei character varying(50) NOT NULL +); +COPY test_r_rvv_stada_dim_konst (dim_bezei, dim_elem_lvl, dim_elem_nr, dim_elem_id, dim_elem_bezei, dim_parent_nr, dim_bed) FROM stdin; +COPY test_sf_dd_land_vm (land_elem_nr, land_elem_bezei, land_typ, land_id, land_nr, land_bezei, land_bezei_krz, land_abc_kz, land_seg_qis_nr, land_seg_qis_bezei, land_seg_geo_nr, land_seg_geo_bezei, region_nr, region_bezei, sm_region_nr, sm_region_bezei, land_ges_nr, land_ges_bezei) FROM stdin; +select konst.dim_elem_bezei as natcat_zone_elem_bezei, + konst.dim_elem_bezei as natcat_zone_elem_id, + case when konst.dim_elem_lvl = 2 then (select land.land_nr from test_sf_dd_land_vm land where land.land_id=konst.dim_elem_bezei) end as land_nr +from + test_r_rvv_stada_dim_konst konst ,test_r_rvv_stada_dim_konst gesamt +where + konst.dim_bezei = 'NatCat-Zone' and gesamt.dim_bezei = 'NatCat-Zone' and gesamt.dim_elem_lvl = 0; + natcat_zone_elem_bezei | natcat_zone_elem_id | land_nr +----------------------------------+----------------------------------+--------- + 832e21f9da1ad55895637d00686fdb42 | 832e21f9da1ad55895637d00686fdb42 | + ec8989f78fab481d87f43ecacca55aa1 | ec8989f78fab481d87f43ecacca55aa1 | + fc8baa6879e639926be3916810962e13 | fc8baa6879e639926be3916810962e13 | + d877c55797fd430ce8150363cd86058f | d877c55797fd430ce8150363cd86058f | + 35b3855dc94445aa82615b66f73f5be9 | 35b3855dc94445aa82615b66f73f5be9 | + 578ed5a4eecf5a15803abdc49f6152d6 | 578ed5a4eecf5a15803abdc49f6152d6 | + e6d96502596d7e7887b76646c5f615d9 | e6d96502596d7e7887b76646c5f615d9 | + 365f939403a7e61514b0f74b6809290f | 365f939403a7e61514b0f74b6809290f | + b6eb281e772f7b8fc9404fba1fbbb06a | b6eb281e772f7b8fc9404fba1fbbb06a | + a441cb7c28e1f94b7d8e7e1be1f07310 | a441cb7c28e1f94b7d8e7e1be1f07310 | + 78b0fb7d034c46f13890008e6f36806b | 78b0fb7d034c46f13890008e6f36806b | + 49b10fbde180f30ecd23a4155ecc5a6f | 49b10fbde180f30ecd23a4155ecc5a6f | + 5034bc3fd2a153aad8f903a3df44d08a | 5034bc3fd2a153aad8f903a3df44d08a | + 2c61ebff5a7f675451467527df66788d | 2c61ebff5a7f675451467527df66788d | + f4864963ac0643d1b73ec6580f283042 | f4864963ac0643d1b73ec6580f283042 | + ada53304c5b9e4a839615b6e8f908eb6 | ada53304c5b9e4a839615b6e8f908eb6 | + 78fe5b68956805618673ba3f04999ae8 | 78fe5b68956805618673ba3f04999ae8 | + b0c597f91004d4355059ffeee1f30393 | b0c597f91004d4355059ffeee1f30393 | + 5e4ac03d7827ca48ed305a0d80cd5aa1 | 5e4ac03d7827ca48ed305a0d80cd5aa1 | + 326069604c6a5df905ad7524ff6fd845 | 326069604c6a5df905ad7524ff6fd845 | + 0776809bccf9f0ce17bea87f017c1b9f | 0776809bccf9f0ce17bea87f017c1b9f | + f81e986ee4c9f80d6002bf5302b3ea87 | f81e986ee4c9f80d6002bf5302b3ea87 | + e4541ed56cf3de37439937a54e5d6f38 | e4541ed56cf3de37439937a54e5d6f38 | + 131d5a3daa39b73050f40a62372ee44e | 131d5a3daa39b73050f40a62372ee44e | + ffe7470430a737c4ce6dc74bea0155d5 | ffe7470430a737c4ce6dc74bea0155d5 | + 8381363cab61eb967e4bb45a8d44b7e0 | 8381363cab61eb967e4bb45a8d44b7e0 | + dec371fcaec103c77f726ecf6f045d19 | dec371fcaec103c77f726ecf6f045d19 | + 3fbe674f00bdce9f04865f793d7b555a | 3fbe674f00bdce9f04865f793d7b555a | + 484c5aa99688af4038b3980324f1232c | 484c5aa99688af4038b3980324f1232c | + 57c7d11cd49333e3f722204c63016da9 | 57c7d11cd49333e3f722204c63016da9 | + e7333d76e27e6772a960a972a8d6598e | e7333d76e27e6772a960a972a8d6598e | + ba8eaeec35b54c67fea9bb1645a489a8 | ba8eaeec35b54c67fea9bb1645a489a8 | + 375dcc1c4dec844c30d1a9a33d6e04af | 375dcc1c4dec844c30d1a9a33d6e04af | + e060bb629c10e1b143614cc1e9ccdc67 | e060bb629c10e1b143614cc1e9ccdc67 | + ecab6653cedb98ded1c7416c0d114df7 | ecab6653cedb98ded1c7416c0d114df7 | + 06202b87153d246b5acbf8ed52301f6e | 06202b87153d246b5acbf8ed52301f6e | + f2f72863a84704b5c9ba7a8aa051f73d | f2f72863a84704b5c9ba7a8aa051f73d | + 2708c3704f3c6a7b3a9e685289b412aa | 2708c3704f3c6a7b3a9e685289b412aa | +(38 rows) + +-- test queries that should run on the master +create table mpp_bfv_1(col1 int, col2 text, col3 numeric); +-- this cannot go to the _setup file, because it is not propagated here +set optimizer_enable_indexscan = off; +set optimizer_enable_master_only_queries = on; +-- query that mentions no tables should have no motions +select count_operator('select substr(''abc'', 2)', 'Motion'); + count_operator +---------------- + 0 +(1 row) + +-- queries that mention only master only tables (such as catalog tables) +-- should have no motions +select count_operator('select relname from pg_class where relname = ''pg_class''', 'Motion'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select attname from pg_attribute where attname = ''attstorage''', 'Motion'); + count_operator +---------------- + 0 +(1 row) + +-- queries with master-only TVFs and no distributed trabes have no motions +select count_operator('select * from generate_series(1,10)', 'Motion'); + count_operator +---------------- + 0 +(1 row) + +-- start_ignore +-- queries over distributed tables should have motions +select count_operator('select col2 from mpp_bfv_1;', 'Motion'); + count_operator +---------------- + 1 +(1 row) +-- end_ignore +-- this cannot go to the _teardown file, because it is not propagated here +reset optimizer_enable_indexscan; +create table mpp_bfv_2(a int, b text, primary key (a)); +-- stop falling back to planner when catalog functions are encountered +explain select pg_column_size('mpp_bfv_2'); + QUERY PLAN +------------------------------------------ + Result (cost=0.00..0.01 rows=1 width=0) + Settings: optimizer=off + Optimizer status: Postgres query optimizer +(3 rows) + +explain select pg_lock_status(); + QUERY PLAN +-------------------------------------------------- + ProjectSet (cost=0.00..5.02 rows=1000 width=32) + -> Result (cost=0.00..0.01 rows=1 width=0) + Optimizer: Postgres query optimizer +(3 rows) + +select pg_get_constraintdef(pg_constraint.oid) from pg_constraint, pg_class where conrelid=pg_class.oid and pg_class.relname='mpp_bfv_2'; + pg_get_constraintdef +---------------------- + PRIMARY KEY (a) +(1 row) + +-- +-- Test detoasting of a long text field, when it comes directly from the QD +-- node without Motion nodes. +-- +-- create a function with a very long function body, so that it gets +-- toasted (or compressed). +CREATE FUNCTION function_with_long_body() RETURNS text LANGUAGE sql +AS $function$ +select $embeddedtext$ +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +$embeddedtext$::text; +$function$; +-- Check that it's detoasted correctly when it's sent to the client, in +-- printtup() +select prosrc from pg_proc where proname = 'function_with_long_body'; + prosrc +----------------------------------------------------------------------------- + + + select $embeddedtext$ + + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + 123456789012345678901234567890123456789012345678901234567890123456789012345+ + $embeddedtext$::text; + + +(1 row) + +-- +-- Check for assertion failure that happened in VACUUM FULL of +-- pg_stat_last_operation. The VACUUM FULL of reindexing its indexes +-- inserted an entry to pg_stat_last_operation, but there's an assertion +-- that you don't try to insert into an index that's currently being +-- reindexed, or pending reindexing. This no longer happens, because +-- pg_stat_last_operation now only has one index, so that there is no +-- pending indexes left for it after indexing the first one. +-- +-- first, delete all existing entries on pg_stat_last_operation, for the +-- table and its indexes. Otherwise, the update might be a HOT update, +-- and not touch the indexes. +set allow_system_table_mods=on; +delete from pg_stat_last_operation + where classid='pg_class'::regclass and objid::regclass::text like 'pg_stat%last%'; +set allow_system_table_mods=off; +-- VACUUM FULL should insert an entry, for building the index after rebuilding +-- the heap. +vacuum full pg_stat_last_operation; +select classid::regclass, objid::regclass, staactionname, stasubtype from pg_stat_last_operation + where classid='pg_class'::regclass and objid::regclass::text like 'pg_stat%last%' and stasubtype != 'AUTO'; + classid | objid | staactionname | stasubtype +----------+-------------------------------------------------+---------------+------------ + pg_class | pg_stat_last_operation | VACUUM | FULL + pg_class | pg_statlastop_classid_objid_staactionname_index | VACUUM | REINDEX +(2 rows) + diff --git a/src/test/singlenode_regress/expected/bfv_dd.out b/src/test/singlenode_regress/expected/bfv_dd.out new file mode 100644 index 00000000000..e74513e896a --- /dev/null +++ b/src/test/singlenode_regress/expected/bfv_dd.out @@ -0,0 +1,746 @@ +-- +-- Direct Dispatch Test when optimizer is on +-- +-- start_ignore +set optimizer_log=on; +-- end_ignore +set test_print_direct_dispatch_info=on; +set gp_autostats_mode = 'None'; +-- create table with distribution on a single table +create table dd_singlecol_1(a int, b int); +insert into dd_singlecol_1 select g, g%15 from generate_series(1,100) g; +insert into dd_singlecol_1 values(null, null); +analyze dd_singlecol_1; +-- ctas tests +create table dd_ctas_1 as select * from dd_singlecol_1 where a=1; +create table dd_ctas_2 as select * from dd_singlecol_1 where a is NULL; +select * from dd_ctas_1; + a | b +---+--- + 1 | 1 +(1 row) + +select * from dd_ctas_2; + a | b +---+--- + | +(1 row) + +drop table dd_ctas_1; +drop table dd_ctas_2; +-- direct dispatch and queries having with clause +with cte as (select * from dd_singlecol_1 where a=1) select * from cte; + a | b +---+--- + 1 | 1 +(1 row) + +with cte as (select * from dd_singlecol_1) select * from cte where a=1; + a | b +---+--- + 1 | 1 +(1 row) + +with cte1 as (with cte2 as (select * from dd_singlecol_1) select * from cte2 where a=1) select * from cte1; + a | b +---+--- + 1 | 1 +(1 row) + +-- negative tests: joins not supported +with cte as (select * from dd_singlecol_1) select * from cte c1, cte c2 where c1.a=1 and c2.a=1 and c1.a=c2.a limit 10; + a | b | a | b +---+---+---+--- + 1 | 1 | 1 | 1 +(1 row) + +-- cte with function scans +with cte as (select generate_series(1,10) g) select * from dd_singlecol_1 t1, cte where t1.a=cte.g and t1.a=1 limit 100; + a | b | g +---+---+--- + 1 | 1 | 1 +(1 row) + +-- single column distr key +select * from dd_singlecol_1 where a in (10,11,12); + a | b +----+---- + 10 | 10 + 11 | 11 + 12 | 12 +(3 rows) + +select * from dd_singlecol_1 where a=10 or a=11 or a=12; + a | b +----+---- + 10 | 10 + 11 | 11 + 12 | 12 +(3 rows) + +select * from dd_singlecol_1 where a is null or a=1; + a | b +---+--- + 1 | 1 + | +(2 rows) + +-- projections and disjunction +select b from dd_singlecol_1 where a=1 or a=2; + b +--- + 1 + 2 +(2 rows) + +-- single column distr key, values hash to the same segment +select * from dd_singlecol_1 where a=10 or a=11; + a | b +----+---- + 10 | 10 + 11 | 11 +(2 rows) + +select * from dd_singlecol_1 where a in (10, 11); + a | b +----+---- + 10 | 10 + 11 | 11 +(2 rows) + +select * from dd_singlecol_1 where a is null or a=2; + a | b +---+--- + | + 2 | 2 +(2 rows) + +select * from dd_singlecol_1 where (a,b) in ((10,2),(11,3)); + a | b +---+--- +(0 rows) + +select * from dd_singlecol_1 where a between 10 and 11; + a | b +----+---- + 10 | 10 + 11 | 11 +(2 rows) + +-- partitioned tables +create table dd_part_singlecol(a int, b int, c int) partition by range (b) +(start(1) end(100) every (20), default partition extra); +insert into dd_part_singlecol select g, g*2, g*3 from generate_series(1,49) g; +insert into dd_part_singlecol values (NULL, NULL); +-- disjunction with partitioned tables +select * from dd_part_singlecol where a in (10,11,12); + a | b | c +----+----+---- + 10 | 20 | 30 + 11 | 22 | 33 + 12 | 24 | 36 +(3 rows) + +select * from dd_part_singlecol where a=10 or a=11 or a=12; + a | b | c +----+----+---- + 10 | 20 | 30 + 11 | 22 | 33 + 12 | 24 | 36 +(3 rows) + +select * from dd_part_singlecol where a is null or a=1; + a | b | c +---+---+--- + 1 | 2 | 3 + | | +(2 rows) + +-- simple predicates +select * from dd_part_singlecol where a=1; + a | b | c +---+---+--- + 1 | 2 | 3 +(1 row) + +select * from dd_part_singlecol where a=1 and b=2; + a | b | c +---+---+--- + 1 | 2 | 3 +(1 row) + +select * from dd_part_singlecol where a = 1 and b<10; + a | b | c +---+---+--- + 1 | 2 | 3 +(1 row) + +select * from dd_part_singlecol where a is null; + a | b | c +---+---+--- + | | +(1 row) + +select * from dd_part_singlecol where a is null and b is null; + a | b | c +---+---+--- + | | +(1 row) + +-- complex queries +-- projections +select b from dd_part_singlecol where a=1; + b +--- + 2 +(1 row) + + +select a+b from dd_part_singlecol where a=1; + ?column? +---------- + 3 +(1 row) + +select 'one' from dd_part_singlecol where a=1; + ?column? +---------- + one +(1 row) + +select a, 'one' from dd_part_singlecol where a=1; + a | ?column? +---+---------- + 1 | one +(1 row) + +-- group by and sort +select a, count(*) from dd_part_singlecol where a=1 group by a; + a | count +---+------- + 1 | 1 +(1 row) + +select a, count(*) from dd_part_singlecol where a=1 group by a order by a; + a | count +---+------- + 1 | 1 +(1 row) + +-- indexes +create table dd_singlecol_idx(a int, b int, c int); +create index sc_idx_b on dd_singlecol_idx(b); +create index sc_idx_bc on dd_singlecol_idx(b,c); +insert into dd_singlecol_idx select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_idx values(null, null); +create table dd_singlecol_idx2(a int, b int, c int); +create index sc_idx_a on dd_singlecol_idx2(a); +insert into dd_singlecol_idx2 select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_idx2 values(null, null); +analyze dd_singlecol_idx; +analyze dd_singlecol_idx2; +-- disjunction with index scans +select * from dd_singlecol_idx where (a=1 or a=2) and b<2; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select 'one' from dd_singlecol_idx where (a=1 or a=2) and b=1; + ?column? +---------- + one +(1 row) + +select a, count(*) from dd_singlecol_idx where (a=1 or a=2) and b=1 group by a; + a | count +---+------- + 1 | 1 +(1 row) + +select count(*) from dd_singlecol_idx; + count +------- + 101 +(1 row) + +-- create table with bitmap indexes +create table dd_singlecol_bitmap_idx(a int, b int, c int); +create index sc_bitmap_idx_b on dd_singlecol_bitmap_idx using bitmap (b); +create index sc_bitmap_idx_c on dd_singlecol_bitmap_idx using bitmap (c); +insert into dd_singlecol_bitmap_idx select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_bitmap_idx values(null, null); +analyze dd_singlecol_bitmap_idx; +-- disjunction with bitmap index scans +select * from dd_singlecol_bitmap_idx where (a=1 or a=2) and b<2; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_bitmap_idx where (a=1 or a=2) and b=2 and c=2; + a | b | c +---+---+--- + 2 | 2 | 2 +(1 row) + +select * from dd_singlecol_bitmap_idx where (a=1 or a=2) and (b=2 or c=2); + a | b | c +---+---+--- + 2 | 2 | 2 +(1 row) + +select * from dd_singlecol_bitmap_idx where a<5 and b=1; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +-- conjunction with bitmap indexes +select * from dd_singlecol_bitmap_idx where a=1 and b=0; + a | b | c +---+---+--- +(0 rows) + +select * from dd_singlecol_bitmap_idx where a=1 and b<3; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_bitmap_idx where a=1 and b>=1 and c<2; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + + +select * from dd_singlecol_bitmap_idx where a=1 and b=3 and c=3; + a | b | c +---+---+--- +(0 rows) + +-- bitmap indexes on part tables +create table dd_singlecol_part_bitmap_idx(a int, b int, c int) +partition by range (b) +(start(1) end(100) every (20), default partition extra);; +create index sc_part_bitmap_idx_b on dd_singlecol_part_bitmap_idx using bitmap(b); +insert into dd_singlecol_part_bitmap_idx select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_part_bitmap_idx values(null, null); +analyze dd_singlecol_part_bitmap_idx; +-- bitmap indexes on partitioned tables +select * from dd_singlecol_part_bitmap_idx where a=1 and b=0; + a | b | c +---+---+--- +(0 rows) + +select * from dd_singlecol_part_bitmap_idx where a=1 and b<3; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_part_bitmap_idx where a=1 and b>=1 and c=3; + a | b | c +---+---+--- +(0 rows) + +-- bitmap bool op +select * from dd_singlecol_bitmap_idx +where a=1 and b=3 and c=3; + a | b | c +---+---+--- +(0 rows) + +-- multi column index +create table dd_multicol_idx(a int, b int, c int); +create index mc_idx_b on dd_multicol_idx(c); +insert into dd_multicol_idx +select g, g%5, g%5 from generate_series(1,100) g; +insert into dd_multicol_idx values(null, null); +analyze dd_multicol_idx; +select count(*) from dd_multicol_idx; + count +------- + 101 +(1 row) + +-- simple index predicates +select * from dd_singlecol_idx where a=1 and b=0; + a | b | c +---+---+--- +(0 rows) + +select * from dd_singlecol_idx where a=1 and b<3; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_idx where a<5 and b=1; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_idx where a=1 and b>=1 and c<2; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_idx2 where a=1; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_idx2 where a=1 and b>=1; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +-- projection +select 'one' from dd_singlecol_idx where a=1 and b=1; + ?column? +---------- + one +(1 row) + +select a+b from dd_singlecol_idx where a=1 and b=1; + ?column? +---------- + 2 +(1 row) + +-- group by +select a, count(*) from dd_singlecol_idx where a=1 and b=1 group by a; + a | count +---+------- + 1 | 1 +(1 row) + +-- multicol +select * from dd_multicol_idx where a=1 and b=1 and c<5; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_multicol_idx where (a=10 or a=11) and (b=1 or b=5) and c=1; + a | b | c +----+---+--- + 11 | 1 | 1 +(1 row) + +-- indexes on partitioned tables +create table dd_singlecol_part_idx(a int, b int, c int) +partition by range (b) +(start(1) end(100) every (20), default partition extra);; +create index sc_part_idx_b on dd_singlecol_part_idx(b); +insert into dd_singlecol_part_idx select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_part_idx values(null, null); +create table dd_singlecol_part_idx2(a int, b int, c int) +partition by range (b) +(start(1) end(100) every (20), default partition extra);; +create index sc_part_idx_a on dd_singlecol_part_idx2(a); +insert into dd_singlecol_part_idx2 select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_part_idx2 values(null, null); +analyze dd_singlecol_part_idx; +analyze dd_singlecol_part_idx2; +-- indexes on partitioned tables +select * from dd_singlecol_part_idx where a=1 and b>0; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_part_idx2 where a=1; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_part_idx2 where a=1 and b>=1; + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +create table dd_singlecol_2(a int, b int); +create table dd_singlecol_dropped(a int, b int, c int); +alter table dd_singlecol_dropped drop column a; +insert into dd_singlecol_2 +select g, g%10 from generate_series(1,100) g; +insert into dd_singlecol_dropped +select g, g%5 from generate_series(1,100) g; +-- aggregates +select count(*) from dd_singlecol_1; + count +------- + 101 +(1 row) + +select count(*) from dd_singlecol_2; + count +------- + 100 +(1 row) + +select count(*) from dd_singlecol_dropped; + count +------- + 100 +(1 row) + +-- simple predicates +select * from dd_singlecol_1 where a=1; + a | b +---+--- + 1 | 1 +(1 row) + +select * from dd_singlecol_2 where b=1; + a | b +----+--- + 1 | 1 + 11 | 1 + 21 | 1 + 31 | 1 + 41 | 1 + 51 | 1 + 61 | 1 + 71 | 1 + 81 | 1 + 91 | 1 +(10 rows) + +select * from dd_singlecol_dropped where b=1; + b | c +---+--- + 1 | 1 +(1 row) + +select * from dd_singlecol_1 where a = 1 and b=2; + a | b +---+--- +(0 rows) + +select * from dd_singlecol_1 where a = 1 and b<10; + a | b +---+--- + 1 | 1 +(1 row) + +select * from dd_singlecol_1 where a is null; + a | b +---+--- + | +(1 row) + +-- projections +select b from dd_singlecol_1 where a=1; + b +--- + 1 +(1 row) + + +select a+b from dd_singlecol_1 where a=1; + ?column? +---------- + 2 +(1 row) + +select 'one' from dd_singlecol_1 where a=1; + ?column? +---------- + one +(1 row) + +select a, 'one' from dd_singlecol_1 where a=1; + a | ?column? +---+---------- + 1 | one +(1 row) + +-- group by and sort +select a, count(*) from dd_singlecol_1 where a=1 group by a; + a | count +---+------- + 1 | 1 +(1 row) + +select a, count(*) from dd_singlecol_1 where a=1 group by a order by a; + a | count +---+------- + 1 | 1 +(1 row) + +-- inner joins +select * from dd_singlecol_1 t1, dd_singlecol_2 t2 where t1.a=t2.a and t1.a=1; + a | b | a | b +---+---+---+--- + 1 | 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_1 t1, dd_singlecol_2 t2 where t1.a=t2.b and t1.a=1; + a | b | a | b +---+---+----+--- + 1 | 1 | 1 | 1 + 1 | 1 | 11 | 1 + 1 | 1 | 21 | 1 + 1 | 1 | 31 | 1 + 1 | 1 | 41 | 1 + 1 | 1 | 51 | 1 + 1 | 1 | 61 | 1 + 1 | 1 | 71 | 1 + 1 | 1 | 81 | 1 + 1 | 1 | 91 | 1 +(10 rows) + +select * from dd_singlecol_1 t1, dd_singlecol_2 t2 where t1.b>t2.a and t1.a=1; + a | b | a | b +---+---+---+--- +(0 rows) + +-- outer joins +select * from dd_singlecol_1 t1 left outer join dd_singlecol_2 t2 on (t1.a=t2.a) where t1.a=1; + a | b | a | b +---+---+---+--- + 1 | 1 | 1 | 1 +(1 row) + +select * from dd_singlecol_1 t1 left outer join dd_singlecol_2 t2 on (t1.a=t2.b) where t1.a=1 and t2.b=1; + a | b | a | b +---+---+----+--- + 1 | 1 | 1 | 1 + 1 | 1 | 11 | 1 + 1 | 1 | 21 | 1 + 1 | 1 | 31 | 1 + 1 | 1 | 41 | 1 + 1 | 1 | 51 | 1 + 1 | 1 | 61 | 1 + 1 | 1 | 71 | 1 + 1 | 1 | 81 | 1 + 1 | 1 | 91 | 1 +(10 rows) + +select * from dd_singlecol_1 t1 left outer join dd_singlecol_2 t2 on (t1.b=t2.b) where t1.a=1; + a | b | a | b +---+---+----+--- + 1 | 1 | 91 | 1 + 1 | 1 | 81 | 1 + 1 | 1 | 71 | 1 + 1 | 1 | 61 | 1 + 1 | 1 | 51 | 1 + 1 | 1 | 41 | 1 + 1 | 1 | 31 | 1 + 1 | 1 | 21 | 1 + 1 | 1 | 11 | 1 + 1 | 1 | 1 | 1 +(10 rows) + +select * from dd_singlecol_2 t2 left outer join dd_singlecol_1 t1 on (t1.b=t2.b) where t1.a=1; + a | b | a | b +----+---+---+--- + 1 | 1 | 1 | 1 + 11 | 1 | 1 | 1 + 21 | 1 | 1 | 1 + 31 | 1 | 1 | 1 + 41 | 1 | 1 | 1 + 51 | 1 | 1 | 1 + 61 | 1 | 1 | 1 + 71 | 1 | 1 | 1 + 81 | 1 | 1 | 1 + 91 | 1 | 1 | 1 +(10 rows) + +-- subqueries +select * from dd_singlecol_1 t1 where a=1 and b < (select count(*) from dd_singlecol_2 t2 where t2.a=t1.a); + a | b +---+--- +(0 rows) + +select * from dd_singlecol_1 t1 where a=1 and b in (select count(*) from dd_singlecol_2 t2 where t2.a<=t1.a); + a | b +---+--- + 1 | 1 +(1 row) + +select t1.a, t1.b, (select sum(t2.a+t2.b) from dd_singlecol_2 t2 where t2.b=1) from dd_singlecol_1 t1 where t1.a=1; + a | b | sum +---+---+----- + 1 | 1 | 470 +(1 row) + +-- joins with function scans +select * from dd_singlecol_1 t1, generate_series(1,10) g where t1.a=g.g and t1.a=1 limit 10; + a | b | g +---+---+--- + 1 | 1 | 1 +(1 row) + +-- negative cases +-- unsupported predicates +select * from dd_singlecol_1 where a>1 and a<5; + a | b +---+--- + 2 | 2 + 3 | 3 + 4 | 4 +(3 rows) + +select * from dd_singlecol_1 where a=1 or b=5; + a | b +----+--- + 65 | 5 + 80 | 5 + 95 | 5 + 1 | 1 + 35 | 5 + 50 | 5 + 5 | 5 + 20 | 5 +(8 rows) + +-- group by and sort +select b, count(*) from dd_singlecol_1 where a=1 group by b; + b | count +---+------- + 1 | 1 +(1 row) + +select b, count(*) from dd_singlecol_1 where a=1 group by b order by b; + b | count +---+------- + 1 | 1 +(1 row) + +-- randomly distributed tables +create table dd_random(a int, b int); +insert into dd_random select g, g%15 from generate_series(1, 100) g; +-- non hash distributed tables +select * from dd_random where a=1; + a | b +---+--- + 1 | 1 +(1 row) + +drop table dd_singlecol_1; +drop table dd_ctas_1; +ERROR: table "dd_ctas_1" does not exist +drop table dd_ctas_2; +ERROR: table "dd_ctas_2" does not exist +drop table dd_part_singlecol; +drop table dd_singlecol_idx; +drop table dd_singlecol_idx2; +drop table dd_singlecol_bitmap_idx; +drop table dd_singlecol_part_bitmap_idx; +drop table dd_multicol_idx; +drop table dd_singlecol_part_idx; +drop table dd_singlecol_part_idx2; +drop table dd_singlecol_2; +drop table dd_singlecol_dropped; +drop table dd_random; diff --git a/src/test/singlenode_regress/expected/bfv_dd_multicolumn.out b/src/test/singlenode_regress/expected/bfv_dd_multicolumn.out new file mode 100644 index 00000000000..7cfdfe55f19 --- /dev/null +++ b/src/test/singlenode_regress/expected/bfv_dd_multicolumn.out @@ -0,0 +1,215 @@ +-- +-- Direct Dispatch Test when optimizer is on +-- +-- start_ignore +set optimizer_log=on; +set optimizer_force_multistage_agg=on; +-- end_ignore +set test_print_direct_dispatch_info=on; +set gp_autostats_mode = 'None'; +-- composite keys +create table dd_multicol_1(a int, b int); +create table dd_multicol_2(a int, b int); +insert into dd_multicol_1 select g, g%2 from generate_series(1, 100) g; +insert into dd_multicol_1 values(null, null); +insert into dd_multicol_1 values(1, null); +insert into dd_multicol_1 values(null, 1); +analyze dd_multicol_1; +insert into dd_multicol_2 select g, g%2 from generate_series(1, 100) g; +insert into dd_multicol_2 values(null, null); +insert into dd_multicol_2 values(1, null); +insert into dd_multicol_2 values(null, 1); +-- composite distr key +select * from dd_multicol_1 where a in (1,3) and b in (1,2); + a | b +---+--- + 1 | 1 + 3 | 1 +(2 rows) + +select * from dd_multicol_1 where a = 1 and b in (1,2); + a | b +---+--- + 1 | 1 +(1 row) + +select * from dd_multicol_1 where (a=1 and b=1) or (a=2 and b=2); + a | b +---+--- + 1 | 1 +(1 row) + +select * from dd_multicol_1 where (a=1 or a=3) and (b=1 or b=2); + a | b +---+--- + 1 | 1 + 3 | 1 +(2 rows) + +select * from dd_multicol_1 where a is null or a=1; + a | b +---+--- + 1 | 1 + 1 | + | + | 1 +(4 rows) + +select * from dd_multicol_1 where (a is null or a=1) and b=2; + a | b +---+--- +(0 rows) + +select * from dd_multicol_1 where (a,b) in ((1,2),(3,4)); + a | b +---+--- +(0 rows) + +-- composite distr key: projections +select b from dd_multicol_1 where (a=1 or a=3) and (b=1 or b=2); + b +--- + 1 + 1 +(2 rows) + +select count(*) from dd_multicol_1; + count +------- + 103 +(1 row) + +select count(*) from dd_multicol_2; + count +------- + 103 +(1 row) + +-- simple predicates +select * from dd_multicol_1 where a=1 and b=1; + a | b +---+--- + 1 | 1 +(1 row) + +select * from dd_multicol_1 where a=1 and b=2; + a | b +---+--- +(0 rows) + +select * from dd_multicol_1 where b=1 and a=2; + a | b +---+--- +(0 rows) + +select * from dd_multicol_1 where a is null and b=1; + a | b +---+--- + | 1 +(1 row) + +select * from dd_multicol_1 where a is null and b is null; + a | b +---+--- + | +(1 row) + +select * from dd_multicol_2 where a=1 and b=1; + a | b +---+--- + 1 | 1 +(1 row) + +select * from dd_multicol_2 where a=1 and b=2; + a | b +---+--- +(0 rows) + +select * from dd_multicol_2 where b=1 and a=2; + a | b +---+--- +(0 rows) + +select * from dd_multicol_2 where a is null and b=1; + a | b +---+--- + | 1 +(1 row) + +select * from dd_multicol_2 where a is null and b is null; + a | b +---+--- + | +(1 row) + +-- projections +select b from dd_multicol_1 where a=1 and b=1; + b +--- + 1 +(1 row) + + +select a+b from dd_multicol_1 where a=1 and b=1; + ?column? +---------- + 2 +(1 row) + +select 'one' from dd_multicol_1 where a=1 and b=1; + ?column? +---------- + one +(1 row) + +select a, 'one' from dd_multicol_1 where a=1 and b=1; + a | ?column? +---+---------- + 1 | one +(1 row) + +-- group by and sort +select a, count(*) from dd_multicol_1 where a=1 and b=1 group by a,b; + a | count +---+------- + 1 | 1 +(1 row) + +select a, count(*) from dd_multicol_1 where a=1 and b=1 group by a,b order by a,b; + a | count +---+------- + 1 | 1 +(1 row) + +-- incomplete specification +select * from dd_multicol_1 where a=1; + a | b +---+--- + 1 | 1 + 1 | +(2 rows) + +select * from dd_multicol_1 where a>80 and b=1; + a | b +----+--- + 83 | 1 + 93 | 1 + 97 | 1 + 81 | 1 + 87 | 1 + 91 | 1 + 95 | 1 + 85 | 1 + 89 | 1 + 99 | 1 +(10 rows) + +select * from dd_multicol_1 where a<=5 and b>0; + a | b +---+--- + 1 | 1 + 5 | 1 + 3 | 1 +(3 rows) + +reset optimizer_force_multistage_agg; diff --git a/src/test/singlenode_regress/expected/bfv_dd_types.out b/src/test/singlenode_regress/expected/bfv_dd_types.out new file mode 100644 index 00000000000..efc11476af0 --- /dev/null +++ b/src/test/singlenode_regress/expected/bfv_dd_types.out @@ -0,0 +1,289 @@ +-- +-- Direct Dispatch Test when optimizer is on +-- +-- start_ignore +set optimizer_log=on; +set optimizer_print_missing_stats = off; +-- end_ignore +set test_print_direct_dispatch_info=on; +set gp_autostats_mode = 'None'; +-- test direct dispatch for different data types +CREATE TABLE direct_test_type_int2 (id int2); +CREATE TABLE direct_test_type_int4 (id int4); +CREATE TABLE direct_test_type_int8 (id int8); +create table direct_test_type_real (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_smallint (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_boolean2 (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_double (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_date (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_numeric (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_bit (x bit); +create table direct_test_type_bpchar (x bpchar); +create table direct_test_type_bytea (x bytea); +create table direct_test_type_cidr (x cidr); +create table direct_test_type_inet (x inet); +create table direct_test_type_macaddr (x macaddr); +create table direct_test_type_varbit (x varbit); +INSERT INTO direct_test_type_int2 VALUES (1); +INSERT INTO direct_test_type_int4 VALUES (1); +INSERT INTO direct_test_type_int8 VALUES (1); +insert into direct_test_type_real values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_smallint values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_boolean2 values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_double values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_date values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_numeric values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_bit values('1'); +insert into direct_test_type_bpchar values('abs'); +insert into direct_test_type_bytea values('greenplum'); +insert into direct_test_type_cidr values('68.44.55.111'); +insert into direct_test_type_inet values('68.44.55.111'); +insert into direct_test_type_macaddr values('12:34:56:78:90:ab'); +insert into direct_test_type_varbit values('0101010'); +-- @author antovl +-- @created 2014-11-07 12:00:00 +-- @modified 2014-11-07 12:00:00 +-- @optimizer_mode on +-- @gpopt 1.510 +-- @product_version gpdb: [4.3.3-], [5.0-], hawq: [1.2.2.0-] +-- @tags bfv +-- @gucs optimizer_enable_constant_expression_evaluation=on; +select * from direct_test_type_real where real1 = 8::real; + real1 | smallint1 | boolean1 | int1 | double1 | date1 | numeric1 +-------+-----------+----------+------+---------+------------+---------- + 8 | 8 | t | 8 | 8 | 08-08-2008 | 8.8 +(1 row) + +select * from direct_test_type_smallint where smallint1 = 8::smallint; + real1 | smallint1 | boolean1 | int1 | double1 | date1 | numeric1 +-------+-----------+----------+------+---------+------------+---------- + 8 | 8 | t | 8 | 8 | 08-08-2008 | 8.8 +(1 row) + +select * from direct_test_type_double where double1 = 8; + real1 | smallint1 | boolean1 | int1 | double1 | date1 | numeric1 +-------+-----------+----------+------+---------+------------+---------- + 8 | 8 | t | 8 | 8 | 08-08-2008 | 8.8 +(1 row) + +select * from direct_test_type_date where date1 = '2008-08-08'; + real1 | smallint1 | boolean1 | int1 | double1 | date1 | numeric1 +-------+-----------+----------+------+---------+------------+---------- + 8 | 8 | t | 8 | 8 | 08-08-2008 | 8.8 +(1 row) + +select * from direct_test_type_numeric where numeric1 = 8.8; + real1 | smallint1 | boolean1 | int1 | double1 | date1 | numeric1 +-------+-----------+----------+------+---------+------------+---------- + 8 | 8 | t | 8 | 8 | 08-08-2008 | 8.8 +(1 row) + +select * from direct_test_type_bit where x = '1'; + x +--- + 1 +(1 row) + +select * from direct_test_type_bpchar where x = 'abs'; + x +----- + abs +(1 row) + +select * from direct_test_type_bytea where x = 'greenplum'; + x +---------------------- + \x677265656e706c756d +(1 row) + +-- TODO: this currently not directly dispatched (AGL-1246) +select * from direct_test_type_cidr where x = '68.44.55.111'; + x +----------------- + 68.44.55.111/32 +(1 row) + +select * from direct_test_type_inet where x = '68.44.55.111'; + x +-------------- + 68.44.55.111 +(1 row) + +select * from direct_test_type_macaddr where x = '12:34:56:78:90:ab'; + x +------------------- + 12:34:56:78:90:ab +(1 row) + +select * from direct_test_type_varbit where x = '0101010'; + x +--------- + 0101010 +(1 row) + +SELECT * FROM direct_test_type_int2 WHERE id = 1::int2; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int2 WHERE id = 1::int4; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int2 WHERE id = 1::int8; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int2 WHERE 1::int2 = id; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int2 WHERE 1::int4 = id; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int2 WHERE 1::int8 = id; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int4 WHERE id = 1::int2; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int4 WHERE id = 1::int4; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int4 WHERE id = 1::int8; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int4 WHERE 1::int2 = id; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int4 WHERE 1::int4 = id; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int4 WHERE 1::int8 = id; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int8 WHERE id = 1::int2; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int8 WHERE id = 1::int4; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int8 WHERE id = 1::int8; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int8 WHERE 1::int2 = id; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int8 WHERE 1::int4 = id; + id +---- + 1 +(1 row) + +SELECT * FROM direct_test_type_int8 WHERE 1::int8 = id; + id +---- + 1 +(1 row) + +-- overflow test +SELECT * FROM direct_test_type_int2 WHERE id = 32768::int4; + id +---- +(0 rows) + +SELECT * FROM direct_test_type_int2 WHERE id = -32769::int4; + id +---- +(0 rows) + +SELECT * FROM direct_test_type_int2 WHERE 32768::int4 = id; + id +---- +(0 rows) + +SELECT * FROM direct_test_type_int2 WHERE -32769::int4 = id; + id +---- +(0 rows) + +SELECT * FROM direct_test_type_int2 WHERE id = 2147483648::int8; + id +---- +(0 rows) + +SELECT * FROM direct_test_type_int2 WHERE id = -2147483649::int8; + id +---- +(0 rows) + +SELECT * FROM direct_test_type_int2 WHERE 2147483648::int8 = id; + id +---- +(0 rows) + +SELECT * FROM direct_test_type_int2 WHERE -2147483649::int8 = id; + id +---- +(0 rows) + +drop table direct_test_type_real; +drop table direct_test_type_smallint; +drop table direct_test_type_double; +drop table direct_test_type_date; +drop table direct_test_type_numeric; +drop table direct_test_type_int2; +drop table direct_test_type_int4; +drop table direct_test_type_int8; +drop table direct_test_type_bit; +drop table direct_test_type_bpchar; +drop table direct_test_type_bytea; +drop table direct_test_type_cidr; +drop table direct_test_type_inet; +drop table direct_test_type_macaddr; +drop table direct_test_type_varbit; +drop table direct_test_type_boolean2; +reset test_print_direct_dispatch_info; diff --git a/src/test/singlenode_regress/expected/bfv_index.out b/src/test/singlenode_regress/expected/bfv_index.out new file mode 100644 index 00000000000..0f5c560679a --- /dev/null +++ b/src/test/singlenode_regress/expected/bfv_index.out @@ -0,0 +1,697 @@ +-- tests index filter with outer refs +drop table if exists bfv_tab1; +NOTICE: table "bfv_tab1" does not exist, skipping +CREATE TABLE bfv_tab1 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); +create index bfv_tab1_idx1 on bfv_tab1 using btree(unique1); +-- GPDB_12_MERGE_FIXME: Non default collation +explain select * from bfv_tab1, (values(147, 'RFAAAA'), (931, 'VJAAAA')) as v (i, j) + WHERE bfv_tab1.unique1 = v.i and bfv_tab1.stringu1 = v.j; + QUERY PLAN +------------------------------------------------------------------------------------------------------------- + Hash Join (cost=0.06..28.16 rows=10 width=280) + Hash Cond: ((bfv_tab1.unique1 = "*VALUES*".column1) AND (bfv_tab1.stringu1 = ("*VALUES*".column2)::text)) + -> Seq Scan on bfv_tab1 (cost=0.00..22.00 rows=1200 width=244) + -> Hash (cost=0.03..0.03 rows=2 width=36) + -> Values Scan on "*VALUES*" (cost=0.00..0.03 rows=2 width=36) + Optimizer: Postgres query optimizer +(6 rows) + +set gp_enable_relsize_collection=on; +-- GPDB_12_MERGE_FIXME: Non default collation +explain select * from bfv_tab1, (values(147, 'RFAAAA'), (931, 'VJAAAA')) as v (i, j) + WHERE bfv_tab1.unique1 = v.i and bfv_tab1.stringu1 = v.j; + QUERY PLAN +------------------------------------------------------------------------------------------------------------- + Hash Join (cost=0.06..28.16 rows=10 width=280) + Hash Cond: ((bfv_tab1.unique1 = "*VALUES*".column1) AND (bfv_tab1.stringu1 = ("*VALUES*".column2)::text)) + -> Seq Scan on bfv_tab1 (cost=0.00..22.00 rows=1200 width=244) + -> Hash (cost=0.03..0.03 rows=2 width=36) + -> Values Scan on "*VALUES*" (cost=0.00..0.03 rows=2 width=36) + Optimizer: Postgres query optimizer +(6 rows) + +-- Test that we do not choose to perform an index scan if indisvalid=false. +create table bfv_tab1_with_invalid_index (like bfv_tab1 including indexes); +set allow_system_table_mods=on; +update pg_index set indisvalid=false where indrelid='bfv_tab1_with_invalid_index'::regclass; +reset allow_system_table_mods; +explain select * from bfv_tab1_with_invalid_index where unique1>42; + QUERY PLAN +-------------------------------------------------------------------------------- + Seq Scan on bfv_tab1_with_invalid_index (cost=0.00..25.00 rows=400 width=244) + Filter: (unique1 > 42) + Optimizer: Postgres query optimizer +(3 rows) + +-- Cannot currently upgrade table with invalid index +-- (see https://github.com/greenplum-db/gpdb/issues/10805). +drop table bfv_tab1_with_invalid_index; +reset gp_enable_relsize_collection; +--start_ignore +DROP TABLE IF EXISTS bfv_tab2_facttable1; +NOTICE: table "bfv_tab2_facttable1" does not exist, skipping +DROP TABLE IF EXISTS bfv_tab2_dimdate; +NOTICE: table "bfv_tab2_dimdate" does not exist, skipping +DROP TABLE IF EXISTS bfv_tab2_dimtabl1; +NOTICE: table "bfv_tab2_dimtabl1" does not exist, skipping +--end_ignore +-- Bug-fix verification for MPP-25537: PANIC when bitmap index used in ORCA select +CREATE TABLE bfv_tab2_facttable1 ( +col1 integer, +wk_id smallint, +id integer +) +with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=5) +partition by range (wk_id) ( +start (1::smallint) END (20::smallint) inclusive every (1), +default partition dflt +) +; +insert into bfv_tab2_facttable1 select col1, col1, col1 from (select generate_series(1,20) col1)a; +CREATE TABLE bfv_tab2_dimdate ( +wk_id smallint, +col2 date +) +; +insert into bfv_tab2_dimdate select col1, current_date - col1 from (select generate_series(1,20,2) col1)a; +CREATE TABLE bfv_tab2_dimtabl1 ( +id integer, +col2 integer +) +; +insert into bfv_tab2_dimtabl1 select col1, col1 from (select generate_series(1,20,3) col1)a; +CREATE INDEX idx_bfv_tab2_facttable1 on bfv_tab2_facttable1 (id); +--start_ignore +set optimizer_analyze_root_partition to on; +--end_ignore +ANALYZE bfv_tab2_facttable1; +ANALYZE bfv_tab2_dimdate; +ANALYZE bfv_tab2_dimtabl1; +SELECT count(*) +FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1 +WHERE ft.wk_id = dt.wk_id +AND ft.id = dt1.id; + count +------- + 4 +(1 row) + +explain SELECT count(*) +FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1 +WHERE ft.wk_id = dt.wk_id +AND ft.id = dt1.id; + QUERY PLAN +------------------------------------------------------------------------------------------------------------ + Aggregate (cost=22.89..22.90 rows=1 width=8) + -> Hash Join (cost=2.38..22.88 rows=3 width=0) + Hash Cond: (ft.wk_id = dt.wk_id) + -> Hash Join (cost=1.16..21.60 rows=7 width=2) + Hash Cond: (ft.id = dt1.id) + -> Append (cost=0.00..20.32 rows=21 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_2 ft_1 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_3 ft_2 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_4 ft_3 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_5 ft_4 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_6 ft_5 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_7 ft_6 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_8 ft_7 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_9 ft_8 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_10 ft_9 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_11 ft_10 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_12 ft_11 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_13 ft_12 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_14 ft_13 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_15 ft_14 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_16 ft_15 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_17 ft_16 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_18 ft_17 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_19 ft_18 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_20 ft_19 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_21 ft_20 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_dflt ft_21 (cost=0.00..0.01 rows=1 width=6) + -> Hash (cost=1.07..1.07 rows=7 width=4) + -> Seq Scan on bfv_tab2_dimtabl1 dt1 (cost=0.00..1.07 rows=7 width=4) + -> Hash (cost=1.10..1.10 rows=10 width=2) + -> Seq Scan on bfv_tab2_dimdate dt (cost=0.00..1.10 rows=10 width=2) + Optimizer: Postgres query optimizer +(32 rows) + +explain SELECT count(*) +FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1 +WHERE ft.wk_id = dt.wk_id +AND ft.id = dt1.id; + QUERY PLAN +------------------------------------------------------------------------------------------------------------ + Aggregate (cost=22.89..22.90 rows=1 width=8) + -> Hash Join (cost=2.38..22.88 rows=3 width=0) + Hash Cond: (ft.wk_id = dt.wk_id) + -> Hash Join (cost=1.16..21.60 rows=7 width=2) + Hash Cond: (ft.id = dt1.id) + -> Append (cost=0.00..20.32 rows=21 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_2 ft_1 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_3 ft_2 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_4 ft_3 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_5 ft_4 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_6 ft_5 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_7 ft_6 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_8 ft_7 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_9 ft_8 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_10 ft_9 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_11 ft_10 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_12 ft_11 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_13 ft_12 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_14 ft_13 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_15 ft_14 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_16 ft_15 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_17 ft_16 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_18 ft_17 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_19 ft_18 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_20 ft_19 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_21 ft_20 (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on bfv_tab2_facttable1_1_prt_dflt ft_21 (cost=0.00..0.01 rows=1 width=6) + -> Hash (cost=1.07..1.07 rows=7 width=4) + -> Seq Scan on bfv_tab2_dimtabl1 dt1 (cost=0.00..1.07 rows=7 width=4) + -> Hash (cost=1.10..1.10 rows=10 width=2) + -> Seq Scan on bfv_tab2_dimdate dt (cost=0.00..1.10 rows=10 width=2) + Optimizer: Postgres query optimizer +(32 rows) + +-- start_ignore +create language plpython3u; +-- end_ignore +create or replace function count_index_scans(explain_query text) returns int as +$$ +rv = plpy.execute(explain_query) +search_text = 'Index Scan' +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; +DROP TABLE bfv_tab1; +DROP TABLE bfv_tab2_facttable1; +DROP TABLE bfv_tab2_dimdate; +DROP TABLE bfv_tab2_dimtabl1; +-- pick index scan when query has a relabel on the index key: non partitioned tables +set enable_seqscan = off; +-- start_ignore +drop table if exists Tab23383; +NOTICE: table "tab23383" does not exist, skipping +-- end_ignore +create table Tab23383(a int, b varchar(20)); +insert into Tab23383 select g,g from generate_series(1,1000) g; +create index Tab23383_b on Tab23383(b); +-- start_ignore +select disable_xform('CXformGet2TableScan'); + disable_xform +--------------------------------- + CXformGet2TableScan is disabled +(1 row) + +-- end_ignore +select count_index_scans('explain select * from Tab23383 where b=''1'';'); + count_index_scans +------------------- + 1 +(1 row) + +select * from Tab23383 where b='1'; + a | b +---+--- + 1 | 1 +(1 row) + +select count_index_scans('explain select * from Tab23383 where ''1''=b;'); + count_index_scans +------------------- + 1 +(1 row) + +select * from Tab23383 where '1'=b; + a | b +---+--- + 1 | 1 +(1 row) + +select count_index_scans('explain select * from Tab23383 where ''2''> b order by a limit 10;'); + count_index_scans +------------------- + 1 +(1 row) + +select * from Tab23383 where '2'> b order by a limit 10; + a | b +----+---- + 1 | 1 + 10 | 10 + 11 | 11 + 12 | 12 + 13 | 13 + 14 | 14 + 15 | 15 + 16 | 16 + 17 | 17 + 18 | 18 +(10 rows) + +select count_index_scans('explain select * from Tab23383 where b between ''1'' and ''2'' order by a limit 10;'); + count_index_scans +------------------- + 1 +(1 row) + +select * from Tab23383 where b between '1' and '2' order by a limit 10; + a | b +----+---- + 1 | 1 + 2 | 2 + 10 | 10 + 11 | 11 + 12 | 12 + 13 | 13 + 14 | 14 + 15 | 15 + 16 | 16 + 17 | 17 +(10 rows) + +-- predicates on both index and non-index key +select count_index_scans('explain select * from Tab23383 where b=''1'' and a=''1'';'); + count_index_scans +------------------- + 1 +(1 row) + +select * from Tab23383 where b='1' and a='1'; + a | b +---+--- + 1 | 1 +(1 row) + +--negative tests: no index scan plan possible, fall back to planner +select count_index_scans('explain select * from Tab23383 where b::int=''1'';'); + count_index_scans +------------------- + 0 +(1 row) + +drop table Tab23383; +-- pick index scan when query has a relabel on the index key: partitioned tables +-- start_ignore +drop table if exists Tbl23383_partitioned; +NOTICE: table "tbl23383_partitioned" does not exist, skipping +-- end_ignore +create table Tbl23383_partitioned(a int, b varchar(20), c varchar(20), d varchar(20)) +partition by range(a) +(partition p1 start(1) end(500), +partition p2 start(500) end(1001)); +insert into Tbl23383_partitioned select g,g,g,g from generate_series(1,1000) g; +create index idx23383_b on Tbl23383_partitioned(b); +-- heterogenous indexes +create index idx23383_c on Tbl23383_partitioned_1_prt_p1(c); +create index idx23383_cd on Tbl23383_partitioned_1_prt_p2(c,d); +set optimizer_enable_dynamictablescan = off; +select count_index_scans('explain select * from Tbl23383_partitioned where b=''1'''); + count_index_scans +------------------- + 2 +(1 row) + +select * from Tbl23383_partitioned where b='1'; + a | b | c | d +---+---+---+--- + 1 | 1 | 1 | 1 +(1 row) + +select count_index_scans('explain select * from Tbl23383_partitioned where ''1''=b'); + count_index_scans +------------------- + 2 +(1 row) + +select * from Tbl23383_partitioned where '1'=b; + a | b | c | d +---+---+---+--- + 1 | 1 | 1 | 1 +(1 row) + +select count_index_scans('explain select * from Tbl23383_partitioned where ''2''> b order by a limit 10;'); + count_index_scans +------------------- + 2 +(1 row) + +select * from Tbl23383_partitioned where '2'> b order by a limit 10; + a | b | c | d +----+----+----+---- + 1 | 1 | 1 | 1 + 10 | 10 | 10 | 10 + 11 | 11 | 11 | 11 + 12 | 12 | 12 | 12 + 13 | 13 | 13 | 13 + 14 | 14 | 14 | 14 + 15 | 15 | 15 | 15 + 16 | 16 | 16 | 16 + 17 | 17 | 17 | 17 + 18 | 18 | 18 | 18 +(10 rows) + +select count_index_scans('explain select * from Tbl23383_partitioned where b between ''1'' and ''2'' order by a limit 10;'); + count_index_scans +------------------- + 2 +(1 row) + +select * from Tbl23383_partitioned where b between '1' and '2' order by a limit 10; + a | b | c | d +----+----+----+---- + 1 | 1 | 1 | 1 + 2 | 2 | 2 | 2 + 10 | 10 | 10 | 10 + 11 | 11 | 11 | 11 + 12 | 12 | 12 | 12 + 13 | 13 | 13 | 13 + 14 | 14 | 14 | 14 + 15 | 15 | 15 | 15 + 16 | 16 | 16 | 16 + 17 | 17 | 17 | 17 +(10 rows) + +-- predicates on both index and non-index key +select count_index_scans('explain select * from Tbl23383_partitioned where b=''1'' and a=''1'';'); + count_index_scans +------------------- + 1 +(1 row) + +select * from Tbl23383_partitioned where b='1' and a='1'; + a | b | c | d +---+---+---+--- + 1 | 1 | 1 | 1 +(1 row) + +--negative tests: no index scan plan possible, fall back to planner +select count_index_scans('explain select * from Tbl23383_partitioned where b::int=''1'';'); + count_index_scans +------------------- + 0 +(1 row) + +-- heterogenous indexes +select count_index_scans('explain select * from Tbl23383_partitioned where c=''1'';'); + count_index_scans +------------------- + 2 +(1 row) + +select * from Tbl23383_partitioned where c='1'; + a | b | c | d +---+---+---+--- + 1 | 1 | 1 | 1 +(1 row) + +-- start_ignore +drop table Tbl23383_partitioned; +-- end_ignore +reset enable_seqscan; +-- negative test: due to non compatible cast and CXformGet2TableScan disabled no index plan possible, fallback to planner +-- start_ignore +drop table if exists tbl_ab; +NOTICE: table "tbl_ab" does not exist, skipping +-- end_ignore +create table tbl_ab(a int, b int); +create index idx_ab_b on tbl_ab(b); +-- start_ignore +select disable_xform('CXformGet2TableScan'); + disable_xform +--------------------------------- + CXformGet2TableScan is disabled +(1 row) + +-- end_ignore +explain select * from tbl_ab where b::oid=1; + QUERY PLAN +-------------------------------------------------------- + Seq Scan on tbl_ab (cost=0.00..123.62 rows=9 width=8) + Filter: ((b)::oid = '1'::oid) + Optimizer: Postgres query optimizer +(3 rows) + +drop table tbl_ab; +drop function count_index_scans(text); +-- start_ignore +select enable_xform('CXformGet2TableScan'); + enable_xform +-------------------------------- + CXformGet2TableScan is enabled +(1 row) + +-- end_ignore +-- +-- Check that ORCA can use an index for joins on quals like: +-- +-- indexkey CMP expr +-- expr CMP indexkey +-- +-- where expr is a scalar expression free of index keys and may have outer +-- references. +-- +create table nestloop_x (i int, j int); +create table nestloop_y (i int, j int); +insert into nestloop_x select g, g from generate_series(1, 20) g; +insert into nestloop_y select g, g from generate_series(1, 7) g; +create index nestloop_y_idx on nestloop_y (j); +-- Coerce the Postgres planner to produce a similar plan. Nested loop joins +-- are not enabled by default. And to dissuade it from choosing a sequential +-- scan, bump up the cost. enable_seqscan=off won't help, because there is +-- no other way to scan table 'x', and once the planner chooses a seqscan for +-- one table, it will happily use a seqscan for other tables as well, despite +-- enable_seqscan=off. (On PostgreSQL, enable_seqscan works differently, and +-- just bumps up the cost of a seqscan, so it would work there.) +set seq_page_cost=10000000; +set enable_indexscan=on; +set enable_nestloop=on; +explain select * from nestloop_x as x, nestloop_y as y where x.i + x.j < y.j; + QUERY PLAN +----------------------------------------------------------------------------------------- + Nested Loop (cost=0.14..100001890.60 rows=21210 width=16) + -> Seq Scan on nestloop_x x (cost=0.00..100000090.90 rows=9090 width=8) + -> Index Scan using nestloop_y_idx on nestloop_y y (cost=0.14..0.17 rows=2 width=8) + Index Cond: (j > (x.i + x.j)) + Optimizer: Postgres query optimizer +(5 rows) + +select * from nestloop_x as x, nestloop_y as y where x.i + x.j < y.j; + i | j | i | j +---+---+---+--- + 1 | 1 | 3 | 3 + 1 | 1 | 4 | 4 + 1 | 1 | 5 | 5 + 1 | 1 | 6 | 6 + 1 | 1 | 7 | 7 + 2 | 2 | 5 | 5 + 2 | 2 | 6 | 6 + 2 | 2 | 7 | 7 + 3 | 3 | 7 | 7 +(9 rows) + +explain select * from nestloop_x as x, nestloop_y as y where y.j > x.i + x.j + 2; + QUERY PLAN +----------------------------------------------------------------------------------------- + Nested Loop (cost=0.14..100001913.33 rows=21210 width=16) + -> Seq Scan on nestloop_x x (cost=0.00..100000090.90 rows=9090 width=8) + -> Index Scan using nestloop_y_idx on nestloop_y y (cost=0.14..0.18 rows=2 width=8) + Index Cond: (j > ((x.i + x.j) + 2)) + Optimizer: Postgres query optimizer +(5 rows) + +select * from nestloop_x as x, nestloop_y as y where y.j > x.i + x.j + 2; + i | j | i | j +---+---+---+--- + 1 | 1 | 5 | 5 + 1 | 1 | 6 | 6 + 1 | 1 | 7 | 7 + 2 | 2 | 7 | 7 +(4 rows) + +drop table nestloop_x, nestloop_y; +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +DROP TABLE IF EXISTS bpchar_ops; +CREATE TABLE bpchar_ops(id INT8, v char(10)); +CREATE INDEX bpchar_ops_btree_idx ON bpchar_ops USING btree(v bpchar_pattern_ops); +INSERT INTO bpchar_ops VALUES (0, 'row'); +SELECT * FROM bpchar_ops WHERE v = 'row '::char(20); + id | v +----+------------ + 0 | row +(1 row) + +DROP TABLE bpchar_ops; +-- +-- Test index rechecks with AO and AOCS tables (and heaps as well, for good measure) +-- +create table shape_heap (c circle) with (appendonly=false); +create table shape_ao (c circle) with (appendonly=true, orientation=row); +create table shape_aocs (c circle) with (appendonly=true, orientation=column); +insert into shape_heap values ('<(0,0), 5>'); +insert into shape_ao values ('<(0,0), 5>'); +insert into shape_aocs values ('<(0,0), 5>'); +create index shape_heap_bb_idx on shape_heap using gist(c); +create index shape_ao_bb_idx on shape_ao using gist(c); +create index shape_aocs_bb_idx on shape_aocs using gist(c); +select c && '<(5,5), 1>'::circle, + c && '<(5,5), 2>'::circle, + c && '<(5,5), 3>'::circle +from shape_heap; + ?column? | ?column? | ?column? +----------+----------+---------- + f | f | t +(1 row) + +-- Test the same values with (bitmap) index scans +-- +-- The first two values don't overlap with the value in the tables, <(0,0), 5>, +-- but their bounding boxes do. In a GiST index scan that uses the bounding +-- boxes, these will fetch the row from the index, but filtered out by the +-- recheck using the actual overlap operator. The third entry is sanity check +-- that the index returns any rows. +set enable_seqscan=off; +set enable_indexscan=off; +set enable_bitmapscan=on; +-- Use EXPLAIN to verify that these use a bitmap index scan +explain select * from shape_heap where c && '<(5,5), 1>'::circle; + QUERY PLAN +-------------------------------------------------------------------------------- + Bitmap Heap Scan on shape_heap (cost=4.13..8.15 rows=1 width=24) + Recheck Cond: (c && '<(5,5),1>'::circle) + -> Bitmap Index Scan on shape_heap_bb_idx (cost=0.00..4.13 rows=1 width=0) + Index Cond: (c && '<(5,5),1>'::circle) + Optimizer: Postgres query optimizer +(5 rows) + +explain select * from shape_ao where c && '<(5,5), 1>'::circle; + QUERY PLAN +------------------------------------------------------------------------------ + Bitmap Heap Scan on shape_ao (cost=4.13..8.15 rows=1 width=24) + Recheck Cond: (c && '<(5,5),1>'::circle) + -> Bitmap Index Scan on shape_ao_bb_idx (cost=0.00..4.13 rows=1 width=0) + Index Cond: (c && '<(5,5),1>'::circle) + Optimizer: Postgres query optimizer +(5 rows) + +explain select * from shape_aocs where c && '<(5,5), 1>'::circle; + QUERY PLAN +-------------------------------------------------------------------------------- + Bitmap Heap Scan on shape_aocs (cost=4.13..8.15 rows=1 width=24) + Recheck Cond: (c && '<(5,5),1>'::circle) + -> Bitmap Index Scan on shape_aocs_bb_idx (cost=0.00..4.13 rows=1 width=0) + Index Cond: (c && '<(5,5),1>'::circle) + Optimizer: Postgres query optimizer +(5 rows) + +-- Test that they return correct results. +select * from shape_heap where c && '<(5,5), 1>'::circle; + c +--- +(0 rows) + +select * from shape_ao where c && '<(5,5), 1>'::circle; + c +--- +(0 rows) + +select * from shape_aocs where c && '<(5,5), 1>'::circle; + c +--- +(0 rows) + +select * from shape_heap where c && '<(5,5), 2>'::circle; + c +--- +(0 rows) + +select * from shape_ao where c && '<(5,5), 2>'::circle; + c +--- +(0 rows) + +select * from shape_aocs where c && '<(5,5), 2>'::circle; + c +--- +(0 rows) + +select * from shape_heap where c && '<(5,5), 3>'::circle; + c +----------- + <(0,0),5> +(1 row) + +select * from shape_ao where c && '<(5,5), 3>'::circle; + c +----------- + <(0,0),5> +(1 row) + +select * from shape_aocs where c && '<(5,5), 3>'::circle; + c +----------- + <(0,0),5> +(1 row) + +-- +-- Given a table with different column types +-- +CREATE TABLE table_with_reversed_index(a int, b bool, c text); +-- +-- And it has an index that is ordered differently than columns on the table. +-- +CREATE INDEX ON table_with_reversed_index(c, a); +INSERT INTO table_with_reversed_index VALUES (10, true, 'ab'); +-- +-- Then an index only scan should succeed. (i.e. varattno is set up correctly) +-- +SET enable_seqscan=off; +SET enable_bitmapscan=off; +SET optimizer_enable_tablescan=off; +SET optimizer_enable_indexscan=off; +SET optimizer_enable_indexonlyscan=on; +EXPLAIN SELECT c, a FROM table_with_reversed_index WHERE a > 5; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------ + Index Only Scan using table_with_reversed_index_c_a_idx on table_with_reversed_index (cost=10000000000.16..10000000102.65 rows=1677 width=36) + Index Cond: (a > 5) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT c, a FROM table_with_reversed_index WHERE a > 5; + c | a +----+---- + ab | 10 +(1 row) + +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET optimizer_enable_tablescan; +RESET optimizer_enable_indexscan; +RESET optimizer_enable_indexonlyscan; diff --git a/src/test/singlenode_regress/expected/bfv_olap.out b/src/test/singlenode_regress/expected/bfv_olap.out new file mode 100644 index 00000000000..30597ae0568 --- /dev/null +++ b/src/test/singlenode_regress/expected/bfv_olap.out @@ -0,0 +1,687 @@ +-- Tests for old bugs related to OLAP queries. +-- First create a schema to contain the test tables, and few common test +-- tables that are shared by several test queries. +create schema bfv_olap; +set search_path=bfv_olap; +create table customer +( + cn int not null, + cname text not null, + cloc text, + primary key (cn) +); +insert into customer values + ( 1, 'Macbeth', 'Inverness'), + ( 2, 'Duncan', 'Forres'), + ( 3, 'Lady Macbeth', 'Inverness'), + ( 4, 'Witches, Inc', 'Lonely Heath'); +create table vendor +( + vn int not null, + vname text not null, + vloc text, + primary key (vn) +); +insert into vendor values + ( 10, 'Witches, Inc', 'Lonely Heath'), + ( 20, 'Lady Macbeth', 'Inverness'), + ( 30, 'Duncan', 'Forres'), + ( 40, 'Macbeth', 'Inverness'), + ( 50, 'Macduff', 'Fife'); +create table sale +( + cn int not null, + vn int not null, + pn int not null, + dt date not null, + qty int not null, + prc float not null, + primary key (cn, vn, pn) +); +insert into sale values + ( 2, 40, 100, '1401-1-1', 1100, 2400), + ( 1, 10, 200, '1401-3-1', 1, 0), + ( 3, 40, 200, '1401-4-1', 1, 0), + ( 1, 20, 100, '1401-5-1', 1, 0), + ( 1, 30, 300, '1401-5-2', 1, 0), + ( 1, 50, 400, '1401-6-1', 1, 0), + ( 2, 50, 400, '1401-6-1', 1, 0), + ( 1, 30, 500, '1401-6-1', 12, 5), + ( 3, 30, 500, '1401-6-1', 12, 5), + ( 3, 30, 600, '1401-6-1', 12, 5), + ( 4, 40, 700, '1401-6-1', 1, 1), + ( 4, 40, 800, '1401-6-1', 1, 1); +-- +-- Test case errors out when we define aggregates without combine functions +-- and use it as an aggregate derived window function. +-- +-- SETUP +-- start_ignore +drop table if exists toy; +NOTICE: table "toy" does not exist, skipping +drop aggregate if exists mysum1(int4); +NOTICE: aggregate mysum1(int4) does not exist, skipping +drop aggregate if exists mysum2(int4); +NOTICE: aggregate mysum2(int4) does not exist, skipping +-- end_ignore +create table toy(id,val) as select i,i from generate_series(1,5) i; +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'id' as the Cloudberry Database 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. +create aggregate mysum1(int4) (sfunc = int4_sum, combinefunc=int8pl, stype=bigint); +create aggregate mysum2(int4) (sfunc = int4_sum, stype=bigint); +-- TEST +select id, val, sum(val) over (w), mysum1(val) over (w), mysum2(val) over (w) from toy window w as (order by id rows 2 preceding); + id | val | sum | mysum1 | mysum2 +----+-----+-----+--------+-------- + 1 | 1 | 1 | 1 | 1 + 2 | 2 | 3 | 3 | 3 + 3 | 3 | 6 | 6 | 6 + 4 | 4 | 9 | 9 | 9 + 5 | 5 | 12 | 12 | 12 +(5 rows) + +-- CLEANUP +-- start_ignore +drop aggregate if exists mysum1(int4); +drop aggregate if exists mysum2(int4); +drop table if exists toy; +-- end_ignore +-- +-- Test case errors out when we define aggregates without preliminary functions and use it as an aggregate derived window function. +-- +-- SETUP +-- start_ignore +drop type if exists ema_type cascade; +NOTICE: type "ema_type" does not exist, skipping +drop function if exists ema_adv(t ema_type, v float, x float) cascade; +ERROR: type "ema_type" does not exist +drop function if exists ema_fin(t ema_type) cascade; +ERROR: type "ema_type" does not exist +drop aggregate if exists ema(float, float); +NOTICE: aggregate ema(pg_catalog.float8,pg_catalog.float8) does not exist, skipping +drop table if exists ema_test cascade; +NOTICE: table "ema_test" does not exist, skipping +-- end_ignore +create type ema_type as (x float, e float); +create function ema_adv(t ema_type, v float, x float) + returns ema_type + as $$ + begin + if t.e is null then + t.e = v; + t.x = x; + else + if t.x != x then + raise exception 'ema smoothing x may not vary'; + end if; + t.e = t.e + (v - t.e) * t.x; + end if; + return t; + end; + $$ language plpgsql; +create function ema_fin(t ema_type) + returns float + as $$ + begin + return t.e; + end; + $$ language plpgsql; +create aggregate ema(float, float) ( + sfunc = ema_adv, + stype = ema_type, + finalfunc = ema_fin, + initcond = '(,)'); +create table ema_test (k int, v float ); +insert into ema_test select i, 4*(i::float/20) + 10.0*(1+cos(radians(i*5))) from generate_series(0,19) i(i); +-- TEST +select k, v, ema(v, 0.9) over (order by k) from ema_test order by k; + k | v | ema +----+--------------------+-------------------- + 0 | 20 | 20 + 1 | 20.161946980917456 | 20.14575228282571 + 2 | 20.24807753012208 | 20.237845005392444 + 3 | 20.259258262890683 | 20.257116937140857 + 4 | 20.196926207859086 | 20.20294528078726 + 5 | 20.0630778703665 | 20.077064611408574 + 6 | 19.86025403784439 | 19.881935095200806 + 7 | 19.591520442889916 | 19.620561908121005 + 8 | 19.260444431189782 | 19.296456178882906 + 9 | 18.871067811865476 | 18.913606648567217 + 10 | 18.427876096865393 | 18.476449152035578 + 11 | 17.93576436351046 | 17.989832842362972 + 12 | 17.4 | 17.458983284236297 + 13 | 16.826182617406996 | 16.889462684089928 + 14 | 16.22020143325669 | 16.287127558340014 + 15 | 15.588190451025207 | 15.658084161756689 + 16 | 14.936481776669304 | 15.008642015178042 + 17 | 14.271557427476582 | 14.345265886246727 + 18 | 13.6 | 13.674526588624673 + 19 | 12.928442572523416 | 13.003050974133542 +(20 rows) + +select k, v, ema(v, 0.9) over (order by k rows between unbounded preceding and current row) from ema_test order by k; + k | v | ema +----+--------------------+-------------------- + 0 | 20 | 20 + 1 | 20.161946980917456 | 20.14575228282571 + 2 | 20.24807753012208 | 20.237845005392444 + 3 | 20.259258262890683 | 20.257116937140857 + 4 | 20.196926207859086 | 20.20294528078726 + 5 | 20.0630778703665 | 20.077064611408574 + 6 | 19.86025403784439 | 19.881935095200806 + 7 | 19.591520442889916 | 19.620561908121005 + 8 | 19.260444431189782 | 19.296456178882906 + 9 | 18.871067811865476 | 18.913606648567217 + 10 | 18.427876096865393 | 18.476449152035578 + 11 | 17.93576436351046 | 17.989832842362972 + 12 | 17.4 | 17.458983284236297 + 13 | 16.826182617406996 | 16.889462684089928 + 14 | 16.22020143325669 | 16.287127558340014 + 15 | 15.588190451025207 | 15.658084161756689 + 16 | 14.936481776669304 | 15.008642015178042 + 17 | 14.271557427476582 | 14.345265886246727 + 18 | 13.6 | 13.674526588624673 + 19 | 12.928442572523416 | 13.003050974133542 +(20 rows) + +-- CLEANUP +-- start_ignore +drop table if exists ema_test cascade; +drop aggregate if exists ema(float, float); +drop function if exists ema_fin(t ema_type) cascade; +drop function if exists ema_adv(t ema_type, v float, x float) cascade; +drop type if exists ema_type cascade; +-- end_ignore +-- +-- Test with/without group by +-- +-- SETUP +-- start_ignore +DROP TABLE IF EXISTS r; +NOTICE: table "r" does not exist, skipping +-- end_ignore +CREATE TABLE r +( + a INT NOT NULL, + b INT, + c CHARACTER VARYING(200), + d NUMERIC(10,0), + e DATE +); +-- ALTER TABLE r SET DISTRIBUTED BY (b); +ALTER TABLE r ADD CONSTRAINT PKEY PRIMARY KEY (b); +--TEST +SELECT MAX(a) AS m FROM r GROUP BY b ORDER BY m; + m +--- +(0 rows) + +SELECT MAX(a) AS m FROM r GROUP BY a ORDER BY m; + m +--- +(0 rows) + +SELECT MAX(a) AS m FROM r GROUP BY b; + m +--- +(0 rows) + +-- ORDER BY clause includes some grouping column or not +SELECT MAX(a) AS m FROM R GROUP BY b ORDER BY m,b; + m +--- +(0 rows) + +SELECT MAX(a) AS m FROM R GROUP BY b,e ORDER BY m,b,e; + m +--- +(0 rows) + +SELECT MAX(a) AS m FROM R GROUP BY b,e ORDER BY m; + m +--- +(0 rows) + +-- ORDER BY 1 or more columns +SELECT MAX(a),d,e AS m FROM r GROUP BY b,d,e ORDER BY m,e,d; + max | d | m +-----+---+--- +(0 rows) + +SELECT MIN(a),d,e AS m FROM r GROUP BY b,e,d ORDER BY e,d; + min | d | m +-----+---+--- +(0 rows) + +SELECT MAX(a) AS m FROM r GROUP BY b,c,d,e ORDER BY e,d; + m +--- +(0 rows) + +SELECT MAX(a) AS m FROM r GROUP BY b,e ORDER BY e; + m +--- +(0 rows) + +SELECT MAX(e) AS m FROM r GROUP BY b ORDER BY m; + m +--- +(0 rows) + +-- CLEANUP +-- start_ignore +DROP TABLE IF EXISTS r; +-- end_ignore +-- +-- ORDER BY clause includes some grouping column or not +-- +-- SETUP +-- start_ignore +DROP TABLE IF EXISTS dm_calendar; +NOTICE: table "dm_calendar" does not exist, skipping +-- end_ignore +CREATE TABLE dm_calendar ( + calendar_id bigint NOT NULL, + date_name character varying(200), + date_name_cn character varying(200), + calendar_date date, + current_day numeric(10,0), + month_id numeric(10,0), + month_name character varying(200), + month_name_cn character varying(200), + month_name_short character varying(200), + month_name_short_cn character varying(200), + days_in_month numeric(10,0), + first_of_month numeric(10,0), + last_month_id numeric(10,0), + month_end numeric(10,0), + quarter_id numeric(10,0), + quarter_name character varying(200), + quarter_name_cn character varying(200), + quarter_name_short character varying(200), + quarter_name_short_cn character varying(200), + year_id numeric(10,0), + year_name character varying(200), + year_name_cn character varying(200), + description character varying(500), + create_date timestamp without time zone, + month_week_num character varying(100), + month_week_begin character varying(100), + month_week_end character varying(100), + half_year character varying(100), + weekend_flag character varying(100), + holidays_flag character varying(100), + workday_flag character varying(100), + month_number numeric(10,0) +); +ALTER TABLE ONLY dm_calendar ADD CONSTRAINT dm_calendar_pkey PRIMARY KEY (calendar_id); +--TEST +SELECT "year_id" as id , min("year_name") as a from (select "year_id" as "year_id" , min("year_name") as "year_name" from "dm_calendar" group by "year_id") "dm_calendar3" group by "year_id" order by a ASC ; + id | a +----+--- +(0 rows) + +-- CLEANUP +-- start_ignore +DROP TABLE IF EXISTS dm_calendar; +-- end_ignore +-- +-- Test with/without group by with primary key as dist key +-- +-- SETUP +-- start_ignore +drop table if exists t; +NOTICE: table "t" does not exist, skipping +-- end_ignore +create table t +( + a int NOT NULL, + b int, + c character varying(200), + d numeric(10,0), + e date +); +alter table t ADD CONSTRAINT pkey primary key (b); +-- TEST +SELECT MAX(a) AS m FROM t GROUP BY b ORDER BY m; + m +--- +(0 rows) + +-- CLEANUP +-- start_ignore +drop table if exists t; +-- end_ignore +-- +-- Passing through distribution matching type in default implementation +-- + +-- TEST +select cname, +rank() over (partition by sale.cn order by vn) +from sale, customer +where sale.cn = customer.cn +order by 1, 2; + cname | rank +--------------+------ + Duncan | 1 + Duncan | 2 + Lady Macbeth | 1 + Lady Macbeth | 1 + Lady Macbeth | 3 + Macbeth | 1 + Macbeth | 2 + Macbeth | 3 + Macbeth | 3 + Macbeth | 5 + Witches, Inc | 1 + Witches, Inc | 1 +(12 rows) + +-- +-- Optimizer query crashing for logical window with no window functions +-- +-- SETUP +create table mpp23240(a int, b int, c int, d int, e int, f int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +-- TEST +select a, b, + case 1 + when 10 then + sum(c) over(partition by a) + when 20 then + sum(d) over(partition by a) + else + 5 + end as sum1 +from (select * from mpp23240 where f > 10) x; + a | b | sum1 +---+---+------ +(0 rows) + +-- CLEANUP +-- start_ignore +drop table mpp23240; +-- end_ignore +-- +-- Test for the bug reported at https://github.com/greenplum-db/gpdb/issues/2236 +-- +create table test1 (x int, y int, z double precision); +insert into test1 select a, b, a*10 + b from generate_series(1, 5) a, generate_series(1, 5) b; +select sum(z) over (partition by x) as sumx, sum(z) over (partition by y) as sumy from test1; + sumx | sumy +------+------ + 65 | 155 + 65 | 160 + 65 | 165 + 65 | 170 + 65 | 175 + 115 | 155 + 115 | 160 + 115 | 165 + 115 | 170 + 115 | 175 + 165 | 155 + 165 | 160 + 165 | 165 + 165 | 170 + 165 | 175 + 215 | 155 + 215 | 160 + 215 | 165 + 215 | 170 + 215 | 175 + 265 | 155 + 265 | 160 + 265 | 165 + 265 | 170 + 265 | 175 +(25 rows) + +drop table test1; +-- +-- This failed at one point because of an over-zealous syntax check, with +-- "window functions not allowed in WHERE clause" error. +-- +select sum(g) from generate_series(1, 5) g +where g in ( + select rank() over (order by x) from generate_series(1,5) x +); + sum +----- + 15 +(1 row) + +-- +-- This caused a crash in ROLLUP planning at one point. +-- +SELECT sale.vn +FROM sale,vendor +WHERE sale.vn=vendor.vn +GROUP BY ROLLUP( (sale.dt,sale.cn),(sale.pn),(sale.vn)); + vn +---- + 40 + + + 20 + + + 30 + + + + 10 + 40 + + + 50 + + + 30 + + + 40 + + + + + + + 30 + + 50 + + 30 + 40 + +(34 rows) + +SELECT DISTINCT sale.vn +FROM sale,vendor +WHERE sale.vn=vendor.vn +GROUP BY ROLLUP( (sale.dt,sale.cn),(sale.pn),(sale.vn)); + vn +---- + 10 + 20 + 30 + 40 + 50 + +(6 rows) + +-- +-- Another ROLLUP query, that hit a bug in setting up the planner-generated +-- subquery's targetlist. (https://github.com/greenplum-db/gpdb/issues/6754) +-- +SELECT sale.vn, rank() over (partition by sale.vn) +FROM vendor, sale +WHERE sale.vn=vendor.vn +GROUP BY ROLLUP( sale.vn); + vn | rank +----+------ + | 1 + 10 | 1 + 20 | 1 + 30 | 1 + 40 | 1 + 50 | 1 +(6 rows) + +-- +-- Test window function with constant PARTITION BY +-- +CREATE TABLE testtab (a int4); +insert into testtab values (1), (2); +SELECT count(*) OVER (PARTITION BY 1) AS count FROM testtab; + count +------- + 2 + 2 +(2 rows) + +-- Another variant, where the PARTITION BY is not a literal, but the +-- planner can deduce that it's a constant through equivalence classes. +SELECT 1 +FROM ( + SELECT a, count(*) OVER (PARTITION BY a) FROM (VALUES (1,1)) AS foo(a) +) AS sup(c, d) +WHERE c = 87 ; + ?column? +---------- +(0 rows) + +-- +-- This used to crash, and/or produce incorrect results. The culprit was that a Hash Agg +-- was used, but the planner put a Gather Merge at the top, without a Sort, even though +-- a Hash Agg doesn't preserve the sort order. +-- +SELECT sale.qty +FROM sale +GROUP BY ROLLUP((qty)) order by 1; + qty +------ + 1 + 12 + 1100 + +(4 rows) + +-- +-- Test two-stage aggregate with grouping sets and a HAVING clause +-- +-- persuade planner to choose a two-stage plan. +set gp_motion_cost_per_row TO 1000; +select cn, sum(qty) from sale group by rollup(cn,vn) having sum(qty)=1; + cn | sum +----+----- + 1 | 1 + 1 | 1 + 1 | 1 + 2 | 1 + 3 | 1 +(5 rows) + +-- same, but the HAVING clause matches a rolled up row. +select cn, sum(qty) from sale group by rollup(cn,vn) having sum(qty)=1144; + cn | sum +----+------ + | 1144 +(1 row) + +-- +-- Test a query with window function over an aggregate, and a subquery. +-- +-- Github Issue https://github.com/greenplum-db/gpdb/issues/10143 +create table t1_github_issue_10143( + base_ym varchar(6), + code varchar(5), + name varchar(60) +); +create table t2_github_issue_10143( + base_ym varchar(6), + dong varchar(8), + code varchar(6), + salary numeric(18) +); +insert into t1_github_issue_10143 values ('a', 'acode', 'aname'); +insert into t2_github_issue_10143 values ('a', 'adong', 'acode', 1000); +insert into t2_github_issue_10143 values ('b', 'bdong', 'bcode', 1100); +analyze t1_github_issue_10143; +analyze t2_github_issue_10143; +set optimizer_trace_fallback = on; +explain select (select name from t1_github_issue_10143 where code = a.code limit 1) as dongnm +,sum(sum(a.salary)) over() +from t2_github_issue_10143 a +group by a.code; + QUERY PLAN +------------------------------------------------------------------------------------------ + WindowAgg (cost=1.03..3.12 rows=2 width=176) + -> GroupAggregate (cost=1.03..1.07 rows=2 width=38) + Group Key: a.code + -> Sort (cost=1.03..1.03 rows=2 width=11) + Sort Key: a.code + -> Seq Scan on t2_github_issue_10143 a (cost=0.00..1.02 rows=2 width=11) + SubPlan 1 + -> Limit (cost=0.00..1.01 rows=1 width=6) + -> Seq Scan on t1_github_issue_10143 (cost=0.00..1.01 rows=1 width=6) + Filter: ((code)::text = (a.code)::text) + Optimizer: Postgres query optimizer +(11 rows) + +select (select name from t1_github_issue_10143 where code = a.code limit 1) as dongnm +,sum(sum(a.salary)) over() +from t2_github_issue_10143 a +group by a.code; + dongnm | sum +--------+------ + aname | 2100 + | 2100 +(2 rows) + +select * from (select sum(a.salary) over(), count(*) + from t2_github_issue_10143 a + group by a.salary) T; + sum | count +------+------- + 2100 | 1 + 2100 | 1 +(2 rows) + +-- this query currently falls back, needs to be fixed +select (select rn from (select row_number() over () as rn, name + from t1_github_issue_10143 + where code = a.code + group by name) T + ) as dongnm +,sum(sum(a.salary)) over() +from t2_github_issue_10143 a +group by a.code; + dongnm | sum +--------+------ + 1 | 2100 + | 2100 +(2 rows) + +with cte as (select row_number() over (order by code) as rn1, code + from t2_github_issue_10143 + group by code) +select row_number() over (order by name) as rn2, name +from t1_github_issue_10143 +group by name +union all +select * from cte; + rn2 | name +-----+------- + 1 | aname + 1 | acode + 2 | bcode +(3 rows) + +reset optimizer_trace_fallback; +-- CLEANUP +-- start_ignore +drop schema bfv_olap cascade; +-- end_ignore diff --git a/src/test/singlenode_regress/expected/bfv_partition_plans.out b/src/test/singlenode_regress/expected/bfv_partition_plans.out new file mode 100644 index 00000000000..a9daf0dee9b --- /dev/null +++ b/src/test/singlenode_regress/expected/bfv_partition_plans.out @@ -0,0 +1,1107 @@ +-- start_matchsubs +-- m/((Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](.[0-9]+)? (?!0000)[0-9]{4}.*)+(['"])/ +-- s/((Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](.[0-9]+)? (?!0000)[0-9]{4}.*)+(['"])/xxx xx xx xx:xx:xx xxxx"/ +-- end_matchsubs +create schema bfv_partition_plans; +set search_path=bfv_partition_plans; +-- +-- Initial setup for all the partitioning test for this suite +-- +-- start_ignore +create language plpython3u; +-- end_ignore +create or replace function count_operator(query text, operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; +create or replace function find_operator(query text, operator_name text) returns text as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator_name +result = ['false'] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = ['true'] + break +return result +$$ +language plpython3u; +-- Test UPDATE that moves row from one partition to another. The partitioning +-- key is also the distribution key in this case. +create table mpp3061 (i int) partition by range(i) (start(1) end(5) every(1)); +insert into mpp3061 values(1); +update mpp3061 set i = 2 where i = 1; +select tableoid::regclass, * from mpp3061 where i = 2; + tableoid | i +-----------------+--- + mpp3061_1_prt_2 | 2 +(1 row) + +drop table mpp3061; +-- +-- Tests if it produces SIGSEGV from "select from partition_table group by rollup or cube function" +-- +-- SETUP +create table mpp7980 +( + month_id date, + bill_stmt_id character varying(30), + cust_type character varying(10), + subscription_status character varying(30), + voice_call_min numeric(15,2), + minute_per_call numeric(15,2), + subscription_id character varying(15) +) + PARTITION BY RANGE(month_id) + ( + start ('2009-02-01'::date) end ('2009-08-01'::date) exclusive EVERY (INTERVAL '1 month') + ); + +-- TEST +select count_operator('select cust_type, subscription_status,count(distinct subscription_id),sum(voice_call_min),sum(minute_per_call) from mpp7980 where month_id =E''2009-04-01'' group by rollup(1,2);','SIGSEGV'); + count_operator +---------------- + 0 +(1 row) + +insert into mpp7980 values('2009-04-01','xyz','zyz','1',1,1,'1'); +insert into mpp7980 values('2009-04-01','zxyz','zyz','2',2,1,'1'); +insert into mpp7980 values('2009-03-03','xyz','zyz','4',1,3,'1'); +select cust_type, subscription_status,count(distinct subscription_id),sum(voice_call_min),sum(minute_per_call) from mpp7980 where month_id ='2009-04-01' group by rollup(1,2); + cust_type | subscription_status | count | sum | sum +-----------+---------------------+-------+------+------ + | | 1 | 3.00 | 2.00 + zyz | | 1 | 3.00 | 2.00 + zyz | 1 | 1 | 1.00 | 1.00 + zyz | 2 | 1 | 2.00 | 1.00 +(4 rows) + +-- CLEANUP +drop table mpp7980; +-- ************ORCA ENABLED********** +-- +-- MPP-23195 +-- +-- SETUP +-- start_ignore +set optimizer_enable_bitmapscan=on; +set optimizer_enable_indexjoin=on; +drop table if exists mpp23195_t1; +NOTICE: table "mpp23195_t1" does not exist, skipping +drop table if exists mpp23195_t2; +NOTICE: table "mpp23195_t2" does not exist, skipping +-- end_ignore +create table mpp23195_t1 (i int) partition by range(i) (partition pt1 start(1) end(10), partition pt2 start(10) end(20)); +create index index_mpp23195_t1_i on mpp23195_t1(i); +create table mpp23195_t2(i int); +insert into mpp23195_t1 values (generate_series(1,19)); +insert into mpp23195_t2 values (1); +-- TEST +select find_operator('select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;', 'Dynamic Index Scan'); + find_operator +--------------- + ['false'] +(1 row) + +select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i; + i | i +---+--- +(0 rows) + +-- CLEANUP +-- start_ignore +drop table if exists mpp23195_t1; +drop table if exists mpp23195_t2; +set optimizer_enable_bitmapscan=off; +set optimizer_enable_indexjoin=off; +-- end_ignore +-- +-- Check we have Dynamic Index Scan operator and check we have Nest loop operator +-- +-- SETUP +-- start_ignore +drop table if exists mpp21834_t1; +NOTICE: table "mpp21834_t1" does not exist, skipping +drop table if exists mpp21834_t2; +NOTICE: table "mpp21834_t2" does not exist, skipping +-- end_ignore +create table mpp21834_t1 (i int, j int) partition by range(i) (partition pp1 start(1) end(10), partition pp2 start(10) end(20)); +create index index_1 on mpp21834_t1(i); +create index index_2 on mpp21834_t1(j); +create table mpp21834_t2(i int, j int); +-- TEST +set optimizer_enable_hashjoin = off; +select find_operator('analyze select * from mpp21834_t2,mpp21834_t1 where mpp21834_t2.i < mpp21834_t1.i;','Dynamic Index Scan'); + find_operator +--------------- + ['false'] +(1 row) + +select find_operator('analyze select * from mpp21834_t2,mpp21834_t1 where mpp21834_t2.i < mpp21834_t1.i;','Nested Loop'); + find_operator +--------------- + ['true'] +(1 row) + +-- CLEANUP +drop index index_2; +drop index index_1; +drop table if exists mpp21834_t2; +drop table if exists mpp21834_t1; +reset optimizer_enable_hashjoin; +-- +-- A rescanning of DTS with its own partition selector (under sequence node) +-- +-- SETUP +-- start_ignore +set optimizer_enable_broadcast_nestloop_outer_child=on; +drop table if exists mpp23288; +NOTICE: table "mpp23288" does not exist, skipping +-- end_ignore +create table mpp23288(a int, b int) + partition by range (a) + ( + PARTITION pfirst END(5) INCLUSIVE, + PARTITION pinter START(6) END (10) INCLUSIVE, + PARTITION plast START (11) + ); +insert into mpp23288(a) select generate_series(1,20); +analyze mpp23288; +-- TEST +select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and t2.a =10) order by t2.a, t1.a;','Dynamic Seq Scan'); + count_operator +---------------- + 0 +(1 row) + +select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and t2.a =10) order by t2.a, t1.a; + a | a +----+--- + 10 | 1 + 10 | 2 + 10 | 3 + 10 | 4 + 10 | 5 + 10 | 6 + 10 | 7 + 10 | 8 + 10 | 9 +(9 rows) + +select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and (t2.a = 10 or t2.a = 5 or t2.a = 12)) order by t2.a, t1.a;','Dynamic Seq Scan'); + count_operator +---------------- + 0 +(1 row) + +select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and (t2.a = 10 or t2.a = 5 or t2.a = 12)) order by t2.a, t1.a; + a | a +----+---- + 5 | 1 + 5 | 2 + 5 | 3 + 5 | 4 + 10 | 1 + 10 | 2 + 10 | 3 + 10 | 4 + 10 | 5 + 10 | 6 + 10 | 7 + 10 | 8 + 10 | 9 + 12 | 1 + 12 | 2 + 12 | 3 + 12 | 4 + 12 | 5 + 12 | 6 + 12 | 7 + 12 | 8 + 12 | 9 + 12 | 10 + 12 | 11 +(24 rows) + +select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on t1.a < t2.a and t2.a = 1 or t2.a < 10 order by t2.a, t1.a;','Dynamic Seq Scan'); + count_operator +---------------- + 0 +(1 row) + +select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on t1.a < t2.a and t2.a = 1 or t2.a < 10 order by t2.a, t1.a; + a | a +---+---- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 + 1 | 5 + 1 | 6 + 1 | 7 + 1 | 8 + 1 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 1 | 20 + 2 | 1 + 2 | 2 + 2 | 3 + 2 | 4 + 2 | 5 + 2 | 6 + 2 | 7 + 2 | 8 + 2 | 9 + 2 | 10 + 2 | 11 + 2 | 12 + 2 | 13 + 2 | 14 + 2 | 15 + 2 | 16 + 2 | 17 + 2 | 18 + 2 | 19 + 2 | 20 + 3 | 1 + 3 | 2 + 3 | 3 + 3 | 4 + 3 | 5 + 3 | 6 + 3 | 7 + 3 | 8 + 3 | 9 + 3 | 10 + 3 | 11 + 3 | 12 + 3 | 13 + 3 | 14 + 3 | 15 + 3 | 16 + 3 | 17 + 3 | 18 + 3 | 19 + 3 | 20 + 4 | 1 + 4 | 2 + 4 | 3 + 4 | 4 + 4 | 5 + 4 | 6 + 4 | 7 + 4 | 8 + 4 | 9 + 4 | 10 + 4 | 11 + 4 | 12 + 4 | 13 + 4 | 14 + 4 | 15 + 4 | 16 + 4 | 17 + 4 | 18 + 4 | 19 + 4 | 20 + 5 | 1 + 5 | 2 + 5 | 3 + 5 | 4 + 5 | 5 + 5 | 6 + 5 | 7 + 5 | 8 + 5 | 9 + 5 | 10 + 5 | 11 + 5 | 12 + 5 | 13 + 5 | 14 + 5 | 15 + 5 | 16 + 5 | 17 + 5 | 18 + 5 | 19 + 5 | 20 + 6 | 1 + 6 | 2 + 6 | 3 + 6 | 4 + 6 | 5 + 6 | 6 + 6 | 7 + 6 | 8 + 6 | 9 + 6 | 10 + 6 | 11 + 6 | 12 + 6 | 13 + 6 | 14 + 6 | 15 + 6 | 16 + 6 | 17 + 6 | 18 + 6 | 19 + 6 | 20 + 7 | 1 + 7 | 2 + 7 | 3 + 7 | 4 + 7 | 5 + 7 | 6 + 7 | 7 + 7 | 8 + 7 | 9 + 7 | 10 + 7 | 11 + 7 | 12 + 7 | 13 + 7 | 14 + 7 | 15 + 7 | 16 + 7 | 17 + 7 | 18 + 7 | 19 + 7 | 20 + 8 | 1 + 8 | 2 + 8 | 3 + 8 | 4 + 8 | 5 + 8 | 6 + 8 | 7 + 8 | 8 + 8 | 9 + 8 | 10 + 8 | 11 + 8 | 12 + 8 | 13 + 8 | 14 + 8 | 15 + 8 | 16 + 8 | 17 + 8 | 18 + 8 | 19 + 8 | 20 + 9 | 1 + 9 | 2 + 9 | 3 + 9 | 4 + 9 | 5 + 9 | 6 + 9 | 7 + 9 | 8 + 9 | 9 + 9 | 10 + 9 | 11 + 9 | 12 + 9 | 13 + 9 | 14 + 9 | 15 + 9 | 16 + 9 | 17 + 9 | 18 + 9 | 19 + 9 | 20 +(180 rows) + +-- CLEANUP +-- start_ignore +drop table if exists mpp23288; +set optimizer_enable_broadcast_nestloop_outer_child=off; +-- end_ignore +-- +-- No DPE (Dynamic Partition Elimination) on second child of a union under a join +-- +-- SETUP +-- start_ignore +drop table if exists t; +NOTICE: table "t" does not exist, skipping +drop table if exists p1; +NOTICE: table "p1" does not exist, skipping +drop table if exists p2; +NOTICE: table "p2" does not exist, skipping +drop table if exists p3; +NOTICE: table "p3" does not exist, skipping +drop table if exists p; +NOTICE: table "p" does not exist, skipping +-- end_ignore +create table p1 (a int, b int) partition by range(b) (start (1) end(100) every (20)); +create table p2 (a int, b int) partition by range(b) (start (1) end(100) every (20)); +create table p3 (a int, b int) partition by range(b) (start (1) end(100) every (20)); +create table p (a int, b int); +create table t(a int, b int); +insert into t select g, g*10 from generate_series(1,100) g; +insert into p1 select g, g%99 +1 from generate_series(1,10000) g; +insert into p2 select g, g%99 +1 from generate_series(1,10000) g; +insert into p3 select g, g%99 +1 from generate_series(1,10000) g; +insert into p select g, g%99 +1 from generate_series(1,10000) g; +analyze t; +analyze p1; +analyze p2; +analyze p3; +analyze p; +-- TEST +-- SINGLE_NODE_FIXME: disable partition selector temporarily. +-- start_ignore +select count_operator('select * from (select * from p1 union all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 2 +(1 row) + +-- end_ignore +select count_operator('select * from (select * from p1 union select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select * from (select * from p1 except all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select * from (select * from p1 except select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select * from (select * from p1 intersect all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select * from (select * from p1 union select * from p2 union all select * from p3) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select * from (select * from p1 union select * from p2 union all select * from p) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select * from (select * from p1 union select * from p union all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select * from (select * from p1 union select * from p2 intersect all select * from p3) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select count_operator('select * from (select * from p1 union select * from p intersect all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +-- CLEANUP +-- start_ignore +drop table t; +drop table p1; +drop table p2; +drop table p3; +drop table p; +-- end_ignore +-- +-- Gracefully handle NULL partition set from BitmapTableScan, DynamicTableScan and DynamicIndexScan +-- +-- SETUP +-- start_ignore +drop table if exists dts; +NOTICE: table "dts" does not exist, skipping +drop table if exists dis; +NOTICE: table "dis" does not exist, skipping +drop table if exists dbs; +NOTICE: table "dbs" does not exist, skipping +-- end_ignore +create table dts(c1 int, c2 int) partition by range(c2) (start(1) end(11) every(1)); +create table dis(c1 int, c2 int, c3 int) partition by range(c2) (start(1) end(11) every(1)); +create index dis_index on dis(c3); +CREATE TABLE dbs(c1 int, c2 int, c3 int) partition by range(c2) (start(1) end(11) every(1)); +create index dbs_index on dbs using bitmap(c3); +-- TEST +select find_operator('(select * from dts where c2 = 1) union (select * from dts where c2 = 2) union (select * from dts where c2 = 3) union (select * from dts where c2 = 4) union (select * from dts where c2 = 5) union (select * from dts where c2 = 6) union (select * from dts where c2 = 7) union (select * from dts where c2 = 8) union (select * from dts where c2 = 9) union (select * from dts where c2 = 10);', 'Dynamic Seq Scan'); + find_operator +--------------- + ['false'] +(1 row) + +(select * from dts where c2 = 1) union +(select * from dts where c2 = 2) union +(select * from dts where c2 = 3) union +(select * from dts where c2 = 4) union +(select * from dts where c2 = 5) union +(select * from dts where c2 = 6) union +(select * from dts where c2 = 7) union +(select * from dts where c2 = 8) union +(select * from dts where c2 = 9) union +(select * from dts where c2 = 10); + c1 | c2 +----+---- +(0 rows) + +set optimizer_enable_dynamictablescan = off; +select find_operator('(select * from dis where c3 = 1) union (select * from dis where c3 = 2) union (select * from dis where c3 = 3) union (select * from dis where c3 = 4) union (select * from dis where c3 = 5) union (select * from dis where c3 = 6) union (select * from dis where c3 = 7) union (select * from dis where c3 = 8) union (select * from dis where c3 = 9) union (select * from dis where c3 = 10);', 'Dynamic Index Scan'); + find_operator +--------------- + ['false'] +(1 row) + +(select * from dis where c3 = 1) union +(select * from dis where c3 = 2) union +(select * from dis where c3 = 3) union +(select * from dis where c3 = 4) union +(select * from dis where c3 = 5) union +(select * from dis where c3 = 6) union +(select * from dis where c3 = 7) union +(select * from dis where c3 = 8) union +(select * from dis where c3 = 9) union +(select * from dis where c3 = 10); + c1 | c2 | c3 +----+----+---- +(0 rows) + +select find_operator('select * from dbs where c2= 15 and c3 = 5;', 'Bitmap Heap Scan'); + find_operator +--------------- + ['false'] +(1 row) + +select * from dbs where c2= 15 and c3 = 5; + c1 | c2 | c3 +----+----+---- +(0 rows) + +-- CLEANUP +drop index dbs_index; +drop table if exists dbs; +drop index dis_index; +drop table if exists dis; +drop table if exists dts; +reset optimizer_enable_dynamictablescan; +-- +-- Partition elimination for heterogenous DynamicIndexScans +-- +-- SETUP +-- start_ignore +drop table if exists pp; +NOTICE: table "pp" does not exist, skipping +drop index if exists pp_1_prt_1_idx; +NOTICE: index "pp_1_prt_1_idx" does not exist, skipping +drop index if exists pp_rest_1_idx; +NOTICE: index "pp_rest_1_idx" does not exist, skipping +drop index if exists pp_rest_2_idx; +NOTICE: index "pp_rest_2_idx" does not exist, skipping +set optimizer_segments=2; +set optimizer_partition_selection_log=on; +-- end_ignore +create table pp(a int, b int, c int) partition by range(b) (start(1) end(15) every(5)); +insert into pp values (1,1,2),(2,6,2), (3,11,2); +-- Heterogeneous Index on the partition table +create index pp_1_prt_1_idx on pp_1_prt_1(c); +-- Create other indexes so that we can automate the repro for MPP-21069 by disabling tablescan +create index pp_rest_1_idx on pp_1_prt_2(c,a); +create index pp_rest_2_idx on pp_1_prt_3(c,a); +-- TEST +set optimizer_enable_dynamictablescan = off; +select * from pp where b=2 and c=2; + a | b | c +---+---+--- +(0 rows) + +select count_operator('select * from pp where b=2 and c=2;','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +-- CLEANUP +-- start_ignore +drop index if exists pp_rest_2_idx; +drop index if exists pp_rest_1_idx; +drop index if exists pp_1_prt_1_idx; +drop table if exists pp; +reset optimizer_enable_dynamictablescan; +reset optimizer_segments; +set optimizer_partition_selection_log=off; +-- end_ignore +-- +-- Partition elimination with implicit CAST on the partitioning key +-- +-- SETUP +-- start_ignore +set optimizer_segments=2; +set optimizer_partition_selection_log=on; +DROP TABLE IF EXISTS ds_4; +NOTICE: table "ds_4" does not exist, skipping +-- end_ignore +CREATE TABLE ds_4 +( + month_id character varying(6), + cust_group_acc numeric(10), + mobile_no character varying(10) +) +PARTITION BY LIST(month_id) + ( + PARTITION p200800 VALUES('200800'), + PARTITION p200801 VALUES('200801'), + PARTITION p200802 VALUES('200802'), + PARTITION p200803 VALUES('200803') +); +-- TEST +select * from ds_4 where month_id = '200800'; + month_id | cust_group_acc | mobile_no +----------+----------------+----------- +(0 rows) + +select count_operator('select * from ds_4 where month_id = E''200800'';','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select * from ds_4 where month_id > '200800'; + month_id | cust_group_acc | mobile_no +----------+----------------+----------- +(0 rows) + +select count_operator('select * from ds_4 where month_id > E''200800'';','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select * from ds_4 where month_id <= '200800'; + month_id | cust_group_acc | mobile_no +----------+----------------+----------- +(0 rows) + +select count_operator('select * from ds_4 where month_id <= E''200800'';','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +select * from ds_4 a1,ds_4 a2 where a1.month_id = a2.month_id and a1.month_id > '200800'; + month_id | cust_group_acc | mobile_no | month_id | cust_group_acc | mobile_no +----------+----------------+-----------+----------+----------------+----------- +(0 rows) + +-- SINGLE_NODE_FIXME: disable partition selector temporarily. +-- start_ignore +select count_operator('select * from ds_4 a1,ds_4 a2 where a1.month_id = a2.month_id and a1.month_id > E''200800'';','Partition Selector'); + count_operator +---------------- + 0 +(1 row) + +-- end_ignore +-- CLEANUP +-- start_ignore +DROP TABLE IF EXISTS ds_4; +set optimizer_partition_selection_log=off; +reset optimizer_segments; +-- end_ignore +-- +-- Test a hash agg that has a Sequence + Partition Selector below it. +-- +-- SETUP +-- start_ignore +DROP TABLE IF EXISTS bar; +-- end_ignore +CREATE TABLE bar (b int, c int) +PARTITION BY RANGE (b) +( + START (0) END (10), + START (10) END (20) +); +INSERT INTO bar SELECT g % 20, g % 20 from generate_series(1, 1000) g; +ANALYZE bar; +SELECT b FROM bar GROUP BY b; + b +---- + 7 + 4 + 19 + 3 + 5 + 18 + 6 + 11 + 9 + 8 + 12 + 10 + 17 + 1 + 0 + 2 + 16 + 15 + 14 + 13 +(20 rows) + +EXPLAIN SELECT b FROM bar GROUP BY b; + QUERY PLAN +------------------------------------------------------------------------------- + HashAggregate (cost=19.50..19.70 rows=20 width=4) + Group Key: bar.b + -> Append (cost=0.00..17.00 rows=1000 width=4) + -> Seq Scan on bar_1_prt_1 bar_1 (cost=0.00..6.00 rows=500 width=4) + -> Seq Scan on bar_1_prt_2 bar_2 (cost=0.00..6.00 rows=500 width=4) + Optimizer: Postgres query optimizer +(6 rows) + +-- CLEANUP +DROP TABLE IF EXISTS foo; +DROP TABLE IF EXISTS bar; +-- Test EXPLAIN ANALYZE on a partitioned table. There used to be a bug, where +-- you got an internal error with this, because the EXPLAIN ANALYZE sends the +-- stats from QEs to the QD at the end of query, but because the subnodes are +-- terminated earlier, their stats were already gone. +create table mpp8031 (oid integer, +odate timestamp without time zone, +cid integer) +PARTITION BY RANGE(odate) +( +PARTITION foo START ('2005-05-01 00:00:00'::timestamp +without time zone) END ('2005-07-01 00:00:00'::timestamp +without time zone) EVERY ('2 mons'::interval), +START ('2005-07-01 00:00:00'::timestamp without time zone) +END ('2006-01-01 00:00:00'::timestamp without time zone) +EVERY ('2 mons'::interval) +); +explain analyze select a.* from mpp8031 a, mpp8031 b where a.oid = b.oid; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------- + Hash Join (cost=858.40..120982.98 rows=885658 width=16) (actual time=0.019..0.022 rows=0 loops=1) + Hash Cond: (a.oid = b.oid) + -> Append (cost=0.00..486.40 rows=29760 width=16) (actual time=0.018..0.018 rows=0 loops=1) + -> Seq Scan on mpp8031_1_prt_foo_1 a_1 (cost=0.00..84.40 rows=7440 width=16) (actual time=0.008..0.008 rows=0 loops=1) + -> Seq Scan on mpp8031_1_prt_2 a_2 (cost=0.00..84.40 rows=7440 width=16) (actual time=0.003..0.003 rows=0 loops=1) + -> Seq Scan on mpp8031_1_prt_3 a_3 (cost=0.00..84.40 rows=7440 width=16) (actual time=0.003..0.003 rows=0 loops=1) + -> Seq Scan on mpp8031_1_prt_4 a_4 (cost=0.00..84.40 rows=7440 width=16) (actual time=0.002..0.002 rows=0 loops=1) + -> Hash (cost=486.40..486.40 rows=29760 width=4) (never executed) + -> Append (cost=0.00..486.40 rows=29760 width=4) (never executed) + -> Seq Scan on mpp8031_1_prt_foo_1 b_1 (cost=0.00..84.40 rows=7440 width=4) (never executed) + -> Seq Scan on mpp8031_1_prt_2 b_2 (cost=0.00..84.40 rows=7440 width=4) (never executed) + -> Seq Scan on mpp8031_1_prt_3 b_3 (cost=0.00..84.40 rows=7440 width=4) (never executed) + -> Seq Scan on mpp8031_1_prt_4 b_4 (cost=0.00..84.40 rows=7440 width=4) (never executed) + Planning Time: 1.433 ms + (slice0) Executor memory: 124K bytes. + Memory used: 128000kB + Optimizer: Postgres query optimizer + Execution Time: 0.128 ms +(18 rows) + +drop table mpp8031; +-- Partitioned tables with default partitions and indexes on all parts, +-- queries on them with a predicate on index column must not consider the scan +-- as partial and should not fallback. +CREATE TABLE part_tbl +( + time_client_key numeric(16,0) NOT NULL, + ngin_service_key numeric NOT NULL, + profile_key numeric NOT NULL +) +PARTITION BY RANGE(time_client_key) +SUBPARTITION BY LIST (ngin_service_key) +SUBPARTITION TEMPLATE +( + SUBPARTITION Package5 VALUES (479534741), + DEFAULT SUBPARTITION other_services +) +( + PARTITION p20151110 START (2015111000::numeric) +END (2015111100::numeric) WITH (appendonly=false) +); +INSERT INTO part_tbl VALUES (2015111000, 479534741, 99999999); +INSERT INTO part_tbl VALUES (2015111000, 479534742, 99999999); +CREATE INDEX part_tbl_idx +ON part_tbl(profile_key); +-- start_ignore +analyze part_tbl; +-- end_ignore +EXPLAIN SELECT * FROM part_tbl WHERE profile_key = 99999999; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------- + Append (cost=0.00..2.03 rows=2 width=25) + -> Seq Scan on part_tbl_1_prt_p20151110_2_prt_package5 part_tbl_1 (cost=0.00..1.01 rows=1 width=25) + Filter: (profile_key = '99999999'::numeric) + -> Seq Scan on part_tbl_1_prt_p20151110_2_prt_other_services part_tbl_2 (cost=0.00..1.01 rows=1 width=25) + Filter: (profile_key = '99999999'::numeric) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT * FROM part_tbl WHERE profile_key = 99999999; + time_client_key | ngin_service_key | profile_key +-----------------+------------------+------------- + 2015111000 | 479534741 | 99999999 + 2015111000 | 479534742 | 99999999 +(2 rows) + +DROP TABLE part_tbl; +-- +-- Test partition elimination, MPP-7891 +-- +-- cleanup +-- start_ignore +drop table if exists r_part; +NOTICE: table "r_part" does not exist, skipping +drop table if exists r_co; +NOTICE: table "r_co" does not exist, skipping +deallocate f1; +ERROR: prepared statement "f1" does not exist +deallocate f2; +ERROR: prepared statement "f2" does not exist +deallocate f3; +ERROR: prepared statement "f3" does not exist +-- end_ignore +create table r_part(a int, b int) partition by range(a) (start (1) end(10) every(1)); +create table r_co(a int, b int) with (orientation=column, appendonly=true) partition by range(a) (start (1) end(10) every(1)) ; +insert into r_part values (1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8); +-- following tests rely on the data distribution, verify them +select gp_segment_id, * from r_part order by a,b; + gp_segment_id | a | b +---------------+---+--- + -1 | 1 | 1 + -1 | 2 | 2 + -1 | 3 | 3 + -1 | 4 | 4 + -1 | 5 | 5 + -1 | 6 | 6 + -1 | 7 | 7 + -1 | 8 | 8 +(8 rows) + +analyze r_part; +explain select * from r_part r1, r_part r2 where r1.a=1; -- should eliminate partitions in the r1 copy of r_part + QUERY PLAN +------------------------------------------------------------------------------- + Nested Loop (cost=10000000000.00..10000000009.24 rows=9 width=16) + -> Seq Scan on r_part_1_prt_1 r1 (cost=0.00..1.01 rows=1 width=8) + Filter: (a = 1) + -> Append (cost=0.00..8.13 rows=9 width=8) + -> Seq Scan on r_part_1_prt_1 r2_1 (cost=0.00..1.01 rows=1 width=8) + -> Seq Scan on r_part_1_prt_2 r2_2 (cost=0.00..1.01 rows=1 width=8) + -> Seq Scan on r_part_1_prt_3 r2_3 (cost=0.00..1.01 rows=1 width=8) + -> Seq Scan on r_part_1_prt_4 r2_4 (cost=0.00..1.01 rows=1 width=8) + -> Seq Scan on r_part_1_prt_5 r2_5 (cost=0.00..1.01 rows=1 width=8) + -> Seq Scan on r_part_1_prt_6 r2_6 (cost=0.00..1.01 rows=1 width=8) + -> Seq Scan on r_part_1_prt_7 r2_7 (cost=0.00..1.01 rows=1 width=8) + -> Seq Scan on r_part_1_prt_8 r2_8 (cost=0.00..1.01 rows=1 width=8) + -> Seq Scan on r_part_1_prt_9 r2_9 (cost=0.00..0.01 rows=1 width=8) + Optimizer: Postgres query optimizer +(14 rows) + +-- the numbers in the filter should be both on segment 0 +explain select * from r_part where a in (7,8); -- should eliminate partitions + QUERY PLAN +----------------------------------------------------------------------------- + Append (cost=0.00..2.03 rows=2 width=8) + -> Seq Scan on r_part_1_prt_7 r_part_1 (cost=0.00..1.01 rows=1 width=8) + Filter: (a = ANY ('{7,8}'::integer[])) + -> Seq Scan on r_part_1_prt_8 r_part_2 (cost=0.00..1.01 rows=1 width=8) + Filter: (a = ANY ('{7,8}'::integer[])) + Optimizer: Postgres query optimizer +(6 rows) + +-- Test partition elimination in prepared statements +prepare f1(int) as select * from r_part where a = 1 order by a,b; +prepare f2(int) as select * from r_part where a = $1 order by a,b; +execute f1(1); + a | b +---+--- + 1 | 1 +(1 row) + +execute f2(1); + a | b +---+--- + 1 | 1 +(1 row) + +execute f2(2); + a | b +---+--- + 2 | 2 +(1 row) + +explain select * from r_part where a = 1 order by a,b; -- should eliminate partitions + QUERY PLAN +--------------------------------------------------------------------------- + Sort (cost=1.02..1.03 rows=1 width=8) + Sort Key: r_part.b + -> Seq Scan on r_part_1_prt_1 r_part (cost=0.00..1.01 rows=1 width=8) + Filter: (a = 1) + Optimizer: Postgres query optimizer +(5 rows) + +--force_explain +explain execute f1(1); -- should eliminate partitions + QUERY PLAN +--------------------------------------------------------------------------- + Sort (cost=1.02..1.03 rows=1 width=8) + Sort Key: r_part.b + -> Seq Scan on r_part_1_prt_1 r_part (cost=0.00..1.01 rows=1 width=8) + Filter: (a = 1) + Optimizer: Postgres query optimizer +(5 rows) + +--force_explain +explain execute f2(2); -- should eliminate partitions + QUERY PLAN +--------------------------------------------------------------------------- + Sort (cost=1.02..1.03 rows=1 width=8) + Sort Key: r_part.b + -> Seq Scan on r_part_1_prt_2 r_part (cost=0.00..1.01 rows=1 width=8) + Filter: (a = 2) + Optimizer: Postgres query optimizer +(5 rows) + +-- Test partition elimination on CO tables +insert into r_co values (1,1), (2,2), (3,3); +analyze r_co; +explain select * from r_co where a=2; -- should eliminate partitions + QUERY PLAN +----------------------------------------------------------------- + Seq Scan on r_co_1_prt_2 r_co (cost=0.00..1.01 rows=1 width=8) + Filter: (a = 2) + Optimizer: Postgres query optimizer +(3 rows) + +-- test partition elimination in prepared statements on CO tables +prepare f3(int) as select * from r_co where a = $1 order by a,b; +--force_explain +explain execute f3(2); -- should eliminate partitions + QUERY PLAN +----------------------------------------------------------------------- + Sort (cost=1.02..1.03 rows=1 width=8) + Sort Key: r_co.b + -> Seq Scan on r_co_1_prt_2 r_co (cost=0.00..1.01 rows=1 width=8) + Filter: (a = 2) + Optimizer: Postgres query optimizer +(5 rows) + +-- start_ignore +drop table r_part; +drop table r_co; +deallocate f1; +deallocate f2; +deallocate f3; +-- end_ignore +-- +-- Test partition elimination, MPP-7891 +-- +-- start_ignore +drop table if exists fact; +NOTICE: table "fact" does not exist, skipping +deallocate f1; +ERROR: prepared statement "f1" does not exist +create table fact(x int, dd date, dt text) partition by range (dd) ( start('2008-01-01') end ('2320-01-01') every(interval '100 years')); +-- end_ignore +analyze fact; +select '2009-01-02'::date = to_date('2009-01-02','YYYY-MM-DD'); -- ensure that both are in fact equal + ?column? +---------- + t +(1 row) + +explain select * from fact where dd < '2009-01-02'::date; -- partitions eliminated + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on fact_1_prt_1 fact (cost=0.00..0.01 rows=1 width=40) + Filter: (dd < '01-02-2009'::date) + Optimizer: Postgres query optimizer +(3 rows) + +explain select * from fact where dd < to_date('2009-01-02','YYYY-MM-DD'); -- partitions eliminated + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on fact_1_prt_1 fact (cost=0.00..0.01 rows=1 width=40) + Filter: (dd < '01-02-2009'::date) + Optimizer: Postgres query optimizer +(3 rows) + +explain select * from fact where dd < current_date; --partitions eliminated + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on fact_1_prt_1 fact (cost=0.00..0.01 rows=1 width=40) + Filter: (dd < '07-13-2023'::date) + Optimizer: Postgres query optimizer +(3 rows) + +-- Test partition elimination in prepared statements +prepare f1(date) as select * from fact where dd < $1; +-- force_explain +explain execute f1('2009-01-02'::date); -- should eliminate partitions + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on fact_1_prt_1 fact (cost=0.00..0.01 rows=1 width=40) + Filter: (dd < '01-02-2009'::date) + Optimizer: Postgres query optimizer +(3 rows) + +-- force_explain +explain execute f1(to_date('2009-01-02', 'YYYY-MM-DD')); -- should eliminate partitions + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on fact_1_prt_1 fact (cost=0.00..0.01 rows=1 width=40) + Filter: (dd < '01-02-2009'::date) + Optimizer: Postgres query optimizer +(3 rows) + +-- start_ignore +drop table fact; +deallocate f1; +-- end_ignore +-- MPP-6247 +-- Delete Using on partitioned table causes repetitive scans on using table +create table mpp6247_foo ( c1 int, dt date ) partition by range (dt) ( start ( date '2009-05-01' ) end ( date '2009-05-11' ) every ( interval '1 day' ) ); +create table mpp6247_bar (like mpp6247_foo); +-- EXPECT: Single HJ after partition elimination instead of sequence of HJ under Append +select count_operator('delete from mpp6247_foo using mpp6247_bar where mpp6247_foo.c1 = mpp6247_bar.c1 and mpp6247_foo.dt = ''2009-05-03''', 'Hash Join'); + count_operator +---------------- + 1 +(1 row) + +drop table mpp6247_bar; +drop table mpp6247_foo; +-- CLEANUP +-- start_ignore +drop schema if exists bfv_partition_plans cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function count_operator(text,text) +drop cascades to function find_operator(text,text) +-- end_ignore diff --git a/src/test/singlenode_regress/expected/bit.out b/src/test/singlenode_regress/expected/bit.out new file mode 100644 index 00000000000..a5aab9c0e35 --- /dev/null +++ b/src/test/singlenode_regress/expected/bit.out @@ -0,0 +1,748 @@ +-- +-- BIT types +-- +-- +-- Build tables for testing +-- +CREATE TABLE BIT_TABLE(b BIT(11)); +INSERT INTO BIT_TABLE VALUES (B'10'); -- too short +ERROR: bit string length 2 does not match type bit(11) +INSERT INTO BIT_TABLE VALUES (B'00000000000'); +INSERT INTO BIT_TABLE VALUES (B'11011000000'); +INSERT INTO BIT_TABLE VALUES (B'01010101010'); +INSERT INTO BIT_TABLE VALUES (B'101011111010'); -- too long +ERROR: bit string length 12 does not match type bit(11) +--INSERT INTO BIT_TABLE VALUES ('X554'); +--INSERT INTO BIT_TABLE VALUES ('X555'); +SELECT * FROM BIT_TABLE; + b +------------- + 00000000000 + 11011000000 + 01010101010 +(3 rows) + +CREATE TABLE VARBIT_TABLE(v BIT VARYING(11)); +INSERT INTO VARBIT_TABLE VALUES (B''); +INSERT INTO VARBIT_TABLE VALUES (B'0'); +INSERT INTO VARBIT_TABLE VALUES (B'010101'); +INSERT INTO VARBIT_TABLE VALUES (B'01010101010'); +INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long +ERROR: bit string too long for type bit varying(11) +--INSERT INTO VARBIT_TABLE VALUES ('X554'); +--INSERT INTO VARBIT_TABLE VALUES ('X555'); +SELECT * FROM VARBIT_TABLE; + v +------------- + + 0 + 010101 + 01010101010 +(4 rows) + +-- Concatenation +SELECT v, b, (v || b) AS concat + FROM BIT_TABLE, VARBIT_TABLE + ORDER BY 3; + v | b | concat +-------------+-------------+------------------------ + | 00000000000 | 00000000000 + 0 | 00000000000 | 000000000000 + 0 | 01010101010 | 001010101010 + 010101 | 00000000000 | 01010100000000000 + | 01010101010 | 01010101010 + 01010101010 | 00000000000 | 0101010101000000000000 + 01010101010 | 01010101010 | 0101010101001010101010 + 010101 | 01010101010 | 01010101010101010 + 01010101010 | 11011000000 | 0101010101011011000000 + 010101 | 11011000000 | 01010111011000000 + 0 | 11011000000 | 011011000000 + | 11011000000 | 11011000000 +(12 rows) + +-- Length +SELECT b, length(b) AS lb + FROM BIT_TABLE; + b | lb +-------------+---- + 00000000000 | 11 + 11011000000 | 11 + 01010101010 | 11 +(3 rows) + +SELECT v, length(v) AS lv + FROM VARBIT_TABLE; + v | lv +-------------+---- + | 0 + 0 | 1 + 010101 | 6 + 01010101010 | 11 +(4 rows) + +-- Substring +SELECT b, + SUBSTRING(b FROM 2 FOR 4) AS sub_2_4, + SUBSTRING(b FROM 7 FOR 13) AS sub_7_13, + SUBSTRING(b FROM 6) AS sub_6 + FROM BIT_TABLE; + b | sub_2_4 | sub_7_13 | sub_6 +-------------+---------+----------+-------- + 00000000000 | 0000 | 00000 | 000000 + 11011000000 | 1011 | 00000 | 000000 + 01010101010 | 1010 | 01010 | 101010 +(3 rows) + +SELECT v, + SUBSTRING(v FROM 2 FOR 4) AS sub_2_4, + SUBSTRING(v FROM 7 FOR 13) AS sub_7_13, + SUBSTRING(v FROM 6) AS sub_6 + FROM VARBIT_TABLE; + v | sub_2_4 | sub_7_13 | sub_6 +-------------+---------+----------+-------- + | | | + 0 | | | + 010101 | 1010 | | 1 + 01010101010 | 1010 | 01010 | 101010 +(4 rows) + +-- test overflow cases +SELECT SUBSTRING('01010101'::bit(8) FROM 2 FOR 2147483646) AS "1010101"; + 1010101 +--------- + 1010101 +(1 row) + +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101"; + 01010101 +---------- + 01010101 +(1 row) + +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error"; +ERROR: negative substring length not allowed +SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101"; + 1010101 +--------- + 1010101 +(1 row) + +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101"; + 01010101 +---------- + 01010101 +(1 row) + +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error"; +ERROR: negative substring length not allowed +--- Bit operations +DROP TABLE varbit_table; +CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16)); +COPY varbit_table FROM stdin; +SELECT a, b, ~a AS "~ a", a & b AS "a & b", + a | b AS "a | b", a # b AS "a # b" FROM varbit_table; + a | b | ~ a | a & b | a | b | a # b +------------------+------------------+------------------+------------------+------------------+------------------ + 00001111 | 00010000 | 11110000 | 00000000 | 00011111 | 00011111 + 00011111 | 00010001 | 11100000 | 00010001 | 00011111 | 00001110 + 00101111 | 00010010 | 11010000 | 00000010 | 00111111 | 00111101 + 00111111 | 00010011 | 11000000 | 00010011 | 00111111 | 00101100 + 10001111 | 00000100 | 01110000 | 00000100 | 10001111 | 10001011 + 0000000000001111 | 0000000000010000 | 1111111111110000 | 0000000000000000 | 0000000000011111 | 0000000000011111 + 0000000100100011 | 1111111111111111 | 1111111011011100 | 0000000100100011 | 1111111111111111 | 1111111011011100 + 0010010001101000 | 0010010001101000 | 1101101110010111 | 0010010001101000 | 0010010001101000 | 0000000000000000 + 1111101001010000 | 0000010110101111 | 0000010110101111 | 0000000000000000 | 1111111111111111 | 1111111111111111 + 0001001000110100 | 1111111111110101 | 1110110111001011 | 0001001000110100 | 1111111111110101 | 1110110111000001 +(10 rows) + +SELECT a,b,a=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM varbit_table; + a | b | a=b | a>b | a<>b +------------------+------------------+-----+------+-----+------+-----+------ + 00001111 | 00010000 | t | t | f | f | f | t + 00011111 | 00010001 | f | f | f | t | t | t + 00101111 | 00010010 | f | f | f | t | t | t + 00111111 | 00010011 | f | f | f | t | t | t + 10001111 | 00000100 | f | f | f | t | t | t + 0000000000001111 | 0000000000010000 | t | t | f | f | f | t + 0000000100100011 | 1111111111111111 | t | t | f | f | f | t + 0010010001101000 | 0010010001101000 | f | t | t | t | f | f + 1111101001010000 | 0000010110101111 | f | f | f | t | t | t + 0001001000110100 | 1111111111110101 | t | t | f | f | f | t +(10 rows) + +SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM varbit_table; + a | a<<4 | b | b>>2 +------------------+------------------+------------------+------------------ + 00001111 | 11110000 | 00010000 | 00000100 + 00011111 | 11110000 | 00010001 | 00000100 + 00101111 | 11110000 | 00010010 | 00000100 + 00111111 | 11110000 | 00010011 | 00000100 + 10001111 | 11110000 | 00000100 | 00000001 + 0000000000001111 | 0000000011110000 | 0000000000010000 | 0000000000000100 + 0000000100100011 | 0001001000110000 | 1111111111111111 | 0011111111111111 + 0010010001101000 | 0100011010000000 | 0010010001101000 | 0000100100011010 + 1111101001010000 | 1010010100000000 | 0000010110101111 | 0000000101101011 + 0001001000110100 | 0010001101000000 | 1111111111110101 | 0011111111111101 +(10 rows) + +DROP TABLE varbit_table; +--- Bit operations +DROP TABLE bit_table; +CREATE TABLE bit_table (a BIT(16), b BIT(16)); +COPY bit_table FROM stdin; +SELECT a,b,~a AS "~ a",a & b AS "a & b", + a|b AS "a | b", a # b AS "a # b" FROM bit_table; + a | b | ~ a | a & b | a | b | a # b +------------------+------------------+------------------+------------------+------------------+------------------ + 0000111100000000 | 0001000000000000 | 1111000011111111 | 0000000000000000 | 0001111100000000 | 0001111100000000 + 0001111100000000 | 0001000100000000 | 1110000011111111 | 0001000100000000 | 0001111100000000 | 0000111000000000 + 0010111100000000 | 0001001000000000 | 1101000011111111 | 0000001000000000 | 0011111100000000 | 0011110100000000 + 0011111100000000 | 0001001100000000 | 1100000011111111 | 0001001100000000 | 0011111100000000 | 0010110000000000 + 1000111100000000 | 0000010000000000 | 0111000011111111 | 0000010000000000 | 1000111100000000 | 1000101100000000 + 0000000000001111 | 0000000000010000 | 1111111111110000 | 0000000000000000 | 0000000000011111 | 0000000000011111 + 0000000100100011 | 1111111111111111 | 1111111011011100 | 0000000100100011 | 1111111111111111 | 1111111011011100 + 0010010001101000 | 0010010001101000 | 1101101110010111 | 0010010001101000 | 0010010001101000 | 0000000000000000 + 1111101001010000 | 0000010110101111 | 0000010110101111 | 0000000000000000 | 1111111111111111 | 1111111111111111 + 0001001000110100 | 1111111111110101 | 1110110111001011 | 0001001000110100 | 1111111111110101 | 1110110111000001 +(10 rows) + +SELECT a,b,a=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM bit_table; + a | b | a=b | a>b | a<>b +------------------+------------------+-----+------+-----+------+-----+------ + 0000111100000000 | 0001000000000000 | t | t | f | f | f | t + 0001111100000000 | 0001000100000000 | f | f | f | t | t | t + 0010111100000000 | 0001001000000000 | f | f | f | t | t | t + 0011111100000000 | 0001001100000000 | f | f | f | t | t | t + 1000111100000000 | 0000010000000000 | f | f | f | t | t | t + 0000000000001111 | 0000000000010000 | t | t | f | f | f | t + 0000000100100011 | 1111111111111111 | t | t | f | f | f | t + 0010010001101000 | 0010010001101000 | f | t | t | t | f | f + 1111101001010000 | 0000010110101111 | f | f | f | t | t | t + 0001001000110100 | 1111111111110101 | t | t | f | f | f | t +(10 rows) + +SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM bit_table; + a | a<<4 | b | b>>2 +------------------+------------------+------------------+------------------ + 0000111100000000 | 1111000000000000 | 0001000000000000 | 0000010000000000 + 0001111100000000 | 1111000000000000 | 0001000100000000 | 0000010001000000 + 0010111100000000 | 1111000000000000 | 0001001000000000 | 0000010010000000 + 0011111100000000 | 1111000000000000 | 0001001100000000 | 0000010011000000 + 1000111100000000 | 1111000000000000 | 0000010000000000 | 0000000100000000 + 0000000000001111 | 0000000011110000 | 0000000000010000 | 0000000000000100 + 0000000100100011 | 0001001000110000 | 1111111111111111 | 0011111111111111 + 0010010001101000 | 0100011010000000 | 0010010001101000 | 0000100100011010 + 1111101001010000 | 1010010100000000 | 0000010110101111 | 0000000101101011 + 0001001000110100 | 0010001101000000 | 1111111111110101 | 0011111111111101 +(10 rows) + +DROP TABLE bit_table; +-- The following should fail +select B'001' & B'10'; +ERROR: cannot AND bit strings of different sizes +select B'0111' | B'011'; +ERROR: cannot OR bit strings of different sizes +select B'0010' # B'011101'; +ERROR: cannot XOR bit strings of different sizes +-- More position tests, checking all the boundary cases +SELECT POSITION(B'1010' IN B'0000101'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'1010' IN B'00001010'); -- 5 + position +---------- + 5 +(1 row) + +SELECT POSITION(B'1010' IN B'00000101'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'1010' IN B'000001010'); -- 6 + position +---------- + 6 +(1 row) + +SELECT POSITION(B'' IN B'00001010'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'0' IN B''); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'' IN B''); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3 + position +---------- + 3 +(1 row) + +SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3 + position +---------- + 3 +(1 row) + +SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3 + position +---------- + 3 +(1 row) + +SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5 + position +---------- + 5 +(1 row) + +SELECT POSITION(B'11101011' IN B'11101011'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'11101011' IN B'011101011'); -- 2 + position +---------- + 2 +(1 row) + +SELECT POSITION(B'11101011' IN B'00011101011'); -- 4 + position +---------- + 4 +(1 row) + +SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6 + position +---------- + 6 +(1 row) + +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 + position +---------- + 2 +(1 row) + +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 + position +---------- + 4 +(1 row) + +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 + position +---------- + 6 +(1 row) + +SELECT POSITION(B'111010110' IN B'11101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'011101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'00011101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 + position +---------- + 2 +(1 row) + +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 + position +---------- + 4 +(1 row) + +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 + position +---------- + 6 +(1 row) + +SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0 + position +---------- + 0 +(1 row) + +SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14 + position +---------- + 14 +(1 row) + +SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15 + position +---------- + 15 +(1 row) + +SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17 + position +---------- + 17 +(1 row) + +SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19 + position +---------- + 19 +(1 row) + +SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1 + position +---------- + 1 +(1 row) + +SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2 + position +---------- + 2 +(1 row) + +SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0 + position +---------- + 0 +(1 row) + +-- Shifting +CREATE TABLE BIT_SHIFT_TABLE(b BIT(16)); +INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000'); +INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE; +SELECT POSITION(B'1101' IN b), + POSITION(B'11011' IN b), + b + FROM BIT_SHIFT_TABLE ; + position | position | b +----------+----------+------------------ + 1 | 1 | 1101100000000000 + 2 | 2 | 0110110000000000 + 3 | 3 | 0011011000000000 + 4 | 4 | 0001101100000000 + 5 | 5 | 0000110110000000 + 6 | 6 | 0000011011000000 + 7 | 7 | 0000001101100000 + 8 | 8 | 0000000110110000 + 9 | 9 | 0000000011011000 + 10 | 10 | 0000000001101100 + 11 | 11 | 0000000000110110 + 12 | 12 | 0000000000011011 + 13 | 0 | 0000000000001101 + 0 | 0 | 0000000000000110 + 0 | 0 | 0000000000000011 + 0 | 0 | 0000000000000001 +(16 rows) + +SELECT b, b >> 1 AS bsr, b << 1 AS bsl + FROM BIT_SHIFT_TABLE ; + b | bsr | bsl +------------------+------------------+------------------ + 1101100000000000 | 0110110000000000 | 1011000000000000 + 0110110000000000 | 0011011000000000 | 1101100000000000 + 0011011000000000 | 0001101100000000 | 0110110000000000 + 0001101100000000 | 0000110110000000 | 0011011000000000 + 0000110110000000 | 0000011011000000 | 0001101100000000 + 0000011011000000 | 0000001101100000 | 0000110110000000 + 0000001101100000 | 0000000110110000 | 0000011011000000 + 0000000110110000 | 0000000011011000 | 0000001101100000 + 0000000011011000 | 0000000001101100 | 0000000110110000 + 0000000001101100 | 0000000000110110 | 0000000011011000 + 0000000000110110 | 0000000000011011 | 0000000001101100 + 0000000000011011 | 0000000000001101 | 0000000000110110 + 0000000000001101 | 0000000000000110 | 0000000000011010 + 0000000000000110 | 0000000000000011 | 0000000000001100 + 0000000000000011 | 0000000000000001 | 0000000000000110 + 0000000000000001 | 0000000000000000 | 0000000000000010 +(16 rows) + +SELECT b, b >> 8 AS bsr8, b << 8 AS bsl8 + FROM BIT_SHIFT_TABLE ; + b | bsr8 | bsl8 +------------------+------------------+------------------ + 1101100000000000 | 0000000011011000 | 0000000000000000 + 0110110000000000 | 0000000001101100 | 0000000000000000 + 0011011000000000 | 0000000000110110 | 0000000000000000 + 0001101100000000 | 0000000000011011 | 0000000000000000 + 0000110110000000 | 0000000000001101 | 1000000000000000 + 0000011011000000 | 0000000000000110 | 1100000000000000 + 0000001101100000 | 0000000000000011 | 0110000000000000 + 0000000110110000 | 0000000000000001 | 1011000000000000 + 0000000011011000 | 0000000000000000 | 1101100000000000 + 0000000001101100 | 0000000000000000 | 0110110000000000 + 0000000000110110 | 0000000000000000 | 0011011000000000 + 0000000000011011 | 0000000000000000 | 0001101100000000 + 0000000000001101 | 0000000000000000 | 0000110100000000 + 0000000000000110 | 0000000000000000 | 0000011000000000 + 0000000000000011 | 0000000000000000 | 0000001100000000 + 0000000000000001 | 0000000000000000 | 0000000100000000 +(16 rows) + +SELECT b::bit(15), b::bit(15) >> 1 AS bsr, b::bit(15) << 1 AS bsl + FROM BIT_SHIFT_TABLE ; + b | bsr | bsl +-----------------+-----------------+----------------- + 110110000000000 | 011011000000000 | 101100000000000 + 011011000000000 | 001101100000000 | 110110000000000 + 001101100000000 | 000110110000000 | 011011000000000 + 000110110000000 | 000011011000000 | 001101100000000 + 000011011000000 | 000001101100000 | 000110110000000 + 000001101100000 | 000000110110000 | 000011011000000 + 000000110110000 | 000000011011000 | 000001101100000 + 000000011011000 | 000000001101100 | 000000110110000 + 000000001101100 | 000000000110110 | 000000011011000 + 000000000110110 | 000000000011011 | 000000001101100 + 000000000011011 | 000000000001101 | 000000000110110 + 000000000001101 | 000000000000110 | 000000000011010 + 000000000000110 | 000000000000011 | 000000000001100 + 000000000000011 | 000000000000001 | 000000000000110 + 000000000000001 | 000000000000000 | 000000000000010 + 000000000000000 | 000000000000000 | 000000000000000 +(16 rows) + +SELECT b::bit(15), b::bit(15) >> 8 AS bsr8, b::bit(15) << 8 AS bsl8 + FROM BIT_SHIFT_TABLE ; + b | bsr8 | bsl8 +-----------------+-----------------+----------------- + 110110000000000 | 000000001101100 | 000000000000000 + 011011000000000 | 000000000110110 | 000000000000000 + 001101100000000 | 000000000011011 | 000000000000000 + 000110110000000 | 000000000001101 | 000000000000000 + 000011011000000 | 000000000000110 | 100000000000000 + 000001101100000 | 000000000000011 | 110000000000000 + 000000110110000 | 000000000000001 | 011000000000000 + 000000011011000 | 000000000000000 | 101100000000000 + 000000001101100 | 000000000000000 | 110110000000000 + 000000000110110 | 000000000000000 | 011011000000000 + 000000000011011 | 000000000000000 | 001101100000000 + 000000000001101 | 000000000000000 | 000110100000000 + 000000000000110 | 000000000000000 | 000011000000000 + 000000000000011 | 000000000000000 | 000001100000000 + 000000000000001 | 000000000000000 | 000000100000000 + 000000000000000 | 000000000000000 | 000000000000000 +(16 rows) + +CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20)); +INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011'); +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE; +SELECT POSITION(B'1101' IN v), + POSITION(B'11011' IN v), + v + FROM VARBIT_SHIFT_TABLE ; + position | position | v +----------+----------+---------------------- + 1 | 1 | 11011 + 2 | 2 | 011011 + 3 | 3 | 0011011 + 4 | 4 | 00011011 + 5 | 5 | 000011011 + 6 | 6 | 0000011011 + 7 | 7 | 00000011011 + 8 | 8 | 000000011011 + 9 | 9 | 0000000011011 + 10 | 10 | 00000000011011 + 11 | 11 | 000000000011011 + 12 | 12 | 0000000000011011 + 13 | 13 | 00000000000011011 + 14 | 14 | 000000000000011011 + 15 | 15 | 0000000000000011011 + 16 | 16 | 00000000000000011011 +(16 rows) + +SELECT v, v >> 1 AS vsr, v << 1 AS vsl + FROM VARBIT_SHIFT_TABLE ; + v | vsr | vsl +----------------------+----------------------+---------------------- + 11011 | 01101 | 10110 + 011011 | 001101 | 110110 + 0011011 | 0001101 | 0110110 + 00011011 | 00001101 | 00110110 + 000011011 | 000001101 | 000110110 + 0000011011 | 0000001101 | 0000110110 + 00000011011 | 00000001101 | 00000110110 + 000000011011 | 000000001101 | 000000110110 + 0000000011011 | 0000000001101 | 0000000110110 + 00000000011011 | 00000000001101 | 00000000110110 + 000000000011011 | 000000000001101 | 000000000110110 + 0000000000011011 | 0000000000001101 | 0000000000110110 + 00000000000011011 | 00000000000001101 | 00000000000110110 + 000000000000011011 | 000000000000001101 | 000000000000110110 + 0000000000000011011 | 0000000000000001101 | 0000000000000110110 + 00000000000000011011 | 00000000000000001101 | 00000000000000110110 +(16 rows) + +SELECT v, v >> 8 AS vsr8, v << 8 AS vsl8 + FROM VARBIT_SHIFT_TABLE ; + v | vsr8 | vsl8 +----------------------+----------------------+---------------------- + 11011 | 00000 | 00000 + 011011 | 000000 | 000000 + 0011011 | 0000000 | 0000000 + 00011011 | 00000000 | 00000000 + 000011011 | 000000000 | 100000000 + 0000011011 | 0000000000 | 1100000000 + 00000011011 | 00000000000 | 01100000000 + 000000011011 | 000000000000 | 101100000000 + 0000000011011 | 0000000000000 | 1101100000000 + 00000000011011 | 00000000000000 | 01101100000000 + 000000000011011 | 000000000000000 | 001101100000000 + 0000000000011011 | 0000000000000000 | 0001101100000000 + 00000000000011011 | 00000000000000000 | 00001101100000000 + 000000000000011011 | 000000000000000000 | 000001101100000000 + 0000000000000011011 | 0000000000000000000 | 0000001101100000000 + 00000000000000011011 | 00000000000000000000 | 00000001101100000000 +(16 rows) + +DROP TABLE BIT_SHIFT_TABLE; +DROP TABLE VARBIT_SHIFT_TABLE; +-- Get/Set bit +SELECT get_bit(B'0101011000100', 10); + get_bit +--------- + 1 +(1 row) + +SELECT set_bit(B'0101011000100100', 15, 1); + set_bit +------------------ + 0101011000100101 +(1 row) + +SELECT set_bit(B'0101011000100100', 16, 1); -- fail +ERROR: bit index 16 out of valid range (0..15) +-- Overlay +SELECT overlay(B'0101011100' placing '001' from 2 for 3); + overlay +------------ + 0001011100 +(1 row) + +SELECT overlay(B'0101011100' placing '101' from 6); + overlay +------------ + 0101010100 +(1 row) + +SELECT overlay(B'0101011100' placing '001' from 11); + overlay +--------------- + 0101011100001 +(1 row) + +SELECT overlay(B'0101011100' placing '001' from 20); + overlay +--------------- + 0101011100001 +(1 row) + +-- bit_count +SELECT bit_count(B'0101011100'::bit(10)); + bit_count +----------- + 5 +(1 row) + +SELECT bit_count(B'1111111111'::bit(10)); + bit_count +----------- + 10 +(1 row) + +-- This table is intentionally left around to exercise pg_dump/pg_upgrade +CREATE TABLE bit_defaults( + b1 bit(4) DEFAULT '1001', + b2 bit(4) DEFAULT B'0101', + b3 bit varying(5) DEFAULT '1001', + b4 bit varying(5) DEFAULT B'0101' +); +\d bit_defaults + Table "public.bit_defaults" + Column | Type | Collation | Nullable | Default +--------+----------------+-----------+----------+--------------------- + b1 | bit(4) | | | '1001'::"bit" + b2 | bit(4) | | | '0101'::"bit" + b3 | bit varying(5) | | | '1001'::bit varying + b4 | bit varying(5) | | | '0101'::"bit" + +INSERT INTO bit_defaults DEFAULT VALUES; +TABLE bit_defaults; + b1 | b2 | b3 | b4 +------+------+------+------ + 1001 | 0101 | 1001 | 0101 +(1 row) + diff --git a/src/test/singlenode_regress/expected/bitmapops.out b/src/test/singlenode_regress/expected/bitmapops.out new file mode 100644 index 00000000000..05e96422341 --- /dev/null +++ b/src/test/singlenode_regress/expected/bitmapops.out @@ -0,0 +1,39 @@ +-- Test bitmap AND and OR +-- Generate enough data that we can test the lossy bitmaps. +-- There's 55 tuples per page in the table. 53 is just +-- below 55, so that an index scan with qual a = constant +-- will return at least one hit per page. 59 is just above +-- 55, so that an index scan with qual b = constant will return +-- hits on most but not all pages. 53 and 59 are prime, so that +-- there's a maximum number of a,b combinations in the table. +-- That allows us to test all the different combinations of +-- lossy and non-lossy pages with the minimum amount of data +CREATE TABLE bmscantest (a int, b int, t text); +INSERT INTO bmscantest + SELECT (r%53), (r%59), 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' + FROM generate_series(1,70000) r; +CREATE INDEX i_bmtest_a ON bmscantest(a); +CREATE INDEX i_bmtest_b ON bmscantest(b); +-- We want to use bitmapscans. With default settings, the planner currently +-- chooses a bitmap scan for the queries below anyway, but let's make sure. +set enable_indexscan=false; +set enable_seqscan=false; +-- Lower work_mem to trigger use of lossy bitmaps +set work_mem = 64; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- Test bitmap-and. +SELECT count(*) FROM bmscantest WHERE a = 1 AND b = 1; + count +------- + 23 +(1 row) + +-- Test bitmap-or. +SELECT count(*) FROM bmscantest WHERE a = 1 OR b = 1; + count +------- + 2485 +(1 row) + +-- clean up +DROP TABLE bmscantest; diff --git a/src/test/singlenode_regress/expected/boolean.out b/src/test/singlenode_regress/expected/boolean.out new file mode 100644 index 00000000000..4728fe2dfdf --- /dev/null +++ b/src/test/singlenode_regress/expected/boolean.out @@ -0,0 +1,559 @@ +-- +-- BOOLEAN +-- +-- +-- sanity check - if this fails go insane! +-- +SELECT 1 AS one; + one +----- + 1 +(1 row) + +-- ******************testing built-in type bool******************** +-- check bool input syntax +SELECT true AS true; + true +------ + t +(1 row) + +SELECT false AS false; + false +------- + f +(1 row) + +SELECT bool 't' AS true; + true +------ + t +(1 row) + +SELECT bool ' f ' AS false; + false +------- + f +(1 row) + +SELECT bool 'true' AS true; + true +------ + t +(1 row) + +SELECT bool 'test' AS error; +ERROR: invalid input syntax for type boolean: "test" +LINE 1: SELECT bool 'test' AS error; + ^ +SELECT bool 'false' AS false; + false +------- + f +(1 row) + +SELECT bool 'foo' AS error; +ERROR: invalid input syntax for type boolean: "foo" +LINE 1: SELECT bool 'foo' AS error; + ^ +SELECT bool 'y' AS true; + true +------ + t +(1 row) + +SELECT bool 'yes' AS true; + true +------ + t +(1 row) + +SELECT bool 'yeah' AS error; +ERROR: invalid input syntax for type boolean: "yeah" +LINE 1: SELECT bool 'yeah' AS error; + ^ +SELECT bool 'n' AS false; + false +------- + f +(1 row) + +SELECT bool 'no' AS false; + false +------- + f +(1 row) + +SELECT bool 'nay' AS error; +ERROR: invalid input syntax for type boolean: "nay" +LINE 1: SELECT bool 'nay' AS error; + ^ +SELECT bool 'on' AS true; + true +------ + t +(1 row) + +SELECT bool 'off' AS false; + false +------- + f +(1 row) + +SELECT bool 'of' AS false; + false +------- + f +(1 row) + +SELECT bool 'o' AS error; +ERROR: invalid input syntax for type boolean: "o" +LINE 1: SELECT bool 'o' AS error; + ^ +SELECT bool 'on_' AS error; +ERROR: invalid input syntax for type boolean: "on_" +LINE 1: SELECT bool 'on_' AS error; + ^ +SELECT bool 'off_' AS error; +ERROR: invalid input syntax for type boolean: "off_" +LINE 1: SELECT bool 'off_' AS error; + ^ +SELECT bool '1' AS true; + true +------ + t +(1 row) + +SELECT bool '11' AS error; +ERROR: invalid input syntax for type boolean: "11" +LINE 1: SELECT bool '11' AS error; + ^ +SELECT bool '0' AS false; + false +------- + f +(1 row) + +SELECT bool '000' AS error; +ERROR: invalid input syntax for type boolean: "000" +LINE 1: SELECT bool '000' AS error; + ^ +SELECT bool '' AS error; +ERROR: invalid input syntax for type boolean: "" +LINE 1: SELECT bool '' AS error; + ^ +-- and, or, not in qualifications +SELECT bool 't' or bool 'f' AS true; + true +------ + t +(1 row) + +SELECT bool 't' and bool 'f' AS false; + false +------- + f +(1 row) + +SELECT not bool 'f' AS true; + true +------ + t +(1 row) + +SELECT bool 't' = bool 'f' AS false; + false +------- + f +(1 row) + +SELECT bool 't' <> bool 'f' AS true; + true +------ + t +(1 row) + +SELECT bool 't' > bool 'f' AS true; + true +------ + t +(1 row) + +SELECT bool 't' >= bool 'f' AS true; + true +------ + t +(1 row) + +SELECT bool 'f' < bool 't' AS true; + true +------ + t +(1 row) + +SELECT bool 'f' <= bool 't' AS true; + true +------ + t +(1 row) + +-- explicit casts to/from text +SELECT 'TrUe'::text::boolean AS true, 'fAlse'::text::boolean AS false; + true | false +------+------- + t | f +(1 row) + +SELECT ' true '::text::boolean AS true, + ' FALSE'::text::boolean AS false; + true | false +------+------- + t | f +(1 row) + +SELECT true::boolean::text AS true, false::boolean::text AS false; + true | false +------+------- + true | false +(1 row) + +SELECT ' tru e '::text::boolean AS invalid; -- error +ERROR: invalid input syntax for type boolean: " tru e " +SELECT ''::text::boolean AS invalid; -- error +ERROR: invalid input syntax for type boolean: "" +CREATE TABLE BOOLTBL1 (f1 bool); +INSERT INTO BOOLTBL1 (f1) VALUES (bool 't'); +INSERT INTO BOOLTBL1 (f1) VALUES (bool 'True'); +INSERT INTO BOOLTBL1 (f1) VALUES (bool 'true'); +-- BOOLTBL1 should be full of true's at this point +SELECT BOOLTBL1.* FROM BOOLTBL1; + f1 +---- + t + t + t +(3 rows) + +SELECT BOOLTBL1.* + FROM BOOLTBL1 + WHERE f1 = bool 'true'; + f1 +---- + t + t + t +(3 rows) + +SELECT BOOLTBL1.* + FROM BOOLTBL1 + WHERE f1 <> bool 'false'; + f1 +---- + t + t + t +(3 rows) + +SELECT BOOLTBL1.* + FROM BOOLTBL1 + WHERE booleq(bool 'false', f1); + f1 +---- +(0 rows) + +INSERT INTO BOOLTBL1 (f1) VALUES (bool 'f'); +SELECT BOOLTBL1.* + FROM BOOLTBL1 + WHERE f1 = bool 'false'; + f1 +---- + f +(1 row) + +CREATE TABLE BOOLTBL2 (f1 bool); +INSERT INTO BOOLTBL2 (f1) VALUES (bool 'f'); +INSERT INTO BOOLTBL2 (f1) VALUES (bool 'false'); +INSERT INTO BOOLTBL2 (f1) VALUES (bool 'False'); +INSERT INTO BOOLTBL2 (f1) VALUES (bool 'FALSE'); +-- This is now an invalid expression +-- For pre-v6.3 this evaluated to false - thomas 1997-10-23 +INSERT INTO BOOLTBL2 (f1) + VALUES (bool 'XXX'); +ERROR: invalid input syntax for type boolean: "XXX" +LINE 2: VALUES (bool 'XXX'); + ^ +-- BOOLTBL2 should be full of false's at this point +SELECT BOOLTBL2.* FROM BOOLTBL2; + f1 +---- + f + f + f + f +(4 rows) + +SELECT BOOLTBL1.*, BOOLTBL2.* + FROM BOOLTBL1, BOOLTBL2 + WHERE BOOLTBL2.f1 <> BOOLTBL1.f1; + f1 | f1 +----+---- + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f +(12 rows) + +SELECT BOOLTBL1.*, BOOLTBL2.* + FROM BOOLTBL1, BOOLTBL2 + WHERE boolne(BOOLTBL2.f1,BOOLTBL1.f1); + f1 | f1 +----+---- + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f +(12 rows) + +SELECT BOOLTBL1.*, BOOLTBL2.* + FROM BOOLTBL1, BOOLTBL2 + WHERE BOOLTBL2.f1 = BOOLTBL1.f1 and BOOLTBL1.f1 = bool 'false'; + f1 | f1 +----+---- + f | f + f | f + f | f + f | f +(4 rows) + +SELECT BOOLTBL1.*, BOOLTBL2.* + FROM BOOLTBL1, BOOLTBL2 + WHERE BOOLTBL2.f1 = BOOLTBL1.f1 or BOOLTBL1.f1 = bool 'true' + ORDER BY BOOLTBL1.f1, BOOLTBL2.f1; + f1 | f1 +----+---- + f | f + f | f + f | f + f | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f + t | f +(16 rows) + +-- +-- SQL syntax +-- Try all combinations to ensure that we get nothing when we expect nothing +-- - thomas 2000-01-04 +-- +SELECT f1 + FROM BOOLTBL1 + WHERE f1 IS TRUE; + f1 +---- + t + t + t +(3 rows) + +SELECT f1 + FROM BOOLTBL1 + WHERE f1 IS NOT FALSE; + f1 +---- + t + t + t +(3 rows) + +SELECT f1 + FROM BOOLTBL1 + WHERE f1 IS FALSE; + f1 +---- + f +(1 row) + +SELECT f1 + FROM BOOLTBL1 + WHERE f1 IS NOT TRUE; + f1 +---- + f +(1 row) + +SELECT f1 + FROM BOOLTBL2 + WHERE f1 IS TRUE; + f1 +---- +(0 rows) + +SELECT f1 + FROM BOOLTBL2 + WHERE f1 IS NOT FALSE; + f1 +---- +(0 rows) + +SELECT f1 + FROM BOOLTBL2 + WHERE f1 IS FALSE; + f1 +---- + f + f + f + f +(4 rows) + +SELECT f1 + FROM BOOLTBL2 + WHERE f1 IS NOT TRUE; + f1 +---- + f + f + f + f +(4 rows) + +-- +-- Tests for BooleanTest +-- +CREATE TABLE BOOLTBL3 (d text, b bool, o int); +INSERT INTO BOOLTBL3 (d, b, o) VALUES ('true', true, 1); +INSERT INTO BOOLTBL3 (d, b, o) VALUES ('false', false, 2); +INSERT INTO BOOLTBL3 (d, b, o) VALUES ('null', null, 3); +SELECT + d, + b IS TRUE AS istrue, + b IS NOT TRUE AS isnottrue, + b IS FALSE AS isfalse, + b IS NOT FALSE AS isnotfalse, + b IS UNKNOWN AS isunknown, + b IS NOT UNKNOWN AS isnotunknown +FROM booltbl3 ORDER BY o; + d | istrue | isnottrue | isfalse | isnotfalse | isunknown | isnotunknown +-------+--------+-----------+---------+------------+-----------+-------------- + true | t | f | f | t | f | t + false | f | t | t | f | f | t + null | f | t | f | t | t | f +(3 rows) + +-- Test to make sure short-circuiting and NULL handling is +-- correct. Use a table as source to prevent constant simplification +-- to interfer. +CREATE TABLE booltbl4(isfalse bool, istrue bool, isnul bool); +INSERT INTO booltbl4 VALUES (false, true, null); +\pset null '(null)' +-- AND expression need to return null if there's any nulls and not all +-- of the value are true +SELECT istrue AND isnul AND istrue FROM booltbl4; + ?column? +---------- + (null) +(1 row) + +SELECT istrue AND istrue AND isnul FROM booltbl4; + ?column? +---------- + (null) +(1 row) + +SELECT isnul AND istrue AND istrue FROM booltbl4; + ?column? +---------- + (null) +(1 row) + +SELECT isfalse AND isnul AND istrue FROM booltbl4; + ?column? +---------- + f +(1 row) + +SELECT istrue AND isfalse AND isnul FROM booltbl4; + ?column? +---------- + f +(1 row) + +SELECT isnul AND istrue AND isfalse FROM booltbl4; + ?column? +---------- + f +(1 row) + +-- OR expression need to return null if there's any nulls and none +-- of the value is true +SELECT isfalse OR isnul OR isfalse FROM booltbl4; + ?column? +---------- + (null) +(1 row) + +SELECT isfalse OR isfalse OR isnul FROM booltbl4; + ?column? +---------- + (null) +(1 row) + +SELECT isnul OR isfalse OR isfalse FROM booltbl4; + ?column? +---------- + (null) +(1 row) + +SELECT isfalse OR isnul OR istrue FROM booltbl4; + ?column? +---------- + t +(1 row) + +SELECT istrue OR isfalse OR isnul FROM booltbl4; + ?column? +---------- + t +(1 row) + +SELECT isnul OR istrue OR isfalse FROM booltbl4; + ?column? +---------- + t +(1 row) + +-- +-- Clean up +-- Many tables are retained by the regression test, but these do not seem +-- particularly useful so just get rid of them for now. +-- - thomas 1997-11-30 +-- +DROP TABLE BOOLTBL1; +DROP TABLE BOOLTBL2; +DROP TABLE BOOLTBL3; +DROP TABLE BOOLTBL4; diff --git a/src/test/singlenode_regress/expected/box.out b/src/test/singlenode_regress/expected/box.out new file mode 100644 index 00000000000..af3f42e0fce --- /dev/null +++ b/src/test/singlenode_regress/expected/box.out @@ -0,0 +1,657 @@ +-- +-- BOX +-- +-- +-- box logic +-- o +-- 3 o--|X +-- | o| +-- 2 +-+-+ | +-- | | | | +-- 1 | o-+-o +-- | | +-- 0 +---+ +-- +-- 0 1 2 3 +-- +-- boxes are specified by two points, given by four floats x1,y1,x2,y2 +CREATE TABLE BOX_TBL (f1 box); +INSERT INTO BOX_TBL (f1) VALUES ('(2.0,2.0,0.0,0.0)'); +INSERT INTO BOX_TBL (f1) VALUES ('(1.0,1.0,3.0,3.0)'); +INSERT INTO BOX_TBL (f1) VALUES ('((-8, 2), (-2, -10))'); +-- degenerate cases where the box is a line or a point +-- note that lines and points boxes all have zero area +INSERT INTO BOX_TBL (f1) VALUES ('(2.5, 2.5, 2.5,3.5)'); +INSERT INTO BOX_TBL (f1) VALUES ('(3.0, 3.0,3.0,3.0)'); +-- badly formatted box inputs +INSERT INTO BOX_TBL (f1) VALUES ('(2.3, 4.5)'); +ERROR: invalid input syntax for type box: "(2.3, 4.5)" +LINE 1: INSERT INTO BOX_TBL (f1) VALUES ('(2.3, 4.5)'); + ^ +INSERT INTO BOX_TBL (f1) VALUES ('[1, 2, 3, 4)'); +ERROR: invalid input syntax for type box: "[1, 2, 3, 4)" +LINE 1: INSERT INTO BOX_TBL (f1) VALUES ('[1, 2, 3, 4)'); + ^ +INSERT INTO BOX_TBL (f1) VALUES ('(1, 2, 3, 4]'); +ERROR: invalid input syntax for type box: "(1, 2, 3, 4]" +LINE 1: INSERT INTO BOX_TBL (f1) VALUES ('(1, 2, 3, 4]'); + ^ +INSERT INTO BOX_TBL (f1) VALUES ('(1, 2, 3, 4) x'); +ERROR: invalid input syntax for type box: "(1, 2, 3, 4) x" +LINE 1: INSERT INTO BOX_TBL (f1) VALUES ('(1, 2, 3, 4) x'); + ^ +INSERT INTO BOX_TBL (f1) VALUES ('asdfasdf(ad'); +ERROR: invalid input syntax for type box: "asdfasdf(ad" +LINE 1: INSERT INTO BOX_TBL (f1) VALUES ('asdfasdf(ad'); + ^ +SELECT * FROM BOX_TBL; + f1 +--------------------- + (2,2),(0,0) + (3,3),(1,1) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) +(5 rows) + +SELECT b.*, area(b.f1) as barea + FROM BOX_TBL b; + f1 | barea +---------------------+------- + (2,2),(0,0) | 4 + (3,3),(1,1) | 4 + (-2,2),(-8,-10) | 72 + (2.5,3.5),(2.5,2.5) | 0 + (3,3),(3,3) | 0 +(5 rows) + +-- overlap +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 && box '(2.5,2.5,1.0,1.0)'; + f1 +--------------------- + (2,2),(0,0) + (3,3),(1,1) + (2.5,3.5),(2.5,2.5) +(3 rows) + +-- left-or-overlap (x only) +SELECT b1.* + FROM BOX_TBL b1 + WHERE b1.f1 &< box '(2.0,2.0,2.5,2.5)'; + f1 +--------------------- + (2,2),(0,0) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) +(3 rows) + +-- right-or-overlap (x only) +SELECT b1.* + FROM BOX_TBL b1 + WHERE b1.f1 &> box '(2.0,2.0,2.5,2.5)'; + f1 +--------------------- + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) +(2 rows) + +-- left of +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 << box '(3.0,3.0,5.0,5.0)'; + f1 +--------------------- + (2,2),(0,0) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) +(3 rows) + +-- area <= +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 <= box '(3.0,3.0,5.0,5.0)'; + f1 +--------------------- + (2,2),(0,0) + (3,3),(1,1) + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) +(4 rows) + +-- area < +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 < box '(3.0,3.0,5.0,5.0)'; + f1 +--------------------- + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) +(2 rows) + +-- area = +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 = box '(3.0,3.0,5.0,5.0)'; + f1 +------------- + (2,2),(0,0) + (3,3),(1,1) +(2 rows) + +-- area > +SELECT b.f1 + FROM BOX_TBL b -- zero area + WHERE b.f1 > box '(3.5,3.0,4.5,3.0)'; + f1 +----------------- + (2,2),(0,0) + (3,3),(1,1) + (-2,2),(-8,-10) +(3 rows) + +-- area >= +SELECT b.f1 + FROM BOX_TBL b -- zero area + WHERE b.f1 >= box '(3.5,3.0,4.5,3.0)'; + f1 +--------------------- + (2,2),(0,0) + (3,3),(1,1) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) +(5 rows) + +-- right of +SELECT b.f1 + FROM BOX_TBL b + WHERE box '(3.0,3.0,5.0,5.0)' >> b.f1; + f1 +--------------------- + (2,2),(0,0) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) +(3 rows) + +-- contained in +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 <@ box '(0,0,3,3)'; + f1 +------------- + (2,2),(0,0) + (3,3),(1,1) + (3,3),(3,3) +(3 rows) + +-- contains +SELECT b.f1 + FROM BOX_TBL b + WHERE box '(0,0,3,3)' @> b.f1; + f1 +------------- + (2,2),(0,0) + (3,3),(1,1) + (3,3),(3,3) +(3 rows) + +-- box equality +SELECT b.f1 + FROM BOX_TBL b + WHERE box '(1,1,3,3)' ~= b.f1; + f1 +------------- + (3,3),(1,1) +(1 row) + +-- center of box, left unary operator +SELECT @@(b1.f1) AS p + FROM BOX_TBL b1; + p +--------- + (1,1) + (2,2) + (-5,-4) + (2.5,3) + (3,3) +(5 rows) + +-- wholly-contained +SELECT b1.*, b2.* + FROM BOX_TBL b1, BOX_TBL b2 + WHERE b1.f1 @> b2.f1 and not b1.f1 ~= b2.f1; + f1 | f1 +-------------+------------- + (3,3),(1,1) | (3,3),(3,3) +(1 row) + +SELECT height(f1), width(f1) FROM BOX_TBL; + height | width +--------+------- + 2 | 2 + 2 | 2 + 12 | 6 + 1 | 0 + 0 | 0 +(5 rows) + +-- +-- Test the SP-GiST index +-- +CREATE TEMPORARY TABLE box_temp (f1 box); +INSERT INTO box_temp + SELECT box(point(i, i), point(i * 2, i * 2)) + FROM generate_series(1, 50) AS i; +CREATE INDEX box_spgist ON box_temp USING spgist (f1); +INSERT INTO box_temp + VALUES (NULL), + ('(0,0)(0,100)'), + ('(-3,4.3333333333)(40,1)'), + ('(0,100)(0,infinity)'), + ('(-infinity,0)(0,infinity)'), + ('(-infinity,-infinity)(infinity,infinity)'); +SET enable_seqscan = false; +SELECT * FROM box_temp WHERE f1 << '(10,20),(30,40)'; + f1 +---------------------------- + (2,2),(1,1) + (4,4),(2,2) + (6,6),(3,3) + (8,8),(4,4) + (0,100),(0,0) + (0,Infinity),(0,100) + (0,Infinity),(-Infinity,0) +(7 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 << '(10,20),(30,40)'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 << '(30,40),(10,20)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 &< '(10,4.333334),(5,100)'; + f1 +---------------------------- + (2,2),(1,1) + (4,4),(2,2) + (6,6),(3,3) + (8,8),(4,4) + (10,10),(5,5) + (0,100),(0,0) + (0,Infinity),(0,100) + (0,Infinity),(-Infinity,0) +(8 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &< '(10,4.333334),(5,100)'; + QUERY PLAN +---------------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 &< '(10,100),(5,4.333334)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 && '(15,20),(25,30)'; + f1 +------------------------------------------- + (20,20),(10,10) + (22,22),(11,11) + (24,24),(12,12) + (26,26),(13,13) + (28,28),(14,14) + (30,30),(15,15) + (32,32),(16,16) + (34,34),(17,17) + (36,36),(18,18) + (38,38),(19,19) + (40,40),(20,20) + (42,42),(21,21) + (44,44),(22,22) + (46,46),(23,23) + (48,48),(24,24) + (50,50),(25,25) + (Infinity,Infinity),(-Infinity,-Infinity) +(17 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 && '(15,20),(25,30)'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 && '(25,30),(15,20)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 &> '(40,30),(45,50)'; + f1 +------------------- + (80,80),(40,40) + (82,82),(41,41) + (84,84),(42,42) + (86,86),(43,43) + (88,88),(44,44) + (90,90),(45,45) + (92,92),(46,46) + (94,94),(47,47) + (96,96),(48,48) + (98,98),(49,49) + (100,100),(50,50) +(11 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &> '(40,30),(45,50)'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 &> '(45,50),(40,30)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 >> '(30,40),(40,30)'; + f1 +------------------- + (82,82),(41,41) + (84,84),(42,42) + (86,86),(43,43) + (88,88),(44,44) + (90,90),(45,45) + (92,92),(46,46) + (94,94),(47,47) + (96,96),(48,48) + (98,98),(49,49) + (100,100),(50,50) +(10 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 >> '(30,40),(40,30)'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 >> '(40,40),(30,30)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 <<| '(10,4.33334),(5,100)'; + f1 +-------------------------- + (2,2),(1,1) + (4,4),(2,2) + (40,4.3333333333),(-3,1) +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 <<| '(10,4.33334),(5,100)'; + QUERY PLAN +---------------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 <<| '(10,100),(5,4.33334)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 &<| '(10,4.3333334),(5,1)'; + f1 +-------------------------- + (2,2),(1,1) + (4,4),(2,2) + (40,4.3333333333),(-3,1) +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &<| '(10,4.3333334),(5,1)'; + QUERY PLAN +---------------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 &<| '(10,4.3333334),(5,1)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 |&> '(49.99,49.99),(49.99,49.99)'; + f1 +---------------------- + (100,100),(50,50) + (0,Infinity),(0,100) +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 |&> '(49.99,49.99),(49.99,49.99)'; + QUERY PLAN +----------------------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 |&> '(49.99,49.99),(49.99,49.99)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 |>> '(37,38),(39,40)'; + f1 +---------------------- + (82,82),(41,41) + (84,84),(42,42) + (86,86),(43,43) + (88,88),(44,44) + (90,90),(45,45) + (92,92),(46,46) + (94,94),(47,47) + (96,96),(48,48) + (98,98),(49,49) + (100,100),(50,50) + (0,Infinity),(0,100) +(11 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 |>> '(37,38),(39,40)'; + QUERY PLAN +----------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 |>> '(39,40),(37,38)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 @> '(10,11),(15,16)'; + f1 +------------------------------------------- + (16,16),(8,8) + (18,18),(9,9) + (20,20),(10,10) + (Infinity,Infinity),(-Infinity,-Infinity) +(4 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 @> '(10,11),(15,15)'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 @> '(15,15),(10,11)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 <@ '(10,15),(30,35)'; + f1 +----------------- + (30,30),(15,15) +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 <@ '(10,15),(30,35)'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 <@ '(30,35),(10,15)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)'; + f1 +----------------- + (40,40),(20,20) +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using box_spgist on box_temp + Index Cond: (f1 ~= '(40,40),(20,20)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +RESET enable_seqscan; +DROP INDEX box_spgist; +-- +-- Test the SP-GiST index on the larger volume of data +-- +CREATE TABLE quad_box_tbl (id int, b box); +INSERT INTO quad_box_tbl + SELECT (x - 1) * 100 + y, box(point(x * 10, y * 10), point(x * 10 + 5, y * 10 + 5)) + FROM generate_series(1, 100) x, + generate_series(1, 100) y; +-- insert repeating data to test allTheSame +INSERT INTO quad_box_tbl + SELECT i, '((200, 300),(210, 310))' + FROM generate_series(10001, 11000) AS i; +INSERT INTO quad_box_tbl +VALUES + (11001, NULL), + (11002, NULL), + (11003, '((-infinity,-infinity),(infinity,infinity))'), + (11004, '((-infinity,100),(-infinity,500))'), + (11005, '((-infinity,-infinity),(700,infinity))'); +CREATE INDEX quad_box_tbl_idx ON quad_box_tbl USING spgist(b); +-- get reference results for ORDER BY distance from seq scan +SET enable_seqscan = ON; +SET enable_indexscan = OFF; +SET enable_bitmapscan = OFF; +CREATE TABLE quad_box_tbl_ord_seq1 AS +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl; +CREATE TABLE quad_box_tbl_ord_seq2 AS +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))'; +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = ON; +SELECT count(*) FROM quad_box_tbl WHERE b << box '((100,200),(300,500))'; + count +------- + 901 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b &< box '((100,200),(300,500))'; + count +------- + 3901 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b && box '((100,200),(300,500))'; + count +------- + 1653 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b &> box '((100,200),(300,500))'; + count +------- + 10100 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b >> box '((100,200),(300,500))'; + count +------- + 7000 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b >> box '((100,200),(300,500))'; + count +------- + 7000 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b <<| box '((100,200),(300,500))'; + count +------- + 1900 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b &<| box '((100,200),(300,500))'; + count +------- + 5901 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b |&> box '((100,200),(300,500))'; + count +------- + 9100 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b |>> box '((100,200),(300,500))'; + count +------- + 5000 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b @> box '((201,301),(202,303))'; + count +------- + 1003 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b <@ box '((100,200),(300,500))'; + count +------- + 1600 +(1 row) + +SELECT count(*) FROM quad_box_tbl WHERE b ~= box '((200,300),(205,305))'; + count +------- + 1 +(1 row) + +-- test ORDER BY distance +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; +EXPLAIN (COSTS OFF) +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl; + QUERY PLAN +--------------------------------------------------------- + WindowAgg + Order By: (b <-> '(123,456)'::point) + -> Index Scan using quad_box_tbl_idx on quad_box_tbl + Order By: (b <-> '(123,456)'::point) + Optimizer: Postgres query optimizer +(5 rows) + +CREATE TEMP TABLE quad_box_tbl_ord_idx1 AS +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl; +SELECT * +FROM quad_box_tbl_ord_seq1 seq FULL JOIN quad_box_tbl_ord_idx1 idx + ON seq.n = idx.n AND seq.id = idx.id AND + (seq.dist = idx.dist OR seq.dist IS NULL AND idx.dist IS NULL) +WHERE seq.id IS NULL OR idx.id IS NULL; + n | dist | id | n | dist | id +---+------+----+---+------+---- +(0 rows) + +EXPLAIN (COSTS OFF) +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))'; + QUERY PLAN +--------------------------------------------------------- + WindowAgg + Order By: (b <-> '(123,456)'::point) + -> Index Scan using quad_box_tbl_idx on quad_box_tbl + Index Cond: (b <@ '(500,600),(200,300)'::box) + Order By: (b <-> '(123,456)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +CREATE TEMP TABLE quad_box_tbl_ord_idx2 AS +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))'; +SELECT * +FROM quad_box_tbl_ord_seq2 seq FULL JOIN quad_box_tbl_ord_idx2 idx + ON seq.n = idx.n AND seq.id = idx.id AND + (seq.dist = idx.dist OR seq.dist IS NULL AND idx.dist IS NULL) +WHERE seq.id IS NULL OR idx.id IS NULL; + n | dist | id | n | dist | id +---+------+----+---+------+---- +(0 rows) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/src/test/singlenode_regress/expected/brin.out b/src/test/singlenode_regress/expected/brin.out new file mode 100644 index 00000000000..c8c9b7633e6 --- /dev/null +++ b/src/test/singlenode_regress/expected/brin.out @@ -0,0 +1,561 @@ +CREATE TABLE brintest (byteacol bytea, + charcol "char", + namecol name, + int8col bigint, + int2col smallint, + int4col integer, + textcol text, + oidcol oid, + tidcol tid, + float4col real, + float8col double precision, + macaddrcol macaddr, + inetcol inet, + cidrcol cidr, + bpcharcol character, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + bitcol bit(10), + varbitcol bit varying(16), + numericcol numeric, + uuidcol uuid, + int4rangecol int4range, + lsncol pg_lsn, + boxcol box +) WITH (fillfactor=10, autovacuum_enabled=off); +INSERT INTO brintest SELECT + repeat(stringu1, 8)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 8), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 100; +-- throw in some NULL's and different values +INSERT INTO brintest (inetcol, cidrcol, int4rangecol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous, + 'empty'::int4range +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; +CREATE INDEX brinidx ON brintest USING brin ( + byteacol, + charcol, + namecol, + int8col, + int2col, + int4col, + textcol, + oidcol, + tidcol, + float4col, + float8col, + macaddrcol, + inetcol inet_inclusion_ops, + inetcol inet_minmax_ops, + cidrcol inet_inclusion_ops, + cidrcol inet_minmax_ops, + bpcharcol, + datecol, + timecol, + timestampcol, + timestamptzcol, + intervalcol, + timetzcol, + bitcol, + varbitcol, + numericcol, + uuidcol, + int4rangecol, + lsncol, + boxcol +) with (pages_per_range = 1); +CREATE TABLE brinopers (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); +INSERT INTO brinopers VALUES + ('byteacol', 'bytea', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZZZZZ, ZZZZZZ}', + '{100, 100, 1, 100, 100}'), + ('charcol', '"char"', + '{>, >=, =, <=, <}', + '{A, A, M, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('namecol', 'name', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, MAAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 2, 100, 100}'), + ('int2col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int8col', 'int2', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int4', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 1257141600, 1428427143, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('textcol', 'text', + '{>, >=, =, <=, <}', + '{ABABAB, ABABAB, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 1, 100, 100}'), + ('oidcol', 'oid', + '{>, >=, =, <=, <}', + '{0, 0, 8800, 9999, 9999}', + '{100, 100, 1, 100, 100}'), + ('tidcol', 'tid', + '{>, >=, =, <=, <}', + '{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}', + '{100, 100, 1, 100, 100}'), + ('float4col', 'float4', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float4col', 'float8', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float8col', 'float4', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('float8col', 'float8', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('macaddrcol', 'macaddr', + '{>, >=, =, <=, <}', + '{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}', + '{99, 100, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 1, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('inetcol', 'cidr', + '{&&, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'cidr', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('bpcharcol', 'bpchar', + '{>, >=, =, <=, <}', + '{A, A, W, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('datecol', 'date', + '{>, >=, =, <=, <}', + '{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}', + '{100, 100, 1, 100, 100}'), + ('timecol', 'time', + '{>, >=, =, <=, <}', + '{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamp', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestamptzcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}', + '{100, 100, 1, 100, 100}'), + ('intervalcol', 'interval', + '{>, >=, =, <=, <}', + '{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}', + '{100, 100, 1, 100, 100}'), + ('timetzcol', 'timetz', + '{>, >=, =, <=, <}', + '{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}', + '{99, 100, 2, 100, 100}'), + ('bitcol', 'bit(10)', + '{>, >=, =, <=, <}', + '{0000000010, 0000000010, 0011011110, 1111111000, 1111111000}', + '{100, 100, 1, 100, 100}'), + ('varbitcol', 'varbit(16)', + '{>, >=, =, <=, <}', + '{0000000000000100, 0000000000000100, 0001010001100110, 1111111111111000, 1111111111111000}', + '{100, 100, 1, 100, 100}'), + ('numericcol', 'numeric', + '{>, >=, =, <=, <}', + '{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}', + '{100, 100, 1, 100, 100}'), + ('uuidcol', 'uuid', + '{>, >=, =, <=, <}', + '{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}', + '{100, 100, 1, 100, 100}'), + ('int4rangecol', 'int4range', + '{<<, &<, &&, &>, >>, @>, <@, =, <, <=, >, >=}', + '{"[10000,)","[10000,)","(,]","[3,4)","[36,44)","(1500,1501]","[3,4)","[222,1222)","[36,44)","[43,1043)","[367,4466)","[519,)"}', + '{53, 53, 53, 53, 50, 22, 72, 1, 74, 75, 34, 21}'), + ('int4rangecol', 'int4range', + '{@>, <@, =, <=, >, >=}', + '{empty, empty, empty, empty, empty, empty}', + '{125, 72, 72, 72, 53, 125}'), + ('int4rangecol', 'int4', + '{@>}', + '{1500}', + '{22}'), + ('lsncol', 'pg_lsn', + '{>, >=, =, <=, <, IS, IS NOT}', + '{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}', + '{100, 100, 1, 100, 100, 25, 100}'), + ('boxcol', 'point', + '{@>}', + '{"(500,43)"}', + '{11}'), + ('boxcol', 'box', + '{<<, &<, &&, &>, >>, <<|, &<|, |&>, |>>, @>, <@, ~=}', + '{"((1000,2000),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3,4))","((1000,2000),(3000,4000))","((1,2000),(3,4000))","((1000,2),(3000,4))","((1,2),(3,4))","((1,2),(300,400))","((1,2),(3000,4000))","((222,1222),(44,45))"}', + '{100, 100, 100, 99, 96, 100, 100, 99, 96, 1, 99, 1}'); +DO $x$ +DECLARE + r record; + r2 record; + cond text; + idx_ctids tid[]; + ss_ctids tid[]; + count int; + plan_ok bool; + plan_line text; +BEGIN + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers, unnest(op) WITH ORDINALITY AS oper LOOP + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest WHERE %s $y$, cond) + INTO idx_ctids; + + -- run the query using a seqscan + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest WHERE %s $y$, cond) + INTO ss_ctids; + + -- make sure both return the same results + count := array_length(idx_ctids, 1); + + IF NOT (count = array_length(ss_ctids, 1) AND + idx_ctids @> ss_ctids AND + idx_ctids <@ ss_ctids) THEN + -- report the results of each scan to make the differences obvious + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + END LOOP; +END; +$x$; +RESET enable_seqscan; +RESET enable_bitmapscan; +INSERT INTO brintest SELECT + repeat(stringu1, 42)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 42), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; +SELECT brin_desummarize_range('brinidx', 0); + brin_desummarize_range +------------------------ + +(1 row) + +VACUUM brintest; -- force a summarization cycle in brinidx +UPDATE brintest SET int8col = int8col * int4col; +UPDATE brintest SET textcol = '' WHERE textcol IS NOT NULL; +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest'); -- error, not an index +ERROR: "brintest" is not an index +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +ERROR: "tenk1_unique1" is not a BRIN index +SELECT brin_summarize_new_values('brinidx'); -- ok, no change expected + brin_summarize_new_values +--------------------------- + 0 +(1 row) + +-- Tests for brin_desummarize_range +SELECT brin_desummarize_range('brinidx', -1); -- error, invalid range +ERROR: block number out of range: -1 +SELECT brin_desummarize_range('brinidx', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_desummarize_range('brinidx', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_desummarize_range('brinidx', 100000000); + brin_desummarize_range +------------------------ + +(1 row) + +-- Test brin_summarize_range +CREATE TABLE brin_summarize ( + value int +) WITH (fillfactor=10, autovacuum_enabled=false); +CREATE INDEX brin_summarize_idx ON brin_summarize USING brin (value) WITH (pages_per_range=2); +-- Fill a few pages +DO $$ +DECLARE curtid tid; +BEGIN + LOOP + INSERT INTO brin_summarize VALUES (1) RETURNING ctid INTO curtid; + EXIT WHEN curtid > tid '(2, 0)'; + END LOOP; +END; +$$; +-- summarize one range +SELECT brin_summarize_range('brin_summarize_idx', 0); +ERROR: Cloudberry could not summarize indicated page range (seg0 slice1 127.0.0.1:7002 pid=11998) +-- nothing: already summarized +SELECT brin_summarize_range('brin_summarize_idx', 1); +ERROR: Cloudberry could not summarize indicated page range (seg0 slice1 127.0.0.1:7002 pid=11998) +-- summarize one range +SELECT brin_summarize_range('brin_summarize_idx', 2); +ERROR: Cloudberry could not summarize indicated page range +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- summarize all pages +SELECT brin_summarize_range('brin_summarize_idx', 4294967295); + brin_summarize_range +---------------------- + 1 +(1 row) + +-- nothing: page doesn't exist in table +SELECT brin_summarize_range('brin_summarize_idx', 4294967295); + brin_summarize_range +---------------------- + 0 +(1 row) + +-- invalid block number values +SELECT brin_summarize_range('brin_summarize_idx', -1); +ERROR: block number out of range: -1 +SELECT brin_summarize_range('brin_summarize_idx', 4294967296); +ERROR: block number out of range: 4294967296 +-- test value merging in add_value +CREATE TABLE brintest_2 (n numrange); +CREATE INDEX brinidx_2 ON brintest_2 USING brin (n); +INSERT INTO brintest_2 VALUES ('empty'); +INSERT INTO brintest_2 VALUES (numrange(0, 2^1000::numeric)); +INSERT INTO brintest_2 VALUES ('(-1, 0)'); +SELECT brin_desummarize_range('brinidx', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_summarize_range('brinidx', 0); +ERROR: Cloudberry could not summarize indicated page range +DROP TABLE brintest_2; +-- test brin cost estimates behave sanely based on correlation of values +CREATE TABLE brin_test (a INT, b INT); +INSERT INTO brin_test SELECT x/100,x%100 FROM generate_series(1,10000) x(x); +CREATE INDEX brin_test_a_idx ON brin_test USING brin (a) WITH (pages_per_range = 2); +CREATE INDEX brin_test_b_idx ON brin_test USING brin (b) WITH (pages_per_range = 2); +VACUUM ANALYZE brin_test; +-- Ensure brin index is used when columns are perfectly correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test WHERE a = 1; + QUERY PLAN +-------------------------------------------- + Bitmap Heap Scan on brin_test + Recheck Cond: (a = 1) + -> Bitmap Index Scan on brin_test_a_idx + Index Cond: (a = 1) +(4 rows) + +-- Ensure brin index is not used when values are not correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test WHERE b = 1; + QUERY PLAN +----------------------- + Seq Scan on brin_test + Filter: (b = 1) +(2 rows) + +-- make sure data are properly de-toasted in BRIN index +CREATE TABLE brintest_3 (a text, b text, c text, d text); +-- long random strings (~2000 chars each, so ~6kB for min/max on two +-- columns) to trigger toasting +WITH rand_value AS (SELECT string_agg(md5(i::text),'') AS val FROM generate_series(1,60) s(i)) +INSERT INTO brintest_3 +SELECT val, val, val, val FROM rand_value; +CREATE INDEX brin_test_toast_idx ON brintest_3 USING brin (b, c); +DELETE FROM brintest_3; +-- We need to wait a bit for all transactions to complete, so that the +-- vacuum actually removes the TOAST rows. Creating an index concurrently +-- is a one way to achieve that, because it does exactly such wait. +CREATE INDEX CONCURRENTLY brin_test_temp_idx ON brintest_3(a); +DROP INDEX brin_test_temp_idx; +-- vacuum the table, to discard TOAST data +VACUUM brintest_3; +-- retry insert with a different random-looking (but deterministic) value +-- the value is different, and so should replace either min or max in the +-- brin summary +WITH rand_value AS (SELECT string_agg(md5((-i)::text),'') AS val FROM generate_series(1,60) s(i)) +INSERT INTO brintest_3 +SELECT val, val, val, val FROM rand_value; +-- now try some queries, accessing the brin index +SET enable_seqscan = off; +EXPLAIN (COSTS OFF) +SELECT * FROM brintest_3 WHERE b < '0'; + QUERY PLAN +------------------------------------------------ + Bitmap Heap Scan on brintest_3 + Recheck Cond: (b < '0'::text) + -> Bitmap Index Scan on brin_test_toast_idx + Index Cond: (b < '0'::text) +(4 rows) + +SELECT * FROM brintest_3 WHERE b < '0'; + a | b | c | d +---+---+---+--- +(0 rows) + +DROP TABLE brintest_3; +RESET enable_seqscan; diff --git a/src/test/singlenode_regress/expected/brin_ao.out b/src/test/singlenode_regress/expected/brin_ao.out new file mode 100644 index 00000000000..fceb50a29da --- /dev/null +++ b/src/test/singlenode_regress/expected/brin_ao.out @@ -0,0 +1,481 @@ +CREATE TABLE brintest_ao (byteacol bytea, + charcol "char", + namecol name, + int8col bigint, + int2col smallint, + int4col integer, + textcol text, + oidcol oid, + tidcol tid, + float4col real, + float8col double precision, + macaddrcol macaddr, + inetcol inet, + cidrcol cidr, + bpcharcol character, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + bitcol bit(10), + varbitcol bit varying(16), + numericcol numeric, + uuidcol uuid, + int4rangecol int4range, + lsncol pg_lsn, + boxcol box +) WITH (appendonly = true); +INSERT INTO brintest_ao SELECT + repeat(stringu1, 8)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 8), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 100; +-- throw in some NULL's and different values +INSERT INTO brintest_ao (inetcol, cidrcol, int4rangecol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous, + 'empty'::int4range +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; +CREATE INDEX brinaoidx ON brintest_ao USING brin ( + byteacol, + charcol, + namecol, + int8col, + int2col, + int4col, + textcol, + oidcol, + tidcol, + float4col, + float8col, + macaddrcol, + inetcol inet_inclusion_ops, + inetcol inet_minmax_ops, + cidrcol inet_inclusion_ops, + cidrcol inet_minmax_ops, + bpcharcol, + datecol, + timecol, + timestampcol, + timestamptzcol, + intervalcol, + timetzcol, + bitcol, + varbitcol, + numericcol, + uuidcol, + int4rangecol, + lsncol, + boxcol +) with (pages_per_range = 1); +CREATE TABLE brinopers_ao (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); +INSERT INTO brinopers_ao VALUES + ('byteacol', 'bytea', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZZZZZ, ZZZZZZ}', + '{100, 100, 1, 100, 100}'), + ('charcol', '"char"', + '{>, >=, =, <=, <}', + '{A, A, M, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('namecol', 'name', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, MAAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 2, 100, 100}'), + ('int2col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int8col', 'int2', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int4', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 1257141600, 1428427143, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('textcol', 'text', + '{>, >=, =, <=, <}', + '{ABABAB, ABABAB, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 1, 100, 100}'), + ('oidcol', 'oid', + '{>, >=, =, <=, <}', + '{0, 0, 8800, 9999, 9999}', + '{100, 100, 1, 100, 100}'), + ('tidcol', 'tid', + '{>, >=, =, <=, <}', + '{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}', + '{100, 100, 1, 100, 100}'), + ('float4col', 'float4', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float4col', 'float8', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float8col', 'float4', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('float8col', 'float8', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('macaddrcol', 'macaddr', + '{>, >=, =, <=, <}', + '{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}', + '{99, 100, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 1, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('inetcol', 'cidr', + '{&&, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'cidr', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('bpcharcol', 'bpchar', + '{>, >=, =, <=, <}', + '{A, A, W, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('datecol', 'date', + '{>, >=, =, <=, <}', + '{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}', + '{100, 100, 1, 100, 100}'), + ('timecol', 'time', + '{>, >=, =, <=, <}', + '{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamp', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestamptzcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}', + '{100, 100, 1, 100, 100}'), + ('intervalcol', 'interval', + '{>, >=, =, <=, <}', + '{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}', + '{100, 100, 1, 100, 100}'), + ('timetzcol', 'timetz', + '{>, >=, =, <=, <}', + '{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}', + '{99, 100, 2, 100, 100}'), + ('bitcol', 'bit(10)', + '{>, >=, =, <=, <}', + '{0000000010, 0000000010, 0011011110, 1111111000, 1111111000}', + '{100, 100, 1, 100, 100}'), + ('varbitcol', 'varbit(16)', + '{>, >=, =, <=, <}', + '{0000000000000100, 0000000000000100, 0001010001100110, 1111111111111000, 1111111111111000}', + '{100, 100, 1, 100, 100}'), + ('numericcol', 'numeric', + '{>, >=, =, <=, <}', + '{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}', + '{100, 100, 1, 100, 100}'), + ('uuidcol', 'uuid', + '{>, >=, =, <=, <}', + '{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}', + '{100, 100, 1, 100, 100}'), + ('int4rangecol', 'int4range', + '{<<, &<, &&, &>, >>, @>, <@, =, <, <=, >, >=}', + '{"[10000,)","[10000,)","(,]","[3,4)","[36,44)","(1500,1501]","[3,4)","[222,1222)","[36,44)","[43,1043)","[367,4466)","[519,)"}', + '{53, 53, 53, 53, 50, 22, 72, 1, 74, 75, 34, 21}'), + ('int4rangecol', 'int4range', + '{@>, <@, =, <=, >, >=}', + '{empty, empty, empty, empty, empty, empty}', + '{125, 72, 72, 72, 53, 125}'), + ('int4rangecol', 'int4', + '{@>}', + '{1500}', + '{22}'), + ('lsncol', 'pg_lsn', + '{>, >=, =, <=, <, IS, IS NOT}', + '{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}', + '{100, 100, 1, 100, 100, 25, 100}'), + ('boxcol', 'point', + '{@>}', + '{"(500,43)"}', + '{11}'), + ('boxcol', 'box', + '{<<, &<, &&, &>, >>, <<|, &<|, |&>, |>>, @>, <@, ~=}', + '{"((1000,2000),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3,4))","((1000,2000),(3000,4000))","((1,2000),(3,4000))","((1000,2),(3000,4))","((1,2),(3,4))","((1,2),(300,400))","((1,2),(3000,4000))","((222,1222),(44,45))"}', + '{100, 100, 100, 99, 96, 100, 100, 99, 96, 1, 99, 1}'); +DO $x$ +DECLARE + r record; + r2 record; + cond text; + count int; + mismatch bool; + is_orca bool; + plan_ok bool; + is_planner_plan bool; + plan_line text; +BEGIN + -- determine whether we are using ORCA or planner + is_orca := false; + FOR r IN EXECUTE 'show optimizer' LOOP + IF r.optimizer = 'on' THEN + is_orca := true; + END IF; + END LOOP; + + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_ao, unnest(op) WITH ORDINALITY AS oper order by colname, typ LOOP + mismatch := false; + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + CREATE TEMP TABLE brin_result (cid tid); + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + SET optimizer_enable_tablescan = 0; + SET optimizer_enable_bitmapscan = 1; + + plan_ok := false; + is_planner_plan := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT ctid FROM brintest_ao WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest_ao%' THEN + plan_ok := true; + END IF; + IF plan_line LIKE '%Postgres query optimizer%' THEN + is_planner_plan := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + -- in single node, orca is not enabled yet + -- IF is_orca AND is_planner_plan THEN + -- RAISE WARNING 'ORCA did not produce a bitmap indexscan plan for %', r; + -- END IF; + + EXECUTE format($y$INSERT INTO brin_result SELECT ctid FROM brintest_ao WHERE %s $y$, cond); + + -- run the query using a seqscan + CREATE TEMP TABLE brin_result_ss (cid tid); + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + SET optimizer_enable_tablescan = 1; + SET optimizer_enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT ctid FROM brintest_ao WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest_ao%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$INSERT INTO brin_result_ss SELECT ctid FROM brintest_ao WHERE %s $y$, cond); + + -- make sure both return the same results + PERFORM * FROM brin_result EXCEPT ALL SELECT * FROM brin_result_ss; + GET DIAGNOSTICS count = ROW_COUNT; + IF count <> 0 THEN + mismatch = true; + END IF; + PERFORM * FROM brin_result_ss EXCEPT ALL SELECT * FROM brin_result; + GET DIAGNOSTICS count = ROW_COUNT; + IF count <> 0 THEN + mismatch = true; + END IF; + + -- report the results of each scan to make the differences obvious + IF mismatch THEN + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + SET optimizer_enable_tablescan = 1; + SET optimizer_enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_ao WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + SET optimizer_enable_tablescan = 0; + SET optimizer_enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_ao WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + SELECT count(*) INTO count FROM brin_result; + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + + -- drop the temporary tables + DROP TABLE brin_result; + DROP TABLE brin_result_ss; + END LOOP; +END; +$x$; +-- Note: ORCA does not support all of the above operators: +-- - standard comparison operators on inet and cidr columns +-- because ORCA does not look at the second occurrence of a column in an index, +-- even if it uses a different operator class +-- - IS NULL and IS NOT NULL operators, because ORCA supports only binary operators +-- - namecol predicates, falls back because of the use of a non-default collation +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET optimizer_enable_tablescan; +RESET optimizer_enable_bitmapscan; +INSERT INTO brintest_ao SELECT + repeat(stringu1, 42)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 42), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; +VACUUM brintest_ao; -- force a summarization cycle in brinaoidx +UPDATE brintest_ao SET int8col = int8col * int4col; +UPDATE brintest_ao SET textcol = '' WHERE textcol IS NOT NULL; +-- Vaccum again so that a new segment file is created. +VACUUM brintest_ao; +INSERT INTO brintest_ao SELECT * FROM brintest_ao; +-- We should have two segment files per Cloudberry segment (QE). +-- start_ignore +SELECT segment_id, segno, tupcount, state FROM gp_toolkit.__gp_aoseg('brintest_ao'); + segment_id | segno | tupcount | state +------------+-------+----------+------- + 2 | 1 | 120 | 2 + 2 | 2 | 80 | 1 + 0 | 1 | 128 | 2 + 0 | 2 | 102 | 1 + 1 | 1 | 117 | 2 + 1 | 2 | 78 | 1 +(6 rows) + +-- end_ignore +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest_ao'); -- error, not an index +ERROR: "brintest_ao" is not an index +CONTEXT: SQL function "brin_summarize_new_values" statement 1 +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +ERROR: "tenk1_unique1" is not a BRIN index +CONTEXT: SQL function "brin_summarize_new_values" statement 1 +-- New strategy of VACUUM AO/CO was introduced by PR #13255 for performance enhancement. +-- Index dead tuples will not always be cleaned up completely after VACUUM, resulting +-- brin_summarize_new_values() will not always be accurate. So ignore the check to +-- coordinate with the new behavior. +-- start_ignore +SELECT brin_summarize_new_values('brinaoidx'); -- ok, no change expected +brin_summarize_new_values +--------------------------- + 0 +(1 row) + +-- end_ignore diff --git a/src/test/singlenode_regress/expected/brin_aocs.out b/src/test/singlenode_regress/expected/brin_aocs.out new file mode 100644 index 00000000000..cc5ea994035 --- /dev/null +++ b/src/test/singlenode_regress/expected/brin_aocs.out @@ -0,0 +1,481 @@ +CREATE TABLE brintest_aocs (byteacol bytea, + charcol "char", + namecol name, + int8col bigint, + int2col smallint, + int4col integer, + textcol text, + oidcol oid, + tidcol tid, + float4col real, + float8col double precision, + macaddrcol macaddr, + inetcol inet, + cidrcol cidr, + bpcharcol character, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + bitcol bit(10), + varbitcol bit varying(16), + numericcol numeric, + uuidcol uuid, + int4rangecol int4range, + lsncol pg_lsn, + boxcol box +) WITH (appendonly = true, orientation=column); +INSERT INTO brintest_aocs SELECT + repeat(stringu1, 8)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 8), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 100; +-- throw in some NULL's and different values +INSERT INTO brintest_aocs (inetcol, cidrcol, int4rangecol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous, + 'empty'::int4range +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; +CREATE INDEX brinaocsidx ON brintest_aocs USING brin ( + byteacol, + charcol, + namecol, + int8col, + int2col, + int4col, + textcol, + oidcol, + tidcol, + float4col, + float8col, + macaddrcol, + inetcol inet_inclusion_ops, + inetcol inet_minmax_ops, + cidrcol inet_inclusion_ops, + cidrcol inet_minmax_ops, + bpcharcol, + datecol, + timecol, + timestampcol, + timestamptzcol, + intervalcol, + timetzcol, + bitcol, + varbitcol, + numericcol, + uuidcol, + int4rangecol, + lsncol, + boxcol +) with (pages_per_range = 1); +CREATE TABLE brinopers_aocs (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); +INSERT INTO brinopers_aocs VALUES + ('byteacol', 'bytea', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZZZZZ, ZZZZZZ}', + '{100, 100, 1, 100, 100}'), + ('charcol', '"char"', + '{>, >=, =, <=, <}', + '{A, A, M, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('namecol', 'name', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, MAAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 2, 100, 100}'), + ('int2col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int8col', 'int2', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int4', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 1257141600, 1428427143, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('textcol', 'text', + '{>, >=, =, <=, <}', + '{ABABAB, ABABAB, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 1, 100, 100}'), + ('oidcol', 'oid', + '{>, >=, =, <=, <}', + '{0, 0, 8800, 9999, 9999}', + '{100, 100, 1, 100, 100}'), + ('tidcol', 'tid', + '{>, >=, =, <=, <}', + '{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}', + '{100, 100, 1, 100, 100}'), + ('float4col', 'float4', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float4col', 'float8', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float8col', 'float4', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('float8col', 'float8', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('macaddrcol', 'macaddr', + '{>, >=, =, <=, <}', + '{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}', + '{99, 100, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 1, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('inetcol', 'cidr', + '{&&, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'cidr', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('bpcharcol', 'bpchar', + '{>, >=, =, <=, <}', + '{A, A, W, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('datecol', 'date', + '{>, >=, =, <=, <}', + '{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}', + '{100, 100, 1, 100, 100}'), + ('timecol', 'time', + '{>, >=, =, <=, <}', + '{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamp', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestamptzcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}', + '{100, 100, 1, 100, 100}'), + ('intervalcol', 'interval', + '{>, >=, =, <=, <}', + '{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}', + '{100, 100, 1, 100, 100}'), + ('timetzcol', 'timetz', + '{>, >=, =, <=, <}', + '{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}', + '{99, 100, 2, 100, 100}'), + ('bitcol', 'bit(10)', + '{>, >=, =, <=, <}', + '{0000000010, 0000000010, 0011011110, 1111111000, 1111111000}', + '{100, 100, 1, 100, 100}'), + ('varbitcol', 'varbit(16)', + '{>, >=, =, <=, <}', + '{0000000000000100, 0000000000000100, 0001010001100110, 1111111111111000, 1111111111111000}', + '{100, 100, 1, 100, 100}'), + ('numericcol', 'numeric', + '{>, >=, =, <=, <}', + '{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}', + '{100, 100, 1, 100, 100}'), + ('uuidcol', 'uuid', + '{>, >=, =, <=, <}', + '{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}', + '{100, 100, 1, 100, 100}'), + ('int4rangecol', 'int4range', + '{<<, &<, &&, &>, >>, @>, <@, =, <, <=, >, >=}', + '{"[10000,)","[10000,)","(,]","[3,4)","[36,44)","(1500,1501]","[3,4)","[222,1222)","[36,44)","[43,1043)","[367,4466)","[519,)"}', + '{53, 53, 53, 53, 50, 22, 72, 1, 74, 75, 34, 21}'), + ('int4rangecol', 'int4range', + '{@>, <@, =, <=, >, >=}', + '{empty, empty, empty, empty, empty, empty}', + '{125, 72, 72, 72, 53, 125}'), + ('int4rangecol', 'int4', + '{@>}', + '{1500}', + '{22}'), + ('lsncol', 'pg_lsn', + '{>, >=, =, <=, <, IS, IS NOT}', + '{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}', + '{100, 100, 1, 100, 100, 25, 100}'), + ('boxcol', 'point', + '{@>}', + '{"(500,43)"}', + '{11}'), + ('boxcol', 'box', + '{<<, &<, &&, &>, >>, <<|, &<|, |&>, |>>, @>, <@, ~=}', + '{"((1000,2000),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3,4))","((1000,2000),(3000,4000))","((1,2000),(3,4000))","((1000,2),(3000,4))","((1,2),(3,4))","((1,2),(300,400))","((1,2),(3000,4000))","((222,1222),(44,45))"}', + '{100, 100, 100, 99, 96, 100, 100, 99, 96, 1, 99, 1}'); +DO $x$ +DECLARE + r record; + r2 record; + cond text; + count int; + mismatch bool; + is_orca bool; + plan_ok bool; + is_planner_plan bool; + plan_line text; +BEGIN + -- determine whether we are using ORCA or planner + is_orca := false; + FOR r IN EXECUTE 'show optimizer' LOOP + IF r.optimizer = 'on' THEN + is_orca := true; + END IF; + END LOOP; + + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_aocs, unnest(op) WITH ORDINALITY AS oper order by colname, typ LOOP + mismatch := false; + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + CREATE TEMP TABLE brin_result (cid tid); + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + SET optimizer_enable_tablescan = 0; + SET optimizer_enable_bitmapscan = 1; + + plan_ok := false; + is_planner_plan := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT ctid FROM brintest_aocs WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest_aocs%' THEN + plan_ok := true; + END IF; + IF plan_line LIKE '%Postgres query optimizer%' THEN + is_planner_plan := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + -- in single node, orca is not enabled yet + -- IF is_orca AND is_planner_plan THEN + -- RAISE WARNING 'ORCA did not produce a bitmap indexscan plan for %', r; + -- END IF; + + EXECUTE format($y$INSERT INTO brin_result SELECT ctid FROM brintest_aocs WHERE %s $y$, cond); + + -- run the query using a seqscan + CREATE TEMP TABLE brin_result_ss (cid tid); + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + SET optimizer_enable_tablescan = 1; + SET optimizer_enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT ctid FROM brintest_aocs WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest_aocs%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$INSERT INTO brin_result_ss SELECT ctid FROM brintest_aocs WHERE %s $y$, cond); + + -- make sure both return the same results + PERFORM * FROM brin_result EXCEPT ALL SELECT * FROM brin_result_ss; + GET DIAGNOSTICS count = ROW_COUNT; + IF count <> 0 THEN + mismatch = true; + END IF; + PERFORM * FROM brin_result_ss EXCEPT ALL SELECT * FROM brin_result; + GET DIAGNOSTICS count = ROW_COUNT; + IF count <> 0 THEN + mismatch = true; + END IF; + + -- report the results of each scan to make the differences obvious + IF mismatch THEN + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + SET optimizer_enable_tablescan = 1; + SET optimizer_enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_aocs WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + SET optimizer_enable_tablescan = 0; + SET optimizer_enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_aocs WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + SELECT count(*) INTO count FROM brin_result; + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + + -- drop the temporary tables + DROP TABLE brin_result; + DROP TABLE brin_result_ss; + END LOOP; +END; +$x$; +-- Note: ORCA does not support all of the above operators: +-- - standard comparison operators on inet and cidr columns +-- because ORCA does not look at the second occurrence of a column in an index, +-- even if it uses a different operator class +-- - IS NULL and IS NOT NULL operators, because ORCA supports only binary operators +-- - namecol predicates, falls back because of the use of a non-default collation +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET optimizer_enable_tablescan; +RESET optimizer_enable_bitmapscan; +INSERT INTO brintest_aocs SELECT + repeat(stringu1, 42)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 42), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; +VACUUM brintest_aocs; -- force a summarization cycle in brinaocsidx +UPDATE brintest_aocs SET int8col = int8col * int4col; +UPDATE brintest_aocs SET textcol = '' WHERE textcol IS NOT NULL; +-- Vaccum again so that a new segment file is created. +VACUUM brintest_aocs; +INSERT INTO brintest_aocs SELECT * FROM brintest_aocs; +-- We should have two segment files per Cloudberry segment (QE). +-- start_ignore +SELECT segment_id, segno, tupcount, state FROM gp_toolkit.__gp_aocsseg('brintest_aocs'); + segment_id | segno | tupcount | state +------------+-------+----------+------- + 1 | 1 | 78 | 1 + 1 | 2 | 78 | 1 + 2 | 1 | 80 | 1 + 2 | 2 | 80 | 1 + 0 | 1 | 102 | 1 + 0 | 2 | 102 | 1 +(6 rows) + +-- end_ignore +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest_aocs'); -- error, not an index +ERROR: "brintest_aocs" is not an index +CONTEXT: SQL function "brin_summarize_new_values" statement 1 +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +ERROR: "tenk1_unique1" is not a BRIN index +CONTEXT: SQL function "brin_summarize_new_values" statement 1 +-- New strategy of VACUUM AO/CO was introduced by PR #13255 for performance enhancement. +-- Index dead tuples will not always be cleaned up completely after VACUUM, resulting +-- brin_summarize_new_values() will not always be accurate. So ignore the check to +-- coordinate with the new behavior. +-- start_ignore +SELECT brin_summarize_new_values('brinaocsidx'); -- ok, no change expected + brin_summarize_new_values +--------------------------- + 0 +(1 row) + +-- end_ignore \ No newline at end of file diff --git a/src/test/singlenode_regress/expected/brin_bloom.out b/src/test/singlenode_regress/expected/brin_bloom.out new file mode 100644 index 00000000000..1f0b96ca3e9 --- /dev/null +++ b/src/test/singlenode_regress/expected/brin_bloom.out @@ -0,0 +1,425 @@ +CREATE TABLE brintest_bloom (byteacol bytea, + charcol "char", + namecol name, + int8col bigint, + int2col smallint, + int4col integer, + textcol text, + oidcol oid, + float4col real, + float8col double precision, + macaddrcol macaddr, + inetcol inet, + cidrcol cidr, + bpcharcol character, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + numericcol numeric, + uuidcol uuid, + lsncol pg_lsn +) WITH (fillfactor=10); +INSERT INTO brintest_bloom SELECT + repeat(stringu1, 8)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 8), + unique1::oid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + format('%s/%s%s', odd, even, tenthous)::pg_lsn +FROM tenk1 ORDER BY unique2 LIMIT 100; +-- throw in some NULL's and different values +INSERT INTO brintest_bloom (inetcol, cidrcol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; +-- test bloom specific index options +-- ndistinct must be >= -1.0 +CREATE INDEX brinidx_bloom ON brintest_bloom USING brin ( + byteacol bytea_bloom_ops(n_distinct_per_range = -1.1) +); +ERROR: value -1.1 out of bounds for option "n_distinct_per_range" +DETAIL: Valid values are between "-1.000000" and "2147483647.000000". +-- false_positive_rate must be between 0.0001 and 0.25 +CREATE INDEX brinidx_bloom ON brintest_bloom USING brin ( + byteacol bytea_bloom_ops(false_positive_rate = 0.00009) +); +ERROR: value 0.00009 out of bounds for option "false_positive_rate" +DETAIL: Valid values are between "0.000100" and "0.250000". +CREATE INDEX brinidx_bloom ON brintest_bloom USING brin ( + byteacol bytea_bloom_ops(false_positive_rate = 0.26) +); +ERROR: value 0.26 out of bounds for option "false_positive_rate" +DETAIL: Valid values are between "0.000100" and "0.250000". +CREATE INDEX brinidx_bloom ON brintest_bloom USING brin ( + byteacol bytea_bloom_ops, + charcol char_bloom_ops, + namecol name_bloom_ops, + int8col int8_bloom_ops, + int2col int2_bloom_ops, + int4col int4_bloom_ops, + textcol text_bloom_ops, + oidcol oid_bloom_ops, + float4col float4_bloom_ops, + float8col float8_bloom_ops, + macaddrcol macaddr_bloom_ops, + inetcol inet_bloom_ops, + cidrcol inet_bloom_ops, + bpcharcol bpchar_bloom_ops, + datecol date_bloom_ops, + timecol time_bloom_ops, + timestampcol timestamp_bloom_ops, + timestamptzcol timestamptz_bloom_ops, + intervalcol interval_bloom_ops, + timetzcol timetz_bloom_ops, + numericcol numeric_bloom_ops, + uuidcol uuid_bloom_ops, + lsncol pg_lsn_bloom_ops +) with (pages_per_range = 1); +CREATE TABLE brinopers_bloom (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); +INSERT INTO brinopers_bloom VALUES + ('byteacol', 'bytea', + '{=}', + '{BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA}', + '{1}'), + ('charcol', '"char"', + '{=}', + '{M}', + '{6}'), + ('namecol', 'name', + '{=}', + '{MAAAAA}', + '{2}'), + ('int2col', 'int2', + '{=}', + '{800}', + '{1}'), + ('int4col', 'int4', + '{=}', + '{800}', + '{1}'), + ('int8col', 'int8', + '{=}', + '{1257141600}', + '{1}'), + ('textcol', 'text', + '{=}', + '{BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA}', + '{1}'), + ('oidcol', 'oid', + '{=}', + '{8800}', + '{1}'), + ('float4col', 'float4', + '{=}', + '{1}', + '{4}'), + ('float8col', 'float8', + '{=}', + '{0}', + '{1}'), + ('macaddrcol', 'macaddr', + '{=}', + '{2c:00:2d:00:16:00}', + '{2}'), + ('inetcol', 'inet', + '{=}', + '{10.2.14.231/24}', + '{1}'), + ('inetcol', 'cidr', + '{=}', + '{fe80::6e40:8ff:fea9:8c46}', + '{1}'), + ('cidrcol', 'inet', + '{=}', + '{10.2.14/24}', + '{2}'), + ('cidrcol', 'inet', + '{=}', + '{fe80::6e40:8ff:fea9:8c46}', + '{1}'), + ('cidrcol', 'cidr', + '{=}', + '{10.2.14/24}', + '{2}'), + ('cidrcol', 'cidr', + '{=}', + '{fe80::6e40:8ff:fea9:8c46}', + '{1}'), + ('bpcharcol', 'bpchar', + '{=}', + '{W}', + '{6}'), + ('datecol', 'date', + '{=}', + '{2009-12-01}', + '{1}'), + ('timecol', 'time', + '{=}', + '{02:28:57}', + '{1}'), + ('timestampcol', 'timestamp', + '{=}', + '{1964-03-24 19:26:45}', + '{1}'), + ('timestamptzcol', 'timestamptz', + '{=}', + '{1972-10-19 09:00:00-07}', + '{1}'), + ('intervalcol', 'interval', + '{=}', + '{1 mons 13 days 12:24}', + '{1}'), + ('timetzcol', 'timetz', + '{=}', + '{01:35:50+02}', + '{2}'), + ('numericcol', 'numeric', + '{=}', + '{2268164.347826086956521739130434782609}', + '{1}'), + ('uuidcol', 'uuid', + '{=}', + '{52225222-5222-5222-5222-522252225222}', + '{1}'), + ('lsncol', 'pg_lsn', + '{=, IS, IS NOT}', + '{44/455222, NULL, NULL}', + '{1, 25, 100}'); +DO $x$ +DECLARE + r record; + r2 record; + cond text; + idx_ctids tid[]; + ss_ctids tid[]; + count int; + plan_ok bool; + plan_line text; +BEGIN + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_bloom, unnest(op) WITH ORDINALITY AS oper LOOP + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest_bloom%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) + INTO idx_ctids; + + -- run the query using a seqscan + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest_bloom%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) + INTO ss_ctids; + + -- make sure both return the same results + count := array_length(idx_ctids, 1); + + IF NOT (count = array_length(ss_ctids, 1) AND + idx_ctids @> ss_ctids AND + idx_ctids <@ ss_ctids) THEN + -- report the results of each scan to make the differences obvious + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_bloom WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_bloom WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + END LOOP; +END; +$x$; +RESET enable_seqscan; +RESET enable_bitmapscan; +INSERT INTO brintest_bloom SELECT + repeat(stringu1, 42)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 42), + unique1::oid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + format('%s/%s%s', odd, even, tenthous)::pg_lsn +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; +SELECT brin_desummarize_range('brinidx_bloom', 0); + brin_desummarize_range +------------------------ + +(1 row) + +VACUUM brintest_bloom; -- force a summarization cycle in brinidx +UPDATE brintest_bloom SET int8col = int8col * int4col; +UPDATE brintest_bloom SET textcol = '' WHERE textcol IS NOT NULL; +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest_bloom'); -- error, not an index +ERROR: "brintest_bloom" is not an index +CONTEXT: SQL function "brin_summarize_new_values" statement 1 +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +ERROR: "tenk1_unique1" is not a BRIN index +CONTEXT: SQL function "brin_summarize_new_values" statement 1 +SELECT brin_summarize_new_values('brinidx_bloom'); -- ok, no change expected (except for ORCA, which uses split updates) + brin_summarize_new_values +--------------------------- + 0 +(1 row) + +-- Tests for brin_desummarize_range +SELECT brin_desummarize_range('brinidx_bloom', -1); -- error, invalid range +ERROR: block number out of range: -1 +SELECT brin_desummarize_range('brinidx_bloom', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_desummarize_range('brinidx_bloom', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_desummarize_range('brinidx_bloom', 100000000); + brin_desummarize_range +------------------------ + +(1 row) + +-- Test brin_summarize_range +CREATE TABLE brin_summarize_bloom ( + value int +) WITH (fillfactor=10, autovacuum_enabled=false); +CREATE INDEX brin_summarize_bloom_idx ON brin_summarize_bloom USING brin (value) WITH (pages_per_range=2); +-- Fill a few pages +DO $$ +DECLARE curtid tid; +BEGIN + LOOP + INSERT INTO brin_summarize_bloom VALUES (1) RETURNING ctid INTO curtid; + EXIT WHEN curtid > tid '(2, 0)'; + END LOOP; +END; +$$; +-- summarize one range +SELECT brin_summarize_range('brin_summarize_bloom_idx', 0); +ERROR: Cloudberry could not summarize indicated page range +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- nothing: already summarized +SELECT brin_summarize_range('brin_summarize_bloom_idx', 1); +ERROR: Cloudberry could not summarize indicated page range +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- summarize one range +SELECT brin_summarize_range('brin_summarize_bloom_idx', 2); +ERROR: Cloudberry could not summarize indicated page range +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- nothing: page doesn't exist in table +SELECT brin_summarize_range('brin_summarize_bloom_idx', 4294967295); + brin_summarize_range +---------------------- + 1 +(1 row) + +-- invalid block number values +SELECT brin_summarize_range('brin_summarize_bloom_idx', -1); +ERROR: block number out of range: -1 +CONTEXT: SQL function "brin_summarize_range" statement 1 +SELECT brin_summarize_range('brin_summarize_bloom_idx', 4294967296); +ERROR: block number out of range: 4294967296 +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- test brin cost estimates behave sanely based on correlation of values +CREATE TABLE brin_test_bloom (a INT, b INT); +INSERT INTO brin_test_bloom SELECT x/100,x%100 FROM generate_series(1,10000) x(x); +CREATE INDEX brin_test_bloom_a_idx ON brin_test_bloom USING brin (a) WITH (pages_per_range = 2); +CREATE INDEX brin_test_bloom_b_idx ON brin_test_bloom USING brin (b) WITH (pages_per_range = 2); +VACUUM ANALYZE brin_test_bloom; +-- Ensure brin index is used when columns are perfectly correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test_bloom WHERE a = 1; + QUERY PLAN +-------------------------------------------------- + Bitmap Heap Scan on brin_test_bloom + Recheck Cond: (a = 1) + -> Bitmap Index Scan on brin_test_bloom_a_idx + Index Cond: (a = 1) + Optimizer: Postgres query optimizer +(5 rows) + +-- Ensure brin index is not used when values are not correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test_bloom WHERE b = 1; + QUERY PLAN +------------------------------------- + Seq Scan on brin_test_bloom + Filter: (b = 1) + Optimizer: Postgres query optimizer +(3 rows) + diff --git a/src/test/singlenode_regress/expected/brin_multi.out b/src/test/singlenode_regress/expected/brin_multi.out new file mode 100644 index 00000000000..e88af5de7e3 --- /dev/null +++ b/src/test/singlenode_regress/expected/brin_multi.out @@ -0,0 +1,460 @@ +CREATE TABLE brintest_multi ( + int8col bigint, + int2col smallint, + int4col integer, + oidcol oid, + tidcol tid, + float4col real, + float8col double precision, + macaddrcol macaddr, + macaddr8col macaddr8, + inetcol inet, + cidrcol cidr, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + numericcol numeric, + uuidcol uuid, + lsncol pg_lsn +) WITH (fillfactor=10); +INSERT INTO brintest_multi SELECT + 142857 * tenthous, + thousand, + twothousand, + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + substr(md5(unique1::text), 1, 16)::macaddr8, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + format('%s/%s%s', odd, even, tenthous)::pg_lsn +FROM tenk1 ORDER BY unique2 LIMIT 100; +-- throw in some NULL's and different values +INSERT INTO brintest_multi (inetcol, cidrcol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; +-- test minmax-multi specific index options +-- number of values must be >= 16 +CREATE INDEX brinidx_multi ON brintest_multi USING brin ( + int8col int8_minmax_multi_ops(values_per_range = 7) +); +ERROR: value 7 out of bounds for option "values_per_range" +DETAIL: Valid values are between "8" and "256". +-- number of values must be <= 256 +CREATE INDEX brinidx_multi ON brintest_multi USING brin ( + int8col int8_minmax_multi_ops(values_per_range = 257) +); +ERROR: value 257 out of bounds for option "values_per_range" +DETAIL: Valid values are between "8" and "256". +-- first create an index with a single page range, to force compaction +-- due to exceeding the number of values per summary +CREATE INDEX brinidx_multi ON brintest_multi USING brin ( + int8col int8_minmax_multi_ops, + int2col int2_minmax_multi_ops, + int4col int4_minmax_multi_ops, + oidcol oid_minmax_multi_ops, + tidcol tid_minmax_multi_ops, + float4col float4_minmax_multi_ops, + float8col float8_minmax_multi_ops, + macaddrcol macaddr_minmax_multi_ops, + macaddr8col macaddr8_minmax_multi_ops, + inetcol inet_minmax_multi_ops, + cidrcol inet_minmax_multi_ops, + datecol date_minmax_multi_ops, + timecol time_minmax_multi_ops, + timestampcol timestamp_minmax_multi_ops, + timestamptzcol timestamptz_minmax_multi_ops, + intervalcol interval_minmax_multi_ops, + timetzcol timetz_minmax_multi_ops, + numericcol numeric_minmax_multi_ops, + uuidcol uuid_minmax_multi_ops, + lsncol pg_lsn_minmax_multi_ops +); +DROP INDEX brinidx_multi; +CREATE INDEX brinidx_multi ON brintest_multi USING brin ( + int8col int8_minmax_multi_ops, + int2col int2_minmax_multi_ops, + int4col int4_minmax_multi_ops, + oidcol oid_minmax_multi_ops, + tidcol tid_minmax_multi_ops, + float4col float4_minmax_multi_ops, + float8col float8_minmax_multi_ops, + macaddrcol macaddr_minmax_multi_ops, + macaddr8col macaddr8_minmax_multi_ops, + inetcol inet_minmax_multi_ops, + cidrcol inet_minmax_multi_ops, + datecol date_minmax_multi_ops, + timecol time_minmax_multi_ops, + timestampcol timestamp_minmax_multi_ops, + timestamptzcol timestamptz_minmax_multi_ops, + intervalcol interval_minmax_multi_ops, + timetzcol timetz_minmax_multi_ops, + numericcol numeric_minmax_multi_ops, + uuidcol uuid_minmax_multi_ops, + lsncol pg_lsn_minmax_multi_ops +) with (pages_per_range = 1); +CREATE TABLE brinopers_multi (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); +INSERT INTO brinopers_multi VALUES + ('int2col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int8col', 'int2', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int4', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 1257141600, 1428427143, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('oidcol', 'oid', + '{>, >=, =, <=, <}', + '{0, 0, 8800, 9999, 9999}', + '{100, 100, 1, 100, 100}'), + ('tidcol', 'tid', + '{>, >=, =, <=, <}', + '{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}', + '{100, 100, 1, 100, 100}'), + ('float4col', 'float4', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float4col', 'float8', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float8col', 'float4', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('float8col', 'float8', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('macaddrcol', 'macaddr', + '{>, >=, =, <=, <}', + '{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}', + '{99, 100, 2, 100, 100}'), + ('macaddr8col', 'macaddr8', + '{>, >=, =, <=, <}', + '{b1:d1:0e:7b:af:a4:42:12, d9:35:91:bd:f7:86:0e:1e, 72:8f:20:6c:2a:01:bf:57, 23:e8:46:63:86:07:ad:cb, 13:16:8e:6a:2e:6c:84:b4}', + '{33, 15, 1, 13, 6}'), + ('inetcol', 'inet', + '{=, <, <=, >, >=}', + '{10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}', + '{1, 100, 100, 125, 125}'), + ('inetcol', 'cidr', + '{<, <=, >, >=}', + '{255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}', + '{100, 100, 125, 125}'), + ('cidrcol', 'inet', + '{=, <, <=, >, >=}', + '{10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}', + '{2, 100, 100, 125, 125}'), + ('cidrcol', 'cidr', + '{=, <, <=, >, >=}', + '{10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}', + '{2, 100, 100, 125, 125}'), + ('datecol', 'date', + '{>, >=, =, <=, <}', + '{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}', + '{100, 100, 1, 100, 100}'), + ('timecol', 'time', + '{>, >=, =, <=, <}', + '{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamp', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestamptzcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}', + '{100, 100, 1, 100, 100}'), + ('intervalcol', 'interval', + '{>, >=, =, <=, <}', + '{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}', + '{100, 100, 1, 100, 100}'), + ('timetzcol', 'timetz', + '{>, >=, =, <=, <}', + '{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}', + '{99, 100, 2, 100, 100}'), + ('numericcol', 'numeric', + '{>, >=, =, <=, <}', + '{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}', + '{100, 100, 1, 100, 100}'), + ('uuidcol', 'uuid', + '{>, >=, =, <=, <}', + '{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}', + '{100, 100, 1, 100, 100}'), + ('lsncol', 'pg_lsn', + '{>, >=, =, <=, <, IS, IS NOT}', + '{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}', + '{100, 100, 1, 100, 100, 25, 100}'); +ANALYZE brintest_multi; +DO $x$ +DECLARE + r record; + r2 record; + cond text; + idx_ctids tid[]; + ss_ctids tid[]; + count int; + plan_ok bool; + plan_line text; +BEGIN + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_multi, unnest(op) WITH ORDINALITY AS oper LOOP + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest_multi%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) + INTO idx_ctids; + + -- run the query using a seqscan + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest_multi%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) + INTO ss_ctids; + + -- make sure both return the same results + count := array_length(idx_ctids, 1); + + IF NOT (count = array_length(ss_ctids, 1) AND + idx_ctids @> ss_ctids AND + idx_ctids <@ ss_ctids) THEN + -- report the results of each scan to make the differences obvious + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_multi WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_multi WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + END LOOP; +END; +$x$; +RESET enable_seqscan; +RESET enable_bitmapscan; +INSERT INTO brintest_multi SELECT + 142857 * tenthous, + thousand, + twothousand, + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + substr(md5(unique1::text), 1, 16)::macaddr8, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + format('%s/%s%s', odd, even, tenthous)::pg_lsn +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; +SELECT brin_desummarize_range('brinidx_multi', 0); + brin_desummarize_range +------------------------ + +(1 row) + +VACUUM brintest_multi; -- force a summarization cycle in brinidx +-- Try inserting a values with NaN, to test distance calculation. +insert into public.brintest_multi (float4col) values (real 'nan'); +insert into public.brintest_multi (float8col) values (real 'nan'); +UPDATE brintest_multi SET int8col = int8col * int4col; +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest_multi'); -- error, not an index +ERROR: "brintest_multi" is not an index +CONTEXT: SQL function "brin_summarize_new_values" statement 1 +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +ERROR: "tenk1_unique1" is not a BRIN index +CONTEXT: SQL function "brin_summarize_new_values" statement 1 +SELECT brin_summarize_new_values('brinidx_multi'); -- ok, no change expected + brin_summarize_new_values +--------------------------- + 0 +(1 row) + +-- Tests for brin_desummarize_range +SELECT brin_desummarize_range('brinidx_multi', -1); -- error, invalid range +ERROR: block number out of range: -1 +SELECT brin_desummarize_range('brinidx_multi', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_desummarize_range('brinidx_multi', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_desummarize_range('brinidx_multi', 100000000); + brin_desummarize_range +------------------------ + +(1 row) + +-- test building an index with many values, to force compaction of the buffer +CREATE TABLE brin_large_range (a int4); +INSERT INTO brin_large_range SELECT i FROM generate_series(1,10000) s(i); +CREATE INDEX brin_large_range_idx ON brin_large_range USING brin (a int4_minmax_multi_ops); +DROP TABLE brin_large_range; +-- Test brin_summarize_range +CREATE TABLE brin_summarize_multi ( + value int +) WITH (fillfactor=10, autovacuum_enabled=false); +CREATE INDEX brin_summarize_multi_idx ON brin_summarize_multi USING brin (value) WITH (pages_per_range=2); +-- Fill a few pages +DO $$ +DECLARE curtid tid; +BEGIN + LOOP + INSERT INTO brin_summarize_multi VALUES (1) RETURNING ctid INTO curtid; + EXIT WHEN curtid > tid '(2, 0)'; + END LOOP; +END; +$$; +-- summarize one range +SELECT brin_summarize_range('brin_summarize_multi_idx', 0); +ERROR: Cloudberry could not summarize indicated page range +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- nothing: already summarized +SELECT brin_summarize_range('brin_summarize_multi_idx', 1); +ERROR: Cloudberry could not summarize indicated page range +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- summarize one range +SELECT brin_summarize_range('brin_summarize_multi_idx', 2); +ERROR: Cloudberry could not summarize indicated page range +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- nothing: page doesn't exist in table +SELECT brin_summarize_range('brin_summarize_multi_idx', 4294967295); + brin_summarize_range +---------------------- + 1 +(1 row) + +-- invalid block number values +SELECT brin_summarize_range('brin_summarize_multi_idx', -1); +ERROR: block number out of range: -1 +CONTEXT: SQL function "brin_summarize_range" statement 1 +SELECT brin_summarize_range('brin_summarize_multi_idx', 4294967296); +ERROR: block number out of range: 4294967296 +CONTEXT: SQL function "brin_summarize_range" statement 1 +-- test brin cost estimates behave sanely based on correlation of values +CREATE TABLE brin_test_multi (a INT, b INT); +INSERT INTO brin_test_multi SELECT x/100,x%100 FROM generate_series(1,10000) x(x); +CREATE INDEX brin_test_multi_a_idx ON brin_test_multi USING brin (a) WITH (pages_per_range = 2); +CREATE INDEX brin_test_multi_b_idx ON brin_test_multi USING brin (b) WITH (pages_per_range = 2); +VACUUM ANALYZE brin_test_multi; +-- Ensure brin index is used when columns are perfectly correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE a = 1; + QUERY PLAN +-------------------------------------------------- + Bitmap Heap Scan on brin_test_multi + Recheck Cond: (a = 1) + -> Bitmap Index Scan on brin_test_multi_a_idx + Index Cond: (a = 1) + Optimizer: Postgres query optimizer +(5 rows) + +-- Ensure brin index is not used when values are not correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE b = 1; + QUERY PLAN +------------------------------------- + Seq Scan on brin_test_multi + Filter: (b = 1) + Optimizer: Postgres query optimizer +(3 rows) + diff --git a/src/test/singlenode_regress/expected/btree_index.out b/src/test/singlenode_regress/expected/btree_index.out new file mode 100644 index 00000000000..711a5e6ef26 --- /dev/null +++ b/src/test/singlenode_regress/expected/btree_index.out @@ -0,0 +1,356 @@ +-- +-- BTREE_INDEX +-- test retrieval of min/max keys for each index +-- +SELECT b.* + FROM bt_i4_heap b + WHERE b.seqno < 1; + seqno | random +-------+------------ + 0 | 1935401906 +(1 row) + +SELECT b.* + FROM bt_i4_heap b + WHERE b.seqno >= 9999; + seqno | random +-------+------------ + 9999 | 1227676208 +(1 row) + +SELECT b.* + FROM bt_i4_heap b + WHERE b.seqno = 4500; + seqno | random +-------+------------ + 4500 | 2080851358 +(1 row) + +SELECT b.* + FROM bt_name_heap b + WHERE b.seqno < '1'::name; + seqno | random +-------+------------ + 0 | 1935401906 +(1 row) + +SELECT b.* + FROM bt_name_heap b + WHERE b.seqno >= '9999'::name; + seqno | random +-------+------------ + 9999 | 1227676208 +(1 row) + +SELECT b.* + FROM bt_name_heap b + WHERE b.seqno = '4500'::name; + seqno | random +-------+------------ + 4500 | 2080851358 +(1 row) + +SELECT b.* + FROM bt_txt_heap b + WHERE b.seqno < '1'::text; + seqno | random +-------+------------ + 0 | 1935401906 +(1 row) + +SELECT b.* + FROM bt_txt_heap b + WHERE b.seqno >= '9999'::text; + seqno | random +-------+------------ + 9999 | 1227676208 +(1 row) + +SELECT b.* + FROM bt_txt_heap b + WHERE b.seqno = '4500'::text; + seqno | random +-------+------------ + 4500 | 2080851358 +(1 row) + +SELECT b.* + FROM bt_f8_heap b + WHERE b.seqno < '1'::float8; + seqno | random +-------+------------ + 0 | 1935401906 +(1 row) + +SELECT b.* + FROM bt_f8_heap b + WHERE b.seqno >= '9999'::float8; + seqno | random +-------+------------ + 9999 | 1227676208 +(1 row) + +SELECT b.* + FROM bt_f8_heap b + WHERE b.seqno = '4500'::float8; + seqno | random +-------+------------ + 4500 | 2080851358 +(1 row) + +-- +-- Check correct optimization of LIKE (special index operator support) +-- for both indexscan and bitmapscan cases +-- +set enable_seqscan to false; +set enable_indexscan to true; +set enable_bitmapscan to false; +explain (costs off) +select proname from pg_proc where proname like E'RI\\_FKey%del' order by 1; + QUERY PLAN +------------------------------------------------------------------------------ + Index Only Scan using pg_proc_proname_args_nsp_index on pg_proc + Index Cond: ((proname >= 'RI_FKey'::text) AND (proname < 'RI_FKez'::text)) + Filter: (proname ~~ 'RI\_FKey%del'::text) + Optimizer: Postgres query optimizer +(4 rows) + +select proname from pg_proc where proname like E'RI\\_FKey%del' order by 1; + proname +------------------------ + RI_FKey_cascade_del + RI_FKey_noaction_del + RI_FKey_restrict_del + RI_FKey_setdefault_del + RI_FKey_setnull_del +(5 rows) + +explain (costs off) +select proname from pg_proc where proname ilike '00%foo' order by 1; + QUERY PLAN +-------------------------------------------------------------------- + Index Only Scan using pg_proc_proname_args_nsp_index on pg_proc + Index Cond: ((proname >= '00'::text) AND (proname < '01'::text)) + Filter: (proname ~~* '00%foo'::text) + Optimizer: Postgres query optimizer +(4 rows) + +select proname from pg_proc where proname ilike '00%foo' order by 1; + proname +--------- +(0 rows) + +explain (costs off) +select proname from pg_proc where proname ilike 'ri%foo' order by 1; + QUERY PLAN +----------------------------------------------------------------- + Index Only Scan using pg_proc_proname_args_nsp_index on pg_proc + Filter: (proname ~~* 'ri%foo'::text) + Optimizer: Postgres query optimizer +(3 rows) + +set enable_indexscan to false; +set enable_bitmapscan to true; +explain (costs off) +select proname from pg_proc where proname like E'RI\\_FKey%del' order by 1; + QUERY PLAN +------------------------------------------------------------------------------------------ + Sort + Sort Key: proname + -> Bitmap Heap Scan on pg_proc + Filter: (proname ~~ 'RI\_FKey%del'::text) + -> Bitmap Index Scan on pg_proc_proname_args_nsp_index + Index Cond: ((proname >= 'RI_FKey'::text) AND (proname < 'RI_FKez'::text)) + Optimizer: Postgres query optimizer +(7 rows) + +select proname from pg_proc where proname like E'RI\\_FKey%del' order by 1; + proname +------------------------ + RI_FKey_cascade_del + RI_FKey_noaction_del + RI_FKey_restrict_del + RI_FKey_setdefault_del + RI_FKey_setnull_del +(5 rows) + +explain (costs off) +select proname from pg_proc where proname ilike '00%foo' order by 1; + QUERY PLAN +-------------------------------------------------------------------------------- + Sort + Sort Key: proname + -> Bitmap Heap Scan on pg_proc + Filter: (proname ~~* '00%foo'::text) + -> Bitmap Index Scan on pg_proc_proname_args_nsp_index + Index Cond: ((proname >= '00'::text) AND (proname < '01'::text)) + Optimizer: Postgres query optimizer +(7 rows) + +select proname from pg_proc where proname ilike '00%foo' order by 1; + proname +--------- +(0 rows) + +explain (costs off) +select proname from pg_proc where proname ilike 'ri%foo' order by 1; + QUERY PLAN +----------------------------------------------------------------- + Sort + Sort Key: proname + -> Bitmap Heap Scan on pg_proc + Filter: (proname ~~* 'ri%foo'::text) + -> Bitmap Index Scan on pg_proc_proname_args_nsp_index + Optimizer: Postgres query optimizer +(6 rows) + +reset enable_seqscan; +reset enable_indexscan; +reset enable_bitmapscan; +-- Also check LIKE optimization with binary-compatible cases +create temp table btree_bpchar (f1 text collate "C"); +create index on btree_bpchar(f1 bpchar_ops) WITH (deduplicate_items=on); +insert into btree_bpchar values ('foo'), ('fool'), ('bar'), ('quux'); +-- doesn't match index: +explain (costs off) +select * from btree_bpchar where f1 like 'foo'; + QUERY PLAN +------------------------------------- + Seq Scan on btree_bpchar + Filter: (f1 ~~ 'foo'::text) + Optimizer: Postgres query optimizer +(3 rows) + +select * from btree_bpchar where f1 like 'foo'; + f1 +----- + foo +(1 row) + +explain (costs off) +select * from btree_bpchar where f1 like 'foo%'; + QUERY PLAN +------------------------------------- + Seq Scan on btree_bpchar + Filter: (f1 ~~ 'foo%'::text) + Optimizer: Postgres query optimizer +(3 rows) + +select * from btree_bpchar where f1 like 'foo%'; + f1 +------ + foo + fool +(2 rows) + +-- these do match the index: +explain (costs off) +select * from btree_bpchar where f1::bpchar like 'foo'; + QUERY PLAN +---------------------------------------------------- + Bitmap Heap Scan on btree_bpchar + Filter: ((f1)::bpchar ~~ 'foo'::text) + -> Bitmap Index Scan on btree_bpchar_f1_idx + Index Cond: ((f1)::bpchar = 'foo'::bpchar) + Optimizer: Postgres query optimizer +(5 rows) + +select * from btree_bpchar where f1::bpchar like 'foo'; + f1 +----- + foo +(1 row) + +explain (costs off) +select * from btree_bpchar where f1::bpchar like 'foo%'; + QUERY PLAN +------------------------------------------------------------------------------------------ + Bitmap Heap Scan on btree_bpchar + Filter: ((f1)::bpchar ~~ 'foo%'::text) + -> Bitmap Index Scan on btree_bpchar_f1_idx + Index Cond: (((f1)::bpchar >= 'foo'::bpchar) AND ((f1)::bpchar < 'fop'::bpchar)) + Optimizer: Postgres query optimizer +(5 rows) + +select * from btree_bpchar where f1::bpchar like 'foo%'; + f1 +------ + foo + fool +(2 rows) + +-- get test coverage for "single value" deduplication strategy: +insert into btree_bpchar select 'foo' from generate_series(1,1500); +-- +-- Perform unique checking, with and without the use of deduplication +-- +CREATE TABLE dedup_unique_test_table (a int) WITH (autovacuum_enabled=false); +CREATE UNIQUE INDEX dedup_unique ON dedup_unique_test_table (a) WITH (deduplicate_items=on); +CREATE UNIQUE INDEX plain_unique ON dedup_unique_test_table (a) WITH (deduplicate_items=off); +-- Generate enough garbage tuples in index to ensure that even the unique index +-- with deduplication enabled has to check multiple leaf pages during unique +-- checking (at least with a BLCKSZ of 8192 or less) +DO $$ +BEGIN + FOR r IN 1..1350 LOOP + DELETE FROM dedup_unique_test_table; + INSERT INTO dedup_unique_test_table SELECT 1; + END LOOP; +END$$; +-- Exercise the LP_DEAD-bit-set tuple deletion code with a posting list tuple. +-- The implementation prefers deleting existing items to merging any duplicate +-- tuples into a posting list, so we need an explicit test to make sure we get +-- coverage (note that this test also assumes BLCKSZ is 8192 or less): +DROP INDEX plain_unique; +DELETE FROM dedup_unique_test_table WHERE a = 1; +INSERT INTO dedup_unique_test_table SELECT i FROM generate_series(0,450) i; +-- +-- Test B-tree fast path (cache rightmost leaf page) optimization. +-- +-- First create a tree that's at least three levels deep (i.e. has one level +-- between the root and leaf levels). The text inserted is long. It won't be +-- TOAST compressed because we use plain storage in the table. Only a few +-- index tuples fit on each internal page, allowing us to get a tall tree with +-- few pages. (A tall tree is required to trigger caching.) +-- +-- The text column must be the leading column in the index, since suffix +-- truncation would otherwise truncate tuples on internal pages, leaving us +-- with a short tree. +create table btree_tall_tbl(id int4, t text); +alter table btree_tall_tbl alter COLUMN t set storage plain; +create index btree_tall_idx on btree_tall_tbl (t, id) with (fillfactor = 10); +insert into btree_tall_tbl select g, repeat('x', 250) +from generate_series(1, 130) g; +-- +-- Test for multilevel page deletion +-- +CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint); +INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,80000) i; +ALTER TABLE delete_test_table ADD PRIMARY KEY (a,b,c,d); +-- Delete most entries, and vacuum, deleting internal pages and creating "fast +-- root" +DELETE FROM delete_test_table WHERE a < 79990; +VACUUM delete_test_table; +-- +-- Test B-tree insertion with a metapage update (XLOG_BTREE_INSERT_META +-- WAL record type). This happens when a "fast root" page is split. This +-- also creates coverage for nbtree FSM page recycling. +-- +-- The vacuum above should've turned the leaf page into a fast root. We just +-- need to insert some rows to cause the fast root page to split. +INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,1000) i; +-- Test unsupported btree opclass parameters +create index on btree_tall_tbl (id int4_ops(foo=1)); +ERROR: operator class int4_ops has no options +-- Test case of ALTER INDEX with abuse of column names for indexes. +-- This grammar is not officially supported, but the parser allows it. +CREATE INDEX btree_tall_idx2 ON btree_tall_tbl (id); +ALTER INDEX btree_tall_idx2 ALTER COLUMN id SET (n_distinct=100); +ERROR: "btree_tall_idx2" is not a table, materialized view, or foreign table +DROP INDEX btree_tall_idx2; +-- Partitioned index +CREATE TABLE btree_part (id int4) PARTITION BY RANGE (id); +CREATE INDEX btree_part_idx ON btree_part(id); +ALTER INDEX btree_part_idx ALTER COLUMN id SET (n_distinct=100); +ERROR: "btree_part_idx" is not a table, materialized view, or foreign table +DROP TABLE btree_part; diff --git a/src/test/singlenode_regress/expected/case.out b/src/test/singlenode_regress/expected/case.out new file mode 100644 index 00000000000..f5136c17abb --- /dev/null +++ b/src/test/singlenode_regress/expected/case.out @@ -0,0 +1,419 @@ +-- +-- CASE +-- Test the case statement +-- +CREATE TABLE CASE_TBL ( + i integer, + f double precision +); +CREATE TABLE CASE2_TBL ( + i integer, + j integer +); +INSERT INTO CASE_TBL VALUES (1, 10.1); +INSERT INTO CASE_TBL VALUES (2, 20.2); +INSERT INTO CASE_TBL VALUES (3, -30.3); +INSERT INTO CASE_TBL VALUES (4, NULL); +INSERT INTO CASE2_TBL VALUES (1, -1); +INSERT INTO CASE2_TBL VALUES (2, -2); +INSERT INTO CASE2_TBL VALUES (3, -3); +INSERT INTO CASE2_TBL VALUES (2, -4); +INSERT INTO CASE2_TBL VALUES (1, NULL); +INSERT INTO CASE2_TBL VALUES (NULL, -6); +-- +-- Simplest examples without tables +-- +SELECT '3' AS "One", + CASE + WHEN 1 < 2 THEN 3 + END AS "Simple WHEN"; + One | Simple WHEN +-----+------------- + 3 | 3 +(1 row) + +SELECT '' AS "One", + CASE + WHEN 1 > 2 THEN 3 + END AS "Simple default"; + One | Simple default +--------+---------------- + | +(1 row) + +SELECT '3' AS "One", + CASE + WHEN 1 < 2 THEN 3 + ELSE 4 + END AS "Simple ELSE"; + One | Simple ELSE +-----+------------- + 3 | 3 +(1 row) + +SELECT '4' AS "One", + CASE + WHEN 1 > 2 THEN 3 + ELSE 4 + END AS "ELSE default"; + One | ELSE default +-----+-------------- + 4 | 4 +(1 row) + +SELECT '6' AS "One", + CASE + WHEN 1 > 2 THEN 3 + WHEN 4 < 5 THEN 6 + ELSE 7 + END AS "Two WHEN with default"; + One | Two WHEN with default +-----+----------------------- + 6 | 6 +(1 row) + +SELECT '7' AS "None", + CASE WHEN random() < 0 THEN 1 + END AS "NULL on no matches"; + None | NULL on no matches +------+-------------------- + 7 | +(1 row) + +-- Constant-expression folding shouldn't evaluate unreachable subexpressions +SELECT CASE WHEN 1=0 THEN 1/0 WHEN 1=1 THEN 1 ELSE 2/0 END; + case +------ + 1 +(1 row) + +SELECT CASE 1 WHEN 0 THEN 1/0 WHEN 1 THEN 1 ELSE 2/0 END; + case +------ + 1 +(1 row) + +-- However we do not currently suppress folding of potentially +-- reachable subexpressions +SELECT CASE WHEN i > 100 THEN 1/0 ELSE 0 END FROM case_tbl; +ERROR: division by zero +-- Test for cases involving untyped literals in test expression +SELECT CASE 'a' WHEN 'a' THEN 1 ELSE 2 END; + case +------ + 1 +(1 row) + +-- +-- Examples of targets involving tables +-- +SELECT + CASE + WHEN i >= 3 THEN i + END AS ">= 3 or Null" + FROM CASE_TBL; + >= 3 or Null +-------------- + + + 3 + 4 +(4 rows) + +SELECT + CASE WHEN i >= 3 THEN (i + i) + ELSE i + END AS "Simplest Math" + FROM CASE_TBL; + Simplest Math +--------------- + 1 + 2 + 6 + 8 +(4 rows) + +SELECT i AS "Value", + CASE WHEN (i < 0) THEN 'small' + WHEN (i = 0) THEN 'zero' + WHEN (i = 1) THEN 'one' + WHEN (i = 2) THEN 'two' + ELSE 'big' + END AS "Category" + FROM CASE_TBL; + Value | Category +-------+---------- + 1 | one + 2 | two + 3 | big + 4 | big +(4 rows) + +SELECT + CASE WHEN ((i < 0) or (i < 0)) THEN 'small' + WHEN ((i = 0) or (i = 0)) THEN 'zero' + WHEN ((i = 1) or (i = 1)) THEN 'one' + WHEN ((i = 2) or (i = 2)) THEN 'two' + ELSE 'big' + END AS "Category" + FROM CASE_TBL; + Category +---------- + one + two + big + big +(4 rows) + +-- +-- Examples of qualifications involving tables +-- +-- +-- NULLIF() and COALESCE() +-- Shorthand forms for typical CASE constructs +-- defined in the SQL standard. +-- +SELECT * FROM CASE_TBL WHERE COALESCE(f,i) = 4; + i | f +---+--- + 4 | +(1 row) + +SELECT * FROM CASE_TBL WHERE NULLIF(f,i) = 2; + i | f +---+--- +(0 rows) + +SELECT COALESCE(a.f, b.i, b.j) + FROM CASE_TBL a, CASE2_TBL b; + coalesce +---------- + 10.1 + 20.2 + -30.3 + 1 + 10.1 + 20.2 + -30.3 + 2 + 10.1 + 20.2 + -30.3 + 3 + 10.1 + 20.2 + -30.3 + 2 + 10.1 + 20.2 + -30.3 + 1 + 10.1 + 20.2 + -30.3 + -6 +(24 rows) + +SELECT * + FROM CASE_TBL a, CASE2_TBL b + WHERE COALESCE(a.f, b.i, b.j) = 2; + i | f | i | j +---+---+---+---- + 4 | | 2 | -2 + 4 | | 2 | -4 +(2 rows) + +SELECT NULLIF(a.i,b.i) AS "NULLIF(a.i,b.i)", + NULLIF(b.i, 4) AS "NULLIF(b.i,4)" + FROM CASE_TBL a, CASE2_TBL b; + NULLIF(a.i,b.i) | NULLIF(b.i,4) +-----------------+--------------- + | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 1 | 2 + | 2 + 3 | 2 + 4 | 2 + 1 | 3 + 2 | 3 + | 3 + 4 | 3 + 1 | 2 + | 2 + 3 | 2 + 4 | 2 + | 1 + 2 | 1 + 3 | 1 + 4 | 1 + 1 | + 2 | + 3 | + 4 | +(24 rows) + +SELECT * + FROM CASE_TBL a, CASE2_TBL b + WHERE COALESCE(f,b.i) = 2; + i | f | i | j +---+---+---+---- + 4 | | 2 | -2 + 4 | | 2 | -4 +(2 rows) + +-- Tests for constant subexpression simplification +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, 2) = 2; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, 1) IS NOT NULL; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, null) = 2; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + +-- +-- Examples of updates involving tables +-- +UPDATE CASE_TBL + SET i = CASE WHEN i >= 3 THEN (- i) + ELSE (2 * i) END; +SELECT * FROM CASE_TBL; + i | f +----+------- + 2 | 10.1 + 4 | 20.2 + -3 | -30.3 + -4 | +(4 rows) + +UPDATE CASE_TBL + SET i = CASE WHEN i >= 2 THEN (2 * i) + ELSE (3 * i) END; +SELECT * FROM CASE_TBL; + i | f +-----+------- + 4 | 10.1 + 8 | 20.2 + -9 | -30.3 + -12 | +(4 rows) + +UPDATE CASE_TBL + SET i = CASE WHEN b.i >= 2 THEN (2 * j) + ELSE (3 * j) END + FROM CASE2_TBL b + WHERE j = -CASE_TBL.i; +SELECT * FROM CASE_TBL; + i | f +-----+------- + 8 | 20.2 + -9 | -30.3 + -12 | + -8 | 10.1 +(4 rows) + +-- +-- Nested CASE expressions +-- +-- This test exercises a bug caused by aliasing econtext->caseValue_isNull +-- with the isNull argument of the inner CASE's CaseExpr evaluation. After +-- evaluating the vol(null) expression in the inner CASE's second WHEN-clause, +-- the isNull flag for the case test value incorrectly became true, causing +-- the third WHEN-clause not to match. The volatile function calls are needed +-- to prevent constant-folding in the planner, which would hide the bug. +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; +CREATE FUNCTION vol(text) returns text as + 'begin return $1; end' language plpgsql volatile; +SELECT CASE + (CASE vol('bar') + WHEN 'foo' THEN 'it was foo!' + WHEN vol(null) THEN 'null input' + WHEN 'bar' THEN 'it was bar!' END + ) + WHEN 'it was foo!' THEN 'foo recognized' + WHEN 'it was bar!' THEN 'bar recognized' + ELSE 'unrecognized' END; + case +---------------- + bar recognized +(1 row) + +-- In this case, we can't inline the SQL function without confusing things. +CREATE DOMAIN foodomain AS text; +CREATE FUNCTION volfoo(text) returns foodomain as + 'begin return $1::foodomain; end' language plpgsql volatile; +CREATE FUNCTION inline_eq(foodomain, foodomain) returns boolean as + 'SELECT CASE $2::text WHEN $1::text THEN true ELSE false END' language sql; +CREATE OPERATOR = (procedure = inline_eq, + leftarg = foodomain, rightarg = foodomain); +SELECT CASE volfoo('bar') WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo' END; + case +------------ + is not foo +(1 row) + +ROLLBACK; +-- Test multiple evaluation of a CASE arg that is a read/write object (#14472) +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; +CREATE DOMAIN arrdomain AS int[]; +CREATE FUNCTION make_ad(int,int) returns arrdomain as + 'declare x arrdomain; + begin + x := array[$1,$2]; + return x; + end' language plpgsql volatile; +CREATE FUNCTION ad_eq(arrdomain, arrdomain) returns boolean as + 'begin return array_eq($1, $2); end' language plpgsql; +CREATE OPERATOR = (procedure = ad_eq, + leftarg = arrdomain, rightarg = arrdomain); +SELECT CASE make_ad(1,2) + WHEN array[2,4]::arrdomain THEN 'wrong' + WHEN array[2,5]::arrdomain THEN 'still wrong' + WHEN array[1,2]::arrdomain THEN 'right' + END; + case +------- + right +(1 row) + +ROLLBACK; +-- Test interaction of CASE with ArrayCoerceExpr (bug #15471) +BEGIN; +CREATE TYPE casetestenum AS ENUM ('e', 'f', 'g'); +SELECT + CASE 'foo'::text + WHEN 'foo' THEN ARRAY['a', 'b', 'c', 'd'] || enum_range(NULL::casetestenum)::text[] + ELSE ARRAY['x', 'y'] + END; + array +----------------- + {a,b,c,d,e,f,g} +(1 row) + +ROLLBACK; +-- +-- Clean up +-- +DROP TABLE CASE_TBL; +DROP TABLE CASE2_TBL; diff --git a/src/test/singlenode_regress/expected/case_gp.out b/src/test/singlenode_regress/expected/case_gp.out new file mode 100644 index 00000000000..0beb15f05ed --- /dev/null +++ b/src/test/singlenode_regress/expected/case_gp.out @@ -0,0 +1,966 @@ +-- Additional CASE-WHEN tests +-- +-- CASE ... WHEN IS NOT DISTINCT FROM ... +-- +DROP TABLE IF EXISTS mytable CASCADE; +NOTICE: table "mytable" does not exist, skipping +CREATE TABLE mytable (a int, b int, c varchar(1)); +INSERT INTO mytable values (1,2,'t'), + (2,3,'e'), + (3,4,'o'), + (4,5,'o'), + (4,4,'o'), + (5,5,'t'), + (6,6,'t'), + (7,6,'a'), + (8,7,'t'), + (9,8,'a'); +DROP VIEW IF EXISTS notdisview; +NOTICE: view "notdisview" does not exist, skipping +CREATE OR REPLACE VIEW notdisview AS +SELECT + CASE 'a'::text = 'test'::text + WHEN 'test' IS NOT DISTINCT FROM ''::text THEN 'A'::text + ELSE 'B'::text + END AS t; +select pg_get_viewdef('notdisview',true); + pg_get_viewdef +---------------------------------------------------------------------------- + SELECT + + CASE 'a'::text = 'test'::text + + WHEN 'test'::text IS NOT DISTINCT FROM ''::text THEN 'A'::text+ + ELSE 'B'::text + + END AS t; +(1 row) + +DROP VIEW IF EXISTS notdisview2; +NOTICE: view "notdisview2" does not exist, skipping +CREATE OR REPLACE VIEW notdisview2 AS +SELECT + CASE + WHEN c::text IS NOT DISTINCT FROM ''::text THEN 'A'::text + ELSE 'B'::text + END AS t + FROM mytable; +select pg_get_viewdef('notdisview2',true); + pg_get_viewdef +------------------------------------------------------------------------------- + SELECT + + CASE + + WHEN mytable.c::text IS NOT DISTINCT FROM ''::text THEN 'A'::text+ + ELSE 'B'::text + + END AS t + + FROM mytable; +(1 row) + +CREATE TABLE mytable2 ( + key character varying(20) NOT NULL, + key_value character varying(50) +); +DROP VIEW IF EXISTS notdisview3; +NOTICE: view "notdisview3" does not exist, skipping +CREATE OR REPLACE VIEW notdisview3 AS +SELECT + CASE mytable2.key_value + WHEN IS NOT DISTINCT FROM 'NULL'::text THEN 'now'::text::date + ELSE to_date(mytable2.key_value::text, 'YYYYMM'::text) + END AS t + FROM mytable2; +select pg_get_viewdef('notdisview3',false); + pg_get_viewdef +----------------------------------------------------------------------------- + SELECT + + CASE mytable2.key_value + + WHEN IS NOT DISTINCT FROM 'NULL'::text THEN ('now'::text)::date+ + ELSE to_date((mytable2.key_value)::text, 'YYYYMM'::text) + + END AS t + + FROM mytable2; +(1 row) + +CREATE OR REPLACE FUNCTION negate(int) RETURNS int +AS 'SELECT $1 * (-1)' +LANGUAGE sql CONTAINS SQL +IMMUTABLE +RETURNS null ON null input; +DROP VIEW IF EXISTS myview; +NOTICE: view "myview" does not exist, skipping +CREATE VIEW myview AS + SELECT a,b, CASE a WHEN IS NOT DISTINCT FROM b THEN b*10 + WHEN IS NOT DISTINCT FROM b+1 THEN b*100 + WHEN b-1 THEN b*1000 + WHEN b*10 THEN b*10000 + WHEN negate(b) THEN b*(-1.0) + ELSE b END AS newb + FROM mytable; +SELECT * FROM myview ORDER BY a,b; + a | b | newb +---+---+------ + 1 | 2 | 2000 + 2 | 3 | 3000 + 3 | 4 | 4000 + 4 | 4 | 40 + 4 | 5 | 5000 + 5 | 5 | 50 + 6 | 6 | 60 + 7 | 6 | 600 + 8 | 7 | 700 + 9 | 8 | 800 +(10 rows) + +-- Test deparse +select pg_get_viewdef('myview',true); + pg_get_viewdef +------------------------------------------------------------------------------------- + SELECT mytable.a, + + mytable.b, + + CASE mytable.a + + WHEN IS NOT DISTINCT FROM mytable.b THEN (mytable.b * 10)::numeric + + WHEN IS NOT DISTINCT FROM mytable.b + 1 THEN (mytable.b * 100)::numeric+ + WHEN mytable.b - 1 THEN (mytable.b * 1000)::numeric + + WHEN mytable.b * 10 THEN (mytable.b * 10000)::numeric + + WHEN negate(mytable.b) THEN mytable.b::numeric * '-1.0'::numeric + + ELSE mytable.b::numeric + + END AS newb + + FROM mytable; +(1 row) + +DROP TABLE IF EXISTS products CASCADE; +NOTICE: table "products" does not exist, skipping +CREATE TABLE products (id serial, name text, price numeric); +INSERT INTO products (name, price) values + ('keyboard', 124.99), + ('monitor', 299.99), + ('mouse', 45.59); +SELECT id,name,price as old_price, + CASE name WHEN IS NOT DISTINCT FROM 'keyboard' THEN products.price*1.5 + WHEN IS NOT DISTINCT FROM 'monitor' THEN price*1.2 + WHEN 'keyboard tray' THEN price*.9 + END AS new_price + FROM products; + id | name | old_price | new_price +----+----------+-----------+----------- + 1 | keyboard | 124.99 | 187.485 + 2 | monitor | 299.99 | 359.988 + 3 | mouse | 45.59 | +(3 rows) + + +-- testexpr should be evaluated only once +DROP FUNCTION IF EXISTS blip(int); +NOTICE: function blip(pg_catalog.int4) does not exist, skipping +DROP TABLE IF EXISTS calls_to_blip; +NOTICE: table "calls_to_blip" does not exist, skipping +CREATE TABLE calls_to_blip (n serial, v int); +CREATE OR REPLACE FUNCTION blip(int) RETURNS int +LANGUAGE plpgsql MODIFIES SQL DATA +VOLATILE +AS $$ +DECLARE + x alias for $1; +BEGIN + INSERT INTO calls_to_blip(v) VALUES (x); + RETURN x; +END; +$$; +SELECT CASE blip(1) + WHEN IS NOT DISTINCT FROM blip(2) THEN blip(20) + WHEN IS NOT DISTINCT FROM blip(3) THEN blip(30) + WHEN IS NOT DISTINCT FROM blip(4) THEN blip(40) + ELSE blip(666) + END AS answer; + answer +-------- + 666 +(1 row) + +SELECT * FROM calls_to_blip ORDER BY 1; + n | v +---+----- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 666 +(5 rows) + +-- Negative test +-- 1. wrong syntax +-- 2. type mismatches +SELECT a,b,CASE WHEN IS NOT DISTINCT FROM b THEN b*100 ELSE b*1000 END FROM mytable; +ERROR: syntax error at or near "NOT" +LINE 1: SELECT a,b,CASE WHEN IS NOT DISTINCT FROM b THEN b*100 ELSE ... + ^ +HINT: Missing for "CASE WHEN IS NOT DISTINCT FROM ..." +SELECT a,b,c,CASE c WHEN IS NOT DISTINCT FROM b THEN a + WHEN IS NOT DISTINCT FROM b+1 THEN a*100 + ELSE c END + FROM mytable; +ERROR: operator does not exist: character varying = integer +LINE 1: SELECT a,b,c,CASE c WHEN IS NOT DISTINCT FROM b THEN a + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- +-- DECODE(): Oracle compatibility +-- +SELECT decode(null,null,true,false); + case +------ + t +(1 row) + +SELECT decode(NULL::integer, 1, 100, NULL, 200, 300); + case +------ + 200 +(1 row) + +SELECT decode('1'::text, '1', 100, '2', 200); + case +------ + 100 +(1 row) + +SELECT decode(2, 1, 'ABC', 2, 'DEF'); + case +------ + DEF +(1 row) + +SELECT decode('2009-02-05'::date, '2009-02-05', 'ok'); + case +------ + ok +(1 row) + +SELECT decode('2009-02-05 01:02:03'::timestamp, '2009-02-05 01:02:03', 'ok'); + case +------ + ok +(1 row) + +SELECT b,c,decode(c,'a',b*10,'e',b*100,'o',b*1000,'u',b*10000,'i',b*100000) as newb from mytable; + b | c | newb +---+---+------ + 2 | t | + 3 | e | 300 + 4 | o | 4000 + 5 | o | 5000 + 4 | o | 4000 + 5 | t | + 6 | t | + 6 | a | 60 + 7 | t | + 8 | a | 80 +(10 rows) + +SELECT b,c,decode(c,'a',ARRAY[1,2],'e',ARRAY[3,4],'o',ARRAY[5,6],'u',ARRAY[7,8],'i',ARRAY[9,10],ARRAY[0]) as newb from mytable; + b | c | newb +---+---+------- + 2 | t | {0} + 3 | e | {3,4} + 4 | o | {5,6} + 5 | o | {5,6} + 4 | o | {5,6} + 5 | t | {0} + 6 | t | {0} + 6 | a | {1,2} + 7 | t | {0} + 8 | a | {1,2} +(10 rows) + +DROP VIEW IF EXISTS myview; +CREATE VIEW myview as + SELECT id, name, price, DECODE(id, 1, 'Southlake', + 2, 'San Francisco', + 3, 'New Jersey', + 4, 'Seattle', + 5, 'Portland', + 6, 'San Francisco', + 7, 'Portland', + 'Non domestic') Location + FROM products + WHERE id < 100; +SELECT * FROM myview ORDER BY id, location; + id | name | price | location +----+----------+--------+--------------- + 1 | keyboard | 124.99 | Southlake + 2 | monitor | 299.99 | San Francisco + 3 | mouse | 45.59 | New Jersey +(3 rows) + +-- Test deparse +select pg_get_viewdef('myview',true); + pg_get_viewdef +-------------------------------------------------------------------- + SELECT products.id, + + products.name, + + products.price, + + CASE products.id + + WHEN IS NOT DISTINCT FROM 1 THEN 'Southlake'::text + + WHEN IS NOT DISTINCT FROM 2 THEN 'San Francisco'::text+ + WHEN IS NOT DISTINCT FROM 3 THEN 'New Jersey'::text + + WHEN IS NOT DISTINCT FROM 4 THEN 'Seattle'::text + + WHEN IS NOT DISTINCT FROM 5 THEN 'Portland'::text + + WHEN IS NOT DISTINCT FROM 6 THEN 'San Francisco'::text+ + WHEN IS NOT DISTINCT FROM 7 THEN 'Portland'::text + + ELSE 'Non domestic'::text + + END AS location + + FROM products + + WHERE products.id < 100; +(1 row) + +-- User-defined DECODE function +CREATE OR REPLACE FUNCTION "decode"(int, int, int) RETURNS int +AS 'select $1 * $2 - $3;' +LANGUAGE sql CONTAINS SQL +IMMUTABLE +RETURNS null ON null input; +SELECT decode(11,8,11); + case +------ + +(1 row) + +SELECT "decode"(11,8,11); + decode +-------- + 77 +(1 row) + +SELECT public.decode(11,8,11); + decode +-------- + 77 +(1 row) + +-- Test CASE x WHEN IS NOT DISTINCT FROM y with DECODE +SELECT a,b,decode(a,1,1), + CASE decode(a,1,1) WHEN IS NOT DISTINCT FROM 1 THEN b*100 + WHEN IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb + FROM mytable ORDER BY a,b; + a | b | case | newb +---+---+------+------ + 1 | 2 | 1 | 200 + 2 | 3 | | 3 + 3 | 4 | | 4 + 4 | 4 | | 4 + 4 | 5 | | 5 + 5 | 5 | | 5 + 6 | 6 | | 6 + 7 | 6 | | 6 + 8 | 7 | | 7 + 9 | 8 | | 8 +(10 rows) + +-- Test CASE WHEN x IS NOT DISTINCT FROM y with DECODE +SELECT a,b,decode(a,1,1), + CASE WHEN decode(a,1,1) IS NOT DISTINCT FROM 1 THEN b*100 + WHEN decode(a,1,1) IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb + FROM mytable ORDER BY a,b; + a | b | case | newb +---+---+------+------ + 1 | 2 | 1 | 200 + 2 | 3 | | 3 + 3 | 4 | | 4 + 4 | 4 | | 4 + 4 | 5 | | 5 + 5 | 5 | | 5 + 6 | 6 | | 6 + 7 | 6 | | 6 + 8 | 7 | | 7 + 9 | 8 | | 8 +(10 rows) + +SELECT a,b,"decode"(a,1,1), + CASE WHEN "decode"(a,1,1) IS NOT DISTINCT FROM 1 THEN b*100 + WHEN "decode"(a,1,1) IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb + FROM mytable ORDER BY a,b; + a | b | decode | newb +---+---+--------+------ + 1 | 2 | 0 | 2 + 2 | 3 | 1 | 300 + 3 | 4 | 2 | 4 + 4 | 4 | 3 | 4 + 4 | 5 | 3 | 5 + 5 | 5 | 4 | 5000 + 6 | 6 | 5 | 6 + 7 | 6 | 6 | 6 + 8 | 7 | 7 | 7 + 9 | 8 | 8 | 8 +(10 rows) + +-- Negative test: type mismatches +SELECT b,c,decode(c,'a',ARRAY[1,2],'e',ARRAY[3,4],'o',ARRAY[5,6],'u',ARRAY[7,8],'i',ARRAY[9,10],0) as newb from mytable; +ERROR: CASE types integer and integer[] cannot be matched +LINE 1: SELECT b,c,decode(c,'a',ARRAY[1,2],'e',ARRAY[3,4],'o',ARRAY[... + ^ +-- +-- Clean up +-- +DROP TABLE mytable CASCADE; +NOTICE: drop cascades to view notdisview2 +DROP TABLE products CASCADE; +NOTICE: drop cascades to view myview +DROP TABLE calls_to_blip; +DROP FUNCTION negate(int); +DROP FUNCTION "decode"(int, int, int); +DROP FUNCTION blip(int); +select CASE 'M' + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END; + case +------ + Male +(1 row) + +select CASE 'F' + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END; + case +-------- + Female +(1 row) + +select CASE '' + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END; + case +--------------- + Not Specified +(1 row) + +select CASE null + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END; + case +--------------- + Not Specified +(1 row) + +create table case_genders (gid integer, gender char(1)); +insert into case_genders(gid, gender) values + (1, 'F'), + (2, 'M'), + (3, 'Z'), + (4, ''), + (5, null), + (6, 'G'); +select gender, CASE gender + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END +from case_genders +order by gid; + gender | case +--------+--------------- + F | Female + M | Male + Z | + | Not Specified + | Not Specified + G | +(6 rows) + +select CASE 'M' + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + ELSE 'Other' END; + case +------ + Male +(1 row) + +select CASE null + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + ELSE 'Other' END; + case +------- + Other +(1 row) + +select gender, CASE gender + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + ELSE 'Other' END +from case_genders +order by gid; + gender | case +--------+--------------- + F | Female + M | Male + Z | Other + | Not Specified + | Not Specified + G | Other +(6 rows) + +select 'a' as lhs, CASE 'a' + WHEN 'f' THEN 'WHEN: f' + WHEN IS NOT DISTINCT FROM 'f' THEN 'WHEN NEW: f' + WHEN 'e' THEN 'WHEN: e' + WHEN IS NOT DISTINCT FROM 'e' THEN 'WHEN NEW: e' + WHEN 'd' THEN 'WHEN: d' + WHEN IS NOT DISTINCT FROM 'd' THEN 'WHEN NEW: d' + WHEN 'c' THEN 'WHEN: c' + WHEN IS NOT DISTINCT FROM 'c' THEN 'WHEN NEW: c' + WHEN 'b' THEN 'WHEN: b' + WHEN IS NOT DISTINCT FROM 'b' THEN 'WHEN NEW: b' + WHEN 'a' THEN 'WHEN: a' + WHEN IS NOT DISTINCT FROM 'a' THEN 'WHEN NEW: a' + ELSE 'NO MATCH' END as match; + lhs | match +-----+--------- + a | WHEN: a +(1 row) + +select 1 as lhs, CASE 1 + WHEN 4 THEN 'WHEN: 4' + WHEN IS NOT DISTINCT FROM 4 THEN 'WHEN NEW: 4' + WHEN 3 THEN 'WHEN: 3' + WHEN IS NOT DISTINCT FROM 3 THEN 'WHEN NEW: 3' + WHEN 2 THEN 'WHEN: 2' + WHEN IS NOT DISTINCT FROM 2 THEN 'WHEN NEW: 2' + WHEN 11 THEN 'WHEN: 11' + WHEN IS NOT DISTINCT FROM 1 THEN 'WHEN NEW: 1' + ELSE 'NO MATCH' END as match; + lhs | match +-----+------------- + 1 | WHEN NEW: 1 +(1 row) + +select '2011-05-27'::date as lsh, CASE '2011-05-27'::date + WHEN '2011-07-25'::date THEN 'WHEN: 2011-07-25' + WHEN IS NOT DISTINCT FROM '2011-05-27'::date THEN 'WHEN NEW: 2011-05-27' + END as match; + lsh | match +------------+---------------------- + 05-27-2011 | WHEN NEW: 2011-05-27 +(1 row) + +create table nomatch_case +( + sid integer, + gender char(1) default 'F', + name text, + start_dt date +); +insert into nomatch_case(sid, gender, name, start_dt) values + (1000, 'F', 'Jane Doe', '2011-01-15'::date), + (2000, 'M', 'Ryan Goesling', '2011-02-01'::date), + (3000, 'M', 'Tim Tebow', '2011-01-15'::date), + (4000, 'F', 'Katy Perry', '2011-03-01'::date), + (5000, 'F', 'Michael Scott', '2011-02-01'::date); +select sid, + name, + gender, + start_dt, + CASE upper(gender) + WHEN 'MALE' THEN 'M' + WHEN IS NOT DISTINCT FROM 'FEMALE' THEN 'F' + WHEN trim('MALE ') THEN 'M' + ELSE 'NO MATCH' END as case_gender +from nomatch_case +order by sid, name; + sid | name | gender | start_dt | case_gender +------+---------------+--------+------------+------------- + 1000 | Jane Doe | F | 01-15-2011 | NO MATCH + 2000 | Ryan Goesling | M | 02-01-2011 | NO MATCH + 3000 | Tim Tebow | M | 01-15-2011 | NO MATCH + 4000 | Katy Perry | F | 03-01-2011 | NO MATCH + 5000 | Michael Scott | F | 02-01-2011 | NO MATCH +(5 rows) + +select sid, + name, + gender, + start_dt, + CASE start_dt + WHEN IS NOT DISTINCT FROM '2009-01-01'::date THEN 2009 + WHEN '2008-01-01'::date THEN 2008 + WHEN IS NOT DISTINCT FROM '2010-01-01'::date then 2010 + WHEN 2007 THEN 2007 + WHEN IS NOT DISTINCT FROM 2007 THEN 2007 + WHEN '2006-01-01'::date then 2006 + END as case_start_dt +from nomatch_case +order by sid, name; +ERROR: operator does not exist: date = integer +LINE 9: WHEN 2007 THEN 2007 + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +select sid, + name, + gender, + start_dt, + CASE sid + WHEN 100 THEN 'Dept 10' + WHEN 200 THEN 'Dept 20' + WHEN IS NOT DISTINCT FROM 300 then 'Dept 30' + WHEN 400 THEN 'Dept 40' + WHEN 500 THEN 'Dept 50' + WHEN IS NOT DISTINCT FROM 600 then 'Dept 60' + WHEN IS NOT DISTINCT FROM 700 then 'Dept 70' + END as case_sid +from nomatch_case +order by sid, name; + sid | name | gender | start_dt | case_sid +------+---------------+--------+------------+---------- + 1000 | Jane Doe | F | 01-15-2011 | + 2000 | Ryan Goesling | M | 02-01-2011 | + 3000 | Tim Tebow | M | 01-15-2011 | + 4000 | Katy Perry | F | 03-01-2011 | + 5000 | Michael Scott | F | 02-01-2011 | +(5 rows) + +create table combined_when +( + sid integer, + gender varchar(10) default 'F', + name text, + start_dt date +); +insert into combined_when(sid, gender, name, start_dt) values + (1000, 'F', 'Jane Doe', '2011-01-15'::date), + (2000, 'M', 'Ryan Goesling', '2011-02-01'::date), + (3000, 'm', 'Tim Tebow', '2007-01-15'::date), + (4000, 'F', 'Katy Perry', '2011-03-01'::date), + (5000, 'f', 'Michael Scott', '2011-02-01'::date), + (6000, 'Female ', 'Mila Kunis', '2011-02-01'::date), + (7000, ' Male ', 'Tom Brady', '2011-03-01'::date), + (8000, ' ', 'Lady Gaga', '2008-01-15'::date), + (9000, null, 'George Michael', '2011-01-15'::date), + (10000, 'Male ', 'Michael Jordan', null); +select case_yr_start_dt, count(sid) +from (select sid, + name, + gender, + start_dt, + CASE extract(year from start_dt) + WHEN IS NOT DISTINCT FROM 2009 THEN 2009 + WHEN abs(2009-1) THEN 2008 + WHEN IS NOT DISTINCT FROM extract(year from '2010-01-01'::date) then 2010 + WHEN round(2007.05, 0) THEN 2007 + WHEN IS NOT DISTINCT FROM 2007 THEN 2007 + WHEN extract(year from '2006-01-01'::date) then 2006 + WHEN extract(year from '2011-01-01'::date) then 2011 + END as case_yr_start_dt +from combined_when +order by sid, name) a +group by case_yr_start_dt +order by 2 desc, 1; + case_yr_start_dt | count +------------------+------- + 2011 | 7 + 2007 | 1 + 2008 | 1 + | 1 +(4 rows) + +create table case_expr +( + sid integer, + gender char(1) default 'F', + name text, + start_dt date +); +insert into case_expr(sid, gender, name, start_dt) values + (1000, 'F', 'Jane Doe', '2011-01-15'::date), + (2000, 'M', 'Ryan Goesling', '2011-02-01'::date), + (3000, 'M', 'Tim Tebow', '2011-01-15'::date), + (4000, 'F', 'Katy Perry', '2011-03-01'::date), + (5000, 'F', 'Michael Scott', '2011-02-01'::date); +select sid, + name, + gender, + start_dt, + CASE (gender is not null) + WHEN (gender = 'MALE') THEN 'M' + WHEN IS NOT DISTINCT FROM (gender = 'FEMALE') THEN 'F' + WHEN (gender = trim('MALE ')) THEN 'M' + WHEN IS NOT DISTINCT FROM (gender = 'M') THEN 'M' + WHEN (gender = 'F') THEN 'F' + ELSE 'NO MATCH' END as case_gender +from case_expr +order by sid, name; + sid | name | gender | start_dt | case_gender +------+---------------+--------+------------+------------- + 1000 | Jane Doe | F | 01-15-2011 | F + 2000 | Ryan Goesling | M | 02-01-2011 | M + 3000 | Tim Tebow | M | 01-15-2011 | M + 4000 | Katy Perry | F | 03-01-2011 | F + 5000 | Michael Scott | F | 02-01-2011 | F +(5 rows) + +select sid, + name, + gender, + start_dt, + CASE (extract(year from start_dt) = 2011) + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 1) THEN 'January' + WHEN (extract(month from start_dt) = 2) THEN 'February' + WHEN (extract(month from start_dt) = 3) THEN 'March' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 4) THEN 'April' + WHEN (extract(month from start_dt) = 5) THEN 'May' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 6) THEN 'June' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 7) THEN 'July' + WHEN (extract(month from start_dt) = 8) THEN 'August' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 9) THEN 'September' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 10) THEN 'October' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 11) THEN 'November' + WHEN (extract(month from start_dt) = 12) THEN 'December' + END as case_start_month +from case_expr +order by sid, name; + sid | name | gender | start_dt | case_start_month +------+---------------+--------+------------+------------------ + 1000 | Jane Doe | F | 01-15-2011 | January + 2000 | Ryan Goesling | M | 02-01-2011 | February + 3000 | Tim Tebow | M | 01-15-2011 | January + 4000 | Katy Perry | F | 03-01-2011 | March + 5000 | Michael Scott | F | 02-01-2011 | February +(5 rows) + +select sid, + name, + gender, + start_dt, + CASE (sid > 100) + WHEN (sid = 1000) THEN 'Dept 10' + WHEN (sid > 1000 and sid <= 2000) THEN 'Dept 20' + WHEN IS NOT DISTINCT FROM (sid = 3000) then 'Dept 30' + WHEN (sid = 4000) THEN 'Dept 40' + WHEN (sid = 5000) THEN 'Dept 50' + WHEN IS NOT DISTINCT FROM (sid > 5000 and sid <= 6000) then 'Dept 60' + WHEN IS NOT DISTINCT FROM (sid = 7000) then 'Dept 70' + END as case_sid +from case_expr +order by sid, name; + sid | name | gender | start_dt | case_sid +------+---------------+--------+------------+---------- + 1000 | Jane Doe | F | 01-15-2011 | Dept 10 + 2000 | Ryan Goesling | M | 02-01-2011 | Dept 20 + 3000 | Tim Tebow | M | 01-15-2011 | Dept 30 + 4000 | Katy Perry | F | 03-01-2011 | Dept 40 + 5000 | Michael Scott | F | 02-01-2011 | Dept 50 +(5 rows) + +drop table if exists combined_when; +create table combined_when +( + sid integer, + gender varchar(10) default 'F', + name text, + start_dt date +); +insert into combined_when(sid, gender, name, start_dt) values + (1000, 'F', 'Jane Doe', '2011-01-15'::date), + (2000, 'M', 'Ryan Goesling', '2011-02-01'::date), + (3000, 'm', 'Tim Tebow', '2007-01-15'::date), + (4000, 'F', 'Katy Perry', '2011-03-01'::date), + (5000, 'f', 'Michael Scott', '2011-02-01'::date), + (6000, 'Female ', 'Mila Kunis', '2011-02-01'::date), + (7000, ' Male ', 'Tom Brady', '2011-03-01'::date), + (8000, ' ', 'Lady Gaga', '2008-01-15'::date), + (9000, null, 'George Michael', '2011-01-15'::date), + (10000, 'Male ', 'Michael Jordan', null); +select sid, + name, + gender, + start_dt, + CASE upper(trim(gender)) + WHEN 'MALE' THEN 'M' + WHEN IS NOT DISTINCT FROM 'FEMALE' THEN 'F' + WHEN trim('MALE ') THEN 'M' + WHEN trim(' FEMALE ') THEN 'F' + WHEN IS NOT DISTINCT FROM 'M' THEN 'M' + WHEN IS NOT DISTINCT FROM 'F' THEN 'F' + ELSE 'NO MATCH' END as case_gender +from combined_when +order by sid, name; + sid | name | gender | start_dt | case_gender +-------+----------------+----------+------------+------------- + 1000 | Jane Doe | F | 01-15-2011 | F + 2000 | Ryan Goesling | M | 02-01-2011 | M + 3000 | Tim Tebow | m | 01-15-2007 | M + 4000 | Katy Perry | F | 03-01-2011 | F + 5000 | Michael Scott | f | 02-01-2011 | F + 6000 | Mila Kunis | Female | 02-01-2011 | F + 7000 | Tom Brady | Male | 03-01-2011 | M + 8000 | Lady Gaga | | 01-15-2008 | NO MATCH + 9000 | George Michael | | 01-15-2011 | NO MATCH + 10000 | Michael Jordan | Male | | M +(10 rows) + +select sid, + name, + gender, + start_dt, + CASE extract(year from start_dt) + WHEN IS NOT DISTINCT FROM 2009 THEN 2009 + WHEN abs(2009-1) THEN 2008 + WHEN IS NOT DISTINCT FROM extract(year from '2010-01-01'::date) then 2010 + WHEN round(2007.05, 0) THEN 2007 + WHEN IS NOT DISTINCT FROM 2007 THEN 2007 + WHEN extract(year from '2006-01-01'::date) then 2006 + WHEN extract(year from '2011-01-01'::date) then 2011 + END as case_yr_start_dt +from combined_when +order by sid, name; + sid | name | gender | start_dt | case_yr_start_dt +-------+----------------+----------+------------+------------------ + 1000 | Jane Doe | F | 01-15-2011 | 2011 + 2000 | Ryan Goesling | M | 02-01-2011 | 2011 + 3000 | Tim Tebow | m | 01-15-2007 | 2007 + 4000 | Katy Perry | F | 03-01-2011 | 2011 + 5000 | Michael Scott | f | 02-01-2011 | 2011 + 6000 | Mila Kunis | Female | 02-01-2011 | 2011 + 7000 | Tom Brady | Male | 03-01-2011 | 2011 + 8000 | Lady Gaga | | 01-15-2008 | 2008 + 9000 | George Michael | | 01-15-2011 | 2011 + 10000 | Michael Jordan | Male | | +(10 rows) + +select case_yr_start_dt, count(sid) +from (select sid, + name, + gender, + start_dt, + CASE extract(year from start_dt) + WHEN IS NOT DISTINCT FROM 2009 THEN 2009 + WHEN abs(2009-1) THEN 2008 + WHEN IS NOT DISTINCT FROM extract(year from '2010-01-01'::date) then 2010 + WHEN round(2007.05, 0) THEN 2007 + WHEN IS NOT DISTINCT FROM 2007 THEN 2007 + WHEN extract(year from '2006-01-01'::date) then 2006 + WHEN extract(year from '2011-01-01'::date) then 2011 + END as case_yr_start_dt +from combined_when +order by sid, name) a +group by case_yr_start_dt +order by 2 desc, 1; + case_yr_start_dt | count +------------------+------- + 2011 | 7 + 2007 | 1 + 2008 | 1 + | 1 +(4 rows) + +select CASE 'a' + WHEN IS NOT DISTINCT FROM 'b' THEN 'a=b' + WHEN NOT DISTINCT FROM 'a' THEN 'a=a' +END; +ERROR: syntax error at or near "DISTINCT" +LINE 3: WHEN NOT DISTINCT FROM 'a' THEN 'a=a' + ^ +select CASE 'a' + WHEN IS NOT DISTINCT 'b' THEN 'a=b' + WHEN IS NOT DISTINCT FROM 'a' THEN 'a=a' +END; +ERROR: syntax error at or near "'b'" +LINE 2: WHEN IS NOT DISTINCT 'b' THEN 'a=b' + ^ +select CASE 'a' + WHEN IS NOT DISTINCT FROM 'b' THEN 'a=b' + WHEN IS NOT DISTINCT FROM 'a' IS 'a=a' +END; +ERROR: syntax error at or near "'a=a'" +LINE 3: WHEN IS NOT DISTINCT FROM 'a' IS 'a=a' + ^ +select CASE 'a' + WHEN IS NOT DISTINCT FROM 'b' IS 'a=b' + WHEN IS NOT DISTINCT FROM 'a' THEN 'a=a' +END; +ERROR: syntax error at or near "'a=b'" +LINE 2: WHEN IS NOT DISTINCT FROM 'b' IS 'a=b' + ^ +select CASE 1 + WHEN IS NOT DISTINCT FROM 2 THEN '1=2' + WHEN IS DISTINCT FROM 2 THEN '1<>2' + WHEN IS NOT DISTINCT FROM 1 THEN '1=1' +END; +ERROR: syntax error at or near "DISTINCT" +LINE 3: WHEN IS DISTINCT FROM 2 THEN '1<>2' + ^ +-- +-- Case expression in group by +-- +SELECT + CASE t.field1 + WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying + ELSE t.field1 + END AS field1 + FROM ( SELECT 'test value'::text AS field1) t + GROUP BY + CASE t.field1 + WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying + ELSE t.field1 + END; + field1 +------------ + test value +(1 row) + + +-- +-- Variant of case expression in group by +-- +SELECT + CASE t.field1 + WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying + ELSE t.field1 + END AS field1 + FROM ( SELECT 'test value'::text AS field1) t + GROUP BY 1; + field1 +------------ + test value +(1 row) + + +-- +-- decode in group by +-- +SELECT + decode(t.field1, ''::text, 'Undefined'::character varying, t.field1) as field1 + FROM ( SELECT 'test value'::text AS field1) t + GROUP BY + decode(t.field1, ''::text, 'Undefined'::character varying, t.field1); + field1 +------------ + test value +(1 row) + + +-- +-- variant of decode in group by +-- + SELECT + decode(t.field1, ''::text, 'Undefined'::character varying, t.field1) as field1 + FROM ( SELECT 'test value'::text AS field1) t + GROUP BY 1; + field1 +------------ + test value +(1 row) + diff --git a/src/test/singlenode_regress/expected/char.out b/src/test/singlenode_regress/expected/char.out new file mode 100644 index 00000000000..d515b3ce34e --- /dev/null +++ b/src/test/singlenode_regress/expected/char.out @@ -0,0 +1,122 @@ +-- +-- CHAR +-- +-- fixed-length by value +-- internally passed by value if <= 4 bytes in storage +SELECT char 'c' = char 'c' AS true; + true +------ + t +(1 row) + +-- +-- Build a table for testing +-- +CREATE TABLE CHAR_TBL(f1 char); +INSERT INTO CHAR_TBL (f1) VALUES ('a'); +INSERT INTO CHAR_TBL (f1) VALUES ('A'); +-- any of the following three input formats are acceptable +INSERT INTO CHAR_TBL (f1) VALUES ('1'); +INSERT INTO CHAR_TBL (f1) VALUES (2); +INSERT INTO CHAR_TBL (f1) VALUES ('3'); +-- zero-length char +INSERT INTO CHAR_TBL (f1) VALUES (''); +-- try char's of greater than 1 length +INSERT INTO CHAR_TBL (f1) VALUES ('cd'); +ERROR: value too long for type character(1) +INSERT INTO CHAR_TBL (f1) VALUES ('c '); +SELECT * FROM CHAR_TBL; + f1 +---- + a + A + 1 + 2 + 3 + + c +(7 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 <> 'a'; + f1 +---- + A + 1 + 2 + 3 + + c +(6 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 = 'a'; + f1 +---- + a +(1 row) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 < 'a'; + f1 +---- + A + 1 + 2 + 3 + +(5 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 <= 'a'; + f1 +---- + a + A + 1 + 2 + 3 + +(6 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 > 'a'; + f1 +---- + c +(1 row) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 >= 'a'; + f1 +---- + a + c +(2 rows) + +DROP TABLE CHAR_TBL; +-- +-- Now test longer arrays of char +-- +CREATE TABLE CHAR_TBL(f1 char(4)); +INSERT INTO CHAR_TBL (f1) VALUES ('a'); +INSERT INTO CHAR_TBL (f1) VALUES ('ab'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcd'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); +ERROR: value too long for type character(4) +INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); +SELECT * FROM CHAR_TBL; + f1 +------ + a + ab + abcd + abcd +(4 rows) + diff --git a/src/test/singlenode_regress/expected/char_1.out b/src/test/singlenode_regress/expected/char_1.out new file mode 100644 index 00000000000..6c917c0b680 --- /dev/null +++ b/src/test/singlenode_regress/expected/char_1.out @@ -0,0 +1,122 @@ +-- +-- CHAR +-- +-- fixed-length by value +-- internally passed by value if <= 4 bytes in storage +SELECT char 'c' = char 'c' AS true; + true +------ + t +(1 row) + +-- +-- Build a table for testing +-- +CREATE TABLE CHAR_TBL(f1 char); +INSERT INTO CHAR_TBL (f1) VALUES ('a'); +INSERT INTO CHAR_TBL (f1) VALUES ('A'); +-- any of the following three input formats are acceptable +INSERT INTO CHAR_TBL (f1) VALUES ('1'); +INSERT INTO CHAR_TBL (f1) VALUES (2); +INSERT INTO CHAR_TBL (f1) VALUES ('3'); +-- zero-length char +INSERT INTO CHAR_TBL (f1) VALUES (''); +-- try char's of greater than 1 length +INSERT INTO CHAR_TBL (f1) VALUES ('cd'); +ERROR: value too long for type character(1) +INSERT INTO CHAR_TBL (f1) VALUES ('c '); +SELECT * FROM CHAR_TBL; + f1 +---- + a + A + 1 + 2 + 3 + + c +(7 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 <> 'a'; + f1 +---- + A + 1 + 2 + 3 + + c +(6 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 = 'a'; + f1 +---- + a +(1 row) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 < 'a'; + f1 +---- + 1 + 2 + 3 + +(4 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 <= 'a'; + f1 +---- + a + 1 + 2 + 3 + +(5 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 > 'a'; + f1 +---- + A + c +(2 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 >= 'a'; + f1 +---- + a + A + c +(3 rows) + +DROP TABLE CHAR_TBL; +-- +-- Now test longer arrays of char +-- +CREATE TABLE CHAR_TBL(f1 char(4)); +INSERT INTO CHAR_TBL (f1) VALUES ('a'); +INSERT INTO CHAR_TBL (f1) VALUES ('ab'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcd'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); +ERROR: value too long for type character(4) +INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); +SELECT * FROM CHAR_TBL; + f1 +------ + a + ab + abcd + abcd +(4 rows) + diff --git a/src/test/singlenode_regress/expected/char_2.out b/src/test/singlenode_regress/expected/char_2.out new file mode 100644 index 00000000000..9a54658632c --- /dev/null +++ b/src/test/singlenode_regress/expected/char_2.out @@ -0,0 +1,122 @@ +-- +-- CHAR +-- +-- fixed-length by value +-- internally passed by value if <= 4 bytes in storage +SELECT char 'c' = char 'c' AS true; + true +------ + t +(1 row) + +-- +-- Build a table for testing +-- +CREATE TABLE CHAR_TBL(f1 char); +INSERT INTO CHAR_TBL (f1) VALUES ('a'); +INSERT INTO CHAR_TBL (f1) VALUES ('A'); +-- any of the following three input formats are acceptable +INSERT INTO CHAR_TBL (f1) VALUES ('1'); +INSERT INTO CHAR_TBL (f1) VALUES (2); +INSERT INTO CHAR_TBL (f1) VALUES ('3'); +-- zero-length char +INSERT INTO CHAR_TBL (f1) VALUES (''); +-- try char's of greater than 1 length +INSERT INTO CHAR_TBL (f1) VALUES ('cd'); +ERROR: value too long for type character(1) +INSERT INTO CHAR_TBL (f1) VALUES ('c '); +SELECT * FROM CHAR_TBL; + f1 +---- + a + A + 1 + 2 + 3 + + c +(7 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 <> 'a'; + f1 +---- + A + 1 + 2 + 3 + + c +(6 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 = 'a'; + f1 +---- + a +(1 row) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 < 'a'; + f1 +---- + +(1 row) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 <= 'a'; + f1 +---- + a + +(2 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 > 'a'; + f1 +---- + A + 1 + 2 + 3 + c +(5 rows) + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 >= 'a'; + f1 +---- + a + A + 1 + 2 + 3 + c +(6 rows) + +DROP TABLE CHAR_TBL; +-- +-- Now test longer arrays of char +-- +CREATE TABLE CHAR_TBL(f1 char(4)); +INSERT INTO CHAR_TBL (f1) VALUES ('a'); +INSERT INTO CHAR_TBL (f1) VALUES ('ab'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcd'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); +ERROR: value too long for type character(4) +INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); +SELECT * FROM CHAR_TBL; + f1 +------ + a + ab + abcd + abcd +(4 rows) + diff --git a/src/test/singlenode_regress/expected/circle.out b/src/test/singlenode_regress/expected/circle.out new file mode 100644 index 00000000000..c3b05274de9 --- /dev/null +++ b/src/test/singlenode_regress/expected/circle.out @@ -0,0 +1,125 @@ +-- +-- CIRCLE +-- +-- Back off displayed precision a little bit to reduce platform-to-platform +-- variation in results. +SET extra_float_digits = -1; +CREATE TABLE CIRCLE_TBL (f1 circle); +INSERT INTO CIRCLE_TBL VALUES ('<(5,1),3>'); +INSERT INTO CIRCLE_TBL VALUES ('((1,2),100)'); +INSERT INTO CIRCLE_TBL VALUES (' 1 , 3 , 5 '); +INSERT INTO CIRCLE_TBL VALUES (' ( ( 1 , 2 ) , 3 ) '); +INSERT INTO CIRCLE_TBL VALUES (' ( 100 , 200 ) , 10 '); +INSERT INTO CIRCLE_TBL VALUES (' < ( 100 , 1 ) , 115 > '); +INSERT INTO CIRCLE_TBL VALUES ('<(3,5),0>'); -- Zero radius +INSERT INTO CIRCLE_TBL VALUES ('<(3,5),NaN>'); -- NaN radius +-- bad values +INSERT INTO CIRCLE_TBL VALUES ('<(-100,0),-100>'); +ERROR: invalid input syntax for type circle: "<(-100,0),-100>" +LINE 1: INSERT INTO CIRCLE_TBL VALUES ('<(-100,0),-100>'); + ^ +INSERT INTO CIRCLE_TBL VALUES ('<(100,200),10'); +ERROR: invalid input syntax for type circle: "<(100,200),10" +LINE 1: INSERT INTO CIRCLE_TBL VALUES ('<(100,200),10'); + ^ +INSERT INTO CIRCLE_TBL VALUES ('<(100,200),10> x'); +ERROR: invalid input syntax for type circle: "<(100,200),10> x" +LINE 1: INSERT INTO CIRCLE_TBL VALUES ('<(100,200),10> x'); + ^ +INSERT INTO CIRCLE_TBL VALUES ('1abc,3,5'); +ERROR: invalid input syntax for type circle: "1abc,3,5" +LINE 1: INSERT INTO CIRCLE_TBL VALUES ('1abc,3,5'); + ^ +INSERT INTO CIRCLE_TBL VALUES ('(3,(1,2),3)'); +ERROR: invalid input syntax for type circle: "(3,(1,2),3)" +LINE 1: INSERT INTO CIRCLE_TBL VALUES ('(3,(1,2),3)'); + ^ +SELECT * FROM CIRCLE_TBL; + f1 +---------------- + <(5,1),3> + <(1,2),100> + <(1,3),5> + <(1,2),3> + <(100,200),10> + <(100,1),115> + <(3,5),0> + <(3,5),NaN> +(8 rows) + +SELECT center(f1) AS center + FROM CIRCLE_TBL; + center +----------- + (5,1) + (1,2) + (1,3) + (1,2) + (100,200) + (100,1) + (3,5) + (3,5) +(8 rows) + +SELECT radius(f1) AS radius + FROM CIRCLE_TBL; + radius +-------- + 3 + 100 + 5 + 3 + 10 + 115 + 0 + NaN +(8 rows) + +SELECT diameter(f1) AS diameter + FROM CIRCLE_TBL; + diameter +---------- + 6 + 200 + 10 + 6 + 20 + 230 + 0 + NaN +(8 rows) + +SELECT f1 FROM CIRCLE_TBL WHERE radius(f1) < 5; + f1 +----------- + <(5,1),3> + <(1,2),3> + <(3,5),0> +(3 rows) + +SELECT f1 FROM CIRCLE_TBL WHERE diameter(f1) >= 10; + f1 +---------------- + <(1,2),100> + <(1,3),5> + <(100,200),10> + <(100,1),115> + <(3,5),NaN> +(5 rows) + +SELECT c1.f1 AS one, c2.f1 AS two, (c1.f1 <-> c2.f1) AS distance + FROM CIRCLE_TBL c1, CIRCLE_TBL c2 + WHERE (c1.f1 < c2.f1) AND ((c1.f1 <-> c2.f1) > 0) + ORDER BY distance, area(c1.f1), area(c2.f1); + one | two | distance +----------------+----------------+------------------ + <(3,5),0> | <(1,2),3> | 0.60555127546399 + <(3,5),0> | <(5,1),3> | 1.4721359549996 + <(100,200),10> | <(100,1),115> | 74 + <(100,200),10> | <(1,2),100> | 111.37072977248 + <(1,3),5> | <(100,200),10> | 205.4767561445 + <(5,1),3> | <(100,200),10> | 207.51303816328 + <(3,5),0> | <(100,200),10> | 207.79348015953 + <(1,2),3> | <(100,200),10> | 208.37072977248 +(8 rows) + diff --git a/src/test/singlenode_regress/expected/cluster.out b/src/test/singlenode_regress/expected/cluster.out new file mode 100644 index 00000000000..88c90d22578 --- /dev/null +++ b/src/test/singlenode_regress/expected/cluster.out @@ -0,0 +1,599 @@ +-- +-- CLUSTER +-- +CREATE TABLE clstr_tst_s (rf_a SERIAL PRIMARY KEY, + b INT); +CREATE TABLE clstr_tst (a SERIAL PRIMARY KEY, + b INT, + c TEXT, + d TEXT, + CONSTRAINT clstr_tst_con FOREIGN KEY (b) REFERENCES clstr_tst_s); +CREATE INDEX clstr_tst_b ON clstr_tst (b); +CREATE INDEX clstr_tst_c ON clstr_tst (c); +CREATE INDEX clstr_tst_c_b ON clstr_tst (c,b); +CREATE INDEX clstr_tst_b_c ON clstr_tst (b,c); +INSERT INTO clstr_tst_s (b) VALUES (0); +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +CREATE TABLE clstr_tst_inh () INHERITS (clstr_tst); +INSERT INTO clstr_tst (b, c) VALUES (11, 'once'); +INSERT INTO clstr_tst (b, c) VALUES (10, 'diez'); +INSERT INTO clstr_tst (b, c) VALUES (31, 'treinta y uno'); +INSERT INTO clstr_tst (b, c) VALUES (22, 'veintidos'); +INSERT INTO clstr_tst (b, c) VALUES (3, 'tres'); +INSERT INTO clstr_tst (b, c) VALUES (20, 'veinte'); +INSERT INTO clstr_tst (b, c) VALUES (23, 'veintitres'); +INSERT INTO clstr_tst (b, c) VALUES (21, 'veintiuno'); +INSERT INTO clstr_tst (b, c) VALUES (4, 'cuatro'); +INSERT INTO clstr_tst (b, c) VALUES (14, 'catorce'); +INSERT INTO clstr_tst (b, c) VALUES (2, 'dos'); +INSERT INTO clstr_tst (b, c) VALUES (18, 'dieciocho'); +INSERT INTO clstr_tst (b, c) VALUES (27, 'veintisiete'); +INSERT INTO clstr_tst (b, c) VALUES (25, 'veinticinco'); +INSERT INTO clstr_tst (b, c) VALUES (13, 'trece'); +INSERT INTO clstr_tst (b, c) VALUES (28, 'veintiocho'); +INSERT INTO clstr_tst (b, c) VALUES (32, 'treinta y dos'); +INSERT INTO clstr_tst (b, c) VALUES (5, 'cinco'); +INSERT INTO clstr_tst (b, c) VALUES (29, 'veintinueve'); +INSERT INTO clstr_tst (b, c) VALUES (1, 'uno'); +INSERT INTO clstr_tst (b, c) VALUES (24, 'veinticuatro'); +INSERT INTO clstr_tst (b, c) VALUES (30, 'treinta'); +INSERT INTO clstr_tst (b, c) VALUES (12, 'doce'); +INSERT INTO clstr_tst (b, c) VALUES (17, 'diecisiete'); +INSERT INTO clstr_tst (b, c) VALUES (9, 'nueve'); +INSERT INTO clstr_tst (b, c) VALUES (19, 'diecinueve'); +INSERT INTO clstr_tst (b, c) VALUES (26, 'veintiseis'); +INSERT INTO clstr_tst (b, c) VALUES (15, 'quince'); +INSERT INTO clstr_tst (b, c) VALUES (7, 'siete'); +INSERT INTO clstr_tst (b, c) VALUES (16, 'dieciseis'); +INSERT INTO clstr_tst (b, c) VALUES (8, 'ocho'); +-- This entry is needed to test that TOASTED values are copied correctly. +INSERT INTO clstr_tst (b, c, d) VALUES (6, 'seis', repeat('xyzzy', 100000)); +CLUSTER clstr_tst_c ON clstr_tst; +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst; + a | b | c | substring | length +----+----+---------------+--------------------------------+-------- + 10 | 14 | catorce | | + 18 | 5 | cinco | | + 9 | 4 | cuatro | | + 26 | 19 | diecinueve | | + 12 | 18 | dieciocho | | + 30 | 16 | dieciseis | | + 24 | 17 | diecisiete | | + 2 | 10 | diez | | + 23 | 12 | doce | | + 11 | 2 | dos | | + 25 | 9 | nueve | | + 31 | 8 | ocho | | + 1 | 11 | once | | + 28 | 15 | quince | | + 32 | 6 | seis | xyzzyxyzzyxyzzyxyzzyxyzzyxyzzy | 500000 + 29 | 7 | siete | | + 15 | 13 | trece | | + 22 | 30 | treinta | | + 17 | 32 | treinta y dos | | + 3 | 31 | treinta y uno | | + 5 | 3 | tres | | + 20 | 1 | uno | | + 6 | 20 | veinte | | + 14 | 25 | veinticinco | | + 21 | 24 | veinticuatro | | + 4 | 22 | veintidos | | + 19 | 29 | veintinueve | | + 16 | 28 | veintiocho | | + 27 | 26 | veintiseis | | + 13 | 27 | veintisiete | | + 7 | 23 | veintitres | | + 8 | 21 | veintiuno | | +(32 rows) + +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst ORDER BY a; + a | b | c | substring | length +----+----+---------------+--------------------------------+-------- + 1 | 11 | once | | + 2 | 10 | diez | | + 3 | 31 | treinta y uno | | + 4 | 22 | veintidos | | + 5 | 3 | tres | | + 6 | 20 | veinte | | + 7 | 23 | veintitres | | + 8 | 21 | veintiuno | | + 9 | 4 | cuatro | | + 10 | 14 | catorce | | + 11 | 2 | dos | | + 12 | 18 | dieciocho | | + 13 | 27 | veintisiete | | + 14 | 25 | veinticinco | | + 15 | 13 | trece | | + 16 | 28 | veintiocho | | + 17 | 32 | treinta y dos | | + 18 | 5 | cinco | | + 19 | 29 | veintinueve | | + 20 | 1 | uno | | + 21 | 24 | veinticuatro | | + 22 | 30 | treinta | | + 23 | 12 | doce | | + 24 | 17 | diecisiete | | + 25 | 9 | nueve | | + 26 | 19 | diecinueve | | + 27 | 26 | veintiseis | | + 28 | 15 | quince | | + 29 | 7 | siete | | + 30 | 16 | dieciseis | | + 31 | 8 | ocho | | + 32 | 6 | seis | xyzzyxyzzyxyzzyxyzzyxyzzyxyzzy | 500000 +(32 rows) + +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst ORDER BY b; + a | b | c | substring | length +----+----+---------------+--------------------------------+-------- + 20 | 1 | uno | | + 11 | 2 | dos | | + 5 | 3 | tres | | + 9 | 4 | cuatro | | + 18 | 5 | cinco | | + 32 | 6 | seis | xyzzyxyzzyxyzzyxyzzyxyzzyxyzzy | 500000 + 29 | 7 | siete | | + 31 | 8 | ocho | | + 25 | 9 | nueve | | + 2 | 10 | diez | | + 1 | 11 | once | | + 23 | 12 | doce | | + 15 | 13 | trece | | + 10 | 14 | catorce | | + 28 | 15 | quince | | + 30 | 16 | dieciseis | | + 24 | 17 | diecisiete | | + 12 | 18 | dieciocho | | + 26 | 19 | diecinueve | | + 6 | 20 | veinte | | + 8 | 21 | veintiuno | | + 4 | 22 | veintidos | | + 7 | 23 | veintitres | | + 21 | 24 | veinticuatro | | + 14 | 25 | veinticinco | | + 27 | 26 | veintiseis | | + 13 | 27 | veintisiete | | + 16 | 28 | veintiocho | | + 19 | 29 | veintinueve | | + 22 | 30 | treinta | | + 3 | 31 | treinta y uno | | + 17 | 32 | treinta y dos | | +(32 rows) + +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst ORDER BY c; + a | b | c | substring | length +----+----+---------------+--------------------------------+-------- + 10 | 14 | catorce | | + 18 | 5 | cinco | | + 9 | 4 | cuatro | | + 26 | 19 | diecinueve | | + 12 | 18 | dieciocho | | + 30 | 16 | dieciseis | | + 24 | 17 | diecisiete | | + 2 | 10 | diez | | + 23 | 12 | doce | | + 11 | 2 | dos | | + 25 | 9 | nueve | | + 31 | 8 | ocho | | + 1 | 11 | once | | + 28 | 15 | quince | | + 32 | 6 | seis | xyzzyxyzzyxyzzyxyzzyxyzzyxyzzy | 500000 + 29 | 7 | siete | | + 15 | 13 | trece | | + 22 | 30 | treinta | | + 17 | 32 | treinta y dos | | + 3 | 31 | treinta y uno | | + 5 | 3 | tres | | + 20 | 1 | uno | | + 6 | 20 | veinte | | + 14 | 25 | veinticinco | | + 21 | 24 | veinticuatro | | + 4 | 22 | veintidos | | + 19 | 29 | veintinueve | | + 16 | 28 | veintiocho | | + 27 | 26 | veintiseis | | + 13 | 27 | veintisiete | | + 7 | 23 | veintitres | | + 8 | 21 | veintiuno | | +(32 rows) + +-- Verify that inheritance link still works +INSERT INTO clstr_tst_inh VALUES (0, 100, 'in child table'); +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst; + a | b | c | substring | length +----+-----+----------------+--------------------------------+-------- + 10 | 14 | catorce | | + 18 | 5 | cinco | | + 9 | 4 | cuatro | | + 26 | 19 | diecinueve | | + 12 | 18 | dieciocho | | + 30 | 16 | dieciseis | | + 24 | 17 | diecisiete | | + 2 | 10 | diez | | + 23 | 12 | doce | | + 11 | 2 | dos | | + 25 | 9 | nueve | | + 31 | 8 | ocho | | + 1 | 11 | once | | + 28 | 15 | quince | | + 32 | 6 | seis | xyzzyxyzzyxyzzyxyzzyxyzzyxyzzy | 500000 + 29 | 7 | siete | | + 15 | 13 | trece | | + 22 | 30 | treinta | | + 17 | 32 | treinta y dos | | + 3 | 31 | treinta y uno | | + 5 | 3 | tres | | + 20 | 1 | uno | | + 6 | 20 | veinte | | + 14 | 25 | veinticinco | | + 21 | 24 | veinticuatro | | + 4 | 22 | veintidos | | + 19 | 29 | veintinueve | | + 16 | 28 | veintiocho | | + 27 | 26 | veintiseis | | + 13 | 27 | veintisiete | | + 7 | 23 | veintitres | | + 8 | 21 | veintiuno | | + 0 | 100 | in child table | | +(33 rows) + +-- Verify that foreign key link still works +INSERT INTO clstr_tst (b, c) VALUES (1111, 'this should fail'); +SELECT conname FROM pg_constraint WHERE conrelid = 'clstr_tst'::regclass +ORDER BY 1; + conname +---------------- + clstr_tst_con + clstr_tst_pkey +(2 rows) + +SELECT relname, relkind, + EXISTS(SELECT 1 FROM pg_class WHERE oid = c.reltoastrelid) AS hastoast +FROM pg_class c WHERE relname LIKE 'clstr_tst%' ORDER BY relname; + relname | relkind | hastoast +----------------------+---------+---------- + clstr_tst | r | t + clstr_tst_a_seq | S | f + clstr_tst_b | i | f + clstr_tst_b_c | i | f + clstr_tst_c | i | f + clstr_tst_c_b | i | f + clstr_tst_inh | r | t + clstr_tst_pkey | i | f + clstr_tst_s | r | f + clstr_tst_s_pkey | i | f + clstr_tst_s_rf_a_seq | S | f +(11 rows) + +-- Verify that indisclustered is correctly set +SELECT pg_class.relname FROM pg_index, pg_class, pg_class AS pg_class_2 +WHERE pg_class.oid=indexrelid + AND indrelid=pg_class_2.oid + AND pg_class_2.relname = 'clstr_tst' + AND indisclustered; + relname +------------- + clstr_tst_c +(1 row) + +-- Try changing indisclustered +ALTER TABLE clstr_tst CLUSTER ON clstr_tst_b_c; +SELECT pg_class.relname FROM pg_index, pg_class, pg_class AS pg_class_2 +WHERE pg_class.oid=indexrelid + AND indrelid=pg_class_2.oid + AND pg_class_2.relname = 'clstr_tst' + AND indisclustered; + relname +--------------- + clstr_tst_b_c +(1 row) + +-- Try turning off all clustering +ALTER TABLE clstr_tst SET WITHOUT CLUSTER; +SELECT pg_class.relname FROM pg_index, pg_class, pg_class AS pg_class_2 +WHERE pg_class.oid=indexrelid + AND indrelid=pg_class_2.oid + AND pg_class_2.relname = 'clstr_tst' + AND indisclustered; + relname +--------- +(0 rows) + +-- Verify that clustering all tables does in fact cluster the right ones +CREATE USER regress_clstr_user; +CREATE TABLE clstr_1 (a INT PRIMARY KEY); +CREATE TABLE clstr_2 (a INT PRIMARY KEY); +CREATE TABLE clstr_3 (a INT PRIMARY KEY); +ALTER TABLE clstr_1 OWNER TO regress_clstr_user; +ALTER TABLE clstr_3 OWNER TO regress_clstr_user; +GRANT SELECT ON clstr_2 TO regress_clstr_user; +INSERT INTO clstr_1 VALUES (2); +INSERT INTO clstr_1 VALUES (1); +INSERT INTO clstr_2 VALUES (2); +INSERT INTO clstr_2 VALUES (1); +INSERT INTO clstr_3 VALUES (2); +INSERT INTO clstr_3 VALUES (1); +-- "CLUSTER " on a table that hasn't been clustered +CLUSTER clstr_2; +ERROR: there is no previously clustered index for table "clstr_2" +CLUSTER clstr_1_pkey ON clstr_1; +CLUSTER clstr_2 USING clstr_2_pkey; +SELECT * FROM clstr_1 UNION ALL + SELECT * FROM clstr_2 UNION ALL + SELECT * FROM clstr_3; + a +--- + 1 + 2 + 1 + 2 + 2 + 1 +(6 rows) + +-- revert to the original state +DELETE FROM clstr_1; +DELETE FROM clstr_2; +DELETE FROM clstr_3; +INSERT INTO clstr_1 VALUES (2); +INSERT INTO clstr_1 VALUES (1); +INSERT INTO clstr_2 VALUES (2); +INSERT INTO clstr_2 VALUES (1); +INSERT INTO clstr_3 VALUES (2); +INSERT INTO clstr_3 VALUES (1); +-- this user can only cluster clstr_1 and clstr_3, but the latter +-- has not been clustered +SET SESSION AUTHORIZATION regress_clstr_user; +CLUSTER; +SELECT * FROM clstr_1 UNION ALL + SELECT * FROM clstr_2 UNION ALL + SELECT * FROM clstr_3; + a +--- + 1 + 2 + 2 + 1 + 2 + 1 +(6 rows) + +-- cluster a single table using the indisclustered bit previously set +DELETE FROM clstr_1; +INSERT INTO clstr_1 VALUES (2); +INSERT INTO clstr_1 VALUES (1); +CLUSTER clstr_1; +SELECT * FROM clstr_1; + a +--- + 1 + 2 +(2 rows) + +-- Test MVCC-safety of cluster. There isn't much we can do to verify the +-- results with a single backend... +CREATE TABLE clustertest (key int PRIMARY KEY); +INSERT INTO clustertest VALUES (10); +INSERT INTO clustertest VALUES (20); +INSERT INTO clustertest VALUES (30); +INSERT INTO clustertest VALUES (40); +INSERT INTO clustertest VALUES (50); +-- Use a transaction so that updates are not committed when CLUSTER sees 'em +BEGIN; +-- Test update where the old row version is found first in the scan +UPDATE clustertest SET key = 100 WHERE key = 10; +-- Test update where the new row version is found first in the scan +UPDATE clustertest SET key = 35 WHERE key = 40; +-- Test longer update chain +UPDATE clustertest SET key = 60 WHERE key = 50; +UPDATE clustertest SET key = 70 WHERE key = 60; +UPDATE clustertest SET key = 80 WHERE key = 70; +SELECT * FROM clustertest; + key +----- + 20 + 30 + 100 + 35 + 80 +(5 rows) + +CLUSTER clustertest_pkey ON clustertest; +SELECT * FROM clustertest; + key +----- + 20 + 30 + 35 + 80 + 100 +(5 rows) + +COMMIT; +SELECT * FROM clustertest; + key +----- + 20 + 30 + 35 + 80 + 100 +(5 rows) + +-- check that temp tables can be clustered +create temp table clstr_temp (col1 int primary key, col2 text); +insert into clstr_temp values (2, 'two'), (1, 'one'); +cluster clstr_temp using clstr_temp_pkey; +select * from clstr_temp; + col1 | col2 +------+------ + 1 | one + 2 | two +(2 rows) + +drop table clstr_temp; +RESET SESSION AUTHORIZATION; +-- check clustering an empty table +DROP TABLE clustertest; +CREATE TABLE clustertest (f1 int PRIMARY KEY); +CLUSTER clustertest USING clustertest_pkey; +CLUSTER clustertest; +-- Check that partitioned tables cannot be clustered +CREATE TABLE clstrpart (a int) PARTITION BY RANGE (a); +CREATE INDEX clstrpart_idx ON clstrpart (a); +ALTER TABLE clstrpart CLUSTER ON clstrpart_idx; +ERROR: cannot mark index clustered in partitioned table +CLUSTER clstrpart USING clstrpart_idx; +ERROR: cannot cluster a partitioned table +DROP TABLE clstrpart; +-- Test CLUSTER with external tuplesorting +create table clstr_4 as select * from tenk1; +create index cluster_sort on clstr_4 (hundred, thousand, tenthous); +-- ensure we don't use the index in CLUSTER nor the checking SELECTs +set enable_indexscan = off; +-- Use external sort: +set maintenance_work_mem = '1MB'; +cluster clstr_4 using cluster_sort; +select * from +(select hundred, lag(hundred) over () as lhundred, + thousand, lag(thousand) over () as lthousand, + tenthous, lag(tenthous) over () as ltenthous from clstr_4) ss +where row(hundred, thousand, tenthous) <= row(lhundred, lthousand, ltenthous); + hundred | lhundred | thousand | lthousand | tenthous | ltenthous +---------+----------+----------+-----------+----------+----------- +(0 rows) + +reset enable_indexscan; +reset maintenance_work_mem; +-- test CLUSTER on expression index +CREATE TABLE clstr_expression(id serial primary key, a int, b text COLLATE "C"); +INSERT INTO clstr_expression(a, b) SELECT g.i % 42, 'prefix'||g.i FROM generate_series(1, 133) g(i); +CREATE INDEX clstr_expression_minus_a ON clstr_expression ((-a), b); +CREATE INDEX clstr_expression_upper_b ON clstr_expression ((upper(b))); +-- verify indexes work before cluster +BEGIN; +SET LOCAL enable_seqscan = false; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; + QUERY PLAN +--------------------------------------------------------------- + Index Scan using clstr_expression_upper_b on clstr_expression + Index Cond: (upper(b) = 'PREFIX3'::text) +(2 rows) + +SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; + id | a | b +----+---+--------- + 3 | 3 | prefix3 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; + QUERY PLAN +--------------------------------------------------------------- + Index Scan using clstr_expression_minus_a on clstr_expression + Index Cond: ((- a) = '-3'::integer) +(2 rows) + +SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; + id | a | b +-----+---+----------- + 129 | 3 | prefix129 + 3 | 3 | prefix3 + 45 | 3 | prefix45 + 87 | 3 | prefix87 +(4 rows) + +COMMIT; +-- and after clustering on clstr_expression_minus_a +CLUSTER clstr_expression USING clstr_expression_minus_a; +WITH rows AS + (SELECT ctid, lag(a) OVER (ORDER BY ctid) AS la, a FROM clstr_expression) +SELECT * FROM rows WHERE la < a; + ctid | la | a +------+----+--- +(0 rows) + +BEGIN; +SET LOCAL enable_seqscan = false; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; + QUERY PLAN +--------------------------------------------------------------- + Index Scan using clstr_expression_upper_b on clstr_expression + Index Cond: (upper(b) = 'PREFIX3'::text) +(2 rows) + +SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; + id | a | b +----+---+--------- + 3 | 3 | prefix3 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; + QUERY PLAN +--------------------------------------------------------------- + Index Scan using clstr_expression_minus_a on clstr_expression + Index Cond: ((- a) = '-3'::integer) +(2 rows) + +SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; + id | a | b +-----+---+----------- + 129 | 3 | prefix129 + 3 | 3 | prefix3 + 45 | 3 | prefix45 + 87 | 3 | prefix87 +(4 rows) + +COMMIT; +-- and after clustering on clstr_expression_upper_b +CLUSTER clstr_expression USING clstr_expression_upper_b; +WITH rows AS + (SELECT ctid, lag(b) OVER (ORDER BY ctid) AS lb, b FROM clstr_expression) +SELECT * FROM rows WHERE upper(lb) > upper(b); + ctid | lb | b +------+----+--- +(0 rows) + +BEGIN; +SET LOCAL enable_seqscan = false; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; + QUERY PLAN +--------------------------------------------------------------- + Index Scan using clstr_expression_upper_b on clstr_expression + Index Cond: (upper(b) = 'PREFIX3'::text) +(2 rows) + +SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; + id | a | b +----+---+--------- + 3 | 3 | prefix3 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; + QUERY PLAN +--------------------------------------------------------------- + Index Scan using clstr_expression_minus_a on clstr_expression + Index Cond: ((- a) = '-3'::integer) +(2 rows) + +SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; + id | a | b +-----+---+----------- + 129 | 3 | prefix129 + 3 | 3 | prefix3 + 45 | 3 | prefix45 + 87 | 3 | prefix87 +(4 rows) + +COMMIT; +-- clean up +DROP TABLE clustertest; +DROP TABLE clstr_1; +DROP TABLE clstr_2; +DROP TABLE clstr_3; +DROP TABLE clstr_4; +DROP TABLE clstr_expression; +DROP USER regress_clstr_user; diff --git a/src/test/singlenode_regress/expected/cluster_gp.out b/src/test/singlenode_regress/expected/cluster_gp.out new file mode 100644 index 00000000000..679ad6640ff --- /dev/null +++ b/src/test/singlenode_regress/expected/cluster_gp.out @@ -0,0 +1,63 @@ +-- Test CLUSTER with append optimized storage +CREATE TABLE cluster_ao_table( + id int, + fname text, + lname text, + address1 text, + address2 text, + city text, + state text, + zip text) +WITH (appendonly=true); +INSERT INTO cluster_ao_table (id, fname, lname, address1, address2, city, state, zip) +SELECT i, 'Jon_' || i, 'Roberts_' || i, i || ' Main Street', 'Apartment ' || i, 'New York', 'NY', i::text +FROM generate_series(1, 10000) AS i; +CREATE INDEX ON cluster_ao_table (id); +BEGIN; +CLUSTER cluster_ao_table USING cluster_ao_table_id_idx; +ABORT; +CLUSTER cluster_ao_table USING cluster_ao_table_id_idx; +SELECT * FROM cluster_ao_table WHERE id = 10; + id | fname | lname | address1 | address2 | city | state | zip +----+--------+------------+----------------+--------------+----------+-------+----- + 10 | Jon_10 | Roberts_10 | 10 Main Street | Apartment 10 | New York | NY | 10 +(1 row) + +DROP TABLE cluster_ao_table; +-- Test CLUSTER with append optimized columnar storage +CREATE TABLE cluster_ao_table( + id int, + fname text, + lname text, + address1 text, + address2 text, + city text, + state text, + zip text) +WITH (appendonly=true, orientation=column); +INSERT INTO cluster_ao_table (id, fname, lname, address1, address2, city, state, zip) +SELECT i, 'Jon_' || i, 'Roberts_' || i, i || ' Main Street', 'Apartment ' || i, 'New York', 'NY', i::text +FROM generate_series(1, 10000) AS i; +CREATE INDEX ON cluster_ao_table (id); +BEGIN; +CLUSTER cluster_ao_table USING cluster_ao_table_id_idx; +ABORT; +CLUSTER cluster_ao_table USING cluster_ao_table_id_idx; +SELECT * FROM cluster_ao_table WHERE id = 10; + id | fname | lname | address1 | address2 | city | state | zip +----+--------+------------+----------------+--------------+----------+-------+----- + 10 | Jon_10 | Roberts_10 | 10 Main Street | Apartment 10 | New York | NY | 10 +(1 row) + +DROP TABLE cluster_ao_table; +-- Test transactional safety of CLUSTER against heap +CREATE TABLE cluster_foo (a int, b varchar, c int); +INSERT INTO cluster_foo SELECT i, 'initial insert' || i, i FROM generate_series(1,10000)i; +CREATE index cluster_ifoo on cluster_foo using btree (b); +-- execute cluster in a transaction but don't commit the transaction +BEGIN; +CLUSTER cluster_foo USING cluster_ifoo; +ABORT; +-- try cluster again +CLUSTER cluster_foo USING cluster_ifoo; +DROP TABLE cluster_foo; diff --git a/src/test/singlenode_regress/expected/collate.icu.utf8.out b/src/test/singlenode_regress/expected/collate.icu.utf8.out new file mode 100644 index 00000000000..70133df8042 --- /dev/null +++ b/src/test/singlenode_regress/expected/collate.icu.utf8.out @@ -0,0 +1,1959 @@ +/* + * This test is for ICU collations. + */ +/* skip test if not UTF8 server encoding or no ICU collations installed */ +SELECT getdatabaseencoding() <> 'UTF8' OR + (SELECT count(*) FROM pg_collation WHERE collprovider = 'i') = 0 + AS skip_test \gset +\if :skip_test +\quit +\endif +SET client_encoding TO UTF8; +CREATE SCHEMA collate_tests; +SET search_path = collate_tests; +CREATE TABLE collate_test1 ( + a int, + b text COLLATE "en-x-icu" NOT NULL +); +\d collate_test1 + Table "collate_tests.collate_test1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | en-x-icu | not null | + +CREATE TABLE collate_test_fail ( + a int, + b text COLLATE "ja_JP.eucjp-x-icu" +); +ERROR: collation "ja_JP.eucjp-x-icu" for encoding "UTF8" does not exist +LINE 3: b text COLLATE "ja_JP.eucjp-x-icu" + ^ +CREATE TABLE collate_test_fail ( + a int, + b text COLLATE "foo-x-icu" +); +ERROR: collation "foo-x-icu" for encoding "UTF8" does not exist +LINE 3: b text COLLATE "foo-x-icu" + ^ +CREATE TABLE collate_test_fail ( + a int COLLATE "en-x-icu", + b text +); +ERROR: collations are not supported by type integer +LINE 2: a int COLLATE "en-x-icu", + ^ +CREATE TABLE collate_test_like ( + LIKE collate_test1 +); +\d collate_test_like + Table "collate_tests.collate_test_like" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | en-x-icu | not null | + +CREATE TABLE collate_test2 ( + a int, + b text COLLATE "sv-x-icu" +); +CREATE TABLE collate_test3 ( + a int, + b text COLLATE "C" +); +INSERT INTO collate_test1 VALUES (1, 'abc'), (2, 'äbc'), (3, 'bbc'), (4, 'ABC'); +INSERT INTO collate_test2 SELECT * FROM collate_test1; +INSERT INTO collate_test3 SELECT * FROM collate_test1; +SELECT * FROM collate_test1 WHERE b >= 'bbc'; + a | b +---+----- + 3 | bbc +(1 row) + +SELECT * FROM collate_test2 WHERE b >= 'bbc'; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test3 WHERE b >= 'bbc'; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test3 WHERE b >= 'BBC'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc +(3 rows) + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b >= 'bbc' COLLATE "C"; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "C"; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "en-x-icu"; +ERROR: collation mismatch between explicit collations "C" and "en-x-icu" +LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "e... + ^ +CREATE DOMAIN testdomain_sv AS text COLLATE "sv-x-icu"; +CREATE DOMAIN testdomain_i AS int COLLATE "sv-x-icu"; -- fails +ERROR: collations are not supported by type integer +CREATE TABLE collate_test4 ( + a int, + b testdomain_sv +); +INSERT INTO collate_test4 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test4 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +CREATE TABLE collate_test5 ( + a int, + b testdomain_sv COLLATE "en-x-icu" +); +INSERT INTO collate_test5 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test5 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test1 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test2 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b FROM collate_test3 ORDER BY b; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +-- star expansion +SELECT * FROM collate_test1 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT * FROM collate_test2 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT * FROM collate_test3 ORDER BY b; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +-- constant expression folding +SELECT 'bbc' COLLATE "en-x-icu" > 'äbc' COLLATE "en-x-icu" AS "true"; + true +------ + t +(1 row) + +SELECT 'bbc' COLLATE "sv-x-icu" > 'äbc' COLLATE "sv-x-icu" AS "false"; + false +------- + f +(1 row) + +-- upper/lower +CREATE TABLE collate_test10 ( + a int, + x text COLLATE "en-x-icu", + y text COLLATE "tr-x-icu" +); +INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ'); +SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10; + a | lower | lower | upper | upper | initcap | initcap +---+-------+-------+-------+-------+---------+--------- + 1 | hij | hij | HIJ | HİJ | Hij | Hij + 2 | hij | hıj | HIJ | HIJ | Hij | Hıj +(2 rows) + +SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hij +(2 rows) + +SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a; + a | x | y +---+-----+----- + 2 | HIJ | HIJ + 1 | hij | hij +(2 rows) + +-- LIKE/ILIKE +SELECT * FROM collate_test1 WHERE b LIKE 'abc'; + a | b +---+----- + 1 | abc +(1 row) + +SELECT * FROM collate_test1 WHERE b LIKE 'abc%'; + a | b +---+----- + 1 | abc +(1 row) + +SELECT * FROM collate_test1 WHERE b LIKE '%bc%'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc +(3 rows) + +SELECT * FROM collate_test1 WHERE b ILIKE 'abc'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +SELECT * FROM collate_test1 WHERE b ILIKE 'abc%'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +SELECT * FROM collate_test1 WHERE b ILIKE '%bc%'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc + 4 | ABC +(4 rows) + +SELECT 'Türkiye' COLLATE "en-x-icu" ILIKE '%KI%' AS "true"; + true +------ + t +(1 row) + +SELECT 'Türkiye' COLLATE "tr-x-icu" ILIKE '%KI%' AS "false"; + false +------- + f +(1 row) + +SELECT 'bıt' ILIKE 'BIT' COLLATE "en-x-icu" AS "false"; + false +------- + f +(1 row) + +SELECT 'bıt' ILIKE 'BIT' COLLATE "tr-x-icu" AS "true"; + true +------ + t +(1 row) + +-- The following actually exercises the selectivity estimation for ILIKE. +SELECT relname FROM pg_class WHERE relname ILIKE 'abc%'; + relname +--------- +(0 rows) + +-- regular expressions +SELECT * FROM collate_test1 WHERE b ~ '^abc$'; + a | b +---+----- + 1 | abc +(1 row) + +SELECT * FROM collate_test1 WHERE b ~ '^abc'; + a | b +---+----- + 1 | abc +(1 row) + +SELECT * FROM collate_test1 WHERE b ~ 'bc'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc +(3 rows) + +SELECT * FROM collate_test1 WHERE b ~* '^abc$'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +SELECT * FROM collate_test1 WHERE b ~* '^abc'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +SELECT * FROM collate_test1 WHERE b ~* 'bc'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc + 4 | ABC +(4 rows) + +CREATE TABLE collate_test6 ( + a int, + b text COLLATE "en-x-icu" +); +INSERT INTO collate_test6 VALUES (1, 'abc'), (2, 'ABC'), (3, '123'), (4, 'ab1'), + (5, 'a1!'), (6, 'a c'), (7, '!.;'), (8, ' '), + (9, 'äbç'), (10, 'ÄBÇ'); +SELECT b, + b ~ '^[[:alpha:]]+$' AS is_alpha, + b ~ '^[[:upper:]]+$' AS is_upper, + b ~ '^[[:lower:]]+$' AS is_lower, + b ~ '^[[:digit:]]+$' AS is_digit, + b ~ '^[[:alnum:]]+$' AS is_alnum, + b ~ '^[[:graph:]]+$' AS is_graph, + b ~ '^[[:print:]]+$' AS is_print, + b ~ '^[[:punct:]]+$' AS is_punct, + b ~ '^[[:space:]]+$' AS is_space +FROM collate_test6; + b | is_alpha | is_upper | is_lower | is_digit | is_alnum | is_graph | is_print | is_punct | is_space +-----+----------+----------+----------+----------+----------+----------+----------+----------+---------- + abc | t | f | t | f | t | t | t | f | f + ABC | t | t | f | f | t | t | t | f | f + 123 | f | f | f | t | t | t | t | f | f + ab1 | f | f | f | f | t | t | t | f | f + a1! | f | f | f | f | f | t | t | f | f + a c | f | f | f | f | f | f | t | f | f + !.; | f | f | f | f | f | t | t | t | f + | f | f | f | f | f | f | t | f | t + äbç | t | f | t | f | t | t | t | f | f + ÄBÇ | t | t | f | f | t | t | t | f | f +(10 rows) + +SELECT 'Türkiye' COLLATE "en-x-icu" ~* 'KI' AS "true"; + true +------ + t +(1 row) + +SELECT 'Türkiye' COLLATE "tr-x-icu" ~* 'KI' AS "true"; -- true with ICU + true +------ + t +(1 row) + +SELECT 'bıt' ~* 'BIT' COLLATE "en-x-icu" AS "false"; + false +------- + f +(1 row) + +SELECT 'bıt' ~* 'BIT' COLLATE "tr-x-icu" AS "false"; -- false with ICU + false +------- + f +(1 row) + +-- The following actually exercises the selectivity estimation for ~*. +SELECT relname FROM pg_class WHERE relname ~* '^abc'; + relname +--------- +(0 rows) + +/* not run by default because it requires tr_TR system locale +-- to_char + +SET lc_time TO 'tr_TR'; +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'); +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr-x-icu"); +*/ +-- backwards parsing +CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; +CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; +CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "C") FROM collate_test10; +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'collview%' ORDER BY 1; + table_name | view_definition +------------+-------------------------------------------------------------------------- + collview1 | SELECT collate_test1.a, + + | collate_test1.b + + | FROM collate_test1 + + | WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text); + collview2 | SELECT collate_test1.a, + + | collate_test1.b + + | FROM collate_test1 + + | ORDER BY (collate_test1.b COLLATE "C"); + collview3 | SELECT collate_test10.a, + + | lower(((collate_test10.x || collate_test10.x) COLLATE "C")) AS lower+ + | FROM collate_test10; +(3 rows) + +-- collation propagation in various expression types +SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2; + a | coalesce +---+---------- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2; + a | coalesce +---+---------- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, coalesce(b, 'foo') FROM collate_test3 ORDER BY 2; + a | coalesce +---+---------- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hıj +(2 rows) + +SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3; + a | b | greatest +---+-----+---------- + 1 | abc | CCC + 2 | äbc | CCC + 3 | bbc | CCC + 4 | ABC | CCC +(4 rows) + +SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3; + a | b | greatest +---+-----+---------- + 1 | abc | CCC + 3 | bbc | CCC + 4 | ABC | CCC + 2 | äbc | äbc +(4 rows) + +SELECT a, b, greatest(b, 'CCC') FROM collate_test3 ORDER BY 3; + a | b | greatest +---+-----+---------- + 4 | ABC | CCC + 1 | abc | abc + 3 | bbc | bbc + 2 | äbc | äbc +(4 rows) + +SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10; + a | x | y | lower | lower +---+-----+-----+-------+------- + 1 | hij | hij | hij | hij + 2 | HIJ | HIJ | hij | hıj +(2 rows) + +SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2; + a | nullif +---+-------- + 4 | ABC + 2 | äbc + 3 | bbc + 1 | +(4 rows) + +SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2; + a | nullif +---+-------- + 4 | ABC + 3 | bbc + 2 | äbc + 1 | +(4 rows) + +SELECT a, nullif(b, 'abc') FROM collate_test3 ORDER BY 2; + a | nullif +---+-------- + 4 | ABC + 3 | bbc + 2 | äbc + 1 | +(4 rows) + +SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hıj +(2 rows) + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2; + a | b +---+------ + 4 | ABC + 2 | äbc + 1 | abcd + 3 | bbc +(4 rows) + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2; + a | b +---+------ + 4 | ABC + 1 | abcd + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test3 ORDER BY 2; + a | b +---+------ + 4 | ABC + 1 | abcd + 3 | bbc + 2 | äbc +(4 rows) + +CREATE DOMAIN testdomain AS text; +SELECT a, b::testdomain FROM collate_test1 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, b::testdomain FROM collate_test2 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b::testdomain FROM collate_test3 ORDER BY 2; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b::testdomain_sv FROM collate_test3 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hıj +(2 rows) + +SELECT min(b), max(b) FROM collate_test1; + min | max +-----+----- + abc | bbc +(1 row) + +SELECT min(b), max(b) FROM collate_test2; + min | max +-----+----- + abc | äbc +(1 row) + +SELECT min(b), max(b) FROM collate_test3; + min | max +-----+----- + ABC | äbc +(1 row) + +SELECT array_agg(b ORDER BY b) FROM collate_test1; + array_agg +------------------- + {abc,ABC,äbc,bbc} +(1 row) + +SELECT array_agg(b ORDER BY b) FROM collate_test2; + array_agg +------------------- + {abc,ABC,bbc,äbc} +(1 row) + +SELECT array_agg(b ORDER BY b) FROM collate_test3; + array_agg +------------------- + {ABC,abc,bbc,äbc} +(1 row) + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2; + a | b +---+----- + 1 | abc + 1 | abc + 4 | ABC + 4 | ABC + 2 | äbc + 2 | äbc + 3 | bbc + 3 | bbc +(8 rows) + +SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b FROM collate_test3 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test3 WHERE a > 1 ORDER BY 2; + a | b +---+----- + 3 | bbc + 2 | äbc +(2 rows) + +SELECT a, b FROM collate_test3 EXCEPT SELECT a, b FROM collate_test3 WHERE a < 2 ORDER BY 2; + a | b +---+----- + 4 | ABC + 3 | bbc + 2 | äbc +(3 rows) + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- ok + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc + 4 | ABC + 1 | abc + 2 | äbc + 3 | bbc + 4 | ABC +(8 rows) + +SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "en-x-icu" and "C" +LINE 1: SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collat... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- ok + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "en-x-icu" and "C" +LINE 1: ...ELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM col... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "en-x-icu" and "C" +LINE 1: SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM colla... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- fail +ERROR: no collation was derived for column "b" with collatable type text +HINT: Use the COLLATE clause to set the collation explicitly. +-- ideally this would be a parse-time error, but for now it must be run-time: +select x < y from collate_test10; -- fail +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +select x || y from collate_test10; -- ok, because || is not collation aware + ?column? +---------- + hijhij + HIJHIJ +(2 rows) + +select x, y from collate_test10 order by x || y; -- not so ok +ERROR: collation mismatch between implicit collations "en-x-icu" and "tr-x-icu" +LINE 1: select x, y from collate_test10 order by x || y; + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +-- collation mismatch between recursive and non-recursive term +WITH RECURSIVE foo(x) AS + (SELECT x FROM (VALUES('a' COLLATE "en-x-icu"),('b')) t(x) + UNION ALL + SELECT (x || 'c') COLLATE "de-x-icu" FROM foo WHERE length(x) < 10) +SELECT * FROM foo; +ERROR: recursive query "foo" column 1 has collation "en-x-icu" in non-recursive term but collation "de-x-icu" overall +LINE 2: (SELECT x FROM (VALUES('a' COLLATE "en-x-icu"),('b')) t(x... + ^ +HINT: Use the COLLATE clause to set the collation of the non-recursive term. +-- casting +SELECT CAST('42' AS text COLLATE "C"); +ERROR: syntax error at or near "COLLATE" +LINE 1: SELECT CAST('42' AS text COLLATE "C"); + ^ +SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, CAST(b AS varchar) FROM collate_test3 ORDER BY 2; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +-- propagation of collation in SQL functions (inlined and non-inlined cases) +-- and plpgsql functions too +CREATE FUNCTION mylt (text, text) RETURNS boolean LANGUAGE sql + AS $$ select $1 < $2 $$; +CREATE FUNCTION mylt_noninline (text, text) RETURNS boolean LANGUAGE sql + AS $$ select $1 < $2 limit 1 $$; +CREATE FUNCTION mylt_plpgsql (text, text) RETURNS boolean LANGUAGE plpgsql + AS $$ begin return $1 < $2; end $$; +SELECT a.b AS a, b.b AS b, a.b < b.b AS lt, + mylt(a.b, b.b), mylt_noninline(a.b, b.b), mylt_plpgsql(a.b, b.b) +FROM collate_test1 a, collate_test1 b +ORDER BY a.b, b.b; + a | b | lt | mylt | mylt_noninline | mylt_plpgsql +-----+-----+----+------+----------------+-------------- + abc | abc | f | f | f | f + abc | ABC | t | t | t | t + abc | äbc | t | t | t | t + abc | bbc | t | t | t | t + ABC | abc | f | f | f | f + ABC | ABC | f | f | f | f + ABC | äbc | t | t | t | t + ABC | bbc | t | t | t | t + äbc | abc | f | f | f | f + äbc | ABC | f | f | f | f + äbc | äbc | f | f | f | f + äbc | bbc | t | t | t | t + bbc | abc | f | f | f | f + bbc | ABC | f | f | f | f + bbc | äbc | f | f | f | f + bbc | bbc | f | f | f | f +(16 rows) + +SELECT a.b AS a, b.b AS b, a.b < b.b COLLATE "C" AS lt, + mylt(a.b, b.b COLLATE "C"), mylt_noninline(a.b, b.b COLLATE "C"), + mylt_plpgsql(a.b, b.b COLLATE "C") +FROM collate_test1 a, collate_test1 b +ORDER BY a.b, b.b; + a | b | lt | mylt | mylt_noninline | mylt_plpgsql +-----+-----+----+------+----------------+-------------- + abc | abc | f | f | f | f + abc | ABC | f | f | f | f + abc | äbc | t | t | t | t + abc | bbc | t | t | t | t + ABC | abc | t | t | t | t + ABC | ABC | f | f | f | f + ABC | äbc | t | t | t | t + ABC | bbc | t | t | t | t + äbc | abc | f | f | f | f + äbc | ABC | f | f | f | f + äbc | äbc | f | f | f | f + äbc | bbc | f | f | f | f + bbc | abc | f | f | f | f + bbc | ABC | f | f | f | f + bbc | äbc | t | t | t | t + bbc | bbc | f | f | f | f +(16 rows) + +-- collation override in plpgsql +CREATE FUNCTION mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$ +declare + xx text := x; + yy text := y; +begin + return xx < yy; +end +$$; +SELECT mylt2('a', 'B' collate "en-x-icu") as t, mylt2('a', 'B' collate "C") as f; + t | f +---+--- + t | f +(1 row) + +CREATE OR REPLACE FUNCTION + mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$ +declare + xx text COLLATE "POSIX" := x; + yy text := y; +begin + return xx < yy; +end +$$; +SELECT mylt2('a', 'B') as f; + f +--- + f +(1 row) + +SELECT mylt2('a', 'B' collate "C") as fail; -- conflicting collations +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +CONTEXT: PL/pgSQL function mylt2(text,text) line 6 at RETURN +SELECT mylt2('a', 'B' collate "POSIX") as f; + f +--- + f +(1 row) + +-- polymorphism +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1; + unnest +-------- + abc + ABC + äbc + bbc +(4 rows) + +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1; + unnest +-------- + abc + ABC + bbc + äbc +(4 rows) + +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test3)) ORDER BY 1; + unnest +-------- + ABC + abc + bbc + äbc +(4 rows) + +CREATE FUNCTION dup (anyelement) RETURNS anyelement + AS 'select $1' LANGUAGE sql; +SELECT a, dup(b) FROM collate_test1 ORDER BY 2; + a | dup +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, dup(b) FROM collate_test2 ORDER BY 2; + a | dup +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, dup(b) FROM collate_test3 ORDER BY 2; + a | dup +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +-- indexes +CREATE INDEX collate_test1_idx1 ON collate_test1 (b); +CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "C"); +CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "C")); -- this is different grammatically +CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX")); +CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "C"); -- fail +ERROR: collations are not supported by type integer +CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C")); -- fail +ERROR: collations are not supported by type integer +LINE 1: ...ATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C... + ^ +SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1; + relname | pg_get_indexdef +--------------------+------------------------------------------------------------------------------------------------------------------- + collate_test1_idx1 | CREATE INDEX collate_test1_idx1 ON collate_tests.collate_test1 USING btree (b) + collate_test1_idx2 | CREATE INDEX collate_test1_idx2 ON collate_tests.collate_test1 USING btree (b COLLATE "C") + collate_test1_idx3 | CREATE INDEX collate_test1_idx3 ON collate_tests.collate_test1 USING btree (b COLLATE "C") + collate_test1_idx4 | CREATE INDEX collate_test1_idx4 ON collate_tests.collate_test1 USING btree (((b || 'foo'::text)) COLLATE "POSIX") +(4 rows) + +set enable_seqscan = off; +explain (costs off) +select * from collate_test1 where b ilike 'abc'; + QUERY PLAN +------------------------------- + Seq Scan on collate_test1 + Filter: (b ~~* 'abc'::text) +(2 rows) + +select * from collate_test1 where b ilike 'abc'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +explain (costs off) +select * from collate_test1 where b ilike 'ABC'; + QUERY PLAN +------------------------------- + Seq Scan on collate_test1 + Filter: (b ~~* 'ABC'::text) +(2 rows) + +select * from collate_test1 where b ilike 'ABC'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +reset enable_seqscan; +-- schema manipulation commands +CREATE ROLE regress_test_role; +CREATE SCHEMA test_schema; +-- We need to do this this way to cope with varying names for encodings: +do $$ +BEGIN + EXECUTE 'CREATE COLLATION test0 (provider = icu, locale = ' || + quote_literal(current_setting('lc_collate')) || ');'; +END +$$; +CREATE COLLATION test0 FROM "C"; -- fail, duplicate name +ERROR: collation "test0" already exists +do $$ +BEGIN + EXECUTE 'CREATE COLLATION test1 (provider = icu, lc_collate = ' || + quote_literal(current_setting('lc_collate')) || + ', lc_ctype = ' || + quote_literal(current_setting('lc_ctype')) || ');'; +END +$$; +CREATE COLLATION test3 (provider = icu, lc_collate = 'en_US.utf8'); -- fail, need lc_ctype +ERROR: parameter "lc_ctype" must be specified +CREATE COLLATION testx (provider = icu, locale = 'nonsense'); /* never fails with ICU */ DROP COLLATION testx; +CREATE COLLATION test4 FROM nonsense; +ERROR: collation "nonsense" for encoding "UTF8" does not exist +CREATE COLLATION test5 FROM test0; +SELECT collname FROM pg_collation WHERE collname LIKE 'test%' ORDER BY 1; + collname +---------- + test0 + test1 + test5 +(3 rows) + +ALTER COLLATION test1 RENAME TO test11; +ALTER COLLATION test0 RENAME TO test11; -- fail +ERROR: collation "test11" already exists in schema "collate_tests" +ALTER COLLATION test1 RENAME TO test22; -- fail +ERROR: collation "test1" for encoding "UTF8" does not exist +ALTER COLLATION test11 OWNER TO regress_test_role; +ALTER COLLATION test11 OWNER TO nonsense; +ERROR: role "nonsense" does not exist +ALTER COLLATION test11 SET SCHEMA test_schema; +COMMENT ON COLLATION test0 IS 'US English'; +SELECT collname, nspname, obj_description(pg_collation.oid, 'pg_collation') + FROM pg_collation JOIN pg_namespace ON (collnamespace = pg_namespace.oid) + WHERE collname LIKE 'test%' + ORDER BY 1; + collname | nspname | obj_description +----------+---------------+----------------- + test0 | collate_tests | US English + test11 | test_schema | + test5 | collate_tests | +(3 rows) + +DROP COLLATION test0, test_schema.test11, test5; +DROP COLLATION test0; -- fail +ERROR: collation "test0" for encoding "UTF8" does not exist +DROP COLLATION IF EXISTS test0; +NOTICE: collation "test0" does not exist, skipping +SELECT collname FROM pg_collation WHERE collname LIKE 'test%'; + collname +---------- +(0 rows) + +DROP SCHEMA test_schema; +DROP ROLE regress_test_role; +-- ALTER +ALTER COLLATION "en-x-icu" REFRESH VERSION; +NOTICE: version has not changed +-- dependencies +CREATE COLLATION test0 FROM "C"; +CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0); +CREATE DOMAIN collate_dep_dom1 AS text COLLATE test0; +CREATE TYPE collate_dep_test2 AS (x int, y text COLLATE test0); +CREATE VIEW collate_dep_test3 AS SELECT text 'foo' COLLATE test0 AS foo; +CREATE TABLE collate_dep_test4t (a int, b text); +CREATE INDEX collate_dep_test4i ON collate_dep_test4t (b COLLATE test0); +DROP COLLATION test0 RESTRICT; -- fail +ERROR: cannot drop collation test0 because other objects depend on it +DETAIL: column b of table collate_dep_test1 depends on collation test0 +type collate_dep_dom1 depends on collation test0 +column y of composite type collate_dep_test2 depends on collation test0 +view collate_dep_test3 depends on collation test0 +index collate_dep_test4i depends on collation test0 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP COLLATION test0 CASCADE; +NOTICE: drop cascades to 5 other objects +DETAIL: drop cascades to column b of table collate_dep_test1 +drop cascades to type collate_dep_dom1 +drop cascades to column y of composite type collate_dep_test2 +drop cascades to view collate_dep_test3 +drop cascades to index collate_dep_test4i +\d collate_dep_test1 + Table "collate_tests.collate_dep_test1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + +\d collate_dep_test2 + Composite type "collate_tests.collate_dep_test2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + x | integer | | | + +DROP TABLE collate_dep_test1, collate_dep_test4t; +DROP TYPE collate_dep_test2; +-- test range types and collations +create type textrange_c as range(subtype=text, collation="C"); +create type textrange_en_us as range(subtype=text, collation="en-x-icu"); +select textrange_c('A','Z') @> 'b'::text; + ?column? +---------- + f +(1 row) + +select textrange_en_us('A','Z') @> 'b'::text; + ?column? +---------- + t +(1 row) + +drop type textrange_c; +drop type textrange_en_us; +-- test ICU collation customization +-- test the attributes handled by icu_set_collation_attributes() +CREATE COLLATION testcoll_ignore_accents (provider = icu, locale = '@colStrength=primary;colCaseLevel=yes'); +SELECT 'aaá' > 'AAA' COLLATE "und-x-icu", 'aaá' < 'AAA' COLLATE testcoll_ignore_accents; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +CREATE COLLATION testcoll_backwards (provider = icu, locale = '@colBackwards=yes'); +SELECT 'coté' < 'côte' COLLATE "und-x-icu", 'coté' > 'côte' COLLATE testcoll_backwards; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +CREATE COLLATION testcoll_lower_first (provider = icu, locale = '@colCaseFirst=lower'); +CREATE COLLATION testcoll_upper_first (provider = icu, locale = '@colCaseFirst=upper'); +SELECT 'aaa' < 'AAA' COLLATE testcoll_lower_first, 'aaa' > 'AAA' COLLATE testcoll_upper_first; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +CREATE COLLATION testcoll_shifted (provider = icu, locale = '@colAlternate=shifted'); +SELECT 'de-luge' < 'deanza' COLLATE "und-x-icu", 'de-luge' > 'deanza' COLLATE testcoll_shifted; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +CREATE COLLATION testcoll_numeric (provider = icu, locale = '@colNumeric=yes'); +SELECT 'A-21' > 'A-123' COLLATE "und-x-icu", 'A-21' < 'A-123' COLLATE testcoll_numeric; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +CREATE COLLATION testcoll_error1 (provider = icu, locale = '@colNumeric=lower'); +ERROR: could not open collator for locale "@colNumeric=lower": U_ILLEGAL_ARGUMENT_ERROR +-- test that attributes not handled by icu_set_collation_attributes() +-- (handled by ucol_open() directly) also work +CREATE COLLATION testcoll_de_phonebook (provider = icu, locale = 'de@collation=phonebook'); +SELECT 'Goldmann' < 'Götz' COLLATE "de-x-icu", 'Goldmann' > 'Götz' COLLATE testcoll_de_phonebook; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +-- nondeterministic collations +CREATE COLLATION ctest_det (provider = icu, locale = '', deterministic = true); +CREATE COLLATION ctest_nondet (provider = icu, locale = '', deterministic = false); +CREATE TABLE test6 (a int, b text); +-- same string in different normal forms +INSERT INTO test6 VALUES (1, U&'\00E4bc'); +INSERT INTO test6 VALUES (2, U&'\0061\0308bc'); +SELECT * FROM test6; + a | b +---+----- + 1 | äbc + 2 | äbc +(2 rows) + +SELECT * FROM test6 WHERE b = 'äbc' COLLATE ctest_det; + a | b +---+----- + 1 | äbc +(1 row) + +SELECT * FROM test6 WHERE b = 'äbc' COLLATE ctest_nondet; + a | b +---+----- + 1 | äbc + 2 | äbc +(2 rows) + +-- same with arrays +CREATE TABLE test6a (a int, b text[]); +INSERT INTO test6a VALUES (1, ARRAY[U&'\00E4bc']); +INSERT INTO test6a VALUES (2, ARRAY[U&'\0061\0308bc']); +SELECT * FROM test6a; + a | b +---+------- + 1 | {äbc} + 2 | {äbc} +(2 rows) + +SELECT * FROM test6a WHERE b = ARRAY['äbc'] COLLATE ctest_det; + a | b +---+------- + 1 | {äbc} +(1 row) + +SELECT * FROM test6a WHERE b = ARRAY['äbc'] COLLATE ctest_nondet; + a | b +---+------- + 1 | {äbc} + 2 | {äbc} +(2 rows) + +CREATE COLLATION case_sensitive (provider = icu, locale = ''); +CREATE COLLATION case_insensitive (provider = icu, locale = '@colStrength=secondary', deterministic = false); +SELECT 'abc' <= 'ABC' COLLATE case_sensitive, 'abc' >= 'ABC' COLLATE case_sensitive; + ?column? | ?column? +----------+---------- + t | f +(1 row) + +SELECT 'abc' <= 'ABC' COLLATE case_insensitive, 'abc' >= 'ABC' COLLATE case_insensitive; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +CREATE TABLE test1cs (x text COLLATE case_sensitive); +CREATE TABLE test2cs (x text COLLATE case_sensitive); +CREATE TABLE test3cs (x text COLLATE case_sensitive); +INSERT INTO test1cs VALUES ('abc'), ('def'), ('ghi'); +INSERT INTO test2cs VALUES ('ABC'), ('ghi'); +INSERT INTO test3cs VALUES ('abc'), ('ABC'), ('def'), ('ghi'); +SELECT x FROM test3cs WHERE x = 'abc'; + x +----- + abc +(1 row) + +SELECT x FROM test3cs WHERE x <> 'abc'; + x +----- + ABC + def + ghi +(3 rows) + +SELECT x FROM test3cs WHERE x LIKE 'a%'; + x +----- + abc +(1 row) + +SELECT x FROM test3cs WHERE x ILIKE 'a%'; + x +----- + abc + ABC +(2 rows) + +SELECT x FROM test3cs WHERE x SIMILAR TO 'a%'; + x +----- + abc +(1 row) + +SELECT x FROM test3cs WHERE x ~ 'a'; + x +----- + abc +(1 row) + +SELECT x FROM test1cs UNION SELECT x FROM test2cs ORDER BY x; + x +----- + abc + ABC + def + ghi +(4 rows) + +SELECT x FROM test2cs UNION SELECT x FROM test1cs ORDER BY x; + x +----- + abc + ABC + def + ghi +(4 rows) + +SELECT x FROM test1cs INTERSECT SELECT x FROM test2cs; + x +----- + ghi +(1 row) + +SELECT x FROM test2cs INTERSECT SELECT x FROM test1cs; + x +----- + ghi +(1 row) + +SELECT x FROM test1cs EXCEPT SELECT x FROM test2cs; + x +----- + abc + def +(2 rows) + +SELECT x FROM test2cs EXCEPT SELECT x FROM test1cs; + x +----- + ABC +(1 row) + +SELECT DISTINCT x FROM test3cs ORDER BY x; + x +----- + abc + ABC + def + ghi +(4 rows) + +SELECT count(DISTINCT x) FROM test3cs; + count +------- + 4 +(1 row) + +SELECT x, count(*) FROM test3cs GROUP BY x ORDER BY x; + x | count +-----+------- + abc | 1 + ABC | 1 + def | 1 + ghi | 1 +(4 rows) + +SELECT x, row_number() OVER (ORDER BY x), rank() OVER (ORDER BY x) FROM test3cs ORDER BY x; + x | row_number | rank +-----+------------+------ + abc | 1 | 1 + ABC | 2 | 2 + def | 3 | 3 + ghi | 4 | 4 +(4 rows) + +CREATE UNIQUE INDEX ON test1cs (x); -- ok +INSERT INTO test1cs VALUES ('ABC'); -- ok +CREATE UNIQUE INDEX ON test3cs (x); -- ok +SELECT string_to_array('ABC,DEF,GHI' COLLATE case_sensitive, ',', 'abc'); + string_to_array +----------------- + {ABC,DEF,GHI} +(1 row) + +SELECT string_to_array('ABCDEFGHI' COLLATE case_sensitive, NULL, 'b'); + string_to_array +--------------------- + {A,B,C,D,E,F,G,H,I} +(1 row) + +CREATE TABLE test1ci (x text COLLATE case_insensitive); +CREATE TABLE test2ci (x text COLLATE case_insensitive); +CREATE TABLE test3ci (x text COLLATE case_insensitive); +CREATE INDEX ON test3ci (x text_pattern_ops); -- error +ERROR: nondeterministic collations are not supported for operator class "text_pattern_ops" +INSERT INTO test1ci VALUES ('abc'), ('def'), ('ghi'); +INSERT INTO test2ci VALUES ('ABC'), ('ghi'); +INSERT INTO test3ci VALUES ('abc'), ('ABC'), ('def'), ('ghi'); +SELECT x FROM test3ci WHERE x = 'abc'; + x +----- + abc + ABC +(2 rows) + +SELECT x FROM test3ci WHERE x <> 'abc'; + x +----- + def + ghi +(2 rows) + +SELECT x FROM test3ci WHERE x LIKE 'a%'; +ERROR: nondeterministic collations are not supported for LIKE +SELECT x FROM test3ci WHERE x ILIKE 'a%'; +ERROR: nondeterministic collations are not supported for ILIKE +SELECT x FROM test3ci WHERE x SIMILAR TO 'a%'; +ERROR: nondeterministic collations are not supported for regular expressions +SELECT x FROM test3ci WHERE x ~ 'a'; +ERROR: nondeterministic collations are not supported for regular expressions +SELECT x FROM test1ci UNION SELECT x FROM test2ci ORDER BY x; + x +----- + abc + def + ghi +(3 rows) + +SELECT x FROM test2ci UNION SELECT x FROM test1ci ORDER BY x; + x +----- + ABC + def + ghi +(3 rows) + +SELECT x FROM test1ci INTERSECT SELECT x FROM test2ci ORDER BY x; + x +----- + abc + ghi +(2 rows) + +SELECT x FROM test2ci INTERSECT SELECT x FROM test1ci ORDER BY x; + x +----- + ABC + ghi +(2 rows) + +SELECT x FROM test1ci EXCEPT SELECT x FROM test2ci; + x +----- + def +(1 row) + +SELECT x FROM test2ci EXCEPT SELECT x FROM test1ci; + x +--- +(0 rows) + +SELECT DISTINCT x FROM test3ci ORDER BY x; + x +----- + abc + def + ghi +(3 rows) + +SELECT count(DISTINCT x) FROM test3ci; + count +------- + 3 +(1 row) + +SELECT x, count(*) FROM test3ci GROUP BY x ORDER BY x; + x | count +-----+------- + abc | 2 + def | 1 + ghi | 1 +(3 rows) + +SELECT x, row_number() OVER (ORDER BY x), rank() OVER (ORDER BY x) FROM test3ci ORDER BY x; + x | row_number | rank +-----+------------+------ + abc | 1 | 1 + ABC | 2 | 1 + def | 3 | 3 + ghi | 4 | 4 +(4 rows) + +CREATE UNIQUE INDEX ON test1ci (x); -- ok +INSERT INTO test1ci VALUES ('ABC'); -- error +ERROR: duplicate key value violates unique constraint "test1ci_x_idx" +DETAIL: Key (x)=(ABC) already exists. +CREATE UNIQUE INDEX ON test3ci (x); -- error +ERROR: could not create unique index "test3ci_x_idx" +DETAIL: Key (x)=(abc) is duplicated. +SELECT string_to_array('ABC,DEF,GHI' COLLATE case_insensitive, ',', 'abc'); +ERROR: nondeterministic collations are not supported for substring searches +SELECT string_to_array('ABCDEFGHI' COLLATE case_insensitive, NULL, 'b'); + string_to_array +------------------------ + {A,NULL,C,D,E,F,G,H,I} +(1 row) + +-- bpchar +CREATE TABLE test1bpci (x char(3) COLLATE case_insensitive); +CREATE TABLE test2bpci (x char(3) COLLATE case_insensitive); +CREATE TABLE test3bpci (x char(3) COLLATE case_insensitive); +CREATE INDEX ON test3bpci (x bpchar_pattern_ops); -- error +ERROR: nondeterministic collations are not supported for operator class "bpchar_pattern_ops" +INSERT INTO test1bpci VALUES ('abc'), ('def'), ('ghi'); +INSERT INTO test2bpci VALUES ('ABC'), ('ghi'); +INSERT INTO test3bpci VALUES ('abc'), ('ABC'), ('def'), ('ghi'); +SELECT x FROM test3bpci WHERE x = 'abc'; + x +----- + abc + ABC +(2 rows) + +SELECT x FROM test3bpci WHERE x <> 'abc'; + x +----- + def + ghi +(2 rows) + +SELECT x FROM test3bpci WHERE x LIKE 'a%'; +ERROR: nondeterministic collations are not supported for LIKE +SELECT x FROM test3bpci WHERE x ILIKE 'a%'; +ERROR: nondeterministic collations are not supported for ILIKE +SELECT x FROM test3bpci WHERE x SIMILAR TO 'a%'; +ERROR: nondeterministic collations are not supported for regular expressions +SELECT x FROM test3bpci WHERE x ~ 'a'; +ERROR: nondeterministic collations are not supported for regular expressions +SELECT x FROM test1bpci UNION SELECT x FROM test2bpci ORDER BY x; + x +----- + abc + def + ghi +(3 rows) + +SELECT x FROM test2bpci UNION SELECT x FROM test1bpci ORDER BY x; + x +----- + ABC + def + ghi +(3 rows) + +SELECT x FROM test1bpci INTERSECT SELECT x FROM test2bpci ORDER BY x; + x +----- + abc + ghi +(2 rows) + +SELECT x FROM test2bpci INTERSECT SELECT x FROM test1bpci ORDER BY x; + x +----- + ABC + ghi +(2 rows) + +SELECT x FROM test1bpci EXCEPT SELECT x FROM test2bpci; + x +----- + def +(1 row) + +SELECT x FROM test2bpci EXCEPT SELECT x FROM test1bpci; + x +--- +(0 rows) + +SELECT DISTINCT x FROM test3bpci ORDER BY x; + x +----- + abc + def + ghi +(3 rows) + +SELECT count(DISTINCT x) FROM test3bpci; + count +------- + 3 +(1 row) + +SELECT x, count(*) FROM test3bpci GROUP BY x ORDER BY x; + x | count +-----+------- + abc | 2 + def | 1 + ghi | 1 +(3 rows) + +SELECT x, row_number() OVER (ORDER BY x), rank() OVER (ORDER BY x) FROM test3bpci ORDER BY x; + x | row_number | rank +-----+------------+------ + abc | 1 | 1 + ABC | 2 | 1 + def | 3 | 3 + ghi | 4 | 4 +(4 rows) + +CREATE UNIQUE INDEX ON test1bpci (x); -- ok +INSERT INTO test1bpci VALUES ('ABC'); -- error +ERROR: duplicate key value violates unique constraint "test1bpci_x_idx" +DETAIL: Key (x)=(ABC) already exists. +CREATE UNIQUE INDEX ON test3bpci (x); -- error +ERROR: could not create unique index "test3bpci_x_idx" +DETAIL: Key (x)=(abc) is duplicated. +SELECT string_to_array('ABC,DEF,GHI'::char(11) COLLATE case_insensitive, ',', 'abc'); +ERROR: nondeterministic collations are not supported for substring searches +SELECT string_to_array('ABCDEFGHI'::char(9) COLLATE case_insensitive, NULL, 'b'); + string_to_array +------------------------ + {A,NULL,C,D,E,F,G,H,I} +(1 row) + +-- This tests the issue described in match_pattern_prefix(). In the +-- absence of that check, the case_insensitive tests below would +-- return no rows where they should logically return one. +CREATE TABLE test4c (x text COLLATE "C"); +INSERT INTO test4c VALUES ('abc'); +CREATE INDEX ON test4c (x); +SET enable_seqscan = off; +SELECT x FROM test4c WHERE x LIKE 'ABC' COLLATE case_sensitive; -- ok, no rows + x +--- +(0 rows) + +SELECT x FROM test4c WHERE x LIKE 'ABC%' COLLATE case_sensitive; -- ok, no rows + x +--- +(0 rows) + +SELECT x FROM test4c WHERE x LIKE 'ABC' COLLATE case_insensitive; -- error +ERROR: nondeterministic collations are not supported for LIKE +SELECT x FROM test4c WHERE x LIKE 'ABC%' COLLATE case_insensitive; -- error +ERROR: nondeterministic collations are not supported for LIKE +RESET enable_seqscan; +-- Unicode special case: different variants of Greek lower case sigma. +-- A naive implementation like citext that just does lower(x) = +-- lower(y) will do the wrong thing here, because lower('Σ') is 'σ' +-- but upper('ς') is 'Σ'. +SELECT 'ὀδυσσεύς' = 'ὈΔΥΣΣΕΎΣ' COLLATE case_sensitive; + ?column? +---------- + f +(1 row) + +SELECT 'ὀδυσσεύς' = 'ὈΔΥΣΣΕΎΣ' COLLATE case_insensitive; + ?column? +---------- + t +(1 row) + +-- name vs. text comparison operators +SELECT relname FROM pg_class WHERE relname = 'PG_CLASS'::text COLLATE case_insensitive; + relname +---------- + pg_class +(1 row) + +SELECT relname FROM pg_class WHERE 'PG_CLASS'::text = relname COLLATE case_insensitive; + relname +---------- + pg_class +(1 row) + +SELECT typname FROM pg_type WHERE typname LIKE 'int_' AND typname <> 'INT2'::text + COLLATE case_insensitive ORDER BY typname; + typname +--------- + int4 + int8 +(2 rows) + +SELECT typname FROM pg_type WHERE typname LIKE 'int_' AND 'INT2'::text <> typname + COLLATE case_insensitive ORDER BY typname; + typname +--------- + int4 + int8 +(2 rows) + +-- test case adapted from subselect.sql +CREATE TEMP TABLE outer_text (f1 text COLLATE case_insensitive, f2 text); +INSERT INTO outer_text VALUES ('a', 'a'); +INSERT INTO outer_text VALUES ('b', 'a'); +INSERT INTO outer_text VALUES ('A', NULL); +INSERT INTO outer_text VALUES ('B', NULL); +CREATE TEMP TABLE inner_text (c1 text COLLATE case_insensitive, c2 text); +INSERT INTO inner_text VALUES ('a', NULL); +SELECT * FROM outer_text WHERE (f1, f2) NOT IN (SELECT * FROM inner_text); + f1 | f2 +----+---- + b | a + B | +(2 rows) + +-- accents +CREATE COLLATION ignore_accents (provider = icu, locale = '@colStrength=primary;colCaseLevel=yes', deterministic = false); +CREATE TABLE test4 (a int, b text); +INSERT INTO test4 VALUES (1, 'cote'), (2, 'côte'), (3, 'coté'), (4, 'côté'); +SELECT * FROM test4 WHERE b = 'cote'; + a | b +---+------ + 1 | cote +(1 row) + +SELECT * FROM test4 WHERE b = 'cote' COLLATE ignore_accents; + a | b +---+------ + 1 | cote + 2 | côte + 3 | coté + 4 | côté +(4 rows) + +SELECT * FROM test4 WHERE b = 'Cote' COLLATE ignore_accents; -- still case-sensitive + a | b +---+--- +(0 rows) + +SELECT * FROM test4 WHERE b = 'Cote' COLLATE case_insensitive; + a | b +---+------ + 1 | cote +(1 row) + +-- foreign keys (should use collation of primary key) +-- PK is case-sensitive, FK is case-insensitive +CREATE TABLE test10pk (x text COLLATE case_sensitive PRIMARY KEY); +INSERT INTO test10pk VALUES ('abc'), ('def'), ('ghi'); +CREATE TABLE test10fk (x text COLLATE case_insensitive REFERENCES test10pk (x) ON UPDATE CASCADE ON DELETE CASCADE); +INSERT INTO test10fk VALUES ('abc'); -- ok +INSERT INTO test10fk VALUES ('ABC'); -- error +ERROR: insert or update on table "test10fk" violates foreign key constraint "test10fk_x_fkey" +DETAIL: Key (x)=(ABC) is not present in table "test10pk". +INSERT INTO test10fk VALUES ('xyz'); -- error +ERROR: insert or update on table "test10fk" violates foreign key constraint "test10fk_x_fkey" +DETAIL: Key (x)=(xyz) is not present in table "test10pk". +SELECT * FROM test10pk; + x +----- + abc + def + ghi +(3 rows) + +SELECT * FROM test10fk; + x +----- + abc +(1 row) + +-- restrict update even though the values are "equal" in the FK table +UPDATE test10fk SET x = 'ABC' WHERE x = 'abc'; -- error +ERROR: insert or update on table "test10fk" violates foreign key constraint "test10fk_x_fkey" +DETAIL: Key (x)=(ABC) is not present in table "test10pk". +SELECT * FROM test10fk; + x +----- + abc +(1 row) + +DELETE FROM test10pk WHERE x = 'abc'; +SELECT * FROM test10pk; + x +----- + def + ghi +(2 rows) + +SELECT * FROM test10fk; + x +--- +(0 rows) + +-- PK is case-insensitive, FK is case-sensitive +CREATE TABLE test11pk (x text COLLATE case_insensitive PRIMARY KEY); +INSERT INTO test11pk VALUES ('abc'), ('def'), ('ghi'); +CREATE TABLE test11fk (x text COLLATE case_sensitive REFERENCES test11pk (x) ON UPDATE CASCADE ON DELETE CASCADE); +INSERT INTO test11fk VALUES ('abc'); -- ok +INSERT INTO test11fk VALUES ('ABC'); -- ok +INSERT INTO test11fk VALUES ('xyz'); -- error +ERROR: insert or update on table "test11fk" violates foreign key constraint "test11fk_x_fkey" +DETAIL: Key (x)=(xyz) is not present in table "test11pk". +SELECT * FROM test11pk; + x +----- + abc + def + ghi +(3 rows) + +SELECT * FROM test11fk; + x +----- + abc + ABC +(2 rows) + +-- cascade update even though the values are "equal" in the PK table +UPDATE test11pk SET x = 'ABC' WHERE x = 'abc'; +SELECT * FROM test11fk; + x +----- + ABC + ABC +(2 rows) + +DELETE FROM test11pk WHERE x = 'abc'; +SELECT * FROM test11pk; + x +----- + def + ghi +(2 rows) + +SELECT * FROM test11fk; + x +--- +(0 rows) + +-- partitioning +CREATE TABLE test20 (a int, b text COLLATE case_insensitive) PARTITION BY LIST (b); +CREATE TABLE test20_1 PARTITION OF test20 FOR VALUES IN ('abc'); +INSERT INTO test20 VALUES (1, 'abc'); +INSERT INTO test20 VALUES (2, 'ABC'); +SELECT * FROM test20_1; + a | b +---+----- + 1 | abc + 2 | ABC +(2 rows) + +CREATE TABLE test21 (a int, b text COLLATE case_insensitive) PARTITION BY RANGE (b); +CREATE TABLE test21_1 PARTITION OF test21 FOR VALUES FROM ('ABC') TO ('DEF'); +INSERT INTO test21 VALUES (1, 'abc'); +INSERT INTO test21 VALUES (2, 'ABC'); +SELECT * FROM test21_1; + a | b +---+----- + 1 | abc + 2 | ABC +(2 rows) + +CREATE TABLE test22 (a int, b text COLLATE case_sensitive) PARTITION BY HASH (b); +CREATE TABLE test22_0 PARTITION OF test22 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test22_1 PARTITION OF test22 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test22 VALUES (1, 'def'); +INSERT INTO test22 VALUES (2, 'DEF'); +-- they end up in different partitions +SELECT (SELECT count(*) FROM test22_0) = (SELECT count(*) FROM test22_1); + ?column? +---------- + t +(1 row) + +-- same with arrays +CREATE TABLE test22a (a int, b text[] COLLATE case_sensitive) PARTITION BY HASH (b); +CREATE TABLE test22a_0 PARTITION OF test22a FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test22a_1 PARTITION OF test22a FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test22a VALUES (1, ARRAY['def']); +INSERT INTO test22a VALUES (2, ARRAY['DEF']); +-- they end up in different partitions +SELECT (SELECT count(*) FROM test22a_0) = (SELECT count(*) FROM test22a_1); + ?column? +---------- + t +(1 row) + +CREATE TABLE test23 (a int, b text COLLATE case_insensitive) PARTITION BY HASH (b); +CREATE TABLE test23_0 PARTITION OF test23 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test23_1 PARTITION OF test23 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test23 VALUES (1, 'def'); +INSERT INTO test23 VALUES (2, 'DEF'); +-- they end up in the same partition (but it's platform-dependent which one) +SELECT (SELECT count(*) FROM test23_0) <> (SELECT count(*) FROM test23_1); + ?column? +---------- + t +(1 row) + +-- same with arrays +CREATE TABLE test23a (a int, b text[] COLLATE case_insensitive) PARTITION BY HASH (b); +CREATE TABLE test23a_0 PARTITION OF test23a FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test23a_1 PARTITION OF test23a FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test23a VALUES (1, ARRAY['def']); +INSERT INTO test23a VALUES (2, ARRAY['DEF']); +-- they end up in the same partition (but it's platform-dependent which one) +SELECT (SELECT count(*) FROM test23a_0) <> (SELECT count(*) FROM test23a_1); + ?column? +---------- + t +(1 row) + +CREATE TABLE test30 (a int, b char(3) COLLATE case_insensitive) PARTITION BY LIST (b); +CREATE TABLE test30_1 PARTITION OF test30 FOR VALUES IN ('abc'); +INSERT INTO test30 VALUES (1, 'abc'); +INSERT INTO test30 VALUES (2, 'ABC'); +SELECT * FROM test30_1; + a | b +---+----- + 1 | abc + 2 | ABC +(2 rows) + +CREATE TABLE test31 (a int, b char(3) COLLATE case_insensitive) PARTITION BY RANGE (b); +CREATE TABLE test31_1 PARTITION OF test31 FOR VALUES FROM ('ABC') TO ('DEF'); +INSERT INTO test31 VALUES (1, 'abc'); +INSERT INTO test31 VALUES (2, 'ABC'); +SELECT * FROM test31_1; + a | b +---+----- + 1 | abc + 2 | ABC +(2 rows) + +CREATE TABLE test32 (a int, b char(3) COLLATE case_sensitive) PARTITION BY HASH (b); +CREATE TABLE test32_0 PARTITION OF test32 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test32_1 PARTITION OF test32 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test32 VALUES (1, 'def'); +INSERT INTO test32 VALUES (2, 'DEF'); +-- they end up in different partitions +SELECT (SELECT count(*) FROM test32_0) = (SELECT count(*) FROM test32_1); + ?column? +---------- + t +(1 row) + +CREATE TABLE test33 (a int, b char(3) COLLATE case_insensitive) PARTITION BY HASH (b); +CREATE TABLE test33_0 PARTITION OF test33 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test33_1 PARTITION OF test33 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test33 VALUES (1, 'def'); +INSERT INTO test33 VALUES (2, 'DEF'); +-- they end up in the same partition (but it's platform-dependent which one) +SELECT (SELECT count(*) FROM test33_0) <> (SELECT count(*) FROM test33_1); + ?column? +---------- + t +(1 row) + +-- cleanup +RESET search_path; +SET client_min_messages TO warning; +DROP SCHEMA collate_tests CASCADE; +RESET client_min_messages; +-- leave a collation for pg_upgrade test +CREATE COLLATION coll_icu_upgrade FROM "und-x-icu"; diff --git a/src/test/singlenode_regress/expected/collate.icu.utf8_1.out b/src/test/singlenode_regress/expected/collate.icu.utf8_1.out new file mode 100644 index 00000000000..a6a33b39aba --- /dev/null +++ b/src/test/singlenode_regress/expected/collate.icu.utf8_1.out @@ -0,0 +1,9 @@ +/* + * This test is for ICU collations. + */ +/* skip test if not UTF8 server encoding or no ICU collations installed */ +SELECT getdatabaseencoding() <> 'UTF8' OR + (SELECT count(*) FROM pg_collation WHERE collprovider = 'i') = 0 + AS skip_test \gset +\if :skip_test +\quit diff --git a/src/test/singlenode_regress/expected/collate.linux.utf8.out b/src/test/singlenode_regress/expected/collate.linux.utf8.out new file mode 100644 index 00000000000..f06ae543e49 --- /dev/null +++ b/src/test/singlenode_regress/expected/collate.linux.utf8.out @@ -0,0 +1,1160 @@ +/* + * This test is for Linux/glibc systems and assumes that a full set of + * locales is installed. It must be run in a database with UTF-8 encoding, + * because other encodings don't support all the characters used. + */ +SELECT getdatabaseencoding() <> 'UTF8' OR + (SELECT count(*) FROM pg_collation WHERE collname IN ('de_DE', 'en_US', 'sv_SE', 'tr_TR') AND collencoding = pg_char_to_encoding('UTF8')) <> 4 OR + version() !~ 'linux-gnu' + AS skip_test \gset +\if :skip_test +\quit +\endif +SET client_encoding TO UTF8; +CREATE SCHEMA collate_tests; +SET search_path = collate_tests; +CREATE TABLE collate_test1 ( + a int, + b text COLLATE "en_US" NOT NULL +); +\d collate_test1 + Table "collate_tests.collate_test1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | en_US | not null | + +CREATE TABLE collate_test_fail ( + a int, + b text COLLATE "ja_JP.eucjp" +); +ERROR: collation "ja_JP.eucjp" for encoding "UTF8" does not exist +LINE 3: b text COLLATE "ja_JP.eucjp" + ^ +CREATE TABLE collate_test_fail ( + a int, + b text COLLATE "foo" +); +ERROR: collation "foo" for encoding "UTF8" does not exist +LINE 3: b text COLLATE "foo" + ^ +CREATE TABLE collate_test_fail ( + a int COLLATE "en_US", + b text +); +ERROR: collations are not supported by type integer +LINE 2: a int COLLATE "en_US", + ^ +CREATE TABLE collate_test_like ( + LIKE collate_test1 +); +\d collate_test_like + Table "collate_tests.collate_test_like" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | en_US | not null | + +CREATE TABLE collate_test2 ( + a int, + b text COLLATE "sv_SE" +); +CREATE TABLE collate_test3 ( + a int, + b text COLLATE "C" +); +INSERT INTO collate_test1 VALUES (1, 'abc'), (2, 'äbc'), (3, 'bbc'), (4, 'ABC'); +INSERT INTO collate_test2 SELECT * FROM collate_test1; +INSERT INTO collate_test3 SELECT * FROM collate_test1; +SELECT * FROM collate_test1 WHERE b >= 'bbc'; + a | b +---+----- + 3 | bbc +(1 row) + +SELECT * FROM collate_test2 WHERE b >= 'bbc'; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test3 WHERE b >= 'bbc'; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test3 WHERE b >= 'BBC'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc +(3 rows) + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b >= 'bbc' COLLATE "C"; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "C"; + a | b +---+----- + 2 | äbc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "en_US"; +ERROR: collation mismatch between explicit collations "C" and "en_US" +LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "e... + ^ +CREATE DOMAIN testdomain_sv AS text COLLATE "sv_SE"; +CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; -- fails +ERROR: collations are not supported by type integer +CREATE TABLE collate_test4 ( + a int, + b testdomain_sv +); +INSERT INTO collate_test4 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test4 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +CREATE TABLE collate_test5 ( + a int, + b testdomain_sv COLLATE "en_US" +); +INSERT INTO collate_test5 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test5 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test1 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test2 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b FROM collate_test3 ORDER BY b; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +-- star expansion +SELECT * FROM collate_test1 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT * FROM collate_test2 ORDER BY b; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT * FROM collate_test3 ORDER BY b; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +-- constant expression folding +SELECT 'bbc' COLLATE "en_US" > 'äbc' COLLATE "en_US" AS "true"; + true +------ + t +(1 row) + +SELECT 'bbc' COLLATE "sv_SE" > 'äbc' COLLATE "sv_SE" AS "false"; + false +------- + f +(1 row) + +-- upper/lower +CREATE TABLE collate_test10 ( + a int, + x text COLLATE "en_US", + y text COLLATE "tr_TR" +); +INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ'); +SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10; + a | lower | lower | upper | upper | initcap | initcap +---+-------+-------+-------+-------+---------+--------- + 1 | hij | hij | HIJ | HİJ | Hij | Hij + 2 | hij | hıj | HIJ | HIJ | Hij | Hıj +(2 rows) + +SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hij +(2 rows) + +SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a; + a | x | y +---+-----+----- + 2 | HIJ | HIJ + 1 | hij | hij +(2 rows) + +-- LIKE/ILIKE +SELECT * FROM collate_test1 WHERE b LIKE 'abc'; + a | b +---+----- + 1 | abc +(1 row) + +SELECT * FROM collate_test1 WHERE b LIKE 'abc%'; + a | b +---+----- + 1 | abc +(1 row) + +SELECT * FROM collate_test1 WHERE b LIKE '%bc%'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc +(3 rows) + +SELECT * FROM collate_test1 WHERE b ILIKE 'abc'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +SELECT * FROM collate_test1 WHERE b ILIKE 'abc%'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +SELECT * FROM collate_test1 WHERE b ILIKE '%bc%'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc + 4 | ABC +(4 rows) + +SELECT 'Türkiye' COLLATE "en_US" ILIKE '%KI%' AS "true"; + true +------ + t +(1 row) + +SELECT 'Türkiye' COLLATE "tr_TR" ILIKE '%KI%' AS "false"; + false +------- + f +(1 row) + +SELECT 'bıt' ILIKE 'BIT' COLLATE "en_US" AS "false"; + false +------- + f +(1 row) + +SELECT 'bıt' ILIKE 'BIT' COLLATE "tr_TR" AS "true"; + true +------ + t +(1 row) + +-- The following actually exercises the selectivity estimation for ILIKE. +SELECT relname FROM pg_class WHERE relname ILIKE 'abc%'; + relname +--------- +(0 rows) + +-- regular expressions +SELECT * FROM collate_test1 WHERE b ~ '^abc$'; + a | b +---+----- + 1 | abc +(1 row) + +SELECT * FROM collate_test1 WHERE b ~ '^abc'; + a | b +---+----- + 1 | abc +(1 row) + +SELECT * FROM collate_test1 WHERE b ~ 'bc'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc +(3 rows) + +SELECT * FROM collate_test1 WHERE b ~* '^abc$'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +SELECT * FROM collate_test1 WHERE b ~* '^abc'; + a | b +---+----- + 1 | abc + 4 | ABC +(2 rows) + +SELECT * FROM collate_test1 WHERE b ~* 'bc'; + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc + 4 | ABC +(4 rows) + +CREATE TABLE collate_test6 ( + a int, + b text COLLATE "en_US" +); +INSERT INTO collate_test6 VALUES (1, 'abc'), (2, 'ABC'), (3, '123'), (4, 'ab1'), + (5, 'a1!'), (6, 'a c'), (7, '!.;'), (8, ' '), + (9, 'äbç'), (10, 'ÄBÇ'); +SELECT b, + b ~ '^[[:alpha:]]+$' AS is_alpha, + b ~ '^[[:upper:]]+$' AS is_upper, + b ~ '^[[:lower:]]+$' AS is_lower, + b ~ '^[[:digit:]]+$' AS is_digit, + b ~ '^[[:alnum:]]+$' AS is_alnum, + b ~ '^[[:graph:]]+$' AS is_graph, + b ~ '^[[:print:]]+$' AS is_print, + b ~ '^[[:punct:]]+$' AS is_punct, + b ~ '^[[:space:]]+$' AS is_space +FROM collate_test6; + b | is_alpha | is_upper | is_lower | is_digit | is_alnum | is_graph | is_print | is_punct | is_space +-----+----------+----------+----------+----------+----------+----------+----------+----------+---------- + abc | t | f | t | f | t | t | t | f | f + ABC | t | t | f | f | t | t | t | f | f + 123 | f | f | f | t | t | t | t | f | f + ab1 | f | f | f | f | t | t | t | f | f + a1! | f | f | f | f | f | t | t | f | f + a c | f | f | f | f | f | f | t | f | f + !.; | f | f | f | f | f | t | t | t | f + | f | f | f | f | f | f | t | f | t + äbç | t | f | t | f | t | t | t | f | f + ÄBÇ | t | t | f | f | t | t | t | f | f +(10 rows) + +SELECT 'Türkiye' COLLATE "en_US" ~* 'KI' AS "true"; + true +------ + t +(1 row) + +SELECT 'Türkiye' COLLATE "tr_TR" ~* 'KI' AS "false"; + false +------- + f +(1 row) + +SELECT 'bıt' ~* 'BIT' COLLATE "en_US" AS "false"; + false +------- + f +(1 row) + +SELECT 'bıt' ~* 'BIT' COLLATE "tr_TR" AS "true"; + true +------ + t +(1 row) + +-- The following actually exercises the selectivity estimation for ~*. +SELECT relname FROM pg_class WHERE relname ~* '^abc'; + relname +--------- +(0 rows) + +-- to_char +SET lc_time TO 'tr_TR'; +SELECT to_char(date '2010-02-01', 'DD TMMON YYYY'); + to_char +------------- + 01 ŞUB 2010 +(1 row) + +SELECT to_char(date '2010-02-01', 'DD TMMON YYYY' COLLATE "tr_TR"); + to_char +------------- + 01 ŞUB 2010 +(1 row) + +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'); + to_char +------------- + 01 NIS 2010 +(1 row) + +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR"); + to_char +------------- + 01 NİS 2010 +(1 row) + +-- to_date +SELECT to_date('01 ŞUB 2010', 'DD TMMON YYYY'); + to_date +------------ + 02-01-2010 +(1 row) + +SELECT to_date('01 Şub 2010', 'DD TMMON YYYY'); + to_date +------------ + 02-01-2010 +(1 row) + +SELECT to_date('1234567890ab 2010', 'TMMONTH YYYY'); -- fail +ERROR: invalid value "1234567890ab" for "MONTH" +DETAIL: The given value did not match any of the allowed values for this field. +-- backwards parsing +CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; +CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; +CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "C") FROM collate_test10; +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'collview%' ORDER BY 1; + table_name | view_definition +------------+-------------------------------------------------------------------------- + collview1 | SELECT collate_test1.a, + + | collate_test1.b + + | FROM collate_test1 + + | WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text); + collview2 | SELECT collate_test1.a, + + | collate_test1.b + + | FROM collate_test1 + + | ORDER BY (collate_test1.b COLLATE "C"); + collview3 | SELECT collate_test10.a, + + | lower(((collate_test10.x || collate_test10.x) COLLATE "C")) AS lower+ + | FROM collate_test10; +(3 rows) + +-- collation propagation in various expression types +SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2; + a | coalesce +---+---------- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2; + a | coalesce +---+---------- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, coalesce(b, 'foo') FROM collate_test3 ORDER BY 2; + a | coalesce +---+---------- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hıj +(2 rows) + +SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3; + a | b | greatest +---+-----+---------- + 1 | abc | CCC + 2 | äbc | CCC + 3 | bbc | CCC + 4 | ABC | CCC +(4 rows) + +SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3; + a | b | greatest +---+-----+---------- + 1 | abc | CCC + 3 | bbc | CCC + 4 | ABC | CCC + 2 | äbc | äbc +(4 rows) + +SELECT a, b, greatest(b, 'CCC') FROM collate_test3 ORDER BY 3; + a | b | greatest +---+-----+---------- + 4 | ABC | CCC + 1 | abc | abc + 3 | bbc | bbc + 2 | äbc | äbc +(4 rows) + +SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10; + a | x | y | lower | lower +---+-----+-----+-------+------- + 1 | hij | hij | hij | hij + 2 | HIJ | HIJ | hij | hıj +(2 rows) + +SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2; + a | nullif +---+-------- + 4 | ABC + 2 | äbc + 3 | bbc + 1 | +(4 rows) + +SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2; + a | nullif +---+-------- + 4 | ABC + 3 | bbc + 2 | äbc + 1 | +(4 rows) + +SELECT a, nullif(b, 'abc') FROM collate_test3 ORDER BY 2; + a | nullif +---+-------- + 4 | ABC + 3 | bbc + 2 | äbc + 1 | +(4 rows) + +SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hıj +(2 rows) + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2; + a | b +---+------ + 4 | ABC + 2 | äbc + 1 | abcd + 3 | bbc +(4 rows) + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2; + a | b +---+------ + 4 | ABC + 1 | abcd + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test3 ORDER BY 2; + a | b +---+------ + 4 | ABC + 1 | abcd + 3 | bbc + 2 | äbc +(4 rows) + +CREATE DOMAIN testdomain AS text; +SELECT a, b::testdomain FROM collate_test1 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, b::testdomain FROM collate_test2 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b::testdomain FROM collate_test3 ORDER BY 2; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b::testdomain_sv FROM collate_test3 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hıj +(2 rows) + +SELECT min(b), max(b) FROM collate_test1; + min | max +-----+----- + abc | bbc +(1 row) + +SELECT min(b), max(b) FROM collate_test2; + min | max +-----+----- + abc | äbc +(1 row) + +SELECT min(b), max(b) FROM collate_test3; + min | max +-----+----- + ABC | äbc +(1 row) + +SELECT array_agg(b ORDER BY b) FROM collate_test1; + array_agg +------------------- + {abc,ABC,äbc,bbc} +(1 row) + +SELECT array_agg(b ORDER BY b) FROM collate_test2; + array_agg +------------------- + {abc,ABC,bbc,äbc} +(1 row) + +SELECT array_agg(b ORDER BY b) FROM collate_test3; + array_agg +------------------- + {ABC,abc,bbc,äbc} +(1 row) + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2; + a | b +---+----- + 1 | abc + 1 | abc + 4 | ABC + 4 | ABC + 2 | äbc + 2 | äbc + 3 | bbc + 3 | bbc +(8 rows) + +SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b FROM collate_test3 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test3 WHERE a > 1 ORDER BY 2; + a | b +---+----- + 3 | bbc + 2 | äbc +(2 rows) + +SELECT a, b FROM collate_test3 EXCEPT SELECT a, b FROM collate_test3 WHERE a < 2 ORDER BY 2; + a | b +---+----- + 4 | ABC + 3 | bbc + 2 | äbc +(3 rows) + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- ok + a | b +---+----- + 1 | abc + 2 | äbc + 3 | bbc + 4 | ABC + 1 | abc + 2 | äbc + 3 | bbc + 4 | ABC +(8 rows) + +SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "en_US" and "C" +LINE 1: SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collat... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- ok + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "en_US" and "C" +LINE 1: ...ELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM col... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "en_US" and "C" +LINE 1: SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM colla... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- fail +ERROR: no collation was derived for column "b" with collatable type text +HINT: Use the COLLATE clause to set the collation explicitly. +-- ideally this would be a parse-time error, but for now it must be run-time: +select x < y from collate_test10; -- fail +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +select x || y from collate_test10; -- ok, because || is not collation aware + ?column? +---------- + hijhij + HIJHIJ +(2 rows) + +select x, y from collate_test10 order by x || y; -- not so ok +ERROR: collation mismatch between implicit collations "en_US" and "tr_TR" +LINE 1: select x, y from collate_test10 order by x || y; + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +-- collation mismatch between recursive and non-recursive term +WITH RECURSIVE foo(x) AS + (SELECT x FROM (VALUES('a' COLLATE "en_US"),('b')) t(x) + UNION ALL + SELECT (x || 'c') COLLATE "de_DE" FROM foo WHERE length(x) < 10) +SELECT * FROM foo; +ERROR: recursive query "foo" column 1 has collation "en_US" in non-recursive term but collation "de_DE" overall +LINE 2: (SELECT x FROM (VALUES('a' COLLATE "en_US"),('b')) t(x) + ^ +HINT: Use the COLLATE clause to set the collation of the non-recursive term. +-- casting +SELECT CAST('42' AS text COLLATE "C"); +ERROR: syntax error at or near "COLLATE" +LINE 1: SELECT CAST('42' AS text COLLATE "C"); + ^ +SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2; + a | b +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, CAST(b AS varchar) FROM collate_test3 ORDER BY 2; + a | b +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +-- propagation of collation in SQL functions (inlined and non-inlined cases) +-- and plpgsql functions too +CREATE FUNCTION mylt (text, text) RETURNS boolean LANGUAGE sql + AS $$ select $1 < $2 $$; +CREATE FUNCTION mylt_noninline (text, text) RETURNS boolean LANGUAGE sql + AS $$ select $1 < $2 limit 1 $$; +CREATE FUNCTION mylt_plpgsql (text, text) RETURNS boolean LANGUAGE plpgsql + AS $$ begin return $1 < $2; end $$; +SELECT a.b AS a, b.b AS b, a.b < b.b AS lt, + mylt(a.b, b.b), mylt_noninline(a.b, b.b), mylt_plpgsql(a.b, b.b) +FROM collate_test1 a, collate_test1 b +ORDER BY a.b, b.b; + a | b | lt | mylt | mylt_noninline | mylt_plpgsql +-----+-----+----+------+----------------+-------------- + abc | abc | f | f | f | f + abc | ABC | t | t | t | t + abc | äbc | t | t | t | t + abc | bbc | t | t | t | t + ABC | abc | f | f | f | f + ABC | ABC | f | f | f | f + ABC | äbc | t | t | t | t + ABC | bbc | t | t | t | t + äbc | abc | f | f | f | f + äbc | ABC | f | f | f | f + äbc | äbc | f | f | f | f + äbc | bbc | t | t | t | t + bbc | abc | f | f | f | f + bbc | ABC | f | f | f | f + bbc | äbc | f | f | f | f + bbc | bbc | f | f | f | f +(16 rows) + +SELECT a.b AS a, b.b AS b, a.b < b.b COLLATE "C" AS lt, + mylt(a.b, b.b COLLATE "C"), mylt_noninline(a.b, b.b COLLATE "C"), + mylt_plpgsql(a.b, b.b COLLATE "C") +FROM collate_test1 a, collate_test1 b +ORDER BY a.b, b.b; + a | b | lt | mylt | mylt_noninline | mylt_plpgsql +-----+-----+----+------+----------------+-------------- + abc | abc | f | f | f | f + abc | ABC | f | f | f | f + abc | äbc | t | t | t | t + abc | bbc | t | t | t | t + ABC | abc | t | t | t | t + ABC | ABC | f | f | f | f + ABC | äbc | t | t | t | t + ABC | bbc | t | t | t | t + äbc | abc | f | f | f | f + äbc | ABC | f | f | f | f + äbc | äbc | f | f | f | f + äbc | bbc | f | f | f | f + bbc | abc | f | f | f | f + bbc | ABC | f | f | f | f + bbc | äbc | t | t | t | t + bbc | bbc | f | f | f | f +(16 rows) + +-- collation override in plpgsql +CREATE FUNCTION mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$ +declare + xx text := x; + yy text := y; +begin + return xx < yy; +end +$$; +SELECT mylt2('a', 'B' collate "en_US") as t, mylt2('a', 'B' collate "C") as f; + t | f +---+--- + t | f +(1 row) + +CREATE OR REPLACE FUNCTION + mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$ +declare + xx text COLLATE "POSIX" := x; + yy text := y; +begin + return xx < yy; +end +$$; +SELECT mylt2('a', 'B') as f; + f +--- + f +(1 row) + +SELECT mylt2('a', 'B' collate "C") as fail; -- conflicting collations +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +CONTEXT: PL/pgSQL function mylt2(text,text) line 6 at RETURN +SELECT mylt2('a', 'B' collate "POSIX") as f; + f +--- + f +(1 row) + +-- polymorphism +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1; + unnest +-------- + abc + ABC + äbc + bbc +(4 rows) + +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1; + unnest +-------- + abc + ABC + bbc + äbc +(4 rows) + +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test3)) ORDER BY 1; + unnest +-------- + ABC + abc + bbc + äbc +(4 rows) + +CREATE FUNCTION dup (anyelement) RETURNS anyelement + AS 'select $1' LANGUAGE sql; +SELECT a, dup(b) FROM collate_test1 ORDER BY 2; + a | dup +---+----- + 1 | abc + 4 | ABC + 2 | äbc + 3 | bbc +(4 rows) + +SELECT a, dup(b) FROM collate_test2 ORDER BY 2; + a | dup +---+----- + 1 | abc + 4 | ABC + 3 | bbc + 2 | äbc +(4 rows) + +SELECT a, dup(b) FROM collate_test3 ORDER BY 2; + a | dup +---+----- + 4 | ABC + 1 | abc + 3 | bbc + 2 | äbc +(4 rows) + +-- indexes +CREATE INDEX collate_test1_idx1 ON collate_test1 (b); +CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "C"); +CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "C")); -- this is different grammatically +CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX")); +CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "C"); -- fail +ERROR: collations are not supported by type integer +CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C")); -- fail +ERROR: collations are not supported by type integer +LINE 1: ...ATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C... + ^ +SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1; + relname | pg_get_indexdef +--------------------+------------------------------------------------------------------------------------------------------------------- + collate_test1_idx1 | CREATE INDEX collate_test1_idx1 ON collate_tests.collate_test1 USING btree (b) + collate_test1_idx2 | CREATE INDEX collate_test1_idx2 ON collate_tests.collate_test1 USING btree (b COLLATE "C") + collate_test1_idx3 | CREATE INDEX collate_test1_idx3 ON collate_tests.collate_test1 USING btree (b COLLATE "C") + collate_test1_idx4 | CREATE INDEX collate_test1_idx4 ON collate_tests.collate_test1 USING btree (((b || 'foo'::text)) COLLATE "POSIX") +(4 rows) + +-- schema manipulation commands +CREATE ROLE regress_test_role; +CREATE SCHEMA test_schema; +-- We need to do this this way to cope with varying names for encodings: +do $$ +BEGIN + EXECUTE 'CREATE COLLATION test0 (locale = ' || + quote_literal(current_setting('lc_collate')) || ');'; +END +$$; +CREATE COLLATION test0 FROM "C"; -- fail, duplicate name +ERROR: collation "test0" already exists +CREATE COLLATION IF NOT EXISTS test0 FROM "C"; -- ok, skipped +NOTICE: collation "test0" already exists, skipping +CREATE COLLATION IF NOT EXISTS test0 (locale = 'foo'); -- ok, skipped +NOTICE: collation "test0" for encoding "UTF8" already exists, skipping +do $$ +BEGIN + EXECUTE 'CREATE COLLATION test1 (lc_collate = ' || + quote_literal(current_setting('lc_collate')) || + ', lc_ctype = ' || + quote_literal(current_setting('lc_ctype')) || ');'; +END +$$; +CREATE COLLATION test3 (lc_collate = 'en_US.utf8'); -- fail, need lc_ctype +ERROR: parameter "lc_ctype" must be specified +CREATE COLLATION testx (locale = 'nonsense'); -- fail +ERROR: could not create locale "nonsense": No such file or directory +DETAIL: The operating system could not find any locale data for the locale name "nonsense". +CREATE COLLATION test4 FROM nonsense; +ERROR: collation "nonsense" for encoding "UTF8" does not exist +CREATE COLLATION test5 FROM test0; +SELECT collname FROM pg_collation WHERE collname LIKE 'test%' ORDER BY 1; + collname +---------- + test0 + test1 + test5 +(3 rows) + +ALTER COLLATION test1 RENAME TO test11; +ALTER COLLATION test0 RENAME TO test11; -- fail +ERROR: collation "test11" for encoding "UTF8" already exists in schema "collate_tests" +ALTER COLLATION test1 RENAME TO test22; -- fail +ERROR: collation "test1" for encoding "UTF8" does not exist +ALTER COLLATION test11 OWNER TO regress_test_role; +ALTER COLLATION test11 OWNER TO nonsense; +ERROR: role "nonsense" does not exist +ALTER COLLATION test11 SET SCHEMA test_schema; +COMMENT ON COLLATION test0 IS 'US English'; +SELECT collname, nspname, obj_description(pg_collation.oid, 'pg_collation') + FROM pg_collation JOIN pg_namespace ON (collnamespace = pg_namespace.oid) + WHERE collname LIKE 'test%' + ORDER BY 1; + collname | nspname | obj_description +----------+---------------+----------------- + test0 | collate_tests | US English + test11 | test_schema | + test5 | collate_tests | +(3 rows) + +DROP COLLATION test0, test_schema.test11, test5; +DROP COLLATION test0; -- fail +ERROR: collation "test0" for encoding "UTF8" does not exist +DROP COLLATION IF EXISTS test0; +NOTICE: collation "test0" does not exist, skipping +SELECT collname FROM pg_collation WHERE collname LIKE 'test%'; + collname +---------- +(0 rows) + +DROP SCHEMA test_schema; +DROP ROLE regress_test_role; +-- ALTER +ALTER COLLATION "en_US" REFRESH VERSION; +NOTICE: version has not changed +-- dependencies +CREATE COLLATION test0 FROM "C"; +CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0); +CREATE DOMAIN collate_dep_dom1 AS text COLLATE test0; +CREATE TYPE collate_dep_test2 AS (x int, y text COLLATE test0); +CREATE VIEW collate_dep_test3 AS SELECT text 'foo' COLLATE test0 AS foo; +CREATE TABLE collate_dep_test4t (a int, b text); +CREATE INDEX collate_dep_test4i ON collate_dep_test4t (b COLLATE test0); +DROP COLLATION test0 RESTRICT; -- fail +ERROR: cannot drop collation test0 because other objects depend on it +DETAIL: column b of table collate_dep_test1 depends on collation test0 +type collate_dep_dom1 depends on collation test0 +column y of composite type collate_dep_test2 depends on collation test0 +view collate_dep_test3 depends on collation test0 +index collate_dep_test4i depends on collation test0 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP COLLATION test0 CASCADE; +NOTICE: drop cascades to 5 other objects +DETAIL: drop cascades to column b of table collate_dep_test1 +drop cascades to type collate_dep_dom1 +drop cascades to column y of composite type collate_dep_test2 +drop cascades to view collate_dep_test3 +drop cascades to index collate_dep_test4i +\d collate_dep_test1 + Table "collate_tests.collate_dep_test1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + +\d collate_dep_test2 + Composite type "collate_tests.collate_dep_test2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + x | integer | | | + +DROP TABLE collate_dep_test1, collate_dep_test4t; +DROP TYPE collate_dep_test2; +-- test range types and collations +create type textrange_c as range(subtype=text, collation="C"); +create type textrange_en_us as range(subtype=text, collation="en_US"); +select textrange_c('A','Z') @> 'b'::text; + ?column? +---------- + f +(1 row) + +select textrange_en_us('A','Z') @> 'b'::text; + ?column? +---------- + t +(1 row) + +drop type textrange_c; +drop type textrange_en_us; +-- nondeterministic collations +-- (not supported with libc provider) +CREATE COLLATION ctest_det (locale = 'en_US.utf8', deterministic = true); +CREATE COLLATION ctest_nondet (locale = 'en_US.utf8', deterministic = false); +ERROR: nondeterministic collations not supported with this provider +-- cleanup +SET client_min_messages TO warning; +DROP SCHEMA collate_tests CASCADE; diff --git a/src/test/singlenode_regress/expected/collate.linux.utf8_1.out b/src/test/singlenode_regress/expected/collate.linux.utf8_1.out new file mode 100644 index 00000000000..ede5fdb5dcc --- /dev/null +++ b/src/test/singlenode_regress/expected/collate.linux.utf8_1.out @@ -0,0 +1,11 @@ +/* + * This test is for Linux/glibc systems and assumes that a full set of + * locales is installed. It must be run in a database with UTF-8 encoding, + * because other encodings don't support all the characters used. + */ +SELECT getdatabaseencoding() <> 'UTF8' OR + (SELECT count(*) FROM pg_collation WHERE collname IN ('de_DE', 'en_US', 'sv_SE', 'tr_TR') AND collencoding = pg_char_to_encoding('UTF8')) <> 4 OR + version() !~ 'linux-gnu' + AS skip_test \gset +\if :skip_test +\quit diff --git a/src/test/singlenode_regress/expected/collate.out b/src/test/singlenode_regress/expected/collate.out new file mode 100644 index 00000000000..84db8cb0129 --- /dev/null +++ b/src/test/singlenode_regress/expected/collate.out @@ -0,0 +1,727 @@ +/* + * This test is intended to pass on all platforms supported by Postgres. + * We can therefore only assume that the default, C, and POSIX collations + * are available --- and since the regression tests are often run in a + * C-locale database, these may well all have the same behavior. But + * fortunately, the system doesn't know that and will treat them as + * incompatible collations. It is therefore at least possible to test + * parser behaviors such as collation conflict resolution. This test will, + * however, be more revealing when run in a database with non-C locale, + * since any departure from C sorting behavior will show as a failure. + */ +CREATE SCHEMA collate_tests; +SET search_path = collate_tests; +CREATE TABLE collate_test1 ( + a int, + b text COLLATE "C" NOT NULL +); +\d collate_test1 + Table "collate_tests.collate_test1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | C | not null | + +CREATE TABLE collate_test_fail ( + a int COLLATE "C", + b text +); +ERROR: collations are not supported by type integer +LINE 2: a int COLLATE "C", + ^ +CREATE TABLE collate_test_like ( + LIKE collate_test1 +); +\d collate_test_like + Table "collate_tests.collate_test_like" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | C | not null | + +CREATE TABLE collate_test2 ( + a int, + b text COLLATE "POSIX" +); +INSERT INTO collate_test1 VALUES (1, 'abc'), (2, 'Abc'), (3, 'bbc'), (4, 'ABD'); +INSERT INTO collate_test2 SELECT * FROM collate_test1; +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'abc'; + a | b +---+----- + 1 | abc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b >= 'abc' COLLATE "C"; + a | b +---+----- + 1 | abc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'abc' COLLATE "C"; + a | b +---+----- + 1 | abc + 3 | bbc +(2 rows) + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "POSIX"; -- fail +ERROR: collation mismatch between explicit collations "C" and "POSIX" +LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "P... + ^ +CREATE DOMAIN testdomain_p AS text COLLATE "POSIX"; +CREATE DOMAIN testdomain_i AS int COLLATE "POSIX"; -- fail +ERROR: collations are not supported by type integer +CREATE TABLE collate_test4 ( + a int, + b testdomain_p +); +INSERT INTO collate_test4 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test4 ORDER BY b; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +CREATE TABLE collate_test5 ( + a int, + b testdomain_p COLLATE "C" +); +INSERT INTO collate_test5 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test5 ORDER BY b; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test1 ORDER BY b; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test2 ORDER BY b; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +-- star expansion +SELECT * FROM collate_test1 ORDER BY b; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT * FROM collate_test2 ORDER BY b; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +-- constant expression folding +SELECT 'bbc' COLLATE "C" > 'Abc' COLLATE "C" AS "true"; + true +------ + t +(1 row) + +SELECT 'bbc' COLLATE "POSIX" < 'Abc' COLLATE "POSIX" AS "false"; + false +------- + f +(1 row) + +-- upper/lower +CREATE TABLE collate_test10 ( + a int, + x text COLLATE "C", + y text COLLATE "POSIX" +); +INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ'); +SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10; + a | lower | lower | upper | upper | initcap | initcap +---+-------+-------+-------+-------+---------+--------- + 1 | hij | hij | HIJ | HIJ | Hij | Hij + 2 | hij | hij | HIJ | HIJ | Hij | Hij +(2 rows) + +SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hij +(2 rows) + +SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a; + a | x | y +---+-----+----- + 1 | hij | hij + 2 | HIJ | HIJ +(2 rows) + +-- backwards parsing +CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; +CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; +CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10; +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'collview%' ORDER BY 1; + table_name | view_definition +------------+------------------------------------------------------------------------------ + collview1 | SELECT collate_test1.a, + + | collate_test1.b + + | FROM collate_test1 + + | WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text); + collview2 | SELECT collate_test1.a, + + | collate_test1.b + + | FROM collate_test1 + + | ORDER BY (collate_test1.b COLLATE "C"); + collview3 | SELECT collate_test10.a, + + | lower(((collate_test10.x || collate_test10.x) COLLATE "POSIX")) AS lower+ + | FROM collate_test10; +(3 rows) + +-- collation propagation in various expression types +SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2; + a | coalesce +---+---------- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2; + a | coalesce +---+---------- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hij +(2 rows) + +SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3; + a | b | greatest +---+-----+---------- + 2 | Abc | CCC + 4 | ABD | CCC + 1 | abc | abc + 3 | bbc | bbc +(4 rows) + +SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3; + a | b | greatest +---+-----+---------- + 2 | Abc | CCC + 4 | ABD | CCC + 1 | abc | abc + 3 | bbc | bbc +(4 rows) + +SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10; + a | x | y | lower | lower +---+-----+-----+-------+------- + 1 | hij | hij | hij | hij + 2 | HIJ | HIJ | foo | foo +(2 rows) + +SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2; + a | nullif +---+-------- + 4 | ABD + 2 | Abc + 3 | bbc + 1 | +(4 rows) + +SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2; + a | nullif +---+-------- + 4 | ABD + 2 | Abc + 3 | bbc + 1 | +(4 rows) + +SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hij +(2 rows) + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2; + a | b +---+------ + 4 | ABD + 2 | Abc + 1 | abcd + 3 | bbc +(4 rows) + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2; + a | b +---+------ + 4 | ABD + 2 | Abc + 1 | abcd + 3 | bbc +(4 rows) + +CREATE DOMAIN testdomain AS text; +SELECT a, b::testdomain FROM collate_test1 ORDER BY 2; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, b::testdomain FROM collate_test2 ORDER BY 2; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, b::testdomain_p FROM collate_test2 ORDER BY 2; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10; + a | lower | lower +---+-------+------- + 1 | hij | hij + 2 | hij | hij +(2 rows) + +SELECT min(b), max(b) FROM collate_test1; + min | max +-----+----- + ABD | bbc +(1 row) + +SELECT min(b), max(b) FROM collate_test2; + min | max +-----+----- + ABD | bbc +(1 row) + +SELECT array_agg(b ORDER BY b) FROM collate_test1; + array_agg +------------------- + {ABD,Abc,abc,bbc} +(1 row) + +SELECT array_agg(b ORDER BY b) FROM collate_test2; + array_agg +------------------- + {ABD,Abc,abc,bbc} +(1 row) + +-- In aggregates, ORDER BY expressions don't affect aggregate's collation +SELECT string_agg(x COLLATE "C", y COLLATE "POSIX") FROM collate_test10; -- fail +ERROR: collation mismatch between explicit collations "C" and "POSIX" +LINE 1: SELECT string_agg(x COLLATE "C", y COLLATE "POSIX") FROM col... + ^ +SELECT array_agg(x COLLATE "C" ORDER BY y COLLATE "POSIX") FROM collate_test10; + array_agg +----------- + {HIJ,hij} +(1 row) + +SELECT array_agg(a ORDER BY x COLLATE "C", y COLLATE "POSIX") FROM collate_test10; + array_agg +----------- + {2,1} +(1 row) + +SELECT array_agg(a ORDER BY x||y) FROM collate_test10; -- fail +ERROR: collation mismatch between implicit collations "C" and "POSIX" +LINE 1: SELECT array_agg(a ORDER BY x||y) FROM collate_test10; + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2; + a | b +---+----- + 4 | ABD + 4 | ABD + 2 | Abc + 2 | Abc + 1 | abc + 1 | abc + 3 | bbc + 3 | bbc +(8 rows) + +SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test2 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test2 WHERE a > 1 ORDER BY 2; + a | b +---+----- + 2 | Abc + 3 | bbc +(2 rows) + +SELECT a, b FROM collate_test2 EXCEPT SELECT a, b FROM collate_test2 WHERE a < 2 ORDER BY 2; + a | b +---+----- + 4 | ABD + 2 | Abc + 3 | bbc +(3 rows) + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2 ORDER BY 2; -- fail +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2; -- ok + a | b +---+----- + 1 | abc + 2 | Abc + 3 | bbc + 4 | ABD + 1 | abc + 2 | Abc + 3 | bbc + 4 | ABD +(8 rows) + +SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "C" and "POSIX" +LINE 1: SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collat... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- ok + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test2 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "C" and "POSIX" +LINE 1: ...ELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM col... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test2 ORDER BY 2; -- fail +ERROR: collation mismatch between implicit collations "C" and "POSIX" +LINE 1: SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM colla... + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2; -- fail +ERROR: no collation was derived for column "b" with collatable type text +HINT: Use the COLLATE clause to set the collation explicitly. +-- ideally this would be a parse-time error, but for now it must be run-time: +select x < y from collate_test10; -- fail +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +select x || y from collate_test10; -- ok, because || is not collation aware + ?column? +---------- + hijhij + HIJHIJ +(2 rows) + +select x, y from collate_test10 order by x || y; -- not so ok +ERROR: collation mismatch between implicit collations "C" and "POSIX" +LINE 1: select x, y from collate_test10 order by x || y; + ^ +HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. +-- collation mismatch between recursive and non-recursive term +WITH RECURSIVE foo(x) AS + (SELECT x FROM (VALUES('a' COLLATE "C"),('b')) t(x) + UNION ALL + SELECT (x || 'c') COLLATE "POSIX" FROM foo WHERE length(x) < 10) +SELECT * FROM foo; +ERROR: recursive query "foo" column 1 has collation "C" in non-recursive term but collation "POSIX" overall +LINE 2: (SELECT x FROM (VALUES('a' COLLATE "C"),('b')) t(x) + ^ +HINT: Use the COLLATE clause to set the collation of the non-recursive term. +SELECT a, b, a < b as lt FROM + (VALUES ('a', 'B'), ('A', 'b' COLLATE "C")) v(a,b); + a | b | lt +---+---+---- + a | B | f + A | b | t +(2 rows) + +-- collation mismatch in subselects +SELECT * FROM collate_test10 WHERE (x, y) NOT IN (SELECT y, x FROM collate_test10); +ERROR: could not determine which collation to use for string comparison +HINT: Use the COLLATE clause to set the collation explicitly. +-- now it works with overrides +SELECT * FROM collate_test10 WHERE (x COLLATE "POSIX", y COLLATE "C") NOT IN (SELECT y, x FROM collate_test10); + a | x | y +---+---+--- +(0 rows) + +SELECT * FROM collate_test10 WHERE (x, y) NOT IN (SELECT y COLLATE "C", x COLLATE "POSIX" FROM collate_test10); + a | x | y +---+---+--- +(0 rows) + +-- casting +SELECT CAST('42' AS text COLLATE "C"); +ERROR: syntax error at or near "COLLATE" +LINE 1: SELECT CAST('42' AS text COLLATE "C"); + ^ +SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2; + a | b +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +-- result of a SQL function +CREATE FUNCTION vc (text) RETURNS text LANGUAGE sql + AS 'select $1::varchar'; +SELECT a, b FROM collate_test1 ORDER BY a, vc(b); + a | b +---+----- + 1 | abc + 2 | Abc + 3 | bbc + 4 | ABD +(4 rows) + +-- polymorphism +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1; + unnest +-------- + ABD + Abc + abc + bbc +(4 rows) + +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1; + unnest +-------- + ABD + Abc + abc + bbc +(4 rows) + +CREATE FUNCTION dup (anyelement) RETURNS anyelement + AS 'select $1' LANGUAGE sql; +SELECT a, dup(b) FROM collate_test1 ORDER BY 2; + a | dup +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +SELECT a, dup(b) FROM collate_test2 ORDER BY 2; + a | dup +---+----- + 4 | ABD + 2 | Abc + 1 | abc + 3 | bbc +(4 rows) + +-- indexes +CREATE INDEX collate_test1_idx1 ON collate_test1 (b); +CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "POSIX"); +CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "POSIX")); -- this is different grammatically +CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX")); +CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "POSIX"); -- fail +ERROR: collations are not supported by type integer +CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "POSIX")); -- fail +ERROR: collations are not supported by type integer +LINE 1: ...ATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "P... + ^ +SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1; + relname | pg_get_indexdef +--------------------+------------------------------------------------------------------------------------------------------------------- + collate_test1_idx1 | CREATE INDEX collate_test1_idx1 ON collate_tests.collate_test1 USING btree (b) + collate_test1_idx2 | CREATE INDEX collate_test1_idx2 ON collate_tests.collate_test1 USING btree (b COLLATE "POSIX") + collate_test1_idx3 | CREATE INDEX collate_test1_idx3 ON collate_tests.collate_test1 USING btree (b COLLATE "POSIX") + collate_test1_idx4 | CREATE INDEX collate_test1_idx4 ON collate_tests.collate_test1 USING btree (((b || 'foo'::text)) COLLATE "POSIX") +(4 rows) + +-- foreign keys +-- force indexes and mergejoins to be used for FK checking queries, +-- else they might not exercise collation-dependent operators +SET enable_seqscan TO 0; +SET enable_hashjoin TO 0; +SET enable_nestloop TO 0; +CREATE TABLE collate_test20 (f1 text COLLATE "C" PRIMARY KEY); +INSERT INTO collate_test20 VALUES ('foo'), ('bar'); +CREATE TABLE collate_test21 (f2 text COLLATE "POSIX" REFERENCES collate_test20); +INSERT INTO collate_test21 VALUES ('foo'), ('bar'); +INSERT INTO collate_test21 VALUES ('baz'); -- fail +-- Passes in GPDB, because we don't check foreign keys +CREATE TABLE collate_test22 (f2 text COLLATE "POSIX"); +INSERT INTO collate_test22 VALUES ('foo'), ('bar'), ('baz'); +ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20; -- fail +-- Passes in GPDB, because we don't check foreign keys +DELETE FROM collate_test22 WHERE f2 = 'baz'; +ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20; +RESET enable_seqscan; +RESET enable_hashjoin; +RESET enable_nestloop; +-- EXPLAIN +EXPLAIN (COSTS OFF) + SELECT * FROM collate_test10 ORDER BY x, y; + QUERY PLAN +---------------------------------------------- + Sort + Sort Key: x COLLATE "C", y COLLATE "POSIX" + -> Seq Scan on collate_test10 +(3 rows) + +EXPLAIN (COSTS OFF) + SELECT * FROM collate_test10 ORDER BY x DESC, y COLLATE "C" ASC NULLS FIRST; + QUERY PLAN +----------------------------------------------------------- + Sort + Sort Key: x COLLATE "C" DESC, y COLLATE "C" NULLS FIRST + -> Seq Scan on collate_test10 +(3 rows) + +-- CREATE/DROP COLLATION +CREATE COLLATION mycoll1 FROM "C"; +CREATE COLLATION mycoll2 ( LC_COLLATE = "POSIX", LC_CTYPE = "POSIX" ); +CREATE COLLATION mycoll3 FROM "default"; -- intentionally unsupported +ERROR: collation "default" cannot be copied +DROP COLLATION mycoll1; +CREATE TABLE collate_test23 (f1 text collate mycoll2); +DROP COLLATION mycoll2; -- fail +ERROR: cannot drop collation mycoll2 because other objects depend on it +DETAIL: column f1 of table collate_test23 depends on collation mycoll2 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- invalid: non-lowercase quoted identifiers +CREATE COLLATION case_coll ("Lc_Collate" = "POSIX", "Lc_Ctype" = "POSIX"); +ERROR: collation attribute "Lc_Collate" not recognized +LINE 1: CREATE COLLATION case_coll ("Lc_Collate" = "POSIX", "Lc_Ctyp... + ^ +-- 9.1 bug with useless COLLATE in an expression subject to length coercion +CREATE TEMP TABLE vctable (f1 varchar(25)); +INSERT INTO vctable VALUES ('foo' COLLATE "C"); +SELECT collation for ('foo'); -- unknown type - null + pg_collation_for +------------------ + +(1 row) + +SELECT collation for ('foo'::text); + pg_collation_for +------------------ + "default" +(1 row) + +SELECT collation for ((SELECT a FROM collate_test1 LIMIT 1)); -- non-collatable type - error +ERROR: collations are not supported by type integer +SELECT collation for ((SELECT b FROM collate_test1 LIMIT 1)); + pg_collation_for +------------------ + "C" +(1 row) + +-- old bug with not dropping COLLATE when coercing to non-collatable type +CREATE VIEW collate_on_int AS +SELECT c1+1 AS c1p FROM + (SELECT ('4' COLLATE "C")::INT AS c1) ss; +\d+ collate_on_int + View "collate_tests.collate_on_int" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + c1p | integer | | | | plain | +View definition: + SELECT ss.c1 + 1 AS c1p + FROM ( SELECT 4 AS c1) ss; + +-- +-- Clean up. Many of these table names will be re-used if the user is +-- trying to run any platform-specific collation tests later, so we +-- must get rid of them. +-- +DROP SCHEMA collate_tests CASCADE; +NOTICE: drop cascades to 19 other objects +DETAIL: drop cascades to table collate_test1 +drop cascades to table collate_test_like +drop cascades to table collate_test2 +drop cascades to type testdomain_p +drop cascades to table collate_test4 +drop cascades to table collate_test5 +drop cascades to table collate_test10 +drop cascades to view collview1 +drop cascades to view collview2 +drop cascades to view collview3 +drop cascades to type testdomain +drop cascades to function vc(text) +drop cascades to function dup(anyelement) +drop cascades to table collate_test20 +drop cascades to table collate_test21 +drop cascades to table collate_test22 +drop cascades to collation mycoll2 +drop cascades to table collate_test23 +drop cascades to view collate_on_int diff --git a/src/test/singlenode_regress/expected/combocid.out b/src/test/singlenode_regress/expected/combocid.out new file mode 100644 index 00000000000..2bf080b2ae2 --- /dev/null +++ b/src/test/singlenode_regress/expected/combocid.out @@ -0,0 +1,169 @@ +-- +-- Tests for some likely failure cases with combo cmin/cmax mechanism +-- +CREATE TEMP TABLE combocidtest (foobar int); +BEGIN; +-- a few dummy ops to push up the CommandId counter +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest VALUES (1); +INSERT INTO combocidtest VALUES (2); +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 10 | 1 + (0,2) | 11 | 2 +(2 rows) + +SAVEPOINT s1; +UPDATE combocidtest SET foobar = foobar + 10; +-- here we should see only updated tuples +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,3) | 12 | 11 + (0,4) | 12 | 12 +(2 rows) + +ROLLBACK TO s1; +-- now we should see old tuples, but with combo CIDs starting at 0 +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 0 | 1 + (0,2) | 1 | 2 +(2 rows) + +COMMIT; +-- combo data is not there anymore, but should still see tuples +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 0 | 1 + (0,2) | 1 | 2 +(2 rows) + +-- Test combo CIDs with portals +BEGIN; +INSERT INTO combocidtest VALUES (333); +DECLARE c CURSOR FOR SELECT ctid,cmin,* FROM combocidtest; +DELETE FROM combocidtest; +FETCH ALL FROM c; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 1 | 1 + (0,2) | 1 | 2 + (0,5) | 0 | 333 +(3 rows) + +ROLLBACK; +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 1 | 1 + (0,2) | 1 | 2 +(2 rows) + +-- check behavior with locked tuples +BEGIN; +-- a few dummy ops to push up the CommandId counter +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest VALUES (444); +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 1 | 1 + (0,2) | 1 | 2 + (0,6) | 10 | 444 +(3 rows) + +SAVEPOINT s1; +-- this doesn't affect cmin +SELECT ctid,cmin,* FROM combocidtest FOR UPDATE; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 1 | 1 + (0,2) | 1 | 2 + (0,6) | 10 | 444 +(3 rows) + +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 1 | 1 + (0,2) | 1 | 2 + (0,6) | 10 | 444 +(3 rows) + +-- but this does +UPDATE combocidtest SET foobar = foobar + 10; +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,7) | 12 | 11 + (0,8) | 12 | 12 + (0,9) | 12 | 454 +(3 rows) + +ROLLBACK TO s1; +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 12 | 1 + (0,2) | 12 | 2 + (0,6) | 0 | 444 +(3 rows) + +COMMIT; +SELECT ctid,cmin,* FROM combocidtest; + ctid | cmin | foobar +-------+------+-------- + (0,1) | 12 | 1 + (0,2) | 12 | 2 + (0,6) | 0 | 444 +(3 rows) + +-- test for bug reported in +-- CABRT9RC81YUf1=jsmWopcKJEro=VoeG2ou6sPwyOUTx_qteRsg@mail.gmail.com +CREATE TABLE IF NOT EXISTS testcase( + id int PRIMARY KEY, + balance numeric +); +INSERT INTO testcase VALUES (1, 0); +BEGIN; +SELECT * FROM testcase WHERE testcase.id = 1 FOR UPDATE; + id | balance +----+--------- + 1 | 0 +(1 row) + +UPDATE testcase SET balance = balance + 400 WHERE id=1; +SAVEPOINT subxact; +UPDATE testcase SET balance = balance - 100 WHERE id=1; +ROLLBACK TO SAVEPOINT subxact; +-- should return one tuple +SELECT * FROM testcase WHERE id = 1 FOR UPDATE; + id | balance +----+--------- + 1 | 400 +(1 row) + +ROLLBACK; +DROP TABLE testcase; diff --git a/src/test/singlenode_regress/expected/comments.out b/src/test/singlenode_regress/expected/comments.out new file mode 100644 index 00000000000..33f612e6332 --- /dev/null +++ b/src/test/singlenode_regress/expected/comments.out @@ -0,0 +1,65 @@ +-- +-- COMMENTS +-- +SELECT 'trailing' AS first; -- trailing single line + first +---------- + trailing +(1 row) + +SELECT /* embedded single line */ 'embedded' AS second; + second +---------- + embedded +(1 row) + +SELECT /* both embedded and trailing single line */ 'both' AS third; -- trailing single line + third +------- + both +(1 row) + +SELECT 'before multi-line' AS fourth; + fourth +------------------- + before multi-line +(1 row) + +/* This is an example of SQL which should not execute: + * select 'multi-line'; + */ +SELECT 'after multi-line' AS fifth; + fifth +------------------ + after multi-line +(1 row) + +-- +-- Nested comments +-- +/* +SELECT 'trailing' as x1; -- inside block comment +*/ +/* This block comment surrounds a query which itself has a block comment... +SELECT /* embedded single line */ 'embedded' AS x2; +*/ +SELECT -- continued after the following block comments... +/* Deeply nested comment. + This includes a single apostrophe to make sure we aren't decoding this part as a string. +SELECT 'deep nest' AS n1; +/* Second level of nesting... +SELECT 'deeper nest' as n2; +/* Third level of nesting... +SELECT 'deepest nest' as n3; +*/ +Hoo boy. Still two deep... +*/ +Now just one deep... +*/ +'deeply nested example' AS sixth; + sixth +----------------------- + deeply nested example +(1 row) + +/* and this is the end of the file */ diff --git a/src/test/singlenode_regress/expected/compression.out b/src/test/singlenode_regress/expected/compression.out new file mode 100644 index 00000000000..4c997e2602f --- /dev/null +++ b/src/test/singlenode_regress/expected/compression.out @@ -0,0 +1,362 @@ +\set HIDE_TOAST_COMPRESSION false +-- ensure we get stable results regardless of installation's default +SET default_toast_compression = 'pglz'; +-- test creating table with compression method +CREATE TABLE cmdata(f1 text COMPRESSION pglz); +CREATE INDEX idx ON cmdata(f1); +INSERT INTO cmdata VALUES(repeat('1234567890', 1000)); +\d+ cmdata + Table "public.cmdata" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | text | | | | extended | pglz | | +Indexes: + "idx" btree (f1) + +CREATE TABLE cmdata1(f1 TEXT COMPRESSION lz4); +INSERT INTO cmdata1 VALUES(repeat('1234567890', 1004)); +\d+ cmdata1 + Table "public.cmdata1" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | text | | | | extended | lz4 | | + +-- verify stored compression method in the data +SELECT pg_column_compression(f1) FROM cmdata; + pg_column_compression +----------------------- + pglz +(1 row) + +SELECT pg_column_compression(f1) FROM cmdata1; + pg_column_compression +----------------------- + lz4 +(1 row) + +-- decompress data slice +SELECT SUBSTR(f1, 200, 5) FROM cmdata; + substr +-------- + 01234 +(1 row) + +SELECT SUBSTR(f1, 2000, 50) FROM cmdata1; + substr +---------------------------------------------------- + 01234567890123456789012345678901234567890123456789 +(1 row) + +-- copy with table creation +SELECT * INTO cmmove1 FROM cmdata; +\d+ cmmove1 + Table "public.cmmove1" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | text | | | | extended | | | + +SELECT pg_column_compression(f1) FROM cmmove1; + pg_column_compression +----------------------- + pglz +(1 row) + +-- copy to existing table +CREATE TABLE cmmove3(f1 text COMPRESSION pglz); +INSERT INTO cmmove3 SELECT * FROM cmdata; +INSERT INTO cmmove3 SELECT * FROM cmdata1; +SELECT pg_column_compression(f1) FROM cmmove3; + pg_column_compression +----------------------- + pglz + lz4 +(2 rows) + +-- test LIKE INCLUDING COMPRESSION +CREATE TABLE cmdata2 (LIKE cmdata1 INCLUDING COMPRESSION); +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | text | | | | extended | lz4 | | + +DROP TABLE cmdata2; +-- try setting compression for incompressible data type +CREATE TABLE cmdata2 (f1 int COMPRESSION pglz); +ERROR: column data type integer does not support compression +-- update using datum from different table +CREATE TABLE cmmove2(f1 text COMPRESSION pglz); +INSERT INTO cmmove2 VALUES (repeat('1234567890', 1004)); +SELECT pg_column_compression(f1) FROM cmmove2; + pg_column_compression +----------------------- + pglz +(1 row) + +UPDATE cmmove2 SET f1 = cmdata1.f1 FROM cmdata1; +SELECT pg_column_compression(f1) FROM cmmove2; + pg_column_compression +----------------------- + lz4 +(1 row) + +-- test externally stored compressed data +CREATE OR REPLACE FUNCTION large_val() RETURNS TEXT LANGUAGE SQL AS +'select array_agg(md5(g::text))::text from generate_series(1, 256) g'; +CREATE TABLE cmdata2 (f1 text COMPRESSION pglz); +INSERT INTO cmdata2 SELECT large_val() || repeat('a', 4000); +SELECT pg_column_compression(f1) FROM cmdata2; + pg_column_compression +----------------------- + pglz +(1 row) + +INSERT INTO cmdata1 SELECT large_val() || repeat('a', 4000); +SELECT pg_column_compression(f1) FROM cmdata1; + pg_column_compression +----------------------- + lz4 + lz4 +(2 rows) + +SELECT SUBSTR(f1, 200, 5) FROM cmdata1; + substr +-------- + 01234 + 8f14e +(2 rows) + +SELECT SUBSTR(f1, 200, 5) FROM cmdata2; + substr +-------- + 8f14e +(1 row) + +DROP TABLE cmdata2; +--test column type update varlena/non-varlena +CREATE TABLE cmdata2 (f1 int); +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+---------+-----------+----------+---------+---------+-------------+--------------+------------- + f1 | integer | | | | plain | | | + +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE varchar; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+-------------------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | character varying | | | | extended | | | + +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE int USING f1::integer; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+---------+-----------+----------+---------+---------+-------------+--------------+------------- + f1 | integer | | | | plain | | | + +--changing column storage should not impact the compression method +--but the data should not be compressed +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE varchar; +ALTER TABLE cmdata2 ALTER COLUMN f1 SET COMPRESSION pglz; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+-------------------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | character varying | | | | extended | pglz | | + +ALTER TABLE cmdata2 ALTER COLUMN f1 SET STORAGE plain; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+-------------------+-----------+----------+---------+---------+-------------+--------------+------------- + f1 | character varying | | | | plain | pglz | | + +INSERT INTO cmdata2 VALUES (repeat('123456789', 800)); +SELECT pg_column_compression(f1) FROM cmdata2; + pg_column_compression +----------------------- + +(1 row) + +-- test compression with materialized view +CREATE MATERIALIZED VIEW compressmv(x) AS SELECT * FROM cmdata1; +\d+ compressmv + Materialized view "public.compressmv" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + x | text | | | | extended | | | +View definition: + SELECT cmdata1.f1 AS x + FROM cmdata1; + +SELECT pg_column_compression(f1) FROM cmdata1; + pg_column_compression +----------------------- + lz4 + lz4 +(2 rows) + +SELECT pg_column_compression(x) FROM compressmv; + pg_column_compression +----------------------- + lz4 + lz4 +(2 rows) + +-- test compression with partition +CREATE TABLE cmpart(f1 text COMPRESSION lz4) PARTITION BY HASH(f1); +CREATE TABLE cmpart1 PARTITION OF cmpart FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE cmpart2(f1 text COMPRESSION pglz); +ALTER TABLE cmpart ATTACH PARTITION cmpart2 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO cmpart VALUES (repeat('123456789', 1004)); +INSERT INTO cmpart VALUES (repeat('123456789', 4004)); +SELECT pg_column_compression(f1) FROM cmpart1; + pg_column_compression +----------------------- + lz4 +(1 row) + +SELECT pg_column_compression(f1) FROM cmpart2; + pg_column_compression +----------------------- + pglz +(1 row) + +-- test compression with inheritance, error +CREATE TABLE cminh() INHERITS(cmdata, cmdata1); +NOTICE: merging multiple inherited definitions of column "f1" +ERROR: column "f1" has a compression method conflict +DETAIL: pglz versus lz4 +CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); +NOTICE: merging column "f1" with inherited definition +ERROR: column "f1" has a compression method conflict +DETAIL: pglz versus lz4 +-- test default_toast_compression GUC +SET default_toast_compression = ''; +ERROR: invalid value for parameter "default_toast_compression": "" +HINT: Available values: pglz, lz4. +SET default_toast_compression = 'I do not exist compression'; +ERROR: invalid value for parameter "default_toast_compression": "I do not exist compression" +HINT: Available values: pglz, lz4. +SET default_toast_compression = 'lz4'; +SET default_toast_compression = 'pglz'; +-- test alter compression method +ALTER TABLE cmdata ALTER COLUMN f1 SET COMPRESSION lz4; +INSERT INTO cmdata VALUES (repeat('123456789', 4004)); +\d+ cmdata + Table "public.cmdata" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | text | | | | extended | lz4 | | +Indexes: + "idx" btree (f1) + +SELECT pg_column_compression(f1) FROM cmdata; + pg_column_compression +----------------------- + pglz + lz4 +(2 rows) + +ALTER TABLE cmdata2 ALTER COLUMN f1 SET COMPRESSION default; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+-------------------+-----------+----------+---------+---------+-------------+--------------+------------- + f1 | character varying | | | | plain | | | + +-- test alter compression method for materialized views +ALTER MATERIALIZED VIEW compressmv ALTER COLUMN x SET COMPRESSION lz4; +\d+ compressmv + Materialized view "public.compressmv" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + x | text | | | | extended | lz4 | | +View definition: + SELECT cmdata1.f1 AS x + FROM cmdata1; + +-- test alter compression method for partitioned tables +ALTER TABLE cmpart1 ALTER COLUMN f1 SET COMPRESSION pglz; +ALTER TABLE cmpart2 ALTER COLUMN f1 SET COMPRESSION lz4; +-- new data should be compressed with the current compression method +INSERT INTO cmpart VALUES (repeat('123456789', 1004)); +INSERT INTO cmpart VALUES (repeat('123456789', 4004)); +SELECT pg_column_compression(f1) FROM cmpart1; + pg_column_compression +----------------------- + lz4 + pglz +(2 rows) + +SELECT pg_column_compression(f1) FROM cmpart2; + pg_column_compression +----------------------- + pglz + lz4 +(2 rows) + +-- VACUUM FULL does not recompress +SELECT pg_column_compression(f1) FROM cmdata; + pg_column_compression +----------------------- + pglz + lz4 +(2 rows) + +VACUUM FULL cmdata; +SELECT pg_column_compression(f1) FROM cmdata; + pg_column_compression +----------------------- + pglz + lz4 +(2 rows) + +-- test expression index +DROP TABLE cmdata2; +CREATE TABLE cmdata2 (f1 TEXT COMPRESSION pglz, f2 TEXT COMPRESSION lz4); +CREATE UNIQUE INDEX idx1 ON cmdata2 ((f1 || f2)); +INSERT INTO cmdata2 VALUES((SELECT array_agg(md5(g::TEXT))::TEXT FROM +generate_series(1, 50) g), VERSION()); +-- check data is ok +SELECT length(f1) FROM cmdata; + length +-------- + 10000 + 36036 +(2 rows) + +SELECT length(f1) FROM cmdata1; + length +-------- + 10040 + 12449 +(2 rows) + +SELECT length(f1) FROM cmmove1; + length +-------- + 10000 +(1 row) + +SELECT length(f1) FROM cmmove2; + length +-------- + 10040 +(1 row) + +SELECT length(f1) FROM cmmove3; + length +-------- + 10000 + 10040 +(2 rows) + +CREATE TABLE badcompresstbl (a text COMPRESSION I_Do_Not_Exist_Compression); -- fails +ERROR: invalid compression method "i_do_not_exist_compression" +CREATE TABLE badcompresstbl (a text); +ALTER TABLE badcompresstbl ALTER a SET COMPRESSION I_Do_Not_Exist_Compression; -- fails +ERROR: invalid compression method "i_do_not_exist_compression" +DROP TABLE badcompresstbl; +\set HIDE_TOAST_COMPRESSION true diff --git a/src/test/singlenode_regress/expected/compression_1.out b/src/test/singlenode_regress/expected/compression_1.out new file mode 100644 index 00000000000..1ce2962d556 --- /dev/null +++ b/src/test/singlenode_regress/expected/compression_1.out @@ -0,0 +1,361 @@ +\set HIDE_TOAST_COMPRESSION false +-- ensure we get stable results regardless of installation's default +SET default_toast_compression = 'pglz'; +-- test creating table with compression method +CREATE TABLE cmdata(f1 text COMPRESSION pglz); +CREATE INDEX idx ON cmdata(f1); +INSERT INTO cmdata VALUES(repeat('1234567890', 1000)); +\d+ cmdata + Table "public.cmdata" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | text | | | | extended | pglz | | +Indexes: + "idx" btree (f1) + +CREATE TABLE cmdata1(f1 TEXT COMPRESSION lz4); +ERROR: compression method lz4 not supported +DETAIL: This functionality requires the server to be built with lz4 support. +HINT: You need to rebuild PostgreSQL using --with-lz4. +INSERT INTO cmdata1 VALUES(repeat('1234567890', 1004)); +ERROR: relation "cmdata1" does not exist +LINE 1: INSERT INTO cmdata1 VALUES(repeat('1234567890', 1004)); + ^ +\d+ cmdata1 +-- verify stored compression method in the data +SELECT pg_column_compression(f1) FROM cmdata; + pg_column_compression +----------------------- + pglz +(1 row) + +SELECT pg_column_compression(f1) FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: SELECT pg_column_compression(f1) FROM cmdata1; + ^ +-- decompress data slice +SELECT SUBSTR(f1, 200, 5) FROM cmdata; + substr +-------- + 01234 +(1 row) + +SELECT SUBSTR(f1, 2000, 50) FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: SELECT SUBSTR(f1, 2000, 50) FROM cmdata1; + ^ +-- copy with table creation +SELECT * INTO cmmove1 FROM cmdata; +\d+ cmmove1 + Table "public.cmmove1" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | text | | | | extended | | | + +SELECT pg_column_compression(f1) FROM cmmove1; + pg_column_compression +----------------------- + pglz +(1 row) + +-- copy to existing table +CREATE TABLE cmmove3(f1 text COMPRESSION pglz); +INSERT INTO cmmove3 SELECT * FROM cmdata; +INSERT INTO cmmove3 SELECT * FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: INSERT INTO cmmove3 SELECT * FROM cmdata1; + ^ +SELECT pg_column_compression(f1) FROM cmmove3; + pg_column_compression +----------------------- + pglz +(1 row) + +-- test LIKE INCLUDING COMPRESSION +CREATE TABLE cmdata2 (LIKE cmdata1 INCLUDING COMPRESSION); +ERROR: relation "cmdata1" does not exist +LINE 1: CREATE TABLE cmdata2 (LIKE cmdata1 INCLUDING COMPRESSION); + ^ +\d+ cmdata2 +DROP TABLE cmdata2; +ERROR: table "cmdata2" does not exist +-- try setting compression for incompressible data type +CREATE TABLE cmdata2 (f1 int COMPRESSION pglz); +ERROR: column data type integer does not support compression +-- update using datum from different table +CREATE TABLE cmmove2(f1 text COMPRESSION pglz); +INSERT INTO cmmove2 VALUES (repeat('1234567890', 1004)); +SELECT pg_column_compression(f1) FROM cmmove2; + pg_column_compression +----------------------- + pglz +(1 row) + +UPDATE cmmove2 SET f1 = cmdata1.f1 FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: UPDATE cmmove2 SET f1 = cmdata1.f1 FROM cmdata1; + ^ +SELECT pg_column_compression(f1) FROM cmmove2; + pg_column_compression +----------------------- + pglz +(1 row) + +-- test externally stored compressed data +CREATE OR REPLACE FUNCTION large_val() RETURNS TEXT LANGUAGE SQL AS +'select array_agg(md5(g::text))::text from generate_series(1, 256) g'; +CREATE TABLE cmdata2 (f1 text COMPRESSION pglz); +INSERT INTO cmdata2 SELECT large_val() || repeat('a', 4000); +SELECT pg_column_compression(f1) FROM cmdata2; + pg_column_compression +----------------------- + pglz +(1 row) + +INSERT INTO cmdata1 SELECT large_val() || repeat('a', 4000); +ERROR: relation "cmdata1" does not exist +LINE 1: INSERT INTO cmdata1 SELECT large_val() || repeat('a', 4000); + ^ +SELECT pg_column_compression(f1) FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: SELECT pg_column_compression(f1) FROM cmdata1; + ^ +SELECT SUBSTR(f1, 200, 5) FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: SELECT SUBSTR(f1, 200, 5) FROM cmdata1; + ^ +SELECT SUBSTR(f1, 200, 5) FROM cmdata2; + substr +-------- + 8f14e +(1 row) + +DROP TABLE cmdata2; +--test column type update varlena/non-varlena +CREATE TABLE cmdata2 (f1 int); +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+---------+-----------+----------+---------+---------+-------------+--------------+------------- + f1 | integer | | | | plain | | | + +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE varchar; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+-------------------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | character varying | | | | extended | | | + +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE int USING f1::integer; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+---------+-----------+----------+---------+---------+-------------+--------------+------------- + f1 | integer | | | | plain | | | + +--changing column storage should not impact the compression method +--but the data should not be compressed +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE varchar; +ALTER TABLE cmdata2 ALTER COLUMN f1 SET COMPRESSION pglz; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+-------------------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | character varying | | | | extended | pglz | | + +ALTER TABLE cmdata2 ALTER COLUMN f1 SET STORAGE plain; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+-------------------+-----------+----------+---------+---------+-------------+--------------+------------- + f1 | character varying | | | | plain | pglz | | + +INSERT INTO cmdata2 VALUES (repeat('123456789', 800)); +SELECT pg_column_compression(f1) FROM cmdata2; + pg_column_compression +----------------------- + +(1 row) + +-- test compression with materialized view +CREATE MATERIALIZED VIEW compressmv(x) AS SELECT * FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: ...TE MATERIALIZED VIEW compressmv(x) AS SELECT * FROM cmdata1; + ^ +\d+ compressmv +SELECT pg_column_compression(f1) FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: SELECT pg_column_compression(f1) FROM cmdata1; + ^ +SELECT pg_column_compression(x) FROM compressmv; +ERROR: relation "compressmv" does not exist +LINE 1: SELECT pg_column_compression(x) FROM compressmv; + ^ +-- test compression with partition +CREATE TABLE cmpart(f1 text COMPRESSION lz4) PARTITION BY HASH(f1); +ERROR: compression method lz4 not supported +DETAIL: This functionality requires the server to be built with lz4 support. +HINT: You need to rebuild PostgreSQL using --with-lz4. +CREATE TABLE cmpart1 PARTITION OF cmpart FOR VALUES WITH (MODULUS 2, REMAINDER 0); +ERROR: relation "cmpart" does not exist +CREATE TABLE cmpart2(f1 text COMPRESSION pglz); +ALTER TABLE cmpart ATTACH PARTITION cmpart2 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +ERROR: relation "cmpart" does not exist +INSERT INTO cmpart VALUES (repeat('123456789', 1004)); +ERROR: relation "cmpart" does not exist +LINE 1: INSERT INTO cmpart VALUES (repeat('123456789', 1004)); + ^ +INSERT INTO cmpart VALUES (repeat('123456789', 4004)); +ERROR: relation "cmpart" does not exist +LINE 1: INSERT INTO cmpart VALUES (repeat('123456789', 4004)); + ^ +SELECT pg_column_compression(f1) FROM cmpart1; +ERROR: relation "cmpart1" does not exist +LINE 1: SELECT pg_column_compression(f1) FROM cmpart1; + ^ +SELECT pg_column_compression(f1) FROM cmpart2; + pg_column_compression +----------------------- +(0 rows) + +-- test compression with inheritance, error +CREATE TABLE cminh() INHERITS(cmdata, cmdata1); +ERROR: relation "cmdata1" does not exist +CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); +NOTICE: merging column "f1" with inherited definition +ERROR: column "f1" has a compression method conflict +DETAIL: pglz versus lz4 +-- test default_toast_compression GUC +SET default_toast_compression = ''; +ERROR: invalid value for parameter "default_toast_compression": "" +HINT: Available values: pglz. +SET default_toast_compression = 'I do not exist compression'; +ERROR: invalid value for parameter "default_toast_compression": "I do not exist compression" +HINT: Available values: pglz. +SET default_toast_compression = 'lz4'; +ERROR: invalid value for parameter "default_toast_compression": "lz4" +HINT: Available values: pglz. +SET default_toast_compression = 'pglz'; +-- test alter compression method +ALTER TABLE cmdata ALTER COLUMN f1 SET COMPRESSION lz4; +ERROR: compression method lz4 not supported +DETAIL: This functionality requires the server to be built with lz4 support. +HINT: You need to rebuild PostgreSQL using --with-lz4. +INSERT INTO cmdata VALUES (repeat('123456789', 4004)); +\d+ cmdata + Table "public.cmdata" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+------+-----------+----------+---------+----------+-------------+--------------+------------- + f1 | text | | | | extended | pglz | | +Indexes: + "idx" btree (f1) + +SELECT pg_column_compression(f1) FROM cmdata; + pg_column_compression +----------------------- + pglz + pglz +(2 rows) + +ALTER TABLE cmdata2 ALTER COLUMN f1 SET COMPRESSION default; +\d+ cmdata2 + Table "public.cmdata2" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description +--------+-------------------+-----------+----------+---------+---------+-------------+--------------+------------- + f1 | character varying | | | | plain | | | + +-- test alter compression method for materialized views +ALTER MATERIALIZED VIEW compressmv ALTER COLUMN x SET COMPRESSION lz4; +ERROR: relation "compressmv" does not exist +\d+ compressmv +-- test alter compression method for partitioned tables +ALTER TABLE cmpart1 ALTER COLUMN f1 SET COMPRESSION pglz; +ERROR: relation "cmpart1" does not exist +ALTER TABLE cmpart2 ALTER COLUMN f1 SET COMPRESSION lz4; +ERROR: compression method lz4 not supported +DETAIL: This functionality requires the server to be built with lz4 support. +HINT: You need to rebuild PostgreSQL using --with-lz4. +-- new data should be compressed with the current compression method +INSERT INTO cmpart VALUES (repeat('123456789', 1004)); +ERROR: relation "cmpart" does not exist +LINE 1: INSERT INTO cmpart VALUES (repeat('123456789', 1004)); + ^ +INSERT INTO cmpart VALUES (repeat('123456789', 4004)); +ERROR: relation "cmpart" does not exist +LINE 1: INSERT INTO cmpart VALUES (repeat('123456789', 4004)); + ^ +SELECT pg_column_compression(f1) FROM cmpart1; +ERROR: relation "cmpart1" does not exist +LINE 1: SELECT pg_column_compression(f1) FROM cmpart1; + ^ +SELECT pg_column_compression(f1) FROM cmpart2; + pg_column_compression +----------------------- +(0 rows) + +-- VACUUM FULL does not recompress +SELECT pg_column_compression(f1) FROM cmdata; + pg_column_compression +----------------------- + pglz + pglz +(2 rows) + +VACUUM FULL cmdata; +SELECT pg_column_compression(f1) FROM cmdata; + pg_column_compression +----------------------- + pglz + pglz +(2 rows) + +-- test expression index +DROP TABLE cmdata2; +CREATE TABLE cmdata2 (f1 TEXT COMPRESSION pglz, f2 TEXT COMPRESSION lz4); +ERROR: compression method lz4 not supported +DETAIL: This functionality requires the server to be built with lz4 support. +HINT: You need to rebuild PostgreSQL using --with-lz4. +CREATE UNIQUE INDEX idx1 ON cmdata2 ((f1 || f2)); +ERROR: relation "cmdata2" does not exist +INSERT INTO cmdata2 VALUES((SELECT array_agg(md5(g::TEXT))::TEXT FROM +generate_series(1, 50) g), VERSION()); +ERROR: relation "cmdata2" does not exist +LINE 1: INSERT INTO cmdata2 VALUES((SELECT array_agg(md5(g::TEXT))::... + ^ +-- check data is ok +SELECT length(f1) FROM cmdata; + length +-------- + 10000 + 36036 +(2 rows) + +SELECT length(f1) FROM cmdata1; +ERROR: relation "cmdata1" does not exist +LINE 1: SELECT length(f1) FROM cmdata1; + ^ +SELECT length(f1) FROM cmmove1; + length +-------- + 10000 +(1 row) + +SELECT length(f1) FROM cmmove2; + length +-------- + 10040 +(1 row) + +SELECT length(f1) FROM cmmove3; + length +-------- + 10000 +(1 row) + +CREATE TABLE badcompresstbl (a text COMPRESSION I_Do_Not_Exist_Compression); -- fails +ERROR: invalid compression method "i_do_not_exist_compression" +CREATE TABLE badcompresstbl (a text); +ALTER TABLE badcompresstbl ALTER a SET COMPRESSION I_Do_Not_Exist_Compression; -- fails +ERROR: invalid compression method "i_do_not_exist_compression" +DROP TABLE badcompresstbl; +\set HIDE_TOAST_COMPRESSION true diff --git a/src/test/singlenode_regress/expected/conversion.out b/src/test/singlenode_regress/expected/conversion.out new file mode 100644 index 00000000000..04fdcba4964 --- /dev/null +++ b/src/test/singlenode_regress/expected/conversion.out @@ -0,0 +1,558 @@ +-- +-- create user defined conversion +-- +CREATE USER regress_conversion_user WITH NOCREATEDB NOCREATEROLE; +SET SESSION AUTHORIZATION regress_conversion_user; +CREATE CONVERSION myconv FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +-- +-- cannot make same name conversion in same schema +-- +CREATE CONVERSION myconv FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +ERROR: conversion "myconv" already exists +-- +-- create default conversion with qualified name +-- +CREATE DEFAULT CONVERSION public.mydef FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +-- +-- cannot make default conversion with same schema/for_encoding/to_encoding +-- +CREATE DEFAULT CONVERSION public.mydef2 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +ERROR: default conversion for LATIN1 to UTF8 already exists +-- test comments +COMMENT ON CONVERSION myconv_bad IS 'foo'; +ERROR: conversion "myconv_bad" does not exist +COMMENT ON CONVERSION myconv IS 'bar'; +COMMENT ON CONVERSION myconv IS NULL; +-- +-- drop user defined conversion +-- +DROP CONVERSION myconv; +DROP CONVERSION mydef; +-- +-- Note: the built-in conversions are exercised in opr_sanity.sql, +-- so there's no need to do that here. +-- +-- +-- return to the super user +-- +RESET SESSION AUTHORIZATION; +DROP USER regress_conversion_user; +-- +-- Test built-in conversion functions. +-- +-- Helper function to test a conversion. Uses the test_enc_conversion function +-- that was created in the create_function_0 test. +create or replace function test_conv( + input IN bytea, + src_encoding IN text, + dst_encoding IN text, + result OUT bytea, + errorat OUT bytea, + error OUT text) +language plpgsql as +$$ +declare + validlen int; +begin + -- First try to perform the conversion with noError = false. If that errors out, + -- capture the error message, and try again with noError = true. The second call + -- should succeed and return the position of the error, return that too. + begin + select * into validlen, result from test_enc_conversion(input, src_encoding, dst_encoding, false); + errorat = NULL; + error := NULL; + exception when others then + error := sqlerrm; + select * into validlen, result from test_enc_conversion(input, src_encoding, dst_encoding, true); + errorat = substr(input, validlen + 1); + end; + return; +end; +$$; +-- +-- UTF-8 +-- +CREATE TABLE utf8_inputs (inbytes bytea, description text); +insert into utf8_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\xc3a4c3b6', 'valid, extra latin chars'), + ('\xd184d0bed0be', 'valid, cyrillic'), + ('\x666f6fe8b1a1', 'valid, kanji/Chinese'), + ('\xe382abe3829a', 'valid, two chars that combine to one in EUC_JIS_2004'), + ('\xe382ab', 'only first half of combined char in EUC_JIS_2004'), + ('\xe382abe382', 'incomplete combination when converted EUC_JIS_2004'), + ('\xecbd94eb81bceba6ac', 'valid, Hangul, Korean'), + ('\x666f6fefa8aa', 'valid, needs mapping function to convert to GB18030'), + ('\x66e8b1ff6f6f', 'invalid byte sequence'), + ('\x66006f', 'invalid, NUL byte'), + ('\x666f6fe8b100', 'invalid, NUL byte'), + ('\x666f6fe8b1', 'incomplete character at end'); +-- Test UTF-8 verification +select description, (test_conv(inbytes, 'utf8', 'utf8')).* from utf8_inputs; + description | result | errorat | error +------------------------------------------------------+----------------------+--------------+----------------------------------------------------------- + valid, pure ASCII | \x666f6f | | + valid, extra latin chars | \xc3a4c3b6 | | + valid, cyrillic | \xd184d0bed0be | | + valid, kanji/Chinese | \x666f6fe8b1a1 | | + valid, two chars that combine to one in EUC_JIS_2004 | \xe382abe3829a | | + only first half of combined char in EUC_JIS_2004 | \xe382ab | | + incomplete combination when converted EUC_JIS_2004 | \xe382ab | \xe382 | invalid byte sequence for encoding "UTF8": 0xe3 0x82 + valid, Hangul, Korean | \xecbd94eb81bceba6ac | | + valid, needs mapping function to convert to GB18030 | \x666f6fefa8aa | | + invalid byte sequence | \x66 | \xe8b1ff6f6f | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0xff + invalid, NUL byte | \x66 | \x006f | invalid byte sequence for encoding "UTF8": 0x00 + invalid, NUL byte | \x666f6f | \xe8b100 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0x00 + incomplete character at end | \x666f6f | \xe8b1 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 +(13 rows) + +-- Test conversions from UTF-8 +select description, inbytes, (test_conv(inbytes, 'utf8', 'euc_jis_2004')).* from utf8_inputs; + description | inbytes | result | errorat | error +------------------------------------------------------+----------------------+----------------+----------------------+------------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid, extra latin chars | \xc3a4c3b6 | \xa9daa9ec | | + valid, cyrillic | \xd184d0bed0be | \xa7e6a7e0a7e0 | | + valid, kanji/Chinese | \x666f6fe8b1a1 | \x666f6fbedd | | + valid, two chars that combine to one in EUC_JIS_2004 | \xe382abe3829a | \xa5f7 | | + only first half of combined char in EUC_JIS_2004 | \xe382ab | \xa5ab | | + incomplete combination when converted EUC_JIS_2004 | \xe382abe382 | \x | \xe382abe382 | invalid byte sequence for encoding "UTF8": 0xe3 0x82 + valid, Hangul, Korean | \xecbd94eb81bceba6ac | \x | \xecbd94eb81bceba6ac | character with byte sequence 0xec 0xbd 0x94 in encoding "UTF8" has no equivalent in encoding "EUC_JIS_2004" + valid, needs mapping function to convert to GB18030 | \x666f6fefa8aa | \x666f6f | \xefa8aa | character with byte sequence 0xef 0xa8 0xaa in encoding "UTF8" has no equivalent in encoding "EUC_JIS_2004" + invalid byte sequence | \x66e8b1ff6f6f | \x66 | \xe8b1ff6f6f | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0xff + invalid, NUL byte | \x66006f | \x66 | \x006f | invalid byte sequence for encoding "UTF8": 0x00 + invalid, NUL byte | \x666f6fe8b100 | \x666f6f | \xe8b100 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0x00 + incomplete character at end | \x666f6fe8b1 | \x666f6f | \xe8b1 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 +(13 rows) + +select description, inbytes, (test_conv(inbytes, 'utf8', 'latin1')).* from utf8_inputs; + description | inbytes | result | errorat | error +------------------------------------------------------+----------------------+----------+----------------------+------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid, extra latin chars | \xc3a4c3b6 | \xe4f6 | | + valid, cyrillic | \xd184d0bed0be | \x | \xd184d0bed0be | character with byte sequence 0xd1 0x84 in encoding "UTF8" has no equivalent in encoding "LATIN1" + valid, kanji/Chinese | \x666f6fe8b1a1 | \x666f6f | \xe8b1a1 | character with byte sequence 0xe8 0xb1 0xa1 in encoding "UTF8" has no equivalent in encoding "LATIN1" + valid, two chars that combine to one in EUC_JIS_2004 | \xe382abe3829a | \x | \xe382abe3829a | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN1" + only first half of combined char in EUC_JIS_2004 | \xe382ab | \x | \xe382ab | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN1" + incomplete combination when converted EUC_JIS_2004 | \xe382abe382 | \x | \xe382abe382 | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN1" + valid, Hangul, Korean | \xecbd94eb81bceba6ac | \x | \xecbd94eb81bceba6ac | character with byte sequence 0xec 0xbd 0x94 in encoding "UTF8" has no equivalent in encoding "LATIN1" + valid, needs mapping function to convert to GB18030 | \x666f6fefa8aa | \x666f6f | \xefa8aa | character with byte sequence 0xef 0xa8 0xaa in encoding "UTF8" has no equivalent in encoding "LATIN1" + invalid byte sequence | \x66e8b1ff6f6f | \x66 | \xe8b1ff6f6f | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0xff + invalid, NUL byte | \x66006f | \x66 | \x006f | invalid byte sequence for encoding "UTF8": 0x00 + invalid, NUL byte | \x666f6fe8b100 | \x666f6f | \xe8b100 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0x00 + incomplete character at end | \x666f6fe8b1 | \x666f6f | \xe8b1 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 +(13 rows) + +select description, inbytes, (test_conv(inbytes, 'utf8', 'latin2')).* from utf8_inputs; + description | inbytes | result | errorat | error +------------------------------------------------------+----------------------+----------+----------------------+------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid, extra latin chars | \xc3a4c3b6 | \xe4f6 | | + valid, cyrillic | \xd184d0bed0be | \x | \xd184d0bed0be | character with byte sequence 0xd1 0x84 in encoding "UTF8" has no equivalent in encoding "LATIN2" + valid, kanji/Chinese | \x666f6fe8b1a1 | \x666f6f | \xe8b1a1 | character with byte sequence 0xe8 0xb1 0xa1 in encoding "UTF8" has no equivalent in encoding "LATIN2" + valid, two chars that combine to one in EUC_JIS_2004 | \xe382abe3829a | \x | \xe382abe3829a | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN2" + only first half of combined char in EUC_JIS_2004 | \xe382ab | \x | \xe382ab | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN2" + incomplete combination when converted EUC_JIS_2004 | \xe382abe382 | \x | \xe382abe382 | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN2" + valid, Hangul, Korean | \xecbd94eb81bceba6ac | \x | \xecbd94eb81bceba6ac | character with byte sequence 0xec 0xbd 0x94 in encoding "UTF8" has no equivalent in encoding "LATIN2" + valid, needs mapping function to convert to GB18030 | \x666f6fefa8aa | \x666f6f | \xefa8aa | character with byte sequence 0xef 0xa8 0xaa in encoding "UTF8" has no equivalent in encoding "LATIN2" + invalid byte sequence | \x66e8b1ff6f6f | \x66 | \xe8b1ff6f6f | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0xff + invalid, NUL byte | \x66006f | \x66 | \x006f | invalid byte sequence for encoding "UTF8": 0x00 + invalid, NUL byte | \x666f6fe8b100 | \x666f6f | \xe8b100 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0x00 + incomplete character at end | \x666f6fe8b1 | \x666f6f | \xe8b1 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 +(13 rows) + +select description, inbytes, (test_conv(inbytes, 'utf8', 'latin5')).* from utf8_inputs; + description | inbytes | result | errorat | error +------------------------------------------------------+----------------------+----------+----------------------+------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid, extra latin chars | \xc3a4c3b6 | \xe4f6 | | + valid, cyrillic | \xd184d0bed0be | \x | \xd184d0bed0be | character with byte sequence 0xd1 0x84 in encoding "UTF8" has no equivalent in encoding "LATIN5" + valid, kanji/Chinese | \x666f6fe8b1a1 | \x666f6f | \xe8b1a1 | character with byte sequence 0xe8 0xb1 0xa1 in encoding "UTF8" has no equivalent in encoding "LATIN5" + valid, two chars that combine to one in EUC_JIS_2004 | \xe382abe3829a | \x | \xe382abe3829a | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN5" + only first half of combined char in EUC_JIS_2004 | \xe382ab | \x | \xe382ab | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN5" + incomplete combination when converted EUC_JIS_2004 | \xe382abe382 | \x | \xe382abe382 | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "LATIN5" + valid, Hangul, Korean | \xecbd94eb81bceba6ac | \x | \xecbd94eb81bceba6ac | character with byte sequence 0xec 0xbd 0x94 in encoding "UTF8" has no equivalent in encoding "LATIN5" + valid, needs mapping function to convert to GB18030 | \x666f6fefa8aa | \x666f6f | \xefa8aa | character with byte sequence 0xef 0xa8 0xaa in encoding "UTF8" has no equivalent in encoding "LATIN5" + invalid byte sequence | \x66e8b1ff6f6f | \x66 | \xe8b1ff6f6f | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0xff + invalid, NUL byte | \x66006f | \x66 | \x006f | invalid byte sequence for encoding "UTF8": 0x00 + invalid, NUL byte | \x666f6fe8b100 | \x666f6f | \xe8b100 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0x00 + incomplete character at end | \x666f6fe8b1 | \x666f6f | \xe8b1 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 +(13 rows) + +select description, inbytes, (test_conv(inbytes, 'utf8', 'koi8r')).* from utf8_inputs; + description | inbytes | result | errorat | error +------------------------------------------------------+----------------------+----------+----------------------+------------------------------------------------------------------------------------------------------ + valid, pure ASCII | \x666f6f | \x666f6f | | + valid, extra latin chars | \xc3a4c3b6 | \x | \xc3a4c3b6 | character with byte sequence 0xc3 0xa4 in encoding "UTF8" has no equivalent in encoding "KOI8R" + valid, cyrillic | \xd184d0bed0be | \xc6cfcf | | + valid, kanji/Chinese | \x666f6fe8b1a1 | \x666f6f | \xe8b1a1 | character with byte sequence 0xe8 0xb1 0xa1 in encoding "UTF8" has no equivalent in encoding "KOI8R" + valid, two chars that combine to one in EUC_JIS_2004 | \xe382abe3829a | \x | \xe382abe3829a | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "KOI8R" + only first half of combined char in EUC_JIS_2004 | \xe382ab | \x | \xe382ab | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "KOI8R" + incomplete combination when converted EUC_JIS_2004 | \xe382abe382 | \x | \xe382abe382 | character with byte sequence 0xe3 0x82 0xab in encoding "UTF8" has no equivalent in encoding "KOI8R" + valid, Hangul, Korean | \xecbd94eb81bceba6ac | \x | \xecbd94eb81bceba6ac | character with byte sequence 0xec 0xbd 0x94 in encoding "UTF8" has no equivalent in encoding "KOI8R" + valid, needs mapping function to convert to GB18030 | \x666f6fefa8aa | \x666f6f | \xefa8aa | character with byte sequence 0xef 0xa8 0xaa in encoding "UTF8" has no equivalent in encoding "KOI8R" + invalid byte sequence | \x66e8b1ff6f6f | \x66 | \xe8b1ff6f6f | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0xff + invalid, NUL byte | \x66006f | \x66 | \x006f | invalid byte sequence for encoding "UTF8": 0x00 + invalid, NUL byte | \x666f6fe8b100 | \x666f6f | \xe8b100 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0x00 + incomplete character at end | \x666f6fe8b1 | \x666f6f | \xe8b1 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 +(13 rows) + +select description, inbytes, (test_conv(inbytes, 'utf8', 'gb18030')).* from utf8_inputs; + description | inbytes | result | errorat | error +------------------------------------------------------+----------------------+----------------------------+--------------+----------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid, extra latin chars | \xc3a4c3b6 | \x81308a3181308b32 | | + valid, cyrillic | \xd184d0bed0be | \xa7e6a7e0a7e0 | | + valid, kanji/Chinese | \x666f6fe8b1a1 | \x666f6fcff3 | | + valid, two chars that combine to one in EUC_JIS_2004 | \xe382abe3829a | \xa5ab8139a732 | | + only first half of combined char in EUC_JIS_2004 | \xe382ab | \xa5ab | | + incomplete combination when converted EUC_JIS_2004 | \xe382abe382 | \xa5ab | \xe382 | invalid byte sequence for encoding "UTF8": 0xe3 0x82 + valid, Hangul, Korean | \xecbd94eb81bceba6ac | \x8334e5398238c4338330b335 | | + valid, needs mapping function to convert to GB18030 | \x666f6fefa8aa | \x666f6f84309c38 | | + invalid byte sequence | \x66e8b1ff6f6f | \x66 | \xe8b1ff6f6f | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0xff + invalid, NUL byte | \x66006f | \x66 | \x006f | invalid byte sequence for encoding "UTF8": 0x00 + invalid, NUL byte | \x666f6fe8b100 | \x666f6f | \xe8b100 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 0x00 + incomplete character at end | \x666f6fe8b1 | \x666f6f | \xe8b1 | invalid byte sequence for encoding "UTF8": 0xe8 0xb1 +(13 rows) + +-- +-- EUC_JIS_2004 +-- +CREATE TABLE euc_jis_2004_inputs (inbytes bytea, description text); +insert into euc_jis_2004_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x666f6fbedd', 'valid'), + ('\xa5f7', 'valid, translates to two UTF-8 chars '), + ('\xbeddbe', 'incomplete char '), + ('\x666f6f00bedd', 'invalid, NUL byte'), + ('\x666f6fbe00dd', 'invalid, NUL byte'), + ('\x666f6fbedd00', 'invalid, NUL byte'), + ('\xbe04', 'invalid byte sequence'); +-- Test EUC_JIS_2004 verification +select description, inbytes, (test_conv(inbytes, 'euc_jis_2004', 'euc_jis_2004')).* from euc_jis_2004_inputs; + description | inbytes | result | errorat | error +---------------------------------------+----------------+--------------+----------+-------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6fbedd | \x666f6fbedd | | + valid, translates to two UTF-8 chars | \xa5f7 | \xa5f7 | | + incomplete char | \xbeddbe | \xbedd | \xbe | invalid byte sequence for encoding "EUC_JIS_2004": 0xbe + invalid, NUL byte | \x666f6f00bedd | \x666f6f | \x00bedd | invalid byte sequence for encoding "EUC_JIS_2004": 0x00 + invalid, NUL byte | \x666f6fbe00dd | \x666f6f | \xbe00dd | invalid byte sequence for encoding "EUC_JIS_2004": 0xbe 0x00 + invalid, NUL byte | \x666f6fbedd00 | \x666f6fbedd | \x00 | invalid byte sequence for encoding "EUC_JIS_2004": 0x00 + invalid byte sequence | \xbe04 | \x | \xbe04 | invalid byte sequence for encoding "EUC_JIS_2004": 0xbe 0x04 +(8 rows) + +-- Test conversions from EUC_JIS_2004 +select description, inbytes, (test_conv(inbytes, 'euc_jis_2004', 'utf8')).* from euc_jis_2004_inputs; + description | inbytes | result | errorat | error +---------------------------------------+----------------+----------------+----------+-------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6fbedd | \x666f6fe8b1a1 | | + valid, translates to two UTF-8 chars | \xa5f7 | \xe382abe3829a | | + incomplete char | \xbeddbe | \xe8b1a1 | \xbe | invalid byte sequence for encoding "EUC_JIS_2004": 0xbe + invalid, NUL byte | \x666f6f00bedd | \x666f6f | \x00bedd | invalid byte sequence for encoding "EUC_JIS_2004": 0x00 + invalid, NUL byte | \x666f6fbe00dd | \x666f6f | \xbe00dd | invalid byte sequence for encoding "EUC_JIS_2004": 0xbe 0x00 + invalid, NUL byte | \x666f6fbedd00 | \x666f6fe8b1a1 | \x00 | invalid byte sequence for encoding "EUC_JIS_2004": 0x00 + invalid byte sequence | \xbe04 | \x | \xbe04 | invalid byte sequence for encoding "EUC_JIS_2004": 0xbe 0x04 +(8 rows) + +-- +-- SHIFT-JIS-2004 +-- +CREATE TABLE shiftjis2004_inputs (inbytes bytea, description text); +insert into shiftjis2004_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x666f6f8fdb', 'valid'), + ('\x666f6f81c0', 'valid, no translation to UTF-8'), + ('\x666f6f82f5', 'valid, translates to two UTF-8 chars '), + ('\x666f6f8fdb8f', 'incomplete char '), + ('\x666f6f820a', 'incomplete char, followed by newline '), + ('\x666f6f008fdb', 'invalid, NUL byte'), + ('\x666f6f8f00db', 'invalid, NUL byte'), + ('\x666f6f8fdb00', 'invalid, NUL byte'); +-- Test SHIFT-JIS-2004 verification +select description, inbytes, (test_conv(inbytes, 'shiftjis2004', 'shiftjis2004')).* from shiftjis2004_inputs; + description | inbytes | result | errorat | error +---------------------------------------+----------------+--------------+----------+---------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6f8fdb | \x666f6f8fdb | | + valid, no translation to UTF-8 | \x666f6f81c0 | \x666f6f81c0 | | + valid, translates to two UTF-8 chars | \x666f6f82f5 | \x666f6f82f5 | | + incomplete char | \x666f6f8fdb8f | \x666f6f8fdb | \x8f | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x8f + incomplete char, followed by newline | \x666f6f820a | \x666f6f | \x820a | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x82 0x0a + invalid, NUL byte | \x666f6f008fdb | \x666f6f | \x008fdb | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x00 + invalid, NUL byte | \x666f6f8f00db | \x666f6f | \x8f00db | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x8f 0x00 + invalid, NUL byte | \x666f6f8fdb00 | \x666f6f8fdb | \x00 | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x00 +(9 rows) + +-- Test conversions from SHIFT-JIS-2004 +select description, inbytes, (test_conv(inbytes, 'shiftjis2004', 'utf8')).* from shiftjis2004_inputs; + description | inbytes | result | errorat | error +---------------------------------------+----------------+----------------------+----------+---------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6f8fdb | \x666f6fe8b1a1 | | + valid, no translation to UTF-8 | \x666f6f81c0 | \x666f6fe28a84 | | + valid, translates to two UTF-8 chars | \x666f6f82f5 | \x666f6fe3818be3829a | | + incomplete char | \x666f6f8fdb8f | \x666f6fe8b1a1 | \x8f | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x8f + incomplete char, followed by newline | \x666f6f820a | \x666f6f | \x820a | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x82 0x0a + invalid, NUL byte | \x666f6f008fdb | \x666f6f | \x008fdb | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x00 + invalid, NUL byte | \x666f6f8f00db | \x666f6f | \x8f00db | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x8f 0x00 + invalid, NUL byte | \x666f6f8fdb00 | \x666f6fe8b1a1 | \x00 | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x00 +(9 rows) + +select description, inbytes, (test_conv(inbytes, 'shiftjis2004', 'euc_jis_2004')).* from shiftjis2004_inputs; + description | inbytes | result | errorat | error +---------------------------------------+----------------+--------------+----------+---------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6f8fdb | \x666f6fbedd | | + valid, no translation to UTF-8 | \x666f6f81c0 | \x666f6fa2c2 | | + valid, translates to two UTF-8 chars | \x666f6f82f5 | \x666f6fa4f7 | | + incomplete char | \x666f6f8fdb8f | \x666f6fbedd | \x8f | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x8f + incomplete char, followed by newline | \x666f6f820a | \x666f6f | \x820a | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x82 0x0a + invalid, NUL byte | \x666f6f008fdb | \x666f6f | \x008fdb | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x00 + invalid, NUL byte | \x666f6f8f00db | \x666f6f | \x8f00db | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x8f 0x00 + invalid, NUL byte | \x666f6f8fdb00 | \x666f6fbedd | \x00 | invalid byte sequence for encoding "SHIFT_JIS_2004": 0x00 +(9 rows) + +-- +-- GB18030 +-- +CREATE TABLE gb18030_inputs (inbytes bytea, description text); +insert into gb18030_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x666f6fcff3', 'valid'), + ('\x666f6f8431a530', 'valid, no translation to UTF-8'), + ('\x666f6f84309c38', 'valid, translates to UTF-8 by mapping function'), + ('\x666f6f84309c', 'incomplete char '), + ('\x666f6f84309c0a', 'incomplete char, followed by newline '), + ('\x666f6f84309c3800', 'invalid, NUL byte'), + ('\x666f6f84309c0038', 'invalid, NUL byte'); +-- Test GB18030 verification +select description, inbytes, (test_conv(inbytes, 'gb18030', 'gb18030')).* from gb18030_inputs; + description | inbytes | result | errorat | error +------------------------------------------------+--------------------+------------------+--------------+------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6fcff3 | \x666f6fcff3 | | + valid, no translation to UTF-8 | \x666f6f8431a530 | \x666f6f8431a530 | | + valid, translates to UTF-8 by mapping function | \x666f6f84309c38 | \x666f6f84309c38 | | + incomplete char | \x666f6f84309c | \x666f6f | \x84309c | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c + incomplete char, followed by newline | \x666f6f84309c0a | \x666f6f | \x84309c0a | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c 0x0a + invalid, NUL byte | \x666f6f84309c3800 | \x666f6f84309c38 | \x00 | invalid byte sequence for encoding "GB18030": 0x00 + invalid, NUL byte | \x666f6f84309c0038 | \x666f6f | \x84309c0038 | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c 0x00 +(8 rows) + +-- Test conversions from GB18030 +select description, inbytes, (test_conv(inbytes, 'gb18030', 'utf8')).* from gb18030_inputs; + description | inbytes | result | errorat | error +------------------------------------------------+--------------------+----------------+--------------+------------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6fcff3 | \x666f6fe8b1a1 | | + valid, no translation to UTF-8 | \x666f6f8431a530 | \x666f6f | \x8431a530 | character with byte sequence 0x84 0x31 0xa5 0x30 in encoding "GB18030" has no equivalent in encoding "UTF8" + valid, translates to UTF-8 by mapping function | \x666f6f84309c38 | \x666f6fefa8aa | | + incomplete char | \x666f6f84309c | \x666f6f | \x84309c | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c + incomplete char, followed by newline | \x666f6f84309c0a | \x666f6f | \x84309c0a | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c 0x0a + invalid, NUL byte | \x666f6f84309c3800 | \x666f6fefa8aa | \x00 | invalid byte sequence for encoding "GB18030": 0x00 + invalid, NUL byte | \x666f6f84309c0038 | \x666f6f | \x84309c0038 | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c 0x00 +(8 rows) + +-- +-- ISO-8859-5 +-- +CREATE TABLE iso8859_5_inputs (inbytes bytea, description text); +insert into iso8859_5_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\xe4dede', 'valid'), + ('\x00', 'invalid, NUL byte'), + ('\xe400dede', 'invalid, NUL byte'), + ('\xe4dede00', 'invalid, NUL byte'); +-- Test ISO-8859-5 verification +select description, inbytes, (test_conv(inbytes, 'iso8859-5', 'iso8859-5')).* from iso8859_5_inputs; + description | inbytes | result | errorat | error +-------------------+------------+----------+----------+------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \xe4dede | \xe4dede | | + invalid, NUL byte | \x00 | \x | \x00 | invalid byte sequence for encoding "ISO_8859_5": 0x00 + invalid, NUL byte | \xe400dede | \xe4 | \x00dede | invalid byte sequence for encoding "ISO_8859_5": 0x00 + invalid, NUL byte | \xe4dede00 | \xe4dede | \x00 | invalid byte sequence for encoding "ISO_8859_5": 0x00 +(5 rows) + +-- Test conversions from ISO-8859-5 +select description, inbytes, (test_conv(inbytes, 'iso8859-5', 'utf8')).* from iso8859_5_inputs; + description | inbytes | result | errorat | error +-------------------+------------+----------------+----------+------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \xe4dede | \xd184d0bed0be | | + invalid, NUL byte | \x00 | \x | \x00 | invalid byte sequence for encoding "ISO_8859_5": 0x00 + invalid, NUL byte | \xe400dede | \xd184 | \x00dede | invalid byte sequence for encoding "ISO_8859_5": 0x00 + invalid, NUL byte | \xe4dede00 | \xd184d0bed0be | \x00 | invalid byte sequence for encoding "ISO_8859_5": 0x00 +(5 rows) + +select description, inbytes, (test_conv(inbytes, 'iso8859-5', 'koi8r')).* from iso8859_5_inputs; + description | inbytes | result | errorat | error +-------------------+------------+----------+----------+------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \xe4dede | \xc6cfcf | | + invalid, NUL byte | \x00 | \x | \x00 | invalid byte sequence for encoding "ISO_8859_5": 0x00 + invalid, NUL byte | \xe400dede | \xc6 | \x00dede | invalid byte sequence for encoding "ISO_8859_5": 0x00 + invalid, NUL byte | \xe4dede00 | \xc6cfcf | \x00 | invalid byte sequence for encoding "ISO_8859_5": 0x00 +(5 rows) + +select description, inbytes, (test_conv(inbytes, 'iso8859_5', 'mule_internal')).* from iso8859_5_inputs; + description | inbytes | result | errorat | error +-------------------+------------+----------------+----------+------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \xe4dede | \x8bc68bcf8bcf | | + invalid, NUL byte | \x00 | \x | \x00 | invalid byte sequence for encoding "ISO_8859_5": 0x00 + invalid, NUL byte | \xe400dede | \x8bc6 | \x00dede | invalid byte sequence for encoding "ISO_8859_5": 0x00 + invalid, NUL byte | \xe4dede00 | \x8bc68bcf8bcf | \x00 | invalid byte sequence for encoding "ISO_8859_5": 0x00 +(5 rows) + +-- +-- Big5 +-- +CREATE TABLE big5_inputs (inbytes bytea, description text); +insert into big5_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x666f6fb648', 'valid'), + ('\x666f6fa27f', 'valid, no translation to UTF-8'), + ('\x666f6fb60048', 'invalid, NUL byte'), + ('\x666f6fb64800', 'invalid, NUL byte'); +-- Test Big5 verification +select description, inbytes, (test_conv(inbytes, 'big5', 'big5')).* from big5_inputs; + description | inbytes | result | errorat | error +--------------------------------+----------------+--------------+----------+------------------------------------------------------ + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6fb648 | \x666f6fb648 | | + valid, no translation to UTF-8 | \x666f6fa27f | \x666f6fa27f | | + invalid, NUL byte | \x666f6fb60048 | \x666f6f | \xb60048 | invalid byte sequence for encoding "BIG5": 0xb6 0x00 + invalid, NUL byte | \x666f6fb64800 | \x666f6fb648 | \x00 | invalid byte sequence for encoding "BIG5": 0x00 +(5 rows) + +-- Test conversions from Big5 +select description, inbytes, (test_conv(inbytes, 'big5', 'utf8')).* from big5_inputs; + description | inbytes | result | errorat | error +--------------------------------+----------------+----------------+----------+------------------------------------------------------------------------------------------------ + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6fb648 | \x666f6fe8b1a1 | | + valid, no translation to UTF-8 | \x666f6fa27f | \x666f6f | \xa27f | character with byte sequence 0xa2 0x7f in encoding "BIG5" has no equivalent in encoding "UTF8" + invalid, NUL byte | \x666f6fb60048 | \x666f6f | \xb60048 | invalid byte sequence for encoding "BIG5": 0xb6 0x00 + invalid, NUL byte | \x666f6fb64800 | \x666f6fe8b1a1 | \x00 | invalid byte sequence for encoding "BIG5": 0x00 +(5 rows) + +select description, inbytes, (test_conv(inbytes, 'big5', 'mule_internal')).* from big5_inputs; + description | inbytes | result | errorat | error +--------------------------------+----------------+----------------+----------+------------------------------------------------------ + valid, pure ASCII | \x666f6f | \x666f6f | | + valid | \x666f6fb648 | \x666f6f95e2af | | + valid, no translation to UTF-8 | \x666f6fa27f | \x666f6f95a3c1 | | + invalid, NUL byte | \x666f6fb60048 | \x666f6f | \xb60048 | invalid byte sequence for encoding "BIG5": 0xb6 0x00 + invalid, NUL byte | \x666f6fb64800 | \x666f6f95e2af | \x00 | invalid byte sequence for encoding "BIG5": 0x00 +(5 rows) + +-- +-- MULE_INTERNAL +-- +CREATE TABLE mic_inputs (inbytes bytea, description text); +insert into mic_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x8bc68bcf8bcf', 'valid (in KOI8R)'), + ('\x8bc68bcf8b', 'invalid,incomplete char'), + ('\x92bedd', 'valid (in SHIFT_JIS)'), + ('\x92be', 'invalid, incomplete char)'), + ('\x666f6f95a3c1', 'valid (in Big5)'), + ('\x666f6f95a3', 'invalid, incomplete char'), + ('\x9200bedd', 'invalid, NUL byte'), + ('\x92bedd00', 'invalid, NUL byte'), + ('\x8b00c68bcf8bcf', 'invalid, NUL byte'); +-- Test MULE_INTERNAL verification +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'mule_internal')).* from mic_inputs; + description | inbytes | result | errorat | error +---------------------------+------------------+----------------+------------------+-------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid (in KOI8R) | \x8bc68bcf8bcf | \x8bc68bcf8bcf | | + invalid,incomplete char | \x8bc68bcf8b | \x8bc68bcf | \x8b | invalid byte sequence for encoding "MULE_INTERNAL": 0x8b + valid (in SHIFT_JIS) | \x92bedd | \x92bedd | | + invalid, incomplete char) | \x92be | \x | \x92be | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0xbe + valid (in Big5) | \x666f6f95a3c1 | \x666f6f95a3c1 | | + invalid, incomplete char | \x666f6f95a3 | \x666f6f | \x95a3 | invalid byte sequence for encoding "MULE_INTERNAL": 0x95 0xa3 + invalid, NUL byte | \x9200bedd | \x | \x9200bedd | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0x00 0xbe + invalid, NUL byte | \x92bedd00 | \x92bedd | \x00 | invalid byte sequence for encoding "MULE_INTERNAL": 0x00 + invalid, NUL byte | \x8b00c68bcf8bcf | \x | \x8b00c68bcf8bcf | invalid byte sequence for encoding "MULE_INTERNAL": 0x8b 0x00 +(10 rows) + +-- Test conversions from MULE_INTERNAL +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'koi8r')).* from mic_inputs; + description | inbytes | result | errorat | error +---------------------------+------------------+----------+------------------+--------------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid (in KOI8R) | \x8bc68bcf8bcf | \xc6cfcf | | + invalid,incomplete char | \x8bc68bcf8b | \xc6cf | \x8b | invalid byte sequence for encoding "MULE_INTERNAL": 0x8b + valid (in SHIFT_JIS) | \x92bedd | \x | \x92bedd | character with byte sequence 0x92 0xbe 0xdd in encoding "MULE_INTERNAL" has no equivalent in encoding "KOI8R" + invalid, incomplete char) | \x92be | \x | \x92be | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0xbe + valid (in Big5) | \x666f6f95a3c1 | \x666f6f | \x95a3c1 | character with byte sequence 0x95 0xa3 0xc1 in encoding "MULE_INTERNAL" has no equivalent in encoding "KOI8R" + invalid, incomplete char | \x666f6f95a3 | \x666f6f | \x95a3 | invalid byte sequence for encoding "MULE_INTERNAL": 0x95 0xa3 + invalid, NUL byte | \x9200bedd | \x | \x9200bedd | character with byte sequence 0x92 0x00 0xbe in encoding "MULE_INTERNAL" has no equivalent in encoding "KOI8R" + invalid, NUL byte | \x92bedd00 | \x | \x92bedd00 | character with byte sequence 0x92 0xbe 0xdd in encoding "MULE_INTERNAL" has no equivalent in encoding "KOI8R" + invalid, NUL byte | \x8b00c68bcf8bcf | \x | \x8b00c68bcf8bcf | character with byte sequence 0x8b 0x00 in encoding "MULE_INTERNAL" has no equivalent in encoding "KOI8R" +(10 rows) + +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'iso8859-5')).* from mic_inputs; + description | inbytes | result | errorat | error +---------------------------+------------------+----------+------------------+-------------------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid (in KOI8R) | \x8bc68bcf8bcf | \xe4dede | | + invalid,incomplete char | \x8bc68bcf8b | \xe4de | \x8b | invalid byte sequence for encoding "MULE_INTERNAL": 0x8b + valid (in SHIFT_JIS) | \x92bedd | \x | \x92bedd | character with byte sequence 0x92 0xbe 0xdd in encoding "MULE_INTERNAL" has no equivalent in encoding "ISO_8859_5" + invalid, incomplete char) | \x92be | \x | \x92be | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0xbe + valid (in Big5) | \x666f6f95a3c1 | \x666f6f | \x95a3c1 | character with byte sequence 0x95 0xa3 0xc1 in encoding "MULE_INTERNAL" has no equivalent in encoding "ISO_8859_5" + invalid, incomplete char | \x666f6f95a3 | \x666f6f | \x95a3 | invalid byte sequence for encoding "MULE_INTERNAL": 0x95 0xa3 + invalid, NUL byte | \x9200bedd | \x | \x9200bedd | character with byte sequence 0x92 0x00 0xbe in encoding "MULE_INTERNAL" has no equivalent in encoding "ISO_8859_5" + invalid, NUL byte | \x92bedd00 | \x | \x92bedd00 | character with byte sequence 0x92 0xbe 0xdd in encoding "MULE_INTERNAL" has no equivalent in encoding "ISO_8859_5" + invalid, NUL byte | \x8b00c68bcf8bcf | \x | \x8b00c68bcf8bcf | character with byte sequence 0x8b 0x00 in encoding "MULE_INTERNAL" has no equivalent in encoding "ISO_8859_5" +(10 rows) + +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'sjis')).* from mic_inputs; + description | inbytes | result | errorat | error +---------------------------+------------------+----------+------------------+-------------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid (in KOI8R) | \x8bc68bcf8bcf | \x | \x8bc68bcf8bcf | character with byte sequence 0x8b 0xc6 in encoding "MULE_INTERNAL" has no equivalent in encoding "SJIS" + invalid,incomplete char | \x8bc68bcf8b | \x | \x8bc68bcf8b | character with byte sequence 0x8b 0xc6 in encoding "MULE_INTERNAL" has no equivalent in encoding "SJIS" + valid (in SHIFT_JIS) | \x92bedd | \x8fdb | | + invalid, incomplete char) | \x92be | \x | \x92be | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0xbe + valid (in Big5) | \x666f6f95a3c1 | \x666f6f | \x95a3c1 | character with byte sequence 0x95 0xa3 0xc1 in encoding "MULE_INTERNAL" has no equivalent in encoding "SJIS" + invalid, incomplete char | \x666f6f95a3 | \x666f6f | \x95a3 | invalid byte sequence for encoding "MULE_INTERNAL": 0x95 0xa3 + invalid, NUL byte | \x9200bedd | \x | \x9200bedd | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0x00 0xbe + invalid, NUL byte | \x92bedd00 | \x8fdb | \x00 | invalid byte sequence for encoding "MULE_INTERNAL": 0x00 + invalid, NUL byte | \x8b00c68bcf8bcf | \x | \x8b00c68bcf8bcf | invalid byte sequence for encoding "MULE_INTERNAL": 0x8b 0x00 +(10 rows) + +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'big5')).* from mic_inputs; + description | inbytes | result | errorat | error +---------------------------+------------------+--------------+------------------+-------------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid (in KOI8R) | \x8bc68bcf8bcf | \x | \x8bc68bcf8bcf | character with byte sequence 0x8b 0xc6 in encoding "MULE_INTERNAL" has no equivalent in encoding "BIG5" + invalid,incomplete char | \x8bc68bcf8b | \x | \x8bc68bcf8b | character with byte sequence 0x8b 0xc6 in encoding "MULE_INTERNAL" has no equivalent in encoding "BIG5" + valid (in SHIFT_JIS) | \x92bedd | \x | \x92bedd | character with byte sequence 0x92 0xbe 0xdd in encoding "MULE_INTERNAL" has no equivalent in encoding "BIG5" + invalid, incomplete char) | \x92be | \x | \x92be | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0xbe + valid (in Big5) | \x666f6f95a3c1 | \x666f6fa2a1 | | + invalid, incomplete char | \x666f6f95a3 | \x666f6f | \x95a3 | invalid byte sequence for encoding "MULE_INTERNAL": 0x95 0xa3 + invalid, NUL byte | \x9200bedd | \x | \x9200bedd | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0x00 0xbe + invalid, NUL byte | \x92bedd00 | \x | \x92bedd00 | character with byte sequence 0x92 0xbe 0xdd in encoding "MULE_INTERNAL" has no equivalent in encoding "BIG5" + invalid, NUL byte | \x8b00c68bcf8bcf | \x | \x8b00c68bcf8bcf | invalid byte sequence for encoding "MULE_INTERNAL": 0x8b 0x00 +(10 rows) + +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'euc_jp')).* from mic_inputs; + description | inbytes | result | errorat | error +---------------------------+------------------+----------+------------------+---------------------------------------------------------------------------------------------------------------- + valid, pure ASCII | \x666f6f | \x666f6f | | + valid (in KOI8R) | \x8bc68bcf8bcf | \x | \x8bc68bcf8bcf | character with byte sequence 0x8b 0xc6 in encoding "MULE_INTERNAL" has no equivalent in encoding "EUC_JP" + invalid,incomplete char | \x8bc68bcf8b | \x | \x8bc68bcf8b | character with byte sequence 0x8b 0xc6 in encoding "MULE_INTERNAL" has no equivalent in encoding "EUC_JP" + valid (in SHIFT_JIS) | \x92bedd | \xbedd | | + invalid, incomplete char) | \x92be | \x | \x92be | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0xbe + valid (in Big5) | \x666f6f95a3c1 | \x666f6f | \x95a3c1 | character with byte sequence 0x95 0xa3 0xc1 in encoding "MULE_INTERNAL" has no equivalent in encoding "EUC_JP" + invalid, incomplete char | \x666f6f95a3 | \x666f6f | \x95a3 | invalid byte sequence for encoding "MULE_INTERNAL": 0x95 0xa3 + invalid, NUL byte | \x9200bedd | \x | \x9200bedd | invalid byte sequence for encoding "MULE_INTERNAL": 0x92 0x00 0xbe + invalid, NUL byte | \x92bedd00 | \xbedd | \x00 | invalid byte sequence for encoding "MULE_INTERNAL": 0x00 + invalid, NUL byte | \x8b00c68bcf8bcf | \x | \x8b00c68bcf8bcf | invalid byte sequence for encoding "MULE_INTERNAL": 0x8b 0x00 +(10 rows) + diff --git a/src/test/singlenode_regress/expected/copy2.out b/src/test/singlenode_regress/expected/copy2.out new file mode 100644 index 00000000000..af19d84d744 --- /dev/null +++ b/src/test/singlenode_regress/expected/copy2.out @@ -0,0 +1,681 @@ +CREATE TEMP TABLE x ( + a serial, + b int, + c text not null default 'stuff', + d text, + e text +); +CREATE FUNCTION fn_x_before () RETURNS TRIGGER AS ' + BEGIN + NEW.e := ''before trigger fired''::text; + return NEW; + END; +' LANGUAGE plpgsql; +CREATE FUNCTION fn_x_after () RETURNS TRIGGER AS ' + BEGIN + UPDATE x set e=''after trigger fired'' where c=''stuff''; + return NULL; + END; +' LANGUAGE plpgsql; +CREATE TRIGGER trg_x_after AFTER INSERT ON x +FOR EACH ROW EXECUTE PROCEDURE fn_x_after(); +CREATE TRIGGER trg_x_before BEFORE INSERT ON x +FOR EACH ROW EXECUTE PROCEDURE fn_x_before(); +COPY x (a, b, c, d, e) from stdin; +COPY x (b, d) from stdin; +COPY x (b, d) from stdin; +COPY x (a, b, c, d, e) from stdin; +-- non-existent column in column list: should fail +COPY x (xyz) from stdin; +ERROR: column "xyz" of relation "x" does not exist +-- redundant options +COPY x from stdin (format CSV, FORMAT CSV); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (format CSV, FORMAT CSV); + ^ +COPY x from stdin (freeze off, freeze on); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (freeze off, freeze on); + ^ +COPY x from stdin (delimiter ',', delimiter ','); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (delimiter ',', delimiter ','); + ^ +COPY x from stdin (null ' ', null ' '); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (null ' ', null ' '); + ^ +COPY x from stdin (header off, header on); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (header off, header on); + ^ +COPY x from stdin (quote ':', quote ':'); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (quote ':', quote ':'); + ^ +COPY x from stdin (escape ':', escape ':'); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (escape ':', escape ':'); + ^ +COPY x from stdin (force_quote (a), force_quote *); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (force_quote (a), force_quote *); + ^ +COPY x from stdin (force_not_null (a), force_not_null (b)); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (force_not_null (a), force_not_null (b)); + ^ +COPY x from stdin (force_null (a), force_null (b)); +ERROR: conflicting or redundant options +COPY x from stdin (convert_selectively (a), convert_selectively (b)); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (convert_selectively (a), convert_selectiv... + ^ +COPY x from stdin (encoding 'sql_ascii', encoding 'sql_ascii'); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (encoding 'sql_ascii', encoding 'sql_ascii... + ^ +-- too many columns in column list: should fail +COPY x (a, b, c, d, e, d, c) from stdin; +ERROR: column "d" specified more than once +-- missing data: should fail +COPY x from stdin; +ERROR: invalid input syntax for type integer: "" +CONTEXT: COPY x, line 1, column a: "" +COPY x from stdin; +ERROR: missing data for column "e" +CONTEXT: COPY x, line 1: "2000 230 23 23" +COPY x from stdin; +ERROR: missing data for column "e" +CONTEXT: COPY x, line 1: "2001 231 \N \N" +-- extra data: should fail +COPY x from stdin; +ERROR: extra data after last expected column +CONTEXT: COPY x, line 1: "2002 232 40 50 60 70 80" +-- various COPY options: delimiters, oids, NULL string, encoding +COPY x (b, c, d, e) from stdin delimiter ',' null 'x'; +COPY x from stdin WITH DELIMITER AS ';' NULL AS ''; +COPY x from stdin WITH DELIMITER AS ':' NULL AS E'\\X' ENCODING 'sql_ascii'; +COPY x TO stdout WHERE a = 1; +ERROR: WHERE clause not allowed with COPY TO +LINE 1: COPY x TO stdout WHERE a = 1; + ^ +COPY x from stdin WHERE a = 50004; +COPY x from stdin WHERE a > 60003; +COPY x from stdin WHERE f > 60003; +ERROR: column "f" does not exist +LINE 1: COPY x from stdin WHERE f > 60003; + ^ +COPY x from stdin WHERE a = max(x.b); +ERROR: aggregate functions are not allowed in COPY FROM WHERE conditions +LINE 1: COPY x from stdin WHERE a = max(x.b); + ^ +COPY x from stdin WHERE a IN (SELECT 1 FROM x); +ERROR: cannot use subquery in COPY FROM WHERE condition +LINE 1: COPY x from stdin WHERE a IN (SELECT 1 FROM x); + ^ +COPY x from stdin WHERE a IN (generate_series(1,5)); +ERROR: set-returning functions are not allowed in COPY FROM WHERE conditions +LINE 1: COPY x from stdin WHERE a IN (generate_series(1,5)); + ^ +COPY x from stdin WHERE a = row_number() over(b); +ERROR: window functions are not allowed in COPY FROM WHERE conditions +LINE 1: COPY x from stdin WHERE a = row_number() over(b); + ^ +-- check results of copy in +SELECT * FROM x; + a | b | c | d | e +-------+----+------------+--------+---------------------- + 9999 | | \N | NN | before trigger fired + 10000 | 21 | 31 | 41 | before trigger fired + 10001 | 22 | 32 | 42 | before trigger fired + 10002 | 23 | 33 | 43 | before trigger fired + 10003 | 24 | 34 | 44 | before trigger fired + 10004 | 25 | 35 | 45 | before trigger fired + 10005 | 26 | 36 | 46 | before trigger fired + 6 | | 45 | 80 | before trigger fired + 7 | | x | \x | before trigger fired + 8 | | , | \, | before trigger fired + 3000 | | c | | before trigger fired + 4000 | | C | | before trigger fired + 4001 | 1 | empty | | before trigger fired + 4002 | 2 | null | | before trigger fired + 4003 | 3 | Backslash | \ | before trigger fired + 4004 | 4 | BackslashX | \X | before trigger fired + 4005 | 5 | N | N | before trigger fired + 4006 | 6 | BackslashN | \N | before trigger fired + 4007 | 7 | XX | XX | before trigger fired + 4008 | 8 | Delimiter | : | before trigger fired + 50004 | 25 | 35 | 45 | before trigger fired + 60004 | 25 | 35 | 45 | before trigger fired + 60005 | 26 | 36 | 46 | before trigger fired + 1 | 1 | stuff | test_1 | after trigger fired + 2 | 2 | stuff | test_2 | after trigger fired + 3 | 3 | stuff | test_3 | after trigger fired + 4 | 4 | stuff | test_4 | after trigger fired + 5 | 5 | stuff | test_5 | after trigger fired +(28 rows) + +-- check copy out +COPY x TO stdout; +9999 \N \\N NN before trigger fired +10000 21 31 41 before trigger fired +10001 22 32 42 before trigger fired +10002 23 33 43 before trigger fired +10003 24 34 44 before trigger fired +10004 25 35 45 before trigger fired +10005 26 36 46 before trigger fired +6 \N 45 80 before trigger fired +7 \N x \\x before trigger fired +8 \N , \\, before trigger fired +3000 \N c \N before trigger fired +4000 \N C \N before trigger fired +4001 1 empty before trigger fired +4002 2 null \N before trigger fired +4003 3 Backslash \\ before trigger fired +4004 4 BackslashX \\X before trigger fired +4005 5 N N before trigger fired +4006 6 BackslashN \\N before trigger fired +4007 7 XX XX before trigger fired +4008 8 Delimiter : before trigger fired +50004 25 35 45 before trigger fired +60004 25 35 45 before trigger fired +60005 26 36 46 before trigger fired +1 1 stuff test_1 after trigger fired +2 2 stuff test_2 after trigger fired +3 3 stuff test_3 after trigger fired +4 4 stuff test_4 after trigger fired +5 5 stuff test_5 after trigger fired +COPY x (c, e) TO stdout; +\\N before trigger fired +31 before trigger fired +32 before trigger fired +33 before trigger fired +34 before trigger fired +35 before trigger fired +36 before trigger fired +45 before trigger fired +x before trigger fired +, before trigger fired +c before trigger fired +C before trigger fired +empty before trigger fired +null before trigger fired +Backslash before trigger fired +BackslashX before trigger fired +N before trigger fired +BackslashN before trigger fired +XX before trigger fired +Delimiter before trigger fired +35 before trigger fired +35 before trigger fired +36 before trigger fired +stuff after trigger fired +stuff after trigger fired +stuff after trigger fired +stuff after trigger fired +stuff after trigger fired +COPY x (b, e) TO stdout WITH NULL 'I''m null'; +I'm null before trigger fired +21 before trigger fired +22 before trigger fired +23 before trigger fired +24 before trigger fired +25 before trigger fired +26 before trigger fired +I'm null before trigger fired +I'm null before trigger fired +I'm null before trigger fired +I'm null before trigger fired +I'm null before trigger fired +1 before trigger fired +2 before trigger fired +3 before trigger fired +4 before trigger fired +5 before trigger fired +6 before trigger fired +7 before trigger fired +8 before trigger fired +25 before trigger fired +25 before trigger fired +26 before trigger fired +1 after trigger fired +2 after trigger fired +3 after trigger fired +4 after trigger fired +5 after trigger fired +CREATE TEMP TABLE y ( + col1 text, + col2 text +); +INSERT INTO y VALUES ('Jackson, Sam', E'\\h'); +INSERT INTO y VALUES ('It is "perfect".',E'\t'); +INSERT INTO y VALUES ('', NULL); +COPY y TO stdout WITH CSV; +"Jackson, Sam",\h +"It is ""perfect"".", +"", +COPY y TO stdout WITH CSV QUOTE '''' DELIMITER '|'; +Jackson, Sam|\h +It is "perfect".| +''| +COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\' ENCODING 'sql_ascii'; +"Jackson, Sam","\\h" +"It is \"perfect\"."," " +"", +COPY y TO stdout WITH CSV FORCE QUOTE *; +"Jackson, Sam","\h" +"It is ""perfect""."," " +"", +-- Repeat above tests with new 9.0 option syntax +COPY y TO stdout (FORMAT CSV); +"Jackson, Sam",\h +"It is ""perfect"".", +"", +COPY y TO stdout (FORMAT CSV, QUOTE '''', DELIMITER '|'); +Jackson, Sam|\h +It is "perfect".| +''| +COPY y TO stdout (FORMAT CSV, FORCE_QUOTE (col2), ESCAPE E'\\'); +"Jackson, Sam","\\h" +"It is \"perfect\"."," " +"", +COPY y TO stdout (FORMAT CSV, FORCE_QUOTE *); +"Jackson, Sam","\h" +"It is ""perfect""."," " +"", +\copy y TO stdout (FORMAT CSV) +"Jackson, Sam",\h +"It is ""perfect"".", +"", +\copy y TO stdout (FORMAT CSV, QUOTE '''', DELIMITER '|') +Jackson, Sam|\h +It is "perfect".| +''| +\copy y TO stdout (FORMAT CSV, FORCE_QUOTE (col2), ESCAPE E'\\') +"Jackson, Sam","\\h" +"It is \"perfect\"."," " +"", +\copy y TO stdout (FORMAT CSV, FORCE_QUOTE *) +"Jackson, Sam","\h" +"It is ""perfect""."," " +"", +--test that we read consecutive LFs properly +CREATE TEMP TABLE testnl (a int, b text, c int); +COPY testnl FROM stdin CSV; +-- test end of copy marker +CREATE TEMP TABLE testeoc (a text); +COPY testeoc FROM stdin CSV; +COPY testeoc TO stdout CSV; +a\. +\.b +c\.d +"\." +-- test handling of nonstandard null marker that violates escaping rules +CREATE TEMP TABLE testnull(a int, b text); +INSERT INTO testnull VALUES (1, E'\\0'), (NULL, NULL); +COPY testnull TO stdout WITH NULL AS E'\\0'; +1 \\0 +\0 \0 +COPY testnull FROM stdin WITH NULL AS E'\\0'; +SELECT * FROM testnull; + a | b +----+---- + 1 | \0 + | + 42 | \0 + | +(4 rows) + +BEGIN; +CREATE TABLE vistest (LIKE testeoc); +COPY vistest FROM stdin CSV; +COMMIT; +SELECT * FROM vistest; + a +---- + a0 + b +(2 rows) + +BEGIN; +TRUNCATE vistest; +COPY vistest FROM stdin CSV; +SELECT * FROM vistest; + a +---- + a1 + b +(2 rows) + +SAVEPOINT s1; +TRUNCATE vistest; +COPY vistest FROM stdin CSV; +SELECT * FROM vistest; + a +---- + d1 + e +(2 rows) + +COMMIT; +SELECT * FROM vistest; + a +---- + d1 + e +(2 rows) + +BEGIN; +TRUNCATE vistest; +COPY vistest FROM stdin CSV FREEZE; +SELECT * FROM vistest; + a +---- + a2 + b +(2 rows) + +SAVEPOINT s1; +TRUNCATE vistest; +COPY vistest FROM stdin CSV FREEZE; +SELECT * FROM vistest; + a +---- + d2 + e +(2 rows) + +COMMIT; +SELECT * FROM vistest; + a +---- + d2 + e +(2 rows) + +BEGIN; +TRUNCATE vistest; +COPY vistest FROM stdin CSV FREEZE; +SELECT * FROM vistest; + a +--- + x + y +(2 rows) + +COMMIT; +TRUNCATE vistest; +COPY vistest FROM stdin CSV FREEZE; +ERROR: cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction +BEGIN; +TRUNCATE vistest; +SAVEPOINT s1; +COPY vistest FROM stdin CSV FREEZE; +ERROR: cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction +COMMIT; +BEGIN; +INSERT INTO vistest VALUES ('z'); +SAVEPOINT s1; +TRUNCATE vistest; +ROLLBACK TO SAVEPOINT s1; +COPY vistest FROM stdin CSV FREEZE; +ERROR: cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction +COMMIT; +CREATE FUNCTION truncate_in_subxact() RETURNS VOID AS +$$ +BEGIN + TRUNCATE vistest; +EXCEPTION + WHEN OTHERS THEN + INSERT INTO vistest VALUES ('subxact failure'); +END; +$$ language plpgsql; +BEGIN; +INSERT INTO vistest VALUES ('z'); +SELECT truncate_in_subxact(); + truncate_in_subxact +--------------------- + +(1 row) + +COPY vistest FROM stdin CSV FREEZE; +SELECT * FROM vistest; + a +---- + d4 + e +(2 rows) + +COMMIT; +SELECT * FROM vistest; + a +---- + d4 + e +(2 rows) + +-- Test FORCE_NOT_NULL and FORCE_NULL options +CREATE TEMP TABLE forcetest ( + a INT NOT NULL, + b TEXT NOT NULL, + c TEXT, + d TEXT, + e TEXT +); +\pset null NULL +-- should succeed with no effect ("b" remains an empty string, "c" remains NULL) +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b), FORCE_NULL(c)); +COMMIT; +SELECT b, c FROM forcetest WHERE a = 1; + b | c +---+------ + | NULL +(1 row) + +-- should succeed, FORCE_NULL and FORCE_NOT_NULL can be both specified +BEGIN; +COPY forcetest (a, b, c, d) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(c,d), FORCE_NULL(c,d)); +COMMIT; +SELECT c, d FROM forcetest WHERE a = 2; + c | d +---+------ + | NULL +(1 row) + +-- should fail with not-null constraint violation +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b), FORCE_NOT_NULL(c)); +ERROR: null value in column "b" of relation "forcetest" violates not-null constraint +DETAIL: Failing row contains (3, null, , null, null). +CONTEXT: COPY forcetest, line 1: "3,,""" +ROLLBACK; +-- should fail with "not referenced by COPY" error +BEGIN; +COPY forcetest (d, e) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b)); +ERROR: FORCE_NOT_NULL column "b" not referenced by COPY +ROLLBACK; +-- should fail with "not referenced by COPY" error +BEGIN; +COPY forcetest (d, e) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b)); +ERROR: FORCE_NULL column "b" not referenced by COPY +ROLLBACK; +\pset null '' +-- test case with whole-row Var in a check constraint +create table check_con_tbl (f1 int); +create function check_con_function(check_con_tbl) returns bool as $$ +begin + raise notice 'input = %', row_to_json($1); + return $1.f1 > 0; +end $$ language plpgsql immutable; +alter table check_con_tbl add check (check_con_function(check_con_tbl.*)); +\d+ check_con_tbl + Table "public.check_con_tbl" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + f1 | integer | | | | plain | | +Check constraints: + "check_con_tbl_check" CHECK (check_con_function(check_con_tbl.*)) + +-- GPDB: Change from 1 (value in PG) to 2 for copy to make test deterministic. +-- 2 and null are on seg0 in a 3-seg test environment. +copy check_con_tbl from stdin; +NOTICE: input = {"f1":2} +NOTICE: input = {"f1":null} +copy check_con_tbl from stdin; +NOTICE: input = {"f1":0} +ERROR: new row for relation "check_con_tbl" violates check constraint "check_con_tbl_check" +DETAIL: Failing row contains (0). +CONTEXT: COPY check_con_tbl, line 1: "0" +select * from check_con_tbl; + f1 +---- + 2 + +(2 rows) + +-- test with RLS enabled. +CREATE ROLE regress_rls_copy_user; +CREATE ROLE regress_rls_copy_user_colperms; +CREATE TABLE rls_t1 (a int, b int, c int); +-- GPDB: Change from 1 (value in PG) to 3 for copy to make test deterministic. +-- 2, 3 and 4 are on seg0 in a 3-seg test environment. +COPY rls_t1 (a, b, c) from stdin; +CREATE POLICY p1 ON rls_t1 FOR SELECT USING (a % 2 = 0); +ALTER TABLE rls_t1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_t1 FORCE ROW LEVEL SECURITY; +GRANT SELECT ON TABLE rls_t1 TO regress_rls_copy_user; +GRANT SELECT (a, b) ON TABLE rls_t1 TO regress_rls_copy_user_colperms; +-- all columns +COPY rls_t1 TO stdout; +3 4 1 +2 3 2 +3 2 3 +4 1 4 +COPY rls_t1 (a, b, c) TO stdout; +3 4 1 +2 3 2 +3 2 3 +4 1 4 +-- subset of columns +COPY rls_t1 (a) TO stdout; +3 +2 +3 +4 +COPY rls_t1 (a, b) TO stdout; +3 4 +2 3 +3 2 +4 1 +-- column reordering +COPY rls_t1 (b, a) TO stdout; +4 3 +3 2 +2 3 +1 4 +SET SESSION AUTHORIZATION regress_rls_copy_user; +-- all columns +COPY rls_t1 TO stdout; +2 3 2 +4 1 4 +COPY rls_t1 (a, b, c) TO stdout; +2 3 2 +4 1 4 +-- subset of columns +COPY rls_t1 (a) TO stdout; +2 +4 +COPY rls_t1 (a, b) TO stdout; +2 3 +4 1 +-- column reordering +COPY rls_t1 (b, a) TO stdout; +3 2 +1 4 +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_rls_copy_user_colperms; +-- attempt all columns (should fail) +COPY rls_t1 TO stdout; +ERROR: permission denied for table rls_t1 +COPY rls_t1 (a, b, c) TO stdout; +ERROR: permission denied for table rls_t1 +-- try to copy column with no privileges (should fail) +COPY rls_t1 (c) TO stdout; +ERROR: permission denied for table rls_t1 +-- subset of columns (should succeed) +COPY rls_t1 (a) TO stdout; +2 +4 +COPY rls_t1 (a, b) TO stdout; +2 3 +4 1 +RESET SESSION AUTHORIZATION; +-- test with INSTEAD OF INSERT trigger on a view +-- INSTEAD OF triggers are not supported in Cloudberry +/* + * CREATE TABLE instead_of_insert_tbl(id serial, name text); + * CREATE VIEW instead_of_insert_tbl_view AS SELECT ''::text AS str; + * + * COPY instead_of_insert_tbl_view FROM stdin; -- fail + * test1 + * \. + * + * CREATE FUNCTION fun_instead_of_insert_tbl() RETURNS trigger AS $$ + * BEGIN + * INSERT INTO instead_of_insert_tbl (name) VALUES (NEW.str); + * RETURN NULL; + * END; + * $$ LANGUAGE plpgsql; + * CREATE TRIGGER trig_instead_of_insert_tbl_view + * INSTEAD OF INSERT ON instead_of_insert_tbl_view + * FOR EACH ROW EXECUTE PROCEDURE fun_instead_of_insert_tbl(); + * + * COPY instead_of_insert_tbl_view FROM stdin; + * test1 + * \. + * + * SELECT * FROM instead_of_insert_tbl; + */ +-- Test of COPY optimization with view using INSTEAD OF INSERT +-- trigger when relation is created in the same transaction as +-- when COPY is executed. +-- INSTEAD OF triggers are not supported in Cloudberry +/* + * BEGIN; + * CREATE VIEW instead_of_insert_tbl_view_2 as select ''::text as str; + * CREATE TRIGGER trig_instead_of_insert_tbl_view_2 + * INSTEAD OF INSERT ON instead_of_insert_tbl_view_2 + * FOR EACH ROW EXECUTE PROCEDURE fun_instead_of_insert_tbl(); + * + * COPY instead_of_insert_tbl_view_2 FROM stdin; + * test1 + * \. + * + * SELECT * FROM instead_of_insert_tbl; + * COMMIT; + */ +-- clean up +DROP TABLE forcetest; +DROP TABLE vistest; +DROP FUNCTION truncate_in_subxact(); +DROP TABLE x, y; +DROP TABLE rls_t1 CASCADE; +DROP ROLE regress_rls_copy_user; +DROP ROLE regress_rls_copy_user_colperms; +DROP FUNCTION fn_x_before(); +DROP FUNCTION fn_x_after(); +-- When error reject limit is set, copy should be able to continue after hit a corrupted end-of-copy marker +CREATE TABLE copy_eoc_marker(a int, b int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +COPY copy_eoc_marker FROM stdin LOG ERRORS SEGMENT REJECT LIMIT 5; +NOTICE: found 2 data formatting errors (2 or more input rows), rejected related input data +SELECT * FROM copy_eoc_marker; + a | b +-----+---- + 123 | 20 +(1 row) + +DROP TABLE copy_eoc_marker; diff --git a/src/test/singlenode_regress/expected/copydml.out b/src/test/singlenode_regress/expected/copydml.out new file mode 100644 index 00000000000..b5a225628f4 --- /dev/null +++ b/src/test/singlenode_regress/expected/copydml.out @@ -0,0 +1,112 @@ +-- +-- Test cases for COPY (INSERT/UPDATE/DELETE) TO +-- +create table copydml_test (id serial, t text); +insert into copydml_test (t) values ('a'); +insert into copydml_test (t) values ('b'); +insert into copydml_test (t) values ('c'); +insert into copydml_test (t) values ('d'); +insert into copydml_test (t) values ('e'); +-- +-- Test COPY (insert/update/delete ...) +-- +copy (insert into copydml_test (t) values ('f') returning id) to stdout; +6 +copy (update copydml_test set t = 'g' where t = 'f' returning id) to stdout; +6 +copy (delete from copydml_test where t = 'g' returning id) to stdout; +6 +-- +-- Test \copy (insert/update/delete ...) +-- +\copy (insert into copydml_test (t) values ('f') returning id) to stdout; +7 +\copy (update copydml_test set t = 'g' where t = 'f' returning id) to stdout; +7 +\copy (delete from copydml_test where t = 'g' returning id) to stdout; +7 +-- Error cases +copy (insert into copydml_test default values) to stdout; +ERROR: COPY query must have a RETURNING clause +copy (update copydml_test set t = 'g') to stdout; +ERROR: COPY query must have a RETURNING clause +copy (delete from copydml_test) to stdout; +ERROR: COPY query must have a RETURNING clause +create rule qqq as on insert to copydml_test do instead nothing; +copy (insert into copydml_test default values) to stdout; +ERROR: DO INSTEAD NOTHING rules are not supported for COPY +drop rule qqq on copydml_test; +create rule qqq as on insert to copydml_test do also delete from copydml_test; +copy (insert into copydml_test default values) to stdout; +ERROR: DO ALSO rules are not supported for the COPY +drop rule qqq on copydml_test; +create rule qqq as on insert to copydml_test do instead (delete from copydml_test; delete from copydml_test); +copy (insert into copydml_test default values) to stdout; +ERROR: multi-statement DO INSTEAD rules are not supported for COPY +drop rule qqq on copydml_test; +create rule qqq as on insert to copydml_test where new.t <> 'f' do instead delete from copydml_test; +copy (insert into copydml_test default values) to stdout; +ERROR: conditional DO INSTEAD rules are not supported for COPY +drop rule qqq on copydml_test; +create rule qqq as on update to copydml_test do instead nothing; +copy (update copydml_test set t = 'f') to stdout; +ERROR: DO INSTEAD NOTHING rules are not supported for COPY +drop rule qqq on copydml_test; +create rule qqq as on update to copydml_test do also delete from copydml_test; +copy (update copydml_test set t = 'f') to stdout; +ERROR: DO ALSO rules are not supported for the COPY +drop rule qqq on copydml_test; +create rule qqq as on update to copydml_test do instead (delete from copydml_test; delete from copydml_test); +copy (update copydml_test set t = 'f') to stdout; +ERROR: multi-statement DO INSTEAD rules are not supported for COPY +drop rule qqq on copydml_test; +create rule qqq as on update to copydml_test where new.t <> 'f' do instead delete from copydml_test; +copy (update copydml_test set t = 'f') to stdout; +ERROR: conditional DO INSTEAD rules are not supported for COPY +drop rule qqq on copydml_test; +create rule qqq as on delete to copydml_test do instead nothing; +copy (delete from copydml_test) to stdout; +ERROR: DO INSTEAD NOTHING rules are not supported for COPY +drop rule qqq on copydml_test; +create rule qqq as on delete to copydml_test do also insert into copydml_test default values; +copy (delete from copydml_test) to stdout; +ERROR: DO ALSO rules are not supported for the COPY +drop rule qqq on copydml_test; +create rule qqq as on delete to copydml_test do instead (insert into copydml_test default values; insert into copydml_test default values); +copy (delete from copydml_test) to stdout; +ERROR: multi-statement DO INSTEAD rules are not supported for COPY +drop rule qqq on copydml_test; +create rule qqq as on delete to copydml_test where old.t <> 'f' do instead insert into copydml_test default values; +copy (delete from copydml_test) to stdout; +ERROR: conditional DO INSTEAD rules are not supported for COPY +drop rule qqq on copydml_test; +-- triggers +create function qqq_trig() returns trigger as $$ +begin +if tg_op in ('INSERT', 'UPDATE') then + raise notice '% % %', tg_when, tg_op, new.id; + return new; +else + raise notice '% % %', tg_when, tg_op, old.id; + return old; +end if; +end +$$ language plpgsql; +create trigger qqqbef before insert or update or delete on copydml_test + for each row execute procedure qqq_trig(); +create trigger qqqaf after insert or update or delete on copydml_test + for each row execute procedure qqq_trig(); +copy (insert into copydml_test (t) values ('f') returning id) to stdout; +NOTICE: BEFORE INSERT 8 +8 +NOTICE: AFTER INSERT 8 +copy (update copydml_test set t = 'g' where t = 'f' returning id) to stdout; +NOTICE: BEFORE UPDATE 8 +8 +NOTICE: AFTER UPDATE 8 +copy (delete from copydml_test where t = 'g' returning id) to stdout; +NOTICE: BEFORE DELETE 8 +8 +NOTICE: AFTER DELETE 8 +drop table copydml_test; +drop function qqq_trig(); diff --git a/src/test/singlenode_regress/expected/copyselect.out b/src/test/singlenode_regress/expected/copyselect.out new file mode 100644 index 00000000000..72865fe1ebe --- /dev/null +++ b/src/test/singlenode_regress/expected/copyselect.out @@ -0,0 +1,151 @@ +-- +-- Test cases for COPY (select) TO +-- +create table test1 (id serial, t text); +insert into test1 (t) values ('a'); +insert into test1 (t) values ('b'); +insert into test1 (t) values ('c'); +insert into test1 (t) values ('d'); +insert into test1 (t) values ('e'); +create table test2 (id serial, t text); +insert into test2 (t) values ('A'); +insert into test2 (t) values ('B'); +insert into test2 (t) values ('C'); +insert into test2 (t) values ('D'); +insert into test2 (t) values ('E'); +create view v_test1 +as select 'v_'||t from test1; +-- +-- Test COPY table TO +-- +copy test1 to stdout; +1 a +2 b +3 c +4 d +5 e +-- +-- This should fail +-- +copy v_test1 to stdout; +ERROR: cannot copy from view "v_test1" +HINT: Try the COPY (SELECT ...) TO variant. +-- +-- Test COPY (select) TO +-- +copy (select t from test1 where id=1) to stdout; +a +-- +-- Test COPY (select for update) TO +-- +copy (select t from test1 where id=3 for update) to stdout; +c +-- +-- This should fail +-- +copy (select t into temp test3 from test1 where id=3) to stdout; +ERROR: COPY (SELECT INTO) is not supported +-- +-- This should fail +-- +copy (select * from test1) from stdin; +ERROR: syntax error at or near "from" +LINE 1: copy (select * from test1) from stdin; + ^ +-- +-- This should fail +-- +copy (select * from test1) (t,id) to stdout; +ERROR: syntax error at or near "(" +LINE 1: copy (select * from test1) (t,id) to stdout; + ^ +-- +-- Test JOIN +-- +copy (select * from test1 join test2 using (id)) to stdout; +1 a A +2 b B +3 c C +4 d D +5 e E +-- +-- Test UNION SELECT +-- +copy (select t from test1 where id = 1 UNION select * from v_test1 ORDER BY 1) to stdout; +a +v_a +v_b +v_c +v_d +v_e +-- +-- Test subselect +-- +copy (select * from (select t from test1 where id = 1 UNION select * from v_test1 ORDER BY 1) t1) to stdout; +a +v_a +v_b +v_c +v_d +v_e +-- +-- Test headers, CSV and quotes +-- +copy (select t from test1 where id = 1) to stdout csv header force quote t; +t +"a" +-- +-- Test psql builtins, plain table +-- +\copy test1 to stdout +1 a +2 b +3 c +4 d +5 e +-- +-- This should fail +-- +\copy v_test1 to stdout +ERROR: cannot copy from view "v_test1" +HINT: Try the COPY (SELECT ...) TO variant. +-- +-- Test \copy (select ...) +-- +\copy (select "id",'id','id""'||t,(id + 1)*id,t,"test1"."t" from test1 where id=3) to stdout +3 id id""c 12 c c +-- +-- Drop everything +-- +drop table test2; +drop view v_test1; +drop table test1; +-- psql handling of COPY in multi-command strings +copy (select 1) to stdout\; select 1/0; -- row, then error +1 +ERROR: division by zero +select 1/0\; copy (select 1) to stdout; -- error only +ERROR: division by zero +copy (select 1) to stdout\; copy (select 2) to stdout\; select 0\; select 3; -- 1 2 3 +1 +2 + ?column? +---------- + 3 +(1 row) + +create table test3 (c int); +select 0\; copy test3 from stdin\; copy test3 from stdin\; select 1; -- 1 + ?column? +---------- + 1 +(1 row) + +select * from test3; + c +--- + 1 + 2 +(2 rows) + +drop table test3; diff --git a/src/test/singlenode_regress/expected/create_aggregate.out b/src/test/singlenode_regress/expected/create_aggregate.out new file mode 100644 index 00000000000..dcf69094237 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_aggregate.out @@ -0,0 +1,324 @@ +-- +-- CREATE_AGGREGATE +-- +-- all functions CREATEd +CREATE AGGREGATE newavg ( + sfunc = int4_avg_accum, basetype = int4, stype = _int8, + finalfunc = int8_avg, + initcond1 = '{0,0}' +); +-- test comments +COMMENT ON AGGREGATE newavg_wrong (int4) IS 'an agg comment'; +ERROR: aggregate newavg_wrong(integer) does not exist +COMMENT ON AGGREGATE newavg (int4) IS 'an agg comment'; +COMMENT ON AGGREGATE newavg (int4) IS NULL; +-- without finalfunc; test obsolete spellings 'sfunc1' etc +CREATE AGGREGATE newsum ( + sfunc1 = int4pl, basetype = int4, stype1 = int4, + initcond1 = '0' +); +-- zero-argument aggregate +CREATE AGGREGATE newcnt (*) ( + sfunc = int8inc, stype = int8, + initcond = '0', parallel = safe +); +-- old-style spelling of same (except without parallel-safe; that's too new) +CREATE AGGREGATE oldcnt ( + sfunc = int8inc, basetype = 'ANY', stype = int8, + initcond = '0' +); +-- aggregate that only cares about null/nonnull input +CREATE AGGREGATE newcnt ("any") ( + sfunc = int8inc_any, stype = int8, + initcond = '0' +); +COMMENT ON AGGREGATE nosuchagg (*) IS 'should fail'; +ERROR: aggregate nosuchagg(*) does not exist +COMMENT ON AGGREGATE newcnt (*) IS 'an agg(*) comment'; +COMMENT ON AGGREGATE newcnt ("any") IS 'an agg(any) comment'; +-- multi-argument aggregate +create function sum3(int8,int8,int8) returns int8 as +'select $1 + $2 + $3' language sql strict immutable; +create aggregate sum2(int8,int8) ( + sfunc = sum3, stype = int8, + initcond = '0' +); +-- multi-argument aggregates sensitive to distinct/order, strict/nonstrict +create type aggtype as (a integer, b integer, c text); +create function aggf_trans(aggtype[],integer,integer,text) returns aggtype[] +as 'select array_append($1,ROW($2,$3,$4)::aggtype)' +language sql strict immutable; +create function aggfns_trans(aggtype[],integer,integer,text) returns aggtype[] +as 'select array_append($1,ROW($2,$3,$4)::aggtype)' +language sql immutable; +create aggregate aggfstr(integer,integer,text) ( + sfunc = aggf_trans, stype = aggtype[], + initcond = '{}' +); +create aggregate aggfns(integer,integer,text) ( + sfunc = aggfns_trans, stype = aggtype[], sspace = 10000, + initcond = '{}' +); +-- check error cases that would require run-time type coercion +create function least_accum(int8, int8) returns int8 language sql as + 'select least($1, $2)'; +create aggregate least_agg(int4) ( + stype = int8, sfunc = least_accum +); -- fails +ERROR: function least_accum(bigint, bigint) requires run-time type coercion +drop function least_accum(int8, int8); +create function least_accum(anycompatible, anycompatible) +returns anycompatible language sql as + 'select least($1, $2)'; +create aggregate least_agg(int4) ( + stype = int8, sfunc = least_accum +); -- fails +ERROR: function least_accum(bigint, bigint) requires run-time type coercion +create aggregate least_agg(int8) ( + stype = int8, sfunc = least_accum +); +drop function least_accum(anycompatible, anycompatible) cascade; +NOTICE: drop cascades to function least_agg(bigint) +-- variadic aggregates +create function least_accum(anyelement, variadic anyarray) +returns anyelement language sql as + 'select least($1, min($2[i])) from generate_subscripts($2,1) g(i)'; +create aggregate least_agg(variadic items anyarray) ( + stype = anyelement, sfunc = least_accum +); +create function cleast_accum(anycompatible, variadic anycompatiblearray) +returns anycompatible language sql as + 'select least($1, min($2[i])) from generate_subscripts($2,1) g(i)'; +create aggregate cleast_agg(variadic items anycompatiblearray) ( + stype = anycompatible, sfunc = cleast_accum +); +-- test ordered-set aggs using built-in support functions +create aggregate my_percentile_disc(float8 ORDER BY anyelement) ( + stype = internal, + sfunc = ordered_set_transition, + finalfunc = percentile_disc_final, + finalfunc_extra = true, + finalfunc_modify = read_write +); +create aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") ( + stype = internal, + sfunc = ordered_set_transition_multi, + finalfunc = rank_final, + finalfunc_extra = true, + hypothetical +); +alter aggregate my_percentile_disc(float8 ORDER BY anyelement) + rename to test_percentile_disc; +alter aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") + rename to test_rank; +\da test_* + List of aggregate functions + Schema | Name | Result data type | Argument data types | Description +--------+----------------------+------------------+----------------------------------------+------------- + public | test_percentile_disc | anyelement | double precision ORDER BY anyelement | + public | test_rank | bigint | VARIADIC "any" ORDER BY VARIADIC "any" | +(2 rows) + +-- moving-aggregate options +CREATE AGGREGATE sumdouble (float8) +( + stype = float8, + sfunc = float8pl, + mstype = float8, + msfunc = float8pl, + minvfunc = float8mi +); +-- aggregate combine and serialization functions +-- can't specify just one of serialfunc and deserialfunc +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + serialfunc = numeric_avg_serialize +); +ERROR: must specify both or neither of serialization and deserialization functions +-- serialfunc must have correct parameters +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + serialfunc = numeric_avg_deserialize, + deserialfunc = numeric_avg_deserialize +); +ERROR: function numeric_avg_deserialize(internal) does not exist +-- deserialfunc must have correct parameters +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + serialfunc = numeric_avg_serialize, + deserialfunc = numeric_avg_serialize +); +ERROR: function numeric_avg_serialize(bytea, internal) does not exist +-- ensure combine function parameters are checked +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + serialfunc = numeric_avg_serialize, + deserialfunc = numeric_avg_deserialize, + combinefunc = int4larger +); +ERROR: function int4larger(internal, internal) does not exist +-- ensure create aggregate works. +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + finalfunc = numeric_avg, + serialfunc = numeric_avg_serialize, + deserialfunc = numeric_avg_deserialize, + combinefunc = numeric_avg_combine, + finalfunc_modify = shareable -- just to test a non-default setting +); +-- Ensure all these functions made it into the catalog +SELECT aggfnoid, aggtransfn, aggcombinefn, aggtranstype::regtype, + aggserialfn, aggdeserialfn, aggfinalmodify +FROM pg_aggregate +WHERE aggfnoid = 'myavg'::REGPROC; + aggfnoid | aggtransfn | aggcombinefn | aggtranstype | aggserialfn | aggdeserialfn | aggfinalmodify +----------+-------------------+---------------------+--------------+-----------------------+-------------------------+---------------- + myavg | numeric_avg_accum | numeric_avg_combine | internal | numeric_avg_serialize | numeric_avg_deserialize | s +(1 row) + +DROP AGGREGATE myavg (numeric); +-- create or replace aggregate +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + finalfunc = numeric_avg +); +CREATE OR REPLACE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + finalfunc = numeric_avg, + serialfunc = numeric_avg_serialize, + deserialfunc = numeric_avg_deserialize, + combinefunc = numeric_avg_combine, + finalfunc_modify = shareable -- just to test a non-default setting +); +-- Ensure all these functions made it into the catalog again +SELECT aggfnoid, aggtransfn, aggcombinefn, aggtranstype::regtype, + aggserialfn, aggdeserialfn, aggfinalmodify +FROM pg_aggregate +WHERE aggfnoid = 'myavg'::REGPROC; + aggfnoid | aggtransfn | aggcombinefn | aggtranstype | aggserialfn | aggdeserialfn | aggfinalmodify +----------+-------------------+---------------------+--------------+-----------------------+-------------------------+---------------- + myavg | numeric_avg_accum | numeric_avg_combine | internal | numeric_avg_serialize | numeric_avg_deserialize | s +(1 row) + +-- can change stype: +CREATE OR REPLACE AGGREGATE myavg (numeric) +( + stype = numeric, + sfunc = numeric_add +); +SELECT aggfnoid, aggtransfn, aggcombinefn, aggtranstype::regtype, + aggserialfn, aggdeserialfn, aggfinalmodify +FROM pg_aggregate +WHERE aggfnoid = 'myavg'::REGPROC; + aggfnoid | aggtransfn | aggcombinefn | aggtranstype | aggserialfn | aggdeserialfn | aggfinalmodify +----------+-------------+--------------+--------------+-------------+---------------+---------------- + myavg | numeric_add | - | numeric | - | - | r +(1 row) + +-- can't change return type: +CREATE OR REPLACE AGGREGATE myavg (numeric) +( + stype = numeric, + sfunc = numeric_add, + finalfunc = numeric_out +); +ERROR: cannot change return type of existing function +HINT: Use DROP AGGREGATE myavg(numeric) first. +-- can't change to a different kind: +CREATE OR REPLACE AGGREGATE myavg (order by numeric) +( + stype = numeric, + sfunc = numeric_add +); +ERROR: cannot change routine kind +DETAIL: "myavg" is an ordinary aggregate function. +-- can't change plain function to aggregate: +create function sum4(int8,int8,int8,int8) returns int8 as +'select $1 + $2 + $3 + $4' language sql strict immutable; +CREATE OR REPLACE AGGREGATE sum3 (int8,int8,int8) +( + stype = int8, + sfunc = sum4 +); +ERROR: cannot change routine kind +DETAIL: "sum3" is a function. +drop function sum4(int8,int8,int8,int8); +DROP AGGREGATE myavg (numeric); +-- invalid: bad parallel-safety marking +CREATE AGGREGATE mysum (int) +( + stype = int, + sfunc = int4pl, + parallel = pear +); +ERROR: parameter "parallel" must be SAFE, RESTRICTED, or UNSAFE +-- invalid: nonstrict inverse with strict forward function +CREATE FUNCTION float8mi_n(float8, float8) RETURNS float8 AS +$$ SELECT $1 - $2; $$ +LANGUAGE SQL; +CREATE AGGREGATE invalidsumdouble (float8) +( + stype = float8, + sfunc = float8pl, + mstype = float8, + msfunc = float8pl, + minvfunc = float8mi_n +); +ERROR: strictness of aggregate's forward and inverse transition functions must match +-- invalid: non-matching result types +CREATE FUNCTION float8mi_int(float8, float8) RETURNS int AS +$$ SELECT CAST($1 - $2 AS INT); $$ +LANGUAGE SQL; +CREATE AGGREGATE wrongreturntype (float8) +( + stype = float8, + sfunc = float8pl, + mstype = float8, + msfunc = float8pl, + minvfunc = float8mi_int +); +ERROR: return type of inverse transition function float8mi_int is not double precision +-- invalid: non-lowercase quoted identifiers +CREATE AGGREGATE case_agg ( -- old syntax + "Sfunc1" = int4pl, + "Basetype" = int4, + "Stype1" = int4, + "Initcond1" = '0', + "Parallel" = safe +); +WARNING: aggregate attribute "Sfunc1" not recognized +WARNING: aggregate attribute "Basetype" not recognized +WARNING: aggregate attribute "Stype1" not recognized +WARNING: aggregate attribute "Initcond1" not recognized +WARNING: aggregate attribute "Parallel" not recognized +ERROR: aggregate stype must be specified +CREATE AGGREGATE case_agg(float8) +( + "Stype" = internal, + "Sfunc" = ordered_set_transition, + "Finalfunc" = percentile_disc_final, + "Finalfunc_extra" = true, + "Finalfunc_modify" = read_write, + "Parallel" = safe +); +WARNING: aggregate attribute "Stype" not recognized +WARNING: aggregate attribute "Sfunc" not recognized +WARNING: aggregate attribute "Finalfunc" not recognized +WARNING: aggregate attribute "Finalfunc_extra" not recognized +WARNING: aggregate attribute "Finalfunc_modify" not recognized +WARNING: aggregate attribute "Parallel" not recognized +ERROR: aggregate stype must be specified diff --git a/src/test/singlenode_regress/expected/create_am.out b/src/test/singlenode_regress/expected/create_am.out new file mode 100644 index 00000000000..c1b7b2a612b --- /dev/null +++ b/src/test/singlenode_regress/expected/create_am.out @@ -0,0 +1,303 @@ +-- +-- Create access method tests +-- +-- Make gist2 over gisthandler. In fact, it would be a synonym to gist. +CREATE ACCESS METHOD gist2 TYPE INDEX HANDLER gisthandler; +-- Verify return type checks for handlers +CREATE ACCESS METHOD bogus TYPE INDEX HANDLER int4in; +ERROR: function int4in(internal) does not exist +CREATE ACCESS METHOD bogus TYPE INDEX HANDLER heap_tableam_handler; +ERROR: function heap_tableam_handler must return type index_am_handler +-- Try to create gist2 index on fast_emp4000: fail because opclass doesn't exist +CREATE INDEX grect2ind2 ON fast_emp4000 USING gist2 (home_base); +ERROR: data type box has no default operator class for access method "gist2" +HINT: You must specify an operator class for the index or define a default operator class for the data type. +-- Make operator class for boxes using gist2 +CREATE OPERATOR CLASS box_ops DEFAULT + FOR TYPE box USING gist2 AS + OPERATOR 1 <<, + OPERATOR 2 &<, + OPERATOR 3 &&, + OPERATOR 4 &>, + OPERATOR 5 >>, + OPERATOR 6 ~=, + OPERATOR 7 @>, + OPERATOR 8 <@, + OPERATOR 9 &<|, + OPERATOR 10 <<|, + OPERATOR 11 |>>, + OPERATOR 12 |&>, + FUNCTION 1 gist_box_consistent(internal, box, smallint, oid, internal), + FUNCTION 2 gist_box_union(internal, internal), + -- don't need compress, decompress, or fetch functions + FUNCTION 5 gist_box_penalty(internal, internal, internal), + FUNCTION 6 gist_box_picksplit(internal, internal), + FUNCTION 7 gist_box_same(box, box, internal); +-- Create gist2 index on fast_emp4000 +CREATE INDEX grect2ind2 ON fast_emp4000 USING gist2 (home_base); +-- Now check the results from plain indexscan; temporarily drop existing +-- index grect2ind to ensure it doesn't capture the plan +BEGIN; +DROP INDEX grect2ind; +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; +EXPLAIN (COSTS OFF) +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; + QUERY PLAN +----------------------------------------------------------------- + Sort + Sort Key: ((home_base[0])[0]) + -> Index Only Scan using grect2ind2 on fast_emp4000 + Index Cond: (home_base <@ '(2000,1000),(200,200)'::box) +(4 rows) + +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; + home_base +----------------------- + (337,455),(240,359) + (1444,403),(1346,344) +(2 rows) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; + QUERY PLAN +------------------------------------------------------------- + Aggregate + -> Index Only Scan using grect2ind2 on fast_emp4000 + Index Cond: (home_base && '(1000,1000),(0,0)'::box) +(3 rows) + +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; + count +------- + 2 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; + QUERY PLAN +-------------------------------------------------------- + Aggregate + -> Index Only Scan using grect2ind2 on fast_emp4000 + Index Cond: (home_base IS NULL) +(3 rows) + +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; + count +------- + 278 +(1 row) + +ROLLBACK; +-- Try to drop access method: fail because of dependent objects +DROP ACCESS METHOD gist2; +ERROR: cannot drop access method gist2 because other objects depend on it +DETAIL: index grect2ind2 depends on operator class box_ops for access method gist2 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- Drop access method cascade +-- To prevent a (rare) deadlock against autovacuum, +-- we must lock the table that owns the index that will be dropped +BEGIN; +LOCK TABLE fast_emp4000; +DROP ACCESS METHOD gist2 CASCADE; +NOTICE: drop cascades to index grect2ind2 +COMMIT; +-- +-- Test table access methods +-- +-- prevent empty values +SET default_table_access_method = ''; +ERROR: invalid value for parameter "default_table_access_method": "" +DETAIL: default_table_access_method cannot be empty. +-- prevent nonexistent values +SET default_table_access_method = 'I do not exist AM'; +ERROR: invalid value for parameter "default_table_access_method": "I do not exist AM" +DETAIL: Table access method "I do not exist AM" does not exist. +-- prevent setting it to an index AM +SET default_table_access_method = 'btree'; +ERROR: access method "btree" is not of type TABLE +-- Create a heap2 table am handler with heapam handler +CREATE ACCESS METHOD heap2 TYPE TABLE HANDLER heap_tableam_handler; +-- Verify return type checks for handlers +CREATE ACCESS METHOD bogus TYPE TABLE HANDLER int4in; +ERROR: function int4in(internal) does not exist +CREATE ACCESS METHOD bogus TYPE TABLE HANDLER bthandler; +ERROR: function bthandler must return type table_am_handler +SELECT amname, amhandler, amtype FROM pg_am where amtype = 't' ORDER BY 1, 2; + amname | amhandler | amtype +-----------+---------------------------+-------- + ao_column | ao_column_tableam_handler | t + ao_row | ao_row_tableam_handler | t + heap | heap_tableam_handler | t + heap2 | heap_tableam_handler | t +(4 rows) + +-- First create tables employing the new AM using USING +-- plain CREATE TABLE +CREATE TABLE tableam_tbl_heap2(f1 int) USING heap2; +INSERT INTO tableam_tbl_heap2 VALUES(1); +SELECT f1 FROM tableam_tbl_heap2 ORDER BY f1; + f1 +---- + 1 +(1 row) + +-- CREATE TABLE AS +CREATE TABLE tableam_tblas_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; +SELECT f1 FROM tableam_tbl_heap2 ORDER BY f1; + f1 +---- + 1 +(1 row) + +-- SELECT INTO doesn't support USING +SELECT INTO tableam_tblselectinto_heap2 USING heap2 FROM tableam_tbl_heap2; +ERROR: syntax error at or near "USING" +LINE 1: SELECT INTO tableam_tblselectinto_heap2 USING heap2 FROM tab... + ^ +-- CREATE VIEW doesn't support USING +CREATE VIEW tableam_view_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; +ERROR: syntax error at or near "USING" +LINE 1: CREATE VIEW tableam_view_heap2 USING heap2 AS SELECT * FROM ... + ^ +-- CREATE SEQUENCE doesn't support USING +CREATE SEQUENCE tableam_seq_heap2 USING heap2; +ERROR: syntax error at or near "USING" +LINE 1: CREATE SEQUENCE tableam_seq_heap2 USING heap2; + ^ +-- CREATE MATERIALIZED VIEW does support USING +CREATE MATERIALIZED VIEW tableam_tblmv_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; +SELECT f1 FROM tableam_tblmv_heap2 ORDER BY f1; + f1 +---- + 1 +(1 row) + +-- CREATE TABLE .. PARTITION BY doesn't not support USING +CREATE TABLE tableam_parted_heap2 (a text, b int) PARTITION BY list (a) USING heap2; +ERROR: specifying a table access method is not supported on a partitioned table +CREATE TABLE tableam_parted_heap2 (a text, b int) PARTITION BY list (a); +-- new partitions will inherit from the current default, rather the partition root +SET default_table_access_method = 'heap'; +CREATE TABLE tableam_parted_a_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('a'); +SET default_table_access_method = 'heap2'; +CREATE TABLE tableam_parted_b_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('b'); +RESET default_table_access_method; +-- but the method can be explicitly specified +CREATE TABLE tableam_parted_c_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('c') USING heap; +CREATE TABLE tableam_parted_d_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('d') USING heap2; +-- List all objects in AM +SELECT + pc.relkind, + pa.amname, + CASE WHEN relkind = 't' THEN + (SELECT 'toast for ' || relname::regclass FROM pg_class pcm WHERE pcm.reltoastrelid = pc.oid) + ELSE + relname::regclass::text + END COLLATE "C" AS relname +FROM pg_class AS pc, + pg_am AS pa +WHERE pa.oid = pc.relam + AND pa.amname = 'heap2' +ORDER BY 3, 1, 2; + relkind | amname | relname +---------+--------+---------------------------------- + r | heap2 | tableam_parted_b_heap2 + r | heap2 | tableam_parted_d_heap2 + r | heap2 | tableam_tbl_heap2 + r | heap2 | tableam_tblas_heap2 + m | heap2 | tableam_tblmv_heap2 + t | heap2 | toast for tableam_parted_b_heap2 + t | heap2 | toast for tableam_parted_d_heap2 +(7 rows) + +-- Show dependencies onto AM - there shouldn't be any for toast +SELECT pg_describe_object(classid,objid,objsubid) AS obj +FROM pg_depend, pg_am +WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_am.amname = 'heap2' +ORDER BY classid, objid, objsubid; + obj +--------------------------------------- + table tableam_tbl_heap2 + table tableam_tblas_heap2 + materialized view tableam_tblmv_heap2 + table tableam_parted_b_heap2 + table tableam_parted_d_heap2 +(5 rows) + +-- Second, create objects in the new AM by changing the default AM +BEGIN; +SET LOCAL default_table_access_method = 'heap2'; +-- following tests should all respect the default AM +CREATE TABLE tableam_tbl_heapx(f1 int); +CREATE TABLE tableam_tblas_heapx AS SELECT * FROM tableam_tbl_heapx; +SELECT INTO tableam_tblselectinto_heapx FROM tableam_tbl_heapx; +CREATE MATERIALIZED VIEW tableam_tblmv_heapx USING heap2 AS SELECT * FROM tableam_tbl_heapx; +CREATE TABLE tableam_parted_heapx (a text, b int) PARTITION BY list (a); +CREATE TABLE tableam_parted_1_heapx PARTITION OF tableam_parted_heapx FOR VALUES IN ('a', 'b'); +-- but an explicitly set AM overrides it +CREATE TABLE tableam_parted_2_heapx PARTITION OF tableam_parted_heapx FOR VALUES IN ('c', 'd') USING heap; +-- sequences, views and foreign servers shouldn't have an AM +CREATE VIEW tableam_view_heapx AS SELECT * FROM tableam_tbl_heapx; +CREATE SEQUENCE tableam_seq_heapx; +CREATE FOREIGN DATA WRAPPER fdw_heap2 VALIDATOR postgresql_fdw_validator; +CREATE SERVER fs_heap2 FOREIGN DATA WRAPPER fdw_heap2 ; +CREATE FOREIGN table tableam_fdw_heapx () SERVER fs_heap2; +-- Verify that new AM was used for tables, matviews, but not for sequences, views and fdws +SELECT + pc.relkind, + pa.amname, + CASE WHEN relkind = 't' THEN + (SELECT 'toast for ' || relname::regclass FROM pg_class pcm WHERE pcm.reltoastrelid = pc.oid) + ELSE + relname::regclass::text + END COLLATE "C" AS relname +FROM pg_class AS pc + LEFT JOIN pg_am AS pa ON (pa.oid = pc.relam) +WHERE pc.relname LIKE 'tableam_%_heapx' +ORDER BY 3, 1, 2; + relkind | amname | relname +---------+--------+----------------------------- + f | | tableam_fdw_heapx + r | heap2 | tableam_parted_1_heapx + r | heap | tableam_parted_2_heapx + p | | tableam_parted_heapx + S | | tableam_seq_heapx + r | heap2 | tableam_tbl_heapx + r | heap2 | tableam_tblas_heapx + m | heap2 | tableam_tblmv_heapx + r | heap2 | tableam_tblselectinto_heapx + v | | tableam_view_heapx +(10 rows) + +-- don't want to keep those tables, nor the default +ROLLBACK; +-- Third, check that we can neither create a table using a nonexistent +-- AM, nor using an index AM +CREATE TABLE i_am_a_failure() USING ""; +ERROR: zero-length delimited identifier at or near """" +LINE 1: CREATE TABLE i_am_a_failure() USING ""; + ^ +CREATE TABLE i_am_a_failure() USING i_do_not_exist_am; +ERROR: access method "i_do_not_exist_am" does not exist +CREATE TABLE i_am_a_failure() USING "I do not exist AM"; +ERROR: access method "I do not exist AM" does not exist +CREATE TABLE i_am_a_failure() USING "btree"; +ERROR: access method "btree" is not of type TABLE +-- Drop table access method, which fails as objects depends on it +DROP ACCESS METHOD heap2; +ERROR: cannot drop access method heap2 because other objects depend on it +DETAIL: table tableam_tbl_heap2 depends on access method heap2 +table tableam_tblas_heap2 depends on access method heap2 +materialized view tableam_tblmv_heap2 depends on access method heap2 +table tableam_parted_b_heap2 depends on access method heap2 +table tableam_parted_d_heap2 depends on access method heap2 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- we intentionally leave the objects created above alive, to verify pg_dump support diff --git a/src/test/singlenode_regress/expected/create_cast.out b/src/test/singlenode_regress/expected/create_cast.out new file mode 100644 index 00000000000..88f94a63b48 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_cast.out @@ -0,0 +1,74 @@ +-- +-- CREATE_CAST +-- +-- Create some types to test with +CREATE TYPE casttesttype; +CREATE FUNCTION casttesttype_in(cstring) + RETURNS casttesttype + AS 'textin' + LANGUAGE internal STRICT IMMUTABLE; +NOTICE: return type casttesttype is only a shell +CREATE FUNCTION casttesttype_out(casttesttype) + RETURNS cstring + AS 'textout' + LANGUAGE internal STRICT IMMUTABLE; +NOTICE: argument type casttesttype is only a shell +CREATE TYPE casttesttype ( + internallength = variable, + input = casttesttype_in, + output = casttesttype_out, + alignment = int4 +); +-- a dummy function to test with +CREATE FUNCTION casttestfunc(casttesttype) RETURNS int4 LANGUAGE SQL AS +$$ SELECT 1; $$; +SELECT casttestfunc('foo'::text); -- fails, as there's no cast +ERROR: function casttestfunc(text) does not exist +LINE 1: SELECT casttestfunc('foo'::text); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +-- Try binary coercion cast +CREATE CAST (text AS casttesttype) WITHOUT FUNCTION; +SELECT casttestfunc('foo'::text); -- doesn't work, as the cast is explicit +ERROR: function casttestfunc(text) does not exist +LINE 1: SELECT casttestfunc('foo'::text); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +SELECT casttestfunc('foo'::text::casttesttype); -- should work + casttestfunc +-------------- + 1 +(1 row) + +DROP CAST (text AS casttesttype); -- cleanup +-- Try IMPLICIT binary coercion cast +CREATE CAST (text AS casttesttype) WITHOUT FUNCTION AS IMPLICIT; +SELECT casttestfunc('foo'::text); -- Should work now + casttestfunc +-------------- + 1 +(1 row) + +-- Try I/O conversion cast. +SELECT 1234::int4::casttesttype; -- No cast yet, should fail +ERROR: cannot cast type integer to casttesttype +LINE 1: SELECT 1234::int4::casttesttype; + ^ +CREATE CAST (int4 AS casttesttype) WITH INOUT; +SELECT 1234::int4::casttesttype; -- Should work now + casttesttype +-------------- + 1234 +(1 row) + +DROP CAST (int4 AS casttesttype); +-- Try cast with a function +CREATE FUNCTION int4_casttesttype(int4) RETURNS casttesttype LANGUAGE SQL AS +$$ SELECT ('foo'::text || $1::text)::casttesttype; $$; +CREATE CAST (int4 AS casttesttype) WITH FUNCTION int4_casttesttype(int4) AS IMPLICIT; +SELECT 1234::int4::casttesttype; -- Should work now + casttesttype +-------------- + foo1234 +(1 row) + diff --git a/src/test/singlenode_regress/expected/create_function_3.out b/src/test/singlenode_regress/expected/create_function_3.out new file mode 100644 index 00000000000..3a4fd451471 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_function_3.out @@ -0,0 +1,702 @@ +-- +-- CREATE FUNCTION +-- +-- Assorted tests using SQL-language functions +-- +-- All objects made in this test are in temp_func_test schema +CREATE USER regress_unpriv_user; +CREATE SCHEMA temp_func_test; +GRANT ALL ON SCHEMA temp_func_test TO public; +SET search_path TO temp_func_test, public; +-- +-- Make sanity checks on the pg_proc entries created by CREATE FUNCTION +-- +-- +-- ARGUMENT and RETURN TYPES +-- +CREATE FUNCTION functest_A_1(text, date) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 = ''abcd'' AND $2 > ''2001-01-01'''; +CREATE FUNCTION functest_A_2(text[]) RETURNS int LANGUAGE 'sql' + AS 'SELECT $1[1]::int'; +CREATE FUNCTION functest_A_3() RETURNS bool LANGUAGE 'sql' + AS 'SELECT false'; +SELECT proname, prorettype::regtype, proargtypes::regtype[] FROM pg_proc + WHERE oid in ('functest_A_1'::regproc, + 'functest_A_2'::regproc, + 'functest_A_3'::regproc) ORDER BY proname; + proname | prorettype | proargtypes +--------------+------------+------------------- + functest_a_1 | boolean | [0:1]={text,date} + functest_a_2 | integer | [0:0]={text[]} + functest_a_3 | boolean | {} +(3 rows) + +SELECT functest_A_1('abcd', '2020-01-01'); + functest_a_1 +-------------- + t +(1 row) + +SELECT functest_A_2(ARRAY['1', '2', '3']); + functest_a_2 +-------------- + 1 +(1 row) + +SELECT functest_A_3(); + functest_a_3 +-------------- + f +(1 row) + +-- +-- IMMUTABLE | STABLE | VOLATILE +-- +CREATE FUNCTION functest_B_1(int) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 > 0'; +CREATE FUNCTION functest_B_2(int) RETURNS bool LANGUAGE 'sql' + IMMUTABLE AS 'SELECT $1 > 0'; +CREATE FUNCTION functest_B_3(int) RETURNS bool LANGUAGE 'sql' + STABLE AS 'SELECT $1 = 0'; +CREATE FUNCTION functest_B_4(int) RETURNS bool LANGUAGE 'sql' + VOLATILE AS 'SELECT $1 < 0'; +SELECT proname, provolatile FROM pg_proc + WHERE oid in ('functest_B_1'::regproc, + 'functest_B_2'::regproc, + 'functest_B_3'::regproc, + 'functest_B_4'::regproc) ORDER BY proname; + proname | provolatile +--------------+------------- + functest_b_1 | v + functest_b_2 | i + functest_b_3 | s + functest_b_4 | v +(4 rows) + +ALTER FUNCTION functest_B_2(int) VOLATILE; +ALTER FUNCTION functest_B_3(int) COST 100; -- unrelated change, no effect +SELECT proname, provolatile FROM pg_proc + WHERE oid in ('functest_B_1'::regproc, + 'functest_B_2'::regproc, + 'functest_B_3'::regproc, + 'functest_B_4'::regproc) ORDER BY proname; + proname | provolatile +--------------+------------- + functest_b_1 | v + functest_b_2 | v + functest_b_3 | s + functest_b_4 | v +(4 rows) + +-- +-- SECURITY DEFINER | INVOKER +-- +CREATE FUNCTION functest_C_1(int) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 > 0'; +CREATE FUNCTION functest_C_2(int) RETURNS bool LANGUAGE 'sql' + SECURITY DEFINER AS 'SELECT $1 = 0'; +CREATE FUNCTION functest_C_3(int) RETURNS bool LANGUAGE 'sql' + SECURITY INVOKER AS 'SELECT $1 < 0'; +SELECT proname, prosecdef FROM pg_proc + WHERE oid in ('functest_C_1'::regproc, + 'functest_C_2'::regproc, + 'functest_C_3'::regproc) ORDER BY proname; + proname | prosecdef +--------------+----------- + functest_c_1 | f + functest_c_2 | t + functest_c_3 | f +(3 rows) + +ALTER FUNCTION functest_C_1(int) IMMUTABLE; -- unrelated change, no effect +ALTER FUNCTION functest_C_2(int) SECURITY INVOKER; +ALTER FUNCTION functest_C_3(int) SECURITY DEFINER; +SELECT proname, prosecdef FROM pg_proc + WHERE oid in ('functest_C_1'::regproc, + 'functest_C_2'::regproc, + 'functest_C_3'::regproc) ORDER BY proname; + proname | prosecdef +--------------+----------- + functest_c_1 | f + functest_c_2 | f + functest_c_3 | t +(3 rows) + +-- +-- LEAKPROOF +-- +CREATE FUNCTION functest_E_1(int) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 > 100'; +CREATE FUNCTION functest_E_2(int) RETURNS bool LANGUAGE 'sql' + LEAKPROOF AS 'SELECT $1 > 100'; +SELECT proname, proleakproof FROM pg_proc + WHERE oid in ('functest_E_1'::regproc, + 'functest_E_2'::regproc) ORDER BY proname; + proname | proleakproof +--------------+-------------- + functest_e_1 | f + functest_e_2 | t +(2 rows) + +ALTER FUNCTION functest_E_1(int) LEAKPROOF; +ALTER FUNCTION functest_E_2(int) STABLE; -- unrelated change, no effect +SELECT proname, proleakproof FROM pg_proc + WHERE oid in ('functest_E_1'::regproc, + 'functest_E_2'::regproc) ORDER BY proname; + proname | proleakproof +--------------+-------------- + functest_e_1 | t + functest_e_2 | t +(2 rows) + +ALTER FUNCTION functest_E_2(int) NOT LEAKPROOF; -- remove leakproof attribute +SELECT proname, proleakproof FROM pg_proc + WHERE oid in ('functest_E_1'::regproc, + 'functest_E_2'::regproc) ORDER BY proname; + proname | proleakproof +--------------+-------------- + functest_e_1 | t + functest_e_2 | f +(2 rows) + +-- it takes superuser privilege to turn on leakproof, but not to turn off +ALTER FUNCTION functest_E_1(int) OWNER TO regress_unpriv_user; +ALTER FUNCTION functest_E_2(int) OWNER TO regress_unpriv_user; +SET SESSION AUTHORIZATION regress_unpriv_user; +SET search_path TO temp_func_test, public; +ALTER FUNCTION functest_E_1(int) NOT LEAKPROOF; +ALTER FUNCTION functest_E_2(int) LEAKPROOF; +ERROR: only superuser can define a leakproof function +CREATE FUNCTION functest_E_3(int) RETURNS bool LANGUAGE 'sql' + LEAKPROOF AS 'SELECT $1 < 200'; -- fail +ERROR: only superuser can define a leakproof function +RESET SESSION AUTHORIZATION; +-- +-- CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT +-- +CREATE FUNCTION functest_F_1(int) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 > 50'; +CREATE FUNCTION functest_F_2(int) RETURNS bool LANGUAGE 'sql' + CALLED ON NULL INPUT AS 'SELECT $1 = 50'; +CREATE FUNCTION functest_F_3(int) RETURNS bool LANGUAGE 'sql' + RETURNS NULL ON NULL INPUT AS 'SELECT $1 < 50'; +CREATE FUNCTION functest_F_4(int) RETURNS bool LANGUAGE 'sql' + STRICT AS 'SELECT $1 = 50'; +SELECT proname, proisstrict FROM pg_proc + WHERE oid in ('functest_F_1'::regproc, + 'functest_F_2'::regproc, + 'functest_F_3'::regproc, + 'functest_F_4'::regproc) ORDER BY proname; + proname | proisstrict +--------------+------------- + functest_f_1 | f + functest_f_2 | f + functest_f_3 | t + functest_f_4 | t +(4 rows) + +ALTER FUNCTION functest_F_1(int) IMMUTABLE; -- unrelated change, no effect +ALTER FUNCTION functest_F_2(int) STRICT; +ALTER FUNCTION functest_F_3(int) CALLED ON NULL INPUT; +SELECT proname, proisstrict FROM pg_proc + WHERE oid in ('functest_F_1'::regproc, + 'functest_F_2'::regproc, + 'functest_F_3'::regproc, + 'functest_F_4'::regproc) ORDER BY proname; + proname | proisstrict +--------------+------------- + functest_f_1 | f + functest_f_2 | t + functest_f_3 | f + functest_f_4 | t +(4 rows) + +-- pg_get_functiondef tests +SELECT pg_get_functiondef('functest_A_1'::regproc); + pg_get_functiondef +-------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_a_1(text, date)+ + RETURNS boolean + + LANGUAGE sql + + AS $function$SELECT $1 = 'abcd' AND $2 > '2001-01-01'$function$ + + +(1 row) + +SELECT pg_get_functiondef('functest_B_3'::regproc); + pg_get_functiondef +----------------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_b_3(integer)+ + RETURNS boolean + + LANGUAGE sql + + STABLE + + AS $function$SELECT $1 = 0$function$ + + +(1 row) + +SELECT pg_get_functiondef('functest_C_3'::regproc); + pg_get_functiondef +----------------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_c_3(integer)+ + RETURNS boolean + + LANGUAGE sql + + SECURITY DEFINER + + AS $function$SELECT $1 < 0$function$ + + +(1 row) + +SELECT pg_get_functiondef('functest_F_2'::regproc); + pg_get_functiondef +----------------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_f_2(integer)+ + RETURNS boolean + + LANGUAGE sql + + STRICT + + AS $function$SELECT $1 = 50$function$ + + +(1 row) + +-- +-- SQL-standard body +-- +CREATE FUNCTION functest_S_1(a text, b date) RETURNS boolean + LANGUAGE SQL + RETURN a = 'abcd' AND b > '2001-01-01'; +CREATE FUNCTION functest_S_2(a text[]) RETURNS int + RETURN a[1]::int; +CREATE FUNCTION functest_S_3() RETURNS boolean + RETURN false; +CREATE FUNCTION functest_S_3a() RETURNS boolean + BEGIN ATOMIC + ;;RETURN false;; + END; +CREATE FUNCTION functest_S_10(a text, b date) RETURNS boolean + LANGUAGE SQL + BEGIN ATOMIC + SELECT a = 'abcd' AND b > '2001-01-01'; + END; +CREATE FUNCTION functest_S_13() RETURNS boolean + BEGIN ATOMIC + SELECT 1; + SELECT false; + END; +-- check display of function argments in sub-SELECT +CREATE TABLE functest1 (i int); +CREATE FUNCTION functest_S_16(a int, b int) RETURNS void + LANGUAGE SQL + BEGIN ATOMIC + INSERT INTO functest1 SELECT a + $2; + END; +-- error: duplicate function body +CREATE FUNCTION functest_S_xxx(x int) RETURNS int + LANGUAGE SQL + AS $$ SELECT x * 2 $$ + RETURN x * 3; +ERROR: duplicate function body specified +-- polymorphic arguments not allowed in this form +CREATE FUNCTION functest_S_xx(x anyarray) RETURNS anyelement + LANGUAGE SQL + RETURN x[1]; +ERROR: SQL function with unquoted function body cannot have polymorphic arguments +-- check reporting of parse-analysis errors +CREATE FUNCTION functest_S_xx(x date) RETURNS boolean + LANGUAGE SQL + RETURN x > 1; +ERROR: operator does not exist: date > integer +LINE 3: RETURN x > 1; + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- tricky parsing +CREATE FUNCTION functest_S_15(x int) RETURNS boolean +LANGUAGE SQL +BEGIN ATOMIC + select case when x % 2 = 0 then true else false end; +END; +SELECT functest_S_1('abcd', '2020-01-01'); + functest_s_1 +-------------- + t +(1 row) + +SELECT functest_S_2(ARRAY['1', '2', '3']); + functest_s_2 +-------------- + 1 +(1 row) + +SELECT functest_S_3(); + functest_s_3 +-------------- + f +(1 row) + +SELECT functest_S_10('abcd', '2020-01-01'); + functest_s_10 +--------------- + t +(1 row) + +SELECT functest_S_13(); + functest_s_13 +--------------- + f +(1 row) + +SELECT pg_get_functiondef('functest_S_1'::regproc); + pg_get_functiondef +------------------------------------------------------------------------ + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_1(a text, b date)+ + RETURNS boolean + + LANGUAGE sql + + RETURN ((a = 'abcd'::text) AND (b > '01-01-2001'::date)) + + +(1 row) + +SELECT pg_get_functiondef('functest_S_2'::regproc); + pg_get_functiondef +------------------------------------------------------------------ + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_2(a text[])+ + RETURNS integer + + LANGUAGE sql + + RETURN ((a)[1])::integer + + +(1 row) + +SELECT pg_get_functiondef('functest_S_3'::regproc); + pg_get_functiondef +---------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_3()+ + RETURNS boolean + + LANGUAGE sql + + RETURN false + + +(1 row) + +SELECT pg_get_functiondef('functest_S_3a'::regproc); + pg_get_functiondef +----------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_3a()+ + RETURNS boolean + + LANGUAGE sql + + BEGIN ATOMIC + + RETURN false; + + END + + +(1 row) + +SELECT pg_get_functiondef('functest_S_10'::regproc); + pg_get_functiondef +------------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_10(a text, b date)+ + RETURNS boolean + + LANGUAGE sql + + BEGIN ATOMIC + + SELECT ((a = 'abcd'::text) AND (b > '01-01-2001'::date)); + + END + + +(1 row) + +SELECT pg_get_functiondef('functest_S_13'::regproc); + pg_get_functiondef +----------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_13()+ + RETURNS boolean + + LANGUAGE sql + + BEGIN ATOMIC + + SELECT 1; + + SELECT false AS bool; + + END + + +(1 row) + +SELECT pg_get_functiondef('functest_S_15'::regproc); + pg_get_functiondef +-------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_15(x integer)+ + RETURNS boolean + + LANGUAGE sql + + BEGIN ATOMIC + + SELECT + + CASE + + WHEN ((x % 2) = 0) THEN true + + ELSE false + + END AS "case"; + + END + + +(1 row) + +SELECT pg_get_functiondef('functest_S_16'::regproc); + pg_get_functiondef +------------------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_16(a integer, b integer)+ + RETURNS void + + LANGUAGE sql + + BEGIN ATOMIC + + INSERT INTO functest1 (i) SELECT (functest_s_16.a + functest_s_16.b); + + END + + +(1 row) + +DROP TABLE functest1 CASCADE; +NOTICE: drop cascades to function functest_s_16(integer,integer) +-- test with views +CREATE TABLE functest3 (a int); +INSERT INTO functest3 VALUES (1), (2); +CREATE VIEW functestv3 AS SELECT * FROM functest3; +CREATE FUNCTION functest_S_14() RETURNS bigint + RETURN (SELECT count(*) FROM functestv3); +SELECT functest_S_14(); + functest_s_14 +--------------- + 2 +(1 row) + +DROP TABLE functest3 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view functestv3 +drop cascades to function functest_s_14() +-- information_schema tests +CREATE FUNCTION functest_IS_1(a int, b int default 1, c text default 'foo') + RETURNS int + LANGUAGE SQL + AS 'SELECT $1 + $2'; +CREATE FUNCTION functest_IS_2(out a int, b int default 1) + RETURNS int + LANGUAGE SQL + AS 'SELECT $1'; +CREATE FUNCTION functest_IS_3(a int default 1, out b int) + RETURNS int + LANGUAGE SQL + AS 'SELECT $1'; +SELECT routine_name, ordinal_position, parameter_name, parameter_default + FROM information_schema.parameters JOIN information_schema.routines USING (specific_schema, specific_name) + WHERE routine_schema = 'temp_func_test' AND routine_name ~ '^functest_is_' + ORDER BY 1, 2; + routine_name | ordinal_position | parameter_name | parameter_default +---------------+------------------+----------------+------------------- + functest_is_1 | 1 | a | + functest_is_1 | 2 | b | 1 + functest_is_1 | 3 | c | 'foo'::text + functest_is_2 | 1 | a | + functest_is_2 | 2 | b | 1 + functest_is_3 | 1 | a | 1 + functest_is_3 | 2 | b | +(7 rows) + +DROP FUNCTION functest_IS_1(int, int, text), functest_IS_2(int), functest_IS_3(int); +-- routine usage views +CREATE FUNCTION functest_IS_4a() RETURNS int LANGUAGE SQL AS 'SELECT 1'; +CREATE FUNCTION functest_IS_4b(x int DEFAULT functest_IS_4a()) RETURNS int LANGUAGE SQL AS 'SELECT x'; +CREATE SEQUENCE functest1; +CREATE FUNCTION functest_IS_5(x int DEFAULT nextval('functest1')) + RETURNS int + LANGUAGE SQL + AS 'SELECT x'; +CREATE FUNCTION functest_IS_6() + RETURNS int + LANGUAGE SQL + RETURN nextval('functest1'); +CREATE TABLE functest2 (a int, b int); +CREATE FUNCTION functest_IS_7() + RETURNS int + LANGUAGE SQL + RETURN (SELECT count(a) FROM functest2); +SELECT r0.routine_name, r1.routine_name + FROM information_schema.routine_routine_usage rru + JOIN information_schema.routines r0 ON r0.specific_name = rru.specific_name + JOIN information_schema.routines r1 ON r1.specific_name = rru.routine_name + WHERE r0.routine_schema = 'temp_func_test' AND + r1.routine_schema = 'temp_func_test' + ORDER BY 1, 2; + routine_name | routine_name +----------------+---------------- + functest_is_4b | functest_is_4a +(1 row) + +SELECT routine_name, sequence_name FROM information_schema.routine_sequence_usage + WHERE routine_schema = 'temp_func_test' + ORDER BY 1, 2; + routine_name | sequence_name +---------------+--------------- + functest_is_5 | functest1 + functest_is_6 | functest1 +(2 rows) + +SELECT routine_name, table_name, column_name FROM information_schema.routine_column_usage + WHERE routine_schema = 'temp_func_test' + ORDER BY 1, 2; + routine_name | table_name | column_name +---------------+------------+------------- + functest_is_7 | functest2 | a +(1 row) + +SELECT routine_name, table_name FROM information_schema.routine_table_usage + WHERE routine_schema = 'temp_func_test' + ORDER BY 1, 2; + routine_name | table_name +---------------+------------ + functest_is_7 | functest2 +(1 row) + +DROP FUNCTION functest_IS_4a CASCADE; +NOTICE: drop cascades to function functest_is_4b(integer) +DROP SEQUENCE functest1 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function functest_is_5(integer) +drop cascades to function functest_is_6() +DROP TABLE functest2 CASCADE; +NOTICE: drop cascades to function functest_is_7() +-- overload +CREATE FUNCTION functest_B_2(bigint) RETURNS bool LANGUAGE 'sql' + IMMUTABLE AS 'SELECT $1 > 0'; +DROP FUNCTION functest_b_1; +DROP FUNCTION functest_b_1; -- error, not found +ERROR: could not find a function named "functest_b_1" +DROP FUNCTION functest_b_2; -- error, ambiguous +ERROR: function name "functest_b_2" is not unique +HINT: Specify the argument list to select the function unambiguously. +-- CREATE OR REPLACE tests +CREATE FUNCTION functest1(a int) RETURNS int LANGUAGE SQL AS 'SELECT $1'; +CREATE OR REPLACE FUNCTION functest1(a int) RETURNS int LANGUAGE SQL WINDOW AS 'SELECT $1'; +ERROR: cannot change routine kind +DETAIL: "functest1" is a function. +CREATE OR REPLACE PROCEDURE functest1(a int) LANGUAGE SQL AS 'SELECT $1'; +ERROR: cannot change routine kind +DETAIL: "functest1" is a function. +DROP FUNCTION functest1(a int); +-- inlining of set-returning functions +CREATE TABLE functest3 (a int); +INSERT INTO functest3 VALUES (1), (2), (3); +CREATE FUNCTION functest_sri1() RETURNS SETOF int +LANGUAGE SQL +STABLE +AS ' + SELECT * FROM functest3; +'; +SELECT * FROM functest_sri1(); + functest_sri1 +--------------- + 1 + 2 + 3 +(3 rows) + +EXPLAIN (verbose, costs off) SELECT * FROM functest_sri1(); + QUERY PLAN +-------------------------------------- + Seq Scan on temp_func_test.functest3 + Output: functest3.a +(2 rows) + +CREATE FUNCTION functest_sri2() RETURNS SETOF int +LANGUAGE SQL +STABLE +BEGIN ATOMIC + SELECT * FROM functest3; +END; +SELECT * FROM functest_sri2(); + functest_sri2 +--------------- + 1 + 2 + 3 +(3 rows) + +EXPLAIN (verbose, costs off) SELECT * FROM functest_sri2(); + QUERY PLAN +-------------------------------------- + Seq Scan on temp_func_test.functest3 + Output: functest3.a +(2 rows) + +DROP TABLE functest3 CASCADE; +NOTICE: drop cascades to function functest_sri2() +-- Check behavior of VOID-returning SQL functions +CREATE FUNCTION voidtest1(a int) RETURNS VOID LANGUAGE SQL AS +$$ SELECT a + 1 $$; +SELECT voidtest1(42); + voidtest1 +----------- + +(1 row) + +CREATE FUNCTION voidtest2(a int, b int) RETURNS VOID LANGUAGE SQL AS +$$ SELECT voidtest1(a + b) $$; +SELECT voidtest2(11,22); + voidtest2 +----------- + +(1 row) + +-- currently, we can inline voidtest2 but not voidtest1 +EXPLAIN (verbose, costs off) SELECT voidtest2(11,22); + QUERY PLAN +------------------------- + Result + Output: voidtest1(33) +(2 rows) + +CREATE TEMP TABLE sometable(f1 int); +CREATE FUNCTION voidtest3(a int) RETURNS VOID LANGUAGE SQL AS +$$ INSERT INTO sometable VALUES(a + 1) $$; +SELECT voidtest3(17); + voidtest3 +----------- + +(1 row) + +CREATE FUNCTION voidtest4(a int) RETURNS VOID LANGUAGE SQL AS +$$ INSERT INTO sometable VALUES(a - 1) RETURNING f1 $$; +SELECT voidtest4(39); + voidtest4 +----------- + +(1 row) + +TABLE sometable; + f1 +---- + 18 + 38 +(2 rows) + +CREATE FUNCTION voidtest5(a int) RETURNS SETOF VOID LANGUAGE SQL AS +$$ SELECT generate_series(1, a) $$ STABLE; +SELECT * FROM voidtest5(3); + voidtest5 +----------- +(0 rows) + +-- Cleanup +DROP SCHEMA temp_func_test CASCADE; +NOTICE: drop cascades to 29 other objects +DETAIL: drop cascades to function functest_a_1(text,date) +drop cascades to function functest_a_2(text[]) +drop cascades to function functest_a_3() +drop cascades to function functest_b_2(integer) +drop cascades to function functest_b_3(integer) +drop cascades to function functest_b_4(integer) +drop cascades to function functest_c_1(integer) +drop cascades to function functest_c_2(integer) +drop cascades to function functest_c_3(integer) +drop cascades to function functest_e_1(integer) +drop cascades to function functest_e_2(integer) +drop cascades to function functest_f_1(integer) +drop cascades to function functest_f_2(integer) +drop cascades to function functest_f_3(integer) +drop cascades to function functest_f_4(integer) +drop cascades to function functest_s_1(text,date) +drop cascades to function functest_s_2(text[]) +drop cascades to function functest_s_3() +drop cascades to function functest_s_3a() +drop cascades to function functest_s_10(text,date) +drop cascades to function functest_s_13() +drop cascades to function functest_s_15(integer) +drop cascades to function functest_b_2(bigint) +drop cascades to function functest_sri1() +drop cascades to function voidtest1(integer) +drop cascades to function voidtest2(integer,integer) +drop cascades to function voidtest3(integer) +drop cascades to function voidtest4(integer) +drop cascades to function voidtest5(integer) +DROP USER regress_unpriv_user; +RESET search_path; diff --git a/src/test/singlenode_regress/expected/create_index.out b/src/test/singlenode_regress/expected/create_index.out new file mode 100644 index 00000000000..60cc25a1609 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_index.out @@ -0,0 +1,2844 @@ +-- +-- CREATE_INDEX +-- Create ancillary data structures (i.e. indices) +-- +-- +-- BTREE +-- +CREATE INDEX onek_unique1 ON onek USING btree(unique1 int4_ops); +CREATE INDEX IF NOT EXISTS onek_unique1 ON onek USING btree(unique1 int4_ops); +NOTICE: relation "onek_unique1" already exists, skipping +CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_ops); +ERROR: syntax error at or near "ON" +LINE 1: CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_... + ^ +CREATE INDEX onek_unique2 ON onek USING btree(unique2 int4_ops); +CREATE INDEX onek_hundred ON onek USING btree(hundred int4_ops); +CREATE INDEX onek_stringu1 ON onek USING btree(stringu1 name_ops); +CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops); +CREATE INDEX tenk1_unique2 ON tenk1 USING btree(unique2 int4_ops); +CREATE INDEX tenk1_hundred ON tenk1 USING btree(hundred int4_ops); +CREATE INDEX tenk1_thous_tenthous ON tenk1 (thousand, tenthous); +CREATE INDEX tenk2_unique1 ON tenk2 USING btree(unique1 int4_ops); +CREATE INDEX tenk2_unique2 ON tenk2 USING btree(unique2 int4_ops); +CREATE INDEX tenk2_hundred ON tenk2 USING btree(hundred int4_ops); +CREATE INDEX rix ON road USING btree (name text_ops); +CREATE INDEX iix ON ihighway USING btree (name text_ops); +CREATE INDEX six ON shighway USING btree (name text_ops); +-- test comments +COMMENT ON INDEX six_wrong IS 'bad index'; +ERROR: relation "six_wrong" does not exist +COMMENT ON INDEX six IS 'good index'; +COMMENT ON INDEX six IS NULL; +-- +-- BTREE ascending/descending cases +-- +-- we load int4/text from pure descending data (each key is a new +-- low key) and name/f8 from pure ascending data (each key is a new +-- high key). we had a bug where new low keys would sometimes be +-- "lost". +-- +CREATE INDEX bt_i4_index ON bt_i4_heap USING btree (seqno int4_ops); +CREATE INDEX bt_name_index ON bt_name_heap USING btree (seqno name_ops); +CREATE INDEX bt_txt_index ON bt_txt_heap USING btree (seqno text_ops); +CREATE INDEX bt_f8_index ON bt_f8_heap USING btree (seqno float8_ops); +-- +-- BTREE partial indices +-- +CREATE INDEX onek2_u1_prtl ON onek2 USING btree(unique1 int4_ops) + where unique1 < 20 or unique1 > 980; +CREATE INDEX onek2_u2_prtl ON onek2 USING btree(unique2 int4_ops) + where stringu1 < 'B'; +CREATE INDEX onek2_stu1_prtl ON onek2 USING btree(stringu1 name_ops) + where onek2.stringu1 >= 'J' and onek2.stringu1 < 'K'; +-- +-- GiST (rtree-equivalent opclasses only) +-- +CREATE INDEX grect2ind ON fast_emp4000 USING gist (home_base); +CREATE INDEX gpolygonind ON polygon_tbl USING gist (f1); +CREATE INDEX gcircleind ON circle_tbl USING gist (f1); +INSERT INTO POINT_TBL(f1) VALUES (NULL); +CREATE INDEX gpointind ON point_tbl USING gist (f1); +CREATE TEMP TABLE gpolygon_tbl AS + SELECT polygon(home_base) AS f1 FROM slow_emp4000; +INSERT INTO gpolygon_tbl VALUES ( '(1000,0,0,1000)' ); +INSERT INTO gpolygon_tbl VALUES ( '(0,1000,1000,1000)' ); +CREATE TEMP TABLE gcircle_tbl AS + SELECT circle(home_base) AS f1 FROM slow_emp4000; +CREATE INDEX ggpolygonind ON gpolygon_tbl USING gist (f1); +CREATE INDEX ggcircleind ON gcircle_tbl USING gist (f1); +-- +-- Test GiST indexes +-- +-- get non-indexed results for comparison purposes +SET enable_seqscan = ON; +SET enable_indexscan = OFF; +SET enable_bitmapscan = OFF; +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; + home_base +----------------------- + (337,455),(240,359) + (1444,403),(1346,344) +(2 rows) + +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; + count +------- + 2 +(1 row) + +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; + count +------- + 278 +(1 row) + +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + f1 +--------------------- + ((2,0),(2,4),(0,0)) +(1 row) + +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + f1 +--------------- + <(1,2),3> + <(1,3),5> + <(1,2),100> + <(100,1),115> +(4 rows) + +SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; + count +------- + 2 +(1 row) + +SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; + count +------- + 2 +(1 row) + +SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; + count +------- + 3 +(1 row) + +SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; + count +------- + 5 +(1 row) + +SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; + count +------- + 4 +(1 row) + +SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; + count +------- + 5 +(1 row) + +SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; + count +------- + 1 +(1 row) + +SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; + f1 +------------------- + (0,0) + (1e-300,-1e-300) + (-3,4) + (-10,0) + (10,10) + (-5,-12) + (5.1,34.5) + (Infinity,1e+300) + (1e+300,Infinity) + (NaN,NaN) + +(11 rows) + +SELECT * FROM point_tbl WHERE f1 IS NULL; + f1 +---- + +(1 row) + +SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; + f1 +------------------- + (0,0) + (1e-300,-1e-300) + (-3,4) + (-10,0) + (10,10) + (-5,-12) + (5.1,34.5) + (1e+300,Infinity) + (Infinity,1e+300) + (NaN,NaN) +(10 rows) + +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; + f1 +------------------ + (0,0) + (1e-300,-1e-300) + (-3,4) + (-10,0) + (10,10) +(5 rows) + +SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; + f1 +------------------------------------------------- + ((240,359),(240,455),(337,455),(337,359)) + ((662,163),(662,187),(759,187),(759,163)) + ((1000,0),(0,1000)) + ((0,1000),(1000,1000)) + ((1346,344),(1346,403),(1444,403),(1444,344)) + ((278,1409),(278,1457),(369,1457),(369,1409)) + ((907,1156),(907,1201),(948,1201),(948,1156)) + ((1517,971),(1517,1043),(1594,1043),(1594,971)) + ((175,1820),(175,1850),(259,1850),(259,1820)) + ((2424,81),(2424,160),(2424,160),(2424,81)) +(10 rows) + +SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; + circle_center | radius +----------------+-------- + (288.5,407) | 68 + (710.5,175) | 50 + (323.5,1433) | 51 + (927.5,1178.5) | 30 + (1395,373.5) | 57 + (1555.5,1007) | 53 + (217,1835) | 45 + (489,2421.5) | 22 + (2424,120.5) | 40 + (751.5,2655) | 20 +(10 rows) + +-- Now check the results from plain indexscan +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; +EXPLAIN (COSTS OFF) +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; + QUERY PLAN +----------------------------------------------------------------- + Sort + Sort Key: ((home_base[0])[0]) + -> Index Only Scan using grect2ind on fast_emp4000 + Index Cond: (home_base <@ '(2000,1000),(200,200)'::box) +(4 rows) + +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; + home_base +----------------------- + (337,455),(240,359) + (1444,403),(1346,344) +(2 rows) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; + QUERY PLAN +------------------------------------------------------------- + Aggregate + -> Index Only Scan using grect2ind on fast_emp4000 + Index Cond: (home_base && '(1000,1000),(0,0)'::box) +(3 rows) + +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; + count +------- + 2 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Index Only Scan using grect2ind on fast_emp4000 + Index Cond: (home_base IS NULL) +(3 rows) + +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; + count +------- + 278 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + QUERY PLAN +------------------------------------------------------------ + Sort + Sort Key: ((poly_center(f1))[0]) + -> Index Scan using gpolygonind on polygon_tbl + Index Cond: (f1 @> '((1,1),(2,2),(2,1))'::polygon) +(4 rows) + +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + f1 +--------------------- + ((2,0),(2,4),(0,0)) +(1 row) + +EXPLAIN (COSTS OFF) +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + QUERY PLAN +-------------------------------------------------- + Sort + Sort Key: (area(f1)) + -> Index Scan using gcircleind on circle_tbl + Index Cond: (f1 && '<(1,-2),1>'::circle) +(4 rows) + +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + f1 +--------------- + <(1,2),3> + <(1,3),5> + <(1,2),100> + <(100,1),115> +(4 rows) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Index Scan using ggpolygonind on gpolygon_tbl + Index Cond: (f1 && '((1000,1000),(0,0))'::polygon) +(3 rows) + +SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; + count +------- + 2 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Index Scan using ggcircleind on gcircle_tbl + Index Cond: (f1 && '<(500,500),500>'::circle) +(3 rows) + +SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; + count +------- + 2 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; + QUERY PLAN +---------------------------------------------------- + Aggregate + -> Index Only Scan using gpointind on point_tbl + Index Cond: (f1 <@ '(100,100),(0,0)'::box) +(3 rows) + +SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; + count +------- + 3 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; + QUERY PLAN +---------------------------------------------------- + Aggregate + -> Index Only Scan using gpointind on point_tbl + Index Cond: (f1 <@ '(100,100),(0,0)'::box) +(3 rows) + +SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; + count +------- + 3 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; + QUERY PLAN +---------------------------------------------------------------------------------------- + Aggregate + -> Index Only Scan using gpointind on point_tbl + Index Cond: (f1 <@ '((0,0),(0,100),(100,100),(50,50),(100,0),(0,0))'::polygon) +(3 rows) + +SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; + count +------- + 4 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; + QUERY PLAN +---------------------------------------------------- + Aggregate + -> Index Only Scan using gpointind on point_tbl + Index Cond: (f1 <@ '<(50,50),50>'::circle) +(3 rows) + +SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Index Only Scan using gpointind on point_tbl p + Index Cond: (f1 << '(0,0)'::point) +(3 rows) + +SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; + count +------- + 3 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Index Only Scan using gpointind on point_tbl p + Index Cond: (f1 >> '(0,0)'::point) +(3 rows) + +SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; + count +------- + 4 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Index Only Scan using gpointind on point_tbl p + Index Cond: (f1 <<| '(0,0)'::point) +(3 rows) + +SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Index Only Scan using gpointind on point_tbl p + Index Cond: (f1 |>> '(0,0)'::point) +(3 rows) + +SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; + count +------- + 5 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Index Only Scan using gpointind on point_tbl p + Index Cond: (f1 ~= '(-5,-12)'::point) +(3 rows) + +SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using gpointind on point_tbl + Order By: (f1 <-> '(0,1)'::point) +(2 rows) + +SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; + f1 +------------------- + (1e-300,-1e-300) + (0,0) + (-3,4) + (-10,0) + (10,10) + (-5,-12) + (5.1,34.5) + (Infinity,1e+300) + (1e+300,Infinity) + (NaN,NaN) + +(11 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl WHERE f1 IS NULL; + QUERY PLAN +---------------------------------------------- + Index Only Scan using gpointind on point_tbl + Index Cond: (f1 IS NULL) +(2 rows) + +SELECT * FROM point_tbl WHERE f1 IS NULL; + f1 +---- + +(1 row) + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using gpointind on point_tbl + Index Cond: (f1 IS NOT NULL) + Order By: (f1 <-> '(0,1)'::point) +(3 rows) + +SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; + f1 +------------------- + (1e-300,-1e-300) + (0,0) + (-3,4) + (-10,0) + (10,10) + (-5,-12) + (5.1,34.5) + (Infinity,1e+300) + (1e+300,Infinity) + (NaN,NaN) +(10 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; + QUERY PLAN +------------------------------------------------ + Index Only Scan using gpointind on point_tbl + Index Cond: (f1 <@ '(10,10),(-10,-10)'::box) + Order By: (f1 <-> '(0,1)'::point) +(3 rows) + +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; + f1 +------------------ + (1e-300,-1e-300) + (0,0) + (-3,4) + (-10,0) + (10,10) +(5 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; + QUERY PLAN +----------------------------------------------------- + Limit + -> Index Scan using ggpolygonind on gpolygon_tbl + Order By: (f1 <-> '(0,0)'::point) +(3 rows) + +SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; + f1 +------------------------------------------------- + ((240,359),(240,455),(337,455),(337,359)) + ((662,163),(662,187),(759,187),(759,163)) + ((1000,0),(0,1000)) + ((0,1000),(1000,1000)) + ((1346,344),(1346,403),(1444,403),(1444,344)) + ((278,1409),(278,1457),(369,1457),(369,1409)) + ((907,1156),(907,1201),(948,1201),(948,1156)) + ((1517,971),(1517,1043),(1594,1043),(1594,971)) + ((175,1820),(175,1850),(259,1850),(259,1820)) + ((2424,81),(2424,160),(2424,160),(2424,81)) +(10 rows) + +EXPLAIN (COSTS OFF) +SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; + QUERY PLAN +--------------------------------------------------- + Limit + -> Index Scan using ggcircleind on gcircle_tbl + Order By: (f1 <-> '(200,300)'::point) +(3 rows) + +SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; + circle_center | radius +----------------+-------- + (288.5,407) | 68 + (710.5,175) | 50 + (323.5,1433) | 51 + (927.5,1178.5) | 30 + (1395,373.5) | 57 + (1555.5,1007) | 53 + (217,1835) | 45 + (489,2421.5) | 22 + (2424,120.5) | 40 + (751.5,2655) | 20 +(10 rows) + +EXPLAIN (COSTS OFF) +SELECT point(x,x), (SELECT f1 FROM gpolygon_tbl ORDER BY f1 <-> point(x,x) LIMIT 1) as c FROM generate_series(0,10,1) x; + QUERY PLAN +-------------------------------------------------------------------------------------------- + Function Scan on generate_series x + SubPlan 1 + -> Limit + -> Index Scan using ggpolygonind on gpolygon_tbl + Order By: (f1 <-> point((x.x)::double precision, (x.x)::double precision)) +(5 rows) + +SELECT point(x,x), (SELECT f1 FROM gpolygon_tbl ORDER BY f1 <-> point(x,x) LIMIT 1) as c FROM generate_series(0,10,1) x; + point | c +---------+------------------------------------------- + (0,0) | ((240,359),(240,455),(337,455),(337,359)) + (1,1) | ((240,359),(240,455),(337,455),(337,359)) + (2,2) | ((240,359),(240,455),(337,455),(337,359)) + (3,3) | ((240,359),(240,455),(337,455),(337,359)) + (4,4) | ((240,359),(240,455),(337,455),(337,359)) + (5,5) | ((240,359),(240,455),(337,455),(337,359)) + (6,6) | ((240,359),(240,455),(337,455),(337,359)) + (7,7) | ((240,359),(240,455),(337,455),(337,359)) + (8,8) | ((240,359),(240,455),(337,455),(337,359)) + (9,9) | ((240,359),(240,455),(337,455),(337,359)) + (10,10) | ((240,359),(240,455),(337,455),(337,359)) +(11 rows) + +-- Now check the results from bitmap indexscan +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_bitmapscan = ON; +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; + QUERY PLAN +------------------------------------------------------------ + Sort + Sort Key: ((f1 <-> '(0,1)'::point)) + -> Bitmap Heap Scan on point_tbl + Recheck Cond: (f1 <@ '(10,10),(-10,-10)'::box) + -> Bitmap Index Scan on gpointind + Index Cond: (f1 <@ '(10,10),(-10,-10)'::box) +(6 rows) + +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; + f1 +------------------ + (0,0) + (1e-300,-1e-300) + (-3,4) + (-10,0) + (10,10) +(5 rows) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; +-- +-- GIN over int[] and text[] +-- +-- Note: GIN currently supports only bitmap scans, not plain indexscans +-- +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_bitmapscan = ON; +CREATE INDEX intarrayidx ON array_index_op_test USING gin (i); +explain (costs off) +SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; + QUERY PLAN +---------------------------------------------------- + Sort + Sort Key: seqno + -> Bitmap Heap Scan on array_index_op_test + Recheck Cond: (i @> '{32}'::integer[]) + -> Bitmap Index Scan on intarrayidx + Index Cond: (i @> '{32}'::integer[]) +(6 rows) + +SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(6 rows) + +SELECT * FROM array_index_op_test WHERE i && '{32}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(6 rows) + +SELECT * FROM array_index_op_test WHERE i @> '{17}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 53 | {38,17} | {AAAAAAAAAAA21658} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} +(8 rows) + +SELECT * FROM array_index_op_test WHERE i && '{17}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 53 | {38,17} | {AAAAAAAAAAA21658} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} +(8 rows) + +SELECT * FROM array_index_op_test WHERE i @> '{32,17}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} +(3 rows) + +SELECT * FROM array_index_op_test WHERE i && '{32,17}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 53 | {38,17} | {AAAAAAAAAAA21658} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(11 rows) + +SELECT * FROM array_index_op_test WHERE i <@ '{38,34,32,89}' ORDER BY seqno; + seqno | i | t +-------+---------------+---------------------------------------------------------------------------------------------------------------------------- + 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 101 | {} | {} +(4 rows) + +SELECT * FROM array_index_op_test WHERE i = '{47,77}' ORDER BY seqno; + seqno | i | t +-------+---------+----------------------------------------------------------------------------------------------------------------- + 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} +(1 row) + +SELECT * FROM array_index_op_test WHERE i = '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +SELECT * FROM array_index_op_test WHERE i @> '{}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | {92,75,71,52,64,83} | {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} + 2 | {3,6} | {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} + 3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} + 4 | {71,39,99,55,33,75,45} | {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} + 5 | {50,42,77,50,4} | {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 7 | {12,51,88,64,8} | {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} + 8 | {60,84} | {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} + 9 | {56,52,35,27,80,44,81,22} | {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} + 10 | {71,5,45} | {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} + 11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 13 | {3,52,34,23} | {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} + 14 | {78,57,19} | {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 16 | {14,63,85,11} | {AAAAAA66777} + 17 | {7,10,81,85} | {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} + 18 | {1} | {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 20 | {72,89,70,51,54,37,8,49,79} | {AAAAAA58494} + 21 | {2,8,65,10,5,79,43} | {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} + 24 | {94,61,99,35,48} | {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} + 25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449} + 26 | {71,10,9,69,75} | {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} + 27 | {94} | {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} + 28 | {14,33,6,34,14} | {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} + 29 | {39,21} | {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} + 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} + 31 | {80,24,18,21,54} | {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} + 32 | {58,79,82,80,67,75,98,10,41} | {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} + 33 | {74,73} | {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} + 34 | {70,45} | {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} + 35 | {23,40} | {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} + 36 | {79,82,14,52,30,5,79} | {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} + 37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} + 38 | {59,5,4,95,28} | {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} + 39 | {82,43,99,16,74} | {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} + 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} + 41 | {19,26,63,12,93,73,27,94} | {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} + 42 | {15,76,82,75,8,91} | {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} + 43 | {39,87,91,97,79,28} | {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} + 44 | {40,58,68,29,54} | {AAAAAAA81898,AAAAAA66777,AAAAAA98232} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 46 | {53,24} | {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} + 47 | {98,23,64,12,75,61} | {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} + 48 | {76,14} | {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} + 49 | {56,5,54,37,49} | {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} + 50 | {20,12,37,64,93} | {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} + 51 | {47} | {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} + 52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} + 53 | {38,17} | {AAAAAAAAAAA21658} + 54 | {70,47} | {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} + 55 | {47,79,47,64,72,25,71,24,93} | {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} + 56 | {33,7,60,54,93,90,77,85,39} | {AAAAAAAAAAAAAAAAAA32918,AA42406} + 57 | {23,45,10,42,36,21,9,96} | {AAAAAAAAAAAAAAAAAAA70415} + 58 | {92} | {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} + 59 | {9,69,46,77} | {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} + 60 | {62,2,59,38,89} | {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} + 61 | {72,2,44,95,54,54,13} | {AAAAAAAAAAAAAAAAAAA91804} + 62 | {83,72,29,73} | {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} + 63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} + 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 66 | {31,23,70,52,4,33,48,25} | {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} + 67 | {31,94,7,10} | {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} + 68 | {90,43,38} | {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} + 69 | {67,35,99,85,72,86,44} | {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} + 70 | {56,70,83} | {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} + 71 | {74,26} | {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 73 | {88,25,96,78,65,15,29,19} | {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 75 | {12,96,83,24,71,89,55} | {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} + 76 | {92,55,10,7} | {AAAAAAAAAAAAAAA67062} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 78 | {55,89,44,84,34} | {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 80 | {74,89,44,80,0} | {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} + 81 | {63,77,54,48,61,53,97} | {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} + 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} + 83 | {14,10} | {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} + 84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} + 85 | {39,60} | {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} + 86 | {33,81,72,74,45,36,82} | {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} + 87 | {57,27,50,12,97,68} | {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} + 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 90 | {88,75} | {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} + 91 | {78} | {AAAAAAAAAAAAA62007,AAA99043} + 92 | {85,63,49,45} | {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} + 93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} + 94 | {98,9,85,62,88,91,60,61,38,86} | {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} + 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} + 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 99 | {37,86} | {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} + 101 | {} | {} + 102 | {NULL} | {NULL} +(102 rows) + +SELECT * FROM array_index_op_test WHERE i && '{}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_index_op_test WHERE i <@ '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; + seqno | i | t +-------+--------+-------- + 102 | {NULL} | {NULL} +(1 row) + +SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +CREATE INDEX textarrayidx ON array_index_op_test USING gin (t); +explain (costs off) +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; + QUERY PLAN +------------------------------------------------------------ + Sort + Sort Key: seqno + -> Bitmap Heap Scan on array_index_op_test + Recheck Cond: (t @> '{AAAAAAAA72908}'::text[]) + -> Bitmap Index Scan on textarrayidx + Index Cond: (t @> '{AAAAAAAA72908}'::text[]) +(6 rows) + +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; + seqno | i | t +-------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} +(4 rows) + +SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno; + seqno | i | t +-------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} +(4 rows) + +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno; + seqno | i | t +-------+------------------+-------------------------------------------------------------------- + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} +(3 rows) + +SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno; + seqno | i | t +-------+------------------+-------------------------------------------------------------------- + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} +(3 rows) + +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; + seqno | i | t +-------+------+-------------------------------------------------------------------- + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} +(1 row) + +SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; + seqno | i | t +-------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} +(6 rows) + +SELECT * FROM array_index_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}' ORDER BY seqno; + seqno | i | t +-------+--------------------+----------------------------------------------------------------------------------------------------------- + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 101 | {} | {} +(3 rows) + +SELECT * FROM array_index_op_test WHERE t = '{AAAAAAAAAA646,A87088}' ORDER BY seqno; + seqno | i | t +-------+------------+------------------------ + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} +(1 row) + +SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +SELECT * FROM array_index_op_test WHERE t @> '{}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | {92,75,71,52,64,83} | {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} + 2 | {3,6} | {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} + 3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} + 4 | {71,39,99,55,33,75,45} | {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} + 5 | {50,42,77,50,4} | {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 7 | {12,51,88,64,8} | {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} + 8 | {60,84} | {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} + 9 | {56,52,35,27,80,44,81,22} | {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} + 10 | {71,5,45} | {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} + 11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} + 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} + 13 | {3,52,34,23} | {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} + 14 | {78,57,19} | {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} + 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} + 16 | {14,63,85,11} | {AAAAAA66777} + 17 | {7,10,81,85} | {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} + 18 | {1} | {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 20 | {72,89,70,51,54,37,8,49,79} | {AAAAAA58494} + 21 | {2,8,65,10,5,79,43} | {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} + 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} + 23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} + 24 | {94,61,99,35,48} | {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} + 25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449} + 26 | {71,10,9,69,75} | {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} + 27 | {94} | {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} + 28 | {14,33,6,34,14} | {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} + 29 | {39,21} | {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} + 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} + 31 | {80,24,18,21,54} | {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} + 32 | {58,79,82,80,67,75,98,10,41} | {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} + 33 | {74,73} | {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} + 34 | {70,45} | {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} + 35 | {23,40} | {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} + 36 | {79,82,14,52,30,5,79} | {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} + 37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} + 38 | {59,5,4,95,28} | {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} + 39 | {82,43,99,16,74} | {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} + 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} + 41 | {19,26,63,12,93,73,27,94} | {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} + 42 | {15,76,82,75,8,91} | {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} + 43 | {39,87,91,97,79,28} | {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} + 44 | {40,58,68,29,54} | {AAAAAAA81898,AAAAAA66777,AAAAAA98232} + 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} + 46 | {53,24} | {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} + 47 | {98,23,64,12,75,61} | {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} + 48 | {76,14} | {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} + 49 | {56,5,54,37,49} | {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} + 50 | {20,12,37,64,93} | {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} + 51 | {47} | {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} + 52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} + 53 | {38,17} | {AAAAAAAAAAA21658} + 54 | {70,47} | {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} + 55 | {47,79,47,64,72,25,71,24,93} | {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} + 56 | {33,7,60,54,93,90,77,85,39} | {AAAAAAAAAAAAAAAAAA32918,AA42406} + 57 | {23,45,10,42,36,21,9,96} | {AAAAAAAAAAAAAAAAAAA70415} + 58 | {92} | {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} + 59 | {9,69,46,77} | {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} + 60 | {62,2,59,38,89} | {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} + 61 | {72,2,44,95,54,54,13} | {AAAAAAAAAAAAAAAAAAA91804} + 62 | {83,72,29,73} | {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} + 63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} + 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} + 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} + 66 | {31,23,70,52,4,33,48,25} | {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} + 67 | {31,94,7,10} | {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} + 68 | {90,43,38} | {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} + 69 | {67,35,99,85,72,86,44} | {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} + 70 | {56,70,83} | {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} + 71 | {74,26} | {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} + 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} + 73 | {88,25,96,78,65,15,29,19} | {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 75 | {12,96,83,24,71,89,55} | {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} + 76 | {92,55,10,7} | {AAAAAAAAAAAAAAA67062} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 78 | {55,89,44,84,34} | {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} + 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} + 80 | {74,89,44,80,0} | {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} + 81 | {63,77,54,48,61,53,97} | {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} + 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} + 83 | {14,10} | {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} + 84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} + 85 | {39,60} | {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} + 86 | {33,81,72,74,45,36,82} | {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} + 87 | {57,27,50,12,97,68} | {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} + 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 90 | {88,75} | {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} + 91 | {78} | {AAAAAAAAAAAAA62007,AAA99043} + 92 | {85,63,49,45} | {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} + 93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} + 94 | {98,9,85,62,88,91,60,61,38,86} | {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} + 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} + 96 | {23,97,43} | {AAAAAAAAAA646,A87088} + 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 99 | {37,86} | {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} + 101 | {} | {} + 102 | {NULL} | {NULL} +(102 rows) + +SELECT * FROM array_index_op_test WHERE t && '{}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_index_op_test WHERE t <@ '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +-- And try it with a multicolumn GIN index +DROP INDEX intarrayidx, textarrayidx; +CREATE INDEX botharrayidx ON array_index_op_test USING gin (i, t); +SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(6 rows) + +SELECT * FROM array_index_op_test WHERE i && '{32}' ORDER BY seqno; + seqno | i | t +-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ + 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} + 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} + 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} + 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} + 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(6 rows) + +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAA80240}' ORDER BY seqno; + seqno | i | t +-------+--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------- + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} + 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} + 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} + 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} + 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(7 rows) + +SELECT * FROM array_index_op_test WHERE t && '{AAAAAAA80240}' ORDER BY seqno; + seqno | i | t +-------+--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------- + 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} + 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} + 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} + 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} + 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} + 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(7 rows) + +SELECT * FROM array_index_op_test WHERE i @> '{32}' AND t && '{AAAAAAA80240}' ORDER BY seqno; + seqno | i | t +-------+-----------------------------+------------------------------------------------------------------------------ + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(1 row) + +SELECT * FROM array_index_op_test WHERE i && '{32}' AND t @> '{AAAAAAA80240}' ORDER BY seqno; + seqno | i | t +-------+-----------------------------+------------------------------------------------------------------------------ + 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} +(1 row) + +SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; + seqno | i | t +-------+--------+-------- + 102 | {NULL} | {NULL} +(1 row) + +SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; +-- +-- Try a GIN index with a lot of items with same key. (GIN creates a posting +-- tree when there are enough duplicates) +-- +CREATE TABLE array_gin_test (a int[]); +INSERT INTO array_gin_test SELECT ARRAY[1, g%5, g] FROM generate_series(1, 10000) g; +CREATE INDEX array_gin_test_idx ON array_gin_test USING gin (a); +SELECT COUNT(*) FROM array_gin_test WHERE a @> '{2}'; + count +------- + 2000 +(1 row) + +DROP TABLE array_gin_test; +-- +-- Test GIN index's reloptions +-- +CREATE INDEX gin_relopts_test ON array_index_op_test USING gin (i) + WITH (FASTUPDATE=on, GIN_PENDING_LIST_LIMIT=128); +\d+ gin_relopts_test + Index "public.gin_relopts_test" + Column | Type | Key? | Definition | Storage | Stats target +--------+---------+------+------------+---------+-------------- + i | integer | yes | i | plain | +gin, for table "public.array_index_op_test" +Options: fastupdate=on, gin_pending_list_limit=128 + +-- +-- HASH +-- +CREATE INDEX hash_i4_index ON hash_i4_heap USING hash (random int4_ops); +CREATE INDEX hash_name_index ON hash_name_heap USING hash (random name_ops); +CREATE INDEX hash_txt_index ON hash_txt_heap USING hash (random text_ops); +CREATE INDEX hash_f8_index ON hash_f8_heap USING hash (random float8_ops) WITH (fillfactor=60); +CREATE UNLOGGED TABLE unlogged_hash_table (id int4); +CREATE INDEX unlogged_hash_index ON unlogged_hash_table USING hash (id int4_ops); +DROP TABLE unlogged_hash_table; +-- CREATE INDEX hash_ovfl_index ON hash_ovfl_heap USING hash (x int4_ops); +-- Test hash index build tuplesorting. Force hash tuplesort using low +-- maintenance_work_mem setting and fillfactor: +SET maintenance_work_mem = '1MB'; +CREATE INDEX hash_tuplesort_idx ON tenk1 USING hash (stringu1 name_ops) WITH (fillfactor = 10); +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on tenk1 + Recheck Cond: (stringu1 = 'TVAAAA'::name) + -> Bitmap Index Scan on hash_tuplesort_idx + Index Cond: (stringu1 = 'TVAAAA'::name) +(5 rows) + +SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; + count +------- + 14 +(1 row) + +DROP INDEX hash_tuplesort_idx; +RESET maintenance_work_mem; +-- +-- Test functional index +-- +CREATE TABLE func_index_heap (f1 text, f2 text); +CREATE UNIQUE INDEX func_index_index on func_index_heap (textcat(f1,f2)); +INSERT INTO func_index_heap VALUES('ABC','DEF'); +INSERT INTO func_index_heap VALUES('AB','CDEFG'); +INSERT INTO func_index_heap VALUES('QWE','RTY'); +-- this should fail because of unique index: +INSERT INTO func_index_heap VALUES('ABCD', 'EF'); +ERROR: duplicate key value violates unique constraint "func_index_index" +DETAIL: Key (textcat(f1, f2))=(ABCDEF) already exists. +-- but this shouldn't: +INSERT INTO func_index_heap VALUES('QWERTY'); +-- while we're here, see that the metadata looks sane +\d func_index_heap + Table "public.func_index_heap" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + f1 | text | | | + f2 | text | | | +Indexes: + "func_index_index" UNIQUE, btree (textcat(f1, f2)) + +\d func_index_index + Index "public.func_index_index" + Column | Type | Key? | Definition +---------+------+------+----------------- + textcat | text | yes | textcat(f1, f2) +unique, btree, for table "public.func_index_heap" + +-- +-- Same test, expressional index +-- +DROP TABLE func_index_heap; +CREATE TABLE func_index_heap (f1 text, f2 text); +CREATE UNIQUE INDEX func_index_index on func_index_heap ((f1 || f2) text_ops); +INSERT INTO func_index_heap VALUES('ABC','DEF'); +INSERT INTO func_index_heap VALUES('AB','CDEFG'); +INSERT INTO func_index_heap VALUES('QWE','RTY'); +-- this should fail because of unique index: +INSERT INTO func_index_heap VALUES('ABCD', 'EF'); +ERROR: duplicate key value violates unique constraint "func_index_index" +DETAIL: Key ((f1 || f2))=(ABCDEF) already exists. +-- but this shouldn't: +INSERT INTO func_index_heap VALUES('QWERTY'); +-- while we're here, see that the metadata looks sane +\d func_index_heap + Table "public.func_index_heap" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + f1 | text | | | + f2 | text | | | +Indexes: + "func_index_index" UNIQUE, btree ((f1 || f2)) + +\d func_index_index + Index "public.func_index_index" + Column | Type | Key? | Definition +--------+------+------+------------ + expr | text | yes | (f1 || f2) +unique, btree, for table "public.func_index_heap" + +-- this should fail because of unsafe column type (anonymous record) +create index on func_index_heap ((f1 || f2), (row(f1, f2))); +ERROR: column "row" has pseudo-type record +-- +-- Test unique index with included columns +-- +CREATE TABLE covering_index_heap (f1 int, f2 int, f3 text); +CREATE UNIQUE INDEX covering_index_index on covering_index_heap (f1,f2) INCLUDE(f3); +INSERT INTO covering_index_heap VALUES(1,1,'AAA'); +INSERT INTO covering_index_heap VALUES(1,2,'AAA'); +-- this should fail because of unique index on f1,f2: +INSERT INTO covering_index_heap VALUES(1,2,'BBB'); +ERROR: duplicate key value violates unique constraint "covering_index_index" +DETAIL: Key (f1, f2)=(1, 2) already exists. +-- and this shouldn't: +INSERT INTO covering_index_heap VALUES(1,4,'AAA'); +-- Try to build index on table that already contains data +CREATE UNIQUE INDEX covering_pkey on covering_index_heap (f1,f2) INCLUDE(f3); +-- Try to use existing covering index as primary key +ALTER TABLE covering_index_heap ADD CONSTRAINT covering_pkey PRIMARY KEY USING INDEX +covering_pkey; +DROP TABLE covering_index_heap; +-- +-- Also try building functional, expressional, and partial indexes on +-- tables that already contain data. +-- +create unique index hash_f8_index_1 on hash_f8_heap(abs(random)); +create unique index hash_f8_index_2 on hash_f8_heap((seqno + 1), random); +create unique index hash_f8_index_3 on hash_f8_heap(random) where seqno > 1000; +-- +-- Try some concurrent index builds +-- +-- Unfortunately this only tests about half the code paths because there are +-- no concurrent updates happening to the table at the same time. +CREATE TABLE concur_heap (f1 text, f2 text); +-- empty table +CREATE INDEX CONCURRENTLY concur_index1 ON concur_heap(f2,f1); +CREATE INDEX CONCURRENTLY IF NOT EXISTS concur_index1 ON concur_heap(f2,f1); +NOTICE: relation "concur_index1" already exists, skipping +INSERT INTO concur_heap VALUES ('a','b'); +INSERT INTO concur_heap VALUES ('b','b'); +-- unique index +CREATE UNIQUE INDEX CONCURRENTLY concur_index2 ON concur_heap(f1); +CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS concur_index2 ON concur_heap(f1); +NOTICE: relation "concur_index2" already exists, skipping +-- check if constraint is set up properly to be enforced +INSERT INTO concur_heap VALUES ('b','x'); +ERROR: duplicate key value violates unique constraint "concur_index2" +DETAIL: Key (f1)=(b) already exists. +-- check if constraint is enforced properly at build time +CREATE UNIQUE INDEX CONCURRENTLY concur_index3 ON concur_heap(f2); +ERROR: could not create unique index "concur_index3" +DETAIL: Key (f2)=(b) is duplicated. +-- test that expression indexes and partial indexes work concurrently +CREATE INDEX CONCURRENTLY concur_index4 on concur_heap(f2) WHERE f1='a'; +CREATE INDEX CONCURRENTLY concur_index5 on concur_heap(f2) WHERE f1='x'; +-- here we also check that you can default the index name +CREATE INDEX CONCURRENTLY on concur_heap((f2||f1)); +-- You can't do a concurrent index build in a transaction +BEGIN; +CREATE INDEX CONCURRENTLY concur_index7 ON concur_heap(f1); +ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block +COMMIT; +-- test where predicate is able to do a transactional update during +-- a concurrent build before switching pg_index state flags. +CREATE FUNCTION predicate_stable() RETURNS bool IMMUTABLE +LANGUAGE plpgsql AS $$ +BEGIN + EXECUTE 'SELECT txid_current()'; + RETURN true; +END; $$; +CREATE INDEX CONCURRENTLY concur_index8 ON concur_heap (f1) + WHERE predicate_stable(); +DROP INDEX concur_index8; +DROP FUNCTION predicate_stable(); +-- But you can do a regular index build in a transaction +BEGIN; +CREATE INDEX std_index on concur_heap(f2); +COMMIT; +-- Failed builds are left invalid by VACUUM FULL, fixed by REINDEX +VACUUM FULL concur_heap; +REINDEX TABLE concur_heap; +ERROR: could not create unique index "concur_index3" +DETAIL: Key (f2)=(b) is duplicated. +DELETE FROM concur_heap WHERE f1 = 'b'; +VACUUM FULL concur_heap; +\d concur_heap + Table "public.concur_heap" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + f1 | text | | | + f2 | text | | | +Indexes: + "concur_heap_expr_idx" btree ((f2 || f1)) + "concur_index1" btree (f2, f1) + "concur_index2" UNIQUE, btree (f1) + "concur_index3" UNIQUE, btree (f2) INVALID + "concur_index4" btree (f2) WHERE f1 = 'a'::text + "concur_index5" btree (f2) WHERE f1 = 'x'::text + "std_index" btree (f2) + +REINDEX TABLE concur_heap; +\d concur_heap + Table "public.concur_heap" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + f1 | text | | | + f2 | text | | | +Indexes: + "concur_heap_expr_idx" btree ((f2 || f1)) + "concur_index1" btree (f2, f1) + "concur_index2" UNIQUE, btree (f1) + "concur_index3" UNIQUE, btree (f2) + "concur_index4" btree (f2) WHERE f1 = 'a'::text + "concur_index5" btree (f2) WHERE f1 = 'x'::text + "std_index" btree (f2) + +-- Temporary tables with concurrent builds and on-commit actions +-- CONCURRENTLY used with CREATE INDEX and DROP INDEX is ignored. +-- PRESERVE ROWS, the default. +CREATE TEMP TABLE concur_temp (f1 int, f2 text) + ON COMMIT PRESERVE ROWS; +INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); +CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); +DROP INDEX CONCURRENTLY concur_temp_ind; +DROP TABLE concur_temp; +-- ON COMMIT DROP +BEGIN; +CREATE TEMP TABLE concur_temp (f1 int, f2 text) + ON COMMIT DROP; +INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); +-- Fails when running in a transaction. +CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); +ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block +COMMIT; +-- ON COMMIT DELETE ROWS +CREATE TEMP TABLE concur_temp (f1 int, f2 text) + ON COMMIT DELETE ROWS; +INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); +CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); +DROP INDEX CONCURRENTLY concur_temp_ind; +DROP TABLE concur_temp; +-- +-- Try some concurrent index drops +-- +DROP INDEX CONCURRENTLY "concur_index2"; -- works +DROP INDEX CONCURRENTLY IF EXISTS "concur_index2"; -- notice +NOTICE: index "concur_index2" does not exist, skipping +-- failures +DROP INDEX CONCURRENTLY "concur_index2", "concur_index3"; +ERROR: DROP INDEX CONCURRENTLY does not support dropping multiple objects +BEGIN; +DROP INDEX CONCURRENTLY "concur_index5"; +ERROR: DROP INDEX CONCURRENTLY cannot run inside a transaction block +ROLLBACK; +-- successes +DROP INDEX CONCURRENTLY IF EXISTS "concur_index3"; +DROP INDEX CONCURRENTLY "concur_index4"; +DROP INDEX CONCURRENTLY "concur_index5"; +DROP INDEX CONCURRENTLY "concur_index1"; +DROP INDEX CONCURRENTLY "concur_heap_expr_idx"; +\d concur_heap + Table "public.concur_heap" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + f1 | text | | | + f2 | text | | | +Indexes: + "std_index" btree (f2) + +DROP TABLE concur_heap; +-- +-- Test ADD CONSTRAINT USING INDEX +-- +CREATE TABLE cwi_test( a int , b varchar(10), c char); +-- add some data so that all tests have something to work with. +INSERT INTO cwi_test VALUES(1, 2), (3, 4), (5, 6); +CREATE UNIQUE INDEX cwi_uniq_idx ON cwi_test(a , b); +ALTER TABLE cwi_test ADD primary key USING INDEX cwi_uniq_idx; +\d cwi_test + Table "public.cwi_test" + Column | Type | Collation | Nullable | Default +--------+-----------------------+-----------+----------+--------- + a | integer | | not null | + b | character varying(10) | | not null | + c | character(1) | | | +Indexes: + "cwi_uniq_idx" PRIMARY KEY, btree (a, b) + +\d cwi_uniq_idx + Index "public.cwi_uniq_idx" + Column | Type | Key? | Definition +--------+-----------------------+------+------------ + a | integer | yes | a + b | character varying(10) | yes | b +primary key, btree, for table "public.cwi_test" + +CREATE UNIQUE INDEX cwi_uniq2_idx ON cwi_test(b , a); +ALTER TABLE cwi_test DROP CONSTRAINT cwi_uniq_idx, + ADD CONSTRAINT cwi_replaced_pkey PRIMARY KEY + USING INDEX cwi_uniq2_idx; +NOTICE: ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index "cwi_uniq2_idx" to "cwi_replaced_pkey" +\d cwi_test + Table "public.cwi_test" + Column | Type | Collation | Nullable | Default +--------+-----------------------+-----------+----------+--------- + a | integer | | not null | + b | character varying(10) | | not null | + c | character(1) | | | +Indexes: + "cwi_replaced_pkey" PRIMARY KEY, btree (b, a) + +\d cwi_replaced_pkey + Index "public.cwi_replaced_pkey" + Column | Type | Key? | Definition +--------+-----------------------+------+------------ + b | character varying(10) | yes | b + a | integer | yes | a +primary key, btree, for table "public.cwi_test" + +DROP INDEX cwi_replaced_pkey; -- Should fail; a constraint depends on it +ERROR: cannot drop index cwi_replaced_pkey because constraint cwi_replaced_pkey on table cwi_test requires it +HINT: You can drop constraint cwi_replaced_pkey on table cwi_test instead. +-- Check that non-default index options are rejected +CREATE UNIQUE INDEX cwi_uniq3_idx ON cwi_test(a desc); +ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq3_idx; -- fail +ERROR: index "cwi_uniq3_idx" column number 1 does not have default sorting behavior +LINE 1: ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq3_idx; + ^ +DETAIL: Cannot create a primary key or unique constraint using such an index. +CREATE UNIQUE INDEX cwi_uniq4_idx ON cwi_test(b collate "POSIX"); +ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq4_idx; -- fail +ERROR: index "cwi_uniq4_idx" column number 1 does not have default sorting behavior +LINE 1: ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq4_idx; + ^ +DETAIL: Cannot create a primary key or unique constraint using such an index. +DROP TABLE cwi_test; +-- ADD CONSTRAINT USING INDEX is forbidden on partitioned tables +CREATE TABLE cwi_test(a int) PARTITION BY hash (a); +create unique index on cwi_test (a); +alter table cwi_test add primary key using index cwi_test_a_idx ; +ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables +DROP TABLE cwi_test; +-- +-- Check handling of indexes on system columns +-- +CREATE TABLE syscol_table (a INT); +-- System columns cannot be indexed +CREATE INDEX ON syscolcol_table (ctid); +ERROR: relation "syscolcol_table" does not exist +-- nor used in expressions +CREATE INDEX ON syscol_table ((ctid >= '(1000,0)')); +ERROR: index creation on system columns is not supported +-- nor used in predicates +CREATE INDEX ON syscol_table (a) WHERE ctid >= '(1000,0)'; +ERROR: index creation on system columns is not supported +DROP TABLE syscol_table; +-- +-- Tests for IS NULL/IS NOT NULL with b-tree indexes +-- +CREATE TABLE onek_with_null AS SELECT unique1, unique2 FROM onek; +INSERT INTO onek_with_null (unique1,unique2) VALUES (NULL, -1), (NULL, NULL); +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2,unique1); +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = ON; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; + count +------- + 2 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; + count +------- + 1 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; + count +------- + 1000 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; + count +------- + 1 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; + count +------- + 499 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; + count +------- + 0 +(1 row) + +DROP INDEX onek_nulltest; +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 desc,unique1); +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; + count +------- + 2 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; + count +------- + 1 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; + count +------- + 1000 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; + count +------- + 1 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; + count +------- + 499 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; + count +------- + 0 +(1 row) + +DROP INDEX onek_nulltest; +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 desc nulls last,unique1); +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; + count +------- + 2 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; + count +------- + 1 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; + count +------- + 1000 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; + count +------- + 1 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; + count +------- + 499 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; + count +------- + 0 +(1 row) + +DROP INDEX onek_nulltest; +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 nulls first,unique1); +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; + count +------- + 2 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; + count +------- + 1 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; + count +------- + 1000 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; + count +------- + 1 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; + count +------- + 499 +(1 row) + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; + count +------- + 0 +(1 row) + +DROP INDEX onek_nulltest; +-- Check initial-positioning logic too +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2); +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; +SELECT unique1, unique2 FROM onek_with_null + ORDER BY unique2 LIMIT 2; + unique1 | unique2 +---------+--------- + | -1 + 147 | 0 +(2 rows) + +SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= -1 + ORDER BY unique2 LIMIT 2; + unique1 | unique2 +---------+--------- + | -1 + 147 | 0 +(2 rows) + +SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= 0 + ORDER BY unique2 LIMIT 2; + unique1 | unique2 +---------+--------- + 147 | 0 + 931 | 1 +(2 rows) + +SELECT unique1, unique2 FROM onek_with_null + ORDER BY unique2 DESC LIMIT 2; + unique1 | unique2 +---------+--------- + | + 278 | 999 +(2 rows) + +SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= -1 + ORDER BY unique2 DESC LIMIT 2; + unique1 | unique2 +---------+--------- + 278 | 999 + 0 | 998 +(2 rows) + +SELECT unique1, unique2 FROM onek_with_null WHERE unique2 < 999 + ORDER BY unique2 DESC LIMIT 2; + unique1 | unique2 +---------+--------- + 0 | 998 + 744 | 997 +(2 rows) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; +DROP TABLE onek_with_null; +-- +-- Check bitmap index path planning +-- +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 + WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3 OR tenthous = 42); + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------- + Bitmap Heap Scan on tenk1 + Recheck Cond: (((thousand = 42) AND (tenthous = 1)) OR ((thousand = 42) AND (tenthous = 3)) OR ((thousand = 42) AND (tenthous = 42))) + -> BitmapOr + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: ((thousand = 42) AND (tenthous = 1)) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: ((thousand = 42) AND (tenthous = 3)) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: ((thousand = 42) AND (tenthous = 42)) +(9 rows) + +SELECT * FROM tenk1 + WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3 OR tenthous = 42); + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 42 | 5530 | 0 | 2 | 2 | 2 | 42 | 42 | 42 | 42 | 42 | 84 | 85 | QBAAAA | SEIAAA | OOOOxx +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 + WHERE hundred = 42 AND (thousand = 42 OR thousand = 99); + QUERY PLAN +--------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on tenk1 + Recheck Cond: ((hundred = 42) AND ((thousand = 42) OR (thousand = 99))) + -> BitmapAnd + -> Bitmap Index Scan on tenk1_hundred + Index Cond: (hundred = 42) + -> BitmapOr + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (thousand = 42) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (thousand = 99) +(11 rows) + +SELECT count(*) FROM tenk1 + WHERE hundred = 42 AND (thousand = 42 OR thousand = 99); + count +------- + 10 +(1 row) + +-- +-- Check behavior with duplicate index column contents +-- +CREATE TABLE dupindexcols AS + SELECT unique1 as id, stringu2::text as f1 FROM tenk1; +CREATE INDEX dupindexcols_i ON dupindexcols (f1, id, f1 text_pattern_ops); +ANALYZE dupindexcols; +EXPLAIN (COSTS OFF) + SELECT count(*) FROM dupindexcols + WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on dupindexcols + Recheck Cond: ((f1 >= 'WA'::text) AND (f1 <= 'ZZZ'::text) AND (id < 1000) AND (f1 ~<~ 'YX'::text)) + -> Bitmap Index Scan on dupindexcols_i + Index Cond: ((f1 >= 'WA'::text) AND (f1 <= 'ZZZ'::text) AND (id < 1000) AND (f1 ~<~ 'YX'::text)) +(5 rows) + +SELECT count(*) FROM dupindexcols + WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; + count +------- + 97 +(1 row) + +-- +-- Check ordering of =ANY indexqual results (bug in 9.2.0) +-- +vacuum tenk1; -- ensure we get consistent plans here +explain (costs off) +SELECT unique1 FROM tenk1 +WHERE unique1 IN (1,42,7) +ORDER BY unique1; + QUERY PLAN +------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = ANY ('{1,42,7}'::integer[])) +(2 rows) + +SELECT unique1 FROM tenk1 +WHERE unique1 IN (1,42,7) +ORDER BY unique1; + unique1 +--------- + 1 + 7 + 42 +(3 rows) + +explain (costs off) +SELECT thousand, tenthous FROM tenk1 +WHERE thousand < 2 AND tenthous IN (1001,3000) +ORDER BY thousand; + QUERY PLAN +------------------------------------------------------- + Index Only Scan using tenk1_thous_tenthous on tenk1 + Index Cond: (thousand < 2) + Filter: (tenthous = ANY ('{1001,3000}'::integer[])) +(3 rows) + +SELECT thousand, tenthous FROM tenk1 +WHERE thousand < 2 AND tenthous IN (1001,3000) +ORDER BY thousand; + thousand | tenthous +----------+---------- + 0 | 3000 + 1 | 1001 +(2 rows) + +SET enable_indexonlyscan = OFF; +explain (costs off) +SELECT thousand, tenthous FROM tenk1 +WHERE thousand < 2 AND tenthous IN (1001,3000) +ORDER BY thousand; + QUERY PLAN +-------------------------------------------------------------------------------------- + Sort + Sort Key: thousand + -> Index Scan using tenk1_thous_tenthous on tenk1 + Index Cond: ((thousand < 2) AND (tenthous = ANY ('{1001,3000}'::integer[]))) +(4 rows) + +SELECT thousand, tenthous FROM tenk1 +WHERE thousand < 2 AND tenthous IN (1001,3000) +ORDER BY thousand; + thousand | tenthous +----------+---------- + 0 | 3000 + 1 | 1001 +(2 rows) + +RESET enable_indexonlyscan; +-- +-- Check elimination of constant-NULL subexpressions +-- +explain (costs off) + select * from tenk1 where (thousand, tenthous) in ((1,1001), (null,null)); + QUERY PLAN +------------------------------------------------------ + Index Scan using tenk1_thous_tenthous on tenk1 + Index Cond: ((thousand = 1) AND (tenthous = 1001)) +(2 rows) + +-- +-- Check matching of boolean index columns to WHERE conditions and sort keys +-- +create temp table boolindex (b bool, i int, unique(b, i), junk float); +explain (costs off) + select * from boolindex order by b, i limit 10; + QUERY PLAN +------------------------------------------------------- + Limit + -> Index Scan using boolindex_b_i_key on boolindex +(2 rows) + +explain (costs off) + select * from boolindex where b order by i limit 10; + QUERY PLAN +------------------------------------------------------- + Limit + -> Index Scan using boolindex_b_i_key on boolindex + Index Cond: (b = true) +(3 rows) + +explain (costs off) + select * from boolindex where b = true order by i desc limit 10; + QUERY PLAN +---------------------------------------------------------------- + Limit + -> Index Scan Backward using boolindex_b_i_key on boolindex + Index Cond: (b = true) +(3 rows) + +explain (costs off) + select * from boolindex where not b order by i limit 10; + QUERY PLAN +------------------------------------------------------- + Limit + -> Index Scan using boolindex_b_i_key on boolindex + Index Cond: (b = false) +(3 rows) + +explain (costs off) + select * from boolindex where b is true order by i desc limit 10; + QUERY PLAN +---------------------------------------------------------------- + Limit + -> Index Scan Backward using boolindex_b_i_key on boolindex + Index Cond: (b = true) +(3 rows) + +explain (costs off) + select * from boolindex where b is false order by i desc limit 10; + QUERY PLAN +---------------------------------------------------------------- + Limit + -> Index Scan Backward using boolindex_b_i_key on boolindex + Index Cond: (b = false) +(3 rows) + +-- +-- REINDEX (VERBOSE) +-- +CREATE TABLE reindex_verbose(id integer primary key); +\set VERBOSITY terse \\ -- suppress machine-dependent details +REINDEX (VERBOSE) TABLE reindex_verbose; +INFO: index "reindex_verbose_pkey" was reindexed +\set VERBOSITY default +DROP TABLE reindex_verbose; +-- +-- REINDEX CONCURRENTLY +-- +CREATE TABLE concur_reindex_tab (c1 int); +-- REINDEX +REINDEX TABLE concur_reindex_tab; -- notice +NOTICE: table "concur_reindex_tab" has no indexes to reindex +REINDEX (CONCURRENTLY) TABLE concur_reindex_tab; -- notice +NOTICE: table "concur_reindex_tab" has no indexes that can be reindexed concurrently +ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index +-- Normal index with integer column +CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1); +-- Normal index with text column +CREATE INDEX concur_reindex_ind2 ON concur_reindex_tab(c2); +-- UNIQUE index with expression +CREATE UNIQUE INDEX concur_reindex_ind3 ON concur_reindex_tab(abs(c1)); +-- Duplicate column names +CREATE INDEX concur_reindex_ind4 ON concur_reindex_tab(c1, c1, c2); +-- Create table for check on foreign key dependence switch with indexes swapped +ALTER TABLE concur_reindex_tab ADD PRIMARY KEY USING INDEX concur_reindex_ind1; +CREATE TABLE concur_reindex_tab2 (c1 int REFERENCES concur_reindex_tab); +INSERT INTO concur_reindex_tab VALUES (1, 'a'); +INSERT INTO concur_reindex_tab VALUES (2, 'a'); +-- Reindex concurrently of exclusion constraint currently not supported +CREATE TABLE concur_reindex_tab3 (c1 int, c2 int4range, EXCLUDE USING gist (c2 WITH &&)); +INSERT INTO concur_reindex_tab3 VALUES (3, '[1,2]'); +REINDEX INDEX CONCURRENTLY concur_reindex_tab3_c2_excl; -- error +ERROR: concurrent index creation for exclusion constraints is not supported +REINDEX TABLE CONCURRENTLY concur_reindex_tab3; -- succeeds with warning +WARNING: cannot reindex exclusion constraint index "public.concur_reindex_tab3_c2_excl" concurrently, skipping +INSERT INTO concur_reindex_tab3 VALUES (4, '[2,4]'); +ERROR: conflicting key value violates exclusion constraint "concur_reindex_tab3_c2_excl" +DETAIL: Key (c2)=([2,5)) conflicts with existing key (c2)=([1,3)). +-- Check materialized views +CREATE MATERIALIZED VIEW concur_reindex_matview AS SELECT * FROM concur_reindex_tab; +-- Dependency lookup before and after the follow-up REINDEX commands. +-- These should remain consistent. +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid,refobjid,refobjsubid) as objref, + deptype +FROM pg_depend +WHERE classid = 'pg_class'::regclass AND + objid in ('concur_reindex_tab'::regclass, + 'concur_reindex_ind1'::regclass, + 'concur_reindex_ind2'::regclass, + 'concur_reindex_ind3'::regclass, + 'concur_reindex_ind4'::regclass, + 'concur_reindex_matview'::regclass) + ORDER BY 1, 2; + obj | objref | deptype +------------------------------------------+------------------------------------------------------------+--------- + index concur_reindex_ind1 | constraint concur_reindex_ind1 on table concur_reindex_tab | i + index concur_reindex_ind2 | column c2 of table concur_reindex_tab | a + index concur_reindex_ind3 | column c1 of table concur_reindex_tab | a + index concur_reindex_ind3 | table concur_reindex_tab | a + index concur_reindex_ind4 | column c1 of table concur_reindex_tab | a + index concur_reindex_ind4 | column c2 of table concur_reindex_tab | a + materialized view concur_reindex_matview | schema public | n + table concur_reindex_tab | schema public | n +(8 rows) + +REINDEX INDEX CONCURRENTLY concur_reindex_ind1; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +REINDEX TABLE CONCURRENTLY concur_reindex_matview; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid,refobjid,refobjsubid) as objref, + deptype +FROM pg_depend +WHERE classid = 'pg_class'::regclass AND + objid in ('concur_reindex_tab'::regclass, + 'concur_reindex_ind1'::regclass, + 'concur_reindex_ind2'::regclass, + 'concur_reindex_ind3'::regclass, + 'concur_reindex_ind4'::regclass, + 'concur_reindex_matview'::regclass) + ORDER BY 1, 2; + obj | objref | deptype +------------------------------------------+------------------------------------------------------------+--------- + index concur_reindex_ind1 | constraint concur_reindex_ind1 on table concur_reindex_tab | i + index concur_reindex_ind2 | column c2 of table concur_reindex_tab | a + index concur_reindex_ind3 | column c1 of table concur_reindex_tab | a + index concur_reindex_ind3 | table concur_reindex_tab | a + index concur_reindex_ind4 | column c1 of table concur_reindex_tab | a + index concur_reindex_ind4 | column c2 of table concur_reindex_tab | a + materialized view concur_reindex_matview | schema public | n + table concur_reindex_tab | schema public | n +(8 rows) + +-- Check that comments are preserved +CREATE TABLE testcomment (i int); +CREATE INDEX testcomment_idx1 ON testcomment (i); +COMMENT ON INDEX testcomment_idx1 IS 'test comment'; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); + obj_description +----------------- + test comment +(1 row) + +REINDEX TABLE testcomment; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); + obj_description +----------------- + test comment +(1 row) + +REINDEX TABLE CONCURRENTLY testcomment ; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); + obj_description +----------------- + test comment +(1 row) + +DROP TABLE testcomment; +-- Check that indisclustered updates are preserved +CREATE TABLE concur_clustered(i int); +CREATE INDEX concur_clustered_i_idx ON concur_clustered(i); +ALTER TABLE concur_clustered CLUSTER ON concur_clustered_i_idx; +REINDEX TABLE CONCURRENTLY concur_clustered; +SELECT indexrelid::regclass, indisclustered FROM pg_index + WHERE indrelid = 'concur_clustered'::regclass; + indexrelid | indisclustered +------------------------+---------------- + concur_clustered_i_idx | t +(1 row) + +DROP TABLE concur_clustered; +-- Check that indisreplident updates are preserved. +CREATE TABLE concur_replident(i int NOT NULL); +CREATE UNIQUE INDEX concur_replident_i_idx ON concur_replident(i); +ALTER TABLE concur_replident REPLICA IDENTITY + USING INDEX concur_replident_i_idx; +SELECT indexrelid::regclass, indisreplident FROM pg_index + WHERE indrelid = 'concur_replident'::regclass; + indexrelid | indisreplident +------------------------+---------------- + concur_replident_i_idx | t +(1 row) + +REINDEX TABLE CONCURRENTLY concur_replident; +SELECT indexrelid::regclass, indisreplident FROM pg_index + WHERE indrelid = 'concur_replident'::regclass; + indexrelid | indisreplident +------------------------+---------------- + concur_replident_i_idx | t +(1 row) + +DROP TABLE concur_replident; +-- Check that opclass parameters are preserved +CREATE TABLE concur_appclass_tab(i tsvector, j tsvector, k tsvector); +CREATE INDEX concur_appclass_ind on concur_appclass_tab + USING gist (i tsvector_ops (siglen='1000'), j tsvector_ops (siglen='500')); +CREATE INDEX concur_appclass_ind_2 on concur_appclass_tab + USING gist (k tsvector_ops (siglen='300'), j tsvector_ops); +REINDEX TABLE CONCURRENTLY concur_appclass_tab; +\d concur_appclass_tab + Table "public.concur_appclass_tab" + Column | Type | Collation | Nullable | Default +--------+----------+-----------+----------+--------- + i | tsvector | | | + j | tsvector | | | + k | tsvector | | | +Indexes: + "concur_appclass_ind" gist (i tsvector_ops (siglen='1000'), j tsvector_ops (siglen='500')) + "concur_appclass_ind_2" gist (k tsvector_ops (siglen='300'), j) + +DROP TABLE concur_appclass_tab; +-- Partitions +-- Create some partitioned tables +CREATE TABLE concur_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1); +CREATE TABLE concur_reindex_part_0 PARTITION OF concur_reindex_part + FOR VALUES FROM (0) TO (10) PARTITION BY list (c2); +CREATE TABLE concur_reindex_part_0_1 PARTITION OF concur_reindex_part_0 + FOR VALUES IN (1); +CREATE TABLE concur_reindex_part_0_2 PARTITION OF concur_reindex_part_0 + FOR VALUES IN (2); +-- This partitioned table will have no partitions. +CREATE TABLE concur_reindex_part_10 PARTITION OF concur_reindex_part + FOR VALUES FROM (10) TO (20) PARTITION BY list (c2); +-- Create some partitioned indexes +CREATE INDEX concur_reindex_part_index ON ONLY concur_reindex_part (c1); +CREATE INDEX concur_reindex_part_index_0 ON ONLY concur_reindex_part_0 (c1); +ALTER INDEX concur_reindex_part_index ATTACH PARTITION concur_reindex_part_index_0; +-- This partitioned index will have no partitions. +CREATE INDEX concur_reindex_part_index_10 ON ONLY concur_reindex_part_10 (c1); +ALTER INDEX concur_reindex_part_index ATTACH PARTITION concur_reindex_part_index_10; +CREATE INDEX concur_reindex_part_index_0_1 ON ONLY concur_reindex_part_0_1 (c1); +ALTER INDEX concur_reindex_part_index_0 ATTACH PARTITION concur_reindex_part_index_0_1; +CREATE INDEX concur_reindex_part_index_0_2 ON ONLY concur_reindex_part_0_2 (c1); +ALTER INDEX concur_reindex_part_index_0 ATTACH PARTITION concur_reindex_part_index_0_2; +SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') + ORDER BY relid, level; + relid | parentrelid | level +-------------------------------+-----------------------------+------- + concur_reindex_part_index | | 0 + concur_reindex_part_index_0 | concur_reindex_part_index | 1 + concur_reindex_part_index_10 | concur_reindex_part_index | 1 + concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 + concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 +(5 rows) + +SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') + ORDER BY relid, level; + relid | parentrelid | level +-------------------------------+-----------------------------+------- + concur_reindex_part_index | | 0 + concur_reindex_part_index_0 | concur_reindex_part_index | 1 + concur_reindex_part_index_10 | concur_reindex_part_index | 1 + concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 + concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 +(5 rows) + +-- REINDEX should preserve dependencies of partition tree. +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid,refobjid,refobjsubid) as objref, + deptype +FROM pg_depend +WHERE classid = 'pg_class'::regclass AND + objid in ('concur_reindex_part'::regclass, + 'concur_reindex_part_0'::regclass, + 'concur_reindex_part_0_1'::regclass, + 'concur_reindex_part_0_2'::regclass, + 'concur_reindex_part_index'::regclass, + 'concur_reindex_part_index_0'::regclass, + 'concur_reindex_part_index_0_1'::regclass, + 'concur_reindex_part_index_0_2'::regclass) + ORDER BY 1, 2; + obj | objref | deptype +------------------------------------------+--------------------------------------------+--------- + column c1 of table concur_reindex_part | table concur_reindex_part | i + column c2 of table concur_reindex_part_0 | table concur_reindex_part_0 | i + index concur_reindex_part_index | column c1 of table concur_reindex_part | a + index concur_reindex_part_index_0 | column c1 of table concur_reindex_part_0 | a + index concur_reindex_part_index_0 | index concur_reindex_part_index | P + index concur_reindex_part_index_0 | table concur_reindex_part_0 | S + index concur_reindex_part_index_0_1 | column c1 of table concur_reindex_part_0_1 | a + index concur_reindex_part_index_0_1 | index concur_reindex_part_index_0 | P + index concur_reindex_part_index_0_1 | table concur_reindex_part_0_1 | S + index concur_reindex_part_index_0_2 | column c1 of table concur_reindex_part_0_2 | a + index concur_reindex_part_index_0_2 | index concur_reindex_part_index_0 | P + index concur_reindex_part_index_0_2 | table concur_reindex_part_0_2 | S + table concur_reindex_part | schema public | n + table concur_reindex_part_0 | schema public | n + table concur_reindex_part_0 | table concur_reindex_part | a + table concur_reindex_part_0_1 | schema public | n + table concur_reindex_part_0_1 | table concur_reindex_part_0 | a + table concur_reindex_part_0_2 | schema public | n + table concur_reindex_part_0_2 | table concur_reindex_part_0 | a +(19 rows) + +REINDEX INDEX CONCURRENTLY concur_reindex_part_index_0_1; +REINDEX INDEX CONCURRENTLY concur_reindex_part_index_0_2; +SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') + ORDER BY relid, level; + relid | parentrelid | level +-------------------------------+-----------------------------+------- + concur_reindex_part_index | | 0 + concur_reindex_part_index_0 | concur_reindex_part_index | 1 + concur_reindex_part_index_10 | concur_reindex_part_index | 1 + concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 + concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 +(5 rows) + +REINDEX TABLE CONCURRENTLY concur_reindex_part_0_1; +REINDEX TABLE CONCURRENTLY concur_reindex_part_0_2; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid,refobjid,refobjsubid) as objref, + deptype +FROM pg_depend +WHERE classid = 'pg_class'::regclass AND + objid in ('concur_reindex_part'::regclass, + 'concur_reindex_part_0'::regclass, + 'concur_reindex_part_0_1'::regclass, + 'concur_reindex_part_0_2'::regclass, + 'concur_reindex_part_index'::regclass, + 'concur_reindex_part_index_0'::regclass, + 'concur_reindex_part_index_0_1'::regclass, + 'concur_reindex_part_index_0_2'::regclass) + ORDER BY 1, 2; + obj | objref | deptype +------------------------------------------+--------------------------------------------+--------- + column c1 of table concur_reindex_part | table concur_reindex_part | i + column c2 of table concur_reindex_part_0 | table concur_reindex_part_0 | i + index concur_reindex_part_index | column c1 of table concur_reindex_part | a + index concur_reindex_part_index_0 | column c1 of table concur_reindex_part_0 | a + index concur_reindex_part_index_0 | index concur_reindex_part_index | P + index concur_reindex_part_index_0 | table concur_reindex_part_0 | S + index concur_reindex_part_index_0_1 | column c1 of table concur_reindex_part_0_1 | a + index concur_reindex_part_index_0_1 | index concur_reindex_part_index_0 | P + index concur_reindex_part_index_0_1 | table concur_reindex_part_0_1 | S + index concur_reindex_part_index_0_2 | column c1 of table concur_reindex_part_0_2 | a + index concur_reindex_part_index_0_2 | index concur_reindex_part_index_0 | P + index concur_reindex_part_index_0_2 | table concur_reindex_part_0_2 | S + table concur_reindex_part | schema public | n + table concur_reindex_part_0 | schema public | n + table concur_reindex_part_0 | table concur_reindex_part | a + table concur_reindex_part_0_1 | schema public | n + table concur_reindex_part_0_1 | table concur_reindex_part_0 | a + table concur_reindex_part_0_2 | schema public | n + table concur_reindex_part_0_2 | table concur_reindex_part_0 | a +(19 rows) + +SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') + ORDER BY relid, level; + relid | parentrelid | level +-------------------------------+-----------------------------+------- + concur_reindex_part_index | | 0 + concur_reindex_part_index_0 | concur_reindex_part_index | 1 + concur_reindex_part_index_10 | concur_reindex_part_index | 1 + concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 + concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 +(5 rows) + +-- REINDEX for partitioned indexes +-- REINDEX TABLE fails for partitioned indexes +-- Top-most parent index +REINDEX TABLE concur_reindex_part_index; -- error +ERROR: "concur_reindex_part_index" is not a table or materialized view +REINDEX TABLE CONCURRENTLY concur_reindex_part_index; -- error +ERROR: "concur_reindex_part_index" is not a table or materialized view +-- Partitioned index with no leaves +REINDEX TABLE concur_reindex_part_index_10; -- error +ERROR: "concur_reindex_part_index_10" is not a table or materialized view +REINDEX TABLE CONCURRENTLY concur_reindex_part_index_10; -- error +ERROR: "concur_reindex_part_index_10" is not a table or materialized view +-- Cannot run in a transaction block +BEGIN; +REINDEX INDEX concur_reindex_part_index; +ERROR: REINDEX INDEX cannot run inside a transaction block +CONTEXT: while reindexing partitioned index "public.concur_reindex_part_index" +ROLLBACK; +-- Helper functions to track changes of relfilenodes in a partition tree. +-- Create a table tracking the relfilenode state. +CREATE OR REPLACE FUNCTION create_relfilenode_part(relname text, indname text) + RETURNS VOID AS + $func$ + BEGIN + EXECUTE format(' + CREATE TABLE %I AS + SELECT oid, relname, relfilenode, relkind, reltoastrelid + FROM pg_class + WHERE oid IN + (SELECT relid FROM pg_partition_tree(''%I''));', + relname, indname); + END + $func$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION compare_relfilenode_part(tabname text) + RETURNS TABLE (relname name, relkind "char", state text) AS + $func$ + BEGIN + RETURN QUERY EXECUTE + format( + 'SELECT b.relname, + b.relkind, + CASE WHEN a.relfilenode = b.relfilenode THEN ''relfilenode is unchanged'' + ELSE ''relfilenode has changed'' END + -- Do not join with OID here as CONCURRENTLY changes it. + FROM %I b JOIN pg_class a ON b.relname = a.relname + ORDER BY 1;', tabname); + END + $func$ LANGUAGE plpgsql; +-- Check that expected relfilenodes are changed, non-concurrent case. +SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); + create_relfilenode_part +------------------------- + +(1 row) + +REINDEX INDEX concur_reindex_part_index; +SELECT * FROM compare_relfilenode_part('reindex_index_status'); + relname | relkind | state +-------------------------------+---------+-------------------------- + concur_reindex_part_index | I | relfilenode is unchanged + concur_reindex_part_index_0 | I | relfilenode is unchanged + concur_reindex_part_index_0_1 | i | relfilenode has changed + concur_reindex_part_index_0_2 | i | relfilenode has changed + concur_reindex_part_index_10 | I | relfilenode is unchanged +(5 rows) + +DROP TABLE reindex_index_status; +-- concurrent case. +SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); + create_relfilenode_part +------------------------- + +(1 row) + +REINDEX INDEX CONCURRENTLY concur_reindex_part_index; +SELECT * FROM compare_relfilenode_part('reindex_index_status'); + relname | relkind | state +-------------------------------+---------+-------------------------- + concur_reindex_part_index | I | relfilenode is unchanged + concur_reindex_part_index_0 | I | relfilenode is unchanged + concur_reindex_part_index_0_1 | i | relfilenode has changed + concur_reindex_part_index_0_2 | i | relfilenode has changed + concur_reindex_part_index_10 | I | relfilenode is unchanged +(5 rows) + +DROP TABLE reindex_index_status; +-- REINDEX for partitioned tables +-- REINDEX INDEX fails for partitioned tables +-- Top-most parent +REINDEX INDEX concur_reindex_part; -- error +ERROR: "concur_reindex_part" is not an index +REINDEX INDEX CONCURRENTLY concur_reindex_part; -- error +ERROR: "concur_reindex_part" is not an index +-- Partitioned with no leaves +REINDEX INDEX concur_reindex_part_10; -- error +ERROR: "concur_reindex_part_10" is not an index +REINDEX INDEX CONCURRENTLY concur_reindex_part_10; -- error +ERROR: "concur_reindex_part_10" is not an index +-- Cannot run in a transaction block +BEGIN; +REINDEX TABLE concur_reindex_part; +ERROR: REINDEX TABLE cannot run inside a transaction block +CONTEXT: while reindexing partitioned table "public.concur_reindex_part" +ROLLBACK; +-- Check that expected relfilenodes are changed, non-concurrent case. +-- Note that the partition tree changes of the *indexes* need to be checked. +SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); + create_relfilenode_part +------------------------- + +(1 row) + +REINDEX TABLE concur_reindex_part; +SELECT * FROM compare_relfilenode_part('reindex_index_status'); + relname | relkind | state +-------------------------------+---------+-------------------------- + concur_reindex_part_index | I | relfilenode is unchanged + concur_reindex_part_index_0 | I | relfilenode is unchanged + concur_reindex_part_index_0_1 | i | relfilenode has changed + concur_reindex_part_index_0_2 | i | relfilenode has changed + concur_reindex_part_index_10 | I | relfilenode is unchanged +(5 rows) + +DROP TABLE reindex_index_status; +-- concurrent case. +SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); + create_relfilenode_part +------------------------- + +(1 row) + +REINDEX TABLE CONCURRENTLY concur_reindex_part; +SELECT * FROM compare_relfilenode_part('reindex_index_status'); + relname | relkind | state +-------------------------------+---------+-------------------------- + concur_reindex_part_index | I | relfilenode is unchanged + concur_reindex_part_index_0 | I | relfilenode is unchanged + concur_reindex_part_index_0_1 | i | relfilenode has changed + concur_reindex_part_index_0_2 | i | relfilenode has changed + concur_reindex_part_index_10 | I | relfilenode is unchanged +(5 rows) + +DROP TABLE reindex_index_status; +DROP FUNCTION create_relfilenode_part; +DROP FUNCTION compare_relfilenode_part; +-- Cleanup of partition tree used for REINDEX test. +DROP TABLE concur_reindex_part; +-- Check errors +-- Cannot run inside a transaction block +BEGIN; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block +COMMIT; +REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relation +ERROR: cannot reindex system catalogs concurrently +REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index +ERROR: cannot reindex system catalogs concurrently +-- These are the toast table and index of pg_authid. +REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1260; -- no catalog toast table +ERROR: cannot reindex system catalogs concurrently +REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; -- no catalog toast index +ERROR: cannot reindex system catalogs concurrently +REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM +ERROR: cannot reindex system catalogs concurrently +-- Warns about catalog relations +REINDEX SCHEMA CONCURRENTLY pg_catalog; +WARNING: cannot reindex system catalogs concurrently, skipping all +-- Check the relation status, there should not be invalid indexes +\d concur_reindex_tab + Table "public.concur_reindex_tab" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | not null | + c2 | text | | | +Indexes: + "concur_reindex_ind1" PRIMARY KEY, btree (c1) + "concur_reindex_ind2" btree (c2) + "concur_reindex_ind3" UNIQUE, btree (abs(c1)) + "concur_reindex_ind4" btree (c1, c1, c2) +Referenced by: + TABLE "concur_reindex_tab2" CONSTRAINT "concur_reindex_tab2_c1_fkey" FOREIGN KEY (c1) REFERENCES concur_reindex_tab(c1) + +DROP MATERIALIZED VIEW concur_reindex_matview; +DROP TABLE concur_reindex_tab, concur_reindex_tab2, concur_reindex_tab3; +-- Check handling of invalid indexes +CREATE TABLE concur_reindex_tab4 (c1 int); +INSERT INTO concur_reindex_tab4 VALUES (1), (1), (2); +-- This trick creates an invalid index. +CREATE UNIQUE INDEX CONCURRENTLY concur_reindex_ind5 ON concur_reindex_tab4 (c1); +ERROR: could not create unique index "concur_reindex_ind5" +DETAIL: Key (c1)=(1) is duplicated. +-- Reindexing concurrently this index fails with the same failure. +-- The extra index created is itself invalid, and can be dropped. +REINDEX INDEX CONCURRENTLY concur_reindex_ind5; +ERROR: could not create unique index "concur_reindex_ind5_ccnew" +DETAIL: Key (c1)=(1) is duplicated. +\d concur_reindex_tab4 + Table "public.concur_reindex_tab4" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | +Indexes: + "concur_reindex_ind5" UNIQUE, btree (c1) INVALID + "concur_reindex_ind5_ccnew" UNIQUE, btree (c1) INVALID + +DROP INDEX concur_reindex_ind5_ccnew; +-- This makes the previous failure go away, so the index can become valid. +DELETE FROM concur_reindex_tab4 WHERE c1 = 1; +-- The invalid index is not processed when running REINDEX TABLE. +REINDEX TABLE CONCURRENTLY concur_reindex_tab4; +WARNING: cannot reindex invalid index "public.concur_reindex_ind5" concurrently, skipping +NOTICE: table "concur_reindex_tab4" has no indexes that can be reindexed concurrently +\d concur_reindex_tab4 + Table "public.concur_reindex_tab4" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | +Indexes: + "concur_reindex_ind5" UNIQUE, btree (c1) INVALID + +-- But it is fixed with REINDEX INDEX. +REINDEX INDEX CONCURRENTLY concur_reindex_ind5; +\d concur_reindex_tab4 + Table "public.concur_reindex_tab4" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | +Indexes: + "concur_reindex_ind5" UNIQUE, btree (c1) + +DROP TABLE concur_reindex_tab4; +-- Check handling of indexes with expressions and predicates. The +-- definitions of the rebuilt indexes should match the original +-- definitions. +CREATE TABLE concur_exprs_tab (c1 int , c2 boolean); +INSERT INTO concur_exprs_tab (c1, c2) VALUES (1369652450, FALSE), + (414515746, TRUE), + (897778963, FALSE); +CREATE UNIQUE INDEX concur_exprs_index_expr + ON concur_exprs_tab ((c1::text COLLATE "C")); +CREATE UNIQUE INDEX concur_exprs_index_pred ON concur_exprs_tab (c1) + WHERE (c1::text > 500000000::text COLLATE "C"); +CREATE UNIQUE INDEX concur_exprs_index_pred_2 + ON concur_exprs_tab ((1 / c1)) + WHERE ('-H') >= (c2::TEXT) COLLATE "C"; +ALTER INDEX concur_exprs_index_expr ALTER COLUMN 1 SET STATISTICS 100; +ANALYZE concur_exprs_tab; +SELECT starelid::regclass, count(*) FROM pg_statistic WHERE starelid IN ( + 'concur_exprs_index_expr'::regclass, + 'concur_exprs_index_pred'::regclass, + 'concur_exprs_index_pred_2'::regclass) + GROUP BY starelid ORDER BY starelid::regclass::text; + starelid | count +-------------------------+------- + concur_exprs_index_expr | 1 +(1 row) + +SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); + pg_get_indexdef +--------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") +(1 row) + +SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); + pg_get_indexdef +---------------------------------------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) +(1 row) + +SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); + pg_get_indexdef +-------------------------------------------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= ((c2)::text COLLATE "C")) +(1 row) + +REINDEX TABLE CONCURRENTLY concur_exprs_tab; +SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); + pg_get_indexdef +--------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") +(1 row) + +SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); + pg_get_indexdef +---------------------------------------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) +(1 row) + +SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); + pg_get_indexdef +-------------------------------------------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= ((c2)::text COLLATE "C")) +(1 row) + +-- ALTER TABLE recreates the indexes, which should keep their collations. +ALTER TABLE concur_exprs_tab ALTER c2 TYPE TEXT; +SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); + pg_get_indexdef +--------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") +(1 row) + +SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); + pg_get_indexdef +---------------------------------------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) +(1 row) + +SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); + pg_get_indexdef +------------------------------------------------------------------------------------------------------------------------------------------ + CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= (c2 COLLATE "C")) +(1 row) + +-- Statistics should remain intact. +SELECT starelid::regclass, count(*) FROM pg_statistic WHERE starelid IN ( + 'concur_exprs_index_expr'::regclass, + 'concur_exprs_index_pred'::regclass, + 'concur_exprs_index_pred_2'::regclass) + GROUP BY starelid ORDER BY starelid::regclass::text; + starelid | count +-------------------------+------- + concur_exprs_index_expr | 1 +(1 row) + +-- attstattarget should remain intact +SELECT attrelid::regclass, attnum, attstattarget + FROM pg_attribute WHERE attrelid IN ( + 'concur_exprs_index_expr'::regclass, + 'concur_exprs_index_pred'::regclass, + 'concur_exprs_index_pred_2'::regclass) + ORDER BY attrelid::regclass::text, attnum; + attrelid | attnum | attstattarget +---------------------------+--------+--------------- + concur_exprs_index_expr | 1 | 100 + concur_exprs_index_pred | 1 | -1 + concur_exprs_index_pred_2 | 1 | -1 +(3 rows) + +DROP TABLE concur_exprs_tab; +-- Temporary tables and on-commit actions, where CONCURRENTLY is ignored. +-- ON COMMIT PRESERVE ROWS, the default. +CREATE TEMP TABLE concur_temp_tab_1 (c1 int, c2 text) + ON COMMIT PRESERVE ROWS; +INSERT INTO concur_temp_tab_1 VALUES (1, 'foo'), (2, 'bar'); +CREATE INDEX concur_temp_ind_1 ON concur_temp_tab_1(c2); +REINDEX TABLE CONCURRENTLY concur_temp_tab_1; +REINDEX INDEX CONCURRENTLY concur_temp_ind_1; +-- Still fails in transaction blocks +BEGIN; +REINDEX INDEX CONCURRENTLY concur_temp_ind_1; +ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block +COMMIT; +-- ON COMMIT DELETE ROWS +CREATE TEMP TABLE concur_temp_tab_2 (c1 int, c2 text) + ON COMMIT DELETE ROWS; +CREATE INDEX concur_temp_ind_2 ON concur_temp_tab_2(c2); +REINDEX TABLE CONCURRENTLY concur_temp_tab_2; +REINDEX INDEX CONCURRENTLY concur_temp_ind_2; +-- ON COMMIT DROP +BEGIN; +CREATE TEMP TABLE concur_temp_tab_3 (c1 int, c2 text) + ON COMMIT PRESERVE ROWS; +INSERT INTO concur_temp_tab_3 VALUES (1, 'foo'), (2, 'bar'); +CREATE INDEX concur_temp_ind_3 ON concur_temp_tab_3(c2); +-- Fails when running in a transaction +REINDEX INDEX CONCURRENTLY concur_temp_ind_3; +ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block +COMMIT; +-- REINDEX SCHEMA processes all temporary relations +CREATE TABLE reindex_temp_before AS +SELECT oid, relname, relfilenode, relkind, reltoastrelid + FROM pg_class + WHERE relname IN ('concur_temp_ind_1', 'concur_temp_ind_2'); +SELECT pg_my_temp_schema()::regnamespace as temp_schema_name \gset +REINDEX SCHEMA CONCURRENTLY :temp_schema_name; +SELECT b.relname, + b.relkind, + CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' + ELSE 'relfilenode has changed' END + FROM reindex_temp_before b JOIN pg_class a ON b.oid = a.oid + ORDER BY 1; + relname | relkind | case +-------------------+---------+------------------------- + concur_temp_ind_1 | i | relfilenode has changed + concur_temp_ind_2 | i | relfilenode has changed +(2 rows) + +DROP TABLE concur_temp_tab_1, concur_temp_tab_2, reindex_temp_before; +-- +-- REINDEX SCHEMA +-- +REINDEX SCHEMA schema_to_reindex; -- failure, schema does not exist +ERROR: schema "schema_to_reindex" does not exist +CREATE SCHEMA schema_to_reindex; +SET search_path = 'schema_to_reindex'; +CREATE TABLE table1(col1 SERIAL PRIMARY KEY); +INSERT INTO table1 SELECT generate_series(1,400); +CREATE TABLE table2(col1 SERIAL PRIMARY KEY, col2 TEXT NOT NULL); +INSERT INTO table2 SELECT generate_series(1,400), 'abc'; +CREATE INDEX ON table2(col2); +CREATE MATERIALIZED VIEW matview AS SELECT col1 FROM table2; +CREATE INDEX ON matview(col1); +CREATE VIEW view AS SELECT col2 FROM table2; +CREATE TABLE reindex_before AS +SELECT oid, relname, relfilenode, relkind, reltoastrelid + FROM pg_class + where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex'); +INSERT INTO reindex_before +SELECT oid, 'pg_toast_TABLE', relfilenode, relkind, reltoastrelid +FROM pg_class WHERE oid IN + (SELECT reltoastrelid FROM reindex_before WHERE reltoastrelid > 0); +INSERT INTO reindex_before +SELECT oid, 'pg_toast_TABLE_index', relfilenode, relkind, reltoastrelid +FROM pg_class where oid in + (select indexrelid from pg_index where indrelid in + (select reltoastrelid from reindex_before where reltoastrelid > 0)); +REINDEX SCHEMA schema_to_reindex; +CREATE TABLE reindex_after AS SELECT oid, relname, relfilenode, relkind + FROM pg_class + where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex'); +SELECT b.relname, + b.relkind, + CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' + ELSE 'relfilenode has changed' END + FROM reindex_before b JOIN pg_class a ON b.oid = a.oid + ORDER BY 1; + relname | relkind | case +----------------------+---------+-------------------------- + matview | m | relfilenode is unchanged + matview_col1_idx | i | relfilenode has changed + pg_toast_TABLE | t | relfilenode is unchanged + pg_toast_TABLE_index | i | relfilenode has changed + table1 | r | relfilenode is unchanged + table1_col1_seq | S | relfilenode is unchanged + table1_pkey | i | relfilenode has changed + table2 | r | relfilenode is unchanged + table2_col1_seq | S | relfilenode is unchanged + table2_col2_idx | i | relfilenode has changed + table2_pkey | i | relfilenode has changed + view | v | relfilenode is unchanged +(12 rows) + +REINDEX SCHEMA schema_to_reindex; +BEGIN; +REINDEX SCHEMA schema_to_reindex; -- failure, cannot run in a transaction +END; +-- concurrently +REINDEX SCHEMA CONCURRENTLY schema_to_reindex; +-- Failure for unauthorized user +CREATE ROLE regress_reindexuser NOLOGIN; +SET SESSION ROLE regress_reindexuser; +REINDEX SCHEMA schema_to_reindex; +ERROR: must be owner of schema schema_to_reindex +-- Permission failures with toast tables and indexes (pg_authid here) +RESET ROLE; +GRANT USAGE ON SCHEMA pg_toast TO regress_reindexuser; +SET SESSION ROLE regress_reindexuser; +REINDEX TABLE pg_toast.pg_toast_1260; +ERROR: must be owner of table pg_toast_1260 +REINDEX INDEX pg_toast.pg_toast_1260_index; +ERROR: must be owner of index pg_toast_1260_index +-- Clean up +RESET ROLE; +REVOKE USAGE ON SCHEMA pg_toast FROM regress_reindexuser; +DROP ROLE regress_reindexuser; +DROP SCHEMA schema_to_reindex CASCADE; +NOTICE: drop cascades to 6 other objects +DETAIL: drop cascades to table table1 +drop cascades to table table2 +drop cascades to materialized view matview +drop cascades to view view +drop cascades to table reindex_before +drop cascades to table reindex_after diff --git a/src/test/singlenode_regress/expected/create_index_spgist.out b/src/test/singlenode_regress/expected/create_index_spgist.out new file mode 100644 index 00000000000..862e72244e0 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_index_spgist.out @@ -0,0 +1,1413 @@ +-- +-- SP-GiST index tests +-- +CREATE TABLE quad_point_tbl AS + SELECT point(unique1,unique2) AS p FROM tenk1; +INSERT INTO quad_point_tbl + SELECT '(333.0,400.0)'::point FROM generate_series(1,1000); +INSERT INTO quad_point_tbl VALUES (NULL), (NULL), (NULL); +CREATE INDEX sp_quad_ind ON quad_point_tbl USING spgist (p); +CREATE TABLE kd_point_tbl AS SELECT * FROM quad_point_tbl; +CREATE INDEX sp_kd_ind ON kd_point_tbl USING spgist (p kd_point_ops); +CREATE TABLE radix_text_tbl AS + SELECT name AS t FROM road WHERE name !~ '^[0-9]'; +INSERT INTO radix_text_tbl + SELECT 'P0123456789abcdef' FROM generate_series(1,1000); +INSERT INTO radix_text_tbl VALUES ('P0123456789abcde'); +INSERT INTO radix_text_tbl VALUES ('P0123456789abcdefF'); +CREATE INDEX sp_radix_ind ON radix_text_tbl USING spgist (t); +-- get non-indexed results for comparison purposes +SET enable_seqscan = ON; +SET enable_indexscan = OFF; +SET enable_bitmapscan = OFF; +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; + count +------- + 3 +(1 row) + +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; + count +------- + 11000 +(1 row) + +SELECT count(*) FROM quad_point_tbl; + count +------- + 11003 +(1 row) + +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + count +------- + 1057 +(1 row) + +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; + count +------- + 1057 +(1 row) + +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; + count +------- + 6000 +(1 row) + +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; + count +------- + 4999 +(1 row) + +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; + count +------- + 5000 +(1 row) + +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; + count +------- + 5999 +(1 row) + +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; + count +------- + 1 +(1 row) + +CREATE TEMP TABLE quad_point_tbl_ord_seq1 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl; +CREATE TEMP TABLE quad_point_tbl_ord_seq2 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +CREATE TEMP TABLE quad_point_tbl_ord_seq3 AS +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM quad_point_tbl WHERE p IS NOT NULL; +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; + count +------- + 1000 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; + count +------- + 272 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; + count +------- + 272 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; + count +------- + 273 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; + count +------- + 273 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; + count +------- + 1 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; + count +------- + 2 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; + count +------- + 50 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; + count +------- + 50 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; + count +------- + 48 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; + count +------- + 48 +(1 row) + +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; + count +------- + 2 +(1 row) + +-- Now check the results from plain indexscan +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p IS NULL) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; + count +------- + 3 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p IS NOT NULL) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; + count +------- + 11000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Optimizer: Postgres query optimizer +(3 rows) + +SELECT count(*) FROM quad_point_tbl; + count +------- + 11003 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + count +------- + 1057 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; + count +------- + 1057 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p << '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; + count +------- + 6000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p >> '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; + count +------- + 4999 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p <<| '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; + count +------- + 5000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p |>> '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; + count +------- + 5999 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p ~= '(4585,365)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl; + QUERY PLAN +----------------------------------------------------------- + WindowAgg + Order By: (p <-> '(0,0)'::point) + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Order By: (p <-> '(0,0)'::point) + Optimizer: Postgres query optimizer +(5 rows) + +CREATE TEMP TABLE quad_point_tbl_ord_idx1 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl; +SELECT * FROM quad_point_tbl_ord_seq1 seq FULL JOIN quad_point_tbl_ord_idx1 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + n | dist | p | n | dist | p +---+------+---+---+------+--- +(0 rows) + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + QUERY PLAN +----------------------------------------------------------- + WindowAgg + Order By: (p <-> '(0,0)'::point) + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Order By: (p <-> '(0,0)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +CREATE TEMP TABLE quad_point_tbl_ord_idx2 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +SELECT * FROM quad_point_tbl_ord_seq2 seq FULL JOIN quad_point_tbl_ord_idx2 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + n | dist | p | n | dist | p +---+------+---+---+------+--- +(0 rows) + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM quad_point_tbl WHERE p IS NOT NULL; + QUERY PLAN +----------------------------------------------------------- + WindowAgg + Order By: (p <-> '(333,400)'::point) + -> Index Only Scan using sp_quad_ind on quad_point_tbl + Index Cond: (p IS NOT NULL) + Order By: (p <-> '(333,400)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +CREATE TEMP TABLE quad_point_tbl_ord_idx3 AS +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM quad_point_tbl WHERE p IS NOT NULL; +SELECT * FROM quad_point_tbl_ord_seq3 seq FULL JOIN quad_point_tbl_ord_idx3 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + n | dist | p | n | dist | p +---+------+---+---+------+--- +(0 rows) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + QUERY PLAN +--------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + count +------- + 1057 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE box '(200,200,1000,1000)' @> p; + QUERY PLAN +--------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM kd_point_tbl WHERE box '(200,200,1000,1000)' @> p; + count +------- + 1057 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p << '(5000, 4000)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p << '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p << '(5000, 4000)'; + count +------- + 6000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p >> '(5000, 4000)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p >> '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p >> '(5000, 4000)'; + count +------- + 4999 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p <<| '(5000, 4000)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p <<| '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p <<| '(5000, 4000)'; + count +------- + 5000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p |>> '(5000, 4000)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p |>> '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p |>> '(5000, 4000)'; + count +------- + 5999 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p ~= '(4585, 365)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p ~= '(4585,365)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p ~= '(4585, 365)'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM kd_point_tbl; + QUERY PLAN +------------------------------------------------------- + WindowAgg + Order By: (p <-> '(0,0)'::point) + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Order By: (p <-> '(0,0)'::point) + Optimizer: Postgres query optimizer +(5 rows) + +CREATE TEMP TABLE kd_point_tbl_ord_idx1 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM kd_point_tbl; +SELECT * FROM quad_point_tbl_ord_seq1 seq FULL JOIN kd_point_tbl_ord_idx1 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + n | dist | p | n | dist | p +---+------+---+---+------+--- +(0 rows) + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + QUERY PLAN +--------------------------------------------------------- + WindowAgg + Order By: (p <-> '(0,0)'::point) + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Order By: (p <-> '(0,0)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +CREATE TEMP TABLE kd_point_tbl_ord_idx2 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +SELECT * FROM quad_point_tbl_ord_seq2 seq FULL JOIN kd_point_tbl_ord_idx2 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + n | dist | p | n | dist | p +---+------+---+---+------+--- +(0 rows) + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM kd_point_tbl WHERE p IS NOT NULL; + QUERY PLAN +------------------------------------------------------- + WindowAgg + Order By: (p <-> '(333,400)'::point) + -> Index Only Scan using sp_kd_ind on kd_point_tbl + Index Cond: (p IS NOT NULL) + Order By: (p <-> '(333,400)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +CREATE TEMP TABLE kd_point_tbl_ord_idx3 AS +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM kd_point_tbl WHERE p IS NOT NULL; +SELECT * FROM quad_point_tbl_ord_seq3 seq FULL JOIN kd_point_tbl_ord_idx3 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + n | dist | p | n | dist | p +---+------+---+---+------+--- +(0 rows) + +-- test KNN scan with included columns +-- the distance numbers are not exactly the same across platforms +SET extra_float_digits = 0; +CREATE INDEX ON quad_point_tbl_ord_seq1 USING spgist(p) INCLUDE(dist); +EXPLAIN (COSTS OFF) +SELECT p, dist FROM quad_point_tbl_ord_seq1 ORDER BY p <-> '0,0' LIMIT 10; + QUERY PLAN +------------------------------------------------------------------------------------------- + Limit + -> Index Only Scan using quad_point_tbl_ord_seq1_p_dist_idx on quad_point_tbl_ord_seq1 + Order By: (p <-> '(0,0)'::point) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT p, dist FROM quad_point_tbl_ord_seq1 ORDER BY p <-> '0,0' LIMIT 10; + p | dist +-----------+------------------ + (59,21) | 62.6258732474047 + (88,104) | 136.235090927411 + (39,143) | 148.222805262888 + (139,160) | 211.945747775227 + (209,38) | 212.42645786248 + (157,156) | 221.325552072055 + (175,150) | 230.488611432322 + (236,34) | 238.436574375661 + (263,28) | 264.486294540946 + (322,53) | 326.33265236565 +(10 rows) + +RESET extra_float_digits; +-- check ORDER BY distance to NULL +SELECT (SELECT p FROM kd_point_tbl ORDER BY p <-> pt, p <-> '0,0' LIMIT 1) +FROM (VALUES (point '1,2'), (NULL), ('1234,5678')) pts(pt); + p +------------- + (59,21) + (59,21) + (1239,5647) +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t = 'P0123456789abcdef'::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; + count +------- + 1000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t = 'P0123456789abcde'::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t = 'P0123456789abcdefF'::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; + QUERY PLAN +---------------------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t < 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; + count +------- + 272 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; + QUERY PLAN +------------------------------------------------------------------------ + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t ~<~ 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; + count +------- + 272 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; + QUERY PLAN +----------------------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t <= 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; + count +------- + 273 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; + QUERY PLAN +------------------------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t ~<=~ 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; + count +------- + 273 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; + QUERY PLAN +---------------------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t = 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; + QUERY PLAN +---------------------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t = 'Worth St '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; + count +------- + 2 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; + QUERY PLAN +----------------------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t >= 'Worth St '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; + count +------- + 50 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; + QUERY PLAN +------------------------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t ~>=~ 'Worth St '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; + count +------- + 50 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; + QUERY PLAN +---------------------------------------------------------------------- + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t > 'Worth St '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; + count +------- + 48 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; + QUERY PLAN +------------------------------------------------------------------------ + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t ~>~ 'Worth St '::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; + count +------- + 48 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t ^@ 'Worth'::text) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; + count +------- + 2 +(1 row) + +-- Now check the results from bitmap indexscan +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_bitmapscan = ON; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; + QUERY PLAN +---------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: (p IS NULL) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p IS NULL) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; + count +------- + 3 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; + QUERY PLAN +---------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: (p IS NOT NULL) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p IS NOT NULL) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; + count +------- + 11000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl; + QUERY PLAN +---------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + -> Bitmap Index Scan on sp_quad_ind + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM quad_point_tbl; + count +------- + 11003 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + QUERY PLAN +--------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: (p <@ '(1000,1000),(200,200)'::box) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + count +------- + 1057 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; + QUERY PLAN +--------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: ('(1000,1000),(200,200)'::box @> p) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; + count +------- + 1057 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: (p << '(5000,4000)'::point) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p << '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; + count +------- + 6000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: (p >> '(5000,4000)'::point) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p >> '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; + count +------- + 4999 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; + QUERY PLAN +-------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: (p <<| '(5000,4000)'::point) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p <<| '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; + count +------- + 5000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; + QUERY PLAN +-------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: (p |>> '(5000,4000)'::point) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p |>> '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; + count +------- + 5999 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Bitmap Heap Scan on quad_point_tbl + Recheck Cond: (p ~= '(4585,365)'::point) + -> Bitmap Index Scan on sp_quad_ind + Index Cond: (p ~= '(4585,365)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + QUERY PLAN +--------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on kd_point_tbl + Recheck Cond: (p <@ '(1000,1000),(200,200)'::box) + -> Bitmap Index Scan on sp_kd_ind + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + count +------- + 1057 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE box '(200,200,1000,1000)' @> p; + QUERY PLAN +--------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on kd_point_tbl + Recheck Cond: ('(1000,1000),(200,200)'::box @> p) + -> Bitmap Index Scan on sp_kd_ind + Index Cond: (p <@ '(1000,1000),(200,200)'::box) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM kd_point_tbl WHERE box '(200,200,1000,1000)' @> p; + count +------- + 1057 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p << '(5000, 4000)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on kd_point_tbl + Recheck Cond: (p << '(5000,4000)'::point) + -> Bitmap Index Scan on sp_kd_ind + Index Cond: (p << '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p << '(5000, 4000)'; + count +------- + 6000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p >> '(5000, 4000)'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on kd_point_tbl + Recheck Cond: (p >> '(5000,4000)'::point) + -> Bitmap Index Scan on sp_kd_ind + Index Cond: (p >> '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p >> '(5000, 4000)'; + count +------- + 4999 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p <<| '(5000, 4000)'; + QUERY PLAN +-------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on kd_point_tbl + Recheck Cond: (p <<| '(5000,4000)'::point) + -> Bitmap Index Scan on sp_kd_ind + Index Cond: (p <<| '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p <<| '(5000, 4000)'; + count +------- + 5000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p |>> '(5000, 4000)'; + QUERY PLAN +-------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on kd_point_tbl + Recheck Cond: (p |>> '(5000,4000)'::point) + -> Bitmap Index Scan on sp_kd_ind + Index Cond: (p |>> '(5000,4000)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p |>> '(5000, 4000)'; + count +------- + 5999 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p ~= '(4585, 365)'; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Bitmap Heap Scan on kd_point_tbl + Recheck Cond: (p ~= '(4585,365)'::point) + -> Bitmap Index Scan on sp_kd_ind + Index Cond: (p ~= '(4585,365)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM kd_point_tbl WHERE p ~= '(4585, 365)'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t = 'P0123456789abcdef'::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t = 'P0123456789abcdef'::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; + count +------- + 1000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; + QUERY PLAN +---------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t = 'P0123456789abcde'::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t = 'P0123456789abcde'::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t = 'P0123456789abcdefF'::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t = 'P0123456789abcdefF'::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; + QUERY PLAN +---------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t < 'Aztec Ct '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t < 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; + count +------- + 272 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; + QUERY PLAN +------------------------------------------------------------------------------ + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t ~<~ 'Aztec Ct '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t ~<~ 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; + count +------- + 272 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; + QUERY PLAN +----------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t <= 'Aztec Ct '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t <= 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; + count +------- + 273 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; + QUERY PLAN +------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t ~<=~ 'Aztec Ct '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t ~<=~ 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; + count +------- + 273 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; + QUERY PLAN +---------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t = 'Aztec Ct '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t = 'Aztec Ct '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; + QUERY PLAN +---------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t = 'Worth St '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t = 'Worth St '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; + count +------- + 2 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; + QUERY PLAN +----------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t >= 'Worth St '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t >= 'Worth St '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; + count +------- + 50 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; + QUERY PLAN +------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t ~>=~ 'Worth St '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t ~>=~ 'Worth St '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; + count +------- + 50 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; + QUERY PLAN +---------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t > 'Worth St '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t > 'Worth St '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; + count +------- + 48 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; + QUERY PLAN +------------------------------------------------------------------------------ + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t ~>~ 'Worth St '::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t ~>~ 'Worth St '::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; + count +------- + 48 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; + QUERY PLAN +------------------------------------------------ + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Recheck Cond: (t ^@ 'Worth'::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t ^@ 'Worth'::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; + count +------- + 2 +(1 row) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/src/test/singlenode_regress/expected/create_misc.out b/src/test/singlenode_regress/expected/create_misc.out new file mode 100644 index 00000000000..41bc4d77507 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_misc.out @@ -0,0 +1,151 @@ +-- +-- CREATE_MISC +-- +-- CLASS POPULATION +-- (any resemblance to real life is purely coincidental) +-- +INSERT INTO tenk2 SELECT * FROM tenk1; +CREATE TABLE onek2 AS SELECT * FROM onek; +INSERT INTO fast_emp4000 SELECT * FROM slow_emp4000; +SELECT * + INTO TABLE Bprime + FROM tenk1 + WHERE unique2 < 1000; +INSERT INTO hobbies_r (name, person) + SELECT 'posthacking', p.name + FROM person* p + WHERE p.name = 'mike' or p.name = 'jeff'; +INSERT INTO hobbies_r (name, person) + SELECT 'basketball', p.name + FROM person p + WHERE p.name = 'joe' or p.name = 'sally'; +INSERT INTO hobbies_r (name) VALUES ('skywalking'); +INSERT INTO equipment_r (name, hobby) VALUES ('advil', 'posthacking'); +INSERT INTO equipment_r (name, hobby) VALUES ('peet''s coffee', 'posthacking'); +INSERT INTO equipment_r (name, hobby) VALUES ('hightops', 'basketball'); +INSERT INTO equipment_r (name, hobby) VALUES ('guts', 'skywalking'); +INSERT INTO city VALUES +('Podunk', '(1,2),(3,4)', '100,127,1000'), +('Gotham', '(1000,34),(1100,334)', '123456,127,-1000,6789'); +TABLE city; + name | location | budget +--------+----------------------+----------------------- + Podunk | (3,4),(1,2) | 100,127,1000,0 + Gotham | (1100,334),(1000,34) | 123456,127,-1000,6789 +(2 rows) + +SELECT * + INTO TABLE ramp + FROM road + WHERE name ~ '.*Ramp'; +INSERT INTO ihighway + SELECT * + FROM road + WHERE name ~ 'I- .*'; +INSERT INTO shighway + SELECT * + FROM road + WHERE name ~ 'State Hwy.*'; +UPDATE shighway + SET surface = 'asphalt'; +INSERT INTO a_star (class, a) VALUES ('a', 1); +INSERT INTO a_star (class, a) VALUES ('a', 2); +INSERT INTO a_star (class) VALUES ('a'); +INSERT INTO b_star (class, a, b) VALUES ('b', 3, 'mumble'::text); +INSERT INTO b_star (class, a) VALUES ('b', 4); +INSERT INTO b_star (class, b) VALUES ('b', 'bumble'::text); +INSERT INTO b_star (class) VALUES ('b'); +INSERT INTO c_star (class, a, c) VALUES ('c', 5, 'hi mom'::name); +INSERT INTO c_star (class, a) VALUES ('c', 6); +INSERT INTO c_star (class, c) VALUES ('c', 'hi paul'::name); +INSERT INTO c_star (class) VALUES ('c'); +INSERT INTO d_star (class, a, b, c, d) + VALUES ('d', 7, 'grumble'::text, 'hi sunita'::name, '0.0'::float8); +INSERT INTO d_star (class, a, b, c) + VALUES ('d', 8, 'stumble'::text, 'hi koko'::name); +INSERT INTO d_star (class, a, b, d) + VALUES ('d', 9, 'rumble'::text, '1.1'::float8); +INSERT INTO d_star (class, a, c, d) + VALUES ('d', 10, 'hi kristin'::name, '10.01'::float8); +INSERT INTO d_star (class, b, c, d) + VALUES ('d', 'crumble'::text, 'hi boris'::name, '100.001'::float8); +INSERT INTO d_star (class, a, b) + VALUES ('d', 11, 'fumble'::text); +INSERT INTO d_star (class, a, c) + VALUES ('d', 12, 'hi avi'::name); +INSERT INTO d_star (class, a, d) + VALUES ('d', 13, '1000.0001'::float8); +INSERT INTO d_star (class, b, c) + VALUES ('d', 'tumble'::text, 'hi andrew'::name); +INSERT INTO d_star (class, b, d) + VALUES ('d', 'humble'::text, '10000.00001'::float8); +INSERT INTO d_star (class, c, d) + VALUES ('d', 'hi ginger'::name, '100000.000001'::float8); +INSERT INTO d_star (class, a) VALUES ('d', 14); +INSERT INTO d_star (class, b) VALUES ('d', 'jumble'::text); +INSERT INTO d_star (class, c) VALUES ('d', 'hi jolly'::name); +INSERT INTO d_star (class, d) VALUES ('d', '1000000.0000001'::float8); +INSERT INTO d_star (class) VALUES ('d'); +INSERT INTO e_star (class, a, c, e) + VALUES ('e', 15, 'hi carol'::name, '-1'::int2); +INSERT INTO e_star (class, a, c) + VALUES ('e', 16, 'hi bob'::name); +INSERT INTO e_star (class, a, e) + VALUES ('e', 17, '-2'::int2); +INSERT INTO e_star (class, c, e) + VALUES ('e', 'hi michelle'::name, '-3'::int2); +INSERT INTO e_star (class, a) + VALUES ('e', 18); +INSERT INTO e_star (class, c) + VALUES ('e', 'hi elisa'::name); +INSERT INTO e_star (class, e) + VALUES ('e', '-4'::int2); +INSERT INTO f_star (class, a, c, e, f) + VALUES ('f', 19, 'hi claire'::name, '-5'::int2, '(1,3),(2,4)'::polygon); +INSERT INTO f_star (class, a, c, e) + VALUES ('f', 20, 'hi mike'::name, '-6'::int2); +INSERT INTO f_star (class, a, c, f) + VALUES ('f', 21, 'hi marcel'::name, '(11,44),(22,55),(33,66)'::polygon); +INSERT INTO f_star (class, a, e, f) + VALUES ('f', 22, '-7'::int2, '(111,555),(222,666),(333,777),(444,888)'::polygon); +INSERT INTO f_star (class, c, e, f) + VALUES ('f', 'hi keith'::name, '-8'::int2, + '(1111,3333),(2222,4444)'::polygon); +INSERT INTO f_star (class, a, c) + VALUES ('f', 24, 'hi marc'::name); +INSERT INTO f_star (class, a, e) + VALUES ('f', 25, '-9'::int2); +INSERT INTO f_star (class, a, f) + VALUES ('f', 26, '(11111,33333),(22222,44444)'::polygon); +INSERT INTO f_star (class, c, e) + VALUES ('f', 'hi allison'::name, '-10'::int2); +INSERT INTO f_star (class, c, f) + VALUES ('f', 'hi jeff'::name, + '(111111,333333),(222222,444444)'::polygon); +INSERT INTO f_star (class, e, f) + VALUES ('f', '-11'::int2, '(1111111,3333333),(2222222,4444444)'::polygon); +INSERT INTO f_star (class, a) VALUES ('f', 27); +INSERT INTO f_star (class, c) VALUES ('f', 'hi carl'::name); +INSERT INTO f_star (class, e) VALUES ('f', '-12'::int2); +INSERT INTO f_star (class, f) + VALUES ('f', '(11111111,33333333),(22222222,44444444)'::polygon); +INSERT INTO f_star (class) VALUES ('f'); +-- Analyze the X_star tables for better plan stability in later tests +ANALYZE a_star; +ANALYZE b_star; +ANALYZE c_star; +ANALYZE d_star; +ANALYZE e_star; +ANALYZE f_star; +-- +-- for internal portal (cursor) tests +-- +CREATE TABLE iportaltest ( + i int4, + d float4, + p polygon +); +INSERT INTO iportaltest (i, d, p) + VALUES (1, 3.567, '(3.0,1.0),(4.0,2.0)'::polygon); +INSERT INTO iportaltest (i, d, p) + VALUES (2, 89.05, '(4.0,2.0),(3.0,1.0)'::polygon); diff --git a/src/test/singlenode_regress/expected/create_operator.out b/src/test/singlenode_regress/expected/create_operator.out new file mode 100644 index 00000000000..0852dc18396 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_operator.out @@ -0,0 +1,298 @@ +-- +-- CREATE_OPERATOR +-- +CREATE OPERATOR ## ( + leftarg = path, + rightarg = path, + function = path_inter, + commutator = ## +); +CREATE OPERATOR <% ( + leftarg = point, + rightarg = widget, + procedure = pt_in_widget, + commutator = >% , + negator = >=% +); +CREATE OPERATOR @#@ ( + rightarg = int8, -- prefix + procedure = factorial +); +CREATE OPERATOR #%# ( + leftarg = int8, -- fail, postfix is no longer supported + procedure = factorial +); +ERROR: operator right argument type must be specified +DETAIL: Postfix operators are not supported. +-- Test operator created above +SELECT point '(1,2)' <% widget '(0,0,3)' AS t, + point '(1,2)' <% widget '(0,0,1)' AS f; + t | f +---+--- + t | f +(1 row) + +-- Test comments +COMMENT ON OPERATOR ###### (NONE, int4) IS 'bad prefix'; +ERROR: operator does not exist: ###### integer +COMMENT ON OPERATOR ###### (int4, NONE) IS 'bad postfix'; +ERROR: postfix operators are not supported +COMMENT ON OPERATOR ###### (int4, int8) IS 'bad infix'; +ERROR: operator does not exist: integer ###### bigint +-- Check that DROP on a nonexistent op behaves sanely, too +DROP OPERATOR ###### (NONE, int4); +ERROR: operator does not exist: ###### integer +DROP OPERATOR ###### (int4, NONE); +ERROR: postfix operators are not supported +DROP OPERATOR ###### (int4, int8); +ERROR: operator does not exist: integer ###### bigint +-- => is disallowed as an operator name now +CREATE OPERATOR => ( + rightarg = int8, + procedure = factorial +); +ERROR: syntax error at or near "=>" +LINE 1: CREATE OPERATOR => ( + ^ +-- lexing of <=, >=, <>, != has a number of edge cases +-- (=> is tested elsewhere) +-- this is legal because ! is not allowed in sql ops +CREATE OPERATOR !=- ( + rightarg = int8, + procedure = factorial +); +SELECT !=- 10; + ?column? +---------- + 3628800 +(1 row) + +-- postfix operators don't work anymore +SELECT 10 !=-; +ERROR: syntax error at or near ";" +LINE 1: SELECT 10 !=-; + ^ +-- make sure lexer returns != as <> even in edge cases +SELECT 2 !=/**/ 1, 2 !=/**/ 2; + ?column? | ?column? +----------+---------- + t | f +(1 row) + +SELECT 2 !=-- comment to be removed by psql + 1; + ?column? +---------- + t +(1 row) + +DO $$ -- use DO to protect -- from psql + declare r boolean; + begin + execute $e$ select 2 !=-- comment + 1 $e$ into r; + raise info 'r = %', r; + end; +$$; +INFO: r = t +-- check that <= etc. followed by more operator characters are returned +-- as the correct token with correct precedence +SELECT true<>-1 BETWEEN 1 AND 1; -- BETWEEN has prec. above <> but below Op + ?column? +---------- + t +(1 row) + +SELECT false<>/**/1 BETWEEN 1 AND 1; + ?column? +---------- + t +(1 row) + +SELECT false<=-1 BETWEEN 1 AND 1; + ?column? +---------- + t +(1 row) + +SELECT false>=-1 BETWEEN 1 AND 1; + ?column? +---------- + t +(1 row) + +SELECT 2<=/**/3, 3>=/**/2, 2<>/**/3; + ?column? | ?column? | ?column? +----------+----------+---------- + t | t | t +(1 row) + +SELECT 3<=/**/2, 2>=/**/3, 2<>/**/2; + ?column? | ?column? | ?column? +----------+----------+---------- + f | f | f +(1 row) + +-- Should fail. CREATE OPERATOR requires USAGE on SCHEMA +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op1; +CREATE SCHEMA schema_op1; +GRANT USAGE ON SCHEMA schema_op1 TO PUBLIC; +REVOKE USAGE ON SCHEMA schema_op1 FROM regress_rol_op1; +NOTICE: no privileges could be revoked +SET ROLE regress_rol_op1; +CREATE OPERATOR schema_op1.#*# ( + rightarg = int8, + procedure = factorial +); +ERROR: permission denied for schema schema_op1 +ROLLBACK; +-- Should fail. SETOF type functions not allowed as argument (testing leftarg) +BEGIN TRANSACTION; +CREATE OPERATOR #*# ( + leftarg = SETOF int8, + procedure = factorial +); +ERROR: SETOF type not allowed for operator argument +ROLLBACK; +-- Should fail. SETOF type functions not allowed as argument (testing rightarg) +BEGIN TRANSACTION; +CREATE OPERATOR #*# ( + rightarg = SETOF int8, + procedure = factorial +); +ERROR: SETOF type not allowed for operator argument +ROLLBACK; +-- Should work. Sample text-book case +BEGIN TRANSACTION; +CREATE OR REPLACE FUNCTION fn_op2(boolean, boolean) +RETURNS boolean AS $$ + SELECT NULL::BOOLEAN; +$$ LANGUAGE sql IMMUTABLE; +CREATE OPERATOR === ( + LEFTARG = boolean, + RIGHTARG = boolean, + PROCEDURE = fn_op2, + COMMUTATOR = ===, + NEGATOR = !==, + RESTRICT = contsel, + JOIN = contjoinsel, + SORT1, SORT2, LTCMP, GTCMP, HASHES, MERGES +); +ROLLBACK; +-- Should fail. Invalid attribute +CREATE OPERATOR #@%# ( + rightarg = int8, + procedure = factorial, + invalid_att = int8 +); +WARNING: operator attribute "invalid_att" not recognized +-- Should fail. At least rightarg should be mandatorily specified +CREATE OPERATOR #@%# ( + procedure = factorial +); +ERROR: operator argument types must be specified +-- Should fail. Procedure should be mandatorily specified +CREATE OPERATOR #@%# ( + rightarg = int8 +); +ERROR: operator function must be specified +-- Should fail. CREATE OPERATOR requires USAGE on TYPE +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op3; +CREATE TYPE type_op3 AS ENUM ('new', 'open', 'closed'); +CREATE FUNCTION fn_op3(type_op3, int8) +RETURNS int8 AS $$ + SELECT NULL::int8; +$$ LANGUAGE sql IMMUTABLE; +REVOKE USAGE ON TYPE type_op3 FROM regress_rol_op3; +NOTICE: no privileges could be revoked +REVOKE USAGE ON TYPE type_op3 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC +SET ROLE regress_rol_op3; +CREATE OPERATOR #*# ( + leftarg = type_op3, + rightarg = int8, + procedure = fn_op3 +); +ERROR: permission denied for type type_op3 +ROLLBACK; +-- Should fail. CREATE OPERATOR requires USAGE on TYPE (need to check separately for rightarg) +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op4; +CREATE TYPE type_op4 AS ENUM ('new', 'open', 'closed'); +CREATE FUNCTION fn_op4(int8, type_op4) +RETURNS int8 AS $$ + SELECT NULL::int8; +$$ LANGUAGE sql IMMUTABLE; +REVOKE USAGE ON TYPE type_op4 FROM regress_rol_op4; +NOTICE: no privileges could be revoked +REVOKE USAGE ON TYPE type_op4 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC +SET ROLE regress_rol_op4; +CREATE OPERATOR #*# ( + leftarg = int8, + rightarg = type_op4, + procedure = fn_op4 +); +ERROR: permission denied for type type_op4 +ROLLBACK; +-- Should fail. CREATE OPERATOR requires EXECUTE on function +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op5; +CREATE TYPE type_op5 AS ENUM ('new', 'open', 'closed'); +CREATE FUNCTION fn_op5(int8, int8) +RETURNS int8 AS $$ + SELECT NULL::int8; +$$ LANGUAGE sql IMMUTABLE; +REVOKE EXECUTE ON FUNCTION fn_op5(int8, int8) FROM regress_rol_op5; +NOTICE: no privileges could be revoked +REVOKE EXECUTE ON FUNCTION fn_op5(int8, int8) FROM PUBLIC;-- Need to do this so that regress_rol_op3 is not allowed EXECUTE via PUBLIC +SET ROLE regress_rol_op5; +CREATE OPERATOR #*# ( + leftarg = int8, + rightarg = int8, + procedure = fn_op5 +); +ERROR: permission denied for function fn_op5 +ROLLBACK; +-- Should fail. CREATE OPERATOR requires USAGE on return TYPE +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op6; +CREATE TYPE type_op6 AS ENUM ('new', 'open', 'closed'); +CREATE FUNCTION fn_op6(int8, int8) +RETURNS type_op6 AS $$ + SELECT NULL::type_op6; +$$ LANGUAGE sql IMMUTABLE; +REVOKE USAGE ON TYPE type_op6 FROM regress_rol_op6; +NOTICE: no privileges could be revoked +REVOKE USAGE ON TYPE type_op6 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC +SET ROLE regress_rol_op6; +CREATE OPERATOR #*# ( + leftarg = int8, + rightarg = int8, + procedure = fn_op6 +); +ERROR: permission denied for type type_op6 +ROLLBACK; +-- invalid: non-lowercase quoted identifiers +CREATE OPERATOR === +( + "Leftarg" = box, + "Rightarg" = box, + "Procedure" = area_equal_function, + "Commutator" = ===, + "Negator" = !==, + "Restrict" = area_restriction_function, + "Join" = area_join_function, + "Hashes", + "Merges" +); +WARNING: operator attribute "Leftarg" not recognized +WARNING: operator attribute "Rightarg" not recognized +WARNING: operator attribute "Procedure" not recognized +WARNING: operator attribute "Commutator" not recognized +WARNING: operator attribute "Negator" not recognized +WARNING: operator attribute "Restrict" not recognized +WARNING: operator attribute "Join" not recognized +WARNING: operator attribute "Hashes" not recognized +WARNING: operator attribute "Merges" not recognized +ERROR: operator function must be specified diff --git a/src/test/singlenode_regress/expected/create_procedure.out b/src/test/singlenode_regress/expected/create_procedure.out new file mode 100644 index 00000000000..46c827f9791 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_procedure.out @@ -0,0 +1,383 @@ +CALL nonexistent(); -- error +ERROR: procedure nonexistent() does not exist +LINE 1: CALL nonexistent(); + ^ +HINT: No procedure matches the given name and argument types. You might need to add explicit type casts. +CALL random(); -- error +ERROR: random() is not a procedure +LINE 1: CALL random(); + ^ +HINT: To call a function, use SELECT. +CREATE FUNCTION cp_testfunc1(a int) RETURNS int LANGUAGE SQL AS $$ SELECT a $$; +CREATE TABLE cp_test (a int, b text); +CREATE PROCEDURE ptest1(x text) +LANGUAGE SQL +AS $$ +INSERT INTO cp_test VALUES (1, x); +$$; +\df ptest1 + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+--------+------------------+---------------------+------ + public | ptest1 | | IN x text | proc +(1 row) + +SELECT pg_get_functiondef('ptest1'::regproc); + pg_get_functiondef +------------------------------------------------------ + CREATE OR REPLACE PROCEDURE public.ptest1(IN x text)+ + LANGUAGE sql + + AS $procedure$ + + INSERT INTO cp_test VALUES (1, x); + + $procedure$ + + +(1 row) + +-- show only normal functions +\dfn public.*test*1 + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+--------------+------------------+---------------------+------ + public | cp_testfunc1 | integer | a integer | func +(1 row) + +-- show only procedures +\dfp public.*test*1 + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+--------+------------------+---------------------+------ + public | ptest1 | | IN x text | proc +(1 row) + +SELECT ptest1('x'); -- error +ERROR: ptest1(unknown) is a procedure +LINE 1: SELECT ptest1('x'); + ^ +HINT: To call a procedure, use CALL. +CALL ptest1('a'); -- ok +CALL ptest1('xy' || 'zzy'); -- ok, constant-folded arg +CALL ptest1(substring(random()::numeric(20,15)::text, 1, 1)); -- ok, volatile arg +SELECT * FROM cp_test ORDER BY b COLLATE "C"; + a | b +---+------- + 1 | 0 + 1 | a + 1 | xyzzy +(3 rows) + +-- SQL-standard body +CREATE PROCEDURE ptest1s(x text) +LANGUAGE SQL +BEGIN ATOMIC + INSERT INTO cp_test VALUES (1, x); +END; +\df ptest1s + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+---------+------------------+---------------------+------ + public | ptest1s | | IN x text | proc +(1 row) + +SELECT pg_get_functiondef('ptest1s'::regproc); + pg_get_functiondef +------------------------------------------------------- + CREATE OR REPLACE PROCEDURE public.ptest1s(IN x text)+ + LANGUAGE sql + + BEGIN ATOMIC + + INSERT INTO cp_test (a, b) + + VALUES (1, ptest1s.x); + + END + + +(1 row) + +CALL ptest1s('b'); +SELECT * FROM cp_test ORDER BY b COLLATE "C"; + a | b +---+------- + 1 | 0 + 1 | a + 1 | b + 1 | xyzzy +(4 rows) + +-- utitlity functions currently not supported here +CREATE PROCEDURE ptestx() +LANGUAGE SQL +BEGIN ATOMIC + CREATE TABLE x (a int); +END; +ERROR: CREATE TABLE is not yet supported in unquoted SQL function body +CREATE PROCEDURE ptest2() +LANGUAGE SQL +AS $$ +SELECT 5; +$$; +CALL ptest2(); +-- nested CALL +TRUNCATE cp_test; +CREATE PROCEDURE ptest3(y text) +LANGUAGE SQL +AS $$ +CALL ptest1(y); +CALL ptest1($1); +$$; +CALL ptest3('b'); +SELECT * FROM cp_test; + a | b +---+--- + 1 | b + 1 | b +(2 rows) + +-- output arguments +CREATE PROCEDURE ptest4a(INOUT a int, INOUT b int) +LANGUAGE SQL +AS $$ +SELECT 1, 2; +$$; +CALL ptest4a(NULL, NULL); + a | b +---+--- + 1 | 2 +(1 row) + +CREATE PROCEDURE ptest4b(INOUT b int, INOUT a int) +LANGUAGE SQL +AS $$ +CALL ptest4a(a, b); -- error, not supported +$$; +ERROR: calling procedures with output arguments is not supported in SQL functions +CONTEXT: SQL function "ptest4b" +DROP PROCEDURE ptest4a; +-- named and default parameters +CREATE OR REPLACE PROCEDURE ptest5(a int, b text, c int default 100) +LANGUAGE SQL +AS $$ +INSERT INTO cp_test VALUES(a, b); +INSERT INTO cp_test VALUES(c, b); +$$; +TRUNCATE cp_test; +CALL ptest5(10, 'Hello', 20); +CALL ptest5(10, 'Hello'); +CALL ptest5(10, b => 'Hello'); +CALL ptest5(b => 'Hello', a => 10); +SELECT * FROM cp_test; + a | b +-----+------- + 10 | Hello + 20 | Hello + 10 | Hello + 100 | Hello + 10 | Hello + 100 | Hello + 10 | Hello + 100 | Hello +(8 rows) + +-- polymorphic types +CREATE PROCEDURE ptest6(a int, b anyelement) +LANGUAGE SQL +AS $$ +SELECT NULL::int; +$$; +CALL ptest6(1, 2); +-- collation assignment +CREATE PROCEDURE ptest7(a text, b text) +LANGUAGE SQL +AS $$ +SELECT a = b; +$$; +CALL ptest7(least('a', 'b'), 'a'); +-- empty body +CREATE PROCEDURE ptest8(x text) +BEGIN ATOMIC +END; +\df ptest8 + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+--------+------------------+---------------------+------ + public | ptest8 | | IN x text | proc +(1 row) + +SELECT pg_get_functiondef('ptest8'::regproc); + pg_get_functiondef +------------------------------------------------------ + CREATE OR REPLACE PROCEDURE public.ptest8(IN x text)+ + LANGUAGE sql + + BEGIN ATOMIC + + END + + +(1 row) + +CALL ptest8(''); +-- OUT parameters +CREATE PROCEDURE ptest9(OUT a int) +LANGUAGE SQL +AS $$ +INSERT INTO cp_test VALUES (1, 'a'); +SELECT 1; +$$; +-- standard way to do a call: +CALL ptest9(NULL); + a +--- + 1 +(1 row) + +-- you can write an expression, but it's not evaluated +CALL ptest9(1/0); -- no error + a +--- + 1 +(1 row) + +-- ... and it had better match the type of the parameter +CALL ptest9(1./0.); -- error +ERROR: procedure ptest9(numeric) does not exist +LINE 1: CALL ptest9(1./0.); + ^ +HINT: No procedure matches the given name and argument types. You might need to add explicit type casts. +-- check named-parameter matching +CREATE PROCEDURE ptest10(OUT a int, IN b int, IN c int) +LANGUAGE SQL AS $$ SELECT b - c $$; +CALL ptest10(null, 7, 4); + a +--- + 3 +(1 row) + +CALL ptest10(a => null, b => 8, c => 2); + a +--- + 6 +(1 row) + +CALL ptest10(null, 7, c => 2); + a +--- + 5 +(1 row) + +CALL ptest10(null, c => 4, b => 11); + a +--- + 7 +(1 row) + +CALL ptest10(b => 8, c => 2, a => 0); + a +--- + 6 +(1 row) + +CREATE PROCEDURE ptest11(a OUT int, VARIADIC b int[]) LANGUAGE SQL + AS $$ SELECT b[1] + b[2] $$; +CALL ptest11(null, 11, 12, 13); + a +---- + 23 +(1 row) + +-- check resolution of ambiguous DROP commands +CREATE PROCEDURE ptest10(IN a int, IN b int, IN c int) +LANGUAGE SQL AS $$ SELECT a + b - c $$; +\df ptest10 + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+---------+------------------+-------------------------------------------+------ + public | ptest10 | | IN a integer, IN b integer, IN c integer | proc + public | ptest10 | | OUT a integer, IN b integer, IN c integer | proc +(2 rows) + +drop procedure ptest10; -- fail +ERROR: procedure name "ptest10" is not unique +HINT: Specify the argument list to select the procedure unambiguously. +drop procedure ptest10(int, int, int); -- fail +ERROR: procedure name "ptest10" is not unique +begin; +drop procedure ptest10(out int, int, int); +\df ptest10 + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+---------+------------------+------------------------------------------+------ + public | ptest10 | | IN a integer, IN b integer, IN c integer | proc +(1 row) + +drop procedure ptest10(int, int, int); -- now this would work +rollback; +begin; +drop procedure ptest10(in int, int, int); +\df ptest10 + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+---------+------------------+-------------------------------------------+------ + public | ptest10 | | OUT a integer, IN b integer, IN c integer | proc +(1 row) + +drop procedure ptest10(int, int, int); -- now this would work +rollback; +-- various error cases +CALL version(); -- error: not a procedure +ERROR: version() is not a procedure +LINE 1: CALL version(); + ^ +HINT: To call a function, use SELECT. +CALL sum(1); -- error: not a procedure +ERROR: sum(integer) is not a procedure +LINE 1: CALL sum(1); + ^ +HINT: To call a function, use SELECT. +CREATE PROCEDURE ptestx() LANGUAGE SQL WINDOW AS $$ INSERT INTO cp_test VALUES (1, 'a') $$; +ERROR: invalid attribute in procedure definition +LINE 1: CREATE PROCEDURE ptestx() LANGUAGE SQL WINDOW AS $$ INSERT I... + ^ +CREATE PROCEDURE ptestx() LANGUAGE SQL STRICT AS $$ INSERT INTO cp_test VALUES (1, 'a') $$; +ERROR: invalid attribute in procedure definition +LINE 1: CREATE PROCEDURE ptestx() LANGUAGE SQL STRICT AS $$ INSERT I... + ^ +CREATE PROCEDURE ptestx(a VARIADIC int[], b OUT int) LANGUAGE SQL + AS $$ SELECT a[1] $$; +ERROR: VARIADIC parameter must be the last parameter +CREATE PROCEDURE ptestx(a int DEFAULT 42, b OUT int) LANGUAGE SQL + AS $$ SELECT a $$; +ERROR: procedure OUT parameters cannot appear after one with a default value +ALTER PROCEDURE ptest1(text) STRICT; +ERROR: invalid attribute in procedure definition +LINE 1: ALTER PROCEDURE ptest1(text) STRICT; + ^ +ALTER FUNCTION ptest1(text) VOLATILE; -- error: not a function +ERROR: ptest1(text) is not a function +ALTER PROCEDURE cp_testfunc1(int) VOLATILE; -- error: not a procedure +ERROR: cp_testfunc1(integer) is not a procedure +ALTER PROCEDURE nonexistent() VOLATILE; +ERROR: procedure nonexistent() does not exist +DROP FUNCTION ptest1(text); -- error: not a function +ERROR: ptest1(text) is not a function +DROP PROCEDURE cp_testfunc1(int); -- error: not a procedure +ERROR: cp_testfunc1(integer) is not a procedure +DROP PROCEDURE nonexistent(); +ERROR: procedure nonexistent() does not exist +-- privileges +CREATE USER regress_cp_user1; +GRANT INSERT ON cp_test TO regress_cp_user1; +REVOKE EXECUTE ON PROCEDURE ptest1(text) FROM PUBLIC; +SET ROLE regress_cp_user1; +CALL ptest1('a'); -- error +ERROR: permission denied for procedure ptest1 +RESET ROLE; +GRANT EXECUTE ON PROCEDURE ptest1(text) TO regress_cp_user1; +SET ROLE regress_cp_user1; +CALL ptest1('a'); -- ok +RESET ROLE; +-- ROUTINE syntax +ALTER ROUTINE cp_testfunc1(int) RENAME TO cp_testfunc1a; +ALTER ROUTINE cp_testfunc1a RENAME TO cp_testfunc1; +ALTER ROUTINE ptest1(text) RENAME TO ptest1a; +ALTER ROUTINE ptest1a RENAME TO ptest1; +DROP ROUTINE cp_testfunc1(int); +-- cleanup +DROP PROCEDURE ptest1; +DROP PROCEDURE ptest1s; +DROP PROCEDURE ptest2; +DROP TABLE cp_test; +DROP USER regress_cp_user1; diff --git a/src/test/singlenode_regress/expected/create_table.out b/src/test/singlenode_regress/expected/create_table.out new file mode 100644 index 00000000000..a60fbfba570 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_table.out @@ -0,0 +1,1327 @@ +-- +-- CREATE_TABLE +-- +-- +-- CLASS DEFINITIONS +-- +CREATE TABLE hobbies_r ( + name text, + person text +); +CREATE TABLE equipment_r ( + name text, + hobby text +); +CREATE TABLE onek ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); +CREATE TABLE tenk1 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); +CREATE TABLE tenk2 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); +CREATE TABLE person ( + name text, + age int4, + location point +); +CREATE TABLE emp ( + salary int4, + manager name +) INHERITS (person); +CREATE TABLE student ( + gpa float8 +) INHERITS (person); +CREATE TABLE stud_emp ( + percent int4 +) INHERITS (emp, student); +NOTICE: merging multiple inherited definitions of column "name" +NOTICE: merging multiple inherited definitions of column "age" +NOTICE: merging multiple inherited definitions of column "location" +CREATE TABLE city ( + name name, + location box, + budget city_budget +); +CREATE TABLE dept ( + dname name, + mgrname text +); +CREATE TABLE slow_emp4000 ( + home_base box +); +CREATE TABLE fast_emp4000 ( + home_base box +); +CREATE TABLE road ( + name text, + thepath path +); +CREATE TABLE ihighway () INHERITS (road); +CREATE TABLE shighway ( + surface text +) INHERITS (road); +CREATE TABLE real_city ( + pop int4, + cname text, + outline path +); +-- +-- test the "star" operators a bit more thoroughly -- this time, +-- throw in lots of NULL fields... +-- +-- a is the type root +-- b and c inherit from a (one-level single inheritance) +-- d inherits from b and c (two-level multiple inheritance) +-- e inherits from c (two-level single inheritance) +-- f inherits from e (three-level single inheritance) +-- +CREATE TABLE a_star ( + class char, + a int4 +); +CREATE TABLE b_star ( + b text +) INHERITS (a_star); +CREATE TABLE c_star ( + c name +) INHERITS (a_star); +CREATE TABLE d_star ( + d float8 +) INHERITS (b_star, c_star); +NOTICE: merging multiple inherited definitions of column "class" +NOTICE: merging multiple inherited definitions of column "a" +CREATE TABLE e_star ( + e int2 +) INHERITS (c_star); +CREATE TABLE f_star ( + f polygon +) INHERITS (e_star); +CREATE TABLE aggtest ( + a int2, + b float4 +); +CREATE TABLE hash_i4_heap ( + seqno int4, + random int4 +); +CREATE TABLE hash_name_heap ( + seqno int4, + random name +); +CREATE TABLE hash_txt_heap ( + seqno int4, + random text +); +CREATE TABLE hash_f8_heap ( + seqno int4, + random float8 +); +-- don't include the hash_ovfl_heap stuff in the distribution +-- the data set is too large for what it's worth +-- +-- CREATE TABLE hash_ovfl_heap ( +-- x int4, +-- y int4 +-- ); +CREATE TABLE bt_i4_heap ( + seqno int4, + random int4 +); +CREATE TABLE bt_name_heap ( + seqno name, + random int4 +); +CREATE TABLE bt_txt_heap ( + seqno text, + random int4 +); +CREATE TABLE bt_f8_heap ( + seqno float8, + random int4 +); +CREATE TABLE array_op_test ( + seqno int4, + i int4[], + t text[] +); +CREATE TABLE array_index_op_test ( + seqno int4, + i int4[], + t text[] +); +CREATE TABLE testjsonb ( + j jsonb +); +CREATE TABLE unknowntab ( + u unknown -- fail +); +ERROR: column "u" has pseudo-type unknown +CREATE TYPE unknown_comptype AS ( + u unknown -- fail +); +ERROR: column "u" has pseudo-type unknown +CREATE TABLE IF NOT EXISTS test_tsvector( + t text, + a tsvector +); +CREATE TABLE IF NOT EXISTS test_tsvector( + t text +); +NOTICE: relation "test_tsvector" already exists, skipping +-- invalid: non-lowercase quoted reloptions identifiers +CREATE TABLE tas_case WITH ("Fillfactor" = 10) AS SELECT 1 a; +ERROR: unrecognized parameter "Fillfactor" +CREATE UNLOGGED TABLE unlogged1 (a int primary key); -- OK +CREATE TEMPORARY TABLE unlogged2 (a int primary key); -- OK +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged\d' ORDER BY relname; + relname | relkind | relpersistence +----------------+---------+---------------- + unlogged1 | r | u + unlogged1_pkey | i | u + unlogged2 | r | t + unlogged2_pkey | i | t +(4 rows) + +REINDEX INDEX unlogged1_pkey; +REINDEX INDEX unlogged2_pkey; +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged\d' ORDER BY relname; + relname | relkind | relpersistence +----------------+---------+---------------- + unlogged1 | r | u + unlogged1_pkey | i | u + unlogged2 | r | t + unlogged2_pkey | i | t +(4 rows) + +DROP TABLE unlogged2; +INSERT INTO unlogged1 VALUES (42); +CREATE UNLOGGED TABLE public.unlogged2 (a int primary key); -- also OK +CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int primary key); -- not OK +ERROR: only temporary relations may be created in temporary schemas +LINE 1: CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int primary key); + ^ +CREATE TABLE pg_temp.implicitly_temp (a int primary key); -- OK +CREATE TEMP TABLE explicitly_temp (a int primary key); -- also OK +CREATE TEMP TABLE pg_temp.doubly_temp (a int primary key); -- also OK +CREATE TEMP TABLE public.temp_to_perm (a int primary key); -- not OK +ERROR: cannot create temporary relation in non-temporary schema +LINE 1: CREATE TEMP TABLE public.temp_to_perm (a int primary key); + ^ +DROP TABLE unlogged1, public.unlogged2; +CREATE TABLE as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r'; +CREATE TABLE as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r'; +ERROR: relation "as_select1" already exists +CREATE TABLE IF NOT EXISTS as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r'; +NOTICE: relation "as_select1" already exists, skipping +DROP TABLE as_select1; +PREPARE select1 AS SELECT 1 as a; +CREATE TABLE as_select1 AS EXECUTE select1; +CREATE TABLE as_select1 AS EXECUTE select1; +ERROR: relation "as_select1" already exists +SELECT * FROM as_select1; + a +--- + 1 +(1 row) + +CREATE TABLE IF NOT EXISTS as_select1 AS EXECUTE select1; +NOTICE: relation "as_select1" already exists, skipping +DROP TABLE as_select1; +DEALLOCATE select1; +-- create an extra wide table to test for issues related to that +-- (temporarily hide query, to avoid the long CREATE TABLE stmt) +\set ECHO none +INSERT INTO extra_wide_table(firstc, lastc) VALUES('first col', 'last col'); +SELECT firstc, lastc FROM extra_wide_table; + firstc | lastc +-----------+---------- + first col | last col +(1 row) + +-- check that tables with oids cannot be created anymore +CREATE TABLE withoid() WITH OIDS; +ERROR: syntax error at or near "OIDS" +LINE 1: CREATE TABLE withoid() WITH OIDS; + ^ +CREATE TABLE withoid() WITH (oids); +ERROR: tables declared WITH OIDS are not supported +CREATE TABLE withoid() WITH (oids = true); +ERROR: tables declared WITH OIDS are not supported +-- but explicitly not adding oids is still supported +CREATE TEMP TABLE withoutoid() WITHOUT OIDS; DROP TABLE withoutoid; +CREATE TEMP TABLE withoutoid() WITH (oids = false); DROP TABLE withoutoid; +-- check restriction with default expressions +-- invalid use of column reference in default expressions +CREATE TABLE default_expr_column (id int DEFAULT (id)); +ERROR: cannot use column reference in DEFAULT expression +LINE 1: CREATE TABLE default_expr_column (id int DEFAULT (id)); + ^ +CREATE TABLE default_expr_column (id int DEFAULT (bar.id)); +ERROR: cannot use column reference in DEFAULT expression +LINE 1: CREATE TABLE default_expr_column (id int DEFAULT (bar.id)); + ^ +CREATE TABLE default_expr_agg_column (id int DEFAULT (avg(id))); +ERROR: cannot use column reference in DEFAULT expression +LINE 1: ...TE TABLE default_expr_agg_column (id int DEFAULT (avg(id))); + ^ +-- invalid column definition +CREATE TABLE default_expr_non_column (a int DEFAULT (avg(non_existent))); +ERROR: cannot use column reference in DEFAULT expression +LINE 1: ...TABLE default_expr_non_column (a int DEFAULT (avg(non_existe... + ^ +-- invalid use of aggregate +CREATE TABLE default_expr_agg (a int DEFAULT (avg(1))); +ERROR: aggregate functions are not allowed in DEFAULT expressions +LINE 1: CREATE TABLE default_expr_agg (a int DEFAULT (avg(1))); + ^ +-- invalid use of subquery +CREATE TABLE default_expr_agg (a int DEFAULT (select 1)); +ERROR: cannot use subquery in DEFAULT expression +LINE 1: CREATE TABLE default_expr_agg (a int DEFAULT (select 1)); + ^ +-- invalid use of set-returning function +CREATE TABLE default_expr_agg (a int DEFAULT (generate_series(1,3))); +ERROR: set-returning functions are not allowed in DEFAULT expressions +LINE 1: CREATE TABLE default_expr_agg (a int DEFAULT (generate_serie... + ^ +-- Verify that subtransaction rollback restores rd_createSubid. +BEGIN; +CREATE TABLE remember_create_subid (c int); +SAVEPOINT q; DROP TABLE remember_create_subid; ROLLBACK TO q; +COMMIT; +DROP TABLE remember_create_subid; +-- Verify that subtransaction rollback restores rd_firstRelfilenodeSubid. +CREATE TABLE remember_node_subid (c int); +BEGIN; +ALTER TABLE remember_node_subid ALTER c TYPE bigint; +SAVEPOINT q; DROP TABLE remember_node_subid; ROLLBACK TO q; +COMMIT; +DROP TABLE remember_node_subid; +-- +-- Partitioned tables +-- +-- cannot combine INHERITS and PARTITION BY (although grammar allows) +CREATE TABLE partitioned ( + a int +) INHERITS (some_table) PARTITION BY LIST (a); +ERROR: cannot create partitioned table as inheritance child +-- cannot use more than 1 column as partition key for list partitioned table +CREATE TABLE partitioned ( + a1 int, + a2 int +) PARTITION BY LIST (a1, a2); -- fail +ERROR: cannot use "list" partition strategy with more than one column +-- unsupported constraint type for partitioned tables +CREATE TABLE partitioned ( + a int, + EXCLUDE USING gist (a WITH &&) +) PARTITION BY RANGE (a); +ERROR: exclusion constraints are not supported on partitioned tables +LINE 3: EXCLUDE USING gist (a WITH &&) + ^ +-- prevent using prohibited expressions in the key +CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (retset(a)); +ERROR: set-returning functions are not allowed in partition key expressions +DROP FUNCTION retset(int); +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE ((avg(a))); +ERROR: aggregate functions are not allowed in partition key expressions +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE ((avg(a) OVER (PARTITION BY b))); +ERROR: window functions are not allowed in partition key expressions +CREATE TABLE partitioned ( + a int +) PARTITION BY LIST ((a LIKE (SELECT 1))); +ERROR: cannot use subquery in partition key expression +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE ((42)); +ERROR: cannot use constant expression as partition key +CREATE FUNCTION const_func () RETURNS int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (const_func()); +ERROR: cannot use constant expression as partition key +DROP FUNCTION const_func(); +-- only accept valid partitioning strategy +CREATE TABLE partitioned ( + a int +) PARTITION BY MAGIC (a); +ERROR: unrecognized partitioning strategy "magic" +-- specified column must be present in the table +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (b); +ERROR: column "b" named in partition key does not exist +LINE 3: ) PARTITION BY RANGE (b); + ^ +-- cannot use system columns in partition key +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (xmin); +ERROR: cannot use system column "xmin" in partition key +LINE 3: ) PARTITION BY RANGE (xmin); + ^ +-- cannot use pseudotypes +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (((a, b))); +ERROR: partition key column 1 has pseudo-type record +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (a, ('unknown')); +ERROR: partition key column 2 has pseudo-type unknown +-- functions in key must be immutable +CREATE FUNCTION immut_func (a int) RETURNS int AS $$ SELECT a + random()::int; $$ LANGUAGE SQL; +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (immut_func(a)); +ERROR: functions in partition key expression must be marked IMMUTABLE +DROP FUNCTION immut_func(int); +-- prevent using columns of unsupported types in key (type must have a btree operator class) +CREATE TABLE partitioned ( + a point +) PARTITION BY LIST (a); +ERROR: data type point has no default operator class for access method "btree" +HINT: You must specify a btree operator class or define a default btree operator class for the data type. +CREATE TABLE partitioned ( + a point +) PARTITION BY LIST (a point_ops); +ERROR: operator class "point_ops" does not exist for access method "btree" +CREATE TABLE partitioned ( + a point +) PARTITION BY RANGE (a); +ERROR: data type point has no default operator class for access method "btree" +HINT: You must specify a btree operator class or define a default btree operator class for the data type. +CREATE TABLE partitioned ( + a point +) PARTITION BY RANGE (a point_ops); +ERROR: operator class "point_ops" does not exist for access method "btree" +-- cannot add NO INHERIT constraints to partitioned tables +CREATE TABLE partitioned ( + a int, + CONSTRAINT check_a CHECK (a > 0) NO INHERIT +) PARTITION BY RANGE (a); +ERROR: cannot add NO INHERIT constraint to partitioned table "partitioned" +-- some checks after successful creation of a partitioned table +CREATE FUNCTION plusone(a int) RETURNS INT AS $$ SELECT a+1; $$ LANGUAGE SQL; +CREATE TABLE partitioned ( + a int, + b int, + c text, + d text +) PARTITION BY RANGE (a oid_ops, plusone(b), c collate "default", d collate "C"); +-- check relkind +SELECT relkind FROM pg_class WHERE relname = 'partitioned'; + relkind +--------- + p +(1 row) + +-- prevent a function referenced in partition key from being dropped +DROP FUNCTION plusone(int); +ERROR: cannot drop function plusone(integer) because other objects depend on it +DETAIL: table partitioned depends on function plusone(integer) +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- partitioned table cannot participate in regular inheritance +CREATE TABLE partitioned2 ( + a int, + b text +) PARTITION BY RANGE ((a+1), substr(b, 1, 5)); +CREATE TABLE fail () INHERITS (partitioned2); +ERROR: cannot inherit from partitioned table "partitioned2" +-- Partition key in describe output +\d partitioned + Partitioned table "public.partitioned" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | + d | text | | | +Partition key: RANGE (a oid_ops, plusone(b), c, d COLLATE "C") +Number of partitions: 0 + +\d+ partitioned2 + Partitioned table "public.partitioned2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | +Partition key: RANGE (((a + 1)), substr(b, 1, 5)) +Number of partitions: 0 + +INSERT INTO partitioned2 VALUES (1, 'hello'); +ERROR: no partition of relation "partitioned2" found for row +DETAIL: Partition key of the failing row contains ((a + 1), substr(b, 1, 5)) = (2, hello). +CREATE TABLE part2_1 PARTITION OF partitioned2 FOR VALUES FROM (-1, 'aaaaa') TO (100, 'ccccc'); +\d+ part2_1 + Table "public.part2_1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | +Partition of: partitioned2 FOR VALUES FROM ('-1', 'aaaaa') TO (100, 'ccccc') +Partition constraint: (((a + 1) IS NOT NULL) AND (substr(b, 1, 5) IS NOT NULL) AND (((a + 1) > '-1'::integer) OR (((a + 1) = '-1'::integer) AND (substr(b, 1, 5) >= 'aaaaa'::text))) AND (((a + 1) < 100) OR (((a + 1) = 100) AND (substr(b, 1, 5) < 'ccccc'::text)))) + +DROP TABLE partitioned, partitioned2; +-- check reference to partitioned table's rowtype in partition descriptor +create table partitioned (a int, b int) + partition by list ((row(a, b)::partitioned)); +create table partitioned1 + partition of partitioned for values in ('(1,2)'::partitioned); +create table partitioned2 + partition of partitioned for values in ('(2,4)'::partitioned); +explain (costs off) +select * from partitioned where row(a,b)::partitioned = '(1,2)'::partitioned; + QUERY PLAN +----------------------------------------------------------- + Seq Scan on partitioned1 partitioned + Filter: (ROW(a, b)::partitioned = '(1,2)'::partitioned) +(2 rows) + +drop table partitioned; +-- whole-row Var in partition key works too +create table partitioned (a int, b int) + partition by list ((partitioned)); +create table partitioned1 + partition of partitioned for values in ('(1,2)'); +create table partitioned2 + partition of partitioned for values in ('(2,4)'); +explain (costs off) +select * from partitioned where partitioned = '(1,2)'::partitioned; + QUERY PLAN +----------------------------------------------------------------- + Seq Scan on partitioned1 partitioned + Filter: ((partitioned.*)::partitioned = '(1,2)'::partitioned) +(2 rows) + +\d+ partitioned1 + Table "public.partitioned1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition of: partitioned FOR VALUES IN ('(1,2)') +Partition constraint: (((partitioned1.*)::partitioned IS DISTINCT FROM NULL) AND ((partitioned1.*)::partitioned = '(1,2)'::partitioned)) + +drop table partitioned; +-- check that dependencies of partition columns are handled correctly +create domain intdom1 as int; +create table partitioned ( + a intdom1, + b text +) partition by range (a); +alter table partitioned drop column a; -- fail +ERROR: cannot drop column "a" because it is part of the partition key of relation "partitioned" +drop domain intdom1; -- fail, requires cascade +ERROR: cannot drop type intdom1 because other objects depend on it +DETAIL: table partitioned depends on type intdom1 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +drop domain intdom1 cascade; +NOTICE: drop cascades to table partitioned +table partitioned; -- gone +ERROR: relation "partitioned" does not exist +LINE 1: table partitioned; + ^ +-- likewise for columns used in partition expressions +create domain intdom1 as int; +create table partitioned ( + a intdom1, + b text +) partition by range (plusone(a)); +alter table partitioned drop column a; -- fail +ERROR: cannot drop column "a" because it is part of the partition key of relation "partitioned" +drop domain intdom1; -- fail, requires cascade +ERROR: cannot drop type intdom1 because other objects depend on it +DETAIL: table partitioned depends on type intdom1 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +drop domain intdom1 cascade; +NOTICE: drop cascades to table partitioned +table partitioned; -- gone +ERROR: relation "partitioned" does not exist +LINE 1: table partitioned; + ^ +-- +-- Partitions +-- +-- check partition bound syntax +CREATE TABLE list_parted ( + a int +) PARTITION BY LIST (a); +CREATE TABLE part_p1 PARTITION OF list_parted FOR VALUES IN ('1'); +CREATE TABLE part_p2 PARTITION OF list_parted FOR VALUES IN (2); +CREATE TABLE part_p3 PARTITION OF list_parted FOR VALUES IN ((2+1)); +CREATE TABLE part_null PARTITION OF list_parted FOR VALUES IN (null); +\d+ list_parted + Partitioned table "public.list_parted" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | +Partition key: LIST (a) +Partitions: part_null FOR VALUES IN (NULL), + part_p1 FOR VALUES IN (1), + part_p2 FOR VALUES IN (2), + part_p3 FOR VALUES IN (3) + +-- forbidden expressions for partition bound with list partitioned table +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (somename); +ERROR: cannot use column reference in partition bound expression +LINE 1: ...expr_fail PARTITION OF list_parted FOR VALUES IN (somename); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (somename.somename); +ERROR: cannot use column reference in partition bound expression +LINE 1: ...expr_fail PARTITION OF list_parted FOR VALUES IN (somename.s... + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (a); +ERROR: cannot use column reference in partition bound expression +LINE 1: ..._bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (a); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (sum(a)); +ERROR: cannot use column reference in partition bound expression +LINE 1: ...s_expr_fail PARTITION OF list_parted FOR VALUES IN (sum(a)); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (sum(somename)); +ERROR: cannot use column reference in partition bound expression +LINE 1: ..._fail PARTITION OF list_parted FOR VALUES IN (sum(somename))... + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (sum(1)); +ERROR: aggregate functions are not allowed in partition bound +LINE 1: ...s_expr_fail PARTITION OF list_parted FOR VALUES IN (sum(1)); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN ((select 1)); +ERROR: cannot use subquery in partition bound +LINE 1: ...expr_fail PARTITION OF list_parted FOR VALUES IN ((select 1)... + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (generate_series(4, 6)); +ERROR: set-returning functions are not allowed in partition bound +LINE 1: ...expr_fail PARTITION OF list_parted FOR VALUES IN (generate_s... + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN ((1+1) collate "POSIX"); +ERROR: collations are not supported by type integer +LINE 1: ...ail PARTITION OF list_parted FOR VALUES IN ((1+1) collate "P... + ^ +-- syntax does not allow empty list of values for list partitions +CREATE TABLE fail_part PARTITION OF list_parted FOR VALUES IN (); +ERROR: syntax error at or near ")" +LINE 1: ...E TABLE fail_part PARTITION OF list_parted FOR VALUES IN (); + ^ +-- trying to specify range for list partitioned table +CREATE TABLE fail_part PARTITION OF list_parted FOR VALUES FROM (1) TO (2); +ERROR: invalid bound specification for a list partition +LINE 1: ...BLE fail_part PARTITION OF list_parted FOR VALUES FROM (1) T... + ^ +-- trying to specify modulus and remainder for list partitioned table +CREATE TABLE fail_part PARTITION OF list_parted FOR VALUES WITH (MODULUS 10, REMAINDER 1); +ERROR: invalid bound specification for a list partition +LINE 1: ...BLE fail_part PARTITION OF list_parted FOR VALUES WITH (MODU... + ^ +-- check default partition cannot be created more than once +CREATE TABLE part_default PARTITION OF list_parted DEFAULT; +CREATE TABLE fail_default_part PARTITION OF list_parted DEFAULT; +ERROR: partition "fail_default_part" conflicts with existing default partition "part_default" +LINE 1: ...TE TABLE fail_default_part PARTITION OF list_parted DEFAULT; + ^ +-- specified literal can't be cast to the partition column data type +CREATE TABLE bools ( + a bool +) PARTITION BY LIST (a); +CREATE TABLE bools_true PARTITION OF bools FOR VALUES IN (1); +ERROR: specified value cannot be cast to type boolean for column "a" +LINE 1: ...REATE TABLE bools_true PARTITION OF bools FOR VALUES IN (1); + ^ +DROP TABLE bools; +-- specified literal can be cast, and the cast might not be immutable +CREATE TABLE moneyp ( + a money +) PARTITION BY LIST (a); +CREATE TABLE moneyp_10 PARTITION OF moneyp FOR VALUES IN (10); +CREATE TABLE moneyp_11 PARTITION OF moneyp FOR VALUES IN ('11'); +CREATE TABLE moneyp_12 PARTITION OF moneyp FOR VALUES IN (to_char(12, '99')::int); +DROP TABLE moneyp; +-- cast is immutable +CREATE TABLE bigintp ( + a bigint +) PARTITION BY LIST (a); +CREATE TABLE bigintp_10 PARTITION OF bigintp FOR VALUES IN (10); +-- fails due to overlap: +CREATE TABLE bigintp_10_2 PARTITION OF bigintp FOR VALUES IN ('10'); +ERROR: partition "bigintp_10_2" would overlap partition "bigintp_10" +LINE 1: ...ABLE bigintp_10_2 PARTITION OF bigintp FOR VALUES IN ('10'); + ^ +DROP TABLE bigintp; +CREATE TABLE range_parted ( + a date +) PARTITION BY RANGE (a); +-- forbidden expressions for partition bounds with range partitioned table +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (somename) TO ('2019-01-01'); +ERROR: cannot use column reference in partition bound expression +LINE 2: FOR VALUES FROM (somename) TO ('2019-01-01'); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (somename.somename) TO ('2019-01-01'); +ERROR: cannot use column reference in partition bound expression +LINE 2: FOR VALUES FROM (somename.somename) TO ('2019-01-01'); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (a) TO ('2019-01-01'); +ERROR: cannot use column reference in partition bound expression +LINE 2: FOR VALUES FROM (a) TO ('2019-01-01'); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (max(a)) TO ('2019-01-01'); +ERROR: cannot use column reference in partition bound expression +LINE 2: FOR VALUES FROM (max(a)) TO ('2019-01-01'); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (max(somename)) TO ('2019-01-01'); +ERROR: cannot use column reference in partition bound expression +LINE 2: FOR VALUES FROM (max(somename)) TO ('2019-01-01'); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (max('2019-02-01'::date)) TO ('2019-01-01'); +ERROR: aggregate functions are not allowed in partition bound +LINE 2: FOR VALUES FROM (max('2019-02-01'::date)) TO ('2019-01-01'... + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM ((select 1)) TO ('2019-01-01'); +ERROR: cannot use subquery in partition bound +LINE 2: FOR VALUES FROM ((select 1)) TO ('2019-01-01'); + ^ +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (generate_series(1, 3)) TO ('2019-01-01'); +ERROR: set-returning functions are not allowed in partition bound +LINE 2: FOR VALUES FROM (generate_series(1, 3)) TO ('2019-01-01'); + ^ +-- trying to specify list for range partitioned table +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES IN ('a'); +ERROR: invalid bound specification for a range partition +LINE 1: ...BLE fail_part PARTITION OF range_parted FOR VALUES IN ('a'); + ^ +-- trying to specify modulus and remainder for range partitioned table +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES WITH (MODULUS 10, REMAINDER 1); +ERROR: invalid bound specification for a range partition +LINE 1: ...LE fail_part PARTITION OF range_parted FOR VALUES WITH (MODU... + ^ +-- each of start and end bounds must have same number of values as the +-- length of the partition key +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES FROM ('a', 1) TO ('z'); +ERROR: FROM must specify exactly one value per partitioning column +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES FROM ('a') TO ('z', 1); +ERROR: TO must specify exactly one value per partitioning column +-- cannot specify null values in range bounds +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES FROM (null) TO (maxvalue); +ERROR: cannot specify NULL in range bound +-- trying to specify modulus and remainder for range partitioned table +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES WITH (MODULUS 10, REMAINDER 1); +ERROR: invalid bound specification for a range partition +LINE 1: ...LE fail_part PARTITION OF range_parted FOR VALUES WITH (MODU... + ^ +-- check partition bound syntax for the hash partition +CREATE TABLE hash_parted ( + a int +) PARTITION BY HASH (a); +CREATE TABLE hpart_1 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 10, REMAINDER 0); +CREATE TABLE hpart_2 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 50, REMAINDER 1); +CREATE TABLE hpart_3 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 200, REMAINDER 2); +CREATE TABLE hpart_4 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 10, REMAINDER 3); +-- modulus 25 is factor of modulus of 50 but 10 is not a factor of 25. +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES WITH (MODULUS 25, REMAINDER 3); +ERROR: every hash partition modulus must be a factor of the next larger modulus +DETAIL: The new modulus 25 is not divisible by 10, the modulus of existing partition "hpart_4". +-- previous modulus 50 is factor of 150 but this modulus is not a factor of next modulus 200. +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES WITH (MODULUS 150, REMAINDER 3); +ERROR: every hash partition modulus must be a factor of the next larger modulus +DETAIL: The new modulus 150 is not a factor of 200, the modulus of existing partition "hpart_3". +-- overlapping remainders +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES WITH (MODULUS 100, REMAINDER 3); +ERROR: partition "fail_part" would overlap partition "hpart_4" +LINE 1: ...BLE fail_part PARTITION OF hash_parted FOR VALUES WITH (MODU... + ^ +-- trying to specify range for the hash partitioned table +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES FROM ('a', 1) TO ('z'); +ERROR: invalid bound specification for a hash partition +LINE 1: ...BLE fail_part PARTITION OF hash_parted FOR VALUES FROM ('a',... + ^ +-- trying to specify list value for the hash partitioned table +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES IN (1000); +ERROR: invalid bound specification for a hash partition +LINE 1: ...BLE fail_part PARTITION OF hash_parted FOR VALUES IN (1000); + ^ +-- trying to create default partition for the hash partitioned table +CREATE TABLE fail_default_part PARTITION OF hash_parted DEFAULT; +ERROR: a hash-partitioned table may not have a default partition +-- check if compatible with the specified parent +-- cannot create as partition of a non-partitioned table +CREATE TABLE unparted ( + a int +); +CREATE TABLE fail_part PARTITION OF unparted FOR VALUES IN ('a'); +ERROR: "unparted" is not partitioned +CREATE TABLE fail_part PARTITION OF unparted FOR VALUES WITH (MODULUS 2, REMAINDER 1); +ERROR: "unparted" is not partitioned +DROP TABLE unparted; +-- cannot create a permanent rel as partition of a temp rel +CREATE TEMP TABLE temp_parted ( + a int +) PARTITION BY LIST (a); +CREATE TABLE fail_part PARTITION OF temp_parted FOR VALUES IN ('a'); +ERROR: cannot create a permanent relation as partition of temporary relation "temp_parted" +DROP TABLE temp_parted; +-- check for partition bound overlap and other invalid specifications +CREATE TABLE list_parted2 ( + a varchar +) PARTITION BY LIST (a); +CREATE TABLE part_null_z PARTITION OF list_parted2 FOR VALUES IN (null, 'z'); +CREATE TABLE part_ab PARTITION OF list_parted2 FOR VALUES IN ('a', 'b'); +CREATE TABLE list_parted2_def PARTITION OF list_parted2 DEFAULT; +CREATE TABLE fail_part PARTITION OF list_parted2 FOR VALUES IN (null); +ERROR: partition "fail_part" would overlap partition "part_null_z" +LINE 1: ...LE fail_part PARTITION OF list_parted2 FOR VALUES IN (null); + ^ +CREATE TABLE fail_part PARTITION OF list_parted2 FOR VALUES IN ('b', 'c'); +ERROR: partition "fail_part" would overlap partition "part_ab" +LINE 1: ...ail_part PARTITION OF list_parted2 FOR VALUES IN ('b', 'c'); + ^ +-- check default partition overlap +INSERT INTO list_parted2 VALUES('X'); +CREATE TABLE fail_part PARTITION OF list_parted2 FOR VALUES IN ('W', 'X', 'Y'); +ERROR: updated partition constraint for default partition "list_parted2_def" would be violated by some row +CREATE TABLE range_parted2 ( + a int +) PARTITION BY RANGE (a); +-- trying to create range partition with empty range +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (1) TO (0); +ERROR: empty range bound specified for partition "fail_part" +LINE 1: ..._part PARTITION OF range_parted2 FOR VALUES FROM (1) TO (0); + ^ +DETAIL: Specified lower bound (1) is greater than or equal to upper bound (0). +-- note that the range '[1, 1)' has no elements +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (1) TO (1); +ERROR: empty range bound specified for partition "fail_part" +LINE 1: ..._part PARTITION OF range_parted2 FOR VALUES FROM (1) TO (1); + ^ +DETAIL: Specified lower bound (1) is greater than or equal to upper bound (1). +CREATE TABLE part0 PARTITION OF range_parted2 FOR VALUES FROM (minvalue) TO (1); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (minvalue) TO (2); +ERROR: partition "fail_part" would overlap partition "part0" +LINE 1: ..._part PARTITION OF range_parted2 FOR VALUES FROM (minvalue) ... + ^ +CREATE TABLE part1 PARTITION OF range_parted2 FOR VALUES FROM (1) TO (10); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (-1) TO (1); +ERROR: partition "fail_part" would overlap partition "part0" +LINE 1: ..._part PARTITION OF range_parted2 FOR VALUES FROM (-1) TO (1)... + ^ +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (9) TO (maxvalue); +ERROR: partition "fail_part" would overlap partition "part1" +LINE 1: ..._part PARTITION OF range_parted2 FOR VALUES FROM (9) TO (max... + ^ +CREATE TABLE part2 PARTITION OF range_parted2 FOR VALUES FROM (20) TO (30); +CREATE TABLE part3 PARTITION OF range_parted2 FOR VALUES FROM (30) TO (40); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (10) TO (30); +ERROR: partition "fail_part" would overlap partition "part2" +LINE 1: ...art PARTITION OF range_parted2 FOR VALUES FROM (10) TO (30); + ^ +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (10) TO (50); +ERROR: partition "fail_part" would overlap partition "part2" +LINE 1: ...art PARTITION OF range_parted2 FOR VALUES FROM (10) TO (50); + ^ +-- Create a default partition for range partitioned table +CREATE TABLE range2_default PARTITION OF range_parted2 DEFAULT; +-- More than one default partition is not allowed, so this should give error +CREATE TABLE fail_default_part PARTITION OF range_parted2 DEFAULT; +ERROR: partition "fail_default_part" conflicts with existing default partition "range2_default" +LINE 1: ... TABLE fail_default_part PARTITION OF range_parted2 DEFAULT; + ^ +-- Check if the range for default partitions overlap +INSERT INTO range_parted2 VALUES (85); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (80) TO (90); +ERROR: updated partition constraint for default partition "range2_default" would be violated by some row +CREATE TABLE part4 PARTITION OF range_parted2 FOR VALUES FROM (90) TO (100); +-- now check for multi-column range partition key +CREATE TABLE range_parted3 ( + a int, + b int +) PARTITION BY RANGE (a, (b+1)); +CREATE TABLE part00 PARTITION OF range_parted3 FOR VALUES FROM (0, minvalue) TO (0, maxvalue); +CREATE TABLE fail_part PARTITION OF range_parted3 FOR VALUES FROM (0, minvalue) TO (0, 1); +ERROR: partition "fail_part" would overlap partition "part00" +LINE 1: ..._part PARTITION OF range_parted3 FOR VALUES FROM (0, minvalu... + ^ +CREATE TABLE part10 PARTITION OF range_parted3 FOR VALUES FROM (1, minvalue) TO (1, 1); +CREATE TABLE part11 PARTITION OF range_parted3 FOR VALUES FROM (1, 1) TO (1, 10); +CREATE TABLE part12 PARTITION OF range_parted3 FOR VALUES FROM (1, 10) TO (1, maxvalue); +CREATE TABLE fail_part PARTITION OF range_parted3 FOR VALUES FROM (1, 10) TO (1, 20); +ERROR: partition "fail_part" would overlap partition "part12" +LINE 1: ...rt PARTITION OF range_parted3 FOR VALUES FROM (1, 10) TO (1,... + ^ +CREATE TABLE range3_default PARTITION OF range_parted3 DEFAULT; +-- cannot create a partition that says column b is allowed to range +-- from -infinity to +infinity, while there exist partitions that have +-- more specific ranges +CREATE TABLE fail_part PARTITION OF range_parted3 FOR VALUES FROM (1, minvalue) TO (1, maxvalue); +ERROR: partition "fail_part" would overlap partition "part10" +LINE 1: ..._part PARTITION OF range_parted3 FOR VALUES FROM (1, minvalu... + ^ +-- check for partition bound overlap and other invalid specifications for the hash partition +CREATE TABLE hash_parted2 ( + a varchar +) PARTITION BY HASH (a); +CREATE TABLE h2part_1 PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 4, REMAINDER 2); +CREATE TABLE h2part_2 PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 8, REMAINDER 0); +CREATE TABLE h2part_3 PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 8, REMAINDER 4); +CREATE TABLE h2part_4 PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 8, REMAINDER 5); +-- overlap with part_4 +CREATE TABLE fail_part PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +ERROR: partition "fail_part" would overlap partition "h2part_4" +LINE 1: ...LE fail_part PARTITION OF hash_parted2 FOR VALUES WITH (MODU... + ^ +-- modulus must be greater than zero +CREATE TABLE fail_part PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 0, REMAINDER 1); +ERROR: modulus for hash partition must be an integer value greater than zero +-- remainder must be greater than or equal to zero and less than modulus +CREATE TABLE fail_part PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 8, REMAINDER 8); +ERROR: remainder for hash partition must be less than modulus +-- check schema propagation from parent +CREATE TABLE parted ( + a text, + b int NOT NULL DEFAULT 0, + CONSTRAINT check_a CHECK (length(a) > 0) +) PARTITION BY LIST (a); +CREATE TABLE part_a PARTITION OF parted FOR VALUES IN ('a'); +-- only inherited attributes (never local ones) +SELECT attname, attislocal, attinhcount FROM pg_attribute + WHERE attrelid = 'part_a'::regclass and attnum > 0 + ORDER BY attnum; + attname | attislocal | attinhcount +---------+------------+------------- + a | f | 1 + b | f | 1 +(2 rows) + +-- able to specify column default, column constraint, and table constraint +-- first check the "column specified more than once" error +CREATE TABLE part_b PARTITION OF parted ( + b NOT NULL, + b DEFAULT 1, + b CHECK (b >= 0), + CONSTRAINT check_a CHECK (length(a) > 0) +) FOR VALUES IN ('b'); +ERROR: column "b" specified more than once +CREATE TABLE part_b PARTITION OF parted ( + b NOT NULL DEFAULT 1, + CONSTRAINT check_a CHECK (length(a) > 0), + CONSTRAINT check_b CHECK (b >= 0) +) FOR VALUES IN ('b'); +NOTICE: merging constraint "check_a" with inherited definition +-- conislocal should be false for any merged constraints, true otherwise +SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY conislocal, coninhcount; + conislocal | coninhcount +------------+------------- + f | 1 + t | 0 +(2 rows) + +-- Once check_b is added to the parent, it should be made non-local for part_b +ALTER TABLE parted ADD CONSTRAINT check_b CHECK (b >= 0); +NOTICE: merging constraint "check_b" with inherited definition +SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass; + conislocal | coninhcount +------------+------------- + f | 1 + f | 1 +(2 rows) + +-- Neither check_a nor check_b are droppable from part_b +ALTER TABLE part_b DROP CONSTRAINT check_a; +ERROR: cannot drop inherited constraint "check_a" of relation "part_b" +ALTER TABLE part_b DROP CONSTRAINT check_b; +ERROR: cannot drop inherited constraint "check_b" of relation "part_b" +-- And dropping it from parted should leave no trace of them on part_b, unlike +-- traditional inheritance where they will be left behind, because they would +-- be local constraints. +ALTER TABLE parted DROP CONSTRAINT check_a, DROP CONSTRAINT check_b; +SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass; + conislocal | coninhcount +------------+------------- +(0 rows) + +-- specify PARTITION BY for a partition +CREATE TABLE fail_part_col_not_found PARTITION OF parted FOR VALUES IN ('c') PARTITION BY RANGE (c); +ERROR: column "c" named in partition key does not exist +LINE 1: ...TITION OF parted FOR VALUES IN ('c') PARTITION BY RANGE (c); + ^ +CREATE TABLE part_c PARTITION OF parted (b WITH OPTIONS NOT NULL DEFAULT 0) FOR VALUES IN ('c') PARTITION BY RANGE ((b)); +-- create a level-2 partition +CREATE TABLE part_c_1_10 PARTITION OF part_c FOR VALUES FROM (1) TO (10); +-- check that NOT NULL and default value are inherited correctly +create table parted_notnull_inh_test (a int default 1, b int not null default 0) partition by list (a); +create table parted_notnull_inh_test1 partition of parted_notnull_inh_test (a not null, b default 1) for values in (1); +insert into parted_notnull_inh_test (b) values (null); +ERROR: null value in column "b" of relation "parted_notnull_inh_test1" violates not-null constraint +DETAIL: Failing row contains (1, null). +-- note that while b's default is overriden, a's default is preserved +\d parted_notnull_inh_test1 + Table "public.parted_notnull_inh_test1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | 1 + b | integer | | not null | 1 +Partition of: parted_notnull_inh_test FOR VALUES IN (1) + +drop table parted_notnull_inh_test; +-- check that collations are assigned in partition bound expressions +create table parted_boolean_col (a bool, b text) partition by list(a); +create table parted_boolean_less partition of parted_boolean_col + for values in ('foo' < 'bar'); +create table parted_boolean_greater partition of parted_boolean_col + for values in ('foo' > 'bar'); +drop table parted_boolean_col; +-- check for a conflicting COLLATE clause +create table parted_collate_must_match (a text collate "C", b text collate "C") + partition by range (a); +-- on the partition key +create table parted_collate_must_match1 partition of parted_collate_must_match + (a collate "POSIX") for values from ('a') to ('m'); +-- on another column +create table parted_collate_must_match2 partition of parted_collate_must_match + (b collate "POSIX") for values from ('m') to ('z'); +drop table parted_collate_must_match; +-- check that non-matching collations for partition bound +-- expressions are coerced to the right collation +create table test_part_coll_posix (a text) partition by range (a collate "POSIX"); +-- ok, collation is implicitly coerced +create table test_part_coll partition of test_part_coll_posix for values from ('a' collate "C") to ('g'); +-- ok +create table test_part_coll2 partition of test_part_coll_posix for values from ('g') to ('m'); +-- ok, collation is implicitly coerced +create table test_part_coll_cast partition of test_part_coll_posix for values from (name 'm' collate "C") to ('s'); +-- ok; partition collation silently overrides the default collation of type 'name' +create table test_part_coll_cast2 partition of test_part_coll_posix for values from (name 's') to ('z'); +drop table test_part_coll_posix; +-- Partition bound in describe output +\d+ part_b + Table "public.part_b" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | not null | 1 | plain | | +Partition of: parted FOR VALUES IN ('b') +Partition constraint: ((a IS NOT NULL) AND (a = 'b'::text)) + +-- Both partition bound and partition key in describe output +\d+ part_c + Partitioned table "public.part_c" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | not null | 0 | plain | | +Partition of: parted FOR VALUES IN ('c') +Partition constraint: ((a IS NOT NULL) AND (a = 'c'::text)) +Partition key: RANGE (b) +Partitions: part_c_1_10 FOR VALUES FROM (1) TO (10) + +-- a level-2 partition's constraint will include the parent's expressions +\d+ part_c_1_10 + Table "public.part_c_1_10" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | not null | 0 | plain | | +Partition of: part_c FOR VALUES FROM (1) TO (10) +Partition constraint: ((a IS NOT NULL) AND (a = 'c'::text) AND (b IS NOT NULL) AND (b >= 1) AND (b < 10)) + +-- Show partition count in the parent's describe output +-- Tempted to include \d+ output listing partitions with bound info but +-- output could vary depending on the order in which partition oids are +-- returned. +\d parted + Partitioned table "public.parted" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | text | | | + b | integer | | not null | 0 +Partition key: LIST (a) +Number of partitions: 3 (Use \d+ to list them.) + +\d hash_parted + Partitioned table "public.hash_parted" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition key: HASH (a) +Number of partitions: 4 (Use \d+ to list them.) + +-- check that we get the expected partition constraints +CREATE TABLE range_parted4 (a int, b int, c int) PARTITION BY RANGE (abs(a), abs(b), c); +CREATE TABLE unbounded_range_part PARTITION OF range_parted4 FOR VALUES FROM (MINVALUE, MINVALUE, MINVALUE) TO (MAXVALUE, MAXVALUE, MAXVALUE); +\d+ unbounded_range_part + Table "public.unbounded_range_part" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | + c | integer | | | | plain | | +Partition of: range_parted4 FOR VALUES FROM (MINVALUE, MINVALUE, MINVALUE) TO (MAXVALUE, MAXVALUE, MAXVALUE) +Partition constraint: ((abs(a) IS NOT NULL) AND (abs(b) IS NOT NULL) AND (c IS NOT NULL)) + +DROP TABLE unbounded_range_part; +CREATE TABLE range_parted4_1 PARTITION OF range_parted4 FOR VALUES FROM (MINVALUE, MINVALUE, MINVALUE) TO (1, MAXVALUE, MAXVALUE); +\d+ range_parted4_1 + Table "public.range_parted4_1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | + c | integer | | | | plain | | +Partition of: range_parted4 FOR VALUES FROM (MINVALUE, MINVALUE, MINVALUE) TO (1, MAXVALUE, MAXVALUE) +Partition constraint: ((abs(a) IS NOT NULL) AND (abs(b) IS NOT NULL) AND (c IS NOT NULL) AND (abs(a) <= 1)) + +CREATE TABLE range_parted4_2 PARTITION OF range_parted4 FOR VALUES FROM (3, 4, 5) TO (6, 7, MAXVALUE); +\d+ range_parted4_2 + Table "public.range_parted4_2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | + c | integer | | | | plain | | +Partition of: range_parted4 FOR VALUES FROM (3, 4, 5) TO (6, 7, MAXVALUE) +Partition constraint: ((abs(a) IS NOT NULL) AND (abs(b) IS NOT NULL) AND (c IS NOT NULL) AND ((abs(a) > 3) OR ((abs(a) = 3) AND (abs(b) > 4)) OR ((abs(a) = 3) AND (abs(b) = 4) AND (c >= 5))) AND ((abs(a) < 6) OR ((abs(a) = 6) AND (abs(b) <= 7)))) + +CREATE TABLE range_parted4_3 PARTITION OF range_parted4 FOR VALUES FROM (6, 8, MINVALUE) TO (9, MAXVALUE, MAXVALUE); +\d+ range_parted4_3 + Table "public.range_parted4_3" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | + c | integer | | | | plain | | +Partition of: range_parted4 FOR VALUES FROM (6, 8, MINVALUE) TO (9, MAXVALUE, MAXVALUE) +Partition constraint: ((abs(a) IS NOT NULL) AND (abs(b) IS NOT NULL) AND (c IS NOT NULL) AND ((abs(a) > 6) OR ((abs(a) = 6) AND (abs(b) >= 8))) AND (abs(a) <= 9)) + +DROP TABLE range_parted4; +-- user-defined operator class in partition key +CREATE FUNCTION my_int4_sort(int4,int4) RETURNS int LANGUAGE sql + AS $$ SELECT CASE WHEN $1 = $2 THEN 0 WHEN $1 > $2 THEN 1 ELSE -1 END; $$; +CREATE OPERATOR CLASS test_int4_ops FOR TYPE int4 USING btree AS + OPERATOR 1 < (int4,int4), OPERATOR 2 <= (int4,int4), + OPERATOR 3 = (int4,int4), OPERATOR 4 >= (int4,int4), + OPERATOR 5 > (int4,int4), FUNCTION 1 my_int4_sort(int4,int4); +CREATE TABLE partkey_t (a int4) PARTITION BY RANGE (a test_int4_ops); +CREATE TABLE partkey_t_1 PARTITION OF partkey_t FOR VALUES FROM (0) TO (1000); +INSERT INTO partkey_t VALUES (100); +INSERT INTO partkey_t VALUES (200); +-- cleanup +DROP TABLE parted, list_parted, range_parted, list_parted2, range_parted2, range_parted3; +DROP TABLE partkey_t, hash_parted, hash_parted2; +DROP OPERATOR CLASS test_int4_ops USING btree; +DROP FUNCTION my_int4_sort(int4,int4); +-- comments on partitioned tables columns +CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a); +COMMENT ON TABLE parted_col_comment IS 'Am partitioned table'; +COMMENT ON COLUMN parted_col_comment.a IS 'Partition key'; +SELECT obj_description('parted_col_comment'::regclass); + obj_description +---------------------- + Am partitioned table +(1 row) + +\d+ parted_col_comment + Partitioned table "public.parted_col_comment" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+--------------- + a | integer | | | | plain | | Partition key + b | text | | | | extended | | +Partition key: LIST (a) +Number of partitions: 0 + +DROP TABLE parted_col_comment; +-- list partitioning on array type column +CREATE TABLE arrlp (a int[]) PARTITION BY LIST (a); +CREATE TABLE arrlp12 PARTITION OF arrlp FOR VALUES IN ('{1}', '{2}'); +\d+ arrlp12 + Table "public.arrlp12" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------+-----------+----------+---------+----------+--------------+------------- + a | integer[] | | | | extended | | +Partition of: arrlp FOR VALUES IN ('{1}', '{2}') +Partition constraint: ((a IS NOT NULL) AND ((a = '{1}'::integer[]) OR (a = '{2}'::integer[]))) + +DROP TABLE arrlp; +-- partition on boolean column +create table boolspart (a bool) partition by list (a); +create table boolspart_t partition of boolspart for values in (true); +create table boolspart_f partition of boolspart for values in (false); +\d+ boolspart + Partitioned table "public.boolspart" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | boolean | | | | plain | | +Partition key: LIST (a) +Partitions: boolspart_f FOR VALUES IN (false), + boolspart_t FOR VALUES IN (true) + +drop table boolspart; +-- partitions mixing temporary and permanent relations +create table perm_parted (a int) partition by list (a); +create temporary table temp_parted (a int) partition by list (a); +create table perm_part partition of temp_parted default; -- error +ERROR: cannot create a permanent relation as partition of temporary relation "temp_parted" +create temp table temp_part partition of perm_parted default; -- error +ERROR: cannot create a temporary relation as partition of permanent relation "perm_parted" +create temp table temp_part partition of temp_parted default; -- ok +drop table perm_parted cascade; +drop table temp_parted cascade; +-- check that adding partitions to a table while it is being used is prevented +create table tab_part_create (a int) partition by list (a); +create or replace function func_part_create() returns trigger + language plpgsql as $$ + begin + execute 'create table tab_part_create_1 partition of tab_part_create for values in (1)'; + return null; + end $$; +create trigger trig_part_create before insert on tab_part_create + for each statement execute procedure func_part_create(); +ERROR: Triggers for statements are not yet supported +insert into tab_part_create values (1); +DETAIL: Partition key of the failing row contains (a) = (1). +ERROR: no partition of relation "tab_part_create" found for row +drop table tab_part_create; +drop function func_part_create(); +-- test using a volatile expression as partition bound +create table volatile_partbound_test (partkey timestamp) partition by range (partkey); +create table volatile_partbound_test1 partition of volatile_partbound_test for values from (minvalue) to (current_timestamp); +create table volatile_partbound_test2 partition of volatile_partbound_test for values from (current_timestamp) to (maxvalue); +-- this should go into the partition volatile_partbound_test2 +insert into volatile_partbound_test values (current_timestamp); +select tableoid::regclass from volatile_partbound_test; + tableoid +-------------------------- + volatile_partbound_test2 +(1 row) + +drop table volatile_partbound_test; +-- test the case where a check constraint on default partition allows +-- to avoid scanning it when adding a new partition +create table defcheck (a int, b int) partition by list (b); +create table defcheck_def (a int, c int, b int); +alter table defcheck_def drop c; +alter table defcheck attach partition defcheck_def default; +alter table defcheck_def add check (b <= 0 and b is not null); +create table defcheck_1 partition of defcheck for values in (1, null); +-- test that complex default partition constraints are enforced correctly +insert into defcheck_def values (0, 0); +create table defcheck_0 partition of defcheck for values in (0); +ERROR: updated partition constraint for default partition "defcheck_def" would be violated by some row +drop table defcheck; +-- Test github issue #7340. truncating a toast unlogged table fails. +-- Leave the table on purpose for pg_dump and gp_replica_check tests. +CREATE UNLOGGED TABLE unlogged_toast (a text); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +TRUNCATE unlogged_toast; +-- tests of column drop with partition tables and indexes using +-- predicates and expressions. +create table part_column_drop ( + useless_1 int, + id int, + useless_2 int, + d int, + b int, + useless_3 int +) partition by range (id); +alter table part_column_drop drop column useless_1; +alter table part_column_drop drop column useless_2; +alter table part_column_drop drop column useless_3; +create index part_column_drop_b_pred on part_column_drop(b) where b = 1; +create index part_column_drop_b_expr on part_column_drop((b = 1)); +create index part_column_drop_d_pred on part_column_drop(d) where d = 2; +create index part_column_drop_d_expr on part_column_drop((d = 2)); +create table part_column_drop_1_10 partition of + part_column_drop for values from (1) to (10); +\d part_column_drop + Partitioned table "public.part_column_drop" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | | + d | integer | | | + b | integer | | | +Partition key: RANGE (id) +Indexes: + "part_column_drop_b_expr" btree ((b = 1)) + "part_column_drop_b_pred" btree (b) WHERE b = 1 + "part_column_drop_d_expr" btree ((d = 2)) + "part_column_drop_d_pred" btree (d) WHERE d = 2 +Number of partitions: 1 (Use \d+ to list them.) + +\d part_column_drop_1_10 + Table "public.part_column_drop_1_10" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | | + d | integer | | | + b | integer | | | +Partition of: part_column_drop FOR VALUES FROM (1) TO (10) +Indexes: + "part_column_drop_1_10_b_idx" btree (b) WHERE b = 1 + "part_column_drop_1_10_d_idx" btree (d) WHERE d = 2 + "part_column_drop_1_10_expr_idx" btree ((b = 1)) + "part_column_drop_1_10_expr_idx1" btree ((d = 2)) + +drop table part_column_drop; diff --git a/src/test/singlenode_regress/expected/create_table_like.out b/src/test/singlenode_regress/expected/create_table_like.out new file mode 100644 index 00000000000..e308771620e --- /dev/null +++ b/src/test/singlenode_regress/expected/create_table_like.out @@ -0,0 +1,519 @@ +/* Test inheritance of structure (LIKE) */ +CREATE TABLE inhx (xx text DEFAULT 'text'); +/* + * Test double inheritance + * + * Ensure that defaults are NOT included unless + * INCLUDING DEFAULTS is specified + */ +CREATE TABLE ctla (aa TEXT); +CREATE TABLE ctlb (bb TEXT) INHERITS (ctla); +CREATE TABLE foo (LIKE nonexistent); +ERROR: relation "nonexistent" does not exist +LINE 1: CREATE TABLE foo (LIKE nonexistent); + ^ +CREATE TABLE inhe (ee text, LIKE inhx) inherits (ctlb); +INSERT INTO inhe VALUES ('ee-col1', 'ee-col2', DEFAULT, 'ee-col4'); +SELECT * FROM inhe; /* Columns aa, bb, xx value NULL, ee */ + aa | bb | ee | xx +---------+---------+----+--------- + ee-col1 | ee-col2 | | ee-col4 +(1 row) + +SELECT * FROM inhx; /* Empty set since LIKE inherits structure only */ + xx +---- +(0 rows) + +SELECT * FROM ctlb; /* Has ee entry */ + aa | bb +---------+--------- + ee-col1 | ee-col2 +(1 row) + +SELECT * FROM ctla; /* Has ee entry */ + aa +--------- + ee-col1 +(1 row) + +CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */ +ERROR: column "xx" specified more than once +CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS INCLUDING CONSTRAINTS); +INSERT INTO inhf DEFAULT VALUES; +SELECT * FROM inhf; /* Single entry with value 'text' */ + xx +------ + text +(1 row) + +ALTER TABLE inhx add constraint foo CHECK (xx = 'text'); +ALTER TABLE inhx ADD PRIMARY KEY (xx); +CREATE TABLE inhg (LIKE inhx); /* Doesn't copy constraint */ +INSERT INTO inhg VALUES ('foo'); +DROP TABLE inhg; +CREATE TABLE inhg (x text, LIKE inhx INCLUDING CONSTRAINTS, y text); /* Copies constraints */ +INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds */ +INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds -- Unique constraints not copied */ +INSERT INTO inhg VALUES ('x', 'foo', 'y'); /* fails due to constraint */ +ERROR: new row for relation "inhg" violates check constraint "foo" +DETAIL: Failing row contains (x, foo, y). +SELECT * FROM inhg; /* Two records with three columns in order x=x, xx=text, y=y */ + x | xx | y +---+------+--- + x | text | y + x | text | y +(2 rows) + +DROP TABLE inhg; +CREATE TABLE test_like_id_1 (a bigint GENERATED ALWAYS AS IDENTITY, b text); +\d test_like_id_1 + Table "public.test_like_id_1" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------ + a | bigint | | not null | generated always as identity + b | text | | | + +INSERT INTO test_like_id_1 (b) VALUES ('b1'); +SELECT * FROM test_like_id_1; + a | b +---+---- + 1 | b1 +(1 row) + +CREATE TABLE test_like_id_2 (LIKE test_like_id_1); +\d test_like_id_2 + Table "public.test_like_id_2" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+--------- + a | bigint | | not null | + b | text | | | + +INSERT INTO test_like_id_2 (b) VALUES ('b2'); +ERROR: null value in column "a" of relation "test_like_id_2" violates not-null constraint +DETAIL: Failing row contains (null, b2). +SELECT * FROM test_like_id_2; -- identity was not copied + a | b +---+--- +(0 rows) + +CREATE TABLE test_like_id_3 (LIKE test_like_id_1 INCLUDING IDENTITY); +\d test_like_id_3 + Table "public.test_like_id_3" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------ + a | bigint | | not null | generated always as identity + b | text | | | + +INSERT INTO test_like_id_3 (b) VALUES ('b3'); +SELECT * FROM test_like_id_3; -- identity was copied and applied + a | b +---+---- + 1 | b3 +(1 row) + +DROP TABLE test_like_id_1, test_like_id_2, test_like_id_3; +CREATE TABLE test_like_gen_1 (a int, b int GENERATED ALWAYS AS (a * 2) STORED); +\d test_like_gen_1 + Table "public.test_like_gen_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | | + b | integer | | | generated always as (a * 2) stored + +INSERT INTO test_like_gen_1 (a) VALUES (1); +SELECT * FROM test_like_gen_1; + a | b +---+--- + 1 | 2 +(1 row) + +CREATE TABLE test_like_gen_2 (LIKE test_like_gen_1); +\d test_like_gen_2 + Table "public.test_like_gen_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + +INSERT INTO test_like_gen_2 (a) VALUES (1); +SELECT * FROM test_like_gen_2; + a | b +---+--- + 1 | +(1 row) + +CREATE TABLE test_like_gen_3 (LIKE test_like_gen_1 INCLUDING GENERATED); +\d test_like_gen_3 + Table "public.test_like_gen_3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | | + b | integer | | | generated always as (a * 2) stored + +INSERT INTO test_like_gen_3 (a) VALUES (1); +SELECT * FROM test_like_gen_3; + a | b +---+--- + 1 | 2 +(1 row) + +DROP TABLE test_like_gen_1, test_like_gen_2, test_like_gen_3; +-- also test generated column with a "forward" reference (bug #16342) +CREATE TABLE test_like_4 (b int DEFAULT 42, + c int GENERATED ALWAYS AS (a * 2) STORED, + a int CHECK (a > 0)); +\d test_like_4 + Table "public.test_like_4" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + b | integer | | | 42 + c | integer | | | generated always as (a * 2) stored + a | integer | | | +Check constraints: + "test_like_4_a_check" CHECK (a > 0) + +CREATE TABLE test_like_4a (LIKE test_like_4); +CREATE TABLE test_like_4b (LIKE test_like_4 INCLUDING DEFAULTS); +CREATE TABLE test_like_4c (LIKE test_like_4 INCLUDING GENERATED); +CREATE TABLE test_like_4d (LIKE test_like_4 INCLUDING DEFAULTS INCLUDING GENERATED); +\d test_like_4a + Table "public.test_like_4a" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + b | integer | | | + c | integer | | | + a | integer | | | + +INSERT INTO test_like_4a (a) VALUES(11); +SELECT a, b, c FROM test_like_4a; + a | b | c +----+---+--- + 11 | | +(1 row) + +\d test_like_4b + Table "public.test_like_4b" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + b | integer | | | 42 + c | integer | | | + a | integer | | | + +INSERT INTO test_like_4b (a) VALUES(11); +SELECT a, b, c FROM test_like_4b; + a | b | c +----+----+--- + 11 | 42 | +(1 row) + +\d test_like_4c + Table "public.test_like_4c" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + b | integer | | | + c | integer | | | generated always as (a * 2) stored + a | integer | | | + +INSERT INTO test_like_4c (a) VALUES(11); +SELECT a, b, c FROM test_like_4c; + a | b | c +----+---+---- + 11 | | 22 +(1 row) + +\d test_like_4d + Table "public.test_like_4d" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + b | integer | | | 42 + c | integer | | | generated always as (a * 2) stored + a | integer | | | + +INSERT INTO test_like_4d (a) VALUES(11); +SELECT a, b, c FROM test_like_4d; + a | b | c +----+----+---- + 11 | 42 | 22 +(1 row) + +-- Test renumbering of Vars when combining LIKE with inheritance +CREATE TABLE test_like_5 (x point, y point, z point); +CREATE TABLE test_like_5x (p int CHECK (p > 0), + q int GENERATED ALWAYS AS (p * 2) STORED); +CREATE TABLE test_like_5c (LIKE test_like_4 INCLUDING ALL) + INHERITS (test_like_5, test_like_5x); +\d test_like_5c + Table "public.test_like_5c" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + x | point | | | + y | point | | | + z | point | | | + p | integer | | | + q | integer | | | generated always as (p * 2) stored + b | integer | | | 42 + c | integer | | | generated always as (a * 2) stored + a | integer | | | +Check constraints: + "test_like_4_a_check" CHECK (a > 0) + "test_like_5x_p_check" CHECK (p > 0) +Inherits: test_like_5, + test_like_5x + +DROP TABLE test_like_4, test_like_4a, test_like_4b, test_like_4c, test_like_4d; +DROP TABLE test_like_5, test_like_5x, test_like_5c; +CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES, y text); /* copies indexes */ +INSERT INTO inhg VALUES (5, 10); +INSERT INTO inhg VALUES (20, 10); -- should fail +ERROR: duplicate key value violates unique constraint "inhg_pkey" +DETAIL: Key (xx)=(10) already exists. +DROP TABLE inhg; +/* Multiple primary keys creation should fail */ +CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES, PRIMARY KEY(x)); /* fails */ +ERROR: multiple primary keys for table "inhg" are not allowed +CREATE TABLE inhz (xx text DEFAULT 'text', yy int UNIQUE); +CREATE UNIQUE INDEX inhz_xx_idx on inhz (xx) WHERE xx <> 'test'; +/* Ok to create multiple unique indexes */ +CREATE TABLE inhg (x text UNIQUE, LIKE inhz INCLUDING INDEXES); +INSERT INTO inhg (xx, yy, x) VALUES ('test', 5, 10); +INSERT INTO inhg (xx, yy, x) VALUES ('test', 10, 15); +INSERT INTO inhg (xx, yy, x) VALUES ('foo', 10, 15); -- should fail +ERROR: duplicate key value violates unique constraint "inhg_x_key" +DETAIL: Key (x)=(15) already exists. +DROP TABLE inhg; +DROP TABLE inhz; +/* Use primary key imported by LIKE for self-referential FK constraint */ +CREATE TABLE inhz (x text REFERENCES inhz, LIKE inhx INCLUDING INDEXES); +\d inhz + Table "public.inhz" + Column | Type | Collation | Nullable | Default +--------+------+-----------+----------+--------- + x | text | | | + xx | text | | not null | +Indexes: + "inhz_pkey" PRIMARY KEY, btree (xx) +Foreign-key constraints: + "inhz_x_fkey" FOREIGN KEY (x) REFERENCES inhz(xx) +Referenced by: + TABLE "inhz" CONSTRAINT "inhz_x_fkey" FOREIGN KEY (x) REFERENCES inhz(xx) + +DROP TABLE inhz; +-- including storage and comments +CREATE TABLE ctlt1 (a text CHECK (length(a) > 2) PRIMARY KEY, b text); +CREATE INDEX ctlt1_b_key ON ctlt1 (b); +CREATE INDEX ctlt1_fnidx ON ctlt1 ((a || b)); +CREATE STATISTICS ctlt1_a_b_stat ON a,b FROM ctlt1; +CREATE STATISTICS ctlt1_expr_stat ON (a || b) FROM ctlt1; +COMMENT ON STATISTICS ctlt1_a_b_stat IS 'ab stats'; +COMMENT ON STATISTICS ctlt1_expr_stat IS 'ab expr stats'; +COMMENT ON COLUMN ctlt1.a IS 'A'; +COMMENT ON COLUMN ctlt1.b IS 'B'; +COMMENT ON CONSTRAINT ctlt1_a_check ON ctlt1 IS 't1_a_check'; +COMMENT ON INDEX ctlt1_pkey IS 'index pkey'; +COMMENT ON INDEX ctlt1_b_key IS 'index b_key'; +ALTER TABLE ctlt1 ALTER COLUMN a SET STORAGE MAIN; +CREATE TABLE ctlt2 (c text); +ALTER TABLE ctlt2 ALTER COLUMN c SET STORAGE EXTERNAL; +COMMENT ON COLUMN ctlt2.c IS 'C'; +CREATE TABLE ctlt3 (a text CHECK (length(a) < 5), c text CHECK (length(c) < 7)); +ALTER TABLE ctlt3 ALTER COLUMN c SET STORAGE EXTERNAL; +ALTER TABLE ctlt3 ALTER COLUMN a SET STORAGE MAIN; +CREATE INDEX ctlt3_fnidx ON ctlt3 ((a || c)); +COMMENT ON COLUMN ctlt3.a IS 'A3'; +COMMENT ON COLUMN ctlt3.c IS 'C'; +COMMENT ON CONSTRAINT ctlt3_a_check ON ctlt3 IS 't3_a_check'; +CREATE TABLE ctlt4 (a text, c text); +ALTER TABLE ctlt4 ALTER COLUMN c SET STORAGE EXTERNAL; +CREATE TABLE ctlt12_storage (LIKE ctlt1 INCLUDING STORAGE, LIKE ctlt2 INCLUDING STORAGE); +\d+ ctlt12_storage + Table "public.ctlt12_storage" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------+-----------+----------+---------+----------+--------------+------------- + a | text | | not null | | main | | + b | text | | | | extended | | + c | text | | | | external | | + +CREATE TABLE ctlt12_comments (LIKE ctlt1 INCLUDING COMMENTS, LIKE ctlt2 INCLUDING COMMENTS); +\d+ ctlt12_comments + Table "public.ctlt12_comments" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------+-----------+----------+---------+----------+--------------+------------- + a | text | | not null | | extended | | A + b | text | | | | extended | | B + c | text | | | | extended | | C + +CREATE TABLE ctlt1_inh (LIKE ctlt1 INCLUDING CONSTRAINTS INCLUDING COMMENTS) INHERITS (ctlt1); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +NOTICE: merging constraint "ctlt1_a_check" with inherited definition +\d+ ctlt1_inh + Table "public.ctlt1_inh" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------+-----------+----------+---------+----------+--------------+------------- + a | text | | not null | | main | | A + b | text | | | | extended | | B +Check constraints: + "ctlt1_a_check" CHECK (length(a) > 2) +Inherits: ctlt1 + +SELECT description FROM pg_description, pg_constraint c WHERE classoid = 'pg_constraint'::regclass AND objoid = c.oid AND c.conrelid = 'ctlt1_inh'::regclass; + description +------------- + t1_a_check +(1 row) + +CREATE TABLE ctlt13_inh () INHERITS (ctlt1, ctlt3); +NOTICE: merging multiple inherited definitions of column "a" +\d+ ctlt13_inh + Table "public.ctlt13_inh" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------+-----------+----------+---------+----------+--------------+------------- + a | text | | not null | | main | | + b | text | | | | extended | | + c | text | | | | external | | +Check constraints: + "ctlt1_a_check" CHECK (length(a) > 2) + "ctlt3_a_check" CHECK (length(a) < 5) + "ctlt3_c_check" CHECK (length(c) < 7) +Inherits: ctlt1, + ctlt3 + +CREATE TABLE ctlt13_like (LIKE ctlt3 INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING COMMENTS INCLUDING STORAGE) INHERITS (ctlt1); +NOTICE: merging column "a" with inherited definition +\d+ ctlt13_like + Table "public.ctlt13_like" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------+-----------+----------+---------+----------+--------------+------------- + a | text | | not null | | main | | A3 + b | text | | | | extended | | + c | text | | | | external | | C +Indexes: + "ctlt13_like_expr_idx" btree ((a || c)) +Check constraints: + "ctlt1_a_check" CHECK (length(a) > 2) + "ctlt3_a_check" CHECK (length(a) < 5) + "ctlt3_c_check" CHECK (length(c) < 7) +Inherits: ctlt1 + +SELECT description FROM pg_description, pg_constraint c WHERE classoid = 'pg_constraint'::regclass AND objoid = c.oid AND c.conrelid = 'ctlt13_like'::regclass; + description +------------- + t3_a_check +(1 row) + +CREATE TABLE ctlt_all (LIKE ctlt1 INCLUDING ALL); +\d+ ctlt_all + Table "public.ctlt_all" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------+-----------+----------+---------+----------+--------------+------------- + a | text | | not null | | main | | A + b | text | | | | extended | | B +Indexes: + "ctlt_all_pkey" PRIMARY KEY, btree (a) + "ctlt_all_b_idx" btree (b) + "ctlt_all_expr_idx" btree ((a || b)) +Check constraints: + "ctlt1_a_check" CHECK (length(a) > 2) +Statistics objects: + "public.ctlt_all_a_b_stat" ON a, b FROM ctlt_all + "public.ctlt_all_expr_stat" ON (a || b) FROM ctlt_all + +SELECT c.relname, objsubid, description FROM pg_description, pg_index i, pg_class c WHERE classoid = 'pg_class'::regclass AND objoid = i.indexrelid AND c.oid = i.indexrelid AND i.indrelid = 'ctlt_all'::regclass ORDER BY c.relname, objsubid; + relname | objsubid | description +----------------+----------+------------- + ctlt_all_b_idx | 0 | index b_key + ctlt_all_pkey | 0 | index pkey +(2 rows) + +SELECT s.stxname, objsubid, description FROM pg_description, pg_statistic_ext s WHERE classoid = 'pg_statistic_ext'::regclass AND objoid = s.oid AND s.stxrelid = 'ctlt_all'::regclass ORDER BY s.stxname, objsubid; + stxname | objsubid | description +--------------------+----------+--------------- + ctlt_all_a_b_stat | 0 | ab stats + ctlt_all_expr_stat | 0 | ab expr stats +(2 rows) + +CREATE TABLE inh_error1 () INHERITS (ctlt1, ctlt4); +NOTICE: merging multiple inherited definitions of column "a" +ERROR: inherited column "a" has a storage parameter conflict +DETAIL: MAIN versus EXTENDED +CREATE TABLE inh_error2 (LIKE ctlt4 INCLUDING STORAGE) INHERITS (ctlt1); +NOTICE: merging column "a" with inherited definition +ERROR: column "a" has a storage parameter conflict +DETAIL: MAIN versus EXTENDED +-- Check that LIKE isn't confused by a system catalog of the same name +CREATE TABLE pg_attrdef (LIKE ctlt1 INCLUDING ALL); +\d+ public.pg_attrdef + Table "public.pg_attrdef" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------+-----------+----------+---------+----------+--------------+------------- + a | text | | not null | | main | | A + b | text | | | | extended | | B +Indexes: + "pg_attrdef_pkey" PRIMARY KEY, btree (a) + "pg_attrdef_b_idx" btree (b) + "pg_attrdef_expr_idx" btree ((a || b)) +Check constraints: + "ctlt1_a_check" CHECK (length(a) > 2) +Statistics objects: + "public.pg_attrdef_a_b_stat" ON a, b FROM public.pg_attrdef + "public.pg_attrdef_expr_stat" ON (a || b) FROM public.pg_attrdef + +DROP TABLE public.pg_attrdef; +-- Check that LIKE isn't confused when new table masks the old, either +BEGIN; +CREATE SCHEMA ctl_schema; +SET LOCAL search_path = ctl_schema, public; +CREATE TABLE ctlt1 (LIKE ctlt1 INCLUDING ALL); +\d+ ctlt1 + Table "ctl_schema.ctlt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------+-----------+----------+---------+----------+--------------+------------- + a | text | | not null | | main | | A + b | text | | | | extended | | B +Indexes: + "ctlt1_pkey" PRIMARY KEY, btree (a) + "ctlt1_b_idx" btree (b) + "ctlt1_expr_idx" btree ((a || b)) +Check constraints: + "ctlt1_a_check" CHECK (length(a) > 2) +Statistics objects: + "ctl_schema.ctlt1_a_b_stat" ON a, b FROM ctlt1 + "ctl_schema.ctlt1_expr_stat" ON (a || b) FROM ctlt1 + +ROLLBACK; +DROP TABLE ctlt1, ctlt2, ctlt3, ctlt4, ctlt12_storage, ctlt12_comments, ctlt1_inh, ctlt13_inh, ctlt13_like, ctlt_all, ctla, ctlb CASCADE; +NOTICE: drop cascades to table inhe +-- LIKE must respect NO INHERIT property of constraints +CREATE TABLE noinh_con_copy (a int CHECK (a > 0) NO INHERIT); +CREATE TABLE noinh_con_copy1 (LIKE noinh_con_copy INCLUDING CONSTRAINTS); +\d noinh_con_copy1 + Table "public.noinh_con_copy1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Check constraints: + "noinh_con_copy_a_check" CHECK (a > 0) NO INHERIT + +-- fail, as partitioned tables don't allow NO INHERIT constraints +CREATE TABLE noinh_con_copy1_parted (LIKE noinh_con_copy INCLUDING ALL) + PARTITION BY LIST (a); +ERROR: cannot add NO INHERIT constraint to partitioned table "noinh_con_copy1_parted" +DROP TABLE noinh_con_copy, noinh_con_copy1; +/* LIKE with other relation kinds */ +CREATE TABLE ctlt4 (a int, b text); +CREATE SEQUENCE ctlseq1; +CREATE TABLE ctlt10 (LIKE ctlseq1); -- fail +ERROR: "ctlseq1" is not a table, view, materialized view, composite type, or foreign table +LINE 1: CREATE TABLE ctlt10 (LIKE ctlseq1); + ^ +CREATE VIEW ctlv1 AS SELECT * FROM ctlt4; +CREATE TABLE ctlt11 (LIKE ctlv1); +CREATE TABLE ctlt11a (LIKE ctlv1 INCLUDING ALL); +CREATE TYPE ctlty1 AS (a int, b text); +CREATE TABLE ctlt12 (LIKE ctlty1); +DROP SEQUENCE ctlseq1; +DROP TYPE ctlty1; +DROP VIEW ctlv1; +DROP TABLE IF EXISTS ctlt4, ctlt10, ctlt11, ctlt11a, ctlt12; +NOTICE: table "ctlt10" does not exist, skipping diff --git a/src/test/singlenode_regress/expected/create_table_like_gp.out b/src/test/singlenode_regress/expected/create_table_like_gp.out new file mode 100644 index 00000000000..fd9561d7ef3 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_table_like_gp.out @@ -0,0 +1,109 @@ +-- AO/AOCS +CREATE TABLE t_ao (a integer, b text) WITH (appendonly=true, orientation=column); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +CREATE TABLE t_ao_enc (a integer, b text ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768)) WITH (appendonly=true, orientation=column); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +CREATE TABLE t_ao_a (LIKE t_ao INCLUDING ALL); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table +CREATE TABLE t_ao_b (LIKE t_ao INCLUDING STORAGE); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table +CREATE TABLE t_ao_c (LIKE t_ao); -- Should create a heap table +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table +CREATE TABLE t_ao_enc_a (LIKE t_ao_enc INCLUDING STORAGE); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table +-- Verify default_table_access_method GUC doesn't get used +SET default_table_access_method = ao_row; +CREATE TABLE t_ao_d (LIKE t_ao INCLUDING ALL); +RESET gp_default_storage_options; +-- Verify created tables and attributes +SELECT + c.relname, + am.amname, + a.columnstore, + a.compresstype, + a.compresslevel +FROM + pg_catalog.pg_class c + LEFT OUTER JOIN pg_catalog.pg_am am ON (c.relam = am.oid) + LEFT OUTER JOIN pg_catalog.pg_appendonly a ON (c.oid = a.relid) +WHERE + c.relname LIKE 't_ao%'; + relname | amname | columnstore | compresstype | compresslevel +------------+-----------+-------------+--------------+--------------- + t_ao | ao_column | t | | 0 + t_ao_enc | ao_column | t | | 0 + t_ao_a | ao_column | t | | 0 + t_ao_b | ao_column | t | | 0 + t_ao_c | heap | | | + t_ao_enc_a | ao_column | t | | 0 + t_ao_d | ao_column | t | | 0 +(7 rows) + +SELECT + c.relname, + a.attnum, + a.attoptions +FROM + pg_catalog.pg_class c + JOIN pg_catalog.pg_attribute_encoding a ON (a.attrelid = c.oid) +WHERE + c.relname like 't_ao_enc%'; + relname | attnum | attoptions +------------+--------+----------------------------------------------------- + t_ao_enc | 2 | {compresstype=zlib,compresslevel=1,blocksize=32768} + t_ao_enc | 1 | {compresstype=none,blocksize=32768,compresslevel=0} + t_ao_enc_a | 2 | {compresstype=zlib,compresslevel=1,blocksize=32768} + t_ao_enc_a | 1 | {compresstype=none,blocksize=32768,compresslevel=0} +(4 rows) + +-- EXTERNAL TABLE +CREATE EXTERNAL TABLE t_ext (a integer) LOCATION ('file://127.0.0.1/tmp/foo') FORMAT 'text'; +CREATE EXTERNAL TABLE t_ext_a (LIKE t_ext INCLUDING ALL) LOCATION ('file://127.0.0.1/tmp/foo') FORMAT 'text'; +ERROR: LIKE INCLUDING may not be used with this kind of relation +LINE 1: CREATE EXTERNAL TABLE t_ext_a (LIKE t_ext INCLUDING ALL) LOC... + ^ +CREATE EXTERNAL TABLE t_ext_b (LIKE t_ext) LOCATION ('file://127.0.0.1/tmp/foo') FORMAT 'text'; +-- Verify that an external table can be dropped and then recreated in consecutive attempts +CREATE OR REPLACE FUNCTION drop_and_recreate_external_table() + RETURNS void + LANGUAGE plpgsql + VOLATILE +AS $function$ +DECLARE +BEGIN +DROP EXTERNAL TABLE IF EXISTS t_ext_r; +CREATE EXTERNAL TABLE t_ext_r ( + name varchar +) +LOCATION ('GPFDIST://127.0.0.1/tmp/dummy') ON ALL +FORMAT 'CSV' ( delimiter ' ' null '' escape '"' quote '"' ) +ENCODING 'UTF8'; +END; +$function$; +do $$ +begin + for i in 1..5 loop + PERFORM drop_and_recreate_external_table(); + end loop; +end; +$$; +NOTICE: foreign table "t_ext_r" does not exist, skipping +-- Verify created tables +SELECT + c.relname, + c.relkind, + f.ftoptions +FROM + pg_catalog.pg_class c + LEFT OUTER JOIN pg_catalog.pg_foreign_table f ON (c.oid = f.ftrelid) +WHERE + c.relname LIKE 't_ext%'; + relname | relkind | ftoptions +---------+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + t_ext | f | {format=text,"delimiter= ","null=\\N","escape=\\",format_type=t,location_uris=file://127.0.0.1/tmp/foo,execute_on=COORDINATOR_ONLY,log_errors=f,encoding=6,is_writable=false} + t_ext_b | f | {format=text,"delimiter= ","null=\\N","escape=\\",format_type=t,location_uris=file://127.0.0.1/tmp/foo,execute_on=COORDINATOR_ONLY,log_errors=f,encoding=6,is_writable=false} + t_ext_r | f | {format=csv,"delimiter= ",null=,"escape=\"","quote=\"",format_type=c,location_uris=gpfdist://127.0.0.1:8080/tmp/dummy,execute_on=COORDINATOR_ONLY,log_errors=f,encoding=6,is_writable=false} +(3 rows) + diff --git a/src/test/singlenode_regress/expected/create_type.out b/src/test/singlenode_regress/expected/create_type.out new file mode 100644 index 00000000000..14394cc95cd --- /dev/null +++ b/src/test/singlenode_regress/expected/create_type.out @@ -0,0 +1,322 @@ +-- +-- CREATE_TYPE +-- +-- +-- Note: widget_in/out were created in create_function_1, without any +-- prior shell-type creation. These commands therefore complete a test +-- of the "old style" approach of making the functions first. +-- +CREATE TYPE widget ( + internallength = 24, + input = widget_in, + output = widget_out, + typmod_in = numerictypmodin, + typmod_out = numerictypmodout, + alignment = double +); +CREATE TYPE city_budget ( + internallength = 16, + input = int44in, + output = int44out, + element = int4, + category = 'x', -- just to verify the system will take it + preferred = true -- ditto +); +-- Test creation and destruction of shell types +CREATE TYPE shell; +CREATE TYPE shell; -- fail, type already present +ERROR: type "shell" already exists +DROP TYPE shell; +DROP TYPE shell; -- fail, type not exist +ERROR: type "shell" does not exist +-- also, let's leave one around for purposes of pg_dump testing +CREATE TYPE myshell; +-- +-- Test type-related default values (broken in releases before PG 7.2) +-- +-- This part of the test also exercises the "new style" approach of making +-- a shell type and then filling it in. +-- +CREATE TYPE int42; +CREATE TYPE text_w_default; +-- Make dummy I/O routines using the existing internal support for int4, text +CREATE FUNCTION int42_in(cstring) + RETURNS int42 + AS 'int4in' + LANGUAGE internal STRICT IMMUTABLE; +NOTICE: return type int42 is only a shell +CREATE FUNCTION int42_out(int42) + RETURNS cstring + AS 'int4out' + LANGUAGE internal STRICT IMMUTABLE; +NOTICE: argument type int42 is only a shell +CREATE FUNCTION text_w_default_in(cstring) + RETURNS text_w_default + AS 'textin' + LANGUAGE internal STRICT IMMUTABLE; +NOTICE: return type text_w_default is only a shell +CREATE FUNCTION text_w_default_out(text_w_default) + RETURNS cstring + AS 'textout' + LANGUAGE internal STRICT IMMUTABLE; +NOTICE: argument type text_w_default is only a shell +CREATE TYPE int42 ( + internallength = 4, + input = int42_in, + output = int42_out, + alignment = int4, + default = 42, + passedbyvalue +); +CREATE TYPE text_w_default ( + internallength = variable, + input = text_w_default_in, + output = text_w_default_out, + alignment = int4, + default = 'zippo' +); +CREATE TABLE default_test (f1 text_w_default, f2 int42); +INSERT INTO default_test DEFAULT VALUES; +SELECT * FROM default_test; + f1 | f2 +-------+---- + zippo | 42 +(1 row) + +-- We need a shell type to test some CREATE TYPE failure cases with +CREATE TYPE bogus_type; +-- invalid: non-lowercase quoted identifiers +CREATE TYPE bogus_type ( + "Internallength" = 4, + "Input" = int42_in, + "Output" = int42_out, + "Alignment" = int4, + "Default" = 42, + "Passedbyvalue" +); +WARNING: type attribute "Internallength" not recognized +LINE 2: "Internallength" = 4, + ^ +WARNING: type attribute "Input" not recognized +LINE 3: "Input" = int42_in, + ^ +WARNING: type attribute "Output" not recognized +LINE 4: "Output" = int42_out, + ^ +WARNING: type attribute "Alignment" not recognized +LINE 5: "Alignment" = int4, + ^ +WARNING: type attribute "Default" not recognized +LINE 6: "Default" = 42, + ^ +WARNING: type attribute "Passedbyvalue" not recognized +LINE 7: "Passedbyvalue" + ^ +ERROR: type input function must be specified +-- invalid: input/output function incompatibility +CREATE TYPE bogus_type (INPUT = array_in, + OUTPUT = array_out, + ELEMENT = int, + INTERNALLENGTH = 32); +ERROR: type input function array_in must return type bogus_type +DROP TYPE bogus_type; +-- It no longer is possible to issue CREATE TYPE without making a shell first +CREATE TYPE bogus_type (INPUT = array_in, + OUTPUT = array_out, + ELEMENT = int, + INTERNALLENGTH = 32); +ERROR: type "bogus_type" does not exist +HINT: Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE. +-- Test stand-alone composite type +CREATE TYPE default_test_row AS (f1 text_w_default, f2 int42); +CREATE FUNCTION get_default_test() RETURNS SETOF default_test_row AS ' + SELECT * FROM default_test; +' LANGUAGE SQL; +SELECT * FROM get_default_test(); + f1 | f2 +-------+---- + zippo | 42 +(1 row) + +-- Test comments +COMMENT ON TYPE bad IS 'bad comment'; +ERROR: type "bad" does not exist +COMMENT ON TYPE default_test_row IS 'good comment'; +COMMENT ON TYPE default_test_row IS NULL; +COMMENT ON COLUMN default_test_row.nope IS 'bad comment'; +ERROR: column "nope" of relation "default_test_row" does not exist +COMMENT ON COLUMN default_test_row.f1 IS 'good comment'; +COMMENT ON COLUMN default_test_row.f1 IS NULL; +-- Check shell type create for existing types +CREATE TYPE text_w_default; -- should fail +ERROR: type "text_w_default" already exists +DROP TYPE default_test_row CASCADE; +NOTICE: drop cascades to function get_default_test() +DROP TABLE default_test; +-- Check dependencies are established when creating a new type +CREATE TYPE base_type; +CREATE FUNCTION base_fn_in(cstring) RETURNS base_type AS 'boolin' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: return type base_type is only a shell +CREATE FUNCTION base_fn_out(base_type) RETURNS cstring AS 'boolout' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type base_type is only a shell +CREATE TYPE base_type(INPUT = base_fn_in, OUTPUT = base_fn_out); +DROP FUNCTION base_fn_in(cstring); -- error +ERROR: cannot drop function base_fn_in(cstring) because other objects depend on it +DETAIL: type base_type depends on function base_fn_in(cstring) +function base_fn_out(base_type) depends on type base_type +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP FUNCTION base_fn_out(base_type); -- error +ERROR: cannot drop function base_fn_out(base_type) because other objects depend on it +DETAIL: type base_type depends on function base_fn_out(base_type) +function base_fn_in(cstring) depends on type base_type +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TYPE base_type; -- error +ERROR: cannot drop type base_type because other objects depend on it +DETAIL: function base_fn_in(cstring) depends on type base_type +function base_fn_out(base_type) depends on type base_type +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TYPE base_type CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function base_fn_in(cstring) +drop cascades to function base_fn_out(base_type) +-- Check usage of typmod with a user-defined type +-- (we have borrowed numeric's typmod functions) +CREATE TEMP TABLE mytab (foo widget(42,13,7)); -- should fail +ERROR: invalid NUMERIC type modifier +LINE 1: CREATE TEMP TABLE mytab (foo widget(42,13,7)); + ^ +CREATE TEMP TABLE mytab (foo widget(42,13)); +SELECT format_type(atttypid,atttypmod) FROM pg_attribute +WHERE attrelid = 'mytab'::regclass AND attnum > 0; + format_type +--------------- + widget(42,13) +(1 row) + +-- might as well exercise the widget type while we're here +INSERT INTO mytab VALUES ('(1,2,3)'), ('(-44,5.5,12)'); +TABLE mytab; + foo +-------------- + (1,2,3) + (-44,5.5,12) +(2 rows) + +-- and test format_type() a bit more, too +select format_type('varchar'::regtype, 42); + format_type +----------------------- + character varying(38) +(1 row) + +select format_type('bpchar'::regtype, null); + format_type +------------- + character +(1 row) + +-- this behavior difference is intentional +select format_type('bpchar'::regtype, -1); + format_type +------------- + bpchar +(1 row) + +-- +-- Test CREATE/ALTER TYPE using a type that's compatible with varchar, +-- so we can re-use those support functions +-- +CREATE TYPE myvarchar; +CREATE FUNCTION myvarcharin(cstring, oid, integer) RETURNS myvarchar +LANGUAGE internal IMMUTABLE PARALLEL SAFE STRICT AS 'varcharin'; +NOTICE: return type myvarchar is only a shell +CREATE FUNCTION myvarcharout(myvarchar) RETURNS cstring +LANGUAGE internal IMMUTABLE PARALLEL SAFE STRICT AS 'varcharout'; +NOTICE: argument type myvarchar is only a shell +CREATE FUNCTION myvarcharsend(myvarchar) RETURNS bytea +LANGUAGE internal STABLE PARALLEL SAFE STRICT AS 'varcharsend'; +NOTICE: argument type myvarchar is only a shell +CREATE FUNCTION myvarcharrecv(internal, oid, integer) RETURNS myvarchar +LANGUAGE internal STABLE PARALLEL SAFE STRICT AS 'varcharrecv'; +NOTICE: return type myvarchar is only a shell +-- fail, it's still a shell: +ALTER TYPE myvarchar SET (storage = extended); +ERROR: type "myvarchar" is only a shell +CREATE TYPE myvarchar ( + input = myvarcharin, + output = myvarcharout, + alignment = integer, + storage = main +); +-- want to check updating of a domain over the target type, too +CREATE DOMAIN myvarchardom AS myvarchar; +ALTER TYPE myvarchar SET (storage = plain); -- not allowed +ERROR: cannot change type's storage to PLAIN +ALTER TYPE myvarchar SET (storage = extended); +ALTER TYPE myvarchar SET ( + send = myvarcharsend, + receive = myvarcharrecv, + typmod_in = varchartypmodin, + typmod_out = varchartypmodout, + -- these are bogus, but it's safe as long as we don't use the type: + analyze = ts_typanalyze, + subscript = raw_array_subscript_handler +); +SELECT typinput, typoutput, typreceive, typsend, typmodin, typmodout, + typanalyze, typsubscript, typstorage +FROM pg_type WHERE typname = 'myvarchar'; + typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typsubscript | typstorage +-------------+--------------+---------------+---------------+-----------------+------------------+---------------+-----------------------------+------------ + myvarcharin | myvarcharout | myvarcharrecv | myvarcharsend | varchartypmodin | varchartypmodout | ts_typanalyze | raw_array_subscript_handler | x +(1 row) + +SELECT typinput, typoutput, typreceive, typsend, typmodin, typmodout, + typanalyze, typsubscript, typstorage +FROM pg_type WHERE typname = '_myvarchar'; + typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typsubscript | typstorage +----------+-----------+------------+------------+-----------------+------------------+------------------+-------------------------+------------ + array_in | array_out | array_recv | array_send | varchartypmodin | varchartypmodout | array_typanalyze | array_subscript_handler | x +(1 row) + +SELECT typinput, typoutput, typreceive, typsend, typmodin, typmodout, + typanalyze, typsubscript, typstorage +FROM pg_type WHERE typname = 'myvarchardom'; + typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typsubscript | typstorage +-----------+--------------+-------------+---------------+----------+-----------+---------------+--------------+------------ + domain_in | myvarcharout | domain_recv | myvarcharsend | - | - | ts_typanalyze | - | x +(1 row) + +SELECT typinput, typoutput, typreceive, typsend, typmodin, typmodout, + typanalyze, typsubscript, typstorage +FROM pg_type WHERE typname = '_myvarchardom'; + typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typsubscript | typstorage +----------+-----------+------------+------------+----------+-----------+------------------+-------------------------+------------ + array_in | array_out | array_recv | array_send | - | - | array_typanalyze | array_subscript_handler | x +(1 row) + +-- ensure dependencies are straight +DROP FUNCTION myvarcharsend(myvarchar); -- fail +ERROR: cannot drop function myvarcharsend(myvarchar) because other objects depend on it +DETAIL: type myvarchar depends on function myvarcharsend(myvarchar) +function myvarcharin(cstring,oid,integer) depends on type myvarchar +function myvarcharout(myvarchar) depends on type myvarchar +function myvarcharrecv(internal,oid,integer) depends on type myvarchar +type myvarchardom depends on function myvarcharsend(myvarchar) +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TYPE myvarchar; -- fail +ERROR: cannot drop type myvarchar because other objects depend on it +DETAIL: function myvarcharin(cstring,oid,integer) depends on type myvarchar +function myvarcharout(myvarchar) depends on type myvarchar +function myvarcharsend(myvarchar) depends on type myvarchar +function myvarcharrecv(internal,oid,integer) depends on type myvarchar +type myvarchardom depends on type myvarchar +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TYPE myvarchar CASCADE; +NOTICE: drop cascades to 5 other objects +DETAIL: drop cascades to function myvarcharin(cstring,oid,integer) +drop cascades to function myvarcharout(myvarchar) +drop cascades to function myvarcharsend(myvarchar) +drop cascades to function myvarcharrecv(internal,oid,integer) +drop cascades to type myvarchardom diff --git a/src/test/singlenode_regress/expected/create_view.out b/src/test/singlenode_regress/expected/create_view.out new file mode 100644 index 00000000000..fdc9294f1f2 --- /dev/null +++ b/src/test/singlenode_regress/expected/create_view.out @@ -0,0 +1,2092 @@ +-- +-- Exercise outfuncs +-- +set Debug_print_parse=on; +set Debug_print_plan=on; +-- +-- CREATE_VIEW +-- Virtual class definitions +-- (this also tests the query rewrite system) +-- +CREATE VIEW street AS + SELECT r.name, r.thepath, c.cname AS cname + FROM ONLY road r, real_city c + WHERE c.outline ## r.thepath; +CREATE VIEW iexit AS + SELECT ih.name, ih.thepath, + interpt_pp(ih.thepath, r.thepath) AS exit + FROM ihighway ih, ramp r + WHERE ih.thepath ## r.thepath; +CREATE VIEW toyemp AS + SELECT name, age, location, 12*salary AS annualsal + FROM emp; +-- Test comments +COMMENT ON VIEW noview IS 'no view'; +ERROR: relation "noview" does not exist +COMMENT ON VIEW toyemp IS 'is a view'; +COMMENT ON VIEW toyemp IS NULL; +-- These views are left around mainly to exercise special cases in pg_dump. +CREATE TABLE view_base_table (key int PRIMARY KEY, data varchar(20)); +CREATE VIEW key_dependent_view AS + SELECT * FROM view_base_table GROUP BY key; +ALTER TABLE view_base_table DROP CONSTRAINT view_base_table_pkey; -- fails +ERROR: cannot drop constraint view_base_table_pkey on table view_base_table because other objects depend on it +DETAIL: view key_dependent_view depends on constraint view_base_table_pkey on table view_base_table +HINT: Use DROP ... CASCADE to drop the dependent objects too. +CREATE VIEW key_dependent_view_no_cols AS + SELECT FROM view_base_table GROUP BY key HAVING length(data) > 0; +-- +-- CREATE OR REPLACE VIEW +-- +CREATE TABLE viewtest_tbl (a int, b int); +COPY viewtest_tbl FROM stdin; +CREATE OR REPLACE VIEW viewtest AS + SELECT * FROM viewtest_tbl; +CREATE OR REPLACE VIEW viewtest AS + SELECT * FROM viewtest_tbl WHERE a > 10; +SELECT * FROM viewtest; + a | b +----+---- + 15 | 20 + 20 | 25 +(2 rows) + +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b FROM viewtest_tbl WHERE a > 5 ORDER BY b DESC; +SELECT * FROM viewtest; + a | b +----+---- + 20 | 25 + 15 | 20 + 10 | 15 +(3 rows) + +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT a FROM viewtest_tbl WHERE a <> 20; +ERROR: cannot drop columns from view +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT 1, * FROM viewtest_tbl; +ERROR: cannot change name of view column "a" to "?column?" +HINT: Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead. +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b::numeric FROM viewtest_tbl; +ERROR: cannot change data type of view column "b" from integer to numeric +-- should work +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b, 0 AS c FROM viewtest_tbl; +DROP VIEW viewtest; +DROP TABLE viewtest_tbl; +-- tests for temporary views +CREATE SCHEMA temp_view_test + CREATE TABLE base_table (a int, id int) + CREATE TABLE base_table2 (a int, id int); +SET search_path TO temp_view_test, public; +CREATE TEMPORARY TABLE temp_table (a int, id int); +-- should be created in temp_view_test schema +CREATE VIEW v1 AS SELECT * FROM base_table; +-- should be created in temp object schema +CREATE VIEW v1_temp AS SELECT * FROM temp_table; +NOTICE: view "v1_temp" will be a temporary view +-- should be created in temp object schema +CREATE TEMP VIEW v2_temp AS SELECT * FROM base_table; +-- should be created in temp_views schema +CREATE VIEW temp_view_test.v2 AS SELECT * FROM base_table; +-- should fail +CREATE VIEW temp_view_test.v3_temp AS SELECT * FROM temp_table; +NOTICE: view "v3_temp" will be a temporary view +ERROR: cannot create temporary relation in non-temporary schema +-- should fail +CREATE SCHEMA test_view_schema + CREATE TEMP VIEW testview AS SELECT 1; +ERROR: cannot create temporary relation in non-temporary schema +-- joins: if any of the join relations are temporary, the view +-- should also be temporary +-- should be non-temp +CREATE VIEW v3 AS + SELECT t1.a AS t1_a, t2.a AS t2_a + FROM base_table t1, base_table2 t2 + WHERE t1.id = t2.id; +-- should be temp (one join rel is temp) +CREATE VIEW v4_temp AS + SELECT t1.a AS t1_a, t2.a AS t2_a + FROM base_table t1, temp_table t2 + WHERE t1.id = t2.id; +NOTICE: view "v4_temp" will be a temporary view +-- should be temp +CREATE VIEW v5_temp AS + SELECT t1.a AS t1_a, t2.a AS t2_a, t3.a AS t3_a + FROM base_table t1, base_table2 t2, temp_table t3 + WHERE t1.id = t2.id and t2.id = t3.id; +NOTICE: view "v5_temp" will be a temporary view +-- subqueries +CREATE VIEW v4 AS SELECT * FROM base_table WHERE id IN (SELECT id FROM base_table2); +CREATE VIEW v5 AS SELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM base_table2) t2; +CREATE VIEW v6 AS SELECT * FROM base_table WHERE EXISTS (SELECT 1 FROM base_table2); +CREATE VIEW v7 AS SELECT * FROM base_table WHERE NOT EXISTS (SELECT 1 FROM base_table2); +CREATE VIEW v8 AS SELECT * FROM base_table WHERE EXISTS (SELECT 1); +CREATE VIEW v6_temp AS SELECT * FROM base_table WHERE id IN (SELECT id FROM temp_table); +NOTICE: view "v6_temp" will be a temporary view +CREATE VIEW v7_temp AS SELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM temp_table) t2; +NOTICE: view "v7_temp" will be a temporary view +CREATE VIEW v8_temp AS SELECT * FROM base_table WHERE EXISTS (SELECT 1 FROM temp_table); +NOTICE: view "v8_temp" will be a temporary view +CREATE VIEW v9_temp AS SELECT * FROM base_table WHERE NOT EXISTS (SELECT 1 FROM temp_table); +NOTICE: view "v9_temp" will be a temporary view +-- a view should also be temporary if it references a temporary view +CREATE VIEW v10_temp AS SELECT * FROM v7_temp; +NOTICE: view "v10_temp" will be a temporary view +CREATE VIEW v11_temp AS SELECT t1.id, t2.a FROM base_table t1, v10_temp t2; +NOTICE: view "v11_temp" will be a temporary view +CREATE VIEW v12_temp AS SELECT true FROM v11_temp; +NOTICE: view "v12_temp" will be a temporary view +-- a view should also be temporary if it references a temporary sequence +CREATE SEQUENCE seq1; +CREATE TEMPORARY SEQUENCE seq1_temp; +CREATE VIEW v9 AS SELECT seq1.is_called FROM seq1; +CREATE VIEW v13_temp AS SELECT seq1_temp.is_called FROM seq1_temp; +NOTICE: view "v13_temp" will be a temporary view +SELECT relname FROM pg_class + WHERE relname LIKE 'v_' + AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'temp_view_test') + ORDER BY relname; + relname +--------- + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 +(9 rows) + +SELECT relname FROM pg_class + WHERE relname LIKE 'v%' + AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE 'pg_temp%') + ORDER BY relname; + relname +---------- + v10_temp + v11_temp + v12_temp + v13_temp + v1_temp + v2_temp + v4_temp + v5_temp + v6_temp + v7_temp + v8_temp + v9_temp +(12 rows) + +CREATE SCHEMA testviewschm2; +SET search_path TO testviewschm2, public; +CREATE TABLE t1 (num int, name text); +CREATE TABLE t2 (num2 int, value text); +CREATE TEMP TABLE tt (num2 int, value text); +CREATE VIEW nontemp1 AS SELECT * FROM t1 CROSS JOIN t2; +CREATE VIEW temporal1 AS SELECT * FROM t1 CROSS JOIN tt; +NOTICE: view "temporal1" will be a temporary view +CREATE VIEW nontemp2 AS SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num2; +CREATE VIEW temporal2 AS SELECT * FROM t1 INNER JOIN tt ON t1.num = tt.num2; +NOTICE: view "temporal2" will be a temporary view +CREATE VIEW nontemp3 AS SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num2; +CREATE VIEW temporal3 AS SELECT * FROM t1 LEFT JOIN tt ON t1.num = tt.num2; +NOTICE: view "temporal3" will be a temporary view +CREATE VIEW nontemp4 AS SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num2 AND t2.value = 'xxx'; +CREATE VIEW temporal4 AS SELECT * FROM t1 LEFT JOIN tt ON t1.num = tt.num2 AND tt.value = 'xxx'; +NOTICE: view "temporal4" will be a temporary view +SELECT relname FROM pg_class + WHERE relname LIKE 'nontemp%' + AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'testviewschm2') + ORDER BY relname; + relname +---------- + nontemp1 + nontemp2 + nontemp3 + nontemp4 +(4 rows) + +SELECT relname FROM pg_class + WHERE relname LIKE 'temporal%' + AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE 'pg_temp%') + ORDER BY relname; + relname +----------- + temporal1 + temporal2 + temporal3 + temporal4 +(4 rows) + +CREATE TABLE tbl1 ( a int, b int); +CREATE TABLE tbl2 (c int, d int); +CREATE TABLE tbl3 (e int, f int); +CREATE TABLE tbl4 (g int, h int); +CREATE TEMP TABLE tmptbl (i int, j int); +--Should be in testviewschm2 +CREATE VIEW pubview AS SELECT * FROM tbl1 WHERE tbl1.a +BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2) +AND EXISTS (SELECT g FROM tbl4 LEFT JOIN tbl3 ON tbl4.h = tbl3.f); +SELECT count(*) FROM pg_class where relname = 'pubview' +AND relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname = 'testviewschm2'); + count +------- + 1 +(1 row) + +--Should be in temp object schema +CREATE VIEW mytempview AS SELECT * FROM tbl1 WHERE tbl1.a +BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2) +AND EXISTS (SELECT g FROM tbl4 LEFT JOIN tbl3 ON tbl4.h = tbl3.f) +AND NOT EXISTS (SELECT g FROM tbl4 LEFT JOIN tmptbl ON tbl4.h = tmptbl.j); +NOTICE: view "mytempview" will be a temporary view +SELECT count(*) FROM pg_class where relname LIKE 'mytempview' +And relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname LIKE 'pg_temp%'); + count +------- + 1 +(1 row) + +-- +-- CREATE VIEW and WITH(...) clause +-- +CREATE VIEW mysecview1 + AS SELECT * FROM tbl1 WHERE a = 0; +CREATE VIEW mysecview2 WITH (security_barrier=true) + AS SELECT * FROM tbl1 WHERE a > 0; +CREATE VIEW mysecview3 WITH (security_barrier=false) + AS SELECT * FROM tbl1 WHERE a < 0; +CREATE VIEW mysecview4 WITH (security_barrier) + AS SELECT * FROM tbl1 WHERE a <> 0; +CREATE VIEW mysecview5 WITH (security_barrier=100) -- Error + AS SELECT * FROM tbl1 WHERE a > 100; +ERROR: invalid value for boolean option "security_barrier": 100 +CREATE VIEW mysecview6 WITH (invalid_option) -- Error + AS SELECT * FROM tbl1 WHERE a < 100; +ERROR: unrecognized parameter "invalid_option" +SELECT relname, relkind, reloptions FROM pg_class + WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, + 'mysecview3'::regclass, 'mysecview4'::regclass) + ORDER BY relname; + relname | relkind | reloptions +------------+---------+-------------------------- + mysecview1 | v | + mysecview2 | v | {security_barrier=true} + mysecview3 | v | {security_barrier=false} + mysecview4 | v | {security_barrier=true} +(4 rows) + +CREATE OR REPLACE VIEW mysecview1 + AS SELECT * FROM tbl1 WHERE a = 256; +CREATE OR REPLACE VIEW mysecview2 + AS SELECT * FROM tbl1 WHERE a > 256; +CREATE OR REPLACE VIEW mysecview3 WITH (security_barrier=true) + AS SELECT * FROM tbl1 WHERE a < 256; +CREATE OR REPLACE VIEW mysecview4 WITH (security_barrier=false) + AS SELECT * FROM tbl1 WHERE a <> 256; +SELECT relname, relkind, reloptions FROM pg_class + WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, + 'mysecview3'::regclass, 'mysecview4'::regclass) + ORDER BY relname; + relname | relkind | reloptions +------------+---------+-------------------------- + mysecview1 | v | + mysecview2 | v | + mysecview3 | v | {security_barrier=true} + mysecview4 | v | {security_barrier=false} +(4 rows) + +-- Check that unknown literals are converted to "text" in CREATE VIEW, +-- so that we don't end up with unknown-type columns. +CREATE VIEW unspecified_types AS + SELECT 42 as i, 42.5 as num, 'foo' as u, 'foo'::unknown as u2, null as n; +\d+ unspecified_types + View "testviewschm2.unspecified_types" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + i | integer | | | | plain | + num | numeric | | | | main | + u | text | | | | extended | + u2 | text | | | | extended | + n | text | | | | extended | +View definition: + SELECT 42 AS i, + 42.5 AS num, + 'foo'::text AS u, + 'foo'::text AS u2, + NULL::text AS n; + +SELECT * FROM unspecified_types; + i | num | u | u2 | n +----+------+-----+-----+--- + 42 | 42.5 | foo | foo | +(1 row) + +-- This test checks that proper typmods are assigned in a multi-row VALUES +CREATE VIEW tt1 AS + SELECT * FROM ( + VALUES + ('abc'::varchar(3), '0123456789', 42, 'abcd'::varchar(4)), + ('0123456789', 'abc'::varchar(3), 42.12, 'abc'::varchar(4)) + ) vv(a,b,c,d); +\d+ tt1 + View "testviewschm2.tt1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+----------------------+-----------+----------+---------+----------+------------- + a | character varying | | | | extended | + b | character varying | | | | extended | + c | numeric | | | | main | + d | character varying(4) | | | | extended | +View definition: + SELECT vv.a, + vv.b, + vv.c, + vv.d + FROM ( VALUES ('abc'::character varying(3),'0123456789'::character varying,42,'abcd'::character varying(4)), ('0123456789'::character varying,'abc'::character varying(3),42.12,'abc'::character varying(4))) vv(a, b, c, d); + +SELECT * FROM tt1; + a | b | c | d +------------+------------+-------+------ + abc | 0123456789 | 42 | abcd + 0123456789 | abc | 42.12 | abc +(2 rows) + +SELECT a::varchar(3) FROM tt1; + a +----- + abc + 012 +(2 rows) + +DROP VIEW tt1; +-- Test view decompilation in the face of relation renaming conflicts +CREATE TABLE tt1 (f1 int, f2 int, f3 text); +CREATE TABLE tx1 (x1 int, x2 int, x3 text); +CREATE TABLE temp_view_test.tt1 (y1 int, f2 int, f3 text); +CREATE VIEW aliased_view_1 AS + select * from tt1 + where exists (select 1 from tx1 where tt1.f1 = tx1.x1); +CREATE VIEW aliased_view_2 AS + select * from tt1 a1 + where exists (select 1 from tx1 where a1.f1 = tx1.x1); +CREATE VIEW aliased_view_3 AS + select * from tt1 + where exists (select 1 from tx1 a2 where tt1.f1 = a2.x1); +CREATE VIEW aliased_view_4 AS + select * from temp_view_test.tt1 + where exists (select 1 from tt1 where temp_view_test.tt1.y1 = tt1.f1); +\d+ aliased_view_1 + View "testviewschm2.aliased_view_1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.f1, + tt1.f2, + tt1.f3 + FROM tt1 + WHERE (EXISTS ( SELECT 1 + FROM tx1 + WHERE tt1.f1 = tx1.x1)); + +\d+ aliased_view_2 + View "testviewschm2.aliased_view_2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a1.f1, + a1.f2, + a1.f3 + FROM tt1 a1 + WHERE (EXISTS ( SELECT 1 + FROM tx1 + WHERE a1.f1 = tx1.x1)); + +\d+ aliased_view_3 + View "testviewschm2.aliased_view_3" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.f1, + tt1.f2, + tt1.f3 + FROM tt1 + WHERE (EXISTS ( SELECT 1 + FROM tx1 a2 + WHERE tt1.f1 = a2.x1)); + +\d+ aliased_view_4 + View "testviewschm2.aliased_view_4" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + y1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.y1, + tt1.f2, + tt1.f3 + FROM temp_view_test.tt1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 tt1_1 + WHERE tt1.y1 = tt1_1.f1)); + +ALTER TABLE tx1 RENAME TO a1; +\d+ aliased_view_1 + View "testviewschm2.aliased_view_1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.f1, + tt1.f2, + tt1.f3 + FROM tt1 + WHERE (EXISTS ( SELECT 1 + FROM a1 + WHERE tt1.f1 = a1.x1)); + +\d+ aliased_view_2 + View "testviewschm2.aliased_view_2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a1.f1, + a1.f2, + a1.f3 + FROM tt1 a1 + WHERE (EXISTS ( SELECT 1 + FROM a1 a1_1 + WHERE a1.f1 = a1_1.x1)); + +\d+ aliased_view_3 + View "testviewschm2.aliased_view_3" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.f1, + tt1.f2, + tt1.f3 + FROM tt1 + WHERE (EXISTS ( SELECT 1 + FROM a1 a2 + WHERE tt1.f1 = a2.x1)); + +\d+ aliased_view_4 + View "testviewschm2.aliased_view_4" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + y1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.y1, + tt1.f2, + tt1.f3 + FROM temp_view_test.tt1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 tt1_1 + WHERE tt1.y1 = tt1_1.f1)); + +ALTER TABLE tt1 RENAME TO a2; +\d+ aliased_view_1 + View "testviewschm2.aliased_view_1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a2.f1, + a2.f2, + a2.f3 + FROM a2 + WHERE (EXISTS ( SELECT 1 + FROM a1 + WHERE a2.f1 = a1.x1)); + +\d+ aliased_view_2 + View "testviewschm2.aliased_view_2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a1.f1, + a1.f2, + a1.f3 + FROM a2 a1 + WHERE (EXISTS ( SELECT 1 + FROM a1 a1_1 + WHERE a1.f1 = a1_1.x1)); + +\d+ aliased_view_3 + View "testviewschm2.aliased_view_3" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a2.f1, + a2.f2, + a2.f3 + FROM a2 + WHERE (EXISTS ( SELECT 1 + FROM a1 a2_1 + WHERE a2.f1 = a2_1.x1)); + +\d+ aliased_view_4 + View "testviewschm2.aliased_view_4" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + y1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.y1, + tt1.f2, + tt1.f3 + FROM temp_view_test.tt1 + WHERE (EXISTS ( SELECT 1 + FROM a2 + WHERE tt1.y1 = a2.f1)); + +ALTER TABLE a1 RENAME TO tt1; +\d+ aliased_view_1 + View "testviewschm2.aliased_view_1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a2.f1, + a2.f2, + a2.f3 + FROM a2 + WHERE (EXISTS ( SELECT 1 + FROM tt1 + WHERE a2.f1 = tt1.x1)); + +\d+ aliased_view_2 + View "testviewschm2.aliased_view_2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a1.f1, + a1.f2, + a1.f3 + FROM a2 a1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 + WHERE a1.f1 = tt1.x1)); + +\d+ aliased_view_3 + View "testviewschm2.aliased_view_3" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a2.f1, + a2.f2, + a2.f3 + FROM a2 + WHERE (EXISTS ( SELECT 1 + FROM tt1 a2_1 + WHERE a2.f1 = a2_1.x1)); + +\d+ aliased_view_4 + View "testviewschm2.aliased_view_4" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + y1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.y1, + tt1.f2, + tt1.f3 + FROM temp_view_test.tt1 + WHERE (EXISTS ( SELECT 1 + FROM a2 + WHERE tt1.y1 = a2.f1)); + +ALTER TABLE a2 RENAME TO tx1; +ALTER TABLE tx1 SET SCHEMA temp_view_test; +\d+ aliased_view_1 + View "testviewschm2.aliased_view_1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tx1.f1, + tx1.f2, + tx1.f3 + FROM temp_view_test.tx1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 + WHERE tx1.f1 = tt1.x1)); + +\d+ aliased_view_2 + View "testviewschm2.aliased_view_2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a1.f1, + a1.f2, + a1.f3 + FROM temp_view_test.tx1 a1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 + WHERE a1.f1 = tt1.x1)); + +\d+ aliased_view_3 + View "testviewschm2.aliased_view_3" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tx1.f1, + tx1.f2, + tx1.f3 + FROM temp_view_test.tx1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 a2 + WHERE tx1.f1 = a2.x1)); + +\d+ aliased_view_4 + View "testviewschm2.aliased_view_4" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + y1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tt1.y1, + tt1.f2, + tt1.f3 + FROM temp_view_test.tt1 + WHERE (EXISTS ( SELECT 1 + FROM temp_view_test.tx1 + WHERE tt1.y1 = tx1.f1)); + +ALTER TABLE temp_view_test.tt1 RENAME TO tmp1; +ALTER TABLE temp_view_test.tmp1 SET SCHEMA testviewschm2; +ALTER TABLE tmp1 RENAME TO tx1; +\d+ aliased_view_1 + View "testviewschm2.aliased_view_1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tx1.f1, + tx1.f2, + tx1.f3 + FROM temp_view_test.tx1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 + WHERE tx1.f1 = tt1.x1)); + +\d+ aliased_view_2 + View "testviewschm2.aliased_view_2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT a1.f1, + a1.f2, + a1.f3 + FROM temp_view_test.tx1 a1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 + WHERE a1.f1 = tt1.x1)); + +\d+ aliased_view_3 + View "testviewschm2.aliased_view_3" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + f1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tx1.f1, + tx1.f2, + tx1.f3 + FROM temp_view_test.tx1 + WHERE (EXISTS ( SELECT 1 + FROM tt1 a2 + WHERE tx1.f1 = a2.x1)); + +\d+ aliased_view_4 + View "testviewschm2.aliased_view_4" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + y1 | integer | | | | plain | + f2 | integer | | | | plain | + f3 | text | | | | extended | +View definition: + SELECT tx1.y1, + tx1.f2, + tx1.f3 + FROM tx1 + WHERE (EXISTS ( SELECT 1 + FROM temp_view_test.tx1 tx1_1 + WHERE tx1.y1 = tx1_1.f1)); + +-- Test aliasing of joins +create view view_of_joins as +select * from + (select * from (tbl1 cross join tbl2) same) ss, + (tbl3 cross join tbl4) same; +\d+ view_of_joins + View "testviewschm2.view_of_joins" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + a | integer | | | | plain | + b | integer | | | | plain | + c | integer | | | | plain | + d | integer | | | | plain | + e | integer | | | | plain | + f | integer | | | | plain | + g | integer | | | | plain | + h | integer | | | | plain | +View definition: + SELECT ss.a, + ss.b, + ss.c, + ss.d, + same.e, + same.f, + same.g, + same.h + FROM ( SELECT same_1.a, + same_1.b, + same_1.c, + same_1.d + FROM (tbl1 + CROSS JOIN tbl2) same_1) ss, + (tbl3 + CROSS JOIN tbl4) same; + +create table tbl1a (a int, c int); +create view view_of_joins_2a as select * from tbl1 join tbl1a using (a); +create view view_of_joins_2b as select * from tbl1 join tbl1a using (a) as x; +create view view_of_joins_2c as select * from (tbl1 join tbl1a using (a)) as y; +create view view_of_joins_2d as select * from (tbl1 join tbl1a using (a) as x) as y; +select pg_get_viewdef('view_of_joins_2a', true); + pg_get_viewdef +---------------------------- + SELECT tbl1.a, + + tbl1.b, + + tbl1a.c + + FROM tbl1 + + JOIN tbl1a USING (a); +(1 row) + +select pg_get_viewdef('view_of_joins_2b', true); + pg_get_viewdef +--------------------------------- + SELECT tbl1.a, + + tbl1.b, + + tbl1a.c + + FROM tbl1 + + JOIN tbl1a USING (a) AS x; +(1 row) + +select pg_get_viewdef('view_of_joins_2c', true); + pg_get_viewdef +------------------------------- + SELECT y.a, + + y.b, + + y.c + + FROM (tbl1 + + JOIN tbl1a USING (a)) y; +(1 row) + +select pg_get_viewdef('view_of_joins_2d', true); + pg_get_viewdef +------------------------------------ + SELECT y.a, + + y.b, + + y.c + + FROM (tbl1 + + JOIN tbl1a USING (a) AS x) y; +(1 row) + +-- Test view decompilation in the face of column addition/deletion/renaming +create table tt2 (a int, b int, c int); +create table tt3 (ax int8, b int2, c numeric); +create table tt4 (ay int, b int, q int); +create view v1 as select * from tt2 natural join tt3; +create view v1a as select * from (tt2 natural join tt3) j; +create view v2 as select * from tt2 join tt3 using (b,c) join tt4 using (b); +create view v2a as select * from (tt2 join tt3 using (b,c) join tt4 using (b)) j; +create view v3 as select * from tt2 join tt3 using (b,c) full join tt4 using (b); +select pg_get_viewdef('v1', true); + pg_get_viewdef +----------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax + + FROM tt2 + + JOIN tt3 USING (b, c); +(1 row) + +select pg_get_viewdef('v1a', true); + pg_get_viewdef +-------------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax + + FROM (tt2 + + JOIN tt3 USING (b, c)) j; +(1 row) + +select pg_get_viewdef('v2', true); + pg_get_viewdef +---------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 USING (b, c)+ + JOIN tt4 USING (b); +(1 row) + +select pg_get_viewdef('v2a', true); + pg_get_viewdef +----------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax, + + j.ay, + + j.q + + FROM (tt2 + + JOIN tt3 USING (b, c) + + JOIN tt4 USING (b)) j; +(1 row) + +select pg_get_viewdef('v3', true); + pg_get_viewdef +------------------------------- + SELECT b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 USING (b, c) + + FULL JOIN tt4 USING (b); +(1 row) + +alter table tt2 add column d int; +alter table tt2 add column e int; +select pg_get_viewdef('v1', true); + pg_get_viewdef +----------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax + + FROM tt2 + + JOIN tt3 USING (b, c); +(1 row) + +select pg_get_viewdef('v1a', true); + pg_get_viewdef +-------------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax + + FROM (tt2 + + JOIN tt3 USING (b, c)) j; +(1 row) + +select pg_get_viewdef('v2', true); + pg_get_viewdef +---------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 USING (b, c)+ + JOIN tt4 USING (b); +(1 row) + +select pg_get_viewdef('v2a', true); + pg_get_viewdef +----------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax, + + j.ay, + + j.q + + FROM (tt2 + + JOIN tt3 USING (b, c) + + JOIN tt4 USING (b)) j; +(1 row) + +select pg_get_viewdef('v3', true); + pg_get_viewdef +------------------------------- + SELECT b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 USING (b, c) + + FULL JOIN tt4 USING (b); +(1 row) + +alter table tt3 rename c to d; +select pg_get_viewdef('v1', true); + pg_get_viewdef +------------------------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax + + FROM tt2 + + JOIN tt3 tt3(ax, b, c) USING (b, c); +(1 row) + +select pg_get_viewdef('v1a', true); + pg_get_viewdef +---------------------------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax + + FROM (tt2 + + JOIN tt3 tt3(ax, b, c) USING (b, c)) j; +(1 row) + +select pg_get_viewdef('v2', true); + pg_get_viewdef +------------------------------------------ + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 tt3(ax, b, c) USING (b, c)+ + JOIN tt4 USING (b); +(1 row) + +select pg_get_viewdef('v2a', true); + pg_get_viewdef +------------------------------------------ + SELECT j.b, + + j.c, + + j.a, + + j.ax, + + j.ay, + + j.q + + FROM (tt2 + + JOIN tt3 tt3(ax, b, c) USING (b, c)+ + JOIN tt4 USING (b)) j; +(1 row) + +select pg_get_viewdef('v3', true); + pg_get_viewdef +------------------------------------------ + SELECT b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 tt3(ax, b, c) USING (b, c)+ + FULL JOIN tt4 USING (b); +(1 row) + +alter table tt3 add column c int; +alter table tt3 add column e int; +select pg_get_viewdef('v1', true); + pg_get_viewdef +--------------------------------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax + + FROM tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c); +(1 row) + +select pg_get_viewdef('v1a', true); + pg_get_viewdef +----------------------------------------------------------------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax + + FROM (tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)) j(b, c, a, d, e, ax, c_1, e_1); +(1 row) + +select pg_get_viewdef('v2', true); + pg_get_viewdef +-------------------------------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+ + JOIN tt4 USING (b); +(1 row) + +select pg_get_viewdef('v2a', true); + pg_get_viewdef +----------------------------------------------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax, + + j.ay, + + j.q + + FROM (tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c) + + JOIN tt4 USING (b)) j(b, c, a, d, e, ax, c_1, e_1, ay, q); +(1 row) + +select pg_get_viewdef('v3', true); + pg_get_viewdef +-------------------------------------------------- + SELECT b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+ + FULL JOIN tt4 USING (b); +(1 row) + +alter table tt2 drop column d; +select pg_get_viewdef('v1', true); + pg_get_viewdef +--------------------------------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax + + FROM tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c); +(1 row) + +select pg_get_viewdef('v1a', true); + pg_get_viewdef +-------------------------------------------------------------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax + + FROM (tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)) j(b, c, a, e, ax, c_1, e_1); +(1 row) + +select pg_get_viewdef('v2', true); + pg_get_viewdef +-------------------------------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+ + JOIN tt4 USING (b); +(1 row) + +select pg_get_viewdef('v2a', true); + pg_get_viewdef +-------------------------------------------------------------- + SELECT j.b, + + j.c, + + j.a, + + j.ax, + + j.ay, + + j.q + + FROM (tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c) + + JOIN tt4 USING (b)) j(b, c, a, e, ax, c_1, e_1, ay, q); +(1 row) + +select pg_get_viewdef('v3', true); + pg_get_viewdef +-------------------------------------------------- + SELECT b, + + tt3.c, + + tt2.a, + + tt3.ax, + + tt4.ay, + + tt4.q + + FROM tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+ + FULL JOIN tt4 USING (b); +(1 row) + +create table tt5 (a int, b int); +create table tt6 (c int, d int); +create view vv1 as select * from (tt5 cross join tt6) j(aa,bb,cc,dd); +select pg_get_viewdef('vv1', true); + pg_get_viewdef +----------------------------------------- + SELECT j.aa, + + j.bb, + + j.cc, + + j.dd + + FROM (tt5 + + CROSS JOIN tt6) j(aa, bb, cc, dd); +(1 row) + +alter table tt5 add column c int; +select pg_get_viewdef('vv1', true); + pg_get_viewdef +-------------------------------------------- + SELECT j.aa, + + j.bb, + + j.cc, + + j.dd + + FROM (tt5 + + CROSS JOIN tt6) j(aa, bb, c, cc, dd); +(1 row) + +alter table tt5 add column cc int; +select pg_get_viewdef('vv1', true); + pg_get_viewdef +-------------------------------------------------- + SELECT j.aa, + + j.bb, + + j.cc, + + j.dd + + FROM (tt5 + + CROSS JOIN tt6) j(aa, bb, c, cc_1, cc, dd); +(1 row) + +alter table tt5 drop column c; +select pg_get_viewdef('vv1', true); + pg_get_viewdef +----------------------------------------------- + SELECT j.aa, + + j.bb, + + j.cc, + + j.dd + + FROM (tt5 + + CROSS JOIN tt6) j(aa, bb, cc_1, cc, dd); +(1 row) + +create view v4 as select * from v1; +alter view v1 rename column a to x; +select pg_get_viewdef('v1', true); + pg_get_viewdef +--------------------------------------------------- + SELECT tt2.b, + + tt3.c, + + tt2.a AS x, + + tt3.ax + + FROM tt2 + + JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c); +(1 row) + +select pg_get_viewdef('v4', true); + pg_get_viewdef +---------------- + SELECT v1.b, + + v1.c, + + v1.x AS a,+ + v1.ax + + FROM v1; +(1 row) + +-- Unnamed FULL JOIN USING is lots of fun too +create table tt7 (x int, xx int, y int); +alter table tt7 drop column xx; +create table tt8 (x int, z int); +create view vv2 as +select * from (values(1,2,3,4,5)) v(a,b,c,d,e) +union all +select * from tt7 full join tt8 using (x), tt8 tt8x; +select pg_get_viewdef('vv2', true); + pg_get_viewdef +------------------------------------------------ + SELECT v.a, + + v.b, + + v.c, + + v.d, + + v.e + + FROM ( VALUES (1,2,3,4,5)) v(a, b, c, d, e)+ + UNION ALL + + SELECT x AS a, + + tt7.y AS b, + + tt8.z AS c, + + tt8x.x_1 AS d, + + tt8x.z AS e + + FROM tt7 + + FULL JOIN tt8 USING (x), + + tt8 tt8x(x_1, z); +(1 row) + +create view vv3 as +select * from (values(1,2,3,4,5,6)) v(a,b,c,x,e,f) +union all +select * from + tt7 full join tt8 using (x), + tt7 tt7x full join tt8 tt8x using (x); +select pg_get_viewdef('vv3', true); + pg_get_viewdef +----------------------------------------------------- + SELECT v.a, + + v.b, + + v.c, + + v.x, + + v.e, + + v.f + + FROM ( VALUES (1,2,3,4,5,6)) v(a, b, c, x, e, f)+ + UNION ALL + + SELECT x AS a, + + tt7.y AS b, + + tt8.z AS c, + + x_1 AS x, + + tt7x.y AS e, + + tt8x.z AS f + + FROM tt7 + + FULL JOIN tt8 USING (x), + + tt7 tt7x(x_1, y) + + FULL JOIN tt8 tt8x(x_1, z) USING (x_1); +(1 row) + +create view vv4 as +select * from (values(1,2,3,4,5,6,7)) v(a,b,c,x,e,f,g) +union all +select * from + tt7 full join tt8 using (x), + tt7 tt7x full join tt8 tt8x using (x) full join tt8 tt8y using (x); +select pg_get_viewdef('vv4', true); + pg_get_viewdef +---------------------------------------------------------- + SELECT v.a, + + v.b, + + v.c, + + v.x, + + v.e, + + v.f, + + v.g + + FROM ( VALUES (1,2,3,4,5,6,7)) v(a, b, c, x, e, f, g)+ + UNION ALL + + SELECT x AS a, + + tt7.y AS b, + + tt8.z AS c, + + x_1 AS x, + + tt7x.y AS e, + + tt8x.z AS f, + + tt8y.z AS g + + FROM tt7 + + FULL JOIN tt8 USING (x), + + tt7 tt7x(x_1, y) + + FULL JOIN tt8 tt8x(x_1, z) USING (x_1) + + FULL JOIN tt8 tt8y(x_1, z) USING (x_1); +(1 row) + +alter table tt7 add column zz int; +alter table tt7 add column z int; +alter table tt7 drop column zz; +alter table tt8 add column z2 int; +select pg_get_viewdef('vv2', true); + pg_get_viewdef +------------------------------------------------ + SELECT v.a, + + v.b, + + v.c, + + v.d, + + v.e + + FROM ( VALUES (1,2,3,4,5)) v(a, b, c, d, e)+ + UNION ALL + + SELECT x AS a, + + tt7.y AS b, + + tt8.z AS c, + + tt8x.x_1 AS d, + + tt8x.z AS e + + FROM tt7 + + FULL JOIN tt8 USING (x), + + tt8 tt8x(x_1, z, z2); +(1 row) + +select pg_get_viewdef('vv3', true); + pg_get_viewdef +----------------------------------------------------- + SELECT v.a, + + v.b, + + v.c, + + v.x, + + v.e, + + v.f + + FROM ( VALUES (1,2,3,4,5,6)) v(a, b, c, x, e, f)+ + UNION ALL + + SELECT x AS a, + + tt7.y AS b, + + tt8.z AS c, + + x_1 AS x, + + tt7x.y AS e, + + tt8x.z AS f + + FROM tt7 + + FULL JOIN tt8 USING (x), + + tt7 tt7x(x_1, y, z) + + FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1); +(1 row) + +select pg_get_viewdef('vv4', true); + pg_get_viewdef +---------------------------------------------------------- + SELECT v.a, + + v.b, + + v.c, + + v.x, + + v.e, + + v.f, + + v.g + + FROM ( VALUES (1,2,3,4,5,6,7)) v(a, b, c, x, e, f, g)+ + UNION ALL + + SELECT x AS a, + + tt7.y AS b, + + tt8.z AS c, + + x_1 AS x, + + tt7x.y AS e, + + tt8x.z AS f, + + tt8y.z AS g + + FROM tt7 + + FULL JOIN tt8 USING (x), + + tt7 tt7x(x_1, y, z) + + FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1) + + FULL JOIN tt8 tt8y(x_1, z, z2) USING (x_1); +(1 row) + +-- Implicit coercions in a JOIN USING create issues similar to FULL JOIN +create table tt7a (x date, xx int, y int); +alter table tt7a drop column xx; +create table tt8a (x timestamptz, z int); +create view vv2a as +select * from (values(now(),2,3,now(),5)) v(a,b,c,d,e) +union all +select * from tt7a left join tt8a using (x), tt8a tt8ax; +select pg_get_viewdef('vv2a', true); + pg_get_viewdef +-------------------------------------------------------- + SELECT v.a, + + v.b, + + v.c, + + v.d, + + v.e + + FROM ( VALUES (now(),2,3,now(),5)) v(a, b, c, d, e)+ + UNION ALL + + SELECT x AS a, + + tt7a.y AS b, + + tt8a.z AS c, + + tt8ax.x_1 AS d, + + tt8ax.z AS e + + FROM tt7a + + LEFT JOIN tt8a USING (x), + + tt8a tt8ax(x_1, z); +(1 row) + +-- +-- Also check dropping a column that existed when the view was made +-- +create table tt9 (x int, xx int, y int); +create table tt10 (x int, z int); +create view vv5 as select x,y,z from tt9 join tt10 using(x); +select pg_get_viewdef('vv5', true); + pg_get_viewdef +--------------------------- + SELECT tt9.x, + + tt9.y, + + tt10.z + + FROM tt9 + + JOIN tt10 USING (x); +(1 row) + +alter table tt9 drop column xx; +select pg_get_viewdef('vv5', true); + pg_get_viewdef +--------------------------- + SELECT tt9.x, + + tt9.y, + + tt10.z + + FROM tt9 + + JOIN tt10 USING (x); +(1 row) + +-- +-- Another corner case is that we might add a column to a table below a +-- JOIN USING, and thereby make the USING column name ambiguous +-- +create table tt11 (x int, y int); +create table tt12 (x int, z int); +create table tt13 (z int, q int); +create view vv6 as select x,y,z,q from + (tt11 join tt12 using(x)) join tt13 using(z); +select pg_get_viewdef('vv6', true); + pg_get_viewdef +--------------------------- + SELECT tt11.x, + + tt11.y, + + tt12.z, + + tt13.q + + FROM tt11 + + JOIN tt12 USING (x) + + JOIN tt13 USING (z); +(1 row) + +alter table tt11 add column z int; +select pg_get_viewdef('vv6', true); + pg_get_viewdef +------------------------------ + SELECT tt11.x, + + tt11.y, + + tt12.z, + + tt13.q + + FROM tt11 tt11(x, y, z_1)+ + JOIN tt12 USING (x) + + JOIN tt13 USING (z); +(1 row) + +-- +-- Check cases involving dropped/altered columns in a function's rowtype result +-- +create table tt14t (f1 text, f2 text, f3 text, f4 text); +insert into tt14t values('foo', 'bar', 'baz', '42'); +alter table tt14t drop column f2; +create function tt14f() returns setof tt14t as +$$ +declare + rec1 record; +begin + for rec1 in select * from tt14t + loop + return next rec1; + end loop; +end; +$$ +language plpgsql; +create view tt14v as select t.* from tt14f() t; +select pg_get_viewdef('tt14v', true); + pg_get_viewdef +-------------------------------- + SELECT t.f1, + + t.f3, + + t.f4 + + FROM tt14f() t(f1, f3, f4); +(1 row) + +select * from tt14v; + f1 | f3 | f4 +-----+-----+---- + foo | baz | 42 +(1 row) + +begin; +-- this perhaps should be rejected, but it isn't: +alter table tt14t drop column f3; +-- f3 is still in the view ... +select pg_get_viewdef('tt14v', true); + pg_get_viewdef +-------------------------------- + SELECT t.f1, + + t.f3, + + t.f4 + + FROM tt14f() t(f1, f3, f4); +(1 row) + +-- but will fail at execution +select f1, f4 from tt14v; + f1 | f4 +-----+---- + foo | 42 +(1 row) + +select * from tt14v; +ERROR: attribute 3 of type record has been dropped +rollback; +begin; +-- this perhaps should be rejected, but it isn't: +alter table tt14t alter column f4 type integer using f4::integer; +-- f4 is still in the view ... +select pg_get_viewdef('tt14v', true); + pg_get_viewdef +-------------------------------- + SELECT t.f1, + + t.f3, + + t.f4 + + FROM tt14f() t(f1, f3, f4); +(1 row) + +-- but will fail at execution +select f1, f3 from tt14v; + f1 | f3 +-----+----- + foo | baz +(1 row) + +select * from tt14v; +ERROR: attribute 4 of type record has wrong type +DETAIL: Table has type integer, but query expects text. +rollback; +-- check display of whole-row variables in some corner cases +create type nestedcomposite as (x int8_tbl); +create view tt15v as select row(i)::nestedcomposite from int8_tbl i; +select * from tt15v; + row +------------------------------------------ + ("(123,456)") + ("(123,4567890123456789)") + ("(4567890123456789,123)") + ("(4567890123456789,4567890123456789)") + ("(4567890123456789,-4567890123456789)") +(5 rows) + +select pg_get_viewdef('tt15v', true); + pg_get_viewdef +------------------------------------------------------ + SELECT ROW(i.*::int8_tbl)::nestedcomposite AS "row"+ + FROM int8_tbl i; +(1 row) + +select row(i.*::int8_tbl)::nestedcomposite from int8_tbl i; + row +------------------------------------------ + ("(123,456)") + ("(123,4567890123456789)") + ("(4567890123456789,123)") + ("(4567890123456789,4567890123456789)") + ("(4567890123456789,-4567890123456789)") +(5 rows) + +create view tt16v as select * from int8_tbl i, lateral(values(i)) ss; +select * from tt16v; + q1 | q2 | column1 +------------------+-------------------+-------------------------------------- + 123 | 456 | (123,456) + 123 | 4567890123456789 | (123,4567890123456789) + 4567890123456789 | 123 | (4567890123456789,123) + 4567890123456789 | 4567890123456789 | (4567890123456789,4567890123456789) + 4567890123456789 | -4567890123456789 | (4567890123456789,-4567890123456789) +(5 rows) + +select pg_get_viewdef('tt16v', true); + pg_get_viewdef +------------------------------------------- + SELECT i.q1, + + i.q2, + + ss.column1 + + FROM int8_tbl i, + + LATERAL ( VALUES (i.*::int8_tbl)) ss; +(1 row) + +select * from int8_tbl i, lateral(values(i.*::int8_tbl)) ss; + q1 | q2 | column1 +------------------+-------------------+-------------------------------------- + 123 | 456 | (123,456) + 123 | 4567890123456789 | (123,4567890123456789) + 4567890123456789 | 123 | (4567890123456789,123) + 4567890123456789 | 4567890123456789 | (4567890123456789,4567890123456789) + 4567890123456789 | -4567890123456789 | (4567890123456789,-4567890123456789) +(5 rows) + +create view tt17v as select * from int8_tbl i where i in (values(i)); +select * from tt17v; + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +select pg_get_viewdef('tt17v', true); + pg_get_viewdef +--------------------------------------------- + SELECT i.q1, + + i.q2 + + FROM int8_tbl i + + WHERE (i.* IN ( VALUES (i.*::int8_tbl))); +(1 row) + +select * from int8_tbl i where i.* in (values(i.*::int8_tbl)); + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +create table tt15v_log(o tt15v, n tt15v, incr bool); +create rule updlog as on update to tt15v do also + insert into tt15v_log values(old, new, row(old,old) < row(new,new)); +\d+ tt15v + View "testviewschm2.tt15v" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+-----------------+-----------+----------+---------+----------+------------- + row | nestedcomposite | | | | extended | +View definition: + SELECT ROW(i.*::int8_tbl)::nestedcomposite AS "row" + FROM int8_tbl i; +Rules: + updlog AS + ON UPDATE TO tt15v DO INSERT INTO tt15v_log (o, n, incr) + VALUES (old.*::tt15v, new.*::tt15v, (ROW(old.*::tt15v, old.*::tt15v) < ROW(new.*::tt15v, new.*::tt15v))) + +-- check unique-ification of overlength names +create view tt18v as + select * from int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy + union all + select * from int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz; +NOTICE: identifier "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy" will be truncated to "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +NOTICE: identifier "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz" will be truncated to "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +select pg_get_viewdef('tt18v', true); + pg_get_viewdef +----------------------------------------------------------------------------------- + SELECT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.q1, + + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.q2 + + FROM int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + UNION ALL + + SELECT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.q1, + + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.q2 + + FROM int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; +(1 row) + +explain (costs off) select * from tt18v; + QUERY PLAN +-------------------------------------------------------------------------------------------- + Append + -> Seq Scan on int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + -> Seq Scan on int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_1 +(3 rows) + +-- check display of ScalarArrayOp with a sub-select +select 'foo'::text = any(array['abc','def','foo']::text[]); + ?column? +---------- + t +(1 row) + +select 'foo'::text = any((select array['abc','def','foo']::text[])); -- fail +ERROR: operator does not exist: text = text[] +LINE 1: select 'foo'::text = any((select array['abc','def','foo']::t... + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +select 'foo'::text = any((select array['abc','def','foo']::text[])::text[]); + ?column? +---------- + t +(1 row) + +create view tt19v as +select 'foo'::text = any(array['abc','def','foo']::text[]) c1, + 'foo'::text = any((select array['abc','def','foo']::text[])::text[]) c2; +select pg_get_viewdef('tt19v', true); + pg_get_viewdef +------------------------------------------------------------------------------------------------------------ + SELECT 'foo'::text = ANY (ARRAY['abc'::text, 'def'::text, 'foo'::text]) AS c1, + + 'foo'::text = ANY ((( SELECT ARRAY['abc'::text, 'def'::text, 'foo'::text] AS "array"))::text[]) AS c2; +(1 row) + +-- check display of assorted RTE_FUNCTION expressions +create view tt20v as +select * from + coalesce(1,2) as c, + collation for ('x'::text) col, + current_date as d, + localtimestamp(3) as t, + cast(1+2 as int4) as i4, + cast(1+2 as int8) as i8; +select pg_get_viewdef('tt20v', true); + pg_get_viewdef +--------------------------------------------- + SELECT c.c, + + col.col, + + d.d, + + t.t, + + i4.i4, + + i8.i8 + + FROM COALESCE(1, 2) c(c), + + COLLATION FOR ('x'::text) col(col), + + CURRENT_DATE d(d), + + LOCALTIMESTAMP(3) t(t), + + CAST(1 + 2 AS integer) i4(i4), + + CAST((1 + 2)::bigint AS bigint) i8(i8); +(1 row) + +-- reverse-listing of various special function syntaxes required by SQL +create view tt201v as +select + extract(day from now()) as extr, + (now(), '1 day'::interval) overlaps + (current_timestamp(2), '1 day'::interval) as o, + 'foo' is normalized isn, + 'foo' is nfkc normalized isnn, + normalize('foo') as n, + normalize('foo', nfkd) as nfkd, + overlay('foo' placing 'bar' from 2) as ovl, + overlay('foo' placing 'bar' from 2 for 3) as ovl2, + position('foo' in 'foobar') as p, + substring('foo' from 2 for 3) as s, + substring('foo' similar 'f' escape '#') as ss, + substring('foo' from 'oo') as ssf, -- historically-permitted abuse + trim(' ' from ' foo ') as bt, + trim(leading ' ' from ' foo ') as lt, + trim(trailing ' foo ') as rt, + trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) as btb, + trim(leading E'\\000'::bytea from E'\\000Tom\\000'::bytea) as ltb, + trim(trailing E'\\000'::bytea from E'\\000Tom\\000'::bytea) as rtb; +select pg_get_viewdef('tt201v', true); + pg_get_viewdef +----------------------------------------------------------------------------------------------- + SELECT EXTRACT(day FROM now()) AS extr, + + ((now(), '@ 1 day'::interval) OVERLAPS (CURRENT_TIMESTAMP(2), '@ 1 day'::interval)) AS o,+ + (('foo'::text) IS NORMALIZED) AS isn, + + (('foo'::text) IS NFKC NORMALIZED) AS isnn, + + NORMALIZE('foo'::text) AS n, + + NORMALIZE('foo'::text, NFKD) AS nfkd, + + OVERLAY('foo'::text PLACING 'bar'::text FROM 2) AS ovl, + + OVERLAY('foo'::text PLACING 'bar'::text FROM 2 FOR 3) AS ovl2, + + POSITION(('foo'::text) IN ('foobar'::text)) AS p, + + SUBSTRING('foo'::text FROM 2 FOR 3) AS s, + + SUBSTRING('foo'::text SIMILAR 'f'::text ESCAPE '#'::text) AS ss, + + "substring"('foo'::text, 'oo'::text) AS ssf, + + TRIM(BOTH ' '::text FROM ' foo '::text) AS bt, + + TRIM(LEADING ' '::text FROM ' foo '::text) AS lt, + + TRIM(TRAILING FROM ' foo '::text) AS rt, + + TRIM(BOTH '\x00'::bytea FROM '\x00546f6d00'::bytea) AS btb, + + TRIM(LEADING '\x00'::bytea FROM '\x00546f6d00'::bytea) AS ltb, + + TRIM(TRAILING '\x00'::bytea FROM '\x00546f6d00'::bytea) AS rtb; +(1 row) + +-- corner cases with empty join conditions +create view tt21v as +select * from tt5 natural inner join tt6; +select pg_get_viewdef('tt21v', true); + pg_get_viewdef +---------------------- + SELECT tt5.a, + + tt5.b, + + tt5.cc, + + tt6.c, + + tt6.d + + FROM tt5 + + CROSS JOIN tt6; +(1 row) + +create view tt22v as +select * from tt5 natural left join tt6; +select pg_get_viewdef('tt22v', true); + pg_get_viewdef +----------------------------- + SELECT tt5.a, + + tt5.b, + + tt5.cc, + + tt6.c, + + tt6.d + + FROM tt5 + + LEFT JOIN tt6 ON TRUE; +(1 row) + +-- check handling of views with immediately-renamed columns +create view tt23v (col_a, col_b) as +select q1 as other_name1, q2 as other_name2 from int8_tbl +union +select 42, 43; +select pg_get_viewdef('tt23v', true); + pg_get_viewdef +------------------------------- + SELECT int8_tbl.q1 AS col_a,+ + int8_tbl.q2 AS col_b + + FROM int8_tbl + + UNION + + SELECT 42 AS col_a, + + 43 AS col_b; +(1 row) + +select pg_get_ruledef(oid, true) from pg_rewrite + where ev_class = 'tt23v'::regclass and ev_type = '1'; + pg_get_ruledef +----------------------------------------------------------------- + CREATE RULE "_RETURN" AS + + ON SELECT TO tt23v DO INSTEAD SELECT int8_tbl.q1 AS col_a,+ + int8_tbl.q2 AS col_b + + FROM int8_tbl + + UNION + + SELECT 42 AS col_a, + + 43 AS col_b; +(1 row) + +-- test extraction of FieldSelect field names (get_name_for_var_field) +create view tt24v as +with cte as materialized (select r from (values(1,2),(3,4)) r) +select (r).column2 as col_a, (rr).column2 as col_b from + cte join (select rr from (values(1,7),(3,8)) rr limit 2) ss + on (r).column1 = (rr).column1; +select pg_get_viewdef('tt24v', true); + pg_get_viewdef +------------------------------------------------------------ + WITH cte AS MATERIALIZED ( + + SELECT r.*::record AS r + + FROM ( VALUES (1,2), (3,4)) r + + ) + + SELECT (cte.r).column2 AS col_a, + + (ss.rr).column2 AS col_b + + FROM cte + + JOIN ( SELECT rr.*::record AS rr + + FROM ( VALUES (1,7), (3,8)) rr + + LIMIT 2) ss ON (cte.r).column1 = (ss.rr).column1; +(1 row) + +create view tt25v as +with cte as materialized (select pg_get_keywords() k) +select (k).word from cte; +select pg_get_viewdef('tt25v', true); + pg_get_viewdef +---------------------------------------- + WITH cte AS MATERIALIZED ( + + SELECT pg_get_keywords() AS k+ + ) + + SELECT (cte.k).word AS word + + FROM cte; +(1 row) + +-- also check cases seen only in EXPLAIN +explain (verbose, costs off) +select * from tt24v; + QUERY PLAN +-------------------------------------------------------------------------------------------------- + Hash Join + Output: (share0_ref1.r).column2, ((ROW("*VALUES*".column1, "*VALUES*".column2))).column2 + Hash Cond: (((ROW("*VALUES*".column1, "*VALUES*".column2))).column1 = (share0_ref1.r).column1) + -> Limit + Output: (ROW("*VALUES*".column1, "*VALUES*".column2)) + -> Values Scan on "*VALUES*" + Output: ROW("*VALUES*".column1, "*VALUES*".column2) + -> Hash + Output: share0_ref1.r + -> Shared Scan (share slice:id -1:0) + Output: share0_ref1.r + -> Values Scan on "*VALUES*_1" + Output: ROW("*VALUES*_1".column1, "*VALUES*_1".column2) + Optimizer: Postgres query optimizer +(14 rows) + +explain (verbose, costs off) +select (r).column2 from (select r from (values(1,2),(3,4)) r limit 1) ss; + QUERY PLAN +------------------------------------------------------------------- + Subquery Scan on ss + Output: (ss.r).column2 + -> Limit + Output: (ROW("*VALUES*".column1, "*VALUES*".column2)) + -> Values Scan on "*VALUES*" + Output: ROW("*VALUES*".column1, "*VALUES*".column2) +(6 rows) + +-- test pretty-print parenthesization rules, and SubLink deparsing +create view tt26v as +select x + y + z as c1, + (x * y) + z as c2, + x + (y * z) as c3, + (x + y) * z as c4, + x * (y + z) as c5, + x + (y + z) as c6, + x + (y # z) as c7, + (x > y) AND (y > z OR x > z) as c8, + (x > y) OR (y > z AND NOT (x > z)) as c9, + (x,y) <> ALL (values(1,2),(3,4)) as c10, + (x,y) <= ANY (values(1,2),(3,4)) as c11 +from (values(1,2,3)) v(x,y,z); +select pg_get_viewdef('tt26v', true); + pg_get_viewdef +-------------------------------------------------------- + SELECT v.x + v.y + v.z AS c1, + + v.x * v.y + v.z AS c2, + + v.x + v.y * v.z AS c3, + + (v.x + v.y) * v.z AS c4, + + v.x * (v.y + v.z) AS c5, + + v.x + (v.y + v.z) AS c6, + + v.x + (v.y # v.z) AS c7, + + v.x > v.y AND (v.y > v.z OR v.x > v.z) AS c8, + + v.x > v.y OR (v.y > v.z AND NOT v.x > v.z) AS c9, + + ((v.x, v.y) <> ALL ( VALUES (1,2), (3,4))) AS c10,+ + ((v.x, v.y) <= ANY ( VALUES (1,2), (3,4))) AS c11 + + FROM ( VALUES (1,2,3)) v(x, y, z); +(1 row) + +-- clean up all the random objects we made above +DROP SCHEMA temp_view_test CASCADE; +NOTICE: drop cascades to 27 other objects +DETAIL: drop cascades to table temp_view_test.base_table +drop cascades to view v2_temp +drop cascades to view v4_temp +drop cascades to view v6_temp +drop cascades to view v7_temp +drop cascades to view v10_temp +drop cascades to view v8_temp +drop cascades to view v9_temp +drop cascades to view v11_temp +drop cascades to view v12_temp +drop cascades to table temp_view_test.base_table2 +drop cascades to view v5_temp +drop cascades to view temp_view_test.v1 +drop cascades to view temp_view_test.v2 +drop cascades to view temp_view_test.v3 +drop cascades to view temp_view_test.v4 +drop cascades to view temp_view_test.v5 +drop cascades to view temp_view_test.v6 +drop cascades to view temp_view_test.v7 +drop cascades to view temp_view_test.v8 +drop cascades to sequence temp_view_test.seq1 +drop cascades to view temp_view_test.v9 +drop cascades to table temp_view_test.tx1 +drop cascades to view aliased_view_1 +drop cascades to view aliased_view_2 +drop cascades to view aliased_view_3 +drop cascades to view aliased_view_4 +DROP SCHEMA testviewschm2 CASCADE; +NOTICE: drop cascades to 74 other objects +DETAIL: drop cascades to table t1 +drop cascades to view temporal1 +drop cascades to view temporal2 +drop cascades to view temporal3 +drop cascades to view temporal4 +drop cascades to table t2 +drop cascades to view nontemp1 +drop cascades to view nontemp2 +drop cascades to view nontemp3 +drop cascades to view nontemp4 +drop cascades to table tbl1 +drop cascades to table tbl2 +drop cascades to table tbl3 +drop cascades to table tbl4 +drop cascades to view mytempview +drop cascades to view pubview +drop cascades to view mysecview1 +drop cascades to view mysecview2 +drop cascades to view mysecview3 +drop cascades to view mysecview4 +drop cascades to view unspecified_types +drop cascades to table tt1 +drop cascades to table tx1 +drop cascades to view view_of_joins +drop cascades to table tbl1a +drop cascades to view view_of_joins_2a +drop cascades to view view_of_joins_2b +drop cascades to view view_of_joins_2c +drop cascades to view view_of_joins_2d +drop cascades to table tt2 +drop cascades to table tt3 +drop cascades to table tt4 +drop cascades to view v1 +drop cascades to view v1a +drop cascades to view v2 +drop cascades to view v2a +drop cascades to view v3 +drop cascades to table tt5 +drop cascades to table tt6 +drop cascades to view vv1 +drop cascades to view v4 +drop cascades to table tt7 +drop cascades to table tt8 +drop cascades to view vv2 +drop cascades to view vv3 +drop cascades to view vv4 +drop cascades to table tt7a +drop cascades to table tt8a +drop cascades to view vv2a +drop cascades to table tt9 +drop cascades to table tt10 +drop cascades to view vv5 +drop cascades to table tt11 +drop cascades to table tt12 +drop cascades to table tt13 +drop cascades to view vv6 +drop cascades to table tt14t +drop cascades to function tt14f() +drop cascades to view tt14v +drop cascades to type nestedcomposite +drop cascades to view tt15v +drop cascades to view tt16v +drop cascades to view tt17v +drop cascades to table tt15v_log +drop cascades to view tt18v +drop cascades to view tt19v +drop cascades to view tt20v +drop cascades to view tt201v +drop cascades to view tt21v +drop cascades to view tt22v +drop cascades to view tt23v +drop cascades to view tt24v +drop cascades to view tt25v +drop cascades to view tt26v diff --git a/src/test/singlenode_regress/expected/date.out b/src/test/singlenode_regress/expected/date.out new file mode 100644 index 00000000000..c8b0566ff40 --- /dev/null +++ b/src/test/singlenode_regress/expected/date.out @@ -0,0 +1,1497 @@ +-- +-- DATE +-- +CREATE TABLE DATE_TBL (f1 date); +INSERT INTO DATE_TBL VALUES ('1957-04-09'); +INSERT INTO DATE_TBL VALUES ('1957-06-13'); +INSERT INTO DATE_TBL VALUES ('1996-02-28'); +INSERT INTO DATE_TBL VALUES ('1996-02-29'); +INSERT INTO DATE_TBL VALUES ('1996-03-01'); +INSERT INTO DATE_TBL VALUES ('1996-03-02'); +INSERT INTO DATE_TBL VALUES ('1997-02-28'); +INSERT INTO DATE_TBL VALUES ('1997-02-29'); +ERROR: date/time field value out of range: "1997-02-29" +LINE 1: INSERT INTO DATE_TBL VALUES ('1997-02-29'); + ^ +INSERT INTO DATE_TBL VALUES ('1997-03-01'); +INSERT INTO DATE_TBL VALUES ('1997-03-02'); +INSERT INTO DATE_TBL VALUES ('2000-04-01'); +INSERT INTO DATE_TBL VALUES ('2000-04-02'); +INSERT INTO DATE_TBL VALUES ('2000-04-03'); +INSERT INTO DATE_TBL VALUES ('2038-04-08'); +INSERT INTO DATE_TBL VALUES ('2039-04-09'); +INSERT INTO DATE_TBL VALUES ('2040-04-10'); +INSERT INTO DATE_TBL VALUES ('2040-04-10 BC'); +SELECT f1 FROM DATE_TBL; + f1 +--------------- + 04-09-1957 + 06-13-1957 + 02-28-1996 + 02-29-1996 + 03-01-1996 + 03-02-1996 + 02-28-1997 + 03-01-1997 + 03-02-1997 + 04-01-2000 + 04-02-2000 + 04-03-2000 + 04-08-2038 + 04-09-2039 + 04-10-2040 + 04-10-2040 BC +(16 rows) + +SELECT f1 FROM DATE_TBL WHERE f1 < '2000-01-01'; + f1 +--------------- + 04-09-1957 + 06-13-1957 + 02-28-1996 + 02-29-1996 + 03-01-1996 + 03-02-1996 + 02-28-1997 + 03-01-1997 + 03-02-1997 + 04-10-2040 BC +(10 rows) + +SELECT f1 FROM DATE_TBL + WHERE f1 BETWEEN '2000-01-01' AND '2001-01-01'; + f1 +------------ + 04-01-2000 + 04-02-2000 + 04-03-2000 +(3 rows) + +-- +-- Check all the documented input formats +-- +SET datestyle TO iso; -- display results in ISO +SET datestyle TO ymd; +SELECT date 'January 8, 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-18'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '1/8/1999'; +ERROR: date/time field value out of range: "1/8/1999" +LINE 1: SELECT date '1/8/1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1/18/1999'; +ERROR: date/time field value out of range: "1/18/1999" +LINE 1: SELECT date '1/18/1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '18/1/1999'; +ERROR: date/time field value out of range: "18/1/1999" +LINE 1: SELECT date '18/1/1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '01/02/03'; + date +------------ + 2001-02-03 +(1 row) + +SELECT date '19990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999.008'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'J2451187'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'January 8, 99 BC'; +ERROR: date/time field value out of range: "January 8, 99 BC" +LINE 1: SELECT date 'January 8, 99 BC'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '99-Jan-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-Jan-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-99'; +ERROR: date/time field value out of range: "08-Jan-99" +LINE 1: SELECT date '08-Jan-99'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '08-Jan-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-99'; +ERROR: date/time field value out of range: "Jan-08-99" +LINE 1: SELECT date 'Jan-08-99'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date 'Jan-08-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-Jan'; +ERROR: invalid input syntax for type date: "99-08-Jan" +LINE 1: SELECT date '99-08-Jan'; + ^ +SELECT date '1999-08-Jan'; +ERROR: invalid input syntax for type date: "1999-08-Jan" +LINE 1: SELECT date '1999-08-Jan'; + ^ +SELECT date '99 Jan 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999 Jan 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 99'; +ERROR: date/time field value out of range: "08 Jan 99" +LINE 1: SELECT date '08 Jan 99'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '08 Jan 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 99'; +ERROR: date/time field value out of range: "Jan 08 99" +LINE 1: SELECT date 'Jan 08 99'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date 'Jan 08 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99 08 Jan'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999 08 Jan'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-01-99'; +ERROR: date/time field value out of range: "08-01-99" +LINE 1: SELECT date '08-01-99'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '08-01-1999'; +ERROR: date/time field value out of range: "08-01-1999" +LINE 1: SELECT date '08-01-1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '01-08-99'; +ERROR: date/time field value out of range: "01-08-99" +LINE 1: SELECT date '01-08-99'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '01-08-1999'; +ERROR: date/time field value out of range: "01-08-1999" +LINE 1: SELECT date '01-08-1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '99-08-01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '1999-08-01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '99 01 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999 01 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 01 99'; +ERROR: date/time field value out of range: "08 01 99" +LINE 1: SELECT date '08 01 99'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '08 01 1999'; +ERROR: date/time field value out of range: "08 01 1999" +LINE 1: SELECT date '08 01 1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '01 08 99'; +ERROR: date/time field value out of range: "01 08 99" +LINE 1: SELECT date '01 08 99'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '01 08 1999'; +ERROR: date/time field value out of range: "01 08 1999" +LINE 1: SELECT date '01 08 1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '99 08 01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '1999 08 01'; + date +------------ + 1999-08-01 +(1 row) + +SET datestyle TO dmy; +SELECT date 'January 8, 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-18'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '1/8/1999'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '1/18/1999'; +ERROR: date/time field value out of range: "1/18/1999" +LINE 1: SELECT date '1/18/1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '18/1/1999'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '01/02/03'; + date +------------ + 2003-02-01 +(1 row) + +SELECT date '19990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999.008'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'J2451187'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'January 8, 99 BC'; + date +--------------- + 0099-01-08 BC +(1 row) + +SELECT date '99-Jan-08'; +ERROR: date/time field value out of range: "99-Jan-08" +LINE 1: SELECT date '99-Jan-08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-Jan-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-Jan'; +ERROR: invalid input syntax for type date: "99-08-Jan" +LINE 1: SELECT date '99-08-Jan'; + ^ +SELECT date '1999-08-Jan'; +ERROR: invalid input syntax for type date: "1999-08-Jan" +LINE 1: SELECT date '1999-08-Jan'; + ^ +SELECT date '99 Jan 08'; +ERROR: date/time field value out of range: "99 Jan 08" +LINE 1: SELECT date '99 Jan 08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 Jan 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99 08 Jan'; +ERROR: invalid input syntax for type date: "99 08 Jan" +LINE 1: SELECT date '99 08 Jan'; + ^ +SELECT date '1999 08 Jan'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-01-08'; +ERROR: date/time field value out of range: "99-01-08" +LINE 1: SELECT date '99-01-08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-01-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-01-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '01-08-99'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '01-08-1999'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '99-08-01'; +ERROR: date/time field value out of range: "99-08-01" +LINE 1: SELECT date '99-08-01'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-08-01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '99 01 08'; +ERROR: date/time field value out of range: "99 01 08" +LINE 1: SELECT date '99 01 08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 01 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 01 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 01 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '01 08 99'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '01 08 1999'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '99 08 01'; +ERROR: date/time field value out of range: "99 08 01" +LINE 1: SELECT date '99 08 01'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 08 01'; + date +------------ + 1999-08-01 +(1 row) + +SET datestyle TO mdy; +SELECT date 'January 8, 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999-01-18'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '1/8/1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1/18/1999'; + date +------------ + 1999-01-18 +(1 row) + +SELECT date '18/1/1999'; +ERROR: date/time field value out of range: "18/1/1999" +LINE 1: SELECT date '18/1/1999'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '01/02/03'; + date +------------ + 2003-01-02 +(1 row) + +SELECT date '19990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '990108'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '1999.008'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'J2451187'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'January 8, 99 BC'; + date +--------------- + 0099-01-08 BC +(1 row) + +SELECT date '99-Jan-08'; +ERROR: date/time field value out of range: "99-Jan-08" +LINE 1: SELECT date '99-Jan-08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-Jan-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-Jan-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan-08-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-Jan'; +ERROR: invalid input syntax for type date: "99-08-Jan" +LINE 1: SELECT date '99-08-Jan'; + ^ +SELECT date '1999-08-Jan'; +ERROR: invalid input syntax for type date: "1999-08-Jan" +LINE 1: SELECT date '1999-08-Jan'; + ^ +SELECT date '99 Jan 08'; +ERROR: invalid input syntax for type date: "99 Jan 08" +LINE 1: SELECT date '99 Jan 08'; + ^ +SELECT date '1999 Jan 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 Jan 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date 'Jan 08 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99 08 Jan'; +ERROR: invalid input syntax for type date: "99 08 Jan" +LINE 1: SELECT date '99 08 Jan'; + ^ +SELECT date '1999 08 Jan'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-01-08'; +ERROR: date/time field value out of range: "99-01-08" +LINE 1: SELECT date '99-01-08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-01-08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08-01-99'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '08-01-1999'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '01-08-99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '01-08-1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99-08-01'; +ERROR: date/time field value out of range: "99-08-01" +LINE 1: SELECT date '99-08-01'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999-08-01'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '99 01 08'; +ERROR: date/time field value out of range: "99 01 08" +LINE 1: SELECT date '99 01 08'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 01 08'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '08 01 99'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '08 01 1999'; + date +------------ + 1999-08-01 +(1 row) + +SELECT date '01 08 99'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '01 08 1999'; + date +------------ + 1999-01-08 +(1 row) + +SELECT date '99 08 01'; +ERROR: date/time field value out of range: "99 08 01" +LINE 1: SELECT date '99 08 01'; + ^ +HINT: Perhaps you need a different "datestyle" setting. +SELECT date '1999 08 01'; + date +------------ + 1999-08-01 +(1 row) + +-- Check upper and lower limits of date range +SELECT date '4714-11-24 BC'; + date +--------------- + 4714-11-24 BC +(1 row) + +SELECT date '4714-11-23 BC'; -- out of range +ERROR: date out of range: "4714-11-23 BC" +LINE 1: SELECT date '4714-11-23 BC'; + ^ +SELECT date '5874897-12-31'; + date +--------------- + 5874897-12-31 +(1 row) + +SELECT date '5874898-01-01'; -- out of range +ERROR: date out of range: "5874898-01-01" +LINE 1: SELECT date '5874898-01-01'; + ^ +RESET datestyle; +-- +-- Simple math +-- Leave most of it for the horology tests +-- +SELECT f1 - date '2000-01-01' AS "Days From 2K" FROM DATE_TBL; + Days From 2K +-------------- + -15607 + -15542 + -1403 + -1402 + -1401 + -1400 + -1037 + -1036 + -1035 + 91 + 92 + 93 + 13977 + 14343 + 14710 + -1475115 +(16 rows) + +SELECT f1 - date 'epoch' AS "Days From Epoch" FROM DATE_TBL; + Days From Epoch +----------------- + -4650 + -4585 + 9554 + 9555 + 9556 + 9557 + 9920 + 9921 + 9922 + 11048 + 11049 + 11050 + 24934 + 25300 + 25667 + -1464158 +(16 rows) + +SELECT date 'yesterday' - date 'today' AS "One day"; + One day +--------- + -1 +(1 row) + +SELECT date 'today' - date 'tomorrow' AS "One day"; + One day +--------- + -1 +(1 row) + +SELECT date 'yesterday' - date 'tomorrow' AS "Two days"; + Two days +---------- + -2 +(1 row) + +SELECT date 'tomorrow' - date 'today' AS "One day"; + One day +--------- + 1 +(1 row) + +SELECT date 'today' - date 'yesterday' AS "One day"; + One day +--------- + 1 +(1 row) + +SELECT date 'tomorrow' - date 'yesterday' AS "Two days"; + Two days +---------- + 2 +(1 row) + +-- +-- test extract! +-- +SELECT f1 as "date", + date_part('year', f1) AS year, + date_part('month', f1) AS month, + date_part('day', f1) AS day, + date_part('quarter', f1) AS quarter, + date_part('decade', f1) AS decade, + date_part('century', f1) AS century, + date_part('millennium', f1) AS millennium, + date_part('isoyear', f1) AS isoyear, + date_part('week', f1) AS week, + date_part('dow', f1) AS dow, + date_part('isodow', f1) AS isodow, + date_part('doy', f1) AS doy, + date_part('julian', f1) AS julian, + date_part('epoch', f1) AS epoch + FROM date_tbl; + date | year | month | day | quarter | decade | century | millennium | isoyear | week | dow | isodow | doy | julian | epoch +---------------+-------+-------+-----+---------+--------+---------+------------+---------+------+-----+--------+-----+---------+--------------- + 04-09-1957 | 1957 | 4 | 9 | 2 | 195 | 20 | 2 | 1957 | 15 | 2 | 2 | 99 | 2435938 | -401760000 + 06-13-1957 | 1957 | 6 | 13 | 2 | 195 | 20 | 2 | 1957 | 24 | 4 | 4 | 164 | 2436003 | -396144000 + 02-28-1996 | 1996 | 2 | 28 | 1 | 199 | 20 | 2 | 1996 | 9 | 3 | 3 | 59 | 2450142 | 825465600 + 02-29-1996 | 1996 | 2 | 29 | 1 | 199 | 20 | 2 | 1996 | 9 | 4 | 4 | 60 | 2450143 | 825552000 + 03-01-1996 | 1996 | 3 | 1 | 1 | 199 | 20 | 2 | 1996 | 9 | 5 | 5 | 61 | 2450144 | 825638400 + 03-02-1996 | 1996 | 3 | 2 | 1 | 199 | 20 | 2 | 1996 | 9 | 6 | 6 | 62 | 2450145 | 825724800 + 02-28-1997 | 1997 | 2 | 28 | 1 | 199 | 20 | 2 | 1997 | 9 | 5 | 5 | 59 | 2450508 | 857088000 + 03-01-1997 | 1997 | 3 | 1 | 1 | 199 | 20 | 2 | 1997 | 9 | 6 | 6 | 60 | 2450509 | 857174400 + 03-02-1997 | 1997 | 3 | 2 | 1 | 199 | 20 | 2 | 1997 | 9 | 0 | 7 | 61 | 2450510 | 857260800 + 04-01-2000 | 2000 | 4 | 1 | 2 | 200 | 20 | 2 | 2000 | 13 | 6 | 6 | 92 | 2451636 | 954547200 + 04-02-2000 | 2000 | 4 | 2 | 2 | 200 | 20 | 2 | 2000 | 13 | 0 | 7 | 93 | 2451637 | 954633600 + 04-03-2000 | 2000 | 4 | 3 | 2 | 200 | 20 | 2 | 2000 | 14 | 1 | 1 | 94 | 2451638 | 954720000 + 04-08-2038 | 2038 | 4 | 8 | 2 | 203 | 21 | 3 | 2038 | 14 | 4 | 4 | 98 | 2465522 | 2154297600 + 04-09-2039 | 2039 | 4 | 9 | 2 | 203 | 21 | 3 | 2039 | 14 | 6 | 6 | 99 | 2465888 | 2185920000 + 04-10-2040 | 2040 | 4 | 10 | 2 | 204 | 21 | 3 | 2040 | 15 | 2 | 2 | 101 | 2466255 | 2217628800 + 04-10-2040 BC | -2040 | 4 | 10 | 2 | -204 | -21 | -3 | -2040 | 15 | 1 | 1 | 100 | 976430 | -126503251200 +(16 rows) + +-- +-- epoch +-- +SELECT EXTRACT(EPOCH FROM DATE '1970-01-01'); -- 0 + extract +--------- + 0 +(1 row) + +-- +-- century +-- +SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2 + extract +--------- + -2 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '1900-12-31'); -- 19 + extract +--------- + 19 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '1901-01-01'); -- 20 + extract +--------- + 20 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '2000-12-31'); -- 20 + extract +--------- + 20 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '2001-01-01'); -- 21 + extract +--------- + 21 +(1 row) + +SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true + true +------ + t +(1 row) + +-- +-- millennium +-- +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01'); -- 2 + extract +--------- + 2 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31'); -- 2 + extract +--------- + 2 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01'); -- 3 + extract +--------- + 3 +(1 row) + +-- next test to be fixed on the turn of the next millennium;-) +SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3 + extract +--------- + 3 +(1 row) + +-- +-- decade +-- +SELECT EXTRACT(DECADE FROM DATE '1994-12-25'); -- 199 + extract +--------- + 199 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0010-01-01'); -- 1 + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0009-12-31'); -- 0 + extract +--------- + 0 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); -- 0 + extract +--------- + 0 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); -- -1 + extract +--------- + -1 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 + extract +--------- + -2 +(1 row) + +-- +-- all possible fields +-- +SELECT EXTRACT(MICROSECONDS FROM DATE '2020-08-11'); +ERROR: date units "microseconds" not supported +SELECT EXTRACT(MILLISECONDS FROM DATE '2020-08-11'); +ERROR: date units "milliseconds" not supported +SELECT EXTRACT(SECOND FROM DATE '2020-08-11'); +ERROR: date units "second" not supported +SELECT EXTRACT(MINUTE FROM DATE '2020-08-11'); +ERROR: date units "minute" not supported +SELECT EXTRACT(HOUR FROM DATE '2020-08-11'); +ERROR: date units "hour" not supported +SELECT EXTRACT(DAY FROM DATE '2020-08-11'); + extract +--------- + 11 +(1 row) + +SELECT EXTRACT(MONTH FROM DATE '2020-08-11'); + extract +--------- + 8 +(1 row) + +SELECT EXTRACT(YEAR FROM DATE '2020-08-11'); + extract +--------- + 2020 +(1 row) + +SELECT EXTRACT(YEAR FROM DATE '2020-08-11 BC'); + extract +--------- + -2020 +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '2020-08-11'); + extract +--------- + 202 +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '2020-08-11'); + extract +--------- + 21 +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '2020-08-11'); + extract +--------- + 3 +(1 row) + +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11'); + extract +--------- + 2020 +(1 row) + +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11 BC'); + extract +--------- + -2020 +(1 row) + +SELECT EXTRACT(QUARTER FROM DATE '2020-08-11'); + extract +--------- + 3 +(1 row) + +SELECT EXTRACT(WEEK FROM DATE '2020-08-11'); + extract +--------- + 33 +(1 row) + +SELECT EXTRACT(DOW FROM DATE '2020-08-11'); + extract +--------- + 2 +(1 row) + +SELECT EXTRACT(DOW FROM DATE '2020-08-16'); + extract +--------- + 0 +(1 row) + +SELECT EXTRACT(ISODOW FROM DATE '2020-08-11'); + extract +--------- + 2 +(1 row) + +SELECT EXTRACT(ISODOW FROM DATE '2020-08-16'); + extract +--------- + 7 +(1 row) + +SELECT EXTRACT(DOY FROM DATE '2020-08-11'); + extract +--------- + 224 +(1 row) + +SELECT EXTRACT(TIMEZONE FROM DATE '2020-08-11'); +ERROR: date units "timezone" not supported +SELECT EXTRACT(TIMEZONE_M FROM DATE '2020-08-11'); +ERROR: date units "timezone_m" not supported +SELECT EXTRACT(TIMEZONE_H FROM DATE '2020-08-11'); +ERROR: date units "timezone_h" not supported +SELECT EXTRACT(EPOCH FROM DATE '2020-08-11'); + extract +------------ + 1597104000 +(1 row) + +SELECT EXTRACT(JULIAN FROM DATE '2020-08-11'); + extract +--------- + 2459073 +(1 row) + +-- +-- test trunc function! +-- +SELECT DATE_TRUNC('MILLENNIUM', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1001 + date_trunc +-------------------------- + Thu Jan 01 00:00:00 1001 +(1 row) + +SELECT DATE_TRUNC('MILLENNIUM', DATE '1970-03-20'); -- 1001-01-01 + date_trunc +------------------------------ + Thu Jan 01 00:00:00 1001 PST +(1 row) + +SELECT DATE_TRUNC('CENTURY', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1901 + date_trunc +-------------------------- + Tue Jan 01 00:00:00 1901 +(1 row) + +SELECT DATE_TRUNC('CENTURY', DATE '1970-03-20'); -- 1901 + date_trunc +------------------------------ + Tue Jan 01 00:00:00 1901 PST +(1 row) + +SELECT DATE_TRUNC('CENTURY', DATE '2004-08-10'); -- 2001-01-01 + date_trunc +------------------------------ + Mon Jan 01 00:00:00 2001 PST +(1 row) + +SELECT DATE_TRUNC('CENTURY', DATE '0002-02-04'); -- 0001-01-01 + date_trunc +------------------------------ + Mon Jan 01 00:00:00 0001 PST +(1 row) + +SELECT DATE_TRUNC('CENTURY', DATE '0055-08-10 BC'); -- 0100-01-01 BC + date_trunc +--------------------------------- + Tue Jan 01 00:00:00 0100 PST BC +(1 row) + +SELECT DATE_TRUNC('DECADE', DATE '1993-12-25'); -- 1990-01-01 + date_trunc +------------------------------ + Mon Jan 01 00:00:00 1990 PST +(1 row) + +SELECT DATE_TRUNC('DECADE', DATE '0004-12-25'); -- 0001-01-01 BC + date_trunc +--------------------------------- + Sat Jan 01 00:00:00 0001 PST BC +(1 row) + +SELECT DATE_TRUNC('DECADE', DATE '0002-12-31 BC'); -- 0011-01-01 BC + date_trunc +--------------------------------- + Mon Jan 01 00:00:00 0011 PST BC +(1 row) + +-- +-- test infinity +-- +select 'infinity'::date, '-infinity'::date; + date | date +----------+----------- + infinity | -infinity +(1 row) + +select 'infinity'::date > 'today'::date as t; + t +--- + t +(1 row) + +select '-infinity'::date < 'today'::date as t; + t +--- + t +(1 row) + +select isfinite('infinity'::date), isfinite('-infinity'::date), isfinite('today'::date); + isfinite | isfinite | isfinite +----------+----------+---------- + f | f | t +(1 row) + +-- +-- oscillating fields from non-finite date: +-- +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(DAY FROM DATE '-infinity'); -- NULL + extract +--------- + +(1 row) + +-- all supported fields +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(MONTH FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(QUARTER FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(WEEK FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(DOW FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(ISODOW FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +SELECT EXTRACT(DOY FROM DATE 'infinity'); -- NULL + extract +--------- + +(1 row) + +-- +-- monotonic fields from non-finite date: +-- +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(EPOCH FROM DATE '-infinity'); -- -Infinity + extract +----------- + -Infinity +(1 row) + +-- all supported fields +SELECT EXTRACT(YEAR FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(DECADE FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(JULIAN FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(ISOYEAR FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity + extract +---------- + Infinity +(1 row) + +-- +-- wrong fields from non-finite date: +-- +SELECT EXTRACT(MICROSEC FROM DATE 'infinity'); -- error +ERROR: date units "microsec" not recognized +-- test constructors +select make_date(2013, 7, 15); + make_date +------------ + 07-15-2013 +(1 row) + +select make_date(-44, 3, 15); + make_date +--------------- + 03-15-0044 BC +(1 row) + +select make_time(8, 20, 0.0); + make_time +----------- + 08:20:00 +(1 row) + +-- should fail +select make_date(0, 7, 15); +ERROR: date field value out of range: 0-07-15 +select make_date(2013, 2, 30); +ERROR: date field value out of range: 2013-02-30 +select make_date(2013, 13, 1); +ERROR: date field value out of range: 2013-13-01 +select make_date(2013, 11, -1); +ERROR: date field value out of range: 2013-11--1 +select make_time(10, 55, 100.1); +ERROR: time field value out of range: 10:55:100.1 +select make_time(24, 0, 2.1); +ERROR: time field value out of range: 24:00:2.1 diff --git a/src/test/singlenode_regress/expected/dbsize.out b/src/test/singlenode_regress/expected/dbsize.out new file mode 100644 index 00000000000..29804aee8b8 --- /dev/null +++ b/src/test/singlenode_regress/expected/dbsize.out @@ -0,0 +1,188 @@ +SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM + (VALUES (10::bigint), (1000::bigint), (1000000::bigint), + (1000000000::bigint), (1000000000000::bigint), + (1000000000000000::bigint)) x(size); + size | pg_size_pretty | pg_size_pretty +------------------+----------------+---------------- + 10 | 10 bytes | -10 bytes + 1000 | 1000 bytes | -1000 bytes + 1000000 | 977 kB | -977 kB + 1000000000 | 954 MB | -954 MB + 1000000000000 | 931 GB | -931 GB + 1000000000000000 | 909 TB | -909 TB +(6 rows) + +SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM + (VALUES (10::numeric), (1000::numeric), (1000000::numeric), + (1000000000::numeric), (1000000000000::numeric), + (1000000000000000::numeric), + (10.5::numeric), (1000.5::numeric), (1000000.5::numeric), + (1000000000.5::numeric), (1000000000000.5::numeric), + (1000000000000000.5::numeric)) x(size); + size | pg_size_pretty | pg_size_pretty +--------------------+----------------+---------------- + 10 | 10 bytes | -10 bytes + 1000 | 1000 bytes | -1000 bytes + 1000000 | 977 kB | -977 kB + 1000000000 | 954 MB | -954 MB + 1000000000000 | 931 GB | -931 GB + 1000000000000000 | 909 TB | -909 TB + 10.5 | 10.5 bytes | -10.5 bytes + 1000.5 | 1000.5 bytes | -1000.5 bytes + 1000000.5 | 977 kB | -977 kB + 1000000000.5 | 954 MB | -954 MB + 1000000000000.5 | 931 GB | -931 GB + 1000000000000000.5 | 909 TB | -909 TB +(12 rows) + +-- test where units change up +SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM + (VALUES (10239::bigint), (10240::bigint), + (10485247::bigint), (10485248::bigint), + (10736893951::bigint), (10736893952::bigint), + (10994579406847::bigint), (10994579406848::bigint), + (11258449312612351::bigint), (11258449312612352::bigint)) x(size); + size | pg_size_pretty | pg_size_pretty +-------------------+----------------+---------------- + 10239 | 10239 bytes | -10239 bytes + 10240 | 10 kB | -10 kB + 10485247 | 10239 kB | -10239 kB + 10485248 | 10 MB | -10 MB + 10736893951 | 10239 MB | -10239 MB + 10736893952 | 10 GB | -10 GB + 10994579406847 | 10239 GB | -10239 GB + 10994579406848 | 10 TB | -10 TB + 11258449312612351 | 10239 TB | -10239 TB + 11258449312612352 | 10240 TB | -10240 TB +(10 rows) + +SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM + (VALUES (10239::numeric), (10240::numeric), + (10485247::numeric), (10485248::numeric), + (10736893951::numeric), (10736893952::numeric), + (10994579406847::numeric), (10994579406848::numeric), + (11258449312612351::numeric), (11258449312612352::numeric)) x(size); + size | pg_size_pretty | pg_size_pretty +-------------------+----------------+---------------- + 10239 | 10239 bytes | -10239 bytes + 10240 | 10 kB | -10 kB + 10485247 | 10239 kB | -10239 kB + 10485248 | 10 MB | -10 MB + 10736893951 | 10239 MB | -10239 MB + 10736893952 | 10 GB | -10 GB + 10994579406847 | 10239 GB | -10239 GB + 10994579406848 | 10 TB | -10 TB + 11258449312612351 | 10239 TB | -10239 TB + 11258449312612352 | 10240 TB | -10240 TB +(10 rows) + +-- pg_size_bytes() tests +SELECT size, pg_size_bytes(size) FROM + (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), + ('1TB'), ('3000 TB'), ('1e6 MB')) x(size); + size | pg_size_bytes +----------+------------------ + 1 | 1 + 123bytes | 123 + 1kB | 1024 + 1MB | 1048576 + 1 GB | 1073741824 + 1.5 GB | 1610612736 + 1TB | 1099511627776 + 3000 TB | 3298534883328000 + 1e6 MB | 1048576000000 +(9 rows) + +-- case-insensitive units are supported +SELECT size, pg_size_bytes(size) FROM + (VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '), + ('1tb'), ('3000 tb'), ('1e6 mb')) x(size); + size | pg_size_bytes +----------+------------------ + 1 | 1 + 123bYteS | 123 + 1kb | 1024 + 1mb | 1048576 + 1 Gb | 1073741824 + 1.5 gB | 1610612736 + 1tb | 1099511627776 + 3000 tb | 3298534883328000 + 1e6 mb | 1048576000000 +(9 rows) + +-- negative numbers are supported +SELECT size, pg_size_bytes(size) FROM + (VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '), + ('-1tb'), ('-3000 TB'), ('-10e-1 MB')) x(size); + size | pg_size_bytes +-----------+------------------- + -1 | -1 + -123bytes | -123 + -1kb | -1024 + -1mb | -1048576 + -1 Gb | -1073741824 + -1.5 gB | -1610612736 + -1tb | -1099511627776 + -3000 TB | -3298534883328000 + -10e-1 MB | -1048576 +(9 rows) + +-- different cases with allowed points +SELECT size, pg_size_bytes(size) FROM + (VALUES ('-1.'), ('-1.kb'), ('-1. kb'), ('-0. gb'), + ('-.1'), ('-.1kb'), ('-.1 kb'), ('-.0 gb')) x(size); + size | pg_size_bytes +--------+--------------- + -1. | -1 + -1.kb | -1024 + -1. kb | -1024 + -0. gb | 0 + -.1 | 0 + -.1kb | -102 + -.1 kb | -102 + -.0 gb | 0 +(8 rows) + +-- invalid inputs +SELECT pg_size_bytes('1 AB'); +ERROR: invalid size: "1 AB" +DETAIL: Invalid size unit: "AB". +HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +SELECT pg_size_bytes('1 AB A'); +ERROR: invalid size: "1 AB A" +DETAIL: Invalid size unit: "AB A". +HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +SELECT pg_size_bytes('1 AB A '); +ERROR: invalid size: "1 AB A " +DETAIL: Invalid size unit: "AB A". +HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +SELECT pg_size_bytes('9223372036854775807.9'); +ERROR: bigint out of range +SELECT pg_size_bytes('1e100'); +ERROR: bigint out of range +SELECT pg_size_bytes('1e1000000000000000000'); +ERROR: value overflows numeric format +SELECT pg_size_bytes('1 byte'); -- the singular "byte" is not supported +ERROR: invalid size: "1 byte" +DETAIL: Invalid size unit: "byte". +HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +SELECT pg_size_bytes(''); +ERROR: invalid size: "" +SELECT pg_size_bytes('kb'); +ERROR: invalid size: "kb" +SELECT pg_size_bytes('..'); +ERROR: invalid size: ".." +SELECT pg_size_bytes('-.'); +ERROR: invalid size: "-." +SELECT pg_size_bytes('-.kb'); +ERROR: invalid size: "-.kb" +SELECT pg_size_bytes('-. kb'); +ERROR: invalid size: "-. kb" +SELECT pg_size_bytes('.+912'); +ERROR: invalid size: ".+912" +SELECT pg_size_bytes('+912+ kB'); +ERROR: invalid size: "+912+ kB" +DETAIL: Invalid size unit: "+ kB". +HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +SELECT pg_size_bytes('++123 kB'); +ERROR: invalid size: "++123 kB" diff --git a/src/test/singlenode_regress/expected/delete.out b/src/test/singlenode_regress/expected/delete.out new file mode 100644 index 00000000000..e7eb3285f88 --- /dev/null +++ b/src/test/singlenode_regress/expected/delete.out @@ -0,0 +1,33 @@ +CREATE TABLE delete_test ( + id SERIAL PRIMARY KEY, + a INT, + b text +); +INSERT INTO delete_test (a) VALUES (10); +INSERT INTO delete_test (a, b) VALUES (50, repeat('x', 10000)); +INSERT INTO delete_test (a) VALUES (100); +-- allow an alias to be specified for DELETE's target table +DELETE FROM delete_test AS dt WHERE dt.a > 75; +-- if an alias is specified, don't allow the original table name +-- to be referenced +DELETE FROM delete_test dt WHERE delete_test.a > 25; +ERROR: invalid reference to FROM-clause entry for table "delete_test" +LINE 1: DELETE FROM delete_test dt WHERE delete_test.a > 25; + ^ +HINT: Perhaps you meant to reference the table alias "dt". +SELECT id, a, char_length(b) FROM delete_test; + id | a | char_length +----+----+------------- + 1 | 10 | + 2 | 50 | 10000 +(2 rows) + +-- delete a row with a TOASTed value +DELETE FROM delete_test WHERE a > 25; +SELECT id, a, char_length(b) FROM delete_test; + id | a | char_length +----+----+------------- + 1 | 10 | +(1 row) + +DROP TABLE delete_test; diff --git a/src/test/singlenode_regress/expected/dependency.out b/src/test/singlenode_regress/expected/dependency.out new file mode 100644 index 00000000000..8c6612f8f74 --- /dev/null +++ b/src/test/singlenode_regress/expected/dependency.out @@ -0,0 +1,150 @@ +-- +-- DEPENDENCIES +-- +CREATE USER regress_dep_user; +CREATE USER regress_dep_user2; +CREATE USER regress_dep_user3; +CREATE GROUP regress_dep_group; +CREATE TABLE deptest (f1 serial primary key, f2 text); +GRANT SELECT ON TABLE deptest TO GROUP regress_dep_group; +GRANT ALL ON TABLE deptest TO regress_dep_user, regress_dep_user2; +-- can't drop neither because they have privileges somewhere +DROP USER regress_dep_user; +ERROR: role "regress_dep_user" cannot be dropped because some objects depend on it +DETAIL: privileges for table deptest +DROP GROUP regress_dep_group; +ERROR: role "regress_dep_group" cannot be dropped because some objects depend on it +DETAIL: privileges for table deptest +-- if we revoke the privileges we can drop the group +REVOKE SELECT ON deptest FROM GROUP regress_dep_group; +DROP GROUP regress_dep_group; +-- can't drop the user if we revoke the privileges partially +REVOKE SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES ON deptest FROM regress_dep_user; +DROP USER regress_dep_user; +ERROR: role "regress_dep_user" cannot be dropped because some objects depend on it +DETAIL: privileges for table deptest +-- now we are OK to drop him +REVOKE TRIGGER ON deptest FROM regress_dep_user; +DROP USER regress_dep_user; +-- we are OK too if we drop the privileges all at once +REVOKE ALL ON deptest FROM regress_dep_user2; +DROP USER regress_dep_user2; +-- can't drop the owner of an object +-- the error message detail here would include a pg_toast_nnn name that +-- is not constant, so suppress it +\set VERBOSITY terse +ALTER TABLE deptest OWNER TO regress_dep_user3; +DROP USER regress_dep_user3; +ERROR: role "regress_dep_user3" cannot be dropped because some objects depend on it +\set VERBOSITY default +-- if we drop the object, we can drop the user too +DROP TABLE deptest; +DROP USER regress_dep_user3; +-- Test DROP OWNED +CREATE USER regress_dep_user0; +CREATE USER regress_dep_user1; +CREATE USER regress_dep_user2; +SET SESSION AUTHORIZATION regress_dep_user0; +-- permission denied +DROP OWNED BY regress_dep_user1; +ERROR: permission denied to drop objects +DROP OWNED BY regress_dep_user0, regress_dep_user2; +ERROR: permission denied to drop objects +REASSIGN OWNED BY regress_dep_user0 TO regress_dep_user1; +ERROR: permission denied to reassign objects +REASSIGN OWNED BY regress_dep_user1 TO regress_dep_user0; +ERROR: permission denied to reassign objects +-- this one is allowed +DROP OWNED BY regress_dep_user0; +CREATE TABLE deptest1 (f1 int unique); +GRANT ALL ON deptest1 TO regress_dep_user1 WITH GRANT OPTION; +SET SESSION AUTHORIZATION regress_dep_user1; +CREATE TABLE deptest (a serial primary key, b text); +GRANT ALL ON deptest1 TO regress_dep_user2; +RESET SESSION AUTHORIZATION; +\z deptest1 + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+----------+-------+----------------------------------------------------+-------------------+---------- + public | deptest1 | table | regress_dep_user0=arwdDxt/regress_dep_user0 +| | + | | | regress_dep_user1=a*r*w*d*D*x*t*/regress_dep_user0+| | + | | | regress_dep_user2=arwdDxt/regress_dep_user1 | | +(1 row) + +DROP OWNED BY regress_dep_user1; +-- all grants revoked +\z deptest1 + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+----------+-------+---------------------------------------------+-------------------+---------- + public | deptest1 | table | regress_dep_user0=arwdDxt/regress_dep_user0 | | +(1 row) + +-- table was dropped +\d deptest +-- Test REASSIGN OWNED +GRANT ALL ON deptest1 TO regress_dep_user1; +GRANT CREATE ON DATABASE regression TO regress_dep_user1; +SET SESSION AUTHORIZATION regress_dep_user1; +CREATE SCHEMA deptest; +CREATE TABLE deptest (a serial primary key, b text); +ALTER DEFAULT PRIVILEGES FOR ROLE regress_dep_user1 IN SCHEMA deptest + GRANT ALL ON TABLES TO regress_dep_user2; +CREATE FUNCTION deptest_func() RETURNS void LANGUAGE plpgsql + AS $$ BEGIN END; $$; +CREATE TYPE deptest_enum AS ENUM ('red'); +CREATE TYPE deptest_range AS RANGE (SUBTYPE = int4); +CREATE TABLE deptest2 (f1 int); +-- make a serial column the hard way +CREATE SEQUENCE ss1; +ALTER TABLE deptest2 ALTER f1 SET DEFAULT nextval('ss1'); +ALTER SEQUENCE ss1 OWNED BY deptest2.f1; +-- When reassigning ownership of a composite type, its pg_class entry +-- should match +CREATE TYPE deptest_t AS (a int); +SELECT typowner = relowner +FROM pg_type JOIN pg_class c ON typrelid = c.oid WHERE typname = 'deptest_t'; + ?column? +---------- + t +(1 row) + +RESET SESSION AUTHORIZATION; +REASSIGN OWNED BY regress_dep_user1 TO regress_dep_user2; +\dt deptest + List of relations + Schema | Name | Type | Owner | Storage +--------+---------+-------+-------------------+--------- + public | deptest | table | regress_dep_user2 | heap +(1 row) + +SELECT typowner = relowner +FROM pg_type JOIN pg_class c ON typrelid = c.oid WHERE typname = 'deptest_t'; + ?column? +---------- + t +(1 row) + +-- doesn't work: grant still exists +DROP USER regress_dep_user1; +ERROR: role "regress_dep_user1" cannot be dropped because some objects depend on it +DETAIL: privileges for database regression +privileges for table deptest1 +owner of default privileges on new relations belonging to role regress_dep_user1 in schema deptest +DROP OWNED BY regress_dep_user1; +DROP USER regress_dep_user1; +DROP USER regress_dep_user2; +ERROR: role "regress_dep_user2" cannot be dropped because some objects depend on it +DETAIL: owner of schema deptest +owner of sequence deptest_a_seq +owner of table deptest +owner of function deptest_func() +owner of type deptest_enum +owner of type deptest_multirange +owner of type deptest_range +owner of table deptest2 +owner of sequence ss1 +owner of type deptest_t +DROP OWNED BY regress_dep_user2, regress_dep_user0; +DROP USER regress_dep_user2; +DROP USER regress_dep_user0; diff --git a/src/test/singlenode_regress/expected/disable_autovacuum.out b/src/test/singlenode_regress/expected/disable_autovacuum.out new file mode 100644 index 00000000000..b7056b9bdf2 --- /dev/null +++ b/src/test/singlenode_regress/expected/disable_autovacuum.out @@ -0,0 +1,7 @@ +alter system set autovacuum = off; +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 +---------------+---------------- + -1 | t +(1 row) + diff --git a/src/test/singlenode_regress/expected/domain.out b/src/test/singlenode_regress/expected/domain.out new file mode 100644 index 00000000000..491a81513cc --- /dev/null +++ b/src/test/singlenode_regress/expected/domain.out @@ -0,0 +1,1161 @@ +-- +-- Test domains. +-- +-- Test Comment / Drop +create domain domaindroptest int4; +comment on domain domaindroptest is 'About to drop this..'; +create domain dependenttypetest domaindroptest; +-- fail because of dependent type +drop domain domaindroptest; +ERROR: cannot drop type domaindroptest because other objects depend on it +DETAIL: type dependenttypetest depends on type domaindroptest +HINT: Use DROP ... CASCADE to drop the dependent objects too. +drop domain domaindroptest cascade; +NOTICE: drop cascades to type dependenttypetest +-- this should fail because already gone +drop domain domaindroptest cascade; +ERROR: type "domaindroptest" does not exist +-- Test domain input. +-- Note: the point of checking both INSERT and COPY FROM is that INSERT +-- exercises CoerceToDomain while COPY exercises domain_in. +create domain domainvarchar varchar(5); +create domain domainnumeric numeric(8,2); +create domain domainint4 int4; +create domain domaintext text; +-- Test explicit coercions --- these should succeed (and truncate) +SELECT cast('123456' as domainvarchar); + domainvarchar +--------------- + 12345 +(1 row) + +SELECT cast('12345' as domainvarchar); + domainvarchar +--------------- + 12345 +(1 row) + +-- Test tables using domains +create table basictest + ( testint4 domainint4 + , testtext domaintext + , testvarchar domainvarchar + , testnumeric domainnumeric + ); +INSERT INTO basictest values ('88', 'haha', 'short', '123.12'); -- Good +INSERT INTO basictest values ('88', 'haha', 'short text', '123.12'); -- Bad varchar +ERROR: value too long for type character varying(5) +INSERT INTO basictest values ('88', 'haha', 'short', '123.1212'); -- Truncate numeric +-- Test copy +COPY basictest (testvarchar) FROM stdin; -- fail +ERROR: value too long for type character varying(5) +CONTEXT: COPY basictest, line 1, column testvarchar: "notsoshorttext" +COPY basictest (testvarchar) FROM stdin; +select * from basictest; + testint4 | testtext | testvarchar | testnumeric +----------+----------+-------------+------------- + 88 | haha | short | 123.12 + 88 | haha | short | 123.12 + | | short | +(3 rows) + +-- check that domains inherit operations from base types +select testtext || testvarchar as concat, testnumeric + 42 as sum +from basictest; + concat | sum +-----------+-------- + hahashort | 165.12 + hahashort | 165.12 + | +(3 rows) + +-- check that union/case/coalesce type resolution handles domains properly +select pg_typeof(coalesce(4::domainint4, 7)); + pg_typeof +----------- + integer +(1 row) + +select pg_typeof(coalesce(4::domainint4, 7::domainint4)); + pg_typeof +------------ + domainint4 +(1 row) + +drop table basictest; +drop domain domainvarchar restrict; +drop domain domainnumeric restrict; +drop domain domainint4 restrict; +drop domain domaintext; +-- Test domains over array types +create domain domainint4arr int4[1]; +create domain domainchar4arr varchar(4)[2][3]; +create table domarrtest + ( testint4arr domainint4arr + , testchar4arr domainchar4arr + ); +INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"}}'); +INSERT INTO domarrtest values ('{{2,2},{2,2}}', '{{"a","b"}}'); +INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"},{"e","f"}}'); +INSERT INTO domarrtest values ('{2,2}', '{{"a"},{"c"}}'); +INSERT INTO domarrtest values (NULL, '{{"a","b","c"},{"d","e","f"}}'); +INSERT INTO domarrtest values (NULL, '{{"toolong","b","c"},{"d","e","f"}}'); +ERROR: value too long for type character varying(4) +INSERT INTO domarrtest (testint4arr[1], testint4arr[3]) values (11,22); +select * from domarrtest; + testint4arr | testchar4arr +---------------+--------------------- + {2,2} | {{a,b},{c,d}} + {{2,2},{2,2}} | {{a,b}} + {2,2} | {{a,b},{c,d},{e,f}} + {2,2} | {{a},{c}} + | {{a,b,c},{d,e,f}} + {11,NULL,22} | +(6 rows) + +select testint4arr[1], testchar4arr[2:2] from domarrtest; + testint4arr | testchar4arr +-------------+-------------- + 2 | {{c,d}} + | {} + 2 | {{c,d}} + 2 | {{c}} + | {{d,e,f}} + 11 | +(6 rows) + +select array_dims(testint4arr), array_dims(testchar4arr) from domarrtest; + array_dims | array_dims +------------+------------ + [1:2] | [1:2][1:2] + [1:2][1:2] | [1:1][1:2] + [1:2] | [1:3][1:2] + [1:2] | [1:2][1:1] + | [1:2][1:3] + [1:3] | +(6 rows) + +COPY domarrtest FROM stdin; +COPY domarrtest FROM stdin; -- fail +ERROR: value too long for type character varying(4) +CONTEXT: COPY domarrtest, line 1, column testchar4arr: "{qwerty,w,e}" +select * from domarrtest; + testint4arr | testchar4arr +---------------+--------------------- + {2,2} | {{a,b},{c,d}} + {{2,2},{2,2}} | {{a,b}} + {2,2} | {{a,b},{c,d},{e,f}} + {2,2} | {{a},{c}} + | {{a,b,c},{d,e,f}} + {11,NULL,22} | + {3,4} | {q,w,e} + | +(8 rows) + +update domarrtest set + testint4arr[1] = testint4arr[1] + 1, + testint4arr[3] = testint4arr[3] - 1 +where testchar4arr is null; +select * from domarrtest where testchar4arr is null; + testint4arr | testchar4arr +------------------+-------------- + {12,NULL,21} | + {NULL,NULL,NULL} | +(2 rows) + +drop table domarrtest; +drop domain domainint4arr restrict; +drop domain domainchar4arr restrict; +create domain dia as int[]; +select '{1,2,3}'::dia; + dia +--------- + {1,2,3} +(1 row) + +select array_dims('{1,2,3}'::dia); + array_dims +------------ + [1:3] +(1 row) + +select pg_typeof('{1,2,3}'::dia); + pg_typeof +----------- + dia +(1 row) + +select pg_typeof('{1,2,3}'::dia || 42); -- should be int[] not dia + pg_typeof +----------- + integer[] +(1 row) + +drop domain dia; +-- Test domains over composites +create type comptype as (r float8, i float8); +create domain dcomptype as comptype; +create table dcomptable (d1 dcomptype unique); +insert into dcomptable values (row(1,2)::dcomptype); +insert into dcomptable values (row(3,4)::comptype); +insert into dcomptable values (row(1,2)::dcomptype); -- fail on uniqueness +ERROR: duplicate key value violates unique constraint "dcomptable_d1_key" +DETAIL: Key (d1)=((1,2)) already exists. +insert into dcomptable (d1.r) values(11); +select * from dcomptable; + d1 +------- + (1,2) + (3,4) + (11,) +(3 rows) + +select (d1).r, (d1).i, (d1).* from dcomptable; + r | i | r | i +----+---+----+--- + 1 | 2 | 1 | 2 + 3 | 4 | 3 | 4 + 11 | | 11 | +(3 rows) + +update dcomptable set d1.r = (d1).r + 1 where (d1).i > 0; +select * from dcomptable; + d1 +------- + (11,) + (2,2) + (4,4) +(3 rows) + +alter domain dcomptype add constraint c1 check ((value).r <= (value).i); +alter domain dcomptype add constraint c2 check ((value).r > (value).i); -- fail +ERROR: column "d1" of table "dcomptable" contains values that violate the new constraint +select row(2,1)::dcomptype; -- fail +ERROR: value for domain dcomptype violates check constraint "c1" +insert into dcomptable values (row(1,2)::comptype); +insert into dcomptable values (row(2,1)::comptype); -- fail +ERROR: value for domain dcomptype violates check constraint "c1" +insert into dcomptable (d1.r) values(99); +insert into dcomptable (d1.r, d1.i) values(99, 100); +insert into dcomptable (d1.r, d1.i) values(100, 99); -- fail +ERROR: value for domain dcomptype violates check constraint "c1" +update dcomptable set d1.r = (d1).r + 1 where (d1).i > 0; -- fail +ERROR: value for domain dcomptype violates check constraint "c1" +update dcomptable set d1.r = (d1).r - 1, d1.i = (d1).i + 1 where (d1).i > 0; +select * from dcomptable; + d1 +---------- + (11,) + (99,) + (1,3) + (3,5) + (0,3) + (98,101) +(6 rows) + +explain (verbose, costs off) + update dcomptable set d1.r = (d1).r - 1, d1.i = (d1).i + 1 where (d1).i > 0; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------- + Update on public.dcomptable + -> Seq Scan on public.dcomptable + Output: ROW(((d1).r - '1'::double precision), ((d1).i + '1'::double precision)), ctid, gp_segment_id + Filter: ((dcomptable.d1).i > '0'::double precision) + Optimizer: Postgres query optimizer +(5 rows) + +create rule silly as on delete to dcomptable do instead + update dcomptable set d1.r = (d1).r - 1, d1.i = (d1).i + 1 where (d1).i > 0; +\d+ dcomptable + Table "public.dcomptable" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------+-----------+----------+---------+----------+--------------+------------- + d1 | dcomptype | | | | extended | | +Indexes: + "dcomptable_d1_key" UNIQUE CONSTRAINT, btree (d1) +Rules: + silly AS + ON DELETE TO dcomptable DO INSTEAD UPDATE dcomptable SET d1.r = (dcomptable.d1).r - 1::double precision, d1.i = (dcomptable.d1).i + 1::double precision + WHERE (dcomptable.d1).i > 0::double precision + +create function makedcomp(r float8, i float8) returns dcomptype +as 'select row(r, i)' language sql; +select makedcomp(1,2); + makedcomp +----------- + (1,2) +(1 row) + +select makedcomp(2,1); -- fail +ERROR: value for domain dcomptype violates check constraint "c1" +select * from makedcomp(1,2) m; + r | i +---+--- + 1 | 2 +(1 row) + +select m, m is not null from makedcomp(1,2) m; + m | ?column? +-------+---------- + (1,2) | t +(1 row) + +drop function makedcomp(float8, float8); +drop table dcomptable; +drop type comptype cascade; +NOTICE: drop cascades to type dcomptype +-- check altering and dropping columns used by domain constraints +create type comptype as (r float8, i float8); +create domain dcomptype as comptype; +alter domain dcomptype add constraint c1 check ((value).r > 0); +comment on constraint c1 on domain dcomptype is 'random commentary'; +select row(0,1)::dcomptype; -- fail +ERROR: value for domain dcomptype violates check constraint "c1" +alter type comptype alter attribute r type varchar; -- fail +ERROR: operator does not exist: character varying > double precision +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +alter type comptype alter attribute r type bigint; +alter type comptype drop attribute r; -- fail +ERROR: cannot drop column r of composite type comptype because other objects depend on it +DETAIL: constraint c1 depends on column r of composite type comptype +HINT: Use DROP ... CASCADE to drop the dependent objects too. +alter type comptype drop attribute i; +select conname, obj_description(oid, 'pg_constraint') from pg_constraint + where contypid = 'dcomptype'::regtype; -- check comment is still there + conname | obj_description +---------+------------------- + c1 | random commentary +(1 row) + +drop type comptype cascade; +NOTICE: drop cascades to type dcomptype +-- Test domains over arrays of composite +create type comptype as (r float8, i float8); +create domain dcomptypea as comptype[]; +create table dcomptable (d1 dcomptypea unique); +insert into dcomptable values (array[row(1,2)]::dcomptypea); +insert into dcomptable values (array[row(3,4), row(5,6)]::comptype[]); +insert into dcomptable values (array[row(7,8)::comptype, row(9,10)::comptype]); +insert into dcomptable values (array[row(1,2)]::dcomptypea); -- fail on uniqueness +ERROR: duplicate key value violates unique constraint "dcomptable_d1_key" +DETAIL: Key (d1)=({"(1,2)"}) already exists. +insert into dcomptable (d1[1]) values(row(9,10)); +insert into dcomptable (d1[1].r) values(11); +select * from dcomptable; + d1 +-------------------- + {"(1,2)"} + {"(3,4)","(5,6)"} + {"(7,8)","(9,10)"} + {"(9,10)"} + {"(11,)"} +(5 rows) + +select d1[2], d1[1].r, d1[1].i from dcomptable; + d1 | r | i +--------+----+---- + | 1 | 2 + (5,6) | 3 | 4 + (9,10) | 7 | 8 + | 9 | 10 + | 11 | +(5 rows) + +update dcomptable set d1[2] = row(d1[2].i, d1[2].r); +select * from dcomptable; + d1 +-------------------- + {"(1,2)","(,)"} + {"(3,4)","(6,5)"} + {"(7,8)","(10,9)"} + {"(9,10)","(,)"} + {"(11,)","(,)"} +(5 rows) + +update dcomptable set d1[1].r = d1[1].r + 1 where d1[1].i > 0; +select * from dcomptable; + d1 +-------------------- + {"(11,)","(,)"} + {"(2,2)","(,)"} + {"(4,4)","(6,5)"} + {"(8,8)","(10,9)"} + {"(10,10)","(,)"} +(5 rows) + +alter domain dcomptypea add constraint c1 check (value[1].r <= value[1].i); +alter domain dcomptypea add constraint c2 check (value[1].r > value[1].i); -- fail +ERROR: column "d1" of table "dcomptable" contains values that violate the new constraint +select array[row(2,1)]::dcomptypea; -- fail +ERROR: value for domain dcomptypea violates check constraint "c1" +insert into dcomptable values (array[row(1,2)]::comptype[]); +insert into dcomptable values (array[row(2,1)]::comptype[]); -- fail +ERROR: value for domain dcomptypea violates check constraint "c1" +insert into dcomptable (d1[1].r) values(99); +insert into dcomptable (d1[1].r, d1[1].i) values(99, 100); +insert into dcomptable (d1[1].r, d1[1].i) values(100, 99); -- fail +ERROR: value for domain dcomptypea violates check constraint "c1" +update dcomptable set d1[1].r = d1[1].r + 1 where d1[1].i > 0; -- fail +ERROR: value for domain dcomptypea violates check constraint "c1" +update dcomptable set d1[1].r = d1[1].r - 1, d1[1].i = d1[1].i + 1 + where d1[1].i > 0; +select * from dcomptable; + d1 +-------------------- + {"(11,)","(,)"} + {"(99,)"} + {"(1,3)","(,)"} + {"(3,5)","(6,5)"} + {"(7,9)","(10,9)"} + {"(9,11)","(,)"} + {"(0,3)"} + {"(98,101)"} +(8 rows) + +explain (verbose, costs off) + update dcomptable set d1[1].r = d1[1].r - 1, d1[1].i = d1[1].i + 1 + where d1[1].i > 0; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------- + Update on public.dcomptable + -> Seq Scan on public.dcomptable + Output: (d1[1].r := (d1[1].r - '1'::double precision))[1].i := (d1[1].i + '1'::double precision), ctid, gp_segment_id + Filter: (dcomptable.d1[1].i > '0'::double precision) + Optimizer: Postgres query optimizer +(5 rows) + +create rule silly as on delete to dcomptable do instead + update dcomptable set d1[1].r = d1[1].r - 1, d1[1].i = d1[1].i + 1 + where d1[1].i > 0; +\d+ dcomptable + Table "public.dcomptable" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------------+-----------+----------+---------+----------+--------------+------------- + d1 | dcomptypea | | | | extended | | +Indexes: + "dcomptable_d1_key" UNIQUE CONSTRAINT, btree (d1) +Rules: + silly AS + ON DELETE TO dcomptable DO INSTEAD UPDATE dcomptable SET d1[1].r = dcomptable.d1[1].r - 1::double precision, d1[1].i = dcomptable.d1[1].i + 1::double precision + WHERE dcomptable.d1[1].i > 0::double precision + +drop table dcomptable; +drop type comptype cascade; +NOTICE: drop cascades to type dcomptypea +-- Test arrays over domains +create domain posint as int check (value > 0); +create table pitable (f1 posint[]); +insert into pitable values(array[42]); +insert into pitable values(array[-1]); -- fail +ERROR: value for domain posint violates check constraint "posint_check" +insert into pitable values('{0}'); -- fail +ERROR: value for domain posint violates check constraint "posint_check" +LINE 1: insert into pitable values('{0}'); + ^ +update pitable set f1[1] = f1[1] + 1; +update pitable set f1[1] = 0; -- fail +ERROR: value for domain posint violates check constraint "posint_check" +select * from pitable; + f1 +------ + {43} +(1 row) + +drop table pitable; +create domain vc4 as varchar(4); +create table vc4table (f1 vc4[]); +insert into vc4table values(array['too long']); -- fail +ERROR: value too long for type character varying(4) +insert into vc4table values(array['too long']::vc4[]); -- cast truncates +select * from vc4table; + f1 +---------- + {"too "} +(1 row) + +drop table vc4table; +drop type vc4; +-- You can sort of fake arrays-of-arrays by putting a domain in between +create domain dposinta as posint[]; +create table dposintatable (f1 dposinta[]); +insert into dposintatable values(array[array[42]]); -- fail +ERROR: column "f1" is of type dposinta[] but expression is of type integer[] +LINE 1: insert into dposintatable values(array[array[42]]); + ^ +HINT: You will need to rewrite or cast the expression. +insert into dposintatable values(array[array[42]::posint[]]); -- still fail +ERROR: column "f1" is of type dposinta[] but expression is of type posint[] +LINE 1: insert into dposintatable values(array[array[42]::posint[]])... + ^ +HINT: You will need to rewrite or cast the expression. +insert into dposintatable values(array[array[42]::dposinta]); -- but this works +select f1, f1[1], (f1[1])[1] from dposintatable; + f1 | f1 | f1 +----------+------+---- + {"{42}"} | {42} | 42 +(1 row) + +select pg_typeof(f1) from dposintatable; + pg_typeof +------------ + dposinta[] +(1 row) + +select pg_typeof(f1[1]) from dposintatable; + pg_typeof +----------- + dposinta +(1 row) + +select pg_typeof(f1[1][1]) from dposintatable; + pg_typeof +----------- + dposinta +(1 row) + +select pg_typeof((f1[1])[1]) from dposintatable; + pg_typeof +----------- + posint +(1 row) + +update dposintatable set f1[2] = array[99]; +select f1, f1[1], (f1[2])[1] from dposintatable; + f1 | f1 | f1 +-----------------+------+---- + {"{42}","{99}"} | {42} | 99 +(1 row) + +-- it'd be nice if you could do something like this, but for now you can't: +update dposintatable set f1[2][1] = array[97]; +ERROR: wrong number of array subscripts +-- maybe someday we can make this syntax work: +update dposintatable set (f1[2])[1] = array[98]; +ERROR: syntax error at or near "[" +LINE 1: update dposintatable set (f1[2])[1] = array[98]; + ^ +drop table dposintatable; +drop domain posint cascade; +NOTICE: drop cascades to type dposinta +-- Test arrays over domains of composite +create type comptype as (cf1 int, cf2 int); +create domain dcomptype as comptype check ((value).cf1 > 0); +create table dcomptable (f1 dcomptype[]); +insert into dcomptable values (null); +update dcomptable set f1[1].cf2 = 5; +table dcomptable; + f1 +---------- + {"(,5)"} +(1 row) + +update dcomptable set f1[1].cf1 = -1; -- fail +ERROR: value for domain dcomptype violates check constraint "dcomptype_check" +update dcomptable set f1[1].cf1 = 1; +table dcomptable; + f1 +----------- + {"(1,5)"} +(1 row) + +-- if there's no constraints, a different code path is taken: +alter domain dcomptype drop constraint dcomptype_check; +update dcomptable set f1[1].cf1 = -1; -- now ok +table dcomptable; + f1 +------------ + {"(-1,5)"} +(1 row) + +drop table dcomptable; +drop type comptype cascade; +NOTICE: drop cascades to type dcomptype +-- Test not-null restrictions +create domain dnotnull varchar(15) NOT NULL; +create domain dnull varchar(15); +create domain dcheck varchar(15) NOT NULL CHECK (VALUE = 'a' OR VALUE = 'c' OR VALUE = 'd'); +create table nulltest + ( col1 dnotnull + , col2 dnotnull NULL -- NOT NULL in the domain cannot be overridden + , col3 dnull NOT NULL + , col4 dnull + , col5 dcheck CHECK (col5 IN ('c', 'd')) + ); +INSERT INTO nulltest DEFAULT VALUES; +ERROR: domain dnotnull does not allow null values +INSERT INTO nulltest values ('a', 'b', 'c', 'd', 'c'); -- Good +insert into nulltest values ('a', 'b', 'c', 'd', NULL); +ERROR: domain dcheck does not allow null values +insert into nulltest values ('a', 'b', 'c', 'd', 'a'); +ERROR: new row for relation "nulltest" violates check constraint "nulltest_col5_check" +DETAIL: Failing row contains (a, b, c, d, a). +INSERT INTO nulltest values (NULL, 'b', 'c', 'd', 'd'); +ERROR: domain dnotnull does not allow null values +INSERT INTO nulltest values ('a', NULL, 'c', 'd', 'c'); +ERROR: domain dnotnull does not allow null values +INSERT INTO nulltest values ('a', 'b', NULL, 'd', 'c'); +ERROR: null value in column "col3" of relation "nulltest" violates not-null constraint +DETAIL: Failing row contains (a, b, null, d, c). +INSERT INTO nulltest values ('a', 'b', 'c', NULL, 'd'); -- Good +-- Test copy +COPY nulltest FROM stdin; --fail +ERROR: null value in column "col3" of relation "nulltest" violates not-null constraint +DETAIL: Failing row contains (a, b, null, d, d). +CONTEXT: COPY nulltest, line 1: "a b \N d d" +COPY nulltest FROM stdin; --fail +ERROR: domain dcheck does not allow null values +CONTEXT: COPY nulltest, line 1, column col5: null input +-- Last row is bad +COPY nulltest FROM stdin; +ERROR: new row for relation "nulltest" violates check constraint "nulltest_col5_check" +DETAIL: Failing row contains (a, b, c, null, a). +CONTEXT: COPY nulltest, line 3: "a b c \N a" +select * from nulltest; + col1 | col2 | col3 | col4 | col5 +------+------+------+------+------ + a | b | c | d | c + a | b | c | | d +(2 rows) + +-- Test out coerced (casted) constraints +SELECT cast('1' as dnotnull); + dnotnull +---------- + 1 +(1 row) + +SELECT cast(NULL as dnotnull); -- fail +ERROR: domain dnotnull does not allow null values +SELECT cast(cast(NULL as dnull) as dnotnull); -- fail +ERROR: domain dnotnull does not allow null values +SELECT cast(col4 as dnotnull) from nulltest; -- fail +ERROR: domain dnotnull does not allow null values +-- cleanup +drop table nulltest; +drop domain dnotnull restrict; +drop domain dnull restrict; +drop domain dcheck restrict; +create domain ddef1 int4 DEFAULT 3; +create domain ddef2 oid DEFAULT '12'; +-- Type mixing, function returns int8 +create domain ddef3 text DEFAULT 5; +create sequence ddef4_seq; +create domain ddef4 int4 DEFAULT nextval('ddef4_seq'); +create domain ddef5 numeric(8,2) NOT NULL DEFAULT '12.12'; +create table defaulttest + ( col1 ddef1 + , col2 ddef2 + , col3 ddef3 + , col4 ddef4 PRIMARY KEY + , col5 ddef1 NOT NULL DEFAULT NULL + , col6 ddef2 DEFAULT '88' + , col7 ddef4 DEFAULT 8000 + , col8 ddef5 + ); +insert into defaulttest(col4) values(0); -- fails, col5 defaults to null +ERROR: null value in column "col5" of relation "defaulttest" violates not-null constraint +DETAIL: Failing row contains (3, 12, 5, 0, null, 88, 8000, 12.12). +alter table defaulttest alter column col5 drop default; +insert into defaulttest default values; -- succeeds, inserts domain default +-- We used to treat SET DEFAULT NULL as equivalent to DROP DEFAULT; wrong +alter table defaulttest alter column col5 set default null; +insert into defaulttest(col4) values(0); -- fails +ERROR: null value in column "col5" of relation "defaulttest" violates not-null constraint +DETAIL: Failing row contains (3, 12, 5, 0, null, 88, 8000, 12.12). +alter table defaulttest alter column col5 drop default; +insert into defaulttest default values; +insert into defaulttest default values; +-- Test defaults with copy +COPY defaulttest(col5) FROM stdin; +select * from defaulttest; + col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 +------+------+------+------+------+------+------+------- + 3 | 12 | 5 | 1 | 3 | 88 | 8000 | 12.12 + 3 | 12 | 5 | 2 | 3 | 88 | 8000 | 12.12 + 3 | 12 | 5 | 3 | 3 | 88 | 8000 | 12.12 + 3 | 12 | 5 | 4 | 42 | 88 | 8000 | 12.12 +(4 rows) + +drop table defaulttest cascade; +-- Test ALTER DOMAIN .. NOT NULL +create domain dnotnulltest integer; +create table domnotnull +( col1 dnotnulltest +, col2 dnotnulltest +); +insert into domnotnull default values; +alter domain dnotnulltest set not null; -- fails +ERROR: column "col1" of table "domnotnull" contains null values +update domnotnull set col1 = 5; +alter domain dnotnulltest set not null; -- fails +ERROR: column "col2" of table "domnotnull" contains null values +update domnotnull set col2 = 6; +alter domain dnotnulltest set not null; +update domnotnull set col1 = null; -- fails +ERROR: domain dnotnulltest does not allow null values +alter domain dnotnulltest drop not null; +update domnotnull set col1 = null; +drop domain dnotnulltest cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to column col2 of table domnotnull +drop cascades to column col1 of table domnotnull +-- Test ALTER DOMAIN .. DEFAULT .. +create table domdeftest (col1 ddef1); +insert into domdeftest default values; +select * from domdeftest; + col1 +------ + 3 +(1 row) + +alter domain ddef1 set default '42'; +insert into domdeftest default values; +select * from domdeftest; + col1 +------ + 3 + 42 +(2 rows) + +alter domain ddef1 drop default; +insert into domdeftest default values; +select * from domdeftest; + col1 +------ + 3 + 42 + +(3 rows) + +drop table domdeftest; +-- Test ALTER DOMAIN .. CONSTRAINT .. +create domain con as integer; +create table domcontest (col1 con); +insert into domcontest values (1); +insert into domcontest values (2); +alter domain con add constraint t check (VALUE < 1); -- fails +ERROR: column "col1" of table "domcontest" contains values that violate the new constraint +alter domain con add constraint t check (VALUE < 34); +alter domain con add check (VALUE > 0); +insert into domcontest values (-5); -- fails +ERROR: value for domain con violates check constraint "con_check" +insert into domcontest values (42); -- fails +ERROR: value for domain con violates check constraint "t" +insert into domcontest values (5); +alter domain con drop constraint t; +insert into domcontest values (-5); --fails +ERROR: value for domain con violates check constraint "con_check" +insert into domcontest values (42); +alter domain con drop constraint nonexistent; +ERROR: constraint "nonexistent" of domain "con" does not exist +alter domain con drop constraint if exists nonexistent; +NOTICE: constraint "nonexistent" of domain "con" does not exist, skipping +-- Test ALTER DOMAIN .. CONSTRAINT .. NOT VALID +create domain things AS INT; +CREATE TABLE thethings (stuff things); +INSERT INTO thethings (stuff) VALUES (55); +ALTER DOMAIN things ADD CONSTRAINT meow CHECK (VALUE < 11); +ERROR: column "stuff" of table "thethings" contains values that violate the new constraint +ALTER DOMAIN things ADD CONSTRAINT meow CHECK (VALUE < 11) NOT VALID; +ALTER DOMAIN things VALIDATE CONSTRAINT meow; +ERROR: column "stuff" of table "thethings" contains values that violate the new constraint +UPDATE thethings SET stuff = 10; +ALTER DOMAIN things VALIDATE CONSTRAINT meow; +-- Confirm ALTER DOMAIN with RULES. +create table domtab (col1 integer); +create domain dom as integer; +create view domview as select cast(col1 as dom) from domtab; +insert into domtab (col1) values (null); +insert into domtab (col1) values (5); +select * from domview; + col1 +------ + + 5 +(2 rows) + +alter domain dom set not null; +select * from domview; -- fail +ERROR: domain dom does not allow null values +alter domain dom drop not null; +select * from domview; + col1 +------ + + 5 +(2 rows) + +alter domain dom add constraint domchkgt6 check(value > 6); +select * from domview; --fail +ERROR: value for domain dom violates check constraint "domchkgt6" +alter domain dom drop constraint domchkgt6 restrict; +select * from domview; + col1 +------ + + 5 +(2 rows) + +-- cleanup +drop domain ddef1 restrict; +drop domain ddef2 restrict; +drop domain ddef3 restrict; +drop domain ddef4 restrict; +drop domain ddef5 restrict; +drop sequence ddef4_seq; +-- Test domains over domains +create domain vchar4 varchar(4); +create domain dinter vchar4 check (substring(VALUE, 1, 1) = 'x'); +create domain dtop dinter check (substring(VALUE, 2, 1) = '1'); +select 'x123'::dtop; + dtop +------ + x123 +(1 row) + +select 'x1234'::dtop; -- explicit coercion should truncate + dtop +------ + x123 +(1 row) + +select 'y1234'::dtop; -- fail +ERROR: value for domain dtop violates check constraint "dinter_check" +select 'y123'::dtop; -- fail +ERROR: value for domain dtop violates check constraint "dinter_check" +select 'yz23'::dtop; -- fail +ERROR: value for domain dtop violates check constraint "dinter_check" +select 'xz23'::dtop; -- fail +ERROR: value for domain dtop violates check constraint "dtop_check" +create temp table dtest(f1 dtop); +insert into dtest values('x123'); +insert into dtest values('x1234'); -- fail, implicit coercion +ERROR: value too long for type character varying(4) +insert into dtest values('y1234'); -- fail, implicit coercion +ERROR: value too long for type character varying(4) +insert into dtest values('y123'); -- fail +ERROR: value for domain dtop violates check constraint "dinter_check" +insert into dtest values('yz23'); -- fail +ERROR: value for domain dtop violates check constraint "dinter_check" +insert into dtest values('xz23'); -- fail +ERROR: value for domain dtop violates check constraint "dtop_check" +drop table dtest; +drop domain vchar4 cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to type dinter +drop cascades to type dtop +-- Make sure that constraints of newly-added domain columns are +-- enforced correctly, even if there's no default value for the new +-- column. Per bug #1433 +create domain str_domain as text not null; +create table domain_test (a int, b int); +insert into domain_test values (1, 2); +insert into domain_test values (1, 2); +-- should fail +alter table domain_test add column c str_domain; +ERROR: domain str_domain does not allow null values +create domain str_domain2 as text check (value <> 'foo') default 'foo'; +-- should fail +alter table domain_test add column d str_domain2; +ERROR: value for domain str_domain2 violates check constraint "str_domain2_check" +-- Check that domain constraints on prepared statement parameters of +-- unknown type are enforced correctly. +create domain pos_int as int4 check (value > 0) not null; +prepare s1 as select $1::pos_int = 10 as "is_ten"; +execute s1(10); + is_ten +-------- + t +(1 row) + +execute s1(0); -- should fail +ERROR: value for domain pos_int violates check constraint "pos_int_check" +execute s1(NULL); -- should fail +ERROR: domain pos_int does not allow null values +-- Check that domain constraints on plpgsql function parameters, results, +-- and local variables are enforced correctly. +create function doubledecrement(p1 pos_int) returns pos_int as $$ +declare v pos_int; +begin + return p1; +end$$ language plpgsql; +select doubledecrement(3); -- fail because of implicit null assignment +ERROR: domain pos_int does not allow null values +CONTEXT: PL/pgSQL function doubledecrement(pos_int) line 3 during statement block local variable initialization +create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ +declare v pos_int := 0; +begin + return p1; +end$$ language plpgsql; +select doubledecrement(3); -- fail at initialization assignment +ERROR: value for domain pos_int violates check constraint "pos_int_check" +CONTEXT: PL/pgSQL function doubledecrement(pos_int) line 3 during statement block local variable initialization +create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ +declare v pos_int := 1; +begin + v := p1 - 1; + return v - 1; +end$$ language plpgsql; +select doubledecrement(null); -- fail before call +ERROR: domain pos_int does not allow null values +select doubledecrement(0); -- fail before call +ERROR: value for domain pos_int violates check constraint "pos_int_check" +select doubledecrement(1); -- fail at assignment to v +ERROR: value for domain pos_int violates check constraint "pos_int_check" +CONTEXT: PL/pgSQL function doubledecrement(pos_int) line 4 at assignment +select doubledecrement(2); -- fail at return +ERROR: value for domain pos_int violates check constraint "pos_int_check" +CONTEXT: PL/pgSQL function doubledecrement(pos_int) while casting return value to function's return type +select doubledecrement(3); -- good + doubledecrement +----------------- + 1 +(1 row) + +-- Check that ALTER DOMAIN tests columns of derived types +create domain posint as int4; +-- Currently, this doesn't work for composite types, but verify it complains +create type ddtest1 as (f1 posint); +create table ddtest2(f1 ddtest1); +insert into ddtest2 values(row(-1)); +alter domain posint add constraint c1 check(value >= 0); +ERROR: cannot alter type "posint" because column "ddtest2.f1" uses it +drop table ddtest2; +-- Likewise for domains within arrays of composite +create table ddtest2(f1 ddtest1[]); +insert into ddtest2 values('{(-1)}'); +alter domain posint add constraint c1 check(value >= 0); +ERROR: cannot alter type "posint" because column "ddtest2.f1" uses it +drop table ddtest2; +-- Likewise for domains within domains over composite +create domain ddtest1d as ddtest1; +create table ddtest2(f1 ddtest1d); +insert into ddtest2 values('(-1)'); +alter domain posint add constraint c1 check(value >= 0); +ERROR: cannot alter type "posint" because column "ddtest2.f1" uses it +drop table ddtest2; +drop domain ddtest1d; +-- Likewise for domains within domains over array of composite +create domain ddtest1d as ddtest1[]; +create table ddtest2(f1 ddtest1d); +insert into ddtest2 values('{(-1)}'); +alter domain posint add constraint c1 check(value >= 0); +ERROR: cannot alter type "posint" because column "ddtest2.f1" uses it +drop table ddtest2; +drop domain ddtest1d; +-- Doesn't work for ranges, either +create type rposint as range (subtype = posint); +create table ddtest2(f1 rposint); +insert into ddtest2 values('(-1,3]'); +alter domain posint add constraint c1 check(value >= 0); +ERROR: cannot alter type "posint" because column "ddtest2.f1" uses it +drop table ddtest2; +drop type rposint; +alter domain posint add constraint c1 check(value >= 0); +create domain posint2 as posint check (value % 2 = 0); +create table ddtest2(f1 posint2); +insert into ddtest2 values(11); -- fail +ERROR: value for domain posint2 violates check constraint "posint2_check" +insert into ddtest2 values(-2); -- fail +ERROR: value for domain posint2 violates check constraint "c1" +insert into ddtest2 values(2); +alter domain posint add constraint c2 check(value >= 10); -- fail +ERROR: column "f1" of table "ddtest2" contains values that violate the new constraint +alter domain posint add constraint c2 check(value > 0); -- OK +drop table ddtest2; +drop type ddtest1; +drop domain posint cascade; +NOTICE: drop cascades to type posint2 +-- +-- Check enforcement of domain-related typmod in plpgsql (bug #5717) +-- +create or replace function array_elem_check(numeric) returns numeric as $$ +declare + x numeric(4,2)[1]; +begin + x[1] := $1; + return x[1]; +end$$ language plpgsql; +select array_elem_check(121.00); +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. +CONTEXT: PL/pgSQL function array_elem_check(numeric) line 5 at assignment +select array_elem_check(1.23456); + array_elem_check +------------------ + 1.23 +(1 row) + +create domain mynums as numeric(4,2)[1]; +create or replace function array_elem_check(numeric) returns numeric as $$ +declare + x mynums; +begin + x[1] := $1; + return x[1]; +end$$ language plpgsql; +select array_elem_check(121.00); +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. +CONTEXT: PL/pgSQL function array_elem_check(numeric) line 5 at assignment +select array_elem_check(1.23456); + array_elem_check +------------------ + 1.23 +(1 row) + +create domain mynums2 as mynums; +create or replace function array_elem_check(numeric) returns numeric as $$ +declare + x mynums2; +begin + x[1] := $1; + return x[1]; +end$$ language plpgsql; +select array_elem_check(121.00); +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. +CONTEXT: PL/pgSQL function array_elem_check(numeric) line 5 at assignment +select array_elem_check(1.23456); + array_elem_check +------------------ + 1.23 +(1 row) + +drop function array_elem_check(numeric); +-- +-- Check enforcement of array-level domain constraints +-- +create domain orderedpair as int[2] check (value[1] < value[2]); +select array[1,2]::orderedpair; + array +------- + {1,2} +(1 row) + +select array[2,1]::orderedpair; -- fail +ERROR: value for domain orderedpair violates check constraint "orderedpair_check" +create temp table op (f1 orderedpair); +insert into op values (array[1,2]); +insert into op values (array[2,1]); -- fail +ERROR: value for domain orderedpair violates check constraint "orderedpair_check" +update op set f1[2] = 3; +update op set f1[2] = 0; -- fail +ERROR: value for domain orderedpair violates check constraint "orderedpair_check" +select * from op; + f1 +------- + {1,3} +(1 row) + +create or replace function array_elem_check(int) returns int as $$ +declare + x orderedpair := '{1,2}'; +begin + x[2] := $1; + return x[2]; +end$$ language plpgsql; +select array_elem_check(3); + array_elem_check +------------------ + 3 +(1 row) + +select array_elem_check(-1); +ERROR: value for domain orderedpair violates check constraint "orderedpair_check" +CONTEXT: PL/pgSQL function array_elem_check(integer) line 5 at assignment +drop function array_elem_check(int); +-- +-- Check enforcement of changing constraints in plpgsql +-- +create domain di as int; +create function dom_check(int) returns di as $$ +declare d di; +begin + d := $1::di; + return d; +end +$$ language plpgsql immutable; +select dom_check(0); + dom_check +----------- + 0 +(1 row) + +alter domain di add constraint pos check (value > 0); +select dom_check(0); -- fail +ERROR: value for domain di violates check constraint "pos" +CONTEXT: PL/pgSQL function dom_check(integer) line 4 at assignment +alter domain di drop constraint pos; +select dom_check(0); + dom_check +----------- + 0 +(1 row) + +-- implicit cast during assignment is a separate code path, test that too +create or replace function dom_check(int) returns di as $$ +declare d di; +begin + d := $1; + return d; +end +$$ language plpgsql immutable; +select dom_check(0); + dom_check +----------- + 0 +(1 row) + +alter domain di add constraint pos check (value > 0); +select dom_check(0); -- fail +ERROR: value for domain di violates check constraint "pos" +CONTEXT: PL/pgSQL function dom_check(integer) line 4 at assignment +alter domain di drop constraint pos; +select dom_check(0); + dom_check +----------- + 0 +(1 row) + +drop function dom_check(int); +drop domain di; +-- +-- Check use of a (non-inline-able) SQL function in a domain constraint; +-- this has caused issues in the past +-- +create function sql_is_distinct_from(anyelement, anyelement) +returns boolean language sql +as 'select $1 is distinct from $2 limit 1'; +create domain inotnull int + check (sql_is_distinct_from(value, null)); +select 1::inotnull; + inotnull +---------- + 1 +(1 row) + +select null::inotnull; +ERROR: value for domain inotnull violates check constraint "inotnull_check" +create table dom_table (x inotnull); +insert into dom_table values ('1'); +insert into dom_table values (1); +insert into dom_table values (null); +ERROR: value for domain inotnull violates check constraint "inotnull_check" +drop table dom_table; +drop domain inotnull; +drop function sql_is_distinct_from(anyelement, anyelement); +-- +-- Renaming +-- +create domain testdomain1 as int; +alter domain testdomain1 rename to testdomain2; +alter type testdomain2 rename to testdomain3; -- alter type also works +drop domain testdomain3; +-- +-- Renaming domain constraints +-- +create domain testdomain1 as int constraint unsigned check (value > 0); +alter domain testdomain1 rename constraint unsigned to unsigned_foo; +alter domain testdomain1 drop constraint unsigned_foo; +drop domain testdomain1; diff --git a/src/test/singlenode_regress/expected/drop_if_exists.out b/src/test/singlenode_regress/expected/drop_if_exists.out new file mode 100644 index 00000000000..5e44c2c3cea --- /dev/null +++ b/src/test/singlenode_regress/expected/drop_if_exists.out @@ -0,0 +1,342 @@ +-- +-- IF EXISTS tests +-- +-- table (will be really dropped at the end) +DROP TABLE test_exists; +ERROR: table "test_exists" does not exist +DROP TABLE IF EXISTS test_exists; +NOTICE: table "test_exists" does not exist, skipping +CREATE TABLE test_exists (a int, b text); +-- view +DROP VIEW test_view_exists; +ERROR: view "test_view_exists" does not exist +DROP VIEW IF EXISTS test_view_exists; +NOTICE: view "test_view_exists" does not exist, skipping +CREATE VIEW test_view_exists AS select * from test_exists; +DROP VIEW IF EXISTS test_view_exists; +DROP VIEW test_view_exists; +ERROR: view "test_view_exists" does not exist +-- index +DROP INDEX test_index_exists; +ERROR: index "test_index_exists" does not exist +DROP INDEX IF EXISTS test_index_exists; +NOTICE: index "test_index_exists" does not exist, skipping +CREATE INDEX test_index_exists on test_exists(a); +DROP INDEX IF EXISTS test_index_exists; +DROP INDEX test_index_exists; +ERROR: index "test_index_exists" does not exist +-- sequence +DROP SEQUENCE test_sequence_exists; +ERROR: sequence "test_sequence_exists" does not exist +DROP SEQUENCE IF EXISTS test_sequence_exists; +NOTICE: sequence "test_sequence_exists" does not exist, skipping +CREATE SEQUENCE test_sequence_exists; +DROP SEQUENCE IF EXISTS test_sequence_exists; +DROP SEQUENCE test_sequence_exists; +ERROR: sequence "test_sequence_exists" does not exist +-- schema +DROP SCHEMA test_schema_exists; +ERROR: schema "test_schema_exists" does not exist +DROP SCHEMA IF EXISTS test_schema_exists; +NOTICE: schema "test_schema_exists" does not exist, skipping +CREATE SCHEMA test_schema_exists; +DROP SCHEMA IF EXISTS test_schema_exists; +DROP SCHEMA test_schema_exists; +ERROR: schema "test_schema_exists" does not exist +-- type +DROP TYPE test_type_exists; +ERROR: type "test_type_exists" does not exist +DROP TYPE IF EXISTS test_type_exists; +NOTICE: type "test_type_exists" does not exist, skipping +CREATE type test_type_exists as (a int, b text); +DROP TYPE IF EXISTS test_type_exists; +DROP TYPE test_type_exists; +ERROR: type "test_type_exists" does not exist +-- domain +DROP DOMAIN test_domain_exists; +ERROR: type "test_domain_exists" does not exist +DROP DOMAIN IF EXISTS test_domain_exists; +NOTICE: type "test_domain_exists" does not exist, skipping +CREATE domain test_domain_exists as int not null check (value > 0); +DROP DOMAIN IF EXISTS test_domain_exists; +DROP DOMAIN test_domain_exists; +ERROR: type "test_domain_exists" does not exist +--- +--- role/user/group +--- +CREATE USER regress_test_u1; +CREATE ROLE regress_test_r1; +CREATE GROUP regress_test_g1; +DROP USER regress_test_u2; +ERROR: role "regress_test_u2" does not exist +DROP USER IF EXISTS regress_test_u1, regress_test_u2; +NOTICE: role "regress_test_u2" does not exist, skipping +DROP USER regress_test_u1; +ERROR: role "regress_test_u1" does not exist +DROP ROLE regress_test_r2; +ERROR: role "regress_test_r2" does not exist +DROP ROLE IF EXISTS regress_test_r1, regress_test_r2; +NOTICE: role "regress_test_r2" does not exist, skipping +DROP ROLE regress_test_r1; +ERROR: role "regress_test_r1" does not exist +DROP GROUP regress_test_g2; +ERROR: role "regress_test_g2" does not exist +DROP GROUP IF EXISTS regress_test_g1, regress_test_g2; +NOTICE: role "regress_test_g2" does not exist, skipping +DROP GROUP regress_test_g1; +ERROR: role "regress_test_g1" does not exist +-- collation +DROP COLLATION IF EXISTS test_collation_exists; +NOTICE: collation "test_collation_exists" does not exist, skipping +-- conversion +DROP CONVERSION test_conversion_exists; +ERROR: conversion "test_conversion_exists" does not exist +DROP CONVERSION IF EXISTS test_conversion_exists; +NOTICE: conversion "test_conversion_exists" does not exist, skipping +CREATE CONVERSION test_conversion_exists + FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +DROP CONVERSION test_conversion_exists; +-- text search parser +DROP TEXT SEARCH PARSER test_tsparser_exists; +ERROR: text search parser "test_tsparser_exists" does not exist +DROP TEXT SEARCH PARSER IF EXISTS test_tsparser_exists; +NOTICE: text search parser "test_tsparser_exists" does not exist, skipping +-- text search dictionary +DROP TEXT SEARCH DICTIONARY test_tsdict_exists; +ERROR: text search dictionary "test_tsdict_exists" does not exist +DROP TEXT SEARCH DICTIONARY IF EXISTS test_tsdict_exists; +NOTICE: text search dictionary "test_tsdict_exists" does not exist, skipping +CREATE TEXT SEARCH DICTIONARY test_tsdict_exists ( + Template=ispell, + DictFile=ispell_sample, + AffFile=ispell_sample +); +DROP TEXT SEARCH DICTIONARY test_tsdict_exists; +-- test search template +DROP TEXT SEARCH TEMPLATE test_tstemplate_exists; +ERROR: text search template "test_tstemplate_exists" does not exist +DROP TEXT SEARCH TEMPLATE IF EXISTS test_tstemplate_exists; +NOTICE: text search template "test_tstemplate_exists" does not exist, skipping +-- text search configuration +DROP TEXT SEARCH CONFIGURATION test_tsconfig_exists; +ERROR: text search configuration "test_tsconfig_exists" does not exist +DROP TEXT SEARCH CONFIGURATION IF EXISTS test_tsconfig_exists; +NOTICE: text search configuration "test_tsconfig_exists" does not exist, skipping +CREATE TEXT SEARCH CONFIGURATION test_tsconfig_exists (COPY=english); +DROP TEXT SEARCH CONFIGURATION test_tsconfig_exists; +-- extension +DROP EXTENSION test_extension_exists; +ERROR: extension "test_extension_exists" does not exist +DROP EXTENSION IF EXISTS test_extension_exists; +NOTICE: extension "test_extension_exists" does not exist, skipping +-- functions +DROP FUNCTION test_function_exists(); +ERROR: function test_function_exists() does not exist +DROP FUNCTION IF EXISTS test_function_exists(); +NOTICE: function test_function_exists() does not exist, skipping +DROP FUNCTION test_function_exists(int, text, int[]); +ERROR: function test_function_exists(integer, text, integer[]) does not exist +DROP FUNCTION IF EXISTS test_function_exists(int, text, int[]); +NOTICE: function test_function_exists(pg_catalog.int4,text,pg_catalog.int4[]) does not exist, skipping +-- aggregate +DROP AGGREGATE test_aggregate_exists(*); +ERROR: aggregate test_aggregate_exists(*) does not exist +DROP AGGREGATE IF EXISTS test_aggregate_exists(*); +NOTICE: aggregate test_aggregate_exists() does not exist, skipping +DROP AGGREGATE test_aggregate_exists(int); +ERROR: aggregate test_aggregate_exists(integer) does not exist +DROP AGGREGATE IF EXISTS test_aggregate_exists(int); +NOTICE: aggregate test_aggregate_exists(pg_catalog.int4) does not exist, skipping +-- operator +DROP OPERATOR @#@ (int, int); +ERROR: operator does not exist: integer @#@ integer +DROP OPERATOR IF EXISTS @#@ (int, int); +NOTICE: operator @#@ does not exist, skipping +CREATE OPERATOR @#@ + (leftarg = int8, rightarg = int8, procedure = int8xor); +DROP OPERATOR @#@ (int8, int8); +-- language +DROP LANGUAGE test_language_exists; +ERROR: language "test_language_exists" does not exist +DROP LANGUAGE IF EXISTS test_language_exists; +NOTICE: language "test_language_exists" does not exist, skipping +-- cast +DROP CAST (text AS text); +ERROR: cast from type text to type text does not exist +DROP CAST IF EXISTS (text AS text); +NOTICE: cast from type text to type text does not exist, skipping +-- trigger +DROP TRIGGER test_trigger_exists ON test_exists; +ERROR: trigger "test_trigger_exists" for table "test_exists" does not exist +DROP TRIGGER IF EXISTS test_trigger_exists ON test_exists; +NOTICE: trigger "test_trigger_exists" for relation "test_exists" does not exist, skipping +DROP TRIGGER test_trigger_exists ON no_such_table; +ERROR: relation "no_such_table" does not exist +DROP TRIGGER IF EXISTS test_trigger_exists ON no_such_table; +NOTICE: relation "no_such_table" does not exist, skipping +DROP TRIGGER test_trigger_exists ON no_such_schema.no_such_table; +ERROR: schema "no_such_schema" does not exist +DROP TRIGGER IF EXISTS test_trigger_exists ON no_such_schema.no_such_table; +NOTICE: schema "no_such_schema" does not exist, skipping +CREATE TRIGGER test_trigger_exists + BEFORE UPDATE ON test_exists + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); +DROP TRIGGER test_trigger_exists ON test_exists; +-- rule +DROP RULE test_rule_exists ON test_exists; +ERROR: rule "test_rule_exists" for relation "test_exists" does not exist +DROP RULE IF EXISTS test_rule_exists ON test_exists; +NOTICE: rule "test_rule_exists" for relation "test_exists" does not exist, skipping +DROP RULE test_rule_exists ON no_such_table; +ERROR: relation "no_such_table" does not exist +DROP RULE IF EXISTS test_rule_exists ON no_such_table; +NOTICE: relation "no_such_table" does not exist, skipping +DROP RULE test_rule_exists ON no_such_schema.no_such_table; +ERROR: schema "no_such_schema" does not exist +DROP RULE IF EXISTS test_rule_exists ON no_such_schema.no_such_table; +NOTICE: schema "no_such_schema" does not exist, skipping +CREATE RULE test_rule_exists AS ON INSERT TO test_exists + DO INSTEAD + INSERT INTO test_exists VALUES (NEW.a, NEW.b || NEW.a::text); +DROP RULE test_rule_exists ON test_exists; +-- foreign data wrapper +DROP FOREIGN DATA WRAPPER test_fdw_exists; +ERROR: foreign-data wrapper "test_fdw_exists" does not exist +DROP FOREIGN DATA WRAPPER IF EXISTS test_fdw_exists; +NOTICE: foreign-data wrapper "test_fdw_exists" does not exist, skipping +-- foreign server +DROP SERVER test_server_exists; +ERROR: server "test_server_exists" does not exist +DROP SERVER IF EXISTS test_server_exists; +NOTICE: server "test_server_exists" does not exist, skipping +-- operator class +DROP OPERATOR CLASS test_operator_class USING btree; +ERROR: operator class "test_operator_class" does not exist for access method "btree" +DROP OPERATOR CLASS IF EXISTS test_operator_class USING btree; +NOTICE: operator class "test_operator_class" does not exist for access method "btree", skipping +DROP OPERATOR CLASS test_operator_class USING no_such_am; +ERROR: access method "no_such_am" does not exist +DROP OPERATOR CLASS IF EXISTS test_operator_class USING no_such_am; +ERROR: access method "no_such_am" does not exist +-- operator family +DROP OPERATOR FAMILY test_operator_family USING btree; +ERROR: operator family "test_operator_family" does not exist for access method "btree" +DROP OPERATOR FAMILY IF EXISTS test_operator_family USING btree; +NOTICE: operator family "test_operator_family" does not exist for access method "btree", skipping +DROP OPERATOR FAMILY test_operator_family USING no_such_am; +ERROR: access method "no_such_am" does not exist +DROP OPERATOR FAMILY IF EXISTS test_operator_family USING no_such_am; +ERROR: access method "no_such_am" does not exist +-- access method +DROP ACCESS METHOD no_such_am; +ERROR: access method "no_such_am" does not exist +DROP ACCESS METHOD IF EXISTS no_such_am; +NOTICE: access method "no_such_am" does not exist, skipping +-- drop the table +DROP TABLE IF EXISTS test_exists; +DROP TABLE test_exists; +ERROR: table "test_exists" does not exist +-- be tolerant with missing schemas, types, etc +DROP AGGREGATE IF EXISTS no_such_schema.foo(int); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP AGGREGATE IF EXISTS foo(no_such_type); +NOTICE: type "no_such_type" does not exist, skipping +DROP AGGREGATE IF EXISTS foo(no_such_schema.no_such_type); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP CAST IF EXISTS (INTEGER AS no_such_type2); +NOTICE: type "no_such_type2" does not exist, skipping +DROP CAST IF EXISTS (no_such_type1 AS INTEGER); +NOTICE: type "no_such_type1" does not exist, skipping +DROP CAST IF EXISTS (INTEGER AS no_such_schema.bar); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP CAST IF EXISTS (no_such_schema.foo AS INTEGER); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP COLLATION IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP CONVERSION IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP DOMAIN IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP FOREIGN TABLE IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP FUNCTION IF EXISTS no_such_schema.foo(); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP FUNCTION IF EXISTS foo(no_such_type); +NOTICE: type "no_such_type" does not exist, skipping +DROP FUNCTION IF EXISTS foo(no_such_schema.no_such_type); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP INDEX IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP MATERIALIZED VIEW IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP OPERATOR IF EXISTS no_such_schema.+ (int, int); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP OPERATOR IF EXISTS + (no_such_type, no_such_type); +NOTICE: type "no_such_type" does not exist, skipping +DROP OPERATOR IF EXISTS + (no_such_schema.no_such_type, no_such_schema.no_such_type); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP OPERATOR IF EXISTS # (NONE, no_such_schema.no_such_type); +NOTICE: schema "no_such_schema" does not exist, skipping +DROP OPERATOR CLASS IF EXISTS no_such_schema.widget_ops USING btree; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP OPERATOR FAMILY IF EXISTS no_such_schema.float_ops USING btree; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP RULE IF EXISTS foo ON no_such_schema.bar; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP SEQUENCE IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP TABLE IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP TEXT SEARCH CONFIGURATION IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP TEXT SEARCH DICTIONARY IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP TEXT SEARCH PARSER IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP TEXT SEARCH TEMPLATE IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP TRIGGER IF EXISTS foo ON no_such_schema.bar; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP TYPE IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +DROP VIEW IF EXISTS no_such_schema.foo; +NOTICE: schema "no_such_schema" does not exist, skipping +-- Check we receive an ambiguous function error when there are +-- multiple matching functions. +CREATE FUNCTION test_ambiguous_funcname(int) returns int as $$ select $1; $$ language sql; +CREATE FUNCTION test_ambiguous_funcname(text) returns text as $$ select $1; $$ language sql; +DROP FUNCTION test_ambiguous_funcname; +ERROR: function name "test_ambiguous_funcname" is not unique +HINT: Specify the argument list to select the function unambiguously. +DROP FUNCTION IF EXISTS test_ambiguous_funcname; +ERROR: function name "test_ambiguous_funcname" is not unique +HINT: Specify the argument list to select the function unambiguously. +-- cleanup +DROP FUNCTION test_ambiguous_funcname(int); +DROP FUNCTION test_ambiguous_funcname(text); +-- Likewise for procedures. +CREATE PROCEDURE test_ambiguous_procname(int) as $$ begin end; $$ language plpgsql; +CREATE PROCEDURE test_ambiguous_procname(text) as $$ begin end; $$ language plpgsql; +DROP PROCEDURE test_ambiguous_procname; +ERROR: procedure name "test_ambiguous_procname" is not unique +HINT: Specify the argument list to select the procedure unambiguously. +DROP PROCEDURE IF EXISTS test_ambiguous_procname; +ERROR: procedure name "test_ambiguous_procname" is not unique +HINT: Specify the argument list to select the procedure unambiguously. +-- Check we get a similar error if we use ROUTINE instead of PROCEDURE. +DROP ROUTINE IF EXISTS test_ambiguous_procname; +ERROR: routine name "test_ambiguous_procname" is not unique +HINT: Specify the argument list to select the routine unambiguously. +-- cleanup +DROP PROCEDURE test_ambiguous_procname(int); +DROP PROCEDURE test_ambiguous_procname(text); +-- This test checks both the functionality of 'if exists' and the syntax +-- of the drop database command. +drop database test_database_exists (force); +ERROR: database "test_database_exists" does not exist +drop database test_database_exists with (force); +ERROR: database "test_database_exists" does not exist +drop database if exists test_database_exists (force); +NOTICE: database "test_database_exists" does not exist, skipping +drop database if exists test_database_exists with (force); +NOTICE: database "test_database_exists" does not exist, skipping diff --git a/src/test/singlenode_regress/expected/drop_operator.out b/src/test/singlenode_regress/expected/drop_operator.out new file mode 100644 index 00000000000..cc8f5e755ec --- /dev/null +++ b/src/test/singlenode_regress/expected/drop_operator.out @@ -0,0 +1,61 @@ +CREATE OPERATOR === ( + PROCEDURE = int8eq, + LEFTARG = bigint, + RIGHTARG = bigint, + COMMUTATOR = === +); +CREATE OPERATOR !== ( + PROCEDURE = int8ne, + LEFTARG = bigint, + RIGHTARG = bigint, + NEGATOR = ===, + COMMUTATOR = !== +); +DROP OPERATOR !==(bigint, bigint); +SELECT ctid, oprcom +FROM pg_catalog.pg_operator fk +WHERE oprcom != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprcom); + ctid | oprcom +------+-------- +(0 rows) + +SELECT ctid, oprnegate +FROM pg_catalog.pg_operator fk +WHERE oprnegate != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprnegate); + ctid | oprnegate +------+----------- +(0 rows) + +DROP OPERATOR ===(bigint, bigint); +CREATE OPERATOR <| ( + PROCEDURE = int8lt, + LEFTARG = bigint, + RIGHTARG = bigint +); +CREATE OPERATOR |> ( + PROCEDURE = int8gt, + LEFTARG = bigint, + RIGHTARG = bigint, + NEGATOR = <|, + COMMUTATOR = <| +); +DROP OPERATOR |>(bigint, bigint); +SELECT ctid, oprcom +FROM pg_catalog.pg_operator fk +WHERE oprcom != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprcom); + ctid | oprcom +------+-------- +(0 rows) + +SELECT ctid, oprnegate +FROM pg_catalog.pg_operator fk +WHERE oprnegate != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprnegate); + ctid | oprnegate +------+----------- +(0 rows) + +DROP OPERATOR <|(bigint, bigint); diff --git a/src/test/singlenode_regress/expected/enable_autovacuum.out b/src/test/singlenode_regress/expected/enable_autovacuum.out new file mode 100644 index 00000000000..fc890a417c4 --- /dev/null +++ b/src/test/singlenode_regress/expected/enable_autovacuum.out @@ -0,0 +1,7 @@ +alter system set autovacuum = on; +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 +---------------+---------------- + -1 | t +(1 row) + diff --git a/src/test/singlenode_regress/expected/enum.out b/src/test/singlenode_regress/expected/enum.out new file mode 100644 index 00000000000..686ab49742d --- /dev/null +++ b/src/test/singlenode_regress/expected/enum.out @@ -0,0 +1,690 @@ +-- +-- Enum tests +-- +CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple'); +-- +-- Did it create the right number of rows? +-- +SELECT COUNT(*) FROM pg_enum WHERE enumtypid = 'rainbow'::regtype; + count +------- + 6 +(1 row) + +-- +-- I/O functions +-- +SELECT 'red'::rainbow; + rainbow +--------- + red +(1 row) + +SELECT 'mauve'::rainbow; +ERROR: invalid input value for enum rainbow: "mauve" +LINE 1: SELECT 'mauve'::rainbow; + ^ +-- +-- adding new values +-- +CREATE TYPE planets AS ENUM ( 'venus', 'earth', 'mars' ); +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'planets'::regtype +ORDER BY 2; + enumlabel | enumsortorder +-----------+--------------- + venus | 1 + earth | 2 + mars | 3 +(3 rows) + +ALTER TYPE planets ADD VALUE 'uranus'; +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'planets'::regtype +ORDER BY 2; + enumlabel | enumsortorder +-----------+--------------- + venus | 1 + earth | 2 + mars | 3 + uranus | 4 +(4 rows) + +ALTER TYPE planets ADD VALUE 'mercury' BEFORE 'venus'; +ALTER TYPE planets ADD VALUE 'saturn' BEFORE 'uranus'; +ALTER TYPE planets ADD VALUE 'jupiter' AFTER 'mars'; +ALTER TYPE planets ADD VALUE 'neptune' AFTER 'uranus'; +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'planets'::regtype +ORDER BY 2; + enumlabel | enumsortorder +-----------+--------------- + mercury | 0 + venus | 1 + earth | 2 + mars | 3 + jupiter | 3.25 + saturn | 3.5 + uranus | 4 + neptune | 5 +(8 rows) + +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'planets'::regtype +ORDER BY enumlabel::planets; + enumlabel | enumsortorder +-----------+--------------- + mercury | 0 + venus | 1 + earth | 2 + mars | 3 + jupiter | 3.25 + saturn | 3.5 + uranus | 4 + neptune | 5 +(8 rows) + +-- errors for adding labels +ALTER TYPE planets ADD VALUE + 'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto'; +ERROR: invalid enum label "plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto" +DETAIL: Labels must be 63 bytes or less. +ALTER TYPE planets ADD VALUE 'pluto' AFTER 'zeus'; +ERROR: "zeus" is not an existing enum label +-- if not exists tests +-- existing value gives error +ALTER TYPE planets ADD VALUE 'mercury'; +ERROR: enum label "mercury" already exists +-- unless IF NOT EXISTS is specified +ALTER TYPE planets ADD VALUE IF NOT EXISTS 'mercury'; +NOTICE: enum label "mercury" already exists, skipping +-- should be neptune, not mercury +SELECT enum_last(NULL::planets); + enum_last +----------- + neptune +(1 row) + +ALTER TYPE planets ADD VALUE IF NOT EXISTS 'pluto'; +-- should be pluto, i.e. the new value +SELECT enum_last(NULL::planets); + enum_last +----------- + pluto +(1 row) + +-- +-- Test inserting so many values that we have to renumber +-- +create type insenum as enum ('L1', 'L2'); +alter type insenum add value 'i1' before 'L2'; +alter type insenum add value 'i2' before 'L2'; +alter type insenum add value 'i3' before 'L2'; +alter type insenum add value 'i4' before 'L2'; +alter type insenum add value 'i5' before 'L2'; +alter type insenum add value 'i6' before 'L2'; +alter type insenum add value 'i7' before 'L2'; +alter type insenum add value 'i8' before 'L2'; +alter type insenum add value 'i9' before 'L2'; +alter type insenum add value 'i10' before 'L2'; +alter type insenum add value 'i11' before 'L2'; +alter type insenum add value 'i12' before 'L2'; +alter type insenum add value 'i13' before 'L2'; +alter type insenum add value 'i14' before 'L2'; +alter type insenum add value 'i15' before 'L2'; +alter type insenum add value 'i16' before 'L2'; +alter type insenum add value 'i17' before 'L2'; +alter type insenum add value 'i18' before 'L2'; +alter type insenum add value 'i19' before 'L2'; +alter type insenum add value 'i20' before 'L2'; +alter type insenum add value 'i21' before 'L2'; +alter type insenum add value 'i22' before 'L2'; +alter type insenum add value 'i23' before 'L2'; +alter type insenum add value 'i24' before 'L2'; +alter type insenum add value 'i25' before 'L2'; +alter type insenum add value 'i26' before 'L2'; +alter type insenum add value 'i27' before 'L2'; +alter type insenum add value 'i28' before 'L2'; +alter type insenum add value 'i29' before 'L2'; +alter type insenum add value 'i30' before 'L2'; +-- The exact values of enumsortorder will now depend on the local properties +-- of float4, but in any reasonable implementation we should get at least +-- 20 splits before having to renumber; so only hide values > 20. +SELECT enumlabel, + case when enumsortorder > 20 then null else enumsortorder end as so +FROM pg_enum +WHERE enumtypid = 'insenum'::regtype +ORDER BY enumsortorder; + enumlabel | so +-----------+---- + L1 | 1 + i1 | 2 + i2 | 3 + i3 | 4 + i4 | 5 + i5 | 6 + i6 | 7 + i7 | 8 + i8 | 9 + i9 | 10 + i10 | 11 + i11 | 12 + i12 | 13 + i13 | 14 + i14 | 15 + i15 | 16 + i16 | 17 + i17 | 18 + i18 | 19 + i19 | 20 + i20 | + i21 | + i22 | + i23 | + i24 | + i25 | + i26 | + i27 | + i28 | + i29 | + i30 | + L2 | +(32 rows) + +-- +-- Basic table creation, row selection +-- +CREATE TABLE enumtest (col rainbow); +INSERT INTO enumtest values ('red'), ('orange'), ('yellow'), ('green'); +COPY enumtest FROM stdin; +SELECT * FROM enumtest; + col +-------- + red + orange + yellow + green + blue + purple +(6 rows) + +-- +-- Operators, no index +-- +SELECT * FROM enumtest WHERE col = 'orange'; + col +-------- + orange +(1 row) + +SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col; + col +-------- + red + yellow + green + blue + purple +(5 rows) + +SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col; + col +-------- + green + blue + purple +(3 rows) + +SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col; + col +-------- + yellow + green + blue + purple +(4 rows) + +SELECT * FROM enumtest WHERE col < 'green' ORDER BY col; + col +-------- + red + orange + yellow +(3 rows) + +SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col; + col +-------- + red + orange + yellow + green +(4 rows) + +-- +-- Cast to/from text +-- +SELECT 'red'::rainbow::text || 'hithere'; + ?column? +------------ + redhithere +(1 row) + +SELECT 'red'::text::rainbow = 'red'::rainbow; + ?column? +---------- + t +(1 row) + +-- +-- Aggregates +-- +SELECT min(col) FROM enumtest; + min +----- + red +(1 row) + +SELECT max(col) FROM enumtest; + max +-------- + purple +(1 row) + +SELECT max(col) FROM enumtest WHERE col < 'green'; + max +-------- + yellow +(1 row) + +-- +-- Index tests, force use of index +-- +SET enable_seqscan = off; +SET enable_bitmapscan = off; +-- +-- Btree index / opclass with the various operators +-- +CREATE INDEX enumtest_btree ON enumtest USING btree (col); +SELECT * FROM enumtest WHERE col = 'orange'; + col +-------- + orange +(1 row) + +SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col; + col +-------- + red + yellow + green + blue + purple +(5 rows) + +SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col; + col +-------- + green + blue + purple +(3 rows) + +SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col; + col +-------- + yellow + green + blue + purple +(4 rows) + +SELECT * FROM enumtest WHERE col < 'green' ORDER BY col; + col +-------- + red + orange + yellow +(3 rows) + +SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col; + col +-------- + red + orange + yellow + green +(4 rows) + +SELECT min(col) FROM enumtest; + min +----- + red +(1 row) + +SELECT max(col) FROM enumtest; + max +-------- + purple +(1 row) + +SELECT max(col) FROM enumtest WHERE col < 'green'; + max +-------- + yellow +(1 row) + +DROP INDEX enumtest_btree; +-- +-- Hash index / opclass with the = operator +-- +CREATE INDEX enumtest_hash ON enumtest USING hash (col); +SELECT * FROM enumtest WHERE col = 'orange'; + col +-------- + orange +(1 row) + +DROP INDEX enumtest_hash; +-- +-- End index tests +-- +RESET enable_seqscan; +RESET enable_bitmapscan; +-- +-- Domains over enums +-- +CREATE DOMAIN rgb AS rainbow CHECK (VALUE IN ('red', 'green', 'blue')); +SELECT 'red'::rgb; + rgb +----- + red +(1 row) + +SELECT 'purple'::rgb; +ERROR: value for domain rgb violates check constraint "rgb_check" +SELECT 'purple'::rainbow::rgb; +ERROR: value for domain rgb violates check constraint "rgb_check" +DROP DOMAIN rgb; +-- +-- Arrays +-- +SELECT '{red,green,blue}'::rainbow[]; + rainbow +------------------ + {red,green,blue} +(1 row) + +SELECT ('{red,green,blue}'::rainbow[])[2]; + rainbow +--------- + green +(1 row) + +SELECT 'red' = ANY ('{red,green,blue}'::rainbow[]); + ?column? +---------- + t +(1 row) + +SELECT 'yellow' = ANY ('{red,green,blue}'::rainbow[]); + ?column? +---------- + f +(1 row) + +SELECT 'red' = ALL ('{red,green,blue}'::rainbow[]); + ?column? +---------- + f +(1 row) + +SELECT 'red' = ALL ('{red,red}'::rainbow[]); + ?column? +---------- + t +(1 row) + +-- +-- Support functions +-- +SELECT enum_first(NULL::rainbow); + enum_first +------------ + red +(1 row) + +SELECT enum_last('green'::rainbow); + enum_last +----------- + purple +(1 row) + +SELECT enum_range(NULL::rainbow); + enum_range +--------------------------------------- + {red,orange,yellow,green,blue,purple} +(1 row) + +SELECT enum_range('orange'::rainbow, 'green'::rainbow); + enum_range +----------------------- + {orange,yellow,green} +(1 row) + +SELECT enum_range(NULL, 'green'::rainbow); + enum_range +--------------------------- + {red,orange,yellow,green} +(1 row) + +SELECT enum_range('orange'::rainbow, NULL); + enum_range +----------------------------------- + {orange,yellow,green,blue,purple} +(1 row) + +SELECT enum_range(NULL::rainbow, NULL); + enum_range +--------------------------------------- + {red,orange,yellow,green,blue,purple} +(1 row) + +-- +-- User functions, can't test perl/python etc here since may not be compiled. +-- +CREATE FUNCTION echo_me(anyenum) RETURNS text AS $$ +BEGIN +RETURN $1::text || 'omg'; +END +$$ LANGUAGE plpgsql; +SELECT echo_me('red'::rainbow); + echo_me +--------- + redomg +(1 row) + +-- +-- Concrete function should override generic one +-- +CREATE FUNCTION echo_me(rainbow) RETURNS text AS $$ +BEGIN +RETURN $1::text || 'wtf'; +END +$$ LANGUAGE plpgsql; +SELECT echo_me('red'::rainbow); + echo_me +--------- + redwtf +(1 row) + +-- +-- If we drop the original generic one, we don't have to qualify the type +-- anymore, since there's only one match +-- +DROP FUNCTION echo_me(anyenum); +SELECT echo_me('red'); + echo_me +--------- + redwtf +(1 row) + +DROP FUNCTION echo_me(rainbow); +-- +-- RI triggers on enum types +-- +CREATE TABLE enumtest_parent (id rainbow PRIMARY KEY); +CREATE TABLE enumtest_child (parent rainbow REFERENCES enumtest_parent); +INSERT INTO enumtest_parent VALUES ('red'); +INSERT INTO enumtest_child VALUES ('red'); +INSERT INTO enumtest_child VALUES ('blue'); -- fail +-- start_ignore +-- foreign keys are not checked in GPDB, hence these pass. +-- end_ignore +DELETE FROM enumtest_parent; -- fail +-- +-- cross-type RI should fail +-- +CREATE TYPE bogus AS ENUM('good', 'bad', 'ugly'); +CREATE TABLE enumtest_bogus_child(parent bogus REFERENCES enumtest_parent); +ERROR: foreign key constraint "enumtest_bogus_child_parent_fkey" cannot be implemented +DETAIL: Key columns "parent" and "id" are of incompatible types: bogus and rainbow. +DROP TYPE bogus; +-- check renaming a value +ALTER TYPE rainbow RENAME VALUE 'red' TO 'crimson'; +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'rainbow'::regtype +ORDER BY 2; + enumlabel | enumsortorder +-----------+--------------- + crimson | 1 + orange | 2 + yellow | 3 + green | 4 + blue | 5 + purple | 6 +(6 rows) + +-- check that renaming a non-existent value fails +ALTER TYPE rainbow RENAME VALUE 'red' TO 'crimson'; +ERROR: "red" is not an existing enum label +-- check that renaming to an existent value fails +ALTER TYPE rainbow RENAME VALUE 'blue' TO 'green'; +ERROR: enum label "green" already exists +-- +-- check transactional behaviour of ALTER TYPE ... ADD VALUE +-- +CREATE TYPE bogus AS ENUM('good'); +-- check that we can add new values to existing enums in a transaction +-- but we can't use them +BEGIN; +ALTER TYPE bogus ADD VALUE 'new'; +SAVEPOINT x; +SELECT 'new'::bogus; -- unsafe +ERROR: unsafe use of new value "new" of enum type bogus +LINE 1: SELECT 'new'::bogus; + ^ +HINT: New enum values must be committed before they can be used. +ROLLBACK TO x; +SELECT enum_first(null::bogus); -- safe + enum_first +------------ + good +(1 row) + +SELECT enum_last(null::bogus); -- unsafe +ERROR: unsafe use of new value "new" of enum type bogus +HINT: New enum values must be committed before they can be used. +ROLLBACK TO x; +SELECT enum_range(null::bogus); -- unsafe +ERROR: unsafe use of new value "new" of enum type bogus +HINT: New enum values must be committed before they can be used. +ROLLBACK TO x; +COMMIT; +SELECT 'new'::bogus; -- now safe + bogus +------- + new +(1 row) + +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'bogus'::regtype +ORDER BY 2; + enumlabel | enumsortorder +-----------+--------------- + good | 1 + new | 2 +(2 rows) + +-- check that we recognize the case where the enum already existed but was +-- modified in the current txn; this should not be considered safe +BEGIN; +ALTER TYPE bogus RENAME TO bogon; +ALTER TYPE bogon ADD VALUE 'bad'; +SELECT 'bad'::bogon; +ERROR: unsafe use of new value "bad" of enum type bogon +LINE 1: SELECT 'bad'::bogon; + ^ +HINT: New enum values must be committed before they can be used. +ROLLBACK; +-- but a renamed value is safe to use later in same transaction +BEGIN; +ALTER TYPE bogus RENAME VALUE 'good' to 'bad'; +SELECT 'bad'::bogus; + bogus +------- + bad +(1 row) + +ROLLBACK; +DROP TYPE bogus; +-- check that values created during CREATE TYPE can be used in any case +BEGIN; +CREATE TYPE bogus AS ENUM('good','bad','ugly'); +ALTER TYPE bogus RENAME TO bogon; +select enum_range(null::bogon); + enum_range +----------------- + {good,bad,ugly} +(1 row) + +ROLLBACK; +-- ideally, we'd allow this usage; but it requires keeping track of whether +-- the enum type was created in the current transaction, which is expensive +BEGIN; +CREATE TYPE bogus AS ENUM('good'); +ALTER TYPE bogus RENAME TO bogon; +ALTER TYPE bogon ADD VALUE 'bad'; +ALTER TYPE bogon ADD VALUE 'ugly'; +select enum_range(null::bogon); -- fails +ERROR: unsafe use of new value "bad" of enum type bogon +HINT: New enum values must be committed before they can be used. +ROLLBACK; +-- +-- Cleanup +-- +DROP TABLE enumtest_child; +DROP TABLE enumtest_parent; +DROP TABLE enumtest; +DROP TYPE rainbow; +-- +-- Verify properly cleaned up +-- +SELECT COUNT(*) FROM pg_type WHERE typname = 'rainbow'; + count +------- + 0 +(1 row) + +SELECT * FROM pg_enum WHERE NOT EXISTS + (SELECT 1 FROM pg_type WHERE pg_type.oid = enumtypid); + oid | enumtypid | enumsortorder | enumlabel +-----+-----------+---------------+----------- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/equivclass.out b/src/test/singlenode_regress/expected/equivclass.out new file mode 100644 index 00000000000..e32da71a5e8 --- /dev/null +++ b/src/test/singlenode_regress/expected/equivclass.out @@ -0,0 +1,489 @@ +-- +-- Tests for the planner's "equivalence class" mechanism +-- +-- One thing that's not tested well during normal querying is the logic +-- for handling "broken" ECs. This is because an EC can only become broken +-- if its underlying btree operator family doesn't include a complete set +-- of cross-type equality operators. There are not (and should not be) +-- any such families built into Postgres; so we have to hack things up +-- to create one. We do this by making two alias types that are really +-- int8 (so we need no new C code) and adding only some operators for them +-- into the standard integer_ops opfamily. +create type int8alias1; +create function int8alias1in(cstring) returns int8alias1 + strict immutable language internal as 'int8in'; +NOTICE: return type int8alias1 is only a shell +create function int8alias1out(int8alias1) returns cstring + strict immutable language internal as 'int8out'; +NOTICE: argument type int8alias1 is only a shell +create type int8alias1 ( + input = int8alias1in, + output = int8alias1out, + like = int8 +); +create type int8alias2; +create function int8alias2in(cstring) returns int8alias2 + strict immutable language internal as 'int8in'; +NOTICE: return type int8alias2 is only a shell +create function int8alias2out(int8alias2) returns cstring + strict immutable language internal as 'int8out'; +NOTICE: argument type int8alias2 is only a shell +create type int8alias2 ( + input = int8alias2in, + output = int8alias2out, + like = int8 +); +create cast (int8 as int8alias1) without function; +create cast (int8 as int8alias2) without function; +create cast (int8alias1 as int8) without function; +create cast (int8alias2 as int8) without function; +create function int8alias1eq(int8alias1, int8alias1) returns bool + strict immutable language internal as 'int8eq'; +create operator = ( + procedure = int8alias1eq, + leftarg = int8alias1, rightarg = int8alias1, + commutator = =, + restrict = eqsel, join = eqjoinsel, + merges +); +alter operator family integer_ops using btree add + operator 3 = (int8alias1, int8alias1); +create function int8alias2eq(int8alias2, int8alias2) returns bool + strict immutable language internal as 'int8eq'; +create operator = ( + procedure = int8alias2eq, + leftarg = int8alias2, rightarg = int8alias2, + commutator = =, + restrict = eqsel, join = eqjoinsel, + merges +); +alter operator family integer_ops using btree add + operator 3 = (int8alias2, int8alias2); +create function int8alias1eq(int8, int8alias1) returns bool + strict immutable language internal as 'int8eq'; +create operator = ( + procedure = int8alias1eq, + leftarg = int8, rightarg = int8alias1, + restrict = eqsel, join = eqjoinsel, + merges +); +alter operator family integer_ops using btree add + operator 3 = (int8, int8alias1); +create function int8alias1eq(int8alias1, int8alias2) returns bool + strict immutable language internal as 'int8eq'; +create operator = ( + procedure = int8alias1eq, + leftarg = int8alias1, rightarg = int8alias2, + restrict = eqsel, join = eqjoinsel, + merges +); +alter operator family integer_ops using btree add + operator 3 = (int8alias1, int8alias2); +create function int8alias1lt(int8alias1, int8alias1) returns bool + strict immutable language internal as 'int8lt'; +create operator < ( + procedure = int8alias1lt, + leftarg = int8alias1, rightarg = int8alias1 +); +alter operator family integer_ops using btree add + operator 1 < (int8alias1, int8alias1); +create function int8alias1cmp(int8, int8alias1) returns int + strict immutable language internal as 'btint8cmp'; +alter operator family integer_ops using btree add + function 1 int8alias1cmp (int8, int8alias1); +create table ec0 (ff int8 primary key, f1 int8, f2 int8); +create table ec1 (ff int8 primary key, f1 int8alias1, f2 int8alias2); +create table ec2 (xf int8 primary key, x1 int8alias1, x2 int8alias2); +-- for the moment we only want to look at nestloop plans +set enable_nestloop = on; +set enable_hashjoin = off; +set enable_mergejoin = off; +-- +-- Note that for cases where there's a missing operator, we don't care so +-- much whether the plan is ideal as that we don't fail or generate an +-- outright incorrect plan. +-- +explain (costs off) + select * from ec0 where ff = f1 and f1 = '42'::int8; + QUERY PLAN +------------------------------------- + Index Scan using ec0_pkey on ec0 + Index Cond: (ff = '42'::bigint) + Filter: (f1 = '42'::bigint) + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) + select * from ec0 where ff = f1 and f1 = '42'::int8alias1; + QUERY PLAN +--------------------------------------- + Index Scan using ec0_pkey on ec0 + Index Cond: (ff = '42'::int8alias1) + Filter: (f1 = '42'::int8alias1) + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) + select * from ec1 where ff = f1 and f1 = '42'::int8alias1; + QUERY PLAN +--------------------------------------- + Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::int8alias1) + Filter: (f1 = '42'::int8alias1) + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) + select * from ec1 where ff = f1 and f1 = '42'::int8alias2; + QUERY PLAN +--------------------------------------------------- + Seq Scan on ec1 + Filter: ((ff = f1) AND (f1 = '42'::int8alias2)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) + select * from ec1, ec2 where ff = x1 and ff = '42'::int8; + QUERY PLAN +------------------------------------------------------------------- + Nested Loop + Join Filter: (ec1.ff = ec2.x1) + -> Index Scan using ec1_pkey on ec1 + Index Cond: ((ff = '42'::bigint) AND (ff = '42'::bigint)) + -> Seq Scan on ec2 + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) + select * from ec1, ec2 where ff = x1 and ff = '42'::int8alias1; + QUERY PLAN +--------------------------------------------- + Nested Loop + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::int8alias1) + -> Seq Scan on ec2 + Filter: (x1 = '42'::int8alias1) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) + select * from ec1, ec2 where ff = x1 and '42'::int8 = x1; + QUERY PLAN +----------------------------------------- + Nested Loop + Join Filter: (ec1.ff = ec2.x1) + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::bigint) + -> Seq Scan on ec2 + Filter: ('42'::bigint = x1) + Optimizer: Postgres query optimizer +(7 rows) + +explain (costs off) + select * from ec1, ec2 where ff = x1 and x1 = '42'::int8alias1; + QUERY PLAN +--------------------------------------------- + Nested Loop + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::int8alias1) + -> Seq Scan on ec2 + Filter: (x1 = '42'::int8alias1) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) + select * from ec1, ec2 where ff = x1 and x1 = '42'::int8alias2; + QUERY PLAN +----------------------------------------- + Nested Loop + -> Seq Scan on ec2 + Filter: (x1 = '42'::int8alias2) + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = ec2.x1) + Optimizer: Postgres query optimizer +(6 rows) + +create index ec1_expr1 on ec1((ff + 1)); +create index ec1_expr2 on ec1((ff + 2 + 1)); +create index ec1_expr3 on ec1((ff + 3 + 1)); +create index ec1_expr4 on ec1((ff + 4)); +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1 + where ss1.x = ec1.f1 and ec1.ff = 42::int8; + QUERY PLAN +----------------------------------------------------------- + Nested Loop + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::bigint) + -> Append + -> Bitmap Heap Scan on ec1 ec1_1 + Recheck Cond: (((ff + 2) + 1) = ec1.f1) + -> Bitmap Index Scan on ec1_expr2 + Index Cond: (((ff + 2) + 1) = ec1.f1) + -> Bitmap Heap Scan on ec1 ec1_2 + Recheck Cond: (((ff + 3) + 1) = ec1.f1) + -> Bitmap Index Scan on ec1_expr3 + Index Cond: (((ff + 3) + 1) = ec1.f1) + -> Bitmap Heap Scan on ec1 ec1_3 + Recheck Cond: ((ff + 4) = ec1.f1) + -> Bitmap Index Scan on ec1_expr4 + Index Cond: ((ff + 4) = ec1.f1) + Optimizer: Postgres query optimizer +(17 rows) + +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1 + where ss1.x = ec1.f1 and ec1.ff = 42::int8 and ec1.ff = ec1.f1; + QUERY PLAN +------------------------------------------------------------------------------------------- + Nested Loop + -> Index Scan using ec1_pkey on ec1 + Index Cond: ((ff = '42'::bigint) AND (ff = '42'::bigint)) + Filter: (ff = f1) + -> Append + -> Index Scan using ec1_expr2 on ec1 ec1_1 + Index Cond: ((((ff + 2) + 1) = ec1.f1) AND (((ff + 2) + 1) = '42'::bigint)) + -> Index Scan using ec1_expr3 on ec1 ec1_2 + Index Cond: ((((ff + 3) + 1) = ec1.f1) AND (((ff + 3) + 1) = '42'::bigint)) + -> Index Scan using ec1_expr4 on ec1 ec1_3 + Index Cond: (((ff + 4) = ec1.f1) AND ((ff + 4) = '42'::bigint)) + Optimizer: Postgres query optimizer +(12 rows) + +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss2 + where ss1.x = ec1.f1 and ss1.x = ss2.x and ec1.ff = 42::int8; + QUERY PLAN +--------------------------------------------------------------------- + Nested Loop + -> Nested Loop + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::bigint) + -> Append + -> Bitmap Heap Scan on ec1 ec1_1 + Recheck Cond: (((ff + 2) + 1) = ec1.f1) + -> Bitmap Index Scan on ec1_expr2 + Index Cond: (((ff + 2) + 1) = ec1.f1) + -> Bitmap Heap Scan on ec1 ec1_2 + Recheck Cond: (((ff + 3) + 1) = ec1.f1) + -> Bitmap Index Scan on ec1_expr3 + Index Cond: (((ff + 3) + 1) = ec1.f1) + -> Bitmap Heap Scan on ec1 ec1_3 + Recheck Cond: ((ff + 4) = ec1.f1) + -> Bitmap Index Scan on ec1_expr4 + Index Cond: ((ff + 4) = ec1.f1) + -> Append + -> Index Scan using ec1_expr2 on ec1 ec1_4 + Index Cond: (((ff + 2) + 1) = (((ec1_1.ff + 2) + 1))) + -> Index Scan using ec1_expr3 on ec1 ec1_5 + Index Cond: (((ff + 3) + 1) = (((ec1_1.ff + 2) + 1))) + -> Index Scan using ec1_expr4 on ec1 ec1_6 + Index Cond: ((ff + 4) = (((ec1_1.ff + 2) + 1))) + Optimizer: Postgres query optimizer +(25 rows) + +-- let's try that as a mergejoin +set enable_mergejoin = on; +set enable_nestloop = off; +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss2 + where ss1.x = ec1.f1 and ss1.x = ss2.x and ec1.ff = 42::int8; + QUERY PLAN +----------------------------------------------------------------- + Merge Join + Merge Cond: ((((ec1_4.ff + 2) + 1)) = (((ec1_1.ff + 2) + 1))) + -> Merge Append + Sort Key: (((ec1_4.ff + 2) + 1)) + -> Index Scan using ec1_expr2 on ec1 ec1_4 + -> Index Scan using ec1_expr3 on ec1 ec1_5 + -> Index Scan using ec1_expr4 on ec1 ec1_6 + -> Materialize + -> Nested Loop + Join Filter: ((((ec1_1.ff + 2) + 1)) = ec1.f1) + -> Merge Append + Sort Key: (((ec1_1.ff + 2) + 1)) + -> Index Scan using ec1_expr2 on ec1 ec1_1 + -> Index Scan using ec1_expr3 on ec1 ec1_2 + -> Index Scan using ec1_expr4 on ec1 ec1_3 + -> Materialize + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::bigint) + Optimizer: Postgres query optimizer +(19 rows) + +-- check partially indexed scan +set enable_nestloop = on; +set enable_mergejoin = off; +drop index ec1_expr3; +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1 + where ss1.x = ec1.f1 and ec1.ff = 42::int8; + QUERY PLAN +----------------------------------------------------------- + Nested Loop + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::bigint) + -> Append + -> Bitmap Heap Scan on ec1 ec1_1 + Recheck Cond: (((ff + 2) + 1) = ec1.f1) + -> Bitmap Index Scan on ec1_expr2 + Index Cond: (((ff + 2) + 1) = ec1.f1) + -> Seq Scan on ec1 ec1_2 + Filter: (((ff + 3) + 1) = ec1.f1) + -> Bitmap Heap Scan on ec1 ec1_3 + Recheck Cond: ((ff + 4) = ec1.f1) + -> Bitmap Index Scan on ec1_expr4 + Index Cond: ((ff + 4) = ec1.f1) + Optimizer: Postgres query optimizer +(15 rows) + +-- let's try that as a mergejoin +set enable_mergejoin = on; +set enable_nestloop = off; +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1 + where ss1.x = ec1.f1 and ec1.ff = 42::int8; + QUERY PLAN +----------------------------------------------------------- + Nested Loop + -> Index Scan using ec1_pkey on ec1 + Index Cond: (ff = '42'::bigint) + -> Append + -> Bitmap Heap Scan on ec1 ec1_1 + Recheck Cond: (((ff + 2) + 1) = ec1.f1) + -> Bitmap Index Scan on ec1_expr2 + Index Cond: (((ff + 2) + 1) = ec1.f1) + -> Seq Scan on ec1 ec1_2 + Filter: (((ff + 3) + 1) = ec1.f1) + -> Bitmap Heap Scan on ec1 ec1_3 + Recheck Cond: ((ff + 4) = ec1.f1) + -> Bitmap Index Scan on ec1_expr4 + Index Cond: ((ff + 4) = ec1.f1) + Optimizer: Postgres query optimizer +(15 rows) + +-- check effects of row-level security +set enable_nestloop = on; +set enable_mergejoin = off; +alter table ec1 enable row level security; +create policy p1 on ec1 using (f1 < '5'::int8alias1); +create user regress_user_ectest; +grant select on ec0 to regress_user_ectest; +grant select on ec1 to regress_user_ectest; +-- without any RLS, we'll treat {a.ff, b.ff, 43} as an EquivalenceClass +explain (costs off) + select * from ec0 a, ec1 b + where a.ff = b.ff and a.ff = 43::bigint::int8alias1; + QUERY PLAN +--------------------------------------------- + Nested Loop + -> Index Scan using ec0_pkey on ec0 a + Index Cond: (ff = '43'::int8alias1) + -> Index Scan using ec1_pkey on ec1 b + Index Cond: (ff = '43'::int8alias1) + Optimizer: Postgres query optimizer +(6 rows) + +set session authorization regress_user_ectest; +-- with RLS active, the non-leakproof a.ff = 43 clause is not treated +-- as a suitable source for an EquivalenceClass; currently, this is true +-- even though the RLS clause has nothing to do directly with the EC +explain (costs off) + select * from ec0 a, ec1 b + where a.ff = b.ff and a.ff = 43::bigint::int8alias1; + QUERY PLAN +---------------------------------------------------------------------- + Nested Loop + -> Index Scan using ec0_pkey on ec0 a + Index Cond: (ff = '43'::int8alias1) + -> Index Scan using ec1_pkey on ec1 b + Index Cond: (ff = a.ff) + Filter: ((f1 < '5'::int8alias1) AND (ff = '43'::int8alias1)) + Optimizer: Postgres query optimizer +(7 rows) + +reset session authorization; +revoke select on ec0 from regress_user_ectest; +revoke select on ec1 from regress_user_ectest; +drop user regress_user_ectest; +-- check that X=X is converted to X IS NOT NULL when appropriate +explain (costs off) + select * from tenk1 where unique1 = unique1 and unique2 = unique2; + QUERY PLAN +------------------------------------------------------------- + Seq Scan on tenk1 + Filter: ((unique1 IS NOT NULL) AND (unique2 IS NOT NULL)) + Optimizer: Postgres query optimizer +(3 rows) + +-- this could be converted, but isn't at present +explain (costs off) + select * from tenk1 where unique1 = unique1 or unique2 = unique2; + QUERY PLAN +-------------------------------------------------------- + Seq Scan on tenk1 + Filter: ((unique1 = unique1) OR (unique2 = unique2)) + Optimizer: Postgres query optimizer +(3 rows) + +-- check that we recognize equivalence with dummy domains in the way +create temp table undername (f1 name, f2 int); +create temp view overview as + select f1::information_schema.sql_identifier as sqli, f2 from undername; +explain (costs off) -- this should not require a sort + select * from overview where sqli = 'foo' order by sqli; + QUERY PLAN +------------------------------------- + Seq Scan on undername + Filter: (f1 = 'foo'::name) + Optimizer: Postgres query optimizer +(3 rows) + diff --git a/src/test/singlenode_regress/expected/errors.out b/src/test/singlenode_regress/expected/errors.out new file mode 100644 index 00000000000..15862d44753 --- /dev/null +++ b/src/test/singlenode_regress/expected/errors.out @@ -0,0 +1,447 @@ +-- +-- ERRORS +-- +-- bad in postquel, but ok in PostgreSQL +select 1; + ?column? +---------- + 1 +(1 row) + +-- +-- UNSUPPORTED STUFF +-- doesn't work +-- notify pg_class +-- +-- +-- SELECT +-- this used to be a syntax error, but now we allow an empty target list +select; +-- +(1 row) + +-- no such relation +select * from nonesuch; +ERROR: relation "nonesuch" does not exist +LINE 1: select * from nonesuch; + ^ +-- bad name in target list +select nonesuch from pg_database; +ERROR: column "nonesuch" does not exist +LINE 1: select nonesuch from pg_database; + ^ +-- empty distinct list isn't OK +select distinct from pg_database; +ERROR: syntax error at or near "from" +LINE 1: select distinct from pg_database; + ^ +-- bad attribute name on lhs of operator +select * from pg_database where nonesuch = pg_database.datname; +ERROR: column "nonesuch" does not exist +LINE 1: select * from pg_database where nonesuch = pg_database.datna... + ^ +-- bad attribute name on rhs of operator +select * from pg_database where pg_database.datname = nonesuch; +ERROR: column "nonesuch" does not exist +LINE 1: ...ect * from pg_database where pg_database.datname = nonesuch; + ^ +-- bad attribute name in select distinct on +select distinct on (foobar) * from pg_database; +ERROR: column "foobar" does not exist +LINE 1: select distinct on (foobar) * from pg_database; + ^ +-- grouping with FOR UPDATE +select null from pg_database group by datname for update; +ERROR: FOR UPDATE is not allowed with GROUP BY clause +select null from pg_database group by grouping sets (()) for update; +ERROR: FOR UPDATE is not allowed with GROUP BY clause +-- +-- DELETE +-- missing relation name (this had better not wildcard!) +delete from; +ERROR: syntax error at or near ";" +LINE 1: delete from; + ^ +-- no such relation +delete from nonesuch; +ERROR: relation "nonesuch" does not exist +LINE 1: delete from nonesuch; + ^ +-- +-- DROP +-- missing relation name (this had better not wildcard!) +drop table; +ERROR: syntax error at or near ";" +LINE 1: drop table; + ^ +-- no such relation +drop table nonesuch; +ERROR: table "nonesuch" does not exist +-- +-- ALTER TABLE +-- relation renaming +-- missing relation name +alter table rename; +ERROR: syntax error at or near ";" +LINE 1: alter table rename; + ^ +-- no such relation +alter table nonesuch rename to newnonesuch; +ERROR: relation "nonesuch" does not exist +-- no such relation +alter table nonesuch rename to stud_emp; +ERROR: relation "nonesuch" does not exist +-- conflict +alter table stud_emp rename to aggtest; +ERROR: relation "aggtest" already exists +-- self-conflict +alter table stud_emp rename to stud_emp; +ERROR: relation "stud_emp" already exists +-- attribute renaming +-- no such relation +alter table nonesuchrel rename column nonesuchatt to newnonesuchatt; +ERROR: relation "nonesuchrel" does not exist +-- no such attribute +alter table emp rename column nonesuchatt to newnonesuchatt; +ERROR: column "nonesuchatt" does not exist +-- conflict +alter table emp rename column salary to manager; +ERROR: column "manager" of relation "stud_emp" already exists +-- conflict +alter table emp rename column salary to ctid; +ERROR: column name "ctid" conflicts with a system column name +-- +-- TRANSACTION STUFF +-- not in a xact +abort; +WARNING: there is no transaction in progress +-- not in a xact +end; +WARNING: there is no transaction in progress +-- +-- CREATE AGGREGATE +-- sfunc/finalfunc type disagreement +create aggregate newavg2 (sfunc = int4pl, + basetype = int4, + stype = int4, + finalfunc = int2um, + initcond = '0'); +ERROR: function int2um(integer) does not exist +-- left out basetype +create aggregate newcnt1 (sfunc = int4inc, + stype = int4, + initcond = '0'); +ERROR: aggregate input type must be specified +-- +-- DROP INDEX +-- missing index name +drop index; +ERROR: syntax error at or near ";" +LINE 1: drop index; + ^ +-- bad index name +drop index 314159; +ERROR: syntax error at or near "314159" +LINE 1: drop index 314159; + ^ +-- no such index +drop index nonesuch; +ERROR: index "nonesuch" does not exist +-- +-- DROP AGGREGATE +-- missing aggregate name +drop aggregate; +ERROR: syntax error at or near ";" +LINE 1: drop aggregate; + ^ +-- missing aggregate type +drop aggregate newcnt1; +ERROR: syntax error at or near ";" +LINE 1: drop aggregate newcnt1; + ^ +-- bad aggregate name +drop aggregate 314159 (int); +ERROR: syntax error at or near "314159" +LINE 1: drop aggregate 314159 (int); + ^ +-- bad aggregate type +drop aggregate newcnt (nonesuch); +ERROR: type "nonesuch" does not exist +-- no such aggregate +drop aggregate nonesuch (int4); +ERROR: aggregate nonesuch(integer) does not exist +-- no such aggregate for type +drop aggregate newcnt (float4); +ERROR: aggregate newcnt(real) does not exist +-- +-- DROP FUNCTION +-- missing function name +drop function (); +ERROR: syntax error at or near "(" +LINE 1: drop function (); + ^ +-- bad function name +drop function 314159(); +ERROR: syntax error at or near "314159" +LINE 1: drop function 314159(); + ^ +-- no such function +drop function nonesuch(); +ERROR: function nonesuch() does not exist +-- +-- DROP TYPE +-- missing type name +drop type; +ERROR: syntax error at or near ";" +LINE 1: drop type; + ^ +-- bad type name +drop type 314159; +ERROR: syntax error at or near "314159" +LINE 1: drop type 314159; + ^ +-- no such type +drop type nonesuch; +ERROR: type "nonesuch" does not exist +-- +-- DROP OPERATOR +-- missing everything +drop operator; +ERROR: syntax error at or near ";" +LINE 1: drop operator; + ^ +-- bad operator name +drop operator equals; +ERROR: syntax error at or near ";" +LINE 1: drop operator equals; + ^ +-- missing type list +drop operator ===; +ERROR: syntax error at or near ";" +LINE 1: drop operator ===; + ^ +-- missing parentheses +drop operator int4, int4; +ERROR: syntax error at or near "," +LINE 1: drop operator int4, int4; + ^ +-- missing operator name +drop operator (int4, int4); +ERROR: syntax error at or near "(" +LINE 1: drop operator (int4, int4); + ^ +-- missing type list contents +drop operator === (); +ERROR: syntax error at or near ")" +LINE 1: drop operator === (); + ^ +-- no such operator +drop operator === (int4); +ERROR: missing argument +LINE 1: drop operator === (int4); + ^ +HINT: Use NONE to denote the missing argument of a unary operator. +-- no such operator by that name +drop operator === (int4, int4); +ERROR: operator does not exist: integer === integer +-- no such type1 +drop operator = (nonesuch); +ERROR: missing argument +LINE 1: drop operator = (nonesuch); + ^ +HINT: Use NONE to denote the missing argument of a unary operator. +-- no such type1 +drop operator = ( , int4); +ERROR: syntax error at or near "," +LINE 1: drop operator = ( , int4); + ^ +-- no such type1 +drop operator = (nonesuch, int4); +ERROR: type "nonesuch" does not exist +-- no such type2 +drop operator = (int4, nonesuch); +ERROR: type "nonesuch" does not exist +-- no such type2 +drop operator = (int4, ); +ERROR: syntax error at or near ")" +LINE 1: drop operator = (int4, ); + ^ +-- +-- DROP RULE +-- missing rule name +drop rule; +ERROR: syntax error at or near ";" +LINE 1: drop rule; + ^ +-- bad rule name +drop rule 314159; +ERROR: syntax error at or near "314159" +LINE 1: drop rule 314159; + ^ +-- no such rule +drop rule nonesuch on noplace; +ERROR: relation "noplace" does not exist +-- these postquel variants are no longer supported +drop tuple rule nonesuch; +ERROR: syntax error at or near "tuple" +LINE 1: drop tuple rule nonesuch; + ^ +drop instance rule nonesuch on noplace; +ERROR: syntax error at or near "instance" +LINE 1: drop instance rule nonesuch on noplace; + ^ +drop rewrite rule nonesuch; +ERROR: syntax error at or near "rewrite" +LINE 1: drop rewrite rule nonesuch; + ^ +-- +-- Check that division-by-zero is properly caught. +-- +select 1/0; +ERROR: division by zero +select 1::int8/0; +ERROR: division by zero +select 1/0::int8; +ERROR: division by zero +select 1::int2/0; +ERROR: division by zero +select 1/0::int2; +ERROR: division by zero +select 1::numeric/0; +ERROR: division by zero +select 1/0::numeric; +ERROR: division by zero +select 1::float8/0; +ERROR: division by zero +select 1/0::float8; +ERROR: division by zero +select 1::float4/0; +ERROR: division by zero +select 1/0::float4; +ERROR: division by zero +-- +-- Test psql's reporting of syntax error location +-- +xxx; +ERROR: syntax error at or near "xxx" +LINE 1: xxx; + ^ +CREATE foo; +ERROR: syntax error at or near "foo" +LINE 1: CREATE foo; + ^ +CREATE TABLE ; +ERROR: syntax error at or near ";" +LINE 1: CREATE TABLE ; + ^ +CREATE TABLE +\g +ERROR: syntax error at end of input +LINE 1: CREATE TABLE + ^ +INSERT INTO foo VALUES(123) foo; +ERROR: syntax error at or near "foo" +LINE 1: INSERT INTO foo VALUES(123) foo; + ^ +INSERT INTO 123 +VALUES(123); +ERROR: syntax error at or near "123" +LINE 1: INSERT INTO 123 + ^ +INSERT INTO foo +VALUES(123) 123 +; +ERROR: syntax error at or near "123" +LINE 2: VALUES(123) 123 + ^ +-- with a tab +CREATE TABLE foo + (id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, + id3 INTEGER NOT NUL, + id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL); +ERROR: syntax error at or near "NUL" +LINE 3: id3 INTEGER NOT NUL, + ^ +-- long line to be truncated on the left +CREATE TABLE foo(id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, +id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL); +ERROR: syntax error at or near "NUL" +LINE 1: ...OT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, + ^ +-- long line to be truncated on the right +CREATE TABLE foo( +id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL, id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY); +ERROR: syntax error at or near "NUL" +LINE 2: id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQ... + ^ +-- long line to be truncated both ways +CREATE TABLE foo(id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL); +ERROR: syntax error at or near "NUL" +LINE 1: ...L, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 I... + ^ +-- long line to be truncated on the left, many lines +CREATE +TEMPORARY +TABLE +foo(id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, +id4 INT4 +UNIQUE +NOT +NULL, +id5 TEXT +UNIQUE +NOT +NULL) +; +ERROR: syntax error at or near "NUL" +LINE 4: ...OT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, + ^ +-- long line to be truncated on the right, many lines +CREATE +TEMPORARY +TABLE +foo( +id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL, id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY) +; +ERROR: syntax error at or near "NUL" +LINE 5: id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQ... + ^ +-- long line to be truncated both ways, many lines +CREATE +TEMPORARY +TABLE +foo +(id +INT4 +UNIQUE NOT NULL, idx INT4 UNIQUE NOT NULL, idy INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL, +idz INT4 UNIQUE NOT NULL, +idv INT4 UNIQUE NOT NULL); +ERROR: syntax error at or near "NUL" +LINE 7: ...L, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 I... + ^ +-- more than 10 lines... +CREATE +TEMPORARY +TABLE +foo +(id +INT4 +UNIQUE +NOT +NULL +, +idm +INT4 +UNIQUE +NOT +NULL, +idx INT4 UNIQUE NOT NULL, idy INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL, +idz INT4 UNIQUE NOT NULL, +idv +INT4 +UNIQUE +NOT +NULL); +ERROR: syntax error at or near "NUL" +LINE 16: ...L, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 I... + ^ diff --git a/src/test/singlenode_regress/expected/event_trigger.out b/src/test/singlenode_regress/expected/event_trigger.out new file mode 100644 index 00000000000..c95c30b3140 --- /dev/null +++ b/src/test/singlenode_regress/expected/event_trigger.out @@ -0,0 +1,611 @@ +-- should fail, return type mismatch +create event trigger regress_event_trigger + on ddl_command_start + execute procedure pg_backend_pid(); +ERROR: function pg_backend_pid must return type event_trigger +-- OK +create function test_event_trigger() returns event_trigger as $$ +BEGIN + RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag; +END +$$ language plpgsql; +-- should fail, can't call it as a plain function +SELECT test_event_trigger(); +ERROR: trigger functions can only be called as triggers +CONTEXT: compilation of PL/pgSQL function "test_event_trigger" near line 1 +-- should fail, event triggers cannot have declared arguments +create function test_event_trigger_arg(name text) +returns event_trigger as $$ BEGIN RETURN 1; END $$ language plpgsql; +ERROR: event trigger functions cannot have declared arguments +CONTEXT: compilation of PL/pgSQL function "test_event_trigger_arg" near line 1 +-- should fail, SQL functions cannot be event triggers +create function test_event_trigger_sql() returns event_trigger as $$ +SELECT 1 $$ language sql; +ERROR: SQL functions cannot return type event_trigger +-- should fail, no elephant_bootstrap entry point +create event trigger regress_event_trigger on elephant_bootstrap + execute procedure test_event_trigger(); +ERROR: unrecognized event name "elephant_bootstrap" +-- OK +create event trigger regress_event_trigger on ddl_command_start + execute procedure test_event_trigger(); +-- OK +create event trigger regress_event_trigger_end on ddl_command_end + execute function test_event_trigger(); +-- should fail, food is not a valid filter variable +create event trigger regress_event_trigger2 on ddl_command_start + when food in ('sandwich') + execute procedure test_event_trigger(); +ERROR: unrecognized filter variable "food" +-- should fail, sandwich is not a valid command tag +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('sandwich') + execute procedure test_event_trigger(); +ERROR: filter value "sandwich" not recognized for filter variable "tag" +-- should fail, create skunkcabbage is not a valid command tag +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('create table', 'create skunkcabbage') + execute procedure test_event_trigger(); +ERROR: filter value "create skunkcabbage" not recognized for filter variable "tag" +-- should fail, can't have event triggers on event triggers +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('DROP EVENT TRIGGER') + execute procedure test_event_trigger(); +ERROR: event triggers are not supported for DROP EVENT TRIGGER +-- should fail, can't have event triggers on global objects +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('CREATE ROLE') + execute procedure test_event_trigger(); +ERROR: event triggers are not supported for CREATE ROLE +-- should fail, can't have event triggers on global objects +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('CREATE DATABASE') + execute procedure test_event_trigger(); +ERROR: event triggers are not supported for CREATE DATABASE +-- should fail, can't have event triggers on global objects +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('CREATE TABLESPACE') + execute procedure test_event_trigger(); +ERROR: event triggers are not supported for CREATE TABLESPACE +-- should fail, can't have same filter variable twice +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('create table') and tag in ('CREATE FUNCTION') + execute procedure test_event_trigger(); +ERROR: filter variable "tag" specified more than once +-- should fail, can't have arguments +create event trigger regress_event_trigger2 on ddl_command_start + execute procedure test_event_trigger('argument not allowed'); +ERROR: syntax error at or near "'argument not allowed'" +LINE 2: execute procedure test_event_trigger('argument not allowe... + ^ +-- OK +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('create table', 'CREATE FUNCTION') + execute procedure test_event_trigger(); +-- OK +comment on event trigger regress_event_trigger is 'test comment'; +-- drop as non-superuser should fail +create role regress_evt_user; +set role regress_evt_user; +create event trigger regress_event_trigger_noperms on ddl_command_start + execute procedure test_event_trigger(); +ERROR: permission denied to create event trigger "regress_event_trigger_noperms" +HINT: Must be superuser to create an event trigger. +reset role; +-- test enabling and disabling +alter event trigger regress_event_trigger disable; +-- fires _trigger2 and _trigger_end should fire, but not _trigger +create table event_trigger_fire1 (a int); +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +NOTICE: test_event_trigger: ddl_command_end CREATE TABLE +alter event trigger regress_event_trigger enable; +set session_replication_role = replica; +-- fires nothing +create table event_trigger_fire2 (a int); +alter event trigger regress_event_trigger enable replica; +-- fires only _trigger +create table event_trigger_fire3 (a int); +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +alter event trigger regress_event_trigger enable always; +-- fires only _trigger +create table event_trigger_fire4 (a int); +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +reset session_replication_role; +-- fires all three +create table event_trigger_fire5 (a int); +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +NOTICE: test_event_trigger: ddl_command_end CREATE TABLE +-- non-top-level command +create function f1() returns int +language plpgsql +as $$ +begin + create table event_trigger_fire6 (a int); + return 0; +end $$; +NOTICE: test_event_trigger: ddl_command_start CREATE FUNCTION +NOTICE: test_event_trigger: ddl_command_start CREATE FUNCTION +NOTICE: test_event_trigger: ddl_command_end CREATE FUNCTION +select f1(); +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +NOTICE: test_event_trigger: ddl_command_end CREATE TABLE + f1 +---- + 0 +(1 row) + +-- non-top-level command +create procedure p1() +language plpgsql +as $$ +begin + create table event_trigger_fire7 (a int); +end $$; +NOTICE: test_event_trigger: ddl_command_start CREATE PROCEDURE +NOTICE: test_event_trigger: ddl_command_end CREATE PROCEDURE +call p1(); +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +NOTICE: test_event_trigger: ddl_command_start CREATE TABLE +NOTICE: test_event_trigger: ddl_command_end CREATE TABLE +-- clean up +alter event trigger regress_event_trigger disable; +drop table event_trigger_fire2, event_trigger_fire3, event_trigger_fire4, event_trigger_fire5, event_trigger_fire6, event_trigger_fire7; +NOTICE: test_event_trigger: ddl_command_end DROP TABLE +drop routine f1(), p1(); +NOTICE: test_event_trigger: ddl_command_end DROP ROUTINE +-- regress_event_trigger_end should fire on these commands +grant all on table event_trigger_fire1 to public; +NOTICE: test_event_trigger: ddl_command_end GRANT +comment on table event_trigger_fire1 is 'here is a comment'; +NOTICE: test_event_trigger: ddl_command_end COMMENT +revoke all on table event_trigger_fire1 from public; +NOTICE: test_event_trigger: ddl_command_end REVOKE +drop table event_trigger_fire1; +NOTICE: test_event_trigger: ddl_command_end DROP TABLE +create foreign data wrapper useless; +NOTICE: test_event_trigger: ddl_command_end CREATE FOREIGN DATA WRAPPER +create server useless_server foreign data wrapper useless; +NOTICE: test_event_trigger: ddl_command_end CREATE SERVER +create user mapping for regress_evt_user server useless_server; +NOTICE: test_event_trigger: ddl_command_end CREATE USER MAPPING +alter default privileges for role regress_evt_user + revoke delete on tables from regress_evt_user; +NOTICE: test_event_trigger: ddl_command_end ALTER DEFAULT PRIVILEGES +-- alter owner to non-superuser should fail +alter event trigger regress_event_trigger owner to regress_evt_user; +ERROR: permission denied to change owner of event trigger "regress_event_trigger" +HINT: The owner of an event trigger must be a superuser. +-- alter owner to superuser should work +alter role regress_evt_user superuser; +alter event trigger regress_event_trigger owner to regress_evt_user; +-- should fail, name collision +alter event trigger regress_event_trigger rename to regress_event_trigger2; +ERROR: event trigger "regress_event_trigger2" already exists +-- OK +alter event trigger regress_event_trigger rename to regress_event_trigger3; +-- should fail, doesn't exist any more +drop event trigger regress_event_trigger; +ERROR: event trigger "regress_event_trigger" does not exist +-- should fail, regress_evt_user owns some objects +drop role regress_evt_user; +ERROR: role "regress_evt_user" cannot be dropped because some objects depend on it +DETAIL: owner of event trigger regress_event_trigger3 +owner of user mapping for regress_evt_user on server useless_server +owner of default privileges on new relations belonging to role regress_evt_user +-- cleanup before next test +-- these are all OK; the second one should emit a NOTICE +drop event trigger if exists regress_event_trigger2; +drop event trigger if exists regress_event_trigger2; +NOTICE: event trigger "regress_event_trigger2" does not exist, skipping +drop event trigger regress_event_trigger3; +drop event trigger regress_event_trigger_end; +-- test support for dropped objects +CREATE SCHEMA schema_one authorization regress_evt_user; +CREATE SCHEMA schema_two authorization regress_evt_user; +CREATE SCHEMA audit_tbls authorization regress_evt_user; +CREATE TEMP TABLE a_temp_tbl (); +SET SESSION AUTHORIZATION regress_evt_user; +CREATE TABLE schema_one.table_one(a int); +CREATE TABLE schema_one."table two"(a int); +CREATE TABLE schema_one.table_three(a int); +CREATE TABLE audit_tbls.schema_one_table_two(the_value text); +CREATE TABLE schema_two.table_two(a int); +CREATE TABLE schema_two.table_three(a int, b text); +CREATE TABLE audit_tbls.schema_two_table_three(the_value text); +CREATE OR REPLACE FUNCTION schema_two.add(int, int) RETURNS int LANGUAGE plpgsql + CALLED ON NULL INPUT + AS $$ BEGIN RETURN coalesce($1,0) + coalesce($2,0); END; $$; +CREATE AGGREGATE schema_two.newton + (BASETYPE = int, SFUNC = schema_two.add, STYPE = int); +RESET SESSION AUTHORIZATION; +CREATE TABLE undroppable_objs ( + object_type text, + object_identity text +); +INSERT INTO undroppable_objs VALUES +('table', 'schema_one.table_three'), +('table', 'audit_tbls.schema_two_table_three'); +CREATE TABLE dropped_objects ( + type text, + schema text, + object text +); +-- This tests errors raised within event triggers; the one in audit_tbls +-- uses 2nd-level recursive invocation via test_evtrig_dropped_objects(). +CREATE OR REPLACE FUNCTION undroppable() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +DECLARE + obj record; +BEGIN + PERFORM 1 FROM pg_tables WHERE tablename = 'undroppable_objs'; + IF NOT FOUND THEN + RAISE NOTICE 'table undroppable_objs not found, skipping'; + RETURN; + END IF; + FOR obj IN + SELECT * FROM pg_event_trigger_dropped_objects() JOIN + undroppable_objs USING (object_type, object_identity) + LOOP + RAISE EXCEPTION 'object % of type % cannot be dropped', + obj.object_identity, obj.object_type; + END LOOP; +END; +$$; +CREATE EVENT TRIGGER undroppable ON sql_drop + EXECUTE PROCEDURE undroppable(); +CREATE OR REPLACE FUNCTION test_evtrig_dropped_objects() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +DECLARE + obj record; +BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() + LOOP + IF obj.object_type = 'table' THEN + EXECUTE format('DROP TABLE IF EXISTS audit_tbls.%I', + format('%s_%s', obj.schema_name, obj.object_name)); + END IF; + + INSERT INTO dropped_objects + (type, schema, object) VALUES + (obj.object_type, obj.schema_name, obj.object_identity); + END LOOP; +END +$$; +CREATE EVENT TRIGGER regress_event_trigger_drop_objects ON sql_drop + WHEN TAG IN ('drop table', 'drop function', 'drop view', + 'drop owned', 'drop schema', 'alter table') + EXECUTE PROCEDURE test_evtrig_dropped_objects(); +ALTER TABLE schema_one.table_one DROP COLUMN a; +DROP SCHEMA schema_one, schema_two CASCADE; +NOTICE: drop cascades to 7 other objects +DETAIL: drop cascades to table schema_two.table_two +drop cascades to table schema_two.table_three +drop cascades to function schema_two.add(integer,integer) +drop cascades to function schema_two.newton(integer) +drop cascades to table schema_one.table_one +drop cascades to table schema_one."table two" +drop cascades to table schema_one.table_three +NOTICE: table "schema_two_table_two" does not exist, skipping +NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping +ERROR: object audit_tbls.schema_two_table_three of type table cannot be dropped +CONTEXT: PL/pgSQL function undroppable() line 14 at RAISE +SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three" +PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE +DELETE FROM undroppable_objs WHERE object_identity = 'audit_tbls.schema_two_table_three'; +DROP SCHEMA schema_one, schema_two CASCADE; +NOTICE: drop cascades to 7 other objects +DETAIL: drop cascades to table schema_two.table_two +drop cascades to table schema_two.table_three +drop cascades to function schema_two.add(integer,integer) +drop cascades to function schema_two.newton(integer) +drop cascades to table schema_one.table_one +drop cascades to table schema_one."table two" +drop cascades to table schema_one.table_three +NOTICE: table "schema_two_table_two" does not exist, skipping +NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping +NOTICE: table "schema_one_table_one" does not exist, skipping +NOTICE: table "schema_one_table two" does not exist, skipping +NOTICE: table "schema_one_table_three" does not exist, skipping +ERROR: object schema_one.table_three of type table cannot be dropped +CONTEXT: PL/pgSQL function undroppable() line 14 at RAISE +DELETE FROM undroppable_objs WHERE object_identity = 'schema_one.table_three'; +DROP SCHEMA schema_one, schema_two CASCADE; +NOTICE: drop cascades to 7 other objects +DETAIL: drop cascades to table schema_two.table_two +drop cascades to table schema_two.table_three +drop cascades to function schema_two.add(integer,integer) +drop cascades to function schema_two.newton(integer) +drop cascades to table schema_one.table_one +drop cascades to table schema_one."table two" +drop cascades to table schema_one.table_three +NOTICE: table "schema_two_table_two" does not exist, skipping +NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping +NOTICE: table "schema_one_table_one" does not exist, skipping +NOTICE: table "schema_one_table two" does not exist, skipping +NOTICE: table "schema_one_table_three" does not exist, skipping +SELECT * FROM dropped_objects WHERE schema IS NULL OR schema <> 'pg_toast'; + type | schema | object +--------------+------------+------------------------------------- + table column | schema_one | schema_one.table_one.a + schema | | schema_two + table | schema_two | schema_two.table_two + type | schema_two | schema_two.table_two + type | schema_two | schema_two.table_two[] + table | audit_tbls | audit_tbls.schema_two_table_three + type | audit_tbls | audit_tbls.schema_two_table_three + type | audit_tbls | audit_tbls.schema_two_table_three[] + table | schema_two | schema_two.table_three + type | schema_two | schema_two.table_three + type | schema_two | schema_two.table_three[] + function | schema_two | schema_two.add(integer,integer) + aggregate | schema_two | schema_two.newton(integer) + schema | | schema_one + table | schema_one | schema_one.table_one + type | schema_one | schema_one.table_one + type | schema_one | schema_one.table_one[] + table | schema_one | schema_one."table two" + type | schema_one | schema_one."table two" + type | schema_one | schema_one."table two"[] + table | schema_one | schema_one.table_three + type | schema_one | schema_one.table_three + type | schema_one | schema_one.table_three[] +(23 rows) + +DROP OWNED BY regress_evt_user; +NOTICE: schema "audit_tbls" does not exist, skipping +SELECT * FROM dropped_objects WHERE type = 'schema'; + type | schema | object +--------+--------+------------ + schema | | schema_two + schema | | schema_one + schema | | audit_tbls +(3 rows) + +DROP ROLE regress_evt_user; +DROP EVENT TRIGGER regress_event_trigger_drop_objects; +DROP EVENT TRIGGER undroppable; +-- Event triggers on relations. +CREATE OR REPLACE FUNCTION event_trigger_report_dropped() + RETURNS event_trigger + LANGUAGE plpgsql +AS $$ +DECLARE r record; +BEGIN + FOR r IN SELECT * from pg_event_trigger_dropped_objects() + LOOP + IF NOT r.normal AND NOT r.original THEN + CONTINUE; + END IF; + RAISE NOTICE 'NORMAL: orig=% normal=% istemp=% type=% identity=% name=% args=%', + r.original, r.normal, r.is_temporary, r.object_type, + r.object_identity, r.address_names, r.address_args; + END LOOP; +END; $$; +CREATE EVENT TRIGGER regress_event_trigger_report_dropped ON sql_drop + EXECUTE PROCEDURE event_trigger_report_dropped(); +CREATE OR REPLACE FUNCTION event_trigger_report_end() + RETURNS event_trigger + LANGUAGE plpgsql +AS $$ +DECLARE r RECORD; +BEGIN + FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + RAISE NOTICE 'END: command_tag=% type=% identity=%', + r.command_tag, r.object_type, r.object_identity; + END LOOP; +END; $$; +CREATE EVENT TRIGGER regress_event_trigger_report_end ON ddl_command_end + EXECUTE PROCEDURE event_trigger_report_end(); +CREATE SCHEMA evttrig + CREATE TABLE one (col_a SERIAL PRIMARY KEY, col_b text DEFAULT 'forty two', col_c SERIAL) + CREATE INDEX one_idx ON one (col_b) + CREATE TABLE two (col_c INTEGER CHECK (col_c > 0) REFERENCES one DEFAULT 42) + CREATE TABLE id (col_d int NOT NULL GENERATED ALWAYS AS IDENTITY); +NOTICE: END: command_tag=CREATE SCHEMA type=schema identity=evttrig +NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.one_col_a_seq +NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.one_col_c_seq +NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.one +NOTICE: END: command_tag=CREATE INDEX type=index identity=evttrig.one_pkey +NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.one_col_a_seq +NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.one_col_c_seq +NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.two +NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.two +NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.id_col_d_seq +NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.id +NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.id_col_d_seq +NOTICE: END: command_tag=CREATE INDEX type=index identity=evttrig.one_idx +-- Partitioned tables with a partitioned index +CREATE TABLE evttrig.parted ( + id int PRIMARY KEY) + PARTITION BY RANGE (id); +NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.parted +NOTICE: END: command_tag=CREATE INDEX type=index identity=evttrig.parted_pkey +CREATE TABLE evttrig.part_1_10 PARTITION OF evttrig.parted (id) + FOR VALUES FROM (1) TO (10); +NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.part_1_10 +CREATE TABLE evttrig.part_10_20 PARTITION OF evttrig.parted (id) + FOR VALUES FROM (10) TO (20) PARTITION BY RANGE (id); +NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.part_10_20 +CREATE TABLE evttrig.part_10_15 PARTITION OF evttrig.part_10_20 (id) + FOR VALUES FROM (10) TO (15); +NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.part_10_15 +CREATE TABLE evttrig.part_15_20 PARTITION OF evttrig.part_10_20 (id) + FOR VALUES FROM (15) TO (20); +NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.part_15_20 +ALTER TABLE evttrig.two DROP COLUMN col_c; +NOTICE: NORMAL: orig=t normal=f istemp=f type=table column identity=evttrig.two.col_c name={evttrig,two,col_c} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table constraint identity=two_col_c_check on evttrig.two name={evttrig,two,two_col_c_check} args={} +NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.two +ALTER TABLE evttrig.one ALTER COLUMN col_b DROP DEFAULT; +NOTICE: NORMAL: orig=t normal=f istemp=f type=default value identity=for evttrig.one.col_b name={evttrig,one,col_b} args={} +NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.one +ALTER TABLE evttrig.one DROP CONSTRAINT one_pkey; +NOTICE: NORMAL: orig=t normal=f istemp=f type=table constraint identity=one_pkey on evttrig.one name={evttrig,one,one_pkey} args={} +NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.one +ALTER TABLE evttrig.one DROP COLUMN col_c; +NOTICE: NORMAL: orig=t normal=f istemp=f type=table column identity=evttrig.one.col_c name={evttrig,one,col_c} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=default value identity=for evttrig.one.col_c name={evttrig,one,col_c} args={} +NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.one +ALTER TABLE evttrig.id ALTER COLUMN col_d SET DATA TYPE bigint; +NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.id_col_d_seq +NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.id +ALTER TABLE evttrig.id ALTER COLUMN col_d DROP IDENTITY, + ALTER COLUMN col_d SET DATA TYPE int; +NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.id +DROP INDEX evttrig.one_idx; +NOTICE: NORMAL: orig=t normal=f istemp=f type=index identity=evttrig.one_idx name={evttrig,one_idx} args={} +DROP SCHEMA evttrig CASCADE; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to table evttrig.one +drop cascades to table evttrig.two +drop cascades to table evttrig.id +drop cascades to table evttrig.parted +NOTICE: NORMAL: orig=t normal=f istemp=f type=schema identity=evttrig name={evttrig} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.one name={evttrig,one} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=sequence identity=evttrig.one_col_a_seq name={evttrig,one_col_a_seq} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=default value identity=for evttrig.one.col_a name={evttrig,one,col_a} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.two name={evttrig,two} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.id name={evttrig,id} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.parted name={evttrig,parted} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_1_10 name={evttrig,part_1_10} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_10_20 name={evttrig,part_10_20} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_10_15 name={evttrig,part_10_15} args={} +NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_15_20 name={evttrig,part_15_20} args={} +DROP TABLE a_temp_tbl; +NOTICE: NORMAL: orig=t normal=f istemp=t type=table identity=pg_temp.a_temp_tbl name={pg_temp,a_temp_tbl} args={} +-- CREATE OPERATOR CLASS without FAMILY clause should report +-- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS +CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int; +NOTICE: END: command_tag=CREATE OPERATOR FAMILY type=operator family identity=public.evttrigopclass USING btree +NOTICE: END: command_tag=CREATE OPERATOR CLASS type=operator class identity=public.evttrigopclass USING btree +DROP EVENT TRIGGER regress_event_trigger_report_dropped; +DROP EVENT TRIGGER regress_event_trigger_report_end; +-- only allowed from within an event trigger function, should fail +select pg_event_trigger_table_rewrite_oid(); +ERROR: pg_event_trigger_table_rewrite_oid() can only be called in a table_rewrite event trigger function +-- test Table Rewrite Event Trigger +CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE EXCEPTION 'rewrites not allowed'; +END; +$$; +create event trigger no_rewrite_allowed on table_rewrite + execute procedure test_evtrig_no_rewrite(); +create table rewriteme (id serial primary key, foo float, bar timestamptz); +insert into rewriteme + select x * 1.001 from generate_series(1, 500) as t(x); +alter table rewriteme alter column foo type numeric; +ERROR: rewrites not allowed +CONTEXT: PL/pgSQL function test_evtrig_no_rewrite() line 3 at RAISE +alter table rewriteme add column baz int default 0; +-- test with more than one reason to rewrite a single table +CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE NOTICE 'Table ''%'' is being rewritten (reason = %)', + pg_event_trigger_table_rewrite_oid()::regclass, + pg_event_trigger_table_rewrite_reason(); +END; +$$; +alter table rewriteme + add column onemore int default 0, + add column another int default -1, + alter column foo type numeric(10,4); +NOTICE: Table 'rewriteme' is being rewritten (reason = 4) +-- shouldn't trigger a table_rewrite event +alter table rewriteme alter column foo type numeric(12,4); +begin; +set timezone to 'UTC'; +alter table rewriteme alter column bar type timestamp; +set timezone to '0'; +alter table rewriteme alter column bar type timestamptz; +set timezone to 'Europe/London'; +alter table rewriteme alter column bar type timestamp; -- does rewrite +NOTICE: Table 'rewriteme' is being rewritten (reason = 4) +rollback; +-- typed tables are rewritten when their type changes. Don't emit table +-- name, because firing order is not stable. +CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE NOTICE 'Table is being rewritten (reason = %)', + pg_event_trigger_table_rewrite_reason(); +END; +$$; +create type rewritetype as (a int); +create table rewritemetoo1 of rewritetype; +create table rewritemetoo2 of rewritetype; +alter type rewritetype alter attribute a type text cascade; +NOTICE: Table is being rewritten (reason = 4) +NOTICE: Table is being rewritten (reason = 4) +-- but this doesn't work +create table rewritemetoo3 (a rewritetype); +alter type rewritetype alter attribute a type varchar cascade; +ERROR: cannot alter type "rewritetype" because column "rewritemetoo3.a" uses it +drop table rewriteme; +drop event trigger no_rewrite_allowed; +drop function test_evtrig_no_rewrite(); +-- test Row Security Event Trigger +RESET SESSION AUTHORIZATION; +CREATE TABLE event_trigger_test (a integer, b text); +CREATE OR REPLACE FUNCTION start_command() +RETURNS event_trigger AS $$ +BEGIN +RAISE NOTICE '% - ddl_command_start', tg_tag; +END; +$$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION end_command() +RETURNS event_trigger AS $$ +BEGIN +RAISE NOTICE '% - ddl_command_end', tg_tag; +END; +$$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION drop_sql_command() +RETURNS event_trigger AS $$ +BEGIN +RAISE NOTICE '% - sql_drop', tg_tag; +END; +$$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER start_rls_command ON ddl_command_start + WHEN TAG IN ('CREATE POLICY', 'ALTER POLICY', 'DROP POLICY') EXECUTE PROCEDURE start_command(); +CREATE EVENT TRIGGER end_rls_command ON ddl_command_end + WHEN TAG IN ('CREATE POLICY', 'ALTER POLICY', 'DROP POLICY') EXECUTE PROCEDURE end_command(); +CREATE EVENT TRIGGER sql_drop_command ON sql_drop + WHEN TAG IN ('DROP POLICY') EXECUTE PROCEDURE drop_sql_command(); +CREATE POLICY p1 ON event_trigger_test USING (FALSE); +NOTICE: CREATE POLICY - ddl_command_start +NOTICE: CREATE POLICY - ddl_command_end +ALTER POLICY p1 ON event_trigger_test USING (TRUE); +NOTICE: ALTER POLICY - ddl_command_start +NOTICE: ALTER POLICY - ddl_command_end +ALTER POLICY p1 ON event_trigger_test RENAME TO p2; +NOTICE: ALTER POLICY - ddl_command_start +NOTICE: ALTER POLICY - ddl_command_end +DROP POLICY p2 ON event_trigger_test; +NOTICE: DROP POLICY - ddl_command_start +NOTICE: DROP POLICY - sql_drop +NOTICE: DROP POLICY - ddl_command_end +-- Check the object addresses of all the event triggers. +SELECT + e.evtname, + pg_describe_object('pg_event_trigger'::regclass, e.oid, 0) as descr, + b.type, b.object_names, b.object_args, + pg_identify_object(a.classid, a.objid, a.objsubid) as ident + FROM pg_event_trigger as e, + LATERAL pg_identify_object_as_address('pg_event_trigger'::regclass, e.oid, 0) as b, + LATERAL pg_get_object_address(b.type, b.object_names, b.object_args) as a + ORDER BY e.evtname; + evtname | descr | type | object_names | object_args | ident +-------------------+---------------------------------+---------------+---------------------+-------------+-------------------------------------------------------- + end_rls_command | event trigger end_rls_command | event trigger | {end_rls_command} | {} | ("event trigger",,end_rls_command,end_rls_command) + sql_drop_command | event trigger sql_drop_command | event trigger | {sql_drop_command} | {} | ("event trigger",,sql_drop_command,sql_drop_command) + start_rls_command | event trigger start_rls_command | event trigger | {start_rls_command} | {} | ("event trigger",,start_rls_command,start_rls_command) +(3 rows) + +DROP EVENT TRIGGER start_rls_command; +DROP EVENT TRIGGER end_rls_command; +DROP EVENT TRIGGER sql_drop_command; diff --git a/src/test/singlenode_regress/expected/explain.out b/src/test/singlenode_regress/expected/explain.out new file mode 100644 index 00000000000..2803a0b2c50 --- /dev/null +++ b/src/test/singlenode_regress/expected/explain.out @@ -0,0 +1,507 @@ +-- +-- EXPLAIN +-- +-- There are many test cases elsewhere that use EXPLAIN as a vehicle for +-- checking something else (usually planner behavior). This file is +-- concerned with testing EXPLAIN in its own right. +-- +-- To produce stable regression test output, it's usually necessary to +-- ignore details such as exact costs or row counts. These filter +-- functions replace changeable output details with fixed strings. +create function explain_filter(text) returns setof text +language plpgsql as +$$ +declare + ln text; +begin + for ln in execute $1 + loop + -- Replace any numeric word with just 'N' + ln := regexp_replace(ln, '-?\m\d+\M', 'N', 'g'); + -- In sort output, the above won't match units-suffixed numbers + ln := regexp_replace(ln, '\m\d+kB', 'NkB', 'g'); + -- Ignore text-mode buffers output because it varies depending + -- on the system state + CONTINUE WHEN (ln ~ ' +Buffers: .*'); + -- Ignore text-mode "Planning:" line because whether it's output + -- varies depending on the system state + CONTINUE WHEN (ln = 'Planning:'); + return next ln; + end loop; +end; +$$; +-- To produce valid JSON output, replace numbers with "0" or "0.0" not "N" +create function explain_filter_to_json(text) returns jsonb +language plpgsql as +$$ +declare + data text := ''; + ln text; +begin + for ln in execute $1 + loop + -- Replace any numeric word with just '0' + ln := regexp_replace(ln, '\m\d+\M', '0', 'g'); + data := data || ln; + end loop; + return data::jsonb; +end; +$$; +-- Simple cases +select explain_filter('explain select * from int8_tbl i8'); + explain_filter +--------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) + Optimizer: Postgres query optimizer +(2 rows) + +select explain_filter('explain (analyze) select * from int8_tbl i8'); + explain_filter +----------------------------------------------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) (actual time=N.N..N.N rows=N loops=N) + Planning Time: N.N ms + (slice0) Executor memory: 109K bytes. + Optimizer: Postgres query optimizer + Execution Time: N.N ms +(5 rows) + +select explain_filter('explain (analyze, verbose) select * from int8_tbl i8'); + explain_filter +------------------------------------------------------------------------------------------------------ + Seq Scan on public.int8_tbl i8 (cost=N.N..N.N rows=N width=N) (actual time=N.N..N.N rows=N loops=N) + Output: q1, q2 + Settings: optimizer = 'off' + Planning Time: N.N ms + (slice0) Executor memory: 109K bytes. + Optimizer: Postgres query optimizer + Execution Time: N.N ms +(7 rows) + +select explain_filter('explain (analyze, buffers, format text) select * from int8_tbl i8'); + explain_filter +----------------------------------------------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) (actual time=N.N..N.N rows=N loops=N) + Planning Time: N.N ms + (slice0) Executor memory: 109K bytes. + Optimizer: Postgres query optimizer + Execution Time: N.N ms +(5 rows) + +select explain_filter('explain (analyze, buffers, format json) select * from int8_tbl i8'); + explain_filter +----------------------------------------------- + [ + + { + + "Plan": { + + "Node Type": "Seq Scan", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "int8_tbl", + + "Alias": "i8", + + "Startup Cost": N.N, + + "Total Cost": N.N, + + "Plan Rows": N, + + "Plan Width": N, + + "Actual Startup Time": N.N, + + "Actual Total Time": N.N, + + "Actual Rows": N, + + "Actual Loops": N, + + "Shared Hit Blocks": N, + + "Shared Read Blocks": N, + + "Shared Dirtied Blocks": N, + + "Shared Written Blocks": N, + + "Local Hit Blocks": N, + + "Local Read Blocks": N, + + "Local Dirtied Blocks": N, + + "Local Written Blocks": N, + + "Temp Read Blocks": N, + + "Temp Written Blocks": N + + }, + + "Settings": { + + "Optimizer": "Postgres query optimizer"+ + }, + + "Planning": { + + "Shared Hit Blocks": N, + + "Shared Read Blocks": N, + + "Shared Dirtied Blocks": N, + + "Shared Written Blocks": N, + + "Local Hit Blocks": N, + + "Local Read Blocks": N, + + "Local Dirtied Blocks": N, + + "Local Written Blocks": N, + + "Temp Read Blocks": N, + + "Temp Written Blocks": N + + }, + + "Planning Time": N.N, + + "Triggers": [ + + ], + + "Slice statistics": [ + + { + + "Slice": N, + + "Executor Memory": N + + } + + ], + + "Execution Time": N.N + + } + + ] +(1 row) + +select explain_filter('explain (analyze, buffers, format xml) select * from int8_tbl i8'); + explain_filter +-------------------------------------------------------- + + + + + + + Seq Scan + + false + + false + + int8_tbl + + i8 + + N.N + + N.N + + N + + N + + N.N + + N.N + + N + + N + + N + + N + + N+ + N+ + N + + N + + N + + N + + N + + N + + + + + + Postgres query optimizer + + + + + + N + + N + + N+ + N+ + N + + N + + N + + N + + N + + N + + + + N.N + + + + + + + + + + N + + N + + + + + + N.N + + + + +(1 row) + +select explain_filter('explain (analyze, buffers, format yaml) select * from int8_tbl i8'); + explain_filter +------------------------------------------- + - Plan: + + Node Type: "Seq Scan" + + Parallel Aware: false + + Async Capable: false + + Relation Name: "int8_tbl" + + Alias: "i8" + + Startup Cost: N.N + + Total Cost: N.N + + Plan Rows: N + + Plan Width: N + + Actual Startup Time: N.N + + Actual Total Time: N.N + + Actual Rows: N + + Actual Loops: N + + Shared Hit Blocks: N + + Shared Read Blocks: N + + Shared Dirtied Blocks: N + + Shared Written Blocks: N + + Local Hit Blocks: N + + Local Read Blocks: N + + Local Dirtied Blocks: N + + Local Written Blocks: N + + Temp Read Blocks: N + + Temp Written Blocks: N + + Settings: + + Optimizer: "Postgres query optimizer"+ + Planning: + + Shared Hit Blocks: N + + Shared Read Blocks: N + + Shared Dirtied Blocks: N + + Shared Written Blocks: N + + Local Hit Blocks: N + + Local Read Blocks: N + + Local Dirtied Blocks: N + + Local Written Blocks: N + + Temp Read Blocks: N + + Temp Written Blocks: N + + Planning Time: N.N + + Triggers: + + Slice statistics: + + - Slice: N + + Executor Memory: N + + Execution Time: N.N +(1 row) + +select explain_filter('explain (buffers, format text) select * from int8_tbl i8'); + explain_filter +--------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) + Optimizer: Postgres query optimizer +(2 rows) + +select explain_filter('explain (buffers, format json) select * from int8_tbl i8'); + explain_filter +----------------------------------------------- + [ + + { + + "Plan": { + + "Node Type": "Seq Scan", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "int8_tbl", + + "Alias": "i8", + + "Startup Cost": N.N, + + "Total Cost": N.N, + + "Plan Rows": N, + + "Plan Width": N, + + "Shared Hit Blocks": N, + + "Shared Read Blocks": N, + + "Shared Dirtied Blocks": N, + + "Shared Written Blocks": N, + + "Local Hit Blocks": N, + + "Local Read Blocks": N, + + "Local Dirtied Blocks": N, + + "Local Written Blocks": N, + + "Temp Read Blocks": N, + + "Temp Written Blocks": N + + }, + + "Settings": { + + "Optimizer": "Postgres query optimizer"+ + }, + + "Planning": { + + "Shared Hit Blocks": N, + + "Shared Read Blocks": N, + + "Shared Dirtied Blocks": N, + + "Shared Written Blocks": N, + + "Local Hit Blocks": N, + + "Local Read Blocks": N, + + "Local Dirtied Blocks": N, + + "Local Written Blocks": N, + + "Temp Read Blocks": N, + + "Temp Written Blocks": N + + } + + } + + ] +(1 row) + +-- SETTINGS option +-- We have to ignore other settings that might be imposed by the environment, +-- so printing the whole Settings field unfortunately won't do. +begin; +set local plan_cache_mode = force_generic_plan; +select true as "OK" + from explain_filter('explain (settings) select * from int8_tbl i8') ln + where ln ~ '^ *Settings: .*plan_cache_mode = ''force_generic_plan'''; + OK +---- + t +(1 row) + +select explain_filter_to_json('explain (settings, format json) select * from int8_tbl i8') #> '{0,Settings,plan_cache_mode}'; + ?column? +---------------------- + "force_generic_plan" +(1 row) + +rollback; +-- +-- Test production of per-worker data +-- +-- Unfortunately, because we don't know how many worker processes we'll +-- actually get (maybe none at all), we can't examine the "Workers" output +-- in any detail. We can check that it parses correctly as JSON, and then +-- remove it from the displayed results. +begin; +-- encourage use of parallel plans +set parallel_setup_cost=0; +set parallel_tuple_cost=0; +set min_parallel_table_scan_size=0; +set max_parallel_workers_per_gather=4; +select jsonb_pretty( + explain_filter_to_json('explain (analyze, verbose, buffers, format json) + select * from tenk1 order by tenthous') + -- remove "Workers" node of the Seq Scan plan node + #- '{0,Plan,Plans,0,Plans,0,Workers}' + -- remove "Workers" node of the Sort plan node + #- '{0,Plan,Plans,0,Workers}' + -- Also remove its sort-type fields, as those aren't 100% stable + #- '{0,Plan,Plans,0,Sort Method}' + #- '{0,Plan,Plans,0,Sort Space Type}' +); + jsonb_pretty +------------------------------------------------------ + [ + + { + + "Plan": { + + "Plans": [ + + { + + "Alias": "tenk1", + + "Output": [ + + "unique1", + + "unique2", + + "two", + + "four", + + "ten", + + "twenty", + + "hundred", + + "thousand", + + "twothousand", + + "fivethous", + + "tenthous", + + "odd", + + "even", + + "stringu1", + + "stringu2", + + "string4" + + ], + + "Schema": "public", + + "Node Type": "Seq Scan", + + "Plan Rows": 0, + + "Plan Width": 0, + + "Total Cost": 0.0, + + "Actual Rows": 0, + + "Actual Loops": 0, + + "Startup Cost": 0.0, + + "Async Capable": false, + + "Relation Name": "tenk1", + + "Parallel Aware": false, + + "Local Hit Blocks": 0, + + "Temp Read Blocks": 0, + + "Actual Total Time": 0.0, + + "Local Read Blocks": 0, + + "Shared Hit Blocks": 0, + + "Shared Read Blocks": 0, + + "Actual Startup Time": 0.0, + + "Parent Relationship": "Outer", + + "Temp Written Blocks": 0, + + "Local Dirtied Blocks": 0, + + "Local Written Blocks": 0, + + "Shared Dirtied Blocks": 0, + + "Shared Written Blocks": 0 + + } + + ], + + "Output": [ + + "unique1", + + "unique2", + + "two", + + "four", + + "ten", + + "twenty", + + "hundred", + + "thousand", + + "twothousand", + + "fivethous", + + "tenthous", + + "odd", + + "even", + + "stringu1", + + "stringu2", + + "string4" + + ], + + "Sort Key": [ + + "tenk1.tenthous" + + ], + + "work_mem": { + + "Used": 0, + + "Segments": 0, + + "Max Memory": 0, + + "Workfile Spilling": 0, + + "Max Memory Segment": 0 + + }, + + "Node Type": "Sort", + + "Plan Rows": 0, + + "Plan Width": 0, + + "Total Cost": 0.0, + + "Actual Rows": 0, + + "Sort Method": "quicksort", + + "Actual Loops": 0, + + "Startup Cost": 0.0, + + "Async Capable": false, + + "Sort Segments": 0, + + "Parallel Aware": false, + + "Sort Space Type": "Memory", + + "Sort Space Used": 0, + + "Local Hit Blocks": 0, + + "Temp Read Blocks": 0, + + "Actual Total Time": 0.0, + + "Local Read Blocks": 0, + + "Shared Hit Blocks": 0, + + "Shared Read Blocks": 0, + + "Actual Startup Time": 0.0, + + "Temp Written Blocks": 0, + + "Local Dirtied Blocks": 0, + + "Local Written Blocks": 0, + + "Shared Dirtied Blocks": 0, + + "Shared Written Blocks": 0, + + "Sort Avg Segment Memory": 0, + + "Sort Max Segment Memory": 0 + + }, + + "Planning": { + + "Local Hit Blocks": 0, + + "Temp Read Blocks": 0, + + "Local Read Blocks": 0, + + "Shared Hit Blocks": 0, + + "Shared Read Blocks": 0, + + "Temp Written Blocks": 0, + + "Local Dirtied Blocks": 0, + + "Local Written Blocks": 0, + + "Shared Dirtied Blocks": 0, + + "Shared Written Blocks": 0 + + }, + + "Settings": { + + "Optimizer": "Postgres query optimizer",+ + "parallel_setup_cost": "0", + + "parallel_tuple_cost": "0", + + "min_parallel_table_scan_size": "0" + + }, + + "Triggers": [ + + ], + + "Planning Time": 0.0, + + "Execution Time": 0.0, + + "Slice statistics": [ + + { + + "Slice": 0, + + "Executor Memory": 0, + + "Work Maximum Memory": 0 + + } + + ], + + "Statement statistics": { + + "Memory used": 0 + + } + + } + + ] +(1 row) + +rollback; +set compute_query_id = on; +select explain_filter('explain (verbose) select * from int8_tbl i8'); + explain_filter +---------------------------------------------------------------- + Seq Scan on public.int8_tbl i8 (cost=N.N..N.N rows=N width=N) + Output: q1, q2 + Settings: optimizer = 'off' + Query Identifier: N + Optimizer: Postgres query optimizer +(5 rows) + diff --git a/src/test/singlenode_regress/expected/expressions.out b/src/test/singlenode_regress/expected/expressions.out new file mode 100644 index 00000000000..0f54c69ff95 --- /dev/null +++ b/src/test/singlenode_regress/expected/expressions.out @@ -0,0 +1,389 @@ +-- +-- expression evaluation tests that don't fit into a more specific file +-- +-- +-- Tests for SQLVAlueFunction +-- +-- current_date (always matches because of transactional behaviour) +SELECT date(now())::text = current_date::text; + ?column? +---------- + t +(1 row) + +-- current_time / localtime +SELECT now()::timetz::text = current_time::text; + ?column? +---------- + t +(1 row) + +SELECT now()::timetz(4)::text = current_time(4)::text; + ?column? +---------- + t +(1 row) + +SELECT now()::time::text = localtime::text; + ?column? +---------- + t +(1 row) + +SELECT now()::time(3)::text = localtime(3)::text; + ?column? +---------- + t +(1 row) + +-- current_timestamp / localtimestamp (always matches because of transactional behaviour) +SELECT current_timestamp = NOW(); + ?column? +---------- + t +(1 row) + +-- precision +SELECT length(current_timestamp::text) >= length(current_timestamp(0)::text); + ?column? +---------- + t +(1 row) + +-- localtimestamp +SELECT now()::timestamp::text = localtimestamp::text; + ?column? +---------- + t +(1 row) + +-- current_role/user/user is tested in rolnames.sql +-- current database / catalog +SELECT current_catalog = current_database(); + ?column? +---------- + t +(1 row) + +-- current_schema +SELECT current_schema; + current_schema +---------------- + public +(1 row) + +SET search_path = 'notme'; +SELECT current_schema; + current_schema +---------------- + +(1 row) + +SET search_path = 'pg_catalog'; +SELECT current_schema; + current_schema +---------------- + pg_catalog +(1 row) + +RESET search_path; +-- +-- Tests for BETWEEN +-- +explain (costs off) +select count(*) from date_tbl + where f1 between '1997-01-01' and '1998-01-01'; + QUERY PLAN +----------------------------------------------------------------------------- + Aggregate + -> Seq Scan on date_tbl + Filter: ((f1 >= '01-01-1997'::date) AND (f1 <= '01-01-1998'::date)) + Optimizer: Postgres query optimizer +(4 rows) + +select count(*) from date_tbl + where f1 between '1997-01-01' and '1998-01-01'; + count +------- + 3 +(1 row) + +explain (costs off) +select count(*) from date_tbl + where f1 not between '1997-01-01' and '1998-01-01'; + QUERY PLAN +-------------------------------------------------------------------------- + Aggregate + -> Seq Scan on date_tbl + Filter: ((f1 < '01-01-1997'::date) OR (f1 > '01-01-1998'::date)) + Optimizer: Postgres query optimizer +(4 rows) + +select count(*) from date_tbl + where f1 not between '1997-01-01' and '1998-01-01'; + count +------- + 13 +(1 row) + +explain (costs off) +select count(*) from date_tbl + where f1 between symmetric '1997-01-01' and '1998-01-01'; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + -> Seq Scan on date_tbl + Filter: (((f1 >= '01-01-1997'::date) AND (f1 <= '01-01-1998'::date)) OR ((f1 >= '01-01-1998'::date) AND (f1 <= '01-01-1997'::date))) + Optimizer: Postgres query optimizer +(4 rows) + +select count(*) from date_tbl + where f1 between symmetric '1997-01-01' and '1998-01-01'; + count +------- + 3 +(1 row) + +explain (costs off) +select count(*) from date_tbl + where f1 not between symmetric '1997-01-01' and '1998-01-01'; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + -> Seq Scan on date_tbl + Filter: (((f1 < '01-01-1997'::date) OR (f1 > '01-01-1998'::date)) AND ((f1 < '01-01-1998'::date) OR (f1 > '01-01-1997'::date))) + Optimizer: Postgres query optimizer +(4 rows) + +select count(*) from date_tbl + where f1 not between symmetric '1997-01-01' and '1998-01-01'; + count +------- + 13 +(1 row) + +-- +-- Test parsing of a no-op cast to a type with unspecified typmod +-- +begin; +create table numeric_tbl (f1 numeric(18,3), f2 numeric); +create view numeric_view as + select + f1, f1::numeric(16,4) as f1164, f1::numeric as f1n, + f2, f2::numeric(16,4) as f2164, f2::numeric as f2n + from numeric_tbl; +\d+ numeric_view + View "public.numeric_view" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------------+-----------+----------+---------+---------+------------- + f1 | numeric(18,3) | | | | main | + f1164 | numeric(16,4) | | | | main | + f1n | numeric | | | | main | + f2 | numeric | | | | main | + f2164 | numeric(16,4) | | | | main | + f2n | numeric | | | | main | +View definition: + SELECT numeric_tbl.f1, + numeric_tbl.f1::numeric(16,4) AS f1164, + numeric_tbl.f1::numeric AS f1n, + numeric_tbl.f2, + numeric_tbl.f2::numeric(16,4) AS f2164, + numeric_tbl.f2 AS f2n + FROM numeric_tbl; + +explain (verbose, costs off) select * from numeric_view; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------- + Seq Scan on public.numeric_tbl + Output: numeric_tbl.f1, (numeric_tbl.f1)::numeric(16,4), (numeric_tbl.f1)::numeric, numeric_tbl.f2, (numeric_tbl.f2)::numeric(16,4), numeric_tbl.f2 + Optimizer: Postgres query optimizer +(3 rows) + +-- bpchar, lacking planner support for its length coercion function, +-- could behave differently +create table bpchar_tbl (f1 character(16) unique, f2 bpchar); +create view bpchar_view as + select + f1, f1::character(14) as f114, f1::bpchar as f1n, + f2, f2::character(14) as f214, f2::bpchar as f2n + from bpchar_tbl; +\d+ bpchar_view + View "public.bpchar_view" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------------+-----------+----------+---------+----------+------------- + f1 | character(16) | | | | extended | + f114 | character(14) | | | | extended | + f1n | bpchar | | | | extended | + f2 | bpchar | | | | extended | + f214 | character(14) | | | | extended | + f2n | bpchar | | | | extended | +View definition: + SELECT bpchar_tbl.f1, + bpchar_tbl.f1::character(14) AS f114, + bpchar_tbl.f1::bpchar AS f1n, + bpchar_tbl.f2, + bpchar_tbl.f2::character(14) AS f214, + bpchar_tbl.f2 AS f2n + FROM bpchar_tbl; + +explain (verbose, costs off) select * from bpchar_view + where f1::bpchar = 'foo'; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------ + Index Scan using bpchar_tbl_f1_key on public.bpchar_tbl + Output: bpchar_tbl.f1, (bpchar_tbl.f1)::character(14), (bpchar_tbl.f1)::bpchar, bpchar_tbl.f2, (bpchar_tbl.f2)::character(14), bpchar_tbl.f2 + Index Cond: ((bpchar_tbl.f1)::bpchar = 'foo'::bpchar) + Optimizer: Postgres query optimizer +(4 rows) + +rollback; +-- +-- Ordinarily, IN/NOT IN can be converted to a ScalarArrayOpExpr +-- with a suitably-chosen array type. +-- +explain (verbose, costs off) +select random() IN (1, 4, 8.0); + QUERY PLAN +------------------------------------------------------------ + Result + Output: (random() = ANY ('{1,4,8}'::double precision[])) + Optimizer: Postgres query optimizer +(3 rows) + +explain (verbose, costs off) +select random()::int IN (1, 4, 8.0); + QUERY PLAN +--------------------------------------------------------------------------- + Result + Output: (((random())::integer)::numeric = ANY ('{1,4,8.0}'::numeric[])) + Optimizer: Postgres query optimizer +(3 rows) + +-- However, if there's not a common supertype for the IN elements, +-- we should instead try to produce "x = v1 OR x = v2 OR ...". +-- In most cases that'll fail for lack of all the requisite = operators, +-- but it can succeed sometimes. So this should complain about lack of +-- an = operator, not about cast failure. +select '(0,0)'::point in ('(0,0,0,0)'::box, point(0,0)); +ERROR: operator does not exist: point = box +LINE 1: select '(0,0)'::point in ('(0,0,0,0)'::box, point(0,0)); + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- +-- Tests for ScalarArrayOpExpr with a hashfn +-- +-- create a stable function so that the tests below are not +-- evaluated using the planner's constant folding. +begin; +create function return_int_input(int) returns int as $$ +begin + return $1; +end; +$$ language plpgsql stable; +create function return_text_input(text) returns text as $$ +begin + return $1; +end; +$$ language plpgsql stable; +select return_int_input(1) in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); + ?column? +---------- + t +(1 row) + +select return_int_input(1) in (10, 9, 2, 8, 3, 7, 4, 6, 5, null); + ?column? +---------- + +(1 row) + +select return_int_input(1) in (null, null, null, null, null, null, null, null, null, null, null); + ?column? +---------- + +(1 row) + +select return_int_input(1) in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1, null); + ?column? +---------- + t +(1 row) + +select return_int_input(null::int) in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); + ?column? +---------- + +(1 row) + +select return_int_input(null::int) in (10, 9, 2, 8, 3, 7, 4, 6, 5, null); + ?column? +---------- + +(1 row) + +select return_text_input('a') in ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'); + ?column? +---------- + t +(1 row) + +rollback; +-- Test with non-strict equality function. +-- We need to create our own type for this. +begin; +create type myint; +create function myintin(cstring) returns myint strict immutable language + internal as 'int4in'; +NOTICE: return type myint is only a shell +create function myintout(myint) returns cstring strict immutable language + internal as 'int4out'; +NOTICE: argument type myint is only a shell +create function myinthash(myint) returns integer strict immutable language + internal as 'hashint4'; +NOTICE: argument type myint is only a shell +create type myint (input = myintin, output = myintout, like = int4); +create cast (int4 as myint) without function; +create cast (myint as int4) without function; +create function myinteq(myint, myint) returns bool as $$ +begin + if $1 is null and $2 is null then + return true; + else + return $1::int = $2::int; + end if; +end; +$$ language plpgsql immutable; +create operator = ( + leftarg = myint, + rightarg = myint, + commutator = =, + negator = <>, + procedure = myinteq, + restrict = eqsel, + join = eqjoinsel, + merges +); +create operator class myint_ops +default for type myint using hash as + operator 1 = (myint, myint), + function 1 myinthash(myint); +create table inttest (a myint); +insert into inttest values(1::myint),(null); +-- try an array with enough elements to cause hashing +select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); + a +--- + 1 + +(2 rows) + +-- ensure the result matched with the non-hashed version. We simply remove +-- some array elements so that we don't reach the hashing threshold. +select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint, null); + a +--- + 1 + +(2 rows) + +rollback; diff --git a/src/test/singlenode_regress/expected/fast_default.out b/src/test/singlenode_regress/expected/fast_default.out new file mode 100644 index 00000000000..e0e4bfad384 --- /dev/null +++ b/src/test/singlenode_regress/expected/fast_default.out @@ -0,0 +1,849 @@ +-- +-- ALTER TABLE ADD COLUMN DEFAULT test +-- +SET search_path = fast_default; +CREATE SCHEMA fast_default; +CREATE TABLE m(id OID); +INSERT INTO m VALUES (NULL::OID); +CREATE FUNCTION set(tabname name) RETURNS VOID +AS $$ +BEGIN + UPDATE m + SET id = (SELECT c.relfilenode + FROM pg_class AS c, pg_namespace AS s + WHERE c.relname = tabname + AND c.relnamespace = s.oid + AND s.nspname = 'fast_default'); +END; +$$ LANGUAGE 'plpgsql'; +CREATE FUNCTION comp() RETURNS TEXT +AS $$ +BEGIN + RETURN (SELECT CASE + WHEN m.id = c.relfilenode THEN 'Unchanged' + ELSE 'Rewritten' + END + FROM m, pg_class AS c, pg_namespace AS s + WHERE c.relname = 't' + AND c.relnamespace = s.oid + AND s.nspname = 'fast_default'); +END; +$$ LANGUAGE 'plpgsql'; +CREATE FUNCTION log_rewrite() RETURNS event_trigger +LANGUAGE plpgsql as +$func$ + +declare + this_schema text; +begin + select into this_schema relnamespace::regnamespace::text + from pg_class + where oid = pg_event_trigger_table_rewrite_oid(); + if this_schema = 'fast_default' + then + RAISE NOTICE 'rewriting table % for reason %', + pg_event_trigger_table_rewrite_oid()::regclass, + pg_event_trigger_table_rewrite_reason(); + end if; +end; +$func$; +CREATE TABLE has_volatile AS +SELECT * FROM generate_series(1,10) id; +CREATE EVENT TRIGGER has_volatile_rewrite + ON table_rewrite + EXECUTE PROCEDURE log_rewrite(); +-- only the last of these should trigger a rewrite +ALTER TABLE has_volatile ADD col1 int; +ALTER TABLE has_volatile ADD col2 int DEFAULT 1; +ALTER TABLE has_volatile ADD col3 timestamptz DEFAULT current_timestamp; +ALTER TABLE has_volatile ADD col4 int DEFAULT (random() * 10000)::int; +NOTICE: rewriting table has_volatile for reason 2 +-- Test a large sample of different datatypes +CREATE TABLE T(pk INT NOT NULL PRIMARY KEY, c_int INT DEFAULT 1); +SELECT set('t'); + set +----- + +(1 row) + +INSERT INTO T VALUES (1), (2); +ALTER TABLE T ADD COLUMN c_bpchar BPCHAR(5) DEFAULT 'hello', + ALTER COLUMN c_int SET DEFAULT 2; +INSERT INTO T VALUES (3), (4); +ALTER TABLE T ADD COLUMN c_text TEXT DEFAULT 'world', + ALTER COLUMN c_bpchar SET DEFAULT 'dog'; +INSERT INTO T VALUES (5), (6); +ALTER TABLE T ADD COLUMN c_date DATE DEFAULT '2016-06-02', + ALTER COLUMN c_text SET DEFAULT 'cat'; +INSERT INTO T VALUES (7), (8); +ALTER TABLE T ADD COLUMN c_timestamp TIMESTAMP DEFAULT '2016-09-01 12:00:00', + ADD COLUMN c_timestamp_null TIMESTAMP, + ALTER COLUMN c_date SET DEFAULT '2010-01-01'; +INSERT INTO T VALUES (9), (10); +ALTER TABLE T ADD COLUMN c_array TEXT[] + DEFAULT '{"This", "is", "the", "real", "world"}', + ALTER COLUMN c_timestamp SET DEFAULT '1970-12-31 11:12:13', + ALTER COLUMN c_timestamp_null SET DEFAULT '2016-09-29 12:00:00'; +INSERT INTO T VALUES (11), (12); +ALTER TABLE T ADD COLUMN c_small SMALLINT DEFAULT -5, + ADD COLUMN c_small_null SMALLINT, + ALTER COLUMN c_array + SET DEFAULT '{"This", "is", "no", "fantasy"}'; +INSERT INTO T VALUES (13), (14); +ALTER TABLE T ADD COLUMN c_big BIGINT DEFAULT 180000000000018, + ALTER COLUMN c_small SET DEFAULT 9, + ALTER COLUMN c_small_null SET DEFAULT 13; +INSERT INTO T VALUES (15), (16); +ALTER TABLE T ADD COLUMN c_num NUMERIC DEFAULT 1.00000000001, + ALTER COLUMN c_big SET DEFAULT -9999999999999999; +INSERT INTO T VALUES (17), (18); +ALTER TABLE T ADD COLUMN c_time TIME DEFAULT '12:00:00', + ALTER COLUMN c_num SET DEFAULT 2.000000000000002; +INSERT INTO T VALUES (19), (20); +ALTER TABLE T ADD COLUMN c_interval INTERVAL DEFAULT '1 day', + ALTER COLUMN c_time SET DEFAULT '23:59:59'; +INSERT INTO T VALUES (21), (22); +ALTER TABLE T ADD COLUMN c_hugetext TEXT DEFAULT repeat('abcdefg',1000), + ALTER COLUMN c_interval SET DEFAULT '3 hours'; +INSERT INTO T VALUES (23), (24); +ALTER TABLE T ALTER COLUMN c_interval DROP DEFAULT, + ALTER COLUMN c_hugetext SET DEFAULT repeat('poiuyt', 1000); +INSERT INTO T VALUES (25), (26); +ALTER TABLE T ALTER COLUMN c_bpchar DROP DEFAULT, + ALTER COLUMN c_date DROP DEFAULT, + ALTER COLUMN c_text DROP DEFAULT, + ALTER COLUMN c_timestamp DROP DEFAULT, + ALTER COLUMN c_array DROP DEFAULT, + ALTER COLUMN c_small DROP DEFAULT, + ALTER COLUMN c_big DROP DEFAULT, + ALTER COLUMN c_num DROP DEFAULT, + ALTER COLUMN c_time DROP DEFAULT, + ALTER COLUMN c_hugetext DROP DEFAULT; +INSERT INTO T VALUES (27), (28); +SELECT pk, c_int, c_bpchar, c_text, c_date, c_timestamp, + c_timestamp_null, c_array, c_small, c_small_null, + c_big, c_num, c_time, c_interval, + c_hugetext = repeat('abcdefg',1000) as c_hugetext_origdef, + c_hugetext = repeat('poiuyt', 1000) as c_hugetext_newdef +FROM T ORDER BY pk; + pk | c_int | c_bpchar | c_text | c_date | c_timestamp | c_timestamp_null | c_array | c_small | c_small_null | c_big | c_num | c_time | c_interval | c_hugetext_origdef | c_hugetext_newdef +----+-------+----------+--------+------------+--------------------------+--------------------------+--------------------------+---------+--------------+-------------------+-------------------+----------+------------+--------------------+------------------- + 1 | 1 | hello | world | 06-02-2016 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 2 | 1 | hello | world | 06-02-2016 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 3 | 2 | hello | world | 06-02-2016 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 4 | 2 | hello | world | 06-02-2016 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 5 | 2 | dog | world | 06-02-2016 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 6 | 2 | dog | world | 06-02-2016 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 7 | 2 | dog | cat | 06-02-2016 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 8 | 2 | dog | cat | 06-02-2016 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 9 | 2 | dog | cat | 01-01-2010 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 10 | 2 | dog | cat | 01-01-2010 | Thu Sep 01 12:00:00 2016 | | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 11 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 12 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,the,real,world} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 13 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 14 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | -5 | | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 15 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 16 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | 180000000000018 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 17 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 18 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 1.00000000001 | 12:00:00 | @ 1 day | t | f + 19 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 2.000000000000002 | 12:00:00 | @ 1 day | t | f + 20 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 2.000000000000002 | 12:00:00 | @ 1 day | t | f + 21 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 2.000000000000002 | 23:59:59 | @ 1 day | t | f + 22 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 2.000000000000002 | 23:59:59 | @ 1 day | t | f + 23 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 2.000000000000002 | 23:59:59 | @ 3 hours | t | f + 24 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 2.000000000000002 | 23:59:59 | @ 3 hours | t | f + 25 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 2.000000000000002 | 23:59:59 | | f | t + 26 | 2 | dog | cat | 01-01-2010 | Thu Dec 31 11:12:13 1970 | Thu Sep 29 12:00:00 2016 | {This,is,no,fantasy} | 9 | 13 | -9999999999999999 | 2.000000000000002 | 23:59:59 | | f | t + 27 | 2 | | | | | Thu Sep 29 12:00:00 2016 | | | 13 | | | | | | + 28 | 2 | | | | | Thu Sep 29 12:00:00 2016 | | | 13 | | | | | | +(28 rows) + +SELECT comp(); + comp +----------- + Unchanged +(1 row) + +DROP TABLE T; +-- Test expressions in the defaults +CREATE OR REPLACE FUNCTION foo(a INT) RETURNS TEXT AS $$ +DECLARE res TEXT := ''; + i INT; +BEGIN + i := 0; + WHILE (i < a) LOOP + res := res || chr(ascii('a') + i); + i := i + 1; + END LOOP; + RETURN res; +END; $$ LANGUAGE PLPGSQL STABLE; +CREATE TABLE T(pk INT NOT NULL PRIMARY KEY, c_int INT DEFAULT LENGTH(foo(6))); +SELECT set('t'); + set +----- + +(1 row) + +INSERT INTO T VALUES (1), (2); +ALTER TABLE T ADD COLUMN c_bpchar BPCHAR(5) DEFAULT foo(4), + ALTER COLUMN c_int SET DEFAULT LENGTH(foo(8)); +INSERT INTO T VALUES (3), (4); +ALTER TABLE T ADD COLUMN c_text TEXT DEFAULT foo(6), + ALTER COLUMN c_bpchar SET DEFAULT foo(3); +INSERT INTO T VALUES (5), (6); +ALTER TABLE T ADD COLUMN c_date DATE + DEFAULT '2016-06-02'::DATE + LENGTH(foo(10)), + ALTER COLUMN c_text SET DEFAULT foo(12); +INSERT INTO T VALUES (7), (8); +ALTER TABLE T ADD COLUMN c_timestamp TIMESTAMP + DEFAULT '2016-09-01'::DATE + LENGTH(foo(10)), + ALTER COLUMN c_date + SET DEFAULT '2010-01-01'::DATE - LENGTH(foo(4)); +INSERT INTO T VALUES (9), (10); +ALTER TABLE T ADD COLUMN c_array TEXT[] + DEFAULT ('{"This", "is", "' || foo(4) || + '","the", "real", "world"}')::TEXT[], + ALTER COLUMN c_timestamp + SET DEFAULT '1970-12-31'::DATE + LENGTH(foo(30)); +INSERT INTO T VALUES (11), (12); +ALTER TABLE T ALTER COLUMN c_int DROP DEFAULT, + ALTER COLUMN c_array + SET DEFAULT ('{"This", "is", "' || foo(1) || + '", "fantasy"}')::text[]; +INSERT INTO T VALUES (13), (14); +ALTER TABLE T ALTER COLUMN c_bpchar DROP DEFAULT, + ALTER COLUMN c_date DROP DEFAULT, + ALTER COLUMN c_text DROP DEFAULT, + ALTER COLUMN c_timestamp DROP DEFAULT, + ALTER COLUMN c_array DROP DEFAULT; +INSERT INTO T VALUES (15), (16); +SELECT * FROM T; + pk | c_int | c_bpchar | c_text | c_date | c_timestamp | c_array +----+-------+----------+--------------+------------+--------------------------+------------------------------- + 1 | 6 | abcd | abcdef | 06-12-2016 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 2 | 6 | abcd | abcdef | 06-12-2016 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 3 | 8 | abcd | abcdef | 06-12-2016 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 4 | 8 | abcd | abcdef | 06-12-2016 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 5 | 8 | abc | abcdef | 06-12-2016 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 6 | 8 | abc | abcdef | 06-12-2016 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 7 | 8 | abc | abcdefghijkl | 06-12-2016 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 8 | 8 | abc | abcdefghijkl | 06-12-2016 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 9 | 8 | abc | abcdefghijkl | 12-28-2009 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 10 | 8 | abc | abcdefghijkl | 12-28-2009 | Sun Sep 11 00:00:00 2016 | {This,is,abcd,the,real,world} + 11 | 8 | abc | abcdefghijkl | 12-28-2009 | Sat Jan 30 00:00:00 1971 | {This,is,abcd,the,real,world} + 12 | 8 | abc | abcdefghijkl | 12-28-2009 | Sat Jan 30 00:00:00 1971 | {This,is,abcd,the,real,world} + 13 | | abc | abcdefghijkl | 12-28-2009 | Sat Jan 30 00:00:00 1971 | {This,is,a,fantasy} + 14 | | abc | abcdefghijkl | 12-28-2009 | Sat Jan 30 00:00:00 1971 | {This,is,a,fantasy} + 15 | | | | | | + 16 | | | | | | +(16 rows) + +SELECT comp(); + comp +----------- + Unchanged +(1 row) + +DROP TABLE T; +DROP FUNCTION foo(INT); +-- Fall back to full rewrite for volatile expressions +CREATE TABLE T(pk INT NOT NULL PRIMARY KEY); +INSERT INTO T VALUES (1); +SELECT set('t'); + set +----- + +(1 row) + +-- now() is stable, because it returns the transaction timestamp +ALTER TABLE T ADD COLUMN c1 TIMESTAMP DEFAULT now(); +SELECT comp(); + comp +----------- + Unchanged +(1 row) + +-- clock_timestamp() is volatile +ALTER TABLE T ADD COLUMN c2 TIMESTAMP DEFAULT clock_timestamp(); +NOTICE: rewriting table t for reason 2 +SELECT comp(); + comp +----------- + Rewritten +(1 row) + +DROP TABLE T; +-- Simple querie +CREATE TABLE T (pk INT NOT NULL PRIMARY KEY); +SELECT set('t'); + set +----- + +(1 row) + +INSERT INTO T SELECT * FROM generate_series(1, 10) a; +ALTER TABLE T ADD COLUMN c_bigint BIGINT NOT NULL DEFAULT -1; +INSERT INTO T SELECT b, b - 10 FROM generate_series(11, 20) a(b); +ALTER TABLE T ADD COLUMN c_text TEXT DEFAULT 'hello'; +INSERT INTO T SELECT b, b - 10, (b + 10)::text FROM generate_series(21, 30) a(b); +-- WHERE clause +SELECT c_bigint, c_text FROM T WHERE c_bigint = -1 LIMIT 1; + c_bigint | c_text +----------+-------- + -1 | hello +(1 row) + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) +SELECT c_bigint, c_text FROM T WHERE c_bigint = -1 LIMIT 1; + QUERY PLAN +---------------------------------------------- + Limit + Output: c_bigint, c_text + -> Seq Scan on fast_default.t + Output: c_bigint, c_text + Filter: (t.c_bigint = '-1'::integer) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT c_bigint, c_text FROM T WHERE c_text = 'hello' LIMIT 1; + c_bigint | c_text +----------+-------- + -1 | hello +(1 row) + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) SELECT c_bigint, c_text FROM T WHERE c_text = 'hello' LIMIT 1; + QUERY PLAN +-------------------------------------------- + Limit + Output: c_bigint, c_text + -> Seq Scan on fast_default.t + Output: c_bigint, c_text + Filter: (t.c_text = 'hello'::text) + Optimizer: Postgres query optimizer +(6 rows) + +-- COALESCE +SELECT COALESCE(c_bigint, pk), COALESCE(c_text, pk::text) +FROM T +ORDER BY pk LIMIT 10; + coalesce | coalesce +----------+---------- + -1 | hello + -1 | hello + -1 | hello + -1 | hello + -1 | hello + -1 | hello + -1 | hello + -1 | hello + -1 | hello + -1 | hello +(10 rows) + +-- Aggregate function +SELECT SUM(c_bigint), MAX(c_text COLLATE "C" ), MIN(c_text COLLATE "C") FROM T; + sum | max | min +-----+-------+----- + 200 | hello | 31 +(1 row) + +-- ORDER BY +SELECT * FROM T ORDER BY c_bigint, c_text, pk LIMIT 10; + pk | c_bigint | c_text +----+----------+-------- + 1 | -1 | hello + 2 | -1 | hello + 3 | -1 | hello + 4 | -1 | hello + 5 | -1 | hello + 6 | -1 | hello + 7 | -1 | hello + 8 | -1 | hello + 9 | -1 | hello + 10 | -1 | hello +(10 rows) + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) +SELECT * FROM T ORDER BY c_bigint, c_text, pk LIMIT 10; + QUERY PLAN +---------------------------------------------- + Limit + Output: pk, c_bigint, c_text + -> Sort + Output: pk, c_bigint, c_text + Sort Key: t.c_bigint, t.c_text, t.pk + -> Seq Scan on fast_default.t + Output: pk, c_bigint, c_text + Optimizer: Postgres query optimizer +(8 rows) + +-- LIMIT +SELECT * FROM T WHERE c_bigint > -1 ORDER BY c_bigint, c_text, pk LIMIT 10; + pk | c_bigint | c_text +----+----------+-------- + 11 | 1 | hello + 12 | 2 | hello + 13 | 3 | hello + 14 | 4 | hello + 15 | 5 | hello + 16 | 6 | hello + 17 | 7 | hello + 18 | 8 | hello + 19 | 9 | hello + 20 | 10 | hello +(10 rows) + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) +SELECT * FROM T WHERE c_bigint > -1 ORDER BY c_bigint, c_text, pk LIMIT 10; + QUERY PLAN +---------------------------------------------------- + Limit + Output: pk, c_bigint, c_text + -> Sort + Output: pk, c_bigint, c_text + Sort Key: t.c_bigint, t.c_text, t.pk + -> Seq Scan on fast_default.t + Output: pk, c_bigint, c_text + Filter: (t.c_bigint > '-1'::integer) + Optimizer: Postgres query optimizer +(9 rows) + +-- DELETE with RETURNING +DELETE FROM T WHERE pk BETWEEN 10 AND 20 RETURNING *; + pk | c_bigint | c_text +----+----------+-------- + 10 | -1 | hello + 11 | 1 | hello + 12 | 2 | hello + 13 | 3 | hello + 14 | 4 | hello + 15 | 5 | hello + 16 | 6 | hello + 17 | 7 | hello + 18 | 8 | hello + 19 | 9 | hello + 20 | 10 | hello +(11 rows) + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) +DELETE FROM T WHERE pk BETWEEN 10 AND 20 RETURNING *; + QUERY PLAN +----------------------------------------------------------- + Delete on fast_default.t + Output: pk, c_bigint, c_text + -> Bitmap Heap Scan on fast_default.t + Output: ctid, gp_segment_id + Recheck Cond: ((t.pk >= 10) AND (t.pk <= 20)) + -> Bitmap Index Scan on t_pkey + Index Cond: ((t.pk >= 10) AND (t.pk <= 20)) + Optimizer: Postgres query optimizer +(8 rows) + +-- UPDATE +UPDATE T SET c_text = '"' || c_text || '"' WHERE pk < 10; +SELECT * FROM T WHERE c_text LIKE '"%"' ORDER BY PK; + pk | c_bigint | c_text +----+----------+--------- + 1 | -1 | "hello" + 2 | -1 | "hello" + 3 | -1 | "hello" + 4 | -1 | "hello" + 5 | -1 | "hello" + 6 | -1 | "hello" + 7 | -1 | "hello" + 8 | -1 | "hello" + 9 | -1 | "hello" +(9 rows) + +SELECT comp(); + comp +----------- + Unchanged +(1 row) + +DROP TABLE T; +-- Combine with other DDL +CREATE TABLE T(pk INT NOT NULL PRIMARY KEY); +SELECT set('t'); + set +----- + +(1 row) + +INSERT INTO T VALUES (1), (2); +ALTER TABLE T ADD COLUMN c_int INT NOT NULL DEFAULT -1; +INSERT INTO T VALUES (3), (4); +ALTER TABLE T ADD COLUMN c_text TEXT DEFAULT 'Hello'; +INSERT INTO T VALUES (5), (6); +ALTER TABLE T ALTER COLUMN c_text SET DEFAULT 'world', + ALTER COLUMN c_int SET DEFAULT 1; +INSERT INTO T VALUES (7), (8); +SELECT * FROM T ORDER BY pk; + pk | c_int | c_text +----+-------+-------- + 1 | -1 | Hello + 2 | -1 | Hello + 3 | -1 | Hello + 4 | -1 | Hello + 5 | -1 | Hello + 6 | -1 | Hello + 7 | 1 | world + 8 | 1 | world +(8 rows) + +-- Add an index +CREATE INDEX i ON T(c_int, c_text); +SELECT c_text FROM T WHERE c_int = -1; + c_text +-------- + Hello + Hello + Hello + Hello + Hello + Hello +(6 rows) + +SELECT comp(); + comp +----------- + Unchanged +(1 row) + +-- query to exercise expand_tuple function +CREATE TABLE t1 AS +SELECT 1::int AS a , 2::int AS b +FROM generate_series(1,20) q; +ALTER TABLE t1 ADD COLUMN c text; +SELECT a, + stddev(cast((SELECT sum(1) FROM generate_series(1,20) x) AS float4)) + OVER (PARTITION BY a,b,c ORDER BY b) + AS z +FROM t1; + a | z +---+--- + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 +(20 rows) + +DROP TABLE T; +-- test that we account for missing columns without defaults correctly +-- in expand_tuple, and that rows are correctly expanded for triggers +CREATE FUNCTION test_trigger() +RETURNS trigger +LANGUAGE plpgsql +AS $$ + +begin + raise notice 'old tuple: %', to_json(OLD)::text; + if TG_OP = 'DELETE' + then + return OLD; + else + return NEW; + end if; +end; + +$$; +-- 2 new columns, both have defaults +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,3); +ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4; +ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | 3 | 4 | 5 +(1 row) + +UPDATE t SET y = 2; +NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":3,"x":4,"y":5} +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | 3 | 4 | 2 +(1 row) + +DROP TABLE t; +-- 2 new columns, first has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,3); +ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4; +ALTER TABLE t ADD COLUMN y int; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | 3 | 4 | +(1 row) + +UPDATE t SET y = 2; +NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":3,"x":4,"y":null} +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | 3 | 4 | 2 +(1 row) + +DROP TABLE t; +-- 2 new columns, second has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,3); +ALTER TABLE t ADD COLUMN x int; +ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | 3 | | 5 +(1 row) + +UPDATE t SET y = 2; +NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":3,"x":null,"y":5} +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | 3 | | 2 +(1 row) + +DROP TABLE t; +-- 2 new columns, neither has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,3); +ALTER TABLE t ADD COLUMN x int; +ALTER TABLE t ADD COLUMN y int; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | 3 | | +(1 row) + +UPDATE t SET y = 2; +NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":3,"x":null,"y":null} +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | 3 | | 2 +(1 row) + +DROP TABLE t; +-- same as last 4 tests but here the last original column has a NULL value +-- 2 new columns, both have defaults +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,NULL); +ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4; +ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | | 4 | 5 +(1 row) + +UPDATE t SET y = 2; +NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":null,"x":4,"y":5} +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | | 4 | 2 +(1 row) + +DROP TABLE t; +-- 2 new columns, first has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,NULL); +ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4; +ALTER TABLE t ADD COLUMN y int; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | | 4 | +(1 row) + +UPDATE t SET y = 2; +NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":null,"x":4,"y":null} +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | | 4 | 2 +(1 row) + +DROP TABLE t; +-- 2 new columns, second has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,NULL); +ALTER TABLE t ADD COLUMN x int; +ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | | | 5 +(1 row) + +UPDATE t SET y = 2; +NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":null,"x":null,"y":5} +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | | | 2 +(1 row) + +DROP TABLE t; +-- 2 new columns, neither has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,NULL); +ALTER TABLE t ADD COLUMN x int; +ALTER TABLE t ADD COLUMN y int; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | | | +(1 row) + +UPDATE t SET y = 2; +NOTICE: old tuple: {"id":1,"a":1,"b":2,"c":null,"x":null,"y":null} +SELECT * FROM t; + id | a | b | c | x | y +----+---+---+---+---+--- + 1 | 1 | 2 | | | 2 +(1 row) + +DROP TABLE t; +-- make sure expanded tuple has correct self pointer +-- it will be required by the RI trigger doing the cascading delete +CREATE TABLE leader (a int PRIMARY KEY, b int); +CREATE TABLE follower (a int REFERENCES leader ON DELETE CASCADE, b int); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO leader VALUES (1, 1), (2, 2); +ALTER TABLE leader ADD c int; +ALTER TABLE leader DROP c; +DELETE FROM leader; +-- check that ALTER TABLE ... ALTER TYPE does the right thing +CREATE TABLE vtype( a integer); +INSERT INTO vtype VALUES (1); +ALTER TABLE vtype ADD COLUMN b DOUBLE PRECISION DEFAULT 0.2; +ALTER TABLE vtype ADD COLUMN c BOOLEAN DEFAULT true; +SELECT * FROM vtype; + a | b | c +---+-----+--- + 1 | 0.2 | t +(1 row) + +ALTER TABLE vtype + ALTER b TYPE text USING b::text, + ALTER c TYPE text USING c::text; +NOTICE: rewriting table vtype for reason 4 +SELECT * FROM vtype; + a | b | c +---+-----+------ + 1 | 0.2 | true +(1 row) + +-- also check the case that doesn't rewrite the table +CREATE TABLE vtype2 (a int); +INSERT INTO vtype2 VALUES (1); +ALTER TABLE vtype2 ADD COLUMN b varchar(10) DEFAULT 'xxx'; +ALTER TABLE vtype2 ALTER COLUMN b SET DEFAULT 'yyy'; +INSERT INTO vtype2 VALUES (2); +ALTER TABLE vtype2 ALTER COLUMN b TYPE varchar(20) USING b::varchar(20); +SELECT * FROM vtype2; + a | b +---+----- + 1 | xxx + 2 | yyy +(2 rows) + +-- Ensure that defaults are checked when evaluating whether HOT update +-- is possible, this was broken for a while: +-- https://postgr.es/m/20190202133521.ylauh3ckqa7colzj%40alap3.anarazel.de +BEGIN; +CREATE TABLE t(); +INSERT INTO t DEFAULT VALUES; +ALTER TABLE t ADD COLUMN a int DEFAULT 1; +CREATE INDEX ON t(a); +-- set column with a default 1 to NULL, due to a bug that wasn't +-- noticed has heap_getattr buggily returned NULL for default columns +UPDATE t SET a = NULL; +-- verify that index and non-index scans show the same result +SET LOCAL enable_seqscan = true; +SELECT * FROM t WHERE a IS NULL; + a +--- + +(1 row) + +SET LOCAL enable_seqscan = false; +SELECT * FROM t WHERE a IS NULL; + a +--- + +(1 row) + +ROLLBACK; +-- verify that a default set on a non-plain table doesn't set a missing +-- value on the attribute +CREATE FOREIGN DATA WRAPPER dummy; +CREATE SERVER s0 FOREIGN DATA WRAPPER dummy; +CREATE FOREIGN TABLE ft1 (c1 integer NOT NULL) SERVER s0; +ALTER FOREIGN TABLE ft1 ADD COLUMN c8 integer DEFAULT 0; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE char(10); +SELECT count(*) + FROM pg_attribute + WHERE attrelid = 'ft1'::regclass AND + (attmissingval IS NOT NULL OR atthasmissing); + count +------- + 0 +(1 row) + +-- cleanup +DROP FOREIGN TABLE ft1; +DROP SERVER s0; +DROP FOREIGN DATA WRAPPER dummy; +DROP TABLE vtype; +DROP TABLE vtype2; +DROP TABLE follower; +DROP TABLE leader; +DROP FUNCTION test_trigger(); +DROP TABLE t1; +DROP FUNCTION set(name); +DROP FUNCTION comp(); +DROP TABLE m; +DROP TABLE has_volatile; +DROP EVENT TRIGGER has_volatile_rewrite; +DROP FUNCTION log_rewrite; +DROP SCHEMA fast_default; +-- Leave a table with an active fast default in place, for pg_upgrade testing +set search_path = public; +create table has_fast_default(f1 int); +insert into has_fast_default values(1); +alter table has_fast_default add column f2 int default 42; +table has_fast_default; + f1 | f2 +----+---- + 1 | 42 +(1 row) + diff --git a/src/test/singlenode_regress/expected/float4-misrounded-input.out b/src/test/singlenode_regress/expected/float4-misrounded-input.out new file mode 100644 index 00000000000..3d5d298b73a --- /dev/null +++ b/src/test/singlenode_regress/expected/float4-misrounded-input.out @@ -0,0 +1,961 @@ +-- +-- FLOAT4 +-- +CREATE TABLE FLOAT4_TBL (f1 float4); +INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 '); +INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 '); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20'); +-- test for over and under flow +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'); +ERROR: "10e70" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'); +ERROR: "-10e70" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'); +ERROR: "10e-70" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'); +ERROR: "-10e-70" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8); +ERROR: value out of range: overflow +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8); +ERROR: value out of range: overflow +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8); +ERROR: value out of range: underflow +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8); +ERROR: value out of range: underflow +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400'); +ERROR: "10e400" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400'); +ERROR: "-10e400" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400'); +ERROR: "10e-400" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400'); +ERROR: "-10e-400" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400'); + ^ +-- bad input +INSERT INTO FLOAT4_TBL(f1) VALUES (''); +ERROR: invalid input syntax for type real: "" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES (''); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES (' '); +ERROR: invalid input syntax for type real: " " +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES (' '); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz'); +ERROR: invalid input syntax for type real: "xyz" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0'); +ERROR: invalid input syntax for type real: "5.0.0" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0'); +ERROR: invalid input syntax for type real: "5 . 0" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0'); +ERROR: invalid input syntax for type real: "5. 0" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0'); +ERROR: invalid input syntax for type real: " - 3.0" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5'); +ERROR: invalid input syntax for type real: "123 5" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5'); + ^ +-- special inputs +SELECT 'NaN'::float4; + float4 +-------- + NaN +(1 row) + +SELECT 'nan'::float4; + float4 +-------- + NaN +(1 row) + +SELECT ' NAN '::float4; + float4 +-------- + NaN +(1 row) + +SELECT 'infinity'::float4; + float4 +---------- + Infinity +(1 row) + +SELECT ' -INFINiTY '::float4; + float4 +----------- + -Infinity +(1 row) + +-- bad special inputs +SELECT 'N A N'::float4; +ERROR: invalid input syntax for type real: "N A N" +LINE 1: SELECT 'N A N'::float4; + ^ +SELECT 'NaN x'::float4; +ERROR: invalid input syntax for type real: "NaN x" +LINE 1: SELECT 'NaN x'::float4; + ^ +SELECT ' INFINITY x'::float4; +ERROR: invalid input syntax for type real: " INFINITY x" +LINE 1: SELECT ' INFINITY x'::float4; + ^ +SELECT 'Infinity'::float4 + 100.0; + ?column? +---------- + Infinity +(1 row) + +SELECT 'Infinity'::float4 / 'Infinity'::float4; + ?column? +---------- + NaN +(1 row) + +SELECT '42'::float4 / 'Infinity'::float4; + ?column? +---------- + 0 +(1 row) + +SELECT 'nan'::float4 / 'nan'::float4; + ?column? +---------- + NaN +(1 row) + +SELECT 'nan'::float4 / '0'::float4; + ?column? +---------- + NaN +(1 row) + +SELECT 'nan'::numeric::float4; + float4 +-------- + NaN +(1 row) + +SELECT * FROM FLOAT4_TBL; + f1 +--------------- + 0 + 1004.3 + -34.84 + 1.2345679e+20 + 1.2345679e-20 +(5 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3'; + f1 +--------------- + 0 + -34.84 + 1.2345679e+20 + 1.2345679e-20 +(4 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3'; + f1 +-------- + 1004.3 +(1 row) + +SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1; + f1 +--------------- + 0 + -34.84 + 1.2345679e-20 +(3 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3'; + f1 +--------------- + 0 + -34.84 + 1.2345679e-20 +(3 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1; + f1 +--------------- + 0 + 1004.3 + -34.84 + 1.2345679e-20 +(4 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3'; + f1 +--------------- + 0 + 1004.3 + -34.84 + 1.2345679e-20 +(4 rows) + +SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + f1 | x +---------------+---------------- + 1004.3 | -10043 + 1.2345679e+20 | -1.2345678e+21 + 1.2345679e-20 | -1.2345678e-19 +(3 rows) + +SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + f1 | x +---------------+--------------- + 1004.3 | 994.3 + 1.2345679e+20 | 1.2345679e+20 + 1.2345679e-20 | -10 +(3 rows) + +SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + f1 | x +---------------+---------------- + 1004.3 | -100.43 + 1.2345679e+20 | -1.2345679e+19 + 1.2345679e-20 | -1.2345679e-21 +(3 rows) + +SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + f1 | x +---------------+--------------- + 1004.3 | 1014.3 + 1.2345679e+20 | 1.2345679e+20 + 1.2345679e-20 | 10 +(3 rows) + +-- test divide by zero +SELECT f.f1 / '0.0' from FLOAT4_TBL f; +ERROR: division by zero +SELECT * FROM FLOAT4_TBL; + f1 +--------------- + 0 + 1004.3 + -34.84 + 1.2345679e+20 + 1.2345679e-20 +(5 rows) + +-- test the unary float4abs operator +SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f; + f1 | abs_f1 +---------------+--------------- + 0 | 0 + 1004.3 | 1004.3 + -34.84 | 34.84 + 1.2345679e+20 | 1.2345679e+20 + 1.2345679e-20 | 1.2345679e-20 +(5 rows) + +UPDATE FLOAT4_TBL + SET f1 = FLOAT4_TBL.f1 * '-1' + WHERE FLOAT4_TBL.f1 > '0.0'; +SELECT * FROM FLOAT4_TBL; + f1 +---------------- + 0 + -34.84 + -1004.3 + -1.2345679e+20 + -1.2345679e-20 +(5 rows) + +-- test edge-case coercions to integer +SELECT '32767.4'::float4::int2; + int2 +------- + 32767 +(1 row) + +SELECT '32767.6'::float4::int2; +ERROR: smallint out of range +SELECT '-32768.4'::float4::int2; + int2 +-------- + -32768 +(1 row) + +SELECT '-32768.6'::float4::int2; +ERROR: smallint out of range +SELECT '2147483520'::float4::int4; + int4 +------------ + 2147483520 +(1 row) + +SELECT '2147483647'::float4::int4; +ERROR: integer out of range +SELECT '-2147483648.5'::float4::int4; + int4 +------------- + -2147483648 +(1 row) + +SELECT '-2147483900'::float4::int4; +ERROR: integer out of range +SELECT '9223369837831520256'::float4::int8; + int8 +--------------------- + 9223369837831520256 +(1 row) + +SELECT '9223372036854775807'::float4::int8; +ERROR: bigint out of range +SELECT '-9223372036854775808.5'::float4::int8; + int8 +---------------------- + -9223372036854775808 +(1 row) + +SELECT '-9223380000000000000'::float4::int8; +ERROR: bigint out of range +-- Test for correct input rounding in edge cases. +-- These lists are from Paxson 1991, excluding subnormals and +-- inputs of over 9 sig. digits. +SELECT float4send('5e-20'::float4); + float4send +------------ + \x1f6c1e4a +(1 row) + +SELECT float4send('67e14'::float4); + float4send +------------ + \x59be6cea +(1 row) + +SELECT float4send('985e15'::float4); + float4send +------------ + \x5d5ab6c4 +(1 row) + +SELECT float4send('55895e-16'::float4); + float4send +------------ + \x2cc4a9bd +(1 row) + +SELECT float4send('7038531e-32'::float4); + float4send +------------ + \x15ae43fe +(1 row) + +SELECT float4send('702990899e-20'::float4); + float4send +------------ + \x2cf757ca +(1 row) + +SELECT float4send('3e-23'::float4); + float4send +------------ + \x1a111234 +(1 row) + +SELECT float4send('57e18'::float4); + float4send +------------ + \x6045c22c +(1 row) + +SELECT float4send('789e-35'::float4); + float4send +------------ + \x0a23de70 +(1 row) + +SELECT float4send('2539e-18'::float4); + float4send +------------ + \x2736f449 +(1 row) + +SELECT float4send('76173e28'::float4); + float4send +------------ + \x7616398a +(1 row) + +SELECT float4send('887745e-11'::float4); + float4send +------------ + \x3714f05c +(1 row) + +SELECT float4send('5382571e-37'::float4); + float4send +------------ + \x0d2eaca7 +(1 row) + +SELECT float4send('82381273e-35'::float4); + float4send +------------ + \x128289d0 +(1 row) + +SELECT float4send('750486563e-38'::float4); + float4send +------------ + \x0f18377e +(1 row) + +-- Test that the smallest possible normalized input value inputs +-- correctly, either in 9-significant-digit or shortest-decimal +-- format. +-- +-- exact val is 1.1754943508... +-- shortest val is 1.1754944000 +-- midpoint to next val is 1.1754944208... +SELECT float4send('1.17549435e-38'::float4); + float4send +------------ + \x00800000 +(1 row) + +SELECT float4send('1.1754944e-38'::float4); + float4send +------------ + \x00800000 +(1 row) + +-- test output (and round-trip safety) of various values. +-- To ensure we're testing what we think we're testing, start with +-- float values specified by bit patterns (as a useful side effect, +-- this means we'll fail on non-IEEE platforms). +create type xfloat4; +create function xfloat4in(cstring) returns xfloat4 immutable strict + language internal as 'int4in'; +NOTICE: return type xfloat4 is only a shell +create function xfloat4out(xfloat4) returns cstring immutable strict + language internal as 'int4out'; +NOTICE: argument type xfloat4 is only a shell +create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4); +create cast (xfloat4 as float4) without function; +create cast (float4 as xfloat4) without function; +create cast (xfloat4 as integer) without function; +create cast (integer as xfloat4) without function; +-- float4: seeeeeee emmmmmmm mmmmmmmm mmmmmmmm +-- we don't care to assume the platform's strtod() handles subnormals +-- correctly; those are "use at your own risk". However we do test +-- subnormal outputs, since those are under our control. +with testdata(bits) as (values + -- small subnormals + (x'00000001'), + (x'00000002'), (x'00000003'), + (x'00000010'), (x'00000011'), (x'00000100'), (x'00000101'), + (x'00004000'), (x'00004001'), (x'00080000'), (x'00080001'), + -- stress values + (x'0053c4f4'), -- 7693e-42 + (x'006c85c4'), -- 996622e-44 + (x'0041ca76'), -- 60419369e-46 + (x'004b7678'), -- 6930161142e-48 + -- taken from upstream testsuite + (x'00000007'), + (x'00424fe2'), + -- borderline between subnormal and normal + (x'007ffff0'), (x'007ffff1'), (x'007ffffe'), (x'007fffff')) +select float4send(flt) as ibits, + flt + from (select bits::integer::xfloat4::float4 as flt + from testdata + offset 0) s; + ibits | flt +------------+--------------- + \x00000001 | 1e-45 + \x00000002 | 3e-45 + \x00000003 | 4e-45 + \x00000010 | 2.2e-44 + \x00000011 | 2.4e-44 + \x00000100 | 3.59e-43 + \x00000101 | 3.6e-43 + \x00004000 | 2.2959e-41 + \x00004001 | 2.296e-41 + \x00080000 | 7.34684e-40 + \x00080001 | 7.34685e-40 + \x0053c4f4 | 7.693e-39 + \x006c85c4 | 9.96622e-39 + \x0041ca76 | 6.041937e-39 + \x004b7678 | 6.930161e-39 + \x00000007 | 1e-44 + \x00424fe2 | 6.0898e-39 + \x007ffff0 | 1.1754921e-38 + \x007ffff1 | 1.1754922e-38 + \x007ffffe | 1.1754941e-38 + \x007fffff | 1.1754942e-38 +(21 rows) + +with testdata(bits) as (values + (x'00000000'), + -- smallest normal values + (x'00800000'), (x'00800001'), (x'00800004'), (x'00800005'), + (x'00800006'), + -- small normal values chosen for short vs. long output + (x'008002f1'), (x'008002f2'), (x'008002f3'), + (x'00800e17'), (x'00800e18'), (x'00800e19'), + -- assorted values (random mantissae) + (x'01000001'), (x'01102843'), (x'01a52c98'), + (x'0219c229'), (x'02e4464d'), (x'037343c1'), (x'03a91b36'), + (x'047ada65'), (x'0496fe87'), (x'0550844f'), (x'05999da3'), + (x'060ea5e2'), (x'06e63c45'), (x'07f1e548'), (x'0fc5282b'), + (x'1f850283'), (x'2874a9d6'), + -- values around 5e-08 + (x'3356bf94'), (x'3356bf95'), (x'3356bf96'), + -- around 1e-07 + (x'33d6bf94'), (x'33d6bf95'), (x'33d6bf96'), + -- around 3e-07 .. 1e-04 + (x'34a10faf'), (x'34a10fb0'), (x'34a10fb1'), + (x'350637bc'), (x'350637bd'), (x'350637be'), + (x'35719786'), (x'35719787'), (x'35719788'), + (x'358637bc'), (x'358637bd'), (x'358637be'), + (x'36a7c5ab'), (x'36a7c5ac'), (x'36a7c5ad'), + (x'3727c5ab'), (x'3727c5ac'), (x'3727c5ad'), + -- format crossover at 1e-04 + (x'38d1b714'), (x'38d1b715'), (x'38d1b716'), + (x'38d1b717'), (x'38d1b718'), (x'38d1b719'), + (x'38d1b71a'), (x'38d1b71b'), (x'38d1b71c'), + (x'38d1b71d'), + -- + (x'38dffffe'), (x'38dfffff'), (x'38e00000'), + (x'38efffff'), (x'38f00000'), (x'38f00001'), + (x'3a83126e'), (x'3a83126f'), (x'3a831270'), + (x'3c23d709'), (x'3c23d70a'), (x'3c23d70b'), + (x'3dcccccc'), (x'3dcccccd'), (x'3dccccce'), + -- chosen to need 9 digits for 3dcccd70 + (x'3dcccd6f'), (x'3dcccd70'), (x'3dcccd71'), + -- + (x'3effffff'), (x'3f000000'), (x'3f000001'), + (x'3f333332'), (x'3f333333'), (x'3f333334'), + -- approach 1.0 with increasing numbers of 9s + (x'3f666665'), (x'3f666666'), (x'3f666667'), + (x'3f7d70a3'), (x'3f7d70a4'), (x'3f7d70a5'), + (x'3f7fbe76'), (x'3f7fbe77'), (x'3f7fbe78'), + (x'3f7ff971'), (x'3f7ff972'), (x'3f7ff973'), + (x'3f7fff57'), (x'3f7fff58'), (x'3f7fff59'), + (x'3f7fffee'), (x'3f7fffef'), + -- values very close to 1 + (x'3f7ffff0'), (x'3f7ffff1'), (x'3f7ffff2'), + (x'3f7ffff3'), (x'3f7ffff4'), (x'3f7ffff5'), + (x'3f7ffff6'), (x'3f7ffff7'), (x'3f7ffff8'), + (x'3f7ffff9'), (x'3f7ffffa'), (x'3f7ffffb'), + (x'3f7ffffc'), (x'3f7ffffd'), (x'3f7ffffe'), + (x'3f7fffff'), + (x'3f800000'), + (x'3f800001'), (x'3f800002'), (x'3f800003'), + (x'3f800004'), (x'3f800005'), (x'3f800006'), + (x'3f800007'), (x'3f800008'), (x'3f800009'), + -- values 1 to 1.1 + (x'3f80000f'), (x'3f800010'), (x'3f800011'), + (x'3f800012'), (x'3f800013'), (x'3f800014'), + (x'3f800017'), (x'3f800018'), (x'3f800019'), + (x'3f80001a'), (x'3f80001b'), (x'3f80001c'), + (x'3f800029'), (x'3f80002a'), (x'3f80002b'), + (x'3f800053'), (x'3f800054'), (x'3f800055'), + (x'3f800346'), (x'3f800347'), (x'3f800348'), + (x'3f8020c4'), (x'3f8020c5'), (x'3f8020c6'), + (x'3f8147ad'), (x'3f8147ae'), (x'3f8147af'), + (x'3f8ccccc'), (x'3f8ccccd'), (x'3f8cccce'), + -- + (x'3fc90fdb'), -- pi/2 + (x'402df854'), -- e + (x'40490fdb'), -- pi + -- + (x'409fffff'), (x'40a00000'), (x'40a00001'), + (x'40afffff'), (x'40b00000'), (x'40b00001'), + (x'411fffff'), (x'41200000'), (x'41200001'), + (x'42c7ffff'), (x'42c80000'), (x'42c80001'), + (x'4479ffff'), (x'447a0000'), (x'447a0001'), + (x'461c3fff'), (x'461c4000'), (x'461c4001'), + (x'47c34fff'), (x'47c35000'), (x'47c35001'), + (x'497423ff'), (x'49742400'), (x'49742401'), + (x'4b18967f'), (x'4b189680'), (x'4b189681'), + (x'4cbebc1f'), (x'4cbebc20'), (x'4cbebc21'), + (x'4e6e6b27'), (x'4e6e6b28'), (x'4e6e6b29'), + (x'501502f8'), (x'501502f9'), (x'501502fa'), + (x'51ba43b6'), (x'51ba43b7'), (x'51ba43b8'), + -- stress values + (x'1f6c1e4a'), -- 5e-20 + (x'59be6cea'), -- 67e14 + (x'5d5ab6c4'), -- 985e15 + (x'2cc4a9bd'), -- 55895e-16 + (x'15ae43fd'), -- 7038531e-32 + (x'2cf757ca'), -- 702990899e-20 + (x'665ba998'), -- 25933168707e13 + (x'743c3324'), -- 596428896559e20 + -- exercise fixed-point memmoves + (x'47f1205a'), + (x'4640e6ae'), + (x'449a5225'), + (x'42f6e9d5'), + (x'414587dd'), + (x'3f9e064b'), + -- these cases come from the upstream's testsuite + -- BoundaryRoundEven + (x'4c000004'), + (x'50061c46'), + (x'510006a8'), + -- ExactValueRoundEven + (x'48951f84'), + (x'45fd1840'), + -- LotsOfTrailingZeros + (x'39800000'), + (x'3b200000'), + (x'3b900000'), + (x'3bd00000'), + -- Regression + (x'63800000'), + (x'4b000000'), + (x'4b800000'), + (x'4c000001'), + (x'4c800b0d'), + (x'00d24584'), + (x'00d90b88'), + (x'45803f34'), + (x'4f9f24f7'), + (x'3a8722c3'), + (x'5c800041'), + (x'15ae43fd'), + (x'5d4cccfb'), + (x'4c800001'), + (x'57800ed8'), + (x'5f000000'), + (x'700000f0'), + (x'5f23e9ac'), + (x'5e9502f9'), + (x'5e8012b1'), + (x'3c000028'), + (x'60cde861'), + (x'03aa2a50'), + (x'43480000'), + (x'4c000000'), + -- LooksLikePow5 + (x'5D1502F9'), + (x'5D9502F9'), + (x'5E1502F9'), + -- OutputLength + (x'3f99999a'), + (x'3f9d70a4'), + (x'3f9df3b6'), + (x'3f9e0419'), + (x'3f9e0610'), + (x'3f9e064b'), + (x'3f9e0651'), + (x'03d20cfe') +) +select float4send(flt) as ibits, + flt, + flt::text::float4 as r_flt, + float4send(flt::text::float4) as obits, + float4send(flt::text::float4) = float4send(flt) as correct + from (select bits::integer::xfloat4::float4 as flt + from testdata + offset 0) s; + ibits | flt | r_flt | obits | correct +------------+----------------+----------------+------------+--------- + \x00000000 | 0 | 0 | \x00000000 | t + \x00800000 | 1.1754944e-38 | 1.1754944e-38 | \x00800000 | t + \x00800001 | 1.1754945e-38 | 1.1754945e-38 | \x00800001 | t + \x00800004 | 1.1754949e-38 | 1.1754949e-38 | \x00800004 | t + \x00800005 | 1.175495e-38 | 1.175495e-38 | \x00800005 | t + \x00800006 | 1.1754952e-38 | 1.1754952e-38 | \x00800006 | t + \x008002f1 | 1.1755999e-38 | 1.1755999e-38 | \x008002f1 | t + \x008002f2 | 1.1756e-38 | 1.1756e-38 | \x008002f2 | t + \x008002f3 | 1.1756001e-38 | 1.1756001e-38 | \x008002f3 | t + \x00800e17 | 1.1759998e-38 | 1.1759998e-38 | \x00800e17 | t + \x00800e18 | 1.176e-38 | 1.176e-38 | \x00800e18 | t + \x00800e19 | 1.1760001e-38 | 1.1760001e-38 | \x00800e19 | t + \x01000001 | 2.350989e-38 | 2.350989e-38 | \x01000001 | t + \x01102843 | 2.647751e-38 | 2.647751e-38 | \x01102843 | t + \x01a52c98 | 6.0675416e-38 | 6.0675416e-38 | \x01a52c98 | t + \x0219c229 | 1.1296386e-37 | 1.1296386e-37 | \x0219c229 | t + \x02e4464d | 3.354194e-37 | 3.354194e-37 | \x02e4464d | t + \x037343c1 | 7.148906e-37 | 7.148906e-37 | \x037343c1 | t + \x03a91b36 | 9.939175e-37 | 9.939175e-37 | \x03a91b36 | t + \x047ada65 | 2.948764e-36 | 2.948764e-36 | \x047ada65 | t + \x0496fe87 | 3.5498577e-36 | 3.5498577e-36 | \x0496fe87 | t + \x0550844f | 9.804414e-36 | 9.804414e-36 | \x0550844f | t + \x05999da3 | 1.4445957e-35 | 1.4445957e-35 | \x05999da3 | t + \x060ea5e2 | 2.6829103e-35 | 2.6829103e-35 | \x060ea5e2 | t + \x06e63c45 | 8.660494e-35 | 8.660494e-35 | \x06e63c45 | t + \x07f1e548 | 3.639641e-34 | 3.639641e-34 | \x07f1e548 | t + \x0fc5282b | 1.9441172e-29 | 1.9441172e-29 | \x0fc5282b | t + \x1f850283 | 5.6331846e-20 | 5.6331846e-20 | \x1f850283 | t + \x2874a9d6 | 1.3581548e-14 | 1.3581548e-14 | \x2874a9d6 | t + \x3356bf94 | 4.9999997e-08 | 4.9999997e-08 | \x3356bf94 | t + \x3356bf95 | 5e-08 | 5e-08 | \x3356bf95 | t + \x3356bf96 | 5.0000004e-08 | 5.0000004e-08 | \x3356bf96 | t + \x33d6bf94 | 9.9999994e-08 | 9.9999994e-08 | \x33d6bf94 | t + \x33d6bf95 | 1e-07 | 1e-07 | \x33d6bf95 | t + \x33d6bf96 | 1.0000001e-07 | 1.0000001e-07 | \x33d6bf96 | t + \x34a10faf | 2.9999998e-07 | 2.9999998e-07 | \x34a10faf | t + \x34a10fb0 | 3e-07 | 3e-07 | \x34a10fb0 | t + \x34a10fb1 | 3.0000004e-07 | 3.0000004e-07 | \x34a10fb1 | t + \x350637bc | 4.9999994e-07 | 4.9999994e-07 | \x350637bc | t + \x350637bd | 5e-07 | 5e-07 | \x350637bd | t + \x350637be | 5.0000006e-07 | 5.0000006e-07 | \x350637be | t + \x35719786 | 8.999999e-07 | 8.999999e-07 | \x35719786 | t + \x35719787 | 9e-07 | 9e-07 | \x35719787 | t + \x35719788 | 9.0000003e-07 | 9.0000003e-07 | \x35719788 | t + \x358637bc | 9.999999e-07 | 9.999999e-07 | \x358637bc | t + \x358637bd | 1e-06 | 1e-06 | \x358637bd | t + \x358637be | 1.0000001e-06 | 1.0000001e-06 | \x358637be | t + \x36a7c5ab | 4.9999994e-06 | 4.9999994e-06 | \x36a7c5ab | t + \x36a7c5ac | 5e-06 | 5e-06 | \x36a7c5ac | t + \x36a7c5ad | 5.0000003e-06 | 5.0000003e-06 | \x36a7c5ad | t + \x3727c5ab | 9.999999e-06 | 9.999999e-06 | \x3727c5ab | t + \x3727c5ac | 1e-05 | 1e-05 | \x3727c5ac | t + \x3727c5ad | 1.0000001e-05 | 1.0000001e-05 | \x3727c5ad | t + \x38d1b714 | 9.9999976e-05 | 9.9999976e-05 | \x38d1b714 | t + \x38d1b715 | 9.999998e-05 | 9.999998e-05 | \x38d1b715 | t + \x38d1b716 | 9.999999e-05 | 9.999999e-05 | \x38d1b716 | t + \x38d1b717 | 0.0001 | 0.0001 | \x38d1b717 | t + \x38d1b718 | 0.000100000005 | 0.000100000005 | \x38d1b718 | t + \x38d1b719 | 0.00010000001 | 0.00010000001 | \x38d1b719 | t + \x38d1b71a | 0.00010000002 | 0.00010000002 | \x38d1b71a | t + \x38d1b71b | 0.00010000003 | 0.00010000003 | \x38d1b71b | t + \x38d1b71c | 0.000100000034 | 0.000100000034 | \x38d1b71c | t + \x38d1b71d | 0.00010000004 | 0.00010000004 | \x38d1b71d | t + \x38dffffe | 0.00010681151 | 0.00010681151 | \x38dffffe | t + \x38dfffff | 0.000106811516 | 0.000106811516 | \x38dfffff | t + \x38e00000 | 0.00010681152 | 0.00010681152 | \x38e00000 | t + \x38efffff | 0.00011444091 | 0.00011444091 | \x38efffff | t + \x38f00000 | 0.00011444092 | 0.00011444092 | \x38f00000 | t + \x38f00001 | 0.000114440925 | 0.000114440925 | \x38f00001 | t + \x3a83126e | 0.0009999999 | 0.0009999999 | \x3a83126e | t + \x3a83126f | 0.001 | 0.001 | \x3a83126f | t + \x3a831270 | 0.0010000002 | 0.0010000002 | \x3a831270 | t + \x3c23d709 | 0.009999999 | 0.009999999 | \x3c23d709 | t + \x3c23d70a | 0.01 | 0.01 | \x3c23d70a | t + \x3c23d70b | 0.010000001 | 0.010000001 | \x3c23d70b | t + \x3dcccccc | 0.099999994 | 0.099999994 | \x3dcccccc | t + \x3dcccccd | 0.1 | 0.1 | \x3dcccccd | t + \x3dccccce | 0.10000001 | 0.10000001 | \x3dccccce | t + \x3dcccd6f | 0.10000121 | 0.10000121 | \x3dcccd6f | t + \x3dcccd70 | 0.100001216 | 0.100001216 | \x3dcccd70 | t + \x3dcccd71 | 0.10000122 | 0.10000122 | \x3dcccd71 | t + \x3effffff | 0.49999997 | 0.49999997 | \x3effffff | t + \x3f000000 | 0.5 | 0.5 | \x3f000000 | t + \x3f000001 | 0.50000006 | 0.50000006 | \x3f000001 | t + \x3f333332 | 0.6999999 | 0.6999999 | \x3f333332 | t + \x3f333333 | 0.7 | 0.7 | \x3f333333 | t + \x3f333334 | 0.70000005 | 0.70000005 | \x3f333334 | t + \x3f666665 | 0.8999999 | 0.8999999 | \x3f666665 | t + \x3f666666 | 0.9 | 0.9 | \x3f666666 | t + \x3f666667 | 0.90000004 | 0.90000004 | \x3f666667 | t + \x3f7d70a3 | 0.98999995 | 0.98999995 | \x3f7d70a3 | t + \x3f7d70a4 | 0.99 | 0.99 | \x3f7d70a4 | t + \x3f7d70a5 | 0.99000007 | 0.99000007 | \x3f7d70a5 | t + \x3f7fbe76 | 0.99899995 | 0.99899995 | \x3f7fbe76 | t + \x3f7fbe77 | 0.999 | 0.999 | \x3f7fbe77 | t + \x3f7fbe78 | 0.9990001 | 0.9990001 | \x3f7fbe78 | t + \x3f7ff971 | 0.9998999 | 0.9998999 | \x3f7ff971 | t + \x3f7ff972 | 0.9999 | 0.9999 | \x3f7ff972 | t + \x3f7ff973 | 0.99990004 | 0.99990004 | \x3f7ff973 | t + \x3f7fff57 | 0.9999899 | 0.9999899 | \x3f7fff57 | t + \x3f7fff58 | 0.99999 | 0.99999 | \x3f7fff58 | t + \x3f7fff59 | 0.99999005 | 0.99999005 | \x3f7fff59 | t + \x3f7fffee | 0.9999989 | 0.9999989 | \x3f7fffee | t + \x3f7fffef | 0.999999 | 0.999999 | \x3f7fffef | t + \x3f7ffff0 | 0.99999905 | 0.99999905 | \x3f7ffff0 | t + \x3f7ffff1 | 0.9999991 | 0.9999991 | \x3f7ffff1 | t + \x3f7ffff2 | 0.99999917 | 0.99999917 | \x3f7ffff2 | t + \x3f7ffff3 | 0.9999992 | 0.9999992 | \x3f7ffff3 | t + \x3f7ffff4 | 0.9999993 | 0.9999993 | \x3f7ffff4 | t + \x3f7ffff5 | 0.99999934 | 0.99999934 | \x3f7ffff5 | t + \x3f7ffff6 | 0.9999994 | 0.9999994 | \x3f7ffff6 | t + \x3f7ffff7 | 0.99999946 | 0.99999946 | \x3f7ffff7 | t + \x3f7ffff8 | 0.9999995 | 0.9999995 | \x3f7ffff8 | t + \x3f7ffff9 | 0.9999996 | 0.9999996 | \x3f7ffff9 | t + \x3f7ffffa | 0.99999964 | 0.99999964 | \x3f7ffffa | t + \x3f7ffffb | 0.9999997 | 0.9999997 | \x3f7ffffb | t + \x3f7ffffc | 0.99999976 | 0.99999976 | \x3f7ffffc | t + \x3f7ffffd | 0.9999998 | 0.9999998 | \x3f7ffffd | t + \x3f7ffffe | 0.9999999 | 0.9999999 | \x3f7ffffe | t + \x3f7fffff | 0.99999994 | 0.99999994 | \x3f7fffff | t + \x3f800000 | 1 | 1 | \x3f800000 | t + \x3f800001 | 1.0000001 | 1.0000001 | \x3f800001 | t + \x3f800002 | 1.0000002 | 1.0000002 | \x3f800002 | t + \x3f800003 | 1.0000004 | 1.0000004 | \x3f800003 | t + \x3f800004 | 1.0000005 | 1.0000005 | \x3f800004 | t + \x3f800005 | 1.0000006 | 1.0000006 | \x3f800005 | t + \x3f800006 | 1.0000007 | 1.0000007 | \x3f800006 | t + \x3f800007 | 1.0000008 | 1.0000008 | \x3f800007 | t + \x3f800008 | 1.000001 | 1.000001 | \x3f800008 | t + \x3f800009 | 1.0000011 | 1.0000011 | \x3f800009 | t + \x3f80000f | 1.0000018 | 1.0000018 | \x3f80000f | t + \x3f800010 | 1.0000019 | 1.0000019 | \x3f800010 | t + \x3f800011 | 1.000002 | 1.000002 | \x3f800011 | t + \x3f800012 | 1.0000021 | 1.0000021 | \x3f800012 | t + \x3f800013 | 1.0000023 | 1.0000023 | \x3f800013 | t + \x3f800014 | 1.0000024 | 1.0000024 | \x3f800014 | t + \x3f800017 | 1.0000027 | 1.0000027 | \x3f800017 | t + \x3f800018 | 1.0000029 | 1.0000029 | \x3f800018 | t + \x3f800019 | 1.000003 | 1.000003 | \x3f800019 | t + \x3f80001a | 1.0000031 | 1.0000031 | \x3f80001a | t + \x3f80001b | 1.0000032 | 1.0000032 | \x3f80001b | t + \x3f80001c | 1.0000033 | 1.0000033 | \x3f80001c | t + \x3f800029 | 1.0000049 | 1.0000049 | \x3f800029 | t + \x3f80002a | 1.000005 | 1.000005 | \x3f80002a | t + \x3f80002b | 1.0000051 | 1.0000051 | \x3f80002b | t + \x3f800053 | 1.0000099 | 1.0000099 | \x3f800053 | t + \x3f800054 | 1.00001 | 1.00001 | \x3f800054 | t + \x3f800055 | 1.0000101 | 1.0000101 | \x3f800055 | t + \x3f800346 | 1.0000999 | 1.0000999 | \x3f800346 | t + \x3f800347 | 1.0001 | 1.0001 | \x3f800347 | t + \x3f800348 | 1.0001001 | 1.0001001 | \x3f800348 | t + \x3f8020c4 | 1.0009999 | 1.0009999 | \x3f8020c4 | t + \x3f8020c5 | 1.001 | 1.001 | \x3f8020c5 | t + \x3f8020c6 | 1.0010002 | 1.0010002 | \x3f8020c6 | t + \x3f8147ad | 1.0099999 | 1.0099999 | \x3f8147ad | t + \x3f8147ae | 1.01 | 1.01 | \x3f8147ae | t + \x3f8147af | 1.0100001 | 1.0100001 | \x3f8147af | t + \x3f8ccccc | 1.0999999 | 1.0999999 | \x3f8ccccc | t + \x3f8ccccd | 1.1 | 1.1 | \x3f8ccccd | t + \x3f8cccce | 1.1000001 | 1.1000001 | \x3f8cccce | t + \x3fc90fdb | 1.5707964 | 1.5707964 | \x3fc90fdb | t + \x402df854 | 2.7182817 | 2.7182817 | \x402df854 | t + \x40490fdb | 3.1415927 | 3.1415927 | \x40490fdb | t + \x409fffff | 4.9999995 | 4.9999995 | \x409fffff | t + \x40a00000 | 5 | 5 | \x40a00000 | t + \x40a00001 | 5.0000005 | 5.0000005 | \x40a00001 | t + \x40afffff | 5.4999995 | 5.4999995 | \x40afffff | t + \x40b00000 | 5.5 | 5.5 | \x40b00000 | t + \x40b00001 | 5.5000005 | 5.5000005 | \x40b00001 | t + \x411fffff | 9.999999 | 9.999999 | \x411fffff | t + \x41200000 | 10 | 10 | \x41200000 | t + \x41200001 | 10.000001 | 10.000001 | \x41200001 | t + \x42c7ffff | 99.99999 | 99.99999 | \x42c7ffff | t + \x42c80000 | 100 | 100 | \x42c80000 | t + \x42c80001 | 100.00001 | 100.00001 | \x42c80001 | t + \x4479ffff | 999.99994 | 999.99994 | \x4479ffff | t + \x447a0000 | 1000 | 1000 | \x447a0000 | t + \x447a0001 | 1000.00006 | 1000.00006 | \x447a0001 | t + \x461c3fff | 9999.999 | 9999.999 | \x461c3fff | t + \x461c4000 | 10000 | 10000 | \x461c4000 | t + \x461c4001 | 10000.001 | 10000.001 | \x461c4001 | t + \x47c34fff | 99999.99 | 99999.99 | \x47c34fff | t + \x47c35000 | 100000 | 100000 | \x47c35000 | t + \x47c35001 | 100000.01 | 100000.01 | \x47c35001 | t + \x497423ff | 999999.94 | 999999.94 | \x497423ff | t + \x49742400 | 1e+06 | 1e+06 | \x49742400 | t + \x49742401 | 1.00000006e+06 | 1.00000006e+06 | \x49742401 | t + \x4b18967f | 9.999999e+06 | 9.999999e+06 | \x4b18967f | t + \x4b189680 | 1e+07 | 1e+07 | \x4b189680 | t + \x4b189681 | 1.0000001e+07 | 1.0000001e+07 | \x4b189681 | t + \x4cbebc1f | 9.999999e+07 | 9.999999e+07 | \x4cbebc1f | t + \x4cbebc20 | 1e+08 | 1e+08 | \x4cbebc20 | t + \x4cbebc21 | 1.0000001e+08 | 1.0000001e+08 | \x4cbebc21 | t + \x4e6e6b27 | 9.9999994e+08 | 9.9999994e+08 | \x4e6e6b27 | t + \x4e6e6b28 | 1e+09 | 1e+09 | \x4e6e6b28 | t + \x4e6e6b29 | 1.00000006e+09 | 1.00000006e+09 | \x4e6e6b29 | t + \x501502f8 | 9.999999e+09 | 9.999999e+09 | \x501502f8 | t + \x501502f9 | 1e+10 | 1e+10 | \x501502f9 | t + \x501502fa | 1.0000001e+10 | 1.0000001e+10 | \x501502fa | t + \x51ba43b6 | 9.999999e+10 | 9.999999e+10 | \x51ba43b6 | t + \x51ba43b7 | 1e+11 | 1e+11 | \x51ba43b7 | t + \x51ba43b8 | 1.0000001e+11 | 1.0000001e+11 | \x51ba43b8 | t + \x1f6c1e4a | 5e-20 | 5e-20 | \x1f6c1e4a | t + \x59be6cea | 6.7e+15 | 6.7e+15 | \x59be6cea | t + \x5d5ab6c4 | 9.85e+17 | 9.85e+17 | \x5d5ab6c4 | t + \x2cc4a9bd | 5.5895e-12 | 5.5895e-12 | \x2cc4a9bd | t + \x15ae43fd | 7.038531e-26 | 7.0385313e-26 | \x15ae43fe | f + \x2cf757ca | 7.0299088e-12 | 7.0299088e-12 | \x2cf757ca | t + \x665ba998 | 2.5933168e+23 | 2.5933168e+23 | \x665ba998 | t + \x743c3324 | 5.9642887e+31 | 5.9642887e+31 | \x743c3324 | t + \x47f1205a | 123456.7 | 123456.7 | \x47f1205a | t + \x4640e6ae | 12345.67 | 12345.67 | \x4640e6ae | t + \x449a5225 | 1234.567 | 1234.567 | \x449a5225 | t + \x42f6e9d5 | 123.4567 | 123.4567 | \x42f6e9d5 | t + \x414587dd | 12.34567 | 12.34567 | \x414587dd | t + \x3f9e064b | 1.234567 | 1.234567 | \x3f9e064b | t + \x4c000004 | 3.3554448e+07 | 3.3554448e+07 | \x4c000004 | t + \x50061c46 | 8.999999e+09 | 8.999999e+09 | \x50061c46 | t + \x510006a8 | 3.4366718e+10 | 3.4366718e+10 | \x510006a8 | t + \x48951f84 | 305404.12 | 305404.12 | \x48951f84 | t + \x45fd1840 | 8099.0312 | 8099.0312 | \x45fd1840 | t + \x39800000 | 0.00024414062 | 0.00024414062 | \x39800000 | t + \x3b200000 | 0.0024414062 | 0.0024414062 | \x3b200000 | t + \x3b900000 | 0.0043945312 | 0.0043945312 | \x3b900000 | t + \x3bd00000 | 0.0063476562 | 0.0063476562 | \x3bd00000 | t + \x63800000 | 4.7223665e+21 | 4.7223665e+21 | \x63800000 | t + \x4b000000 | 8.388608e+06 | 8.388608e+06 | \x4b000000 | t + \x4b800000 | 1.6777216e+07 | 1.6777216e+07 | \x4b800000 | t + \x4c000001 | 3.3554436e+07 | 3.3554436e+07 | \x4c000001 | t + \x4c800b0d | 6.7131496e+07 | 6.7131496e+07 | \x4c800b0d | t + \x00d24584 | 1.9310392e-38 | 1.9310392e-38 | \x00d24584 | t + \x00d90b88 | 1.993244e-38 | 1.993244e-38 | \x00d90b88 | t + \x45803f34 | 4103.9004 | 4103.9004 | \x45803f34 | t + \x4f9f24f7 | 5.3399997e+09 | 5.3399997e+09 | \x4f9f24f7 | t + \x3a8722c3 | 0.0010310042 | 0.0010310042 | \x3a8722c3 | t + \x5c800041 | 2.882326e+17 | 2.882326e+17 | \x5c800041 | t + \x15ae43fd | 7.038531e-26 | 7.0385313e-26 | \x15ae43fe | f + \x5d4cccfb | 9.223404e+17 | 9.223404e+17 | \x5d4cccfb | t + \x4c800001 | 6.710887e+07 | 6.710887e+07 | \x4c800001 | t + \x57800ed8 | 2.816025e+14 | 2.816025e+14 | \x57800ed8 | t + \x5f000000 | 9.223372e+18 | 9.223372e+18 | \x5f000000 | t + \x700000f0 | 1.5846086e+29 | 1.5846086e+29 | \x700000f0 | t + \x5f23e9ac | 1.1811161e+19 | 1.1811161e+19 | \x5f23e9ac | t + \x5e9502f9 | 5.368709e+18 | 5.368709e+18 | \x5e9502f9 | t + \x5e8012b1 | 4.6143166e+18 | 4.6143166e+18 | \x5e8012b1 | t + \x3c000028 | 0.007812537 | 0.007812537 | \x3c000028 | t + \x60cde861 | 1.18697725e+20 | 1.18697725e+20 | \x60cde861 | t + \x03aa2a50 | 1.00014165e-36 | 1.00014165e-36 | \x03aa2a50 | t + \x43480000 | 200 | 200 | \x43480000 | t + \x4c000000 | 3.3554432e+07 | 3.3554432e+07 | \x4c000000 | t + \x5d1502f9 | 6.7108864e+17 | 6.7108864e+17 | \x5d1502f9 | t + \x5d9502f9 | 1.3421773e+18 | 1.3421773e+18 | \x5d9502f9 | t + \x5e1502f9 | 2.6843546e+18 | 2.6843546e+18 | \x5e1502f9 | t + \x3f99999a | 1.2 | 1.2 | \x3f99999a | t + \x3f9d70a4 | 1.23 | 1.23 | \x3f9d70a4 | t + \x3f9df3b6 | 1.234 | 1.234 | \x3f9df3b6 | t + \x3f9e0419 | 1.2345 | 1.2345 | \x3f9e0419 | t + \x3f9e0610 | 1.23456 | 1.23456 | \x3f9e0610 | t + \x3f9e064b | 1.234567 | 1.234567 | \x3f9e064b | t + \x3f9e0651 | 1.2345678 | 1.2345678 | \x3f9e0651 | t + \x03d20cfe | 1.23456735e-36 | 1.23456735e-36 | \x03d20cfe | t +(261 rows) + +-- clean up, lest opr_sanity complain +drop type xfloat4 cascade; +NOTICE: drop cascades to 6 other objects +DETAIL: drop cascades to function xfloat4in(cstring) +drop cascades to function xfloat4out(xfloat4) +drop cascades to cast from xfloat4 to real +drop cascades to cast from real to xfloat4 +drop cascades to cast from xfloat4 to integer +drop cascades to cast from integer to xfloat4 diff --git a/src/test/singlenode_regress/expected/float4.out b/src/test/singlenode_regress/expected/float4.out new file mode 100644 index 00000000000..6ad5d00aa2d --- /dev/null +++ b/src/test/singlenode_regress/expected/float4.out @@ -0,0 +1,961 @@ +-- +-- FLOAT4 +-- +CREATE TABLE FLOAT4_TBL (f1 float4); +INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 '); +INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 '); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20'); +-- test for over and under flow +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'); +ERROR: "10e70" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'); +ERROR: "-10e70" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'); +ERROR: "10e-70" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'); +ERROR: "-10e-70" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8); +ERROR: value out of range: overflow +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8); +ERROR: value out of range: overflow +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8); +ERROR: value out of range: underflow +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8); +ERROR: value out of range: underflow +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400'); +ERROR: "10e400" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400'); +ERROR: "-10e400" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400'); +ERROR: "10e-400" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400'); +ERROR: "-10e-400" is out of range for type real +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400'); + ^ +-- bad input +INSERT INTO FLOAT4_TBL(f1) VALUES (''); +ERROR: invalid input syntax for type real: "" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES (''); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES (' '); +ERROR: invalid input syntax for type real: " " +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES (' '); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz'); +ERROR: invalid input syntax for type real: "xyz" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0'); +ERROR: invalid input syntax for type real: "5.0.0" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0'); +ERROR: invalid input syntax for type real: "5 . 0" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0'); +ERROR: invalid input syntax for type real: "5. 0" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0'); +ERROR: invalid input syntax for type real: " - 3.0" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0'); + ^ +INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5'); +ERROR: invalid input syntax for type real: "123 5" +LINE 1: INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5'); + ^ +-- special inputs +SELECT 'NaN'::float4; + float4 +-------- + NaN +(1 row) + +SELECT 'nan'::float4; + float4 +-------- + NaN +(1 row) + +SELECT ' NAN '::float4; + float4 +-------- + NaN +(1 row) + +SELECT 'infinity'::float4; + float4 +---------- + Infinity +(1 row) + +SELECT ' -INFINiTY '::float4; + float4 +----------- + -Infinity +(1 row) + +-- bad special inputs +SELECT 'N A N'::float4; +ERROR: invalid input syntax for type real: "N A N" +LINE 1: SELECT 'N A N'::float4; + ^ +SELECT 'NaN x'::float4; +ERROR: invalid input syntax for type real: "NaN x" +LINE 1: SELECT 'NaN x'::float4; + ^ +SELECT ' INFINITY x'::float4; +ERROR: invalid input syntax for type real: " INFINITY x" +LINE 1: SELECT ' INFINITY x'::float4; + ^ +SELECT 'Infinity'::float4 + 100.0; + ?column? +---------- + Infinity +(1 row) + +SELECT 'Infinity'::float4 / 'Infinity'::float4; + ?column? +---------- + NaN +(1 row) + +SELECT '42'::float4 / 'Infinity'::float4; + ?column? +---------- + 0 +(1 row) + +SELECT 'nan'::float4 / 'nan'::float4; + ?column? +---------- + NaN +(1 row) + +SELECT 'nan'::float4 / '0'::float4; + ?column? +---------- + NaN +(1 row) + +SELECT 'nan'::numeric::float4; + float4 +-------- + NaN +(1 row) + +SELECT * FROM FLOAT4_TBL; + f1 +--------------- + 0 + 1004.3 + -34.84 + 1.2345679e+20 + 1.2345679e-20 +(5 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3'; + f1 +--------------- + 0 + -34.84 + 1.2345679e+20 + 1.2345679e-20 +(4 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3'; + f1 +-------- + 1004.3 +(1 row) + +SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1; + f1 +--------------- + 0 + -34.84 + 1.2345679e-20 +(3 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3'; + f1 +--------------- + 0 + -34.84 + 1.2345679e-20 +(3 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1; + f1 +--------------- + 0 + 1004.3 + -34.84 + 1.2345679e-20 +(4 rows) + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3'; + f1 +--------------- + 0 + 1004.3 + -34.84 + 1.2345679e-20 +(4 rows) + +SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + f1 | x +---------------+---------------- + 1004.3 | -10043 + 1.2345679e+20 | -1.2345678e+21 + 1.2345679e-20 | -1.2345678e-19 +(3 rows) + +SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + f1 | x +---------------+--------------- + 1004.3 | 994.3 + 1.2345679e+20 | 1.2345679e+20 + 1.2345679e-20 | -10 +(3 rows) + +SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + f1 | x +---------------+---------------- + 1004.3 | -100.43 + 1.2345679e+20 | -1.2345679e+19 + 1.2345679e-20 | -1.2345679e-21 +(3 rows) + +SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + f1 | x +---------------+--------------- + 1004.3 | 1014.3 + 1.2345679e+20 | 1.2345679e+20 + 1.2345679e-20 | 10 +(3 rows) + +-- test divide by zero +SELECT f.f1 / '0.0' from FLOAT4_TBL f; +ERROR: division by zero +SELECT * FROM FLOAT4_TBL; + f1 +--------------- + 0 + 1004.3 + -34.84 + 1.2345679e+20 + 1.2345679e-20 +(5 rows) + +-- test the unary float4abs operator +SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f; + f1 | abs_f1 +---------------+--------------- + 0 | 0 + 1004.3 | 1004.3 + -34.84 | 34.84 + 1.2345679e+20 | 1.2345679e+20 + 1.2345679e-20 | 1.2345679e-20 +(5 rows) + +UPDATE FLOAT4_TBL + SET f1 = FLOAT4_TBL.f1 * '-1' + WHERE FLOAT4_TBL.f1 > '0.0'; +SELECT * FROM FLOAT4_TBL; + f1 +---------------- + 0 + -34.84 + -1004.3 + -1.2345679e+20 + -1.2345679e-20 +(5 rows) + +-- test edge-case coercions to integer +SELECT '32767.4'::float4::int2; + int2 +------- + 32767 +(1 row) + +SELECT '32767.6'::float4::int2; +ERROR: smallint out of range +SELECT '-32768.4'::float4::int2; + int2 +-------- + -32768 +(1 row) + +SELECT '-32768.6'::float4::int2; +ERROR: smallint out of range +SELECT '2147483520'::float4::int4; + int4 +------------ + 2147483520 +(1 row) + +SELECT '2147483647'::float4::int4; +ERROR: integer out of range +SELECT '-2147483648.5'::float4::int4; + int4 +------------- + -2147483648 +(1 row) + +SELECT '-2147483900'::float4::int4; +ERROR: integer out of range +SELECT '9223369837831520256'::float4::int8; + int8 +--------------------- + 9223369837831520256 +(1 row) + +SELECT '9223372036854775807'::float4::int8; +ERROR: bigint out of range +SELECT '-9223372036854775808.5'::float4::int8; + int8 +---------------------- + -9223372036854775808 +(1 row) + +SELECT '-9223380000000000000'::float4::int8; +ERROR: bigint out of range +-- Test for correct input rounding in edge cases. +-- These lists are from Paxson 1991, excluding subnormals and +-- inputs of over 9 sig. digits. +SELECT float4send('5e-20'::float4); + float4send +------------ + \x1f6c1e4a +(1 row) + +SELECT float4send('67e14'::float4); + float4send +------------ + \x59be6cea +(1 row) + +SELECT float4send('985e15'::float4); + float4send +------------ + \x5d5ab6c4 +(1 row) + +SELECT float4send('55895e-16'::float4); + float4send +------------ + \x2cc4a9bd +(1 row) + +SELECT float4send('7038531e-32'::float4); + float4send +------------ + \x15ae43fd +(1 row) + +SELECT float4send('702990899e-20'::float4); + float4send +------------ + \x2cf757ca +(1 row) + +SELECT float4send('3e-23'::float4); + float4send +------------ + \x1a111234 +(1 row) + +SELECT float4send('57e18'::float4); + float4send +------------ + \x6045c22c +(1 row) + +SELECT float4send('789e-35'::float4); + float4send +------------ + \x0a23de70 +(1 row) + +SELECT float4send('2539e-18'::float4); + float4send +------------ + \x2736f449 +(1 row) + +SELECT float4send('76173e28'::float4); + float4send +------------ + \x7616398a +(1 row) + +SELECT float4send('887745e-11'::float4); + float4send +------------ + \x3714f05c +(1 row) + +SELECT float4send('5382571e-37'::float4); + float4send +------------ + \x0d2eaca7 +(1 row) + +SELECT float4send('82381273e-35'::float4); + float4send +------------ + \x128289d1 +(1 row) + +SELECT float4send('750486563e-38'::float4); + float4send +------------ + \x0f18377e +(1 row) + +-- Test that the smallest possible normalized input value inputs +-- correctly, either in 9-significant-digit or shortest-decimal +-- format. +-- +-- exact val is 1.1754943508... +-- shortest val is 1.1754944000 +-- midpoint to next val is 1.1754944208... +SELECT float4send('1.17549435e-38'::float4); + float4send +------------ + \x00800000 +(1 row) + +SELECT float4send('1.1754944e-38'::float4); + float4send +------------ + \x00800000 +(1 row) + +-- test output (and round-trip safety) of various values. +-- To ensure we're testing what we think we're testing, start with +-- float values specified by bit patterns (as a useful side effect, +-- this means we'll fail on non-IEEE platforms). +create type xfloat4; +create function xfloat4in(cstring) returns xfloat4 immutable strict + language internal as 'int4in'; +NOTICE: return type xfloat4 is only a shell +create function xfloat4out(xfloat4) returns cstring immutable strict + language internal as 'int4out'; +NOTICE: argument type xfloat4 is only a shell +create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4); +create cast (xfloat4 as float4) without function; +create cast (float4 as xfloat4) without function; +create cast (xfloat4 as integer) without function; +create cast (integer as xfloat4) without function; +-- float4: seeeeeee emmmmmmm mmmmmmmm mmmmmmmm +-- we don't care to assume the platform's strtod() handles subnormals +-- correctly; those are "use at your own risk". However we do test +-- subnormal outputs, since those are under our control. +with testdata(bits) as (values + -- small subnormals + (x'00000001'), + (x'00000002'), (x'00000003'), + (x'00000010'), (x'00000011'), (x'00000100'), (x'00000101'), + (x'00004000'), (x'00004001'), (x'00080000'), (x'00080001'), + -- stress values + (x'0053c4f4'), -- 7693e-42 + (x'006c85c4'), -- 996622e-44 + (x'0041ca76'), -- 60419369e-46 + (x'004b7678'), -- 6930161142e-48 + -- taken from upstream testsuite + (x'00000007'), + (x'00424fe2'), + -- borderline between subnormal and normal + (x'007ffff0'), (x'007ffff1'), (x'007ffffe'), (x'007fffff')) +select float4send(flt) as ibits, + flt + from (select bits::integer::xfloat4::float4 as flt + from testdata + offset 0) s; + ibits | flt +------------+--------------- + \x00000001 | 1e-45 + \x00000002 | 3e-45 + \x00000003 | 4e-45 + \x00000010 | 2.2e-44 + \x00000011 | 2.4e-44 + \x00000100 | 3.59e-43 + \x00000101 | 3.6e-43 + \x00004000 | 2.2959e-41 + \x00004001 | 2.296e-41 + \x00080000 | 7.34684e-40 + \x00080001 | 7.34685e-40 + \x0053c4f4 | 7.693e-39 + \x006c85c4 | 9.96622e-39 + \x0041ca76 | 6.041937e-39 + \x004b7678 | 6.930161e-39 + \x00000007 | 1e-44 + \x00424fe2 | 6.0898e-39 + \x007ffff0 | 1.1754921e-38 + \x007ffff1 | 1.1754922e-38 + \x007ffffe | 1.1754941e-38 + \x007fffff | 1.1754942e-38 +(21 rows) + +with testdata(bits) as (values + (x'00000000'), + -- smallest normal values + (x'00800000'), (x'00800001'), (x'00800004'), (x'00800005'), + (x'00800006'), + -- small normal values chosen for short vs. long output + (x'008002f1'), (x'008002f2'), (x'008002f3'), + (x'00800e17'), (x'00800e18'), (x'00800e19'), + -- assorted values (random mantissae) + (x'01000001'), (x'01102843'), (x'01a52c98'), + (x'0219c229'), (x'02e4464d'), (x'037343c1'), (x'03a91b36'), + (x'047ada65'), (x'0496fe87'), (x'0550844f'), (x'05999da3'), + (x'060ea5e2'), (x'06e63c45'), (x'07f1e548'), (x'0fc5282b'), + (x'1f850283'), (x'2874a9d6'), + -- values around 5e-08 + (x'3356bf94'), (x'3356bf95'), (x'3356bf96'), + -- around 1e-07 + (x'33d6bf94'), (x'33d6bf95'), (x'33d6bf96'), + -- around 3e-07 .. 1e-04 + (x'34a10faf'), (x'34a10fb0'), (x'34a10fb1'), + (x'350637bc'), (x'350637bd'), (x'350637be'), + (x'35719786'), (x'35719787'), (x'35719788'), + (x'358637bc'), (x'358637bd'), (x'358637be'), + (x'36a7c5ab'), (x'36a7c5ac'), (x'36a7c5ad'), + (x'3727c5ab'), (x'3727c5ac'), (x'3727c5ad'), + -- format crossover at 1e-04 + (x'38d1b714'), (x'38d1b715'), (x'38d1b716'), + (x'38d1b717'), (x'38d1b718'), (x'38d1b719'), + (x'38d1b71a'), (x'38d1b71b'), (x'38d1b71c'), + (x'38d1b71d'), + -- + (x'38dffffe'), (x'38dfffff'), (x'38e00000'), + (x'38efffff'), (x'38f00000'), (x'38f00001'), + (x'3a83126e'), (x'3a83126f'), (x'3a831270'), + (x'3c23d709'), (x'3c23d70a'), (x'3c23d70b'), + (x'3dcccccc'), (x'3dcccccd'), (x'3dccccce'), + -- chosen to need 9 digits for 3dcccd70 + (x'3dcccd6f'), (x'3dcccd70'), (x'3dcccd71'), + -- + (x'3effffff'), (x'3f000000'), (x'3f000001'), + (x'3f333332'), (x'3f333333'), (x'3f333334'), + -- approach 1.0 with increasing numbers of 9s + (x'3f666665'), (x'3f666666'), (x'3f666667'), + (x'3f7d70a3'), (x'3f7d70a4'), (x'3f7d70a5'), + (x'3f7fbe76'), (x'3f7fbe77'), (x'3f7fbe78'), + (x'3f7ff971'), (x'3f7ff972'), (x'3f7ff973'), + (x'3f7fff57'), (x'3f7fff58'), (x'3f7fff59'), + (x'3f7fffee'), (x'3f7fffef'), + -- values very close to 1 + (x'3f7ffff0'), (x'3f7ffff1'), (x'3f7ffff2'), + (x'3f7ffff3'), (x'3f7ffff4'), (x'3f7ffff5'), + (x'3f7ffff6'), (x'3f7ffff7'), (x'3f7ffff8'), + (x'3f7ffff9'), (x'3f7ffffa'), (x'3f7ffffb'), + (x'3f7ffffc'), (x'3f7ffffd'), (x'3f7ffffe'), + (x'3f7fffff'), + (x'3f800000'), + (x'3f800001'), (x'3f800002'), (x'3f800003'), + (x'3f800004'), (x'3f800005'), (x'3f800006'), + (x'3f800007'), (x'3f800008'), (x'3f800009'), + -- values 1 to 1.1 + (x'3f80000f'), (x'3f800010'), (x'3f800011'), + (x'3f800012'), (x'3f800013'), (x'3f800014'), + (x'3f800017'), (x'3f800018'), (x'3f800019'), + (x'3f80001a'), (x'3f80001b'), (x'3f80001c'), + (x'3f800029'), (x'3f80002a'), (x'3f80002b'), + (x'3f800053'), (x'3f800054'), (x'3f800055'), + (x'3f800346'), (x'3f800347'), (x'3f800348'), + (x'3f8020c4'), (x'3f8020c5'), (x'3f8020c6'), + (x'3f8147ad'), (x'3f8147ae'), (x'3f8147af'), + (x'3f8ccccc'), (x'3f8ccccd'), (x'3f8cccce'), + -- + (x'3fc90fdb'), -- pi/2 + (x'402df854'), -- e + (x'40490fdb'), -- pi + -- + (x'409fffff'), (x'40a00000'), (x'40a00001'), + (x'40afffff'), (x'40b00000'), (x'40b00001'), + (x'411fffff'), (x'41200000'), (x'41200001'), + (x'42c7ffff'), (x'42c80000'), (x'42c80001'), + (x'4479ffff'), (x'447a0000'), (x'447a0001'), + (x'461c3fff'), (x'461c4000'), (x'461c4001'), + (x'47c34fff'), (x'47c35000'), (x'47c35001'), + (x'497423ff'), (x'49742400'), (x'49742401'), + (x'4b18967f'), (x'4b189680'), (x'4b189681'), + (x'4cbebc1f'), (x'4cbebc20'), (x'4cbebc21'), + (x'4e6e6b27'), (x'4e6e6b28'), (x'4e6e6b29'), + (x'501502f8'), (x'501502f9'), (x'501502fa'), + (x'51ba43b6'), (x'51ba43b7'), (x'51ba43b8'), + -- stress values + (x'1f6c1e4a'), -- 5e-20 + (x'59be6cea'), -- 67e14 + (x'5d5ab6c4'), -- 985e15 + (x'2cc4a9bd'), -- 55895e-16 + (x'15ae43fd'), -- 7038531e-32 + (x'2cf757ca'), -- 702990899e-20 + (x'665ba998'), -- 25933168707e13 + (x'743c3324'), -- 596428896559e20 + -- exercise fixed-point memmoves + (x'47f1205a'), + (x'4640e6ae'), + (x'449a5225'), + (x'42f6e9d5'), + (x'414587dd'), + (x'3f9e064b'), + -- these cases come from the upstream's testsuite + -- BoundaryRoundEven + (x'4c000004'), + (x'50061c46'), + (x'510006a8'), + -- ExactValueRoundEven + (x'48951f84'), + (x'45fd1840'), + -- LotsOfTrailingZeros + (x'39800000'), + (x'3b200000'), + (x'3b900000'), + (x'3bd00000'), + -- Regression + (x'63800000'), + (x'4b000000'), + (x'4b800000'), + (x'4c000001'), + (x'4c800b0d'), + (x'00d24584'), + (x'00d90b88'), + (x'45803f34'), + (x'4f9f24f7'), + (x'3a8722c3'), + (x'5c800041'), + (x'15ae43fd'), + (x'5d4cccfb'), + (x'4c800001'), + (x'57800ed8'), + (x'5f000000'), + (x'700000f0'), + (x'5f23e9ac'), + (x'5e9502f9'), + (x'5e8012b1'), + (x'3c000028'), + (x'60cde861'), + (x'03aa2a50'), + (x'43480000'), + (x'4c000000'), + -- LooksLikePow5 + (x'5D1502F9'), + (x'5D9502F9'), + (x'5E1502F9'), + -- OutputLength + (x'3f99999a'), + (x'3f9d70a4'), + (x'3f9df3b6'), + (x'3f9e0419'), + (x'3f9e0610'), + (x'3f9e064b'), + (x'3f9e0651'), + (x'03d20cfe') +) +select float4send(flt) as ibits, + flt, + flt::text::float4 as r_flt, + float4send(flt::text::float4) as obits, + float4send(flt::text::float4) = float4send(flt) as correct + from (select bits::integer::xfloat4::float4 as flt + from testdata + offset 0) s; + ibits | flt | r_flt | obits | correct +------------+----------------+----------------+------------+--------- + \x00000000 | 0 | 0 | \x00000000 | t + \x00800000 | 1.1754944e-38 | 1.1754944e-38 | \x00800000 | t + \x00800001 | 1.1754945e-38 | 1.1754945e-38 | \x00800001 | t + \x00800004 | 1.1754949e-38 | 1.1754949e-38 | \x00800004 | t + \x00800005 | 1.175495e-38 | 1.175495e-38 | \x00800005 | t + \x00800006 | 1.1754952e-38 | 1.1754952e-38 | \x00800006 | t + \x008002f1 | 1.1755999e-38 | 1.1755999e-38 | \x008002f1 | t + \x008002f2 | 1.1756e-38 | 1.1756e-38 | \x008002f2 | t + \x008002f3 | 1.1756001e-38 | 1.1756001e-38 | \x008002f3 | t + \x00800e17 | 1.1759998e-38 | 1.1759998e-38 | \x00800e17 | t + \x00800e18 | 1.176e-38 | 1.176e-38 | \x00800e18 | t + \x00800e19 | 1.1760001e-38 | 1.1760001e-38 | \x00800e19 | t + \x01000001 | 2.350989e-38 | 2.350989e-38 | \x01000001 | t + \x01102843 | 2.647751e-38 | 2.647751e-38 | \x01102843 | t + \x01a52c98 | 6.0675416e-38 | 6.0675416e-38 | \x01a52c98 | t + \x0219c229 | 1.1296386e-37 | 1.1296386e-37 | \x0219c229 | t + \x02e4464d | 3.354194e-37 | 3.354194e-37 | \x02e4464d | t + \x037343c1 | 7.148906e-37 | 7.148906e-37 | \x037343c1 | t + \x03a91b36 | 9.939175e-37 | 9.939175e-37 | \x03a91b36 | t + \x047ada65 | 2.948764e-36 | 2.948764e-36 | \x047ada65 | t + \x0496fe87 | 3.5498577e-36 | 3.5498577e-36 | \x0496fe87 | t + \x0550844f | 9.804414e-36 | 9.804414e-36 | \x0550844f | t + \x05999da3 | 1.4445957e-35 | 1.4445957e-35 | \x05999da3 | t + \x060ea5e2 | 2.6829103e-35 | 2.6829103e-35 | \x060ea5e2 | t + \x06e63c45 | 8.660494e-35 | 8.660494e-35 | \x06e63c45 | t + \x07f1e548 | 3.639641e-34 | 3.639641e-34 | \x07f1e548 | t + \x0fc5282b | 1.9441172e-29 | 1.9441172e-29 | \x0fc5282b | t + \x1f850283 | 5.6331846e-20 | 5.6331846e-20 | \x1f850283 | t + \x2874a9d6 | 1.3581548e-14 | 1.3581548e-14 | \x2874a9d6 | t + \x3356bf94 | 4.9999997e-08 | 4.9999997e-08 | \x3356bf94 | t + \x3356bf95 | 5e-08 | 5e-08 | \x3356bf95 | t + \x3356bf96 | 5.0000004e-08 | 5.0000004e-08 | \x3356bf96 | t + \x33d6bf94 | 9.9999994e-08 | 9.9999994e-08 | \x33d6bf94 | t + \x33d6bf95 | 1e-07 | 1e-07 | \x33d6bf95 | t + \x33d6bf96 | 1.0000001e-07 | 1.0000001e-07 | \x33d6bf96 | t + \x34a10faf | 2.9999998e-07 | 2.9999998e-07 | \x34a10faf | t + \x34a10fb0 | 3e-07 | 3e-07 | \x34a10fb0 | t + \x34a10fb1 | 3.0000004e-07 | 3.0000004e-07 | \x34a10fb1 | t + \x350637bc | 4.9999994e-07 | 4.9999994e-07 | \x350637bc | t + \x350637bd | 5e-07 | 5e-07 | \x350637bd | t + \x350637be | 5.0000006e-07 | 5.0000006e-07 | \x350637be | t + \x35719786 | 8.999999e-07 | 8.999999e-07 | \x35719786 | t + \x35719787 | 9e-07 | 9e-07 | \x35719787 | t + \x35719788 | 9.0000003e-07 | 9.0000003e-07 | \x35719788 | t + \x358637bc | 9.999999e-07 | 9.999999e-07 | \x358637bc | t + \x358637bd | 1e-06 | 1e-06 | \x358637bd | t + \x358637be | 1.0000001e-06 | 1.0000001e-06 | \x358637be | t + \x36a7c5ab | 4.9999994e-06 | 4.9999994e-06 | \x36a7c5ab | t + \x36a7c5ac | 5e-06 | 5e-06 | \x36a7c5ac | t + \x36a7c5ad | 5.0000003e-06 | 5.0000003e-06 | \x36a7c5ad | t + \x3727c5ab | 9.999999e-06 | 9.999999e-06 | \x3727c5ab | t + \x3727c5ac | 1e-05 | 1e-05 | \x3727c5ac | t + \x3727c5ad | 1.0000001e-05 | 1.0000001e-05 | \x3727c5ad | t + \x38d1b714 | 9.9999976e-05 | 9.9999976e-05 | \x38d1b714 | t + \x38d1b715 | 9.999998e-05 | 9.999998e-05 | \x38d1b715 | t + \x38d1b716 | 9.999999e-05 | 9.999999e-05 | \x38d1b716 | t + \x38d1b717 | 0.0001 | 0.0001 | \x38d1b717 | t + \x38d1b718 | 0.000100000005 | 0.000100000005 | \x38d1b718 | t + \x38d1b719 | 0.00010000001 | 0.00010000001 | \x38d1b719 | t + \x38d1b71a | 0.00010000002 | 0.00010000002 | \x38d1b71a | t + \x38d1b71b | 0.00010000003 | 0.00010000003 | \x38d1b71b | t + \x38d1b71c | 0.000100000034 | 0.000100000034 | \x38d1b71c | t + \x38d1b71d | 0.00010000004 | 0.00010000004 | \x38d1b71d | t + \x38dffffe | 0.00010681151 | 0.00010681151 | \x38dffffe | t + \x38dfffff | 0.000106811516 | 0.000106811516 | \x38dfffff | t + \x38e00000 | 0.00010681152 | 0.00010681152 | \x38e00000 | t + \x38efffff | 0.00011444091 | 0.00011444091 | \x38efffff | t + \x38f00000 | 0.00011444092 | 0.00011444092 | \x38f00000 | t + \x38f00001 | 0.000114440925 | 0.000114440925 | \x38f00001 | t + \x3a83126e | 0.0009999999 | 0.0009999999 | \x3a83126e | t + \x3a83126f | 0.001 | 0.001 | \x3a83126f | t + \x3a831270 | 0.0010000002 | 0.0010000002 | \x3a831270 | t + \x3c23d709 | 0.009999999 | 0.009999999 | \x3c23d709 | t + \x3c23d70a | 0.01 | 0.01 | \x3c23d70a | t + \x3c23d70b | 0.010000001 | 0.010000001 | \x3c23d70b | t + \x3dcccccc | 0.099999994 | 0.099999994 | \x3dcccccc | t + \x3dcccccd | 0.1 | 0.1 | \x3dcccccd | t + \x3dccccce | 0.10000001 | 0.10000001 | \x3dccccce | t + \x3dcccd6f | 0.10000121 | 0.10000121 | \x3dcccd6f | t + \x3dcccd70 | 0.100001216 | 0.100001216 | \x3dcccd70 | t + \x3dcccd71 | 0.10000122 | 0.10000122 | \x3dcccd71 | t + \x3effffff | 0.49999997 | 0.49999997 | \x3effffff | t + \x3f000000 | 0.5 | 0.5 | \x3f000000 | t + \x3f000001 | 0.50000006 | 0.50000006 | \x3f000001 | t + \x3f333332 | 0.6999999 | 0.6999999 | \x3f333332 | t + \x3f333333 | 0.7 | 0.7 | \x3f333333 | t + \x3f333334 | 0.70000005 | 0.70000005 | \x3f333334 | t + \x3f666665 | 0.8999999 | 0.8999999 | \x3f666665 | t + \x3f666666 | 0.9 | 0.9 | \x3f666666 | t + \x3f666667 | 0.90000004 | 0.90000004 | \x3f666667 | t + \x3f7d70a3 | 0.98999995 | 0.98999995 | \x3f7d70a3 | t + \x3f7d70a4 | 0.99 | 0.99 | \x3f7d70a4 | t + \x3f7d70a5 | 0.99000007 | 0.99000007 | \x3f7d70a5 | t + \x3f7fbe76 | 0.99899995 | 0.99899995 | \x3f7fbe76 | t + \x3f7fbe77 | 0.999 | 0.999 | \x3f7fbe77 | t + \x3f7fbe78 | 0.9990001 | 0.9990001 | \x3f7fbe78 | t + \x3f7ff971 | 0.9998999 | 0.9998999 | \x3f7ff971 | t + \x3f7ff972 | 0.9999 | 0.9999 | \x3f7ff972 | t + \x3f7ff973 | 0.99990004 | 0.99990004 | \x3f7ff973 | t + \x3f7fff57 | 0.9999899 | 0.9999899 | \x3f7fff57 | t + \x3f7fff58 | 0.99999 | 0.99999 | \x3f7fff58 | t + \x3f7fff59 | 0.99999005 | 0.99999005 | \x3f7fff59 | t + \x3f7fffee | 0.9999989 | 0.9999989 | \x3f7fffee | t + \x3f7fffef | 0.999999 | 0.999999 | \x3f7fffef | t + \x3f7ffff0 | 0.99999905 | 0.99999905 | \x3f7ffff0 | t + \x3f7ffff1 | 0.9999991 | 0.9999991 | \x3f7ffff1 | t + \x3f7ffff2 | 0.99999917 | 0.99999917 | \x3f7ffff2 | t + \x3f7ffff3 | 0.9999992 | 0.9999992 | \x3f7ffff3 | t + \x3f7ffff4 | 0.9999993 | 0.9999993 | \x3f7ffff4 | t + \x3f7ffff5 | 0.99999934 | 0.99999934 | \x3f7ffff5 | t + \x3f7ffff6 | 0.9999994 | 0.9999994 | \x3f7ffff6 | t + \x3f7ffff7 | 0.99999946 | 0.99999946 | \x3f7ffff7 | t + \x3f7ffff8 | 0.9999995 | 0.9999995 | \x3f7ffff8 | t + \x3f7ffff9 | 0.9999996 | 0.9999996 | \x3f7ffff9 | t + \x3f7ffffa | 0.99999964 | 0.99999964 | \x3f7ffffa | t + \x3f7ffffb | 0.9999997 | 0.9999997 | \x3f7ffffb | t + \x3f7ffffc | 0.99999976 | 0.99999976 | \x3f7ffffc | t + \x3f7ffffd | 0.9999998 | 0.9999998 | \x3f7ffffd | t + \x3f7ffffe | 0.9999999 | 0.9999999 | \x3f7ffffe | t + \x3f7fffff | 0.99999994 | 0.99999994 | \x3f7fffff | t + \x3f800000 | 1 | 1 | \x3f800000 | t + \x3f800001 | 1.0000001 | 1.0000001 | \x3f800001 | t + \x3f800002 | 1.0000002 | 1.0000002 | \x3f800002 | t + \x3f800003 | 1.0000004 | 1.0000004 | \x3f800003 | t + \x3f800004 | 1.0000005 | 1.0000005 | \x3f800004 | t + \x3f800005 | 1.0000006 | 1.0000006 | \x3f800005 | t + \x3f800006 | 1.0000007 | 1.0000007 | \x3f800006 | t + \x3f800007 | 1.0000008 | 1.0000008 | \x3f800007 | t + \x3f800008 | 1.000001 | 1.000001 | \x3f800008 | t + \x3f800009 | 1.0000011 | 1.0000011 | \x3f800009 | t + \x3f80000f | 1.0000018 | 1.0000018 | \x3f80000f | t + \x3f800010 | 1.0000019 | 1.0000019 | \x3f800010 | t + \x3f800011 | 1.000002 | 1.000002 | \x3f800011 | t + \x3f800012 | 1.0000021 | 1.0000021 | \x3f800012 | t + \x3f800013 | 1.0000023 | 1.0000023 | \x3f800013 | t + \x3f800014 | 1.0000024 | 1.0000024 | \x3f800014 | t + \x3f800017 | 1.0000027 | 1.0000027 | \x3f800017 | t + \x3f800018 | 1.0000029 | 1.0000029 | \x3f800018 | t + \x3f800019 | 1.000003 | 1.000003 | \x3f800019 | t + \x3f80001a | 1.0000031 | 1.0000031 | \x3f80001a | t + \x3f80001b | 1.0000032 | 1.0000032 | \x3f80001b | t + \x3f80001c | 1.0000033 | 1.0000033 | \x3f80001c | t + \x3f800029 | 1.0000049 | 1.0000049 | \x3f800029 | t + \x3f80002a | 1.000005 | 1.000005 | \x3f80002a | t + \x3f80002b | 1.0000051 | 1.0000051 | \x3f80002b | t + \x3f800053 | 1.0000099 | 1.0000099 | \x3f800053 | t + \x3f800054 | 1.00001 | 1.00001 | \x3f800054 | t + \x3f800055 | 1.0000101 | 1.0000101 | \x3f800055 | t + \x3f800346 | 1.0000999 | 1.0000999 | \x3f800346 | t + \x3f800347 | 1.0001 | 1.0001 | \x3f800347 | t + \x3f800348 | 1.0001001 | 1.0001001 | \x3f800348 | t + \x3f8020c4 | 1.0009999 | 1.0009999 | \x3f8020c4 | t + \x3f8020c5 | 1.001 | 1.001 | \x3f8020c5 | t + \x3f8020c6 | 1.0010002 | 1.0010002 | \x3f8020c6 | t + \x3f8147ad | 1.0099999 | 1.0099999 | \x3f8147ad | t + \x3f8147ae | 1.01 | 1.01 | \x3f8147ae | t + \x3f8147af | 1.0100001 | 1.0100001 | \x3f8147af | t + \x3f8ccccc | 1.0999999 | 1.0999999 | \x3f8ccccc | t + \x3f8ccccd | 1.1 | 1.1 | \x3f8ccccd | t + \x3f8cccce | 1.1000001 | 1.1000001 | \x3f8cccce | t + \x3fc90fdb | 1.5707964 | 1.5707964 | \x3fc90fdb | t + \x402df854 | 2.7182817 | 2.7182817 | \x402df854 | t + \x40490fdb | 3.1415927 | 3.1415927 | \x40490fdb | t + \x409fffff | 4.9999995 | 4.9999995 | \x409fffff | t + \x40a00000 | 5 | 5 | \x40a00000 | t + \x40a00001 | 5.0000005 | 5.0000005 | \x40a00001 | t + \x40afffff | 5.4999995 | 5.4999995 | \x40afffff | t + \x40b00000 | 5.5 | 5.5 | \x40b00000 | t + \x40b00001 | 5.5000005 | 5.5000005 | \x40b00001 | t + \x411fffff | 9.999999 | 9.999999 | \x411fffff | t + \x41200000 | 10 | 10 | \x41200000 | t + \x41200001 | 10.000001 | 10.000001 | \x41200001 | t + \x42c7ffff | 99.99999 | 99.99999 | \x42c7ffff | t + \x42c80000 | 100 | 100 | \x42c80000 | t + \x42c80001 | 100.00001 | 100.00001 | \x42c80001 | t + \x4479ffff | 999.99994 | 999.99994 | \x4479ffff | t + \x447a0000 | 1000 | 1000 | \x447a0000 | t + \x447a0001 | 1000.00006 | 1000.00006 | \x447a0001 | t + \x461c3fff | 9999.999 | 9999.999 | \x461c3fff | t + \x461c4000 | 10000 | 10000 | \x461c4000 | t + \x461c4001 | 10000.001 | 10000.001 | \x461c4001 | t + \x47c34fff | 99999.99 | 99999.99 | \x47c34fff | t + \x47c35000 | 100000 | 100000 | \x47c35000 | t + \x47c35001 | 100000.01 | 100000.01 | \x47c35001 | t + \x497423ff | 999999.94 | 999999.94 | \x497423ff | t + \x49742400 | 1e+06 | 1e+06 | \x49742400 | t + \x49742401 | 1.00000006e+06 | 1.00000006e+06 | \x49742401 | t + \x4b18967f | 9.999999e+06 | 9.999999e+06 | \x4b18967f | t + \x4b189680 | 1e+07 | 1e+07 | \x4b189680 | t + \x4b189681 | 1.0000001e+07 | 1.0000001e+07 | \x4b189681 | t + \x4cbebc1f | 9.999999e+07 | 9.999999e+07 | \x4cbebc1f | t + \x4cbebc20 | 1e+08 | 1e+08 | \x4cbebc20 | t + \x4cbebc21 | 1.0000001e+08 | 1.0000001e+08 | \x4cbebc21 | t + \x4e6e6b27 | 9.9999994e+08 | 9.9999994e+08 | \x4e6e6b27 | t + \x4e6e6b28 | 1e+09 | 1e+09 | \x4e6e6b28 | t + \x4e6e6b29 | 1.00000006e+09 | 1.00000006e+09 | \x4e6e6b29 | t + \x501502f8 | 9.999999e+09 | 9.999999e+09 | \x501502f8 | t + \x501502f9 | 1e+10 | 1e+10 | \x501502f9 | t + \x501502fa | 1.0000001e+10 | 1.0000001e+10 | \x501502fa | t + \x51ba43b6 | 9.999999e+10 | 9.999999e+10 | \x51ba43b6 | t + \x51ba43b7 | 1e+11 | 1e+11 | \x51ba43b7 | t + \x51ba43b8 | 1.0000001e+11 | 1.0000001e+11 | \x51ba43b8 | t + \x1f6c1e4a | 5e-20 | 5e-20 | \x1f6c1e4a | t + \x59be6cea | 6.7e+15 | 6.7e+15 | \x59be6cea | t + \x5d5ab6c4 | 9.85e+17 | 9.85e+17 | \x5d5ab6c4 | t + \x2cc4a9bd | 5.5895e-12 | 5.5895e-12 | \x2cc4a9bd | t + \x15ae43fd | 7.038531e-26 | 7.038531e-26 | \x15ae43fd | t + \x2cf757ca | 7.0299088e-12 | 7.0299088e-12 | \x2cf757ca | t + \x665ba998 | 2.5933168e+23 | 2.5933168e+23 | \x665ba998 | t + \x743c3324 | 5.9642887e+31 | 5.9642887e+31 | \x743c3324 | t + \x47f1205a | 123456.7 | 123456.7 | \x47f1205a | t + \x4640e6ae | 12345.67 | 12345.67 | \x4640e6ae | t + \x449a5225 | 1234.567 | 1234.567 | \x449a5225 | t + \x42f6e9d5 | 123.4567 | 123.4567 | \x42f6e9d5 | t + \x414587dd | 12.34567 | 12.34567 | \x414587dd | t + \x3f9e064b | 1.234567 | 1.234567 | \x3f9e064b | t + \x4c000004 | 3.3554448e+07 | 3.3554448e+07 | \x4c000004 | t + \x50061c46 | 8.999999e+09 | 8.999999e+09 | \x50061c46 | t + \x510006a8 | 3.4366718e+10 | 3.4366718e+10 | \x510006a8 | t + \x48951f84 | 305404.12 | 305404.12 | \x48951f84 | t + \x45fd1840 | 8099.0312 | 8099.0312 | \x45fd1840 | t + \x39800000 | 0.00024414062 | 0.00024414062 | \x39800000 | t + \x3b200000 | 0.0024414062 | 0.0024414062 | \x3b200000 | t + \x3b900000 | 0.0043945312 | 0.0043945312 | \x3b900000 | t + \x3bd00000 | 0.0063476562 | 0.0063476562 | \x3bd00000 | t + \x63800000 | 4.7223665e+21 | 4.7223665e+21 | \x63800000 | t + \x4b000000 | 8.388608e+06 | 8.388608e+06 | \x4b000000 | t + \x4b800000 | 1.6777216e+07 | 1.6777216e+07 | \x4b800000 | t + \x4c000001 | 3.3554436e+07 | 3.3554436e+07 | \x4c000001 | t + \x4c800b0d | 6.7131496e+07 | 6.7131496e+07 | \x4c800b0d | t + \x00d24584 | 1.9310392e-38 | 1.9310392e-38 | \x00d24584 | t + \x00d90b88 | 1.993244e-38 | 1.993244e-38 | \x00d90b88 | t + \x45803f34 | 4103.9004 | 4103.9004 | \x45803f34 | t + \x4f9f24f7 | 5.3399997e+09 | 5.3399997e+09 | \x4f9f24f7 | t + \x3a8722c3 | 0.0010310042 | 0.0010310042 | \x3a8722c3 | t + \x5c800041 | 2.882326e+17 | 2.882326e+17 | \x5c800041 | t + \x15ae43fd | 7.038531e-26 | 7.038531e-26 | \x15ae43fd | t + \x5d4cccfb | 9.223404e+17 | 9.223404e+17 | \x5d4cccfb | t + \x4c800001 | 6.710887e+07 | 6.710887e+07 | \x4c800001 | t + \x57800ed8 | 2.816025e+14 | 2.816025e+14 | \x57800ed8 | t + \x5f000000 | 9.223372e+18 | 9.223372e+18 | \x5f000000 | t + \x700000f0 | 1.5846086e+29 | 1.5846086e+29 | \x700000f0 | t + \x5f23e9ac | 1.1811161e+19 | 1.1811161e+19 | \x5f23e9ac | t + \x5e9502f9 | 5.368709e+18 | 5.368709e+18 | \x5e9502f9 | t + \x5e8012b1 | 4.6143166e+18 | 4.6143166e+18 | \x5e8012b1 | t + \x3c000028 | 0.007812537 | 0.007812537 | \x3c000028 | t + \x60cde861 | 1.18697725e+20 | 1.18697725e+20 | \x60cde861 | t + \x03aa2a50 | 1.00014165e-36 | 1.00014165e-36 | \x03aa2a50 | t + \x43480000 | 200 | 200 | \x43480000 | t + \x4c000000 | 3.3554432e+07 | 3.3554432e+07 | \x4c000000 | t + \x5d1502f9 | 6.7108864e+17 | 6.7108864e+17 | \x5d1502f9 | t + \x5d9502f9 | 1.3421773e+18 | 1.3421773e+18 | \x5d9502f9 | t + \x5e1502f9 | 2.6843546e+18 | 2.6843546e+18 | \x5e1502f9 | t + \x3f99999a | 1.2 | 1.2 | \x3f99999a | t + \x3f9d70a4 | 1.23 | 1.23 | \x3f9d70a4 | t + \x3f9df3b6 | 1.234 | 1.234 | \x3f9df3b6 | t + \x3f9e0419 | 1.2345 | 1.2345 | \x3f9e0419 | t + \x3f9e0610 | 1.23456 | 1.23456 | \x3f9e0610 | t + \x3f9e064b | 1.234567 | 1.234567 | \x3f9e064b | t + \x3f9e0651 | 1.2345678 | 1.2345678 | \x3f9e0651 | t + \x03d20cfe | 1.23456735e-36 | 1.23456735e-36 | \x03d20cfe | t +(261 rows) + +-- clean up, lest opr_sanity complain +drop type xfloat4 cascade; +NOTICE: drop cascades to 6 other objects +DETAIL: drop cascades to function xfloat4in(cstring) +drop cascades to function xfloat4out(xfloat4) +drop cascades to cast from xfloat4 to real +drop cascades to cast from real to xfloat4 +drop cascades to cast from xfloat4 to integer +drop cascades to cast from integer to xfloat4 diff --git a/src/test/singlenode_regress/expected/float8.out b/src/test/singlenode_regress/expected/float8.out new file mode 100644 index 00000000000..2a169a1f3af --- /dev/null +++ b/src/test/singlenode_regress/expected/float8.out @@ -0,0 +1,1509 @@ +-- +-- FLOAT8 +-- +CREATE TABLE FLOAT8_TBL(i INT DEFAULT 1, f1 float8); +INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 '); +INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 '); +INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200'); +-- test for underflow and overflow handling +SELECT '10e400'::float8; +ERROR: value out of range: overflow +LINE 1: SELECT '10e400'::float8; + ^ +SELECT '-10e400'::float8; +ERROR: value out of range: overflow +LINE 1: SELECT '-10e400'::float8; + ^ +SELECT '1e309'::float8; +ERROR: value out of range: overflow +LINE 1: SELECT '1e309'::float8; + ^ +SELECT '10e-400'::float8; +ERROR: value out of range: underflow +LINE 1: SELECT '10e-400'::float8; + ^ +SELECT '-10e-400'::float8; +ERROR: value out of range: underflow +LINE 1: SELECT '-10e-400'::float8; + ^ +SELECT '1e-324'::float8; +ERROR: value out of range: underflow +LINE 1: SELECT '1e-324'::float8; + ^ +SELECT '1e308'::float8; + float8 +-------- + 1e+308 +(1 row) + +SELECT '1e-323'::float8; + float8 +-------- + 1e-323 +(1 row) + +SELECT '0.0'::float8; + float8 +-------- + 0 +(1 row) + +-- test smallest normalized input +SELECT float8send('2.2250738585072014E-308'::float8); + float8send +-------------------- + \x0010000000000000 +(1 row) + +-- bad input +INSERT INTO FLOAT8_TBL(f1) VALUES (''); +ERROR: invalid input syntax for type double precision: "" +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES (''); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES (' '); +ERROR: invalid input syntax for type double precision: " " +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES (' '); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz'); +ERROR: invalid input syntax for type double precision: "xyz" +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0'); +ERROR: invalid input syntax for type double precision: "5.0.0" +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0'); +ERROR: invalid input syntax for type double precision: "5 . 0" +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0'); +ERROR: invalid input syntax for type double precision: "5. 0" +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3'); +ERROR: invalid input syntax for type double precision: " - 3" +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5'); +ERROR: invalid input syntax for type double precision: "123 5" +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5'); + ^ +-- special inputs +SELECT 'NaN'::float8; + float8 +-------- + NaN +(1 row) + +SELECT 'nan'::float8; + float8 +-------- + NaN +(1 row) + +SELECT ' NAN '::float8; + float8 +-------- + NaN +(1 row) + +SELECT 'infinity'::float8; + float8 +---------- + Infinity +(1 row) + +SELECT 'inf'::float8; + float8 +---------- + Infinity +(1 row) + +SELECT ' -INFINiTY '::float8; + float8 +----------- + -Infinity +(1 row) + +SELECT '+Infinity'::float8; + float8 +---------- + Infinity +(1 row) + +SELECT '+INF'::float8; + float8 +---------- + Infinity +(1 row) + +SELECT '+inf'::float8; + float8 +---------- + Infinity +(1 row) + +SELECT '+INFINITY'::float8; + float8 +---------- + Infinity +(1 row) + +-- bad special inputs +SELECT 'N A N'::float8; +ERROR: invalid input syntax for type double precision: "N A N" +LINE 1: SELECT 'N A N'::float8; + ^ +SELECT 'NaN x'::float8; +ERROR: invalid input syntax for type double precision: "NaN x" +LINE 1: SELECT 'NaN x'::float8; + ^ +SELECT ' INFINITY x'::float8; +ERROR: invalid input syntax for type double precision: " INFINITY x" +LINE 1: SELECT ' INFINITY x'::float8; + ^ +SELECT 'Infinity'::float8 + 100.0; + ?column? +---------- + Infinity +(1 row) + +SELECT 'Infinity'::float8 / 'Infinity'::float8; + ?column? +---------- + NaN +(1 row) + +SELECT '42'::float8 / 'Infinity'::float8; + ?column? +---------- + 0 +(1 row) + +SELECT 'nan'::float8 / 'nan'::float8; + ?column? +---------- + NaN +(1 row) + +SELECT 'nan'::float8 / '0'::float8; + ?column? +---------- + NaN +(1 row) + +SELECT 'nan'::numeric::float8; + float8 +-------- + NaN +(1 row) + +SELECT f1 FROM FLOAT8_TBL; + f1 +---------------------- + 0 + 1004.3 + -34.84 + 1.2345678901234e+200 + 1.2345678901234e-200 +(5 rows) + +SELECT f.f1 FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3'; + f1 +---------------------- + 0 + -34.84 + 1.2345678901234e+200 + 1.2345678901234e-200 +(4 rows) + +SELECT f.f1 FROM FLOAT8_TBL f WHERE f.f1 = '1004.3'; + f1 +-------- + 1004.3 +(1 row) + +SELECT f.f1 FROM FLOAT8_TBL f WHERE '1004.3' > f.f1; + f1 +---------------------- + 0 + -34.84 + 1.2345678901234e-200 +(3 rows) + +SELECT f.f1 FROM FLOAT8_TBL f WHERE f.f1 < '1004.3'; + f1 +---------------------- + 0 + -34.84 + 1.2345678901234e-200 +(3 rows) + +SELECT f.f1 FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1; + f1 +---------------------- + 0 + 1004.3 + -34.84 + 1.2345678901234e-200 +(4 rows) + +SELECT f.f1 FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3'; + f1 +---------------------- + 0 + 1004.3 + -34.84 + 1.2345678901234e-200 +(4 rows) + +SELECT f.f1, f.f1 * '-10' AS x + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + f1 | x +----------------------+----------------------- + 1004.3 | -10043 + 1.2345678901234e+200 | -1.2345678901234e+201 + 1.2345678901234e-200 | -1.2345678901234e-199 +(3 rows) + +SELECT f.f1, f.f1 + '-10' AS x + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + f1 | x +----------------------+---------------------- + 1004.3 | 994.3 + 1.2345678901234e+200 | 1.2345678901234e+200 + 1.2345678901234e-200 | -10 +(3 rows) + +SELECT f.f1, f.f1 / '-10' AS x + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + f1 | x +----------------------+----------------------- + 1004.3 | -100.42999999999999 + 1.2345678901234e+200 | -1.2345678901234e+199 + 1.2345678901234e-200 | -1.2345678901234e-201 +(3 rows) + +SELECT f.f1, f.f1 - '-10' AS x + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + f1 | x +----------------------+---------------------- + 1004.3 | 1014.3 + 1.2345678901234e+200 | 1.2345678901234e+200 + 1.2345678901234e-200 | 10 +(3 rows) + +SELECT f.f1 ^ '2.0' AS square_f1 + FROM FLOAT8_TBL f where f.f1 = '1004.3'; + square_f1 +-------------------- + 1008618.4899999999 +(1 row) + +-- absolute value +SELECT f.f1, @f.f1 AS abs_f1 + FROM FLOAT8_TBL f; + f1 | abs_f1 +----------------------+---------------------- + 0 | 0 + 1004.3 | 1004.3 + -34.84 | 34.84 + 1.2345678901234e+200 | 1.2345678901234e+200 + 1.2345678901234e-200 | 1.2345678901234e-200 +(5 rows) + +-- truncate +SELECT f.f1, trunc(f.f1) AS trunc_f1 + FROM FLOAT8_TBL f; + f1 | trunc_f1 +----------------------+---------------------- + 0 | 0 + 1004.3 | 1004 + -34.84 | -34 + 1.2345678901234e+200 | 1.2345678901234e+200 + 1.2345678901234e-200 | 0 +(5 rows) + +-- round +SELECT f.f1, round(f.f1) AS round_f1 + FROM FLOAT8_TBL f; + f1 | round_f1 +----------------------+---------------------- + 0 | 0 + 1004.3 | 1004 + -34.84 | -35 + 1.2345678901234e+200 | 1.2345678901234e+200 + 1.2345678901234e-200 | 0 +(5 rows) + +-- ceil / ceiling +select ceil(f1) as ceil_f1 from float8_tbl f; + ceil_f1 +---------------------- + 0 + 1005 + -34 + 1.2345678901234e+200 + 1 +(5 rows) + +select ceiling(f1) as ceiling_f1 from float8_tbl f; + ceiling_f1 +---------------------- + 0 + 1005 + -34 + 1.2345678901234e+200 + 1 +(5 rows) + +-- floor +select floor(f1) as floor_f1 from float8_tbl f; + floor_f1 +---------------------- + 0 + 1004 + -35 + 1.2345678901234e+200 + 0 +(5 rows) + +-- sign +select sign(f1) as sign_f1 from float8_tbl f; + sign_f1 +--------- + 0 + 1 + -1 + 1 + 1 +(5 rows) + +-- avoid bit-exact output here because operations may not be bit-exact. +SET extra_float_digits = 0; +-- square root +SELECT sqrt(float8 '64') AS eight; + eight +------- + 8 +(1 row) + +SELECT |/ float8 '64' AS eight; + eight +------- + 8 +(1 row) + +SELECT f.f1, |/f.f1 AS sqrt_f1 + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + f1 | sqrt_f1 +----------------------+----------------------- + 1004.3 | 31.6906926399535 + 1.2345678901234e+200 | 1.11111110611109e+100 + 1.2345678901234e-200 | 1.11111110611109e-100 +(3 rows) + +-- power +SELECT power(float8 '144', float8 '0.5'); + power +------- + 12 +(1 row) + +SELECT power(float8 'NaN', float8 '0.5'); + power +------- + NaN +(1 row) + +SELECT power(float8 '144', float8 'NaN'); + power +------- + NaN +(1 row) + +SELECT power(float8 'NaN', float8 'NaN'); + power +------- + NaN +(1 row) + +SELECT power(float8 '-1', float8 'NaN'); + power +------- + NaN +(1 row) + +SELECT power(float8 '1', float8 'NaN'); + power +------- + 1 +(1 row) + +SELECT power(float8 'NaN', float8 '0'); + power +------- + 1 +(1 row) + +SELECT power(float8 'inf', float8 '0'); + power +------- + 1 +(1 row) + +SELECT power(float8 '-inf', float8 '0'); + power +------- + 1 +(1 row) + +SELECT power(float8 '0', float8 'inf'); + power +------- + 0 +(1 row) + +SELECT power(float8 '0', float8 '-inf'); +ERROR: zero raised to a negative power is undefined +SELECT power(float8 '1', float8 'inf'); + power +------- + 1 +(1 row) + +SELECT power(float8 '1', float8 '-inf'); + power +------- + 1 +(1 row) + +SELECT power(float8 '-1', float8 'inf'); + power +------- + 1 +(1 row) + +SELECT power(float8 '-1', float8 '-inf'); + power +------- + 1 +(1 row) + +SELECT power(float8 '0.1', float8 'inf'); + power +------- + 0 +(1 row) + +SELECT power(float8 '-0.1', float8 'inf'); + power +------- + 0 +(1 row) + +SELECT power(float8 '1.1', float8 'inf'); + power +---------- + Infinity +(1 row) + +SELECT power(float8 '-1.1', float8 'inf'); + power +---------- + Infinity +(1 row) + +SELECT power(float8 '0.1', float8 '-inf'); + power +---------- + Infinity +(1 row) + +SELECT power(float8 '-0.1', float8 '-inf'); + power +---------- + Infinity +(1 row) + +SELECT power(float8 '1.1', float8 '-inf'); + power +------- + 0 +(1 row) + +SELECT power(float8 '-1.1', float8 '-inf'); + power +------- + 0 +(1 row) + +SELECT power(float8 'inf', float8 '-2'); + power +------- + 0 +(1 row) + +SELECT power(float8 'inf', float8 '2'); + power +---------- + Infinity +(1 row) + +SELECT power(float8 'inf', float8 'inf'); + power +---------- + Infinity +(1 row) + +SELECT power(float8 'inf', float8 '-inf'); + power +------- + 0 +(1 row) + +-- Intel's icc misoptimizes the code that controls the sign of this result, +-- even with -mp1. Pending a fix for that, only test for "is it zero". +SELECT power(float8 '-inf', float8 '-2') = '0'; + ?column? +---------- + t +(1 row) + +SELECT power(float8 '-inf', float8 '-3'); + power +------- + -0 +(1 row) + +SELECT power(float8 '-inf', float8 '2'); + power +---------- + Infinity +(1 row) + +SELECT power(float8 '-inf', float8 '3'); + power +----------- + -Infinity +(1 row) + +SELECT power(float8 '-inf', float8 '3.5'); +ERROR: a negative number raised to a non-integer power yields a complex result +SELECT power(float8 '-inf', float8 'inf'); + power +---------- + Infinity +(1 row) + +SELECT power(float8 '-inf', float8 '-inf'); + power +------- + 0 +(1 row) + +-- take exp of ln(f.f1) +SELECT f.f1, exp(ln(f.f1)) AS exp_ln_f1 + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + f1 | exp_ln_f1 +----------------------+----------------------- + 1004.3 | 1004.3 + 1.2345678901234e+200 | 1.23456789012338e+200 + 1.2345678901234e-200 | 1.23456789012339e-200 +(3 rows) + +-- check edge cases for exp +SELECT exp('inf'::float8), exp('-inf'::float8), exp('nan'::float8); + exp | exp | exp +----------+-----+----- + Infinity | 0 | NaN +(1 row) + +-- cube root +SELECT ||/ float8 '27' AS three; + three +------- + 3 +(1 row) + +SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f; + f1 | cbrt_f1 +----------------------+---------------------- + 0 | 0 + 1004.3 | 10.014312837827 + -34.84 | -3.26607421344208 + 1.2345678901234e+200 | 4.97933859234765e+66 + 1.2345678901234e-200 | 2.3112042409018e-67 +(5 rows) + +SELECT f1 FROM FLOAT8_TBL; + f1 +---------------------- + 0 + 1004.3 + -34.84 + 1.2345678901234e+200 + 1.2345678901234e-200 +(5 rows) + +UPDATE FLOAT8_TBL + SET f1 = FLOAT8_TBL.f1 * '-1' + WHERE FLOAT8_TBL.f1 > '0.0'; +SELECT f.f1 * '1e200' from FLOAT8_TBL f; +ERROR: value out of range: overflow +SELECT f.f1 ^ '1e200' from FLOAT8_TBL f; +ERROR: value out of range: overflow +SELECT 0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5; + ?column? +---------- + 2 +(1 row) + +SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ; +ERROR: cannot take logarithm of zero +SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ; +ERROR: cannot take logarithm of a negative number +SELECT exp(f.f1) from FLOAT8_TBL f; +ERROR: value out of range: underflow +SELECT f.f1 / '0.0' from FLOAT8_TBL f; +ERROR: division by zero +SELECT f1 FROM FLOAT8_TBL; + f1 +----------------------- + 0 + -34.84 + -1004.3 + -1.2345678901234e+200 + -1.2345678901234e-200 +(5 rows) + +-- hyperbolic functions +-- we run these with extra_float_digits = 0 too, since different platforms +-- tend to produce results that vary in the last place. +SELECT sinh(float8 '1'); + sinh +----------------- + 1.1752011936438 +(1 row) + +SELECT cosh(float8 '1'); + cosh +------------------ + 1.54308063481524 +(1 row) + +SELECT tanh(float8 '1'); + tanh +------------------- + 0.761594155955765 +(1 row) + +SELECT asinh(float8 '1'); + asinh +------------------- + 0.881373587019543 +(1 row) + +SELECT acosh(float8 '2'); + acosh +------------------ + 1.31695789692482 +(1 row) + +SELECT atanh(float8 '0.5'); + atanh +------------------- + 0.549306144334055 +(1 row) + +-- test Inf/NaN cases for hyperbolic functions +SELECT sinh(float8 'infinity'); + sinh +---------- + Infinity +(1 row) + +SELECT sinh(float8 '-infinity'); + sinh +----------- + -Infinity +(1 row) + +SELECT sinh(float8 'nan'); + sinh +------ + NaN +(1 row) + +SELECT cosh(float8 'infinity'); + cosh +---------- + Infinity +(1 row) + +SELECT cosh(float8 '-infinity'); + cosh +---------- + Infinity +(1 row) + +SELECT cosh(float8 'nan'); + cosh +------ + NaN +(1 row) + +SELECT tanh(float8 'infinity'); + tanh +------ + 1 +(1 row) + +SELECT tanh(float8 '-infinity'); + tanh +------ + -1 +(1 row) + +SELECT tanh(float8 'nan'); + tanh +------ + NaN +(1 row) + +SELECT asinh(float8 'infinity'); + asinh +---------- + Infinity +(1 row) + +SELECT asinh(float8 '-infinity'); + asinh +----------- + -Infinity +(1 row) + +SELECT asinh(float8 'nan'); + asinh +------- + NaN +(1 row) + +-- acosh(Inf) should be Inf, but some mingw versions produce NaN, so skip test +-- SELECT acosh(float8 'infinity'); +SELECT acosh(float8 '-infinity'); +ERROR: input is out of range +SELECT acosh(float8 'nan'); + acosh +------- + NaN +(1 row) + +SELECT atanh(float8 'infinity'); +ERROR: input is out of range +SELECT atanh(float8 '-infinity'); +ERROR: input is out of range +SELECT atanh(float8 'nan'); + atanh +------- + NaN +(1 row) + +RESET extra_float_digits; +-- test for over- and underflow +INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400'); +ERROR: value out of range: overflow +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400'); +ERROR: value out of range: overflow +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('1e309'); +ERROR: value out of range: overflow +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('1e309'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400'); +ERROR: value out of range: underflow +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400'); +ERROR: value out of range: underflow +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('1e-324'); +ERROR: value out of range: underflow +LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('1e-324'); + ^ +INSERT INTO FLOAT8_TBL(f1) VALUES ('1e308'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('1e-323'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('+INFINITY'::float8); +INSERT INTO FLOAT8_TBL(f1) VALUES ('+InFiNiTY'::float8); +INSERT INTO FLOAT8_TBL(f1) VALUES ('+Inf'::float8); +INSERT INTO FLOAT8_TBL(f1) VALUES ('-INFINITY'::float8); +INSERT INTO FLOAT8_TBL(f1) VALUES ('-InFiNiTY'::float8); +INSERT INTO FLOAT8_TBL(f1) VALUES ('-Inf'::float8); +INSERT INTO FLOAT8_TBL(f1) VALUES ('NaN'::float8); +INSERT INTO FLOAT8_TBL(f1) VALUES ('+naN'::float8); +INSERT INTO FLOAT8_TBL(f1) VALUES ('-naN'::float8); +-- test for over- and underflow with update statement +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e-324'::float8; +ERROR: value out of range: underflow +LINE 1: UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e-324'::fl... + ^ +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e309'::float8; +ERROR: value out of range: overflow +LINE 1: UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e309'::flo... + ^ +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e-400'::float8; +ERROR: value out of range: underflow +LINE 1: UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e-400'::fl... + ^ +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e400'::float8; +ERROR: value out of range: overflow +LINE 1: UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e400'::flo... + ^ +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='0.0'::float8; +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='+INFINITY'::float8; +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='+InFiNiTY'::float8; +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='+Inf'::float8; +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='-INFINITY'::float8; +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='-Inf'::float8; +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='NaN'::float8; +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='+naN'::float8; +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='-naN'::float8; +-- test for over- and underflow with delete statement +DELETE FROM FLOAT8_TBL WHERE f1='1e-324'::float8; +ERROR: value out of range: underflow +LINE 1: DELETE FROM FLOAT8_TBL WHERE f1='1e-324'::float8; + ^ +DELETE FROM FLOAT8_TBL WHERE f1='1e309'::float8; +ERROR: value out of range: overflow +LINE 1: DELETE FROM FLOAT8_TBL WHERE f1='1e309'::float8; + ^ +DELETE FROM FLOAT8_TBL WHERE f1='1e400'::float8; +ERROR: value out of range: overflow +LINE 1: DELETE FROM FLOAT8_TBL WHERE f1='1e400'::float8; + ^ +DELETE FROM FLOAT8_TBL WHERE f1='1e-400'::float8; +ERROR: value out of range: underflow +LINE 1: DELETE FROM FLOAT8_TBL WHERE f1='1e-400'::float8; + ^ +DELETE FROM FLOAT8_TBL WHERE f1='0.0'::float8; +DELETE FROM FLOAT8_TBL WHERE f1='+INFINITY'::float8; +DELETE FROM FLOAT8_TBL WHERE f1='+InFiNiTY'::float8; +DELETE FROM FLOAT8_TBL WHERE f1='+Inf'::float8; +DELETE FROM FLOAT8_TBL WHERE f1='-INFINITY'::float8; +DELETE FROM FLOAT8_TBL WHERE f1='-Inf'::float8; +DELETE FROM FLOAT8_TBL WHERE f1='-naN'::float8; +DELETE FROM FLOAT8_TBL WHERE f1='+naN'::float8; +DELETE FROM FLOAT8_TBL WHERE f1='NaN'::float8; +-- maintain external table consistency across platforms +-- delete all values and reinsert well-behaved ones +DELETE FROM FLOAT8_TBL; +INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200'); +SELECT f1 FROM FLOAT8_TBL; + f1 +----------------------- + 0 + -34.84 + -1004.3 + -1.2345678901234e+200 + -1.2345678901234e-200 +(5 rows) + +-- test edge-case coercions to integer +SELECT '32767.4'::float8::int2; + int2 +------- + 32767 +(1 row) + +SELECT '32767.6'::float8::int2; +ERROR: smallint out of range +SELECT '-32768.4'::float8::int2; + int2 +-------- + -32768 +(1 row) + +SELECT '-32768.6'::float8::int2; +ERROR: smallint out of range +SELECT '2147483647.4'::float8::int4; + int4 +------------ + 2147483647 +(1 row) + +SELECT '2147483647.6'::float8::int4; +ERROR: integer out of range +SELECT '-2147483648.4'::float8::int4; + int4 +------------- + -2147483648 +(1 row) + +SELECT '-2147483648.6'::float8::int4; +ERROR: integer out of range +SELECT '9223372036854773760'::float8::int8; + int8 +--------------------- + 9223372036854773760 +(1 row) + +SELECT '9223372036854775807'::float8::int8; +ERROR: bigint out of range +SELECT '-9223372036854775808.5'::float8::int8; + int8 +---------------------- + -9223372036854775808 +(1 row) + +SELECT '-9223372036854780000'::float8::int8; +ERROR: bigint out of range +-- test exact cases for trigonometric functions in degrees +SELECT x, + sind(x), + sind(x) IN (-1,-0.5,0,0.5,1) AS sind_exact +FROM (VALUES (0), (30), (90), (150), (180), + (210), (270), (330), (360)) AS t(x); + x | sind | sind_exact +-----+------+------------ + 0 | 0 | t + 30 | 0.5 | t + 90 | 1 | t + 150 | 0.5 | t + 180 | 0 | t + 210 | -0.5 | t + 270 | -1 | t + 330 | -0.5 | t + 360 | 0 | t +(9 rows) + +SELECT x, + cosd(x), + cosd(x) IN (-1,-0.5,0,0.5,1) AS cosd_exact +FROM (VALUES (0), (60), (90), (120), (180), + (240), (270), (300), (360)) AS t(x); + x | cosd | cosd_exact +-----+------+------------ + 0 | 1 | t + 60 | 0.5 | t + 90 | 0 | t + 120 | -0.5 | t + 180 | -1 | t + 240 | -0.5 | t + 270 | 0 | t + 300 | 0.5 | t + 360 | 1 | t +(9 rows) + +SELECT x, + tand(x), + tand(x) IN ('-Infinity'::float8,-1,0, + 1,'Infinity'::float8) AS tand_exact, + cotd(x), + cotd(x) IN ('-Infinity'::float8,-1,0, + 1,'Infinity'::float8) AS cotd_exact +FROM (VALUES (0), (45), (90), (135), (180), + (225), (270), (315), (360)) AS t(x); + x | tand | tand_exact | cotd | cotd_exact +-----+-----------+------------+-----------+------------ + 0 | 0 | t | Infinity | t + 45 | 1 | t | 1 | t + 90 | Infinity | t | 0 | t + 135 | -1 | t | -1 | t + 180 | 0 | t | -Infinity | t + 225 | 1 | t | 1 | t + 270 | -Infinity | t | 0 | t + 315 | -1 | t | -1 | t + 360 | 0 | t | Infinity | t +(9 rows) + +SELECT x, + asind(x), + asind(x) IN (-90,-30,0,30,90) AS asind_exact, + acosd(x), + acosd(x) IN (0,60,90,120,180) AS acosd_exact +FROM (VALUES (-1), (-0.5), (0), (0.5), (1)) AS t(x); + x | asind | asind_exact | acosd | acosd_exact +------+-------+-------------+-------+------------- + -1 | -90 | t | 180 | t + -0.5 | -30 | t | 120 | t + 0 | 0 | t | 90 | t + 0.5 | 30 | t | 60 | t + 1 | 90 | t | 0 | t +(5 rows) + +SELECT x, + atand(x), + atand(x) IN (-90,-45,0,45,90) AS atand_exact +FROM (VALUES ('-Infinity'::float8), (-1), (0), (1), + ('Infinity'::float8)) AS t(x); + x | atand | atand_exact +-----------+-------+------------- + -Infinity | -90 | t + -1 | -45 | t + 0 | 0 | t + 1 | 45 | t + Infinity | 90 | t +(5 rows) + +SELECT x, y, + atan2d(y, x), + atan2d(y, x) IN (-90,0,90,180) AS atan2d_exact +FROM (SELECT 10*cosd(a), 10*sind(a) + FROM generate_series(0, 360, 90) AS t(a)) AS t(x,y); + x | y | atan2d | atan2d_exact +-----+-----+--------+-------------- + 10 | 0 | 0 | t + 0 | 10 | 90 | t + -10 | 0 | 180 | t + 0 | -10 | -90 | t + 10 | 0 | 0 | t +(5 rows) + +-- +-- test output (and round-trip safety) of various values. +-- To ensure we're testing what we think we're testing, start with +-- float values specified by bit patterns (as a useful side effect, +-- this means we'll fail on non-IEEE platforms). +create type xfloat8; +create function xfloat8in(cstring) returns xfloat8 immutable strict + language internal as 'int8in'; +NOTICE: return type xfloat8 is only a shell +create function xfloat8out(xfloat8) returns cstring immutable strict + language internal as 'int8out'; +NOTICE: argument type xfloat8 is only a shell +create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8); +create cast (xfloat8 as float8) without function; +create cast (float8 as xfloat8) without function; +create cast (xfloat8 as bigint) without function; +create cast (bigint as xfloat8) without function; +-- float8: seeeeeee eeeeeeee eeeeeeee mmmmmmmm mmmmmmmm(x4) +-- we don't care to assume the platform's strtod() handles subnormals +-- correctly; those are "use at your own risk". However we do test +-- subnormal outputs, since those are under our control. +with testdata(bits) as (values + -- small subnormals + (x'0000000000000001'), + (x'0000000000000002'), (x'0000000000000003'), + (x'0000000000001000'), (x'0000000100000000'), + (x'0000010000000000'), (x'0000010100000000'), + (x'0000400000000000'), (x'0000400100000000'), + (x'0000800000000000'), (x'0000800000000001'), + -- these values taken from upstream testsuite + (x'00000000000f4240'), + (x'00000000016e3600'), + (x'0000008cdcdea440'), + -- borderline between subnormal and normal + (x'000ffffffffffff0'), (x'000ffffffffffff1'), + (x'000ffffffffffffe'), (x'000fffffffffffff')) +select float8send(flt) as ibits, + flt + from (select bits::bigint::xfloat8::float8 as flt + from testdata + offset 0) s; + ibits | flt +--------------------+------------------------- + \x0000000000000001 | 5e-324 + \x0000000000000002 | 1e-323 + \x0000000000000003 | 1.5e-323 + \x0000000000001000 | 2.0237e-320 + \x0000000100000000 | 2.121995791e-314 + \x0000010000000000 | 5.43230922487e-312 + \x0000010100000000 | 5.45352918278e-312 + \x0000400000000000 | 3.4766779039175e-310 + \x0000400100000000 | 3.4768901034966e-310 + \x0000800000000000 | 6.953355807835e-310 + \x0000800000000001 | 6.95335580783505e-310 + \x00000000000f4240 | 4.940656e-318 + \x00000000016e3600 | 1.18575755e-316 + \x0000008cdcdea440 | 2.989102097996e-312 + \x000ffffffffffff0 | 2.2250738585071935e-308 + \x000ffffffffffff1 | 2.225073858507194e-308 + \x000ffffffffffffe | 2.2250738585072004e-308 + \x000fffffffffffff | 2.225073858507201e-308 +(18 rows) + +-- round-trip tests +with testdata(bits) as (values + (x'0000000000000000'), + -- smallest normal values + (x'0010000000000000'), (x'0010000000000001'), + (x'0010000000000002'), (x'0018000000000000'), + -- + (x'3ddb7cdfd9d7bdba'), (x'3ddb7cdfd9d7bdbb'), (x'3ddb7cdfd9d7bdbc'), + (x'3e112e0be826d694'), (x'3e112e0be826d695'), (x'3e112e0be826d696'), + (x'3e45798ee2308c39'), (x'3e45798ee2308c3a'), (x'3e45798ee2308c3b'), + (x'3e7ad7f29abcaf47'), (x'3e7ad7f29abcaf48'), (x'3e7ad7f29abcaf49'), + (x'3eb0c6f7a0b5ed8c'), (x'3eb0c6f7a0b5ed8d'), (x'3eb0c6f7a0b5ed8e'), + (x'3ee4f8b588e368ef'), (x'3ee4f8b588e368f0'), (x'3ee4f8b588e368f1'), + (x'3f1a36e2eb1c432c'), (x'3f1a36e2eb1c432d'), (x'3f1a36e2eb1c432e'), + (x'3f50624dd2f1a9fb'), (x'3f50624dd2f1a9fc'), (x'3f50624dd2f1a9fd'), + (x'3f847ae147ae147a'), (x'3f847ae147ae147b'), (x'3f847ae147ae147c'), + (x'3fb9999999999999'), (x'3fb999999999999a'), (x'3fb999999999999b'), + -- values very close to 1 + (x'3feffffffffffff0'), (x'3feffffffffffff1'), (x'3feffffffffffff2'), + (x'3feffffffffffff3'), (x'3feffffffffffff4'), (x'3feffffffffffff5'), + (x'3feffffffffffff6'), (x'3feffffffffffff7'), (x'3feffffffffffff8'), + (x'3feffffffffffff9'), (x'3feffffffffffffa'), (x'3feffffffffffffb'), + (x'3feffffffffffffc'), (x'3feffffffffffffd'), (x'3feffffffffffffe'), + (x'3fefffffffffffff'), + (x'3ff0000000000000'), + (x'3ff0000000000001'), (x'3ff0000000000002'), (x'3ff0000000000003'), + (x'3ff0000000000004'), (x'3ff0000000000005'), (x'3ff0000000000006'), + (x'3ff0000000000007'), (x'3ff0000000000008'), (x'3ff0000000000009'), + -- + (x'3ff921fb54442d18'), + (x'4005bf0a8b14576a'), + (x'400921fb54442d18'), + -- + (x'4023ffffffffffff'), (x'4024000000000000'), (x'4024000000000001'), + (x'4058ffffffffffff'), (x'4059000000000000'), (x'4059000000000001'), + (x'408f3fffffffffff'), (x'408f400000000000'), (x'408f400000000001'), + (x'40c387ffffffffff'), (x'40c3880000000000'), (x'40c3880000000001'), + (x'40f869ffffffffff'), (x'40f86a0000000000'), (x'40f86a0000000001'), + (x'412e847fffffffff'), (x'412e848000000000'), (x'412e848000000001'), + (x'416312cfffffffff'), (x'416312d000000000'), (x'416312d000000001'), + (x'4197d783ffffffff'), (x'4197d78400000000'), (x'4197d78400000001'), + (x'41cdcd64ffffffff'), (x'41cdcd6500000000'), (x'41cdcd6500000001'), + (x'4202a05f1fffffff'), (x'4202a05f20000000'), (x'4202a05f20000001'), + (x'42374876e7ffffff'), (x'42374876e8000000'), (x'42374876e8000001'), + (x'426d1a94a1ffffff'), (x'426d1a94a2000000'), (x'426d1a94a2000001'), + (x'42a2309ce53fffff'), (x'42a2309ce5400000'), (x'42a2309ce5400001'), + (x'42d6bcc41e8fffff'), (x'42d6bcc41e900000'), (x'42d6bcc41e900001'), + (x'430c6bf52633ffff'), (x'430c6bf526340000'), (x'430c6bf526340001'), + (x'4341c37937e07fff'), (x'4341c37937e08000'), (x'4341c37937e08001'), + (x'4376345785d89fff'), (x'4376345785d8a000'), (x'4376345785d8a001'), + (x'43abc16d674ec7ff'), (x'43abc16d674ec800'), (x'43abc16d674ec801'), + (x'43e158e460913cff'), (x'43e158e460913d00'), (x'43e158e460913d01'), + (x'4415af1d78b58c3f'), (x'4415af1d78b58c40'), (x'4415af1d78b58c41'), + (x'444b1ae4d6e2ef4f'), (x'444b1ae4d6e2ef50'), (x'444b1ae4d6e2ef51'), + (x'4480f0cf064dd591'), (x'4480f0cf064dd592'), (x'4480f0cf064dd593'), + (x'44b52d02c7e14af5'), (x'44b52d02c7e14af6'), (x'44b52d02c7e14af7'), + (x'44ea784379d99db3'), (x'44ea784379d99db4'), (x'44ea784379d99db5'), + (x'45208b2a2c280290'), (x'45208b2a2c280291'), (x'45208b2a2c280292'), + -- + (x'7feffffffffffffe'), (x'7fefffffffffffff'), + -- round to even tests (+ve) + (x'4350000000000002'), + (x'4350000000002e06'), + (x'4352000000000003'), + (x'4352000000000004'), + (x'4358000000000003'), + (x'4358000000000004'), + (x'435f000000000020'), + -- round to even tests (-ve) + (x'c350000000000002'), + (x'c350000000002e06'), + (x'c352000000000003'), + (x'c352000000000004'), + (x'c358000000000003'), + (x'c358000000000004'), + (x'c35f000000000020'), + -- exercise fixed-point memmoves + (x'42dc12218377de66'), + (x'42a674e79c5fe51f'), + (x'4271f71fb04cb74c'), + (x'423cbe991a145879'), + (x'4206fee0e1a9e061'), + (x'41d26580b487e6b4'), + (x'419d6f34540ca453'), + (x'41678c29dcd6e9dc'), + (x'4132d687e3df217d'), + (x'40fe240c9fcb68c8'), + (x'40c81cd6e63c53d3'), + (x'40934a4584fd0fdc'), + (x'405edd3c07fb4c93'), + (x'4028b0fcd32f7076'), + (x'3ff3c0ca428c59f8'), + -- these cases come from the upstream's testsuite + -- LotsOfTrailingZeros) + (x'3e60000000000000'), + -- Regression + (x'c352bd2668e077c4'), + (x'434018601510c000'), + (x'43d055dc36f24000'), + (x'43e052961c6f8000'), + (x'3ff3c0ca2a5b1d5d'), + -- LooksLikePow5 + (x'4830f0cf064dd592'), + (x'4840f0cf064dd592'), + (x'4850f0cf064dd592'), + -- OutputLength + (x'3ff3333333333333'), + (x'3ff3ae147ae147ae'), + (x'3ff3be76c8b43958'), + (x'3ff3c083126e978d'), + (x'3ff3c0c1fc8f3238'), + (x'3ff3c0c9539b8887'), + (x'3ff3c0ca2a5b1d5d'), + (x'3ff3c0ca4283de1b'), + (x'3ff3c0ca43db770a'), + (x'3ff3c0ca428abd53'), + (x'3ff3c0ca428c1d2b'), + (x'3ff3c0ca428c51f2'), + (x'3ff3c0ca428c58fc'), + (x'3ff3c0ca428c59dd'), + (x'3ff3c0ca428c59f8'), + (x'3ff3c0ca428c59fb'), + -- 32-bit chunking + (x'40112e0be8047a7d'), + (x'40112e0be815a889'), + (x'40112e0be826d695'), + (x'40112e0be83804a1'), + (x'40112e0be84932ad'), + -- MinMaxShift + (x'0040000000000000'), + (x'007fffffffffffff'), + (x'0290000000000000'), + (x'029fffffffffffff'), + (x'4350000000000000'), + (x'435fffffffffffff'), + (x'1330000000000000'), + (x'133fffffffffffff'), + (x'3a6fa7161a4d6e0c') +) +select float8send(flt) as ibits, + flt, + flt::text::float8 as r_flt, + float8send(flt::text::float8) as obits, + float8send(flt::text::float8) = float8send(flt) as correct + from (select bits::bigint::xfloat8::float8 as flt + from testdata + offset 0) s; + ibits | flt | r_flt | obits | correct +--------------------+-------------------------+-------------------------+--------------------+--------- + \x0000000000000000 | 0 | 0 | \x0000000000000000 | t + \x0010000000000000 | 2.2250738585072014e-308 | 2.2250738585072014e-308 | \x0010000000000000 | t + \x0010000000000001 | 2.225073858507202e-308 | 2.225073858507202e-308 | \x0010000000000001 | t + \x0010000000000002 | 2.2250738585072024e-308 | 2.2250738585072024e-308 | \x0010000000000002 | t + \x0018000000000000 | 3.337610787760802e-308 | 3.337610787760802e-308 | \x0018000000000000 | t + \x3ddb7cdfd9d7bdba | 9.999999999999999e-11 | 9.999999999999999e-11 | \x3ddb7cdfd9d7bdba | t + \x3ddb7cdfd9d7bdbb | 1e-10 | 1e-10 | \x3ddb7cdfd9d7bdbb | t + \x3ddb7cdfd9d7bdbc | 1.0000000000000002e-10 | 1.0000000000000002e-10 | \x3ddb7cdfd9d7bdbc | t + \x3e112e0be826d694 | 9.999999999999999e-10 | 9.999999999999999e-10 | \x3e112e0be826d694 | t + \x3e112e0be826d695 | 1e-09 | 1e-09 | \x3e112e0be826d695 | t + \x3e112e0be826d696 | 1.0000000000000003e-09 | 1.0000000000000003e-09 | \x3e112e0be826d696 | t + \x3e45798ee2308c39 | 9.999999999999999e-09 | 9.999999999999999e-09 | \x3e45798ee2308c39 | t + \x3e45798ee2308c3a | 1e-08 | 1e-08 | \x3e45798ee2308c3a | t + \x3e45798ee2308c3b | 1.0000000000000002e-08 | 1.0000000000000002e-08 | \x3e45798ee2308c3b | t + \x3e7ad7f29abcaf47 | 9.999999999999998e-08 | 9.999999999999998e-08 | \x3e7ad7f29abcaf47 | t + \x3e7ad7f29abcaf48 | 1e-07 | 1e-07 | \x3e7ad7f29abcaf48 | t + \x3e7ad7f29abcaf49 | 1.0000000000000001e-07 | 1.0000000000000001e-07 | \x3e7ad7f29abcaf49 | t + \x3eb0c6f7a0b5ed8c | 9.999999999999997e-07 | 9.999999999999997e-07 | \x3eb0c6f7a0b5ed8c | t + \x3eb0c6f7a0b5ed8d | 1e-06 | 1e-06 | \x3eb0c6f7a0b5ed8d | t + \x3eb0c6f7a0b5ed8e | 1.0000000000000002e-06 | 1.0000000000000002e-06 | \x3eb0c6f7a0b5ed8e | t + \x3ee4f8b588e368ef | 9.999999999999997e-06 | 9.999999999999997e-06 | \x3ee4f8b588e368ef | t + \x3ee4f8b588e368f0 | 9.999999999999999e-06 | 9.999999999999999e-06 | \x3ee4f8b588e368f0 | t + \x3ee4f8b588e368f1 | 1e-05 | 1e-05 | \x3ee4f8b588e368f1 | t + \x3f1a36e2eb1c432c | 9.999999999999999e-05 | 9.999999999999999e-05 | \x3f1a36e2eb1c432c | t + \x3f1a36e2eb1c432d | 0.0001 | 0.0001 | \x3f1a36e2eb1c432d | t + \x3f1a36e2eb1c432e | 0.00010000000000000002 | 0.00010000000000000002 | \x3f1a36e2eb1c432e | t + \x3f50624dd2f1a9fb | 0.0009999999999999998 | 0.0009999999999999998 | \x3f50624dd2f1a9fb | t + \x3f50624dd2f1a9fc | 0.001 | 0.001 | \x3f50624dd2f1a9fc | t + \x3f50624dd2f1a9fd | 0.0010000000000000002 | 0.0010000000000000002 | \x3f50624dd2f1a9fd | t + \x3f847ae147ae147a | 0.009999999999999998 | 0.009999999999999998 | \x3f847ae147ae147a | t + \x3f847ae147ae147b | 0.01 | 0.01 | \x3f847ae147ae147b | t + \x3f847ae147ae147c | 0.010000000000000002 | 0.010000000000000002 | \x3f847ae147ae147c | t + \x3fb9999999999999 | 0.09999999999999999 | 0.09999999999999999 | \x3fb9999999999999 | t + \x3fb999999999999a | 0.1 | 0.1 | \x3fb999999999999a | t + \x3fb999999999999b | 0.10000000000000002 | 0.10000000000000002 | \x3fb999999999999b | t + \x3feffffffffffff0 | 0.9999999999999982 | 0.9999999999999982 | \x3feffffffffffff0 | t + \x3feffffffffffff1 | 0.9999999999999983 | 0.9999999999999983 | \x3feffffffffffff1 | t + \x3feffffffffffff2 | 0.9999999999999984 | 0.9999999999999984 | \x3feffffffffffff2 | t + \x3feffffffffffff3 | 0.9999999999999986 | 0.9999999999999986 | \x3feffffffffffff3 | t + \x3feffffffffffff4 | 0.9999999999999987 | 0.9999999999999987 | \x3feffffffffffff4 | t + \x3feffffffffffff5 | 0.9999999999999988 | 0.9999999999999988 | \x3feffffffffffff5 | t + \x3feffffffffffff6 | 0.9999999999999989 | 0.9999999999999989 | \x3feffffffffffff6 | t + \x3feffffffffffff7 | 0.999999999999999 | 0.999999999999999 | \x3feffffffffffff7 | t + \x3feffffffffffff8 | 0.9999999999999991 | 0.9999999999999991 | \x3feffffffffffff8 | t + \x3feffffffffffff9 | 0.9999999999999992 | 0.9999999999999992 | \x3feffffffffffff9 | t + \x3feffffffffffffa | 0.9999999999999993 | 0.9999999999999993 | \x3feffffffffffffa | t + \x3feffffffffffffb | 0.9999999999999994 | 0.9999999999999994 | \x3feffffffffffffb | t + \x3feffffffffffffc | 0.9999999999999996 | 0.9999999999999996 | \x3feffffffffffffc | t + \x3feffffffffffffd | 0.9999999999999997 | 0.9999999999999997 | \x3feffffffffffffd | t + \x3feffffffffffffe | 0.9999999999999998 | 0.9999999999999998 | \x3feffffffffffffe | t + \x3fefffffffffffff | 0.9999999999999999 | 0.9999999999999999 | \x3fefffffffffffff | t + \x3ff0000000000000 | 1 | 1 | \x3ff0000000000000 | t + \x3ff0000000000001 | 1.0000000000000002 | 1.0000000000000002 | \x3ff0000000000001 | t + \x3ff0000000000002 | 1.0000000000000004 | 1.0000000000000004 | \x3ff0000000000002 | t + \x3ff0000000000003 | 1.0000000000000007 | 1.0000000000000007 | \x3ff0000000000003 | t + \x3ff0000000000004 | 1.0000000000000009 | 1.0000000000000009 | \x3ff0000000000004 | t + \x3ff0000000000005 | 1.000000000000001 | 1.000000000000001 | \x3ff0000000000005 | t + \x3ff0000000000006 | 1.0000000000000013 | 1.0000000000000013 | \x3ff0000000000006 | t + \x3ff0000000000007 | 1.0000000000000016 | 1.0000000000000016 | \x3ff0000000000007 | t + \x3ff0000000000008 | 1.0000000000000018 | 1.0000000000000018 | \x3ff0000000000008 | t + \x3ff0000000000009 | 1.000000000000002 | 1.000000000000002 | \x3ff0000000000009 | t + \x3ff921fb54442d18 | 1.5707963267948966 | 1.5707963267948966 | \x3ff921fb54442d18 | t + \x4005bf0a8b14576a | 2.7182818284590455 | 2.7182818284590455 | \x4005bf0a8b14576a | t + \x400921fb54442d18 | 3.141592653589793 | 3.141592653589793 | \x400921fb54442d18 | t + \x4023ffffffffffff | 9.999999999999998 | 9.999999999999998 | \x4023ffffffffffff | t + \x4024000000000000 | 10 | 10 | \x4024000000000000 | t + \x4024000000000001 | 10.000000000000002 | 10.000000000000002 | \x4024000000000001 | t + \x4058ffffffffffff | 99.99999999999999 | 99.99999999999999 | \x4058ffffffffffff | t + \x4059000000000000 | 100 | 100 | \x4059000000000000 | t + \x4059000000000001 | 100.00000000000001 | 100.00000000000001 | \x4059000000000001 | t + \x408f3fffffffffff | 999.9999999999999 | 999.9999999999999 | \x408f3fffffffffff | t + \x408f400000000000 | 1000 | 1000 | \x408f400000000000 | t + \x408f400000000001 | 1000.0000000000001 | 1000.0000000000001 | \x408f400000000001 | t + \x40c387ffffffffff | 9999.999999999998 | 9999.999999999998 | \x40c387ffffffffff | t + \x40c3880000000000 | 10000 | 10000 | \x40c3880000000000 | t + \x40c3880000000001 | 10000.000000000002 | 10000.000000000002 | \x40c3880000000001 | t + \x40f869ffffffffff | 99999.99999999999 | 99999.99999999999 | \x40f869ffffffffff | t + \x40f86a0000000000 | 100000 | 100000 | \x40f86a0000000000 | t + \x40f86a0000000001 | 100000.00000000001 | 100000.00000000001 | \x40f86a0000000001 | t + \x412e847fffffffff | 999999.9999999999 | 999999.9999999999 | \x412e847fffffffff | t + \x412e848000000000 | 1000000 | 1000000 | \x412e848000000000 | t + \x412e848000000001 | 1000000.0000000001 | 1000000.0000000001 | \x412e848000000001 | t + \x416312cfffffffff | 9999999.999999998 | 9999999.999999998 | \x416312cfffffffff | t + \x416312d000000000 | 10000000 | 10000000 | \x416312d000000000 | t + \x416312d000000001 | 10000000.000000002 | 10000000.000000002 | \x416312d000000001 | t + \x4197d783ffffffff | 99999999.99999999 | 99999999.99999999 | \x4197d783ffffffff | t + \x4197d78400000000 | 100000000 | 100000000 | \x4197d78400000000 | t + \x4197d78400000001 | 100000000.00000001 | 100000000.00000001 | \x4197d78400000001 | t + \x41cdcd64ffffffff | 999999999.9999999 | 999999999.9999999 | \x41cdcd64ffffffff | t + \x41cdcd6500000000 | 1000000000 | 1000000000 | \x41cdcd6500000000 | t + \x41cdcd6500000001 | 1000000000.0000001 | 1000000000.0000001 | \x41cdcd6500000001 | t + \x4202a05f1fffffff | 9999999999.999998 | 9999999999.999998 | \x4202a05f1fffffff | t + \x4202a05f20000000 | 10000000000 | 10000000000 | \x4202a05f20000000 | t + \x4202a05f20000001 | 10000000000.000002 | 10000000000.000002 | \x4202a05f20000001 | t + \x42374876e7ffffff | 99999999999.99998 | 99999999999.99998 | \x42374876e7ffffff | t + \x42374876e8000000 | 100000000000 | 100000000000 | \x42374876e8000000 | t + \x42374876e8000001 | 100000000000.00002 | 100000000000.00002 | \x42374876e8000001 | t + \x426d1a94a1ffffff | 999999999999.9999 | 999999999999.9999 | \x426d1a94a1ffffff | t + \x426d1a94a2000000 | 1000000000000 | 1000000000000 | \x426d1a94a2000000 | t + \x426d1a94a2000001 | 1000000000000.0001 | 1000000000000.0001 | \x426d1a94a2000001 | t + \x42a2309ce53fffff | 9999999999999.998 | 9999999999999.998 | \x42a2309ce53fffff | t + \x42a2309ce5400000 | 10000000000000 | 10000000000000 | \x42a2309ce5400000 | t + \x42a2309ce5400001 | 10000000000000.002 | 10000000000000.002 | \x42a2309ce5400001 | t + \x42d6bcc41e8fffff | 99999999999999.98 | 99999999999999.98 | \x42d6bcc41e8fffff | t + \x42d6bcc41e900000 | 100000000000000 | 100000000000000 | \x42d6bcc41e900000 | t + \x42d6bcc41e900001 | 100000000000000.02 | 100000000000000.02 | \x42d6bcc41e900001 | t + \x430c6bf52633ffff | 999999999999999.9 | 999999999999999.9 | \x430c6bf52633ffff | t + \x430c6bf526340000 | 1e+15 | 1e+15 | \x430c6bf526340000 | t + \x430c6bf526340001 | 1.0000000000000001e+15 | 1.0000000000000001e+15 | \x430c6bf526340001 | t + \x4341c37937e07fff | 9.999999999999998e+15 | 9.999999999999998e+15 | \x4341c37937e07fff | t + \x4341c37937e08000 | 1e+16 | 1e+16 | \x4341c37937e08000 | t + \x4341c37937e08001 | 1.0000000000000002e+16 | 1.0000000000000002e+16 | \x4341c37937e08001 | t + \x4376345785d89fff | 9.999999999999998e+16 | 9.999999999999998e+16 | \x4376345785d89fff | t + \x4376345785d8a000 | 1e+17 | 1e+17 | \x4376345785d8a000 | t + \x4376345785d8a001 | 1.0000000000000002e+17 | 1.0000000000000002e+17 | \x4376345785d8a001 | t + \x43abc16d674ec7ff | 9.999999999999999e+17 | 9.999999999999999e+17 | \x43abc16d674ec7ff | t + \x43abc16d674ec800 | 1e+18 | 1e+18 | \x43abc16d674ec800 | t + \x43abc16d674ec801 | 1.0000000000000001e+18 | 1.0000000000000001e+18 | \x43abc16d674ec801 | t + \x43e158e460913cff | 9.999999999999998e+18 | 9.999999999999998e+18 | \x43e158e460913cff | t + \x43e158e460913d00 | 1e+19 | 1e+19 | \x43e158e460913d00 | t + \x43e158e460913d01 | 1.0000000000000002e+19 | 1.0000000000000002e+19 | \x43e158e460913d01 | t + \x4415af1d78b58c3f | 9.999999999999998e+19 | 9.999999999999998e+19 | \x4415af1d78b58c3f | t + \x4415af1d78b58c40 | 1e+20 | 1e+20 | \x4415af1d78b58c40 | t + \x4415af1d78b58c41 | 1.0000000000000002e+20 | 1.0000000000000002e+20 | \x4415af1d78b58c41 | t + \x444b1ae4d6e2ef4f | 9.999999999999999e+20 | 9.999999999999999e+20 | \x444b1ae4d6e2ef4f | t + \x444b1ae4d6e2ef50 | 1e+21 | 1e+21 | \x444b1ae4d6e2ef50 | t + \x444b1ae4d6e2ef51 | 1.0000000000000001e+21 | 1.0000000000000001e+21 | \x444b1ae4d6e2ef51 | t + \x4480f0cf064dd591 | 9.999999999999998e+21 | 9.999999999999998e+21 | \x4480f0cf064dd591 | t + \x4480f0cf064dd592 | 1e+22 | 1e+22 | \x4480f0cf064dd592 | t + \x4480f0cf064dd593 | 1.0000000000000002e+22 | 1.0000000000000002e+22 | \x4480f0cf064dd593 | t + \x44b52d02c7e14af5 | 9.999999999999997e+22 | 9.999999999999997e+22 | \x44b52d02c7e14af5 | t + \x44b52d02c7e14af6 | 9.999999999999999e+22 | 9.999999999999999e+22 | \x44b52d02c7e14af6 | t + \x44b52d02c7e14af7 | 1.0000000000000001e+23 | 1.0000000000000001e+23 | \x44b52d02c7e14af7 | t + \x44ea784379d99db3 | 9.999999999999998e+23 | 9.999999999999998e+23 | \x44ea784379d99db3 | t + \x44ea784379d99db4 | 1e+24 | 1e+24 | \x44ea784379d99db4 | t + \x44ea784379d99db5 | 1.0000000000000001e+24 | 1.0000000000000001e+24 | \x44ea784379d99db5 | t + \x45208b2a2c280290 | 9.999999999999999e+24 | 9.999999999999999e+24 | \x45208b2a2c280290 | t + \x45208b2a2c280291 | 1e+25 | 1e+25 | \x45208b2a2c280291 | t + \x45208b2a2c280292 | 1.0000000000000003e+25 | 1.0000000000000003e+25 | \x45208b2a2c280292 | t + \x7feffffffffffffe | 1.7976931348623155e+308 | 1.7976931348623155e+308 | \x7feffffffffffffe | t + \x7fefffffffffffff | 1.7976931348623157e+308 | 1.7976931348623157e+308 | \x7fefffffffffffff | t + \x4350000000000002 | 1.8014398509481992e+16 | 1.8014398509481992e+16 | \x4350000000000002 | t + \x4350000000002e06 | 1.8014398509529112e+16 | 1.8014398509529112e+16 | \x4350000000002e06 | t + \x4352000000000003 | 2.0266198323167244e+16 | 2.0266198323167244e+16 | \x4352000000000003 | t + \x4352000000000004 | 2.0266198323167248e+16 | 2.0266198323167248e+16 | \x4352000000000004 | t + \x4358000000000003 | 2.7021597764222988e+16 | 2.7021597764222988e+16 | \x4358000000000003 | t + \x4358000000000004 | 2.7021597764222992e+16 | 2.7021597764222992e+16 | \x4358000000000004 | t + \x435f000000000020 | 3.4902897112121472e+16 | 3.4902897112121472e+16 | \x435f000000000020 | t + \xc350000000000002 | -1.8014398509481992e+16 | -1.8014398509481992e+16 | \xc350000000000002 | t + \xc350000000002e06 | -1.8014398509529112e+16 | -1.8014398509529112e+16 | \xc350000000002e06 | t + \xc352000000000003 | -2.0266198323167244e+16 | -2.0266198323167244e+16 | \xc352000000000003 | t + \xc352000000000004 | -2.0266198323167248e+16 | -2.0266198323167248e+16 | \xc352000000000004 | t + \xc358000000000003 | -2.7021597764222988e+16 | -2.7021597764222988e+16 | \xc358000000000003 | t + \xc358000000000004 | -2.7021597764222992e+16 | -2.7021597764222992e+16 | \xc358000000000004 | t + \xc35f000000000020 | -3.4902897112121472e+16 | -3.4902897112121472e+16 | \xc35f000000000020 | t + \x42dc12218377de66 | 123456789012345.6 | 123456789012345.6 | \x42dc12218377de66 | t + \x42a674e79c5fe51f | 12345678901234.56 | 12345678901234.56 | \x42a674e79c5fe51f | t + \x4271f71fb04cb74c | 1234567890123.456 | 1234567890123.456 | \x4271f71fb04cb74c | t + \x423cbe991a145879 | 123456789012.3456 | 123456789012.3456 | \x423cbe991a145879 | t + \x4206fee0e1a9e061 | 12345678901.23456 | 12345678901.23456 | \x4206fee0e1a9e061 | t + \x41d26580b487e6b4 | 1234567890.123456 | 1234567890.123456 | \x41d26580b487e6b4 | t + \x419d6f34540ca453 | 123456789.0123456 | 123456789.0123456 | \x419d6f34540ca453 | t + \x41678c29dcd6e9dc | 12345678.90123456 | 12345678.90123456 | \x41678c29dcd6e9dc | t + \x4132d687e3df217d | 1234567.890123456 | 1234567.890123456 | \x4132d687e3df217d | t + \x40fe240c9fcb68c8 | 123456.7890123456 | 123456.7890123456 | \x40fe240c9fcb68c8 | t + \x40c81cd6e63c53d3 | 12345.67890123456 | 12345.67890123456 | \x40c81cd6e63c53d3 | t + \x40934a4584fd0fdc | 1234.567890123456 | 1234.567890123456 | \x40934a4584fd0fdc | t + \x405edd3c07fb4c93 | 123.4567890123456 | 123.4567890123456 | \x405edd3c07fb4c93 | t + \x4028b0fcd32f7076 | 12.34567890123456 | 12.34567890123456 | \x4028b0fcd32f7076 | t + \x3ff3c0ca428c59f8 | 1.234567890123456 | 1.234567890123456 | \x3ff3c0ca428c59f8 | t + \x3e60000000000000 | 2.9802322387695312e-08 | 2.9802322387695312e-08 | \x3e60000000000000 | t + \xc352bd2668e077c4 | -2.1098088986959632e+16 | -2.1098088986959632e+16 | \xc352bd2668e077c4 | t + \x434018601510c000 | 9.0608011534336e+15 | 9.0608011534336e+15 | \x434018601510c000 | t + \x43d055dc36f24000 | 4.708356024711512e+18 | 4.708356024711512e+18 | \x43d055dc36f24000 | t + \x43e052961c6f8000 | 9.409340012568248e+18 | 9.409340012568248e+18 | \x43e052961c6f8000 | t + \x3ff3c0ca2a5b1d5d | 1.2345678 | 1.2345678 | \x3ff3c0ca2a5b1d5d | t + \x4830f0cf064dd592 | 5.764607523034235e+39 | 5.764607523034235e+39 | \x4830f0cf064dd592 | t + \x4840f0cf064dd592 | 1.152921504606847e+40 | 1.152921504606847e+40 | \x4840f0cf064dd592 | t + \x4850f0cf064dd592 | 2.305843009213694e+40 | 2.305843009213694e+40 | \x4850f0cf064dd592 | t + \x3ff3333333333333 | 1.2 | 1.2 | \x3ff3333333333333 | t + \x3ff3ae147ae147ae | 1.23 | 1.23 | \x3ff3ae147ae147ae | t + \x3ff3be76c8b43958 | 1.234 | 1.234 | \x3ff3be76c8b43958 | t + \x3ff3c083126e978d | 1.2345 | 1.2345 | \x3ff3c083126e978d | t + \x3ff3c0c1fc8f3238 | 1.23456 | 1.23456 | \x3ff3c0c1fc8f3238 | t + \x3ff3c0c9539b8887 | 1.234567 | 1.234567 | \x3ff3c0c9539b8887 | t + \x3ff3c0ca2a5b1d5d | 1.2345678 | 1.2345678 | \x3ff3c0ca2a5b1d5d | t + \x3ff3c0ca4283de1b | 1.23456789 | 1.23456789 | \x3ff3c0ca4283de1b | t + \x3ff3c0ca43db770a | 1.234567895 | 1.234567895 | \x3ff3c0ca43db770a | t + \x3ff3c0ca428abd53 | 1.2345678901 | 1.2345678901 | \x3ff3c0ca428abd53 | t + \x3ff3c0ca428c1d2b | 1.23456789012 | 1.23456789012 | \x3ff3c0ca428c1d2b | t + \x3ff3c0ca428c51f2 | 1.234567890123 | 1.234567890123 | \x3ff3c0ca428c51f2 | t + \x3ff3c0ca428c58fc | 1.2345678901234 | 1.2345678901234 | \x3ff3c0ca428c58fc | t + \x3ff3c0ca428c59dd | 1.23456789012345 | 1.23456789012345 | \x3ff3c0ca428c59dd | t + \x3ff3c0ca428c59f8 | 1.234567890123456 | 1.234567890123456 | \x3ff3c0ca428c59f8 | t + \x3ff3c0ca428c59fb | 1.2345678901234567 | 1.2345678901234567 | \x3ff3c0ca428c59fb | t + \x40112e0be8047a7d | 4.294967294 | 4.294967294 | \x40112e0be8047a7d | t + \x40112e0be815a889 | 4.294967295 | 4.294967295 | \x40112e0be815a889 | t + \x40112e0be826d695 | 4.294967296 | 4.294967296 | \x40112e0be826d695 | t + \x40112e0be83804a1 | 4.294967297 | 4.294967297 | \x40112e0be83804a1 | t + \x40112e0be84932ad | 4.294967298 | 4.294967298 | \x40112e0be84932ad | t + \x0040000000000000 | 1.7800590868057611e-307 | 1.7800590868057611e-307 | \x0040000000000000 | t + \x007fffffffffffff | 2.8480945388892175e-306 | 2.8480945388892175e-306 | \x007fffffffffffff | t + \x0290000000000000 | 2.446494580089078e-296 | 2.446494580089078e-296 | \x0290000000000000 | t + \x029fffffffffffff | 4.8929891601781557e-296 | 4.8929891601781557e-296 | \x029fffffffffffff | t + \x4350000000000000 | 1.8014398509481984e+16 | 1.8014398509481984e+16 | \x4350000000000000 | t + \x435fffffffffffff | 3.6028797018963964e+16 | 3.6028797018963964e+16 | \x435fffffffffffff | t + \x1330000000000000 | 2.900835519859558e-216 | 2.900835519859558e-216 | \x1330000000000000 | t + \x133fffffffffffff | 5.801671039719115e-216 | 5.801671039719115e-216 | \x133fffffffffffff | t + \x3a6fa7161a4d6e0c | 3.196104012172126e-27 | 3.196104012172126e-27 | \x3a6fa7161a4d6e0c | t +(209 rows) + +-- clean up, lest opr_sanity complain +drop type xfloat8 cascade; +NOTICE: drop cascades to 6 other objects +DETAIL: drop cascades to function xfloat8in(cstring) +drop cascades to function xfloat8out(xfloat8) +drop cascades to cast from xfloat8 to double precision +drop cascades to cast from double precision to xfloat8 +drop cascades to cast from xfloat8 to bigint +drop cascades to cast from bigint to xfloat8 diff --git a/src/test/singlenode_regress/expected/foreign_data.out b/src/test/singlenode_regress/expected/foreign_data.out new file mode 100644 index 00000000000..47275f6f1a2 --- /dev/null +++ b/src/test/singlenode_regress/expected/foreign_data.out @@ -0,0 +1,2097 @@ +-- +-- Test foreign-data wrapper and server management. +-- +-- In GPDB, there are a couple of special built-in objects, to handle +-- backwards-compatibility with external tables. They are the FDW called +-- 'gp_exttable_fdw', foreign server 'gp_exttable_server'. We don't want those +-- to appear in the test output, to keep the expected output unchanged from +-- upstream, as much as possible. The queries on the pg_foreign_* catalog +-- tables, and the \dew and \des commands, have been modified to exclude them. +-- +-- There's no way to match everything that does *not* contain a string in a \d +-- pattern, so we use a pattern that is close enough for our purposes: This +-- pattern includes everything that begins with a letter other than 'p', and +-- also including everything that begins with 'p' followed by any other letter +-- but 'g' (the 2nd rule is needed to include the 'postgresql' FDW used in the +-- test). +\set NO_BUILTINS ([a-fh-z]?*)|(g[a-oq-z]?*) +-- Clean up in case a prior regression run failed +-- Suppress NOTICE messages when roles don't exist +SET client_min_messages TO 'warning'; +DROP ROLE IF EXISTS regress_foreign_data_user, regress_test_role, regress_test_role2, regress_test_role_super, regress_test_indirect, regress_unprivileged_role; +RESET client_min_messages; +CREATE ROLE regress_foreign_data_user LOGIN SUPERUSER; +SET SESSION AUTHORIZATION 'regress_foreign_data_user'; +CREATE ROLE regress_test_role; +CREATE ROLE regress_test_role2; +CREATE ROLE regress_test_role_super SUPERUSER; +CREATE ROLE regress_test_indirect; +CREATE ROLE regress_unprivileged_role; +CREATE FOREIGN DATA WRAPPER dummy; +COMMENT ON FOREIGN DATA WRAPPER dummy IS 'useless'; +CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator; +-- At this point we should have 2 built-in wrappers and no servers. +SELECT fdwname, fdwhandler::regproc, fdwvalidator::regproc, fdwoptions FROM pg_foreign_data_wrapper WHERE fdwname <> 'gp_exttable_fdw' ORDER BY 1, 2, 3; + fdwname | fdwhandler | fdwvalidator | fdwoptions +------------+------------+--------------------------+------------ + dummy | - | - | + postgresql | - | postgresql_fdw_validator | +(2 rows) + +SELECT srvname, srvoptions FROM pg_foreign_server WHERE srvname <> 'gp_exttable_server'; + srvname | srvoptions +---------+------------ +(0 rows) + +SELECT * FROM pg_user_mapping; + oid | umuser | umserver | umoptions +-----+--------+----------+----------- +(0 rows) + +-- CREATE FOREIGN DATA WRAPPER +CREATE FOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR +ERROR: function bar(text[], oid) does not exist +CREATE FOREIGN DATA WRAPPER foo; +\dew :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator +------------+---------------------------+---------+-------------------------- + dummy | regress_foreign_data_user | - | - + foo | regress_foreign_data_user | - | - + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator +(3 rows) + +CREATE FOREIGN DATA WRAPPER foo; -- duplicate +ERROR: foreign-data wrapper "foo" already exists +DROP FOREIGN DATA WRAPPER foo; +CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1'); +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+---------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | - | | (testing '1') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +DROP FOREIGN DATA WRAPPER foo; +CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', testing '2'); -- ERROR +ERROR: option "testing" provided more than once +CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', another '2'); +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+----------------------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | - | | (testing '1', another '2') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +DROP FOREIGN DATA WRAPPER foo; +SET ROLE regress_test_role; +CREATE FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: permission denied to create foreign-data wrapper "foo" +HINT: Must be superuser to create a foreign-data wrapper. +RESET ROLE; +CREATE FOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator; +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | postgresql_fdw_validator | | | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +-- HANDLER related checks +CREATE FUNCTION invalid_fdw_handler() RETURNS int LANGUAGE SQL AS 'SELECT 1;'; +CREATE FOREIGN DATA WRAPPER test_fdw HANDLER invalid_fdw_handler; -- ERROR +ERROR: function invalid_fdw_handler must return type fdw_handler +CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler HANDLER invalid_fdw_handler; -- ERROR +ERROR: conflicting or redundant options +CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler; +DROP FOREIGN DATA WRAPPER test_fdw; +-- ALTER FOREIGN DATA WRAPPER +ALTER FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: syntax error at or near ";" +LINE 1: ALTER FOREIGN DATA WRAPPER foo; + ^ +ALTER FOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR +ERROR: function bar(text[], oid) does not exist +ALTER FOREIGN DATA WRAPPER foo NO VALIDATOR; +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | - | | | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '1', b '2'); +ALTER FOREIGN DATA WRAPPER foo OPTIONS (SET c '4'); -- ERROR +ERROR: option "c" not found +ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP c); -- ERROR +ERROR: option "c" not found +ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD x '1', DROP x); +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+----------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | - | | (a '1', b '2') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP a, SET b '3', ADD c '4'); +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+----------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | - | | (b '3', c '4') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '2'); +ALTER FOREIGN DATA WRAPPER foo OPTIONS (b '4'); -- ERROR +ERROR: option "b" provided more than once +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+-----------------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | - | | (b '3', c '4', a '2') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +SET ROLE regress_test_role; +ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD d '5'); -- ERROR +ERROR: permission denied to alter foreign-data wrapper "foo" +HINT: Must be superuser to alter a foreign-data wrapper. +SET ROLE regress_test_role_super; +ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD d '5'); +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+------------------------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | - | | (b '3', c '4', a '2', d '5') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role; -- ERROR +ERROR: permission denied to change owner of foreign-data wrapper "foo" +HINT: The owner of a foreign-data wrapper must be a superuser. +ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role_super; +ALTER ROLE regress_test_role_super NOSUPERUSER; +SET ROLE regress_test_role_super; +ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD e '6'); -- ERROR +ERROR: permission denied to alter foreign-data wrapper "foo" +HINT: Must be superuser to alter a foreign-data wrapper. +RESET ROLE; +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+------------------------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_test_role_super | - | - | | (b '3', c '4', a '2', d '5') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +ALTER FOREIGN DATA WRAPPER foo RENAME TO foo1; +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+------------------------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo1 | regress_test_role_super | - | - | | (b '3', c '4', a '2', d '5') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +ALTER FOREIGN DATA WRAPPER foo1 RENAME TO foo; +-- HANDLER related checks +ALTER FOREIGN DATA WRAPPER foo HANDLER invalid_fdw_handler; -- ERROR +ERROR: function invalid_fdw_handler must return type fdw_handler +ALTER FOREIGN DATA WRAPPER foo HANDLER test_fdw_handler HANDLER anything; -- ERROR +ERROR: conflicting or redundant options +ALTER FOREIGN DATA WRAPPER foo HANDLER test_fdw_handler; +WARNING: changing the foreign-data wrapper handler can change behavior of existing foreign tables +DROP FUNCTION invalid_fdw_handler(); +-- DROP FOREIGN DATA WRAPPER +DROP FOREIGN DATA WRAPPER nonexistent; -- ERROR +ERROR: foreign-data wrapper "nonexistent" does not exist +DROP FOREIGN DATA WRAPPER IF EXISTS nonexistent; +NOTICE: foreign-data wrapper "nonexistent" does not exist, skipping +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+------------------+--------------------------+-------------------+------------------------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_test_role_super | test_fdw_handler | - | | (b '3', c '4', a '2', d '5') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +DROP ROLE regress_test_role_super; -- ERROR +ERROR: role "regress_test_role_super" cannot be dropped because some objects depend on it +DETAIL: owner of foreign-data wrapper foo +SET ROLE regress_test_role_super; +DROP FOREIGN DATA WRAPPER foo; +RESET ROLE; +DROP ROLE regress_test_role_super; +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(2 rows) + +CREATE FOREIGN DATA WRAPPER foo; +CREATE SERVER s1 FOREIGN DATA WRAPPER foo; +COMMENT ON SERVER s1 IS 'foreign server'; +CREATE USER MAPPING FOR current_user SERVER s1; +CREATE USER MAPPING FOR current_user SERVER s1; -- ERROR +ERROR: user mapping for "regress_foreign_data_user" already exists for server "s1" +CREATE USER MAPPING IF NOT EXISTS FOR current_user SERVER s1; -- NOTICE +NOTICE: user mapping for "regress_foreign_data_user" already exists for server "s1", skipping +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + foo | regress_foreign_data_user | - | - | | | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(3 rows) + +\des+ :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------+------+---------+-------------+---------------- + s1 | regress_foreign_data_user | foo | | | | | foreign server +(1 row) + +\deu+ + List of user mappings + Server | User name | FDW options +--------+---------------------------+------------- + s1 | regress_foreign_data_user | +(1 row) + +DROP FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: cannot drop foreign-data wrapper foo because other objects depend on it +DETAIL: server s1 depends on foreign-data wrapper foo +user mapping for regress_foreign_data_user on server s1 depends on server s1 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +SET ROLE regress_test_role; +DROP FOREIGN DATA WRAPPER foo CASCADE; -- ERROR +ERROR: must be owner of foreign-data wrapper foo +RESET ROLE; +DROP FOREIGN DATA WRAPPER foo CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to server s1 +drop cascades to user mapping for regress_foreign_data_user on server s1 +\dew+ :NO_BUILTINS + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | | | useless + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | +(2 rows) + +\des+ :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+-------+----------------------+-------------------+------+---------+-------------+------------- +(0 rows) + +\deu+ + List of user mappings + Server | User name | FDW options +--------+-----------+------------- +(0 rows) + +-- exercise CREATE SERVER +CREATE SERVER s1 FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: foreign-data wrapper "foo" does not exist +CREATE FOREIGN DATA WRAPPER foo OPTIONS ("test wrapper" 'true'); +CREATE SERVER s1 FOREIGN DATA WRAPPER foo; +CREATE SERVER s1 FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: server "s1" already exists +CREATE SERVER IF NOT EXISTS s1 FOREIGN DATA WRAPPER foo; -- No ERROR, just NOTICE +NOTICE: server "s1" already exists, skipping +CREATE SERVER s2 FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); +CREATE SERVER s3 TYPE 'oracle' FOREIGN DATA WRAPPER foo; +CREATE SERVER s4 TYPE 'oracle' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); +CREATE SERVER s5 VERSION '15.0' FOREIGN DATA WRAPPER foo; +CREATE SERVER s6 VERSION '16.0' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); +CREATE SERVER s7 TYPE 'oracle' VERSION '17.0' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); +CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (foo '1'); -- ERROR +ERROR: invalid option "foo" +HINT: Valid options in this context are: authtype, service, connect_timeout, dbname, host, hostaddr, port, tty, options, requiressl, sslmode, gsslib +CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (host 'localhost', dbname 's8db'); +\des+ :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------+--------+---------+-----------------------------------+------------- + s1 | regress_foreign_data_user | foo | | | | | + s2 | regress_foreign_data_user | foo | | | | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | | oracle | | | + s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | | | 15.0 | | + s6 | regress_foreign_data_user | foo | | | 16.0 | (host 'a', dbname 'b') | + s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | | | | (host 'localhost', dbname 's8db') | +(8 rows) + +SET ROLE regress_test_role; +CREATE SERVER t1 FOREIGN DATA WRAPPER foo; -- ERROR: no usage on FDW +ERROR: permission denied for foreign-data wrapper foo +RESET ROLE; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; +SET ROLE regress_test_role; +CREATE SERVER t1 FOREIGN DATA WRAPPER foo; +RESET ROLE; +\des+ :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------+--------+---------+-----------------------------------+------------- + s1 | regress_foreign_data_user | foo | | | | | + s2 | regress_foreign_data_user | foo | | | | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | | oracle | | | + s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | | | 15.0 | | + s6 | regress_foreign_data_user | foo | | | 16.0 | (host 'a', dbname 'b') | + s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | | | | (host 'localhost', dbname 's8db') | + t1 | regress_test_role | foo | | | | | +(9 rows) + +REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_test_role; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_indirect; +SET ROLE regress_test_role; +CREATE SERVER t2 FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: permission denied for foreign-data wrapper foo +RESET ROLE; +GRANT regress_test_indirect TO regress_test_role; +SET ROLE regress_test_role; +CREATE SERVER t2 FOREIGN DATA WRAPPER foo; +\des+ :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------+--------+---------+-----------------------------------+------------- + s1 | regress_foreign_data_user | foo | | | | | + s2 | regress_foreign_data_user | foo | | | | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | | oracle | | | + s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | | | 15.0 | | + s6 | regress_foreign_data_user | foo | | | 16.0 | (host 'a', dbname 'b') | + s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | | | | (host 'localhost', dbname 's8db') | + t1 | regress_test_role | foo | | | | | + t2 | regress_test_role | foo | | | | | +(10 rows) + +RESET ROLE; +REVOKE regress_test_indirect FROM regress_test_role; +-- ALTER SERVER +ALTER SERVER s0; -- ERROR +ERROR: syntax error at or near ";" +LINE 1: ALTER SERVER s0; + ^ +ALTER SERVER s0 OPTIONS (a '1'); -- ERROR +ERROR: server "s0" does not exist +ALTER SERVER s1 VERSION '1.0' OPTIONS (servername 's1'); +ALTER SERVER s2 VERSION '1.1'; +ALTER SERVER s3 OPTIONS ("tns name" 'orcl', port '1521'); +GRANT USAGE ON FOREIGN SERVER s1 TO regress_test_role; +GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION; +\des+ :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+-----------------------------------+------------- + s1 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user+| | 1.0 | (servername 's1') | + | | | regress_test_role=U/regress_foreign_data_user | | | | + s2 | regress_foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') | + s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | | | 15.0 | | + s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user+| | 16.0 | (host 'a', dbname 'b') | + | | | regress_test_role2=U*/regress_foreign_data_user | | | | + s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | | | | (host 'localhost', dbname 's8db') | + t1 | regress_test_role | foo | | | | | + t2 | regress_test_role | foo | | | | | +(10 rows) + +SET ROLE regress_test_role; +ALTER SERVER s1 VERSION '1.1'; -- ERROR +ERROR: must be owner of foreign server s1 +ALTER SERVER s1 OWNER TO regress_test_role; -- ERROR +ERROR: must be owner of foreign server s1 +RESET ROLE; +ALTER SERVER s1 OWNER TO regress_test_role; +GRANT regress_test_role2 TO regress_test_role; +SET ROLE regress_test_role; +ALTER SERVER s1 VERSION '1.1'; +ALTER SERVER s1 OWNER TO regress_test_role2; -- ERROR +ERROR: permission denied for foreign-data wrapper foo +RESET ROLE; +ALTER SERVER s8 OPTIONS (foo '1'); -- ERROR option validation +ERROR: invalid option "foo" +HINT: Valid options in this context are: authtype, service, connect_timeout, dbname, host, hostaddr, port, tty, options, requiressl, sslmode, gsslib +ALTER SERVER s8 OPTIONS (connect_timeout '30', SET dbname 'db1', DROP host); +SET ROLE regress_test_role; +ALTER SERVER s1 OWNER TO regress_test_indirect; -- ERROR +ERROR: must be member of role "regress_test_indirect" +RESET ROLE; +GRANT regress_test_indirect TO regress_test_role; +SET ROLE regress_test_role; +ALTER SERVER s1 OWNER TO regress_test_indirect; +RESET ROLE; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_indirect; +SET ROLE regress_test_role; +ALTER SERVER s1 OWNER TO regress_test_indirect; +RESET ROLE; +DROP ROLE regress_test_indirect; -- ERROR +ERROR: role "regress_test_indirect" cannot be dropped because some objects depend on it +DETAIL: privileges for foreign-data wrapper foo +owner of server s1 +\des+ :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+--------------------------------------+------------- + s1 | regress_test_indirect | foo | regress_test_indirect=U/regress_test_indirect | | 1.1 | (servername 's1') | + s2 | regress_foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') | + s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | | | 15.0 | | + s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user+| | 16.0 | (host 'a', dbname 'b') | + | | | regress_test_role2=U*/regress_foreign_data_user | | | | + s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | | | | (dbname 'db1', connect_timeout '30') | + t1 | regress_test_role | foo | | | | | + t2 | regress_test_role | foo | | | | | +(10 rows) + +ALTER SERVER s8 RENAME to s8new; +\des+ :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +-------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+--------------------------------------+------------- + s1 | regress_test_indirect | foo | regress_test_indirect=U/regress_test_indirect | | 1.1 | (servername 's1') | + s2 | regress_foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') | + s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | | | 15.0 | | + s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user+| | 16.0 | (host 'a', dbname 'b') | + | | | regress_test_role2=U*/regress_foreign_data_user | | | | + s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | + s8new | regress_foreign_data_user | postgresql | | | | (dbname 'db1', connect_timeout '30') | + t1 | regress_test_role | foo | | | | | + t2 | regress_test_role | foo | | | | | +(10 rows) + +ALTER SERVER s8new RENAME to s8; +-- DROP SERVER +DROP SERVER nonexistent; -- ERROR +ERROR: server "nonexistent" does not exist +DROP SERVER IF EXISTS nonexistent; +NOTICE: server "nonexistent" does not exist, skipping +\des :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper +------+---------------------------+---------------------- + s1 | regress_test_indirect | foo + s2 | regress_foreign_data_user | foo + s3 | regress_foreign_data_user | foo + s4 | regress_foreign_data_user | foo + s5 | regress_foreign_data_user | foo + s6 | regress_foreign_data_user | foo + s7 | regress_foreign_data_user | foo + s8 | regress_foreign_data_user | postgresql + t1 | regress_test_role | foo + t2 | regress_test_role | foo +(10 rows) + +SET ROLE regress_test_role; +DROP SERVER s2; -- ERROR +ERROR: must be owner of foreign server s2 +DROP SERVER s1; +RESET ROLE; +\des :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper +------+---------------------------+---------------------- + s2 | regress_foreign_data_user | foo + s3 | regress_foreign_data_user | foo + s4 | regress_foreign_data_user | foo + s5 | regress_foreign_data_user | foo + s6 | regress_foreign_data_user | foo + s7 | regress_foreign_data_user | foo + s8 | regress_foreign_data_user | postgresql + t1 | regress_test_role | foo + t2 | regress_test_role | foo +(9 rows) + +ALTER SERVER s2 OWNER TO regress_test_role; +SET ROLE regress_test_role; +DROP SERVER s2; +RESET ROLE; +\des :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper +------+---------------------------+---------------------- + s3 | regress_foreign_data_user | foo + s4 | regress_foreign_data_user | foo + s5 | regress_foreign_data_user | foo + s6 | regress_foreign_data_user | foo + s7 | regress_foreign_data_user | foo + s8 | regress_foreign_data_user | postgresql + t1 | regress_test_role | foo + t2 | regress_test_role | foo +(8 rows) + +CREATE USER MAPPING FOR current_user SERVER s3; +\deu + List of user mappings + Server | User name +--------+--------------------------- + s3 | regress_foreign_data_user +(1 row) + +DROP SERVER s3; -- ERROR +ERROR: cannot drop server s3 because other objects depend on it +DETAIL: user mapping for regress_foreign_data_user on server s3 depends on server s3 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP SERVER s3 CASCADE; +NOTICE: drop cascades to user mapping for regress_foreign_data_user on server s3 +\des :NO_BUILTINS + List of foreign servers + Name | Owner | Foreign-data wrapper +------+---------------------------+---------------------- + s4 | regress_foreign_data_user | foo + s5 | regress_foreign_data_user | foo + s6 | regress_foreign_data_user | foo + s7 | regress_foreign_data_user | foo + s8 | regress_foreign_data_user | postgresql + t1 | regress_test_role | foo + t2 | regress_test_role | foo +(7 rows) + +\deu +List of user mappings + Server | User name +--------+----------- +(0 rows) + +-- CREATE USER MAPPING +CREATE USER MAPPING FOR regress_test_missing_role SERVER s1; -- ERROR +ERROR: role "regress_test_missing_role" does not exist +CREATE USER MAPPING FOR current_user SERVER s1; -- ERROR +ERROR: server "s1" does not exist +CREATE USER MAPPING FOR current_user SERVER s4; +CREATE USER MAPPING FOR user SERVER s4; -- ERROR duplicate +ERROR: user mapping for "regress_foreign_data_user" already exists for server "s4" +CREATE USER MAPPING FOR public SERVER s4 OPTIONS ("this mapping" 'is public'); +CREATE USER MAPPING FOR user SERVER s8 OPTIONS (username 'test', password 'secret'); -- ERROR +ERROR: invalid option "username" +HINT: Valid options in this context are: user, password +CREATE USER MAPPING FOR user SERVER s8 OPTIONS (user 'test', password 'secret'); +ALTER SERVER s5 OWNER TO regress_test_role; +ALTER SERVER s6 OWNER TO regress_test_indirect; +SET ROLE regress_test_role; +CREATE USER MAPPING FOR current_user SERVER s5; +CREATE USER MAPPING FOR current_user SERVER s6 OPTIONS (username 'test'); +CREATE USER MAPPING FOR current_user SERVER s7; -- ERROR +ERROR: permission denied for foreign server s7 +CREATE USER MAPPING FOR public SERVER s8; -- ERROR +ERROR: must be owner of foreign server s8 +RESET ROLE; +ALTER SERVER t1 OWNER TO regress_test_indirect; +SET ROLE regress_test_role; +CREATE USER MAPPING FOR current_user SERVER t1 OPTIONS (username 'bob', password 'boo'); +CREATE USER MAPPING FOR public SERVER t1; +RESET ROLE; +\deu + List of user mappings + Server | User name +--------+--------------------------- + s4 | public + s4 | regress_foreign_data_user + s5 | regress_test_role + s6 | regress_test_role + s8 | regress_foreign_data_user + t1 | public + t1 | regress_test_role +(7 rows) + +-- ALTER USER MAPPING +ALTER USER MAPPING FOR regress_test_missing_role SERVER s4 OPTIONS (gotcha 'true'); -- ERROR +ERROR: role "regress_test_missing_role" does not exist +ALTER USER MAPPING FOR user SERVER ss4 OPTIONS (gotcha 'true'); -- ERROR +ERROR: server "ss4" does not exist +ALTER USER MAPPING FOR public SERVER s5 OPTIONS (gotcha 'true'); -- ERROR +ERROR: user mapping for "public" does not exist for server "s5" +ALTER USER MAPPING FOR current_user SERVER s8 OPTIONS (username 'test'); -- ERROR +ERROR: invalid option "username" +HINT: Valid options in this context are: user, password +ALTER USER MAPPING FOR current_user SERVER s8 OPTIONS (DROP user, SET password 'public'); +SET ROLE regress_test_role; +ALTER USER MAPPING FOR current_user SERVER s5 OPTIONS (ADD modified '1'); +ALTER USER MAPPING FOR public SERVER s4 OPTIONS (ADD modified '1'); -- ERROR +ERROR: must be owner of foreign server s4 +ALTER USER MAPPING FOR public SERVER t1 OPTIONS (ADD modified '1'); +RESET ROLE; +\deu+ + List of user mappings + Server | User name | FDW options +--------+---------------------------+---------------------------------- + s4 | public | ("this mapping" 'is public') + s4 | regress_foreign_data_user | + s5 | regress_test_role | (modified '1') + s6 | regress_test_role | (username 'test') + s8 | regress_foreign_data_user | (password 'public') + t1 | public | (modified '1') + t1 | regress_test_role | (username 'bob', password 'boo') +(7 rows) + +-- DROP USER MAPPING +DROP USER MAPPING FOR regress_test_missing_role SERVER s4; -- ERROR +ERROR: role "regress_test_missing_role" does not exist +DROP USER MAPPING FOR user SERVER ss4; +ERROR: server "ss4" does not exist +DROP USER MAPPING FOR public SERVER s7; -- ERROR +ERROR: user mapping for "public" does not exist for server "s7" +DROP USER MAPPING IF EXISTS FOR regress_test_missing_role SERVER s4; +NOTICE: role "regress_test_missing_role" does not exist, skipping +DROP USER MAPPING IF EXISTS FOR user SERVER ss4; +NOTICE: server "ss4" does not exist, skipping +DROP USER MAPPING IF EXISTS FOR public SERVER s7; +NOTICE: user mapping for "public" does not exist for server "s7", skipping +CREATE USER MAPPING FOR public SERVER s8; +SET ROLE regress_test_role; +DROP USER MAPPING FOR public SERVER s8; -- ERROR +ERROR: must be owner of foreign server s8 +RESET ROLE; +DROP SERVER s7; +\deu + List of user mappings + Server | User name +--------+--------------------------- + s4 | public + s4 | regress_foreign_data_user + s5 | regress_test_role + s6 | regress_test_role + s8 | public + s8 | regress_foreign_data_user + t1 | public + t1 | regress_test_role +(8 rows) + +-- CREATE FOREIGN TABLE +CREATE SCHEMA foreign_schema; +CREATE SERVER s0 FOREIGN DATA WRAPPER dummy; +CREATE FOREIGN TABLE ft1 (); -- ERROR +ERROR: syntax error at or near ";" +LINE 1: CREATE FOREIGN TABLE ft1 (); + ^ +CREATE FOREIGN TABLE ft1 () SERVER no_server; -- ERROR +ERROR: server "no_server" does not exist +CREATE FOREIGN TABLE ft1 ( + c1 integer OPTIONS ("param 1" 'val1') PRIMARY KEY, + c2 text OPTIONS (param2 'val2', param3 'val3'), + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); -- ERROR +ERROR: primary key constraints are not supported on foreign tables +LINE 2: c1 integer OPTIONS ("param 1" 'val1') PRIMARY KEY, + ^ +CREATE TABLE ref_table (id integer PRIMARY KEY); +CREATE FOREIGN TABLE ft1 ( + c1 integer OPTIONS ("param 1" 'val1') REFERENCES ref_table (id), + c2 text OPTIONS (param2 'val2', param3 'val3'), + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); -- ERROR +ERROR: foreign key constraints are not supported on foreign tables +LINE 2: c1 integer OPTIONS ("param 1" 'val1') REFERENCES ref_table ... + ^ +DROP TABLE ref_table; +CREATE FOREIGN TABLE ft1 ( + c1 integer OPTIONS ("param 1" 'val1') NOT NULL, + c2 text OPTIONS (param2 'val2', param3 'val3'), + c3 date, + UNIQUE (c3) +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); -- ERROR +ERROR: unique constraints are not supported on foreign tables +LINE 5: UNIQUE (c3) + ^ +CREATE FOREIGN TABLE ft1 ( + c1 integer OPTIONS ("param 1" 'val1') NOT NULL, + c2 text OPTIONS (param2 'val2', param3 'val3') CHECK (c2 <> ''), + c3 date, + CHECK (c3 BETWEEN '1994-01-01'::date AND '1994-01-31'::date) +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +COMMENT ON FOREIGN TABLE ft1 IS 'ft1'; +COMMENT ON COLUMN ft1.c1 IS 'ft1.c1'; +\d+ ft1 + Foreign table "public.ft1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+--------------------------------+----------+--------------+------------- + c1 | integer | | not null | | ("param 1" 'val1') | plain | | ft1.c1 + c2 | text | | | | (param2 'val2', param3 'val3') | extended | | + c3 | date | | | | | plain | | +Check constraints: + "ft1_c2_check" CHECK (c2 <> ''::text) + "ft1_c3_check" CHECK (c3 >= '01-01-1994'::date AND c3 <= '01-31-1994'::date) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +\det+ + List of foreign tables + Schema | Table | Server | FDW options | Description +--------+-------+--------+-------------------------------------------------+------------- + public | ft1 | s0 | (delimiter ',', quote '"', "be quoted" 'value') | ft1 +(1 row) + +CREATE INDEX id_ft1_c2 ON ft1 (c2); -- ERROR +ERROR: cannot create index on foreign table "ft1" +SELECT * FROM ft1; -- ERROR +ERROR: foreign-data wrapper "dummy" has no handler +EXPLAIN SELECT * FROM ft1; -- ERROR +ERROR: foreign-data wrapper "dummy" has no handler +CREATE TABLE lt1 (a INT) PARTITION BY RANGE (a); +CREATE FOREIGN TABLE ft_part1 + PARTITION OF lt1 FOR VALUES FROM (0) TO (1000) SERVER s0; +CREATE INDEX ON lt1 (a); -- skips partition +CREATE UNIQUE INDEX ON lt1 (a); -- ERROR +ERROR: cannot create unique index on partitioned table "lt1" +DETAIL: Table "lt1" contains partitions that are foreign tables. +ALTER TABLE lt1 ADD PRIMARY KEY (a); -- ERROR +ERROR: cannot create unique index on partitioned table "lt1" +DETAIL: Table "lt1" contains partitions that are foreign tables. +DROP TABLE lt1; +CREATE TABLE lt1 (a INT) PARTITION BY RANGE (a); +CREATE INDEX ON lt1 (a); +CREATE FOREIGN TABLE ft_part1 + PARTITION OF lt1 FOR VALUES FROM (0) TO (1000) SERVER s0; +CREATE FOREIGN TABLE ft_part2 (a INT) SERVER s0; +ALTER TABLE lt1 ATTACH PARTITION ft_part2 FOR VALUES FROM (1000) TO (2000); +DROP FOREIGN TABLE ft_part1, ft_part2; +CREATE UNIQUE INDEX ON lt1 (a); +ALTER TABLE lt1 ADD PRIMARY KEY (a); +CREATE FOREIGN TABLE ft_part1 + PARTITION OF lt1 FOR VALUES FROM (0) TO (1000) SERVER s0; -- ERROR +ERROR: cannot create foreign partition of partitioned table "lt1" +DETAIL: Table "lt1" contains indexes that are unique. +CREATE FOREIGN TABLE ft_part2 (a INT NOT NULL) SERVER s0; +ALTER TABLE lt1 ATTACH PARTITION ft_part2 + FOR VALUES FROM (1000) TO (2000); -- ERROR +ERROR: cannot attach foreign table "ft_part2" as partition of partitioned table "lt1" +DETAIL: Partitioned table "lt1" contains unique indexes. +DROP TABLE lt1; +DROP FOREIGN TABLE ft_part2; +CREATE TABLE lt1 (a INT) PARTITION BY RANGE (a); +CREATE INDEX ON lt1 (a); +CREATE TABLE lt1_part1 + PARTITION OF lt1 FOR VALUES FROM (0) TO (1000) + PARTITION BY RANGE (a); +CREATE FOREIGN TABLE ft_part_1_1 + PARTITION OF lt1_part1 FOR VALUES FROM (0) TO (100) SERVER s0; +CREATE FOREIGN TABLE ft_part_1_2 (a INT) SERVER s0; +ALTER TABLE lt1_part1 ATTACH PARTITION ft_part_1_2 FOR VALUES FROM (100) TO (200); +CREATE UNIQUE INDEX ON lt1 (a); +ERROR: cannot create unique index on partitioned table "lt1" +DETAIL: Table "lt1" contains partitions that are foreign tables. +ALTER TABLE lt1 ADD PRIMARY KEY (a); +ERROR: cannot create unique index on partitioned table "lt1_part1" +DETAIL: Table "lt1_part1" contains partitions that are foreign tables. +DROP FOREIGN TABLE ft_part_1_1, ft_part_1_2; +CREATE UNIQUE INDEX ON lt1 (a); +ALTER TABLE lt1 ADD PRIMARY KEY (a); +CREATE FOREIGN TABLE ft_part_1_1 + PARTITION OF lt1_part1 FOR VALUES FROM (0) TO (100) SERVER s0; +ERROR: cannot create foreign partition of partitioned table "lt1_part1" +DETAIL: Table "lt1_part1" contains indexes that are unique. +CREATE FOREIGN TABLE ft_part_1_2 (a INT NOT NULL) SERVER s0; +ALTER TABLE lt1_part1 ATTACH PARTITION ft_part_1_2 FOR VALUES FROM (100) TO (200); +ERROR: cannot attach foreign table "ft_part_1_2" as partition of partitioned table "lt1_part1" +DETAIL: Partitioned table "lt1_part1" contains unique indexes. +DROP TABLE lt1; +DROP FOREIGN TABLE ft_part_1_2; +-- ALTER FOREIGN TABLE +COMMENT ON FOREIGN TABLE ft1 IS 'foreign table'; +COMMENT ON FOREIGN TABLE ft1 IS NULL; +COMMENT ON COLUMN ft1.c1 IS 'foreign column'; +COMMENT ON COLUMN ft1.c1 IS NULL; +ALTER FOREIGN TABLE ft1 ADD COLUMN c4 integer; +ALTER FOREIGN TABLE ft1 ADD COLUMN c5 integer DEFAULT 0; +ALTER FOREIGN TABLE ft1 ADD COLUMN c6 integer; +ALTER FOREIGN TABLE ft1 ADD COLUMN c7 integer NOT NULL; +ALTER FOREIGN TABLE ft1 ADD COLUMN c8 integer; +ALTER FOREIGN TABLE ft1 ADD COLUMN c9 integer; +ALTER FOREIGN TABLE ft1 ADD COLUMN c10 integer OPTIONS (p1 'v1'); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c4 SET DEFAULT 0; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c5 DROP DEFAULT; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c6 SET NOT NULL; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 DROP NOT NULL; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE char(10) USING '0'; -- ERROR +ERROR: "ft1" is not a table +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE char(10); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET DATA TYPE text; +ALTER FOREIGN TABLE ft1 ALTER COLUMN xmin OPTIONS (ADD p1 'v1'); -- ERROR +ERROR: cannot alter system column "xmin" +ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'), + ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET STATISTICS 10000; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET (n_distinct = 100); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET STATISTICS -1; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET STORAGE PLAIN; +\d+ ft1 + Foreign table "public.ft1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+--------------------------------+----------+--------------+------------- + c1 | integer | | not null | | ("param 1" 'val1') | plain | 10000 | + c2 | text | | | | (param2 'val2', param3 'val3') | extended | | + c3 | date | | | | | plain | | + c4 | integer | | | 0 | | plain | | + c5 | integer | | | | | plain | | + c6 | integer | | not null | | | plain | | + c7 | integer | | | | (p1 'v1', p2 'v2') | plain | | + c8 | text | | | | (p2 'V2') | plain | | + c9 | integer | | | | | plain | | + c10 | integer | | | | (p1 'v1') | plain | | +Check constraints: + "ft1_c2_check" CHECK (c2 <> ''::text) + "ft1_c3_check" CHECK (c3 >= '01-01-1994'::date AND c3 <= '01-31-1994'::date) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +-- can't change the column type if it's used elsewhere +CREATE TABLE use_ft1_column_type (x ft1); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET DATA TYPE integer; -- ERROR +ERROR: cannot alter foreign table "ft1" because column "use_ft1_column_type.x" uses its row type +DROP TABLE use_ft1_column_type; +ALTER FOREIGN TABLE ft1 ADD PRIMARY KEY (c7); -- ERROR +ERROR: primary key constraints are not supported on foreign tables +LINE 1: ALTER FOREIGN TABLE ft1 ADD PRIMARY KEY (c7); + ^ +ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c9_check CHECK (c9 < 0) NOT VALID; +ALTER FOREIGN TABLE ft1 ALTER CONSTRAINT ft1_c9_check DEFERRABLE; -- ERROR +ERROR: "ft1" is not a table +ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c9_check; +ALTER FOREIGN TABLE ft1 DROP CONSTRAINT no_const; -- ERROR +ERROR: constraint "no_const" of relation "ft1" does not exist +ALTER FOREIGN TABLE ft1 DROP CONSTRAINT IF EXISTS no_const; +NOTICE: constraint "no_const" of relation "ft1" does not exist, skipping +ALTER FOREIGN TABLE ft1 OWNER TO regress_test_role; +ALTER FOREIGN TABLE ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@'); +ALTER FOREIGN TABLE ft1 DROP COLUMN no_column; -- ERROR +ERROR: column "no_column" of relation "ft1" does not exist +ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column; +NOTICE: column "no_column" of relation "ft1" does not exist, skipping +ALTER FOREIGN TABLE ft1 DROP COLUMN c9; +ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema; +ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR +ERROR: relation "ft1" does not exist +ALTER FOREIGN TABLE foreign_schema.ft1 SET TABLESPACE ts; -- ERROR +ERROR: "ft1" is not a table, materialized view, index, or partitioned index +ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; +ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; +\d foreign_schema.foreign_table_1 + Foreign table "foreign_schema.foreign_table_1" + Column | Type | Collation | Nullable | Default | FDW options +------------------+---------+-----------+----------+---------+-------------------------------- + foreign_column_1 | integer | | not null | | ("param 1" 'val1') + c2 | text | | | | (param2 'val2', param3 'val3') + c3 | date | | | | + c4 | integer | | | 0 | + c5 | integer | | | | + c6 | integer | | not null | | + c7 | integer | | | | (p1 'v1', p2 'v2') + c8 | text | | | | (p2 'V2') + c10 | integer | | | | (p1 'v1') +Check constraints: + "ft1_c2_check" CHECK (c2 <> ''::text) + "ft1_c3_check" CHECK (c3 >= '01-01-1994'::date AND c3 <= '01-31-1994'::date) +Server: s0 +FDW options: (quote '~', "be quoted" 'value', escape '@') + +-- alter noexisting table +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c4 integer; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c6 integer; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c7 integer NOT NULL; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c8 integer; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c9 integer; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c10 integer OPTIONS (p1 'v1'); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c6 SET NOT NULL; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 DROP NOT NULL; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 TYPE char(10); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 SET DATA TYPE text; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'), + ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT IF EXISTS no_const; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT ft1_c1_check; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OWNER TO regress_test_role; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@'); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN IF EXISTS no_column; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN c9; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 SET SCHEMA foreign_schema; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME c1 TO foreign_column_1; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME TO foreign_table_1; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +-- Information schema +SELECT * FROM information_schema.foreign_data_wrappers WHERE foreign_data_wrapper_name <> 'gp_exttable_fdw' ORDER BY 1, 2; + foreign_data_wrapper_catalog | foreign_data_wrapper_name | authorization_identifier | library_name | foreign_data_wrapper_language +------------------------------+---------------------------+---------------------------+--------------+------------------------------- + regression | dummy | regress_foreign_data_user | | c + regression | foo | regress_foreign_data_user | | c + regression | postgresql | regress_foreign_data_user | | c +(3 rows) + +SELECT * FROM information_schema.foreign_data_wrapper_options ORDER BY 1, 2, 3; + foreign_data_wrapper_catalog | foreign_data_wrapper_name | option_name | option_value +------------------------------+---------------------------+--------------+-------------- + regression | foo | test wrapper | true +(1 row) + +SELECT * FROM information_schema.foreign_servers WHERE foreign_server_name <> 'gp_exttable_server' ORDER BY 1, 2; + foreign_server_catalog | foreign_server_name | foreign_data_wrapper_catalog | foreign_data_wrapper_name | foreign_server_type | foreign_server_version | authorization_identifier +------------------------+---------------------+------------------------------+---------------------------+---------------------+------------------------+--------------------------- + regression | s0 | regression | dummy | | | regress_foreign_data_user + regression | s4 | regression | foo | oracle | | regress_foreign_data_user + regression | s5 | regression | foo | | 15.0 | regress_test_role + regression | s6 | regression | foo | | 16.0 | regress_test_indirect + regression | s8 | regression | postgresql | | | regress_foreign_data_user + regression | t1 | regression | foo | | | regress_test_indirect + regression | t2 | regression | foo | | | regress_test_role +(7 rows) + +SELECT * FROM information_schema.foreign_server_options ORDER BY 1, 2, 3; + foreign_server_catalog | foreign_server_name | option_name | option_value +------------------------+---------------------+-----------------+-------------- + regression | s4 | dbname | b + regression | s4 | host | a + regression | s6 | dbname | b + regression | s6 | host | a + regression | s8 | connect_timeout | 30 + regression | s8 | dbname | db1 +(6 rows) + +SELECT * FROM information_schema.user_mappings ORDER BY lower(authorization_identifier), 2, 3; + authorization_identifier | foreign_server_catalog | foreign_server_name +---------------------------+------------------------+--------------------- + PUBLIC | regression | s4 + PUBLIC | regression | s8 + PUBLIC | regression | t1 + regress_foreign_data_user | regression | s4 + regress_foreign_data_user | regression | s8 + regress_test_role | regression | s5 + regress_test_role | regression | s6 + regress_test_role | regression | t1 +(8 rows) + +SELECT * FROM information_schema.user_mapping_options ORDER BY lower(authorization_identifier), 2, 3, 4; + authorization_identifier | foreign_server_catalog | foreign_server_name | option_name | option_value +---------------------------+------------------------+---------------------+--------------+-------------- + PUBLIC | regression | s4 | this mapping | is public + PUBLIC | regression | t1 | modified | 1 + regress_foreign_data_user | regression | s8 | password | public + regress_test_role | regression | s5 | modified | 1 + regress_test_role | regression | s6 | username | test + regress_test_role | regression | t1 | password | boo + regress_test_role | regression | t1 | username | bob +(7 rows) + +SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5; + grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable +---------------------------+---------------------------+----------------+---------------+-------------+----------------------+----------------+-------------- + regress_foreign_data_user | regress_foreign_data_user | regression | | foo | FOREIGN DATA WRAPPER | USAGE | YES + regress_foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO + regress_test_indirect | regress_test_indirect | regression | | s6 | FOREIGN SERVER | USAGE | YES + regress_test_indirect | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES +(4 rows) + +SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5; + grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable +---------------------------+---------------------------+----------------+---------------+-------------+----------------------+----------------+-------------- + regress_foreign_data_user | regress_foreign_data_user | regression | | foo | FOREIGN DATA WRAPPER | USAGE | YES + regress_foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO + regress_test_indirect | regress_test_indirect | regression | | s6 | FOREIGN SERVER | USAGE | YES + regress_test_indirect | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES +(4 rows) + +SELECT * FROM information_schema.foreign_tables WHERE foreign_table_schema <> 'gp_toolkit' ORDER BY 1, 2, 3; + foreign_table_catalog | foreign_table_schema | foreign_table_name | foreign_server_catalog | foreign_server_name +-----------------------+----------------------+--------------------+------------------------+--------------------- + regression | foreign_schema | foreign_table_1 | regression | s0 +(1 row) + +SELECT * FROM information_schema.foreign_table_options WHERE foreign_table_schema <> 'gp_toolkit' ORDER BY 1, 2, 3, 4; + foreign_table_catalog | foreign_table_schema | foreign_table_name | option_name | option_value +-----------------------+----------------------+--------------------+-------------+-------------- + regression | foreign_schema | foreign_table_1 | be quoted | value + regression | foreign_schema | foreign_table_1 | escape | @ + regression | foreign_schema | foreign_table_1 | quote | ~ +(3 rows) + +SET ROLE regress_test_role; +SELECT * FROM information_schema.user_mapping_options ORDER BY 1, 2, 3, 4; + authorization_identifier | foreign_server_catalog | foreign_server_name | option_name | option_value +--------------------------+------------------------+---------------------+-------------+-------------- + PUBLIC | regression | t1 | modified | 1 + regress_test_role | regression | s5 | modified | 1 + regress_test_role | regression | s6 | username | test + regress_test_role | regression | t1 | password | boo + regress_test_role | regression | t1 | username | bob +(5 rows) + +SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5; + grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable +---------------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+-------------- + regress_foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO + regress_test_indirect | regress_test_indirect | regression | | s6 | FOREIGN SERVER | USAGE | YES + regress_test_indirect | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES +(3 rows) + +SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5; + grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable +---------------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+-------------- + regress_foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO + regress_test_indirect | regress_test_indirect | regression | | s6 | FOREIGN SERVER | USAGE | YES + regress_test_indirect | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES +(3 rows) + +DROP USER MAPPING FOR current_user SERVER t1; +SET ROLE regress_test_role2; +SELECT * FROM information_schema.user_mapping_options ORDER BY 1, 2, 3, 4; + authorization_identifier | foreign_server_catalog | foreign_server_name | option_name | option_value +--------------------------+------------------------+---------------------+-------------+-------------- + regress_test_role | regression | s6 | username | +(1 row) + +RESET ROLE; +-- has_foreign_data_wrapper_privilege +SELECT has_foreign_data_wrapper_privilege('regress_test_role', + (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); + has_foreign_data_wrapper_privilege +------------------------------------ + t +(1 row) + +SELECT has_foreign_data_wrapper_privilege('regress_test_role', 'foo', 'USAGE'); + has_foreign_data_wrapper_privilege +------------------------------------ + t +(1 row) + +SELECT has_foreign_data_wrapper_privilege( + (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), + (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); + has_foreign_data_wrapper_privilege +------------------------------------ + t +(1 row) + +SELECT has_foreign_data_wrapper_privilege( + (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); + has_foreign_data_wrapper_privilege +------------------------------------ + t +(1 row) + +SELECT has_foreign_data_wrapper_privilege( + (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), 'foo', 'USAGE'); + has_foreign_data_wrapper_privilege +------------------------------------ + t +(1 row) + +SELECT has_foreign_data_wrapper_privilege('foo', 'USAGE'); + has_foreign_data_wrapper_privilege +------------------------------------ + t +(1 row) + +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; +SELECT has_foreign_data_wrapper_privilege('regress_test_role', 'foo', 'USAGE'); + has_foreign_data_wrapper_privilege +------------------------------------ + t +(1 row) + +-- has_server_privilege +SELECT has_server_privilege('regress_test_role', + (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); + has_server_privilege +---------------------- + f +(1 row) + +SELECT has_server_privilege('regress_test_role', 's8', 'USAGE'); + has_server_privilege +---------------------- + f +(1 row) + +SELECT has_server_privilege( + (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), + (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); + has_server_privilege +---------------------- + f +(1 row) + +SELECT has_server_privilege( + (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); + has_server_privilege +---------------------- + t +(1 row) + +SELECT has_server_privilege( + (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), 's8', 'USAGE'); + has_server_privilege +---------------------- + f +(1 row) + +SELECT has_server_privilege('s8', 'USAGE'); + has_server_privilege +---------------------- + t +(1 row) + +GRANT USAGE ON FOREIGN SERVER s8 TO regress_test_role; +SELECT has_server_privilege('regress_test_role', 's8', 'USAGE'); + has_server_privilege +---------------------- + t +(1 row) + +REVOKE USAGE ON FOREIGN SERVER s8 FROM regress_test_role; +GRANT USAGE ON FOREIGN SERVER s4 TO regress_test_role; +DROP USER MAPPING FOR public SERVER s4; +ALTER SERVER s6 OPTIONS (DROP host, DROP dbname); +ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (DROP username); +ALTER FOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator; +WARNING: changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid +-- Privileges +SET ROLE regress_unprivileged_role; +CREATE FOREIGN DATA WRAPPER foobar; -- ERROR +ERROR: permission denied to create foreign-data wrapper "foobar" +HINT: Must be superuser to create a foreign-data wrapper. +ALTER FOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true'); -- ERROR +ERROR: permission denied to alter foreign-data wrapper "foo" +HINT: Must be superuser to alter a foreign-data wrapper. +ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_unprivileged_role; -- ERROR +ERROR: permission denied to change owner of foreign-data wrapper "foo" +HINT: Must be superuser to change owner of a foreign-data wrapper. +DROP FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: must be owner of foreign-data wrapper foo +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; -- ERROR +ERROR: permission denied for foreign-data wrapper foo +CREATE SERVER s9 FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: permission denied for foreign-data wrapper foo +ALTER SERVER s4 VERSION '0.5'; -- ERROR +ERROR: must be owner of foreign server s4 +ALTER SERVER s4 OWNER TO regress_unprivileged_role; -- ERROR +ERROR: must be owner of foreign server s4 +DROP SERVER s4; -- ERROR +ERROR: must be owner of foreign server s4 +GRANT USAGE ON FOREIGN SERVER s4 TO regress_test_role; -- ERROR +ERROR: permission denied for foreign server s4 +CREATE USER MAPPING FOR public SERVER s4; -- ERROR +ERROR: must be owner of foreign server s4 +ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (gotcha 'true'); -- ERROR +ERROR: must be owner of foreign server s6 +DROP USER MAPPING FOR regress_test_role SERVER s6; -- ERROR +ERROR: must be owner of foreign server s6 +RESET ROLE; +GRANT USAGE ON FOREIGN DATA WRAPPER postgresql TO regress_unprivileged_role; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_unprivileged_role WITH GRANT OPTION; +SET ROLE regress_unprivileged_role; +CREATE FOREIGN DATA WRAPPER foobar; -- ERROR +ERROR: permission denied to create foreign-data wrapper "foobar" +HINT: Must be superuser to create a foreign-data wrapper. +ALTER FOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true'); -- ERROR +ERROR: permission denied to alter foreign-data wrapper "foo" +HINT: Must be superuser to alter a foreign-data wrapper. +DROP FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: must be owner of foreign-data wrapper foo +GRANT USAGE ON FOREIGN DATA WRAPPER postgresql TO regress_test_role; -- WARNING +WARNING: no privileges were granted for "postgresql" +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; +CREATE SERVER s9 FOREIGN DATA WRAPPER postgresql; +ALTER SERVER s6 VERSION '0.5'; -- ERROR +ERROR: must be owner of foreign server s6 +DROP SERVER s6; -- ERROR +ERROR: must be owner of foreign server s6 +GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role; -- ERROR +ERROR: permission denied for foreign server s6 +GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role; +CREATE USER MAPPING FOR public SERVER s6; -- ERROR +ERROR: must be owner of foreign server s6 +CREATE USER MAPPING FOR public SERVER s9; +ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (gotcha 'true'); -- ERROR +ERROR: must be owner of foreign server s6 +DROP USER MAPPING FOR regress_test_role SERVER s6; -- ERROR +ERROR: must be owner of foreign server s6 +RESET ROLE; +REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_unprivileged_role; -- ERROR +ERROR: dependent privileges exist +HINT: Use CASCADE to revoke them too. +REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_unprivileged_role CASCADE; +SET ROLE regress_unprivileged_role; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; -- ERROR +ERROR: permission denied for foreign-data wrapper foo +CREATE SERVER s10 FOREIGN DATA WRAPPER foo; -- ERROR +ERROR: permission denied for foreign-data wrapper foo +ALTER SERVER s9 VERSION '1.1'; +GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role; +CREATE USER MAPPING FOR current_user SERVER s9; +-- We use terse mode to avoid ordering issues in cascade detail output. +\set VERBOSITY terse +DROP SERVER s9 CASCADE; +NOTICE: drop cascades to 2 other objects +\set VERBOSITY default +RESET ROLE; +CREATE SERVER s9 FOREIGN DATA WRAPPER foo; +GRANT USAGE ON FOREIGN SERVER s9 TO regress_unprivileged_role; +SET ROLE regress_unprivileged_role; +ALTER SERVER s9 VERSION '1.2'; -- ERROR +ERROR: must be owner of foreign server s9 +GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role; -- WARNING +WARNING: no privileges were granted for "s9" +CREATE USER MAPPING FOR current_user SERVER s9; +DROP SERVER s9 CASCADE; -- ERROR +ERROR: must be owner of foreign server s9 +-- Check visibility of user mapping data +SET ROLE regress_test_role; +CREATE SERVER s10 FOREIGN DATA WRAPPER foo; +CREATE USER MAPPING FOR public SERVER s10 OPTIONS (user 'secret'); +CREATE USER MAPPING FOR regress_unprivileged_role SERVER s10 OPTIONS (user 'secret'); +-- owner of server can see some option fields +\deu+ + List of user mappings + Server | User name | FDW options +--------+---------------------------+------------------- + s10 | public | ("user" 'secret') + s10 | regress_unprivileged_role | + s4 | regress_foreign_data_user | + s5 | regress_test_role | (modified '1') + s6 | regress_test_role | + s8 | public | + s8 | regress_foreign_data_user | + s9 | regress_unprivileged_role | + t1 | public | (modified '1') +(9 rows) + +RESET ROLE; +-- superuser can see all option fields +\deu+ + List of user mappings + Server | User name | FDW options +--------+---------------------------+--------------------- + s10 | public | ("user" 'secret') + s10 | regress_unprivileged_role | ("user" 'secret') + s4 | regress_foreign_data_user | + s5 | regress_test_role | (modified '1') + s6 | regress_test_role | + s8 | public | + s8 | regress_foreign_data_user | (password 'public') + s9 | regress_unprivileged_role | + t1 | public | (modified '1') +(9 rows) + +-- unprivileged user cannot see any option field +SET ROLE regress_unprivileged_role; +\deu+ + List of user mappings + Server | User name | FDW options +--------+---------------------------+------------- + s10 | public | + s10 | regress_unprivileged_role | + s4 | regress_foreign_data_user | + s5 | regress_test_role | + s6 | regress_test_role | + s8 | public | + s8 | regress_foreign_data_user | + s9 | regress_unprivileged_role | + t1 | public | +(9 rows) + +RESET ROLE; +\set VERBOSITY terse +DROP SERVER s10 CASCADE; +NOTICE: drop cascades to 2 other objects +\set VERBOSITY default +-- Triggers +CREATE FUNCTION dummy_trigger() RETURNS TRIGGER AS $$ + BEGIN + RETURN NULL; + END +$$ language plpgsql; +CREATE TRIGGER trigtest_before_stmt BEFORE INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH STATEMENT +EXECUTE PROCEDURE dummy_trigger(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER trigtest_after_stmt AFTER INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH STATEMENT +EXECUTE PROCEDURE dummy_trigger(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER trigtest_after_stmt_tt AFTER INSERT OR UPDATE OR DELETE -- ERROR +ON foreign_schema.foreign_table_1 +REFERENCING NEW TABLE AS new_table +FOR EACH STATEMENT +EXECUTE PROCEDURE dummy_trigger(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER trigtest_before_row BEFORE INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH ROW +EXECUTE PROCEDURE dummy_trigger(); +CREATE TRIGGER trigtest_after_row AFTER INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH ROW +EXECUTE PROCEDURE dummy_trigger(); +CREATE CONSTRAINT TRIGGER trigtest_constraint AFTER INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH ROW +EXECUTE PROCEDURE dummy_trigger(); +ERROR: "foreign_table_1" is a foreign table +DETAIL: Foreign tables cannot have constraint triggers. +ALTER FOREIGN TABLE foreign_schema.foreign_table_1 + DISABLE TRIGGER trigtest_before_stmt; +ERROR: trigger "trigtest_before_stmt" for table "foreign_table_1" does not exist +ALTER FOREIGN TABLE foreign_schema.foreign_table_1 + ENABLE TRIGGER trigtest_before_stmt; +ERROR: trigger "trigtest_before_stmt" for table "foreign_table_1" does not exist +DROP TRIGGER trigtest_before_stmt ON foreign_schema.foreign_table_1; +ERROR: trigger "trigtest_before_stmt" for table "foreign_table_1" does not exist +DROP TRIGGER trigtest_before_row ON foreign_schema.foreign_table_1; +DROP TRIGGER trigtest_after_stmt ON foreign_schema.foreign_table_1; +ERROR: trigger "trigtest_after_stmt" for table "foreign_table_1" does not exist +DROP TRIGGER trigtest_after_row ON foreign_schema.foreign_table_1; +DROP FUNCTION dummy_trigger(); +-- Table inheritance +CREATE TABLE fd_pt1 ( + c1 integer NOT NULL, + c2 text, + c3 date +); +CREATE FOREIGN TABLE ft2 () INHERITS (fd_pt1) + SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 + +DROP FOREIGN TABLE ft2; +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | | | extended | | + c3 | date | | | | plain | | + +CREATE FOREIGN TABLE ft2 ( + c1 integer NOT NULL, + c2 text, + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +ALTER FOREIGN TABLE ft2 INHERIT fd_pt1; +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 + +-- GPDB: Cannot create distributed table from non-distributed foreign table. +-- CBDB: But in single-node mode we can. +-- CREATE TABLE ct3() INHERITS(ft2); +CREATE FOREIGN TABLE ft3 ( + c1 integer NOT NULL, + c2 text, + c3 date +) INHERITS(ft2) + SERVER s0; +NOTICE: merging column "c1" with inherited definition +NOTICE: merging column "c2" with inherited definition +NOTICE: merging column "c3" with inherited definition +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 +Child tables: ft3 + +-- start_ignore +-- GPDB: ct3 is not created. +\d+ ct3 +-- end_ignore +\d+ ft3 + Foreign table "public.ft3" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Server: s0 +Inherits: ft2 + +-- add attributes recursively +ALTER TABLE fd_pt1 ADD COLUMN c4 integer; +ALTER TABLE fd_pt1 ADD COLUMN c5 integer DEFAULT 0; +ALTER TABLE fd_pt1 ADD COLUMN c6 integer; +ALTER TABLE fd_pt1 ADD COLUMN c7 integer NOT NULL; +ALTER TABLE fd_pt1 ADD COLUMN c8 integer; +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | | | extended | | + c3 | date | | | | plain | | + c4 | integer | | | | plain | | + c5 | integer | | | 0 | plain | | + c6 | integer | | | | plain | | + c7 | integer | | not null | | plain | | + c8 | integer | | | | plain | | +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | + c4 | integer | | | | | plain | | + c5 | integer | | | 0 | | plain | | + c6 | integer | | | | | plain | | + c7 | integer | | not null | | | plain | | + c8 | integer | | | | | plain | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 +Child tables: ft3 + +-- start_ignore +-- GPDB: ct3 is not created. +\d+ ct3 +-- end_ignore +\d+ ft3 + Foreign table "public.ft3" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | + c4 | integer | | | | | plain | | + c5 | integer | | | 0 | | plain | | + c6 | integer | | | | | plain | | + c7 | integer | | not null | | | plain | | + c8 | integer | | | | | plain | | +Server: s0 +Inherits: ft2 + +-- alter attributes recursively +ALTER TABLE fd_pt1 ALTER COLUMN c4 SET DEFAULT 0; +ALTER TABLE fd_pt1 ALTER COLUMN c5 DROP DEFAULT; +ALTER TABLE fd_pt1 ALTER COLUMN c6 SET NOT NULL; +ALTER TABLE fd_pt1 ALTER COLUMN c7 DROP NOT NULL; +ALTER TABLE fd_pt1 ALTER COLUMN c8 TYPE char(10) USING '0'; -- ERROR +ERROR: "ft2" is not a table +ALTER TABLE fd_pt1 ALTER COLUMN c8 TYPE char(10); +ALTER TABLE fd_pt1 ALTER COLUMN c8 SET DATA TYPE text; +ALTER TABLE fd_pt1 ALTER COLUMN c1 SET STATISTICS 10000; +ALTER TABLE fd_pt1 ALTER COLUMN c1 SET (n_distinct = 100); +ALTER TABLE fd_pt1 ALTER COLUMN c8 SET STATISTICS -1; +ALTER TABLE fd_pt1 ALTER COLUMN c8 SET STORAGE EXTERNAL; +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | 10000 | + c2 | text | | | | extended | | + c3 | date | | | | plain | | + c4 | integer | | | 0 | plain | | + c5 | integer | | | | plain | | + c6 | integer | | not null | | plain | | + c7 | integer | | | | plain | | + c8 | text | | | | external | | +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | 10000 | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | + c4 | integer | | | 0 | | plain | | + c5 | integer | | | | | plain | | + c6 | integer | | not null | | | plain | | + c7 | integer | | | | | plain | | + c8 | text | | | | | external | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 +Child tables: ft3 + +-- drop attributes recursively +ALTER TABLE fd_pt1 DROP COLUMN c4; +ALTER TABLE fd_pt1 DROP COLUMN c5; +ALTER TABLE fd_pt1 DROP COLUMN c6; +ALTER TABLE fd_pt1 DROP COLUMN c7; +ALTER TABLE fd_pt1 DROP COLUMN c8; +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | 10000 | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | 10000 | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 +Child tables: ft3 + +-- add constraints recursively +ALTER TABLE fd_pt1 ADD CONSTRAINT fd_pt1chk1 CHECK (c1 > 0) NO INHERIT; +ALTER TABLE fd_pt1 ADD CONSTRAINT fd_pt1chk2 CHECK (c2 <> ''); +-- connoinherit should be true for NO INHERIT constraint +SELECT relname, conname, contype, conislocal, coninhcount, connoinherit + FROM pg_class AS pc JOIN pg_constraint AS pgc ON (conrelid = pc.oid) + WHERE pc.relname = 'fd_pt1' + ORDER BY 1,2; + relname | conname | contype | conislocal | coninhcount | connoinherit +---------+------------+---------+------------+-------------+-------------- + fd_pt1 | fd_pt1chk1 | c | t | 0 | t + fd_pt1 | fd_pt1chk2 | c | t | 0 | f +(2 rows) + +-- child does not inherit NO INHERIT constraints +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | 10000 | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Check constraints: + "fd_pt1chk1" CHECK (c1 > 0) NO INHERIT + "fd_pt1chk2" CHECK (c2 <> ''::text) +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | 10000 | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Check constraints: + "fd_pt1chk2" CHECK (c2 <> ''::text) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 +Child tables: ft3 + +DROP FOREIGN TABLE ft2; -- ERROR +ERROR: cannot drop foreign table ft2 because other objects depend on it +DETAIL: foreign table ft3 depends on foreign table ft2 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP FOREIGN TABLE ft2 CASCADE; +NOTICE: drop cascades to foreign table ft3 +CREATE FOREIGN TABLE ft2 ( + c1 integer NOT NULL, + c2 text, + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +-- child must have parent's INHERIT constraints +ALTER FOREIGN TABLE ft2 INHERIT fd_pt1; -- ERROR +ERROR: child table is missing constraint "fd_pt1chk2" +ALTER FOREIGN TABLE ft2 ADD CONSTRAINT fd_pt1chk2 CHECK (c2 <> ''); +ALTER FOREIGN TABLE ft2 INHERIT fd_pt1; +-- child does not inherit NO INHERIT constraints +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | 10000 | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Check constraints: + "fd_pt1chk1" CHECK (c1 > 0) NO INHERIT + "fd_pt1chk2" CHECK (c2 <> ''::text) +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Check constraints: + "fd_pt1chk2" CHECK (c2 <> ''::text) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 + +-- drop constraints recursively +ALTER TABLE fd_pt1 DROP CONSTRAINT fd_pt1chk1 CASCADE; +ALTER TABLE fd_pt1 DROP CONSTRAINT fd_pt1chk2 CASCADE; +-- NOT VALID case +SET gp_autostats_mode=NONE; -- GPDB: don't analyze after insert +INSERT INTO fd_pt1 VALUES (1, 'fd_pt1'::text, '1994-01-01'::date); +ALTER TABLE fd_pt1 ADD CONSTRAINT fd_pt1chk3 CHECK (c2 <> '') NOT VALID; +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | 10000 | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Check constraints: + "fd_pt1chk3" CHECK (c2 <> ''::text) NOT VALID +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Check constraints: + "fd_pt1chk2" CHECK (c2 <> ''::text) + "fd_pt1chk3" CHECK (c2 <> ''::text) NOT VALID +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 + +-- VALIDATE CONSTRAINT need do nothing on foreign tables +ALTER TABLE fd_pt1 VALIDATE CONSTRAINT fd_pt1chk3; +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | 10000 | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Check constraints: + "fd_pt1chk3" CHECK (c2 <> ''::text) +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Check constraints: + "fd_pt1chk2" CHECK (c2 <> ''::text) + "fd_pt1chk3" CHECK (c2 <> ''::text) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 + +-- changes name of an attribute recursively +ALTER TABLE fd_pt1 RENAME COLUMN c1 TO f1; +ALTER TABLE fd_pt1 RENAME COLUMN c2 TO f2; +ALTER TABLE fd_pt1 RENAME COLUMN c3 TO f3; +-- changes name of a constraint recursively +ALTER TABLE fd_pt1 RENAME CONSTRAINT fd_pt1chk3 TO f2_check; +\d+ fd_pt1 + Table "public.fd_pt1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + f1 | integer | | not null | | plain | 10000 | + f2 | text | | | | extended | | + f3 | date | | | | plain | | +Check constraints: + "f2_check" CHECK (f2 <> ''::text) +Child tables: ft2 + +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + f1 | integer | | not null | | | plain | | + f2 | text | | | | | extended | | + f3 | date | | | | | plain | | +Check constraints: + "f2_check" CHECK (f2 <> ''::text) + "fd_pt1chk2" CHECK (f2 <> ''::text) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') +Inherits: fd_pt1 + +-- TRUNCATE doesn't work on foreign tables, either directly or recursively +TRUNCATE ft2; -- ERROR +ERROR: foreign-data wrapper "dummy" has no handler +TRUNCATE fd_pt1; -- ERROR +ERROR: foreign-data wrapper "dummy" has no handler +DROP TABLE fd_pt1 CASCADE; +NOTICE: drop cascades to foreign table ft2 +-- IMPORT FOREIGN SCHEMA +IMPORT FOREIGN SCHEMA s1 FROM SERVER s9 INTO public; -- ERROR +ERROR: foreign-data wrapper "foo" has no handler +IMPORT FOREIGN SCHEMA s1 LIMIT TO (t1) FROM SERVER s9 INTO public; --ERROR +ERROR: foreign-data wrapper "foo" has no handler +IMPORT FOREIGN SCHEMA s1 EXCEPT (t1) FROM SERVER s9 INTO public; -- ERROR +ERROR: foreign-data wrapper "foo" has no handler +IMPORT FOREIGN SCHEMA s1 EXCEPT (t1, t2) FROM SERVER s9 INTO public +OPTIONS (option1 'value1', option2 'value2'); -- ERROR +ERROR: foreign-data wrapper "foo" has no handler +-- DROP FOREIGN TABLE +DROP FOREIGN TABLE no_table; -- ERROR +ERROR: foreign table "no_table" does not exist +DROP FOREIGN TABLE IF EXISTS no_table; +NOTICE: foreign table "no_table" does not exist, skipping +DROP FOREIGN TABLE foreign_schema.foreign_table_1; +-- REASSIGN OWNED/DROP OWNED of foreign objects +REASSIGN OWNED BY regress_test_role TO regress_test_role2; +DROP OWNED BY regress_test_role2; +ERROR: cannot drop desired object(s) because other objects depend on them +DETAIL: user mapping for regress_test_role on server s5 depends on server s5 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP OWNED BY regress_test_role2 CASCADE; +NOTICE: drop cascades to user mapping for regress_test_role on server s5 +-- Foreign partition DDL stuff +CREATE TABLE fd_pt2 ( + c1 integer NOT NULL, + c2 text, + c3 date +) PARTITION BY LIST (c1); +CREATE FOREIGN TABLE fd_pt2_1 PARTITION OF fd_pt2 FOR VALUES IN (1) + SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ fd_pt2 + Partitioned table "public.fd_pt2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Partition key: LIST (c1) +Partitions: fd_pt2_1 FOR VALUES IN (1) + +\d+ fd_pt2_1 + Foreign table "public.fd_pt2_1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Partition of: fd_pt2 FOR VALUES IN (1) +Partition constraint: ((c1 IS NOT NULL) AND (c1 = 1)) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +-- partition cannot have additional columns +DROP FOREIGN TABLE fd_pt2_1; +CREATE FOREIGN TABLE fd_pt2_1 ( + c1 integer NOT NULL, + c2 text, + c3 date, + c4 char +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ fd_pt2_1 + Foreign table "public.fd_pt2_1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+--------------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | + c4 | character(1) | | | | | extended | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); -- ERROR +ERROR: table "fd_pt2_1" contains column "c4" not found in parent "fd_pt2" +DETAIL: The new partition may contain only the columns present in parent. +DROP FOREIGN TABLE fd_pt2_1; +\d+ fd_pt2 + Partitioned table "public.fd_pt2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Partition key: LIST (c1) +Number of partitions: 0 + +CREATE FOREIGN TABLE fd_pt2_1 ( + c1 integer NOT NULL, + c2 text, + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ fd_pt2_1 + Foreign table "public.fd_pt2_1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +-- no attach partition validation occurs for foreign tables +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); +\d+ fd_pt2 + Partitioned table "public.fd_pt2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Partition key: LIST (c1) +Partitions: fd_pt2_1 FOR VALUES IN (1) + +\d+ fd_pt2_1 + Foreign table "public.fd_pt2_1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | | | | plain | | +Partition of: fd_pt2 FOR VALUES IN (1) +Partition constraint: ((c1 IS NOT NULL) AND (c1 = 1)) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +-- cannot add column to a partition +ALTER TABLE fd_pt2_1 ADD c4 char; +ERROR: cannot add column to a partition +-- ok to have a partition's own constraints though +ALTER TABLE fd_pt2_1 ALTER c3 SET NOT NULL; +ALTER TABLE fd_pt2_1 ADD CONSTRAINT p21chk CHECK (c2 <> ''); +\d+ fd_pt2 + Partitioned table "public.fd_pt2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | | | extended | | + c3 | date | | | | plain | | +Partition key: LIST (c1) +Partitions: fd_pt2_1 FOR VALUES IN (1) + +\d+ fd_pt2_1 + Foreign table "public.fd_pt2_1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | not null | | | plain | | +Partition of: fd_pt2 FOR VALUES IN (1) +Partition constraint: ((c1 IS NOT NULL) AND (c1 = 1)) +Check constraints: + "p21chk" CHECK (c2 <> ''::text) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +-- cannot drop inherited NOT NULL constraint from a partition +ALTER TABLE fd_pt2_1 ALTER c1 DROP NOT NULL; +ERROR: column "c1" is marked NOT NULL in parent table +-- partition must have parent's constraints +ALTER TABLE fd_pt2 DETACH PARTITION fd_pt2_1; +ALTER TABLE fd_pt2 ALTER c2 SET NOT NULL; +\d+ fd_pt2 + Partitioned table "public.fd_pt2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | not null | | extended | | + c3 | date | | | | plain | | +Partition key: LIST (c1) +Number of partitions: 0 + +\d+ fd_pt2_1 + Foreign table "public.fd_pt2_1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | | | | extended | | + c3 | date | | not null | | | plain | | +Check constraints: + "p21chk" CHECK (c2 <> ''::text) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); -- ERROR +ERROR: column "c2" in child table must be marked NOT NULL +ALTER FOREIGN TABLE fd_pt2_1 ALTER c2 SET NOT NULL; +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); +ALTER TABLE fd_pt2 DETACH PARTITION fd_pt2_1; +ALTER TABLE fd_pt2 ADD CONSTRAINT fd_pt2chk1 CHECK (c1 > 0); +\d+ fd_pt2 + Partitioned table "public.fd_pt2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + c1 | integer | | not null | | plain | | + c2 | text | | not null | | extended | | + c3 | date | | | | plain | | +Partition key: LIST (c1) +Check constraints: + "fd_pt2chk1" CHECK (c1 > 0) +Number of partitions: 0 + +\d+ fd_pt2_1 + Foreign table "public.fd_pt2_1" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+----------+--------------+------------- + c1 | integer | | not null | | | plain | | + c2 | text | | not null | | | extended | | + c3 | date | | not null | | | plain | | +Check constraints: + "p21chk" CHECK (c2 <> ''::text) +Server: s0 +FDW options: (delimiter ',', quote '"', "be quoted" 'value') + +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); -- ERROR +ERROR: child table is missing constraint "fd_pt2chk1" +ALTER FOREIGN TABLE fd_pt2_1 ADD CONSTRAINT fd_pt2chk1 CHECK (c1 > 0); +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); +-- TRUNCATE doesn't work on foreign tables, either directly or recursively +TRUNCATE fd_pt2_1; -- ERROR +ERROR: foreign-data wrapper "dummy" has no handler +TRUNCATE fd_pt2; -- ERROR +ERROR: foreign-data wrapper "dummy" has no handler +DROP FOREIGN TABLE fd_pt2_1; +DROP TABLE fd_pt2; +-- foreign table cannot be part of partition tree made of temporary +-- relations. +CREATE TEMP TABLE temp_parted (a int) PARTITION BY LIST (a); +CREATE FOREIGN TABLE foreign_part PARTITION OF temp_parted DEFAULT + SERVER s0; -- ERROR +ERROR: cannot create a permanent relation as partition of temporary relation "temp_parted" +CREATE FOREIGN TABLE foreign_part (a int) SERVER s0; +ALTER TABLE temp_parted ATTACH PARTITION foreign_part DEFAULT; -- ERROR +ERROR: cannot attach a permanent relation as partition of temporary relation "temp_parted" +DROP FOREIGN TABLE foreign_part; +DROP TABLE temp_parted; +-- Cleanup +DROP SCHEMA foreign_schema CASCADE; +DROP ROLE regress_test_role; -- ERROR +ERROR: role "regress_test_role" cannot be dropped because some objects depend on it +DETAIL: privileges for foreign-data wrapper foo +privileges for server s4 +owner of user mapping for regress_test_role on server s6 +DROP SERVER t1 CASCADE; +NOTICE: drop cascades to user mapping for public on server t1 +DROP USER MAPPING FOR regress_test_role SERVER s6; +\set VERBOSITY terse +DROP FOREIGN DATA WRAPPER foo CASCADE; +NOTICE: drop cascades to 5 other objects +DROP SERVER s8 CASCADE; +NOTICE: drop cascades to 2 other objects +\set VERBOSITY default +DROP ROLE regress_test_indirect; +DROP ROLE regress_test_role; +DROP ROLE regress_unprivileged_role; -- ERROR +ERROR: role "regress_unprivileged_role" cannot be dropped because some objects depend on it +DETAIL: privileges for foreign-data wrapper postgresql +REVOKE ALL ON FOREIGN DATA WRAPPER postgresql FROM regress_unprivileged_role; +DROP ROLE regress_unprivileged_role; +DROP ROLE regress_test_role2; +DROP FOREIGN DATA WRAPPER postgresql CASCADE; +DROP FOREIGN DATA WRAPPER dummy CASCADE; +NOTICE: drop cascades to server s0 +\c +DROP ROLE regress_foreign_data_user; +-- At this point we should have no wrappers, no servers, and no mappings. +SELECT fdwname, fdwhandler, fdwvalidator, fdwoptions FROM pg_foreign_data_wrapper WHERE fdwname <> 'gp_exttable_fdw'; + fdwname | fdwhandler | fdwvalidator | fdwoptions +---------+------------+--------------+------------ +(0 rows) + +SELECT srvname, srvoptions FROM pg_foreign_server WHERE srvname <> 'gp_exttable_server'; + srvname | srvoptions +---------+------------ +(0 rows) + +SELECT * FROM pg_user_mapping; + oid | umuser | umserver | umoptions +-----+--------+----------+----------- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/foreign_key.out b/src/test/singlenode_regress/expected/foreign_key.out new file mode 100644 index 00000000000..bf794dce9d8 --- /dev/null +++ b/src/test/singlenode_regress/expected/foreign_key.out @@ -0,0 +1,2568 @@ +-- +-- FOREIGN KEY +-- +-- MATCH FULL +-- +-- First test, check and cascade +-- +CREATE TABLE PKTABLE ( ptest1 int PRIMARY KEY, ptest2 text ); +CREATE TABLE FKTABLE ( ftest1 int REFERENCES PKTABLE MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int ); +-- Insert test data into PKTABLE +INSERT INTO PKTABLE VALUES (1, 'Test1'); +INSERT INTO PKTABLE VALUES (2, 'Test2'); +INSERT INTO PKTABLE VALUES (3, 'Test3'); +INSERT INTO PKTABLE VALUES (4, 'Test4'); +INSERT INTO PKTABLE VALUES (5, 'Test5'); +-- Insert successful rows into FK TABLE +INSERT INTO FKTABLE VALUES (1, 2); +INSERT INTO FKTABLE VALUES (2, 3); +INSERT INTO FKTABLE VALUES (3, 4); +INSERT INTO FKTABLE VALUES (NULL, 1); +-- Insert a failed row into FK TABLE +INSERT INTO FKTABLE VALUES (100, 2); +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey" +DETAIL: Key (ftest1)=(100) is not present in table "pktable". +-- Check FKTABLE +SELECT * FROM FKTABLE; + ftest1 | ftest2 +--------+-------- + 1 | 2 + 2 | 3 + 3 | 4 + | 1 +(4 rows) + +-- Delete a row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=1; +-- Check FKTABLE for removal of matched row +SELECT * FROM FKTABLE; + ftest1 | ftest2 +--------+-------- + 2 | 3 + 3 | 4 + | 1 +(3 rows) + +-- Update a row from PK TABLE +UPDATE PKTABLE SET ptest1=1 WHERE ptest1=2; +-- Check FKTABLE for update of matched row +SELECT * FROM FKTABLE; + ftest1 | ftest2 +--------+-------- + 3 | 4 + | 1 + 1 | 3 +(3 rows) + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- +-- check set NULL and table constraint on multiple columns +-- +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 text, PRIMARY KEY(ptest1, ptest2) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int, ftest3 int, CONSTRAINT constrname FOREIGN KEY(ftest1, ftest2) + REFERENCES PKTABLE MATCH FULL ON DELETE SET NULL ON UPDATE SET NULL); +-- Test comments +COMMENT ON CONSTRAINT constrname_wrong ON FKTABLE IS 'fk constraint comment'; +ERROR: constraint "constrname_wrong" for table "fktable" does not exist +COMMENT ON CONSTRAINT constrname ON FKTABLE IS 'fk constraint comment'; +COMMENT ON CONSTRAINT constrname ON FKTABLE IS NULL; +-- Insert test data into PKTABLE +INSERT INTO PKTABLE VALUES (1, 2, 'Test1'); +INSERT INTO PKTABLE VALUES (1, 3, 'Test1-2'); +INSERT INTO PKTABLE VALUES (2, 4, 'Test2'); +INSERT INTO PKTABLE VALUES (3, 6, 'Test3'); +INSERT INTO PKTABLE VALUES (4, 8, 'Test4'); +INSERT INTO PKTABLE VALUES (5, 10, 'Test5'); +-- Insert successful rows into FK TABLE +INSERT INTO FKTABLE VALUES (1, 2, 4); +INSERT INTO FKTABLE VALUES (1, 3, 5); +INSERT INTO FKTABLE VALUES (2, 4, 8); +INSERT INTO FKTABLE VALUES (3, 6, 12); +INSERT INTO FKTABLE VALUES (NULL, NULL, 0); +-- Insert failed rows into FK TABLE +INSERT INTO FKTABLE VALUES (100, 2, 4); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname" +DETAIL: Key (ftest1, ftest2)=(100, 2) is not present in table "pktable". +INSERT INTO FKTABLE VALUES (2, 2, 4); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname" +DETAIL: Key (ftest1, ftest2)=(2, 2) is not present in table "pktable". +INSERT INTO FKTABLE VALUES (NULL, 2, 4); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname" +DETAIL: MATCH FULL does not allow mixing of null and nonnull key values. +INSERT INTO FKTABLE VALUES (1, NULL, 4); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname" +DETAIL: MATCH FULL does not allow mixing of null and nonnull key values. +-- Check FKTABLE +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 1 | 2 | 4 + 1 | 3 | 5 + 2 | 4 | 8 + 3 | 6 | 12 + | | 0 +(5 rows) + +-- Delete a row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=1 and ptest2=2; +-- Check FKTABLE for removal of matched row +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 1 | 3 | 5 + 2 | 4 | 8 + 3 | 6 | 12 + | | 0 + | | 4 +(5 rows) + +-- Delete another row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=5 and ptest2=10; +-- Check FKTABLE (should be no change) +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 1 | 3 | 5 + 2 | 4 | 8 + 3 | 6 | 12 + | | 0 + | | 4 +(5 rows) + +-- Update a row from PK TABLE +UPDATE PKTABLE SET ptest1=1 WHERE ptest1=2; +-- Check FKTABLE for update of matched row +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 1 | 3 | 5 + 3 | 6 | 12 + | | 0 + | | 4 + | | 8 +(5 rows) + +-- Check update with part of key null +UPDATE FKTABLE SET ftest1 = NULL WHERE ftest1 = 1; +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname" +DETAIL: MATCH FULL does not allow mixing of null and nonnull key values. +-- Check update with old and new key values equal +UPDATE FKTABLE SET ftest1 = 1 WHERE ftest1 = 1; +-- Try altering the column type where foreign keys are involved +ALTER TABLE PKTABLE ALTER COLUMN ptest1 TYPE bigint; +ALTER TABLE FKTABLE ALTER COLUMN ftest1 TYPE bigint; +SELECT * FROM PKTABLE; + ptest1 | ptest2 | ptest3 +--------+--------+--------- + 1 | 3 | Test1-2 + 3 | 6 | Test3 + 4 | 8 | Test4 + 1 | 4 | Test2 +(4 rows) + +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 3 | 6 | 12 + | | 0 + | | 4 + | | 8 + 1 | 3 | 5 +(5 rows) + +DROP TABLE PKTABLE CASCADE; +NOTICE: drop cascades to constraint constrname on table fktable +DROP TABLE FKTABLE; +-- +-- check set default and table constraint on multiple columns +-- +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 text, PRIMARY KEY(ptest1, ptest2) ); +CREATE TABLE FKTABLE ( ftest1 int DEFAULT -1, ftest2 int DEFAULT -2, ftest3 int, CONSTRAINT constrname2 FOREIGN KEY(ftest1, ftest2) + REFERENCES PKTABLE MATCH FULL ON DELETE SET DEFAULT ON UPDATE SET DEFAULT); +-- Insert a value in PKTABLE for default +INSERT INTO PKTABLE VALUES (-1, -2, 'The Default!'); +-- Insert test data into PKTABLE +INSERT INTO PKTABLE VALUES (1, 2, 'Test1'); +INSERT INTO PKTABLE VALUES (1, 3, 'Test1-2'); +INSERT INTO PKTABLE VALUES (2, 4, 'Test2'); +INSERT INTO PKTABLE VALUES (3, 6, 'Test3'); +INSERT INTO PKTABLE VALUES (4, 8, 'Test4'); +INSERT INTO PKTABLE VALUES (5, 10, 'Test5'); +-- Insert successful rows into FK TABLE +INSERT INTO FKTABLE VALUES (1, 2, 4); +INSERT INTO FKTABLE VALUES (1, 3, 5); +INSERT INTO FKTABLE VALUES (2, 4, 8); +INSERT INTO FKTABLE VALUES (3, 6, 12); +INSERT INTO FKTABLE VALUES (NULL, NULL, 0); +-- Insert failed rows into FK TABLE +INSERT INTO FKTABLE VALUES (100, 2, 4); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname2" +DETAIL: Key (ftest1, ftest2)=(100, 2) is not present in table "pktable". +INSERT INTO FKTABLE VALUES (2, 2, 4); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname2" +DETAIL: Key (ftest1, ftest2)=(2, 2) is not present in table "pktable". +INSERT INTO FKTABLE VALUES (NULL, 2, 4); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname2" +DETAIL: MATCH FULL does not allow mixing of null and nonnull key values. +INSERT INTO FKTABLE VALUES (1, NULL, 4); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname2" +DETAIL: MATCH FULL does not allow mixing of null and nonnull key values. +-- Check FKTABLE +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 1 | 2 | 4 + 1 | 3 | 5 + 2 | 4 | 8 + 3 | 6 | 12 + | | 0 +(5 rows) + +-- Delete a row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=1 and ptest2=2; +-- Check FKTABLE to check for removal +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 1 | 3 | 5 + 2 | 4 | 8 + 3 | 6 | 12 + | | 0 + -1 | -2 | 4 +(5 rows) + +-- Delete another row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=5 and ptest2=10; +-- Check FKTABLE (should be no change) +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 1 | 3 | 5 + 2 | 4 | 8 + 3 | 6 | 12 + | | 0 + -1 | -2 | 4 +(5 rows) + +-- Update a row from PK TABLE +UPDATE PKTABLE SET ptest1=1 WHERE ptest1=2; +-- Check FKTABLE for update of matched row +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 +--------+--------+-------- + 1 | 3 | 5 + 3 | 6 | 12 + | | 0 + -1 | -2 | 4 + -1 | -2 | 8 +(5 rows) + +-- this should fail for lack of CASCADE +DROP TABLE PKTABLE; +ERROR: cannot drop table pktable because other objects depend on it +DETAIL: constraint constrname2 on table fktable depends on table pktable +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TABLE PKTABLE CASCADE; +NOTICE: drop cascades to constraint constrname2 on table fktable +DROP TABLE FKTABLE; +-- +-- First test, check with no on delete or on update +-- +CREATE TABLE PKTABLE ( ptest1 int PRIMARY KEY, ptest2 text ); +CREATE TABLE FKTABLE ( ftest1 int REFERENCES PKTABLE MATCH FULL, ftest2 int ); +-- Insert test data into PKTABLE +INSERT INTO PKTABLE VALUES (1, 'Test1'); +INSERT INTO PKTABLE VALUES (2, 'Test2'); +INSERT INTO PKTABLE VALUES (3, 'Test3'); +INSERT INTO PKTABLE VALUES (4, 'Test4'); +INSERT INTO PKTABLE VALUES (5, 'Test5'); +-- Insert successful rows into FK TABLE +INSERT INTO FKTABLE VALUES (1, 2); +INSERT INTO FKTABLE VALUES (2, 3); +INSERT INTO FKTABLE VALUES (3, 4); +INSERT INTO FKTABLE VALUES (NULL, 1); +-- Insert a failed row into FK TABLE +INSERT INTO FKTABLE VALUES (100, 2); +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey" +DETAIL: Key (ftest1)=(100) is not present in table "pktable". +-- Check FKTABLE +SELECT * FROM FKTABLE; + ftest1 | ftest2 +--------+-------- + 1 | 2 + 2 | 3 + 3 | 4 + | 1 +(4 rows) + +-- Check PKTABLE +SELECT * FROM PKTABLE; + ptest1 | ptest2 +--------+-------- + 1 | Test1 + 2 | Test2 + 3 | Test3 + 4 | Test4 + 5 | Test5 +(5 rows) + +-- Delete a row from PK TABLE (should fail) +DELETE FROM PKTABLE WHERE ptest1=1; +ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_fkey" on table "fktable" +DETAIL: Key (ptest1)=(1) is still referenced from table "fktable". +-- Delete a row from PK TABLE (should succeed) +DELETE FROM PKTABLE WHERE ptest1=5; +-- Check PKTABLE for deletes +SELECT * FROM PKTABLE; + ptest1 | ptest2 +--------+-------- + 1 | Test1 + 2 | Test2 + 3 | Test3 + 4 | Test4 +(4 rows) + +-- Update a row from PK TABLE (should fail) +UPDATE PKTABLE SET ptest1=0 WHERE ptest1=2; +ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_fkey" on table "fktable" +DETAIL: Key (ptest1)=(2) is still referenced from table "fktable". +-- Update a row from PK TABLE (should succeed) +UPDATE PKTABLE SET ptest1=0 WHERE ptest1=4; +-- Check PKTABLE for updates +SELECT * FROM PKTABLE; + ptest1 | ptest2 +--------+-------- + 1 | Test1 + 2 | Test2 + 3 | Test3 + 0 | Test4 +(4 rows) + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- +-- Check initial check upon ALTER TABLE +-- +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, PRIMARY KEY(ptest1, ptest2) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int ); +INSERT INTO PKTABLE VALUES (1, 2); +INSERT INTO FKTABLE VALUES (1, NULL); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1, ftest2) REFERENCES PKTABLE MATCH FULL; +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_ftest2_fkey" +DETAIL: MATCH FULL does not allow mixing of null and nonnull key values. +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- MATCH SIMPLE +-- Base test restricting update/delete +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, PRIMARY KEY(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int, ftest3 int, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE); +-- Insert Primary Key values +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, 3, 'test2'); +INSERT INTO PKTABLE VALUES (2, 3, 4, 'test3'); +INSERT INTO PKTABLE VALUES (2, 4, 5, 'test4'); +-- Insert Foreign Key values +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +INSERT INTO FKTABLE VALUES (NULL, 2, 3, 2); +INSERT INTO FKTABLE VALUES (2, NULL, 3, 3); +INSERT INTO FKTABLE VALUES (NULL, 2, 7, 4); +INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5); +-- Insert a failed values +INSERT INTO FKTABLE VALUES (1, 2, 7, 6); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3" +DETAIL: Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable". +-- Show FKTABLE +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + 1 | 2 | 3 | 1 + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 +(5 rows) + +-- Try to update something that should fail +UPDATE PKTABLE set ptest2=5 where ptest2=2; +ERROR: update or delete on table "pktable" violates foreign key constraint "constrname3" on table "fktable" +DETAIL: Key (ptest1, ptest2, ptest3)=(1, 2, 3) is still referenced from table "fktable". +-- Try to update something that should succeed +UPDATE PKTABLE set ptest1=1 WHERE ptest2=3; +-- Try to delete something that should fail +DELETE FROM PKTABLE where ptest1=1 and ptest2=2 and ptest3=3; +ERROR: update or delete on table "pktable" violates foreign key constraint "constrname3" on table "fktable" +DETAIL: Key (ptest1, ptest2, ptest3)=(1, 2, 3) is still referenced from table "fktable". +-- Try to delete something that should work +DELETE FROM PKTABLE where ptest1=2; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 1 | 2 | 3 | test1 + 1 | 3 | 3 | test2 + 1 | 3 | 4 | test3 +(3 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + 1 | 2 | 3 | 1 + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 +(5 rows) + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- restrict with null values +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, UNIQUE(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int, ftest3 int, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE (ptest1, ptest2, ptest3)); +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, NULL, 'test2'); +INSERT INTO PKTABLE VALUES (2, NULL, 4, 'test3'); +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +DELETE FROM PKTABLE WHERE ptest1 = 2; +SELECT * FROM PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 1 | 2 | 3 | test1 + 1 | 3 | | test2 +(2 rows) + +SELECT * FROM FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + 1 | 2 | 3 | 1 +(1 row) + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- cascade update/delete +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, PRIMARY KEY(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int, ftest3 int, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE + ON DELETE CASCADE ON UPDATE CASCADE); +-- Insert Primary Key values +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, 3, 'test2'); +INSERT INTO PKTABLE VALUES (2, 3, 4, 'test3'); +INSERT INTO PKTABLE VALUES (2, 4, 5, 'test4'); +-- Insert Foreign Key values +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +INSERT INTO FKTABLE VALUES (NULL, 2, 3, 2); +INSERT INTO FKTABLE VALUES (2, NULL, 3, 3); +INSERT INTO FKTABLE VALUES (NULL, 2, 7, 4); +INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5); +-- Insert a failed values +INSERT INTO FKTABLE VALUES (1, 2, 7, 6); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3" +DETAIL: Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable". +-- Show FKTABLE +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + 1 | 2 | 3 | 1 + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 +(5 rows) + +-- Try to update something that will cascade +UPDATE PKTABLE set ptest2=5 where ptest2=2; +-- Try to update something that should not cascade +UPDATE PKTABLE set ptest1=1 WHERE ptest2=3; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 2 | 4 | 5 | test4 + 1 | 5 | 3 | test1 + 1 | 3 | 3 | test2 + 1 | 3 | 4 | test3 +(4 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 + 1 | 5 | 3 | 1 +(5 rows) + +-- Try to delete something that should cascade +DELETE FROM PKTABLE where ptest1=1 and ptest2=5 and ptest3=3; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 2 | 4 | 5 | test4 + 1 | 3 | 3 | test2 + 1 | 3 | 4 | test3 +(3 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 +(4 rows) + +-- Try to delete something that should not have a cascade +DELETE FROM PKTABLE where ptest1=2; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 1 | 3 | 3 | test2 + 1 | 3 | 4 | test3 +(2 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 +(4 rows) + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- set null update / set default delete +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, PRIMARY KEY(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int DEFAULT 0, ftest2 int, ftest3 int, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE + ON DELETE SET DEFAULT ON UPDATE SET NULL); +-- Insert Primary Key values +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, 3, 'test2'); +INSERT INTO PKTABLE VALUES (2, 3, 4, 'test3'); +INSERT INTO PKTABLE VALUES (2, 4, 5, 'test4'); +-- Insert Foreign Key values +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +INSERT INTO FKTABLE VALUES (2, 3, 4, 1); +INSERT INTO FKTABLE VALUES (NULL, 2, 3, 2); +INSERT INTO FKTABLE VALUES (2, NULL, 3, 3); +INSERT INTO FKTABLE VALUES (NULL, 2, 7, 4); +INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5); +-- Insert a failed values +INSERT INTO FKTABLE VALUES (1, 2, 7, 6); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3" +DETAIL: Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable". +-- Show FKTABLE +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + 1 | 2 | 3 | 1 + 2 | 3 | 4 | 1 + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 +(6 rows) + +-- Try to update something that will set null +UPDATE PKTABLE set ptest2=5 where ptest2=2; +-- Try to update something that should not set null +UPDATE PKTABLE set ptest2=2 WHERE ptest2=3 and ptest1=1; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 2 | 3 | 4 | test3 + 2 | 4 | 5 | test4 + 1 | 5 | 3 | test1 + 1 | 2 | 3 | test2 +(4 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + 2 | 3 | 4 | 1 + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 + | | | 1 +(6 rows) + +-- Try to delete something that should set default +DELETE FROM PKTABLE where ptest1=2 and ptest2=3 and ptest3=4; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 2 | 4 | 5 | test4 + 1 | 5 | 3 | test1 + 1 | 2 | 3 | test2 +(3 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 + | | | 1 + 0 | | | 1 +(6 rows) + +-- Try to delete something that should not set default +DELETE FROM PKTABLE where ptest2=5; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 2 | 4 | 5 | test4 + 1 | 2 | 3 | test2 +(2 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 + | | | 1 + 0 | | | 1 +(6 rows) + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- set default update / set null delete +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, PRIMARY KEY(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int DEFAULT 0, ftest2 int DEFAULT -1, ftest3 int DEFAULT -2, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE + ON DELETE SET NULL ON UPDATE SET DEFAULT); +-- Insert Primary Key values +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, 3, 'test2'); +INSERT INTO PKTABLE VALUES (2, 3, 4, 'test3'); +INSERT INTO PKTABLE VALUES (2, 4, 5, 'test4'); +INSERT INTO PKTABLE VALUES (2, -1, 5, 'test5'); +-- Insert Foreign Key values +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +INSERT INTO FKTABLE VALUES (2, 3, 4, 1); +INSERT INTO FKTABLE VALUES (2, 4, 5, 1); +INSERT INTO FKTABLE VALUES (NULL, 2, 3, 2); +INSERT INTO FKTABLE VALUES (2, NULL, 3, 3); +INSERT INTO FKTABLE VALUES (NULL, 2, 7, 4); +INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5); +-- Insert a failed values +INSERT INTO FKTABLE VALUES (1, 2, 7, 6); +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3" +DETAIL: Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable". +-- Show FKTABLE +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + 1 | 2 | 3 | 1 + 2 | 3 | 4 | 1 + 2 | 4 | 5 | 1 + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 +(7 rows) + +-- Try to update something that will fail +UPDATE PKTABLE set ptest2=5 where ptest2=2; +ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3" +DETAIL: Key (ftest1, ftest2, ftest3)=(0, -1, -2) is not present in table "pktable". +-- Try to update something that will set default +UPDATE PKTABLE set ptest1=0, ptest2=-1, ptest3=-2 where ptest2=2; +UPDATE PKTABLE set ptest2=10 where ptest2=4; +-- Try to update something that should not set default +UPDATE PKTABLE set ptest2=2 WHERE ptest2=3 and ptest1=1; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 2 | 3 | 4 | test3 + 2 | -1 | 5 | test5 + 0 | -1 | -2 | test1 + 2 | 10 | 5 | test4 + 1 | 2 | 3 | test2 +(5 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + 2 | 3 | 4 | 1 + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 + 0 | -1 | -2 | 1 + 0 | -1 | -2 | 1 +(7 rows) + +-- Try to delete something that should set null +DELETE FROM PKTABLE where ptest1=2 and ptest2=3 and ptest3=4; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 2 | -1 | 5 | test5 + 0 | -1 | -2 | test1 + 2 | 10 | 5 | test4 + 1 | 2 | 3 | test2 +(4 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 + 0 | -1 | -2 | 1 + 0 | -1 | -2 | 1 + | | | 1 +(7 rows) + +-- Try to delete something that should not set null +DELETE FROM PKTABLE where ptest2=-1 and ptest3=5; +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + ptest1 | ptest2 | ptest3 | ptest4 +--------+--------+--------+-------- + 0 | -1 | -2 | test1 + 2 | 10 | 5 | test4 + 1 | 2 | 3 | test2 +(3 rows) + +SELECT * from FKTABLE; + ftest1 | ftest2 | ftest3 | ftest4 +--------+--------+--------+-------- + | 2 | 3 | 2 + 2 | | 3 | 3 + | 2 | 7 | 4 + | 3 | 4 | 5 + 0 | -1 | -2 | 1 + 0 | -1 | -2 | 1 + | | | 1 +(7 rows) + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +CREATE TABLE PKTABLE (ptest1 int PRIMARY KEY); +CREATE TABLE FKTABLE_FAIL1 ( ftest1 int, CONSTRAINT fkfail1 FOREIGN KEY (ftest2) REFERENCES PKTABLE); +ERROR: column "ftest2" referenced in foreign key constraint does not exist +CREATE TABLE FKTABLE_FAIL2 ( ftest1 int, CONSTRAINT fkfail1 FOREIGN KEY (ftest1) REFERENCES PKTABLE(ptest2)); +ERROR: column "ptest2" referenced in foreign key constraint does not exist +DROP TABLE FKTABLE_FAIL1; +ERROR: table "fktable_fail1" does not exist +DROP TABLE FKTABLE_FAIL2; +ERROR: table "fktable_fail2" does not exist +DROP TABLE PKTABLE; +-- Test for referencing column number smaller than referenced constraint +CREATE TABLE PKTABLE (ptest1 int, ptest2 int, UNIQUE(ptest1, ptest2)); +CREATE TABLE FKTABLE_FAIL1 (ftest1 int REFERENCES pktable(ptest1)); +ERROR: there is no unique constraint matching given keys for referenced table "pktable" +DROP TABLE FKTABLE_FAIL1; +ERROR: table "fktable_fail1" does not exist +DROP TABLE PKTABLE; +-- +-- Tests for mismatched types +-- +-- Basic one column, two table setup +CREATE TABLE PKTABLE (ptest1 int PRIMARY KEY); +INSERT INTO PKTABLE VALUES(42); +-- This next should fail, because int=inet does not exist +CREATE TABLE FKTABLE (ftest1 inet REFERENCES pktable); +ERROR: foreign key constraint "fktable_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: inet and integer. +-- This should also fail for the same reason, but here we +-- give the column name +CREATE TABLE FKTABLE (ftest1 inet REFERENCES pktable(ptest1)); +ERROR: foreign key constraint "fktable_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: inet and integer. +-- This should succeed, even though they are different types, +-- because int=int8 exists and is a member of the integer opfamily +CREATE TABLE FKTABLE (ftest1 int8 REFERENCES pktable); +-- Check it actually works +INSERT INTO FKTABLE VALUES(42); -- should succeed +INSERT INTO FKTABLE VALUES(43); -- should fail +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey" +DETAIL: Key (ftest1)=(43) is not present in table "pktable". +UPDATE FKTABLE SET ftest1 = ftest1; -- should succeed +UPDATE FKTABLE SET ftest1 = ftest1 + 1; -- should fail +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey" +DETAIL: Key (ftest1)=(43) is not present in table "pktable". +DROP TABLE FKTABLE; +-- This should fail, because we'd have to cast numeric to int which is +-- not an implicit coercion (or use numeric=numeric, but that's not part +-- of the integer opfamily) +CREATE TABLE FKTABLE (ftest1 numeric REFERENCES pktable); +ERROR: foreign key constraint "fktable_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: numeric and integer. +DROP TABLE PKTABLE; +-- On the other hand, this should work because int implicitly promotes to +-- numeric, and we allow promotion on the FK side +CREATE TABLE PKTABLE (ptest1 numeric PRIMARY KEY); +INSERT INTO PKTABLE VALUES(42); +CREATE TABLE FKTABLE (ftest1 int REFERENCES pktable); +-- Check it actually works +INSERT INTO FKTABLE VALUES(42); -- should succeed +INSERT INTO FKTABLE VALUES(43); -- should fail +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey" +DETAIL: Key (ftest1)=(43) is not present in table "pktable". +UPDATE FKTABLE SET ftest1 = ftest1; -- should succeed +UPDATE FKTABLE SET ftest1 = ftest1 + 1; -- should fail +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey" +DETAIL: Key (ftest1)=(43) is not present in table "pktable". +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- Two columns, two tables +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, PRIMARY KEY(ptest1, ptest2)); +-- This should fail, because we just chose really odd types +CREATE TABLE FKTABLE (ftest1 cidr, ftest2 timestamp, FOREIGN KEY(ftest1, ftest2) REFERENCES pktable); +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: cidr and integer. +-- Again, so should this... +CREATE TABLE FKTABLE (ftest1 cidr, ftest2 timestamp, FOREIGN KEY(ftest1, ftest2) REFERENCES pktable(ptest1, ptest2)); +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: cidr and integer. +-- This fails because we mixed up the column ordering +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest2, ftest1) REFERENCES pktable); +ERROR: foreign key constraint "fktable_ftest2_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest2" and "ptest1" are of incompatible types: inet and integer. +-- As does this... +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest2, ftest1) REFERENCES pktable(ptest1, ptest2)); +ERROR: foreign key constraint "fktable_ftest2_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest2" and "ptest1" are of incompatible types: inet and integer. +-- And again.. +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest1, ftest2) REFERENCES pktable(ptest2, ptest1)); +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest2" are of incompatible types: integer and inet. +-- This works... +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest2, ftest1) REFERENCES pktable(ptest2, ptest1)); +DROP TABLE FKTABLE; +-- As does this +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest1, ftest2) REFERENCES pktable(ptest1, ptest2)); +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- Two columns, same table +-- Make sure this still works... +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest3, +ptest4) REFERENCES pktable(ptest1, ptest2)); +DROP TABLE PKTABLE; +-- And this, +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest3, +ptest4) REFERENCES pktable); +DROP TABLE PKTABLE; +-- This shouldn't (mixed up columns) +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest3, +ptest4) REFERENCES pktable(ptest2, ptest1)); +ERROR: foreign key constraint "pktable_ptest3_ptest4_fkey" cannot be implemented +DETAIL: Key columns "ptest3" and "ptest2" are of incompatible types: integer and inet. +-- Nor should this... (same reason, we have 4,3 referencing 1,2 which mismatches types +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest4, +ptest3) REFERENCES pktable(ptest1, ptest2)); +ERROR: foreign key constraint "pktable_ptest4_ptest3_fkey" cannot be implemented +DETAIL: Key columns "ptest4" and "ptest1" are of incompatible types: inet and integer. +-- Not this one either... Same as the last one except we didn't defined the columns being referenced. +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest4, +ptest3) REFERENCES pktable); +ERROR: foreign key constraint "pktable_ptest4_ptest3_fkey" cannot be implemented +DETAIL: Key columns "ptest4" and "ptest1" are of incompatible types: inet and integer. +-- +-- Now some cases with inheritance +-- Basic 2 table case: 1 column of matching types. +create table pktable_base (base1 int not null); +create table pktable (ptest1 int, primary key(base1), unique(base1, ptest1)) inherits (pktable_base); +create table fktable (ftest1 int references pktable(base1)); +-- now some ins, upd, del +insert into pktable(base1) values (1); +insert into pktable(base1) values (2); +-- let's insert a non-existent fktable value +insert into fktable(ftest1) values (3); +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey" +DETAIL: Key (ftest1)=(3) is not present in table "pktable". +-- let's make a valid row for that +insert into pktable(base1) values (3); +insert into fktable(ftest1) values (3); +-- let's try removing a row that should fail from pktable +delete from pktable where base1>2; +ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_fkey" on table "fktable" +DETAIL: Key (base1)=(3) is still referenced from table "fktable". +-- okay, let's try updating all of the base1 values to *4 +-- which should fail. +update pktable set base1=base1*4; +ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_fkey" on table "fktable" +DETAIL: Key (base1)=(3) is still referenced from table "fktable". +-- okay, let's try an update that should work. +update pktable set base1=base1*4 where base1<3; +-- and a delete that should work +delete from pktable where base1>3; +-- cleanup +drop table fktable; +delete from pktable; +-- Now 2 columns 2 tables, matching types +create table fktable (ftest1 int, ftest2 int, foreign key(ftest1, ftest2) references pktable(base1, ptest1)); +-- now some ins, upd, del +insert into pktable(base1, ptest1) values (1, 1); +insert into pktable(base1, ptest1) values (2, 2); +-- let's insert a non-existent fktable value +insert into fktable(ftest1, ftest2) values (3, 1); +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_ftest2_fkey" +DETAIL: Key (ftest1, ftest2)=(3, 1) is not present in table "pktable". +-- let's make a valid row for that +insert into pktable(base1,ptest1) values (3, 1); +insert into fktable(ftest1, ftest2) values (3, 1); +-- let's try removing a row that should fail from pktable +delete from pktable where base1>2; +ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_ftest2_fkey" on table "fktable" +DETAIL: Key (base1, ptest1)=(3, 1) is still referenced from table "fktable". +-- okay, let's try updating all of the base1 values to *4 +-- which should fail. +update pktable set base1=base1*4; +ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_ftest2_fkey" on table "fktable" +DETAIL: Key (base1, ptest1)=(3, 1) is still referenced from table "fktable". +-- okay, let's try an update that should work. +update pktable set base1=base1*4 where base1<3; +-- and a delete that should work +delete from pktable where base1>3; +-- cleanup +drop table fktable; +drop table pktable; +drop table pktable_base; +-- Now we'll do one all in 1 table with 2 columns of matching types +create table pktable_base(base1 int not null, base2 int); +create table pktable(ptest1 int, ptest2 int, primary key(base1, ptest1), foreign key(base2, ptest2) references + pktable(base1, ptest1)) inherits (pktable_base); +insert into pktable (base1, ptest1, base2, ptest2) values (1, 1, 1, 1); +insert into pktable (base1, ptest1, base2, ptest2) values (2, 1, 1, 1); +insert into pktable (base1, ptest1, base2, ptest2) values (2, 2, 2, 1); +insert into pktable (base1, ptest1, base2, ptest2) values (1, 3, 2, 2); +-- fails (3,2) isn't in base1, ptest1 +insert into pktable (base1, ptest1, base2, ptest2) values (2, 3, 3, 2); +ERROR: insert or update on table "pktable" violates foreign key constraint "pktable_base2_ptest2_fkey" +DETAIL: Key (base2, ptest2)=(3, 2) is not present in table "pktable". +-- fails (2,2) is being referenced +delete from pktable where base1=2; +ERROR: update or delete on table "pktable" violates foreign key constraint "pktable_base2_ptest2_fkey" on table "pktable" +DETAIL: Key (base1, ptest1)=(2, 2) is still referenced from table "pktable". +-- fails (1,1) is being referenced (twice) +update pktable set base1=3 where base1=1; +ERROR: update or delete on table "pktable" violates foreign key constraint "pktable_base2_ptest2_fkey" on table "pktable" +DETAIL: Key (base1, ptest1)=(1, 1) is still referenced from table "pktable". +-- this sequence of two deletes will work, since after the first there will be no (2,*) references +delete from pktable where base2=2; +delete from pktable where base1=2; +drop table pktable; +drop table pktable_base; +-- 2 columns (2 tables), mismatched types +create table pktable_base(base1 int not null); +create table pktable(ptest1 inet, primary key(base1, ptest1)) inherits (pktable_base); +-- just generally bad types (with and without column references on the referenced table) +create table fktable(ftest1 cidr, ftest2 int[], foreign key (ftest1, ftest2) references pktable); +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "base1" are of incompatible types: cidr and integer. +create table fktable(ftest1 cidr, ftest2 int[], foreign key (ftest1, ftest2) references pktable(base1, ptest1)); +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "base1" are of incompatible types: cidr and integer. +-- let's mix up which columns reference which +create table fktable(ftest1 int, ftest2 inet, foreign key(ftest2, ftest1) references pktable); +ERROR: foreign key constraint "fktable_ftest2_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest2" and "base1" are of incompatible types: inet and integer. +create table fktable(ftest1 int, ftest2 inet, foreign key(ftest2, ftest1) references pktable(base1, ptest1)); +ERROR: foreign key constraint "fktable_ftest2_ftest1_fkey" cannot be implemented +DETAIL: Key columns "ftest2" and "base1" are of incompatible types: inet and integer. +create table fktable(ftest1 int, ftest2 inet, foreign key(ftest1, ftest2) references pktable(ptest1, base1)); +ERROR: foreign key constraint "fktable_ftest1_ftest2_fkey" cannot be implemented +DETAIL: Key columns "ftest1" and "ptest1" are of incompatible types: integer and inet. +drop table pktable; +drop table pktable_base; +-- 2 columns (1 table), mismatched types +create table pktable_base(base1 int not null, base2 int); +create table pktable(ptest1 inet, ptest2 inet[], primary key(base1, ptest1), foreign key(base2, ptest2) references + pktable(base1, ptest1)) inherits (pktable_base); +ERROR: foreign key constraint "pktable_base2_ptest2_fkey" cannot be implemented +DETAIL: Key columns "ptest2" and "ptest1" are of incompatible types: inet[] and inet. +create table pktable(ptest1 inet, ptest2 inet, primary key(base1, ptest1), foreign key(base2, ptest2) references + pktable(ptest1, base1)) inherits (pktable_base); +ERROR: foreign key constraint "pktable_base2_ptest2_fkey" cannot be implemented +DETAIL: Key columns "base2" and "ptest1" are of incompatible types: integer and inet. +create table pktable(ptest1 inet, ptest2 inet, primary key(base1, ptest1), foreign key(ptest2, base2) references + pktable(base1, ptest1)) inherits (pktable_base); +ERROR: foreign key constraint "pktable_ptest2_base2_fkey" cannot be implemented +DETAIL: Key columns "ptest2" and "base1" are of incompatible types: inet and integer. +create table pktable(ptest1 inet, ptest2 inet, primary key(base1, ptest1), foreign key(ptest2, base2) references + pktable(base1, ptest1)) inherits (pktable_base); +ERROR: foreign key constraint "pktable_ptest2_base2_fkey" cannot be implemented +DETAIL: Key columns "ptest2" and "base1" are of incompatible types: inet and integer. +drop table pktable; +ERROR: table "pktable" does not exist +drop table pktable_base; +-- +-- Deferrable constraints +-- +-- deferrable, explicitly deferred +CREATE TABLE pktable ( + id INT4 PRIMARY KEY, + other INT4 +); +CREATE TABLE fktable ( + id INT4 PRIMARY KEY, + fk INT4 REFERENCES pktable DEFERRABLE +); +-- default to immediate: should fail +INSERT INTO fktable VALUES (5, 10); +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(10) is not present in table "pktable". +-- explicitly defer the constraint +BEGIN; +SET CONSTRAINTS ALL DEFERRED; +INSERT INTO fktable VALUES (10, 15); +INSERT INTO pktable VALUES (15, 0); -- make the FK insert valid +COMMIT; +DROP TABLE fktable, pktable; +-- deferrable, initially deferred +CREATE TABLE pktable ( + id INT4 PRIMARY KEY, + other INT4 +); +CREATE TABLE fktable ( + id INT4 PRIMARY KEY, + fk INT4 REFERENCES pktable DEFERRABLE INITIALLY DEFERRED +); +-- default to deferred, should succeed +BEGIN; +INSERT INTO fktable VALUES (100, 200); +INSERT INTO pktable VALUES (200, 500); -- make the FK insert valid +COMMIT; +-- default to deferred, explicitly make immediate +BEGIN; +SET CONSTRAINTS ALL IMMEDIATE; +-- should fail +INSERT INTO fktable VALUES (500, 1000); +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(1000) is not present in table "pktable". +COMMIT; +DROP TABLE fktable, pktable; +-- tricky behavior: according to SQL99, if a deferred constraint is set +-- to 'immediate' mode, it should be checked for validity *immediately*, +-- not when the current transaction commits (i.e. the mode change applies +-- retroactively) +CREATE TABLE pktable ( + id INT4 PRIMARY KEY, + other INT4 +); +CREATE TABLE fktable ( + id INT4 PRIMARY KEY, + fk INT4 REFERENCES pktable DEFERRABLE +); +BEGIN; +SET CONSTRAINTS ALL DEFERRED; +-- should succeed, for now +INSERT INTO fktable VALUES (1000, 2000); +-- should cause transaction abort, due to preceding error +SET CONSTRAINTS ALL IMMEDIATE; +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(2000) is not present in table "pktable". +INSERT INTO pktable VALUES (2000, 3); -- too late +ERROR: current transaction is aborted, commands ignored until end of transaction block +COMMIT; +DROP TABLE fktable, pktable; +-- deferrable, initially deferred +CREATE TABLE pktable ( + id INT4 PRIMARY KEY, + other INT4 +); +CREATE TABLE fktable ( + id INT4 PRIMARY KEY, + fk INT4 REFERENCES pktable DEFERRABLE INITIALLY DEFERRED +); +BEGIN; +-- no error here +INSERT INTO fktable VALUES (100, 200); +-- error here on commit +COMMIT; +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(200) is not present in table "pktable". +DROP TABLE pktable, fktable; +-- test notice about expensive referential integrity checks, +-- where the index cannot be used because of type incompatibilities. +CREATE TEMP TABLE pktable ( + id1 INT4 PRIMARY KEY, + id2 VARCHAR(4) UNIQUE, + id3 REAL UNIQUE, + UNIQUE(id1, id2, id3) +); +CREATE TEMP TABLE fktable ( + x1 INT4 REFERENCES pktable(id1), + x2 VARCHAR(4) REFERENCES pktable(id2), + x3 REAL REFERENCES pktable(id3), + x4 TEXT, + x5 INT2 +); +-- check individual constraints with alter table. +-- should fail +-- varchar does not promote to real +ALTER TABLE fktable ADD CONSTRAINT fk_2_3 +FOREIGN KEY (x2) REFERENCES pktable(id3); +ERROR: foreign key constraint "fk_2_3" cannot be implemented +DETAIL: Key columns "x2" and "id3" are of incompatible types: character varying and real. +-- nor to int4 +ALTER TABLE fktable ADD CONSTRAINT fk_2_1 +FOREIGN KEY (x2) REFERENCES pktable(id1); +ERROR: foreign key constraint "fk_2_1" cannot be implemented +DETAIL: Key columns "x2" and "id1" are of incompatible types: character varying and integer. +-- real does not promote to int4 +ALTER TABLE fktable ADD CONSTRAINT fk_3_1 +FOREIGN KEY (x3) REFERENCES pktable(id1); +ERROR: foreign key constraint "fk_3_1" cannot be implemented +DETAIL: Key columns "x3" and "id1" are of incompatible types: real and integer. +-- int4 does not promote to text +ALTER TABLE fktable ADD CONSTRAINT fk_1_2 +FOREIGN KEY (x1) REFERENCES pktable(id2); +ERROR: foreign key constraint "fk_1_2" cannot be implemented +DETAIL: Key columns "x1" and "id2" are of incompatible types: integer and character varying. +-- should succeed +-- int4 promotes to real +ALTER TABLE fktable ADD CONSTRAINT fk_1_3 +FOREIGN KEY (x1) REFERENCES pktable(id3); +-- text is compatible with varchar +ALTER TABLE fktable ADD CONSTRAINT fk_4_2 +FOREIGN KEY (x4) REFERENCES pktable(id2); +-- int2 is part of integer opfamily as of 8.0 +ALTER TABLE fktable ADD CONSTRAINT fk_5_1 +FOREIGN KEY (x5) REFERENCES pktable(id1); +-- check multikey cases, especially out-of-order column lists +-- these should work +ALTER TABLE fktable ADD CONSTRAINT fk_123_123 +FOREIGN KEY (x1,x2,x3) REFERENCES pktable(id1,id2,id3); +ALTER TABLE fktable ADD CONSTRAINT fk_213_213 +FOREIGN KEY (x2,x1,x3) REFERENCES pktable(id2,id1,id3); +ALTER TABLE fktable ADD CONSTRAINT fk_253_213 +FOREIGN KEY (x2,x5,x3) REFERENCES pktable(id2,id1,id3); +-- these should fail +ALTER TABLE fktable ADD CONSTRAINT fk_123_231 +FOREIGN KEY (x1,x2,x3) REFERENCES pktable(id2,id3,id1); +ERROR: foreign key constraint "fk_123_231" cannot be implemented +DETAIL: Key columns "x1" and "id2" are of incompatible types: integer and character varying. +ALTER TABLE fktable ADD CONSTRAINT fk_241_132 +FOREIGN KEY (x2,x4,x1) REFERENCES pktable(id1,id3,id2); +ERROR: foreign key constraint "fk_241_132" cannot be implemented +DETAIL: Key columns "x2" and "id1" are of incompatible types: character varying and integer. +DROP TABLE pktable, fktable; +-- test a tricky case: we can elide firing the FK check trigger during +-- an UPDATE if the UPDATE did not change the foreign key +-- field. However, we can't do this if our transaction was the one that +-- created the updated row and the trigger is deferred, since our UPDATE +-- will have invalidated the original newly-inserted tuple, and therefore +-- cause the on-INSERT RI trigger not to be fired. +CREATE TEMP TABLE pktable ( + id int primary key, + other int +); +CREATE TEMP TABLE fktable ( + id int primary key, + fk int references pktable deferrable initially deferred +); +INSERT INTO pktable VALUES (5, 10); +BEGIN; +-- doesn't match PK, but no error yet +INSERT INTO fktable VALUES (0, 20); +-- don't change FK +UPDATE fktable SET id = id + 1; +-- should catch error from initial INSERT +COMMIT; +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(20) is not present in table "pktable". +-- check same case when insert is in a different subtransaction than update +BEGIN; +-- doesn't match PK, but no error yet +INSERT INTO fktable VALUES (0, 20); +-- UPDATE will be in a subxact +SAVEPOINT savept1; +-- don't change FK +UPDATE fktable SET id = id + 1; +-- should catch error from initial INSERT +COMMIT; +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(20) is not present in table "pktable". +BEGIN; +-- INSERT will be in a subxact +SAVEPOINT savept1; +-- doesn't match PK, but no error yet +INSERT INTO fktable VALUES (0, 20); +RELEASE SAVEPOINT savept1; +-- don't change FK +UPDATE fktable SET id = id + 1; +-- should catch error from initial INSERT +COMMIT; +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(20) is not present in table "pktable". +BEGIN; +-- doesn't match PK, but no error yet +INSERT INTO fktable VALUES (0, 20); +-- UPDATE will be in a subxact +SAVEPOINT savept1; +-- don't change FK +UPDATE fktable SET id = id + 1; +-- Roll back the UPDATE +ROLLBACK TO savept1; +-- should catch error from initial INSERT +COMMIT; +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(20) is not present in table "pktable". +-- +-- check ALTER CONSTRAINT +-- +INSERT INTO fktable VALUES (1, 5); +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey DEFERRABLE INITIALLY IMMEDIATE; +BEGIN; +-- doesn't match FK, should throw error now +UPDATE pktable SET id = 10 WHERE id = 5; +ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_fk_fkey" on table "fktable" +DETAIL: Key (id)=(5) is still referenced from table "fktable". +COMMIT; +BEGIN; +-- doesn't match PK, should throw error now +INSERT INTO fktable VALUES (0, 20); +ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" +DETAIL: Key (fk)=(20) is not present in table "pktable". +COMMIT; +-- try additional syntax +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE; +-- illegal option +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY DEFERRED; +ERROR: constraint declared INITIALLY DEFERRED must be DEFERRABLE +LINE 1: ...e ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY ... + ^ +-- test order of firing of FK triggers when several RI-induced changes need to +-- be made to the same row. This was broken by subtransaction-related +-- changes in 8.0. +CREATE TEMP TABLE users ( + id INT PRIMARY KEY, + name VARCHAR NOT NULL +); +INSERT INTO users VALUES (1, 'Jozko'); +INSERT INTO users VALUES (2, 'Ferko'); +INSERT INTO users VALUES (3, 'Samko'); +CREATE TEMP TABLE tasks ( + id INT PRIMARY KEY, + owner INT REFERENCES users ON UPDATE CASCADE ON DELETE SET NULL, + worker INT REFERENCES users ON UPDATE CASCADE ON DELETE SET NULL, + checked_by INT REFERENCES users ON UPDATE CASCADE ON DELETE SET NULL +); +INSERT INTO tasks VALUES (1,1,NULL,NULL); +INSERT INTO tasks VALUES (2,2,2,NULL); +INSERT INTO tasks VALUES (3,3,3,3); +SELECT * FROM tasks; + id | owner | worker | checked_by +----+-------+--------+------------ + 1 | 1 | | + 2 | 2 | 2 | + 3 | 3 | 3 | 3 +(3 rows) + +UPDATE users SET id = 4 WHERE id = 3; +SELECT * FROM tasks; + id | owner | worker | checked_by +----+-------+--------+------------ + 1 | 1 | | + 2 | 2 | 2 | + 3 | 4 | 4 | 4 +(3 rows) + +DELETE FROM users WHERE id = 4; +SELECT * FROM tasks; + id | owner | worker | checked_by +----+-------+--------+------------ + 1 | 1 | | + 2 | 2 | 2 | + 3 | | | +(3 rows) + +-- could fail with only 2 changes to make, if row was already updated +BEGIN; +UPDATE tasks set id=id WHERE id=2; +SELECT * FROM tasks; + id | owner | worker | checked_by +----+-------+--------+------------ + 1 | 1 | | + 3 | | | + 2 | 2 | 2 | +(3 rows) + +DELETE FROM users WHERE id = 2; +SELECT * FROM tasks; + id | owner | worker | checked_by +----+-------+--------+------------ + 1 | 1 | | + 3 | | | + 2 | | | +(3 rows) + +COMMIT; +-- +-- Test self-referential FK with CASCADE (bug #6268) +-- +create temp table selfref ( + a int primary key, + b int, + foreign key (b) references selfref (a) + on update cascade on delete cascade +); +insert into selfref (a, b) +values + (0, 0), + (1, 1); +begin; + update selfref set a = 123 where a = 0; + select a, b from selfref; + a | b +-----+----- + 1 | 1 + 123 | 123 +(2 rows) + + update selfref set a = 456 where a = 123; + select a, b from selfref; + a | b +-----+----- + 1 | 1 + 456 | 456 +(2 rows) + +commit; +-- +-- Test that SET DEFAULT actions recognize updates to default values +-- +create temp table defp (f1 int primary key); +create temp table defc (f1 int default 0 + references defp on delete set default); +insert into defp values (0), (1), (2); +insert into defc values (2); +select * from defc; + f1 +---- + 2 +(1 row) + +delete from defp where f1 = 2; +select * from defc; + f1 +---- + 0 +(1 row) + +delete from defp where f1 = 0; -- fail +ERROR: update or delete on table "defp" violates foreign key constraint "defc_f1_fkey" on table "defc" +DETAIL: Key (f1)=(0) is still referenced from table "defc". +alter table defc alter column f1 set default 1; +delete from defp where f1 = 0; +select * from defc; + f1 +---- + 1 +(1 row) + +delete from defp where f1 = 1; -- fail +ERROR: update or delete on table "defp" violates foreign key constraint "defc_f1_fkey" on table "defc" +DETAIL: Key (f1)=(1) is still referenced from table "defc". +-- +-- Test the difference between NO ACTION and RESTRICT +-- +create temp table pp (f1 int primary key); +create temp table cc (f1 int references pp on update no action on delete no action); +insert into pp values(12); +insert into pp values(11); +update pp set f1=f1+1; +insert into cc values(13); +update pp set f1=f1+1; +update pp set f1=f1+1; -- fail +ERROR: update or delete on table "pp" violates foreign key constraint "cc_f1_fkey" on table "cc" +DETAIL: Key (f1)=(13) is still referenced from table "cc". +delete from pp where f1 = 13; -- fail +ERROR: update or delete on table "pp" violates foreign key constraint "cc_f1_fkey" on table "cc" +DETAIL: Key (f1)=(13) is still referenced from table "cc". +drop table pp, cc; +create temp table pp (f1 int primary key); +create temp table cc (f1 int references pp on update restrict on delete restrict); +insert into pp values(12); +insert into pp values(11); +update pp set f1=f1+1; +insert into cc values(13); +update pp set f1=f1+1; -- fail +ERROR: update or delete on table "pp" violates foreign key constraint "cc_f1_fkey" on table "cc" +DETAIL: Key (f1)=(13) is still referenced from table "cc". +delete from pp where f1 = 13; -- fail +ERROR: update or delete on table "pp" violates foreign key constraint "cc_f1_fkey" on table "cc" +DETAIL: Key (f1)=(13) is still referenced from table "cc". +drop table pp, cc; +-- +-- Test interaction of foreign-key optimization with rules (bug #14219) +-- +create temp table t1 (a integer primary key, b text); +create temp table t2 (a integer primary key, b integer references t1); +create rule r1 as on delete to t1 do delete from t2 where t2.b = old.a; +explain (costs off) delete from t1 where a = 1; + QUERY PLAN +-------------------------------------------- + Delete on t2 + -> Nested Loop + -> Index Scan using t1_pkey on t1 + Index Cond: (a = 1) + -> Seq Scan on t2 + Filter: (b = 1) + + Delete on t1 + -> Index Scan using t1_pkey on t1 + Index Cond: (a = 1) +(10 rows) + +delete from t1 where a = 1; +-- Test a primary key with attributes located in later attnum positions +-- compared to the fk attributes. +create table pktable2 (a int, b int, c int, d int, e int, primary key (d, e)); +create table fktable2 (d int, e int, foreign key (d, e) references pktable2); +insert into pktable2 values (1, 2, 3, 4, 5); +insert into fktable2 values (4, 5); +delete from pktable2; +ERROR: update or delete on table "pktable2" violates foreign key constraint "fktable2_d_e_fkey" on table "fktable2" +DETAIL: Key (d, e)=(4, 5) is still referenced from table "fktable2". +update pktable2 set d = 5; +ERROR: update or delete on table "pktable2" violates foreign key constraint "fktable2_d_e_fkey" on table "fktable2" +DETAIL: Key (d, e)=(4, 5) is still referenced from table "fktable2". +drop table pktable2, fktable2; +-- Test truncation of long foreign key names +create table pktable1 (a int primary key); +create table pktable2 (a int, b int, primary key (a, b)); +create table fktable2 ( + a int, + b int, + very_very_long_column_name_to_exceed_63_characters int, + foreign key (very_very_long_column_name_to_exceed_63_characters) references pktable1, + foreign key (a, very_very_long_column_name_to_exceed_63_characters) references pktable2, + foreign key (a, very_very_long_column_name_to_exceed_63_characters) references pktable2 +); +select conname from pg_constraint where conrelid = 'fktable2'::regclass order by conname; + conname +----------------------------------------------------------------- + fktable2_a_very_very_long_column_name_to_exceed_63_charac_fkey1 + fktable2_a_very_very_long_column_name_to_exceed_63_charact_fkey + fktable2_very_very_long_column_name_to_exceed_63_character_fkey +(3 rows) + +drop table pktable1, pktable2, fktable2; +-- +-- Test deferred FK check on a tuple deleted by a rolled-back subtransaction +-- +create table pktable2(f1 int primary key); +create table fktable2(f1 int references pktable2 deferrable initially deferred); +insert into pktable2 values(1); +begin; +insert into fktable2 values(1); +savepoint x; +delete from fktable2; +rollback to x; +commit; +begin; +insert into fktable2 values(2); +savepoint x; +delete from fktable2; +rollback to x; +commit; -- fail +ERROR: insert or update on table "fktable2" violates foreign key constraint "fktable2_f1_fkey" +DETAIL: Key (f1)=(2) is not present in table "pktable2". +-- +-- Test that we prevent dropping FK constraint with pending trigger events +-- +begin; +insert into fktable2 values(2); +alter table fktable2 drop constraint fktable2_f1_fkey; +ERROR: cannot ALTER TABLE "fktable2" because it has pending trigger events +commit; +begin; +delete from pktable2 where f1 = 1; +alter table fktable2 drop constraint fktable2_f1_fkey; +ERROR: cannot ALTER TABLE "pktable2" because it has pending trigger events +commit; +drop table pktable2, fktable2; +-- +-- Test keys that "look" different but compare as equal +-- +create table pktable2 (a float8, b float8, primary key (a, b)); +create table fktable2 (x float8, y float8, foreign key (x, y) references pktable2 (a, b) on update cascade); +insert into pktable2 values ('-0', '-0'); +insert into fktable2 values ('-0', '-0'); +select * from pktable2; + a | b +----+---- + -0 | -0 +(1 row) + +select * from fktable2; + x | y +----+---- + -0 | -0 +(1 row) + +update pktable2 set a = '0' where a = '-0'; +select * from pktable2; + a | b +---+---- + 0 | -0 +(1 row) + +-- should have updated fktable2.x +select * from fktable2; + x | y +---+---- + 0 | -0 +(1 row) + +drop table pktable2, fktable2; +-- +-- Foreign keys and partitioned tables +-- +-- Creation of a partitioned hierarchy with irregular definitions +CREATE TABLE fk_notpartitioned_pk (fdrop1 int, a int, fdrop2 int, b int, + PRIMARY KEY (a, b)); +ALTER TABLE fk_notpartitioned_pk DROP COLUMN fdrop1, DROP COLUMN fdrop2; +CREATE TABLE fk_partitioned_fk (b int, fdrop1 int, a int) PARTITION BY RANGE (a, b); +ALTER TABLE fk_partitioned_fk DROP COLUMN fdrop1; +CREATE TABLE fk_partitioned_fk_1 (fdrop1 int, fdrop2 int, a int, fdrop3 int, b int); +ALTER TABLE fk_partitioned_fk_1 DROP COLUMN fdrop1, DROP COLUMN fdrop2, DROP COLUMN fdrop3; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_1 FOR VALUES FROM (0,0) TO (1000,1000); +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk; +CREATE TABLE fk_partitioned_fk_2 (b int, fdrop1 int, fdrop2 int, a int); +ALTER TABLE fk_partitioned_fk_2 DROP COLUMN fdrop1, DROP COLUMN fdrop2; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 FOR VALUES FROM (1000,1000) TO (2000,2000); +CREATE TABLE fk_partitioned_fk_3 (fdrop1 int, fdrop2 int, fdrop3 int, fdrop4 int, b int, a int) + PARTITION BY HASH (a); +ALTER TABLE fk_partitioned_fk_3 DROP COLUMN fdrop1, DROP COLUMN fdrop2, + DROP COLUMN fdrop3, DROP COLUMN fdrop4; +CREATE TABLE fk_partitioned_fk_3_0 PARTITION OF fk_partitioned_fk_3 FOR VALUES WITH (MODULUS 5, REMAINDER 0); +CREATE TABLE fk_partitioned_fk_3_1 PARTITION OF fk_partitioned_fk_3 FOR VALUES WITH (MODULUS 5, REMAINDER 1); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_3 + FOR VALUES FROM (2000,2000) TO (3000,3000); +-- Creating a foreign key with ONLY on a partitioned table referencing +-- a non-partitioned table fails. +ALTER TABLE ONLY fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk; +ERROR: cannot use ONLY for foreign key on partitioned table "fk_partitioned_fk" referencing relation "fk_notpartitioned_pk" +-- Adding a NOT VALID foreign key on a partitioned table referencing +-- a non-partitioned table fails. +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk NOT VALID; +ERROR: cannot add NOT VALID foreign key on partitioned table "fk_partitioned_fk" referencing relation "fk_notpartitioned_pk" +DETAIL: This feature is not yet supported on partitioned tables. +-- these inserts, targeting both the partition directly as well as the +-- partitioned table, should all fail +INSERT INTO fk_partitioned_fk (a,b) VALUES (500, 501); +ERROR: insert or update on table "fk_partitioned_fk_1" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(500, 501) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_partitioned_fk_1 (a,b) VALUES (500, 501); +ERROR: insert or update on table "fk_partitioned_fk_1" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(500, 501) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_partitioned_fk (a,b) VALUES (1500, 1501); +ERROR: insert or update on table "fk_partitioned_fk_2" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(1500, 1501) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_partitioned_fk_2 (a,b) VALUES (1500, 1501); +ERROR: insert or update on table "fk_partitioned_fk_2" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(1500, 1501) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_partitioned_fk (a,b) VALUES (2500, 2502); +ERROR: insert or update on table "fk_partitioned_fk_3_1" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2500, 2502) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_partitioned_fk_3 (a,b) VALUES (2500, 2502); +ERROR: insert or update on table "fk_partitioned_fk_3_1" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2500, 2502) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_partitioned_fk (a,b) VALUES (2501, 2503); +ERROR: insert or update on table "fk_partitioned_fk_3_0" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2501, 2503) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_partitioned_fk_3 (a,b) VALUES (2501, 2503); +ERROR: insert or update on table "fk_partitioned_fk_3_0" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2501, 2503) is not present in table "fk_notpartitioned_pk". +-- but if we insert the values that make them valid, then they work +INSERT INTO fk_notpartitioned_pk VALUES (500, 501), (1500, 1501), + (2500, 2502), (2501, 2503); +INSERT INTO fk_partitioned_fk (a,b) VALUES (500, 501); +INSERT INTO fk_partitioned_fk (a,b) VALUES (1500, 1501); +INSERT INTO fk_partitioned_fk (a,b) VALUES (2500, 2502); +INSERT INTO fk_partitioned_fk (a,b) VALUES (2501, 2503); +-- this update fails because there is no referenced row +UPDATE fk_partitioned_fk SET a = a + 1 WHERE a = 2501; +ERROR: insert or update on table "fk_partitioned_fk_3_1" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2502, 2503) is not present in table "fk_notpartitioned_pk". +-- but we can fix it thusly: +INSERT INTO fk_notpartitioned_pk (a,b) VALUES (2502, 2503); +UPDATE fk_partitioned_fk SET a = a + 1 WHERE a = 2501; +-- these updates would leave lingering rows in the referencing table; disallow +UPDATE fk_notpartitioned_pk SET b = 502 WHERE a = 500; +ERROR: update or delete on table "fk_notpartitioned_pk" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" on table "fk_partitioned_fk" +DETAIL: Key (a, b)=(500, 501) is still referenced from table "fk_partitioned_fk". +UPDATE fk_notpartitioned_pk SET b = 1502 WHERE a = 1500; +ERROR: update or delete on table "fk_notpartitioned_pk" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" on table "fk_partitioned_fk" +DETAIL: Key (a, b)=(1500, 1501) is still referenced from table "fk_partitioned_fk". +UPDATE fk_notpartitioned_pk SET b = 2504 WHERE a = 2500; +ERROR: update or delete on table "fk_notpartitioned_pk" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" on table "fk_partitioned_fk" +DETAIL: Key (a, b)=(2500, 2502) is still referenced from table "fk_partitioned_fk". +-- check psql behavior +\d fk_notpartitioned_pk + Table "public.fk_notpartitioned_pk" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | + b | integer | | not null | +Indexes: + "fk_notpartitioned_pk_pkey" PRIMARY KEY, btree (a, b) +Referenced by: + TABLE "fk_partitioned_fk" CONSTRAINT "fk_partitioned_fk_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) + +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +-- done. +DROP TABLE fk_notpartitioned_pk, fk_partitioned_fk; +-- Altering a type referenced by a foreign key needs to drop/recreate the FK. +-- Ensure that works. +CREATE TABLE fk_notpartitioned_pk (a INT, PRIMARY KEY(a), CHECK (a > 0)); +CREATE TABLE fk_partitioned_fk (a INT REFERENCES fk_notpartitioned_pk(a) PRIMARY KEY) PARTITION BY RANGE(a); +CREATE TABLE fk_partitioned_fk_1 PARTITION OF fk_partitioned_fk FOR VALUES FROM (MINVALUE) TO (MAXVALUE); +INSERT INTO fk_notpartitioned_pk VALUES (1); +INSERT INTO fk_partitioned_fk VALUES (1); +ALTER TABLE fk_notpartitioned_pk ALTER COLUMN a TYPE bigint; +DELETE FROM fk_notpartitioned_pk WHERE a = 1; +ERROR: update or delete on table "fk_notpartitioned_pk" violates foreign key constraint "fk_partitioned_fk_a_fkey" on table "fk_partitioned_fk" +DETAIL: Key (a)=(1) is still referenced from table "fk_partitioned_fk". +DROP TABLE fk_notpartitioned_pk, fk_partitioned_fk; +-- Test some other exotic foreign key features: MATCH SIMPLE, ON UPDATE/DELETE +-- actions +CREATE TABLE fk_notpartitioned_pk (a int, b int, primary key (a, b)); +CREATE TABLE fk_partitioned_fk (a int default 2501, b int default 142857) PARTITION BY LIST (a); +CREATE TABLE fk_partitioned_fk_1 PARTITION OF fk_partitioned_fk FOR VALUES IN (NULL,500,501,502); +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk MATCH SIMPLE + ON DELETE SET NULL ON UPDATE SET NULL; +CREATE TABLE fk_partitioned_fk_2 PARTITION OF fk_partitioned_fk FOR VALUES IN (1500,1502); +CREATE TABLE fk_partitioned_fk_3 (a int, b int); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_3 FOR VALUES IN (2500,2501,2502,2503); +-- this insert fails +INSERT INTO fk_partitioned_fk (a, b) VALUES (2502, 2503); +ERROR: insert or update on table "fk_partitioned_fk_3" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2502, 2503) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_partitioned_fk_3 (a, b) VALUES (2502, 2503); +ERROR: insert or update on table "fk_partitioned_fk_3" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2502, 2503) is not present in table "fk_notpartitioned_pk". +-- but since the FK is MATCH SIMPLE, this one doesn't +INSERT INTO fk_partitioned_fk_3 (a, b) VALUES (2502, NULL); +-- now create the referenced row ... +INSERT INTO fk_notpartitioned_pk VALUES (2502, 2503); +--- and now the same insert work +INSERT INTO fk_partitioned_fk_3 (a, b) VALUES (2502, 2503); +-- this always works +INSERT INTO fk_partitioned_fk (a,b) VALUES (NULL, NULL); +-- MATCH FULL +INSERT INTO fk_notpartitioned_pk VALUES (1, 2); +CREATE TABLE fk_partitioned_fk_full (x int, y int) PARTITION BY RANGE (x); +CREATE TABLE fk_partitioned_fk_full_1 PARTITION OF fk_partitioned_fk_full DEFAULT; +INSERT INTO fk_partitioned_fk_full VALUES (1, NULL); +ALTER TABLE fk_partitioned_fk_full ADD FOREIGN KEY (x, y) REFERENCES fk_notpartitioned_pk MATCH FULL; -- fails +ERROR: insert or update on table "fk_partitioned_fk_full_1" violates foreign key constraint "fk_partitioned_fk_full_x_y_fkey" +DETAIL: MATCH FULL does not allow mixing of null and nonnull key values. +TRUNCATE fk_partitioned_fk_full; +ALTER TABLE fk_partitioned_fk_full ADD FOREIGN KEY (x, y) REFERENCES fk_notpartitioned_pk MATCH FULL; +INSERT INTO fk_partitioned_fk_full VALUES (1, NULL); -- fails +ERROR: insert or update on table "fk_partitioned_fk_full_1" violates foreign key constraint "fk_partitioned_fk_full_x_y_fkey" +DETAIL: MATCH FULL does not allow mixing of null and nonnull key values. +DROP TABLE fk_partitioned_fk_full; +-- ON UPDATE SET NULL +SELECT tableoid::regclass, a, b FROM fk_partitioned_fk WHERE b IS NULL ORDER BY a; + tableoid | a | b +---------------------+------+--- + fk_partitioned_fk_3 | 2502 | + fk_partitioned_fk_1 | | +(2 rows) + +UPDATE fk_notpartitioned_pk SET a = a + 1 WHERE a = 2502; +SELECT tableoid::regclass, a, b FROM fk_partitioned_fk WHERE b IS NULL ORDER BY a; + tableoid | a | b +---------------------+------+--- + fk_partitioned_fk_3 | 2502 | + fk_partitioned_fk_1 | | + fk_partitioned_fk_1 | | +(3 rows) + +-- ON DELETE SET NULL +INSERT INTO fk_partitioned_fk VALUES (2503, 2503); +SELECT count(*) FROM fk_partitioned_fk WHERE a IS NULL; + count +------- + 2 +(1 row) + +DELETE FROM fk_notpartitioned_pk; +SELECT count(*) FROM fk_partitioned_fk WHERE a IS NULL; + count +------- + 3 +(1 row) + +-- ON UPDATE/DELETE SET DEFAULT +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk + ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; +INSERT INTO fk_notpartitioned_pk VALUES (2502, 2503); +INSERT INTO fk_partitioned_fk_3 (a, b) VALUES (2502, 2503); +-- this fails, because the defaults for the referencing table are not present +-- in the referenced table: +UPDATE fk_notpartitioned_pk SET a = 1500 WHERE a = 2502; +ERROR: insert or update on table "fk_partitioned_fk_3" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2501, 142857) is not present in table "fk_notpartitioned_pk". +-- but inserting the row we can make it work: +INSERT INTO fk_notpartitioned_pk VALUES (2501, 142857); +UPDATE fk_notpartitioned_pk SET a = 1500 WHERE a = 2502; +SELECT * FROM fk_partitioned_fk WHERE b = 142857; + a | b +------+-------- + 2501 | 142857 +(1 row) + +-- ON UPDATE/DELETE CASCADE +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk + ON DELETE CASCADE ON UPDATE CASCADE; +UPDATE fk_notpartitioned_pk SET a = 2502 WHERE a = 2501; +SELECT * FROM fk_partitioned_fk WHERE b = 142857; + a | b +------+-------- + 2502 | 142857 +(1 row) + +-- Now you see it ... +SELECT * FROM fk_partitioned_fk WHERE b = 142857; + a | b +------+-------- + 2502 | 142857 +(1 row) + +DELETE FROM fk_notpartitioned_pk WHERE b = 142857; +-- now you don't. +SELECT * FROM fk_partitioned_fk WHERE a = 142857; + a | b +---+--- +(0 rows) + +-- verify that DROP works +DROP TABLE fk_partitioned_fk_2; +-- Test behavior of the constraint together with attaching and detaching +-- partitions. +CREATE TABLE fk_partitioned_fk_2 PARTITION OF fk_partitioned_fk FOR VALUES IN (1500,1502); +ALTER TABLE fk_partitioned_fk DETACH PARTITION fk_partitioned_fk_2; +BEGIN; +DROP TABLE fk_partitioned_fk; +-- constraint should still be there +\d fk_partitioned_fk_2; + Table "public.fk_partitioned_fk_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | 2501 + b | integer | | | 142857 +Foreign-key constraints: + "fk_partitioned_fk_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE + +ROLLBACK; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 FOR VALUES IN (1500,1502); +DROP TABLE fk_partitioned_fk_2; +CREATE TABLE fk_partitioned_fk_2 (b int, c text, a int, + FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk ON UPDATE CASCADE ON DELETE CASCADE); +ALTER TABLE fk_partitioned_fk_2 DROP COLUMN c; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 FOR VALUES IN (1500,1502); +-- should have only one constraint +\d fk_partitioned_fk_2 + Table "public.fk_partitioned_fk_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + b | integer | | | + a | integer | | | +Partition of: fk_partitioned_fk FOR VALUES IN (1500, 1502) +Foreign-key constraints: + TABLE "fk_partitioned_fk" CONSTRAINT "fk_partitioned_fk_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE + +DROP TABLE fk_partitioned_fk_2; +CREATE TABLE fk_partitioned_fk_4 (a int, b int, FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE) PARTITION BY RANGE (b, a); +CREATE TABLE fk_partitioned_fk_4_1 PARTITION OF fk_partitioned_fk_4 FOR VALUES FROM (1,1) TO (100,100); +CREATE TABLE fk_partitioned_fk_4_2 (a int, b int, FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE SET NULL); +ALTER TABLE fk_partitioned_fk_4 ATTACH PARTITION fk_partitioned_fk_4_2 FOR VALUES FROM (100,100) TO (1000,1000); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_4 FOR VALUES IN (3500,3502); +ALTER TABLE fk_partitioned_fk DETACH PARTITION fk_partitioned_fk_4; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_4 FOR VALUES IN (3500,3502); +-- should only have one constraint +\d fk_partitioned_fk_4 + Partitioned table "public.fk_partitioned_fk_4" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: fk_partitioned_fk FOR VALUES IN (3500, 3502) +Partition key: RANGE (b, a) +Foreign-key constraints: + TABLE "fk_partitioned_fk" CONSTRAINT "fk_partitioned_fk_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE +Number of partitions: 2 (Use \d+ to list them.) + +\d fk_partitioned_fk_4_1 + Table "public.fk_partitioned_fk_4_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: fk_partitioned_fk_4 FOR VALUES FROM (1, 1) TO (100, 100) +Foreign-key constraints: + TABLE "fk_partitioned_fk" CONSTRAINT "fk_partitioned_fk_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE + +-- this one has an FK with mismatched properties +\d fk_partitioned_fk_4_2 + Table "public.fk_partitioned_fk_4_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: fk_partitioned_fk_4 FOR VALUES FROM (100, 100) TO (1000, 1000) +Foreign-key constraints: + "fk_partitioned_fk_4_2_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE SET NULL + TABLE "fk_partitioned_fk" CONSTRAINT "fk_partitioned_fk_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE + +CREATE TABLE fk_partitioned_fk_5 (a int, b int, + FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, + FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) MATCH FULL ON UPDATE CASCADE ON DELETE CASCADE) + PARTITION BY RANGE (a); +CREATE TABLE fk_partitioned_fk_5_1 (a int, b int, FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_5 FOR VALUES IN (4500); +ALTER TABLE fk_partitioned_fk_5 ATTACH PARTITION fk_partitioned_fk_5_1 FOR VALUES FROM (0) TO (10); +ALTER TABLE fk_partitioned_fk DETACH PARTITION fk_partitioned_fk_5; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_5 FOR VALUES IN (4500); +-- this one has two constraints, similar but not quite the one in the parent, +-- so it gets a new one +\d fk_partitioned_fk_5 + Partitioned table "public.fk_partitioned_fk_5" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: fk_partitioned_fk FOR VALUES IN (4500) +Partition key: RANGE (a) +Foreign-key constraints: + "fk_partitioned_fk_5_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE + "fk_partitioned_fk_5_a_b_fkey1" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) MATCH FULL ON UPDATE CASCADE ON DELETE CASCADE + TABLE "fk_partitioned_fk" CONSTRAINT "fk_partitioned_fk_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE +Number of partitions: 1 (Use \d+ to list them.) + +-- verify that it works to reattaching a child with multiple candidate +-- constraints +ALTER TABLE fk_partitioned_fk_5 DETACH PARTITION fk_partitioned_fk_5_1; +ALTER TABLE fk_partitioned_fk_5 ATTACH PARTITION fk_partitioned_fk_5_1 FOR VALUES FROM (0) TO (10); +\d fk_partitioned_fk_5_1 + Table "public.fk_partitioned_fk_5_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: fk_partitioned_fk_5 FOR VALUES FROM (0) TO (10) +Foreign-key constraints: + "fk_partitioned_fk_5_1_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) + TABLE "fk_partitioned_fk_5" CONSTRAINT "fk_partitioned_fk_5_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE + TABLE "fk_partitioned_fk_5" CONSTRAINT "fk_partitioned_fk_5_a_b_fkey1" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) MATCH FULL ON UPDATE CASCADE ON DELETE CASCADE + TABLE "fk_partitioned_fk" CONSTRAINT "fk_partitioned_fk_a_b_fkey" FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE + +-- verify that attaching a table checks that the existing data satisfies the +-- constraint +CREATE TABLE fk_partitioned_fk_2 (a int, b int) PARTITION BY RANGE (b); +CREATE TABLE fk_partitioned_fk_2_1 PARTITION OF fk_partitioned_fk_2 FOR VALUES FROM (0) TO (1000); +CREATE TABLE fk_partitioned_fk_2_2 PARTITION OF fk_partitioned_fk_2 FOR VALUES FROM (1000) TO (2000); +INSERT INTO fk_partitioned_fk_2 VALUES (1600, 601), (1600, 1601); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 + FOR VALUES IN (1600); +ERROR: insert or update on table "fk_partitioned_fk_2_1" violates foreign key constraint "fk_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(1600, 601) is not present in table "fk_notpartitioned_pk". +INSERT INTO fk_notpartitioned_pk VALUES (1600, 601), (1600, 1601); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 + FOR VALUES IN (1600); +-- leave these tables around intentionally +-- test the case when the referenced table is owned by a different user +create role regress_other_partitioned_fk_owner; +grant references on fk_notpartitioned_pk to regress_other_partitioned_fk_owner; +set role regress_other_partitioned_fk_owner; +create table other_partitioned_fk(a int, b int) partition by list (a); +create table other_partitioned_fk_1 partition of other_partitioned_fk + for values in (2048); +insert into other_partitioned_fk + select 2048, x from generate_series(1,10) x; +-- this should fail +alter table other_partitioned_fk add foreign key (a, b) + references fk_notpartitioned_pk(a, b); +ERROR: insert or update on table "other_partitioned_fk_1" violates foreign key constraint "other_partitioned_fk_a_b_fkey" +DETAIL: Key (a, b)=(2048, 1) is not present in table "fk_notpartitioned_pk". +-- add the missing keys and retry +reset role; +insert into fk_notpartitioned_pk (a, b) + select 2048, x from generate_series(1,10) x; +set role regress_other_partitioned_fk_owner; +alter table other_partitioned_fk add foreign key (a, b) + references fk_notpartitioned_pk(a, b); +-- clean up +drop table other_partitioned_fk; +reset role; +revoke all on fk_notpartitioned_pk from regress_other_partitioned_fk_owner; +drop role regress_other_partitioned_fk_owner; +-- Test creating a constraint at the parent that already exists in partitions. +-- There should be no duplicated constraints, and attempts to drop the +-- constraint in partitions should raise appropriate errors. +create schema fkpart0 + create table pkey (a int primary key) + create table fk_part (a int) partition by list (a) + create table fk_part_1 partition of fk_part + (foreign key (a) references fkpart0.pkey) for values in (1) + create table fk_part_23 partition of fk_part + (foreign key (a) references fkpart0.pkey) for values in (2, 3) + partition by list (a) + create table fk_part_23_2 partition of fk_part_23 for values in (2); +alter table fkpart0.fk_part add foreign key (a) references fkpart0.pkey; +\d fkpart0.fk_part_1 \\ -- should have only one FK + Table "fkpart0.fk_part_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: fkpart0.fk_part FOR VALUES IN (1) +Foreign-key constraints: + TABLE "fkpart0.fk_part" CONSTRAINT "fk_part_a_fkey" FOREIGN KEY (a) REFERENCES fkpart0.pkey(a) + +alter table fkpart0.fk_part_1 drop constraint fk_part_1_a_fkey; +ERROR: cannot drop inherited constraint "fk_part_1_a_fkey" of relation "fk_part_1" +\d fkpart0.fk_part_23 \\ -- should have only one FK + Partitioned table "fkpart0.fk_part_23" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: fkpart0.fk_part FOR VALUES IN (2, 3) +Partition key: LIST (a) +Foreign-key constraints: + TABLE "fkpart0.fk_part" CONSTRAINT "fk_part_a_fkey" FOREIGN KEY (a) REFERENCES fkpart0.pkey(a) +Number of partitions: 1 (Use \d+ to list them.) + +\d fkpart0.fk_part_23_2 \\ -- should have only one FK + Table "fkpart0.fk_part_23_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: fkpart0.fk_part_23 FOR VALUES IN (2) +Foreign-key constraints: + TABLE "fkpart0.fk_part" CONSTRAINT "fk_part_a_fkey" FOREIGN KEY (a) REFERENCES fkpart0.pkey(a) + +alter table fkpart0.fk_part_23 drop constraint fk_part_23_a_fkey; +ERROR: cannot drop inherited constraint "fk_part_23_a_fkey" of relation "fk_part_23" +alter table fkpart0.fk_part_23_2 drop constraint fk_part_23_a_fkey; +ERROR: cannot drop inherited constraint "fk_part_23_a_fkey" of relation "fk_part_23_2" +create table fkpart0.fk_part_4 partition of fkpart0.fk_part for values in (4); +\d fkpart0.fk_part_4 + Table "fkpart0.fk_part_4" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: fkpart0.fk_part FOR VALUES IN (4) +Foreign-key constraints: + TABLE "fkpart0.fk_part" CONSTRAINT "fk_part_a_fkey" FOREIGN KEY (a) REFERENCES fkpart0.pkey(a) + +alter table fkpart0.fk_part_4 drop constraint fk_part_a_fkey; +ERROR: cannot drop inherited constraint "fk_part_a_fkey" of relation "fk_part_4" +create table fkpart0.fk_part_56 partition of fkpart0.fk_part + for values in (5,6) partition by list (a); +create table fkpart0.fk_part_56_5 partition of fkpart0.fk_part_56 + for values in (5); +\d fkpart0.fk_part_56 + Partitioned table "fkpart0.fk_part_56" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: fkpart0.fk_part FOR VALUES IN (5, 6) +Partition key: LIST (a) +Foreign-key constraints: + TABLE "fkpart0.fk_part" CONSTRAINT "fk_part_a_fkey" FOREIGN KEY (a) REFERENCES fkpart0.pkey(a) +Number of partitions: 1 (Use \d+ to list them.) + +alter table fkpart0.fk_part_56 drop constraint fk_part_a_fkey; +ERROR: cannot drop inherited constraint "fk_part_a_fkey" of relation "fk_part_56" +alter table fkpart0.fk_part_56_5 drop constraint fk_part_a_fkey; +ERROR: cannot drop inherited constraint "fk_part_a_fkey" of relation "fk_part_56_5" +-- verify that attaching and detaching partitions maintains the right set of +-- triggers +create schema fkpart1 + create table pkey (a int primary key) + create table fk_part (a int) partition by list (a) + create table fk_part_1 partition of fk_part for values in (1) partition by list (a) + create table fk_part_1_1 partition of fk_part_1 for values in (1); +alter table fkpart1.fk_part add foreign key (a) references fkpart1.pkey; +insert into fkpart1.fk_part values (1); -- should fail +ERROR: insert or update on table "fk_part_1_1" violates foreign key constraint "fk_part_a_fkey" +DETAIL: Key (a)=(1) is not present in table "pkey". +insert into fkpart1.pkey values (1); +insert into fkpart1.fk_part values (1); +delete from fkpart1.pkey where a = 1; -- should fail +ERROR: update or delete on table "pkey" violates foreign key constraint "fk_part_a_fkey" on table "fk_part" +DETAIL: Key (a)=(1) is still referenced from table "fk_part". +alter table fkpart1.fk_part detach partition fkpart1.fk_part_1; +create table fkpart1.fk_part_1_2 partition of fkpart1.fk_part_1 for values in (2); +insert into fkpart1.fk_part_1 values (2); -- should fail +ERROR: insert or update on table "fk_part_1_2" violates foreign key constraint "fk_part_a_fkey" +DETAIL: Key (a)=(2) is not present in table "pkey". +delete from fkpart1.pkey where a = 1; +ERROR: update or delete on table "pkey" violates foreign key constraint "fk_part_a_fkey" on table "fk_part_1" +DETAIL: Key (a)=(1) is still referenced from table "fk_part_1". +-- verify that attaching and detaching partitions manipulates the inheritance +-- properties of their FK constraints correctly +create schema fkpart2 + create table pkey (a int primary key) + create table fk_part (a int, constraint fkey foreign key (a) references fkpart2.pkey) partition by list (a) + create table fk_part_1 partition of fkpart2.fk_part for values in (1) partition by list (a) + create table fk_part_1_1 (a int, constraint my_fkey foreign key (a) references fkpart2.pkey); +alter table fkpart2.fk_part_1 attach partition fkpart2.fk_part_1_1 for values in (1); +alter table fkpart2.fk_part_1 drop constraint fkey; -- should fail +ERROR: cannot drop inherited constraint "fkey" of relation "fk_part_1" +alter table fkpart2.fk_part_1_1 drop constraint my_fkey; -- should fail +ERROR: cannot drop inherited constraint "my_fkey" of relation "fk_part_1_1" +alter table fkpart2.fk_part detach partition fkpart2.fk_part_1; +alter table fkpart2.fk_part_1 drop constraint fkey; -- ok +alter table fkpart2.fk_part_1_1 drop constraint my_fkey; -- doesn't exist +ERROR: constraint "my_fkey" of relation "fk_part_1_1" does not exist +-- verify constraint deferrability +create schema fkpart3 + create table pkey (a int primary key) + create table fk_part (a int, constraint fkey foreign key (a) references fkpart3.pkey deferrable initially immediate) partition by list (a) + create table fk_part_1 partition of fkpart3.fk_part for values in (1) partition by list (a) + create table fk_part_1_1 partition of fkpart3.fk_part_1 for values in (1) + create table fk_part_2 partition of fkpart3.fk_part for values in (2); +begin; +set constraints fkpart3.fkey deferred; +insert into fkpart3.fk_part values (1); +insert into fkpart3.pkey values (1); +commit; +begin; +set constraints fkpart3.fkey deferred; +delete from fkpart3.pkey; +delete from fkpart3.fk_part; +commit; +drop schema fkpart0, fkpart1, fkpart2, fkpart3 cascade; +NOTICE: drop cascades to 10 other objects +DETAIL: drop cascades to table fkpart3.pkey +drop cascades to table fkpart3.fk_part +drop cascades to table fkpart2.pkey +drop cascades to table fkpart2.fk_part +drop cascades to table fkpart2.fk_part_1 +drop cascades to table fkpart1.pkey +drop cascades to table fkpart1.fk_part +drop cascades to table fkpart1.fk_part_1 +drop cascades to table fkpart0.pkey +drop cascades to table fkpart0.fk_part +-- Test a partitioned table as referenced table. +-- Verify basic functionality with a regular partition creation and a partition +-- with a different column layout, as well as partitions added (created and +-- attached) after creating the foreign key. +CREATE SCHEMA fkpart3; +SET search_path TO fkpart3; +CREATE TABLE pk (a int PRIMARY KEY) PARTITION BY RANGE (a); +CREATE TABLE pk1 PARTITION OF pk FOR VALUES FROM (0) TO (1000); +CREATE TABLE pk2 (b int, a int); +ALTER TABLE pk2 DROP COLUMN b; +ALTER TABLE pk2 ALTER a SET NOT NULL; +ALTER TABLE pk ATTACH PARTITION pk2 FOR VALUES FROM (1000) TO (2000); +CREATE TABLE fk (a int) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (0) TO (750); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk; +CREATE TABLE fk2 (b int, a int) ; +ALTER TABLE fk2 DROP COLUMN b; +ALTER TABLE fk ATTACH PARTITION fk2 FOR VALUES FROM (750) TO (3500); +CREATE TABLE pk3 PARTITION OF pk FOR VALUES FROM (2000) TO (3000); +CREATE TABLE pk4 (LIKE pk); +ALTER TABLE pk ATTACH PARTITION pk4 FOR VALUES FROM (3000) TO (4000); +CREATE TABLE pk5 (c int, b int, a int NOT NULL) PARTITION BY RANGE (a); +ALTER TABLE pk5 DROP COLUMN b, DROP COLUMN c; +CREATE TABLE pk51 PARTITION OF pk5 FOR VALUES FROM (4000) TO (4500); +CREATE TABLE pk52 PARTITION OF pk5 FOR VALUES FROM (4500) TO (5000); +ALTER TABLE pk ATTACH PARTITION pk5 FOR VALUES FROM (4000) TO (5000); +CREATE TABLE fk3 PARTITION OF fk FOR VALUES FROM (3500) TO (5000); +-- these should fail: referenced value not present +INSERT into fk VALUES (1); +ERROR: insert or update on table "fk1" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(1) is not present in table "pk". +INSERT into fk VALUES (1000); +ERROR: insert or update on table "fk2" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(1000) is not present in table "pk". +INSERT into fk VALUES (2000); +ERROR: insert or update on table "fk2" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(2000) is not present in table "pk". +INSERT into fk VALUES (3000); +ERROR: insert or update on table "fk2" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(3000) is not present in table "pk". +INSERT into fk VALUES (4000); +ERROR: insert or update on table "fk3" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(4000) is not present in table "pk". +INSERT into fk VALUES (4500); +ERROR: insert or update on table "fk3" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(4500) is not present in table "pk". +-- insert into the referenced table, now they should work +INSERT into pk VALUES (1), (1000), (2000), (3000), (4000), (4500); +INSERT into fk VALUES (1), (1000), (2000), (3000), (4000), (4500); +-- should fail: referencing value present +DELETE FROM pk WHERE a = 1; +ERROR: update or delete on table "pk1" violates foreign key constraint "fk_a_fkey1" on table "fk" +DETAIL: Key (a)=(1) is still referenced from table "fk". +DELETE FROM pk WHERE a = 1000; +ERROR: update or delete on table "pk2" violates foreign key constraint "fk_a_fkey2" on table "fk" +DETAIL: Key (a)=(1000) is still referenced from table "fk". +DELETE FROM pk WHERE a = 2000; +ERROR: update or delete on table "pk3" violates foreign key constraint "fk_a_fkey3" on table "fk" +DETAIL: Key (a)=(2000) is still referenced from table "fk". +DELETE FROM pk WHERE a = 3000; +ERROR: update or delete on table "pk4" violates foreign key constraint "fk_a_fkey4" on table "fk" +DETAIL: Key (a)=(3000) is still referenced from table "fk". +DELETE FROM pk WHERE a = 4000; +ERROR: update or delete on table "pk51" violates foreign key constraint "fk_a_fkey6" on table "fk" +DETAIL: Key (a)=(4000) is still referenced from table "fk". +DELETE FROM pk WHERE a = 4500; +ERROR: update or delete on table "pk52" violates foreign key constraint "fk_a_fkey7" on table "fk" +DETAIL: Key (a)=(4500) is still referenced from table "fk". +UPDATE pk SET a = 2 WHERE a = 1; +ERROR: update or delete on table "pk1" violates foreign key constraint "fk_a_fkey1" on table "fk" +DETAIL: Key (a)=(1) is still referenced from table "fk". +UPDATE pk SET a = 1002 WHERE a = 1000; +ERROR: update or delete on table "pk2" violates foreign key constraint "fk_a_fkey2" on table "fk" +DETAIL: Key (a)=(1000) is still referenced from table "fk". +UPDATE pk SET a = 2002 WHERE a = 2000; +ERROR: update or delete on table "pk3" violates foreign key constraint "fk_a_fkey3" on table "fk" +DETAIL: Key (a)=(2000) is still referenced from table "fk". +UPDATE pk SET a = 3002 WHERE a = 3000; +ERROR: update or delete on table "pk4" violates foreign key constraint "fk_a_fkey4" on table "fk" +DETAIL: Key (a)=(3000) is still referenced from table "fk". +UPDATE pk SET a = 4002 WHERE a = 4000; +ERROR: update or delete on table "pk51" violates foreign key constraint "fk_a_fkey6" on table "fk" +DETAIL: Key (a)=(4000) is still referenced from table "fk". +UPDATE pk SET a = 4502 WHERE a = 4500; +ERROR: update or delete on table "pk52" violates foreign key constraint "fk_a_fkey7" on table "fk" +DETAIL: Key (a)=(4500) is still referenced from table "fk". +-- now they should work +DELETE FROM fk; +UPDATE pk SET a = 2 WHERE a = 1; +DELETE FROM pk WHERE a = 2; +UPDATE pk SET a = 1002 WHERE a = 1000; +DELETE FROM pk WHERE a = 1002; +UPDATE pk SET a = 2002 WHERE a = 2000; +DELETE FROM pk WHERE a = 2002; +UPDATE pk SET a = 3002 WHERE a = 3000; +DELETE FROM pk WHERE a = 3002; +UPDATE pk SET a = 4002 WHERE a = 4000; +DELETE FROM pk WHERE a = 4002; +UPDATE pk SET a = 4502 WHERE a = 4500; +DELETE FROM pk WHERE a = 4502; +CREATE SCHEMA fkpart4; +SET search_path TO fkpart4; +-- dropping/detaching PARTITIONs is prevented if that would break +-- a foreign key's existing data +CREATE TABLE droppk (a int PRIMARY KEY) PARTITION BY RANGE (a); +CREATE TABLE droppk1 PARTITION OF droppk FOR VALUES FROM (0) TO (1000); +CREATE TABLE droppk_d PARTITION OF droppk DEFAULT; +CREATE TABLE droppk2 PARTITION OF droppk FOR VALUES FROM (1000) TO (2000) + PARTITION BY RANGE (a); +CREATE TABLE droppk21 PARTITION OF droppk2 FOR VALUES FROM (1000) TO (1400); +CREATE TABLE droppk2_d PARTITION OF droppk2 DEFAULT; +INSERT into droppk VALUES (1), (1000), (1500), (2000); +CREATE TABLE dropfk (a int REFERENCES droppk); +INSERT into dropfk VALUES (1), (1000), (1500), (2000); +-- these should all fail +ALTER TABLE droppk DETACH PARTITION droppk_d; +ERROR: removing partition "droppk_d" violates foreign key constraint "dropfk_a_fkey5" +DETAIL: Key (a)=(2000) is still referenced from table "dropfk". +ALTER TABLE droppk2 DETACH PARTITION droppk2_d; +ERROR: removing partition "droppk2_d" violates foreign key constraint "dropfk_a_fkey4" +DETAIL: Key (a)=(1500) is still referenced from table "dropfk". +ALTER TABLE droppk DETACH PARTITION droppk1; +ERROR: removing partition "droppk1" violates foreign key constraint "dropfk_a_fkey1" +DETAIL: Key (a)=(1) is still referenced from table "dropfk". +ALTER TABLE droppk DETACH PARTITION droppk2; +ERROR: removing partition "droppk2" violates foreign key constraint "dropfk_a_fkey2" +DETAIL: Key (a)=(1000) is still referenced from table "dropfk". +ALTER TABLE droppk2 DETACH PARTITION droppk21; +ERROR: removing partition "droppk21" violates foreign key constraint "dropfk_a_fkey3" +DETAIL: Key (a)=(1000) is still referenced from table "dropfk". +-- dropping partitions is disallowed +DROP TABLE droppk_d; +ERROR: cannot drop table droppk_d because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk_d +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TABLE droppk2_d; +ERROR: cannot drop table droppk2_d because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk2_d +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TABLE droppk1; +ERROR: cannot drop table droppk1 because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk1 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TABLE droppk2; +ERROR: cannot drop table droppk2 because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk2 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TABLE droppk21; +ERROR: cannot drop table droppk21 because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk21 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DELETE FROM dropfk; +-- dropping partitions is disallowed, even when no referencing values +DROP TABLE droppk_d; +ERROR: cannot drop table droppk_d because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk_d +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TABLE droppk2_d; +ERROR: cannot drop table droppk2_d because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk2_d +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TABLE droppk1; +ERROR: cannot drop table droppk1 because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk1 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- but DETACH is allowed, and DROP afterwards works +ALTER TABLE droppk2 DETACH PARTITION droppk21; +DROP TABLE droppk2; +ERROR: cannot drop table droppk2 because other objects depend on it +DETAIL: constraint dropfk_a_fkey on table dropfk depends on table droppk2 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- Verify that initial constraint creation and cloning behave correctly +CREATE SCHEMA fkpart5; +SET search_path TO fkpart5; +CREATE TABLE pk (a int PRIMARY KEY) PARTITION BY LIST (a); +CREATE TABLE pk1 PARTITION OF pk FOR VALUES IN (1) PARTITION BY LIST (a); +CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES IN (1); +CREATE TABLE fk (a int) PARTITION BY LIST (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES IN (1) PARTITION BY LIST (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES IN (1); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk; +CREATE TABLE pk2 PARTITION OF pk FOR VALUES IN (2); +CREATE TABLE pk3 (a int NOT NULL) PARTITION BY LIST (a); +CREATE TABLE pk31 PARTITION OF pk3 FOR VALUES IN (31); +CREATE TABLE pk32 (b int, a int NOT NULL); +ALTER TABLE pk32 DROP COLUMN b; +ALTER TABLE pk3 ATTACH PARTITION pk32 FOR VALUES IN (32); +ALTER TABLE pk ATTACH PARTITION pk3 FOR VALUES IN (31, 32); +CREATE TABLE fk2 PARTITION OF fk FOR VALUES IN (2); +CREATE TABLE fk3 (b int, a int); +ALTER TABLE fk3 DROP COLUMN b; +ALTER TABLE fk ATTACH PARTITION fk3 FOR VALUES IN (3); +SELECT pg_describe_object('pg_constraint'::regclass, oid, 0), confrelid::regclass, + CASE WHEN conparentid <> 0 THEN pg_describe_object('pg_constraint'::regclass, conparentid, 0) ELSE 'TOP' END +FROM pg_catalog.pg_constraint +WHERE conrelid IN (SELECT relid FROM pg_partition_tree('fk')) +ORDER BY conrelid::regclass::text, conname; + pg_describe_object | confrelid | case +------------------------------------+-----------+----------------------------------- + constraint fk_a_fkey on table fk | pk | TOP + constraint fk_a_fkey1 on table fk | pk1 | constraint fk_a_fkey on table fk + constraint fk_a_fkey2 on table fk | pk11 | constraint fk_a_fkey1 on table fk + constraint fk_a_fkey3 on table fk | pk2 | constraint fk_a_fkey on table fk + constraint fk_a_fkey4 on table fk | pk3 | constraint fk_a_fkey on table fk + constraint fk_a_fkey5 on table fk | pk31 | constraint fk_a_fkey4 on table fk + constraint fk_a_fkey6 on table fk | pk32 | constraint fk_a_fkey4 on table fk + constraint fk_a_fkey on table fk1 | pk | constraint fk_a_fkey on table fk + constraint fk_a_fkey on table fk11 | pk | constraint fk_a_fkey on table fk1 + constraint fk_a_fkey on table fk2 | pk | constraint fk_a_fkey on table fk + constraint fk_a_fkey on table fk3 | pk | constraint fk_a_fkey on table fk +(11 rows) + +CREATE TABLE fk4 (LIKE fk); +INSERT INTO fk4 VALUES (50); +ALTER TABLE fk ATTACH PARTITION fk4 FOR VALUES IN (50); +ERROR: insert or update on table "fk4" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(50) is not present in table "pk". +-- Verify constraint deferrability +CREATE SCHEMA fkpart9; +SET search_path TO fkpart9; +CREATE TABLE pk (a int PRIMARY KEY) PARTITION BY LIST (a); +CREATE TABLE pk1 PARTITION OF pk FOR VALUES IN (1, 2) PARTITION BY LIST (a); +CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES IN (1); +CREATE TABLE pk3 PARTITION OF pk FOR VALUES IN (3); +CREATE TABLE fk (a int REFERENCES pk DEFERRABLE INITIALLY IMMEDIATE); +INSERT INTO fk VALUES (1); -- should fail +ERROR: insert or update on table "fk" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(1) is not present in table "pk". +BEGIN; +SET CONSTRAINTS fk_a_fkey DEFERRED; +INSERT INTO fk VALUES (1); +COMMIT; -- should fail +ERROR: insert or update on table "fk" violates foreign key constraint "fk_a_fkey" +DETAIL: Key (a)=(1) is not present in table "pk". +BEGIN; +SET CONSTRAINTS fk_a_fkey DEFERRED; +INSERT INTO fk VALUES (1); +INSERT INTO pk VALUES (1); +COMMIT; -- OK +BEGIN; +SET CONSTRAINTS fk_a_fkey DEFERRED; +DELETE FROM pk WHERE a = 1; +DELETE FROM fk WHERE a = 1; +COMMIT; -- OK +-- Verify constraint deferrability when changed by ALTER +-- Partitioned table at referencing end +CREATE TABLE pt(f1 int, f2 int, f3 int, PRIMARY KEY(f1,f2)); +CREATE TABLE ref(f1 int, f2 int, f3 int) + PARTITION BY list(f1); +CREATE TABLE ref1 PARTITION OF ref FOR VALUES IN (1); +CREATE TABLE ref2 PARTITION OF ref FOR VALUES in (2); +ALTER TABLE ref ADD FOREIGN KEY(f1,f2) REFERENCES pt; +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY DEFERRED; +INSERT INTO pt VALUES(1,2,3); +INSERT INTO ref VALUES(1,2,3); +BEGIN; +DELETE FROM pt; +DELETE FROM ref; +ABORT; +DROP TABLE pt, ref; +-- Multi-level partitioning at referencing end +CREATE TABLE pt(f1 int, f2 int, f3 int, PRIMARY KEY(f1,f2)); +CREATE TABLE ref(f1 int, f2 int, f3 int) + PARTITION BY list(f1); +CREATE TABLE ref1_2 PARTITION OF ref FOR VALUES IN (1, 2) PARTITION BY list (f2); +CREATE TABLE ref1 PARTITION OF ref1_2 FOR VALUES IN (1); +CREATE TABLE ref2 PARTITION OF ref1_2 FOR VALUES IN (2) PARTITION BY list (f2); +CREATE TABLE ref22 PARTITION OF ref2 FOR VALUES IN (2); +ALTER TABLE ref ADD FOREIGN KEY(f1,f2) REFERENCES pt; +INSERT INTO pt VALUES(1,2,3); +INSERT INTO ref VALUES(1,2,3); +ALTER TABLE ref22 ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY IMMEDIATE; -- fails +ERROR: cannot alter constraint "ref_f1_f2_fkey" on relation "ref22" +DETAIL: Constraint "ref_f1_f2_fkey" is derived from constraint "ref_f1_f2_fkey" of relation "ref". +HINT: You may alter the constraint it derives from, instead. +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY DEFERRED; +BEGIN; +DELETE FROM pt; +DELETE FROM ref; +ABORT; +DROP TABLE pt, ref; +-- Partitioned table at referenced end +CREATE TABLE pt(f1 int, f2 int, f3 int, PRIMARY KEY(f1,f2)) + PARTITION BY LIST(f1); +CREATE TABLE pt1 PARTITION OF pt FOR VALUES IN (1); +CREATE TABLE pt2 PARTITION OF pt FOR VALUES IN (2); +CREATE TABLE ref(f1 int, f2 int, f3 int); +ALTER TABLE ref ADD FOREIGN KEY(f1,f2) REFERENCES pt; +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY DEFERRED; +INSERT INTO pt VALUES(1,2,3); +INSERT INTO ref VALUES(1,2,3); +BEGIN; +DELETE FROM pt; +DELETE FROM ref; +ABORT; +DROP TABLE pt, ref; +-- Multi-level partitioning at at referenced end +CREATE TABLE pt(f1 int, f2 int, f3 int, PRIMARY KEY(f1,f2)) + PARTITION BY LIST(f1); +CREATE TABLE pt1_2 PARTITION OF pt FOR VALUES IN (1, 2) PARTITION BY LIST (f1); +CREATE TABLE pt1 PARTITION OF pt1_2 FOR VALUES IN (1); +CREATE TABLE pt2 PARTITION OF pt1_2 FOR VALUES IN (2); +CREATE TABLE ref(f1 int, f2 int, f3 int); +ALTER TABLE ref ADD FOREIGN KEY(f1,f2) REFERENCES pt; +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey1 + DEFERRABLE INITIALLY DEFERRED; -- fails +ERROR: cannot alter constraint "ref_f1_f2_fkey1" on relation "ref" +DETAIL: Constraint "ref_f1_f2_fkey1" is derived from constraint "ref_f1_f2_fkey" of relation "ref". +HINT: You may alter the constraint it derives from, instead. +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY DEFERRED; +INSERT INTO pt VALUES(1,2,3); +INSERT INTO ref VALUES(1,2,3); +BEGIN; +DELETE FROM pt; +DELETE FROM ref; +ABORT; +DROP TABLE pt, ref; +DROP SCHEMA fkpart9 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table pk +drop cascades to table fk +-- Verify ON UPDATE/DELETE behavior +CREATE SCHEMA fkpart6; +SET search_path TO fkpart6; +CREATE TABLE pk (a int PRIMARY KEY) PARTITION BY RANGE (a); +CREATE TABLE pk1 PARTITION OF pk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES FROM (1) TO (50); +CREATE TABLE pk12 PARTITION OF pk1 FOR VALUES FROM (50) TO (100); +CREATE TABLE fk (a int) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES FROM (1) TO (10); +CREATE TABLE fk12 PARTITION OF fk1 FOR VALUES FROM (10) TO (100); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk ON UPDATE CASCADE ON DELETE CASCADE; +CREATE TABLE fk_d PARTITION OF fk DEFAULT; +INSERT INTO pk VALUES (1); +INSERT INTO fk VALUES (1); +UPDATE pk SET a = 20; +SELECT tableoid::regclass, * FROM fk; + tableoid | a +----------+---- + fk12 | 20 +(1 row) + +DELETE FROM pk WHERE a = 20; +SELECT tableoid::regclass, * FROM fk; + tableoid | a +----------+--- +(0 rows) + +DROP TABLE fk; +TRUNCATE TABLE pk; +INSERT INTO pk VALUES (20), (50); +CREATE TABLE fk (a int) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES FROM (1) TO (10); +CREATE TABLE fk12 PARTITION OF fk1 FOR VALUES FROM (10) TO (100); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk ON UPDATE SET NULL ON DELETE SET NULL; +CREATE TABLE fk_d PARTITION OF fk DEFAULT; +INSERT INTO fk VALUES (20), (50); +UPDATE pk SET a = 21 WHERE a = 20; +DELETE FROM pk WHERE a = 50; +SELECT tableoid::regclass, * FROM fk; + tableoid | a +----------+--- + fk_d | + fk_d | +(2 rows) + +DROP TABLE fk; +TRUNCATE TABLE pk; +INSERT INTO pk VALUES (20), (30), (50); +CREATE TABLE fk (id int, a int DEFAULT 50) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES FROM (1) TO (10); +CREATE TABLE fk12 PARTITION OF fk1 FOR VALUES FROM (10) TO (100); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk ON UPDATE SET DEFAULT ON DELETE SET DEFAULT; +CREATE TABLE fk_d PARTITION OF fk DEFAULT; +INSERT INTO fk VALUES (1, 20), (2, 30); +DELETE FROM pk WHERE a = 20 RETURNING *; + a +---- + 20 +(1 row) + +UPDATE pk SET a = 90 WHERE a = 30 RETURNING *; + a +---- + 90 +(1 row) + +SELECT tableoid::regclass, * FROM fk; + tableoid | id | a +----------+----+---- + fk12 | 1 | 50 + fk12 | 2 | 50 +(2 rows) + +DROP TABLE fk; +TRUNCATE TABLE pk; +INSERT INTO pk VALUES (20), (30); +CREATE TABLE fk (a int DEFAULT 50) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES FROM (1) TO (10); +CREATE TABLE fk12 PARTITION OF fk1 FOR VALUES FROM (10) TO (100); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk ON UPDATE RESTRICT ON DELETE RESTRICT; +CREATE TABLE fk_d PARTITION OF fk DEFAULT; +INSERT INTO fk VALUES (20), (30); +DELETE FROM pk WHERE a = 20; +ERROR: update or delete on table "pk11" violates foreign key constraint "fk_a_fkey2" on table "fk" +DETAIL: Key (a)=(20) is still referenced from table "fk". +UPDATE pk SET a = 90 WHERE a = 30; +ERROR: update or delete on table "pk11" violates foreign key constraint "fk_a_fkey2" on table "fk" +DETAIL: Key (a)=(30) is still referenced from table "fk". +SELECT tableoid::regclass, * FROM fk; + tableoid | a +----------+---- + fk12 | 20 + fk12 | 30 +(2 rows) + +DROP TABLE fk; +-- test for reported bug: relispartition not set +-- https://postgr.es/m/CA+HiwqHMsRtRYRWYTWavKJ8x14AFsv7bmAV46mYwnfD3vy8goQ@mail.gmail.com +CREATE SCHEMA fkpart7 + CREATE TABLE pkpart (a int) PARTITION BY LIST (a) + CREATE TABLE pkpart1 PARTITION OF pkpart FOR VALUES IN (1); +ALTER TABLE fkpart7.pkpart1 ADD PRIMARY KEY (a); +ALTER TABLE fkpart7.pkpart ADD PRIMARY KEY (a); +CREATE TABLE fkpart7.fk (a int REFERENCES fkpart7.pkpart); +DROP SCHEMA fkpart7 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table fkpart7.pkpart +drop cascades to table fkpart7.fk +-- ensure we check partitions are "not used" when dropping constraints +CREATE SCHEMA fkpart8 + CREATE TABLE tbl1(f1 int PRIMARY KEY) + CREATE TABLE tbl2(f1 int REFERENCES tbl1 DEFERRABLE INITIALLY DEFERRED) PARTITION BY RANGE(f1) + CREATE TABLE tbl2_p1 PARTITION OF tbl2 FOR VALUES FROM (minvalue) TO (maxvalue); +INSERT INTO fkpart8.tbl1 VALUES(1); +BEGIN; +INSERT INTO fkpart8.tbl2 VALUES(1); +ALTER TABLE fkpart8.tbl2 DROP CONSTRAINT tbl2_f1_fkey; +ERROR: cannot ALTER TABLE "tbl2_p1" because it has pending trigger events +COMMIT; +DROP SCHEMA fkpart8 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table fkpart8.tbl1 +drop cascades to table fkpart8.tbl2 +-- ensure FK referencing a multi-level partitioned table are +-- enforce reference to sub-children. +CREATE SCHEMA fkpart9 + CREATE TABLE pk (a INT PRIMARY KEY) PARTITION BY RANGE (a) + CREATE TABLE fk ( + fk_a INT REFERENCES pk(a) ON DELETE CASCADE + ) + CREATE TABLE pk1 PARTITION OF pk FOR VALUES FROM (30) TO (50) PARTITION BY RANGE (a) + CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES FROM (30) TO (40); +INSERT INTO fkpart9.pk VALUES (35); +INSERT INTO fkpart9.fk VALUES (35); +DELETE FROM fkpart9.pk WHERE a=35; +SELECT * FROM fkpart9.pk; + a +--- +(0 rows) + +SELECT * FROM fkpart9.fk; + fk_a +------ +(0 rows) + +DROP SCHEMA fkpart9 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table fkpart9.pk +drop cascades to table fkpart9.fk +-- test that ri_Check_Pk_Match() scans the correct partition for a deferred +-- ON DELETE/UPDATE NO ACTION constraint +CREATE SCHEMA fkpart10 + CREATE TABLE tbl1(f1 int PRIMARY KEY) PARTITION BY RANGE(f1) + CREATE TABLE tbl1_p1 PARTITION OF tbl1 FOR VALUES FROM (minvalue) TO (1) + CREATE TABLE tbl1_p2 PARTITION OF tbl1 FOR VALUES FROM (1) TO (maxvalue) + CREATE TABLE tbl2(f1 int REFERENCES tbl1 DEFERRABLE INITIALLY DEFERRED); +INSERT INTO fkpart10.tbl1 VALUES (0), (1); +INSERT INTO fkpart10.tbl2 VALUES (0), (1); +BEGIN; +DELETE FROM fkpart10.tbl1 WHERE f1 = 0; +UPDATE fkpart10.tbl1 SET f1 = 2 WHERE f1 = 1; +INSERT INTO fkpart10.tbl1 VALUES (0), (1); +COMMIT; +DROP SCHEMA fkpart10 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table fkpart10.tbl1 +drop cascades to table fkpart10.tbl2 diff --git a/src/test/singlenode_regress/expected/functional_deps.out b/src/test/singlenode_regress/expected/functional_deps.out new file mode 100644 index 00000000000..32381b8ae7b --- /dev/null +++ b/src/test/singlenode_regress/expected/functional_deps.out @@ -0,0 +1,232 @@ +-- from http://www.depesz.com/index.php/2010/04/19/getting-unique-elements/ +CREATE TEMP TABLE articles ( + id int CONSTRAINT articles_pkey PRIMARY KEY, + keywords text, + title text UNIQUE NOT NULL, + body text UNIQUE, + created date +); +CREATE TEMP TABLE articles_in_category ( + article_id int, + category_id int, + changed date, + PRIMARY KEY (article_id, category_id) +); +-- test functional dependencies based on primary keys/unique constraints +-- base tables +-- group by primary key (OK) +SELECT id, keywords, title, body, created +FROM articles +GROUP BY id; + id | keywords | title | body | created +----+----------+-------+------+--------- +(0 rows) + +-- group by unique not null (fail/todo) +SELECT id, keywords, title, body, created +FROM articles +GROUP BY title; +ERROR: column "articles.id" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT id, keywords, title, body, created + ^ +-- group by unique nullable (fail) +SELECT id, keywords, title, body, created +FROM articles +GROUP BY body; +ERROR: column "articles.id" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT id, keywords, title, body, created + ^ +-- group by something else (fail) +SELECT id, keywords, title, body, created +FROM articles +GROUP BY keywords; +ERROR: column "articles.id" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT id, keywords, title, body, created + ^ +-- multiple tables +-- group by primary key (OK) +SELECT a.id, a.keywords, a.title, a.body, a.created +FROM articles AS a, articles_in_category AS aic +WHERE a.id = aic.article_id AND aic.category_id in (14,62,70,53,138) +GROUP BY a.id; + id | keywords | title | body | created +----+----------+-------+------+--------- +(0 rows) + +-- group by something else (fail) +SELECT a.id, a.keywords, a.title, a.body, a.created +FROM articles AS a, articles_in_category AS aic +WHERE a.id = aic.article_id AND aic.category_id in (14,62,70,53,138) +GROUP BY aic.article_id, aic.category_id; +ERROR: column "a.id" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT a.id, a.keywords, a.title, a.body, a.created + ^ +-- JOIN syntax +-- group by left table's primary key (OK) +SELECT a.id, a.keywords, a.title, a.body, a.created +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY a.id; + id | keywords | title | body | created +----+----------+-------+------+--------- +(0 rows) + +-- group by something else (fail) +SELECT a.id, a.keywords, a.title, a.body, a.created +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY aic.article_id, aic.category_id; +ERROR: column "a.id" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT a.id, a.keywords, a.title, a.body, a.created + ^ +-- group by right table's (composite) primary key (OK) +SELECT aic.changed +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY aic.category_id, aic.article_id; + changed +--------- +(0 rows) + +-- group by right table's partial primary key (fail) +SELECT aic.changed +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY aic.article_id; +ERROR: column "aic.changed" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT aic.changed + ^ +-- example from documentation +CREATE TEMP TABLE products (product_id int, name text, price numeric); +CREATE TEMP TABLE sales (product_id int, units int); +-- OK +SELECT product_id, p.name, (sum(s.units) * p.price) AS sales + FROM products p LEFT JOIN sales s USING (product_id) + GROUP BY product_id, p.name, p.price; + product_id | name | sales +------------+------+------- +(0 rows) + +-- fail +SELECT product_id, p.name, (sum(s.units) * p.price) AS sales + FROM products p LEFT JOIN sales s USING (product_id) + GROUP BY product_id; +ERROR: column "p.name" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT product_id, p.name, (sum(s.units) * p.price) AS sales + ^ +ALTER TABLE products ADD PRIMARY KEY (product_id); +-- OK now +SELECT product_id, p.name, (sum(s.units) * p.price) AS sales + FROM products p LEFT JOIN sales s USING (product_id) + GROUP BY product_id; + product_id | name | sales +------------+------+------- +(0 rows) + +-- Drupal example, http://drupal.org/node/555530 +CREATE TEMP TABLE node ( + nid SERIAL, + vid integer NOT NULL default '0', + type varchar(32) NOT NULL default '', + title varchar(128) NOT NULL default '', + uid integer NOT NULL default '0', + status integer NOT NULL default '1', + created integer NOT NULL default '0', + -- snip + PRIMARY KEY (nid, vid) +); +CREATE TEMP TABLE users ( + uid integer NOT NULL default '0', + name varchar(60) NOT NULL default '', + pass varchar(32) NOT NULL default '', + -- snip + PRIMARY KEY (uid), + UNIQUE (name) +); +-- OK +SELECT u.uid, u.name FROM node n +INNER JOIN users u ON u.uid = n.uid +WHERE n.type = 'blog' AND n.status = 1 +GROUP BY u.uid, u.name; + uid | name +-----+------ +(0 rows) + +-- OK +SELECT u.uid, u.name FROM node n +INNER JOIN users u ON u.uid = n.uid +WHERE n.type = 'blog' AND n.status = 1 +GROUP BY u.uid; + uid | name +-----+------ +(0 rows) + +-- Check views and dependencies +-- fail +CREATE TEMP VIEW fdv1 AS +SELECT id, keywords, title, body, created +FROM articles +GROUP BY body; +ERROR: column "articles.id" must appear in the GROUP BY clause or be used in an aggregate function +LINE 2: SELECT id, keywords, title, body, created + ^ +-- OK +CREATE TEMP VIEW fdv1 AS +SELECT id, keywords, title, body, created +FROM articles +GROUP BY id; +-- fail +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; +ERROR: cannot drop constraint articles_pkey on table articles because other objects depend on it +DETAIL: view fdv1 depends on constraint articles_pkey on table articles +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP VIEW fdv1; +-- multiple dependencies +CREATE TEMP VIEW fdv2 AS +SELECT a.id, a.keywords, a.title, aic.category_id, aic.changed +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY a.id, aic.category_id, aic.article_id; +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail +ERROR: cannot drop constraint articles_pkey on table articles because other objects depend on it +DETAIL: view fdv2 depends on constraint articles_pkey on table articles +HINT: Use DROP ... CASCADE to drop the dependent objects too. +ALTER TABLE articles_in_category DROP CONSTRAINT articles_in_category_pkey RESTRICT; --fail +ERROR: cannot drop constraint articles_in_category_pkey on table articles_in_category because other objects depend on it +DETAIL: view fdv2 depends on constraint articles_in_category_pkey on table articles_in_category +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP VIEW fdv2; +-- nested queries +CREATE TEMP VIEW fdv3 AS +SELECT id, keywords, title, body, created +FROM articles +GROUP BY id +UNION +SELECT id, keywords, title, body, created +FROM articles +GROUP BY id; +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail +ERROR: cannot drop constraint articles_pkey on table articles because other objects depend on it +DETAIL: view fdv3 depends on constraint articles_pkey on table articles +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP VIEW fdv3; +CREATE TEMP VIEW fdv4 AS +SELECT * FROM articles WHERE title IN (SELECT title FROM articles GROUP BY id); +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail +ERROR: cannot drop constraint articles_pkey on table articles because other objects depend on it +DETAIL: view fdv4 depends on constraint articles_pkey on table articles +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP VIEW fdv4; +-- prepared query plans: this results in failure on reuse +PREPARE foo AS + SELECT id, keywords, title, body, created + FROM articles + GROUP BY id; +EXECUTE foo; + id | keywords | title | body | created +----+----------+-------+------+--------- +(0 rows) + +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; +EXECUTE foo; -- fail +ERROR: column "articles.keywords" must appear in the GROUP BY clause or be used in an aggregate function diff --git a/src/test/singlenode_regress/expected/generated.out b/src/test/singlenode_regress/expected/generated.out new file mode 100644 index 00000000000..4ce72b92982 --- /dev/null +++ b/src/test/singlenode_regress/expected/generated.out @@ -0,0 +1,1085 @@ +-- sanity check of system catalog +SELECT attrelid, attname, attgenerated FROM pg_attribute WHERE attgenerated NOT IN ('', 's'); + attrelid | attname | attgenerated +----------+---------+-------------- +(0 rows) + +CREATE TABLE gtest0 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (55) STORED); +CREATE TABLE gtest1 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); +SELECT table_name, column_name, column_default, is_nullable, is_generated, generation_expression FROM information_schema.columns WHERE table_name LIKE 'gtest_' ORDER BY 1, 2; + table_name | column_name | column_default | is_nullable | is_generated | generation_expression +------------+-------------+----------------+-------------+--------------+----------------------- + gtest0 | a | | NO | NEVER | + gtest0 | b | | YES | ALWAYS | 55 + gtest1 | a | | NO | NEVER | + gtest1 | b | | YES | ALWAYS | (a * 2) +(4 rows) + +SELECT table_name, column_name, dependent_column FROM information_schema.column_column_usage ORDER BY 1, 2, 3; + table_name | column_name | dependent_column +------------+-------------+------------------ + gtest1 | a | b +(1 row) + +\d gtest1 + Table "public.gtest1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | not null | + b | integer | | | generated always as (a * 2) stored +Indexes: + "gtest1_pkey" PRIMARY KEY, btree (a) + +-- duplicate generated +CREATE TABLE gtest_err_1 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED GENERATED ALWAYS AS (a * 3) STORED); +ERROR: multiple generation clauses specified for column "b" of table "gtest_err_1" +LINE 1: ...ARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED GENERATED ... + ^ +-- references to other generated columns, including self-references +CREATE TABLE gtest_err_2a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (b * 2) STORED); +ERROR: cannot use generated column "b" in column generation expression +LINE 1: ...2a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (b * 2) STO... + ^ +DETAIL: A generated column cannot reference another generated column. +CREATE TABLE gtest_err_2b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED, c int GENERATED ALWAYS AS (b * 3) STORED); +ERROR: cannot use generated column "b" in column generation expression +LINE 1: ...AYS AS (a * 2) STORED, c int GENERATED ALWAYS AS (b * 3) STO... + ^ +DETAIL: A generated column cannot reference another generated column. +-- a whole-row var is a self-reference on steroids, so disallow that too +CREATE TABLE gtest_err_2c (a int PRIMARY KEY, + b int GENERATED ALWAYS AS (num_nulls(gtest_err_2c)) STORED); +ERROR: cannot use whole-row variable in column generation expression +LINE 2: b int GENERATED ALWAYS AS (num_nulls(gtest_err_2c)) STOR... + ^ +DETAIL: This would cause the generated column to depend on its own value. +-- invalid reference +CREATE TABLE gtest_err_3 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (c * 2) STORED); +ERROR: column "c" does not exist +LINE 1: ..._3 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (c * 2) STO... + ^ +-- generation expression must be immutable +CREATE TABLE gtest_err_4 (a int PRIMARY KEY, b double precision GENERATED ALWAYS AS (random()) STORED); +ERROR: generation expression is not immutable +-- cannot have default/identity and generated +CREATE TABLE gtest_err_5a (a int PRIMARY KEY, b int DEFAULT 5 GENERATED ALWAYS AS (a * 2) STORED); +ERROR: both default and generation expression specified for column "b" of table "gtest_err_5a" +LINE 1: ... gtest_err_5a (a int PRIMARY KEY, b int DEFAULT 5 GENERATED ... + ^ +CREATE TABLE gtest_err_5b (a int PRIMARY KEY, b int GENERATED ALWAYS AS identity GENERATED ALWAYS AS (a * 2) STORED); +ERROR: both identity and generation expression specified for column "b" of table "gtest_err_5b" +LINE 1: ...t PRIMARY KEY, b int GENERATED ALWAYS AS identity GENERATED ... + ^ +-- reference to system column not allowed in generated column +-- (except tableoid, which we test below) +CREATE TABLE gtest_err_6a (a int PRIMARY KEY, b bool GENERATED ALWAYS AS (xmin <> 37) STORED); +ERROR: cannot use system column "xmin" in column generation expression +LINE 1: ...a (a int PRIMARY KEY, b bool GENERATED ALWAYS AS (xmin <> 37... + ^ +-- various prohibited constructs +CREATE TABLE gtest_err_7a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (avg(a)) STORED); +ERROR: aggregate functions are not allowed in column generation expressions +LINE 1: ...7a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (avg(a)) ST... + ^ +CREATE TABLE gtest_err_7b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (row_number() OVER (ORDER BY a)) STORED); +ERROR: window functions are not allowed in column generation expressions +LINE 1: ...7b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (row_number... + ^ +CREATE TABLE gtest_err_7c (a int PRIMARY KEY, b int GENERATED ALWAYS AS ((SELECT a)) STORED); +ERROR: cannot use subquery in column generation expression +LINE 1: ...7c (a int PRIMARY KEY, b int GENERATED ALWAYS AS ((SELECT a)... + ^ +CREATE TABLE gtest_err_7d (a int PRIMARY KEY, b int GENERATED ALWAYS AS (generate_series(1, a)) STORED); +ERROR: set-returning functions are not allowed in column generation expressions +LINE 1: ...7d (a int PRIMARY KEY, b int GENERATED ALWAYS AS (generate_s... + ^ +-- GENERATED BY DEFAULT not allowed +CREATE TABLE gtest_err_8 (a int PRIMARY KEY, b int GENERATED BY DEFAULT AS (a * 2) STORED); +ERROR: for a generated column, GENERATED ALWAYS must be specified +LINE 1: ...E gtest_err_8 (a int PRIMARY KEY, b int GENERATED BY DEFAULT... + ^ +INSERT INTO gtest1 VALUES (1); +INSERT INTO gtest1 VALUES (2, DEFAULT); -- ok +INSERT INTO gtest1 VALUES (3, 33); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1 VALUES (3, 33), (4, 44); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1 VALUES (3, DEFAULT), (4, 44); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1 VALUES (3, 33), (4, DEFAULT); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1 VALUES (3, DEFAULT), (4, DEFAULT); -- ok +SELECT * FROM gtest1 ORDER BY a; + a | b +---+--- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 +(4 rows) + +DELETE FROM gtest1 WHERE a >= 3; +UPDATE gtest1 SET b = DEFAULT WHERE a = 1; +UPDATE gtest1 SET b = 11 WHERE a = 1; -- error +ERROR: column "b" can only be updated to DEFAULT +DETAIL: Column "b" is a generated column. +SELECT * FROM gtest1 ORDER BY a; + a | b +---+--- + 1 | 2 + 2 | 4 +(2 rows) + +SELECT a, b, b * 2 AS b2 FROM gtest1 ORDER BY a; + a | b | b2 +---+---+---- + 1 | 2 | 4 + 2 | 4 | 8 +(2 rows) + +SELECT a, b FROM gtest1 WHERE b = 4 ORDER BY a; + a | b +---+--- + 2 | 4 +(1 row) + +-- test that overflow error happens on write +INSERT INTO gtest1 VALUES (2000000000); +ERROR: integer out of range +SELECT * FROM gtest1; + a | b +---+--- + 2 | 4 + 1 | 2 +(2 rows) + +DELETE FROM gtest1 WHERE a = 2000000000; +-- test with joins +CREATE TABLE gtestx (x int, y int); +INSERT INTO gtestx VALUES (11, 1), (22, 2), (33, 3); +SELECT * FROM gtestx, gtest1 WHERE gtestx.y = gtest1.a; + x | y | a | b +----+---+---+--- + 11 | 1 | 1 | 2 + 22 | 2 | 2 | 4 +(2 rows) + +DROP TABLE gtestx; +-- test UPDATE/DELETE quals +SELECT * FROM gtest1 ORDER BY a; + a | b +---+--- + 1 | 2 + 2 | 4 +(2 rows) + +UPDATE gtest1 SET a = 3 WHERE b = 4; +SELECT * FROM gtest1 ORDER BY a; + a | b +---+--- + 1 | 2 + 3 | 6 +(2 rows) + +DELETE FROM gtest1 WHERE b = 2; +SELECT * FROM gtest1 ORDER BY a; + a | b +---+--- + 3 | 6 +(1 row) + +-- views +CREATE VIEW gtest1v AS SELECT * FROM gtest1; +SELECT * FROM gtest1v; + a | b +---+--- + 3 | 6 +(1 row) + +INSERT INTO gtest1v VALUES (4, 8); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1v VALUES (5, DEFAULT); -- ok +INSERT INTO gtest1v VALUES (6, 66), (7, 77); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1v VALUES (6, DEFAULT), (7, 77); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1v VALUES (6, 66), (7, DEFAULT); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1v VALUES (6, DEFAULT), (7, DEFAULT); -- ok +ALTER VIEW gtest1v ALTER COLUMN b SET DEFAULT 100; +INSERT INTO gtest1v VALUES (8, DEFAULT); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +INSERT INTO gtest1v VALUES (8, DEFAULT), (9, DEFAULT); -- error +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is a generated column. +SELECT * FROM gtest1v; + a | b +---+---- + 3 | 6 + 5 | 10 + 6 | 12 + 7 | 14 +(4 rows) + +DELETE FROM gtest1v WHERE a >= 5; +DROP VIEW gtest1v; +-- CTEs +WITH foo AS (SELECT * FROM gtest1) SELECT * FROM foo; + a | b +---+--- + 3 | 6 +(1 row) + +-- inheritance +CREATE TABLE gtest1_1 () INHERITS (gtest1); +SELECT * FROM gtest1_1; + a | b +---+--- +(0 rows) + +\d gtest1_1 + Table "public.gtest1_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | not null | + b | integer | | | generated always as (a * 2) stored +Inherits: gtest1 + +INSERT INTO gtest1_1 VALUES (4); +SELECT * FROM gtest1_1; + a | b +---+--- + 4 | 8 +(1 row) + +SELECT * FROM gtest1; + a | b +---+--- + 3 | 6 + 4 | 8 +(2 rows) + +CREATE TABLE gtest_normal (a int, b int); +CREATE TABLE gtest_normal_child (a int, b int GENERATED ALWAYS AS (a * 2) STORED) INHERITS (gtest_normal); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +\d gtest_normal_child + Table "public.gtest_normal_child" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | | + b | integer | | | generated always as (a * 2) stored +Inherits: gtest_normal + +INSERT INTO gtest_normal (a) VALUES (1); +INSERT INTO gtest_normal_child (a) VALUES (2); +SELECT * FROM gtest_normal; + a | b +---+--- + 1 | + 2 | 4 +(2 rows) + +CREATE TABLE gtest_normal_child2 (a int, b int GENERATED ALWAYS AS (a * 3) STORED); +ALTER TABLE gtest_normal_child2 INHERIT gtest_normal; +INSERT INTO gtest_normal_child2 (a) VALUES (3); +SELECT * FROM gtest_normal; + a | b +---+--- + 1 | + 2 | 4 + 3 | 9 +(3 rows) + +-- test inheritance mismatches between parent and child +CREATE TABLE gtestx (x int, b int GENERATED ALWAYS AS (a * 22) STORED) INHERITS (gtest1); -- error +NOTICE: merging column "b" with inherited definition +ERROR: child column "b" specifies generation expression +HINT: Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table. +CREATE TABLE gtestx (x int, b int DEFAULT 10) INHERITS (gtest1); -- error +NOTICE: merging column "b" with inherited definition +ERROR: column "b" inherits from generated column but specifies default +CREATE TABLE gtestx (x int, b int GENERATED ALWAYS AS IDENTITY) INHERITS (gtest1); -- error +NOTICE: merging column "b" with inherited definition +ERROR: column "b" inherits from generated column but specifies identity +CREATE TABLE gtestxx_1 (a int NOT NULL, b int); +ALTER TABLE gtestxx_1 INHERIT gtest1; -- error +ERROR: column "b" in child table must be a generated column +CREATE TABLE gtestxx_2 (a int NOT NULL, b int GENERATED ALWAYS AS (a * 22) STORED); +ALTER TABLE gtestxx_2 INHERIT gtest1; -- error +ERROR: column "b" in child table has a conflicting generation expression +CREATE TABLE gtestxx_3 (a int NOT NULL, b int GENERATED ALWAYS AS (a * 2) STORED); +ALTER TABLE gtestxx_3 INHERIT gtest1; -- ok +CREATE TABLE gtestxx_4 (b int GENERATED ALWAYS AS (a * 2) STORED, a int NOT NULL); +ALTER TABLE gtestxx_4 INHERIT gtest1; -- ok +-- test multiple inheritance mismatches +CREATE TABLE gtesty (x int, b int); +CREATE TABLE gtest1_2 () INHERITS (gtest1, gtesty); -- error +NOTICE: merging multiple inherited definitions of column "b" +ERROR: inherited column "b" has a generation conflict +DROP TABLE gtesty; +CREATE TABLE gtesty (x int, b int GENERATED ALWAYS AS (x * 22) STORED); +CREATE TABLE gtest1_2 () INHERITS (gtest1, gtesty); -- error +NOTICE: merging multiple inherited definitions of column "b" +ERROR: column "b" inherits conflicting generation expressions +DROP TABLE gtesty; +CREATE TABLE gtesty (x int, b int DEFAULT 55); +CREATE TABLE gtest1_2 () INHERITS (gtest0, gtesty); -- error +NOTICE: merging multiple inherited definitions of column "b" +ERROR: inherited column "b" has a generation conflict +DROP TABLE gtesty; +-- test stored update +CREATE TABLE gtest3 (a int, b int GENERATED ALWAYS AS (a * 3) STORED); +INSERT INTO gtest3 (a) VALUES (1), (2), (3), (NULL); +SELECT * FROM gtest3 ORDER BY a; + a | b +---+--- + 1 | 3 + 2 | 6 + 3 | 9 + | +(4 rows) + +UPDATE gtest3 SET a = 22 WHERE a = 2; +SELECT * FROM gtest3 ORDER BY a; + a | b +----+---- + 1 | 3 + 3 | 9 + 22 | 66 + | +(4 rows) + +CREATE TABLE gtest3a (a text, b text GENERATED ALWAYS AS (a || '+' || a) STORED); +INSERT INTO gtest3a (a) VALUES ('a'), ('b'), ('c'), (NULL); +SELECT * FROM gtest3a ORDER BY a; + a | b +---+----- + a | a+a + b | b+b + c | c+c + | +(4 rows) + +UPDATE gtest3a SET a = 'bb' WHERE a = 'b'; +SELECT * FROM gtest3a ORDER BY a; + a | b +----+------- + a | a+a + bb | bb+bb + c | c+c + | +(4 rows) + +-- COPY +TRUNCATE gtest1; +INSERT INTO gtest1 (a) VALUES (1), (2); +COPY gtest1 TO stdout; +1 +2 +COPY gtest1 (a, b) TO stdout; +ERROR: column "b" is a generated column +DETAIL: Generated columns cannot be used in COPY. +COPY gtest1 FROM stdin; +COPY gtest1 (a, b) FROM stdin; +ERROR: column "b" is a generated column +DETAIL: Generated columns cannot be used in COPY. +SELECT * FROM gtest1 ORDER BY a; + a | b +---+--- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 +(4 rows) + +TRUNCATE gtest3; +INSERT INTO gtest3 (a) VALUES (1), (2); +COPY gtest3 TO stdout; +1 +2 +COPY gtest3 (a, b) TO stdout; +ERROR: column "b" is a generated column +DETAIL: Generated columns cannot be used in COPY. +COPY gtest3 FROM stdin; +COPY gtest3 (a, b) FROM stdin; +ERROR: column "b" is a generated column +DETAIL: Generated columns cannot be used in COPY. +SELECT * FROM gtest3 ORDER BY a; + a | b +---+---- + 1 | 3 + 2 | 6 + 3 | 9 + 4 | 12 +(4 rows) + +-- null values +CREATE TABLE gtest2 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (NULL) STORED); +INSERT INTO gtest2 VALUES (1); +SELECT * FROM gtest2; + a | b +---+--- + 1 | +(1 row) + +-- simple column reference for varlena types +CREATE TABLE gtest_varlena (a varchar, b varchar GENERATED ALWAYS AS (a) STORED); +INSERT INTO gtest_varlena (a) VALUES('01234567890123456789'); +INSERT INTO gtest_varlena (a) VALUES(NULL); +SELECT * FROM gtest_varlena ORDER BY a; + a | b +----------------------+---------------------- + 01234567890123456789 | 01234567890123456789 + | +(2 rows) + +DROP TABLE gtest_varlena; +-- composite types +CREATE TYPE double_int as (a int, b int); +CREATE TABLE gtest4 ( + a int, + b double_int GENERATED ALWAYS AS ((a * 2, a * 3)) STORED +); +INSERT INTO gtest4 VALUES (1), (6); +SELECT * FROM gtest4; + a | b +---+--------- + 1 | (2,3) + 6 | (12,18) +(2 rows) + +DROP TABLE gtest4; +DROP TYPE double_int; +-- using tableoid is allowed +CREATE TABLE gtest_tableoid ( + a int PRIMARY KEY, + b bool GENERATED ALWAYS AS (tableoid = 'gtest_tableoid'::regclass) STORED +); +INSERT INTO gtest_tableoid VALUES (1), (2); +ALTER TABLE gtest_tableoid ADD COLUMN + c regclass GENERATED ALWAYS AS (tableoid) STORED; +SELECT * FROM gtest_tableoid; + a | b | c +---+---+---------------- + 1 | t | gtest_tableoid + 2 | t | gtest_tableoid +(2 rows) + +-- drop column behavior +CREATE TABLE gtest10 (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (b * 2) STORED); +ALTER TABLE gtest10 DROP COLUMN b; +\d gtest10 + Table "public.gtest10" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | +Indexes: + "gtest10_pkey" PRIMARY KEY, btree (a) + +CREATE TABLE gtest10a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); +ALTER TABLE gtest10a DROP COLUMN b; +INSERT INTO gtest10a (a) VALUES (1); +-- privileges +CREATE USER regress_user11; +CREATE TABLE gtest11s (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (b * 2) STORED); +INSERT INTO gtest11s VALUES (1, 10), (2, 20); +GRANT SELECT (a, c) ON gtest11s TO regress_user11; +CREATE FUNCTION gf1(a int) RETURNS int AS $$ SELECT a * 3 $$ IMMUTABLE LANGUAGE SQL; +REVOKE ALL ON FUNCTION gf1(int) FROM PUBLIC; +CREATE TABLE gtest12s (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (gf1(b)) STORED); +INSERT INTO gtest12s VALUES (1, 10), (2, 20); +GRANT SELECT (a, c) ON gtest12s TO regress_user11; +SET ROLE regress_user11; +SELECT a, b FROM gtest11s; -- not allowed +ERROR: permission denied for table gtest11s +SELECT a, c FROM gtest11s; -- allowed + a | c +---+---- + 1 | 20 + 2 | 40 +(2 rows) + +SELECT gf1(10); -- not allowed +ERROR: permission denied for function gf1 +SELECT a, c FROM gtest12s; -- allowed + a | c +---+---- + 1 | 30 + 2 | 60 +(2 rows) + +RESET ROLE; +DROP TABLE gtest11s, gtest12s; +DROP FUNCTION gf1(int); +DROP USER regress_user11; +-- check constraints +CREATE TABLE gtest20 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED CHECK (b < 50)); +INSERT INTO gtest20 (a) VALUES (10); -- ok +INSERT INTO gtest20 (a) VALUES (30); -- violates constraint +ERROR: new row for relation "gtest20" violates check constraint "gtest20_b_check" +DETAIL: Failing row contains (30, 60). +CREATE TABLE gtest20a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); +INSERT INTO gtest20a (a) VALUES (10); +INSERT INTO gtest20a (a) VALUES (30); +ALTER TABLE gtest20a ADD CHECK (b < 50); -- fails on existing row +ERROR: check constraint "gtest20a_b_check" of relation "gtest20a" is violated by some row +CREATE TABLE gtest20b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); +INSERT INTO gtest20b (a) VALUES (10); +INSERT INTO gtest20b (a) VALUES (30); +ALTER TABLE gtest20b ADD CONSTRAINT chk CHECK (b < 50) NOT VALID; +ALTER TABLE gtest20b VALIDATE CONSTRAINT chk; -- fails on existing row +ERROR: check constraint "chk" of relation "gtest20b" is violated by some row +-- not-null constraints +CREATE TABLE gtest21a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (nullif(a, 0)) STORED NOT NULL); +INSERT INTO gtest21a (a) VALUES (1); -- ok +INSERT INTO gtest21a (a) VALUES (0); -- violates constraint +ERROR: null value in column "b" of relation "gtest21a" violates not-null constraint +DETAIL: Failing row contains (0, null). +CREATE TABLE gtest21b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (nullif(a, 0)) STORED); +ALTER TABLE gtest21b ALTER COLUMN b SET NOT NULL; +INSERT INTO gtest21b (a) VALUES (1); -- ok +INSERT INTO gtest21b (a) VALUES (0); -- violates constraint +ERROR: null value in column "b" of relation "gtest21b" violates not-null constraint +DETAIL: Failing row contains (0, null). +ALTER TABLE gtest21b ALTER COLUMN b DROP NOT NULL; +INSERT INTO gtest21b (a) VALUES (0); -- ok now +-- index constraints +CREATE TABLE gtest22a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a / 2) STORED UNIQUE); +INSERT INTO gtest22a VALUES (2); +INSERT INTO gtest22a VALUES (3); +ERROR: duplicate key value violates unique constraint "gtest22a_b_key" +DETAIL: Key (b)=(1) already exists. +INSERT INTO gtest22a VALUES (4); +CREATE TABLE gtest22b (a int, b int GENERATED ALWAYS AS (a / 2) STORED, PRIMARY KEY (a, b)); +INSERT INTO gtest22b VALUES (2); +INSERT INTO gtest22b VALUES (2); +ERROR: duplicate key value violates unique constraint "gtest22b_pkey" +DETAIL: Key (a, b)=(2, 1) already exists. +-- indexes +CREATE TABLE gtest22c (a int, b int GENERATED ALWAYS AS (a * 2) STORED); +CREATE INDEX gtest22c_b_idx ON gtest22c (b); +CREATE INDEX gtest22c_expr_idx ON gtest22c ((b * 3)); +CREATE INDEX gtest22c_pred_idx ON gtest22c (a) WHERE b > 0; +\d gtest22c + Table "public.gtest22c" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | | + b | integer | | | generated always as (a * 2) stored +Indexes: + "gtest22c_b_idx" btree (b) + "gtest22c_expr_idx" btree ((b * 3)) + "gtest22c_pred_idx" btree (a) WHERE b > 0 + +INSERT INTO gtest22c VALUES (1), (2), (3); +SET enable_seqscan TO off; +SET enable_bitmapscan TO off; +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b = 4; + QUERY PLAN +--------------------------------------------- + Index Scan using gtest22c_b_idx on gtest22c + Index Cond: (b = 4) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM gtest22c WHERE b = 4; + a | b +---+--- + 2 | 4 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b * 3 = 6; + QUERY PLAN +------------------------------------------------ + Index Scan using gtest22c_expr_idx on gtest22c + Index Cond: ((b * 3) = 6) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM gtest22c WHERE b * 3 = 6; + a | b +---+--- + 1 | 2 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE a = 1 AND b > 0; + QUERY PLAN +------------------------------------------------ + Index Scan using gtest22c_pred_idx on gtest22c + Index Cond: (a = 1) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM gtest22c WHERE a = 1 AND b > 0; + a | b +---+--- + 1 | 2 +(1 row) + +RESET enable_seqscan; +RESET enable_bitmapscan; +-- foreign keys +CREATE TABLE gtest23a (x int PRIMARY KEY, y int); +INSERT INTO gtest23a VALUES (1, 11), (2, 22), (3, 33); +CREATE TABLE gtest23x (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED REFERENCES gtest23a (x) ON UPDATE CASCADE); -- error +ERROR: invalid ON UPDATE action for foreign key constraint containing generated column +CREATE TABLE gtest23x (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED REFERENCES gtest23a (x) ON DELETE SET NULL); -- error +ERROR: invalid ON DELETE action for foreign key constraint containing generated column +CREATE TABLE gtest23b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED REFERENCES gtest23a (x)); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +\d gtest23b + Table "public.gtest23b" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | not null | + b | integer | | | generated always as (a * 2) stored +Indexes: + "gtest23b_pkey" PRIMARY KEY, btree (a) +Foreign-key constraints: + "gtest23b_b_fkey" FOREIGN KEY (b) REFERENCES gtest23a(x) + +INSERT INTO gtest23b VALUES (1); -- ok +-- GPDB doesn't enforce foreign key constraints, so this doesn't error out. +INSERT INTO gtest23b VALUES (5); -- error +DROP TABLE gtest23b; +DROP TABLE gtest23a; +CREATE TABLE gtest23p (x int, y int GENERATED ALWAYS AS (x * 2) STORED, PRIMARY KEY (y)); +INSERT INTO gtest23p VALUES (1), (2), (3); +CREATE TABLE gtest23q (a int PRIMARY KEY, b int REFERENCES gtest23p (y)); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO gtest23q VALUES (1, 2); -- ok +-- GPDB doesn't enforce foreign key constraints, so this doesn't error out. +INSERT INTO gtest23q VALUES (2, 5); -- error +-- domains +CREATE DOMAIN gtestdomain1 AS int CHECK (VALUE < 10); +CREATE TABLE gtest24 (a int PRIMARY KEY, b gtestdomain1 GENERATED ALWAYS AS (a * 2) STORED); +INSERT INTO gtest24 (a) VALUES (4); -- ok +INSERT INTO gtest24 (a) VALUES (6); -- error +ERROR: value for domain gtestdomain1 violates check constraint "gtestdomain1_check" +-- typed tables (currently not supported) +CREATE TYPE gtest_type AS (f1 integer, f2 text, f3 bigint); +CREATE TABLE gtest28 OF gtest_type (f1 WITH OPTIONS GENERATED ALWAYS AS (f2 *2) STORED); +ERROR: generated columns are not supported on typed tables +DROP TYPE gtest_type CASCADE; +-- table partitions (currently not supported) +CREATE TABLE gtest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1); +CREATE TABLE gtest_child PARTITION OF gtest_parent ( + f3 WITH OPTIONS GENERATED ALWAYS AS (f2 * 2) STORED +) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error +ERROR: generated columns are not supported on partitions +DROP TABLE gtest_parent; +-- partitioned table +CREATE TABLE gtest_parent (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS (f2 * 2) STORED) PARTITION BY RANGE (f1); +CREATE TABLE gtest_child PARTITION OF gtest_parent FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +INSERT INTO gtest_parent (f1, f2) VALUES ('2016-07-15', 1); +SELECT * FROM gtest_parent; + f1 | f2 | f3 +------------+----+---- + 07-15-2016 | 1 | 2 +(1 row) + +SELECT * FROM gtest_child; + f1 | f2 | f3 +------------+----+---- + 07-15-2016 | 1 | 2 +(1 row) + +DROP TABLE gtest_parent; +-- generated columns in partition key (not allowed) +CREATE TABLE gtest_parent (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS (f2 * 2) STORED) PARTITION BY RANGE (f3); +ERROR: cannot use generated column in partition key +LINE 1: ...ENERATED ALWAYS AS (f2 * 2) STORED) PARTITION BY RANGE (f3); + ^ +DETAIL: Column "f3" is a generated column. +CREATE TABLE gtest_parent (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS (f2 * 2) STORED) PARTITION BY RANGE ((f3 * 3)); +ERROR: cannot use generated column in partition key +LINE 1: ...ED ALWAYS AS (f2 * 2) STORED) PARTITION BY RANGE ((f3 * 3)); + ^ +DETAIL: Column "f3" is a generated column. +-- ALTER TABLE ... ADD COLUMN +CREATE TABLE gtest25 (a int PRIMARY KEY); +INSERT INTO gtest25 VALUES (3), (4); +ALTER TABLE gtest25 ADD COLUMN b int GENERATED ALWAYS AS (a * 3) STORED; +SELECT * FROM gtest25 ORDER BY a; + a | b +---+---- + 3 | 9 + 4 | 12 +(2 rows) + +ALTER TABLE gtest25 ADD COLUMN x int GENERATED ALWAYS AS (b * 4) STORED; -- error +ERROR: cannot use generated column "b" in column generation expression +DETAIL: A generated column cannot reference another generated column. +ALTER TABLE gtest25 ADD COLUMN x int GENERATED ALWAYS AS (z * 4) STORED; -- error +ERROR: column "z" does not exist +ALTER TABLE gtest25 ADD COLUMN c int DEFAULT 42, + ADD COLUMN x int GENERATED ALWAYS AS (c * 4) STORED; +ALTER TABLE gtest25 ADD COLUMN d int DEFAULT 101; +ALTER TABLE gtest25 ALTER COLUMN d SET DATA TYPE float8, + ADD COLUMN y float8 GENERATED ALWAYS AS (d * 4) STORED; +SELECT * FROM gtest25 ORDER BY a; + a | b | c | x | d | y +---+----+----+-----+-----+----- + 3 | 9 | 42 | 168 | 101 | 404 + 4 | 12 | 42 | 168 | 101 | 404 +(2 rows) + +\d gtest25 + Table "public.gtest25" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+------------------------------------------------------ + a | integer | | not null | + b | integer | | | generated always as (a * 3) stored + c | integer | | | 42 + x | integer | | | generated always as (c * 4) stored + d | double precision | | | 101 + y | double precision | | | generated always as (d * 4::double precision) stored +Indexes: + "gtest25_pkey" PRIMARY KEY, btree (a) + +-- ALTER TABLE ... ALTER COLUMN +CREATE TABLE gtest27 ( + a int, + b int, + x int GENERATED ALWAYS AS ((a + b) * 2) STORED +); +INSERT INTO gtest27 (a, b) VALUES (3, 7), (4, 11); +ALTER TABLE gtest27 ALTER COLUMN a TYPE text; -- error +ERROR: cannot alter type of a column used by a generated column +DETAIL: Column "a" is used by generated column "x". +ALTER TABLE gtest27 ALTER COLUMN x TYPE numeric; +\d gtest27 + Table "public.gtest27" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+-------------------------------------------- + a | integer | | | + b | integer | | | + x | numeric | | | generated always as (((a + b) * 2)) stored + +SELECT * FROM gtest27; + a | b | x +---+----+---- + 3 | 7 | 20 + 4 | 11 | 30 +(2 rows) + +ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error +ERROR: generation expression for column "x" cannot be cast automatically to type boolean +ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error +ERROR: column "x" of relation "gtest27" is a generated column +HINT: Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead. +-- It's possible to alter the column types this way: +ALTER TABLE gtest27 + DROP COLUMN x, + ALTER COLUMN a TYPE bigint, + ALTER COLUMN b TYPE bigint, + ADD COLUMN x bigint GENERATED ALWAYS AS ((a + b) * 2) STORED; +\d gtest27 + Table "public.gtest27" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------------------ + a | bigint | | | + b | bigint | | | + x | bigint | | | generated always as ((a + b) * 2) stored + +-- Ideally you could just do this, but not today (and should x change type?): +ALTER TABLE gtest27 + ALTER COLUMN a TYPE float8, + ALTER COLUMN b TYPE float8; -- error +ERROR: cannot alter type of a column used by a generated column +DETAIL: Column "a" is used by generated column "x". +\d gtest27 + Table "public.gtest27" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------------------ + a | bigint | | | + b | bigint | | | + x | bigint | | | generated always as ((a + b) * 2) stored + +SELECT * FROM gtest27; + a | b | x +---+----+---- + 3 | 7 | 20 + 4 | 11 | 30 +(2 rows) + +-- ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION +CREATE TABLE gtest29 ( + a int, + b int GENERATED ALWAYS AS (a * 2) STORED +); +INSERT INTO gtest29 (a) VALUES (3), (4); +ALTER TABLE gtest29 ALTER COLUMN a DROP EXPRESSION; -- error +ERROR: column "a" of relation "gtest29" is not a stored generated column +ALTER TABLE gtest29 ALTER COLUMN a DROP EXPRESSION IF EXISTS; -- notice +NOTICE: column "a" of relation "gtest29" is not a stored generated column, skipping +ALTER TABLE gtest29 ALTER COLUMN b DROP EXPRESSION; +INSERT INTO gtest29 (a) VALUES (5); +INSERT INTO gtest29 (a, b) VALUES (6, 66); +SELECT * FROM gtest29; + a | b +---+---- + 3 | 6 + 4 | 8 + 5 | + 6 | 66 +(4 rows) + +\d gtest29 + Table "public.gtest29" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + +-- check that dependencies between columns have also been removed +ALTER TABLE gtest29 DROP COLUMN a; -- should not drop b +\d gtest29 + Table "public.gtest29" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + b | integer | | | + +-- with inheritance +CREATE TABLE gtest30 ( + a int, + b int GENERATED ALWAYS AS (a * 2) STORED +); +CREATE TABLE gtest30_1 () INHERITS (gtest30); +ALTER TABLE gtest30 ALTER COLUMN b DROP EXPRESSION; +\d gtest30 + Table "public.gtest30" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Number of child tables: 1 (Use \d+ to list them.) + +\d gtest30_1 + Table "public.gtest30_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Inherits: gtest30 + +DROP TABLE gtest30 CASCADE; +NOTICE: drop cascades to table gtest30_1 +CREATE TABLE gtest30 ( + a int, + b int GENERATED ALWAYS AS (a * 2) STORED +); +CREATE TABLE gtest30_1 () INHERITS (gtest30); +ALTER TABLE ONLY gtest30 ALTER COLUMN b DROP EXPRESSION; -- error +ERROR: ALTER TABLE / DROP EXPRESSION must be applied to child tables too +\d gtest30 + Table "public.gtest30" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | | + b | integer | | | generated always as (a * 2) stored +Number of child tables: 1 (Use \d+ to list them.) + +\d gtest30_1 + Table "public.gtest30_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | | + b | integer | | | generated always as (a * 2) stored +Inherits: gtest30 + +ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error +ERROR: cannot drop generation expression from inherited column +-- triggers +CREATE TABLE gtest26 ( + a int PRIMARY KEY, + b int GENERATED ALWAYS AS (a * 2) STORED +); +CREATE FUNCTION gtest_trigger_func() RETURNS trigger + LANGUAGE plpgsql +AS $$ +BEGIN + IF tg_op IN ('DELETE', 'UPDATE') THEN + RAISE INFO '%: %: old = %', TG_NAME, TG_WHEN, OLD; + END IF; + IF tg_op IN ('INSERT', 'UPDATE') THEN + RAISE INFO '%: %: new = %', TG_NAME, TG_WHEN, NEW; + END IF; + IF tg_op = 'DELETE' THEN + RETURN OLD; + ELSE + RETURN NEW; + END IF; +END +$$; +CREATE TRIGGER gtest1 BEFORE DELETE OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (OLD.b < 0) -- ok + EXECUTE PROCEDURE gtest_trigger_func(); +CREATE TRIGGER gtest2a BEFORE INSERT OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (NEW.b < 0) -- error + EXECUTE PROCEDURE gtest_trigger_func(); +ERROR: BEFORE trigger's WHEN condition cannot reference NEW generated columns +LINE 3: WHEN (NEW.b < 0) + ^ +DETAIL: Column "b" is a generated column. +CREATE TRIGGER gtest2b BEFORE INSERT OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (NEW.* IS NOT NULL) -- error + EXECUTE PROCEDURE gtest_trigger_func(); +ERROR: BEFORE trigger's WHEN condition cannot reference NEW generated columns +LINE 3: WHEN (NEW.* IS NOT NULL) + ^ +DETAIL: A whole-row reference is used and the table contains generated columns. +CREATE TRIGGER gtest2 BEFORE INSERT ON gtest26 + FOR EACH ROW + WHEN (NEW.a < 0) + EXECUTE PROCEDURE gtest_trigger_func(); +CREATE TRIGGER gtest3 AFTER DELETE OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (OLD.b < 0) -- ok + EXECUTE PROCEDURE gtest_trigger_func(); +CREATE TRIGGER gtest4 AFTER INSERT OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (NEW.b < 0) -- ok + EXECUTE PROCEDURE gtest_trigger_func(); +INSERT INTO gtest26 (a) VALUES (-2), (0), (3); +INFO: gtest2: BEFORE: new = (-2,) +INFO: gtest4: AFTER: new = (-2,-4) +SELECT * FROM gtest26 ORDER BY a; + a | b +----+---- + -2 | -4 + 0 | 0 + 3 | 6 +(3 rows) + +-- GPDB: There are a few issues with the UPDATE and DELETE test. Firstly, +-- the UPDATE of 'a' fails, because you can't update distribution key column +-- when there's an update trigger on it. Secondly, the INFO messages from the +-- triggers that run on different segments arrive in random order. To fix +-- these issues, drop the primary key, and force all the rows to reside on +-- the same segment. Only confirm data in a single segment is not enough for +-- the case to be soild, we have to make sure the tuple's order is the same. +-- However, "set distributed by" cannot gurantee this because the tuple order +-- from interconnect is not always the same. To achieve the goal, we truncate +-- the table and then re-insert it after set the distkey. +alter table gtest26 drop constraint gtest26_pkey; +alter table gtest26 add column distkey integer; +truncate gtest26; +INSERT INTO gtest26 (a) VALUES (-2), (0), (3); +INFO: gtest2: BEFORE: new = (-2,,) +INFO: gtest4: AFTER: new = (-2,-4,) +alter table gtest26 drop column distkey; +UPDATE gtest26 SET a = a * -2; +INFO: gtest1: BEFORE: old = (-2,-4) +INFO: gtest1: BEFORE: new = (4,) +INFO: gtest3: AFTER: old = (-2,-4) +INFO: gtest3: AFTER: new = (4,8) +INFO: gtest4: AFTER: old = (3,6) +INFO: gtest4: AFTER: new = (-6,-12) +SELECT * FROM gtest26 ORDER BY a; + a | b +----+----- + -6 | -12 + 0 | 0 + 4 | 8 +(3 rows) + +DELETE FROM gtest26 WHERE a = -6; +INFO: gtest1: BEFORE: old = (-6,-12) +INFO: gtest3: AFTER: old = (-6,-12) +SELECT * FROM gtest26 ORDER BY a; + a | b +---+--- + 0 | 0 + 4 | 8 +(2 rows) + +DROP TRIGGER gtest1 ON gtest26; +DROP TRIGGER gtest2 ON gtest26; +DROP TRIGGER gtest3 ON gtest26; +-- Check that an UPDATE of "a" fires the trigger for UPDATE OF b, per +-- SQL standard. +CREATE FUNCTION gtest_trigger_func3() RETURNS trigger + LANGUAGE plpgsql +AS $$ +BEGIN + RAISE NOTICE 'OK'; + RETURN NEW; +END +$$; +CREATE TRIGGER gtest11 BEFORE UPDATE OF b ON gtest26 + FOR EACH ROW + EXECUTE PROCEDURE gtest_trigger_func3(); +UPDATE gtest26 SET a = 1 WHERE a = 0; +NOTICE: OK +DROP TRIGGER gtest11 ON gtest26; +TRUNCATE gtest26; +-- check that modifications of stored generated columns in triggers do +-- not get propagated +CREATE FUNCTION gtest_trigger_func4() RETURNS trigger + LANGUAGE plpgsql +AS $$ +BEGIN + NEW.a = 10; + NEW.b = 300; + RETURN NEW; +END; +$$; +CREATE TRIGGER gtest12_01 BEFORE UPDATE ON gtest26 + FOR EACH ROW + EXECUTE PROCEDURE gtest_trigger_func(); +CREATE TRIGGER gtest12_02 BEFORE UPDATE ON gtest26 + FOR EACH ROW + EXECUTE PROCEDURE gtest_trigger_func4(); +CREATE TRIGGER gtest12_03 BEFORE UPDATE ON gtest26 + FOR EACH ROW + EXECUTE PROCEDURE gtest_trigger_func(); +INSERT INTO gtest26 (a) VALUES (1); +UPDATE gtest26 SET a = 11 WHERE a = 1; +INFO: gtest12_01: BEFORE: old = (1,2) +INFO: gtest12_01: BEFORE: new = (11,) +INFO: gtest12_03: BEFORE: old = (1,2) +INFO: gtest12_03: BEFORE: new = (10,) +SELECT * FROM gtest26 ORDER BY a; + a | b +----+---- + 10 | 20 +(1 row) + +-- LIKE INCLUDING GENERATED and dropped column handling +CREATE TABLE gtest28a ( + a int, + b int, + c int, + x int GENERATED ALWAYS AS (b * 2) STORED +); +ALTER TABLE gtest28a DROP COLUMN a; +CREATE TABLE gtest28b (LIKE gtest28a INCLUDING GENERATED); +\d gtest28* + Table "public.gtest28a" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + b | integer | | | + c | integer | | | + x | integer | | | generated always as (b * 2) stored + + Table "public.gtest28b" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + b | integer | | | + c | integer | | | + x | integer | | | generated always as (b * 2) stored + diff --git a/src/test/singlenode_regress/expected/geometry.out b/src/test/singlenode_regress/expected/geometry.out new file mode 100644 index 00000000000..974e2ec43a4 --- /dev/null +++ b/src/test/singlenode_regress/expected/geometry.out @@ -0,0 +1,5200 @@ +-- +-- GEOMETRY +-- +-- Back off displayed precision a little bit to reduce platform-to-platform +-- variation in results. +SET extra_float_digits TO -3; +-- +-- Points +-- +SELECT center(f1) AS center + FROM BOX_TBL; + center +--------- + (1,1) + (2,2) + (-5,-4) + (2.5,3) + (3,3) +(5 rows) + +SELECT (@@ f1) AS center + FROM BOX_TBL; + center +--------- + (1,1) + (2,2) + (-5,-4) + (2.5,3) + (3,3) +(5 rows) + +SELECT point(f1) AS center + FROM CIRCLE_TBL; + center +----------- + (5,1) + (1,2) + (1,3) + (1,2) + (100,200) + (100,1) + (3,5) + (3,5) +(8 rows) + +SELECT (@@ f1) AS center + FROM CIRCLE_TBL; + center +----------- + (5,1) + (1,2) + (1,3) + (1,2) + (100,200) + (100,1) + (3,5) + (3,5) +(8 rows) + +SELECT (@@ f1) AS center + FROM POLYGON_TBL + WHERE (# f1) > 2; + center +------------------------------- + (1.33333333333,1.33333333333) + (2.33333333333,1.33333333333) + (4,5) + (4,5) + (4,3) +(5 rows) + +-- "is horizontal" function +SELECT p1.f1 + FROM POINT_TBL p1 + WHERE ishorizontal(p1.f1, point '(0,0)'); + f1 +------------------ + (0,0) + (-10,0) + (1e-300,-1e-300) +(3 rows) + +-- "is horizontal" operator +SELECT p1.f1 + FROM POINT_TBL p1 + WHERE p1.f1 ?- point '(0,0)'; + f1 +------------------ + (0,0) + (-10,0) + (1e-300,-1e-300) +(3 rows) + +-- "is vertical" function +SELECT p1.f1 + FROM POINT_TBL p1 + WHERE isvertical(p1.f1, point '(5.1,34.5)'); + f1 +------------ + (5.1,34.5) +(1 row) + +-- "is vertical" operator +SELECT p1.f1 + FROM POINT_TBL p1 + WHERE p1.f1 ?| point '(5.1,34.5)'; + f1 +------------ + (5.1,34.5) +(1 row) + +-- Slope +SELECT p1.f1, p2.f1, slope(p1.f1, p2.f1) FROM POINT_TBL p1, POINT_TBL p2; + f1 | f1 | slope +-------------------+-------------------+---------------- + (0,0) | (0,0) | Infinity + (0,0) | (-10,0) | 0 + (0,0) | (-3,4) | -1.33333333333 + (0,0) | (5.1,34.5) | 6.76470588235 + (0,0) | (-5,-12) | 2.4 + (0,0) | (1e-300,-1e-300) | Infinity + (0,0) | (1e+300,Infinity) | Infinity + (0,0) | (Infinity,1e+300) | 0 + (0,0) | (NaN,NaN) | NaN + (0,0) | (10,10) | 1 + (-10,0) | (0,0) | 0 + (-10,0) | (-10,0) | Infinity + (-10,0) | (-3,4) | 0.571428571429 + (-10,0) | (5.1,34.5) | 2.28476821192 + (-10,0) | (-5,-12) | -2.4 + (-10,0) | (1e-300,-1e-300) | 0 + (-10,0) | (1e+300,Infinity) | Infinity + (-10,0) | (Infinity,1e+300) | 0 + (-10,0) | (NaN,NaN) | NaN + (-10,0) | (10,10) | 0.5 + (-3,4) | (0,0) | -1.33333333333 + (-3,4) | (-10,0) | 0.571428571429 + (-3,4) | (-3,4) | Infinity + (-3,4) | (5.1,34.5) | 3.76543209877 + (-3,4) | (-5,-12) | 8 + (-3,4) | (1e-300,-1e-300) | -1.33333333333 + (-3,4) | (1e+300,Infinity) | Infinity + (-3,4) | (Infinity,1e+300) | 0 + (-3,4) | (NaN,NaN) | NaN + (-3,4) | (10,10) | 0.461538461538 + (5.1,34.5) | (0,0) | 6.76470588235 + (5.1,34.5) | (-10,0) | 2.28476821192 + (5.1,34.5) | (-3,4) | 3.76543209877 + (5.1,34.5) | (5.1,34.5) | Infinity + (5.1,34.5) | (-5,-12) | 4.60396039604 + (5.1,34.5) | (1e-300,-1e-300) | 6.76470588235 + (5.1,34.5) | (1e+300,Infinity) | Infinity + (5.1,34.5) | (Infinity,1e+300) | 0 + (5.1,34.5) | (NaN,NaN) | NaN + (5.1,34.5) | (10,10) | -5 + (-5,-12) | (0,0) | 2.4 + (-5,-12) | (-10,0) | -2.4 + (-5,-12) | (-3,4) | 8 + (-5,-12) | (5.1,34.5) | 4.60396039604 + (-5,-12) | (-5,-12) | Infinity + (-5,-12) | (1e-300,-1e-300) | 2.4 + (-5,-12) | (1e+300,Infinity) | Infinity + (-5,-12) | (Infinity,1e+300) | 0 + (-5,-12) | (NaN,NaN) | NaN + (-5,-12) | (10,10) | 1.46666666667 + (1e-300,-1e-300) | (0,0) | Infinity + (1e-300,-1e-300) | (-10,0) | 0 + (1e-300,-1e-300) | (-3,4) | -1.33333333333 + (1e-300,-1e-300) | (5.1,34.5) | 6.76470588235 + (1e-300,-1e-300) | (-5,-12) | 2.4 + (1e-300,-1e-300) | (1e-300,-1e-300) | Infinity + (1e-300,-1e-300) | (1e+300,Infinity) | Infinity + (1e-300,-1e-300) | (Infinity,1e+300) | 0 + (1e-300,-1e-300) | (NaN,NaN) | NaN + (1e-300,-1e-300) | (10,10) | 1 + (1e+300,Infinity) | (0,0) | Infinity + (1e+300,Infinity) | (-10,0) | Infinity + (1e+300,Infinity) | (-3,4) | Infinity + (1e+300,Infinity) | (5.1,34.5) | Infinity + (1e+300,Infinity) | (-5,-12) | Infinity + (1e+300,Infinity) | (1e-300,-1e-300) | Infinity + (1e+300,Infinity) | (1e+300,Infinity) | Infinity + (1e+300,Infinity) | (Infinity,1e+300) | NaN + (1e+300,Infinity) | (NaN,NaN) | NaN + (1e+300,Infinity) | (10,10) | Infinity + (Infinity,1e+300) | (0,0) | 0 + (Infinity,1e+300) | (-10,0) | 0 + (Infinity,1e+300) | (-3,4) | 0 + (Infinity,1e+300) | (5.1,34.5) | 0 + (Infinity,1e+300) | (-5,-12) | 0 + (Infinity,1e+300) | (1e-300,-1e-300) | 0 + (Infinity,1e+300) | (1e+300,Infinity) | NaN + (Infinity,1e+300) | (Infinity,1e+300) | Infinity + (Infinity,1e+300) | (NaN,NaN) | NaN + (Infinity,1e+300) | (10,10) | 0 + (NaN,NaN) | (0,0) | NaN + (NaN,NaN) | (-10,0) | NaN + (NaN,NaN) | (-3,4) | NaN + (NaN,NaN) | (5.1,34.5) | NaN + (NaN,NaN) | (-5,-12) | NaN + (NaN,NaN) | (1e-300,-1e-300) | NaN + (NaN,NaN) | (1e+300,Infinity) | NaN + (NaN,NaN) | (Infinity,1e+300) | NaN + (NaN,NaN) | (NaN,NaN) | NaN + (NaN,NaN) | (10,10) | NaN + (10,10) | (0,0) | 1 + (10,10) | (-10,0) | 0.5 + (10,10) | (-3,4) | 0.461538461538 + (10,10) | (5.1,34.5) | -5 + (10,10) | (-5,-12) | 1.46666666667 + (10,10) | (1e-300,-1e-300) | 1 + (10,10) | (1e+300,Infinity) | Infinity + (10,10) | (Infinity,1e+300) | 0 + (10,10) | (NaN,NaN) | NaN + (10,10) | (10,10) | Infinity +(100 rows) + +-- Add point +SELECT p1.f1, p2.f1, p1.f1 + p2.f1 FROM POINT_TBL p1, POINT_TBL p2; + f1 | f1 | ?column? +-------------------+-------------------+--------------------- + (0,0) | (0,0) | (0,0) + (0,0) | (-10,0) | (-10,0) + (0,0) | (-3,4) | (-3,4) + (0,0) | (5.1,34.5) | (5.1,34.5) + (0,0) | (-5,-12) | (-5,-12) + (0,0) | (1e-300,-1e-300) | (1e-300,-1e-300) + (0,0) | (1e+300,Infinity) | (1e+300,Infinity) + (0,0) | (Infinity,1e+300) | (Infinity,1e+300) + (0,0) | (NaN,NaN) | (NaN,NaN) + (0,0) | (10,10) | (10,10) + (-10,0) | (0,0) | (-10,0) + (-10,0) | (-10,0) | (-20,0) + (-10,0) | (-3,4) | (-13,4) + (-10,0) | (5.1,34.5) | (-4.9,34.5) + (-10,0) | (-5,-12) | (-15,-12) + (-10,0) | (1e-300,-1e-300) | (-10,-1e-300) + (-10,0) | (1e+300,Infinity) | (1e+300,Infinity) + (-10,0) | (Infinity,1e+300) | (Infinity,1e+300) + (-10,0) | (NaN,NaN) | (NaN,NaN) + (-10,0) | (10,10) | (0,10) + (-3,4) | (0,0) | (-3,4) + (-3,4) | (-10,0) | (-13,4) + (-3,4) | (-3,4) | (-6,8) + (-3,4) | (5.1,34.5) | (2.1,38.5) + (-3,4) | (-5,-12) | (-8,-8) + (-3,4) | (1e-300,-1e-300) | (-3,4) + (-3,4) | (1e+300,Infinity) | (1e+300,Infinity) + (-3,4) | (Infinity,1e+300) | (Infinity,1e+300) + (-3,4) | (NaN,NaN) | (NaN,NaN) + (-3,4) | (10,10) | (7,14) + (5.1,34.5) | (0,0) | (5.1,34.5) + (5.1,34.5) | (-10,0) | (-4.9,34.5) + (5.1,34.5) | (-3,4) | (2.1,38.5) + (5.1,34.5) | (5.1,34.5) | (10.2,69) + (5.1,34.5) | (-5,-12) | (0.1,22.5) + (5.1,34.5) | (1e-300,-1e-300) | (5.1,34.5) + (5.1,34.5) | (1e+300,Infinity) | (1e+300,Infinity) + (5.1,34.5) | (Infinity,1e+300) | (Infinity,1e+300) + (5.1,34.5) | (NaN,NaN) | (NaN,NaN) + (5.1,34.5) | (10,10) | (15.1,44.5) + (-5,-12) | (0,0) | (-5,-12) + (-5,-12) | (-10,0) | (-15,-12) + (-5,-12) | (-3,4) | (-8,-8) + (-5,-12) | (5.1,34.5) | (0.1,22.5) + (-5,-12) | (-5,-12) | (-10,-24) + (-5,-12) | (1e-300,-1e-300) | (-5,-12) + (-5,-12) | (1e+300,Infinity) | (1e+300,Infinity) + (-5,-12) | (Infinity,1e+300) | (Infinity,1e+300) + (-5,-12) | (NaN,NaN) | (NaN,NaN) + (-5,-12) | (10,10) | (5,-2) + (1e-300,-1e-300) | (0,0) | (1e-300,-1e-300) + (1e-300,-1e-300) | (-10,0) | (-10,-1e-300) + (1e-300,-1e-300) | (-3,4) | (-3,4) + (1e-300,-1e-300) | (5.1,34.5) | (5.1,34.5) + (1e-300,-1e-300) | (-5,-12) | (-5,-12) + (1e-300,-1e-300) | (1e-300,-1e-300) | (2e-300,-2e-300) + (1e-300,-1e-300) | (1e+300,Infinity) | (1e+300,Infinity) + (1e-300,-1e-300) | (Infinity,1e+300) | (Infinity,1e+300) + (1e-300,-1e-300) | (NaN,NaN) | (NaN,NaN) + (1e-300,-1e-300) | (10,10) | (10,10) + (1e+300,Infinity) | (0,0) | (1e+300,Infinity) + (1e+300,Infinity) | (-10,0) | (1e+300,Infinity) + (1e+300,Infinity) | (-3,4) | (1e+300,Infinity) + (1e+300,Infinity) | (5.1,34.5) | (1e+300,Infinity) + (1e+300,Infinity) | (-5,-12) | (1e+300,Infinity) + (1e+300,Infinity) | (1e-300,-1e-300) | (1e+300,Infinity) + (1e+300,Infinity) | (1e+300,Infinity) | (2e+300,Infinity) + (1e+300,Infinity) | (Infinity,1e+300) | (Infinity,Infinity) + (1e+300,Infinity) | (NaN,NaN) | (NaN,NaN) + (1e+300,Infinity) | (10,10) | (1e+300,Infinity) + (Infinity,1e+300) | (0,0) | (Infinity,1e+300) + (Infinity,1e+300) | (-10,0) | (Infinity,1e+300) + (Infinity,1e+300) | (-3,4) | (Infinity,1e+300) + (Infinity,1e+300) | (5.1,34.5) | (Infinity,1e+300) + (Infinity,1e+300) | (-5,-12) | (Infinity,1e+300) + (Infinity,1e+300) | (1e-300,-1e-300) | (Infinity,1e+300) + (Infinity,1e+300) | (1e+300,Infinity) | (Infinity,Infinity) + (Infinity,1e+300) | (Infinity,1e+300) | (Infinity,2e+300) + (Infinity,1e+300) | (NaN,NaN) | (NaN,NaN) + (Infinity,1e+300) | (10,10) | (Infinity,1e+300) + (NaN,NaN) | (0,0) | (NaN,NaN) + (NaN,NaN) | (-10,0) | (NaN,NaN) + (NaN,NaN) | (-3,4) | (NaN,NaN) + (NaN,NaN) | (5.1,34.5) | (NaN,NaN) + (NaN,NaN) | (-5,-12) | (NaN,NaN) + (NaN,NaN) | (1e-300,-1e-300) | (NaN,NaN) + (NaN,NaN) | (1e+300,Infinity) | (NaN,NaN) + (NaN,NaN) | (Infinity,1e+300) | (NaN,NaN) + (NaN,NaN) | (NaN,NaN) | (NaN,NaN) + (NaN,NaN) | (10,10) | (NaN,NaN) + (10,10) | (0,0) | (10,10) + (10,10) | (-10,0) | (0,10) + (10,10) | (-3,4) | (7,14) + (10,10) | (5.1,34.5) | (15.1,44.5) + (10,10) | (-5,-12) | (5,-2) + (10,10) | (1e-300,-1e-300) | (10,10) + (10,10) | (1e+300,Infinity) | (1e+300,Infinity) + (10,10) | (Infinity,1e+300) | (Infinity,1e+300) + (10,10) | (NaN,NaN) | (NaN,NaN) + (10,10) | (10,10) | (20,20) +(100 rows) + +-- Subtract point +SELECT p1.f1, p2.f1, p1.f1 - p2.f1 FROM POINT_TBL p1, POINT_TBL p2; + f1 | f1 | ?column? +-------------------+-------------------+---------------------- + (0,0) | (0,0) | (0,0) + (0,0) | (-10,0) | (10,0) + (0,0) | (-3,4) | (3,-4) + (0,0) | (5.1,34.5) | (-5.1,-34.5) + (0,0) | (-5,-12) | (5,12) + (0,0) | (1e-300,-1e-300) | (-1e-300,1e-300) + (0,0) | (1e+300,Infinity) | (-1e+300,-Infinity) + (0,0) | (Infinity,1e+300) | (-Infinity,-1e+300) + (0,0) | (NaN,NaN) | (NaN,NaN) + (0,0) | (10,10) | (-10,-10) + (-10,0) | (0,0) | (-10,0) + (-10,0) | (-10,0) | (0,0) + (-10,0) | (-3,4) | (-7,-4) + (-10,0) | (5.1,34.5) | (-15.1,-34.5) + (-10,0) | (-5,-12) | (-5,12) + (-10,0) | (1e-300,-1e-300) | (-10,1e-300) + (-10,0) | (1e+300,Infinity) | (-1e+300,-Infinity) + (-10,0) | (Infinity,1e+300) | (-Infinity,-1e+300) + (-10,0) | (NaN,NaN) | (NaN,NaN) + (-10,0) | (10,10) | (-20,-10) + (-3,4) | (0,0) | (-3,4) + (-3,4) | (-10,0) | (7,4) + (-3,4) | (-3,4) | (0,0) + (-3,4) | (5.1,34.5) | (-8.1,-30.5) + (-3,4) | (-5,-12) | (2,16) + (-3,4) | (1e-300,-1e-300) | (-3,4) + (-3,4) | (1e+300,Infinity) | (-1e+300,-Infinity) + (-3,4) | (Infinity,1e+300) | (-Infinity,-1e+300) + (-3,4) | (NaN,NaN) | (NaN,NaN) + (-3,4) | (10,10) | (-13,-6) + (5.1,34.5) | (0,0) | (5.1,34.5) + (5.1,34.5) | (-10,0) | (15.1,34.5) + (5.1,34.5) | (-3,4) | (8.1,30.5) + (5.1,34.5) | (5.1,34.5) | (0,0) + (5.1,34.5) | (-5,-12) | (10.1,46.5) + (5.1,34.5) | (1e-300,-1e-300) | (5.1,34.5) + (5.1,34.5) | (1e+300,Infinity) | (-1e+300,-Infinity) + (5.1,34.5) | (Infinity,1e+300) | (-Infinity,-1e+300) + (5.1,34.5) | (NaN,NaN) | (NaN,NaN) + (5.1,34.5) | (10,10) | (-4.9,24.5) + (-5,-12) | (0,0) | (-5,-12) + (-5,-12) | (-10,0) | (5,-12) + (-5,-12) | (-3,4) | (-2,-16) + (-5,-12) | (5.1,34.5) | (-10.1,-46.5) + (-5,-12) | (-5,-12) | (0,0) + (-5,-12) | (1e-300,-1e-300) | (-5,-12) + (-5,-12) | (1e+300,Infinity) | (-1e+300,-Infinity) + (-5,-12) | (Infinity,1e+300) | (-Infinity,-1e+300) + (-5,-12) | (NaN,NaN) | (NaN,NaN) + (-5,-12) | (10,10) | (-15,-22) + (1e-300,-1e-300) | (0,0) | (1e-300,-1e-300) + (1e-300,-1e-300) | (-10,0) | (10,-1e-300) + (1e-300,-1e-300) | (-3,4) | (3,-4) + (1e-300,-1e-300) | (5.1,34.5) | (-5.1,-34.5) + (1e-300,-1e-300) | (-5,-12) | (5,12) + (1e-300,-1e-300) | (1e-300,-1e-300) | (0,0) + (1e-300,-1e-300) | (1e+300,Infinity) | (-1e+300,-Infinity) + (1e-300,-1e-300) | (Infinity,1e+300) | (-Infinity,-1e+300) + (1e-300,-1e-300) | (NaN,NaN) | (NaN,NaN) + (1e-300,-1e-300) | (10,10) | (-10,-10) + (1e+300,Infinity) | (0,0) | (1e+300,Infinity) + (1e+300,Infinity) | (-10,0) | (1e+300,Infinity) + (1e+300,Infinity) | (-3,4) | (1e+300,Infinity) + (1e+300,Infinity) | (5.1,34.5) | (1e+300,Infinity) + (1e+300,Infinity) | (-5,-12) | (1e+300,Infinity) + (1e+300,Infinity) | (1e-300,-1e-300) | (1e+300,Infinity) + (1e+300,Infinity) | (1e+300,Infinity) | (0,NaN) + (1e+300,Infinity) | (Infinity,1e+300) | (-Infinity,Infinity) + (1e+300,Infinity) | (NaN,NaN) | (NaN,NaN) + (1e+300,Infinity) | (10,10) | (1e+300,Infinity) + (Infinity,1e+300) | (0,0) | (Infinity,1e+300) + (Infinity,1e+300) | (-10,0) | (Infinity,1e+300) + (Infinity,1e+300) | (-3,4) | (Infinity,1e+300) + (Infinity,1e+300) | (5.1,34.5) | (Infinity,1e+300) + (Infinity,1e+300) | (-5,-12) | (Infinity,1e+300) + (Infinity,1e+300) | (1e-300,-1e-300) | (Infinity,1e+300) + (Infinity,1e+300) | (1e+300,Infinity) | (Infinity,-Infinity) + (Infinity,1e+300) | (Infinity,1e+300) | (NaN,0) + (Infinity,1e+300) | (NaN,NaN) | (NaN,NaN) + (Infinity,1e+300) | (10,10) | (Infinity,1e+300) + (NaN,NaN) | (0,0) | (NaN,NaN) + (NaN,NaN) | (-10,0) | (NaN,NaN) + (NaN,NaN) | (-3,4) | (NaN,NaN) + (NaN,NaN) | (5.1,34.5) | (NaN,NaN) + (NaN,NaN) | (-5,-12) | (NaN,NaN) + (NaN,NaN) | (1e-300,-1e-300) | (NaN,NaN) + (NaN,NaN) | (1e+300,Infinity) | (NaN,NaN) + (NaN,NaN) | (Infinity,1e+300) | (NaN,NaN) + (NaN,NaN) | (NaN,NaN) | (NaN,NaN) + (NaN,NaN) | (10,10) | (NaN,NaN) + (10,10) | (0,0) | (10,10) + (10,10) | (-10,0) | (20,10) + (10,10) | (-3,4) | (13,6) + (10,10) | (5.1,34.5) | (4.9,-24.5) + (10,10) | (-5,-12) | (15,22) + (10,10) | (1e-300,-1e-300) | (10,10) + (10,10) | (1e+300,Infinity) | (-1e+300,-Infinity) + (10,10) | (Infinity,1e+300) | (-Infinity,-1e+300) + (10,10) | (NaN,NaN) | (NaN,NaN) + (10,10) | (10,10) | (0,0) +(100 rows) + +-- Multiply with point +SELECT p1.f1, p2.f1, p1.f1 * p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1[0] BETWEEN 1 AND 1000; + f1 | f1 | ?column? +------------+-------------------+----------------------- + (5.1,34.5) | (0,0) | (0,0) + (10,10) | (0,0) | (0,0) + (5.1,34.5) | (-10,0) | (-51,-345) + (10,10) | (-10,0) | (-100,-100) + (5.1,34.5) | (-3,4) | (-153.3,-83.1) + (10,10) | (-3,4) | (-70,10) + (5.1,34.5) | (5.1,34.5) | (-1164.24,351.9) + (10,10) | (5.1,34.5) | (-294,396) + (5.1,34.5) | (-5,-12) | (388.5,-233.7) + (10,10) | (-5,-12) | (70,-170) + (5.1,34.5) | (1e-300,-1e-300) | (3.96e-299,2.94e-299) + (10,10) | (1e-300,-1e-300) | (2e-299,0) + (5.1,34.5) | (1e+300,Infinity) | (-Infinity,Infinity) + (10,10) | (1e+300,Infinity) | (-Infinity,Infinity) + (5.1,34.5) | (Infinity,1e+300) | (Infinity,Infinity) + (10,10) | (Infinity,1e+300) | (Infinity,Infinity) + (5.1,34.5) | (NaN,NaN) | (NaN,NaN) + (10,10) | (NaN,NaN) | (NaN,NaN) + (5.1,34.5) | (10,10) | (-294,396) + (10,10) | (10,10) | (0,200) +(20 rows) + +-- Underflow error +SELECT p1.f1, p2.f1, p1.f1 * p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1[0] < 1; +ERROR: value out of range: underflow +-- Divide by point +SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1[0] BETWEEN 1 AND 1000; + f1 | f1 | ?column? +-------------------+------------+------------------------------------------- + (0,0) | (5.1,34.5) | (0,0) + (0,0) | (10,10) | (0,0) + (-10,0) | (5.1,34.5) | (-0.0419318237877,0.283656455034) + (-10,0) | (10,10) | (-0.5,0.5) + (-3,4) | (5.1,34.5) | (0.100883034877,0.101869666025) + (-3,4) | (10,10) | (0.05,0.35) + (5.1,34.5) | (5.1,34.5) | (1,0) + (5.1,34.5) | (10,10) | (1.98,1.47) + (-5,-12) | (5.1,34.5) | (-0.361353657935,0.0915100389719) + (-5,-12) | (10,10) | (-0.85,-0.35) + (1e-300,-1e-300) | (5.1,34.5) | (-2.41724631247e-302,-3.25588278822e-302) + (1e-300,-1e-300) | (10,10) | (0,-1e-301) + (1e+300,Infinity) | (5.1,34.5) | (Infinity,Infinity) + (1e+300,Infinity) | (10,10) | (Infinity,Infinity) + (Infinity,1e+300) | (5.1,34.5) | (Infinity,-Infinity) + (Infinity,1e+300) | (10,10) | (Infinity,-Infinity) + (NaN,NaN) | (5.1,34.5) | (NaN,NaN) + (NaN,NaN) | (10,10) | (NaN,NaN) + (10,10) | (5.1,34.5) | (0.325588278822,-0.241724631247) + (10,10) | (10,10) | (1,0) +(20 rows) + +-- Overflow error +SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1[0] > 1000; +ERROR: value out of range: overflow +-- Division by 0 error +SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1 ~= '(0,0)'::point; +ERROR: division by zero +-- Distance to line +SELECT p.f1, l.s, p.f1 <-> l.s AS dist_pl, l.s <-> p.f1 AS dist_lp FROM POINT_TBL p, LINE_TBL l; + f1 | s | dist_pl | dist_lp +-------------------+---------------------------------------+--------------------+-------------------- + (0,0) | {0,-1,5} | 5 | 5 + (0,0) | {1,0,5} | 5 | 5 + (0,0) | {0,3,0} | 0 | 0 + (0,0) | {1,-1,0} | 0 | 0 + (0,0) | {-0.4,-1,-6} | 5.57086014531 | 5.57086014531 + (0,0) | {-0.000184615384615,-1,15.3846153846} | 15.3846151224 | 15.3846151224 + (0,0) | {3,NaN,5} | NaN | NaN + (0,0) | {NaN,NaN,NaN} | NaN | NaN + (0,0) | {0,-1,3} | 3 | 3 + (0,0) | {-1,0,3} | 3 | 3 + (-10,0) | {0,-1,5} | 5 | 5 + (-10,0) | {1,0,5} | 5 | 5 + (-10,0) | {0,3,0} | 0 | 0 + (-10,0) | {1,-1,0} | 7.07106781187 | 7.07106781187 + (-10,0) | {-0.4,-1,-6} | 1.85695338177 | 1.85695338177 + (-10,0) | {-0.000184615384615,-1,15.3846153846} | 15.3864612763 | 15.3864612763 + (-10,0) | {3,NaN,5} | NaN | NaN + (-10,0) | {NaN,NaN,NaN} | NaN | NaN + (-10,0) | {0,-1,3} | 3 | 3 + (-10,0) | {-1,0,3} | 13 | 13 + (-3,4) | {0,-1,5} | 1 | 1 + (-3,4) | {1,0,5} | 2 | 2 + (-3,4) | {0,3,0} | 4 | 4 + (-3,4) | {1,-1,0} | 4.94974746831 | 4.94974746831 + (-3,4) | {-0.4,-1,-6} | 8.17059487979 | 8.17059487979 + (-3,4) | {-0.000184615384615,-1,15.3846153846} | 11.3851690368 | 11.3851690368 + (-3,4) | {3,NaN,5} | NaN | NaN + (-3,4) | {NaN,NaN,NaN} | NaN | NaN + (-3,4) | {0,-1,3} | 1 | 1 + (-3,4) | {-1,0,3} | 6 | 6 + (5.1,34.5) | {0,-1,5} | 29.5 | 29.5 + (5.1,34.5) | {1,0,5} | 10.1 | 10.1 + (5.1,34.5) | {0,3,0} | 34.5 | 34.5 + (5.1,34.5) | {1,-1,0} | 20.7889393669 | 20.7889393669 + (5.1,34.5) | {-0.4,-1,-6} | 39.4973984303 | 39.4973984303 + (5.1,34.5) | {-0.000184615384615,-1,15.3846153846} | 19.1163258281 | 19.1163258281 + (5.1,34.5) | {3,NaN,5} | NaN | NaN + (5.1,34.5) | {NaN,NaN,NaN} | NaN | NaN + (5.1,34.5) | {0,-1,3} | 31.5 | 31.5 + (5.1,34.5) | {-1,0,3} | 2.1 | 2.1 + (-5,-12) | {0,-1,5} | 17 | 17 + (-5,-12) | {1,0,5} | 0 | 0 + (-5,-12) | {0,3,0} | 12 | 12 + (-5,-12) | {1,-1,0} | 4.94974746831 | 4.94974746831 + (-5,-12) | {-0.4,-1,-6} | 7.42781352708 | 7.42781352708 + (-5,-12) | {-0.000184615384615,-1,15.3846153846} | 27.3855379948 | 27.3855379948 + (-5,-12) | {3,NaN,5} | NaN | NaN + (-5,-12) | {NaN,NaN,NaN} | NaN | NaN + (-5,-12) | {0,-1,3} | 15 | 15 + (-5,-12) | {-1,0,3} | 8 | 8 + (1e-300,-1e-300) | {0,-1,5} | 5 | 5 + (1e-300,-1e-300) | {1,0,5} | 5 | 5 + (1e-300,-1e-300) | {0,3,0} | 1e-300 | 1e-300 + (1e-300,-1e-300) | {1,-1,0} | 1.41421356237e-300 | 1.41421356237e-300 + (1e-300,-1e-300) | {-0.4,-1,-6} | 5.57086014531 | 5.57086014531 + (1e-300,-1e-300) | {-0.000184615384615,-1,15.3846153846} | 15.3846151224 | 15.3846151224 + (1e-300,-1e-300) | {3,NaN,5} | NaN | NaN + (1e-300,-1e-300) | {NaN,NaN,NaN} | NaN | NaN + (1e-300,-1e-300) | {0,-1,3} | 3 | 3 + (1e-300,-1e-300) | {-1,0,3} | 3 | 3 + (1e+300,Infinity) | {0,-1,5} | Infinity | Infinity + (1e+300,Infinity) | {1,0,5} | NaN | NaN + (1e+300,Infinity) | {0,3,0} | Infinity | Infinity + (1e+300,Infinity) | {1,-1,0} | Infinity | Infinity + (1e+300,Infinity) | {-0.4,-1,-6} | Infinity | Infinity + (1e+300,Infinity) | {-0.000184615384615,-1,15.3846153846} | Infinity | Infinity + (1e+300,Infinity) | {3,NaN,5} | NaN | NaN + (1e+300,Infinity) | {NaN,NaN,NaN} | NaN | NaN + (1e+300,Infinity) | {0,-1,3} | Infinity | Infinity + (1e+300,Infinity) | {-1,0,3} | NaN | NaN + (Infinity,1e+300) | {0,-1,5} | NaN | NaN + (Infinity,1e+300) | {1,0,5} | Infinity | Infinity + (Infinity,1e+300) | {0,3,0} | NaN | NaN + (Infinity,1e+300) | {1,-1,0} | NaN | NaN + (Infinity,1e+300) | {-0.4,-1,-6} | NaN | NaN + (Infinity,1e+300) | {-0.000184615384615,-1,15.3846153846} | NaN | NaN + (Infinity,1e+300) | {3,NaN,5} | NaN | NaN + (Infinity,1e+300) | {NaN,NaN,NaN} | NaN | NaN + (Infinity,1e+300) | {0,-1,3} | NaN | NaN + (Infinity,1e+300) | {-1,0,3} | Infinity | Infinity + (NaN,NaN) | {0,-1,5} | NaN | NaN + (NaN,NaN) | {1,0,5} | NaN | NaN + (NaN,NaN) | {0,3,0} | NaN | NaN + (NaN,NaN) | {1,-1,0} | NaN | NaN + (NaN,NaN) | {-0.4,-1,-6} | NaN | NaN + (NaN,NaN) | {-0.000184615384615,-1,15.3846153846} | NaN | NaN + (NaN,NaN) | {3,NaN,5} | NaN | NaN + (NaN,NaN) | {NaN,NaN,NaN} | NaN | NaN + (NaN,NaN) | {0,-1,3} | NaN | NaN + (NaN,NaN) | {-1,0,3} | NaN | NaN + (10,10) | {0,-1,5} | 5 | 5 + (10,10) | {1,0,5} | 15 | 15 + (10,10) | {0,3,0} | 10 | 10 + (10,10) | {1,-1,0} | 0 | 0 + (10,10) | {-0.4,-1,-6} | 18.5695338177 | 18.5695338177 + (10,10) | {-0.000184615384615,-1,15.3846153846} | 5.38276913903 | 5.38276913903 + (10,10) | {3,NaN,5} | NaN | NaN + (10,10) | {NaN,NaN,NaN} | NaN | NaN + (10,10) | {0,-1,3} | 7 | 7 + (10,10) | {-1,0,3} | 7 | 7 +(100 rows) + +-- Distance to line segment +SELECT p.f1, l.s, p.f1 <-> l.s AS dist_ps, l.s <-> p.f1 AS dist_sp FROM POINT_TBL p, LSEG_TBL l; + f1 | s | dist_ps | dist_sp +-------------------+-------------------------------+--------------------+-------------------- + (0,0) | [(1,2),(3,4)] | 2.2360679775 | 2.2360679775 + (0,0) | [(0,0),(6,6)] | 0 | 0 + (0,0) | [(10,-10),(-3,-4)] | 4.88901207039 | 4.88901207039 + (0,0) | [(-1000000,200),(300000,-40)] | 15.3846151224 | 15.3846151224 + (0,0) | [(11,22),(33,44)] | 24.5967477525 | 24.5967477525 + (0,0) | [(-10,2),(-10,3)] | 10.1980390272 | 10.1980390272 + (0,0) | [(0,-20),(30,-20)] | 20 | 20 + (0,0) | [(NaN,1),(NaN,90)] | NaN | NaN + (-10,0) | [(1,2),(3,4)] | 11.1803398875 | 11.1803398875 + (-10,0) | [(0,0),(6,6)] | 10 | 10 + (-10,0) | [(10,-10),(-3,-4)] | 8.0622577483 | 8.0622577483 + (-10,0) | [(-1000000,200),(300000,-40)] | 15.3864612763 | 15.3864612763 + (-10,0) | [(11,22),(33,44)] | 30.4138126515 | 30.4138126515 + (-10,0) | [(-10,2),(-10,3)] | 2 | 2 + (-10,0) | [(0,-20),(30,-20)] | 22.360679775 | 22.360679775 + (-10,0) | [(NaN,1),(NaN,90)] | NaN | NaN + (-3,4) | [(1,2),(3,4)] | 4.472135955 | 4.472135955 + (-3,4) | [(0,0),(6,6)] | 4.94974746831 | 4.94974746831 + (-3,4) | [(10,-10),(-3,-4)] | 8 | 8 + (-3,4) | [(-1000000,200),(300000,-40)] | 11.3851690367 | 11.3851690367 + (-3,4) | [(11,22),(33,44)] | 22.803508502 | 22.803508502 + (-3,4) | [(-10,2),(-10,3)] | 7.07106781187 | 7.07106781187 + (-3,4) | [(0,-20),(30,-20)] | 24.1867732449 | 24.1867732449 + (-3,4) | [(NaN,1),(NaN,90)] | NaN | NaN + (5.1,34.5) | [(1,2),(3,4)] | 30.5722096028 | 30.5722096028 + (5.1,34.5) | [(0,0),(6,6)] | 28.5142069853 | 28.5142069853 + (5.1,34.5) | [(10,-10),(-3,-4)] | 39.3428519556 | 39.3428519556 + (5.1,34.5) | [(-1000000,200),(300000,-40)] | 19.1163258281 | 19.1163258281 + (5.1,34.5) | [(11,22),(33,44)] | 13.0107647738 | 13.0107647738 + (5.1,34.5) | [(-10,2),(-10,3)] | 34.932220084 | 34.932220084 + (5.1,34.5) | [(0,-20),(30,-20)] | 54.5 | 54.5 + (5.1,34.5) | [(NaN,1),(NaN,90)] | NaN | NaN + (-5,-12) | [(1,2),(3,4)] | 15.2315462117 | 15.2315462117 + (-5,-12) | [(0,0),(6,6)] | 13 | 13 + (-5,-12) | [(10,-10),(-3,-4)] | 8.10179143093 | 8.10179143093 + (-5,-12) | [(-1000000,200),(300000,-40)] | 27.3855379949 | 27.3855379949 + (-5,-12) | [(11,22),(33,44)] | 37.5765884561 | 37.5765884561 + (-5,-12) | [(-10,2),(-10,3)] | 14.8660687473 | 14.8660687473 + (-5,-12) | [(0,-20),(30,-20)] | 9.43398113206 | 9.43398113206 + (-5,-12) | [(NaN,1),(NaN,90)] | NaN | NaN + (1e-300,-1e-300) | [(1,2),(3,4)] | 2.2360679775 | 2.2360679775 + (1e-300,-1e-300) | [(0,0),(6,6)] | 1.41421356237e-300 | 1.41421356237e-300 + (1e-300,-1e-300) | [(10,-10),(-3,-4)] | 4.88901207039 | 4.88901207039 + (1e-300,-1e-300) | [(-1000000,200),(300000,-40)] | 15.3846151224 | 15.3846151224 + (1e-300,-1e-300) | [(11,22),(33,44)] | 24.5967477525 | 24.5967477525 + (1e-300,-1e-300) | [(-10,2),(-10,3)] | 10.1980390272 | 10.1980390272 + (1e-300,-1e-300) | [(0,-20),(30,-20)] | 20 | 20 + (1e-300,-1e-300) | [(NaN,1),(NaN,90)] | NaN | NaN + (1e+300,Infinity) | [(1,2),(3,4)] | Infinity | Infinity + (1e+300,Infinity) | [(0,0),(6,6)] | Infinity | Infinity + (1e+300,Infinity) | [(10,-10),(-3,-4)] | Infinity | Infinity + (1e+300,Infinity) | [(-1000000,200),(300000,-40)] | Infinity | Infinity + (1e+300,Infinity) | [(11,22),(33,44)] | Infinity | Infinity + (1e+300,Infinity) | [(-10,2),(-10,3)] | Infinity | Infinity + (1e+300,Infinity) | [(0,-20),(30,-20)] | Infinity | Infinity + (1e+300,Infinity) | [(NaN,1),(NaN,90)] | Infinity | Infinity + (Infinity,1e+300) | [(1,2),(3,4)] | Infinity | Infinity + (Infinity,1e+300) | [(0,0),(6,6)] | Infinity | Infinity + (Infinity,1e+300) | [(10,-10),(-3,-4)] | Infinity | Infinity + (Infinity,1e+300) | [(-1000000,200),(300000,-40)] | Infinity | Infinity + (Infinity,1e+300) | [(11,22),(33,44)] | Infinity | Infinity + (Infinity,1e+300) | [(-10,2),(-10,3)] | Infinity | Infinity + (Infinity,1e+300) | [(0,-20),(30,-20)] | Infinity | Infinity + (Infinity,1e+300) | [(NaN,1),(NaN,90)] | NaN | NaN + (NaN,NaN) | [(1,2),(3,4)] | NaN | NaN + (NaN,NaN) | [(0,0),(6,6)] | NaN | NaN + (NaN,NaN) | [(10,-10),(-3,-4)] | NaN | NaN + (NaN,NaN) | [(-1000000,200),(300000,-40)] | NaN | NaN + (NaN,NaN) | [(11,22),(33,44)] | NaN | NaN + (NaN,NaN) | [(-10,2),(-10,3)] | NaN | NaN + (NaN,NaN) | [(0,-20),(30,-20)] | NaN | NaN + (NaN,NaN) | [(NaN,1),(NaN,90)] | NaN | NaN + (10,10) | [(1,2),(3,4)] | 9.21954445729 | 9.21954445729 + (10,10) | [(0,0),(6,6)] | 5.65685424949 | 5.65685424949 + (10,10) | [(10,-10),(-3,-4)] | 18.15918769 | 18.15918769 + (10,10) | [(-1000000,200),(300000,-40)] | 5.38276913904 | 5.38276913904 + (10,10) | [(11,22),(33,44)] | 12.0415945788 | 12.0415945788 + (10,10) | [(-10,2),(-10,3)] | 21.1896201004 | 21.1896201004 + (10,10) | [(0,-20),(30,-20)] | 30 | 30 + (10,10) | [(NaN,1),(NaN,90)] | NaN | NaN +(80 rows) + +-- Distance to box +SELECT p.f1, b.f1, p.f1 <-> b.f1 AS dist_pb, b.f1 <-> p.f1 AS dist_bp FROM POINT_TBL p, BOX_TBL b; + f1 | f1 | dist_pb | dist_bp +-------------------+---------------------+--------------------+-------------------- + (0,0) | (2,2),(0,0) | 0 | 0 + (0,0) | (3,3),(1,1) | 1.41421356237 | 1.41421356237 + (0,0) | (-2,2),(-8,-10) | 2 | 2 + (0,0) | (2.5,3.5),(2.5,2.5) | 3.53553390593 | 3.53553390593 + (0,0) | (3,3),(3,3) | 4.24264068712 | 4.24264068712 + (-10,0) | (2,2),(0,0) | 10 | 10 + (-10,0) | (3,3),(1,1) | 11.0453610172 | 11.0453610172 + (-10,0) | (-2,2),(-8,-10) | 2 | 2 + (-10,0) | (2.5,3.5),(2.5,2.5) | 12.747548784 | 12.747548784 + (-10,0) | (3,3),(3,3) | 13.3416640641 | 13.3416640641 + (-3,4) | (2,2),(0,0) | 3.60555127546 | 3.60555127546 + (-3,4) | (3,3),(1,1) | 4.12310562562 | 4.12310562562 + (-3,4) | (-2,2),(-8,-10) | 2 | 2 + (-3,4) | (2.5,3.5),(2.5,2.5) | 5.52268050859 | 5.52268050859 + (-3,4) | (3,3),(3,3) | 6.0827625303 | 6.0827625303 + (5.1,34.5) | (2,2),(0,0) | 32.6475113906 | 32.6475113906 + (5.1,34.5) | (3,3),(1,1) | 31.5699223946 | 31.5699223946 + (5.1,34.5) | (-2,2),(-8,-10) | 33.2664996656 | 33.2664996656 + (5.1,34.5) | (2.5,3.5),(2.5,2.5) | 31.108841187 | 31.108841187 + (5.1,34.5) | (3,3),(3,3) | 31.5699223946 | 31.5699223946 + (-5,-12) | (2,2),(0,0) | 13 | 13 + (-5,-12) | (3,3),(1,1) | 14.3178210633 | 14.3178210633 + (-5,-12) | (-2,2),(-8,-10) | 2 | 2 + (-5,-12) | (2.5,3.5),(2.5,2.5) | 16.3248277173 | 16.3248277173 + (-5,-12) | (3,3),(3,3) | 17 | 17 + (1e-300,-1e-300) | (2,2),(0,0) | 1.41421356237e-300 | 1.41421356237e-300 + (1e-300,-1e-300) | (3,3),(1,1) | 1.41421356237 | 1.41421356237 + (1e-300,-1e-300) | (-2,2),(-8,-10) | 2 | 2 + (1e-300,-1e-300) | (2.5,3.5),(2.5,2.5) | 3.53553390593 | 3.53553390593 + (1e-300,-1e-300) | (3,3),(3,3) | 4.24264068712 | 4.24264068712 + (1e+300,Infinity) | (2,2),(0,0) | Infinity | Infinity + (1e+300,Infinity) | (3,3),(1,1) | Infinity | Infinity + (1e+300,Infinity) | (-2,2),(-8,-10) | Infinity | Infinity + (1e+300,Infinity) | (2.5,3.5),(2.5,2.5) | Infinity | Infinity + (1e+300,Infinity) | (3,3),(3,3) | Infinity | Infinity + (Infinity,1e+300) | (2,2),(0,0) | Infinity | Infinity + (Infinity,1e+300) | (3,3),(1,1) | Infinity | Infinity + (Infinity,1e+300) | (-2,2),(-8,-10) | Infinity | Infinity + (Infinity,1e+300) | (2.5,3.5),(2.5,2.5) | Infinity | Infinity + (Infinity,1e+300) | (3,3),(3,3) | Infinity | Infinity + (NaN,NaN) | (2,2),(0,0) | NaN | NaN + (NaN,NaN) | (3,3),(1,1) | NaN | NaN + (NaN,NaN) | (-2,2),(-8,-10) | NaN | NaN + (NaN,NaN) | (2.5,3.5),(2.5,2.5) | NaN | NaN + (NaN,NaN) | (3,3),(3,3) | NaN | NaN + (10,10) | (2,2),(0,0) | 11.313708499 | 11.313708499 + (10,10) | (3,3),(1,1) | 9.89949493661 | 9.89949493661 + (10,10) | (-2,2),(-8,-10) | 14.4222051019 | 14.4222051019 + (10,10) | (2.5,3.5),(2.5,2.5) | 9.92471662064 | 9.92471662064 + (10,10) | (3,3),(3,3) | 9.89949493661 | 9.89949493661 +(50 rows) + +-- Distance to path +SELECT p.f1, p1.f1, p.f1 <-> p1.f1 AS dist_ppath, p1.f1 <-> p.f1 AS dist_pathp FROM POINT_TBL p, PATH_TBL p1; + f1 | f1 | dist_ppath | dist_pathp +-------------------+---------------------------+--------------------+-------------------- + (0,0) | [(1,2),(3,4)] | 2.2360679775 | 2.2360679775 + (0,0) | ((1,2),(3,4)) | 2.2360679775 | 2.2360679775 + (0,0) | [(0,0),(3,0),(4,5),(1,6)] | 0 | 0 + (0,0) | ((1,2),(3,4)) | 2.2360679775 | 2.2360679775 + (0,0) | ((1,2),(3,4)) | 2.2360679775 | 2.2360679775 + (0,0) | [(1,2),(3,4)] | 2.2360679775 | 2.2360679775 + (0,0) | ((10,20)) | 22.360679775 | 22.360679775 + (0,0) | [(11,12),(13,14)] | 16.2788205961 | 16.2788205961 + (0,0) | ((11,12),(13,14)) | 16.2788205961 | 16.2788205961 + (-10,0) | [(1,2),(3,4)] | 11.1803398875 | 11.1803398875 + (-10,0) | ((1,2),(3,4)) | 11.1803398875 | 11.1803398875 + (-10,0) | [(0,0),(3,0),(4,5),(1,6)] | 10 | 10 + (-10,0) | ((1,2),(3,4)) | 11.1803398875 | 11.1803398875 + (-10,0) | ((1,2),(3,4)) | 11.1803398875 | 11.1803398875 + (-10,0) | [(1,2),(3,4)] | 11.1803398875 | 11.1803398875 + (-10,0) | ((10,20)) | 28.2842712475 | 28.2842712475 + (-10,0) | [(11,12),(13,14)] | 24.1867732449 | 24.1867732449 + (-10,0) | ((11,12),(13,14)) | 24.1867732449 | 24.1867732449 + (-3,4) | [(1,2),(3,4)] | 4.472135955 | 4.472135955 + (-3,4) | ((1,2),(3,4)) | 4.472135955 | 4.472135955 + (-3,4) | [(0,0),(3,0),(4,5),(1,6)] | 4.472135955 | 4.472135955 + (-3,4) | ((1,2),(3,4)) | 4.472135955 | 4.472135955 + (-3,4) | ((1,2),(3,4)) | 4.472135955 | 4.472135955 + (-3,4) | [(1,2),(3,4)] | 4.472135955 | 4.472135955 + (-3,4) | ((10,20)) | 20.6155281281 | 20.6155281281 + (-3,4) | [(11,12),(13,14)] | 16.1245154966 | 16.1245154966 + (-3,4) | ((11,12),(13,14)) | 16.1245154966 | 16.1245154966 + (5.1,34.5) | [(1,2),(3,4)] | 30.5722096028 | 30.5722096028 + (5.1,34.5) | ((1,2),(3,4)) | 30.5722096028 | 30.5722096028 + (5.1,34.5) | [(0,0),(3,0),(4,5),(1,6)] | 28.793402022 | 28.793402022 + (5.1,34.5) | ((1,2),(3,4)) | 30.5722096028 | 30.5722096028 + (5.1,34.5) | ((1,2),(3,4)) | 30.5722096028 | 30.5722096028 + (5.1,34.5) | [(1,2),(3,4)] | 30.5722096028 | 30.5722096028 + (5.1,34.5) | ((10,20)) | 15.3055545473 | 15.3055545473 + (5.1,34.5) | [(11,12),(13,14)] | 21.9695243462 | 21.9695243462 + (5.1,34.5) | ((11,12),(13,14)) | 21.9695243462 | 21.9695243462 + (-5,-12) | [(1,2),(3,4)] | 15.2315462117 | 15.2315462117 + (-5,-12) | ((1,2),(3,4)) | 15.2315462117 | 15.2315462117 + (-5,-12) | [(0,0),(3,0),(4,5),(1,6)] | 13 | 13 + (-5,-12) | ((1,2),(3,4)) | 15.2315462117 | 15.2315462117 + (-5,-12) | ((1,2),(3,4)) | 15.2315462117 | 15.2315462117 + (-5,-12) | [(1,2),(3,4)] | 15.2315462117 | 15.2315462117 + (-5,-12) | ((10,20)) | 35.3411940941 | 35.3411940941 + (-5,-12) | [(11,12),(13,14)] | 28.8444102037 | 28.8444102037 + (-5,-12) | ((11,12),(13,14)) | 28.8444102037 | 28.8444102037 + (1e-300,-1e-300) | [(1,2),(3,4)] | 2.2360679775 | 2.2360679775 + (1e-300,-1e-300) | ((1,2),(3,4)) | 2.2360679775 | 2.2360679775 + (1e-300,-1e-300) | [(0,0),(3,0),(4,5),(1,6)] | 1.41421356237e-300 | 1.41421356237e-300 + (1e-300,-1e-300) | ((1,2),(3,4)) | 2.2360679775 | 2.2360679775 + (1e-300,-1e-300) | ((1,2),(3,4)) | 2.2360679775 | 2.2360679775 + (1e-300,-1e-300) | [(1,2),(3,4)] | 2.2360679775 | 2.2360679775 + (1e-300,-1e-300) | ((10,20)) | 22.360679775 | 22.360679775 + (1e-300,-1e-300) | [(11,12),(13,14)] | 16.2788205961 | 16.2788205961 + (1e-300,-1e-300) | ((11,12),(13,14)) | 16.2788205961 | 16.2788205961 + (1e+300,Infinity) | [(1,2),(3,4)] | Infinity | Infinity + (1e+300,Infinity) | ((1,2),(3,4)) | Infinity | Infinity + (1e+300,Infinity) | [(0,0),(3,0),(4,5),(1,6)] | Infinity | Infinity + (1e+300,Infinity) | ((1,2),(3,4)) | Infinity | Infinity + (1e+300,Infinity) | ((1,2),(3,4)) | Infinity | Infinity + (1e+300,Infinity) | [(1,2),(3,4)] | Infinity | Infinity + (1e+300,Infinity) | ((10,20)) | Infinity | Infinity + (1e+300,Infinity) | [(11,12),(13,14)] | Infinity | Infinity + (1e+300,Infinity) | ((11,12),(13,14)) | Infinity | Infinity + (Infinity,1e+300) | [(1,2),(3,4)] | Infinity | Infinity + (Infinity,1e+300) | ((1,2),(3,4)) | Infinity | Infinity + (Infinity,1e+300) | [(0,0),(3,0),(4,5),(1,6)] | Infinity | Infinity + (Infinity,1e+300) | ((1,2),(3,4)) | Infinity | Infinity + (Infinity,1e+300) | ((1,2),(3,4)) | Infinity | Infinity + (Infinity,1e+300) | [(1,2),(3,4)] | Infinity | Infinity + (Infinity,1e+300) | ((10,20)) | Infinity | Infinity + (Infinity,1e+300) | [(11,12),(13,14)] | Infinity | Infinity + (Infinity,1e+300) | ((11,12),(13,14)) | Infinity | Infinity + (NaN,NaN) | [(1,2),(3,4)] | NaN | NaN + (NaN,NaN) | ((1,2),(3,4)) | NaN | NaN + (NaN,NaN) | [(0,0),(3,0),(4,5),(1,6)] | NaN | NaN + (NaN,NaN) | ((1,2),(3,4)) | NaN | NaN + (NaN,NaN) | ((1,2),(3,4)) | NaN | NaN + (NaN,NaN) | [(1,2),(3,4)] | NaN | NaN + (NaN,NaN) | ((10,20)) | NaN | NaN + (NaN,NaN) | [(11,12),(13,14)] | NaN | NaN + (NaN,NaN) | ((11,12),(13,14)) | NaN | NaN + (10,10) | [(1,2),(3,4)] | 9.21954445729 | 9.21954445729 + (10,10) | ((1,2),(3,4)) | 9.21954445729 | 9.21954445729 + (10,10) | [(0,0),(3,0),(4,5),(1,6)] | 7.81024967591 | 7.81024967591 + (10,10) | ((1,2),(3,4)) | 9.21954445729 | 9.21954445729 + (10,10) | ((1,2),(3,4)) | 9.21954445729 | 9.21954445729 + (10,10) | [(1,2),(3,4)] | 9.21954445729 | 9.21954445729 + (10,10) | ((10,20)) | 10 | 10 + (10,10) | [(11,12),(13,14)] | 2.2360679775 | 2.2360679775 + (10,10) | ((11,12),(13,14)) | 2.2360679775 | 2.2360679775 +(90 rows) + +-- Distance to polygon +SELECT p.f1, p1.f1, p.f1 <-> p1.f1 AS dist_ppoly, p1.f1 <-> p.f1 AS dist_polyp FROM POINT_TBL p, POLYGON_TBL p1; + f1 | f1 | dist_ppoly | dist_polyp +-------------------+----------------------------+---------------+--------------- + (0,0) | ((2,0),(2,4),(0,0)) | 0 | 0 + (0,0) | ((3,1),(3,3),(1,0)) | 1 | 1 + (0,0) | ((1,2),(3,4),(5,6),(7,8)) | 2.2360679775 | 2.2360679775 + (0,0) | ((7,8),(5,6),(3,4),(1,2)) | 2.2360679775 | 2.2360679775 + (0,0) | ((1,2),(7,8),(5,6),(3,-4)) | 1.58113883008 | 1.58113883008 + (0,0) | ((0,0)) | 0 | 0 + (0,0) | ((0,1),(0,1)) | 1 | 1 + (-10,0) | ((2,0),(2,4),(0,0)) | 10 | 10 + (-10,0) | ((3,1),(3,3),(1,0)) | 11 | 11 + (-10,0) | ((1,2),(3,4),(5,6),(7,8)) | 11.1803398875 | 11.1803398875 + (-10,0) | ((7,8),(5,6),(3,4),(1,2)) | 11.1803398875 | 11.1803398875 + (-10,0) | ((1,2),(7,8),(5,6),(3,-4)) | 11.1803398875 | 11.1803398875 + (-10,0) | ((0,0)) | 10 | 10 + (-10,0) | ((0,1),(0,1)) | 10.0498756211 | 10.0498756211 + (-3,4) | ((2,0),(2,4),(0,0)) | 4.472135955 | 4.472135955 + (-3,4) | ((3,1),(3,3),(1,0)) | 5.54700196225 | 5.54700196225 + (-3,4) | ((1,2),(3,4),(5,6),(7,8)) | 4.472135955 | 4.472135955 + (-3,4) | ((7,8),(5,6),(3,4),(1,2)) | 4.472135955 | 4.472135955 + (-3,4) | ((1,2),(7,8),(5,6),(3,-4)) | 4.472135955 | 4.472135955 + (-3,4) | ((0,0)) | 5 | 5 + (-3,4) | ((0,1),(0,1)) | 4.24264068712 | 4.24264068712 + (5.1,34.5) | ((2,0),(2,4),(0,0)) | 30.6571362002 | 30.6571362002 + (5.1,34.5) | ((3,1),(3,3),(1,0)) | 31.5699223946 | 31.5699223946 + (5.1,34.5) | ((1,2),(3,4),(5,6),(7,8)) | 26.5680258958 | 26.5680258958 + (5.1,34.5) | ((7,8),(5,6),(3,4),(1,2)) | 26.5680258958 | 26.5680258958 + (5.1,34.5) | ((1,2),(7,8),(5,6),(3,-4)) | 26.5680258958 | 26.5680258958 + (5.1,34.5) | ((0,0)) | 34.8749193547 | 34.8749193547 + (5.1,34.5) | ((0,1),(0,1)) | 33.8859853037 | 33.8859853037 + (-5,-12) | ((2,0),(2,4),(0,0)) | 13 | 13 + (-5,-12) | ((3,1),(3,3),(1,0)) | 13.416407865 | 13.416407865 + (-5,-12) | ((1,2),(3,4),(5,6),(7,8)) | 15.2315462117 | 15.2315462117 + (-5,-12) | ((7,8),(5,6),(3,4),(1,2)) | 15.2315462117 | 15.2315462117 + (-5,-12) | ((1,2),(7,8),(5,6),(3,-4)) | 11.313708499 | 11.313708499 + (-5,-12) | ((0,0)) | 13 | 13 + (-5,-12) | ((0,1),(0,1)) | 13.9283882772 | 13.9283882772 + (1e-300,-1e-300) | ((2,0),(2,4),(0,0)) | 0 | 0 + (1e-300,-1e-300) | ((3,1),(3,3),(1,0)) | 1 | 1 + (1e-300,-1e-300) | ((1,2),(3,4),(5,6),(7,8)) | 2.2360679775 | 2.2360679775 + (1e-300,-1e-300) | ((7,8),(5,6),(3,4),(1,2)) | 2.2360679775 | 2.2360679775 + (1e-300,-1e-300) | ((1,2),(7,8),(5,6),(3,-4)) | 1.58113883008 | 1.58113883008 + (1e-300,-1e-300) | ((0,0)) | 0 | 0 + (1e-300,-1e-300) | ((0,1),(0,1)) | 1 | 1 + (1e+300,Infinity) | ((2,0),(2,4),(0,0)) | Infinity | Infinity + (1e+300,Infinity) | ((3,1),(3,3),(1,0)) | Infinity | Infinity + (1e+300,Infinity) | ((1,2),(3,4),(5,6),(7,8)) | Infinity | Infinity + (1e+300,Infinity) | ((7,8),(5,6),(3,4),(1,2)) | Infinity | Infinity + (1e+300,Infinity) | ((1,2),(7,8),(5,6),(3,-4)) | Infinity | Infinity + (1e+300,Infinity) | ((0,0)) | Infinity | Infinity + (1e+300,Infinity) | ((0,1),(0,1)) | Infinity | Infinity + (Infinity,1e+300) | ((2,0),(2,4),(0,0)) | Infinity | Infinity + (Infinity,1e+300) | ((3,1),(3,3),(1,0)) | Infinity | Infinity + (Infinity,1e+300) | ((1,2),(3,4),(5,6),(7,8)) | Infinity | Infinity + (Infinity,1e+300) | ((7,8),(5,6),(3,4),(1,2)) | Infinity | Infinity + (Infinity,1e+300) | ((1,2),(7,8),(5,6),(3,-4)) | Infinity | Infinity + (Infinity,1e+300) | ((0,0)) | Infinity | Infinity + (Infinity,1e+300) | ((0,1),(0,1)) | Infinity | Infinity + (NaN,NaN) | ((2,0),(2,4),(0,0)) | 0 | 0 + (NaN,NaN) | ((3,1),(3,3),(1,0)) | 0 | 0 + (NaN,NaN) | ((1,2),(3,4),(5,6),(7,8)) | 0 | 0 + (NaN,NaN) | ((7,8),(5,6),(3,4),(1,2)) | 0 | 0 + (NaN,NaN) | ((1,2),(7,8),(5,6),(3,-4)) | 0 | 0 + (NaN,NaN) | ((0,0)) | 0 | 0 + (NaN,NaN) | ((0,1),(0,1)) | 0 | 0 + (10,10) | ((2,0),(2,4),(0,0)) | 10 | 10 + (10,10) | ((3,1),(3,3),(1,0)) | 9.89949493661 | 9.89949493661 + (10,10) | ((1,2),(3,4),(5,6),(7,8)) | 3.60555127546 | 3.60555127546 + (10,10) | ((7,8),(5,6),(3,4),(1,2)) | 3.60555127546 | 3.60555127546 + (10,10) | ((1,2),(7,8),(5,6),(3,-4)) | 3.60555127546 | 3.60555127546 + (10,10) | ((0,0)) | 14.1421356237 | 14.1421356237 + (10,10) | ((0,1),(0,1)) | 13.4536240471 | 13.4536240471 +(70 rows) + +-- Construct line through two points +SELECT p1.f1, p2.f1, line(p1.f1, p2.f1) + FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1 <> p2.f1; + f1 | f1 | line +-------------------+-------------------+---------------------------------------- + (0,0) | (-10,0) | {0,-1,0} + (0,0) | (-3,4) | {-1.33333333333,-1,0} + (0,0) | (5.1,34.5) | {6.76470588235,-1,0} + (0,0) | (-5,-12) | {2.4,-1,0} + (0,0) | (1e+300,Infinity) | {-1,0,0} + (0,0) | (Infinity,1e+300) | {0,-1,0} + (0,0) | (NaN,NaN) | {NaN,-1,NaN} + (0,0) | (10,10) | {1,-1,0} + (-10,0) | (0,0) | {0,-1,0} + (-10,0) | (-3,4) | {0.571428571429,-1,5.71428571429} + (-10,0) | (5.1,34.5) | {2.28476821192,-1,22.8476821192} + (-10,0) | (-5,-12) | {-2.4,-1,-24} + (-10,0) | (1e-300,-1e-300) | {0,-1,0} + (-10,0) | (1e+300,Infinity) | {-1,0,-10} + (-10,0) | (Infinity,1e+300) | {0,-1,0} + (-10,0) | (NaN,NaN) | {NaN,-1,NaN} + (-10,0) | (10,10) | {0.5,-1,5} + (-3,4) | (0,0) | {-1.33333333333,-1,0} + (-3,4) | (-10,0) | {0.571428571429,-1,5.71428571429} + (-3,4) | (5.1,34.5) | {3.76543209877,-1,15.2962962963} + (-3,4) | (-5,-12) | {8,-1,28} + (-3,4) | (1e-300,-1e-300) | {-1.33333333333,-1,0} + (-3,4) | (1e+300,Infinity) | {-1,0,-3} + (-3,4) | (Infinity,1e+300) | {0,-1,4} + (-3,4) | (NaN,NaN) | {NaN,-1,NaN} + (-3,4) | (10,10) | {0.461538461538,-1,5.38461538462} + (5.1,34.5) | (0,0) | {6.76470588235,-1,0} + (5.1,34.5) | (-10,0) | {2.28476821192,-1,22.8476821192} + (5.1,34.5) | (-3,4) | {3.76543209877,-1,15.2962962963} + (5.1,34.5) | (-5,-12) | {4.60396039604,-1,11.0198019802} + (5.1,34.5) | (1e-300,-1e-300) | {6.76470588235,-1,0} + (5.1,34.5) | (1e+300,Infinity) | {-1,0,5.1} + (5.1,34.5) | (Infinity,1e+300) | {0,-1,34.5} + (5.1,34.5) | (NaN,NaN) | {NaN,-1,NaN} + (5.1,34.5) | (10,10) | {-5,-1,60} + (-5,-12) | (0,0) | {2.4,-1,0} + (-5,-12) | (-10,0) | {-2.4,-1,-24} + (-5,-12) | (-3,4) | {8,-1,28} + (-5,-12) | (5.1,34.5) | {4.60396039604,-1,11.0198019802} + (-5,-12) | (1e-300,-1e-300) | {2.4,-1,0} + (-5,-12) | (1e+300,Infinity) | {-1,0,-5} + (-5,-12) | (Infinity,1e+300) | {0,-1,-12} + (-5,-12) | (NaN,NaN) | {NaN,-1,NaN} + (-5,-12) | (10,10) | {1.46666666667,-1,-4.66666666667} + (1e-300,-1e-300) | (-10,0) | {0,-1,-1e-300} + (1e-300,-1e-300) | (-3,4) | {-1.33333333333,-1,3.33333333333e-301} + (1e-300,-1e-300) | (5.1,34.5) | {6.76470588235,-1,-7.76470588235e-300} + (1e-300,-1e-300) | (-5,-12) | {2.4,-1,-3.4e-300} + (1e-300,-1e-300) | (1e+300,Infinity) | {-1,0,1e-300} + (1e-300,-1e-300) | (Infinity,1e+300) | {0,-1,-1e-300} + (1e-300,-1e-300) | (NaN,NaN) | {NaN,-1,NaN} + (1e-300,-1e-300) | (10,10) | {1,-1,-2e-300} + (1e+300,Infinity) | (0,0) | {-1,0,1e+300} + (1e+300,Infinity) | (-10,0) | {-1,0,1e+300} + (1e+300,Infinity) | (-3,4) | {-1,0,1e+300} + (1e+300,Infinity) | (5.1,34.5) | {-1,0,1e+300} + (1e+300,Infinity) | (-5,-12) | {-1,0,1e+300} + (1e+300,Infinity) | (1e-300,-1e-300) | {-1,0,1e+300} + (1e+300,Infinity) | (Infinity,1e+300) | {NaN,-1,NaN} + (1e+300,Infinity) | (NaN,NaN) | {NaN,-1,NaN} + (1e+300,Infinity) | (10,10) | {-1,0,1e+300} + (Infinity,1e+300) | (0,0) | {0,-1,1e+300} + (Infinity,1e+300) | (-10,0) | {0,-1,1e+300} + (Infinity,1e+300) | (-3,4) | {0,-1,1e+300} + (Infinity,1e+300) | (5.1,34.5) | {0,-1,1e+300} + (Infinity,1e+300) | (-5,-12) | {0,-1,1e+300} + (Infinity,1e+300) | (1e-300,-1e-300) | {0,-1,1e+300} + (Infinity,1e+300) | (1e+300,Infinity) | {NaN,-1,NaN} + (Infinity,1e+300) | (NaN,NaN) | {NaN,-1,NaN} + (Infinity,1e+300) | (10,10) | {0,-1,1e+300} + (NaN,NaN) | (0,0) | {NaN,-1,NaN} + (NaN,NaN) | (-10,0) | {NaN,-1,NaN} + (NaN,NaN) | (-3,4) | {NaN,-1,NaN} + (NaN,NaN) | (5.1,34.5) | {NaN,-1,NaN} + (NaN,NaN) | (-5,-12) | {NaN,-1,NaN} + (NaN,NaN) | (1e-300,-1e-300) | {NaN,-1,NaN} + (NaN,NaN) | (1e+300,Infinity) | {NaN,-1,NaN} + (NaN,NaN) | (Infinity,1e+300) | {NaN,-1,NaN} + (NaN,NaN) | (10,10) | {NaN,-1,NaN} + (10,10) | (0,0) | {1,-1,0} + (10,10) | (-10,0) | {0.5,-1,5} + (10,10) | (-3,4) | {0.461538461538,-1,5.38461538462} + (10,10) | (5.1,34.5) | {-5,-1,60} + (10,10) | (-5,-12) | {1.46666666667,-1,-4.66666666667} + (10,10) | (1e-300,-1e-300) | {1,-1,0} + (10,10) | (1e+300,Infinity) | {-1,0,10} + (10,10) | (Infinity,1e+300) | {0,-1,10} + (10,10) | (NaN,NaN) | {NaN,-1,NaN} +(88 rows) + +-- Closest point to line +SELECT p.f1, l.s, p.f1 ## l.s FROM POINT_TBL p, LINE_TBL l; + f1 | s | ?column? +-------------------+---------------------------------------+---------------------------------- + (0,0) | {0,-1,5} | (0,5) + (0,0) | {1,0,5} | (-5,0) + (0,0) | {0,3,0} | (0,0) + (0,0) | {1,-1,0} | (0,0) + (0,0) | {-0.4,-1,-6} | (-2.06896551724,-5.1724137931) + (0,0) | {-0.000184615384615,-1,15.3846153846} | (0.00284023658959,15.3846148603) + (0,0) | {3,NaN,5} | + (0,0) | {NaN,NaN,NaN} | + (0,0) | {0,-1,3} | (0,3) + (0,0) | {-1,0,3} | (3,0) + (-10,0) | {0,-1,5} | (-10,5) + (-10,0) | {1,0,5} | (-5,0) + (-10,0) | {0,3,0} | (-10,0) + (-10,0) | {1,-1,0} | (-5,-5) + (-10,0) | {-0.4,-1,-6} | (-10.6896551724,-1.72413793103) + (-10,0) | {-0.000184615384615,-1,15.3846153846} | (-9.99715942258,15.386461014) + (-10,0) | {3,NaN,5} | + (-10,0) | {NaN,NaN,NaN} | + (-10,0) | {0,-1,3} | (-10,3) + (-10,0) | {-1,0,3} | (3,0) + (-3,4) | {0,-1,5} | (-3,5) + (-3,4) | {1,0,5} | (-5,4) + (-3,4) | {0,3,0} | (-3,0) + (-3,4) | {1,-1,0} | (0.5,0.5) + (-3,4) | {-0.4,-1,-6} | (-6.03448275862,-3.58620689655) + (-3,4) | {-0.000184615384615,-1,15.3846153846} | (-2.99789812268,15.3851688427) + (-3,4) | {3,NaN,5} | + (-3,4) | {NaN,NaN,NaN} | + (-3,4) | {0,-1,3} | (-3,3) + (-3,4) | {-1,0,3} | (3,4) + (5.1,34.5) | {0,-1,5} | (5.1,5) + (5.1,34.5) | {1,0,5} | (-5,34.5) + (5.1,34.5) | {0,3,0} | (5.1,0) + (5.1,34.5) | {1,-1,0} | (19.8,19.8) + (5.1,34.5) | {-0.4,-1,-6} | (-9.56896551724,-2.1724137931) + (5.1,34.5) | {-0.000184615384615,-1,15.3846153846} | (5.09647083221,15.3836744977) + (5.1,34.5) | {3,NaN,5} | + (5.1,34.5) | {NaN,NaN,NaN} | + (5.1,34.5) | {0,-1,3} | (5.1,3) + (5.1,34.5) | {-1,0,3} | (3,34.5) + (-5,-12) | {0,-1,5} | (-5,5) + (-5,-12) | {1,0,5} | (-5,-12) + (-5,-12) | {0,3,0} | (-5,0) + (-5,-12) | {1,-1,0} | (-8.5,-8.5) + (-5,-12) | {-0.4,-1,-6} | (-2.24137931034,-5.10344827586) + (-5,-12) | {-0.000184615384615,-1,15.3846153846} | (-4.99494420846,15.3855375282) + (-5,-12) | {3,NaN,5} | + (-5,-12) | {NaN,NaN,NaN} | + (-5,-12) | {0,-1,3} | (-5,3) + (-5,-12) | {-1,0,3} | (3,-12) + (1e-300,-1e-300) | {0,-1,5} | (1e-300,5) + (1e-300,-1e-300) | {1,0,5} | (-5,-1e-300) + (1e-300,-1e-300) | {0,3,0} | (1e-300,0) + (1e-300,-1e-300) | {1,-1,0} | (0,0) + (1e-300,-1e-300) | {-0.4,-1,-6} | (-2.06896551724,-5.1724137931) + (1e-300,-1e-300) | {-0.000184615384615,-1,15.3846153846} | (0.00284023658959,15.3846148603) + (1e-300,-1e-300) | {3,NaN,5} | + (1e-300,-1e-300) | {NaN,NaN,NaN} | + (1e-300,-1e-300) | {0,-1,3} | (1e-300,3) + (1e-300,-1e-300) | {-1,0,3} | (3,-1e-300) + (1e+300,Infinity) | {0,-1,5} | (1e+300,5) + (1e+300,Infinity) | {1,0,5} | + (1e+300,Infinity) | {0,3,0} | (1e+300,0) + (1e+300,Infinity) | {1,-1,0} | (Infinity,NaN) + (1e+300,Infinity) | {-0.4,-1,-6} | (-Infinity,NaN) + (1e+300,Infinity) | {-0.000184615384615,-1,15.3846153846} | (-Infinity,NaN) + (1e+300,Infinity) | {3,NaN,5} | + (1e+300,Infinity) | {NaN,NaN,NaN} | + (1e+300,Infinity) | {0,-1,3} | (1e+300,3) + (1e+300,Infinity) | {-1,0,3} | + (Infinity,1e+300) | {0,-1,5} | + (Infinity,1e+300) | {1,0,5} | (-5,1e+300) + (Infinity,1e+300) | {0,3,0} | + (Infinity,1e+300) | {1,-1,0} | + (Infinity,1e+300) | {-0.4,-1,-6} | + (Infinity,1e+300) | {-0.000184615384615,-1,15.3846153846} | + (Infinity,1e+300) | {3,NaN,5} | + (Infinity,1e+300) | {NaN,NaN,NaN} | + (Infinity,1e+300) | {0,-1,3} | + (Infinity,1e+300) | {-1,0,3} | (3,1e+300) + (NaN,NaN) | {0,-1,5} | + (NaN,NaN) | {1,0,5} | + (NaN,NaN) | {0,3,0} | + (NaN,NaN) | {1,-1,0} | + (NaN,NaN) | {-0.4,-1,-6} | + (NaN,NaN) | {-0.000184615384615,-1,15.3846153846} | + (NaN,NaN) | {3,NaN,5} | + (NaN,NaN) | {NaN,NaN,NaN} | + (NaN,NaN) | {0,-1,3} | + (NaN,NaN) | {-1,0,3} | + (10,10) | {0,-1,5} | (10,5) + (10,10) | {1,0,5} | (-5,10) + (10,10) | {0,3,0} | (10,0) + (10,10) | {1,-1,0} | (10,10) + (10,10) | {-0.4,-1,-6} | (3.10344827586,-7.24137931034) + (10,10) | {-0.000184615384615,-1,15.3846153846} | (10.000993742,15.3827690473) + (10,10) | {3,NaN,5} | + (10,10) | {NaN,NaN,NaN} | + (10,10) | {0,-1,3} | (10,3) + (10,10) | {-1,0,3} | (3,10) +(100 rows) + +-- Closest point to line segment +SELECT p.f1, l.s, p.f1 ## l.s FROM POINT_TBL p, LSEG_TBL l; + f1 | s | ?column? +-------------------+-------------------------------+---------------------------------- + (0,0) | [(1,2),(3,4)] | (1,2) + (0,0) | [(0,0),(6,6)] | (0,0) + (0,0) | [(10,-10),(-3,-4)] | (-2.0487804878,-4.43902439024) + (0,0) | [(-1000000,200),(300000,-40)] | (0.00284023658959,15.3846148603) + (0,0) | [(11,22),(33,44)] | (11,22) + (0,0) | [(-10,2),(-10,3)] | (-10,2) + (0,0) | [(0,-20),(30,-20)] | (0,-20) + (0,0) | [(NaN,1),(NaN,90)] | + (-10,0) | [(1,2),(3,4)] | (1,2) + (-10,0) | [(0,0),(6,6)] | (0,0) + (-10,0) | [(10,-10),(-3,-4)] | (-3,-4) + (-10,0) | [(-1000000,200),(300000,-40)] | (-9.99715942258,15.386461014) + (-10,0) | [(11,22),(33,44)] | (11,22) + (-10,0) | [(-10,2),(-10,3)] | (-10,2) + (-10,0) | [(0,-20),(30,-20)] | (0,-20) + (-10,0) | [(NaN,1),(NaN,90)] | + (-3,4) | [(1,2),(3,4)] | (1,2) + (-3,4) | [(0,0),(6,6)] | (0.5,0.5) + (-3,4) | [(10,-10),(-3,-4)] | (-3,-4) + (-3,4) | [(-1000000,200),(300000,-40)] | (-2.99789812268,15.3851688427) + (-3,4) | [(11,22),(33,44)] | (11,22) + (-3,4) | [(-10,2),(-10,3)] | (-10,3) + (-3,4) | [(0,-20),(30,-20)] | (0,-20) + (-3,4) | [(NaN,1),(NaN,90)] | + (5.1,34.5) | [(1,2),(3,4)] | (3,4) + (5.1,34.5) | [(0,0),(6,6)] | (6,6) + (5.1,34.5) | [(10,-10),(-3,-4)] | (-3,-4) + (5.1,34.5) | [(-1000000,200),(300000,-40)] | (5.09647083221,15.3836744977) + (5.1,34.5) | [(11,22),(33,44)] | (14.3,25.3) + (5.1,34.5) | [(-10,2),(-10,3)] | (-10,3) + (5.1,34.5) | [(0,-20),(30,-20)] | (5.1,-20) + (5.1,34.5) | [(NaN,1),(NaN,90)] | + (-5,-12) | [(1,2),(3,4)] | (1,2) + (-5,-12) | [(0,0),(6,6)] | (0,0) + (-5,-12) | [(10,-10),(-3,-4)] | (-1.60487804878,-4.64390243902) + (-5,-12) | [(-1000000,200),(300000,-40)] | (-4.99494420846,15.3855375282) + (-5,-12) | [(11,22),(33,44)] | (11,22) + (-5,-12) | [(-10,2),(-10,3)] | (-10,2) + (-5,-12) | [(0,-20),(30,-20)] | (0,-20) + (-5,-12) | [(NaN,1),(NaN,90)] | + (1e-300,-1e-300) | [(1,2),(3,4)] | (1,2) + (1e-300,-1e-300) | [(0,0),(6,6)] | (0,0) + (1e-300,-1e-300) | [(10,-10),(-3,-4)] | (-2.0487804878,-4.43902439024) + (1e-300,-1e-300) | [(-1000000,200),(300000,-40)] | (0.00284023658959,15.3846148603) + (1e-300,-1e-300) | [(11,22),(33,44)] | (11,22) + (1e-300,-1e-300) | [(-10,2),(-10,3)] | (-10,2) + (1e-300,-1e-300) | [(0,-20),(30,-20)] | (0,-20) + (1e-300,-1e-300) | [(NaN,1),(NaN,90)] | + (1e+300,Infinity) | [(1,2),(3,4)] | (3,4) + (1e+300,Infinity) | [(0,0),(6,6)] | (6,6) + (1e+300,Infinity) | [(10,-10),(-3,-4)] | (-3,-4) + (1e+300,Infinity) | [(-1000000,200),(300000,-40)] | (300000,-40) + (1e+300,Infinity) | [(11,22),(33,44)] | (33,44) + (1e+300,Infinity) | [(-10,2),(-10,3)] | (-10,3) + (1e+300,Infinity) | [(0,-20),(30,-20)] | (30,-20) + (1e+300,Infinity) | [(NaN,1),(NaN,90)] | (NaN,90) + (Infinity,1e+300) | [(1,2),(3,4)] | (3,4) + (Infinity,1e+300) | [(0,0),(6,6)] | (6,6) + (Infinity,1e+300) | [(10,-10),(-3,-4)] | (-3,-4) + (Infinity,1e+300) | [(-1000000,200),(300000,-40)] | (300000,-40) + (Infinity,1e+300) | [(11,22),(33,44)] | (33,44) + (Infinity,1e+300) | [(-10,2),(-10,3)] | (-10,3) + (Infinity,1e+300) | [(0,-20),(30,-20)] | (30,-20) + (Infinity,1e+300) | [(NaN,1),(NaN,90)] | + (NaN,NaN) | [(1,2),(3,4)] | + (NaN,NaN) | [(0,0),(6,6)] | + (NaN,NaN) | [(10,-10),(-3,-4)] | + (NaN,NaN) | [(-1000000,200),(300000,-40)] | + (NaN,NaN) | [(11,22),(33,44)] | + (NaN,NaN) | [(-10,2),(-10,3)] | + (NaN,NaN) | [(0,-20),(30,-20)] | + (NaN,NaN) | [(NaN,1),(NaN,90)] | + (10,10) | [(1,2),(3,4)] | (3,4) + (10,10) | [(0,0),(6,6)] | (6,6) + (10,10) | [(10,-10),(-3,-4)] | (2.39024390244,-6.48780487805) + (10,10) | [(-1000000,200),(300000,-40)] | (10.000993742,15.3827690473) + (10,10) | [(11,22),(33,44)] | (11,22) + (10,10) | [(-10,2),(-10,3)] | (-10,3) + (10,10) | [(0,-20),(30,-20)] | (10,-20) + (10,10) | [(NaN,1),(NaN,90)] | +(80 rows) + +-- Closest point to box +SELECT p.f1, b.f1, p.f1 ## b.f1 FROM POINT_TBL p, BOX_TBL b; + f1 | f1 | ?column? +-------------------+---------------------+-------------- + (0,0) | (2,2),(0,0) | (0,0) + (0,0) | (3,3),(1,1) | (1,1) + (0,0) | (-2,2),(-8,-10) | (-2,0) + (0,0) | (2.5,3.5),(2.5,2.5) | (2.5,2.5) + (0,0) | (3,3),(3,3) | (3,3) + (-10,0) | (2,2),(0,0) | (0,0) + (-10,0) | (3,3),(1,1) | (1,1) + (-10,0) | (-2,2),(-8,-10) | (-8,0) + (-10,0) | (2.5,3.5),(2.5,2.5) | (2.5,2.5) + (-10,0) | (3,3),(3,3) | (3,3) + (-3,4) | (2,2),(0,0) | (0,2) + (-3,4) | (3,3),(1,1) | (1,3) + (-3,4) | (-2,2),(-8,-10) | (-3,2) + (-3,4) | (2.5,3.5),(2.5,2.5) | (2.5,3.5) + (-3,4) | (3,3),(3,3) | (3,3) + (5.1,34.5) | (2,2),(0,0) | (2,2) + (5.1,34.5) | (3,3),(1,1) | (3,3) + (5.1,34.5) | (-2,2),(-8,-10) | (-2,2) + (5.1,34.5) | (2.5,3.5),(2.5,2.5) | (2.5,3.5) + (5.1,34.5) | (3,3),(3,3) | (3,3) + (-5,-12) | (2,2),(0,0) | (0,0) + (-5,-12) | (3,3),(1,1) | (1,1) + (-5,-12) | (-2,2),(-8,-10) | (-5,-10) + (-5,-12) | (2.5,3.5),(2.5,2.5) | (2.5,2.5) + (-5,-12) | (3,3),(3,3) | (3,3) + (1e-300,-1e-300) | (2,2),(0,0) | (0,0) + (1e-300,-1e-300) | (3,3),(1,1) | (1,1) + (1e-300,-1e-300) | (-2,2),(-8,-10) | (-2,-1e-300) + (1e-300,-1e-300) | (2.5,3.5),(2.5,2.5) | (2.5,2.5) + (1e-300,-1e-300) | (3,3),(3,3) | (3,3) + (1e+300,Infinity) | (2,2),(0,0) | (0,2) + (1e+300,Infinity) | (3,3),(1,1) | (1,3) + (1e+300,Infinity) | (-2,2),(-8,-10) | (-8,2) + (1e+300,Infinity) | (2.5,3.5),(2.5,2.5) | (2.5,3.5) + (1e+300,Infinity) | (3,3),(3,3) | (3,3) + (Infinity,1e+300) | (2,2),(0,0) | (0,2) + (Infinity,1e+300) | (3,3),(1,1) | (1,3) + (Infinity,1e+300) | (-2,2),(-8,-10) | (-8,2) + (Infinity,1e+300) | (2.5,3.5),(2.5,2.5) | (2.5,3.5) + (Infinity,1e+300) | (3,3),(3,3) | (3,3) + (NaN,NaN) | (2,2),(0,0) | + (NaN,NaN) | (3,3),(1,1) | + (NaN,NaN) | (-2,2),(-8,-10) | + (NaN,NaN) | (2.5,3.5),(2.5,2.5) | + (NaN,NaN) | (3,3),(3,3) | + (10,10) | (2,2),(0,0) | (2,2) + (10,10) | (3,3),(1,1) | (3,3) + (10,10) | (-2,2),(-8,-10) | (-2,2) + (10,10) | (2.5,3.5),(2.5,2.5) | (2.5,3.5) + (10,10) | (3,3),(3,3) | (3,3) +(50 rows) + +-- On line +SELECT p.f1, l.s FROM POINT_TBL p, LINE_TBL l WHERE p.f1 <@ l.s; + f1 | s +------------------+---------- + (0,0) | {0,3,0} + (0,0) | {1,-1,0} + (-10,0) | {0,3,0} + (-5,-12) | {1,0,5} + (1e-300,-1e-300) | {0,3,0} + (1e-300,-1e-300) | {1,-1,0} + (10,10) | {1,-1,0} +(7 rows) + +-- On line segment +SELECT p.f1, l.s FROM POINT_TBL p, LSEG_TBL l WHERE p.f1 <@ l.s; + f1 | s +------------------+--------------- + (0,0) | [(0,0),(6,6)] + (1e-300,-1e-300) | [(0,0),(6,6)] +(2 rows) + +-- On path +SELECT p.f1, p1.f1 FROM POINT_TBL p, PATH_TBL p1 WHERE p.f1 <@ p1.f1; + f1 | f1 +------------------+--------------------------- + (0,0) | [(0,0),(3,0),(4,5),(1,6)] + (1e-300,-1e-300) | [(0,0),(3,0),(4,5),(1,6)] + (NaN,NaN) | ((1,2),(3,4)) + (NaN,NaN) | ((1,2),(3,4)) + (NaN,NaN) | ((1,2),(3,4)) + (NaN,NaN) | ((10,20)) + (NaN,NaN) | ((11,12),(13,14)) +(7 rows) + +-- +-- Lines +-- +-- Vertical +SELECT s FROM LINE_TBL WHERE ?| s; + s +---------- + {1,0,5} + {-1,0,3} +(2 rows) + +-- Horizontal +SELECT s FROM LINE_TBL WHERE ?- s; + s +---------- + {0,-1,5} + {0,3,0} + {0,-1,3} +(3 rows) + +-- Same as line +SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s = l2.s; + s | s +---------------------------------------+--------------------------------------- + {0,-1,5} | {0,-1,5} + {1,0,5} | {1,0,5} + {0,3,0} | {0,3,0} + {1,-1,0} | {1,-1,0} + {-0.4,-1,-6} | {-0.4,-1,-6} + {-0.000184615384615,-1,15.3846153846} | {-0.000184615384615,-1,15.3846153846} + {3,NaN,5} | {3,NaN,5} + {NaN,NaN,NaN} | {NaN,NaN,NaN} + {0,-1,3} | {0,-1,3} + {-1,0,3} | {-1,0,3} +(10 rows) + +-- Parallel to line +SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?|| l2.s; + s | s +---------------------------------------+--------------------------------------- + {0,-1,5} | {0,-1,5} + {0,-1,5} | {0,3,0} + {0,-1,5} | {0,-1,3} + {1,0,5} | {1,0,5} + {1,0,5} | {-1,0,3} + {0,3,0} | {0,-1,5} + {0,3,0} | {0,3,0} + {0,3,0} | {0,-1,3} + {1,-1,0} | {1,-1,0} + {-0.4,-1,-6} | {-0.4,-1,-6} + {-0.000184615384615,-1,15.3846153846} | {-0.000184615384615,-1,15.3846153846} + {0,-1,3} | {0,-1,5} + {0,-1,3} | {0,3,0} + {0,-1,3} | {0,-1,3} + {-1,0,3} | {1,0,5} + {-1,0,3} | {-1,0,3} +(16 rows) + +-- Perpendicular to line +SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?-| l2.s; + s | s +----------+---------- + {0,-1,5} | {1,0,5} + {0,-1,5} | {-1,0,3} + {1,0,5} | {0,-1,5} + {1,0,5} | {0,3,0} + {1,0,5} | {0,-1,3} + {0,3,0} | {1,0,5} + {0,3,0} | {-1,0,3} + {0,-1,3} | {1,0,5} + {0,-1,3} | {-1,0,3} + {-1,0,3} | {0,-1,5} + {-1,0,3} | {0,3,0} + {-1,0,3} | {0,-1,3} +(12 rows) + +-- Distance to line +SELECT l1.s, l2.s, l1.s <-> l2.s FROM LINE_TBL l1, LINE_TBL l2; + s | s | ?column? +---------------------------------------+---------------------------------------+---------- + {0,-1,5} | {0,-1,5} | 0 + {0,-1,5} | {1,0,5} | 0 + {0,-1,5} | {0,3,0} | 5 + {0,-1,5} | {1,-1,0} | 0 + {0,-1,5} | {-0.4,-1,-6} | 0 + {0,-1,5} | {-0.000184615384615,-1,15.3846153846} | 0 + {0,-1,5} | {3,NaN,5} | 0 + {0,-1,5} | {NaN,NaN,NaN} | 0 + {0,-1,5} | {0,-1,3} | 2 + {0,-1,5} | {-1,0,3} | 0 + {1,0,5} | {0,-1,5} | 0 + {1,0,5} | {1,0,5} | 0 + {1,0,5} | {0,3,0} | 0 + {1,0,5} | {1,-1,0} | 0 + {1,0,5} | {-0.4,-1,-6} | 0 + {1,0,5} | {-0.000184615384615,-1,15.3846153846} | 0 + {1,0,5} | {3,NaN,5} | 0 + {1,0,5} | {NaN,NaN,NaN} | 0 + {1,0,5} | {0,-1,3} | 0 + {1,0,5} | {-1,0,3} | 8 + {0,3,0} | {0,-1,5} | 5 + {0,3,0} | {1,0,5} | 0 + {0,3,0} | {0,3,0} | 0 + {0,3,0} | {1,-1,0} | 0 + {0,3,0} | {-0.4,-1,-6} | 0 + {0,3,0} | {-0.000184615384615,-1,15.3846153846} | 0 + {0,3,0} | {3,NaN,5} | 0 + {0,3,0} | {NaN,NaN,NaN} | 0 + {0,3,0} | {0,-1,3} | 3 + {0,3,0} | {-1,0,3} | 0 + {1,-1,0} | {0,-1,5} | 0 + {1,-1,0} | {1,0,5} | 0 + {1,-1,0} | {0,3,0} | 0 + {1,-1,0} | {1,-1,0} | 0 + {1,-1,0} | {-0.4,-1,-6} | 0 + {1,-1,0} | {-0.000184615384615,-1,15.3846153846} | 0 + {1,-1,0} | {3,NaN,5} | 0 + {1,-1,0} | {NaN,NaN,NaN} | 0 + {1,-1,0} | {0,-1,3} | 0 + {1,-1,0} | {-1,0,3} | 0 + {-0.4,-1,-6} | {0,-1,5} | 0 + {-0.4,-1,-6} | {1,0,5} | 0 + {-0.4,-1,-6} | {0,3,0} | 0 + {-0.4,-1,-6} | {1,-1,0} | 0 + {-0.4,-1,-6} | {-0.4,-1,-6} | 0 + {-0.4,-1,-6} | {-0.000184615384615,-1,15.3846153846} | 0 + {-0.4,-1,-6} | {3,NaN,5} | 0 + {-0.4,-1,-6} | {NaN,NaN,NaN} | 0 + {-0.4,-1,-6} | {0,-1,3} | 0 + {-0.4,-1,-6} | {-1,0,3} | 0 + {-0.000184615384615,-1,15.3846153846} | {0,-1,5} | 0 + {-0.000184615384615,-1,15.3846153846} | {1,0,5} | 0 + {-0.000184615384615,-1,15.3846153846} | {0,3,0} | 0 + {-0.000184615384615,-1,15.3846153846} | {1,-1,0} | 0 + {-0.000184615384615,-1,15.3846153846} | {-0.4,-1,-6} | 0 + {-0.000184615384615,-1,15.3846153846} | {-0.000184615384615,-1,15.3846153846} | 0 + {-0.000184615384615,-1,15.3846153846} | {3,NaN,5} | 0 + {-0.000184615384615,-1,15.3846153846} | {NaN,NaN,NaN} | 0 + {-0.000184615384615,-1,15.3846153846} | {0,-1,3} | 0 + {-0.000184615384615,-1,15.3846153846} | {-1,0,3} | 0 + {3,NaN,5} | {0,-1,5} | 0 + {3,NaN,5} | {1,0,5} | 0 + {3,NaN,5} | {0,3,0} | 0 + {3,NaN,5} | {1,-1,0} | 0 + {3,NaN,5} | {-0.4,-1,-6} | 0 + {3,NaN,5} | {-0.000184615384615,-1,15.3846153846} | 0 + {3,NaN,5} | {3,NaN,5} | 0 + {3,NaN,5} | {NaN,NaN,NaN} | 0 + {3,NaN,5} | {0,-1,3} | 0 + {3,NaN,5} | {-1,0,3} | 0 + {NaN,NaN,NaN} | {0,-1,5} | 0 + {NaN,NaN,NaN} | {1,0,5} | 0 + {NaN,NaN,NaN} | {0,3,0} | 0 + {NaN,NaN,NaN} | {1,-1,0} | 0 + {NaN,NaN,NaN} | {-0.4,-1,-6} | 0 + {NaN,NaN,NaN} | {-0.000184615384615,-1,15.3846153846} | 0 + {NaN,NaN,NaN} | {3,NaN,5} | 0 + {NaN,NaN,NaN} | {NaN,NaN,NaN} | 0 + {NaN,NaN,NaN} | {0,-1,3} | 0 + {NaN,NaN,NaN} | {-1,0,3} | 0 + {0,-1,3} | {0,-1,5} | 2 + {0,-1,3} | {1,0,5} | 0 + {0,-1,3} | {0,3,0} | 3 + {0,-1,3} | {1,-1,0} | 0 + {0,-1,3} | {-0.4,-1,-6} | 0 + {0,-1,3} | {-0.000184615384615,-1,15.3846153846} | 0 + {0,-1,3} | {3,NaN,5} | 0 + {0,-1,3} | {NaN,NaN,NaN} | 0 + {0,-1,3} | {0,-1,3} | 0 + {0,-1,3} | {-1,0,3} | 0 + {-1,0,3} | {0,-1,5} | 0 + {-1,0,3} | {1,0,5} | 8 + {-1,0,3} | {0,3,0} | 0 + {-1,0,3} | {1,-1,0} | 0 + {-1,0,3} | {-0.4,-1,-6} | 0 + {-1,0,3} | {-0.000184615384615,-1,15.3846153846} | 0 + {-1,0,3} | {3,NaN,5} | 0 + {-1,0,3} | {NaN,NaN,NaN} | 0 + {-1,0,3} | {0,-1,3} | 0 + {-1,0,3} | {-1,0,3} | 0 +(100 rows) + +-- Distance to box +SELECT l.s, b.f1, l.s <-> b.f1 FROM LINE_TBL l, BOX_TBL b; +ERROR: function "dist_lb" not implemented +SELECT l.s, b.f1, b.f1 <-> l.s FROM LINE_TBL l, BOX_TBL b; +ERROR: function "dist_bl" not implemented +-- Intersect with line +SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?# l2.s; + s | s +---------------------------------------+--------------------------------------- + {0,-1,5} | {1,0,5} + {0,-1,5} | {1,-1,0} + {0,-1,5} | {-0.4,-1,-6} + {0,-1,5} | {-0.000184615384615,-1,15.3846153846} + {0,-1,5} | {3,NaN,5} + {0,-1,5} | {NaN,NaN,NaN} + {0,-1,5} | {-1,0,3} + {1,0,5} | {0,-1,5} + {1,0,5} | {0,3,0} + {1,0,5} | {1,-1,0} + {1,0,5} | {-0.4,-1,-6} + {1,0,5} | {-0.000184615384615,-1,15.3846153846} + {1,0,5} | {3,NaN,5} + {1,0,5} | {NaN,NaN,NaN} + {1,0,5} | {0,-1,3} + {0,3,0} | {1,0,5} + {0,3,0} | {1,-1,0} + {0,3,0} | {-0.4,-1,-6} + {0,3,0} | {-0.000184615384615,-1,15.3846153846} + {0,3,0} | {3,NaN,5} + {0,3,0} | {NaN,NaN,NaN} + {0,3,0} | {-1,0,3} + {1,-1,0} | {0,-1,5} + {1,-1,0} | {1,0,5} + {1,-1,0} | {0,3,0} + {1,-1,0} | {-0.4,-1,-6} + {1,-1,0} | {-0.000184615384615,-1,15.3846153846} + {1,-1,0} | {3,NaN,5} + {1,-1,0} | {NaN,NaN,NaN} + {1,-1,0} | {0,-1,3} + {1,-1,0} | {-1,0,3} + {-0.4,-1,-6} | {0,-1,5} + {-0.4,-1,-6} | {1,0,5} + {-0.4,-1,-6} | {0,3,0} + {-0.4,-1,-6} | {1,-1,0} + {-0.4,-1,-6} | {-0.000184615384615,-1,15.3846153846} + {-0.4,-1,-6} | {3,NaN,5} + {-0.4,-1,-6} | {NaN,NaN,NaN} + {-0.4,-1,-6} | {0,-1,3} + {-0.4,-1,-6} | {-1,0,3} + {-0.000184615384615,-1,15.3846153846} | {0,-1,5} + {-0.000184615384615,-1,15.3846153846} | {1,0,5} + {-0.000184615384615,-1,15.3846153846} | {0,3,0} + {-0.000184615384615,-1,15.3846153846} | {1,-1,0} + {-0.000184615384615,-1,15.3846153846} | {-0.4,-1,-6} + {-0.000184615384615,-1,15.3846153846} | {3,NaN,5} + {-0.000184615384615,-1,15.3846153846} | {NaN,NaN,NaN} + {-0.000184615384615,-1,15.3846153846} | {0,-1,3} + {-0.000184615384615,-1,15.3846153846} | {-1,0,3} + {3,NaN,5} | {0,-1,5} + {3,NaN,5} | {1,0,5} + {3,NaN,5} | {0,3,0} + {3,NaN,5} | {1,-1,0} + {3,NaN,5} | {-0.4,-1,-6} + {3,NaN,5} | {-0.000184615384615,-1,15.3846153846} + {3,NaN,5} | {3,NaN,5} + {3,NaN,5} | {NaN,NaN,NaN} + {3,NaN,5} | {0,-1,3} + {3,NaN,5} | {-1,0,3} + {NaN,NaN,NaN} | {0,-1,5} + {NaN,NaN,NaN} | {1,0,5} + {NaN,NaN,NaN} | {0,3,0} + {NaN,NaN,NaN} | {1,-1,0} + {NaN,NaN,NaN} | {-0.4,-1,-6} + {NaN,NaN,NaN} | {-0.000184615384615,-1,15.3846153846} + {NaN,NaN,NaN} | {3,NaN,5} + {NaN,NaN,NaN} | {NaN,NaN,NaN} + {NaN,NaN,NaN} | {0,-1,3} + {NaN,NaN,NaN} | {-1,0,3} + {0,-1,3} | {1,0,5} + {0,-1,3} | {1,-1,0} + {0,-1,3} | {-0.4,-1,-6} + {0,-1,3} | {-0.000184615384615,-1,15.3846153846} + {0,-1,3} | {3,NaN,5} + {0,-1,3} | {NaN,NaN,NaN} + {0,-1,3} | {-1,0,3} + {-1,0,3} | {0,-1,5} + {-1,0,3} | {0,3,0} + {-1,0,3} | {1,-1,0} + {-1,0,3} | {-0.4,-1,-6} + {-1,0,3} | {-0.000184615384615,-1,15.3846153846} + {-1,0,3} | {3,NaN,5} + {-1,0,3} | {NaN,NaN,NaN} + {-1,0,3} | {0,-1,3} +(84 rows) + +-- Intersect with box +SELECT l.s, b.f1 FROM LINE_TBL l, BOX_TBL b WHERE l.s ?# b.f1; + s | f1 +--------------+--------------------- + {1,0,5} | (-2,2),(-8,-10) + {0,3,0} | (2,2),(0,0) + {0,3,0} | (-2,2),(-8,-10) + {1,-1,0} | (2,2),(0,0) + {1,-1,0} | (3,3),(1,1) + {1,-1,0} | (-2,2),(-8,-10) + {1,-1,0} | (2.5,3.5),(2.5,2.5) + {1,-1,0} | (3,3),(3,3) + {-0.4,-1,-6} | (-2,2),(-8,-10) + {0,-1,3} | (3,3),(1,1) + {0,-1,3} | (2.5,3.5),(2.5,2.5) + {0,-1,3} | (3,3),(3,3) + {-1,0,3} | (3,3),(1,1) +(13 rows) + +-- Intersection point with line +SELECT l1.s, l2.s, l1.s # l2.s FROM LINE_TBL l1, LINE_TBL l2; + s | s | ?column? +---------------------------------------+---------------------------------------+----------------------------------- + {0,-1,5} | {0,-1,5} | + {0,-1,5} | {1,0,5} | (-5,5) + {0,-1,5} | {0,3,0} | + {0,-1,5} | {1,-1,0} | (5,5) + {0,-1,5} | {-0.4,-1,-6} | (-27.5,5) + {0,-1,5} | {-0.000184615384615,-1,15.3846153846} | (56250,5) + {0,-1,5} | {3,NaN,5} | (NaN,NaN) + {0,-1,5} | {NaN,NaN,NaN} | (NaN,NaN) + {0,-1,5} | {0,-1,3} | + {0,-1,5} | {-1,0,3} | (3,5) + {1,0,5} | {0,-1,5} | (-5,5) + {1,0,5} | {1,0,5} | + {1,0,5} | {0,3,0} | (-5,0) + {1,0,5} | {1,-1,0} | (-5,-5) + {1,0,5} | {-0.4,-1,-6} | (-5,-4) + {1,0,5} | {-0.000184615384615,-1,15.3846153846} | (-5,15.3855384615) + {1,0,5} | {3,NaN,5} | (NaN,NaN) + {1,0,5} | {NaN,NaN,NaN} | (NaN,NaN) + {1,0,5} | {0,-1,3} | (-5,3) + {1,0,5} | {-1,0,3} | + {0,3,0} | {0,-1,5} | + {0,3,0} | {1,0,5} | (-5,0) + {0,3,0} | {0,3,0} | + {0,3,0} | {1,-1,0} | (0,0) + {0,3,0} | {-0.4,-1,-6} | (-15,0) + {0,3,0} | {-0.000184615384615,-1,15.3846153846} | (83333.3333333,0) + {0,3,0} | {3,NaN,5} | (NaN,NaN) + {0,3,0} | {NaN,NaN,NaN} | (NaN,NaN) + {0,3,0} | {0,-1,3} | + {0,3,0} | {-1,0,3} | (3,0) + {1,-1,0} | {0,-1,5} | (5,5) + {1,-1,0} | {1,0,5} | (-5,-5) + {1,-1,0} | {0,3,0} | (0,0) + {1,-1,0} | {1,-1,0} | + {1,-1,0} | {-0.4,-1,-6} | (-4.28571428571,-4.28571428571) + {1,-1,0} | {-0.000184615384615,-1,15.3846153846} | (15.3817756722,15.3817756722) + {1,-1,0} | {3,NaN,5} | (NaN,NaN) + {1,-1,0} | {NaN,NaN,NaN} | (NaN,NaN) + {1,-1,0} | {0,-1,3} | (3,3) + {1,-1,0} | {-1,0,3} | (3,3) + {-0.4,-1,-6} | {0,-1,5} | (-27.5,5) + {-0.4,-1,-6} | {1,0,5} | (-5,-4) + {-0.4,-1,-6} | {0,3,0} | (-15,0) + {-0.4,-1,-6} | {1,-1,0} | (-4.28571428571,-4.28571428571) + {-0.4,-1,-6} | {-0.4,-1,-6} | + {-0.4,-1,-6} | {-0.000184615384615,-1,15.3846153846} | (-53.4862244113,15.3944897645) + {-0.4,-1,-6} | {3,NaN,5} | (NaN,NaN) + {-0.4,-1,-6} | {NaN,NaN,NaN} | (NaN,NaN) + {-0.4,-1,-6} | {0,-1,3} | (-22.5,3) + {-0.4,-1,-6} | {-1,0,3} | (3,-7.2) + {-0.000184615384615,-1,15.3846153846} | {0,-1,5} | (56250,5) + {-0.000184615384615,-1,15.3846153846} | {1,0,5} | (-5,15.3855384615) + {-0.000184615384615,-1,15.3846153846} | {0,3,0} | (83333.3333333,-1.7763568394e-15) + {-0.000184615384615,-1,15.3846153846} | {1,-1,0} | (15.3817756722,15.3817756722) + {-0.000184615384615,-1,15.3846153846} | {-0.4,-1,-6} | (-53.4862244113,15.3944897645) + {-0.000184615384615,-1,15.3846153846} | {-0.000184615384615,-1,15.3846153846} | + {-0.000184615384615,-1,15.3846153846} | {3,NaN,5} | (NaN,NaN) + {-0.000184615384615,-1,15.3846153846} | {NaN,NaN,NaN} | (NaN,NaN) + {-0.000184615384615,-1,15.3846153846} | {0,-1,3} | (67083.3333333,3) + {-0.000184615384615,-1,15.3846153846} | {-1,0,3} | (3,15.3840615385) + {3,NaN,5} | {0,-1,5} | (NaN,NaN) + {3,NaN,5} | {1,0,5} | (NaN,NaN) + {3,NaN,5} | {0,3,0} | (NaN,NaN) + {3,NaN,5} | {1,-1,0} | (NaN,NaN) + {3,NaN,5} | {-0.4,-1,-6} | (NaN,NaN) + {3,NaN,5} | {-0.000184615384615,-1,15.3846153846} | (NaN,NaN) + {3,NaN,5} | {3,NaN,5} | (NaN,NaN) + {3,NaN,5} | {NaN,NaN,NaN} | (NaN,NaN) + {3,NaN,5} | {0,-1,3} | (NaN,NaN) + {3,NaN,5} | {-1,0,3} | (NaN,NaN) + {NaN,NaN,NaN} | {0,-1,5} | (NaN,NaN) + {NaN,NaN,NaN} | {1,0,5} | (NaN,NaN) + {NaN,NaN,NaN} | {0,3,0} | (NaN,NaN) + {NaN,NaN,NaN} | {1,-1,0} | (NaN,NaN) + {NaN,NaN,NaN} | {-0.4,-1,-6} | (NaN,NaN) + {NaN,NaN,NaN} | {-0.000184615384615,-1,15.3846153846} | (NaN,NaN) + {NaN,NaN,NaN} | {3,NaN,5} | (NaN,NaN) + {NaN,NaN,NaN} | {NaN,NaN,NaN} | (NaN,NaN) + {NaN,NaN,NaN} | {0,-1,3} | (NaN,NaN) + {NaN,NaN,NaN} | {-1,0,3} | (NaN,NaN) + {0,-1,3} | {0,-1,5} | + {0,-1,3} | {1,0,5} | (-5,3) + {0,-1,3} | {0,3,0} | + {0,-1,3} | {1,-1,0} | (3,3) + {0,-1,3} | {-0.4,-1,-6} | (-22.5,3) + {0,-1,3} | {-0.000184615384615,-1,15.3846153846} | (67083.3333333,3) + {0,-1,3} | {3,NaN,5} | (NaN,NaN) + {0,-1,3} | {NaN,NaN,NaN} | (NaN,NaN) + {0,-1,3} | {0,-1,3} | + {0,-1,3} | {-1,0,3} | (3,3) + {-1,0,3} | {0,-1,5} | (3,5) + {-1,0,3} | {1,0,5} | + {-1,0,3} | {0,3,0} | (3,0) + {-1,0,3} | {1,-1,0} | (3,3) + {-1,0,3} | {-0.4,-1,-6} | (3,-7.2) + {-1,0,3} | {-0.000184615384615,-1,15.3846153846} | (3,15.3840615385) + {-1,0,3} | {3,NaN,5} | (NaN,NaN) + {-1,0,3} | {NaN,NaN,NaN} | (NaN,NaN) + {-1,0,3} | {0,-1,3} | (3,3) + {-1,0,3} | {-1,0,3} | +(100 rows) + +-- Closest point to line segment +SELECT l.s, l1.s, l.s ## l1.s FROM LINE_TBL l, LSEG_TBL l1; + s | s | ?column? +---------------------------------------+-------------------------------+----------------------------------- + {0,-1,5} | [(1,2),(3,4)] | (3,4) + {0,-1,5} | [(0,0),(6,6)] | (5,5) + {0,-1,5} | [(10,-10),(-3,-4)] | (-3,-4) + {0,-1,5} | [(-1000000,200),(300000,-40)] | (56250,5) + {0,-1,5} | [(11,22),(33,44)] | (11,22) + {0,-1,5} | [(-10,2),(-10,3)] | (-10,3) + {0,-1,5} | [(0,-20),(30,-20)] | + {0,-1,5} | [(NaN,1),(NaN,90)] | + {1,0,5} | [(1,2),(3,4)] | (1,2) + {1,0,5} | [(0,0),(6,6)] | (0,0) + {1,0,5} | [(10,-10),(-3,-4)] | (-3,-4) + {1,0,5} | [(-1000000,200),(300000,-40)] | (-5,15.3855384615) + {1,0,5} | [(11,22),(33,44)] | (11,22) + {1,0,5} | [(-10,2),(-10,3)] | + {1,0,5} | [(0,-20),(30,-20)] | (0,-20) + {1,0,5} | [(NaN,1),(NaN,90)] | + {0,3,0} | [(1,2),(3,4)] | (1,2) + {0,3,0} | [(0,0),(6,6)] | (0,0) + {0,3,0} | [(10,-10),(-3,-4)] | (-3,-4) + {0,3,0} | [(-1000000,200),(300000,-40)] | (83333.3333333,-1.7763568394e-15) + {0,3,0} | [(11,22),(33,44)] | (11,22) + {0,3,0} | [(-10,2),(-10,3)] | (-10,2) + {0,3,0} | [(0,-20),(30,-20)] | + {0,3,0} | [(NaN,1),(NaN,90)] | + {1,-1,0} | [(1,2),(3,4)] | + {1,-1,0} | [(0,0),(6,6)] | + {1,-1,0} | [(10,-10),(-3,-4)] | (-3,-4) + {1,-1,0} | [(-1000000,200),(300000,-40)] | (15.3817756722,15.3817756722) + {1,-1,0} | [(11,22),(33,44)] | + {1,-1,0} | [(-10,2),(-10,3)] | (-10,2) + {1,-1,0} | [(0,-20),(30,-20)] | (0,-20) + {1,-1,0} | [(NaN,1),(NaN,90)] | + {-0.4,-1,-6} | [(1,2),(3,4)] | (1,2) + {-0.4,-1,-6} | [(0,0),(6,6)] | (0,0) + {-0.4,-1,-6} | [(10,-10),(-3,-4)] | (10,-10) + {-0.4,-1,-6} | [(-1000000,200),(300000,-40)] | (-53.4862244113,15.3944897645) + {-0.4,-1,-6} | [(11,22),(33,44)] | (11,22) + {-0.4,-1,-6} | [(-10,2),(-10,3)] | (-10,2) + {-0.4,-1,-6} | [(0,-20),(30,-20)] | (30,-20) + {-0.4,-1,-6} | [(NaN,1),(NaN,90)] | + {-0.000184615384615,-1,15.3846153846} | [(1,2),(3,4)] | (3,4) + {-0.000184615384615,-1,15.3846153846} | [(0,0),(6,6)] | (6,6) + {-0.000184615384615,-1,15.3846153846} | [(10,-10),(-3,-4)] | (-3,-4) + {-0.000184615384615,-1,15.3846153846} | [(-1000000,200),(300000,-40)] | + {-0.000184615384615,-1,15.3846153846} | [(11,22),(33,44)] | (11,22) + {-0.000184615384615,-1,15.3846153846} | [(-10,2),(-10,3)] | (-10,3) + {-0.000184615384615,-1,15.3846153846} | [(0,-20),(30,-20)] | (30,-20) + {-0.000184615384615,-1,15.3846153846} | [(NaN,1),(NaN,90)] | + {3,NaN,5} | [(1,2),(3,4)] | + {3,NaN,5} | [(0,0),(6,6)] | + {3,NaN,5} | [(10,-10),(-3,-4)] | + {3,NaN,5} | [(-1000000,200),(300000,-40)] | + {3,NaN,5} | [(11,22),(33,44)] | + {3,NaN,5} | [(-10,2),(-10,3)] | + {3,NaN,5} | [(0,-20),(30,-20)] | + {3,NaN,5} | [(NaN,1),(NaN,90)] | + {NaN,NaN,NaN} | [(1,2),(3,4)] | + {NaN,NaN,NaN} | [(0,0),(6,6)] | + {NaN,NaN,NaN} | [(10,-10),(-3,-4)] | + {NaN,NaN,NaN} | [(-1000000,200),(300000,-40)] | + {NaN,NaN,NaN} | [(11,22),(33,44)] | + {NaN,NaN,NaN} | [(-10,2),(-10,3)] | + {NaN,NaN,NaN} | [(0,-20),(30,-20)] | + {NaN,NaN,NaN} | [(NaN,1),(NaN,90)] | + {0,-1,3} | [(1,2),(3,4)] | (2,3) + {0,-1,3} | [(0,0),(6,6)] | (3,3) + {0,-1,3} | [(10,-10),(-3,-4)] | (-3,-4) + {0,-1,3} | [(-1000000,200),(300000,-40)] | (67083.3333333,3) + {0,-1,3} | [(11,22),(33,44)] | (11,22) + {0,-1,3} | [(-10,2),(-10,3)] | (-10,3) + {0,-1,3} | [(0,-20),(30,-20)] | + {0,-1,3} | [(NaN,1),(NaN,90)] | + {-1,0,3} | [(1,2),(3,4)] | (3,4) + {-1,0,3} | [(0,0),(6,6)] | (3,3) + {-1,0,3} | [(10,-10),(-3,-4)] | (3,-6.76923076923) + {-1,0,3} | [(-1000000,200),(300000,-40)] | (3,15.3840615385) + {-1,0,3} | [(11,22),(33,44)] | (11,22) + {-1,0,3} | [(-10,2),(-10,3)] | + {-1,0,3} | [(0,-20),(30,-20)] | (3,-20) + {-1,0,3} | [(NaN,1),(NaN,90)] | +(80 rows) + +-- Closest point to box +SELECT l.s, b.f1, l.s ## b.f1 FROM LINE_TBL l, BOX_TBL b; +ERROR: function "close_lb" not implemented +-- +-- Line segments +-- +-- intersection +SELECT p.f1, l.s, l.s # p.f1 AS intersection + FROM LSEG_TBL l, POINT_TBL p; +ERROR: operator does not exist: lseg # point +LINE 1: SELECT p.f1, l.s, l.s # p.f1 AS intersection + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- Length +SELECT s, @-@ s FROM LSEG_TBL; + s | ?column? +-------------------------------+--------------- + [(1,2),(3,4)] | 2.82842712475 + [(0,0),(6,6)] | 8.48528137424 + [(10,-10),(-3,-4)] | 14.3178210633 + [(-1000000,200),(300000,-40)] | 1300000.02215 + [(11,22),(33,44)] | 31.1126983722 + [(-10,2),(-10,3)] | 1 + [(0,-20),(30,-20)] | 30 + [(NaN,1),(NaN,90)] | NaN +(8 rows) + +-- Vertical +SELECT s FROM LSEG_TBL WHERE ?| s; + s +------------------- + [(-10,2),(-10,3)] +(1 row) + +-- Horizontal +SELECT s FROM LSEG_TBL WHERE ?- s; + s +-------------------- + [(0,-20),(30,-20)] +(1 row) + +-- Center +SELECT s, @@ s FROM LSEG_TBL; + s | ?column? +-------------------------------+-------------- + [(1,2),(3,4)] | (2,3) + [(0,0),(6,6)] | (3,3) + [(10,-10),(-3,-4)] | (3.5,-7) + [(-1000000,200),(300000,-40)] | (-350000,80) + [(11,22),(33,44)] | (22,33) + [(-10,2),(-10,3)] | (-10,2.5) + [(0,-20),(30,-20)] | (15,-20) + [(NaN,1),(NaN,90)] | (NaN,45.5) +(8 rows) + +-- To point +SELECT s, s::point FROM LSEG_TBL; + s | s +-------------------------------+-------------- + [(1,2),(3,4)] | (2,3) + [(0,0),(6,6)] | (3,3) + [(10,-10),(-3,-4)] | (3.5,-7) + [(-1000000,200),(300000,-40)] | (-350000,80) + [(11,22),(33,44)] | (22,33) + [(-10,2),(-10,3)] | (-10,2.5) + [(0,-20),(30,-20)] | (15,-20) + [(NaN,1),(NaN,90)] | (NaN,45.5) +(8 rows) + +-- Has points less than line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s < l2.s; + s | s +--------------------+------------------------------- + [(1,2),(3,4)] | [(0,0),(6,6)] + [(1,2),(3,4)] | [(10,-10),(-3,-4)] + [(1,2),(3,4)] | [(-1000000,200),(300000,-40)] + [(1,2),(3,4)] | [(11,22),(33,44)] + [(1,2),(3,4)] | [(0,-20),(30,-20)] + [(0,0),(6,6)] | [(10,-10),(-3,-4)] + [(0,0),(6,6)] | [(-1000000,200),(300000,-40)] + [(0,0),(6,6)] | [(11,22),(33,44)] + [(0,0),(6,6)] | [(0,-20),(30,-20)] + [(10,-10),(-3,-4)] | [(-1000000,200),(300000,-40)] + [(10,-10),(-3,-4)] | [(11,22),(33,44)] + [(10,-10),(-3,-4)] | [(0,-20),(30,-20)] + [(11,22),(33,44)] | [(-1000000,200),(300000,-40)] + [(-10,2),(-10,3)] | [(1,2),(3,4)] + [(-10,2),(-10,3)] | [(0,0),(6,6)] + [(-10,2),(-10,3)] | [(10,-10),(-3,-4)] + [(-10,2),(-10,3)] | [(-1000000,200),(300000,-40)] + [(-10,2),(-10,3)] | [(11,22),(33,44)] + [(-10,2),(-10,3)] | [(0,-20),(30,-20)] + [(0,-20),(30,-20)] | [(-1000000,200),(300000,-40)] + [(0,-20),(30,-20)] | [(11,22),(33,44)] +(21 rows) + +-- Has points less than or equal to line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s <= l2.s; + s | s +-------------------------------+------------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | [(0,0),(6,6)] + [(1,2),(3,4)] | [(10,-10),(-3,-4)] + [(1,2),(3,4)] | [(-1000000,200),(300000,-40)] + [(1,2),(3,4)] | [(11,22),(33,44)] + [(1,2),(3,4)] | [(0,-20),(30,-20)] + [(0,0),(6,6)] | [(0,0),(6,6)] + [(0,0),(6,6)] | [(10,-10),(-3,-4)] + [(0,0),(6,6)] | [(-1000000,200),(300000,-40)] + [(0,0),(6,6)] | [(11,22),(33,44)] + [(0,0),(6,6)] | [(0,-20),(30,-20)] + [(10,-10),(-3,-4)] | [(10,-10),(-3,-4)] + [(10,-10),(-3,-4)] | [(-1000000,200),(300000,-40)] + [(10,-10),(-3,-4)] | [(11,22),(33,44)] + [(10,-10),(-3,-4)] | [(0,-20),(30,-20)] + [(-1000000,200),(300000,-40)] | [(-1000000,200),(300000,-40)] + [(11,22),(33,44)] | [(-1000000,200),(300000,-40)] + [(11,22),(33,44)] | [(11,22),(33,44)] + [(-10,2),(-10,3)] | [(1,2),(3,4)] + [(-10,2),(-10,3)] | [(0,0),(6,6)] + [(-10,2),(-10,3)] | [(10,-10),(-3,-4)] + [(-10,2),(-10,3)] | [(-1000000,200),(300000,-40)] + [(-10,2),(-10,3)] | [(11,22),(33,44)] + [(-10,2),(-10,3)] | [(-10,2),(-10,3)] + [(-10,2),(-10,3)] | [(0,-20),(30,-20)] + [(0,-20),(30,-20)] | [(-1000000,200),(300000,-40)] + [(0,-20),(30,-20)] | [(11,22),(33,44)] + [(0,-20),(30,-20)] | [(0,-20),(30,-20)] +(28 rows) + +-- Has points equal to line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s = l2.s; + s | s +-------------------------------+------------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] + [(0,0),(6,6)] | [(0,0),(6,6)] + [(10,-10),(-3,-4)] | [(10,-10),(-3,-4)] + [(-1000000,200),(300000,-40)] | [(-1000000,200),(300000,-40)] + [(11,22),(33,44)] | [(11,22),(33,44)] + [(-10,2),(-10,3)] | [(-10,2),(-10,3)] + [(0,-20),(30,-20)] | [(0,-20),(30,-20)] + [(NaN,1),(NaN,90)] | [(NaN,1),(NaN,90)] +(8 rows) + +-- Has points greater than or equal to line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s >= l2.s; + s | s +-------------------------------+------------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | [(-10,2),(-10,3)] + [(0,0),(6,6)] | [(1,2),(3,4)] + [(0,0),(6,6)] | [(0,0),(6,6)] + [(0,0),(6,6)] | [(-10,2),(-10,3)] + [(10,-10),(-3,-4)] | [(1,2),(3,4)] + [(10,-10),(-3,-4)] | [(0,0),(6,6)] + [(10,-10),(-3,-4)] | [(10,-10),(-3,-4)] + [(10,-10),(-3,-4)] | [(-10,2),(-10,3)] + [(-1000000,200),(300000,-40)] | [(1,2),(3,4)] + [(-1000000,200),(300000,-40)] | [(0,0),(6,6)] + [(-1000000,200),(300000,-40)] | [(10,-10),(-3,-4)] + [(-1000000,200),(300000,-40)] | [(-1000000,200),(300000,-40)] + [(-1000000,200),(300000,-40)] | [(11,22),(33,44)] + [(-1000000,200),(300000,-40)] | [(-10,2),(-10,3)] + [(-1000000,200),(300000,-40)] | [(0,-20),(30,-20)] + [(11,22),(33,44)] | [(1,2),(3,4)] + [(11,22),(33,44)] | [(0,0),(6,6)] + [(11,22),(33,44)] | [(10,-10),(-3,-4)] + [(11,22),(33,44)] | [(11,22),(33,44)] + [(11,22),(33,44)] | [(-10,2),(-10,3)] + [(11,22),(33,44)] | [(0,-20),(30,-20)] + [(-10,2),(-10,3)] | [(-10,2),(-10,3)] + [(0,-20),(30,-20)] | [(1,2),(3,4)] + [(0,-20),(30,-20)] | [(0,0),(6,6)] + [(0,-20),(30,-20)] | [(10,-10),(-3,-4)] + [(0,-20),(30,-20)] | [(-10,2),(-10,3)] + [(0,-20),(30,-20)] | [(0,-20),(30,-20)] +(28 rows) + +-- Has points greater than line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s > l2.s; + s | s +-------------------------------+-------------------- + [(1,2),(3,4)] | [(-10,2),(-10,3)] + [(0,0),(6,6)] | [(1,2),(3,4)] + [(0,0),(6,6)] | [(-10,2),(-10,3)] + [(10,-10),(-3,-4)] | [(1,2),(3,4)] + [(10,-10),(-3,-4)] | [(0,0),(6,6)] + [(10,-10),(-3,-4)] | [(-10,2),(-10,3)] + [(-1000000,200),(300000,-40)] | [(1,2),(3,4)] + [(-1000000,200),(300000,-40)] | [(0,0),(6,6)] + [(-1000000,200),(300000,-40)] | [(10,-10),(-3,-4)] + [(-1000000,200),(300000,-40)] | [(11,22),(33,44)] + [(-1000000,200),(300000,-40)] | [(-10,2),(-10,3)] + [(-1000000,200),(300000,-40)] | [(0,-20),(30,-20)] + [(11,22),(33,44)] | [(1,2),(3,4)] + [(11,22),(33,44)] | [(0,0),(6,6)] + [(11,22),(33,44)] | [(10,-10),(-3,-4)] + [(11,22),(33,44)] | [(-10,2),(-10,3)] + [(11,22),(33,44)] | [(0,-20),(30,-20)] + [(0,-20),(30,-20)] | [(1,2),(3,4)] + [(0,-20),(30,-20)] | [(0,0),(6,6)] + [(0,-20),(30,-20)] | [(10,-10),(-3,-4)] + [(0,-20),(30,-20)] | [(-10,2),(-10,3)] +(21 rows) + +-- Has points not equal to line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s != l2.s; + s | s +-------------------------------+------------------------------- + [(1,2),(3,4)] | [(0,0),(6,6)] + [(1,2),(3,4)] | [(10,-10),(-3,-4)] + [(1,2),(3,4)] | [(-1000000,200),(300000,-40)] + [(1,2),(3,4)] | [(11,22),(33,44)] + [(1,2),(3,4)] | [(-10,2),(-10,3)] + [(1,2),(3,4)] | [(0,-20),(30,-20)] + [(1,2),(3,4)] | [(NaN,1),(NaN,90)] + [(0,0),(6,6)] | [(1,2),(3,4)] + [(0,0),(6,6)] | [(10,-10),(-3,-4)] + [(0,0),(6,6)] | [(-1000000,200),(300000,-40)] + [(0,0),(6,6)] | [(11,22),(33,44)] + [(0,0),(6,6)] | [(-10,2),(-10,3)] + [(0,0),(6,6)] | [(0,-20),(30,-20)] + [(0,0),(6,6)] | [(NaN,1),(NaN,90)] + [(10,-10),(-3,-4)] | [(1,2),(3,4)] + [(10,-10),(-3,-4)] | [(0,0),(6,6)] + [(10,-10),(-3,-4)] | [(-1000000,200),(300000,-40)] + [(10,-10),(-3,-4)] | [(11,22),(33,44)] + [(10,-10),(-3,-4)] | [(-10,2),(-10,3)] + [(10,-10),(-3,-4)] | [(0,-20),(30,-20)] + [(10,-10),(-3,-4)] | [(NaN,1),(NaN,90)] + [(-1000000,200),(300000,-40)] | [(1,2),(3,4)] + [(-1000000,200),(300000,-40)] | [(0,0),(6,6)] + [(-1000000,200),(300000,-40)] | [(10,-10),(-3,-4)] + [(-1000000,200),(300000,-40)] | [(11,22),(33,44)] + [(-1000000,200),(300000,-40)] | [(-10,2),(-10,3)] + [(-1000000,200),(300000,-40)] | [(0,-20),(30,-20)] + [(-1000000,200),(300000,-40)] | [(NaN,1),(NaN,90)] + [(11,22),(33,44)] | [(1,2),(3,4)] + [(11,22),(33,44)] | [(0,0),(6,6)] + [(11,22),(33,44)] | [(10,-10),(-3,-4)] + [(11,22),(33,44)] | [(-1000000,200),(300000,-40)] + [(11,22),(33,44)] | [(-10,2),(-10,3)] + [(11,22),(33,44)] | [(0,-20),(30,-20)] + [(11,22),(33,44)] | [(NaN,1),(NaN,90)] + [(-10,2),(-10,3)] | [(1,2),(3,4)] + [(-10,2),(-10,3)] | [(0,0),(6,6)] + [(-10,2),(-10,3)] | [(10,-10),(-3,-4)] + [(-10,2),(-10,3)] | [(-1000000,200),(300000,-40)] + [(-10,2),(-10,3)] | [(11,22),(33,44)] + [(-10,2),(-10,3)] | [(0,-20),(30,-20)] + [(-10,2),(-10,3)] | [(NaN,1),(NaN,90)] + [(0,-20),(30,-20)] | [(1,2),(3,4)] + [(0,-20),(30,-20)] | [(0,0),(6,6)] + [(0,-20),(30,-20)] | [(10,-10),(-3,-4)] + [(0,-20),(30,-20)] | [(-1000000,200),(300000,-40)] + [(0,-20),(30,-20)] | [(11,22),(33,44)] + [(0,-20),(30,-20)] | [(-10,2),(-10,3)] + [(0,-20),(30,-20)] | [(NaN,1),(NaN,90)] + [(NaN,1),(NaN,90)] | [(1,2),(3,4)] + [(NaN,1),(NaN,90)] | [(0,0),(6,6)] + [(NaN,1),(NaN,90)] | [(10,-10),(-3,-4)] + [(NaN,1),(NaN,90)] | [(-1000000,200),(300000,-40)] + [(NaN,1),(NaN,90)] | [(11,22),(33,44)] + [(NaN,1),(NaN,90)] | [(-10,2),(-10,3)] + [(NaN,1),(NaN,90)] | [(0,-20),(30,-20)] +(56 rows) + +-- Parallel with line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?|| l2.s; + s | s +-------------------------------+------------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | [(0,0),(6,6)] + [(1,2),(3,4)] | [(11,22),(33,44)] + [(0,0),(6,6)] | [(1,2),(3,4)] + [(0,0),(6,6)] | [(0,0),(6,6)] + [(0,0),(6,6)] | [(11,22),(33,44)] + [(10,-10),(-3,-4)] | [(10,-10),(-3,-4)] + [(-1000000,200),(300000,-40)] | [(-1000000,200),(300000,-40)] + [(11,22),(33,44)] | [(1,2),(3,4)] + [(11,22),(33,44)] | [(0,0),(6,6)] + [(11,22),(33,44)] | [(11,22),(33,44)] + [(-10,2),(-10,3)] | [(-10,2),(-10,3)] + [(0,-20),(30,-20)] | [(0,-20),(30,-20)] +(13 rows) + +-- Perpendicular with line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?-| l2.s; + s | s +--------------------+-------------------- + [(-10,2),(-10,3)] | [(0,-20),(30,-20)] + [(0,-20),(30,-20)] | [(-10,2),(-10,3)] +(2 rows) + +-- Distance to line +SELECT l.s, l1.s, l.s <-> l1.s AS dist_sl, l1.s <-> l.s AS dist_ls FROM LSEG_TBL l, LINE_TBL l1; + s | s | dist_sl | dist_ls +-------------------------------+---------------------------------------+----------------+---------------- + [(1,2),(3,4)] | {0,-1,5} | 1 | 1 + [(0,0),(6,6)] | {0,-1,5} | 0 | 0 + [(10,-10),(-3,-4)] | {0,-1,5} | 9 | 9 + [(-1000000,200),(300000,-40)] | {0,-1,5} | 0 | 0 + [(11,22),(33,44)] | {0,-1,5} | 17 | 17 + [(-10,2),(-10,3)] | {0,-1,5} | 2 | 2 + [(0,-20),(30,-20)] | {0,-1,5} | 25 | 25 + [(NaN,1),(NaN,90)] | {0,-1,5} | NaN | NaN + [(1,2),(3,4)] | {1,0,5} | 6 | 6 + [(0,0),(6,6)] | {1,0,5} | 5 | 5 + [(10,-10),(-3,-4)] | {1,0,5} | 2 | 2 + [(-1000000,200),(300000,-40)] | {1,0,5} | 0 | 0 + [(11,22),(33,44)] | {1,0,5} | 16 | 16 + [(-10,2),(-10,3)] | {1,0,5} | 5 | 5 + [(0,-20),(30,-20)] | {1,0,5} | 5 | 5 + [(NaN,1),(NaN,90)] | {1,0,5} | NaN | NaN + [(1,2),(3,4)] | {0,3,0} | 2 | 2 + [(0,0),(6,6)] | {0,3,0} | 0 | 0 + [(10,-10),(-3,-4)] | {0,3,0} | 4 | 4 + [(-1000000,200),(300000,-40)] | {0,3,0} | 0 | 0 + [(11,22),(33,44)] | {0,3,0} | 22 | 22 + [(-10,2),(-10,3)] | {0,3,0} | 2 | 2 + [(0,-20),(30,-20)] | {0,3,0} | 20 | 20 + [(NaN,1),(NaN,90)] | {0,3,0} | NaN | NaN + [(1,2),(3,4)] | {1,-1,0} | 0.707106781187 | 0.707106781187 + [(0,0),(6,6)] | {1,-1,0} | 0 | 0 + [(10,-10),(-3,-4)] | {1,-1,0} | 0.707106781187 | 0.707106781187 + [(-1000000,200),(300000,-40)] | {1,-1,0} | 0 | 0 + [(11,22),(33,44)] | {1,-1,0} | 7.77817459305 | 7.77817459305 + [(-10,2),(-10,3)] | {1,-1,0} | 8.48528137424 | 8.48528137424 + [(0,-20),(30,-20)] | {1,-1,0} | 14.1421356237 | 14.1421356237 + [(NaN,1),(NaN,90)] | {1,-1,0} | NaN | NaN + [(1,2),(3,4)] | {-0.4,-1,-6} | 7.79920420344 | 7.79920420344 + [(0,0),(6,6)] | {-0.4,-1,-6} | 5.57086014531 | 5.57086014531 + [(10,-10),(-3,-4)] | {-0.4,-1,-6} | 0 | 0 + [(-1000000,200),(300000,-40)] | {-0.4,-1,-6} | 0 | 0 + [(11,22),(33,44)] | {-0.4,-1,-6} | 30.0826447847 | 30.0826447847 + [(-10,2),(-10,3)] | {-0.4,-1,-6} | 3.71390676354 | 3.71390676354 + [(0,-20),(30,-20)] | {-0.4,-1,-6} | 1.85695338177 | 1.85695338177 + [(NaN,1),(NaN,90)] | {-0.4,-1,-6} | NaN | NaN + [(1,2),(3,4)] | {-0.000184615384615,-1,15.3846153846} | 11.3840613445 | 11.3840613445 + [(0,0),(6,6)] | {-0.000184615384615,-1,15.3846153846} | 9.3835075324 | 9.3835075324 + [(10,-10),(-3,-4)] | {-0.000184615384615,-1,15.3846153846} | 19.3851689004 | 19.3851689004 + [(-1000000,200),(300000,-40)] | {-0.000184615384615,-1,15.3846153846} | 0 | 0 + [(11,22),(33,44)] | {-0.000184615384615,-1,15.3846153846} | 6.61741527185 | 6.61741527185 + [(-10,2),(-10,3)] | {-0.000184615384615,-1,15.3846153846} | 12.3864613274 | 12.3864613274 + [(0,-20),(30,-20)] | {-0.000184615384615,-1,15.3846153846} | 35.3790763202 | 35.3790763202 + [(NaN,1),(NaN,90)] | {-0.000184615384615,-1,15.3846153846} | NaN | NaN + [(1,2),(3,4)] | {3,NaN,5} | NaN | NaN + [(0,0),(6,6)] | {3,NaN,5} | NaN | NaN + [(10,-10),(-3,-4)] | {3,NaN,5} | NaN | NaN + [(-1000000,200),(300000,-40)] | {3,NaN,5} | NaN | NaN + [(11,22),(33,44)] | {3,NaN,5} | NaN | NaN + [(-10,2),(-10,3)] | {3,NaN,5} | NaN | NaN + [(0,-20),(30,-20)] | {3,NaN,5} | NaN | NaN + [(NaN,1),(NaN,90)] | {3,NaN,5} | NaN | NaN + [(1,2),(3,4)] | {NaN,NaN,NaN} | NaN | NaN + [(0,0),(6,6)] | {NaN,NaN,NaN} | NaN | NaN + [(10,-10),(-3,-4)] | {NaN,NaN,NaN} | NaN | NaN + [(-1000000,200),(300000,-40)] | {NaN,NaN,NaN} | NaN | NaN + [(11,22),(33,44)] | {NaN,NaN,NaN} | NaN | NaN + [(-10,2),(-10,3)] | {NaN,NaN,NaN} | NaN | NaN + [(0,-20),(30,-20)] | {NaN,NaN,NaN} | NaN | NaN + [(NaN,1),(NaN,90)] | {NaN,NaN,NaN} | NaN | NaN + [(1,2),(3,4)] | {0,-1,3} | 0 | 0 + [(0,0),(6,6)] | {0,-1,3} | 0 | 0 + [(10,-10),(-3,-4)] | {0,-1,3} | 7 | 7 + [(-1000000,200),(300000,-40)] | {0,-1,3} | 0 | 0 + [(11,22),(33,44)] | {0,-1,3} | 19 | 19 + [(-10,2),(-10,3)] | {0,-1,3} | 0 | 0 + [(0,-20),(30,-20)] | {0,-1,3} | 23 | 23 + [(NaN,1),(NaN,90)] | {0,-1,3} | NaN | NaN + [(1,2),(3,4)] | {-1,0,3} | 0 | 0 + [(0,0),(6,6)] | {-1,0,3} | 0 | 0 + [(10,-10),(-3,-4)] | {-1,0,3} | 0 | 0 + [(-1000000,200),(300000,-40)] | {-1,0,3} | 0 | 0 + [(11,22),(33,44)] | {-1,0,3} | 8 | 8 + [(-10,2),(-10,3)] | {-1,0,3} | 13 | 13 + [(0,-20),(30,-20)] | {-1,0,3} | 0 | 0 + [(NaN,1),(NaN,90)] | {-1,0,3} | NaN | NaN +(80 rows) + +-- Distance to line segment +SELECT l1.s, l2.s, l1.s <-> l2.s FROM LSEG_TBL l1, LSEG_TBL l2; + s | s | ?column? +-------------------------------+-------------------------------+---------------- + [(1,2),(3,4)] | [(1,2),(3,4)] | 0 + [(1,2),(3,4)] | [(0,0),(6,6)] | 0.707106781187 + [(1,2),(3,4)] | [(10,-10),(-3,-4)] | 7.12398901685 + [(1,2),(3,4)] | [(-1000000,200),(300000,-40)] | 11.3840613445 + [(1,2),(3,4)] | [(11,22),(33,44)] | 19.6977156036 + [(1,2),(3,4)] | [(-10,2),(-10,3)] | 11 + [(1,2),(3,4)] | [(0,-20),(30,-20)] | 22 + [(1,2),(3,4)] | [(NaN,1),(NaN,90)] | NaN + [(0,0),(6,6)] | [(1,2),(3,4)] | 0.707106781187 + [(0,0),(6,6)] | [(0,0),(6,6)] | 0 + [(0,0),(6,6)] | [(10,-10),(-3,-4)] | 4.88901207039 + [(0,0),(6,6)] | [(-1000000,200),(300000,-40)] | 9.3835075324 + [(0,0),(6,6)] | [(11,22),(33,44)] | 16.7630546142 + [(0,0),(6,6)] | [(-10,2),(-10,3)] | 10.1980390272 + [(0,0),(6,6)] | [(0,-20),(30,-20)] | 20 + [(0,0),(6,6)] | [(NaN,1),(NaN,90)] | NaN + [(10,-10),(-3,-4)] | [(1,2),(3,4)] | 7.12398901685 + [(10,-10),(-3,-4)] | [(0,0),(6,6)] | 4.88901207039 + [(10,-10),(-3,-4)] | [(10,-10),(-3,-4)] | 0 + [(10,-10),(-3,-4)] | [(-1000000,200),(300000,-40)] | 19.3851689004 + [(10,-10),(-3,-4)] | [(11,22),(33,44)] | 29.4737584815 + [(10,-10),(-3,-4)] | [(-10,2),(-10,3)] | 9.21954445729 + [(10,-10),(-3,-4)] | [(0,-20),(30,-20)] | 10 + [(10,-10),(-3,-4)] | [(NaN,1),(NaN,90)] | NaN + [(-1000000,200),(300000,-40)] | [(1,2),(3,4)] | 11.3840613445 + [(-1000000,200),(300000,-40)] | [(0,0),(6,6)] | 9.3835075324 + [(-1000000,200),(300000,-40)] | [(10,-10),(-3,-4)] | 19.3851689004 + [(-1000000,200),(300000,-40)] | [(-1000000,200),(300000,-40)] | 0 + [(-1000000,200),(300000,-40)] | [(11,22),(33,44)] | 6.61741527185 + [(-1000000,200),(300000,-40)] | [(-10,2),(-10,3)] | 12.3864613274 + [(-1000000,200),(300000,-40)] | [(0,-20),(30,-20)] | 35.3790763202 + [(-1000000,200),(300000,-40)] | [(NaN,1),(NaN,90)] | NaN + [(11,22),(33,44)] | [(1,2),(3,4)] | 19.6977156036 + [(11,22),(33,44)] | [(0,0),(6,6)] | 16.7630546142 + [(11,22),(33,44)] | [(10,-10),(-3,-4)] | 29.4737584815 + [(11,22),(33,44)] | [(-1000000,200),(300000,-40)] | 6.61741527185 + [(11,22),(33,44)] | [(11,22),(33,44)] | 0 + [(11,22),(33,44)] | [(-10,2),(-10,3)] | 28.319604517 + [(11,22),(33,44)] | [(0,-20),(30,-20)] | 42 + [(11,22),(33,44)] | [(NaN,1),(NaN,90)] | NaN + [(-10,2),(-10,3)] | [(1,2),(3,4)] | 11 + [(-10,2),(-10,3)] | [(0,0),(6,6)] | 10.1980390272 + [(-10,2),(-10,3)] | [(10,-10),(-3,-4)] | 9.21954445729 + [(-10,2),(-10,3)] | [(-1000000,200),(300000,-40)] | 12.3864613274 + [(-10,2),(-10,3)] | [(11,22),(33,44)] | 28.319604517 + [(-10,2),(-10,3)] | [(-10,2),(-10,3)] | 0 + [(-10,2),(-10,3)] | [(0,-20),(30,-20)] | 24.1660919472 + [(-10,2),(-10,3)] | [(NaN,1),(NaN,90)] | NaN + [(0,-20),(30,-20)] | [(1,2),(3,4)] | 22 + [(0,-20),(30,-20)] | [(0,0),(6,6)] | 20 + [(0,-20),(30,-20)] | [(10,-10),(-3,-4)] | 10 + [(0,-20),(30,-20)] | [(-1000000,200),(300000,-40)] | 35.3790763202 + [(0,-20),(30,-20)] | [(11,22),(33,44)] | 42 + [(0,-20),(30,-20)] | [(-10,2),(-10,3)] | 24.1660919472 + [(0,-20),(30,-20)] | [(0,-20),(30,-20)] | 0 + [(0,-20),(30,-20)] | [(NaN,1),(NaN,90)] | NaN + [(NaN,1),(NaN,90)] | [(1,2),(3,4)] | NaN + [(NaN,1),(NaN,90)] | [(0,0),(6,6)] | NaN + [(NaN,1),(NaN,90)] | [(10,-10),(-3,-4)] | NaN + [(NaN,1),(NaN,90)] | [(-1000000,200),(300000,-40)] | NaN + [(NaN,1),(NaN,90)] | [(11,22),(33,44)] | NaN + [(NaN,1),(NaN,90)] | [(-10,2),(-10,3)] | NaN + [(NaN,1),(NaN,90)] | [(0,-20),(30,-20)] | NaN + [(NaN,1),(NaN,90)] | [(NaN,1),(NaN,90)] | NaN +(64 rows) + +-- Distance to box +SELECT l.s, b.f1, l.s <-> b.f1 AS dist_sb, b.f1 <-> l.s AS dist_bs FROM LSEG_TBL l, BOX_TBL b; + s | f1 | dist_sb | dist_bs +-------------------------------+---------------------+----------------+---------------- + [(1,2),(3,4)] | (2,2),(0,0) | 0 | 0 + [(1,2),(3,4)] | (3,3),(1,1) | 0 | 0 + [(1,2),(3,4)] | (-2,2),(-8,-10) | 3 | 3 + [(1,2),(3,4)] | (2.5,3.5),(2.5,2.5) | 0 | 0 + [(1,2),(3,4)] | (3,3),(3,3) | 0.707106781187 | 0.707106781187 + [(0,0),(6,6)] | (2,2),(0,0) | 0 | 0 + [(0,0),(6,6)] | (3,3),(1,1) | 0 | 0 + [(0,0),(6,6)] | (-2,2),(-8,-10) | 2 | 2 + [(0,0),(6,6)] | (2.5,3.5),(2.5,2.5) | 0 | 0 + [(0,0),(6,6)] | (3,3),(3,3) | 0 | 0 + [(10,-10),(-3,-4)] | (2,2),(0,0) | 4.88901207039 | 4.88901207039 + [(10,-10),(-3,-4)] | (3,3),(1,1) | 6.21602963235 | 6.21602963235 + [(10,-10),(-3,-4)] | (-2,2),(-8,-10) | 0 | 0 + [(10,-10),(-3,-4)] | (2.5,3.5),(2.5,2.5) | 8.20655597529 | 8.20655597529 + [(10,-10),(-3,-4)] | (3,3),(3,3) | 8.87006475627 | 8.87006475627 + [(-1000000,200),(300000,-40)] | (2,2),(0,0) | 13.3842459258 | 13.3842459258 + [(-1000000,200),(300000,-40)] | (3,3),(1,1) | 12.3840613274 | 12.3840613274 + [(-1000000,200),(300000,-40)] | (-2,2),(-8,-10) | 13.3849843873 | 13.3849843873 + [(-1000000,200),(300000,-40)] | (2.5,3.5),(2.5,2.5) | 11.8841536436 | 11.8841536436 + [(-1000000,200),(300000,-40)] | (3,3),(3,3) | 12.3840613274 | 12.3840613274 + [(11,22),(33,44)] | (2,2),(0,0) | 21.9317121995 | 21.9317121995 + [(11,22),(33,44)] | (3,3),(1,1) | 20.6155281281 | 20.6155281281 + [(11,22),(33,44)] | (-2,2),(-8,-10) | 23.8537208838 | 23.8537208838 + [(11,22),(33,44)] | (2.5,3.5),(2.5,2.5) | 20.3592730715 | 20.3592730715 + [(11,22),(33,44)] | (3,3),(3,3) | 20.6155281281 | 20.6155281281 + [(-10,2),(-10,3)] | (2,2),(0,0) | 10 | 10 + [(-10,2),(-10,3)] | (3,3),(1,1) | 11 | 11 + [(-10,2),(-10,3)] | (-2,2),(-8,-10) | 2 | 2 + [(-10,2),(-10,3)] | (2.5,3.5),(2.5,2.5) | 12.5 | 12.5 + [(-10,2),(-10,3)] | (3,3),(3,3) | 13 | 13 + [(0,-20),(30,-20)] | (2,2),(0,0) | 20 | 20 + [(0,-20),(30,-20)] | (3,3),(1,1) | 21 | 21 + [(0,-20),(30,-20)] | (-2,2),(-8,-10) | 10.1980390272 | 10.1980390272 + [(0,-20),(30,-20)] | (2.5,3.5),(2.5,2.5) | 22.5 | 22.5 + [(0,-20),(30,-20)] | (3,3),(3,3) | 23 | 23 + [(NaN,1),(NaN,90)] | (2,2),(0,0) | NaN | NaN + [(NaN,1),(NaN,90)] | (3,3),(1,1) | NaN | NaN + [(NaN,1),(NaN,90)] | (-2,2),(-8,-10) | NaN | NaN + [(NaN,1),(NaN,90)] | (2.5,3.5),(2.5,2.5) | NaN | NaN + [(NaN,1),(NaN,90)] | (3,3),(3,3) | NaN | NaN +(40 rows) + +-- Intersect with line segment +SELECT l.s, l1.s FROM LSEG_TBL l, LINE_TBL l1 WHERE l.s ?# l1.s; + s | s +-------------------------------+-------------- + [(0,0),(6,6)] | {0,-1,5} + [(-1000000,200),(300000,-40)] | {0,-1,5} + [(-1000000,200),(300000,-40)] | {1,0,5} + [(0,0),(6,6)] | {0,3,0} + [(-1000000,200),(300000,-40)] | {0,3,0} + [(-1000000,200),(300000,-40)] | {1,-1,0} + [(10,-10),(-3,-4)] | {-0.4,-1,-6} + [(-1000000,200),(300000,-40)] | {-0.4,-1,-6} + [(1,2),(3,4)] | {0,-1,3} + [(0,0),(6,6)] | {0,-1,3} + [(-1000000,200),(300000,-40)] | {0,-1,3} + [(-10,2),(-10,3)] | {0,-1,3} + [(1,2),(3,4)] | {-1,0,3} + [(0,0),(6,6)] | {-1,0,3} + [(10,-10),(-3,-4)] | {-1,0,3} + [(-1000000,200),(300000,-40)] | {-1,0,3} + [(0,-20),(30,-20)] | {-1,0,3} +(17 rows) + +-- Intersect with box +SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s ?# b.f1; + s | f1 +--------------------+--------------------- + [(1,2),(3,4)] | (2,2),(0,0) + [(1,2),(3,4)] | (3,3),(1,1) + [(1,2),(3,4)] | (2.5,3.5),(2.5,2.5) + [(0,0),(6,6)] | (2,2),(0,0) + [(0,0),(6,6)] | (3,3),(1,1) + [(0,0),(6,6)] | (2.5,3.5),(2.5,2.5) + [(0,0),(6,6)] | (3,3),(3,3) + [(10,-10),(-3,-4)] | (-2,2),(-8,-10) +(8 rows) + +-- Intersection point with line segment +SELECT l1.s, l2.s, l1.s # l2.s FROM LSEG_TBL l1, LSEG_TBL l2; + s | s | ?column? +-------------------------------+-------------------------------+---------- + [(1,2),(3,4)] | [(1,2),(3,4)] | + [(1,2),(3,4)] | [(0,0),(6,6)] | + [(1,2),(3,4)] | [(10,-10),(-3,-4)] | + [(1,2),(3,4)] | [(-1000000,200),(300000,-40)] | + [(1,2),(3,4)] | [(11,22),(33,44)] | + [(1,2),(3,4)] | [(-10,2),(-10,3)] | + [(1,2),(3,4)] | [(0,-20),(30,-20)] | + [(1,2),(3,4)] | [(NaN,1),(NaN,90)] | + [(0,0),(6,6)] | [(1,2),(3,4)] | + [(0,0),(6,6)] | [(0,0),(6,6)] | + [(0,0),(6,6)] | [(10,-10),(-3,-4)] | + [(0,0),(6,6)] | [(-1000000,200),(300000,-40)] | + [(0,0),(6,6)] | [(11,22),(33,44)] | + [(0,0),(6,6)] | [(-10,2),(-10,3)] | + [(0,0),(6,6)] | [(0,-20),(30,-20)] | + [(0,0),(6,6)] | [(NaN,1),(NaN,90)] | + [(10,-10),(-3,-4)] | [(1,2),(3,4)] | + [(10,-10),(-3,-4)] | [(0,0),(6,6)] | + [(10,-10),(-3,-4)] | [(10,-10),(-3,-4)] | + [(10,-10),(-3,-4)] | [(-1000000,200),(300000,-40)] | + [(10,-10),(-3,-4)] | [(11,22),(33,44)] | + [(10,-10),(-3,-4)] | [(-10,2),(-10,3)] | + [(10,-10),(-3,-4)] | [(0,-20),(30,-20)] | + [(10,-10),(-3,-4)] | [(NaN,1),(NaN,90)] | + [(-1000000,200),(300000,-40)] | [(1,2),(3,4)] | + [(-1000000,200),(300000,-40)] | [(0,0),(6,6)] | + [(-1000000,200),(300000,-40)] | [(10,-10),(-3,-4)] | + [(-1000000,200),(300000,-40)] | [(-1000000,200),(300000,-40)] | + [(-1000000,200),(300000,-40)] | [(11,22),(33,44)] | + [(-1000000,200),(300000,-40)] | [(-10,2),(-10,3)] | + [(-1000000,200),(300000,-40)] | [(0,-20),(30,-20)] | + [(-1000000,200),(300000,-40)] | [(NaN,1),(NaN,90)] | + [(11,22),(33,44)] | [(1,2),(3,4)] | + [(11,22),(33,44)] | [(0,0),(6,6)] | + [(11,22),(33,44)] | [(10,-10),(-3,-4)] | + [(11,22),(33,44)] | [(-1000000,200),(300000,-40)] | + [(11,22),(33,44)] | [(11,22),(33,44)] | + [(11,22),(33,44)] | [(-10,2),(-10,3)] | + [(11,22),(33,44)] | [(0,-20),(30,-20)] | + [(11,22),(33,44)] | [(NaN,1),(NaN,90)] | + [(-10,2),(-10,3)] | [(1,2),(3,4)] | + [(-10,2),(-10,3)] | [(0,0),(6,6)] | + [(-10,2),(-10,3)] | [(10,-10),(-3,-4)] | + [(-10,2),(-10,3)] | [(-1000000,200),(300000,-40)] | + [(-10,2),(-10,3)] | [(11,22),(33,44)] | + [(-10,2),(-10,3)] | [(-10,2),(-10,3)] | + [(-10,2),(-10,3)] | [(0,-20),(30,-20)] | + [(-10,2),(-10,3)] | [(NaN,1),(NaN,90)] | + [(0,-20),(30,-20)] | [(1,2),(3,4)] | + [(0,-20),(30,-20)] | [(0,0),(6,6)] | + [(0,-20),(30,-20)] | [(10,-10),(-3,-4)] | + [(0,-20),(30,-20)] | [(-1000000,200),(300000,-40)] | + [(0,-20),(30,-20)] | [(11,22),(33,44)] | + [(0,-20),(30,-20)] | [(-10,2),(-10,3)] | + [(0,-20),(30,-20)] | [(0,-20),(30,-20)] | + [(0,-20),(30,-20)] | [(NaN,1),(NaN,90)] | + [(NaN,1),(NaN,90)] | [(1,2),(3,4)] | + [(NaN,1),(NaN,90)] | [(0,0),(6,6)] | + [(NaN,1),(NaN,90)] | [(10,-10),(-3,-4)] | + [(NaN,1),(NaN,90)] | [(-1000000,200),(300000,-40)] | + [(NaN,1),(NaN,90)] | [(11,22),(33,44)] | + [(NaN,1),(NaN,90)] | [(-10,2),(-10,3)] | + [(NaN,1),(NaN,90)] | [(0,-20),(30,-20)] | + [(NaN,1),(NaN,90)] | [(NaN,1),(NaN,90)] | +(64 rows) + +-- Closest point to line +SELECT l.s, l1.s, l.s ## l1.s FROM LSEG_TBL l, LINE_TBL l1; +ERROR: function "close_sl" not implemented +-- Closest point to line segment +SELECT l1.s, l2.s, l1.s ## l2.s FROM LSEG_TBL l1, LSEG_TBL l2; + s | s | ?column? +-------------------------------+-------------------------------+--------------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] | + [(1,2),(3,4)] | [(0,0),(6,6)] | + [(1,2),(3,4)] | [(10,-10),(-3,-4)] | (-1.98536585366,-4.46829268293) + [(1,2),(3,4)] | [(-1000000,200),(300000,-40)] | (3.00210167283,15.3840611505) + [(1,2),(3,4)] | [(11,22),(33,44)] | + [(1,2),(3,4)] | [(-10,2),(-10,3)] | (-10,2) + [(1,2),(3,4)] | [(0,-20),(30,-20)] | (1,-20) + [(1,2),(3,4)] | [(NaN,1),(NaN,90)] | + [(0,0),(6,6)] | [(1,2),(3,4)] | + [(0,0),(6,6)] | [(0,0),(6,6)] | + [(0,0),(6,6)] | [(10,-10),(-3,-4)] | (-2.0487804878,-4.43902439024) + [(0,0),(6,6)] | [(-1000000,200),(300000,-40)] | (6.00173233982,15.3835073725) + [(0,0),(6,6)] | [(11,22),(33,44)] | + [(0,0),(6,6)] | [(-10,2),(-10,3)] | (-10,2) + [(0,0),(6,6)] | [(0,-20),(30,-20)] | (0,-20) + [(0,0),(6,6)] | [(NaN,1),(NaN,90)] | + [(10,-10),(-3,-4)] | [(1,2),(3,4)] | (1,2) + [(10,-10),(-3,-4)] | [(0,0),(6,6)] | (0,0) + [(10,-10),(-3,-4)] | [(10,-10),(-3,-4)] | + [(10,-10),(-3,-4)] | [(-1000000,200),(300000,-40)] | (-2.99642119965,15.3851685701) + [(10,-10),(-3,-4)] | [(11,22),(33,44)] | (11,22) + [(10,-10),(-3,-4)] | [(-10,2),(-10,3)] | (-10,2) + [(10,-10),(-3,-4)] | [(0,-20),(30,-20)] | (10,-20) + [(10,-10),(-3,-4)] | [(NaN,1),(NaN,90)] | + [(-1000000,200),(300000,-40)] | [(1,2),(3,4)] | (3,4) + [(-1000000,200),(300000,-40)] | [(0,0),(6,6)] | (6,6) + [(-1000000,200),(300000,-40)] | [(10,-10),(-3,-4)] | (-3,-4) + [(-1000000,200),(300000,-40)] | [(-1000000,200),(300000,-40)] | + [(-1000000,200),(300000,-40)] | [(11,22),(33,44)] | (11,22) + [(-1000000,200),(300000,-40)] | [(-10,2),(-10,3)] | (-10,3) + [(-1000000,200),(300000,-40)] | [(0,-20),(30,-20)] | (30,-20) + [(-1000000,200),(300000,-40)] | [(NaN,1),(NaN,90)] | + [(11,22),(33,44)] | [(1,2),(3,4)] | + [(11,22),(33,44)] | [(0,0),(6,6)] | + [(11,22),(33,44)] | [(10,-10),(-3,-4)] | (-1.3512195122,-4.76097560976) + [(11,22),(33,44)] | [(-1000000,200),(300000,-40)] | (10.9987783234,15.3825848409) + [(11,22),(33,44)] | [(11,22),(33,44)] | + [(11,22),(33,44)] | [(-10,2),(-10,3)] | (-10,3) + [(11,22),(33,44)] | [(0,-20),(30,-20)] | (11,-20) + [(11,22),(33,44)] | [(NaN,1),(NaN,90)] | + [(-10,2),(-10,3)] | [(1,2),(3,4)] | (1,2) + [(-10,2),(-10,3)] | [(0,0),(6,6)] | (0,0) + [(-10,2),(-10,3)] | [(10,-10),(-3,-4)] | (-3,-4) + [(-10,2),(-10,3)] | [(-1000000,200),(300000,-40)] | (-9.99771326872,15.3864611163) + [(-10,2),(-10,3)] | [(11,22),(33,44)] | (11,22) + [(-10,2),(-10,3)] | [(-10,2),(-10,3)] | + [(-10,2),(-10,3)] | [(0,-20),(30,-20)] | (0,-20) + [(-10,2),(-10,3)] | [(NaN,1),(NaN,90)] | + [(0,-20),(30,-20)] | [(1,2),(3,4)] | (1,2) + [(0,-20),(30,-20)] | [(0,0),(6,6)] | (0,0) + [(0,-20),(30,-20)] | [(10,-10),(-3,-4)] | (10,-10) + [(0,-20),(30,-20)] | [(-1000000,200),(300000,-40)] | (30.0065315217,15.3790757173) + [(0,-20),(30,-20)] | [(11,22),(33,44)] | (11,22) + [(0,-20),(30,-20)] | [(-10,2),(-10,3)] | (-10,2) + [(0,-20),(30,-20)] | [(0,-20),(30,-20)] | + [(0,-20),(30,-20)] | [(NaN,1),(NaN,90)] | + [(NaN,1),(NaN,90)] | [(1,2),(3,4)] | + [(NaN,1),(NaN,90)] | [(0,0),(6,6)] | + [(NaN,1),(NaN,90)] | [(10,-10),(-3,-4)] | + [(NaN,1),(NaN,90)] | [(-1000000,200),(300000,-40)] | + [(NaN,1),(NaN,90)] | [(11,22),(33,44)] | + [(NaN,1),(NaN,90)] | [(-10,2),(-10,3)] | + [(NaN,1),(NaN,90)] | [(0,-20),(30,-20)] | + [(NaN,1),(NaN,90)] | [(NaN,1),(NaN,90)] | +(64 rows) + +-- Closest point to box +SELECT l.s, b.f1, l.s ## b.f1 FROM LSEG_TBL l, BOX_TBL b; + s | f1 | ?column? +-------------------------------+---------------------+------------- + [(1,2),(3,4)] | (2,2),(0,0) | (1,2) + [(1,2),(3,4)] | (3,3),(1,1) | (1.5,2.5) + [(1,2),(3,4)] | (-2,2),(-8,-10) | (-2,2) + [(1,2),(3,4)] | (2.5,3.5),(2.5,2.5) | (2.25,3.25) + [(1,2),(3,4)] | (3,3),(3,3) | (3,3) + [(0,0),(6,6)] | (2,2),(0,0) | (1,1) + [(0,0),(6,6)] | (3,3),(1,1) | (2,2) + [(0,0),(6,6)] | (-2,2),(-8,-10) | (-2,0) + [(0,0),(6,6)] | (2.5,3.5),(2.5,2.5) | (2.75,2.75) + [(0,0),(6,6)] | (3,3),(3,3) | (3,3) + [(10,-10),(-3,-4)] | (2,2),(0,0) | (0,0) + [(10,-10),(-3,-4)] | (3,3),(1,1) | (1,1) + [(10,-10),(-3,-4)] | (-2,2),(-8,-10) | (-3,-4) + [(10,-10),(-3,-4)] | (2.5,3.5),(2.5,2.5) | (2.5,2.5) + [(10,-10),(-3,-4)] | (3,3),(3,3) | (3,3) + [(-1000000,200),(300000,-40)] | (2,2),(0,0) | (2,2) + [(-1000000,200),(300000,-40)] | (3,3),(1,1) | (3,3) + [(-1000000,200),(300000,-40)] | (-2,2),(-8,-10) | (-2,2) + [(-1000000,200),(300000,-40)] | (2.5,3.5),(2.5,2.5) | (2.5,3.5) + [(-1000000,200),(300000,-40)] | (3,3),(3,3) | (3,3) + [(11,22),(33,44)] | (2,2),(0,0) | (2,2) + [(11,22),(33,44)] | (3,3),(1,1) | (3,3) + [(11,22),(33,44)] | (-2,2),(-8,-10) | (-2,2) + [(11,22),(33,44)] | (2.5,3.5),(2.5,2.5) | (2.5,3.5) + [(11,22),(33,44)] | (3,3),(3,3) | (3,3) + [(-10,2),(-10,3)] | (2,2),(0,0) | (0,2) + [(-10,2),(-10,3)] | (3,3),(1,1) | (1,2) + [(-10,2),(-10,3)] | (-2,2),(-8,-10) | (-8,2) + [(-10,2),(-10,3)] | (2.5,3.5),(2.5,2.5) | (2.5,3) + [(-10,2),(-10,3)] | (3,3),(3,3) | (3,3) + [(0,-20),(30,-20)] | (2,2),(0,0) | (0,0) + [(0,-20),(30,-20)] | (3,3),(1,1) | (1,1) + [(0,-20),(30,-20)] | (-2,2),(-8,-10) | (-2,-10) + [(0,-20),(30,-20)] | (2.5,3.5),(2.5,2.5) | (2.5,2.5) + [(0,-20),(30,-20)] | (3,3),(3,3) | (3,3) + [(NaN,1),(NaN,90)] | (2,2),(0,0) | + [(NaN,1),(NaN,90)] | (3,3),(1,1) | + [(NaN,1),(NaN,90)] | (-2,2),(-8,-10) | + [(NaN,1),(NaN,90)] | (2.5,3.5),(2.5,2.5) | + [(NaN,1),(NaN,90)] | (3,3),(3,3) | +(40 rows) + +-- On line +SELECT l.s, l1.s FROM LSEG_TBL l, LINE_TBL l1 WHERE l.s <@ l1.s; + s | s +-------------------------------+--------------------------------------- + [(0,0),(6,6)] | {1,-1,0} + [(-1000000,200),(300000,-40)] | {-0.000184615384615,-1,15.3846153846} +(2 rows) + +-- On box +SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s <@ b.f1; + s | f1 +---+---- +(0 rows) + +-- +-- Boxes +-- +SELECT box(f1) AS box FROM CIRCLE_TBL; + box +---------------------------------------------------------------- + (7.12132034356,3.12132034356),(2.87867965644,-1.12132034356) + (71.7106781187,72.7106781187),(-69.7106781187,-68.7106781187) + (4.53553390593,6.53553390593),(-2.53553390593,-0.535533905933) + (3.12132034356,4.12132034356),(-1.12132034356,-0.12132034356) + (107.071067812,207.071067812),(92.9289321881,192.928932188) + (181.317279836,82.3172798365),(18.6827201635,-80.3172798365) + (3,5),(3,5) + (NaN,NaN),(NaN,NaN) +(8 rows) + +-- translation +SELECT b.f1 + p.f1 AS translation + FROM BOX_TBL b, POINT_TBL p; + translation +------------------------------------- + (2,2),(0,0) + (3,3),(1,1) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) + (-8,2),(-10,0) + (-7,3),(-9,1) + (-12,2),(-18,-10) + (-7.5,3.5),(-7.5,2.5) + (-7,3),(-7,3) + (-1,6),(-3,4) + (0,7),(-2,5) + (-5,6),(-11,-6) + (-0.5,7.5),(-0.5,6.5) + (0,7),(0,7) + (7.1,36.5),(5.1,34.5) + (8.1,37.5),(6.1,35.5) + (3.1,36.5),(-2.9,24.5) + (7.6,38),(7.6,37) + (8.1,37.5),(8.1,37.5) + (-3,-10),(-5,-12) + (-2,-9),(-4,-11) + (-7,-10),(-13,-22) + (-2.5,-8.5),(-2.5,-9.5) + (-2,-9),(-2,-9) + (2,2),(1e-300,-1e-300) + (3,3),(1,1) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) + (1e+300,Infinity),(1e+300,Infinity) + (1e+300,Infinity),(1e+300,Infinity) + (1e+300,Infinity),(1e+300,Infinity) + (1e+300,Infinity),(1e+300,Infinity) + (1e+300,Infinity),(1e+300,Infinity) + (Infinity,1e+300),(Infinity,1e+300) + (Infinity,1e+300),(Infinity,1e+300) + (Infinity,1e+300),(Infinity,1e+300) + (Infinity,1e+300),(Infinity,1e+300) + (Infinity,1e+300),(Infinity,1e+300) + (NaN,NaN),(NaN,NaN) + (NaN,NaN),(NaN,NaN) + (NaN,NaN),(NaN,NaN) + (NaN,NaN),(NaN,NaN) + (NaN,NaN),(NaN,NaN) + (12,12),(10,10) + (13,13),(11,11) + (8,12),(2,0) + (12.5,13.5),(12.5,12.5) + (13,13),(13,13) +(50 rows) + +SELECT b.f1 - p.f1 AS translation + FROM BOX_TBL b, POINT_TBL p; + translation +----------------------------------------- + (2,2),(0,0) + (3,3),(1,1) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) + (12,2),(10,0) + (13,3),(11,1) + (8,2),(2,-10) + (12.5,3.5),(12.5,2.5) + (13,3),(13,3) + (5,-2),(3,-4) + (6,-1),(4,-3) + (1,-2),(-5,-14) + (5.5,-0.5),(5.5,-1.5) + (6,-1),(6,-1) + (-3.1,-32.5),(-5.1,-34.5) + (-2.1,-31.5),(-4.1,-33.5) + (-7.1,-32.5),(-13.1,-44.5) + (-2.6,-31),(-2.6,-32) + (-2.1,-31.5),(-2.1,-31.5) + (7,14),(5,12) + (8,15),(6,13) + (3,14),(-3,2) + (7.5,15.5),(7.5,14.5) + (8,15),(8,15) + (2,2),(-1e-300,1e-300) + (3,3),(1,1) + (-2,2),(-8,-10) + (2.5,3.5),(2.5,2.5) + (3,3),(3,3) + (-1e+300,-Infinity),(-1e+300,-Infinity) + (-1e+300,-Infinity),(-1e+300,-Infinity) + (-1e+300,-Infinity),(-1e+300,-Infinity) + (-1e+300,-Infinity),(-1e+300,-Infinity) + (-1e+300,-Infinity),(-1e+300,-Infinity) + (-Infinity,-1e+300),(-Infinity,-1e+300) + (-Infinity,-1e+300),(-Infinity,-1e+300) + (-Infinity,-1e+300),(-Infinity,-1e+300) + (-Infinity,-1e+300),(-Infinity,-1e+300) + (-Infinity,-1e+300),(-Infinity,-1e+300) + (NaN,NaN),(NaN,NaN) + (NaN,NaN),(NaN,NaN) + (NaN,NaN),(NaN,NaN) + (NaN,NaN),(NaN,NaN) + (NaN,NaN),(NaN,NaN) + (-8,-8),(-10,-10) + (-7,-7),(-9,-9) + (-12,-8),(-18,-20) + (-7.5,-6.5),(-7.5,-7.5) + (-7,-7),(-7,-7) +(50 rows) + +-- Multiply with point +SELECT b.f1, p.f1, b.f1 * p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000; + f1 | f1 | ?column? +---------------------+------------+----------------------------- + (2,2),(0,0) | (5.1,34.5) | (0,79.2),(-58.8,0) + (2,2),(0,0) | (10,10) | (0,40),(0,0) + (3,3),(1,1) | (5.1,34.5) | (-29.4,118.8),(-88.2,39.6) + (3,3),(1,1) | (10,10) | (0,60),(0,20) + (-2,2),(-8,-10) | (5.1,34.5) | (304.2,-58.8),(-79.2,-327) + (-2,2),(-8,-10) | (10,10) | (20,0),(-40,-180) + (2.5,3.5),(2.5,2.5) | (5.1,34.5) | (-73.5,104.1),(-108,99) + (2.5,3.5),(2.5,2.5) | (10,10) | (0,60),(-10,50) + (3,3),(3,3) | (5.1,34.5) | (-88.2,118.8),(-88.2,118.8) + (3,3),(3,3) | (10,10) | (0,60),(0,60) +(10 rows) + +-- Overflow error +SELECT b.f1, p.f1, b.f1 * p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] > 1000; + f1 | f1 | ?column? +---------------------+-------------------+-------------------------------------------- + (2,2),(0,0) | (1e+300,Infinity) | (NaN,NaN),(-Infinity,Infinity) + (2,2),(0,0) | (Infinity,1e+300) | (NaN,NaN),(Infinity,Infinity) + (2,2),(0,0) | (NaN,NaN) | (NaN,NaN),(NaN,NaN) + (3,3),(1,1) | (1e+300,Infinity) | (-Infinity,Infinity),(-Infinity,Infinity) + (3,3),(1,1) | (Infinity,1e+300) | (Infinity,Infinity),(Infinity,Infinity) + (3,3),(1,1) | (NaN,NaN) | (NaN,NaN),(NaN,NaN) + (-2,2),(-8,-10) | (1e+300,Infinity) | (Infinity,-Infinity),(-Infinity,-Infinity) + (-2,2),(-8,-10) | (Infinity,1e+300) | (-Infinity,Infinity),(-Infinity,-Infinity) + (-2,2),(-8,-10) | (NaN,NaN) | (NaN,NaN),(NaN,NaN) + (2.5,3.5),(2.5,2.5) | (1e+300,Infinity) | (-Infinity,Infinity),(-Infinity,Infinity) + (2.5,3.5),(2.5,2.5) | (Infinity,1e+300) | (Infinity,Infinity),(Infinity,Infinity) + (2.5,3.5),(2.5,2.5) | (NaN,NaN) | (NaN,NaN),(NaN,NaN) + (3,3),(3,3) | (1e+300,Infinity) | (-Infinity,Infinity),(-Infinity,Infinity) + (3,3),(3,3) | (Infinity,1e+300) | (Infinity,Infinity),(Infinity,Infinity) + (3,3),(3,3) | (NaN,NaN) | (NaN,NaN),(NaN,NaN) +(15 rows) + +-- Divide by point +SELECT b.f1, p.f1, b.f1 / p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000; + f1 | f1 | ?column? +---------------------+------------+---------------------------------------------------------------------- + (2,2),(0,0) | (5.1,34.5) | (0.0651176557644,0),(0,-0.0483449262493) + (2,2),(0,0) | (10,10) | (0.2,0),(0,0) + (3,3),(1,1) | (5.1,34.5) | (0.0976764836466,-0.0241724631247),(0.0325588278822,-0.072517389374) + (3,3),(1,1) | (10,10) | (0.3,0),(0.1,0) + (-2,2),(-8,-10) | (5.1,34.5) | (0.0483449262493,0.18499334024),(-0.317201914064,0.0651176557644) + (-2,2),(-8,-10) | (10,10) | (0,0.2),(-0.9,-0.1) + (2.5,3.5),(2.5,2.5) | (5.1,34.5) | (0.109762715209,-0.0562379754329),(0.0813970697055,-0.0604311578117) + (2.5,3.5),(2.5,2.5) | (10,10) | (0.3,0.05),(0.25,0) + (3,3),(3,3) | (5.1,34.5) | (0.0976764836466,-0.072517389374),(0.0976764836466,-0.072517389374) + (3,3),(3,3) | (10,10) | (0.3,0),(0.3,0) +(10 rows) + +-- To box +SELECT f1::box + FROM POINT_TBL; + f1 +------------------------------------- + (0,0),(0,0) + (-10,0),(-10,0) + (-3,4),(-3,4) + (5.1,34.5),(5.1,34.5) + (-5,-12),(-5,-12) + (1e-300,-1e-300),(1e-300,-1e-300) + (1e+300,Infinity),(1e+300,Infinity) + (Infinity,1e+300),(Infinity,1e+300) + (NaN,NaN),(NaN,NaN) + (10,10),(10,10) +(10 rows) + +SELECT bound_box(a.f1, b.f1) + FROM BOX_TBL a, BOX_TBL b; + bound_box +--------------------- + (2,2),(0,0) + (3,3),(0,0) + (2,2),(-8,-10) + (2.5,3.5),(0,0) + (3,3),(0,0) + (3,3),(0,0) + (3,3),(1,1) + (3,3),(-8,-10) + (3,3.5),(1,1) + (3,3),(1,1) + (2,2),(-8,-10) + (3,3),(-8,-10) + (-2,2),(-8,-10) + (2.5,3.5),(-8,-10) + (3,3),(-8,-10) + (2.5,3.5),(0,0) + (3,3.5),(1,1) + (2.5,3.5),(-8,-10) + (2.5,3.5),(2.5,2.5) + (3,3.5),(2.5,2.5) + (3,3),(0,0) + (3,3),(1,1) + (3,3),(-8,-10) + (3,3.5),(2.5,2.5) + (3,3),(3,3) +(25 rows) + +-- Below box +SELECT b1.f1, b2.f1, b1.f1 <^ b2.f1 FROM BOX_TBL b1, BOX_TBL b2; + f1 | f1 | ?column? +---------------------+---------------------+---------- + (2,2),(0,0) | (2,2),(0,0) | f + (2,2),(0,0) | (3,3),(1,1) | f + (2,2),(0,0) | (-2,2),(-8,-10) | f + (2,2),(0,0) | (2.5,3.5),(2.5,2.5) | t + (2,2),(0,0) | (3,3),(3,3) | t + (3,3),(1,1) | (2,2),(0,0) | f + (3,3),(1,1) | (3,3),(1,1) | f + (3,3),(1,1) | (-2,2),(-8,-10) | f + (3,3),(1,1) | (2.5,3.5),(2.5,2.5) | f + (3,3),(1,1) | (3,3),(3,3) | t + (-2,2),(-8,-10) | (2,2),(0,0) | f + (-2,2),(-8,-10) | (3,3),(1,1) | f + (-2,2),(-8,-10) | (-2,2),(-8,-10) | f + (-2,2),(-8,-10) | (2.5,3.5),(2.5,2.5) | t + (-2,2),(-8,-10) | (3,3),(3,3) | t + (2.5,3.5),(2.5,2.5) | (2,2),(0,0) | f + (2.5,3.5),(2.5,2.5) | (3,3),(1,1) | f + (2.5,3.5),(2.5,2.5) | (-2,2),(-8,-10) | f + (2.5,3.5),(2.5,2.5) | (2.5,3.5),(2.5,2.5) | f + (2.5,3.5),(2.5,2.5) | (3,3),(3,3) | f + (3,3),(3,3) | (2,2),(0,0) | f + (3,3),(3,3) | (3,3),(1,1) | f + (3,3),(3,3) | (-2,2),(-8,-10) | f + (3,3),(3,3) | (2.5,3.5),(2.5,2.5) | f + (3,3),(3,3) | (3,3),(3,3) | t +(25 rows) + +-- Above box +SELECT b1.f1, b2.f1, b1.f1 >^ b2.f1 FROM BOX_TBL b1, BOX_TBL b2; + f1 | f1 | ?column? +---------------------+---------------------+---------- + (2,2),(0,0) | (2,2),(0,0) | f + (2,2),(0,0) | (3,3),(1,1) | f + (2,2),(0,0) | (-2,2),(-8,-10) | f + (2,2),(0,0) | (2.5,3.5),(2.5,2.5) | f + (2,2),(0,0) | (3,3),(3,3) | f + (3,3),(1,1) | (2,2),(0,0) | f + (3,3),(1,1) | (3,3),(1,1) | f + (3,3),(1,1) | (-2,2),(-8,-10) | f + (3,3),(1,1) | (2.5,3.5),(2.5,2.5) | f + (3,3),(1,1) | (3,3),(3,3) | f + (-2,2),(-8,-10) | (2,2),(0,0) | f + (-2,2),(-8,-10) | (3,3),(1,1) | f + (-2,2),(-8,-10) | (-2,2),(-8,-10) | f + (-2,2),(-8,-10) | (2.5,3.5),(2.5,2.5) | f + (-2,2),(-8,-10) | (3,3),(3,3) | f + (2.5,3.5),(2.5,2.5) | (2,2),(0,0) | t + (2.5,3.5),(2.5,2.5) | (3,3),(1,1) | f + (2.5,3.5),(2.5,2.5) | (-2,2),(-8,-10) | t + (2.5,3.5),(2.5,2.5) | (2.5,3.5),(2.5,2.5) | f + (2.5,3.5),(2.5,2.5) | (3,3),(3,3) | f + (3,3),(3,3) | (2,2),(0,0) | t + (3,3),(3,3) | (3,3),(1,1) | t + (3,3),(3,3) | (-2,2),(-8,-10) | t + (3,3),(3,3) | (2.5,3.5),(2.5,2.5) | f + (3,3),(3,3) | (3,3),(3,3) | t +(25 rows) + +-- Intersection point with box +SELECT b1.f1, b2.f1, b1.f1 # b2.f1 FROM BOX_TBL b1, BOX_TBL b2; + f1 | f1 | ?column? +---------------------+---------------------+--------------------- + (2,2),(0,0) | (2,2),(0,0) | (2,2),(0,0) + (2,2),(0,0) | (3,3),(1,1) | (2,2),(1,1) + (2,2),(0,0) | (-2,2),(-8,-10) | + (2,2),(0,0) | (2.5,3.5),(2.5,2.5) | + (2,2),(0,0) | (3,3),(3,3) | + (3,3),(1,1) | (2,2),(0,0) | (2,2),(1,1) + (3,3),(1,1) | (3,3),(1,1) | (3,3),(1,1) + (3,3),(1,1) | (-2,2),(-8,-10) | + (3,3),(1,1) | (2.5,3.5),(2.5,2.5) | (2.5,3),(2.5,2.5) + (3,3),(1,1) | (3,3),(3,3) | (3,3),(3,3) + (-2,2),(-8,-10) | (2,2),(0,0) | + (-2,2),(-8,-10) | (3,3),(1,1) | + (-2,2),(-8,-10) | (-2,2),(-8,-10) | (-2,2),(-8,-10) + (-2,2),(-8,-10) | (2.5,3.5),(2.5,2.5) | + (-2,2),(-8,-10) | (3,3),(3,3) | + (2.5,3.5),(2.5,2.5) | (2,2),(0,0) | + (2.5,3.5),(2.5,2.5) | (3,3),(1,1) | (2.5,3),(2.5,2.5) + (2.5,3.5),(2.5,2.5) | (-2,2),(-8,-10) | + (2.5,3.5),(2.5,2.5) | (2.5,3.5),(2.5,2.5) | (2.5,3.5),(2.5,2.5) + (2.5,3.5),(2.5,2.5) | (3,3),(3,3) | + (3,3),(3,3) | (2,2),(0,0) | + (3,3),(3,3) | (3,3),(1,1) | (3,3),(3,3) + (3,3),(3,3) | (-2,2),(-8,-10) | + (3,3),(3,3) | (2.5,3.5),(2.5,2.5) | + (3,3),(3,3) | (3,3),(3,3) | (3,3),(3,3) +(25 rows) + +-- Diagonal +SELECT f1, diagonal(f1) FROM BOX_TBL; + f1 | diagonal +---------------------+----------------------- + (2,2),(0,0) | [(2,2),(0,0)] + (3,3),(1,1) | [(3,3),(1,1)] + (-2,2),(-8,-10) | [(-2,2),(-8,-10)] + (2.5,3.5),(2.5,2.5) | [(2.5,3.5),(2.5,2.5)] + (3,3),(3,3) | [(3,3),(3,3)] +(5 rows) + +-- Distance to box +SELECT b1.f1, b2.f1, b1.f1 <-> b2.f1 FROM BOX_TBL b1, BOX_TBL b2; + f1 | f1 | ?column? +---------------------+---------------------+--------------- + (2,2),(0,0) | (2,2),(0,0) | 0 + (2,2),(0,0) | (3,3),(1,1) | 1.41421356237 + (2,2),(0,0) | (-2,2),(-8,-10) | 7.81024967591 + (2,2),(0,0) | (2.5,3.5),(2.5,2.5) | 2.5 + (2,2),(0,0) | (3,3),(3,3) | 2.82842712475 + (3,3),(1,1) | (2,2),(0,0) | 1.41421356237 + (3,3),(1,1) | (3,3),(1,1) | 0 + (3,3),(1,1) | (-2,2),(-8,-10) | 9.21954445729 + (3,3),(1,1) | (2.5,3.5),(2.5,2.5) | 1.11803398875 + (3,3),(1,1) | (3,3),(3,3) | 1.41421356237 + (-2,2),(-8,-10) | (2,2),(0,0) | 7.81024967591 + (-2,2),(-8,-10) | (3,3),(1,1) | 9.21954445729 + (-2,2),(-8,-10) | (-2,2),(-8,-10) | 0 + (-2,2),(-8,-10) | (2.5,3.5),(2.5,2.5) | 10.2591422643 + (-2,2),(-8,-10) | (3,3),(3,3) | 10.6301458127 + (2.5,3.5),(2.5,2.5) | (2,2),(0,0) | 2.5 + (2.5,3.5),(2.5,2.5) | (3,3),(1,1) | 1.11803398875 + (2.5,3.5),(2.5,2.5) | (-2,2),(-8,-10) | 10.2591422643 + (2.5,3.5),(2.5,2.5) | (2.5,3.5),(2.5,2.5) | 0 + (2.5,3.5),(2.5,2.5) | (3,3),(3,3) | 0.5 + (3,3),(3,3) | (2,2),(0,0) | 2.82842712475 + (3,3),(3,3) | (3,3),(1,1) | 1.41421356237 + (3,3),(3,3) | (-2,2),(-8,-10) | 10.6301458127 + (3,3),(3,3) | (2.5,3.5),(2.5,2.5) | 0.5 + (3,3),(3,3) | (3,3),(3,3) | 0 +(25 rows) + +-- +-- Paths +-- +-- Points +SELECT f1, npoints(f1) FROM PATH_TBL; + f1 | npoints +---------------------------+--------- + [(1,2),(3,4)] | 2 + ((1,2),(3,4)) | 2 + [(0,0),(3,0),(4,5),(1,6)] | 4 + ((1,2),(3,4)) | 2 + ((1,2),(3,4)) | 2 + [(1,2),(3,4)] | 2 + ((10,20)) | 1 + [(11,12),(13,14)] | 2 + ((11,12),(13,14)) | 2 +(9 rows) + +-- Area +SELECT f1, area(f1) FROM PATH_TBL; + f1 | area +---------------------------+------ + [(1,2),(3,4)] | + ((1,2),(3,4)) | 0 + [(0,0),(3,0),(4,5),(1,6)] | + ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | 0 + [(1,2),(3,4)] | + ((10,20)) | 0 + [(11,12),(13,14)] | + ((11,12),(13,14)) | 0 +(9 rows) + +-- Length +SELECT f1, @-@ f1 FROM PATH_TBL; + f1 | ?column? +---------------------------+--------------- + [(1,2),(3,4)] | 2.82842712475 + ((1,2),(3,4)) | 5.65685424949 + [(0,0),(3,0),(4,5),(1,6)] | 11.2612971738 + ((1,2),(3,4)) | 5.65685424949 + ((1,2),(3,4)) | 5.65685424949 + [(1,2),(3,4)] | 2.82842712475 + ((10,20)) | 0 + [(11,12),(13,14)] | 2.82842712475 + ((11,12),(13,14)) | 5.65685424949 +(9 rows) + +-- Center +SELECT f1, @@ f1 FROM PATH_TBL; +ERROR: function "path_center" not implemented +-- To polygon +SELECT f1, f1::polygon FROM PATH_TBL WHERE isclosed(f1); + f1 | f1 +-------------------+------------------- + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((10,20)) | ((10,20)) + ((11,12),(13,14)) | ((11,12),(13,14)) +(5 rows) + +-- Open path cannot be converted to polygon error +SELECT f1, f1::polygon FROM PATH_TBL WHERE isopen(f1); +ERROR: open path cannot be converted to polygon +-- Has points less than path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 < p2.f1; + f1 | f1 +-------------------+--------------------------- + [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] + [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6)] + ((10,20)) | [(1,2),(3,4)] + ((10,20)) | ((1,2),(3,4)) + ((10,20)) | [(0,0),(3,0),(4,5),(1,6)] + ((10,20)) | ((1,2),(3,4)) + ((10,20)) | ((1,2),(3,4)) + ((10,20)) | [(1,2),(3,4)] + ((10,20)) | [(11,12),(13,14)] + ((10,20)) | ((11,12),(13,14)) + [(11,12),(13,14)] | [(0,0),(3,0),(4,5),(1,6)] + ((11,12),(13,14)) | [(0,0),(3,0),(4,5),(1,6)] +(15 rows) + +-- Has points less than or equal to path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 <= p2.f1; + f1 | f1 +---------------------------+--------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6)] + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | [(11,12),(13,14)] + [(1,2),(3,4)] | ((11,12),(13,14)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + [(0,0),(3,0),(4,5),(1,6)] | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6)] + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | [(11,12),(13,14)] + [(1,2),(3,4)] | ((11,12),(13,14)) + ((10,20)) | [(1,2),(3,4)] + ((10,20)) | ((1,2),(3,4)) + ((10,20)) | [(0,0),(3,0),(4,5),(1,6)] + ((10,20)) | ((1,2),(3,4)) + ((10,20)) | ((1,2),(3,4)) + ((10,20)) | [(1,2),(3,4)] + ((10,20)) | ((10,20)) + ((10,20)) | [(11,12),(13,14)] + ((10,20)) | ((11,12),(13,14)) + [(11,12),(13,14)] | [(1,2),(3,4)] + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | [(0,0),(3,0),(4,5),(1,6)] + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | [(1,2),(3,4)] + [(11,12),(13,14)] | [(11,12),(13,14)] + [(11,12),(13,14)] | ((11,12),(13,14)) + ((11,12),(13,14)) | [(1,2),(3,4)] + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | [(0,0),(3,0),(4,5),(1,6)] + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | [(1,2),(3,4)] + ((11,12),(13,14)) | [(11,12),(13,14)] + ((11,12),(13,14)) | ((11,12),(13,14)) +(66 rows) + +-- Has points equal to path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 = p2.f1; + f1 | f1 +---------------------------+--------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | [(11,12),(13,14)] + [(1,2),(3,4)] | ((11,12),(13,14)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + [(0,0),(3,0),(4,5),(1,6)] | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | [(11,12),(13,14)] + [(1,2),(3,4)] | ((11,12),(13,14)) + ((10,20)) | ((10,20)) + [(11,12),(13,14)] | [(1,2),(3,4)] + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | [(1,2),(3,4)] + [(11,12),(13,14)] | [(11,12),(13,14)] + [(11,12),(13,14)] | ((11,12),(13,14)) + ((11,12),(13,14)) | [(1,2),(3,4)] + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | [(1,2),(3,4)] + ((11,12),(13,14)) | [(11,12),(13,14)] + ((11,12),(13,14)) | ((11,12),(13,14)) +(51 rows) + +-- Has points greater than or equal to path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 >= p2.f1; + f1 | f1 +---------------------------+--------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | ((10,20)) + [(1,2),(3,4)] | [(11,12),(13,14)] + [(1,2),(3,4)] | ((11,12),(13,14)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((10,20)) + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4)] + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | [(0,0),(3,0),(4,5),(1,6)] + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4)] + [(0,0),(3,0),(4,5),(1,6)] | ((10,20)) + [(0,0),(3,0),(4,5),(1,6)] | [(11,12),(13,14)] + [(0,0),(3,0),(4,5),(1,6)] | ((11,12),(13,14)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((10,20)) + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | ((1,2),(3,4)) + ((1,2),(3,4)) | [(1,2),(3,4)] + ((1,2),(3,4)) | ((10,20)) + ((1,2),(3,4)) | [(11,12),(13,14)] + ((1,2),(3,4)) | ((11,12),(13,14)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(1,2),(3,4)] | [(1,2),(3,4)] + [(1,2),(3,4)] | ((10,20)) + [(1,2),(3,4)] | [(11,12),(13,14)] + [(1,2),(3,4)] | ((11,12),(13,14)) + ((10,20)) | ((10,20)) + [(11,12),(13,14)] | [(1,2),(3,4)] + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | ((1,2),(3,4)) + [(11,12),(13,14)] | [(1,2),(3,4)] + [(11,12),(13,14)] | ((10,20)) + [(11,12),(13,14)] | [(11,12),(13,14)] + [(11,12),(13,14)] | ((11,12),(13,14)) + ((11,12),(13,14)) | [(1,2),(3,4)] + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | ((1,2),(3,4)) + ((11,12),(13,14)) | [(1,2),(3,4)] + ((11,12),(13,14)) | ((10,20)) + ((11,12),(13,14)) | [(11,12),(13,14)] + ((11,12),(13,14)) | ((11,12),(13,14)) +(66 rows) + +-- Has points greater than path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 > p2.f1; + f1 | f1 +---------------------------+------------------- + [(1,2),(3,4)] | ((10,20)) + ((1,2),(3,4)) | ((10,20)) + [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4)] + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4)] + [(0,0),(3,0),(4,5),(1,6)] | ((10,20)) + [(0,0),(3,0),(4,5),(1,6)] | [(11,12),(13,14)] + [(0,0),(3,0),(4,5),(1,6)] | ((11,12),(13,14)) + ((1,2),(3,4)) | ((10,20)) + ((1,2),(3,4)) | ((10,20)) + [(1,2),(3,4)] | ((10,20)) + [(11,12),(13,14)] | ((10,20)) + ((11,12),(13,14)) | ((10,20)) +(15 rows) + +-- Add path +SELECT p1.f1, p2.f1, p1.f1 + p2.f1 FROM PATH_TBL p1, PATH_TBL p2; + f1 | f1 | ?column? +---------------------------+---------------------------+--------------------------------------------------- + [(1,2),(3,4)] | [(1,2),(3,4)] | [(1,2),(3,4),(1,2),(3,4)] + [(1,2),(3,4)] | ((1,2),(3,4)) | + [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4),(0,0),(3,0),(4,5),(1,6)] + [(1,2),(3,4)] | ((1,2),(3,4)) | + [(1,2),(3,4)] | ((1,2),(3,4)) | + [(1,2),(3,4)] | [(1,2),(3,4)] | [(1,2),(3,4),(1,2),(3,4)] + [(1,2),(3,4)] | ((10,20)) | + [(1,2),(3,4)] | [(11,12),(13,14)] | [(1,2),(3,4),(11,12),(13,14)] + [(1,2),(3,4)] | ((11,12),(13,14)) | + ((1,2),(3,4)) | [(1,2),(3,4)] | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | [(1,2),(3,4)] | + ((1,2),(3,4)) | ((10,20)) | + ((1,2),(3,4)) | [(11,12),(13,14)] | + ((1,2),(3,4)) | ((11,12),(13,14)) | + [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6),(1,2),(3,4)] + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) | + [(0,0),(3,0),(4,5),(1,6)] | [(0,0),(3,0),(4,5),(1,6)] | [(0,0),(3,0),(4,5),(1,6),(0,0),(3,0),(4,5),(1,6)] + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) | + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) | + [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6),(1,2),(3,4)] + [(0,0),(3,0),(4,5),(1,6)] | ((10,20)) | + [(0,0),(3,0),(4,5),(1,6)] | [(11,12),(13,14)] | [(0,0),(3,0),(4,5),(1,6),(11,12),(13,14)] + [(0,0),(3,0),(4,5),(1,6)] | ((11,12),(13,14)) | + ((1,2),(3,4)) | [(1,2),(3,4)] | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | [(1,2),(3,4)] | + ((1,2),(3,4)) | ((10,20)) | + ((1,2),(3,4)) | [(11,12),(13,14)] | + ((1,2),(3,4)) | ((11,12),(13,14)) | + ((1,2),(3,4)) | [(1,2),(3,4)] | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | ((1,2),(3,4)) | + ((1,2),(3,4)) | [(1,2),(3,4)] | + ((1,2),(3,4)) | ((10,20)) | + ((1,2),(3,4)) | [(11,12),(13,14)] | + ((1,2),(3,4)) | ((11,12),(13,14)) | + [(1,2),(3,4)] | [(1,2),(3,4)] | [(1,2),(3,4),(1,2),(3,4)] + [(1,2),(3,4)] | ((1,2),(3,4)) | + [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4),(0,0),(3,0),(4,5),(1,6)] + [(1,2),(3,4)] | ((1,2),(3,4)) | + [(1,2),(3,4)] | ((1,2),(3,4)) | + [(1,2),(3,4)] | [(1,2),(3,4)] | [(1,2),(3,4),(1,2),(3,4)] + [(1,2),(3,4)] | ((10,20)) | + [(1,2),(3,4)] | [(11,12),(13,14)] | [(1,2),(3,4),(11,12),(13,14)] + [(1,2),(3,4)] | ((11,12),(13,14)) | + ((10,20)) | [(1,2),(3,4)] | + ((10,20)) | ((1,2),(3,4)) | + ((10,20)) | [(0,0),(3,0),(4,5),(1,6)] | + ((10,20)) | ((1,2),(3,4)) | + ((10,20)) | ((1,2),(3,4)) | + ((10,20)) | [(1,2),(3,4)] | + ((10,20)) | ((10,20)) | + ((10,20)) | [(11,12),(13,14)] | + ((10,20)) | ((11,12),(13,14)) | + [(11,12),(13,14)] | [(1,2),(3,4)] | [(11,12),(13,14),(1,2),(3,4)] + [(11,12),(13,14)] | ((1,2),(3,4)) | + [(11,12),(13,14)] | [(0,0),(3,0),(4,5),(1,6)] | [(11,12),(13,14),(0,0),(3,0),(4,5),(1,6)] + [(11,12),(13,14)] | ((1,2),(3,4)) | + [(11,12),(13,14)] | ((1,2),(3,4)) | + [(11,12),(13,14)] | [(1,2),(3,4)] | [(11,12),(13,14),(1,2),(3,4)] + [(11,12),(13,14)] | ((10,20)) | + [(11,12),(13,14)] | [(11,12),(13,14)] | [(11,12),(13,14),(11,12),(13,14)] + [(11,12),(13,14)] | ((11,12),(13,14)) | + ((11,12),(13,14)) | [(1,2),(3,4)] | + ((11,12),(13,14)) | ((1,2),(3,4)) | + ((11,12),(13,14)) | [(0,0),(3,0),(4,5),(1,6)] | + ((11,12),(13,14)) | ((1,2),(3,4)) | + ((11,12),(13,14)) | ((1,2),(3,4)) | + ((11,12),(13,14)) | [(1,2),(3,4)] | + ((11,12),(13,14)) | ((10,20)) | + ((11,12),(13,14)) | [(11,12),(13,14)] | + ((11,12),(13,14)) | ((11,12),(13,14)) | +(81 rows) + +-- Add point +SELECT p.f1, p1.f1, p.f1 + p1.f1 FROM PATH_TBL p, POINT_TBL p1; + f1 | f1 | ?column? +---------------------------+-------------------+--------------------------------------------------------------------------- + [(1,2),(3,4)] | (0,0) | [(1,2),(3,4)] + ((1,2),(3,4)) | (0,0) | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | (0,0) | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | (0,0) | ((1,2),(3,4)) + ((1,2),(3,4)) | (0,0) | ((1,2),(3,4)) + [(1,2),(3,4)] | (0,0) | [(1,2),(3,4)] + ((10,20)) | (0,0) | ((10,20)) + [(11,12),(13,14)] | (0,0) | [(11,12),(13,14)] + ((11,12),(13,14)) | (0,0) | ((11,12),(13,14)) + [(1,2),(3,4)] | (-10,0) | [(-9,2),(-7,4)] + ((1,2),(3,4)) | (-10,0) | ((-9,2),(-7,4)) + [(0,0),(3,0),(4,5),(1,6)] | (-10,0) | [(-10,0),(-7,0),(-6,5),(-9,6)] + ((1,2),(3,4)) | (-10,0) | ((-9,2),(-7,4)) + ((1,2),(3,4)) | (-10,0) | ((-9,2),(-7,4)) + [(1,2),(3,4)] | (-10,0) | [(-9,2),(-7,4)] + ((10,20)) | (-10,0) | ((0,20)) + [(11,12),(13,14)] | (-10,0) | [(1,12),(3,14)] + ((11,12),(13,14)) | (-10,0) | ((1,12),(3,14)) + [(1,2),(3,4)] | (-3,4) | [(-2,6),(0,8)] + ((1,2),(3,4)) | (-3,4) | ((-2,6),(0,8)) + [(0,0),(3,0),(4,5),(1,6)] | (-3,4) | [(-3,4),(0,4),(1,9),(-2,10)] + ((1,2),(3,4)) | (-3,4) | ((-2,6),(0,8)) + ((1,2),(3,4)) | (-3,4) | ((-2,6),(0,8)) + [(1,2),(3,4)] | (-3,4) | [(-2,6),(0,8)] + ((10,20)) | (-3,4) | ((7,24)) + [(11,12),(13,14)] | (-3,4) | [(8,16),(10,18)] + ((11,12),(13,14)) | (-3,4) | ((8,16),(10,18)) + [(1,2),(3,4)] | (5.1,34.5) | [(6.1,36.5),(8.1,38.5)] + ((1,2),(3,4)) | (5.1,34.5) | ((6.1,36.5),(8.1,38.5)) + [(0,0),(3,0),(4,5),(1,6)] | (5.1,34.5) | [(5.1,34.5),(8.1,34.5),(9.1,39.5),(6.1,40.5)] + ((1,2),(3,4)) | (5.1,34.5) | ((6.1,36.5),(8.1,38.5)) + ((1,2),(3,4)) | (5.1,34.5) | ((6.1,36.5),(8.1,38.5)) + [(1,2),(3,4)] | (5.1,34.5) | [(6.1,36.5),(8.1,38.5)] + ((10,20)) | (5.1,34.5) | ((15.1,54.5)) + [(11,12),(13,14)] | (5.1,34.5) | [(16.1,46.5),(18.1,48.5)] + ((11,12),(13,14)) | (5.1,34.5) | ((16.1,46.5),(18.1,48.5)) + [(1,2),(3,4)] | (-5,-12) | [(-4,-10),(-2,-8)] + ((1,2),(3,4)) | (-5,-12) | ((-4,-10),(-2,-8)) + [(0,0),(3,0),(4,5),(1,6)] | (-5,-12) | [(-5,-12),(-2,-12),(-1,-7),(-4,-6)] + ((1,2),(3,4)) | (-5,-12) | ((-4,-10),(-2,-8)) + ((1,2),(3,4)) | (-5,-12) | ((-4,-10),(-2,-8)) + [(1,2),(3,4)] | (-5,-12) | [(-4,-10),(-2,-8)] + ((10,20)) | (-5,-12) | ((5,8)) + [(11,12),(13,14)] | (-5,-12) | [(6,0),(8,2)] + ((11,12),(13,14)) | (-5,-12) | ((6,0),(8,2)) + [(1,2),(3,4)] | (1e-300,-1e-300) | [(1,2),(3,4)] + ((1,2),(3,4)) | (1e-300,-1e-300) | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | (1e-300,-1e-300) | [(1e-300,-1e-300),(3,-1e-300),(4,5),(1,6)] + ((1,2),(3,4)) | (1e-300,-1e-300) | ((1,2),(3,4)) + ((1,2),(3,4)) | (1e-300,-1e-300) | ((1,2),(3,4)) + [(1,2),(3,4)] | (1e-300,-1e-300) | [(1,2),(3,4)] + ((10,20)) | (1e-300,-1e-300) | ((10,20)) + [(11,12),(13,14)] | (1e-300,-1e-300) | [(11,12),(13,14)] + ((11,12),(13,14)) | (1e-300,-1e-300) | ((11,12),(13,14)) + [(1,2),(3,4)] | (1e+300,Infinity) | [(1e+300,Infinity),(1e+300,Infinity)] + ((1,2),(3,4)) | (1e+300,Infinity) | ((1e+300,Infinity),(1e+300,Infinity)) + [(0,0),(3,0),(4,5),(1,6)] | (1e+300,Infinity) | [(1e+300,Infinity),(1e+300,Infinity),(1e+300,Infinity),(1e+300,Infinity)] + ((1,2),(3,4)) | (1e+300,Infinity) | ((1e+300,Infinity),(1e+300,Infinity)) + ((1,2),(3,4)) | (1e+300,Infinity) | ((1e+300,Infinity),(1e+300,Infinity)) + [(1,2),(3,4)] | (1e+300,Infinity) | [(1e+300,Infinity),(1e+300,Infinity)] + ((10,20)) | (1e+300,Infinity) | ((1e+300,Infinity)) + [(11,12),(13,14)] | (1e+300,Infinity) | [(1e+300,Infinity),(1e+300,Infinity)] + ((11,12),(13,14)) | (1e+300,Infinity) | ((1e+300,Infinity),(1e+300,Infinity)) + [(1,2),(3,4)] | (Infinity,1e+300) | [(Infinity,1e+300),(Infinity,1e+300)] + ((1,2),(3,4)) | (Infinity,1e+300) | ((Infinity,1e+300),(Infinity,1e+300)) + [(0,0),(3,0),(4,5),(1,6)] | (Infinity,1e+300) | [(Infinity,1e+300),(Infinity,1e+300),(Infinity,1e+300),(Infinity,1e+300)] + ((1,2),(3,4)) | (Infinity,1e+300) | ((Infinity,1e+300),(Infinity,1e+300)) + ((1,2),(3,4)) | (Infinity,1e+300) | ((Infinity,1e+300),(Infinity,1e+300)) + [(1,2),(3,4)] | (Infinity,1e+300) | [(Infinity,1e+300),(Infinity,1e+300)] + ((10,20)) | (Infinity,1e+300) | ((Infinity,1e+300)) + [(11,12),(13,14)] | (Infinity,1e+300) | [(Infinity,1e+300),(Infinity,1e+300)] + ((11,12),(13,14)) | (Infinity,1e+300) | ((Infinity,1e+300),(Infinity,1e+300)) + [(1,2),(3,4)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(0,0),(3,0),(4,5),(1,6)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN),(NaN,NaN),(NaN,NaN)] + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(1,2),(3,4)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((10,20)) | (NaN,NaN) | ((NaN,NaN)) + [(11,12),(13,14)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((11,12),(13,14)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(1,2),(3,4)] | (10,10) | [(11,12),(13,14)] + ((1,2),(3,4)) | (10,10) | ((11,12),(13,14)) + [(0,0),(3,0),(4,5),(1,6)] | (10,10) | [(10,10),(13,10),(14,15),(11,16)] + ((1,2),(3,4)) | (10,10) | ((11,12),(13,14)) + ((1,2),(3,4)) | (10,10) | ((11,12),(13,14)) + [(1,2),(3,4)] | (10,10) | [(11,12),(13,14)] + ((10,20)) | (10,10) | ((20,30)) + [(11,12),(13,14)] | (10,10) | [(21,22),(23,24)] + ((11,12),(13,14)) | (10,10) | ((21,22),(23,24)) +(90 rows) + +-- Subtract point +SELECT p.f1, p1.f1, p.f1 - p1.f1 FROM PATH_TBL p, POINT_TBL p1; + f1 | f1 | ?column? +---------------------------+-------------------+----------------------------------------------------------------------------------- + [(1,2),(3,4)] | (0,0) | [(1,2),(3,4)] + ((1,2),(3,4)) | (0,0) | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | (0,0) | [(0,0),(3,0),(4,5),(1,6)] + ((1,2),(3,4)) | (0,0) | ((1,2),(3,4)) + ((1,2),(3,4)) | (0,0) | ((1,2),(3,4)) + [(1,2),(3,4)] | (0,0) | [(1,2),(3,4)] + ((10,20)) | (0,0) | ((10,20)) + [(11,12),(13,14)] | (0,0) | [(11,12),(13,14)] + ((11,12),(13,14)) | (0,0) | ((11,12),(13,14)) + [(1,2),(3,4)] | (-10,0) | [(11,2),(13,4)] + ((1,2),(3,4)) | (-10,0) | ((11,2),(13,4)) + [(0,0),(3,0),(4,5),(1,6)] | (-10,0) | [(10,0),(13,0),(14,5),(11,6)] + ((1,2),(3,4)) | (-10,0) | ((11,2),(13,4)) + ((1,2),(3,4)) | (-10,0) | ((11,2),(13,4)) + [(1,2),(3,4)] | (-10,0) | [(11,2),(13,4)] + ((10,20)) | (-10,0) | ((20,20)) + [(11,12),(13,14)] | (-10,0) | [(21,12),(23,14)] + ((11,12),(13,14)) | (-10,0) | ((21,12),(23,14)) + [(1,2),(3,4)] | (-3,4) | [(4,-2),(6,0)] + ((1,2),(3,4)) | (-3,4) | ((4,-2),(6,0)) + [(0,0),(3,0),(4,5),(1,6)] | (-3,4) | [(3,-4),(6,-4),(7,1),(4,2)] + ((1,2),(3,4)) | (-3,4) | ((4,-2),(6,0)) + ((1,2),(3,4)) | (-3,4) | ((4,-2),(6,0)) + [(1,2),(3,4)] | (-3,4) | [(4,-2),(6,0)] + ((10,20)) | (-3,4) | ((13,16)) + [(11,12),(13,14)] | (-3,4) | [(14,8),(16,10)] + ((11,12),(13,14)) | (-3,4) | ((14,8),(16,10)) + [(1,2),(3,4)] | (5.1,34.5) | [(-4.1,-32.5),(-2.1,-30.5)] + ((1,2),(3,4)) | (5.1,34.5) | ((-4.1,-32.5),(-2.1,-30.5)) + [(0,0),(3,0),(4,5),(1,6)] | (5.1,34.5) | [(-5.1,-34.5),(-2.1,-34.5),(-1.1,-29.5),(-4.1,-28.5)] + ((1,2),(3,4)) | (5.1,34.5) | ((-4.1,-32.5),(-2.1,-30.5)) + ((1,2),(3,4)) | (5.1,34.5) | ((-4.1,-32.5),(-2.1,-30.5)) + [(1,2),(3,4)] | (5.1,34.5) | [(-4.1,-32.5),(-2.1,-30.5)] + ((10,20)) | (5.1,34.5) | ((4.9,-14.5)) + [(11,12),(13,14)] | (5.1,34.5) | [(5.9,-22.5),(7.9,-20.5)] + ((11,12),(13,14)) | (5.1,34.5) | ((5.9,-22.5),(7.9,-20.5)) + [(1,2),(3,4)] | (-5,-12) | [(6,14),(8,16)] + ((1,2),(3,4)) | (-5,-12) | ((6,14),(8,16)) + [(0,0),(3,0),(4,5),(1,6)] | (-5,-12) | [(5,12),(8,12),(9,17),(6,18)] + ((1,2),(3,4)) | (-5,-12) | ((6,14),(8,16)) + ((1,2),(3,4)) | (-5,-12) | ((6,14),(8,16)) + [(1,2),(3,4)] | (-5,-12) | [(6,14),(8,16)] + ((10,20)) | (-5,-12) | ((15,32)) + [(11,12),(13,14)] | (-5,-12) | [(16,24),(18,26)] + ((11,12),(13,14)) | (-5,-12) | ((16,24),(18,26)) + [(1,2),(3,4)] | (1e-300,-1e-300) | [(1,2),(3,4)] + ((1,2),(3,4)) | (1e-300,-1e-300) | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | (1e-300,-1e-300) | [(-1e-300,1e-300),(3,1e-300),(4,5),(1,6)] + ((1,2),(3,4)) | (1e-300,-1e-300) | ((1,2),(3,4)) + ((1,2),(3,4)) | (1e-300,-1e-300) | ((1,2),(3,4)) + [(1,2),(3,4)] | (1e-300,-1e-300) | [(1,2),(3,4)] + ((10,20)) | (1e-300,-1e-300) | ((10,20)) + [(11,12),(13,14)] | (1e-300,-1e-300) | [(11,12),(13,14)] + ((11,12),(13,14)) | (1e-300,-1e-300) | ((11,12),(13,14)) + [(1,2),(3,4)] | (1e+300,Infinity) | [(-1e+300,-Infinity),(-1e+300,-Infinity)] + ((1,2),(3,4)) | (1e+300,Infinity) | ((-1e+300,-Infinity),(-1e+300,-Infinity)) + [(0,0),(3,0),(4,5),(1,6)] | (1e+300,Infinity) | [(-1e+300,-Infinity),(-1e+300,-Infinity),(-1e+300,-Infinity),(-1e+300,-Infinity)] + ((1,2),(3,4)) | (1e+300,Infinity) | ((-1e+300,-Infinity),(-1e+300,-Infinity)) + ((1,2),(3,4)) | (1e+300,Infinity) | ((-1e+300,-Infinity),(-1e+300,-Infinity)) + [(1,2),(3,4)] | (1e+300,Infinity) | [(-1e+300,-Infinity),(-1e+300,-Infinity)] + ((10,20)) | (1e+300,Infinity) | ((-1e+300,-Infinity)) + [(11,12),(13,14)] | (1e+300,Infinity) | [(-1e+300,-Infinity),(-1e+300,-Infinity)] + ((11,12),(13,14)) | (1e+300,Infinity) | ((-1e+300,-Infinity),(-1e+300,-Infinity)) + [(1,2),(3,4)] | (Infinity,1e+300) | [(-Infinity,-1e+300),(-Infinity,-1e+300)] + ((1,2),(3,4)) | (Infinity,1e+300) | ((-Infinity,-1e+300),(-Infinity,-1e+300)) + [(0,0),(3,0),(4,5),(1,6)] | (Infinity,1e+300) | [(-Infinity,-1e+300),(-Infinity,-1e+300),(-Infinity,-1e+300),(-Infinity,-1e+300)] + ((1,2),(3,4)) | (Infinity,1e+300) | ((-Infinity,-1e+300),(-Infinity,-1e+300)) + ((1,2),(3,4)) | (Infinity,1e+300) | ((-Infinity,-1e+300),(-Infinity,-1e+300)) + [(1,2),(3,4)] | (Infinity,1e+300) | [(-Infinity,-1e+300),(-Infinity,-1e+300)] + ((10,20)) | (Infinity,1e+300) | ((-Infinity,-1e+300)) + [(11,12),(13,14)] | (Infinity,1e+300) | [(-Infinity,-1e+300),(-Infinity,-1e+300)] + ((11,12),(13,14)) | (Infinity,1e+300) | ((-Infinity,-1e+300),(-Infinity,-1e+300)) + [(1,2),(3,4)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(0,0),(3,0),(4,5),(1,6)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN),(NaN,NaN),(NaN,NaN)] + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(1,2),(3,4)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((10,20)) | (NaN,NaN) | ((NaN,NaN)) + [(11,12),(13,14)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((11,12),(13,14)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(1,2),(3,4)] | (10,10) | [(-9,-8),(-7,-6)] + ((1,2),(3,4)) | (10,10) | ((-9,-8),(-7,-6)) + [(0,0),(3,0),(4,5),(1,6)] | (10,10) | [(-10,-10),(-7,-10),(-6,-5),(-9,-4)] + ((1,2),(3,4)) | (10,10) | ((-9,-8),(-7,-6)) + ((1,2),(3,4)) | (10,10) | ((-9,-8),(-7,-6)) + [(1,2),(3,4)] | (10,10) | [(-9,-8),(-7,-6)] + ((10,20)) | (10,10) | ((0,10)) + [(11,12),(13,14)] | (10,10) | [(1,2),(3,4)] + ((11,12),(13,14)) | (10,10) | ((1,2),(3,4)) +(90 rows) + +-- Multiply with point +SELECT p.f1, p1.f1, p.f1 * p1.f1 FROM PATH_TBL p, POINT_TBL p1; + f1 | f1 | ?column? +---------------------------+-------------------+---------------------------------------------------------------------- + [(1,2),(3,4)] | (0,0) | [(0,0),(0,0)] + ((1,2),(3,4)) | (0,0) | ((0,0),(0,0)) + [(0,0),(3,0),(4,5),(1,6)] | (0,0) | [(0,0),(0,0),(0,0),(0,0)] + ((1,2),(3,4)) | (0,0) | ((0,0),(0,0)) + ((1,2),(3,4)) | (0,0) | ((0,0),(0,0)) + [(1,2),(3,4)] | (0,0) | [(0,0),(0,0)] + ((10,20)) | (0,0) | ((0,0)) + [(11,12),(13,14)] | (0,0) | [(0,0),(0,0)] + ((11,12),(13,14)) | (0,0) | ((0,0),(0,0)) + [(1,2),(3,4)] | (-10,0) | [(-10,-20),(-30,-40)] + ((1,2),(3,4)) | (-10,0) | ((-10,-20),(-30,-40)) + [(0,0),(3,0),(4,5),(1,6)] | (-10,0) | [(-0,0),(-30,0),(-40,-50),(-10,-60)] + ((1,2),(3,4)) | (-10,0) | ((-10,-20),(-30,-40)) + ((1,2),(3,4)) | (-10,0) | ((-10,-20),(-30,-40)) + [(1,2),(3,4)] | (-10,0) | [(-10,-20),(-30,-40)] + ((10,20)) | (-10,0) | ((-100,-200)) + [(11,12),(13,14)] | (-10,0) | [(-110,-120),(-130,-140)] + ((11,12),(13,14)) | (-10,0) | ((-110,-120),(-130,-140)) + [(1,2),(3,4)] | (-3,4) | [(-11,-2),(-25,0)] + ((1,2),(3,4)) | (-3,4) | ((-11,-2),(-25,0)) + [(0,0),(3,0),(4,5),(1,6)] | (-3,4) | [(-0,0),(-9,12),(-32,1),(-27,-14)] + ((1,2),(3,4)) | (-3,4) | ((-11,-2),(-25,0)) + ((1,2),(3,4)) | (-3,4) | ((-11,-2),(-25,0)) + [(1,2),(3,4)] | (-3,4) | [(-11,-2),(-25,0)] + ((10,20)) | (-3,4) | ((-110,-20)) + [(11,12),(13,14)] | (-3,4) | [(-81,8),(-95,10)] + ((11,12),(13,14)) | (-3,4) | ((-81,8),(-95,10)) + [(1,2),(3,4)] | (5.1,34.5) | [(-63.9,44.7),(-122.7,123.9)] + ((1,2),(3,4)) | (5.1,34.5) | ((-63.9,44.7),(-122.7,123.9)) + [(0,0),(3,0),(4,5),(1,6)] | (5.1,34.5) | [(0,0),(15.3,103.5),(-152.1,163.5),(-201.9,65.1)] + ((1,2),(3,4)) | (5.1,34.5) | ((-63.9,44.7),(-122.7,123.9)) + ((1,2),(3,4)) | (5.1,34.5) | ((-63.9,44.7),(-122.7,123.9)) + [(1,2),(3,4)] | (5.1,34.5) | [(-63.9,44.7),(-122.7,123.9)] + ((10,20)) | (5.1,34.5) | ((-639,447)) + [(11,12),(13,14)] | (5.1,34.5) | [(-357.9,440.7),(-416.7,519.9)] + ((11,12),(13,14)) | (5.1,34.5) | ((-357.9,440.7),(-416.7,519.9)) + [(1,2),(3,4)] | (-5,-12) | [(19,-22),(33,-56)] + ((1,2),(3,4)) | (-5,-12) | ((19,-22),(33,-56)) + [(0,0),(3,0),(4,5),(1,6)] | (-5,-12) | [(0,-0),(-15,-36),(40,-73),(67,-42)] + ((1,2),(3,4)) | (-5,-12) | ((19,-22),(33,-56)) + ((1,2),(3,4)) | (-5,-12) | ((19,-22),(33,-56)) + [(1,2),(3,4)] | (-5,-12) | [(19,-22),(33,-56)] + ((10,20)) | (-5,-12) | ((190,-220)) + [(11,12),(13,14)] | (-5,-12) | [(89,-192),(103,-226)] + ((11,12),(13,14)) | (-5,-12) | ((89,-192),(103,-226)) + [(1,2),(3,4)] | (1e-300,-1e-300) | [(3e-300,1e-300),(7e-300,1e-300)] + ((1,2),(3,4)) | (1e-300,-1e-300) | ((3e-300,1e-300),(7e-300,1e-300)) + [(0,0),(3,0),(4,5),(1,6)] | (1e-300,-1e-300) | [(0,0),(3e-300,-3e-300),(9e-300,1e-300),(7e-300,5e-300)] + ((1,2),(3,4)) | (1e-300,-1e-300) | ((3e-300,1e-300),(7e-300,1e-300)) + ((1,2),(3,4)) | (1e-300,-1e-300) | ((3e-300,1e-300),(7e-300,1e-300)) + [(1,2),(3,4)] | (1e-300,-1e-300) | [(3e-300,1e-300),(7e-300,1e-300)] + ((10,20)) | (1e-300,-1e-300) | ((3e-299,1e-299)) + [(11,12),(13,14)] | (1e-300,-1e-300) | [(2.3e-299,1e-300),(2.7e-299,1e-300)] + ((11,12),(13,14)) | (1e-300,-1e-300) | ((2.3e-299,1e-300),(2.7e-299,1e-300)) + [(1,2),(3,4)] | (1e+300,Infinity) | [(-Infinity,Infinity),(-Infinity,Infinity)] + ((1,2),(3,4)) | (1e+300,Infinity) | ((-Infinity,Infinity),(-Infinity,Infinity)) + [(0,0),(3,0),(4,5),(1,6)] | (1e+300,Infinity) | [(NaN,NaN),(NaN,Infinity),(-Infinity,Infinity),(-Infinity,Infinity)] + ((1,2),(3,4)) | (1e+300,Infinity) | ((-Infinity,Infinity),(-Infinity,Infinity)) + ((1,2),(3,4)) | (1e+300,Infinity) | ((-Infinity,Infinity),(-Infinity,Infinity)) + [(1,2),(3,4)] | (1e+300,Infinity) | [(-Infinity,Infinity),(-Infinity,Infinity)] + ((10,20)) | (1e+300,Infinity) | ((-Infinity,Infinity)) + [(11,12),(13,14)] | (1e+300,Infinity) | [(-Infinity,Infinity),(-Infinity,Infinity)] + ((11,12),(13,14)) | (1e+300,Infinity) | ((-Infinity,Infinity),(-Infinity,Infinity)) + [(1,2),(3,4)] | (Infinity,1e+300) | [(Infinity,Infinity),(Infinity,Infinity)] + ((1,2),(3,4)) | (Infinity,1e+300) | ((Infinity,Infinity),(Infinity,Infinity)) + [(0,0),(3,0),(4,5),(1,6)] | (Infinity,1e+300) | [(NaN,NaN),(Infinity,NaN),(Infinity,Infinity),(Infinity,Infinity)] + ((1,2),(3,4)) | (Infinity,1e+300) | ((Infinity,Infinity),(Infinity,Infinity)) + ((1,2),(3,4)) | (Infinity,1e+300) | ((Infinity,Infinity),(Infinity,Infinity)) + [(1,2),(3,4)] | (Infinity,1e+300) | [(Infinity,Infinity),(Infinity,Infinity)] + ((10,20)) | (Infinity,1e+300) | ((Infinity,Infinity)) + [(11,12),(13,14)] | (Infinity,1e+300) | [(Infinity,Infinity),(Infinity,Infinity)] + ((11,12),(13,14)) | (Infinity,1e+300) | ((Infinity,Infinity),(Infinity,Infinity)) + [(1,2),(3,4)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(0,0),(3,0),(4,5),(1,6)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN),(NaN,NaN),(NaN,NaN)] + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + ((1,2),(3,4)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(1,2),(3,4)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((10,20)) | (NaN,NaN) | ((NaN,NaN)) + [(11,12),(13,14)] | (NaN,NaN) | [(NaN,NaN),(NaN,NaN)] + ((11,12),(13,14)) | (NaN,NaN) | ((NaN,NaN),(NaN,NaN)) + [(1,2),(3,4)] | (10,10) | [(-10,30),(-10,70)] + ((1,2),(3,4)) | (10,10) | ((-10,30),(-10,70)) + [(0,0),(3,0),(4,5),(1,6)] | (10,10) | [(0,0),(30,30),(-10,90),(-50,70)] + ((1,2),(3,4)) | (10,10) | ((-10,30),(-10,70)) + ((1,2),(3,4)) | (10,10) | ((-10,30),(-10,70)) + [(1,2),(3,4)] | (10,10) | [(-10,30),(-10,70)] + ((10,20)) | (10,10) | ((-100,300)) + [(11,12),(13,14)] | (10,10) | [(-10,230),(-10,270)] + ((11,12),(13,14)) | (10,10) | ((-10,230),(-10,270)) +(90 rows) + +-- Divide by point +SELECT p.f1, p1.f1, p.f1 / p1.f1 FROM PATH_TBL p, POINT_TBL p1 WHERE p1.f1[0] BETWEEN 1 AND 1000; + f1 | f1 | ?column? +---------------------------+------------+----------------------------------------------------------------------------------------------------------------- + [(1,2),(3,4)] | (5.1,34.5) | [(0.0609244733856,-0.0199792807459),(0.12604212915,-0.0683242069952)] + [(1,2),(3,4)] | (10,10) | [(0.15,0.05),(0.35,0.05)] + ((1,2),(3,4)) | (5.1,34.5) | ((0.0609244733856,-0.0199792807459),(0.12604212915,-0.0683242069952)) + ((1,2),(3,4)) | (10,10) | ((0.15,0.05),(0.35,0.05)) + [(0,0),(3,0),(4,5),(1,6)] | (5.1,34.5) | [(0,0),(0.0125795471363,-0.0850969365103),(0.158600957032,-0.0924966701199),(0.174387055399,-0.00320655123082)] + [(0,0),(3,0),(4,5),(1,6)] | (10,10) | [(0,0),(0.15,-0.15),(0.45,0.05),(0.35,0.25)] + ((1,2),(3,4)) | (5.1,34.5) | ((0.0609244733856,-0.0199792807459),(0.12604212915,-0.0683242069952)) + ((1,2),(3,4)) | (10,10) | ((0.15,0.05),(0.35,0.05)) + ((1,2),(3,4)) | (5.1,34.5) | ((0.0609244733856,-0.0199792807459),(0.12604212915,-0.0683242069952)) + ((1,2),(3,4)) | (10,10) | ((0.15,0.05),(0.35,0.05)) + [(1,2),(3,4)] | (5.1,34.5) | [(0.0609244733856,-0.0199792807459),(0.12604212915,-0.0683242069952)] + [(1,2),(3,4)] | (10,10) | [(0.15,0.05),(0.35,0.05)] + ((10,20)) | (5.1,34.5) | ((0.609244733856,-0.199792807459)) + ((10,20)) | (10,10) | ((1.5,0.5)) + [(11,12),(13,14)] | (5.1,34.5) | [(0.386512752208,-0.261703911993),(0.451630407972,-0.310048838242)] + [(11,12),(13,14)] | (10,10) | [(1.15,0.05),(1.35,0.05)] + ((11,12),(13,14)) | (5.1,34.5) | ((0.386512752208,-0.261703911993),(0.451630407972,-0.310048838242)) + ((11,12),(13,14)) | (10,10) | ((1.15,0.05),(1.35,0.05)) +(18 rows) + +-- Division by 0 error +SELECT p.f1, p1.f1, p.f1 / p1.f1 FROM PATH_TBL p, POINT_TBL p1 WHERE p1.f1 ~= '(0,0)'::point; +ERROR: division by zero +-- Distance to path +SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM PATH_TBL p1, PATH_TBL p2; + f1 | f1 | ?column? +---------------------------+---------------------------+---------------- + [(1,2),(3,4)] | [(1,2),(3,4)] | 0 + [(1,2),(3,4)] | ((1,2),(3,4)) | 0 + [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6)] | 0.784464540553 + [(1,2),(3,4)] | ((1,2),(3,4)) | 0 + [(1,2),(3,4)] | ((1,2),(3,4)) | 0 + [(1,2),(3,4)] | [(1,2),(3,4)] | 0 + [(1,2),(3,4)] | ((10,20)) | 17.4642491966 + [(1,2),(3,4)] | [(11,12),(13,14)] | 11.313708499 + [(1,2),(3,4)] | ((11,12),(13,14)) | 11.313708499 + ((1,2),(3,4)) | [(1,2),(3,4)] | 0 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] | 0.784464540553 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | [(1,2),(3,4)] | 0 + ((1,2),(3,4)) | ((10,20)) | 17.4642491966 + ((1,2),(3,4)) | [(11,12),(13,14)] | 11.313708499 + ((1,2),(3,4)) | ((11,12),(13,14)) | 11.313708499 + [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4)] | 0.784464540553 + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) | 0.784464540553 + [(0,0),(3,0),(4,5),(1,6)] | [(0,0),(3,0),(4,5),(1,6)] | 0 + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) | 0.784464540553 + [(0,0),(3,0),(4,5),(1,6)] | ((1,2),(3,4)) | 0.784464540553 + [(0,0),(3,0),(4,5),(1,6)] | [(1,2),(3,4)] | 0.784464540553 + [(0,0),(3,0),(4,5),(1,6)] | ((10,20)) | 16.1554944214 + [(0,0),(3,0),(4,5),(1,6)] | [(11,12),(13,14)] | 9.89949493661 + [(0,0),(3,0),(4,5),(1,6)] | ((11,12),(13,14)) | 9.89949493661 + ((1,2),(3,4)) | [(1,2),(3,4)] | 0 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] | 0.784464540553 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | [(1,2),(3,4)] | 0 + ((1,2),(3,4)) | ((10,20)) | 17.4642491966 + ((1,2),(3,4)) | [(11,12),(13,14)] | 11.313708499 + ((1,2),(3,4)) | ((11,12),(13,14)) | 11.313708499 + ((1,2),(3,4)) | [(1,2),(3,4)] | 0 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | [(0,0),(3,0),(4,5),(1,6)] | 0.784464540553 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | ((1,2),(3,4)) | 0 + ((1,2),(3,4)) | [(1,2),(3,4)] | 0 + ((1,2),(3,4)) | ((10,20)) | 17.4642491966 + ((1,2),(3,4)) | [(11,12),(13,14)] | 11.313708499 + ((1,2),(3,4)) | ((11,12),(13,14)) | 11.313708499 + [(1,2),(3,4)] | [(1,2),(3,4)] | 0 + [(1,2),(3,4)] | ((1,2),(3,4)) | 0 + [(1,2),(3,4)] | [(0,0),(3,0),(4,5),(1,6)] | 0.784464540553 + [(1,2),(3,4)] | ((1,2),(3,4)) | 0 + [(1,2),(3,4)] | ((1,2),(3,4)) | 0 + [(1,2),(3,4)] | [(1,2),(3,4)] | 0 + [(1,2),(3,4)] | ((10,20)) | 17.4642491966 + [(1,2),(3,4)] | [(11,12),(13,14)] | 11.313708499 + [(1,2),(3,4)] | ((11,12),(13,14)) | 11.313708499 + ((10,20)) | [(1,2),(3,4)] | 17.4642491966 + ((10,20)) | ((1,2),(3,4)) | 17.4642491966 + ((10,20)) | [(0,0),(3,0),(4,5),(1,6)] | 16.1554944214 + ((10,20)) | ((1,2),(3,4)) | 17.4642491966 + ((10,20)) | ((1,2),(3,4)) | 17.4642491966 + ((10,20)) | [(1,2),(3,4)] | 17.4642491966 + ((10,20)) | ((10,20)) | 0 + ((10,20)) | [(11,12),(13,14)] | 6.7082039325 + ((10,20)) | ((11,12),(13,14)) | 6.7082039325 + [(11,12),(13,14)] | [(1,2),(3,4)] | 11.313708499 + [(11,12),(13,14)] | ((1,2),(3,4)) | 11.313708499 + [(11,12),(13,14)] | [(0,0),(3,0),(4,5),(1,6)] | 9.89949493661 + [(11,12),(13,14)] | ((1,2),(3,4)) | 11.313708499 + [(11,12),(13,14)] | ((1,2),(3,4)) | 11.313708499 + [(11,12),(13,14)] | [(1,2),(3,4)] | 11.313708499 + [(11,12),(13,14)] | ((10,20)) | 6.7082039325 + [(11,12),(13,14)] | [(11,12),(13,14)] | 0 + [(11,12),(13,14)] | ((11,12),(13,14)) | 0 + ((11,12),(13,14)) | [(1,2),(3,4)] | 11.313708499 + ((11,12),(13,14)) | ((1,2),(3,4)) | 11.313708499 + ((11,12),(13,14)) | [(0,0),(3,0),(4,5),(1,6)] | 9.89949493661 + ((11,12),(13,14)) | ((1,2),(3,4)) | 11.313708499 + ((11,12),(13,14)) | ((1,2),(3,4)) | 11.313708499 + ((11,12),(13,14)) | [(1,2),(3,4)] | 11.313708499 + ((11,12),(13,14)) | ((10,20)) | 6.7082039325 + ((11,12),(13,14)) | [(11,12),(13,14)] | 0 + ((11,12),(13,14)) | ((11,12),(13,14)) | 0 +(81 rows) + +-- +-- Polygons +-- +-- containment +SELECT p.f1, poly.f1, poly.f1 @> p.f1 AS contains + FROM POLYGON_TBL poly, POINT_TBL p; + f1 | f1 | contains +-------------------+----------------------------+---------- + (0,0) | ((2,0),(2,4),(0,0)) | t + (0,0) | ((3,1),(3,3),(1,0)) | f + (0,0) | ((1,2),(3,4),(5,6),(7,8)) | f + (0,0) | ((7,8),(5,6),(3,4),(1,2)) | f + (0,0) | ((1,2),(7,8),(5,6),(3,-4)) | f + (0,0) | ((0,0)) | t + (0,0) | ((0,1),(0,1)) | f + (-10,0) | ((2,0),(2,4),(0,0)) | f + (-10,0) | ((3,1),(3,3),(1,0)) | f + (-10,0) | ((1,2),(3,4),(5,6),(7,8)) | f + (-10,0) | ((7,8),(5,6),(3,4),(1,2)) | f + (-10,0) | ((1,2),(7,8),(5,6),(3,-4)) | f + (-10,0) | ((0,0)) | f + (-10,0) | ((0,1),(0,1)) | f + (-3,4) | ((2,0),(2,4),(0,0)) | f + (-3,4) | ((3,1),(3,3),(1,0)) | f + (-3,4) | ((1,2),(3,4),(5,6),(7,8)) | f + (-3,4) | ((7,8),(5,6),(3,4),(1,2)) | f + (-3,4) | ((1,2),(7,8),(5,6),(3,-4)) | f + (-3,4) | ((0,0)) | f + (-3,4) | ((0,1),(0,1)) | f + (5.1,34.5) | ((2,0),(2,4),(0,0)) | f + (5.1,34.5) | ((3,1),(3,3),(1,0)) | f + (5.1,34.5) | ((1,2),(3,4),(5,6),(7,8)) | f + (5.1,34.5) | ((7,8),(5,6),(3,4),(1,2)) | f + (5.1,34.5) | ((1,2),(7,8),(5,6),(3,-4)) | f + (5.1,34.5) | ((0,0)) | f + (5.1,34.5) | ((0,1),(0,1)) | f + (-5,-12) | ((2,0),(2,4),(0,0)) | f + (-5,-12) | ((3,1),(3,3),(1,0)) | f + (-5,-12) | ((1,2),(3,4),(5,6),(7,8)) | f + (-5,-12) | ((7,8),(5,6),(3,4),(1,2)) | f + (-5,-12) | ((1,2),(7,8),(5,6),(3,-4)) | f + (-5,-12) | ((0,0)) | f + (-5,-12) | ((0,1),(0,1)) | f + (1e-300,-1e-300) | ((2,0),(2,4),(0,0)) | t + (1e-300,-1e-300) | ((3,1),(3,3),(1,0)) | f + (1e-300,-1e-300) | ((1,2),(3,4),(5,6),(7,8)) | f + (1e-300,-1e-300) | ((7,8),(5,6),(3,4),(1,2)) | f + (1e-300,-1e-300) | ((1,2),(7,8),(5,6),(3,-4)) | f + (1e-300,-1e-300) | ((0,0)) | t + (1e-300,-1e-300) | ((0,1),(0,1)) | f + (1e+300,Infinity) | ((2,0),(2,4),(0,0)) | f + (1e+300,Infinity) | ((3,1),(3,3),(1,0)) | f + (1e+300,Infinity) | ((1,2),(3,4),(5,6),(7,8)) | f + (1e+300,Infinity) | ((7,8),(5,6),(3,4),(1,2)) | f + (1e+300,Infinity) | ((1,2),(7,8),(5,6),(3,-4)) | f + (1e+300,Infinity) | ((0,0)) | f + (1e+300,Infinity) | ((0,1),(0,1)) | f + (Infinity,1e+300) | ((2,0),(2,4),(0,0)) | f + (Infinity,1e+300) | ((3,1),(3,3),(1,0)) | f + (Infinity,1e+300) | ((1,2),(3,4),(5,6),(7,8)) | f + (Infinity,1e+300) | ((7,8),(5,6),(3,4),(1,2)) | f + (Infinity,1e+300) | ((1,2),(7,8),(5,6),(3,-4)) | f + (Infinity,1e+300) | ((0,0)) | f + (Infinity,1e+300) | ((0,1),(0,1)) | f + (NaN,NaN) | ((2,0),(2,4),(0,0)) | t + (NaN,NaN) | ((3,1),(3,3),(1,0)) | t + (NaN,NaN) | ((1,2),(3,4),(5,6),(7,8)) | t + (NaN,NaN) | ((7,8),(5,6),(3,4),(1,2)) | t + (NaN,NaN) | ((1,2),(7,8),(5,6),(3,-4)) | t + (NaN,NaN) | ((0,0)) | t + (NaN,NaN) | ((0,1),(0,1)) | t + (10,10) | ((2,0),(2,4),(0,0)) | f + (10,10) | ((3,1),(3,3),(1,0)) | f + (10,10) | ((1,2),(3,4),(5,6),(7,8)) | f + (10,10) | ((7,8),(5,6),(3,4),(1,2)) | f + (10,10) | ((1,2),(7,8),(5,6),(3,-4)) | f + (10,10) | ((0,0)) | f + (10,10) | ((0,1),(0,1)) | f +(70 rows) + +SELECT p.f1, poly.f1, p.f1 <@ poly.f1 AS contained + FROM POLYGON_TBL poly, POINT_TBL p; + f1 | f1 | contained +-------------------+----------------------------+----------- + (0,0) | ((2,0),(2,4),(0,0)) | t + (0,0) | ((3,1),(3,3),(1,0)) | f + (0,0) | ((1,2),(3,4),(5,6),(7,8)) | f + (0,0) | ((7,8),(5,6),(3,4),(1,2)) | f + (0,0) | ((1,2),(7,8),(5,6),(3,-4)) | f + (0,0) | ((0,0)) | t + (0,0) | ((0,1),(0,1)) | f + (-10,0) | ((2,0),(2,4),(0,0)) | f + (-10,0) | ((3,1),(3,3),(1,0)) | f + (-10,0) | ((1,2),(3,4),(5,6),(7,8)) | f + (-10,0) | ((7,8),(5,6),(3,4),(1,2)) | f + (-10,0) | ((1,2),(7,8),(5,6),(3,-4)) | f + (-10,0) | ((0,0)) | f + (-10,0) | ((0,1),(0,1)) | f + (-3,4) | ((2,0),(2,4),(0,0)) | f + (-3,4) | ((3,1),(3,3),(1,0)) | f + (-3,4) | ((1,2),(3,4),(5,6),(7,8)) | f + (-3,4) | ((7,8),(5,6),(3,4),(1,2)) | f + (-3,4) | ((1,2),(7,8),(5,6),(3,-4)) | f + (-3,4) | ((0,0)) | f + (-3,4) | ((0,1),(0,1)) | f + (5.1,34.5) | ((2,0),(2,4),(0,0)) | f + (5.1,34.5) | ((3,1),(3,3),(1,0)) | f + (5.1,34.5) | ((1,2),(3,4),(5,6),(7,8)) | f + (5.1,34.5) | ((7,8),(5,6),(3,4),(1,2)) | f + (5.1,34.5) | ((1,2),(7,8),(5,6),(3,-4)) | f + (5.1,34.5) | ((0,0)) | f + (5.1,34.5) | ((0,1),(0,1)) | f + (-5,-12) | ((2,0),(2,4),(0,0)) | f + (-5,-12) | ((3,1),(3,3),(1,0)) | f + (-5,-12) | ((1,2),(3,4),(5,6),(7,8)) | f + (-5,-12) | ((7,8),(5,6),(3,4),(1,2)) | f + (-5,-12) | ((1,2),(7,8),(5,6),(3,-4)) | f + (-5,-12) | ((0,0)) | f + (-5,-12) | ((0,1),(0,1)) | f + (1e-300,-1e-300) | ((2,0),(2,4),(0,0)) | t + (1e-300,-1e-300) | ((3,1),(3,3),(1,0)) | f + (1e-300,-1e-300) | ((1,2),(3,4),(5,6),(7,8)) | f + (1e-300,-1e-300) | ((7,8),(5,6),(3,4),(1,2)) | f + (1e-300,-1e-300) | ((1,2),(7,8),(5,6),(3,-4)) | f + (1e-300,-1e-300) | ((0,0)) | t + (1e-300,-1e-300) | ((0,1),(0,1)) | f + (1e+300,Infinity) | ((2,0),(2,4),(0,0)) | f + (1e+300,Infinity) | ((3,1),(3,3),(1,0)) | f + (1e+300,Infinity) | ((1,2),(3,4),(5,6),(7,8)) | f + (1e+300,Infinity) | ((7,8),(5,6),(3,4),(1,2)) | f + (1e+300,Infinity) | ((1,2),(7,8),(5,6),(3,-4)) | f + (1e+300,Infinity) | ((0,0)) | f + (1e+300,Infinity) | ((0,1),(0,1)) | f + (Infinity,1e+300) | ((2,0),(2,4),(0,0)) | f + (Infinity,1e+300) | ((3,1),(3,3),(1,0)) | f + (Infinity,1e+300) | ((1,2),(3,4),(5,6),(7,8)) | f + (Infinity,1e+300) | ((7,8),(5,6),(3,4),(1,2)) | f + (Infinity,1e+300) | ((1,2),(7,8),(5,6),(3,-4)) | f + (Infinity,1e+300) | ((0,0)) | f + (Infinity,1e+300) | ((0,1),(0,1)) | f + (NaN,NaN) | ((2,0),(2,4),(0,0)) | t + (NaN,NaN) | ((3,1),(3,3),(1,0)) | t + (NaN,NaN) | ((1,2),(3,4),(5,6),(7,8)) | t + (NaN,NaN) | ((7,8),(5,6),(3,4),(1,2)) | t + (NaN,NaN) | ((1,2),(7,8),(5,6),(3,-4)) | t + (NaN,NaN) | ((0,0)) | t + (NaN,NaN) | ((0,1),(0,1)) | t + (10,10) | ((2,0),(2,4),(0,0)) | f + (10,10) | ((3,1),(3,3),(1,0)) | f + (10,10) | ((1,2),(3,4),(5,6),(7,8)) | f + (10,10) | ((7,8),(5,6),(3,4),(1,2)) | f + (10,10) | ((1,2),(7,8),(5,6),(3,-4)) | f + (10,10) | ((0,0)) | f + (10,10) | ((0,1),(0,1)) | f +(70 rows) + +SELECT npoints(f1) AS npoints, f1 AS polygon + FROM POLYGON_TBL; + npoints | polygon +---------+---------------------------- + 3 | ((2,0),(2,4),(0,0)) + 3 | ((3,1),(3,3),(1,0)) + 4 | ((1,2),(3,4),(5,6),(7,8)) + 4 | ((7,8),(5,6),(3,4),(1,2)) + 4 | ((1,2),(7,8),(5,6),(3,-4)) + 1 | ((0,0)) + 2 | ((0,1),(0,1)) +(7 rows) + +SELECT polygon(f1) + FROM BOX_TBL; + polygon +------------------------------------------- + ((0,0),(0,2),(2,2),(2,0)) + ((1,1),(1,3),(3,3),(3,1)) + ((-8,-10),(-8,2),(-2,2),(-2,-10)) + ((2.5,2.5),(2.5,3.5),(2.5,3.5),(2.5,2.5)) + ((3,3),(3,3),(3,3),(3,3)) +(5 rows) + +SELECT polygon(f1) + FROM PATH_TBL WHERE isclosed(f1); + polygon +------------------- + ((1,2),(3,4)) + ((1,2),(3,4)) + ((1,2),(3,4)) + ((10,20)) + ((11,12),(13,14)) +(5 rows) + +SELECT f1 AS open_path, polygon( pclose(f1)) AS polygon + FROM PATH_TBL + WHERE isopen(f1); + open_path | polygon +---------------------------+--------------------------- + [(1,2),(3,4)] | ((1,2),(3,4)) + [(0,0),(3,0),(4,5),(1,6)] | ((0,0),(3,0),(4,5),(1,6)) + [(1,2),(3,4)] | ((1,2),(3,4)) + [(11,12),(13,14)] | ((11,12),(13,14)) +(4 rows) + +-- To box +SELECT f1, f1::box FROM POLYGON_TBL; + f1 | f1 +----------------------------+-------------- + ((2,0),(2,4),(0,0)) | (2,4),(0,0) + ((3,1),(3,3),(1,0)) | (3,3),(1,0) + ((1,2),(3,4),(5,6),(7,8)) | (7,8),(1,2) + ((7,8),(5,6),(3,4),(1,2)) | (7,8),(1,2) + ((1,2),(7,8),(5,6),(3,-4)) | (7,8),(1,-4) + ((0,0)) | (0,0),(0,0) + ((0,1),(0,1)) | (0,1),(0,1) +(7 rows) + +-- To path +SELECT f1, f1::path FROM POLYGON_TBL; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((0,0)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(7 rows) + +-- Same as polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 ~= p2.f1; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((0,0)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(9 rows) + +-- Contained by polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 <@ p2.f1; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(7,8),(5,6),(3,-4)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((2,0),(2,4),(0,0)) + ((0,0)) | ((0,0)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(12 rows) + +-- Contains polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 @> p2.f1; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((2,0),(2,4),(0,0)) | ((0,0)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(7,8),(5,6),(3,-4)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((0,0)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(12 rows) + +-- Overlap with polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 && p2.f1; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((2,0),(2,4),(0,0)) | ((3,1),(3,3),(1,0)) + ((2,0),(2,4),(0,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((2,0),(2,4),(0,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((2,0),(2,4),(0,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((2,0),(2,4),(0,0)) | ((0,0)) + ((3,1),(3,3),(1,0)) | ((2,0),(2,4),(0,0)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((3,1),(3,3),(1,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(3,4),(5,6),(7,8)) | ((2,0),(2,4),(0,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(7,8),(5,6),(3,-4)) + ((7,8),(5,6),(3,4),(1,2)) | ((2,0),(2,4),(0,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(7,8),(5,6),(3,-4)) | ((2,0),(2,4),(0,0)) + ((1,2),(7,8),(5,6),(3,-4)) | ((3,1),(3,3),(1,0)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(7,8),(5,6),(3,-4)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((2,0),(2,4),(0,0)) + ((0,0)) | ((0,0)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(25 rows) + +-- Left of polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 << p2.f1; + f1 | f1 +---------------+---------------------------- + ((0,0)) | ((3,1),(3,3),(1,0)) + ((0,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((0,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((0,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,1),(0,1)) | ((3,1),(3,3),(1,0)) + ((0,1),(0,1)) | ((1,2),(3,4),(5,6),(7,8)) + ((0,1),(0,1)) | ((7,8),(5,6),(3,4),(1,2)) + ((0,1),(0,1)) | ((1,2),(7,8),(5,6),(3,-4)) +(8 rows) + +-- Overlap of left of polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &< p2.f1; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((2,0),(2,4),(0,0)) | ((3,1),(3,3),(1,0)) + ((2,0),(2,4),(0,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((2,0),(2,4),(0,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((2,0),(2,4),(0,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((3,1),(3,3),(1,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((3,1),(3,3),(1,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((3,1),(3,3),(1,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(7,8),(5,6),(3,-4)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(7,8),(5,6),(3,-4)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((2,0),(2,4),(0,0)) + ((0,0)) | ((3,1),(3,3),(1,0)) + ((0,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((0,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((0,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((0,0)) + ((0,0)) | ((0,1),(0,1)) + ((0,1),(0,1)) | ((2,0),(2,4),(0,0)) + ((0,1),(0,1)) | ((3,1),(3,3),(1,0)) + ((0,1),(0,1)) | ((1,2),(3,4),(5,6),(7,8)) + ((0,1),(0,1)) | ((7,8),(5,6),(3,4),(1,2)) + ((0,1),(0,1)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,1),(0,1)) | ((0,0)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(32 rows) + +-- Right of polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 >> p2.f1; + f1 | f1 +----------------------------+--------------- + ((3,1),(3,3),(1,0)) | ((0,0)) + ((3,1),(3,3),(1,0)) | ((0,1),(0,1)) + ((1,2),(3,4),(5,6),(7,8)) | ((0,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((0,1),(0,1)) + ((7,8),(5,6),(3,4),(1,2)) | ((0,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((0,1),(0,1)) + ((1,2),(7,8),(5,6),(3,-4)) | ((0,0)) + ((1,2),(7,8),(5,6),(3,-4)) | ((0,1),(0,1)) +(8 rows) + +-- Overlap of right of polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &> p2.f1; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((2,0),(2,4),(0,0)) | ((0,0)) + ((2,0),(2,4),(0,0)) | ((0,1),(0,1)) + ((3,1),(3,3),(1,0)) | ((2,0),(2,4),(0,0)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((3,1),(3,3),(1,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((3,1),(3,3),(1,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((3,1),(3,3),(1,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((3,1),(3,3),(1,0)) | ((0,0)) + ((3,1),(3,3),(1,0)) | ((0,1),(0,1)) + ((1,2),(3,4),(5,6),(7,8)) | ((2,0),(2,4),(0,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((3,1),(3,3),(1,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(3,4),(5,6),(7,8)) | ((0,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((0,1),(0,1)) + ((7,8),(5,6),(3,4),(1,2)) | ((2,0),(2,4),(0,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((3,1),(3,3),(1,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(7,8),(5,6),(3,-4)) + ((7,8),(5,6),(3,4),(1,2)) | ((0,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((0,1),(0,1)) + ((1,2),(7,8),(5,6),(3,-4)) | ((2,0),(2,4),(0,0)) + ((1,2),(7,8),(5,6),(3,-4)) | ((3,1),(3,3),(1,0)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(7,8),(5,6),(3,-4)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(7,8),(5,6),(3,-4)) | ((0,0)) + ((1,2),(7,8),(5,6),(3,-4)) | ((0,1),(0,1)) + ((0,0)) | ((2,0),(2,4),(0,0)) + ((0,0)) | ((0,0)) + ((0,0)) | ((0,1),(0,1)) + ((0,1),(0,1)) | ((2,0),(2,4),(0,0)) + ((0,1),(0,1)) | ((0,0)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(37 rows) + +-- Below polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 <<| p2.f1; + f1 | f1 +---------------+--------------------------- + ((0,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((0,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((0,0)) | ((0,1),(0,1)) + ((0,1),(0,1)) | ((1,2),(3,4),(5,6),(7,8)) + ((0,1),(0,1)) | ((7,8),(5,6),(3,4),(1,2)) +(5 rows) + +-- Overlap or below polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &<| p2.f1; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((2,0),(2,4),(0,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((2,0),(2,4),(0,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((2,0),(2,4),(0,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((3,1),(3,3),(1,0)) | ((2,0),(2,4),(0,0)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((3,1),(3,3),(1,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((3,1),(3,3),(1,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((3,1),(3,3),(1,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(7,8),(5,6),(3,-4)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(7,8),(5,6),(3,-4)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((2,0),(2,4),(0,0)) + ((0,0)) | ((3,1),(3,3),(1,0)) + ((0,0)) | ((1,2),(3,4),(5,6),(7,8)) + ((0,0)) | ((7,8),(5,6),(3,4),(1,2)) + ((0,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((0,0)) + ((0,0)) | ((0,1),(0,1)) + ((0,1),(0,1)) | ((2,0),(2,4),(0,0)) + ((0,1),(0,1)) | ((3,1),(3,3),(1,0)) + ((0,1),(0,1)) | ((1,2),(3,4),(5,6),(7,8)) + ((0,1),(0,1)) | ((7,8),(5,6),(3,4),(1,2)) + ((0,1),(0,1)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(31 rows) + +-- Above polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |>> p2.f1; + f1 | f1 +---------------------------+--------------- + ((1,2),(3,4),(5,6),(7,8)) | ((0,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((0,1),(0,1)) + ((7,8),(5,6),(3,4),(1,2)) | ((0,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((0,1),(0,1)) + ((0,1),(0,1)) | ((0,0)) +(5 rows) + +-- Overlap or above polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |&> p2.f1; + f1 | f1 +----------------------------+---------------------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) + ((2,0),(2,4),(0,0)) | ((3,1),(3,3),(1,0)) + ((2,0),(2,4),(0,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((2,0),(2,4),(0,0)) | ((0,0)) + ((3,1),(3,3),(1,0)) | ((2,0),(2,4),(0,0)) + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) + ((3,1),(3,3),(1,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((3,1),(3,3),(1,0)) | ((0,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((2,0),(2,4),(0,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((3,1),(3,3),(1,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(7,8),(5,6),(3,-4)) + ((1,2),(3,4),(5,6),(7,8)) | ((0,0)) + ((1,2),(3,4),(5,6),(7,8)) | ((0,1),(0,1)) + ((7,8),(5,6),(3,4),(1,2)) | ((2,0),(2,4),(0,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((3,1),(3,3),(1,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(7,8),(5,6),(3,-4)) + ((7,8),(5,6),(3,4),(1,2)) | ((0,0)) + ((7,8),(5,6),(3,4),(1,2)) | ((0,1),(0,1)) + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((2,0),(2,4),(0,0)) + ((0,0)) | ((3,1),(3,3),(1,0)) + ((0,0)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) | ((0,0)) + ((0,1),(0,1)) | ((2,0),(2,4),(0,0)) + ((0,1),(0,1)) | ((3,1),(3,3),(1,0)) + ((0,1),(0,1)) | ((1,2),(7,8),(5,6),(3,-4)) + ((0,1),(0,1)) | ((0,0)) + ((0,1),(0,1)) | ((0,1),(0,1)) +(32 rows) + +-- Distance to polygon +SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2; +ERROR: function "poly_distance" not implemented +-- +-- Circles +-- +SELECT circle(f1, 50.0) + FROM POINT_TBL; + circle +------------------------ + <(0,0),50> + <(-10,0),50> + <(-3,4),50> + <(5.1,34.5),50> + <(-5,-12),50> + <(1e-300,-1e-300),50> + <(1e+300,Infinity),50> + <(Infinity,1e+300),50> + <(NaN,NaN),50> + <(10,10),50> +(10 rows) + +SELECT circle(f1) + FROM BOX_TBL; + circle +------------------------ + <(1,1),1.41421356237> + <(2,2),1.41421356237> + <(-5,-4),6.7082039325> + <(2.5,3),0.5> + <(3,3),0> +(5 rows) + +SELECT circle(f1) + FROM POLYGON_TBL + WHERE (# f1) >= 3; + circle +----------------------------------------------- + <(1.33333333333,1.33333333333),2.04168905064> + <(2.33333333333,1.33333333333),1.47534300379> + <(4,5),2.82842712475> + <(4,5),2.82842712475> + <(4,3),4.80664375676> +(5 rows) + +SELECT c1.f1 AS circle, p1.f1 AS point, (p1.f1 <-> c1.f1) AS distance + FROM CIRCLE_TBL c1, POINT_TBL p1 + WHERE (p1.f1 <-> c1.f1) > 0 + ORDER BY distance, area(c1.f1), p1.f1[0]; + circle | point | distance +----------------+-------------------+--------------- + <(1,2),3> | (-3,4) | 1.472135955 + <(5,1),3> | (0,0) | 2.09901951359 + <(5,1),3> | (1e-300,-1e-300) | 2.09901951359 + <(5,1),3> | (-3,4) | 5.54400374532 + <(3,5),0> | (0,0) | 5.83095189485 + <(3,5),0> | (1e-300,-1e-300) | 5.83095189485 + <(3,5),0> | (-3,4) | 6.0827625303 + <(1,3),5> | (-10,0) | 6.40175425099 + <(1,3),5> | (10,10) | 6.40175425099 + <(5,1),3> | (10,10) | 7.29563014099 + <(1,2),3> | (-10,0) | 8.1803398875 + <(3,5),0> | (10,10) | 8.60232526704 + <(1,2),3> | (10,10) | 9.04159457879 + <(1,3),5> | (-5,-12) | 11.1554944214 + <(5,1),3> | (-10,0) | 12.0332963784 + <(1,2),3> | (-5,-12) | 12.2315462117 + <(5,1),3> | (-5,-12) | 13.4012194669 + <(3,5),0> | (-10,0) | 13.9283882772 + <(3,5),0> | (-5,-12) | 18.7882942281 + <(1,3),5> | (5.1,34.5) | 26.7657047773 + <(3,5),0> | (5.1,34.5) | 29.5746513082 + <(1,2),3> | (5.1,34.5) | 29.7575945393 + <(5,1),3> | (5.1,34.5) | 30.5001492534 + <(100,200),10> | (5.1,34.5) | 180.778038568 + <(100,200),10> | (10,10) | 200.237960416 + <(100,200),10> | (-3,4) | 211.415898255 + <(100,200),10> | (0,0) | 213.60679775 + <(100,200),10> | (1e-300,-1e-300) | 213.60679775 + <(100,200),10> | (-10,0) | 218.25424421 + <(100,200),10> | (-5,-12) | 226.577682802 + <(3,5),0> | (1e+300,Infinity) | Infinity + <(3,5),0> | (Infinity,1e+300) | Infinity + <(1,2),3> | (1e+300,Infinity) | Infinity + <(5,1),3> | (1e+300,Infinity) | Infinity + <(5,1),3> | (Infinity,1e+300) | Infinity + <(1,2),3> | (Infinity,1e+300) | Infinity + <(1,3),5> | (1e+300,Infinity) | Infinity + <(1,3),5> | (Infinity,1e+300) | Infinity + <(100,200),10> | (1e+300,Infinity) | Infinity + <(100,200),10> | (Infinity,1e+300) | Infinity + <(1,2),100> | (1e+300,Infinity) | Infinity + <(1,2),100> | (Infinity,1e+300) | Infinity + <(100,1),115> | (1e+300,Infinity) | Infinity + <(100,1),115> | (Infinity,1e+300) | Infinity + <(3,5),0> | (NaN,NaN) | NaN + <(1,2),3> | (NaN,NaN) | NaN + <(5,1),3> | (NaN,NaN) | NaN + <(1,3),5> | (NaN,NaN) | NaN + <(100,200),10> | (NaN,NaN) | NaN + <(1,2),100> | (NaN,NaN) | NaN + <(100,1),115> | (NaN,NaN) | NaN + <(3,5),NaN> | (-10,0) | NaN + <(3,5),NaN> | (-5,-12) | NaN + <(3,5),NaN> | (-3,4) | NaN + <(3,5),NaN> | (0,0) | NaN + <(3,5),NaN> | (1e-300,-1e-300) | NaN + <(3,5),NaN> | (5.1,34.5) | NaN + <(3,5),NaN> | (10,10) | NaN + <(3,5),NaN> | (1e+300,Infinity) | NaN + <(3,5),NaN> | (Infinity,1e+300) | NaN + <(3,5),NaN> | (NaN,NaN) | NaN +(61 rows) + +-- To polygon +SELECT f1, f1::polygon FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>'; + f1 | f1 +----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + <(5,1),3> | ((2,1),(2.40192378865,2.5),(3.5,3.59807621135),(5,4),(6.5,3.59807621135),(7.59807621135,2.5),(8,1),(7.59807621135,-0.5),(6.5,-1.59807621135),(5,-2),(3.5,-1.59807621135),(2.40192378865,-0.5)) + <(1,2),100> | ((-99,2),(-85.6025403784,52),(-49,88.6025403784),(1,102),(51,88.6025403784),(87.6025403784,52),(101,2),(87.6025403784,-48),(51,-84.6025403784),(1,-98),(-49,-84.6025403784),(-85.6025403784,-48)) + <(1,3),5> | ((-4,3),(-3.33012701892,5.5),(-1.5,7.33012701892),(1,8),(3.5,7.33012701892),(5.33012701892,5.5),(6,3),(5.33012701892,0.5),(3.5,-1.33012701892),(1,-2),(-1.5,-1.33012701892),(-3.33012701892,0.5)) + <(1,2),3> | ((-2,2),(-1.59807621135,3.5),(-0.5,4.59807621135),(1,5),(2.5,4.59807621135),(3.59807621135,3.5),(4,2),(3.59807621135,0.5),(2.5,-0.598076211353),(1,-1),(-0.5,-0.598076211353),(-1.59807621135,0.5)) + <(100,200),10> | ((90,200),(91.3397459622,205),(95,208.660254038),(100,210),(105,208.660254038),(108.660254038,205),(110,200),(108.660254038,195),(105,191.339745962),(100,190),(95,191.339745962),(91.3397459622,195)) + <(100,1),115> | ((-15,1),(0.40707856479,58.5),(42.5,100.592921435),(100,116),(157.5,100.592921435),(199.592921435,58.5),(215,1),(199.592921435,-56.5),(157.5,-98.5929214352),(100,-114),(42.5,-98.5929214352),(0.40707856479,-56.5)) +(6 rows) + +-- To polygon with less points +SELECT f1, polygon(8, f1) FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>'; + f1 | polygon +----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------ + <(5,1),3> | ((2,1),(2.87867965644,3.12132034356),(5,4),(7.12132034356,3.12132034356),(8,1),(7.12132034356,-1.12132034356),(5,-2),(2.87867965644,-1.12132034356)) + <(1,2),100> | ((-99,2),(-69.7106781187,72.7106781187),(1,102),(71.7106781187,72.7106781187),(101,2),(71.7106781187,-68.7106781187),(1,-98),(-69.7106781187,-68.7106781187)) + <(1,3),5> | ((-4,3),(-2.53553390593,6.53553390593),(1,8),(4.53553390593,6.53553390593),(6,3),(4.53553390593,-0.535533905933),(1,-2),(-2.53553390593,-0.535533905933)) + <(1,2),3> | ((-2,2),(-1.12132034356,4.12132034356),(1,5),(3.12132034356,4.12132034356),(4,2),(3.12132034356,-0.12132034356),(1,-1),(-1.12132034356,-0.12132034356)) + <(100,200),10> | ((90,200),(92.9289321881,207.071067812),(100,210),(107.071067812,207.071067812),(110,200),(107.071067812,192.928932188),(100,190),(92.9289321881,192.928932188)) + <(100,1),115> | ((-15,1),(18.6827201635,82.3172798365),(100,116),(181.317279836,82.3172798365),(215,1),(181.317279836,-80.3172798365),(100,-114),(18.6827201635,-80.3172798365)) +(6 rows) + +-- Error for insufficient number of points +SELECT f1, polygon(1, f1) FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>'; +ERROR: must request at least 2 points +-- Zero radius error +SELECT f1, polygon(10, f1) FROM CIRCLE_TBL WHERE f1 < '<(0,0),1>'; +ERROR: cannot convert circle with radius zero to polygon +-- Same as circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 ~= c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(1,2),100> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,2),3> | <(1,2),3> + <(100,200),10> | <(100,200),10> + <(100,1),115> | <(100,1),115> + <(3,5),0> | <(3,5),0> + <(3,5),NaN> | <(3,5),0> + <(3,5),NaN> | <(3,5),NaN> +(9 rows) + +-- Overlap with circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 && c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(1,2),3> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(5,1),3> + <(1,2),100> | <(1,2),100> + <(1,2),100> | <(1,3),5> + <(1,2),100> | <(1,2),3> + <(1,2),100> | <(100,1),115> + <(1,2),100> | <(3,5),0> + <(1,3),5> | <(5,1),3> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(1,2),3> + <(1,3),5> | <(100,1),115> + <(1,3),5> | <(3,5),0> + <(1,2),3> | <(5,1),3> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(1,2),3> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(100,200),10> + <(100,1),115> | <(5,1),3> + <(100,1),115> | <(1,2),100> + <(100,1),115> | <(1,3),5> + <(100,1),115> | <(1,2),3> + <(100,1),115> | <(100,1),115> + <(100,1),115> | <(3,5),0> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(100,1),115> + <(3,5),0> | <(3,5),0> +(33 rows) + +-- Overlap or left of circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &< c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(100,200),10> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(1,2),100> + <(1,2),100> | <(100,200),10> + <(1,2),100> | <(100,1),115> + <(1,3),5> | <(5,1),3> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(100,200),10> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(5,1),3> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(1,2),3> + <(1,2),3> | <(100,200),10> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(100,200),10> + <(100,200),10> | <(100,1),115> + <(100,1),115> | <(100,1),115> + <(3,5),0> | <(5,1),3> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,200),10> + <(3,5),0> | <(100,1),115> + <(3,5),0> | <(3,5),0> +(28 rows) + +-- Left of circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 << c2.f1; + f1 | f1 +-----------+---------------- + <(5,1),3> | <(100,200),10> + <(1,3),5> | <(100,200),10> + <(1,2),3> | <(100,200),10> + <(3,5),0> | <(100,200),10> +(4 rows) + +-- Right of circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 >> c2.f1; + f1 | f1 +----------------+----------- + <(100,200),10> | <(5,1),3> + <(100,200),10> | <(1,3),5> + <(100,200),10> | <(1,2),3> + <(100,200),10> | <(3,5),0> +(4 rows) + +-- Overlap or right of circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &> c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(1,2),3> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(1,2),100> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(1,2),3> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(5,1),3> + <(100,200),10> | <(1,2),100> + <(100,200),10> | <(1,3),5> + <(100,200),10> | <(1,2),3> + <(100,200),10> | <(100,200),10> + <(100,200),10> | <(100,1),115> + <(100,200),10> | <(3,5),0> + <(100,1),115> | <(1,2),100> + <(100,1),115> | <(100,1),115> + <(3,5),0> | <(5,1),3> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,1),115> + <(3,5),0> | <(3,5),0> +(28 rows) + +-- Contained by circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <@ c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(1,2),100> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(1,2),3> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(100,200),10> + <(100,1),115> | <(100,1),115> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(100,1),115> + <(3,5),0> | <(3,5),0> +(17 rows) + +-- Contain by circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 @> c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(1,2),100> | <(5,1),3> + <(1,2),100> | <(1,2),100> + <(1,2),100> | <(1,3),5> + <(1,2),100> | <(1,2),3> + <(1,2),100> | <(3,5),0> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(1,2),3> + <(1,3),5> | <(3,5),0> + <(1,2),3> | <(1,2),3> + <(100,200),10> | <(100,200),10> + <(100,1),115> | <(5,1),3> + <(100,1),115> | <(1,3),5> + <(100,1),115> | <(1,2),3> + <(100,1),115> | <(100,1),115> + <(100,1),115> | <(3,5),0> + <(3,5),0> | <(3,5),0> +(17 rows) + +-- Below circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <<| c2.f1; + f1 | f1 +---------------+---------------- + <(5,1),3> | <(100,200),10> + <(5,1),3> | <(3,5),0> + <(1,2),100> | <(100,200),10> + <(1,3),5> | <(100,200),10> + <(1,2),3> | <(100,200),10> + <(100,1),115> | <(100,200),10> + <(3,5),0> | <(100,200),10> +(7 rows) + +-- Above circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 |>> c2.f1; + f1 | f1 +----------------+--------------- + <(100,200),10> | <(5,1),3> + <(100,200),10> | <(1,2),100> + <(100,200),10> | <(1,3),5> + <(100,200),10> | <(1,2),3> + <(100,200),10> | <(100,1),115> + <(100,200),10> | <(3,5),0> + <(3,5),0> | <(5,1),3> +(7 rows) + +-- Overlap or below circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &<| c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(1,2),3> + <(5,1),3> | <(100,200),10> + <(5,1),3> | <(100,1),115> + <(5,1),3> | <(3,5),0> + <(1,2),100> | <(1,2),100> + <(1,2),100> | <(100,200),10> + <(1,2),100> | <(100,1),115> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(100,200),10> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(1,2),3> + <(1,2),3> | <(100,200),10> + <(1,2),3> | <(100,1),115> + <(1,2),3> | <(3,5),0> + <(100,200),10> | <(100,200),10> + <(100,1),115> | <(100,200),10> + <(100,1),115> | <(100,1),115> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,200),10> + <(3,5),0> | <(100,1),115> + <(3,5),0> | <(3,5),0> +(29 rows) + +-- Overlap or above circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 |&> c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(1,2),100> + <(1,2),100> | <(100,1),115> + <(1,3),5> | <(5,1),3> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(5,1),3> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(1,2),3> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(5,1),3> + <(100,200),10> | <(1,2),100> + <(100,200),10> | <(1,3),5> + <(100,200),10> | <(1,2),3> + <(100,200),10> | <(100,200),10> + <(100,200),10> | <(100,1),115> + <(100,200),10> | <(3,5),0> + <(100,1),115> | <(100,1),115> + <(3,5),0> | <(5,1),3> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,1),115> + <(3,5),0> | <(3,5),0> +(29 rows) + +-- Area equal with circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 = c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),3> + <(1,2),100> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,2),3> | <(5,1),3> + <(1,2),3> | <(1,2),3> + <(100,200),10> | <(100,200),10> + <(100,1),115> | <(100,1),115> + <(3,5),0> | <(3,5),0> +(9 rows) + +-- Area not equal with circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 != c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(100,200),10> + <(5,1),3> | <(100,1),115> + <(5,1),3> | <(3,5),0> + <(1,2),100> | <(5,1),3> + <(1,2),100> | <(1,3),5> + <(1,2),100> | <(1,2),3> + <(1,2),100> | <(100,200),10> + <(1,2),100> | <(100,1),115> + <(1,2),100> | <(3,5),0> + <(1,3),5> | <(5,1),3> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(1,2),3> + <(1,3),5> | <(100,200),10> + <(1,3),5> | <(100,1),115> + <(1,3),5> | <(3,5),0> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(100,200),10> + <(1,2),3> | <(100,1),115> + <(1,2),3> | <(3,5),0> + <(100,200),10> | <(5,1),3> + <(100,200),10> | <(1,2),100> + <(100,200),10> | <(1,3),5> + <(100,200),10> | <(1,2),3> + <(100,200),10> | <(100,1),115> + <(100,200),10> | <(3,5),0> + <(100,1),115> | <(5,1),3> + <(100,1),115> | <(1,2),100> + <(100,1),115> | <(1,3),5> + <(100,1),115> | <(1,2),3> + <(100,1),115> | <(100,200),10> + <(100,1),115> | <(3,5),0> + <(3,5),0> | <(5,1),3> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,200),10> + <(3,5),0> | <(100,1),115> +(40 rows) + +-- Area less than circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(100,200),10> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(100,1),115> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(100,200),10> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(100,200),10> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(1,2),100> + <(100,200),10> | <(100,1),115> + <(3,5),0> | <(5,1),3> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,200),10> + <(3,5),0> | <(100,1),115> +(20 rows) + +-- Area greater than circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 > c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(3,5),0> + <(1,2),100> | <(5,1),3> + <(1,2),100> | <(1,3),5> + <(1,2),100> | <(1,2),3> + <(1,2),100> | <(100,200),10> + <(1,2),100> | <(3,5),0> + <(1,3),5> | <(5,1),3> + <(1,3),5> | <(1,2),3> + <(1,3),5> | <(3,5),0> + <(1,2),3> | <(3,5),0> + <(100,200),10> | <(5,1),3> + <(100,200),10> | <(1,3),5> + <(100,200),10> | <(1,2),3> + <(100,200),10> | <(3,5),0> + <(100,1),115> | <(5,1),3> + <(100,1),115> | <(1,2),100> + <(100,1),115> | <(1,3),5> + <(100,1),115> | <(1,2),3> + <(100,1),115> | <(100,200),10> + <(100,1),115> | <(3,5),0> +(20 rows) + +-- Area less than or equal circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <= c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(1,2),3> + <(5,1),3> | <(100,200),10> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(1,2),100> + <(1,2),100> | <(100,1),115> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(100,200),10> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(5,1),3> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(1,2),3> + <(1,2),3> | <(100,200),10> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(1,2),100> + <(100,200),10> | <(100,200),10> + <(100,200),10> | <(100,1),115> + <(100,1),115> | <(100,1),115> + <(3,5),0> | <(5,1),3> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,200),10> + <(3,5),0> | <(100,1),115> + <(3,5),0> | <(3,5),0> +(29 rows) + +-- Area greater than or equal circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 >= c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(5,1),3> + <(5,1),3> | <(1,2),3> + <(5,1),3> | <(3,5),0> + <(1,2),100> | <(5,1),3> + <(1,2),100> | <(1,2),100> + <(1,2),100> | <(1,3),5> + <(1,2),100> | <(1,2),3> + <(1,2),100> | <(100,200),10> + <(1,2),100> | <(3,5),0> + <(1,3),5> | <(5,1),3> + <(1,3),5> | <(1,3),5> + <(1,3),5> | <(1,2),3> + <(1,3),5> | <(3,5),0> + <(1,2),3> | <(5,1),3> + <(1,2),3> | <(1,2),3> + <(1,2),3> | <(3,5),0> + <(100,200),10> | <(5,1),3> + <(100,200),10> | <(1,3),5> + <(100,200),10> | <(1,2),3> + <(100,200),10> | <(100,200),10> + <(100,200),10> | <(3,5),0> + <(100,1),115> | <(5,1),3> + <(100,1),115> | <(1,2),100> + <(100,1),115> | <(1,3),5> + <(100,1),115> | <(1,2),3> + <(100,1),115> | <(100,200),10> + <(100,1),115> | <(100,1),115> + <(100,1),115> | <(3,5),0> + <(3,5),0> | <(3,5),0> +(29 rows) + +-- Area less than circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(100,200),10> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(100,1),115> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(100,200),10> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(100,200),10> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(1,2),100> + <(100,200),10> | <(100,1),115> + <(3,5),0> | <(5,1),3> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,200),10> + <(3,5),0> | <(100,1),115> +(20 rows) + +-- Area greater than circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1; + f1 | f1 +----------------+---------------- + <(5,1),3> | <(1,2),100> + <(5,1),3> | <(1,3),5> + <(5,1),3> | <(100,200),10> + <(5,1),3> | <(100,1),115> + <(1,2),100> | <(100,1),115> + <(1,3),5> | <(1,2),100> + <(1,3),5> | <(100,200),10> + <(1,3),5> | <(100,1),115> + <(1,2),3> | <(1,2),100> + <(1,2),3> | <(1,3),5> + <(1,2),3> | <(100,200),10> + <(1,2),3> | <(100,1),115> + <(100,200),10> | <(1,2),100> + <(100,200),10> | <(100,1),115> + <(3,5),0> | <(5,1),3> + <(3,5),0> | <(1,2),100> + <(3,5),0> | <(1,3),5> + <(3,5),0> | <(1,2),3> + <(3,5),0> | <(100,200),10> + <(3,5),0> | <(100,1),115> +(20 rows) + +-- Add point +SELECT c.f1, p.f1, c.f1 + p.f1 FROM CIRCLE_TBL c, POINT_TBL p; + f1 | f1 | ?column? +----------------+-------------------+------------------------- + <(5,1),3> | (0,0) | <(5,1),3> + <(1,2),100> | (0,0) | <(1,2),100> + <(1,3),5> | (0,0) | <(1,3),5> + <(1,2),3> | (0,0) | <(1,2),3> + <(100,200),10> | (0,0) | <(100,200),10> + <(100,1),115> | (0,0) | <(100,1),115> + <(3,5),0> | (0,0) | <(3,5),0> + <(3,5),NaN> | (0,0) | <(3,5),NaN> + <(5,1),3> | (-10,0) | <(-5,1),3> + <(1,2),100> | (-10,0) | <(-9,2),100> + <(1,3),5> | (-10,0) | <(-9,3),5> + <(1,2),3> | (-10,0) | <(-9,2),3> + <(100,200),10> | (-10,0) | <(90,200),10> + <(100,1),115> | (-10,0) | <(90,1),115> + <(3,5),0> | (-10,0) | <(-7,5),0> + <(3,5),NaN> | (-10,0) | <(-7,5),NaN> + <(5,1),3> | (-3,4) | <(2,5),3> + <(1,2),100> | (-3,4) | <(-2,6),100> + <(1,3),5> | (-3,4) | <(-2,7),5> + <(1,2),3> | (-3,4) | <(-2,6),3> + <(100,200),10> | (-3,4) | <(97,204),10> + <(100,1),115> | (-3,4) | <(97,5),115> + <(3,5),0> | (-3,4) | <(0,9),0> + <(3,5),NaN> | (-3,4) | <(0,9),NaN> + <(5,1),3> | (5.1,34.5) | <(10.1,35.5),3> + <(1,2),100> | (5.1,34.5) | <(6.1,36.5),100> + <(1,3),5> | (5.1,34.5) | <(6.1,37.5),5> + <(1,2),3> | (5.1,34.5) | <(6.1,36.5),3> + <(100,200),10> | (5.1,34.5) | <(105.1,234.5),10> + <(100,1),115> | (5.1,34.5) | <(105.1,35.5),115> + <(3,5),0> | (5.1,34.5) | <(8.1,39.5),0> + <(3,5),NaN> | (5.1,34.5) | <(8.1,39.5),NaN> + <(5,1),3> | (-5,-12) | <(0,-11),3> + <(1,2),100> | (-5,-12) | <(-4,-10),100> + <(1,3),5> | (-5,-12) | <(-4,-9),5> + <(1,2),3> | (-5,-12) | <(-4,-10),3> + <(100,200),10> | (-5,-12) | <(95,188),10> + <(100,1),115> | (-5,-12) | <(95,-11),115> + <(3,5),0> | (-5,-12) | <(-2,-7),0> + <(3,5),NaN> | (-5,-12) | <(-2,-7),NaN> + <(5,1),3> | (1e-300,-1e-300) | <(5,1),3> + <(1,2),100> | (1e-300,-1e-300) | <(1,2),100> + <(1,3),5> | (1e-300,-1e-300) | <(1,3),5> + <(1,2),3> | (1e-300,-1e-300) | <(1,2),3> + <(100,200),10> | (1e-300,-1e-300) | <(100,200),10> + <(100,1),115> | (1e-300,-1e-300) | <(100,1),115> + <(3,5),0> | (1e-300,-1e-300) | <(3,5),0> + <(3,5),NaN> | (1e-300,-1e-300) | <(3,5),NaN> + <(5,1),3> | (1e+300,Infinity) | <(1e+300,Infinity),3> + <(1,2),100> | (1e+300,Infinity) | <(1e+300,Infinity),100> + <(1,3),5> | (1e+300,Infinity) | <(1e+300,Infinity),5> + <(1,2),3> | (1e+300,Infinity) | <(1e+300,Infinity),3> + <(100,200),10> | (1e+300,Infinity) | <(1e+300,Infinity),10> + <(100,1),115> | (1e+300,Infinity) | <(1e+300,Infinity),115> + <(3,5),0> | (1e+300,Infinity) | <(1e+300,Infinity),0> + <(3,5),NaN> | (1e+300,Infinity) | <(1e+300,Infinity),NaN> + <(5,1),3> | (Infinity,1e+300) | <(Infinity,1e+300),3> + <(1,2),100> | (Infinity,1e+300) | <(Infinity,1e+300),100> + <(1,3),5> | (Infinity,1e+300) | <(Infinity,1e+300),5> + <(1,2),3> | (Infinity,1e+300) | <(Infinity,1e+300),3> + <(100,200),10> | (Infinity,1e+300) | <(Infinity,1e+300),10> + <(100,1),115> | (Infinity,1e+300) | <(Infinity,1e+300),115> + <(3,5),0> | (Infinity,1e+300) | <(Infinity,1e+300),0> + <(3,5),NaN> | (Infinity,1e+300) | <(Infinity,1e+300),NaN> + <(5,1),3> | (NaN,NaN) | <(NaN,NaN),3> + <(1,2),100> | (NaN,NaN) | <(NaN,NaN),100> + <(1,3),5> | (NaN,NaN) | <(NaN,NaN),5> + <(1,2),3> | (NaN,NaN) | <(NaN,NaN),3> + <(100,200),10> | (NaN,NaN) | <(NaN,NaN),10> + <(100,1),115> | (NaN,NaN) | <(NaN,NaN),115> + <(3,5),0> | (NaN,NaN) | <(NaN,NaN),0> + <(3,5),NaN> | (NaN,NaN) | <(NaN,NaN),NaN> + <(5,1),3> | (10,10) | <(15,11),3> + <(1,2),100> | (10,10) | <(11,12),100> + <(1,3),5> | (10,10) | <(11,13),5> + <(1,2),3> | (10,10) | <(11,12),3> + <(100,200),10> | (10,10) | <(110,210),10> + <(100,1),115> | (10,10) | <(110,11),115> + <(3,5),0> | (10,10) | <(13,15),0> + <(3,5),NaN> | (10,10) | <(13,15),NaN> +(80 rows) + +-- Subtract point +SELECT c.f1, p.f1, c.f1 - p.f1 FROM CIRCLE_TBL c, POINT_TBL p; + f1 | f1 | ?column? +----------------+-------------------+--------------------------- + <(5,1),3> | (0,0) | <(5,1),3> + <(1,2),100> | (0,0) | <(1,2),100> + <(1,3),5> | (0,0) | <(1,3),5> + <(1,2),3> | (0,0) | <(1,2),3> + <(100,200),10> | (0,0) | <(100,200),10> + <(100,1),115> | (0,0) | <(100,1),115> + <(3,5),0> | (0,0) | <(3,5),0> + <(3,5),NaN> | (0,0) | <(3,5),NaN> + <(5,1),3> | (-10,0) | <(15,1),3> + <(1,2),100> | (-10,0) | <(11,2),100> + <(1,3),5> | (-10,0) | <(11,3),5> + <(1,2),3> | (-10,0) | <(11,2),3> + <(100,200),10> | (-10,0) | <(110,200),10> + <(100,1),115> | (-10,0) | <(110,1),115> + <(3,5),0> | (-10,0) | <(13,5),0> + <(3,5),NaN> | (-10,0) | <(13,5),NaN> + <(5,1),3> | (-3,4) | <(8,-3),3> + <(1,2),100> | (-3,4) | <(4,-2),100> + <(1,3),5> | (-3,4) | <(4,-1),5> + <(1,2),3> | (-3,4) | <(4,-2),3> + <(100,200),10> | (-3,4) | <(103,196),10> + <(100,1),115> | (-3,4) | <(103,-3),115> + <(3,5),0> | (-3,4) | <(6,1),0> + <(3,5),NaN> | (-3,4) | <(6,1),NaN> + <(5,1),3> | (5.1,34.5) | <(-0.1,-33.5),3> + <(1,2),100> | (5.1,34.5) | <(-4.1,-32.5),100> + <(1,3),5> | (5.1,34.5) | <(-4.1,-31.5),5> + <(1,2),3> | (5.1,34.5) | <(-4.1,-32.5),3> + <(100,200),10> | (5.1,34.5) | <(94.9,165.5),10> + <(100,1),115> | (5.1,34.5) | <(94.9,-33.5),115> + <(3,5),0> | (5.1,34.5) | <(-2.1,-29.5),0> + <(3,5),NaN> | (5.1,34.5) | <(-2.1,-29.5),NaN> + <(5,1),3> | (-5,-12) | <(10,13),3> + <(1,2),100> | (-5,-12) | <(6,14),100> + <(1,3),5> | (-5,-12) | <(6,15),5> + <(1,2),3> | (-5,-12) | <(6,14),3> + <(100,200),10> | (-5,-12) | <(105,212),10> + <(100,1),115> | (-5,-12) | <(105,13),115> + <(3,5),0> | (-5,-12) | <(8,17),0> + <(3,5),NaN> | (-5,-12) | <(8,17),NaN> + <(5,1),3> | (1e-300,-1e-300) | <(5,1),3> + <(1,2),100> | (1e-300,-1e-300) | <(1,2),100> + <(1,3),5> | (1e-300,-1e-300) | <(1,3),5> + <(1,2),3> | (1e-300,-1e-300) | <(1,2),3> + <(100,200),10> | (1e-300,-1e-300) | <(100,200),10> + <(100,1),115> | (1e-300,-1e-300) | <(100,1),115> + <(3,5),0> | (1e-300,-1e-300) | <(3,5),0> + <(3,5),NaN> | (1e-300,-1e-300) | <(3,5),NaN> + <(5,1),3> | (1e+300,Infinity) | <(-1e+300,-Infinity),3> + <(1,2),100> | (1e+300,Infinity) | <(-1e+300,-Infinity),100> + <(1,3),5> | (1e+300,Infinity) | <(-1e+300,-Infinity),5> + <(1,2),3> | (1e+300,Infinity) | <(-1e+300,-Infinity),3> + <(100,200),10> | (1e+300,Infinity) | <(-1e+300,-Infinity),10> + <(100,1),115> | (1e+300,Infinity) | <(-1e+300,-Infinity),115> + <(3,5),0> | (1e+300,Infinity) | <(-1e+300,-Infinity),0> + <(3,5),NaN> | (1e+300,Infinity) | <(-1e+300,-Infinity),NaN> + <(5,1),3> | (Infinity,1e+300) | <(-Infinity,-1e+300),3> + <(1,2),100> | (Infinity,1e+300) | <(-Infinity,-1e+300),100> + <(1,3),5> | (Infinity,1e+300) | <(-Infinity,-1e+300),5> + <(1,2),3> | (Infinity,1e+300) | <(-Infinity,-1e+300),3> + <(100,200),10> | (Infinity,1e+300) | <(-Infinity,-1e+300),10> + <(100,1),115> | (Infinity,1e+300) | <(-Infinity,-1e+300),115> + <(3,5),0> | (Infinity,1e+300) | <(-Infinity,-1e+300),0> + <(3,5),NaN> | (Infinity,1e+300) | <(-Infinity,-1e+300),NaN> + <(5,1),3> | (NaN,NaN) | <(NaN,NaN),3> + <(1,2),100> | (NaN,NaN) | <(NaN,NaN),100> + <(1,3),5> | (NaN,NaN) | <(NaN,NaN),5> + <(1,2),3> | (NaN,NaN) | <(NaN,NaN),3> + <(100,200),10> | (NaN,NaN) | <(NaN,NaN),10> + <(100,1),115> | (NaN,NaN) | <(NaN,NaN),115> + <(3,5),0> | (NaN,NaN) | <(NaN,NaN),0> + <(3,5),NaN> | (NaN,NaN) | <(NaN,NaN),NaN> + <(5,1),3> | (10,10) | <(-5,-9),3> + <(1,2),100> | (10,10) | <(-9,-8),100> + <(1,3),5> | (10,10) | <(-9,-7),5> + <(1,2),3> | (10,10) | <(-9,-8),3> + <(100,200),10> | (10,10) | <(90,190),10> + <(100,1),115> | (10,10) | <(90,-9),115> + <(3,5),0> | (10,10) | <(-7,-5),0> + <(3,5),NaN> | (10,10) | <(-7,-5),NaN> +(80 rows) + +-- Multiply with point +SELECT c.f1, p.f1, c.f1 * p.f1 FROM CIRCLE_TBL c, POINT_TBL p; + f1 | f1 | ?column? +----------------+-------------------+-------------------------------------------- + <(5,1),3> | (0,0) | <(0,0),0> + <(1,2),100> | (0,0) | <(0,0),0> + <(1,3),5> | (0,0) | <(0,0),0> + <(1,2),3> | (0,0) | <(0,0),0> + <(100,200),10> | (0,0) | <(0,0),0> + <(100,1),115> | (0,0) | <(0,0),0> + <(3,5),0> | (0,0) | <(0,0),0> + <(3,5),NaN> | (0,0) | <(0,0),NaN> + <(5,1),3> | (-10,0) | <(-50,-10),30> + <(1,2),100> | (-10,0) | <(-10,-20),1000> + <(1,3),5> | (-10,0) | <(-10,-30),50> + <(1,2),3> | (-10,0) | <(-10,-20),30> + <(100,200),10> | (-10,0) | <(-1000,-2000),100> + <(100,1),115> | (-10,0) | <(-1000,-10),1150> + <(3,5),0> | (-10,0) | <(-30,-50),0> + <(3,5),NaN> | (-10,0) | <(-30,-50),NaN> + <(5,1),3> | (-3,4) | <(-19,17),15> + <(1,2),100> | (-3,4) | <(-11,-2),500> + <(1,3),5> | (-3,4) | <(-15,-5),25> + <(1,2),3> | (-3,4) | <(-11,-2),15> + <(100,200),10> | (-3,4) | <(-1100,-200),50> + <(100,1),115> | (-3,4) | <(-304,397),575> + <(3,5),0> | (-3,4) | <(-29,-3),0> + <(3,5),NaN> | (-3,4) | <(-29,-3),NaN> + <(5,1),3> | (5.1,34.5) | <(-9,177.6),104.624758064> + <(1,2),100> | (5.1,34.5) | <(-63.9,44.7),3487.49193547> + <(1,3),5> | (5.1,34.5) | <(-98.4,49.8),174.374596774> + <(1,2),3> | (5.1,34.5) | <(-63.9,44.7),104.624758064> + <(100,200),10> | (5.1,34.5) | <(-6390,4470),348.749193547> + <(100,1),115> | (5.1,34.5) | <(475.5,3455.1),4010.6157258> + <(3,5),0> | (5.1,34.5) | <(-157.2,129),0> + <(3,5),NaN> | (5.1,34.5) | <(-157.2,129),NaN> + <(5,1),3> | (-5,-12) | <(-13,-65),39> + <(1,2),100> | (-5,-12) | <(19,-22),1300> + <(1,3),5> | (-5,-12) | <(31,-27),65> + <(1,2),3> | (-5,-12) | <(19,-22),39> + <(100,200),10> | (-5,-12) | <(1900,-2200),130> + <(100,1),115> | (-5,-12) | <(-488,-1205),1495> + <(3,5),0> | (-5,-12) | <(45,-61),0> + <(3,5),NaN> | (-5,-12) | <(45,-61),NaN> + <(5,1),3> | (1e-300,-1e-300) | <(6e-300,-4e-300),4.24264068712e-300> + <(1,2),100> | (1e-300,-1e-300) | <(3e-300,1e-300),1.41421356237e-298> + <(1,3),5> | (1e-300,-1e-300) | <(4e-300,2e-300),7.07106781187e-300> + <(1,2),3> | (1e-300,-1e-300) | <(3e-300,1e-300),4.24264068712e-300> + <(100,200),10> | (1e-300,-1e-300) | <(3e-298,1e-298),1.41421356237e-299> + <(100,1),115> | (1e-300,-1e-300) | <(1.01e-298,-9.9e-299),1.62634559673e-298> + <(3,5),0> | (1e-300,-1e-300) | <(8e-300,2e-300),0> + <(3,5),NaN> | (1e-300,-1e-300) | <(8e-300,2e-300),NaN> + <(5,1),3> | (1e+300,Infinity) | <(-Infinity,Infinity),Infinity> + <(1,2),100> | (1e+300,Infinity) | <(-Infinity,Infinity),Infinity> + <(1,3),5> | (1e+300,Infinity) | <(-Infinity,Infinity),Infinity> + <(1,2),3> | (1e+300,Infinity) | <(-Infinity,Infinity),Infinity> + <(100,200),10> | (1e+300,Infinity) | <(-Infinity,Infinity),Infinity> + <(100,1),115> | (1e+300,Infinity) | <(-Infinity,Infinity),Infinity> + <(3,5),0> | (1e+300,Infinity) | <(-Infinity,Infinity),NaN> + <(3,5),NaN> | (1e+300,Infinity) | <(-Infinity,Infinity),NaN> + <(5,1),3> | (Infinity,1e+300) | <(Infinity,Infinity),Infinity> + <(1,2),100> | (Infinity,1e+300) | <(Infinity,Infinity),Infinity> + <(1,3),5> | (Infinity,1e+300) | <(Infinity,Infinity),Infinity> + <(1,2),3> | (Infinity,1e+300) | <(Infinity,Infinity),Infinity> + <(100,200),10> | (Infinity,1e+300) | <(Infinity,Infinity),Infinity> + <(100,1),115> | (Infinity,1e+300) | <(Infinity,Infinity),Infinity> + <(3,5),0> | (Infinity,1e+300) | <(Infinity,Infinity),NaN> + <(3,5),NaN> | (Infinity,1e+300) | <(Infinity,Infinity),NaN> + <(5,1),3> | (NaN,NaN) | <(NaN,NaN),NaN> + <(1,2),100> | (NaN,NaN) | <(NaN,NaN),NaN> + <(1,3),5> | (NaN,NaN) | <(NaN,NaN),NaN> + <(1,2),3> | (NaN,NaN) | <(NaN,NaN),NaN> + <(100,200),10> | (NaN,NaN) | <(NaN,NaN),NaN> + <(100,1),115> | (NaN,NaN) | <(NaN,NaN),NaN> + <(3,5),0> | (NaN,NaN) | <(NaN,NaN),NaN> + <(3,5),NaN> | (NaN,NaN) | <(NaN,NaN),NaN> + <(5,1),3> | (10,10) | <(40,60),42.4264068712> + <(1,2),100> | (10,10) | <(-10,30),1414.21356237> + <(1,3),5> | (10,10) | <(-20,40),70.7106781187> + <(1,2),3> | (10,10) | <(-10,30),42.4264068712> + <(100,200),10> | (10,10) | <(-1000,3000),141.421356237> + <(100,1),115> | (10,10) | <(990,1010),1626.34559673> + <(3,5),0> | (10,10) | <(-20,80),0> + <(3,5),NaN> | (10,10) | <(-20,80),NaN> +(80 rows) + +-- Divide by point +SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000; + f1 | f1 | ?column? +----------------+------------+------------------------------------------------------ + <(5,1),3> | (5.1,34.5) | <(0.0493315573973,-0.137635045138),0.0860217042937> + <(5,1),3> | (10,10) | <(0.3,-0.2),0.212132034356> + <(1,2),100> | (5.1,34.5) | <(0.0609244733856,-0.0199792807459),2.86739014312> + <(1,2),100> | (10,10) | <(0.15,0.05),7.07106781187> + <(1,3),5> | (5.1,34.5) | <(0.0892901188891,-0.0157860983671),0.143369507156> + <(1,3),5> | (10,10) | <(0.2,0.1),0.353553390593> + <(1,2),3> | (5.1,34.5) | <(0.0609244733856,-0.0199792807459),0.0860217042937> + <(1,2),3> | (10,10) | <(0.15,0.05),0.212132034356> + <(100,200),10> | (5.1,34.5) | <(6.09244733856,-1.99792807459),0.286739014312> + <(100,200),10> | (10,10) | <(15,5),0.707106781187> + <(100,1),115> | (5.1,34.5) | <(0.44768388338,-2.83237136796),3.29749866459> + <(100,1),115> | (10,10) | <(5.05,-4.95),8.13172798365> + <(3,5),0> | (5.1,34.5) | <(0.154407774653,-0.0641310246164),0> + <(3,5),0> | (10,10) | <(0.4,0.1),0> + <(3,5),NaN> | (5.1,34.5) | <(0.154407774653,-0.0641310246164),NaN> + <(3,5),NaN> | (10,10) | <(0.4,0.1),NaN> +(16 rows) + +-- Overflow error +SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1[0] > 1000; +ERROR: value out of range: overflow +-- Division by 0 error +SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1 ~= '(0,0)'::point; +ERROR: division by zero +-- Distance to polygon +SELECT c.f1, p.f1, c.f1 <-> p.f1 FROM CIRCLE_TBL c, POLYGON_TBL p; + f1 | f1 | ?column? +----------------+----------------------------+---------------- + <(5,1),3> | ((2,0),(2,4),(0,0)) | 0 + <(5,1),3> | ((3,1),(3,3),(1,0)) | 0 + <(5,1),3> | ((1,2),(3,4),(5,6),(7,8)) | 0.535533905933 + <(5,1),3> | ((7,8),(5,6),(3,4),(1,2)) | 0.535533905933 + <(5,1),3> | ((1,2),(7,8),(5,6),(3,-4)) | 0 + <(5,1),3> | ((0,0)) | 2.09901951359 + <(5,1),3> | ((0,1),(0,1)) | 2 + <(1,2),100> | ((2,0),(2,4),(0,0)) | 0 + <(1,2),100> | ((3,1),(3,3),(1,0)) | 0 + <(1,2),100> | ((1,2),(3,4),(5,6),(7,8)) | 0 + <(1,2),100> | ((7,8),(5,6),(3,4),(1,2)) | 0 + <(1,2),100> | ((1,2),(7,8),(5,6),(3,-4)) | 0 + <(1,2),100> | ((0,0)) | 0 + <(1,2),100> | ((0,1),(0,1)) | 0 + <(1,3),5> | ((2,0),(2,4),(0,0)) | 0 + <(1,3),5> | ((3,1),(3,3),(1,0)) | 0 + <(1,3),5> | ((1,2),(3,4),(5,6),(7,8)) | 0 + <(1,3),5> | ((7,8),(5,6),(3,4),(1,2)) | 0 + <(1,3),5> | ((1,2),(7,8),(5,6),(3,-4)) | 0 + <(1,3),5> | ((0,0)) | 0 + <(1,3),5> | ((0,1),(0,1)) | 0 + <(1,2),3> | ((2,0),(2,4),(0,0)) | 0 + <(1,2),3> | ((3,1),(3,3),(1,0)) | 0 + <(1,2),3> | ((1,2),(3,4),(5,6),(7,8)) | 0 + <(1,2),3> | ((7,8),(5,6),(3,4),(1,2)) | 0 + <(1,2),3> | ((1,2),(7,8),(5,6),(3,-4)) | 0 + <(1,2),3> | ((0,0)) | 0 + <(1,2),3> | ((0,1),(0,1)) | 0 + <(100,200),10> | ((2,0),(2,4),(0,0)) | 209.134661795 + <(100,200),10> | ((3,1),(3,3),(1,0)) | 209.585974051 + <(100,200),10> | ((1,2),(3,4),(5,6),(7,8)) | 203.337760371 + <(100,200),10> | ((7,8),(5,6),(3,4),(1,2)) | 203.337760371 + <(100,200),10> | ((1,2),(7,8),(5,6),(3,-4)) | 203.337760371 + <(100,200),10> | ((0,0)) | 213.60679775 + <(100,200),10> | ((0,1),(0,1)) | 212.712819568 + <(100,1),115> | ((2,0),(2,4),(0,0)) | 0 + <(100,1),115> | ((3,1),(3,3),(1,0)) | 0 + <(100,1),115> | ((1,2),(3,4),(5,6),(7,8)) | 0 + <(100,1),115> | ((7,8),(5,6),(3,4),(1,2)) | 0 + <(100,1),115> | ((1,2),(7,8),(5,6),(3,-4)) | 0 + <(100,1),115> | ((0,0)) | 0 + <(100,1),115> | ((0,1),(0,1)) | 0 + <(3,5),0> | ((2,0),(2,4),(0,0)) | 1.41421356237 + <(3,5),0> | ((3,1),(3,3),(1,0)) | 2 + <(3,5),0> | ((1,2),(3,4),(5,6),(7,8)) | 0.707106781187 + <(3,5),0> | ((7,8),(5,6),(3,4),(1,2)) | 0.707106781187 + <(3,5),0> | ((1,2),(7,8),(5,6),(3,-4)) | 0.707106781187 + <(3,5),0> | ((0,0)) | 5.83095189485 + <(3,5),0> | ((0,1),(0,1)) | 5 + <(3,5),NaN> | ((2,0),(2,4),(0,0)) | NaN + <(3,5),NaN> | ((3,1),(3,3),(1,0)) | NaN + <(3,5),NaN> | ((1,2),(3,4),(5,6),(7,8)) | NaN + <(3,5),NaN> | ((7,8),(5,6),(3,4),(1,2)) | NaN + <(3,5),NaN> | ((1,2),(7,8),(5,6),(3,-4)) | NaN + <(3,5),NaN> | ((0,0)) | NaN + <(3,5),NaN> | ((0,1),(0,1)) | NaN +(56 rows) + diff --git a/src/test/singlenode_regress/expected/gin.out b/src/test/singlenode_regress/expected/gin.out new file mode 100644 index 00000000000..d57a8ee5d73 --- /dev/null +++ b/src/test/singlenode_regress/expected/gin.out @@ -0,0 +1,291 @@ +-- +-- Test GIN indexes. +-- +-- There are other tests to test different GIN opclasses. This is for testing +-- GIN itself. +-- Create and populate a test table with a GIN index. +create table gin_test_tbl(i int4[]) with (autovacuum_enabled = off); +create index gin_test_idx on gin_test_tbl using gin (i) + with (fastupdate = on, gin_pending_list_limit = 4096); +insert into gin_test_tbl select array[1, 2, g] from generate_series(1, 20000) g; +insert into gin_test_tbl select array[1, 3, g] from generate_series(1, 1000) g; +select gin_clean_pending_list('gin_test_idx')>10 as many; -- flush the fastupdate buffers + many +------ + t +(1 row) + +insert into gin_test_tbl select array[3, 1, g] from generate_series(1, 1000) g; +vacuum gin_test_tbl; -- flush the fastupdate buffers +select gin_clean_pending_list('gin_test_idx'); -- nothing to flush + gin_clean_pending_list +------------------------ + 0 +(1 row) + +-- Test vacuuming +delete from gin_test_tbl where i @> array[2]; +vacuum gin_test_tbl; +-- Disable fastupdate, and do more insertions. With fastupdate enabled, most +-- insertions (by flushing the list pages) cause page splits. Without +-- fastupdate, we get more churn in the GIN data leaf pages, and exercise the +-- recompression codepaths. +alter index gin_test_idx set (fastupdate = off); +insert into gin_test_tbl select array[1, 2, g] from generate_series(1, 1000) g; +insert into gin_test_tbl select array[1, 3, g] from generate_series(1, 1000) g; +delete from gin_test_tbl where i @> array[2]; +vacuum gin_test_tbl; +-- Test for "rare && frequent" searches +explain (costs off) +select count(*) from gin_test_tbl where i @> array[1, 999]; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on gin_test_tbl + Recheck Cond: (i @> '{1,999}'::integer[]) + -> Bitmap Index Scan on gin_test_idx + Index Cond: (i @> '{1,999}'::integer[]) +(5 rows) + +select count(*) from gin_test_tbl where i @> array[1, 999]; + count +------- + 3 +(1 row) + +-- Very weak test for gin_fuzzy_search_limit +set gin_fuzzy_search_limit = 1000; +explain (costs off) +select count(*) > 0 as ok from gin_test_tbl where i @> array[1]; + QUERY PLAN +--------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on gin_test_tbl + Recheck Cond: (i @> '{1}'::integer[]) + -> Bitmap Index Scan on gin_test_idx + Index Cond: (i @> '{1}'::integer[]) +(5 rows) + +select count(*) > 0 as ok from gin_test_tbl where i @> array[1]; + ok +---- + t +(1 row) + +reset gin_fuzzy_search_limit; +-- Test optimization of empty queries +create temp table t_gin_test_tbl(i int4[], j int4[]); +create index on t_gin_test_tbl using gin (i, j); +insert into t_gin_test_tbl +values + (null, null), + ('{}', null), + ('{1}', null), + ('{1,2}', null), + (null, '{}'), + (null, '{10}'), + ('{1,2}', '{10}'), + ('{2}', '{10}'), + ('{1,3}', '{}'), + ('{1,1}', '{10}'); +set enable_seqscan = off; +explain (costs off) +select * from t_gin_test_tbl where array[0] <@ i; + QUERY PLAN +--------------------------------------------------- + Bitmap Heap Scan on t_gin_test_tbl + Recheck Cond: ('{0}'::integer[] <@ i) + -> Bitmap Index Scan on t_gin_test_tbl_i_j_idx + Index Cond: (i @> '{0}'::integer[]) +(4 rows) + +select * from t_gin_test_tbl where array[0] <@ i; + i | j +---+--- +(0 rows) + +select * from t_gin_test_tbl where array[0] <@ i and '{}'::int4[] <@ j; + i | j +---+--- +(0 rows) + +explain (costs off) +select * from t_gin_test_tbl where i @> '{}'; + QUERY PLAN +--------------------------------------------------- + Bitmap Heap Scan on t_gin_test_tbl + Recheck Cond: (i @> '{}'::integer[]) + -> Bitmap Index Scan on t_gin_test_tbl_i_j_idx + Index Cond: (i @> '{}'::integer[]) +(4 rows) + +select * from t_gin_test_tbl where i @> '{}'; + i | j +-------+------ + {} | + {1} | + {1,2} | + {1,2} | {10} + {2} | {10} + {1,3} | {} + {1,1} | {10} +(7 rows) + +create function explain_query_json(query_sql text) +returns table (explain_line json) +language plpgsql as +$$ +begin + set enable_seqscan = off; + set enable_bitmapscan = on; + return query execute 'EXPLAIN (ANALYZE, FORMAT json) ' || query_sql; +end; +$$; +create function execute_text_query_index(query_sql text) +returns setof text +language plpgsql +as +$$ +begin + set enable_seqscan = off; + set enable_bitmapscan = on; + return query execute query_sql; +end; +$$; +create function execute_text_query_heap(query_sql text) +returns setof text +language plpgsql +as +$$ +begin + set enable_seqscan = on; + set enable_bitmapscan = off; + return query execute query_sql; +end; +$$; +-- check number of rows returned by index and removed by recheck +select + query, + js->0->'Plan'->'Plans'->0->'Actual Rows' as "return by index", + js->0->'Plan'->'Rows Removed by Index Recheck' as "removed by recheck", + (res_index = res_heap) as "match" +from + (values + ($$ i @> '{}' $$), + ($$ j @> '{}' $$), + ($$ i @> '{}' and j @> '{}' $$), + ($$ i @> '{1}' $$), + ($$ i @> '{1}' and j @> '{}' $$), + ($$ i @> '{1}' and i @> '{}' and j @> '{}' $$), + ($$ j @> '{10}' $$), + ($$ j @> '{10}' and i @> '{}' $$), + ($$ j @> '{10}' and j @> '{}' and i @> '{}' $$), + ($$ i @> '{1}' and j @> '{10}' $$) + ) q(query), + lateral explain_query_json($$select * from t_gin_test_tbl where $$ || query) js, + lateral execute_text_query_index($$select string_agg((i, j)::text, ' ') from t_gin_test_tbl where $$ || query) res_index, + lateral execute_text_query_heap($$select string_agg((i, j)::text, ' ') from t_gin_test_tbl where $$ || query) res_heap; + query | return by index | removed by recheck | match +-------------------------------------------+-----------------+--------------------+------- + i @> '{}' | 7 | 0 | t + j @> '{}' | 6 | 0 | t + i @> '{}' and j @> '{}' | 4 | 0 | t + i @> '{1}' | 5 | 0 | t + i @> '{1}' and j @> '{}' | 3 | 0 | t + i @> '{1}' and i @> '{}' and j @> '{}' | 3 | 0 | t + j @> '{10}' | 4 | 0 | t + j @> '{10}' and i @> '{}' | 3 | 0 | t + j @> '{10}' and j @> '{}' and i @> '{}' | 3 | 0 | t + i @> '{1}' and j @> '{10}' | 2 | 0 | t +(10 rows) + +reset enable_seqscan; +reset enable_bitmapscan; +-- re-purpose t_gin_test_tbl to test scans involving posting trees +insert into t_gin_test_tbl select array[1, g, g/10], array[2, g, g/10] + from generate_series(1, 20000) g; +select gin_clean_pending_list('t_gin_test_tbl_i_j_idx') is not null; + ?column? +---------- + t +(1 row) + +analyze t_gin_test_tbl; +set enable_seqscan = off; +set enable_bitmapscan = on; +explain (costs off) +select count(*) from t_gin_test_tbl where j @> array[50]; + QUERY PLAN +--------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on t_gin_test_tbl + Recheck Cond: (j @> '{50}'::integer[]) + -> Bitmap Index Scan on t_gin_test_tbl_i_j_idx + Index Cond: (j @> '{50}'::integer[]) +(5 rows) + +select count(*) from t_gin_test_tbl where j @> array[50]; + count +------- + 11 +(1 row) + +explain (costs off) +select count(*) from t_gin_test_tbl where j @> array[2]; + QUERY PLAN +--------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on t_gin_test_tbl + Recheck Cond: (j @> '{2}'::integer[]) + -> Bitmap Index Scan on t_gin_test_tbl_i_j_idx + Index Cond: (j @> '{2}'::integer[]) +(5 rows) + +select count(*) from t_gin_test_tbl where j @> array[2]; + count +------- + 20000 +(1 row) + +explain (costs off) +select count(*) from t_gin_test_tbl where j @> '{}'::int[]; + QUERY PLAN +---------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on t_gin_test_tbl + Recheck Cond: (j OPERATOR(pg_catalog.@>) '{}'::anyarray) + -> Bitmap Index Scan on t_gin_test_tbl_i_j_idx + Index Cond: (j OPERATOR(pg_catalog.@>) '{}'::anyarray) + Optimizer: Postgres query optimizer +(6 rows) + +select count(*) from t_gin_test_tbl where j @> '{}'::int[]; + count +------- + 20006 +(1 row) + +-- test vacuuming of posting trees +delete from t_gin_test_tbl where j @> array[2]; +vacuum t_gin_test_tbl; +select count(*) from t_gin_test_tbl where j @> array[50]; + count +------- + 0 +(1 row) + +select count(*) from t_gin_test_tbl where j @> array[2]; + count +------- + 0 +(1 row) + +select count(*) from t_gin_test_tbl where j @> '{}'::int[]; + count +------- + 6 +(1 row) + +reset enable_seqscan; +reset enable_bitmapscan; +drop table t_gin_test_tbl; diff --git a/src/test/singlenode_regress/expected/gist.out b/src/test/singlenode_regress/expected/gist.out new file mode 100644 index 00000000000..6e59e3f801b --- /dev/null +++ b/src/test/singlenode_regress/expected/gist.out @@ -0,0 +1,396 @@ +-- +-- Test GiST indexes. +-- +-- There are other tests to test different GiST opclasses. This is for +-- testing GiST code itself. Vacuuming in particular. +create table gist_point_tbl(id int4, p point); +create index gist_pointidx on gist_point_tbl using gist(p); +-- Verify the fillfactor and buffering options +create index gist_pointidx2 on gist_point_tbl using gist(p) with (buffering = on, fillfactor=50); +create index gist_pointidx3 on gist_point_tbl using gist(p) with (buffering = off); +create index gist_pointidx4 on gist_point_tbl using gist(p) with (buffering = auto); +drop index gist_pointidx2, gist_pointidx3, gist_pointidx4; +-- Make sure bad values are refused +create index gist_pointidx5 on gist_point_tbl using gist(p) with (buffering = invalid_value); +ERROR: invalid value for enum option "buffering": invalid_value +DETAIL: Valid values are "on", "off", and "auto". +create index gist_pointidx5 on gist_point_tbl using gist(p) with (fillfactor=9); +ERROR: value 9 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +create index gist_pointidx5 on gist_point_tbl using gist(p) with (fillfactor=101); +ERROR: value 101 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +-- Insert enough data to create a tree that's a couple of levels deep. +insert into gist_point_tbl (id, p) +select g, point(g*10, g*10) from generate_series(1, 10000) g; +insert into gist_point_tbl (id, p) +select g+100000, point(g*10+1, g*10+1) from generate_series(1, 10000) g; +-- To test vacuum, delete some entries from all over the index. +delete from gist_point_tbl where id % 2 = 1; +-- And also delete some concentration of values. +delete from gist_point_tbl where id > 5000; +vacuum analyze gist_point_tbl; +-- rebuild the index with a different fillfactor +alter index gist_pointidx SET (fillfactor = 40); +reindex index gist_pointidx; +-- +-- Test Index-only plans on GiST indexes +-- +create table gist_tbl (b box, p point, c circle); +insert into gist_tbl +select box(point(0.05*i, 0.05*i), point(0.05*i, 0.05*i)), + point(0.05*i, 0.05*i), + circle(point(0.05*i, 0.05*i), 1.0) +from generate_series(0,10000) as i; +vacuum analyze gist_tbl; +set enable_seqscan=off; +set enable_bitmapscan=off; +set enable_indexonlyscan=on; +-- Test index-only scan with point opclass +create index gist_tbl_point_index on gist_tbl using gist (p); +-- check that the planner chooses an index-only scan +explain (costs off) +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)); + QUERY PLAN +-------------------------------------------------------- + Index Only Scan using gist_tbl_point_index on gist_tbl + Index Cond: (p <@ '(0.5,0.5),(0,0)'::box) +(2 rows) + +-- execute the same +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)); + p +------------- + (0,0) + (0.05,0.05) + (0.1,0.1) + (0.15,0.15) + (0.2,0.2) + (0.25,0.25) + (0.3,0.3) + (0.35,0.35) + (0.4,0.4) + (0.45,0.45) + (0.5,0.5) +(11 rows) + +-- Also test an index-only knn-search +explain (costs off) +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)) +order by p <-> point(0.201, 0.201); + QUERY PLAN +-------------------------------------------------------- + Index Only Scan using gist_tbl_point_index on gist_tbl + Index Cond: (p <@ '(0.5,0.5),(0,0)'::box) + Order By: (p <-> '(0.201,0.201)'::point) +(3 rows) + +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)) +order by p <-> point(0.201, 0.201); + p +------------- + (0.2,0.2) + (0.25,0.25) + (0.15,0.15) + (0.3,0.3) + (0.1,0.1) + (0.35,0.35) + (0.05,0.05) + (0.4,0.4) + (0,0) + (0.45,0.45) + (0.5,0.5) +(11 rows) + +-- Check commuted case as well +explain (costs off) +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)) +order by point(0.101, 0.101) <-> p; + QUERY PLAN +-------------------------------------------------------- + Index Only Scan using gist_tbl_point_index on gist_tbl + Index Cond: (p <@ '(0.5,0.5),(0,0)'::box) + Order By: (p <-> '(0.101,0.101)'::point) +(3 rows) + +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)) +order by point(0.101, 0.101) <-> p; + p +------------- + (0.1,0.1) + (0.15,0.15) + (0.05,0.05) + (0.2,0.2) + (0,0) + (0.25,0.25) + (0.3,0.3) + (0.35,0.35) + (0.4,0.4) + (0.45,0.45) + (0.5,0.5) +(11 rows) + +-- Check case with multiple rescans (bug #14641) +explain (costs off) +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl where p <@ bb order by p <-> bb[0] limit 2) ss; + QUERY PLAN +-------------------------------------------------------------------------- + Nested Loop + -> Values Scan on "*VALUES*" + -> Materialize + -> Limit + -> Index Only Scan using gist_tbl_point_index on gist_tbl + Index Cond: (p <@ "*VALUES*".column1) + Order By: (p <-> ("*VALUES*".column1)[0]) + Optimizer: Postgres query optimizer +(8 rows) + +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl where p <@ bb order by p <-> bb[0] limit 2) ss; + p +------------- + (0.5,0.5) + (0.45,0.45) + (0.75,0.75) + (0.7,0.7) + (1,1) + (0.95,0.95) +(6 rows) + +drop index gist_tbl_point_index; +-- Test index-only scan with box opclass +create index gist_tbl_box_index on gist_tbl using gist (b); +-- check that the planner chooses an index-only scan +explain (costs off) +select b from gist_tbl where b <@ box(point(5,5), point(6,6)); + QUERY PLAN +------------------------------------------------------ + Index Only Scan using gist_tbl_box_index on gist_tbl + Index Cond: (b <@ '(6,6),(5,5)'::box) +(2 rows) + +-- execute the same +select b from gist_tbl where b <@ box(point(5,5), point(6,6)); + b +------------------------- + (5,5),(5,5) + (5.05,5.05),(5.05,5.05) + (5.1,5.1),(5.1,5.1) + (5.15,5.15),(5.15,5.15) + (5.2,5.2),(5.2,5.2) + (5.25,5.25),(5.25,5.25) + (5.3,5.3),(5.3,5.3) + (5.35,5.35),(5.35,5.35) + (5.4,5.4),(5.4,5.4) + (5.45,5.45),(5.45,5.45) + (5.5,5.5),(5.5,5.5) + (5.55,5.55),(5.55,5.55) + (5.6,5.6),(5.6,5.6) + (5.65,5.65),(5.65,5.65) + (5.7,5.7),(5.7,5.7) + (5.75,5.75),(5.75,5.75) + (5.8,5.8),(5.8,5.8) + (5.85,5.85),(5.85,5.85) + (5.9,5.9),(5.9,5.9) + (5.95,5.95),(5.95,5.95) + (6,6),(6,6) +(21 rows) + +-- Also test an index-only knn-search +explain (costs off) +select b from gist_tbl where b <@ box(point(5,5), point(6,6)) +order by b <-> point(5.2, 5.91); + QUERY PLAN +------------------------------------------------------ + Index Only Scan using gist_tbl_box_index on gist_tbl + Index Cond: (b <@ '(6,6),(5,5)'::box) + Order By: (b <-> '(5.2,5.91)'::point) +(3 rows) + +select b from gist_tbl where b <@ box(point(5,5), point(6,6)) +order by b <-> point(5.2, 5.91); + b +------------------------- + (5.55,5.55),(5.55,5.55) + (5.6,5.6),(5.6,5.6) + (5.5,5.5),(5.5,5.5) + (5.65,5.65),(5.65,5.65) + (5.45,5.45),(5.45,5.45) + (5.7,5.7),(5.7,5.7) + (5.4,5.4),(5.4,5.4) + (5.75,5.75),(5.75,5.75) + (5.35,5.35),(5.35,5.35) + (5.8,5.8),(5.8,5.8) + (5.3,5.3),(5.3,5.3) + (5.85,5.85),(5.85,5.85) + (5.25,5.25),(5.25,5.25) + (5.9,5.9),(5.9,5.9) + (5.2,5.2),(5.2,5.2) + (5.95,5.95),(5.95,5.95) + (5.15,5.15),(5.15,5.15) + (6,6),(6,6) + (5.1,5.1),(5.1,5.1) + (5.05,5.05),(5.05,5.05) + (5,5),(5,5) +(21 rows) + +-- Check commuted case as well +explain (costs off) +select b from gist_tbl where b <@ box(point(5,5), point(6,6)) +order by point(5.2, 5.91) <-> b; + QUERY PLAN +------------------------------------------------------ + Index Only Scan using gist_tbl_box_index on gist_tbl + Index Cond: (b <@ '(6,6),(5,5)'::box) + Order By: (b <-> '(5.2,5.91)'::point) +(3 rows) + +select b from gist_tbl where b <@ box(point(5,5), point(6,6)) +order by point(5.2, 5.91) <-> b; + b +------------------------- + (5.55,5.55),(5.55,5.55) + (5.6,5.6),(5.6,5.6) + (5.5,5.5),(5.5,5.5) + (5.65,5.65),(5.65,5.65) + (5.45,5.45),(5.45,5.45) + (5.7,5.7),(5.7,5.7) + (5.4,5.4),(5.4,5.4) + (5.75,5.75),(5.75,5.75) + (5.35,5.35),(5.35,5.35) + (5.8,5.8),(5.8,5.8) + (5.3,5.3),(5.3,5.3) + (5.85,5.85),(5.85,5.85) + (5.25,5.25),(5.25,5.25) + (5.9,5.9),(5.9,5.9) + (5.2,5.2),(5.2,5.2) + (5.95,5.95),(5.95,5.95) + (5.15,5.15),(5.15,5.15) + (6,6),(6,6) + (5.1,5.1),(5.1,5.1) + (5.05,5.05),(5.05,5.05) + (5,5),(5,5) +(21 rows) + +drop index gist_tbl_box_index; +-- Test that an index-only scan is not chosen, when the query involves the +-- circle column (the circle opclass does not support index-only scans). +create index gist_tbl_multi_index on gist_tbl using gist (p, c); +explain (costs off) +select p, c from gist_tbl +where p <@ box(point(5,5), point(6, 6)); + QUERY PLAN +--------------------------------------------------- + Index Scan using gist_tbl_multi_index on gist_tbl + Index Cond: (p <@ '(6,6),(5,5)'::box) +(2 rows) + +-- execute the same +select b, p from gist_tbl +where b <@ box(point(4.5, 4.5), point(5.5, 5.5)) +and p <@ box(point(5,5), point(6, 6)); + b | p +-------------------------+------------- + (5,5),(5,5) | (5,5) + (5.05,5.05),(5.05,5.05) | (5.05,5.05) + (5.1,5.1),(5.1,5.1) | (5.1,5.1) + (5.15,5.15),(5.15,5.15) | (5.15,5.15) + (5.2,5.2),(5.2,5.2) | (5.2,5.2) + (5.25,5.25),(5.25,5.25) | (5.25,5.25) + (5.3,5.3),(5.3,5.3) | (5.3,5.3) + (5.35,5.35),(5.35,5.35) | (5.35,5.35) + (5.4,5.4),(5.4,5.4) | (5.4,5.4) + (5.45,5.45),(5.45,5.45) | (5.45,5.45) + (5.5,5.5),(5.5,5.5) | (5.5,5.5) +(11 rows) + +drop index gist_tbl_multi_index; +-- Test that we don't try to return the value of a non-returnable +-- column in an index-only scan. (This isn't GIST-specific, but +-- it only applies to index AMs that can return some columns and not +-- others, so GIST with appropriate opclasses is a convenient test case.) +create index gist_tbl_multi_index on gist_tbl using gist (circle(p,1), p); +explain (verbose, costs off) +select circle(p,1) from gist_tbl +where p <@ box(point(5, 5), point(5.3, 5.3)); + QUERY PLAN +--------------------------------------------------------------- + Index Only Scan using gist_tbl_multi_index on public.gist_tbl + Output: circle(p, '1'::double precision) + Index Cond: (gist_tbl.p <@ '(5.3,5.3),(5,5)'::box) +(3 rows) + +select circle(p,1) from gist_tbl +where p <@ box(point(5, 5), point(5.3, 5.3)); + circle +----------------- + <(5,5),1> + <(5.05,5.05),1> + <(5.1,5.1),1> + <(5.15,5.15),1> + <(5.2,5.2),1> + <(5.25,5.25),1> + <(5.3,5.3),1> +(7 rows) + +-- Similarly, test that index rechecks involving a non-returnable column +-- are done correctly. +explain (verbose, costs off) +select p from gist_tbl where circle(p,1) @> circle(point(0,0),0.95); + QUERY PLAN +--------------------------------------------------------------------------------------- + Index Only Scan using gist_tbl_multi_index on public.gist_tbl + Output: p + Index Cond: ((circle(gist_tbl.p, '1'::double precision)) @> '<(0,0),0.95>'::circle) +(3 rows) + +select p from gist_tbl where circle(p,1) @> circle(point(0,0),0.95); + p +------- + (0,0) +(1 row) + +-- Also check that use_physical_tlist doesn't trigger in such cases. +explain (verbose, costs off) +select count(*) from gist_tbl; + QUERY PLAN +--------------------------------------------------------------------- + Aggregate + Output: count(*) + -> Index Only Scan using gist_tbl_multi_index on public.gist_tbl +(3 rows) + +select count(*) from gist_tbl; + count +------- + 10001 +(1 row) + +-- This case isn't supported, but it should at least EXPLAIN correctly. +explain (verbose, costs off) +select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; + QUERY PLAN +------------------------------------------------------------------------------------ + Limit + Output: p, ((circle(p, '1'::double precision) <-> '(0,0)'::point)) + -> Index Only Scan using gist_tbl_multi_index on public.gist_tbl + Output: p, (circle(p, '1'::double precision) <-> '(0,0)'::point) + Order By: ((circle(gist_tbl.p, '1'::double precision)) <-> '(0,0)'::point) +(5 rows) + +select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; +ERROR: lossy distance functions are not supported in index-only scans +-- Clean up +reset enable_seqscan; +reset enable_bitmapscan; +reset enable_indexonlyscan; +drop table gist_tbl; diff --git a/src/test/singlenode_regress/expected/gp_foreign_data.out b/src/test/singlenode_regress/expected/gp_foreign_data.out new file mode 100644 index 00000000000..c4dbd5bea93 --- /dev/null +++ b/src/test/singlenode_regress/expected/gp_foreign_data.out @@ -0,0 +1,44 @@ +-- +-- Test foreign-data wrapper and server management. Cloudberry MPP specific +-- +CREATE FOREIGN DATA WRAPPER dummy; +COMMENT ON FOREIGN DATA WRAPPER dummy IS 'useless'; +-- CREATE FOREIGN TABLE +CREATE SERVER s0 FOREIGN DATA WRAPPER dummy; +CREATE FOREIGN TABLE ft2 ( + c1 int +) SERVER s0 OPTIONS (delimiter ',', mpp_execute 'a'); -- ERROR +ERROR: "a" is not a valid mpp_execute value +CREATE FOREIGN TABLE ft2 ( + c1 int +) SERVER s0 OPTIONS (delimiter ',', mpp_execute 'any'); +\d+ ft2 + Foreign table "public.ft2" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+---------+--------------+------------- + c1 | integer | | | | | plain | | +Server: s0 +FDW options: (delimiter ',', mpp_execute 'any') + +CREATE FOREIGN TABLE ft3 ( + c1 int +) SERVER s0 OPTIONS (delimiter ',', mpp_execute 'master'); +CREATE FOREIGN TABLE ft4 ( + c1 int +) SERVER s0 OPTIONS (delimiter ',', mpp_execute 'all segments'); +-- Test num_segments option +CREATE SERVER s1 FOREIGN DATA WRAPPER dummy OPTIONS (num_segments '3'); +CREATE FOREIGN TABLE ft5 ( + c1 int +) SERVER s1 OPTIONS (delimiter ',', mpp_execute 'all segments', num_segments '5'); +\d+ ft5 + Foreign table "public.ft5" + Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description +--------+---------+-----------+----------+---------+-------------+---------+--------------+------------- + c1 | integer | | | | | plain | | +Server: s1 +FDW options: (delimiter ',', mpp_execute 'all segments', num_segments '5') + +--start_ignore +DROP FOREIGN DATA WRAPPER dummy CASCADE; +--end_ignore diff --git a/src/test/singlenode_regress/expected/gp_gin_index.out b/src/test/singlenode_regress/expected/gp_gin_index.out new file mode 100644 index 00000000000..954e4df2d9c --- /dev/null +++ b/src/test/singlenode_regress/expected/gp_gin_index.out @@ -0,0 +1,654 @@ +CREATE INDEX jidx ON testjsonb USING gin (j); +SET optimizer_enable_tablescan = off; +SET enable_seqscan = off; +set enable_bitmapscan = on; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j @> '{"wait": null}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j @> '{"wait": null}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j @> '{"wait": "CC"}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j @> '{"wait": "CC"}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=24.23..24.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=20.08..24.20 rows=10 width=0) + Recheck Cond: (j @> '{"wait": "CC", "public": true}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..20.08 rows=10 width=0) + Index Cond: (j @> '{"wait": "CC", "public": true}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j @> '{"age": 25}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j @> '{"age": 25}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j @> '{"age": 25.0}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j @> '{"age": 25.0}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}'; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j @> '{"array": ["foo"]}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j @> '{"array": ["foo"]}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}'; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j @> '{"array": ["bar"]}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j @> '{"array": ["bar"]}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}'; + count +------- + 3 +(1 row) + +-- exercise GIN_SEARCH_MODE_ALL +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{}'; + QUERY PLAN +------------------------------------------------------------------------------ + Aggregate (cost=3864.23..3864.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=3860.08..3864.20 rows=10 width=0) + Recheck Cond: (j @> '{}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..3860.08 rows=10 width=0) + Index Cond: (j @> '{}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j ? 'public'; + QUERY PLAN +-------------------------------------------------------------------------- + Aggregate (cost=12.23..12.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.20 rows=10 width=0) + Recheck Cond: (j ? 'public'::text) + -> Bitmap Index Scan on jidx (cost=0.00..8.08 rows=10 width=0) + Index Cond: (j ? 'public'::text) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j ? 'bar'; + QUERY PLAN +-------------------------------------------------------------------------- + Aggregate (cost=12.23..12.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.20 rows=10 width=0) + Recheck Cond: (j ? 'bar'::text) + -> Bitmap Index Scan on jidx (cost=0.00..8.08 rows=10 width=0) + Index Cond: (j ? 'bar'::text) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j ?| '{public,disabled}'::text[]) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j ?| '{public,disabled}'::text[]) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j ?& '{public,disabled}'::text[]) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j ?& '{public,disabled}'::text[]) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM testjsonb WHERE j @> '{}'; + count +------- + 1012 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ? 'public'; + count +------- + 194 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ? 'bar'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; + count +------- + 337 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; + count +------- + 42 +(1 row) + +-- array exists - array elements should behave as keys (for GIN index scans too) +CREATE INDEX jidx_array ON testjsonb USING gin((j->'array')); +-- gin index on expression not support for orca +EXPLAIN SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; + QUERY PLAN +-------------------------------------------------------------------------------- + Aggregate (cost=12.26..12.27 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.23 rows=10 width=0) + Recheck Cond: ((j -> 'array'::text) ? 'bar'::text) + -> Bitmap Index Scan on jidx_array (cost=0.00..8.08 rows=10 width=0) + Index Cond: ((j -> 'array'::text) ? 'bar'::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; + count +------- + 3 +(1 row) + +-- type sensitive array exists - should return no rows (since "exists" only +-- matches strings that are either object keys or array elements) +-- gin index on expression not support for orca +EXPLAIN SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; + QUERY PLAN +-------------------------------------------------------------------------------- + Aggregate (cost=12.26..12.27 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.23 rows=10 width=0) + Recheck Cond: ((j -> 'array'::text) ? '5'::text) + -> Bitmap Index Scan on jidx_array (cost=0.00..8.08 rows=10 width=0) + Index Cond: ((j -> 'array'::text) ? '5'::text) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; + count +------- + 0 +(1 row) + +-- However, a raw scalar is *contained* within the array +EXPLAIN SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; + QUERY PLAN +-------------------------------------------------------------------------------- + Aggregate (cost=12.26..12.27 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.23 rows=10 width=0) + Recheck Cond: ((j -> 'array'::text) @> '5'::jsonb) + -> Bitmap Index Scan on jidx_array (cost=0.00..8.08 rows=10 width=0) + Index Cond: ((j -> 'array'::text) @> '5'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; + count +------- + 1 +(1 row) + +DROP INDEX jidx_array; +--gin path opclass +DROP INDEX jidx; +CREATE INDEX jidx ON testjsonb USING gin (j jsonb_path_ops); +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; + QUERY PLAN +-------------------------------------------------------------------------- + Aggregate (cost=12.23..12.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.20 rows=10 width=0) + Recheck Cond: (j @> '{"wait": null}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..8.08 rows=10 width=0) + Index Cond: (j @> '{"wait": null}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; + QUERY PLAN +-------------------------------------------------------------------------- + Aggregate (cost=12.23..12.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.20 rows=10 width=0) + Recheck Cond: (j @> '{"wait": "CC"}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..8.08 rows=10 width=0) + Index Cond: (j @> '{"wait": "CC"}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; + QUERY PLAN +--------------------------------------------------------------------------- + Aggregate (cost=16.23..16.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=12.08..16.20 rows=10 width=0) + Recheck Cond: (j @> '{"wait": "CC", "public": true}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..12.08 rows=10 width=0) + Index Cond: (j @> '{"wait": "CC", "public": true}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; + QUERY PLAN +-------------------------------------------------------------------------- + Aggregate (cost=12.23..12.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.20 rows=10 width=0) + Recheck Cond: (j @> '{"age": 25}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..8.08 rows=10 width=0) + Index Cond: (j @> '{"age": 25}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; + QUERY PLAN +-------------------------------------------------------------------------- + Aggregate (cost=12.23..12.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=8.08..12.20 rows=10 width=0) + Recheck Cond: (j @> '{"age": 25.0}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..8.08 rows=10 width=0) + Index Cond: (j @> '{"age": 25.0}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; + count +------- + 2 +(1 row) + +-- exercise GIN_SEARCH_MODE_ALL +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{}'; + QUERY PLAN +------------------------------------------------------------------------------ + Aggregate (cost=6664.23..6664.24 rows=1 width=8) + -> Bitmap Heap Scan on testjsonb (cost=6660.08..6664.20 rows=10 width=0) + Recheck Cond: (j @> '{}'::jsonb) + -> Bitmap Index Scan on jidx (cost=0.00..6660.08 rows=10 width=0) + Index Cond: (j @> '{}'::jsonb) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM testjsonb WHERE j @> '{}'; + count +------- + 1012 +(1 row) + +DROP INDEX jidx; +-- check some corner cases for indexed nested containment (bug #13756) +create temp table nestjsonb (j jsonb); +insert into nestjsonb (j) values ('{"a":[["b",{"x":1}],["b",{"x":2}]],"c":3}'); +insert into nestjsonb (j) values ('[[14,2,3]]'); +insert into nestjsonb (j) values ('[1,[14,2,3]]'); +create index on nestjsonb using gin(j jsonb_path_ops); +explain select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; + QUERY PLAN +------------------------------------------------------------------------------ + Bitmap Heap Scan on nestjsonb (cost=8.00..12.01 rows=1 width=32) + Recheck Cond: (j @> '{"a": [[{"x": 2}]]}'::jsonb) + -> Bitmap Index Scan on nestjsonb_j_idx (cost=0.00..8.00 rows=1 width=0) + Index Cond: (j @> '{"a": [[{"x": 2}]]}'::jsonb) + Optimizer: Postgres query optimizer +(5 rows) + +explain select * from nestjsonb where j @> '{"c":3}'; + QUERY PLAN +------------------------------------------------------------------------------ + Bitmap Heap Scan on nestjsonb (cost=8.00..12.01 rows=1 width=32) + Recheck Cond: (j @> '{"c": 3}'::jsonb) + -> Bitmap Index Scan on nestjsonb_j_idx (cost=0.00..8.00 rows=1 width=0) + Index Cond: (j @> '{"c": 3}'::jsonb) + Optimizer: Postgres query optimizer +(5 rows) + +explain select * from nestjsonb where j @> '[[14]]'; + QUERY PLAN +------------------------------------------------------------------------------ + Bitmap Heap Scan on nestjsonb (cost=8.00..12.01 rows=1 width=32) + Recheck Cond: (j @> '[[14]]'::jsonb) + -> Bitmap Index Scan on nestjsonb_j_idx (cost=0.00..8.00 rows=1 width=0) + Index Cond: (j @> '[[14]]'::jsonb) + Optimizer: Postgres query optimizer +(5 rows) + +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '{"c":3}'; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '[[14]]'; + j +----------------- + [[14, 2, 3]] + [1, [14, 2, 3]] +(2 rows) + +CREATE INDEX wowidx ON test_tsvector USING gin (a); +-- GIN only supports bitmapscan, so no need to test plain indexscan +explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + QUERY PLAN +------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on test_tsvector + Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery) + -> Bitmap Index Scan on wowidx + Index Cond: (a @@ '''wr'' | ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + QUERY PLAN +------------------------------------------------------------------------------- + Aggregate (cost=22.64..22.65 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=13.24..22.24 rows=160 width=0) + Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..13.20 rows=160 width=0) + Index Cond: (a @@ '''wr'' | ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; + QUERY PLAN +------------------------------------------------------------------------------ + Aggregate (cost=19.34..19.35 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=12.12..19.30 rows=15 width=0) + Recheck Cond: (a @@ '''wr'' & ''qh'''::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..12.11 rows=15 width=0) + Index Cond: (a @@ '''wr'' & ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; + QUERY PLAN +----------------------------------------------------------------------------- + Aggregate (cost=19.05..19.06 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=12.04..19.03 rows=5 width=0) + Recheck Cond: (a @@ '''eq'' & ''yt'''::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..12.04 rows=5 width=0) + Index Cond: (a @@ '''eq'' & ''yt'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; + QUERY PLAN +------------------------------------------------------------------------------ + Aggregate (cost=21.25..21.26 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=12.77..21.00 rows=99 width=0) + Recheck Cond: (a @@ '''eq'' | ''yt'''::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..12.74 rows=99 width=0) + Index Cond: (a @@ '''eq'' | ''yt'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; + QUERY PLAN +------------------------------------------------------------------------------- + Aggregate (cost=27.45..27.46 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=20.15..27.40 rows=20 width=0) + Recheck Cond: (a @@ '''eq'' & ''yt'' | ''wr'' & ''qh'''::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..20.15 rows=20 width=0) + Index Cond: (a @@ '''eq'' & ''yt'' | ''wr'' & ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; + QUERY PLAN +--------------------------------------------------------------------------------------- + Aggregate (cost=27.71..27.72 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=20.24..27.63 rows=31 width=0) + Recheck Cond: (a @@ '( ''eq'' | ''yt'' ) & ( ''wr'' | ''qh'' )'::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..20.23 rows=31 width=0) + Index Cond: (a @@ '( ''eq'' | ''yt'' ) & ( ''wr'' | ''qh'' )'::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; + QUERY PLAN +------------------------------------------------------------------------------- + Aggregate (cost=34.56..34.57 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=19.94..33.29 rows=508 width=0) + Recheck Cond: (a @@ '''w'':* | ''q'':*'::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..19.81 rows=508 width=0) + Index Cond: (a @@ '''w'':* | ''q'':*'::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +-- For orca, ScalarArrayOpExpr condition on index scan not supported +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); + QUERY PLAN +------------------------------------------------------------------------------- + Aggregate (cost=22.64..22.65 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=13.24..22.24 rows=160 width=0) + Recheck Cond: (a @@ ANY ('{''wr'',''qh''}'::tsquery[])) + -> Bitmap Index Scan on wowidx (cost=0.00..13.20 rows=160 width=0) + Index Cond: (a @@ ANY ('{''wr'',''qh''}'::tsquery[])) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; + QUERY PLAN +---------------------------------------------------------------------------- + Aggregate (cost=12.02..12.03 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=8.01..12.02 rows=1 width=0) + Recheck Cond: (a @@ '''no_such_lexeme'''::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..8.01 rows=1 width=0) + Index Cond: (a @@ '''no_such_lexeme'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + QUERY PLAN +----------------------------------------------------------------------------------- + Aggregate (cost=4590.53..4590.54 rows=1 width=8) + -> Bitmap Heap Scan on test_tsvector (cost=4575.93..4589.27 rows=507 width=0) + Recheck Cond: (a @@ '!''no_such_lexeme'''::tsquery) + -> Bitmap Index Scan on wowidx (cost=0.00..4575.80 rows=507 width=0) + Index Cond: (a @@ '!''no_such_lexeme'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; + count +------- + 17 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; + count +------- + 98 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; + count +------- + 23 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; + count +------- + 39 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; + count +------- + 494 +(1 row) + +-- For orca, ScalarArrayOpExpr condition on index scan not supported +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + count +------- + 508 +(1 row) + +DROP INDEX wowidx; +-- GIN index on complex array +CREATE TABLE complex_array_table (complex_arr complex[]); +CREATE INDEX ON complex_array_table USING gin (complex_arr); +INSERT INTO complex_array_table VALUES (ARRAY[COMPLEX(1,3), COMPLEX(5,7)]); +INSERT INTO complex_array_table VALUES (ARRAY[COMPLEX(2,4), COMPLEX(6,8)]); +EXPLAIN SELECT * FROM complex_array_table WHERE complex_arr @> ARRAY[COMPLEX(2,4)]; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Bitmap Heap Scan on complex_array_table (cost=12.21..22.55 rows=27 width=32) + Recheck Cond: (complex_arr @> '{"2 + 4i"}'::complex[]) + -> Bitmap Index Scan on complex_array_table_complex_arr_idx (cost=0.00..12.20 rows=27 width=0) + Index Cond: (complex_arr @> '{"2 + 4i"}'::complex[]) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT * FROM complex_array_table WHERE complex_arr @> ARRAY[COMPLEX(2,4)]; + complex_arr +--------------------- + {"2 + 4i","6 + 8i"} +(1 row) + +-- with orca bitmap table scan off and table scan off, orca should fallback to +-- planner to use bitmap index scan, as btree index plans are not supported with gin +set optimizer_enable_tablescan=off; +EXPLAIN SELECT * FROM complex_array_table WHERE complex_arr @> ARRAY[COMPLEX(2,4)]; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Bitmap Heap Scan on complex_array_table (cost=12.21..22.55 rows=27 width=32) + Recheck Cond: (complex_arr @> '{"2 + 4i"}'::complex[]) + -> Bitmap Index Scan on complex_array_table_complex_arr_idx (cost=0.00..12.20 rows=27 width=0) + Index Cond: (complex_arr @> '{"2 + 4i"}'::complex[]) + Optimizer: Postgres query optimizer +(5 rows) + +DROP TABLE complex_array_table; +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET optimizer_enable_tablescan; diff --git a/src/test/singlenode_regress/expected/gp_recursive_cte.out b/src/test/singlenode_regress/expected/gp_recursive_cte.out new file mode 100644 index 00000000000..bb455dbbba5 --- /dev/null +++ b/src/test/singlenode_regress/expected/gp_recursive_cte.out @@ -0,0 +1,763 @@ +-- Tests exercising different behaviour of the WITH RECURSIVE implementation in GPDB +-- GPDB's distributed nature requires thorough testing of many use cases in order to ensure correctness +-- Setup +create schema recursive_cte; +set search_path=recursive_cte; +create table recursive_table_1(id int); +insert into recursive_table_1 values (1), (2), (100); +-- Test the featureblocking GUC for recursive CTE +set gp_recursive_cte to off; +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where recursive_table_1.id IN (select * from r limit 10); +ERROR: RECURSIVE clauses in WITH queries are currently disabled +HINT: In order to use recursive CTEs, "gp_recursive_cte" must be turned on. +set gp_recursive_cte to on; +-- WITH RECURSIVE ref used with IN without correlation +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where recursive_table_1.id IN (select * from r limit 10); + id +---- + 1 + 2 +(2 rows) + +-- WITH RECURSIVE ref used with NOT IN without correlation +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where recursive_table_1.id NOT IN (select * from r limit 10); + id +----- + 100 +(1 row) + +-- WITH RECURSIVE ref used with EXISTS without correlation +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where EXISTS (select * from r limit 10); + id +----- + 1 + 2 + 100 +(3 rows) + +-- WITH RECURSIVE ref used with NOT EXISTS without correlation +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where NOT EXISTS (select * from r limit 10); + id +---- +(0 rows) + +create table recursive_table_2(id int); +insert into recursive_table_2 values (11) , (21), (31); +-- WITH RECURSIVE ref used with IN & correlation +with recursive r(i) as ( + select * from recursive_table_2 + union all + select r.i + 1 from r, recursive_table_2 where r.i = recursive_table_2.id +) +select recursive_table_1.id from recursive_table_1, recursive_table_2 where recursive_table_1.id IN (select * from r where r.i = recursive_table_2.id); + id +---- +(0 rows) + +-- WITH RECURSIVE ref used with NOT IN & correlation +with recursive r(i) as ( + select * from recursive_table_2 + union all + select r.i + 1 from r, recursive_table_2 where r.i = recursive_table_2.id +) +select recursive_table_1.id from recursive_table_1, recursive_table_2 where recursive_table_1.id NOT IN (select * from r where r.i = recursive_table_2.id); + id +----- + 1 + 1 + 1 + 2 + 2 + 2 + 100 + 100 + 100 +(9 rows) + +-- WITH RECURSIVE ref used with EXISTS & correlation +with recursive r(i) as ( + select * from recursive_table_2 + union all + select r.i + 1 from r, recursive_table_2 where r.i = recursive_table_2.id +) +select recursive_table_1.id from recursive_table_1, recursive_table_2 where recursive_table_1.id = recursive_table_2.id and EXISTS (select * from r where r.i = recursive_table_2.id); + id +---- +(0 rows) + +-- WITH RECURSIVE ref used with NOT EXISTS & correlation +with recursive r(i) as ( + select * from recursive_table_2 + union all + select r.i + 1 from r, recursive_table_2 where r.i = recursive_table_2.id +) +select recursive_table_1.id from recursive_table_1, recursive_table_2 where recursive_table_1.id = recursive_table_2.id and NOT EXISTS (select * from r where r.i = recursive_table_2.id); + id +---- +(0 rows) + +-- WITH RECURSIVE ref used within a Expression sublink +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where recursive_table_1.id >= (select i from r limit 1) order by recursive_table_1.id; + id +----- + 1 + 2 + 100 +(3 rows) + +-- WITH RECURSIVE ref used within an EXISTS subquery in another recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and EXISTS (select * from r limit 10) +) +select * from y limit 10; + i +--- + 1 + 2 + 3 +(3 rows) + +-- WITH RECURSIVE ref used within a NOT EXISTS subquery in another recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and NOT EXISTS (select * from r limit 10) +) +select * from y limit 10; + i +--- + 1 +(1 row) + +-- WITH RECURSIVE ref used within an IN subquery in a non-recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y as ( + select * from recursive_table_1 where recursive_table_1.id IN (select * from r limit 10) +) +select * from y; + id +---- + 1 +(1 row) + +-- WITH RECURSIVE ref used within a NOT IN subquery in a non-recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y as ( + select * from recursive_table_1 where recursive_table_1.id NOT IN (select * from r limit 10) +) +select * from y; + id +----- + 2 + 100 +(2 rows) + +-- WITH RECURSIVE ref used within an EXISTS subquery in a non-recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y as ( + select * from recursive_table_1 where EXISTS (select * from r limit 10) +) +select * from y; + id +----- + 1 + 2 + 100 +(3 rows) + +-- WITH RECURSIVE ref used within a NOT EXISTS subquery in a non-recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y as ( + select * from recursive_table_1 where NOT EXISTS (select * from r limit 10) +) +select * from y; + id +---- +(0 rows) + +-- WITH RECURSIVE non-recursive ref used within an EXISTS subquery in a recursive CTE +with recursive +r as ( + select * from recursive_table_2 +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and EXISTS (select * from r) +) +select * from y limit 10; + i +--- + 1 + 2 + 3 +(3 rows) + +-- WITH RECURSIVE non-recursive ref used within a NOT EXISTS subquery in a recursive CTE +with recursive +r as ( + select * from recursive_table_2 +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and NOT EXISTS (select * from r) +) +select * from y limit 10; + i +--- + 1 +(1 row) + +-- WITH ref used within an IN subquery in another CTE +with +r as ( + select * from recursive_table_2 where id < 21 +), +y as ( + select * from recursive_table_1 where id IN (select * from r) +) +select * from y; + id +---- +(0 rows) + +-- WITH ref used within a NOT IN subquery in another CTE +with +r as ( + select * from recursive_table_2 where id < 21 +), +y as ( + select * from recursive_table_1 where id NOT IN (select * from r) +) +select * from y; + id +----- + 1 + 2 + 100 +(3 rows) + +-- WITH ref used within an EXISTS subquery in another CTE +with +r as ( + select * from recursive_table_2 where id < 21 +), +y as ( + select * from recursive_table_1 where EXISTS (select * from r) +) +select * from y; + id +----- + 1 + 2 + 100 +(3 rows) + +-- WITH ref used within a NOT EXISTS subquery in another CTE +with +r as ( + select * from recursive_table_2 where id < 21 +), +y as ( + select * from recursive_table_1 where NOT EXISTS (select * from r) +) +select * from y; + id +---- +(0 rows) + +-- WITH RECURSIVE ref used within a IN subquery in another recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and i IN (select * from r limit 10) +) +select * from y limit 10; + i +--- + 1 + 2 +(2 rows) + +-- WITH RECURSIVE ref used within a NOT IN subquery in another recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and i NOT IN (select * from r limit 10) +) +select * from y limit 10; + i +--- + 1 +(1 row) + +-- WITH RECURSIVE non-recursive ref used within an IN subquery in a recursive CTE +with recursive +r as ( + select * from recursive_table_2 +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and i IN (select * from r) +) +select * from y limit 10; + i +--- + 1 +(1 row) + +-- WITH RECURSIVE non-recursive ref used within a NOT IN subquery in a recursive CTE +with recursive +r as ( + select * from recursive_table_2 +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and i NOT IN (select * from r) +) +select * from y limit 10; + i +--- + 1 + 2 + 3 +(3 rows) + +create table recursive_table_3(id int, a int); +insert into recursive_table_3 values (1, 2), (2, 3); +-- WITH RECURSIVE ref used within a window function +with recursive r(i, j) as ( + select * from recursive_table_3 + union all + select i + 1, j from r, recursive_table_3 where r.i < recursive_table_3.id +) +select avg(i) over(partition by j) from r limit 100; + avg +-------------------- + 2.0000000000000000 + 1.5000000000000000 + 1.5000000000000000 +(3 rows) + +-- WITH RECURSIVE ref used within a UDF +create function sum_to_zero(integer) returns bigint as $$ +with recursive r(i) as ( + select $1 + union all + select i - 1 from r where i > 0 +) +select sum(i) from r; +$$ language sql; +select sum_to_zero(10); + sum_to_zero +------------- + 55 +(1 row) + +-- WITH RECURSIVE ref used within a UDF against a distributed table +create table people(name text, parent_of text); +insert into people values ('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e'); +create function get_lineage(text) returns setof text as $$ +with recursive r(person) as ( + select name from people where name = $1 + union all + select name from r, people where people.parent_of = r.person +) +select * from r; +$$ language sql; +select get_lineage('d'); + get_lineage +------------- + d + c + b + a +(4 rows) + +-- non-recursive CTE nested in non-recursive enclosing CTE +INSERT INTO recursive_table_1 SELECT i FROM generate_series(0, 100) i; +SELECT MAX(j) +FROM +( + WITH nr1(i) AS (SELECT id FROM recursive_table_1 WHERE id >= 10) + SELECT * FROM + ( + WITH nr2(j) AS (SELECT i FROM nr1 WHERE i >= 50) + SELECT nr2.j FROM nr2, nr1 + ) sub2 +) sub1; + max +----- + 100 +(1 row) + +-- non-recursive CTE nested in recursive enclosing CTE +WITH RECURSIVE r1(i) AS +( + SELECT 1 + UNION ALL + ( + WITH r2(j) AS + ( + SELECT id FROM recursive_table_1 WHERE id < 5 + ) + SELECT SUM(j) FROM r2 + ) +) +SELECT * FROM r1; + i +---- + 1 + 13 +(2 rows) + +-- recursive CTE nested in recursive enclosing CTE +WITH RECURSIVE r1(i) AS +( + SELECT 1 + UNION ALL + ( + WITH RECURSIVE r2(j) AS + ( + SELECT 1 + UNION ALL + SELECT j + 1 FROM r2 WHERE j < 5 + ) + SELECT i + 1 FROM r1, r2 WHERE i < 5 + ) +) +SELECT SUM(i) FROM r1; + sum +------ + 3711 +(1 row) + +-- recursive CTE nested in non-recursive enclosing CTE +WITH nr(i) AS +( + WITH RECURSIVE r(j) AS + ( + SELECT 1 + UNION ALL + SELECT j + 1 FROM r WHERE j < 5 + ) + SELECT SUM(j) FROM r +) +SELECT SUM(i) FROM nr; + sum +----- + 15 +(1 row) + +-- WITH RECURSIVE ref within a correlated subquery +create table recursive_table_4(a int, b int); +create table recursive_table_5(c int, d int); +insert into recursive_table_4 select i, i* 2 from generate_series(1, 10) i; +insert into recursive_table_5 select i/2, i from generate_series(1, 10) i; +select * from recursive_table_4 where a > ALL ( + with recursive r(i) as ( + select sum(c) from recursive_table_5 where d < recursive_table_4.b + union all + select i / 2 from r where i > 0 + ) + select * from r +); + a | b +---+--- + 1 | 2 +(1 row) + +with recursive x(i) as ( + select 1 +), +y(i) as ( + select sum(i) from x + union all + select i + 1 from y +), +z(i) as ( + select avg(i) from x + union all + select i + 1 from z +) +(select * from y limit 5) +union +(select * from z limit 10); + i +------------------------- + 1 + 2 + 3 + 4 + 5 + 6.00000000000000000000 + 7.00000000000000000000 + 8.00000000000000000000 + 9.00000000000000000000 + 10.00000000000000000000 +(10 rows) + +-- WTIH RECURSIVE and replicated table +create table t_rep_test_rcte(c int) ; +create table t_rand_test_rcte(c int); +insert into t_rep_test_rcte values (1); +insert into t_rand_test_rcte values (1), (2), (3); +analyze t_rep_test_rcte; +analyze t_rand_test_rcte; +explain +with recursive the_cte_here(n) as ( + select * from t_rep_test_rcte + union all + select n+1 from the_cte_here join t_rand_test_rcte + on t_rand_test_rcte.c = the_cte_here.n) +select * from the_cte_here; + QUERY PLAN +---------------------------------------------------------------------------------- + Recursive Union (cost=0.00..15.07 rows=34 width=4) + -> Seq Scan on t_rep_test_rcte (cost=0.00..1.01 rows=1 width=4) + -> Hash Join (cost=1.07..1.34 rows=3 width=4) + Hash Cond: (the_cte_here.n = t_rand_test_rcte.c) + -> WorkTable Scan on the_cte_here (cost=0.00..0.20 rows=10 width=4) + -> Hash (cost=1.03..1.03 rows=3 width=4) + -> Seq Scan on t_rand_test_rcte (cost=0.00..1.03 rows=3 width=4) + Optimizer: Postgres query optimizer +(8 rows) + +with recursive the_cte_here(n) as ( + select * from t_rep_test_rcte + union all + select n+1 from the_cte_here join t_rand_test_rcte + on t_rand_test_rcte.c = the_cte_here.n) +select * from the_cte_here; + n +--- + 1 + 2 + 3 + 4 +(4 rows) + +-- WITH RECURSIVE non-recursive shouldn't have hash locus +create table recursive_locus_t1(id int, pid int, name text) ; +insert into recursive_locus_t1 values(0, -1, 'AAA'); +insert into recursive_locus_t1 values(1, 0, 'B1'); +insert into recursive_locus_t1 values(2, 0, 'B2'); +insert into recursive_locus_t1 values(3, 1, 'C1_1'); +insert into recursive_locus_t1 values(4, 1, 'C1_2'); +insert into recursive_locus_t1 values(5, 1, 'C1_3'); +insert into recursive_locus_t1 values(6, 2, 'C2_1'); +insert into recursive_locus_t1 values(7, 2, 'C2_2'); +insert into recursive_locus_t1 values(8, 2, 'C2_3'); +explain (costs off) with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t1 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t1 k inner join cte c on c.id = k.pid +) +select id,name from cte; + QUERY PLAN +---------------------------------------------------- + Recursive Union + -> Seq Scan on recursive_locus_t1 a + Filter: (id = 0) + -> Hash Join + Hash Cond: (c.id = k.pid) + -> WorkTable Scan on cte c + -> Hash + -> Seq Scan on recursive_locus_t1 k + Optimizer: Postgres query optimizer +(9 rows) + +with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t1 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t1 k inner join cte c on c.id = k.pid +) +select id,name from cte; + id | name +----+------------- + 0 | AAA + 1 | AAA>B1 + 2 | AAA>B2 + 4 | AAA>B1>C1_2 + 3 | AAA>B1>C1_1 + 5 | AAA>B1>C1_3 + 8 | AAA>B2>C2_3 + 7 | AAA>B2>C2_2 + 6 | AAA>B2>C2_1 +(9 rows) + +create table recursive_locus_t2(id int, pid int, name text) ; +insert into recursive_locus_t2 values(0, -1, 'AAA'); +insert into recursive_locus_t2 values(1, 0, 'B1'); +insert into recursive_locus_t2 values(2, 0, 'B2'); +insert into recursive_locus_t2 values(3, 1, 'C1_1'); +insert into recursive_locus_t2 values(4, 1, 'C1_2'); +insert into recursive_locus_t2 values(5, 1, 'C1_3'); +insert into recursive_locus_t2 values(6, 2, 'C2_1'); +insert into recursive_locus_t2 values(7, 2, 'C2_2'); +insert into recursive_locus_t2 values(8, 2, 'C2_3'); +explain (costs off) with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t2 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t2 k inner join cte c on c.id = k.pid +) +select id,name from cte; + QUERY PLAN +---------------------------------------------------- + Recursive Union + -> Seq Scan on recursive_locus_t2 a + Filter: (id = 0) + -> Hash Join + Hash Cond: (c.id = k.pid) + -> WorkTable Scan on cte c + -> Hash + -> Seq Scan on recursive_locus_t2 k + Optimizer: Postgres query optimizer +(9 rows) + +with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t2 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t2 k inner join cte c on c.id = k.pid +) +select id,name from cte; + id | name +----+------------- + 0 | AAA + 2 | AAA>B2 + 1 | AAA>B1 + 8 | AAA>B2>C2_3 + 7 | AAA>B2>C2_2 + 6 | AAA>B2>C2_1 + 5 | AAA>B1>C1_3 + 4 | AAA>B1>C1_2 + 3 | AAA>B1>C1_1 +(9 rows) + +create table recursive_locus_t3(id int, pid int, name text); +insert into recursive_locus_t3 values(0, -1, 'AAA'); +insert into recursive_locus_t3 values(1, 0, 'B1'); +insert into recursive_locus_t3 values(2, 0, 'B2'); +insert into recursive_locus_t3 values(3, 1, 'C1_1'); +insert into recursive_locus_t3 values(4, 1, 'C1_2'); +insert into recursive_locus_t3 values(5, 1, 'C1_3'); +insert into recursive_locus_t3 values(6, 2, 'C2_1'); +insert into recursive_locus_t3 values(7, 2, 'C2_2'); +insert into recursive_locus_t3 values(8, 2, 'C2_3'); +explain (costs off) with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t3 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t3 k inner join cte c on c.id = k.pid +) +select id,name from cte; + QUERY PLAN +---------------------------------------------------- + Recursive Union + -> Seq Scan on recursive_locus_t3 a + Filter: (id = 0) + -> Hash Join + Hash Cond: (c.id = k.pid) + -> WorkTable Scan on cte c + -> Hash + -> Seq Scan on recursive_locus_t3 k + Optimizer: Postgres query optimizer +(9 rows) + +with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t3 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t3 k inner join cte c on c.id = k.pid +) +select id,name from cte; + id | name +----+------------- + 0 | AAA + 2 | AAA>B2 + 1 | AAA>B1 + 7 | AAA>B2>C2_2 + 8 | AAA>B2>C2_3 + 6 | AAA>B2>C2_1 + 3 | AAA>B1>C1_1 + 4 | AAA>B1>C1_2 + 5 | AAA>B1>C1_3 +(9 rows) + diff --git a/src/test/singlenode_regress/expected/groupingsets.out b/src/test/singlenode_regress/expected/groupingsets.out new file mode 100644 index 00000000000..3480bdfa30e --- /dev/null +++ b/src/test/singlenode_regress/expected/groupingsets.out @@ -0,0 +1,2317 @@ +-- +-- grouping sets +-- +-- GPDB: Some of the tests in this file test the case that some columns are +-- unsortable, and some are unhashable. For the unhashable column, the upstream +-- tests use 'bit' datatype. However, we have added a hash opclass for 'bit' +-- in GPDB, which makes the tests ineffective in testing that. +-- +-- To work around that, create a new datatype that is just like the built-in +-- 'bit' type, but doesn't have the hash opclass. +create type unhashable_bit; +create function unhashable_bit_out (unhashable_bit) returns cstring immutable +language internal as 'bit_out'; +NOTICE: argument type unhashable_bit is only a shell +create function unhashable_bit_in (cstring) returns unhashable_bit immutable +language internal as 'bit_in'; +NOTICE: return type unhashable_bit is only a shell +create type unhashable_bit ( + input = unhashable_bit_in, + output = unhashable_bit_out, + typmod_in = bittypmodin, + typmod_out = bittypmodout, + like = bit); +create function unhashable_biteq(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'biteq'; +create function unhashable_bitne(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitne'; +create function unhashable_bitge(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitge'; +create function unhashable_bitgt(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitgt'; +create function unhashable_bitle(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitle'; +create function unhashable_bitlt(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitlt'; +create function unhashable_bitcmp(unhashable_bit, unhashable_bit) returns int4 +immutable language internal as 'bitcmp'; +create operator = (function=unhashable_biteq, leftarg=unhashable_bit, rightarg=unhashable_bit, + merges, commutator = "=", negator = "<>", + restrict = 'eqsel', join = 'eqjoinsel'); +create operator <> (function=unhashable_bitne, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = "<>", negator = "=", + restrict = 'neqsel', join = 'neqjoinsel'); +create operator >= (function=unhashable_bitge, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = "<=", negator = "<", + restrict = 'scalargesel', join = 'scalargejoinsel'); +create operator > (function=unhashable_bitgt, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = "<", negator = "<=", + restrict = 'scalargtsel', join = 'scalargtjoinsel'); +create operator <= (function=unhashable_bitle, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = ">=", negator = ">", + restrict = 'scalarlesel', join = 'scalarlejoinsel'); +create operator < (function=unhashable_bitlt, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = ">", negator = ">=", + restrict = 'scalarltsel', join = 'scalarltjoinsel'); +create operator class unhashable_bit_ops + default for type unhashable_bit using btree as + operator 1 < , + operator 2 <= , + operator 3 = , + operator 4 >= , + operator 5 > , + function 1 unhashable_bitcmp(unhashable_bit, unhashable_bit); +create cast (bit as unhashable_bit) without function as assignment; +-- test data sources +create temp view gstest1(a,b,v) + as values (1,1,10),(1,1,11),(1,2,12),(1,2,13),(1,3,14), + (2,3,15), + (3,3,16),(3,4,17), + (4,1,18),(4,1,19); +create temp table gstest2 (a integer, b integer, c integer, d integer, + e integer, f integer, g integer, h integer); +copy gstest2 from stdin; +ANALYZE gstest2; +create temp table gstest3 (a integer, b integer, c integer, d integer); +copy gstest3 from stdin; +alter table gstest3 add primary key (a); +create temp table gstest4(id integer, v integer, + unhashable_col unhashable_bit(4), unsortable_col xid); +insert into gstest4 +values (1,1,b'0000','1'), (2,2,b'0001','1'), + (3,4,b'0010','2'), (4,8,b'0011','2'), + (5,16,b'0000','2'), (6,32,b'0001','2'), + (7,64,b'0010','1'), (8,128,b'0011','1'); +create temp table gstest_empty (a integer, b integer, v integer); +create function gstest_data(v integer, out a integer, out b integer) + returns setof record + as $f$ + begin + return query select v, i from generate_series(1,3) i; + end; + $f$ language plpgsql; +-- basic functionality +set enable_hashagg = false; -- test hashing explicitly later +-- simple rollup with multiple plain aggregates, with and without ordering +-- (and with ordering differing from grouping) +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by rollup (a,b); + a | b | grouping | sum | count | max +---+---+----------+-----+-------+----- + 1 | 1 | 0 | 21 | 2 | 11 + 1 | 2 | 0 | 25 | 2 | 13 + 1 | 3 | 0 | 14 | 1 | 14 + 1 | | 1 | 60 | 5 | 14 + 2 | 3 | 0 | 15 | 1 | 15 + 2 | | 1 | 15 | 1 | 15 + 3 | 3 | 0 | 16 | 1 | 16 + 3 | 4 | 0 | 17 | 1 | 17 + 3 | | 1 | 33 | 2 | 17 + 4 | 1 | 0 | 37 | 2 | 19 + 4 | | 1 | 37 | 2 | 19 + | | 3 | 145 | 10 | 19 +(12 rows) + +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by rollup (a,b) order by a,b; + a | b | grouping | sum | count | max +---+---+----------+-----+-------+----- + 1 | 1 | 0 | 21 | 2 | 11 + 1 | 2 | 0 | 25 | 2 | 13 + 1 | 3 | 0 | 14 | 1 | 14 + 1 | | 1 | 60 | 5 | 14 + 2 | 3 | 0 | 15 | 1 | 15 + 2 | | 1 | 15 | 1 | 15 + 3 | 3 | 0 | 16 | 1 | 16 + 3 | 4 | 0 | 17 | 1 | 17 + 3 | | 1 | 33 | 2 | 17 + 4 | 1 | 0 | 37 | 2 | 19 + 4 | | 1 | 37 | 2 | 19 + | | 3 | 145 | 10 | 19 +(12 rows) + +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by rollup (a,b) order by b desc, a; + a | b | grouping | sum | count | max +---+---+----------+-----+-------+----- + 1 | | 1 | 60 | 5 | 14 + 2 | | 1 | 15 | 1 | 15 + 3 | | 1 | 33 | 2 | 17 + 4 | | 1 | 37 | 2 | 19 + | | 3 | 145 | 10 | 19 + 3 | 4 | 0 | 17 | 1 | 17 + 1 | 3 | 0 | 14 | 1 | 14 + 2 | 3 | 0 | 15 | 1 | 15 + 3 | 3 | 0 | 16 | 1 | 16 + 1 | 2 | 0 | 25 | 2 | 13 + 1 | 1 | 0 | 21 | 2 | 11 + 4 | 1 | 0 | 37 | 2 | 19 +(12 rows) + +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by rollup (a,b) order by coalesce(a,0)+coalesce(b,0); + a | b | grouping | sum | count | max +---+---+----------+-----+-------+----- + | | 3 | 145 | 10 | 19 + 1 | | 1 | 60 | 5 | 14 + 1 | 1 | 0 | 21 | 2 | 11 + 2 | | 1 | 15 | 1 | 15 + 3 | | 1 | 33 | 2 | 17 + 1 | 2 | 0 | 25 | 2 | 13 + 1 | 3 | 0 | 14 | 1 | 14 + 4 | | 1 | 37 | 2 | 19 + 4 | 1 | 0 | 37 | 2 | 19 + 2 | 3 | 0 | 15 | 1 | 15 + 3 | 3 | 0 | 16 | 1 | 16 + 3 | 4 | 0 | 17 | 1 | 17 +(12 rows) + +-- various types of ordered aggs +select a, b, grouping(a,b), + array_agg(v order by v), + string_agg(v::text, ':' order by v desc), + percentile_disc(0.5) within group (order by v), + rank(1,2,12) within group (order by a,b,v) + from gstest1 group by rollup (a,b) order by a,b; + a | b | grouping | array_agg | string_agg | percentile_disc | rank +---+---+----------+---------------------------------+-------------------------------+-----------------+------ + 1 | 1 | 0 | {10,11} | 11:10 | 10 | 3 + 1 | 2 | 0 | {12,13} | 13:12 | 12 | 1 + 1 | 3 | 0 | {14} | 14 | 14 | 1 + 1 | | 1 | {10,11,12,13,14} | 14:13:12:11:10 | 12 | 3 + 2 | 3 | 0 | {15} | 15 | 15 | 1 + 2 | | 1 | {15} | 15 | 15 | 1 + 3 | 3 | 0 | {16} | 16 | 16 | 1 + 3 | 4 | 0 | {17} | 17 | 17 | 1 + 3 | | 1 | {16,17} | 17:16 | 16 | 1 + 4 | 1 | 0 | {18,19} | 19:18 | 18 | 1 + 4 | | 1 | {18,19} | 19:18 | 18 | 1 + | | 3 | {10,11,12,13,14,15,16,17,18,19} | 19:18:17:16:15:14:13:12:11:10 | 14 | 3 +(12 rows) + +-- test usage of grouped columns in direct args of aggs +select grouping(a), a, array_agg(b), + rank(a) within group (order by b nulls first), + rank(a) within group (order by b nulls last) + from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) + group by rollup (a) order by a; + grouping | a | array_agg | rank | rank +----------+---+-------------+------+------ + 0 | 1 | {1,4,5} | 1 | 1 + 0 | 3 | {1,2} | 3 | 3 + 1 | | {1,4,5,1,2} | 1 | 6 +(3 rows) + +-- nesting with window functions +select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum + from gstest2 group by rollup (a,b) order by rsum, a, b; + a | b | sum | rsum +---+---+-----+------ + 1 | 1 | 8 | 8 + 1 | 2 | 2 | 10 + 1 | | 10 | 20 + 2 | 2 | 2 | 22 + 2 | | 2 | 24 + | | 12 | 36 +(6 rows) + +-- nesting with grouping sets +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(()))) + order by 1 desc; + sum +----- + 12 + 12 + 12 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(((a, b))))) + order by 1 desc; + sum +----- + 12 + 12 + 8 + 2 + 2 +(5 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(rollup(c), grouping sets(cube(c)))) + order by 1 desc; + sum +----- + 12 + 12 + 6 + 6 + 6 + 6 +(6 rows) + +select sum(c) from gstest2 + group by grouping sets(a, grouping sets(a, cube(b))) + order by 1 desc; + sum +----- + 12 + 10 + 10 + 8 + 4 + 2 + 2 +(7 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets((a, (b)))) + order by 1 desc; + sum +----- + 8 + 2 + 2 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets((a, b))) + order by 1 desc; + sum +----- + 8 + 2 + 2 +(3 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a), a)) + order by 1 desc; + sum +----- + 10 + 10 + 10 + 2 + 2 + 2 +(6 rows) + +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a, grouping sets(a), ((a)), a, grouping sets(a), (a)), a)) + order by 1 desc; + sum +----- + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 +(16 rows) + +select sum(c) from gstest2 + group by grouping sets((a,(a,b)), grouping sets((a,(a,b)),a)) + order by 1 desc; + sum +----- + 10 + 8 + 8 + 2 + 2 + 2 + 2 + 2 +(8 rows) + +-- empty input: first is 0 rows, second 1, third 3 etc. +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); + a | b | sum | count +---+---+-----+------- +(0 rows) + +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),()); + a | b | sum | count +---+---+-----+------- + | | | 0 +(1 row) + +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),(),(),()); + a | b | sum | count +---+---+-----+------- + | | | 0 + | | | 0 + | | | 0 +(3 rows) + +select sum(v), count(*) from gstest_empty group by grouping sets ((),(),()); + sum | count +-----+------- + | 0 + | 0 + | 0 +(3 rows) + +-- empty input with joins tests some important code paths +select t1.a, t2.b, sum(t1.v), count(*) from gstest_empty t1, gstest_empty t2 + group by grouping sets ((t1.a,t2.b),()); + a | b | sum | count +---+---+-----+------- + | | | 0 +(1 row) + +-- simple joins, var resolution, GROUPING on join vars +select t1.a, t2.b, grouping(t1.a, t2.b), sum(t1.v), max(t2.a) + from gstest1 t1, gstest2 t2 + group by grouping sets ((t1.a, t2.b), ()); + a | b | grouping | sum | max +---+---+----------+------+----- + 1 | 1 | 0 | 420 | 1 + 1 | 2 | 0 | 120 | 2 + 2 | 1 | 0 | 105 | 1 + 2 | 2 | 0 | 30 | 2 + 3 | 1 | 0 | 231 | 1 + 3 | 2 | 0 | 66 | 2 + 4 | 1 | 0 | 259 | 1 + 4 | 2 | 0 | 74 | 2 + | | 3 | 1305 | 2 +(9 rows) + +select t1.a, t2.b, grouping(t1.a, t2.b), sum(t1.v), max(t2.a) + from gstest1 t1 join gstest2 t2 on (t1.a=t2.a) + group by grouping sets ((t1.a, t2.b), ()); + a | b | grouping | sum | max +---+---+----------+-----+----- + 1 | 1 | 0 | 420 | 1 + 1 | 2 | 0 | 60 | 1 + 2 | 2 | 0 | 15 | 2 + | | 3 | 495 | 2 +(4 rows) + +select a, b, grouping(a, b), sum(t1.v), max(t2.c) + from gstest1 t1 join gstest2 t2 using (a,b) + group by grouping sets ((a, b), ()); + a | b | grouping | sum | max +---+---+----------+-----+----- + 1 | 1 | 0 | 147 | 2 + 1 | 2 | 0 | 25 | 2 + | | 3 | 172 | 2 +(3 rows) + +-- check that functionally dependent cols are not nulled +select a, d, grouping(a,b,c) + from gstest3 + group by grouping sets ((a,b), (a,c)); + a | d | grouping +---+---+---------- + 1 | 1 | 1 + 2 | 2 | 1 + 1 | 1 | 2 + 2 | 2 | 2 +(4 rows) + +-- check that distinct grouping columns are kept separate +-- even if they are equal() +explain (costs off) +select g as alias1, g as alias2 + from generate_series(1,3) g + group by alias1, rollup(alias2); + QUERY PLAN +------------------------------------------------ + GroupAggregate + Group Key: g, g + Group Key: g + -> Sort + Sort Key: g + -> Function Scan on generate_series g + Optimizer: Postgres query optimizer +(7 rows) + +select g as alias1, g as alias2 + from generate_series(1,3) g + group by alias1, rollup(alias2); + alias1 | alias2 +--------+-------- + 1 | 1 + 1 | + 2 | 2 + 2 | + 3 | 3 + 3 | +(6 rows) + +-- check that pulled-up subquery outputs still go to null when appropriate +select four, x + from (select four, ten, 'foo'::text as x from tenk1) as t + group by grouping sets (four, x) + having x = 'foo'; + four | x +------+----- + | foo +(1 row) + +select four, x || 'x' + from (select four, ten, 'foo'::text as x from tenk1) as t + group by grouping sets (four, x) + order by four; + four | ?column? +------+---------- + 0 | + 1 | + 2 | + 3 | + | foox +(5 rows) + +select (x+y)*1, sum(z) + from (select 1 as x, 2 as y, 3 as z) s + group by grouping sets (x+y, x); + ?column? | sum +----------+----- + 3 | 3 + | 3 +(2 rows) + +select x, not x as not_x, q2 from + (select *, q1 = 1 as x from int8_tbl i1) as t + group by grouping sets(x, q2) + order by x, q2; + x | not_x | q2 +---+-------+------------------- + f | t | + | | -4567890123456789 + | | 123 + | | 456 + | | 4567890123456789 +(5 rows) + +-- check qual push-down rules for a subquery with grouping sets +explain (verbose, costs off) +select * from ( + select 1 as x, q1, sum(q2) + from int8_tbl i1 + group by grouping sets(1, 2) +) ss +where x = 1 and q1 = 123; + QUERY PLAN +-------------------------------------------- + Subquery Scan on ss + Output: ss.x, ss.q1, ss.sum + Filter: ((ss.x = 1) AND (ss.q1 = 123)) + -> GroupAggregate + Output: (1), i1.q1, sum(i1.q2) + Group Key: 1 + Sort Key: i1.q1 + Group Key: i1.q1 + -> Seq Scan on public.int8_tbl i1 + Output: 1, i1.q1, i1.q2 + Settings: enable_hashagg = 'off' + Optimizer: Postgres query optimizer +(12 rows) + +select * from ( + select 1 as x, q1, sum(q2) + from int8_tbl i1 + group by grouping sets(1, 2) +) ss +where x = 1 and q1 = 123; + x | q1 | sum +---+----+----- +(0 rows) + +-- check handling of pulled-up SubPlan in GROUPING() argument (bug #17479) +explain (verbose, costs off) +select grouping(ss.x) +from int8_tbl i1 +cross join lateral (select (select i1.q1) as x) ss +group by ss.x; + QUERY PLAN +------------------------------------------------ + GroupAggregate + Output: GROUPING((SubPlan 1)), ((SubPlan 2)) + Group Key: ((SubPlan 2)) + -> Sort + Output: ((SubPlan 2)), i1.q1 + Sort Key: ((SubPlan 2)) + -> Seq Scan on public.int8_tbl i1 + Output: (SubPlan 2), i1.q1 + SubPlan 2 + -> Result + Output: i1.q1 + Settings: enable_hashagg = 'off' + Optimizer: Postgres query optimizer +(13 rows) + +select grouping(ss.x) +from int8_tbl i1 +cross join lateral (select (select i1.q1) as x) ss +group by ss.x; + grouping +---------- + 0 + 0 +(2 rows) + +explain (verbose, costs off) +select (select grouping(ss.x)) +from int8_tbl i1 +cross join lateral (select (select i1.q1) as x) ss +group by ss.x; + QUERY PLAN +-------------------------------------------- + GroupAggregate + Output: (SubPlan 2), ((SubPlan 3)) + Group Key: ((SubPlan 3)) + -> Sort + Output: ((SubPlan 3)), i1.q1 + Sort Key: ((SubPlan 3)) + -> Seq Scan on public.int8_tbl i1 + Output: (SubPlan 3), i1.q1 + SubPlan 3 + -> Result + Output: i1.q1 + SubPlan 2 + -> Result + Output: GROUPING((SubPlan 1)) + Settings: enable_hashagg = 'off' + Optimizer: Postgres query optimizer +(16 rows) + +select (select grouping(ss.x)) +from int8_tbl i1 +cross join lateral (select (select i1.q1) as x) ss +group by ss.x; + grouping +---------- + 0 + 0 +(2 rows) + +-- simple rescan tests +select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by rollup (a,b); + a | b | sum +---+---+----- + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | | 3 + 2 | 1 | 2 + 2 | 2 | 2 + 2 | 3 | 2 + 2 | | 6 + | | 9 +(9 rows) + +select * + from (values (1),(2)) v(x), + lateral (select a, b, sum(v.x) from gstest_data(v.x) group by rollup (a,b)) s; +ERROR: aggregate functions are not allowed in FROM clause of their own query level +LINE 3: lateral (select a, b, sum(v.x) from gstest_data(v.x) ... + ^ +-- min max optimization should still work with GROUP BY () +explain (costs off) + select min(unique1) from tenk1 GROUP BY (); + QUERY PLAN +------------------------------------------------------------ + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 IS NOT NULL) + Optimizer: Postgres query optimizer +(6 rows) + +-- Views with GROUPING SET queries +CREATE VIEW gstest_view AS select a, b, grouping(a,b), sum(c), count(*), max(c) + from gstest2 group by rollup ((a,b,c),(c,d)); +NOTICE: view "gstest_view" will be a temporary view +select pg_get_viewdef('gstest_view'::regclass, true); + pg_get_viewdef +------------------------------------------------------------------------------- + SELECT gstest2.a, + + gstest2.b, + + GROUPING(gstest2.a, gstest2.b) AS "grouping", + + sum(gstest2.c) AS sum, + + count(*) AS count, + + max(gstest2.c) AS max + + FROM gstest2 + + GROUP BY ROLLUP((gstest2.a, gstest2.b, gstest2.c), (gstest2.c, gstest2.d)); +(1 row) + +-- Nested queries with 3 or more levels of nesting +select(select (select grouping(a,b) from (values (1)) v2(c)) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); + grouping +---------- + 0 + 0 + 0 +(3 rows) + +select(select (select grouping(e,f) from (values (1)) v2(c)) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); + grouping +---------- + 0 + 1 + 3 +(3 rows) + +select(select (select grouping(c) from (values (1)) v2(c) GROUP BY c) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); + grouping +---------- + 0 + 0 + 0 +(3 rows) + +-- Combinations of operations +select a, b, c, d from gstest2 group by rollup(a,b),grouping sets(c,d); + a | b | c | d +---+---+---+--- + 1 | 1 | 1 | + 1 | | 1 | + | | 1 | + 1 | 1 | 2 | + 1 | 2 | 2 | + 1 | | 2 | + 2 | 2 | 2 | + 2 | | 2 | + | | 2 | + 1 | 1 | | 1 + 1 | | | 1 + | | | 1 + 1 | 1 | | 2 + 1 | 2 | | 2 + 1 | | | 2 + 2 | 2 | | 2 + 2 | | | 2 + | | | 2 +(18 rows) + +select a, b from (values (1,2),(2,3)) v(a,b) group by a,b, grouping sets(a); + a | b +---+--- + 1 | 2 + 2 | 3 +(2 rows) + +-- Tests for chained aggregates +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a,b),(a+1,b+1),(a+2,b+2)) order by 3,6; + a | b | grouping | sum | count | max +---+---+----------+-----+-------+----- + 1 | 1 | 0 | 21 | 2 | 11 + 1 | 2 | 0 | 25 | 2 | 13 + 1 | 3 | 0 | 14 | 1 | 14 + 2 | 3 | 0 | 15 | 1 | 15 + 3 | 3 | 0 | 16 | 1 | 16 + 3 | 4 | 0 | 17 | 1 | 17 + 4 | 1 | 0 | 37 | 2 | 19 + | | 3 | 21 | 2 | 11 + | | 3 | 21 | 2 | 11 + | | 3 | 25 | 2 | 13 + | | 3 | 25 | 2 | 13 + | | 3 | 14 | 1 | 14 + | | 3 | 14 | 1 | 14 + | | 3 | 15 | 1 | 15 + | | 3 | 15 | 1 | 15 + | | 3 | 16 | 1 | 16 + | | 3 | 16 | 1 | 16 + | | 3 | 17 | 1 | 17 + | | 3 | 17 | 1 | 17 + | | 3 | 37 | 2 | 19 + | | 3 | 37 | 2 | 19 +(21 rows) + +select(select (select grouping(a,b) from (values (1)) v2(c)) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY ROLLUP((e+1),(f+1)); + grouping +---------- + 0 + 0 + 0 +(3 rows) + +select(select (select grouping(a,b) from (values (1)) v2(c)) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY CUBE((e+1),(f+1)) ORDER BY (e+1),(f+1); + grouping +---------- + 0 + 0 + 0 + 0 +(4 rows) + +select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum + from gstest2 group by cube (a,b) order by rsum, a, b; + a | b | sum | rsum +---+---+-----+------ + 1 | 1 | 8 | 8 + 1 | 2 | 2 | 10 + 1 | | 10 | 20 + 2 | 2 | 2 | 22 + 2 | | 2 | 24 + | 1 | 8 | 32 + | 2 | 4 | 36 + | | 12 | 48 +(8 rows) + +select a, b, sum(c) from (values (1,1,10),(1,1,11),(1,2,12),(1,2,13),(1,3,14),(2,3,15),(3,3,16),(3,4,17),(4,1,18),(4,1,19)) v(a,b,c) group by rollup (a,b); + a | b | sum +---+---+----- + 1 | 1 | 21 + 1 | 2 | 25 + 1 | 3 | 14 + 1 | | 60 + 2 | 3 | 15 + 2 | | 15 + 3 | 3 | 16 + 3 | 4 | 17 + 3 | | 33 + 4 | 1 | 37 + 4 | | 37 + | | 145 +(12 rows) + +select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by cube (a,b) order by a,b; + a | b | sum +---+---+----- + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | | 3 + 2 | 1 | 2 + 2 | 2 | 2 + 2 | 3 | 2 + 2 | | 6 + | 1 | 3 + | 2 | 3 + | 3 | 3 + | | 9 +(12 rows) + +-- Test reordering of grouping sets +explain (costs off) +select * from gstest1 group by grouping sets((a,b,v),(v)) order by v,b,a; + QUERY PLAN +------------------------------------------------------------------------------ + GroupAggregate + Group Key: "*VALUES*".column3, "*VALUES*".column2, "*VALUES*".column1 + Group Key: "*VALUES*".column3 + -> Sort + Sort Key: "*VALUES*".column3, "*VALUES*".column2, "*VALUES*".column1 + -> Values Scan on "*VALUES*" + Optimizer: Postgres query optimizer +(7 rows) + +-- Agg level check. This query should error out. +select (select grouping(a,b) from gstest2) from gstest2 group by a,b; +ERROR: arguments to GROUPING must be grouping expressions of the associated query level +LINE 1: select (select grouping(a,b) from gstest2) from gstest2 grou... + ^ +--Nested queries +select a, b, sum(c), count(*) from gstest2 group by grouping sets (rollup(a,b),a); + a | b | sum | count +---+---+-----+------- + 1 | 1 | 8 | 7 + 1 | 2 | 2 | 1 + 1 | | 10 | 8 + 1 | | 10 | 8 + 2 | 2 | 2 | 1 + 2 | | 2 | 1 + 2 | | 2 | 1 + | | 12 | 9 +(8 rows) + +-- HAVING queries +select ten, sum(distinct four) from onek a +group by grouping sets((ten,four),(ten)) +having exists (select 1 from onek b where sum(distinct a.four) = b.four); + ten | sum +-----+----- + 0 | 0 + 0 | 2 + 0 | 2 + 1 | 1 + 1 | 3 + 2 | 0 + 2 | 2 + 2 | 2 + 3 | 1 + 3 | 3 + 4 | 0 + 4 | 2 + 4 | 2 + 5 | 1 + 5 | 3 + 6 | 0 + 6 | 2 + 6 | 2 + 7 | 1 + 7 | 3 + 8 | 0 + 8 | 2 + 8 | 2 + 9 | 1 + 9 | 3 +(25 rows) + +-- Tests around pushdown of HAVING clauses, partially testing against previous bugs +select a,count(*) from gstest2 group by rollup(a) order by a; + a | count +---+------- + 1 | 8 + 2 | 1 + | 9 +(3 rows) + +select a,count(*) from gstest2 group by rollup(a) having a is distinct from 1 order by a; + a | count +---+------- + 2 | 1 + | 9 +(2 rows) + +explain (costs off) + select a,count(*) from gstest2 group by rollup(a) having a is distinct from 1 order by a; + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: a + Group Key: () + Filter: (a IS DISTINCT FROM 1) + -> Sort + Sort Key: a + -> Seq Scan on gstest2 + Optimizer: Postgres query optimizer +(8 rows) + +select v.c, (select count(*) from gstest2 group by () having v.c) + from (values (false),(true)) v(c) order by v.c; + c | count +---+------- + f | + t | 9 +(2 rows) + +explain (costs off) + select v.c, (select count(*) from gstest2 group by () having v.c) + from (values (false),(true)) v(c) order by v.c; + QUERY PLAN +----------------------------------------------------------- + Sort + Sort Key: "*VALUES*".column1 + -> Values Scan on "*VALUES*" + SubPlan 1 + -> Aggregate + Group Key: () + Filter: "*VALUES*".column1 + -> Result + One-Time Filter: "*VALUES*".column1 + -> Seq Scan on gstest2 + Optimizer: Postgres query optimizer +(11 rows) + +-- HAVING with GROUPING queries +select ten, grouping(ten) from onek +group by grouping sets(ten) having grouping(ten) >= 0 +order by 2,1; + ten | grouping +-----+---------- + 0 | 0 + 1 | 0 + 2 | 0 + 3 | 0 + 4 | 0 + 5 | 0 + 6 | 0 + 7 | 0 + 8 | 0 + 9 | 0 +(10 rows) + +select ten, grouping(ten) from onek +group by grouping sets(ten, four) having grouping(ten) > 0 +order by 2,1; + ten | grouping +-----+---------- + | 1 + | 1 + | 1 + | 1 +(4 rows) + +select ten, grouping(ten) from onek +group by rollup(ten) having grouping(ten) > 0 +order by 2,1; + ten | grouping +-----+---------- + | 1 +(1 row) + +select ten, grouping(ten) from onek +group by cube(ten) having grouping(ten) > 0 +order by 2,1; + ten | grouping +-----+---------- + | 1 +(1 row) + +select ten, grouping(ten) from onek +group by (ten) having grouping(ten) >= 0 +order by 2,1; + ten | grouping +-----+---------- + 0 | 0 + 1 | 0 + 2 | 0 + 3 | 0 + 4 | 0 + 5 | 0 + 6 | 0 + 7 | 0 + 8 | 0 + 9 | 0 +(10 rows) + +-- FILTER queries +select ten, sum(distinct four) filter (where four::text ~ '123') from onek a +group by rollup(ten); + ten | sum +-----+----- + 0 | + 1 | + 2 | + 3 | + 4 | + 5 | + 6 | + 7 | + 8 | + 9 | + | +(11 rows) + +-- More rescan tests +-- start_ignore +-- GPDB_95_MERGE_FIXME: the lateral query with grouping sets do not make right plans +select * from (values (1),(2)) v(a) left join lateral (select v.a, four, ten, count(*) from onek group by cube(four,ten)) s on true order by v.a,four,ten; + a | a | four | ten | count +---+---+------+-----+------- + 1 | 1 | 0 | 0 | 50 + 1 | 1 | 0 | 2 | 50 + 1 | 1 | 0 | 4 | 50 + 1 | 1 | 0 | 6 | 50 + 1 | 1 | 0 | 8 | 50 + 1 | 1 | 0 | | 250 + 1 | 1 | 1 | 1 | 50 + 1 | 1 | 1 | 3 | 50 + 1 | 1 | 1 | 5 | 50 + 1 | 1 | 1 | 7 | 50 + 1 | 1 | 1 | 9 | 50 + 1 | 1 | 1 | | 250 + 1 | 1 | 2 | 0 | 50 + 1 | 1 | 2 | 2 | 50 + 1 | 1 | 2 | 4 | 50 + 1 | 1 | 2 | 6 | 50 + 1 | 1 | 2 | 8 | 50 + 1 | 1 | 2 | | 250 + 1 | 1 | 3 | 1 | 50 + 1 | 1 | 3 | 3 | 50 + 1 | 1 | 3 | 5 | 50 + 1 | 1 | 3 | 7 | 50 + 1 | 1 | 3 | 9 | 50 + 1 | 1 | 3 | | 250 + 1 | 1 | | 0 | 100 + 1 | 1 | | 1 | 100 + 1 | 1 | | 2 | 100 + 1 | 1 | | 3 | 100 + 1 | 1 | | 4 | 100 + 1 | 1 | | 5 | 100 + 1 | 1 | | 6 | 100 + 1 | 1 | | 7 | 100 + 1 | 1 | | 8 | 100 + 1 | 1 | | 9 | 100 + 1 | 1 | | | 1000 + 2 | 2 | 0 | 0 | 50 + 2 | 2 | 0 | 2 | 50 + 2 | 2 | 0 | 4 | 50 + 2 | 2 | 0 | 6 | 50 + 2 | 2 | 0 | 8 | 50 + 2 | 2 | 0 | | 250 + 2 | 2 | 1 | 1 | 50 + 2 | 2 | 1 | 3 | 50 + 2 | 2 | 1 | 5 | 50 + 2 | 2 | 1 | 7 | 50 + 2 | 2 | 1 | 9 | 50 + 2 | 2 | 1 | | 250 + 2 | 2 | 2 | 0 | 50 + 2 | 2 | 2 | 2 | 50 + 2 | 2 | 2 | 4 | 50 + 2 | 2 | 2 | 6 | 50 + 2 | 2 | 2 | 8 | 50 + 2 | 2 | 2 | | 250 + 2 | 2 | 3 | 1 | 50 + 2 | 2 | 3 | 3 | 50 + 2 | 2 | 3 | 5 | 50 + 2 | 2 | 3 | 7 | 50 + 2 | 2 | 3 | 9 | 50 + 2 | 2 | 3 | | 250 + 2 | 2 | | 0 | 100 + 2 | 2 | | 1 | 100 + 2 | 2 | | 2 | 100 + 2 | 2 | | 3 | 100 + 2 | 2 | | 4 | 100 + 2 | 2 | | 5 | 100 + 2 | 2 | | 6 | 100 + 2 | 2 | | 7 | 100 + 2 | 2 | | 8 | 100 + 2 | 2 | | 9 | 100 + 2 | 2 | | | 1000 +(70 rows) + +-- end_ignore +select array(select row(v.a,s1.*) from (select two,four, count(*) from onek group by cube(two,four) order by two,four) s1) from (values (1),(2)) v(a); + array +------------------------------------------------------------------------------------------------------------------------------------------------------ + {"(1,0,0,250)","(1,0,2,250)","(1,0,,500)","(1,1,1,250)","(1,1,3,250)","(1,1,,500)","(1,,0,250)","(1,,1,250)","(1,,2,250)","(1,,3,250)","(1,,,1000)"} + {"(2,0,0,250)","(2,0,2,250)","(2,0,,500)","(2,1,1,250)","(2,1,3,250)","(2,1,,500)","(2,,0,250)","(2,,1,250)","(2,,2,250)","(2,,3,250)","(2,,,1000)"} +(2 rows) + +-- Grouping on text columns +select sum(ten) from onek group by two, rollup(four::text) order by 1; + sum +------ + 1000 + 1000 + 1250 + 1250 + 2000 + 2500 +(6 rows) + +select sum(ten) from onek group by rollup(four::text), two order by 1; + sum +------ + 1000 + 1000 + 1250 + 1250 + 2000 + 2500 +(6 rows) + +-- hashing support +set enable_hashagg = true; +-- failure cases +select count(*) from gstest4 group by rollup(unhashable_col,unsortable_col); +ERROR: could not implement GROUP BY +DETAIL: Some of the datatypes only support hashing, while others only support sorting. +select array_agg(v order by v) from gstest4 group by grouping sets ((id,unsortable_col),(id)); +ERROR: could not implement GROUP BY +DETAIL: Some of the datatypes only support hashing, while others only support sorting. +-- simple cases +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a),(b)) order by 3,1,2; + a | b | grouping | sum | count | max +---+---+----------+-----+-------+----- + 1 | | 1 | 60 | 5 | 14 + 2 | | 1 | 15 | 1 | 15 + 3 | | 1 | 33 | 2 | 17 + 4 | | 1 | 37 | 2 | 19 + | 1 | 2 | 58 | 4 | 19 + | 2 | 2 | 25 | 2 | 13 + | 3 | 2 | 45 | 3 | 16 + | 4 | 2 | 17 | 1 | 17 +(8 rows) + +explain (costs off) select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a),(b)) order by 3,1,2; + QUERY PLAN +-------------------------------------------------------------------------------------------------------- + Sort + Sort Key: (GROUPING("*VALUES*".column1, "*VALUES*".column2)), "*VALUES*".column1, "*VALUES*".column2 + -> HashAggregate + Hash Key: "*VALUES*".column1 + Hash Key: "*VALUES*".column2 + -> Values Scan on "*VALUES*" + Optimizer: Postgres query optimizer +(7 rows) + +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by cube(a,b) order by 3,1,2; + a | b | grouping | sum | count | max +---+---+----------+-----+-------+----- + 1 | 1 | 0 | 21 | 2 | 11 + 1 | 2 | 0 | 25 | 2 | 13 + 1 | 3 | 0 | 14 | 1 | 14 + 2 | 3 | 0 | 15 | 1 | 15 + 3 | 3 | 0 | 16 | 1 | 16 + 3 | 4 | 0 | 17 | 1 | 17 + 4 | 1 | 0 | 37 | 2 | 19 + 1 | | 1 | 60 | 5 | 14 + 2 | | 1 | 15 | 1 | 15 + 3 | | 1 | 33 | 2 | 17 + 4 | | 1 | 37 | 2 | 19 + | 1 | 2 | 58 | 4 | 19 + | 2 | 2 | 25 | 2 | 13 + | 3 | 2 | 45 | 3 | 16 + | 4 | 2 | 17 | 1 | 17 + | | 3 | 145 | 10 | 19 +(16 rows) + +explain (costs off) select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by cube(a,b) order by 3,1,2; + QUERY PLAN +-------------------------------------------------------------------------------------------------------- + Sort + Sort Key: (GROUPING("*VALUES*".column1, "*VALUES*".column2)), "*VALUES*".column1, "*VALUES*".column2 + -> MixedAggregate + Hash Key: "*VALUES*".column1, "*VALUES*".column2 + Hash Key: "*VALUES*".column1 + Hash Key: "*VALUES*".column2 + Group Key: () + -> Values Scan on "*VALUES*" + Optimizer: Postgres query optimizer +(9 rows) + +-- shouldn't try and hash +explain (costs off) + select a, b, grouping(a,b), array_agg(v order by v) + from gstest1 group by cube(a,b); + QUERY PLAN +---------------------------------------------------------- + GroupAggregate + Group Key: "*VALUES*".column1, "*VALUES*".column2 + Group Key: "*VALUES*".column1 + Group Key: () + Sort Key: "*VALUES*".column2 + Group Key: "*VALUES*".column2 + -> Sort + Sort Key: "*VALUES*".column1, "*VALUES*".column2 + -> Values Scan on "*VALUES*" + Optimizer: Postgres query optimizer +(10 rows) + +-- unsortable cases +select unsortable_col, count(*) + from gstest4 group by grouping sets ((unsortable_col),(unsortable_col)) + order by unsortable_col::text; + unsortable_col | count +----------------+------- + 1 | 4 + 1 | 4 + 2 | 4 + 2 | 4 +(4 rows) + +-- mixed hashable/sortable cases +select unhashable_col, unsortable_col, + grouping(unhashable_col, unsortable_col), + count(*), sum(v) + from gstest4 group by grouping sets ((unhashable_col),(unsortable_col)) + order by 3, 5; + unhashable_col | unsortable_col | grouping | count | sum +----------------+----------------+----------+-------+----- + 0000 | | 1 | 2 | 17 + 0001 | | 1 | 2 | 34 + 0010 | | 1 | 2 | 68 + 0011 | | 1 | 2 | 136 + | 2 | 2 | 4 | 60 + | 1 | 2 | 4 | 195 +(6 rows) + +explain (costs off) + select unhashable_col, unsortable_col, + grouping(unhashable_col, unsortable_col), + count(*), sum(v) + from gstest4 group by grouping sets ((unhashable_col),(unsortable_col)) + order by 3,5; + QUERY PLAN +------------------------------------------------------------------ + Sort + Sort Key: (GROUPING(unhashable_col, unsortable_col)), (sum(v)) + -> MixedAggregate + Hash Key: unsortable_col + Group Key: unhashable_col + -> Sort + Sort Key: unhashable_col + -> Seq Scan on gstest4 + Optimizer: Postgres query optimizer +(9 rows) + +select unhashable_col, unsortable_col, + grouping(unhashable_col, unsortable_col), + count(*), sum(v) + from gstest4 group by grouping sets ((v,unhashable_col),(v,unsortable_col)) + order by 3,5; + unhashable_col | unsortable_col | grouping | count | sum +----------------+----------------+----------+-------+----- + 0000 | | 1 | 1 | 1 + 0001 | | 1 | 1 | 2 + 0010 | | 1 | 1 | 4 + 0011 | | 1 | 1 | 8 + 0000 | | 1 | 1 | 16 + 0001 | | 1 | 1 | 32 + 0010 | | 1 | 1 | 64 + 0011 | | 1 | 1 | 128 + | 1 | 2 | 1 | 1 + | 1 | 2 | 1 | 2 + | 2 | 2 | 1 | 4 + | 2 | 2 | 1 | 8 + | 2 | 2 | 1 | 16 + | 2 | 2 | 1 | 32 + | 1 | 2 | 1 | 64 + | 1 | 2 | 1 | 128 +(16 rows) + +explain (costs off) + select unhashable_col, unsortable_col, + grouping(unhashable_col, unsortable_col), + count(*), sum(v) + from gstest4 group by grouping sets ((v,unhashable_col),(v,unsortable_col)) + order by 3,5; + QUERY PLAN +------------------------------------------------------------------ + Sort + Sort Key: (GROUPING(unhashable_col, unsortable_col)), (sum(v)) + -> MixedAggregate + Hash Key: v, unsortable_col + Group Key: v, unhashable_col + -> Sort + Sort Key: v, unhashable_col + -> Seq Scan on gstest4 + Optimizer: Postgres query optimizer +(9 rows) + +-- empty input: first is 0 rows, second 1, third 3 etc. +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); + a | b | sum | count +---+---+-----+------- +(0 rows) + +explain (costs off) + select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); + QUERY PLAN +------------------------------------- + HashAggregate + Hash Key: a, b + Hash Key: a + -> Seq Scan on gstest_empty + Optimizer: Postgres query optimizer +(5 rows) + +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),()); + a | b | sum | count +---+---+-----+------- + | | | 0 +(1 row) + +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),(),(),()); + a | b | sum | count +---+---+-----+------- + | | | 0 + | | | 0 + | | | 0 +(3 rows) + +explain (costs off) + select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),(),(),()); + QUERY PLAN +------------------------------------- + MixedAggregate + Hash Key: a, b + Group Key: () + Group Key: () + Group Key: () + -> Seq Scan on gstest_empty + Optimizer: Postgres query optimizer +(7 rows) + +select sum(v), count(*) from gstest_empty group by grouping sets ((),(),()); + sum | count +-----+------- + | 0 + | 0 + | 0 +(3 rows) + +explain (costs off) + select sum(v), count(*) from gstest_empty group by grouping sets ((),(),()); + QUERY PLAN +------------------------------------- + Aggregate + Group Key: () + Group Key: () + Group Key: () + -> Seq Scan on gstest_empty + Optimizer: Postgres query optimizer +(6 rows) + +-- check that functionally dependent cols are not nulled +select a, d, grouping(a,b,c) + from gstest3 + group by grouping sets ((a,b), (a,c)); + a | d | grouping +---+---+---------- + 1 | 1 | 1 + 2 | 2 | 1 + 1 | 1 | 2 + 2 | 2 | 2 +(4 rows) + +explain (costs off) + select a, d, grouping(a,b,c) + from gstest3 + group by grouping sets ((a,b), (a,c)); + QUERY PLAN +------------------------------------- + HashAggregate + Hash Key: a, b + Hash Key: a, c + -> Seq Scan on gstest3 + Optimizer: Postgres query optimizer +(5 rows) + +-- simple rescan tests +select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by grouping sets (a,b) + order by 1, 2, 3; + a | b | sum +---+---+----- + 1 | | 3 + 2 | | 6 + | 1 | 3 + | 2 | 3 + | 3 | 3 +(5 rows) + +explain (costs off) + select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by grouping sets (a,b) + order by 3, 1, 2; + QUERY PLAN +--------------------------------------------------------------------- + Sort + Sort Key: (sum("*VALUES*".column1)), gstest_data.a, gstest_data.b + -> HashAggregate + Hash Key: gstest_data.a + Hash Key: gstest_data.b + -> Nested Loop + -> Values Scan on "*VALUES*" + -> Function Scan on gstest_data + Optimizer: Postgres query optimizer +(9 rows) + +select * + from (values (1),(2)) v(x), + lateral (select a, b, sum(v.x) from gstest_data(v.x) group by grouping sets (a,b)) s; +ERROR: aggregate functions are not allowed in FROM clause of their own query level +LINE 3: lateral (select a, b, sum(v.x) from gstest_data(v.x) ... + ^ +explain (costs off) + select * + from (values (1),(2)) v(x), + lateral (select a, b, sum(v.x) from gstest_data(v.x) group by grouping sets (a,b)) s; +ERROR: aggregate functions are not allowed in FROM clause of their own query level +LINE 4: lateral (select a, b, sum(v.x) from gstest_data(v.x... + ^ +-- Tests for chained aggregates +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a,b),(a+1,b+1),(a+2,b+2)) order by 3,6; + a | b | grouping | sum | count | max +---+---+----------+-----+-------+----- + 1 | 1 | 0 | 21 | 2 | 11 + 1 | 2 | 0 | 25 | 2 | 13 + 1 | 3 | 0 | 14 | 1 | 14 + 2 | 3 | 0 | 15 | 1 | 15 + 3 | 3 | 0 | 16 | 1 | 16 + 3 | 4 | 0 | 17 | 1 | 17 + 4 | 1 | 0 | 37 | 2 | 19 + | | 3 | 21 | 2 | 11 + | | 3 | 21 | 2 | 11 + | | 3 | 25 | 2 | 13 + | | 3 | 25 | 2 | 13 + | | 3 | 14 | 1 | 14 + | | 3 | 14 | 1 | 14 + | | 3 | 15 | 1 | 15 + | | 3 | 15 | 1 | 15 + | | 3 | 16 | 1 | 16 + | | 3 | 16 | 1 | 16 + | | 3 | 17 | 1 | 17 + | | 3 | 17 | 1 | 17 + | | 3 | 37 | 2 | 19 + | | 3 | 37 | 2 | 19 +(21 rows) + +explain (costs off) + select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a,b),(a+1,b+1),(a+2,b+2)) order by 3,6; + QUERY PLAN +------------------------------------------------------------------------------------------- + Sort + Sort Key: (GROUPING("*VALUES*".column1, "*VALUES*".column2)), (max("*VALUES*".column3)) + -> HashAggregate + Hash Key: "*VALUES*".column1, "*VALUES*".column2 + Hash Key: ("*VALUES*".column1 + 1), ("*VALUES*".column2 + 1) + Hash Key: ("*VALUES*".column1 + 2), ("*VALUES*".column2 + 2) + -> Values Scan on "*VALUES*" + Optimizer: Postgres query optimizer +(8 rows) + +select a, b, sum(c), sum(d), sum(e), sum(sum(c)) over (order by a,b) as rsum + from gstest2 group by cube (a,b) order by rsum, a, b; + a | b | sum | sum | sum | rsum +---+---+-----+-----+-----+------ + 1 | 1 | 8 | 9 | 10 | 8 + 1 | 2 | 2 | 2 | 2 | 10 + 1 | | 10 | 11 | 12 | 20 + 2 | 2 | 2 | 2 | 2 | 22 + 2 | | 2 | 2 | 2 | 24 + | 1 | 8 | 9 | 10 | 32 + | 2 | 4 | 4 | 4 | 36 + | | 12 | 13 | 14 | 48 +(8 rows) + +explain (costs off) + select a, b, sum(c), sum(d), sum(e), sum(sum(c)) over (order by a,b) as rsum + from gstest2 group by cube (a,b) order by rsum, a, b; + QUERY PLAN +--------------------------------------------- + Sort + Sort Key: (sum((sum(c))) OVER (?)), a, b + -> WindowAgg + Order By: a, b + -> Sort + Sort Key: a, b + -> MixedAggregate + Hash Key: a, b + Hash Key: a + Hash Key: b + Group Key: () + -> Seq Scan on gstest2 + Optimizer: Postgres query optimizer +(13 rows) + +select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by cube (a,b) order by a,b; + a | b | sum +---+---+----- + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | | 3 + 2 | 1 | 2 + 2 | 2 | 2 + 2 | 3 | 2 + 2 | | 6 + | 1 | 3 + | 2 | 3 + | 3 | 3 + | | 9 +(12 rows) + +explain (costs off) + select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by cube (a,b) order by a,b; + QUERY PLAN +------------------------------------------------ + Sort + Sort Key: gstest_data.a, gstest_data.b + -> MixedAggregate + Hash Key: gstest_data.a, gstest_data.b + Hash Key: gstest_data.a + Hash Key: gstest_data.b + Group Key: () + -> Nested Loop + -> Values Scan on "*VALUES*" + -> Function Scan on gstest_data + Optimizer: Postgres query optimizer +(11 rows) + +-- Verify that we correctly handle the child node returning a +-- non-minimal slot, which happens if the input is pre-sorted, +-- e.g. due to an index scan. +BEGIN; +SET LOCAL enable_hashagg = false; +EXPLAIN (COSTS OFF) SELECT a, b, count(*), max(a), max(b) FROM gstest3 GROUP BY GROUPING SETS(a, b,()) ORDER BY a, b; + QUERY PLAN +--------------------------------------- + Sort + Sort Key: a, b + -> GroupAggregate + Group Key: a + Group Key: () + Sort Key: b + Group Key: b + -> Sort + Sort Key: a + -> Seq Scan on gstest3 + Optimizer: Postgres query optimizer +(11 rows) + +SELECT a, b, count(*), max(a), max(b) FROM gstest3 GROUP BY GROUPING SETS(a, b,()) ORDER BY a, b; + a | b | count | max | max +---+---+-------+-----+----- + 1 | | 1 | 1 | 1 + 2 | | 1 | 2 | 2 + | 1 | 1 | 1 | 1 + | 2 | 1 | 2 | 2 + | | 2 | 2 | 2 +(5 rows) + +SET LOCAL enable_seqscan = false; +EXPLAIN (COSTS OFF) SELECT a, b, count(*), max(a), max(b) FROM gstest3 GROUP BY GROUPING SETS(a, b,()) ORDER BY a, b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: a, b + -> GroupAggregate + Group Key: a + Group Key: () + Sort Key: b + Group Key: b + -> Index Scan using gstest3_pkey on gstest3 + Optimizer: Postgres query optimizer +(9 rows) + +SELECT a, b, count(*), max(a), max(b) FROM gstest3 GROUP BY GROUPING SETS(a, b,()) ORDER BY a, b; + a | b | count | max | max +---+---+-------+-----+----- + 1 | | 1 | 1 | 1 + 2 | | 1 | 2 | 2 + | 1 | 1 | 1 | 1 + | 2 | 1 | 2 | 2 + | | 2 | 2 | 2 +(5 rows) + +COMMIT; +-- More rescan tests +-- start_ignore +-- GPDB_95_MERGE_FIXME: the lateral query with grouping sets do not make right plans +select * from (values (1),(2)) v(a) left join lateral (select v.a, four, ten, count(*) from onek group by cube(four,ten)) s on true order by v.a,four,ten; + a | a | four | ten | count +---+---+------+-----+------- + 1 | 1 | 0 | 0 | 50 + 1 | 1 | 0 | 2 | 50 + 1 | 1 | 0 | 4 | 50 + 1 | 1 | 0 | 6 | 50 + 1 | 1 | 0 | 8 | 50 + 1 | 1 | 0 | | 250 + 1 | 1 | 1 | 1 | 50 + 1 | 1 | 1 | 3 | 50 + 1 | 1 | 1 | 5 | 50 + 1 | 1 | 1 | 7 | 50 + 1 | 1 | 1 | 9 | 50 + 1 | 1 | 1 | | 250 + 1 | 1 | 2 | 0 | 50 + 1 | 1 | 2 | 2 | 50 + 1 | 1 | 2 | 4 | 50 + 1 | 1 | 2 | 6 | 50 + 1 | 1 | 2 | 8 | 50 + 1 | 1 | 2 | | 250 + 1 | 1 | 3 | 1 | 50 + 1 | 1 | 3 | 3 | 50 + 1 | 1 | 3 | 5 | 50 + 1 | 1 | 3 | 7 | 50 + 1 | 1 | 3 | 9 | 50 + 1 | 1 | 3 | | 250 + 1 | 1 | | 0 | 100 + 1 | 1 | | 1 | 100 + 1 | 1 | | 2 | 100 + 1 | 1 | | 3 | 100 + 1 | 1 | | 4 | 100 + 1 | 1 | | 5 | 100 + 1 | 1 | | 6 | 100 + 1 | 1 | | 7 | 100 + 1 | 1 | | 8 | 100 + 1 | 1 | | 9 | 100 + 1 | 1 | | | 1000 + 2 | 2 | 0 | 0 | 50 + 2 | 2 | 0 | 2 | 50 + 2 | 2 | 0 | 4 | 50 + 2 | 2 | 0 | 6 | 50 + 2 | 2 | 0 | 8 | 50 + 2 | 2 | 0 | | 250 + 2 | 2 | 1 | 1 | 50 + 2 | 2 | 1 | 3 | 50 + 2 | 2 | 1 | 5 | 50 + 2 | 2 | 1 | 7 | 50 + 2 | 2 | 1 | 9 | 50 + 2 | 2 | 1 | | 250 + 2 | 2 | 2 | 0 | 50 + 2 | 2 | 2 | 2 | 50 + 2 | 2 | 2 | 4 | 50 + 2 | 2 | 2 | 6 | 50 + 2 | 2 | 2 | 8 | 50 + 2 | 2 | 2 | | 250 + 2 | 2 | 3 | 1 | 50 + 2 | 2 | 3 | 3 | 50 + 2 | 2 | 3 | 5 | 50 + 2 | 2 | 3 | 7 | 50 + 2 | 2 | 3 | 9 | 50 + 2 | 2 | 3 | | 250 + 2 | 2 | | 0 | 100 + 2 | 2 | | 1 | 100 + 2 | 2 | | 2 | 100 + 2 | 2 | | 3 | 100 + 2 | 2 | | 4 | 100 + 2 | 2 | | 5 | 100 + 2 | 2 | | 6 | 100 + 2 | 2 | | 7 | 100 + 2 | 2 | | 8 | 100 + 2 | 2 | | 9 | 100 + 2 | 2 | | | 1000 +(70 rows) + +-- end_ignore +select array(select row(v.a,s1.*) from (select two,four, count(*) from onek group by cube(two,four) order by two,four) s1) from (values (1),(2)) v(a); + array +------------------------------------------------------------------------------------------------------------------------------------------------------ + {"(1,0,0,250)","(1,0,2,250)","(1,0,,500)","(1,1,1,250)","(1,1,3,250)","(1,1,,500)","(1,,0,250)","(1,,1,250)","(1,,2,250)","(1,,3,250)","(1,,,1000)"} + {"(2,0,0,250)","(2,0,2,250)","(2,0,,500)","(2,1,1,250)","(2,1,3,250)","(2,1,,500)","(2,,0,250)","(2,,1,250)","(2,,2,250)","(2,,3,250)","(2,,,1000)"} +(2 rows) + +-- Rescan logic changes when there are no empty grouping sets, so test +-- that too: +select * from (values (1),(2)) v(a) left join lateral (select v.a, four, ten, count(*) from onek group by grouping sets(four,ten)) s on true order by v.a,four,ten; + a | a | four | ten | count +---+---+------+-----+------- + 1 | 1 | 0 | | 250 + 1 | 1 | 1 | | 250 + 1 | 1 | 2 | | 250 + 1 | 1 | 3 | | 250 + 1 | 1 | | 0 | 100 + 1 | 1 | | 1 | 100 + 1 | 1 | | 2 | 100 + 1 | 1 | | 3 | 100 + 1 | 1 | | 4 | 100 + 1 | 1 | | 5 | 100 + 1 | 1 | | 6 | 100 + 1 | 1 | | 7 | 100 + 1 | 1 | | 8 | 100 + 1 | 1 | | 9 | 100 + 2 | 2 | 0 | | 250 + 2 | 2 | 1 | | 250 + 2 | 2 | 2 | | 250 + 2 | 2 | 3 | | 250 + 2 | 2 | | 0 | 100 + 2 | 2 | | 1 | 100 + 2 | 2 | | 2 | 100 + 2 | 2 | | 3 | 100 + 2 | 2 | | 4 | 100 + 2 | 2 | | 5 | 100 + 2 | 2 | | 6 | 100 + 2 | 2 | | 7 | 100 + 2 | 2 | | 8 | 100 + 2 | 2 | | 9 | 100 +(28 rows) + +select array(select row(v.a,s1.*) from (select two,four, count(*) from onek group by grouping sets(two,four) order by two,four) s1) from (values (1),(2)) v(a); + array +--------------------------------------------------------------------------------- + {"(1,0,,500)","(1,1,,500)","(1,,0,250)","(1,,1,250)","(1,,2,250)","(1,,3,250)"} + {"(2,0,,500)","(2,1,,500)","(2,,0,250)","(2,,1,250)","(2,,2,250)","(2,,3,250)"} +(2 rows) + +-- test the knapsack +set enable_indexscan = false; +set work_mem = '64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +explain (costs off) + select unique1, + count(two), count(four), count(ten), + count(hundred), count(thousand), count(twothousand), + count(*) + from tenk1 group by grouping sets (unique1,twothousand,thousand,hundred,ten,four,two); + QUERY PLAN +------------------------------------- + MixedAggregate + Hash Key: two + Hash Key: four + Hash Key: ten + Hash Key: hundred + Group Key: unique1 + Sort Key: twothousand + Group Key: twothousand + Sort Key: thousand + Group Key: thousand + -> Sort + Sort Key: unique1 + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(14 rows) + +explain (costs off) + select unique1, + count(two), count(four), count(ten), + count(hundred), count(thousand), count(twothousand), + count(*) + from tenk1 group by grouping sets (unique1,hundred,ten,four,two); + QUERY PLAN +------------------------------------- + MixedAggregate + Hash Key: two + Hash Key: four + Hash Key: ten + Hash Key: hundred + Group Key: unique1 + -> Sort + Sort Key: unique1 + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(10 rows) + +set work_mem = '384kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +explain (costs off) + select unique1, + count(two), count(four), count(ten), + count(hundred), count(thousand), count(twothousand), + count(*) + from tenk1 group by grouping sets (unique1,twothousand,thousand,hundred,ten,four,two); + QUERY PLAN +------------------------------------- + MixedAggregate + Hash Key: two + Hash Key: four + Hash Key: ten + Hash Key: hundred + Hash Key: thousand + Group Key: unique1 + Sort Key: twothousand + Group Key: twothousand + -> Sort + Sort Key: unique1 + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(13 rows) + +-- check collation-sensitive matching between grouping expressions +-- (similar to a check for aggregates, but there are additional code +-- paths for GROUPING, so check again here) +select v||'a', case grouping(v||'a') when 1 then 1 else 0 end, count(*) + from unnest(array[1,1], array['a','b']) u(i,v) + group by rollup(i, v||'a') order by 1,3; + ?column? | case | count +----------+------+------- + aa | 0 | 1 + ba | 0 | 1 + | 1 | 2 + | 1 | 2 +(4 rows) + +select v||'a', case when grouping(v||'a') = 1 then 1 else 0 end, count(*) + from unnest(array[1,1], array['a','b']) u(i,v) + group by rollup(i, v||'a') order by 1,3; + ?column? | case | count +----------+------+------- + aa | 0 | 1 + ba | 0 | 1 + | 1 | 2 + | 1 | 2 +(4 rows) + +-- Bug #16784 +create table bug_16784(i int, j int); +analyze bug_16784; +alter table bug_16784 set (autovacuum_enabled = 'false'); +WARNING: autovacuum is not supported in Cloudberry +update pg_class set reltuples = 10 where relname='bug_16784'; +ERROR: permission denied: "pg_class" is a system catalog +insert into bug_16784 select g/10, g from generate_series(1,40) g; +set work_mem='64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set enable_sort = false; +select * from + (values (1),(2)) v(a), + lateral (select a, i, j, count(*) from + bug_16784 group by cube(i,j)) s + order by v.a, i, j; + a | a | i | j | count +---+---+---+----+------- + 1 | 1 | 0 | 1 | 1 + 1 | 1 | 0 | 2 | 1 + 1 | 1 | 0 | 3 | 1 + 1 | 1 | 0 | 4 | 1 + 1 | 1 | 0 | 5 | 1 + 1 | 1 | 0 | 6 | 1 + 1 | 1 | 0 | 7 | 1 + 1 | 1 | 0 | 8 | 1 + 1 | 1 | 0 | 9 | 1 + 1 | 1 | 0 | | 9 + 1 | 1 | 1 | 10 | 1 + 1 | 1 | 1 | 11 | 1 + 1 | 1 | 1 | 12 | 1 + 1 | 1 | 1 | 13 | 1 + 1 | 1 | 1 | 14 | 1 + 1 | 1 | 1 | 15 | 1 + 1 | 1 | 1 | 16 | 1 + 1 | 1 | 1 | 17 | 1 + 1 | 1 | 1 | 18 | 1 + 1 | 1 | 1 | 19 | 1 + 1 | 1 | 1 | | 10 + 1 | 1 | 2 | 20 | 1 + 1 | 1 | 2 | 21 | 1 + 1 | 1 | 2 | 22 | 1 + 1 | 1 | 2 | 23 | 1 + 1 | 1 | 2 | 24 | 1 + 1 | 1 | 2 | 25 | 1 + 1 | 1 | 2 | 26 | 1 + 1 | 1 | 2 | 27 | 1 + 1 | 1 | 2 | 28 | 1 + 1 | 1 | 2 | 29 | 1 + 1 | 1 | 2 | | 10 + 1 | 1 | 3 | 30 | 1 + 1 | 1 | 3 | 31 | 1 + 1 | 1 | 3 | 32 | 1 + 1 | 1 | 3 | 33 | 1 + 1 | 1 | 3 | 34 | 1 + 1 | 1 | 3 | 35 | 1 + 1 | 1 | 3 | 36 | 1 + 1 | 1 | 3 | 37 | 1 + 1 | 1 | 3 | 38 | 1 + 1 | 1 | 3 | 39 | 1 + 1 | 1 | 3 | | 10 + 1 | 1 | 4 | 40 | 1 + 1 | 1 | 4 | | 1 + 1 | 1 | | 1 | 1 + 1 | 1 | | 2 | 1 + 1 | 1 | | 3 | 1 + 1 | 1 | | 4 | 1 + 1 | 1 | | 5 | 1 + 1 | 1 | | 6 | 1 + 1 | 1 | | 7 | 1 + 1 | 1 | | 8 | 1 + 1 | 1 | | 9 | 1 + 1 | 1 | | 10 | 1 + 1 | 1 | | 11 | 1 + 1 | 1 | | 12 | 1 + 1 | 1 | | 13 | 1 + 1 | 1 | | 14 | 1 + 1 | 1 | | 15 | 1 + 1 | 1 | | 16 | 1 + 1 | 1 | | 17 | 1 + 1 | 1 | | 18 | 1 + 1 | 1 | | 19 | 1 + 1 | 1 | | 20 | 1 + 1 | 1 | | 21 | 1 + 1 | 1 | | 22 | 1 + 1 | 1 | | 23 | 1 + 1 | 1 | | 24 | 1 + 1 | 1 | | 25 | 1 + 1 | 1 | | 26 | 1 + 1 | 1 | | 27 | 1 + 1 | 1 | | 28 | 1 + 1 | 1 | | 29 | 1 + 1 | 1 | | 30 | 1 + 1 | 1 | | 31 | 1 + 1 | 1 | | 32 | 1 + 1 | 1 | | 33 | 1 + 1 | 1 | | 34 | 1 + 1 | 1 | | 35 | 1 + 1 | 1 | | 36 | 1 + 1 | 1 | | 37 | 1 + 1 | 1 | | 38 | 1 + 1 | 1 | | 39 | 1 + 1 | 1 | | 40 | 1 + 1 | 1 | | | 40 + 2 | 2 | 0 | 1 | 1 + 2 | 2 | 0 | 2 | 1 + 2 | 2 | 0 | 3 | 1 + 2 | 2 | 0 | 4 | 1 + 2 | 2 | 0 | 5 | 1 + 2 | 2 | 0 | 6 | 1 + 2 | 2 | 0 | 7 | 1 + 2 | 2 | 0 | 8 | 1 + 2 | 2 | 0 | 9 | 1 + 2 | 2 | 0 | | 9 + 2 | 2 | 1 | 10 | 1 + 2 | 2 | 1 | 11 | 1 + 2 | 2 | 1 | 12 | 1 + 2 | 2 | 1 | 13 | 1 + 2 | 2 | 1 | 14 | 1 + 2 | 2 | 1 | 15 | 1 + 2 | 2 | 1 | 16 | 1 + 2 | 2 | 1 | 17 | 1 + 2 | 2 | 1 | 18 | 1 + 2 | 2 | 1 | 19 | 1 + 2 | 2 | 1 | | 10 + 2 | 2 | 2 | 20 | 1 + 2 | 2 | 2 | 21 | 1 + 2 | 2 | 2 | 22 | 1 + 2 | 2 | 2 | 23 | 1 + 2 | 2 | 2 | 24 | 1 + 2 | 2 | 2 | 25 | 1 + 2 | 2 | 2 | 26 | 1 + 2 | 2 | 2 | 27 | 1 + 2 | 2 | 2 | 28 | 1 + 2 | 2 | 2 | 29 | 1 + 2 | 2 | 2 | | 10 + 2 | 2 | 3 | 30 | 1 + 2 | 2 | 3 | 31 | 1 + 2 | 2 | 3 | 32 | 1 + 2 | 2 | 3 | 33 | 1 + 2 | 2 | 3 | 34 | 1 + 2 | 2 | 3 | 35 | 1 + 2 | 2 | 3 | 36 | 1 + 2 | 2 | 3 | 37 | 1 + 2 | 2 | 3 | 38 | 1 + 2 | 2 | 3 | 39 | 1 + 2 | 2 | 3 | | 10 + 2 | 2 | 4 | 40 | 1 + 2 | 2 | 4 | | 1 + 2 | 2 | | 1 | 1 + 2 | 2 | | 2 | 1 + 2 | 2 | | 3 | 1 + 2 | 2 | | 4 | 1 + 2 | 2 | | 5 | 1 + 2 | 2 | | 6 | 1 + 2 | 2 | | 7 | 1 + 2 | 2 | | 8 | 1 + 2 | 2 | | 9 | 1 + 2 | 2 | | 10 | 1 + 2 | 2 | | 11 | 1 + 2 | 2 | | 12 | 1 + 2 | 2 | | 13 | 1 + 2 | 2 | | 14 | 1 + 2 | 2 | | 15 | 1 + 2 | 2 | | 16 | 1 + 2 | 2 | | 17 | 1 + 2 | 2 | | 18 | 1 + 2 | 2 | | 19 | 1 + 2 | 2 | | 20 | 1 + 2 | 2 | | 21 | 1 + 2 | 2 | | 22 | 1 + 2 | 2 | | 23 | 1 + 2 | 2 | | 24 | 1 + 2 | 2 | | 25 | 1 + 2 | 2 | | 26 | 1 + 2 | 2 | | 27 | 1 + 2 | 2 | | 28 | 1 + 2 | 2 | | 29 | 1 + 2 | 2 | | 30 | 1 + 2 | 2 | | 31 | 1 + 2 | 2 | | 32 | 1 + 2 | 2 | | 33 | 1 + 2 | 2 | | 34 | 1 + 2 | 2 | | 35 | 1 + 2 | 2 | | 36 | 1 + 2 | 2 | | 37 | 1 + 2 | 2 | | 38 | 1 + 2 | 2 | | 39 | 1 + 2 | 2 | | 40 | 1 + 2 | 2 | | | 40 +(172 rows) + +-- +-- Compare results between plans using sorting and plans using hash +-- aggregation. Force spilling in both cases by setting work_mem low +-- and altering the statistics. +-- +create table gs_data_1 as +select g%1000 as g1000, g%100 as g100, g%10 as g10, g + from generate_series(0,1999) g; +analyze gs_data_1; +alter table gs_data_1 set (autovacuum_enabled = 'false'); +WARNING: autovacuum is not supported in Cloudberry +update pg_class set reltuples = 10 where relname='gs_data_1'; +ERROR: permission denied: "pg_class" is a system catalog +set work_mem='64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- Produce results with sorting. +set enable_sort = true; +set enable_hashagg = false; +set jit_above_cost = 0; +explain (costs off) +select g100, g10, sum(g::numeric), count(*), max(g::text) +from gs_data_1 group by cube (g1000, g100,g10); + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: g1000, g100, g10 + Group Key: g1000, g100 + Group Key: g1000 + Group Key: () + Sort Key: g100, g10 + Group Key: g100, g10 + Group Key: g100 + Sort Key: g10, g1000 + Group Key: g10, g1000 + Group Key: g10 + -> Sort + Sort Key: g1000, g100, g10 + -> Seq Scan on gs_data_1 + Optimizer: Postgres query optimizer +(15 rows) + +create table gs_group_1 as +select g100, g10, sum(g::numeric), count(*), max(g::text) +from gs_data_1 group by cube (g1000, g100,g10); +-- Produce results with hash aggregation. +set enable_hashagg = true; +set enable_sort = false; +explain (costs off) +select g100, g10, sum(g::numeric), count(*), max(g::text) +from gs_data_1 group by cube (g1000, g100,g10); + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: g1000, g100, g10 + Group Key: g1000, g100 + Group Key: g1000 + Group Key: () + Sort Key: g100, g10 + Group Key: g100, g10 + Group Key: g100 + Sort Key: g10, g1000 + Group Key: g10, g1000 + Group Key: g10 + -> Sort + Sort Key: g1000, g100, g10 + -> Seq Scan on gs_data_1 + Optimizer: Postgres query optimizer +(15 rows) + +create table gs_hash_1 as +select g100, g10, sum(g::numeric), count(*), max(g::text) +from gs_data_1 group by cube (g1000, g100,g10); +set enable_sort = true; +set work_mem to default; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- GPDB_12_MERGE_FIXME: the following comparison query has an ORCA plan that +-- relies on "IS NOT DISTINCT FROM" Hash Join, a variant that we likely have +-- lost during the merge with upstream Postgres 12. Disable ORCA for this query +SET optimizer TO off; +-- Compare results +(select * from gs_hash_1 except select * from gs_group_1) + union all +(select * from gs_group_1 except select * from gs_hash_1); + g100 | g10 | sum | count | max +------+-----+-----+-------+----- +(0 rows) + +RESET optimizer; +drop table gs_group_1; +drop table gs_hash_1; +-- GROUP BY DISTINCT +-- "normal" behavior... +select a, b, c +from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) +group by all rollup(a, b), rollup(a, c) +order by a, b, c; + a | b | c +---+---+--- + 1 | 2 | 3 + 1 | 2 | + 1 | 2 | + 1 | | 3 + 1 | | 3 + 1 | | + 1 | | + 1 | | + 4 | | 6 + 4 | | 6 + 4 | | 6 + 4 | | + 4 | | + 4 | | + 4 | | + 4 | | + 7 | 8 | 9 + 7 | 8 | + 7 | 8 | + 7 | | 9 + 7 | | 9 + 7 | | + 7 | | + 7 | | + | | +(25 rows) + +-- ...which is also the default +select a, b, c +from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) +group by rollup(a, b), rollup(a, c) +order by a, b, c; + a | b | c +---+---+--- + 1 | 2 | 3 + 1 | 2 | + 1 | 2 | + 1 | | 3 + 1 | | 3 + 1 | | + 1 | | + 1 | | + 4 | | 6 + 4 | | 6 + 4 | | 6 + 4 | | + 4 | | + 4 | | + 4 | | + 4 | | + 7 | 8 | 9 + 7 | 8 | + 7 | 8 | + 7 | | 9 + 7 | | 9 + 7 | | + 7 | | + 7 | | + | | +(25 rows) + +-- "group by distinct" behavior... +select a, b, c +from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) +group by distinct rollup(a, b), rollup(a, c) +order by a, b, c; + a | b | c +---+---+--- + 1 | 2 | 3 + 1 | 2 | + 1 | | 3 + 1 | | + 4 | | 6 + 4 | | 6 + 4 | | + 4 | | + 7 | 8 | 9 + 7 | 8 | + 7 | | 9 + 7 | | + | | +(13 rows) + +-- ...which is not the same as "select distinct" +select distinct a, b, c +from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) +group by rollup(a, b), rollup(a, c) +order by a, b, c; + a | b | c +---+---+--- + 1 | 2 | 3 + 1 | 2 | + 1 | | 3 + 1 | | + 4 | | 6 + 4 | | + 7 | 8 | 9 + 7 | 8 | + 7 | | 9 + 7 | | + | | +(11 rows) + +-- test handling of outer GroupingFunc within subqueries +explain (costs off) +select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); + QUERY PLAN +------------------------------------- + MixedAggregate + Hash Key: $2 + Group Key: () + InitPlan 1 (returns $1) + -> Result + InitPlan 3 (returns $2) + -> Result + -> Result + SubPlan 2 + -> Result + Optimizer: Postgres query optimizer +(11 rows) + +select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); + grouping +---------- + 1 + 0 +(2 rows) + +explain (costs off) +select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: $2 + InitPlan 1 (returns $1) + -> Result + InitPlan 3 (returns $2) + -> Result + -> Result + SubPlan 2 + -> Result + Optimizer: Postgres query optimizer +(10 rows) + +select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; + grouping +---------- + 0 +(1 row) + +select a, rank(a+3) within group (order by b nulls last) +from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) +group by rollup (a) order by a; + a | rank +---+------ + 1 | 2 + 3 | 3 + | 6 +(3 rows) + +select a, rank((select a+3)) within group (order by b nulls last) +from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) +group by rollup (a) order by a; + a | rank +---+------ + 1 | 2 + 3 | 3 + | 6 +(3 rows) + +select a, rank((select 1+2)) within group (order by b nulls last) +from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) +group by rollup (a) order by a; + a | rank +---+------ + 1 | 2 + 3 | 3 + | 4 +(3 rows) + +select a, b, rank(b) within group (order by b nulls last) +from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) +group by rollup (a,b) order by a; + a | b | rank +---+---+------ + 1 | 1 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | | 4 + 3 | 1 | 1 + 3 | 2 | 1 + 3 | | 3 + | | 6 +(8 rows) + +-- end diff --git a/src/test/singlenode_regress/expected/guc.out b/src/test/singlenode_regress/expected/guc.out new file mode 100644 index 00000000000..45c68e361fe --- /dev/null +++ b/src/test/singlenode_regress/expected/guc.out @@ -0,0 +1,838 @@ +-- pg_regress should ensure that this default value applies; however +-- we can't rely on any specific default value of vacuum_cost_delay +SHOW datestyle; + DateStyle +--------------- + Postgres, MDY +(1 row) + +-- SET to some nondefault value +SET vacuum_cost_delay TO 40; +SET datestyle = 'ISO, YMD'; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +-- SET LOCAL has no effect outside of a transaction +SET LOCAL vacuum_cost_delay TO 50; +WARNING: SET LOCAL can only be used in transaction blocks +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SET LOCAL datestyle = 'SQL'; +WARNING: SET LOCAL can only be used in transaction blocks +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +-- SET LOCAL within a transaction that commits +BEGIN; +SET LOCAL vacuum_cost_delay TO 50; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 50ms +(1 row) + +SET LOCAL datestyle = 'SQL'; +SHOW datestyle; + DateStyle +----------- + SQL, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------- + 08/13/2006 12:34:56 PDT +(1 row) + +COMMIT; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +-- SET should be reverted after ROLLBACK +BEGIN; +SET vacuum_cost_delay TO 60; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 60ms +(1 row) + +SET datestyle = 'German'; +SHOW datestyle; + DateStyle +------------- + German, DMY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------- + 13.08.2006 12:34:56 PDT +(1 row) + +ROLLBACK; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +-- Some tests with subtransactions +BEGIN; +SET vacuum_cost_delay TO 70; +SET datestyle = 'MDY'; +SHOW datestyle; + DateStyle +----------- + ISO, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +SAVEPOINT first_sp; +SET vacuum_cost_delay TO 80.1; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 80100us +(1 row) + +SET datestyle = 'German, DMY'; +SHOW datestyle; + DateStyle +------------- + German, DMY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------- + 13.08.2006 12:34:56 PDT +(1 row) + +ROLLBACK TO first_sp; +SHOW datestyle; + DateStyle +----------- + ISO, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +SAVEPOINT second_sp; +SET vacuum_cost_delay TO '900us'; +SET datestyle = 'SQL, YMD'; +SHOW datestyle; + DateStyle +----------- + SQL, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------- + 08/13/2006 12:34:56 PDT +(1 row) + +SAVEPOINT third_sp; +SET vacuum_cost_delay TO 100; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 100ms +(1 row) + +SET datestyle = 'Postgres, MDY'; +SHOW datestyle; + DateStyle +--------------- + Postgres, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------------ + Sun Aug 13 12:34:56 2006 PDT +(1 row) + +ROLLBACK TO third_sp; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 900us +(1 row) + +SHOW datestyle; + DateStyle +----------- + SQL, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------- + 08/13/2006 12:34:56 PDT +(1 row) + +ROLLBACK TO second_sp; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 70ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +ROLLBACK; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +-- SET LOCAL with Savepoints +BEGIN; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +SAVEPOINT sp; +SET LOCAL vacuum_cost_delay TO 30; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 30ms +(1 row) + +SET LOCAL datestyle = 'Postgres, MDY'; +SHOW datestyle; + DateStyle +--------------- + Postgres, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------------ + Sun Aug 13 12:34:56 2006 PDT +(1 row) + +ROLLBACK TO sp; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +ROLLBACK; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +-- SET LOCAL persists through RELEASE (which was not true in 8.0-8.2) +BEGIN; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +SAVEPOINT sp; +SET LOCAL vacuum_cost_delay TO 30; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 30ms +(1 row) + +SET LOCAL datestyle = 'Postgres, MDY'; +SHOW datestyle; + DateStyle +--------------- + Postgres, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------------ + Sun Aug 13 12:34:56 2006 PDT +(1 row) + +RELEASE SAVEPOINT sp; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 30ms +(1 row) + +SHOW datestyle; + DateStyle +--------------- + Postgres, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------------ + Sun Aug 13 12:34:56 2006 PDT +(1 row) + +ROLLBACK; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +-- SET followed by SET LOCAL +BEGIN; +SET vacuum_cost_delay TO 40; +SET LOCAL vacuum_cost_delay TO 50; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 50ms +(1 row) + +SET datestyle = 'ISO, DMY'; +SET LOCAL datestyle = 'Postgres, MDY'; +SHOW datestyle; + DateStyle +--------------- + Postgres, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------------ + Sun Aug 13 12:34:56 2006 PDT +(1 row) + +COMMIT; +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 40ms +(1 row) + +SHOW datestyle; + DateStyle +----------- + ISO, DMY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +-- +-- Test RESET. We use datestyle because the reset value is forced by +-- pg_regress, so it doesn't depend on the installation's configuration. +-- +SET datestyle = iso, ymd; +SHOW datestyle; + DateStyle +----------- + ISO, YMD +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------ + 2006-08-13 12:34:56-07 +(1 row) + +RESET datestyle; +SHOW datestyle; + DateStyle +--------------- + Postgres, MDY +(1 row) + +SELECT '2006-08-13 12:34:56'::timestamptz; + timestamptz +------------------------------ + Sun Aug 13 12:34:56 2006 PDT +(1 row) + +-- Test some simple error cases +SET seq_page_cost TO 'NaN'; +ERROR: invalid value for parameter "seq_page_cost": "NaN" +SET vacuum_cost_delay TO '10s'; +ERROR: 10000 ms is outside the valid range for parameter "vacuum_cost_delay" (0 .. 100) +SET no_such_variable TO 42; +ERROR: unrecognized configuration parameter "no_such_variable" +-- Test "custom" GUCs created on the fly (which aren't really an +-- intended feature, but many people use them). +SHOW custom.my_guc; -- error, not known yet +ERROR: unrecognized configuration parameter "custom.my_guc" +SET custom.my_guc = 42; +SHOW custom.my_guc; + custom.my_guc +--------------- + 42 +(1 row) + +RESET custom.my_guc; -- this makes it go to empty, not become unknown again +SHOW custom.my_guc; + custom.my_guc +--------------- + +(1 row) + +SET custom.my.qualified.guc = 'foo'; +SHOW custom.my.qualified.guc; + custom.my.qualified.guc +------------------------- + foo +(1 row) + +SET custom."bad-guc" = 42; -- disallowed because -c cannot set this name +ERROR: invalid configuration parameter name "custom.bad-guc" +DETAIL: Custom parameter names must be two or more simple identifiers separated by dots. +SHOW custom."bad-guc"; +ERROR: unrecognized configuration parameter "custom.bad-guc" +SET special."weird name" = 'foo'; -- could be allowed, but we choose not to +ERROR: invalid configuration parameter name "special.weird name" +DETAIL: Custom parameter names must be two or more simple identifiers separated by dots. +SHOW special."weird name"; +ERROR: unrecognized configuration parameter "special.weird name" +-- +-- Test DISCARD TEMP +-- +CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS; +SELECT relname FROM pg_class WHERE relname = 'reset_test'; + relname +------------ + reset_test +(1 row) + +DISCARD TEMP; +SELECT relname FROM pg_class WHERE relname = 'reset_test'; + relname +--------- +(0 rows) + +-- +-- Test DISCARD ALL +-- +-- do changes +DECLARE foo CURSOR WITH HOLD FOR SELECT 1; +PREPARE foo AS SELECT 1; +LISTEN foo_event; +SET vacuum_cost_delay = 13; +CREATE TEMP TABLE tmp_foo (data text) ON COMMIT DELETE ROWS; +CREATE ROLE regress_guc_user; +SET SESSION AUTHORIZATION regress_guc_user; +-- look changes +SELECT pg_listening_channels(); + pg_listening_channels +----------------------- + foo_event +(1 row) + +SELECT name FROM pg_prepared_statements; + name +------ + foo +(1 row) + +SELECT name FROM pg_cursors; + name +------ + foo +(1 row) + +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 13ms +(1 row) + +SELECT relname from pg_class where relname = 'tmp_foo'; + relname +--------- + tmp_foo +(1 row) + +SELECT current_user = 'regress_guc_user'; + ?column? +---------- + t +(1 row) + +-- discard everything +DISCARD ALL; +-- look again +SELECT pg_listening_channels(); + pg_listening_channels +----------------------- +(0 rows) + +SELECT name FROM pg_prepared_statements; + name +------ +(0 rows) + +SELECT name FROM pg_cursors; + name +------ +(0 rows) + +SHOW vacuum_cost_delay; + vacuum_cost_delay +------------------- + 0 +(1 row) + +SELECT relname from pg_class where relname = 'tmp_foo'; + relname +--------- +(0 rows) + +SELECT current_user = 'regress_guc_user'; + ?column? +---------- + f +(1 row) + +DROP ROLE regress_guc_user; +-- +-- search_path should react to changes in pg_namespace +-- +set search_path = foo, public, not_there_initially; +select current_schemas(false); + current_schemas +----------------- + {public} +(1 row) + +create schema not_there_initially; +select current_schemas(false); + current_schemas +------------------------------ + {public,not_there_initially} +(1 row) + +drop schema not_there_initially; +select current_schemas(false); + current_schemas +----------------- + {public} +(1 row) + +reset search_path; +-- +-- Tests for function-local GUC settings +-- +set work_mem = '3MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +create function report_guc(text) returns text as +$$ select current_setting($1) $$ language sql +set work_mem = '1MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select report_guc('work_mem'), current_setting('work_mem'); +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. + report_guc | current_setting +------------+----------------- + 1MB | 3MB +(1 row) + +alter function report_guc(text) set work_mem = '2MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select report_guc('work_mem'), current_setting('work_mem'); +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. + report_guc | current_setting +------------+----------------- + 2MB | 3MB +(1 row) + +alter function report_guc(text) reset all; +select report_guc('work_mem'), current_setting('work_mem'); + report_guc | current_setting +------------+----------------- + 3MB | 3MB +(1 row) + +-- SET LOCAL is restricted by a function SET option +create or replace function myfunc(int) returns text as $$ +begin + set local work_mem = '2MB'; + return current_setting('work_mem'); +end $$ +language plpgsql +set work_mem = '1MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select myfunc(0), current_setting('work_mem'); +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. + myfunc | current_setting +--------+----------------- + 2MB | 3MB +(1 row) + +alter function myfunc(int) reset all; +select myfunc(0), current_setting('work_mem'); +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. + myfunc | current_setting +--------+----------------- + 2MB | 2MB +(1 row) + +set work_mem = '3MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- but SET isn't +create or replace function myfunc(int) returns text as $$ +begin + set work_mem = '2MB'; + return current_setting('work_mem'); +end $$ +language plpgsql +set work_mem = '1MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select myfunc(0), current_setting('work_mem'); +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. + myfunc | current_setting +--------+----------------- + 2MB | 2MB +(1 row) + +set work_mem = '3MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- it should roll back on error, though +create or replace function myfunc(int) returns text as $$ +begin + set work_mem = '2MB'; + perform 1/$1; + return current_setting('work_mem'); +end $$ +language plpgsql +set work_mem = '1MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select myfunc(0); +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +ERROR: division by zero +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +CONTEXT: SQL statement "SELECT 1/$1" +PL/pgSQL function myfunc(integer) line 4 at PERFORM +select current_setting('work_mem'); + current_setting +----------------- + 3MB +(1 row) + +select myfunc(1), current_setting('work_mem'); +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. + myfunc | current_setting +--------+----------------- + 2MB | 2MB +(1 row) + +-- check current_setting()'s behavior with invalid setting name +select current_setting('nosuch.setting'); -- FAIL +ERROR: unrecognized configuration parameter "nosuch.setting" +select current_setting('nosuch.setting', false); -- FAIL +ERROR: unrecognized configuration parameter "nosuch.setting" +select current_setting('nosuch.setting', true) is null; + ?column? +---------- + t +(1 row) + +-- after this, all three cases should yield 'nada' +set nosuch.setting = 'nada'; +select current_setting('nosuch.setting'); + current_setting +----------------- + nada +(1 row) + +select current_setting('nosuch.setting', false); + current_setting +----------------- + nada +(1 row) + +select current_setting('nosuch.setting', true); + current_setting +----------------- + nada +(1 row) + +-- Normally, CREATE FUNCTION should complain about invalid values in +-- function SET options; but not if check_function_bodies is off, +-- because that creates ordering hazards for pg_dump +create function func_with_bad_set() returns int as $$ select 1 $$ +language sql +set default_text_search_config = no_such_config; +NOTICE: text search configuration "no_such_config" does not exist +ERROR: invalid value for parameter "default_text_search_config": "no_such_config" +set check_function_bodies = off; +create function func_with_bad_set() returns int as $$ select 1 $$ +language sql +set default_text_search_config = no_such_config; +NOTICE: text search configuration "no_such_config" does not exist +select func_with_bad_set(); +ERROR: invalid value for parameter "default_text_search_config": "no_such_config" +reset check_function_bodies; +set default_with_oids to f; +-- Should not allow to set it to true. +set default_with_oids to t; +ERROR: tables declared WITH OIDS are not supported diff --git a/src/test/singlenode_regress/expected/hash_func.out b/src/test/singlenode_regress/expected/hash_func.out new file mode 100644 index 00000000000..8e23dc39783 --- /dev/null +++ b/src/test/singlenode_regress/expected/hash_func.out @@ -0,0 +1,374 @@ +-- +-- Test hash functions +-- +-- When the salt is 0, the extended hash function should produce a result +-- whose low 32 bits match the standard hash function. When the salt is +-- not 0, we should get a different result. +-- +SELECT v as value, hashint2(v)::bit(32) as standard, + hashint2extended(v, 0)::bit(32) as extended0, + hashint2extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0::int2), (1::int2), (17::int2), (42::int2)) x(v) +WHERE hashint2(v)::bit(32) != hashint2extended(v, 0)::bit(32) + OR hashint2(v)::bit(32) = hashint2extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashint4(v)::bit(32) as standard, + hashint4extended(v, 0)::bit(32) as extended0, + hashint4extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashint4(v)::bit(32) != hashint4extended(v, 0)::bit(32) + OR hashint4(v)::bit(32) = hashint4extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashint8(v)::bit(32) as standard, + hashint8extended(v, 0)::bit(32) as extended0, + hashint8extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashint8(v)::bit(32) != hashint8extended(v, 0)::bit(32) + OR hashint8(v)::bit(32) = hashint8extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashfloat4(v)::bit(32) as standard, + hashfloat4extended(v, 0)::bit(32) as extended0, + hashfloat4extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashfloat4(v)::bit(32) != hashfloat4extended(v, 0)::bit(32) + OR hashfloat4(v)::bit(32) = hashfloat4extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashfloat8(v)::bit(32) as standard, + hashfloat8extended(v, 0)::bit(32) as extended0, + hashfloat8extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashfloat8(v)::bit(32) != hashfloat8extended(v, 0)::bit(32) + OR hashfloat8(v)::bit(32) = hashfloat8extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashoid(v)::bit(32) as standard, + hashoidextended(v, 0)::bit(32) as extended0, + hashoidextended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashoid(v)::bit(32) != hashoidextended(v, 0)::bit(32) + OR hashoid(v)::bit(32) = hashoidextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashchar(v)::bit(32) as standard, + hashcharextended(v, 0)::bit(32) as extended0, + hashcharextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::"char"), ('1'), ('x'), ('X'), ('p'), ('N')) x(v) +WHERE hashchar(v)::bit(32) != hashcharextended(v, 0)::bit(32) + OR hashchar(v)::bit(32) = hashcharextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashname(v)::bit(32) as standard, + hashnameextended(v, 0)::bit(32) as extended0, + hashnameextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL), ('PostgreSQL'), ('eIpUEtqmY89'), ('AXKEJBTK'), + ('muop28x03'), ('yi3nm0d73')) x(v) +WHERE hashname(v)::bit(32) != hashnameextended(v, 0)::bit(32) + OR hashname(v)::bit(32) = hashnameextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashtext(v)::bit(32) as standard, + hashtextextended(v, 0)::bit(32) as extended0, + hashtextextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL), ('PostgreSQL'), ('eIpUEtqmY89'), ('AXKEJBTK'), + ('muop28x03'), ('yi3nm0d73')) x(v) +WHERE hashtext(v)::bit(32) != hashtextextended(v, 0)::bit(32) + OR hashtext(v)::bit(32) = hashtextextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashoidvector(v)::bit(32) as standard, + hashoidvectorextended(v, 0)::bit(32) as extended0, + hashoidvectorextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::oidvector), ('0 1 2 3 4'), ('17 18 19 20'), + ('42 43 42 45'), ('550273 550273 570274'), + ('207112489 207112499 21512 2155 372325 1363252')) x(v) +WHERE hashoidvector(v)::bit(32) != hashoidvectorextended(v, 0)::bit(32) + OR hashoidvector(v)::bit(32) = hashoidvectorextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hash_aclitem(v)::bit(32) as standard, + hash_aclitem_extended(v, 0)::bit(32) as extended0, + hash_aclitem_extended(v, 1)::bit(32) as extended1 +FROM (SELECT DISTINCT(relacl[1]) FROM pg_class LIMIT 10) x(v) +WHERE hash_aclitem(v)::bit(32) != hash_aclitem_extended(v, 0)::bit(32) + OR hash_aclitem(v)::bit(32) = hash_aclitem_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashmacaddr(v)::bit(32) as standard, + hashmacaddrextended(v, 0)::bit(32) as extended0, + hashmacaddrextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::macaddr), ('08:00:2b:01:02:04'), ('08:00:2b:01:02:04'), + ('e2:7f:51:3e:70:49'), ('d6:a9:4a:78:1c:d5'), + ('ea:29:b1:5e:1f:a5')) x(v) +WHERE hashmacaddr(v)::bit(32) != hashmacaddrextended(v, 0)::bit(32) + OR hashmacaddr(v)::bit(32) = hashmacaddrextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashinet(v)::bit(32) as standard, + hashinetextended(v, 0)::bit(32) as extended0, + hashinetextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::inet), ('192.168.100.128/25'), ('192.168.100.0/8'), + ('172.168.10.126/16'), ('172.18.103.126/24'), ('192.188.13.16/32')) x(v) +WHERE hashinet(v)::bit(32) != hashinetextended(v, 0)::bit(32) + OR hashinet(v)::bit(32) = hashinetextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hash_numeric(v)::bit(32) as standard, + hash_numeric_extended(v, 0)::bit(32) as extended0, + hash_numeric_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1.149484958), (17.149484958), (42.149484958), + (149484958.550273), (2071124898672)) x(v) +WHERE hash_numeric(v)::bit(32) != hash_numeric_extended(v, 0)::bit(32) + OR hash_numeric(v)::bit(32) = hash_numeric_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hashmacaddr8(v)::bit(32) as standard, + hashmacaddr8extended(v, 0)::bit(32) as extended0, + hashmacaddr8extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::macaddr8), ('08:00:2b:01:02:04:36:49'), + ('08:00:2b:01:02:04:f0:e8'), ('e2:7f:51:3e:70:49:16:29'), + ('d6:a9:4a:78:1c:d5:47:32'), ('ea:29:b1:5e:1f:a5')) x(v) +WHERE hashmacaddr8(v)::bit(32) != hashmacaddr8extended(v, 0)::bit(32) + OR hashmacaddr8(v)::bit(32) = hashmacaddr8extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hash_array(v)::bit(32) as standard, + hash_array_extended(v, 0)::bit(32) as extended0, + hash_array_extended(v, 1)::bit(32) as extended1 +FROM (VALUES ('{0}'::int4[]), ('{0,1,2,3,4}'), ('{17,18,19,20}'), + ('{42,34,65,98}'), ('{550273,590027, 870273}'), + ('{207112489, 807112489}')) x(v) +WHERE hash_array(v)::bit(32) != hash_array_extended(v, 0)::bit(32) + OR hash_array(v)::bit(32) = hash_array_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +-- array hashing with non-hashable element type +SELECT v as value, hash_array(v)::bit(32) as standard +FROM (VALUES ('{0}'::money[])) x(v); +ERROR: could not identify a hash function for type money +SELECT v as value, hash_array_extended(v, 0)::bit(32) as extended0 +FROM (VALUES ('{0}'::money[])) x(v); +ERROR: could not identify an extended hash function for type money +SELECT v as value, hashbpchar(v)::bit(32) as standard, + hashbpcharextended(v, 0)::bit(32) as extended0, + hashbpcharextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL), ('PostgreSQL'), ('eIpUEtqmY89'), ('AXKEJBTK'), + ('muop28x03'), ('yi3nm0d73')) x(v) +WHERE hashbpchar(v)::bit(32) != hashbpcharextended(v, 0)::bit(32) + OR hashbpchar(v)::bit(32) = hashbpcharextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, time_hash(v)::bit(32) as standard, + time_hash_extended(v, 0)::bit(32) as extended0, + time_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::time), ('11:09:59'), ('1:09:59'), ('11:59:59'), + ('7:9:59'), ('5:15:59')) x(v) +WHERE time_hash(v)::bit(32) != time_hash_extended(v, 0)::bit(32) + OR time_hash(v)::bit(32) = time_hash_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, timetz_hash(v)::bit(32) as standard, + timetz_hash_extended(v, 0)::bit(32) as extended0, + timetz_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::timetz), ('00:11:52.518762-07'), ('00:11:52.51762-08'), + ('00:11:52.62-01'), ('00:11:52.62+01'), ('11:59:59+04')) x(v) +WHERE timetz_hash(v)::bit(32) != timetz_hash_extended(v, 0)::bit(32) + OR timetz_hash(v)::bit(32) = timetz_hash_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, interval_hash(v)::bit(32) as standard, + interval_hash_extended(v, 0)::bit(32) as extended0, + interval_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::interval), + ('5 month 7 day 46 minutes'), ('1 year 7 day 46 minutes'), + ('1 year 7 month 20 day 46 minutes'), ('5 month'), + ('17 year 11 month 7 day 9 hours 46 minutes 5 seconds')) x(v) +WHERE interval_hash(v)::bit(32) != interval_hash_extended(v, 0)::bit(32) + OR interval_hash(v)::bit(32) = interval_hash_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, timestamp_hash(v)::bit(32) as standard, + timestamp_hash_extended(v, 0)::bit(32) as extended0, + timestamp_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::timestamp), ('2017-08-22 00:09:59.518762'), + ('2015-08-20 00:11:52.51762-08'), + ('2017-05-22 00:11:52.62-01'), + ('2013-08-22 00:11:52.62+01'), ('2013-08-22 11:59:59+04')) x(v) +WHERE timestamp_hash(v)::bit(32) != timestamp_hash_extended(v, 0)::bit(32) + OR timestamp_hash(v)::bit(32) = timestamp_hash_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, uuid_hash(v)::bit(32) as standard, + uuid_hash_extended(v, 0)::bit(32) as extended0, + uuid_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::uuid), ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'), + ('5a9ba4ac-8d6f-11e7-bb31-be2e44b06b34'), + ('99c6705c-d939-461c-a3c9-1690ad64ed7b'), + ('7deed3ca-8d6f-11e7-bb31-be2e44b06b34'), + ('9ad46d4f-6f2a-4edd-aadb-745993928e1e')) x(v) +WHERE uuid_hash(v)::bit(32) != uuid_hash_extended(v, 0)::bit(32) + OR uuid_hash(v)::bit(32) = uuid_hash_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, pg_lsn_hash(v)::bit(32) as standard, + pg_lsn_hash_extended(v, 0)::bit(32) as extended0, + pg_lsn_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::pg_lsn), ('16/B374D84'), ('30/B374D84'), + ('255/B374D84'), ('25/B379D90'), ('900/F37FD90')) x(v) +WHERE pg_lsn_hash(v)::bit(32) != pg_lsn_hash_extended(v, 0)::bit(32) + OR pg_lsn_hash(v)::bit(32) = pg_lsn_hash_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); +SELECT v as value, hashenum(v)::bit(32) as standard, + hashenumextended(v, 0)::bit(32) as extended0, + hashenumextended(v, 1)::bit(32) as extended1 +FROM (VALUES ('sad'::mood), ('ok'), ('happy')) x(v) +WHERE hashenum(v)::bit(32) != hashenumextended(v, 0)::bit(32) + OR hashenum(v)::bit(32) = hashenumextended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +DROP TYPE mood; +SELECT v as value, jsonb_hash(v)::bit(32) as standard, + jsonb_hash_extended(v, 0)::bit(32) as extended0, + jsonb_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::jsonb), + ('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'), + ('{"foo": [true, "bar"], "tags": {"e": 1, "f": null}}'), + ('{"g": {"h": "value"}}')) x(v) +WHERE jsonb_hash(v)::bit(32) != jsonb_hash_extended(v, 0)::bit(32) + OR jsonb_hash(v)::bit(32) = jsonb_hash_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hash_range(v)::bit(32) as standard, + hash_range_extended(v, 0)::bit(32) as extended0, + hash_range_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (int4range(10, 20)), (int4range(23, 43)), + (int4range(5675, 550273)), + (int4range(550274, 1550274)), (int4range(1550275, 208112489))) x(v) +WHERE hash_range(v)::bit(32) != hash_range_extended(v, 0)::bit(32) + OR hash_range(v)::bit(32) = hash_range_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +SELECT v as value, hash_multirange(v)::bit(32) as standard, + hash_multirange_extended(v, 0)::bit(32) as extended0, + hash_multirange_extended(v, 1)::bit(32) as extended1 +FROM (VALUES ('{[10,20)}'::int4multirange), ('{[23, 43]}'::int4multirange), + ('{[5675, 550273)}'::int4multirange), + ('{[550274, 1550274)}'::int4multirange), + ('{[1550275, 208112489)}'::int4multirange)) x(v) +WHERE hash_multirange(v)::bit(32) != hash_multirange_extended(v, 0)::bit(32) + OR hash_multirange(v)::bit(32) = hash_multirange_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +CREATE TYPE hash_test_t1 AS (a int, b text); +SELECT v as value, hash_record(v)::bit(32) as standard, + hash_record_extended(v, 0)::bit(32) as extended0, + hash_record_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (row(1, 'aaa')::hash_test_t1, row(2, 'bbb'), row(-1, 'ccc'))) x(v) +WHERE hash_record(v)::bit(32) != hash_record_extended(v, 0)::bit(32) + OR hash_record(v)::bit(32) = hash_record_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + +DROP TYPE hash_test_t1; +-- record hashing with non-hashable field type +CREATE TYPE hash_test_t2 AS (a money, b text); +SELECT v as value, hash_record(v)::bit(32) as standard +FROM (VALUES (row(1, 'aaa')::hash_test_t2)) x(v); +ERROR: could not identify a hash function for type money +SELECT v as value, hash_record_extended(v, 0)::bit(32) as extended0 +FROM (VALUES (row(1, 'aaa')::hash_test_t2)) x(v); +ERROR: could not identify an extended hash function for type money +DROP TYPE hash_test_t2; +-- +-- Check special cases for specific data types +-- +SELECT hashfloat4('0'::float4) = hashfloat4('-0'::float4) AS t; + t +--- + t +(1 row) + +SELECT hashfloat4('NaN'::float4) = hashfloat4(-'NaN'::float4) AS t; + t +--- + t +(1 row) + +SELECT hashfloat8('0'::float8) = hashfloat8('-0'::float8) AS t; + t +--- + t +(1 row) + +SELECT hashfloat8('NaN'::float8) = hashfloat8(-'NaN'::float8) AS t; + t +--- + t +(1 row) + +SELECT hashfloat4('NaN'::float4) = hashfloat8('NaN'::float8) AS t; + t +--- + t +(1 row) + diff --git a/src/test/singlenode_regress/expected/hash_index.out b/src/test/singlenode_regress/expected/hash_index.out new file mode 100644 index 00000000000..e47c6aaf9e7 --- /dev/null +++ b/src/test/singlenode_regress/expected/hash_index.out @@ -0,0 +1,246 @@ +-- +-- HASH_INDEX +-- grep 843938989 hash.data +-- +SELECT * FROM hash_i4_heap + WHERE hash_i4_heap.random = 843938989; + seqno | random +-------+----------- + 15 | 843938989 +(1 row) + +-- +-- hash index +-- grep 66766766 hash.data +-- +SELECT * FROM hash_i4_heap + WHERE hash_i4_heap.random = 66766766; + seqno | random +-------+-------- +(0 rows) + +-- +-- hash index +-- grep 1505703298 hash.data +-- +SELECT * FROM hash_name_heap + WHERE hash_name_heap.random = '1505703298'::name; + seqno | random +-------+------------ + 9838 | 1505703298 +(1 row) + +-- +-- hash index +-- grep 7777777 hash.data +-- +SELECT * FROM hash_name_heap + WHERE hash_name_heap.random = '7777777'::name; + seqno | random +-------+-------- +(0 rows) + +-- +-- hash index +-- grep 1351610853 hash.data +-- +SELECT * FROM hash_txt_heap + WHERE hash_txt_heap.random = '1351610853'::text; + seqno | random +-------+------------ + 5677 | 1351610853 +(1 row) + +-- +-- hash index +-- grep 111111112222222233333333 hash.data +-- +SELECT * FROM hash_txt_heap + WHERE hash_txt_heap.random = '111111112222222233333333'::text; + seqno | random +-------+-------- +(0 rows) + +-- +-- hash index +-- grep 444705537 hash.data +-- +SELECT * FROM hash_f8_heap + WHERE hash_f8_heap.random = '444705537'::float8; + seqno | random +-------+----------- + 7853 | 444705537 +(1 row) + +-- +-- hash index +-- grep 88888888 hash.data +-- +SELECT * FROM hash_f8_heap + WHERE hash_f8_heap.random = '88888888'::float8; + seqno | random +-------+-------- +(0 rows) + +-- +-- hash index +-- grep '^90[^0-9]' hashovfl.data +-- +-- SELECT count(*) AS i988 FROM hash_ovfl_heap +-- WHERE x = 90; +-- +-- hash index +-- grep '^1000[^0-9]' hashovfl.data +-- +-- SELECT count(*) AS i0 FROM hash_ovfl_heap +-- WHERE x = 1000; +-- +-- HASH +-- +UPDATE hash_i4_heap + SET random = 1 + WHERE hash_i4_heap.seqno = 1492; +SELECT h.seqno AS i1492, h.random AS i1 + FROM hash_i4_heap h + WHERE h.random = 1; + i1492 | i1 +-------+---- + 1492 | 1 +(1 row) + +UPDATE hash_i4_heap + SET seqno = 20000 + WHERE hash_i4_heap.random = 1492795354; +SELECT h.seqno AS i20000 + FROM hash_i4_heap h + WHERE h.random = 1492795354; + i20000 +-------- + 20000 +(1 row) + +UPDATE hash_name_heap + SET random = '0123456789abcdef'::name + WHERE hash_name_heap.seqno = 6543; +SELECT h.seqno AS i6543, h.random AS c0_to_f + FROM hash_name_heap h + WHERE h.random = '0123456789abcdef'::name; + i6543 | c0_to_f +-------+------------------ + 6543 | 0123456789abcdef +(1 row) + +UPDATE hash_name_heap + SET seqno = 20000 + WHERE hash_name_heap.random = '76652222'::name; +-- +-- this is the row we just replaced; index scan should return zero rows +-- +SELECT h.seqno AS emptyset + FROM hash_name_heap h + WHERE h.random = '76652222'::name; + emptyset +---------- +(0 rows) + +UPDATE hash_txt_heap + SET random = '0123456789abcdefghijklmnop'::text + WHERE hash_txt_heap.seqno = 4002; +SELECT h.seqno AS i4002, h.random AS c0_to_p + FROM hash_txt_heap h + WHERE h.random = '0123456789abcdefghijklmnop'::text; + i4002 | c0_to_p +-------+---------------------------- + 4002 | 0123456789abcdefghijklmnop +(1 row) + +UPDATE hash_txt_heap + SET seqno = 20000 + WHERE hash_txt_heap.random = '959363399'::text; +SELECT h.seqno AS t20000 + FROM hash_txt_heap h + WHERE h.random = '959363399'::text; + t20000 +-------- + 20000 +(1 row) + +UPDATE hash_f8_heap + SET random = '-1234.1234'::float8 + WHERE hash_f8_heap.seqno = 8906; +SELECT h.seqno AS i8096, h.random AS f1234_1234 + FROM hash_f8_heap h + WHERE h.random = '-1234.1234'::float8; + i8096 | f1234_1234 +-------+------------ + 8906 | -1234.1234 +(1 row) + +UPDATE hash_f8_heap + SET seqno = 20000 + WHERE hash_f8_heap.random = '488912369'::float8; +SELECT h.seqno AS f20000 + FROM hash_f8_heap h + WHERE h.random = '488912369'::float8; + f20000 +-------- + 20000 +(1 row) + +-- UPDATE hash_ovfl_heap +-- SET x = 1000 +-- WHERE x = 90; +-- this vacuums the index as well +-- VACUUM hash_ovfl_heap; +-- SELECT count(*) AS i0 FROM hash_ovfl_heap +-- WHERE x = 90; +-- SELECT count(*) AS i988 FROM hash_ovfl_heap +-- WHERE x = 1000; +-- +-- Cause some overflow insert and splits. +-- +CREATE TABLE hash_split_heap (keycol INT); +INSERT INTO hash_split_heap SELECT 1 FROM generate_series(1, 500) a; +CREATE INDEX hash_split_index on hash_split_heap USING HASH (keycol); +INSERT INTO hash_split_heap SELECT 1 FROM generate_series(1, 5000) a; +-- Let's do a backward scan. +BEGIN; +SET enable_seqscan = OFF; +SET enable_bitmapscan = OFF; +DECLARE c CURSOR FOR SELECT * from hash_split_heap WHERE keycol = 1; +MOVE FORWARD ALL FROM c; +MOVE BACKWARD 10000 FROM c; +ERROR: backward scan is not supported in this version of Cloudberry Database +MOVE BACKWARD ALL FROM c; +ERROR: current transaction is aborted, commands ignored until end of transaction block +CLOSE c; +ERROR: current transaction is aborted, commands ignored until end of transaction block +END; +-- DELETE, INSERT, VACUUM. +DELETE FROM hash_split_heap WHERE keycol = 1; +INSERT INTO hash_split_heap SELECT a/2 FROM generate_series(1, 25000) a; +VACUUM hash_split_heap; +-- Rebuild the index using a different fillfactor +ALTER INDEX hash_split_index SET (fillfactor = 10); +REINDEX INDEX hash_split_index; +-- Clean up. +DROP TABLE hash_split_heap; +-- Index on temp table. +CREATE TEMP TABLE hash_temp_heap (x int, y int); +INSERT INTO hash_temp_heap VALUES (1,1); +CREATE INDEX hash_idx ON hash_temp_heap USING hash (x); +DROP TABLE hash_temp_heap CASCADE; +-- Float4 type. +CREATE TABLE hash_heap_float4 (x float4, y int); +INSERT INTO hash_heap_float4 VALUES (1.1,1); +CREATE INDEX hash_idx ON hash_heap_float4 USING hash (x); +DROP TABLE hash_heap_float4 CASCADE; +-- Test out-of-range fillfactor values +CREATE INDEX hash_f8_index2 ON hash_f8_heap USING hash (random float8_ops) + WITH (fillfactor=9); +ERROR: value 9 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +CREATE INDEX hash_f8_index2 ON hash_f8_heap USING hash (random float8_ops) + WITH (fillfactor=101); +ERROR: value 101 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". diff --git a/src/test/singlenode_regress/expected/hash_part.out b/src/test/singlenode_regress/expected/hash_part.out new file mode 100644 index 00000000000..ec6e60e3c62 --- /dev/null +++ b/src/test/singlenode_regress/expected/hash_part.out @@ -0,0 +1,115 @@ +-- +-- Hash partitioning. +-- +-- Use hand-rolled hash functions and operator classes to get predictable +-- result on different machines. See the definitions of +-- part_part_test_int4_ops and part_test_text_ops in insert.sql. +CREATE TABLE mchash (a int, b text, c jsonb) + PARTITION BY HASH (a part_test_int4_ops, b part_test_text_ops); +CREATE TABLE mchash1 + PARTITION OF mchash FOR VALUES WITH (MODULUS 4, REMAINDER 0); +-- invalid OID, no such table +SELECT satisfies_hash_partition(0, 4, 0, NULL); +ERROR: could not open relation with OID 0 +DETAIL: This can be validly caused by a concurrent delete operation on this object. +-- not partitioned +SELECT satisfies_hash_partition('tenk1'::regclass, 4, 0, NULL); +ERROR: "tenk1" is not a hash partitioned table +-- partition rather than the parent +SELECT satisfies_hash_partition('mchash1'::regclass, 4, 0, NULL); +ERROR: "mchash1" is not a hash partitioned table +-- invalid modulus +SELECT satisfies_hash_partition('mchash'::regclass, 0, 0, NULL); +ERROR: modulus for hash partition must be an integer value greater than zero +-- remainder too small +SELECT satisfies_hash_partition('mchash'::regclass, 1, -1, NULL); +ERROR: remainder for hash partition must be an integer value greater than or equal to zero +-- remainder too large +SELECT satisfies_hash_partition('mchash'::regclass, 1, 1, NULL); +ERROR: remainder for hash partition must be less than modulus +-- modulus is null +SELECT satisfies_hash_partition('mchash'::regclass, NULL, 0, NULL); + satisfies_hash_partition +-------------------------- + f +(1 row) + +-- remainder is null +SELECT satisfies_hash_partition('mchash'::regclass, 4, NULL, NULL); + satisfies_hash_partition +-------------------------- + f +(1 row) + +-- too many arguments +SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, NULL::int, NULL::text, NULL::json); +ERROR: number of partitioning columns (2) does not match number of partition keys provided (3) +-- too few arguments +SELECT satisfies_hash_partition('mchash'::regclass, 3, 1, NULL::int); +ERROR: number of partitioning columns (2) does not match number of partition keys provided (1) +-- wrong argument type +SELECT satisfies_hash_partition('mchash'::regclass, 2, 1, NULL::int, NULL::int); +ERROR: column 2 of the partition key has type text, but supplied value is of type integer +-- ok, should be false +SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, 0, ''::text); + satisfies_hash_partition +-------------------------- + f +(1 row) + +-- ok, should be true +SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, 2, ''::text); + satisfies_hash_partition +-------------------------- + t +(1 row) + +-- argument via variadic syntax, should fail because not all partitioning +-- columns are of the correct type +SELECT satisfies_hash_partition('mchash'::regclass, 2, 1, + variadic array[1,2]::int[]); +ERROR: column 2 of the partition key has type "text", but supplied value is of type "integer" +-- multiple partitioning columns of the same type +CREATE TABLE mcinthash (a int, b int, c jsonb) + PARTITION BY HASH (a part_test_int4_ops, b part_test_int4_ops); +-- now variadic should work, should be false +SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0, + variadic array[0, 0]); + satisfies_hash_partition +-------------------------- + f +(1 row) + +-- should be true +SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0, + variadic array[0, 1]); + satisfies_hash_partition +-------------------------- + t +(1 row) + +-- wrong length +SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0, + variadic array[]::int[]); +ERROR: number of partitioning columns (2) does not match number of partition keys provided (0) +-- wrong type +SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0, + variadic array[now(), now()]); +ERROR: column 1 of the partition key has type "integer", but supplied value is of type "timestamp with time zone" +-- check satisfies_hash_partition passes correct collation +create table text_hashp (a text) partition by hash (a); +create table text_hashp0 partition of text_hashp for values with (modulus 2, remainder 0); +create table text_hashp1 partition of text_hashp for values with (modulus 2, remainder 1); +-- The result here should always be true, because 'xxx' must belong to +-- one of the two defined partitions +select satisfies_hash_partition('text_hashp'::regclass, 2, 0, 'xxx'::text) OR + satisfies_hash_partition('text_hashp'::regclass, 2, 1, 'xxx'::text) AS satisfies; + satisfies +----------- + t +(1 row) + +-- cleanup +DROP TABLE mchash; +DROP TABLE mcinthash; +DROP TABLE text_hashp; diff --git a/src/test/singlenode_regress/expected/horology.out b/src/test/singlenode_regress/expected/horology.out new file mode 100644 index 00000000000..8c7fba0a988 --- /dev/null +++ b/src/test/singlenode_regress/expected/horology.out @@ -0,0 +1,3349 @@ +-- +-- HOROLOGY +-- +SET DateStyle = 'Postgres, MDY'; +SHOW TimeZone; -- Many of these tests depend on the prevailing setting + TimeZone +---------- + PST8PDT +(1 row) + +-- +-- Test various input formats +-- +SELECT timestamp with time zone '20011227 040506+08'; + timestamptz +------------------------------ + Wed Dec 26 12:05:06 2001 PST +(1 row) + +SELECT timestamp with time zone '20011227 040506-08'; + timestamptz +------------------------------ + Thu Dec 27 04:05:06 2001 PST +(1 row) + +SELECT timestamp with time zone '20011227 040506.789+08'; + timestamptz +---------------------------------- + Wed Dec 26 12:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone '20011227 040506.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone '20011227T040506+08'; + timestamptz +------------------------------ + Wed Dec 26 12:05:06 2001 PST +(1 row) + +SELECT timestamp with time zone '20011227T040506-08'; + timestamptz +------------------------------ + Thu Dec 27 04:05:06 2001 PST +(1 row) + +SELECT timestamp with time zone '20011227T040506.789+08'; + timestamptz +---------------------------------- + Wed Dec 26 12:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone '20011227T040506.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone '2001-12-27 04:05:06.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone '2001.12.27 04:05:06.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone '2001/12/27 04:05:06.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone '12/27/2001 04:05:06.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +-- should fail in mdy mode: +SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'; +ERROR: date/time field value out of range: "27/12/2001 04:05:06.789-08" +LINE 1: SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'... + ^ +HINT: Perhaps you need a different "datestyle" setting. +set datestyle to dmy; +SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'; + timestamptz +---------------------------------- + Thu 27 Dec 04:05:06.789 2001 PST +(1 row) + +reset datestyle; +SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789+08'; + timestamptz +---------------------------------- + Wed Dec 26 12:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789+08'; + timestamptz +---------------------------------- + Wed Dec 26 12:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271+08'; + timestamptz +------------------------------ + Wed Dec 26 08:00:00 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271-08'; + timestamptz +------------------------------ + Thu Dec 27 00:00:00 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271.5+08'; + timestamptz +------------------------------ + Wed Dec 26 20:00:00 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271.5-08'; + timestamptz +------------------------------ + Thu Dec 27 12:00:00 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271 04:05:06+08'; + timestamptz +------------------------------ + Wed Dec 26 12:05:06 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271 04:05:06-08'; + timestamptz +------------------------------ + Thu Dec 27 04:05:06 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271T040506+08'; + timestamptz +------------------------------ + Wed Dec 26 12:05:06 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271T040506-08'; + timestamptz +------------------------------ + Thu Dec 27 04:05:06 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271T040506.789+08'; + timestamptz +---------------------------------- + Wed Dec 26 12:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone 'J2452271T040506.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +-- German/European-style dates with periods as delimiters +SELECT timestamp with time zone '12.27.2001 04:05:06.789+08'; + timestamptz +---------------------------------- + Wed Dec 26 12:05:06.789 2001 PST +(1 row) + +SELECT timestamp with time zone '12.27.2001 04:05:06.789-08'; + timestamptz +---------------------------------- + Thu Dec 27 04:05:06.789 2001 PST +(1 row) + +SET DateStyle = 'German'; +SELECT timestamp with time zone '27.12.2001 04:05:06.789+08'; + timestamptz +----------------------------- + 26.12.2001 12:05:06.789 PST +(1 row) + +SELECT timestamp with time zone '27.12.2001 04:05:06.789-08'; + timestamptz +----------------------------- + 27.12.2001 04:05:06.789 PST +(1 row) + +SET DateStyle = 'ISO'; +-- As of 7.4, allow time without time zone having a time zone specified +SELECT time without time zone '040506.789+08'; + time +-------------- + 04:05:06.789 +(1 row) + +SELECT time without time zone '040506.789-08'; + time +-------------- + 04:05:06.789 +(1 row) + +SELECT time without time zone 'T040506.789+08'; + time +-------------- + 04:05:06.789 +(1 row) + +SELECT time without time zone 'T040506.789-08'; + time +-------------- + 04:05:06.789 +(1 row) + +SELECT time with time zone '040506.789+08'; + timetz +----------------- + 04:05:06.789+08 +(1 row) + +SELECT time with time zone '040506.789-08'; + timetz +----------------- + 04:05:06.789-08 +(1 row) + +SELECT time with time zone 'T040506.789+08'; + timetz +----------------- + 04:05:06.789+08 +(1 row) + +SELECT time with time zone 'T040506.789-08'; + timetz +----------------- + 04:05:06.789-08 +(1 row) + +SELECT time with time zone 'T040506.789 +08'; + timetz +----------------- + 04:05:06.789+08 +(1 row) + +SELECT time with time zone 'T040506.789 -08'; + timetz +----------------- + 04:05:06.789-08 +(1 row) + +SET DateStyle = 'Postgres, MDY'; +-- Check Julian dates BC +SELECT date 'J1520447' AS "Confucius' Birthday"; + Confucius' Birthday +--------------------- + 09-28-0551 BC +(1 row) + +SELECT date 'J0' AS "Julian Epoch"; + Julian Epoch +--------------- + 11-24-4714 BC +(1 row) + +-- +-- date, time arithmetic +-- +SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time"; + Date + Time +-------------------------- + Tue Feb 03 04:05:06 1981 +(1 row) + +SELECT date '1991-02-03' + time with time zone '04:05:06 PST' AS "Date + Time PST"; + Date + Time PST +------------------------------ + Sun Feb 03 04:05:06 1991 PST +(1 row) + +SELECT date '2001-02-03' + time with time zone '04:05:06 UTC' AS "Date + Time UTC"; + Date + Time UTC +------------------------------ + Fri Feb 02 20:05:06 2001 PST +(1 row) + +SELECT date '1991-02-03' + interval '2 years' AS "Add Two Years"; + Add Two Years +-------------------------- + Wed Feb 03 00:00:00 1993 +(1 row) + +SELECT date '2001-12-13' - interval '2 years' AS "Subtract Two Years"; + Subtract Two Years +-------------------------- + Mon Dec 13 00:00:00 1999 +(1 row) + +-- subtract time from date should not make sense; use interval instead +SELECT date '1991-02-03' - time '04:05:06' AS "Subtract Time"; + Subtract Time +-------------------------- + Sat Feb 02 19:54:54 1991 +(1 row) + +SELECT date '1991-02-03' - time with time zone '04:05:06 UTC' AS "Subtract Time UTC"; +ERROR: operator does not exist: date - time with time zone +LINE 1: SELECT date '1991-02-03' - time with time zone '04:05:06 UTC... + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- +-- timestamp, interval arithmetic +-- +SELECT timestamp without time zone '1996-03-01' - interval '1 second' AS "Feb 29"; + Feb 29 +-------------------------- + Thu Feb 29 23:59:59 1996 +(1 row) + +SELECT timestamp without time zone '1999-03-01' - interval '1 second' AS "Feb 28"; + Feb 28 +-------------------------- + Sun Feb 28 23:59:59 1999 +(1 row) + +SELECT timestamp without time zone '2000-03-01' - interval '1 second' AS "Feb 29"; + Feb 29 +-------------------------- + Tue Feb 29 23:59:59 2000 +(1 row) + +SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; + Dec 31 +-------------------------- + Fri Dec 31 23:59:59 1999 +(1 row) + +SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506"; + Feb 23, 285506 +---------------------------- + Fri Feb 23 00:00:00 285506 +(1 row) + +SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244"; + Jan 20, 288244 +---------------------------- + Sat Jan 20 00:00:00 288244 +(1 row) + +SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276"; + Dec 31, 294276 +---------------------------- + Sun Dec 31 00:00:00 294276 +(1 row) + +SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days"; + 106751991 Days +------------------ + @ 106751991 days +(1 row) + +-- Shorthand values +-- Not directly usable for regression testing since these are not constants. +-- So, just try to test parser and hope for the best - thomas 97/04/26 +SELECT (timestamp without time zone 'today' = (timestamp without time zone 'yesterday' + interval '1 day')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone 'today' = (timestamp without time zone 'tomorrow' - interval '1 day')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone 'today 10:30' = (timestamp without time zone 'yesterday' + interval '1 day 10 hr 30 min')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone '10:30 today' = (timestamp without time zone 'yesterday' + interval '1 day 10 hr 30 min')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone 'tomorrow' = (timestamp without time zone 'yesterday' + interval '2 days')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone 'tomorrow 16:00:00' = (timestamp without time zone 'today' + interval '1 day 16 hours')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone '16:00:00 tomorrow' = (timestamp without time zone 'today' + interval '1 day 16 hours')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone 'yesterday 12:34:56' = (timestamp without time zone 'tomorrow' - interval '2 days - 12:34:56')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone '12:34:56 yesterday' = (timestamp without time zone 'tomorrow' - interval '2 days - 12:34:56')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone 'tomorrow' > 'now') as "True"; + True +------ + t +(1 row) + +-- Convert from date and time to timestamp +-- This test used to be timestamp(date,time) but no longer allowed by grammar +-- to enable support for SQL99 timestamp type syntax. +SELECT date '1994-01-01' + time '11:00' AS "Jan_01_1994_11am"; + Jan_01_1994_11am +-------------------------- + Sat Jan 01 11:00:00 1994 +(1 row) + +SELECT date '1994-01-01' + time '10:00' AS "Jan_01_1994_10am"; + Jan_01_1994_10am +-------------------------- + Sat Jan 01 10:00:00 1994 +(1 row) + +SELECT date '1994-01-01' + timetz '11:00-5' AS "Jan_01_1994_8am"; + Jan_01_1994_8am +------------------------------ + Sat Jan 01 08:00:00 1994 PST +(1 row) + +SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am"; + Jan_01_1994_8am +------------------------------ + Sat Jan 01 08:00:00 1994 PST +(1 row) + +SELECT d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL; + one_year +----------------------------- + -infinity + infinity + Fri Jan 01 00:00:00 1971 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:02 1998 + Tue Feb 10 17:32:01.4 1998 + Tue Feb 10 17:32:01.5 1998 + Tue Feb 10 17:32:01.6 1998 + Fri Jan 02 00:00:00 1998 + Fri Jan 02 03:04:05 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Wed Jun 10 17:32:01 1998 + Sun Sep 22 18:19:20 2002 + Thu Mar 15 08:14:01 2001 + Thu Mar 15 13:14:02 2001 + Thu Mar 15 12:14:03 2001 + Thu Mar 15 03:14:04 2001 + Thu Mar 15 02:14:05 2001 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:00 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Tue Feb 10 17:32:01 1998 + Wed Jun 10 18:32:01 1998 + Tue Feb 10 17:32:01 1998 + Wed Feb 11 17:32:01 1998 + Thu Feb 12 17:32:01 1998 + Fri Feb 13 17:32:01 1998 + Sat Feb 14 17:32:01 1998 + Sun Feb 15 17:32:01 1998 + Mon Feb 16 17:32:01 1998 + Thu Feb 16 17:32:01 0096 BC + Sun Feb 16 17:32:01 0098 + Fri Feb 16 17:32:01 0598 + Wed Feb 16 17:32:01 1098 + Sun Feb 16 17:32:01 1698 + Fri Feb 16 17:32:01 1798 + Wed Feb 16 17:32:01 1898 + Mon Feb 16 17:32:01 1998 + Sun Feb 16 17:32:01 2098 + Fri Feb 28 17:32:01 1997 + Fri Feb 28 17:32:01 1997 + Sat Mar 01 17:32:01 1997 + Tue Dec 30 17:32:01 1997 + Wed Dec 31 17:32:01 1997 + Thu Jan 01 17:32:01 1998 + Sat Feb 28 17:32:01 1998 + Sun Mar 01 17:32:01 1998 + Wed Dec 30 17:32:01 1998 + Thu Dec 31 17:32:01 1998 + Sun Dec 31 17:32:01 2000 + Mon Jan 01 17:32:01 2001 + Mon Dec 31 17:32:01 2001 + Tue Jan 01 17:32:01 2002 +(65 rows) + +SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL; + one_year +----------------------------- + -infinity + infinity + Wed Jan 01 00:00:00 1969 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:02 1996 + Sat Feb 10 17:32:01.4 1996 + Sat Feb 10 17:32:01.5 1996 + Sat Feb 10 17:32:01.6 1996 + Tue Jan 02 00:00:00 1996 + Tue Jan 02 03:04:05 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Mon Jun 10 17:32:01 1996 + Fri Sep 22 18:19:20 2000 + Mon Mar 15 08:14:01 1999 + Mon Mar 15 13:14:02 1999 + Mon Mar 15 12:14:03 1999 + Mon Mar 15 03:14:04 1999 + Mon Mar 15 02:14:05 1999 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:00 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sat Feb 10 17:32:01 1996 + Mon Jun 10 18:32:01 1996 + Sat Feb 10 17:32:01 1996 + Sun Feb 11 17:32:01 1996 + Mon Feb 12 17:32:01 1996 + Tue Feb 13 17:32:01 1996 + Wed Feb 14 17:32:01 1996 + Thu Feb 15 17:32:01 1996 + Fri Feb 16 17:32:01 1996 + Mon Feb 16 17:32:01 0098 BC + Thu Feb 16 17:32:01 0096 + Tue Feb 16 17:32:01 0596 + Sun Feb 16 17:32:01 1096 + Thu Feb 16 17:32:01 1696 + Tue Feb 16 17:32:01 1796 + Sun Feb 16 17:32:01 1896 + Fri Feb 16 17:32:01 1996 + Thu Feb 16 17:32:01 2096 + Tue Feb 28 17:32:01 1995 + Tue Feb 28 17:32:01 1995 + Wed Mar 01 17:32:01 1995 + Sat Dec 30 17:32:01 1995 + Sun Dec 31 17:32:01 1995 + Mon Jan 01 17:32:01 1996 + Wed Feb 28 17:32:01 1996 + Fri Mar 01 17:32:01 1996 + Mon Dec 30 17:32:01 1996 + Tue Dec 31 17:32:01 1996 + Thu Dec 31 17:32:01 1998 + Fri Jan 01 17:32:01 1999 + Fri Dec 31 17:32:01 1999 + Sat Jan 01 17:32:01 2000 +(65 rows) + +SELECT timestamp with time zone '1996-03-01' - interval '1 second' AS "Feb 29"; + Feb 29 +------------------------------ + Thu Feb 29 23:59:59 1996 PST +(1 row) + +SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28"; + Feb 28 +------------------------------ + Sun Feb 28 23:59:59 1999 PST +(1 row) + +SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29"; + Feb 29 +------------------------------ + Tue Feb 29 23:59:59 2000 PST +(1 row) + +SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; + Dec 31 +------------------------------ + Fri Dec 31 23:59:59 1999 PST +(1 row) + +SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp with time zone 'tomorrow' = (timestamp with time zone 'yesterday' + interval '2 days')) as "True"; + True +------ + t +(1 row) + +SELECT (timestamp with time zone 'tomorrow' > 'now') as "True"; + True +------ + t +(1 row) + +-- timestamp with time zone, interval arithmetic around DST change +-- (just for fun, let's use an intentionally nonstandard POSIX zone spec) +SET TIME ZONE 'CST7CDT,M4.1.0,M10.5.0'; +SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' as "Apr 3, 12:00"; + Apr 3, 12:00 +------------------------------ + Sun Apr 03 12:00:00 2005 CDT +(1 row) + +SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '24 hours' as "Apr 3, 13:00"; + Apr 3, 13:00 +------------------------------ + Sun Apr 03 13:00:00 2005 CDT +(1 row) + +SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '1 day' as "Apr 2, 12:00"; + Apr 2, 12:00 +------------------------------ + Sat Apr 02 12:00:00 2005 CST +(1 row) + +SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '24 hours' as "Apr 2, 11:00"; + Apr 2, 11:00 +------------------------------ + Sat Apr 02 11:00:00 2005 CST +(1 row) + +RESET TIME ZONE; +SELECT timestamptz(date '1994-01-01', time '11:00') AS "Jan_01_1994_10am"; + Jan_01_1994_10am +------------------------------ + Sat Jan 01 11:00:00 1994 PST +(1 row) + +SELECT timestamptz(date '1994-01-01', time '10:00') AS "Jan_01_1994_9am"; + Jan_01_1994_9am +------------------------------ + Sat Jan 01 10:00:00 1994 PST +(1 row) + +SELECT timestamptz(date '1994-01-01', time with time zone '11:00-8') AS "Jan_01_1994_11am"; + Jan_01_1994_11am +------------------------------ + Sat Jan 01 11:00:00 1994 PST +(1 row) + +SELECT timestamptz(date '1994-01-01', time with time zone '10:00-8') AS "Jan_01_1994_10am"; + Jan_01_1994_10am +------------------------------ + Sat Jan 01 10:00:00 1994 PST +(1 row) + +SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am"; + Jan_01_1994_8am +------------------------------ + Sat Jan 01 08:00:00 1994 PST +(1 row) + +SELECT d1 + interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; + one_year +--------------------------------- + -infinity + infinity + Thu Dec 31 16:00:00 1970 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:02 1998 PST + Tue Feb 10 17:32:01.4 1998 PST + Tue Feb 10 17:32:01.5 1998 PST + Tue Feb 10 17:32:01.6 1998 PST + Fri Jan 02 00:00:00 1998 PST + Fri Jan 02 03:04:05 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Wed Jun 10 17:32:01 1998 PDT + Sun Sep 22 18:19:20 2002 PDT + Thu Mar 15 08:14:01 2001 PST + Thu Mar 15 04:14:02 2001 PST + Thu Mar 15 02:14:03 2001 PST + Thu Mar 15 03:14:04 2001 PST + Thu Mar 15 01:14:05 2001 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:00 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 17:32:01 1998 PST + Tue Feb 10 09:32:01 1998 PST + Tue Feb 10 09:32:01 1998 PST + Tue Feb 10 09:32:01 1998 PST + Tue Feb 10 14:32:01 1998 PST + Fri Jul 10 14:32:01 1998 PDT + Wed Jun 10 18:32:01 1998 PDT + Tue Feb 10 17:32:01 1998 PST + Wed Feb 11 17:32:01 1998 PST + Thu Feb 12 17:32:01 1998 PST + Fri Feb 13 17:32:01 1998 PST + Sat Feb 14 17:32:01 1998 PST + Sun Feb 15 17:32:01 1998 PST + Mon Feb 16 17:32:01 1998 PST + Thu Feb 16 17:32:01 0096 PST BC + Sun Feb 16 17:32:01 0098 PST + Fri Feb 16 17:32:01 0598 PST + Wed Feb 16 17:32:01 1098 PST + Sun Feb 16 17:32:01 1698 PST + Fri Feb 16 17:32:01 1798 PST + Wed Feb 16 17:32:01 1898 PST + Mon Feb 16 17:32:01 1998 PST + Sun Feb 16 17:32:01 2098 PST + Fri Feb 28 17:32:01 1997 PST + Fri Feb 28 17:32:01 1997 PST + Sat Mar 01 17:32:01 1997 PST + Tue Dec 30 17:32:01 1997 PST + Wed Dec 31 17:32:01 1997 PST + Thu Jan 01 17:32:01 1998 PST + Sat Feb 28 17:32:01 1998 PST + Sun Mar 01 17:32:01 1998 PST + Wed Dec 30 17:32:01 1998 PST + Thu Dec 31 17:32:01 1998 PST + Sun Dec 31 17:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST + Mon Dec 31 17:32:01 2001 PST + Tue Jan 01 17:32:01 2002 PST +(66 rows) + +SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; + one_year +--------------------------------- + -infinity + infinity + Tue Dec 31 16:00:00 1968 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:02 1996 PST + Sat Feb 10 17:32:01.4 1996 PST + Sat Feb 10 17:32:01.5 1996 PST + Sat Feb 10 17:32:01.6 1996 PST + Tue Jan 02 00:00:00 1996 PST + Tue Jan 02 03:04:05 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Mon Jun 10 17:32:01 1996 PDT + Fri Sep 22 18:19:20 2000 PDT + Mon Mar 15 08:14:01 1999 PST + Mon Mar 15 04:14:02 1999 PST + Mon Mar 15 02:14:03 1999 PST + Mon Mar 15 03:14:04 1999 PST + Mon Mar 15 01:14:05 1999 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:00 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 17:32:01 1996 PST + Sat Feb 10 09:32:01 1996 PST + Sat Feb 10 09:32:01 1996 PST + Sat Feb 10 09:32:01 1996 PST + Sat Feb 10 14:32:01 1996 PST + Wed Jul 10 14:32:01 1996 PDT + Mon Jun 10 18:32:01 1996 PDT + Sat Feb 10 17:32:01 1996 PST + Sun Feb 11 17:32:01 1996 PST + Mon Feb 12 17:32:01 1996 PST + Tue Feb 13 17:32:01 1996 PST + Wed Feb 14 17:32:01 1996 PST + Thu Feb 15 17:32:01 1996 PST + Fri Feb 16 17:32:01 1996 PST + Mon Feb 16 17:32:01 0098 PST BC + Thu Feb 16 17:32:01 0096 PST + Tue Feb 16 17:32:01 0596 PST + Sun Feb 16 17:32:01 1096 PST + Thu Feb 16 17:32:01 1696 PST + Tue Feb 16 17:32:01 1796 PST + Sun Feb 16 17:32:01 1896 PST + Fri Feb 16 17:32:01 1996 PST + Thu Feb 16 17:32:01 2096 PST + Tue Feb 28 17:32:01 1995 PST + Tue Feb 28 17:32:01 1995 PST + Wed Mar 01 17:32:01 1995 PST + Sat Dec 30 17:32:01 1995 PST + Sun Dec 31 17:32:01 1995 PST + Mon Jan 01 17:32:01 1996 PST + Wed Feb 28 17:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST + Mon Dec 30 17:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST + Thu Dec 31 17:32:01 1998 PST + Fri Jan 01 17:32:01 1999 PST + Fri Dec 31 17:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST +(66 rows) + +-- +-- time, interval arithmetic +-- +SELECT CAST(time '01:02' AS interval) AS "+01:02"; + +01:02 +----------------- + @ 1 hour 2 mins +(1 row) + +SELECT CAST(interval '02:03' AS time) AS "02:03:00"; + 02:03:00 +---------- + 02:03:00 +(1 row) + +SELECT time '01:30' + interval '02:01' AS "03:31:00"; + 03:31:00 +---------- + 03:31:00 +(1 row) + +SELECT time '01:30' - interval '02:01' AS "23:29:00"; + 23:29:00 +---------- + 23:29:00 +(1 row) + +SELECT time '02:30' + interval '36:01' AS "14:31:00"; + 14:31:00 +---------- + 14:31:00 +(1 row) + +SELECT time '03:30' + interval '1 month 04:01' AS "07:31:00"; + 07:31:00 +---------- + 07:31:00 +(1 row) + +SELECT CAST(time with time zone '01:02-08' AS interval) AS "+00:01"; +ERROR: cannot cast type time with time zone to interval +LINE 1: SELECT CAST(time with time zone '01:02-08' AS interval) AS "... + ^ +SELECT CAST(interval '02:03' AS time with time zone) AS "02:03:00-08"; +ERROR: cannot cast type interval to time with time zone +LINE 1: SELECT CAST(interval '02:03' AS time with time zone) AS "02:... + ^ +SELECT time with time zone '01:30-08' - interval '02:01' AS "23:29:00-08"; + 23:29:00-08 +------------- + 23:29:00-08 +(1 row) + +SELECT time with time zone '02:30-08' + interval '36:01' AS "14:31:00-08"; + 14:31:00-08 +------------- + 14:31:00-08 +(1 row) + +-- These two tests cannot be used because they default to current timezone, +-- which may be either -08 or -07 depending on the time of year. +-- SELECT time with time zone '01:30' + interval '02:01' AS "03:31:00-08"; +-- SELECT time with time zone '03:30' + interval '1 month 04:01' AS "07:31:00-08"; +-- Try the following two tests instead, as a poor substitute +SELECT CAST(CAST(date 'today' + time with time zone '05:30' + + interval '02:01' AS time with time zone) AS time) AS "07:31:00"; + 07:31:00 +---------- + 07:31:00 +(1 row) + +SELECT CAST(cast(date 'today' + time with time zone '03:30' + + interval '1 month 04:01' as timestamp without time zone) AS time) AS "07:31:00"; + 07:31:00 +---------- + 07:31:00 +(1 row) + +SELECT t.d1 AS t, i.f1 AS i, t.d1 + i.f1 AS "add", t.d1 - i.f1 AS "subtract" + FROM TIMESTAMP_TBL t, INTERVAL_TBL i + WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01' + AND i.f1 BETWEEN '00:00' AND '23:00' + ORDER BY 1,2; + t | i | add | subtract +----------------------------+-----------+----------------------------+---------------------------- + Wed Feb 28 17:32:01 1996 | @ 1 min | Wed Feb 28 17:33:01 1996 | Wed Feb 28 17:31:01 1996 + Wed Feb 28 17:32:01 1996 | @ 5 hours | Wed Feb 28 22:32:01 1996 | Wed Feb 28 12:32:01 1996 + Thu Feb 29 17:32:01 1996 | @ 1 min | Thu Feb 29 17:33:01 1996 | Thu Feb 29 17:31:01 1996 + Thu Feb 29 17:32:01 1996 | @ 5 hours | Thu Feb 29 22:32:01 1996 | Thu Feb 29 12:32:01 1996 + Fri Mar 01 17:32:01 1996 | @ 1 min | Fri Mar 01 17:33:01 1996 | Fri Mar 01 17:31:01 1996 + Fri Mar 01 17:32:01 1996 | @ 5 hours | Fri Mar 01 22:32:01 1996 | Fri Mar 01 12:32:01 1996 + Mon Dec 30 17:32:01 1996 | @ 1 min | Mon Dec 30 17:33:01 1996 | Mon Dec 30 17:31:01 1996 + Mon Dec 30 17:32:01 1996 | @ 5 hours | Mon Dec 30 22:32:01 1996 | Mon Dec 30 12:32:01 1996 + Tue Dec 31 17:32:01 1996 | @ 1 min | Tue Dec 31 17:33:01 1996 | Tue Dec 31 17:31:01 1996 + Tue Dec 31 17:32:01 1996 | @ 5 hours | Tue Dec 31 22:32:01 1996 | Tue Dec 31 12:32:01 1996 + Wed Jan 01 17:32:01 1997 | @ 1 min | Wed Jan 01 17:33:01 1997 | Wed Jan 01 17:31:01 1997 + Wed Jan 01 17:32:01 1997 | @ 5 hours | Wed Jan 01 22:32:01 1997 | Wed Jan 01 12:32:01 1997 + Thu Jan 02 00:00:00 1997 | @ 1 min | Thu Jan 02 00:01:00 1997 | Wed Jan 01 23:59:00 1997 + Thu Jan 02 00:00:00 1997 | @ 5 hours | Thu Jan 02 05:00:00 1997 | Wed Jan 01 19:00:00 1997 + Thu Jan 02 03:04:05 1997 | @ 1 min | Thu Jan 02 03:05:05 1997 | Thu Jan 02 03:03:05 1997 + Thu Jan 02 03:04:05 1997 | @ 5 hours | Thu Jan 02 08:04:05 1997 | Wed Jan 01 22:04:05 1997 + Mon Feb 10 17:32:00 1997 | @ 1 min | Mon Feb 10 17:33:00 1997 | Mon Feb 10 17:31:00 1997 + Mon Feb 10 17:32:00 1997 | @ 5 hours | Mon Feb 10 22:32:00 1997 | Mon Feb 10 12:32:00 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 + Mon Feb 10 17:32:01.4 1997 | @ 1 min | Mon Feb 10 17:33:01.4 1997 | Mon Feb 10 17:31:01.4 1997 + Mon Feb 10 17:32:01.4 1997 | @ 5 hours | Mon Feb 10 22:32:01.4 1997 | Mon Feb 10 12:32:01.4 1997 + Mon Feb 10 17:32:01.5 1997 | @ 1 min | Mon Feb 10 17:33:01.5 1997 | Mon Feb 10 17:31:01.5 1997 + Mon Feb 10 17:32:01.5 1997 | @ 5 hours | Mon Feb 10 22:32:01.5 1997 | Mon Feb 10 12:32:01.5 1997 + Mon Feb 10 17:32:01.6 1997 | @ 1 min | Mon Feb 10 17:33:01.6 1997 | Mon Feb 10 17:31:01.6 1997 + Mon Feb 10 17:32:01.6 1997 | @ 5 hours | Mon Feb 10 22:32:01.6 1997 | Mon Feb 10 12:32:01.6 1997 + Mon Feb 10 17:32:02 1997 | @ 1 min | Mon Feb 10 17:33:02 1997 | Mon Feb 10 17:31:02 1997 + Mon Feb 10 17:32:02 1997 | @ 5 hours | Mon Feb 10 22:32:02 1997 | Mon Feb 10 12:32:02 1997 + Tue Feb 11 17:32:01 1997 | @ 1 min | Tue Feb 11 17:33:01 1997 | Tue Feb 11 17:31:01 1997 + Tue Feb 11 17:32:01 1997 | @ 5 hours | Tue Feb 11 22:32:01 1997 | Tue Feb 11 12:32:01 1997 + Wed Feb 12 17:32:01 1997 | @ 1 min | Wed Feb 12 17:33:01 1997 | Wed Feb 12 17:31:01 1997 + Wed Feb 12 17:32:01 1997 | @ 5 hours | Wed Feb 12 22:32:01 1997 | Wed Feb 12 12:32:01 1997 + Thu Feb 13 17:32:01 1997 | @ 1 min | Thu Feb 13 17:33:01 1997 | Thu Feb 13 17:31:01 1997 + Thu Feb 13 17:32:01 1997 | @ 5 hours | Thu Feb 13 22:32:01 1997 | Thu Feb 13 12:32:01 1997 + Fri Feb 14 17:32:01 1997 | @ 1 min | Fri Feb 14 17:33:01 1997 | Fri Feb 14 17:31:01 1997 + Fri Feb 14 17:32:01 1997 | @ 5 hours | Fri Feb 14 22:32:01 1997 | Fri Feb 14 12:32:01 1997 + Sat Feb 15 17:32:01 1997 | @ 1 min | Sat Feb 15 17:33:01 1997 | Sat Feb 15 17:31:01 1997 + Sat Feb 15 17:32:01 1997 | @ 5 hours | Sat Feb 15 22:32:01 1997 | Sat Feb 15 12:32:01 1997 + Sun Feb 16 17:32:01 1997 | @ 1 min | Sun Feb 16 17:33:01 1997 | Sun Feb 16 17:31:01 1997 + Sun Feb 16 17:32:01 1997 | @ 1 min | Sun Feb 16 17:33:01 1997 | Sun Feb 16 17:31:01 1997 + Sun Feb 16 17:32:01 1997 | @ 5 hours | Sun Feb 16 22:32:01 1997 | Sun Feb 16 12:32:01 1997 + Sun Feb 16 17:32:01 1997 | @ 5 hours | Sun Feb 16 22:32:01 1997 | Sun Feb 16 12:32:01 1997 + Fri Feb 28 17:32:01 1997 | @ 1 min | Fri Feb 28 17:33:01 1997 | Fri Feb 28 17:31:01 1997 + Fri Feb 28 17:32:01 1997 | @ 5 hours | Fri Feb 28 22:32:01 1997 | Fri Feb 28 12:32:01 1997 + Sat Mar 01 17:32:01 1997 | @ 1 min | Sat Mar 01 17:33:01 1997 | Sat Mar 01 17:31:01 1997 + Sat Mar 01 17:32:01 1997 | @ 5 hours | Sat Mar 01 22:32:01 1997 | Sat Mar 01 12:32:01 1997 + Tue Jun 10 17:32:01 1997 | @ 1 min | Tue Jun 10 17:33:01 1997 | Tue Jun 10 17:31:01 1997 + Tue Jun 10 17:32:01 1997 | @ 5 hours | Tue Jun 10 22:32:01 1997 | Tue Jun 10 12:32:01 1997 + Tue Jun 10 18:32:01 1997 | @ 1 min | Tue Jun 10 18:33:01 1997 | Tue Jun 10 18:31:01 1997 + Tue Jun 10 18:32:01 1997 | @ 5 hours | Tue Jun 10 23:32:01 1997 | Tue Jun 10 13:32:01 1997 + Tue Dec 30 17:32:01 1997 | @ 1 min | Tue Dec 30 17:33:01 1997 | Tue Dec 30 17:31:01 1997 + Tue Dec 30 17:32:01 1997 | @ 5 hours | Tue Dec 30 22:32:01 1997 | Tue Dec 30 12:32:01 1997 + Wed Dec 31 17:32:01 1997 | @ 1 min | Wed Dec 31 17:33:01 1997 | Wed Dec 31 17:31:01 1997 + Wed Dec 31 17:32:01 1997 | @ 5 hours | Wed Dec 31 22:32:01 1997 | Wed Dec 31 12:32:01 1997 + Fri Dec 31 17:32:01 1999 | @ 1 min | Fri Dec 31 17:33:01 1999 | Fri Dec 31 17:31:01 1999 + Fri Dec 31 17:32:01 1999 | @ 5 hours | Fri Dec 31 22:32:01 1999 | Fri Dec 31 12:32:01 1999 + Sat Jan 01 17:32:01 2000 | @ 1 min | Sat Jan 01 17:33:01 2000 | Sat Jan 01 17:31:01 2000 + Sat Jan 01 17:32:01 2000 | @ 5 hours | Sat Jan 01 22:32:01 2000 | Sat Jan 01 12:32:01 2000 + Wed Mar 15 02:14:05 2000 | @ 1 min | Wed Mar 15 02:15:05 2000 | Wed Mar 15 02:13:05 2000 + Wed Mar 15 02:14:05 2000 | @ 5 hours | Wed Mar 15 07:14:05 2000 | Tue Mar 14 21:14:05 2000 + Wed Mar 15 03:14:04 2000 | @ 1 min | Wed Mar 15 03:15:04 2000 | Wed Mar 15 03:13:04 2000 + Wed Mar 15 03:14:04 2000 | @ 5 hours | Wed Mar 15 08:14:04 2000 | Tue Mar 14 22:14:04 2000 + Wed Mar 15 08:14:01 2000 | @ 1 min | Wed Mar 15 08:15:01 2000 | Wed Mar 15 08:13:01 2000 + Wed Mar 15 08:14:01 2000 | @ 5 hours | Wed Mar 15 13:14:01 2000 | Wed Mar 15 03:14:01 2000 + Wed Mar 15 12:14:03 2000 | @ 1 min | Wed Mar 15 12:15:03 2000 | Wed Mar 15 12:13:03 2000 + Wed Mar 15 12:14:03 2000 | @ 5 hours | Wed Mar 15 17:14:03 2000 | Wed Mar 15 07:14:03 2000 + Wed Mar 15 13:14:02 2000 | @ 1 min | Wed Mar 15 13:15:02 2000 | Wed Mar 15 13:13:02 2000 + Wed Mar 15 13:14:02 2000 | @ 5 hours | Wed Mar 15 18:14:02 2000 | Wed Mar 15 08:14:02 2000 + Sun Dec 31 17:32:01 2000 | @ 1 min | Sun Dec 31 17:33:01 2000 | Sun Dec 31 17:31:01 2000 + Sun Dec 31 17:32:01 2000 | @ 5 hours | Sun Dec 31 22:32:01 2000 | Sun Dec 31 12:32:01 2000 +(104 rows) + +SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" + FROM TIME_TBL t, INTERVAL_TBL i + ORDER BY 1,2; + t | i | add | subtract +-------------+-------------------------------+-------------+------------- + 00:00:00 | @ 14 secs ago | 23:59:46 | 00:00:14 + 00:00:00 | @ 1 min | 00:01:00 | 23:59:00 + 00:00:00 | @ 5 hours | 05:00:00 | 19:00:00 + 00:00:00 | @ 1 day 2 hours 3 mins 4 secs | 02:03:04 | 21:56:56 + 00:00:00 | @ 10 days | 00:00:00 | 00:00:00 + 00:00:00 | @ 3 mons | 00:00:00 | 00:00:00 + 00:00:00 | @ 5 mons | 00:00:00 | 00:00:00 + 00:00:00 | @ 5 mons 12 hours | 12:00:00 | 12:00:00 + 00:00:00 | @ 6 years | 00:00:00 | 00:00:00 + 00:00:00 | @ 34 years | 00:00:00 | 00:00:00 + 01:00:00 | @ 14 secs ago | 00:59:46 | 01:00:14 + 01:00:00 | @ 1 min | 01:01:00 | 00:59:00 + 01:00:00 | @ 5 hours | 06:00:00 | 20:00:00 + 01:00:00 | @ 1 day 2 hours 3 mins 4 secs | 03:03:04 | 22:56:56 + 01:00:00 | @ 10 days | 01:00:00 | 01:00:00 + 01:00:00 | @ 3 mons | 01:00:00 | 01:00:00 + 01:00:00 | @ 5 mons | 01:00:00 | 01:00:00 + 01:00:00 | @ 5 mons 12 hours | 13:00:00 | 13:00:00 + 01:00:00 | @ 6 years | 01:00:00 | 01:00:00 + 01:00:00 | @ 34 years | 01:00:00 | 01:00:00 + 02:03:00 | @ 14 secs ago | 02:02:46 | 02:03:14 + 02:03:00 | @ 1 min | 02:04:00 | 02:02:00 + 02:03:00 | @ 5 hours | 07:03:00 | 21:03:00 + 02:03:00 | @ 1 day 2 hours 3 mins 4 secs | 04:06:04 | 23:59:56 + 02:03:00 | @ 10 days | 02:03:00 | 02:03:00 + 02:03:00 | @ 3 mons | 02:03:00 | 02:03:00 + 02:03:00 | @ 5 mons | 02:03:00 | 02:03:00 + 02:03:00 | @ 5 mons 12 hours | 14:03:00 | 14:03:00 + 02:03:00 | @ 6 years | 02:03:00 | 02:03:00 + 02:03:00 | @ 34 years | 02:03:00 | 02:03:00 + 11:59:00 | @ 14 secs ago | 11:58:46 | 11:59:14 + 11:59:00 | @ 1 min | 12:00:00 | 11:58:00 + 11:59:00 | @ 5 hours | 16:59:00 | 06:59:00 + 11:59:00 | @ 1 day 2 hours 3 mins 4 secs | 14:02:04 | 09:55:56 + 11:59:00 | @ 10 days | 11:59:00 | 11:59:00 + 11:59:00 | @ 3 mons | 11:59:00 | 11:59:00 + 11:59:00 | @ 5 mons | 11:59:00 | 11:59:00 + 11:59:00 | @ 5 mons 12 hours | 23:59:00 | 23:59:00 + 11:59:00 | @ 6 years | 11:59:00 | 11:59:00 + 11:59:00 | @ 34 years | 11:59:00 | 11:59:00 + 12:00:00 | @ 14 secs ago | 11:59:46 | 12:00:14 + 12:00:00 | @ 1 min | 12:01:00 | 11:59:00 + 12:00:00 | @ 5 hours | 17:00:00 | 07:00:00 + 12:00:00 | @ 1 day 2 hours 3 mins 4 secs | 14:03:04 | 09:56:56 + 12:00:00 | @ 10 days | 12:00:00 | 12:00:00 + 12:00:00 | @ 3 mons | 12:00:00 | 12:00:00 + 12:00:00 | @ 5 mons | 12:00:00 | 12:00:00 + 12:00:00 | @ 5 mons 12 hours | 00:00:00 | 00:00:00 + 12:00:00 | @ 6 years | 12:00:00 | 12:00:00 + 12:00:00 | @ 34 years | 12:00:00 | 12:00:00 + 12:01:00 | @ 14 secs ago | 12:00:46 | 12:01:14 + 12:01:00 | @ 1 min | 12:02:00 | 12:00:00 + 12:01:00 | @ 5 hours | 17:01:00 | 07:01:00 + 12:01:00 | @ 1 day 2 hours 3 mins 4 secs | 14:04:04 | 09:57:56 + 12:01:00 | @ 10 days | 12:01:00 | 12:01:00 + 12:01:00 | @ 3 mons | 12:01:00 | 12:01:00 + 12:01:00 | @ 5 mons | 12:01:00 | 12:01:00 + 12:01:00 | @ 5 mons 12 hours | 00:01:00 | 00:01:00 + 12:01:00 | @ 6 years | 12:01:00 | 12:01:00 + 12:01:00 | @ 34 years | 12:01:00 | 12:01:00 + 15:36:39 | @ 14 secs ago | 15:36:25 | 15:36:53 + 15:36:39 | @ 14 secs ago | 15:36:25 | 15:36:53 + 15:36:39 | @ 1 min | 15:37:39 | 15:35:39 + 15:36:39 | @ 1 min | 15:37:39 | 15:35:39 + 15:36:39 | @ 5 hours | 20:36:39 | 10:36:39 + 15:36:39 | @ 5 hours | 20:36:39 | 10:36:39 + 15:36:39 | @ 1 day 2 hours 3 mins 4 secs | 17:39:43 | 13:33:35 + 15:36:39 | @ 1 day 2 hours 3 mins 4 secs | 17:39:43 | 13:33:35 + 15:36:39 | @ 10 days | 15:36:39 | 15:36:39 + 15:36:39 | @ 10 days | 15:36:39 | 15:36:39 + 15:36:39 | @ 3 mons | 15:36:39 | 15:36:39 + 15:36:39 | @ 3 mons | 15:36:39 | 15:36:39 + 15:36:39 | @ 5 mons | 15:36:39 | 15:36:39 + 15:36:39 | @ 5 mons | 15:36:39 | 15:36:39 + 15:36:39 | @ 5 mons 12 hours | 03:36:39 | 03:36:39 + 15:36:39 | @ 5 mons 12 hours | 03:36:39 | 03:36:39 + 15:36:39 | @ 6 years | 15:36:39 | 15:36:39 + 15:36:39 | @ 6 years | 15:36:39 | 15:36:39 + 15:36:39 | @ 34 years | 15:36:39 | 15:36:39 + 15:36:39 | @ 34 years | 15:36:39 | 15:36:39 + 23:59:00 | @ 14 secs ago | 23:58:46 | 23:59:14 + 23:59:00 | @ 1 min | 00:00:00 | 23:58:00 + 23:59:00 | @ 5 hours | 04:59:00 | 18:59:00 + 23:59:00 | @ 1 day 2 hours 3 mins 4 secs | 02:02:04 | 21:55:56 + 23:59:00 | @ 10 days | 23:59:00 | 23:59:00 + 23:59:00 | @ 3 mons | 23:59:00 | 23:59:00 + 23:59:00 | @ 5 mons | 23:59:00 | 23:59:00 + 23:59:00 | @ 5 mons 12 hours | 11:59:00 | 11:59:00 + 23:59:00 | @ 6 years | 23:59:00 | 23:59:00 + 23:59:00 | @ 34 years | 23:59:00 | 23:59:00 + 23:59:59.99 | @ 14 secs ago | 23:59:45.99 | 00:00:13.99 + 23:59:59.99 | @ 1 min | 00:00:59.99 | 23:58:59.99 + 23:59:59.99 | @ 5 hours | 04:59:59.99 | 18:59:59.99 + 23:59:59.99 | @ 1 day 2 hours 3 mins 4 secs | 02:03:03.99 | 21:56:55.99 + 23:59:59.99 | @ 10 days | 23:59:59.99 | 23:59:59.99 + 23:59:59.99 | @ 3 mons | 23:59:59.99 | 23:59:59.99 + 23:59:59.99 | @ 5 mons | 23:59:59.99 | 23:59:59.99 + 23:59:59.99 | @ 5 mons 12 hours | 11:59:59.99 | 11:59:59.99 + 23:59:59.99 | @ 6 years | 23:59:59.99 | 23:59:59.99 + 23:59:59.99 | @ 34 years | 23:59:59.99 | 23:59:59.99 +(100 rows) + +SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" + FROM TIMETZ_TBL t, INTERVAL_TBL i + ORDER BY 1,2; + t | i | add | subtract +----------------+-------------------------------+----------------+---------------- + 00:01:00-07 | @ 14 secs ago | 00:00:46-07 | 00:01:14-07 + 00:01:00-07 | @ 1 min | 00:02:00-07 | 00:00:00-07 + 00:01:00-07 | @ 5 hours | 05:01:00-07 | 19:01:00-07 + 00:01:00-07 | @ 1 day 2 hours 3 mins 4 secs | 02:04:04-07 | 21:57:56-07 + 00:01:00-07 | @ 10 days | 00:01:00-07 | 00:01:00-07 + 00:01:00-07 | @ 3 mons | 00:01:00-07 | 00:01:00-07 + 00:01:00-07 | @ 5 mons | 00:01:00-07 | 00:01:00-07 + 00:01:00-07 | @ 5 mons 12 hours | 12:01:00-07 | 12:01:00-07 + 00:01:00-07 | @ 6 years | 00:01:00-07 | 00:01:00-07 + 00:01:00-07 | @ 34 years | 00:01:00-07 | 00:01:00-07 + 01:00:00-07 | @ 14 secs ago | 00:59:46-07 | 01:00:14-07 + 01:00:00-07 | @ 1 min | 01:01:00-07 | 00:59:00-07 + 01:00:00-07 | @ 5 hours | 06:00:00-07 | 20:00:00-07 + 01:00:00-07 | @ 1 day 2 hours 3 mins 4 secs | 03:03:04-07 | 22:56:56-07 + 01:00:00-07 | @ 10 days | 01:00:00-07 | 01:00:00-07 + 01:00:00-07 | @ 3 mons | 01:00:00-07 | 01:00:00-07 + 01:00:00-07 | @ 5 mons | 01:00:00-07 | 01:00:00-07 + 01:00:00-07 | @ 5 mons 12 hours | 13:00:00-07 | 13:00:00-07 + 01:00:00-07 | @ 6 years | 01:00:00-07 | 01:00:00-07 + 01:00:00-07 | @ 34 years | 01:00:00-07 | 01:00:00-07 + 02:03:00-07 | @ 14 secs ago | 02:02:46-07 | 02:03:14-07 + 02:03:00-07 | @ 1 min | 02:04:00-07 | 02:02:00-07 + 02:03:00-07 | @ 5 hours | 07:03:00-07 | 21:03:00-07 + 02:03:00-07 | @ 1 day 2 hours 3 mins 4 secs | 04:06:04-07 | 23:59:56-07 + 02:03:00-07 | @ 10 days | 02:03:00-07 | 02:03:00-07 + 02:03:00-07 | @ 3 mons | 02:03:00-07 | 02:03:00-07 + 02:03:00-07 | @ 5 mons | 02:03:00-07 | 02:03:00-07 + 02:03:00-07 | @ 5 mons 12 hours | 14:03:00-07 | 14:03:00-07 + 02:03:00-07 | @ 6 years | 02:03:00-07 | 02:03:00-07 + 02:03:00-07 | @ 34 years | 02:03:00-07 | 02:03:00-07 + 08:08:00-04 | @ 14 secs ago | 08:07:46-04 | 08:08:14-04 + 08:08:00-04 | @ 1 min | 08:09:00-04 | 08:07:00-04 + 08:08:00-04 | @ 5 hours | 13:08:00-04 | 03:08:00-04 + 08:08:00-04 | @ 1 day 2 hours 3 mins 4 secs | 10:11:04-04 | 06:04:56-04 + 08:08:00-04 | @ 10 days | 08:08:00-04 | 08:08:00-04 + 08:08:00-04 | @ 3 mons | 08:08:00-04 | 08:08:00-04 + 08:08:00-04 | @ 5 mons | 08:08:00-04 | 08:08:00-04 + 08:08:00-04 | @ 5 mons 12 hours | 20:08:00-04 | 20:08:00-04 + 08:08:00-04 | @ 6 years | 08:08:00-04 | 08:08:00-04 + 08:08:00-04 | @ 34 years | 08:08:00-04 | 08:08:00-04 + 07:07:00-08 | @ 14 secs ago | 07:06:46-08 | 07:07:14-08 + 07:07:00-08 | @ 1 min | 07:08:00-08 | 07:06:00-08 + 07:07:00-08 | @ 5 hours | 12:07:00-08 | 02:07:00-08 + 07:07:00-08 | @ 1 day 2 hours 3 mins 4 secs | 09:10:04-08 | 05:03:56-08 + 07:07:00-08 | @ 10 days | 07:07:00-08 | 07:07:00-08 + 07:07:00-08 | @ 3 mons | 07:07:00-08 | 07:07:00-08 + 07:07:00-08 | @ 5 mons | 07:07:00-08 | 07:07:00-08 + 07:07:00-08 | @ 5 mons 12 hours | 19:07:00-08 | 19:07:00-08 + 07:07:00-08 | @ 6 years | 07:07:00-08 | 07:07:00-08 + 07:07:00-08 | @ 34 years | 07:07:00-08 | 07:07:00-08 + 11:59:00-07 | @ 14 secs ago | 11:58:46-07 | 11:59:14-07 + 11:59:00-07 | @ 1 min | 12:00:00-07 | 11:58:00-07 + 11:59:00-07 | @ 5 hours | 16:59:00-07 | 06:59:00-07 + 11:59:00-07 | @ 1 day 2 hours 3 mins 4 secs | 14:02:04-07 | 09:55:56-07 + 11:59:00-07 | @ 10 days | 11:59:00-07 | 11:59:00-07 + 11:59:00-07 | @ 3 mons | 11:59:00-07 | 11:59:00-07 + 11:59:00-07 | @ 5 mons | 11:59:00-07 | 11:59:00-07 + 11:59:00-07 | @ 5 mons 12 hours | 23:59:00-07 | 23:59:00-07 + 11:59:00-07 | @ 6 years | 11:59:00-07 | 11:59:00-07 + 11:59:00-07 | @ 34 years | 11:59:00-07 | 11:59:00-07 + 12:00:00-07 | @ 14 secs ago | 11:59:46-07 | 12:00:14-07 + 12:00:00-07 | @ 1 min | 12:01:00-07 | 11:59:00-07 + 12:00:00-07 | @ 5 hours | 17:00:00-07 | 07:00:00-07 + 12:00:00-07 | @ 1 day 2 hours 3 mins 4 secs | 14:03:04-07 | 09:56:56-07 + 12:00:00-07 | @ 10 days | 12:00:00-07 | 12:00:00-07 + 12:00:00-07 | @ 3 mons | 12:00:00-07 | 12:00:00-07 + 12:00:00-07 | @ 5 mons | 12:00:00-07 | 12:00:00-07 + 12:00:00-07 | @ 5 mons 12 hours | 00:00:00-07 | 00:00:00-07 + 12:00:00-07 | @ 6 years | 12:00:00-07 | 12:00:00-07 + 12:00:00-07 | @ 34 years | 12:00:00-07 | 12:00:00-07 + 12:01:00-07 | @ 14 secs ago | 12:00:46-07 | 12:01:14-07 + 12:01:00-07 | @ 1 min | 12:02:00-07 | 12:00:00-07 + 12:01:00-07 | @ 5 hours | 17:01:00-07 | 07:01:00-07 + 12:01:00-07 | @ 1 day 2 hours 3 mins 4 secs | 14:04:04-07 | 09:57:56-07 + 12:01:00-07 | @ 10 days | 12:01:00-07 | 12:01:00-07 + 12:01:00-07 | @ 3 mons | 12:01:00-07 | 12:01:00-07 + 12:01:00-07 | @ 5 mons | 12:01:00-07 | 12:01:00-07 + 12:01:00-07 | @ 5 mons 12 hours | 00:01:00-07 | 00:01:00-07 + 12:01:00-07 | @ 6 years | 12:01:00-07 | 12:01:00-07 + 12:01:00-07 | @ 34 years | 12:01:00-07 | 12:01:00-07 + 15:36:39-04 | @ 14 secs ago | 15:36:25-04 | 15:36:53-04 + 15:36:39-04 | @ 1 min | 15:37:39-04 | 15:35:39-04 + 15:36:39-04 | @ 5 hours | 20:36:39-04 | 10:36:39-04 + 15:36:39-04 | @ 1 day 2 hours 3 mins 4 secs | 17:39:43-04 | 13:33:35-04 + 15:36:39-04 | @ 10 days | 15:36:39-04 | 15:36:39-04 + 15:36:39-04 | @ 3 mons | 15:36:39-04 | 15:36:39-04 + 15:36:39-04 | @ 5 mons | 15:36:39-04 | 15:36:39-04 + 15:36:39-04 | @ 5 mons 12 hours | 03:36:39-04 | 03:36:39-04 + 15:36:39-04 | @ 6 years | 15:36:39-04 | 15:36:39-04 + 15:36:39-04 | @ 34 years | 15:36:39-04 | 15:36:39-04 + 15:36:39-05 | @ 14 secs ago | 15:36:25-05 | 15:36:53-05 + 15:36:39-05 | @ 1 min | 15:37:39-05 | 15:35:39-05 + 15:36:39-05 | @ 5 hours | 20:36:39-05 | 10:36:39-05 + 15:36:39-05 | @ 1 day 2 hours 3 mins 4 secs | 17:39:43-05 | 13:33:35-05 + 15:36:39-05 | @ 10 days | 15:36:39-05 | 15:36:39-05 + 15:36:39-05 | @ 3 mons | 15:36:39-05 | 15:36:39-05 + 15:36:39-05 | @ 5 mons | 15:36:39-05 | 15:36:39-05 + 15:36:39-05 | @ 5 mons 12 hours | 03:36:39-05 | 03:36:39-05 + 15:36:39-05 | @ 6 years | 15:36:39-05 | 15:36:39-05 + 15:36:39-05 | @ 34 years | 15:36:39-05 | 15:36:39-05 + 23:59:00-07 | @ 14 secs ago | 23:58:46-07 | 23:59:14-07 + 23:59:00-07 | @ 1 min | 00:00:00-07 | 23:58:00-07 + 23:59:00-07 | @ 5 hours | 04:59:00-07 | 18:59:00-07 + 23:59:00-07 | @ 1 day 2 hours 3 mins 4 secs | 02:02:04-07 | 21:55:56-07 + 23:59:00-07 | @ 10 days | 23:59:00-07 | 23:59:00-07 + 23:59:00-07 | @ 3 mons | 23:59:00-07 | 23:59:00-07 + 23:59:00-07 | @ 5 mons | 23:59:00-07 | 23:59:00-07 + 23:59:00-07 | @ 5 mons 12 hours | 11:59:00-07 | 11:59:00-07 + 23:59:00-07 | @ 6 years | 23:59:00-07 | 23:59:00-07 + 23:59:00-07 | @ 34 years | 23:59:00-07 | 23:59:00-07 + 23:59:59.99-07 | @ 14 secs ago | 23:59:45.99-07 | 00:00:13.99-07 + 23:59:59.99-07 | @ 1 min | 00:00:59.99-07 | 23:58:59.99-07 + 23:59:59.99-07 | @ 5 hours | 04:59:59.99-07 | 18:59:59.99-07 + 23:59:59.99-07 | @ 1 day 2 hours 3 mins 4 secs | 02:03:03.99-07 | 21:56:55.99-07 + 23:59:59.99-07 | @ 10 days | 23:59:59.99-07 | 23:59:59.99-07 + 23:59:59.99-07 | @ 3 mons | 23:59:59.99-07 | 23:59:59.99-07 + 23:59:59.99-07 | @ 5 mons | 23:59:59.99-07 | 23:59:59.99-07 + 23:59:59.99-07 | @ 5 mons 12 hours | 11:59:59.99-07 | 11:59:59.99-07 + 23:59:59.99-07 | @ 6 years | 23:59:59.99-07 | 23:59:59.99-07 + 23:59:59.99-07 | @ 34 years | 23:59:59.99-07 | 23:59:59.99-07 +(120 rows) + +-- SQL9x OVERLAPS operator +-- test with time zone +SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "True"; + True +------ + t +(1 row) + +SELECT (timestamp with time zone '2000-11-26', timestamp with time zone '2000-11-27') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False"; + False +------- + f +(1 row) + +SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '1 day') AS "True"; + True +------ + t +(1 row) + +SELECT (timestamp with time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False"; + False +------- + f +(1 row) + +SELECT (timestamp with time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp with time zone '2000-11-27', interval '12 hours') AS "True"; + True +------ + t +(1 row) + +SELECT (timestamp with time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '12 hours') AS "False"; + False +------- + f +(1 row) + +-- test without time zone +SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone '2000-11-26', timestamp without time zone '2000-11-27') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False"; + False +------- + f +(1 row) + +SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '1 day') AS "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False"; + False +------- + f +(1 row) + +SELECT (timestamp without time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp without time zone '2000-11-27', interval '12 hours') AS "True"; + True +------ + t +(1 row) + +SELECT (timestamp without time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '12 hours') AS "False"; + False +------- + f +(1 row) + +-- test time and interval +SELECT (time '00:00', time '01:00') + OVERLAPS (time '00:30', time '01:30') AS "True"; + True +------ + t +(1 row) + +SELECT (time '00:00', interval '1 hour') + OVERLAPS (time '00:30', interval '1 hour') AS "True"; + True +------ + t +(1 row) + +SELECT (time '00:00', interval '1 hour') + OVERLAPS (time '01:30', interval '1 hour') AS "False"; + False +------- + f +(1 row) + +-- SQL99 seems to want this to be false (and we conform to the spec). +-- istm that this *should* return true, on the theory that time +-- intervals can wrap around the day boundary - thomas 2001-09-25 +SELECT (time '00:00', interval '1 hour') + OVERLAPS (time '01:30', interval '1 day') AS "False"; + False +------- + f +(1 row) + +CREATE TABLE TEMP_TIMESTAMP (f1 timestamp with time zone); +-- get some candidate input values +INSERT INTO TEMP_TIMESTAMP (f1) + SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 BETWEEN '13-jun-1957' AND '1-jan-1997' + OR d1 BETWEEN '1-jan-1999' AND '1-jan-2010'; +SELECT f1 AS "timestamp" + FROM TEMP_TIMESTAMP + ORDER BY "timestamp"; + timestamp +------------------------------ + Thu Jan 01 00:00:00 1970 PST + Wed Feb 28 17:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST + Mon Dec 30 17:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST + Fri Dec 31 17:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST + Wed Mar 15 02:14:05 2000 PST + Wed Mar 15 03:14:04 2000 PST + Wed Mar 15 08:14:01 2000 PST + Wed Mar 15 12:14:03 2000 PST + Wed Mar 15 13:14:02 2000 PST + Sun Dec 31 17:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST + Sat Sep 22 18:19:20 2001 PDT +(16 rows) + +SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus + FROM TEMP_TIMESTAMP d, INTERVAL_TBL t + ORDER BY plus, "timestamp", "interval"; + timestamp | interval | plus +------------------------------+-------------------------------+------------------------------ + Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago | Wed Dec 31 23:59:46 1969 PST + Thu Jan 01 00:00:00 1970 PST | @ 1 min | Thu Jan 01 00:01:00 1970 PST + Thu Jan 01 00:00:00 1970 PST | @ 5 hours | Thu Jan 01 05:00:00 1970 PST + Thu Jan 01 00:00:00 1970 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Jan 02 02:03:04 1970 PST + Thu Jan 01 00:00:00 1970 PST | @ 10 days | Sun Jan 11 00:00:00 1970 PST + Thu Jan 01 00:00:00 1970 PST | @ 3 mons | Wed Apr 01 00:00:00 1970 PST + Thu Jan 01 00:00:00 1970 PST | @ 5 mons | Mon Jun 01 00:00:00 1970 PDT + Thu Jan 01 00:00:00 1970 PST | @ 5 mons 12 hours | Mon Jun 01 12:00:00 1970 PDT + Thu Jan 01 00:00:00 1970 PST | @ 6 years | Thu Jan 01 00:00:00 1976 PST + Wed Feb 28 17:32:01 1996 PST | @ 14 secs ago | Wed Feb 28 17:31:47 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 1 min | Wed Feb 28 17:33:01 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 5 hours | Wed Feb 28 22:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 14 secs ago | Thu Feb 29 17:31:47 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 1 min | Thu Feb 29 17:33:01 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Feb 29 19:35:05 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 5 hours | Thu Feb 29 22:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 14 secs ago | Fri Mar 01 17:31:47 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 1 min | Fri Mar 01 17:33:01 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Mar 01 19:35:05 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 5 hours | Fri Mar 01 22:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Mar 02 19:35:05 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 10 days | Sat Mar 09 17:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 10 days | Sun Mar 10 17:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 10 days | Mon Mar 11 17:32:01 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 3 mons | Tue May 28 17:32:01 1996 PDT + Thu Feb 29 17:32:01 1996 PST | @ 3 mons | Wed May 29 17:32:01 1996 PDT + Fri Mar 01 17:32:01 1996 PST | @ 3 mons | Sat Jun 01 17:32:01 1996 PDT + Wed Feb 28 17:32:01 1996 PST | @ 5 mons | Sun Jul 28 17:32:01 1996 PDT + Wed Feb 28 17:32:01 1996 PST | @ 5 mons 12 hours | Mon Jul 29 05:32:01 1996 PDT + Thu Feb 29 17:32:01 1996 PST | @ 5 mons | Mon Jul 29 17:32:01 1996 PDT + Thu Feb 29 17:32:01 1996 PST | @ 5 mons 12 hours | Tue Jul 30 05:32:01 1996 PDT + Fri Mar 01 17:32:01 1996 PST | @ 5 mons | Thu Aug 01 17:32:01 1996 PDT + Fri Mar 01 17:32:01 1996 PST | @ 5 mons 12 hours | Fri Aug 02 05:32:01 1996 PDT + Mon Dec 30 17:32:01 1996 PST | @ 14 secs ago | Mon Dec 30 17:31:47 1996 PST + Mon Dec 30 17:32:01 1996 PST | @ 1 min | Mon Dec 30 17:33:01 1996 PST + Mon Dec 30 17:32:01 1996 PST | @ 5 hours | Mon Dec 30 22:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 14 secs ago | Tue Dec 31 17:31:47 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 1 min | Tue Dec 31 17:33:01 1996 PST + Mon Dec 30 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Dec 31 19:35:05 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 5 hours | Tue Dec 31 22:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Wed Jan 01 19:35:05 1997 PST + Mon Dec 30 17:32:01 1996 PST | @ 10 days | Thu Jan 09 17:32:01 1997 PST + Tue Dec 31 17:32:01 1996 PST | @ 10 days | Fri Jan 10 17:32:01 1997 PST + Mon Dec 30 17:32:01 1996 PST | @ 3 mons | Sun Mar 30 17:32:01 1997 PST + Tue Dec 31 17:32:01 1996 PST | @ 3 mons | Mon Mar 31 17:32:01 1997 PST + Mon Dec 30 17:32:01 1996 PST | @ 5 mons | Fri May 30 17:32:01 1997 PDT + Mon Dec 30 17:32:01 1996 PST | @ 5 mons 12 hours | Sat May 31 05:32:01 1997 PDT + Tue Dec 31 17:32:01 1996 PST | @ 5 mons | Sat May 31 17:32:01 1997 PDT + Tue Dec 31 17:32:01 1996 PST | @ 5 mons 12 hours | Sun Jun 01 05:32:01 1997 PDT + Fri Dec 31 17:32:01 1999 PST | @ 14 secs ago | Fri Dec 31 17:31:47 1999 PST + Fri Dec 31 17:32:01 1999 PST | @ 1 min | Fri Dec 31 17:33:01 1999 PST + Fri Dec 31 17:32:01 1999 PST | @ 5 hours | Fri Dec 31 22:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST | @ 14 secs ago | Sat Jan 01 17:31:47 2000 PST + Sat Jan 01 17:32:01 2000 PST | @ 1 min | Sat Jan 01 17:33:01 2000 PST + Fri Dec 31 17:32:01 1999 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Jan 01 19:35:05 2000 PST + Sat Jan 01 17:32:01 2000 PST | @ 5 hours | Sat Jan 01 22:32:01 2000 PST + Sat Jan 01 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Jan 02 19:35:05 2000 PST + Fri Dec 31 17:32:01 1999 PST | @ 10 days | Mon Jan 10 17:32:01 2000 PST + Sat Jan 01 17:32:01 2000 PST | @ 10 days | Tue Jan 11 17:32:01 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 14 secs ago | Wed Mar 15 02:13:51 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 1 min | Wed Mar 15 02:15:05 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 14 secs ago | Wed Mar 15 03:13:50 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 1 min | Wed Mar 15 03:15:04 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 5 hours | Wed Mar 15 07:14:05 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 14 secs ago | Wed Mar 15 08:13:47 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 5 hours | Wed Mar 15 08:14:04 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 1 min | Wed Mar 15 08:15:01 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 14 secs ago | Wed Mar 15 12:13:49 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 1 min | Wed Mar 15 12:15:03 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 14 secs ago | Wed Mar 15 13:13:48 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 5 hours | Wed Mar 15 13:14:01 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 1 min | Wed Mar 15 13:15:02 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 5 hours | Wed Mar 15 17:14:03 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 5 hours | Wed Mar 15 18:14:02 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 04:17:09 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 05:17:08 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 10:17:05 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 14:17:07 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 15:17:06 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 10 days | Sat Mar 25 02:14:05 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 10 days | Sat Mar 25 03:14:04 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 10 days | Sat Mar 25 08:14:01 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 10 days | Sat Mar 25 12:14:03 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 10 days | Sat Mar 25 13:14:02 2000 PST + Fri Dec 31 17:32:01 1999 PST | @ 3 mons | Fri Mar 31 17:32:01 2000 PST + Sat Jan 01 17:32:01 2000 PST | @ 3 mons | Sat Apr 01 17:32:01 2000 PST + Fri Dec 31 17:32:01 1999 PST | @ 5 mons | Wed May 31 17:32:01 2000 PDT + Fri Dec 31 17:32:01 1999 PST | @ 5 mons 12 hours | Thu Jun 01 05:32:01 2000 PDT + Sat Jan 01 17:32:01 2000 PST | @ 5 mons | Thu Jun 01 17:32:01 2000 PDT + Sat Jan 01 17:32:01 2000 PST | @ 5 mons 12 hours | Fri Jun 02 05:32:01 2000 PDT + Wed Mar 15 02:14:05 2000 PST | @ 3 mons | Thu Jun 15 02:14:05 2000 PDT + Wed Mar 15 03:14:04 2000 PST | @ 3 mons | Thu Jun 15 03:14:04 2000 PDT + Wed Mar 15 08:14:01 2000 PST | @ 3 mons | Thu Jun 15 08:14:01 2000 PDT + Wed Mar 15 12:14:03 2000 PST | @ 3 mons | Thu Jun 15 12:14:03 2000 PDT + Wed Mar 15 13:14:02 2000 PST | @ 3 mons | Thu Jun 15 13:14:02 2000 PDT + Wed Mar 15 02:14:05 2000 PST | @ 5 mons | Tue Aug 15 02:14:05 2000 PDT + Wed Mar 15 03:14:04 2000 PST | @ 5 mons | Tue Aug 15 03:14:04 2000 PDT + Wed Mar 15 08:14:01 2000 PST | @ 5 mons | Tue Aug 15 08:14:01 2000 PDT + Wed Mar 15 12:14:03 2000 PST | @ 5 mons | Tue Aug 15 12:14:03 2000 PDT + Wed Mar 15 13:14:02 2000 PST | @ 5 mons | Tue Aug 15 13:14:02 2000 PDT + Wed Mar 15 02:14:05 2000 PST | @ 5 mons 12 hours | Tue Aug 15 14:14:05 2000 PDT + Wed Mar 15 03:14:04 2000 PST | @ 5 mons 12 hours | Tue Aug 15 15:14:04 2000 PDT + Wed Mar 15 08:14:01 2000 PST | @ 5 mons 12 hours | Tue Aug 15 20:14:01 2000 PDT + Wed Mar 15 12:14:03 2000 PST | @ 5 mons 12 hours | Wed Aug 16 00:14:03 2000 PDT + Wed Mar 15 13:14:02 2000 PST | @ 5 mons 12 hours | Wed Aug 16 01:14:02 2000 PDT + Sun Dec 31 17:32:01 2000 PST | @ 14 secs ago | Sun Dec 31 17:31:47 2000 PST + Sun Dec 31 17:32:01 2000 PST | @ 1 min | Sun Dec 31 17:33:01 2000 PST + Sun Dec 31 17:32:01 2000 PST | @ 5 hours | Sun Dec 31 22:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST | @ 14 secs ago | Mon Jan 01 17:31:47 2001 PST + Mon Jan 01 17:32:01 2001 PST | @ 1 min | Mon Jan 01 17:33:01 2001 PST + Sun Dec 31 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Mon Jan 01 19:35:05 2001 PST + Mon Jan 01 17:32:01 2001 PST | @ 5 hours | Mon Jan 01 22:32:01 2001 PST + Mon Jan 01 17:32:01 2001 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Jan 02 19:35:05 2001 PST + Sun Dec 31 17:32:01 2000 PST | @ 10 days | Wed Jan 10 17:32:01 2001 PST + Mon Jan 01 17:32:01 2001 PST | @ 10 days | Thu Jan 11 17:32:01 2001 PST + Sun Dec 31 17:32:01 2000 PST | @ 3 mons | Sat Mar 31 17:32:01 2001 PST + Mon Jan 01 17:32:01 2001 PST | @ 3 mons | Sun Apr 01 17:32:01 2001 PDT + Sun Dec 31 17:32:01 2000 PST | @ 5 mons | Thu May 31 17:32:01 2001 PDT + Sun Dec 31 17:32:01 2000 PST | @ 5 mons 12 hours | Fri Jun 01 05:32:01 2001 PDT + Mon Jan 01 17:32:01 2001 PST | @ 5 mons | Fri Jun 01 17:32:01 2001 PDT + Mon Jan 01 17:32:01 2001 PST | @ 5 mons 12 hours | Sat Jun 02 05:32:01 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago | Sat Sep 22 18:19:06 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 1 min | Sat Sep 22 18:20:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 5 hours | Sat Sep 22 23:19:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 1 day 2 hours 3 mins 4 secs | Sun Sep 23 20:22:24 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 10 days | Tue Oct 02 18:19:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 3 mons | Sat Dec 22 18:19:20 2001 PST + Sat Sep 22 18:19:20 2001 PDT | @ 5 mons | Fri Feb 22 18:19:20 2002 PST + Sat Sep 22 18:19:20 2001 PDT | @ 5 mons 12 hours | Sat Feb 23 06:19:20 2002 PST + Wed Feb 28 17:32:01 1996 PST | @ 6 years | Thu Feb 28 17:32:01 2002 PST + Thu Feb 29 17:32:01 1996 PST | @ 6 years | Thu Feb 28 17:32:01 2002 PST + Fri Mar 01 17:32:01 1996 PST | @ 6 years | Fri Mar 01 17:32:01 2002 PST + Mon Dec 30 17:32:01 1996 PST | @ 6 years | Mon Dec 30 17:32:01 2002 PST + Tue Dec 31 17:32:01 1996 PST | @ 6 years | Tue Dec 31 17:32:01 2002 PST + Thu Jan 01 00:00:00 1970 PST | @ 34 years | Thu Jan 01 00:00:00 2004 PST + Fri Dec 31 17:32:01 1999 PST | @ 6 years | Sat Dec 31 17:32:01 2005 PST + Sat Jan 01 17:32:01 2000 PST | @ 6 years | Sun Jan 01 17:32:01 2006 PST + Wed Mar 15 02:14:05 2000 PST | @ 6 years | Wed Mar 15 02:14:05 2006 PST + Wed Mar 15 03:14:04 2000 PST | @ 6 years | Wed Mar 15 03:14:04 2006 PST + Wed Mar 15 08:14:01 2000 PST | @ 6 years | Wed Mar 15 08:14:01 2006 PST + Wed Mar 15 12:14:03 2000 PST | @ 6 years | Wed Mar 15 12:14:03 2006 PST + Wed Mar 15 13:14:02 2000 PST | @ 6 years | Wed Mar 15 13:14:02 2006 PST + Sun Dec 31 17:32:01 2000 PST | @ 6 years | Sun Dec 31 17:32:01 2006 PST + Mon Jan 01 17:32:01 2001 PST | @ 6 years | Mon Jan 01 17:32:01 2007 PST + Sat Sep 22 18:19:20 2001 PDT | @ 6 years | Sat Sep 22 18:19:20 2007 PDT + Wed Feb 28 17:32:01 1996 PST | @ 34 years | Thu Feb 28 17:32:01 2030 PST + Thu Feb 29 17:32:01 1996 PST | @ 34 years | Thu Feb 28 17:32:01 2030 PST + Fri Mar 01 17:32:01 1996 PST | @ 34 years | Fri Mar 01 17:32:01 2030 PST + Mon Dec 30 17:32:01 1996 PST | @ 34 years | Mon Dec 30 17:32:01 2030 PST + Tue Dec 31 17:32:01 1996 PST | @ 34 years | Tue Dec 31 17:32:01 2030 PST + Fri Dec 31 17:32:01 1999 PST | @ 34 years | Sat Dec 31 17:32:01 2033 PST + Sat Jan 01 17:32:01 2000 PST | @ 34 years | Sun Jan 01 17:32:01 2034 PST + Wed Mar 15 02:14:05 2000 PST | @ 34 years | Wed Mar 15 02:14:05 2034 PDT + Wed Mar 15 03:14:04 2000 PST | @ 34 years | Wed Mar 15 03:14:04 2034 PDT + Wed Mar 15 08:14:01 2000 PST | @ 34 years | Wed Mar 15 08:14:01 2034 PDT + Wed Mar 15 12:14:03 2000 PST | @ 34 years | Wed Mar 15 12:14:03 2034 PDT + Wed Mar 15 13:14:02 2000 PST | @ 34 years | Wed Mar 15 13:14:02 2034 PDT + Sun Dec 31 17:32:01 2000 PST | @ 34 years | Sun Dec 31 17:32:01 2034 PST + Mon Jan 01 17:32:01 2001 PST | @ 34 years | Mon Jan 01 17:32:01 2035 PST + Sat Sep 22 18:19:20 2001 PDT | @ 34 years | Sat Sep 22 18:19:20 2035 PDT +(160 rows) + +SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus + FROM TEMP_TIMESTAMP d, INTERVAL_TBL t + WHERE isfinite(d.f1) + ORDER BY minus, "timestamp", "interval"; + timestamp | interval | minus +------------------------------+-------------------------------+------------------------------ + Thu Jan 01 00:00:00 1970 PST | @ 34 years | Wed Jan 01 00:00:00 1936 PST + Wed Feb 28 17:32:01 1996 PST | @ 34 years | Wed Feb 28 17:32:01 1962 PST + Thu Feb 29 17:32:01 1996 PST | @ 34 years | Wed Feb 28 17:32:01 1962 PST + Fri Mar 01 17:32:01 1996 PST | @ 34 years | Thu Mar 01 17:32:01 1962 PST + Mon Dec 30 17:32:01 1996 PST | @ 34 years | Sun Dec 30 17:32:01 1962 PST + Tue Dec 31 17:32:01 1996 PST | @ 34 years | Mon Dec 31 17:32:01 1962 PST + Thu Jan 01 00:00:00 1970 PST | @ 6 years | Wed Jan 01 00:00:00 1964 PST + Fri Dec 31 17:32:01 1999 PST | @ 34 years | Fri Dec 31 17:32:01 1965 PST + Sat Jan 01 17:32:01 2000 PST | @ 34 years | Sat Jan 01 17:32:01 1966 PST + Wed Mar 15 02:14:05 2000 PST | @ 34 years | Tue Mar 15 02:14:05 1966 PST + Wed Mar 15 03:14:04 2000 PST | @ 34 years | Tue Mar 15 03:14:04 1966 PST + Wed Mar 15 08:14:01 2000 PST | @ 34 years | Tue Mar 15 08:14:01 1966 PST + Wed Mar 15 12:14:03 2000 PST | @ 34 years | Tue Mar 15 12:14:03 1966 PST + Wed Mar 15 13:14:02 2000 PST | @ 34 years | Tue Mar 15 13:14:02 1966 PST + Sun Dec 31 17:32:01 2000 PST | @ 34 years | Sat Dec 31 17:32:01 1966 PST + Mon Jan 01 17:32:01 2001 PST | @ 34 years | Sun Jan 01 17:32:01 1967 PST + Sat Sep 22 18:19:20 2001 PDT | @ 34 years | Fri Sep 22 18:19:20 1967 PDT + Thu Jan 01 00:00:00 1970 PST | @ 5 mons 12 hours | Thu Jul 31 12:00:00 1969 PDT + Thu Jan 01 00:00:00 1970 PST | @ 5 mons | Fri Aug 01 00:00:00 1969 PDT + Thu Jan 01 00:00:00 1970 PST | @ 3 mons | Wed Oct 01 00:00:00 1969 PDT + Thu Jan 01 00:00:00 1970 PST | @ 10 days | Mon Dec 22 00:00:00 1969 PST + Thu Jan 01 00:00:00 1970 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Dec 30 21:56:56 1969 PST + Thu Jan 01 00:00:00 1970 PST | @ 5 hours | Wed Dec 31 19:00:00 1969 PST + Thu Jan 01 00:00:00 1970 PST | @ 1 min | Wed Dec 31 23:59:00 1969 PST + Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago | Thu Jan 01 00:00:14 1970 PST + Wed Feb 28 17:32:01 1996 PST | @ 6 years | Wed Feb 28 17:32:01 1990 PST + Thu Feb 29 17:32:01 1996 PST | @ 6 years | Wed Feb 28 17:32:01 1990 PST + Fri Mar 01 17:32:01 1996 PST | @ 6 years | Thu Mar 01 17:32:01 1990 PST + Mon Dec 30 17:32:01 1996 PST | @ 6 years | Sun Dec 30 17:32:01 1990 PST + Tue Dec 31 17:32:01 1996 PST | @ 6 years | Mon Dec 31 17:32:01 1990 PST + Fri Dec 31 17:32:01 1999 PST | @ 6 years | Fri Dec 31 17:32:01 1993 PST + Sat Jan 01 17:32:01 2000 PST | @ 6 years | Sat Jan 01 17:32:01 1994 PST + Wed Mar 15 02:14:05 2000 PST | @ 6 years | Tue Mar 15 02:14:05 1994 PST + Wed Mar 15 03:14:04 2000 PST | @ 6 years | Tue Mar 15 03:14:04 1994 PST + Wed Mar 15 08:14:01 2000 PST | @ 6 years | Tue Mar 15 08:14:01 1994 PST + Wed Mar 15 12:14:03 2000 PST | @ 6 years | Tue Mar 15 12:14:03 1994 PST + Wed Mar 15 13:14:02 2000 PST | @ 6 years | Tue Mar 15 13:14:02 1994 PST + Sun Dec 31 17:32:01 2000 PST | @ 6 years | Sat Dec 31 17:32:01 1994 PST + Mon Jan 01 17:32:01 2001 PST | @ 6 years | Sun Jan 01 17:32:01 1995 PST + Sat Sep 22 18:19:20 2001 PDT | @ 6 years | Fri Sep 22 18:19:20 1995 PDT + Wed Feb 28 17:32:01 1996 PST | @ 5 mons 12 hours | Thu Sep 28 05:32:01 1995 PDT + Wed Feb 28 17:32:01 1996 PST | @ 5 mons | Thu Sep 28 17:32:01 1995 PDT + Thu Feb 29 17:32:01 1996 PST | @ 5 mons 12 hours | Fri Sep 29 05:32:01 1995 PDT + Thu Feb 29 17:32:01 1996 PST | @ 5 mons | Fri Sep 29 17:32:01 1995 PDT + Fri Mar 01 17:32:01 1996 PST | @ 5 mons 12 hours | Sun Oct 01 05:32:01 1995 PDT + Fri Mar 01 17:32:01 1996 PST | @ 5 mons | Sun Oct 01 17:32:01 1995 PDT + Wed Feb 28 17:32:01 1996 PST | @ 3 mons | Tue Nov 28 17:32:01 1995 PST + Thu Feb 29 17:32:01 1996 PST | @ 3 mons | Wed Nov 29 17:32:01 1995 PST + Fri Mar 01 17:32:01 1996 PST | @ 3 mons | Fri Dec 01 17:32:01 1995 PST + Wed Feb 28 17:32:01 1996 PST | @ 10 days | Sun Feb 18 17:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 10 days | Mon Feb 19 17:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 10 days | Tue Feb 20 17:32:01 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Feb 27 15:28:57 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 5 hours | Wed Feb 28 12:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Wed Feb 28 15:28:57 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 1 min | Wed Feb 28 17:31:01 1996 PST + Wed Feb 28 17:32:01 1996 PST | @ 14 secs ago | Wed Feb 28 17:32:15 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 5 hours | Thu Feb 29 12:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Feb 29 15:28:57 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 1 min | Thu Feb 29 17:31:01 1996 PST + Thu Feb 29 17:32:01 1996 PST | @ 14 secs ago | Thu Feb 29 17:32:15 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 5 hours | Fri Mar 01 12:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 1 min | Fri Mar 01 17:31:01 1996 PST + Fri Mar 01 17:32:01 1996 PST | @ 14 secs ago | Fri Mar 01 17:32:15 1996 PST + Mon Dec 30 17:32:01 1996 PST | @ 5 mons 12 hours | Tue Jul 30 05:32:01 1996 PDT + Mon Dec 30 17:32:01 1996 PST | @ 5 mons | Tue Jul 30 17:32:01 1996 PDT + Tue Dec 31 17:32:01 1996 PST | @ 5 mons 12 hours | Wed Jul 31 05:32:01 1996 PDT + Tue Dec 31 17:32:01 1996 PST | @ 5 mons | Wed Jul 31 17:32:01 1996 PDT + Mon Dec 30 17:32:01 1996 PST | @ 3 mons | Mon Sep 30 17:32:01 1996 PDT + Tue Dec 31 17:32:01 1996 PST | @ 3 mons | Mon Sep 30 17:32:01 1996 PDT + Mon Dec 30 17:32:01 1996 PST | @ 10 days | Fri Dec 20 17:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 10 days | Sat Dec 21 17:32:01 1996 PST + Mon Dec 30 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Dec 29 15:28:57 1996 PST + Mon Dec 30 17:32:01 1996 PST | @ 5 hours | Mon Dec 30 12:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Mon Dec 30 15:28:57 1996 PST + Mon Dec 30 17:32:01 1996 PST | @ 1 min | Mon Dec 30 17:31:01 1996 PST + Mon Dec 30 17:32:01 1996 PST | @ 14 secs ago | Mon Dec 30 17:32:15 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 5 hours | Tue Dec 31 12:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 1 min | Tue Dec 31 17:31:01 1996 PST + Tue Dec 31 17:32:01 1996 PST | @ 14 secs ago | Tue Dec 31 17:32:15 1996 PST + Fri Dec 31 17:32:01 1999 PST | @ 5 mons 12 hours | Sat Jul 31 05:32:01 1999 PDT + Fri Dec 31 17:32:01 1999 PST | @ 5 mons | Sat Jul 31 17:32:01 1999 PDT + Sat Jan 01 17:32:01 2000 PST | @ 5 mons 12 hours | Sun Aug 01 05:32:01 1999 PDT + Sat Jan 01 17:32:01 2000 PST | @ 5 mons | Sun Aug 01 17:32:01 1999 PDT + Fri Dec 31 17:32:01 1999 PST | @ 3 mons | Thu Sep 30 17:32:01 1999 PDT + Sat Jan 01 17:32:01 2000 PST | @ 3 mons | Fri Oct 01 17:32:01 1999 PDT + Wed Mar 15 02:14:05 2000 PST | @ 5 mons 12 hours | Thu Oct 14 14:14:05 1999 PDT + Wed Mar 15 03:14:04 2000 PST | @ 5 mons 12 hours | Thu Oct 14 15:14:04 1999 PDT + Wed Mar 15 08:14:01 2000 PST | @ 5 mons 12 hours | Thu Oct 14 20:14:01 1999 PDT + Wed Mar 15 12:14:03 2000 PST | @ 5 mons 12 hours | Fri Oct 15 00:14:03 1999 PDT + Wed Mar 15 13:14:02 2000 PST | @ 5 mons 12 hours | Fri Oct 15 01:14:02 1999 PDT + Wed Mar 15 02:14:05 2000 PST | @ 5 mons | Fri Oct 15 02:14:05 1999 PDT + Wed Mar 15 03:14:04 2000 PST | @ 5 mons | Fri Oct 15 03:14:04 1999 PDT + Wed Mar 15 08:14:01 2000 PST | @ 5 mons | Fri Oct 15 08:14:01 1999 PDT + Wed Mar 15 12:14:03 2000 PST | @ 5 mons | Fri Oct 15 12:14:03 1999 PDT + Wed Mar 15 13:14:02 2000 PST | @ 5 mons | Fri Oct 15 13:14:02 1999 PDT + Wed Mar 15 02:14:05 2000 PST | @ 3 mons | Wed Dec 15 02:14:05 1999 PST + Wed Mar 15 03:14:04 2000 PST | @ 3 mons | Wed Dec 15 03:14:04 1999 PST + Wed Mar 15 08:14:01 2000 PST | @ 3 mons | Wed Dec 15 08:14:01 1999 PST + Wed Mar 15 12:14:03 2000 PST | @ 3 mons | Wed Dec 15 12:14:03 1999 PST + Wed Mar 15 13:14:02 2000 PST | @ 3 mons | Wed Dec 15 13:14:02 1999 PST + Fri Dec 31 17:32:01 1999 PST | @ 10 days | Tue Dec 21 17:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST | @ 10 days | Wed Dec 22 17:32:01 1999 PST + Fri Dec 31 17:32:01 1999 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Dec 30 15:28:57 1999 PST + Fri Dec 31 17:32:01 1999 PST | @ 5 hours | Fri Dec 31 12:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Dec 31 15:28:57 1999 PST + Fri Dec 31 17:32:01 1999 PST | @ 1 min | Fri Dec 31 17:31:01 1999 PST + Fri Dec 31 17:32:01 1999 PST | @ 14 secs ago | Fri Dec 31 17:32:15 1999 PST + Sat Jan 01 17:32:01 2000 PST | @ 5 hours | Sat Jan 01 12:32:01 2000 PST + Sat Jan 01 17:32:01 2000 PST | @ 1 min | Sat Jan 01 17:31:01 2000 PST + Sat Jan 01 17:32:01 2000 PST | @ 14 secs ago | Sat Jan 01 17:32:15 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 10 days | Sun Mar 05 02:14:05 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 10 days | Sun Mar 05 03:14:04 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 10 days | Sun Mar 05 08:14:01 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 10 days | Sun Mar 05 12:14:03 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 10 days | Sun Mar 05 13:14:02 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 00:11:01 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 01:11:00 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 06:10:57 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 10:10:59 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 11:10:58 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 5 hours | Tue Mar 14 21:14:05 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 5 hours | Tue Mar 14 22:14:04 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 1 min | Wed Mar 15 02:13:05 2000 PST + Wed Mar 15 02:14:05 2000 PST | @ 14 secs ago | Wed Mar 15 02:14:19 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 1 min | Wed Mar 15 03:13:04 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 5 hours | Wed Mar 15 03:14:01 2000 PST + Wed Mar 15 03:14:04 2000 PST | @ 14 secs ago | Wed Mar 15 03:14:18 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 5 hours | Wed Mar 15 07:14:03 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 1 min | Wed Mar 15 08:13:01 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 5 hours | Wed Mar 15 08:14:02 2000 PST + Wed Mar 15 08:14:01 2000 PST | @ 14 secs ago | Wed Mar 15 08:14:15 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 1 min | Wed Mar 15 12:13:03 2000 PST + Wed Mar 15 12:14:03 2000 PST | @ 14 secs ago | Wed Mar 15 12:14:17 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 1 min | Wed Mar 15 13:13:02 2000 PST + Wed Mar 15 13:14:02 2000 PST | @ 14 secs ago | Wed Mar 15 13:14:16 2000 PST + Sun Dec 31 17:32:01 2000 PST | @ 5 mons 12 hours | Mon Jul 31 05:32:01 2000 PDT + Sun Dec 31 17:32:01 2000 PST | @ 5 mons | Mon Jul 31 17:32:01 2000 PDT + Mon Jan 01 17:32:01 2001 PST | @ 5 mons 12 hours | Tue Aug 01 05:32:01 2000 PDT + Mon Jan 01 17:32:01 2001 PST | @ 5 mons | Tue Aug 01 17:32:01 2000 PDT + Sun Dec 31 17:32:01 2000 PST | @ 3 mons | Sat Sep 30 17:32:01 2000 PDT + Mon Jan 01 17:32:01 2001 PST | @ 3 mons | Sun Oct 01 17:32:01 2000 PDT + Sun Dec 31 17:32:01 2000 PST | @ 10 days | Thu Dec 21 17:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST | @ 10 days | Fri Dec 22 17:32:01 2000 PST + Sun Dec 31 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Dec 30 15:28:57 2000 PST + Sun Dec 31 17:32:01 2000 PST | @ 5 hours | Sun Dec 31 12:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Dec 31 15:28:57 2000 PST + Sun Dec 31 17:32:01 2000 PST | @ 1 min | Sun Dec 31 17:31:01 2000 PST + Sun Dec 31 17:32:01 2000 PST | @ 14 secs ago | Sun Dec 31 17:32:15 2000 PST + Mon Jan 01 17:32:01 2001 PST | @ 5 hours | Mon Jan 01 12:32:01 2001 PST + Mon Jan 01 17:32:01 2001 PST | @ 1 min | Mon Jan 01 17:31:01 2001 PST + Mon Jan 01 17:32:01 2001 PST | @ 14 secs ago | Mon Jan 01 17:32:15 2001 PST + Sat Sep 22 18:19:20 2001 PDT | @ 5 mons 12 hours | Sun Apr 22 06:19:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 5 mons | Sun Apr 22 18:19:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 3 mons | Fri Jun 22 18:19:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 10 days | Wed Sep 12 18:19:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 1 day 2 hours 3 mins 4 secs | Fri Sep 21 16:16:16 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 5 hours | Sat Sep 22 13:19:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 1 min | Sat Sep 22 18:18:20 2001 PDT + Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago | Sat Sep 22 18:19:34 2001 PDT +(160 rows) + +SELECT d.f1 AS "timestamp", + timestamp with time zone '1980-01-06 00:00 GMT' AS gpstime_zero, + d.f1 - timestamp with time zone '1980-01-06 00:00 GMT' AS difference + FROM TEMP_TIMESTAMP d + ORDER BY difference; + timestamp | gpstime_zero | difference +------------------------------+------------------------------+------------------------------------- + Thu Jan 01 00:00:00 1970 PST | Sat Jan 05 16:00:00 1980 PST | @ 3656 days 16 hours ago + Wed Feb 28 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5898 days 1 hour 32 mins 1 sec + Thu Feb 29 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5899 days 1 hour 32 mins 1 sec + Fri Mar 01 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5900 days 1 hour 32 mins 1 sec + Mon Dec 30 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 6204 days 1 hour 32 mins 1 sec + Tue Dec 31 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 6205 days 1 hour 32 mins 1 sec + Fri Dec 31 17:32:01 1999 PST | Sat Jan 05 16:00:00 1980 PST | @ 7300 days 1 hour 32 mins 1 sec + Sat Jan 01 17:32:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7301 days 1 hour 32 mins 1 sec + Wed Mar 15 02:14:05 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 10 hours 14 mins 5 secs + Wed Mar 15 03:14:04 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 11 hours 14 mins 4 secs + Wed Mar 15 08:14:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 16 hours 14 mins 1 sec + Wed Mar 15 12:14:03 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 20 hours 14 mins 3 secs + Wed Mar 15 13:14:02 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 21 hours 14 mins 2 secs + Sun Dec 31 17:32:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7666 days 1 hour 32 mins 1 sec + Mon Jan 01 17:32:01 2001 PST | Sat Jan 05 16:00:00 1980 PST | @ 7667 days 1 hour 32 mins 1 sec + Sat Sep 22 18:19:20 2001 PDT | Sat Jan 05 16:00:00 1980 PST | @ 7931 days 1 hour 19 mins 20 secs +(16 rows) + +SELECT d1.f1 AS timestamp1, d2.f1 AS timestamp2, d1.f1 - d2.f1 AS difference + FROM TEMP_TIMESTAMP d1, TEMP_TIMESTAMP d2 + ORDER BY timestamp1, timestamp2, difference; + timestamp1 | timestamp2 | difference +------------------------------+------------------------------+------------------------------------------- + Thu Jan 01 00:00:00 1970 PST | Thu Jan 01 00:00:00 1970 PST | @ 0 + Thu Jan 01 00:00:00 1970 PST | Wed Feb 28 17:32:01 1996 PST | @ 9554 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Thu Feb 29 17:32:01 1996 PST | @ 9555 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Fri Mar 01 17:32:01 1996 PST | @ 9556 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Mon Dec 30 17:32:01 1996 PST | @ 9860 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Tue Dec 31 17:32:01 1996 PST | @ 9861 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Fri Dec 31 17:32:01 1999 PST | @ 10956 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Sat Jan 01 17:32:01 2000 PST | @ 10957 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 02:14:05 2000 PST | @ 11031 days 2 hours 14 mins 5 secs ago + Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 03:14:04 2000 PST | @ 11031 days 3 hours 14 mins 4 secs ago + Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 08:14:01 2000 PST | @ 11031 days 8 hours 14 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 12:14:03 2000 PST | @ 11031 days 12 hours 14 mins 3 secs ago + Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 13:14:02 2000 PST | @ 11031 days 13 hours 14 mins 2 secs ago + Thu Jan 01 00:00:00 1970 PST | Sun Dec 31 17:32:01 2000 PST | @ 11322 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Mon Jan 01 17:32:01 2001 PST | @ 11323 days 17 hours 32 mins 1 sec ago + Thu Jan 01 00:00:00 1970 PST | Sat Sep 22 18:19:20 2001 PDT | @ 11587 days 17 hours 19 mins 20 secs ago + Wed Feb 28 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9554 days 17 hours 32 mins 1 sec + Wed Feb 28 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 0 + Wed Feb 28 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 1 day ago + Wed Feb 28 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 2 days ago + Wed Feb 28 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 306 days ago + Wed Feb 28 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 307 days ago + Wed Feb 28 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1402 days ago + Wed Feb 28 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1403 days ago + Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1476 days 8 hours 42 mins 4 secs ago + Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1476 days 9 hours 42 mins 3 secs ago + Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1476 days 14 hours 42 mins ago + Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1476 days 18 hours 42 mins 2 secs ago + Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1476 days 19 hours 42 mins 1 sec ago + Wed Feb 28 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1768 days ago + Wed Feb 28 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1769 days ago + Wed Feb 28 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2032 days 23 hours 47 mins 19 secs ago + Thu Feb 29 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9555 days 17 hours 32 mins 1 sec + Thu Feb 29 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 1 day + Thu Feb 29 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 0 + Thu Feb 29 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 1 day ago + Thu Feb 29 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 305 days ago + Thu Feb 29 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 306 days ago + Thu Feb 29 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1401 days ago + Thu Feb 29 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1402 days ago + Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1475 days 8 hours 42 mins 4 secs ago + Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1475 days 9 hours 42 mins 3 secs ago + Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1475 days 14 hours 42 mins ago + Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1475 days 18 hours 42 mins 2 secs ago + Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1475 days 19 hours 42 mins 1 sec ago + Thu Feb 29 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1767 days ago + Thu Feb 29 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1768 days ago + Thu Feb 29 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2031 days 23 hours 47 mins 19 secs ago + Fri Mar 01 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9556 days 17 hours 32 mins 1 sec + Fri Mar 01 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 2 days + Fri Mar 01 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 1 day + Fri Mar 01 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 0 + Fri Mar 01 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 304 days ago + Fri Mar 01 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 305 days ago + Fri Mar 01 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1400 days ago + Fri Mar 01 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1401 days ago + Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1474 days 8 hours 42 mins 4 secs ago + Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1474 days 9 hours 42 mins 3 secs ago + Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1474 days 14 hours 42 mins ago + Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1474 days 18 hours 42 mins 2 secs ago + Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1474 days 19 hours 42 mins 1 sec ago + Fri Mar 01 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1766 days ago + Fri Mar 01 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1767 days ago + Fri Mar 01 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2030 days 23 hours 47 mins 19 secs ago + Mon Dec 30 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9860 days 17 hours 32 mins 1 sec + Mon Dec 30 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 306 days + Mon Dec 30 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 305 days + Mon Dec 30 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 304 days + Mon Dec 30 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 0 + Mon Dec 30 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 1 day ago + Mon Dec 30 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1096 days ago + Mon Dec 30 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1097 days ago + Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1170 days 8 hours 42 mins 4 secs ago + Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1170 days 9 hours 42 mins 3 secs ago + Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1170 days 14 hours 42 mins ago + Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1170 days 18 hours 42 mins 2 secs ago + Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1170 days 19 hours 42 mins 1 sec ago + Mon Dec 30 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1462 days ago + Mon Dec 30 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1463 days ago + Mon Dec 30 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 1726 days 23 hours 47 mins 19 secs ago + Tue Dec 31 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9861 days 17 hours 32 mins 1 sec + Tue Dec 31 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 307 days + Tue Dec 31 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 306 days + Tue Dec 31 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 305 days + Tue Dec 31 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 1 day + Tue Dec 31 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 0 + Tue Dec 31 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1095 days ago + Tue Dec 31 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1096 days ago + Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1169 days 8 hours 42 mins 4 secs ago + Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1169 days 9 hours 42 mins 3 secs ago + Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1169 days 14 hours 42 mins ago + Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1169 days 18 hours 42 mins 2 secs ago + Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1169 days 19 hours 42 mins 1 sec ago + Tue Dec 31 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1461 days ago + Tue Dec 31 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1462 days ago + Tue Dec 31 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 1725 days 23 hours 47 mins 19 secs ago + Fri Dec 31 17:32:01 1999 PST | Thu Jan 01 00:00:00 1970 PST | @ 10956 days 17 hours 32 mins 1 sec + Fri Dec 31 17:32:01 1999 PST | Wed Feb 28 17:32:01 1996 PST | @ 1402 days + Fri Dec 31 17:32:01 1999 PST | Thu Feb 29 17:32:01 1996 PST | @ 1401 days + Fri Dec 31 17:32:01 1999 PST | Fri Mar 01 17:32:01 1996 PST | @ 1400 days + Fri Dec 31 17:32:01 1999 PST | Mon Dec 30 17:32:01 1996 PST | @ 1096 days + Fri Dec 31 17:32:01 1999 PST | Tue Dec 31 17:32:01 1996 PST | @ 1095 days + Fri Dec 31 17:32:01 1999 PST | Fri Dec 31 17:32:01 1999 PST | @ 0 + Fri Dec 31 17:32:01 1999 PST | Sat Jan 01 17:32:01 2000 PST | @ 1 day ago + Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 02:14:05 2000 PST | @ 74 days 8 hours 42 mins 4 secs ago + Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 03:14:04 2000 PST | @ 74 days 9 hours 42 mins 3 secs ago + Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 08:14:01 2000 PST | @ 74 days 14 hours 42 mins ago + Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 12:14:03 2000 PST | @ 74 days 18 hours 42 mins 2 secs ago + Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 13:14:02 2000 PST | @ 74 days 19 hours 42 mins 1 sec ago + Fri Dec 31 17:32:01 1999 PST | Sun Dec 31 17:32:01 2000 PST | @ 366 days ago + Fri Dec 31 17:32:01 1999 PST | Mon Jan 01 17:32:01 2001 PST | @ 367 days ago + Fri Dec 31 17:32:01 1999 PST | Sat Sep 22 18:19:20 2001 PDT | @ 630 days 23 hours 47 mins 19 secs ago + Sat Jan 01 17:32:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 10957 days 17 hours 32 mins 1 sec + Sat Jan 01 17:32:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1403 days + Sat Jan 01 17:32:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1402 days + Sat Jan 01 17:32:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1401 days + Sat Jan 01 17:32:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1097 days + Sat Jan 01 17:32:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1096 days + Sat Jan 01 17:32:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 1 day + Sat Jan 01 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 0 + Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 73 days 8 hours 42 mins 4 secs ago + Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 73 days 9 hours 42 mins 3 secs ago + Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 73 days 14 hours 42 mins ago + Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 73 days 18 hours 42 mins 2 secs ago + Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 73 days 19 hours 42 mins 1 sec ago + Sat Jan 01 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 365 days ago + Sat Jan 01 17:32:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 366 days ago + Sat Jan 01 17:32:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 629 days 23 hours 47 mins 19 secs ago + Wed Mar 15 02:14:05 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 2 hours 14 mins 5 secs + Wed Mar 15 02:14:05 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 8 hours 42 mins 4 secs + Wed Mar 15 02:14:05 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 8 hours 42 mins 4 secs + Wed Mar 15 02:14:05 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 8 hours 42 mins 4 secs + Wed Mar 15 02:14:05 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 8 hours 42 mins 4 secs + Wed Mar 15 02:14:05 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 8 hours 42 mins 4 secs + Wed Mar 15 02:14:05 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 8 hours 42 mins 4 secs + Wed Mar 15 02:14:05 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 8 hours 42 mins 4 secs + Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 0 + Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 59 mins 59 secs ago + Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 5 hours 59 mins 56 secs ago + Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 9 hours 59 mins 58 secs ago + Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 10 hours 59 mins 57 secs ago + Wed Mar 15 02:14:05 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 15 hours 17 mins 56 secs ago + Wed Mar 15 02:14:05 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 15 hours 17 mins 56 secs ago + Wed Mar 15 02:14:05 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 15 hours 5 mins 15 secs ago + Wed Mar 15 03:14:04 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 3 hours 14 mins 4 secs + Wed Mar 15 03:14:04 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 9 hours 42 mins 3 secs + Wed Mar 15 03:14:04 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 9 hours 42 mins 3 secs + Wed Mar 15 03:14:04 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 9 hours 42 mins 3 secs + Wed Mar 15 03:14:04 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 9 hours 42 mins 3 secs + Wed Mar 15 03:14:04 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 9 hours 42 mins 3 secs + Wed Mar 15 03:14:04 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 9 hours 42 mins 3 secs + Wed Mar 15 03:14:04 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 9 hours 42 mins 3 secs + Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 59 mins 59 secs + Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 0 + Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 4 hours 59 mins 57 secs ago + Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 8 hours 59 mins 59 secs ago + Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 9 hours 59 mins 58 secs ago + Wed Mar 15 03:14:04 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 14 hours 17 mins 57 secs ago + Wed Mar 15 03:14:04 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 14 hours 17 mins 57 secs ago + Wed Mar 15 03:14:04 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 14 hours 5 mins 16 secs ago + Wed Mar 15 08:14:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 8 hours 14 mins 1 sec + Wed Mar 15 08:14:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 14 hours 42 mins + Wed Mar 15 08:14:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 14 hours 42 mins + Wed Mar 15 08:14:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 14 hours 42 mins + Wed Mar 15 08:14:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 14 hours 42 mins + Wed Mar 15 08:14:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 14 hours 42 mins + Wed Mar 15 08:14:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 14 hours 42 mins + Wed Mar 15 08:14:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 14 hours 42 mins + Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 5 hours 59 mins 56 secs + Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 4 hours 59 mins 57 secs + Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 0 + Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 4 hours 2 secs ago + Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 5 hours 1 sec ago + Wed Mar 15 08:14:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 9 hours 18 mins ago + Wed Mar 15 08:14:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 9 hours 18 mins ago + Wed Mar 15 08:14:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 9 hours 5 mins 19 secs ago + Wed Mar 15 12:14:03 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 12 hours 14 mins 3 secs + Wed Mar 15 12:14:03 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 18 hours 42 mins 2 secs + Wed Mar 15 12:14:03 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 18 hours 42 mins 2 secs + Wed Mar 15 12:14:03 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 18 hours 42 mins 2 secs + Wed Mar 15 12:14:03 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 18 hours 42 mins 2 secs + Wed Mar 15 12:14:03 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 18 hours 42 mins 2 secs + Wed Mar 15 12:14:03 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 18 hours 42 mins 2 secs + Wed Mar 15 12:14:03 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 18 hours 42 mins 2 secs + Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 9 hours 59 mins 58 secs + Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 8 hours 59 mins 59 secs + Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 4 hours 2 secs + Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 0 + Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 59 mins 59 secs ago + Wed Mar 15 12:14:03 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 5 hours 17 mins 58 secs ago + Wed Mar 15 12:14:03 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 5 hours 17 mins 58 secs ago + Wed Mar 15 12:14:03 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 5 hours 5 mins 17 secs ago + Wed Mar 15 13:14:02 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 13 hours 14 mins 2 secs + Wed Mar 15 13:14:02 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 19 hours 42 mins 1 sec + Wed Mar 15 13:14:02 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 19 hours 42 mins 1 sec + Wed Mar 15 13:14:02 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 19 hours 42 mins 1 sec + Wed Mar 15 13:14:02 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 19 hours 42 mins 1 sec + Wed Mar 15 13:14:02 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 19 hours 42 mins 1 sec + Wed Mar 15 13:14:02 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 19 hours 42 mins 1 sec + Wed Mar 15 13:14:02 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 19 hours 42 mins 1 sec + Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 10 hours 59 mins 57 secs + Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 9 hours 59 mins 58 secs + Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 5 hours 1 sec + Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 59 mins 59 secs + Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 0 + Wed Mar 15 13:14:02 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 4 hours 17 mins 59 secs ago + Wed Mar 15 13:14:02 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 4 hours 17 mins 59 secs ago + Wed Mar 15 13:14:02 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 4 hours 5 mins 18 secs ago + Sun Dec 31 17:32:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11322 days 17 hours 32 mins 1 sec + Sun Dec 31 17:32:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1768 days + Sun Dec 31 17:32:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1767 days + Sun Dec 31 17:32:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1766 days + Sun Dec 31 17:32:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1462 days + Sun Dec 31 17:32:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1461 days + Sun Dec 31 17:32:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 366 days + Sun Dec 31 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 365 days + Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 291 days 15 hours 17 mins 56 secs + Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 291 days 14 hours 17 mins 57 secs + Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 291 days 9 hours 18 mins + Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 291 days 5 hours 17 mins 58 secs + Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 291 days 4 hours 17 mins 59 secs + Sun Dec 31 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 0 + Sun Dec 31 17:32:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 1 day ago + Sun Dec 31 17:32:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 264 days 23 hours 47 mins 19 secs ago + Mon Jan 01 17:32:01 2001 PST | Thu Jan 01 00:00:00 1970 PST | @ 11323 days 17 hours 32 mins 1 sec + Mon Jan 01 17:32:01 2001 PST | Wed Feb 28 17:32:01 1996 PST | @ 1769 days + Mon Jan 01 17:32:01 2001 PST | Thu Feb 29 17:32:01 1996 PST | @ 1768 days + Mon Jan 01 17:32:01 2001 PST | Fri Mar 01 17:32:01 1996 PST | @ 1767 days + Mon Jan 01 17:32:01 2001 PST | Mon Dec 30 17:32:01 1996 PST | @ 1463 days + Mon Jan 01 17:32:01 2001 PST | Tue Dec 31 17:32:01 1996 PST | @ 1462 days + Mon Jan 01 17:32:01 2001 PST | Fri Dec 31 17:32:01 1999 PST | @ 367 days + Mon Jan 01 17:32:01 2001 PST | Sat Jan 01 17:32:01 2000 PST | @ 366 days + Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 02:14:05 2000 PST | @ 292 days 15 hours 17 mins 56 secs + Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 03:14:04 2000 PST | @ 292 days 14 hours 17 mins 57 secs + Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 08:14:01 2000 PST | @ 292 days 9 hours 18 mins + Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 12:14:03 2000 PST | @ 292 days 5 hours 17 mins 58 secs + Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 13:14:02 2000 PST | @ 292 days 4 hours 17 mins 59 secs + Mon Jan 01 17:32:01 2001 PST | Sun Dec 31 17:32:01 2000 PST | @ 1 day + Mon Jan 01 17:32:01 2001 PST | Mon Jan 01 17:32:01 2001 PST | @ 0 + Mon Jan 01 17:32:01 2001 PST | Sat Sep 22 18:19:20 2001 PDT | @ 263 days 23 hours 47 mins 19 secs ago + Sat Sep 22 18:19:20 2001 PDT | Thu Jan 01 00:00:00 1970 PST | @ 11587 days 17 hours 19 mins 20 secs + Sat Sep 22 18:19:20 2001 PDT | Wed Feb 28 17:32:01 1996 PST | @ 2032 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Thu Feb 29 17:32:01 1996 PST | @ 2031 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Fri Mar 01 17:32:01 1996 PST | @ 2030 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Mon Dec 30 17:32:01 1996 PST | @ 1726 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Tue Dec 31 17:32:01 1996 PST | @ 1725 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Fri Dec 31 17:32:01 1999 PST | @ 630 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Sat Jan 01 17:32:01 2000 PST | @ 629 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 02:14:05 2000 PST | @ 556 days 15 hours 5 mins 15 secs + Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 03:14:04 2000 PST | @ 556 days 14 hours 5 mins 16 secs + Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 08:14:01 2000 PST | @ 556 days 9 hours 5 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 12:14:03 2000 PST | @ 556 days 5 hours 5 mins 17 secs + Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 13:14:02 2000 PST | @ 556 days 4 hours 5 mins 18 secs + Sat Sep 22 18:19:20 2001 PDT | Sun Dec 31 17:32:01 2000 PST | @ 264 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Mon Jan 01 17:32:01 2001 PST | @ 263 days 23 hours 47 mins 19 secs + Sat Sep 22 18:19:20 2001 PDT | Sat Sep 22 18:19:20 2001 PDT | @ 0 +(256 rows) + +-- +-- Conversions +-- +SELECT f1 AS "timestamp", date(f1) AS date + FROM TEMP_TIMESTAMP + WHERE f1 <> timestamp 'now' + ORDER BY date, "timestamp"; + timestamp | date +------------------------------+------------ + Thu Jan 01 00:00:00 1970 PST | 01-01-1970 + Wed Feb 28 17:32:01 1996 PST | 02-28-1996 + Thu Feb 29 17:32:01 1996 PST | 02-29-1996 + Fri Mar 01 17:32:01 1996 PST | 03-01-1996 + Mon Dec 30 17:32:01 1996 PST | 12-30-1996 + Tue Dec 31 17:32:01 1996 PST | 12-31-1996 + Fri Dec 31 17:32:01 1999 PST | 12-31-1999 + Sat Jan 01 17:32:01 2000 PST | 01-01-2000 + Wed Mar 15 02:14:05 2000 PST | 03-15-2000 + Wed Mar 15 03:14:04 2000 PST | 03-15-2000 + Wed Mar 15 08:14:01 2000 PST | 03-15-2000 + Wed Mar 15 12:14:03 2000 PST | 03-15-2000 + Wed Mar 15 13:14:02 2000 PST | 03-15-2000 + Sun Dec 31 17:32:01 2000 PST | 12-31-2000 + Mon Jan 01 17:32:01 2001 PST | 01-01-2001 + Sat Sep 22 18:19:20 2001 PDT | 09-22-2001 +(16 rows) + +DROP TABLE TEMP_TIMESTAMP; +-- +-- Comparisons between datetime types, especially overflow cases +--- +SELECT '2202020-10-05'::date::timestamp; -- fail +ERROR: date out of range for timestamp +SELECT '2202020-10-05'::date > '2020-10-05'::timestamp as t; + t +--- + t +(1 row) + +SELECT '2020-10-05'::timestamp > '2202020-10-05'::date as f; + f +--- + f +(1 row) + +SELECT '2202020-10-05'::date::timestamptz; -- fail +ERROR: date out of range for timestamp +SELECT '2202020-10-05'::date > '2020-10-05'::timestamptz as t; + t +--- + t +(1 row) + +SELECT '2020-10-05'::timestamptz > '2202020-10-05'::date as f; + f +--- + f +(1 row) + +-- This conversion may work depending on timezone +SELECT '4714-11-24 BC'::date::timestamptz; + timestamptz +--------------------------------- + Mon Nov 24 00:00:00 4714 PST BC +(1 row) + +SET TimeZone = 'UTC-2'; +SELECT '4714-11-24 BC'::date::timestamptz; -- fail +ERROR: date out of range for timestamp +SELECT '4714-11-24 BC'::date < '2020-10-05'::timestamptz as t; + t +--- + t +(1 row) + +SELECT '2020-10-05'::timestamptz >= '4714-11-24 BC'::date as t; + t +--- + t +(1 row) + +SELECT '4714-11-24 BC'::timestamp < '2020-10-05'::timestamptz as t; + t +--- + t +(1 row) + +SELECT '2020-10-05'::timestamptz >= '4714-11-24 BC'::timestamp as t; + t +--- + t +(1 row) + +RESET TimeZone; +-- +-- Formats +-- +SET DateStyle TO 'US,Postgres'; +SHOW DateStyle; + DateStyle +--------------- + Postgres, MDY +(1 row) + +SELECT d1 AS us_postgres FROM TIMESTAMP_TBL; + us_postgres +----------------------------- + -infinity + infinity + Thu Jan 01 00:00:00 1970 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:02 1997 + Mon Feb 10 17:32:01.4 1997 + Mon Feb 10 17:32:01.5 1997 + Mon Feb 10 17:32:01.6 1997 + Thu Jan 02 00:00:00 1997 + Thu Jan 02 03:04:05 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 17:32:01 1997 + Sat Sep 22 18:19:20 2001 + Wed Mar 15 08:14:01 2000 + Wed Mar 15 13:14:02 2000 + Wed Mar 15 12:14:03 2000 + Wed Mar 15 03:14:04 2000 + Wed Mar 15 02:14:05 2000 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:00 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 18:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Feb 11 17:32:01 1997 + Wed Feb 12 17:32:01 1997 + Thu Feb 13 17:32:01 1997 + Fri Feb 14 17:32:01 1997 + Sat Feb 15 17:32:01 1997 + Sun Feb 16 17:32:01 1997 + Tue Feb 16 17:32:01 0097 BC + Sat Feb 16 17:32:01 0097 + Thu Feb 16 17:32:01 0597 + Tue Feb 16 17:32:01 1097 + Sat Feb 16 17:32:01 1697 + Thu Feb 16 17:32:01 1797 + Tue Feb 16 17:32:01 1897 + Sun Feb 16 17:32:01 1997 + Sat Feb 16 17:32:01 2097 + Wed Feb 28 17:32:01 1996 + Thu Feb 29 17:32:01 1996 + Fri Mar 01 17:32:01 1996 + Mon Dec 30 17:32:01 1996 + Tue Dec 31 17:32:01 1996 + Wed Jan 01 17:32:01 1997 + Fri Feb 28 17:32:01 1997 + Sat Mar 01 17:32:01 1997 + Tue Dec 30 17:32:01 1997 + Wed Dec 31 17:32:01 1997 + Fri Dec 31 17:32:01 1999 + Sat Jan 01 17:32:01 2000 + Sun Dec 31 17:32:01 2000 + Mon Jan 01 17:32:01 2001 +(65 rows) + +SET DateStyle TO 'US,ISO'; +SELECT d1 AS us_iso FROM TIMESTAMP_TBL; + us_iso +------------------------ + -infinity + infinity + 1970-01-01 00:00:00 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:02 + 1997-02-10 17:32:01.4 + 1997-02-10 17:32:01.5 + 1997-02-10 17:32:01.6 + 1997-01-02 00:00:00 + 1997-01-02 03:04:05 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-06-10 17:32:01 + 2001-09-22 18:19:20 + 2000-03-15 08:14:01 + 2000-03-15 13:14:02 + 2000-03-15 12:14:03 + 2000-03-15 03:14:04 + 2000-03-15 02:14:05 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:00 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-06-10 18:32:01 + 1997-02-10 17:32:01 + 1997-02-11 17:32:01 + 1997-02-12 17:32:01 + 1997-02-13 17:32:01 + 1997-02-14 17:32:01 + 1997-02-15 17:32:01 + 1997-02-16 17:32:01 + 0097-02-16 17:32:01 BC + 0097-02-16 17:32:01 + 0597-02-16 17:32:01 + 1097-02-16 17:32:01 + 1697-02-16 17:32:01 + 1797-02-16 17:32:01 + 1897-02-16 17:32:01 + 1997-02-16 17:32:01 + 2097-02-16 17:32:01 + 1996-02-28 17:32:01 + 1996-02-29 17:32:01 + 1996-03-01 17:32:01 + 1996-12-30 17:32:01 + 1996-12-31 17:32:01 + 1997-01-01 17:32:01 + 1997-02-28 17:32:01 + 1997-03-01 17:32:01 + 1997-12-30 17:32:01 + 1997-12-31 17:32:01 + 1999-12-31 17:32:01 + 2000-01-01 17:32:01 + 2000-12-31 17:32:01 + 2001-01-01 17:32:01 +(65 rows) + +SET DateStyle TO 'US,SQL'; +SHOW DateStyle; + DateStyle +----------- + SQL, MDY +(1 row) + +SELECT d1 AS us_sql FROM TIMESTAMP_TBL; + us_sql +------------------------ + -infinity + infinity + 01/01/1970 00:00:00 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:02 + 02/10/1997 17:32:01.4 + 02/10/1997 17:32:01.5 + 02/10/1997 17:32:01.6 + 01/02/1997 00:00:00 + 01/02/1997 03:04:05 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 06/10/1997 17:32:01 + 09/22/2001 18:19:20 + 03/15/2000 08:14:01 + 03/15/2000 13:14:02 + 03/15/2000 12:14:03 + 03/15/2000 03:14:04 + 03/15/2000 02:14:05 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:00 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 02/10/1997 17:32:01 + 06/10/1997 18:32:01 + 02/10/1997 17:32:01 + 02/11/1997 17:32:01 + 02/12/1997 17:32:01 + 02/13/1997 17:32:01 + 02/14/1997 17:32:01 + 02/15/1997 17:32:01 + 02/16/1997 17:32:01 + 02/16/0097 17:32:01 BC + 02/16/0097 17:32:01 + 02/16/0597 17:32:01 + 02/16/1097 17:32:01 + 02/16/1697 17:32:01 + 02/16/1797 17:32:01 + 02/16/1897 17:32:01 + 02/16/1997 17:32:01 + 02/16/2097 17:32:01 + 02/28/1996 17:32:01 + 02/29/1996 17:32:01 + 03/01/1996 17:32:01 + 12/30/1996 17:32:01 + 12/31/1996 17:32:01 + 01/01/1997 17:32:01 + 02/28/1997 17:32:01 + 03/01/1997 17:32:01 + 12/30/1997 17:32:01 + 12/31/1997 17:32:01 + 12/31/1999 17:32:01 + 01/01/2000 17:32:01 + 12/31/2000 17:32:01 + 01/01/2001 17:32:01 +(65 rows) + +SET DateStyle TO 'European,Postgres'; +SHOW DateStyle; + DateStyle +--------------- + Postgres, DMY +(1 row) + +INSERT INTO TIMESTAMP_TBL VALUES('13/06/1957'); +SELECT count(*) as one FROM TIMESTAMP_TBL WHERE d1 = 'Jun 13 1957'; + one +----- + 1 +(1 row) + +SELECT d1 AS european_postgres FROM TIMESTAMP_TBL; + european_postgres +----------------------------- + -infinity + infinity + Thu 01 Jan 00:00:00 1970 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:02 1997 + Mon 10 Feb 17:32:01.4 1997 + Mon 10 Feb 17:32:01.5 1997 + Mon 10 Feb 17:32:01.6 1997 + Thu 02 Jan 00:00:00 1997 + Thu 02 Jan 03:04:05 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Tue 10 Jun 17:32:01 1997 + Sat 22 Sep 18:19:20 2001 + Wed 15 Mar 08:14:01 2000 + Wed 15 Mar 13:14:02 2000 + Wed 15 Mar 12:14:03 2000 + Wed 15 Mar 03:14:04 2000 + Wed 15 Mar 02:14:05 2000 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:00 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Tue 10 Jun 18:32:01 1997 + Mon 10 Feb 17:32:01 1997 + Tue 11 Feb 17:32:01 1997 + Wed 12 Feb 17:32:01 1997 + Thu 13 Feb 17:32:01 1997 + Fri 14 Feb 17:32:01 1997 + Sat 15 Feb 17:32:01 1997 + Sun 16 Feb 17:32:01 1997 + Tue 16 Feb 17:32:01 0097 BC + Sat 16 Feb 17:32:01 0097 + Thu 16 Feb 17:32:01 0597 + Tue 16 Feb 17:32:01 1097 + Sat 16 Feb 17:32:01 1697 + Thu 16 Feb 17:32:01 1797 + Tue 16 Feb 17:32:01 1897 + Sun 16 Feb 17:32:01 1997 + Sat 16 Feb 17:32:01 2097 + Wed 28 Feb 17:32:01 1996 + Thu 29 Feb 17:32:01 1996 + Fri 01 Mar 17:32:01 1996 + Mon 30 Dec 17:32:01 1996 + Tue 31 Dec 17:32:01 1996 + Wed 01 Jan 17:32:01 1997 + Fri 28 Feb 17:32:01 1997 + Sat 01 Mar 17:32:01 1997 + Tue 30 Dec 17:32:01 1997 + Wed 31 Dec 17:32:01 1997 + Fri 31 Dec 17:32:01 1999 + Sat 01 Jan 17:32:01 2000 + Sun 31 Dec 17:32:01 2000 + Mon 01 Jan 17:32:01 2001 + Thu 13 Jun 00:00:00 1957 +(66 rows) + +SET DateStyle TO 'European,ISO'; +SHOW DateStyle; + DateStyle +----------- + ISO, DMY +(1 row) + +SELECT d1 AS european_iso FROM TIMESTAMP_TBL; + european_iso +------------------------ + -infinity + infinity + 1970-01-01 00:00:00 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:02 + 1997-02-10 17:32:01.4 + 1997-02-10 17:32:01.5 + 1997-02-10 17:32:01.6 + 1997-01-02 00:00:00 + 1997-01-02 03:04:05 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-06-10 17:32:01 + 2001-09-22 18:19:20 + 2000-03-15 08:14:01 + 2000-03-15 13:14:02 + 2000-03-15 12:14:03 + 2000-03-15 03:14:04 + 2000-03-15 02:14:05 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:00 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-02-10 17:32:01 + 1997-06-10 18:32:01 + 1997-02-10 17:32:01 + 1997-02-11 17:32:01 + 1997-02-12 17:32:01 + 1997-02-13 17:32:01 + 1997-02-14 17:32:01 + 1997-02-15 17:32:01 + 1997-02-16 17:32:01 + 0097-02-16 17:32:01 BC + 0097-02-16 17:32:01 + 0597-02-16 17:32:01 + 1097-02-16 17:32:01 + 1697-02-16 17:32:01 + 1797-02-16 17:32:01 + 1897-02-16 17:32:01 + 1997-02-16 17:32:01 + 2097-02-16 17:32:01 + 1996-02-28 17:32:01 + 1996-02-29 17:32:01 + 1996-03-01 17:32:01 + 1996-12-30 17:32:01 + 1996-12-31 17:32:01 + 1997-01-01 17:32:01 + 1997-02-28 17:32:01 + 1997-03-01 17:32:01 + 1997-12-30 17:32:01 + 1997-12-31 17:32:01 + 1999-12-31 17:32:01 + 2000-01-01 17:32:01 + 2000-12-31 17:32:01 + 2001-01-01 17:32:01 + 1957-06-13 00:00:00 +(66 rows) + +SET DateStyle TO 'European,SQL'; +SHOW DateStyle; + DateStyle +----------- + SQL, DMY +(1 row) + +SELECT d1 AS european_sql FROM TIMESTAMP_TBL; + european_sql +------------------------ + -infinity + infinity + 01/01/1970 00:00:00 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:02 + 10/02/1997 17:32:01.4 + 10/02/1997 17:32:01.5 + 10/02/1997 17:32:01.6 + 02/01/1997 00:00:00 + 02/01/1997 03:04:05 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/06/1997 17:32:01 + 22/09/2001 18:19:20 + 15/03/2000 08:14:01 + 15/03/2000 13:14:02 + 15/03/2000 12:14:03 + 15/03/2000 03:14:04 + 15/03/2000 02:14:05 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:00 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/02/1997 17:32:01 + 10/06/1997 18:32:01 + 10/02/1997 17:32:01 + 11/02/1997 17:32:01 + 12/02/1997 17:32:01 + 13/02/1997 17:32:01 + 14/02/1997 17:32:01 + 15/02/1997 17:32:01 + 16/02/1997 17:32:01 + 16/02/0097 17:32:01 BC + 16/02/0097 17:32:01 + 16/02/0597 17:32:01 + 16/02/1097 17:32:01 + 16/02/1697 17:32:01 + 16/02/1797 17:32:01 + 16/02/1897 17:32:01 + 16/02/1997 17:32:01 + 16/02/2097 17:32:01 + 28/02/1996 17:32:01 + 29/02/1996 17:32:01 + 01/03/1996 17:32:01 + 30/12/1996 17:32:01 + 31/12/1996 17:32:01 + 01/01/1997 17:32:01 + 28/02/1997 17:32:01 + 01/03/1997 17:32:01 + 30/12/1997 17:32:01 + 31/12/1997 17:32:01 + 31/12/1999 17:32:01 + 01/01/2000 17:32:01 + 31/12/2000 17:32:01 + 01/01/2001 17:32:01 + 13/06/1957 00:00:00 +(66 rows) + +RESET DateStyle; +-- +-- to_timestamp() +-- +SELECT to_timestamp('0097/Feb/16 --> 08:14:30', 'YYYY/Mon/DD --> HH:MI:SS'); + to_timestamp +------------------------------ + Sat Feb 16 08:14:30 0097 PST +(1 row) + +SELECT to_timestamp('97/2/16 8:14:30', 'FMYYYY/FMMM/FMDD FMHH:FMMI:FMSS'); + to_timestamp +------------------------------ + Sat Feb 16 08:14:30 0097 PST +(1 row) + +SELECT to_timestamp('2011$03!18 23_38_15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Fri Mar 18 23:38:15 2011 PDT +(1 row) + +SELECT to_timestamp('1985 January 12', 'YYYY FMMonth DD'); + to_timestamp +------------------------------ + Sat Jan 12 00:00:00 1985 PST +(1 row) + +SELECT to_timestamp('1985 FMMonth 12', 'YYYY "FMMonth" DD'); + to_timestamp +------------------------------ + Sat Jan 12 00:00:00 1985 PST +(1 row) + +SELECT to_timestamp('1985 \ 12', 'YYYY \\ DD'); + to_timestamp +------------------------------ + Sat Jan 12 00:00:00 1985 PST +(1 row) + +SELECT to_timestamp('My birthday-> Year: 1976, Month: May, Day: 16', + '"My birthday-> Year:" YYYY, "Month:" FMMonth, "Day:" DD'); + to_timestamp +------------------------------ + Sun May 16 00:00:00 1976 PDT +(1 row) + +SELECT to_timestamp('1,582nd VIII 21', 'Y,YYYth FMRM DD'); + to_timestamp +------------------------------ + Sat Aug 21 00:00:00 1582 PST +(1 row) + +SELECT to_timestamp('15 "text between quote marks" 98 54 45', + E'HH24 "\\"text between quote marks\\"" YY MI SS'); + to_timestamp +------------------------------ + Thu Jan 01 15:54:45 1998 PST +(1 row) + +SELECT to_timestamp('05121445482000', 'MMDDHH24MISSYYYY'); + to_timestamp +------------------------------ + Fri May 12 14:45:48 2000 PDT +(1 row) + +SELECT to_timestamp('2000January09Sunday', 'YYYYFMMonthDDFMDay'); + to_timestamp +------------------------------ + Sun Jan 09 00:00:00 2000 PST +(1 row) + +SELECT to_timestamp('97/Feb/16', 'YYMonDD'); +ERROR: invalid value "/Feb/16" for "Mon" +DETAIL: The given value did not match any of the allowed values for this field. +SELECT to_timestamp('97/Feb/16', 'YY:Mon:DD'); + to_timestamp +------------------------------ + Sun Feb 16 00:00:00 1997 PST +(1 row) + +SELECT to_timestamp('97/Feb/16', 'FXYY:Mon:DD'); + to_timestamp +------------------------------ + Sun Feb 16 00:00:00 1997 PST +(1 row) + +SELECT to_timestamp('97/Feb/16', 'FXYY/Mon/DD'); + to_timestamp +------------------------------ + Sun Feb 16 00:00:00 1997 PST +(1 row) + +SELECT to_timestamp('19971116', 'YYYYMMDD'); + to_timestamp +------------------------------ + Sun Nov 16 00:00:00 1997 PST +(1 row) + +SELECT to_timestamp('20000-1116', 'YYYY-MMDD'); + to_timestamp +------------------------------- + Thu Nov 16 00:00:00 20000 PST +(1 row) + +SELECT to_timestamp('1997 AD 11 16', 'YYYY BC MM DD'); + to_timestamp +------------------------------ + Sun Nov 16 00:00:00 1997 PST +(1 row) + +SELECT to_timestamp('1997 BC 11 16', 'YYYY BC MM DD'); + to_timestamp +--------------------------------- + Tue Nov 16 00:00:00 1997 PST BC +(1 row) + +SELECT to_timestamp('1997 A.D. 11 16', 'YYYY B.C. MM DD'); + to_timestamp +------------------------------ + Sun Nov 16 00:00:00 1997 PST +(1 row) + +SELECT to_timestamp('1997 B.C. 11 16', 'YYYY B.C. MM DD'); + to_timestamp +--------------------------------- + Tue Nov 16 00:00:00 1997 PST BC +(1 row) + +SELECT to_timestamp('9-1116', 'Y-MMDD'); + to_timestamp +------------------------------ + Mon Nov 16 00:00:00 2009 PST +(1 row) + +SELECT to_timestamp('95-1116', 'YY-MMDD'); + to_timestamp +------------------------------ + Thu Nov 16 00:00:00 1995 PST +(1 row) + +SELECT to_timestamp('995-1116', 'YYY-MMDD'); + to_timestamp +------------------------------ + Thu Nov 16 00:00:00 1995 PST +(1 row) + +SELECT to_timestamp('2005426', 'YYYYWWD'); + to_timestamp +------------------------------ + Sat Oct 15 00:00:00 2005 PDT +(1 row) + +SELECT to_timestamp('2005300', 'YYYYDDD'); + to_timestamp +------------------------------ + Thu Oct 27 00:00:00 2005 PDT +(1 row) + +SELECT to_timestamp('2005527', 'IYYYIWID'); + to_timestamp +------------------------------ + Sun Jan 01 00:00:00 2006 PST +(1 row) + +SELECT to_timestamp('005527', 'IYYIWID'); + to_timestamp +------------------------------ + Sun Jan 01 00:00:00 2006 PST +(1 row) + +SELECT to_timestamp('05527', 'IYIWID'); + to_timestamp +------------------------------ + Sun Jan 01 00:00:00 2006 PST +(1 row) + +SELECT to_timestamp('5527', 'IIWID'); + to_timestamp +------------------------------ + Sun Jan 01 00:00:00 2006 PST +(1 row) + +SELECT to_timestamp('2005364', 'IYYYIDDD'); + to_timestamp +------------------------------ + Sun Jan 01 00:00:00 2006 PST +(1 row) + +SELECT to_timestamp('20050302', 'YYYYMMDD'); + to_timestamp +------------------------------ + Wed Mar 02 00:00:00 2005 PST +(1 row) + +SELECT to_timestamp('2005 03 02', 'YYYYMMDD'); + to_timestamp +------------------------------ + Wed Mar 02 00:00:00 2005 PST +(1 row) + +SELECT to_timestamp(' 2005 03 02', 'YYYYMMDD'); + to_timestamp +------------------------------ + Wed Mar 02 00:00:00 2005 PST +(1 row) + +SELECT to_timestamp(' 20050302', 'YYYYMMDD'); + to_timestamp +------------------------------ + Wed Mar 02 00:00:00 2005 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 AM', 'YYYY-MM-DD HH12:MI PM'); + to_timestamp +------------------------------ + Sun Dec 18 11:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 PM', 'YYYY-MM-DD HH12:MI PM'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 A.M.', 'YYYY-MM-DD HH12:MI P.M.'); + to_timestamp +------------------------------ + Sun Dec 18 11:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 P.M.', 'YYYY-MM-DD HH12:MI P.M.'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 +05', 'YYYY-MM-DD HH12:MI TZH'); + to_timestamp +------------------------------ + Sat Dec 17 22:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 -05', 'YYYY-MM-DD HH12:MI TZH'); + to_timestamp +------------------------------ + Sun Dec 18 08:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 +05:20', 'YYYY-MM-DD HH12:MI TZH:TZM'); + to_timestamp +------------------------------ + Sat Dec 17 22:18:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 -05:20', 'YYYY-MM-DD HH12:MI TZH:TZM'); + to_timestamp +------------------------------ + Sun Dec 18 08:58:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 20', 'YYYY-MM-DD HH12:MI TZM'); + to_timestamp +------------------------------ + Sun Dec 18 03:18:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 PST', 'YYYY-MM-DD HH12:MI TZ'); -- NYI +ERROR: formatting field "TZ" is only supported in to_char +SELECT to_timestamp('2018-11-02 12:34:56.025', 'YYYY-MM-DD HH24:MI:SS.MS'); + to_timestamp +---------------------------------- + Fri Nov 02 12:34:56.025 2018 PDT +(1 row) + +SELECT i, to_timestamp('2018-11-02 12:34:56', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+------------------------------ + 1 | Fri Nov 02 12:34:56 2018 PDT + 2 | Fri Nov 02 12:34:56 2018 PDT + 3 | Fri Nov 02 12:34:56 2018 PDT + 4 | Fri Nov 02 12:34:56 2018 PDT + 5 | Fri Nov 02 12:34:56 2018 PDT + 6 | Fri Nov 02 12:34:56 2018 PDT +(6 rows) + +SELECT i, to_timestamp('2018-11-02 12:34:56.1', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+-------------------------------- + 1 | Fri Nov 02 12:34:56.1 2018 PDT + 2 | Fri Nov 02 12:34:56.1 2018 PDT + 3 | Fri Nov 02 12:34:56.1 2018 PDT + 4 | Fri Nov 02 12:34:56.1 2018 PDT + 5 | Fri Nov 02 12:34:56.1 2018 PDT + 6 | Fri Nov 02 12:34:56.1 2018 PDT +(6 rows) + +SELECT i, to_timestamp('2018-11-02 12:34:56.12', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+--------------------------------- + 1 | Fri Nov 02 12:34:56.1 2018 PDT + 2 | Fri Nov 02 12:34:56.12 2018 PDT + 3 | Fri Nov 02 12:34:56.12 2018 PDT + 4 | Fri Nov 02 12:34:56.12 2018 PDT + 5 | Fri Nov 02 12:34:56.12 2018 PDT + 6 | Fri Nov 02 12:34:56.12 2018 PDT +(6 rows) + +SELECT i, to_timestamp('2018-11-02 12:34:56.123', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+---------------------------------- + 1 | Fri Nov 02 12:34:56.1 2018 PDT + 2 | Fri Nov 02 12:34:56.12 2018 PDT + 3 | Fri Nov 02 12:34:56.123 2018 PDT + 4 | Fri Nov 02 12:34:56.123 2018 PDT + 5 | Fri Nov 02 12:34:56.123 2018 PDT + 6 | Fri Nov 02 12:34:56.123 2018 PDT +(6 rows) + +SELECT i, to_timestamp('2018-11-02 12:34:56.1234', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+----------------------------------- + 1 | Fri Nov 02 12:34:56.1 2018 PDT + 2 | Fri Nov 02 12:34:56.12 2018 PDT + 3 | Fri Nov 02 12:34:56.123 2018 PDT + 4 | Fri Nov 02 12:34:56.1234 2018 PDT + 5 | Fri Nov 02 12:34:56.1234 2018 PDT + 6 | Fri Nov 02 12:34:56.1234 2018 PDT +(6 rows) + +SELECT i, to_timestamp('2018-11-02 12:34:56.12345', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+------------------------------------ + 1 | Fri Nov 02 12:34:56.1 2018 PDT + 2 | Fri Nov 02 12:34:56.12 2018 PDT + 3 | Fri Nov 02 12:34:56.123 2018 PDT + 4 | Fri Nov 02 12:34:56.1235 2018 PDT + 5 | Fri Nov 02 12:34:56.12345 2018 PDT + 6 | Fri Nov 02 12:34:56.12345 2018 PDT +(6 rows) + +SELECT i, to_timestamp('2018-11-02 12:34:56.123456', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+------------------------------------- + 1 | Fri Nov 02 12:34:56.1 2018 PDT + 2 | Fri Nov 02 12:34:56.12 2018 PDT + 3 | Fri Nov 02 12:34:56.123 2018 PDT + 4 | Fri Nov 02 12:34:56.1235 2018 PDT + 5 | Fri Nov 02 12:34:56.12346 2018 PDT + 6 | Fri Nov 02 12:34:56.123456 2018 PDT +(6 rows) + +SELECT i, to_timestamp('2018-11-02 12:34:56.123456789', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +ERROR: date/time field value out of range: "2018-11-02 12:34:56.123456789" +SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored + to_date +------------ + 04-01-1902 +(1 row) + +SELECT to_date('3 4 21 01', 'W MM CC YY'); + to_date +------------ + 04-15-2001 +(1 row) + +SELECT to_date('2458872', 'J'); + to_date +------------ + 01-23-2020 +(1 row) + +-- +-- Check handling of BC dates +-- +SELECT to_date('44-02-01 BC','YYYY-MM-DD BC'); + to_date +--------------- + 02-01-0044 BC +(1 row) + +SELECT to_date('-44-02-01','YYYY-MM-DD'); + to_date +--------------- + 02-01-0044 BC +(1 row) + +SELECT to_date('-44-02-01 BC','YYYY-MM-DD BC'); + to_date +------------ + 02-01-0044 +(1 row) + +SELECT to_timestamp('44-02-01 11:12:13 BC','YYYY-MM-DD HH24:MI:SS BC'); + to_timestamp +--------------------------------- + Fri Feb 01 11:12:13 0044 PST BC +(1 row) + +SELECT to_timestamp('-44-02-01 11:12:13','YYYY-MM-DD HH24:MI:SS'); + to_timestamp +--------------------------------- + Fri Feb 01 11:12:13 0044 PST BC +(1 row) + +SELECT to_timestamp('-44-02-01 11:12:13 BC','YYYY-MM-DD HH24:MI:SS BC'); + to_timestamp +------------------------------ + Mon Feb 01 11:12:13 0044 PST +(1 row) + +-- +-- Check handling of multiple spaces in format and/or input +-- +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + to_timestamp +------------------------------ + Sun Dec 18 23:38:15 2011 PST +(1 row) + +SELECT to_timestamp('2000+ JUN', 'YYYY/MON'); + to_timestamp +------------------------------ + Thu Jun 01 00:00:00 2000 PDT +(1 row) + +SELECT to_timestamp(' 2000 +JUN', 'YYYY/MON'); + to_timestamp +------------------------------ + Thu Jun 01 00:00:00 2000 PDT +(1 row) + +SELECT to_timestamp(' 2000 +JUN', 'YYYY//MON'); + to_timestamp +------------------------------ + Thu Jun 01 00:00:00 2000 PDT +(1 row) + +SELECT to_timestamp('2000 +JUN', 'YYYY//MON'); + to_timestamp +------------------------------ + Thu Jun 01 00:00:00 2000 PDT +(1 row) + +SELECT to_timestamp('2000 + JUN', 'YYYY MON'); + to_timestamp +------------------------------ + Thu Jun 01 00:00:00 2000 PDT +(1 row) + +SELECT to_timestamp('2000 ++ JUN', 'YYYY MON'); + to_timestamp +------------------------------ + Thu Jun 01 00:00:00 2000 PDT +(1 row) + +SELECT to_timestamp('2000 + + JUN', 'YYYY MON'); +ERROR: invalid value "+" for "MON" +DETAIL: The given value did not match any of the allowed values for this field. +SELECT to_timestamp('2000 + + JUN', 'YYYY MON'); + to_timestamp +------------------------------ + Thu Jun 01 00:00:00 2000 PDT +(1 row) + +SELECT to_timestamp('2000 -10', 'YYYY TZH'); + to_timestamp +------------------------------ + Sat Jan 01 02:00:00 2000 PST +(1 row) + +SELECT to_timestamp('2000 -10', 'YYYY TZH'); + to_timestamp +------------------------------ + Fri Dec 31 06:00:00 1999 PST +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYY MM DD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 12 18', 'YYYYxMMxDD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011x 12x 18', 'YYYYxMMxDD'); + to_date +------------ + 12-18-2011 +(1 row) + +SELECT to_date('2011 x12 x18', 'YYYYxMMxDD'); +ERROR: invalid value "x1" for "MM" +DETAIL: Value must be an integer. +-- +-- Check errors for some incorrect usages of to_timestamp() and to_date() +-- +-- Mixture of date conventions (ISO week and Gregorian): +SELECT to_timestamp('2005527', 'YYYYIWID'); +ERROR: invalid combination of date conventions +HINT: Do not mix Gregorian and ISO week date conventions in a formatting template. +-- Insufficient characters in the source string: +SELECT to_timestamp('19971', 'YYYYMMDD'); +ERROR: source string too short for "MM" formatting field +DETAIL: Field requires 2 characters, but only 1 remain. +HINT: If your source string is not fixed-width, try using the "FM" modifier. +-- Insufficient digit characters for a single node: +SELECT to_timestamp('19971)24', 'YYYYMMDD'); +ERROR: invalid value "1)" for "MM" +DETAIL: Field requires 2 characters, but only 1 could be parsed. +HINT: If your source string is not fixed-width, try using the "FM" modifier. +-- We don't accept full-length day or month names if short form is specified: +SELECT to_timestamp('Friday 1-January-1999', 'DY DD MON YYYY'); +ERROR: invalid value "da" for "DD" +DETAIL: Value must be an integer. +SELECT to_timestamp('Fri 1-January-1999', 'DY DD MON YYYY'); +ERROR: invalid value "uary" for "YYYY" +DETAIL: Value must be an integer. +SELECT to_timestamp('Fri 1-Jan-1999', 'DY DD MON YYYY'); -- ok + to_timestamp +------------------------------ + Fri Jan 01 00:00:00 1999 PST +(1 row) + +-- Value clobbering: +SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD'); +ERROR: conflicting values for "Mon" field in formatting string +DETAIL: This value contradicts a previous setting for the same field type. +-- Non-numeric input: +SELECT to_timestamp('199711xy', 'YYYYMMDD'); +ERROR: invalid value "xy" for "DD" +DETAIL: Value must be an integer. +-- Input that doesn't fit in an int: +SELECT to_timestamp('10000000000', 'FMYYYY'); +ERROR: value for "YYYY" in source string is out of range +DETAIL: Value must be in the range -2147483648 to 2147483647. +-- Out-of-range and not-quite-out-of-range fields: +SELECT to_timestamp('2016-06-13 25:00:00', 'YYYY-MM-DD HH24:MI:SS'); +ERROR: date/time field value out of range: "2016-06-13 25:00:00" +SELECT to_timestamp('2016-06-13 15:60:00', 'YYYY-MM-DD HH24:MI:SS'); +ERROR: date/time field value out of range: "2016-06-13 15:60:00" +SELECT to_timestamp('2016-06-13 15:50:60', 'YYYY-MM-DD HH24:MI:SS'); +ERROR: date/time field value out of range: "2016-06-13 15:50:60" +SELECT to_timestamp('2016-06-13 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); -- ok + to_timestamp +------------------------------ + Mon Jun 13 15:50:55 2016 PDT +(1 row) + +SELECT to_timestamp('2016-06-13 15:50:55', 'YYYY-MM-DD HH:MI:SS'); +WARNING: hour "15" is invalid for the 12-hour clock +HINT: Use the 24-hour clock, or give an hour between 1 and 12. + to_timestamp +------------------------------ + Mon Jun 13 15:50:55 2016 PDT +(1 row) + +SELECT to_timestamp('2016-13-01 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); +ERROR: date/time field value out of range: "2016-13-01 15:50:55" +SELECT to_timestamp('2016-02-30 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); +ERROR: date/time field value out of range: "2016-02-30 15:50:55" +SELECT to_timestamp('2016-02-29 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); -- ok + to_timestamp +------------------------------ + Mon Feb 29 15:50:55 2016 PST +(1 row) + +SELECT to_timestamp('2015-02-29 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); +ERROR: date/time field value out of range: "2015-02-29 15:50:55" +SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSS'); -- ok + to_timestamp +------------------------------ + Wed Feb 11 23:53:20 2015 PST +(1 row) + +SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSS'); +ERROR: date/time field value out of range: "2015-02-11 86400" +SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSSS'); -- ok + to_timestamp +------------------------------ + Wed Feb 11 23:53:20 2015 PST +(1 row) + +SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSSS'); +ERROR: date/time field value out of range: "2015-02-11 86400" +SELECT to_date('2016-13-10', 'YYYY-MM-DD'); +ERROR: date/time field value out of range: "2016-13-10" +SELECT to_date('2016-02-30', 'YYYY-MM-DD'); +ERROR: date/time field value out of range: "2016-02-30" +SELECT to_date('2016-02-29', 'YYYY-MM-DD'); -- ok + to_date +------------ + 02-29-2016 +(1 row) + +SELECT to_date('2015-02-29', 'YYYY-MM-DD'); +ERROR: date/time field value out of range: "2015-02-29" +SELECT to_date('2015 365', 'YYYY DDD'); -- ok + to_date +------------ + 12-31-2015 +(1 row) + +SELECT to_date('2015 366', 'YYYY DDD'); +ERROR: date/time field value out of range: "2015 366" +SELECT to_date('2016 365', 'YYYY DDD'); -- ok + to_date +------------ + 12-30-2016 +(1 row) + +SELECT to_date('2016 366', 'YYYY DDD'); -- ok + to_date +------------ + 12-31-2016 +(1 row) + +SELECT to_date('2016 367', 'YYYY DDD'); +ERROR: date/time field value out of range: "2016 367" +SELECT to_date('0000-02-01','YYYY-MM-DD'); -- allowed, though it shouldn't be + to_date +--------------- + 02-01-0001 BC +(1 row) + +-- +-- Check behavior with SQL-style fixed-GMT-offset time zone (cf bug #8572) +-- +SET TIME ZONE 'America/New_York'; +SET TIME ZONE '-1.5'; +SHOW TIME ZONE; + TimeZone +---------------- + <-01:30>+01:30 +(1 row) + +SELECT '2012-12-12 12:00'::timestamptz; + timestamptz +--------------------------------- + Wed Dec 12 12:00:00 2012 -01:30 +(1 row) + +SELECT '2012-12-12 12:00 America/New_York'::timestamptz; + timestamptz +--------------------------------- + Wed Dec 12 15:30:00 2012 -01:30 +(1 row) + +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ'); + to_char +---------------------------- + 2012-12-12 12:00:00 -01:30 +(1 row) + +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSS'); + to_char +------------------ + 2012-12-12 43200 +(1 row) + +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSSS'); + to_char +------------------ + 2012-12-12 43200 +(1 row) + +RESET TIME ZONE; diff --git a/src/test/singlenode_regress/expected/hs_standby_allowed.out b/src/test/singlenode_regress/expected/hs_standby_allowed.out new file mode 100644 index 00000000000..00b8faf9eb6 --- /dev/null +++ b/src/test/singlenode_regress/expected/hs_standby_allowed.out @@ -0,0 +1,218 @@ +-- +-- Hot Standby tests +-- +-- hs_standby_allowed.sql +-- +-- SELECT +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +select count(*) as should_be_2 from hs2; + should_be_2 +------------- + 2 +(1 row) + +select count(*) as should_be_3 from hs3; + should_be_3 +------------- + 3 +(1 row) + +COPY hs1 TO '/tmp/copy_test'; +\! cat /tmp/copy_test +1 +-- Access sequence directly +select is_called from hsseq; + is_called +----------- + f +(1 row) + +-- Transactions +begin; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +end; +begin transaction read only; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +end; +begin transaction isolation level repeatable read; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +commit; +begin; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +commit; +begin; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +abort; +start transaction; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +commit; +begin; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +rollback; +begin; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +savepoint s; +select count(*) as should_be_2 from hs2; + should_be_2 +------------- + 2 +(1 row) + +commit; +begin; +select count(*) as should_be_1 from hs1; + should_be_1 +------------- + 1 +(1 row) + +savepoint s; +select count(*) as should_be_2 from hs2; + should_be_2 +------------- + 2 +(1 row) + +release savepoint s; +select count(*) as should_be_2 from hs2; + should_be_2 +------------- + 2 +(1 row) + +savepoint s; +select count(*) as should_be_3 from hs3; + should_be_3 +------------- + 3 +(1 row) + +rollback to savepoint s; +select count(*) as should_be_2 from hs2; + should_be_2 +------------- + 2 +(1 row) + +commit; +-- SET parameters +-- has no effect on read only transactions, but we can still set it +set synchronous_commit = on; +show synchronous_commit; + synchronous_commit +-------------------- + on +(1 row) + +reset synchronous_commit; +discard temp; +discard all; +-- CURSOR commands +BEGIN; +DECLARE hsc CURSOR FOR select * from hs3; +FETCH next from hsc; + col1 +------ + 113 +(1 row) + +fetch first from hsc; + col1 +------ + 113 +(1 row) + +fetch last from hsc; + col1 +------ + 115 +(1 row) + +fetch 1 from hsc; + col1 +------ +(0 rows) + +CLOSE hsc; +COMMIT; +-- Prepared plans +PREPARE hsp AS select count(*) from hs1; +PREPARE hsp_noexec (integer) AS insert into hs1 values ($1); +EXECUTE hsp; + count +------- + 1 +(1 row) + +DEALLOCATE hsp; +-- LOCK +BEGIN; +LOCK hs1 IN ACCESS SHARE MODE; +LOCK hs1 IN ROW SHARE MODE; +LOCK hs1 IN ROW EXCLUSIVE MODE; +COMMIT; +-- UNLISTEN +UNLISTEN a; +UNLISTEN *; +-- LOAD +-- should work, easier if there is no test for that... +-- ALLOWED COMMANDS +CHECKPOINT; +discard all; diff --git a/src/test/singlenode_regress/expected/hs_standby_check.out b/src/test/singlenode_regress/expected/hs_standby_check.out new file mode 100644 index 00000000000..df885ea9e07 --- /dev/null +++ b/src/test/singlenode_regress/expected/hs_standby_check.out @@ -0,0 +1,20 @@ +-- +-- Hot Standby tests +-- +-- hs_standby_check.sql +-- +-- +-- If the query below returns false then all other tests will fail after it. +-- +select case pg_is_in_recovery() when false then + 'These tests are intended only for execution on a standby server that is reading ' || + 'WAL from a server upon which the regression database is already created and into ' || + 'which src/test/regress/sql/hs_primary_setup.sql has been run' +else + 'Tests are running on a standby server during recovery' +end; + case +------------------------------------------------------- + Tests are running on a standby server during recovery +(1 row) + diff --git a/src/test/singlenode_regress/expected/hs_standby_disallowed.out b/src/test/singlenode_regress/expected/hs_standby_disallowed.out new file mode 100644 index 00000000000..8d3cafa5cec --- /dev/null +++ b/src/test/singlenode_regress/expected/hs_standby_disallowed.out @@ -0,0 +1,133 @@ +-- +-- Hot Standby tests +-- +-- hs_standby_disallowed.sql +-- +SET transaction_read_only = off; +ERROR: cannot set transaction read-write mode during recovery +begin transaction read write; +ERROR: cannot set transaction read-write mode during recovery +commit; +WARNING: there is no transaction in progress +-- SELECT +select * from hs1 FOR SHARE; +ERROR: cannot execute SELECT FOR SHARE in a read-only transaction +select * from hs1 FOR UPDATE; +ERROR: cannot execute SELECT FOR UPDATE in a read-only transaction +-- DML +BEGIN; +insert into hs1 values (37); +ERROR: cannot execute INSERT in a read-only transaction +ROLLBACK; +BEGIN; +delete from hs1 where col1 = 1; +ERROR: cannot execute DELETE in a read-only transaction +ROLLBACK; +BEGIN; +update hs1 set col1 = NULL where col1 > 0; +ERROR: cannot execute UPDATE in a read-only transaction +ROLLBACK; +BEGIN; +truncate hs3; +ERROR: cannot execute TRUNCATE TABLE in a read-only transaction +ROLLBACK; +-- DDL +create temporary table hstemp1 (col1 integer); +ERROR: cannot execute CREATE TABLE in a read-only transaction +BEGIN; +drop table hs2; +ERROR: cannot execute DROP TABLE in a read-only transaction +ROLLBACK; +BEGIN; +create table hs4 (col1 integer); +ERROR: cannot execute CREATE TABLE in a read-only transaction +ROLLBACK; +-- Sequences +SELECT nextval('hsseq'); +ERROR: cannot execute nextval() in a read-only transaction +-- Two-phase commit transaction stuff +BEGIN; +SELECT count(*) FROM hs1; + count +------- + 1 +(1 row) + +PREPARE TRANSACTION 'foobar'; +ERROR: cannot execute PREPARE TRANSACTION during recovery +ROLLBACK; +BEGIN; +SELECT count(*) FROM hs1; + count +------- + 1 +(1 row) + +COMMIT PREPARED 'foobar'; +ERROR: cannot execute COMMIT PREPARED during recovery +ROLLBACK; +BEGIN; +SELECT count(*) FROM hs1; + count +------- + 1 +(1 row) + +PREPARE TRANSACTION 'foobar'; +ERROR: cannot execute PREPARE TRANSACTION during recovery +ROLLBACK PREPARED 'foobar'; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +BEGIN; +SELECT count(*) FROM hs1; + count +------- + 1 +(1 row) + +ROLLBACK PREPARED 'foobar'; +ERROR: cannot execute ROLLBACK PREPARED during recovery +ROLLBACK; +-- Locks +BEGIN; +LOCK hs1; +ERROR: cannot execute LOCK TABLE during recovery +COMMIT; +BEGIN; +LOCK hs1 IN SHARE UPDATE EXCLUSIVE MODE; +ERROR: cannot execute LOCK TABLE during recovery +COMMIT; +BEGIN; +LOCK hs1 IN SHARE MODE; +ERROR: cannot execute LOCK TABLE during recovery +COMMIT; +BEGIN; +LOCK hs1 IN SHARE ROW EXCLUSIVE MODE; +ERROR: cannot execute LOCK TABLE during recovery +COMMIT; +BEGIN; +LOCK hs1 IN EXCLUSIVE MODE; +ERROR: cannot execute LOCK TABLE during recovery +COMMIT; +BEGIN; +LOCK hs1 IN ACCESS EXCLUSIVE MODE; +ERROR: cannot execute LOCK TABLE during recovery +COMMIT; +-- Listen +listen a; +ERROR: cannot execute LISTEN during recovery +notify a; +ERROR: cannot execute NOTIFY during recovery +-- disallowed commands +ANALYZE hs1; +ERROR: cannot execute ANALYZE during recovery +VACUUM hs2; +ERROR: cannot execute VACUUM during recovery +CLUSTER hs2 using hs1_pkey; +ERROR: cannot execute CLUSTER during recovery +REINDEX TABLE hs2; +ERROR: cannot execute REINDEX during recovery +REVOKE SELECT ON hs1 FROM PUBLIC; +ERROR: cannot execute REVOKE in a read-only transaction +GRANT SELECT ON hs1 TO PUBLIC; +ERROR: cannot execute GRANT in a read-only transaction diff --git a/src/test/singlenode_regress/expected/hs_standby_functions.out b/src/test/singlenode_regress/expected/hs_standby_functions.out new file mode 100644 index 00000000000..ce846b758bf --- /dev/null +++ b/src/test/singlenode_regress/expected/hs_standby_functions.out @@ -0,0 +1,40 @@ +-- +-- Hot Standby tests +-- +-- hs_standby_functions.sql +-- +-- should fail +select pg_current_xact_id(); +ERROR: cannot execute pg_current_xact_id() during recovery +select length(pg_current_snapshot()::text) >= 4; + ?column? +---------- + t +(1 row) + +select pg_start_backup('should fail'); +ERROR: recovery is in progress +HINT: WAL control functions cannot be executed during recovery. +select pg_switch_wal(); +ERROR: recovery is in progress +HINT: WAL control functions cannot be executed during recovery. +select pg_stop_backup(); +ERROR: recovery is in progress +HINT: WAL control functions cannot be executed during recovery. +-- should return no rows +select * from pg_prepared_xacts; + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) + +-- just the startup process +select locktype, virtualxid, virtualtransaction, mode, granted +from pg_locks where virtualxid = '1/1'; + locktype | virtualxid | virtualtransaction | mode | granted +------------+------------+--------------------+---------------+--------- + virtualxid | 1/1 | 1/0 | ExclusiveLock | t +(1 row) + +-- suicide is painless +select pg_cancel_backend(pg_backend_pid()); +ERROR: canceling statement due to user request diff --git a/src/test/singlenode_regress/expected/identity.out b/src/test/singlenode_regress/expected/identity.out new file mode 100644 index 00000000000..99811570b7b --- /dev/null +++ b/src/test/singlenode_regress/expected/identity.out @@ -0,0 +1,562 @@ +-- sanity check of system catalog +SELECT attrelid, attname, attidentity FROM pg_attribute WHERE attidentity NOT IN ('', 'a', 'd'); + attrelid | attname | attidentity +----------+---------+------------- +(0 rows) + +CREATE TABLE itest1 (a int generated by default as identity, b text); +CREATE TABLE itest2 (a bigint generated always as identity, b text); +CREATE TABLE itest3 (a smallint generated by default as identity (start with 7 increment by 5), b text); +ALTER TABLE itest3 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error +ERROR: column "a" of relation "itest3" is already an identity column +SELECT table_name, column_name, column_default, is_nullable, is_identity, identity_generation, identity_start, identity_increment, identity_maximum, identity_minimum, identity_cycle FROM information_schema.columns WHERE table_name LIKE 'itest_' ORDER BY 1, 2; + table_name | column_name | column_default | is_nullable | is_identity | identity_generation | identity_start | identity_increment | identity_maximum | identity_minimum | identity_cycle +------------+-------------+----------------+-------------+-------------+---------------------+----------------+--------------------+---------------------+------------------+---------------- + itest1 | a | | NO | YES | BY DEFAULT | 1 | 1 | 2147483647 | 1 | NO + itest1 | b | | YES | NO | | | | | | NO + itest2 | a | | NO | YES | ALWAYS | 1 | 1 | 9223372036854775807 | 1 | NO + itest2 | b | | YES | NO | | | | | | NO + itest3 | a | | NO | YES | BY DEFAULT | 7 | 5 | 32767 | 1 | NO + itest3 | b | | YES | NO | | | | | | NO +(6 rows) + +-- internal sequences should not be shown here +SELECT sequence_name FROM information_schema.sequences WHERE sequence_name LIKE 'itest%'; + sequence_name +--------------- +(0 rows) + +SELECT pg_get_serial_sequence('itest1', 'a'); + pg_get_serial_sequence +------------------------ + public.itest1_a_seq +(1 row) + +\d itest1_a_seq + Sequence "public.itest1_a_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Sequence for identity column: public.itest1.a + +CREATE TABLE itest4 (a int, b text); +ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, requires NOT NULL +ERROR: column "a" of relation "itest4" must be declared NOT NULL before identity can be added +ALTER TABLE itest4 ALTER COLUMN a SET NOT NULL; +ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- ok +ALTER TABLE itest4 ALTER COLUMN a DROP NOT NULL; -- error, disallowed +ERROR: column "a" of relation "itest4" is an identity column +ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, already set +ERROR: column "a" of relation "itest4" is already an identity column +ALTER TABLE itest4 ALTER COLUMN b ADD GENERATED ALWAYS AS IDENTITY; -- error, wrong data type +ERROR: identity column type must be smallint, integer, or bigint +-- for later +ALTER TABLE itest4 ALTER COLUMN b SET DEFAULT ''; +-- invalid column type +CREATE TABLE itest_err_1 (a text generated by default as identity); +ERROR: identity column type must be smallint, integer, or bigint +-- duplicate identity +CREATE TABLE itest_err_2 (a int generated always as identity generated by default as identity); +ERROR: multiple identity specifications for column "a" of table "itest_err_2" +LINE 1: ...E itest_err_2 (a int generated always as identity generated ... + ^ +-- cannot have default and identity +CREATE TABLE itest_err_3 (a int default 5 generated by default as identity); +ERROR: both default and identity specified for column "a" of table "itest_err_3" +LINE 1: CREATE TABLE itest_err_3 (a int default 5 generated by defau... + ^ +-- cannot combine serial and identity +CREATE TABLE itest_err_4 (a serial generated by default as identity); +ERROR: both default and identity specified for column "a" of table "itest_err_4" +INSERT INTO itest1 DEFAULT VALUES; +INSERT INTO itest1 DEFAULT VALUES; +INSERT INTO itest2 DEFAULT VALUES; +INSERT INTO itest2 DEFAULT VALUES; +INSERT INTO itest3 DEFAULT VALUES; +INSERT INTO itest3 DEFAULT VALUES; +INSERT INTO itest4 DEFAULT VALUES; +INSERT INTO itest4 DEFAULT VALUES; +SELECT * FROM itest1; + a | b +---+--- + 1 | + 2 | +(2 rows) + +SELECT * FROM itest2; + a | b +---+--- + 1 | + 2 | +(2 rows) + +SELECT * FROM itest3; + a | b +----+--- + 7 | + 12 | +(2 rows) + +SELECT * FROM itest4; + a | b +---+--- + 1 | + 2 | +(2 rows) + +-- VALUES RTEs +CREATE TABLE itest5 (a int generated always as identity, b text); +INSERT INTO itest5 VALUES (1, 'a'); -- error +ERROR: cannot insert a non-DEFAULT value into column "a" +DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO itest5 VALUES (DEFAULT, 'a'); -- ok +INSERT INTO itest5 VALUES (2, 'b'), (3, 'c'); -- error +ERROR: cannot insert a non-DEFAULT value into column "a" +DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO itest5 VALUES (DEFAULT, 'b'), (3, 'c'); -- error +ERROR: cannot insert a non-DEFAULT value into column "a" +DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO itest5 VALUES (2, 'b'), (DEFAULT, 'c'); -- error +ERROR: cannot insert a non-DEFAULT value into column "a" +DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO itest5 VALUES (DEFAULT, 'b'), (DEFAULT, 'c'); -- ok +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (-1, 'aa'); +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (-2, 'bb'), (-3, 'cc'); +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (DEFAULT, 'dd'), (-4, 'ee'); +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (-5, 'ff'), (DEFAULT, 'gg'); +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (DEFAULT, 'hh'), (DEFAULT, 'ii'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (-1, 'aaa'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (-2, 'bbb'), (-3, 'ccc'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (DEFAULT, 'ddd'), (-4, 'eee'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (-5, 'fff'), (DEFAULT, 'ggg'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (DEFAULT, 'hhh'), (DEFAULT, 'iii'); +SELECT * FROM itest5; + a | b +----+----- + 1 | a + 2 | b + 3 | c + -1 | aa + -2 | bb + -3 | cc + 4 | dd + -4 | ee + -5 | ff + 5 | gg + 6 | hh + 7 | ii + 8 | aaa + 9 | bbb + 10 | ccc + 11 | ddd + 12 | eee + 13 | fff + 14 | ggg + 15 | hhh + 16 | iii +(21 rows) + +DROP TABLE itest5; +INSERT INTO itest3 VALUES (DEFAULT, 'a'); +INSERT INTO itest3 VALUES (DEFAULT, 'b'), (DEFAULT, 'c'); +SELECT * FROM itest3; + a | b +----+--- + 7 | + 12 | + 17 | a + 22 | b + 27 | c +(5 rows) + +-- OVERRIDING tests +-- GENERATED BY DEFAULT +-- This inserts the row as presented: +INSERT INTO itest1 VALUES (10, 'xyz'); +-- With GENERATED BY DEFAULT, OVERRIDING SYSTEM VALUE is not allowed +-- by the standard, but we allow it as a no-op, since it is of use if +-- there are multiple identity columns in a table, which is also an +-- extension. +INSERT INTO itest1 OVERRIDING SYSTEM VALUE VALUES (20, 'xyz'); +-- This ignores the 30 and uses the sequence value instead: +INSERT INTO itest1 OVERRIDING USER VALUE VALUES (30, 'xyz'); +SELECT * FROM itest1; + a | b +----+----- + 1 | + 2 | + 10 | xyz + 20 | xyz + 3 | xyz +(5 rows) + +-- GENERATED ALWAYS +-- This is an error: +INSERT INTO itest2 VALUES (10, 'xyz'); +ERROR: cannot insert a non-DEFAULT value into column "a" +DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +-- This inserts the row as presented: +INSERT INTO itest2 OVERRIDING SYSTEM VALUE VALUES (20, 'xyz'); +-- This ignores the 30 and uses the sequence value instead: +INSERT INTO itest2 OVERRIDING USER VALUE VALUES (30, 'xyz'); +SELECT * FROM itest2; + a | b +----+----- + 1 | + 2 | + 20 | xyz + 3 | xyz +(4 rows) + +-- UPDATE tests +-- GENERATED BY DEFAULT is not restricted. +UPDATE itest1 SET a = 101 WHERE a = 1; +UPDATE itest1 SET a = DEFAULT WHERE a = 2; +SELECT * FROM itest1; + a | b +-----+----- + 10 | xyz + 20 | xyz + 3 | xyz + 101 | + 4 | +(5 rows) + +-- GENERATED ALWAYS allows only DEFAULT. +UPDATE itest2 SET a = 101 WHERE a = 1; -- error +ERROR: column "a" can only be updated to DEFAULT +DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. +UPDATE itest2 SET a = DEFAULT WHERE a = 2; -- ok +SELECT * FROM itest2; + a | b +----+----- + 1 | + 20 | xyz + 3 | xyz + 4 | +(4 rows) + +-- COPY tests +CREATE TABLE itest9 (a int GENERATED ALWAYS AS IDENTITY, b text, c bigint); +COPY itest9 FROM stdin; +COPY itest9 (b, c) FROM stdin; +SELECT * FROM itest9 ORDER BY c; + a | b | c +-----+------+----- + 100 | foo | 200 + 101 | bar | 201 + 1 | foo2 | 202 + 2 | bar2 | 203 +(4 rows) + +-- DROP IDENTITY tests +ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY; +ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY; -- error +ERROR: column "a" of relation "itest4" is not an identity column +ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY IF EXISTS; -- noop +NOTICE: column "a" of relation "itest4" is not an identity column, skipping +INSERT INTO itest4 DEFAULT VALUES; -- fails because NOT NULL is not dropped +ERROR: null value in column "a" of relation "itest4" violates not-null constraint +DETAIL: Failing row contains (null, ). +ALTER TABLE itest4 ALTER COLUMN a DROP NOT NULL; +INSERT INTO itest4 DEFAULT VALUES; +SELECT * FROM itest4; + a | b +---+--- + 1 | + 2 | + | +(3 rows) + +-- check that sequence is removed +SELECT sequence_name FROM itest4_a_seq; +ERROR: relation "itest4_a_seq" does not exist +LINE 1: SELECT sequence_name FROM itest4_a_seq; + ^ +-- test views +CREATE TABLE itest10 (a int generated by default as identity, b text); +CREATE TABLE itest11 (a int generated always as identity, b text); +CREATE VIEW itestv10 AS SELECT * FROM itest10; +CREATE VIEW itestv11 AS SELECT * FROM itest11; +INSERT INTO itestv10 DEFAULT VALUES; +INSERT INTO itestv10 DEFAULT VALUES; +INSERT INTO itestv11 DEFAULT VALUES; +INSERT INTO itestv11 DEFAULT VALUES; +SELECT * FROM itestv10; + a | b +---+--- + 1 | + 2 | +(2 rows) + +SELECT * FROM itestv11; + a | b +---+--- + 1 | + 2 | +(2 rows) + +INSERT INTO itestv10 VALUES (10, 'xyz'); +INSERT INTO itestv10 OVERRIDING USER VALUE VALUES (11, 'xyz'); +SELECT * FROM itestv10; + a | b +----+----- + 1 | + 2 | + 10 | xyz + 3 | xyz +(4 rows) + +INSERT INTO itestv11 VALUES (10, 'xyz'); +ERROR: cannot insert a non-DEFAULT value into column "a" +DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO itestv11 OVERRIDING SYSTEM VALUE VALUES (11, 'xyz'); +SELECT * FROM itestv11; + a | b +----+----- + 1 | + 2 | + 11 | xyz +(3 rows) + +DROP VIEW itestv10, itestv11; +-- ADD COLUMN +CREATE TABLE itest13 (a int); +-- add column to empty table +ALTER TABLE itest13 ADD COLUMN b int GENERATED BY DEFAULT AS IDENTITY; +INSERT INTO itest13 VALUES (1), (2), (3); +-- add column to populated table +ALTER TABLE itest13 ADD COLUMN c int GENERATED BY DEFAULT AS IDENTITY; +SELECT * FROM itest13; + a | b | c +---+---+--- + 1 | 1 | 1 + 2 | 2 | 2 + 3 | 3 | 3 +(3 rows) + +-- various ALTER COLUMN tests +-- fail, not allowed for identity columns +ALTER TABLE itest1 ALTER COLUMN a SET DEFAULT 1; +ERROR: column "a" of relation "itest1" is an identity column +-- fail, not allowed, already has a default +CREATE TABLE itest5 (a serial, b text); +ALTER TABLE itest5 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; +ERROR: column "a" of relation "itest5" already has a default value +ALTER TABLE itest3 ALTER COLUMN a TYPE int; +SELECT seqtypid::regtype FROM pg_sequence WHERE seqrelid = 'itest3_a_seq'::regclass; + seqtypid +---------- + integer +(1 row) + +\d itest3 + Table "public.itest3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+---------------------------------- + a | integer | | not null | generated by default as identity + b | text | | | + +ALTER TABLE itest3 ALTER COLUMN a TYPE text; -- error +ERROR: identity column type must be smallint, integer, or bigint +-- kinda silly to change property in the same command, but it should work +ALTER TABLE itest3 + ADD COLUMN c int GENERATED BY DEFAULT AS IDENTITY, + ALTER COLUMN c SET GENERATED ALWAYS; +\d itest3 + Table "public.itest3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+---------------------------------- + a | integer | | not null | generated by default as identity + b | text | | | + c | integer | | not null | generated always as identity + +-- ALTER COLUMN ... SET +CREATE TABLE itest6 (a int GENERATED ALWAYS AS IDENTITY, b text); +INSERT INTO itest6 DEFAULT VALUES; +ALTER TABLE itest6 ALTER COLUMN a SET GENERATED BY DEFAULT SET INCREMENT BY 2 SET START WITH 100 RESTART; +INSERT INTO itest6 DEFAULT VALUES; +INSERT INTO itest6 DEFAULT VALUES; +SELECT * FROM itest6; + a | b +-----+--- + 1 | + 100 | + 102 | +(3 rows) + +SELECT table_name, column_name, is_identity, identity_generation FROM information_schema.columns WHERE table_name = 'itest6' ORDER BY 1, 2; + table_name | column_name | is_identity | identity_generation +------------+-------------+-------------+--------------------- + itest6 | a | YES | BY DEFAULT + itest6 | b | NO | +(2 rows) + +ALTER TABLE itest6 ALTER COLUMN b SET INCREMENT BY 2; -- fail, not identity +ERROR: column "b" of relation "itest6" is not an identity column +-- prohibited direct modification of sequence +ALTER SEQUENCE itest6_a_seq OWNED BY NONE; +ERROR: cannot change ownership of identity sequence +DETAIL: Sequence "itest6_a_seq" is linked to table "itest6". +-- inheritance +CREATE TABLE itest7 (a int GENERATED ALWAYS AS IDENTITY); +INSERT INTO itest7 DEFAULT VALUES; +SELECT * FROM itest7; + a +--- + 1 +(1 row) + +-- identity property is not inherited +CREATE TABLE itest7a (b text) INHERITS (itest7); +-- make column identity in child table +CREATE TABLE itest7b (a int); +CREATE TABLE itest7c (a int GENERATED ALWAYS AS IDENTITY) INHERITS (itest7b); +NOTICE: merging column "a" with inherited definition +INSERT INTO itest7c DEFAULT VALUES; +SELECT * FROM itest7c; + a +--- + 1 +(1 row) + +CREATE TABLE itest7d (a int not null); +CREATE TABLE itest7e () INHERITS (itest7d); +ALTER TABLE itest7d ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE itest7d ADD COLUMN b int GENERATED ALWAYS AS IDENTITY; -- error +ERROR: cannot recursively add identity column to table that has child tables +SELECT table_name, column_name, is_nullable, is_identity, identity_generation FROM information_schema.columns WHERE table_name LIKE 'itest7%' ORDER BY 1, 2; + table_name | column_name | is_nullable | is_identity | identity_generation +------------+-------------+-------------+-------------+--------------------- + itest7 | a | NO | YES | ALWAYS + itest7a | a | NO | NO | + itest7a | b | YES | NO | + itest7b | a | YES | NO | + itest7c | a | NO | YES | ALWAYS + itest7d | a | NO | YES | ALWAYS + itest7e | a | NO | NO | +(7 rows) + +-- These ALTER TABLE variants will not recurse. +ALTER TABLE itest7 ALTER COLUMN a SET GENERATED BY DEFAULT; +ALTER TABLE itest7 ALTER COLUMN a RESTART; +ALTER TABLE itest7 ALTER COLUMN a DROP IDENTITY; +-- privileges +CREATE USER regress_identity_user1; +CREATE TABLE itest8 (a int GENERATED ALWAYS AS IDENTITY, b text); +GRANT SELECT, INSERT ON itest8 TO regress_identity_user1; +SET ROLE regress_identity_user1; +INSERT INTO itest8 DEFAULT VALUES; +SELECT * FROM itest8; + a | b +---+--- + 1 | +(1 row) + +RESET ROLE; +DROP TABLE itest8; +DROP USER regress_identity_user1; +-- multiple steps in ALTER TABLE +CREATE TABLE itest8 (f1 int); +ALTER TABLE itest8 + ADD COLUMN f2 int NOT NULL, + ALTER COLUMN f2 ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE itest8 + ADD COLUMN f3 int NOT NULL, + ALTER COLUMN f3 ADD GENERATED ALWAYS AS IDENTITY, + ALTER COLUMN f3 SET GENERATED BY DEFAULT SET INCREMENT 10; +ALTER TABLE itest8 + ADD COLUMN f4 int; +ALTER TABLE itest8 + ALTER COLUMN f4 SET NOT NULL, + ALTER COLUMN f4 ADD GENERATED ALWAYS AS IDENTITY, + ALTER COLUMN f4 SET DATA TYPE bigint; +ALTER TABLE itest8 + ADD COLUMN f5 int GENERATED ALWAYS AS IDENTITY; +ALTER TABLE itest8 + ALTER COLUMN f5 DROP IDENTITY, + ALTER COLUMN f5 DROP NOT NULL, + ALTER COLUMN f5 SET DATA TYPE bigint; +INSERT INTO itest8 VALUES(0), (1); +-- This does not work when the table isn't empty. That's intentional, +-- since ADD GENERATED should only affect later insertions: +ALTER TABLE itest8 + ADD COLUMN f22 int NOT NULL, + ALTER COLUMN f22 ADD GENERATED ALWAYS AS IDENTITY; +ERROR: column "f22" of relation "itest8" contains null values +TABLE itest8; + f1 | f2 | f3 | f4 | f5 +----+----+----+----+---- + 0 | 1 | 1 | 1 | + 1 | 2 | 11 | 2 | +(2 rows) + +\d+ itest8 + Table "public.itest8" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+----------------------------------+---------+--------------+------------- + f1 | integer | | | | plain | | + f2 | integer | | not null | generated always as identity | plain | | + f3 | integer | | not null | generated by default as identity | plain | | + f4 | bigint | | not null | generated always as identity | plain | | + f5 | bigint | | | | plain | | + +\d itest8_f2_seq + Sequence "public.itest8_f2_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Sequence for identity column: public.itest8.f2 + +\d itest8_f3_seq + Sequence "public.itest8_f3_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 10 | no | 1 +Sequence for identity column: public.itest8.f3 + +\d itest8_f4_seq + Sequence "public.itest8_f4_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Sequence for identity column: public.itest8.f4 + +\d itest8_f5_seq +DROP TABLE itest8; +-- typed tables (currently not supported) +CREATE TYPE itest_type AS (f1 integer, f2 text, f3 bigint); +CREATE TABLE itest12 OF itest_type (f1 WITH OPTIONS GENERATED ALWAYS AS IDENTITY); -- error +ERROR: identity columns are not supported on typed tables +DROP TYPE itest_type CASCADE; +-- table partitions (currently not supported) +CREATE TABLE itest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1); +CREATE TABLE itest_child PARTITION OF itest_parent ( + f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY +) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error +ERROR: identity columns are not supported on partitions +DROP TABLE itest_parent; +-- test that sequence of half-dropped serial column is properly ignored +CREATE TABLE itest14 (id serial); +ALTER TABLE itest14 ALTER id DROP DEFAULT; +ALTER TABLE itest14 ALTER id ADD GENERATED BY DEFAULT AS IDENTITY; +INSERT INTO itest14 (id) VALUES (DEFAULT); +-- Identity columns must be NOT NULL (cf bug #16913) +CREATE TABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NULL); -- fail +ERROR: conflicting NULL/NOT NULL declarations for column "id" of table "itest15" +LINE 1: ...ABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NULL); + ^ +CREATE TABLE itest15 (id integer NULL GENERATED ALWAYS AS IDENTITY); -- fail +ERROR: conflicting NULL/NOT NULL declarations for column "id" of table "itest15" +LINE 1: CREATE TABLE itest15 (id integer NULL GENERATED ALWAYS AS ID... + ^ +CREATE TABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NOT NULL); +DROP TABLE itest15; +CREATE TABLE itest15 (id integer NOT NULL GENERATED ALWAYS AS IDENTITY); +DROP TABLE itest15; diff --git a/src/test/singlenode_regress/expected/incremental_analyze.out b/src/test/singlenode_regress/expected/incremental_analyze.out new file mode 100644 index 00000000000..9fe0c61746f --- /dev/null +++ b/src/test/singlenode_regress/expected/incremental_analyze.out @@ -0,0 +1,2048 @@ +-- start_matchsubs +-- m/^LOG.*PartitionSelector/ +-- s/^LOG.*PartitionSelector/PartitionSelector/ +-- m/^LOG.*Feature not supported/ +-- s/^LOG.*Feature not supported/Feature not supported/ +-- end_matchsubs +-- start_matchignore +-- m/^LOG: Missing statistics for column: .*/ +-- end_matchignore +-- Test ANALYZE for different data types +-- Case 1: Partitions have MCVs but after merge, none of the partition MCVs +-- qualify as a global MCV for the root and they are used to create the +-- root histogram +DROP TABLE IF EXISTS foo; +NOTICE: table "foo" does not exist, skipping +SET default_statistics_target = 4; +CREATE TYPE inc_analyze_composite AS +( + a numeric, + b numeric +); +CREATE TABLE foo ( + a int, + b int, + c03_bigint bigint, + c04_bigserial bigserial, + c05_bit bit, + c06_bit_varying_10 bit varying(10), + c07_bool bool, + c08_char char, + c09_varchar_10 varchar(10), + c10_cidr cidr, + c11_date date, + c12_numeric_8_2 numeric(8,2), + c13_float8 float8, + c14_inet inet, + c15_int4 int4, + c16_interval interval, + c17_macaddr macaddr, + c18_money money, + c19_float4 float4, + c20_serial4 serial4, + c21_smallint smallint, + c22_text text, + c23_time time, + c24_timetz timetz, + c25_timestamp timestamp, + c26_timestamptz timestamptz, + c27_uuid uuid, + c28_tsquery tsquery, + c29_varchararray character varying(2)[], + c30_intarray int[], + c31_bigintarray bigint[], + c33_bitarray bit(1)[], + c34_bitvaryingarray bit varying(10)[], + c35_boolarray boolean[], + c36_chararray character(1)[], + c37_cidrarray cidr[], + c38_datearray date[], + c39_numericarray numeric[], + c40_float8array double precision[], + c41_inetarray inet[], + c42_int4array integer[], + c43_intervalarray interval[], + c44_macaddrarray macaddr[], + c45_moneyarray money[], + c46_float4array real[], + c47_smallintarrayn smallint[], + c48_textarray text[], + c49_timearray time without time zone[], + c50_timetzarray time with time zone[], + c51_timestamparray timestamp without time zone[], + c52_timestamptzarray timestamp with time zone[], + c53_uuidzarray uuid[], + c54_tsqueryarray tsquery[], + c55_jsonarray json[], + c57_pointarray point[], + c58_linesegarray lseg[], + c59_patharray path[], + c60_boxarray box[], + c61_polygonarray polygon[], + c62_circlearray circle[], + c63_inc_analyze_composite_array inc_analyze_composite[] +) PARTITION BY RANGE (b) (START (0) END(6) EVERY(3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +CREATE TYPE input_fields AS +( + varchararray character varying(2)[], + intarray int[], + _bigintarray bigint[], + bitarray bit(1)[], + bitvaryingarray bit varying(10)[], + boolarray boolean[], + chararray character(1)[], + cidrarray cidr[], + datearray date[], + numericarray numeric[], + float8array double precision[], + inetarray inet[], + int4array integer[], + intervalarray interval[], + macaddrarray macaddr[], + moneyarray money[], + float4array real[], + smallintarrayn smallint[], + textarray text[], + timearray time without time zone[], + timetzarray time with time zone[], + timestamparray timestamp without time zone[], + timestamptzarray timestamp with time zone[], + uuidzarray uuid[], + tsqueryarray tsquery[], + jsonarray json[], + pointarray point[], + linesegarray lseg[], + patharray path[], + boxarray box[], + polygonarray polygon[], + circlearray circle[], + inc_analyze_composite_array inc_analyze_composite[] +); +CREATE OR REPLACE FUNCTION get_input_fields(i INT) RETURNS input_fields AS $$ +DECLARE + fields input_fields; +BEGIN + SELECT + ARRAY['a' || (i % 6), 'b' || (i % 6)]::character varying(2)[], + ARRAY[i, i % 6]::int[], + ARRAY[(i % 6), ((i + 1) % 6)]::bigint[], + ARRAY[i, (i + 1)]::bit[], + ARRAY[(i % 6)::bit(10), ((i + 1) % 6)::bit(10)]::bit varying(10)[], + ARRAY[(i % 2), ((i + 1) % 2)]::bool[], + ARRAY['a' || i, 'b' || i]::char[], + ARRAY['192.168.100.' || (i % 6), '192.168.101.' || (i % 6)]::cidr[], + ARRAY['2018-01-' || ((i % 6) + 1), '2018-01-' || ((i % 6) + 1)]::date[], + ARRAY[(i % 6), ((i + 1) % 6)]::numeric[], + ARRAY[(i % 6), ((i + 1) % 6)]::float8[], + ARRAY['192.168.100.' || (i % 6), '192.168.100.' || ((i + 1) % 6)]::inet[], + ARRAY[(i % 6), ((i + 1) % 6)]::int4[], + '{"1 hour", "1 hour"}'::interval[], + ARRAY['08:00:2b:01:02:' || (i % 6), '08:00:2b:01:02:' || (i % 6)]::macaddr[], + ARRAY['123.4', '234.5']::money[], + ARRAY[(i % 6), ((i + 1) % 6)]::float4[], + ARRAY[(i % 6), ((i + 1) % 6)]::smallint[], + ARRAY['abcd' || (i % 6), 'def' || ((i + 1) % 6)]::text[], + ARRAY[(i % 6) || ':00:00', ((i + 1) % 6) || ':00:00']::time[], + ARRAY[(i % 6) || ':00:59 PST', ((i + 1) % 6) || ':00:59 EST']::timetz[], + ARRAY['2018-01-01 ' || (i % 6) || ':59:00', '2018-01-01 ' || ((i + 1) % 6) || ':59:00']::timestamp[], + ARRAY['2018-01-01 ' || (i % 6) || ':59:00 PST', '2018-01-01 ' || ((i + 1) % 6) || ':59:00 EST']::timestamptz[], + ARRAY['11111111-1111-1111-1111-1111111111' || (i % 6) || (i % 6), '11111111-1111-1111-1111-1111111111' || ((i + 1) % 6) || ((i + 1) % 6)]::uuid[], + ARRAY['foo' || (i % 6) || ' & rat', 'rat' || (i % 6) || ' & foo']::tsquery[], + ARRAY['{"a": "b"}', '{"c": "d"}']::json[], + ARRAY[point(i, i + 1), point(i + 2, i + 3)], + ARRAY[lseg(point(i, i + 1), point(i + 2, i + 3)), lseg(point(i + 4, i + 5), point(i + 6, i + 7))], + ARRAY[path(polygon(box(point(i + 1, i + 2), point(i + 3, i + 4)))), path(polygon(box(point(i + 1, i + 2), point(i + 3, i + 4))))], + ARRAY[box(point(i + 1, i + 2), point(i + 3, i + 4)), box(point(i + 1, i + 2), point(i + 3, i + 4))], + ARRAY[polygon(box(point(i + 1, i + 2), point(i + 3, i + 4))), polygon(box(point(i + 1, i + 2), point(i + 3, i + 4)))], + ARRAY[circle(point(i + 1, i + 2), i + 3), circle(point(i + 4, i + 5), i + 6)], + ARRAY[ROW(i % 6, (i + 1) % 6), ROW(i % 6, (i + 1) % 6)]::inc_analyze_composite[] + INTO fields; + + RETURN fields; +END; +$$ LANGUAGE PLPGSQL; +INSERT INTO foo +SELECT +i, +i%6, +i%6::bigint, +i%6, +i::bit, +(i%6)::bit(10)::bit varying(10), +(i%2)::bool, +(i%6)::char, +('a'||(i%6))::varchar(10), +('192.168.100.'||(i%6))::cidr, +('2018-4-'||(i%6)+1)::date, +(i%6)::numeric(8,2), +(i%6)::float8, +inet ('192.168.100.'||(i%6)), +i%6::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%6)::text)::text::macaddr, +(i%6)::text::money, +(i%6)::float4, +i%6, +i%6, +'aa'||(i%6)::text, +((i%6)::text||':59:59')::time, +((i%6)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%6)::text||':59:00')::timestamp, +('2018-01-01 '||(i%6)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%6)::text||(i%6)::text)::uuid, +('foo'||(i%6)::text||' & rat'||(i%6)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' and attname != 'a' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------------------------------+-----------+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------- + foo | b | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | b | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | b | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c03_bigint | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | c03_bigint | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c03_bigint | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c04_bigserial | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | c04_bigserial | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c04_bigserial | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_1 | c05_bit | 0 | 2 | {0,1} | {0.66,0.34} | + foo_1_prt_2 | c05_bit | 0 | 2 | {1,0} | {0.66,0.34} | + foo | c06_bit_varying_10 | 0 | 6 | {0000000001,0000000010,0000000011,0000000100} | {0.17,0.17,0.17,0.17} | {0000000000,0000000101} + foo_1_prt_1 | c06_bit_varying_10 | 0 | 3 | {0000000001,0000000010,0000000000} | {0.34,0.34,0.32} | + foo_1_prt_2 | c06_bit_varying_10 | 0 | 3 | {0000000011,0000000100,0000000101} | {0.34,0.34,0.32} | + foo | c07_bool | 0 | 2 | {f,t} | {0.5,0.5} | + foo_1_prt_1 | c07_bool | 0 | 2 | {f,t} | {0.66,0.34} | + foo_1_prt_2 | c07_bool | 0 | 2 | {t,f} | {0.66,0.34} | + foo | c08_char | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | c08_char | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c08_char | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c09_varchar_10 | 0 | 6 | {a1,a2,a3,a4} | {0.17,0.17,0.17,0.17} | {a0,a5} + foo_1_prt_1 | c09_varchar_10 | 0 | 3 | {a1,a2,a0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c09_varchar_10 | 0 | 3 | {a3,a4,a5} | {0.34,0.34,0.32} | + foo | c10_cidr | 0 | 6 | {192.168.100.1/32,192.168.100.2/32,192.168.100.3/32,192.168.100.4/32} | {0.17,0.17,0.17,0.17} | {192.168.100.0/32,192.168.100.5/32} + foo_1_prt_1 | c10_cidr | 0 | 3 | {192.168.100.1/32,192.168.100.2/32,192.168.100.0/32} | {0.34,0.34,0.32} | + foo_1_prt_2 | c10_cidr | 0 | 3 | {192.168.100.3/32,192.168.100.4/32,192.168.100.5/32} | {0.34,0.34,0.32} | + foo | c11_date | 0 | 6 | {04-02-2018,04-03-2018,04-04-2018,04-05-2018} | {0.17,0.17,0.17,0.17} | {04-01-2018,04-06-2018} + foo_1_prt_1 | c11_date | 0 | 3 | {04-02-2018,04-03-2018,04-01-2018} | {0.34,0.34,0.32} | + foo_1_prt_2 | c11_date | 0 | 3 | {04-04-2018,04-05-2018,04-06-2018} | {0.34,0.34,0.32} | + foo | c12_numeric_8_2 | 0 | 6 | {1.00,2.00,3.00,4.00} | {0.17,0.17,0.17,0.17} | {0.00,5.00} + foo_1_prt_1 | c12_numeric_8_2 | 0 | 3 | {1.00,2.00,0.00} | {0.34,0.34,0.32} | + foo_1_prt_2 | c12_numeric_8_2 | 0 | 3 | {3.00,4.00,5.00} | {0.34,0.34,0.32} | + foo | c13_float8 | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | c13_float8 | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c13_float8 | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c14_inet | 0 | 6 | {192.168.100.1,192.168.100.2,192.168.100.3,192.168.100.4} | {0.17,0.17,0.17,0.17} | {192.168.100.0,192.168.100.5} + foo_1_prt_1 | c14_inet | 0 | 3 | {192.168.100.1,192.168.100.2,192.168.100.0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c14_inet | 0 | 3 | {192.168.100.3,192.168.100.4,192.168.100.5} | {0.34,0.34,0.32} | + foo | c15_int4 | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | c15_int4 | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c15_int4 | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_1 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_2 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo | c17_macaddr | 0 | 6 | {12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03,12:34:56:78:90:04} | {0.17,0.17,0.17,0.17} | {12:34:56:78:90:00,12:34:56:78:90:05} + foo_1_prt_1 | c17_macaddr | 0 | 3 | {12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:00} | {0.34,0.34,0.32} | + foo_1_prt_2 | c17_macaddr | 0 | 3 | {12:34:56:78:90:03,12:34:56:78:90:04,12:34:56:78:90:05} | {0.34,0.34,0.32} | + foo | c18_money | 0 | 6 | {$1.00,$2.00,$3.00,$4.00} | {0.17,0.17,0.17,0.17} | {$0.00,$5.00} + foo_1_prt_1 | c18_money | 0 | 3 | {$1.00,$2.00,$0.00} | {0.34,0.34,0.32} | + foo_1_prt_2 | c18_money | 0 | 3 | {$3.00,$4.00,$5.00} | {0.34,0.34,0.32} | + foo | c19_float4 | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | c19_float4 | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c19_float4 | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c20_serial4 | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | c20_serial4 | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c20_serial4 | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c21_smallint | 0 | 6 | {1,2,3,4} | {0.17,0.17,0.17,0.17} | {0,5} + foo_1_prt_1 | c21_smallint | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c21_smallint | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c22_text | 0 | 6 | {aa1,aa2,aa3,aa4} | {0.17,0.17,0.17,0.17} | {aa0,aa5} + foo_1_prt_1 | c22_text | 0 | 3 | {aa1,aa2,aa0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c22_text | 0 | 3 | {aa3,aa4,aa5} | {0.34,0.34,0.32} | + foo | c23_time | 0 | 6 | {01:59:59,02:59:59,03:59:59,04:59:59} | {0.17,0.17,0.17,0.17} | {00:59:59,05:59:59} + foo_1_prt_1 | c23_time | 0 | 3 | {01:59:59,02:59:59,00:59:59} | {0.34,0.34,0.32} | + foo_1_prt_2 | c23_time | 0 | 3 | {03:59:59,04:59:59,05:59:59} | {0.34,0.34,0.32} | + foo | c24_timetz | 0 | 6 | {01:59:00-05,02:59:00-05,03:59:00-05,04:59:00-05} | {0.17,0.17,0.17,0.17} | {00:59:00-05,05:59:00-05} + foo_1_prt_1 | c24_timetz | 0 | 3 | {01:59:00-05,02:59:00-05,00:59:00-05} | {0.34,0.34,0.32} | + foo_1_prt_2 | c24_timetz | 0 | 3 | {03:59:00-05,04:59:00-05,05:59:00-05} | {0.34,0.34,0.32} | + foo | c25_timestamp | 0 | 6 | {"Mon Jan 01 01:59:00 2018","Mon Jan 01 02:59:00 2018","Mon Jan 01 03:59:00 2018","Mon Jan 01 04:59:00 2018"} | {0.17,0.17,0.17,0.17} | {"Mon Jan 01 00:59:00 2018","Mon Jan 01 05:59:00 2018"} + foo_1_prt_1 | c25_timestamp | 0 | 3 | {"Mon Jan 01 01:59:00 2018","Mon Jan 01 02:59:00 2018","Mon Jan 01 00:59:00 2018"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c25_timestamp | 0 | 3 | {"Mon Jan 01 03:59:00 2018","Mon Jan 01 04:59:00 2018","Mon Jan 01 05:59:00 2018"} | {0.34,0.34,0.32} | + foo | c26_timestamptz | 0 | 6 | {"Sun Dec 31 22:59:00 2017 PST","Sun Dec 31 23:59:00 2017 PST","Mon Jan 01 00:59:00 2018 PST","Mon Jan 01 01:59:00 2018 PST"} | {0.17,0.17,0.17,0.17} | {"Sun Dec 31 21:59:00 2017 PST","Mon Jan 01 02:59:00 2018 PST"} + foo_1_prt_1 | c26_timestamptz | 0 | 3 | {"Sun Dec 31 22:59:00 2017 PST","Sun Dec 31 23:59:00 2017 PST","Sun Dec 31 21:59:00 2017 PST"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c26_timestamptz | 0 | 3 | {"Mon Jan 01 00:59:00 2018 PST","Mon Jan 01 01:59:00 2018 PST","Mon Jan 01 02:59:00 2018 PST"} | {0.34,0.34,0.32} | + foo | c27_uuid | 0 | 6 | {11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144} | {0.17,0.17,0.17,0.17} | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111155} + foo_1_prt_1 | c27_uuid | 0 | 3 | {11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111100} | {0.34,0.34,0.32} | + foo_1_prt_2 | c27_uuid | 0 | 3 | {11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155} | {0.34,0.34,0.32} | + foo | c28_tsquery | 0 | 6 | {"'foo4' & 'rat4'","'foo1' & 'rat1'","'foo3' & 'rat3'","'foo2' & 'rat2'"} | {0.17,0.17,0.17,0.17} | {"'foo0' & 'rat0'","'foo5' & 'rat5'"} + foo_1_prt_1 | c28_tsquery | 0 | 3 | {"'foo1' & 'rat1'","'foo2' & 'rat2'","'foo0' & 'rat0'"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c28_tsquery | 0 | 3 | {"'foo4' & 'rat4'","'foo3' & 'rat3'","'foo5' & 'rat5'"} | {0.34,0.34,0.32} | + foo | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}","{a4,b4}"} | {0.17,0.17,0.17,0.17} | {"{a0,b0}","{a5,b5}"} + foo_1_prt_1 | c29_varchararray | 0 | 3 | {"{a1,b1}","{a2,b2}","{a0,b0}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c29_varchararray | 0 | 3 | {"{a3,b3}","{a4,b4}","{a5,b5}"} | {0.34,0.34,0.32} | + foo | c30_intarray | 0 | -1 | | | {"{1,1}","{27,3}","{51,3}","{75,3}","{100,4}"} + foo_1_prt_1 | c30_intarray | 0 | -1 | | | {"{1,1}","{25,1}","{49,1}","{73,1}","{98,2}"} + foo_1_prt_2 | c30_intarray | 0 | -1 | | | {"{3,3}","{27,3}","{51,3}","{75,3}","{100,4}"} + foo | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c31_bigintarray | 0 | 3 | {"{1,2}","{2,3}","{0,1}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c31_bigintarray | 0 | 3 | {"{3,4}","{4,5}","{5,0}"} | {0.34,0.34,0.32} | + foo | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_1 | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.66,0.34} | + foo_1_prt_2 | c33_bitarray | 0 | 2 | {"{1,0}","{0,1}"} | {0.66,0.34} | + foo | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}","{0000000100,0000000101}"} | {0.17,0.17,0.17,0.17} | {"{0000000000,0000000001}","{0000000101,0000000000}"} + foo_1_prt_1 | c34_bitvaryingarray | 0 | 3 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000000,0000000001}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c34_bitvaryingarray | 0 | 3 | {"{0000000011,0000000100}","{0000000100,0000000101}","{0000000101,0000000000}"} | {0.34,0.34,0.32} | + foo | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_1 | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.66,0.34} | + foo_1_prt_2 | c35_boolarray | 0 | 2 | {"{t,f}","{f,t}"} | {0.66,0.34} | + foo | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_1 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_2 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}","{192.168.100.4/32,192.168.101.4/32}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_1 | c37_cidrarray | 0 | 3 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.0/32,192.168.101.0/32}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c37_cidrarray | 0 | 3 | {"{192.168.100.3/32,192.168.101.3/32}","{192.168.100.4/32,192.168.101.4/32}","{192.168.100.5/32,192.168.101.5/32}"} | {0.34,0.34,0.32} | + foo | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}","{01-05-2018,01-05-2018}"} | {0.17,0.17,0.17,0.17} | {"{01-01-2018,01-01-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_1 | c38_datearray | 0 | 3 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-01-2018,01-01-2018}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c38_datearray | 0 | 3 | {"{01-04-2018,01-04-2018}","{01-05-2018,01-05-2018}","{01-06-2018,01-06-2018}"} | {0.34,0.34,0.32} | + foo | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c39_numericarray | 0 | 3 | {"{1,2}","{2,3}","{0,1}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c39_numericarray | 0 | 3 | {"{3,4}","{4,5}","{5,0}"} | {0.34,0.34,0.32} | + foo | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c40_float8array | 0 | 3 | {"{1,2}","{2,3}","{0,1}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c40_float8array | 0 | 3 | {"{3,4}","{4,5}","{5,0}"} | {0.34,0.34,0.32} | + foo | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}","{192.168.100.4,192.168.100.5}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0,192.168.100.1}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_1 | c41_inetarray | 0 | 3 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.0,192.168.100.1}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c41_inetarray | 0 | 3 | {"{192.168.100.3,192.168.100.4}","{192.168.100.4,192.168.100.5}","{192.168.100.5,192.168.100.0}"} | {0.34,0.34,0.32} | + foo | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c42_int4array | 0 | 3 | {"{1,2}","{2,3}","{0,1}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c42_int4array | 0 | 3 | {"{3,4}","{4,5}","{5,0}"} | {0.34,0.34,0.32} | + foo | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_1 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_2 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}","{08:00:2b:01:02:04,08:00:2b:01:02:04}"} | {0.17,0.17,0.17,0.17} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_1 | c44_macaddrarray | 0 | 3 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:00,08:00:2b:01:02:00}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c44_macaddrarray | 0 | 3 | {"{08:00:2b:01:02:03,08:00:2b:01:02:03}","{08:00:2b:01:02:04,08:00:2b:01:02:04}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} | {0.34,0.34,0.32} | + foo | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_1 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_2 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c46_float4array | 0 | 3 | {"{1,2}","{2,3}","{0,1}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c46_float4array | 0 | 3 | {"{3,4}","{4,5}","{5,0}"} | {0.34,0.34,0.32} | + foo | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c47_smallintarrayn | 0 | 3 | {"{1,2}","{2,3}","{0,1}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c47_smallintarrayn | 0 | 3 | {"{3,4}","{4,5}","{5,0}"} | {0.34,0.34,0.32} | + foo | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}","{abcd4,def5}"} | {0.17,0.17,0.17,0.17} | {"{abcd0,def1}","{abcd5,def0}"} + foo_1_prt_1 | c48_textarray | 0 | 3 | {"{abcd1,def2}","{abcd2,def3}","{abcd0,def1}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c48_textarray | 0 | 3 | {"{abcd3,def4}","{abcd4,def5}","{abcd5,def0}"} | {0.34,0.34,0.32} | + foo | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}","{04:00:00,05:00:00}"} | {0.17,0.17,0.17,0.17} | {"{00:00:00,01:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_1 | c49_timearray | 0 | 3 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{00:00:00,01:00:00}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c49_timearray | 0 | 3 | {"{03:00:00,04:00:00}","{04:00:00,05:00:00}","{05:00:00,00:00:00}"} | {0.34,0.34,0.32} | + foo | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}","{04:00:59-08,05:00:59-05}"} | {0.17,0.17,0.17,0.17} | {"{00:00:59-08,01:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_1 | c50_timetzarray | 0 | 3 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{00:00:59-08,01:00:59-05}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c50_timetzarray | 0 | 3 | {"{03:00:59-08,04:00:59-05}","{04:00:59-08,05:00:59-05}","{05:00:59-08,00:00:59-05}"} | {0.34,0.34,0.32} | + foo | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_1 | c51_timestamparray | 0 | 3 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c51_timestamparray | 0 | 3 | {"{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} | {0.34,0.34,0.32} | + foo | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_1 | c52_timestamptzarray | 0 | 3 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c52_timestamptzarray | 0 | 3 | {"{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} | {0.34,0.34,0.32} | + foo | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}"} | {0.17,0.17,0.17,0.17} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_1 | c53_uuidzarray | 0 | 3 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c53_uuidzarray | 0 | 3 | {"{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} | {0.34,0.34,0.32} | + foo | c54_tsqueryarray | 0 | 6 | {"{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}"} | {0.17,0.17,0.17,0.17} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo_1_prt_1 | c54_tsqueryarray | 0 | 3 | {"{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}","{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c54_tsqueryarray | 0 | 3 | {"{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} | {0.34,0.34,0.32} | + foo | c55_jsonarray | 0 | 0 | | | + foo_1_prt_1 | c55_jsonarray | 0 | 0 | | | + foo_1_prt_2 | c55_jsonarray | 0 | 0 | | | + foo | c57_pointarray | 0 | 0 | | | + foo_1_prt_1 | c57_pointarray | 0 | 0 | | | + foo_1_prt_2 | c57_pointarray | 0 | 0 | | | + foo | c58_linesegarray | 0 | 0 | | | + foo_1_prt_1 | c58_linesegarray | 0 | 0 | | | + foo_1_prt_2 | c58_linesegarray | 0 | 0 | | | + foo | c59_patharray | 0 | 0 | | | + foo_1_prt_1 | c59_patharray | 0 | 0 | | | + foo_1_prt_2 | c59_patharray | 0 | 0 | | | + foo | c60_boxarray | 0 | 0 | | | + foo_1_prt_1 | c60_boxarray | 0 | 0 | | | + foo_1_prt_2 | c60_boxarray | 0 | 0 | | | + foo | c61_polygonarray | 0 | 0 | | | + foo_1_prt_1 | c61_polygonarray | 0 | 0 | | | + foo_1_prt_2 | c61_polygonarray | 0 | 0 | | | + foo | c62_circlearray | 0 | 0 | | | + foo_1_prt_1 | c62_circlearray | 0 | 0 | | | + foo_1_prt_2 | c62_circlearray | 0 | 0 | | | + foo | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}","{\"(4,5)\",\"(4,5)\"}"} | {0.17,0.17,0.17,0.17} | {"{\"(0,1)\",\"(0,1)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_1 | c63_inc_analyze_composite_array | 0 | 3 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(0,1)\",\"(0,1)\"}"} | {0.34,0.34,0.32} | + foo_1_prt_2 | c63_inc_analyze_composite_array | 0 | 3 | {"{\"(3,4)\",\"(3,4)\"}","{\"(4,5)\",\"(4,5)\"}","{\"(5,0)\",\"(5,0)\"}"} | {0.34,0.34,0.32} | +(180 rows) + +-- Case 2: Partitions have no MCVs, only histograms, after merge root has to +-- have approximately merged histograms. +TRUNCATE foo; +INSERT INTO foo +SELECT +i, +i%3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i%128))::cidr, +('2018-4-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +((i%12)::text||':59:59')::time, +((i%12)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%12)::text||':59:00')::timestamp, +('2018-01-01 '||(i%12)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5)::text||(i%5)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +INSERT INTO foo +SELECT +i, +i%3, +i+200::bigint, +i+200, +i::bit, +(i+200)::bit(10)::bit varying(10), +(i+200)::bool, +(i+200)::char, +('a'||(i+200))::varchar(10), +('192.168.100.'||(i%128+128))::cidr, +('2018-4-'||(i%15+16))::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128+128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50+50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +((i%12+12)::text||':59:59')::time, +((i%12+12)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%12+12)::text||':59:00')::timestamp, +('2018-01-01 '||(i%12+12)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5+5)::text||(i%5+5)::text)::uuid, +('foo'||(i+200)::text||' & rat'||(i+200)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i%128))::cidr, +('2018-4-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +((i%12)::text||':59:59')::time, +((i%12)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%12)::text||':59:00')::timestamp, +('2018-01-01 '||(i%12)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5)::text||(i%5)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,200) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------------------------------+-----------+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + foo | a | 0 | -0.5 | {1,2,3,4} | {0.005,0.005,0.005,0.005} | {1,50,100,150,200} + foo_1_prt_1 | a | 0 | -0.5 | {1,2,3,4} | {0.01,0.01,0.01,0.01} | {5,28,52,76,100} + foo_1_prt_2 | a | 0 | -1 | | | {1,50,100,150,200} + foo | b | 0 | 6 | {1,4,5,0} | {0.17,0.1675,0.1675,0.165} | {2,3} + foo_1_prt_1 | b | 0 | 3 | {1,0,2} | {0.34,0.33,0.33} | + foo_1_prt_2 | b | 0 | 3 | {4,5,3} | {0.335,0.335,0.33} | + foo | c03_bigint | 0 | -0.7425 | | | {1,50,100,200,300} + foo_1_prt_1 | c03_bigint | 0 | -1 | | | {1,50,100,250,300} + foo_1_prt_2 | c03_bigint | 0 | -1 | | | {1,50,100,150,200} + foo | c04_bigserial | 0 | -0.7425 | | | {1,50,100,200,300} + foo_1_prt_1 | c04_bigserial | 0 | -1 | | | {1,50,100,250,300} + foo_1_prt_2 | c04_bigserial | 0 | -1 | | | {1,50,100,150,200} + foo | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_1 | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_2 | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo | c06_bit_varying_10 | 0 | -0.7425 | | | {0000000001,0000110010,0001100100,0011001000,0100101100} + foo_1_prt_1 | c06_bit_varying_10 | 0 | -1 | | | {0000000001,0000110010,0001100100,0011111010,0100101100} + foo_1_prt_2 | c06_bit_varying_10 | 0 | -1 | | | {0000000001,0000110010,0001100100,0010010110,0011001000} + foo | c07_bool | 0 | 1 | {t} | {1} | + foo_1_prt_1 | c07_bool | 0 | 1 | {t} | {1} | + foo_1_prt_2 | c07_bool | 0 | 1 | {t} | {1} | + foo | c08_char | 0 | 9 | {1,2} | {0.3075,0.305} | {3,4,7,8,9} + foo_1_prt_1 | c08_char | 0 | 9 | {2,1,3,4} | {0.55,0.06,0.06,0.055} | {5,6,7,8,9} + foo_1_prt_2 | c08_char | 0 | 9 | {1,2,3,4} | {0.555,0.06,0.055,0.055} | {5,6,7,8,9} + foo | c09_varchar_10 | 0 | -0.7375 | | | {a1,a189,a279,a53,a99} + foo_1_prt_1 | c09_varchar_10 | 0 | -1 | | | {a1,a233,a279,a53,a99} + foo_1_prt_2 | c09_varchar_10 | 0 | -1 | | | {a1,a143,a189,a53,a99} + foo | c10_cidr | 0 | -0.5725 | {192.168.100.1/32,192.168.100.2/32,192.168.100.3/32,192.168.100.4/32} | {0.005,0.005,0.005,0.005} | {192.168.100.0/32,192.168.100.50/32,192.168.100.100/32,192.168.100.178/32,192.168.100.228/32} + foo_1_prt_1 | c10_cidr | 0 | -1 | | | {192.168.100.1/32,192.168.100.50/32,192.168.100.100/32,192.168.100.178/32,192.168.100.228/32} + foo_1_prt_2 | c10_cidr | 0 | -0.64 | {192.168.100.1/32,192.168.100.2/32,192.168.100.3/32,192.168.100.4/32} | {0.01,0.01,0.01,0.01} | {192.168.100.0/32,192.168.100.28/32,192.168.100.52/32,192.168.100.79/32,192.168.100.127/32} + foo | c11_date | 0 | 30 | {04-02-2018,04-03-2018,04-04-2018,04-05-2018} | {0.0525,0.0525,0.0525,0.0525} | {04-01-2018,04-11-2018,04-15-2018,04-24-2018,04-30-2018} + foo_1_prt_1 | c11_date | 0 | -0.15 | {04-02-2018,04-03-2018,04-04-2018,04-05-2018} | {0.035,0.035,0.035,0.035} | {04-01-2018,04-11-2018,04-18-2018,04-24-2018,04-30-2018} + foo_1_prt_2 | c11_date | 0 | 15 | {04-02-2018,04-03-2018,04-04-2018,04-05-2018} | {0.07,0.07,0.07,0.07} | {04-01-2018,04-07-2018,04-10-2018,04-13-2018,04-15-2018} + foo | c12_numeric_8_2 | 0 | -0.5 | {1.00,2.00,3.00,4.00} | {0.005,0.005,0.005,0.005} | {1.00,50.00,100.00,150.00,200.00} + foo_1_prt_1 | c12_numeric_8_2 | 0 | -0.5 | {1.00,2.00,3.00,4.00} | {0.01,0.01,0.01,0.01} | {5.00,28.00,52.00,76.00,100.00} + foo_1_prt_2 | c12_numeric_8_2 | 0 | -1 | | | {1.00,50.00,100.00,150.00,200.00} + foo | c13_float8 | 0 | -0.495 | {1,2,3,4} | {0.005,0.005,0.005,0.005} | {1,50,100,150,200} + foo_1_prt_1 | c13_float8 | 0 | -0.5 | {1,2,3,4} | {0.01,0.01,0.01,0.01} | {5,28,52,76,100} + foo_1_prt_2 | c13_float8 | 0 | -1 | | | {1,50,100,150,200} + foo | c14_inet | 0 | -0.5725 | {192.168.100.1,192.168.100.2,192.168.100.3,192.168.100.4} | {0.005,0.005,0.005,0.005} | {192.168.100.0,192.168.100.50,192.168.100.100,192.168.100.178,192.168.100.228} + foo_1_prt_1 | c14_inet | 0 | -1 | | | {192.168.100.1,192.168.100.50,192.168.100.100,192.168.100.178,192.168.100.228} + foo_1_prt_2 | c14_inet | 0 | -0.64 | {192.168.100.1,192.168.100.2,192.168.100.3,192.168.100.4} | {0.01,0.01,0.01,0.01} | {192.168.100.0,192.168.100.28,192.168.100.52,192.168.100.79,192.168.100.127} + foo | c15_int4 | 0 | -0.5 | {1,2,3,4} | {0.005,0.005,0.005,0.005} | {1,50,100,150,200} + foo_1_prt_1 | c15_int4 | 0 | -0.5 | {1,2,3,4} | {0.01,0.01,0.01,0.01} | {5,28,52,76,100} + foo_1_prt_2 | c15_int4 | 0 | -1 | | | {1,50,100,150,200} + foo | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_1 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_2 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo | c17_macaddr | 0 | -0.25 | {12:34:56:78:90:00,12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03} | {0.015,0.015,0.015,0.015} | {12:34:56:78:90:04,12:34:56:78:90:27,12:34:56:78:90:49,12:34:56:78:90:75,12:34:56:78:90:99} + foo_1_prt_1 | c17_macaddr | 0 | -0.5 | {12:34:56:78:90:00,12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03} | {0.01,0.01,0.01,0.01} | {12:34:56:78:90:04,12:34:56:78:90:27,12:34:56:78:90:51,12:34:56:78:90:75,12:34:56:78:90:99} + foo_1_prt_2 | c17_macaddr | 0 | -0.25 | {12:34:56:78:90:00,12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03} | {0.02,0.02,0.02,0.02} | {12:34:56:78:90:04,12:34:56:78:90:15,12:34:56:78:90:26,12:34:56:78:90:38,12:34:56:78:90:49} + foo | c18_money | 0 | -0.5 | {$1.00,$2.00,$3.00,$4.00} | {0.005,0.005,0.005,0.005} | {$1.00,$50.00,$100.00,$150.00,$200.00} + foo_1_prt_1 | c18_money | 0 | -0.5 | {$1.00,$2.00,$3.00,$4.00} | {0.01,0.01,0.01,0.01} | {$5.00,$28.00,$52.00,$76.00,$100.00} + foo_1_prt_2 | c18_money | 0 | -1 | | | {$1.00,$50.00,$100.00,$150.00,$200.00} + foo | c19_float4 | 0 | -0.4925 | {1,2,3,4} | {0.005,0.005,0.005,0.005} | {1,50,100,150,200} + foo_1_prt_1 | c19_float4 | 0 | -0.5 | {1,2,3,4} | {0.01,0.01,0.01,0.01} | {5,28,52,76,100} + foo_1_prt_2 | c19_float4 | 0 | -1 | | | {1,50,100,150,200} + foo | c20_serial4 | 0 | -0.5 | {1,2,3,4} | {0.005,0.005,0.005,0.005} | {1,50,100,150,200} + foo_1_prt_1 | c20_serial4 | 0 | -0.5 | {1,2,3,4} | {0.01,0.01,0.01,0.01} | {5,28,52,76,100} + foo_1_prt_2 | c20_serial4 | 0 | -1 | | | {1,50,100,150,200} + foo | c21_smallint | 0 | -0.49 | {1,2,3,4} | {0.005,0.005,0.005,0.005} | {1,50,100,150,200} + foo_1_prt_1 | c21_smallint | 0 | -0.5 | {1,2,3,4} | {0.01,0.01,0.01,0.01} | {5,28,52,76,100} + foo_1_prt_2 | c21_smallint | 0 | -1 | | | {1,50,100,150,200} + foo | c22_text | 0 | -0.5 | {aa1,aa10,aa100,aa11} | {0.005,0.005,0.005,0.005} | {aa1,aa189,aa53,aa77,aa99} + foo_1_prt_1 | c22_text | 0 | -0.5 | {aa1,aa10,aa100,aa11} | {0.01,0.01,0.01,0.01} | {aa12,aa33,aa55,aa77,aa99} + foo_1_prt_2 | c22_text | 0 | -1 | | | {aa1,aa143,aa189,aa53,aa99} + foo | c23_time | 0 | 24 | {01:59:59,02:59:59,03:59:59,04:59:59} | {0.065,0.065,0.065,0.065} | {00:59:59,09:59:59,11:59:59,18:59:59,23:59:59} + foo_1_prt_1 | c23_time | 0 | -0.12 | {01:59:59,02:59:59,03:59:59,04:59:59} | {0.045,0.045,0.045,0.045} | {00:59:59,09:59:59,14:59:59,18:59:59,23:59:59} + foo_1_prt_2 | c23_time | 0 | 12 | {01:59:59,02:59:59,03:59:59,04:59:59} | {0.085,0.085,0.085,0.085} | {00:59:59,05:59:59,07:59:59,09:59:59,11:59:59} + foo | c24_timetz | 0 | 24 | {01:59:00-05,02:59:00-05,03:59:00-05,04:59:00-05} | {0.065,0.065,0.065,0.065} | {00:59:00-05,09:59:00-05,11:59:00-05,18:59:00-05,23:59:00-05} + foo_1_prt_1 | c24_timetz | 0 | -0.12 | {01:59:00-05,02:59:00-05,03:59:00-05,04:59:00-05} | {0.045,0.045,0.045,0.045} | {00:59:00-05,09:59:00-05,14:59:00-05,18:59:00-05,23:59:00-05} + foo_1_prt_2 | c24_timetz | 0 | 12 | {01:59:00-05,02:59:00-05,03:59:00-05,04:59:00-05} | {0.085,0.085,0.085,0.085} | {00:59:00-05,05:59:00-05,07:59:00-05,09:59:00-05,11:59:00-05} + foo | c25_timestamp | 0 | 24 | {"Mon Jan 01 01:59:00 2018","Mon Jan 01 02:59:00 2018","Mon Jan 01 03:59:00 2018","Mon Jan 01 04:59:00 2018"} | {0.065,0.065,0.065,0.065} | {"Mon Jan 01 00:59:00 2018","Mon Jan 01 09:59:00 2018","Mon Jan 01 11:59:00 2018","Mon Jan 01 18:59:00 2018","Mon Jan 01 23:59:00 2018"} + foo_1_prt_1 | c25_timestamp | 0 | -0.12 | {"Mon Jan 01 01:59:00 2018","Mon Jan 01 02:59:00 2018","Mon Jan 01 03:59:00 2018","Mon Jan 01 04:59:00 2018"} | {0.045,0.045,0.045,0.045} | {"Mon Jan 01 00:59:00 2018","Mon Jan 01 09:59:00 2018","Mon Jan 01 14:59:00 2018","Mon Jan 01 18:59:00 2018","Mon Jan 01 23:59:00 2018"} + foo_1_prt_2 | c25_timestamp | 0 | 12 | {"Mon Jan 01 01:59:00 2018","Mon Jan 01 02:59:00 2018","Mon Jan 01 03:59:00 2018","Mon Jan 01 04:59:00 2018"} | {0.085,0.085,0.085,0.085} | {"Mon Jan 01 00:59:00 2018","Mon Jan 01 05:59:00 2018","Mon Jan 01 07:59:00 2018","Mon Jan 01 09:59:00 2018","Mon Jan 01 11:59:00 2018"} + foo | c26_timestamptz | 0 | 24 | {"Sun Dec 31 22:59:00 2017 PST","Sun Dec 31 23:59:00 2017 PST","Mon Jan 01 00:59:00 2018 PST","Mon Jan 01 01:59:00 2018 PST"} | {0.065,0.065,0.065,0.065} | {"Sun Dec 31 21:59:00 2017 PST","Mon Jan 01 06:59:00 2018 PST","Mon Jan 01 08:59:00 2018 PST","Mon Jan 01 15:59:00 2018 PST","Mon Jan 01 20:59:00 2018 PST"} + foo_1_prt_1 | c26_timestamptz | 0 | -0.12 | {"Sun Dec 31 22:59:00 2017 PST","Sun Dec 31 23:59:00 2017 PST","Mon Jan 01 00:59:00 2018 PST","Mon Jan 01 01:59:00 2018 PST"} | {0.045,0.045,0.045,0.045} | {"Sun Dec 31 21:59:00 2017 PST","Mon Jan 01 06:59:00 2018 PST","Mon Jan 01 11:59:00 2018 PST","Mon Jan 01 15:59:00 2018 PST","Mon Jan 01 20:59:00 2018 PST"} + foo_1_prt_2 | c26_timestamptz | 0 | 12 | {"Sun Dec 31 22:59:00 2017 PST","Sun Dec 31 23:59:00 2017 PST","Mon Jan 01 00:59:00 2018 PST","Mon Jan 01 01:59:00 2018 PST"} | {0.085,0.085,0.085,0.085} | {"Sun Dec 31 21:59:00 2017 PST","Mon Jan 01 02:59:00 2018 PST","Mon Jan 01 04:59:00 2018 PST","Mon Jan 01 06:59:00 2018 PST","Mon Jan 01 08:59:00 2018 PST"} + foo | c27_uuid | 0 | 10 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.15,0.15,0.15,0.15} | {11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111166,11111111-1111-1111-1111-111111111188,11111111-1111-1111-1111-111111111199} + foo_1_prt_1 | c27_uuid | 0 | 10 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.1,0.1,0.1,0.1} | {11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111166,11111111-1111-1111-1111-111111111188,11111111-1111-1111-1111-111111111199} + foo_1_prt_2 | c27_uuid | 0 | 5 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.2,0.2,0.2,0.2} | + foo | c28_tsquery | 0 | -0.75 | {"'foo8' & 'rat8'","'foo4' & 'rat4'","'foo9' & 'rat9'","'foo1' & 'rat1'"} | {0.005,0.005,0.005,0.005} | {"'foo5' & 'rat5'","'foo26' & 'rat26'","'foo130' & 'rat130'","'foo243' & 'rat243'","'foo109' & 'rat109'"} + foo_1_prt_1 | c28_tsquery | 0 | -1 | | | {"'foo8' & 'rat8'","'foo57' & 'rat57'","'foo273' & 'rat273'","'foo272' & 'rat272'","'foo296' & 'rat296'"} + foo_1_prt_2 | c28_tsquery | 0 | -1 | | | {"'foo8' & 'rat8'","'foo57' & 'rat57'","'foo141' & 'rat141'","'foo171' & 'rat171'","'foo109' & 'rat109'"} + foo | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}"} | {0.17,0.17,0.1675} | {"{a0,b0}","{a4,b4}","{a5,b5}"} + foo_1_prt_1 | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}","{a4,b4}"} | {0.17,0.17,0.17,0.17} | {"{a0,b0}","{a5,b5}"} + foo_1_prt_2 | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a0,b0}","{a3,b3}"} | {0.17,0.17,0.165,0.165} | {"{a4,b4}","{a5,b5}"} + foo | c30_intarray | 0 | -0.495 | {"{1,1}","{2,2}","{3,3}","{4,4}"} | {0.005,0.005,0.005,0.005} | {"{1,1}","{50,2}","{100,4}","{150,0}","{200,2}"} + foo_1_prt_1 | c30_intarray | 0 | -0.5 | {"{1,1}","{2,2}","{3,3}","{4,4}"} | {0.01,0.01,0.01,0.01} | {"{5,5}","{28,4}","{52,4}","{76,4}","{100,4}"} + foo_1_prt_2 | c30_intarray | 0 | -1 | | | {"{1,1}","{50,2}","{100,4}","{150,0}","{200,2}"} + foo | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17,0.17,0.1675} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.17,0.17,0.165,0.165} | {"{4,5}","{5,0}"} + foo | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_1 | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_2 | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}"} | {0.17,0.17,0.1675} | {"{0000000000,0000000001}","{0000000100,0000000101}","{0000000101,0000000000}"} + foo_1_prt_1 | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}","{0000000100,0000000101}"} | {0.17,0.17,0.17,0.17} | {"{0000000000,0000000001}","{0000000101,0000000000}"} + foo_1_prt_2 | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000000,0000000001}","{0000000011,0000000100}"} | {0.17,0.17,0.165,0.165} | {"{0000000100,0000000101}","{0000000101,0000000000}"} + foo | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_1 | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_2 | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_1 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_2 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}"} | {0.17,0.17,0.1675} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.4/32,192.168.101.4/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_1 | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}","{192.168.100.4/32,192.168.101.4/32}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_2 | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.0/32,192.168.101.0/32}","{192.168.100.3/32,192.168.101.3/32}"} | {0.17,0.17,0.165,0.165} | {"{192.168.100.4/32,192.168.101.4/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}"} | {0.17,0.17,0.1675} | {"{01-01-2018,01-01-2018}","{01-05-2018,01-05-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_1 | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}","{01-05-2018,01-05-2018}"} | {0.17,0.17,0.17,0.17} | {"{01-01-2018,01-01-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_2 | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-01-2018,01-01-2018}","{01-04-2018,01-04-2018}"} | {0.17,0.17,0.165,0.165} | {"{01-05-2018,01-05-2018}","{01-06-2018,01-06-2018}"} + foo | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17,0.17,0.1675} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.17,0.17,0.165,0.165} | {"{4,5}","{5,0}"} + foo | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17,0.17,0.1675} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.17,0.17,0.165,0.165} | {"{4,5}","{5,0}"} + foo | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}"} | {0.17,0.17,0.1675} | {"{192.168.100.0,192.168.100.1}","{192.168.100.4,192.168.100.5}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_1 | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}","{192.168.100.4,192.168.100.5}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0,192.168.100.1}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_2 | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.0,192.168.100.1}","{192.168.100.3,192.168.100.4}"} | {0.17,0.17,0.165,0.165} | {"{192.168.100.4,192.168.100.5}","{192.168.100.5,192.168.100.0}"} + foo | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17,0.17,0.1675} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.17,0.17,0.165,0.165} | {"{4,5}","{5,0}"} + foo | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_1 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_2 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}"} | {0.17,0.17,0.1675} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:04,08:00:2b:01:02:04}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_1 | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}","{08:00:2b:01:02:04,08:00:2b:01:02:04}"} | {0.17,0.17,0.17,0.17} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_2 | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:03,08:00:2b:01:02:03}"} | {0.17,0.17,0.165,0.165} | {"{08:00:2b:01:02:04,08:00:2b:01:02:04}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_1 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_2 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17,0.17,0.1675} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.17,0.17,0.165,0.165} | {"{4,5}","{5,0}"} + foo | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17,0.17,0.1675} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.17,0.17,0.165,0.165} | {"{4,5}","{5,0}"} + foo | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}"} | {0.17,0.17,0.1675} | {"{abcd0,def1}","{abcd4,def5}","{abcd5,def0}"} + foo_1_prt_1 | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}","{abcd4,def5}"} | {0.17,0.17,0.17,0.17} | {"{abcd0,def1}","{abcd5,def0}"} + foo_1_prt_2 | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd0,def1}","{abcd3,def4}"} | {0.17,0.17,0.165,0.165} | {"{abcd4,def5}","{abcd5,def0}"} + foo | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}"} | {0.17,0.17,0.1675} | {"{00:00:00,01:00:00}","{04:00:00,05:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_1 | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}","{04:00:00,05:00:00}"} | {0.17,0.17,0.17,0.17} | {"{00:00:00,01:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_2 | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{00:00:00,01:00:00}","{03:00:00,04:00:00}"} | {0.17,0.17,0.165,0.165} | {"{04:00:00,05:00:00}","{05:00:00,00:00:00}"} + foo | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}"} | {0.17,0.17,0.1675} | {"{00:00:59-08,01:00:59-05}","{04:00:59-08,05:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_1 | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}","{04:00:59-08,05:00:59-05}"} | {0.17,0.17,0.17,0.17} | {"{00:00:59-08,01:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_2 | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{00:00:59-08,01:00:59-05}","{03:00:59-08,04:00:59-05}"} | {0.17,0.17,0.165,0.165} | {"{04:00:59-08,05:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}"} | {0.17,0.17,0.1675} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_1 | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_2 | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}"} | {0.17,0.17,0.165,0.165} | {"{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}"} | {0.17,0.17,0.1675} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_1 | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_2 | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}"} | {0.17,0.17,0.165,0.165} | {"{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}"} | {0.17,0.17,0.1675} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_1 | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}"} | {0.17,0.17,0.17,0.17} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_2 | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}"} | {0.17,0.17,0.165,0.165} | {"{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo | c54_tsqueryarray | 0 | 6 | {"{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}","{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}"} | {0.17,0.17,0.1675,0.1675} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo_1_prt_1 | c54_tsqueryarray | 0 | 6 | {"{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}"} | {0.17,0.17,0.17,0.17} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo_1_prt_2 | c54_tsqueryarray | 0 | 6 | {"{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}","{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}"} | {0.17,0.17,0.165,0.165} | {"{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}"} + foo | c55_jsonarray | 0 | 0 | | | + foo_1_prt_1 | c55_jsonarray | 0 | 0 | | | + foo_1_prt_2 | c55_jsonarray | 0 | 0 | | | + foo | c57_pointarray | 0 | 0 | | | + foo_1_prt_1 | c57_pointarray | 0 | 0 | | | + foo_1_prt_2 | c57_pointarray | 0 | 0 | | | + foo | c58_linesegarray | 0 | 0 | | | + foo_1_prt_1 | c58_linesegarray | 0 | 0 | | | + foo_1_prt_2 | c58_linesegarray | 0 | 0 | | | + foo | c59_patharray | 0 | 0 | | | + foo_1_prt_1 | c59_patharray | 0 | 0 | | | + foo_1_prt_2 | c59_patharray | 0 | 0 | | | + foo | c60_boxarray | 0 | 0 | | | + foo_1_prt_1 | c60_boxarray | 0 | 0 | | | + foo_1_prt_2 | c60_boxarray | 0 | 0 | | | + foo | c61_polygonarray | 0 | 0 | | | + foo_1_prt_1 | c61_polygonarray | 0 | 0 | | | + foo_1_prt_2 | c61_polygonarray | 0 | 0 | | | + foo | c62_circlearray | 0 | 0 | | | + foo_1_prt_1 | c62_circlearray | 0 | 0 | | | + foo_1_prt_2 | c62_circlearray | 0 | 0 | | | + foo | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}"} | {0.17,0.17,0.1675} | {"{\"(0,1)\",\"(0,1)\"}","{\"(4,5)\",\"(4,5)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_1 | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}","{\"(4,5)\",\"(4,5)\"}"} | {0.17,0.17,0.17,0.17} | {"{\"(0,1)\",\"(0,1)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_2 | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(0,1)\",\"(0,1)\"}","{\"(3,4)\",\"(3,4)\"}"} | {0.17,0.17,0.165,0.165} | {"{\"(4,5)\",\"(4,5)\"}","{\"(5,0)\",\"(5,0)\"}"} +(183 rows) + +-- Case 3: Partitions have MCVs but after merge, MCVs that do not qualify as +-- global MCV for the root will be used to create root histograms +TRUNCATE foo; +INSERT INTO foo +SELECT +i, +i%3, +i%4::bigint, +i%4, +i::bit, +(i%4)::bit(10)::bit varying(10), +(i)::bool, +(i%4)::char, +('a'||(i%4))::varchar(10), +('192.168.100.'||(i%4))::cidr, +('2018-4-'||(i%4)+1)::date, +(i%4)::numeric(8,2), +(i%4)::float8, +inet ('192.168.100.'||(i%4)), +i%4::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%4)::text)::text::macaddr, +(i%4)::text::money, +(i%4)::float4, +i%4, +i%4, +'aa'||(i%4)::text, +('12:'||(i%4)::text||':00')::time, +('12:'||(i%4)::text||':00 EST')::timetz, +('2018-01-01 '||'12:'||(i%4)::text||':00')::timestamp, +('2018-01-01 '||'12:'||(i%4)::text||':00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%4)::text||(i%4)::text)::uuid, +('foo'||(i%4)::text||' & rat'||(i%4)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i))::cidr, +('2018-4-'||(i%26+1))::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +('12:'||(i%60)::text||':00')::time, +('12:'||(i%60)::text||':00 EST')::timetz, +('2018-01-01 '||'12:'||(i%60)::text||':00')::timestamp, +('2018-01-01 '||'12:'||(i%60)::text||':00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%6)::text||(i%6)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,60) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i%4+61::bigint, +i%4+61, +(i%4+61)::bit, +(i%4+61)::bit(10)::bit varying(10), +(i%4+61)::bool, +(i%4+61)::char, +('a'||(i%4+61))::varchar(10), +('192.168.100.'||(i%4+61))::cidr, +('2018-4-'||(i%4)+27)::date, +(i%4+61)::numeric(8,2), +(i%4+61)::float8, +inet ('192.168.100.'||(i%4+61)), +i%4+61::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%4+61)::text)::text::macaddr, +(i%4+61)::text::money, +(i%4+61)::float4, +i%4+61, +i%4+61, +'aa'||(i%4+61)::text, +('12:59:'||(i%4+10)::text)::time, +('12:59:'||(i%4+10)::text||' EST')::timetz, +('2018-01-01 '||'12:59:'||(i%4+10)::text)::timestamp, +('2018-01-01 '||'12:59:'||(i%4+10)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%4+6)::text||(i%4+6)::text)::uuid, +('foo'||(i%4)::text||' & rat'||(i%4)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,40) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------------------------------+-----------+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + foo | a | 0 | -0.495 | {1,2,3,4} | {0.01,0.01,0.01,0.01} | {1,25,50,75,100} + foo_1_prt_1 | a | 0 | -1 | | | {1,25,50,75,100} + foo_1_prt_2 | a | 0 | -0.6 | {1,2,3,4} | {0.02,0.02,0.02,0.02} | {5,16,27,39,60} + foo | b | 0 | 6 | {1,4,0,2} | {0.17,0.17,0.165,0.165} | {3,5} + foo_1_prt_1 | b | 0 | 3 | {1,0,2} | {0.34,0.33,0.33} | + foo_1_prt_2 | b | 0 | 3 | {4,3,5} | {0.34,0.33,0.33} | + foo | c03_bigint | 0 | -0.32 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {1,30,60,62,64} + foo_1_prt_1 | c03_bigint | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c03_bigint | 0 | -0.64 | {61,62,63,64} | {0.1,0.1,0.1,0.1} | {1,15,30,45,60} + foo | c04_bigserial | 0 | -0.32 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {1,30,60,62,64} + foo_1_prt_1 | c04_bigserial | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c04_bigserial | 0 | -0.64 | {61,62,63,64} | {0.1,0.1,0.1,0.1} | {1,15,30,45,60} + foo | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_1 | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_2 | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo | c06_bit_varying_10 | 0 | -0.32 | {0000000000,0000000001,0000000010,0000000011} | {0.125,0.125,0.125,0.125} | {0000000001,0000011110,0000111100,0000111110,0001000000} + foo_1_prt_1 | c06_bit_varying_10 | 0 | 4 | {0000000000,0000000001,0000000010,0000000011} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c06_bit_varying_10 | 0 | -0.64 | {0000111101,0000111110,0000111111,0001000000} | {0.1,0.1,0.1,0.1} | {0000000001,0000001111,0000011110,0000101101,0000111100} + foo | c07_bool | 0 | 1 | {t} | {1} | + foo_1_prt_1 | c07_bool | 0 | 1 | {t} | {1} | + foo_1_prt_2 | c07_bool | 0 | 1 | {t} | {1} | + foo | c08_char | 0 | 9 | {6,1,2,3} | {0.21,0.18,0.18,0.18} | {0,5,9} + foo_1_prt_1 | c08_char | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c08_char | 0 | 9 | {6,1,2,3} | {0.42,0.11,0.11,0.11} | {4,4,5,5,9} + foo | c09_varchar_10 | 0 | -0.32 | {a0,a1,a2,a3} | {0.125,0.125,0.125,0.125} | {a1,a36,a61,a63,a9} + foo_1_prt_1 | c09_varchar_10 | 0 | 4 | {a0,a1,a2,a3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c09_varchar_10 | 0 | -0.64 | {a61,a62,a63,a64} | {0.1,0.1,0.1,0.1} | {a1,a22,a36,a5,a9} + foo | c10_cidr | 0 | -0.32 | {192.168.100.0/32,192.168.100.1/32,192.168.100.2/32,192.168.100.3/32} | {0.125,0.125,0.125,0.125} | {192.168.100.1/32,192.168.100.30/32,192.168.100.60/32,192.168.100.62/32,192.168.100.64/32} + foo_1_prt_1 | c10_cidr | 0 | 4 | {192.168.100.0/32,192.168.100.1/32,192.168.100.2/32,192.168.100.3/32} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c10_cidr | 0 | -0.64 | {192.168.100.61/32,192.168.100.62/32,192.168.100.63/32,192.168.100.64/32} | {0.1,0.1,0.1,0.1} | {192.168.100.1/32,192.168.100.15/32,192.168.100.30/32,192.168.100.45/32,192.168.100.60/32} + foo | c11_date | 0 | -0.15 | {04-01-2018,04-02-2018,04-03-2018,04-04-2018} | {0.125,0.125,0.125,0.125} | {04-01-2018,04-11-2018,04-26-2018,04-28-2018,04-30-2018} + foo_1_prt_1 | c11_date | 0 | 4 | {04-01-2018,04-02-2018,04-03-2018,04-04-2018} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c11_date | 0 | -0.3 | {04-27-2018,04-28-2018,04-29-2018,04-30-2018} | {0.1,0.1,0.1,0.1} | {04-01-2018,04-06-2018,04-11-2018,04-19-2018,04-26-2018} + foo | c12_numeric_8_2 | 0 | -0.32 | {0.00,1.00,2.00,3.00} | {0.125,0.125,0.125,0.125} | {1.00,30.00,60.00,62.00,64.00} + foo_1_prt_1 | c12_numeric_8_2 | 0 | 4 | {0.00,1.00,2.00,3.00} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c12_numeric_8_2 | 0 | -0.64 | {61.00,62.00,63.00,64.00} | {0.1,0.1,0.1,0.1} | {1.00,15.00,30.00,45.00,60.00} + foo | c13_float8 | 0 | -0.32 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {1,30,60,62,64} + foo_1_prt_1 | c13_float8 | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c13_float8 | 0 | -0.64 | {61,62,63,64} | {0.1,0.1,0.1,0.1} | {1,15,30,45,60} + foo | c14_inet | 0 | -0.32 | {192.168.100.0,192.168.100.1,192.168.100.2,192.168.100.3} | {0.125,0.125,0.125,0.125} | {192.168.100.1,192.168.100.30,192.168.100.60,192.168.100.62,192.168.100.64} + foo_1_prt_1 | c14_inet | 0 | 4 | {192.168.100.0,192.168.100.1,192.168.100.2,192.168.100.3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c14_inet | 0 | -0.64 | {192.168.100.61,192.168.100.62,192.168.100.63,192.168.100.64} | {0.1,0.1,0.1,0.1} | {192.168.100.1,192.168.100.15,192.168.100.30,192.168.100.45,192.168.100.60} + foo | c15_int4 | 0 | -0.32 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {1,30,60,62,64} + foo_1_prt_1 | c15_int4 | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c15_int4 | 0 | -0.64 | {61,62,63,64} | {0.1,0.1,0.1,0.1} | {1,15,30,45,60} + foo | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_1 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_2 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo | c17_macaddr | 0 | -0.32 | {12:34:56:78:90:00,12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03} | {0.125,0.125,0.125,0.125} | {12:34:56:78:90:01,12:34:56:78:90:30,12:34:56:78:90:60,12:34:56:78:90:62,12:34:56:78:90:64} + foo_1_prt_1 | c17_macaddr | 0 | 4 | {12:34:56:78:90:00,12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c17_macaddr | 0 | -0.64 | {12:34:56:78:90:61,12:34:56:78:90:62,12:34:56:78:90:63,12:34:56:78:90:64} | {0.1,0.1,0.1,0.1} | {12:34:56:78:90:01,12:34:56:78:90:15,12:34:56:78:90:30,12:34:56:78:90:45,12:34:56:78:90:60} + foo | c18_money | 0 | -0.32 | {$0.00,$1.00,$2.00,$3.00} | {0.125,0.125,0.125,0.125} | {$1.00,$30.00,$60.00,$62.00,$64.00} + foo_1_prt_1 | c18_money | 0 | 4 | {$0.00,$1.00,$2.00,$3.00} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c18_money | 0 | -0.64 | {$61.00,$62.00,$63.00,$64.00} | {0.1,0.1,0.1,0.1} | {$1.00,$15.00,$30.00,$45.00,$60.00} + foo | c19_float4 | 0 | -0.32 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {1,30,60,62,64} + foo_1_prt_1 | c19_float4 | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c19_float4 | 0 | -0.64 | {61,62,63,64} | {0.1,0.1,0.1,0.1} | {1,15,30,45,60} + foo | c20_serial4 | 0 | -0.32 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {1,30,60,62,64} + foo_1_prt_1 | c20_serial4 | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c20_serial4 | 0 | -0.64 | {61,62,63,64} | {0.1,0.1,0.1,0.1} | {1,15,30,45,60} + foo | c21_smallint | 0 | -0.315 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {1,30,60,62,64} + foo_1_prt_1 | c21_smallint | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c21_smallint | 0 | -0.64 | {61,62,63,64} | {0.1,0.1,0.1,0.1} | {1,15,30,45,60} + foo | c22_text | 0 | -0.32 | {aa0,aa1,aa2,aa3} | {0.125,0.125,0.125,0.125} | {aa1,aa36,aa61,aa63,aa9} + foo_1_prt_1 | c22_text | 0 | 4 | {aa0,aa1,aa2,aa3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c22_text | 0 | -0.64 | {aa61,aa62,aa63,aa64} | {0.1,0.1,0.1,0.1} | {aa1,aa22,aa36,aa5,aa9} + foo | c23_time | 0 | -0.315 | {12:00:00,12:01:00,12:02:00,12:03:00} | {0.125,0.125,0.125,0.125} | {12:00:00,12:29:00,12:59:00,12:59:11,12:59:13} + foo_1_prt_1 | c23_time | 0 | 4 | {12:00:00,12:01:00,12:02:00,12:03:00} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c23_time | 0 | -0.64 | {12:59:10,12:59:11,12:59:12,12:59:13} | {0.1,0.1,0.1,0.1} | {12:00:00,12:14:00,12:29:00,12:44:00,12:59:00} + foo | c24_timetz | 0 | -0.315 | {12:00:00-05,12:01:00-05,12:02:00-05,12:03:00-05} | {0.125,0.125,0.125,0.125} | {12:00:00-05,12:29:00-05,12:59:00-05,12:59:11-05,12:59:13-05} + foo_1_prt_1 | c24_timetz | 0 | 4 | {12:00:00-05,12:01:00-05,12:02:00-05,12:03:00-05} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c24_timetz | 0 | -0.64 | {12:59:10-05,12:59:11-05,12:59:12-05,12:59:13-05} | {0.1,0.1,0.1,0.1} | {12:00:00-05,12:14:00-05,12:29:00-05,12:44:00-05,12:59:00-05} + foo | c25_timestamp | 0 | -0.315 | {"Mon Jan 01 12:00:00 2018","Mon Jan 01 12:01:00 2018","Mon Jan 01 12:02:00 2018","Mon Jan 01 12:03:00 2018"} | {0.125,0.125,0.125,0.125} | {"Mon Jan 01 12:00:00 2018","Mon Jan 01 12:29:00 2018","Mon Jan 01 12:59:00 2018","Mon Jan 01 12:59:11 2018","Mon Jan 01 12:59:13 2018"} + foo_1_prt_1 | c25_timestamp | 0 | 4 | {"Mon Jan 01 12:00:00 2018","Mon Jan 01 12:01:00 2018","Mon Jan 01 12:02:00 2018","Mon Jan 01 12:03:00 2018"} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c25_timestamp | 0 | -0.64 | {"Mon Jan 01 12:59:10 2018","Mon Jan 01 12:59:11 2018","Mon Jan 01 12:59:12 2018","Mon Jan 01 12:59:13 2018"} | {0.1,0.1,0.1,0.1} | {"Mon Jan 01 12:00:00 2018","Mon Jan 01 12:14:00 2018","Mon Jan 01 12:29:00 2018","Mon Jan 01 12:44:00 2018","Mon Jan 01 12:59:00 2018"} + foo | c26_timestamptz | 0 | -0.315 | {"Mon Jan 01 09:00:00 2018 PST","Mon Jan 01 09:01:00 2018 PST","Mon Jan 01 09:02:00 2018 PST","Mon Jan 01 09:03:00 2018 PST"} | {0.125,0.125,0.125,0.125} | {"Mon Jan 01 09:00:00 2018 PST","Mon Jan 01 09:29:00 2018 PST","Mon Jan 01 09:59:00 2018 PST","Mon Jan 01 09:59:11 2018 PST","Mon Jan 01 09:59:13 2018 PST"} + foo_1_prt_1 | c26_timestamptz | 0 | 4 | {"Mon Jan 01 09:00:00 2018 PST","Mon Jan 01 09:01:00 2018 PST","Mon Jan 01 09:02:00 2018 PST","Mon Jan 01 09:03:00 2018 PST"} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c26_timestamptz | 0 | -0.64 | {"Mon Jan 01 09:59:10 2018 PST","Mon Jan 01 09:59:11 2018 PST","Mon Jan 01 09:59:12 2018 PST","Mon Jan 01 09:59:13 2018 PST"} | {0.1,0.1,0.1,0.1} | {"Mon Jan 01 09:00:00 2018 PST","Mon Jan 01 09:14:00 2018 PST","Mon Jan 01 09:29:00 2018 PST","Mon Jan 01 09:44:00 2018 PST","Mon Jan 01 09:59:00 2018 PST"} + foo | c27_uuid | 0 | 10 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.175,0.175,0.175,0.175} | {11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111166,11111111-1111-1111-1111-111111111188,11111111-1111-1111-1111-111111111199} + foo_1_prt_1 | c27_uuid | 0 | 4 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c27_uuid | 0 | 10 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.1,0.1,0.1,0.1} | {11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111166,11111111-1111-1111-1111-111111111188,11111111-1111-1111-1111-111111111199} + foo | c28_tsquery | 0 | -0.305 | {"'foo1' & 'rat1'","'foo3' & 'rat3'","'foo2' & 'rat2'","'foo0' & 'rat0'"} | {0.18,0.18,0.18,0.175} | {"'foo8' & 'rat8'","'foo31' & 'rat31'","'foo60' & 'rat60'","'foo32' & 'rat32'","'foo16' & 'rat16'"} + foo_1_prt_1 | c28_tsquery | 0 | 4 | {"'foo0' & 'rat0'","'foo1' & 'rat1'","'foo3' & 'rat3'","'foo2' & 'rat2'"} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | c28_tsquery | 0 | -0.61 | {"'foo1' & 'rat1'","'foo3' & 'rat3'","'foo2' & 'rat2'","'foo0' & 'rat0'"} | {0.11,0.11,0.11,0.1} | {"'foo8' & 'rat8'","'foo31' & 'rat31'","'foo60' & 'rat60'","'foo32' & 'rat32'","'foo16' & 'rat16'"} + foo | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}","{a4,b4}"} | {0.17,0.17,0.17,0.17} | {"{a0,b0}","{a5,b5}"} + foo_1_prt_1 | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}","{a4,b4}"} | {0.17,0.17,0.17,0.17} | {"{a0,b0}","{a5,b5}"} + foo_1_prt_2 | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}","{a4,b4}"} | {0.17,0.17,0.17,0.17} | {"{a0,b0}","{a5,b5}"} + foo | c30_intarray | 0 | -0.495 | {"{1,1}","{2,2}","{3,3}","{4,4}"} | {0.01,0.01,0.01,0.01} | {"{1,1}","{25,1}","{50,2}","{75,3}","{100,4}"} + foo_1_prt_1 | c30_intarray | 0 | -1 | | | {"{1,1}","{25,1}","{50,2}","{75,3}","{100,4}"} + foo_1_prt_2 | c30_intarray | 0 | -0.6 | {"{1,1}","{2,2}","{3,3}","{4,4}"} | {0.02,0.02,0.02,0.02} | {"{5,5}","{16,4}","{27,3}","{39,3}","{60,0}"} + foo | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_1 | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_2 | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}","{0000000100,0000000101}"} | {0.17,0.17,0.17,0.17} | {"{0000000000,0000000001}","{0000000101,0000000000}"} + foo_1_prt_1 | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}","{0000000100,0000000101}"} | {0.17,0.17,0.17,0.17} | {"{0000000000,0000000001}","{0000000101,0000000000}"} + foo_1_prt_2 | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}","{0000000100,0000000101}"} | {0.17,0.17,0.17,0.17} | {"{0000000000,0000000001}","{0000000101,0000000000}"} + foo | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_1 | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_2 | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_1 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_2 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}","{192.168.100.4/32,192.168.101.4/32}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_1 | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}","{192.168.100.4/32,192.168.101.4/32}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_2 | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}","{192.168.100.4/32,192.168.101.4/32}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}","{01-05-2018,01-05-2018}"} | {0.17,0.17,0.17,0.17} | {"{01-01-2018,01-01-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_1 | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}","{01-05-2018,01-05-2018}"} | {0.17,0.17,0.17,0.17} | {"{01-01-2018,01-01-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_2 | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}","{01-05-2018,01-05-2018}"} | {0.17,0.17,0.17,0.17} | {"{01-01-2018,01-01-2018}","{01-06-2018,01-06-2018}"} + foo | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}","{192.168.100.4,192.168.100.5}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0,192.168.100.1}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_1 | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}","{192.168.100.4,192.168.100.5}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0,192.168.100.1}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_2 | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}","{192.168.100.4,192.168.100.5}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0,192.168.100.1}","{192.168.100.5,192.168.100.0}"} + foo | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_1 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_2 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}","{08:00:2b:01:02:04,08:00:2b:01:02:04}"} | {0.17,0.17,0.17,0.17} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_1 | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}","{08:00:2b:01:02:04,08:00:2b:01:02:04}"} | {0.17,0.17,0.17,0.17} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_2 | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}","{08:00:2b:01:02:04,08:00:2b:01:02:04}"} | {0.17,0.17,0.17,0.17} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_1 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_2 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}","{abcd4,def5}"} | {0.17,0.17,0.17,0.17} | {"{abcd0,def1}","{abcd5,def0}"} + foo_1_prt_1 | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}","{abcd4,def5}"} | {0.17,0.17,0.17,0.17} | {"{abcd0,def1}","{abcd5,def0}"} + foo_1_prt_2 | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}","{abcd4,def5}"} | {0.17,0.17,0.17,0.17} | {"{abcd0,def1}","{abcd5,def0}"} + foo | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}","{04:00:00,05:00:00}"} | {0.17,0.17,0.17,0.17} | {"{00:00:00,01:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_1 | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}","{04:00:00,05:00:00}"} | {0.17,0.17,0.17,0.17} | {"{00:00:00,01:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_2 | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}","{04:00:00,05:00:00}"} | {0.17,0.17,0.17,0.17} | {"{00:00:00,01:00:00}","{05:00:00,00:00:00}"} + foo | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}","{04:00:59-08,05:00:59-05}"} | {0.17,0.17,0.17,0.17} | {"{00:00:59-08,01:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_1 | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}","{04:00:59-08,05:00:59-05}"} | {0.17,0.17,0.17,0.17} | {"{00:00:59-08,01:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_2 | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}","{04:00:59-08,05:00:59-05}"} | {0.17,0.17,0.17,0.17} | {"{00:00:59-08,01:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_1 | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_2 | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_1 | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_2 | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}"} | {0.17,0.17,0.17,0.17} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_1 | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}"} | {0.17,0.17,0.17,0.17} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_2 | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}"} | {0.17,0.17,0.17,0.17} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo | c54_tsqueryarray | 0 | 6 | {"{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}"} | {0.17,0.17,0.17,0.17} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo_1_prt_1 | c54_tsqueryarray | 0 | 6 | {"{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}"} | {0.17,0.17,0.17,0.17} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo_1_prt_2 | c54_tsqueryarray | 0 | 6 | {"{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}"} | {0.17,0.17,0.17,0.17} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo | c55_jsonarray | 0 | 0 | | | + foo_1_prt_1 | c55_jsonarray | 0 | 0 | | | + foo_1_prt_2 | c55_jsonarray | 0 | 0 | | | + foo | c57_pointarray | 0 | 0 | | | + foo_1_prt_1 | c57_pointarray | 0 | 0 | | | + foo_1_prt_2 | c57_pointarray | 0 | 0 | | | + foo | c58_linesegarray | 0 | 0 | | | + foo_1_prt_1 | c58_linesegarray | 0 | 0 | | | + foo_1_prt_2 | c58_linesegarray | 0 | 0 | | | + foo | c59_patharray | 0 | 0 | | | + foo_1_prt_1 | c59_patharray | 0 | 0 | | | + foo_1_prt_2 | c59_patharray | 0 | 0 | | | + foo | c60_boxarray | 0 | 0 | | | + foo_1_prt_1 | c60_boxarray | 0 | 0 | | | + foo_1_prt_2 | c60_boxarray | 0 | 0 | | | + foo | c61_polygonarray | 0 | 0 | | | + foo_1_prt_1 | c61_polygonarray | 0 | 0 | | | + foo_1_prt_2 | c61_polygonarray | 0 | 0 | | | + foo | c62_circlearray | 0 | 0 | | | + foo_1_prt_1 | c62_circlearray | 0 | 0 | | | + foo_1_prt_2 | c62_circlearray | 0 | 0 | | | + foo | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}","{\"(4,5)\",\"(4,5)\"}"} | {0.17,0.17,0.17,0.17} | {"{\"(0,1)\",\"(0,1)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_1 | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}","{\"(4,5)\",\"(4,5)\"}"} | {0.17,0.17,0.17,0.17} | {"{\"(0,1)\",\"(0,1)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_2 | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}","{\"(4,5)\",\"(4,5)\"}"} | {0.17,0.17,0.17,0.17} | {"{\"(0,1)\",\"(0,1)\"}","{\"(5,0)\",\"(5,0)\"}"} +(183 rows) + +-- Case 4: A partition has MCVs but after merge, those MCVs do not qualify as +-- global MCV for the root will be used to create root histograms +TRUNCATE foo; +INSERT INTO foo +SELECT +i, +i%3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i%128))::cidr, +('2018-4-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +((i%12)::text||':59:59')::time, +((i%12)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%12)::text||':59:00')::timestamp, +('2018-01-01 '||(i%12)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5)::text||(i%5)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i%4+61::bigint, +i%4+61, +(i%4+61)::bit, +(i%4+61)::bit(10)::bit varying(10), +(i%4+61)::bool, +(i%4+61)::char, +('a'||(i%4+61))::varchar(10), +('192.168.100.'||(i%4+61))::cidr, +('2018-4-'||(i%4+26))::date, +(i%4+61)::numeric(8,2), +(i%4+61)::float8, +inet ('192.168.100.'||(i%4+61)), +i%4+61::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%4+61)::text)::text::macaddr, +(i%4+61)::text::money, +(i%4+61)::float4, +i%4+61, +i%4+61, +'aa'||(i%4+61)::text, +('12:'||(i%4+56)::text||':00')::time, +('12:'||(i%4+56)::text||':00 EST')::timetz, +('2018-01-01 '||'12:'||(i%4+56)::text||':00')::timestamp, +('2018-01-01 '||'12:'||(i%4+56)::text||':00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%4+6)::text||(i%4+6)::text)::uuid, +('foo'||(i%4+61)::text||' & rat'||(i%4+61)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,8) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i))::cidr, +('2018-4-'||(i%25+1))::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +('12:00:'||(i%60)::text)::time, +('12:00:'||(i%60)::text||' EST')::timetz, +('2018-01-01 '||'12:00'||(i%60)::text)::timestamp, +('2018-01-01 '||'12:00'||(i%60)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%10)::text||(i%10)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,60) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' and attname != 'a' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------------------------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + foo | b | 0 | 6 | {1,0,2,4} | {0.20238096,0.19642857,0.19642857,0.13690476} | {3,5} + foo_1_prt_1 | b | 0 | 3 | {1,0,2} | {0.34,0.33,0.33} | + foo_1_prt_2 | b | 0 | 3 | {4,5,3} | {0.3382353,0.3382353,0.32352942} | + foo | c03_bigint | 0 | -0.58928573 | {61,62,63,64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {1,25,50,75,100} + foo_1_prt_1 | c03_bigint | 0 | -1 | | | {1,25,50,75,100} + foo_1_prt_2 | c03_bigint | 0 | -0.9411765 | {61,62,63,64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {1,15,30,45,60} + foo | c04_bigserial | 0 | -0.58928573 | {61,62,63,64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {1,25,50,75,100} + foo_1_prt_1 | c04_bigserial | 0 | -1 | | | {1,25,50,75,100} + foo_1_prt_2 | c04_bigserial | 0 | -0.9411765 | {61,62,63,64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {1,15,30,45,60} + foo | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_1 | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_2 | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo | c06_bit_varying_10 | 0 | -0.58928573 | {0000111101,0000111110,0000111111,0001000000} | {0.011904762,0.011904762,0.011904762,0.011904762} | {0000000001,0000011001,0000110010,0001001011,0001100100} + foo_1_prt_1 | c06_bit_varying_10 | 0 | -1 | | | {0000000001,0000011001,0000110010,0001001011,0001100100} + foo_1_prt_2 | c06_bit_varying_10 | 0 | -0.9411765 | {0000111101,0000111110,0000111111,0001000000} | {0.029411765,0.029411765,0.029411765,0.029411765} | {0000000001,0000001111,0000011110,0000101101,0000111100} + foo | c07_bool | 0 | 1 | {t} | {1} | + foo_1_prt_1 | c07_bool | 0 | 1 | {t} | {1} | + foo_1_prt_2 | c07_bool | 0 | 1 | {t} | {1} | + foo | c08_char | 0 | 9 | {1,2,3,4} | {0.13690476,0.13095239,0.13095239,0.13095239} | {5,6,7,8,9} + foo_1_prt_1 | c08_char | 0 | 9 | {1,2,3,4} | {0.12,0.11,0.11,0.11} | {5,6,7,8,9} + foo_1_prt_2 | c08_char | 0 | -0.13235295 | {1,2,3,4} | {0.16176471,0.16176471,0.16176471,0.16176471} | {5,5,6,6,9} + foo | c09_varchar_10 | 0 | -0.58928573 | {a61,a62,a63,a64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {a1,a30,a53,a76,a99} + foo_1_prt_1 | c09_varchar_10 | 0 | -1 | | | {a1,a30,a53,a76,a99} + foo_1_prt_2 | c09_varchar_10 | 0 | -0.9411765 | {a61,a62,a63,a64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {a1,a22,a36,a5,a9} + foo | c10_cidr | 0 | -0.58928573 | {192.168.100.61/32,192.168.100.62/32,192.168.100.63/32,192.168.100.64/32} | {0.011904762,0.011904762,0.011904762,0.011904762} | {192.168.100.1/32,192.168.100.25/32,192.168.100.50/32,192.168.100.75/32,192.168.100.100/32} + foo_1_prt_1 | c10_cidr | 0 | -1 | | | {192.168.100.1/32,192.168.100.25/32,192.168.100.50/32,192.168.100.75/32,192.168.100.100/32} + foo_1_prt_2 | c10_cidr | 0 | -0.9411765 | {192.168.100.61/32,192.168.100.62/32,192.168.100.63/32,192.168.100.64/32} | {0.029411765,0.029411765,0.029411765,0.029411765} | {192.168.100.1/32,192.168.100.15/32,192.168.100.30/32,192.168.100.45/32,192.168.100.60/32} + foo | c11_date | 0 | -0.17261904 | {04-02-2018,04-03-2018,04-04-2018,04-05-2018} | {0.05952381,0.05952381,0.05952381,0.05952381} | {04-01-2018,04-09-2018,04-12-2018,04-15-2018,04-29-2018} + foo_1_prt_1 | c11_date | 0 | -0.15 | {04-02-2018,04-03-2018,04-04-2018,04-05-2018} | {0.07,0.07,0.07,0.07} | {04-01-2018,04-07-2018,04-10-2018,04-12-2018,04-15-2018} + foo_1_prt_2 | c11_date | 0 | -0.42647058 | {04-02-2018,04-03-2018,04-04-2018,04-05-2018} | {0.04411765,0.04411765,0.04411765,0.04411765} | {04-01-2018,04-09-2018,04-15-2018,04-22-2018,04-29-2018} + foo | c12_numeric_8_2 | 0 | -0.58928573 | {61.00,62.00,63.00,64.00} | {0.011904762,0.011904762,0.011904762,0.011904762} | {1.00,25.00,50.00,75.00,100.00} + foo_1_prt_1 | c12_numeric_8_2 | 0 | -1 | | | {1.00,25.00,50.00,75.00,100.00} + foo_1_prt_2 | c12_numeric_8_2 | 0 | -0.9411765 | {61.00,62.00,63.00,64.00} | {0.029411765,0.029411765,0.029411765,0.029411765} | {1.00,15.00,30.00,45.00,60.00} + foo | c13_float8 | 0 | -0.5833333 | {61,62,63,64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {1,25,50,75,100} + foo_1_prt_1 | c13_float8 | 0 | -1 | | | {1,25,50,75,100} + foo_1_prt_2 | c13_float8 | 0 | -0.9411765 | {61,62,63,64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {1,15,30,45,60} + foo | c14_inet | 0 | -0.58928573 | {192.168.100.61,192.168.100.62,192.168.100.63,192.168.100.64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {192.168.100.1,192.168.100.25,192.168.100.50,192.168.100.75,192.168.100.100} + foo_1_prt_1 | c14_inet | 0 | -1 | | | {192.168.100.1,192.168.100.25,192.168.100.50,192.168.100.75,192.168.100.100} + foo_1_prt_2 | c14_inet | 0 | -0.9411765 | {192.168.100.61,192.168.100.62,192.168.100.63,192.168.100.64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {192.168.100.1,192.168.100.15,192.168.100.30,192.168.100.45,192.168.100.60} + foo | c15_int4 | 0 | -0.58928573 | {61,62,63,64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {1,25,50,75,100} + foo_1_prt_1 | c15_int4 | 0 | -1 | | | {1,25,50,75,100} + foo_1_prt_2 | c15_int4 | 0 | -0.9411765 | {61,62,63,64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {1,15,30,45,60} + foo | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_1 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_2 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo | c17_macaddr | 0 | -0.38690478 | | | {12:34:56:78:90:00,12:34:56:78:90:15,12:34:56:78:90:30,12:34:56:78:90:49,12:34:56:78:90:64} + foo_1_prt_1 | c17_macaddr | 0 | -0.5 | {12:34:56:78:90:00,12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03} | {0.02,0.02,0.02,0.02} | {12:34:56:78:90:04,12:34:56:78:90:15,12:34:56:78:90:26,12:34:56:78:90:38,12:34:56:78:90:49} + foo_1_prt_2 | c17_macaddr | 0 | -0.9411765 | {12:34:56:78:90:61,12:34:56:78:90:62,12:34:56:78:90:63,12:34:56:78:90:64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {12:34:56:78:90:01,12:34:56:78:90:15,12:34:56:78:90:30,12:34:56:78:90:45,12:34:56:78:90:60} + foo | c18_money | 0 | -0.58928573 | {$61.00,$62.00,$63.00,$64.00} | {0.011904762,0.011904762,0.011904762,0.011904762} | {$1.00,$25.00,$50.00,$75.00,$100.00} + foo_1_prt_1 | c18_money | 0 | -1 | | | {$1.00,$25.00,$50.00,$75.00,$100.00} + foo_1_prt_2 | c18_money | 0 | -0.9411765 | {$61.00,$62.00,$63.00,$64.00} | {0.029411765,0.029411765,0.029411765,0.029411765} | {$1.00,$15.00,$30.00,$45.00,$60.00} + foo | c19_float4 | 0 | -0.58928573 | {61,62,63,64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {1,25,50,75,100} + foo_1_prt_1 | c19_float4 | 0 | -1 | | | {1,25,50,75,100} + foo_1_prt_2 | c19_float4 | 0 | -0.9411765 | {61,62,63,64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {1,15,30,45,60} + foo | c20_serial4 | 0 | -0.58928573 | {61,62,63,64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {1,25,50,75,100} + foo_1_prt_1 | c20_serial4 | 0 | -1 | | | {1,25,50,75,100} + foo_1_prt_2 | c20_serial4 | 0 | -0.9411765 | {61,62,63,64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {1,15,30,45,60} + foo | c21_smallint | 0 | -0.58928573 | {61,62,63,64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {1,25,50,75,100} + foo_1_prt_1 | c21_smallint | 0 | -1 | | | {1,25,50,75,100} + foo_1_prt_2 | c21_smallint | 0 | -0.9411765 | {61,62,63,64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {1,15,30,45,60} + foo | c22_text | 0 | -0.58928573 | {aa61,aa62,aa63,aa64} | {0.011904762,0.011904762,0.011904762,0.011904762} | {aa1,aa30,aa53,aa76,aa99} + foo_1_prt_1 | c22_text | 0 | -1 | | | {aa1,aa30,aa53,aa76,aa99} + foo_1_prt_2 | c22_text | 0 | -0.9411765 | {aa61,aa62,aa63,aa64} | {0.029411765,0.029411765,0.029411765,0.029411765} | {aa1,aa22,aa36,aa5,aa9} + foo | c23_time | 0 | -0.44642857 | {01:59:59,02:59:59,03:59:59,04:59:59} | {0.05357143,0.05357143,0.05357143,0.05357143} | {00:59:59,09:59:59,12:00:14,12:00:44,12:59:00} + foo_1_prt_1 | c23_time | 0 | -0.12 | {01:59:59,02:59:59,03:59:59,04:59:59} | {0.09,0.09,0.09,0.09} | {00:59:59,05:59:59,07:59:59,09:59:59,11:59:59} + foo_1_prt_2 | c23_time | 0 | -0.9411765 | {12:56:00,12:57:00,12:58:00,12:59:00} | {0.029411765,0.029411765,0.029411765,0.029411765} | {12:00:00,12:00:14,12:00:29,12:00:44,12:00:59} + foo | c24_timetz | 0 | -0.44642857 | {01:59:00-05,02:59:00-05,03:59:00-05,04:59:00-05} | {0.05357143,0.05357143,0.05357143,0.05357143} | {00:59:00-05,09:59:00-05,12:00:14-05,12:00:44-05,12:59:00-05} + foo_1_prt_1 | c24_timetz | 0 | -0.12 | {01:59:00-05,02:59:00-05,03:59:00-05,04:59:00-05} | {0.09,0.09,0.09,0.09} | {00:59:00-05,05:59:00-05,07:59:00-05,09:59:00-05,11:59:00-05} + foo_1_prt_2 | c24_timetz | 0 | -0.9411765 | {12:56:00-05,12:57:00-05,12:58:00-05,12:59:00-05} | {0.029411765,0.029411765,0.029411765,0.029411765} | {12:00:00-05,12:00:14-05,12:00:29-05,12:00:44-05,12:00:59-05} + foo | c25_timestamp | 0 | -0.42261904 | {"Mon Jan 01 01:59:00 2018","Mon Jan 01 02:59:00 2018","Mon Jan 01 03:59:00 2018","Mon Jan 01 04:59:00 2018"} | {0.05357143,0.05357143,0.05357143,0.05357143} | {"Mon Jan 01 00:59:00 2018","Mon Jan 01 09:59:00 2018","Mon Jan 01 12:13:00 2018","Mon Jan 01 12:41:00 2018","Mon Jan 01 12:59:00 2018"} + foo_1_prt_1 | c25_timestamp | 0 | -0.12 | {"Mon Jan 01 01:59:00 2018","Mon Jan 01 02:59:00 2018","Mon Jan 01 03:59:00 2018","Mon Jan 01 04:59:00 2018"} | {0.09,0.09,0.09,0.09} | {"Mon Jan 01 00:59:00 2018","Mon Jan 01 05:59:00 2018","Mon Jan 01 07:59:00 2018","Mon Jan 01 09:59:00 2018","Mon Jan 01 11:59:00 2018"} + foo_1_prt_2 | c25_timestamp | 0 | -0.88235295 | {"Mon Jan 01 12:56:00 2018","Mon Jan 01 12:57:00 2018","Mon Jan 01 12:58:00 2018","Mon Jan 01 12:59:00 2018"} | {0.04411765,0.04411765,0.04411765,0.04411765} | {"Mon Jan 01 12:00:00 2018","Mon Jan 01 12:13:00 2018","Mon Jan 01 12:27:00 2018","Mon Jan 01 12:41:00 2018","Mon Jan 01 12:55:00 2018"} + foo | c26_timestamptz | 0 | -0.42261904 | {"Sun Dec 31 22:59:00 2017 PST","Sun Dec 31 23:59:00 2017 PST","Mon Jan 01 00:59:00 2018 PST","Mon Jan 01 01:59:00 2018 PST"} | {0.05357143,0.05357143,0.05357143,0.05357143} | {"Sun Dec 31 21:59:00 2017 PST","Mon Jan 01 06:59:00 2018 PST","Mon Jan 01 09:13:00 2018 PST","Mon Jan 01 09:41:00 2018 PST","Mon Jan 01 09:59:00 2018 PST"} + foo_1_prt_1 | c26_timestamptz | 0 | -0.12 | {"Sun Dec 31 22:59:00 2017 PST","Sun Dec 31 23:59:00 2017 PST","Mon Jan 01 00:59:00 2018 PST","Mon Jan 01 01:59:00 2018 PST"} | {0.09,0.09,0.09,0.09} | {"Sun Dec 31 21:59:00 2017 PST","Mon Jan 01 02:59:00 2018 PST","Mon Jan 01 04:59:00 2018 PST","Mon Jan 01 06:59:00 2018 PST","Mon Jan 01 08:59:00 2018 PST"} + foo_1_prt_2 | c26_timestamptz | 0 | -0.88235295 | {"Mon Jan 01 09:56:00 2018 PST","Mon Jan 01 09:57:00 2018 PST","Mon Jan 01 09:58:00 2018 PST","Mon Jan 01 09:59:00 2018 PST"} | {0.04411765,0.04411765,0.04411765,0.04411765} | {"Mon Jan 01 09:00:00 2018 PST","Mon Jan 01 09:13:00 2018 PST","Mon Jan 01 09:27:00 2018 PST","Mon Jan 01 09:41:00 2018 PST","Mon Jan 01 09:55:00 2018 PST"} + foo | c27_uuid | 0 | 10 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.11904762,0.11904762,0.11904762,0.11904762} | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111166,11111111-1111-1111-1111-111111111199} + foo_1_prt_1 | c27_uuid | 0 | 5 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.2,0.2,0.2,0.2} | + foo_1_prt_2 | c27_uuid | 0 | -0.14705883 | {11111111-1111-1111-1111-111111111166,11111111-1111-1111-1111-111111111177,11111111-1111-1111-1111-111111111188,11111111-1111-1111-1111-111111111199} | {0.11764706,0.11764706,0.11764706,0.11764706} | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155} + foo | c28_tsquery | 0 | -0.5952381 | {"'foo61' & 'rat61'","'foo64' & 'rat64'","'foo62' & 'rat62'","'foo63' & 'rat63'"} | {0.017857144,0.017857144,0.017857144,0.017857144} | {"'foo8' & 'rat8'","'foo90' & 'rat90'","'foo60' & 'rat60'","'foo32' & 'rat32'","'foo100' & 'rat100'"} + foo_1_prt_1 | c28_tsquery | 0 | -1 | | | {"'foo8' & 'rat8'","'foo35' & 'rat35'","'foo57' & 'rat57'","'foo36' & 'rat36'","'foo100' & 'rat100'"} + foo_1_prt_2 | c28_tsquery | 0 | -0.9411765 | {"'foo61' & 'rat61'","'foo64' & 'rat64'","'foo62' & 'rat62'","'foo63' & 'rat63'"} | {0.029411765,0.029411765,0.029411765,0.029411765} | {"'foo8' & 'rat8'","'foo14' & 'rat14'","'foo11' & 'rat11'","'foo47' & 'rat47'","'foo16' & 'rat16'"} + foo | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}"} | {0.17261904,0.17261904,0.16666667} | {"{a0,b0}","{a4,b4}","{a5,b5}"} + foo_1_prt_1 | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}","{a4,b4}"} | {0.17,0.17,0.17,0.17} | {"{a0,b0}","{a5,b5}"} + foo_1_prt_2 | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a0,b0}","{a3,b3}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{a4,b4}","{a5,b5}"} + foo | c30_intarray | 0 | -0.58928573 | {"{1,1}","{2,2}","{3,3}","{4,4}"} | {0.011904762,0.011904762,0.011904762,0.011904762} | {"{1,1}","{25,1}","{50,2}","{75,3}","{100,4}"} + foo_1_prt_1 | c30_intarray | 0 | -1 | | | {"{1,1}","{25,1}","{50,2}","{75,3}","{100,4}"} + foo_1_prt_2 | c30_intarray | 0 | -0.88235295 | {"{1,1}","{2,2}","{3,3}","{4,4}"} | {0.029411765,0.029411765,0.029411765,0.029411765} | {"{5,5}","{15,3}","{30,0}","{45,3}","{60,0}"} + foo | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17261904,0.17261904,0.16666667} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{4,5}","{5,0}"} + foo | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_1 | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_2 | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}"} | {0.17261904,0.17261904,0.16666667} | {"{0000000000,0000000001}","{0000000100,0000000101}","{0000000101,0000000000}"} + foo_1_prt_1 | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}","{0000000100,0000000101}"} | {0.17,0.17,0.17,0.17} | {"{0000000000,0000000001}","{0000000101,0000000000}"} + foo_1_prt_2 | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000000,0000000001}","{0000000011,0000000100}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{0000000100,0000000101}","{0000000101,0000000000}"} + foo | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_1 | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_2 | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_1 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_2 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}"} | {0.17261904,0.17261904,0.16666667} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.4/32,192.168.101.4/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_1 | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}","{192.168.100.4/32,192.168.101.4/32}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_2 | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.0/32,192.168.101.0/32}","{192.168.100.3/32,192.168.101.3/32}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{192.168.100.4/32,192.168.101.4/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}"} | {0.17261904,0.17261904,0.16666667} | {"{01-01-2018,01-01-2018}","{01-05-2018,01-05-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_1 | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}","{01-05-2018,01-05-2018}"} | {0.17,0.17,0.17,0.17} | {"{01-01-2018,01-01-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_2 | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-01-2018,01-01-2018}","{01-04-2018,01-04-2018}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{01-05-2018,01-05-2018}","{01-06-2018,01-06-2018}"} + foo | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17261904,0.17261904,0.16666667} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{4,5}","{5,0}"} + foo | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17261904,0.17261904,0.16666667} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{4,5}","{5,0}"} + foo | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}"} | {0.17261904,0.17261904,0.16666667} | {"{192.168.100.0,192.168.100.1}","{192.168.100.4,192.168.100.5}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_1 | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}","{192.168.100.4,192.168.100.5}"} | {0.17,0.17,0.17,0.17} | {"{192.168.100.0,192.168.100.1}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_2 | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.0,192.168.100.1}","{192.168.100.3,192.168.100.4}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{192.168.100.4,192.168.100.5}","{192.168.100.5,192.168.100.0}"} + foo | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17261904,0.17261904,0.16666667} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{4,5}","{5,0}"} + foo | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_1 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_2 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}"} | {0.17261904,0.17261904,0.16666667} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:04,08:00:2b:01:02:04}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_1 | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}","{08:00:2b:01:02:04,08:00:2b:01:02:04}"} | {0.17,0.17,0.17,0.17} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_2 | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:03,08:00:2b:01:02:03}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{08:00:2b:01:02:04,08:00:2b:01:02:04}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_1 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_2 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17261904,0.17261904,0.16666667} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{4,5}","{5,0}"} + foo | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17261904,0.17261904,0.16666667} | {"{0,1}","{4,5}","{5,0}"} + foo_1_prt_1 | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.17,0.17,0.17,0.17} | {"{0,1}","{5,0}"} + foo_1_prt_2 | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{0,1}","{3,4}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{4,5}","{5,0}"} + foo | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}"} | {0.17261904,0.17261904,0.16666667} | {"{abcd0,def1}","{abcd4,def5}","{abcd5,def0}"} + foo_1_prt_1 | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}","{abcd4,def5}"} | {0.17,0.17,0.17,0.17} | {"{abcd0,def1}","{abcd5,def0}"} + foo_1_prt_2 | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd0,def1}","{abcd3,def4}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{abcd4,def5}","{abcd5,def0}"} + foo | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}"} | {0.17261904,0.17261904,0.16666667} | {"{00:00:00,01:00:00}","{04:00:00,05:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_1 | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}","{04:00:00,05:00:00}"} | {0.17,0.17,0.17,0.17} | {"{00:00:00,01:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_2 | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{00:00:00,01:00:00}","{03:00:00,04:00:00}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{04:00:00,05:00:00}","{05:00:00,00:00:00}"} + foo | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}"} | {0.17261904,0.17261904,0.16666667} | {"{00:00:59-08,01:00:59-05}","{04:00:59-08,05:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_1 | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}","{04:00:59-08,05:00:59-05}"} | {0.17,0.17,0.17,0.17} | {"{00:00:59-08,01:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_2 | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{00:00:59-08,01:00:59-05}","{03:00:59-08,04:00:59-05}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{04:00:59-08,05:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}"} | {0.17261904,0.17261904,0.16666667} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_1 | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_2 | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}"} | {0.17261904,0.17261904,0.16666667} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_1 | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}"} | {0.17,0.17,0.17,0.17} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_2 | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}"} | {0.17261904,0.17261904,0.16666667} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_1 | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}"} | {0.17,0.17,0.17,0.17} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_2 | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo | c54_tsqueryarray | 0 | 6 | {"{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}","{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}"} | {0.17261904,0.17261904,0.16666667,0.16666667} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo_1_prt_1 | c54_tsqueryarray | 0 | 6 | {"{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}"} | {0.17,0.17,0.17,0.17} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo_1_prt_2 | c54_tsqueryarray | 0 | 6 | {"{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}","{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}"} + foo | c55_jsonarray | 0 | 0 | | | + foo_1_prt_1 | c55_jsonarray | 0 | 0 | | | + foo_1_prt_2 | c55_jsonarray | 0 | 0 | | | + foo | c57_pointarray | 0 | 0 | | | + foo_1_prt_1 | c57_pointarray | 0 | 0 | | | + foo_1_prt_2 | c57_pointarray | 0 | 0 | | | + foo | c58_linesegarray | 0 | 0 | | | + foo_1_prt_1 | c58_linesegarray | 0 | 0 | | | + foo_1_prt_2 | c58_linesegarray | 0 | 0 | | | + foo | c59_patharray | 0 | 0 | | | + foo_1_prt_1 | c59_patharray | 0 | 0 | | | + foo_1_prt_2 | c59_patharray | 0 | 0 | | | + foo | c60_boxarray | 0 | 0 | | | + foo_1_prt_1 | c60_boxarray | 0 | 0 | | | + foo_1_prt_2 | c60_boxarray | 0 | 0 | | | + foo | c61_polygonarray | 0 | 0 | | | + foo_1_prt_1 | c61_polygonarray | 0 | 0 | | | + foo_1_prt_2 | c61_polygonarray | 0 | 0 | | | + foo | c62_circlearray | 0 | 0 | | | + foo_1_prt_1 | c62_circlearray | 0 | 0 | | | + foo_1_prt_2 | c62_circlearray | 0 | 0 | | | + foo | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}"} | {0.17261904,0.17261904,0.16666667} | {"{\"(0,1)\",\"(0,1)\"}","{\"(4,5)\",\"(4,5)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_1 | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}","{\"(4,5)\",\"(4,5)\"}"} | {0.17,0.17,0.17,0.17} | {"{\"(0,1)\",\"(0,1)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_2 | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(0,1)\",\"(0,1)\"}","{\"(3,4)\",\"(3,4)\"}"} | {0.1764706,0.1764706,0.16176471,0.16176471} | {"{\"(4,5)\",\"(4,5)\"}","{\"(5,0)\",\"(5,0)\"}"} +(180 rows) + +-- Case 5: A partition has MCVs but after merge, those MCVs qualify as global +-- MCVs for the root +TRUNCATE foo; +INSERT INTO foo +SELECT +i, +i%3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i%128))::cidr, +('2018-'||(i%12)+1||'-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +('12:'||(i%60)::text||':'||(i%30)::text)::time, +('12:'||(i%60)::text||':'||(i%30)::text||' EST')::timetz, +('2018-01-01 '||'12:'||(i%60)::text||':'||(i%30)::text)::timestamp, +('2018-01-01 '||'12:'||(i%60)::text||':'||(i%30)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5)::text||(i%5)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,60) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i%4+61::bigint, +i%4+61, +(i%4+61)::bit, +(i%4+61)::bit(10)::bit varying(10), +(i%4+61)::bool, +(i%4+61)::char, +('a'||(i%4+61))::varchar(10), +('192.168.100.'||(i%4+61))::cidr, +('2018-5-'||(i%4)+16)::date, +(i%4+61)::numeric(8,2), +(i%4+61)::float8, +inet ('192.168.100.'||(i%4+61)), +i%4+61::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%4+61)::text)::text::macaddr, +(i%4+61)::text::money, +(i%4+61)::float4, +i%4+61, +i%4+61, +'aa'||(i%4+61)::text, +('01:00:'||(i%4)::text)::time, +('01:00:'||(i%4)::text||' EST')::timetz, +('2018-01-01 '||'01:00:'||(i%4)::text)::timestamp, +('2018-01-01 '||'01:00:'||(i%4)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%4+6)::text||(i%4+6)::text)::uuid, +('foo'||(i%4+61)::text||' & rat'||(i%4+61)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,8) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i))::cidr, +('2018-'||(i%12)+1||'-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +('12:'||(i%60)::text||':'||(i%30)::text)::time, +('12:'||(i%60)::text||':'||(i%30)::text||' EST')::timetz, +('2018-01-01 '||'12:'||(i%60)::text||':'||(i%30)::text)::timestamp, +('2018-01-01 '||'12:'||(i%60)::text||':'||(i%30)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%10)::text||(i%10)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,10) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' and attname != 'a' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------------------------------+-----------+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + foo | b | 0 | 6 | {0,1,2} | {0.25641027,0.25641027,0.25641027} | {3,4,5} + foo_1_prt_1 | b | 0 | 3 | {0,1,2} | {0.33333334,0.33333334,0.33333334} | + foo_1_prt_2 | b | 0 | -0.16666667 | {4,5,3} | {0.3888889,0.33333334,0.2777778} | + foo | c03_bigint | 0 | -0.8076923 | {61,62,63,64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {1,15,30,45,60} + foo_1_prt_1 | c03_bigint | 0 | -1 | | | {1,15,30,45,60} + foo_1_prt_2 | c03_bigint | 0 | -0.7777778 | {61,62,63,64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {1,3,5,7,10} + foo | c04_bigserial | 0 | -0.8076923 | {61,62,63,64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {1,15,30,45,60} + foo_1_prt_1 | c04_bigserial | 0 | -1 | | | {1,15,30,45,60} + foo_1_prt_2 | c04_bigserial | 0 | -0.7777778 | {61,62,63,64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {1,3,5,7,10} + foo | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_1 | c05_bit | 0 | 2 | {0,1} | {0.5,0.5} | + foo_1_prt_2 | c05_bit | 0 | -0.11111111 | {0,1} | {0.5,0.5} | + foo | c06_bit_varying_10 | 0 | -0.8076923 | {0000111101,0000111110,0000111111,0001000000} | {0.025641026,0.025641026,0.025641026,0.025641026} | {0000000001,0000001111,0000011110,0000101101,0000111100} + foo_1_prt_1 | c06_bit_varying_10 | 0 | -1 | | | {0000000001,0000001111,0000011110,0000101101,0000111100} + foo_1_prt_2 | c06_bit_varying_10 | 0 | -0.7777778 | {0000111101,0000111110,0000111111,0001000000} | {0.11111111,0.11111111,0.11111111,0.11111111} | {0000000001,0000000011,0000000101,0000000111,0000001010} + foo | c07_bool | 0 | 1 | {t} | {1} | + foo_1_prt_1 | c07_bool | 0 | 1 | {t} | {1} | + foo_1_prt_2 | c07_bool | 0 | 1 | {t} | {1} | + foo | c08_char | 0 | -0.115384616 | {1,2,3,4} | {0.16666667,0.14102565,0.14102565,0.14102565} | {2,5,6,9} + foo_1_prt_1 | c08_char | 0 | -0.15 | {1,2,3,4} | {0.18333334,0.18333334,0.18333334,0.18333334} | {5,5,5,6,9} + foo_1_prt_2 | c08_char | 0 | -0.5 | {6,1} | {0.5,0.11111111} | {2,3,5,7,9} + foo | c09_varchar_10 | 0 | -0.8076923 | {a61,a62,a63,a64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {a1,a22,a4,a6,a9} + foo_1_prt_1 | c09_varchar_10 | 0 | -1 | | | {a1,a22,a36,a5,a9} + foo_1_prt_2 | c09_varchar_10 | 0 | -0.7777778 | {a61,a62,a63,a64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {a1,a2,a4,a6,a9} + foo | c10_cidr | 0 | -0.8076923 | {192.168.100.61/32,192.168.100.62/32,192.168.100.63/32,192.168.100.64/32} | {0.025641026,0.025641026,0.025641026,0.025641026} | {192.168.100.1/32,192.168.100.15/32,192.168.100.30/32,192.168.100.45/32,192.168.100.60/32} + foo_1_prt_1 | c10_cidr | 0 | -1 | | | {192.168.100.1/32,192.168.100.15/32,192.168.100.30/32,192.168.100.45/32,192.168.100.60/32} + foo_1_prt_2 | c10_cidr | 0 | -0.7777778 | {192.168.100.61/32,192.168.100.62/32,192.168.100.63/32,192.168.100.64/32} | {0.11111111,0.11111111,0.11111111,0.11111111} | {192.168.100.1/32,192.168.100.3/32,192.168.100.5/32,192.168.100.7/32,192.168.100.10/32} + foo | c11_date | 0 | -0.8076923 | {05-16-2018,05-17-2018,05-18-2018,05-19-2018} | {0.025641026,0.025641026,0.025641026,0.025641026} | {01-01-2018,04-04-2018,06-15-2018,09-15-2018,12-15-2018} + foo_1_prt_1 | c11_date | 0 | -1 | | | {01-01-2018,03-15-2018,06-15-2018,09-15-2018,12-15-2018} + foo_1_prt_2 | c11_date | 0 | -0.7777778 | {05-16-2018,05-17-2018,05-18-2018,05-19-2018} | {0.11111111,0.11111111,0.11111111,0.11111111} | {02-02-2018,04-04-2018,06-06-2018,08-08-2018,11-11-2018} + foo | c12_numeric_8_2 | 0 | -0.8076923 | {61.00,62.00,63.00,64.00} | {0.025641026,0.025641026,0.025641026,0.025641026} | {1.00,15.00,30.00,45.00,60.00} + foo_1_prt_1 | c12_numeric_8_2 | 0 | -1 | | | {1.00,15.00,30.00,45.00,60.00} + foo_1_prt_2 | c12_numeric_8_2 | 0 | -0.7777778 | {61.00,62.00,63.00,64.00} | {0.11111111,0.11111111,0.11111111,0.11111111} | {1.00,3.00,5.00,7.00,10.00} + foo | c13_float8 | 0 | -0.8076923 | {61,62,63,64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {1,15,30,45,60} + foo_1_prt_1 | c13_float8 | 0 | -1 | | | {1,15,30,45,60} + foo_1_prt_2 | c13_float8 | 0 | -0.7777778 | {61,62,63,64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {1,3,5,7,10} + foo | c14_inet | 0 | -0.8076923 | {192.168.100.61,192.168.100.62,192.168.100.63,192.168.100.64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {192.168.100.1,192.168.100.15,192.168.100.30,192.168.100.45,192.168.100.60} + foo_1_prt_1 | c14_inet | 0 | -1 | | | {192.168.100.1,192.168.100.15,192.168.100.30,192.168.100.45,192.168.100.60} + foo_1_prt_2 | c14_inet | 0 | -0.7777778 | {192.168.100.61,192.168.100.62,192.168.100.63,192.168.100.64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {192.168.100.1,192.168.100.3,192.168.100.5,192.168.100.7,192.168.100.10} + foo | c15_int4 | 0 | -0.8076923 | {61,62,63,64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {1,15,30,45,60} + foo_1_prt_1 | c15_int4 | 0 | -1 | | | {1,15,30,45,60} + foo_1_prt_2 | c15_int4 | 0 | -0.7777778 | {61,62,63,64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {1,3,5,7,10} + foo | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_1 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo_1_prt_2 | c16_interval | 0 | 1 | {"@ 24 hours"} | {1} | + foo | c17_macaddr | 0 | -0.67948717 | {12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03,12:34:56:78:90:04} | {0.025641026,0.025641026,0.025641026,0.025641026} | {12:34:56:78:90:00,12:34:56:78:90:10,12:34:56:78:90:23,12:34:56:78:90:49,12:34:56:78:90:64} + foo_1_prt_1 | c17_macaddr | 0 | -0.8333333 | {12:34:56:78:90:01,12:34:56:78:90:02,12:34:56:78:90:03,12:34:56:78:90:04} | {0.033333335,0.033333335,0.033333335,0.033333335} | {12:34:56:78:90:00,12:34:56:78:90:10,12:34:56:78:90:23,12:34:56:78:90:36,12:34:56:78:90:49} + foo_1_prt_2 | c17_macaddr | 0 | -0.7777778 | {12:34:56:78:90:61,12:34:56:78:90:62,12:34:56:78:90:63,12:34:56:78:90:64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {12:34:56:78:90:01,12:34:56:78:90:03,12:34:56:78:90:05,12:34:56:78:90:07,12:34:56:78:90:10} + foo | c18_money | 0 | -0.8076923 | {$61.00,$62.00,$63.00,$64.00} | {0.025641026,0.025641026,0.025641026,0.025641026} | {$1.00,$15.00,$30.00,$45.00,$60.00} + foo_1_prt_1 | c18_money | 0 | -1 | | | {$1.00,$15.00,$30.00,$45.00,$60.00} + foo_1_prt_2 | c18_money | 0 | -0.7777778 | {$61.00,$62.00,$63.00,$64.00} | {0.11111111,0.11111111,0.11111111,0.11111111} | {$1.00,$3.00,$5.00,$7.00,$10.00} + foo | c19_float4 | 0 | -0.8076923 | {61,62,63,64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {1,15,30,45,60} + foo_1_prt_1 | c19_float4 | 0 | -1 | | | {1,15,30,45,60} + foo_1_prt_2 | c19_float4 | 0 | -0.7777778 | {61,62,63,64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {1,3,5,7,10} + foo | c20_serial4 | 0 | -0.8076923 | {61,62,63,64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {1,15,30,45,60} + foo_1_prt_1 | c20_serial4 | 0 | -1 | | | {1,15,30,45,60} + foo_1_prt_2 | c20_serial4 | 0 | -0.7777778 | {61,62,63,64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {1,3,5,7,10} + foo | c21_smallint | 0 | -0.7948718 | {61,62,63,64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {1,15,30,45,60} + foo_1_prt_1 | c21_smallint | 0 | -1 | | | {1,15,30,45,60} + foo_1_prt_2 | c21_smallint | 0 | -0.7777778 | {61,62,63,64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {1,3,5,7,10} + foo | c22_text | 0 | -0.8076923 | {aa61,aa62,aa63,aa64} | {0.025641026,0.025641026,0.025641026,0.025641026} | {aa1,aa22,aa4,aa6,aa9} + foo_1_prt_1 | c22_text | 0 | -1 | | | {aa1,aa22,aa36,aa5,aa9} + foo_1_prt_2 | c22_text | 0 | -0.7777778 | {aa61,aa62,aa63,aa64} | {0.11111111,0.11111111,0.11111111,0.11111111} | {aa1,aa2,aa4,aa6,aa9} + foo | c23_time | 0 | -0.8076923 | {01:00:00,01:00:01,01:00:02,01:00:03} | {0.025641026,0.025641026,0.025641026,0.025641026} | {12:00:00,12:14:14,12:29:29,12:44:14,12:59:29} + foo_1_prt_1 | c23_time | 0 | -1 | | | {12:00:00,12:14:14,12:29:29,12:44:14,12:59:29} + foo_1_prt_2 | c23_time | 0 | -0.7777778 | {01:00:00,01:00:01,01:00:02,01:00:03} | {0.11111111,0.11111111,0.11111111,0.11111111} | {12:01:01,12:03:03,12:05:05,12:07:07,12:10:10} + foo | c24_timetz | 0 | -0.8076923 | {01:00:00-05,01:00:01-05,01:00:02-05,01:00:03-05} | {0.025641026,0.025641026,0.025641026,0.025641026} | {12:00:00-05,12:14:14-05,12:29:29-05,12:44:14-05,12:59:29-05} + foo_1_prt_1 | c24_timetz | 0 | -1 | | | {12:00:00-05,12:14:14-05,12:29:29-05,12:44:14-05,12:59:29-05} + foo_1_prt_2 | c24_timetz | 0 | -0.7777778 | {01:00:00-05,01:00:01-05,01:00:02-05,01:00:03-05} | {0.11111111,0.11111111,0.11111111,0.11111111} | {12:01:01-05,12:03:03-05,12:05:05-05,12:07:07-05,12:10:10-05} + foo | c25_timestamp | 0 | -0.8076923 | {"Mon Jan 01 01:00:00 2018","Mon Jan 01 01:00:01 2018","Mon Jan 01 01:00:02 2018","Mon Jan 01 01:00:03 2018"} | {0.025641026,0.025641026,0.025641026,0.025641026} | {"Mon Jan 01 12:00:00 2018","Mon Jan 01 12:14:14 2018","Mon Jan 01 12:29:29 2018","Mon Jan 01 12:44:14 2018","Mon Jan 01 12:59:29 2018"} + foo_1_prt_1 | c25_timestamp | 0 | -1 | | | {"Mon Jan 01 12:00:00 2018","Mon Jan 01 12:14:14 2018","Mon Jan 01 12:29:29 2018","Mon Jan 01 12:44:14 2018","Mon Jan 01 12:59:29 2018"} + foo_1_prt_2 | c25_timestamp | 0 | -0.7777778 | {"Mon Jan 01 01:00:00 2018","Mon Jan 01 01:00:01 2018","Mon Jan 01 01:00:02 2018","Mon Jan 01 01:00:03 2018"} | {0.11111111,0.11111111,0.11111111,0.11111111} | {"Mon Jan 01 12:01:01 2018","Mon Jan 01 12:03:03 2018","Mon Jan 01 12:05:05 2018","Mon Jan 01 12:07:07 2018","Mon Jan 01 12:10:10 2018"} + foo | c26_timestamptz | 0 | -0.8076923 | {"Sun Dec 31 22:00:00 2017 PST","Sun Dec 31 22:00:01 2017 PST","Sun Dec 31 22:00:02 2017 PST","Sun Dec 31 22:00:03 2017 PST"} | {0.025641026,0.025641026,0.025641026,0.025641026} | {"Mon Jan 01 09:00:00 2018 PST","Mon Jan 01 09:14:14 2018 PST","Mon Jan 01 09:29:29 2018 PST","Mon Jan 01 09:44:14 2018 PST","Mon Jan 01 09:59:29 2018 PST"} + foo_1_prt_1 | c26_timestamptz | 0 | -1 | | | {"Mon Jan 01 09:00:00 2018 PST","Mon Jan 01 09:14:14 2018 PST","Mon Jan 01 09:29:29 2018 PST","Mon Jan 01 09:44:14 2018 PST","Mon Jan 01 09:59:29 2018 PST"} + foo_1_prt_2 | c26_timestamptz | 0 | -0.7777778 | {"Sun Dec 31 22:00:00 2017 PST","Sun Dec 31 22:00:01 2017 PST","Sun Dec 31 22:00:02 2017 PST","Sun Dec 31 22:00:03 2017 PST"} | {0.11111111,0.11111111,0.11111111,0.11111111} | {"Mon Jan 01 09:01:01 2018 PST","Mon Jan 01 09:03:03 2018 PST","Mon Jan 01 09:05:05 2018 PST","Mon Jan 01 09:07:07 2018 PST","Mon Jan 01 09:10:10 2018 PST"} + foo | c27_uuid | 0 | -0.115384616 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.15384616,0.15384616,0.15384616,0.15384616} | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111166,11111111-1111-1111-1111-111111111188,11111111-1111-1111-1111-111111111199} + foo_1_prt_1 | c27_uuid | 0 | 5 | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133} | {0.2,0.2,0.2,0.2} | + foo_1_prt_2 | c27_uuid | 0 | -0.5555556 | {11111111-1111-1111-1111-111111111166,11111111-1111-1111-1111-111111111177,11111111-1111-1111-1111-111111111188,11111111-1111-1111-1111-111111111199} | {0.16666667,0.16666667,0.16666667,0.16666667} | {11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111155} + foo | c28_tsquery | 0 | -0.82051283 | {"'foo8' & 'rat8'","'foo4' & 'rat4'","'foo9' & 'rat9'","'foo1' & 'rat1'"} | {0.025641026,0.025641026,0.025641026,0.025641026} | {"'foo5' & 'rat5'","'foo14' & 'rat14'","'foo64' & 'rat64'","'foo55' & 'rat55'","'foo63' & 'rat63'"} + foo_1_prt_1 | c28_tsquery | 0 | -1 | | | {"'foo8' & 'rat8'","'foo14' & 'rat14'","'foo11' & 'rat11'","'foo47' & 'rat47'","'foo16' & 'rat16'"} + foo_1_prt_2 | c28_tsquery | 0 | -0.7777778 | {"'foo61' & 'rat61'","'foo64' & 'rat64'","'foo62' & 'rat62'","'foo63' & 'rat63'"} | {0.11111111,0.11111111,0.11111111,0.11111111} | {"'foo8' & 'rat8'","'foo9' & 'rat9'","'foo5' & 'rat5'","'foo3' & 'rat3'","'foo10' & 'rat10'"} + foo | c29_varchararray | 0 | 6 | {"{a1,b1}","{a2,b2}","{a3,b3}"} | {0.17948718,0.17948718,0.16666667} | {"{a0,b0}","{a5,b5}"} + foo_1_prt_1 | c29_varchararray | 0 | 6 | {"{a0,b0}","{a1,b1}","{a2,b2}","{a3,b3}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{a4,b4}","{a5,b5}"} + foo_1_prt_2 | c29_varchararray | 0 | -0.33333334 | {"{a1,b1}","{a2,b2}","{a3,b3}","{a4,b4}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{a0,b0}","{a5,b5}"} + foo | c30_intarray | 0 | -0.75641024 | {"{1,1}","{2,2}","{3,3}","{4,4}"} | {0.025641026,0.025641026,0.025641026,0.025641026} | {"{1,1}","{15,3}","{30,0}","{45,3}","{60,0}"} + foo_1_prt_1 | c30_intarray | 0 | -1 | | | {"{1,1}","{15,3}","{30,0}","{45,3}","{60,0}"} + foo_1_prt_2 | c30_intarray | 0 | -0.5555556 | {"{1,1}","{2,2}","{3,3}","{4,4}"} | {0.11111111,0.11111111,0.11111111,0.11111111} | {"{5,5}","{6,0}","{7,1}","{8,2}","{10,4}"} + foo | c31_bigintarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17948718,0.17948718,0.16666667} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c31_bigintarray | 0 | 6 | {"{0,1}","{1,2}","{2,3}","{3,4}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{4,5}","{5,0}"} + foo_1_prt_2 | c31_bigintarray | 0 | -0.33333334 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{0,1}","{5,0}"} + foo | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_1 | c33_bitarray | 0 | 2 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo_1_prt_2 | c33_bitarray | 0 | -0.11111111 | {"{0,1}","{1,0}"} | {0.5,0.5} | + foo | c34_bitvaryingarray | 0 | 6 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}"} | {0.17948718,0.17948718,0.16666667} | {"{0000000000,0000000001}","{0000000101,0000000000}"} + foo_1_prt_1 | c34_bitvaryingarray | 0 | 6 | {"{0000000000,0000000001}","{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{0000000100,0000000101}","{0000000101,0000000000}"} + foo_1_prt_2 | c34_bitvaryingarray | 0 | -0.33333334 | {"{0000000001,0000000010}","{0000000010,0000000011}","{0000000011,0000000100}","{0000000100,0000000101}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{0000000000,0000000001}","{0000000101,0000000000}"} + foo | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_1 | c35_boolarray | 0 | 2 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo_1_prt_2 | c35_boolarray | 0 | -0.11111111 | {"{f,t}","{t,f}"} | {0.5,0.5} | + foo | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_1 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo_1_prt_2 | c36_chararray | 0 | 1 | {"{a,b}"} | {1} | + foo | c37_cidrarray | 0 | 6 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}"} | {0.17948718,0.17948718,0.16666667} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_1 | c37_cidrarray | 0 | 6 | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{192.168.100.4/32,192.168.101.4/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo_1_prt_2 | c37_cidrarray | 0 | -0.33333334 | {"{192.168.100.1/32,192.168.101.1/32}","{192.168.100.2/32,192.168.101.2/32}","{192.168.100.3/32,192.168.101.3/32}","{192.168.100.4/32,192.168.101.4/32}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{192.168.100.0/32,192.168.101.0/32}","{192.168.100.5/32,192.168.101.5/32}"} + foo | c38_datearray | 0 | 6 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}"} | {0.17948718,0.17948718,0.16666667} | {"{01-01-2018,01-01-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_1 | c38_datearray | 0 | 6 | {"{01-01-2018,01-01-2018}","{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{01-05-2018,01-05-2018}","{01-06-2018,01-06-2018}"} + foo_1_prt_2 | c38_datearray | 0 | -0.33333334 | {"{01-02-2018,01-02-2018}","{01-03-2018,01-03-2018}","{01-04-2018,01-04-2018}","{01-05-2018,01-05-2018}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{01-01-2018,01-01-2018}","{01-06-2018,01-06-2018}"} + foo | c39_numericarray | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17948718,0.17948718,0.16666667} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c39_numericarray | 0 | 6 | {"{0,1}","{1,2}","{2,3}","{3,4}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{4,5}","{5,0}"} + foo_1_prt_2 | c39_numericarray | 0 | -0.33333334 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{0,1}","{5,0}"} + foo | c40_float8array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17948718,0.17948718,0.16666667} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c40_float8array | 0 | 6 | {"{0,1}","{1,2}","{2,3}","{3,4}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{4,5}","{5,0}"} + foo_1_prt_2 | c40_float8array | 0 | -0.33333334 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{0,1}","{5,0}"} + foo | c41_inetarray | 0 | 6 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}"} | {0.17948718,0.17948718,0.16666667} | {"{192.168.100.0,192.168.100.1}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_1 | c41_inetarray | 0 | 6 | {"{192.168.100.0,192.168.100.1}","{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{192.168.100.4,192.168.100.5}","{192.168.100.5,192.168.100.0}"} + foo_1_prt_2 | c41_inetarray | 0 | -0.33333334 | {"{192.168.100.1,192.168.100.2}","{192.168.100.2,192.168.100.3}","{192.168.100.3,192.168.100.4}","{192.168.100.4,192.168.100.5}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{192.168.100.0,192.168.100.1}","{192.168.100.5,192.168.100.0}"} + foo | c42_int4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17948718,0.17948718,0.16666667} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c42_int4array | 0 | 6 | {"{0,1}","{1,2}","{2,3}","{3,4}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{4,5}","{5,0}"} + foo_1_prt_2 | c42_int4array | 0 | -0.33333334 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{0,1}","{5,0}"} + foo | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_1 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo_1_prt_2 | c43_intervalarray | 0 | 1 | {"{\"@ 1 hour\",\"@ 1 hour\"}"} | {1} | + foo | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}"} | {0.17948718,0.17948718,0.16666667} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_1 | c44_macaddrarray | 0 | 6 | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{08:00:2b:01:02:04,08:00:2b:01:02:04}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo_1_prt_2 | c44_macaddrarray | 0 | -0.33333334 | {"{08:00:2b:01:02:01,08:00:2b:01:02:01}","{08:00:2b:01:02:02,08:00:2b:01:02:02}","{08:00:2b:01:02:03,08:00:2b:01:02:03}","{08:00:2b:01:02:04,08:00:2b:01:02:04}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{08:00:2b:01:02:00,08:00:2b:01:02:00}","{08:00:2b:01:02:05,08:00:2b:01:02:05}"} + foo | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_1 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo_1_prt_2 | c45_moneyarray | 0 | 1 | {"{$123.40,$234.50}"} | {1} | + foo | c46_float4array | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17948718,0.17948718,0.16666667} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c46_float4array | 0 | 6 | {"{0,1}","{1,2}","{2,3}","{3,4}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{4,5}","{5,0}"} + foo_1_prt_2 | c46_float4array | 0 | -0.33333334 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{0,1}","{5,0}"} + foo | c47_smallintarrayn | 0 | 6 | {"{1,2}","{2,3}","{3,4}"} | {0.17948718,0.17948718,0.16666667} | {"{0,1}","{5,0}"} + foo_1_prt_1 | c47_smallintarrayn | 0 | 6 | {"{0,1}","{1,2}","{2,3}","{3,4}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{4,5}","{5,0}"} + foo_1_prt_2 | c47_smallintarrayn | 0 | -0.33333334 | {"{1,2}","{2,3}","{3,4}","{4,5}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{0,1}","{5,0}"} + foo | c48_textarray | 0 | 6 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}"} | {0.17948718,0.17948718,0.16666667} | {"{abcd0,def1}","{abcd5,def0}"} + foo_1_prt_1 | c48_textarray | 0 | 6 | {"{abcd0,def1}","{abcd1,def2}","{abcd2,def3}","{abcd3,def4}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{abcd4,def5}","{abcd5,def0}"} + foo_1_prt_2 | c48_textarray | 0 | -0.33333334 | {"{abcd1,def2}","{abcd2,def3}","{abcd3,def4}","{abcd4,def5}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{abcd0,def1}","{abcd5,def0}"} + foo | c49_timearray | 0 | 6 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}"} | {0.17948718,0.17948718,0.16666667} | {"{00:00:00,01:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_1 | c49_timearray | 0 | 6 | {"{00:00:00,01:00:00}","{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{04:00:00,05:00:00}","{05:00:00,00:00:00}"} + foo_1_prt_2 | c49_timearray | 0 | -0.33333334 | {"{01:00:00,02:00:00}","{02:00:00,03:00:00}","{03:00:00,04:00:00}","{04:00:00,05:00:00}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{00:00:00,01:00:00}","{05:00:00,00:00:00}"} + foo | c50_timetzarray | 0 | 6 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}"} | {0.17948718,0.17948718,0.16666667} | {"{00:00:59-08,01:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_1 | c50_timetzarray | 0 | 6 | {"{00:00:59-08,01:00:59-05}","{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{04:00:59-08,05:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo_1_prt_2 | c50_timetzarray | 0 | -0.33333334 | {"{01:00:59-08,02:00:59-05}","{02:00:59-08,03:00:59-05}","{03:00:59-08,04:00:59-05}","{04:00:59-08,05:00:59-05}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{00:00:59-08,01:00:59-05}","{05:00:59-08,00:00:59-05}"} + foo | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}"} | {0.17948718,0.17948718,0.16666667} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_1 | c51_timestamparray | 0 | 6 | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo_1_prt_2 | c51_timestamparray | 0 | -0.33333334 | {"{\"Mon Jan 01 01:59:00 2018\",\"Mon Jan 01 02:59:00 2018\"}","{\"Mon Jan 01 02:59:00 2018\",\"Mon Jan 01 03:59:00 2018\"}","{\"Mon Jan 01 03:59:00 2018\",\"Mon Jan 01 04:59:00 2018\"}","{\"Mon Jan 01 04:59:00 2018\",\"Mon Jan 01 05:59:00 2018\"}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{\"Mon Jan 01 00:59:00 2018\",\"Mon Jan 01 01:59:00 2018\"}","{\"Mon Jan 01 05:59:00 2018\",\"Mon Jan 01 00:59:00 2018\"}"} + foo | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}"} | {0.17948718,0.17948718,0.16666667} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_1 | c52_timestamptzarray | 0 | 6 | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo_1_prt_2 | c52_timestamptzarray | 0 | -0.33333334 | {"{\"Mon Jan 01 01:59:00 2018 PST\",\"Sun Dec 31 23:59:00 2017 PST\"}","{\"Mon Jan 01 02:59:00 2018 PST\",\"Mon Jan 01 00:59:00 2018 PST\"}","{\"Mon Jan 01 03:59:00 2018 PST\",\"Mon Jan 01 01:59:00 2018 PST\"}","{\"Mon Jan 01 04:59:00 2018 PST\",\"Mon Jan 01 02:59:00 2018 PST\"}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{\"Mon Jan 01 00:59:00 2018 PST\",\"Sun Dec 31 22:59:00 2017 PST\"}","{\"Mon Jan 01 05:59:00 2018 PST\",\"Sun Dec 31 21:59:00 2017 PST\"}"} + foo | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}"} | {0.17948718,0.17948718,0.16666667} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_1 | c53_uuidzarray | 0 | 6 | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo_1_prt_2 | c53_uuidzarray | 0 | -0.33333334 | {"{11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111122}","{11111111-1111-1111-1111-111111111122,11111111-1111-1111-1111-111111111133}","{11111111-1111-1111-1111-111111111133,11111111-1111-1111-1111-111111111144}","{11111111-1111-1111-1111-111111111144,11111111-1111-1111-1111-111111111155}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{11111111-1111-1111-1111-111111111100,11111111-1111-1111-1111-111111111111}","{11111111-1111-1111-1111-111111111155,11111111-1111-1111-1111-111111111100}"} + foo | c54_tsqueryarray | 0 | 6 | {"{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}","{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}"} | {0.17948718,0.17948718,0.16666667,0.16666667} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo_1_prt_1 | c54_tsqueryarray | 0 | 6 | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}","{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}"} + foo_1_prt_2 | c54_tsqueryarray | 0 | -0.33333334 | {"{\"'foo1' & 'rat'\",\"'rat1' & 'foo'\"}","{\"'foo2' & 'rat'\",\"'rat2' & 'foo'\"}","{\"'foo4' & 'rat'\",\"'rat4' & 'foo'\"}","{\"'foo3' & 'rat'\",\"'rat3' & 'foo'\"}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{\"'foo0' & 'rat'\",\"'rat0' & 'foo'\"}","{\"'foo5' & 'rat'\",\"'rat5' & 'foo'\"}"} + foo | c55_jsonarray | 0 | 0 | | | + foo_1_prt_1 | c55_jsonarray | 0 | 0 | | | + foo_1_prt_2 | c55_jsonarray | 0 | 0 | | | + foo | c57_pointarray | 0 | 0 | | | + foo_1_prt_1 | c57_pointarray | 0 | 0 | | | + foo_1_prt_2 | c57_pointarray | 0 | 0 | | | + foo | c58_linesegarray | 0 | 0 | | | + foo_1_prt_1 | c58_linesegarray | 0 | 0 | | | + foo_1_prt_2 | c58_linesegarray | 0 | 0 | | | + foo | c59_patharray | 0 | 0 | | | + foo_1_prt_1 | c59_patharray | 0 | 0 | | | + foo_1_prt_2 | c59_patharray | 0 | 0 | | | + foo | c60_boxarray | 0 | 0 | | | + foo_1_prt_1 | c60_boxarray | 0 | 0 | | | + foo_1_prt_2 | c60_boxarray | 0 | 0 | | | + foo | c61_polygonarray | 0 | 0 | | | + foo_1_prt_1 | c61_polygonarray | 0 | 0 | | | + foo_1_prt_2 | c61_polygonarray | 0 | 0 | | | + foo | c62_circlearray | 0 | 0 | | | + foo_1_prt_1 | c62_circlearray | 0 | 0 | | | + foo_1_prt_2 | c62_circlearray | 0 | 0 | | | + foo | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}"} | {0.17948718,0.17948718,0.16666667} | {"{\"(0,1)\",\"(0,1)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_1 | c63_inc_analyze_composite_array | 0 | 6 | {"{\"(0,1)\",\"(0,1)\"}","{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}"} | {0.16666667,0.16666667,0.16666667,0.16666667} | {"{\"(4,5)\",\"(4,5)\"}","{\"(5,0)\",\"(5,0)\"}"} + foo_1_prt_2 | c63_inc_analyze_composite_array | 0 | -0.33333334 | {"{\"(1,2)\",\"(1,2)\"}","{\"(2,3)\",\"(2,3)\"}","{\"(3,4)\",\"(3,4)\"}","{\"(4,5)\",\"(4,5)\"}"} | {0.22222222,0.22222222,0.16666667,0.16666667} | {"{\"(0,1)\",\"(0,1)\"}","{\"(5,0)\",\"(5,0)\"}"} +(180 rows) + +-- Test merging leaf stats where HLL is empty +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo select i, i%6, repeat('aaaa', 100000) FROM generate_series(1, 100)i; +ANALYZE foo; +-- In single node, we don't 'toolarge' bitmap created in acquire_sample_rows_dispatcher. The result is more similar to postgres. +SELECT * FROM pg_stats WHERE tablename like 'foo%' and attname = 'c' ORDER BY attname,tablename; + 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 +------------+-------------+---------+-----------+-----------+-----------+------------+------------------+-------------------+------------------+-------------+-------------------+------------------------+---------------------- + public | foo | c | t | 0 | 4591 | 1 | | | | | | | + public | foo_1_prt_1 | c | f | 0 | 4591 | -1 | | | | | | | + public | foo_1_prt_2 | c | f | 0 | 4591 | -1 | | | | | | | +(3 rows) + +-- Test ANALYZE full scan HLL +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo SELECT i, i%3, 'text_'||i%100 FROM generate_series(1,1000)i; +INSERT INTO foo SELECT i, i%3+3, 'text_'||i%200 FROM generate_series(1,1000)i; +SET default_statistics_target to 3; +ANALYZE FULLSCAN foo; +SELECT tablename, n_distinct FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | n_distinct +-------------+------------ + foo | -0.5015 + foo_1_prt_1 | -1 + foo_1_prt_2 | -1 + foo | 6 + foo_1_prt_1 | 3 + foo_1_prt_2 | 3 + foo | 199 + foo_1_prt_1 | 100 + foo_1_prt_2 | -0.199 +(9 rows) + +-- Test ANALYZE auto merge behavior +-- Do not merge stats from only one partition while other partitions have not been analyzed yet +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo SELECT i, i%6, i%6 FROM generate_series(1,100)i; +ANALYZE foo_1_prt_1; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------+-----------+------------+------------------+-------------------+------------------ + foo_1_prt_1 | a | 0 | -1 | | | {1,32,66,98} + foo_1_prt_1 | b | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_1 | c | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | +(3 rows) + +-- Merge stats from both partitions +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo SELECT i, i%6, i%6 FROM generate_series(1,100)i; +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------+-----------+------------+------------------+-------------------+------------------ + foo | a | 0 | -1 | | | {1,34,66,100} + foo_1_prt_1 | a | 0 | -1 | | | {1,32,66,98} + foo_1_prt_2 | a | 0 | -1 | | | {3,34,65,100} + foo | b | 0 | 6 | {1,2,3} | {0.17,0.17,0.17} | {0,4,5} + foo_1_prt_1 | b | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | b | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo | c | 0 | 6 | {1,2,3} | {0.17,0.17,0.17} | {0,4,5} + foo_1_prt_1 | c | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | + foo_1_prt_2 | c | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | +(9 rows) + +-- No stats after merging +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-----------+---------+-----------+------------+------------------+-------------------+------------------ +(0 rows) + +-- Merge stats from only one partition +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo SELECT i, i%6, i%6 FROM generate_series(1,100)i; +SET allow_system_table_mods=true; +UPDATE pg_attribute SET attstattarget=0 WHERE attrelid = 'foo_1_prt_1'::regclass and ATTNAME in ('a','b','c'); +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------+-----------+------------+------------------+-------------------+------------------ + foo_1_prt_2 | a | 0 | -1 | | | {3,34,65,100} + foo_1_prt_2 | b | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | + foo_1_prt_2 | c | 0 | 3 | {3,4,5} | {0.34,0.34,0.32} | +(3 rows) + +-- Merge stats from only one partition one column +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo SELECT i, i%6, i%6 FROM generate_series(1,100)i; +ANALYZE foo_1_prt_1(c); +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------+-----------+------------+------------------+-------------------+------------------ + foo_1_prt_1 | c | 0 | 3 | {1,2,0} | {0.34,0.34,0.32} | +(1 row) + +-- Test merging of leaf stats when one partition has +-- FULL SCAN HLL and the other has HLL from sample +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO FOO SELECT i,i%6 FROM generate_series(1,1000)i; +ANALYZE foo_1_prt_1; +ANALYZE FULLSCAN foo_1_prt_2; +ERROR: ANALYZE cannot merge since not all non-empty leaf partitions have consistent hyperloglog statistics for merge +HINT: Re-run ANALYZE or ANALYZE FULLSCAN +-- Test merging of stats for a newly added partition +-- Do not collect samples while merging stats +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO FOO SELECT i,i%6 FROM generate_series(1,1000)i; +SET default_statistics_target = 4; +ANALYZE foo; +ALTER TABLE foo ADD partition new_part START (6) INCLUSIVE END (9) EXCLUSIVE; +INSERT INTO foo SELECT i, i%3+6 FROM generate_series(1,500)i; +ANALYZE foo_1_prt_new_part; +SET log_statement='none'; +SET client_min_messages = 'log'; +-- Insert a new column that is not analyzed in the leaf partitions. +-- Analyzing root partition will use merging statistics for the first 2 columns, +-- will create a sample for the root to analyze the newly added columns since +-- the leaf partitions does not have any stats for it, yet +ALTER TABLE foo ADD COLUMN c int; +INSERT INTO foo SELECT i, i%9, i%100 FROM generate_series(1,500)i; +-- start_matchsubs +-- m/gp_acquire_sample_rows([^,]+, [^,]+, .+)/ +-- s/gp_acquire_sample_rows([^,]+, [^,]+, .+)/gp_acquire_sample_rows()/ +-- end_matchsubs +ANALYZE VERBOSE rootpartition foo; +INFO: analyzing "public.foo" inheritance tree +INFO: column c of partition foo_1_prt_1 is not analyzed, so ANALYZE will collect sample for stats calculation +INFO: "foo_1_prt_1": scanned 1 of 1 pages, containing 667 live rows and 0 dead rows; 400 rows in sample, 667 estimated total rows +INFO: "foo_1_prt_2": scanned 1 of 1 pages, containing 668 live rows and 0 dead rows; 400 rows in sample, 668 estimated total rows +INFO: "foo_1_prt_new_part": scanned 1 of 1 pages, containing 665 live rows and 0 dead rows; 400 rows in sample, 665 estimated total rows +-- Testing auto merging root statistics for all columns +-- where column attnums are differents due to dropped columns +-- and split partitions. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text, d int) + PARTITION BY RANGE (a) + (START (0) END (8) EVERY (4), + DEFAULT PARTITION def_part); +INSERT INTO foo SELECT i%13, i, 'something'||i::text, i%121 FROM generate_series(1,1000)i; +ALTER TABLE foo DROP COLUMN b; +ALTER TABLE foo SPLIT DEFAULT PARTITION START (8) END (12) INTO (PARTITION new_part, default PARTITION); +set client_min_messages to 'log'; +ANALYZE foo_1_prt_2; +ANALYZE foo_1_prt_3; +ANALYZE foo_1_prt_new_part; +ANALYZE foo_1_prt_def_part; +reset client_min_messages; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +--------------------+---------+-----------+-------------+------------------+-------------------------------------------------------+--------------------------------------------------------------------- + foo | a | 0 | 13 | {4,5,6,7} | {0.077,0.077,0.077,0.077} | {0,2,8,10,12} + foo_1_prt_2 | a | 0 | 4 | {1,2,3,0} | {0.25081432,0.25081432,0.25081432,0.247557} | + foo_1_prt_3 | a | 0 | 4 | {4,5,6,7} | {0.25,0.25,0.25,0.25} | + foo_1_prt_def_part | a | 0 | 1 | {12} | {1} | + foo_1_prt_new_part | a | 0 | 4 | {8,9,10,11} | {0.25,0.25,0.25,0.25} | + foo | c | 0 | -1 | | | {something1,something33,something554,something776,something999} + foo_1_prt_2 | c | 0 | -1 | | | {something1,something313,something54,something769,something991} + foo_1_prt_3 | c | 0 | -1 | | | {something108,something33,something553,something773,something995} + foo_1_prt_def_part | c | 0 | -1 | | | {something1000,something311,something532,something766,something987} + foo_1_prt_new_part | c | 0 | -1 | | | {something10,something323,something554,something776,something999} + foo | d | 0 | -0.121 | {2,3} | {0.009,0.009} | {0,31,62,91,120} + foo_1_prt_2 | d | 0 | -0.39413682 | {1,2,3,7} | {0.009771987,0.009771987,0.009771987,0.009771987} | {0,31,62,91,120} + foo_1_prt_3 | d | 0 | -0.39285713 | {0,1,2,3} | {0.0097402595,0.0097402595,0.0097402595,0.0097402595} | {4,30,59,90,120} + foo_1_prt_def_part | d | 0 | -1 | | | {0,27,57,88,118} + foo_1_prt_new_part | d | 0 | -0.39285713 | {2,3,4,5} | {0.0097402595,0.0097402595,0.0097402595,0.0097402595} | {0,31,60,89,120} +(15 rows) + +-- Testing auto merging root statistics for a column whose attnum +-- is aligned and the same in every partition due to dropped columns +-- and split partitions. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text, d int) + PARTITION BY RANGE (a) + (START (0) END (8) EVERY (4), + DEFAULT PARTITION def_part); +INSERT INTO foo SELECT i%13, i, 'something'||i::text, i%121 FROM generate_series(1,1000)i; +ALTER TABLE foo DROP COLUMN b; +ALTER TABLE foo SPLIT DEFAULT PARTITION START (8) END (12) INTO (PARTITION new_part, default PARTITION); +set client_min_messages to 'log'; +ANALYZE foo_1_prt_2(a); +ANALYZE foo_1_prt_3(a); +ANALYZE foo_1_prt_new_part(a); +ANALYZE foo_1_prt_def_part(a); +reset client_min_messages; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +--------------------+---------+-----------+------------+------------------+---------------------------------------------+------------------ + foo | a | 0 | 13 | {4,5,6,7} | {0.077,0.077,0.077,0.077} | {0,2,8,10,12} + foo_1_prt_2 | a | 0 | 4 | {1,2,3,0} | {0.25081432,0.25081432,0.25081432,0.247557} | + foo_1_prt_3 | a | 0 | 4 | {4,5,6,7} | {0.25,0.25,0.25,0.25} | + foo_1_prt_def_part | a | 0 | 1 | {12} | {1} | + foo_1_prt_new_part | a | 0 | 4 | {8,9,10,11} | {0.25,0.25,0.25,0.25} | +(5 rows) + +-- Testing auto merging root statistics for a column whose attnum +-- is not aligned and different in partitions due to dropped columns +-- and split partitions. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text, d int) + PARTITION BY RANGE (a) + (START (0) END (8) EVERY (4), + DEFAULT PARTITION def_part); +INSERT INTO foo SELECT i%13, i, 'something'||i::text, i%121 FROM generate_series(1,1000)i; +ALTER TABLE foo DROP COLUMN b; +ALTER TABLE foo SPLIT DEFAULT PARTITION START (8) END (12) INTO (PARTITION new_part, default PARTITION); +set client_min_messages to 'log'; +ANALYZE foo_1_prt_2(d); +ANALYZE foo_1_prt_3(d); +ANALYZE foo_1_prt_new_part(d); +ANALYZE foo_1_prt_def_part(d); +reset client_min_messages; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +--------------------+---------+-----------+-------------+------------------+-------------------------------------------------------+------------------ + foo | d | 0 | -0.121 | {2,3} | {0.009,0.009} | {0,31,62,91,120} + foo_1_prt_2 | d | 0 | -0.39413682 | {1,2,3,7} | {0.009771987,0.009771987,0.009771987,0.009771987} | {0,31,62,91,120} + foo_1_prt_3 | d | 0 | -0.39285713 | {0,1,2,3} | {0.0097402595,0.0097402595,0.0097402595,0.0097402595} | {4,30,59,90,120} + foo_1_prt_def_part | d | 0 | -1 | | | {0,27,57,88,118} + foo_1_prt_new_part | d | 0 | -0.39285713 | {2,3,4,5} | {0.0097402595,0.0097402595,0.0097402595,0.0097402595} | {0,31,60,89,120} +(5 rows) + +-- Testing ANALYZE ROOTPARTITION and when optimizer_analyze_root_partition is off +-- for incremental analyze. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text) + PARTITION BY RANGE (b) + (START (0) END (8) EVERY (4)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo SELECT i%130, i%8, 'something'||i::text FROM generate_series(1,1000)i; +set optimizer_analyze_root_partition=off; +set client_min_messages to 'log'; +-- ANALYZE ROOTPARTITION will sample the table and compute statistics since there +-- is not stats to be merged in the leaf partitions +ANALYZE ROOTPARTITION foo; +reset client_min_messages; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-----------+---------+-----------+------------+------------------+---------------------------+------------------------------------------------------------------ + foo | a | 0 | -0.13 | {1,2,3,4} | {0.008,0.008,0.008,0.008} | {0,34,64,95,129} + foo | b | 0 | 8 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {4,5,6,7} + foo | c | 0 | -1 | | | {something1,something322,something548,something773,something999} +(3 rows) + +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +set client_min_messages to 'log'; +-- ANALYZE ROOT PARTITION will piggyback on the stats collected from the leaf and merge them +ANALYZE ROOTPARTITION foo; +reset client_min_messages; +reset optimizer_analyze_root_partition; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------+-----------+------------+------------------+---------------------------+-------------------------------------------------------------------- + foo | a | 0 | -0.131 | {1,2,3} | {0.008,0.008,0.008} | {0,34,64,95,129} + foo_1_prt_1 | a | 0 | -0.26 | {1,2,3,4} | {0.008,0.008,0.008,0.008} | {0,34,64,95,129} + foo_1_prt_2 | a | 0 | -0.26 | {0,1,2,3} | {0.008,0.008,0.008,0.008} | {4,34,64,94,129} + foo | b | 0 | 8 | {0,1,2,3} | {0.125,0.125,0.125,0.125} | {4,5,6,7} + foo_1_prt_1 | b | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | b | 0 | 4 | {4,5,6,7} | {0.25,0.25,0.25,0.25} | + foo | c | 0 | -1 | | | {something1,something324,something548,something776,something999} + foo_1_prt_1 | c | 0 | -1 | | | {something1,something321,something547,something776,something995} + foo_1_prt_2 | c | 0 | -1 | | | {something100,something324,something548,something772,something999} +(9 rows) + +-- Testing that auto merge will be disabled when optimizer_analyze_root_partition +-- is off for incremental analyze. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text) + PARTITION BY RANGE (b) + (START (0) END (8) EVERY (4)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo SELECT i%130, i%8, 'something'||i::text FROM generate_series(1,1000)i; +set optimizer_analyze_root_partition=off; +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------+-----------+------------+------------------+---------------------------+-------------------------------------------------------------------- + foo_1_prt_1 | a | 0 | -0.26 | {1,2,3,4} | {0.008,0.008,0.008,0.008} | {0,34,64,95,129} + foo_1_prt_2 | a | 0 | -0.26 | {0,1,2,3} | {0.008,0.008,0.008,0.008} | {4,34,64,94,129} + foo_1_prt_1 | b | 0 | 4 | {0,1,2,3} | {0.25,0.25,0.25,0.25} | + foo_1_prt_2 | b | 0 | 4 | {4,5,6,7} | {0.25,0.25,0.25,0.25} | + foo_1_prt_1 | c | 0 | -1 | | | {something1,something321,something547,something776,something995} + foo_1_prt_2 | c | 0 | -1 | | | {something100,something324,something548,something772,something999} +(6 rows) + +reset optimizer_analyze_root_partition; +-- Test incremental analyze on a partitioned table with different storage type and compression algorithm +DROP TABLE IF EXISTS incr_analyze_test; +NOTICE: table "incr_analyze_test" does not exist, skipping +CREATE TABLE incr_analyze_test ( + a integer, + b character varying, + c date +) +WITH (appendonly=true, orientation=row) PARTITION BY RANGE(c) + ( + START ('2018-01-01'::date) END ('2018-01-02'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_1', appendonly=true, compresslevel=3, orientation=column, compresstype=ZLIB ), + START ('2018-01-02'::date) END ('2018-01-03'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_2', appendonly=true, compresslevel=1, orientation=column, compresstype=RLE_TYPE ), + START ('2018-01-03'::date) END ('2018-01-04'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_3', appendonly=true, compresslevel=1, orientation=column, compresstype=ZLIB ), + START ('2018-01-04'::date) END ('2018-01-05'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_4', appendonly=true, compresslevel=1, orientation=row, compresstype=ZLIB ), + START ('2018-01-05'::date) END ('2018-01-06'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_5', appendonly=true, compresslevel=1, orientation=row, compresstype=ZLIB ), + START ('2018-01-06'::date) END ('2018-01-07'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_6', appendonly=false) + ); +INSERT INTO incr_analyze_test VALUES (1, 'a', '2018-01-01'); +ANALYZE incr_analyze_test; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'incr_analyze_test%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +---------------------------+---------+-----------+------------+------------------+-------------------+------------------ + incr_analyze_test | a | 0 | -1 | | | + incr_analyze_test_1_prt_1 | a | 0 | -1 | | | + incr_analyze_test | b | 0 | -1 | | | + incr_analyze_test_1_prt_1 | b | 0 | -1 | | | + incr_analyze_test | c | 0 | -1 | | | + incr_analyze_test_1_prt_1 | c | 0 | -1 | | | +(6 rows) + +INSERT INTO incr_analyze_test SELECT s, md5(s::varchar), '2018-01-02' FROM generate_series(1, 1000) AS s; +ANALYZE incr_analyze_test_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'incr_analyze_test%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +---------------------------+---------+-----------+------------+------------------+-------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + incr_analyze_test | a | 0 | -1 | | | {1,500,750,1000} + incr_analyze_test_1_prt_1 | a | 0 | -1 | | | + incr_analyze_test_1_prt_2 | a | 0 | -1 | | | {1,250,500,750,1000} + incr_analyze_test | b | 0 | -1 | | | {00411460f7c92d2124a67ea0f4cb5f85,819f46e52c25763a55cc642422644317,c20ad4d76fe97759aa27a0c99bff6710,ffeabd223de0d4eacb9a3e6e53e5448d} + incr_analyze_test_1_prt_1 | b | 0 | -1 | | | + incr_analyze_test_1_prt_2 | b | 0 | -1 | | | {00411460f7c92d2124a67ea0f4cb5f85,3a0772443a0739141292a5429b952fe6,819f46e52c25763a55cc642422644317,c20ad4d76fe97759aa27a0c99bff6710,ffeabd223de0d4eacb9a3e6e53e5448d} + incr_analyze_test | c | 0 | 2 | {01-02-2018} | {0.999001} | + incr_analyze_test_1_prt_1 | c | 0 | -1 | | | + incr_analyze_test_1_prt_2 | c | 0 | 1 | {01-02-2018} | {1} | +(9 rows) + +SELECT relname, relpages, reltuples FROM pg_class WHERE relname LIKE 'incr_analyze_test%' ORDER BY relname; + relname | relpages | reltuples +---------------------------+----------+----------- + incr_analyze_test | -1 | 1001 + incr_analyze_test_1_prt_1 | 1 | 1 + incr_analyze_test_1_prt_2 | 2 | 1000 + incr_analyze_test_1_prt_3 | 1 | 0 + incr_analyze_test_1_prt_4 | 1 | 0 + incr_analyze_test_1_prt_5 | 1 | 0 + incr_analyze_test_1_prt_6 | 1 | 0 +(7 rows) + +-- Test merging of stats if an empty partition contains relpages > 0 +-- Do not collect samples while merging stats +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO foo SELECT i,i%3 FROM generate_series(1,10)i; +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SET allow_system_table_mods = on; +UPDATE pg_class set relpages=3 WHERE relname='foo_1_prt_2'; +RESET allow_system_table_mods; +analyze verbose rootpartition foo; +INFO: analyzing "public.foo" inheritance tree +-- ensure relpages is correctly set after analyzing +analyze foo_1_prt_2; +select reltuples, relpages from pg_class where relname ='foo_1_prt_2'; + reltuples | relpages +-----------+---------- + 0 | 1 +(1 row) + +-- Test application of column-wise statistics setting to the number of MCVs and histogram bounds on partitioned table +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int) PARTITION BY RANGE (a) (START (0) END (10) EVERY (5)); +-- fill foo with even numbers twice as large than odd ones to avoid fully even distribution of 'a' attribute and hence empty MCV/MCF +INSERT INTO foo SELECT i%10 FROM generate_series(0, 100) i; +INSERT INTO foo SELECT i%10 FROM generate_series(0, 100) i WHERE i%2 = 0; +-- default_statistics_target is 4 +ALTER TABLE foo ALTER COLUMN a SET STATISTICS 5; +ANALYZE foo; +SELECT array_length(most_common_vals, 1), array_length(most_common_freqs, 1), array_length(histogram_bounds, 1) FROM pg_stats WHERE tablename = 'foo' AND attname = 'a'; + array_length | array_length | array_length +--------------+--------------+-------------- + 5 | 5 | 5 +(1 row) + +-- Make sure a simple heap table does not store HLL values +CREATE TABLE simple_table_no_hll (a int); +INSERT INTO simple_table_no_hll SELECT generate_series(1,10); +ANALYZE simple_table_no_hll; +SELECT staattnum, stakind1, stakind2, stakind3, stakind4, stakind5, + stavalues1, stavalues2, stavalues3, stavalues4, stavalues5 +FROM pg_statistic WHERE starelid = 'simple_table_no_hll'::regclass; + staattnum | stakind1 | stakind2 | stakind3 | stakind4 | stakind5 | stavalues1 | stavalues2 | stavalues3 | stavalues4 | stavalues5 +-----------+----------+----------+----------+----------+----------+--------------+------------+------------+------------+------------ + 1 | 2 | 3 | 0 | 0 | 0 | {1,3,5,7,10} | | | | +(1 row) + +-- Make sure analyze rootpartition option works in an option list +set optimizer_analyze_root_partition to off; +DROP TABLE IF EXISTS foo; +CREATE TABLE foo(a int) PARTITION BY RANGE(a) (start (0) INCLUSIVE END (20) EVERY (10)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO foo values (5),(15); +ANALYZE (verbose, rootpartition off) foo; +INFO: analyzing "public.foo_1_prt_2" +INFO: "foo_1_prt_2": scanned 1 of 1 pages, containing 1 live rows and 0 dead rows; 1 rows in sample, 1 estimated total rows +INFO: analyzing "public.foo_1_prt_1" +INFO: "foo_1_prt_1": scanned 1 of 1 pages, containing 1 live rows and 0 dead rows; 1 rows in sample, 1 estimated total rows +-- root should not have stats +SELECT count(*) from pg_statistic where starelid='foo'::regclass; + count +------- + 0 +(1 row) + +-- root should have stats +ANALYZE (verbose, rootpartition on) foo; +INFO: analyzing "public.foo" inheritance tree +SELECT count(*) from pg_statistic where starelid='foo'::regclass; + count +------- + 1 +(1 row) + +-- Make sure analyze hll fullscan option works in an option list +ANALYZE (verbose, fullscan on) foo; +INFO: analyzing "public.foo_1_prt_2" +INFO: Executing SQL: select pg_catalog.gp_hyperloglog_accum(a) from public.foo_1_prt_2 as Ta +INFO: HLL FULL SCAN +INFO: "foo_1_prt_2": scanned 1 of 1 pages, containing 1 live rows and 0 dead rows; 1 rows in sample, 1 estimated total rows +INFO: analyzing "public.foo_1_prt_1" +INFO: Executing SQL: select pg_catalog.gp_hyperloglog_accum(a) from public.foo_1_prt_1 as Ta +INFO: HLL FULL SCAN +INFO: "foo_1_prt_1": scanned 1 of 1 pages, containing 1 live rows and 0 dead rows; 1 rows in sample, 1 estimated total rows +ANALYZE (verbose, fullscan off) foo; +INFO: analyzing "public.foo_1_prt_2" +INFO: "foo_1_prt_2": scanned 1 of 1 pages, containing 1 live rows and 0 dead rows; 1 rows in sample, 1 estimated total rows +INFO: analyzing "public.foo_1_prt_1" +INFO: "foo_1_prt_1": scanned 1 of 1 pages, containing 1 live rows and 0 dead rows; 1 rows in sample, 1 estimated total rows +reset optimizer_analyze_root_partition; +-- Test merging of stats after the last partition is analyzed. Merging should +-- be done for root without taking a sample from root if one of the column +-- statistics collection is turned off +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c gp_hyperloglog_estimator) PARTITION BY RANGE (b) (START (1) END (3) EVERY (1)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +SET gp_autostats_mode=none; +ALTER TABLE foo ALTER COLUMN c SET STATISTICS 0; +INSERT INTO foo SELECT i,i%2+1, NULL FROM generate_series(1,100)i; +ANALYZE VERBOSE foo_1_prt_1; +INFO: analyzing "public.foo_1_prt_1" +INFO: "foo_1_prt_1": scanned 1 of 1 pages, containing 50 live rows and 0 dead rows; 50 rows in sample, 50 estimated total rows +ANALYZE VERBOSE foo_1_prt_2; +INFO: analyzing "public.foo_1_prt_2" +INFO: "foo_1_prt_2": scanned 1 of 1 pages, containing 50 live rows and 0 dead rows; 50 rows in sample, 50 estimated total rows +INFO: analyzing "public.foo" inheritance tree +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + tablename | attname | null_frac | n_distinct | most_common_vals | most_common_freqs | histogram_bounds +-------------+---------+-----------+------------+------------------+-------------------+------------------ + foo | a | 0 | -1 | | | {1,26,50,74,100} + foo_1_prt_1 | a | 0 | -1 | | | {2,26,50,74,100} + foo_1_prt_2 | a | 0 | -1 | | | {1,25,49,73,99} + foo | b | 0 | 2 | {1,2} | {0.5,0.5} | + foo_1_prt_1 | b | 0 | 1 | {1} | {1} | + foo_1_prt_2 | b | 0 | 1 | {2} | {1} | +(6 rows) + +RESET gp_autostats_mode; +-- analyze in transaction should merge leaves instead of resampling +drop table if exists foo; +create table foo (a int, b date) partition by range(b) (partition "20210101" start ('20210101'::date) end ('20210201'::date), partition "20210201" start ('20210201'::date) end ('20210301'::date), partition "20210301" start ('20210301'::date) end ('20210401'::date)); +insert into foo select a, '20210101'::date+a from (select generate_series(1,80) a) t1; +analyze verbose foo; +INFO: analyzing "public.foo_1_prt_20210301" +INFO: "foo_1_prt_20210301": scanned 1 of 1 pages, containing 22 live rows and 0 dead rows; 22 rows in sample, 22 estimated total rows +INFO: analyzing "public.foo_1_prt_20210201" +INFO: "foo_1_prt_20210201": scanned 1 of 1 pages, containing 28 live rows and 0 dead rows; 28 rows in sample, 28 estimated total rows +INFO: analyzing "public.foo_1_prt_20210101" +INFO: "foo_1_prt_20210101": scanned 1 of 1 pages, containing 30 live rows and 0 dead rows; 30 rows in sample, 30 estimated total rows +INFO: analyzing "public.foo" inheritance tree +-- we should see "analyzing "public.foo" inheritance tree" in the output below +begin; +truncate foo_1_prt_20210201; +insert into foo select a, '20210101'::date+a from (select generate_series(31,40) a) t1; +analyze verbose foo_1_prt_20210201; +INFO: analyzing "public.foo_1_prt_20210201" +INFO: "foo_1_prt_20210201": scanned 1 of 1 pages, containing 10 live rows and 0 dead rows; 10 rows in sample, 10 estimated total rows +INFO: analyzing "public.foo" inheritance tree +rollback; diff --git a/src/test/singlenode_regress/expected/incremental_sort.out b/src/test/singlenode_regress/expected/incremental_sort.out new file mode 100644 index 00000000000..0f213b831a1 --- /dev/null +++ b/src/test/singlenode_regress/expected/incremental_sort.out @@ -0,0 +1,1701 @@ +-- When we have to sort the entire table, incremental sort will +-- be slower than plain sort, so it should not be used. +explain (costs off) +select * from (select * from tenk1 order by four) t order by four, ten; + QUERY PLAN +------------------------------------- + Sort + Sort Key: tenk1.four, tenk1.ten + -> Sort + Sort Key: tenk1.four + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(6 rows) + +-- When there is a LIMIT clause, incremental sort is beneficial because +-- it only has to sort some of the groups, and not the entire table. +explain (costs off) +select * from (select * from tenk1 order by four) t order by four, ten +limit 1; + QUERY PLAN +----------------------------------------- + Limit + -> Incremental Sort + Sort Key: tenk1.four, tenk1.ten + Presorted Key: tenk1.four + -> Sort + Sort Key: tenk1.four + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(8 rows) + +-- When work_mem is not enough to sort the entire table, incremental sort +-- may be faster if individual groups still fit into work_mem. +set work_mem to '2MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +explain (costs off) +select * from (select * from tenk1 order by four) t order by four, ten; + QUERY PLAN +------------------------------------- + Sort + Sort Key: tenk1.four, tenk1.ten + -> Sort + Sort Key: tenk1.four + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(6 rows) + +reset work_mem; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +create table t(a integer, b integer); +create or replace function explain_analyze_without_memory(query text) +returns table (out_line text) language plpgsql +as +$$ +declare + line text; +begin + for line in + execute 'explain (analyze, costs off, summary off, timing off) ' || query + loop + out_line := regexp_replace(line, '\d+kB', 'NNkB', 'g'); + return next; + end loop; +end; +$$; +create or replace function explain_analyze_inc_sort_nodes(query text) +returns jsonb language plpgsql +as +$$ +declare + elements jsonb; + element jsonb; + matching_nodes jsonb := '[]'::jsonb; +begin + execute 'explain (analyze, costs off, summary off, timing off, format ''json'') ' || query into strict elements; + while jsonb_array_length(elements) > 0 loop + element := elements->0; + elements := elements - 0; + case jsonb_typeof(element) + when 'array' then + if jsonb_array_length(element) > 0 then + elements := elements || element; + end if; + when 'object' then + if element ? 'Plan' then + elements := elements || jsonb_build_array(element->'Plan'); + element := element - 'Plan'; + else + if element ? 'Plans' then + elements := elements || jsonb_build_array(element->'Plans'); + element := element - 'Plans'; + end if; + if (element->>'Node Type')::text = 'Incremental Sort' then + matching_nodes := matching_nodes || element; + end if; + end if; + end case; + end loop; + return matching_nodes; +end; +$$; +create or replace function explain_analyze_inc_sort_nodes_without_memory(query text) +returns jsonb language plpgsql +as +$$ +declare + nodes jsonb := '[]'::jsonb; + node jsonb; + group_key text; + space_key text; +begin + for node in select * from jsonb_array_elements(explain_analyze_inc_sort_nodes(query)) t loop + for group_key in select unnest(array['Full-sort Groups', 'Pre-sorted Groups']::text[]) t loop + for space_key in select unnest(array['Sort Space Memory', 'Sort Space Disk']::text[]) t loop + node := jsonb_set(node, array[group_key, space_key, 'Average Sort Space Used'], '"NN"', false); + node := jsonb_set(node, array[group_key, space_key, 'Peak Sort Space Used'], '"NN"', false); + end loop; + end loop; + nodes := nodes || node; + end loop; + return nodes; +end; +$$; +create or replace function explain_analyze_inc_sort_nodes_verify_invariants(query text) +returns bool language plpgsql +as +$$ +declare + node jsonb; + group_stats jsonb; + group_key text; + space_key text; +begin + for node in select * from jsonb_array_elements(explain_analyze_inc_sort_nodes(query)) t loop + for group_key in select unnest(array['Full-sort Groups', 'Pre-sorted Groups']::text[]) t loop + group_stats := node->group_key; + for space_key in select unnest(array['Sort Space Memory', 'Sort Space Disk']::text[]) t loop + if (group_stats->space_key->'Peak Sort Space Used')::bigint < (group_stats->space_key->'Peak Sort Space Used')::bigint then + raise exception '% has invalid max space < average space', group_key; + end if; + end loop; + end loop; + end loop; + return true; +end; +$$; +-- A single large group tested around each mode transition point. +insert into t(a, b) select i/100 + 1, i + 1 from generate_series(0, 999) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 31; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 31; + a | b +---+---- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 + 1 | 5 + 1 | 6 + 1 | 7 + 1 | 8 + 1 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 1 | 20 + 1 | 21 + 1 | 22 + 1 | 23 + 1 | 24 + 1 | 25 + 1 | 26 + 1 | 27 + 1 | 28 + 1 | 29 + 1 | 30 + 1 | 31 +(31 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 32; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 32; + a | b +---+---- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 + 1 | 5 + 1 | 6 + 1 | 7 + 1 | 8 + 1 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 1 | 20 + 1 | 21 + 1 | 22 + 1 | 23 + 1 | 24 + 1 | 25 + 1 | 26 + 1 | 27 + 1 | 28 + 1 | 29 + 1 | 30 + 1 | 31 + 1 | 32 +(32 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 33; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 33; + a | b +---+---- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 + 1 | 5 + 1 | 6 + 1 | 7 + 1 | 8 + 1 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 1 | 20 + 1 | 21 + 1 | 22 + 1 | 23 + 1 | 24 + 1 | 25 + 1 | 26 + 1 | 27 + 1 | 28 + 1 | 29 + 1 | 30 + 1 | 31 + 1 | 32 + 1 | 33 +(33 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 65; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 65; + a | b +---+---- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 + 1 | 5 + 1 | 6 + 1 | 7 + 1 | 8 + 1 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 1 | 20 + 1 | 21 + 1 | 22 + 1 | 23 + 1 | 24 + 1 | 25 + 1 | 26 + 1 | 27 + 1 | 28 + 1 | 29 + 1 | 30 + 1 | 31 + 1 | 32 + 1 | 33 + 1 | 34 + 1 | 35 + 1 | 36 + 1 | 37 + 1 | 38 + 1 | 39 + 1 | 40 + 1 | 41 + 1 | 42 + 1 | 43 + 1 | 44 + 1 | 45 + 1 | 46 + 1 | 47 + 1 | 48 + 1 | 49 + 1 | 50 + 1 | 51 + 1 | 52 + 1 | 53 + 1 | 54 + 1 | 55 + 1 | 56 + 1 | 57 + 1 | 58 + 1 | 59 + 1 | 60 + 1 | 61 + 1 | 62 + 1 | 63 + 1 | 64 + 1 | 65 +(65 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 66; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 66; + a | b +---+---- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 + 1 | 5 + 1 | 6 + 1 | 7 + 1 | 8 + 1 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 1 | 20 + 1 | 21 + 1 | 22 + 1 | 23 + 1 | 24 + 1 | 25 + 1 | 26 + 1 | 27 + 1 | 28 + 1 | 29 + 1 | 30 + 1 | 31 + 1 | 32 + 1 | 33 + 1 | 34 + 1 | 35 + 1 | 36 + 1 | 37 + 1 | 38 + 1 | 39 + 1 | 40 + 1 | 41 + 1 | 42 + 1 | 43 + 1 | 44 + 1 | 45 + 1 | 46 + 1 | 47 + 1 | 48 + 1 | 49 + 1 | 50 + 1 | 51 + 1 | 52 + 1 | 53 + 1 | 54 + 1 | 55 + 1 | 56 + 1 | 57 + 1 | 58 + 1 | 59 + 1 | 60 + 1 | 61 + 1 | 62 + 1 | 63 + 1 | 64 + 1 | 65 + 1 | 66 +(66 rows) + +delete from t; +-- An initial large group followed by a small group. +insert into t(a, b) select i/50 + 1, i + 1 from generate_series(0, 999) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 55; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 55; + a | b +---+---- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 + 1 | 5 + 1 | 6 + 1 | 7 + 1 | 8 + 1 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 1 | 20 + 1 | 21 + 1 | 22 + 1 | 23 + 1 | 24 + 1 | 25 + 1 | 26 + 1 | 27 + 1 | 28 + 1 | 29 + 1 | 30 + 1 | 31 + 1 | 32 + 1 | 33 + 1 | 34 + 1 | 35 + 1 | 36 + 1 | 37 + 1 | 38 + 1 | 39 + 1 | 40 + 1 | 41 + 1 | 42 + 1 | 43 + 1 | 44 + 1 | 45 + 1 | 46 + 1 | 47 + 1 | 48 + 1 | 49 + 1 | 50 + 2 | 51 + 2 | 52 + 2 | 53 + 2 | 54 + 2 | 55 +(55 rows) + +-- Test EXPLAIN ANALYZE with only a fullsort group. +select explain_analyze_without_memory('select * from (select * from t order by a) s order by a, b limit 55'); + explain_analyze_without_memory +--------------------------------------------------------------------------------------------------------------- + Limit (actual rows=55 loops=1) + -> Incremental Sort (actual rows=55 loops=1) + Sort Key: t.a, t.b + Presorted Key: t.a + Full-sort Groups: 2 Sort Methods: top-N heapsort, quicksort Average Memory: NNkB Peak Memory: NNkB + -> Sort (actual rows=101 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: NNkB + -> Seq Scan on t (actual rows=1000 loops=1) + Optimizer: Postgres query optimizer +(10 rows) + +select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 55')); + jsonb_pretty +------------------------------------------------- + [ + + { + + "Sort Key": [ + + "t.a", + + "t.b" + + ], + + "Node Type": "Incremental Sort", + + "Actual Rows": 55, + + "Actual Loops": 1, + + "Async Capable": false, + + "Presorted Key": [ + + "t.a" + + ], + + "Parallel Aware": false, + + "Full-sort Groups": { + + "Group Count": 2, + + "Sort Methods Used": [ + + "top-N heapsort", + + "quicksort" + + ], + + "Sort Space Memory": { + + "Peak Sort Space Used": "NN", + + "Average Sort Space Used": "NN"+ + } + + }, + + "Parent Relationship": "Outer" + + } + + ] +(1 row) + +select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 55'); + explain_analyze_inc_sort_nodes_verify_invariants +-------------------------------------------------- + t +(1 row) + +delete from t; +-- An initial small group followed by a large group. +insert into t(a, b) select (case when i < 5 then i else 9 end), i from generate_series(1, 1000) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 70; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 70; + a | b +---+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 9 | 5 + 9 | 6 + 9 | 7 + 9 | 8 + 9 | 9 + 9 | 10 + 9 | 11 + 9 | 12 + 9 | 13 + 9 | 14 + 9 | 15 + 9 | 16 + 9 | 17 + 9 | 18 + 9 | 19 + 9 | 20 + 9 | 21 + 9 | 22 + 9 | 23 + 9 | 24 + 9 | 25 + 9 | 26 + 9 | 27 + 9 | 28 + 9 | 29 + 9 | 30 + 9 | 31 + 9 | 32 + 9 | 33 + 9 | 34 + 9 | 35 + 9 | 36 + 9 | 37 + 9 | 38 + 9 | 39 + 9 | 40 + 9 | 41 + 9 | 42 + 9 | 43 + 9 | 44 + 9 | 45 + 9 | 46 + 9 | 47 + 9 | 48 + 9 | 49 + 9 | 50 + 9 | 51 + 9 | 52 + 9 | 53 + 9 | 54 + 9 | 55 + 9 | 56 + 9 | 57 + 9 | 58 + 9 | 59 + 9 | 60 + 9 | 61 + 9 | 62 + 9 | 63 + 9 | 64 + 9 | 65 + 9 | 66 + 9 | 67 + 9 | 68 + 9 | 69 + 9 | 70 +(70 rows) + +-- Checks case where we hit a group boundary at the last tuple of a batch. +-- Because the full sort state is bounded, we scan 64 tuples (the mode +-- transition point) but only retain 5. Thus when we transition modes, all +-- tuples in the full sort state have different prefix keys. +explain (costs off) select * from (select * from t order by a) s order by a, b limit 5; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 5; + a | b +---+--- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 9 | 5 +(5 rows) + +-- Test rescan. +begin; +-- We force the planner to choose a plan with incremental sort on the right side +-- of a nested loop join node. That way we trigger the rescan code path. +set local enable_hashjoin = off; +set local enable_mergejoin = off; +set local enable_material = off; +set local enable_sort = off; +explain (costs off) select * from t left join (select * from (select * from t order by a) v order by a, b) s on s.a = t.a where t.a in (1, 2); + QUERY PLAN +------------------------------------------------ + Nested Loop Left Join + Join Filter: (t_1.a = t.a) + -> Seq Scan on t + Filter: (a = ANY ('{1,2}'::integer[])) + -> Materialize + -> Incremental Sort + Sort Key: t_1.a, t_1.b + Presorted Key: t_1.a + -> Sort + Sort Key: t_1.a + -> Seq Scan on t t_1 + Optimizer: Postgres query optimizer +(12 rows) + +select * from t left join (select * from (select * from t order by a) v order by a, b) s on s.a = t.a where t.a in (1, 2); + a | b | a | b +---+---+---+--- + 1 | 1 | 1 | 1 + 2 | 2 | 2 | 2 +(2 rows) + +rollback; +-- Test EXPLAIN ANALYZE with both fullsort and presorted groups. +select explain_analyze_without_memory('select * from (select * from t order by a) s order by a, b limit 70'); + explain_analyze_without_memory +---------------------------------------------------------------------------------------------------------------- + Limit (actual rows=70 loops=1) + -> Incremental Sort (actual rows=70 loops=1) + Sort Key: t.a, t.b + Presorted Key: t.a + Full-sort Groups: 1 Sort Method: quicksort Average Memory: NNkB Peak Memory: NNkB + Pre-sorted Groups: 5 Sort Methods: top-N heapsort, quicksort Average Memory: NNkB Peak Memory: NNkB + -> Sort (actual rows=1000 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: NNkB + -> Seq Scan on t (actual rows=1000 loops=1) + Optimizer: Postgres query optimizer +(11 rows) + +select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 70')); + jsonb_pretty +------------------------------------------------- + [ + + { + + "Sort Key": [ + + "t.a", + + "t.b" + + ], + + "Node Type": "Incremental Sort", + + "Actual Rows": 70, + + "Actual Loops": 1, + + "Async Capable": false, + + "Presorted Key": [ + + "t.a" + + ], + + "Parallel Aware": false, + + "Full-sort Groups": { + + "Group Count": 1, + + "Sort Methods Used": [ + + "quicksort" + + ], + + "Sort Space Memory": { + + "Peak Sort Space Used": "NN", + + "Average Sort Space Used": "NN"+ + } + + }, + + "Pre-sorted Groups": { + + "Group Count": 5, + + "Sort Methods Used": [ + + "top-N heapsort", + + "quicksort" + + ], + + "Sort Space Memory": { + + "Peak Sort Space Used": "NN", + + "Average Sort Space Used": "NN"+ + } + + }, + + "Parent Relationship": "Outer" + + } + + ] +(1 row) + +select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 70'); + explain_analyze_inc_sort_nodes_verify_invariants +-------------------------------------------------- + t +(1 row) + +delete from t; +-- Small groups of 10 tuples each tested around each mode transition point. +insert into t(a, b) select i / 10, i from generate_series(1, 1000) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 31; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 31; + a | b +---+---- + 0 | 1 + 0 | 2 + 0 | 3 + 0 | 4 + 0 | 5 + 0 | 6 + 0 | 7 + 0 | 8 + 0 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 2 | 20 + 2 | 21 + 2 | 22 + 2 | 23 + 2 | 24 + 2 | 25 + 2 | 26 + 2 | 27 + 2 | 28 + 2 | 29 + 3 | 30 + 3 | 31 +(31 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 32; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 32; + a | b +---+---- + 0 | 1 + 0 | 2 + 0 | 3 + 0 | 4 + 0 | 5 + 0 | 6 + 0 | 7 + 0 | 8 + 0 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 2 | 20 + 2 | 21 + 2 | 22 + 2 | 23 + 2 | 24 + 2 | 25 + 2 | 26 + 2 | 27 + 2 | 28 + 2 | 29 + 3 | 30 + 3 | 31 + 3 | 32 +(32 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 33; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 33; + a | b +---+---- + 0 | 1 + 0 | 2 + 0 | 3 + 0 | 4 + 0 | 5 + 0 | 6 + 0 | 7 + 0 | 8 + 0 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 2 | 20 + 2 | 21 + 2 | 22 + 2 | 23 + 2 | 24 + 2 | 25 + 2 | 26 + 2 | 27 + 2 | 28 + 2 | 29 + 3 | 30 + 3 | 31 + 3 | 32 + 3 | 33 +(33 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 65; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 65; + a | b +---+---- + 0 | 1 + 0 | 2 + 0 | 3 + 0 | 4 + 0 | 5 + 0 | 6 + 0 | 7 + 0 | 8 + 0 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 2 | 20 + 2 | 21 + 2 | 22 + 2 | 23 + 2 | 24 + 2 | 25 + 2 | 26 + 2 | 27 + 2 | 28 + 2 | 29 + 3 | 30 + 3 | 31 + 3 | 32 + 3 | 33 + 3 | 34 + 3 | 35 + 3 | 36 + 3 | 37 + 3 | 38 + 3 | 39 + 4 | 40 + 4 | 41 + 4 | 42 + 4 | 43 + 4 | 44 + 4 | 45 + 4 | 46 + 4 | 47 + 4 | 48 + 4 | 49 + 5 | 50 + 5 | 51 + 5 | 52 + 5 | 53 + 5 | 54 + 5 | 55 + 5 | 56 + 5 | 57 + 5 | 58 + 5 | 59 + 6 | 60 + 6 | 61 + 6 | 62 + 6 | 63 + 6 | 64 + 6 | 65 +(65 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 66; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 66; + a | b +---+---- + 0 | 1 + 0 | 2 + 0 | 3 + 0 | 4 + 0 | 5 + 0 | 6 + 0 | 7 + 0 | 8 + 0 | 9 + 1 | 10 + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 2 | 20 + 2 | 21 + 2 | 22 + 2 | 23 + 2 | 24 + 2 | 25 + 2 | 26 + 2 | 27 + 2 | 28 + 2 | 29 + 3 | 30 + 3 | 31 + 3 | 32 + 3 | 33 + 3 | 34 + 3 | 35 + 3 | 36 + 3 | 37 + 3 | 38 + 3 | 39 + 4 | 40 + 4 | 41 + 4 | 42 + 4 | 43 + 4 | 44 + 4 | 45 + 4 | 46 + 4 | 47 + 4 | 48 + 4 | 49 + 5 | 50 + 5 | 51 + 5 | 52 + 5 | 53 + 5 | 54 + 5 | 55 + 5 | 56 + 5 | 57 + 5 | 58 + 5 | 59 + 6 | 60 + 6 | 61 + 6 | 62 + 6 | 63 + 6 | 64 + 6 | 65 + 6 | 66 +(66 rows) + +delete from t; +-- Small groups of only 1 tuple each tested around each mode transition point. +insert into t(a, b) select i, i from generate_series(1, 1000) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 31; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 31; + a | b +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 + 11 | 11 + 12 | 12 + 13 | 13 + 14 | 14 + 15 | 15 + 16 | 16 + 17 | 17 + 18 | 18 + 19 | 19 + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 + 31 | 31 +(31 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 32; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 32; + a | b +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 + 11 | 11 + 12 | 12 + 13 | 13 + 14 | 14 + 15 | 15 + 16 | 16 + 17 | 17 + 18 | 18 + 19 | 19 + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 + 31 | 31 + 32 | 32 +(32 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 33; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 33; + a | b +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 + 11 | 11 + 12 | 12 + 13 | 13 + 14 | 14 + 15 | 15 + 16 | 16 + 17 | 17 + 18 | 18 + 19 | 19 + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 + 31 | 31 + 32 | 32 + 33 | 33 +(33 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 65; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 65; + a | b +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 + 11 | 11 + 12 | 12 + 13 | 13 + 14 | 14 + 15 | 15 + 16 | 16 + 17 | 17 + 18 | 18 + 19 | 19 + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 + 31 | 31 + 32 | 32 + 33 | 33 + 34 | 34 + 35 | 35 + 36 | 36 + 37 | 37 + 38 | 38 + 39 | 39 + 40 | 40 + 41 | 41 + 42 | 42 + 43 | 43 + 44 | 44 + 45 | 45 + 46 | 46 + 47 | 47 + 48 | 48 + 49 | 49 + 50 | 50 + 51 | 51 + 52 | 52 + 53 | 53 + 54 | 54 + 55 | 55 + 56 | 56 + 57 | 57 + 58 | 58 + 59 | 59 + 60 | 60 + 61 | 61 + 62 | 62 + 63 | 63 + 64 | 64 + 65 | 65 +(65 rows) + +explain (costs off) select * from (select * from t order by a) s order by a, b limit 66; + QUERY PLAN +------------------------------------- + Limit + -> Incremental Sort + Sort Key: t.a, t.b + Presorted Key: t.a + -> Sort + Sort Key: t.a + -> Seq Scan on t + Optimizer: Postgres query optimizer +(8 rows) + +select * from (select * from t order by a) s order by a, b limit 66; + a | b +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 + 11 | 11 + 12 | 12 + 13 | 13 + 14 | 14 + 15 | 15 + 16 | 16 + 17 | 17 + 18 | 18 + 19 | 19 + 20 | 20 + 21 | 21 + 22 | 22 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 28 | 28 + 29 | 29 + 30 | 30 + 31 | 31 + 32 | 32 + 33 | 33 + 34 | 34 + 35 | 35 + 36 | 36 + 37 | 37 + 38 | 38 + 39 | 39 + 40 | 40 + 41 | 41 + 42 | 42 + 43 | 43 + 44 | 44 + 45 | 45 + 46 | 46 + 47 | 47 + 48 | 48 + 49 | 49 + 50 | 50 + 51 | 51 + 52 | 52 + 53 | 53 + 54 | 54 + 55 | 55 + 56 | 56 + 57 | 57 + 58 | 58 + 59 | 59 + 60 | 60 + 61 | 61 + 62 | 62 + 63 | 63 + 64 | 64 + 65 | 65 + 66 | 66 +(66 rows) + +delete from t; +drop table t; +-- Incremental sort vs. parallel queries +set min_parallel_table_scan_size = '1kB'; +set min_parallel_index_scan_size = '1kB'; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +create table t (a int, b int, c int); +insert into t select mod(i,10),mod(i,10),i from generate_series(1,10000) s(i); +create index on t (a); +analyze t; +set enable_incremental_sort = off; +explain (costs off) select a,b,sum(c) from t group by 1,2 order by 1,2,3 limit 1; + QUERY PLAN +------------------------------------- + Limit + -> Sort + Sort Key: a, b, (sum(c)) + -> HashAggregate + Group Key: a, b + -> Seq Scan on t + Optimizer: Postgres query optimizer +(7 rows) + +set enable_incremental_sort = on; +explain (costs off) select a,b,sum(c) from t group by 1,2 order by 1,2,3 limit 1; + QUERY PLAN +------------------------------------------------------- + Limit + -> Incremental Sort + Sort Key: a, b, (sum(c)) + Presorted Key: a, b + -> GroupAggregate + Group Key: a, b + -> Incremental Sort + Sort Key: a, b + Presorted Key: a + -> Index Scan using t_a_idx on t + Optimizer: Postgres query optimizer +(11 rows) + +-- Incremental sort vs. set operations with varno 0 +set enable_hashagg to off; +explain (costs off) select * from t union select * from t order by 1,3; + QUERY PLAN +------------------------------------------- + Incremental Sort + Sort Key: t.a, t.c + Presorted Key: t.a + -> Unique + Group Key: t.a, t.b, t.c + -> Sort + Sort Key: t.a, t.b, t.c + -> Append + -> Seq Scan on t + -> Seq Scan on t t_1 + Optimizer: Postgres query optimizer +(11 rows) + +-- Full sort, not just incremental sort can be pushed below a gather merge path +-- by generate_useful_gather_paths. +explain (costs off) select distinct a,b from t; + QUERY PLAN +------------------------------------- + Unique + Group Key: a, b + -> Sort + Sort Key: a, b + -> Seq Scan on t + Optimizer: Postgres query optimizer +(6 rows) + +drop table t; +-- Sort pushdown can't go below where expressions are part of the rel target. +-- In particular this is interesting for volatile expressions which have to +-- go above joins since otherwise we'll incorrectly use expression evaluations +-- across multiple rows. +set enable_hashagg=off; +set enable_seqscan=off; +set enable_incremental_sort = off; +set parallel_tuple_cost=0; +set parallel_setup_cost=0; +set min_parallel_table_scan_size = 0; +set min_parallel_index_scan_size = 0; +-- Parallel sort below join. +explain (costs off) select distinct sub.unique1, stringu1 +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub; + QUERY PLAN +----------------------------------------------------------- + Unique + Group Key: tenk1.unique1, tenk1.stringu1 + -> Sort + Sort Key: tenk1.unique1, tenk1.stringu1 + -> Nested Loop + -> Index Scan using tenk1_unique1 on tenk1 + -> Function Scan on generate_series + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select sub.unique1, stringu1 +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub +order by 1, 2; + QUERY PLAN +----------------------------------------------------- + Sort + Sort Key: tenk1.unique1, tenk1.stringu1 + -> Nested Loop + -> Index Scan using tenk1_unique1 on tenk1 + -> Function Scan on generate_series + Optimizer: Postgres query optimizer +(6 rows) + +-- Parallel sort but with expression that can be safely generated at the base rel. +explain (costs off) select distinct sub.unique1, md5(stringu1) +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub; + QUERY PLAN +---------------------------------------------------------------------------- + Unique + Group Key: tenk1.unique1, (md5((tenk1.stringu1)::text)) + -> Sort + Sort Key: tenk1.unique1, (md5((tenk1.stringu1)::text)) COLLATE "C" + -> Nested Loop + -> Index Scan using tenk1_unique1 on tenk1 + -> Function Scan on generate_series + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select sub.unique1, md5(stringu1) +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub +order by 1, 2; + QUERY PLAN +---------------------------------------------------------------------- + Sort + Sort Key: tenk1.unique1, (md5((tenk1.stringu1)::text)) COLLATE "C" + -> Nested Loop + -> Index Scan using tenk1_unique1 on tenk1 + -> Function Scan on generate_series + Optimizer: Postgres query optimizer +(6 rows) + +-- Parallel sort with an aggregate that can be safely generated in parallel, +-- but we can't sort by partial aggregate values. +explain (costs off) select count(*) +from tenk1 t1 +join tenk1 t2 on t1.unique1 = t2.unique2 +join tenk1 t3 on t2.unique1 = t3.unique1 +order by count(*); + QUERY PLAN +------------------------------------------------------------------------------- + Sort + Sort Key: (count(*)) + -> Aggregate + -> Hash Join + Hash Cond: (t2.unique1 = t3.unique1) + -> Hash Join + Hash Cond: (t2.unique2 = t1.unique1) + -> Index Scan using tenk1_unique2 on tenk1 t2 + -> Hash + -> Index Only Scan using tenk1_unique1 on tenk1 t1 + -> Hash + -> Index Only Scan using tenk1_unique1 on tenk1 t3 + Optimizer: Postgres query optimizer +(13 rows) + +-- Parallel sort but with expression (correlated subquery) that +-- is prohibited in parallel plans. +explain (costs off) select distinct + unique1, + (select t.unique1 from tenk1 where tenk1.unique1 = t.unique1) +from tenk1 t, generate_series(1, 1000); + QUERY PLAN +------------------------------------------------------------------ + Unique + Group Key: t.unique1, ((SubPlan 1)) + -> Sort + Sort Key: t.unique1, ((SubPlan 1)) + -> Nested Loop + -> Index Only Scan using tenk1_unique1 on tenk1 t + -> Function Scan on generate_series + SubPlan 1 + -> Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = t.unique1) + Optimizer: Postgres query optimizer +(11 rows) + +explain (costs off) select + unique1, + (select t.unique1 from tenk1 where tenk1.unique1 = t.unique1) +from tenk1 t, generate_series(1, 1000) +order by 1, 2; + QUERY PLAN +------------------------------------------------------------ + Sort + Sort Key: t.unique1, ((SubPlan 1)) + -> Nested Loop + -> Index Only Scan using tenk1_unique1 on tenk1 t + -> Function Scan on generate_series + SubPlan 1 + -> Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = t.unique1) + Optimizer: Postgres query optimizer +(9 rows) + +-- Parallel sort but with expression not available until the upper rel. +explain (costs off) select distinct sub.unique1, stringu1 || random()::text +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub; + QUERY PLAN +--------------------------------------------------------------------------------------------- + Unique + Group Key: tenk1.unique1, (((tenk1.stringu1)::text || (random())::text)) + -> Sort + Sort Key: tenk1.unique1, (((tenk1.stringu1)::text || (random())::text)) COLLATE "C" + -> Nested Loop + -> Index Scan using tenk1_unique1 on tenk1 + -> Function Scan on generate_series + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select sub.unique1, stringu1 || random()::text +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub +order by 1, 2; + QUERY PLAN +--------------------------------------------------------------------------------------- + Sort + Sort Key: tenk1.unique1, (((tenk1.stringu1)::text || (random())::text)) COLLATE "C" + -> Nested Loop + -> Index Scan using tenk1_unique1 on tenk1 + -> Function Scan on generate_series + Optimizer: Postgres query optimizer +(6 rows) + +-- Disallow pushing down sort when pathkey is an SRF. +explain (costs off) select unique1 from tenk1 order by unnest('{1,2}'::int[]); + QUERY PLAN +---------------------------------------------------------- + Sort + Sort Key: (unnest('{1,2}'::anyarray)) + -> ProjectSet + -> Index Only Scan using tenk1_unique1 on tenk1 + Optimizer: Postgres query optimizer +(5 rows) + diff --git a/src/test/singlenode_regress/expected/index_including.out b/src/test/singlenode_regress/expected/index_including.out new file mode 100644 index 00000000000..bda8e5c3e7b --- /dev/null +++ b/src/test/singlenode_regress/expected/index_including.out @@ -0,0 +1,404 @@ +/* + * 1.test CREATE INDEX + * + * Deliberately avoid dropping objects in this section, to get some pg_dump + * coverage. + */ +-- Regular index with included columns +CREATE TABLE tbl_include_reg (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_reg SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE INDEX tbl_include_reg_idx ON tbl_include_reg (c1, c2) INCLUDE (c3, c4); +-- duplicate column is pretty pointless, but we allow it anyway +CREATE INDEX ON tbl_include_reg (c1, c2) INCLUDE (c1, c3); +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_include_reg'::regclass ORDER BY c.relname; + pg_get_indexdef +--------------------------------------------------------------------------------------------------------------- + CREATE INDEX tbl_include_reg_c1_c2_c11_c3_idx ON public.tbl_include_reg USING btree (c1, c2) INCLUDE (c1, c3) + CREATE INDEX tbl_include_reg_idx ON public.tbl_include_reg USING btree (c1, c2) INCLUDE (c3, c4) +(2 rows) + +\d tbl_include_reg_idx + Index "public.tbl_include_reg_idx" + Column | Type | Key? | Definition +--------+---------+------+------------ + c1 | integer | yes | c1 + c2 | integer | yes | c2 + c3 | integer | no | c3 + c4 | box | no | c4 +btree, for table "public.tbl_include_reg" + +-- Unique index and unique constraint +CREATE TABLE tbl_include_unique1 (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_unique1 SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE UNIQUE INDEX tbl_include_unique1_idx_unique ON tbl_include_unique1 using btree (c1, c2) INCLUDE (c3, c4); +ALTER TABLE tbl_include_unique1 add UNIQUE USING INDEX tbl_include_unique1_idx_unique; +ALTER TABLE tbl_include_unique1 add UNIQUE (c1, c2) INCLUDE (c3, c4); +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_include_unique1'::regclass ORDER BY c.relname; + pg_get_indexdef +----------------------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX tbl_include_unique1_c1_c2_c3_c4_key ON public.tbl_include_unique1 USING btree (c1, c2) INCLUDE (c3, c4) + CREATE UNIQUE INDEX tbl_include_unique1_idx_unique ON public.tbl_include_unique1 USING btree (c1, c2) INCLUDE (c3, c4) +(2 rows) + +-- Unique index and unique constraint. Both must fail. +CREATE TABLE tbl_include_unique2 (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_unique2 SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE UNIQUE INDEX tbl_include_unique2_idx_unique ON tbl_include_unique2 using btree (c1, c2) INCLUDE (c3, c4); +ERROR: could not create unique index "tbl_include_unique2_idx_unique" +DETAIL: Key (c1, c2)=(1, 2) is duplicated. +ALTER TABLE tbl_include_unique2 add UNIQUE (c1, c2) INCLUDE (c3, c4); +ERROR: could not create unique index "tbl_include_unique2_c1_c2_c3_c4_key" +DETAIL: Key (c1, c2)=(1, 2) is duplicated. +-- PK constraint +CREATE TABLE tbl_include_pk (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_pk SELECT 1, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ALTER TABLE tbl_include_pk add PRIMARY KEY (c1, c2) INCLUDE (c3, c4); +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_include_pk'::regclass ORDER BY c.relname; + pg_get_indexdef +-------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX tbl_include_pk_pkey ON public.tbl_include_pk USING btree (c1, c2) INCLUDE (c3, c4) +(1 row) + +CREATE TABLE tbl_include_box (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_box SELECT 1, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE UNIQUE INDEX tbl_include_box_idx_unique ON tbl_include_box using btree (c1, c2) INCLUDE (c3, c4); +ALTER TABLE tbl_include_box add PRIMARY KEY USING INDEX tbl_include_box_idx_unique; +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_include_box'::regclass ORDER BY c.relname; + pg_get_indexdef +---------------------------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX tbl_include_box_idx_unique ON public.tbl_include_box USING btree (c1, c2) INCLUDE (c3, c4) +(1 row) + +-- PK constraint. Must fail. +CREATE TABLE tbl_include_box_pk (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_box_pk SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ALTER TABLE tbl_include_box_pk add PRIMARY KEY (c1, c2) INCLUDE (c3, c4); +ERROR: could not create unique index "tbl_include_box_pk_pkey" +DETAIL: Key (c1, c2)=(1, 2) is duplicated. +/* + * 2. Test CREATE TABLE with constraint + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + CONSTRAINT covering UNIQUE(c1,c2) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; + indexrelid | indnatts | indnkeyatts | indisunique | indisprimary | indkey | indclass +------------+----------+-------------+-------------+--------------+---------+----------- + covering | 4 | 2 | t | f | 1 2 3 4 | 1978 1978 +(1 row) + +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; + pg_get_constraintdef | conname | conkey +----------------------------------+----------+-------- + UNIQUE (c1, c2) INCLUDE (c3, c4) | covering | {1,2} +(1 row) + +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ERROR: duplicate key value violates unique constraint "covering" +DETAIL: Key (c1, c2)=(1, 2) already exists. +DROP TABLE tbl; +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + CONSTRAINT covering PRIMARY KEY(c1,c2) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; + indexrelid | indnatts | indnkeyatts | indisunique | indisprimary | indkey | indclass +------------+----------+-------------+-------------+--------------+---------+----------- + covering | 4 | 2 | t | t | 1 2 3 4 | 1978 1978 +(1 row) + +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; + pg_get_constraintdef | conname | conkey +---------------------------------------+----------+-------- + PRIMARY KEY (c1, c2) INCLUDE (c3, c4) | covering | {1,2} +(1 row) + +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ERROR: duplicate key value violates unique constraint "covering" +DETAIL: Key (c1, c2)=(1, 2) already exists. +INSERT INTO tbl SELECT 1, NULL, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ERROR: null value in column "c2" of relation "tbl" violates not-null constraint +DETAIL: Failing row contains (1, null, 3, (4,4),(4,4)). +INSERT INTO tbl SELECT x, 2*x, NULL, NULL FROM generate_series(1,300) AS x; +explain (costs off) +select * from tbl where (c1,c2,c3) < (2,5,1); + QUERY PLAN +------------------------------------------------ + Bitmap Heap Scan on tbl + Filter: (ROW(c1, c2, c3) < ROW(2, 5, 1)) + -> Bitmap Index Scan on covering + Index Cond: (ROW(c1, c2) <= ROW(2, 5)) +(4 rows) + +select * from tbl where (c1,c2,c3) < (2,5,1); + c1 | c2 | c3 | c4 +----+----+----+---- + 1 | 2 | | + 2 | 4 | | +(2 rows) + +-- row comparison that compares high key at page boundary +SET enable_seqscan = off; +explain (costs off) +select * from tbl where (c1,c2,c3) < (262,1,1) limit 1; + QUERY PLAN +---------------------------------------------------- + Limit + -> Index Only Scan using covering on tbl + Index Cond: (ROW(c1, c2) <= ROW(262, 1)) + Filter: (ROW(c1, c2, c3) < ROW(262, 1, 1)) +(4 rows) + +select * from tbl where (c1,c2,c3) < (262,1,1) limit 1; + c1 | c2 | c3 | c4 +----+----+----+---- + 1 | 2 | | +(1 row) + +DROP TABLE tbl; +RESET enable_seqscan; +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + UNIQUE(c1,c2) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; + indexrelid | indnatts | indnkeyatts | indisunique | indisprimary | indkey | indclass +---------------------+----------+-------------+-------------+--------------+---------+----------- + tbl_c1_c2_c3_c4_key | 4 | 2 | t | f | 1 2 3 4 | 1978 1978 +(1 row) + +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; + pg_get_constraintdef | conname | conkey +----------------------------------+---------------------+-------- + UNIQUE (c1, c2) INCLUDE (c3, c4) | tbl_c1_c2_c3_c4_key | {1,2} +(1 row) + +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ERROR: duplicate key value violates unique constraint "tbl_c1_c2_c3_c4_key" +DETAIL: Key (c1, c2)=(1, 2) already exists. +DROP TABLE tbl; +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + PRIMARY KEY(c1,c2) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; + indexrelid | indnatts | indnkeyatts | indisunique | indisprimary | indkey | indclass +------------+----------+-------------+-------------+--------------+---------+----------- + tbl_pkey | 4 | 2 | t | t | 1 2 3 4 | 1978 1978 +(1 row) + +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; + pg_get_constraintdef | conname | conkey +---------------------------------------+----------+-------- + PRIMARY KEY (c1, c2) INCLUDE (c3, c4) | tbl_pkey | {1,2} +(1 row) + +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ERROR: duplicate key value violates unique constraint "tbl_pkey" +DETAIL: Key (c1, c2)=(1, 2) already exists. +INSERT INTO tbl SELECT 1, NULL, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ERROR: null value in column "c2" of relation "tbl" violates not-null constraint +DETAIL: Failing row contains (1, null, 3, (4,4),(4,4)). +INSERT INTO tbl SELECT x, 2*x, NULL, NULL FROM generate_series(1,10) AS x; +DROP TABLE tbl; +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + EXCLUDE USING btree (c1 WITH =) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; + indexrelid | indnatts | indnkeyatts | indisunique | indisprimary | indkey | indclass +-------------------+----------+-------------+-------------+--------------+--------+---------- + tbl_c1_c3_c4_excl | 3 | 1 | f | f | 1 3 4 | 1978 +(1 row) + +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; + pg_get_constraintdef | conname | conkey +--------------------------------------------------+-------------------+-------- + EXCLUDE USING btree (c1 WITH =) INCLUDE (c3, c4) | tbl_c1_c3_c4_excl | {1} +(1 row) + +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ERROR: conflicting key value violates exclusion constraint "tbl_c1_c3_c4_excl" +DETAIL: Key (c1)=(1) conflicts with existing key (c1)=(1). +INSERT INTO tbl SELECT x, 2*x, NULL, NULL FROM generate_series(1,10) AS x; +DROP TABLE tbl; +/* + * 3.0 Test ALTER TABLE DROP COLUMN. + * Any column deletion leads to index deletion. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 int); +CREATE UNIQUE INDEX tbl_idx ON tbl using btree(c1, c2, c3, c4); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +------------------------------------------------------------------------ + CREATE UNIQUE INDEX tbl_idx ON public.tbl USING btree (c1, c2, c3, c4) +(1 row) + +ALTER TABLE tbl DROP COLUMN c3; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +---------- +(0 rows) + +DROP TABLE tbl; +/* + * 3.1 Test ALTER TABLE DROP COLUMN. + * Included column deletion leads to the index deletion, + * AS well AS key columns deletion. It's explained in documentation. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box); +CREATE UNIQUE INDEX tbl_idx ON tbl using btree(c1, c2) INCLUDE(c3,c4); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +--------------------------------------------------------------------------------- + CREATE UNIQUE INDEX tbl_idx ON public.tbl USING btree (c1, c2) INCLUDE (c3, c4) +(1 row) + +ALTER TABLE tbl DROP COLUMN c3; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +---------- +(0 rows) + +DROP TABLE tbl; +/* + * 3.2 Test ALTER TABLE DROP COLUMN. + * Included column deletion leads to the index deletion. + * AS well AS key columns deletion. It's explained in documentation. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4)); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +--------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX tbl_c1_c2_c3_c4_key ON public.tbl USING btree (c1, c2) INCLUDE (c3, c4) +(1 row) + +ALTER TABLE tbl DROP COLUMN c3; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +---------- +(0 rows) + +ALTER TABLE tbl DROP COLUMN c1; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +---------- +(0 rows) + +DROP TABLE tbl; +/* + * 3.3 Test ALTER TABLE SET STATISTICS + */ +CREATE TABLE tbl (c1 int, c2 int); +CREATE INDEX tbl_idx ON tbl (c1, (c1+0)) INCLUDE (c2); +ALTER INDEX tbl_idx ALTER COLUMN 1 SET STATISTICS 1000; +ERROR: cannot alter statistics on non-expression column "c1" of index "tbl_idx" +HINT: Alter statistics on table column instead. +ALTER INDEX tbl_idx ALTER COLUMN 2 SET STATISTICS 1000; +ALTER INDEX tbl_idx ALTER COLUMN 3 SET STATISTICS 1000; +ERROR: cannot alter statistics on included column "c2" of index "tbl_idx" +ALTER INDEX tbl_idx ALTER COLUMN 4 SET STATISTICS 1000; +ERROR: column number 4 of relation "tbl_idx" does not exist +DROP TABLE tbl; +/* + * 4. CREATE INDEX CONCURRENTLY + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4)); +INSERT INTO tbl SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,1000) AS x; +CREATE UNIQUE INDEX CONCURRENTLY on tbl (c1, c2) INCLUDE (c3, c4); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +--------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX tbl_c1_c2_c3_c4_idx ON public.tbl USING btree (c1, c2) INCLUDE (c3, c4) + CREATE UNIQUE INDEX tbl_c1_c2_c3_c4_key ON public.tbl USING btree (c1, c2) INCLUDE (c3, c4) +(2 rows) + +DROP TABLE tbl; +/* + * 5. REINDEX + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4)); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +--------------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX tbl_c1_c2_c3_c4_key ON public.tbl USING btree (c1, c2) INCLUDE (c3, c4) +(1 row) + +ALTER TABLE tbl DROP COLUMN c3; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +---------- +(0 rows) + +REINDEX INDEX tbl_c1_c2_c3_c4_key; +ERROR: relation "tbl_c1_c2_c3_c4_key" does not exist +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +---------- +(0 rows) + +ALTER TABLE tbl DROP COLUMN c1; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; + indexdef +---------- +(0 rows) + +DROP TABLE tbl; +/* + * 7. Check various AMs. All but btree, gist and spgist must fail. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 box, c4 box); +CREATE INDEX on tbl USING brin(c1, c2) INCLUDE (c3, c4); +ERROR: access method "brin" does not support included columns +CREATE INDEX on tbl USING gist(c3) INCLUDE (c1, c4); +CREATE INDEX on tbl USING spgist(c3) INCLUDE (c4); +CREATE INDEX on tbl USING gin(c1, c2) INCLUDE (c3, c4); +ERROR: access method "gin" does not support included columns +CREATE INDEX on tbl USING hash(c1, c2) INCLUDE (c3, c4); +ERROR: access method "hash" does not support included columns +CREATE INDEX on tbl USING rtree(c3) INCLUDE (c1, c4); +NOTICE: substituting access method "gist" for obsolete method "rtree" +CREATE INDEX on tbl USING btree(c1, c2) INCLUDE (c3, c4); +DROP TABLE tbl; +/* + * 8. Update, delete values in indexed table. + */ +CREATE TABLE tbl (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE UNIQUE INDEX tbl_idx_unique ON tbl using btree(c1, c2) INCLUDE (c3,c4); +UPDATE tbl SET c1 = 100 WHERE c1 = 2; +UPDATE tbl SET c1 = 1 WHERE c1 = 3; +-- should fail +UPDATE tbl SET c2 = 2 WHERE c1 = 1; +ERROR: duplicate key value violates unique constraint "tbl_idx_unique" +DETAIL: Key (c1, c2)=(1, 2) already exists. +UPDATE tbl SET c3 = 1; +DELETE FROM tbl WHERE c1 = 5 OR c3 = 12; +DROP TABLE tbl; +/* + * 9. Alter column type. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4)); +INSERT INTO tbl SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ALTER TABLE tbl ALTER c1 TYPE bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +ALTER TABLE tbl ALTER c3 TYPE bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +\d tbl + Table "public.tbl" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + c3 | integer | | | + c4 | box | | | +Indexes: + "tbl_c1_c2_c3_c4_key" UNIQUE CONSTRAINT, btree (c1, c2) INCLUDE (c3, c4) + +DROP TABLE tbl; diff --git a/src/test/singlenode_regress/expected/index_including_gist.out b/src/test/singlenode_regress/expected/index_including_gist.out new file mode 100644 index 00000000000..064a12b8bdc --- /dev/null +++ b/src/test/singlenode_regress/expected/index_including_gist.out @@ -0,0 +1,171 @@ +/* + * 1.1. test CREATE INDEX with buffered build + */ +-- Regular index with included columns +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +-- size is chosen to exceed page size and trigger actual truncation +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,8000) AS x; +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c2,c3); +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_gist'::regclass ORDER BY c.relname; + pg_get_indexdef +----------------------------------------------------------------------------------- + CREATE INDEX tbl_gist_idx ON public.tbl_gist USING gist (c4) INCLUDE (c1, c2, c3) +(1 row) + +SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); + c1 | c2 | c3 | c4 +----+----+----+------------- + 1 | 2 | 3 | (2,3),(1,2) + 2 | 4 | 6 | (4,5),(2,3) + 3 | 6 | 9 | (6,7),(3,4) + 4 | 8 | 12 | (8,9),(4,5) +(4 rows) + +SET enable_bitmapscan TO off; +EXPLAIN (costs off) SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); + QUERY PLAN +------------------------------------------------ + Index Only Scan using tbl_gist_idx on tbl_gist + Index Cond: (c4 <@ '(10,10),(1,1)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SET enable_bitmapscan TO default; +DROP TABLE tbl_gist; +/* + * 1.2. test CREATE INDEX with inserts + */ +-- Regular index with included columns +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +-- size is chosen to exceed page size and trigger actual truncation +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c2,c3); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,8000) AS x; +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_gist'::regclass ORDER BY c.relname; + pg_get_indexdef +----------------------------------------------------------------------------------- + CREATE INDEX tbl_gist_idx ON public.tbl_gist USING gist (c4) INCLUDE (c1, c2, c3) +(1 row) + +SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); + c1 | c2 | c3 | c4 +----+----+----+------------- + 1 | 2 | 3 | (2,3),(1,2) + 2 | 4 | 6 | (4,5),(2,3) + 3 | 6 | 9 | (6,7),(3,4) + 4 | 8 | 12 | (8,9),(4,5) +(4 rows) + +SET enable_bitmapscan TO off; +EXPLAIN (costs off) SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); + QUERY PLAN +------------------------------------------------ + Index Only Scan using tbl_gist_idx on tbl_gist + Index Cond: (c4 <@ '(10,10),(1,1)'::box) + Optimizer: Postgres query optimizer +(3 rows) + +SET enable_bitmapscan TO default; +DROP TABLE tbl_gist; +/* + * 2. CREATE INDEX CONCURRENTLY + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +CREATE INDEX CONCURRENTLY tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c2,c3); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl_gist' ORDER BY indexname; + indexdef +----------------------------------------------------------------------------------- + CREATE INDEX tbl_gist_idx ON public.tbl_gist USING gist (c4) INCLUDE (c1, c2, c3) +(1 row) + +DROP TABLE tbl_gist; +/* + * 3. REINDEX + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c3); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl_gist' ORDER BY indexname; + indexdef +------------------------------------------------------------------------------- + CREATE INDEX tbl_gist_idx ON public.tbl_gist USING gist (c4) INCLUDE (c1, c3) +(1 row) + +REINDEX INDEX tbl_gist_idx; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl_gist' ORDER BY indexname; + indexdef +------------------------------------------------------------------------------- + CREATE INDEX tbl_gist_idx ON public.tbl_gist USING gist (c4) INCLUDE (c1, c3) +(1 row) + +ALTER TABLE tbl_gist DROP COLUMN c1; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl_gist' ORDER BY indexname; + indexdef +---------- +(0 rows) + +DROP TABLE tbl_gist; +/* + * 4. Update, delete values in indexed table. + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c3); +UPDATE tbl_gist SET c1 = 100 WHERE c1 = 2; +UPDATE tbl_gist SET c1 = 1 WHERE c1 = 3; +DELETE FROM tbl_gist WHERE c1 = 5 OR c3 = 12; +DROP TABLE tbl_gist; +/* + * 5. Alter column type. + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c3); +ALTER TABLE tbl_gist ALTER c1 TYPE bigint; +ALTER TABLE tbl_gist ALTER c3 TYPE bigint; +\d tbl_gist + Table "public.tbl_gist" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | bigint | | | + c2 | integer | | | + c3 | bigint | | | + c4 | box | | | +Indexes: + "tbl_gist_idx" gist (c4) INCLUDE (c1, c3) + +DROP TABLE tbl_gist; +/* + * 6. EXCLUDE constraint. + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box, EXCLUDE USING gist (c4 WITH &&) INCLUDE (c1, c2, c3)); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +ERROR: conflicting key value violates exclusion constraint "tbl_gist_c4_c1_c2_c3_excl" +DETAIL: Key (c4)=((4,5),(2,3)) conflicts with existing key (c4)=((2,3),(1,2)). +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(3*x,2*x),point(3*x+1,2*x+1)) FROM generate_series(1,10) AS x; +EXPLAIN (costs off) SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); + QUERY PLAN +------------------------------------------------------ + Bitmap Heap Scan on tbl_gist + Recheck Cond: (c4 <@ '(10,10),(1,1)'::box) + -> Bitmap Index Scan on tbl_gist_c4_c1_c2_c3_excl + Index Cond: (c4 <@ '(10,10),(1,1)'::box) + Optimizer: Postgres query optimizer +(5 rows) + +\d tbl_gist + Table "public.tbl_gist" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c1 | integer | | | + c2 | integer | | | + c3 | integer | | | + c4 | box | | | +Indexes: + "tbl_gist_c4_c1_c2_c3_excl" EXCLUDE USING gist (c4 WITH &&) INCLUDE (c1, c2, c3) + +DROP TABLE tbl_gist; diff --git a/src/test/singlenode_regress/expected/indexing.out b/src/test/singlenode_regress/expected/indexing.out new file mode 100644 index 00000000000..c93f4470c92 --- /dev/null +++ b/src/test/singlenode_regress/expected/indexing.out @@ -0,0 +1,1358 @@ +-- Creating an index on a partitioned table makes the partitions +-- automatically get the index +create table idxpart (a int, b int, c text) partition by range (a); +-- relhassubclass of a partitioned index is false before creating any partition. +-- It will be set after the first partition is created. +create index idxpart_idx on idxpart (a); +select relhassubclass from pg_class where relname = 'idxpart_idx'; + relhassubclass +---------------- + f +(1 row) + +-- Check that partitioned indexes are present in pg_indexes. +select indexdef from pg_indexes where indexname like 'idxpart_idx%'; + indexdef +----------------------------------------------------------------- + CREATE INDEX idxpart_idx ON ONLY public.idxpart USING btree (a) +(1 row) + +drop index idxpart_idx; +create table idxpart1 partition of idxpart for values from (0) to (10); +create table idxpart2 partition of idxpart for values from (10) to (100) + partition by range (b); +create table idxpart21 partition of idxpart2 for values from (0) to (100); +-- Even with partitions, relhassubclass should not be set if a partitioned +-- index is created only on the parent. +create index idxpart_idx on only idxpart(a); +select relhassubclass from pg_class where relname = 'idxpart_idx'; + relhassubclass +---------------- + f +(1 row) + +drop index idxpart_idx; +create index on idxpart (a); +select relname, relkind, relhassubclass, inhparent::regclass + from pg_class left join pg_index ix on (indexrelid = oid) + left join pg_inherits on (ix.indexrelid = inhrelid) + where relname like 'idxpart%' order by relname; + relname | relkind | relhassubclass | inhparent +-----------------+---------+----------------+---------------- + idxpart | p | t | + idxpart1 | r | f | + idxpart1_a_idx | i | f | idxpart_a_idx + idxpart2 | p | t | + idxpart21 | r | f | + idxpart21_a_idx | i | f | idxpart2_a_idx + idxpart2_a_idx | I | t | idxpart_a_idx + idxpart_a_idx | I | t | +(8 rows) + +drop table idxpart; +-- Some unsupported features +create table idxpart (a int, b int, c text) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (10); +create index concurrently on idxpart (a); +ERROR: cannot create index on partitioned table "idxpart" concurrently +drop table idxpart; +-- Verify bugfix with query on indexed partitioned table with no partitions +-- https://postgr.es/m/20180124162006.pmapfiznhgngwtjf@alvherre.pgsql +CREATE TABLE idxpart (col1 INT) PARTITION BY RANGE (col1); +CREATE INDEX ON idxpart (col1); +CREATE TABLE idxpart_two (col2 INT); +SELECT col2 FROM idxpart_two fk LEFT OUTER JOIN idxpart pk ON (col1 = col2); + col2 +------ +(0 rows) + +DROP table idxpart, idxpart_two; +-- Verify bugfix with index rewrite on ALTER TABLE / SET DATA TYPE +-- https://postgr.es/m/CAKcux6mxNCGsgATwf5CGMF8g4WSupCXicCVMeKUTuWbyxHOMsQ@mail.gmail.com +CREATE TABLE idxpart (a INT, b TEXT, c INT) PARTITION BY RANGE(a); +CREATE TABLE idxpart1 PARTITION OF idxpart FOR VALUES FROM (MINVALUE) TO (MAXVALUE); +CREATE INDEX partidx_abc_idx ON idxpart (a, b, c); +INSERT INTO idxpart (a, b, c) SELECT i, i, i FROM generate_series(1, 50) i; +ALTER TABLE idxpart ALTER COLUMN c TYPE numeric; +DROP TABLE idxpart; +-- If a table without index is attached as partition to a table with +-- an index, the index is automatically created +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +create table idxpart1 (like idxpart); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | + +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | +Partition of: idxpart FOR VALUES FROM (0) TO (10) +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_b_c_idx" btree (b, c) + +\d+ idxpart1_a_idx + Index "public.idxpart1_a_idx" + Column | Type | Key? | Definition | Storage | Stats target +--------+---------+------+------------+---------+-------------- + a | integer | yes | a | plain | +Partition of: idxparti +No partition constraint +btree, for table "public.idxpart1" + +\d+ idxpart1_b_c_idx + Index "public.idxpart1_b_c_idx" + Column | Type | Key? | Definition | Storage | Stats target +--------+---------+------+------------+----------+-------------- + b | integer | yes | b | plain | + c | text | yes | c | extended | +Partition of: idxparti2 +No partition constraint +btree, for table "public.idxpart1" + +-- Forbid ALTER TABLE when attaching or detaching an index to a partition. +create index idxpart_c on only idxpart (c); +create index idxpart1_c on idxpart1 (c); +alter table idxpart_c attach partition idxpart1_c for values from (10) to (20); +ERROR: "idxpart_c" is not a partitioned table +alter index idxpart_c attach partition idxpart1_c; +select relname, relpartbound from pg_class + where relname in ('idxpart_c', 'idxpart1_c') + order by relname; + relname | relpartbound +------------+-------------- + idxpart1_c | + idxpart_c | +(2 rows) + +alter table idxpart_c detach partition idxpart1_c; +ERROR: "idxpart_c" is not a table +drop table idxpart; +-- If a partition already has an index, don't create a duplicative one +create table idxpart (a int, b int) partition by range (a, b); +create table idxpart1 partition of idxpart for values from (0, 0) to (10, 10); +create index on idxpart1 (a, b); +create index on idxpart (a, b); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: idxpart FOR VALUES FROM (0, 0) TO (10, 10) +Indexes: + "idxpart1_a_b_idx" btree (a, b) + +select relname, relkind, relhassubclass, inhparent::regclass + from pg_class left join pg_index ix on (indexrelid = oid) + left join pg_inherits on (ix.indexrelid = inhrelid) + where relname like 'idxpart%' order by relname; + relname | relkind | relhassubclass | inhparent +------------------+---------+----------------+----------------- + idxpart | p | t | + idxpart1 | r | f | + idxpart1_a_b_idx | i | f | idxpart_a_b_idx + idxpart_a_b_idx | I | t | +(4 rows) + +drop table idxpart; +-- DROP behavior for partitioned indexes +create table idxpart (a int) partition by range (a); +create index on idxpart (a); +create table idxpart1 partition of idxpart for values from (0) to (10); +drop index idxpart1_a_idx; -- no way +ERROR: cannot drop index idxpart1_a_idx because index idxpart_a_idx requires it +HINT: You can drop index idxpart_a_idx instead. +drop index concurrently idxpart_a_idx; -- unsupported +ERROR: cannot drop partitioned index "idxpart_a_idx" concurrently +drop index idxpart_a_idx; -- both indexes go away +select relname, relkind from pg_class + where relname like 'idxpart%' order by relname; + relname | relkind +----------+--------- + idxpart | p + idxpart1 | r +(2 rows) + +create index on idxpart (a); +drop table idxpart1; -- the index on partition goes away too +select relname, relkind from pg_class + where relname like 'idxpart%' order by relname; + relname | relkind +---------------+--------- + idxpart | p + idxpart_a_idx | I +(2 rows) + +drop table idxpart; +-- DROP behavior with temporary partitioned indexes +create temp table idxpart_temp (a int) partition by range (a); +create index on idxpart_temp(a); +create temp table idxpart1_temp partition of idxpart_temp + for values from (0) to (10); +drop index idxpart1_temp_a_idx; -- error +ERROR: cannot drop index idxpart1_temp_a_idx because index idxpart_temp_a_idx requires it +HINT: You can drop index idxpart_temp_a_idx instead. +-- non-concurrent drop is enforced here, so it is a valid case. +drop index concurrently idxpart_temp_a_idx; +select relname, relkind from pg_class + where relname like 'idxpart_temp%' order by relname; + relname | relkind +--------------+--------- + idxpart_temp | p +(1 row) + +drop table idxpart_temp; +-- ALTER INDEX .. ATTACH, error cases +create table idxpart (a int, b int) partition by range (a, b); +create table idxpart1 partition of idxpart for values from (0, 0) to (10, 10); +create index idxpart_a_b_idx on only idxpart (a, b); +create index idxpart1_a_b_idx on idxpart1 (a, b); +create index idxpart1_tst1 on idxpart1 (b, a); +create index idxpart1_tst2 on idxpart1 using hash (a); +create index idxpart1_tst3 on idxpart1 (a, b) where a > 10; +alter index idxpart attach partition idxpart1; +ERROR: "idxpart" is not an index +alter index idxpart_a_b_idx attach partition idxpart1; +ERROR: "idxpart1" is not an index +alter index idxpart_a_b_idx attach partition idxpart_a_b_idx; +ERROR: cannot attach index "idxpart_a_b_idx" as a partition of index "idxpart_a_b_idx" +DETAIL: Index "idxpart_a_b_idx" is not an index on any partition of table "idxpart". +alter index idxpart_a_b_idx attach partition idxpart1_b_idx; +ERROR: relation "idxpart1_b_idx" does not exist +alter index idxpart_a_b_idx attach partition idxpart1_tst1; +ERROR: cannot attach index "idxpart1_tst1" as a partition of index "idxpart_a_b_idx" +DETAIL: The index definitions do not match. +alter index idxpart_a_b_idx attach partition idxpart1_tst2; +ERROR: cannot attach index "idxpart1_tst2" as a partition of index "idxpart_a_b_idx" +DETAIL: The index definitions do not match. +alter index idxpart_a_b_idx attach partition idxpart1_tst3; +ERROR: cannot attach index "idxpart1_tst3" as a partition of index "idxpart_a_b_idx" +DETAIL: The index definitions do not match. +-- OK +alter index idxpart_a_b_idx attach partition idxpart1_a_b_idx; +alter index idxpart_a_b_idx attach partition idxpart1_a_b_idx; -- quiet +-- reject dupe +create index idxpart1_2_a_b on idxpart1 (a, b); +alter index idxpart_a_b_idx attach partition idxpart1_2_a_b; +ERROR: cannot attach index "idxpart1_2_a_b" as a partition of index "idxpart_a_b_idx" +DETAIL: Another index is already attached for partition "idxpart1". +drop table idxpart; +-- make sure everything's gone +select indexrelid::regclass, indrelid::regclass + from pg_index where indexrelid::regclass::text like 'idxpart%'; + indexrelid | indrelid +------------+---------- +(0 rows) + +-- Don't auto-attach incompatible indexes +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 (a int, b int); +create index on idxpart1 using hash (a); +create index on idxpart1 (a) where b > 1; +create index on idxpart1 ((a + 0)); +create index on idxpart1 (a, a); +create index on idxpart (a); +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: idxpart FOR VALUES FROM (0) TO (1000) +Indexes: + "idxpart1_a_a1_idx" btree (a, a) + "idxpart1_a_idx" hash (a) + "idxpart1_a_idx1" btree (a) WHERE b > 1 + "idxpart1_a_idx2" btree (a) + "idxpart1_expr_idx" btree ((a + 0)) + +drop table idxpart; +-- If CREATE INDEX ONLY, don't create indexes on partitions; and existing +-- indexes on partitions don't change parent. ALTER INDEX ATTACH can change +-- the parent after the fact. +create table idxpart (a int) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100); +create table idxpart2 partition of idxpart for values from (100) to (1000) + partition by range (a); +create table idxpart21 partition of idxpart2 for values from (100) to (200); +create table idxpart22 partition of idxpart2 for values from (200) to (300); +create index on idxpart22 (a); +create index on only idxpart2 (a); +create index on idxpart (a); +-- Here we expect that idxpart1 and idxpart2 have a new index, but idxpart21 +-- does not; also, idxpart22 is not attached. +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: idxpart FOR VALUES FROM (0) TO (100) +Indexes: + "idxpart1_a_idx" btree (a) + +\d idxpart2 + Partitioned table "public.idxpart2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: idxpart FOR VALUES FROM (100) TO (1000) +Partition key: RANGE (a) +Indexes: + "idxpart2_a_idx" btree (a) INVALID +Number of partitions: 2 (Use \d+ to list them.) + +\d idxpart21 + Table "public.idxpart21" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: idxpart2 FOR VALUES FROM (100) TO (200) + +select indexrelid::regclass, indrelid::regclass, inhparent::regclass + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) +where indexrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + indexrelid | indrelid | inhparent +-----------------+-----------+--------------- + idxpart1_a_idx | idxpart1 | idxpart_a_idx + idxpart22_a_idx | idxpart22 | + idxpart2_a_idx | idxpart2 | idxpart_a_idx + idxpart_a_idx | idxpart | +(4 rows) + +alter index idxpart2_a_idx attach partition idxpart22_a_idx; +select indexrelid::regclass, indrelid::regclass, inhparent::regclass + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) +where indexrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + indexrelid | indrelid | inhparent +-----------------+-----------+---------------- + idxpart1_a_idx | idxpart1 | idxpart_a_idx + idxpart22_a_idx | idxpart22 | idxpart2_a_idx + idxpart2_a_idx | idxpart2 | idxpart_a_idx + idxpart_a_idx | idxpart | +(4 rows) + +-- attaching idxpart22 is not enough to set idxpart22_a_idx valid ... +alter index idxpart2_a_idx attach partition idxpart22_a_idx; +\d idxpart2 + Partitioned table "public.idxpart2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: idxpart FOR VALUES FROM (100) TO (1000) +Partition key: RANGE (a) +Indexes: + "idxpart2_a_idx" btree (a) INVALID +Number of partitions: 2 (Use \d+ to list them.) + +-- ... but this one is. +create index on idxpart21 (a); +alter index idxpart2_a_idx attach partition idxpart21_a_idx; +\d idxpart2 + Partitioned table "public.idxpart2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: idxpart FOR VALUES FROM (100) TO (1000) +Partition key: RANGE (a) +Indexes: + "idxpart2_a_idx" btree (a) +Number of partitions: 2 (Use \d+ to list them.) + +drop table idxpart; +-- When a table is attached a partition and it already has an index, a +-- duplicate index should not get created, but rather the index becomes +-- attached to the parent's index. +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +create table idxpart1 (like idxpart including indexes); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_b_c_idx" btree (b, c) + +select relname, relkind, inhparent::regclass + from pg_class left join pg_index ix on (indexrelid = oid) + left join pg_inherits on (ix.indexrelid = inhrelid) + where relname like 'idxpart%' order by relname; + relname | relkind | inhparent +------------------+---------+----------- + idxpart | p | + idxpart1 | r | + idxpart1_a_idx | i | + idxpart1_b_c_idx | i | + idxparti | I | + idxparti2 | I | +(6 rows) + +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | +Partition of: idxpart FOR VALUES FROM (0) TO (10) +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_b_c_idx" btree (b, c) + +select relname, relkind, inhparent::regclass + from pg_class left join pg_index ix on (indexrelid = oid) + left join pg_inherits on (ix.indexrelid = inhrelid) + where relname like 'idxpart%' order by relname; + relname | relkind | inhparent +------------------+---------+----------- + idxpart | p | + idxpart1 | r | + idxpart1_a_idx | i | idxparti + idxpart1_b_c_idx | i | idxparti2 + idxparti | I | + idxparti2 | I | +(6 rows) + +drop table idxpart; +-- Verify that attaching an invalid index does not mark the parent index valid. +-- On the other hand, attaching a valid index marks not only its direct +-- ancestor valid, but also any indirect ancestor that was only missing the one +-- that was just made valid +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 partition of idxpart for values from (1) to (1000) partition by range (a); +create table idxpart11 partition of idxpart1 for values from (1) to (100); +create index on only idxpart1 (a); +create index on only idxpart (a); +-- this results in two invalid indexes: +select relname, indisvalid from pg_class join pg_index on indexrelid = oid + where relname like 'idxpart%' order by relname; + relname | indisvalid +----------------+------------ + idxpart1_a_idx | f + idxpart_a_idx | f +(2 rows) + +-- idxpart1_a_idx is not valid, so idxpart_a_idx should not become valid: +alter index idxpart_a_idx attach partition idxpart1_a_idx; +select relname, indisvalid from pg_class join pg_index on indexrelid = oid + where relname like 'idxpart%' order by relname; + relname | indisvalid +----------------+------------ + idxpart1_a_idx | f + idxpart_a_idx | f +(2 rows) + +-- after creating and attaching this, both idxpart1_a_idx and idxpart_a_idx +-- should become valid +create index on idxpart11 (a); +alter index idxpart1_a_idx attach partition idxpart11_a_idx; +select relname, indisvalid from pg_class join pg_index on indexrelid = oid + where relname like 'idxpart%' order by relname; + relname | indisvalid +-----------------+------------ + idxpart11_a_idx | t + idxpart1_a_idx | t + idxpart_a_idx | t +(3 rows) + +drop table idxpart; +-- verify dependency handling during ALTER TABLE DETACH PARTITION +create table idxpart (a int) partition by range (a); +create table idxpart1 (like idxpart); +create index on idxpart1 (a); +create index on idxpart (a); +create table idxpart2 (like idxpart); +alter table idxpart attach partition idxpart1 for values from (0000) to (1000); +alter table idxpart attach partition idxpart2 for values from (1000) to (2000); +create table idxpart3 partition of idxpart for values from (2000) to (3000); +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; + relname | relkind +----------------+--------- + idxpart | p + idxpart1 | r + idxpart1_a_idx | i + idxpart2 | r + idxpart2_a_idx | i + idxpart3 | r + idxpart3_a_idx | i + idxpart_a_idx | I +(8 rows) + +-- a) after detaching partitions, the indexes can be dropped independently +alter table idxpart detach partition idxpart1; +alter table idxpart detach partition idxpart2; +alter table idxpart detach partition idxpart3; +drop index idxpart1_a_idx; +drop index idxpart2_a_idx; +drop index idxpart3_a_idx; +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; + relname | relkind +---------------+--------- + idxpart | p + idxpart1 | r + idxpart2 | r + idxpart3 | r + idxpart_a_idx | I +(5 rows) + +drop table idxpart, idxpart1, idxpart2, idxpart3; +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; + relname | relkind +---------+--------- +(0 rows) + +create table idxpart (a int) partition by range (a); +create table idxpart1 (like idxpart); +create index on idxpart1 (a); +create index on idxpart (a); +create table idxpart2 (like idxpart); +alter table idxpart attach partition idxpart1 for values from (0000) to (1000); +alter table idxpart attach partition idxpart2 for values from (1000) to (2000); +create table idxpart3 partition of idxpart for values from (2000) to (3000); +-- b) after detaching, dropping the index on parent does not remove the others +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; + relname | relkind +----------------+--------- + idxpart | p + idxpart1 | r + idxpart1_a_idx | i + idxpart2 | r + idxpart2_a_idx | i + idxpart3 | r + idxpart3_a_idx | i + idxpart_a_idx | I +(8 rows) + +alter table idxpart detach partition idxpart1; +alter table idxpart detach partition idxpart2; +alter table idxpart detach partition idxpart3; +drop index idxpart_a_idx; +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; + relname | relkind +----------------+--------- + idxpart | p + idxpart1 | r + idxpart1_a_idx | i + idxpart2 | r + idxpart2_a_idx | i + idxpart3 | r + idxpart3_a_idx | i +(7 rows) + +drop table idxpart, idxpart1, idxpart2, idxpart3; +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; + relname | relkind +---------+--------- +(0 rows) + +create table idxpart (a int, b int, c int) partition by range(a); +create index on idxpart(c); +create table idxpart1 partition of idxpart for values from (0) to (250); +create table idxpart2 partition of idxpart for values from (250) to (500); +alter table idxpart detach partition idxpart2; +\d idxpart2 + Table "public.idxpart2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Indexes: + "idxpart2_c_idx" btree (c) + +alter table idxpart2 drop column c; +\d idxpart2 + Table "public.idxpart2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + +drop table idxpart, idxpart2; +-- Verify that expression indexes inherit correctly +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 (like idxpart); +create index on idxpart1 ((a + b)); +create index on idxpart ((a + b)); +create table idxpart2 (like idxpart); +alter table idxpart attach partition idxpart1 for values from (0000) to (1000); +alter table idxpart attach partition idxpart2 for values from (1000) to (2000); +create table idxpart3 partition of idxpart for values from (2000) to (3000); +select relname as child, inhparent::regclass as parent, pg_get_indexdef as childdef + from pg_class join pg_inherits on inhrelid = oid, + lateral pg_get_indexdef(pg_class.oid) + where relkind in ('i', 'I') and relname like 'idxpart%' order by relname; + child | parent | childdef +-------------------+------------------+--------------------------------------------------------------------------- + idxpart1_expr_idx | idxpart_expr_idx | CREATE INDEX idxpart1_expr_idx ON public.idxpart1 USING btree (((a + b))) + idxpart2_expr_idx | idxpart_expr_idx | CREATE INDEX idxpart2_expr_idx ON public.idxpart2 USING btree (((a + b))) + idxpart3_expr_idx | idxpart_expr_idx | CREATE INDEX idxpart3_expr_idx ON public.idxpart3 USING btree (((a + b))) +(3 rows) + +drop table idxpart; +-- Verify behavior for collation (mis)matches +create table idxpart (a text) partition by range (a); +create table idxpart1 (like idxpart); +create table idxpart2 (like idxpart); +create index on idxpart2 (a collate "POSIX"); +create index on idxpart2 (a); +create index on idxpart2 (a collate "C"); +alter table idxpart attach partition idxpart1 for values from ('aaa') to ('bbb'); +alter table idxpart attach partition idxpart2 for values from ('bbb') to ('ccc'); +create table idxpart3 partition of idxpart for values from ('ccc') to ('ddd'); +create index on idxpart (a collate "C"); +create table idxpart4 partition of idxpart for values from ('ddd') to ('eee'); +select relname as child, inhparent::regclass as parent, pg_get_indexdef as childdef + from pg_class left join pg_inherits on inhrelid = oid, + lateral pg_get_indexdef(pg_class.oid) + where relkind in ('i', 'I') and relname like 'idxpart%' order by relname; + child | parent | childdef +-----------------+---------------+-------------------------------------------------------------------------------- + idxpart1_a_idx | idxpart_a_idx | CREATE INDEX idxpart1_a_idx ON public.idxpart1 USING btree (a COLLATE "C") + idxpart2_a_idx | | CREATE INDEX idxpart2_a_idx ON public.idxpart2 USING btree (a COLLATE "POSIX") + idxpart2_a_idx1 | | CREATE INDEX idxpart2_a_idx1 ON public.idxpart2 USING btree (a) + idxpart2_a_idx2 | idxpart_a_idx | CREATE INDEX idxpart2_a_idx2 ON public.idxpart2 USING btree (a COLLATE "C") + idxpart3_a_idx | idxpart_a_idx | CREATE INDEX idxpart3_a_idx ON public.idxpart3 USING btree (a COLLATE "C") + idxpart4_a_idx | idxpart_a_idx | CREATE INDEX idxpart4_a_idx ON public.idxpart4 USING btree (a COLLATE "C") + idxpart_a_idx | | CREATE INDEX idxpart_a_idx ON ONLY public.idxpart USING btree (a COLLATE "C") +(7 rows) + +drop table idxpart; +-- Verify behavior for opclass (mis)matches +create table idxpart (a text) partition by range (a); +create table idxpart1 (like idxpart); +create table idxpart2 (like idxpart); +create index on idxpart2 (a); +alter table idxpart attach partition idxpart1 for values from ('aaa') to ('bbb'); +alter table idxpart attach partition idxpart2 for values from ('bbb') to ('ccc'); +create table idxpart3 partition of idxpart for values from ('ccc') to ('ddd'); +create index on idxpart (a text_pattern_ops); +create table idxpart4 partition of idxpart for values from ('ddd') to ('eee'); +-- must *not* have attached the index we created on idxpart2 +select relname as child, inhparent::regclass as parent, pg_get_indexdef as childdef + from pg_class left join pg_inherits on inhrelid = oid, + lateral pg_get_indexdef(pg_class.oid) + where relkind in ('i', 'I') and relname like 'idxpart%' order by relname; + child | parent | childdef +-----------------+---------------+------------------------------------------------------------------------------------ + idxpart1_a_idx | idxpart_a_idx | CREATE INDEX idxpart1_a_idx ON public.idxpart1 USING btree (a text_pattern_ops) + idxpart2_a_idx | | CREATE INDEX idxpart2_a_idx ON public.idxpart2 USING btree (a) + idxpart2_a_idx1 | idxpart_a_idx | CREATE INDEX idxpart2_a_idx1 ON public.idxpart2 USING btree (a text_pattern_ops) + idxpart3_a_idx | idxpart_a_idx | CREATE INDEX idxpart3_a_idx ON public.idxpart3 USING btree (a text_pattern_ops) + idxpart4_a_idx | idxpart_a_idx | CREATE INDEX idxpart4_a_idx ON public.idxpart4 USING btree (a text_pattern_ops) + idxpart_a_idx | | CREATE INDEX idxpart_a_idx ON ONLY public.idxpart USING btree (a text_pattern_ops) +(6 rows) + +drop index idxpart_a_idx; +create index on only idxpart (a text_pattern_ops); +-- must reject +alter index idxpart_a_idx attach partition idxpart2_a_idx; +ERROR: cannot attach index "idxpart2_a_idx" as a partition of index "idxpart_a_idx" +DETAIL: The index definitions do not match. +drop table idxpart; +-- Verify that attaching indexes maps attribute numbers correctly +create table idxpart (col1 int, a int, col2 int, b int) partition by range (a); +create table idxpart1 (b int, col1 int, col2 int, col3 int, a int); +alter table idxpart drop column col1, drop column col2; +alter table idxpart1 drop column col1, drop column col2, drop column col3; +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +create index idxpart_1_idx on only idxpart (b, a); +create index idxpart1_1_idx on idxpart1 (b, a); +create index idxpart1_1b_idx on idxpart1 (b); +-- test expressions and partial-index predicate, too +create index idxpart_2_idx on only idxpart ((b + a)) where a > 1; +create index idxpart1_2_idx on idxpart1 ((b + a)) where a > 1; +create index idxpart1_2b_idx on idxpart1 ((a + b)) where a > 1; +create index idxpart1_2c_idx on idxpart1 ((b + a)) where b > 1; +alter index idxpart_1_idx attach partition idxpart1_1b_idx; -- fail +ERROR: cannot attach index "idxpart1_1b_idx" as a partition of index "idxpart_1_idx" +DETAIL: The index definitions do not match. +alter index idxpart_1_idx attach partition idxpart1_1_idx; +alter index idxpart_2_idx attach partition idxpart1_2b_idx; -- fail +ERROR: cannot attach index "idxpart1_2b_idx" as a partition of index "idxpart_2_idx" +DETAIL: The index definitions do not match. +alter index idxpart_2_idx attach partition idxpart1_2c_idx; -- fail +ERROR: cannot attach index "idxpart1_2c_idx" as a partition of index "idxpart_2_idx" +DETAIL: The index definitions do not match. +alter index idxpart_2_idx attach partition idxpart1_2_idx; -- ok +select relname as child, inhparent::regclass as parent, pg_get_indexdef as childdef + from pg_class left join pg_inherits on inhrelid = oid, + lateral pg_get_indexdef(pg_class.oid) + where relkind in ('i', 'I') and relname like 'idxpart%' order by relname; + child | parent | childdef +-----------------+---------------+----------------------------------------------------------------------------------------- + idxpart1_1_idx | idxpart_1_idx | CREATE INDEX idxpart1_1_idx ON public.idxpart1 USING btree (b, a) + idxpart1_1b_idx | | CREATE INDEX idxpart1_1b_idx ON public.idxpart1 USING btree (b) + idxpart1_2_idx | idxpart_2_idx | CREATE INDEX idxpart1_2_idx ON public.idxpart1 USING btree (((b + a))) WHERE (a > 1) + idxpart1_2b_idx | | CREATE INDEX idxpart1_2b_idx ON public.idxpart1 USING btree (((a + b))) WHERE (a > 1) + idxpart1_2c_idx | | CREATE INDEX idxpart1_2c_idx ON public.idxpart1 USING btree (((b + a))) WHERE (b > 1) + idxpart_1_idx | | CREATE INDEX idxpart_1_idx ON ONLY public.idxpart USING btree (b, a) + idxpart_2_idx | | CREATE INDEX idxpart_2_idx ON ONLY public.idxpart USING btree (((b + a))) WHERE (a > 1) +(7 rows) + +drop table idxpart; +-- Make sure the partition columns are mapped correctly +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (c, b); +create table idxpart1 (c text, a int, b int); +alter table idxpart attach partition idxpart1 for values from (0) to (10); +create table idxpart2 (c text, a int, b int); +create index on idxpart2 (a); +create index on idxpart2 (c, b); +alter table idxpart attach partition idxpart2 for values from (10) to (20); +select c.relname, pg_get_indexdef(indexrelid) + from pg_class c join pg_index i on c.oid = i.indexrelid + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + relname | pg_get_indexdef +------------------+--------------------------------------------------------------------- + idxpart1_a_idx | CREATE INDEX idxpart1_a_idx ON public.idxpart1 USING btree (a) + idxpart1_c_b_idx | CREATE INDEX idxpart1_c_b_idx ON public.idxpart1 USING btree (c, b) + idxpart2_a_idx | CREATE INDEX idxpart2_a_idx ON public.idxpart2 USING btree (a) + idxpart2_c_b_idx | CREATE INDEX idxpart2_c_b_idx ON public.idxpart2 USING btree (c, b) + idxparti | CREATE INDEX idxparti ON ONLY public.idxpart USING btree (a) + idxparti2 | CREATE INDEX idxparti2 ON ONLY public.idxpart USING btree (c, b) +(6 rows) + +drop table idxpart; +-- Verify that columns are mapped correctly in expression indexes +create table idxpart (col1 int, col2 int, a int, b int) partition by range (a); +create table idxpart1 (col2 int, b int, col1 int, a int); +create table idxpart2 (col1 int, col2 int, b int, a int); +alter table idxpart drop column col1, drop column col2; +alter table idxpart1 drop column col1, drop column col2; +alter table idxpart2 drop column col1, drop column col2; +create index on idxpart2 (abs(b)); +alter table idxpart attach partition idxpart2 for values from (0) to (1); +create index on idxpart (abs(b)); +create index on idxpart ((b + 1)); +alter table idxpart attach partition idxpart1 for values from (1) to (2); +select c.relname, pg_get_indexdef(indexrelid) + from pg_class c join pg_index i on c.oid = i.indexrelid + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + relname | pg_get_indexdef +-------------------+------------------------------------------------------------------------------ + idxpart1_abs_idx | CREATE INDEX idxpart1_abs_idx ON public.idxpart1 USING btree (abs(b)) + idxpart1_expr_idx | CREATE INDEX idxpart1_expr_idx ON public.idxpart1 USING btree (((b + 1))) + idxpart2_abs_idx | CREATE INDEX idxpart2_abs_idx ON public.idxpart2 USING btree (abs(b)) + idxpart2_expr_idx | CREATE INDEX idxpart2_expr_idx ON public.idxpart2 USING btree (((b + 1))) + idxpart_abs_idx | CREATE INDEX idxpart_abs_idx ON ONLY public.idxpart USING btree (abs(b)) + idxpart_expr_idx | CREATE INDEX idxpart_expr_idx ON ONLY public.idxpart USING btree (((b + 1))) +(6 rows) + +drop table idxpart; +-- Verify that columns are mapped correctly for WHERE in a partial index +create table idxpart (col1 int, a int, col3 int, b int) partition by range (a); +alter table idxpart drop column col1, drop column col3; +create table idxpart1 (col1 int, col2 int, col3 int, col4 int, b int, a int); +alter table idxpart1 drop column col1, drop column col2, drop column col3, drop column col4; +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +create table idxpart2 (col1 int, col2 int, b int, a int); +create index on idxpart2 (a) where b > 1000; +alter table idxpart2 drop column col1, drop column col2; +alter table idxpart attach partition idxpart2 for values from (1000) to (2000); +create index on idxpart (a) where b > 1000; +select c.relname, pg_get_indexdef(indexrelid) + from pg_class c join pg_index i on c.oid = i.indexrelid + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + relname | pg_get_indexdef +----------------+------------------------------------------------------------------------------------ + idxpart1_a_idx | CREATE INDEX idxpart1_a_idx ON public.idxpart1 USING btree (a) WHERE (b > 1000) + idxpart2_a_idx | CREATE INDEX idxpart2_a_idx ON public.idxpart2 USING btree (a) WHERE (b > 1000) + idxpart_a_idx | CREATE INDEX idxpart_a_idx ON ONLY public.idxpart USING btree (a) WHERE (b > 1000) +(3 rows) + +drop table idxpart; +-- Column number mapping: dropped columns in the partition +create table idxpart1 (drop_1 int, drop_2 int, col_keep int, drop_3 int); +alter table idxpart1 drop column drop_1; +alter table idxpart1 drop column drop_2; +alter table idxpart1 drop column drop_3; +create index on idxpart1 (col_keep); +create table idxpart (col_keep int) partition by range (col_keep); +create index on idxpart (col_keep); +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +\d idxpart + Partitioned table "public.idxpart" + Column | Type | Collation | Nullable | Default +----------+---------+-----------+----------+--------- + col_keep | integer | | | +Partition key: RANGE (col_keep) +Indexes: + "idxpart_col_keep_idx" btree (col_keep) +Number of partitions: 1 (Use \d+ to list them.) + +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +----------+---------+-----------+----------+--------- + col_keep | integer | | | +Partition of: idxpart FOR VALUES FROM (0) TO (1000) +Indexes: + "idxpart1_col_keep_idx" btree (col_keep) + +select attrelid::regclass, attname, attnum from pg_attribute + where attrelid::regclass::text like 'idxpart%' and attnum > 0 + order by attrelid::regclass, attnum; + attrelid | attname | attnum +-----------------------+------------------------------+-------- + idxpart1 | ........pg.dropped.1........ | 1 + idxpart1 | ........pg.dropped.2........ | 2 + idxpart1 | col_keep | 3 + idxpart1 | ........pg.dropped.4........ | 4 + idxpart1_col_keep_idx | col_keep | 1 + idxpart | col_keep | 1 + idxpart_col_keep_idx | col_keep | 1 +(7 rows) + +drop table idxpart; +-- Column number mapping: dropped columns in the parent table +create table idxpart(drop_1 int, drop_2 int, col_keep int, drop_3 int) partition by range (col_keep); +alter table idxpart drop column drop_1; +alter table idxpart drop column drop_2; +alter table idxpart drop column drop_3; +create table idxpart1 (col_keep int); +create index on idxpart1 (col_keep); +create index on idxpart (col_keep); +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +\d idxpart + Partitioned table "public.idxpart" + Column | Type | Collation | Nullable | Default +----------+---------+-----------+----------+--------- + col_keep | integer | | | +Partition key: RANGE (col_keep) +Indexes: + "idxpart_col_keep_idx" btree (col_keep) +Number of partitions: 1 (Use \d+ to list them.) + +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +----------+---------+-----------+----------+--------- + col_keep | integer | | | +Partition of: idxpart FOR VALUES FROM (0) TO (1000) +Indexes: + "idxpart1_col_keep_idx" btree (col_keep) + +select attrelid::regclass, attname, attnum from pg_attribute + where attrelid::regclass::text like 'idxpart%' and attnum > 0 + order by attrelid::regclass, attnum; + attrelid | attname | attnum +-----------------------+------------------------------+-------- + idxpart | ........pg.dropped.1........ | 1 + idxpart | ........pg.dropped.2........ | 2 + idxpart | col_keep | 3 + idxpart | ........pg.dropped.4........ | 4 + idxpart1 | col_keep | 1 + idxpart1_col_keep_idx | col_keep | 1 + idxpart_col_keep_idx | col_keep | 1 +(7 rows) + +drop table idxpart; +-- +-- Constraint-related indexes +-- +-- Verify that it works to add primary key / unique to partitioned tables +create table idxpart (a int primary key, b int) partition by range (a); +\d idxpart + Partitioned table "public.idxpart" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | + b | integer | | | +Partition key: RANGE (a) +Indexes: + "idxpart_pkey" PRIMARY KEY, btree (a) +Number of partitions: 0 + +-- multiple primary key on child should fail +create table failpart partition of idxpart (b primary key) for values from (0) to (100); +ERROR: multiple primary keys for table "failpart" are not allowed +drop table idxpart; +-- primary key on child is okay if there's no PK in the parent, though +create table idxpart (a int) partition by range (a); +create table idxpart1pk partition of idxpart (a primary key) for values from (0) to (100); +\d idxpart1pk + Table "public.idxpart1pk" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | +Partition of: idxpart FOR VALUES FROM (0) TO (100) +Indexes: + "idxpart1pk_pkey" PRIMARY KEY, btree (a) + +drop table idxpart; +-- Failing to use the full partition key is not allowed +create table idxpart (a int unique, b int) partition by range (a, b); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "idxpart" lacks column "b" which is part of the partition key. +create table idxpart (a int, b int unique) partition by range (a, b); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "idxpart" lacks column "a" which is part of the partition key. +create table idxpart (a int primary key, b int) partition by range (b, a); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: PRIMARY KEY constraint on table "idxpart" lacks column "b" which is part of the partition key. +create table idxpart (a int, b int primary key) partition by range (b, a); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: PRIMARY KEY constraint on table "idxpart" lacks column "a" which is part of the partition key. +-- OK if you use them in some other order +create table idxpart (a int, b int, c text, primary key (a, b, c)) partition by range (b, c, a); +drop table idxpart; +-- not other types of index-based constraints +create table idxpart (a int, exclude (a with = )) partition by range (a); +ERROR: exclusion constraints are not supported on partitioned tables +LINE 1: create table idxpart (a int, exclude (a with = )) partition ... + ^ +-- no expressions in partition key for PK/UNIQUE +create table idxpart (a int primary key, b int) partition by range ((b + a)); +ERROR: unsupported PRIMARY KEY constraint with partition key definition +DETAIL: PRIMARY KEY constraints cannot be used when partition keys include expressions. +create table idxpart (a int unique, b int) partition by range ((b + a)); +ERROR: unsupported UNIQUE constraint with partition key definition +DETAIL: UNIQUE constraints cannot be used when partition keys include expressions. +-- use ALTER TABLE to add a primary key +create table idxpart (a int, b int, c text) partition by range (a, b); +alter table idxpart add primary key (a); -- not an incomplete one though +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: PRIMARY KEY constraint on table "idxpart" lacks column "b" which is part of the partition key. +alter table idxpart add primary key (a, b); -- this works +\d idxpart + Partitioned table "public.idxpart" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | + b | integer | | not null | + c | text | | | +Partition key: RANGE (a, b) +Indexes: + "idxpart_pkey" PRIMARY KEY, btree (a, b) +Number of partitions: 0 + +create table idxpart1 partition of idxpart for values from (0, 0) to (1000, 1000); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | + b | integer | | not null | + c | text | | | +Partition of: idxpart FOR VALUES FROM (0, 0) TO (1000, 1000) +Indexes: + "idxpart1_pkey" PRIMARY KEY, btree (a, b) + +drop table idxpart; +-- use ALTER TABLE to add a unique constraint +create table idxpart (a int, b int) partition by range (a, b); +alter table idxpart add unique (a); -- not an incomplete one though +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "idxpart" lacks column "b" which is part of the partition key. +alter table idxpart add unique (b, a); -- this works +\d idxpart + Partitioned table "public.idxpart" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition key: RANGE (a, b) +Indexes: + "idxpart_b_a_key" UNIQUE CONSTRAINT, btree (b, a) +Number of partitions: 0 + +drop table idxpart; +-- Exclusion constraints cannot be added +create table idxpart (a int, b int) partition by range (a); +alter table idxpart add exclude (a with =); +ERROR: exclusion constraints are not supported on partitioned tables +LINE 1: alter table idxpart add exclude (a with =); + ^ +drop table idxpart; +-- When (sub)partitions are created, they also contain the constraint +create table idxpart (a int, b int, primary key (a, b)) partition by range (a, b); +create table idxpart1 partition of idxpart for values from (1, 1) to (10, 10); +create table idxpart2 partition of idxpart for values from (10, 10) to (20, 20) + partition by range (b); +create table idxpart21 partition of idxpart2 for values from (10) to (15); +create table idxpart22 partition of idxpart2 for values from (15) to (20); +create table idxpart3 (b int not null, a int not null); +alter table idxpart attach partition idxpart3 for values from (20, 20) to (30, 30); +select conname, contype, conrelid::regclass, conindid::regclass, conkey + from pg_constraint where conrelid::regclass::text like 'idxpart%' + order by conname; + conname | contype | conrelid | conindid | conkey +----------------+---------+-----------+----------------+-------- + idxpart1_pkey | p | idxpart1 | idxpart1_pkey | {1,2} + idxpart21_pkey | p | idxpart21 | idxpart21_pkey | {1,2} + idxpart22_pkey | p | idxpart22 | idxpart22_pkey | {1,2} + idxpart2_pkey | p | idxpart2 | idxpart2_pkey | {1,2} + idxpart3_pkey | p | idxpart3 | idxpart3_pkey | {2,1} + idxpart_pkey | p | idxpart | idxpart_pkey | {1,2} +(6 rows) + +drop table idxpart; +-- Verify that multi-layer partitioning honors the requirement that all +-- columns in the partition key must appear in primary/unique key +create table idxpart (a int, b int, primary key (a)) partition by range (a); +create table idxpart2 partition of idxpart +for values from (0) to (1000) partition by range (b); -- fail +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: PRIMARY KEY constraint on table "idxpart2" lacks column "b" which is part of the partition key. +drop table idxpart; +-- Ditto for the ATTACH PARTITION case +create table idxpart (a int unique, b int) partition by range (a); +create table idxpart1 (a int not null, b int, unique (a, b)) + partition by range (a, b); +alter table idxpart attach partition idxpart1 for values from (1) to (1000); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "idxpart1" lacks column "b" which is part of the partition key. +DROP TABLE idxpart, idxpart1; +-- Multi-layer partitioning works correctly in this case: +create table idxpart (a int, b int, primary key (a, b)) partition by range (a); +create table idxpart2 partition of idxpart for values from (0) to (1000) partition by range (b); +create table idxpart21 partition of idxpart2 for values from (0) to (1000); +select conname, contype, conrelid::regclass, conindid::regclass, conkey + from pg_constraint where conrelid::regclass::text like 'idxpart%' + order by conname; + conname | contype | conrelid | conindid | conkey +----------------+---------+-----------+----------------+-------- + idxpart21_pkey | p | idxpart21 | idxpart21_pkey | {1,2} + idxpart2_pkey | p | idxpart2 | idxpart2_pkey | {1,2} + idxpart_pkey | p | idxpart | idxpart_pkey | {1,2} +(3 rows) + +drop table idxpart; +-- If a partitioned table has a unique/PK constraint, then it's not possible +-- to drop the corresponding constraint in the children; nor it's possible +-- to drop the indexes individually. Dropping the constraint in the parent +-- gets rid of the lot. +create table idxpart (i int) partition by hash (i); +create table idxpart0 partition of idxpart (i) for values with (modulus 2, remainder 0); +create table idxpart1 partition of idxpart (i) for values with (modulus 2, remainder 1); +alter table idxpart0 add primary key(i); +alter table idxpart add primary key(i); +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + indrelid | indexrelid | inhparent | indisvalid | conname | conislocal | coninhcount | connoinherit | convalidated +----------+---------------+--------------+------------+---------------+------------+-------------+--------------+-------------- + idxpart0 | idxpart0_pkey | idxpart_pkey | t | idxpart0_pkey | f | 1 | t | t + idxpart1 | idxpart1_pkey | idxpart_pkey | t | idxpart1_pkey | f | 1 | f | t + idxpart | idxpart_pkey | | t | idxpart_pkey | t | 0 | t | t +(3 rows) + +drop index idxpart0_pkey; -- fail +ERROR: cannot drop index idxpart0_pkey because index idxpart_pkey requires it +HINT: You can drop index idxpart_pkey instead. +drop index idxpart1_pkey; -- fail +ERROR: cannot drop index idxpart1_pkey because index idxpart_pkey requires it +HINT: You can drop index idxpart_pkey instead. +alter table idxpart0 drop constraint idxpart0_pkey; -- fail +ERROR: cannot drop inherited constraint "idxpart0_pkey" of relation "idxpart0" +alter table idxpart1 drop constraint idxpart1_pkey; -- fail +ERROR: cannot drop inherited constraint "idxpart1_pkey" of relation "idxpart1" +alter table idxpart drop constraint idxpart_pkey; -- ok +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + indrelid | indexrelid | inhparent | indisvalid | conname | conislocal | coninhcount | connoinherit | convalidated +----------+------------+-----------+------------+---------+------------+-------------+--------------+-------------- +(0 rows) + +drop table idxpart; +-- If the partition to be attached already has a primary key, fail if +-- it doesn't match the parent's PK. +CREATE TABLE idxpart (c1 INT PRIMARY KEY, c2 INT, c3 VARCHAR(10)) PARTITION BY RANGE(c1); +CREATE TABLE idxpart1 (LIKE idxpart); +ALTER TABLE idxpart1 ADD PRIMARY KEY (c1, c2); +ALTER TABLE idxpart ATTACH PARTITION idxpart1 FOR VALUES FROM (100) TO (200); +ERROR: multiple primary keys for table "idxpart1" are not allowed +DROP TABLE idxpart, idxpart1; +-- Ditto if there is some distance between the PKs (subpartitioning) +create table idxpart (a int, b int, primary key (a)) partition by range (a); +create table idxpart1 (a int not null, b int) partition by range (a); +create table idxpart11 (a int not null, b int primary key); +alter table idxpart1 attach partition idxpart11 for values from (0) to (1000); +alter table idxpart attach partition idxpart1 for values from (0) to (10000); +ERROR: multiple primary keys for table "idxpart11" are not allowed +drop table idxpart, idxpart1, idxpart11; +-- If a partitioned table has a constraint whose index is not valid, +-- attaching a missing partition makes it valid. +create table idxpart (a int) partition by range (a); +create table idxpart0 (like idxpart); +alter table idxpart0 add primary key (a); +alter table idxpart attach partition idxpart0 for values from (0) to (1000); +alter table only idxpart add primary key (a); +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + indrelid | indexrelid | inhparent | indisvalid | conname | conislocal | coninhcount | connoinherit | convalidated +----------+---------------+-----------+------------+---------------+------------+-------------+--------------+-------------- + idxpart0 | idxpart0_pkey | | t | idxpart0_pkey | t | 0 | t | t + idxpart | idxpart_pkey | | f | idxpart_pkey | t | 0 | t | t +(2 rows) + +alter index idxpart_pkey attach partition idxpart0_pkey; +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + indrelid | indexrelid | inhparent | indisvalid | conname | conislocal | coninhcount | connoinherit | convalidated +----------+---------------+--------------+------------+---------------+------------+-------------+--------------+-------------- + idxpart0 | idxpart0_pkey | idxpart_pkey | t | idxpart0_pkey | f | 1 | t | t + idxpart | idxpart_pkey | | t | idxpart_pkey | t | 0 | t | t +(2 rows) + +drop table idxpart; +-- Related to the above scenario: ADD PRIMARY KEY on the parent mustn't +-- automatically propagate NOT NULL to child columns. +create table idxpart (a int) partition by range (a); +create table idxpart0 (like idxpart); +alter table idxpart0 add unique (a); +alter table idxpart attach partition idxpart0 default; +alter table only idxpart add primary key (a); -- fail, no NOT NULL constraint +ERROR: constraint must be added to child tables too +DETAIL: Column "a" of relation "idxpart0" is not already NOT NULL. +HINT: Do not specify the ONLY keyword. +alter table idxpart0 alter column a set not null; +alter table only idxpart add primary key (a); -- now it works +alter table idxpart0 alter column a drop not null; -- fail, pkey needs it +ERROR: column "a" is marked NOT NULL in parent table +drop table idxpart; +-- if a partition has a unique index without a constraint, does not attach +-- automatically; creates a new index instead. +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 (a int not null, b int); +create unique index on idxpart1 (a); +alter table idxpart add primary key (a); +alter table idxpart attach partition idxpart1 for values from (1) to (1000); +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; + indrelid | indexrelid | inhparent | indisvalid | conname | conislocal | coninhcount | connoinherit | convalidated +----------+----------------+--------------+------------+---------------+------------+-------------+--------------+-------------- + idxpart1 | idxpart1_a_idx | | t | | | | | + idxpart1 | idxpart1_pkey | idxpart_pkey | t | idxpart1_pkey | f | 1 | f | t + idxpart | idxpart_pkey | | t | idxpart_pkey | t | 0 | t | t +(3 rows) + +drop table idxpart; +-- Can't attach an index without a corresponding constraint +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 (a int not null, b int); +create unique index on idxpart1 (a); +alter table idxpart attach partition idxpart1 for values from (1) to (1000); +alter table only idxpart add primary key (a); +alter index idxpart_pkey attach partition idxpart1_a_idx; -- fail +ERROR: cannot attach index "idxpart1_a_idx" as a partition of index "idxpart_pkey" +DETAIL: The index "idxpart_pkey" belongs to a constraint in table "idxpart" but no constraint exists for index "idxpart1_a_idx". +drop table idxpart; +-- Test that unique constraints are working +create table idxpart (a int, b text, primary key (a, b)) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100000); +create table idxpart2 (c int, like idxpart); +insert into idxpart2 (c, a, b) values (42, 572814, 'inserted first'); +alter table idxpart2 drop column c; +create unique index on idxpart (a); +alter table idxpart attach partition idxpart2 for values from (100000) to (1000000); +insert into idxpart values (0, 'zero'), (42, 'life'), (2^16, 'sixteen'); +insert into idxpart select 2^g, format('two to power of %s', g) from generate_series(15, 17) g; +ERROR: duplicate key value violates unique constraint "idxpart1_a_idx" +DETAIL: Key (a)=(65536) already exists. +insert into idxpart values (16, 'sixteen'); +insert into idxpart (b, a) values ('one', 142857), ('two', 285714); +insert into idxpart select a * 2, b || b from idxpart where a between 2^16 and 2^19; +ERROR: duplicate key value violates unique constraint "idxpart2_a_idx" +DETAIL: Key (a)=(285714) already exists. +insert into idxpart values (572814, 'five'); +ERROR: duplicate key value violates unique constraint "idxpart2_a_idx" +DETAIL: Key (a)=(572814) already exists. +insert into idxpart values (857142, 'six'); +select tableoid::regclass, * from idxpart order by a; + tableoid | a | b +----------+--------+---------------- + idxpart1 | 0 | zero + idxpart1 | 16 | sixteen + idxpart1 | 42 | life + idxpart1 | 65536 | sixteen + idxpart2 | 142857 | one + idxpart2 | 285714 | two + idxpart2 | 572814 | inserted first + idxpart2 | 857142 | six +(8 rows) + +drop table idxpart; +-- intentionally leave some objects around +create table idxpart (a int) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100); +create table idxpart2 partition of idxpart for values from (100) to (1000) + partition by range (a); +create table idxpart21 partition of idxpart2 for values from (100) to (200); +create table idxpart22 partition of idxpart2 for values from (200) to (300); +create index on idxpart22 (a); +create index on only idxpart2 (a); +alter index idxpart2_a_idx attach partition idxpart22_a_idx; +create index on idxpart (a); +create table idxpart_another (a int, b int, primary key (a, b)) partition by range (a); +create table idxpart_another_1 partition of idxpart_another for values from (0) to (100); +create table idxpart3 (c int, b int, a int) partition by range (a); +alter table idxpart3 drop column b, drop column c; +create table idxpart31 partition of idxpart3 for values from (1000) to (1200); +create table idxpart32 partition of idxpart3 for values from (1200) to (1400); +alter table idxpart attach partition idxpart3 for values from (1000) to (2000); +-- More objects intentionally left behind, to verify some pg_dump/pg_upgrade +-- behavior; see https://postgr.es/m/20190321204928.GA17535@alvherre.pgsql +create schema regress_indexing; +set search_path to regress_indexing; +create table pk (a int primary key) partition by range (a); +create table pk1 partition of pk for values from (0) to (1000); +create table pk2 (b int, a int); +alter table pk2 drop column b; +alter table pk2 alter a set not null; +alter table pk attach partition pk2 for values from (1000) to (2000); +create table pk3 partition of pk for values from (2000) to (3000); +create table pk4 (like pk); +alter table pk attach partition pk4 for values from (3000) to (4000); +create table pk5 (like pk) partition by range (a); +create table pk51 partition of pk5 for values from (4000) to (4500); +create table pk52 partition of pk5 for values from (4500) to (5000); +alter table pk attach partition pk5 for values from (4000) to (5000); +reset search_path; +-- Test that covering partitioned indexes work in various cases +create table covidxpart (a int, b int) partition by list (a); +create unique index on covidxpart (a) include (b); +create table covidxpart1 partition of covidxpart for values in (1); +create table covidxpart2 partition of covidxpart for values in (2); +insert into covidxpart values (1, 1); +insert into covidxpart values (1, 1); +ERROR: duplicate key value violates unique constraint "covidxpart1_a_b_idx" +DETAIL: Key (a)=(1) already exists. +create table covidxpart3 (b int, c int, a int); +alter table covidxpart3 drop c; +alter table covidxpart attach partition covidxpart3 for values in (3); +insert into covidxpart values (3, 1); +insert into covidxpart values (3, 1); +ERROR: duplicate key value violates unique constraint "covidxpart3_a_b_idx" +DETAIL: Key (a)=(3) already exists. +create table covidxpart4 (b int, a int); +create unique index on covidxpart4 (a) include (b); +create unique index on covidxpart4 (a); +alter table covidxpart attach partition covidxpart4 for values in (4); +insert into covidxpart values (4, 1); +insert into covidxpart values (4, 1); +ERROR: duplicate key value violates unique constraint "covidxpart4_a_b_idx" +DETAIL: Key (a)=(4) already exists. +create unique index on covidxpart (b) include (a); -- should fail +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "covidxpart" lacks column "a" which is part of the partition key. +-- check that detaching a partition also detaches the primary key constraint +create table parted_pk_detach_test (a int primary key) partition by list (a); +create table parted_pk_detach_test1 partition of parted_pk_detach_test for values in (1); +alter table parted_pk_detach_test1 drop constraint parted_pk_detach_test1_pkey; -- should fail +ERROR: cannot drop inherited constraint "parted_pk_detach_test1_pkey" of relation "parted_pk_detach_test1" +alter table parted_pk_detach_test detach partition parted_pk_detach_test1; +alter table parted_pk_detach_test1 drop constraint parted_pk_detach_test1_pkey; +drop table parted_pk_detach_test, parted_pk_detach_test1; +create table parted_uniq_detach_test (a int unique) partition by list (a); +create table parted_uniq_detach_test1 partition of parted_uniq_detach_test for values in (1); +alter table parted_uniq_detach_test1 drop constraint parted_uniq_detach_test1_a_key; -- should fail +ERROR: cannot drop inherited constraint "parted_uniq_detach_test1_a_key" of relation "parted_uniq_detach_test1" +alter table parted_uniq_detach_test detach partition parted_uniq_detach_test1; +alter table parted_uniq_detach_test1 drop constraint parted_uniq_detach_test1_a_key; +drop table parted_uniq_detach_test, parted_uniq_detach_test1; +-- check that dropping a column takes with it any partitioned indexes +-- depending on it. +create table parted_index_col_drop(a int, b int, c int) + partition by list (a); +create table parted_index_col_drop1 partition of parted_index_col_drop + for values in (1) partition by list (a); +-- leave this partition without children. +create table parted_index_col_drop2 partition of parted_index_col_drop + for values in (2) partition by list (a); +create table parted_index_col_drop11 partition of parted_index_col_drop1 + for values in (1); +create index on parted_index_col_drop (b); +create index on parted_index_col_drop (c); +create index on parted_index_col_drop (b, c); +alter table parted_index_col_drop drop column c; +\d parted_index_col_drop + Partitioned table "public.parted_index_col_drop" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition key: LIST (a) +Indexes: + "parted_index_col_drop_b_idx" btree (b) +Number of partitions: 2 (Use \d+ to list them.) + +\d parted_index_col_drop1 + Partitioned table "public.parted_index_col_drop1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: parted_index_col_drop FOR VALUES IN (1) +Partition key: LIST (a) +Indexes: + "parted_index_col_drop1_b_idx" btree (b) +Number of partitions: 1 (Use \d+ to list them.) + +\d parted_index_col_drop2 + Partitioned table "public.parted_index_col_drop2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: parted_index_col_drop FOR VALUES IN (2) +Partition key: LIST (a) +Indexes: + "parted_index_col_drop2_b_idx" btree (b) +Number of partitions: 0 + +\d parted_index_col_drop11 + Table "public.parted_index_col_drop11" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: parted_index_col_drop1 FOR VALUES IN (1) +Indexes: + "parted_index_col_drop11_b_idx" btree (b) + +drop table parted_index_col_drop; diff --git a/src/test/singlenode_regress/expected/indexjoin.out b/src/test/singlenode_regress/expected/indexjoin.out new file mode 100644 index 00000000000..3f02728e277 --- /dev/null +++ b/src/test/singlenode_regress/expected/indexjoin.out @@ -0,0 +1,154 @@ +CREATE TABLE my_tt_agg_small ( + symbol character(16), + event_ts bigint, + trade_price numeric, + trade_volume bigint +); +CREATE TABLE my_tq_agg_small ( + ets bigint, + sym character varying(16), + bid_price numeric, + ask_price numeric, + end_ts bigint +); +COPY my_tt_agg_small (symbol, event_ts, trade_price, trade_volume) FROM stdin; +COPY my_tq_agg_small (ets, sym, bid_price, ask_price, end_ts) FROM stdin; +CREATE INDEX my_tq_agg_small_ets_end_ts_ix ON my_tq_agg_small USING btree (ets, end_ts); +analyze my_tq_agg_small; +analyze my_tt_agg_small; +set optimizer_enable_indexjoin=on; +set optimizer_nestloop_factor = 1.0; +-- force_explain +EXPLAIN +SELECT (tt.event_ts / 100000) / 5 * 5 as fivemin, COUNT(*) +FROM my_tt_agg_small tt, my_tq_agg_small tq +WHERE tq.sym = tt.symbol AND + tt.event_ts >= tq.ets AND + tt.event_ts < tq.end_ts +GROUP BY 1 +ORDER BY 1 asc ; + QUERY PLAN +----------------------------------------------------------------------------------------------- + Sort (cost=3714.17..3715.20 rows=413 width=16) + Sort Key: ((((tt.event_ts / 100000) / 5) * 5)) + -> HashAggregate (cost=3689.00..3696.22 rows=413 width=16) + Group Key: (((tt.event_ts / 100000) / 5) * 5) + -> Hash Join (cost=50.61..3462.03 rows=45394 width=8) + Hash Cond: (tt.symbol = (tq.sym)::bpchar) + Join Filter: ((tt.event_ts >= tq.ets) AND (tt.event_ts < tq.end_ts)) + -> Seq Scan on my_tt_agg_small tt (cost=0.00..5.20 rows=420 width=25) + -> Hash (cost=25.27..25.27 rows=2027 width=20) + -> Seq Scan on my_tq_agg_small tq (cost=0.00..25.27 rows=2027 width=20) + Optimizer: Postgres query optimizer +(11 rows) + +SELECT (tt.event_ts / 100000) / 5 * 5 as fivemin, COUNT(*) +FROM my_tt_agg_small tt, my_tq_agg_small tq +WHERE tq.sym = tt.symbol AND + tt.event_ts >= tq.ets AND + tt.event_ts < tq.end_ts +GROUP BY 1 +ORDER BY 1 asc ; + fivemin | count +--------------+------- + 201011261015 | 2 + 201011261045 | 1 + 201011261110 | 1 + 201011261125 | 1 + 201011261240 | 1 + 201011261245 | 1 + 201011261315 | 2 + 201011261320 | 3 +(8 rows) + +set optimizer_enable_hashjoin = off; +set enable_hashjoin=off; +set enable_seqscan=off; +set enable_mergejoin=off; +set enable_nestloop=on; +set enable_indexscan=on; +-- start_ignore +-- Known_opt_diff: OPT-929 +-- end_ignore +-- force_explain +set optimizer_segments = 2; +set optimizer_nestloop_factor = 1.0; +EXPLAIN +SELECT (tt.event_ts / 100000) / 5 * 5 as fivemin, COUNT(*) +FROM my_tt_agg_small tt, my_tq_agg_small tq +WHERE tq.sym = tt.symbol AND + tt.event_ts >= tq.ets AND + tt.event_ts < tq.end_ts +GROUP BY 1 +ORDER BY 1 asc ; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------- + GroupAggregate (cost=10000008504.05..10000008851.73 rows=413 width=16) + Group Key: ((((tt.event_ts / 100000) / 5) * 5)) + -> Sort (cost=10000008504.05..10000008617.54 rows=45394 width=8) + Sort Key: ((((tt.event_ts / 100000) / 5) * 5)) + -> Nested Loop (cost=10000000000.28..10000004992.79 rows=45394 width=8) + -> Seq Scan on my_tt_agg_small tt (cost=10000000000.00..10000000005.20 rows=420 width=25) + -> Index Scan using my_tq_agg_small_ets_end_ts_ix on my_tq_agg_small tq (cost=0.28..9.94 rows=113 width=20) + Index Cond: ((ets <= tt.event_ts) AND (end_ts > tt.event_ts)) + Filter: (tt.symbol = (sym)::bpchar) + Optimizer: Postgres query optimizer +(10 rows) + +reset optimizer_segments; +reset optimizer_nestloop_factor; +SELECT (tt.event_ts / 100000) / 5 * 5 as fivemin, COUNT(*) +FROM my_tt_agg_small tt, my_tq_agg_small tq +WHERE tq.sym = tt.symbol AND + tt.event_ts >= tq.ets AND + tt.event_ts < tq.end_ts +GROUP BY 1 +ORDER BY 1 asc ; + fivemin | count +--------------+------- + 201011261015 | 2 + 201011261045 | 1 + 201011261110 | 1 + 201011261125 | 1 + 201011261240 | 1 + 201011261245 | 1 + 201011261315 | 2 + 201011261320 | 3 +(8 rows) + +-- Test Index Scan on CO table as the right tree of a NestLoop join. +create table no_index_table(fake_col1 int, fake_col2 int, fake_col3 int, a int, b int); +insert into no_index_table values (1,1,1,1,1); +analyze no_index_table; +create table with_index_table(x int, y int) with (appendonly=true, orientation=column); +create index with_index_table_index on with_index_table (x); +insert into with_index_table select i, 1 from generate_series(1, 20)i; +analyze with_index_table; +set enable_material to off; +set enable_seqscan to off; +set enable_mergejoin to off; +set enable_hashjoin to off; +set enable_nestloop to on; +set optimizer_enable_materialize to off; +set optimizer_enable_hashjoin to off; +explain (costs off) +SELECT * from with_index_table td JOIN no_index_table ro ON td.y = ro.a AND td.x = ro.b; + QUERY PLAN +--------------------------------------------------------- + Nested Loop + -> Seq Scan on no_index_table ro + -> Bitmap Heap Scan on with_index_table td + Recheck Cond: (x = ro.b) + Filter: (ro.a = y) + -> Bitmap Index Scan on with_index_table_index + Index Cond: (x = ro.b) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * from with_index_table td JOIN no_index_table ro ON td.y = ro.a AND td.x = ro.b; + x | y | fake_col1 | fake_col2 | fake_col3 | a | b +---+---+-----------+-----------+-----------+---+--- + 1 | 1 | 1 | 1 | 1 | 1 | 1 +(1 row) + +reset all; diff --git a/src/test/singlenode_regress/expected/indirect_toast.out b/src/test/singlenode_regress/expected/indirect_toast.out new file mode 100644 index 00000000000..ab1fa5e707c --- /dev/null +++ b/src/test/singlenode_regress/expected/indirect_toast.out @@ -0,0 +1,158 @@ +-- +-- Tests for external toast datums +-- +-- Other compression algorithms may cause the compressed data to be stored +-- inline. pglz guarantees that the data is externalized, so stick to it. +SET default_toast_compression = 'pglz'; +CREATE TABLE indtoasttest(descr text, cnt int DEFAULT 0, f1 text, f2 text); +INSERT INTO indtoasttest(descr, f1, f2) VALUES('two-compressed', repeat('1234567890',1000), repeat('1234567890',1000)); +INSERT INTO indtoasttest(descr, f1, f2) VALUES('two-toasted', repeat('1234567890',30000), repeat('1234567890',50000)); +INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-compressed,one-null', NULL, repeat('1234567890',1000)); +INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-toasted,one-null', NULL, repeat('1234567890',50000)); +-- check whether indirect tuples works on the most basic level +SELECT descr, substring(make_tuple_indirect(indtoasttest)::text, 1, 200) FROM indtoasttest; + descr | substring +-------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + two-compressed | (two-compressed,0,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 + two-toasted | (two-toasted,0,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345 + one-compressed,one-null | ("one-compressed,one-null",0,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + one-toasted,one-null | ("one-toasted,one-null",0,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +-- modification without changing varlenas +UPDATE indtoasttest SET cnt = cnt +1 RETURNING substring(indtoasttest::text, 1, 200); + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,1,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 + (two-toasted,1,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345 + ("one-compressed,one-null",1,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",1,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +-- modification without modifying assigned value +UPDATE indtoasttest SET cnt = cnt +1, f1 = f1 RETURNING substring(indtoasttest::text, 1, 200); + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,2,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 + (two-toasted,2,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345 + ("one-compressed,one-null",2,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",2,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +-- modification modifying, but effectively not changing +UPDATE indtoasttest SET cnt = cnt +1, f1 = f1||'' RETURNING substring(indtoasttest::text, 1, 200); + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,3,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 + (two-toasted,3,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345 + ("one-compressed,one-null",3,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",3,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +UPDATE indtoasttest SET cnt = cnt +1, f1 = '-'||f1||'-' RETURNING substring(indtoasttest::text, 1, 200); + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,4,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 + (two-toasted,4,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 + ("one-compressed,one-null",4,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",4,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest; + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,4,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 + (two-toasted,4,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 + ("one-compressed,one-null",4,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",4,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +-- check we didn't screw with main/toast tuple visibility +VACUUM FREEZE indtoasttest; +SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest; + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,4,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 + (two-toasted,4,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 + ("one-compressed,one-null",4,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",4,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +-- now create a trigger that forces all Datums to be indirect ones +CREATE FUNCTION update_using_indirect() + RETURNS trigger + LANGUAGE plpgsql AS $$ +BEGIN + NEW := make_tuple_indirect(NEW); + RETURN NEW; +END$$; +CREATE TRIGGER indtoasttest_update_indirect + BEFORE INSERT OR UPDATE + ON indtoasttest + FOR EACH ROW + EXECUTE PROCEDURE update_using_indirect(); +-- modification without changing varlenas +UPDATE indtoasttest SET cnt = cnt +1 RETURNING substring(indtoasttest::text, 1, 200); + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,5,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 + (two-toasted,5,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 + ("one-compressed,one-null",5,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",5,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +-- modification without modifying assigned value +UPDATE indtoasttest SET cnt = cnt +1, f1 = f1 RETURNING substring(indtoasttest::text, 1, 200); + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,6,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 + (two-toasted,6,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 + ("one-compressed,one-null",6,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",6,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +-- modification modifying, but effectively not changing +UPDATE indtoasttest SET cnt = cnt +1, f1 = f1||'' RETURNING substring(indtoasttest::text, 1, 200); + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,7,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 + (two-toasted,7,-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 + ("one-compressed,one-null",7,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",7,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +UPDATE indtoasttest SET cnt = cnt +1, f1 = '-'||f1||'-' RETURNING substring(indtoasttest::text, 1, 200); + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,8,--123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + (two-toasted,8,--123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 + ("one-compressed,one-null",8,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",8,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 +(4 rows) + +INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-toasted,one-null, via indirect', repeat('1234567890',30000), NULL); +SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest; + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,8,--123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + (two-toasted,8,--123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 + ("one-compressed,one-null",8,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",8,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 + ("one-toasted,one-null, via indirect",0,1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 +(5 rows) + +-- check we didn't screw with main/toast tuple visibility +VACUUM FREEZE indtoasttest; +SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest; + substring +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + (two-compressed,8,--123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + (two-toasted,8,--123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 + ("one-compressed,one-null",8,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ("one-toasted,one-null",8,,12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 + ("one-toasted,one-null, via indirect",0,1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 +(5 rows) + +DROP TABLE indtoasttest; +DROP FUNCTION update_using_indirect(); +RESET default_toast_compression; diff --git a/src/test/singlenode_regress/expected/inet.out b/src/test/singlenode_regress/expected/inet.out new file mode 100644 index 00000000000..d5bf9e2aaa5 --- /dev/null +++ b/src/test/singlenode_regress/expected/inet.out @@ -0,0 +1,1058 @@ +-- +-- INET +-- +-- prepare the table... +DROP TABLE INET_TBL; +ERROR: table "inet_tbl" does not exist +CREATE TABLE INET_TBL (c cidr, i inet); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.226/24'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1.0/26', '192.168.1.226'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.0/24'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.0/25'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.255/24'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.255/25'); +INSERT INTO INET_TBL (c, i) VALUES ('10', '10.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10.0.0.0', '10.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10.1.2.3', '10.1.2.3/32'); +INSERT INTO INET_TBL (c, i) VALUES ('10.1.2', '10.1.2.3/24'); +INSERT INTO INET_TBL (c, i) VALUES ('10.1', '10.1.2.3/16'); +INSERT INTO INET_TBL (c, i) VALUES ('10', '10.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10', '11.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10', '9.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10:23::f1', '10:23::f1/64'); +INSERT INTO INET_TBL (c, i) VALUES ('10:23::8000/113', '10:23::ffff'); +INSERT INTO INET_TBL (c, i) VALUES ('::ffff:1.2.3.4', '::4.3.2.1/24'); +-- check that CIDR rejects invalid input: +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1.2/30', '192.168.1.226'); +ERROR: invalid cidr value: "192.168.1.2/30" +LINE 1: INSERT INTO INET_TBL (c, i) VALUES ('192.168.1.2/30', '192.1... + ^ +DETAIL: Value has bits set to right of mask. +INSERT INTO INET_TBL (c, i) VALUES ('1234::1234::1234', '::1.2.3.4'); +ERROR: invalid input syntax for type cidr: "1234::1234::1234" +LINE 1: INSERT INTO INET_TBL (c, i) VALUES ('1234::1234::1234', '::1... + ^ +-- check that CIDR rejects invalid input when converting from text: +INSERT INTO INET_TBL (c, i) VALUES (cidr('192.168.1.2/30'), '192.168.1.226'); +ERROR: invalid cidr value: "192.168.1.2/30" +LINE 1: INSERT INTO INET_TBL (c, i) VALUES (cidr('192.168.1.2/30'), ... + ^ +DETAIL: Value has bits set to right of mask. +INSERT INTO INET_TBL (c, i) VALUES (cidr('ffff:ffff:ffff:ffff::/24'), '::192.168.1.226'); +ERROR: invalid cidr value: "ffff:ffff:ffff:ffff::/24" +LINE 1: INSERT INTO INET_TBL (c, i) VALUES (cidr('ffff:ffff:ffff:fff... + ^ +DETAIL: Value has bits set to right of mask. +SELECT c AS cidr, i AS inet FROM INET_TBL; + cidr | inet +--------------------+------------------ + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/26 | 192.168.1.226 + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.255/25 + 10.0.0.0/8 | 10.1.2.3/8 + 10.0.0.0/32 | 10.1.2.3/8 + 10.1.2.3/32 | 10.1.2.3 + 10.1.2.0/24 | 10.1.2.3/24 + 10.1.0.0/16 | 10.1.2.3/16 + 10.0.0.0/8 | 10.1.2.3/8 + 10.0.0.0/8 | 11.1.2.3/8 + 10.0.0.0/8 | 9.1.2.3/8 + 10:23::f1/128 | 10:23::f1/64 + 10:23::8000/113 | 10:23::ffff + ::ffff:1.2.3.4/128 | ::4.3.2.1/24 +(17 rows) + +-- now test some support functions +SELECT i AS inet, host(i), text(i), family(i) FROM INET_TBL; + inet | host | text | family +------------------+---------------+------------------+-------- + 192.168.1.226/24 | 192.168.1.226 | 192.168.1.226/24 | 4 + 192.168.1.226 | 192.168.1.226 | 192.168.1.226/32 | 4 + 192.168.1.0/24 | 192.168.1.0 | 192.168.1.0/24 | 4 + 192.168.1.0/25 | 192.168.1.0 | 192.168.1.0/25 | 4 + 192.168.1.255/24 | 192.168.1.255 | 192.168.1.255/24 | 4 + 192.168.1.255/25 | 192.168.1.255 | 192.168.1.255/25 | 4 + 10.1.2.3/8 | 10.1.2.3 | 10.1.2.3/8 | 4 + 10.1.2.3/8 | 10.1.2.3 | 10.1.2.3/8 | 4 + 10.1.2.3 | 10.1.2.3 | 10.1.2.3/32 | 4 + 10.1.2.3/24 | 10.1.2.3 | 10.1.2.3/24 | 4 + 10.1.2.3/16 | 10.1.2.3 | 10.1.2.3/16 | 4 + 10.1.2.3/8 | 10.1.2.3 | 10.1.2.3/8 | 4 + 11.1.2.3/8 | 11.1.2.3 | 11.1.2.3/8 | 4 + 9.1.2.3/8 | 9.1.2.3 | 9.1.2.3/8 | 4 + 10:23::f1/64 | 10:23::f1 | 10:23::f1/64 | 6 + 10:23::ffff | 10:23::ffff | 10:23::ffff/128 | 6 + ::4.3.2.1/24 | ::4.3.2.1 | ::4.3.2.1/24 | 6 +(17 rows) + +SELECT c AS cidr, abbrev(c) FROM INET_TBL; + cidr | abbrev +--------------------+-------------------- + 192.168.1.0/24 | 192.168.1/24 + 192.168.1.0/26 | 192.168.1.0/26 + 192.168.1.0/24 | 192.168.1/24 + 192.168.1.0/24 | 192.168.1/24 + 192.168.1.0/24 | 192.168.1/24 + 192.168.1.0/24 | 192.168.1/24 + 10.0.0.0/8 | 10/8 + 10.0.0.0/32 | 10.0.0.0/32 + 10.1.2.3/32 | 10.1.2.3/32 + 10.1.2.0/24 | 10.1.2/24 + 10.1.0.0/16 | 10.1/16 + 10.0.0.0/8 | 10/8 + 10.0.0.0/8 | 10/8 + 10.0.0.0/8 | 10/8 + 10:23::f1/128 | 10:23::f1/128 + 10:23::8000/113 | 10:23::8000/113 + ::ffff:1.2.3.4/128 | ::ffff:1.2.3.4/128 +(17 rows) + +SELECT c AS cidr, broadcast(c), + i AS inet, broadcast(i) FROM INET_TBL; + cidr | broadcast | inet | broadcast +--------------------+------------------+------------------+--------------------------------------- + 192.168.1.0/24 | 192.168.1.255/24 | 192.168.1.226/24 | 192.168.1.255/24 + 192.168.1.0/26 | 192.168.1.63/26 | 192.168.1.226 | 192.168.1.226 + 192.168.1.0/24 | 192.168.1.255/24 | 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.255/24 | 192.168.1.0/25 | 192.168.1.127/25 + 192.168.1.0/24 | 192.168.1.255/24 | 192.168.1.255/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.255/24 | 192.168.1.255/25 | 192.168.1.255/25 + 10.0.0.0/8 | 10.255.255.255/8 | 10.1.2.3/8 | 10.255.255.255/8 + 10.0.0.0/32 | 10.0.0.0 | 10.1.2.3/8 | 10.255.255.255/8 + 10.1.2.3/32 | 10.1.2.3 | 10.1.2.3 | 10.1.2.3 + 10.1.2.0/24 | 10.1.2.255/24 | 10.1.2.3/24 | 10.1.2.255/24 + 10.1.0.0/16 | 10.1.255.255/16 | 10.1.2.3/16 | 10.1.255.255/16 + 10.0.0.0/8 | 10.255.255.255/8 | 10.1.2.3/8 | 10.255.255.255/8 + 10.0.0.0/8 | 10.255.255.255/8 | 11.1.2.3/8 | 11.255.255.255/8 + 10.0.0.0/8 | 10.255.255.255/8 | 9.1.2.3/8 | 9.255.255.255/8 + 10:23::f1/128 | 10:23::f1 | 10:23::f1/64 | 10:23::ffff:ffff:ffff:ffff/64 + 10:23::8000/113 | 10:23::ffff/113 | 10:23::ffff | 10:23::ffff + ::ffff:1.2.3.4/128 | ::ffff:1.2.3.4 | ::4.3.2.1/24 | 0:ff:ffff:ffff:ffff:ffff:ffff:ffff/24 +(17 rows) + +SELECT c AS cidr, network(c) AS "network(cidr)", + i AS inet, network(i) AS "network(inet)" FROM INET_TBL; + cidr | network(cidr) | inet | network(inet) +--------------------+--------------------+------------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 | 192.168.1.226/24 | 192.168.1.0/24 + 192.168.1.0/26 | 192.168.1.0/26 | 192.168.1.226 | 192.168.1.226/32 + 192.168.1.0/24 | 192.168.1.0/24 | 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.0/24 | 192.168.1.0/25 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.0/24 | 192.168.1.255/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.0/24 | 192.168.1.255/25 | 192.168.1.128/25 + 10.0.0.0/8 | 10.0.0.0/8 | 10.1.2.3/8 | 10.0.0.0/8 + 10.0.0.0/32 | 10.0.0.0/32 | 10.1.2.3/8 | 10.0.0.0/8 + 10.1.2.3/32 | 10.1.2.3/32 | 10.1.2.3 | 10.1.2.3/32 + 10.1.2.0/24 | 10.1.2.0/24 | 10.1.2.3/24 | 10.1.2.0/24 + 10.1.0.0/16 | 10.1.0.0/16 | 10.1.2.3/16 | 10.1.0.0/16 + 10.0.0.0/8 | 10.0.0.0/8 | 10.1.2.3/8 | 10.0.0.0/8 + 10.0.0.0/8 | 10.0.0.0/8 | 11.1.2.3/8 | 11.0.0.0/8 + 10.0.0.0/8 | 10.0.0.0/8 | 9.1.2.3/8 | 9.0.0.0/8 + 10:23::f1/128 | 10:23::f1/128 | 10:23::f1/64 | 10:23::/64 + 10:23::8000/113 | 10:23::8000/113 | 10:23::ffff | 10:23::ffff/128 + ::ffff:1.2.3.4/128 | ::ffff:1.2.3.4/128 | ::4.3.2.1/24 | ::/24 +(17 rows) + +SELECT c AS cidr, masklen(c) AS "masklen(cidr)", + i AS inet, masklen(i) AS "masklen(inet)" FROM INET_TBL; + cidr | masklen(cidr) | inet | masklen(inet) +--------------------+---------------+------------------+--------------- + 192.168.1.0/24 | 24 | 192.168.1.226/24 | 24 + 192.168.1.0/26 | 26 | 192.168.1.226 | 32 + 192.168.1.0/24 | 24 | 192.168.1.0/24 | 24 + 192.168.1.0/24 | 24 | 192.168.1.0/25 | 25 + 192.168.1.0/24 | 24 | 192.168.1.255/24 | 24 + 192.168.1.0/24 | 24 | 192.168.1.255/25 | 25 + 10.0.0.0/8 | 8 | 10.1.2.3/8 | 8 + 10.0.0.0/32 | 32 | 10.1.2.3/8 | 8 + 10.1.2.3/32 | 32 | 10.1.2.3 | 32 + 10.1.2.0/24 | 24 | 10.1.2.3/24 | 24 + 10.1.0.0/16 | 16 | 10.1.2.3/16 | 16 + 10.0.0.0/8 | 8 | 10.1.2.3/8 | 8 + 10.0.0.0/8 | 8 | 11.1.2.3/8 | 8 + 10.0.0.0/8 | 8 | 9.1.2.3/8 | 8 + 10:23::f1/128 | 128 | 10:23::f1/64 | 64 + 10:23::8000/113 | 113 | 10:23::ffff | 128 + ::ffff:1.2.3.4/128 | 128 | ::4.3.2.1/24 | 24 +(17 rows) + +SELECT c AS cidr, masklen(c) AS "masklen(cidr)", + i AS inet, masklen(i) AS "masklen(inet)" FROM INET_TBL + WHERE masklen(c) <= 8; + cidr | masklen(cidr) | inet | masklen(inet) +------------+---------------+------------+--------------- + 10.0.0.0/8 | 8 | 10.1.2.3/8 | 8 + 10.0.0.0/8 | 8 | 10.1.2.3/8 | 8 + 10.0.0.0/8 | 8 | 11.1.2.3/8 | 8 + 10.0.0.0/8 | 8 | 9.1.2.3/8 | 8 +(4 rows) + +SELECT c AS cidr, i AS inet FROM INET_TBL + WHERE c = i; + cidr | inet +----------------+---------------- + 192.168.1.0/24 | 192.168.1.0/24 + 10.1.2.3/32 | 10.1.2.3 +(2 rows) + +SELECT i, c, + i < c AS lt, i <= c AS le, i = c AS eq, + i >= c AS ge, i > c AS gt, i <> c AS ne, + i << c AS sb, i <<= c AS sbe, + i >> c AS sup, i >>= c AS spe, + i && c AS ovr + FROM INET_TBL; + i | c | lt | le | eq | ge | gt | ne | sb | sbe | sup | spe | ovr +------------------+--------------------+----+----+----+----+----+----+----+-----+-----+-----+----- + 192.168.1.226/24 | 192.168.1.0/24 | f | f | f | t | t | t | f | t | f | t | t + 192.168.1.226 | 192.168.1.0/26 | f | f | f | t | t | t | f | f | f | f | f + 192.168.1.0/24 | 192.168.1.0/24 | f | t | t | t | f | f | f | t | f | t | t + 192.168.1.0/25 | 192.168.1.0/24 | f | f | f | t | t | t | t | t | f | f | t + 192.168.1.255/24 | 192.168.1.0/24 | f | f | f | t | t | t | f | t | f | t | t + 192.168.1.255/25 | 192.168.1.0/24 | f | f | f | t | t | t | t | t | f | f | t + 10.1.2.3/8 | 10.0.0.0/8 | f | f | f | t | t | t | f | t | f | t | t + 10.1.2.3/8 | 10.0.0.0/32 | t | t | f | f | f | t | f | f | t | t | t + 10.1.2.3 | 10.1.2.3/32 | f | t | t | t | f | f | f | t | f | t | t + 10.1.2.3/24 | 10.1.2.0/24 | f | f | f | t | t | t | f | t | f | t | t + 10.1.2.3/16 | 10.1.0.0/16 | f | f | f | t | t | t | f | t | f | t | t + 10.1.2.3/8 | 10.0.0.0/8 | f | f | f | t | t | t | f | t | f | t | t + 11.1.2.3/8 | 10.0.0.0/8 | f | f | f | t | t | t | f | f | f | f | f + 9.1.2.3/8 | 10.0.0.0/8 | t | t | f | f | f | t | f | f | f | f | f + 10:23::f1/64 | 10:23::f1/128 | t | t | f | f | f | t | f | f | t | t | t + 10:23::ffff | 10:23::8000/113 | f | f | f | t | t | t | t | t | f | f | t + ::4.3.2.1/24 | ::ffff:1.2.3.4/128 | t | t | f | f | f | t | f | f | t | t | t +(17 rows) + +SELECT max(i) AS max, min(i) AS min FROM INET_TBL; + max | min +-------------+----------- + 10:23::ffff | 9.1.2.3/8 +(1 row) + +SELECT max(c) AS max, min(c) AS min FROM INET_TBL; + max | min +-----------------+------------ + 10:23::8000/113 | 10.0.0.0/8 +(1 row) + +-- check the conversion to/from text and set_netmask +SELECT set_masklen(inet(text(i)), 24) FROM INET_TBL; + set_masklen +------------------ + 192.168.1.226/24 + 192.168.1.226/24 + 192.168.1.0/24 + 192.168.1.0/24 + 192.168.1.255/24 + 192.168.1.255/24 + 10.1.2.3/24 + 10.1.2.3/24 + 10.1.2.3/24 + 10.1.2.3/24 + 10.1.2.3/24 + 10.1.2.3/24 + 11.1.2.3/24 + 9.1.2.3/24 + 10:23::f1/24 + 10:23::ffff/24 + ::4.3.2.1/24 +(17 rows) + +-- check that btree index works correctly +CREATE INDEX inet_idx1 ON inet_tbl(i); +SET enable_seqscan TO off; +EXPLAIN (COSTS OFF) +SELECT * FROM inet_tbl WHERE i<<'192.168.1.0/24'::cidr; + QUERY PLAN +------------------------------------------------------------------------------- + Index Scan using inet_idx1 on inet_tbl + Index Cond: ((i > '192.168.1.0/24'::inet) AND (i <= '192.168.1.255'::inet)) + Filter: (i << '192.168.1.0/24'::inet) +(3 rows) + +SELECT * FROM inet_tbl WHERE i<<'192.168.1.0/24'::cidr; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM inet_tbl WHERE i<<='192.168.1.0/24'::cidr; + QUERY PLAN +-------------------------------------------------------------------------------- + Index Scan using inet_idx1 on inet_tbl + Index Cond: ((i >= '192.168.1.0/24'::inet) AND (i <= '192.168.1.255'::inet)) + Filter: (i <<= '192.168.1.0/24'::inet) +(3 rows) + +SELECT * FROM inet_tbl WHERE i<<='192.168.1.0/24'::cidr; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(6 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM inet_tbl WHERE '192.168.1.0/24'::cidr >>= i; + QUERY PLAN +-------------------------------------------------------------------------------- + Index Scan using inet_idx1 on inet_tbl + Index Cond: ((i >= '192.168.1.0/24'::inet) AND (i <= '192.168.1.255'::inet)) + Filter: ('192.168.1.0/24'::inet >>= i) +(3 rows) + +SELECT * FROM inet_tbl WHERE '192.168.1.0/24'::cidr >>= i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(6 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM inet_tbl WHERE '192.168.1.0/24'::cidr >> i; + QUERY PLAN +------------------------------------------------------------------------------- + Index Scan using inet_idx1 on inet_tbl + Index Cond: ((i > '192.168.1.0/24'::inet) AND (i <= '192.168.1.255'::inet)) + Filter: ('192.168.1.0/24'::inet >> i) +(3 rows) + +SELECT * FROM inet_tbl WHERE '192.168.1.0/24'::cidr >> i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(3 rows) + +SET enable_seqscan TO on; +DROP INDEX inet_idx1; +-- check that gist index works correctly +CREATE INDEX inet_idx2 ON inet_tbl using gist (i inet_ops); +SET enable_seqscan TO off; +SELECT * FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(3 rows) + +SELECT * FROM inet_tbl WHERE i <<= '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(6 rows) + +SELECT * FROM inet_tbl WHERE i && '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(6 rows) + +SELECT * FROM inet_tbl WHERE i >>= '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 +(3 rows) + +SELECT * FROM inet_tbl WHERE i >> '192.168.1.0/24'::cidr ORDER BY i; + c | i +---+--- +(0 rows) + +SELECT * FROM inet_tbl WHERE i < '192.168.1.0/24'::cidr ORDER BY i; + c | i +-------------+------------- + 10.0.0.0/8 | 9.1.2.3/8 + 10.0.0.0/32 | 10.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.1.0.0/16 | 10.1.2.3/16 + 10.1.2.0/24 | 10.1.2.3/24 + 10.1.2.3/32 | 10.1.2.3 + 10.0.0.0/8 | 11.1.2.3/8 +(8 rows) + +SELECT * FROM inet_tbl WHERE i <= '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+---------------- + 10.0.0.0/8 | 9.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.0.0.0/32 | 10.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.1.0.0/16 | 10.1.2.3/16 + 10.1.2.0/24 | 10.1.2.3/24 + 10.1.2.3/32 | 10.1.2.3 + 10.0.0.0/8 | 11.1.2.3/8 + 192.168.1.0/24 | 192.168.1.0/24 +(9 rows) + +SELECT * FROM inet_tbl WHERE i = '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+---------------- + 192.168.1.0/24 | 192.168.1.0/24 +(1 row) + +SELECT * FROM inet_tbl WHERE i >= '192.168.1.0/24'::cidr ORDER BY i; + c | i +--------------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 + ::ffff:1.2.3.4/128 | ::4.3.2.1/24 + 10:23::f1/128 | 10:23::f1/64 + 10:23::8000/113 | 10:23::ffff +(9 rows) + +SELECT * FROM inet_tbl WHERE i > '192.168.1.0/24'::cidr ORDER BY i; + c | i +--------------------+------------------ + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 + ::ffff:1.2.3.4/128 | ::4.3.2.1/24 + 10:23::f1/128 | 10:23::f1/64 + 10:23::8000/113 | 10:23::ffff +(8 rows) + +SELECT * FROM inet_tbl WHERE i <> '192.168.1.0/24'::cidr ORDER BY i; + c | i +--------------------+------------------ + 10.0.0.0/8 | 9.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.0.0.0/32 | 10.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.1.0.0/16 | 10.1.2.3/16 + 10.1.2.0/24 | 10.1.2.3/24 + 10.1.2.3/32 | 10.1.2.3 + 10.0.0.0/8 | 11.1.2.3/8 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 + ::ffff:1.2.3.4/128 | ::4.3.2.1/24 + 10:23::f1/128 | 10:23::f1/64 + 10:23::8000/113 | 10:23::ffff +(16 rows) + +-- test index-only scans +EXPLAIN (COSTS OFF) +SELECT i FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; + QUERY PLAN +--------------------------------------------------- + Sort + Sort Key: i + -> Index Only Scan using inet_idx2 on inet_tbl + Index Cond: (i << '192.168.1.0/24'::inet) +(4 rows) + +SELECT i FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; + i +------------------ + 192.168.1.0/25 + 192.168.1.255/25 + 192.168.1.226 +(3 rows) + +SET enable_seqscan TO on; +DROP INDEX inet_idx2; +-- check that spgist index works correctly +CREATE INDEX inet_idx3 ON inet_tbl using spgist (i); +SET enable_seqscan TO off; +SELECT * FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(3 rows) + +SELECT * FROM inet_tbl WHERE i <<= '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(6 rows) + +SELECT * FROM inet_tbl WHERE i && '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 +(6 rows) + +SELECT * FROM inet_tbl WHERE i >>= '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 +(3 rows) + +SELECT * FROM inet_tbl WHERE i >> '192.168.1.0/24'::cidr ORDER BY i; + c | i +---+--- +(0 rows) + +SELECT * FROM inet_tbl WHERE i < '192.168.1.0/24'::cidr ORDER BY i; + c | i +-------------+------------- + 10.0.0.0/8 | 9.1.2.3/8 + 10.0.0.0/32 | 10.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.1.0.0/16 | 10.1.2.3/16 + 10.1.2.0/24 | 10.1.2.3/24 + 10.1.2.3/32 | 10.1.2.3 + 10.0.0.0/8 | 11.1.2.3/8 +(8 rows) + +SELECT * FROM inet_tbl WHERE i <= '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+---------------- + 10.0.0.0/8 | 9.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.0.0.0/32 | 10.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.1.0.0/16 | 10.1.2.3/16 + 10.1.2.0/24 | 10.1.2.3/24 + 10.1.2.3/32 | 10.1.2.3 + 10.0.0.0/8 | 11.1.2.3/8 + 192.168.1.0/24 | 192.168.1.0/24 +(9 rows) + +SELECT * FROM inet_tbl WHERE i = '192.168.1.0/24'::cidr ORDER BY i; + c | i +----------------+---------------- + 192.168.1.0/24 | 192.168.1.0/24 +(1 row) + +SELECT * FROM inet_tbl WHERE i >= '192.168.1.0/24'::cidr ORDER BY i; + c | i +--------------------+------------------ + 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 + ::ffff:1.2.3.4/128 | ::4.3.2.1/24 + 10:23::f1/128 | 10:23::f1/64 + 10:23::8000/113 | 10:23::ffff +(9 rows) + +SELECT * FROM inet_tbl WHERE i > '192.168.1.0/24'::cidr ORDER BY i; + c | i +--------------------+------------------ + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 + ::ffff:1.2.3.4/128 | ::4.3.2.1/24 + 10:23::f1/128 | 10:23::f1/64 + 10:23::8000/113 | 10:23::ffff +(8 rows) + +SELECT * FROM inet_tbl WHERE i <> '192.168.1.0/24'::cidr ORDER BY i; + c | i +--------------------+------------------ + 10.0.0.0/8 | 9.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.0.0.0/32 | 10.1.2.3/8 + 10.0.0.0/8 | 10.1.2.3/8 + 10.1.0.0/16 | 10.1.2.3/16 + 10.1.2.0/24 | 10.1.2.3/24 + 10.1.2.3/32 | 10.1.2.3 + 10.0.0.0/8 | 11.1.2.3/8 + 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.0/24 | 192.168.1.255/25 + 192.168.1.0/26 | 192.168.1.226 + ::ffff:1.2.3.4/128 | ::4.3.2.1/24 + 10:23::f1/128 | 10:23::f1/64 + 10:23::8000/113 | 10:23::ffff +(16 rows) + +-- test index-only scans +EXPLAIN (COSTS OFF) +SELECT i FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; + QUERY PLAN +--------------------------------------------------- + Sort + Sort Key: i + -> Index Only Scan using inet_idx3 on inet_tbl + Index Cond: (i << '192.168.1.0/24'::inet) +(4 rows) + +SELECT i FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; + i +------------------ + 192.168.1.0/25 + 192.168.1.255/25 + 192.168.1.226 +(3 rows) + +SET enable_seqscan TO on; +DROP INDEX inet_idx3; +-- simple tests of inet boolean and arithmetic operators +SELECT i, ~i AS "~i" FROM inet_tbl; + i | ~i +------------------+-------------------------------------------- + 192.168.1.226/24 | 63.87.254.29/24 + 192.168.1.226 | 63.87.254.29 + 192.168.1.0/24 | 63.87.254.255/24 + 192.168.1.0/25 | 63.87.254.255/25 + 192.168.1.255/24 | 63.87.254.0/24 + 192.168.1.255/25 | 63.87.254.0/25 + 10.1.2.3/8 | 245.254.253.252/8 + 10.1.2.3/8 | 245.254.253.252/8 + 10.1.2.3 | 245.254.253.252 + 10.1.2.3/24 | 245.254.253.252/24 + 10.1.2.3/16 | 245.254.253.252/16 + 10.1.2.3/8 | 245.254.253.252/8 + 11.1.2.3/8 | 244.254.253.252/8 + 9.1.2.3/8 | 246.254.253.252/8 + 10:23::f1/64 | ffef:ffdc:ffff:ffff:ffff:ffff:ffff:ff0e/64 + 10:23::ffff | ffef:ffdc:ffff:ffff:ffff:ffff:ffff:0 + ::4.3.2.1/24 | ffff:ffff:ffff:ffff:ffff:ffff:fbfc:fdfe/24 +(17 rows) + +SELECT i, c, i & c AS "and" FROM inet_tbl; + i | c | and +------------------+--------------------+---------------- + 192.168.1.226/24 | 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.226 | 192.168.1.0/26 | 192.168.1.0 + 192.168.1.0/24 | 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/25 | 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.255/24 | 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.255/25 | 192.168.1.0/24 | 192.168.1.0/25 + 10.1.2.3/8 | 10.0.0.0/8 | 10.0.0.0/8 + 10.1.2.3/8 | 10.0.0.0/32 | 10.0.0.0 + 10.1.2.3 | 10.1.2.3/32 | 10.1.2.3 + 10.1.2.3/24 | 10.1.2.0/24 | 10.1.2.0/24 + 10.1.2.3/16 | 10.1.0.0/16 | 10.1.0.0/16 + 10.1.2.3/8 | 10.0.0.0/8 | 10.0.0.0/8 + 11.1.2.3/8 | 10.0.0.0/8 | 10.0.0.0/8 + 9.1.2.3/8 | 10.0.0.0/8 | 8.0.0.0/8 + 10:23::f1/64 | 10:23::f1/128 | 10:23::f1 + 10:23::ffff | 10:23::8000/113 | 10:23::8000 + ::4.3.2.1/24 | ::ffff:1.2.3.4/128 | ::0.2.2.0 +(17 rows) + +SELECT i, c, i | c AS "or" FROM inet_tbl; + i | c | or +------------------+--------------------+------------------ + 192.168.1.226/24 | 192.168.1.0/24 | 192.168.1.226/24 + 192.168.1.226 | 192.168.1.0/26 | 192.168.1.226 + 192.168.1.0/24 | 192.168.1.0/24 | 192.168.1.0/24 + 192.168.1.0/25 | 192.168.1.0/24 | 192.168.1.0/25 + 192.168.1.255/24 | 192.168.1.0/24 | 192.168.1.255/24 + 192.168.1.255/25 | 192.168.1.0/24 | 192.168.1.255/25 + 10.1.2.3/8 | 10.0.0.0/8 | 10.1.2.3/8 + 10.1.2.3/8 | 10.0.0.0/32 | 10.1.2.3 + 10.1.2.3 | 10.1.2.3/32 | 10.1.2.3 + 10.1.2.3/24 | 10.1.2.0/24 | 10.1.2.3/24 + 10.1.2.3/16 | 10.1.0.0/16 | 10.1.2.3/16 + 10.1.2.3/8 | 10.0.0.0/8 | 10.1.2.3/8 + 11.1.2.3/8 | 10.0.0.0/8 | 11.1.2.3/8 + 9.1.2.3/8 | 10.0.0.0/8 | 11.1.2.3/8 + 10:23::f1/64 | 10:23::f1/128 | 10:23::f1 + 10:23::ffff | 10:23::8000/113 | 10:23::ffff + ::4.3.2.1/24 | ::ffff:1.2.3.4/128 | ::ffff:5.3.3.5 +(17 rows) + +SELECT i, i + 500 AS "i+500" FROM inet_tbl; + i | i+500 +------------------+------------------ + 192.168.1.226/24 | 192.168.3.214/24 + 192.168.1.226 | 192.168.3.214 + 192.168.1.0/24 | 192.168.2.244/24 + 192.168.1.0/25 | 192.168.2.244/25 + 192.168.1.255/24 | 192.168.3.243/24 + 192.168.1.255/25 | 192.168.3.243/25 + 10.1.2.3/8 | 10.1.3.247/8 + 10.1.2.3/8 | 10.1.3.247/8 + 10.1.2.3 | 10.1.3.247 + 10.1.2.3/24 | 10.1.3.247/24 + 10.1.2.3/16 | 10.1.3.247/16 + 10.1.2.3/8 | 10.1.3.247/8 + 11.1.2.3/8 | 11.1.3.247/8 + 9.1.2.3/8 | 9.1.3.247/8 + 10:23::f1/64 | 10:23::2e5/64 + 10:23::ffff | 10:23::1:1f3 + ::4.3.2.1/24 | ::4.3.3.245/24 +(17 rows) + +SELECT i, i - 500 AS "i-500" FROM inet_tbl; + i | i-500 +------------------+---------------------------------------- + 192.168.1.226/24 | 192.167.255.238/24 + 192.168.1.226 | 192.167.255.238 + 192.168.1.0/24 | 192.167.255.12/24 + 192.168.1.0/25 | 192.167.255.12/25 + 192.168.1.255/24 | 192.168.0.11/24 + 192.168.1.255/25 | 192.168.0.11/25 + 10.1.2.3/8 | 10.1.0.15/8 + 10.1.2.3/8 | 10.1.0.15/8 + 10.1.2.3 | 10.1.0.15 + 10.1.2.3/24 | 10.1.0.15/24 + 10.1.2.3/16 | 10.1.0.15/16 + 10.1.2.3/8 | 10.1.0.15/8 + 11.1.2.3/8 | 11.1.0.15/8 + 9.1.2.3/8 | 9.1.0.15/8 + 10:23::f1/64 | 10:22:ffff:ffff:ffff:ffff:ffff:fefd/64 + 10:23::ffff | 10:23::fe0b + ::4.3.2.1/24 | ::4.3.0.13/24 +(17 rows) + +SELECT i, c, i - c AS "minus" FROM inet_tbl; + i | c | minus +------------------+--------------------+------------------ + 192.168.1.226/24 | 192.168.1.0/24 | 226 + 192.168.1.226 | 192.168.1.0/26 | 226 + 192.168.1.0/24 | 192.168.1.0/24 | 0 + 192.168.1.0/25 | 192.168.1.0/24 | 0 + 192.168.1.255/24 | 192.168.1.0/24 | 255 + 192.168.1.255/25 | 192.168.1.0/24 | 255 + 10.1.2.3/8 | 10.0.0.0/8 | 66051 + 10.1.2.3/8 | 10.0.0.0/32 | 66051 + 10.1.2.3 | 10.1.2.3/32 | 0 + 10.1.2.3/24 | 10.1.2.0/24 | 3 + 10.1.2.3/16 | 10.1.0.0/16 | 515 + 10.1.2.3/8 | 10.0.0.0/8 | 66051 + 11.1.2.3/8 | 10.0.0.0/8 | 16843267 + 9.1.2.3/8 | 10.0.0.0/8 | -16711165 + 10:23::f1/64 | 10:23::f1/128 | 0 + 10:23::ffff | 10:23::8000/113 | 32767 + ::4.3.2.1/24 | ::ffff:1.2.3.4/128 | -281470631346435 +(17 rows) + +SELECT '127.0.0.1'::inet + 257; + ?column? +----------- + 127.0.1.2 +(1 row) + +SELECT ('127.0.0.1'::inet + 257) - 257; + ?column? +----------- + 127.0.0.1 +(1 row) + +SELECT '127::1'::inet + 257; + ?column? +---------- + 127::102 +(1 row) + +SELECT ('127::1'::inet + 257) - 257; + ?column? +---------- + 127::1 +(1 row) + +SELECT '127.0.0.2'::inet - ('127.0.0.2'::inet + 500); + ?column? +---------- + -500 +(1 row) + +SELECT '127.0.0.2'::inet - ('127.0.0.2'::inet - 500); + ?column? +---------- + 500 +(1 row) + +SELECT '127::2'::inet - ('127::2'::inet + 500); + ?column? +---------- + -500 +(1 row) + +SELECT '127::2'::inet - ('127::2'::inet - 500); + ?column? +---------- + 500 +(1 row) + +-- these should give overflow errors: +SELECT '127.0.0.1'::inet + 10000000000; +ERROR: result is out of range +SELECT '127.0.0.1'::inet - 10000000000; +ERROR: result is out of range +SELECT '126::1'::inet - '127::2'::inet; +ERROR: result is out of range +SELECT '127::1'::inet - '126::2'::inet; +ERROR: result is out of range +-- but not these +SELECT '127::1'::inet + 10000000000; + ?column? +------------------ + 127::2:540b:e401 +(1 row) + +SELECT '127::1'::inet - '127::2'::inet; + ?column? +---------- + -1 +(1 row) + +-- insert one more row with addressed from different families +INSERT INTO INET_TBL (c, i) VALUES ('10', '10::/8'); +-- now, this one should fail +SELECT inet_merge(c, i) FROM INET_TBL; +ERROR: cannot merge addresses from different families +-- fix it by inet_same_family() condition +SELECT inet_merge(c, i) FROM INET_TBL WHERE inet_same_family(c, i); + inet_merge +----------------- + 192.168.1.0/24 + 192.168.1.0/24 + 192.168.1.0/24 + 192.168.1.0/24 + 192.168.1.0/24 + 192.168.1.0/24 + 10.0.0.0/8 + 10.0.0.0/8 + 10.1.2.3/32 + 10.1.2.0/24 + 10.1.0.0/16 + 10.0.0.0/8 + 10.0.0.0/7 + 8.0.0.0/6 + 10:23::/64 + 10:23::8000/113 + ::/24 +(17 rows) + +-- Test inet sortsupport with a variety of boundary inputs: +SELECT a FROM (VALUES + ('0.0.0.0/0'::inet), + ('0.0.0.0/1'::inet), + ('0.0.0.0/32'::inet), + ('0.0.0.1/0'::inet), + ('0.0.0.1/1'::inet), + ('127.126.127.127/0'::inet), + ('127.127.127.127/0'::inet), + ('127.128.127.127/0'::inet), + ('192.168.1.0/24'::inet), + ('192.168.1.0/25'::inet), + ('192.168.1.1/23'::inet), + ('192.168.1.1/5'::inet), + ('192.168.1.1/6'::inet), + ('192.168.1.1/25'::inet), + ('192.168.1.2/25'::inet), + ('192.168.1.1/26'::inet), + ('192.168.1.2/26'::inet), + ('192.168.1.2/23'::inet), + ('192.168.1.255/5'::inet), + ('192.168.1.255/6'::inet), + ('192.168.1.3/1'::inet), + ('192.168.1.3/23'::inet), + ('192.168.1.4/0'::inet), + ('192.168.1.5/0'::inet), + ('255.0.0.0/0'::inet), + ('255.1.0.0/0'::inet), + ('255.2.0.0/0'::inet), + ('255.255.000.000/0'::inet), + ('255.255.000.000/0'::inet), + ('255.255.000.000/15'::inet), + ('255.255.000.000/16'::inet), + ('255.255.255.254/32'::inet), + ('255.255.255.000/32'::inet), + ('255.255.255.001/31'::inet), + ('255.255.255.002/31'::inet), + ('255.255.255.003/31'::inet), + ('255.255.255.003/32'::inet), + ('255.255.255.001/32'::inet), + ('255.255.255.255/0'::inet), + ('255.255.255.255/0'::inet), + ('255.255.255.255/0'::inet), + ('255.255.255.255/1'::inet), + ('255.255.255.255/16'::inet), + ('255.255.255.255/16'::inet), + ('255.255.255.255/31'::inet), + ('255.255.255.255/32'::inet), + ('255.255.255.253/32'::inet), + ('255.255.255.252/32'::inet), + ('255.3.0.0/0'::inet), + ('0000:0000:0000:0000:0000:0000:0000:0000/0'::inet), + ('0000:0000:0000:0000:0000:0000:0000:0000/128'::inet), + ('0000:0000:0000:0000:0000:0000:0000:0001/128'::inet), + ('10:23::f1/64'::inet), + ('10:23::f1/65'::inet), + ('10:23::ffff'::inet), + ('127::1'::inet), + ('127::2'::inet), + ('8000:0000:0000:0000:0000:0000:0000:0000/1'::inet), + ('::1:ffff:ffff:ffff:ffff/128'::inet), + ('::2:ffff:ffff:ffff:ffff/128'::inet), + ('::4:3:2:0/24'::inet), + ('::4:3:2:1/24'::inet), + ('::4:3:2:2/24'::inet), + ('ffff:83e7:f118:57dc:6093:6d92:689d:58cf/70'::inet), + ('ffff:84b0:4775:536e:c3ed:7116:a6d6:34f0/44'::inet), + ('ffff:8566:f84:5867:47f1:7867:d2ba:8a1a/69'::inet), + ('ffff:8883:f028:7d2:4d68:d510:7d6b:ac43/73'::inet), + ('ffff:8ae8:7c14:65b3:196:8e4a:89ae:fb30/89'::inet), + ('ffff:8dd0:646:694c:7c16:7e35:6a26:171/104'::inet), + ('ffff:8eef:cbf:700:eda3:ae32:f4b4:318b/121'::inet), + ('ffff:90e7:e744:664:a93:8efe:1f25:7663/122'::inet), + ('ffff:9597:c69c:8b24:57a:8639:ec78:6026/111'::inet), + ('ffff:9e86:79ea:f16e:df31:8e4d:7783:532e/88'::inet), + ('ffff:a0c7:82d3:24de:f762:6e1f:316d:3fb2/23'::inet), + ('ffff:fffa:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:fffb:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:fffc:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:fffd:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:fffe:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffa:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffb:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffc:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffd::/128'::inet), + ('ffff:ffff:ffff:fffd:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffe::/128'::inet), + ('ffff:ffff:ffff:fffe:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:ffff:4:3:2:0/24'::inet), + ('ffff:ffff:ffff:ffff:4:3:2:1/24'::inet), + ('ffff:ffff:ffff:ffff:4:3:2:2/24'::inet), + ('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::inet) +) AS i(a) ORDER BY a; + a +-------------------------------------------- + 0.0.0.0/0 + 0.0.0.1/0 + 127.126.127.127/0 + 127.127.127.127/0 + 127.128.127.127/0 + 192.168.1.4/0 + 192.168.1.5/0 + 255.0.0.0/0 + 255.1.0.0/0 + 255.2.0.0/0 + 255.3.0.0/0 + 255.255.0.0/0 + 255.255.0.0/0 + 255.255.255.255/0 + 255.255.255.255/0 + 255.255.255.255/0 + 0.0.0.0/1 + 0.0.0.1/1 + 0.0.0.0 + 192.168.1.3/1 + 255.255.255.255/1 + 192.168.1.1/5 + 192.168.1.255/5 + 192.168.1.1/6 + 192.168.1.255/6 + 192.168.1.1/23 + 192.168.1.2/23 + 192.168.1.3/23 + 192.168.1.0/24 + 192.168.1.0/25 + 192.168.1.1/25 + 192.168.1.2/25 + 192.168.1.1/26 + 192.168.1.2/26 + 255.255.0.0/15 + 255.255.0.0/16 + 255.255.255.255/16 + 255.255.255.255/16 + 255.255.255.1/31 + 255.255.255.0 + 255.255.255.1 + 255.255.255.2/31 + 255.255.255.3/31 + 255.255.255.3 + 255.255.255.252 + 255.255.255.253 + 255.255.255.255/31 + 255.255.255.254 + 255.255.255.255 + ::/0 + ffff:fffa:ffff:ffff:ffff:ffff:ffff:ffff/0 + ffff:fffb:ffff:ffff:ffff:ffff:ffff:ffff/0 + ffff:fffc:ffff:ffff:ffff:ffff:ffff:ffff/0 + ffff:fffd:ffff:ffff:ffff:ffff:ffff:ffff/0 + ffff:fffe:ffff:ffff:ffff:ffff:ffff:ffff/0 + ffff:ffff:ffff:fffa:ffff:ffff:ffff:ffff/0 + ffff:ffff:ffff:fffb:ffff:ffff:ffff:ffff/0 + ffff:ffff:ffff:fffc:ffff:ffff:ffff:ffff/0 + ffff:ffff:ffff:fffd:ffff:ffff:ffff:ffff/0 + ffff:ffff:ffff:fffe:ffff:ffff:ffff:ffff/0 + ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/0 + ::4:3:2:0/24 + ::4:3:2:1/24 + ::4:3:2:2/24 + :: + ::1 + ::1:ffff:ffff:ffff:ffff + ::2:ffff:ffff:ffff:ffff + 10:23::f1/64 + 10:23::f1/65 + 10:23::ffff + 127::1 + 127::2 + 8000::/1 + ffff:83e7:f118:57dc:6093:6d92:689d:58cf/70 + ffff:84b0:4775:536e:c3ed:7116:a6d6:34f0/44 + ffff:8566:f84:5867:47f1:7867:d2ba:8a1a/69 + ffff:8883:f028:7d2:4d68:d510:7d6b:ac43/73 + ffff:8ae8:7c14:65b3:196:8e4a:89ae:fb30/89 + ffff:8dd0:646:694c:7c16:7e35:6a26:171/104 + ffff:8eef:cbf:700:eda3:ae32:f4b4:318b/121 + ffff:90e7:e744:664:a93:8efe:1f25:7663/122 + ffff:9597:c69c:8b24:57a:8639:ec78:6026/111 + ffff:9e86:79ea:f16e:df31:8e4d:7783:532e/88 + ffff:a0c7:82d3:24de:f762:6e1f:316d:3fb2/23 + ffff:ffff:ffff:ffff:4:3:2:0/24 + ffff:ffff:ffff:ffff:4:3:2:1/24 + ffff:ffff:ffff:ffff:4:3:2:2/24 + ffff:ffff:ffff:fffd:: + ffff:ffff:ffff:fffe:: + ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff +(91 rows) + diff --git a/src/test/singlenode_regress/expected/infinite_recurse.out b/src/test/singlenode_regress/expected/infinite_recurse.out new file mode 100644 index 00000000000..aa102fadd83 --- /dev/null +++ b/src/test/singlenode_regress/expected/infinite_recurse.out @@ -0,0 +1,24 @@ +-- Check that stack depth detection mechanism works and +-- max_stack_depth is not set too high. +create function infinite_recurse() returns int as +'select infinite_recurse()' language sql; +-- Unfortunately, up till mid 2020 the Linux kernel had a bug in PPC64 +-- signal handling that would cause this test to crash if it happened +-- to receive an sinval catchup interrupt while the stack is deep: +-- https://bugzilla.kernel.org/show_bug.cgi?id=205183 +-- It is likely to be many years before that bug disappears from all +-- production kernels, so disable this test on such platforms. +-- (We still create the function, so as not to have a cross-platform +-- difference in the end state of the regression database.) +SELECT version() ~ 'powerpc64[^,]*-linux-gnu' + AS skip_test \gset +\if :skip_test +\quit +\endif +-- The full error report is not very stable, so we show only SQLSTATE +-- and primary error message. +\set VERBOSITY sqlstate +select infinite_recurse(); +ERROR: 54001 +\echo :LAST_ERROR_MESSAGE +stack depth limit exceeded diff --git a/src/test/singlenode_regress/expected/infinite_recurse_1.out b/src/test/singlenode_regress/expected/infinite_recurse_1.out new file mode 100644 index 00000000000..b2c99a0d0d4 --- /dev/null +++ b/src/test/singlenode_regress/expected/infinite_recurse_1.out @@ -0,0 +1,16 @@ +-- Check that stack depth detection mechanism works and +-- max_stack_depth is not set too high. +create function infinite_recurse() returns int as +'select infinite_recurse()' language sql; +-- Unfortunately, up till mid 2020 the Linux kernel had a bug in PPC64 +-- signal handling that would cause this test to crash if it happened +-- to receive an sinval catchup interrupt while the stack is deep: +-- https://bugzilla.kernel.org/show_bug.cgi?id=205183 +-- It is likely to be many years before that bug disappears from all +-- production kernels, so disable this test on such platforms. +-- (We still create the function, so as not to have a cross-platform +-- difference in the end state of the regression database.) +SELECT version() ~ 'powerpc64[^,]*-linux-gnu' + AS skip_test \gset +\if :skip_test +\quit diff --git a/src/test/singlenode_regress/expected/inherit.out b/src/test/singlenode_regress/expected/inherit.out new file mode 100644 index 00000000000..22c334a1423 --- /dev/null +++ b/src/test/singlenode_regress/expected/inherit.out @@ -0,0 +1,2635 @@ +-- +-- Test inheritance features +-- +CREATE TABLE a (aa TEXT); +CREATE TABLE b (bb TEXT) INHERITS (a); +CREATE TABLE c (cc TEXT) INHERITS (a); +CREATE TABLE d (dd TEXT) INHERITS (b,c,a); +NOTICE: merging multiple inherited definitions of column "aa" +NOTICE: merging multiple inherited definitions of column "aa" +INSERT INTO a(aa) VALUES('aaa'); +INSERT INTO a(aa) VALUES('aaaa'); +INSERT INTO a(aa) VALUES('aaaaa'); +INSERT INTO a(aa) VALUES('aaaaaa'); +INSERT INTO a(aa) VALUES('aaaaaaa'); +INSERT INTO a(aa) VALUES('aaaaaaaa'); +INSERT INTO b(aa) VALUES('bbb'); +INSERT INTO b(aa) VALUES('bbbb'); +INSERT INTO b(aa) VALUES('bbbbb'); +INSERT INTO b(aa) VALUES('bbbbbb'); +INSERT INTO b(aa) VALUES('bbbbbbb'); +INSERT INTO b(aa) VALUES('bbbbbbbb'); +INSERT INTO c(aa) VALUES('ccc'); +INSERT INTO c(aa) VALUES('cccc'); +INSERT INTO c(aa) VALUES('ccccc'); +INSERT INTO c(aa) VALUES('cccccc'); +INSERT INTO c(aa) VALUES('ccccccc'); +INSERT INTO c(aa) VALUES('cccccccc'); +INSERT INTO d(aa) VALUES('ddd'); +INSERT INTO d(aa) VALUES('dddd'); +INSERT INTO d(aa) VALUES('ddddd'); +INSERT INTO d(aa) VALUES('dddddd'); +INSERT INTO d(aa) VALUES('ddddddd'); +INSERT INTO d(aa) VALUES('dddddddd'); +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+---------- + a | aaa + a | aaaa + a | aaaaa + a | aaaaaa + a | aaaaaaa + a | aaaaaaaa + b | bbb + b | bbbb + b | bbbbb + b | bbbbbb + b | bbbbbbb + b | bbbbbbbb + c | ccc + c | cccc + c | ccccc + c | cccccc + c | ccccccc + c | cccccccc + d | ddd + d | dddd + d | ddddd + d | dddddd + d | ddddddd + d | dddddddd +(24 rows) + +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+----------+---- + b | bbb | + b | bbbb | + b | bbbbb | + b | bbbbbb | + b | bbbbbbb | + b | bbbbbbbb | + d | ddd | + d | dddd | + d | ddddd | + d | dddddd | + d | ddddddd | + d | dddddddd | +(12 rows) + +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----------+---- + c | ccc | + c | cccc | + c | ccccc | + c | cccccc | + c | ccccccc | + c | cccccccc | + d | ddd | + d | dddd | + d | ddddd | + d | dddddd | + d | ddddddd | + d | dddddddd | +(12 rows) + +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+----------+----+----+---- + d | ddd | | | + d | dddd | | | + d | ddddd | | | + d | dddddd | | | + d | ddddddd | | | + d | dddddddd | | | +(6 rows) + +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+---------- + a | aaa + a | aaaa + a | aaaaa + a | aaaaaa + a | aaaaaaa + a | aaaaaaaa +(6 rows) + +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+----------+---- + b | bbb | + b | bbbb | + b | bbbbb | + b | bbbbbb | + b | bbbbbbb | + b | bbbbbbbb | +(6 rows) + +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----------+---- + c | ccc | + c | cccc | + c | ccccc | + c | cccccc | + c | ccccccc | + c | cccccccc | +(6 rows) + +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+----------+----+----+---- + d | ddd | | | + d | dddd | | | + d | ddddd | | | + d | dddddd | | | + d | ddddddd | | | + d | dddddddd | | | +(6 rows) + +UPDATE a SET aa='zzzz' WHERE aa='aaaa'; +UPDATE ONLY a SET aa='zzzzz' WHERE aa='aaaaa'; +UPDATE b SET aa='zzz' WHERE aa='aaa'; +UPDATE ONLY b SET aa='zzz' WHERE aa='aaa'; +UPDATE a SET aa='zzzzzz' WHERE aa LIKE 'aaa%'; +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+---------- + a | zzzz + a | zzzzz + a | zzzzzz + a | zzzzzz + a | zzzzzz + a | zzzzzz + b | bbb + b | bbbb + b | bbbbb + b | bbbbbb + b | bbbbbbb + b | bbbbbbbb + c | ccc + c | cccc + c | ccccc + c | cccccc + c | ccccccc + c | cccccccc + d | ddd + d | dddd + d | ddddd + d | dddddd + d | ddddddd + d | dddddddd +(24 rows) + +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+----------+---- + b | bbb | + b | bbbb | + b | bbbbb | + b | bbbbbb | + b | bbbbbbb | + b | bbbbbbbb | + d | ddd | + d | dddd | + d | ddddd | + d | dddddd | + d | ddddddd | + d | dddddddd | +(12 rows) + +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----------+---- + c | ccc | + c | cccc | + c | ccccc | + c | cccccc | + c | ccccccc | + c | cccccccc | + d | ddd | + d | dddd | + d | ddddd | + d | dddddd | + d | ddddddd | + d | dddddddd | +(12 rows) + +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+----------+----+----+---- + d | ddd | | | + d | dddd | | | + d | ddddd | | | + d | dddddd | | | + d | ddddddd | | | + d | dddddddd | | | +(6 rows) + +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+-------- + a | zzzz + a | zzzzz + a | zzzzzz + a | zzzzzz + a | zzzzzz + a | zzzzzz +(6 rows) + +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+----------+---- + b | bbb | + b | bbbb | + b | bbbbb | + b | bbbbbb | + b | bbbbbbb | + b | bbbbbbbb | +(6 rows) + +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----------+---- + c | ccc | + c | cccc | + c | ccccc | + c | cccccc | + c | ccccccc | + c | cccccccc | +(6 rows) + +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+----------+----+----+---- + d | ddd | | | + d | dddd | | | + d | ddddd | | | + d | dddddd | | | + d | ddddddd | | | + d | dddddddd | | | +(6 rows) + +UPDATE b SET aa='new'; +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+---------- + a | zzzz + a | zzzzz + a | zzzzzz + a | zzzzzz + a | zzzzzz + a | zzzzzz + b | new + b | new + b | new + b | new + b | new + b | new + c | ccc + c | cccc + c | ccccc + c | cccccc + c | ccccccc + c | cccccccc + d | new + d | new + d | new + d | new + d | new + d | new +(24 rows) + +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+-----+---- + b | new | + b | new | + b | new | + b | new | + b | new | + b | new | + d | new | + d | new | + d | new | + d | new | + d | new | + d | new | +(12 rows) + +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----------+---- + c | ccc | + c | cccc | + c | ccccc | + c | cccccc | + c | ccccccc | + c | cccccccc | + d | new | + d | new | + d | new | + d | new | + d | new | + d | new | +(12 rows) + +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+-----+----+----+---- + d | new | | | + d | new | | | + d | new | | | + d | new | | | + d | new | | | + d | new | | | +(6 rows) + +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+-------- + a | zzzz + a | zzzzz + a | zzzzzz + a | zzzzzz + a | zzzzzz + a | zzzzzz +(6 rows) + +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+-----+---- + b | new | + b | new | + b | new | + b | new | + b | new | + b | new | +(6 rows) + +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----------+---- + c | ccc | + c | cccc | + c | ccccc | + c | cccccc | + c | ccccccc | + c | cccccccc | +(6 rows) + +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+-----+----+----+---- + d | new | | | + d | new | | | + d | new | | | + d | new | | | + d | new | | | + d | new | | | +(6 rows) + +UPDATE a SET aa='new'; +DELETE FROM ONLY c WHERE aa='new'; +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+----- + a | new + a | new + a | new + a | new + a | new + a | new + b | new + b | new + b | new + b | new + b | new + b | new + d | new + d | new + d | new + d | new + d | new + d | new +(18 rows) + +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+-----+---- + b | new | + b | new | + b | new | + b | new | + b | new | + b | new | + d | new | + d | new | + d | new | + d | new | + d | new | + d | new | +(12 rows) + +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+-----+---- + d | new | + d | new | + d | new | + d | new | + d | new | + d | new | +(6 rows) + +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+-----+----+----+---- + d | new | | | + d | new | | | + d | new | | | + d | new | | | + d | new | | | + d | new | | | +(6 rows) + +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+----- + a | new + a | new + a | new + a | new + a | new + a | new +(6 rows) + +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+-----+---- + b | new | + b | new | + b | new | + b | new | + b | new | + b | new | +(6 rows) + +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----+---- +(0 rows) + +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+-----+----+----+---- + d | new | | | + d | new | | | + d | new | | | + d | new | | | + d | new | | | + d | new | | | +(6 rows) + +DELETE FROM a; +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+---- +(0 rows) + +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+----+---- +(0 rows) + +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----+---- +(0 rows) + +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+----+----+----+---- +(0 rows) + +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; + relname | aa +---------+---- +(0 rows) + +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; + relname | aa | bb +---------+----+---- +(0 rows) + +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; + relname | aa | cc +---------+----+---- +(0 rows) + +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + relname | aa | bb | cc | dd +---------+----+----+----+---- +(0 rows) + +-- Confirm PRIMARY KEY adds NOT NULL constraint to child table +CREATE TEMP TABLE z (b TEXT, PRIMARY KEY(aa, b)) inherits (a); +INSERT INTO z VALUES (NULL, 'text'); -- should fail +ERROR: null value in column "aa" of relation "z" violates not-null constraint +DETAIL: Failing row contains (null, text). +-- Check inherited UPDATE with all children excluded +create table some_tab (a int, b int); +create table some_tab_child () inherits (some_tab); +insert into some_tab_child values(1,2); +explain (verbose, costs off) +update some_tab set a = a + 1 where false; + QUERY PLAN +----------------------------------------------------------------------- + Update on public.some_tab + -> Result + Output: (some_tab.a + 1), NULL::oid, NULL::tid, NULL::integer + One-Time Filter: false + Optimizer: Postgres query optimizer +(5 rows) + +update some_tab set a = a + 1 where false; +explain (verbose, costs off) +update some_tab set a = a + 1 where false returning b, a; + QUERY PLAN +----------------------------------------------------------------------- + Update on public.some_tab + Output: some_tab.b, some_tab.a + -> Result + Output: (some_tab.a + 1), NULL::oid, NULL::tid, NULL::integer + One-Time Filter: false + Optimizer: Postgres query optimizer +(6 rows) + +update some_tab set a = a + 1 where false returning b, a; + b | a +---+--- +(0 rows) + +table some_tab; + a | b +---+--- + 1 | 2 +(1 row) + +drop table some_tab cascade; +NOTICE: drop cascades to table some_tab_child +-- Check UPDATE with inherited target and an inherited source table +create temp table foo(f1 int, f2 int); +create temp table foo2(f3 int) inherits (foo); +create temp table bar(f1 int, f2 int); +create temp table bar2(f3 int) inherits (bar); +insert into foo values(1,1); +insert into foo values(3,3); +insert into foo2 values(2,2,2); +insert into foo2 values(3,3,3); +insert into bar values(1,1); +insert into bar values(2,2); +insert into bar values(3,3); +insert into bar values(4,4); +insert into bar2 values(1,1,1); +insert into bar2 values(2,2,2); +insert into bar2 values(3,3,3); +insert into bar2 values(4,4,4); +update bar set f2 = f2 + 100 where f1 in (select f1 from foo); +select tableoid::regclass::text as relname, bar.* from bar order by 1,2; + relname | f1 | f2 +---------+----+----- + bar | 1 | 101 + bar | 2 | 102 + bar | 3 | 103 + bar | 4 | 4 + bar2 | 1 | 101 + bar2 | 2 | 102 + bar2 | 3 | 103 + bar2 | 4 | 4 +(8 rows) + +-- Check UPDATE with inherited target and an appendrel subquery +update bar set f2 = f2 + 100 +from + ( select f1 from foo union all select f1+3 from foo ) ss +where bar.f1 = ss.f1; +select tableoid::regclass::text as relname, bar.* from bar order by 1,2; + relname | f1 | f2 +---------+----+----- + bar | 1 | 201 + bar | 2 | 202 + bar | 3 | 203 + bar | 4 | 104 + bar2 | 1 | 201 + bar2 | 2 | 202 + bar2 | 3 | 203 + bar2 | 4 | 104 +(8 rows) + +-- Check UPDATE with *partitioned* inherited target and an appendrel subquery +create table some_tab (a int); +insert into some_tab values (0); +create table some_tab_child () inherits (some_tab); +insert into some_tab_child values (1); +create table parted_tab (a int, b char) partition by list (a); +create table parted_tab_part1 partition of parted_tab for values in (1); +create table parted_tab_part2 partition of parted_tab for values in (2); +create table parted_tab_part3 partition of parted_tab for values in (3); +insert into parted_tab values (1, 'a'), (2, 'a'), (3, 'a'); +update parted_tab set b = 'b' +from + (select a from some_tab union all select a+1 from some_tab) ss (a) +where parted_tab.a = ss.a; +select tableoid::regclass::text as relname, parted_tab.* from parted_tab order by 1,2; + relname | a | b +------------------+---+--- + parted_tab_part1 | 1 | b + parted_tab_part2 | 2 | b + parted_tab_part3 | 3 | a +(3 rows) + +truncate parted_tab; +insert into parted_tab values (1, 'a'), (2, 'a'), (3, 'a'); +update parted_tab set b = 'b' +from + (select 0 from parted_tab union all select 1 from parted_tab) ss (a) +where parted_tab.a = ss.a; +select tableoid::regclass::text as relname, parted_tab.* from parted_tab order by 1,2; + relname | a | b +------------------+---+--- + parted_tab_part1 | 1 | b + parted_tab_part2 | 2 | a + parted_tab_part3 | 3 | a +(3 rows) + +-- modifies partition key, but no rows will actually be updated +explain update parted_tab set a = 2 where false; + QUERY PLAN +-------------------------------------------------------- + Update on parted_tab (cost=0.00..0.00 rows=0 width=0) + -> Result (cost=0.00..0.00 rows=0 width=14) + One-Time Filter: false + Optimizer: Postgres query optimizer +(4 rows) + +drop table parted_tab; +-- Check UPDATE with multi-level partitioned inherited target +create table mlparted_tab (a int, b char, c text) partition by list (a); +create table mlparted_tab_part1 partition of mlparted_tab for values in (1); +create table mlparted_tab_part2 partition of mlparted_tab for values in (2) partition by list (b); +create table mlparted_tab_part3 partition of mlparted_tab for values in (3); +create table mlparted_tab_part2a partition of mlparted_tab_part2 for values in ('a'); +create table mlparted_tab_part2b partition of mlparted_tab_part2 for values in ('b'); +insert into mlparted_tab values (1, 'a'), (2, 'a'), (2, 'b'), (3, 'a'); +update mlparted_tab mlp set c = 'xxx' +from + (select a from some_tab union all select a+1 from some_tab) ss (a) +where (mlp.a = ss.a and mlp.b = 'b') or mlp.a = 3; +select tableoid::regclass::text as relname, mlparted_tab.* from mlparted_tab order by 1,2; + relname | a | b | c +---------------------+---+---+----- + mlparted_tab_part1 | 1 | a | + mlparted_tab_part2a | 2 | a | + mlparted_tab_part2b | 2 | b | xxx + mlparted_tab_part3 | 3 | a | xxx +(4 rows) + +drop table mlparted_tab; +drop table some_tab cascade; +NOTICE: drop cascades to table some_tab_child +/* Test multiple inheritance of column defaults */ +CREATE TABLE firstparent (tomorrow date default now()::date + 1); +CREATE TABLE secondparent (tomorrow date default now() :: date + 1); +CREATE TABLE jointchild () INHERITS (firstparent, secondparent); -- ok +NOTICE: merging multiple inherited definitions of column "tomorrow" +CREATE TABLE thirdparent (tomorrow date default now()::date - 1); +CREATE TABLE otherchild () INHERITS (firstparent, thirdparent); -- not ok +NOTICE: merging multiple inherited definitions of column "tomorrow" +ERROR: column "tomorrow" inherits conflicting default values +HINT: To resolve the conflict, specify a default explicitly. +CREATE TABLE otherchild (tomorrow date default now()) + INHERITS (firstparent, thirdparent); -- ok, child resolves ambiguous default +NOTICE: merging multiple inherited definitions of column "tomorrow" +NOTICE: merging column "tomorrow" with inherited definition +DROP TABLE firstparent, secondparent, jointchild, thirdparent, otherchild; +-- Test changing the type of inherited columns +insert into d values('test','one','two','three'); +alter table z drop constraint z_pkey; +alter table a alter column aa type integer using bit_length(aa); +select * from d; + aa | bb | cc | dd +----+-----+-----+------- + 32 | one | two | three +(1 row) + +-- The above verified that we can change the type of a multiply-inherited +-- column; but we should reject that if any definition was inherited from +-- an unrelated parent. +create temp table parent1(f1 int, f2 int); +create temp table parent2(f1 int, f3 bigint); +create temp table childtab(f4 int) inherits(parent1, parent2); +NOTICE: merging multiple inherited definitions of column "f1" +alter table parent1 alter column f1 type bigint; -- fail, conflict w/parent2 +ERROR: cannot alter inherited column "f1" of relation "childtab" +alter table parent1 alter column f2 type bigint; -- ok +-- Test non-inheritable parent constraints +create table p1(ff1 int); +alter table p1 add constraint p1chk check (ff1 > 0) no inherit; +alter table p1 add constraint p2chk check (ff1 > 10); +-- connoinherit should be true for NO INHERIT constraint +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pgc.connoinherit from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname = 'p1' order by 1,2; + relname | conname | contype | conislocal | coninhcount | connoinherit +---------+---------+---------+------------+-------------+-------------- + p1 | p1chk | c | t | 0 | t + p1 | p2chk | c | t | 0 | f +(2 rows) + +-- Test that child does not inherit NO INHERIT constraints +create table c1 () inherits (p1); +\d p1 + Table "public.p1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + ff1 | integer | | | +Check constraints: + "p1chk" CHECK (ff1 > 0) NO INHERIT + "p2chk" CHECK (ff1 > 10) +Number of child tables: 1 (Use \d+ to list them.) + +\d c1 + Table "public.c1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + ff1 | integer | | | +Check constraints: + "p2chk" CHECK (ff1 > 10) +Inherits: p1 + +-- Test that child does not override inheritable constraints of the parent +create table c2 (constraint p2chk check (ff1 > 10) no inherit) inherits (p1); --fails +ERROR: constraint "p2chk" conflicts with inherited constraint on relation "c2" +drop table p1 cascade; +NOTICE: drop cascades to table c1 +-- Tests for casting between the rowtypes of parent and child +-- tables. See the pgsql-hackers thread beginning Dec. 4/04 +create table base (i integer); +create table derived () inherits (base); +create table more_derived (like derived, b int) inherits (derived); +NOTICE: merging column "i" with inherited definition +insert into derived (i) values (0); +select derived::base from derived; + derived +--------- + (0) +(1 row) + +select NULL::derived::base; + base +------ + +(1 row) + +-- remove redundant conversions. +explain (verbose on, costs off) select row(i, b)::more_derived::derived::base from more_derived; + QUERY PLAN +------------------------------------------- + Seq Scan on public.more_derived + Output: (ROW(i, b)::more_derived)::base + Optimizer: Postgres query optimizer +(3 rows) + +explain (verbose on, costs off) select (1, 2)::more_derived::derived::base; + QUERY PLAN +------------------------------------- + Result + Output: '(1)'::base + Optimizer: Postgres query optimizer +(3 rows) + +drop table more_derived; +drop table derived; +drop table base; +create table p1(ff1 int); +create table p2(f1 text); +create function p2text(p2) returns text as 'select $1.f1' language sql; +create table c1(f3 int) inherits(p1,p2); +insert into c1 values(123456789, 'hi', 42); +select p2text(c1.*) from c1; + p2text +-------- + hi +(1 row) + +drop function p2text(p2); +drop table c1; +drop table p2; +drop table p1; +CREATE TABLE ac (aa TEXT); +alter table ac add constraint ac_check check (aa is not null); +CREATE TABLE bc (bb TEXT) INHERITS (ac); +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+----------+---------+------------+-------------+------------------ + ac | ac_check | c | t | 0 | (aa IS NOT NULL) + bc | ac_check | c | f | 1 | (aa IS NOT NULL) +(2 rows) + +insert into ac (aa) values (NULL); +ERROR: new row for relation "ac" violates check constraint "ac_check" +DETAIL: Failing row contains (null). +insert into bc (aa) values (NULL); +ERROR: new row for relation "bc" violates check constraint "ac_check" +DETAIL: Failing row contains (null, null). +alter table bc drop constraint ac_check; -- fail, disallowed +ERROR: cannot drop inherited constraint "ac_check" of relation "bc" +alter table ac drop constraint ac_check; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+---------+---------+------------+-------------+-------- +(0 rows) + +-- try the unnamed-constraint case +alter table ac add check (aa is not null); +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+-------------+---------+------------+-------------+------------------ + ac | ac_aa_check | c | t | 0 | (aa IS NOT NULL) + bc | ac_aa_check | c | f | 1 | (aa IS NOT NULL) +(2 rows) + +insert into ac (aa) values (NULL); +ERROR: new row for relation "ac" violates check constraint "ac_aa_check" +DETAIL: Failing row contains (null). +insert into bc (aa) values (NULL); +ERROR: new row for relation "bc" violates check constraint "ac_aa_check" +DETAIL: Failing row contains (null, null). +alter table bc drop constraint ac_aa_check; -- fail, disallowed +ERROR: cannot drop inherited constraint "ac_aa_check" of relation "bc" +alter table ac drop constraint ac_aa_check; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+---------+---------+------------+-------------+-------- +(0 rows) + +alter table ac add constraint ac_check check (aa is not null); +alter table bc no inherit ac; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+----------+---------+------------+-------------+------------------ + ac | ac_check | c | t | 0 | (aa IS NOT NULL) + bc | ac_check | c | t | 0 | (aa IS NOT NULL) +(2 rows) + +alter table bc drop constraint ac_check; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+----------+---------+------------+-------------+------------------ + ac | ac_check | c | t | 0 | (aa IS NOT NULL) +(1 row) + +alter table ac drop constraint ac_check; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+---------+---------+------------+-------------+-------- +(0 rows) + +drop table bc; +drop table ac; +create table ac (a int constraint check_a check (a <> 0)); +create table bc (a int constraint check_a check (a <> 0), b int constraint check_b check (b <> 0)) inherits (ac); +NOTICE: merging column "a" with inherited definition +NOTICE: merging constraint "check_a" with inherited definition +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+---------+---------+------------+-------------+---------- + ac | check_a | c | t | 0 | (a <> 0) + bc | check_a | c | t | 1 | (a <> 0) + bc | check_b | c | t | 0 | (b <> 0) +(3 rows) + +drop table bc; +drop table ac; +create table ac (a int constraint check_a check (a <> 0)); +create table bc (b int constraint check_b check (b <> 0)); +create table cc (c int constraint check_c check (c <> 0)) inherits (ac, bc); +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc', 'cc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+---------+---------+------------+-------------+---------- + ac | check_a | c | t | 0 | (a <> 0) + bc | check_b | c | t | 0 | (b <> 0) + cc | check_a | c | f | 1 | (a <> 0) + cc | check_b | c | f | 1 | (b <> 0) + cc | check_c | c | t | 0 | (c <> 0) +(5 rows) + +alter table cc no inherit bc; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc', 'cc') order by 1,2; + relname | conname | contype | conislocal | coninhcount | consrc +---------+---------+---------+------------+-------------+---------- + ac | check_a | c | t | 0 | (a <> 0) + bc | check_b | c | t | 0 | (b <> 0) + cc | check_a | c | f | 1 | (a <> 0) + cc | check_b | c | t | 0 | (b <> 0) + cc | check_c | c | t | 0 | (c <> 0) +(5 rows) + +drop table cc; +drop table bc; +drop table ac; +create table p1(f1 int); +create table p2(f2 int); +create table c1(f3 int) inherits(p1,p2); +insert into c1 values(1,-1,2); +alter table p2 add constraint cc check (f2>0); -- fail +ERROR: check constraint "cc" of relation "c1" is violated by some row +alter table p2 add check (f2>0); -- check it without a name, too +ERROR: check constraint "p2_f2_check" of relation "c1" is violated by some row +delete from c1; +insert into c1 values(1,1,2); +alter table p2 add check (f2>0); +insert into c1 values(1,-1,2); -- fail +ERROR: new row for relation "c1" violates check constraint "p2_f2_check" +DETAIL: Failing row contains (1, -1, 2). +create table c2(f3 int) inherits(p1,p2); +\d c2 + Table "public.c2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | + f2 | integer | | | + f3 | integer | | | +Check constraints: + "p2_f2_check" CHECK (f2 > 0) +Inherits: p1, + p2 + +create table c3 (f4 int) inherits(c1,c2); +NOTICE: merging multiple inherited definitions of column "f1" +NOTICE: merging multiple inherited definitions of column "f2" +NOTICE: merging multiple inherited definitions of column "f3" +\d c3 + Table "public.c3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | + f2 | integer | | | + f3 | integer | | | + f4 | integer | | | +Check constraints: + "p2_f2_check" CHECK (f2 > 0) +Inherits: c1, + c2 + +drop table p1 cascade; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table c1 +drop cascades to table c2 +drop cascades to table c3 +drop table p2 cascade; +create table pp1 (f1 int); +create table cc1 (f2 text, f3 int) inherits (pp1); +alter table pp1 add column a1 int check (a1 > 0); +\d cc1 + Table "public.cc1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | + f2 | text | | | + f3 | integer | | | + a1 | integer | | | +Check constraints: + "pp1_a1_check" CHECK (a1 > 0) +Inherits: pp1 + +create table cc2(f4 float) inherits(pp1,cc1); +NOTICE: merging multiple inherited definitions of column "f1" +NOTICE: merging multiple inherited definitions of column "a1" +\d cc2 + Table "public.cc2" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+--------- + f1 | integer | | | + a1 | integer | | | + f2 | text | | | + f3 | integer | | | + f4 | double precision | | | +Check constraints: + "pp1_a1_check" CHECK (a1 > 0) +Inherits: pp1, + cc1 + +alter table pp1 add column a2 int check (a2 > 0); +NOTICE: merging definition of column "a2" for child "cc2" +NOTICE: merging constraint "pp1_a2_check" with inherited definition +\d cc2 + Table "public.cc2" + Column | Type | Collation | Nullable | Default +--------+------------------+-----------+----------+--------- + f1 | integer | | | + a1 | integer | | | + f2 | text | | | + f3 | integer | | | + f4 | double precision | | | + a2 | integer | | | +Check constraints: + "pp1_a1_check" CHECK (a1 > 0) + "pp1_a2_check" CHECK (a2 > 0) +Inherits: pp1, + cc1 + +drop table pp1 cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table cc1 +drop cascades to table cc2 +-- Test for renaming in simple multiple inheritance +CREATE TABLE inht1 (a int, b int); +CREATE TABLE inhs1 (b int, c int); +CREATE TABLE inhts (d int) INHERITS (inht1, inhs1); +NOTICE: merging multiple inherited definitions of column "b" +ALTER TABLE inht1 RENAME a TO aa; +ALTER TABLE inht1 RENAME b TO bb; -- to be failed +ERROR: cannot rename inherited column "b" +ALTER TABLE inhts RENAME aa TO aaa; -- to be failed +ERROR: cannot rename inherited column "aa" +ALTER TABLE inhts RENAME d TO dd; +\d+ inhts + Table "public.inhts" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + aa | integer | | | | plain | | + b | integer | | | | plain | | + c | integer | | | | plain | | + dd | integer | | | | plain | | +Inherits: inht1, + inhs1 + +DROP TABLE inhts; +-- Test for renaming in diamond inheritance +CREATE TABLE inht2 (x int) INHERITS (inht1); +CREATE TABLE inht3 (y int) INHERITS (inht1); +CREATE TABLE inht4 (z int) INHERITS (inht2, inht3); +NOTICE: merging multiple inherited definitions of column "aa" +NOTICE: merging multiple inherited definitions of column "b" +ALTER TABLE inht1 RENAME aa TO aaa; +\d+ inht4 + Table "public.inht4" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + aaa | integer | | | | plain | | + b | integer | | | | plain | | + x | integer | | | | plain | | + y | integer | | | | plain | | + z | integer | | | | plain | | +Inherits: inht2, + inht3 + +CREATE TABLE inhts (d int) INHERITS (inht2, inhs1); +NOTICE: merging multiple inherited definitions of column "b" +ALTER TABLE inht1 RENAME aaa TO aaaa; +ALTER TABLE inht1 RENAME b TO bb; -- to be failed +ERROR: cannot rename inherited column "b" +\d+ inhts + Table "public.inhts" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + aaaa | integer | | | | plain | | + b | integer | | | | plain | | + x | integer | | | | plain | | + c | integer | | | | plain | | + d | integer | | | | plain | | +Inherits: inht2, + inhs1 + +WITH RECURSIVE r AS ( + SELECT 'inht1'::regclass AS inhrelid +UNION ALL + SELECT c.inhrelid FROM pg_inherits c, r WHERE r.inhrelid = c.inhparent +) +SELECT a.attrelid::regclass, a.attname, a.attinhcount, e.expected + FROM (SELECT inhrelid, count(*) AS expected FROM pg_inherits + WHERE inhparent IN (SELECT inhrelid FROM r) GROUP BY inhrelid) e + JOIN pg_attribute a ON e.inhrelid = a.attrelid WHERE NOT attislocal + ORDER BY a.attrelid::regclass::name, a.attnum; + attrelid | attname | attinhcount | expected +----------+---------+-------------+---------- + inht2 | aaaa | 1 | 1 + inht2 | b | 1 | 1 + inht3 | aaaa | 1 | 1 + inht3 | b | 1 | 1 + inht4 | aaaa | 2 | 2 + inht4 | b | 2 | 2 + inht4 | x | 1 | 2 + inht4 | y | 1 | 2 + inhts | aaaa | 1 | 1 + inhts | b | 2 | 1 + inhts | x | 1 | 1 + inhts | c | 1 | 1 +(12 rows) + +DROP TABLE inht1, inhs1 CASCADE; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to table inht2 +drop cascades to table inhts +drop cascades to table inht3 +drop cascades to table inht4 +-- Test non-inheritable indices [UNIQUE, EXCLUDE] constraints +CREATE TABLE test_constraints (id int, val1 varchar, val2 int, UNIQUE(val1, val2)); +CREATE TABLE test_constraints_inh () INHERITS (test_constraints); +\d+ test_constraints + Table "public.test_constraints" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-------------------+-----------+----------+---------+----------+--------------+------------- + id | integer | | | | plain | | + val1 | character varying | | | | extended | | + val2 | integer | | | | plain | | +Indexes: + "test_constraints_val1_val2_key" UNIQUE CONSTRAINT, btree (val1, val2) +Child tables: test_constraints_inh + +ALTER TABLE ONLY test_constraints DROP CONSTRAINT test_constraints_val1_val2_key; +\d+ test_constraints + Table "public.test_constraints" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-------------------+-----------+----------+---------+----------+--------------+------------- + id | integer | | | | plain | | + val1 | character varying | | | | extended | | + val2 | integer | | | | plain | | +Child tables: test_constraints_inh + +\d+ test_constraints_inh + Table "public.test_constraints_inh" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-------------------+-----------+----------+---------+----------+--------------+------------- + id | integer | | | | plain | | + val1 | character varying | | | | extended | | + val2 | integer | | | | plain | | +Inherits: test_constraints + +DROP TABLE test_constraints_inh; +DROP TABLE test_constraints; +CREATE TABLE test_ex_constraints ( + c circle, + dkey inet, + EXCLUDE USING gist (dkey inet_ops WITH =, c WITH &&) +); +CREATE TABLE test_ex_constraints_inh () INHERITS (test_ex_constraints); +\d+ test_ex_constraints + Table "public.test_ex_constraints" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+--------+-----------+----------+---------+---------+--------------+------------- + c | circle | | | | plain | | + dkey | inet | | | | main | | +Indexes: + "test_ex_constraints_dkey_c_excl" EXCLUDE USING gist (dkey inet_ops WITH =, c WITH &&) +Child tables: test_ex_constraints_inh + +ALTER TABLE test_ex_constraints DROP CONSTRAINT test_ex_constraints_dkey_c_excl; +\d+ test_ex_constraints + Table "public.test_ex_constraints" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+--------+-----------+----------+---------+---------+--------------+------------- + c | circle | | | | plain | | + dkey | inet | | | | main | | +Child tables: test_ex_constraints_inh + +\d+ test_ex_constraints_inh + Table "public.test_ex_constraints_inh" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+--------+-----------+----------+---------+---------+--------------+------------- + c | circle | | | | plain | | + dkey | inet | | | | main | | +Inherits: test_ex_constraints + +DROP TABLE test_ex_constraints_inh; +DROP TABLE test_ex_constraints; +-- Test non-inheritable foreign key constraints +CREATE TABLE test_primary_constraints(id int PRIMARY KEY); +CREATE TABLE test_foreign_constraints(id1 int REFERENCES test_primary_constraints(id)); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +CREATE TABLE test_foreign_constraints_inh () INHERITS (test_foreign_constraints); +\d+ test_primary_constraints + Table "public.test_primary_constraints" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + id | integer | | not null | | plain | | +Indexes: + "test_primary_constraints_pkey" PRIMARY KEY, btree (id) +Referenced by: + TABLE "test_foreign_constraints" CONSTRAINT "test_foreign_constraints_id1_fkey" FOREIGN KEY (id1) REFERENCES test_primary_constraints(id) + +\d+ test_foreign_constraints + Table "public.test_foreign_constraints" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + id1 | integer | | | | plain | | +Foreign-key constraints: + "test_foreign_constraints_id1_fkey" FOREIGN KEY (id1) REFERENCES test_primary_constraints(id) +Child tables: test_foreign_constraints_inh + +ALTER TABLE test_foreign_constraints DROP CONSTRAINT test_foreign_constraints_id1_fkey; +\d+ test_foreign_constraints + Table "public.test_foreign_constraints" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + id1 | integer | | | | plain | | +Child tables: test_foreign_constraints_inh + +\d+ test_foreign_constraints_inh + Table "public.test_foreign_constraints_inh" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + id1 | integer | | | | plain | | +Inherits: test_foreign_constraints + +DROP TABLE test_foreign_constraints_inh; +DROP TABLE test_foreign_constraints; +DROP TABLE test_primary_constraints; +-- Test foreign key behavior +create table inh_fk_1 (a int primary key); +insert into inh_fk_1 values (1), (2), (3); +create table inh_fk_2 (x int primary key, y int references inh_fk_1 on delete cascade); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +insert into inh_fk_2 values (11, 1), (22, 2), (33, 3); +create table inh_fk_2_child () inherits (inh_fk_2); +insert into inh_fk_2_child values (111, 1), (222, 2); +-- The cascading deletion doesn't work on GPDB, because foreign keys are not +-- enforced in general. So this produces different result than on upstream. +delete from inh_fk_1 where a = 1; +select * from inh_fk_1 order by 1; + a +--- + 2 + 3 +(2 rows) + +select * from inh_fk_2 order by 1, 2; + x | y +-----+--- + 11 | 1 + 22 | 2 + 33 | 3 + 111 | 1 + 222 | 2 +(5 rows) + +drop table inh_fk_1, inh_fk_2, inh_fk_2_child; +-- Test that parent and child CHECK constraints can be created in either order +create table p1(f1 int); +create table p1_c1() inherits(p1); +alter table p1 add constraint inh_check_constraint1 check (f1 > 0); +alter table p1_c1 add constraint inh_check_constraint1 check (f1 > 0); +NOTICE: merging constraint "inh_check_constraint1" with inherited definition +alter table p1_c1 add constraint inh_check_constraint2 check (f1 < 10); +alter table p1 add constraint inh_check_constraint2 check (f1 < 10); +NOTICE: merging constraint "inh_check_constraint2" with inherited definition +select conrelid::regclass::text as relname, conname, conislocal, coninhcount +from pg_constraint where conname like 'inh\_check\_constraint%' +order by 1, 2; + relname | conname | conislocal | coninhcount +---------+-----------------------+------------+------------- + p1 | inh_check_constraint1 | t | 0 + p1 | inh_check_constraint2 | t | 0 + p1_c1 | inh_check_constraint1 | t | 1 + p1_c1 | inh_check_constraint2 | t | 1 +(4 rows) + +drop table p1 cascade; +NOTICE: drop cascades to table p1_c1 +-- Test that a valid child can have not-valid parent, but not vice versa +create table invalid_check_con(f1 int); +create table invalid_check_con_child() inherits(invalid_check_con); +alter table invalid_check_con_child add constraint inh_check_constraint check(f1 > 0) not valid; +alter table invalid_check_con add constraint inh_check_constraint check(f1 > 0); -- fail +ERROR: constraint "inh_check_constraint" conflicts with NOT VALID constraint on relation "invalid_check_con_child" +alter table invalid_check_con_child drop constraint inh_check_constraint; +insert into invalid_check_con values(0); +alter table invalid_check_con_child add constraint inh_check_constraint check(f1 > 0); +alter table invalid_check_con add constraint inh_check_constraint check(f1 > 0) not valid; +NOTICE: merging constraint "inh_check_constraint" with inherited definition +insert into invalid_check_con values(0); -- fail +ERROR: new row for relation "invalid_check_con" violates check constraint "inh_check_constraint" +DETAIL: Failing row contains (0). +insert into invalid_check_con_child values(0); -- fail +ERROR: new row for relation "invalid_check_con_child" violates check constraint "inh_check_constraint" +DETAIL: Failing row contains (0). +select conrelid::regclass::text as relname, conname, + convalidated, conislocal, coninhcount, connoinherit +from pg_constraint where conname like 'inh\_check\_constraint%' +order by 1, 2; + relname | conname | convalidated | conislocal | coninhcount | connoinherit +-------------------------+----------------------+--------------+------------+-------------+-------------- + invalid_check_con | inh_check_constraint | f | t | 0 | f + invalid_check_con_child | inh_check_constraint | t | t | 1 | f +(2 rows) + +-- We don't drop the invalid_check_con* tables, to test dump/reload with +-- +-- Test parameterized append plans for inheritance trees +-- +create temp table patest0 (id, x) as + select x, x from generate_series(0,1000) x; +create temp table patest1() inherits (patest0); +insert into patest1 + select x, x from generate_series(0,1000) x; +create temp table patest2() inherits (patest0); +insert into patest2 + select x, x from generate_series(0,1000) x; +create index patest0i on patest0(id); +create index patest1i on patest1(id); +create index patest2i on patest2(id); +analyze patest0; +analyze patest1; +analyze patest2; +set enable_seqscan=off; +set enable_bitmapscan=off; +explain (costs off) +select * from patest0 join (select f1 from int4_tbl where f1 < 10 and f1 > -10 limit 1) ss on id = f1; + QUERY PLAN +------------------------------------------------------------------- + Hash Join + Hash Cond: (patest0.id = int4_tbl.f1) + -> Append + -> Index Scan using patest0i on patest0 patest0_1 + -> Index Scan using patest1i on patest1 patest0_2 + -> Index Scan using patest2i on patest2 patest0_3 + -> Hash + -> Limit + -> Seq Scan on int4_tbl + Filter: ((f1 < 10) AND (f1 > '-10'::integer)) + Optimizer: Postgres query optimizer +(11 rows) + +select * from patest0 join (select f1 from int4_tbl where f1 < 10 and f1 > -10 limit 1) ss on id = f1; + id | x | f1 +----+---+---- + 0 | 0 | 0 + 0 | 0 | 0 + 0 | 0 | 0 +(3 rows) + +drop index patest2i; +explain (costs off) +select * from patest0 join (select f1 from int4_tbl where f1 < 10 and f1 > -10 limit 1) ss on id = f1; + QUERY PLAN +------------------------------------------------------------------- + Hash Join + Hash Cond: (patest0.id = int4_tbl.f1) + -> Append + -> Index Scan using patest0i on patest0 patest0_1 + -> Index Scan using patest1i on patest1 patest0_2 + -> Seq Scan on patest2 patest0_3 + -> Hash + -> Limit + -> Seq Scan on int4_tbl + Filter: ((f1 < 10) AND (f1 > '-10'::integer)) + Optimizer: Postgres query optimizer +(11 rows) + +select * from patest0 join (select f1 from int4_tbl where f1 < 10 and f1 > -10 limit 1) ss on id = f1; + id | x | f1 +----+---+---- + 0 | 0 | 0 + 0 | 0 | 0 + 0 | 0 | 0 +(3 rows) + +reset enable_seqscan; +reset enable_bitmapscan; +drop table patest0 cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table patest1 +drop cascades to table patest2 +-- +-- Test merge-append plans for inheritance trees +-- +create table matest0 (id serial primary key, name text); +create table matest1 (id integer primary key) inherits (matest0); +NOTICE: merging column "id" with inherited definition +create table matest2 (id integer primary key) inherits (matest0); +NOTICE: merging column "id" with inherited definition +create table matest3 (id integer primary key) inherits (matest0); +NOTICE: merging column "id" with inherited definition +create index matest0i on matest0 ((1-id)); +create index matest1i on matest1 ((1-id)); +-- create index matest2i on matest2 ((1-id)); -- intentionally missing +create index matest3i on matest3 ((1-id)); +insert into matest1 (name) values ('Test 1'); +insert into matest1 (name) values ('Test 2'); +insert into matest2 (name) values ('Test 3'); +insert into matest2 (name) values ('Test 4'); +insert into matest3 (name) values ('Test 5'); +insert into matest3 (name) values ('Test 6'); +set enable_indexscan = off; -- force use of seqscan/sort, so no merge +explain (verbose, costs off) select * from matest0 order by 1-id; + QUERY PLAN +------------------------------------------------------------ + Sort + Output: matest0.id, matest0.name, ((1 - matest0.id)) + Sort Key: ((1 - matest0.id)) + -> Result + Output: matest0.id, matest0.name, (1 - matest0.id) + -> Append + -> Seq Scan on public.matest0 matest0_1 + Output: matest0_1.id, matest0_1.name + -> Seq Scan on public.matest1 matest0_2 + Output: matest0_2.id, matest0_2.name + -> Seq Scan on public.matest2 matest0_3 + Output: matest0_3.id, matest0_3.name + -> Seq Scan on public.matest3 matest0_4 + Output: matest0_4.id, matest0_4.name + Settings: enable_indexscan = 'off' + Optimizer: Postgres query optimizer +(16 rows) + +select * from matest0 order by 1-id; + id | name +----+-------- + 6 | Test 6 + 5 | Test 5 + 4 | Test 4 + 3 | Test 3 + 2 | Test 2 + 1 | Test 1 +(6 rows) + +explain (verbose, costs off) select min(1-id) from matest0; + QUERY PLAN +-------------------------------------------------- + Aggregate + Output: min((1 - matest0.id)) + -> Append + -> Seq Scan on public.matest0 matest0_1 + Output: matest0_1.id + -> Seq Scan on public.matest1 matest0_2 + Output: matest0_2.id + -> Seq Scan on public.matest2 matest0_3 + Output: matest0_3.id + -> Seq Scan on public.matest3 matest0_4 + Output: matest0_4.id + Settings: enable_indexscan = 'off' + Optimizer: Postgres query optimizer +(13 rows) + +select min(1-id) from matest0; + min +----- + -5 +(1 row) + +reset enable_indexscan; +set enable_seqscan = off; -- plan with fewest seqscans should be merge +set enable_parallel_append = off; -- Don't let parallel-append interfere +-- GPDB_92_MERGE_FIXME: the cost of bitmap scan is not correct? +-- the cost of merge append with index scan is bigger than the cost +-- of append with bitmapscan + sort +set enable_bitmapscan = off; +explain (verbose, costs off) select * from matest0 order by 1-id; + QUERY PLAN +--------------------------------------------------------------------------------------------- + Merge Append + Sort Key: ((1 - matest0.id)) + -> Index Scan using matest0i on public.matest0 matest0_1 + Output: matest0_1.id, matest0_1.name, (1 - matest0_1.id) + -> Index Scan using matest1i on public.matest1 matest0_2 + Output: matest0_2.id, matest0_2.name, (1 - matest0_2.id) + -> Sort + Output: matest0_3.id, matest0_3.name, ((1 - matest0_3.id)) + Sort Key: ((1 - matest0_3.id)) + -> Seq Scan on public.matest2 matest0_3 + Output: matest0_3.id, matest0_3.name, (1 - matest0_3.id) + -> Index Scan using matest3i on public.matest3 matest0_4 + Output: matest0_4.id, matest0_4.name, (1 - matest0_4.id) + Settings: enable_bitmapscan = 'off', enable_parallel_append = 'off', enable_seqscan = 'off' + Optimizer: Postgres query optimizer +(15 rows) + +select * from matest0 order by 1-id; + id | name +----+-------- + 6 | Test 6 + 5 | Test 5 + 4 | Test 4 + 3 | Test 3 + 2 | Test 2 + 1 | Test 1 +(6 rows) + +explain (verbose, costs off) select min(1-id) from matest0; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Result + Output: $0 + InitPlan 1 (returns $0) + -> Limit + Output: ((1 - matest0.id)) + -> Result + Output: ((1 - matest0.id)) + -> Merge Append + Sort Key: ((1 - matest0.id)) + -> Index Scan using matest0i on public.matest0 matest0_1 + Output: matest0_1.id, (1 - matest0_1.id) + Index Cond: ((1 - matest0_1.id) IS NOT NULL) + -> Index Scan using matest1i on public.matest1 matest0_2 + Output: matest0_2.id, (1 - matest0_2.id) + Index Cond: ((1 - matest0_2.id) IS NOT NULL) + -> Sort + Output: matest0_3.id, ((1 - matest0_3.id)) + Sort Key: ((1 - matest0_3.id)) + -> Index Only Scan using matest2_pkey on public.matest2 matest0_3 + Output: matest0_3.id, (1 - matest0_3.id) + Filter: ((1 - matest0_3.id) IS NOT NULL) + -> Index Scan using matest3i on public.matest3 matest0_4 + Output: matest0_4.id, (1 - matest0_4.id) + Index Cond: ((1 - matest0_4.id) IS NOT NULL) + Settings: enable_bitmapscan = 'off', enable_parallel_append = 'off', enable_seqscan = 'off' + Optimizer: Postgres query optimizer +(26 rows) + +select min(1-id) from matest0; + min +----- + -5 +(1 row) + +reset enable_seqscan; +reset enable_parallel_append; +reset enable_bitmapscan; +drop table matest0 cascade; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table matest1 +drop cascades to table matest2 +drop cascades to table matest3 +-- +-- Check that use of an index with an extraneous column doesn't produce +-- a plan with extraneous sorting +-- +create table matest0 (a int, b int, c int, d int); +create table matest1 () inherits(matest0); +create index matest0i on matest0 (b, c); +create index matest1i on matest1 (b, c); +set enable_nestloop = off; -- we want a plan with two MergeAppends +set enable_mergejoin=on; +explain (costs off) +select t1.* from matest0 t1, matest0 t2 +where t1.b = t2.b and t2.c = t2.d +order by t1.b limit 10; + QUERY PLAN +------------------------------------------------------------------- + Limit + -> Merge Join + Merge Cond: (t1.b = t2.b) + -> Merge Append + Sort Key: t1.b + -> Index Scan using matest0i on matest0 t1_1 + -> Index Scan using matest1i on matest1 t1_2 + -> Materialize + -> Merge Append + Sort Key: t2.b + -> Index Scan using matest0i on matest0 t2_1 + Filter: (c = d) + -> Index Scan using matest1i on matest1 t2_2 + Filter: (c = d) + Optimizer: Postgres query optimizer +(15 rows) + +reset enable_nestloop; +drop table matest0 cascade; +NOTICE: drop cascades to table matest1 +-- +-- Test merge-append for UNION ALL append relations +-- +set enable_seqscan = off; +set enable_indexscan = on; +set enable_bitmapscan = off; +-- GPDB: coerce the planner to choose Merge Append plans for the below queries. +-- In upstream, the Merge Append is cheaper, but in GPDB the Sort within each +-- segment only has to sort 1 / 3 of the data (with three segments), making +-- Sort + Append cheaper. Compensate by pretending that there are more rows in +-- the table. +begin; +set allow_system_table_mods = on; +update pg_class set reltuples = 100000 where oid = 'tenk1'::regclass; +-- Check handling of duplicated, constant, or volatile targetlist items +explain (costs off) +SELECT thousand, tenthous FROM tenk1 +UNION ALL +SELECT thousand, thousand FROM tenk1 +ORDER BY thousand, tenthous; + QUERY PLAN +------------------------------------------------------------------------- + Merge Append + Sort Key: tenk1.thousand, tenk1.tenthous + -> Index Only Scan using tenk1_thous_tenthous on tenk1 + -> Sort + Sort Key: tenk1_1.thousand, tenk1_1.thousand + -> Index Only Scan using tenk1_thous_tenthous on tenk1 tenk1_1 + Optimizer: Postgres query optimizer +(7 rows) + +explain (costs off) +SELECT thousand, tenthous, thousand+tenthous AS x FROM tenk1 +UNION ALL +SELECT 42, 42, hundred FROM tenk1 +ORDER BY thousand, tenthous; + QUERY PLAN +------------------------------------------------------------------ + Merge Append + Sort Key: tenk1.thousand, tenk1.tenthous + -> Index Only Scan using tenk1_thous_tenthous on tenk1 + -> Sort + Sort Key: 42, 42 + -> Index Only Scan using tenk1_hundred on tenk1 tenk1_1 + Optimizer: Postgres query optimizer +(7 rows) + +explain (costs off) +SELECT thousand, tenthous FROM tenk1 +UNION ALL +SELECT thousand, random()::integer FROM tenk1 +ORDER BY thousand, tenthous; + QUERY PLAN +------------------------------------------------------------------------- + Merge Append + Sort Key: tenk1.thousand, tenk1.tenthous + -> Index Only Scan using tenk1_thous_tenthous on tenk1 + -> Sort + Sort Key: tenk1_1.thousand, ((random())::integer) + -> Index Only Scan using tenk1_thous_tenthous on tenk1 tenk1_1 + Optimizer: Postgres query optimizer +(7 rows) + +-- Check min/max aggregate optimization +explain (costs off) +SELECT min(x) FROM + (SELECT unique1 AS x FROM tenk1 a + UNION ALL + SELECT unique2 AS x FROM tenk1 b) s; + QUERY PLAN +-------------------------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Merge Append + Sort Key: a.unique1 + -> Index Only Scan using tenk1_unique1 on tenk1 a + Index Cond: (unique1 IS NOT NULL) + -> Index Only Scan using tenk1_unique2 on tenk1 b + Index Cond: (unique2 IS NOT NULL) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) +SELECT min(y) FROM + (SELECT unique1 AS x, unique1 AS y FROM tenk1 a + UNION ALL + SELECT unique2 AS x, unique2 AS y FROM tenk1 b) s; + QUERY PLAN +-------------------------------------------------------------------- + Result + InitPlan 1 (returns $0) + -> Limit + -> Merge Append + Sort Key: a.unique1 + -> Index Only Scan using tenk1_unique1 on tenk1 a + Index Cond: (unique1 IS NOT NULL) + -> Index Only Scan using tenk1_unique2 on tenk1 b + Index Cond: (unique2 IS NOT NULL) + Optimizer: Postgres query optimizer +(10 rows) + +-- XXX planner doesn't recognize that index on unique2 is sufficiently sorted +explain (costs off) +SELECT x, y FROM + (SELECT thousand AS x, tenthous AS y FROM tenk1 a + UNION ALL + SELECT unique2 AS x, unique2 AS y FROM tenk1 b) s +ORDER BY x, y; + QUERY PLAN +------------------------------------------------------------- + Merge Append + Sort Key: a.thousand, a.tenthous + -> Index Only Scan using tenk1_thous_tenthous on tenk1 a + -> Sort + Sort Key: b.unique2, b.unique2 + -> Index Only Scan using tenk1_unique2 on tenk1 b + Optimizer: Postgres query optimizer +(7 rows) + +-- exercise rescan code path via a repeatedly-evaluated subquery +explain (costs off) +SELECT + ARRAY(SELECT f.i FROM ( + (SELECT d + g.i FROM generate_series(4, 30, 3) d ORDER BY 1) + UNION ALL + (SELECT d + g.i FROM generate_series(0, 30, 5) d ORDER BY 1) + ) f(i) + ORDER BY f.i LIMIT 10) +FROM generate_series(1, 3) g(i); + QUERY PLAN +---------------------------------------------------------------- + Function Scan on generate_series g + SubPlan 1 + -> Limit + -> Merge Append + Sort Key: ((d.d + g.i)) + -> Sort + Sort Key: ((d.d + g.i)) + -> Function Scan on generate_series d + -> Sort + Sort Key: ((d_1.d + g.i)) + -> Function Scan on generate_series d_1 + Optimizer: Postgres query optimizer +(12 rows) + +SELECT + ARRAY(SELECT f.i FROM ( + (SELECT d + g.i FROM generate_series(4, 30, 3) d ORDER BY 1) + UNION ALL + (SELECT d + g.i FROM generate_series(0, 30, 5) d ORDER BY 1) + ) f(i) + ORDER BY f.i LIMIT 10) +FROM generate_series(1, 3) g(i); + array +------------------------------ + {1,5,6,8,11,11,14,16,17,20} + {2,6,7,9,12,12,15,17,18,21} + {3,7,8,10,13,13,16,18,19,22} +(3 rows) + +reset enable_seqscan; +reset enable_indexscan; +reset enable_bitmapscan; +rollback; +-- +-- Check handling of a constant-null CHECK constraint +-- +create table cnullparent (f1 int); +create table cnullchild (check (f1 = 1 or f1 = null)) inherits(cnullparent); +insert into cnullchild values(1); +insert into cnullchild values(2); +insert into cnullchild values(null); +select * from cnullparent; + f1 +---- + 1 + 2 + +(3 rows) + +select * from cnullparent where f1 = 2; + f1 +---- + 2 +(1 row) + +drop table cnullparent cascade; +NOTICE: drop cascades to table cnullchild +-- +-- Check use of temporary tables with inheritance trees +-- +create table inh_perm_parent (a1 int); +create temp table inh_temp_parent (a1 int); +create temp table inh_temp_child () inherits (inh_perm_parent); -- ok +create table inh_perm_child () inherits (inh_temp_parent); -- error +ERROR: cannot inherit from temporary relation "inh_temp_parent" +create temp table inh_temp_child_2 () inherits (inh_temp_parent); -- ok +insert into inh_perm_parent values (1); +insert into inh_temp_parent values (2); +insert into inh_temp_child values (3); +insert into inh_temp_child_2 values (4); +select tableoid::regclass, a1 from inh_perm_parent; + tableoid | a1 +-----------------+---- + inh_perm_parent | 1 + inh_temp_child | 3 +(2 rows) + +select tableoid::regclass, a1 from inh_temp_parent; + tableoid | a1 +------------------+---- + inh_temp_parent | 2 + inh_temp_child_2 | 4 +(2 rows) + +drop table inh_perm_parent cascade; +NOTICE: drop cascades to table inh_temp_child +drop table inh_temp_parent cascade; +NOTICE: drop cascades to table inh_temp_child_2 +-- +-- Check that constraint exclusion works correctly with partitions using +-- implicit constraints generated from the partition bound information. +-- +create table list_parted ( + a varchar +) partition by list (a); +create table part_ab_cd partition of list_parted for values in ('ab', 'cd'); +create table part_ef_gh partition of list_parted for values in ('ef', 'gh'); +create table part_null_xy partition of list_parted for values in (null, 'xy'); +explain (costs off) select * from list_parted; + QUERY PLAN +---------------------------------------------- + Append + -> Seq Scan on part_ab_cd list_parted_1 + -> Seq Scan on part_ef_gh list_parted_2 + -> Seq Scan on part_null_xy list_parted_3 + Optimizer: Postgres query optimizer +(5 rows) + +explain (costs off) select * from list_parted where a is null; + QUERY PLAN +-------------------------------------- + Seq Scan on part_null_xy list_parted + Filter: (a IS NULL) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from list_parted where a is not null; + QUERY PLAN +---------------------------------------------- + Append + -> Seq Scan on part_ab_cd list_parted_1 + Filter: (a IS NOT NULL) + -> Seq Scan on part_ef_gh list_parted_2 + Filter: (a IS NOT NULL) + -> Seq Scan on part_null_xy list_parted_3 + Filter: (a IS NOT NULL) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from list_parted where a in ('ab', 'cd', 'ef'); + QUERY PLAN +---------------------------------------------------------- + Append + -> Seq Scan on part_ab_cd list_parted_1 + Filter: ((a)::text = ANY ('{ab,cd,ef}'::text[])) + -> Seq Scan on part_ef_gh list_parted_2 + Filter: ((a)::text = ANY ('{ab,cd,ef}'::text[])) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from list_parted where a = 'ab' or a in (null, 'cd'); + QUERY PLAN +--------------------------------------------------------------------------------- + Seq Scan on part_ab_cd list_parted + Filter: (((a)::text = 'ab'::text) OR ((a)::text = ANY ('{NULL,cd}'::text[]))) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from list_parted where a = 'ab'; + QUERY PLAN +------------------------------------- + Seq Scan on part_ab_cd list_parted + Filter: ((a)::text = 'ab'::text) + Optimizer: Postgres query optimizer +(3 rows) + +create table range_list_parted ( + a int, + b char(2) +) partition by range (a); +create table part_1_10 partition of range_list_parted for values from (1) to (10) partition by list (b); +create table part_1_10_ab partition of part_1_10 for values in ('ab'); +create table part_1_10_cd partition of part_1_10 for values in ('cd'); +create table part_10_20 partition of range_list_parted for values from (10) to (20) partition by list (b); +create table part_10_20_ab partition of part_10_20 for values in ('ab'); +create table part_10_20_cd partition of part_10_20 for values in ('cd'); +create table part_21_30 partition of range_list_parted for values from (21) to (30) partition by list (b); +create table part_21_30_ab partition of part_21_30 for values in ('ab'); +create table part_21_30_cd partition of part_21_30 for values in ('cd'); +create table part_40_inf partition of range_list_parted for values from (40) to (maxvalue) partition by list (b); +create table part_40_inf_ab partition of part_40_inf for values in ('ab'); +create table part_40_inf_cd partition of part_40_inf for values in ('cd'); +create table part_40_inf_null partition of part_40_inf for values in (null); +explain (costs off) select * from range_list_parted; + QUERY PLAN +-------------------------------------------------------- + Append + -> Seq Scan on part_1_10_ab range_list_parted_1 + -> Seq Scan on part_1_10_cd range_list_parted_2 + -> Seq Scan on part_10_20_ab range_list_parted_3 + -> Seq Scan on part_10_20_cd range_list_parted_4 + -> Seq Scan on part_21_30_ab range_list_parted_5 + -> Seq Scan on part_21_30_cd range_list_parted_6 + -> Seq Scan on part_40_inf_ab range_list_parted_7 + -> Seq Scan on part_40_inf_cd range_list_parted_8 + -> Seq Scan on part_40_inf_null range_list_parted_9 + Optimizer: Postgres query optimizer +(11 rows) + +explain (costs off) select * from range_list_parted where a = 5; + QUERY PLAN +---------------------------------------------------- + Append + -> Seq Scan on part_1_10_ab range_list_parted_1 + Filter: (a = 5) + -> Seq Scan on part_1_10_cd range_list_parted_2 + Filter: (a = 5) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from range_list_parted where b = 'ab'; + QUERY PLAN +------------------------------------------------------ + Append + -> Seq Scan on part_1_10_ab range_list_parted_1 + Filter: (b = 'ab'::bpchar) + -> Seq Scan on part_10_20_ab range_list_parted_2 + Filter: (b = 'ab'::bpchar) + -> Seq Scan on part_21_30_ab range_list_parted_3 + Filter: (b = 'ab'::bpchar) + -> Seq Scan on part_40_inf_ab range_list_parted_4 + Filter: (b = 'ab'::bpchar) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from range_list_parted where a between 3 and 23 and b in ('ab'); + QUERY PLAN +----------------------------------------------------------------- + Append + -> Seq Scan on part_1_10_ab range_list_parted_1 + Filter: ((a >= 3) AND (a <= 23) AND (b = 'ab'::bpchar)) + -> Seq Scan on part_10_20_ab range_list_parted_2 + Filter: ((a >= 3) AND (a <= 23) AND (b = 'ab'::bpchar)) + -> Seq Scan on part_21_30_ab range_list_parted_3 + Filter: ((a >= 3) AND (a <= 23) AND (b = 'ab'::bpchar)) + Optimizer: Postgres query optimizer +(8 rows) + +/* Should select no rows because range partition key cannot be null */ +explain (costs off) select * from range_list_parted where a is null; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +/* Should only select rows from the null-accepting partition */ +explain (costs off) select * from range_list_parted where b is null; + QUERY PLAN +------------------------------------------------ + Seq Scan on part_40_inf_null range_list_parted + Filter: (b IS NULL) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from range_list_parted where a is not null and a < 67; + QUERY PLAN +-------------------------------------------------------- + Append + -> Seq Scan on part_1_10_ab range_list_parted_1 + Filter: ((a IS NOT NULL) AND (a < 67)) + -> Seq Scan on part_1_10_cd range_list_parted_2 + Filter: ((a IS NOT NULL) AND (a < 67)) + -> Seq Scan on part_10_20_ab range_list_parted_3 + Filter: ((a IS NOT NULL) AND (a < 67)) + -> Seq Scan on part_10_20_cd range_list_parted_4 + Filter: ((a IS NOT NULL) AND (a < 67)) + -> Seq Scan on part_21_30_ab range_list_parted_5 + Filter: ((a IS NOT NULL) AND (a < 67)) + -> Seq Scan on part_21_30_cd range_list_parted_6 + Filter: ((a IS NOT NULL) AND (a < 67)) + -> Seq Scan on part_40_inf_ab range_list_parted_7 + Filter: ((a IS NOT NULL) AND (a < 67)) + -> Seq Scan on part_40_inf_cd range_list_parted_8 + Filter: ((a IS NOT NULL) AND (a < 67)) + -> Seq Scan on part_40_inf_null range_list_parted_9 + Filter: ((a IS NOT NULL) AND (a < 67)) + Optimizer: Postgres query optimizer +(20 rows) + +explain (costs off) select * from range_list_parted where a >= 30; + QUERY PLAN +-------------------------------------------------------- + Append + -> Seq Scan on part_40_inf_ab range_list_parted_1 + Filter: (a >= 30) + -> Seq Scan on part_40_inf_cd range_list_parted_2 + Filter: (a >= 30) + -> Seq Scan on part_40_inf_null range_list_parted_3 + Filter: (a >= 30) + Optimizer: Postgres query optimizer +(8 rows) + +drop table list_parted; +drop table range_list_parted; +-- check that constraint exclusion is able to cope with the partition +-- constraint emitted for multi-column range partitioned tables +create table mcrparted (a int, b int, c int) partition by range (a, abs(b), c); +create table mcrparted_def partition of mcrparted default; +create table mcrparted0 partition of mcrparted for values from (minvalue, minvalue, minvalue) to (1, 1, 1); +create table mcrparted1 partition of mcrparted for values from (1, 1, 1) to (10, 5, 10); +create table mcrparted2 partition of mcrparted for values from (10, 5, 10) to (10, 10, 10); +create table mcrparted3 partition of mcrparted for values from (11, 1, 1) to (20, 10, 10); +create table mcrparted4 partition of mcrparted for values from (20, 10, 10) to (20, 20, 20); +create table mcrparted5 partition of mcrparted for values from (20, 20, 20) to (maxvalue, maxvalue, maxvalue); +explain (costs off) select * from mcrparted where a = 0; -- scans mcrparted0, mcrparted_def + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on mcrparted0 mcrparted_1 + Filter: (a = 0) + -> Seq Scan on mcrparted_def mcrparted_2 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from mcrparted where a = 10 and abs(b) < 5; -- scans mcrparted1, mcrparted_def + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on mcrparted1 mcrparted_1 + Filter: ((a = 10) AND (abs(b) < 5)) + -> Seq Scan on mcrparted_def mcrparted_2 + Filter: ((a = 10) AND (abs(b) < 5)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from mcrparted where a = 10 and abs(b) = 5; -- scans mcrparted1, mcrparted2, mcrparted_def + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on mcrparted1 mcrparted_1 + Filter: ((a = 10) AND (abs(b) = 5)) + -> Seq Scan on mcrparted2 mcrparted_2 + Filter: ((a = 10) AND (abs(b) = 5)) + -> Seq Scan on mcrparted_def mcrparted_3 + Filter: ((a = 10) AND (abs(b) = 5)) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from mcrparted where abs(b) = 5; -- scans all partitions + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on mcrparted0 mcrparted_1 + Filter: (abs(b) = 5) + -> Seq Scan on mcrparted1 mcrparted_2 + Filter: (abs(b) = 5) + -> Seq Scan on mcrparted2 mcrparted_3 + Filter: (abs(b) = 5) + -> Seq Scan on mcrparted3 mcrparted_4 + Filter: (abs(b) = 5) + -> Seq Scan on mcrparted4 mcrparted_5 + Filter: (abs(b) = 5) + -> Seq Scan on mcrparted5 mcrparted_6 + Filter: (abs(b) = 5) + -> Seq Scan on mcrparted_def mcrparted_7 + Filter: (abs(b) = 5) + Optimizer: Postgres query optimizer +(16 rows) + +explain (costs off) select * from mcrparted where a > -1; -- scans all partitions + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on mcrparted0 mcrparted_1 + Filter: (a > '-1'::integer) + -> Seq Scan on mcrparted1 mcrparted_2 + Filter: (a > '-1'::integer) + -> Seq Scan on mcrparted2 mcrparted_3 + Filter: (a > '-1'::integer) + -> Seq Scan on mcrparted3 mcrparted_4 + Filter: (a > '-1'::integer) + -> Seq Scan on mcrparted4 mcrparted_5 + Filter: (a > '-1'::integer) + -> Seq Scan on mcrparted5 mcrparted_6 + Filter: (a > '-1'::integer) + -> Seq Scan on mcrparted_def mcrparted_7 + Filter: (a > '-1'::integer) + Optimizer: Postgres query optimizer +(16 rows) + +explain (costs off) select * from mcrparted where a = 20 and abs(b) = 10 and c > 10; -- scans mcrparted4 + QUERY PLAN +----------------------------------------------------- + Seq Scan on mcrparted4 mcrparted + Filter: ((c > 10) AND (a = 20) AND (abs(b) = 10)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from mcrparted where a = 20 and c > 20; -- scans mcrparted3, mcrparte4, mcrparte5, mcrparted_def + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on mcrparted3 mcrparted_1 + Filter: ((c > 20) AND (a = 20)) + -> Seq Scan on mcrparted4 mcrparted_2 + Filter: ((c > 20) AND (a = 20)) + -> Seq Scan on mcrparted5 mcrparted_3 + Filter: ((c > 20) AND (a = 20)) + -> Seq Scan on mcrparted_def mcrparted_4 + Filter: ((c > 20) AND (a = 20)) + Optimizer: Postgres query optimizer +(10 rows) + +-- check that partitioned table Appends cope with being referenced in +-- subplans +create table parted_minmax (a int, b varchar(16)) partition by range (a); +create table parted_minmax1 partition of parted_minmax for values from (1) to (10); +create index parted_minmax1i on parted_minmax1 (a, b); +insert into parted_minmax values (1,'12345'); +explain (costs off) select min(a), max(a) from parted_minmax where b = '12345'; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Result + InitPlan 1 (returns $0) + -> Limit + -> Index Only Scan using parted_minmax1i on parted_minmax1 parted_minmax + Index Cond: ((a IS NOT NULL) AND (b = '12345'::text)) + InitPlan 2 (returns $1) + -> Limit + -> Index Only Scan Backward using parted_minmax1i on parted_minmax1 parted_minmax_1 + Index Cond: ((a IS NOT NULL) AND (b = '12345'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +select min(a), max(a) from parted_minmax where b = '12345'; + min | max +-----+----- + 1 | 1 +(1 row) + +drop table parted_minmax; +-- Test code that uses Append nodes in place of MergeAppend when the +-- partition ordering matches the desired ordering. +create index mcrparted_a_abs_c_idx on mcrparted (a, abs(b), c); +-- MergeAppend must be used when a default partition exists +explain (costs off) select * from mcrparted order by a, abs(b), c; + QUERY PLAN +------------------------------------------------------------------------------- + Merge Append + Sort Key: mcrparted.a, (abs(mcrparted.b)), mcrparted.c + -> Index Scan using mcrparted0_a_abs_c_idx on mcrparted0 mcrparted_1 + -> Index Scan using mcrparted1_a_abs_c_idx on mcrparted1 mcrparted_2 + -> Index Scan using mcrparted2_a_abs_c_idx on mcrparted2 mcrparted_3 + -> Index Scan using mcrparted3_a_abs_c_idx on mcrparted3 mcrparted_4 + -> Index Scan using mcrparted4_a_abs_c_idx on mcrparted4 mcrparted_5 + -> Index Scan using mcrparted5_a_abs_c_idx on mcrparted5 mcrparted_6 + -> Index Scan using mcrparted_def_a_abs_c_idx on mcrparted_def mcrparted_7 + Optimizer: Postgres query optimizer +(10 rows) + +drop table mcrparted_def; +-- Append is used for a RANGE partitioned table with no default +-- and no subpartitions +explain (costs off) select * from mcrparted order by a, abs(b), c; + QUERY PLAN +------------------------------------------------------------------------- + Append + -> Index Scan using mcrparted0_a_abs_c_idx on mcrparted0 mcrparted_1 + -> Index Scan using mcrparted1_a_abs_c_idx on mcrparted1 mcrparted_2 + -> Index Scan using mcrparted2_a_abs_c_idx on mcrparted2 mcrparted_3 + -> Index Scan using mcrparted3_a_abs_c_idx on mcrparted3 mcrparted_4 + -> Index Scan using mcrparted4_a_abs_c_idx on mcrparted4 mcrparted_5 + -> Index Scan using mcrparted5_a_abs_c_idx on mcrparted5 mcrparted_6 + Optimizer: Postgres query optimizer +(8 rows) + +-- Append is used with subpaths in reverse order with backwards index scans +explain (costs off) select * from mcrparted order by a desc, abs(b) desc, c desc; + QUERY PLAN +---------------------------------------------------------------------------------- + Append + -> Index Scan Backward using mcrparted5_a_abs_c_idx on mcrparted5 mcrparted_6 + -> Index Scan Backward using mcrparted4_a_abs_c_idx on mcrparted4 mcrparted_5 + -> Index Scan Backward using mcrparted3_a_abs_c_idx on mcrparted3 mcrparted_4 + -> Index Scan Backward using mcrparted2_a_abs_c_idx on mcrparted2 mcrparted_3 + -> Index Scan Backward using mcrparted1_a_abs_c_idx on mcrparted1 mcrparted_2 + -> Index Scan Backward using mcrparted0_a_abs_c_idx on mcrparted0 mcrparted_1 + Optimizer: Postgres query optimizer +(8 rows) + +-- check that Append plan is used containing a MergeAppend for sub-partitions +-- that are unordered. +drop table mcrparted5; +create table mcrparted5 partition of mcrparted for values from (20, 20, 20) to (maxvalue, maxvalue, maxvalue) partition by list (a); +create table mcrparted5a partition of mcrparted5 for values in(20); +create table mcrparted5_def partition of mcrparted5 default; +explain (costs off) select * from mcrparted order by a, abs(b), c; + QUERY PLAN +--------------------------------------------------------------------------------------- + Append + -> Index Scan using mcrparted0_a_abs_c_idx on mcrparted0 mcrparted_1 + -> Index Scan using mcrparted1_a_abs_c_idx on mcrparted1 mcrparted_2 + -> Index Scan using mcrparted2_a_abs_c_idx on mcrparted2 mcrparted_3 + -> Index Scan using mcrparted3_a_abs_c_idx on mcrparted3 mcrparted_4 + -> Index Scan using mcrparted4_a_abs_c_idx on mcrparted4 mcrparted_5 + -> Merge Append + Sort Key: mcrparted_7.a, (abs(mcrparted_7.b)), mcrparted_7.c + -> Index Scan using mcrparted5a_a_abs_c_idx on mcrparted5a mcrparted_7 + -> Index Scan using mcrparted5_def_a_abs_c_idx on mcrparted5_def mcrparted_8 + Optimizer: Postgres query optimizer +(11 rows) + +drop table mcrparted5_def; +-- check that an Append plan is used and the sub-partitions are flattened +-- into the main Append when the sub-partition is unordered but contains +-- just a single sub-partition. +explain (costs off) select a, abs(b) from mcrparted order by a, abs(b), c; + QUERY PLAN +--------------------------------------------------------------------------- + Append + -> Index Scan using mcrparted0_a_abs_c_idx on mcrparted0 mcrparted_1 + -> Index Scan using mcrparted1_a_abs_c_idx on mcrparted1 mcrparted_2 + -> Index Scan using mcrparted2_a_abs_c_idx on mcrparted2 mcrparted_3 + -> Index Scan using mcrparted3_a_abs_c_idx on mcrparted3 mcrparted_4 + -> Index Scan using mcrparted4_a_abs_c_idx on mcrparted4 mcrparted_5 + -> Index Scan using mcrparted5a_a_abs_c_idx on mcrparted5a mcrparted_6 + Optimizer: Postgres query optimizer +(8 rows) + +-- check that Append is used when the sub-partitioned tables are pruned +-- during planning. +explain (costs off) select * from mcrparted where a < 20 order by a, abs(b), c; + QUERY PLAN +------------------------------------------------------------------------- + Append + -> Index Scan using mcrparted0_a_abs_c_idx on mcrparted0 mcrparted_1 + Index Cond: (a < 20) + -> Index Scan using mcrparted1_a_abs_c_idx on mcrparted1 mcrparted_2 + Index Cond: (a < 20) + -> Index Scan using mcrparted2_a_abs_c_idx on mcrparted2 mcrparted_3 + Index Cond: (a < 20) + -> Index Scan using mcrparted3_a_abs_c_idx on mcrparted3 mcrparted_4 + Index Cond: (a < 20) + Optimizer: Postgres query optimizer +(10 rows) + +create table mclparted (a int) partition by list(a); +create table mclparted1 partition of mclparted for values in(1); +create table mclparted2 partition of mclparted for values in(2); +create index on mclparted (a); +-- Ensure an Append is used for a list partition with an order by. +explain (costs off) select * from mclparted order by a; + QUERY PLAN +------------------------------------------------------------------------ + Append + -> Index Only Scan using mclparted1_a_idx on mclparted1 mclparted_1 + -> Index Only Scan using mclparted2_a_idx on mclparted2 mclparted_2 + Optimizer: Postgres query optimizer +(4 rows) + +-- Ensure a MergeAppend is used when a partition exists with interleaved +-- datums in the partition bound. +create table mclparted3_5 partition of mclparted for values in(3,5); +create table mclparted4 partition of mclparted for values in(4); +explain (costs off) select * from mclparted order by a; + QUERY PLAN +---------------------------------------------------------------------------- + Merge Append + Sort Key: mclparted.a + -> Index Only Scan using mclparted1_a_idx on mclparted1 mclparted_1 + -> Index Only Scan using mclparted2_a_idx on mclparted2 mclparted_2 + -> Index Only Scan using mclparted3_5_a_idx on mclparted3_5 mclparted_3 + -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_4 + Optimizer: Postgres query optimizer +(7 rows) + +drop table mclparted; +-- Ensure subplans which don't have a path with the correct pathkeys get +-- sorted correctly. +drop index mcrparted_a_abs_c_idx; +create index on mcrparted1 (a, abs(b), c); +create index on mcrparted2 (a, abs(b), c); +create index on mcrparted3 (a, abs(b), c); +create index on mcrparted4 (a, abs(b), c); +explain (costs off) select * from mcrparted where a < 20 order by a, abs(b), c limit 1; + QUERY PLAN +------------------------------------------------------------------------------- + Limit + -> Append + -> Sort + Sort Key: mcrparted_1.a, (abs(mcrparted_1.b)), mcrparted_1.c + -> Seq Scan on mcrparted0 mcrparted_1 + Filter: (a < 20) + -> Index Scan using mcrparted1_a_abs_c_idx on mcrparted1 mcrparted_2 + Index Cond: (a < 20) + -> Index Scan using mcrparted2_a_abs_c_idx on mcrparted2 mcrparted_3 + Index Cond: (a < 20) + -> Index Scan using mcrparted3_a_abs_c_idx on mcrparted3 mcrparted_4 + Index Cond: (a < 20) + Optimizer: Postgres query optimizer +(13 rows) + +set enable_bitmapscan = 0; +-- Ensure Append node can be used when the partition is ordered by some +-- pathkeys which were deemed redundant. +explain (costs off) select * from mcrparted where a = 10 order by a, abs(b), c; + QUERY PLAN +------------------------------------------------------------------------- + Append + -> Index Scan using mcrparted1_a_abs_c_idx on mcrparted1 mcrparted_1 + Index Cond: (a = 10) + -> Index Scan using mcrparted2_a_abs_c_idx on mcrparted2 mcrparted_2 + Index Cond: (a = 10) + Optimizer: Postgres query optimizer +(6 rows) + +reset enable_bitmapscan; +drop table mcrparted; +-- Ensure LIST partitions allow an Append to be used instead of a MergeAppend +create table bool_lp (b bool) partition by list(b); +create table bool_lp_true partition of bool_lp for values in(true); +create table bool_lp_false partition of bool_lp for values in(false); +create index on bool_lp (b); +explain (costs off) select * from bool_lp order by b; + QUERY PLAN +---------------------------------------------------------------------------- + Append + -> Index Only Scan using bool_lp_false_b_idx on bool_lp_false bool_lp_1 + -> Index Only Scan using bool_lp_true_b_idx on bool_lp_true bool_lp_2 + Optimizer: Postgres query optimizer +(4 rows) + +drop table bool_lp; +-- Ensure const bool quals can be properly detected as redundant +create table bool_rp (b bool, a int) partition by range(b,a); +create table bool_rp_false_1k partition of bool_rp for values from (false,0) to (false,1000); +create table bool_rp_true_1k partition of bool_rp for values from (true,0) to (true,1000); +create table bool_rp_false_2k partition of bool_rp for values from (false,1000) to (false,2000); +create table bool_rp_true_2k partition of bool_rp for values from (true,1000) to (true,2000); +create index on bool_rp (b,a); +explain (costs off) select * from bool_rp where b = true order by b,a; + QUERY PLAN +---------------------------------------------------------------------------------- + Append + -> Index Only Scan using bool_rp_true_1k_b_a_idx on bool_rp_true_1k bool_rp_1 + Index Cond: (b = true) + -> Index Only Scan using bool_rp_true_2k_b_a_idx on bool_rp_true_2k bool_rp_2 + Index Cond: (b = true) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from bool_rp where b = false order by b,a; + QUERY PLAN +------------------------------------------------------------------------------------ + Append + -> Index Only Scan using bool_rp_false_1k_b_a_idx on bool_rp_false_1k bool_rp_1 + Index Cond: (b = false) + -> Index Only Scan using bool_rp_false_2k_b_a_idx on bool_rp_false_2k bool_rp_2 + Index Cond: (b = false) + Optimizer: Postgres query optimizer +(6 rows) + +-- GPDB: force the planner to choose same plan as in upstream +set enable_seqscan=off; +set enable_bitmapscan=off; +explain (costs off) select * from bool_rp where b = true order by a; + QUERY PLAN +---------------------------------------------------------------------------------- + Append + -> Index Only Scan using bool_rp_true_1k_b_a_idx on bool_rp_true_1k bool_rp_1 + Index Cond: (b = true) + -> Index Only Scan using bool_rp_true_2k_b_a_idx on bool_rp_true_2k bool_rp_2 + Index Cond: (b = true) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from bool_rp where b = false order by a; + QUERY PLAN +------------------------------------------------------------------------------------ + Append + -> Index Only Scan using bool_rp_false_1k_b_a_idx on bool_rp_false_1k bool_rp_1 + Index Cond: (b = false) + -> Index Only Scan using bool_rp_false_2k_b_a_idx on bool_rp_false_2k bool_rp_2 + Index Cond: (b = false) + Optimizer: Postgres query optimizer +(6 rows) + +reset enable_seqscan; +reset enable_bitmapscan; +drop table bool_rp; +-- Ensure an Append scan is chosen when the partition order is a subset of +-- the required order. +create table range_parted (a int, b int, c int) partition by range(a, b); +create table range_parted1 partition of range_parted for values from (0,0) to (10,10); +create table range_parted2 partition of range_parted for values from (10,10) to (20,20); +create index on range_parted (a,b,c); +explain (costs off) select * from range_parted order by a,b,c; + QUERY PLAN +------------------------------------------------------------------------------------- + Append + -> Index Only Scan using range_parted1_a_b_c_idx on range_parted1 range_parted_1 + -> Index Only Scan using range_parted2_a_b_c_idx on range_parted2 range_parted_2 + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) select * from range_parted order by a desc,b desc,c desc; + QUERY PLAN +---------------------------------------------------------------------------------------------- + Append + -> Index Only Scan Backward using range_parted2_a_b_c_idx on range_parted2 range_parted_2 + -> Index Only Scan Backward using range_parted1_a_b_c_idx on range_parted1 range_parted_1 + Optimizer: Postgres query optimizer +(4 rows) + +drop table range_parted; +-- Check that we allow access to a child table's statistics when the user +-- has permissions only for the parent table. +create table permtest_parent (a int, b text, c text) partition by list (a); +create table permtest_child (b text, c text, a int) partition by list (b); +create table permtest_grandchild (c text, b text, a int); +alter table permtest_child attach partition permtest_grandchild for values in ('a'); +alter table permtest_parent attach partition permtest_child for values in (1); +create index on permtest_parent (left(c, 3)); +insert into permtest_parent + select 1, 'a', left(md5(i::text), 5) from generate_series(0, 100) i; +analyze permtest_parent; +create role regress_no_child_access; +revoke all on permtest_grandchild from regress_no_child_access; +NOTICE: no privileges could be revoked +grant select on permtest_parent to regress_no_child_access; +set session authorization regress_no_child_access; +-- without stats access, these queries would produce hash join plans: +explain (costs off) + select * from permtest_parent p1 inner join permtest_parent p2 + on p1.a = p2.a and p1.c ~ 'a1$'; + QUERY PLAN +------------------------------------------------ + Hash Join + Hash Cond: (p2.a = p1.a) + -> Seq Scan on permtest_grandchild p2 + -> Hash + -> Seq Scan on permtest_grandchild p1 + Filter: (c ~ 'a1$'::text) + Optimizer: Postgres query optimizer +(7 rows) + +explain (costs off) + select * from permtest_parent p1 inner join permtest_parent p2 + on p1.a = p2.a and left(p1.c, 3) ~ 'a1$'; + QUERY PLAN +---------------------------------------------------- + Hash Join + Hash Cond: (p2.a = p1.a) + -> Seq Scan on permtest_grandchild p2 + -> Hash + -> Seq Scan on permtest_grandchild p1 + Filter: ("left"(c, 3) ~ 'a1$'::text) + Optimizer: Postgres query optimizer +(7 rows) + +reset session authorization; +revoke all on permtest_parent from regress_no_child_access; +grant select(a,c) on permtest_parent to regress_no_child_access; +set session authorization regress_no_child_access; +explain (costs off) + select p2.a, p1.c from permtest_parent p1 inner join permtest_parent p2 + on p1.a = p2.a and p1.c ~ 'a1$'; + QUERY PLAN +------------------------------------------------ + Hash Join + Hash Cond: (p2.a = p1.a) + -> Seq Scan on permtest_grandchild p2 + -> Hash + -> Seq Scan on permtest_grandchild p1 + Filter: (c ~ 'a1$'::text) + Optimizer: Postgres query optimizer +(7 rows) + +-- we will not have access to the expression index's stats here: +explain (costs off) + select p2.a, p1.c from permtest_parent p1 inner join permtest_parent p2 + on p1.a = p2.a and left(p1.c, 3) ~ 'a1$'; + QUERY PLAN +---------------------------------------------------- + Hash Join + Hash Cond: (p2.a = p1.a) + -> Seq Scan on permtest_grandchild p2 + -> Hash + -> Seq Scan on permtest_grandchild p1 + Filter: ("left"(c, 3) ~ 'a1$'::text) + Optimizer: Postgres query optimizer +(7 rows) + +reset session authorization; +revoke all on permtest_parent from regress_no_child_access; +drop role regress_no_child_access; +drop table permtest_parent; +-- Verify that constraint errors across partition root / child are +-- handled correctly (Bug #16293) +CREATE TABLE errtst_parent ( + partid int not null, + shdata int not null, + data int NOT NULL DEFAULT 0, + CONSTRAINT shdata_small CHECK(shdata < 3) +) PARTITION BY RANGE (partid); +-- fast defaults lead to attribute mapping being used in one +-- direction, but not the other +CREATE TABLE errtst_child_fastdef ( + partid int not null, + shdata int not null, + CONSTRAINT shdata_small CHECK(shdata < 3) +); +-- no remapping in either direction necessary +CREATE TABLE errtst_child_plaindef ( + partid int not null, + shdata int not null, + data int NOT NULL DEFAULT 0, + CONSTRAINT shdata_small CHECK(shdata < 3), + CHECK(data < 10) +); +-- remapping in both direction +CREATE TABLE errtst_child_reorder ( + data int NOT NULL DEFAULT 0, + shdata int not null, + partid int not null, + CONSTRAINT shdata_small CHECK(shdata < 3), + CHECK(data < 10) +); +ALTER TABLE errtst_child_fastdef ADD COLUMN data int NOT NULL DEFAULT 0; +ALTER TABLE errtst_child_fastdef ADD CONSTRAINT errtest_child_fastdef_data_check CHECK (data < 10); +ALTER TABLE errtst_parent ATTACH PARTITION errtst_child_fastdef FOR VALUES FROM (0) TO (10); +ALTER TABLE errtst_parent ATTACH PARTITION errtst_child_plaindef FOR VALUES FROM (10) TO (20); +ALTER TABLE errtst_parent ATTACH PARTITION errtst_child_reorder FOR VALUES FROM (20) TO (30); +-- insert without child check constraint error +INSERT INTO errtst_parent(partid, shdata, data) VALUES ( '0', '1', '5'); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('10', '1', '5'); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('20', '1', '5'); +-- insert with child check constraint error +INSERT INTO errtst_parent(partid, shdata, data) VALUES ( '0', '1', '10'); +ERROR: new row for relation "errtst_child_fastdef" violates check constraint "errtest_child_fastdef_data_check" +DETAIL: Failing row contains (0, 1, 10). +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('10', '1', '10'); +ERROR: new row for relation "errtst_child_plaindef" violates check constraint "errtst_child_plaindef_data_check" +DETAIL: Failing row contains (10, 1, 10). +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('20', '1', '10'); +ERROR: new row for relation "errtst_child_reorder" violates check constraint "errtst_child_reorder_data_check" +DETAIL: Failing row contains (20, 1, 10). +-- insert with child not null constraint error +INSERT INTO errtst_parent(partid, shdata, data) VALUES ( '0', '1', NULL); +ERROR: null value in column "data" of relation "errtst_child_fastdef" violates not-null constraint +DETAIL: Failing row contains (0, 1, null). +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('10', '1', NULL); +ERROR: null value in column "data" of relation "errtst_child_plaindef" violates not-null constraint +DETAIL: Failing row contains (10, 1, null). +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('20', '1', NULL); +ERROR: null value in column "data" of relation "errtst_child_reorder" violates not-null constraint +DETAIL: Failing row contains (20, 1, null). +-- insert with shared check constraint error +INSERT INTO errtst_parent(partid, shdata, data) VALUES ( '0', '5', '5'); +ERROR: new row for relation "errtst_child_fastdef" violates check constraint "shdata_small" +DETAIL: Failing row contains (0, 5, 5). +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('10', '5', '5'); +ERROR: new row for relation "errtst_child_plaindef" violates check constraint "shdata_small" +DETAIL: Failing row contains (10, 5, 5). +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('20', '5', '5'); +ERROR: new row for relation "errtst_child_reorder" violates check constraint "shdata_small" +DETAIL: Failing row contains (20, 5, 5). +-- within partition update without child check constraint violation +BEGIN; +UPDATE errtst_parent SET data = data + 1 WHERE partid = 0; +UPDATE errtst_parent SET data = data + 1 WHERE partid = 10; +UPDATE errtst_parent SET data = data + 1 WHERE partid = 20; +ROLLBACK; +-- within partition update with child check constraint violation +UPDATE errtst_parent SET data = data + 10 WHERE partid = 0; +ERROR: new row for relation "errtst_child_fastdef" violates check constraint "errtest_child_fastdef_data_check" +DETAIL: Failing row contains (0, 1, 15). +UPDATE errtst_parent SET data = data + 10 WHERE partid = 10; +ERROR: new row for relation "errtst_child_plaindef" violates check constraint "errtst_child_plaindef_data_check" +DETAIL: Failing row contains (10, 1, 15). +UPDATE errtst_parent SET data = data + 10 WHERE partid = 20; +ERROR: new row for relation "errtst_child_reorder" violates check constraint "errtst_child_reorder_data_check" +DETAIL: Failing row contains (20, 1, 15). +-- direct leaf partition update, without partition id violation +BEGIN; +UPDATE errtst_child_fastdef SET partid = 1 WHERE partid = 0; +UPDATE errtst_child_plaindef SET partid = 11 WHERE partid = 10; +UPDATE errtst_child_reorder SET partid = 21 WHERE partid = 20; +ROLLBACK; +-- direct leaf partition update, with partition id violation +UPDATE errtst_child_fastdef SET partid = partid + 10 WHERE partid = 0; +ERROR: new row for relation "errtst_child_fastdef" violates partition constraint +DETAIL: Failing row contains (10, 1, 5). +UPDATE errtst_child_plaindef SET partid = partid + 10 WHERE partid = 10; +ERROR: new row for relation "errtst_child_plaindef" violates partition constraint +DETAIL: Failing row contains (20, 1, 5). +UPDATE errtst_child_reorder SET partid = partid + 10 WHERE partid = 20; +ERROR: new row for relation "errtst_child_reorder" violates partition constraint +DETAIL: Failing row contains (5, 1, 30). +-- partition move, without child check constraint violation +BEGIN; +UPDATE errtst_parent SET partid = 10, data = data + 1 WHERE partid = 0; +UPDATE errtst_parent SET partid = 20, data = data + 1 WHERE partid = 10; +UPDATE errtst_parent SET partid = 0, data = data + 1 WHERE partid = 20; +ROLLBACK; +-- partition move, with child check constraint violation +UPDATE errtst_parent SET partid = 10, data = data + 10 WHERE partid = 0; +ERROR: new row for relation "errtst_child_plaindef" violates check constraint "errtst_child_plaindef_data_check" +DETAIL: Failing row contains (10, 1, 15). +UPDATE errtst_parent SET partid = 20, data = data + 10 WHERE partid = 10; +ERROR: new row for relation "errtst_child_reorder" violates check constraint "errtst_child_reorder_data_check" +DETAIL: Failing row contains (20, 1, 15). +UPDATE errtst_parent SET partid = 0, data = data + 10 WHERE partid = 20; +ERROR: new row for relation "errtst_child_fastdef" violates check constraint "errtest_child_fastdef_data_check" +DETAIL: Failing row contains (0, 1, 15). +-- partition move, without target partition +UPDATE errtst_parent SET partid = 30, data = data + 10 WHERE partid = 20; +ERROR: no partition of relation "errtst_parent" found for row +DETAIL: Partition key of the failing row contains (partid) = (30). +DROP TABLE errtst_parent; diff --git a/src/test/singlenode_regress/expected/init_privs.out b/src/test/singlenode_regress/expected/init_privs.out new file mode 100644 index 00000000000..292b1a1035b --- /dev/null +++ b/src/test/singlenode_regress/expected/init_privs.out @@ -0,0 +1,12 @@ +-- Test initial privileges +-- There should always be some initial privileges, set up by initdb +SELECT count(*) > 0 FROM pg_init_privs; + ?column? +---------- + t +(1 row) + +-- Intentionally include some non-initial privs for pg_dump to dump out +GRANT SELECT ON pg_proc TO CURRENT_USER; +GRANT SELECT (prosrc) ON pg_proc TO CURRENT_USER; +GRANT SELECT (rolname, rolsuper) ON pg_authid TO CURRENT_USER; diff --git a/src/test/singlenode_regress/expected/insert.out b/src/test/singlenode_regress/expected/insert.out new file mode 100644 index 00000000000..073f27971ff --- /dev/null +++ b/src/test/singlenode_regress/expected/insert.out @@ -0,0 +1,1006 @@ +-- +-- insert with DEFAULT in the target_list +-- +create table inserttest (col1 int4, col2 int4 NOT NULL, col3 text default 'testing'); +insert into inserttest (col1, col2, col3) values (DEFAULT, DEFAULT, DEFAULT); +ERROR: null value in column "col2" of relation "inserttest" violates not-null constraint +DETAIL: Failing row contains (null, null, testing). +insert into inserttest (col2, col3) values (3, DEFAULT); +insert into inserttest (col1, col2, col3) values (DEFAULT, 5, DEFAULT); +insert into inserttest values (DEFAULT, 5, 'test'); +insert into inserttest values (DEFAULT, 7); +select * from inserttest; + col1 | col2 | col3 +------+------+--------- + | 3 | testing + | 5 | testing + | 5 | test + | 7 | testing +(4 rows) + +-- +-- insert with similar expression / target_list values (all fail) +-- +insert into inserttest (col1, col2, col3) values (DEFAULT, DEFAULT); +ERROR: INSERT has more target columns than expressions +LINE 1: insert into inserttest (col1, col2, col3) values (DEFAULT, D... + ^ +insert into inserttest (col1, col2, col3) values (1, 2); +ERROR: INSERT has more target columns than expressions +LINE 1: insert into inserttest (col1, col2, col3) values (1, 2); + ^ +insert into inserttest (col1) values (1, 2); +ERROR: INSERT has more expressions than target columns +LINE 1: insert into inserttest (col1) values (1, 2); + ^ +insert into inserttest (col1) values (DEFAULT, DEFAULT); +ERROR: INSERT has more expressions than target columns +LINE 1: insert into inserttest (col1) values (DEFAULT, DEFAULT); + ^ +select * from inserttest; + col1 | col2 | col3 +------+------+--------- + | 3 | testing + | 5 | testing + | 5 | test + | 7 | testing +(4 rows) + +-- +-- VALUES test +-- +insert into inserttest values(10, 20, '40'), (-1, 2, DEFAULT), + ((select 2), (select i from (values(3)) as foo (i)), 'values are fun!'); +select * from inserttest; + col1 | col2 | col3 +------+------+----------------- + | 3 | testing + | 5 | testing + | 5 | test + | 7 | testing + 10 | 20 | 40 + -1 | 2 | testing + 2 | 3 | values are fun! +(7 rows) + +-- +-- TOASTed value test +-- +insert into inserttest values(30, 50, repeat('x', 10000)); +select col1, col2, char_length(col3) from inserttest; + col1 | col2 | char_length +------+------+------------- + | 3 | 7 + | 5 | 7 + | 5 | 4 + | 7 | 7 + 10 | 20 | 2 + -1 | 2 | 7 + 2 | 3 | 15 + 30 | 50 | 10000 +(8 rows) + +drop table inserttest; +-- +-- tuple larger than fillfactor +-- +CREATE TABLE large_tuple_test (a int, b text) WITH (fillfactor = 10); +ALTER TABLE large_tuple_test ALTER COLUMN b SET STORAGE plain; +-- create page w/ free space in range [nearlyEmptyFreeSpace, MaxHeapTupleSize) +INSERT INTO large_tuple_test (select 1, NULL); +-- should still fit on the page +INSERT INTO large_tuple_test (select 2, repeat('a', 1000)); +SELECT pg_size_pretty(pg_relation_size('large_tuple_test'::regclass, 'main')); + pg_size_pretty +---------------- + 32 kB +(1 row) + +-- add small record to the second page +INSERT INTO large_tuple_test (select 3, NULL); +-- now this tuple won't fit on the second page, but the insert should +-- still succeed by extending the relation +INSERT INTO large_tuple_test (select 4, repeat('a', 8126)); +DROP TABLE large_tuple_test; +-- +-- check indirection (field/array assignment), cf bug #14265 +-- +-- these tests are aware that transformInsertStmt has 3 separate code paths +-- +create type insert_test_type as (if1 int, if2 text[]); +create table inserttest (f1 int, f2 int[], + f3 insert_test_type, f4 insert_test_type[]); +insert into inserttest (f2[1], f2[2]) values (1,2); +insert into inserttest (f2[1], f2[2]) values (3,4), (5,6); +insert into inserttest (f2[1], f2[2]) select 7,8; +insert into inserttest (f2[1], f2[2]) values (1,default); -- not supported +ERROR: cannot set an array element to DEFAULT +LINE 1: insert into inserttest (f2[1], f2[2]) values (1,default); + ^ +insert into inserttest (f3.if1, f3.if2) values (1,array['foo']); +insert into inserttest (f3.if1, f3.if2) values (1,'{foo}'), (2,'{bar}'); +insert into inserttest (f3.if1, f3.if2) select 3, '{baz,quux}'; +insert into inserttest (f3.if1, f3.if2) values (1,default); -- not supported +ERROR: cannot set a subfield to DEFAULT +LINE 1: insert into inserttest (f3.if1, f3.if2) values (1,default); + ^ +insert into inserttest (f3.if2[1], f3.if2[2]) values ('foo', 'bar'); +insert into inserttest (f3.if2[1], f3.if2[2]) values ('foo', 'bar'), ('baz', 'quux'); +insert into inserttest (f3.if2[1], f3.if2[2]) select 'bear', 'beer'; +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) values ('foo', 'bar'); +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) values ('foo', 'bar'), ('baz', 'quux'); +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) select 'bear', 'beer'; +select * from inserttest; + f1 | f2 | f3 | f4 +----+-------+------------------+------------------------ + | {1,2} | | + | {3,4} | | + | {5,6} | | + | {7,8} | | + | | (1,{foo}) | + | | (1,{foo}) | + | | (2,{bar}) | + | | (3,"{baz,quux}") | + | | (,"{foo,bar}") | + | | (,"{foo,bar}") | + | | (,"{baz,quux}") | + | | (,"{bear,beer}") | + | | | {"(,\"{foo,bar}\")"} + | | | {"(,\"{foo,bar}\")"} + | | | {"(,\"{baz,quux}\")"} + | | | {"(,\"{bear,beer}\")"} +(16 rows) + +-- also check reverse-listing +create table inserttest2 (f1 bigint, f2 text); +create rule irule1 as on insert to inserttest2 do also + insert into inserttest (f3.if2[1], f3.if2[2]) + values (new.f1,new.f2); +create rule irule2 as on insert to inserttest2 do also + insert into inserttest (f4[1].if1, f4[1].if2[2]) + values (1,'fool'),(new.f1,new.f2); +create rule irule3 as on insert to inserttest2 do also + insert into inserttest (f4[1].if1, f4[1].if2[2]) + select new.f1, new.f2; +\d+ inserttest2 + Table "public.inserttest2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+--------+-----------+----------+---------+----------+--------------+------------- + f1 | bigint | | | | plain | | + f2 | text | | | | extended | | +Rules: + irule1 AS + ON INSERT TO inserttest2 DO INSERT INTO inserttest (f3.if2[1], f3.if2[2]) + VALUES (new.f1, new.f2) + irule2 AS + ON INSERT TO inserttest2 DO INSERT INTO inserttest (f4[1].if1, f4[1].if2[2]) VALUES (1,'fool'::text), (new.f1,new.f2) + irule3 AS + ON INSERT TO inserttest2 DO INSERT INTO inserttest (f4[1].if1, f4[1].if2[2]) SELECT new.f1, + new.f2 + +drop table inserttest2; +drop table inserttest; +drop type insert_test_type; +-- direct partition inserts should check partition bound constraint +create table range_parted ( + a text, + b int +) partition by range (a, (b+0)); +-- no partitions, so fail +insert into range_parted values ('a', 11); +ERROR: no partition of relation "range_parted" found for row +DETAIL: Partition key of the failing row contains (a, (b + 0)) = (a, 11). +create table part1 partition of range_parted for values from ('a', 1) to ('a', 10); +create table part2 partition of range_parted for values from ('a', 10) to ('a', 20); +create table part3 partition of range_parted for values from ('b', 1) to ('b', 10); +create table part4 partition of range_parted for values from ('b', 10) to ('b', 20); +-- fail +insert into part1 values ('a', 11); +ERROR: new row for relation "part1" violates partition constraint +DETAIL: Failing row contains (a, 11). +insert into part1 values ('b', 1); +ERROR: new row for relation "part1" violates partition constraint +DETAIL: Failing row contains (b, 1). +-- ok +insert into part1 values ('a', 1); +-- fail +insert into part4 values ('b', 21); +ERROR: new row for relation "part4" violates partition constraint +DETAIL: Failing row contains (b, 21). +insert into part4 values ('a', 10); +ERROR: new row for relation "part4" violates partition constraint +DETAIL: Failing row contains (a, 10). +-- ok +insert into part4 values ('b', 10); +-- fail (partition key a has a NOT NULL constraint) +insert into part1 values (null); +ERROR: new row for relation "part1" violates partition constraint +DETAIL: Failing row contains (null, null). +-- fail (expression key (b+0) cannot be null either) +insert into part1 values (1); +ERROR: new row for relation "part1" violates partition constraint +DETAIL: Failing row contains (1, null). +create table list_parted ( + a text, + b int +) partition by list (lower(a)); +create table part_aa_bb partition of list_parted FOR VALUES IN ('aa', 'bb'); +create table part_cc_dd partition of list_parted FOR VALUES IN ('cc', 'dd'); +create table part_null partition of list_parted FOR VALUES IN (null); +-- fail +insert into part_aa_bb values ('cc', 1); +ERROR: new row for relation "part_aa_bb" violates partition constraint +DETAIL: Failing row contains (cc, 1). +insert into part_aa_bb values ('AAa', 1); +ERROR: new row for relation "part_aa_bb" violates partition constraint +DETAIL: Failing row contains (AAa, 1). +insert into part_aa_bb values (null); +ERROR: new row for relation "part_aa_bb" violates partition constraint +DETAIL: Failing row contains (null, null). +-- ok +insert into part_cc_dd values ('cC', 1); +insert into part_null values (null, 0); +-- check in case of multi-level partitioned table +create table part_ee_ff partition of list_parted for values in ('ee', 'ff') partition by range (b); +create table part_ee_ff1 partition of part_ee_ff for values from (1) to (10); +create table part_ee_ff2 partition of part_ee_ff for values from (10) to (20); +-- test default partition +create table part_default partition of list_parted default; +-- Negative test: a row, which would fit in other partition, does not fit +-- default partition, even when inserted directly +insert into part_default values ('aa', 2); +ERROR: new row for relation "part_default" violates partition constraint +DETAIL: Failing row contains (aa, 2). +insert into part_default values (null, 2); +ERROR: new row for relation "part_default" violates partition constraint +DETAIL: Failing row contains (null, 2). +-- ok +insert into part_default values ('Zz', 2); +-- test if default partition works as expected for multi-level partitioned +-- table as well as when default partition itself is further partitioned +drop table part_default; +create table part_xx_yy partition of list_parted for values in ('xx', 'yy') partition by list (a); +create table part_xx_yy_p1 partition of part_xx_yy for values in ('xx'); +create table part_xx_yy_defpart partition of part_xx_yy default; +create table part_default partition of list_parted default partition by range(b); +create table part_default_p1 partition of part_default for values from (20) to (30); +create table part_default_p2 partition of part_default for values from (30) to (40); +-- fail +insert into part_ee_ff1 values ('EE', 11); +ERROR: new row for relation "part_ee_ff1" violates partition constraint +DETAIL: Failing row contains (EE, 11). +insert into part_default_p2 values ('gg', 43); +ERROR: new row for relation "part_default_p2" violates partition constraint +DETAIL: Failing row contains (gg, 43). +-- fail (even the parent's, ie, part_ee_ff's partition constraint applies) +insert into part_ee_ff1 values ('cc', 1); +ERROR: new row for relation "part_ee_ff1" violates partition constraint +DETAIL: Failing row contains (cc, 1). +insert into part_default values ('gg', 43); +ERROR: no partition of relation "part_default" found for row +DETAIL: Partition key of the failing row contains (b) = (43). +-- ok +insert into part_ee_ff1 values ('ff', 1); +insert into part_ee_ff2 values ('ff', 11); +insert into part_default_p1 values ('cd', 25); +insert into part_default_p2 values ('de', 35); +insert into list_parted values ('ab', 21); +insert into list_parted values ('xx', 1); +insert into list_parted values ('yy', 2); +select tableoid::regclass, * from list_parted; + tableoid | a | b +--------------------+----+---- + part_cc_dd | cC | 1 + part_ee_ff1 | ff | 1 + part_ee_ff2 | ff | 11 + part_xx_yy_p1 | xx | 1 + part_xx_yy_defpart | yy | 2 + part_null | | 0 + part_default_p1 | cd | 25 + part_default_p1 | ab | 21 + part_default_p2 | de | 35 +(9 rows) + +-- Check tuple routing for partitioned tables +-- fail +insert into range_parted values ('a', 0); +ERROR: no partition of relation "range_parted" found for row +DETAIL: Partition key of the failing row contains (a, (b + 0)) = (a, 0). +-- ok +insert into range_parted values ('a', 1); +insert into range_parted values ('a', 10); +-- fail +insert into range_parted values ('a', 20); +ERROR: no partition of relation "range_parted" found for row +DETAIL: Partition key of the failing row contains (a, (b + 0)) = (a, 20). +-- ok +insert into range_parted values ('b', 1); +insert into range_parted values ('b', 10); +-- fail (partition key (b+0) is null) +insert into range_parted values ('a'); +ERROR: no partition of relation "range_parted" found for row +DETAIL: Partition key of the failing row contains (a, (b + 0)) = (a, null). +-- Check default partition +create table part_def partition of range_parted default; +-- fail +insert into part_def values ('b', 10); +ERROR: new row for relation "part_def" violates partition constraint +DETAIL: Failing row contains (b, 10). +-- ok +insert into part_def values ('c', 10); +insert into range_parted values (null, null); +insert into range_parted values ('a', null); +insert into range_parted values (null, 19); +insert into range_parted values ('b', 20); +select tableoid::regclass, * from range_parted; + tableoid | a | b +----------+---+---- + part1 | a | 1 + part1 | a | 1 + part2 | a | 10 + part3 | b | 1 + part4 | b | 10 + part4 | b | 10 + part_def | c | 10 + part_def | | + part_def | a | + part_def | | 19 + part_def | b | 20 +(11 rows) + +-- ok +insert into list_parted values (null, 1); +insert into list_parted (a) values ('aA'); +-- fail (partition of part_ee_ff not found in both cases) +insert into list_parted values ('EE', 0); +ERROR: no partition of relation "part_ee_ff" found for row +DETAIL: Partition key of the failing row contains (b) = (0). +insert into part_ee_ff values ('EE', 0); +ERROR: no partition of relation "part_ee_ff" found for row +DETAIL: Partition key of the failing row contains (b) = (0). +-- ok +insert into list_parted values ('EE', 1); +insert into part_ee_ff values ('EE', 10); +select tableoid::regclass, * from list_parted; + tableoid | a | b +--------------------+----+---- + part_aa_bb | aA | + part_cc_dd | cC | 1 + part_ee_ff1 | ff | 1 + part_ee_ff1 | EE | 1 + part_ee_ff2 | ff | 11 + part_ee_ff2 | EE | 10 + part_xx_yy_p1 | xx | 1 + part_xx_yy_defpart | yy | 2 + part_null | | 0 + part_null | | 1 + part_default_p1 | cd | 25 + part_default_p1 | ab | 21 + part_default_p2 | de | 35 +(13 rows) + +-- some more tests to exercise tuple-routing with multi-level partitioning +create table part_gg partition of list_parted for values in ('gg') partition by range (b); +create table part_gg1 partition of part_gg for values from (minvalue) to (1); +create table part_gg2 partition of part_gg for values from (1) to (10) partition by range (b); +create table part_gg2_1 partition of part_gg2 for values from (1) to (5); +create table part_gg2_2 partition of part_gg2 for values from (5) to (10); +create table part_ee_ff3 partition of part_ee_ff for values from (20) to (30) partition by range (b); +create table part_ee_ff3_1 partition of part_ee_ff3 for values from (20) to (25); +create table part_ee_ff3_2 partition of part_ee_ff3 for values from (25) to (30); +truncate list_parted; +insert into list_parted values ('aa'), ('cc'); +insert into list_parted select 'Ff', s.a from generate_series(1, 29) s(a); +insert into list_parted select 'gg', s.a from generate_series(1, 9) s(a); +insert into list_parted (b) values (1); +select tableoid::regclass::text, a, min(b) as min_b, max(b) as max_b from list_parted group by 1, 2 order by 1; + tableoid | a | min_b | max_b +---------------+----+-------+------- + part_aa_bb | aa | | + part_cc_dd | cc | | + part_ee_ff1 | Ff | 1 | 9 + part_ee_ff2 | Ff | 10 | 19 + part_ee_ff3_1 | Ff | 20 | 24 + part_ee_ff3_2 | Ff | 25 | 29 + part_gg2_1 | gg | 1 | 4 + part_gg2_2 | gg | 5 | 9 + part_null | | 1 | 1 +(9 rows) + +-- direct partition inserts should check hash partition bound constraint +-- Use hand-rolled hash functions and operator classes to get predictable +-- result on different machines. The hash function for int4 simply returns +-- the sum of the values passed to it and the one for text returns the length +-- of the non-empty string value passed to it or 0. +create or replace function part_hashint4_noop(value int4, seed int8) +returns int8 as $$ +select value + seed; +$$ language sql immutable; +create operator class part_test_int4_ops +for type int4 +using hash as +operator 1 =, +function 2 part_hashint4_noop(int4, int8); +create or replace function part_hashtext_length(value text, seed int8) +RETURNS int8 AS $$ +select length(coalesce(value, ''))::int8 +$$ language sql immutable; +create operator class part_test_text_ops +for type text +using hash as +operator 1 =, +function 2 part_hashtext_length(text, int8); +create table hash_parted ( + a int +) partition by hash (a part_test_int4_ops); +create table hpart0 partition of hash_parted for values with (modulus 4, remainder 0); +create table hpart1 partition of hash_parted for values with (modulus 4, remainder 1); +create table hpart2 partition of hash_parted for values with (modulus 4, remainder 2); +create table hpart3 partition of hash_parted for values with (modulus 4, remainder 3); +insert into hash_parted values(generate_series(1,10)); +-- direct insert of values divisible by 4 - ok; +insert into hpart0 values(12),(16); +-- fail; +insert into hpart0 values(11); +ERROR: new row for relation "hpart0" violates partition constraint +DETAIL: Failing row contains (11). +-- 11 % 4 -> 3 remainder i.e. valid data for hpart3 partition +insert into hpart3 values(11); +-- view data +select tableoid::regclass as part, a, a%4 as "remainder = a % 4" +from hash_parted order by part; + part | a | remainder = a % 4 +--------+----+------------------- + hpart0 | 4 | 0 + hpart0 | 8 | 0 + hpart0 | 12 | 0 + hpart0 | 16 | 0 + hpart1 | 1 | 1 + hpart1 | 5 | 1 + hpart1 | 9 | 1 + hpart2 | 2 | 2 + hpart2 | 6 | 2 + hpart2 | 10 | 2 + hpart3 | 3 | 3 + hpart3 | 7 | 3 + hpart3 | 11 | 3 +(13 rows) + +-- test \d+ output on a table which has both partitioned and unpartitioned +-- partitions +\d+ list_parted + Partitioned table "public.list_parted" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition key: LIST (lower(a)) +Partitions: part_aa_bb FOR VALUES IN ('aa', 'bb'), + part_cc_dd FOR VALUES IN ('cc', 'dd'), + part_ee_ff FOR VALUES IN ('ee', 'ff'), PARTITIONED, + part_gg FOR VALUES IN ('gg'), PARTITIONED, + part_null FOR VALUES IN (NULL), + part_xx_yy FOR VALUES IN ('xx', 'yy'), PARTITIONED, + part_default DEFAULT, PARTITIONED + +-- cleanup +drop table range_parted, list_parted; +drop table hash_parted; +-- test that a default partition added as the first partition accepts any value +-- including null +create table list_parted (a int) partition by list (a); +create table part_default partition of list_parted default; +\d+ part_default + Table "public.part_default" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | +Partition of: list_parted DEFAULT +No partition constraint + +insert into part_default values (null); +insert into part_default values (1); +insert into part_default values (-1); +select tableoid::regclass, a from list_parted; + tableoid | a +--------------+---- + part_default | + part_default | 1 + part_default | -1 +(3 rows) + +-- cleanup +drop table list_parted; +-- more tests for certain multi-level partitioning scenarios +create table mlparted (a int, b int) partition by range (a, b); +create table mlparted1 (b int not null, a int not null) partition by range ((b+0)); +create table mlparted11 (like mlparted1); +alter table mlparted11 drop a; +alter table mlparted11 add a int; +alter table mlparted11 drop a; +alter table mlparted11 add a int not null; +-- attnum for key attribute 'a' is different in mlparted, mlparted1, and mlparted11 +select attrelid::regclass, attname, attnum +from pg_attribute +where attname = 'a' + and (attrelid = 'mlparted'::regclass + or attrelid = 'mlparted1'::regclass + or attrelid = 'mlparted11'::regclass) +order by attrelid::regclass::text; + attrelid | attname | attnum +------------+---------+-------- + mlparted | a | 1 + mlparted1 | a | 2 + mlparted11 | a | 4 +(3 rows) + +alter table mlparted1 attach partition mlparted11 for values from (2) to (5); +alter table mlparted attach partition mlparted1 for values from (1, 2) to (1, 10); +-- check that "(1, 2)" is correctly routed to mlparted11. +insert into mlparted values (1, 2); +select tableoid::regclass, * from mlparted; + tableoid | a | b +------------+---+--- + mlparted11 | 1 | 2 +(1 row) + +-- check that proper message is shown after failure to route through mlparted1 +insert into mlparted (a, b) values (1, 5); +ERROR: no partition of relation "mlparted1" found for row +DETAIL: Partition key of the failing row contains ((b + 0)) = (5). +truncate mlparted; +alter table mlparted add constraint check_b check (b = 3); +-- have a BR trigger modify the row such that the check_b is violated +create function mlparted11_trig_fn() +returns trigger AS +$$ +begin + NEW.b := 4; + return NEW; +end; +$$ +language plpgsql; +create trigger mlparted11_trig before insert ON mlparted11 + for each row execute procedure mlparted11_trig_fn(); +-- check that the correct row is shown when constraint check_b fails after +-- "(1, 2)" is routed to mlparted11 (actually "(1, 4)" would be shown due +-- to the BR trigger mlparted11_trig_fn) +insert into mlparted values (1, 2); +ERROR: new row for relation "mlparted11" violates check constraint "check_b" +DETAIL: Failing row contains (1, 4). +drop trigger mlparted11_trig on mlparted11; +drop function mlparted11_trig_fn(); +-- check that inserting into an internal partition successfully results in +-- checking its partition constraint before inserting into the leaf partition +-- selected by tuple-routing +insert into mlparted1 (a, b) values (2, 3); +ERROR: new row for relation "mlparted1" violates partition constraint +DETAIL: Failing row contains (3, 2). +-- check routing error through a list partitioned table when the key is null +create table lparted_nonullpart (a int, b char) partition by list (b); +create table lparted_nonullpart_a partition of lparted_nonullpart for values in ('a'); +insert into lparted_nonullpart values (1); +ERROR: no partition of relation "lparted_nonullpart" found for row +DETAIL: Partition key of the failing row contains (b) = (null). +drop table lparted_nonullpart; +-- check that RETURNING works correctly with tuple-routing +alter table mlparted drop constraint check_b; +create table mlparted12 partition of mlparted1 for values from (5) to (10); +create table mlparted2 (b int not null, a int not null); +alter table mlparted attach partition mlparted2 for values from (1, 10) to (1, 20); +create table mlparted3 partition of mlparted for values from (1, 20) to (1, 30); +create table mlparted4 (like mlparted); +alter table mlparted4 drop a; +alter table mlparted4 add a int not null; +alter table mlparted attach partition mlparted4 for values from (1, 30) to (1, 40); +with ins (a, b, c) as + (insert into mlparted (b, a) select s.a, 1 from generate_series(2, 39) s(a) returning tableoid::regclass, *) + select a, b, min(c), max(c) from ins group by a, b order by 1; + a | b | min | max +------------+---+-----+----- + mlparted11 | 1 | 2 | 4 + mlparted12 | 1 | 5 | 9 + mlparted2 | 1 | 10 | 19 + mlparted3 | 1 | 20 | 29 + mlparted4 | 1 | 30 | 39 +(5 rows) + +alter table mlparted add c text; +create table mlparted5 (c text, a int not null, b int not null) partition by list (c); +create table mlparted5a (a int not null, c text, b int not null); +alter table mlparted5 attach partition mlparted5a for values in ('a'); +alter table mlparted attach partition mlparted5 for values from (1, 40) to (1, 50); +alter table mlparted add constraint check_b check (a = 1 and b < 45); +insert into mlparted values (1, 45, 'a'); +ERROR: new row for relation "mlparted5a" violates check constraint "check_b" +DETAIL: Failing row contains (1, 45, a). +create function mlparted5abrtrig_func() returns trigger as $$ begin new.c = 'b'; return new; end; $$ language plpgsql; +create trigger mlparted5abrtrig before insert on mlparted5a for each row execute procedure mlparted5abrtrig_func(); +insert into mlparted5 (a, b, c) values (1, 40, 'a'); +ERROR: new row for relation "mlparted5a" violates partition constraint +DETAIL: Failing row contains (b, 1, 40). +drop table mlparted5; +alter table mlparted drop constraint check_b; +-- Check multi-level default partition +create table mlparted_def partition of mlparted default partition by range(a); +create table mlparted_def1 partition of mlparted_def for values from (40) to (50); +create table mlparted_def2 partition of mlparted_def for values from (50) to (60); +insert into mlparted values (40, 100); +insert into mlparted_def1 values (42, 100); +insert into mlparted_def2 values (54, 50); +-- fail +insert into mlparted values (70, 100); +ERROR: no partition of relation "mlparted_def" found for row +DETAIL: Partition key of the failing row contains (a) = (70). +insert into mlparted_def1 values (52, 50); +ERROR: new row for relation "mlparted_def1" violates partition constraint +DETAIL: Failing row contains (52, 50, null). +insert into mlparted_def2 values (34, 50); +ERROR: new row for relation "mlparted_def2" violates partition constraint +DETAIL: Failing row contains (34, 50, null). +-- ok +create table mlparted_defd partition of mlparted_def default; +insert into mlparted values (70, 100); +select tableoid::regclass, * from mlparted_def; + tableoid | a | b | c +---------------+----+-----+--- + mlparted_def1 | 40 | 100 | + mlparted_def1 | 42 | 100 | + mlparted_def2 | 54 | 50 | + mlparted_defd | 70 | 100 | +(4 rows) + +-- Check multi-level tuple routing with attributes dropped from the +-- top-most parent. First remove the last attribute. +alter table mlparted add d int, add e int; +alter table mlparted drop e; +create table mlparted5 partition of mlparted + for values from (1, 40) to (1, 50) partition by range (c); +create table mlparted5_ab partition of mlparted5 + for values from ('a') to ('c') partition by list (c); +-- This partitioned table should remain with no partitions. +create table mlparted5_cd partition of mlparted5 + for values from ('c') to ('e') partition by list (c); +create table mlparted5_a partition of mlparted5_ab for values in ('a'); +create table mlparted5_b (d int, b int, c text, a int); +alter table mlparted5_ab attach partition mlparted5_b for values in ('b'); +truncate mlparted; +insert into mlparted values (1, 2, 'a', 1); +insert into mlparted values (1, 40, 'a', 1); -- goes to mlparted5_a +insert into mlparted values (1, 45, 'b', 1); -- goes to mlparted5_b +insert into mlparted values (1, 45, 'c', 1); -- goes to mlparted5_cd, fails +ERROR: no partition of relation "mlparted5_cd" found for row +DETAIL: Partition key of the failing row contains (c) = (c). +insert into mlparted values (1, 45, 'f', 1); -- goes to mlparted5, fails +ERROR: no partition of relation "mlparted5" found for row +DETAIL: Partition key of the failing row contains (c) = (f). +select tableoid::regclass, * from mlparted order by a, b, c, d; + tableoid | a | b | c | d +-------------+---+----+---+--- + mlparted11 | 1 | 2 | a | 1 + mlparted5_a | 1 | 40 | a | 1 + mlparted5_b | 1 | 45 | b | 1 +(3 rows) + +alter table mlparted drop d; +truncate mlparted; +-- Remove the before last attribute. +alter table mlparted add e int, add d int; +alter table mlparted drop e; +insert into mlparted values (1, 2, 'a', 1); +insert into mlparted values (1, 40, 'a', 1); -- goes to mlparted5_a +insert into mlparted values (1, 45, 'b', 1); -- goes to mlparted5_b +insert into mlparted values (1, 45, 'c', 1); -- goes to mlparted5_cd, fails +ERROR: no partition of relation "mlparted5_cd" found for row +DETAIL: Partition key of the failing row contains (c) = (c). +insert into mlparted values (1, 45, 'f', 1); -- goes to mlparted5, fails +ERROR: no partition of relation "mlparted5" found for row +DETAIL: Partition key of the failing row contains (c) = (f). +select tableoid::regclass, * from mlparted order by a, b, c, d; + tableoid | a | b | c | d +-------------+---+----+---+--- + mlparted11 | 1 | 2 | a | 1 + mlparted5_a | 1 | 40 | a | 1 + mlparted5_b | 1 | 45 | b | 1 +(3 rows) + +alter table mlparted drop d; +drop table mlparted5; +-- check that message shown after failure to find a partition shows the +-- appropriate key description (or none) in various situations +create table key_desc (a int, b int) partition by list ((a+0)); +create table key_desc_1 partition of key_desc for values in (1) partition by range (b); +create user regress_insert_other_user; +grant select (a) on key_desc_1 to regress_insert_other_user; +grant insert on key_desc to regress_insert_other_user; +set role regress_insert_other_user; +-- no key description is shown +insert into key_desc values (1, 1); +ERROR: no partition of relation "key_desc_1" found for row +reset role; +grant select (b) on key_desc_1 to regress_insert_other_user; +set role regress_insert_other_user; +-- key description (b)=(1) is now shown +insert into key_desc values (1, 1); +ERROR: no partition of relation "key_desc_1" found for row +DETAIL: Partition key of the failing row contains (b) = (1). +-- key description is not shown if key contains expression +insert into key_desc values (2, 1); +ERROR: no partition of relation "key_desc" found for row +reset role; +revoke all on key_desc from regress_insert_other_user; +revoke all on key_desc_1 from regress_insert_other_user; +NOTICE: no privileges could be revoked +drop role regress_insert_other_user; +drop table key_desc, key_desc_1; +-- test minvalue/maxvalue restrictions +create table mcrparted (a int, b int, c int) partition by range (a, abs(b), c); +create table mcrparted0 partition of mcrparted for values from (minvalue, 0, 0) to (1, maxvalue, maxvalue); +ERROR: every bound following MINVALUE must also be MINVALUE +LINE 1: ...partition of mcrparted for values from (minvalue, 0, 0) to (... + ^ +create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue) to (10, maxvalue, minvalue); +ERROR: every bound following MAXVALUE must also be MAXVALUE +LINE 1: ...r values from (10, 6, minvalue) to (10, maxvalue, minvalue); + ^ +create table mcrparted4 partition of mcrparted for values from (21, minvalue, 0) to (30, 20, minvalue); +ERROR: every bound following MINVALUE must also be MINVALUE +LINE 1: ...ition of mcrparted for values from (21, minvalue, 0) to (30,... + ^ +-- check multi-column range partitioning expression enforces the same +-- constraint as what tuple-routing would determine it to be +create table mcrparted0 partition of mcrparted for values from (minvalue, minvalue, minvalue) to (1, maxvalue, maxvalue); +create table mcrparted1 partition of mcrparted for values from (2, 1, minvalue) to (10, 5, 10); +create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue) to (10, maxvalue, maxvalue); +create table mcrparted3 partition of mcrparted for values from (11, 1, 1) to (20, 10, 10); +create table mcrparted4 partition of mcrparted for values from (21, minvalue, minvalue) to (30, 20, maxvalue); +create table mcrparted5 partition of mcrparted for values from (30, 21, 20) to (maxvalue, maxvalue, maxvalue); +-- null not allowed in range partition +insert into mcrparted values (null, null, null); +ERROR: no partition of relation "mcrparted" found for row +DETAIL: Partition key of the failing row contains (a, abs(b), c) = (null, null, null). +-- routed to mcrparted0 +insert into mcrparted values (0, 1, 1); +insert into mcrparted0 values (0, 1, 1); +-- routed to mcparted1 +insert into mcrparted values (9, 1000, 1); +insert into mcrparted1 values (9, 1000, 1); +insert into mcrparted values (10, 5, -1); +insert into mcrparted1 values (10, 5, -1); +insert into mcrparted values (2, 1, 0); +insert into mcrparted1 values (2, 1, 0); +-- routed to mcparted2 +insert into mcrparted values (10, 6, 1000); +insert into mcrparted2 values (10, 6, 1000); +insert into mcrparted values (10, 1000, 1000); +insert into mcrparted2 values (10, 1000, 1000); +-- no partition exists, nor does mcrparted3 accept it +insert into mcrparted values (11, 1, -1); +ERROR: no partition of relation "mcrparted" found for row +DETAIL: Partition key of the failing row contains (a, abs(b), c) = (11, 1, -1). +insert into mcrparted3 values (11, 1, -1); +ERROR: new row for relation "mcrparted3" violates partition constraint +DETAIL: Failing row contains (11, 1, -1). +-- routed to mcrparted5 +insert into mcrparted values (30, 21, 20); +insert into mcrparted5 values (30, 21, 20); +insert into mcrparted4 values (30, 21, 20); -- error +ERROR: new row for relation "mcrparted4" violates partition constraint +DETAIL: Failing row contains (30, 21, 20). +-- check rows +select tableoid::regclass::text, * from mcrparted order by 1; + tableoid | a | b | c +------------+----+------+------ + mcrparted0 | 0 | 1 | 1 + mcrparted0 | 0 | 1 | 1 + mcrparted1 | 9 | 1000 | 1 + mcrparted1 | 9 | 1000 | 1 + mcrparted1 | 10 | 5 | -1 + mcrparted1 | 10 | 5 | -1 + mcrparted1 | 2 | 1 | 0 + mcrparted1 | 2 | 1 | 0 + mcrparted2 | 10 | 6 | 1000 + mcrparted2 | 10 | 6 | 1000 + mcrparted2 | 10 | 1000 | 1000 + mcrparted2 | 10 | 1000 | 1000 + mcrparted5 | 30 | 21 | 20 + mcrparted5 | 30 | 21 | 20 +(14 rows) + +-- cleanup +drop table mcrparted; +-- check that a BR constraint can't make partition contain violating rows +create table brtrigpartcon (a int, b text) partition by list (a); +create table brtrigpartcon1 partition of brtrigpartcon for values in (1); +create or replace function brtrigpartcon1trigf() returns trigger as $$begin new.a := 2; return new; end$$ language plpgsql; +create trigger brtrigpartcon1trig before insert on brtrigpartcon1 for each row execute procedure brtrigpartcon1trigf(); +insert into brtrigpartcon values (1, 'hi there'); +ERROR: new row for relation "brtrigpartcon1" violates partition constraint +DETAIL: Failing row contains (2, hi there). +insert into brtrigpartcon1 values (1, 'hi there'); +ERROR: new row for relation "brtrigpartcon1" violates partition constraint +DETAIL: Failing row contains (2, hi there). +-- check that the message shows the appropriate column description in a +-- situation where the partitioned table is not the primary ModifyTable node +create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int); +create role regress_coldesc_role; +grant insert on inserttest3 to regress_coldesc_role; +grant insert on brtrigpartcon to regress_coldesc_role; +revoke select on brtrigpartcon from regress_coldesc_role; +set role regress_coldesc_role; +with result as (insert into brtrigpartcon values (1, 'hi there') returning 1) + insert into inserttest3 (f3) select * from result; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +reset role; +-- cleanup +revoke all on inserttest3 from regress_coldesc_role; +revoke all on brtrigpartcon from regress_coldesc_role; +drop role regress_coldesc_role; +drop table inserttest3; +drop table brtrigpartcon; +drop function brtrigpartcon1trigf(); +-- check that "do nothing" BR triggers work with tuple-routing +create table donothingbrtrig_test (a int, b text) partition by list (a); +create table donothingbrtrig_test1 (b text, a int); +create table donothingbrtrig_test2 (c text, b text, a int); +alter table donothingbrtrig_test2 drop column c; +create or replace function donothingbrtrig_func() returns trigger as $$begin raise notice 'b: %', new.b; return NULL; end$$ language plpgsql; +create trigger donothingbrtrig1 before insert on donothingbrtrig_test1 for each row execute procedure donothingbrtrig_func(); +create trigger donothingbrtrig2 before insert on donothingbrtrig_test2 for each row execute procedure donothingbrtrig_func(); +alter table donothingbrtrig_test attach partition donothingbrtrig_test1 for values in (1); +alter table donothingbrtrig_test attach partition donothingbrtrig_test2 for values in (2); +insert into donothingbrtrig_test values (1, 'foo'), (2, 'bar'); +NOTICE: b: foo +NOTICE: b: bar +copy donothingbrtrig_test from stdout; +NOTICE: b: baz +NOTICE: b: qux +select tableoid::regclass, * from donothingbrtrig_test; + tableoid | a | b +----------+---+--- +(0 rows) + +-- cleanup +drop table donothingbrtrig_test; +drop function donothingbrtrig_func(); +-- check multi-column range partitioning with minvalue/maxvalue constraints +create table mcrparted (a text, b int) partition by range(a, b); +create table mcrparted1_lt_b partition of mcrparted for values from (minvalue, minvalue) to ('b', minvalue); +create table mcrparted2_b partition of mcrparted for values from ('b', minvalue) to ('c', minvalue); +create table mcrparted3_c_to_common partition of mcrparted for values from ('c', minvalue) to ('common', minvalue); +create table mcrparted4_common_lt_0 partition of mcrparted for values from ('common', minvalue) to ('common', 0); +create table mcrparted5_common_0_to_10 partition of mcrparted for values from ('common', 0) to ('common', 10); +create table mcrparted6_common_ge_10 partition of mcrparted for values from ('common', 10) to ('common', maxvalue); +create table mcrparted7_gt_common_lt_d partition of mcrparted for values from ('common', maxvalue) to ('d', minvalue); +create table mcrparted8_ge_d partition of mcrparted for values from ('d', minvalue) to (maxvalue, maxvalue); +\d+ mcrparted + Partitioned table "public.mcrparted" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition key: RANGE (a, b) +Partitions: mcrparted1_lt_b FOR VALUES FROM (MINVALUE, MINVALUE) TO ('b', MINVALUE), + mcrparted2_b FOR VALUES FROM ('b', MINVALUE) TO ('c', MINVALUE), + mcrparted3_c_to_common FOR VALUES FROM ('c', MINVALUE) TO ('common', MINVALUE), + mcrparted4_common_lt_0 FOR VALUES FROM ('common', MINVALUE) TO ('common', 0), + mcrparted5_common_0_to_10 FOR VALUES FROM ('common', 0) TO ('common', 10), + mcrparted6_common_ge_10 FOR VALUES FROM ('common', 10) TO ('common', MAXVALUE), + mcrparted7_gt_common_lt_d FOR VALUES FROM ('common', MAXVALUE) TO ('d', MINVALUE), + mcrparted8_ge_d FOR VALUES FROM ('d', MINVALUE) TO (MAXVALUE, MAXVALUE) + +\d+ mcrparted1_lt_b + Table "public.mcrparted1_lt_b" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition of: mcrparted FOR VALUES FROM (MINVALUE, MINVALUE) TO ('b', MINVALUE) +Partition constraint: ((a IS NOT NULL) AND (b IS NOT NULL) AND (a < 'b'::text)) + +\d+ mcrparted2_b + Table "public.mcrparted2_b" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition of: mcrparted FOR VALUES FROM ('b', MINVALUE) TO ('c', MINVALUE) +Partition constraint: ((a IS NOT NULL) AND (b IS NOT NULL) AND (a >= 'b'::text) AND (a < 'c'::text)) + +\d+ mcrparted3_c_to_common + Table "public.mcrparted3_c_to_common" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition of: mcrparted FOR VALUES FROM ('c', MINVALUE) TO ('common', MINVALUE) +Partition constraint: ((a IS NOT NULL) AND (b IS NOT NULL) AND (a >= 'c'::text) AND (a < 'common'::text)) + +\d+ mcrparted4_common_lt_0 + Table "public.mcrparted4_common_lt_0" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition of: mcrparted FOR VALUES FROM ('common', MINVALUE) TO ('common', 0) +Partition constraint: ((a IS NOT NULL) AND (b IS NOT NULL) AND (a = 'common'::text) AND (b < 0)) + +\d+ mcrparted5_common_0_to_10 + Table "public.mcrparted5_common_0_to_10" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition of: mcrparted FOR VALUES FROM ('common', 0) TO ('common', 10) +Partition constraint: ((a IS NOT NULL) AND (b IS NOT NULL) AND (a = 'common'::text) AND (b >= 0) AND (b < 10)) + +\d+ mcrparted6_common_ge_10 + Table "public.mcrparted6_common_ge_10" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition of: mcrparted FOR VALUES FROM ('common', 10) TO ('common', MAXVALUE) +Partition constraint: ((a IS NOT NULL) AND (b IS NOT NULL) AND (a = 'common'::text) AND (b >= 10)) + +\d+ mcrparted7_gt_common_lt_d + Table "public.mcrparted7_gt_common_lt_d" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition of: mcrparted FOR VALUES FROM ('common', MAXVALUE) TO ('d', MINVALUE) +Partition constraint: ((a IS NOT NULL) AND (b IS NOT NULL) AND (a > 'common'::text) AND (a < 'd'::text)) + +\d+ mcrparted8_ge_d + Table "public.mcrparted8_ge_d" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | integer | | | | plain | | +Partition of: mcrparted FOR VALUES FROM ('d', MINVALUE) TO (MAXVALUE, MAXVALUE) +Partition constraint: ((a IS NOT NULL) AND (b IS NOT NULL) AND (a >= 'd'::text)) + +insert into mcrparted values ('aaa', 0), ('b', 0), ('bz', 10), ('c', -10), + ('comm', -10), ('common', -10), ('common', 0), ('common', 10), + ('commons', 0), ('d', -10), ('e', 0); +select tableoid::regclass, * from mcrparted order by a, b; + tableoid | a | b +---------------------------+---------+----- + mcrparted1_lt_b | aaa | 0 + mcrparted2_b | b | 0 + mcrparted2_b | bz | 10 + mcrparted3_c_to_common | c | -10 + mcrparted3_c_to_common | comm | -10 + mcrparted4_common_lt_0 | common | -10 + mcrparted5_common_0_to_10 | common | 0 + mcrparted6_common_ge_10 | common | 10 + mcrparted7_gt_common_lt_d | commons | 0 + mcrparted8_ge_d | d | -10 + mcrparted8_ge_d | e | 0 +(11 rows) + +drop table mcrparted; +-- check that wholerow vars in the RETURNING list work with partitioned tables +create table returningwrtest (a int) partition by list (a); +create table returningwrtest1 partition of returningwrtest for values in (1); +insert into returningwrtest values (1) returning returningwrtest; + returningwrtest +----------------- + (1) +(1 row) + +-- check also that the wholerow vars in RETURNING list are converted as needed +alter table returningwrtest add b text; +create table returningwrtest2 (b text, c int, a int); +alter table returningwrtest2 drop c; +alter table returningwrtest attach partition returningwrtest2 for values in (2); +insert into returningwrtest values (2, 'foo') returning returningwrtest; + returningwrtest +----------------- + (2,foo) +(1 row) + +drop table returningwrtest; diff --git a/src/test/singlenode_regress/expected/insert_conflict.out b/src/test/singlenode_regress/expected/insert_conflict.out new file mode 100644 index 00000000000..058ea4ffa05 --- /dev/null +++ b/src/test/singlenode_regress/expected/insert_conflict.out @@ -0,0 +1,869 @@ +-- +-- insert...on conflict do unique index inference +-- +create table insertconflicttest(key int4, fruit text); +-- +-- Test unique index inference with operator class specifications and +-- named collations +-- +create unique index op_index_key on insertconflicttest(key, fruit text_pattern_ops); +create unique index collation_index_key on insertconflicttest(key, fruit collate "C"); +create unique index both_index_key on insertconflicttest(key, fruit collate "C" text_pattern_ops); +create unique index both_index_expr_key on insertconflicttest(key, lower(fruit) collate "C" text_pattern_ops); +-- fails +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key) do nothing; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit) do nothing; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +-- succeeds +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit) do nothing; + QUERY PLAN +------------------------------------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: op_index_key, collation_index_key, both_index_key + -> Result +(4 rows) + +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit, key, fruit, key) do nothing; + QUERY PLAN +------------------------------------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: op_index_key, collation_index_key, both_index_key + -> Result +(4 rows) + +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit), key, lower(fruit), key) do nothing; + QUERY PLAN +------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: both_index_expr_key + -> Result +(4 rows) + +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit) do update set fruit = excluded.fruit + where exists (select 1 from insertconflicttest ii where ii.key = excluded.key); + QUERY PLAN +------------------------------------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: op_index_key, collation_index_key, both_index_key + Conflict Filter: (SubPlan 1) + -> Result + SubPlan 1 + -> Index Only Scan using both_index_expr_key on insertconflicttest ii + Index Cond: (key = excluded.key) +(8 rows) + +-- Neither collation nor operator class specifications are required -- +-- supplying them merely *limits* matches to indexes with matching opclasses +-- used for relevant indexes +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit text_pattern_ops) do nothing; + QUERY PLAN +---------------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: op_index_key, both_index_key + -> Result +(4 rows) + +-- Okay, arbitrates using both index where text_pattern_ops opclass does and +-- does not appear. +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit collate "C") do nothing; + QUERY PLAN +----------------------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: collation_index_key, both_index_key + -> Result +(4 rows) + +-- Okay, but only accepts the single index where both opclass and collation are +-- specified +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit collate "C" text_pattern_ops, key) do nothing; + QUERY PLAN +-------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: both_index_key + -> Result +(4 rows) + +-- Okay, but only accepts the single index where both opclass and collation are +-- specified (plus expression variant) +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) collate "C", key, key) do nothing; + QUERY PLAN +------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: both_index_expr_key + -> Result +(4 rows) + +-- Attribute appears twice, while not all attributes/expressions on attributes +-- appearing within index definition match in terms of both opclass and +-- collation. +-- +-- Works because every attribute in inference specification needs to be +-- satisfied once or more by cataloged index attribute, and as always when an +-- attribute in the cataloged definition has a non-default opclass/collation, +-- it still satisfied some inference attribute lacking any particular +-- opclass/collation specification. +-- +-- The implementation is liberal in accepting inference specifications on the +-- assumption that multiple inferred unique indexes will prevent problematic +-- cases. It rolls with unique indexes where attributes redundantly appear +-- multiple times, too (which is not tested here). +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit, key, fruit text_pattern_ops, key) do nothing; + QUERY PLAN +---------------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: op_index_key, both_index_key + -> Result +(4 rows) + +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) collate "C" text_pattern_ops, key, key) do nothing; + QUERY PLAN +------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: both_index_expr_key + -> Result +(4 rows) + +drop index op_index_key; +drop index collation_index_key; +drop index both_index_key; +drop index both_index_expr_key; +-- +-- Make sure that cross matching of attribute opclass/collation does not occur +-- +create unique index cross_match on insertconflicttest(lower(fruit) collate "C", upper(fruit) text_pattern_ops); +-- fails: +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) text_pattern_ops, upper(fruit) collate "C") do nothing; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +-- works: +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) collate "C", upper(fruit) text_pattern_ops) do nothing; + QUERY PLAN +----------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: cross_match + -> Result +(4 rows) + +drop index cross_match; +-- +-- Single key tests +-- +create unique index key_index on insertconflicttest(key); +-- +-- Explain tests +-- +explain (costs off) insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit; + QUERY PLAN +--------------------------------------- + Insert on insertconflicttest + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: key_index + -> Result +(4 rows) + +-- Should display qual actually attributable to internal sequential scan: +explain (costs off) insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit where insertconflicttest.fruit != 'Cawesh'; + QUERY PLAN +----------------------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: key_index + Conflict Filter: (insertconflicttest.fruit <> 'Cawesh'::text) + -> Result +(5 rows) + +-- With EXCLUDED.* expression in scan node: +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key) do update set fruit = excluded.fruit where excluded.fruit != 'Elderberry'; + QUERY PLAN +----------------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: key_index + Conflict Filter: (excluded.fruit <> 'Elderberry'::text) + -> Result +(5 rows) + +-- Does the same, but JSON format shows "Conflict Arbiter Index" as JSON array: +explain (costs off, format json) insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit where insertconflicttest.fruit != 'Lime' returning *; + QUERY PLAN +------------------------------------------------------------------------ + [ + + { + + "Plan": { + + "Node Type": "ModifyTable", + + "Operation": "Insert", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "insertconflicttest", + + "Alias": "insertconflicttest", + + "Conflict Resolution": "UPDATE", + + "Conflict Arbiter Indexes": ["key_index"], + + "Conflict Filter": "(insertconflicttest.fruit <> 'Lime'::text)",+ + "Plans": [ + + { + + "Node Type": "Result", + + "Parent Relationship": "Outer", + + "Parallel Aware": false, + + "Async Capable": false + + } + + ] + + }, + + "Settings": { + + "Optimizer": "Postgres query optimizer" + + } + + } + + ] +(1 row) + +-- Fails (no unique index inference specification, required for do update variant): +insert into insertconflicttest values (1, 'Apple') on conflict do update set fruit = excluded.fruit; +ERROR: ON CONFLICT DO UPDATE requires inference specification or constraint name +LINE 1: ...nsert into insertconflicttest values (1, 'Apple') on conflic... + ^ +HINT: For example, ON CONFLICT (column_name). +-- inference succeeds: +insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (2, 'Orange') on conflict (key, key, key) do update set fruit = excluded.fruit; +-- Succeed, since multi-assignment does not involve subquery: +insert into insertconflicttest +values (1, 'Apple'), (2, 'Orange') +on conflict (key) do update set (fruit, key) = (excluded.fruit, excluded.key); +-- Give good diagnostic message when EXCLUDED.* spuriously referenced from +-- RETURNING: +insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruit RETURNING excluded.fruit; +ERROR: invalid reference to FROM-clause entry for table "excluded" +LINE 1: ...y) do update set fruit = excluded.fruit RETURNING excluded.f... + ^ +HINT: There is an entry for table "excluded", but it cannot be referenced from this part of the query. +-- Only suggest
.* column when inference element misspelled: +insert into insertconflicttest values (1, 'Apple') on conflict (keyy) do update set fruit = excluded.fruit; +ERROR: column "keyy" does not exist +LINE 1: ...nsertconflicttest values (1, 'Apple') on conflict (keyy) do ... + ^ +HINT: Perhaps you meant to reference the column "insertconflicttest.key" or the column "excluded.key". +-- Have useful HINT for EXCLUDED.* RTE within UPDATE: +insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruitt; +ERROR: column excluded.fruitt does not exist +LINE 1: ... 'Apple') on conflict (key) do update set fruit = excluded.f... + ^ +HINT: Perhaps you meant to reference the column "excluded.fruit". +-- inference fails: +insert into insertconflicttest values (3, 'Kiwi') on conflict (key, fruit) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (4, 'Mango') on conflict (fruit, key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (5, 'Lemon') on conflict (fruit) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (6, 'Passionfruit') on conflict (lower(fruit)) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +-- Check the target relation can be aliased +insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = excluded.fruit; -- ok, no reference to target table +insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = ict.fruit; -- ok, alias +insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = insertconflicttest.fruit; -- error, references aliased away name +ERROR: invalid reference to FROM-clause entry for table "insertconflicttest" +LINE 1: ...onfruit') on conflict (key) do update set fruit = insertconf... + ^ +HINT: Perhaps you meant to reference the table alias "ict". +drop index key_index; +-- +-- Composite key tests +-- +create unique index comp_key_index on insertconflicttest(key, fruit); +-- inference succeeds: +insert into insertconflicttest values (7, 'Raspberry') on conflict (key, fruit) do update set fruit = excluded.fruit; +insert into insertconflicttest values (8, 'Lime') on conflict (fruit, key) do update set fruit = excluded.fruit; +-- inference fails: +insert into insertconflicttest values (9, 'Banana') on conflict (key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (10, 'Blueberry') on conflict (key, key, key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (11, 'Cherry') on conflict (key, lower(fruit)) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (12, 'Date') on conflict (lower(fruit), key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +drop index comp_key_index; +-- +-- Partial index tests, no inference predicate specified +-- +create unique index part_comp_key_index on insertconflicttest(key, fruit) where key < 5; +create unique index expr_part_comp_key_index on insertconflicttest(key, lower(fruit)) where key < 5; +-- inference fails: +insert into insertconflicttest values (13, 'Grape') on conflict (key, fruit) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (14, 'Raisin') on conflict (fruit, key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (15, 'Cranberry') on conflict (key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (16, 'Melon') on conflict (key, key, key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (17, 'Mulberry') on conflict (key, lower(fruit)) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (18, 'Pineapple') on conflict (lower(fruit), key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +drop index part_comp_key_index; +drop index expr_part_comp_key_index; +-- +-- Expression index tests +-- +create unique index expr_key_index on insertconflicttest(lower(fruit)); +-- inference succeeds: +insert into insertconflicttest values (20, 'Quince') on conflict (lower(fruit)) do update set fruit = excluded.fruit; +insert into insertconflicttest values (21, 'Pomegranate') on conflict (lower(fruit), lower(fruit)) do update set fruit = excluded.fruit; +-- inference fails: +insert into insertconflicttest values (22, 'Apricot') on conflict (upper(fruit)) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (23, 'Blackberry') on conflict (fruit) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +drop index expr_key_index; +-- +-- Expression index tests (with regular column) +-- +create unique index expr_comp_key_index on insertconflicttest(key, lower(fruit)); +create unique index tricky_expr_comp_key_index on insertconflicttest(key, lower(fruit), upper(fruit)); +-- inference succeeds: +insert into insertconflicttest values (24, 'Plum') on conflict (key, lower(fruit)) do update set fruit = excluded.fruit; +insert into insertconflicttest values (25, 'Peach') on conflict (lower(fruit), key) do update set fruit = excluded.fruit; +-- Should not infer "tricky_expr_comp_key_index" index: +explain (costs off) insert into insertconflicttest values (26, 'Fig') on conflict (lower(fruit), key, lower(fruit), key) do update set fruit = excluded.fruit; + QUERY PLAN +------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: expr_comp_key_index + -> Result +(4 rows) + +-- inference fails: +insert into insertconflicttest values (27, 'Prune') on conflict (key, upper(fruit)) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (28, 'Redcurrant') on conflict (fruit, key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (29, 'Nectarine') on conflict (key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +drop index expr_comp_key_index; +drop index tricky_expr_comp_key_index; +-- +-- Non-spurious duplicate violation tests +-- +create unique index key_index on insertconflicttest(key); +create unique index fruit_index on insertconflicttest(fruit); +-- succeeds, since UPDATE happens to update "fruit" to existing value: +insert into insertconflicttest values (26, 'Fig') on conflict (key) do update set fruit = excluded.fruit; +-- fails, since UPDATE is to row with key value 26, and we're updating "fruit" +-- to a value that happens to exist in another row ('peach'): +insert into insertconflicttest values (26, 'Peach') on conflict (key) do update set fruit = excluded.fruit; +ERROR: duplicate key value violates unique constraint "fruit_index" +DETAIL: Key (fruit)=(Peach) already exists. +-- succeeds, since "key" isn't repeated/referenced in UPDATE, and "fruit" +-- arbitrates that statement updates existing "Fig" row: +insert into insertconflicttest values (25, 'Fig') on conflict (fruit) do update set fruit = excluded.fruit; +drop index key_index; +drop index fruit_index; +-- +-- Test partial unique index inference +-- +create unique index partial_key_index on insertconflicttest(key) where fruit like '%berry'; +-- Succeeds +insert into insertconflicttest values (23, 'Blackberry') on conflict (key) where fruit like '%berry' do update set fruit = excluded.fruit; +insert into insertconflicttest as t values (23, 'Blackberry') on conflict (key) where fruit like '%berry' and t.fruit = 'inconsequential' do nothing; +-- fails +insert into insertconflicttest values (23, 'Blackberry') on conflict (key) do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (23, 'Blackberry') on conflict (key) where fruit like '%berry' or fruit = 'consequential' do nothing; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +insert into insertconflicttest values (23, 'Blackberry') on conflict (fruit) where fruit like '%berry' do update set fruit = excluded.fruit; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +drop index partial_key_index; +-- +-- Test that wholerow references to ON CONFLICT's EXCLUDED work +-- +create unique index plain on insertconflicttest(key); +-- Succeeds, updates existing row: +insert into insertconflicttest as i values (23, 'Jackfruit') on conflict (key) do update set fruit = excluded.fruit + where i.* != excluded.* returning *; + key | fruit +-----+----------- + 23 | Jackfruit +(1 row) + +-- No update this time, though: +insert into insertconflicttest as i values (23, 'Jackfruit') on conflict (key) do update set fruit = excluded.fruit + where i.* != excluded.* returning *; + key | fruit +-----+------- +(0 rows) + +-- Predicate changed to require match rather than non-match, so updates once more: +insert into insertconflicttest as i values (23, 'Jackfruit') on conflict (key) do update set fruit = excluded.fruit + where i.* = excluded.* returning *; + key | fruit +-----+----------- + 23 | Jackfruit +(1 row) + +-- Assign: +insert into insertconflicttest as i values (23, 'Avocado') on conflict (key) do update set fruit = excluded.*::text + returning *; + key | fruit +-----+-------------- + 23 | (23,Avocado) +(1 row) + +-- deparse whole row var in WHERE and SET clauses: +explain (costs off) insert into insertconflicttest as i values (23, 'Avocado') on conflict (key) do update set fruit = excluded.fruit where excluded.* is null; + QUERY PLAN +----------------------------------------- + Insert on insertconflicttest i + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: plain + Conflict Filter: (excluded.* IS NULL) + -> Result +(5 rows) + +explain (costs off) insert into insertconflicttest as i values (23, 'Avocado') on conflict (key) do update set fruit = excluded.*::text; + QUERY PLAN +----------------------------------- + Insert on insertconflicttest i + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: plain + -> Result +(4 rows) + +drop index plain; +-- Cleanup +drop table insertconflicttest; +-- +-- Verify that EXCLUDED does not allow system column references. These +-- do not make sense because EXCLUDED isn't an already stored tuple +-- (and thus doesn't have a ctid etc). +-- +create table syscolconflicttest(key int4, data text); +insert into syscolconflicttest values (1); +insert into syscolconflicttest values (1) on conflict (key) do update set data = excluded.ctid::text; +ERROR: column excluded.ctid does not exist +LINE 1: ...values (1) on conflict (key) do update set data = excluded.c... + ^ +drop table syscolconflicttest; +-- +-- Previous tests all managed to not test any expressions requiring +-- planner preprocessing ... +-- +create table insertconflict (a bigint, b bigint); +create unique index insertconflicti1 on insertconflict(coalesce(a, 0)); +create unique index insertconflicti2 on insertconflict(b) + where coalesce(a, 1) > 0; +insert into insertconflict values (1, 2) +on conflict (coalesce(a, 0)) do nothing; +insert into insertconflict values (1, 2) +on conflict (b) where coalesce(a, 1) > 0 do nothing; +insert into insertconflict values (1, 2) +on conflict (b) where coalesce(a, 1) > 1 do nothing; +drop table insertconflict; +-- +-- test insertion through view +-- +create table insertconflict (f1 int primary key, f2 text); +create view insertconflictv as + select * from insertconflict with cascaded check option; +insert into insertconflictv values (1,'foo') + on conflict (f1) do update set f2 = excluded.f2; +select * from insertconflict; + f1 | f2 +----+----- + 1 | foo +(1 row) + +insert into insertconflictv values (1,'bar') + on conflict (f1) do update set f2 = excluded.f2; +select * from insertconflict; + f1 | f2 +----+----- + 1 | bar +(1 row) + +drop view insertconflictv; +drop table insertconflict; +-- ****************************************************************** +-- * * +-- * Test inheritance (example taken from tutorial) * +-- * * +-- ****************************************************************** +create table cities ( + name text, + population float8, + altitude int -- (in ft) +); +create table capitals ( + state char(2) +) inherits (cities); +-- Create unique indexes. Due to a general limitation of inheritance, +-- uniqueness is only enforced per-relation. Unique index inference +-- specification will do the right thing, though. +create unique index cities_names_unique on cities (name); +create unique index capitals_names_unique on capitals (name); +-- prepopulate the tables. +insert into cities values ('San Francisco', 7.24E+5, 63); +insert into cities values ('Las Vegas', 2.583E+5, 2174); +insert into cities values ('Mariposa', 1200, 1953); +insert into capitals values ('Sacramento', 3.694E+5, 30, 'CA'); +insert into capitals values ('Madison', 1.913E+5, 845, 'WI'); +-- Tests proper for inheritance: +select * from capitals; + name | population | altitude | state +------------+------------+----------+------- + Sacramento | 369400 | 30 | CA + Madison | 191300 | 845 | WI +(2 rows) + +-- Succeeds: +insert into cities values ('Las Vegas', 2.583E+5, 2174) on conflict do nothing; +insert into capitals values ('Sacramento', 4664.E+5, 30, 'CA') on conflict (name) do update set population = excluded.population; +-- Wrong "Sacramento", so do nothing: +insert into capitals values ('Sacramento', 50, 2267, 'NE') on conflict (name) do nothing; +select * from capitals; + name | population | altitude | state +------------+------------+----------+------- + Madison | 191300 | 845 | WI + Sacramento | 466400000 | 30 | CA +(2 rows) + +insert into cities values ('Las Vegas', 5.83E+5, 2001) on conflict (name) do update set population = excluded.population, altitude = excluded.altitude; +select tableoid::regclass, * from cities; + tableoid | name | population | altitude +----------+---------------+------------+---------- + cities | San Francisco | 724000 | 63 + cities | Mariposa | 1200 | 1953 + cities | Las Vegas | 583000 | 2001 + capitals | Madison | 191300 | 845 + capitals | Sacramento | 466400000 | 30 +(5 rows) + +insert into capitals values ('Las Vegas', 5.83E+5, 2222, 'NV') on conflict (name) do update set population = excluded.population; +-- Capitals will contain new capital, Las Vegas: +select * from capitals; + name | population | altitude | state +------------+------------+----------+------- + Madison | 191300 | 845 | WI + Sacramento | 466400000 | 30 | CA + Las Vegas | 583000 | 2222 | NV +(3 rows) + +-- Cities contains two instances of "Las Vegas", since unique constraints don't +-- work across inheritance: +select tableoid::regclass, * from cities; + tableoid | name | population | altitude +----------+---------------+------------+---------- + cities | San Francisco | 724000 | 63 + cities | Mariposa | 1200 | 1953 + cities | Las Vegas | 583000 | 2001 + capitals | Madison | 191300 | 845 + capitals | Sacramento | 466400000 | 30 + capitals | Las Vegas | 583000 | 2222 +(6 rows) + +-- This only affects "cities" version of "Las Vegas": +insert into cities values ('Las Vegas', 5.86E+5, 2223) on conflict (name) do update set population = excluded.population, altitude = excluded.altitude; +select tableoid::regclass, * from cities; + tableoid | name | population | altitude +----------+---------------+------------+---------- + cities | San Francisco | 724000 | 63 + cities | Mariposa | 1200 | 1953 + cities | Las Vegas | 586000 | 2223 + capitals | Madison | 191300 | 845 + capitals | Sacramento | 466400000 | 30 + capitals | Las Vegas | 583000 | 2222 +(6 rows) + +-- clean up +drop table capitals; +drop table cities; +-- Make sure a table named excluded is handled properly +create table excluded(key int primary key, data text); +insert into excluded values(1, '1'); +-- error, ambiguous +insert into excluded values(1, '2') on conflict (key) do update set data = excluded.data RETURNING *; +ERROR: table reference "excluded" is ambiguous +LINE 1: ...es(1, '2') on conflict (key) do update set data = excluded.d... + ^ +-- ok, aliased +insert into excluded AS target values(1, '2') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 1 | 2 +(1 row) + +-- ok, aliased +insert into excluded AS target values(1, '2') on conflict (key) do update set data = target.data RETURNING *; + key | data +-----+------ + 1 | 2 +(1 row) + +-- make sure excluded isn't a problem in returning clause +insert into excluded values(1, '2') on conflict (key) do update set data = 3 RETURNING excluded.*; + key | data +-----+------ + 1 | 3 +(1 row) + +-- clean up +drop table excluded; +-- check that references to columns after dropped columns are handled correctly +create table dropcol(key int primary key, drop1 int, keep1 text, drop2 numeric, keep2 float); +insert into dropcol(key, drop1, keep1, drop2, keep2) values(1, 1, '1', '1', 1); +-- set using excluded +insert into dropcol(key, drop1, keep1, drop2, keep2) values(1, 2, '2', '2', 2) on conflict(key) + do update set drop1 = excluded.drop1, keep1 = excluded.keep1, drop2 = excluded.drop2, keep2 = excluded.keep2 + where excluded.drop1 is not null and excluded.keep1 is not null and excluded.drop2 is not null and excluded.keep2 is not null + and dropcol.drop1 is not null and dropcol.keep1 is not null and dropcol.drop2 is not null and dropcol.keep2 is not null + returning *; + key | drop1 | keep1 | drop2 | keep2 +-----+-------+-------+-------+------- + 1 | 2 | 2 | 2 | 2 +(1 row) + +; +-- set using existing table +insert into dropcol(key, drop1, keep1, drop2, keep2) values(1, 3, '3', '3', 3) on conflict(key) + do update set drop1 = dropcol.drop1, keep1 = dropcol.keep1, drop2 = dropcol.drop2, keep2 = dropcol.keep2 + returning *; + key | drop1 | keep1 | drop2 | keep2 +-----+-------+-------+-------+------- + 1 | 2 | 2 | 2 | 2 +(1 row) + +; +alter table dropcol drop column drop1, drop column drop2; +-- set using excluded +insert into dropcol(key, keep1, keep2) values(1, '4', 4) on conflict(key) + do update set keep1 = excluded.keep1, keep2 = excluded.keep2 + where excluded.keep1 is not null and excluded.keep2 is not null + and dropcol.keep1 is not null and dropcol.keep2 is not null + returning *; + key | keep1 | keep2 +-----+-------+------- + 1 | 4 | 4 +(1 row) + +; +-- set using existing table +insert into dropcol(key, keep1, keep2) values(1, '5', 5) on conflict(key) + do update set keep1 = dropcol.keep1, keep2 = dropcol.keep2 + returning *; + key | keep1 | keep2 +-----+-------+------- + 1 | 4 | 4 +(1 row) + +; +DROP TABLE dropcol; +-- check handling of regular btree constraint along with gist constraint +create table twoconstraints (f1 int unique, f2 box, + exclude using gist(f2 with &&)); +insert into twoconstraints values(1, '((0,0),(1,1))'); +insert into twoconstraints values(1, '((2,2),(3,3))'); -- fail on f1 +ERROR: duplicate key value violates unique constraint "twoconstraints_f1_key" +DETAIL: Key (f1)=(1) already exists. +insert into twoconstraints values(2, '((0,0),(1,2))'); -- fail on f2 +ERROR: conflicting key value violates exclusion constraint "twoconstraints_f2_excl" +DETAIL: Key (f2)=((1,2),(0,0)) conflicts with existing key (f2)=((1,1),(0,0)). +insert into twoconstraints values(2, '((0,0),(1,2))') + on conflict on constraint twoconstraints_f1_key do nothing; -- fail on f2 +ERROR: conflicting key value violates exclusion constraint "twoconstraints_f2_excl" +DETAIL: Key (f2)=((1,2),(0,0)) conflicts with existing key (f2)=((1,1),(0,0)). +insert into twoconstraints values(2, '((0,0),(1,2))') + on conflict on constraint twoconstraints_f2_excl do nothing; -- do nothing +select * from twoconstraints; + f1 | f2 +----+------------- + 1 | (1,1),(0,0) +(1 row) + +drop table twoconstraints; +-- check handling of self-conflicts at various isolation levels +create table selfconflict (f1 int primary key, f2 int); +begin transaction isolation level read committed; +insert into selfconflict values (1,1), (1,2) on conflict do nothing; +commit; +begin transaction isolation level repeatable read; +insert into selfconflict values (2,1), (2,2) on conflict do nothing; +commit; +begin transaction isolation level serializable; +insert into selfconflict values (3,1), (3,2) on conflict do nothing; +commit; +begin transaction isolation level read committed; +insert into selfconflict values (4,1), (4,2) on conflict(f1) do update set f2 = 0; +ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time +HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained values. +commit; +begin transaction isolation level repeatable read; +insert into selfconflict values (5,1), (5,2) on conflict(f1) do update set f2 = 0; +ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time +HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained values. +commit; +begin transaction isolation level serializable; +insert into selfconflict values (6,1), (6,2) on conflict(f1) do update set f2 = 0; +ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time +HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained values. +commit; +select * from selfconflict; + f1 | f2 +----+---- + 1 | 1 + 2 | 1 + 3 | 1 +(3 rows) + +drop table selfconflict; +-- check ON CONFLICT handling with partitioned tables +create table parted_conflict_test (a int unique, b char) partition by list (a); +create table parted_conflict_test_1 partition of parted_conflict_test (b unique) for values in (1, 2); +-- no indexes required here +insert into parted_conflict_test values (1, 'a') on conflict do nothing; +-- index on a required, which does exist in parent +insert into parted_conflict_test values (1, 'a') on conflict (a) do nothing; +insert into parted_conflict_test values (1, 'a') on conflict (a) do update set b = excluded.b; +-- targeting partition directly will work +insert into parted_conflict_test_1 values (1, 'a') on conflict (a) do nothing; +insert into parted_conflict_test_1 values (1, 'b') on conflict (a) do update set b = excluded.b; +-- index on b required, which doesn't exist in parent +insert into parted_conflict_test values (2, 'b') on conflict (b) do update set a = excluded.a; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +-- targeting partition directly will work +insert into parted_conflict_test_1 values (2, 'b') on conflict (b) do update set a = excluded.a; +-- should see (2, 'b') +select * from parted_conflict_test order by a; + a | b +---+--- + 2 | b +(1 row) + +-- now check that DO UPDATE works correctly for target partition with +-- different attribute numbers +create table parted_conflict_test_2 (b char, a int unique); +alter table parted_conflict_test attach partition parted_conflict_test_2 for values in (3); +truncate parted_conflict_test; +insert into parted_conflict_test values (3, 'a') on conflict (a) do update set b = excluded.b; +insert into parted_conflict_test values (3, 'b') on conflict (a) do update set b = excluded.b; +-- should see (3, 'b') +select * from parted_conflict_test order by a; + a | b +---+--- + 3 | b +(1 row) + +-- case where parent will have a dropped column, but the partition won't +alter table parted_conflict_test drop b, add b char; +create table parted_conflict_test_3 partition of parted_conflict_test for values in (4); +truncate parted_conflict_test; +insert into parted_conflict_test (a, b) values (4, 'a') on conflict (a) do update set b = excluded.b; +insert into parted_conflict_test (a, b) values (4, 'b') on conflict (a) do update set b = excluded.b where parted_conflict_test.b = 'a'; +-- should see (4, 'b') +select * from parted_conflict_test order by a; + a | b +---+--- + 4 | b +(1 row) + +-- case with multi-level partitioning +create table parted_conflict_test_4 partition of parted_conflict_test for values in (5) partition by list (a); +create table parted_conflict_test_4_1 partition of parted_conflict_test_4 for values in (5); +truncate parted_conflict_test; +insert into parted_conflict_test (a, b) values (5, 'a') on conflict (a) do update set b = excluded.b; +insert into parted_conflict_test (a, b) values (5, 'b') on conflict (a) do update set b = excluded.b where parted_conflict_test.b = 'a'; +-- should see (5, 'b') +select * from parted_conflict_test order by a; + a | b +---+--- + 5 | b +(1 row) + +-- test with multiple rows +truncate parted_conflict_test; +insert into parted_conflict_test (a, b) values (1, 'a'), (2, 'a'), (4, 'a') on conflict (a) do update set b = excluded.b where excluded.b = 'b'; +insert into parted_conflict_test (a, b) values (1, 'b'), (2, 'c'), (4, 'b') on conflict (a) do update set b = excluded.b where excluded.b = 'b'; +-- should see (1, 'b'), (2, 'a'), (4, 'b') +select * from parted_conflict_test order by a; + a | b +---+--- + 1 | b + 2 | a + 4 | b +(3 rows) + +drop table parted_conflict_test; +-- test behavior of inserting a conflicting tuple into an intermediate +-- partitioning level +create table parted_conflict (a int primary key, b text) partition by range (a); +create table parted_conflict_1 partition of parted_conflict for values from (0) to (1000) partition by range (a); +create table parted_conflict_1_1 partition of parted_conflict_1 for values from (0) to (500); +insert into parted_conflict values (40, 'forty'); +insert into parted_conflict_1 values (40, 'cuarenta') + on conflict (a) do update set b = excluded.b; +drop table parted_conflict; +-- same thing, but this time try to use an index that's created not in the +-- partition +create table parted_conflict (a int, b text) partition by range (a); +create table parted_conflict_1 partition of parted_conflict for values from (0) to (1000) partition by range (a); +create table parted_conflict_1_1 partition of parted_conflict_1 for values from (0) to (500); +create unique index on only parted_conflict_1 (a); +create unique index on only parted_conflict (a); +alter index parted_conflict_a_idx attach partition parted_conflict_1_a_idx; +insert into parted_conflict values (40, 'forty'); +insert into parted_conflict_1 values (40, 'cuarenta') + on conflict (a) do update set b = excluded.b; +ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +drop table parted_conflict; +-- test whole-row Vars in ON CONFLICT expressions +create table parted_conflict (a int, b text, c int) partition by range (a); +create table parted_conflict_1 (drp text, c int, a int, b text); +alter table parted_conflict_1 drop column drp; +create unique index on parted_conflict (a, b); +alter table parted_conflict attach partition parted_conflict_1 for values from (0) to (1000); +truncate parted_conflict; +insert into parted_conflict values (50, 'cincuenta', 1); +insert into parted_conflict values (50, 'cincuenta', 2) + on conflict (a, b) do update set (a, b, c) = row(excluded.*) + where parted_conflict = (50, text 'cincuenta', 1) and + excluded = (50, text 'cincuenta', 2); +-- should see (50, 'cincuenta', 2) +select * from parted_conflict order by a; + a | b | c +----+-----------+--- + 50 | cincuenta | 2 +(1 row) + +-- test with statement level triggers +create or replace function parted_conflict_update_func() returns trigger as $$ +declare + r record; +begin + for r in select * from inserted loop + raise notice 'a = %, b = %, c = %', r.a, r.b, r.c; + end loop; + return new; +end; +$$ language plpgsql; +create trigger parted_conflict_update + after update on parted_conflict + referencing new table as inserted + for each statement + execute procedure parted_conflict_update_func(); +ERROR: Triggers for statements are not yet supported +truncate parted_conflict; +insert into parted_conflict values (0, 'cero', 1); +insert into parted_conflict values(0, 'cero', 1) + on conflict (a,b) do update set c = parted_conflict.c + 1; +drop table parted_conflict; +drop function parted_conflict_update_func(); diff --git a/src/test/singlenode_regress/expected/int2.out b/src/test/singlenode_regress/expected/int2.out new file mode 100644 index 00000000000..8a64df725c6 --- /dev/null +++ b/src/test/singlenode_regress/expected/int2.out @@ -0,0 +1,312 @@ +-- +-- INT2 +-- +CREATE TABLE INT2_TBL(f1 int2); +INSERT INTO INT2_TBL(f1) VALUES ('0 '); +INSERT INTO INT2_TBL(f1) VALUES (' 1234 '); +INSERT INTO INT2_TBL(f1) VALUES (' -1234'); +INSERT INTO INT2_TBL(f1) VALUES ('34.5'); +ERROR: invalid input syntax for type smallint: "34.5" +LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('34.5'); + ^ +-- largest and smallest values +INSERT INTO INT2_TBL(f1) VALUES ('32767'); +INSERT INTO INT2_TBL(f1) VALUES ('-32767'); +-- bad input values -- should give errors +INSERT INTO INT2_TBL(f1) VALUES ('100000'); +ERROR: value "100000" is out of range for type smallint +LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('100000'); + ^ +INSERT INTO INT2_TBL(f1) VALUES ('asdf'); +ERROR: invalid input syntax for type smallint: "asdf" +LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('asdf'); + ^ +INSERT INTO INT2_TBL(f1) VALUES (' '); +ERROR: invalid input syntax for type smallint: " " +LINE 1: INSERT INTO INT2_TBL(f1) VALUES (' '); + ^ +INSERT INTO INT2_TBL(f1) VALUES ('- 1234'); +ERROR: invalid input syntax for type smallint: "- 1234" +LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('- 1234'); + ^ +INSERT INTO INT2_TBL(f1) VALUES ('4 444'); +ERROR: invalid input syntax for type smallint: "4 444" +LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('4 444'); + ^ +INSERT INTO INT2_TBL(f1) VALUES ('123 dt'); +ERROR: invalid input syntax for type smallint: "123 dt" +LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('123 dt'); + ^ +INSERT INTO INT2_TBL(f1) VALUES (''); +ERROR: invalid input syntax for type smallint: "" +LINE 1: INSERT INTO INT2_TBL(f1) VALUES (''); + ^ +SELECT * FROM INT2_TBL; + f1 +-------- + 0 + 1234 + -1234 + 32767 + -32767 +(5 rows) + +SELECT * FROM INT2_TBL AS f(a, b); +ERROR: table "f" has 1 columns available but 2 columns specified +SELECT * FROM (TABLE int2_tbl) AS s (a, b); +ERROR: table "s" has 1 columns available but 2 columns specified +SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int2 '0'; + f1 +-------- + 1234 + -1234 + 32767 + -32767 +(4 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int4 '0'; + f1 +-------- + 1234 + -1234 + 32767 + -32767 +(4 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 = int2 '0'; + f1 +---- + 0 +(1 row) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 = int4 '0'; + f1 +---- + 0 +(1 row) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 < int2 '0'; + f1 +-------- + -1234 + -32767 +(2 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 < int4 '0'; + f1 +-------- + -1234 + -32767 +(2 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 <= int2 '0'; + f1 +-------- + 0 + -1234 + -32767 +(3 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 <= int4 '0'; + f1 +-------- + 0 + -1234 + -32767 +(3 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 > int2 '0'; + f1 +------- + 1234 + 32767 +(2 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 > int4 '0'; + f1 +------- + 1234 + 32767 +(2 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 >= int2 '0'; + f1 +------- + 0 + 1234 + 32767 +(3 rows) + +SELECT i.* FROM INT2_TBL i WHERE i.f1 >= int4 '0'; + f1 +------- + 0 + 1234 + 32767 +(3 rows) + +-- positive odds +SELECT i.* FROM INT2_TBL i WHERE (i.f1 % int2 '2') = int2 '1'; + f1 +------- + 32767 +(1 row) + +-- any evens +SELECT i.* FROM INT2_TBL i WHERE (i.f1 % int4 '2') = int2 '0'; + f1 +------- + 0 + 1234 + -1234 +(3 rows) + +SELECT i.f1, i.f1 * int2 '2' AS x FROM INT2_TBL i; +ERROR: smallint out of range +SELECT i.f1, i.f1 * int2 '2' AS x FROM INT2_TBL i +WHERE abs(f1) < 16384; + f1 | x +-------+------- + 0 | 0 + 1234 | 2468 + -1234 | -2468 +(3 rows) + +SELECT i.f1, i.f1 * int4 '2' AS x FROM INT2_TBL i; + f1 | x +--------+-------- + 0 | 0 + 1234 | 2468 + -1234 | -2468 + 32767 | 65534 + -32767 | -65534 +(5 rows) + +SELECT i.f1, i.f1 + int2 '2' AS x FROM INT2_TBL i; +ERROR: smallint out of range +SELECT i.f1, i.f1 + int2 '2' AS x FROM INT2_TBL i +WHERE f1 < 32766; + f1 | x +--------+-------- + 0 | 2 + 1234 | 1236 + -1234 | -1232 + -32767 | -32765 +(4 rows) + +SELECT i.f1, i.f1 + int4 '2' AS x FROM INT2_TBL i; + f1 | x +--------+-------- + 0 | 2 + 1234 | 1236 + -1234 | -1232 + 32767 | 32769 + -32767 | -32765 +(5 rows) + +SELECT i.f1, i.f1 - int2 '2' AS x FROM INT2_TBL i; +ERROR: smallint out of range +SELECT i.f1, i.f1 - int2 '2' AS x FROM INT2_TBL i +WHERE f1 > -32767; + f1 | x +-------+------- + 0 | -2 + 1234 | 1232 + -1234 | -1236 + 32767 | 32765 +(4 rows) + +SELECT i.f1, i.f1 - int4 '2' AS x FROM INT2_TBL i; + f1 | x +--------+-------- + 0 | -2 + 1234 | 1232 + -1234 | -1236 + 32767 | 32765 + -32767 | -32769 +(5 rows) + +SELECT i.f1, i.f1 / int2 '2' AS x FROM INT2_TBL i; + f1 | x +--------+-------- + 0 | 0 + 1234 | 617 + -1234 | -617 + 32767 | 16383 + -32767 | -16383 +(5 rows) + +SELECT i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i; + f1 | x +--------+-------- + 0 | 0 + 1234 | 617 + -1234 | -617 + 32767 | 16383 + -32767 | -16383 +(5 rows) + +-- corner cases +SELECT (-1::int2<<15)::text; + text +-------- + -32768 +(1 row) + +SELECT ((-1::int2<<15)+1::int2)::text; + text +-------- + -32767 +(1 row) + +-- check sane handling of INT16_MIN overflow cases +SELECT (-32768)::int2 * (-1)::int2; +ERROR: smallint out of range +SELECT (-32768)::int2 / (-1)::int2; +ERROR: smallint out of range +SELECT (-32768)::int2 % (-1)::int2; + ?column? +---------- + 0 +(1 row) + +-- check rounding when casting from float +SELECT x, x::int2 AS int2_value +FROM (VALUES (-2.5::float8), + (-1.5::float8), + (-0.5::float8), + (0.0::float8), + (0.5::float8), + (1.5::float8), + (2.5::float8)) t(x); + x | int2_value +------+------------ + -2.5 | -2 + -1.5 | -2 + -0.5 | 0 + 0 | 0 + 0.5 | 0 + 1.5 | 2 + 2.5 | 2 +(7 rows) + +-- check rounding when casting from numeric +SELECT x, x::int2 AS int2_value +FROM (VALUES (-2.5::numeric), + (-1.5::numeric), + (-0.5::numeric), + (0.0::numeric), + (0.5::numeric), + (1.5::numeric), + (2.5::numeric)) t(x); + x | int2_value +------+------------ + -2.5 | -3 + -1.5 | -2 + -0.5 | -1 + 0.0 | 0 + 0.5 | 1 + 1.5 | 2 + 2.5 | 3 +(7 rows) + diff --git a/src/test/singlenode_regress/expected/int4.out b/src/test/singlenode_regress/expected/int4.out new file mode 100644 index 00000000000..9d20b3380fc --- /dev/null +++ b/src/test/singlenode_regress/expected/int4.out @@ -0,0 +1,439 @@ +-- +-- INT4 +-- +CREATE TABLE INT4_TBL(f1 int4); +INSERT INTO INT4_TBL(f1) VALUES (' 0 '); +INSERT INTO INT4_TBL(f1) VALUES ('123456 '); +INSERT INTO INT4_TBL(f1) VALUES (' -123456'); +INSERT INTO INT4_TBL(f1) VALUES ('34.5'); +ERROR: invalid input syntax for type integer: "34.5" +LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('34.5'); + ^ +-- largest and smallest values +INSERT INTO INT4_TBL(f1) VALUES ('2147483647'); +INSERT INTO INT4_TBL(f1) VALUES ('-2147483647'); +-- bad input values -- should give errors +INSERT INTO INT4_TBL(f1) VALUES ('1000000000000'); +ERROR: value "1000000000000" is out of range for type integer +LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('1000000000000'); + ^ +INSERT INTO INT4_TBL(f1) VALUES ('asdf'); +ERROR: invalid input syntax for type integer: "asdf" +LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('asdf'); + ^ +INSERT INTO INT4_TBL(f1) VALUES (' '); +ERROR: invalid input syntax for type integer: " " +LINE 1: INSERT INTO INT4_TBL(f1) VALUES (' '); + ^ +INSERT INTO INT4_TBL(f1) VALUES (' asdf '); +ERROR: invalid input syntax for type integer: " asdf " +LINE 1: INSERT INTO INT4_TBL(f1) VALUES (' asdf '); + ^ +INSERT INTO INT4_TBL(f1) VALUES ('- 1234'); +ERROR: invalid input syntax for type integer: "- 1234" +LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('- 1234'); + ^ +INSERT INTO INT4_TBL(f1) VALUES ('123 5'); +ERROR: invalid input syntax for type integer: "123 5" +LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('123 5'); + ^ +INSERT INTO INT4_TBL(f1) VALUES (''); +ERROR: invalid input syntax for type integer: "" +LINE 1: INSERT INTO INT4_TBL(f1) VALUES (''); + ^ +SELECT * FROM INT4_TBL; + f1 +------------- + 0 + 123456 + -123456 + 2147483647 + -2147483647 +(5 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0'; + f1 +------------- + 123456 + -123456 + 2147483647 + -2147483647 +(4 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0'; + f1 +------------- + 123456 + -123456 + 2147483647 + -2147483647 +(4 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 = int2 '0'; + f1 +---- + 0 +(1 row) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 = int4 '0'; + f1 +---- + 0 +(1 row) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 < int2 '0'; + f1 +------------- + -123456 + -2147483647 +(2 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 < int4 '0'; + f1 +------------- + -123456 + -2147483647 +(2 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0'; + f1 +------------- + 0 + -123456 + -2147483647 +(3 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0'; + f1 +------------- + 0 + -123456 + -2147483647 +(3 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 > int2 '0'; + f1 +------------ + 123456 + 2147483647 +(2 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 > int4 '0'; + f1 +------------ + 123456 + 2147483647 +(2 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0'; + f1 +------------ + 0 + 123456 + 2147483647 +(3 rows) + +SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0'; + f1 +------------ + 0 + 123456 + 2147483647 +(3 rows) + +-- positive odds +SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1'; + f1 +------------ + 2147483647 +(1 row) + +-- any evens +SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0'; + f1 +--------- + 0 + 123456 + -123456 +(3 rows) + +SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i; +ERROR: integer out of range +SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i +WHERE abs(f1) < 1073741824; + f1 | x +---------+--------- + 0 | 0 + 123456 | 246912 + -123456 | -246912 +(3 rows) + +SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i; +ERROR: integer out of range +SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i +WHERE abs(f1) < 1073741824; + f1 | x +---------+--------- + 0 | 0 + 123456 | 246912 + -123456 | -246912 +(3 rows) + +SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i; +ERROR: integer out of range +SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i +WHERE f1 < 2147483646; + f1 | x +-------------+------------- + 0 | 2 + 123456 | 123458 + -123456 | -123454 + -2147483647 | -2147483645 +(4 rows) + +SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i; +ERROR: integer out of range +SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i +WHERE f1 < 2147483646; + f1 | x +-------------+------------- + 0 | 2 + 123456 | 123458 + -123456 | -123454 + -2147483647 | -2147483645 +(4 rows) + +SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i; +ERROR: integer out of range +SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i +WHERE f1 > -2147483647; + f1 | x +------------+------------ + 0 | -2 + 123456 | 123454 + -123456 | -123458 + 2147483647 | 2147483645 +(4 rows) + +SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i; +ERROR: integer out of range +SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i +WHERE f1 > -2147483647; + f1 | x +------------+------------ + 0 | -2 + 123456 | 123454 + -123456 | -123458 + 2147483647 | 2147483645 +(4 rows) + +SELECT i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i; + f1 | x +-------------+------------- + 0 | 0 + 123456 | 61728 + -123456 | -61728 + 2147483647 | 1073741823 + -2147483647 | -1073741823 +(5 rows) + +SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i; + f1 | x +-------------+------------- + 0 | 0 + 123456 | 61728 + -123456 | -61728 + 2147483647 | 1073741823 + -2147483647 | -1073741823 +(5 rows) + +-- +-- more complex expressions +-- +-- variations on unary minus parsing +SELECT -2+3 AS one; + one +----- + 1 +(1 row) + +SELECT 4-2 AS two; + two +----- + 2 +(1 row) + +SELECT 2- -1 AS three; + three +------- + 3 +(1 row) + +SELECT 2 - -2 AS four; + four +------ + 4 +(1 row) + +SELECT int2 '2' * int2 '2' = int2 '16' / int2 '4' AS true; + true +------ + t +(1 row) + +SELECT int4 '2' * int2 '2' = int2 '16' / int4 '4' AS true; + true +------ + t +(1 row) + +SELECT int2 '2' * int4 '2' = int4 '16' / int2 '4' AS true; + true +------ + t +(1 row) + +SELECT int4 '1000' < int4 '999' AS false; + false +------- + f +(1 row) + +SELECT 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 AS ten; + ten +----- + 10 +(1 row) + +SELECT 2 + 2 / 2 AS three; + three +------- + 3 +(1 row) + +SELECT (2 + 2) / 2 AS two; + two +----- + 2 +(1 row) + +-- corner case +SELECT (-1::int4<<31)::text; + text +------------- + -2147483648 +(1 row) + +SELECT ((-1::int4<<31)+1)::text; + text +------------- + -2147483647 +(1 row) + +-- check sane handling of INT_MIN overflow cases +SELECT (-2147483648)::int4 * (-1)::int4; +ERROR: integer out of range +SELECT (-2147483648)::int4 / (-1)::int4; +ERROR: integer out of range +SELECT (-2147483648)::int4 % (-1)::int4; + ?column? +---------- + 0 +(1 row) + +SELECT (-2147483648)::int4 * (-1)::int2; +ERROR: integer out of range +SELECT (-2147483648)::int4 / (-1)::int2; +ERROR: integer out of range +SELECT (-2147483648)::int4 % (-1)::int2; + ?column? +---------- + 0 +(1 row) + +-- check rounding when casting from float +SELECT x, x::int4 AS int4_value +FROM (VALUES (-2.5::float8), + (-1.5::float8), + (-0.5::float8), + (0.0::float8), + (0.5::float8), + (1.5::float8), + (2.5::float8)) t(x); + x | int4_value +------+------------ + -2.5 | -2 + -1.5 | -2 + -0.5 | 0 + 0 | 0 + 0.5 | 0 + 1.5 | 2 + 2.5 | 2 +(7 rows) + +-- check rounding when casting from numeric +SELECT x, x::int4 AS int4_value +FROM (VALUES (-2.5::numeric), + (-1.5::numeric), + (-0.5::numeric), + (0.0::numeric), + (0.5::numeric), + (1.5::numeric), + (2.5::numeric)) t(x); + x | int4_value +------+------------ + -2.5 | -3 + -1.5 | -2 + -0.5 | -1 + 0.0 | 0 + 0.5 | 1 + 1.5 | 2 + 2.5 | 3 +(7 rows) + +-- test gcd() +SELECT a, b, gcd(a, b), gcd(a, -b), gcd(b, a), gcd(-b, a) +FROM (VALUES (0::int4, 0::int4), + (0::int4, 6410818::int4), + (61866666::int4, 6410818::int4), + (-61866666::int4, 6410818::int4), + ((-2147483648)::int4, 1::int4), + ((-2147483648)::int4, 2147483647::int4), + ((-2147483648)::int4, 1073741824::int4)) AS v(a, b); + a | b | gcd | gcd | gcd | gcd +-------------+------------+------------+------------+------------+------------ + 0 | 0 | 0 | 0 | 0 | 0 + 0 | 6410818 | 6410818 | 6410818 | 6410818 | 6410818 + 61866666 | 6410818 | 1466 | 1466 | 1466 | 1466 + -61866666 | 6410818 | 1466 | 1466 | 1466 | 1466 + -2147483648 | 1 | 1 | 1 | 1 | 1 + -2147483648 | 2147483647 | 1 | 1 | 1 | 1 + -2147483648 | 1073741824 | 1073741824 | 1073741824 | 1073741824 | 1073741824 +(7 rows) + +SELECT gcd((-2147483648)::int4, 0::int4); -- overflow +ERROR: integer out of range +SELECT gcd((-2147483648)::int4, (-2147483648)::int4); -- overflow +ERROR: integer out of range +-- test lcm() +SELECT a, b, lcm(a, b), lcm(a, -b), lcm(b, a), lcm(-b, a) +FROM (VALUES (0::int4, 0::int4), + (0::int4, 42::int4), + (42::int4, 42::int4), + (330::int4, 462::int4), + (-330::int4, 462::int4), + ((-2147483648)::int4, 0::int4)) AS v(a, b); + a | b | lcm | lcm | lcm | lcm +-------------+-----+------+------+------+------ + 0 | 0 | 0 | 0 | 0 | 0 + 0 | 42 | 0 | 0 | 0 | 0 + 42 | 42 | 42 | 42 | 42 | 42 + 330 | 462 | 2310 | 2310 | 2310 | 2310 + -330 | 462 | 2310 | 2310 | 2310 | 2310 + -2147483648 | 0 | 0 | 0 | 0 | 0 +(6 rows) + +SELECT lcm((-2147483648)::int4, 1::int4); -- overflow +ERROR: integer out of range +SELECT lcm(2147483647::int4, 2147483646::int4); -- overflow +ERROR: integer out of range diff --git a/src/test/singlenode_regress/expected/int8.out b/src/test/singlenode_regress/expected/int8.out new file mode 100644 index 00000000000..36540ec4563 --- /dev/null +++ b/src/test/singlenode_regress/expected/int8.out @@ -0,0 +1,934 @@ +-- +-- INT8 +-- Test int8 64-bit integers. +-- +CREATE TABLE INT8_TBL(q1 int8, q2 int8); +INSERT INTO INT8_TBL VALUES(' 123 ',' 456'); +INSERT INTO INT8_TBL VALUES('123 ','4567890123456789'); +INSERT INTO INT8_TBL VALUES('4567890123456789','123'); +INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789'); +INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789'); +-- bad inputs +INSERT INTO INT8_TBL(q1) VALUES (' '); +ERROR: invalid input syntax for type bigint: " " +LINE 1: INSERT INTO INT8_TBL(q1) VALUES (' '); + ^ +INSERT INTO INT8_TBL(q1) VALUES ('xxx'); +ERROR: invalid input syntax for type bigint: "xxx" +LINE 1: INSERT INTO INT8_TBL(q1) VALUES ('xxx'); + ^ +INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485'); +ERROR: value "3908203590239580293850293850329485" is out of range for type bigint +LINE 1: INSERT INTO INT8_TBL(q1) VALUES ('39082035902395802938502938... + ^ +INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934'); +ERROR: value "-1204982019841029840928340329840934" is out of range for type bigint +LINE 1: INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340... + ^ +INSERT INTO INT8_TBL(q1) VALUES ('- 123'); +ERROR: invalid input syntax for type bigint: "- 123" +LINE 1: INSERT INTO INT8_TBL(q1) VALUES ('- 123'); + ^ +INSERT INTO INT8_TBL(q1) VALUES (' 345 5'); +ERROR: invalid input syntax for type bigint: " 345 5" +LINE 1: INSERT INTO INT8_TBL(q1) VALUES (' 345 5'); + ^ +INSERT INTO INT8_TBL(q1) VALUES (''); +ERROR: invalid input syntax for type bigint: "" +LINE 1: INSERT INTO INT8_TBL(q1) VALUES (''); + ^ +SELECT * FROM INT8_TBL; + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +-- int8/int8 cmp +SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789; + q1 | q2 +------------------+------------------ + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(2 rows) + +SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789; + q1 | q2 +------------------+------------------- + 123 | 456 + 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 +(3 rows) + +SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789; + q1 | q2 +------------------+------------------- + 123 | 456 + 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 +(3 rows) + +SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789; + q1 | q2 +----+---- +(0 rows) + +SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789; + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789; + q1 | q2 +------------------+------------------ + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(2 rows) + +-- int8/int4 cmp +SELECT * FROM INT8_TBL WHERE q2 = 456; + q1 | q2 +-----+----- + 123 | 456 +(1 row) + +SELECT * FROM INT8_TBL WHERE q2 <> 456; + q1 | q2 +------------------+------------------- + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(4 rows) + +SELECT * FROM INT8_TBL WHERE q2 < 456; + q1 | q2 +------------------+------------------- + 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 +(2 rows) + +SELECT * FROM INT8_TBL WHERE q2 > 456; + q1 | q2 +------------------+------------------ + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(2 rows) + +SELECT * FROM INT8_TBL WHERE q2 <= 456; + q1 | q2 +------------------+------------------- + 123 | 456 + 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 +(3 rows) + +SELECT * FROM INT8_TBL WHERE q2 >= 456; + q1 | q2 +------------------+------------------ + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(3 rows) + +-- int4/int8 cmp +SELECT * FROM INT8_TBL WHERE 123 = q1; + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +SELECT * FROM INT8_TBL WHERE 123 <> q1; + q1 | q2 +------------------+------------------- + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(3 rows) + +SELECT * FROM INT8_TBL WHERE 123 < q1; + q1 | q2 +------------------+------------------- + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(3 rows) + +SELECT * FROM INT8_TBL WHERE 123 > q1; + q1 | q2 +----+---- +(0 rows) + +SELECT * FROM INT8_TBL WHERE 123 <= q1; + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +SELECT * FROM INT8_TBL WHERE 123 >= q1; + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +-- int8/int2 cmp +SELECT * FROM INT8_TBL WHERE q2 = '456'::int2; + q1 | q2 +-----+----- + 123 | 456 +(1 row) + +SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2; + q1 | q2 +------------------+------------------- + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(4 rows) + +SELECT * FROM INT8_TBL WHERE q2 < '456'::int2; + q1 | q2 +------------------+------------------- + 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 +(2 rows) + +SELECT * FROM INT8_TBL WHERE q2 > '456'::int2; + q1 | q2 +------------------+------------------ + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(2 rows) + +SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2; + q1 | q2 +------------------+------------------- + 123 | 456 + 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 +(3 rows) + +SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2; + q1 | q2 +------------------+------------------ + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(3 rows) + +-- int2/int8 cmp +SELECT * FROM INT8_TBL WHERE '123'::int2 = q1; + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1; + q1 | q2 +------------------+------------------- + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(3 rows) + +SELECT * FROM INT8_TBL WHERE '123'::int2 < q1; + q1 | q2 +------------------+------------------- + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(3 rows) + +SELECT * FROM INT8_TBL WHERE '123'::int2 > q1; + q1 | q2 +----+---- +(0 rows) + +SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1; + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1; + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +SELECT q1 AS plus, -q1 AS minus FROM INT8_TBL; + plus | minus +------------------+------------------- + 123 | -123 + 123 | -123 + 4567890123456789 | -4567890123456789 + 4567890123456789 | -4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +SELECT q1, q2, q1 + q2 AS plus FROM INT8_TBL; + q1 | q2 | plus +------------------+-------------------+------------------ + 123 | 456 | 579 + 123 | 4567890123456789 | 4567890123456912 + 4567890123456789 | 123 | 4567890123456912 + 4567890123456789 | 4567890123456789 | 9135780246913578 + 4567890123456789 | -4567890123456789 | 0 +(5 rows) + +SELECT q1, q2, q1 - q2 AS minus FROM INT8_TBL; + q1 | q2 | minus +------------------+-------------------+------------------- + 123 | 456 | -333 + 123 | 4567890123456789 | -4567890123456666 + 4567890123456789 | 123 | 4567890123456666 + 4567890123456789 | 4567890123456789 | 0 + 4567890123456789 | -4567890123456789 | 9135780246913578 +(5 rows) + +SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL; +ERROR: bigint out of range +SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL + WHERE q1 < 1000 or (q2 > 0 and q2 < 1000); + q1 | q2 | multiply +------------------+------------------+-------------------- + 123 | 456 | 56088 + 123 | 4567890123456789 | 561850485185185047 + 4567890123456789 | 123 | 561850485185185047 +(3 rows) + +SELECT q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL; + q1 | q2 | divide | mod +------------------+-------------------+----------------+----- + 123 | 456 | 0 | 123 + 123 | 4567890123456789 | 0 | 123 + 4567890123456789 | 123 | 37137318076884 | 57 + 4567890123456789 | 4567890123456789 | 1 | 0 + 4567890123456789 | -4567890123456789 | -1 | 0 +(5 rows) + +SELECT q1, float8(q1) FROM INT8_TBL; + q1 | float8 +------------------+----------------------- + 123 | 123 + 123 | 123 + 4567890123456789 | 4.567890123456789e+15 + 4567890123456789 | 4.567890123456789e+15 + 4567890123456789 | 4.567890123456789e+15 +(5 rows) + +SELECT q2, float8(q2) FROM INT8_TBL; + q2 | float8 +-------------------+------------------------ + 456 | 456 + 4567890123456789 | 4.567890123456789e+15 + 123 | 123 + 4567890123456789 | 4.567890123456789e+15 + -4567890123456789 | -4.567890123456789e+15 +(5 rows) + +SELECT 37 + q1 AS plus4 FROM INT8_TBL; + plus4 +------------------ + 160 + 160 + 4567890123456826 + 4567890123456826 + 4567890123456826 +(5 rows) + +SELECT 37 - q1 AS minus4 FROM INT8_TBL; + minus4 +------------------- + -86 + -86 + -4567890123456752 + -4567890123456752 + -4567890123456752 +(5 rows) + +SELECT 2 * q1 AS "twice int4" FROM INT8_TBL; + twice int4 +------------------ + 246 + 246 + 9135780246913578 + 9135780246913578 + 9135780246913578 +(5 rows) + +SELECT q1 * 2 AS "twice int4" FROM INT8_TBL; + twice int4 +------------------ + 246 + 246 + 9135780246913578 + 9135780246913578 + 9135780246913578 +(5 rows) + +-- int8 op int4 +SELECT q1 + 42::int4 AS "8plus4", q1 - 42::int4 AS "8minus4", q1 * 42::int4 AS "8mul4", q1 / 42::int4 AS "8div4" FROM INT8_TBL; + 8plus4 | 8minus4 | 8mul4 | 8div4 +------------------+------------------+--------------------+----------------- + 165 | 81 | 5166 | 2 + 165 | 81 | 5166 | 2 + 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733 + 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733 + 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733 +(5 rows) + +-- int4 op int8 +SELECT 246::int4 + q1 AS "4plus8", 246::int4 - q1 AS "4minus8", 246::int4 * q1 AS "4mul8", 246::int4 / q1 AS "4div8" FROM INT8_TBL; + 4plus8 | 4minus8 | 4mul8 | 4div8 +------------------+-------------------+---------------------+------- + 369 | 123 | 30258 | 2 + 369 | 123 | 30258 | 2 + 4567890123457035 | -4567890123456543 | 1123700970370370094 | 0 + 4567890123457035 | -4567890123456543 | 1123700970370370094 | 0 + 4567890123457035 | -4567890123456543 | 1123700970370370094 | 0 +(5 rows) + +-- int8 op int2 +SELECT q1 + 42::int2 AS "8plus2", q1 - 42::int2 AS "8minus2", q1 * 42::int2 AS "8mul2", q1 / 42::int2 AS "8div2" FROM INT8_TBL; + 8plus2 | 8minus2 | 8mul2 | 8div2 +------------------+------------------+--------------------+----------------- + 165 | 81 | 5166 | 2 + 165 | 81 | 5166 | 2 + 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733 + 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733 + 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733 +(5 rows) + +-- int2 op int8 +SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL; + 2plus8 | 2minus8 | 2mul8 | 2div8 +------------------+-------------------+---------------------+------- + 369 | 123 | 30258 | 2 + 369 | 123 | 30258 | 2 + 4567890123457035 | -4567890123456543 | 1123700970370370094 | 0 + 4567890123457035 | -4567890123456543 | 1123700970370370094 | 0 + 4567890123457035 | -4567890123456543 | 1123700970370370094 | 0 +(5 rows) + +SELECT q2, abs(q2) FROM INT8_TBL; + q2 | abs +-------------------+------------------ + 456 | 456 + 4567890123456789 | 4567890123456789 + 123 | 123 + 4567890123456789 | 4567890123456789 + -4567890123456789 | 4567890123456789 +(5 rows) + +SELECT min(q1), min(q2) FROM INT8_TBL; + min | min +-----+------------------- + 123 | -4567890123456789 +(1 row) + +SELECT max(q1), max(q2) FROM INT8_TBL; + max | max +------------------+------------------ + 4567890123456789 | 4567890123456789 +(1 row) + +-- TO_CHAR() +-- +SELECT to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999') + FROM INT8_TBL; + to_char | to_char +------------------------+------------------------ + 123 | 456 + 123 | 4,567,890,123,456,789 + 4,567,890,123,456,789 | 123 + 4,567,890,123,456,789 | 4,567,890,123,456,789 + 4,567,890,123,456,789 | -4,567,890,123,456,789 +(5 rows) + +SELECT to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999') + FROM INT8_TBL; + to_char | to_char +--------------------------------+-------------------------------- + 123.000,000 | 456.000,000 + 123.000,000 | 4,567,890,123,456,789.000,000 + 4,567,890,123,456,789.000,000 | 123.000,000 + 4,567,890,123,456,789.000,000 | 4,567,890,123,456,789.000,000 + 4,567,890,123,456,789.000,000 | -4,567,890,123,456,789.000,000 +(5 rows) + +SELECT to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR') + FROM INT8_TBL; + to_char | to_char +--------------------+------------------------ + <123> | <456.000> + <123> | <4567890123456789.000> + <4567890123456789> | <123.000> + <4567890123456789> | <4567890123456789.000> + <4567890123456789> | 4567890123456789.000 +(5 rows) + +SELECT to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999') + FROM INT8_TBL; + to_char | to_char +-------------------+------------------- + 123- | -456 + 123- | -4567890123456789 + 4567890123456789- | -123 + 4567890123456789- | -4567890123456789 + 4567890123456789- | +4567890123456789 +(5 rows) + +SELECT to_char(q2, 'MI9999999999999999') FROM INT8_TBL; + to_char +------------------- + 456 + 4567890123456789 + 123 + 4567890123456789 + -4567890123456789 +(5 rows) + +SELECT to_char(q2, 'FMS9999999999999999') FROM INT8_TBL; + to_char +------------------- + +456 + +4567890123456789 + +123 + +4567890123456789 + -4567890123456789 +(5 rows) + +SELECT to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL; + to_char +-------------------- + 456TH + 4567890123456789TH + 123RD + 4567890123456789TH + <4567890123456789> +(5 rows) + +SELECT to_char(q2, 'SG9999999999999999th') FROM INT8_TBL; + to_char +--------------------- + + 456th + +4567890123456789th + + 123rd + +4567890123456789th + -4567890123456789 +(5 rows) + +SELECT to_char(q2, '0999999999999999') FROM INT8_TBL; + to_char +------------------- + 0000000000000456 + 4567890123456789 + 0000000000000123 + 4567890123456789 + -4567890123456789 +(5 rows) + +SELECT to_char(q2, 'S0999999999999999') FROM INT8_TBL; + to_char +------------------- + +0000000000000456 + +4567890123456789 + +0000000000000123 + +4567890123456789 + -4567890123456789 +(5 rows) + +SELECT to_char(q2, 'FM0999999999999999') FROM INT8_TBL; + to_char +------------------- + 0000000000000456 + 4567890123456789 + 0000000000000123 + 4567890123456789 + -4567890123456789 +(5 rows) + +SELECT to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL; + to_char +----------------------- + 456.000 + 4567890123456789.000 + 123.000 + 4567890123456789.000 + -4567890123456789.000 +(5 rows) + +SELECT to_char(q2, 'L9999999999999999.000') FROM INT8_TBL; + to_char +------------------------ + 456.000 + 4567890123456789.000 + 123.000 + 4567890123456789.000 + -4567890123456789.000 +(5 rows) + +SELECT to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL; + to_char +-------------------- + 456. + 4567890123456789. + 123. + 4567890123456789. + -4567890123456789. +(5 rows) + +SELECT to_char(q2, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9') FROM INT8_TBL; + to_char +------------------------------------------- + +4 5 6 . 0 0 0 + +4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 . 0 0 0 + +1 2 3 . 0 0 0 + +4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 . 0 0 0 + -4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 . 0 0 0 +(5 rows) + +SELECT to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL; + to_char +----------------------------------------------------------- + text 9999 "text between quote marks" 456 + 45678 text 9012 9999 345 "text between quote marks" 6789 + text 9999 "text between quote marks" 123 + 45678 text 9012 9999 345 "text between quote marks" 6789 + -45678 text 9012 9999 345 "text between quote marks" 6789 +(5 rows) + +SELECT to_char(q2, '999999SG9999999999') FROM INT8_TBL; + to_char +------------------- + + 456 + 456789+0123456789 + + 123 + 456789+0123456789 + 456789-0123456789 +(5 rows) + +-- check min/max values and overflow behavior +select '-9223372036854775808'::int8; + int8 +---------------------- + -9223372036854775808 +(1 row) + +select '-9223372036854775809'::int8; +ERROR: value "-9223372036854775809" is out of range for type bigint +LINE 1: select '-9223372036854775809'::int8; + ^ +select '9223372036854775807'::int8; + int8 +--------------------- + 9223372036854775807 +(1 row) + +select '9223372036854775808'::int8; +ERROR: value "9223372036854775808" is out of range for type bigint +LINE 1: select '9223372036854775808'::int8; + ^ +select -('-9223372036854775807'::int8); + ?column? +--------------------- + 9223372036854775807 +(1 row) + +select -('-9223372036854775808'::int8); +ERROR: bigint out of range +select '9223372036854775800'::int8 + '9223372036854775800'::int8; +ERROR: bigint out of range +select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; +ERROR: bigint out of range +select '9223372036854775800'::int8 - '-9223372036854775800'::int8; +ERROR: bigint out of range +select '-9223372036854775800'::int8 - '9223372036854775800'::int8; +ERROR: bigint out of range +select '9223372036854775800'::int8 * '9223372036854775800'::int8; +ERROR: bigint out of range +select '9223372036854775800'::int8 / '0'::int8; +ERROR: division by zero +select '9223372036854775800'::int8 % '0'::int8; +ERROR: division by zero +select abs('-9223372036854775808'::int8); +ERROR: bigint out of range +select '9223372036854775800'::int8 + '100'::int4; +ERROR: bigint out of range +select '-9223372036854775800'::int8 - '100'::int4; +ERROR: bigint out of range +select '9223372036854775800'::int8 * '100'::int4; +ERROR: bigint out of range +select '100'::int4 + '9223372036854775800'::int8; +ERROR: bigint out of range +select '-100'::int4 - '9223372036854775800'::int8; +ERROR: bigint out of range +select '100'::int4 * '9223372036854775800'::int8; +ERROR: bigint out of range +select '9223372036854775800'::int8 + '100'::int2; +ERROR: bigint out of range +select '-9223372036854775800'::int8 - '100'::int2; +ERROR: bigint out of range +select '9223372036854775800'::int8 * '100'::int2; +ERROR: bigint out of range +select '-9223372036854775808'::int8 / '0'::int2; +ERROR: division by zero +select '100'::int2 + '9223372036854775800'::int8; +ERROR: bigint out of range +select '-100'::int2 - '9223372036854775800'::int8; +ERROR: bigint out of range +select '100'::int2 * '9223372036854775800'::int8; +ERROR: bigint out of range +select '100'::int2 / '0'::int8; +ERROR: division by zero +SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456; + q1 +----- + 123 +(1 row) + +SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456; +ERROR: integer out of range +SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456; + q1 +----- + 123 +(1 row) + +SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456; +ERROR: smallint out of range +SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8); + int8 | int8 +------+------ + 42 | -37 +(1 row) + +SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL; + q1 | q2 +-------------+------------------------ + 123 | 456 + 123 | 4.567890123456789e+15 + 4.56789e+15 | 123 + 4.56789e+15 | 4.567890123456789e+15 + 4.56789e+15 | -4.567890123456789e+15 +(5 rows) + +SELECT CAST('36854775807.0'::float4 AS int8); + int8 +------------- + 36854775808 +(1 row) + +SELECT CAST('922337203685477580700.0'::float8 AS int8); +ERROR: bigint out of range +SELECT CAST(q1 AS oid) FROM INT8_TBL; +ERROR: OID out of range +SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class'; + oid +------ + 1259 +(1 row) + +-- bit operations +SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL; + q1 | q2 | and | or | xor | not +------------------+-------------------+------------------+------------------+------------------+------------------- + 123 | 456 | 72 | 507 | 435 | -124 + 123 | 4567890123456789 | 17 | 4567890123456895 | 4567890123456878 | -124 + 4567890123456789 | 123 | 17 | 4567890123456895 | 4567890123456878 | -4567890123456790 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 0 | -4567890123456790 + 4567890123456789 | -4567890123456789 | 1 | -1 | -2 | -4567890123456790 +(5 rows) + +SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL; + q1 | shl | shr +------------------+-------------------+----------------- + 123 | 492 | 15 + 123 | 492 | 15 + 4567890123456789 | 18271560493827156 | 570986265432098 + 4567890123456789 | 18271560493827156 | 570986265432098 + 4567890123456789 | 18271560493827156 | 570986265432098 +(5 rows) + +-- generate_series +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8); + generate_series +------------------ + 4567890123456789 + 4567890123456790 + 4567890123456791 + 4567890123456792 + 4567890123456793 + 4567890123456794 + 4567890123456795 + 4567890123456796 + 4567890123456797 + 4567890123456798 + 4567890123456799 +(11 rows) + +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0); +ERROR: step size cannot equal zero +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2); + generate_series +------------------ + 4567890123456789 + 4567890123456791 + 4567890123456793 + 4567890123456795 + 4567890123456797 + 4567890123456799 +(6 rows) + +-- corner case +SELECT (-1::int8<<63)::text; + text +---------------------- + -9223372036854775808 +(1 row) + +SELECT ((-1::int8<<63)+1)::text; + text +---------------------- + -9223372036854775807 +(1 row) + +-- check sane handling of INT64_MIN overflow cases +SELECT (-9223372036854775808)::int8 * (-1)::int8; +ERROR: bigint out of range +SELECT (-9223372036854775808)::int8 / (-1)::int8; +ERROR: bigint out of range +SELECT (-9223372036854775808)::int8 % (-1)::int8; + ?column? +---------- + 0 +(1 row) + +SELECT (-9223372036854775808)::int8 * (-1)::int4; +ERROR: bigint out of range +SELECT (-9223372036854775808)::int8 / (-1)::int4; +ERROR: bigint out of range +SELECT (-9223372036854775808)::int8 % (-1)::int4; + ?column? +---------- + 0 +(1 row) + +SELECT (-9223372036854775808)::int8 * (-1)::int2; +ERROR: bigint out of range +SELECT (-9223372036854775808)::int8 / (-1)::int2; +ERROR: bigint out of range +SELECT (-9223372036854775808)::int8 % (-1)::int2; + ?column? +---------- + 0 +(1 row) + +-- check rounding when casting from float +SELECT x, x::int8 AS int8_value +FROM (VALUES (-2.5::float8), + (-1.5::float8), + (-0.5::float8), + (0.0::float8), + (0.5::float8), + (1.5::float8), + (2.5::float8)) t(x); + x | int8_value +------+------------ + -2.5 | -2 + -1.5 | -2 + -0.5 | 0 + 0 | 0 + 0.5 | 0 + 1.5 | 2 + 2.5 | 2 +(7 rows) + +-- check rounding when casting from numeric +SELECT x, x::int8 AS int8_value +FROM (VALUES (-2.5::numeric), + (-1.5::numeric), + (-0.5::numeric), + (0.0::numeric), + (0.5::numeric), + (1.5::numeric), + (2.5::numeric)) t(x); + x | int8_value +------+------------ + -2.5 | -3 + -1.5 | -2 + -0.5 | -1 + 0.0 | 0 + 0.5 | 1 + 1.5 | 2 + 2.5 | 3 +(7 rows) + +-- test gcd() +SELECT a, b, gcd(a, b), gcd(a, -b), gcd(b, a), gcd(-b, a) +FROM (VALUES (0::int8, 0::int8), + (0::int8, 29893644334::int8), + (288484263558::int8, 29893644334::int8), + (-288484263558::int8, 29893644334::int8), + ((-9223372036854775808)::int8, 1::int8), + ((-9223372036854775808)::int8, 9223372036854775807::int8), + ((-9223372036854775808)::int8, 4611686018427387904::int8)) AS v(a, b); + a | b | gcd | gcd | gcd | gcd +----------------------+---------------------+---------------------+---------------------+---------------------+--------------------- + 0 | 0 | 0 | 0 | 0 | 0 + 0 | 29893644334 | 29893644334 | 29893644334 | 29893644334 | 29893644334 + 288484263558 | 29893644334 | 6835958 | 6835958 | 6835958 | 6835958 + -288484263558 | 29893644334 | 6835958 | 6835958 | 6835958 | 6835958 + -9223372036854775808 | 1 | 1 | 1 | 1 | 1 + -9223372036854775808 | 9223372036854775807 | 1 | 1 | 1 | 1 + -9223372036854775808 | 4611686018427387904 | 4611686018427387904 | 4611686018427387904 | 4611686018427387904 | 4611686018427387904 +(7 rows) + +SELECT gcd((-9223372036854775808)::int8, 0::int8); -- overflow +ERROR: bigint out of range +SELECT gcd((-9223372036854775808)::int8, (-9223372036854775808)::int8); -- overflow +ERROR: bigint out of range +-- test lcm() +SELECT a, b, lcm(a, b), lcm(a, -b), lcm(b, a), lcm(-b, a) +FROM (VALUES (0::int8, 0::int8), + (0::int8, 29893644334::int8), + (29893644334::int8, 29893644334::int8), + (288484263558::int8, 29893644334::int8), + (-288484263558::int8, 29893644334::int8), + ((-9223372036854775808)::int8, 0::int8)) AS v(a, b); + a | b | lcm | lcm | lcm | lcm +----------------------+-------------+------------------+------------------+------------------+------------------ + 0 | 0 | 0 | 0 | 0 | 0 + 0 | 29893644334 | 0 | 0 | 0 | 0 + 29893644334 | 29893644334 | 29893644334 | 29893644334 | 29893644334 | 29893644334 + 288484263558 | 29893644334 | 1261541684539134 | 1261541684539134 | 1261541684539134 | 1261541684539134 + -288484263558 | 29893644334 | 1261541684539134 | 1261541684539134 | 1261541684539134 | 1261541684539134 + -9223372036854775808 | 0 | 0 | 0 | 0 | 0 +(6 rows) + +SELECT lcm((-9223372036854775808)::int8, 1::int8); -- overflow +ERROR: bigint out of range +SELECT lcm(9223372036854775807::int8, 9223372036854775806::int8); -- overflow +ERROR: bigint out of range diff --git a/src/test/singlenode_regress/expected/interval.out b/src/test/singlenode_regress/expected/interval.out new file mode 100644 index 00000000000..8e2d5355435 --- /dev/null +++ b/src/test/singlenode_regress/expected/interval.out @@ -0,0 +1,1045 @@ +-- +-- INTERVAL +-- +SET DATESTYLE = 'ISO'; +SET IntervalStyle to postgres; +-- check acceptance of "time zone style" +SELECT INTERVAL '01:00' AS "One hour"; + One hour +---------- + 01:00:00 +(1 row) + +SELECT INTERVAL '+02:00' AS "Two hours"; + Two hours +----------- + 02:00:00 +(1 row) + +SELECT INTERVAL '-08:00' AS "Eight hours"; + Eight hours +------------- + -08:00:00 +(1 row) + +SELECT INTERVAL '-1 +02:03' AS "22 hours ago..."; + 22 hours ago... +------------------- + -1 days +02:03:00 +(1 row) + +SELECT INTERVAL '-1 days +02:03' AS "22 hours ago..."; + 22 hours ago... +------------------- + -1 days +02:03:00 +(1 row) + +SELECT INTERVAL '1.5 weeks' AS "Ten days twelve hours"; + Ten days twelve hours +----------------------- + 10 days 12:00:00 +(1 row) + +SELECT INTERVAL '1.5 months' AS "One month 15 days"; + One month 15 days +------------------- + 1 mon 15 days +(1 row) + +SELECT INTERVAL '10 years -11 month -12 days +13:14' AS "9 years..."; + 9 years... +---------------------------------- + 9 years 1 mon -12 days +13:14:00 +(1 row) + +CREATE TABLE INTERVAL_TBL (f1 interval); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 1 minute'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 5 hour'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 10 day'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 34 year'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 3 months'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 14 seconds ago'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('1 day 2 hours 3 minutes 4 seconds'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('6 years'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months 12 hours'); +-- badly formatted interval +INSERT INTO INTERVAL_TBL (f1) VALUES ('badly formatted interval'); +ERROR: invalid input syntax for type interval: "badly formatted interval" +LINE 1: INSERT INTO INTERVAL_TBL (f1) VALUES ('badly formatted inter... + ^ +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 30 eons ago'); +ERROR: invalid input syntax for type interval: "@ 30 eons ago" +LINE 1: INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 30 eons ago'); + ^ +-- test interval operators +SELECT * FROM INTERVAL_TBL; + f1 +----------------- + 00:01:00 + 05:00:00 + 10 days + 34 years + 3 mons + -00:00:14 + 1 day 02:03:04 + 6 years + 5 mons + 5 mons 12:00:00 +(10 rows) + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 <> interval '@ 10 days'; + f1 +----------------- + 00:01:00 + 05:00:00 + 34 years + 3 mons + -00:00:14 + 1 day 02:03:04 + 6 years + 5 mons + 5 mons 12:00:00 +(9 rows) + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 <= interval '@ 5 hours'; + f1 +----------- + 00:01:00 + 05:00:00 + -00:00:14 +(3 rows) + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 < interval '@ 1 day'; + f1 +----------- + 00:01:00 + 05:00:00 + -00:00:14 +(3 rows) + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 = interval '@ 34 years'; + f1 +---------- + 34 years +(1 row) + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 >= interval '@ 1 month'; + f1 +----------------- + 34 years + 3 mons + 6 years + 5 mons + 5 mons 12:00:00 +(5 rows) + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 > interval '@ 3 seconds ago'; + f1 +----------------- + 00:01:00 + 05:00:00 + 10 days + 34 years + 3 mons + 1 day 02:03:04 + 6 years + 5 mons + 5 mons 12:00:00 +(9 rows) + +SELECT r1.*, r2.* + FROM INTERVAL_TBL r1, INTERVAL_TBL r2 + WHERE r1.f1 > r2.f1 + ORDER BY r1.f1, r2.f1; + f1 | f1 +-----------------+----------------- + 00:01:00 | -00:00:14 + 05:00:00 | -00:00:14 + 05:00:00 | 00:01:00 + 1 day 02:03:04 | -00:00:14 + 1 day 02:03:04 | 00:01:00 + 1 day 02:03:04 | 05:00:00 + 10 days | -00:00:14 + 10 days | 00:01:00 + 10 days | 05:00:00 + 10 days | 1 day 02:03:04 + 3 mons | -00:00:14 + 3 mons | 00:01:00 + 3 mons | 05:00:00 + 3 mons | 1 day 02:03:04 + 3 mons | 10 days + 5 mons | -00:00:14 + 5 mons | 00:01:00 + 5 mons | 05:00:00 + 5 mons | 1 day 02:03:04 + 5 mons | 10 days + 5 mons | 3 mons + 5 mons 12:00:00 | -00:00:14 + 5 mons 12:00:00 | 00:01:00 + 5 mons 12:00:00 | 05:00:00 + 5 mons 12:00:00 | 1 day 02:03:04 + 5 mons 12:00:00 | 10 days + 5 mons 12:00:00 | 3 mons + 5 mons 12:00:00 | 5 mons + 6 years | -00:00:14 + 6 years | 00:01:00 + 6 years | 05:00:00 + 6 years | 1 day 02:03:04 + 6 years | 10 days + 6 years | 3 mons + 6 years | 5 mons + 6 years | 5 mons 12:00:00 + 34 years | -00:00:14 + 34 years | 00:01:00 + 34 years | 05:00:00 + 34 years | 1 day 02:03:04 + 34 years | 10 days + 34 years | 3 mons + 34 years | 5 mons + 34 years | 5 mons 12:00:00 + 34 years | 6 years +(45 rows) + +-- Test intervals that are large enough to overflow 64 bits in comparisons +CREATE TEMP TABLE INTERVAL_TBL_OF (f1 interval); +INSERT INTO INTERVAL_TBL_OF (f1) VALUES + ('2147483647 days 2147483647 months'), + ('2147483647 days -2147483648 months'), + ('1 year'), + ('-2147483648 days 2147483647 months'), + ('-2147483648 days -2147483648 months'); +-- these should fail as out-of-range +INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('2147483648 days'); +ERROR: interval field value out of range: "2147483648 days" +LINE 1: INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('2147483648 days'); + ^ +INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('-2147483649 days'); +ERROR: interval field value out of range: "-2147483649 days" +LINE 1: INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('-2147483649 days')... + ^ +INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('2147483647 years'); +ERROR: interval out of range +LINE 1: INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('2147483647 years')... + ^ +INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('-2147483648 years'); +ERROR: interval out of range +LINE 1: INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('-2147483648 years'... + ^ +-- Test edge-case overflow detection in interval multiplication +select extract(epoch from '256 microseconds'::interval * (2^55)::float8); +ERROR: interval out of range +SELECT r1.*, r2.* + FROM INTERVAL_TBL_OF r1, INTERVAL_TBL_OF r2 + WHERE r1.f1 > r2.f1 + ORDER BY r1.f1, r2.f1; + f1 | f1 +-------------------------------------------+------------------------------------------- + -178956970 years -8 mons +2147483647 days | -178956970 years -8 mons -2147483648 days + 1 year | -178956970 years -8 mons -2147483648 days + 1 year | -178956970 years -8 mons +2147483647 days + 178956970 years 7 mons -2147483648 days | -178956970 years -8 mons -2147483648 days + 178956970 years 7 mons -2147483648 days | -178956970 years -8 mons +2147483647 days + 178956970 years 7 mons -2147483648 days | 1 year + 178956970 years 7 mons 2147483647 days | -178956970 years -8 mons -2147483648 days + 178956970 years 7 mons 2147483647 days | -178956970 years -8 mons +2147483647 days + 178956970 years 7 mons 2147483647 days | 1 year + 178956970 years 7 mons 2147483647 days | 178956970 years 7 mons -2147483648 days +(10 rows) + +CREATE INDEX ON INTERVAL_TBL_OF USING btree (f1); +SET enable_seqscan TO false; +EXPLAIN (COSTS OFF) +SELECT f1 FROM INTERVAL_TBL_OF r1 ORDER BY f1; + QUERY PLAN +-------------------------------------------------------------------- + Index Only Scan using interval_tbl_of_f1_idx on interval_tbl_of r1 +(1 row) + +SELECT f1 FROM INTERVAL_TBL_OF r1 ORDER BY f1; + f1 +------------------------------------------- + -178956970 years -8 mons -2147483648 days + -178956970 years -8 mons +2147483647 days + 1 year + 178956970 years 7 mons -2147483648 days + 178956970 years 7 mons 2147483647 days +(5 rows) + +RESET enable_seqscan; +DROP TABLE INTERVAL_TBL_OF; +-- Test multiplication and division with intervals. +-- Floating point arithmetic rounding errors can lead to unexpected results, +-- though the code attempts to do the right thing and round up to days and +-- minutes to avoid results such as '3 days 24:00 hours' or '14:20:60'. +-- Note that it is expected for some day components to be greater than 29 and +-- some time components be greater than 23:59:59 due to how intervals are +-- stored internally. +CREATE TABLE INTERVAL_MULDIV_TBL (span interval); +COPY INTERVAL_MULDIV_TBL FROM STDIN; +SELECT span * 0.3 AS product +FROM INTERVAL_MULDIV_TBL; + product +------------------------------------ + 1 year 12 days 122:24:00 + -1 years -12 days +93:36:00 + -3 days -14:24:00 + 2 mons 13 days 01:22:28.8 + -10 mons +120 days 37:28:21.6567 + 1 mon 6 days + 4 mons 6 days + 24 years 11 mons 320 days 16:48:00 +(8 rows) + +SELECT span * 8.2 AS product +FROM INTERVAL_MULDIV_TBL; + product +--------------------------------------------- + 28 years 104 days 2961:36:00 + -28 years -104 days +2942:24:00 + -98 days -09:36:00 + 6 years 1 mon -197 days +93:34:27.2 + -24 years -7 mons +3946 days 640:15:11.9498 + 2 years 8 mons 24 days + 9 years 6 mons 24 days + 682 years 7 mons 8215 days 19:12:00 +(8 rows) + +SELECT span / 10 AS quotient +FROM INTERVAL_MULDIV_TBL; + quotient +---------------------------------- + 4 mons 4 days 40:48:00 + -4 mons -4 days +31:12:00 + -1 days -04:48:00 + 25 days -15:32:30.4 + -3 mons +30 days 12:29:27.2189 + 12 days + 1 mon 12 days + 8 years 3 mons 126 days 21:36:00 +(8 rows) + +SELECT span / 100 AS quotient +FROM INTERVAL_MULDIV_TBL; + quotient +------------------------- + 12 days 13:40:48 + -12 days -06:28:48 + -02:52:48 + 2 days 10:26:44.96 + -6 days +01:14:56.72189 + 1 day 04:48:00 + 4 days 04:48:00 + 9 mons 39 days 16:33:36 +(8 rows) + +DROP TABLE INTERVAL_MULDIV_TBL; +SET DATESTYLE = 'postgres'; +SET IntervalStyle to postgres_verbose; +SELECT * FROM INTERVAL_TBL; + f1 +------------------------------- + @ 1 min + @ 5 hours + @ 10 days + @ 34 years + @ 3 mons + @ 14 secs ago + @ 1 day 2 hours 3 mins 4 secs + @ 6 years + @ 5 mons + @ 5 mons 12 hours +(10 rows) + +-- test avg(interval), which is somewhat fragile since people have been +-- known to change the allowed input syntax for type interval without +-- updating pg_aggregate.agginitval +select avg(f1) from interval_tbl; + avg +------------------------------------------------- + @ 4 years 1 mon 10 days 4 hours 18 mins 23 secs +(1 row) + +-- test long interval input +select '4 millenniums 5 centuries 4 decades 1 year 4 months 4 days 17 minutes 31 seconds'::interval; + interval +-------------------------------------------- + @ 4541 years 4 mons 4 days 17 mins 31 secs +(1 row) + +-- test long interval output +-- Note: the actual maximum length of the interval output is longer, +-- but we need the test to work for both integer and floating-point +-- timestamps. +select '100000000y 10mon -1000000000d -100000h -10min -10.000001s ago'::interval; + interval +--------------------------------------------------------------------------------------- + @ 100000000 years 10 mons -1000000000 days -100000 hours -10 mins -10.000001 secs ago +(1 row) + +-- test justify_hours() and justify_days() +SELECT justify_hours(interval '6 months 3 days 52 hours 3 minutes 2 seconds') as "6 mons 5 days 4 hours 3 mins 2 seconds"; + 6 mons 5 days 4 hours 3 mins 2 seconds +---------------------------------------- + @ 6 mons 5 days 4 hours 3 mins 2 secs +(1 row) + +SELECT justify_days(interval '6 months 36 days 5 hours 4 minutes 3 seconds') as "7 mons 6 days 5 hours 4 mins 3 seconds"; + 7 mons 6 days 5 hours 4 mins 3 seconds +---------------------------------------- + @ 7 mons 6 days 5 hours 4 mins 3 secs +(1 row) + +-- test justify_interval() +SELECT justify_interval(interval '1 month -1 hour') as "1 month -1 hour"; + 1 month -1 hour +-------------------- + @ 29 days 23 hours +(1 row) + +-- test fractional second input, and detection of duplicate units +SET DATESTYLE = 'ISO'; +SET IntervalStyle TO postgres; +SELECT '1 millisecond'::interval, '1 microsecond'::interval, + '500 seconds 99 milliseconds 51 microseconds'::interval; + interval | interval | interval +--------------+-----------------+----------------- + 00:00:00.001 | 00:00:00.000001 | 00:08:20.099051 +(1 row) + +SELECT '3 days 5 milliseconds'::interval; + interval +--------------------- + 3 days 00:00:00.005 +(1 row) + +SELECT '1 second 2 seconds'::interval; -- error +ERROR: invalid input syntax for type interval: "1 second 2 seconds" +LINE 1: SELECT '1 second 2 seconds'::interval; + ^ +SELECT '10 milliseconds 20 milliseconds'::interval; -- error +ERROR: invalid input syntax for type interval: "10 milliseconds 20 milliseconds" +LINE 1: SELECT '10 milliseconds 20 milliseconds'::interval; + ^ +SELECT '5.5 seconds 3 milliseconds'::interval; -- error +ERROR: invalid input syntax for type interval: "5.5 seconds 3 milliseconds" +LINE 1: SELECT '5.5 seconds 3 milliseconds'::interval; + ^ +SELECT '1:20:05 5 microseconds'::interval; -- error +ERROR: invalid input syntax for type interval: "1:20:05 5 microseconds" +LINE 1: SELECT '1:20:05 5 microseconds'::interval; + ^ +SELECT '1 day 1 day'::interval; -- error +ERROR: invalid input syntax for type interval: "1 day 1 day" +LINE 1: SELECT '1 day 1 day'::interval; + ^ +SELECT interval '1-2'; -- SQL year-month literal + interval +--------------- + 1 year 2 mons +(1 row) + +SELECT interval '999' second; -- oversize leading field is ok + interval +---------- + 00:16:39 +(1 row) + +SELECT interval '999' minute; + interval +---------- + 16:39:00 +(1 row) + +SELECT interval '999' hour; + interval +----------- + 999:00:00 +(1 row) + +SELECT interval '999' day; + interval +---------- + 999 days +(1 row) + +SELECT interval '999' month; + interval +----------------- + 83 years 3 mons +(1 row) + +-- test SQL-spec syntaxes for restricted field sets +SELECT interval '1' year; + interval +---------- + 1 year +(1 row) + +SELECT interval '2' month; + interval +---------- + 2 mons +(1 row) + +SELECT interval '3' day; + interval +---------- + 3 days +(1 row) + +SELECT interval '4' hour; + interval +---------- + 04:00:00 +(1 row) + +SELECT interval '5' minute; + interval +---------- + 00:05:00 +(1 row) + +SELECT interval '6' second; + interval +---------- + 00:00:06 +(1 row) + +SELECT interval '1' year to month; + interval +---------- + 1 mon +(1 row) + +SELECT interval '1-2' year to month; + interval +--------------- + 1 year 2 mons +(1 row) + +SELECT interval '1 2' day to hour; + interval +---------------- + 1 day 02:00:00 +(1 row) + +SELECT interval '1 2:03' day to hour; + interval +---------------- + 1 day 02:00:00 +(1 row) + +SELECT interval '1 2:03:04' day to hour; + interval +---------------- + 1 day 02:00:00 +(1 row) + +SELECT interval '1 2' day to minute; +ERROR: invalid input syntax for type interval: "1 2" +LINE 1: SELECT interval '1 2' day to minute; + ^ +SELECT interval '1 2:03' day to minute; + interval +---------------- + 1 day 02:03:00 +(1 row) + +SELECT interval '1 2:03:04' day to minute; + interval +---------------- + 1 day 02:03:00 +(1 row) + +SELECT interval '1 2' day to second; +ERROR: invalid input syntax for type interval: "1 2" +LINE 1: SELECT interval '1 2' day to second; + ^ +SELECT interval '1 2:03' day to second; + interval +---------------- + 1 day 02:03:00 +(1 row) + +SELECT interval '1 2:03:04' day to second; + interval +---------------- + 1 day 02:03:04 +(1 row) + +SELECT interval '1 2' hour to minute; +ERROR: invalid input syntax for type interval: "1 2" +LINE 1: SELECT interval '1 2' hour to minute; + ^ +SELECT interval '1 2:03' hour to minute; + interval +---------------- + 1 day 02:03:00 +(1 row) + +SELECT interval '1 2:03:04' hour to minute; + interval +---------------- + 1 day 02:03:00 +(1 row) + +SELECT interval '1 2' hour to second; +ERROR: invalid input syntax for type interval: "1 2" +LINE 1: SELECT interval '1 2' hour to second; + ^ +SELECT interval '1 2:03' hour to second; + interval +---------------- + 1 day 02:03:00 +(1 row) + +SELECT interval '1 2:03:04' hour to second; + interval +---------------- + 1 day 02:03:04 +(1 row) + +SELECT interval '1 2' minute to second; +ERROR: invalid input syntax for type interval: "1 2" +LINE 1: SELECT interval '1 2' minute to second; + ^ +SELECT interval '1 2:03' minute to second; + interval +---------------- + 1 day 00:02:03 +(1 row) + +SELECT interval '1 2:03:04' minute to second; + interval +---------------- + 1 day 02:03:04 +(1 row) + +SELECT interval '1 +2:03' minute to second; + interval +---------------- + 1 day 00:02:03 +(1 row) + +SELECT interval '1 +2:03:04' minute to second; + interval +---------------- + 1 day 02:03:04 +(1 row) + +SELECT interval '1 -2:03' minute to second; + interval +----------------- + 1 day -00:02:03 +(1 row) + +SELECT interval '1 -2:03:04' minute to second; + interval +----------------- + 1 day -02:03:04 +(1 row) + +SELECT interval '123 11' day to hour; -- ok + interval +------------------- + 123 days 11:00:00 +(1 row) + +SELECT interval '123 11' day; -- not ok +ERROR: invalid input syntax for type interval: "123 11" +LINE 1: SELECT interval '123 11' day; + ^ +SELECT interval '123 11'; -- not ok, too ambiguous +ERROR: invalid input syntax for type interval: "123 11" +LINE 1: SELECT interval '123 11'; + ^ +SELECT interval '123 2:03 -2:04'; -- not ok, redundant hh:mm fields +ERROR: invalid input syntax for type interval: "123 2:03 -2:04" +LINE 1: SELECT interval '123 2:03 -2:04'; + ^ +-- test syntaxes for restricted precision +SELECT interval(0) '1 day 01:23:45.6789'; + interval +---------------- + 1 day 01:23:46 +(1 row) + +SELECT interval(2) '1 day 01:23:45.6789'; + interval +------------------- + 1 day 01:23:45.68 +(1 row) + +SELECT interval '12:34.5678' minute to second(2); -- per SQL spec + interval +------------- + 00:12:34.57 +(1 row) + +SELECT interval '1.234' second; + interval +-------------- + 00:00:01.234 +(1 row) + +SELECT interval '1.234' second(2); + interval +------------- + 00:00:01.23 +(1 row) + +SELECT interval '1 2.345' day to second(2); +ERROR: invalid input syntax for type interval: "1 2.345" +LINE 1: SELECT interval '1 2.345' day to second(2); + ^ +SELECT interval '1 2:03' day to second(2); + interval +---------------- + 1 day 02:03:00 +(1 row) + +SELECT interval '1 2:03.4567' day to second(2); + interval +------------------- + 1 day 00:02:03.46 +(1 row) + +SELECT interval '1 2:03:04.5678' day to second(2); + interval +------------------- + 1 day 02:03:04.57 +(1 row) + +SELECT interval '1 2.345' hour to second(2); +ERROR: invalid input syntax for type interval: "1 2.345" +LINE 1: SELECT interval '1 2.345' hour to second(2); + ^ +SELECT interval '1 2:03.45678' hour to second(2); + interval +------------------- + 1 day 00:02:03.46 +(1 row) + +SELECT interval '1 2:03:04.5678' hour to second(2); + interval +------------------- + 1 day 02:03:04.57 +(1 row) + +SELECT interval '1 2.3456' minute to second(2); +ERROR: invalid input syntax for type interval: "1 2.3456" +LINE 1: SELECT interval '1 2.3456' minute to second(2); + ^ +SELECT interval '1 2:03.5678' minute to second(2); + interval +------------------- + 1 day 00:02:03.57 +(1 row) + +SELECT interval '1 2:03:04.5678' minute to second(2); + interval +------------------- + 1 day 02:03:04.57 +(1 row) + +-- test casting to restricted precision (bug #14479) +SELECT f1, f1::INTERVAL DAY TO MINUTE AS "minutes", + (f1 + INTERVAL '1 month')::INTERVAL MONTH::INTERVAL YEAR AS "years" + FROM interval_tbl; + f1 | minutes | years +-----------------+-----------------+---------- + 00:01:00 | 00:01:00 | 00:00:00 + 05:00:00 | 05:00:00 | 00:00:00 + 10 days | 10 days | 00:00:00 + 34 years | 34 years | 34 years + 3 mons | 3 mons | 00:00:00 + -00:00:14 | 00:00:00 | 00:00:00 + 1 day 02:03:04 | 1 day 02:03:00 | 00:00:00 + 6 years | 6 years | 6 years + 5 mons | 5 mons | 00:00:00 + 5 mons 12:00:00 | 5 mons 12:00:00 | 00:00:00 +(10 rows) + +-- test inputting and outputting SQL standard interval literals +SET IntervalStyle TO sql_standard; +SELECT interval '0' AS "zero", + interval '1-2' year to month AS "year-month", + interval '1 2:03:04' day to second AS "day-time", + - interval '1-2' AS "negative year-month", + - interval '1 2:03:04' AS "negative day-time"; + zero | year-month | day-time | negative year-month | negative day-time +------+------------+-----------+---------------------+------------------- + 0 | 1-2 | 1 2:03:04 | -1-2 | -1 2:03:04 +(1 row) + +-- test input of some not-quite-standard interval values in the sql style +SET IntervalStyle TO postgres; +SELECT interval '+1 -1:00:00', + interval '-1 +1:00:00', + interval '+1-2 -3 +4:05:06.789', + interval '-1-2 +3 -4:05:06.789'; + interval | interval | interval | interval +-----------------+-------------------+-------------------------------------+---------------------------------------- + 1 day -01:00:00 | -1 days +01:00:00 | 1 year 2 mons -3 days +04:05:06.789 | -1 years -2 mons +3 days -04:05:06.789 +(1 row) + +-- test output of couple non-standard interval values in the sql style +SET IntervalStyle TO sql_standard; +SELECT interval '1 day -1 hours', + interval '-1 days +1 hours', + interval '1 years 2 months -3 days 4 hours 5 minutes 6.789 seconds', + - interval '1 years 2 months -3 days 4 hours 5 minutes 6.789 seconds'; + interval | interval | interval | ?column? +------------------+------------------+----------------------+---------------------- + +0-0 +1 -1:00:00 | +0-0 -1 +1:00:00 | +1-2 -3 +4:05:06.789 | -1-2 +3 -4:05:06.789 +(1 row) + +-- test outputting iso8601 intervals +SET IntervalStyle to iso_8601; +select interval '0' AS "zero", + interval '1-2' AS "a year 2 months", + interval '1 2:03:04' AS "a bit over a day", + interval '2:03:04.45679' AS "a bit over 2 hours", + (interval '1-2' + interval '3 4:05:06.7') AS "all fields", + (interval '1-2' - interval '3 4:05:06.7') AS "mixed sign", + (- interval '1-2' + interval '3 4:05:06.7') AS "negative"; + zero | a year 2 months | a bit over a day | a bit over 2 hours | all fields | mixed sign | negative +------+-----------------+------------------+--------------------+------------------+----------------------+-------------------- + PT0S | P1Y2M | P1DT2H3M4S | PT2H3M4.45679S | P1Y2M3DT4H5M6.7S | P1Y2M-3DT-4H-5M-6.7S | P-1Y-2M3DT4H5M6.7S +(1 row) + +-- test inputting ISO 8601 4.4.2.1 "Format With Time Unit Designators" +SET IntervalStyle to sql_standard; +select interval 'P0Y' AS "zero", + interval 'P1Y2M' AS "a year 2 months", + interval 'P1W' AS "a week", + interval 'P1DT2H3M4S' AS "a bit over a day", + interval 'P1Y2M3DT4H5M6.7S' AS "all fields", + interval 'P-1Y-2M-3DT-4H-5M-6.7S' AS "negative", + interval 'PT-0.1S' AS "fractional second"; + zero | a year 2 months | a week | a bit over a day | all fields | negative | fractional second +------+-----------------+-----------+------------------+--------------------+--------------------+------------------- + 0 | 1-2 | 7 0:00:00 | 1 2:03:04 | +1-2 +3 +4:05:06.7 | -1-2 -3 -4:05:06.7 | -0:00:00.1 +(1 row) + +-- test inputting ISO 8601 4.4.2.2 "Alternative Format" +SET IntervalStyle to postgres; +select interval 'P00021015T103020' AS "ISO8601 Basic Format", + interval 'P0002-10-15T10:30:20' AS "ISO8601 Extended Format"; + ISO8601 Basic Format | ISO8601 Extended Format +----------------------------------+---------------------------------- + 2 years 10 mons 15 days 10:30:20 | 2 years 10 mons 15 days 10:30:20 +(1 row) + +-- Make sure optional ISO8601 alternative format fields are optional. +select interval 'P0002' AS "year only", + interval 'P0002-10' AS "year month", + interval 'P0002-10-15' AS "year month day", + interval 'P0002T1S' AS "year only plus time", + interval 'P0002-10T1S' AS "year month plus time", + interval 'P0002-10-15T1S' AS "year month day plus time", + interval 'PT10' AS "hour only", + interval 'PT10:30' AS "hour minute"; + year only | year month | year month day | year only plus time | year month plus time | year month day plus time | hour only | hour minute +-----------+-----------------+-------------------------+---------------------+--------------------------+----------------------------------+-----------+------------- + 2 years | 2 years 10 mons | 2 years 10 mons 15 days | 2 years 00:00:01 | 2 years 10 mons 00:00:01 | 2 years 10 mons 15 days 00:00:01 | 10:00:00 | 10:30:00 +(1 row) + +-- test a couple rounding cases that changed since 8.3 w/ HAVE_INT64_TIMESTAMP. +SET IntervalStyle to postgres_verbose; +select interval '-10 mons -3 days +03:55:06.70'; + interval +-------------------------------------------------- + @ 10 mons 3 days -3 hours -55 mins -6.7 secs ago +(1 row) + +select interval '1 year 2 mons 3 days 04:05:06.699999'; + interval +----------------------------------------------------- + @ 1 year 2 mons 3 days 4 hours 5 mins 6.699999 secs +(1 row) + +select interval '0:0:0.7', interval '@ 0.70 secs', interval '0.7 seconds'; + interval | interval | interval +------------+------------+------------ + @ 0.7 secs | @ 0.7 secs | @ 0.7 secs +(1 row) + +-- check that '30 days' equals '1 month' according to the hash function +select '30 days'::interval = '1 month'::interval as t; + t +--- + t +(1 row) + +select interval_hash('30 days'::interval) = interval_hash('1 month'::interval) as t; + t +--- + t +(1 row) + +-- numeric constructor +select make_interval(years := 2); + make_interval +--------------- + @ 2 years +(1 row) + +select make_interval(years := 1, months := 6); + make_interval +----------------- + @ 1 year 6 mons +(1 row) + +select make_interval(years := 1, months := -1, weeks := 5, days := -7, hours := 25, mins := -180); + make_interval +---------------------------- + @ 11 mons 28 days 22 hours +(1 row) + +select make_interval() = make_interval(years := 0, months := 0, weeks := 0, days := 0, mins := 0, secs := 0.0); + ?column? +---------- + t +(1 row) + +select make_interval(hours := -2, mins := -10, secs := -25.3); + make_interval +--------------------------------- + @ 2 hours 10 mins 25.3 secs ago +(1 row) + +select make_interval(years := 'inf'::float::int); +ERROR: integer out of range +select make_interval(months := 'NaN'::float::int); +ERROR: integer out of range +select make_interval(secs := 'inf'); +ERROR: interval out of range +select make_interval(secs := 'NaN'); +ERROR: interval out of range +select make_interval(secs := 7e12); + make_interval +------------------------------------ + @ 1944444444 hours 26 mins 40 secs +(1 row) + +-- +-- test EXTRACT +-- +SELECT f1, + EXTRACT(MICROSECOND FROM f1) AS MICROSECOND, + EXTRACT(MILLISECOND FROM f1) AS MILLISECOND, + EXTRACT(SECOND FROM f1) AS SECOND, + EXTRACT(MINUTE FROM f1) AS MINUTE, + EXTRACT(HOUR FROM f1) AS HOUR, + EXTRACT(DAY FROM f1) AS DAY, + EXTRACT(MONTH FROM f1) AS MONTH, + EXTRACT(QUARTER FROM f1) AS QUARTER, + EXTRACT(YEAR FROM f1) AS YEAR, + EXTRACT(DECADE FROM f1) AS DECADE, + EXTRACT(CENTURY FROM f1) AS CENTURY, + EXTRACT(MILLENNIUM FROM f1) AS MILLENNIUM, + EXTRACT(EPOCH FROM f1) AS EPOCH + FROM INTERVAL_TBL; + f1 | microsecond | millisecond | second | minute | hour | day | month | quarter | year | decade | century | millennium | epoch +-------------------------------+-------------+-------------+------------+--------+------+-----+-------+---------+------+--------+---------+------------+------------------- + @ 1 min | 0 | 0.000 | 0.000000 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 60.000000 + @ 5 hours | 0 | 0.000 | 0.000000 | 0 | 5 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 18000.000000 + @ 10 days | 0 | 0.000 | 0.000000 | 0 | 0 | 10 | 0 | 1 | 0 | 0 | 0 | 0 | 864000.000000 + @ 34 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 34 | 3 | 0 | 0 | 1072958400.000000 + @ 3 mons | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 3 | 2 | 0 | 0 | 0 | 0 | 7776000.000000 + @ 14 secs ago | -14000000 | -14000.000 | -14.000000 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | -14.000000 + @ 1 day 2 hours 3 mins 4 secs | 4000000 | 4000.000 | 4.000000 | 3 | 2 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 93784.000000 + @ 6 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 6 | 0 | 0 | 0 | 189345600.000000 + @ 5 mons | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 12960000.000000 + @ 5 mons 12 hours | 0 | 0.000 | 0.000000 | 0 | 12 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 13003200.000000 +(10 rows) + +SELECT EXTRACT(FORTNIGHT FROM INTERVAL '2 days'); -- error +ERROR: interval units "fortnight" not recognized +SELECT EXTRACT(TIMEZONE FROM INTERVAL '2 days'); -- error +ERROR: interval units "timezone" not supported +SELECT EXTRACT(DECADE FROM INTERVAL '100 y'); + extract +--------- + 10 +(1 row) + +SELECT EXTRACT(DECADE FROM INTERVAL '99 y'); + extract +--------- + 9 +(1 row) + +SELECT EXTRACT(DECADE FROM INTERVAL '-99 y'); + extract +--------- + -9 +(1 row) + +SELECT EXTRACT(DECADE FROM INTERVAL '-100 y'); + extract +--------- + -10 +(1 row) + +SELECT EXTRACT(CENTURY FROM INTERVAL '100 y'); + extract +--------- + 1 +(1 row) + +SELECT EXTRACT(CENTURY FROM INTERVAL '99 y'); + extract +--------- + 0 +(1 row) + +SELECT EXTRACT(CENTURY FROM INTERVAL '-99 y'); + extract +--------- + 0 +(1 row) + +SELECT EXTRACT(CENTURY FROM INTERVAL '-100 y'); + extract +--------- + -1 +(1 row) + +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT f1, + date_part('microsecond', f1) AS microsecond, + date_part('millisecond', f1) AS millisecond, + date_part('second', f1) AS second, + date_part('epoch', f1) AS epoch + FROM INTERVAL_TBL; + f1 | microsecond | millisecond | second | epoch +-------------------------------+-------------+-------------+--------+------------ + @ 1 min | 0 | 0 | 0 | 60 + @ 5 hours | 0 | 0 | 0 | 18000 + @ 10 days | 0 | 0 | 0 | 864000 + @ 34 years | 0 | 0 | 0 | 1072958400 + @ 3 mons | 0 | 0 | 0 | 7776000 + @ 14 secs ago | -14000000 | -14000 | -14 | -14 + @ 1 day 2 hours 3 mins 4 secs | 4000000 | 4000 | 4 | 93784 + @ 6 years | 0 | 0 | 0 | 189345600 + @ 5 mons | 0 | 0 | 0 | 12960000 + @ 5 mons 12 hours | 0 | 0 | 0 | 13003200 +(10 rows) + +-- internal overflow test case +SELECT extract(epoch from interval '1000000000 days'); + extract +----------------------- + 86400000000000.000000 +(1 row) + diff --git a/src/test/singlenode_regress/expected/join.out b/src/test/singlenode_regress/expected/join.out new file mode 100644 index 00000000000..7764f910c0b --- /dev/null +++ b/src/test/singlenode_regress/expected/join.out @@ -0,0 +1,6798 @@ +-- +-- JOIN +-- Test JOIN clauses +-- +CREATE TABLE J1_TBL ( + i integer, + j integer, + t text +); +CREATE TABLE J2_TBL ( + i integer, + k integer +); +INSERT INTO J1_TBL VALUES (1, 4, 'one'); +INSERT INTO J1_TBL VALUES (2, 3, 'two'); +INSERT INTO J1_TBL VALUES (3, 2, 'three'); +INSERT INTO J1_TBL VALUES (4, 1, 'four'); +INSERT INTO J1_TBL VALUES (5, 0, 'five'); +INSERT INTO J1_TBL VALUES (6, 6, 'six'); +INSERT INTO J1_TBL VALUES (7, 7, 'seven'); +INSERT INTO J1_TBL VALUES (8, 8, 'eight'); +INSERT INTO J1_TBL VALUES (0, NULL, 'zero'); +INSERT INTO J1_TBL VALUES (NULL, NULL, 'null'); +INSERT INTO J1_TBL VALUES (NULL, 0, 'zero'); +INSERT INTO J2_TBL VALUES (1, -1); +INSERT INTO J2_TBL VALUES (2, 2); +INSERT INTO J2_TBL VALUES (3, -3); +INSERT INTO J2_TBL VALUES (2, 4); +INSERT INTO J2_TBL VALUES (5, -5); +INSERT INTO J2_TBL VALUES (5, -5); +INSERT INTO J2_TBL VALUES (0, NULL); +INSERT INTO J2_TBL VALUES (NULL, NULL); +INSERT INTO J2_TBL VALUES (NULL, 0); +-- useful in some tests below +create temp table onerow(); +insert into onerow default values; +analyze onerow; +-- +-- CORRELATION NAMES +-- Make sure that table/column aliases are supported +-- before diving into more complex join syntax. +-- +SELECT * + FROM J1_TBL AS tx; + i | j | t +---+---+------- + 1 | 4 | one + 2 | 3 | two + 3 | 2 | three + 4 | 1 | four + 5 | 0 | five + 6 | 6 | six + 7 | 7 | seven + 8 | 8 | eight + 0 | | zero + | | null + | 0 | zero +(11 rows) + +SELECT * + FROM J1_TBL tx; + i | j | t +---+---+------- + 1 | 4 | one + 2 | 3 | two + 3 | 2 | three + 4 | 1 | four + 5 | 0 | five + 6 | 6 | six + 7 | 7 | seven + 8 | 8 | eight + 0 | | zero + | | null + | 0 | zero +(11 rows) + +SELECT * + FROM J1_TBL AS t1 (a, b, c); + a | b | c +---+---+------- + 1 | 4 | one + 2 | 3 | two + 3 | 2 | three + 4 | 1 | four + 5 | 0 | five + 6 | 6 | six + 7 | 7 | seven + 8 | 8 | eight + 0 | | zero + | | null + | 0 | zero +(11 rows) + +SELECT * + FROM J1_TBL t1 (a, b, c); + a | b | c +---+---+------- + 1 | 4 | one + 2 | 3 | two + 3 | 2 | three + 4 | 1 | four + 5 | 0 | five + 6 | 6 | six + 7 | 7 | seven + 8 | 8 | eight + 0 | | zero + | | null + | 0 | zero +(11 rows) + +SELECT * + FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e); + a | b | c | d | e +---+---+-------+---+---- + 1 | 4 | one | 1 | -1 + 2 | 3 | two | 1 | -1 + 3 | 2 | three | 1 | -1 + 4 | 1 | four | 1 | -1 + 5 | 0 | five | 1 | -1 + 6 | 6 | six | 1 | -1 + 7 | 7 | seven | 1 | -1 + 8 | 8 | eight | 1 | -1 + 0 | | zero | 1 | -1 + | | null | 1 | -1 + | 0 | zero | 1 | -1 + 1 | 4 | one | 2 | 2 + 2 | 3 | two | 2 | 2 + 3 | 2 | three | 2 | 2 + 4 | 1 | four | 2 | 2 + 5 | 0 | five | 2 | 2 + 6 | 6 | six | 2 | 2 + 7 | 7 | seven | 2 | 2 + 8 | 8 | eight | 2 | 2 + 0 | | zero | 2 | 2 + | | null | 2 | 2 + | 0 | zero | 2 | 2 + 1 | 4 | one | 3 | -3 + 2 | 3 | two | 3 | -3 + 3 | 2 | three | 3 | -3 + 4 | 1 | four | 3 | -3 + 5 | 0 | five | 3 | -3 + 6 | 6 | six | 3 | -3 + 7 | 7 | seven | 3 | -3 + 8 | 8 | eight | 3 | -3 + 0 | | zero | 3 | -3 + | | null | 3 | -3 + | 0 | zero | 3 | -3 + 1 | 4 | one | 2 | 4 + 2 | 3 | two | 2 | 4 + 3 | 2 | three | 2 | 4 + 4 | 1 | four | 2 | 4 + 5 | 0 | five | 2 | 4 + 6 | 6 | six | 2 | 4 + 7 | 7 | seven | 2 | 4 + 8 | 8 | eight | 2 | 4 + 0 | | zero | 2 | 4 + | | null | 2 | 4 + | 0 | zero | 2 | 4 + 1 | 4 | one | 5 | -5 + 2 | 3 | two | 5 | -5 + 3 | 2 | three | 5 | -5 + 4 | 1 | four | 5 | -5 + 5 | 0 | five | 5 | -5 + 6 | 6 | six | 5 | -5 + 7 | 7 | seven | 5 | -5 + 8 | 8 | eight | 5 | -5 + 0 | | zero | 5 | -5 + | | null | 5 | -5 + | 0 | zero | 5 | -5 + 1 | 4 | one | 5 | -5 + 2 | 3 | two | 5 | -5 + 3 | 2 | three | 5 | -5 + 4 | 1 | four | 5 | -5 + 5 | 0 | five | 5 | -5 + 6 | 6 | six | 5 | -5 + 7 | 7 | seven | 5 | -5 + 8 | 8 | eight | 5 | -5 + 0 | | zero | 5 | -5 + | | null | 5 | -5 + | 0 | zero | 5 | -5 + 1 | 4 | one | 0 | + 2 | 3 | two | 0 | + 3 | 2 | three | 0 | + 4 | 1 | four | 0 | + 5 | 0 | five | 0 | + 6 | 6 | six | 0 | + 7 | 7 | seven | 0 | + 8 | 8 | eight | 0 | + 0 | | zero | 0 | + | | null | 0 | + | 0 | zero | 0 | + 1 | 4 | one | | + 2 | 3 | two | | + 3 | 2 | three | | + 4 | 1 | four | | + 5 | 0 | five | | + 6 | 6 | six | | + 7 | 7 | seven | | + 8 | 8 | eight | | + 0 | | zero | | + | | null | | + | 0 | zero | | + 1 | 4 | one | | 0 + 2 | 3 | two | | 0 + 3 | 2 | three | | 0 + 4 | 1 | four | | 0 + 5 | 0 | five | | 0 + 6 | 6 | six | | 0 + 7 | 7 | seven | | 0 + 8 | 8 | eight | | 0 + 0 | | zero | | 0 + | | null | | 0 + | 0 | zero | | 0 +(99 rows) + +SELECT t1.a, t2.e + FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e) + WHERE t1.a = t2.d; + a | e +---+---- + 0 | + 1 | -1 + 2 | 2 + 2 | 4 + 3 | -3 + 5 | -5 + 5 | -5 +(7 rows) + +-- +-- CROSS JOIN +-- Qualifications are not allowed on cross joins, +-- which degenerate into a standard unqualified inner join. +-- +SELECT * + FROM J1_TBL CROSS JOIN J2_TBL; + i | j | t | i | k +---+---+-------+---+---- + 1 | 4 | one | 1 | -1 + 2 | 3 | two | 1 | -1 + 3 | 2 | three | 1 | -1 + 4 | 1 | four | 1 | -1 + 5 | 0 | five | 1 | -1 + 6 | 6 | six | 1 | -1 + 7 | 7 | seven | 1 | -1 + 8 | 8 | eight | 1 | -1 + 0 | | zero | 1 | -1 + | | null | 1 | -1 + | 0 | zero | 1 | -1 + 1 | 4 | one | 2 | 2 + 2 | 3 | two | 2 | 2 + 3 | 2 | three | 2 | 2 + 4 | 1 | four | 2 | 2 + 5 | 0 | five | 2 | 2 + 6 | 6 | six | 2 | 2 + 7 | 7 | seven | 2 | 2 + 8 | 8 | eight | 2 | 2 + 0 | | zero | 2 | 2 + | | null | 2 | 2 + | 0 | zero | 2 | 2 + 1 | 4 | one | 3 | -3 + 2 | 3 | two | 3 | -3 + 3 | 2 | three | 3 | -3 + 4 | 1 | four | 3 | -3 + 5 | 0 | five | 3 | -3 + 6 | 6 | six | 3 | -3 + 7 | 7 | seven | 3 | -3 + 8 | 8 | eight | 3 | -3 + 0 | | zero | 3 | -3 + | | null | 3 | -3 + | 0 | zero | 3 | -3 + 1 | 4 | one | 2 | 4 + 2 | 3 | two | 2 | 4 + 3 | 2 | three | 2 | 4 + 4 | 1 | four | 2 | 4 + 5 | 0 | five | 2 | 4 + 6 | 6 | six | 2 | 4 + 7 | 7 | seven | 2 | 4 + 8 | 8 | eight | 2 | 4 + 0 | | zero | 2 | 4 + | | null | 2 | 4 + | 0 | zero | 2 | 4 + 1 | 4 | one | 5 | -5 + 2 | 3 | two | 5 | -5 + 3 | 2 | three | 5 | -5 + 4 | 1 | four | 5 | -5 + 5 | 0 | five | 5 | -5 + 6 | 6 | six | 5 | -5 + 7 | 7 | seven | 5 | -5 + 8 | 8 | eight | 5 | -5 + 0 | | zero | 5 | -5 + | | null | 5 | -5 + | 0 | zero | 5 | -5 + 1 | 4 | one | 5 | -5 + 2 | 3 | two | 5 | -5 + 3 | 2 | three | 5 | -5 + 4 | 1 | four | 5 | -5 + 5 | 0 | five | 5 | -5 + 6 | 6 | six | 5 | -5 + 7 | 7 | seven | 5 | -5 + 8 | 8 | eight | 5 | -5 + 0 | | zero | 5 | -5 + | | null | 5 | -5 + | 0 | zero | 5 | -5 + 1 | 4 | one | 0 | + 2 | 3 | two | 0 | + 3 | 2 | three | 0 | + 4 | 1 | four | 0 | + 5 | 0 | five | 0 | + 6 | 6 | six | 0 | + 7 | 7 | seven | 0 | + 8 | 8 | eight | 0 | + 0 | | zero | 0 | + | | null | 0 | + | 0 | zero | 0 | + 1 | 4 | one | | + 2 | 3 | two | | + 3 | 2 | three | | + 4 | 1 | four | | + 5 | 0 | five | | + 6 | 6 | six | | + 7 | 7 | seven | | + 8 | 8 | eight | | + 0 | | zero | | + | | null | | + | 0 | zero | | + 1 | 4 | one | | 0 + 2 | 3 | two | | 0 + 3 | 2 | three | | 0 + 4 | 1 | four | | 0 + 5 | 0 | five | | 0 + 6 | 6 | six | | 0 + 7 | 7 | seven | | 0 + 8 | 8 | eight | | 0 + 0 | | zero | | 0 + | | null | | 0 + | 0 | zero | | 0 +(99 rows) + +-- ambiguous column +SELECT i, k, t + FROM J1_TBL CROSS JOIN J2_TBL; +ERROR: column reference "i" is ambiguous +LINE 1: SELECT i, k, t + ^ +-- resolve previous ambiguity by specifying the table name +SELECT t1.i, k, t + FROM J1_TBL t1 CROSS JOIN J2_TBL t2; + i | k | t +---+----+------- + 1 | -1 | one + 2 | -1 | two + 3 | -1 | three + 4 | -1 | four + 5 | -1 | five + 6 | -1 | six + 7 | -1 | seven + 8 | -1 | eight + 0 | -1 | zero + | -1 | null + | -1 | zero + 1 | 2 | one + 2 | 2 | two + 3 | 2 | three + 4 | 2 | four + 5 | 2 | five + 6 | 2 | six + 7 | 2 | seven + 8 | 2 | eight + 0 | 2 | zero + | 2 | null + | 2 | zero + 1 | -3 | one + 2 | -3 | two + 3 | -3 | three + 4 | -3 | four + 5 | -3 | five + 6 | -3 | six + 7 | -3 | seven + 8 | -3 | eight + 0 | -3 | zero + | -3 | null + | -3 | zero + 1 | 4 | one + 2 | 4 | two + 3 | 4 | three + 4 | 4 | four + 5 | 4 | five + 6 | 4 | six + 7 | 4 | seven + 8 | 4 | eight + 0 | 4 | zero + | 4 | null + | 4 | zero + 1 | -5 | one + 2 | -5 | two + 3 | -5 | three + 4 | -5 | four + 5 | -5 | five + 6 | -5 | six + 7 | -5 | seven + 8 | -5 | eight + 0 | -5 | zero + | -5 | null + | -5 | zero + 1 | -5 | one + 2 | -5 | two + 3 | -5 | three + 4 | -5 | four + 5 | -5 | five + 6 | -5 | six + 7 | -5 | seven + 8 | -5 | eight + 0 | -5 | zero + | -5 | null + | -5 | zero + 1 | | one + 2 | | two + 3 | | three + 4 | | four + 5 | | five + 6 | | six + 7 | | seven + 8 | | eight + 0 | | zero + | | null + | | zero + 1 | | one + 2 | | two + 3 | | three + 4 | | four + 5 | | five + 6 | | six + 7 | | seven + 8 | | eight + 0 | | zero + | | null + | | zero + 1 | 0 | one + 2 | 0 | two + 3 | 0 | three + 4 | 0 | four + 5 | 0 | five + 6 | 0 | six + 7 | 0 | seven + 8 | 0 | eight + 0 | 0 | zero + | 0 | null + | 0 | zero +(99 rows) + +SELECT ii, tt, kk + FROM (J1_TBL CROSS JOIN J2_TBL) + AS tx (ii, jj, tt, ii2, kk); + ii | tt | kk +----+-------+---- + 1 | one | -1 + 2 | two | -1 + 3 | three | -1 + 4 | four | -1 + 5 | five | -1 + 6 | six | -1 + 7 | seven | -1 + 8 | eight | -1 + 0 | zero | -1 + | null | -1 + | zero | -1 + 1 | one | 2 + 2 | two | 2 + 3 | three | 2 + 4 | four | 2 + 5 | five | 2 + 6 | six | 2 + 7 | seven | 2 + 8 | eight | 2 + 0 | zero | 2 + | null | 2 + | zero | 2 + 1 | one | -3 + 2 | two | -3 + 3 | three | -3 + 4 | four | -3 + 5 | five | -3 + 6 | six | -3 + 7 | seven | -3 + 8 | eight | -3 + 0 | zero | -3 + | null | -3 + | zero | -3 + 1 | one | 4 + 2 | two | 4 + 3 | three | 4 + 4 | four | 4 + 5 | five | 4 + 6 | six | 4 + 7 | seven | 4 + 8 | eight | 4 + 0 | zero | 4 + | null | 4 + | zero | 4 + 1 | one | -5 + 2 | two | -5 + 3 | three | -5 + 4 | four | -5 + 5 | five | -5 + 6 | six | -5 + 7 | seven | -5 + 8 | eight | -5 + 0 | zero | -5 + | null | -5 + | zero | -5 + 1 | one | -5 + 2 | two | -5 + 3 | three | -5 + 4 | four | -5 + 5 | five | -5 + 6 | six | -5 + 7 | seven | -5 + 8 | eight | -5 + 0 | zero | -5 + | null | -5 + | zero | -5 + 1 | one | + 2 | two | + 3 | three | + 4 | four | + 5 | five | + 6 | six | + 7 | seven | + 8 | eight | + 0 | zero | + | null | + | zero | + 1 | one | + 2 | two | + 3 | three | + 4 | four | + 5 | five | + 6 | six | + 7 | seven | + 8 | eight | + 0 | zero | + | null | + | zero | + 1 | one | 0 + 2 | two | 0 + 3 | three | 0 + 4 | four | 0 + 5 | five | 0 + 6 | six | 0 + 7 | seven | 0 + 8 | eight | 0 + 0 | zero | 0 + | null | 0 + | zero | 0 +(99 rows) + +SELECT tx.ii, tx.jj, tx.kk + FROM (J1_TBL t1 (a, b, c) CROSS JOIN J2_TBL t2 (d, e)) + AS tx (ii, jj, tt, ii2, kk); + ii | jj | kk +----+----+---- + 1 | 4 | -1 + 2 | 3 | -1 + 3 | 2 | -1 + 4 | 1 | -1 + 5 | 0 | -1 + 6 | 6 | -1 + 7 | 7 | -1 + 8 | 8 | -1 + 0 | | -1 + | | -1 + | 0 | -1 + 1 | 4 | 2 + 2 | 3 | 2 + 3 | 2 | 2 + 4 | 1 | 2 + 5 | 0 | 2 + 6 | 6 | 2 + 7 | 7 | 2 + 8 | 8 | 2 + 0 | | 2 + | | 2 + | 0 | 2 + 1 | 4 | -3 + 2 | 3 | -3 + 3 | 2 | -3 + 4 | 1 | -3 + 5 | 0 | -3 + 6 | 6 | -3 + 7 | 7 | -3 + 8 | 8 | -3 + 0 | | -3 + | | -3 + | 0 | -3 + 1 | 4 | 4 + 2 | 3 | 4 + 3 | 2 | 4 + 4 | 1 | 4 + 5 | 0 | 4 + 6 | 6 | 4 + 7 | 7 | 4 + 8 | 8 | 4 + 0 | | 4 + | | 4 + | 0 | 4 + 1 | 4 | -5 + 2 | 3 | -5 + 3 | 2 | -5 + 4 | 1 | -5 + 5 | 0 | -5 + 6 | 6 | -5 + 7 | 7 | -5 + 8 | 8 | -5 + 0 | | -5 + | | -5 + | 0 | -5 + 1 | 4 | -5 + 2 | 3 | -5 + 3 | 2 | -5 + 4 | 1 | -5 + 5 | 0 | -5 + 6 | 6 | -5 + 7 | 7 | -5 + 8 | 8 | -5 + 0 | | -5 + | | -5 + | 0 | -5 + 1 | 4 | + 2 | 3 | + 3 | 2 | + 4 | 1 | + 5 | 0 | + 6 | 6 | + 7 | 7 | + 8 | 8 | + 0 | | + | | + | 0 | + 1 | 4 | + 2 | 3 | + 3 | 2 | + 4 | 1 | + 5 | 0 | + 6 | 6 | + 7 | 7 | + 8 | 8 | + 0 | | + | | + | 0 | + 1 | 4 | 0 + 2 | 3 | 0 + 3 | 2 | 0 + 4 | 1 | 0 + 5 | 0 | 0 + 6 | 6 | 0 + 7 | 7 | 0 + 8 | 8 | 0 + 0 | | 0 + | | 0 + | 0 | 0 +(99 rows) + +SELECT * + FROM J1_TBL CROSS JOIN J2_TBL a CROSS JOIN J2_TBL b; + i | j | t | i | k | i | k +---+---+-------+---+----+---+---- + 1 | 4 | one | 1 | -1 | 1 | -1 + 1 | 4 | one | 1 | -1 | 2 | 2 + 1 | 4 | one | 1 | -1 | 3 | -3 + 1 | 4 | one | 1 | -1 | 2 | 4 + 1 | 4 | one | 1 | -1 | 5 | -5 + 1 | 4 | one | 1 | -1 | 5 | -5 + 1 | 4 | one | 1 | -1 | 0 | + 1 | 4 | one | 1 | -1 | | + 1 | 4 | one | 1 | -1 | | 0 + 2 | 3 | two | 1 | -1 | 1 | -1 + 2 | 3 | two | 1 | -1 | 2 | 2 + 2 | 3 | two | 1 | -1 | 3 | -3 + 2 | 3 | two | 1 | -1 | 2 | 4 + 2 | 3 | two | 1 | -1 | 5 | -5 + 2 | 3 | two | 1 | -1 | 5 | -5 + 2 | 3 | two | 1 | -1 | 0 | + 2 | 3 | two | 1 | -1 | | + 2 | 3 | two | 1 | -1 | | 0 + 3 | 2 | three | 1 | -1 | 1 | -1 + 3 | 2 | three | 1 | -1 | 2 | 2 + 3 | 2 | three | 1 | -1 | 3 | -3 + 3 | 2 | three | 1 | -1 | 2 | 4 + 3 | 2 | three | 1 | -1 | 5 | -5 + 3 | 2 | three | 1 | -1 | 5 | -5 + 3 | 2 | three | 1 | -1 | 0 | + 3 | 2 | three | 1 | -1 | | + 3 | 2 | three | 1 | -1 | | 0 + 4 | 1 | four | 1 | -1 | 1 | -1 + 4 | 1 | four | 1 | -1 | 2 | 2 + 4 | 1 | four | 1 | -1 | 3 | -3 + 4 | 1 | four | 1 | -1 | 2 | 4 + 4 | 1 | four | 1 | -1 | 5 | -5 + 4 | 1 | four | 1 | -1 | 5 | -5 + 4 | 1 | four | 1 | -1 | 0 | + 4 | 1 | four | 1 | -1 | | + 4 | 1 | four | 1 | -1 | | 0 + 5 | 0 | five | 1 | -1 | 1 | -1 + 5 | 0 | five | 1 | -1 | 2 | 2 + 5 | 0 | five | 1 | -1 | 3 | -3 + 5 | 0 | five | 1 | -1 | 2 | 4 + 5 | 0 | five | 1 | -1 | 5 | -5 + 5 | 0 | five | 1 | -1 | 5 | -5 + 5 | 0 | five | 1 | -1 | 0 | + 5 | 0 | five | 1 | -1 | | + 5 | 0 | five | 1 | -1 | | 0 + 6 | 6 | six | 1 | -1 | 1 | -1 + 6 | 6 | six | 1 | -1 | 2 | 2 + 6 | 6 | six | 1 | -1 | 3 | -3 + 6 | 6 | six | 1 | -1 | 2 | 4 + 6 | 6 | six | 1 | -1 | 5 | -5 + 6 | 6 | six | 1 | -1 | 5 | -5 + 6 | 6 | six | 1 | -1 | 0 | + 6 | 6 | six | 1 | -1 | | + 6 | 6 | six | 1 | -1 | | 0 + 7 | 7 | seven | 1 | -1 | 1 | -1 + 7 | 7 | seven | 1 | -1 | 2 | 2 + 7 | 7 | seven | 1 | -1 | 3 | -3 + 7 | 7 | seven | 1 | -1 | 2 | 4 + 7 | 7 | seven | 1 | -1 | 5 | -5 + 7 | 7 | seven | 1 | -1 | 5 | -5 + 7 | 7 | seven | 1 | -1 | 0 | + 7 | 7 | seven | 1 | -1 | | + 7 | 7 | seven | 1 | -1 | | 0 + 8 | 8 | eight | 1 | -1 | 1 | -1 + 8 | 8 | eight | 1 | -1 | 2 | 2 + 8 | 8 | eight | 1 | -1 | 3 | -3 + 8 | 8 | eight | 1 | -1 | 2 | 4 + 8 | 8 | eight | 1 | -1 | 5 | -5 + 8 | 8 | eight | 1 | -1 | 5 | -5 + 8 | 8 | eight | 1 | -1 | 0 | + 8 | 8 | eight | 1 | -1 | | + 8 | 8 | eight | 1 | -1 | | 0 + 0 | | zero | 1 | -1 | 1 | -1 + 0 | | zero | 1 | -1 | 2 | 2 + 0 | | zero | 1 | -1 | 3 | -3 + 0 | | zero | 1 | -1 | 2 | 4 + 0 | | zero | 1 | -1 | 5 | -5 + 0 | | zero | 1 | -1 | 5 | -5 + 0 | | zero | 1 | -1 | 0 | + 0 | | zero | 1 | -1 | | + 0 | | zero | 1 | -1 | | 0 + | | null | 1 | -1 | 1 | -1 + | | null | 1 | -1 | 2 | 2 + | | null | 1 | -1 | 3 | -3 + | | null | 1 | -1 | 2 | 4 + | | null | 1 | -1 | 5 | -5 + | | null | 1 | -1 | 5 | -5 + | | null | 1 | -1 | 0 | + | | null | 1 | -1 | | + | | null | 1 | -1 | | 0 + | 0 | zero | 1 | -1 | 1 | -1 + | 0 | zero | 1 | -1 | 2 | 2 + | 0 | zero | 1 | -1 | 3 | -3 + | 0 | zero | 1 | -1 | 2 | 4 + | 0 | zero | 1 | -1 | 5 | -5 + | 0 | zero | 1 | -1 | 5 | -5 + | 0 | zero | 1 | -1 | 0 | + | 0 | zero | 1 | -1 | | + | 0 | zero | 1 | -1 | | 0 + 1 | 4 | one | 2 | 2 | 1 | -1 + 1 | 4 | one | 2 | 2 | 2 | 2 + 1 | 4 | one | 2 | 2 | 3 | -3 + 1 | 4 | one | 2 | 2 | 2 | 4 + 1 | 4 | one | 2 | 2 | 5 | -5 + 1 | 4 | one | 2 | 2 | 5 | -5 + 1 | 4 | one | 2 | 2 | 0 | + 1 | 4 | one | 2 | 2 | | + 1 | 4 | one | 2 | 2 | | 0 + 2 | 3 | two | 2 | 2 | 1 | -1 + 2 | 3 | two | 2 | 2 | 2 | 2 + 2 | 3 | two | 2 | 2 | 3 | -3 + 2 | 3 | two | 2 | 2 | 2 | 4 + 2 | 3 | two | 2 | 2 | 5 | -5 + 2 | 3 | two | 2 | 2 | 5 | -5 + 2 | 3 | two | 2 | 2 | 0 | + 2 | 3 | two | 2 | 2 | | + 2 | 3 | two | 2 | 2 | | 0 + 3 | 2 | three | 2 | 2 | 1 | -1 + 3 | 2 | three | 2 | 2 | 2 | 2 + 3 | 2 | three | 2 | 2 | 3 | -3 + 3 | 2 | three | 2 | 2 | 2 | 4 + 3 | 2 | three | 2 | 2 | 5 | -5 + 3 | 2 | three | 2 | 2 | 5 | -5 + 3 | 2 | three | 2 | 2 | 0 | + 3 | 2 | three | 2 | 2 | | + 3 | 2 | three | 2 | 2 | | 0 + 4 | 1 | four | 2 | 2 | 1 | -1 + 4 | 1 | four | 2 | 2 | 2 | 2 + 4 | 1 | four | 2 | 2 | 3 | -3 + 4 | 1 | four | 2 | 2 | 2 | 4 + 4 | 1 | four | 2 | 2 | 5 | -5 + 4 | 1 | four | 2 | 2 | 5 | -5 + 4 | 1 | four | 2 | 2 | 0 | + 4 | 1 | four | 2 | 2 | | + 4 | 1 | four | 2 | 2 | | 0 + 5 | 0 | five | 2 | 2 | 1 | -1 + 5 | 0 | five | 2 | 2 | 2 | 2 + 5 | 0 | five | 2 | 2 | 3 | -3 + 5 | 0 | five | 2 | 2 | 2 | 4 + 5 | 0 | five | 2 | 2 | 5 | -5 + 5 | 0 | five | 2 | 2 | 5 | -5 + 5 | 0 | five | 2 | 2 | 0 | + 5 | 0 | five | 2 | 2 | | + 5 | 0 | five | 2 | 2 | | 0 + 6 | 6 | six | 2 | 2 | 1 | -1 + 6 | 6 | six | 2 | 2 | 2 | 2 + 6 | 6 | six | 2 | 2 | 3 | -3 + 6 | 6 | six | 2 | 2 | 2 | 4 + 6 | 6 | six | 2 | 2 | 5 | -5 + 6 | 6 | six | 2 | 2 | 5 | -5 + 6 | 6 | six | 2 | 2 | 0 | + 6 | 6 | six | 2 | 2 | | + 6 | 6 | six | 2 | 2 | | 0 + 7 | 7 | seven | 2 | 2 | 1 | -1 + 7 | 7 | seven | 2 | 2 | 2 | 2 + 7 | 7 | seven | 2 | 2 | 3 | -3 + 7 | 7 | seven | 2 | 2 | 2 | 4 + 7 | 7 | seven | 2 | 2 | 5 | -5 + 7 | 7 | seven | 2 | 2 | 5 | -5 + 7 | 7 | seven | 2 | 2 | 0 | + 7 | 7 | seven | 2 | 2 | | + 7 | 7 | seven | 2 | 2 | | 0 + 8 | 8 | eight | 2 | 2 | 1 | -1 + 8 | 8 | eight | 2 | 2 | 2 | 2 + 8 | 8 | eight | 2 | 2 | 3 | -3 + 8 | 8 | eight | 2 | 2 | 2 | 4 + 8 | 8 | eight | 2 | 2 | 5 | -5 + 8 | 8 | eight | 2 | 2 | 5 | -5 + 8 | 8 | eight | 2 | 2 | 0 | + 8 | 8 | eight | 2 | 2 | | + 8 | 8 | eight | 2 | 2 | | 0 + 0 | | zero | 2 | 2 | 1 | -1 + 0 | | zero | 2 | 2 | 2 | 2 + 0 | | zero | 2 | 2 | 3 | -3 + 0 | | zero | 2 | 2 | 2 | 4 + 0 | | zero | 2 | 2 | 5 | -5 + 0 | | zero | 2 | 2 | 5 | -5 + 0 | | zero | 2 | 2 | 0 | + 0 | | zero | 2 | 2 | | + 0 | | zero | 2 | 2 | | 0 + | | null | 2 | 2 | 1 | -1 + | | null | 2 | 2 | 2 | 2 + | | null | 2 | 2 | 3 | -3 + | | null | 2 | 2 | 2 | 4 + | | null | 2 | 2 | 5 | -5 + | | null | 2 | 2 | 5 | -5 + | | null | 2 | 2 | 0 | + | | null | 2 | 2 | | + | | null | 2 | 2 | | 0 + | 0 | zero | 2 | 2 | 1 | -1 + | 0 | zero | 2 | 2 | 2 | 2 + | 0 | zero | 2 | 2 | 3 | -3 + | 0 | zero | 2 | 2 | 2 | 4 + | 0 | zero | 2 | 2 | 5 | -5 + | 0 | zero | 2 | 2 | 5 | -5 + | 0 | zero | 2 | 2 | 0 | + | 0 | zero | 2 | 2 | | + | 0 | zero | 2 | 2 | | 0 + 1 | 4 | one | 3 | -3 | 1 | -1 + 1 | 4 | one | 3 | -3 | 2 | 2 + 1 | 4 | one | 3 | -3 | 3 | -3 + 1 | 4 | one | 3 | -3 | 2 | 4 + 1 | 4 | one | 3 | -3 | 5 | -5 + 1 | 4 | one | 3 | -3 | 5 | -5 + 1 | 4 | one | 3 | -3 | 0 | + 1 | 4 | one | 3 | -3 | | + 1 | 4 | one | 3 | -3 | | 0 + 2 | 3 | two | 3 | -3 | 1 | -1 + 2 | 3 | two | 3 | -3 | 2 | 2 + 2 | 3 | two | 3 | -3 | 3 | -3 + 2 | 3 | two | 3 | -3 | 2 | 4 + 2 | 3 | two | 3 | -3 | 5 | -5 + 2 | 3 | two | 3 | -3 | 5 | -5 + 2 | 3 | two | 3 | -3 | 0 | + 2 | 3 | two | 3 | -3 | | + 2 | 3 | two | 3 | -3 | | 0 + 3 | 2 | three | 3 | -3 | 1 | -1 + 3 | 2 | three | 3 | -3 | 2 | 2 + 3 | 2 | three | 3 | -3 | 3 | -3 + 3 | 2 | three | 3 | -3 | 2 | 4 + 3 | 2 | three | 3 | -3 | 5 | -5 + 3 | 2 | three | 3 | -3 | 5 | -5 + 3 | 2 | three | 3 | -3 | 0 | + 3 | 2 | three | 3 | -3 | | + 3 | 2 | three | 3 | -3 | | 0 + 4 | 1 | four | 3 | -3 | 1 | -1 + 4 | 1 | four | 3 | -3 | 2 | 2 + 4 | 1 | four | 3 | -3 | 3 | -3 + 4 | 1 | four | 3 | -3 | 2 | 4 + 4 | 1 | four | 3 | -3 | 5 | -5 + 4 | 1 | four | 3 | -3 | 5 | -5 + 4 | 1 | four | 3 | -3 | 0 | + 4 | 1 | four | 3 | -3 | | + 4 | 1 | four | 3 | -3 | | 0 + 5 | 0 | five | 3 | -3 | 1 | -1 + 5 | 0 | five | 3 | -3 | 2 | 2 + 5 | 0 | five | 3 | -3 | 3 | -3 + 5 | 0 | five | 3 | -3 | 2 | 4 + 5 | 0 | five | 3 | -3 | 5 | -5 + 5 | 0 | five | 3 | -3 | 5 | -5 + 5 | 0 | five | 3 | -3 | 0 | + 5 | 0 | five | 3 | -3 | | + 5 | 0 | five | 3 | -3 | | 0 + 6 | 6 | six | 3 | -3 | 1 | -1 + 6 | 6 | six | 3 | -3 | 2 | 2 + 6 | 6 | six | 3 | -3 | 3 | -3 + 6 | 6 | six | 3 | -3 | 2 | 4 + 6 | 6 | six | 3 | -3 | 5 | -5 + 6 | 6 | six | 3 | -3 | 5 | -5 + 6 | 6 | six | 3 | -3 | 0 | + 6 | 6 | six | 3 | -3 | | + 6 | 6 | six | 3 | -3 | | 0 + 7 | 7 | seven | 3 | -3 | 1 | -1 + 7 | 7 | seven | 3 | -3 | 2 | 2 + 7 | 7 | seven | 3 | -3 | 3 | -3 + 7 | 7 | seven | 3 | -3 | 2 | 4 + 7 | 7 | seven | 3 | -3 | 5 | -5 + 7 | 7 | seven | 3 | -3 | 5 | -5 + 7 | 7 | seven | 3 | -3 | 0 | + 7 | 7 | seven | 3 | -3 | | + 7 | 7 | seven | 3 | -3 | | 0 + 8 | 8 | eight | 3 | -3 | 1 | -1 + 8 | 8 | eight | 3 | -3 | 2 | 2 + 8 | 8 | eight | 3 | -3 | 3 | -3 + 8 | 8 | eight | 3 | -3 | 2 | 4 + 8 | 8 | eight | 3 | -3 | 5 | -5 + 8 | 8 | eight | 3 | -3 | 5 | -5 + 8 | 8 | eight | 3 | -3 | 0 | + 8 | 8 | eight | 3 | -3 | | + 8 | 8 | eight | 3 | -3 | | 0 + 0 | | zero | 3 | -3 | 1 | -1 + 0 | | zero | 3 | -3 | 2 | 2 + 0 | | zero | 3 | -3 | 3 | -3 + 0 | | zero | 3 | -3 | 2 | 4 + 0 | | zero | 3 | -3 | 5 | -5 + 0 | | zero | 3 | -3 | 5 | -5 + 0 | | zero | 3 | -3 | 0 | + 0 | | zero | 3 | -3 | | + 0 | | zero | 3 | -3 | | 0 + | | null | 3 | -3 | 1 | -1 + | | null | 3 | -3 | 2 | 2 + | | null | 3 | -3 | 3 | -3 + | | null | 3 | -3 | 2 | 4 + | | null | 3 | -3 | 5 | -5 + | | null | 3 | -3 | 5 | -5 + | | null | 3 | -3 | 0 | + | | null | 3 | -3 | | + | | null | 3 | -3 | | 0 + | 0 | zero | 3 | -3 | 1 | -1 + | 0 | zero | 3 | -3 | 2 | 2 + | 0 | zero | 3 | -3 | 3 | -3 + | 0 | zero | 3 | -3 | 2 | 4 + | 0 | zero | 3 | -3 | 5 | -5 + | 0 | zero | 3 | -3 | 5 | -5 + | 0 | zero | 3 | -3 | 0 | + | 0 | zero | 3 | -3 | | + | 0 | zero | 3 | -3 | | 0 + 1 | 4 | one | 2 | 4 | 1 | -1 + 1 | 4 | one | 2 | 4 | 2 | 2 + 1 | 4 | one | 2 | 4 | 3 | -3 + 1 | 4 | one | 2 | 4 | 2 | 4 + 1 | 4 | one | 2 | 4 | 5 | -5 + 1 | 4 | one | 2 | 4 | 5 | -5 + 1 | 4 | one | 2 | 4 | 0 | + 1 | 4 | one | 2 | 4 | | + 1 | 4 | one | 2 | 4 | | 0 + 2 | 3 | two | 2 | 4 | 1 | -1 + 2 | 3 | two | 2 | 4 | 2 | 2 + 2 | 3 | two | 2 | 4 | 3 | -3 + 2 | 3 | two | 2 | 4 | 2 | 4 + 2 | 3 | two | 2 | 4 | 5 | -5 + 2 | 3 | two | 2 | 4 | 5 | -5 + 2 | 3 | two | 2 | 4 | 0 | + 2 | 3 | two | 2 | 4 | | + 2 | 3 | two | 2 | 4 | | 0 + 3 | 2 | three | 2 | 4 | 1 | -1 + 3 | 2 | three | 2 | 4 | 2 | 2 + 3 | 2 | three | 2 | 4 | 3 | -3 + 3 | 2 | three | 2 | 4 | 2 | 4 + 3 | 2 | three | 2 | 4 | 5 | -5 + 3 | 2 | three | 2 | 4 | 5 | -5 + 3 | 2 | three | 2 | 4 | 0 | + 3 | 2 | three | 2 | 4 | | + 3 | 2 | three | 2 | 4 | | 0 + 4 | 1 | four | 2 | 4 | 1 | -1 + 4 | 1 | four | 2 | 4 | 2 | 2 + 4 | 1 | four | 2 | 4 | 3 | -3 + 4 | 1 | four | 2 | 4 | 2 | 4 + 4 | 1 | four | 2 | 4 | 5 | -5 + 4 | 1 | four | 2 | 4 | 5 | -5 + 4 | 1 | four | 2 | 4 | 0 | + 4 | 1 | four | 2 | 4 | | + 4 | 1 | four | 2 | 4 | | 0 + 5 | 0 | five | 2 | 4 | 1 | -1 + 5 | 0 | five | 2 | 4 | 2 | 2 + 5 | 0 | five | 2 | 4 | 3 | -3 + 5 | 0 | five | 2 | 4 | 2 | 4 + 5 | 0 | five | 2 | 4 | 5 | -5 + 5 | 0 | five | 2 | 4 | 5 | -5 + 5 | 0 | five | 2 | 4 | 0 | + 5 | 0 | five | 2 | 4 | | + 5 | 0 | five | 2 | 4 | | 0 + 6 | 6 | six | 2 | 4 | 1 | -1 + 6 | 6 | six | 2 | 4 | 2 | 2 + 6 | 6 | six | 2 | 4 | 3 | -3 + 6 | 6 | six | 2 | 4 | 2 | 4 + 6 | 6 | six | 2 | 4 | 5 | -5 + 6 | 6 | six | 2 | 4 | 5 | -5 + 6 | 6 | six | 2 | 4 | 0 | + 6 | 6 | six | 2 | 4 | | + 6 | 6 | six | 2 | 4 | | 0 + 7 | 7 | seven | 2 | 4 | 1 | -1 + 7 | 7 | seven | 2 | 4 | 2 | 2 + 7 | 7 | seven | 2 | 4 | 3 | -3 + 7 | 7 | seven | 2 | 4 | 2 | 4 + 7 | 7 | seven | 2 | 4 | 5 | -5 + 7 | 7 | seven | 2 | 4 | 5 | -5 + 7 | 7 | seven | 2 | 4 | 0 | + 7 | 7 | seven | 2 | 4 | | + 7 | 7 | seven | 2 | 4 | | 0 + 8 | 8 | eight | 2 | 4 | 1 | -1 + 8 | 8 | eight | 2 | 4 | 2 | 2 + 8 | 8 | eight | 2 | 4 | 3 | -3 + 8 | 8 | eight | 2 | 4 | 2 | 4 + 8 | 8 | eight | 2 | 4 | 5 | -5 + 8 | 8 | eight | 2 | 4 | 5 | -5 + 8 | 8 | eight | 2 | 4 | 0 | + 8 | 8 | eight | 2 | 4 | | + 8 | 8 | eight | 2 | 4 | | 0 + 0 | | zero | 2 | 4 | 1 | -1 + 0 | | zero | 2 | 4 | 2 | 2 + 0 | | zero | 2 | 4 | 3 | -3 + 0 | | zero | 2 | 4 | 2 | 4 + 0 | | zero | 2 | 4 | 5 | -5 + 0 | | zero | 2 | 4 | 5 | -5 + 0 | | zero | 2 | 4 | 0 | + 0 | | zero | 2 | 4 | | + 0 | | zero | 2 | 4 | | 0 + | | null | 2 | 4 | 1 | -1 + | | null | 2 | 4 | 2 | 2 + | | null | 2 | 4 | 3 | -3 + | | null | 2 | 4 | 2 | 4 + | | null | 2 | 4 | 5 | -5 + | | null | 2 | 4 | 5 | -5 + | | null | 2 | 4 | 0 | + | | null | 2 | 4 | | + | | null | 2 | 4 | | 0 + | 0 | zero | 2 | 4 | 1 | -1 + | 0 | zero | 2 | 4 | 2 | 2 + | 0 | zero | 2 | 4 | 3 | -3 + | 0 | zero | 2 | 4 | 2 | 4 + | 0 | zero | 2 | 4 | 5 | -5 + | 0 | zero | 2 | 4 | 5 | -5 + | 0 | zero | 2 | 4 | 0 | + | 0 | zero | 2 | 4 | | + | 0 | zero | 2 | 4 | | 0 + 1 | 4 | one | 5 | -5 | 1 | -1 + 1 | 4 | one | 5 | -5 | 2 | 2 + 1 | 4 | one | 5 | -5 | 3 | -3 + 1 | 4 | one | 5 | -5 | 2 | 4 + 1 | 4 | one | 5 | -5 | 5 | -5 + 1 | 4 | one | 5 | -5 | 5 | -5 + 1 | 4 | one | 5 | -5 | 0 | + 1 | 4 | one | 5 | -5 | | + 1 | 4 | one | 5 | -5 | | 0 + 2 | 3 | two | 5 | -5 | 1 | -1 + 2 | 3 | two | 5 | -5 | 2 | 2 + 2 | 3 | two | 5 | -5 | 3 | -3 + 2 | 3 | two | 5 | -5 | 2 | 4 + 2 | 3 | two | 5 | -5 | 5 | -5 + 2 | 3 | two | 5 | -5 | 5 | -5 + 2 | 3 | two | 5 | -5 | 0 | + 2 | 3 | two | 5 | -5 | | + 2 | 3 | two | 5 | -5 | | 0 + 3 | 2 | three | 5 | -5 | 1 | -1 + 3 | 2 | three | 5 | -5 | 2 | 2 + 3 | 2 | three | 5 | -5 | 3 | -3 + 3 | 2 | three | 5 | -5 | 2 | 4 + 3 | 2 | three | 5 | -5 | 5 | -5 + 3 | 2 | three | 5 | -5 | 5 | -5 + 3 | 2 | three | 5 | -5 | 0 | + 3 | 2 | three | 5 | -5 | | + 3 | 2 | three | 5 | -5 | | 0 + 4 | 1 | four | 5 | -5 | 1 | -1 + 4 | 1 | four | 5 | -5 | 2 | 2 + 4 | 1 | four | 5 | -5 | 3 | -3 + 4 | 1 | four | 5 | -5 | 2 | 4 + 4 | 1 | four | 5 | -5 | 5 | -5 + 4 | 1 | four | 5 | -5 | 5 | -5 + 4 | 1 | four | 5 | -5 | 0 | + 4 | 1 | four | 5 | -5 | | + 4 | 1 | four | 5 | -5 | | 0 + 5 | 0 | five | 5 | -5 | 1 | -1 + 5 | 0 | five | 5 | -5 | 2 | 2 + 5 | 0 | five | 5 | -5 | 3 | -3 + 5 | 0 | five | 5 | -5 | 2 | 4 + 5 | 0 | five | 5 | -5 | 5 | -5 + 5 | 0 | five | 5 | -5 | 5 | -5 + 5 | 0 | five | 5 | -5 | 0 | + 5 | 0 | five | 5 | -5 | | + 5 | 0 | five | 5 | -5 | | 0 + 6 | 6 | six | 5 | -5 | 1 | -1 + 6 | 6 | six | 5 | -5 | 2 | 2 + 6 | 6 | six | 5 | -5 | 3 | -3 + 6 | 6 | six | 5 | -5 | 2 | 4 + 6 | 6 | six | 5 | -5 | 5 | -5 + 6 | 6 | six | 5 | -5 | 5 | -5 + 6 | 6 | six | 5 | -5 | 0 | + 6 | 6 | six | 5 | -5 | | + 6 | 6 | six | 5 | -5 | | 0 + 7 | 7 | seven | 5 | -5 | 1 | -1 + 7 | 7 | seven | 5 | -5 | 2 | 2 + 7 | 7 | seven | 5 | -5 | 3 | -3 + 7 | 7 | seven | 5 | -5 | 2 | 4 + 7 | 7 | seven | 5 | -5 | 5 | -5 + 7 | 7 | seven | 5 | -5 | 5 | -5 + 7 | 7 | seven | 5 | -5 | 0 | + 7 | 7 | seven | 5 | -5 | | + 7 | 7 | seven | 5 | -5 | | 0 + 8 | 8 | eight | 5 | -5 | 1 | -1 + 8 | 8 | eight | 5 | -5 | 2 | 2 + 8 | 8 | eight | 5 | -5 | 3 | -3 + 8 | 8 | eight | 5 | -5 | 2 | 4 + 8 | 8 | eight | 5 | -5 | 5 | -5 + 8 | 8 | eight | 5 | -5 | 5 | -5 + 8 | 8 | eight | 5 | -5 | 0 | + 8 | 8 | eight | 5 | -5 | | + 8 | 8 | eight | 5 | -5 | | 0 + 0 | | zero | 5 | -5 | 1 | -1 + 0 | | zero | 5 | -5 | 2 | 2 + 0 | | zero | 5 | -5 | 3 | -3 + 0 | | zero | 5 | -5 | 2 | 4 + 0 | | zero | 5 | -5 | 5 | -5 + 0 | | zero | 5 | -5 | 5 | -5 + 0 | | zero | 5 | -5 | 0 | + 0 | | zero | 5 | -5 | | + 0 | | zero | 5 | -5 | | 0 + | | null | 5 | -5 | 1 | -1 + | | null | 5 | -5 | 2 | 2 + | | null | 5 | -5 | 3 | -3 + | | null | 5 | -5 | 2 | 4 + | | null | 5 | -5 | 5 | -5 + | | null | 5 | -5 | 5 | -5 + | | null | 5 | -5 | 0 | + | | null | 5 | -5 | | + | | null | 5 | -5 | | 0 + | 0 | zero | 5 | -5 | 1 | -1 + | 0 | zero | 5 | -5 | 2 | 2 + | 0 | zero | 5 | -5 | 3 | -3 + | 0 | zero | 5 | -5 | 2 | 4 + | 0 | zero | 5 | -5 | 5 | -5 + | 0 | zero | 5 | -5 | 5 | -5 + | 0 | zero | 5 | -5 | 0 | + | 0 | zero | 5 | -5 | | + | 0 | zero | 5 | -5 | | 0 + 1 | 4 | one | 5 | -5 | 1 | -1 + 1 | 4 | one | 5 | -5 | 2 | 2 + 1 | 4 | one | 5 | -5 | 3 | -3 + 1 | 4 | one | 5 | -5 | 2 | 4 + 1 | 4 | one | 5 | -5 | 5 | -5 + 1 | 4 | one | 5 | -5 | 5 | -5 + 1 | 4 | one | 5 | -5 | 0 | + 1 | 4 | one | 5 | -5 | | + 1 | 4 | one | 5 | -5 | | 0 + 2 | 3 | two | 5 | -5 | 1 | -1 + 2 | 3 | two | 5 | -5 | 2 | 2 + 2 | 3 | two | 5 | -5 | 3 | -3 + 2 | 3 | two | 5 | -5 | 2 | 4 + 2 | 3 | two | 5 | -5 | 5 | -5 + 2 | 3 | two | 5 | -5 | 5 | -5 + 2 | 3 | two | 5 | -5 | 0 | + 2 | 3 | two | 5 | -5 | | + 2 | 3 | two | 5 | -5 | | 0 + 3 | 2 | three | 5 | -5 | 1 | -1 + 3 | 2 | three | 5 | -5 | 2 | 2 + 3 | 2 | three | 5 | -5 | 3 | -3 + 3 | 2 | three | 5 | -5 | 2 | 4 + 3 | 2 | three | 5 | -5 | 5 | -5 + 3 | 2 | three | 5 | -5 | 5 | -5 + 3 | 2 | three | 5 | -5 | 0 | + 3 | 2 | three | 5 | -5 | | + 3 | 2 | three | 5 | -5 | | 0 + 4 | 1 | four | 5 | -5 | 1 | -1 + 4 | 1 | four | 5 | -5 | 2 | 2 + 4 | 1 | four | 5 | -5 | 3 | -3 + 4 | 1 | four | 5 | -5 | 2 | 4 + 4 | 1 | four | 5 | -5 | 5 | -5 + 4 | 1 | four | 5 | -5 | 5 | -5 + 4 | 1 | four | 5 | -5 | 0 | + 4 | 1 | four | 5 | -5 | | + 4 | 1 | four | 5 | -5 | | 0 + 5 | 0 | five | 5 | -5 | 1 | -1 + 5 | 0 | five | 5 | -5 | 2 | 2 + 5 | 0 | five | 5 | -5 | 3 | -3 + 5 | 0 | five | 5 | -5 | 2 | 4 + 5 | 0 | five | 5 | -5 | 5 | -5 + 5 | 0 | five | 5 | -5 | 5 | -5 + 5 | 0 | five | 5 | -5 | 0 | + 5 | 0 | five | 5 | -5 | | + 5 | 0 | five | 5 | -5 | | 0 + 6 | 6 | six | 5 | -5 | 1 | -1 + 6 | 6 | six | 5 | -5 | 2 | 2 + 6 | 6 | six | 5 | -5 | 3 | -3 + 6 | 6 | six | 5 | -5 | 2 | 4 + 6 | 6 | six | 5 | -5 | 5 | -5 + 6 | 6 | six | 5 | -5 | 5 | -5 + 6 | 6 | six | 5 | -5 | 0 | + 6 | 6 | six | 5 | -5 | | + 6 | 6 | six | 5 | -5 | | 0 + 7 | 7 | seven | 5 | -5 | 1 | -1 + 7 | 7 | seven | 5 | -5 | 2 | 2 + 7 | 7 | seven | 5 | -5 | 3 | -3 + 7 | 7 | seven | 5 | -5 | 2 | 4 + 7 | 7 | seven | 5 | -5 | 5 | -5 + 7 | 7 | seven | 5 | -5 | 5 | -5 + 7 | 7 | seven | 5 | -5 | 0 | + 7 | 7 | seven | 5 | -5 | | + 7 | 7 | seven | 5 | -5 | | 0 + 8 | 8 | eight | 5 | -5 | 1 | -1 + 8 | 8 | eight | 5 | -5 | 2 | 2 + 8 | 8 | eight | 5 | -5 | 3 | -3 + 8 | 8 | eight | 5 | -5 | 2 | 4 + 8 | 8 | eight | 5 | -5 | 5 | -5 + 8 | 8 | eight | 5 | -5 | 5 | -5 + 8 | 8 | eight | 5 | -5 | 0 | + 8 | 8 | eight | 5 | -5 | | + 8 | 8 | eight | 5 | -5 | | 0 + 0 | | zero | 5 | -5 | 1 | -1 + 0 | | zero | 5 | -5 | 2 | 2 + 0 | | zero | 5 | -5 | 3 | -3 + 0 | | zero | 5 | -5 | 2 | 4 + 0 | | zero | 5 | -5 | 5 | -5 + 0 | | zero | 5 | -5 | 5 | -5 + 0 | | zero | 5 | -5 | 0 | + 0 | | zero | 5 | -5 | | + 0 | | zero | 5 | -5 | | 0 + | | null | 5 | -5 | 1 | -1 + | | null | 5 | -5 | 2 | 2 + | | null | 5 | -5 | 3 | -3 + | | null | 5 | -5 | 2 | 4 + | | null | 5 | -5 | 5 | -5 + | | null | 5 | -5 | 5 | -5 + | | null | 5 | -5 | 0 | + | | null | 5 | -5 | | + | | null | 5 | -5 | | 0 + | 0 | zero | 5 | -5 | 1 | -1 + | 0 | zero | 5 | -5 | 2 | 2 + | 0 | zero | 5 | -5 | 3 | -3 + | 0 | zero | 5 | -5 | 2 | 4 + | 0 | zero | 5 | -5 | 5 | -5 + | 0 | zero | 5 | -5 | 5 | -5 + | 0 | zero | 5 | -5 | 0 | + | 0 | zero | 5 | -5 | | + | 0 | zero | 5 | -5 | | 0 + 1 | 4 | one | 0 | | 1 | -1 + 1 | 4 | one | 0 | | 2 | 2 + 1 | 4 | one | 0 | | 3 | -3 + 1 | 4 | one | 0 | | 2 | 4 + 1 | 4 | one | 0 | | 5 | -5 + 1 | 4 | one | 0 | | 5 | -5 + 1 | 4 | one | 0 | | 0 | + 1 | 4 | one | 0 | | | + 1 | 4 | one | 0 | | | 0 + 2 | 3 | two | 0 | | 1 | -1 + 2 | 3 | two | 0 | | 2 | 2 + 2 | 3 | two | 0 | | 3 | -3 + 2 | 3 | two | 0 | | 2 | 4 + 2 | 3 | two | 0 | | 5 | -5 + 2 | 3 | two | 0 | | 5 | -5 + 2 | 3 | two | 0 | | 0 | + 2 | 3 | two | 0 | | | + 2 | 3 | two | 0 | | | 0 + 3 | 2 | three | 0 | | 1 | -1 + 3 | 2 | three | 0 | | 2 | 2 + 3 | 2 | three | 0 | | 3 | -3 + 3 | 2 | three | 0 | | 2 | 4 + 3 | 2 | three | 0 | | 5 | -5 + 3 | 2 | three | 0 | | 5 | -5 + 3 | 2 | three | 0 | | 0 | + 3 | 2 | three | 0 | | | + 3 | 2 | three | 0 | | | 0 + 4 | 1 | four | 0 | | 1 | -1 + 4 | 1 | four | 0 | | 2 | 2 + 4 | 1 | four | 0 | | 3 | -3 + 4 | 1 | four | 0 | | 2 | 4 + 4 | 1 | four | 0 | | 5 | -5 + 4 | 1 | four | 0 | | 5 | -5 + 4 | 1 | four | 0 | | 0 | + 4 | 1 | four | 0 | | | + 4 | 1 | four | 0 | | | 0 + 5 | 0 | five | 0 | | 1 | -1 + 5 | 0 | five | 0 | | 2 | 2 + 5 | 0 | five | 0 | | 3 | -3 + 5 | 0 | five | 0 | | 2 | 4 + 5 | 0 | five | 0 | | 5 | -5 + 5 | 0 | five | 0 | | 5 | -5 + 5 | 0 | five | 0 | | 0 | + 5 | 0 | five | 0 | | | + 5 | 0 | five | 0 | | | 0 + 6 | 6 | six | 0 | | 1 | -1 + 6 | 6 | six | 0 | | 2 | 2 + 6 | 6 | six | 0 | | 3 | -3 + 6 | 6 | six | 0 | | 2 | 4 + 6 | 6 | six | 0 | | 5 | -5 + 6 | 6 | six | 0 | | 5 | -5 + 6 | 6 | six | 0 | | 0 | + 6 | 6 | six | 0 | | | + 6 | 6 | six | 0 | | | 0 + 7 | 7 | seven | 0 | | 1 | -1 + 7 | 7 | seven | 0 | | 2 | 2 + 7 | 7 | seven | 0 | | 3 | -3 + 7 | 7 | seven | 0 | | 2 | 4 + 7 | 7 | seven | 0 | | 5 | -5 + 7 | 7 | seven | 0 | | 5 | -5 + 7 | 7 | seven | 0 | | 0 | + 7 | 7 | seven | 0 | | | + 7 | 7 | seven | 0 | | | 0 + 8 | 8 | eight | 0 | | 1 | -1 + 8 | 8 | eight | 0 | | 2 | 2 + 8 | 8 | eight | 0 | | 3 | -3 + 8 | 8 | eight | 0 | | 2 | 4 + 8 | 8 | eight | 0 | | 5 | -5 + 8 | 8 | eight | 0 | | 5 | -5 + 8 | 8 | eight | 0 | | 0 | + 8 | 8 | eight | 0 | | | + 8 | 8 | eight | 0 | | | 0 + 0 | | zero | 0 | | 1 | -1 + 0 | | zero | 0 | | 2 | 2 + 0 | | zero | 0 | | 3 | -3 + 0 | | zero | 0 | | 2 | 4 + 0 | | zero | 0 | | 5 | -5 + 0 | | zero | 0 | | 5 | -5 + 0 | | zero | 0 | | 0 | + 0 | | zero | 0 | | | + 0 | | zero | 0 | | | 0 + | | null | 0 | | 1 | -1 + | | null | 0 | | 2 | 2 + | | null | 0 | | 3 | -3 + | | null | 0 | | 2 | 4 + | | null | 0 | | 5 | -5 + | | null | 0 | | 5 | -5 + | | null | 0 | | 0 | + | | null | 0 | | | + | | null | 0 | | | 0 + | 0 | zero | 0 | | 1 | -1 + | 0 | zero | 0 | | 2 | 2 + | 0 | zero | 0 | | 3 | -3 + | 0 | zero | 0 | | 2 | 4 + | 0 | zero | 0 | | 5 | -5 + | 0 | zero | 0 | | 5 | -5 + | 0 | zero | 0 | | 0 | + | 0 | zero | 0 | | | + | 0 | zero | 0 | | | 0 + 1 | 4 | one | | | 1 | -1 + 1 | 4 | one | | | 2 | 2 + 1 | 4 | one | | | 3 | -3 + 1 | 4 | one | | | 2 | 4 + 1 | 4 | one | | | 5 | -5 + 1 | 4 | one | | | 5 | -5 + 1 | 4 | one | | | 0 | + 1 | 4 | one | | | | + 1 | 4 | one | | | | 0 + 2 | 3 | two | | | 1 | -1 + 2 | 3 | two | | | 2 | 2 + 2 | 3 | two | | | 3 | -3 + 2 | 3 | two | | | 2 | 4 + 2 | 3 | two | | | 5 | -5 + 2 | 3 | two | | | 5 | -5 + 2 | 3 | two | | | 0 | + 2 | 3 | two | | | | + 2 | 3 | two | | | | 0 + 3 | 2 | three | | | 1 | -1 + 3 | 2 | three | | | 2 | 2 + 3 | 2 | three | | | 3 | -3 + 3 | 2 | three | | | 2 | 4 + 3 | 2 | three | | | 5 | -5 + 3 | 2 | three | | | 5 | -5 + 3 | 2 | three | | | 0 | + 3 | 2 | three | | | | + 3 | 2 | three | | | | 0 + 4 | 1 | four | | | 1 | -1 + 4 | 1 | four | | | 2 | 2 + 4 | 1 | four | | | 3 | -3 + 4 | 1 | four | | | 2 | 4 + 4 | 1 | four | | | 5 | -5 + 4 | 1 | four | | | 5 | -5 + 4 | 1 | four | | | 0 | + 4 | 1 | four | | | | + 4 | 1 | four | | | | 0 + 5 | 0 | five | | | 1 | -1 + 5 | 0 | five | | | 2 | 2 + 5 | 0 | five | | | 3 | -3 + 5 | 0 | five | | | 2 | 4 + 5 | 0 | five | | | 5 | -5 + 5 | 0 | five | | | 5 | -5 + 5 | 0 | five | | | 0 | + 5 | 0 | five | | | | + 5 | 0 | five | | | | 0 + 6 | 6 | six | | | 1 | -1 + 6 | 6 | six | | | 2 | 2 + 6 | 6 | six | | | 3 | -3 + 6 | 6 | six | | | 2 | 4 + 6 | 6 | six | | | 5 | -5 + 6 | 6 | six | | | 5 | -5 + 6 | 6 | six | | | 0 | + 6 | 6 | six | | | | + 6 | 6 | six | | | | 0 + 7 | 7 | seven | | | 1 | -1 + 7 | 7 | seven | | | 2 | 2 + 7 | 7 | seven | | | 3 | -3 + 7 | 7 | seven | | | 2 | 4 + 7 | 7 | seven | | | 5 | -5 + 7 | 7 | seven | | | 5 | -5 + 7 | 7 | seven | | | 0 | + 7 | 7 | seven | | | | + 7 | 7 | seven | | | | 0 + 8 | 8 | eight | | | 1 | -1 + 8 | 8 | eight | | | 2 | 2 + 8 | 8 | eight | | | 3 | -3 + 8 | 8 | eight | | | 2 | 4 + 8 | 8 | eight | | | 5 | -5 + 8 | 8 | eight | | | 5 | -5 + 8 | 8 | eight | | | 0 | + 8 | 8 | eight | | | | + 8 | 8 | eight | | | | 0 + 0 | | zero | | | 1 | -1 + 0 | | zero | | | 2 | 2 + 0 | | zero | | | 3 | -3 + 0 | | zero | | | 2 | 4 + 0 | | zero | | | 5 | -5 + 0 | | zero | | | 5 | -5 + 0 | | zero | | | 0 | + 0 | | zero | | | | + 0 | | zero | | | | 0 + | | null | | | 1 | -1 + | | null | | | 2 | 2 + | | null | | | 3 | -3 + | | null | | | 2 | 4 + | | null | | | 5 | -5 + | | null | | | 5 | -5 + | | null | | | 0 | + | | null | | | | + | | null | | | | 0 + | 0 | zero | | | 1 | -1 + | 0 | zero | | | 2 | 2 + | 0 | zero | | | 3 | -3 + | 0 | zero | | | 2 | 4 + | 0 | zero | | | 5 | -5 + | 0 | zero | | | 5 | -5 + | 0 | zero | | | 0 | + | 0 | zero | | | | + | 0 | zero | | | | 0 + 1 | 4 | one | | 0 | 1 | -1 + 1 | 4 | one | | 0 | 2 | 2 + 1 | 4 | one | | 0 | 3 | -3 + 1 | 4 | one | | 0 | 2 | 4 + 1 | 4 | one | | 0 | 5 | -5 + 1 | 4 | one | | 0 | 5 | -5 + 1 | 4 | one | | 0 | 0 | + 1 | 4 | one | | 0 | | + 1 | 4 | one | | 0 | | 0 + 2 | 3 | two | | 0 | 1 | -1 + 2 | 3 | two | | 0 | 2 | 2 + 2 | 3 | two | | 0 | 3 | -3 + 2 | 3 | two | | 0 | 2 | 4 + 2 | 3 | two | | 0 | 5 | -5 + 2 | 3 | two | | 0 | 5 | -5 + 2 | 3 | two | | 0 | 0 | + 2 | 3 | two | | 0 | | + 2 | 3 | two | | 0 | | 0 + 3 | 2 | three | | 0 | 1 | -1 + 3 | 2 | three | | 0 | 2 | 2 + 3 | 2 | three | | 0 | 3 | -3 + 3 | 2 | three | | 0 | 2 | 4 + 3 | 2 | three | | 0 | 5 | -5 + 3 | 2 | three | | 0 | 5 | -5 + 3 | 2 | three | | 0 | 0 | + 3 | 2 | three | | 0 | | + 3 | 2 | three | | 0 | | 0 + 4 | 1 | four | | 0 | 1 | -1 + 4 | 1 | four | | 0 | 2 | 2 + 4 | 1 | four | | 0 | 3 | -3 + 4 | 1 | four | | 0 | 2 | 4 + 4 | 1 | four | | 0 | 5 | -5 + 4 | 1 | four | | 0 | 5 | -5 + 4 | 1 | four | | 0 | 0 | + 4 | 1 | four | | 0 | | + 4 | 1 | four | | 0 | | 0 + 5 | 0 | five | | 0 | 1 | -1 + 5 | 0 | five | | 0 | 2 | 2 + 5 | 0 | five | | 0 | 3 | -3 + 5 | 0 | five | | 0 | 2 | 4 + 5 | 0 | five | | 0 | 5 | -5 + 5 | 0 | five | | 0 | 5 | -5 + 5 | 0 | five | | 0 | 0 | + 5 | 0 | five | | 0 | | + 5 | 0 | five | | 0 | | 0 + 6 | 6 | six | | 0 | 1 | -1 + 6 | 6 | six | | 0 | 2 | 2 + 6 | 6 | six | | 0 | 3 | -3 + 6 | 6 | six | | 0 | 2 | 4 + 6 | 6 | six | | 0 | 5 | -5 + 6 | 6 | six | | 0 | 5 | -5 + 6 | 6 | six | | 0 | 0 | + 6 | 6 | six | | 0 | | + 6 | 6 | six | | 0 | | 0 + 7 | 7 | seven | | 0 | 1 | -1 + 7 | 7 | seven | | 0 | 2 | 2 + 7 | 7 | seven | | 0 | 3 | -3 + 7 | 7 | seven | | 0 | 2 | 4 + 7 | 7 | seven | | 0 | 5 | -5 + 7 | 7 | seven | | 0 | 5 | -5 + 7 | 7 | seven | | 0 | 0 | + 7 | 7 | seven | | 0 | | + 7 | 7 | seven | | 0 | | 0 + 8 | 8 | eight | | 0 | 1 | -1 + 8 | 8 | eight | | 0 | 2 | 2 + 8 | 8 | eight | | 0 | 3 | -3 + 8 | 8 | eight | | 0 | 2 | 4 + 8 | 8 | eight | | 0 | 5 | -5 + 8 | 8 | eight | | 0 | 5 | -5 + 8 | 8 | eight | | 0 | 0 | + 8 | 8 | eight | | 0 | | + 8 | 8 | eight | | 0 | | 0 + 0 | | zero | | 0 | 1 | -1 + 0 | | zero | | 0 | 2 | 2 + 0 | | zero | | 0 | 3 | -3 + 0 | | zero | | 0 | 2 | 4 + 0 | | zero | | 0 | 5 | -5 + 0 | | zero | | 0 | 5 | -5 + 0 | | zero | | 0 | 0 | + 0 | | zero | | 0 | | + 0 | | zero | | 0 | | 0 + | | null | | 0 | 1 | -1 + | | null | | 0 | 2 | 2 + | | null | | 0 | 3 | -3 + | | null | | 0 | 2 | 4 + | | null | | 0 | 5 | -5 + | | null | | 0 | 5 | -5 + | | null | | 0 | 0 | + | | null | | 0 | | + | | null | | 0 | | 0 + | 0 | zero | | 0 | 1 | -1 + | 0 | zero | | 0 | 2 | 2 + | 0 | zero | | 0 | 3 | -3 + | 0 | zero | | 0 | 2 | 4 + | 0 | zero | | 0 | 5 | -5 + | 0 | zero | | 0 | 5 | -5 + | 0 | zero | | 0 | 0 | + | 0 | zero | | 0 | | + | 0 | zero | | 0 | | 0 +(891 rows) + +-- +-- +-- Inner joins (equi-joins) +-- +-- +-- +-- Inner joins (equi-joins) with USING clause +-- The USING syntax changes the shape of the resulting table +-- by including a column in the USING clause only once in the result. +-- +-- Inner equi-join on specified column +SELECT * + FROM J1_TBL INNER JOIN J2_TBL USING (i); + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 5 | 0 | five | -5 + 5 | 0 | five | -5 +(7 rows) + +-- Same as above, slightly different syntax +SELECT * + FROM J1_TBL JOIN J2_TBL USING (i); + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 5 | 0 | five | -5 + 5 | 0 | five | -5 +(7 rows) + +SELECT * + FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a) + ORDER BY a, d; + a | b | c | d +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 5 | 0 | five | -5 + 5 | 0 | five | -5 +(7 rows) + +SELECT * + FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b) + ORDER BY b, t1.a; + b | a | c | a +---+---+-------+--- + 0 | 5 | five | + 0 | | zero | + 2 | 3 | three | 2 + 4 | 1 | one | 2 +(4 rows) + +-- test join using aliases +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) WHERE J1_TBL.t = 'one'; -- ok + i | j | t | k +---+---+-----+---- + 1 | 4 | one | -1 +(1 row) + +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; -- ok + i | j | t | k +---+---+-----+---- + 1 | 4 | one | -1 +(1 row) + +SELECT * FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t = 'one'; -- error +ERROR: invalid reference to FROM-clause entry for table "j1_tbl" +LINE 1: ... * FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t =... + ^ +HINT: There is an entry for table "j1_tbl", but it cannot be referenced from this part of the query. +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.i = 1; -- ok + i | j | t | k +---+---+-----+---- + 1 | 4 | one | -1 +(1 row) + +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one'; -- error +ERROR: column x.t does not exist +LINE 1: ...CT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one... + ^ +SELECT * FROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; -- error (XXX could use better hint) +ERROR: missing FROM-clause entry for table "x" +LINE 1: ...ROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; + ^ +SELECT * FROM J1_TBL a1 JOIN J2_TBL a2 USING (i) AS a1; -- error +ERROR: table name "a1" specified more than once +SELECT x.* FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; + i +--- + 1 +(1 row) + +SELECT ROW(x.*) FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; + row +----- + (1) +(1 row) + +SELECT row_to_json(x.*) FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; + row_to_json +------------- + {"i":1} +(1 row) + +-- +-- NATURAL JOIN +-- Inner equi-join on all columns with the same name +-- +SELECT * + FROM J1_TBL NATURAL JOIN J2_TBL; + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 5 | 0 | five | -5 + 5 | 0 | five | -5 +(7 rows) + +SELECT * + FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d); + a | b | c | d +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 5 | 0 | five | -5 + 5 | 0 | five | -5 +(7 rows) + +SELECT * + FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a); + a | b | c | d +---+---+------+--- + 0 | | zero | + 2 | 3 | two | 2 + 4 | 1 | four | 2 +(3 rows) + +-- mismatch number of columns +-- currently, Postgres will fill in with underlying names +SELECT * + FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a); + a | b | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 5 | 0 | five | -5 + 5 | 0 | five | -5 +(7 rows) + +-- +-- Inner joins (equi-joins) +-- +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i); + i | j | t | i | k +---+---+-------+---+---- + 0 | | zero | 0 | + 1 | 4 | one | 1 | -1 + 2 | 3 | two | 2 | 2 + 2 | 3 | two | 2 | 4 + 3 | 2 | three | 3 | -3 + 5 | 0 | five | 5 | -5 + 5 | 0 | five | 5 | -5 +(7 rows) + +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k); + i | j | t | i | k +---+---+------+---+--- + 0 | | zero | | 0 + 2 | 3 | two | 2 | 2 + 4 | 1 | four | 2 | 4 +(3 rows) + +-- +-- Non-equi-joins +-- +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k); + i | j | t | i | k +---+---+-------+---+--- + 1 | 4 | one | 2 | 2 + 2 | 3 | two | 2 | 2 + 0 | | zero | 2 | 2 + 1 | 4 | one | 2 | 4 + 2 | 3 | two | 2 | 4 + 3 | 2 | three | 2 | 4 + 4 | 1 | four | 2 | 4 + 0 | | zero | 2 | 4 + 0 | | zero | | 0 +(9 rows) + +-- +-- Outer joins +-- Note that OUTER is a noise word +-- +SELECT * + FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i) + ORDER BY i, k, t; + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 4 | 1 | four | + 5 | 0 | five | -5 + 5 | 0 | five | -5 + 6 | 6 | six | + 7 | 7 | seven | + 8 | 8 | eight | + | | null | + | 0 | zero | +(13 rows) + +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) + ORDER BY i, k, t; + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 4 | 1 | four | + 5 | 0 | five | -5 + 5 | 0 | five | -5 + 6 | 6 | six | + 7 | 7 | seven | + 8 | 8 | eight | + | | null | + | 0 | zero | +(13 rows) + +SELECT * + FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i); + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 5 | 0 | five | -5 + 5 | 0 | five | -5 + | | | + | | | 0 +(9 rows) + +SELECT * + FROM J1_TBL RIGHT JOIN J2_TBL USING (i); + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 5 | 0 | five | -5 + 5 | 0 | five | -5 + | | | + | | | 0 +(9 rows) + +SELECT * + FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i) + ORDER BY i, k, t; + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 4 | 1 | four | + 5 | 0 | five | -5 + 5 | 0 | five | -5 + 6 | 6 | six | + 7 | 7 | seven | + 8 | 8 | eight | + | | | 0 + | | null | + | 0 | zero | + | | | +(15 rows) + +SELECT * + FROM J1_TBL FULL JOIN J2_TBL USING (i) + ORDER BY i, k, t; + i | j | t | k +---+---+-------+---- + 0 | | zero | + 1 | 4 | one | -1 + 2 | 3 | two | 2 + 2 | 3 | two | 4 + 3 | 2 | three | -3 + 4 | 1 | four | + 5 | 0 | five | -5 + 5 | 0 | five | -5 + 6 | 6 | six | + 7 | 7 | seven | + 8 | 8 | eight | + | | | 0 + | | null | + | 0 | zero | + | | | +(15 rows) + +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1); + i | j | t | k +---+---+---+--- +(0 rows) + +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1); + i | j | t | k +---+---+-----+---- + 1 | 4 | one | -1 +(1 row) + +-- +-- semijoin selectivity for <> +-- +explain (costs off) +select * from int4_tbl i4, tenk1 a +where exists(select * from tenk1 b + where a.twothousand = b.twothousand and a.fivethous <> b.fivethous) + and i4.f1 = a.tenthous; + QUERY PLAN +---------------------------------------------- + Hash Semi Join + Hash Cond: (a.twothousand = b.twothousand) + Join Filter: (a.fivethous <> b.fivethous) + -> Hash Join + Hash Cond: (a.tenthous = i4.f1) + -> Seq Scan on tenk1 a + -> Hash + -> Seq Scan on int4_tbl i4 + -> Hash + -> Seq Scan on tenk1 b + Optimizer: Postgres query optimizer +(11 rows) + +-- +-- More complicated constructs +-- +-- +-- Multiway full join +-- +CREATE TABLE t1 (name TEXT, n INTEGER); +CREATE TABLE t2 (name TEXT, n INTEGER); +CREATE TABLE t3 (name TEXT, n INTEGER); +INSERT INTO t1 VALUES ( 'bb', 11 ); +INSERT INTO t2 VALUES ( 'bb', 12 ); +INSERT INTO t2 VALUES ( 'cc', 22 ); +INSERT INTO t2 VALUES ( 'ee', 42 ); +INSERT INTO t3 VALUES ( 'bb', 13 ); +INSERT INTO t3 VALUES ( 'cc', 23 ); +INSERT INTO t3 VALUES ( 'dd', 33 ); +SELECT * FROM t1 FULL JOIN t2 USING (name) FULL JOIN t3 USING (name); + name | n | n | n +------+----+----+---- + bb | 11 | 12 | 13 + cc | | 22 | 23 + dd | | | 33 + ee | | 42 | +(4 rows) + +-- +-- Test interactions of join syntax and subqueries +-- +-- Basic cases (we expect planner to pull up the subquery here) +SELECT * FROM +(SELECT * FROM t2) as s2 +INNER JOIN +(SELECT * FROM t3) s3 +USING (name); + name | n | n +------+----+---- + bb | 12 | 13 + cc | 22 | 23 +(2 rows) + +SELECT * FROM +(SELECT * FROM t2) as s2 +LEFT JOIN +(SELECT * FROM t3) s3 +USING (name); + name | n | n +------+----+---- + bb | 12 | 13 + cc | 22 | 23 + ee | 42 | +(3 rows) + +SELECT * FROM +(SELECT * FROM t2) as s2 +FULL JOIN +(SELECT * FROM t3) s3 +USING (name); + name | n | n +------+----+---- + bb | 12 | 13 + cc | 22 | 23 + dd | | 33 + ee | 42 | +(4 rows) + +-- Cases with non-nullable expressions in subquery results; +-- make sure these go to null as expected +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL INNER JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + name | s2_n | s2_2 | s3_n | s3_2 +------+------+------+------+------ + bb | 12 | 2 | 13 | 3 + cc | 22 | 2 | 23 | 3 +(2 rows) + +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL LEFT JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + name | s2_n | s2_2 | s3_n | s3_2 +------+------+------+------+------ + bb | 12 | 2 | 13 | 3 + cc | 22 | 2 | 23 | 3 + ee | 42 | 2 | | +(3 rows) + +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL FULL JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + name | s2_n | s2_2 | s3_n | s3_2 +------+------+------+------+------ + bb | 12 | 2 | 13 | 3 + cc | 22 | 2 | 23 | 3 + dd | | | 33 | 3 + ee | 42 | 2 | | +(4 rows) + +SELECT * FROM +(SELECT name, n as s1_n, 1 as s1_1 FROM t1) as s1 +NATURAL INNER JOIN +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL INNER JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + name | s1_n | s1_1 | s2_n | s2_2 | s3_n | s3_2 +------+------+------+------+------+------+------ + bb | 11 | 1 | 12 | 2 | 13 | 3 +(1 row) + +SELECT * FROM +(SELECT name, n as s1_n, 1 as s1_1 FROM t1) as s1 +NATURAL FULL JOIN +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL FULL JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + name | s1_n | s1_1 | s2_n | s2_2 | s3_n | s3_2 +------+------+------+------+------+------+------ + bb | 11 | 1 | 12 | 2 | 13 | 3 + cc | | | 22 | 2 | 23 | 3 + dd | | | | | 33 | 3 + ee | | | 42 | 2 | | +(4 rows) + +SELECT * FROM +(SELECT name, n as s1_n FROM t1) as s1 +NATURAL FULL JOIN + (SELECT * FROM + (SELECT name, n as s2_n FROM t2) as s2 + NATURAL FULL JOIN + (SELECT name, n as s3_n FROM t3) as s3 + ) ss2; + name | s1_n | s2_n | s3_n +------+------+------+------ + bb | 11 | 12 | 13 + cc | | 22 | 23 + dd | | | 33 + ee | | 42 | +(4 rows) + +SELECT * FROM +(SELECT name, n as s1_n FROM t1) as s1 +NATURAL FULL JOIN + (SELECT * FROM + (SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 + NATURAL FULL JOIN + (SELECT name, n as s3_n FROM t3) as s3 + ) ss2; + name | s1_n | s2_n | s2_2 | s3_n +------+------+------+------+------ + bb | 11 | 12 | 2 | 13 + cc | | 22 | 2 | 23 + dd | | | | 33 + ee | | 42 | 2 | +(4 rows) + +-- Constants as join keys can also be problematic +SELECT * FROM + (SELECT name, n as s1_n FROM t1) as s1 +FULL JOIN + (SELECT name, 2 as s2_n FROM t2) as s2 +ON (s1_n = s2_n); + name | s1_n | name | s2_n +------+------+------+------ + | | bb | 2 + | | cc | 2 + | | ee | 2 + bb | 11 | | +(4 rows) + +-- Test for propagation of nullability constraints into sub-joins +create temp table x (x1 int, x2 int); +insert into x values (1,11); +insert into x values (2,22); +insert into x values (3,null); +insert into x values (4,44); +insert into x values (5,null); +create temp table y (y1 int, y2 int); +insert into y values (1,111); +insert into y values (2,222); +insert into y values (3,333); +insert into y values (4,null); +select * from x; + x1 | x2 +----+---- + 1 | 11 + 2 | 22 + 3 | + 4 | 44 + 5 | +(5 rows) + +select * from y; + y1 | y2 +----+----- + 1 | 111 + 2 | 222 + 3 | 333 + 4 | +(4 rows) + +select * from x left join y on (x1 = y1 and x2 is not null); + x1 | x2 | y1 | y2 +----+----+----+----- + 1 | 11 | 1 | 111 + 2 | 22 | 2 | 222 + 3 | | | + 4 | 44 | 4 | + 5 | | | +(5 rows) + +select * from x left join y on (x1 = y1 and y2 is not null); + x1 | x2 | y1 | y2 +----+----+----+----- + 1 | 11 | 1 | 111 + 2 | 22 | 2 | 222 + 3 | | 3 | 333 + 4 | 44 | | + 5 | | | +(5 rows) + +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1); + x1 | x2 | y1 | y2 | xx1 | xx2 +----+----+----+-----+-----+----- + 1 | 11 | 1 | 111 | 1 | 11 + 2 | 22 | 2 | 222 | 2 | 22 + 3 | | 3 | 333 | 3 | + 4 | 44 | 4 | | 4 | 44 + 5 | | | | 5 | +(5 rows) + +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and x2 is not null); + x1 | x2 | y1 | y2 | xx1 | xx2 +----+----+----+-----+-----+----- + 1 | 11 | 1 | 111 | 1 | 11 + 2 | 22 | 2 | 222 | 2 | 22 + 3 | | 3 | 333 | | + 4 | 44 | 4 | | 4 | 44 + 5 | | | | | +(5 rows) + +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and y2 is not null); + x1 | x2 | y1 | y2 | xx1 | xx2 +----+----+----+-----+-----+----- + 1 | 11 | 1 | 111 | 1 | 11 + 2 | 22 | 2 | 222 | 2 | 22 + 3 | | 3 | 333 | 3 | + 4 | 44 | 4 | | | + 5 | | | | | +(5 rows) + +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and xx2 is not null); + x1 | x2 | y1 | y2 | xx1 | xx2 +----+----+----+-----+-----+----- + 1 | 11 | 1 | 111 | 1 | 11 + 2 | 22 | 2 | 222 | 2 | 22 + 3 | | 3 | 333 | | + 4 | 44 | 4 | | 4 | 44 + 5 | | | | | +(5 rows) + +-- these should NOT give the same answers as above +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (x2 is not null); + x1 | x2 | y1 | y2 | xx1 | xx2 +----+----+----+-----+-----+----- + 1 | 11 | 1 | 111 | 1 | 11 + 2 | 22 | 2 | 222 | 2 | 22 + 4 | 44 | 4 | | 4 | 44 +(3 rows) + +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (y2 is not null); + x1 | x2 | y1 | y2 | xx1 | xx2 +----+----+----+-----+-----+----- + 1 | 11 | 1 | 111 | 1 | 11 + 2 | 22 | 2 | 222 | 2 | 22 + 3 | | 3 | 333 | 3 | +(3 rows) + +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (xx2 is not null); + x1 | x2 | y1 | y2 | xx1 | xx2 +----+----+----+-----+-----+----- + 1 | 11 | 1 | 111 | 1 | 11 + 2 | 22 | 2 | 222 | 2 | 22 + 4 | 44 | 4 | | 4 | 44 +(3 rows) + +-- +-- regression test: check for bug with propagation of implied equality +-- to outside an IN +-- +select count(*) from tenk1 a where unique1 in + (select unique1 from tenk1 b join tenk1 c using (unique1) + where b.unique2 = 42); + count +------- + 1 +(1 row) + +-- +-- regression test: check for failure to generate a plan with multiple +-- degenerate IN clauses +-- +select count(*) from tenk1 x where + x.unique1 in (select a.f1 from int4_tbl a,float8_tbl b where a.f1=b.f1) and + x.unique1 = 0 and + x.unique1 in (select aa.f1 from int4_tbl aa,float8_tbl bb where aa.f1=bb.f1); + count +------- + 1 +(1 row) + +-- try that with GEQO too +begin; +set geqo = on; +WARNING: "geqo": setting is ignored because it is defunct +set geqo_threshold = 2; +WARNING: "geqo_threshold": setting is ignored because it is defunct +select count(*) from tenk1 x where + x.unique1 in (select a.f1 from int4_tbl a,float8_tbl b where a.f1=b.f1) and + x.unique1 = 0 and + x.unique1 in (select aa.f1 from int4_tbl aa,float8_tbl bb where aa.f1=bb.f1); + count +------- + 1 +(1 row) + +rollback; +-- +-- regression test: be sure we cope with proven-dummy append rels +-- +explain (costs off) +select aa, bb, unique1, unique1 + from tenk1 right join b on aa = unique1 + where bb < bb and bb is null; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select aa, bb, unique1, unique1 + from tenk1 right join b on aa = unique1 + where bb < bb and bb is null; + aa | bb | unique1 | unique1 +----+----+---------+--------- +(0 rows) + +-- +-- regression test: check handling of empty-FROM subquery underneath outer join +-- +explain (costs off) +select * from int8_tbl i1 left join (int8_tbl i2 join + (select 123 as x) ss on i2.q1 = x) on i1.q2 = i2.q2 +order by 1, 2; + QUERY PLAN +------------------------------------------- + Sort + Sort Key: i1.q1, i1.q2 + -> Hash Left Join + Hash Cond: (i1.q2 = i2.q2) + -> Seq Scan on int8_tbl i1 + -> Hash + -> Seq Scan on int8_tbl i2 + Filter: (q1 = 123) + Optimizer: Postgres query optimizer +(9 rows) + +select * from int8_tbl i1 left join (int8_tbl i2 join + (select 123 as x) ss on i2.q1 = x) on i1.q2 = i2.q2 +order by 1, 2; + q1 | q2 | q1 | q2 | x +------------------+-------------------+-----+------------------+----- + 123 | 456 | 123 | 456 | 123 + 123 | 4567890123456789 | 123 | 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 | | | + 4567890123456789 | 123 | | | + 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 123 +(5 rows) + +-- +-- regression test: check a case where join_clause_is_movable_into() gives +-- an imprecise result, causing an assertion failure +-- +select count(*) +from + (select t3.tenthous as x1, coalesce(t1.stringu1, t2.stringu1) as x2 + from tenk1 t1 + left join tenk1 t2 on t1.unique1 = t2.unique1 + join tenk1 t3 on t1.unique2 = t3.unique2) ss, + tenk1 t4, + tenk1 t5 +where t4.thousand = t5.unique1 and ss.x1 = t4.tenthous and ss.x2 = t5.stringu1; + count +------- + 1000 +(1 row) + +-- +-- regression test: check a case where we formerly missed including an EC +-- enforcement clause because it was expected to be handled at scan level +-- +explain (costs off) +select a.f1, b.f1, t.thousand, t.tenthous from + tenk1 t, + (select sum(f1)+1 as f1 from int4_tbl i4a) a, + (select sum(f1) as f1 from int4_tbl i4b) b +where b.f1 = t.thousand and a.f1 = b.f1 and (a.f1+b.f1+999) = t.tenthous; + QUERY PLAN +----------------------------------------------------------------------------- + Hash Join + Hash Cond: (t.thousand = (sum(i4b.f1))) + Join Filter: (((((sum(i4a.f1) + 1)) + (sum(i4b.f1))) + 999) = t.tenthous) + -> Hash Join + Hash Cond: (t.thousand = ((sum(i4a.f1) + 1))) + -> Seq Scan on tenk1 t + -> Hash + -> Aggregate + -> Seq Scan on int4_tbl i4a + -> Hash + -> Aggregate + -> Seq Scan on int4_tbl i4b + Optimizer: Postgres query optimizer +(13 rows) + +select a.f1, b.f1, t.thousand, t.tenthous from + tenk1 t, + (select sum(f1)+1 as f1 from int4_tbl i4a) a, + (select sum(f1) as f1 from int4_tbl i4b) b +where b.f1 = t.thousand and a.f1 = b.f1 and (a.f1+b.f1+999) = t.tenthous; + f1 | f1 | thousand | tenthous +----+----+----------+---------- +(0 rows) + +-- +-- check a case where we formerly got confused by conflicting sort orders +-- in redundant merge join path keys +-- +explain (costs off) +select * from + j1_tbl full join + (select * from j2_tbl order by j2_tbl.i desc, j2_tbl.k asc) j2_tbl + on j1_tbl.i = j2_tbl.i and j1_tbl.i = j2_tbl.k; + QUERY PLAN +---------------------------------------------------------------- + Hash Full Join + Hash Cond: ((j2_tbl.i = j1_tbl.i) AND (j2_tbl.k = j1_tbl.i)) + -> Sort + Sort Key: j2_tbl.i DESC, j2_tbl.k + -> Seq Scan on j2_tbl + -> Hash + -> Seq Scan on j1_tbl + Optimizer: Postgres query optimizer +(8 rows) + +select * from + j1_tbl full join + (select * from j2_tbl order by j2_tbl.i desc, j2_tbl.k asc) j2_tbl + on j1_tbl.i = j2_tbl.i and j1_tbl.i = j2_tbl.k; --order none + i | j | t | i | k +---+---+-------+---+---- + | | | | 0 + | | | | + | 0 | zero | | + | | null | | + 8 | 8 | eight | | + 7 | 7 | seven | | + 6 | 6 | six | | + | | | 5 | -5 + | | | 5 | -5 + 5 | 0 | five | | + 4 | 1 | four | | + | | | 3 | -3 + 3 | 2 | three | | + 2 | 3 | two | 2 | 2 + | | | 2 | 4 + | | | 1 | -1 + | | | 0 | + 1 | 4 | one | | + 0 | | zero | | +(19 rows) + +reset enable_mergejoin; +reset enable_hashjoin; +-- +-- a different check for handling of redundant sort keys in merge joins +-- +explain (costs off) +select count(*) from + (select * from tenk1 x order by x.thousand, x.twothousand, x.fivethous) x + left join + (select * from tenk1 y order by y.unique2) y + on x.thousand = y.unique2 and x.twothousand = y.hundred and x.fivethous = y.unique2; + QUERY PLAN +------------------------------------------------------------------------------------------------------------- + Aggregate + -> Hash Left Join + Hash Cond: ((x.thousand = y.unique2) AND (x.twothousand = y.hundred) AND (x.fivethous = y.unique2)) + -> Sort + Sort Key: x.thousand, x.twothousand, x.fivethous + -> Seq Scan on tenk1 x + -> Hash + -> Subquery Scan on y + -> Index Scan using tenk1_unique2 on tenk1 y_1 + Optimizer: Postgres query optimizer +(10 rows) + +select count(*) from + (select * from tenk1 x order by x.thousand, x.twothousand, x.fivethous) x + left join + (select * from tenk1 y order by y.unique2) y + on x.thousand = y.unique2 and x.twothousand = y.hundred and x.fivethous = y.unique2; + count +------- + 10000 +(1 row) + +-- +-- Clean up +-- +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE J1_TBL; +DROP TABLE J2_TBL; +-- Both DELETE and UPDATE allow the specification of additional tables +-- to "join" against to determine which rows should be modified. +CREATE TEMP TABLE t1 (a int, b int); +CREATE TEMP TABLE t2 (a int, b int); +CREATE TEMP TABLE t3 (x int, y int); +INSERT INTO t1 VALUES (5, 10); +INSERT INTO t1 VALUES (15, 20); +INSERT INTO t1 VALUES (100, 100); +INSERT INTO t1 VALUES (200, 1000); +INSERT INTO t2 VALUES (200, 2000); +INSERT INTO t3 VALUES (5, 20); +INSERT INTO t3 VALUES (6, 7); +INSERT INTO t3 VALUES (7, 8); +INSERT INTO t3 VALUES (500, 100); +DELETE FROM t3 USING t1 table1 WHERE t3.x = table1.a; +SELECT * FROM t3; + x | y +-----+----- + 6 | 7 + 7 | 8 + 500 | 100 +(3 rows) + +DELETE FROM t3 USING t1 JOIN t2 USING (a) WHERE t3.x > t1.a; +SELECT * FROM t3; + x | y +---+--- + 6 | 7 + 7 | 8 +(2 rows) + +DELETE FROM t3 USING t3 t3_other WHERE t3.x = t3_other.x AND t3.y = t3_other.y; +SELECT * FROM t3; + x | y +---+--- +(0 rows) + +-- Test join against inheritance tree +create temp table t2a () inherits (t2); +insert into t2a values (200, 2001); +select * from t1 left join t2 on (t1.a = t2.a); + a | b | a | b +-----+------+-----+------ + 200 | 1000 | 200 | 2000 + 200 | 1000 | 200 | 2001 + 100 | 100 | | + 15 | 20 | | + 5 | 10 | | +(5 rows) + +-- Test matching of column name with wrong alias +select t1.x from t1 join t3 on (t1.a = t3.x); +ERROR: column t1.x does not exist +LINE 1: select t1.x from t1 join t3 on (t1.a = t3.x); + ^ +HINT: Perhaps you meant to reference the column "t3.x". +-- +-- regression test for 8.1 merge right join bug +-- +CREATE TEMP TABLE tt1 ( tt1_id int4, joincol int4 ); +INSERT INTO tt1 VALUES (1, 11); +INSERT INTO tt1 VALUES (2, NULL); +CREATE TEMP TABLE tt2 ( tt2_id int4, joincol int4 ); +INSERT INTO tt2 VALUES (21, 11); +INSERT INTO tt2 VALUES (22, 11); +set enable_hashjoin to off; +set enable_nestloop to off; +-- these should give the same results +select tt1.*, tt2.* from tt1 left join tt2 on tt1.joincol = tt2.joincol; + tt1_id | joincol | tt2_id | joincol +--------+---------+--------+--------- + 1 | 11 | 21 | 11 + 1 | 11 | 22 | 11 + 2 | | | +(3 rows) + +select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol; + tt1_id | joincol | tt2_id | joincol +--------+---------+--------+--------- + 1 | 11 | 21 | 11 + 1 | 11 | 22 | 11 + 2 | | | +(3 rows) + +reset enable_hashjoin; +reset enable_nestloop; +-- +-- regression test for bug #13908 (hash join with skew tuples & nbatch increase) +-- +set work_mem to '64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set enable_mergejoin to off; +set enable_memoize to off; +explain (costs off) +select count(*) from tenk1 a, tenk1 b + where a.hundred = b.thousand and (b.fivethous % 10) < 10; + QUERY PLAN +------------------------------------------------------------------ + Aggregate + -> Hash Join + Hash Cond: (b.thousand = a.hundred) + -> Seq Scan on tenk1 b + Filter: ((fivethous % 10) < 10) + -> Hash + -> Index Only Scan using tenk1_hundred on tenk1 a + Optimizer: Postgres query optimizer +(8 rows) + +select count(*) from tenk1 a, tenk1 b + where a.hundred = b.thousand and (b.fivethous % 10) < 10; + count +-------- + 100000 +(1 row) + +reset work_mem; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +reset enable_mergejoin; +reset enable_memoize; +-- +-- regression test for 8.2 bug with improper re-ordering of left joins +-- +create temp table tt3(f1 int, f2 text); +insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x; +create index tt3i on tt3(f1); +analyze tt3; +create temp table tt4(f1 int); +insert into tt4 values (0),(1),(9999); +analyze tt4; +SELECT a.f1 +FROM tt4 a +LEFT JOIN ( + SELECT b.f1 + FROM tt3 b LEFT JOIN tt3 c ON (b.f1 = c.f1) + WHERE c.f1 IS NULL +) AS d ON (a.f1 = d.f1) +WHERE d.f1 IS NULL; + f1 +------ + 0 + 1 + 9999 +(3 rows) + +-- +-- regression test for proper handling of outer joins within antijoins +-- +create temp table tt4x(c1 int, c2 int, c3 int); +explain (costs off) +select * from tt4x t1 +where not exists ( + select 1 from tt4x t2 + left join tt4x t3 on t2.c3 = t3.c1 + left join ( select t5.c1 as c1 + from tt4x t4 left join tt4x t5 on t4.c2 = t5.c1 + ) a1 on t3.c2 = a1.c1 + where t1.c1 = t2.c2 +); + QUERY PLAN +--------------------------------------------------------- + Hash Anti Join + Hash Cond: (t1.c1 = t2.c2) + -> Seq Scan on tt4x t1 + -> Hash + -> Hash Left Join + Hash Cond: (t3.c2 = t5.c1) + -> Hash Left Join + Hash Cond: (t2.c3 = t3.c1) + -> Seq Scan on tt4x t2 + -> Hash + -> Seq Scan on tt4x t3 + -> Hash + -> Hash Join + Hash Cond: (t4.c2 = t5.c1) + -> Seq Scan on tt4x t4 + -> Hash + -> Seq Scan on tt4x t5 + Optimizer: Postgres query optimizer +(18 rows) + +-- +-- regression test for problems of the sort depicted in bug #3494 +-- +create temp table tt5(f1 int, f2 int); +create temp table tt6(f1 int, f2 int); +insert into tt5 values(1, 10); +insert into tt5 values(1, 11); +insert into tt6 values(1, 9); +insert into tt6 values(1, 2); +insert into tt6 values(2, 9); +select * from tt5,tt6 where tt5.f1 = tt6.f1 and tt5.f1 = tt5.f2 - tt6.f2; + f1 | f2 | f1 | f2 +----+----+----+---- + 1 | 10 | 1 | 9 +(1 row) + +-- +-- regression test for problems of the sort depicted in bug #3588 +-- +create temp table xx (pkxx int); +create temp table yy (pkyy int, pkxx int); +insert into xx values (1); +insert into xx values (2); +insert into xx values (3); +insert into yy values (101, 1); +insert into yy values (201, 2); +insert into yy values (301, NULL); +select yy.pkyy as yy_pkyy, yy.pkxx as yy_pkxx, yya.pkyy as yya_pkyy, + xxa.pkxx as xxa_pkxx, xxb.pkxx as xxb_pkxx +from yy + left join (SELECT * FROM yy where pkyy = 101) as yya ON yy.pkyy = yya.pkyy + left join xx xxa on yya.pkxx = xxa.pkxx + left join xx xxb on coalesce (xxa.pkxx, 1) = xxb.pkxx; + yy_pkyy | yy_pkxx | yya_pkyy | xxa_pkxx | xxb_pkxx +---------+---------+----------+----------+---------- + 101 | 1 | 101 | 1 | 1 + 201 | 2 | | | 1 + 301 | | | | 1 +(3 rows) + +-- +-- regression test for improper pushing of constants across outer-join clauses +-- (as seen in early 8.2.x releases) +-- +create temp table zt1 (f1 int primary key); +create temp table zt2 (f2 int primary key); +create temp table zt3 (f3 int primary key); +insert into zt1 values(53); +insert into zt2 values(53); +select * from + zt2 left join zt3 on (f2 = f3) + left join zt1 on (f3 = f1) +where f2 = 53; + f2 | f3 | f1 +----+----+---- + 53 | | +(1 row) + +create temp view zv1 as select *,'dummy'::text AS junk from zt1; +select * from + zt2 left join zt3 on (f2 = f3) + left join zv1 on (f3 = f1) +where f2 = 53; + f2 | f3 | f1 | junk +----+----+----+------ + 53 | | | +(1 row) + +-- +-- regression test for improper extraction of OR indexqual conditions +-- (as seen in early 8.3.x releases) +-- +select a.unique2, a.ten, b.tenthous, b.unique2, b.hundred +from tenk1 a left join tenk1 b on a.unique2 = b.tenthous +where a.unique1 = 42 and + ((b.unique2 is null and a.ten = 2) or b.hundred = 3); + unique2 | ten | tenthous | unique2 | hundred +---------+-----+----------+---------+--------- +(0 rows) + +-- +-- test proper positioning of one-time quals in EXISTS (8.4devel bug) +-- +prepare foo(bool) as + select count(*) from tenk1 a left join tenk1 b + on (a.unique2 = b.unique1 and exists + (select 1 from tenk1 c where c.thousand = b.unique2 and $1)); +execute foo(true); + count +------- + 10000 +(1 row) + +execute foo(false); + count +------- + 10000 +(1 row) + +-- +-- test for sane behavior with noncanonical merge clauses, per bug #4926 +-- +begin; +set enable_mergejoin = 1; +set enable_hashjoin = 0; +set enable_nestloop = 0; +create temp table a (i integer); +create temp table b (x integer, y integer); +select * from a left join b on i = x and i = y and x = i; + i | x | y +---+---+--- +(0 rows) + +rollback; +-- +-- test handling of merge clauses using record_ops +-- +begin; +create type mycomptype as (id int, v bigint); +create temp table tidv (idv mycomptype); +create index on tidv (idv); +explain (costs off) +select a.idv, b.idv from tidv a, tidv b where a.idv = b.idv; + QUERY PLAN +------------------------------------- + Hash Join + Hash Cond: (a.idv = b.idv) + -> Seq Scan on tidv a + -> Hash + -> Seq Scan on tidv b + Optimizer: Postgres query optimizer +(6 rows) + +set enable_mergejoin = 0; +set enable_hashjoin = 0; +explain (costs off) +select a.idv, b.idv from tidv a, tidv b where a.idv = b.idv; + QUERY PLAN +---------------------------------------------------------- + Merge Join + Merge Cond: (a.idv = b.idv) + -> Index Only Scan using tidv_idv_idx on tidv a + -> Materialize + -> Index Only Scan using tidv_idv_idx on tidv b + Optimizer: Postgres query optimizer +(6 rows) + +rollback; +-- +-- test NULL behavior of whole-row Vars, per bug #5025 +-- +select t1.q2, count(t2.*) +from int8_tbl t1 left join int8_tbl t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; + q2 | count +-------------------+------- + -4567890123456789 | 0 + 123 | 2 + 456 | 0 + 4567890123456789 | 6 +(4 rows) + +select t1.q2, count(t2.*) +from int8_tbl t1 left join (select * from int8_tbl) t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; + q2 | count +-------------------+------- + -4567890123456789 | 0 + 123 | 2 + 456 | 0 + 4567890123456789 | 6 +(4 rows) + +select t1.q2, count(t2.*) +from int8_tbl t1 left join (select * from int8_tbl offset 0) t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; + q2 | count +-------------------+------- + -4567890123456789 | 0 + 123 | 2 + 456 | 0 + 4567890123456789 | 6 +(4 rows) + +select t1.q2, count(t2.*) +from int8_tbl t1 left join + (select q1, case when q2=1 then 1 else q2 end as q2 from int8_tbl) t2 + on (t1.q2 = t2.q1) +group by t1.q2 order by 1; + q2 | count +-------------------+------- + -4567890123456789 | 0 + 123 | 2 + 456 | 0 + 4567890123456789 | 6 +(4 rows) + +-- +-- test incorrect failure to NULL pulled-up subexpressions +-- +begin; +create temp table a ( + code char not null, + constraint a_pk primary key (code) +); +create temp table b ( + a char not null, + num integer not null, + constraint b_pk primary key (a, num) +); +create temp table c ( + name char not null, + a char, + constraint c_pk primary key (name) +); +insert into a (code) values ('p'); +insert into a (code) values ('q'); +insert into b (a, num) values ('p', 1); +insert into b (a, num) values ('p', 2); +insert into c (name, a) values ('A', 'p'); +insert into c (name, a) values ('B', 'q'); +insert into c (name, a) values ('C', null); +select c.name, ss.code, ss.b_cnt, ss.const +from c left join + (select a.code, coalesce(b_grp.cnt, 0) as b_cnt, -1 as const + from a left join + (select count(1) as cnt, b.a from b group by b.a) as b_grp + on a.code = b_grp.a + ) as ss + on (c.a = ss.code) +order by c.name; + name | code | b_cnt | const +------+------+-------+------- + A | p | 2 | -1 + B | q | 0 | -1 + C | | | +(3 rows) + +rollback; +-- +-- test incorrect handling of placeholders that only appear in targetlists, +-- per bug #6154 +-- +SELECT * FROM +( SELECT 1 as key1 ) sub1 +LEFT JOIN +( SELECT sub3.key3, sub4.value2, COALESCE(sub4.value2, 66) as value3 FROM + ( SELECT 1 as key3 ) sub3 + LEFT JOIN + ( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM + ( SELECT 1 as key5 ) sub5 + LEFT JOIN + ( SELECT 2 as key6, 42 as value1 ) sub6 + ON sub5.key5 = sub6.key6 + ) sub4 + ON sub4.key5 = sub3.key3 +) sub2 +ON sub1.key1 = sub2.key3; + key1 | key3 | value2 | value3 +------+------+--------+-------- + 1 | 1 | 1 | 1 +(1 row) + +-- test the path using join aliases, too +SELECT * FROM +( SELECT 1 as key1 ) sub1 +LEFT JOIN +( SELECT sub3.key3, value2, COALESCE(value2, 66) as value3 FROM + ( SELECT 1 as key3 ) sub3 + LEFT JOIN + ( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM + ( SELECT 1 as key5 ) sub5 + LEFT JOIN + ( SELECT 2 as key6, 42 as value1 ) sub6 + ON sub5.key5 = sub6.key6 + ) sub4 + ON sub4.key5 = sub3.key3 +) sub2 +ON sub1.key1 = sub2.key3; + key1 | key3 | value2 | value3 +------+------+--------+-------- + 1 | 1 | 1 | 1 +(1 row) + +-- +-- test case where a PlaceHolderVar is used as a nestloop parameter +-- +EXPLAIN (COSTS OFF) +SELECT qq, unique1 + FROM + ( SELECT COALESCE(q1, 0) AS qq FROM int8_tbl a ) AS ss1 + FULL OUTER JOIN + ( SELECT COALESCE(q2, -1) AS qq FROM int8_tbl b ) AS ss2 + USING (qq) + INNER JOIN tenk1 c ON qq = unique2; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Hash Join + Hash Cond: (c.unique2 = COALESCE((COALESCE(a.q1, '0'::bigint)), (COALESCE(b.q2, '-1'::bigint)))) + -> Seq Scan on tenk1 c + -> Hash + -> Hash Full Join + Hash Cond: ((COALESCE(a.q1, '0'::bigint)) = (COALESCE(b.q2, '-1'::bigint))) + -> Seq Scan on int8_tbl a + -> Hash + -> Seq Scan on int8_tbl b + Optimizer: Postgres query optimizer +(10 rows) + +SELECT qq, unique1 + FROM + ( SELECT COALESCE(q1, 0) AS qq FROM int8_tbl a ) AS ss1 + FULL OUTER JOIN + ( SELECT COALESCE(q2, -1) AS qq FROM int8_tbl b ) AS ss2 + USING (qq) + INNER JOIN tenk1 c ON qq = unique2; + qq | unique1 +-----+--------- + 123 | 4596 + 123 | 4596 + 456 | 7318 +(3 rows) + +-- +-- nested nestloops can require nested PlaceHolderVars +-- +create temp table nt1 ( + id int primary key, + a1 boolean, + a2 boolean +); +create temp table nt2 ( + id int primary key, + nt1_id int, + b1 boolean, + b2 boolean, + foreign key (nt1_id) references nt1(id) +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +create temp table nt3 ( + id int primary key, + nt2_id int, + c1 boolean, + foreign key (nt2_id) references nt2(id) +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +insert into nt1 values (1,true,true); +insert into nt1 values (2,true,false); +insert into nt1 values (3,false,false); +insert into nt2 values (1,1,true,true); +insert into nt2 values (2,2,true,false); +insert into nt2 values (3,3,false,false); +insert into nt3 values (1,1,true); +insert into nt3 values (2,2,false); +insert into nt3 values (3,3,true); +explain (costs off) +select nt3.id +from nt3 as nt3 + left join + (select nt2.*, (nt2.b1 and ss1.a3) AS b3 + from nt2 as nt2 + left join + (select nt1.*, (nt1.id is not null) as a3 from nt1) as ss1 + on ss1.id = nt2.nt1_id + ) as ss2 + on ss2.id = nt3.nt2_id +where nt3.id = 1 and ss2.b3; + QUERY PLAN +---------------------------------------------------------- + Hash Join + Hash Cond: (nt1.id = nt2.nt1_id) + Join Filter: (nt2.b1 AND ((nt1.id IS NOT NULL))) + -> Seq Scan on nt1 + -> Hash + -> Hash Join + Hash Cond: (nt2.id = nt3.nt2_id) + -> Seq Scan on nt2 + -> Hash + -> Index Scan using nt3_pkey on nt3 + Index Cond: (id = 1) + Optimizer: Postgres query optimizer +(12 rows) + +select nt3.id +from nt3 as nt3 + left join + (select nt2.*, (nt2.b1 and ss1.a3) AS b3 + from nt2 as nt2 + left join + (select nt1.*, (nt1.id is not null) as a3 from nt1) as ss1 + on ss1.id = nt2.nt1_id + ) as ss2 + on ss2.id = nt3.nt2_id +where nt3.id = 1 and ss2.b3; + id +---- + 1 +(1 row) + +-- +-- test case where a PlaceHolderVar is propagated into a subquery +-- +explain (costs off) +select * from + int8_tbl t1 left join + (select q1 as x, 42 as y from int8_tbl t2) ss + on t1.q2 = ss.x +where + 1 = (select 1 from int8_tbl t3 where ss.y is not null limit 1) +order by 1,2; + QUERY PLAN +----------------------------------------------------------- + Sort + Sort Key: t1.q1, t1.q2 + -> Hash Left Join + Hash Cond: (t1.q2 = t2.q1) + Filter: ((SubPlan 1) = 1) + -> Seq Scan on int8_tbl t1 + -> Hash + -> Seq Scan on int8_tbl t2 + SubPlan 1 + -> Limit + -> Result + One-Time Filter: ((42) IS NOT NULL) + -> Seq Scan on int8_tbl t3 + Optimizer: Postgres query optimizer +(14 rows) + +select * from + int8_tbl t1 left join + (select q1 as x, 42 as y from int8_tbl t2) ss + on t1.q2 = ss.x +where + 1 = (select 1 from int8_tbl t3 where ss.y is not null limit 1) +order by 1,2; + q1 | q2 | x | y +------------------+------------------+------------------+---- + 123 | 4567890123456789 | 4567890123456789 | 42 + 123 | 4567890123456789 | 4567890123456789 | 42 + 123 | 4567890123456789 | 4567890123456789 | 42 + 4567890123456789 | 123 | 123 | 42 + 4567890123456789 | 123 | 123 | 42 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 42 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 42 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 42 +(8 rows) + +-- +-- variant where a PlaceHolderVar is needed at a join, but not above the join +-- +explain (costs off) +select * from + int4_tbl as i41, + lateral + (select 1 as x from + (select i41.f1 as lat, + i42.f1 as loc from + int8_tbl as i81, int4_tbl as i42) as ss1 + right join int4_tbl as i43 on (i43.f1 > 1) + where ss1.loc = ss1.lat) as ss2 +where i41.f1 > 0; + QUERY PLAN +-------------------------------------------------- + Nested Loop + -> Nested Loop + -> Seq Scan on int4_tbl i41 + Filter: (f1 > 0) + -> Nested Loop + Join Filter: (i41.f1 = i42.f1) + -> Seq Scan on int8_tbl i81 + -> Materialize + -> Seq Scan on int4_tbl i42 + -> Materialize + -> Seq Scan on int4_tbl i43 + Filter: (f1 > 1) + Optimizer: Postgres query optimizer +(13 rows) + +select * from + int4_tbl as i41, + lateral + (select 1 as x from + (select i41.f1 as lat, + i42.f1 as loc from + int8_tbl as i81, int4_tbl as i42) as ss1 + right join int4_tbl as i43 on (i43.f1 > 1) + where ss1.loc = ss1.lat) as ss2 +where i41.f1 > 0; + f1 | x +------------+--- + 123456 | 1 + 123456 | 1 + 123456 | 1 + 123456 | 1 + 123456 | 1 + 123456 | 1 + 123456 | 1 + 123456 | 1 + 123456 | 1 + 123456 | 1 + 2147483647 | 1 + 2147483647 | 1 + 2147483647 | 1 + 2147483647 | 1 + 2147483647 | 1 + 2147483647 | 1 + 2147483647 | 1 + 2147483647 | 1 + 2147483647 | 1 + 2147483647 | 1 +(20 rows) + +-- +-- test the corner cases FULL JOIN ON TRUE and FULL JOIN ON FALSE +-- +select * from int4_tbl a full join int4_tbl b on true; + f1 | f1 +-------------+------------- + 0 | 0 + 0 | 123456 + 0 | -123456 + 0 | 2147483647 + 0 | -2147483647 + 123456 | 0 + 123456 | 123456 + 123456 | -123456 + 123456 | 2147483647 + 123456 | -2147483647 + -123456 | 0 + -123456 | 123456 + -123456 | -123456 + -123456 | 2147483647 + -123456 | -2147483647 + 2147483647 | 0 + 2147483647 | 123456 + 2147483647 | -123456 + 2147483647 | 2147483647 + 2147483647 | -2147483647 + -2147483647 | 0 + -2147483647 | 123456 + -2147483647 | -123456 + -2147483647 | 2147483647 + -2147483647 | -2147483647 +(25 rows) + +select * from int4_tbl a full join int4_tbl b on false; + f1 | f1 +-------------+------------- + | 0 + | 123456 + | -123456 + | 2147483647 + | -2147483647 + 0 | + 123456 | + -123456 | + 2147483647 | + -2147483647 | +(10 rows) + +-- +-- test for ability to use a cartesian join when necessary +-- +create temp table q1 as select 1 as q1; +create temp table q2 as select 0 as q2; +analyze q1; +analyze q2; +explain (costs off) +select * from + tenk1 join int4_tbl on f1 = twothousand, + q1, q2 +where q1 = thousand or q2 = thousand; + QUERY PLAN +------------------------------------------------------------------------------ + Hash Join + Hash Cond: (tenk1.twothousand = int4_tbl.f1) + -> Nested Loop + -> Seq Scan on q2 + -> Nested Loop + -> Seq Scan on q1 + -> Bitmap Heap Scan on tenk1 + Recheck Cond: ((q1.q1 = thousand) OR (q2.q2 = thousand)) + -> BitmapOr + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (thousand = q1.q1) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (thousand = q2.q2) + -> Hash + -> Seq Scan on int4_tbl + Optimizer: Postgres query optimizer +(16 rows) + +explain (costs off) +select * from + tenk1 join int4_tbl on f1 = twothousand, + q1, q2 +where thousand = (q1 + q2); + QUERY PLAN +------------------------------------------------------ + Hash Join + Hash Cond: (tenk1.thousand = (q1.q1 + q2.q2)) + -> Hash Join + Hash Cond: (tenk1.twothousand = int4_tbl.f1) + -> Seq Scan on tenk1 + -> Hash + -> Seq Scan on int4_tbl + -> Hash + -> Nested Loop + -> Seq Scan on q1 + -> Seq Scan on q2 + Optimizer: Postgres query optimizer +(12 rows) + +-- +-- test ability to generate a suitable plan for a star-schema query +-- +explain (costs off) +select * from + tenk1, int8_tbl a, int8_tbl b +where thousand = a.q1 and tenthous = b.q1 and a.q2 = 1 and b.q2 = 2; + QUERY PLAN +-------------------------------------------- + Hash Join + Hash Cond: (tenk1.thousand = a.q1) + -> Hash Join + Hash Cond: (tenk1.tenthous = b.q1) + -> Seq Scan on tenk1 + -> Hash + -> Seq Scan on int8_tbl b + Filter: (q2 = 2) + -> Hash + -> Seq Scan on int8_tbl a + Filter: (q2 = 1) + Optimizer: Postgres query optimizer +(12 rows) + +-- +-- test a corner case in which we shouldn't apply the star-schema optimization +-- +explain (costs off) +select t1.unique2, t1.stringu1, t2.unique1, t2.stringu2 from + tenk1 t1 + inner join int4_tbl i1 + left join (select v1.x2, v2.y1, 11 AS d1 + from (select 1,0 from onerow) v1(x1,x2) + left join (select 3,1 from onerow) v2(y1,y2) + on v1.x1 = v2.y2) subq1 + on (i1.f1 = subq1.x2) + on (t1.unique2 = subq1.d1) + left join tenk1 t2 + on (subq1.y1 = t2.unique1) +where t1.unique2 < 42 and t1.stringu1 > t2.stringu2; + QUERY PLAN +-------------------------------------------------------------------- + Nested Loop + -> Hash Join + Hash Cond: (t2.unique1 = (3)) + Join Filter: (t1.stringu1 > t2.stringu2) + -> Seq Scan on tenk1 t2 + -> Hash + -> Hash Join + Hash Cond: (t1.unique2 = (11)) + -> Index Scan using tenk1_unique2 on tenk1 t1 + Index Cond: (unique2 < 42) + -> Hash + -> Nested Loop + Join Filter: (11 < 42) + -> Seq Scan on onerow + -> Seq Scan on onerow onerow_1 + -> Materialize + -> Seq Scan on int4_tbl i1 + Filter: (f1 = 0) + Optimizer: Postgres query optimizer +(19 rows) + +select t1.unique2, t1.stringu1, t2.unique1, t2.stringu2 from + tenk1 t1 + inner join int4_tbl i1 + left join (select v1.x2, v2.y1, 11 AS d1 + from (select 1,0 from onerow) v1(x1,x2) + left join (select 3,1 from onerow) v2(y1,y2) + on v1.x1 = v2.y2) subq1 + on (i1.f1 = subq1.x2) + on (t1.unique2 = subq1.d1) + left join tenk1 t2 + on (subq1.y1 = t2.unique1) +where t1.unique2 < 42 and t1.stringu1 > t2.stringu2; + unique2 | stringu1 | unique1 | stringu2 +---------+----------+---------+---------- + 11 | WFAAAA | 3 | LKIAAA +(1 row) + +-- variant that isn't quite a star-schema case +select ss1.d1 from + tenk1 as t1 + inner join tenk1 as t2 + on t1.tenthous = t2.ten + inner join + int8_tbl as i8 + left join int4_tbl as i4 + inner join (select 64::information_schema.cardinal_number as d1 + from tenk1 t3, + lateral (select abs(t3.unique1) + random()) ss0(x) + where t3.fivethous < 0) as ss1 + on i4.f1 = ss1.d1 + on i8.q1 = i4.f1 + on t1.tenthous = ss1.d1 +where t1.unique1 < i4.f1; + d1 +---- +(0 rows) + +-- this variant is foldable by the remove-useless-RESULT-RTEs code +explain (costs off) +select t1.unique2, t1.stringu1, t2.unique1, t2.stringu2 from + tenk1 t1 + inner join int4_tbl i1 + left join (select v1.x2, v2.y1, 11 AS d1 + from (values(1,0)) v1(x1,x2) + left join (values(3,1)) v2(y1,y2) + on v1.x1 = v2.y2) subq1 + on (i1.f1 = subq1.x2) + on (t1.unique2 = subq1.d1) + left join tenk1 t2 + on (subq1.y1 = t2.unique1) +where t1.unique2 < 42 and t1.stringu1 > t2.stringu2; + QUERY PLAN +-------------------------------------------------------------- + Hash Join + Hash Cond: (t2.unique1 = (3)) + Join Filter: (t1.stringu1 > t2.stringu2) + -> Seq Scan on tenk1 t2 + -> Hash + -> Hash Join + Hash Cond: (t1.unique2 = (11)) + -> Index Scan using tenk1_unique2 on tenk1 t1 + Index Cond: (unique2 < 42) + -> Hash + -> Seq Scan on int4_tbl i1 + Filter: ((11 < 42) AND (f1 = 0)) + Optimizer: Postgres query optimizer +(13 rows) + +select t1.unique2, t1.stringu1, t2.unique1, t2.stringu2 from + tenk1 t1 + inner join int4_tbl i1 + left join (select v1.x2, v2.y1, 11 AS d1 + from (values(1,0)) v1(x1,x2) + left join (values(3,1)) v2(y1,y2) + on v1.x1 = v2.y2) subq1 + on (i1.f1 = subq1.x2) + on (t1.unique2 = subq1.d1) + left join tenk1 t2 + on (subq1.y1 = t2.unique1) +where t1.unique2 < 42 and t1.stringu1 > t2.stringu2; + unique2 | stringu1 | unique1 | stringu2 +---------+----------+---------+---------- + 11 | WFAAAA | 3 | LKIAAA +(1 row) + +-- Here's a variant that we can't fold too aggressively, though, +-- or we end up with noplace to evaluate the lateral PHV +explain (verbose, costs off) +select * from + (select 1 as x) ss1 left join (select 2 as y) ss2 on (true), + lateral (select ss2.y as z limit 1) ss3; + QUERY PLAN +------------------------------------- + Nested Loop + Output: 1, (2), ((2)) + -> Result + Output: 2 + -> Materialize + Output: ((2)) + -> Limit + Output: ((2)) + -> Result + Output: (2) + Optimizer: Postgres query optimizer +(11 rows) + +select * from + (select 1 as x) ss1 left join (select 2 as y) ss2 on (true), + lateral (select ss2.y as z limit 1) ss3; + x | y | z +---+---+--- + 1 | 2 | 2 +(1 row) + +-- Test proper handling of appendrel PHVs during useless-RTE removal +explain (costs off) +select * from + (select 0 as z) as t1 + left join + (select true as a) as t2 + on true, + lateral (select true as b + union all + select a as b) as t3 +where b; + QUERY PLAN +--------------------------------------- + Nested Loop + -> Result + -> Append + -> Result + -> Result + One-Time Filter: (true) + Optimizer: Postgres query optimizer +(7 rows) + +select * from + (select 0 as z) as t1 + left join + (select true as a) as t2 + on true, + lateral (select true as b + union all + select a as b) as t3 +where b; + z | a | b +---+---+--- + 0 | t | t + 0 | t | t +(2 rows) + +-- +-- test inlining of immutable functions +-- +create function f_immutable_int4(i integer) returns integer as +$$ begin return i; end; $$ language plpgsql immutable; +-- check optimization of function scan with join +explain (costs off) +select unique1 from tenk1, (select * from f_immutable_int4(1) x) x +where x = unique1; + QUERY PLAN +---------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = 1) + Optimizer: Postgres query optimizer +(3 rows) + +explain (verbose, costs off) +select unique1, x.* +from tenk1, (select *, random() from f_immutable_int4(1) x) x +where x = unique1; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Hash Join + Output: tenk1.unique1, (1), (random()) + Hash Cond: (tenk1.unique1 = (1)) + -> Seq Scan on public.tenk1 + Output: tenk1.unique1, tenk1.unique2, tenk1.two, tenk1.four, tenk1.ten, tenk1.twenty, tenk1.hundred, tenk1.thousand, tenk1.twothousand, tenk1.fivethous, tenk1.tenthous, tenk1.odd, tenk1.even, tenk1.stringu1, tenk1.stringu2, tenk1.string4 + -> Hash + Output: (1), (random()) + -> Result + Output: 1, random() + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) +select unique1 from tenk1, f_immutable_int4(1) x where x = unique1; + QUERY PLAN +---------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = 1) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) +select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1; + QUERY PLAN +---------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = 1) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) +select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) +select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x; + QUERY PLAN +---------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = 1) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) +select unique1, x from tenk1 left join f_immutable_int4(1) x on unique1 = x; + QUERY PLAN +------------------------------------- + Nested Loop Left Join + Join Filter: (tenk1.unique1 = 1) + -> Seq Scan on tenk1 + -> Materialize + -> Result + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) +select unique1, x from tenk1 right join f_immutable_int4(1) x on unique1 = x; + QUERY PLAN +---------------------------------------------------- + Nested Loop Left Join + -> Result + -> Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = 1) + Optimizer: Postgres query optimizer +(5 rows) + +explain (costs off) +select unique1, x from tenk1 full join f_immutable_int4(1) x on unique1 = x; + QUERY PLAN +------------------------------------- + Hash Full Join + Hash Cond: (tenk1.unique1 = (1)) + -> Seq Scan on tenk1 + -> Hash + -> Result + Optimizer: Postgres query optimizer +(6 rows) + +-- check that pullup of a const function allows further const-folding +explain (costs off) +select unique1 from tenk1, f_immutable_int4(1) x where x = 42; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +-- test inlining of immutable functions with PlaceHolderVars +explain (costs off) +select nt3.id +from nt3 as nt3 + left join + (select nt2.*, (nt2.b1 or i4 = 42) AS b3 + from nt2 as nt2 + left join + f_immutable_int4(0) i4 + on i4 = nt2.nt1_id + ) as ss2 + on ss2.id = nt3.nt2_id +where nt3.id = 1 and ss2.b3; + QUERY PLAN +---------------------------------------------- + Hash Right Join + Hash Cond: (nt2.id = nt3.nt2_id) + Filter: ((nt2.b1 OR ((0) = 42))) + -> Nested Loop Left Join + Join Filter: (0 = nt2.nt1_id) + -> Index Scan using nt2_pkey on nt2 + -> Materialize + -> Result + -> Hash + -> Index Scan using nt3_pkey on nt3 + Index Cond: (id = 1) + Optimizer: Postgres query optimizer +(12 rows) + +drop function f_immutable_int4(int); +-- test inlining when function returns composite +create function mki8(bigint, bigint) returns int8_tbl as +$$select row($1,$2)::int8_tbl$$ language sql; +create function mki4(int) returns int4_tbl as +$$select row($1)::int4_tbl$$ language sql; +explain (verbose, costs off) +select * from mki8(1,2); + QUERY PLAN +-------------------------------------------------- + Subquery Scan on sirvf_sq + Output: (sirvf_sq.mki8).q1, (sirvf_sq.mki8).q2 + -> Result + Output: $0 + InitPlan 1 (returns $0) + -> Result + Output: '(1,2)'::int8_tbl + Optimizer: Postgres query optimizer +(8 rows) + +select * from mki8(1,2); + q1 | q2 +----+---- + 1 | 2 +(1 row) + +explain (verbose, costs off) +select * from mki4(42); + QUERY PLAN +------------------------------------------ + Subquery Scan on sirvf_sq + Output: (sirvf_sq.mki4).f1 + -> Result + Output: $0 + InitPlan 1 (returns $0) + -> Result + Output: '(42)'::int4_tbl + Optimizer: Postgres query optimizer +(8 rows) + +select * from mki4(42); + f1 +---- + 42 +(1 row) + +drop function mki8(bigint, bigint); +drop function mki4(int); +-- +-- test extraction of restriction OR clauses from join OR clause +-- (we used to only do this for indexable clauses) +-- +explain (costs off) +select * from tenk1 a join tenk1 b on + (a.unique1 = 1 and b.unique1 = 2) or (a.unique2 = 3 and b.hundred = 4); + QUERY PLAN +------------------------------------------------------------------------------------------------- + Nested Loop + Join Filter: (((a.unique1 = 1) AND (b.unique1 = 2)) OR ((a.unique2 = 3) AND (b.hundred = 4))) + -> Bitmap Heap Scan on tenk1 a + Recheck Cond: ((unique1 = 1) OR (unique2 = 3)) + -> BitmapOr + -> Bitmap Index Scan on tenk1_unique1 + Index Cond: (unique1 = 1) + -> Bitmap Index Scan on tenk1_unique2 + Index Cond: (unique2 = 3) + -> Materialize + -> Bitmap Heap Scan on tenk1 b + Recheck Cond: ((unique1 = 2) OR (hundred = 4)) + -> BitmapOr + -> Bitmap Index Scan on tenk1_unique1 + Index Cond: (unique1 = 2) + -> Bitmap Index Scan on tenk1_hundred + Index Cond: (hundred = 4) + Optimizer: Postgres query optimizer +(18 rows) + +explain (costs off) +select * from tenk1 a join tenk1 b on + (a.unique1 = 1 and b.unique1 = 2) or (a.unique2 = 3 and b.ten = 4); + QUERY PLAN +--------------------------------------------------------------------------------------------- + Nested Loop + Join Filter: (((a.unique1 = 1) AND (b.unique1 = 2)) OR ((a.unique2 = 3) AND (b.ten = 4))) + -> Seq Scan on tenk1 b + Filter: ((unique1 = 2) OR (ten = 4)) + -> Materialize + -> Bitmap Heap Scan on tenk1 a + Recheck Cond: ((unique1 = 1) OR (unique2 = 3)) + -> BitmapOr + -> Bitmap Index Scan on tenk1_unique1 + Index Cond: (unique1 = 1) + -> Bitmap Index Scan on tenk1_unique2 + Index Cond: (unique2 = 3) + Optimizer: Postgres query optimizer +(13 rows) + +explain (costs off) +select * from tenk1 a join tenk1 b on + (a.unique1 = 1 and b.unique1 = 2) or + ((a.unique2 = 3 or a.unique2 = 7) and b.hundred = 4); + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------- + Nested Loop + Join Filter: (((a.unique1 = 1) AND (b.unique1 = 2)) OR (((a.unique2 = 3) OR (a.unique2 = 7)) AND (b.hundred = 4))) + -> Bitmap Heap Scan on tenk1 a + Recheck Cond: ((unique1 = 1) OR (unique2 = 3) OR (unique2 = 7)) + -> BitmapOr + -> Bitmap Index Scan on tenk1_unique1 + Index Cond: (unique1 = 1) + -> Bitmap Index Scan on tenk1_unique2 + Index Cond: (unique2 = 3) + -> Bitmap Index Scan on tenk1_unique2 + Index Cond: (unique2 = 7) + -> Materialize + -> Bitmap Heap Scan on tenk1 b + Recheck Cond: ((unique1 = 2) OR (hundred = 4)) + -> BitmapOr + -> Bitmap Index Scan on tenk1_unique1 + Index Cond: (unique1 = 2) + -> Bitmap Index Scan on tenk1_hundred + Index Cond: (hundred = 4) + Optimizer: Postgres query optimizer +(20 rows) + +-- +-- test placement of movable quals in a parameterized join tree +-- +explain (costs off) +select * from tenk1 t1 left join + (tenk1 t2 join tenk1 t3 on t2.thousand = t3.unique2) + on t1.hundred = t2.hundred and t1.ten = t3.ten +where t1.unique1 = 1; + QUERY PLAN +---------------------------------------------------------------- + Hash Right Join + Hash Cond: ((t2.hundred = t1.hundred) AND (t3.ten = t1.ten)) + -> Hash Join + Hash Cond: (t2.thousand = t3.unique2) + -> Seq Scan on tenk1 t2 + -> Hash + -> Seq Scan on tenk1 t3 + -> Hash + -> Index Scan using tenk1_unique1 on tenk1 t1 + Index Cond: (unique1 = 1) + Optimizer: Postgres query optimizer +(11 rows) + +explain (costs off) +select * from tenk1 t1 left join + (tenk1 t2 join tenk1 t3 on t2.thousand = t3.unique2) + on t1.hundred = t2.hundred and t1.ten + t2.ten = t3.ten +where t1.unique1 = 1; + QUERY PLAN +-------------------------------------------------------- + Hash Right Join + Hash Cond: (t2.hundred = t1.hundred) + Join Filter: ((t1.ten + t2.ten) = t3.ten) + -> Hash Join + Hash Cond: (t2.thousand = t3.unique2) + -> Seq Scan on tenk1 t2 + -> Hash + -> Seq Scan on tenk1 t3 + -> Hash + -> Index Scan using tenk1_unique1 on tenk1 t1 + Index Cond: (unique1 = 1) + Optimizer: Postgres query optimizer +(12 rows) + +explain (costs off) +select count(*) from + tenk1 a join tenk1 b on a.unique1 = b.unique2 + left join tenk1 c on a.unique2 = b.unique1 and c.thousand = a.thousand + join int4_tbl on b.thousand = f1; + QUERY PLAN +----------------------------------------------------------------------- + Aggregate + -> Hash Right Join + Hash Cond: (c.thousand = a.thousand) + Join Filter: (a.unique2 = b.unique1) + -> Seq Scan on tenk1 c + -> Hash + -> Hash Join + Hash Cond: (a.unique1 = b.unique2) + -> Seq Scan on tenk1 a + -> Hash + -> Hash Join + Hash Cond: (b.thousand = int4_tbl.f1) + -> Seq Scan on tenk1 b + -> Hash + -> Seq Scan on int4_tbl + Optimizer: Postgres query optimizer +(16 rows) + +select count(*) from + tenk1 a join tenk1 b on a.unique1 = b.unique2 + left join tenk1 c on a.unique2 = b.unique1 and c.thousand = a.thousand + join int4_tbl on b.thousand = f1; + count +------- + 10 +(1 row) + +explain (costs off) +select b.unique1 from + tenk1 a join tenk1 b on a.unique1 = b.unique2 + left join tenk1 c on b.unique1 = 42 and c.thousand = a.thousand + join int4_tbl i1 on b.thousand = f1 + right join int4_tbl i2 on i2.f1 = b.tenthous + order by 1; + QUERY PLAN +------------------------------------------------------------------------- + Sort + Sort Key: b.unique1 + -> Hash Right Join + Hash Cond: (b.tenthous = i2.f1) + -> Hash Right Join + Hash Cond: (c.thousand = a.thousand) + Join Filter: (b.unique1 = 42) + -> Seq Scan on tenk1 c + -> Hash + -> Hash Join + Hash Cond: (a.unique1 = b.unique2) + -> Seq Scan on tenk1 a + -> Hash + -> Hash Join + Hash Cond: (b.thousand = i1.f1) + -> Seq Scan on tenk1 b + -> Hash + -> Seq Scan on int4_tbl i1 + -> Hash + -> Seq Scan on int4_tbl i2 + Optimizer: Postgres query optimizer +(21 rows) + +select b.unique1 from + tenk1 a join tenk1 b on a.unique1 = b.unique2 + left join tenk1 c on b.unique1 = 42 and c.thousand = a.thousand + join int4_tbl i1 on b.thousand = f1 + right join int4_tbl i2 on i2.f1 = b.tenthous + order by 1; + unique1 +--------- + 0 + + + + +(5 rows) + +explain (costs off) +select * from +( + select unique1, q1, coalesce(unique1, -1) + q1 as fault + from int8_tbl left join tenk1 on (q2 = unique2) +) ss +where fault = 122 +order by fault; + QUERY PLAN +-------------------------------------------------------------------------- + Hash Right Join + Hash Cond: (tenk1.unique2 = int8_tbl.q2) + Filter: ((COALESCE(tenk1.unique1, '-1'::integer) + int8_tbl.q1) = 122) + -> Seq Scan on tenk1 + -> Hash + -> Seq Scan on int8_tbl + Optimizer: Postgres query optimizer +(7 rows) + +select * from +( + select unique1, q1, coalesce(unique1, -1) + q1 as fault + from int8_tbl left join tenk1 on (q2 = unique2) +) ss +where fault = 122 +order by fault; + unique1 | q1 | fault +---------+-----+------- + | 123 | 122 +(1 row) + +explain (costs off) +select * from +(values (1, array[10,20]), (2, array[20,30])) as v1(v1x,v1ys) +left join (values (1, 10), (2, 20)) as v2(v2x,v2y) on v2x = v1x +left join unnest(v1ys) as u1(u1y) on u1y = v2y; + QUERY PLAN +---------------------------------------------------------------- + Nested Loop Left Join + Join Filter: (u1.u1y = "*VALUES*_1".column2) + -> Hash Left Join + Hash Cond: ("*VALUES*".column1 = "*VALUES*_1".column1) + -> Values Scan on "*VALUES*" + -> Hash + -> Values Scan on "*VALUES*_1" + -> Function Scan on unnest u1 + Optimizer: Postgres query optimizer +(9 rows) + +select * from +(values (1, array[10,20]), (2, array[20,30])) as v1(v1x,v1ys) +left join (values (1, 10), (2, 20)) as v2(v2x,v2y) on v2x = v1x +left join unnest(v1ys) as u1(u1y) on u1y = v2y; + v1x | v1ys | v2x | v2y | u1y +-----+---------+-----+-----+----- + 1 | {10,20} | 1 | 10 | 10 + 2 | {20,30} | 2 | 20 | 20 +(2 rows) + +-- +-- test handling of potential equivalence clauses above outer joins +-- +explain (costs off) +select q1, unique2, thousand, hundred + from int8_tbl a left join tenk1 b on q1 = unique2 + where coalesce(thousand,123) = q1 and q1 = coalesce(hundred,123); + QUERY PLAN +-------------------------------------------------------------------------------------- + Hash Right Join + Hash Cond: (b.unique2 = a.q1) + Filter: ((COALESCE(b.thousand, 123) = a.q1) AND (a.q1 = COALESCE(b.hundred, 123))) + -> Seq Scan on tenk1 b + -> Hash + -> Seq Scan on int8_tbl a + Optimizer: Postgres query optimizer +(7 rows) + +select q1, unique2, thousand, hundred + from int8_tbl a left join tenk1 b on q1 = unique2 + where coalesce(thousand,123) = q1 and q1 = coalesce(hundred,123); + q1 | unique2 | thousand | hundred +----+---------+----------+--------- +(0 rows) + +explain (costs off) +select f1, unique2, case when unique2 is null then f1 else 0 end + from int4_tbl a left join tenk1 b on f1 = unique2 + where (case when unique2 is null then f1 else 0 end) = 0; + QUERY PLAN +-------------------------------------------------------------------- + Hash Right Join + Hash Cond: (b.unique2 = a.f1) + Filter: (CASE WHEN (b.unique2 IS NULL) THEN a.f1 ELSE 0 END = 0) + -> Seq Scan on tenk1 b + -> Hash + -> Seq Scan on int4_tbl a + Optimizer: Postgres query optimizer +(7 rows) + +select f1, unique2, case when unique2 is null then f1 else 0 end + from int4_tbl a left join tenk1 b on f1 = unique2 + where (case when unique2 is null then f1 else 0 end) = 0; + f1 | unique2 | case +----+---------+------ + 0 | 0 | 0 +(1 row) + +-- +-- another case with equivalence clauses above outer joins (bug #8591) +-- +explain (costs off) +select a.unique1, b.unique1, c.unique1, coalesce(b.twothousand, a.twothousand) + from tenk1 a left join tenk1 b on b.thousand = a.unique1 left join tenk1 c on c.unique2 = coalesce(b.twothousand, a.twothousand) + where a.unique2 < 10 and coalesce(b.twothousand, a.twothousand) = 44; + QUERY PLAN +------------------------------------------------------------------- + Hash Left Join + Hash Cond: (COALESCE(b.twothousand, a.twothousand) = c.unique2) + -> Hash Right Join + Hash Cond: (b.thousand = a.unique1) + Filter: (COALESCE(b.twothousand, a.twothousand) = 44) + -> Seq Scan on tenk1 b + -> Hash + -> Index Scan using tenk1_unique2 on tenk1 a + Index Cond: (unique2 < 10) + -> Hash + -> Index Scan using tenk1_unique2 on tenk1 c + Index Cond: (unique2 = 44) + Optimizer: Postgres query optimizer +(13 rows) + +select a.unique1, b.unique1, c.unique1, coalesce(b.twothousand, a.twothousand) + from tenk1 a left join tenk1 b on b.thousand = a.unique1 left join tenk1 c on c.unique2 = coalesce(b.twothousand, a.twothousand) + where a.unique2 < 10 and coalesce(b.twothousand, a.twothousand) = 44; + unique1 | unique1 | unique1 | coalesce +---------+---------+---------+---------- +(0 rows) + +-- +-- check handling of join aliases when flattening multiple levels of subquery +-- +explain (verbose, costs off) +select foo1.join_key as foo1_id, foo3.join_key AS foo3_id, bug_field from + (values (0),(1)) foo1(join_key) +left join + (select join_key, bug_field from + (select ss1.join_key, ss1.bug_field from + (select f1 as join_key, 666 as bug_field from int4_tbl i1) ss1 + ) foo2 + left join + (select unique2 as join_key from tenk1 i2) ss2 + using (join_key) + ) foo3 +using (join_key); + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Hash Right Join + Output: "*VALUES*".column1, i1.f1, (666) + Hash Cond: (i1.f1 = "*VALUES*".column1) + -> Hash Right Join + Output: i1.f1, 666 + Hash Cond: (i2.unique2 = i1.f1) + -> Seq Scan on public.tenk1 i2 + Output: i2.unique1, i2.unique2, i2.two, i2.four, i2.ten, i2.twenty, i2.hundred, i2.thousand, i2.twothousand, i2.fivethous, i2.tenthous, i2.odd, i2.even, i2.stringu1, i2.stringu2, i2.string4 + -> Hash + Output: i1.f1 + -> Seq Scan on public.int4_tbl i1 + Output: i1.f1 + -> Hash + Output: "*VALUES*".column1 + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + Optimizer: Postgres query optimizer +(17 rows) + +select foo1.join_key as foo1_id, foo3.join_key AS foo3_id, bug_field from + (values (0),(1)) foo1(join_key) +left join + (select join_key, bug_field from + (select ss1.join_key, ss1.bug_field from + (select f1 as join_key, 666 as bug_field from int4_tbl i1) ss1 + ) foo2 + left join + (select unique2 as join_key from tenk1 i2) ss2 + using (join_key) + ) foo3 +using (join_key); + foo1_id | foo3_id | bug_field +---------+---------+----------- + 0 | 0 | 666 + 1 | | +(2 rows) + +-- +-- test successful handling of nested outer joins with degenerate join quals +-- +explain (verbose, costs off) +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + QUERY PLAN +---------------------------------------------------------------------- + Hash Left Join + Output: t1.f1 + Hash Cond: (i8.q2 = i4.f1) + -> Nested Loop Left Join + Output: t1.f1, i8.q2 + Join Filter: (t1.f1 = '***'::text) + -> Seq Scan on public.text_tbl t1 + Output: t1.f1 + -> Materialize + Output: i8.q2 + -> Hash Right Join + Output: i8.q2 + Hash Cond: ((NULL::integer) = i8b1.q2) + -> Hash Join + Output: i8.q2, (NULL::integer) + Hash Cond: (i8.q1 = i8b2.q1) + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + -> Hash + Output: i8b2.q1, (NULL::integer) + -> Seq Scan on public.int8_tbl i8b2 + Output: i8b2.q1, NULL::integer + -> Hash + Output: i8b1.q2 + -> Seq Scan on public.int8_tbl i8b1 + Output: i8b1.q2 + -> Hash + Output: i4.f1 + -> Seq Scan on public.int4_tbl i4 + Output: i4.f1 + Optimizer: Postgres query optimizer +(31 rows) + +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + f1 +------------------- + doh! + hi de ho neighbor +(2 rows) + +explain (verbose, costs off) +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2, int4_tbl i4b2) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + QUERY PLAN +---------------------------------------------------------------------------- + Hash Left Join + Output: t1.f1 + Hash Cond: (i8.q2 = i4.f1) + -> Nested Loop Left Join + Output: t1.f1, i8.q2 + Join Filter: (t1.f1 = '***'::text) + -> Seq Scan on public.text_tbl t1 + Output: t1.f1 + -> Materialize + Output: i8.q2 + -> Hash Right Join + Output: i8.q2 + Hash Cond: ((NULL::integer) = i8b1.q2) + -> Hash Right Join + Output: i8.q2, (NULL::integer) + Hash Cond: (i8b2.q1 = i8.q1) + -> Nested Loop + Output: i8b2.q1, NULL::integer + -> Seq Scan on public.int8_tbl i8b2 + Output: i8b2.q1, i8b2.q2 + -> Materialize + -> Seq Scan on public.int4_tbl i4b2 + -> Hash + Output: i8.q1, i8.q2 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + -> Hash + Output: i8b1.q2 + -> Seq Scan on public.int8_tbl i8b1 + Output: i8b1.q2 + -> Hash + Output: i4.f1 + -> Seq Scan on public.int4_tbl i4 + Output: i4.f1 + Optimizer: Postgres query optimizer +(35 rows) + +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2, int4_tbl i4b2) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + f1 +------------------- + doh! + hi de ho neighbor +(2 rows) + +explain (verbose, costs off) +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2, int4_tbl i4b2 + where q1 = f1) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + QUERY PLAN +---------------------------------------------------------------------------- + Hash Left Join + Output: t1.f1 + Hash Cond: (i8.q2 = i4.f1) + -> Nested Loop Left Join + Output: t1.f1, i8.q2 + Join Filter: (t1.f1 = '***'::text) + -> Seq Scan on public.text_tbl t1 + Output: t1.f1 + -> Materialize + Output: i8.q2 + -> Hash Right Join + Output: i8.q2 + Hash Cond: ((NULL::integer) = i8b1.q2) + -> Hash Right Join + Output: i8.q2, (NULL::integer) + Hash Cond: (i8b2.q1 = i8.q1) + -> Hash Join + Output: i8b2.q1, NULL::integer + Hash Cond: (i8b2.q1 = i4b2.f1) + -> Seq Scan on public.int8_tbl i8b2 + Output: i8b2.q1, i8b2.q2 + -> Hash + Output: i4b2.f1 + -> Seq Scan on public.int4_tbl i4b2 + Output: i4b2.f1 + -> Hash + Output: i8.q1, i8.q2 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + -> Hash + Output: i8b1.q2 + -> Seq Scan on public.int8_tbl i8b1 + Output: i8b1.q2 + -> Hash + Output: i4.f1 + -> Seq Scan on public.int4_tbl i4 + Output: i4.f1 + Optimizer: Postgres query optimizer +(38 rows) + +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2, int4_tbl i4b2 + where q1 = f1) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + f1 +------------------- + doh! + hi de ho neighbor +(2 rows) + +explain (verbose, costs off) +select * from + text_tbl t1 + inner join int8_tbl i8 + on i8.q2 = 456 + right join text_tbl t2 + on t1.f1 = 'doh!' + left join int4_tbl i4 + on i8.q1 = i4.f1; + QUERY PLAN +-------------------------------------------------------------- + Nested Loop Left Join + Output: t1.f1, i8.q1, i8.q2, t2.f1, i4.f1 + -> Seq Scan on public.text_tbl t2 + Output: t2.f1 + -> Materialize + Output: i8.q1, i8.q2, i4.f1, t1.f1 + -> Nested Loop + Output: i8.q1, i8.q2, i4.f1, t1.f1 + -> Hash Right Join + Output: i8.q1, i8.q2, i4.f1 + Hash Cond: (i4.f1 = i8.q1) + -> Seq Scan on public.int4_tbl i4 + Output: i4.f1 + -> Hash + Output: i8.q1, i8.q2 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + Filter: (i8.q2 = 456) + -> Materialize + Output: t1.f1 + -> Seq Scan on public.text_tbl t1 + Output: t1.f1 + Filter: (t1.f1 = 'doh!'::text) + Optimizer: Postgres query optimizer +(24 rows) + +select * from + text_tbl t1 + inner join int8_tbl i8 + on i8.q2 = 456 + right join text_tbl t2 + on t1.f1 = 'doh!' + left join int4_tbl i4 + on i8.q1 = i4.f1; + f1 | q1 | q2 | f1 | f1 +------+-----+-----+-------------------+---- + doh! | 123 | 456 | doh! | + doh! | 123 | 456 | hi de ho neighbor | +(2 rows) + +-- +-- test for appropriate join order in the presence of lateral references +-- +explain (verbose, costs off) +select * from + text_tbl t1 + left join int8_tbl i8 + on i8.q2 = 123, + lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss +where t1.f1 = ss.f1; + QUERY PLAN +-------------------------------------------------- + Nested Loop + Output: t1.f1, i8.q1, i8.q2, (i8.q1), t2.f1 + Join Filter: (t1.f1 = t2.f1) + -> Nested Loop Left Join + Output: t1.f1, i8.q1, i8.q2 + -> Seq Scan on public.text_tbl t1 + Output: t1.f1 + -> Materialize + Output: i8.q1, i8.q2 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + Filter: (i8.q2 = 123) + -> Materialize + Output: (i8.q1), t2.f1 + -> Limit + Output: (i8.q1), t2.f1 + -> Seq Scan on public.text_tbl t2 + Output: i8.q1, t2.f1 + Optimizer: Postgres query optimizer +(19 rows) + +select * from + text_tbl t1 + left join int8_tbl i8 + on i8.q2 = 123, + lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss +where t1.f1 = ss.f1; + f1 | q1 | q2 | q1 | f1 +------+------------------+-----+------------------+------ + doh! | 4567890123456789 | 123 | 4567890123456789 | doh! +(1 row) + +explain (verbose, costs off) +select * from + text_tbl t1 + left join int8_tbl i8 + on i8.q2 = 123, + lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss1, + lateral (select ss1.* from text_tbl t3 limit 1) as ss2 +where t1.f1 = ss2.f1; + QUERY PLAN +------------------------------------------------------------------- + Nested Loop + Output: t1.f1, i8.q1, i8.q2, (i8.q1), t2.f1, ((i8.q1)), (t2.f1) + Join Filter: (t1.f1 = (t2.f1)) + -> Nested Loop + Output: t1.f1, i8.q1, i8.q2, (i8.q1), t2.f1 + -> Nested Loop Left Join + Output: t1.f1, i8.q1, i8.q2 + -> Seq Scan on public.text_tbl t1 + Output: t1.f1 + -> Materialize + Output: i8.q1, i8.q2 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + Filter: (i8.q2 = 123) + -> Materialize + Output: (i8.q1), t2.f1 + -> Limit + Output: (i8.q1), t2.f1 + -> Seq Scan on public.text_tbl t2 + Output: i8.q1, t2.f1 + -> Materialize + Output: ((i8.q1)), (t2.f1) + -> Limit + Output: ((i8.q1)), (t2.f1) + -> Seq Scan on public.text_tbl t3 + Output: (i8.q1), t2.f1 + Optimizer: Postgres query optimizer +(27 rows) + +select * from + text_tbl t1 + left join int8_tbl i8 + on i8.q2 = 123, + lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss1, + lateral (select ss1.* from text_tbl t3 limit 1) as ss2 +where t1.f1 = ss2.f1; + f1 | q1 | q2 | q1 | f1 | q1 | f1 +------+------------------+-----+------------------+------+------------------+------ + doh! | 4567890123456789 | 123 | 4567890123456789 | doh! | 4567890123456789 | doh! +(1 row) + +explain (verbose, costs off) +select 1 from + text_tbl as tt1 + inner join text_tbl as tt2 on (tt1.f1 = 'foo') + left join text_tbl as tt3 on (tt3.f1 = 'foo') + left join text_tbl as tt4 on (tt3.f1 = tt4.f1), + lateral (select tt4.f1 as c0 from text_tbl as tt5 limit 1) as ss1 +where tt1.f1 = ss1.c0; + QUERY PLAN +---------------------------------------------------------- + Nested Loop + Output: 1 + -> Hash Left Join + Output: tt1.f1, tt4.f1 + Hash Cond: (tt3.f1 = tt4.f1) + -> Nested Loop Left Join + Output: tt1.f1, tt3.f1 + -> Nested Loop + Output: tt1.f1 + -> Seq Scan on public.text_tbl tt1 + Output: tt1.f1 + Filter: (tt1.f1 = 'foo'::text) + -> Seq Scan on public.text_tbl tt2 + Output: tt2.f1 + -> Materialize + Output: tt3.f1 + -> Seq Scan on public.text_tbl tt3 + Output: tt3.f1 + Filter: (tt3.f1 = 'foo'::text) + -> Hash + Output: tt4.f1 + -> Seq Scan on public.text_tbl tt4 + Output: tt4.f1 + Filter: (tt4.f1 = 'foo'::text) + -> Materialize + Output: ss1.c0 + -> Subquery Scan on ss1 + Output: ss1.c0 + Filter: (ss1.c0 = 'foo'::text) + -> Limit + Output: (tt4.f1) + -> Seq Scan on public.text_tbl tt5 + Output: tt4.f1 + Optimizer: Postgres query optimizer +(34 rows) + +select 1 from + text_tbl as tt1 + inner join text_tbl as tt2 on (tt1.f1 = 'foo') + left join text_tbl as tt3 on (tt3.f1 = 'foo') + left join text_tbl as tt4 on (tt3.f1 = tt4.f1), + lateral (select tt4.f1 as c0 from text_tbl as tt5 limit 1) as ss1 +where tt1.f1 = ss1.c0; + ?column? +---------- +(0 rows) + +-- +-- check a case in which a PlaceHolderVar forces join order +-- +explain (verbose, costs off) +select ss2.* from + int4_tbl i41 + left join int8_tbl i8 + join (select i42.f1 as c1, i43.f1 as c2, 42 as c3 + from int4_tbl i42, int4_tbl i43) ss1 + on i8.q1 = ss1.c2 + on i41.f1 = ss1.c1, + lateral (select i41.*, i8.*, ss1.* from text_tbl limit 1) ss2 +where ss1.c2 = 0; + QUERY PLAN +------------------------------------------------------------------------------ + Nested Loop + Output: (i41.f1), (i8.q1), (i8.q2), (i42.f1), (i43.f1), ((42)) + -> Nested Loop + Output: i41.f1, i42.f1, i8.q1, i8.q2, i43.f1, 42 + -> Nested Loop + Output: i41.f1, i42.f1, i8.q1, i8.q2 + -> Hash Join + Output: i41.f1, i42.f1 + Hash Cond: (i41.f1 = i42.f1) + -> Seq Scan on public.int4_tbl i41 + Output: i41.f1 + -> Hash + Output: i42.f1 + -> Seq Scan on public.int4_tbl i42 + Output: i42.f1 + -> Materialize + Output: i8.q1, i8.q2 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + Filter: (i8.q1 = 0) + -> Materialize + Output: i43.f1 + -> Seq Scan on public.int4_tbl i43 + Output: i43.f1 + Filter: (i43.f1 = 0) + -> Materialize + Output: (i41.f1), (i8.q1), (i8.q2), (i42.f1), (i43.f1), ((42)) + -> Limit + Output: (i41.f1), (i8.q1), (i8.q2), (i42.f1), (i43.f1), ((42)) + -> Seq Scan on public.text_tbl + Output: i41.f1, i8.q1, i8.q2, i42.f1, i43.f1, (42) + Optimizer: Postgres query optimizer +(32 rows) + +select ss2.* from + int4_tbl i41 + left join int8_tbl i8 + join (select i42.f1 as c1, i43.f1 as c2, 42 as c3 + from int4_tbl i42, int4_tbl i43) ss1 + on i8.q1 = ss1.c2 + on i41.f1 = ss1.c1, + lateral (select i41.*, i8.*, ss1.* from text_tbl limit 1) ss2 +where ss1.c2 = 0; + f1 | q1 | q2 | c1 | c2 | c3 +----+----+----+----+----+---- +(0 rows) + +-- +-- test successful handling of full join underneath left join (bug #14105) +-- +explain (costs off) +select * from + (select 1 as id) as xx + left join + (tenk1 as a1 full join (select 1 as id) as yy on (a1.unique1 = yy.id)) + on (xx.id = coalesce(yy.id)); + QUERY PLAN +--------------------------------------- + Nested Loop Left Join + -> Result + -> Hash Full Join + Hash Cond: (a1.unique1 = (1)) + Filter: (1 = COALESCE((1))) + -> Seq Scan on tenk1 a1 + -> Hash + -> Result + Optimizer: Postgres query optimizer +(9 rows) + +select * from + (select 1 as id) as xx + left join + (tenk1 as a1 full join (select 1 as id) as yy on (a1.unique1 = yy.id)) + on (xx.id = coalesce(yy.id)); + id | unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 | id +----+---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+---------+---- + 1 | 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx | 1 +(1 row) + +-- +-- test ability to push constants through outer join clauses +-- +explain (costs off) + select * from int4_tbl a left join tenk1 b on f1 = unique2 where f1 = 0; + QUERY PLAN +------------------------------------------------- + Hash Right Join + Hash Cond: (b.unique2 = a.f1) + -> Index Scan using tenk1_unique2 on tenk1 b + Index Cond: (unique2 = 0) + -> Hash + -> Seq Scan on int4_tbl a + Filter: (f1 = 0) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) + select * from tenk1 a full join tenk1 b using(unique2) where unique2 = 42; + QUERY PLAN +------------------------------------------------------- + Hash Full Join + Hash Cond: (a.unique2 = b.unique2) + -> Index Scan using tenk1_unique2 on tenk1 a + Index Cond: (unique2 = 42) + -> Hash + -> Index Scan using tenk1_unique2 on tenk1 b + Index Cond: (unique2 = 42) + Optimizer: Postgres query optimizer +(8 rows) + +-- +-- test that quals attached to an outer join have correct semantics, +-- specifically that they don't re-use expressions computed below the join; +-- we force a mergejoin so that coalesce(b.q1, 1) appears as a join input +-- +set enable_hashjoin to off; +set enable_nestloop to off; +explain (verbose, costs off) + select a.q2, b.q1 + from int8_tbl a left join int8_tbl b on a.q2 = coalesce(b.q1, 1) + where coalesce(b.q1, 1) > 0; + QUERY PLAN +------------------------------------------------------------ + Nested Loop Left Join + Output: a.q2, b.q1 + Join Filter: (a.q2 = COALESCE(b.q1, '1'::bigint)) + Filter: (COALESCE(b.q1, '1'::bigint) > 0) + -> Seq Scan on public.int8_tbl a + Output: a.q1, a.q2 + -> Materialize + Output: b.q1 + -> Seq Scan on public.int8_tbl b + Output: b.q1 + Settings: enable_hashjoin = 'off', enable_nestloop = 'off' + Optimizer: Postgres query optimizer +(12 rows) + +select a.q2, b.q1 + from int8_tbl a left join int8_tbl b on a.q2 = coalesce(b.q1, 1) + where coalesce(b.q1, 1) > 0; + q2 | q1 +-------------------+------------------ + -4567890123456789 | + 123 | 123 + 123 | 123 + 456 | + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(10 rows) + +reset enable_hashjoin; +reset enable_nestloop; +-- +-- test join removal +-- +begin; +CREATE TEMP TABLE a (id int PRIMARY KEY, b_id int); +CREATE TEMP TABLE b (id int PRIMARY KEY, c_id int); +CREATE TEMP TABLE c (id int PRIMARY KEY); +CREATE TEMP TABLE d (a int, b int); +INSERT INTO a VALUES (0, 0), (1, NULL); +INSERT INTO b VALUES (0, 0), (1, NULL); +INSERT INTO c VALUES (0), (1); +INSERT INTO d VALUES (1,3), (2,2), (3,1); +-- all three cases should be optimizable into a simple seqscan +explain (costs off) SELECT a.* FROM a LEFT JOIN b ON a.b_id = b.id; + QUERY PLAN +------------------------------------- + Seq Scan on a + Optimizer: Postgres query optimizer +(2 rows) + +explain (costs off) SELECT b.* FROM b LEFT JOIN c ON b.c_id = c.id; + QUERY PLAN +------------------------------------- + Seq Scan on b + Optimizer: Postgres query optimizer +(2 rows) + +explain (costs off) + SELECT a.* FROM a LEFT JOIN (b left join c on b.c_id = c.id) + ON (a.b_id = b.id); + QUERY PLAN +------------------------------------- + Seq Scan on a + Optimizer: Postgres query optimizer +(2 rows) + +-- check optimization of outer join within another special join +explain (costs off) +select id from a where id in ( + select b.id from b left join c on b.id = c.id +); + QUERY PLAN +------------------------------------- + Hash Join + Hash Cond: (a.id = b.id) + -> Seq Scan on a + -> Hash + -> Seq Scan on b + Optimizer: Postgres query optimizer +(6 rows) + +-- check that join removal works for a left join when joining a subquery +-- that is guaranteed to be unique by its GROUP BY clause +explain (costs off) +select d.* from d left join (select * from b group by b.id, b.c_id) s + on d.a = s.id and d.b = s.c_id; + QUERY PLAN +------------------------------------- + Seq Scan on d + Optimizer: Postgres query optimizer +(2 rows) + +-- similarly, but keying off a DISTINCT clause +explain (costs off) +select d.* from d left join (select distinct * from b) s + on d.a = s.id and d.b = s.c_id; + QUERY PLAN +------------------------------------- + Seq Scan on d + Optimizer: Postgres query optimizer +(2 rows) + +-- join removal is not possible when the GROUP BY contains a column that is +-- not in the join condition. (Note: as of 9.6, we notice that b.id is a +-- primary key and so drop b.c_id from the GROUP BY of the resulting plan; +-- but this happens too late for join removal in the outer plan level.) +explain (costs off) +select d.* from d left join (select * from b group by b.id, b.c_id) s + on d.a = s.id; + QUERY PLAN +------------------------------------------ + Hash Right Join + Hash Cond: (b.id = d.a) + -> GroupAggregate + Group Key: b.id + -> Index Scan using b_pkey on b + -> Hash + -> Seq Scan on d + Optimizer: Postgres query optimizer +(8 rows) + +-- similarly, but keying off a DISTINCT clause +explain (costs off) +select d.* from d left join (select distinct * from b) s + on d.a = s.id; + QUERY PLAN +------------------------------------- + Hash Right Join + Hash Cond: (b.id = d.a) + -> HashAggregate + Group Key: b.id, b.c_id + -> Seq Scan on b + -> Hash + -> Seq Scan on d + Optimizer: Postgres query optimizer +(8 rows) + +-- check join removal works when uniqueness of the join condition is enforced +-- by a UNION +explain (costs off) +select d.* from d left join (select id from a union select id from b) s + on d.a = s.id; + QUERY PLAN +------------------------------------- + Seq Scan on d + Optimizer: Postgres query optimizer +(2 rows) + +-- check join removal with a cross-type comparison operator +explain (costs off) +select i8.* from int8_tbl i8 left join (select f1 from int4_tbl group by f1) i4 + on i8.q1 = i4.f1; + QUERY PLAN +------------------------------------- + Seq Scan on int8_tbl i8 + Optimizer: Postgres query optimizer +(2 rows) + +-- check join removal with lateral references +explain (costs off) +select 1 from (select a.id FROM a left join b on a.b_id = b.id) q, + lateral generate_series(1, q.id) gs(i) where q.id = gs.i; + QUERY PLAN +------------------------------------------- + Nested Loop + -> Seq Scan on a + -> Function Scan on generate_series gs + Filter: (a.id = i) + Optimizer: Postgres query optimizer +(5 rows) + +rollback; +create temp table parent (k int primary key, pd int); +create temp table child (k int unique, cd int); +insert into parent values (1, 10), (2, 20), (3, 30); +insert into child values (1, 100), (4, 400); +-- this case is optimizable +select p.* from parent p left join child c on (p.k = c.k); + k | pd +---+---- + 1 | 10 + 2 | 20 + 3 | 30 +(3 rows) + +explain (costs off) + select p.* from parent p left join child c on (p.k = c.k); + QUERY PLAN +------------------------------------- + Seq Scan on parent p + Optimizer: Postgres query optimizer +(2 rows) + +-- this case is not +select p.*, linked from parent p + left join (select c.*, true as linked from child c) as ss + on (p.k = ss.k); + k | pd | linked +---+----+-------- + 1 | 10 | t + 2 | 20 | + 3 | 30 | +(3 rows) + +explain (costs off) + select p.*, linked from parent p + left join (select c.*, true as linked from child c) as ss + on (p.k = ss.k); + QUERY PLAN +------------------------------------- + Hash Left Join + Hash Cond: (p.k = c.k) + -> Seq Scan on parent p + -> Hash + -> Seq Scan on child c + Optimizer: Postgres query optimizer +(6 rows) + +-- check for a 9.0rc1 bug: join removal breaks pseudoconstant qual handling +select p.* from + parent p left join child c on (p.k = c.k) + where p.k = 1 and p.k = 2; + k | pd +---+---- +(0 rows) + +explain (costs off) +select p.* from + parent p left join child c on (p.k = c.k) + where p.k = 1 and p.k = 2; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select p.* from + (parent p left join child c on (p.k = c.k)) join parent x on p.k = x.k + where p.k = 1 and p.k = 2; + k | pd +---+---- +(0 rows) + +explain (costs off) +select p.* from + (parent p left join child c on (p.k = c.k)) join parent x on p.k = x.k + where p.k = 1 and p.k = 2; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +-- bug 5255: this is not optimizable by join removal +begin; +CREATE TEMP TABLE a (id int PRIMARY KEY); +CREATE TEMP TABLE b (id int PRIMARY KEY, a_id int); +INSERT INTO a VALUES (0), (1); +INSERT INTO b VALUES (0, 0), (1, NULL); +SELECT * FROM b LEFT JOIN a ON (b.a_id = a.id) WHERE (a.id IS NULL OR a.id > 0); + id | a_id | id +----+------+---- + 1 | | +(1 row) + +SELECT b.* FROM b LEFT JOIN a ON (b.a_id = a.id) WHERE (a.id IS NULL OR a.id > 0); + id | a_id +----+------ + 1 | +(1 row) + +rollback; +-- another join removal bug: this is not optimizable, either +begin; +create temp table innertab (id int8 primary key, dat1 int8); +insert into innertab values(123, 42); +SELECT * FROM + (SELECT 1 AS x) ss1 + LEFT JOIN + (SELECT q1, q2, COALESCE(dat1, q1) AS y + FROM int8_tbl LEFT JOIN innertab ON q2 = id) ss2 + ON true; + x | q1 | q2 | y +---+------------------+-------------------+------------------ + 1 | 123 | 456 | 123 + 1 | 123 | 4567890123456789 | 123 + 1 | 4567890123456789 | 123 | 42 + 1 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 1 | 4567890123456789 | -4567890123456789 | 4567890123456789 +(5 rows) + +rollback; +-- another join removal bug: we must clean up correctly when removing a PHV +begin; +create temp table uniquetbl (f1 text unique); +explain (costs off) +select t1.* from + uniquetbl as t1 + left join (select *, '***'::text as d1 from uniquetbl) t2 + on t1.f1 = t2.f1 + left join uniquetbl t3 + on t2.d1 = t3.f1; + QUERY PLAN +------------------------------------- + Seq Scan on uniquetbl t1 + Optimizer: Postgres query optimizer +(2 rows) + +explain (costs off) +select t0.* +from + text_tbl t0 + left join + (select case t1.ten when 0 then 'doh!'::text else null::text end as case1, + t1.stringu2 + from tenk1 t1 + join int4_tbl i4 ON i4.f1 = t1.unique2 + left join uniquetbl u1 ON u1.f1 = t1.string4) ss + on t0.f1 = ss.case1 +where ss.stringu2 !~* ss.case1; + QUERY PLAN +-------------------------------------------------------------------------------------------- + Hash Join + Hash Cond: (CASE t1.ten WHEN 0 THEN 'doh!'::text ELSE NULL::text END = t0.f1) + -> Hash Join + Hash Cond: (t1.unique2 = i4.f1) + -> Seq Scan on tenk1 t1 + Filter: (stringu2 !~* CASE ten WHEN 0 THEN 'doh!'::text ELSE NULL::text END) + -> Hash + -> Seq Scan on int4_tbl i4 + -> Hash + -> Seq Scan on text_tbl t0 + Optimizer: Postgres query optimizer +(11 rows) + +select t0.* +from + text_tbl t0 + left join + (select case t1.ten when 0 then 'doh!'::text else null::text end as case1, + t1.stringu2 + from tenk1 t1 + join int4_tbl i4 ON i4.f1 = t1.unique2 + left join uniquetbl u1 ON u1.f1 = t1.string4) ss + on t0.f1 = ss.case1 +where ss.stringu2 !~* ss.case1; + f1 +------ + doh! +(1 row) + +rollback; +-- test case to expose miscomputation of required relid set for a PHV +explain (verbose, costs off) +select i8.*, ss.v, t.unique2 + from int8_tbl i8 + left join int4_tbl i4 on i4.f1 = 1 + left join lateral (select i4.f1 + 1 as v) as ss on true + left join tenk1 t on t.unique2 = ss.v +where q2 = 456; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Hash Right Join + Output: i8.q1, i8.q2, ((i4.f1 + 1)), t.unique2 + Hash Cond: (t.unique2 = ((i4.f1 + 1))) + -> Seq Scan on public.tenk1 t + Output: t.unique1, t.unique2, t.two, t.four, t.ten, t.twenty, t.hundred, t.thousand, t.twothousand, t.fivethous, t.tenthous, t.odd, t.even, t.stringu1, t.stringu2, t.string4 + -> Hash + Output: i8.q1, i8.q2, ((i4.f1 + 1)) + -> Nested Loop Left Join + Output: i8.q1, i8.q2, (i4.f1 + 1) + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + Filter: (i8.q2 = 456) + -> Seq Scan on public.int4_tbl i4 + Output: i4.f1 + Filter: (i4.f1 = 1) + Optimizer: Postgres query optimizer +(16 rows) + +select i8.*, ss.v, t.unique2 + from int8_tbl i8 + left join int4_tbl i4 on i4.f1 = 1 + left join lateral (select i4.f1 + 1 as v) as ss on true + left join tenk1 t on t.unique2 = ss.v +where q2 = 456; + q1 | q2 | v | unique2 +-----+-----+---+--------- + 123 | 456 | | +(1 row) + +-- and check a related issue where we miscompute required relids for +-- a PHV that's been translated to a child rel +create temp table parttbl (a integer primary key) partition by range (a); +create temp table parttbl1 partition of parttbl for values from (1) to (100); +insert into parttbl values (11), (12); +explain (costs off) +select * from + (select *, 12 as phv from parttbl) as ss + right join int4_tbl on true +where ss.a = ss.phv and f1 = 0; + QUERY PLAN +------------------------------------- + Nested Loop + -> Seq Scan on parttbl1 parttbl + Filter: (a = 12) + -> Materialize + -> Seq Scan on int4_tbl + Filter: (f1 = 0) + Optimizer: Postgres query optimizer +(7 rows) + +select * from + (select *, 12 as phv from parttbl) as ss + right join int4_tbl on true +where ss.a = ss.phv and f1 = 0; + a | phv | f1 +----+-----+---- + 12 | 12 | 0 +(1 row) + +-- bug #8444: we've historically allowed duplicate aliases within aliased JOINs +select * from + int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = f1; -- error +ERROR: column reference "f1" is ambiguous +LINE 2: ..._tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = f1; + ^ +select * from + int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = y.f1; -- error +ERROR: invalid reference to FROM-clause entry for table "y" +LINE 2: ...bl x join (int4_tbl x cross join int4_tbl y) j on q1 = y.f1; + ^ +HINT: There is an entry for table "y", but it cannot be referenced from this part of the query. +select * from + int8_tbl x join (int4_tbl x cross join int4_tbl y(ff)) j on q1 = f1; -- ok + q1 | q2 | f1 | ff +----+----+----+---- +(0 rows) + +-- +-- Test hints given on incorrect column references are useful +-- +select t1.uunique1 from + tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t1" suggestion +ERROR: column t1.uunique1 does not exist +LINE 1: select t1.uunique1 from + ^ +HINT: Perhaps you meant to reference the column "t1.unique1". +select t2.uunique1 from + tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t2" suggestion +ERROR: column t2.uunique1 does not exist +LINE 1: select t2.uunique1 from + ^ +HINT: Perhaps you meant to reference the column "t2.unique1". +select uunique1 from + tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, suggest both at once +ERROR: column "uunique1" does not exist +LINE 1: select uunique1 from + ^ +HINT: Perhaps you meant to reference the column "t1.unique1" or the column "t2.unique1". +-- +-- Take care to reference the correct RTE +-- +select atts.relid::regclass, s.* from pg_stats s join + pg_attribute a on s.attname = a.attname and s.tablename = + a.attrelid::regclass::text join (select unnest(indkey) attnum, + indexrelid from pg_index i) atts on atts.attnum = a.attnum where + schemaname != 'pg_catalog'; +ERROR: column atts.relid does not exist +LINE 1: select atts.relid::regclass, s.* from pg_stats s join + ^ +-- +-- Test LATERAL +-- +select unique2, x.* +from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x; + unique2 | f1 +---------+---- + 9998 | 0 +(1 row) + +explain (costs off) + select unique2, x.* + from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x; + QUERY PLAN +------------------------------------- + Hash Join + Hash Cond: (a.unique1 = b.f1) + -> Seq Scan on tenk1 a + -> Hash + -> Seq Scan on int4_tbl b + Optimizer: Postgres query optimizer +(6 rows) + +select unique2, x.* +from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss; + unique2 | f1 +---------+---- + 9998 | 0 +(1 row) + +explain (costs off) + select unique2, x.* + from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss; + QUERY PLAN +------------------------------------- + Hash Join + Hash Cond: (tenk1.unique1 = x.f1) + -> Seq Scan on tenk1 + -> Hash + -> Seq Scan on int4_tbl x + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) + select unique2, x.* + from int4_tbl x cross join lateral (select unique2 from tenk1 where f1 = unique1) ss; + QUERY PLAN +------------------------------------- + Hash Join + Hash Cond: (tenk1.unique1 = x.f1) + -> Seq Scan on tenk1 + -> Hash + -> Seq Scan on int4_tbl x + Optimizer: Postgres query optimizer +(6 rows) + +select unique2, x.* +from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true; + unique2 | f1 +---------+------------- + 9998 | 0 + | -123456 + | 123456 + | 2147483647 + | -2147483647 +(5 rows) + +explain (costs off) + select unique2, x.* + from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true; + QUERY PLAN +------------------------------------- + Hash Right Join + Hash Cond: (tenk1.unique1 = x.f1) + -> Seq Scan on tenk1 + -> Hash + -> Seq Scan on int4_tbl x + Optimizer: Postgres query optimizer +(6 rows) + +-- check scoping of lateral versus parent references +-- the first of these should return int8_tbl.q2, the second int8_tbl.q1 +select *, (select r from (select q1 as q2) x, (select q2 as r) y) from int8_tbl; + q1 | q2 | r +------------------+-------------------+------------------- + 123 | 456 | 456 + 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | -4567890123456789 +(5 rows) + +select *, (select r from (select q1 as q2) x, lateral (select q2 as r) y) from int8_tbl; + q1 | q2 | r +------------------+-------------------+------------------ + 123 | 456 | 123 + 123 | 4567890123456789 | 123 + 4567890123456789 | 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 4567890123456789 +(5 rows) + +-- lateral with function in FROM +select count(*) from tenk1 a, lateral generate_series(1,two) g; + count +------- + 5000 +(1 row) + +explain (costs off) + select count(*) from tenk1 a, lateral generate_series(1,two) g; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Nested Loop + -> Seq Scan on tenk1 a + -> Memoize + Cache Key: a.two + Cache Mode: binary + -> Function Scan on generate_series g + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) + select count(*) from tenk1 a cross join lateral generate_series(1,two) g; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Nested Loop + -> Seq Scan on tenk1 a + -> Memoize + Cache Key: a.two + Cache Mode: binary + -> Function Scan on generate_series g + Optimizer: Postgres query optimizer +(8 rows) + +-- don't need the explicit LATERAL keyword for functions +explain (costs off) + select count(*) from tenk1 a, generate_series(1,two) g; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Nested Loop + -> Seq Scan on tenk1 a + -> Memoize + Cache Key: a.two + Cache Mode: binary + -> Function Scan on generate_series g + Optimizer: Postgres query optimizer +(8 rows) + +-- lateral with UNION ALL subselect +explain (costs off) + select * from generate_series(100,200) g, + lateral (select * from int8_tbl a where g = q1 union all + select * from int8_tbl b where g = q2) ss; + QUERY PLAN +------------------------------------------ + Nested Loop + -> Function Scan on generate_series g + -> Materialize + -> Append + -> Seq Scan on int8_tbl a + Filter: (g.g = q1) + -> Seq Scan on int8_tbl b + Filter: (g.g = q2) + Optimizer: Postgres query optimizer +(9 rows) + +select * from generate_series(100,200) g, + lateral (select * from int8_tbl a where g = q1 union all + select * from int8_tbl b where g = q2) ss; + g | q1 | q2 +-----+------------------+------------------ + 123 | 123 | 456 + 123 | 123 | 4567890123456789 + 123 | 4567890123456789 | 123 +(3 rows) + +-- lateral with VALUES +explain (costs off) + select count(*) from tenk1 a, + tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x; + QUERY PLAN +-------------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (a.unique1 = b.unique2) + -> Seq Scan on tenk1 a + -> Hash + -> Seq Scan on tenk1 b + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from tenk1 a, + tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x; + count +------- + 10000 +(1 row) + +-- lateral with VALUES, no flattening possible +explain (costs off) + select count(*) from tenk1 a, + tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x; + QUERY PLAN +----------------------------------------------------- + Aggregate + -> Hash Join + Hash Cond: ("*VALUES*".column1 = b.unique2) + -> Nested Loop + -> Seq Scan on tenk1 a + -> Values Scan on "*VALUES*" + -> Hash + -> Seq Scan on tenk1 b + Optimizer: Postgres query optimizer +(9 rows) + +select count(*) from tenk1 a, + tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x; + count +------- + 10000 +(1 row) + +-- lateral injecting a strange outer join condition +explain (costs off) + select * from int8_tbl a, + int8_tbl x left join lateral (select a.q1 from int4_tbl y) ss(z) + on x.q2 = ss.z + order by a.q1, a.q2, x.q1, x.q2, ss.z; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: a.q1, a.q2, x.q1, x.q2, (a.q1) + -> Nested Loop + -> Seq Scan on int8_tbl a + -> Materialize + -> Hash Right Join + Hash Cond: ((a.q1) = x.q2) + -> Seq Scan on int4_tbl y + -> Hash + -> Seq Scan on int8_tbl x + Optimizer: Postgres query optimizer +(11 rows) + +select * from int8_tbl a, + int8_tbl x left join lateral (select a.q1 from int4_tbl y) ss(z) + on x.q2 = ss.z + order by a.q1, a.q2, x.q1, x.q2, ss.z; + q1 | q2 | q1 | q2 | z +------------------+-------------------+------------------+-------------------+------------------ + 123 | 456 | 123 | 456 | + 123 | 456 | 123 | 4567890123456789 | + 123 | 456 | 4567890123456789 | -4567890123456789 | + 123 | 456 | 4567890123456789 | 123 | 123 + 123 | 456 | 4567890123456789 | 123 | 123 + 123 | 456 | 4567890123456789 | 123 | 123 + 123 | 456 | 4567890123456789 | 123 | 123 + 123 | 456 | 4567890123456789 | 123 | 123 + 123 | 456 | 4567890123456789 | 4567890123456789 | + 123 | 4567890123456789 | 123 | 456 | + 123 | 4567890123456789 | 123 | 4567890123456789 | + 123 | 4567890123456789 | 4567890123456789 | -4567890123456789 | + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | + 4567890123456789 | -4567890123456789 | 123 | 456 | + 4567890123456789 | -4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 4567890123456789 | -4567890123456789 | + 4567890123456789 | -4567890123456789 | 4567890123456789 | 123 | + 4567890123456789 | -4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 123 | 456 | + 4567890123456789 | 123 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 4567890123456789 | -4567890123456789 | + 4567890123456789 | 123 | 4567890123456789 | 123 | + 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 123 | 456 | + 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | -4567890123456789 | + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 +(57 rows) + +-- lateral reference to a join alias variable +select * from (select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1, + lateral (select x) ss2(y); + x | f1 | y +---+----+--- + 0 | 0 | 0 +(1 row) + +select * from (select f1 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1, + lateral (values(x)) ss2(y); + x | f1 | y +-------------+-------------+------------- + 0 | 0 | 0 + 123456 | 123456 | 123456 + -123456 | -123456 | -123456 + 2147483647 | 2147483647 | 2147483647 + -2147483647 | -2147483647 | -2147483647 +(5 rows) + +select * from ((select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1) j, + lateral (select x) ss2(y); + x | f1 | y +---+----+--- + 0 | 0 | 0 +(1 row) + +-- lateral references requiring pullup +select * from (values(1)) x(lb), + lateral generate_series(lb,4) x4; + lb | x4 +----+---- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 +(4 rows) + +select * from (select f1/1000000000 from int4_tbl) x(lb), + lateral generate_series(lb,4) x4; + lb | x4 +----+---- + 0 | 0 + 0 | 1 + 0 | 2 + 0 | 3 + 0 | 4 + 0 | 0 + 0 | 1 + 0 | 2 + 0 | 3 + 0 | 4 + 0 | 0 + 0 | 1 + 0 | 2 + 0 | 3 + 0 | 4 + 2 | 2 + 2 | 3 + 2 | 4 + -2 | -2 + -2 | -1 + -2 | 0 + -2 | 1 + -2 | 2 + -2 | 3 + -2 | 4 +(25 rows) + +select * from (values(1)) x(lb), + lateral (values(lb)) y(lbcopy); + lb | lbcopy +----+-------- + 1 | 1 +(1 row) + +select * from (values(1)) x(lb), + lateral (select lb from int4_tbl) y(lbcopy); + lb | lbcopy +----+-------- + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 + 1 | 1 +(5 rows) + +select * from + int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1, + lateral (values(x.q1,y.q1,y.q2)) v(xq1,yq1,yq2); + q1 | q2 | q1 | q2 | xq1 | yq1 | yq2 +------------------+-------------------+------------------+-------------------+------------------+------------------+------------------- + 123 | 456 | | | 123 | | + 123 | 4567890123456789 | 4567890123456789 | -4567890123456789 | 123 | 4567890123456789 | -4567890123456789 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 + 4567890123456789 | 123 | 123 | 456 | 4567890123456789 | 123 | 456 + 4567890123456789 | 4567890123456789 | 4567890123456789 | -4567890123456789 | 4567890123456789 | 4567890123456789 | -4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 | | | 4567890123456789 | | +(10 rows) + +select * from + int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1, + lateral (select x.q1,y.q1,y.q2) v(xq1,yq1,yq2); + q1 | q2 | q1 | q2 | xq1 | yq1 | yq2 +------------------+-------------------+------------------+-------------------+------------------+------------------+------------------- + 123 | 456 | | | 123 | | + 123 | 4567890123456789 | 4567890123456789 | -4567890123456789 | 123 | 4567890123456789 | -4567890123456789 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 + 4567890123456789 | 123 | 123 | 456 | 4567890123456789 | 123 | 456 + 4567890123456789 | 4567890123456789 | 4567890123456789 | -4567890123456789 | 4567890123456789 | 4567890123456789 | -4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 | 123 + 4567890123456789 | -4567890123456789 | | | 4567890123456789 | | +(10 rows) + +select x.* from + int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1, + lateral (select x.q1,y.q1,y.q2) v(xq1,yq1,yq2); + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 123 | 4567890123456789 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(10 rows) + +select v.* from + (int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1) + left join int4_tbl z on z.f1 = x.q2, + lateral (select x.q1,y.q1 union all select x.q2,y.q2) v(vx,vy); + vx | vy +-------------------+------------------- + 123 | + 456 | + 123 | 4567890123456789 + 4567890123456789 | -4567890123456789 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 123 + 123 | 4567890123456789 + 4567890123456789 | 123 + 123 | 456 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | + -4567890123456789 | +(20 rows) + +select v.* from + (int8_tbl x left join (select q1,(select coalesce(q2,0)) q2 from int8_tbl) y on x.q2 = y.q1) + left join int4_tbl z on z.f1 = x.q2, + lateral (select x.q1,y.q1 union all select x.q2,y.q2) v(vx,vy); + vx | vy +-------------------+------------------- + 4567890123456789 | 123 + 123 | 456 + 4567890123456789 | 123 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 + 123 | 4567890123456789 + 4567890123456789 | -4567890123456789 + 123 | + 456 | + 4567890123456789 | + -4567890123456789 | +(20 rows) + +select v.* from + (int8_tbl x left join (select q1,(select coalesce(q2,0)) q2 from int8_tbl) y on x.q2 = y.q1) + left join int4_tbl z on z.f1 = x.q2, + lateral (select x.q1,y.q1 from onerow union all select x.q2,y.q2 from onerow) v(vx,vy); + vx | vy +-------------------+------------------- + 4567890123456789 | 123 + 123 | 456 + 4567890123456789 | 123 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 123 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 + 123 | 4567890123456789 + 4567890123456789 | -4567890123456789 + 123 | + 456 | + 4567890123456789 | + -4567890123456789 | +(20 rows) + +explain (verbose, costs off) +select * from + int8_tbl a left join + lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1; + QUERY PLAN +------------------------------------------ + Nested Loop Left Join + Output: a.q1, a.q2, b.q1, b.q2, (a.q2) + -> Seq Scan on public.int8_tbl a + Output: a.q1, a.q2 + -> Seq Scan on public.int8_tbl b + Output: b.q1, b.q2, a.q2 + Filter: (a.q2 = b.q1) + Optimizer: Postgres query optimizer +(8 rows) + +select * from + int8_tbl a left join + lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1; + q1 | q2 | q1 | q2 | x +------------------+-------------------+------------------+-------------------+------------------ + 123 | 456 | | | + 123 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 123 | 4567890123456789 | 4567890123456789 | -4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 123 | 456 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | -4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | | | +(10 rows) + +explain (verbose, costs off) +select * from + int8_tbl a left join + lateral (select *, coalesce(a.q2, 42) as x from int8_tbl b) ss on a.q2 = ss.q1; + QUERY PLAN +------------------------------------------------------------------ + Nested Loop Left Join + Output: a.q1, a.q2, b.q1, b.q2, (COALESCE(a.q2, '42'::bigint)) + -> Seq Scan on public.int8_tbl a + Output: a.q1, a.q2 + -> Seq Scan on public.int8_tbl b + Output: b.q1, b.q2, COALESCE(a.q2, '42'::bigint) + Filter: (a.q2 = b.q1) + Optimizer: Postgres query optimizer +(8 rows) + +select * from + int8_tbl a left join + lateral (select *, coalesce(a.q2, 42) as x from int8_tbl b) ss on a.q2 = ss.q1; + q1 | q2 | q1 | q2 | x +------------------+-------------------+------------------+-------------------+------------------ + 123 | 456 | | | + 123 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 123 | 4567890123456789 | 4567890123456789 | -4567890123456789 | 4567890123456789 + 4567890123456789 | 123 | 123 | 456 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | -4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | | | +(10 rows) + +-- lateral can result in join conditions appearing below their +-- real semantic level +explain (verbose, costs off) +select * from int4_tbl i left join + lateral (select * from int2_tbl j where i.f1 = j.f1) k on true; + QUERY PLAN +------------------------------------------- + Hash Left Join + Output: i.f1, j.f1 + Hash Cond: (i.f1 = j.f1) + -> Seq Scan on public.int4_tbl i + Output: i.f1 + -> Hash + Output: j.f1 + -> Seq Scan on public.int2_tbl j + Output: j.f1 + Optimizer: Postgres query optimizer +(10 rows) + +select * from int4_tbl i left join + lateral (select * from int2_tbl j where i.f1 = j.f1) k on true; + f1 | f1 +-------------+---- + 0 | 0 + 123456 | + -123456 | + 2147483647 | + -2147483647 | +(5 rows) + +explain (verbose, costs off) +select * from int4_tbl i left join + lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true; + QUERY PLAN +------------------------------------- + Nested Loop Left Join + Output: i.f1, (COALESCE(i.*)) + -> Seq Scan on public.int4_tbl i + Output: i.f1, i.* + -> Seq Scan on public.int2_tbl j + Output: j.f1, COALESCE(i.*) + Filter: (i.f1 = j.f1) + Optimizer: Postgres query optimizer +(8 rows) + +select * from int4_tbl i left join + lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true; + f1 | coalesce +-------------+---------- + 0 | (0) + 123456 | + -123456 | + 2147483647 | + -2147483647 | +(5 rows) + +explain (verbose, costs off) +select * from int4_tbl a, + lateral ( + select * from int4_tbl b left join int8_tbl c on (b.f1 = q1 and a.f1 = q2) + ) ss; + QUERY PLAN +------------------------------------------------------- + Nested Loop + Output: a.f1, b.f1, c.q1, c.q2 + -> Seq Scan on public.int4_tbl a + Output: a.f1 + -> Materialize + Output: b.f1, c.q1, c.q2 + -> Hash Left Join + Output: b.f1, c.q1, c.q2 + Hash Cond: (b.f1 = c.q1) + -> Seq Scan on public.int4_tbl b + Output: b.f1 + -> Hash + Output: c.q1, c.q2 + -> Seq Scan on public.int8_tbl c + Output: c.q1, c.q2 + Filter: (a.f1 = c.q2) + Optimizer: Postgres query optimizer +(17 rows) + +select * from int4_tbl a, + lateral ( + select * from int4_tbl b left join int8_tbl c on (b.f1 = q1 and a.f1 = q2) + ) ss; + f1 | f1 | q1 | q2 +-------------+-------------+----+---- + 0 | 0 | | + 0 | 123456 | | + 0 | -123456 | | + 0 | 2147483647 | | + 0 | -2147483647 | | + 123456 | 0 | | + 123456 | 123456 | | + 123456 | -123456 | | + 123456 | 2147483647 | | + 123456 | -2147483647 | | + -123456 | 0 | | + -123456 | 123456 | | + -123456 | -123456 | | + -123456 | 2147483647 | | + -123456 | -2147483647 | | + 2147483647 | 0 | | + 2147483647 | 123456 | | + 2147483647 | -123456 | | + 2147483647 | 2147483647 | | + 2147483647 | -2147483647 | | + -2147483647 | 0 | | + -2147483647 | 123456 | | + -2147483647 | -123456 | | + -2147483647 | 2147483647 | | + -2147483647 | -2147483647 | | +(25 rows) + +-- lateral reference in a PlaceHolderVar evaluated at join level +explain (verbose, costs off) +select * from + int8_tbl a left join lateral + (select b.q1 as bq1, c.q1 as cq1, least(a.q1,b.q1,c.q1) from + int8_tbl b cross join int8_tbl c) ss + on a.q2 = ss.bq1; + QUERY PLAN +------------------------------------------------------------- + Nested Loop Left Join + Output: a.q1, a.q2, b.q1, c.q1, (LEAST(a.q1, b.q1, c.q1)) + -> Seq Scan on public.int8_tbl a + Output: a.q1, a.q2 + -> Nested Loop + Output: b.q1, c.q1, LEAST(a.q1, b.q1, c.q1) + -> Seq Scan on public.int8_tbl b + Output: b.q1, b.q2 + Filter: (a.q2 = b.q1) + -> Seq Scan on public.int8_tbl c + Output: c.q1, c.q2 + Optimizer: Postgres query optimizer +(12 rows) + +select * from + int8_tbl a left join lateral + (select b.q1 as bq1, c.q1 as cq1, least(a.q1,b.q1,c.q1) from + int8_tbl b cross join int8_tbl c) ss + on a.q2 = ss.bq1; + q1 | q2 | bq1 | cq1 | least +------------------+-------------------+------------------+------------------+------------------ + 123 | 456 | | | + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 123 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 123 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 + 4567890123456789 | 123 | 123 | 123 | 123 + 4567890123456789 | 123 | 123 | 123 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 123 | 123 | 123 | 123 + 4567890123456789 | 123 | 123 | 123 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 123 | 123 | 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 123 | 123 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 | | | +(42 rows) + +-- case requiring nested PlaceHolderVars +explain (verbose, costs off) +select * from + int8_tbl c left join ( + int8_tbl a left join (select q1, coalesce(q2,42) as x from int8_tbl b) ss1 + on a.q2 = ss1.q1 + cross join + lateral (select q1, coalesce(ss1.x,q2) as y from int8_tbl d) ss2 + ) on c.q2 = ss2.q1, + lateral (select ss2.y offset 0) ss3; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Nested Loop + Output: c.q1, c.q2, a.q1, a.q2, b.q1, (COALESCE(b.q2, '42'::bigint)), d.q1, (COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2)), ((COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2))) + -> Hash Right Join + Output: c.q1, c.q2, a.q1, a.q2, b.q1, d.q1, (COALESCE(b.q2, '42'::bigint)), (COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2)) + Hash Cond: (d.q1 = c.q2) + -> Nested Loop + Output: a.q1, a.q2, b.q1, d.q1, (COALESCE(b.q2, '42'::bigint)), (COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2)) + -> Hash Left Join + Output: a.q1, a.q2, b.q1, (COALESCE(b.q2, '42'::bigint)) + Hash Cond: (a.q2 = b.q1) + -> Seq Scan on public.int8_tbl a + Output: a.q1, a.q2 + -> Hash + Output: b.q1, (COALESCE(b.q2, '42'::bigint)) + -> Seq Scan on public.int8_tbl b + Output: b.q1, COALESCE(b.q2, '42'::bigint) + -> Seq Scan on public.int8_tbl d + Output: d.q1, COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2) + -> Hash + Output: c.q1, c.q2 + -> Seq Scan on public.int8_tbl c + Output: c.q1, c.q2 + -> Materialize + Output: ((COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2))) + -> Result + Output: (COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2)) + Optimizer: Postgres query optimizer +(27 rows) + +-- case that breaks the old ph_may_need optimization +explain (verbose, costs off) +select c.*,a.*,ss1.q1,ss2.q1,ss3.* from + int8_tbl c left join ( + int8_tbl a left join + (select q1, coalesce(q2,f1) as x from int8_tbl b, int4_tbl b2 + where q1 < f1) ss1 + on a.q2 = ss1.q1 + cross join + lateral (select q1, coalesce(ss1.x,q2) as y from int8_tbl d) ss2 + ) on c.q2 = ss2.q1, + lateral (select * from int4_tbl i where ss2.y > f1) ss3; + QUERY PLAN +--------------------------------------------------------------------------------------------------------- + Nested Loop + Output: c.q1, c.q2, a.q1, a.q2, b.q1, d.q1, i.f1 + Join Filter: ((COALESCE((COALESCE(b.q2, (b2.f1)::bigint)), d.q2)) > i.f1) + -> Hash Right Join + Output: c.q1, c.q2, a.q1, a.q2, b.q1, d.q1, (COALESCE((COALESCE(b.q2, (b2.f1)::bigint)), d.q2)) + Hash Cond: (d.q1 = c.q2) + -> Nested Loop + Output: a.q1, a.q2, b.q1, d.q1, (COALESCE((COALESCE(b.q2, (b2.f1)::bigint)), d.q2)) + -> Hash Right Join + Output: a.q1, a.q2, b.q1, (COALESCE(b.q2, (b2.f1)::bigint)) + Hash Cond: (b.q1 = a.q2) + -> Nested Loop + Output: b.q1, COALESCE(b.q2, (b2.f1)::bigint) + Join Filter: (b.q1 < b2.f1) + -> Seq Scan on public.int8_tbl b + Output: b.q1, b.q2 + -> Materialize + Output: b2.f1 + -> Seq Scan on public.int4_tbl b2 + Output: b2.f1 + -> Hash + Output: a.q1, a.q2 + -> Seq Scan on public.int8_tbl a + Output: a.q1, a.q2 + -> Seq Scan on public.int8_tbl d + Output: d.q1, COALESCE((COALESCE(b.q2, (b2.f1)::bigint)), d.q2) + -> Hash + Output: c.q1, c.q2 + -> Seq Scan on public.int8_tbl c + Output: c.q1, c.q2 + -> Materialize + Output: i.f1 + -> Seq Scan on public.int4_tbl i + Output: i.f1 + Optimizer: Postgres query optimizer +(35 rows) + +-- check processing of postponed quals (bug #9041) +explain (verbose, costs off) +select * from + (select 1 as x offset 0) x cross join (select 2 as y offset 0) y + left join lateral ( + select * from (select 3 as z offset 0) z where z.z = x.x + ) zz on zz.z = y.y; + QUERY PLAN +-------------------------------------------- + Hash Left Join + Output: (1), (2), (3) + Hash Cond: (((1) = (3)) AND ((2) = (3))) + -> Nested Loop + Output: (1), (2) + -> Result + Output: 1 + -> Materialize + Output: (2) + -> Result + Output: 2 + -> Hash + Output: (3) + -> Result + Output: 3 + Optimizer: Postgres query optimizer +(16 rows) + +-- check dummy rels with lateral references (bug #15694) +explain (verbose, costs off) +select * from int8_tbl i8 left join lateral + (select *, i8.q2 from int4_tbl where false) ss on true; + QUERY PLAN +-------------------------------------- + Nested Loop Left Join + Output: i8.q1, i8.q2, f1, (i8.q2) + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + -> Result + Output: f1, i8.q2 + One-Time Filter: false + Optimizer: Postgres query optimizer +(8 rows) + +explain (verbose, costs off) +select * from int8_tbl i8 left join lateral + (select *, i8.q2 from int4_tbl i1, int4_tbl i2 where false) ss on true; + QUERY PLAN +----------------------------------------- + Nested Loop Left Join + Output: i8.q1, i8.q2, f1, f1, (i8.q2) + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, i8.q2 + -> Result + Output: f1, f1, i8.q2 + One-Time Filter: false + Optimizer: Postgres query optimizer +(8 rows) + +-- check handling of nested appendrels inside LATERAL +select * from + ((select 2 as v) union all (select 3 as v)) as q1 + cross join lateral + ((select * from + ((select 4 as v) union all (select 5 as v)) as q3) + union all + (select q1.v) + ) as q2; + v | v +---+--- + 2 | 4 + 2 | 5 + 2 | 2 + 3 | 4 + 3 | 5 + 3 | 3 +(6 rows) + +-- check the number of columns specified +SELECT * FROM (int8_tbl i cross join int4_tbl j) ss(a,b,c,d); +ERROR: join expression "ss" has 3 columns available but 4 columns specified +-- check we don't try to do a unique-ified semijoin with LATERAL +explain (verbose, costs off) +select * from + (values (0,9998), (1,1000)) v(id,x), + lateral (select f1 from int4_tbl + where f1 = any (select unique1 from tenk1 + where unique2 = v.x offset 0)) ss; + QUERY PLAN +------------------------------------------------------------------ + Nested Loop + Output: "*VALUES*".column1, "*VALUES*".column2, int4_tbl.f1 + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1, "*VALUES*".column2 + -> Seq Scan on public.int4_tbl + Output: int4_tbl.f1 + Filter: (SubPlan 1) + SubPlan 1 + -> Index Scan using tenk1_unique2 on public.tenk1 + Output: tenk1.unique1 + Index Cond: (tenk1.unique2 = "*VALUES*".column2) + Optimizer: Postgres query optimizer +(12 rows) + +select * from + (values (0,9998), (1,1000)) v(id,x), + lateral (select f1 from int4_tbl + where f1 = any (select unique1 from tenk1 + where unique2 = v.x offset 0)) ss; + id | x | f1 +----+------+---- + 0 | 9998 | 0 +(1 row) + +-- check proper extParam/allParam handling (this isn't exactly a LATERAL issue, +-- but we can make the test case much more compact with LATERAL) +explain (verbose, costs off) +select * from (values (0), (1)) v(id), +lateral (select * from int8_tbl t1, + lateral (select * from + (select * from int8_tbl t2 + where q1 = any (select q2 from int8_tbl t3 + where q2 = (select greatest(t1.q1,t2.q2)) + and (select v.id=0)) offset 0) ss2) ss + where t1.q1 = ss.q2) ss0; + QUERY PLAN +----------------------------------------------------------------------- + Nested Loop + Output: "*VALUES*".column1, t1.q1, t1.q2, ss2.q1, ss2.q2 + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + -> Nested Loop + Output: t1.q1, t1.q2, ss2.q1, ss2.q2 + -> Seq Scan on public.int8_tbl t1 + Output: t1.q1, t1.q2 + -> Materialize + Output: ss2.q1, ss2.q2 + -> Subquery Scan on ss2 + Output: ss2.q1, ss2.q2 + Filter: (t1.q1 = ss2.q2) + -> Seq Scan on public.int8_tbl t2 + Output: t2.q1, t2.q2 + Filter: (SubPlan 3) + SubPlan 3 + -> Result + Output: t3.q2 + One-Time Filter: $4 + InitPlan 1 (returns $2) + -> Result + Output: GREATEST($0, t2.q2) + InitPlan 2 (returns $4) + -> Result + Output: ($3 = 0) + -> Seq Scan on public.int8_tbl t3 + Output: t3.q1, t3.q2 + Filter: (t3.q2 = $2) + Optimizer: Postgres query optimizer +(30 rows) + +select * from (values (0), (1)) v(id), +lateral (select * from int8_tbl t1, + lateral (select * from + (select * from int8_tbl t2 + where q1 = any (select q2 from int8_tbl t3 + where q2 = (select greatest(t1.q1,t2.q2)) + and (select v.id=0)) offset 0) ss2) ss + where t1.q1 = ss.q2) ss0; + id | q1 | q2 | q1 | q2 +----+------------------+-------------------+------------------+------------------ + 0 | 4567890123456789 | 123 | 4567890123456789 | 4567890123456789 + 0 | 4567890123456789 | 4567890123456789 | 4567890123456789 | 4567890123456789 + 0 | 4567890123456789 | -4567890123456789 | 4567890123456789 | 4567890123456789 +(3 rows) + +-- test some error cases where LATERAL should have been used but wasn't +select f1,g from int4_tbl a, (select f1 as g) ss; +ERROR: column "f1" does not exist +LINE 1: select f1,g from int4_tbl a, (select f1 as g) ss; + ^ +HINT: There is a column named "f1" in table "a", but it cannot be referenced from this part of the query. +select f1,g from int4_tbl a, (select a.f1 as g) ss; +ERROR: invalid reference to FROM-clause entry for table "a" +LINE 1: select f1,g from int4_tbl a, (select a.f1 as g) ss; + ^ +HINT: There is an entry for table "a", but it cannot be referenced from this part of the query. +select f1,g from int4_tbl a cross join (select f1 as g) ss; +ERROR: column "f1" does not exist +LINE 1: select f1,g from int4_tbl a cross join (select f1 as g) ss; + ^ +HINT: There is a column named "f1" in table "a", but it cannot be referenced from this part of the query. +select f1,g from int4_tbl a cross join (select a.f1 as g) ss; +ERROR: invalid reference to FROM-clause entry for table "a" +LINE 1: select f1,g from int4_tbl a cross join (select a.f1 as g) ss... + ^ +HINT: There is an entry for table "a", but it cannot be referenced from this part of the query. +-- SQL:2008 says the left table is in scope but illegal to access here +select f1,g from int4_tbl a right join lateral generate_series(0, a.f1) g on true; +ERROR: invalid reference to FROM-clause entry for table "a" +LINE 1: ... int4_tbl a right join lateral generate_series(0, a.f1) g on... + ^ +DETAIL: The combining JOIN type must be INNER or LEFT for a LATERAL reference. +select f1,g from int4_tbl a full join lateral generate_series(0, a.f1) g on true; +ERROR: invalid reference to FROM-clause entry for table "a" +LINE 1: ...m int4_tbl a full join lateral generate_series(0, a.f1) g on... + ^ +DETAIL: The combining JOIN type must be INNER or LEFT for a LATERAL reference. +-- check we complain about ambiguous table references +select * from + int8_tbl x cross join (int4_tbl x cross join lateral (select x.f1) ss); +ERROR: table reference "x" is ambiguous +LINE 2: ...cross join (int4_tbl x cross join lateral (select x.f1) ss); + ^ +-- LATERAL can be used to put an aggregate into the FROM clause of its query +select 1 from tenk1 a, lateral (select max(a.unique1) from int4_tbl b) ss; +ERROR: aggregate functions are not allowed in FROM clause of their own query level +LINE 1: select 1 from tenk1 a, lateral (select max(a.unique1) from i... + ^ +-- check behavior of LATERAL in UPDATE/DELETE +create temp table xx1 as select f1 as x1, -f1 as x2 from int4_tbl; +-- error, can't do this: +update xx1 set x2 = f1 from (select * from int4_tbl where f1 = x1) ss; +ERROR: column "x1" does not exist +LINE 1: ... set x2 = f1 from (select * from int4_tbl where f1 = x1) ss; + ^ +HINT: There is a column named "x1" in table "xx1", but it cannot be referenced from this part of the query. +update xx1 set x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss; +ERROR: invalid reference to FROM-clause entry for table "xx1" +LINE 1: ...t x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss... + ^ +HINT: There is an entry for table "xx1", but it cannot be referenced from this part of the query. +-- can't do it even with LATERAL: +update xx1 set x2 = f1 from lateral (select * from int4_tbl where f1 = x1) ss; +ERROR: invalid reference to FROM-clause entry for table "xx1" +LINE 1: ...= f1 from lateral (select * from int4_tbl where f1 = x1) ss; + ^ +HINT: There is an entry for table "xx1", but it cannot be referenced from this part of the query. +-- we might in future allow something like this, but for now it's an error: +update xx1 set x2 = f1 from xx1, lateral (select * from int4_tbl where f1 = x1) ss; +ERROR: table name "xx1" specified more than once +-- also errors: +delete from xx1 using (select * from int4_tbl where f1 = x1) ss; +ERROR: column "x1" does not exist +LINE 1: ...te from xx1 using (select * from int4_tbl where f1 = x1) ss; + ^ +HINT: There is a column named "x1" in table "xx1", but it cannot be referenced from this part of the query. +delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss; +ERROR: invalid reference to FROM-clause entry for table "xx1" +LINE 1: ...from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss... + ^ +HINT: There is an entry for table "xx1", but it cannot be referenced from this part of the query. +delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss; +ERROR: invalid reference to FROM-clause entry for table "xx1" +LINE 1: ...xx1 using lateral (select * from int4_tbl where f1 = x1) ss; + ^ +HINT: There is an entry for table "xx1", but it cannot be referenced from this part of the query. +-- +-- test LATERAL reference propagation down a multi-level inheritance hierarchy +-- produced for a multi-level partitioned table hierarchy. +-- +create table join_pt1 (a int, b int, c varchar) partition by range(a); +create table join_pt1p1 partition of join_pt1 for values from (0) to (100) partition by range(b); +create table join_pt1p2 partition of join_pt1 for values from (100) to (200); +create table join_pt1p1p1 partition of join_pt1p1 for values from (0) to (100); +insert into join_pt1 values (1, 1, 'x'), (101, 101, 'y'); +create table join_ut1 (a int, b int, c varchar); +insert into join_ut1 values (101, 101, 'y'), (2, 2, 'z'); +explain (verbose, costs off) +select t1.b, ss.phv from join_ut1 t1 left join lateral + (select t2.a as t2a, t3.a t3a, least(t1.a, t2.a, t3.a) phv + from join_pt1 t2 join join_ut1 t3 on t2.a = t3.b) ss + on t1.a = ss.t2a order by t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Output: t1.b, (LEAST(t1.a, t2.a, t3.a)), t1.a + Sort Key: t1.a + -> Nested Loop Left Join + Output: t1.b, (LEAST(t1.a, t2.a, t3.a)), t1.a + -> Seq Scan on public.join_ut1 t1 + Output: t1.a, t1.b, t1.c + -> Hash Join + Output: t2.a, LEAST(t1.a, t2.a, t3.a) + Hash Cond: (t3.b = t2.a) + -> Seq Scan on public.join_ut1 t3 + Output: t3.a, t3.b, t3.c + -> Hash + Output: t2.a + -> Append + -> Seq Scan on public.join_pt1p1p1 t2_1 + Output: t2_1.a + Filter: (t1.a = t2_1.a) + -> Seq Scan on public.join_pt1p2 t2_2 + Output: t2_2.a + Filter: (t1.a = t2_2.a) + Optimizer: Postgres query optimizer +(22 rows) + +select t1.b, ss.phv from join_ut1 t1 left join lateral + (select t2.a as t2a, t3.a t3a, least(t1.a, t2.a, t3.a) phv + from join_pt1 t2 join join_ut1 t3 on t2.a = t3.b) ss + on t1.a = ss.t2a order by t1.a; + b | phv +-----+----- + 2 | + 101 | 101 +(2 rows) + +drop table join_pt1; +drop table join_ut1; +-- +-- test estimation behavior with multi-column foreign key and constant qual +-- +begin; +create table fkest (x integer, x10 integer, x10b integer, x100 integer); +insert into fkest select x, x/10, x/10, x/100 from generate_series(1,1000) x; +create unique index on fkest(x, x10, x100); +analyze fkest; +explain (costs off) +select * from fkest f1 + join fkest f2 on (f1.x = f2.x and f1.x10 = f2.x10b and f1.x100 = f2.x100) + join fkest f3 on f1.x = f3.x + where f1.x100 = 2; + QUERY PLAN +----------------------------------------------------------------- + Hash Join + Hash Cond: (f3.x = f1.x) + -> Seq Scan on fkest f3 + -> Hash + -> Hash Join + Hash Cond: ((f1.x = f2.x) AND (f1.x10 = f2.x10b)) + -> Seq Scan on fkest f1 + Filter: (x100 = 2) + -> Hash + -> Seq Scan on fkest f2 + Filter: (x100 = 2) + Optimizer: Postgres query optimizer +(12 rows) + +alter table fkest add constraint fk + foreign key (x, x10b, x100) references fkest (x, x10, x100); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +explain (costs off) +select * from fkest f1 + join fkest f2 on (f1.x = f2.x and f1.x10 = f2.x10b and f1.x100 = f2.x100) + join fkest f3 on f1.x = f3.x + where f1.x100 = 2; + QUERY PLAN +----------------------------------------------------- + Hash Join + Hash Cond: ((f1.x = f2.x) AND (f1.x10 = f2.x10b)) + -> Hash Join + Hash Cond: (f3.x = f1.x) + -> Seq Scan on fkest f3 + -> Hash + -> Seq Scan on fkest f1 + Filter: (x100 = 2) + -> Hash + -> Seq Scan on fkest f2 + Filter: (x100 = 2) + Optimizer: Postgres query optimizer +(12 rows) + +rollback; +-- +-- test that foreign key join estimation performs sanely for outer joins +-- +begin; +create table fkest (a int, b int, c int unique, primary key(a,b)); +create table fkest1 (a int, b int, primary key(a,b)); +insert into fkest select x/10, x%10, x from generate_series(1,1000) x; +insert into fkest1 select x/10, x%10 from generate_series(1,1000) x; +alter table fkest1 + add constraint fkest1_a_b_fkey foreign key (a,b) references fkest; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +analyze fkest; +analyze fkest1; +explain (costs off) +select * +from fkest f + left join fkest1 f1 on f.a = f1.a and f.b = f1.b + left join fkest1 f2 on f.a = f2.a and f.b = f2.b + left join fkest1 f3 on f.a = f3.a and f.b = f3.b +where f.c = 1; + QUERY PLAN +----------------------------------------------------------------------------- + Hash Right Join + Hash Cond: ((f3.a = f.a) AND (f3.b = f.b)) + -> Seq Scan on fkest1 f3 + -> Hash + -> Hash Right Join + Hash Cond: ((f2.a = f.a) AND (f2.b = f.b)) + -> Seq Scan on fkest1 f2 + -> Hash + -> Hash Right Join + Hash Cond: ((f1.a = f.a) AND (f1.b = f.b)) + -> Seq Scan on fkest1 f1 + -> Hash + -> Index Scan using fkest_c_key on fkest f + Index Cond: (c = 1) + Optimizer: Postgres query optimizer +(15 rows) + +rollback; +-- +-- test planner's ability to mark joins as unique +-- +create table j1 (id int primary key); +create table j2 (id int primary key); +create table j3 (id int); +insert into j1 values(1),(2),(3); +insert into j2 values(1),(2),(3); +insert into j3 values(1),(1); +analyze j1; +analyze j2; +analyze j3; +-- ensure join is properly marked as unique +explain (verbose, costs off) +select * from j1 inner join j2 on j1.id = j2.id; + QUERY PLAN +------------------------------------- + Hash Join + Output: j1.id, j2.id + Inner Unique: true + Hash Cond: (j1.id = j2.id) + -> Seq Scan on public.j1 + Output: j1.id + -> Hash + Output: j2.id + -> Seq Scan on public.j2 + Output: j2.id + Optimizer: Postgres query optimizer +(11 rows) + +-- ensure join is not unique when not an equi-join +explain (verbose, costs off) +select * from j1 inner join j2 on j1.id > j2.id; + QUERY PLAN +------------------------------------- + Nested Loop + Output: j1.id, j2.id + Join Filter: (j1.id > j2.id) + -> Seq Scan on public.j1 + Output: j1.id + -> Materialize + Output: j2.id + -> Seq Scan on public.j2 + Output: j2.id + Optimizer: Postgres query optimizer +(10 rows) + +-- ensure non-unique rel is not chosen as inner +explain (verbose, costs off) +select * from j1 inner join j3 on j1.id = j3.id; + QUERY PLAN +------------------------------------- + Hash Join + Output: j1.id, j3.id + Hash Cond: (j1.id = j3.id) + -> Seq Scan on public.j1 + Output: j1.id + -> Hash + Output: j3.id + -> Seq Scan on public.j3 + Output: j3.id + Optimizer: Postgres query optimizer +(10 rows) + +-- ensure left join is marked as unique +explain (verbose, costs off) +select * from j1 left join j2 on j1.id = j2.id; + QUERY PLAN +------------------------------------- + Hash Left Join + Output: j1.id, j2.id + Inner Unique: true + Hash Cond: (j1.id = j2.id) + -> Seq Scan on public.j1 + Output: j1.id + -> Hash + Output: j2.id + -> Seq Scan on public.j2 + Output: j2.id + Optimizer: Postgres query optimizer +(11 rows) + +-- ensure right join is marked as unique +explain (verbose, costs off) +select * from j1 right join j2 on j1.id = j2.id; + QUERY PLAN +------------------------------------- + Hash Left Join + Output: j1.id, j2.id + Inner Unique: true + Hash Cond: (j2.id = j1.id) + -> Seq Scan on public.j2 + Output: j2.id + -> Hash + Output: j1.id + -> Seq Scan on public.j1 + Output: j1.id + Optimizer: Postgres query optimizer +(11 rows) + +-- ensure full join is marked as unique +explain (verbose, costs off) +select * from j1 full join j2 on j1.id = j2.id; + QUERY PLAN +------------------------------------- + Hash Full Join + Output: j1.id, j2.id + Inner Unique: true + Hash Cond: (j1.id = j2.id) + -> Seq Scan on public.j1 + Output: j1.id + -> Hash + Output: j2.id + -> Seq Scan on public.j2 + Output: j2.id + Optimizer: Postgres query optimizer +(11 rows) + +-- a clauseless (cross) join can't be unique +explain (verbose, costs off) +select * from j1 cross join j2; + QUERY PLAN +------------------------------------- + Nested Loop + Output: j1.id, j2.id + -> Seq Scan on public.j1 + Output: j1.id + -> Materialize + Output: j2.id + -> Seq Scan on public.j2 + Output: j2.id + Optimizer: Postgres query optimizer +(9 rows) + +-- ensure a natural join is marked as unique +explain (verbose, costs off) +select * from j1 natural join j2; + QUERY PLAN +------------------------------------- + Hash Join + Output: j1.id + Inner Unique: true + Hash Cond: (j1.id = j2.id) + -> Seq Scan on public.j1 + Output: j1.id + -> Hash + Output: j2.id + -> Seq Scan on public.j2 + Output: j2.id + Optimizer: Postgres query optimizer +(11 rows) + +-- ensure a distinct clause allows the inner to become unique +explain (verbose, costs off) +select * from j1 +inner join (select distinct id from j3) j3 on j1.id = j3.id; + QUERY PLAN +----------------------------------------------- + Hash Join + Output: j1.id, j3.id + Inner Unique: true + Hash Cond: (j1.id = j3.id) + -> Seq Scan on public.j1 + Output: j1.id + -> Hash + Output: j3.id + -> Unique + Output: j3.id + Group Key: j3.id + -> Sort + Output: j3.id + Sort Key: j3.id + -> Seq Scan on public.j3 + Output: j3.id + Optimizer: Postgres query optimizer +(17 rows) + +-- ensure group by clause allows the inner to become unique +explain (verbose, costs off) +select * from j1 +inner join (select id from j3 group by id) j3 on j1.id = j3.id; + QUERY PLAN +----------------------------------------- + Hash Join + Output: j1.id, j3.id + Inner Unique: true + Hash Cond: (j1.id = j3.id) + -> Seq Scan on public.j1 + Output: j1.id + -> Hash + Output: j3.id + -> HashAggregate + Output: j3.id + Group Key: j3.id + -> Seq Scan on public.j3 + Output: j3.id + Optimizer: Postgres query optimizer +(14 rows) + +drop table j1; +drop table j2; +drop table j3; +-- test more complex permutations of unique joins +create table j1 (id1 int, id2 int, primary key(id1,id2)); +create table j2 (id1 int, id2 int, primary key(id1,id2)); +create table j3 (id1 int, id2 int, primary key(id1,id2)); +insert into j1 values(1,1),(1,2); +insert into j2 values(1,1); +insert into j3 values(1,1); +analyze j1; +analyze j2; +analyze j3; +-- ensure there's no unique join when not all columns which are part of the +-- unique index are seen in the join clause +explain (verbose, costs off) +select * from j1 +inner join j2 on j1.id1 = j2.id1; + QUERY PLAN +------------------------------------------ + Hash Join + Output: j1.id1, j1.id2, j2.id1, j2.id2 + Hash Cond: (j1.id1 = j2.id1) + -> Seq Scan on public.j1 + Output: j1.id1, j1.id2 + -> Hash + Output: j2.id1, j2.id2 + -> Seq Scan on public.j2 + Output: j2.id1, j2.id2 + Optimizer: Postgres query optimizer +(10 rows) + +-- ensure proper unique detection with multiple join quals +explain (verbose, costs off) +select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2; + QUERY PLAN +-------------------------------------------------------- + Hash Join + Output: j1.id1, j1.id2, j2.id1, j2.id2 + Inner Unique: true + Hash Cond: ((j1.id1 = j2.id1) AND (j1.id2 = j2.id2)) + -> Seq Scan on public.j1 + Output: j1.id1, j1.id2 + -> Hash + Output: j2.id1, j2.id2 + -> Seq Scan on public.j2 + Output: j2.id1, j2.id2 + Optimizer: Postgres query optimizer +(11 rows) + +-- ensure we don't detect the join to be unique when quals are not part of the +-- join condition +explain (verbose, costs off) +select * from j1 +inner join j2 on j1.id1 = j2.id1 where j1.id2 = 1; + QUERY PLAN +------------------------------------------ + Hash Join + Output: j1.id1, j1.id2, j2.id1, j2.id2 + Hash Cond: (j1.id1 = j2.id1) + -> Seq Scan on public.j1 + Output: j1.id1, j1.id2 + Filter: (j1.id2 = 1) + -> Hash + Output: j2.id1, j2.id2 + -> Seq Scan on public.j2 + Output: j2.id1, j2.id2 + Optimizer: Postgres query optimizer +(11 rows) + +-- as above, but for left joins. +explain (verbose, costs off) +select * from j1 +left join j2 on j1.id1 = j2.id1 where j1.id2 = 1; + QUERY PLAN +------------------------------------------ + Hash Left Join + Output: j1.id1, j1.id2, j2.id1, j2.id2 + Hash Cond: (j1.id1 = j2.id1) + -> Seq Scan on public.j1 + Output: j1.id1, j1.id2 + Filter: (j1.id2 = 1) + -> Hash + Output: j2.id1, j2.id2 + -> Seq Scan on public.j2 + Output: j2.id1, j2.id2 + Optimizer: Postgres query optimizer +(11 rows) + +-- validate logic in merge joins which skips mark and restore. +-- it should only do this if all quals which were used to detect the unique +-- are present as join quals, and not plain quals. +set enable_nestloop to 0; +set enable_hashjoin to 0; +set enable_sort to 0; +-- create indexes that will be preferred over the PKs to perform the join +create index j1_id1_idx on j1 (id1) where id1 % 1000 = 1; +create index j2_id1_idx on j2 (id1) where id1 % 1000 = 1; +-- need an additional row in j2, if we want j2_id1_idx to be preferred +insert into j2 values(1,2); +analyze j2; +explain (costs off) select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1; + QUERY PLAN +---------------------------------------------------------- + Nested Loop + Join Filter: ((j1.id1 = j2.id1) AND (j1.id2 = j2.id2)) + -> Seq Scan on j1 + Filter: ((id1 % 1000) = 1) + -> Seq Scan on j2 + Filter: ((id1 % 1000) = 1) + Optimizer: Postgres query optimizer +(7 rows) + +select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1; + id1 | id2 | id1 | id2 +-----+-----+-----+----- + 1 | 1 | 1 | 1 + 1 | 2 | 1 | 2 +(2 rows) + +-- Exercise array keys mark/restore B-Tree code +explain (costs off) select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 = any (array[1]); + QUERY PLAN +------------------------------------------------------------------------- + Nested Loop + Join Filter: ((j1.id1 = j2.id1) AND (j1.id2 = j2.id2)) + -> Seq Scan on j1 + Filter: ((id1 = ANY ('{1}'::integer[])) AND ((id1 % 1000) = 1)) + -> Seq Scan on j2 + Filter: ((id1 = ANY ('{1}'::integer[])) AND ((id1 % 1000) = 1)) + Optimizer: Postgres query optimizer +(7 rows) + +select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 = any (array[1]); + id1 | id2 | id1 | id2 +-----+-----+-----+----- + 1 | 1 | 1 | 1 + 1 | 2 | 1 | 2 +(2 rows) + +-- Exercise array keys "find extreme element" B-Tree code +explain (costs off) select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 >= any (array[1,5]); + QUERY PLAN +---------------------------------------------------------------------------- + Nested Loop + Join Filter: ((j1.id1 = j2.id1) AND (j1.id2 = j2.id2)) + -> Seq Scan on j1 + Filter: ((id1 >= ANY ('{1,5}'::integer[])) AND ((id1 % 1000) = 1)) + -> Seq Scan on j2 + Filter: ((id1 >= ANY ('{1,5}'::integer[])) AND ((id1 % 1000) = 1)) + Optimizer: Postgres query optimizer +(7 rows) + +select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 >= any (array[1,5]); + id1 | id2 | id1 | id2 +-----+-----+-----+----- + 1 | 1 | 1 | 1 + 1 | 2 | 1 | 2 +(2 rows) + +reset enable_nestloop; +reset enable_hashjoin; +reset enable_sort; +drop table j1; +drop table j2; +drop table j3; +-- check that semijoin inner is not seen as unique for a portion of the outerrel +explain (verbose, costs off) +select t1.unique1, t2.hundred +from onek t1, tenk1 t2 +where exists (select 1 from tenk1 t3 + where t3.thousand = t1.unique1 and t3.tenthous = t2.hundred) + and t1.unique1 < 1; + QUERY PLAN +--------------------------------------------------------------------------------------- + Hash Join + Output: t1.unique1, t2.hundred + Hash Cond: (t2.hundred = t3.tenthous) + -> Index Only Scan using tenk1_hundred on public.tenk1 t2 + Output: t2.hundred + -> Hash + Output: t1.unique1, t3.tenthous + -> Hash Join + Output: t1.unique1, t3.tenthous + Hash Cond: (t3.thousand = t1.unique1) + -> HashAggregate + Output: t3.thousand, t3.tenthous + Group Key: t3.thousand, t3.tenthous + -> Index Only Scan using tenk1_thous_tenthous on public.tenk1 t3 + Output: t3.thousand, t3.tenthous + Index Cond: (t3.thousand < 1) + -> Hash + Output: t1.unique1 + -> Index Only Scan using onek_unique1 on public.onek t1 + Output: t1.unique1 + Index Cond: (t1.unique1 < 1) + Optimizer: Postgres query optimizer +(22 rows) + +-- ... unless it actually is unique +create table j3 as select unique1, tenthous from onek; +vacuum analyze j3; +create unique index on j3(unique1, tenthous); +explain (verbose, costs off) +select t1.unique1, t2.hundred +from onek t1, tenk1 t2 +where exists (select 1 from j3 + where j3.unique1 = t1.unique1 and j3.tenthous = t2.hundred) + and t1.unique1 < 1; + QUERY PLAN +------------------------------------------------------------------------------ + Hash Join + Output: t1.unique1, t2.hundred + Hash Cond: (j3.unique1 = t1.unique1) + -> Hash Join + Output: t2.hundred, j3.unique1 + Hash Cond: (t2.hundred = j3.tenthous) + -> Index Only Scan using tenk1_hundred on public.tenk1 t2 + Output: t2.hundred + -> Hash + Output: j3.unique1, j3.tenthous + -> Index Only Scan using j3_unique1_tenthous_idx on public.j3 + Output: j3.unique1, j3.tenthous + Index Cond: (j3.unique1 < 1) + -> Hash + Output: t1.unique1 + -> Index Only Scan using onek_unique1 on public.onek t1 + Output: t1.unique1 + Index Cond: (t1.unique1 < 1) + Optimizer: Postgres query optimizer +(19 rows) + +drop table j3; diff --git a/src/test/singlenode_regress/expected/join_gp.out b/src/test/singlenode_regress/expected/join_gp.out new file mode 100644 index 00000000000..4d8be480687 --- /dev/null +++ b/src/test/singlenode_regress/expected/join_gp.out @@ -0,0 +1,1500 @@ +-- Extra GPDB tests for joins. +-- Ignore "workfile compresssion is not supported by this build" (see +-- 'zlib' test): +-- +-- start_matchignore +-- m/ERROR: workfile compresssion is not supported by this build/ +-- end_matchignore +-- +-- test numeric hash join +-- +set enable_hashjoin to on; +set enable_mergejoin to off; +set enable_nestloop to off; +create table nhtest (i numeric(10, 2)); +insert into nhtest values(100000.22); +insert into nhtest values(300000.19); +explain select * from nhtest a join nhtest b using (i); + QUERY PLAN +------------------------------------------------------------------------- + Hash Join (cost=177.40..7753.14 rows=55354 width=16) + Hash Cond: (a.i = b.i) + -> Seq Scan on nhtest a (cost=0.00..84.40 rows=7440 width=16) + -> Hash (cost=84.40..84.40 rows=7440 width=16) + -> Seq Scan on nhtest b (cost=0.00..84.40 rows=7440 width=16) + Optimizer: Postgres query optimizer +(6 rows) + +select * from nhtest a join nhtest b using (i); + i +----------- + 300000.19 + 100000.22 +(2 rows) + +create temp table l(a int); +insert into l values (1), (1), (2); +select * from l l1 join l l2 on l1.a = l2.a left join l l3 on l1.a = l3.a and l1.a = 2 order by 1,2,3; + a | a | a +---+---+--- + 1 | 1 | + 1 | 1 | + 1 | 1 | + 1 | 1 | + 2 | 2 | 2 +(5 rows) + +-- +-- test hash join +-- +create table hjtest (i int, j int); +insert into hjtest values(3, 4); +select count(*) from hjtest a1, hjtest a2 where a2.i = least (a1.i,4) and a2.j = 4; + count +------- + 1 +(1 row) + +-- +-- Test for correct behavior when there is a Merge Join on top of Materialize +-- on top of a Motion : +-- 1. Use FULL OUTER JOIN to induce a Merge Join +-- 2. Use a large tuple size to induce a Materialize +-- 3. Use gp_dist_random() to induce a Redistribute +-- +set enable_hashjoin to off; +set enable_mergejoin to on; +set enable_nestloop to off; +DROP TABLE IF EXISTS alpha; +DROP TABLE IF EXISTS theta; +CREATE TABLE alpha (i int, j int); +CREATE TABLE theta (i int, j char(10000000)); +INSERT INTO alpha values (1, 1), (2, 2); +INSERT INTO theta values (1, 'f'), (2, 'g'); +SELECT * +FROM gp_dist_random('alpha') FULL OUTER JOIN gp_dist_random('theta') + ON (alpha.i = theta.i) +WHERE (alpha.j IS NULL or theta.j IS NULL); + i | j | i | j +---+---+---+--- +(0 rows) + +reset enable_hashjoin; +reset enable_mergejoin; +reset enable_nestloop; +-- +-- Predicate propagation over equality conditions +-- +drop schema if exists pred; +NOTICE: schema "pred" does not exist, skipping +create schema pred; +set search_path=pred; +create table t1 (x int, y int, z int); +create table t2 (x int, y int, z int); +insert into t1 select i, i, i from generate_series(1,100) i; +insert into t2 select * from t1; +analyze t1; +analyze t2; +-- +-- infer over equalities +-- +explain select count(*) from t1,t2 where t1.x = 100 and t1.x = t2.x; + QUERY PLAN +------------------------------------------------------------------------- + Aggregate (cost=10000000004.52..10000000004.53 rows=1 width=8) + -> Nested Loop (cost=10000000000.00..10000000004.51 rows=3 width=0) + -> Seq Scan on t1 (cost=0.00..2.25 rows=1 width=4) + Filter: (x = 100) + -> Seq Scan on t2 (cost=0.00..2.25 rows=1 width=4) + Filter: (x = 100) + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from t1,t2 where t1.x = 100 and t1.x = t2.x; + count +------- + 1 +(1 row) + +-- +-- infer over >= +-- +explain select * from t1,t2 where t1.x = 100 and t2.x >= t1.x; + QUERY PLAN +-------------------------------------------------------------------- + Nested Loop (cost=10000000000.00..10000000004.51 rows=3 width=24) + Join Filter: (t2.x >= t1.x) + -> Seq Scan on t1 (cost=0.00..2.25 rows=1 width=12) + Filter: (x = 100) + -> Seq Scan on t2 (cost=0.00..2.25 rows=1 width=12) + Filter: (x >= 100) + Optimizer: Postgres query optimizer +(7 rows) + +select * from t1,t2 where t1.x = 100 and t2.x >= t1.x; + x | y | z | x | y | z +-----+-----+-----+-----+-----+----- + 100 | 100 | 100 | 100 | 100 | 100 +(1 row) + +-- +-- multiple inferences +-- +set optimizer_segments=2; +explain select * from t1,t2 where t1.x = 100 and t1.x = t2.y and t1.x <= t2.x; + QUERY PLAN +-------------------------------------------------------------------- + Nested Loop (cost=10000000000.00..10000000005.01 rows=3 width=24) + Join Filter: (t1.x <= t2.x) + -> Seq Scan on t1 (cost=0.00..2.25 rows=1 width=12) + Filter: (x = 100) + -> Seq Scan on t2 (cost=0.00..2.75 rows=1 width=12) + Filter: ((100 <= x) AND (y <= x) AND (y = 100)) + Optimizer: Postgres query optimizer +(7 rows) + +reset optimizer_segments; +select * from t1,t2 where t1.x = 100 and t1.x = t2.y and t1.x <= t2.x; + x | y | z | x | y | z +-----+-----+-----+-----+-----+----- + 100 | 100 | 100 | 100 | 100 | 100 +(1 row) + +-- +-- MPP-18537: hash clause references a constant in outer child target list +-- +create table hjn_test (i int, j int); +insert into hjn_test values(3, 4); +create table int4_tbl (f1 int); +insert into int4_tbl values(123456), (-2147483647), (0), (-123456), (2147483647); +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar,4) and hjn_test.j = 4; + count +------- + 1 +(1 row) + +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar,(array[4])[1]) and hjn_test.j = (array[4])[1]; + count +------- + 1 +(1 row) + +select count(*) from hjn_test, (select 3 as bar) foo where least (foo.bar,(array[4])[1]) = hjn_test.i and hjn_test.j = (array[4])[1]; + count +------- + 1 +(1 row) + +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar, least(4,10)) and hjn_test.j = least(4,10); + count +------- + 1 +(1 row) + +select * from int4_tbl a join int4_tbl b on (a.f1 = (select f1 from int4_tbl c where c.f1=b.f1)); + f1 | f1 +-------------+------------- + -2147483647 | -2147483647 + 123456 | 123456 + -123456 | -123456 + 0 | 0 + 2147483647 | 2147483647 +(5 rows) + +-- Same as the last query, but with a partitioned table (which requires a +-- Result node to do projection of the hash expression, as Append is not +-- projection-capable) +create table part4_tbl (f1 int4) partition by range (f1) (start(-1000000) end (1000000) every (1000000)); +insert into part4_tbl values + (-123457), (-123456), (-123455), + (-1), (0), (1), + (123455), (123456), (123457); +select * from part4_tbl a join part4_tbl b on (a.f1 = (select f1 from int4_tbl c where c.f1=b.f1)); + f1 | f1 +---------+--------- + 123456 | 123456 + -123456 | -123456 + 0 | 0 +(3 rows) + +-- +-- Test case where a Motion hash key is only needed for the redistribution, +-- and not returned in the final result set. There was a bug at one point where +-- tjoin.c1 was used as the hash key in a Motion node, but it was not added +-- to the sub-plans target list, causing a "variable not found in subplan +-- target list" error. +-- +create table tjoin1(dk integer, id integer); +create table tjoin2(dk integer, id integer, t text); +create table tjoin3(dk integer, id integer, t text); +insert into tjoin1 values (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3); +insert into tjoin2 values (1, 1, '1-1'), (1, 2, '1-2'), (2, 1, '2-1'), (2, 2, '2-2'); +insert into tjoin3 values (1, 1, '1-1'), (2, 1, '2-1'); +select tjoin1.id, tjoin2.t, tjoin3.t +from tjoin1 +left outer join (tjoin2 left outer join tjoin3 on tjoin2.id=tjoin3.id) on tjoin1.id=tjoin3.id; + id | t | t +----+-----+----- + 1 | 2-1 | 2-1 + 1 | 2-1 | 1-1 + 1 | 1-1 | 2-1 + 1 | 1-1 | 1-1 + 3 | | + 1 | 2-1 | 2-1 + 1 | 2-1 | 1-1 + 1 | 1-1 | 2-1 + 1 | 1-1 | 1-1 + 3 | | + 2 | | + 2 | | +(12 rows) + +set enable_hashjoin to off; +set optimizer_enable_hashjoin = off; +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar,4) and hjn_test.j = 4; + count +------- + 1 +(1 row) + +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar,(array[4])[1]) and hjn_test.j = (array[4])[1]; + count +------- + 1 +(1 row) + +select count(*) from hjn_test, (select 3 as bar) foo where least (foo.bar,(array[4])[1]) = hjn_test.i and hjn_test.j = (array[4])[1]; + count +------- + 1 +(1 row) + +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar, least(4,10)) and hjn_test.j = least(4,10); + count +------- + 1 +(1 row) + +select * from int4_tbl a join int4_tbl b on (a.f1 = (select f1 from int4_tbl c where c.f1=b.f1)); + f1 | f1 +-------------+------------- + -2147483647 | -2147483647 + 123456 | 123456 + -123456 | -123456 + 0 | 0 + 2147483647 | 2147483647 +(5 rows) + +reset enable_hashjoin; +reset optimizer_enable_hashjoin; +-- In case of Left Anti Semi Join, if the left rel is empty a dummy join +-- should be created +drop table if exists foo; +NOTICE: table "foo" does not exist, skipping +drop table if exists bar; +NOTICE: table "bar" does not exist, skipping +create table foo (a int, b int); +create table bar (c int, d int); +insert into foo select generate_series(1,10); +insert into bar select generate_series(1,10); +explain select a from foo where a<1 and a>1 and not exists (select c from bar where c=a); + QUERY PLAN +------------------------------------------ + Result (cost=0.00..0.00 rows=0 width=4) + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select a from foo where a<1 and a>1 and not exists (select c from bar where c=a); + a +--- +(0 rows) + +-- The merge join executor code doesn't support LASJ_NOTIN joins. Make sure +-- the planner doesn't create an invalid plan with them. +create index index_foo on foo (a); +create index index_bar on bar (c); +set enable_nestloop to off; +set enable_hashjoin to off; +set enable_mergejoin to on; +select * from foo where a not in (select c from bar where c <= 5); + a | b +----+--- + 6 | + 7 | + 8 | + 9 | + 10 | +(5 rows) + +set enable_nestloop to off; +set enable_hashjoin to on; +set enable_mergejoin to off; +create table dept +( + id int, + pid int, + name char(40) +); +insert into dept values(3, 0, 'root'); +insert into dept values(4, 3, '2<-1'); +insert into dept values(5, 4, '3<-2<-1'); +insert into dept values(6, 4, '4<-2<-1'); +insert into dept values(7, 3, '5<-1'); +insert into dept values(8, 7, '5<-1'); +insert into dept select i, i % 6 + 3 from generate_series(9,50) as i; +insert into dept select i, 99 from generate_series(100,15000) as i; +ANALYZE dept; +-- Test rescannable hashjoin with spilling hashtable +set statement_mem='1000kB'; +set gp_workfile_compression = off; +WITH RECURSIVE subdept(id, parent_department, name) AS +( + -- non recursive term + SELECT * FROM dept WHERE name = 'root' + UNION ALL + -- recursive term + SELECT d.* FROM dept AS d, subdept AS sd + WHERE d.pid = sd.id +) +SELECT count(*) FROM subdept; + count +------- + 48 +(1 row) + +-- Test rescannable hashjoin with spilling hashtable, with compression +set gp_workfile_compression = on; +WITH RECURSIVE subdept(id, parent_department, name) AS +( + -- non recursive term + SELECT * FROM dept WHERE name = 'root' + UNION ALL + -- recursive term + SELECT d.* FROM dept AS d, subdept AS sd + WHERE d.pid = sd.id +) +SELECT count(*) FROM subdept; + count +------- + 48 +(1 row) + +-- Test rescannable hashjoin with in-memory hashtable +reset statement_mem; +WITH RECURSIVE subdept(id, parent_department, name) AS +( + -- non recursive term + SELECT * FROM dept WHERE name = 'root' + UNION ALL + -- recursive term + SELECT d.* FROM dept AS d, subdept AS sd + WHERE d.pid = sd.id +) +SELECT count(*) FROM subdept; + count +------- + 48 +(1 row) + +-- MPP-29458 +-- When we join on a clause with two different types. If one table distribute by one type, the query plan +-- will redistribute data on another type. But the has values of two types would not be equal. The data will +-- redistribute to wrong segments. +create table test_timestamp_t1 (id numeric(10,0) ,field_dt date); +create table test_timestamp_t2 (id numeric(10,0),field_tms timestamp without time zone); +insert into test_timestamp_t1 values(10 ,'2018-1-10'); +insert into test_timestamp_t1 values(11 ,'2018-1-11'); +insert into test_timestamp_t2 values(10 ,'2018-1-10'::timestamp); +insert into test_timestamp_t2 values(11 ,'2018-1-11'::timestamp); +-- Test nest loop redistribute keys +set enable_nestloop to on; +set enable_hashjoin to on; +set enable_mergejoin to on; +select count(*) from test_timestamp_t1 t1 ,test_timestamp_t2 t2 where T1.id = T2.id and T1.field_dt = t2.field_tms; + count +------- + 2 +(1 row) + +-- Test hash join redistribute keys +set enable_nestloop to off; +set enable_hashjoin to on; +set enable_mergejoin to on; +select count(*) from test_timestamp_t1 t1 ,test_timestamp_t2 t2 where T1.id = T2.id and T1.field_dt = t2.field_tms; + count +------- + 2 +(1 row) + +drop table test_timestamp_t1; +drop table test_timestamp_t2; +-- Test merge join redistribute keys +create table test_timestamp_t1 (id numeric(10,0) ,field_dt date); +create table test_timestamp_t2 (id numeric(10,0),field_tms timestamp without time zone); +insert into test_timestamp_t1 values(10 ,'2018-1-10'); +insert into test_timestamp_t1 values(11 ,'2018-1-11'); +insert into test_timestamp_t2 values(10 ,'2018-1-10'::timestamp); +insert into test_timestamp_t2 values(11 ,'2018-1-11'::timestamp); +select * from test_timestamp_t1 t1 full outer join test_timestamp_t2 t2 on T1.id = T2.id and T1.field_dt = t2.field_tms; + id | field_dt | id | field_tms +----+------------+----+-------------------------- + 10 | 01-10-2018 | 10 | Wed Jan 10 00:00:00 2018 + 11 | 01-11-2018 | 11 | Thu Jan 11 00:00:00 2018 +(2 rows) + +-- test float type +set enable_nestloop to off; +set enable_hashjoin to on; +set enable_mergejoin to on; +create table test_float1(id int, data float4); +create table test_float2(id int, data float8); +insert into test_float1 values(1, 10), (2, 20); +insert into test_float2 values(3, 10), (4, 20); +select t1.id, t1.data, t2.id, t2.data from test_float1 t1, test_float2 t2 where t1.data = t2.data; + id | data | id | data +----+------+----+------ + 2 | 20 | 4 | 20 + 1 | 10 | 3 | 10 +(2 rows) + +-- test int type +create table test_int1(id int, data int4); +create table test_int2(id int, data int8); +insert into test_int1 values(1, 10), (2, 20); +insert into test_int2 values(3, 10), (4, 20); +select t1.id, t1.data, t2.id, t2.data from test_int1 t1, test_int2 t2 where t1.data = t2.data; + id | data | id | data +----+------+----+------ + 1 | 10 | 3 | 10 + 2 | 20 | 4 | 20 +(2 rows) + +-- Test to ensure that for full outer join on varchar columns, planner is successful in finding a sort operator in the catalog +create table input_table(a varchar(30), b varchar(30)); +set enable_hashjoin = off; +explain (costs off) select X.a from input_table X full join (select a from input_table) Y ON X.a = Y.a; + QUERY PLAN +----------------------------------------------------- + Merge Full Join + Merge Cond: ((x.a)::text = (input_table.a)::text) + -> Sort + Sort Key: x.a + -> Seq Scan on input_table x + -> Sort + Sort Key: input_table.a + -> Seq Scan on input_table + Optimizer: Postgres query optimizer +(9 rows) + +-- Cleanup +reset enable_hashjoin; +set client_min_messages='warning'; -- silence drop-cascade NOTICEs +drop schema pred cascade; +reset search_path; +-- github issue 5370 cases +drop table if exists t5370; +drop table if exists t5370_2; +create table t5370(id int,name text); +insert into t5370 select i,i from generate_series(1,1000) i; +create table t5370_2 as select * from t5370; +analyze t5370_2; +analyze t5370; +explain select * from t5370 a , t5370_2 b where a.name=b.name; + QUERY PLAN +------------------------------------------------------------------------- + Hash Join (cost=24.50..50.25 rows=1000 width=14) + Hash Cond: (a.name = b.name) + -> Seq Scan on t5370 a (cost=0.00..12.00 rows=1000 width=7) + -> Hash (cost=12.00..12.00 rows=1000 width=7) + -> Seq Scan on t5370_2 b (cost=0.00..12.00 rows=1000 width=7) + Optimizer: Postgres query optimizer +(6 rows) + +drop table t5370; +drop table t5370_2; +-- github issue 6215 cases +-- When executing the following plan +-- ``` +-- Gather Motion 1:1 (slice1; segments: 1) +-- -> Merge Full Join +-- -> Seq Scan on int4_tbl a +-- -> Seq Scan on int4_tbl b +--``` +-- Cloudberry will raise an Assert Fail. +-- We force adding a material node for +-- merge full join on true. +drop table if exists t6215; +create table t6215(f1 int4); +insert into t6215(f1) values (1), (2), (3); +set enable_material = off; +-- The plan still have Material operator +explain (costs off) select * from t6215 a full join t6215 b on true; + QUERY PLAN +------------------------------------- + Merge Full Join + -> Seq Scan on t6215 a + -> Materialize + -> Seq Scan on t6215 b + Optimizer: Postgres query optimizer +(5 rows) + +select * from t6215 a full join t6215 b on true; + f1 | f1 +----+---- + 1 | 1 + 1 | 2 + 1 | 3 + 2 | 1 + 2 | 2 + 2 | 3 + 3 | 1 + 3 | 2 + 3 | 3 +(9 rows) + +drop table t6215; +-- +-- This tripped an assertion while deciding the locus for the joins. +-- The code was failing to handle join between SingleQE and Hash correctly, +-- when there were join order restricitions. (see +-- https://github.com/greenplum-db/gpdb/issues/6643 +-- +select a.f1, b.f1, t.thousand, t.tenthous from + (select sum(f1) as f1 from int4_tbl i4b) b + left outer join + (select sum(f1)+1 as f1 from int4_tbl i4a) a ON a.f1 = b.f1 + left outer join + tenk1 t ON b.f1 = t.thousand and (a.f1+b.f1+999) = t.tenthous; + f1 | f1 | thousand | tenthous +----+----+----------+---------- + | 0 | | +(1 row) + +-- tests to ensure that join reordering of LOJs and inner joins produces the +-- correct join predicates & residual filters +drop table if exists t1, t2, t3; +CREATE TABLE t1 (a int, b int, c int); +CREATE TABLE t2 (a int, b int, c int); +CREATE TABLE t3 (a int, b int, c int); +INSERT INTO t1 SELECT i, i, i FROM generate_series(1, 1000) i; +INSERT INTO t2 SELECT i, i, i FROM generate_series(2, 1000) i; -- start from 2 so that one row from t1 doesn't match +INSERT INTO t3 VALUES (1, 2, 3), (NULL, 2, 2); +ANALYZE t1; +ANALYZE t2; +ANALYZE t3; +-- ensure plan has a filter over left outer join +explain (costs off) select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a IS NULL OR (t1.c = t3.c)); + QUERY PLAN +--------------------------------------------- + Hash Right Join + Hash Cond: (t2.a = t1.a) + Filter: ((t2.a IS NULL) OR (t1.c = t3.c)) + -> Seq Scan on t2 + -> Hash + -> Hash Join + Hash Cond: (t1.b = t3.b) + -> Seq Scan on t1 + -> Hash + -> Seq Scan on t3 + Optimizer: Postgres query optimizer +(11 rows) + +select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a IS NULL OR (t1.c = t3.c)); + a | b | c | a | b | c | a | b | c +---+---+---+---+---+---+---+---+--- + 2 | 2 | 2 | 2 | 2 | 2 | | 2 | 2 +(1 row) + +-- ensure plan has two inner joins with the where clause & join predicates ANDed +explain (costs off) select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a = t3.a); + QUERY PLAN +------------------------------------------------------------ + Hash Join + Hash Cond: (t2.a = t1.a) + -> Seq Scan on t2 + -> Hash + -> Hash Join + Hash Cond: ((t1.a = t3.a) AND (t1.b = t3.b)) + -> Seq Scan on t1 + -> Hash + -> Seq Scan on t3 + Optimizer: Postgres query optimizer +(10 rows) + +select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a = t3.a); + a | b | c | a | b | c | a | b | c +---+---+---+---+---+---+---+---+--- +(0 rows) + +-- ensure plan has a filter over left outer join +explain (costs off) select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a is distinct from t3.a); + QUERY PLAN +---------------------------------------- + Hash Right Join + Hash Cond: (t2.a = t1.a) + Filter: (t2.a IS DISTINCT FROM t3.a) + -> Seq Scan on t2 + -> Hash + -> Hash Join + Hash Cond: (t1.b = t3.b) + -> Seq Scan on t1 + -> Hash + -> Seq Scan on t3 + Optimizer: Postgres query optimizer +(11 rows) + +select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a is distinct from t3.a); + a | b | c | a | b | c | a | b | c +---+---+---+---+---+---+---+---+--- + 2 | 2 | 2 | 2 | 2 | 2 | | 2 | 2 + 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 3 +(2 rows) + +-- ensure plan has a filter over left outer join +explain select * from t3 join (select t1.a t1a, t1.b t1b, t1.c t1c, t2.a t2a, t2.b t2b, t2.c t2c from t1 left join t2 on (t1.a = t2.a)) t on (t1a = t3.a) WHERE (t2a IS NULL OR (t1c = t3.a)); + QUERY PLAN +--------------------------------------------------------------------------- + Hash Right Join (cost=15.77..31.63 rows=10 width=36) + Hash Cond: (t2.a = t1.a) + Filter: ((t2.a IS NULL) OR (t1.c = t3.a)) + -> Seq Scan on t2 (cost=0.00..11.99 rows=999 width=12) + -> Hash (cost=15.65..15.65 rows=10 width=24) + -> Hash Join (cost=1.04..15.65 rows=10 width=24) + Hash Cond: (t1.a = t3.a) + -> Seq Scan on t1 (cost=0.00..12.00 rows=1000 width=12) + -> Hash (cost=1.02..1.02 rows=2 width=12) + -> Seq Scan on t3 (cost=0.00..1.02 rows=2 width=12) + Optimizer: Postgres query optimizer +(11 rows) + +select * from t3 join (select t1.a t1a, t1.b t1b, t1.c t1c, t2.a t2a, t2.b t2b, t2.c t2c from t1 left join t2 on (t1.a = t2.a)) t on (t1a = t3.a) WHERE (t2a IS NULL OR (t1c = t3.a)); + a | b | c | t1a | t1b | t1c | t2a | t2b | t2c +---+---+---+-----+-----+-----+-----+-----+----- + 1 | 2 | 3 | 1 | 1 | 1 | | | +(1 row) + +-- ensure plan has a filter over left outer join +explain select * from (select t1.a t1a, t1.b t1b, t2.a t2a, t2.b t2b from t1 left join t2 on t1.a = t2.a) tt + join t3 on tt.t1b = t3.b + join (select t1.a t1a, t1.b t1b, t2.a t2a, t2.b t2b from t1 left join t2 on t1.a = t2.a) tt1 on tt1.t1b = t3.b + join t3 t3_1 on tt1.t1b = t3_1.b and (tt1.t2a is NULL OR tt1.t1b = t3.b); + QUERY PLAN +----------------------------------------------------------------------------------------------------- + Hash Right Join (cost=47.33..63.11 rows=3 width=56) + Hash Cond: (t2_1.a = t1_1.a) + Filter: ((t2_1.a IS NULL) OR (t1_1.b = t3.b)) + -> Seq Scan on t2 t2_1 (cost=0.00..11.99 rows=999 width=8) + -> Hash (cost=47.29..47.29 rows=3 width=48) + -> Hash Right Join (cost=31.52..47.29 rows=3 width=48) + Hash Cond: (t2.a = t1.a) + -> Seq Scan on t2 (cost=0.00..11.99 rows=999 width=8) + -> Hash (cost=31.48..31.48 rows=3 width=40) + -> Hash Join (cost=16.82..31.48 rows=3 width=40) + Hash Cond: (t1.b = t3.b) + -> Hash Join (cost=1.04..15.65 rows=10 width=20) + Hash Cond: (t1.b = t3_1.b) + -> Seq Scan on t1 (cost=0.00..12.00 rows=1000 width=8) + -> Hash (cost=1.02..1.02 rows=2 width=12) + -> Seq Scan on t3 t3_1 (cost=0.00..1.02 rows=2 width=12) + -> Hash (cost=15.65..15.65 rows=10 width=20) + -> Hash Join (cost=1.04..15.65 rows=10 width=20) + Hash Cond: (t1_1.b = t3.b) + -> Seq Scan on t1 t1_1 (cost=0.00..12.00 rows=1000 width=8) + -> Hash (cost=1.02..1.02 rows=2 width=12) + -> Seq Scan on t3 (cost=0.00..1.02 rows=2 width=12) + Optimizer: Postgres query optimizer +(23 rows) + +select * from (select t1.a t1a, t1.b t1b, t2.a t2a, t2.b t2b from t1 left join t2 on t1.a = t2.a) tt + join t3 on tt.t1b = t3.b + join (select t1.a t1a, t1.b t1b, t2.a t2a, t2.b t2b from t1 left join t2 on t1.a = t2.a) tt1 on tt1.t1b = t3.b + join t3 t3_1 on tt1.t1b = t3_1.b and (tt1.t2a is NULL OR tt1.t1b = t3.b); + t1a | t1b | t2a | t2b | a | b | c | t1a | t1b | t2a | t2b | a | b | c +-----+-----+-----+-----+---+---+---+-----+-----+-----+-----+---+---+--- + 2 | 2 | 2 | 2 | | 2 | 2 | 2 | 2 | 2 | 2 | | 2 | 2 + 2 | 2 | 2 | 2 | | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 3 + 2 | 2 | 2 | 2 | 1 | 2 | 3 | 2 | 2 | 2 | 2 | | 2 | 2 + 2 | 2 | 2 | 2 | 1 | 2 | 3 | 2 | 2 | 2 | 2 | 1 | 2 | 3 +(4 rows) + +-- test different join order enumeration methods +set optimizer_join_order = query; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; + a | b | c | a | b | c | a | b | c +---+---+---+---+---+---+---+---+--- + 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 3 + 2 | 2 | 2 | 2 | 2 | 2 | | 2 | 2 +(2 rows) + +set optimizer_join_order = greedy; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; + a | b | c | a | b | c | a | b | c +---+---+---+---+---+---+---+---+--- + 2 | 2 | 2 | 2 | 2 | 2 | | 2 | 2 + 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 3 +(2 rows) + +set optimizer_join_order = exhaustive; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; + a | b | c | a | b | c | a | b | c +---+---+---+---+---+---+---+---+--- + 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 3 + 2 | 2 | 2 | 2 | 2 | 2 | | 2 | 2 +(2 rows) + +set optimizer_join_order = exhaustive2; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; + a | b | c | a | b | c | a | b | c +---+---+---+---+---+---+---+---+--- + 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 3 + 2 | 2 | 2 | 2 | 2 | 2 | | 2 | 2 +(2 rows) + +reset optimizer_join_order; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; + a | b | c | a | b | c | a | b | c +---+---+---+---+---+---+---+---+--- + 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 3 + 2 | 2 | 2 | 2 | 2 | 2 | | 2 | 2 +(2 rows) + +drop table t1, t2, t3; +-- +-- Test a bug that nestloop path previously can not generate motion above +-- index path, which sometimes is wrong (this test case is an example). +-- We now depend on parameterized path related variables to judge instead. +-- We conservatively disallow motion when there is parameter requirement +-- for either outer or inner at this moment though there could be room +-- for further improvement (e.g. referring subplan code to do broadcast +-- for base rel if needed, which needs much effort and does not seem to +-- be deserved given we will probably refactor related code for the lateral +-- support in the near future). For the query and guc settings below, Postgres +-- planner can not generate a plan. +set enable_nestloop = 1; +set enable_material = 0; +set enable_seqscan = 0; +set enable_bitmapscan = 0; +explain select tenk1.unique2 >= 0 from tenk1 left join tenk2 on true limit 1; + QUERY PLAN +-------------------------------------------------------------------------------------------------- + Limit (cost=0.57..0.63 rows=1 width=1) + -> Nested Loop Left Join (cost=0.57..6353036.29 rows=100000000 width=1) + -> Index Only Scan using tenk1_unique2 on tenk1 (cost=0.29..186.28 rows=10000 width=4) + -> Index Only Scan using tenk2_hundred on tenk2 (cost=0.29..510.29 rows=10000 width=0) + Optimizer: Postgres query optimizer +(5 rows) + +select tenk1.unique2 >= 0 from tenk1 left join tenk2 on true limit 1; + ?column? +---------- + t +(1 row) + +reset enable_nestloop; +reset enable_material; +reset enable_seqscan; +reset enable_bitmapscan; +-- Below test cases are for planner's cdbpath_motion_for_join, so we close +-- ORCA temporarily. +set optimizer = off; +-- test outer join for general locus +-- replicated table's locus is SegmentGeneral +create table trep_join_gp (c1 int, c2 int); +-- hash distributed table's locus is Hash +create table thash_join_gp (c1 int, c2 int); +-- randomly distributed table's locus is Strewn +create table trand_join_gp (c1 int, c2 int); +-- start_ignore +create extension if not exists gp_debug_numsegments; +select gp_debug_set_create_table_default_numsegments(1); + gp_debug_set_create_table_default_numsegments +----------------------------------------------- + 1 +(1 row) + +-- end_ignore +-- the following replicated table's numsegments is 1 +create table trep1_join_gp (c1 int, c2 int); +insert into trep_join_gp values (1, 1), (2, 2); +insert into thash_join_gp values (1, 1), (2, 2); +insert into trep1_join_gp values (1, 1), (2, 2); +analyze trep_join_gp; +analyze thash_join_gp; +analyze trep1_join_gp; +analyze trand_join_gp; +-- This test is to check that: general left join segmentGeneral --> segmentGeneral +-- And segmentGeneral join hash does not need motion. +explain select * from generate_series(1, 5) g left join trep_join_gp on g = trep_join_gp.c1 join thash_join_gp on true; + QUERY PLAN +---------------------------------------------------------------------------------- + Nested Loop (cost=10000000001.05..10000000002.31 rows=10 width=20) + -> Hash Left Join (cost=1.05..1.16 rows=5 width=12) + Hash Cond: (g.g = trep_join_gp.c1) + -> Function Scan on generate_series g (cost=0.00..0.05 rows=5 width=4) + -> Hash (cost=1.02..1.02 rows=2 width=8) + -> Seq Scan on trep_join_gp (cost=0.00..1.02 rows=2 width=8) + -> Materialize (cost=0.00..1.03 rows=2 width=8) + -> Seq Scan on thash_join_gp (cost=0.00..1.02 rows=2 width=8) + Optimizer: Postgres query optimizer +(9 rows) + +select * from generate_series(1, 5) g left join trep_join_gp on g = trep_join_gp.c1 join thash_join_gp on true; + g | c1 | c2 | c1 | c2 +---+----+----+----+---- + 1 | 1 | 1 | 1 | 1 + 2 | 2 | 2 | 1 | 1 + 3 | | | 1 | 1 + 4 | | | 1 | 1 + 5 | | | 1 | 1 + 1 | 1 | 1 | 2 | 2 + 2 | 2 | 2 | 2 | 2 + 3 | | | 2 | 2 + 4 | | | 2 | 2 + 5 | | | 2 | 2 +(10 rows) + +-- The following 4 tests are to check that general left join partition, we could redistribute the +-- general-locus relation when the filter condition is suitable. If we can redistributed +-- general-locus relation, we should not gather them to singleQE. +explain select * from generate_series(1, 5) g left join thash_join_gp on g = thash_join_gp.c1; + QUERY PLAN +---------------------------------------------------------------------------- + Hash Left Join (cost=1.05..1.16 rows=5 width=12) + Hash Cond: (g.g = thash_join_gp.c1) + -> Function Scan on generate_series g (cost=0.00..0.05 rows=5 width=4) + -> Hash (cost=1.02..1.02 rows=2 width=8) + -> Seq Scan on thash_join_gp (cost=0.00..1.02 rows=2 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +select * from generate_series(1, 5) g left join thash_join_gp on g = thash_join_gp.c1; + g | c1 | c2 +---+----+---- + 2 | 2 | 2 + 3 | | + 4 | | + 1 | 1 | 1 + 5 | | +(5 rows) + +explain select * from generate_series(1, 5) g left join thash_join_gp on g = thash_join_gp.c2; + QUERY PLAN +---------------------------------------------------------------------------- + Hash Left Join (cost=1.05..1.16 rows=5 width=12) + Hash Cond: (g.g = thash_join_gp.c2) + -> Function Scan on generate_series g (cost=0.00..0.05 rows=5 width=4) + -> Hash (cost=1.02..1.02 rows=2 width=8) + -> Seq Scan on thash_join_gp (cost=0.00..1.02 rows=2 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +select * from generate_series(1, 5) g left join thash_join_gp on g = thash_join_gp.c2; + g | c1 | c2 +---+----+---- + 5 | | + 2 | 2 | 2 + 3 | | + 4 | | + 1 | 1 | 1 +(5 rows) + +explain select * from generate_series(1, 5) g left join trand_join_gp on g = trand_join_gp.c1; + QUERY PLAN +---------------------------------------------------------------------------- + Hash Left Join (cost=0.03..0.14 rows=5 width=12) + Hash Cond: (g.g = trand_join_gp.c1) + -> Function Scan on generate_series g (cost=0.00..0.05 rows=5 width=4) + -> Hash (cost=0.01..0.01 rows=1 width=8) + -> Seq Scan on trand_join_gp (cost=0.00..0.01 rows=1 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +select * from generate_series(1, 5) g left join trand_join_gp on g = trand_join_gp.c1; + g | c1 | c2 +---+----+---- + 2 | | + 3 | | + 4 | | + 1 | | + 5 | | +(5 rows) + +explain select * from generate_series(1, 5) g full join trand_join_gp on g = trand_join_gp.c1; + QUERY PLAN +---------------------------------------------------------------------------- + Hash Full Join (cost=0.03..0.14 rows=5 width=12) + Hash Cond: (g.g = trand_join_gp.c1) + -> Function Scan on generate_series g (cost=0.00..0.05 rows=5 width=4) + -> Hash (cost=0.01..0.01 rows=1 width=8) + -> Seq Scan on trand_join_gp (cost=0.00..0.01 rows=1 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +select * from generate_series(1, 5) g full join trand_join_gp on g = trand_join_gp.c1; + g | c1 | c2 +---+----+---- + 2 | | + 3 | | + 4 | | + 1 | | + 5 | | +(5 rows) + +-- The following 3 tests are to check that segmentGeneral left join partition +-- we could redistribute the segment general-locus relation when the filter condition +-- is suitable. If we can redistributed general-locus relation, we should not +-- gather them to singleQE. +explain select * from trep_join_gp left join thash_join_gp using (c1); + QUERY PLAN +------------------------------------------------------------------------- + Hash Left Join (cost=1.04..2.11 rows=3 width=12) + Hash Cond: (trep_join_gp.c1 = thash_join_gp.c1) + -> Seq Scan on trep_join_gp (cost=0.00..1.02 rows=2 width=8) + -> Hash (cost=1.02..1.02 rows=2 width=8) + -> Seq Scan on thash_join_gp (cost=0.00..1.02 rows=2 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +select * from trep_join_gp left join thash_join_gp using (c1); + c1 | c2 | c2 +----+----+---- + 1 | 1 | 1 + 2 | 2 | 2 +(2 rows) + +explain select * from trep_join_gp left join trand_join_gp using (c1); + QUERY PLAN +------------------------------------------------------------------------- + Hash Left Join (cost=0.02..1.08 rows=3 width=12) + Hash Cond: (trep_join_gp.c1 = trand_join_gp.c1) + -> Seq Scan on trep_join_gp (cost=0.00..1.02 rows=2 width=8) + -> Hash (cost=0.01..0.01 rows=1 width=8) + -> Seq Scan on trand_join_gp (cost=0.00..0.01 rows=1 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +select * from trep_join_gp left join trand_join_gp using (c1); + c1 | c2 | c2 +----+----+---- + 2 | 2 | + 1 | 1 | +(2 rows) + +explain select * from trep1_join_gp join thash_join_gp using (c1); + QUERY PLAN +------------------------------------------------------------------------- + Hash Join (cost=1.04..2.11 rows=3 width=12) + Hash Cond: (trep1_join_gp.c1 = thash_join_gp.c1) + -> Seq Scan on trep1_join_gp (cost=0.00..1.02 rows=2 width=8) + -> Hash (cost=1.02..1.02 rows=2 width=8) + -> Seq Scan on thash_join_gp (cost=0.00..1.02 rows=2 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +select * from trep1_join_gp join thash_join_gp using (c1); + c1 | c2 | c2 +----+----+---- + 1 | 1 | 1 + 2 | 2 | 2 +(2 rows) + +drop table trep_join_gp; +drop table thash_join_gp; +drop table trand_join_gp; +drop table trep1_join_gp; +-- select gp_debug_set_create_table_default_numsegments(3); +reset optimizer; +-- The following cases are to test planner join size estimation +-- so we need optimizer to be off. +-- When a partition table join other table using partition key, +-- planner should use root table's stat info instead of largest +-- partition's. +reset enable_hashjoin; +reset enable_mergejoin; +reset enable_nestloop; +create table t_joinsize_1 (c1 int, c2 int) +partition by range (c2) +( start (0) end (5) every (1), + default partition extra ); +create table t_joinsize_2 (c1 int, c2 int); +create table t_joinsize_3 (c int); +insert into t_joinsize_1 select i, i%5 from generate_series(1, 200)i; +insert into t_joinsize_1 select 1, null from generate_series(1, 1000); +insert into t_joinsize_2 select i,i%5 from generate_series(1, 1000)i; +insert into t_joinsize_3 select * from generate_series(1, 100); +analyze t_joinsize_1; +analyze t_joinsize_2; +analyze t_joinsize_3; +-- the following query should not broadcast the join result of t_joinsize_1, t_joinsize_2. +explain select * from (t_joinsize_1 join t_joinsize_2 on t_joinsize_1.c2 = t_joinsize_2.c2) join t_joinsize_3 on t_joinsize_3.c = t_joinsize_1.c1; + QUERY PLAN +------------------------------------------------------------------------------------------------------------- + Hash Join (cost=27.75..414.00 rows=20000 width=20) + Hash Cond: (t_joinsize_1.c2 = t_joinsize_2.c2) + -> Hash Join (cost=3.25..38.00 rows=600 width=12) + Hash Cond: (t_joinsize_1.c1 = t_joinsize_3.c) + -> Append (cost=0.00..25.00 rows=1200 width=8) + -> Seq Scan on t_joinsize_1_1_prt_2 t_joinsize_1_1 (cost=0.00..1.40 rows=40 width=8) + -> Seq Scan on t_joinsize_1_1_prt_3 t_joinsize_1_2 (cost=0.00..1.40 rows=40 width=8) + -> Seq Scan on t_joinsize_1_1_prt_4 t_joinsize_1_3 (cost=0.00..1.40 rows=40 width=8) + -> Seq Scan on t_joinsize_1_1_prt_5 t_joinsize_1_4 (cost=0.00..1.40 rows=40 width=8) + -> Seq Scan on t_joinsize_1_1_prt_6 t_joinsize_1_5 (cost=0.00..1.40 rows=40 width=8) + -> Seq Scan on t_joinsize_1_1_prt_extra t_joinsize_1_6 (cost=0.00..12.00 rows=1000 width=8) + -> Hash (cost=2.00..2.00 rows=100 width=4) + -> Seq Scan on t_joinsize_3 (cost=0.00..2.00 rows=100 width=4) + -> Hash (cost=12.00..12.00 rows=1000 width=8) + -> Seq Scan on t_joinsize_2 (cost=0.00..12.00 rows=1000 width=8) + Optimizer: Postgres query optimizer +(16 rows) + +drop table t_joinsize_1; +drop table t_joinsize_2; +drop table t_joinsize_3; +-- test if subquery locus is general, then +-- we should keep it general +create table t_randomly_dist_table(c int); +-- force_explain +-- the following plan should not contain redistributed motion (for planner) +explain +select * from ( + select a from generate_series(1, 10)a + union all + select a from generate_series(1, 10)a +) t_subquery_general +join t_randomly_dist_table on t_subquery_general.a = t_randomly_dist_table.c; + QUERY PLAN +------------------------------------------------------------------------------------------- + Hash Join (cost=0.56..140.73 rows=205 width=8) + Hash Cond: (t_randomly_dist_table.c = a.a) + -> Seq Scan on t_randomly_dist_table (cost=0.00..112.30 rows=10230 width=4) + -> Hash (cost=0.31..0.31 rows=20 width=4) + -> Append (cost=0.00..0.31 rows=20 width=4) + -> Function Scan on generate_series a (cost=0.00..0.10 rows=10 width=4) + -> Function Scan on generate_series a_1 (cost=0.00..0.10 rows=10 width=4) + Optimizer: Postgres query optimizer +(8 rows) + +drop table t_randomly_dist_table; +-- test lateral join inner plan contains limit +-- we cannot pass params across motion so we +-- can only generate a plan to gather all the +-- data to singleQE. Here we create a compound +-- data type as params to pass into inner plan. +-- By doing so, if we fail to pass correct params +-- into innerplan, it will throw error because +-- of nullpointer reference. If we only use int +-- type as params, the nullpointer reference error +-- may not happen because we parse null to integer 0. +create type mytype_for_lateral_test as (x int, y int); +create table t1_lateral_limit(a int, b int, c mytype_for_lateral_test); +create table t2_lateral_limit(a int, b int); +insert into t1_lateral_limit values (1, 1, '(1,1)'); +insert into t1_lateral_limit values (1, 2, '(2,2)'); +insert into t2_lateral_limit values (2, 2); +insert into t2_lateral_limit values (3, 3); +explain select * from t1_lateral_limit as t1 cross join lateral +(select ((c).x+t2.b) as n from t2_lateral_limit as t2 order by n limit 1)s; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Nested Loop (cost=10000000169.08..10000813417.08 rows=4810 width=44) + -> Seq Scan on t1_lateral_limit t1 (cost=0.00..58.10 rows=4810 width=40) + -> Materialize (cost=169.08..169.09 rows=1 width=4) + -> Limit (cost=169.08..169.08 rows=1 width=4) + -> Sort (cost=169.08..191.80 rows=9090 width=4) + Sort Key: (((t1.c).x + t2.b)) + -> Seq Scan on t2_lateral_limit t2 (cost=0.00..123.62 rows=9090 width=4) + Optimizer: Postgres query optimizer +(8 rows) + +select * from t1_lateral_limit as t1 cross join lateral +(select ((c).x+t2.b) as n from t2_lateral_limit as t2 order by n limit 1)s; + a | b | c | n +---+---+-------+--- + 1 | 1 | (1,1) | 3 + 1 | 2 | (2,2) | 4 +(2 rows) + +-- Continue with the above cases, if the lateral subquery contains union all +-- and in some of its appendquerys contain limit, it may also lead to bad plan. +-- The best solution may be to walk the query to and do some static analysis +-- to find out which rel has to be gathered and materialized. But it is complicated +-- to do so and this seems less efficient. I believe in future we should do big +-- refactor to make greenplum support lateral well so now, let's just make sure +-- we will not panic. +explain (costs off) select * from t1_lateral_limit as t1 cross join lateral +((select ((c).x+t2.b) as n from t2_lateral_limit as t2 order by n limit 1) union all select 1)s; + QUERY PLAN +--------------------------------------------------------------- + Nested Loop + -> Seq Scan on t1_lateral_limit t1 + -> Materialize + -> Append + -> Limit + -> Sort + Sort Key: (((t1.c).x + t2.b)) + -> Seq Scan on t2_lateral_limit t2 + -> Result + Optimizer: Postgres query optimizer +(10 rows) + +select * from t1_lateral_limit as t1 cross join lateral +((select ((c).x+t2.b) as n from t2_lateral_limit as t2 order by n limit 1) union all select 1)s; + a | b | c | n +---+---+-------+--- + 1 | 1 | (1,1) | 3 + 1 | 1 | (1,1) | 1 + 1 | 2 | (2,2) | 4 + 1 | 2 | (2,2) | 1 +(4 rows) + +-- test lateral subquery contains group by (group-by is another place that +-- may add motions in the subquery's plan). +explain select * from t1_lateral_limit t1 cross join lateral +(select (c).x+t2.a, sum(t2.a+t2.b) from t2_lateral_limit t2 group by (c).x+t2.a)x; + QUERY PLAN +------------------------------------------------------------------------------------------- + Nested Loop (cost=10000000191.80..10001078941.10 rows=4810000 width=52) + -> Seq Scan on t1_lateral_limit t1 (cost=0.00..58.10 rows=4810 width=40) + -> Materialize (cost=191.80..219.30 rows=1000 width=12) + -> HashAggregate (cost=191.80..204.30 rows=1000 width=12) + Group Key: ((t1.c).x + t2.a) + -> Seq Scan on t2_lateral_limit t2 (cost=0.00..123.62 rows=9090 width=12) + Optimizer: Postgres query optimizer +(7 rows) + +select * from t1_lateral_limit t1 cross join lateral +(select (c).x+t2.a, sum(t2.a+t2.b) from t2_lateral_limit t2 group by (c).x+t2.a)x; + a | b | c | ?column? | sum +---+---+-------+----------+----- + 1 | 1 | (1,1) | 4 | 6 + 1 | 1 | (1,1) | 3 | 4 + 1 | 2 | (2,2) | 5 | 6 + 1 | 2 | (2,2) | 4 | 4 +(4 rows) + +-- The following case is from Github Issue +-- https://github.com/greenplum-db/gpdb/issues/8860 +-- It is the same issue as the above test suite. +create table t_mylog_issue_8860 (myid int, log_date timestamptz ); +insert into t_mylog_issue_8860 values (1,timestamptz '2000-01-02 03:04'),(1,timestamptz '2000-01-02 03:04'-'1 hour'::interval); +insert into t_mylog_issue_8860 values (2,timestamptz '2000-01-02 03:04'),(2,timestamptz '2000-01-02 03:04'-'2 hour'::interval); +explain select ml1.myid, log_date as first_date, ml2.next_date from t_mylog_issue_8860 ml1 +inner join lateral +(select myid, log_date as next_date + from t_mylog_issue_8860 where myid = ml1.myid and log_date > ml1.log_date order by log_date asc limit 1) ml2 +on true; + QUERY PLAN +--------------------------------------------------------------------------------------------- + Nested Loop (cost=10000000132.72..10001085955.01 rows=8180 width=20) + -> Seq Scan on t_mylog_issue_8860 ml1 (cost=0.00..91.80 rows=8180 width=12) + -> Materialize (cost=132.72..132.74 rows=1 width=8) + -> Limit (cost=132.72..132.73 rows=1 width=12) + -> Sort (cost=132.72..132.74 rows=5 width=12) + Sort Key: t_mylog_issue_8860.log_date + -> Seq Scan on t_mylog_issue_8860 (cost=0.00..132.70 rows=5 width=12) + Filter: ((log_date > ml1.log_date) AND (myid = ml1.myid)) + Optimizer: Postgres query optimizer +(9 rows) + +select ml1.myid, log_date as first_date, ml2.next_date from t_mylog_issue_8860 ml1 +inner join lateral +(select myid, log_date as next_date + from t_mylog_issue_8860 where myid = ml1.myid and log_date > ml1.log_date order by log_date asc limit 1) ml2 +on true; + myid | first_date | next_date +------+------------------------------+------------------------------ + 2 | Sun Jan 02 01:04:00 2000 PST | Sun Jan 02 03:04:00 2000 PST + 1 | Sun Jan 02 02:04:00 2000 PST | Sun Jan 02 03:04:00 2000 PST +(2 rows) + +-- test prefetch join qual +-- we do not handle this correct +-- the only case we need to prefetch join qual is: +-- 1. outer plan contains motion +-- 2. the join qual contains subplan that contains motion +reset client_min_messages; +set Test_print_prefetch_joinqual = true; +-- prefetch join qual is only set correct for planner +set optimizer = off; +create table t1_test_pretch_join_qual(a int, b int, c int); +create table t2_test_pretch_join_qual(a int, b int, c int); +-- the following plan contains redistribute motion in both inner and outer plan +-- the join qual is t1.c > t2.c, it contains no motion, should not prefetch +explain (costs off) select * from t1_test_pretch_join_qual t1 join t2_test_pretch_join_qual t2 +on t1.b = t2.b and t1.c > t2.c; + QUERY PLAN +----------------------------------------------------- + Hash Join + Hash Cond: (t1.b = t2.b) + Join Filter: (t1.c > t2.c) + -> Seq Scan on t1_test_pretch_join_qual t1 + -> Hash + -> Seq Scan on t2_test_pretch_join_qual t2 + Optimizer: Postgres query optimizer +(7 rows) + +create table t3_test_pretch_join_qual(a int, b int, c int); +-- the following plan contains motion in both outer plan and join qual, +-- so we should prefetch join qual +explain (costs off) select * from t1_test_pretch_join_qual t1 join t2_test_pretch_join_qual t2 +on t1.b = t2.b and t1.a > any (select sum(b) from t3_test_pretch_join_qual t3 where c > t2.a); + QUERY PLAN +------------------------------------------------------- + Hash Join + Hash Cond: (t1.b = t2.b) + Join Filter: (SubPlan 1) + -> Seq Scan on t1_test_pretch_join_qual t1 + -> Hash + -> Seq Scan on t2_test_pretch_join_qual t2 + SubPlan 1 + -> Aggregate + -> Seq Scan on t3_test_pretch_join_qual t3 + Filter: (c > t2.a) + Optimizer: Postgres query optimizer +(11 rows) + +reset Test_print_prefetch_joinqual; +reset optimizer; +-- Github Issue: https://github.com/greenplum-db/gpdb/issues/9733 +-- Previously in the function bring_to_outer_query and +-- bring_to_singleQE it depends on the path->param_info field +-- to determine if the path contains outerParams. This is not +-- enought. The following case would SegFault before because +-- the indexpath's orderby clause contains outerParams. +create table gist_tbl_github9733 (b box, p point, c circle); +insert into gist_tbl_github9733 +select box(point(0.05*i, 0.05*i), point(0.05*i, 0.05*i)), + point(0.05*i, 0.05*i), + circle(point(0.05*i, 0.05*i), 1.0) +from generate_series(0,10000) as i; +vacuum analyze gist_tbl_github9733; +create index gist_tbl_point_index_github9733 on gist_tbl_github9733 using gist (p); +set enable_seqscan=off; +set enable_bitmapscan=off; +explain (costs off) +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl_github9733 where p <@ bb order by p <-> bb[0] limit 2) ss; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Nested Loop + -> Values Scan on "*VALUES*" + -> Materialize + -> Limit + -> Index Only Scan using gist_tbl_point_index_github9733 on gist_tbl_github9733 + Index Cond: (p <@ "*VALUES*".column1) + Order By: (p <-> ("*VALUES*".column1)[0]) + Optimizer: Postgres query optimizer +(8 rows) + +reset enable_seqscan; +explain (costs off) +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl_github9733 where p <@ bb order by p <-> bb[0] limit 2) ss; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Nested Loop + -> Values Scan on "*VALUES*" + -> Materialize + -> Limit + -> Index Only Scan using gist_tbl_point_index_github9733 on gist_tbl_github9733 + Index Cond: (p <@ "*VALUES*".column1) + Order By: (p <-> ("*VALUES*".column1)[0]) + Optimizer: Postgres query optimizer +(8 rows) + +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl_github9733 where p <@ bb order by p <-> bb[0] limit 2) ss; + p +------------- + (0.5,0.5) + (0.45,0.45) + (0.75,0.75) + (0.7,0.7) + (1,1) + (0.95,0.95) +(6 rows) + +reset enable_bitmapscan; +--- +--- Test that GUC enable_hashagg takes effect for SEMI join +--- +drop table if exists foo; +NOTICE: table "foo" does not exist, skipping +drop table if exists bar; +NOTICE: table "bar" does not exist, skipping +create table foo(a int); +create table bar(b int); +insert into foo select i from generate_series(1,10)i; +insert into bar select i from generate_series(1,1000)i; +analyze foo; +analyze bar; +set enable_hashagg to on; +explain (costs off) +select * from foo where exists (select 1 from bar where foo.a = bar.b); + QUERY PLAN +------------------------------------- + Hash Semi Join + Hash Cond: (foo.a = bar.b) + -> Seq Scan on foo + -> Hash + -> Seq Scan on bar + Optimizer: Postgres query optimizer +(6 rows) + +select * from foo where exists (select 1 from bar where foo.a = bar.b); + a +---- + 10 + 9 + 3 + 7 + 4 + 5 + 8 + 1 + 2 + 6 +(10 rows) + +set enable_hashagg to off; +explain (costs off) +select * from foo where exists (select 1 from bar where foo.a = bar.b); + QUERY PLAN +------------------------------------- + Hash Semi Join + Hash Cond: (foo.a = bar.b) + -> Seq Scan on foo + -> Hash + -> Seq Scan on bar + Optimizer: Postgres query optimizer +(6 rows) + +select * from foo where exists (select 1 from bar where foo.a = bar.b); + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +reset enable_hashagg; +drop table foo; +drop table bar; +-- Fix github issue 10012 +create table fix_param_a (i int, j int); +create table fix_param_b (i int UNIQUE, j int); +create table fix_param_c (i int, j int); +insert into fix_param_a select i, i from generate_series(1,20)i; +insert into fix_param_b select i, i from generate_series(1,2000)i; +insert into fix_param_c select i, i from generate_series(1,2000)i; +analyze fix_param_a; +analyze fix_param_b; +analyze fix_param_c; +explain (costs off) +select * from fix_param_a left join fix_param_b on + fix_param_a.i = fix_param_b.i and fix_param_b.j in + (select j from fix_param_c where fix_param_b.i = fix_param_c.i) + order by 1; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Sort + Sort Key: fix_param_a.i + -> Hash Right Join + Hash Cond: (fix_param_b.i = fix_param_a.i) + -> Hash Semi Join + Hash Cond: ((fix_param_b.i = fix_param_c.i) AND (fix_param_b.j = fix_param_c.j)) + -> Seq Scan on fix_param_b + -> Hash + -> Seq Scan on fix_param_c + -> Hash + -> Seq Scan on fix_param_a + Optimizer: Postgres query optimizer +(12 rows) + +select * from fix_param_a left join fix_param_b on + fix_param_a.i = fix_param_b.i and fix_param_b.j in + (select j from fix_param_c where fix_param_b.i = fix_param_c.i) + order by 1; + i | j | i | j +----+----+----+---- + 1 | 1 | 1 | 1 + 2 | 2 | 2 | 2 + 3 | 3 | 3 | 3 + 4 | 4 | 4 | 4 + 5 | 5 | 5 | 5 + 6 | 6 | 6 | 6 + 7 | 7 | 7 | 7 + 8 | 8 | 8 | 8 + 9 | 9 | 9 | 9 + 10 | 10 | 10 | 10 + 11 | 11 | 11 | 11 + 12 | 12 | 12 | 12 + 13 | 13 | 13 | 13 + 14 | 14 | 14 | 14 + 15 | 15 | 15 | 15 + 16 | 16 | 16 | 16 + 17 | 17 | 17 | 17 + 18 | 18 | 18 | 18 + 19 | 19 | 19 | 19 + 20 | 20 | 20 | 20 +(20 rows) + +-- Test targetlist contains placeholder var +-- When creating a redistributed motion with hash keys, +-- Cloudberry planner will invoke `cdbpullup_findEclassInTargetList`. +-- The following test case contains non-strict function `coalesce` +-- in the subquery at nullable-side of outerjoin and thus will +-- have PlaceHolderVar in targetlist. The case is to test if +-- function `cdbpullup_findEclassInTargetList` handles PlaceHolderVar +-- correct. +-- See github issue: https://github.com/greenplum-db/gpdb/issues/10315 +create table t_issue_10315 ( id1 int, id2 int ); +insert into t_issue_10315 select i,i from generate_series(1, 2)i; +insert into t_issue_10315 select i,null from generate_series(1, 2)i; +insert into t_issue_10315 select null,i from generate_series(1, 2)i; +select * from +( select coalesce( bq.id1 ) id1, coalesce ( bq.id2 ) id2 + from ( select r.id1, r.id2 from t_issue_10315 r group by r.id1, r.id2 ) bq ) t +full join ( select r.id1, r.id2 from t_issue_10315 r group by r.id1, r.id2 ) bq_all +on t.id1 = bq_all.id1 and t.id2 = bq_all.id2 +full join ( select r.id1, r.id2 from t_issue_10315 r group by r.id1, r.id2 ) tq_all +on (coalesce(t.id1) = tq_all.id1 and t.id2 = tq_all.id2) ; + id1 | id2 | id1 | id2 | id1 | id2 +-----+-----+-----+-----+-----+----- + 2 | 2 | 2 | 2 | 2 | 2 + 2 | | | | | + | 1 | | | | + | 2 | | | | + | | | 2 | | + | | | 1 | | + | | 2 | | | + | | 1 | | | + | | | | | 2 + | | | | | 1 + | | | | 2 | + 1 | 1 | 1 | 1 | 1 | 1 + 1 | | | | | + | | | | 1 | +(14 rows) + +drop table t_issue_10315; diff --git a/src/test/singlenode_regress/expected/join_hash.out b/src/test/singlenode_regress/expected/join_hash.out new file mode 100644 index 00000000000..8fb11eec0cf --- /dev/null +++ b/src/test/singlenode_regress/expected/join_hash.out @@ -0,0 +1,1074 @@ +-- +-- exercises for the hash join code +-- +-- GPDB: Cloudberry doesn't support parallel scans at the moment, so all the upstream +-- parallelism tests don't really apply. We still run the tests, but they won't +-- exercise parallelism. +begin; +-- GPDB requires allow_system_table_mods=on to modify pg_class.reltuples. +set allow_system_table_mods=on; +set local min_parallel_table_scan_size = 0; +set local parallel_setup_cost = 0; +set local enable_hashjoin = on; +-- Extract bucket and batch counts from an explain analyze plan. In +-- general we can't make assertions about how many batches (or +-- buckets) will be required because it can vary, but we can in some +-- special cases and we can check for growth. +create or replace function find_hash(node json) +returns json language plpgsql +as +$$ +declare + x json; + child json; +begin + if node->>'Node Type' = 'Hash' then + return node; + else + for child in select json_array_elements(node->'Plans') + loop + x := find_hash(child); + if x is not null then + return x; + end if; + end loop; + return null; + end if; +end; +$$; +create or replace function hash_join_batches(query text) +returns table (original int, final int) language plpgsql +as +$$ +declare + whole_plan json; + hash_node json; +begin + for whole_plan in + execute 'explain (analyze, format ''json'') ' || query + loop + hash_node := find_hash(json_extract_path(whole_plan, '0', 'Plan')); + original := hash_node->>'Original Hash Batches'; + final := hash_node->>'Hash Batches'; + return next; + end loop; +end; +$$; +-- Make a simple relation with well distributed keys and correctly +-- estimated size. +create table simple as + select generate_series(1, 20000) AS id, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; +alter table simple set (parallel_workers = 2); +analyze simple; +-- Make a relation whose size we will under-estimate. We want stats +-- to say 1000 rows, but actually there are 20,000 rows. +create table bigger_than_it_looks as + select generate_series(1, 20000) as id, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; +alter table bigger_than_it_looks set (autovacuum_enabled = 'false'); +WARNING: autovacuum is not supported in Cloudberry +alter table bigger_than_it_looks set (parallel_workers = 2); +analyze bigger_than_it_looks; +update pg_class set reltuples = 1000 where relname = 'bigger_than_it_looks'; +-- Make a relation whose size we underestimate and that also has a +-- kind of skew that breaks our batching scheme. We want stats to say +-- 2 rows, but actually there are 20,000 rows with the same key. +create table extremely_skewed (id int, t text); +alter table extremely_skewed set (autovacuum_enabled = 'false'); +WARNING: autovacuum is not supported in Cloudberry +alter table extremely_skewed set (parallel_workers = 2); +analyze extremely_skewed; +insert into extremely_skewed + select 42 as id, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + from generate_series(1, 20000); +update pg_class + set reltuples = 2, relpages = pg_relation_size('extremely_skewed') / 8192 + where relname = 'extremely_skewed'; +-- Make a relation with a couple of enormous tuples. +create table wide as select generate_series(1, 2) as id, rpad('', 320000, 'x') as t; +alter table wide set (parallel_workers = 2); +ANALYZE wide; +-- The "optimal" case: the hash table fits in memory; we plan for 1 +-- batch, we stick to that number, and peak memory usage stays within +-- our work_mem budget +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +set local work_mem = '4MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +explain (costs off) + select count(*) from simple r join simple s using (id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on simple s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join simple s using (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + f | f +(1 row) + +rollback to settings; +-- parallel with parallel-oblivious hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '4MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local enable_parallel_hash = off; +explain (costs off) + select count(*) from simple r join simple s using (id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on simple s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join simple s using (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + f | f +(1 row) + +rollback to settings; +-- parallel with parallel-aware hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '4MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local enable_parallel_hash = on; +explain (costs off) + select count(*) from simple r join simple s using (id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on simple s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join simple s using (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + f | f +(1 row) + +rollback to settings; +-- The "good" case: batches required, but we plan the right number; we +-- plan for some number of batches, and we stick to that number, and +-- peak memory usage says within our work_mem budget +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +set local work_mem = '128kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) from simple r join simple s using (id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on simple s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join simple s using (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + t | f +(1 row) + +rollback to settings; +-- parallel with parallel-oblivious hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '128kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = off; +explain (costs off) + select count(*) from simple r join simple s using (id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on simple s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join simple s using (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + t | f +(1 row) + +rollback to settings; +-- parallel with parallel-aware hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '192kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = on; +explain (costs off) + select count(*) from simple r join simple s using (id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on simple s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join simple s using (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + t | f +(1 row) + +rollback to settings; +-- The "bad" case: during execution we need to increase number of +-- batches; in this case we plan for 1 batch, and increase at least a +-- couple of times, and peak memory usage stays within our work_mem +-- budget +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +set local work_mem = '128kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on bigger_than_it_looks s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + f | t +(1 row) + +rollback to settings; +-- parallel with parallel-oblivious hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '128kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = off; +explain (costs off) + select count(*) from simple r join bigger_than_it_looks s using (id); + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on bigger_than_it_looks s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join bigger_than_it_looks s using (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join bigger_than_it_looks s using (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + f | t +(1 row) + +rollback to settings; +-- parallel with parallel-aware hash join +savepoint settings; +set local max_parallel_workers_per_gather = 1; +set local work_mem = '192kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = on; +explain (costs off) + select count(*) from simple r join bigger_than_it_looks s using (id); + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on bigger_than_it_looks s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join bigger_than_it_looks s using (id); + count +------- + 20000 +(1 row) + +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join bigger_than_it_looks s using (id); +$$); + initially_multibatch | increased_batches +----------------------+------------------- + f | t +(1 row) + +rollback to settings; +-- The "ugly" case: increasing the number of batches during execution +-- doesn't help, so stop trying to fit in work_mem and hope for the +-- best; in this case we plan for 1 batch, increases just once and +-- then stop increasing because that didn't help at all, so we blow +-- right through the work_mem budget and hope for the best... +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +set local work_mem = '128kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) from simple r join extremely_skewed s using (id); + QUERY PLAN +-------------------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on extremely_skewed s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join extremely_skewed s using (id); + count +------- + 20000 +(1 row) + +select * from hash_join_batches( +$$ + select count(*) from simple r join extremely_skewed s using (id); +$$); + original | final +----------+------- + 1 | 2 +(1 row) + +rollback to settings; +-- parallel with parallel-oblivious hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '128kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = off; +explain (costs off) + select count(*) from simple r join extremely_skewed s using (id); + QUERY PLAN +-------------------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on extremely_skewed s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join extremely_skewed s using (id); + count +------- + 20000 +(1 row) + +select * from hash_join_batches( +$$ + select count(*) from simple r join extremely_skewed s using (id); +$$); + original | final +----------+------- + 1 | 2 +(1 row) + +rollback to settings; +-- parallel with parallel-aware hash join +savepoint settings; +set local max_parallel_workers_per_gather = 1; +set local work_mem = '128kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = on; +explain (costs off) + select count(*) from simple r join extremely_skewed s using (id); + QUERY PLAN +-------------------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on extremely_skewed s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r join extremely_skewed s using (id); + count +------- + 20000 +(1 row) + +select * from hash_join_batches( +$$ + select count(*) from simple r join extremely_skewed s using (id); +$$); + original | final +----------+------- + 1 | 2 +(1 row) + +rollback to settings; +-- A couple of other hash join tests unrelated to work_mem management. +-- Check that EXPLAIN ANALYZE has data even if the leader doesn't participate +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '4MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local parallel_leader_participation = off; +select * from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); + original | final +----------+------- + 1 | 1 +(1 row) + +rollback to settings; +-- Exercise rescans. We'll turn off parallel_leader_participation so +-- that we can check that instrumentation comes back correctly. +create table join_foo as select generate_series(1, 3) as id, 'xxxxx'::text as t; +analyze join_foo; +alter table join_foo set (parallel_workers = 0); +create table join_bar as select generate_series(1, 20000) as id, 'xxxxx'::text as t; +analyze join_bar; +alter table join_bar set (parallel_workers = 2); +-- multi-batch with rescan, parallel-oblivious +savepoint settings; +set enable_parallel_hash = off; +set parallel_leader_participation = off; +set min_parallel_table_scan_size = 0; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +set enable_material = off; +set enable_mergejoin = off; +set work_mem = '64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; + QUERY PLAN +------------------------------------------------------------------------------------ + Aggregate + -> Nested Loop Left Join + Join Filter: ((join_foo.id < (b1.id + 1)) AND (join_foo.id > (b1.id - 1))) + -> Seq Scan on join_foo + -> Hash Join + Hash Cond: (b1.id = b2.id) + -> Seq Scan on join_bar b1 + -> Hash + -> Seq Scan on join_bar b2 + Optimizer: Postgres query optimizer +(10 rows) + +select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; + count +------- + 3 +(1 row) + +select final > 1 as multibatch + from hash_join_batches( +$$ + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +$$); + multibatch +------------ + t +(1 row) + +rollback to settings; +-- single-batch with rescan, parallel-oblivious +savepoint settings; +set enable_parallel_hash = off; +set parallel_leader_participation = off; +set min_parallel_table_scan_size = 0; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +set enable_material = off; +set enable_mergejoin = off; +set work_mem = '4MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +explain (costs off) + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; + QUERY PLAN +------------------------------------------------------------------------------------ + Aggregate + -> Nested Loop Left Join + Join Filter: ((join_foo.id < (b1.id + 1)) AND (join_foo.id > (b1.id - 1))) + -> Seq Scan on join_foo + -> Hash Join + Hash Cond: (b1.id = b2.id) + -> Seq Scan on join_bar b1 + -> Hash + -> Seq Scan on join_bar b2 + Optimizer: Postgres query optimizer +(10 rows) + +select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; + count +------- + 3 +(1 row) + +select final > 1 as multibatch + from hash_join_batches( +$$ + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +$$); + multibatch +------------ + f +(1 row) + +rollback to settings; +-- multi-batch with rescan, parallel-aware +savepoint settings; +set enable_parallel_hash = on; +set parallel_leader_participation = off; +set min_parallel_table_scan_size = 0; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +set enable_material = off; +set enable_mergejoin = off; +set work_mem = '64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; + QUERY PLAN +------------------------------------------------------------------------------------ + Aggregate + -> Nested Loop Left Join + Join Filter: ((join_foo.id < (b1.id + 1)) AND (join_foo.id > (b1.id - 1))) + -> Seq Scan on join_foo + -> Hash Join + Hash Cond: (b1.id = b2.id) + -> Seq Scan on join_bar b1 + -> Hash + -> Seq Scan on join_bar b2 + Optimizer: Postgres query optimizer +(10 rows) + +select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; + count +------- + 3 +(1 row) + +select final > 1 as multibatch + from hash_join_batches( +$$ + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +$$); + multibatch +------------ + t +(1 row) + +rollback to settings; +-- single-batch with rescan, parallel-aware +savepoint settings; +set enable_parallel_hash = on; +set parallel_leader_participation = off; +set min_parallel_table_scan_size = 0; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +set enable_material = off; +set enable_mergejoin = off; +set work_mem = '4MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +explain (costs off) + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; + QUERY PLAN +------------------------------------------------------------------------------------ + Aggregate + -> Nested Loop Left Join + Join Filter: ((join_foo.id < (b1.id + 1)) AND (join_foo.id > (b1.id - 1))) + -> Seq Scan on join_foo + -> Hash Join + Hash Cond: (b1.id = b2.id) + -> Seq Scan on join_bar b1 + -> Hash + -> Seq Scan on join_bar b2 + Optimizer: Postgres query optimizer +(10 rows) + +select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; + count +------- + 3 +(1 row) + +select final > 1 as multibatch + from hash_join_batches( +$$ + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +$$); + multibatch +------------ + f +(1 row) + +rollback to settings; +-- A full outer join where every record is matched. +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +explain (costs off) + select count(*) from simple r full outer join simple s using (id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Full Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on simple s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r full outer join simple s using (id); + count +------- + 20000 +(1 row) + +rollback to settings; +-- parallelism not possible with parallel-oblivious outer hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +explain (costs off) + select count(*) from simple r full outer join simple s using (id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Full Join + Hash Cond: (r.id = s.id) + -> Seq Scan on simple r + -> Hash + -> Seq Scan on simple s + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r full outer join simple s using (id); + count +------- + 20000 +(1 row) + +rollback to settings; +-- An full outer join where every record is not matched. +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +explain (costs off) + select count(*) from simple r full outer join simple s on (r.id = 0 - s.id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Full Join + Hash Cond: ((0 - s.id) = r.id) + -> Seq Scan on simple s + -> Hash + -> Seq Scan on simple r + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r full outer join simple s on (r.id = 0 - s.id); + count +------- + 40000 +(1 row) + +rollback to settings; +-- parallelism not possible with parallel-oblivious outer hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +explain (costs off) + select count(*) from simple r full outer join simple s on (r.id = 0 - s.id); + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Full Join + Hash Cond: ((0 - s.id) = r.id) + -> Seq Scan on simple s + -> Hash + -> Seq Scan on simple r + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from simple r full outer join simple s on (r.id = 0 - s.id); + count +------- + 40000 +(1 row) + +rollback to settings; +-- exercise special code paths for huge tuples (note use of non-strict +-- expression and left join required to get the detoasted tuple into +-- the hash table) +-- parallel with parallel-aware hash join (hits ExecParallelHashLoadTuple and +-- sts_puttuple oversized tuple cases because it's multi-batch) +-- GPDB_12_MERGE_FIXME: I (Heikki) could not cajole the planner to create a +-- plan like in upstream. I accepted the plan you get, but now this doesn't +-- exercise the special code path it's supposed to. +savepoint settings; +set max_parallel_workers_per_gather = 2; +set enable_parallel_hash = on; +set work_mem = '128kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +insert into wide select generate_series(3, 100) as id, rpad('', 320000, 'x') as t; +explain (costs off) + select length(max(s.t)) + from wide left join (select id, coalesce(t, '') || '' as t from wide) s using (id); + QUERY PLAN +------------------------------------------ + Aggregate + -> Hash Right Join + Hash Cond: (wide_1.id = wide.id) + -> Seq Scan on wide wide_1 + -> Hash + -> Seq Scan on wide + Optimizer: Postgres query optimizer +(7 rows) + +select length(max(s.t)) +from wide left join (select id, coalesce(t, '') || '' as t from wide) s using (id); + length +-------- + 320000 +(1 row) + +select final > 1 as multibatch + from hash_join_batches( +$$ + select length(max(s.t)) + from wide left join (select id, coalesce(t, '') || '' as t from wide) s using (id); +$$); + multibatch +------------ + f +(1 row) + +rollback to settings; +-- If virtualbuckets is much larger than innerndistinct, and +-- outerndistinct is much larger than innerndistinct. Then most +-- tuples of the outer table will match the empty bucket. So when +-- we calculate the cost of traversing the bucket, we need to ignore +-- the tuple matching empty bucket. +savepoint settings; +set max_parallel_workers_per_gather = 0; +create table join_hash_t_small(a int); +create table join_hash_t_big(b int); +insert into join_hash_t_small select i%100 from generate_series(0, 3000)i; +insert into join_hash_t_big select i%100000 from generate_series(1, 100000)i ; +analyze join_hash_t_small; +analyze join_hash_t_big; +explain (costs off) select * from join_hash_t_small, join_hash_t_big where a = b; + QUERY PLAN +-------------------------------------------------------- + Hash Join + Hash Cond: (join_hash_t_big.b = join_hash_t_small.a) + -> Seq Scan on join_hash_t_big + -> Hash + -> Seq Scan on join_hash_t_small + Optimizer: Postgres query optimizer +(6 rows) + +rollback to settings; +rollback; +-- Verify that hash key expressions reference the correct +-- nodes. Hashjoin's hashkeys need to reference its outer plan, Hash's +-- need to reference Hash's outer plan (which is below HashJoin's +-- inner plan). It's not trivial to verify that the references are +-- correct (we don't display the hashkeys themselves), but if the +-- hashkeys contain subplan references, those will be displayed. Force +-- subplans to appear just about everywhere. +-- +-- Bug report: +-- https://www.postgresql.org/message-id/CAPpHfdvGVegF_TKKRiBrSmatJL2dR9uwFCuR%2BteQ_8tEXU8mxg%40mail.gmail.com +-- +BEGIN; +SET LOCAL enable_sort = OFF; -- avoid mergejoins +SET LOCAL from_collapse_limit = 1; -- allows easy changing of join order +CREATE TABLE hjtest_1 (a text, b int, id int, c bool); +CREATE TABLE hjtest_2 (a bool, id int, b text, c int); +INSERT INTO hjtest_1(a, b, id, c) VALUES ('text', 2, 1, false); -- matches +INSERT INTO hjtest_1(a, b, id, c) VALUES ('text', 1, 2, false); -- fails id join condition +INSERT INTO hjtest_1(a, b, id, c) VALUES ('text', 20, 1, false); -- fails < 50 +INSERT INTO hjtest_1(a, b, id, c) VALUES ('text', 1, 1, false); -- fails (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 1, 'another', 2); -- matches +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 3, 'another', 7); -- fails id join condition +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 1, 'another', 90); -- fails < 55 +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 1, 'another', 3); -- fails (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 1, 'text', 1); -- fails hjtest_1.a <> hjtest_2.b; +EXPLAIN (COSTS OFF, VERBOSE) +SELECT hjtest_1.a a1, hjtest_2.a a2,hjtest_1.tableoid::regclass t1, hjtest_2.tableoid::regclass t2 +FROM hjtest_1, hjtest_2 +WHERE + hjtest_1.id = (SELECT 1 WHERE hjtest_2.id = 1) + AND (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + AND (SELECT hjtest_1.b * 5) < 50 + AND (SELECT hjtest_2.c * 5) < 55 + AND hjtest_1.a <> hjtest_2.b; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Hash Join + Output: hjtest_1.a, hjtest_2.a, (hjtest_1.tableoid)::regclass, (hjtest_2.tableoid)::regclass + Hash Cond: ((((SubPlan 1)) = hjtest_1.id) AND (((SubPlan 3)) = ((SubPlan 2)))) + Join Filter: (hjtest_1.a <> hjtest_2.b) + -> Seq Scan on public.hjtest_2 + Output: hjtest_2.a, hjtest_2.tableoid, hjtest_2.b, (SubPlan 1), (SubPlan 3) + Filter: ((SubPlan 5) < 55) + SubPlan 1 + -> Result + Output: 1 + One-Time Filter: (hjtest_2.id = 1) + SubPlan 3 + -> Result + Output: (hjtest_2.c * 5) + SubPlan 5 + -> Result + Output: (hjtest_2.c * 5) + -> Hash + Output: hjtest_1.a, hjtest_1.tableoid, hjtest_1.id, ((SubPlan 2)) + -> Seq Scan on public.hjtest_1 + Output: hjtest_1.a, hjtest_1.tableoid, hjtest_1.id, (SubPlan 2) + Filter: ((SubPlan 4) < 50) + SubPlan 2 + -> Result + Output: (hjtest_1.b * 5) + SubPlan 4 + -> Result + Output: (hjtest_1.b * 5) + Settings: enable_sort = 'off', from_collapse_limit = '1', optimizer = 'off' + Optimizer: Postgres query optimizer +(30 rows) + +SELECT hjtest_1.a a1, hjtest_2.a a2,hjtest_1.tableoid::regclass t1, hjtest_2.tableoid::regclass t2 +FROM hjtest_1, hjtest_2 +WHERE + hjtest_1.id = (SELECT 1 WHERE hjtest_2.id = 1) + AND (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + AND (SELECT hjtest_1.b * 5) < 50 + AND (SELECT hjtest_2.c * 5) < 55 + AND hjtest_1.a <> hjtest_2.b; + a1 | a2 | t1 | t2 +------+----+----------+---------- + text | t | hjtest_1 | hjtest_2 +(1 row) + +EXPLAIN (COSTS OFF, VERBOSE) +SELECT hjtest_1.a a1, hjtest_2.a a2,hjtest_1.tableoid::regclass t1, hjtest_2.tableoid::regclass t2 +FROM hjtest_2, hjtest_1 +WHERE + hjtest_1.id = (SELECT 1 WHERE hjtest_2.id = 1) + AND (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + AND (SELECT hjtest_1.b * 5) < 50 + AND (SELECT hjtest_2.c * 5) < 55 + AND hjtest_1.a <> hjtest_2.b; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Hash Join + Output: hjtest_1.a, hjtest_2.a, (hjtest_1.tableoid)::regclass, (hjtest_2.tableoid)::regclass + Hash Cond: ((((SubPlan 1)) = hjtest_1.id) AND (((SubPlan 3)) = ((SubPlan 2)))) + Join Filter: (hjtest_1.a <> hjtest_2.b) + -> Seq Scan on public.hjtest_2 + Output: hjtest_2.a, hjtest_2.tableoid, hjtest_2.b, (SubPlan 1), (SubPlan 3) + Filter: ((SubPlan 5) < 55) + SubPlan 1 + -> Result + Output: 1 + One-Time Filter: (hjtest_2.id = 1) + SubPlan 3 + -> Result + Output: (hjtest_2.c * 5) + SubPlan 5 + -> Result + Output: (hjtest_2.c * 5) + -> Hash + Output: hjtest_1.a, hjtest_1.tableoid, hjtest_1.id, ((SubPlan 2)) + -> Seq Scan on public.hjtest_1 + Output: hjtest_1.a, hjtest_1.tableoid, hjtest_1.id, (SubPlan 2) + Filter: ((SubPlan 4) < 50) + SubPlan 2 + -> Result + Output: (hjtest_1.b * 5) + SubPlan 4 + -> Result + Output: (hjtest_1.b * 5) + Settings: enable_sort = 'off', from_collapse_limit = '1', optimizer = 'off' + Optimizer: Postgres query optimizer +(30 rows) + +SELECT hjtest_1.a a1, hjtest_2.a a2,hjtest_1.tableoid::regclass t1, hjtest_2.tableoid::regclass t2 +FROM hjtest_2, hjtest_1 +WHERE + hjtest_1.id = (SELECT 1 WHERE hjtest_2.id = 1) + AND (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + AND (SELECT hjtest_1.b * 5) < 50 + AND (SELECT hjtest_2.c * 5) < 55 + AND hjtest_1.a <> hjtest_2.b; + a1 | a2 | t1 | t2 +------+----+----------+---------- + text | t | hjtest_1 | hjtest_2 +(1 row) + +ROLLBACK; diff --git a/src/test/singlenode_regress/expected/json.out b/src/test/singlenode_regress/expected/json.out new file mode 100644 index 00000000000..4922926de8b --- /dev/null +++ b/src/test/singlenode_regress/expected/json.out @@ -0,0 +1,2638 @@ +-- Strings. +SELECT '""'::json; -- OK. + json +------ + "" +(1 row) + +SELECT $$''$$::json; -- ERROR, single quotes are not allowed +ERROR: invalid input syntax for type json +LINE 1: SELECT $$''$$::json; + ^ +DETAIL: Token "'" is invalid. +CONTEXT: JSON data, line 1: '... +SELECT '"abc"'::json; -- OK + json +------- + "abc" +(1 row) + +SELECT '"abc'::json; -- ERROR, quotes not closed +ERROR: invalid input syntax for type json +LINE 1: SELECT '"abc'::json; + ^ +DETAIL: Token ""abc" is invalid. +CONTEXT: JSON data, line 1: "abc +SELECT '"abc +def"'::json; -- ERROR, unescaped newline in string constant +ERROR: invalid input syntax for type json +LINE 1: SELECT '"abc + ^ +DETAIL: Character with value 0x0a must be escaped. +CONTEXT: JSON data, line 1: "abc +SELECT '"\n\"\\"'::json; -- OK, legal escapes + json +---------- + "\n\"\\" +(1 row) + +SELECT '"\v"'::json; -- ERROR, not a valid JSON escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\v"'::json; + ^ +DETAIL: Escape sequence "\v" is invalid. +CONTEXT: JSON data, line 1: "\v... +-- see json_encoding test for input with unicode escapes +-- Numbers. +SELECT '1'::json; -- OK + json +------ + 1 +(1 row) + +SELECT '0'::json; -- OK + json +------ + 0 +(1 row) + +SELECT '01'::json; -- ERROR, not valid according to JSON spec +ERROR: invalid input syntax for type json +LINE 1: SELECT '01'::json; + ^ +DETAIL: Token "01" is invalid. +CONTEXT: JSON data, line 1: 01 +SELECT '0.1'::json; -- OK + json +------ + 0.1 +(1 row) + +SELECT '9223372036854775808'::json; -- OK, even though it's too large for int8 + json +--------------------- + 9223372036854775808 +(1 row) + +SELECT '1e100'::json; -- OK + json +------- + 1e100 +(1 row) + +SELECT '1.3e100'::json; -- OK + json +--------- + 1.3e100 +(1 row) + +SELECT '1f2'::json; -- ERROR +ERROR: invalid input syntax for type json +LINE 1: SELECT '1f2'::json; + ^ +DETAIL: Token "1f2" is invalid. +CONTEXT: JSON data, line 1: 1f2 +SELECT '0.x1'::json; -- ERROR +ERROR: invalid input syntax for type json +LINE 1: SELECT '0.x1'::json; + ^ +DETAIL: Token "0.x1" is invalid. +CONTEXT: JSON data, line 1: 0.x1 +SELECT '1.3ex100'::json; -- ERROR +ERROR: invalid input syntax for type json +LINE 1: SELECT '1.3ex100'::json; + ^ +DETAIL: Token "1.3ex100" is invalid. +CONTEXT: JSON data, line 1: 1.3ex100 +-- Arrays. +SELECT '[]'::json; -- OK + json +------ + [] +(1 row) + +SELECT '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'::json; -- OK + json +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] +(1 row) + +SELECT '[1,2]'::json; -- OK + json +------- + [1,2] +(1 row) + +SELECT '[1,2,]'::json; -- ERROR, trailing comma +ERROR: invalid input syntax for type json +LINE 1: SELECT '[1,2,]'::json; + ^ +DETAIL: Expected JSON value, but found "]". +CONTEXT: JSON data, line 1: [1,2,] +SELECT '[1,2'::json; -- ERROR, no closing bracket +ERROR: invalid input syntax for type json +LINE 1: SELECT '[1,2'::json; + ^ +DETAIL: The input string ended unexpectedly. +CONTEXT: JSON data, line 1: [1,2 +SELECT '[1,[2]'::json; -- ERROR, no closing bracket +ERROR: invalid input syntax for type json +LINE 1: SELECT '[1,[2]'::json; + ^ +DETAIL: The input string ended unexpectedly. +CONTEXT: JSON data, line 1: [1,[2] +-- Objects. +SELECT '{}'::json; -- OK + json +------ + {} +(1 row) + +SELECT '{"abc"}'::json; -- ERROR, no value +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc"}'::json; + ^ +DETAIL: Expected ":", but found "}". +CONTEXT: JSON data, line 1: {"abc"} +SELECT '{"abc":1}'::json; -- OK + json +----------- + {"abc":1} +(1 row) + +SELECT '{1:"abc"}'::json; -- ERROR, keys must be strings +ERROR: invalid input syntax for type json +LINE 1: SELECT '{1:"abc"}'::json; + ^ +DETAIL: Expected string or "}", but found "1". +CONTEXT: JSON data, line 1: {1... +SELECT '{"abc",1}'::json; -- ERROR, wrong separator +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc",1}'::json; + ^ +DETAIL: Expected ":", but found ",". +CONTEXT: JSON data, line 1: {"abc",... +SELECT '{"abc"=1}'::json; -- ERROR, totally wrong separator +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc"=1}'::json; + ^ +DETAIL: Token "=" is invalid. +CONTEXT: JSON data, line 1: {"abc"=... +SELECT '{"abc"::1}'::json; -- ERROR, another wrong separator +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc"::1}'::json; + ^ +DETAIL: Expected JSON value, but found ":". +CONTEXT: JSON data, line 1: {"abc"::... +SELECT '{"abc":1,"def":2,"ghi":[3,4],"hij":{"klm":5,"nop":[6]}}'::json; -- OK + json +--------------------------------------------------------- + {"abc":1,"def":2,"ghi":[3,4],"hij":{"klm":5,"nop":[6]}} +(1 row) + +SELECT '{"abc":1:2}'::json; -- ERROR, colon in wrong spot +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc":1:2}'::json; + ^ +DETAIL: Expected "," or "}", but found ":". +CONTEXT: JSON data, line 1: {"abc":1:... +SELECT '{"abc":1,3}'::json; -- ERROR, no value +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc":1,3}'::json; + ^ +DETAIL: Expected string, but found "3". +CONTEXT: JSON data, line 1: {"abc":1,3... +-- Recursion. +SET max_stack_depth = '100kB'; +SELECT repeat('[', 10000)::json; +ERROR: stack depth limit exceeded +HINT: Increase the configuration parameter "max_stack_depth" (currently 100kB), after ensuring the platform's stack depth limit is adequate. +SELECT repeat('{"a":', 10000)::json; +ERROR: stack depth limit exceeded +HINT: Increase the configuration parameter "max_stack_depth" (currently 100kB), after ensuring the platform's stack depth limit is adequate. +RESET max_stack_depth; +-- Miscellaneous stuff. +SELECT 'true'::json; -- OK + json +------ + true +(1 row) + +SELECT 'false'::json; -- OK + json +------- + false +(1 row) + +SELECT 'null'::json; -- OK + json +------ + null +(1 row) + +SELECT ' true '::json; -- OK, even with extra whitespace + json +-------- + true +(1 row) + +SELECT 'true false'::json; -- ERROR, too many values +ERROR: invalid input syntax for type json +LINE 1: SELECT 'true false'::json; + ^ +DETAIL: Expected end of input, but found "false". +CONTEXT: JSON data, line 1: true false +SELECT 'true, false'::json; -- ERROR, too many values +ERROR: invalid input syntax for type json +LINE 1: SELECT 'true, false'::json; + ^ +DETAIL: Expected end of input, but found ",". +CONTEXT: JSON data, line 1: true,... +SELECT 'truf'::json; -- ERROR, not a keyword +ERROR: invalid input syntax for type json +LINE 1: SELECT 'truf'::json; + ^ +DETAIL: Token "truf" is invalid. +CONTEXT: JSON data, line 1: truf +SELECT 'trues'::json; -- ERROR, not a keyword +ERROR: invalid input syntax for type json +LINE 1: SELECT 'trues'::json; + ^ +DETAIL: Token "trues" is invalid. +CONTEXT: JSON data, line 1: trues +SELECT ''::json; -- ERROR, no value +ERROR: invalid input syntax for type json +LINE 1: SELECT ''::json; + ^ +DETAIL: The input string ended unexpectedly. +CONTEXT: JSON data, line 1: +SELECT ' '::json; -- ERROR, no value +ERROR: invalid input syntax for type json +LINE 1: SELECT ' '::json; + ^ +DETAIL: The input string ended unexpectedly. +CONTEXT: JSON data, line 1: +-- Multi-line JSON input to check ERROR reporting +SELECT '{ + "one": 1, + "two":"two", + "three": + true}'::json; -- OK + json +------------------------------ + { + + "one": 1, + + "two":"two",+ + "three": + + true} +(1 row) + +SELECT '{ + "one": 1, + "two":,"two", -- ERROR extraneous comma before field "two" + "three": + true}'::json; +ERROR: invalid input syntax for type json +LINE 1: SELECT '{ + ^ +DETAIL: Expected JSON value, but found ",". +CONTEXT: JSON data, line 3: "two":,... +SELECT '{ + "one": 1, + "two":"two", + "averyveryveryveryveryveryveryveryveryverylongfieldname":}'::json; +ERROR: invalid input syntax for type json +LINE 1: SELECT '{ + ^ +DETAIL: Expected JSON value, but found "}". +CONTEXT: JSON data, line 4: ...yveryveryveryveryveryveryveryverylongfieldname":} +-- ERROR missing value for last field +--constructors +-- array_to_json +SELECT array_to_json(array(select 1 as a)); + array_to_json +--------------- + [1] +(1 row) + +SELECT array_to_json(array_agg(q),false) from (select x as b, x * 2 as c from generate_series(1,3) x) q; + array_to_json +--------------------------------------------- + [{"b":1,"c":2},{"b":2,"c":4},{"b":3,"c":6}] +(1 row) + +SELECT array_to_json(array_agg(q),true) from (select x as b, x * 2 as c from generate_series(1,3) x) q; + array_to_json +----------------- + [{"b":1,"c":2},+ + {"b":2,"c":4},+ + {"b":3,"c":6}] +(1 row) + +SELECT array_to_json(array_agg(q),false) + FROM ( SELECT $$a$$ || x AS b, y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + array_to_json +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [{"b":"a1","c":4,"z":[{"f1":1,"f2":[1,2,3]},{"f1":4,"f2":[4,5,6]}]},{"b":"a1","c":5,"z":[{"f1":1,"f2":[1,2,3]},{"f1":5,"f2":[4,5,6]}]},{"b":"a2","c":4,"z":[{"f1":2,"f2":[1,2,3]},{"f1":4,"f2":[4,5,6]}]},{"b":"a2","c":5,"z":[{"f1":2,"f2":[1,2,3]},{"f1":5,"f2":[4,5,6]}]}] +(1 row) + +SELECT array_to_json(array_agg(x),false) from generate_series(5,10) x; + array_to_json +---------------- + [5,6,7,8,9,10] +(1 row) + +SELECT array_to_json('{{1,5},{99,100}}'::int[]); + array_to_json +------------------ + [[1,5],[99,100]] +(1 row) + +-- row_to_json +SELECT row_to_json(row(1,'foo')); + row_to_json +--------------------- + {"f1":1,"f2":"foo"} +(1 row) + +SELECT row_to_json(q) +FROM (SELECT $$a$$ || x AS b, + y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + row_to_json +-------------------------------------------------------------------- + {"b":"a1","c":4,"z":[{"f1":1,"f2":[1,2,3]},{"f1":4,"f2":[4,5,6]}]} + {"b":"a1","c":5,"z":[{"f1":1,"f2":[1,2,3]},{"f1":5,"f2":[4,5,6]}]} + {"b":"a2","c":4,"z":[{"f1":2,"f2":[1,2,3]},{"f1":4,"f2":[4,5,6]}]} + {"b":"a2","c":5,"z":[{"f1":2,"f2":[1,2,3]},{"f1":5,"f2":[4,5,6]}]} +(4 rows) + +SELECT row_to_json(q,true) +FROM (SELECT $$a$$ || x AS b, + y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + row_to_json +----------------------------------------------------- + {"b":"a1", + + "c":4, + + "z":[{"f1":1,"f2":[1,2,3]},{"f1":4,"f2":[4,5,6]}]} + {"b":"a1", + + "c":5, + + "z":[{"f1":1,"f2":[1,2,3]},{"f1":5,"f2":[4,5,6]}]} + {"b":"a2", + + "c":4, + + "z":[{"f1":2,"f2":[1,2,3]},{"f1":4,"f2":[4,5,6]}]} + {"b":"a2", + + "c":5, + + "z":[{"f1":2,"f2":[1,2,3]},{"f1":5,"f2":[4,5,6]}]} +(4 rows) + +CREATE TEMP TABLE rows AS +SELECT x, 'txt' || x as y +FROM generate_series(1,3) AS x; +SELECT row_to_json(q,true) +FROM rows q; + row_to_json +-------------- + {"x":1, + + "y":"txt1"} + {"x":2, + + "y":"txt2"} + {"x":3, + + "y":"txt3"} +(3 rows) + +SELECT row_to_json(row((select array_agg(x) as d from generate_series(5,10) x)),false); + row_to_json +----------------------- + {"f1":[5,6,7,8,9,10]} +(1 row) + +-- anyarray column +analyze rows; +select attname, to_json(histogram_bounds) histogram_bounds +from pg_stats +where tablename = 'rows' and + schemaname = pg_my_temp_schema()::regnamespace::text +order by 1; + attname | histogram_bounds +---------+------------------------ + x | [1,2,3] + y | ["txt1","txt2","txt3"] +(2 rows) + +-- to_json, timestamps +select to_json(timestamp '2014-05-28 12:22:35.614298'); + to_json +------------------------------ + "2014-05-28T12:22:35.614298" +(1 row) + +BEGIN; +SET LOCAL TIME ZONE 10.5; +select to_json(timestamptz '2014-05-28 12:22:35.614298-04'); + to_json +------------------------------------ + "2014-05-29T02:52:35.614298+10:30" +(1 row) + +SET LOCAL TIME ZONE -8; +select to_json(timestamptz '2014-05-28 12:22:35.614298-04'); + to_json +------------------------------------ + "2014-05-28T08:22:35.614298-08:00" +(1 row) + +COMMIT; +select to_json(date '2014-05-28'); + to_json +-------------- + "2014-05-28" +(1 row) + +select to_json(date 'Infinity'); + to_json +------------ + "infinity" +(1 row) + +select to_json(date '-Infinity'); + to_json +------------- + "-infinity" +(1 row) + +select to_json(timestamp 'Infinity'); + to_json +------------ + "infinity" +(1 row) + +select to_json(timestamp '-Infinity'); + to_json +------------- + "-infinity" +(1 row) + +select to_json(timestamptz 'Infinity'); + to_json +------------ + "infinity" +(1 row) + +select to_json(timestamptz '-Infinity'); + to_json +------------- + "-infinity" +(1 row) + +--json_agg +SELECT json_agg(q) + FROM ( SELECT $$a$$ || x AS b, y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + json_agg +----------------------------------------------------------------------- + [{"b":"a1","c":4,"z":[{"f1":1,"f2":[1,2,3]},{"f1":4,"f2":[4,5,6]}]}, + + {"b":"a1","c":5,"z":[{"f1":1,"f2":[1,2,3]},{"f1":5,"f2":[4,5,6]}]}, + + {"b":"a2","c":4,"z":[{"f1":2,"f2":[1,2,3]},{"f1":4,"f2":[4,5,6]}]}, + + {"b":"a2","c":5,"z":[{"f1":2,"f2":[1,2,3]},{"f1":5,"f2":[4,5,6]}]}] +(1 row) + +SELECT json_agg(q ORDER BY x, y) + FROM rows q; + json_agg +----------------------- + [{"x":1,"y":"txt1"}, + + {"x":2,"y":"txt2"}, + + {"x":3,"y":"txt3"}] +(1 row) + +UPDATE rows SET x = NULL WHERE x = 1; +SELECT json_agg(q ORDER BY x NULLS FIRST, y) + FROM rows q; + json_agg +-------------------------- + [{"x":null,"y":"txt1"}, + + {"x":2,"y":"txt2"}, + + {"x":3,"y":"txt3"}] +(1 row) + +-- non-numeric output +SELECT row_to_json(q) +FROM (SELECT 'NaN'::float8 AS "float8field") q; + row_to_json +----------------------- + {"float8field":"NaN"} +(1 row) + +SELECT row_to_json(q) +FROM (SELECT 'Infinity'::float8 AS "float8field") q; + row_to_json +---------------------------- + {"float8field":"Infinity"} +(1 row) + +SELECT row_to_json(q) +FROM (SELECT '-Infinity'::float8 AS "float8field") q; + row_to_json +----------------------------- + {"float8field":"-Infinity"} +(1 row) + +-- json input +SELECT row_to_json(q) +FROM (SELECT '{"a":1,"b": [2,3,4,"d","e","f"],"c":{"p":1,"q":2}}'::json AS "jsonfield") q; + row_to_json +------------------------------------------------------------------ + {"jsonfield":{"a":1,"b": [2,3,4,"d","e","f"],"c":{"p":1,"q":2}}} +(1 row) + +-- json extraction functions +CREATE TEMP TABLE test_json ( + json_type text, + test_json json +); +INSERT INTO test_json VALUES +('scalar','"a scalar"'), +('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'), +('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}'); +SELECT test_json -> 'x' +FROM test_json +WHERE json_type = 'scalar'; + ?column? +---------- + +(1 row) + +SELECT test_json -> 'x' +FROM test_json +WHERE json_type = 'array'; + ?column? +---------- + +(1 row) + +SELECT test_json -> 'x' +FROM test_json +WHERE json_type = 'object'; + ?column? +---------- + +(1 row) + +SELECT test_json->'field2' +FROM test_json +WHERE json_type = 'object'; + ?column? +---------- + "val2" +(1 row) + +SELECT test_json->>'field2' +FROM test_json +WHERE json_type = 'object'; + ?column? +---------- + val2 +(1 row) + +SELECT test_json -> 2 +FROM test_json +WHERE json_type = 'scalar'; + ?column? +---------- + +(1 row) + +SELECT test_json -> 2 +FROM test_json +WHERE json_type = 'array'; + ?column? +---------- + "two" +(1 row) + +SELECT test_json -> -1 +FROM test_json +WHERE json_type = 'array'; + ?column? +---------- + {"f1":9} +(1 row) + +SELECT test_json -> 2 +FROM test_json +WHERE json_type = 'object'; + ?column? +---------- + +(1 row) + +SELECT test_json->>2 +FROM test_json +WHERE json_type = 'array'; + ?column? +---------- + two +(1 row) + +SELECT test_json ->> 6 FROM test_json WHERE json_type = 'array'; + ?column? +---------- + [1,2,3] +(1 row) + +SELECT test_json ->> 7 FROM test_json WHERE json_type = 'array'; + ?column? +---------- + {"f1":9} +(1 row) + +SELECT test_json ->> 'field4' FROM test_json WHERE json_type = 'object'; + ?column? +---------- + 4 +(1 row) + +SELECT test_json ->> 'field5' FROM test_json WHERE json_type = 'object'; + ?column? +---------- + [1,2,3] +(1 row) + +SELECT test_json ->> 'field6' FROM test_json WHERE json_type = 'object'; + ?column? +---------- + {"f1":9} +(1 row) + +SELECT json_object_keys(test_json) +FROM test_json +WHERE json_type = 'scalar'; +ERROR: cannot call json_object_keys on a scalar +SELECT json_object_keys(test_json) +FROM test_json +WHERE json_type = 'array'; +ERROR: cannot call json_object_keys on an array +SELECT json_object_keys(test_json) +FROM test_json +WHERE json_type = 'object'; + json_object_keys +------------------ + field1 + field2 + field3 + field4 + field5 + field6 +(6 rows) + +-- test extending object_keys resultset - initial resultset size is 256 +select count(*) from + (select json_object_keys(json_object(array_agg(g))) + from (select unnest(array['f'||n,n::text])as g + from generate_series(1,300) as n) x ) y; + count +------- + 300 +(1 row) + +-- nulls +select (test_json->'field3') is null as expect_false +from test_json +where json_type = 'object'; + expect_false +-------------- + f +(1 row) + +select (test_json->>'field3') is null as expect_true +from test_json +where json_type = 'object'; + expect_true +------------- + t +(1 row) + +select (test_json->3) is null as expect_false +from test_json +where json_type = 'array'; + expect_false +-------------- + f +(1 row) + +select (test_json->>3) is null as expect_true +from test_json +where json_type = 'array'; + expect_true +------------- + t +(1 row) + +-- corner cases +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::text; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::int; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> -1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> ''; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json -> 1; + ?column? +------------- + {"b": "cc"} +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json -> 3; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": "c", "b": null}'::json -> 'b'; + ?column? +---------- + null +(1 row) + +select '"foo"'::json -> 1; + ?column? +---------- + +(1 row) + +select '"foo"'::json -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::text; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::int; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> ''; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 1; + ?column? +------------- + {"b": "cc"} +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 3; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": "c", "b": null}'::json ->> 'b'; + ?column? +---------- + +(1 row) + +select '"foo"'::json ->> 1; + ?column? +---------- + +(1 row) + +select '"foo"'::json ->> 'z'; + ?column? +---------- + +(1 row) + +-- array length +SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); + json_array_length +------------------- + 5 +(1 row) + +SELECT json_array_length('[]'); + json_array_length +------------------- + 0 +(1 row) + +SELECT json_array_length('{"f1":1,"f2":[5,6]}'); +ERROR: cannot get array length of a non-array +SELECT json_array_length('4'); +ERROR: cannot get array length of a scalar +-- each +select json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); + json_each +------------------- + (f1,"[1,2,3]") + (f2,"{""f3"":1}") + (f4,null) +(3 rows) + +select * from json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + key | value +-----+----------- + f1 | [1,2,3] + f2 | {"f3":1} + f4 | null + f5 | 99 + f6 | "stringy" +(5 rows) + +select json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}'); + json_each_text +------------------- + (f1,"[1,2,3]") + (f2,"{""f3"":1}") + (f4,) + (f5,null) +(4 rows) + +select * from json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + key | value +-----+---------- + f1 | [1,2,3] + f2 | {"f3":1} + f4 | + f5 | 99 + f6 | stringy +(5 rows) + +-- extract_path, extract_path_as_text +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + json_extract_path +------------------- + "stringy" +(1 row) + +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + json_extract_path +------------------- + {"f3":1} +(1 row) + +select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + json_extract_path +------------------- + "f3" +(1 row) + +select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + json_extract_path +------------------- + 1 +(1 row) + +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + json_extract_path_text +------------------------ + stringy +(1 row) + +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + json_extract_path_text +------------------------ + {"f3":1} +(1 row) + +select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + json_extract_path_text +------------------------ + f3 +(1 row) + +select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + json_extract_path_text +------------------------ + 1 +(1 row) + +-- extract_path nulls +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_false; + expect_false +-------------- + f +(1 row) + +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_true; + expect_true +------------- + t +(1 row) + +select json_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_false; + expect_false +-------------- + f +(1 row) + +select json_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_true; + expect_true +------------- + t +(1 row) + +-- extract_path operators +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f4','f6']; + ?column? +----------- + "stringy" +(1 row) + +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2']; + ?column? +---------- + {"f3":1} +(1 row) + +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','0']; + ?column? +---------- + "f3" +(1 row) + +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','1']; + ?column? +---------- + 1 +(1 row) + +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f4','f6']; + ?column? +---------- + stringy +(1 row) + +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2']; + ?column? +---------- + {"f3":1} +(1 row) + +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','0']; + ?column? +---------- + f3 +(1 row) + +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','1']; + ?column? +---------- + 1 +(1 row) + +-- corner cases for same +select '{"a": {"b":{"c": "foo"}}}'::json #> '{}'; + ?column? +--------------------------- + {"a": {"b":{"c": "foo"}}} +(1 row) + +select '[1,2,3]'::json #> '{}'; + ?column? +---------- + [1,2,3] +(1 row) + +select '"foo"'::json #> '{}'; + ?column? +---------- + "foo" +(1 row) + +select '42'::json #> '{}'; + ?column? +---------- + 42 +(1 row) + +select 'null'::json #> '{}'; + ?column? +---------- + null +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a']; + ?column? +-------------------- + {"b":{"c": "foo"}} +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', null]; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', '']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b']; + ?column? +-------------- + {"c": "foo"} +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c']; + ?column? +---------- + "foo" +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c','d']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','z','c']; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','1','b']; + ?column? +---------- + "cc" +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','z','b']; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json #> array['1','b']; + ?column? +---------- + "cc" +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json #> array['z','b']; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": null}]'::json #> array['1','b']; + ?column? +---------- + null +(1 row) + +select '"foo"'::json #> array['z']; + ?column? +---------- + +(1 row) + +select '42'::json #> array['f2']; + ?column? +---------- + +(1 row) + +select '42'::json #> array['0']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #>> '{}'; + ?column? +--------------------------- + {"a": {"b":{"c": "foo"}}} +(1 row) + +select '[1,2,3]'::json #>> '{}'; + ?column? +---------- + [1,2,3] +(1 row) + +select '"foo"'::json #>> '{}'; + ?column? +---------- + foo +(1 row) + +select '42'::json #>> '{}'; + ?column? +---------- + 42 +(1 row) + +select 'null'::json #>> '{}'; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a']; + ?column? +-------------------- + {"b":{"c": "foo"}} +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', null]; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', '']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b']; + ?column? +-------------- + {"c": "foo"} +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c']; + ?column? +---------- + foo +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c','d']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','z','c']; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','1','b']; + ?column? +---------- + cc +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','z','b']; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['1','b']; + ?column? +---------- + cc +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['z','b']; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": null}]'::json #>> array['1','b']; + ?column? +---------- + +(1 row) + +select '"foo"'::json #>> array['z']; + ?column? +---------- + +(1 row) + +select '42'::json #>> array['f2']; + ?column? +---------- + +(1 row) + +select '42'::json #>> array['0']; + ?column? +---------- + +(1 row) + +-- array_elements +select json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); + json_array_elements +----------------------- + 1 + true + [1,[2,3]] + null + {"f1":1,"f2":[7,8,9]} + false + "stringy" +(7 rows) + +select * from json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; + value +----------------------- + 1 + true + [1,[2,3]] + null + {"f1":1,"f2":[7,8,9]} + false + "stringy" +(7 rows) + +select json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); + json_array_elements_text +-------------------------- + 1 + true + [1,[2,3]] + + {"f1":1,"f2":[7,8,9]} + false + stringy +(7 rows) + +select * from json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; + value +----------------------- + 1 + true + [1,[2,3]] + + {"f1":1,"f2":[7,8,9]} + false + stringy +(7 rows) + +-- populate_record +create type jpop as (a text, b int, c timestamp); +CREATE DOMAIN js_int_not_null AS int NOT NULL; +CREATE DOMAIN js_int_array_1d AS int[] CHECK(array_length(VALUE, 1) = 3); +CREATE DOMAIN js_int_array_2d AS int[][] CHECK(array_length(VALUE, 2) = 3); +create type j_unordered_pair as (x int, y int); +create domain j_ordered_pair as j_unordered_pair check((value).x <= (value).y); +CREATE TYPE jsrec AS ( + i int, + ia _int4, + ia1 int[], + ia2 int[][], + ia3 int[][][], + ia1d js_int_array_1d, + ia2d js_int_array_2d, + t text, + ta text[], + c char(10), + ca char(10)[], + ts timestamp, + js json, + jsb jsonb, + jsa json[], + rec jpop, + reca jpop[] +); +CREATE TYPE jsrec_i_not_null AS ( + i js_int_not_null +); +select * from json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}') q; + a | b | c +--------+---+--- + blurfl | | +(1 row) + +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":"blurfl","x":43.2}') q; + a | b | c +--------+---+-------------------------- + blurfl | 3 | Mon Dec 31 15:30:56 2012 +(1 row) + +select * from json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}') q; + a | b | c +--------+---+--- + blurfl | | +(1 row) + +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":"blurfl","x":43.2}') q; + a | b | c +--------+---+-------------------------- + blurfl | 3 | Mon Dec 31 15:30:56 2012 +(1 row) + +select * from json_populate_record(null::jpop,'{"a":[100,200,false],"x":43.2}') q; + a | b | c +-----------------+---+--- + [100,200,false] | | +(1 row) + +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":[100,200,false],"x":43.2}') q; + a | b | c +-----------------+---+-------------------------- + [100,200,false] | 3 | Mon Dec 31 15:30:56 2012 +(1 row) + +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"c":[100,200,false],"x":43.2}') q; +ERROR: invalid input syntax for type timestamp: "[100,200,false]" +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{}') q; + a | b | c +---+---+-------------------------- + x | 3 | Mon Dec 31 15:30:56 2012 +(1 row) + +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"x": 43.2}') q; +ERROR: domain js_int_not_null does not allow null values +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"i": null}') q; +ERROR: domain js_int_not_null does not allow null values +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"i": 12345}') q; + i +------- + 12345 +(1 row) + +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": null}') q; + ia +---- + +(1 row) + +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ia". +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [1, "2", null, 4]}') q; + ia +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1, 2], [3, 4]]}') q; + ia +--------------- + {{1,2},{3,4}} +(1 row) + +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1], 2]}') q; +ERROR: expected JSON array +HINT: See the array element [1] of key "ia". +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1], [2, 3]]}') q; +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": "{1,2,3}"}') q; + ia +--------- + {1,2,3} +(1 row) + +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": null}') q; + ia1 +----- + +(1 row) + +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ia1". +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": [1, "2", null, 4]}') q; + ia1 +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": [[1, 2, 3]]}') q; + ia1 +----------- + {{1,2,3}} +(1 row) + +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": null}') q; + ia1d +------ + +(1 row) + +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ia1d". +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": [1, "2", null, 4]}') q; +ERROR: value for domain js_int_array_1d violates check constraint "js_int_array_1d_check" +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": [1, "2", null]}') q; + ia1d +------------ + {1,2,NULL} +(1 row) + +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [1, "2", null, 4]}') q; + ia2 +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], [null, 4]]}') q; + ia2 +------------------ + {{1,2},{NULL,4}} +(1 row) + +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[], []]}') q; + ia2 +----- + {} +(1 row) + +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], [3]]}') q; +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], 3, 4]}') q; +ERROR: expected JSON array +HINT: See the array element [1] of key "ia2". +SELECT ia2d FROM json_populate_record(NULL::jsrec, '{"ia2d": [[1, "2"], [null, 4]]}') q; +ERROR: value for domain js_int_array_2d violates check constraint "js_int_array_2d_check" +SELECT ia2d FROM json_populate_record(NULL::jsrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q; + ia2d +---------------------- + {{1,2,3},{NULL,5,6}} +(1 row) + +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [1, "2", null, 4]}') q; + ia3 +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [[1, 2], [null, 4]]}') q; + ia3 +------------------ + {{1,2},{NULL,4}} +(1 row) + +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q; + ia3 +----- + {} +(1 row) + +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q; + ia3 +------------------- + {{{1,2}},{{3,4}}} +(1 row) + +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q; + ia3 +------------------------------- + {{{1,2},{3,4}},{{5,6},{7,8}}} +(1 row) + +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q; +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": null}') q; + ta +---- + +(1 row) + +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ta". +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": [1, "2", null, 4]}') q; + ta +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q; +ERROR: expected JSON array +HINT: See the array element [1] of key "ta". +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": null}') q; + c +--- + +(1 row) + +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaa"}') q; + c +------------ + aaa +(1 row) + +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaaaaaaaaa"}') q; + c +------------ + aaaaaaaaaa +(1 row) + +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaaaaaaaaaaaa"}') q; +ERROR: value too long for type character(10) +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": null}') q; + ca +---- + +(1 row) + +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ca". +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": [1, "2", null, 4]}') q; + ca +----------------------------------------------- + {"1 ","2 ",NULL,"4 "} +(1 row) + +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q; +ERROR: value too long for type character(10) +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q; +ERROR: expected JSON array +HINT: See the array element [1] of key "ca". +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": null}') q; + js +---- + +(1 row) + +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": true}') q; + js +------ + true +(1 row) + +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": 123.45}') q; + js +-------- + 123.45 +(1 row) + +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": "123.45"}') q; + js +---------- + "123.45" +(1 row) + +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": "abc"}') q; + js +------- + "abc" +(1 row) + +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": [123, "123", null, {"key": "value"}]}') q; + js +-------------------------------------- + [123, "123", null, {"key": "value"}] +(1 row) + +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q; + js +-------------------------------------- + {"a": "bbb", "b": null, "c": 123.45} +(1 row) + +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": null}') q; + jsb +----- + +(1 row) + +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": true}') q; + jsb +------ + true +(1 row) + +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": 123.45}') q; + jsb +-------- + 123.45 +(1 row) + +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": "123.45"}') q; + jsb +---------- + "123.45" +(1 row) + +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": "abc"}') q; + jsb +------- + "abc" +(1 row) + +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q; + jsb +-------------------------------------- + [123, "123", null, {"key": "value"}] +(1 row) + +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q; + jsb +-------------------------------------- + {"a": "bbb", "b": null, "c": 123.45} +(1 row) + +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": null}') q; + jsa +----- + +(1 row) + +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "jsa". +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": [1, "2", null, 4]}') q; + jsa +-------------------- + {1,"\"2\"",NULL,4} +(1 row) + +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q; + jsa +---------------------------------------------------------- + {"\"aaa\"",NULL,"[1, 2, \"3\", {}]","{ \"k\" : \"v\" }"} +(1 row) + +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": 123}') q; +ERROR: cannot call populate_composite on a scalar +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": [1, 2]}') q; +ERROR: cannot call populate_composite on an array +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q; + rec +----------------------------------- + (abc,,"Thu Jan 02 00:00:00 2003") +(1 row) + +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": "(abc,42,01.02.2003)"}') q; + rec +------------------------------------- + (abc,42,"Thu Jan 02 00:00:00 2003") +(1 row) + +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "reca". +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": [1, 2]}') q; +ERROR: cannot call populate_composite on a scalar +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q; + reca +-------------------------------------------------------- + {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"} +(1 row) + +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": ["(abc,42,01.02.2003)"]}') q; + reca +------------------------------------------- + {"(abc,42,\"Thu Jan 02 00:00:00 2003\")"} +(1 row) + +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q; + reca +------------------------------------------- + {"(abc,42,\"Thu Jan 02 00:00:00 2003\")"} +(1 row) + +SELECT rec FROM json_populate_record( + row(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + row('x',3,'2012-12-31 15:30:56')::jpop,NULL)::jsrec, + '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}' +) q; + rec +------------------------------------ + (abc,3,"Thu Jan 02 00:00:00 2003") +(1 row) + +-- anonymous record type +SELECT json_populate_record(null::record, '{"x": 0, "y": 1}'); +ERROR: could not determine row type for result of json_populate_record +HINT: Provide a non-null record argument, or call the function in the FROM clause using a column definition list. +SELECT json_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); + json_populate_record +---------------------- + (0,1) +(1 row) + +--start_ignore +-- GPDB_13_MERGE_FIXME: Need to full support stable evaluation in const evalation in planner. +--end_ignore +SELECT * FROM + json_populate_record(null::record, '{"x": 776}') AS (x int, y int); +ERROR: could not determine row type for result of json_populate_record +HINT: Provide a non-null record argument, or call the function in the FROM clause using a column definition list. +-- composite domain +SELECT json_populate_record(null::j_ordered_pair, '{"x": 0, "y": 1}'); + json_populate_record +---------------------- + (0,1) +(1 row) + +SELECT json_populate_record(row(1,2)::j_ordered_pair, '{"x": 0}'); + json_populate_record +---------------------- + (0,2) +(1 row) + +SELECT json_populate_record(row(1,2)::j_ordered_pair, '{"x": 1, "y": 0}'); +ERROR: value for domain j_ordered_pair violates check constraint "j_ordered_pair_check" +-- populate_recordset +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+---+-------------------------- + blurfl | | + | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+----+-------------------------- + blurfl | 99 | + def | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+---+-------------------------- + blurfl | | + | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+----+-------------------------- + blurfl | 99 | + def | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +---------------+----+-------------------------- + [100,200,300] | 99 | + {"z":true} | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +ERROR: invalid input syntax for type timestamp: "[100,200,300]" +create type jpop2 as (a int, b json, c int, d int); +select * from json_populate_recordset(null::jpop2, '[{"a":2,"c":3,"b":{"z":4},"d":6}]') q; + a | b | c | d +---+---------+---+--- + 2 | {"z":4} | 3 | 6 +(1 row) + +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+---+-------------------------- + blurfl | | + | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+----+-------------------------- + blurfl | 99 | + def | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +---------------+----+-------------------------- + [100,200,300] | 99 | + {"z":true} | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +-- anonymous record type +SELECT json_populate_recordset(null::record, '[{"x": 0, "y": 1}]'); +ERROR: could not determine row type for result of json_populate_recordset +HINT: Provide a non-null record argument, or call the function in the FROM clause using a column definition list. +SELECT json_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]'); + json_populate_recordset +------------------------- + (0,1) +(1 row) + +SELECT i, json_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]') +FROM (VALUES (1),(2)) v(i); + i | json_populate_recordset +---+------------------------- + 1 | (42,50) + 1 | (1,43) + 2 | (42,50) + 2 | (2,43) +(4 rows) + +SELECT * FROM + json_populate_recordset(null::record, '[{"x": 776}]') AS (x int, y int); + x | y +-----+--- + 776 | +(1 row) + +-- empty array is a corner case +SELECT json_populate_recordset(null::record, '[]'); +ERROR: could not determine row type for result of json_populate_recordset +HINT: Provide a non-null record argument, or call the function in the FROM clause using a column definition list. +SELECT json_populate_recordset(row(1,2), '[]'); + json_populate_recordset +------------------------- +(0 rows) + +SELECT * FROM json_populate_recordset(NULL::jpop,'[]') q; + a | b | c +---+---+--- +(0 rows) + +SELECT * FROM + json_populate_recordset(null::record, '[]') AS (x int, y int); + x | y +---+--- +(0 rows) + +-- composite domain +SELECT json_populate_recordset(null::j_ordered_pair, '[{"x": 0, "y": 1}]'); + json_populate_recordset +------------------------- + (0,1) +(1 row) + +SELECT json_populate_recordset(row(1,2)::j_ordered_pair, '[{"x": 0}, {"y": 3}]'); + json_populate_recordset +------------------------- + (0,2) + (1,3) +(2 rows) + +SELECT json_populate_recordset(row(1,2)::j_ordered_pair, '[{"x": 1, "y": 0}]'); +ERROR: value for domain j_ordered_pair violates check constraint "j_ordered_pair_check" +-- negative cases where the wrong record type is supplied +select * from json_populate_recordset(row(0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +ERROR: function return row and query-specified return row do not match +DETAIL: Returned row contains 1 attribute, but query expects 2. +select * from json_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +ERROR: function return row and query-specified return row do not match +DETAIL: Returned type integer at ordinal position 1, but query expects text. +select * from json_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +ERROR: function return row and query-specified return row do not match +DETAIL: Returned row contains 3 attributes, but query expects 2. +select * from json_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text); +ERROR: function return row and query-specified return row do not match +DETAIL: Returned type integer at ordinal position 1, but query expects text. +-- test type info caching in json_populate_record() +CREATE TEMP TABLE jspoptest (js json); +INSERT INTO jspoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::json +FROM generate_series(1, 3); +SELECT (json_populate_record(NULL::jsrec, js)).* FROM jspoptest; + i | ia | ia1 | ia2 | ia3 | ia1d | ia2d | t | ta | c | ca | ts | js | jsb | jsa | rec | reca +---+----+-----+-----+-----+------+------+---+----+---+----+----+----+-----+--------------------+-----------------------------------+-------------------------------------------------------- + | | | | | | | | | | | | | | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"} + | | | | | | | | | | | | | | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"} + | | | | | | | | | | | | | | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"} +(3 rows) + +DROP TYPE jsrec; +DROP TYPE jsrec_i_not_null; +DROP DOMAIN js_int_not_null; +DROP DOMAIN js_int_array_1d; +DROP DOMAIN js_int_array_2d; +DROP DOMAIN j_ordered_pair; +DROP TYPE j_unordered_pair; +--json_typeof() function +select value, json_typeof(value) + from (values (json '123.4'), + (json '-1'), + (json '"foo"'), + (json 'true'), + (json 'false'), + (json 'null'), + (json '[1, 2, 3]'), + (json '[]'), + (json '{"x":"foo", "y":123}'), + (json '{}'), + (NULL::json)) + as data(value); + value | json_typeof +----------------------+------------- + 123.4 | number + -1 | number + "foo" | string + true | boolean + false | boolean + null | null + [1, 2, 3] | array + [] | array + {"x":"foo", "y":123} | object + {} | object + | +(11 rows) + +-- json_build_array, json_build_object, json_object_agg +SELECT json_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + json_build_array +----------------------------------------------------------------------- + ["a", 1, "b", 1.2, "c", true, "d", null, "e", {"x": 3, "y": [1,2,3]}] +(1 row) + +SELECT json_build_array('a', NULL); -- ok + json_build_array +------------------ + ["a", null] +(1 row) + +SELECT json_build_array(VARIADIC NULL::text[]); -- ok + json_build_array +------------------ + +(1 row) + +SELECT json_build_array(VARIADIC '{}'::text[]); -- ok + json_build_array +------------------ + [] +(1 row) + +SELECT json_build_array(VARIADIC '{a,b,c}'::text[]); -- ok + json_build_array +------------------ + ["a", "b", "c"] +(1 row) + +SELECT json_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok + json_build_array +------------------ + ["a", null] +(1 row) + +SELECT json_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok + json_build_array +---------------------- + ["1", "2", "3", "4"] +(1 row) + +SELECT json_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok + json_build_array +------------------ + [1, 2, 3, 4] +(1 row) + +SELECT json_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + json_build_array +-------------------- + [1, 4, 2, 5, 3, 6] +(1 row) + +SELECT json_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + json_build_object +---------------------------------------------------------------------------- + {"a" : 1, "b" : 1.2, "c" : true, "d" : null, "e" : {"x": 3, "y": [1,2,3]}} +(1 row) + +SELECT json_build_object( + 'a', json_build_object('b',false,'c',99), + 'd', json_build_object('e',array[9,8,7]::int[], + 'f', (select row_to_json(r) from ( select relkind, oid::regclass as name from pg_class where relname = 'pg_class') r))); + json_build_object +------------------------------------------------------------------------------------------------- + {"a" : {"b" : false, "c" : 99}, "d" : {"e" : [9,8,7], "f" : {"relkind":"r","name":"pg_class"}}} +(1 row) + +SELECT json_build_object('{a,b,c}'::text[]); -- error +ERROR: argument list must have even number of elements +HINT: The arguments of json_build_object() must consist of alternating keys and values. +SELECT json_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array +ERROR: key value must be scalar, not array, composite, or json +SELECT json_build_object('a', 'b', 'c'); -- error +ERROR: argument list must have even number of elements +HINT: The arguments of json_build_object() must consist of alternating keys and values. +SELECT json_build_object(NULL, 'a'); -- error, key cannot be NULL +ERROR: argument 1 cannot be null +HINT: Object keys should be text. +SELECT json_build_object('a', NULL); -- ok + json_build_object +------------------- + {"a" : null} +(1 row) + +SELECT json_build_object(VARIADIC NULL::text[]); -- ok + json_build_object +------------------- + +(1 row) + +SELECT json_build_object(VARIADIC '{}'::text[]); -- ok + json_build_object +------------------- + {} +(1 row) + +SELECT json_build_object(VARIADIC '{a,b,c}'::text[]); -- error +ERROR: argument list must have even number of elements +HINT: The arguments of json_build_object() must consist of alternating keys and values. +SELECT json_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok + json_build_object +------------------- + {"a" : null} +(1 row) + +SELECT json_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL +ERROR: argument 1 cannot be null +HINT: Object keys should be text. +SELECT json_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok + json_build_object +------------------------ + {"1" : "2", "3" : "4"} +(1 row) + +SELECT json_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok + json_build_object +-------------------- + {"1" : 2, "3" : 4} +(1 row) + +SELECT json_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + json_build_object +----------------------------- + {"1" : 4, "2" : 5, "3" : 6} +(1 row) + +-- empty objects/arrays +SELECT json_build_array(); + json_build_array +------------------ + [] +(1 row) + +SELECT json_build_object(); + json_build_object +------------------- + {} +(1 row) + +-- make sure keys are quoted +SELECT json_build_object(1,2); + json_build_object +------------------- + {"1" : 2} +(1 row) + +-- keys must be scalar and not null +SELECT json_build_object(null,2); +ERROR: argument 1 cannot be null +HINT: Object keys should be text. +SELECT json_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; +ERROR: key value must be scalar, not array, composite, or json +SELECT json_build_object(json '{"a":1,"b":2}', 3); +ERROR: key value must be scalar, not array, composite, or json +SELECT json_build_object('{1,2,3}'::int[], 3); +ERROR: key value must be scalar, not array, composite, or json +CREATE TEMP TABLE foo (serial_num int, name text, type text); +INSERT INTO foo VALUES (847001,'t15','GE1043'); +INSERT INTO foo VALUES (847002,'t16','GE1043'); +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); +SELECT json_build_object('turbines',json_object_agg(serial_num,json_build_object('name',name,'type',type))) +FROM foo; + json_build_object +------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"turbines" : { "847001" : {"name" : "t15", "type" : "GE1043"}, "847002" : {"name" : "t16", "type" : "GE1043"}, "847003" : {"name" : "sub-alpha", "type" : "GESS90"} }} +(1 row) + +SELECT json_object_agg(name, type) FROM foo; + json_object_agg +---------------------------------------------------------------- + { "t15" : "GE1043", "t16" : "GE1043", "sub-alpha" : "GESS90" } +(1 row) + +INSERT INTO foo VALUES (999999, NULL, 'bar'); +SELECT json_object_agg(name, type) FROM foo; +ERROR: field name must not be null +-- json_object +-- empty object, one dimension +SELECT json_object('{}'); + json_object +------------- + {} +(1 row) + +-- empty object, two dimensions +SELECT json_object('{}', '{}'); + json_object +------------- + {} +(1 row) + +-- one dimension +SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); + json_object +------------------------------------------------------- + {"a" : "1", "b" : "2", "3" : null, "d e f" : "a b c"} +(1 row) + +-- same but with two dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); + json_object +------------------------------------------------------- + {"a" : "1", "b" : "2", "3" : null, "d e f" : "a b c"} +(1 row) + +-- odd number error +SELECT json_object('{a,b,c}'); +ERROR: array must have even number of elements +-- one column error +SELECT json_object('{{a},{b}}'); +ERROR: array must have two columns +-- too many columns error +SELECT json_object('{{a,b,c},{b,c,d}}'); +ERROR: array must have two columns +-- too many dimensions error +SELECT json_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); +ERROR: wrong number of array subscripts +--two argument form of json_object +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); + json_object +------------------------------------------------------ + {"a" : "1", "b" : "2", "c" : "3", "d e f" : "a b c"} +(1 row) + +-- too many dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +ERROR: wrong number of array subscripts +-- mismatched dimensions +select json_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); +ERROR: mismatched array dimensions +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); +ERROR: mismatched array dimensions +-- null key error +select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); +ERROR: null value not allowed for object key +-- empty key is allowed +select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); + json_object +----------------------------------------------------- + {"a" : "1", "b" : "2", "" : "3", "d e f" : "a b c"} +(1 row) + +-- json_to_record and json_to_recordset +select * from json_to_record('{"a":1,"b":"foo","c":"bar"}') + as x(a int, b text, d text); + a | b | d +---+-----+--- + 1 | foo | +(1 row) + +select * from json_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') + as x(a int, b text, c boolean); + a | b | c +---+-----+--- + 1 | foo | + 2 | bar | t +(2 rows) + +select * from json_to_recordset('[{"a":1,"b":{"d":"foo"},"c":true},{"a":2,"c":false,"b":{"d":"bar"}}]') + as x(a int, b json, c boolean); + a | b | c +---+-------------+--- + 1 | {"d":"foo"} | t + 2 | {"d":"bar"} | f +(2 rows) + +select *, c is null as c_is_null +from json_to_record('{"a":1, "b":{"c":16, "d":2}, "x":8, "ca": ["1 2", 3], "ia": [[1,2],[3,4]], "r": {"a": "aaa", "b": 123}}'::json) + as t(a int, b json, c text, x int, ca char(5)[], ia int[][], r jpop); + a | b | c | x | ca | ia | r | c_is_null +---+-----------------+---+---+-------------------+---------------+------------+----------- + 1 | {"c":16, "d":2} | | 8 | {"1 2 ","3 "} | {{1,2},{3,4}} | (aaa,123,) | t +(1 row) + +select *, c is null as c_is_null +from json_to_recordset('[{"a":1, "b":{"c":16, "d":2}, "x":8}]'::json) + as t(a int, b json, c text, x int); + a | b | c | x | c_is_null +---+-----------------+---+---+----------- + 1 | {"c":16, "d":2} | | 8 | t +(1 row) + +select * from json_to_record('{"ia": null}') as x(ia _int4); + ia +---- + +(1 row) + +select * from json_to_record('{"ia": 123}') as x(ia _int4); +ERROR: expected JSON array +HINT: See the value of key "ia". +select * from json_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4); + ia +-------------- + {1,2,NULL,4} +(1 row) + +select * from json_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4); + ia +--------------- + {{1,2},{3,4}} +(1 row) + +select * from json_to_record('{"ia": [[1], 2]}') as x(ia _int4); +ERROR: expected JSON array +HINT: See the array element [1] of key "ia". +select * from json_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4); +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select * from json_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]); + ia2 +--------- + {1,2,3} +(1 row) + +select * from json_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]); + ia2 +--------------- + {{1,2},{3,4}} +(1 row) + +select * from json_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]); + ia2 +----------------- + {{{1},{2},{3}}} +(1 row) + +select * from json_to_record('{"out": {"key": 1}}') as x(out json); + out +------------ + {"key": 1} +(1 row) + +select * from json_to_record('{"out": [{"key": 1}]}') as x(out json); + out +-------------- + [{"key": 1}] +(1 row) + +select * from json_to_record('{"out": "{\"key\": 1}"}') as x(out json); + out +---------------- + "{\"key\": 1}" +(1 row) + +select * from json_to_record('{"out": {"key": 1}}') as x(out jsonb); + out +------------ + {"key": 1} +(1 row) + +select * from json_to_record('{"out": [{"key": 1}]}') as x(out jsonb); + out +-------------- + [{"key": 1}] +(1 row) + +select * from json_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb); + out +---------------- + "{\"key\": 1}" +(1 row) + +-- json_strip_nulls +select json_strip_nulls(null); + json_strip_nulls +------------------ + +(1 row) + +select json_strip_nulls('1'); + json_strip_nulls +------------------ + 1 +(1 row) + +select json_strip_nulls('"a string"'); + json_strip_nulls +------------------ + "a string" +(1 row) + +select json_strip_nulls('null'); + json_strip_nulls +------------------ + null +(1 row) + +select json_strip_nulls('[1,2,null,3,4]'); + json_strip_nulls +------------------ + [1,2,null,3,4] +(1 row) + +select json_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); + json_strip_nulls +------------------------------------ + {"a":1,"c":[2,null,3],"d":{"e":4}} +(1 row) + +select json_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); + json_strip_nulls +--------------------- + [1,{"a":1,"c":2},3] +(1 row) + +-- an empty object is not null and should not be stripped +select json_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); + json_strip_nulls +------------------ + {"a":{},"d":{}} +(1 row) + +-- json to tsvector +select to_tsvector('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::json); + to_tsvector +--------------------------------------------------------------------------- + 'aaa':1 'bbb':2 'ccc':4 'ddd':3 'eee':6 'fff':7 'ggg':8 'hhh':10 'iii':11 +(1 row) + +-- json to tsvector with config +select to_tsvector('simple', '{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::json); + to_tsvector +--------------------------------------------------------------------------- + 'aaa':1 'bbb':2 'ccc':4 'ddd':3 'eee':6 'fff':7 'ggg':8 'hhh':10 'iii':11 +(1 row) + +-- json to tsvector with stop words +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": ["the eee fff ggg"], "c": {"d": "hhh. iii"}}'::json); + to_tsvector +---------------------------------------------------------------------------- + 'aaa':1 'bbb':3 'ccc':5 'ddd':4 'eee':8 'fff':9 'ggg':10 'hhh':12 'iii':13 +(1 row) + +-- json to tsvector with numeric values +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": 123, "c": 456}'::json); + to_tsvector +--------------------------------- + 'aaa':1 'bbb':3 'ccc':5 'ddd':4 +(1 row) + +-- json_to_tsvector +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"all"'); + json_to_tsvector +---------------------------------------------------------------------------------------- + '123':8 '456':12 'aaa':2 'b':6 'bbb':4 'c':10 'd':14 'f':18 'fals':20 'g':22 'true':16 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); + json_to_tsvector +-------------------------------- + 'b':2 'c':4 'd':6 'f':8 'g':10 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); + json_to_tsvector +------------------ + 'aaa':1 'bbb':3 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); + json_to_tsvector +------------------ + '123':1 '456':3 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); + json_to_tsvector +------------------- + 'fals':3 'true':1 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); + json_to_tsvector +--------------------------------- + '123':5 '456':7 'aaa':1 'bbb':3 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"all"'); + json_to_tsvector +---------------------------------------------------------------------------------------- + '123':8 '456':12 'aaa':2 'b':6 'bbb':4 'c':10 'd':14 'f':18 'fals':20 'g':22 'true':16 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); + json_to_tsvector +-------------------------------- + 'b':2 'c':4 'd':6 'f':8 'g':10 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); + json_to_tsvector +------------------ + 'aaa':1 'bbb':3 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); + json_to_tsvector +------------------ + '123':1 '456':3 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); + json_to_tsvector +------------------- + 'fals':3 'true':1 +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); + json_to_tsvector +--------------------------------- + '123':5 '456':7 'aaa':1 'bbb':3 +(1 row) + +-- to_tsvector corner cases +select to_tsvector('""'::json); + to_tsvector +------------- + +(1 row) + +select to_tsvector('{}'::json); + to_tsvector +------------- + +(1 row) + +select to_tsvector('[]'::json); + to_tsvector +------------- + +(1 row) + +select to_tsvector('null'::json); + to_tsvector +------------- + +(1 row) + +-- json_to_tsvector corner cases +select json_to_tsvector('""'::json, '"all"'); + json_to_tsvector +------------------ + +(1 row) + +select json_to_tsvector('{}'::json, '"all"'); + json_to_tsvector +------------------ + +(1 row) + +select json_to_tsvector('[]'::json, '"all"'); + json_to_tsvector +------------------ + +(1 row) + +select json_to_tsvector('null'::json, '"all"'); + json_to_tsvector +------------------ + +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '""'); +ERROR: wrong flag in flag array: "" +HINT: Possible values are: "string", "numeric", "boolean", "key", and "all". +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '{}'); +ERROR: wrong flag type, only arrays and scalars are allowed +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '[]'); + json_to_tsvector +------------------ + +(1 row) + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, 'null'); +ERROR: flag array element is not a string +HINT: Possible values are: "string", "numeric", "boolean", "key", and "all". +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["all", null]'); +ERROR: flag array element is not a string +HINT: Possible values are: "string", "numeric", "boolean", "key", and "all". +-- ts_headline for json +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ts_headline +--------------------------------------------------------------------------------------------------------- + {"a":"aaa bbb","b":{"c":"ccc ddd fff","c1":"ccc1 ddd1"},"d":["ggg hhh","iii jjj"]} +(1 row) + +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); + ts_headline +---------------------------------------------------------------------------------------- + {"a":"aaa bbb","b":{"c":"ccc ddd fff"},"d":["ggg hhh","iii jjj"]} +(1 row) + +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ts_headline +------------------------------------------------------------------------------------------ + {"a":"aaa ","b":{"c":"ccc fff","c1":"ccc1 ddd1"},"d":["ggg ","iii jjj"]} +(1 row) + +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ts_headline +------------------------------------------------------------------------------------------ + {"a":"aaa ","b":{"c":"ccc fff","c1":"ccc1 ddd1"},"d":["ggg ","iii jjj"]} +(1 row) + +-- corner cases for ts_headline with json +select ts_headline('null'::json, tsquery('aaa & bbb')); + ts_headline +------------- + null +(1 row) + +select ts_headline('{}'::json, tsquery('aaa & bbb')); + ts_headline +------------- + {} +(1 row) + +select ts_headline('[]'::json, tsquery('aaa & bbb')); + ts_headline +------------- + [] +(1 row) + diff --git a/src/test/singlenode_regress/expected/json_encoding.out b/src/test/singlenode_regress/expected/json_encoding.out new file mode 100644 index 00000000000..fa41b401030 --- /dev/null +++ b/src/test/singlenode_regress/expected/json_encoding.out @@ -0,0 +1,262 @@ +-- +-- encoding-sensitive tests for json and jsonb +-- +-- We provide expected-results files for UTF8 (json_encoding.out) +-- and for SQL_ASCII (json_encoding_1.out). Skip otherwise. +SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') + AS skip_test \gset +\if :skip_test +\quit +\endif +SELECT getdatabaseencoding(); -- just to label the results files + getdatabaseencoding +--------------------- + UTF8 +(1 row) + +-- first json +-- basic unicode input +SELECT '"\u"'::json; -- ERROR, incomplete escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u"'::json; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u" +SELECT '"\u00"'::json; -- ERROR, incomplete escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u00"'::json; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u00" +SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u000g"'::json; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u000g... +SELECT '"\u0000"'::json; -- OK, legal escape + json +---------- + "\u0000" +(1 row) + +SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK + json +---------- + "\uaBcD" +(1 row) + +-- handling of unicode surrogate pairs +select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8; + correct_in_utf8 +---------------------------- + "\ud83d\ude04\ud83d\udc36" +(1 row) + +select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row +ERROR: invalid input syntax for type json +DETAIL: Unicode high surrogate must not follow a high surrogate. +CONTEXT: JSON data, line 1: { "a": "\ud83d\ud83d... +select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order +ERROR: invalid input syntax for type json +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a": "\ude04... +select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate +ERROR: invalid input syntax for type json +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a": "\ud83dX... +select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate +ERROR: invalid input syntax for type json +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a": "\ude04... +--handling of simple unicode escapes +select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8; + correct_in_utf8 +--------------------------------------- + { "a": "the Copyright \u00a9 sign" } +(1 row) + +select json '{ "a": "dollar \u0024 character" }' as correct_everywhere; + correct_everywhere +------------------------------------- + { "a": "dollar \u0024 character" } +(1 row) + +select json '{ "a": "dollar \\u0024 character" }' as not_an_escape; + not_an_escape +-------------------------------------- + { "a": "dollar \\u0024 character" } +(1 row) + +select json '{ "a": "null \u0000 escape" }' as not_unescaped; + not_unescaped +-------------------------------- + { "a": "null \u0000 escape" } +(1 row) + +select json '{ "a": "null \\u0000 escape" }' as not_an_escape; + not_an_escape +--------------------------------- + { "a": "null \\u0000 escape" } +(1 row) + +select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8; + correct_in_utf8 +---------------------- + the Copyright © sign +(1 row) + +select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere; + correct_everywhere +-------------------- + dollar $ character +(1 row) + +select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape; + not_an_escape +------------------------- + dollar \u0024 character +(1 row) + +select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails; +ERROR: unsupported Unicode escape sequence +DETAIL: \u0000 cannot be converted to text. +CONTEXT: JSON data, line 1: { "a": "null \u0000... +select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape; + not_an_escape +-------------------- + null \u0000 escape +(1 row) + +-- then jsonb +-- basic unicode input +SELECT '"\u"'::jsonb; -- ERROR, incomplete escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u"'::jsonb; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u" +SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u00"'::jsonb; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u00" +SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u000g"'::jsonb; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u000g... +SELECT '"\u0045"'::jsonb; -- OK, legal escape + jsonb +------- + "E" +(1 row) + +SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000 +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT '"\u0000"'::jsonb; + ^ +DETAIL: \u0000 cannot be converted to text. +CONTEXT: JSON data, line 1: "\u0000... +-- use octet_length here so we don't get an odd unicode char in the +-- output +SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK + octet_length +-------------- + 5 +(1 row) + +-- handling of unicode surrogate pairs +SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8; + correct_in_utf8 +----------------- + 10 +(1 row) + +SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row +ERROR: invalid input syntax for type json +LINE 1: SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; + ^ +DETAIL: Unicode high surrogate must not follow a high surrogate. +CONTEXT: JSON data, line 1: { "a": "\ud83d\ud83d... +SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order +ERROR: invalid input syntax for type json +LINE 1: SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a": "\ude04... +SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate +ERROR: invalid input syntax for type json +LINE 1: SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a": "\ud83dX... +SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate +ERROR: invalid input syntax for type json +LINE 1: SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a": "\ude04... +-- handling of simple unicode escapes +SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8; + correct_in_utf8 +------------------------------- + {"a": "the Copyright © sign"} +(1 row) + +SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere; + correct_everywhere +----------------------------- + {"a": "dollar $ character"} +(1 row) + +SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape; + not_an_escape +----------------------------------- + {"a": "dollar \\u0024 character"} +(1 row) + +SELECT jsonb '{ "a": "null \u0000 escape" }' as fails; +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' as fails; + ^ +DETAIL: \u0000 cannot be converted to text. +CONTEXT: JSON data, line 1: { "a": "null \u0000... +SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape; + not_an_escape +------------------------------ + {"a": "null \\u0000 escape"} +(1 row) + +SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8; + correct_in_utf8 +---------------------- + the Copyright © sign +(1 row) + +SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere; + correct_everywhere +-------------------- + dollar $ character +(1 row) + +SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape; + not_an_escape +------------------------- + dollar \u0024 character +(1 row) + +SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails; +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fai... + ^ +DETAIL: \u0000 cannot be converted to text. +CONTEXT: JSON data, line 1: { "a": "null \u0000... +SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape; + not_an_escape +-------------------- + null \u0000 escape +(1 row) + diff --git a/src/test/singlenode_regress/expected/json_encoding_1.out b/src/test/singlenode_regress/expected/json_encoding_1.out new file mode 100644 index 00000000000..e2fc131b0fa --- /dev/null +++ b/src/test/singlenode_regress/expected/json_encoding_1.out @@ -0,0 +1,246 @@ +-- +-- encoding-sensitive tests for json and jsonb +-- +-- We provide expected-results files for UTF8 (json_encoding.out) +-- and for SQL_ASCII (json_encoding_1.out). Skip otherwise. +SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') + AS skip_test \gset +\if :skip_test +\quit +\endif +SELECT getdatabaseencoding(); -- just to label the results files + getdatabaseencoding +--------------------- + SQL_ASCII +(1 row) + +-- first json +-- basic unicode input +SELECT '"\u"'::json; -- ERROR, incomplete escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u"'::json; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u" +SELECT '"\u00"'::json; -- ERROR, incomplete escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u00"'::json; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u00" +SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u000g"'::json; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u000g... +SELECT '"\u0000"'::json; -- OK, legal escape + json +---------- + "\u0000" +(1 row) + +SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK + json +---------- + "\uaBcD" +(1 row) + +-- handling of unicode surrogate pairs +select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row +ERROR: invalid input syntax for type json +DETAIL: Unicode high surrogate must not follow a high surrogate. +CONTEXT: JSON data, line 1: { "a":... +select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order +ERROR: invalid input syntax for type json +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a":... +select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate +ERROR: invalid input syntax for type json +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a":... +select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate +ERROR: invalid input syntax for type json +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a":... +--handling of simple unicode escapes +select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8; + correct_in_utf8 +--------------------------------------- + { "a": "the Copyright \u00a9 sign" } +(1 row) + +select json '{ "a": "dollar \u0024 character" }' as correct_everywhere; + correct_everywhere +------------------------------------- + { "a": "dollar \u0024 character" } +(1 row) + +select json '{ "a": "dollar \\u0024 character" }' as not_an_escape; + not_an_escape +-------------------------------------- + { "a": "dollar \\u0024 character" } +(1 row) + +select json '{ "a": "null \u0000 escape" }' as not_unescaped; + not_unescaped +-------------------------------- + { "a": "null \u0000 escape" } +(1 row) + +select json '{ "a": "null \\u0000 escape" }' as not_an_escape; + not_an_escape +--------------------------------- + { "a": "null \\u0000 escape" } +(1 row) + +select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere; + correct_everywhere +-------------------- + dollar $ character +(1 row) + +select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape; + not_an_escape +------------------------- + dollar \u0024 character +(1 row) + +select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails; +ERROR: unsupported Unicode escape sequence +DETAIL: \u0000 cannot be converted to text. +CONTEXT: JSON data, line 1: { "a":... +select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape; + not_an_escape +-------------------- + null \u0000 escape +(1 row) + +-- then jsonb +-- basic unicode input +SELECT '"\u"'::jsonb; -- ERROR, incomplete escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u"'::jsonb; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u" +SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u00"'::jsonb; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u00" +SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\u000g"'::jsonb; + ^ +DETAIL: "\u" must be followed by four hexadecimal digits. +CONTEXT: JSON data, line 1: "\u000g... +SELECT '"\u0045"'::jsonb; -- OK, legal escape + jsonb +------- + "E" +(1 row) + +SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000 +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT '"\u0000"'::jsonb; + ^ +DETAIL: \u0000 cannot be converted to text. +CONTEXT: JSON data, line 1: ... +-- use octet_length here so we don't get an odd unicode char in the +-- output +SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: SELECT octet_length('"\uaBcD"'::jsonb::text); + ^ +-- handling of unicode surrogate pairs +SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc3... + ^ +SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row +ERROR: invalid input syntax for type json +LINE 1: SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; + ^ +DETAIL: Unicode high surrogate must not follow a high surrogate. +CONTEXT: JSON data, line 1: { "a":... +SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order +ERROR: invalid input syntax for type json +LINE 1: SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a":... +SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate +ERROR: invalid input syntax for type json +LINE 1: SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a":... +SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate +ERROR: invalid input syntax for type json +LINE 1: SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +CONTEXT: JSON data, line 1: { "a":... +-- handling of simple unicode escapes +SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as corr... + ^ +SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere; + correct_everywhere +----------------------------- + {"a": "dollar $ character"} +(1 row) + +SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape; + not_an_escape +----------------------------------- + {"a": "dollar \\u0024 character"} +(1 row) + +SELECT jsonb '{ "a": "null \u0000 escape" }' as fails; +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' as fails; + ^ +DETAIL: \u0000 cannot be converted to text. +CONTEXT: JSON data, line 1: { "a":... +SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape; + not_an_escape +------------------------------ + {"a": "null \\u0000 escape"} +(1 row) + +SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a'... + ^ +SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere; + correct_everywhere +-------------------- + dollar $ character +(1 row) + +SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape; + not_an_escape +------------------------- + dollar \u0024 character +(1 row) + +SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails; +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fai... + ^ +DETAIL: \u0000 cannot be converted to text. +CONTEXT: JSON data, line 1: { "a":... +SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape; + not_an_escape +-------------------- + null \u0000 escape +(1 row) + diff --git a/src/test/singlenode_regress/expected/json_encoding_2.out b/src/test/singlenode_regress/expected/json_encoding_2.out new file mode 100644 index 00000000000..4fc8f0241ab --- /dev/null +++ b/src/test/singlenode_regress/expected/json_encoding_2.out @@ -0,0 +1,9 @@ +-- +-- encoding-sensitive tests for json and jsonb +-- +-- We provide expected-results files for UTF8 (json_encoding.out) +-- and for SQL_ASCII (json_encoding_1.out). Skip otherwise. +SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') + AS skip_test \gset +\if :skip_test +\quit diff --git a/src/test/singlenode_regress/expected/jsonb.out b/src/test/singlenode_regress/expected/jsonb.out new file mode 100644 index 00000000000..3f078b4b502 --- /dev/null +++ b/src/test/singlenode_regress/expected/jsonb.out @@ -0,0 +1,5511 @@ +-- Strings. +SELECT '""'::jsonb; -- OK. + jsonb +------- + "" +(1 row) + +SELECT $$''$$::jsonb; -- ERROR, single quotes are not allowed +ERROR: invalid input syntax for type json +LINE 1: SELECT $$''$$::jsonb; + ^ +DETAIL: Token "'" is invalid. +CONTEXT: JSON data, line 1: '... +SELECT '"abc"'::jsonb; -- OK + jsonb +------- + "abc" +(1 row) + +SELECT '"abc'::jsonb; -- ERROR, quotes not closed +ERROR: invalid input syntax for type json +LINE 1: SELECT '"abc'::jsonb; + ^ +DETAIL: Token ""abc" is invalid. +CONTEXT: JSON data, line 1: "abc +SELECT '"abc +def"'::jsonb; -- ERROR, unescaped newline in string constant +ERROR: invalid input syntax for type json +LINE 1: SELECT '"abc + ^ +DETAIL: Character with value 0x0a must be escaped. +CONTEXT: JSON data, line 1: "abc +SELECT '"\n\"\\"'::jsonb; -- OK, legal escapes + jsonb +---------- + "\n\"\\" +(1 row) + +SELECT '"\v"'::jsonb; -- ERROR, not a valid JSON escape +ERROR: invalid input syntax for type json +LINE 1: SELECT '"\v"'::jsonb; + ^ +DETAIL: Escape sequence "\v" is invalid. +CONTEXT: JSON data, line 1: "\v... +-- see json_encoding test for input with unicode escapes +-- Numbers. +SELECT '1'::jsonb; -- OK + jsonb +------- + 1 +(1 row) + +SELECT '0'::jsonb; -- OK + jsonb +------- + 0 +(1 row) + +SELECT '01'::jsonb; -- ERROR, not valid according to JSON spec +ERROR: invalid input syntax for type json +LINE 1: SELECT '01'::jsonb; + ^ +DETAIL: Token "01" is invalid. +CONTEXT: JSON data, line 1: 01 +SELECT '0.1'::jsonb; -- OK + jsonb +------- + 0.1 +(1 row) + +SELECT '9223372036854775808'::jsonb; -- OK, even though it's too large for int8 + jsonb +--------------------- + 9223372036854775808 +(1 row) + +SELECT '1e100'::jsonb; -- OK + jsonb +------------------------------------------------------------------------------------------------------- + 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +(1 row) + +SELECT '1.3e100'::jsonb; -- OK + jsonb +------------------------------------------------------------------------------------------------------- + 13000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +(1 row) + +SELECT '1f2'::jsonb; -- ERROR +ERROR: invalid input syntax for type json +LINE 1: SELECT '1f2'::jsonb; + ^ +DETAIL: Token "1f2" is invalid. +CONTEXT: JSON data, line 1: 1f2 +SELECT '0.x1'::jsonb; -- ERROR +ERROR: invalid input syntax for type json +LINE 1: SELECT '0.x1'::jsonb; + ^ +DETAIL: Token "0.x1" is invalid. +CONTEXT: JSON data, line 1: 0.x1 +SELECT '1.3ex100'::jsonb; -- ERROR +ERROR: invalid input syntax for type json +LINE 1: SELECT '1.3ex100'::jsonb; + ^ +DETAIL: Token "1.3ex100" is invalid. +CONTEXT: JSON data, line 1: 1.3ex100 +-- Arrays. +SELECT '[]'::jsonb; -- OK + jsonb +------- + [] +(1 row) + +SELECT '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'::jsonb; -- OK + jsonb +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] +(1 row) + +SELECT '[1,2]'::jsonb; -- OK + jsonb +-------- + [1, 2] +(1 row) + +SELECT '[1,2,]'::jsonb; -- ERROR, trailing comma +ERROR: invalid input syntax for type json +LINE 1: SELECT '[1,2,]'::jsonb; + ^ +DETAIL: Expected JSON value, but found "]". +CONTEXT: JSON data, line 1: [1,2,] +SELECT '[1,2'::jsonb; -- ERROR, no closing bracket +ERROR: invalid input syntax for type json +LINE 1: SELECT '[1,2'::jsonb; + ^ +DETAIL: The input string ended unexpectedly. +CONTEXT: JSON data, line 1: [1,2 +SELECT '[1,[2]'::jsonb; -- ERROR, no closing bracket +ERROR: invalid input syntax for type json +LINE 1: SELECT '[1,[2]'::jsonb; + ^ +DETAIL: The input string ended unexpectedly. +CONTEXT: JSON data, line 1: [1,[2] +-- Objects. +SELECT '{}'::jsonb; -- OK + jsonb +------- + {} +(1 row) + +SELECT '{"abc"}'::jsonb; -- ERROR, no value +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc"}'::jsonb; + ^ +DETAIL: Expected ":", but found "}". +CONTEXT: JSON data, line 1: {"abc"} +SELECT '{"abc":1}'::jsonb; -- OK + jsonb +------------ + {"abc": 1} +(1 row) + +SELECT '{1:"abc"}'::jsonb; -- ERROR, keys must be strings +ERROR: invalid input syntax for type json +LINE 1: SELECT '{1:"abc"}'::jsonb; + ^ +DETAIL: Expected string or "}", but found "1". +CONTEXT: JSON data, line 1: {1... +SELECT '{"abc",1}'::jsonb; -- ERROR, wrong separator +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc",1}'::jsonb; + ^ +DETAIL: Expected ":", but found ",". +CONTEXT: JSON data, line 1: {"abc",... +SELECT '{"abc"=1}'::jsonb; -- ERROR, totally wrong separator +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc"=1}'::jsonb; + ^ +DETAIL: Token "=" is invalid. +CONTEXT: JSON data, line 1: {"abc"=... +SELECT '{"abc"::1}'::jsonb; -- ERROR, another wrong separator +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc"::1}'::jsonb; + ^ +DETAIL: Expected JSON value, but found ":". +CONTEXT: JSON data, line 1: {"abc"::... +SELECT '{"abc":1,"def":2,"ghi":[3,4],"hij":{"klm":5,"nop":[6]}}'::jsonb; -- OK + jsonb +-------------------------------------------------------------------- + {"abc": 1, "def": 2, "ghi": [3, 4], "hij": {"klm": 5, "nop": [6]}} +(1 row) + +SELECT '{"abc":1:2}'::jsonb; -- ERROR, colon in wrong spot +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc":1:2}'::jsonb; + ^ +DETAIL: Expected "," or "}", but found ":". +CONTEXT: JSON data, line 1: {"abc":1:... +SELECT '{"abc":1,3}'::jsonb; -- ERROR, no value +ERROR: invalid input syntax for type json +LINE 1: SELECT '{"abc":1,3}'::jsonb; + ^ +DETAIL: Expected string, but found "3". +CONTEXT: JSON data, line 1: {"abc":1,3... +-- Recursion. +SET max_stack_depth = '100kB'; +SELECT repeat('[', 10000)::jsonb; +ERROR: stack depth limit exceeded +HINT: Increase the configuration parameter "max_stack_depth" (currently 100kB), after ensuring the platform's stack depth limit is adequate. +SELECT repeat('{"a":', 10000)::jsonb; +ERROR: stack depth limit exceeded +HINT: Increase the configuration parameter "max_stack_depth" (currently 100kB), after ensuring the platform's stack depth limit is adequate. +RESET max_stack_depth; +-- Miscellaneous stuff. +SELECT 'true'::jsonb; -- OK + jsonb +------- + true +(1 row) + +SELECT 'false'::jsonb; -- OK + jsonb +------- + false +(1 row) + +SELECT 'null'::jsonb; -- OK + jsonb +------- + null +(1 row) + +SELECT ' true '::jsonb; -- OK, even with extra whitespace + jsonb +------- + true +(1 row) + +SELECT 'true false'::jsonb; -- ERROR, too many values +ERROR: invalid input syntax for type json +LINE 1: SELECT 'true false'::jsonb; + ^ +DETAIL: Expected end of input, but found "false". +CONTEXT: JSON data, line 1: true false +SELECT 'true, false'::jsonb; -- ERROR, too many values +ERROR: invalid input syntax for type json +LINE 1: SELECT 'true, false'::jsonb; + ^ +DETAIL: Expected end of input, but found ",". +CONTEXT: JSON data, line 1: true,... +SELECT 'truf'::jsonb; -- ERROR, not a keyword +ERROR: invalid input syntax for type json +LINE 1: SELECT 'truf'::jsonb; + ^ +DETAIL: Token "truf" is invalid. +CONTEXT: JSON data, line 1: truf +SELECT 'trues'::jsonb; -- ERROR, not a keyword +ERROR: invalid input syntax for type json +LINE 1: SELECT 'trues'::jsonb; + ^ +DETAIL: Token "trues" is invalid. +CONTEXT: JSON data, line 1: trues +SELECT ''::jsonb; -- ERROR, no value +ERROR: invalid input syntax for type json +LINE 1: SELECT ''::jsonb; + ^ +DETAIL: The input string ended unexpectedly. +CONTEXT: JSON data, line 1: +SELECT ' '::jsonb; -- ERROR, no value +ERROR: invalid input syntax for type json +LINE 1: SELECT ' '::jsonb; + ^ +DETAIL: The input string ended unexpectedly. +CONTEXT: JSON data, line 1: +-- Multi-line JSON input to check ERROR reporting +SELECT '{ + "one": 1, + "two":"two", + "three": + true}'::jsonb; -- OK + jsonb +----------------------------------------- + {"one": 1, "two": "two", "three": true} +(1 row) + +SELECT '{ + "one": 1, + "two":,"two", -- ERROR extraneous comma before field "two" + "three": + true}'::jsonb; +ERROR: invalid input syntax for type json +LINE 1: SELECT '{ + ^ +DETAIL: Expected JSON value, but found ",". +CONTEXT: JSON data, line 3: "two":,... +SELECT '{ + "one": 1, + "two":"two", + "averyveryveryveryveryveryveryveryveryverylongfieldname":}'::jsonb; +ERROR: invalid input syntax for type json +LINE 1: SELECT '{ + ^ +DETAIL: Expected JSON value, but found "}". +CONTEXT: JSON data, line 4: ...yveryveryveryveryveryveryveryverylongfieldname":} +-- ERROR missing value for last field +-- make sure jsonb is passed through json generators without being escaped +SELECT array_to_json(ARRAY [jsonb '{"a":1}', jsonb '{"b":[2,3]}']); + array_to_json +-------------------------- + [{"a": 1},{"b": [2, 3]}] +(1 row) + +-- anyarray column +CREATE TEMP TABLE rows AS +SELECT x, 'txt' || x as y +FROM generate_series(1,3) AS x; +analyze rows; +select attname, to_jsonb(histogram_bounds) histogram_bounds +from pg_stats +where tablename = 'rows' and + schemaname = pg_my_temp_schema()::regnamespace::text +order by 1; + attname | histogram_bounds +---------+-------------------------- + x | [1, 2, 3] + y | ["txt1", "txt2", "txt3"] +(2 rows) + +-- to_jsonb, timestamps +select to_jsonb(timestamp '2014-05-28 12:22:35.614298'); + to_jsonb +------------------------------ + "2014-05-28T12:22:35.614298" +(1 row) + +BEGIN; +SET LOCAL TIME ZONE 10.5; +select to_jsonb(timestamptz '2014-05-28 12:22:35.614298-04'); + to_jsonb +------------------------------------ + "2014-05-29T02:52:35.614298+10:30" +(1 row) + +SET LOCAL TIME ZONE -8; +select to_jsonb(timestamptz '2014-05-28 12:22:35.614298-04'); + to_jsonb +------------------------------------ + "2014-05-28T08:22:35.614298-08:00" +(1 row) + +COMMIT; +select to_jsonb(date '2014-05-28'); + to_jsonb +-------------- + "2014-05-28" +(1 row) + +select to_jsonb(date 'Infinity'); + to_jsonb +------------ + "infinity" +(1 row) + +select to_jsonb(date '-Infinity'); + to_jsonb +------------- + "-infinity" +(1 row) + +select to_jsonb(timestamp 'Infinity'); + to_jsonb +------------ + "infinity" +(1 row) + +select to_jsonb(timestamp '-Infinity'); + to_jsonb +------------- + "-infinity" +(1 row) + +select to_jsonb(timestamptz 'Infinity'); + to_jsonb +------------ + "infinity" +(1 row) + +select to_jsonb(timestamptz '-Infinity'); + to_jsonb +------------- + "-infinity" +(1 row) + +--jsonb_agg +SELECT jsonb_agg(q) + FROM ( SELECT $$a$$ || x AS b, y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + jsonb_agg +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [{"b": "a1", "c": 4, "z": [{"f1": 1, "f2": [1, 2, 3]}, {"f1": 4, "f2": [4, 5, 6]}]}, {"b": "a1", "c": 5, "z": [{"f1": 1, "f2": [1, 2, 3]}, {"f1": 5, "f2": [4, 5, 6]}]}, {"b": "a2", "c": 4, "z": [{"f1": 2, "f2": [1, 2, 3]}, {"f1": 4, "f2": [4, 5, 6]}]}, {"b": "a2", "c": 5, "z": [{"f1": 2, "f2": [1, 2, 3]}, {"f1": 5, "f2": [4, 5, 6]}]}] +(1 row) + +SELECT jsonb_agg(q ORDER BY x, y) + FROM rows q; + jsonb_agg +----------------------------------------------------------------------- + [{"x": 1, "y": "txt1"}, {"x": 2, "y": "txt2"}, {"x": 3, "y": "txt3"}] +(1 row) + +UPDATE rows SET x = NULL WHERE x = 1; +SELECT jsonb_agg(q ORDER BY x NULLS FIRST, y) + FROM rows q; + jsonb_agg +-------------------------------------------------------------------------- + [{"x": null, "y": "txt1"}, {"x": 2, "y": "txt2"}, {"x": 3, "y": "txt3"}] +(1 row) + +-- jsonb extraction functions +CREATE TEMP TABLE test_jsonb ( + json_type text, + test_json jsonb +); +INSERT INTO test_jsonb VALUES +('scalar','"a scalar"'), +('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'), +('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}'); +SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'scalar'; + ?column? +---------- + +(1 row) + +SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'array'; + ?column? +---------- + +(1 row) + +SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'object'; + ?column? +---------- + +(1 row) + +SELECT test_json -> 'field2' FROM test_jsonb WHERE json_type = 'object'; + ?column? +---------- + "val2" +(1 row) + +SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'scalar'; + ?column? +---------- + +(1 row) + +SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'array'; + ?column? +---------- + +(1 row) + +SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'object'; + ?column? +---------- + val2 +(1 row) + +SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'scalar'; + ?column? +---------- + +(1 row) + +SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'array'; + ?column? +---------- + "two" +(1 row) + +SELECT test_json -> 9 FROM test_jsonb WHERE json_type = 'array'; + ?column? +---------- + +(1 row) + +SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'object'; + ?column? +---------- + +(1 row) + +SELECT test_json ->> 6 FROM test_jsonb WHERE json_type = 'array'; + ?column? +----------- + [1, 2, 3] +(1 row) + +SELECT test_json ->> 7 FROM test_jsonb WHERE json_type = 'array'; + ?column? +----------- + {"f1": 9} +(1 row) + +SELECT test_json ->> 'field4' FROM test_jsonb WHERE json_type = 'object'; + ?column? +---------- + 4 +(1 row) + +SELECT test_json ->> 'field5' FROM test_jsonb WHERE json_type = 'object'; + ?column? +----------- + [1, 2, 3] +(1 row) + +SELECT test_json ->> 'field6' FROM test_jsonb WHERE json_type = 'object'; + ?column? +----------- + {"f1": 9} +(1 row) + +SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'scalar'; + ?column? +---------- + +(1 row) + +SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'array'; + ?column? +---------- + two +(1 row) + +SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'object'; + ?column? +---------- + +(1 row) + +SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'scalar'; +ERROR: cannot call jsonb_object_keys on a scalar +SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'array'; +ERROR: cannot call jsonb_object_keys on an array +SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'object'; + jsonb_object_keys +------------------- + field1 + field2 + field3 + field4 + field5 + field6 +(6 rows) + +-- nulls +SELECT (test_json->'field3') IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'object'; + expect_false +-------------- + f +(1 row) + +SELECT (test_json->>'field3') IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'object'; + expect_true +------------- + t +(1 row) + +SELECT (test_json->3) IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'array'; + expect_false +-------------- + f +(1 row) + +SELECT (test_json->>3) IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'array'; + expect_true +------------- + t +(1 row) + +-- corner cases +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::text; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::int; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> ''; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 1; + ?column? +------------- + {"b": "cc"} +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 3; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": "c", "b": null}'::jsonb -> 'b'; + ?column? +---------- + null +(1 row) + +select '"foo"'::jsonb -> 1; + ?column? +---------- + +(1 row) + +select '"foo"'::jsonb -> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::text; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::int; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 1; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> ''; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 1; + ?column? +------------- + {"b": "cc"} +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 3; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 'z'; + ?column? +---------- + +(1 row) + +select '{"a": "c", "b": null}'::jsonb ->> 'b'; + ?column? +---------- + +(1 row) + +select '"foo"'::jsonb ->> 1; + ?column? +---------- + +(1 row) + +select '"foo"'::jsonb ->> 'z'; + ?column? +---------- + +(1 row) + +-- equality and inequality +SELECT '{"x":"y"}'::jsonb = '{"x":"y"}'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '{"x":"y"}'::jsonb = '{"x":"z"}'::jsonb; + ?column? +---------- + f +(1 row) + +SELECT '{"x":"y"}'::jsonb <> '{"x":"y"}'::jsonb; + ?column? +---------- + f +(1 row) + +SELECT '{"x":"y"}'::jsonb <> '{"x":"z"}'::jsonb; + ?column? +---------- + t +(1 row) + +-- containment +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); + jsonb_contains +---------------- + t +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":null}'); + jsonb_contains +---------------- + t +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "g":null}'); + jsonb_contains +---------------- + f +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"g":null}'); + jsonb_contains +---------------- + f +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"c"}'); + jsonb_contains +---------------- + f +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); + jsonb_contains +---------------- + t +(1 row) + +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":"q"}'); + jsonb_contains +---------------- + f +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":null}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "g":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"g":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"c"}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":"q"}'; + ?column? +---------- + f +(1 row) + +SELECT '[1,2]'::jsonb @> '[1,2,2]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[1,1,2]'::jsonb @> '[1,2,2]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[[1,2]]'::jsonb @> '[[1,2,2]]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,2]'::jsonb <@ '[1,2]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,2]'::jsonb <@ '[1,1,2]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '[[1,2,2]]'::jsonb <@ '[[1,2]]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + t +(1 row) + +SELECT jsonb_contained('{"a":"b", "c":null}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + t +(1 row) + +SELECT jsonb_contained('{"a":"b", "g":null}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + f +(1 row) + +SELECT jsonb_contained('{"g":null}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + f +(1 row) + +SELECT jsonb_contained('{"a":"c"}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + f +(1 row) + +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + t +(1 row) + +SELECT jsonb_contained('{"a":"b", "c":"q"}', '{"a":"b", "b":1, "c":null}'); + jsonb_contained +----------------- + f +(1 row) + +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "c":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"c"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":"b", "c":"q"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; + ?column? +---------- + f +(1 row) + +-- Raw scalar may contain another raw scalar, array may contain a raw scalar +SELECT '[5]'::jsonb @> '[5]'; + ?column? +---------- + t +(1 row) + +SELECT '5'::jsonb @> '5'; + ?column? +---------- + t +(1 row) + +SELECT '[5]'::jsonb @> '5'; + ?column? +---------- + t +(1 row) + +-- But a raw scalar cannot contain an array +SELECT '5'::jsonb @> '[5]'; + ?column? +---------- + f +(1 row) + +-- In general, one thing should always contain itself. Test array containment: +SELECT '["9", ["7", "3"], 1]'::jsonb @> '["9", ["7", "3"], 1]'::jsonb; + ?column? +---------- + t +(1 row) + +SELECT '["9", ["7", "3"], ["1"]]'::jsonb @> '["9", ["7", "3"], ["1"]]'::jsonb; + ?column? +---------- + t +(1 row) + +-- array containment string matching confusion bug +SELECT '{ "name": "Bob", "tags": [ "enim", "qui"]}'::jsonb @> '{"tags":["qu"]}'; + ?column? +---------- + f +(1 row) + +-- array length +SELECT jsonb_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); + jsonb_array_length +-------------------- + 5 +(1 row) + +SELECT jsonb_array_length('[]'); + jsonb_array_length +-------------------- + 0 +(1 row) + +SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'); +ERROR: cannot get array length of a non-array +SELECT jsonb_array_length('4'); +ERROR: cannot get array length of a scalar +-- each +SELECT jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); + jsonb_each +-------------------- + (f1,"[1, 2, 3]") + (f2,"{""f3"": 1}") + (f4,null) +(3 rows) + +SELECT jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + q +------------------------------------------------------ + (1,"""first""") + (a,"{""1"": ""first"", ""b"": ""c"", ""c"": ""b""}") + (b,"[1, 2]") + (c,"""cc""") + (n,null) +(5 rows) + +SELECT * FROM jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + key | value +-----+----------- + f1 | [1, 2, 3] + f2 | {"f3": 1} + f4 | null + f5 | 99 + f6 | "stringy" +(5 rows) + +SELECT * FROM jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + key | value +-----+------------------------------------ + 1 | "first" + a | {"1": "first", "b": "c", "c": "b"} + b | [1, 2] + c | "cc" + n | null +(5 rows) + +SELECT jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}'); + jsonb_each_text +-------------------- + (f1,"[1, 2, 3]") + (f2,"{""f3"": 1}") + (f4,) + (f5,null) +(4 rows) + +SELECT jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + q +------------------------------------------------------ + (1,first) + (a,"{""1"": ""first"", ""b"": ""c"", ""c"": ""b""}") + (b,"[1, 2]") + (c,cc) + (n,) +(5 rows) + +SELECT * FROM jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + key | value +-----+----------- + f1 | [1, 2, 3] + f2 | {"f3": 1} + f4 | + f5 | 99 + f6 | stringy +(5 rows) + +SELECT * FROM jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + key | value +-----+------------------------------------ + 1 | first + a | {"1": "first", "b": "c", "c": "b"} + b | [1, 2] + c | cc + n | +(5 rows) + +-- exists +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'a'); + jsonb_exists +-------------- + t +(1 row) + +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'b'); + jsonb_exists +-------------- + t +(1 row) + +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'c'); + jsonb_exists +-------------- + f +(1 row) + +SELECT jsonb_exists('{"a":"null", "b":"qq"}', 'a'); + jsonb_exists +-------------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ? 'a'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ? 'b'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ? 'c'; + ?column? +---------- + f +(1 row) + +SELECT jsonb '{"a":"null", "b":"qq"}' ? 'a'; + ?column? +---------- + t +(1 row) + +-- array exists - array elements should behave as keys +SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; + count +------- + 3 +(1 row) + +-- type sensitive array exists - should return no rows (since "exists" only +-- matches strings that are either object keys or array elements) +SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; + count +------- + 0 +(1 row) + +-- However, a raw scalar is *contained* within the array +SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; + count +------- + 1 +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['a','b']); + jsonb_exists_any +------------------ + t +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['b','a']); + jsonb_exists_any +------------------ + t +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','a']); + jsonb_exists_any +------------------ + t +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','d']); + jsonb_exists_any +------------------ + f +(1 row) + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', '{}'::text[]); + jsonb_exists_any +------------------ + f +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['a','b']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['b','a']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','a']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','d']; + ?column? +---------- + f +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?| '{}'::text[]; + ?column? +---------- + f +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['a','b']); + jsonb_exists_all +------------------ + t +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['b','a']); + jsonb_exists_all +------------------ + t +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','a']); + jsonb_exists_all +------------------ + f +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','d']); + jsonb_exists_all +------------------ + f +(1 row) + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', '{}'::text[]); + jsonb_exists_all +------------------ + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','b']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['b','a']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','a']; + ?column? +---------- + f +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','d']; + ?column? +---------- + f +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','a', 'b', 'b', 'b']; + ?column? +---------- + t +(1 row) + +SELECT jsonb '{"a":null, "b":"qq"}' ?& '{}'::text[]; + ?column? +---------- + t +(1 row) + +-- typeof +SELECT jsonb_typeof('{}') AS object; + object +-------- + object +(1 row) + +SELECT jsonb_typeof('{"c":3,"p":"o"}') AS object; + object +-------- + object +(1 row) + +SELECT jsonb_typeof('[]') AS array; + array +------- + array +(1 row) + +SELECT jsonb_typeof('["a", 1]') AS array; + array +------- + array +(1 row) + +SELECT jsonb_typeof('null') AS "null"; + null +------ + null +(1 row) + +SELECT jsonb_typeof('1') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('-1') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('1.0') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('1e2') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('-1.0') AS number; + number +-------- + number +(1 row) + +SELECT jsonb_typeof('true') AS boolean; + boolean +--------- + boolean +(1 row) + +SELECT jsonb_typeof('false') AS boolean; + boolean +--------- + boolean +(1 row) + +SELECT jsonb_typeof('"hello"') AS string; + string +-------- + string +(1 row) + +SELECT jsonb_typeof('"true"') AS string; + string +-------- + string +(1 row) + +SELECT jsonb_typeof('"1.0"') AS string; + string +-------- + string +(1 row) + +-- jsonb_build_array, jsonb_build_object, jsonb_object_agg +SELECT jsonb_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + jsonb_build_array +------------------------------------------------------------------------- + ["a", 1, "b", 1.2, "c", true, "d", null, "e", {"x": 3, "y": [1, 2, 3]}] +(1 row) + +SELECT jsonb_build_array('a', NULL); -- ok + jsonb_build_array +------------------- + ["a", null] +(1 row) + +SELECT jsonb_build_array(VARIADIC NULL::text[]); -- ok + jsonb_build_array +------------------- + +(1 row) + +SELECT jsonb_build_array(VARIADIC '{}'::text[]); -- ok + jsonb_build_array +------------------- + [] +(1 row) + +SELECT jsonb_build_array(VARIADIC '{a,b,c}'::text[]); -- ok + jsonb_build_array +------------------- + ["a", "b", "c"] +(1 row) + +SELECT jsonb_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok + jsonb_build_array +------------------- + ["a", null] +(1 row) + +SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok + jsonb_build_array +---------------------- + ["1", "2", "3", "4"] +(1 row) + +SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok + jsonb_build_array +------------------- + [1, 2, 3, 4] +(1 row) + +SELECT jsonb_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + jsonb_build_array +-------------------- + [1, 4, 2, 5, 3, 6] +(1 row) + +SELECT jsonb_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + jsonb_build_object +------------------------------------------------------------------------- + {"a": 1, "b": 1.2, "c": true, "d": null, "e": {"x": 3, "y": [1, 2, 3]}} +(1 row) + +SELECT jsonb_build_object( + 'a', jsonb_build_object('b',false,'c',99), + 'd', jsonb_build_object('e',array[9,8,7]::int[], + 'f', (select row_to_json(r) from ( select relkind, oid::regclass as name from pg_class where relname = 'pg_class') r))); + jsonb_build_object +------------------------------------------------------------------------------------------------ + {"a": {"b": false, "c": 99}, "d": {"e": [9, 8, 7], "f": {"name": "pg_class", "relkind": "r"}}} +(1 row) + +SELECT jsonb_build_object('{a,b,c}'::text[]); -- error +ERROR: argument list must have even number of elements +HINT: The arguments of jsonb_build_object() must consist of alternating keys and values. +SELECT jsonb_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array +ERROR: key value must be scalar, not array, composite, or json +SELECT jsonb_build_object('a', 'b', 'c'); -- error +ERROR: argument list must have even number of elements +HINT: The arguments of jsonb_build_object() must consist of alternating keys and values. +SELECT jsonb_build_object(NULL, 'a'); -- error, key cannot be NULL +ERROR: argument 1: key must not be null +SELECT jsonb_build_object('a', NULL); -- ok + jsonb_build_object +-------------------- + {"a": null} +(1 row) + +SELECT jsonb_build_object(VARIADIC NULL::text[]); -- ok + jsonb_build_object +-------------------- + +(1 row) + +SELECT jsonb_build_object(VARIADIC '{}'::text[]); -- ok + jsonb_build_object +-------------------- + {} +(1 row) + +SELECT jsonb_build_object(VARIADIC '{a,b,c}'::text[]); -- error +ERROR: argument list must have even number of elements +HINT: The arguments of jsonb_build_object() must consist of alternating keys and values. +SELECT jsonb_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok + jsonb_build_object +-------------------- + {"a": null} +(1 row) + +SELECT jsonb_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL +ERROR: argument 1: key must not be null +SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok + jsonb_build_object +---------------------- + {"1": "2", "3": "4"} +(1 row) + +SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok + jsonb_build_object +-------------------- + {"1": 2, "3": 4} +(1 row) + +SELECT jsonb_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + jsonb_build_object +-------------------------- + {"1": 4, "2": 5, "3": 6} +(1 row) + +-- empty objects/arrays +SELECT jsonb_build_array(); + jsonb_build_array +------------------- + [] +(1 row) + +SELECT jsonb_build_object(); + jsonb_build_object +-------------------- + {} +(1 row) + +-- make sure keys are quoted +SELECT jsonb_build_object(1,2); + jsonb_build_object +-------------------- + {"1": 2} +(1 row) + +-- keys must be scalar and not null +SELECT jsonb_build_object(null,2); +ERROR: argument 1: key must not be null +SELECT jsonb_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; +ERROR: key value must be scalar, not array, composite, or json +SELECT jsonb_build_object(json '{"a":1,"b":2}', 3); +ERROR: key value must be scalar, not array, composite, or json +SELECT jsonb_build_object('{1,2,3}'::int[], 3); +ERROR: key value must be scalar, not array, composite, or json +-- handling of NULL values +SELECT jsonb_object_agg(1, NULL::jsonb); + jsonb_object_agg +------------------ + {"1": null} +(1 row) + +SELECT jsonb_object_agg(NULL, '{"a":1}'); +ERROR: field name must not be null +CREATE TEMP TABLE foo (serial_num int, name text, type text); +INSERT INTO foo VALUES (847001,'t15','GE1043'); +INSERT INTO foo VALUES (847002,'t16','GE1043'); +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); +SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type))) +FROM foo; + jsonb_build_object +------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"turbines": {"847001": {"name": "t15", "type": "GE1043"}, "847002": {"name": "t16", "type": "GE1043"}, "847003": {"name": "sub-alpha", "type": "GESS90"}}} +(1 row) + +SELECT jsonb_object_agg(name, type) FROM foo; + jsonb_object_agg +----------------------------------------------------------- + {"t15": "GE1043", "t16": "GE1043", "sub-alpha": "GESS90"} +(1 row) + +INSERT INTO foo VALUES (999999, NULL, 'bar'); +SELECT jsonb_object_agg(name, type) FROM foo; +ERROR: field name must not be null +-- jsonb_object +-- empty object, one dimension +SELECT jsonb_object('{}'); + jsonb_object +-------------- + {} +(1 row) + +-- empty object, two dimensions +SELECT jsonb_object('{}', '{}'); + jsonb_object +-------------- + {} +(1 row) + +-- one dimension +SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); + jsonb_object +--------------------------------------------------- + {"3": null, "a": "1", "b": "2", "d e f": "a b c"} +(1 row) + +-- same but with two dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); + jsonb_object +--------------------------------------------------- + {"3": null, "a": "1", "b": "2", "d e f": "a b c"} +(1 row) + +-- odd number error +SELECT jsonb_object('{a,b,c}'); +ERROR: array must have even number of elements +-- one column error +SELECT jsonb_object('{{a},{b}}'); +ERROR: array must have two columns +-- too many columns error +SELECT jsonb_object('{{a,b,c},{b,c,d}}'); +ERROR: array must have two columns +-- too many dimensions error +SELECT jsonb_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); +ERROR: wrong number of array subscripts +--two argument form of jsonb_object +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); + jsonb_object +-------------------------------------------------- + {"a": "1", "b": "2", "c": "3", "d e f": "a b c"} +(1 row) + +-- too many dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); +ERROR: wrong number of array subscripts +-- mismatched dimensions +select jsonb_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); +ERROR: mismatched array dimensions +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); +ERROR: mismatched array dimensions +-- null key error +select jsonb_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); +ERROR: null value not allowed for object key +-- empty key is allowed +select jsonb_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); + jsonb_object +------------------------------------------------- + {"": "3", "a": "1", "b": "2", "d e f": "a b c"} +(1 row) + +-- extract_path, extract_path_as_text +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + jsonb_extract_path +-------------------- + "stringy" +(1 row) + +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + jsonb_extract_path +-------------------- + {"f3": 1} +(1 row) + +SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + jsonb_extract_path +-------------------- + "f3" +(1 row) + +SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + jsonb_extract_path +-------------------- + 1 +(1 row) + +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); + jsonb_extract_path_text +------------------------- + stringy +(1 row) + +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); + jsonb_extract_path_text +------------------------- + {"f3": 1} +(1 row) + +SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); + jsonb_extract_path_text +------------------------- + f3 +(1 row) + +SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + jsonb_extract_path_text +------------------------- + 1 +(1 row) + +-- extract_path nulls +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_false; + expect_false +-------------- + f +(1 row) + +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_true; + expect_true +------------- + t +(1 row) + +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_false; + expect_false +-------------- + f +(1 row) + +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_true; + expect_true +------------- + t +(1 row) + +-- extract_path operators +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f4','f6']; + ?column? +----------- + "stringy" +(1 row) + +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2']; + ?column? +----------- + {"f3": 1} +(1 row) + +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','0']; + ?column? +---------- + "f3" +(1 row) + +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','1']; + ?column? +---------- + 1 +(1 row) + +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f4','f6']; + ?column? +---------- + stringy +(1 row) + +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2']; + ?column? +----------- + {"f3": 1} +(1 row) + +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','0']; + ?column? +---------- + f3 +(1 row) + +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','1']; + ?column? +---------- + 1 +(1 row) + +-- corner cases for same +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> '{}'; + ?column? +---------------------------- + {"a": {"b": {"c": "foo"}}} +(1 row) + +select '[1,2,3]'::jsonb #> '{}'; + ?column? +----------- + [1, 2, 3] +(1 row) + +select '"foo"'::jsonb #> '{}'; + ?column? +---------- + "foo" +(1 row) + +select '42'::jsonb #> '{}'; + ?column? +---------- + 42 +(1 row) + +select 'null'::jsonb #> '{}'; + ?column? +---------- + null +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a']; + ?column? +--------------------- + {"b": {"c": "foo"}} +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', null]; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', '']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b']; + ?column? +-------------- + {"c": "foo"} +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c']; + ?column? +---------- + "foo" +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c','d']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','z','c']; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','1','b']; + ?column? +---------- + "cc" +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','z','b']; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['1','b']; + ?column? +---------- + "cc" +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['z','b']; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": null}]'::jsonb #> array['1','b']; + ?column? +---------- + null +(1 row) + +select '"foo"'::jsonb #> array['z']; + ?column? +---------- + +(1 row) + +select '42'::jsonb #> array['f2']; + ?column? +---------- + +(1 row) + +select '42'::jsonb #> array['0']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> '{}'; + ?column? +---------------------------- + {"a": {"b": {"c": "foo"}}} +(1 row) + +select '[1,2,3]'::jsonb #>> '{}'; + ?column? +----------- + [1, 2, 3] +(1 row) + +select '"foo"'::jsonb #>> '{}'; + ?column? +---------- + foo +(1 row) + +select '42'::jsonb #>> '{}'; + ?column? +---------- + 42 +(1 row) + +select 'null'::jsonb #>> '{}'; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a']; + ?column? +--------------------- + {"b": {"c": "foo"}} +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', null]; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', '']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b']; + ?column? +-------------- + {"c": "foo"} +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c']; + ?column? +---------- + foo +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c','d']; + ?column? +---------- + +(1 row) + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','z','c']; + ?column? +---------- + +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','1','b']; + ?column? +---------- + cc +(1 row) + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','z','b']; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['1','b']; + ?column? +---------- + cc +(1 row) + +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['z','b']; + ?column? +---------- + +(1 row) + +select '[{"b": "c"}, {"b": null}]'::jsonb #>> array['1','b']; + ?column? +---------- + +(1 row) + +select '"foo"'::jsonb #>> array['z']; + ?column? +---------- + +(1 row) + +select '42'::jsonb #>> array['f2']; + ?column? +---------- + +(1 row) + +select '42'::jsonb #>> array['0']; + ?column? +---------- + +(1 row) + +-- array_elements +SELECT jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]'); + jsonb_array_elements +---------------------------- + 1 + true + [1, [2, 3]] + null + {"f1": 1, "f2": [7, 8, 9]} + false +(6 rows) + +SELECT * FROM jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]') q; + value +---------------------------- + 1 + true + [1, [2, 3]] + null + {"f1": 1, "f2": [7, 8, 9]} + false +(6 rows) + +SELECT jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); + jsonb_array_elements_text +---------------------------- + 1 + true + [1, [2, 3]] + + {"f1": 1, "f2": [7, 8, 9]} + false + stringy +(7 rows) + +SELECT * FROM jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; + value +---------------------------- + 1 + true + [1, [2, 3]] + + {"f1": 1, "f2": [7, 8, 9]} + false + stringy +(7 rows) + +-- populate_record +CREATE TYPE jbpop AS (a text, b int, c timestamp); +CREATE DOMAIN jsb_int_not_null AS int NOT NULL; +CREATE DOMAIN jsb_int_array_1d AS int[] CHECK(array_length(VALUE, 1) = 3); +CREATE DOMAIN jsb_int_array_2d AS int[][] CHECK(array_length(VALUE, 2) = 3); +create type jb_unordered_pair as (x int, y int); +create domain jb_ordered_pair as jb_unordered_pair check((value).x <= (value).y); +CREATE TYPE jsbrec AS ( + i int, + ia _int4, + ia1 int[], + ia2 int[][], + ia3 int[][][], + ia1d jsb_int_array_1d, + ia2d jsb_int_array_2d, + t text, + ta text[], + c char(10), + ca char(10)[], + ts timestamp, + js json, + jsb jsonb, + jsa json[], + rec jbpop, + reca jbpop[] +); +CREATE TYPE jsbrec_i_not_null AS ( + i jsb_int_not_null +); +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q; + a | b | c +--------+---+--- + blurfl | | +(1 row) + +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q; + a | b | c +--------+---+-------------------------- + blurfl | 3 | Mon Dec 31 15:30:56 2012 +(1 row) + +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q; + a | b | c +--------+---+--- + blurfl | | +(1 row) + +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q; + a | b | c +--------+---+-------------------------- + blurfl | 3 | Mon Dec 31 15:30:56 2012 +(1 row) + +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":[100,200,false],"x":43.2}') q; + a | b | c +-------------------+---+--- + [100, 200, false] | | +(1 row) + +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":[100,200,false],"x":43.2}') q; + a | b | c +-------------------+---+-------------------------- + [100, 200, false] | 3 | Mon Dec 31 15:30:56 2012 +(1 row) + +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"c":[100,200,false],"x":43.2}') q; +ERROR: invalid input syntax for type timestamp: "[100, 200, false]" +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop, '{}') q; + a | b | c +---+---+-------------------------- + x | 3 | Mon Dec 31 15:30:56 2012 +(1 row) + +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"x": 43.2}') q; +ERROR: domain jsb_int_not_null does not allow null values +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": null}') q; +ERROR: domain jsb_int_not_null does not allow null values +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": 12345}') q; + i +------- + 12345 +(1 row) + +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": null}') q; + ia +---- + +(1 row) + +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ia". +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [1, "2", null, 4]}') q; + ia +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1, 2], [3, 4]]}') q; + ia +--------------- + {{1,2},{3,4}} +(1 row) + +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], 2]}') q; +ERROR: expected JSON array +HINT: See the array element [1] of key "ia". +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], [2, 3]]}') q; +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": "{1,2,3}"}') q; + ia +--------- + {1,2,3} +(1 row) + +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": null}') q; + ia1 +----- + +(1 row) + +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ia1". +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [1, "2", null, 4]}') q; + ia1 +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [[1, 2, 3]]}') q; + ia1 +----------- + {{1,2,3}} +(1 row) + +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": null}') q; + ia1d +------ + +(1 row) + +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ia1d". +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null, 4]}') q; +ERROR: value for domain jsb_int_array_1d violates check constraint "jsb_int_array_1d_check" +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null]}') q; + ia1d +------------ + {1,2,NULL} +(1 row) + +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [1, "2", null, 4]}') q; + ia2 +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [null, 4]]}') q; + ia2 +------------------ + {{1,2},{NULL,4}} +(1 row) + +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[], []]}') q; + ia2 +----- + {} +(1 row) + +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [3]]}') q; +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], 3, 4]}') q; +ERROR: expected JSON array +HINT: See the array element [1] of key "ia2". +SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2"], [null, 4]]}') q; +ERROR: value for domain jsb_int_array_2d violates check constraint "jsb_int_array_2d_check" +SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q; + ia2d +---------------------- + {{1,2,3},{NULL,5,6}} +(1 row) + +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [1, "2", null, 4]}') q; + ia3 +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [[1, 2], [null, 4]]}') q; + ia3 +------------------ + {{1,2},{NULL,4}} +(1 row) + +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q; + ia3 +----- + {} +(1 row) + +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q; + ia3 +------------------- + {{{1,2}},{{3,4}}} +(1 row) + +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q; + ia3 +------------------------------- + {{{1,2},{3,4}},{{5,6},{7,8}}} +(1 row) + +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q; +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": null}') q; + ta +---- + +(1 row) + +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ta". +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [1, "2", null, 4]}') q; + ta +-------------- + {1,2,NULL,4} +(1 row) + +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q; +ERROR: expected JSON array +HINT: See the array element [1] of key "ta". +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": null}') q; + c +--- + +(1 row) + +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaa"}') q; + c +------------ + aaa +(1 row) + +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaa"}') q; + c +------------ + aaaaaaaaaa +(1 row) + +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaaaaa"}') q; +ERROR: value too long for type character(10) +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": null}') q; + ca +---- + +(1 row) + +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "ca". +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [1, "2", null, 4]}') q; + ca +----------------------------------------------- + {"1 ","2 ",NULL,"4 "} +(1 row) + +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q; +ERROR: value too long for type character(10) +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q; +ERROR: expected JSON array +HINT: See the array element [1] of key "ca". +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": null}') q; + js +---- + +(1 row) + +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": true}') q; + js +------ + true +(1 row) + +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": 123.45}') q; + js +-------- + 123.45 +(1 row) + +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "123.45"}') q; + js +---------- + "123.45" +(1 row) + +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "abc"}') q; + js +------- + "abc" +(1 row) + +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": [123, "123", null, {"key": "value"}]}') q; + js +-------------------------------------- + [123, "123", null, {"key": "value"}] +(1 row) + +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q; + js +-------------------------------------- + {"a": "bbb", "b": null, "c": 123.45} +(1 row) + +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": null}') q; + jsb +----- + +(1 row) + +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": true}') q; + jsb +------ + true +(1 row) + +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": 123.45}') q; + jsb +-------- + 123.45 +(1 row) + +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "123.45"}') q; + jsb +---------- + "123.45" +(1 row) + +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "abc"}') q; + jsb +------- + "abc" +(1 row) + +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q; + jsb +-------------------------------------- + [123, "123", null, {"key": "value"}] +(1 row) + +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q; + jsb +-------------------------------------- + {"a": "bbb", "b": null, "c": 123.45} +(1 row) + +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": null}') q; + jsa +----- + +(1 row) + +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "jsa". +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": [1, "2", null, 4]}') q; + jsa +-------------------- + {1,"\"2\"",NULL,4} +(1 row) + +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q; + jsa +------------------------------------------------------- + {"\"aaa\"",NULL,"[1, 2, \"3\", {}]","{\"k\": \"v\"}"} +(1 row) + +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": 123}') q; +ERROR: cannot call populate_composite on a scalar +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": [1, 2]}') q; +ERROR: cannot call populate_composite on an array +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q; + rec +----------------------------------- + (abc,,"Thu Jan 02 00:00:00 2003") +(1 row) + +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": "(abc,42,01.02.2003)"}') q; + rec +------------------------------------- + (abc,42,"Thu Jan 02 00:00:00 2003") +(1 row) + +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": 123}') q; +ERROR: expected JSON array +HINT: See the value of key "reca". +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [1, 2]}') q; +ERROR: cannot call populate_composite on a scalar +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q; + reca +-------------------------------------------------------- + {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"} +(1 row) + +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": ["(abc,42,01.02.2003)"]}') q; + reca +------------------------------------------- + {"(abc,42,\"Thu Jan 02 00:00:00 2003\")"} +(1 row) + +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q; + reca +------------------------------------------- + {"(abc,42,\"Thu Jan 02 00:00:00 2003\")"} +(1 row) + +SELECT rec FROM jsonb_populate_record( + row(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + row('x',3,'2012-12-31 15:30:56')::jbpop,NULL)::jsbrec, + '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}' +) q; + rec +------------------------------------ + (abc,3,"Thu Jan 02 00:00:00 2003") +(1 row) + +-- anonymous record type +SELECT jsonb_populate_record(null::record, '{"x": 0, "y": 1}'); +ERROR: could not determine row type for result of jsonb_populate_record +HINT: Provide a non-null record argument, or call the function in the FROM clause using a column definition list. +SELECT jsonb_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); + jsonb_populate_record +----------------------- + (0,1) +(1 row) + +--start_ignore +--GPDB_13_MERGE_FIXME: Need to full support function evaluation in const eval of planner. +--end_ignore +SELECT * FROM + jsonb_populate_record(null::record, '{"x": 776}') AS (x int, y int); +ERROR: could not determine row type for result of jsonb_populate_record +HINT: Provide a non-null record argument, or call the function in the FROM clause using a column definition list. +-- composite domain +SELECT jsonb_populate_record(null::jb_ordered_pair, '{"x": 0, "y": 1}'); + jsonb_populate_record +----------------------- + (0,1) +(1 row) + +SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 0}'); + jsonb_populate_record +----------------------- + (0,2) +(1 row) + +SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 1, "y": 0}'); +ERROR: value for domain jb_ordered_pair violates check constraint "jb_ordered_pair_check" +-- populate_recordset +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+---+-------------------------- + blurfl | | + | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+----+-------------------------- + blurfl | 99 | + def | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+---+-------------------------- + blurfl | | + | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+----+-------------------------- + blurfl | 99 | + def | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +-----------------+----+-------------------------- + [100, 200, 300] | 99 | + {"z": true} | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +ERROR: invalid input syntax for type timestamp: "[100, 200, 300]" +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+---+-------------------------- + blurfl | | + | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +--------+----+-------------------------- + blurfl | 99 | + def | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + a | b | c +-----------------+----+-------------------------- + [100, 200, 300] | 99 | + {"z": true} | 3 | Fri Jan 20 10:42:53 2012 +(2 rows) + +-- anonymous record type +SELECT jsonb_populate_recordset(null::record, '[{"x": 0, "y": 1}]'); +ERROR: could not determine row type for result of jsonb_populate_recordset +HINT: Provide a non-null record argument, or call the function in the FROM clause using a column definition list. +SELECT jsonb_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]'); + jsonb_populate_recordset +-------------------------- + (0,1) +(1 row) + +SELECT i, jsonb_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]') +FROM (VALUES (1),(2)) v(i); + i | jsonb_populate_recordset +---+-------------------------- + 1 | (42,50) + 1 | (1,43) + 2 | (42,50) + 2 | (2,43) +(4 rows) + +SELECT * FROM + jsonb_populate_recordset(null::record, '[{"x": 776}]') AS (x int, y int); + x | y +-----+--- + 776 | +(1 row) + +-- empty array is a corner case +SELECT jsonb_populate_recordset(null::record, '[]'); +ERROR: could not determine row type for result of jsonb_populate_recordset +HINT: Provide a non-null record argument, or call the function in the FROM clause using a column definition list. +SELECT jsonb_populate_recordset(row(1,2), '[]'); + jsonb_populate_recordset +-------------------------- +(0 rows) + +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[]') q; + a | b | c +---+---+--- +(0 rows) + +SELECT * FROM + jsonb_populate_recordset(null::record, '[]') AS (x int, y int); + x | y +---+--- +(0 rows) + +-- composite domain +SELECT jsonb_populate_recordset(null::jb_ordered_pair, '[{"x": 0, "y": 1}]'); + jsonb_populate_recordset +-------------------------- + (0,1) +(1 row) + +SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 0}, {"y": 3}]'); + jsonb_populate_recordset +-------------------------- + (0,2) + (1,3) +(2 rows) + +SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 1, "y": 0}]'); +ERROR: value for domain jb_ordered_pair violates check constraint "jb_ordered_pair_check" +-- negative cases where the wrong record type is supplied +select * from jsonb_populate_recordset(row(0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +ERROR: function return row and query-specified return row do not match +DETAIL: Returned row contains 1 attribute, but query expects 2. +select * from jsonb_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +ERROR: function return row and query-specified return row do not match +DETAIL: Returned type integer at ordinal position 1, but query expects text. +select * from jsonb_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +ERROR: function return row and query-specified return row do not match +DETAIL: Returned row contains 3 attributes, but query expects 2. +select * from jsonb_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text); +ERROR: function return row and query-specified return row do not match +DETAIL: Returned type integer at ordinal position 1, but query expects text. +-- jsonb_to_record and jsonb_to_recordset +select * from jsonb_to_record('{"a":1,"b":"foo","c":"bar"}') + as x(a int, b text, d text); + a | b | d +---+-----+--- + 1 | foo | +(1 row) + +select * from jsonb_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') + as x(a int, b text, c boolean); + a | b | c +---+-----+--- + 1 | foo | + 2 | bar | t +(2 rows) + +select *, c is null as c_is_null +from jsonb_to_record('{"a":1, "b":{"c":16, "d":2}, "x":8, "ca": ["1 2", 3], "ia": [[1,2],[3,4]], "r": {"a": "aaa", "b": 123}}'::jsonb) + as t(a int, b jsonb, c text, x int, ca char(5)[], ia int[][], r jbpop); + a | b | c | x | ca | ia | r | c_is_null +---+-------------------+---+---+-------------------+---------------+------------+----------- + 1 | {"c": 16, "d": 2} | | 8 | {"1 2 ","3 "} | {{1,2},{3,4}} | (aaa,123,) | t +(1 row) + +select *, c is null as c_is_null +from jsonb_to_recordset('[{"a":1, "b":{"c":16, "d":2}, "x":8}]'::jsonb) + as t(a int, b jsonb, c text, x int); + a | b | c | x | c_is_null +---+-------------------+---+---+----------- + 1 | {"c": 16, "d": 2} | | 8 | t +(1 row) + +select * from jsonb_to_record('{"ia": null}') as x(ia _int4); + ia +---- + +(1 row) + +select * from jsonb_to_record('{"ia": 123}') as x(ia _int4); +ERROR: expected JSON array +HINT: See the value of key "ia". +select * from jsonb_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4); + ia +-------------- + {1,2,NULL,4} +(1 row) + +select * from jsonb_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4); + ia +--------------- + {{1,2},{3,4}} +(1 row) + +select * from jsonb_to_record('{"ia": [[1], 2]}') as x(ia _int4); +ERROR: expected JSON array +HINT: See the array element [1] of key "ia". +select * from jsonb_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4); +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select * from jsonb_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]); + ia2 +--------- + {1,2,3} +(1 row) + +select * from jsonb_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]); + ia2 +--------------- + {{1,2},{3,4}} +(1 row) + +select * from jsonb_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]); + ia2 +----------------- + {{{1},{2},{3}}} +(1 row) + +select * from jsonb_to_record('{"out": {"key": 1}}') as x(out json); + out +------------ + {"key": 1} +(1 row) + +select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out json); + out +-------------- + [{"key": 1}] +(1 row) + +select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out json); + out +---------------- + "{\"key\": 1}" +(1 row) + +select * from jsonb_to_record('{"out": {"key": 1}}') as x(out jsonb); + out +------------ + {"key": 1} +(1 row) + +select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out jsonb); + out +-------------- + [{"key": 1}] +(1 row) + +select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb); + out +---------------- + "{\"key\": 1}" +(1 row) + +-- test type info caching in jsonb_populate_record() +CREATE TEMP TABLE jsbpoptest (js jsonb); +INSERT INTO jsbpoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::jsonb +FROM generate_series(1, 3); +SELECT (jsonb_populate_record(NULL::jsbrec, js)).* FROM jsbpoptest; + i | ia | ia1 | ia2 | ia3 | ia1d | ia2d | t | ta | c | ca | ts | js | jsb | jsa | rec | reca +---+----+-----+-----+-----+------+------+---+----+---+----+----+----+-----+--------------------+-----------------------------------+-------------------------------------------------------- + | | | | | | | | | | | | | | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"} + | | | | | | | | | | | | | | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"} + | | | | | | | | | | | | | | {1,"\"2\"",NULL,4} | (abc,,"Thu Jan 02 00:00:00 2003") | {"(abc,456,)",NULL,"(,,\"Thu Jan 02 00:00:00 2003\")"} +(3 rows) + +DROP TYPE jsbrec; +DROP TYPE jsbrec_i_not_null; +DROP DOMAIN jsb_int_not_null; +DROP DOMAIN jsb_int_array_1d; +DROP DOMAIN jsb_int_array_2d; +DROP DOMAIN jb_ordered_pair; +DROP TYPE jb_unordered_pair; +-- indexing +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ? 'public'; + count +------- + 194 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ? 'bar'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; + count +------- + 337 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; + count +------- + 42 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; + count +------- + 1012 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)'; + count +------- + 194 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)'; + count +------- + 337 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)'; + count +------- + 42 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$'; + count +------- + 1012 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; + count +------- + 194 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; + count +------- + 0 +(1 row) + +CREATE INDEX jidx ON testjsonb USING gin (j); +SET enable_seqscan = off; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}'; + count +------- + 3 +(1 row) + +-- exercise GIN_SEARCH_MODE_ALL +SELECT count(*) FROM testjsonb WHERE j @> '{}'; + count +------- + 1012 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ? 'public'; + count +------- + 194 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ? 'bar'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; + count +------- + 337 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; + count +------- + 42 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; + QUERY PLAN +----------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on testjsonb + Recheck Cond: (j @@ '($."wait" == null)'::jsonpath) + -> Bitmap Index Scan on jidx + Index Cond: (j @@ '($."wait" == null)'::jsonpath) +(5 rows) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; + count +------- + 1012 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)'; + count +------- + 194 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)'; + count +------- + 337 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)'; + count +------- + 42 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; + QUERY PLAN +------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on testjsonb + Recheck Cond: (j @? '$."wait"?(@ == null)'::jsonpath) + -> Bitmap Index Scan on jidx + Index Cond: (j @? '$."wait"?(@ == null)'::jsonpath) +(5 rows) + +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$'; + count +------- + 1012 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; + count +------- + 194 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; + count +------- + 0 +(1 row) + +-- array exists - array elements should behave as keys (for GIN index scans too) +CREATE INDEX jidx_array ON testjsonb USING gin((j->'array')); +SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; + count +------- + 3 +(1 row) + +-- type sensitive array exists - should return no rows (since "exists" only +-- matches strings that are either object keys or array elements) +SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; + count +------- + 0 +(1 row) + +-- However, a raw scalar is *contained* within the array +SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; + count +------- + 1 +(1 row) + +RESET enable_seqscan; +SELECT count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow; + count +------- + 4791 +(1 row) + +SELECT key, count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow GROUP BY key ORDER BY count DESC, key; + key | count +-----------+------- + line | 884 + query | 207 + pos | 203 + node | 202 + space | 197 + status | 195 + public | 194 + title | 190 + wait | 190 + org | 189 + user | 189 + coauthors | 188 + disabled | 185 + indexed | 184 + cleaned | 180 + bad | 179 + date | 179 + world | 176 + state | 172 + subtitle | 169 + auth | 168 + abstract | 161 + array | 5 + age | 2 + foo | 2 + fool | 1 +(26 rows) + +-- sort/hash +SELECT count(distinct j) FROM testjsonb; + count +------- + 894 +(1 row) + +SET enable_hashagg = off; +SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2; + count +------- + 894 +(1 row) + +SET enable_hashagg = on; +SET enable_sort = off; +SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2; + count +------- + 894 +(1 row) + +SELECT distinct * FROM (values (jsonb '{}' || ''::text),('{}')) v(j); + j +---- + {} +(1 row) + +SET enable_sort = on; +RESET enable_hashagg; +RESET enable_sort; +DROP INDEX jidx; +DROP INDEX jidx_array; +-- btree +CREATE INDEX jidx ON testjsonb USING btree (j); +SET enable_seqscan = off; +SELECT count(*) FROM testjsonb WHERE j > '{"p":1}'; + count +------- + 884 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j = '{"pos":98, "line":371, "node":"CBA", "indexed":true}'; + count +------- + 1 +(1 row) + +--gin path opclass +DROP INDEX jidx; +CREATE INDEX jidx ON testjsonb USING gin (j jsonb_path_ops); +SET enable_seqscan = off; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; + count +------- + 2 +(1 row) + +-- exercise GIN_SEARCH_MODE_ALL +SELECT count(*) FROM testjsonb WHERE j @> '{}'; + count +------- + 1012 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; + count +------- + 1012 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; + QUERY PLAN +------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on testjsonb + Recheck Cond: (j @? '$."wait"?(@ == null)'::jsonpath) + -> Bitmap Index Scan on jidx + Index Cond: (j @? '$."wait"?(@ == null)'::jsonpath) +(5 rows) + +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; + count +------- + 15 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; + count +------- + 2 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$'; + count +------- + 1012 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; + count +------- + 194 +(1 row) + +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; + count +------- + 0 +(1 row) + +RESET enable_seqscan; +DROP INDEX jidx; +-- nested tests +SELECT '{"ff":{"a":12,"b":16}}'::jsonb; + jsonb +---------------------------- + {"ff": {"a": 12, "b": 16}} +(1 row) + +SELECT '{"ff":{"a":12,"b":16},"qq":123}'::jsonb; + jsonb +--------------------------------------- + {"ff": {"a": 12, "b": 16}, "qq": 123} +(1 row) + +SELECT '{"aa":["a","aaa"],"qq":{"a":12,"b":16,"c":["c1","c2"],"d":{"d1":"d1","d2":"d2","d1":"d3"}}}'::jsonb; + jsonb +-------------------------------------------------------------------------------------------------- + {"aa": ["a", "aaa"], "qq": {"a": 12, "b": 16, "c": ["c1", "c2"], "d": {"d1": "d3", "d2": "d2"}}} +(1 row) + +SELECT '{"aa":["a","aaa"],"qq":{"a":"12","b":"16","c":["c1","c2"],"d":{"d1":"d1","d2":"d2"}}}'::jsonb; + jsonb +------------------------------------------------------------------------------------------------------ + {"aa": ["a", "aaa"], "qq": {"a": "12", "b": "16", "c": ["c1", "c2"], "d": {"d1": "d1", "d2": "d2"}}} +(1 row) + +SELECT '{"aa":["a","aaa"],"qq":{"a":"12","b":"16","c":["c1","c2",["c3"],{"c4":4}],"d":{"d1":"d1","d2":"d2"}}}'::jsonb; + jsonb +------------------------------------------------------------------------------------------------------------------------- + {"aa": ["a", "aaa"], "qq": {"a": "12", "b": "16", "c": ["c1", "c2", ["c3"], {"c4": 4}], "d": {"d1": "d1", "d2": "d2"}}} +(1 row) + +SELECT '{"ff":["a","aaa"]}'::jsonb; + jsonb +---------------------- + {"ff": ["a", "aaa"]} +(1 row) + +SELECT + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'ff', + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'qq', + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'Y') IS NULL AS f, + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb ->> 'Y') IS NULL AS t, + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'x'; + ?column? | ?column? | f | t | ?column? +--------------------+----------+---+---+---------- + {"a": 12, "b": 16} | 123 | f | t | [1, 2] +(1 row) + +-- nested containment +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1,2]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[2,1],"c":"b"}'::jsonb @> '{"a":[1,2]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":[1,2]}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":[1,2]}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; + ?column? +---------- + f +(1 row) + +SELECT '["a","b"]'::jsonb @> '["a","b","c","b"]'; + ?column? +---------- + f +(1 row) + +SELECT '["a","b","c","b"]'::jsonb @> '["a","b"]'; + ?column? +---------- + t +(1 row) + +SELECT '["a","b","c",[1,2]]'::jsonb @> '["a",[1,2]]'; + ?column? +---------- + t +(1 row) + +SELECT '["a","b","c",[1,2]]'::jsonb @> '["b",[1,2]]'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[2]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[3]}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"c":3}]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4}]}'; + ?column? +---------- + t +(1 row) + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},3]}'; + ?column? +---------- + f +(1 row) + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},1]}'; + ?column? +---------- + t +(1 row) + +-- check some corner cases for indexed nested containment (bug #13756) +create temp table nestjsonb (j jsonb); +insert into nestjsonb (j) values ('{"a":[["b",{"x":1}],["b",{"x":2}]],"c":3}'); +insert into nestjsonb (j) values ('[[14,2,3]]'); +insert into nestjsonb (j) values ('[1,[14,2,3]]'); +create index on nestjsonb using gin(j jsonb_path_ops); +set enable_seqscan = on; +set enable_bitmapscan = off; +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '{"c":3}'; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '[[14]]'; + j +----------------- + [[14, 2, 3]] + [1, [14, 2, 3]] +(2 rows) + +set enable_seqscan = off; +set enable_bitmapscan = on; +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '{"c":3}'; + j +--------------------------------------------------- + {"a": [["b", {"x": 1}], ["b", {"x": 2}]], "c": 3} +(1 row) + +select * from nestjsonb where j @> '[[14]]'; + j +----------------- + [[14, 2, 3]] + [1, [14, 2, 3]] +(2 rows) + +reset enable_seqscan; +reset enable_bitmapscan; +-- nested object field / array index lookup +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'n'; + ?column? +---------- + null +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'a'; + ?column? +---------- + 1 +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'b'; + ?column? +---------- + [1, 2] +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'c'; + ?column? +---------- + {"1": 2} +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd'; + ?column? +--------------- + {"1": [2, 3]} +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd' -> '1'; + ?column? +---------- + [2, 3] +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'e'; + ?column? +---------- + +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 0; --expecting error + ?column? +---------- + +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 0; + ?column? +---------- + "a" +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 1; + ?column? +---------- + "b" +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 2; + ?column? +---------- + "c" +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3; + ?column? +---------- + [1, 2] +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3 -> 1; + ?column? +---------- + 2 +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 4; + ?column? +---------- + null +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 5; + ?column? +---------- + +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> -1; + ?column? +---------- + null +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> -5; + ?column? +---------- + "a" +(1 row) + +SELECT '["a","b","c",[1,2],null]'::jsonb -> -6; + ?column? +---------- + +(1 row) + +--nested path extraction +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{0}'; + ?column? +---------- + +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{a}'; + ?column? +---------- + "b" +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c}'; + ?column? +----------- + [1, 2, 3] +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,0}'; + ?column? +---------- + 1 +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,1}'; + ?column? +---------- + 2 +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,2}'; + ?column? +---------- + 3 +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,3}'; + ?column? +---------- + +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-1}'; + ?column? +---------- + 3 +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-3}'; + ?column? +---------- + 1 +(1 row) + +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-4}'; + ?column? +---------- + +(1 row) + +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{0}'; + ?column? +---------- + 0 +(1 row) + +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{3}'; + ?column? +---------- + [3, 4] +(1 row) + +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4}'; + ?column? +--------------- + {"5": "five"} +(1 row) + +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4,5}'; + ?column? +---------- + "five" +(1 row) + +--nested exists +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'n'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'a'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'b'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'c'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'd'; + ?column? +---------- + t +(1 row) + +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'e'; + ?column? +---------- + f +(1 row) + +-- jsonb_strip_nulls +select jsonb_strip_nulls(null); + jsonb_strip_nulls +------------------- + +(1 row) + +select jsonb_strip_nulls('1'); + jsonb_strip_nulls +------------------- + 1 +(1 row) + +select jsonb_strip_nulls('"a string"'); + jsonb_strip_nulls +------------------- + "a string" +(1 row) + +select jsonb_strip_nulls('null'); + jsonb_strip_nulls +------------------- + null +(1 row) + +select jsonb_strip_nulls('[1,2,null,3,4]'); + jsonb_strip_nulls +-------------------- + [1, 2, null, 3, 4] +(1 row) + +select jsonb_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); + jsonb_strip_nulls +-------------------------------------------- + {"a": 1, "c": [2, null, 3], "d": {"e": 4}} +(1 row) + +select jsonb_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); + jsonb_strip_nulls +-------------------------- + [1, {"a": 1, "c": 2}, 3] +(1 row) + +-- an empty object is not null and should not be stripped +select jsonb_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); + jsonb_strip_nulls +-------------------- + {"a": {}, "d": {}} +(1 row) + +select jsonb_pretty('{"a": "test", "b": [1, 2, 3], "c": "test3", "d":{"dd": "test4", "dd2":{"ddd": "test5"}}}'); + jsonb_pretty +---------------------------- + { + + "a": "test", + + "b": [ + + 1, + + 2, + + 3 + + ], + + "c": "test3", + + "d": { + + "dd": "test4", + + "dd2": { + + "ddd": "test5"+ + } + + } + + } +(1 row) + +select jsonb_pretty('[{"f1":1,"f2":null},2,null,[[{"x":true},6,7],8],3]'); + jsonb_pretty +--------------------------- + [ + + { + + "f1": 1, + + "f2": null + + }, + + 2, + + null, + + [ + + [ + + { + + "x": true+ + }, + + 6, + + 7 + + ], + + 8 + + ], + + 3 + + ] +(1 row) + +select jsonb_pretty('{"a":["b", "c"], "d": {"e":"f"}}'); + jsonb_pretty +------------------ + { + + "a": [ + + "b", + + "c" + + ], + + "d": { + + "e": "f"+ + } + + } +(1 row) + +select jsonb_concat('{"d": "test", "a": [1, 2]}', '{"g": "test2", "c": {"c1":1, "c2":2}}'); + jsonb_concat +------------------------------------------------------------------- + {"a": [1, 2], "c": {"c1": 1, "c2": 2}, "d": "test", "g": "test2"} +(1 row) + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; + ?column? +--------------------------------------------- + {"b": "g", "aa": 1, "cq": "l", "fg": false} +(1 row) + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aq":"l"}'; + ?column? +--------------------------------------- + {"b": 2, "aa": 1, "aq": "l", "cq": 3} +(1 row) + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aa":"l"}'; + ?column? +------------------------------ + {"b": 2, "aa": "l", "cq": 3} +(1 row) + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{}'; + ?column? +---------------------------- + {"b": 2, "aa": 1, "cq": 3} +(1 row) + +select '["a", "b"]'::jsonb || '["c"]'; + ?column? +----------------- + ["a", "b", "c"] +(1 row) + +select '["a", "b"]'::jsonb || '["c", "d"]'; + ?column? +---------------------- + ["a", "b", "c", "d"] +(1 row) + +select '["c"]' || '["a", "b"]'::jsonb; + ?column? +----------------- + ["c", "a", "b"] +(1 row) + +select '["a", "b"]'::jsonb || '"c"'; + ?column? +----------------- + ["a", "b", "c"] +(1 row) + +select '"c"' || '["a", "b"]'::jsonb; + ?column? +----------------- + ["c", "a", "b"] +(1 row) + +select '[]'::jsonb || '["a"]'::jsonb; + ?column? +---------- + ["a"] +(1 row) + +select '[]'::jsonb || '"a"'::jsonb; + ?column? +---------- + ["a"] +(1 row) + +select '"b"'::jsonb || '"a"'::jsonb; + ?column? +------------ + ["b", "a"] +(1 row) + +select '{}'::jsonb || '{"a":"b"}'::jsonb; + ?column? +------------ + {"a": "b"} +(1 row) + +select '[]'::jsonb || '{"a":"b"}'::jsonb; + ?column? +-------------- + [{"a": "b"}] +(1 row) + +select '{"a":"b"}'::jsonb || '[]'::jsonb; + ?column? +-------------- + [{"a": "b"}] +(1 row) + +select '"a"'::jsonb || '{"a":1}'; + ?column? +----------------- + ["a", {"a": 1}] +(1 row) + +select '{"a":1}' || '"a"'::jsonb; + ?column? +----------------- + [{"a": 1}, "a"] +(1 row) + +select '[3]'::jsonb || '{}'::jsonb; + ?column? +---------- + [3, {}] +(1 row) + +select '3'::jsonb || '[]'::jsonb; + ?column? +---------- + [3] +(1 row) + +select '3'::jsonb || '4'::jsonb; + ?column? +---------- + [3, 4] +(1 row) + +select '3'::jsonb || '{}'::jsonb; + ?column? +---------- + [3, {}] +(1 row) + +select '["a", "b"]'::jsonb || '{"c":1}'; + ?column? +---------------------- + ["a", "b", {"c": 1}] +(1 row) + +select '{"c": 1}'::jsonb || '["a", "b"]'; + ?column? +---------------------- + [{"c": 1}, "a", "b"] +(1 row) + +select '{}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; + ?column? +------------------------------------ + {"b": "g", "cq": "l", "fg": false} +(1 row) + +select pg_column_size('{}'::jsonb || '{}'::jsonb) = pg_column_size('{}'::jsonb); + ?column? +---------- + t +(1 row) + +select pg_column_size('{"aa":1}'::jsonb || '{"b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); + ?column? +---------- + t +(1 row) + +select pg_column_size('{"aa":1, "b":2}'::jsonb || '{}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); + ?column? +---------- + t +(1 row) + +select pg_column_size('{}'::jsonb || '{"aa":1, "b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); + ?column? +---------- + t +(1 row) + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'a'); + jsonb_delete +------------------ + {"b": 2, "c": 3} +(1 row) + +select jsonb_delete('{"a":null , "b":2, "c":3}'::jsonb, 'a'); + jsonb_delete +------------------ + {"b": 2, "c": 3} +(1 row) + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'b'); + jsonb_delete +------------------ + {"a": 1, "c": 3} +(1 row) + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'c'); + jsonb_delete +------------------ + {"a": 1, "b": 2} +(1 row) + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'd'); + jsonb_delete +-------------------------- + {"a": 1, "b": 2, "c": 3} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - 'a'; + ?column? +------------------ + {"b": 2, "c": 3} +(1 row) + +select '{"a":null , "b":2, "c":3}'::jsonb - 'a'; + ?column? +------------------ + {"b": 2, "c": 3} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - 'b'; + ?column? +------------------ + {"a": 1, "c": 3} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - 'c'; + ?column? +------------------ + {"a": 1, "b": 2} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - 'd'; + ?column? +-------------------------- + {"a": 1, "b": 2, "c": 3} +(1 row) + +select pg_column_size('{"a":1 , "b":2, "c":3}'::jsonb - 'b') = pg_column_size('{"a":1, "b":2}'::jsonb); + ?column? +---------- + t +(1 row) + +select '["a","b","c"]'::jsonb - 3; + ?column? +----------------- + ["a", "b", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - 2; + ?column? +------------ + ["a", "b"] +(1 row) + +select '["a","b","c"]'::jsonb - 1; + ?column? +------------ + ["a", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - 0; + ?column? +------------ + ["b", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - -1; + ?column? +------------ + ["a", "b"] +(1 row) + +select '["a","b","c"]'::jsonb - -2; + ?column? +------------ + ["a", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - -3; + ?column? +------------ + ["b", "c"] +(1 row) + +select '["a","b","c"]'::jsonb - -4; + ?column? +----------------- + ["a", "b", "c"] +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - '{b}'::text[]; + ?column? +------------------ + {"a": 1, "c": 3} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - '{c,b}'::text[]; + ?column? +---------- + {"a": 1} +(1 row) + +select '{"a":1 , "b":2, "c":3}'::jsonb - '{}'::text[]; + ?column? +-------------------------- + {"a": 1, "b": 2, "c": 3} +(1 row) + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '[1,2,3]'); + jsonb_set +-------------------------------------------------------------------------- + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": [1, 2, 3]} +(1 row) + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '[1,2,3]'); + jsonb_set +----------------------------------------------------------------------------- + {"a": 1, "b": [1, [1, 2, 3]], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null} +(1 row) + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '[1,2,3]'); + jsonb_set +----------------------------------------------------------------------------- + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [[1, 2, 3], 3]}, "n": null} +(1 row) + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '[1,2,3]'); +ERROR: path element at position 2 is null +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '{"1": 2}'); + jsonb_set +------------------------------------------------------------------------- + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": {"1": 2}} +(1 row) + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"1": 2}'); + jsonb_set +---------------------------------------------------------------------------- + {"a": 1, "b": [1, {"1": 2}], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null} +(1 row) + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '{"1": 2}'); + jsonb_set +---------------------------------------------------------------------------- + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [{"1": 2}, 3]}, "n": null} +(1 row) + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '{"1": 2}'); +ERROR: path element at position 2 is null +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '"test"'); + jsonb_set +-------------------------------------------------------------------------- + {"a": 1, "b": [1, "test"], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null} +(1 row) + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"f": "test"}'); + jsonb_set +--------------------------------------------------------------------------------- + {"a": 1, "b": [1, {"f": "test"}], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null} +(1 row) + +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{n}'); + jsonb_delete_path +---------------------------------------------------------- + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}} +(1 row) + +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{b,-1}'); + jsonb_delete_path +------------------------------------------------------------------ + {"a": 1, "b": [1], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null} +(1 row) + +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{d,1,0}'); + jsonb_delete_path +------------------------------------------------------------------ + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [3]}, "n": null} +(1 row) + +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{n}'; + ?column? +---------------------------------------------------------- + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [2, 3]}} +(1 row) + +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1}'; + ?column? +------------------------------------------------------------------ + {"a": 1, "b": [1], "c": {"1": 2}, "d": {"1": [2, 3]}, "n": null} +(1 row) + +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript +ERROR: path element at position 2 is not an integer: "-1e" +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{d,1,0}'; + ?column? +------------------------------------------------------------------ + {"a": 1, "b": [1, 2], "c": {"1": 2}, "d": {"1": [3]}, "n": null} +(1 row) + +-- empty structure and error conditions for delete and replace +select '"a"'::jsonb - 'a'; -- error +ERROR: cannot delete from scalar +select '{}'::jsonb - 'a'; + ?column? +---------- + {} +(1 row) + +select '[]'::jsonb - 'a'; + ?column? +---------- + [] +(1 row) + +select '"a"'::jsonb - 1; -- error +ERROR: cannot delete from scalar +select '{}'::jsonb - 1; -- error +ERROR: cannot delete from object using integer index +select '[]'::jsonb - 1; + ?column? +---------- + [] +(1 row) + +select '"a"'::jsonb #- '{a}'; -- error +ERROR: cannot delete path in scalar +select '{}'::jsonb #- '{a}'; + ?column? +---------- + {} +(1 row) + +select '[]'::jsonb #- '{a}'; + ?column? +---------- + [] +(1 row) + +select jsonb_set('"a"','{a}','"b"'); --error +ERROR: cannot set path in scalar +select jsonb_set('{}','{a}','"b"', false); + jsonb_set +----------- + {} +(1 row) + +select jsonb_set('[]','{1}','"b"', false); + jsonb_set +----------- + [] +(1 row) + +select jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0}','[2,3,4]', false); + jsonb_set +------------------------- + [[2, 3, 4], 2, null, 3] +(1 row) + +-- jsonb_set adding instead of replacing +-- prepend to array +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,-33}','{"foo":123}'); + jsonb_set +------------------------------------------------------- + {"a": 1, "b": [{"foo": 123}, 0, 1, 2], "c": {"d": 4}} +(1 row) + +-- append to array +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,33}','{"foo":123}'); + jsonb_set +------------------------------------------------------- + {"a": 1, "b": [0, 1, 2, {"foo": 123}], "c": {"d": 4}} +(1 row) + +-- check nesting levels addition +select jsonb_set('{"a":1,"b":[4,5,[0,1,2],6,7],"c":{"d":4}}','{b,2,33}','{"foo":123}'); + jsonb_set +--------------------------------------------------------------------- + {"a": 1, "b": [4, 5, [0, 1, 2, {"foo": 123}], 6, 7], "c": {"d": 4}} +(1 row) + +-- add new key +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{c,e}','{"foo":123}'); + jsonb_set +------------------------------------------------------------ + {"a": 1, "b": [0, 1, 2], "c": {"d": 4, "e": {"foo": 123}}} +(1 row) + +-- adding doesn't do anything if elements before last aren't present +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,-33}','{"foo":123}'); + jsonb_set +----------------------------------------- + {"a": 1, "b": [0, 1, 2], "c": {"d": 4}} +(1 row) + +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,y}','{"foo":123}'); + jsonb_set +----------------------------------------- + {"a": 1, "b": [0, 1, 2], "c": {"d": 4}} +(1 row) + +-- add to empty object +select jsonb_set('{}','{x}','{"foo":123}'); + jsonb_set +--------------------- + {"x": {"foo": 123}} +(1 row) + +--add to empty array +select jsonb_set('[]','{0}','{"foo":123}'); + jsonb_set +---------------- + [{"foo": 123}] +(1 row) + +select jsonb_set('[]','{99}','{"foo":123}'); + jsonb_set +---------------- + [{"foo": 123}] +(1 row) + +select jsonb_set('[]','{-99}','{"foo":123}'); + jsonb_set +---------------- + [{"foo": 123}] +(1 row) + +select jsonb_set('{"a": [1, 2, 3]}', '{a, non_integer}', '"new_value"'); +ERROR: path element at position 2 is not an integer: "non_integer" +select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, non_integer}', '"new_value"'); +ERROR: path element at position 3 is not an integer: "non_integer" +select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, NULL}', '"new_value"'); +ERROR: path element at position 3 is null +-- jsonb_set_lax +\pset null NULL +-- pass though non nulls to jsonb_set +select jsonb_set_lax('{"a":1,"b":2}','{b}','5') ; + jsonb_set_lax +------------------ + {"a": 1, "b": 5} +(1 row) + +select jsonb_set_lax('{"a":1,"b":2}','{d}','6', true) ; + jsonb_set_lax +-------------------------- + {"a": 1, "b": 2, "d": 6} +(1 row) + +-- using the default treatment +select jsonb_set_lax('{"a":1,"b":2}','{b}',null); + jsonb_set_lax +--------------------- + {"a": 1, "b": null} +(1 row) + +select jsonb_set_lax('{"a":1,"b":2}','{d}',null,true); + jsonb_set_lax +----------------------------- + {"a": 1, "b": 2, "d": null} +(1 row) + +-- errors +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, null); +ERROR: null_value_treatment must be "delete_key", "return_target", "use_json_null", or "raise_exception" +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, 'no_such_treatment'); +ERROR: null_value_treatment must be "delete_key", "return_target", "use_json_null", or "raise_exception" +-- explicit treatments +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'raise_exception') as raise_exception; +ERROR: JSON value must not be null +DETAIL: Exception was raised because null_value_treatment is "raise_exception". +HINT: To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed. +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'return_target') as return_target; + return_target +------------------ + {"a": 1, "b": 2} +(1 row) + +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'delete_key') as delete_key; + delete_key +------------ + {"a": 1} +(1 row) + +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'use_json_null') as use_json_null; + use_json_null +--------------------- + {"a": 1, "b": null} +(1 row) + +\pset null '' +-- jsonb_insert +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'); + jsonb_insert +------------------------------- + {"a": [0, "new_value", 1, 2]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true); + jsonb_insert +------------------------------- + {"a": [0, 1, "new_value", 2]} +(1 row) + +select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"'); + jsonb_insert +------------------------------------------------------------ + {"a": {"b": {"c": [0, 1, "new_value", "test1", "test2"]}}} +(1 row) + +select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"', true); + jsonb_insert +------------------------------------------------------------ + {"a": {"b": {"c": [0, 1, "test1", "new_value", "test2"]}}} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '{"b": "value"}'); + jsonb_insert +---------------------------------- + {"a": [0, {"b": "value"}, 1, 2]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '["value1", "value2"]'); + jsonb_insert +---------------------------------------- + {"a": [0, ["value1", "value2"], 1, 2]} +(1 row) + +-- edge cases +select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"'); + jsonb_insert +------------------------------- + {"a": ["new_value", 0, 1, 2]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"', true); + jsonb_insert +------------------------------- + {"a": [0, "new_value", 1, 2]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"'); + jsonb_insert +------------------------------- + {"a": [0, 1, "new_value", 2]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"', true); + jsonb_insert +------------------------------- + {"a": [0, 1, 2, "new_value"]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"'); + jsonb_insert +------------------------------- + {"a": [0, 1, "new_value", 2]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"', true); + jsonb_insert +------------------------------- + {"a": [0, 1, 2, "new_value"]} +(1 row) + +select jsonb_insert('[]', '{1}', '"new_value"'); + jsonb_insert +--------------- + ["new_value"] +(1 row) + +select jsonb_insert('[]', '{1}', '"new_value"', true); + jsonb_insert +--------------- + ["new_value"] +(1 row) + +select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"'); + jsonb_insert +---------------------- + {"a": ["new_value"]} +(1 row) + +select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"', true); + jsonb_insert +---------------------- + {"a": ["new_value"]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, 10}', '"new_value"'); + jsonb_insert +------------------------------- + {"a": [0, 1, 2, "new_value"]} +(1 row) + +select jsonb_insert('{"a": [0,1,2]}', '{a, -10}', '"new_value"'); + jsonb_insert +------------------------------- + {"a": ["new_value", 0, 1, 2]} +(1 row) + +-- jsonb_insert should be able to insert new value for objects, but not to replace +select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"'); + jsonb_insert +----------------------------------------- + {"a": {"b": "value", "c": "new_value"}} +(1 row) + +select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"', true); + jsonb_insert +----------------------------------------- + {"a": {"b": "value", "c": "new_value"}} +(1 row) + +select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"'); +ERROR: cannot replace existing key +HINT: Try using the function jsonb_set to replace key value. +select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"', true); +ERROR: cannot replace existing key +HINT: Try using the function jsonb_set to replace key value. +-- jsonb subscript +select ('123'::jsonb)['a']; + jsonb +------- + +(1 row) + +select ('123'::jsonb)[0]; + jsonb +------- + +(1 row) + +select ('123'::jsonb)[NULL]; + jsonb +------- + +(1 row) + +select ('{"a": 1}'::jsonb)['a']; + jsonb +------- + 1 +(1 row) + +select ('{"a": 1}'::jsonb)[0]; + jsonb +------- + +(1 row) + +select ('{"a": 1}'::jsonb)['not_exist']; + jsonb +------- + +(1 row) + +select ('{"a": 1}'::jsonb)[NULL]; + jsonb +------- + +(1 row) + +select ('[1, "2", null]'::jsonb)['a']; + jsonb +------- + +(1 row) + +select ('[1, "2", null]'::jsonb)[0]; + jsonb +------- + 1 +(1 row) + +select ('[1, "2", null]'::jsonb)['1']; + jsonb +------- + "2" +(1 row) + +select ('[1, "2", null]'::jsonb)[1.0]; +ERROR: subscript type numeric is not supported +LINE 1: select ('[1, "2", null]'::jsonb)[1.0]; + ^ +HINT: jsonb subscript must be coercible to either integer or text. +select ('[1, "2", null]'::jsonb)[2]; + jsonb +------- + null +(1 row) + +select ('[1, "2", null]'::jsonb)[3]; + jsonb +------- + +(1 row) + +select ('[1, "2", null]'::jsonb)[-2]; + jsonb +------- + "2" +(1 row) + +select ('[1, "2", null]'::jsonb)[1]['a']; + jsonb +------- + +(1 row) + +select ('[1, "2", null]'::jsonb)[1][0]; + jsonb +------- + +(1 row) + +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['b']; + jsonb +------- + "c" +(1 row) + +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']; + jsonb +----------- + [1, 2, 3] +(1 row) + +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d'][1]; + jsonb +------- + 2 +(1 row) + +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']['a']; + jsonb +------- + +(1 row) + +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']; + jsonb +--------------- + {"a2": "aaa"} +(1 row) + +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']; + jsonb +------- + "aaa" +(1 row) + +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']['a3']; + jsonb +------- + +(1 row) + +select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1']; + jsonb +----------------------- + ["aaa", "bbb", "ccc"] +(1 row) + +select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1'][2]; + jsonb +------- + "ccc" +(1 row) + +-- slices are not supported +select ('{"a": 1}'::jsonb)['a':'b']; +ERROR: jsonb subscript does not support slices +LINE 1: select ('{"a": 1}'::jsonb)['a':'b']; + ^ +select ('[1, "2", null]'::jsonb)[1:2]; +ERROR: jsonb subscript does not support slices +LINE 1: select ('[1, "2", null]'::jsonb)[1:2]; + ^ +select ('[1, "2", null]'::jsonb)[:2]; +ERROR: jsonb subscript does not support slices +LINE 1: select ('[1, "2", null]'::jsonb)[:2]; + ^ +select ('[1, "2", null]'::jsonb)[1:]; +ERROR: jsonb subscript does not support slices +LINE 1: select ('[1, "2", null]'::jsonb)[1:]; + ^ +select ('[1, "2", null]'::jsonb)[:]; +ERROR: jsonb subscript does not support slices +create TEMP TABLE test_jsonb_subscript ( + id int, + test_json jsonb +); +insert into test_jsonb_subscript values +(1, '{}'), -- empty jsonb +(2, '{"key": "value"}'); -- jsonb with data +-- update empty jsonb +update test_jsonb_subscript set test_json['a'] = '1' where id = 1; +select * from test_jsonb_subscript; + id | test_json +----+------------------ + 2 | {"key": "value"} + 1 | {"a": 1} +(2 rows) + +-- update jsonb with some data +update test_jsonb_subscript set test_json['a'] = '1' where id = 2; +select * from test_jsonb_subscript; + id | test_json +----+-------------------------- + 1 | {"a": 1} + 2 | {"a": 1, "key": "value"} +(2 rows) + +-- replace jsonb +update test_jsonb_subscript set test_json['a'] = '"test"'; +select * from test_jsonb_subscript; + id | test_json +----+------------------------------- + 1 | {"a": "test"} + 2 | {"a": "test", "key": "value"} +(2 rows) + +-- replace by object +update test_jsonb_subscript set test_json['a'] = '{"b": 1}'::jsonb; +select * from test_jsonb_subscript; + id | test_json +----+--------------------------------- + 1 | {"a": {"b": 1}} + 2 | {"a": {"b": 1}, "key": "value"} +(2 rows) + +-- replace by array +update test_jsonb_subscript set test_json['a'] = '[1, 2, 3]'::jsonb; +select * from test_jsonb_subscript; + id | test_json +----+---------------------------------- + 1 | {"a": [1, 2, 3]} + 2 | {"a": [1, 2, 3], "key": "value"} +(2 rows) + +-- use jsonb subscription in where clause +select * from test_jsonb_subscript where test_json['key'] = '"value"'; + id | test_json +----+---------------------------------- + 2 | {"a": [1, 2, 3], "key": "value"} +(1 row) + +select * from test_jsonb_subscript where test_json['key_doesnt_exists'] = '"value"'; + id | test_json +----+----------- +(0 rows) + +select * from test_jsonb_subscript where test_json['key'] = '"wrong_value"'; + id | test_json +----+----------- +(0 rows) + +-- NULL +update test_jsonb_subscript set test_json[NULL] = '1'; +ERROR: jsonb subscript in assignment must not be null +update test_jsonb_subscript set test_json['another_key'] = NULL; +select * from test_jsonb_subscript; + id | test_json +----+------------------------------------------------------- + 1 | {"a": [1, 2, 3], "another_key": null} + 2 | {"a": [1, 2, 3], "key": "value", "another_key": null} +(2 rows) + +-- NULL as jsonb source +insert into test_jsonb_subscript values (3, NULL); +update test_jsonb_subscript set test_json['a'] = '1' where id = 3; +select * from test_jsonb_subscript; + id | test_json +----+------------------------------------------------------- + 1 | {"a": [1, 2, 3], "another_key": null} + 2 | {"a": [1, 2, 3], "key": "value", "another_key": null} + 3 | {"a": 1} +(3 rows) + +update test_jsonb_subscript set test_json = NULL where id = 3; +update test_jsonb_subscript set test_json[0] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+--------------------------------------------------------------- + 1 | {"0": 1, "a": [1, 2, 3], "another_key": null} + 2 | {"0": 1, "a": [1, 2, 3], "key": "value", "another_key": null} + 3 | [1] +(3 rows) + +-- Fill the gaps logic +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '[0]'); +update test_jsonb_subscript set test_json[5] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+-------------------------------- + 1 | [0, null, null, null, null, 1] +(1 row) + +update test_jsonb_subscript set test_json[-4] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+----------------------------- + 1 | [0, null, 1, null, null, 1] +(1 row) + +update test_jsonb_subscript set test_json[-8] = '1'; +ERROR: path element at position 1 is out of range: -8 +select * from test_jsonb_subscript; + id | test_json +----+----------------------------- + 1 | [0, null, 1, null, null, 1] +(1 row) + +-- keep consistent values position +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '[]'); +update test_jsonb_subscript set test_json[5] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+----------------------------------- + 1 | [null, null, null, null, null, 1] +(1 row) + +-- create the whole path +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json['a'][0]['b'][0]['c'] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+---------------------------- + 1 | {"a": [{"b": [{"c": 1}]}]} +(1 row) + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json['a'][2]['b'][2]['c'][2] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+------------------------------------------------------------------ + 1 | {"a": [null, null, {"b": [null, null, {"c": [null, null, 1]}]}]} +(1 row) + +-- create the whole path with already existing keys +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{"b": 1}'); +update test_jsonb_subscript set test_json['a'][0] = '2'; +select * from test_jsonb_subscript; + id | test_json +----+-------------------- + 1 | {"a": [2], "b": 1} +(1 row) + +-- the start jsonb is an object, first subscript is treated as a key +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json[0]['a'] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+----------------- + 1 | {"0": {"a": 1}} +(1 row) + +-- the start jsonb is an array +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '[]'); +update test_jsonb_subscript set test_json[0]['a'] = '1'; +update test_jsonb_subscript set test_json[2]['b'] = '2'; +select * from test_jsonb_subscript; + id | test_json +----+---------------------------- + 1 | [{"a": 1}, null, {"b": 2}] +(1 row) + +-- overwriting an existing path +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json['a']['b'][1] = '1'; +update test_jsonb_subscript set test_json['a']['b'][10] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+---------------------------------------------------------------------------- + 1 | {"a": {"b": [null, 1, null, null, null, null, null, null, null, null, 1]}} +(1 row) + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '[]'); +update test_jsonb_subscript set test_json[0][0][0] = '1'; +update test_jsonb_subscript set test_json[0][0][1] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+------------ + 1 | [[[1, 1]]] +(1 row) + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json['a']['b'][10] = '1'; +update test_jsonb_subscript set test_json['a'][10][10] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+------------------------------------------------------------------------------------------------------------------------------------------------------ + 1 | {"a": {"b": [null, null, null, null, null, null, null, null, null, null, 1], "10": [null, null, null, null, null, null, null, null, null, null, 1]}} +(1 row) + +-- an empty sub element +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{"a": {}}'); +update test_jsonb_subscript set test_json['a']['b']['c'][2] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+-------------------------------------- + 1 | {"a": {"b": {"c": [null, null, 1]}}} +(1 row) + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{"a": []}'); +update test_jsonb_subscript set test_json['a'][1]['c'][2] = '1'; +select * from test_jsonb_subscript; + id | test_json +----+--------------------------------------- + 1 | {"a": [null, {"c": [null, null, 1]}]} +(1 row) + +-- trying replace assuming a composite object, but it's an element or a value +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{"a": 1}'); +update test_jsonb_subscript set test_json['a']['b'] = '1'; +ERROR: cannot replace existing key +DETAIL: The path assumes key is a composite object, but it is a scalar value. +update test_jsonb_subscript set test_json['a']['b']['c'] = '1'; +ERROR: cannot replace existing key +DETAIL: The path assumes key is a composite object, but it is a scalar value. +update test_jsonb_subscript set test_json['a'][0] = '1'; +ERROR: cannot replace existing key +DETAIL: The path assumes key is a composite object, but it is a scalar value. +update test_jsonb_subscript set test_json['a'][0]['c'] = '1'; +ERROR: cannot replace existing key +DETAIL: The path assumes key is a composite object, but it is a scalar value. +update test_jsonb_subscript set test_json['a'][0][0] = '1'; +ERROR: cannot replace existing key +DETAIL: The path assumes key is a composite object, but it is a scalar value. +-- trying replace assuming a composite object, but it's a raw scalar +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, 'null'); +update test_jsonb_subscript set test_json[0] = '1'; +ERROR: cannot replace existing key +DETAIL: The path assumes key is a composite object, but it is a scalar value. +update test_jsonb_subscript set test_json[0][0] = '1'; +ERROR: cannot replace existing key +DETAIL: The path assumes key is a composite object, but it is a scalar value. +-- jsonb to tsvector +select to_tsvector('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::jsonb); + to_tsvector +--------------------------------------------------------------------------- + 'aaa':1 'bbb':2 'ccc':4 'ddd':3 'eee':6 'fff':7 'ggg':8 'hhh':10 'iii':11 +(1 row) + +-- jsonb to tsvector with config +select to_tsvector('simple', '{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::jsonb); + to_tsvector +--------------------------------------------------------------------------- + 'aaa':1 'bbb':2 'ccc':4 'ddd':3 'eee':6 'fff':7 'ggg':8 'hhh':10 'iii':11 +(1 row) + +-- jsonb to tsvector with stop words +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": ["the eee fff ggg"], "c": {"d": "hhh. iii"}}'::jsonb); + to_tsvector +---------------------------------------------------------------------------- + 'aaa':1 'bbb':3 'ccc':5 'ddd':4 'eee':8 'fff':9 'ggg':10 'hhh':12 'iii':13 +(1 row) + +-- jsonb to tsvector with numeric values +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": 123, "c": 456}'::jsonb); + to_tsvector +--------------------------------- + 'aaa':1 'bbb':3 'ccc':5 'ddd':4 +(1 row) + +-- jsonb_to_tsvector +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"'); + jsonb_to_tsvector +---------------------------------------------------------------------------------------- + '123':8 '456':12 'aaa':2 'b':6 'bbb':4 'c':10 'd':14 'f':18 'fals':20 'g':22 'true':16 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); + jsonb_to_tsvector +-------------------------------- + 'b':2 'c':4 'd':6 'f':8 'g':10 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); + jsonb_to_tsvector +------------------- + 'aaa':1 'bbb':3 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); + jsonb_to_tsvector +------------------- + '123':1 '456':3 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); + jsonb_to_tsvector +------------------- + 'fals':3 'true':1 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); + jsonb_to_tsvector +--------------------------------- + '123':5 '456':7 'aaa':1 'bbb':3 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"'); + jsonb_to_tsvector +---------------------------------------------------------------------------------------- + '123':8 '456':12 'aaa':2 'b':6 'bbb':4 'c':10 'd':14 'f':18 'fals':20 'g':22 'true':16 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); + jsonb_to_tsvector +-------------------------------- + 'b':2 'c':4 'd':6 'f':8 'g':10 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); + jsonb_to_tsvector +------------------- + 'aaa':1 'bbb':3 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); + jsonb_to_tsvector +------------------- + '123':1 '456':3 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); + jsonb_to_tsvector +------------------- + 'fals':3 'true':1 +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); + jsonb_to_tsvector +--------------------------------- + '123':5 '456':7 'aaa':1 'bbb':3 +(1 row) + +-- to_tsvector corner cases +select to_tsvector('""'::jsonb); + to_tsvector +------------- + +(1 row) + +select to_tsvector('{}'::jsonb); + to_tsvector +------------- + +(1 row) + +select to_tsvector('[]'::jsonb); + to_tsvector +------------- + +(1 row) + +select to_tsvector('null'::jsonb); + to_tsvector +------------- + +(1 row) + +-- jsonb_to_tsvector corner cases +select jsonb_to_tsvector('""'::jsonb, '"all"'); + jsonb_to_tsvector +------------------- + +(1 row) + +select jsonb_to_tsvector('{}'::jsonb, '"all"'); + jsonb_to_tsvector +------------------- + +(1 row) + +select jsonb_to_tsvector('[]'::jsonb, '"all"'); + jsonb_to_tsvector +------------------- + +(1 row) + +select jsonb_to_tsvector('null'::jsonb, '"all"'); + jsonb_to_tsvector +------------------- + +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '""'); +ERROR: wrong flag in flag array: "" +HINT: Possible values are: "string", "numeric", "boolean", "key", and "all". +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '{}'); +ERROR: wrong flag type, only arrays and scalars are allowed +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '[]'); + jsonb_to_tsvector +------------------- + +(1 row) + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, 'null'); +ERROR: flag array element is not a string +HINT: Possible values are: "string", "numeric", "boolean", "key", and "all". +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["all", null]'); +ERROR: flag array element is not a string +HINT: Possible values are: "string", "numeric", "boolean", "key", and "all". +-- ts_headline for jsonb +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ts_headline +------------------------------------------------------------------------------------------------------------------ + {"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]} +(1 row) + +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); + ts_headline +----------------------------------------------------------------------------------------------- + {"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]} +(1 row) + +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ts_headline +--------------------------------------------------------------------------------------------------- + {"a": "aaa ", "b": {"c": "ccc fff", "c1": "ccc1 ddd1"}, "d": ["ggg ", "iii jjj"]} +(1 row) + +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + ts_headline +--------------------------------------------------------------------------------------------------- + {"a": "aaa ", "b": {"c": "ccc fff", "c1": "ccc1 ddd1"}, "d": ["ggg ", "iii jjj"]} +(1 row) + +-- corner cases for ts_headline with jsonb +select ts_headline('null'::jsonb, tsquery('aaa & bbb')); + ts_headline +------------- + null +(1 row) + +select ts_headline('{}'::jsonb, tsquery('aaa & bbb')); + ts_headline +------------- + {} +(1 row) + +select ts_headline('[]'::jsonb, tsquery('aaa & bbb')); + ts_headline +------------- + [] +(1 row) + +-- casts +select 'true'::jsonb::bool; + bool +------ + t +(1 row) + +select '[]'::jsonb::bool; +ERROR: cannot cast jsonb array to type boolean +select '1.0'::jsonb::float; + float8 +-------- + 1 +(1 row) + +select '[1.0]'::jsonb::float; +ERROR: cannot cast jsonb array to type double precision +select '12345'::jsonb::int4; + int4 +------- + 12345 +(1 row) + +select '"hello"'::jsonb::int4; +ERROR: cannot cast jsonb string to type integer +select '12345'::jsonb::numeric; + numeric +--------- + 12345 +(1 row) + +select '{}'::jsonb::numeric; +ERROR: cannot cast jsonb object to type numeric +select '12345.05'::jsonb::numeric; + numeric +---------- + 12345.05 +(1 row) + +select '12345.05'::jsonb::float4; + float4 +---------- + 12345.05 +(1 row) + +select '12345.05'::jsonb::float8; + float8 +---------- + 12345.05 +(1 row) + +select '12345.05'::jsonb::int2; + int2 +------- + 12345 +(1 row) + +select '12345.05'::jsonb::int4; + int4 +------- + 12345 +(1 row) + +select '12345.05'::jsonb::int8; + int8 +------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::numeric; + numeric +------------------------------------------------------ + 12345.0000000000000000000000000000000000000000000005 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float4; + float4 +-------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float8; + float8 +-------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int2; + int2 +------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int4; + int4 +------- + 12345 +(1 row) + +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int8; + int8 +------- + 12345 +(1 row) + diff --git a/src/test/singlenode_regress/expected/jsonb_jsonpath.out b/src/test/singlenode_regress/expected/jsonb_jsonpath.out new file mode 100644 index 00000000000..b198ee2ea7a --- /dev/null +++ b/src/test/singlenode_regress/expected/jsonb_jsonpath.out @@ -0,0 +1,2539 @@ +select jsonb '{"a": 12}' @? '$'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": 12}' @? '1'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": 12}' @? '$.a.b'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": 12}' @? '$.b'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": 12}' @? '$.a + 2'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": 12}' @? '$.b + 2'; + ?column? +---------- + +(1 row) + +select jsonb '{"a": {"a": 12}}' @? '$.a.a'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"a": 12}}' @? '$.*.a'; + ?column? +---------- + t +(1 row) + +select jsonb '{"b": {"a": 12}}' @? '$.*.a'; + ?column? +---------- + t +(1 row) + +select jsonb '{"b": {"a": 12}}' @? '$.*.b'; + ?column? +---------- + f +(1 row) + +select jsonb '{"b": {"a": 12}}' @? 'strict $.*.b'; + ?column? +---------- + +(1 row) + +select jsonb '{}' @? '$.*'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": 1}' @? '$.*'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{1}'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{2}'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{3}'; + ?column? +---------- + f +(1 row) + +select jsonb '[]' @? '$[*]'; + ?column? +---------- + f +(1 row) + +select jsonb '[1]' @? '$[*]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[1]'; + ?column? +---------- + f +(1 row) + +select jsonb '[1]' @? 'strict $[1]'; + ?column? +---------- + +(1 row) + +select jsonb_path_query('[1]', 'strict $[1]'); +ERROR: jsonpath array subscript is out of bounds +select jsonb_path_query('[1]', 'strict $[1]', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb '[1]' @? 'lax $[10000000000000000]'; + ?column? +---------- + +(1 row) + +select jsonb '[1]' @? 'strict $[10000000000000000]'; + ?column? +---------- + +(1 row) + +select jsonb_path_query('[1]', 'lax $[10000000000000000]'); +ERROR: jsonpath array subscript is out of integer range +select jsonb_path_query('[1]', 'strict $[10000000000000000]'); +ERROR: jsonpath array subscript is out of integer range +select jsonb '[1]' @? '$[0]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[0.3]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[0.5]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[0.9]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1]' @? '$[1.2]'; + ?column? +---------- + f +(1 row) + +select jsonb '[1]' @? 'strict $[1.2]'; + ?column? +---------- + +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] > @.b[*])'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] >= @.b[*])'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? '$ ? (@.a[*] >= @.b[*])'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? 'strict $ ? (@.a[*] >= @.b[*])'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": [1,2,3], "b": [3,4,null]}' @? '$ ? (@.a[*] >= @.b[*])'; + ?column? +---------- + t +(1 row) + +select jsonb '1' @? '$ ? ((@ == "1") is unknown)'; + ?column? +---------- + t +(1 row) + +select jsonb '1' @? '$ ? ((@ == 1) is unknown)'; + ?column? +---------- + f +(1 row) + +select jsonb '[{"a": 1}, {"a": 2}]' @? '$[0 to 1] ? (@.a > 1)'; + ?column? +---------- + t +(1 row) + +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => false); + jsonb_path_exists +------------------- + t +(1 row) + +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => true); + jsonb_path_exists +------------------- + t +(1 row) + +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => false); +ERROR: jsonpath member accessor can only be applied to an object +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => true); + jsonb_path_exists +------------------- + +(1 row) + +select jsonb_path_query('1', 'lax $.a'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1', 'strict $.a'); +ERROR: jsonpath member accessor can only be applied to an object +select jsonb_path_query('1', 'strict $.*'); +ERROR: jsonpath wildcard member accessor can only be applied to an object +select jsonb_path_query('1', 'strict $.a', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1', 'strict $.*', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'lax $.a'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.a'); +ERROR: jsonpath member accessor can only be applied to an object +select jsonb_path_query('[]', 'strict $.a', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', 'lax $.a'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', 'strict $.a'); +ERROR: JSON object does not contain key "a" +select jsonb_path_query('{}', 'strict $.a', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1', 'strict $[1]'); +ERROR: jsonpath array accessor can only be applied to an array +select jsonb_path_query('1', 'strict $[*]'); +ERROR: jsonpath wildcard array accessor can only be applied to an array +select jsonb_path_query('[]', 'strict $[1]'); +ERROR: jsonpath array subscript is out of bounds +select jsonb_path_query('[]', 'strict $["a"]'); +ERROR: jsonpath array subscript is not a single numeric value +select jsonb_path_query('1', 'strict $[1]', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1', 'strict $[*]', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $[1]', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $["a"]', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.a'); + jsonb_path_query +------------------ + 12 +(1 row) + +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.b'); + jsonb_path_query +------------------ + {"a": 13} +(1 row) + +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.*'); + jsonb_path_query +------------------ + 12 + {"a": 13} +(2 rows) + +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', 'lax $.*.a'); + jsonb_path_query +------------------ + 13 +(1 row) + +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].a'); + jsonb_path_query +------------------ + 13 +(1 row) + +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].*'); + jsonb_path_query +------------------ + 13 + 14 +(2 rows) + +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0].a'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[1].a'); + jsonb_path_query +------------------ + 13 +(1 row) + +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[2].a'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0,1].a'); + jsonb_path_query +------------------ + 13 +(1 row) + +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10].a'); + jsonb_path_query +------------------ + 13 +(1 row) + +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10 / 0].a'); +ERROR: division by zero +select jsonb_path_query('[12, {"a": 13}, {"b": 14}, "ccc", true]', '$[2.5 - 1 to $.size() - 2]'); + jsonb_path_query +------------------ + {"a": 13} + {"b": 14} + "ccc" +(3 rows) + +select jsonb_path_query('1', 'lax $[0]'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('1', 'lax $[*]'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('[1]', 'lax $[0]'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('[1]', 'lax $[*]'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('[1,2,3]', 'lax $[*]'); + jsonb_path_query +------------------ + 1 + 2 + 3 +(3 rows) + +select jsonb_path_query('[1,2,3]', 'strict $[*].a'); +ERROR: jsonpath member accessor can only be applied to an object +select jsonb_path_query('[1,2,3]', 'strict $[*].a', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$[last]'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$[last ? (exists(last))]'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $[last]'); +ERROR: jsonpath array subscript is out of bounds +select jsonb_path_query('[]', 'strict $[last]', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[1]', '$[last]'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('[1,2,3]', '$[last]'); + jsonb_path_query +------------------ + 3 +(1 row) + +select jsonb_path_query('[1,2,3]', '$[last - 1]'); + jsonb_path_query +------------------ + 2 +(1 row) + +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "number")]'); + jsonb_path_query +------------------ + 3 +(1 row) + +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]'); +ERROR: jsonpath array subscript is not a single numeric value +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select * from jsonb_path_query('{"a": 10}', '$'); + jsonb_path_query +------------------ + {"a": 10} +(1 row) + +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)'); +ERROR: could not find jsonpath variable "value" +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '1'); +ERROR: "vars" argument is not an object +DETAIL: Jsonpath parameters should be encoded as key-value pairs of "vars" object. +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '[{"value" : 13}]'); +ERROR: "vars" argument is not an object +DETAIL: Jsonpath parameters should be encoded as key-value pairs of "vars" object. +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 13}'); + jsonb_path_query +------------------ + {"a": 10} +(1 row) + +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 8}'); + jsonb_path_query +------------------ +(0 rows) + +select * from jsonb_path_query('{"a": 10}', '$.a ? (@ < $value)', '{"value" : 13}'); + jsonb_path_query +------------------ + 10 +(1 row) + +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[*] ? (@ < $value)', '{"value" : 13}'); + jsonb_path_query +------------------ + 10 + 11 + 12 +(3 rows) + +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0,1] ? (@ < $x.value)', '{"x": {"value" : 13}}'); + jsonb_path_query +------------------ + 10 + 11 +(2 rows) + +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0 to 2] ? (@ < $value)', '{"value" : 15}'); + jsonb_path_query +------------------ + 10 + 11 + 12 +(3 rows) + +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == "1")'); + jsonb_path_query +------------------ + "1" +(1 row) + +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : "1"}'); + jsonb_path_query +------------------ + "1" +(1 row) + +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : null}'); + jsonb_path_query +------------------ + null +(1 row) + +select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ != null)'); + jsonb_path_query +------------------ + 1 + "2" +(2 rows) + +select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ == null)'); + jsonb_path_query +------------------ + null +(1 row) + +select * from jsonb_path_query('{}', '$ ? (@ == @)'); + jsonb_path_query +------------------ +(0 rows) + +select * from jsonb_path_query('[]', 'strict $ ? (@ == @)'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**'); + jsonb_path_query +------------------ + {"a": {"b": 1}} + {"b": 1} + 1 +(3 rows) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}'); + jsonb_path_query +------------------ + {"a": {"b": 1}} +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}'); + jsonb_path_query +------------------ + {"a": {"b": 1}} + {"b": 1} + 1 +(3 rows) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}'); + jsonb_path_query +------------------ + {"b": 1} +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}'); + jsonb_path_query +------------------ + {"b": 1} + 1 +(2 rows) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2}'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2 to last}'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{3 to last}'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{last}'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}.b ? (@ > 0)'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to 2}.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0}.b ? (@ > 0)'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1}.b ? (@ > 0)'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0 to last}.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to last}.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to 2}.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{2 to 3}.b ? (@ > 0)'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{0}.b ? ( @ > 0)'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{1}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{0 to last}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to last}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0}.b ? ( @ > 0)'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1}.b ? ( @ > 0)'; + ?column? +---------- + f +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0 to last}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to last}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{2 to 3}.b ? ( @ > 0)'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x))'); + jsonb_path_query +------------------ + {"x": 2} +(1 row) + +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.y))'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x ? (@ >= 2) ))'); + jsonb_path_query +------------------ + {"x": 2} +(1 row) + +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x))'); + jsonb_path_query +------------------ + {"x": 2} +(1 row) + +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x + "3"))'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? ((exists (@.x + "3")) is unknown)'); + jsonb_path_query +------------------ + {"x": 2} + {"y": 3} +(2 rows) + +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? (exists (@.x))'); + jsonb_path_query +------------------ + {"x": 2} +(1 row) + +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? ((exists (@.x)) is unknown)'); + jsonb_path_query +------------------ + {"y": 3} +(1 row) + +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? (exists (@[*].x))'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? ((exists (@[*].x)) is unknown)'); + jsonb_path_query +---------------------- + [{"x": 2}, {"y": 3}] +(1 row) + +--test ternary logic +select + x, y, + jsonb_path_query( + '[true, false, null]', + '$[*] ? (@ == true && ($x == true && $y == true) || + @ == false && !($x == true && $y == true) || + @ == null && ($x == true && $y == true) is unknown)', + jsonb_build_object('x', x, 'y', y) + ) as "x && y" +from + (values (jsonb 'true'), ('false'), ('"null"')) x(x), + (values (jsonb 'true'), ('false'), ('"null"')) y(y); + x | y | x && y +--------+--------+-------- + true | true | true + true | false | false + true | "null" | null + false | true | false + false | false | false + false | "null" | false + "null" | true | null + "null" | false | false + "null" | "null" | null +(9 rows) + +select + x, y, + jsonb_path_query( + '[true, false, null]', + '$[*] ? (@ == true && ($x == true || $y == true) || + @ == false && !($x == true || $y == true) || + @ == null && ($x == true || $y == true) is unknown)', + jsonb_build_object('x', x, 'y', y) + ) as "x || y" +from + (values (jsonb 'true'), ('false'), ('"null"')) x(x), + (values (jsonb 'true'), ('false'), ('"null"')) y(y); + x | y | x || y +--------+--------+-------- + true | true | true + true | false | true + true | "null" | true + false | true | true + false | false | false + false | "null" | null + "null" | true | true + "null" | false | null + "null" | "null" | null +(9 rows) + +select jsonb '{"a": 1, "b":1}' @? '$ ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$ ? (@.a == @.b)'; + ?column? +---------- + f +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? ($.c.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.* ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": 1, "b":1}' @? '$.** ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.** ? (@.a == @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == 1 + 1)'); + jsonb_path_query +------------------ + {"a": 2, "b": 1} +(1 row) + +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (1 + 1))'); + jsonb_path_query +------------------ + {"a": 2, "b": 1} +(1 row) + +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == @.b + 1)'); + jsonb_path_query +------------------ + {"a": 2, "b": 1} +(1 row) + +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (@.b + 1))'); + jsonb_path_query +------------------ + {"a": 2, "b": 1} +(1 row) + +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - 1)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -1)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -@.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 2, "b":1}}' @? '$.** ? (@.a == 1 - - @.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - +@.b)'; + ?column? +---------- + t +(1 row) + +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +2)'; + ?column? +---------- + t +(1 row) + +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +3)'; + ?column? +---------- + f +(1 row) + +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -2)'; + ?column? +---------- + t +(1 row) + +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -3)'; + ?column? +---------- + f +(1 row) + +select jsonb '1' @? '$ ? ($ > 0)'; + ?column? +---------- + t +(1 row) + +-- arithmetic errors +select jsonb_path_query('[1,2,0,3]', '$[*] ? (2 / @ > 0)'); + jsonb_path_query +------------------ + 1 + 2 + 3 +(3 rows) + +select jsonb_path_query('[1,2,0,3]', '$[*] ? ((2 / @ > 0) is unknown)'); + jsonb_path_query +------------------ + 0 +(1 row) + +select jsonb_path_query('0', '1 / $'); +ERROR: division by zero +select jsonb_path_query('0', '1 / $ + 2'); +ERROR: division by zero +select jsonb_path_query('0', '-(3 + 1 % $)'); +ERROR: division by zero +select jsonb_path_query('1', '$ + "2"'); +ERROR: right operand of jsonpath operator + is not a single numeric value +select jsonb_path_query('[1, 2]', '3 * $'); +ERROR: right operand of jsonpath operator * is not a single numeric value +select jsonb_path_query('"a"', '-$'); +ERROR: operand of unary jsonpath operator - is not a numeric value +select jsonb_path_query('[1,"2",3]', '+$'); +ERROR: operand of unary jsonpath operator + is not a numeric value +select jsonb_path_query('1', '$ + "2"', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[1, 2]', '3 * $', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"a"', '-$', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[1,"2",3]', '+$', silent => true); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb '["1",2,0,3]' @? '-$[*]'; + ?column? +---------- + t +(1 row) + +select jsonb '[1,"2",0,3]' @? '-$[*]'; + ?column? +---------- + t +(1 row) + +select jsonb '["1",2,0,3]' @? 'strict -$[*]'; + ?column? +---------- + +(1 row) + +select jsonb '[1,"2",0,3]' @? 'strict -$[*]'; + ?column? +---------- + +(1 row) + +-- unwrapping of operator arguments in lax mode +select jsonb_path_query('{"a": [2]}', 'lax $.a * 3'); + jsonb_path_query +------------------ + 6 +(1 row) + +select jsonb_path_query('{"a": [2]}', 'lax $.a + 3'); + jsonb_path_query +------------------ + 5 +(1 row) + +select jsonb_path_query('{"a": [2, 3, 4]}', 'lax -$.a'); + jsonb_path_query +------------------ + -2 + -3 + -4 +(3 rows) + +-- should fail +select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3'); +ERROR: left operand of jsonpath operator * is not a single numeric value +select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3', silent => true); + jsonb_path_query +------------------ +(0 rows) + +-- extension: boolean expressions +select jsonb_path_query('2', '$ > 1'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('2', '$ <= 1'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('2', '$ == "2"'); + jsonb_path_query +------------------ + null +(1 row) + +select jsonb '2' @? '$ == "2"'; + ?column? +---------- + t +(1 row) + +select jsonb '2' @@ '$ > 1'; + ?column? +---------- + t +(1 row) + +select jsonb '2' @@ '$ <= 1'; + ?column? +---------- + f +(1 row) + +select jsonb '2' @@ '$ == "2"'; + ?column? +---------- + +(1 row) + +select jsonb '2' @@ '1'; + ?column? +---------- + +(1 row) + +select jsonb '{}' @@ '$'; + ?column? +---------- + +(1 row) + +select jsonb '[]' @@ '$'; + ?column? +---------- + +(1 row) + +select jsonb '[1,2,3]' @@ '$[*]'; + ?column? +---------- + +(1 row) + +select jsonb '[]' @@ '$[*]'; + ?column? +---------- + +(1 row) + +select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] > $x) [1]', '{"x": 1}'); + jsonb_path_match +------------------ + f +(1 row) + +select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] < $x) [1]', '{"x": 2}'); + jsonb_path_match +------------------ + t +(1 row) + +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => false); + jsonb_path_match +------------------ + t +(1 row) + +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => true); + jsonb_path_match +------------------ + t +(1 row) + +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => false); + jsonb_path_match +------------------ + +(1 row) + +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => true); + jsonb_path_match +------------------ + +(1 row) + +select jsonb_path_query('[null,1,true,"a",[],{}]', '$.type()'); + jsonb_path_query +------------------ + "array" +(1 row) + +select jsonb_path_query('[null,1,true,"a",[],{}]', 'lax $.type()'); + jsonb_path_query +------------------ + "array" +(1 row) + +select jsonb_path_query('[null,1,true,"a",[],{}]', '$[*].type()'); + jsonb_path_query +------------------ + "null" + "number" + "boolean" + "string" + "array" + "object" +(6 rows) + +select jsonb_path_query('null', 'null.type()'); + jsonb_path_query +------------------ + "null" +(1 row) + +select jsonb_path_query('null', 'true.type()'); + jsonb_path_query +------------------ + "boolean" +(1 row) + +select jsonb_path_query('null', '(123).type()'); + jsonb_path_query +------------------ + "number" +(1 row) + +select jsonb_path_query('null', '"123".type()'); + jsonb_path_query +------------------ + "string" +(1 row) + +select jsonb_path_query('{"a": 2}', '($.a - 5).abs() + 10'); + jsonb_path_query +------------------ + 13 +(1 row) + +select jsonb_path_query('{"a": 2.5}', '-($.a * $.a).floor() % 4.3'); + jsonb_path_query +------------------ + -1.7 +(1 row) + +select jsonb_path_query('[1, 2, 3]', '($[*] > 2) ? (@ == true)'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('[1, 2, 3]', '($[*] > 3).type()'); + jsonb_path_query +------------------ + "boolean" +(1 row) + +select jsonb_path_query('[1, 2, 3]', '($[*].a > 3).type()'); + jsonb_path_query +------------------ + "boolean" +(1 row) + +select jsonb_path_query('[1, 2, 3]', 'strict ($[*].a > 3).type()'); + jsonb_path_query +------------------ + "null" +(1 row) + +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()'); +ERROR: jsonpath item method .size() can only be applied to an array +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'lax $[*].size()'); + jsonb_path_query +------------------ + 1 + 1 + 1 + 1 + 0 + 1 + 3 + 1 + 1 +(9 rows) + +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].abs()'); + jsonb_path_query +------------------ + 0 + 1 + 2 + 3.4 + 5.6 +(5 rows) + +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].floor()'); + jsonb_path_query +------------------ + 0 + 1 + -2 + -4 + 5 +(5 rows) + +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling()'); + jsonb_path_query +------------------ + 0 + 1 + -2 + -3 + 6 +(5 rows) + +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs()'); + jsonb_path_query +------------------ + 0 + 1 + 2 + 3 + 6 +(5 rows) + +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs().type()'); + jsonb_path_query +------------------ + "number" + "number" + "number" + "number" + "number" +(5 rows) + +select jsonb_path_query('[{},1]', '$[*].keyvalue()'); +ERROR: jsonpath item method .keyvalue() can only be applied to an object +select jsonb_path_query('[{},1]', '$[*].keyvalue()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.keyvalue()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{"a": 1, "b": [1, 2], "c": {"a": "bbb"}}', '$.keyvalue()'); + jsonb_path_query +---------------------------------------------- + {"id": 0, "key": "a", "value": 1} + {"id": 0, "key": "b", "value": [1, 2]} + {"id": 0, "key": "c", "value": {"a": "bbb"}} +(3 rows) + +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', '$[*].keyvalue()'); + jsonb_path_query +----------------------------------------------- + {"id": 12, "key": "a", "value": 1} + {"id": 12, "key": "b", "value": [1, 2]} + {"id": 72, "key": "c", "value": {"a": "bbb"}} +(3 rows) + +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue()'); +ERROR: jsonpath item method .keyvalue() can only be applied to an object +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'lax $.keyvalue()'); + jsonb_path_query +----------------------------------------------- + {"id": 12, "key": "a", "value": 1} + {"id": 12, "key": "b", "value": [1, 2]} + {"id": 72, "key": "c", "value": {"a": "bbb"}} +(3 rows) + +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue().a'); +ERROR: jsonpath item method .keyvalue() can only be applied to an object +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue()'; + ?column? +---------- + t +(1 row) + +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue().key'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('null', '$.double()'); +ERROR: jsonpath item method .double() can only be applied to a string or numeric value +select jsonb_path_query('true', '$.double()'); +ERROR: jsonpath item method .double() can only be applied to a string or numeric value +select jsonb_path_query('null', '$.double()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('true', '$.double()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$.double()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.double()'); +ERROR: jsonpath item method .double() can only be applied to a string or numeric value +select jsonb_path_query('{}', '$.double()'); +ERROR: jsonpath item method .double() can only be applied to a string or numeric value +select jsonb_path_query('[]', 'strict $.double()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.double()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1.23', '$.double()'); + jsonb_path_query +------------------ + 1.23 +(1 row) + +select jsonb_path_query('"1.23"', '$.double()'); + jsonb_path_query +------------------ + 1.23 +(1 row) + +select jsonb_path_query('"1.23aaa"', '$.double()'); +ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +select jsonb_path_query('1e1000', '$.double()'); +ERROR: value out of range: overflow +select jsonb_path_query('"nan"', '$.double()'); +ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +select jsonb_path_query('"NaN"', '$.double()'); +ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +select jsonb_path_query('"inf"', '$.double()'); +ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +select jsonb_path_query('"-inf"', '$.double()'); +ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +select jsonb_path_query('"inf"', '$.double()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"-inf"', '$.double()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.abs()'); +ERROR: jsonpath item method .abs() can only be applied to a numeric value +select jsonb_path_query('true', '$.floor()'); +ERROR: jsonpath item method .floor() can only be applied to a numeric value +select jsonb_path_query('"1.2"', '$.ceiling()'); +ERROR: jsonpath item method .ceiling() can only be applied to a numeric value +select jsonb_path_query('{}', '$.abs()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('true', '$.floor()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"1.2"', '$.ceiling()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('["", "a", "abc", "abcabc"]', '$[*] ? (@ starts with "abc")'); + jsonb_path_query +------------------ + "abc" + "abcabc" +(2 rows) + +select jsonb_path_query('["", "a", "abc", "abcabc"]', 'strict $ ? (@[*] starts with "abc")'); + jsonb_path_query +---------------------------- + ["", "a", "abc", "abcabc"] +(1 row) + +select jsonb_path_query('["", "a", "abd", "abdabc"]', 'strict $ ? (@[*] starts with "abc")'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? (@[*] starts with "abc")'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? ((@[*] starts with "abc") is unknown)'); + jsonb_path_query +---------------------------- + ["abc", "abcabc", null, 1] +(1 row) + +select jsonb_path_query('[[null, 1, "abc", "abcabc"]]', 'lax $ ? (@[*] starts with "abc")'); + jsonb_path_query +---------------------------- + [null, 1, "abc", "abcabc"] +(1 row) + +select jsonb_path_query('[[null, 1, "abd", "abdabc"]]', 'lax $ ? ((@[*] starts with "abc") is unknown)'); + jsonb_path_query +---------------------------- + [null, 1, "abd", "abdabc"] +(1 row) + +select jsonb_path_query('[null, 1, "abd", "abdabc"]', 'lax $[*] ? ((@ starts with "abc") is unknown)'); + jsonb_path_query +------------------ + null + 1 +(2 rows) + +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c")'); + jsonb_path_query +------------------ + "abc" + "abdacb" +(2 rows) + +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "i")'); + jsonb_path_query +------------------ + "abc" + "aBdC" + "abdacb" +(3 rows) + +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "m")'); + jsonb_path_query +------------------ + "abc" + "abdacb" + "adc\nabc" +(3 rows) + +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "s")'); + jsonb_path_query +------------------ + "abc" + "abdacb" + "ab\nadc" +(3 rows) + +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "q")'); + jsonb_path_query +------------------ + "a\\b" + "^a\\b$" +(2 rows) + +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "")'); + jsonb_path_query +------------------ + "a\b" +(1 row) + +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "q")'); + jsonb_path_query +------------------ + "^a\\b$" +(1 row) + +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "q")'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "iq")'); + jsonb_path_query +------------------ + "^a\\b$" +(1 row) + +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "")'); + jsonb_path_query +------------------ + "a\b" +(1 row) + +select jsonb_path_query('null', '$.datetime()'); +ERROR: jsonpath item method .datetime() can only be applied to a string +select jsonb_path_query('true', '$.datetime()'); +ERROR: jsonpath item method .datetime() can only be applied to a string +select jsonb_path_query('1', '$.datetime()'); +ERROR: jsonpath item method .datetime() can only be applied to a string +select jsonb_path_query('[]', '$.datetime()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.datetime()'); +ERROR: jsonpath item method .datetime() can only be applied to a string +select jsonb_path_query('{}', '$.datetime()'); +ERROR: jsonpath item method .datetime() can only be applied to a string +select jsonb_path_query('"bogus"', '$.datetime()'); +ERROR: datetime format is not recognized: "bogus" +HINT: Use a datetime template argument to specify the input data format. +select jsonb_path_query('"12:34"', '$.datetime("aaa")'); +ERROR: invalid datetime format separator: "a" +select jsonb_path_query('"aaaa"', '$.datetime("HH24")'); +ERROR: invalid value "aa" for "HH24" +DETAIL: Value must be an integer. +select jsonb '"10-03-2017"' @? '$.datetime("dd-mm-yyyy")'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy")'); + jsonb_path_query +------------------ + "2017-03-10" +(1 row) + +select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy").type()'); + jsonb_path_query +------------------ + "date" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy")'); +ERROR: trailing characters remain in input string after datetime format +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy").type()'); +ERROR: trailing characters remain in input string after datetime format +select jsonb_path_query('"10-03-2017 12:34"', ' $.datetime("dd-mm-yyyy HH24:MI").type()'); + jsonb_path_query +------------------------------- + "timestamp without time zone" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM").type()'); + jsonb_path_query +---------------------------- + "timestamp with time zone" +(1 row) + +select jsonb_path_query('"12:34:56"', '$.datetime("HH24:MI:SS").type()'); + jsonb_path_query +-------------------------- + "time without time zone" +(1 row) + +select jsonb_path_query('"12:34:56 +05:20"', '$.datetime("HH24:MI:SS TZH:TZM").type()'); + jsonb_path_query +----------------------- + "time with time zone" +(1 row) + +select jsonb_path_query('"10-03-2017T12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); + jsonb_path_query +----------------------- + "2017-03-10T12:34:56" +(1 row) + +select jsonb_path_query('"10-03-2017t12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); +ERROR: unmatched format character "T" +select jsonb_path_query('"10-03-2017 12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); +ERROR: unmatched format character "T" +set time zone '+00'; +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); + jsonb_path_query +----------------------- + "2017-03-10T12:34:00" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +ERROR: input string is too short for datetime format +select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:00+05:00" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:00-05:00" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:00+05:20" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:00-05:20" +(1 row) + +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")'); + jsonb_path_query +------------------ + "12:34:00" +(1 row) + +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")'); +ERROR: input string is too short for datetime format +select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")'); + jsonb_path_query +------------------ + "12:34:00+05:00" +(1 row) + +select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")'); + jsonb_path_query +------------------ + "12:34:00-05:00" +(1 row) + +select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")'); + jsonb_path_query +------------------ + "12:34:00+05:20" +(1 row) + +select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); + jsonb_path_query +------------------ + "12:34:00-05:20" +(1 row) + +set time zone '+10'; +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); + jsonb_path_query +----------------------- + "2017-03-10T12:34:00" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +ERROR: input string is too short for datetime format +select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:00+05:00" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:00-05:00" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:00+05:20" +(1 row) + +select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:00-05:20" +(1 row) + +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")'); + jsonb_path_query +------------------ + "12:34:00" +(1 row) + +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")'); +ERROR: input string is too short for datetime format +select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")'); + jsonb_path_query +------------------ + "12:34:00+05:00" +(1 row) + +select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")'); + jsonb_path_query +------------------ + "12:34:00-05:00" +(1 row) + +select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")'); + jsonb_path_query +------------------ + "12:34:00+05:20" +(1 row) + +select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); + jsonb_path_query +------------------ + "12:34:00-05:20" +(1 row) + +set time zone default; +select jsonb_path_query('"2017-03-10"', '$.datetime().type()'); + jsonb_path_query +------------------ + "date" +(1 row) + +select jsonb_path_query('"2017-03-10"', '$.datetime()'); + jsonb_path_query +------------------ + "2017-03-10" +(1 row) + +select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime().type()'); + jsonb_path_query +------------------------------- + "timestamp without time zone" +(1 row) + +select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime()'); + jsonb_path_query +----------------------- + "2017-03-10T12:34:56" +(1 row) + +select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime().type()'); + jsonb_path_query +---------------------------- + "timestamp with time zone" +(1 row) + +select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime()'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:56+03:00" +(1 row) + +select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime().type()'); + jsonb_path_query +---------------------------- + "timestamp with time zone" +(1 row) + +select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime()'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:56+03:10" +(1 row) + +select jsonb_path_query('"2017-03-10T12:34:56+3:10"', '$.datetime()'); + jsonb_path_query +----------------------------- + "2017-03-10T12:34:56+03:10" +(1 row) + +select jsonb_path_query('"2017-03-10t12:34:56+3:10"', '$.datetime()'); +ERROR: datetime format is not recognized: "2017-03-10t12:34:56+3:10" +HINT: Use a datetime template argument to specify the input data format. +select jsonb_path_query('"12:34:56"', '$.datetime().type()'); + jsonb_path_query +-------------------------- + "time without time zone" +(1 row) + +select jsonb_path_query('"12:34:56"', '$.datetime()'); + jsonb_path_query +------------------ + "12:34:56" +(1 row) + +select jsonb_path_query('"12:34:56+3"', '$.datetime().type()'); + jsonb_path_query +----------------------- + "time with time zone" +(1 row) + +select jsonb_path_query('"12:34:56+3"', '$.datetime()'); + jsonb_path_query +------------------ + "12:34:56+03:00" +(1 row) + +select jsonb_path_query('"12:34:56+3:10"', '$.datetime().type()'); + jsonb_path_query +----------------------- + "time with time zone" +(1 row) + +select jsonb_path_query('"12:34:56+3:10"', '$.datetime()'); + jsonb_path_query +------------------ + "12:34:56+03:10" +(1 row) + +set time zone '+00'; +-- date comparison +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))'); +ERROR: cannot convert value from date to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))'); +ERROR: cannot convert value from date to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); +ERROR: cannot convert value from date to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-10" + "2017-03-10T00:00:00" + "2017-03-10T03:00:00+03:00" +(3 rows) + +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-10" + "2017-03-11" + "2017-03-10T00:00:00" + "2017-03-10T12:34:56" + "2017-03-10T03:00:00+03:00" +(5 rows) + +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-09" + "2017-03-10T01:02:03+04:00" +(2 rows) + +-- time comparison +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))'); + jsonb_path_query_tz +--------------------- + "12:35:00" + "12:35:00+00:00" +(2 rows) + +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))'); + jsonb_path_query_tz +--------------------- + "12:35:00" + "12:36:00" + "12:35:00+00:00" +(3 rows) + +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))'); + jsonb_path_query_tz +--------------------- + "12:34:00" + "12:35:00+01:00" + "13:35:00+01:00" +(3 rows) + +-- timetz comparison +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))'); + jsonb_path_query_tz +--------------------- + "12:35:00+01:00" +(1 row) + +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))'); + jsonb_path_query_tz +--------------------- + "12:35:00+01:00" + "12:36:00+01:00" + "12:35:00-02:00" + "11:35:00" + "12:35:00" +(5 rows) + +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))'); + jsonb_path_query_tz +--------------------- + "12:34:00+01:00" + "12:35:00+02:00" + "10:35:00" +(3 rows) + +-- timestamp comparison +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00" + "2017-03-10T13:35:00+01:00" +(2 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00" + "2017-03-10T12:36:00" + "2017-03-10T13:35:00+01:00" + "2017-03-10T12:35:00-01:00" + "2017-03-11" +(5 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:34:00" + "2017-03-10T12:35:00+01:00" + "2017-03-10" +(3 rows) + +-- timestamptz comparison +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00+01:00" + "2017-03-10T11:35:00" +(2 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00+01:00" + "2017-03-10T12:36:00+01:00" + "2017-03-10T12:35:00-02:00" + "2017-03-10T11:35:00" + "2017-03-10T12:35:00" + "2017-03-11" +(6 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:34:00+01:00" + "2017-03-10T12:35:00+02:00" + "2017-03-10T10:35:00" + "2017-03-10" +(4 rows) + +-- overflow during comparison +select jsonb_path_query('"1000000-01-01"', '$.datetime() > "2020-01-01 12:00:00".datetime()'::jsonpath); + jsonb_path_query +------------------ + true +(1 row) + +set time zone default; +-- jsonpath operators +SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*]'); + jsonb_path_query +------------------ + {"a": 1} + {"a": 2} +(2 rows) + +SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*] ? (@.a > 10)'); + jsonb_path_query +------------------ +(0 rows) + +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); +ERROR: JSON object does not contain key "a" +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a'); + jsonb_path_query_array +------------------------ + [1, 2] +(1 row) + +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); + jsonb_path_query_array +------------------------ + [1] +(1 row) + +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); + jsonb_path_query_array +------------------------ + [] +(1 row) + +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}'); + jsonb_path_query_array +------------------------ + [2, 3] +(1 row) + +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}'); + jsonb_path_query_array +------------------------ + [] +(1 row) + +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); +ERROR: JSON object does not contain key "a" +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a', silent => true); + jsonb_path_query_first +------------------------ + 1 +(1 row) + +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a'); + jsonb_path_query_first +------------------------ + 1 +(1 row) + +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); + jsonb_path_query_first +------------------------ + 1 +(1 row) + +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); + jsonb_path_query_first +------------------------ + +(1 row) + +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}'); + jsonb_path_query_first +------------------------ + 2 +(1 row) + +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}'); + jsonb_path_query_first +------------------------ + +(1 row) + +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*].a ? (@ > 1)'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*] ? (@.a > 2)'; + ?column? +---------- + f +(1 row) + +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 1)'); + jsonb_path_exists +------------------- + t +(1 row) + +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 1, "max": 4}'); + jsonb_path_exists +------------------- + t +(1 row) + +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 3, "max": 4}'); + jsonb_path_exists +------------------- + f +(1 row) + +SELECT jsonb_path_match('true', '$', silent => false); + jsonb_path_match +------------------ + t +(1 row) + +SELECT jsonb_path_match('false', '$', silent => false); + jsonb_path_match +------------------ + f +(1 row) + +SELECT jsonb_path_match('null', '$', silent => false); + jsonb_path_match +------------------ + +(1 row) + +SELECT jsonb_path_match('1', '$', silent => true); + jsonb_path_match +------------------ + +(1 row) + +SELECT jsonb_path_match('1', '$', silent => false); +ERROR: single boolean result is expected +SELECT jsonb_path_match('"a"', '$', silent => false); +ERROR: single boolean result is expected +SELECT jsonb_path_match('{}', '$', silent => false); +ERROR: single boolean result is expected +SELECT jsonb_path_match('[true]', '$', silent => false); +ERROR: single boolean result is expected +SELECT jsonb_path_match('{}', 'lax $.a', silent => false); +ERROR: single boolean result is expected +SELECT jsonb_path_match('{}', 'strict $.a', silent => false); +ERROR: JSON object does not contain key "a" +SELECT jsonb_path_match('{}', 'strict $.a', silent => true); + jsonb_path_match +------------------ + +(1 row) + +SELECT jsonb_path_match('[true, true]', '$[*]', silent => false); +ERROR: single boolean result is expected +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 1'; + ?column? +---------- + t +(1 row) + +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 2'; + ?column? +---------- + f +(1 row) + +SELECT jsonb_path_match('[{"a": 1}, {"a": 2}]', '$[*].a > 1'); + jsonb_path_match +------------------ + t +(1 row) + +-- test string comparison (Unicode codepoint collation) +WITH str(j, num) AS +( + SELECT jsonb_build_object('s', s), num + FROM unnest('{"", "a", "ab", "abc", "abcd", "b", "A", "AB", "ABC", "ABc", "ABcD", "B"}'::text[]) WITH ORDINALITY AS a(s, num) +) +SELECT + s1.j, s2.j, + jsonb_path_query_first(s1.j, '$.s < $s', vars => s2.j) lt, + jsonb_path_query_first(s1.j, '$.s <= $s', vars => s2.j) le, + jsonb_path_query_first(s1.j, '$.s == $s', vars => s2.j) eq, + jsonb_path_query_first(s1.j, '$.s >= $s', vars => s2.j) ge, + jsonb_path_query_first(s1.j, '$.s > $s', vars => s2.j) gt +FROM str s1, str s2 +ORDER BY s1.num, s2.num; + j | j | lt | le | eq | ge | gt +---------------+---------------+-------+-------+-------+-------+------- + {"s": ""} | {"s": ""} | false | true | true | true | false + {"s": ""} | {"s": "a"} | true | true | false | false | false + {"s": ""} | {"s": "ab"} | true | true | false | false | false + {"s": ""} | {"s": "abc"} | true | true | false | false | false + {"s": ""} | {"s": "abcd"} | true | true | false | false | false + {"s": ""} | {"s": "b"} | true | true | false | false | false + {"s": ""} | {"s": "A"} | true | true | false | false | false + {"s": ""} | {"s": "AB"} | true | true | false | false | false + {"s": ""} | {"s": "ABC"} | true | true | false | false | false + {"s": ""} | {"s": "ABc"} | true | true | false | false | false + {"s": ""} | {"s": "ABcD"} | true | true | false | false | false + {"s": ""} | {"s": "B"} | true | true | false | false | false + {"s": "a"} | {"s": ""} | false | false | false | true | true + {"s": "a"} | {"s": "a"} | false | true | true | true | false + {"s": "a"} | {"s": "ab"} | true | true | false | false | false + {"s": "a"} | {"s": "abc"} | true | true | false | false | false + {"s": "a"} | {"s": "abcd"} | true | true | false | false | false + {"s": "a"} | {"s": "b"} | true | true | false | false | false + {"s": "a"} | {"s": "A"} | false | false | false | true | true + {"s": "a"} | {"s": "AB"} | false | false | false | true | true + {"s": "a"} | {"s": "ABC"} | false | false | false | true | true + {"s": "a"} | {"s": "ABc"} | false | false | false | true | true + {"s": "a"} | {"s": "ABcD"} | false | false | false | true | true + {"s": "a"} | {"s": "B"} | false | false | false | true | true + {"s": "ab"} | {"s": ""} | false | false | false | true | true + {"s": "ab"} | {"s": "a"} | false | false | false | true | true + {"s": "ab"} | {"s": "ab"} | false | true | true | true | false + {"s": "ab"} | {"s": "abc"} | true | true | false | false | false + {"s": "ab"} | {"s": "abcd"} | true | true | false | false | false + {"s": "ab"} | {"s": "b"} | true | true | false | false | false + {"s": "ab"} | {"s": "A"} | false | false | false | true | true + {"s": "ab"} | {"s": "AB"} | false | false | false | true | true + {"s": "ab"} | {"s": "ABC"} | false | false | false | true | true + {"s": "ab"} | {"s": "ABc"} | false | false | false | true | true + {"s": "ab"} | {"s": "ABcD"} | false | false | false | true | true + {"s": "ab"} | {"s": "B"} | false | false | false | true | true + {"s": "abc"} | {"s": ""} | false | false | false | true | true + {"s": "abc"} | {"s": "a"} | false | false | false | true | true + {"s": "abc"} | {"s": "ab"} | false | false | false | true | true + {"s": "abc"} | {"s": "abc"} | false | true | true | true | false + {"s": "abc"} | {"s": "abcd"} | true | true | false | false | false + {"s": "abc"} | {"s": "b"} | true | true | false | false | false + {"s": "abc"} | {"s": "A"} | false | false | false | true | true + {"s": "abc"} | {"s": "AB"} | false | false | false | true | true + {"s": "abc"} | {"s": "ABC"} | false | false | false | true | true + {"s": "abc"} | {"s": "ABc"} | false | false | false | true | true + {"s": "abc"} | {"s": "ABcD"} | false | false | false | true | true + {"s": "abc"} | {"s": "B"} | false | false | false | true | true + {"s": "abcd"} | {"s": ""} | false | false | false | true | true + {"s": "abcd"} | {"s": "a"} | false | false | false | true | true + {"s": "abcd"} | {"s": "ab"} | false | false | false | true | true + {"s": "abcd"} | {"s": "abc"} | false | false | false | true | true + {"s": "abcd"} | {"s": "abcd"} | false | true | true | true | false + {"s": "abcd"} | {"s": "b"} | true | true | false | false | false + {"s": "abcd"} | {"s": "A"} | false | false | false | true | true + {"s": "abcd"} | {"s": "AB"} | false | false | false | true | true + {"s": "abcd"} | {"s": "ABC"} | false | false | false | true | true + {"s": "abcd"} | {"s": "ABc"} | false | false | false | true | true + {"s": "abcd"} | {"s": "ABcD"} | false | false | false | true | true + {"s": "abcd"} | {"s": "B"} | false | false | false | true | true + {"s": "b"} | {"s": ""} | false | false | false | true | true + {"s": "b"} | {"s": "a"} | false | false | false | true | true + {"s": "b"} | {"s": "ab"} | false | false | false | true | true + {"s": "b"} | {"s": "abc"} | false | false | false | true | true + {"s": "b"} | {"s": "abcd"} | false | false | false | true | true + {"s": "b"} | {"s": "b"} | false | true | true | true | false + {"s": "b"} | {"s": "A"} | false | false | false | true | true + {"s": "b"} | {"s": "AB"} | false | false | false | true | true + {"s": "b"} | {"s": "ABC"} | false | false | false | true | true + {"s": "b"} | {"s": "ABc"} | false | false | false | true | true + {"s": "b"} | {"s": "ABcD"} | false | false | false | true | true + {"s": "b"} | {"s": "B"} | false | false | false | true | true + {"s": "A"} | {"s": ""} | false | false | false | true | true + {"s": "A"} | {"s": "a"} | true | true | false | false | false + {"s": "A"} | {"s": "ab"} | true | true | false | false | false + {"s": "A"} | {"s": "abc"} | true | true | false | false | false + {"s": "A"} | {"s": "abcd"} | true | true | false | false | false + {"s": "A"} | {"s": "b"} | true | true | false | false | false + {"s": "A"} | {"s": "A"} | false | true | true | true | false + {"s": "A"} | {"s": "AB"} | true | true | false | false | false + {"s": "A"} | {"s": "ABC"} | true | true | false | false | false + {"s": "A"} | {"s": "ABc"} | true | true | false | false | false + {"s": "A"} | {"s": "ABcD"} | true | true | false | false | false + {"s": "A"} | {"s": "B"} | true | true | false | false | false + {"s": "AB"} | {"s": ""} | false | false | false | true | true + {"s": "AB"} | {"s": "a"} | true | true | false | false | false + {"s": "AB"} | {"s": "ab"} | true | true | false | false | false + {"s": "AB"} | {"s": "abc"} | true | true | false | false | false + {"s": "AB"} | {"s": "abcd"} | true | true | false | false | false + {"s": "AB"} | {"s": "b"} | true | true | false | false | false + {"s": "AB"} | {"s": "A"} | false | false | false | true | true + {"s": "AB"} | {"s": "AB"} | false | true | true | true | false + {"s": "AB"} | {"s": "ABC"} | true | true | false | false | false + {"s": "AB"} | {"s": "ABc"} | true | true | false | false | false + {"s": "AB"} | {"s": "ABcD"} | true | true | false | false | false + {"s": "AB"} | {"s": "B"} | true | true | false | false | false + {"s": "ABC"} | {"s": ""} | false | false | false | true | true + {"s": "ABC"} | {"s": "a"} | true | true | false | false | false + {"s": "ABC"} | {"s": "ab"} | true | true | false | false | false + {"s": "ABC"} | {"s": "abc"} | true | true | false | false | false + {"s": "ABC"} | {"s": "abcd"} | true | true | false | false | false + {"s": "ABC"} | {"s": "b"} | true | true | false | false | false + {"s": "ABC"} | {"s": "A"} | false | false | false | true | true + {"s": "ABC"} | {"s": "AB"} | false | false | false | true | true + {"s": "ABC"} | {"s": "ABC"} | false | true | true | true | false + {"s": "ABC"} | {"s": "ABc"} | true | true | false | false | false + {"s": "ABC"} | {"s": "ABcD"} | true | true | false | false | false + {"s": "ABC"} | {"s": "B"} | true | true | false | false | false + {"s": "ABc"} | {"s": ""} | false | false | false | true | true + {"s": "ABc"} | {"s": "a"} | true | true | false | false | false + {"s": "ABc"} | {"s": "ab"} | true | true | false | false | false + {"s": "ABc"} | {"s": "abc"} | true | true | false | false | false + {"s": "ABc"} | {"s": "abcd"} | true | true | false | false | false + {"s": "ABc"} | {"s": "b"} | true | true | false | false | false + {"s": "ABc"} | {"s": "A"} | false | false | false | true | true + {"s": "ABc"} | {"s": "AB"} | false | false | false | true | true + {"s": "ABc"} | {"s": "ABC"} | false | false | false | true | true + {"s": "ABc"} | {"s": "ABc"} | false | true | true | true | false + {"s": "ABc"} | {"s": "ABcD"} | true | true | false | false | false + {"s": "ABc"} | {"s": "B"} | true | true | false | false | false + {"s": "ABcD"} | {"s": ""} | false | false | false | true | true + {"s": "ABcD"} | {"s": "a"} | true | true | false | false | false + {"s": "ABcD"} | {"s": "ab"} | true | true | false | false | false + {"s": "ABcD"} | {"s": "abc"} | true | true | false | false | false + {"s": "ABcD"} | {"s": "abcd"} | true | true | false | false | false + {"s": "ABcD"} | {"s": "b"} | true | true | false | false | false + {"s": "ABcD"} | {"s": "A"} | false | false | false | true | true + {"s": "ABcD"} | {"s": "AB"} | false | false | false | true | true + {"s": "ABcD"} | {"s": "ABC"} | false | false | false | true | true + {"s": "ABcD"} | {"s": "ABc"} | false | false | false | true | true + {"s": "ABcD"} | {"s": "ABcD"} | false | true | true | true | false + {"s": "ABcD"} | {"s": "B"} | true | true | false | false | false + {"s": "B"} | {"s": ""} | false | false | false | true | true + {"s": "B"} | {"s": "a"} | true | true | false | false | false + {"s": "B"} | {"s": "ab"} | true | true | false | false | false + {"s": "B"} | {"s": "abc"} | true | true | false | false | false + {"s": "B"} | {"s": "abcd"} | true | true | false | false | false + {"s": "B"} | {"s": "b"} | true | true | false | false | false + {"s": "B"} | {"s": "A"} | false | false | false | true | true + {"s": "B"} | {"s": "AB"} | false | false | false | true | true + {"s": "B"} | {"s": "ABC"} | false | false | false | true | true + {"s": "B"} | {"s": "ABc"} | false | false | false | true | true + {"s": "B"} | {"s": "ABcD"} | false | false | false | true | true + {"s": "B"} | {"s": "B"} | false | true | true | true | false +(144 rows) + diff --git a/src/test/singlenode_regress/expected/jsonpath.out b/src/test/singlenode_regress/expected/jsonpath.out new file mode 100644 index 00000000000..e399fa96312 --- /dev/null +++ b/src/test/singlenode_regress/expected/jsonpath.out @@ -0,0 +1,964 @@ +--jsonpath io +select ''::jsonpath; +ERROR: invalid input syntax for type jsonpath: "" +LINE 1: select ''::jsonpath; + ^ +select '$'::jsonpath; + jsonpath +---------- + $ +(1 row) + +select 'strict $'::jsonpath; + jsonpath +---------- + strict $ +(1 row) + +select 'lax $'::jsonpath; + jsonpath +---------- + $ +(1 row) + +select '$.a'::jsonpath; + jsonpath +---------- + $."a" +(1 row) + +select '$.a.v'::jsonpath; + jsonpath +----------- + $."a"."v" +(1 row) + +select '$.a.*'::jsonpath; + jsonpath +---------- + $."a".* +(1 row) + +select '$.*[*]'::jsonpath; + jsonpath +---------- + $.*[*] +(1 row) + +select '$.a[*]'::jsonpath; + jsonpath +---------- + $."a"[*] +(1 row) + +select '$.a[*][*]'::jsonpath; + jsonpath +------------- + $."a"[*][*] +(1 row) + +select '$[*]'::jsonpath; + jsonpath +---------- + $[*] +(1 row) + +select '$[0]'::jsonpath; + jsonpath +---------- + $[0] +(1 row) + +select '$[*][0]'::jsonpath; + jsonpath +---------- + $[*][0] +(1 row) + +select '$[*].a'::jsonpath; + jsonpath +---------- + $[*]."a" +(1 row) + +select '$[*][0].a.b'::jsonpath; + jsonpath +----------------- + $[*][0]."a"."b" +(1 row) + +select '$.a.**.b'::jsonpath; + jsonpath +-------------- + $."a".**."b" +(1 row) + +select '$.a.**{2}.b'::jsonpath; + jsonpath +----------------- + $."a".**{2}."b" +(1 row) + +select '$.a.**{2 to 2}.b'::jsonpath; + jsonpath +----------------- + $."a".**{2}."b" +(1 row) + +select '$.a.**{2 to 5}.b'::jsonpath; + jsonpath +---------------------- + $."a".**{2 to 5}."b" +(1 row) + +select '$.a.**{0 to 5}.b'::jsonpath; + jsonpath +---------------------- + $."a".**{0 to 5}."b" +(1 row) + +select '$.a.**{5 to last}.b'::jsonpath; + jsonpath +------------------------- + $."a".**{5 to last}."b" +(1 row) + +select '$.a.**{last}.b'::jsonpath; + jsonpath +-------------------- + $."a".**{last}."b" +(1 row) + +select '$.a.**{last to 5}.b'::jsonpath; + jsonpath +------------------------- + $."a".**{last to 5}."b" +(1 row) + +select '$+1'::jsonpath; + jsonpath +---------- + ($ + 1) +(1 row) + +select '$-1'::jsonpath; + jsonpath +---------- + ($ - 1) +(1 row) + +select '$--+1'::jsonpath; + jsonpath +---------- + ($ - -1) +(1 row) + +select '$.a/+-1'::jsonpath; + jsonpath +-------------- + ($."a" / -1) +(1 row) + +select '1 * 2 + 4 % -3 != false'::jsonpath; + jsonpath +--------------------------- + (1 * 2 + 4 % -3 != false) +(1 row) + +select '"\b\f\r\n\t\v\"\''\\"'::jsonpath; + jsonpath +------------------------- + "\b\f\r\n\t\u000b\"'\\" +(1 row) + +select '"\x50\u0067\u{53}\u{051}\u{00004C}"'::jsonpath; + jsonpath +---------- + "PgSQL" +(1 row) + +select '$.foo\x50\u0067\u{53}\u{051}\u{00004C}\t\"bar'::jsonpath; + jsonpath +--------------------- + $."fooPgSQL\t\"bar" +(1 row) + +select '"\z"'::jsonpath; -- unrecognized escape is just the literal char + jsonpath +---------- + "z" +(1 row) + +select '$.g ? ($.a == 1)'::jsonpath; + jsonpath +-------------------- + $."g"?($."a" == 1) +(1 row) + +select '$.g ? (@ == 1)'::jsonpath; + jsonpath +---------------- + $."g"?(@ == 1) +(1 row) + +select '$.g ? (@.a == 1)'::jsonpath; + jsonpath +-------------------- + $."g"?(@."a" == 1) +(1 row) + +select '$.g ? (@.a == 1 || @.a == 4)'::jsonpath; + jsonpath +---------------------------------- + $."g"?(@."a" == 1 || @."a" == 4) +(1 row) + +select '$.g ? (@.a == 1 && @.a == 4)'::jsonpath; + jsonpath +---------------------------------- + $."g"?(@."a" == 1 && @."a" == 4) +(1 row) + +select '$.g ? (@.a == 1 || @.a == 4 && @.b == 7)'::jsonpath; + jsonpath +------------------------------------------------ + $."g"?(@."a" == 1 || @."a" == 4 && @."b" == 7) +(1 row) + +select '$.g ? (@.a == 1 || !(@.a == 4) && @.b == 7)'::jsonpath; + jsonpath +--------------------------------------------------- + $."g"?(@."a" == 1 || !(@."a" == 4) && @."b" == 7) +(1 row) + +select '$.g ? (@.a == 1 || !(@.x >= 123 || @.a == 4) && @.b == 7)'::jsonpath; + jsonpath +------------------------------------------------------------------- + $."g"?(@."a" == 1 || !(@."x" >= 123 || @."a" == 4) && @."b" == 7) +(1 row) + +select '$.g ? (@.x >= @[*]?(@.a > "abc"))'::jsonpath; + jsonpath +--------------------------------------- + $."g"?(@."x" >= @[*]?(@."a" > "abc")) +(1 row) + +select '$.g ? ((@.x >= 123 || @.a == 4) is unknown)'::jsonpath; + jsonpath +------------------------------------------------- + $."g"?((@."x" >= 123 || @."a" == 4) is unknown) +(1 row) + +select '$.g ? (exists (@.x))'::jsonpath; + jsonpath +------------------------ + $."g"?(exists (@."x")) +(1 row) + +select '$.g ? (exists (@.x ? (@ == 14)))'::jsonpath; + jsonpath +---------------------------------- + $."g"?(exists (@."x"?(@ == 14))) +(1 row) + +select '$.g ? ((@.x >= 123 || @.a == 4) && exists (@.x ? (@ == 14)))'::jsonpath; + jsonpath +------------------------------------------------------------------ + $."g"?((@."x" >= 123 || @."a" == 4) && exists (@."x"?(@ == 14))) +(1 row) + +select '$.g ? (+@.x >= +-(+@.a + 2))'::jsonpath; + jsonpath +------------------------------------ + $."g"?(+@."x" >= +(-(+@."a" + 2))) +(1 row) + +select '$a'::jsonpath; + jsonpath +---------- + $"a" +(1 row) + +select '$a.b'::jsonpath; + jsonpath +---------- + $"a"."b" +(1 row) + +select '$a[*]'::jsonpath; + jsonpath +---------- + $"a"[*] +(1 row) + +select '$.g ? (@.zip == $zip)'::jsonpath; + jsonpath +--------------------------- + $."g"?(@."zip" == $"zip") +(1 row) + +select '$.a[1,2, 3 to 16]'::jsonpath; + jsonpath +-------------------- + $."a"[1,2,3 to 16] +(1 row) + +select '$.a[$a + 1, ($b[*]) to -($[0] * 2)]'::jsonpath; + jsonpath +---------------------------------------- + $."a"[$"a" + 1,$"b"[*] to -($[0] * 2)] +(1 row) + +select '$.a[$.a.size() - 3]'::jsonpath; + jsonpath +------------------------- + $."a"[$."a".size() - 3] +(1 row) + +select 'last'::jsonpath; +ERROR: LAST is allowed only in array subscripts +LINE 1: select 'last'::jsonpath; + ^ +select '"last"'::jsonpath; + jsonpath +---------- + "last" +(1 row) + +select '$.last'::jsonpath; + jsonpath +---------- + $."last" +(1 row) + +select '$ ? (last > 0)'::jsonpath; +ERROR: LAST is allowed only in array subscripts +LINE 1: select '$ ? (last > 0)'::jsonpath; + ^ +select '$[last]'::jsonpath; + jsonpath +---------- + $[last] +(1 row) + +select '$[$[0] ? (last > 0)]'::jsonpath; + jsonpath +-------------------- + $[$[0]?(last > 0)] +(1 row) + +select 'null.type()'::jsonpath; + jsonpath +------------- + null.type() +(1 row) + +select '1.type()'::jsonpath; + jsonpath +---------- + 1.type() +(1 row) + +select '(1).type()'::jsonpath; + jsonpath +---------- + 1.type() +(1 row) + +select '1.2.type()'::jsonpath; + jsonpath +------------ + 1.2.type() +(1 row) + +select '"aaa".type()'::jsonpath; + jsonpath +-------------- + "aaa".type() +(1 row) + +select 'true.type()'::jsonpath; + jsonpath +------------- + true.type() +(1 row) + +select '$.double().floor().ceiling().abs()'::jsonpath; + jsonpath +------------------------------------ + $.double().floor().ceiling().abs() +(1 row) + +select '$.keyvalue().key'::jsonpath; + jsonpath +-------------------- + $.keyvalue()."key" +(1 row) + +select '$.datetime()'::jsonpath; + jsonpath +-------------- + $.datetime() +(1 row) + +select '$.datetime("datetime template")'::jsonpath; + jsonpath +--------------------------------- + $.datetime("datetime template") +(1 row) + +select '$ ? (@ starts with "abc")'::jsonpath; + jsonpath +------------------------- + $?(@ starts with "abc") +(1 row) + +select '$ ? (@ starts with $var)'::jsonpath; + jsonpath +-------------------------- + $?(@ starts with $"var") +(1 row) + +select '$ ? (@ like_regex "(invalid pattern")'::jsonpath; +ERROR: invalid regular expression: parentheses () not balanced +LINE 1: select '$ ? (@ like_regex "(invalid pattern")'::jsonpath; + ^ +select '$ ? (@ like_regex "pattern")'::jsonpath; + jsonpath +---------------------------- + $?(@ like_regex "pattern") +(1 row) + +select '$ ? (@ like_regex "pattern" flag "")'::jsonpath; + jsonpath +---------------------------- + $?(@ like_regex "pattern") +(1 row) + +select '$ ? (@ like_regex "pattern" flag "i")'::jsonpath; + jsonpath +------------------------------------- + $?(@ like_regex "pattern" flag "i") +(1 row) + +select '$ ? (@ like_regex "pattern" flag "is")'::jsonpath; + jsonpath +-------------------------------------- + $?(@ like_regex "pattern" flag "is") +(1 row) + +select '$ ? (@ like_regex "pattern" flag "isim")'::jsonpath; + jsonpath +--------------------------------------- + $?(@ like_regex "pattern" flag "ism") +(1 row) + +select '$ ? (@ like_regex "pattern" flag "xsms")'::jsonpath; +ERROR: XQuery "x" flag (expanded regular expressions) is not implemented +LINE 1: select '$ ? (@ like_regex "pattern" flag "xsms")'::jsonpath; + ^ +select '$ ? (@ like_regex "pattern" flag "q")'::jsonpath; + jsonpath +------------------------------------- + $?(@ like_regex "pattern" flag "q") +(1 row) + +select '$ ? (@ like_regex "pattern" flag "iq")'::jsonpath; + jsonpath +-------------------------------------- + $?(@ like_regex "pattern" flag "iq") +(1 row) + +select '$ ? (@ like_regex "pattern" flag "smixq")'::jsonpath; + jsonpath +----------------------------------------- + $?(@ like_regex "pattern" flag "ismxq") +(1 row) + +select '$ ? (@ like_regex "pattern" flag "a")'::jsonpath; +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$ ? (@ like_regex "pattern" flag "a")'::jsonpath; + ^ +DETAIL: unrecognized flag character "a" in LIKE_REGEX predicate +select '$ < 1'::jsonpath; + jsonpath +---------- + ($ < 1) +(1 row) + +select '($ < 1) || $.a.b <= $x'::jsonpath; + jsonpath +------------------------------ + ($ < 1 || $."a"."b" <= $"x") +(1 row) + +select '@ + 1'::jsonpath; +ERROR: @ is not allowed in root expressions +LINE 1: select '@ + 1'::jsonpath; + ^ +select '($).a.b'::jsonpath; + jsonpath +----------- + $."a"."b" +(1 row) + +select '($.a.b).c.d'::jsonpath; + jsonpath +------------------- + $."a"."b"."c"."d" +(1 row) + +select '($.a.b + -$.x.y).c.d'::jsonpath; + jsonpath +---------------------------------- + ($."a"."b" + -$."x"."y")."c"."d" +(1 row) + +select '(-+$.a.b).c.d'::jsonpath; + jsonpath +------------------------- + (-(+$."a"."b"))."c"."d" +(1 row) + +select '1 + ($.a.b + 2).c.d'::jsonpath; + jsonpath +------------------------------- + (1 + ($."a"."b" + 2)."c"."d") +(1 row) + +select '1 + ($.a.b > 2).c.d'::jsonpath; + jsonpath +------------------------------- + (1 + ($."a"."b" > 2)."c"."d") +(1 row) + +select '($)'::jsonpath; + jsonpath +---------- + $ +(1 row) + +select '(($))'::jsonpath; + jsonpath +---------- + $ +(1 row) + +select '((($ + 1)).a + ((2)).b ? ((((@ > 1)) || (exists(@.c)))))'::jsonpath; + jsonpath +------------------------------------------------- + (($ + 1)."a" + 2."b"?(@ > 1 || exists (@."c"))) +(1 row) + +select '$ ? (@.a < 1)'::jsonpath; + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + +select '$ ? (@.a < -1)'::jsonpath; + jsonpath +---------------- + $?(@."a" < -1) +(1 row) + +select '$ ? (@.a < +1)'::jsonpath; + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + +select '$ ? (@.a < .1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < .1)'::jsonpath; + ^ +select '$ ? (@.a < -.1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < -.1)'::jsonpath; + ^ +select '$ ? (@.a < +.1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < +.1)'::jsonpath; + ^ +select '$ ? (@.a < 0.1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < 0.1) +(1 row) + +select '$ ? (@.a < -0.1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < -0.1) +(1 row) + +select '$ ? (@.a < +0.1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < 0.1) +(1 row) + +select '$ ? (@.a < 10.1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < 10.1) +(1 row) + +select '$ ? (@.a < -10.1)'::jsonpath; + jsonpath +------------------- + $?(@."a" < -10.1) +(1 row) + +select '$ ? (@.a < +10.1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < 10.1) +(1 row) + +select '$ ? (@.a < 1e1)'::jsonpath; + jsonpath +---------------- + $?(@."a" < 10) +(1 row) + +select '$ ? (@.a < -1e1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < -10) +(1 row) + +select '$ ? (@.a < +1e1)'::jsonpath; + jsonpath +---------------- + $?(@."a" < 10) +(1 row) + +select '$ ? (@.a < .1e1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < .1e1)'::jsonpath; + ^ +select '$ ? (@.a < -.1e1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < -.1e1)'::jsonpath; + ^ +select '$ ? (@.a < +.1e1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < +.1e1)'::jsonpath; + ^ +select '$ ? (@.a < 0.1e1)'::jsonpath; + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + +select '$ ? (@.a < -0.1e1)'::jsonpath; + jsonpath +---------------- + $?(@."a" < -1) +(1 row) + +select '$ ? (@.a < +0.1e1)'::jsonpath; + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + +select '$ ? (@.a < 10.1e1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < 101) +(1 row) + +select '$ ? (@.a < -10.1e1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < -101) +(1 row) + +select '$ ? (@.a < +10.1e1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < 101) +(1 row) + +select '$ ? (@.a < 1e-1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < 0.1) +(1 row) + +select '$ ? (@.a < -1e-1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < -0.1) +(1 row) + +select '$ ? (@.a < +1e-1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < 0.1) +(1 row) + +select '$ ? (@.a < .1e-1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < .1e-1)'::jsonpath; + ^ +select '$ ? (@.a < -.1e-1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < -.1e-1)'::jsonpath; + ^ +select '$ ? (@.a < +.1e-1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < +.1e-1)'::jsonpath; + ^ +select '$ ? (@.a < 0.1e-1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < 0.01) +(1 row) + +select '$ ? (@.a < -0.1e-1)'::jsonpath; + jsonpath +------------------- + $?(@."a" < -0.01) +(1 row) + +select '$ ? (@.a < +0.1e-1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < 0.01) +(1 row) + +select '$ ? (@.a < 10.1e-1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < 1.01) +(1 row) + +select '$ ? (@.a < -10.1e-1)'::jsonpath; + jsonpath +------------------- + $?(@."a" < -1.01) +(1 row) + +select '$ ? (@.a < +10.1e-1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < 1.01) +(1 row) + +select '$ ? (@.a < 1e+1)'::jsonpath; + jsonpath +---------------- + $?(@."a" < 10) +(1 row) + +select '$ ? (@.a < -1e+1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < -10) +(1 row) + +select '$ ? (@.a < +1e+1)'::jsonpath; + jsonpath +---------------- + $?(@."a" < 10) +(1 row) + +select '$ ? (@.a < .1e+1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < .1e+1)'::jsonpath; + ^ +select '$ ? (@.a < -.1e+1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < -.1e+1)'::jsonpath; + ^ +select '$ ? (@.a < +.1e+1)'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '$ ? (@.a < +.1e+1)'::jsonpath; + ^ +select '$ ? (@.a < 0.1e+1)'::jsonpath; + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + +select '$ ? (@.a < -0.1e+1)'::jsonpath; + jsonpath +---------------- + $?(@."a" < -1) +(1 row) + +select '$ ? (@.a < +0.1e+1)'::jsonpath; + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + +select '$ ? (@.a < 10.1e+1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < 101) +(1 row) + +select '$ ? (@.a < -10.1e+1)'::jsonpath; + jsonpath +------------------ + $?(@."a" < -101) +(1 row) + +select '$ ? (@.a < +10.1e+1)'::jsonpath; + jsonpath +----------------- + $?(@."a" < 101) +(1 row) + +select '0'::jsonpath; + jsonpath +---------- + 0 +(1 row) + +select '00'::jsonpath; +ERROR: syntax error, unexpected IDENT_P at end of jsonpath input +LINE 1: select '00'::jsonpath; + ^ +select '0.0'::jsonpath; + jsonpath +---------- + 0.0 +(1 row) + +select '0.000'::jsonpath; + jsonpath +---------- + 0.000 +(1 row) + +select '0.000e1'::jsonpath; + jsonpath +---------- + 0.00 +(1 row) + +select '0.000e2'::jsonpath; + jsonpath +---------- + 0.0 +(1 row) + +select '0.000e3'::jsonpath; + jsonpath +---------- + 0 +(1 row) + +select '0.0010'::jsonpath; + jsonpath +---------- + 0.0010 +(1 row) + +select '0.0010e-1'::jsonpath; + jsonpath +---------- + 0.00010 +(1 row) + +select '0.0010e+1'::jsonpath; + jsonpath +---------- + 0.010 +(1 row) + +select '0.0010e+2'::jsonpath; + jsonpath +---------- + 0.10 +(1 row) + +select '1e'::jsonpath; +ERROR: invalid floating point number at or near "1e" of jsonpath input +LINE 1: select '1e'::jsonpath; + ^ +select '1.e'::jsonpath; + jsonpath +---------- + 1."e" +(1 row) + +select '1.2e'::jsonpath; +ERROR: invalid floating point number at or near "1.2e" of jsonpath input +LINE 1: select '1.2e'::jsonpath; + ^ +select '1.2.e'::jsonpath; + jsonpath +---------- + 1.2."e" +(1 row) + +select '(1.2).e'::jsonpath; + jsonpath +---------- + 1.2."e" +(1 row) + +select '1e3'::jsonpath; + jsonpath +---------- + 1000 +(1 row) + +select '1.e3'::jsonpath; + jsonpath +---------- + 1."e3" +(1 row) + +select '1.e3.e'::jsonpath; + jsonpath +------------ + 1."e3"."e" +(1 row) + +select '1.e3.e4'::jsonpath; + jsonpath +------------- + 1."e3"."e4" +(1 row) + +select '1.2e3'::jsonpath; + jsonpath +---------- + 1200 +(1 row) + +select '1.2.e3'::jsonpath; + jsonpath +---------- + 1.2."e3" +(1 row) + +select '(1.2).e3'::jsonpath; + jsonpath +---------- + 1.2."e3" +(1 row) + +select '1..e'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '1..e'::jsonpath; + ^ +select '1..e3'::jsonpath; +ERROR: syntax error, unexpected '.' at or near "." of jsonpath input +LINE 1: select '1..e3'::jsonpath; + ^ +select '(1.).e'::jsonpath; +ERROR: syntax error, unexpected ')' at or near ")" of jsonpath input +LINE 1: select '(1.).e'::jsonpath; + ^ +select '(1.).e3'::jsonpath; +ERROR: syntax error, unexpected ')' at or near ")" of jsonpath input +LINE 1: select '(1.).e3'::jsonpath; + ^ diff --git a/src/test/singlenode_regress/expected/jsonpath_encoding.out b/src/test/singlenode_regress/expected/jsonpath_encoding.out new file mode 100644 index 00000000000..7cbfb6abcf3 --- /dev/null +++ b/src/test/singlenode_regress/expected/jsonpath_encoding.out @@ -0,0 +1,180 @@ +-- +-- encoding-sensitive tests for jsonpath +-- +-- We provide expected-results files for UTF8 (jsonpath_encoding.out) +-- and for SQL_ASCII (jsonpath_encoding_1.out). Skip otherwise. +SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') + AS skip_test \gset +\if :skip_test +\quit +\endif +SELECT getdatabaseencoding(); -- just to label the results files + getdatabaseencoding +--------------------- + UTF8 +(1 row) + +-- checks for double-quoted values +-- basic unicode input +SELECT '"\u"'::jsonpath; -- ERROR, incomplete escape +ERROR: invalid unicode sequence at or near "\u" of jsonpath input +LINE 1: SELECT '"\u"'::jsonpath; + ^ +SELECT '"\u00"'::jsonpath; -- ERROR, incomplete escape +ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +LINE 1: SELECT '"\u00"'::jsonpath; + ^ +SELECT '"\u000g"'::jsonpath; -- ERROR, g is not a hex digit +ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +LINE 1: SELECT '"\u000g"'::jsonpath; + ^ +SELECT '"\u0000"'::jsonpath; -- OK, legal escape +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT '"\u0000"'::jsonpath; + ^ +DETAIL: \u0000 cannot be converted to text. +SELECT '"\uaBcD"'::jsonpath; -- OK, uppercase and lower case both OK + jsonpath +---------- + "ꯍ" +(1 row) + +-- handling of unicode surrogate pairs +select '"\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_utf8; + correct_in_utf8 +----------------- + "😄🐶" +(1 row) + +select '"\ud83d\ud83d"'::jsonpath; -- 2 high surrogates in a row +ERROR: invalid input syntax for type jsonpath +LINE 1: select '"\ud83d\ud83d"'::jsonpath; + ^ +DETAIL: Unicode high surrogate must not follow a high surrogate. +select '"\ude04\ud83d"'::jsonpath; -- surrogates in wrong order +ERROR: invalid input syntax for type jsonpath +LINE 1: select '"\ude04\ud83d"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +select '"\ud83dX"'::jsonpath; -- orphan high surrogate +ERROR: invalid input syntax for type jsonpath +LINE 1: select '"\ud83dX"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +select '"\ude04X"'::jsonpath; -- orphan low surrogate +ERROR: invalid input syntax for type jsonpath +LINE 1: select '"\ude04X"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +--handling of simple unicode escapes +select '"the Copyright \u00a9 sign"'::jsonpath as correct_in_utf8; + correct_in_utf8 +------------------------ + "the Copyright © sign" +(1 row) + +select '"dollar \u0024 character"'::jsonpath as correct_everywhere; + correct_everywhere +---------------------- + "dollar $ character" +(1 row) + +select '"dollar \\u0024 character"'::jsonpath as not_an_escape; + not_an_escape +---------------------------- + "dollar \\u0024 character" +(1 row) + +select '"null \u0000 escape"'::jsonpath as not_unescaped; +ERROR: unsupported Unicode escape sequence +LINE 1: select '"null \u0000 escape"'::jsonpath as not_unescaped; + ^ +DETAIL: \u0000 cannot be converted to text. +select '"null \\u0000 escape"'::jsonpath as not_an_escape; + not_an_escape +----------------------- + "null \\u0000 escape" +(1 row) + +-- checks for quoted key names +-- basic unicode input +SELECT '$."\u"'::jsonpath; -- ERROR, incomplete escape +ERROR: invalid unicode sequence at or near "\u" of jsonpath input +LINE 1: SELECT '$."\u"'::jsonpath; + ^ +SELECT '$."\u00"'::jsonpath; -- ERROR, incomplete escape +ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +LINE 1: SELECT '$."\u00"'::jsonpath; + ^ +SELECT '$."\u000g"'::jsonpath; -- ERROR, g is not a hex digit +ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +LINE 1: SELECT '$."\u000g"'::jsonpath; + ^ +SELECT '$."\u0000"'::jsonpath; -- OK, legal escape +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT '$."\u0000"'::jsonpath; + ^ +DETAIL: \u0000 cannot be converted to text. +SELECT '$."\uaBcD"'::jsonpath; -- OK, uppercase and lower case both OK + jsonpath +---------- + $."ꯍ" +(1 row) + +-- handling of unicode surrogate pairs +select '$."\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_utf8; + correct_in_utf8 +----------------- + $."😄🐶" +(1 row) + +select '$."\ud83d\ud83d"'::jsonpath; -- 2 high surrogates in a row +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$."\ud83d\ud83d"'::jsonpath; + ^ +DETAIL: Unicode high surrogate must not follow a high surrogate. +select '$."\ude04\ud83d"'::jsonpath; -- surrogates in wrong order +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$."\ude04\ud83d"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +select '$."\ud83dX"'::jsonpath; -- orphan high surrogate +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$."\ud83dX"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +select '$."\ude04X"'::jsonpath; -- orphan low surrogate +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$."\ude04X"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +--handling of simple unicode escapes +select '$."the Copyright \u00a9 sign"'::jsonpath as correct_in_utf8; + correct_in_utf8 +-------------------------- + $."the Copyright © sign" +(1 row) + +select '$."dollar \u0024 character"'::jsonpath as correct_everywhere; + correct_everywhere +------------------------ + $."dollar $ character" +(1 row) + +select '$."dollar \\u0024 character"'::jsonpath as not_an_escape; + not_an_escape +------------------------------ + $."dollar \\u0024 character" +(1 row) + +select '$."null \u0000 escape"'::jsonpath as not_unescaped; +ERROR: unsupported Unicode escape sequence +LINE 1: select '$."null \u0000 escape"'::jsonpath as not_unescaped; + ^ +DETAIL: \u0000 cannot be converted to text. +select '$."null \\u0000 escape"'::jsonpath as not_an_escape; + not_an_escape +------------------------- + $."null \\u0000 escape" +(1 row) + diff --git a/src/test/singlenode_regress/expected/jsonpath_encoding_1.out b/src/test/singlenode_regress/expected/jsonpath_encoding_1.out new file mode 100644 index 00000000000..005136c9657 --- /dev/null +++ b/src/test/singlenode_regress/expected/jsonpath_encoding_1.out @@ -0,0 +1,168 @@ +-- +-- encoding-sensitive tests for jsonpath +-- +-- We provide expected-results files for UTF8 (jsonpath_encoding.out) +-- and for SQL_ASCII (jsonpath_encoding_1.out). Skip otherwise. +SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') + AS skip_test \gset +\if :skip_test +\quit +\endif +SELECT getdatabaseencoding(); -- just to label the results files + getdatabaseencoding +--------------------- + SQL_ASCII +(1 row) + +-- checks for double-quoted values +-- basic unicode input +SELECT '"\u"'::jsonpath; -- ERROR, incomplete escape +ERROR: invalid unicode sequence at or near "\u" of jsonpath input +LINE 1: SELECT '"\u"'::jsonpath; + ^ +SELECT '"\u00"'::jsonpath; -- ERROR, incomplete escape +ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +LINE 1: SELECT '"\u00"'::jsonpath; + ^ +SELECT '"\u000g"'::jsonpath; -- ERROR, g is not a hex digit +ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +LINE 1: SELECT '"\u000g"'::jsonpath; + ^ +SELECT '"\u0000"'::jsonpath; -- OK, legal escape +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT '"\u0000"'::jsonpath; + ^ +DETAIL: \u0000 cannot be converted to text. +SELECT '"\uaBcD"'::jsonpath; -- OK, uppercase and lower case both OK +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: SELECT '"\uaBcD"'::jsonpath; + ^ +-- handling of unicode surrogate pairs +select '"\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: select '"\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_... + ^ +select '"\ud83d\ud83d"'::jsonpath; -- 2 high surrogates in a row +ERROR: invalid input syntax for type jsonpath +LINE 1: select '"\ud83d\ud83d"'::jsonpath; + ^ +DETAIL: Unicode high surrogate must not follow a high surrogate. +select '"\ude04\ud83d"'::jsonpath; -- surrogates in wrong order +ERROR: invalid input syntax for type jsonpath +LINE 1: select '"\ude04\ud83d"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +select '"\ud83dX"'::jsonpath; -- orphan high surrogate +ERROR: invalid input syntax for type jsonpath +LINE 1: select '"\ud83dX"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +select '"\ude04X"'::jsonpath; -- orphan low surrogate +ERROR: invalid input syntax for type jsonpath +LINE 1: select '"\ude04X"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +--handling of simple unicode escapes +select '"the Copyright \u00a9 sign"'::jsonpath as correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: select '"the Copyright \u00a9 sign"'::jsonpath as correct_in... + ^ +select '"dollar \u0024 character"'::jsonpath as correct_everywhere; + correct_everywhere +---------------------- + "dollar $ character" +(1 row) + +select '"dollar \\u0024 character"'::jsonpath as not_an_escape; + not_an_escape +---------------------------- + "dollar \\u0024 character" +(1 row) + +select '"null \u0000 escape"'::jsonpath as not_unescaped; +ERROR: unsupported Unicode escape sequence +LINE 1: select '"null \u0000 escape"'::jsonpath as not_unescaped; + ^ +DETAIL: \u0000 cannot be converted to text. +select '"null \\u0000 escape"'::jsonpath as not_an_escape; + not_an_escape +----------------------- + "null \\u0000 escape" +(1 row) + +-- checks for quoted key names +-- basic unicode input +SELECT '$."\u"'::jsonpath; -- ERROR, incomplete escape +ERROR: invalid unicode sequence at or near "\u" of jsonpath input +LINE 1: SELECT '$."\u"'::jsonpath; + ^ +SELECT '$."\u00"'::jsonpath; -- ERROR, incomplete escape +ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +LINE 1: SELECT '$."\u00"'::jsonpath; + ^ +SELECT '$."\u000g"'::jsonpath; -- ERROR, g is not a hex digit +ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +LINE 1: SELECT '$."\u000g"'::jsonpath; + ^ +SELECT '$."\u0000"'::jsonpath; -- OK, legal escape +ERROR: unsupported Unicode escape sequence +LINE 1: SELECT '$."\u0000"'::jsonpath; + ^ +DETAIL: \u0000 cannot be converted to text. +SELECT '$."\uaBcD"'::jsonpath; -- OK, uppercase and lower case both OK +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: SELECT '$."\uaBcD"'::jsonpath; + ^ +-- handling of unicode surrogate pairs +select '$."\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: select '$."\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_i... + ^ +select '$."\ud83d\ud83d"'::jsonpath; -- 2 high surrogates in a row +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$."\ud83d\ud83d"'::jsonpath; + ^ +DETAIL: Unicode high surrogate must not follow a high surrogate. +select '$."\ude04\ud83d"'::jsonpath; -- surrogates in wrong order +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$."\ude04\ud83d"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +select '$."\ud83dX"'::jsonpath; -- orphan high surrogate +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$."\ud83dX"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +select '$."\ude04X"'::jsonpath; -- orphan low surrogate +ERROR: invalid input syntax for type jsonpath +LINE 1: select '$."\ude04X"'::jsonpath; + ^ +DETAIL: Unicode low surrogate must follow a high surrogate. +--handling of simple unicode escapes +select '$."the Copyright \u00a9 sign"'::jsonpath as correct_in_utf8; +ERROR: conversion between UTF8 and SQL_ASCII is not supported +LINE 1: select '$."the Copyright \u00a9 sign"'::jsonpath as correct_... + ^ +select '$."dollar \u0024 character"'::jsonpath as correct_everywhere; + correct_everywhere +------------------------ + $."dollar $ character" +(1 row) + +select '$."dollar \\u0024 character"'::jsonpath as not_an_escape; + not_an_escape +------------------------------ + $."dollar \\u0024 character" +(1 row) + +select '$."null \u0000 escape"'::jsonpath as not_unescaped; +ERROR: unsupported Unicode escape sequence +LINE 1: select '$."null \u0000 escape"'::jsonpath as not_unescaped; + ^ +DETAIL: \u0000 cannot be converted to text. +select '$."null \\u0000 escape"'::jsonpath as not_an_escape; + not_an_escape +------------------------- + $."null \\u0000 escape" +(1 row) + diff --git a/src/test/singlenode_regress/expected/jsonpath_encoding_2.out b/src/test/singlenode_regress/expected/jsonpath_encoding_2.out new file mode 100644 index 00000000000..bb71bfe72c4 --- /dev/null +++ b/src/test/singlenode_regress/expected/jsonpath_encoding_2.out @@ -0,0 +1,9 @@ +-- +-- encoding-sensitive tests for jsonpath +-- +-- We provide expected-results files for UTF8 (jsonpath_encoding.out) +-- and for SQL_ASCII (jsonpath_encoding_1.out). Skip otherwise. +SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') + AS skip_test \gset +\if :skip_test +\quit diff --git a/src/test/singlenode_regress/expected/limit.out b/src/test/singlenode_regress/expected/limit.out new file mode 100644 index 00000000000..a2a9145d06e --- /dev/null +++ b/src/test/singlenode_regress/expected/limit.out @@ -0,0 +1,499 @@ +-- +-- LIMIT +-- Check the LIMIT/OFFSET feature of SELECT +-- +SELECT ''::text AS two, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 50 + ORDER BY unique1 LIMIT 2; + two | unique1 | unique2 | stringu1 +-----+---------+---------+---------- + | 51 | 76 | ZBAAAA + | 52 | 985 | ACAAAA +(2 rows) + +SELECT ''::text AS five, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 60 + ORDER BY unique1 LIMIT 5; + five | unique1 | unique2 | stringu1 +------+---------+---------+---------- + | 61 | 560 | JCAAAA + | 62 | 633 | KCAAAA + | 63 | 296 | LCAAAA + | 64 | 479 | MCAAAA + | 65 | 64 | NCAAAA +(5 rows) + +SELECT ''::text AS two, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 60 AND unique1 < 63 + ORDER BY unique1 LIMIT 5; + two | unique1 | unique2 | stringu1 +-----+---------+---------+---------- + | 61 | 560 | JCAAAA + | 62 | 633 | KCAAAA +(2 rows) + +SELECT ''::text AS three, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 100 + ORDER BY unique1 LIMIT 3 OFFSET 20; + three | unique1 | unique2 | stringu1 +-------+---------+---------+---------- + | 121 | 700 | REAAAA + | 122 | 519 | SEAAAA + | 123 | 777 | TEAAAA +(3 rows) + +SELECT ''::text AS zero, unique1, unique2, stringu1 + FROM onek WHERE unique1 < 50 + ORDER BY unique1 DESC LIMIT 8 OFFSET 99; + zero | unique1 | unique2 | stringu1 +------+---------+---------+---------- +(0 rows) + +SELECT ''::text AS eleven, unique1, unique2, stringu1 + FROM onek WHERE unique1 < 50 + ORDER BY unique1 DESC LIMIT 20 OFFSET 39; + eleven | unique1 | unique2 | stringu1 +--------+---------+---------+---------- + | 10 | 520 | KAAAAA + | 9 | 49 | JAAAAA + | 8 | 653 | IAAAAA + | 7 | 647 | HAAAAA + | 6 | 978 | GAAAAA + | 5 | 541 | FAAAAA + | 4 | 833 | EAAAAA + | 3 | 431 | DAAAAA + | 2 | 326 | CAAAAA + | 1 | 214 | BAAAAA + | 0 | 998 | AAAAAA +(11 rows) + +SELECT ''::text AS ten, unique1, unique2, stringu1 + FROM onek + ORDER BY unique1 OFFSET 990; + ten | unique1 | unique2 | stringu1 +-----+---------+---------+---------- + | 990 | 369 | CMAAAA + | 991 | 426 | DMAAAA + | 992 | 363 | EMAAAA + | 993 | 661 | FMAAAA + | 994 | 695 | GMAAAA + | 995 | 144 | HMAAAA + | 996 | 258 | IMAAAA + | 997 | 21 | JMAAAA + | 998 | 549 | KMAAAA + | 999 | 152 | LMAAAA +(10 rows) + +SELECT ''::text AS five, unique1, unique2, stringu1 + FROM onek + ORDER BY unique1 OFFSET 990 LIMIT 5; + five | unique1 | unique2 | stringu1 +------+---------+---------+---------- + | 990 | 369 | CMAAAA + | 991 | 426 | DMAAAA + | 992 | 363 | EMAAAA + | 993 | 661 | FMAAAA + | 994 | 695 | GMAAAA +(5 rows) + +SELECT ''::text AS five, unique1, unique2, stringu1 + FROM onek + ORDER BY unique1 LIMIT 5 OFFSET 900; + five | unique1 | unique2 | stringu1 +------+---------+---------+---------- + | 900 | 913 | QIAAAA + | 901 | 931 | RIAAAA + | 902 | 702 | SIAAAA + | 903 | 641 | TIAAAA + | 904 | 793 | UIAAAA +(5 rows) + +-- Test null limit and offset. The planner would discard a simple null +-- constant, so to ensure executor is exercised, do this: +select * from int8_tbl limit (case when random() < 0.5 then null::bigint end); + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +select * from int8_tbl offset (case when random() < 0.5 then null::bigint end); + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +-- Test assorted cases involving backwards fetch from a LIMIT plan node +-- Disable backward scan test which is not supported in this version of Cloudberry Database +--start_ignore +/* + * begin; + * + * declare c1 cursor for select * from int8_tbl limit 10; + * fetch all in c1; + * fetch 1 in c1; + * fetch backward 1 in c1; + * fetch backward all in c1; + * fetch backward 1 in c1; + * fetch all in c1; + * + * declare c2 cursor for select * from int8_tbl limit 3; + * fetch all in c2; + * fetch 1 in c2; + * fetch backward 1 in c2; + * fetch backward all in c2; + * fetch backward 1 in c2; + * fetch all in c2; + * + * declare c3 cursor for select * from int8_tbl offset 3; + * fetch all in c3; + * fetch 1 in c3; + * fetch backward 1 in c3; + * fetch backward all in c3; + * fetch backward 1 in c3; + * fetch all in c3; + * + * declare c4 cursor for select * from int8_tbl offset 10; + * fetch all in c4; + * fetch 1 in c4; + * fetch backward 1 in c4; + * fetch backward all in c4; + * fetch backward 1 in c4; + * fetch all in c4; + * + * declare c5 cursor for select * from int8_tbl order by q1 fetch first 2 rows with ties; + * fetch all in c5; + * fetch 1 in c5; + * fetch backward 1 in c5; + * fetch backward 1 in c5; + * fetch all in c5; + * fetch backward all in c5; + * fetch all in c5; + * fetch backward all in c5; + * + * rollback; + */ +--end_ignore +-- Stress test for variable LIMIT in conjunction with bounded-heap sorting +SELECT + (SELECT n + FROM (VALUES (1)) AS x, + (SELECT n FROM generate_series(1,10) AS n + ORDER BY n LIMIT 1 OFFSET s-1) AS y) AS z + FROM generate_series(1,10) AS s; + z +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +-- +-- Test behavior of volatile and set-returning functions in conjunction +-- with ORDER BY and LIMIT. +-- +create temp sequence testseq; +explain (verbose, costs off) +select unique1, unique2, nextval('testseq') + from tenk1 order by unique2 limit 10; + QUERY PLAN +---------------------------------------------------------------- + Limit + Output: unique1, unique2, (nextval('testseq'::regclass)) + -> Index Scan using tenk1_unique2 on public.tenk1 + Output: unique1, unique2, nextval('testseq'::regclass) + Optimizer: Postgres query optimizer +(5 rows) + +-- In gpdb, our sequence can only promise monotonicity due to MPP structure +-- The follow case does not make sence for us. +-- +--select unique1, unique2, nextval('testseq') +-- from tenk1 order by unique2 limit 10; +-- +--select currval('testseq'); +-- +--explain (verbose, costs off) +--select unique1, unique2, nextval('testseq') +-- from tenk1 order by tenthous limit 10; +-- +--select unique1, unique2, nextval('testseq') +-- from tenk1 order by tenthous limit 10; +-- +--select currval('testseq'); +-- +explain (verbose, costs off) +select unique1, unique2, generate_series(1,10) + from tenk1 order by unique2 limit 7; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Limit + Output: unique1, unique2, (generate_series(1, 10)) + -> ProjectSet + Output: unique1, unique2, generate_series(1, 10) + -> Index Scan using tenk1_unique2 on public.tenk1 + Output: unique1, unique2, two, four, ten, twenty, hundred, thousand, twothousand, fivethous, tenthous, odd, even, stringu1, stringu2, string4 + Optimizer: Postgres query optimizer +(7 rows) + +select unique1, unique2, generate_series(1,10) + from tenk1 order by unique2 limit 7; + unique1 | unique2 | generate_series +---------+---------+----------------- + 8800 | 0 | 1 + 8800 | 0 | 2 + 8800 | 0 | 3 + 8800 | 0 | 4 + 8800 | 0 | 5 + 8800 | 0 | 6 + 8800 | 0 | 7 +(7 rows) + +explain (verbose, costs off) +select unique1, unique2, generate_series(1,10) + from tenk1 order by tenthous limit 7; + QUERY PLAN +-------------------------------------------------------------------- + Limit + Output: unique1, unique2, (generate_series(1, 10)), tenthous + -> ProjectSet + Output: unique1, unique2, generate_series(1, 10), tenthous + -> Sort + Output: unique1, unique2, tenthous + Sort Key: tenk1.tenthous + -> Seq Scan on public.tenk1 + Output: unique1, unique2, tenthous + Optimizer: Postgres query optimizer +(10 rows) + +select unique1, unique2, generate_series(1,10) + from tenk1 order by tenthous limit 7; + unique1 | unique2 | generate_series +---------+---------+----------------- + 0 | 9998 | 1 + 0 | 9998 | 2 + 0 | 9998 | 3 + 0 | 9998 | 4 + 0 | 9998 | 5 + 0 | 9998 | 6 + 0 | 9998 | 7 +(7 rows) + +-- use of random() is to keep planner from folding the expressions together +explain (verbose, costs off) +select generate_series(0,2) as s1, generate_series((random()*.1)::int,2) as s2; + QUERY PLAN +------------------------------------------------------------------------------------------------------ + ProjectSet + Output: generate_series(0, 2), generate_series(((random() * '0.1'::double precision))::integer, 2) + -> Result + Optimizer: Postgres query optimizer +(4 rows) + +select generate_series(0,2) as s1, generate_series((random()*.1)::int,2) as s2; + s1 | s2 +----+---- + 0 | 0 + 1 | 1 + 2 | 2 +(3 rows) + +explain (verbose, costs off) +select generate_series(0,2) as s1, generate_series((random()*.1)::int,2) as s2 +order by s2 desc; + QUERY PLAN +------------------------------------------------------------------------------------------------------------ + Sort + Output: (generate_series(0, 2)), (generate_series(((random() * '0.1'::double precision))::integer, 2)) + Sort Key: (generate_series(((random() * '0.1'::double precision))::integer, 2)) DESC + -> ProjectSet + Output: generate_series(0, 2), generate_series(((random() * '0.1'::double precision))::integer, 2) + -> Result + Optimizer: Postgres query optimizer +(7 rows) + +select generate_series(0,2) as s1, generate_series((random()*.1)::int,2) as s2 +order by s2 desc; + s1 | s2 +----+---- + 2 | 2 + 1 | 1 + 0 | 0 +(3 rows) + +-- test for failure to set all aggregates' aggtranstype +explain (verbose, costs off) +select sum(tenthous) as s1, sum(tenthous) + random()*0 as s2 + from tenk1 group by thousand order by thousand limit 3; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------- + Limit + Output: (sum(tenthous)), (((sum(tenthous))::double precision + (random() * '0'::double precision))), thousand + -> GroupAggregate + Output: sum(tenthous), ((sum(tenthous))::double precision + (random() * '0'::double precision)), thousand + Group Key: tenk1.thousand + -> Index Only Scan using tenk1_thous_tenthous on public.tenk1 + Output: thousand, tenthous + Optimizer: Postgres query optimizer +(8 rows) + +select sum(tenthous) as s1, sum(tenthous) + random()*0 as s2 + from tenk1 group by thousand order by thousand limit 3; + s1 | s2 +-------+------- + 45000 | 45000 + 45010 | 45010 + 45020 | 45020 +(3 rows) + +-- +-- FETCH FIRST +-- Check the WITH TIES clause +-- +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 2 ROW WITH TIES; + thousand +---------- + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +(10 rows) + +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST ROWS WITH TIES; + thousand +---------- + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +(10 rows) + +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 1 ROW WITH TIES; + thousand +---------- + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +(10 rows) + +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 2 ROW ONLY; + thousand +---------- + 0 + 0 +(2 rows) + +-- SKIP LOCKED and WITH TIES are incompatible +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 1 ROW WITH TIES FOR UPDATE SKIP LOCKED; +ERROR: SKIP LOCKED and WITH TIES options cannot be used together +-- should fail +SELECT ''::text AS two, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 50 + FETCH FIRST 2 ROW WITH TIES; +ERROR: WITH TIES cannot be specified without ORDER BY clause +-- test ruleutils +CREATE VIEW limit_thousand_v_1 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST 5 ROWS WITH TIES OFFSET 10; +\d+ limit_thousand_v_1 + View "public.limit_thousand_v_1" + Column | Type | Collation | Nullable | Default | Storage | Description +----------+---------+-----------+----------+---------+---------+------------- + thousand | integer | | | | plain | +View definition: + SELECT onek.thousand + FROM onek + WHERE onek.thousand < 995 + ORDER BY onek.thousand + OFFSET 10 + FETCH FIRST 5 ROWS WITH TIES; + +CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY; +\d+ limit_thousand_v_2 + View "public.limit_thousand_v_2" + Column | Type | Collation | Nullable | Default | Storage | Description +----------+---------+-----------+----------+---------+---------+------------- + thousand | integer | | | | plain | +View definition: + SELECT onek.thousand + FROM onek + WHERE onek.thousand < 995 + ORDER BY onek.thousand + OFFSET 10 + LIMIT 5; + +CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST NULL ROWS WITH TIES; -- fails +ERROR: row count cannot be null in FETCH FIRST ... WITH TIES clause +CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES; +\d+ limit_thousand_v_3 + View "public.limit_thousand_v_3" + Column | Type | Collation | Nullable | Default | Storage | Description +----------+---------+-----------+----------+---------+---------+------------- + thousand | integer | | | | plain | +View definition: + SELECT onek.thousand + FROM onek + WHERE onek.thousand < 995 + ORDER BY onek.thousand + FETCH FIRST (NULL::integer + 1) ROWS WITH TIES; + +CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST NULL ROWS ONLY; +\d+ limit_thousand_v_4 + View "public.limit_thousand_v_4" + Column | Type | Collation | Nullable | Default | Storage | Description +----------+---------+-----------+----------+---------+---------+------------- + thousand | integer | | | | plain | +View definition: + SELECT onek.thousand + FROM onek + WHERE onek.thousand < 995 + ORDER BY onek.thousand + LIMIT ALL; + +-- leave these views diff --git a/src/test/singlenode_regress/expected/limit_gp.out b/src/test/singlenode_regress/expected/limit_gp.out new file mode 100644 index 00000000000..86d420662e3 --- /dev/null +++ b/src/test/singlenode_regress/expected/limit_gp.out @@ -0,0 +1,170 @@ +-- Check for MPP-19310 and MPP-19857 where mksort produces wrong result +-- on OPT build, and fails assertion on debug build if a "LIMIT" query +-- spills to disk. +CREATE TABLE mksort_limit_test_table(dkey INT, jkey INT, rval REAL, tval TEXT default repeat('abcdefghijklmnopqrstuvwxyz', 300)); +INSERT INTO mksort_limit_test_table VALUES(generate_series(1, 10000), generate_series(10001, 20000), sqrt(generate_series(10001, 20000))); +--Should fit LESS (because of overhead) than (20 * 1024 * 1024) / (26 * 300 + 12) => 2684 tuples in memory, after that spills to disk +SET statement_mem="20MB"; +-- Should work in memory +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey LIMIT 200) as temp ORDER BY jkey LIMIT 3; + dkey | str +------+----- + 1 | ab + 2 | ab + 3 | ab +(3 rows) + +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey LIMIT 200) as temp ORDER BY jkey DESC LIMIT 3; + dkey | str +------+----- + 200 | ab + 199 | ab + 198 | ab +(3 rows) + +-- Should spill to disk (tested with 2 segments, for more segments it may not spill) +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey LIMIT 5000) as temp ORDER BY jkey LIMIT 3; + dkey | str +------+----- + 1 | ab + 2 | ab + 3 | ab +(3 rows) + +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey LIMIT 5000) as temp ORDER BY jkey DESC LIMIT 3; + dkey | str +------+----- + 5000 | ab + 4999 | ab + 4998 | ab +(3 rows) + +-- In memory descending sort +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey DESC LIMIT 200) as temp ORDER BY jkey LIMIT 3; + dkey | str +------+----- + 9801 | ab + 9802 | ab + 9803 | ab +(3 rows) + +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey DESC LIMIT 200) as temp ORDER BY jkey DESC LIMIT 3; + dkey | str +-------+----- + 10000 | ab + 9999 | ab + 9998 | ab +(3 rows) + +-- Spilled descending sort (tested with 2 segments, for more segments it may not spill) +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey DESC LIMIT 5000) as temp ORDER BY jkey LIMIT 3; + dkey | str +------+----- + 5001 | ab + 5002 | ab + 5003 | ab +(3 rows) + +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey DESC LIMIT 5000) as temp ORDER BY jkey DESC LIMIT 3; + dkey | str +-------+----- + 10000 | ab + 9999 | ab + 9998 | ab +(3 rows) + +DROP TABLE mksort_limit_test_table; +-- Check invalid things in LIMIT +select * from generate_series(1,10) g limit g; +ERROR: argument of LIMIT must not contain variables +LINE 1: select * from generate_series(1,10) g limit g; + ^ +select * from generate_series(1,10) g limit count(*); +ERROR: aggregate functions are not allowed in LIMIT +LINE 1: select * from generate_series(1,10) g limit count(*); + ^ +-- Check volatile limit should not pushdown. +create table t_volatile_limit (i int4); +create table t_volatile_limit_1 (a int, b int); +-- Cloudberry may generate two-stage limit plan to improve performance. +-- But for limit clause contains volatile functions, if we push them down +-- below the final gather motion, those volatile functions will be evaluated +-- many times. For such cases, we should not push down the limit. +-- Below test cases' limit clause contain function call `random` with order by. +-- `random()` is a volatile function it may return different results each time +-- invoked. If we push down to generate two-stage limit plan, `random()` will +-- execute on each segment which leads to different limit values of QEs +-- and QD and this cannot guarantee correct results. Suppose seg 0 contains the +-- top 3 minimum values, but random() returns 1, then you lose 2 values. +explain select * from t_volatile_limit order by i limit (random() * 10); + QUERY PLAN +---------------------------------------------------------------------------------- + Limit (cost=793.64..796.20 rows=1023 width=4) + -> Sort (cost=793.64..819.22 rows=10230 width=4) + Sort Key: i + -> Seq Scan on t_volatile_limit (cost=0.00..112.30 rows=10230 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +explain select * from t_volatile_limit order by i limit 2 offset (random()*5); + QUERY PLAN +---------------------------------------------------------------------------------- + Limit (cost=796.20..796.21 rows=2 width=4) + -> Sort (cost=793.64..819.22 rows=10230 width=4) + Sort Key: i + -> Seq Scan on t_volatile_limit (cost=0.00..112.30 rows=10230 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +explain select distinct(a), sum(b) from t_volatile_limit_1 group by a order by a, sum(b) limit (random()+3); + QUERY PLAN +----------------------------------------------------------------------------------------------- + Limit (cost=206.18..206.93 rows=100 width=12) + -> Unique (cost=206.18..213.68 rows=1000 width=12) + Group Key: a, (sum(b)) + -> Sort (cost=206.18..208.68 rows=1000 width=12) + Sort Key: a, (sum(b)) + -> HashAggregate (cost=146.35..156.35 rows=1000 width=12) + Group Key: a + -> Seq Scan on t_volatile_limit_1 (cost=0.00..100.90 rows=9090 width=8) + Optimizer: Postgres query optimizer +(9 rows) + +explain select distinct(a), sum(b) from t_volatile_limit_1 group by a order by a, sum(b) limit 2 offset (random()*2); + QUERY PLAN +----------------------------------------------------------------------------------------------- + Limit (cost=206.93..206.94 rows=2 width=12) + -> Unique (cost=206.18..213.68 rows=1000 width=12) + Group Key: a, (sum(b)) + -> Sort (cost=206.18..208.68 rows=1000 width=12) + Sort Key: a, (sum(b)) + -> HashAggregate (cost=146.35..156.35 rows=1000 width=12) + Group Key: a + -> Seq Scan on t_volatile_limit_1 (cost=0.00..100.90 rows=9090 width=8) + Optimizer: Postgres query optimizer +(9 rows) + +drop table t_volatile_limit; +drop table t_volatile_limit_1; +-- Check LIMIT ALL should not be considered when gathering data to a single node +create table t_limit_all(a int, b int); +insert into t_limit_all select i, i from generate_series(1,10)i; +explain (costs off) +select array(select b from t_limit_all order by b asc limit all) t; + QUERY PLAN +--------------------------------------- + Result + InitPlan 1 (returns $0) + -> Sort + Sort Key: t_limit_all.b + -> Seq Scan on t_limit_all + Optimizer: Postgres query optimizer +(6 rows) + +select array(select b from t_limit_all order by b asc limit all) t; + t +------------------------ + {1,2,3,4,5,6,7,8,9,10} +(1 row) + +drop table t_limit_all; diff --git a/src/test/singlenode_regress/expected/line.out b/src/test/singlenode_regress/expected/line.out new file mode 100644 index 00000000000..fe106589c6a --- /dev/null +++ b/src/test/singlenode_regress/expected/line.out @@ -0,0 +1,87 @@ +-- +-- LINE +-- Infinite lines +-- +--DROP TABLE LINE_TBL; +CREATE TABLE LINE_TBL (s line); +INSERT INTO LINE_TBL VALUES ('{0,-1,5}'); -- A == 0 +INSERT INTO LINE_TBL VALUES ('{1,0,5}'); -- B == 0 +INSERT INTO LINE_TBL VALUES ('{0,3,0}'); -- A == C == 0 +INSERT INTO LINE_TBL VALUES (' (0,0), (6,6)'); +INSERT INTO LINE_TBL VALUES ('10,-10 ,-5,-4'); +INSERT INTO LINE_TBL VALUES ('[-1e6,2e2,3e5, -4e1]'); +INSERT INTO LINE_TBL VALUES ('{3,NaN,5}'); +INSERT INTO LINE_TBL VALUES ('{NaN,NaN,NaN}'); +-- horizontal +INSERT INTO LINE_TBL VALUES ('[(1,3),(2,3)]'); +-- vertical +INSERT INTO LINE_TBL VALUES (line(point '(3,1)', point '(3,2)')); +-- bad values for parser testing +INSERT INTO LINE_TBL VALUES ('{}'); +ERROR: invalid input syntax for type line: "{}" +LINE 1: INSERT INTO LINE_TBL VALUES ('{}'); + ^ +INSERT INTO LINE_TBL VALUES ('{0'); +ERROR: invalid input syntax for type line: "{0" +LINE 1: INSERT INTO LINE_TBL VALUES ('{0'); + ^ +INSERT INTO LINE_TBL VALUES ('{0,0}'); +ERROR: invalid input syntax for type line: "{0,0}" +LINE 1: INSERT INTO LINE_TBL VALUES ('{0,0}'); + ^ +INSERT INTO LINE_TBL VALUES ('{0,0,1'); +ERROR: invalid input syntax for type line: "{0,0,1" +LINE 1: INSERT INTO LINE_TBL VALUES ('{0,0,1'); + ^ +INSERT INTO LINE_TBL VALUES ('{0,0,1}'); +ERROR: invalid line specification: A and B cannot both be zero +LINE 1: INSERT INTO LINE_TBL VALUES ('{0,0,1}'); + ^ +INSERT INTO LINE_TBL VALUES ('{0,0,1} x'); +ERROR: invalid input syntax for type line: "{0,0,1} x" +LINE 1: INSERT INTO LINE_TBL VALUES ('{0,0,1} x'); + ^ +INSERT INTO LINE_TBL VALUES ('(3asdf,2 ,3,4r2)'); +ERROR: invalid input syntax for type line: "(3asdf,2 ,3,4r2)" +LINE 1: INSERT INTO LINE_TBL VALUES ('(3asdf,2 ,3,4r2)'); + ^ +INSERT INTO LINE_TBL VALUES ('[1,2,3, 4'); +ERROR: invalid input syntax for type line: "[1,2,3, 4" +LINE 1: INSERT INTO LINE_TBL VALUES ('[1,2,3, 4'); + ^ +INSERT INTO LINE_TBL VALUES ('[(,2),(3,4)]'); +ERROR: invalid input syntax for type line: "[(,2),(3,4)]" +LINE 1: INSERT INTO LINE_TBL VALUES ('[(,2),(3,4)]'); + ^ +INSERT INTO LINE_TBL VALUES ('[(1,2),(3,4)'); +ERROR: invalid input syntax for type line: "[(1,2),(3,4)" +LINE 1: INSERT INTO LINE_TBL VALUES ('[(1,2),(3,4)'); + ^ +INSERT INTO LINE_TBL VALUES ('[(1,2),(1,2)]'); +ERROR: invalid line specification: must be two distinct points +LINE 1: INSERT INTO LINE_TBL VALUES ('[(1,2),(1,2)]'); + ^ +INSERT INTO LINE_TBL VALUES (line(point '(1,0)', point '(1,0)')); +ERROR: invalid line specification: must be two distinct points +select * from LINE_TBL; + s +------------------------------------------------ + {0,-1,5} + {1,0,5} + {0,3,0} + {1,-1,0} + {-0.4,-1,-6} + {-0.0001846153846153846,-1,15.384615384615387} + {3,NaN,5} + {NaN,NaN,NaN} + {0,-1,3} + {-1,0,3} +(10 rows) + +select '{nan, 1, nan}'::line = '{nan, 1, nan}'::line as true, + '{nan, 1, nan}'::line = '{nan, 2, nan}'::line as false; + true | false +------+------- + t | f +(1 row) + diff --git a/src/test/singlenode_regress/expected/lock.out b/src/test/singlenode_regress/expected/lock.out new file mode 100644 index 00000000000..d43bee0c563 --- /dev/null +++ b/src/test/singlenode_regress/expected/lock.out @@ -0,0 +1,178 @@ +-- +-- Test the LOCK statement +-- +-- Setup +CREATE SCHEMA lock_schema1; +SET search_path = lock_schema1; +CREATE TABLE lock_tbl1 (a BIGINT); +CREATE TABLE lock_tbl1a (a BIGINT); +CREATE VIEW lock_view1 AS SELECT * FROM lock_tbl1; +CREATE VIEW lock_view2(a,b) AS SELECT * FROM lock_tbl1, lock_tbl1a; +CREATE VIEW lock_view3 AS SELECT * from lock_view2; +CREATE VIEW lock_view4 AS SELECT (select a from lock_tbl1a limit 1) from lock_tbl1; +CREATE VIEW lock_view5 AS SELECT * from lock_tbl1 where a in (select * from lock_tbl1a); +CREATE VIEW lock_view6 AS SELECT * from (select * from lock_tbl1) sub; +CREATE ROLE regress_rol_lock1; +ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1; +GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1; +-- Try all valid lock options; also try omitting the optional TABLE keyword. +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE; +LOCK lock_tbl1 IN ROW SHARE MODE; +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN SHARE MODE; +LOCK lock_tbl1 IN SHARE ROW EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE; +ROLLBACK; +-- Try using NOWAIT along with valid options. +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ROW SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT; +ROLLBACK; +-- Verify that we can lock views. +BEGIN TRANSACTION; +LOCK TABLE lock_view1 IN EXCLUSIVE MODE; +-- lock_view1 and lock_tbl1 are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; + relname +------------ + lock_tbl1 + lock_view1 +(2 rows) + +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view2 IN EXCLUSIVE MODE; +-- lock_view1, lock_tbl1, and lock_tbl1a are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; + relname +------------ + lock_tbl1 + lock_tbl1a + lock_view2 +(3 rows) + +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view3 IN EXCLUSIVE MODE; +-- lock_view3, lock_view2, lock_tbl1, and lock_tbl1a are locked recursively. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; + relname +------------ + lock_tbl1 + lock_tbl1a + lock_view2 + lock_view3 +(4 rows) + +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view4 IN EXCLUSIVE MODE; +-- lock_view4, lock_tbl1, and lock_tbl1a are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; + relname +------------ + lock_tbl1 + lock_tbl1a + lock_view4 +(3 rows) + +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view5 IN EXCLUSIVE MODE; +-- lock_view5, lock_tbl1, and lock_tbl1a are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; + relname +------------ + lock_tbl1 + lock_tbl1a + lock_view5 +(3 rows) + +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view6 IN EXCLUSIVE MODE; +-- lock_view6 an lock_tbl1 are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; + relname +------------ + lock_tbl1 + lock_view6 +(2 rows) + +ROLLBACK; +-- Verify that we cope with infinite recursion in view definitions. +CREATE OR REPLACE VIEW lock_view2 AS SELECT * from lock_view3; +BEGIN TRANSACTION; +LOCK TABLE lock_view2 IN EXCLUSIVE MODE; +ROLLBACK; +CREATE VIEW lock_view7 AS SELECT * from lock_view2; +BEGIN TRANSACTION; +LOCK TABLE lock_view7 IN EXCLUSIVE MODE; +ROLLBACK; +-- Verify that we can lock a table with inheritance children. +CREATE TABLE lock_tbl2 (b BIGINT) INHERITS (lock_tbl1); +CREATE TABLE lock_tbl3 () INHERITS (lock_tbl2); +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE; +ROLLBACK; +-- Child tables are locked without granting explicit permission to do so as +-- long as we have permission to lock the parent. +GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1; +SET ROLE regress_rol_lock1; +-- fail when child locked directly +BEGIN; +LOCK TABLE lock_tbl2; +ERROR: permission denied for table lock_tbl2 +ROLLBACK; +BEGIN; +LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE; +ROLLBACK; +BEGIN; +LOCK TABLE ONLY lock_tbl1; +ROLLBACK; +RESET ROLE; +-- +-- Clean up +-- +DROP VIEW lock_view7; +DROP VIEW lock_view6; +DROP VIEW lock_view5; +DROP VIEW lock_view4; +DROP VIEW lock_view3 CASCADE; +NOTICE: drop cascades to view lock_view2 +DROP VIEW lock_view1; +DROP TABLE lock_tbl3; +DROP TABLE lock_tbl2; +DROP TABLE lock_tbl1; +DROP TABLE lock_tbl1a; +DROP SCHEMA lock_schema1 CASCADE; +DROP ROLE regress_rol_lock1; +-- atomic ops tests +RESET search_path; +SELECT test_atomic_ops(); + test_atomic_ops +----------------- + t +(1 row) + diff --git a/src/test/singlenode_regress/expected/lseg.out b/src/test/singlenode_regress/expected/lseg.out new file mode 100644 index 00000000000..7e878b55779 --- /dev/null +++ b/src/test/singlenode_regress/expected/lseg.out @@ -0,0 +1,44 @@ +-- +-- LSEG +-- Line segments +-- +--DROP TABLE LSEG_TBL; +CREATE TABLE LSEG_TBL (s lseg); +INSERT INTO LSEG_TBL VALUES ('[(1,2),(3,4)]'); +INSERT INTO LSEG_TBL VALUES ('(0,0),(6,6)'); +INSERT INTO LSEG_TBL VALUES ('10,-10 ,-3,-4'); +INSERT INTO LSEG_TBL VALUES ('[-1e6,2e2,3e5, -4e1]'); +INSERT INTO LSEG_TBL VALUES (lseg(point(11, 22), point(33,44))); +INSERT INTO LSEG_TBL VALUES ('[(-10,2),(-10,3)]'); -- vertical +INSERT INTO LSEG_TBL VALUES ('[(0,-20),(30,-20)]'); -- horizontal +INSERT INTO LSEG_TBL VALUES ('[(NaN,1),(NaN,90)]'); -- NaN +-- bad values for parser testing +INSERT INTO LSEG_TBL VALUES ('(3asdf,2 ,3,4r2)'); +ERROR: invalid input syntax for type lseg: "(3asdf,2 ,3,4r2)" +LINE 1: INSERT INTO LSEG_TBL VALUES ('(3asdf,2 ,3,4r2)'); + ^ +INSERT INTO LSEG_TBL VALUES ('[1,2,3, 4'); +ERROR: invalid input syntax for type lseg: "[1,2,3, 4" +LINE 1: INSERT INTO LSEG_TBL VALUES ('[1,2,3, 4'); + ^ +INSERT INTO LSEG_TBL VALUES ('[(,2),(3,4)]'); +ERROR: invalid input syntax for type lseg: "[(,2),(3,4)]" +LINE 1: INSERT INTO LSEG_TBL VALUES ('[(,2),(3,4)]'); + ^ +INSERT INTO LSEG_TBL VALUES ('[(1,2),(3,4)'); +ERROR: invalid input syntax for type lseg: "[(1,2),(3,4)" +LINE 1: INSERT INTO LSEG_TBL VALUES ('[(1,2),(3,4)'); + ^ +select * from LSEG_TBL; + s +------------------------------- + [(1,2),(3,4)] + [(0,0),(6,6)] + [(10,-10),(-3,-4)] + [(-1000000,200),(300000,-40)] + [(11,22),(33,44)] + [(-10,2),(-10,3)] + [(0,-20),(30,-20)] + [(NaN,1),(NaN,90)] +(8 rows) + diff --git a/src/test/singlenode_regress/expected/macaddr.out b/src/test/singlenode_regress/expected/macaddr.out new file mode 100644 index 00000000000..151f9ce59bb --- /dev/null +++ b/src/test/singlenode_regress/expected/macaddr.out @@ -0,0 +1,160 @@ +-- +-- macaddr +-- +CREATE TABLE macaddr_data (a int, b macaddr); +INSERT INTO macaddr_data VALUES (1, '08:00:2b:01:02:03'); +INSERT INTO macaddr_data VALUES (2, '08-00-2b-01-02-03'); +INSERT INTO macaddr_data VALUES (3, '08002b:010203'); +INSERT INTO macaddr_data VALUES (4, '08002b-010203'); +INSERT INTO macaddr_data VALUES (5, '0800.2b01.0203'); +INSERT INTO macaddr_data VALUES (6, '0800-2b01-0203'); +INSERT INTO macaddr_data VALUES (7, '08002b010203'); +INSERT INTO macaddr_data VALUES (8, '0800:2b01:0203'); -- invalid +ERROR: invalid input syntax for type macaddr: "0800:2b01:0203" +LINE 1: INSERT INTO macaddr_data VALUES (8, '0800:2b01:0203'); + ^ +INSERT INTO macaddr_data VALUES (9, 'not even close'); -- invalid +ERROR: invalid input syntax for type macaddr: "not even close" +LINE 1: INSERT INTO macaddr_data VALUES (9, 'not even close'); + ^ +INSERT INTO macaddr_data VALUES (10, '08:00:2b:01:02:04'); +INSERT INTO macaddr_data VALUES (11, '08:00:2b:01:02:02'); +INSERT INTO macaddr_data VALUES (12, '08:00:2a:01:02:03'); +INSERT INTO macaddr_data VALUES (13, '08:00:2c:01:02:03'); +INSERT INTO macaddr_data VALUES (14, '08:00:2a:01:02:04'); +SELECT * FROM macaddr_data; + a | b +----+------------------- + 1 | 08:00:2b:01:02:03 + 2 | 08:00:2b:01:02:03 + 3 | 08:00:2b:01:02:03 + 4 | 08:00:2b:01:02:03 + 5 | 08:00:2b:01:02:03 + 6 | 08:00:2b:01:02:03 + 7 | 08:00:2b:01:02:03 + 10 | 08:00:2b:01:02:04 + 11 | 08:00:2b:01:02:02 + 12 | 08:00:2a:01:02:03 + 13 | 08:00:2c:01:02:03 + 14 | 08:00:2a:01:02:04 +(12 rows) + +CREATE INDEX macaddr_data_btree ON macaddr_data USING btree (b); +CREATE INDEX macaddr_data_hash ON macaddr_data USING hash (b); +SELECT a, b, trunc(b) FROM macaddr_data ORDER BY 2, 1; + a | b | trunc +----+-------------------+------------------- + 12 | 08:00:2a:01:02:03 | 08:00:2a:00:00:00 + 14 | 08:00:2a:01:02:04 | 08:00:2a:00:00:00 + 11 | 08:00:2b:01:02:02 | 08:00:2b:00:00:00 + 1 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00 + 2 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00 + 3 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00 + 4 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00 + 5 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00 + 6 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00 + 7 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00 + 10 | 08:00:2b:01:02:04 | 08:00:2b:00:00:00 + 13 | 08:00:2c:01:02:03 | 08:00:2c:00:00:00 +(12 rows) + +SELECT b < '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- true + ?column? +---------- + t +(1 row) + +SELECT b > '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- false + ?column? +---------- + f +(1 row) + +SELECT b > '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- false + ?column? +---------- + f +(1 row) + +SELECT b <= '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- true + ?column? +---------- + t +(1 row) + +SELECT b >= '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- false + ?column? +---------- + f +(1 row) + +SELECT b = '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- true + ?column? +---------- + t +(1 row) + +SELECT b <> '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- true + ?column? +---------- + t +(1 row) + +SELECT b <> '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- false + ?column? +---------- + f +(1 row) + +SELECT ~b FROM macaddr_data; + ?column? +------------------- + f7:ff:d4:fe:fd:fc + f7:ff:d4:fe:fd:fc + f7:ff:d4:fe:fd:fc + f7:ff:d4:fe:fd:fc + f7:ff:d4:fe:fd:fc + f7:ff:d4:fe:fd:fc + f7:ff:d4:fe:fd:fc + f7:ff:d4:fe:fd:fb + f7:ff:d4:fe:fd:fd + f7:ff:d5:fe:fd:fc + f7:ff:d3:fe:fd:fc + f7:ff:d5:fe:fd:fb +(12 rows) + +SELECT b & '00:00:00:ff:ff:ff' FROM macaddr_data; + ?column? +------------------- + 00:00:00:01:02:03 + 00:00:00:01:02:03 + 00:00:00:01:02:03 + 00:00:00:01:02:03 + 00:00:00:01:02:03 + 00:00:00:01:02:03 + 00:00:00:01:02:03 + 00:00:00:01:02:04 + 00:00:00:01:02:02 + 00:00:00:01:02:03 + 00:00:00:01:02:03 + 00:00:00:01:02:04 +(12 rows) + +SELECT b | '01:02:03:04:05:06' FROM macaddr_data; + ?column? +------------------- + 09:02:2b:05:07:07 + 09:02:2b:05:07:07 + 09:02:2b:05:07:07 + 09:02:2b:05:07:07 + 09:02:2b:05:07:07 + 09:02:2b:05:07:07 + 09:02:2b:05:07:07 + 09:02:2b:05:07:06 + 09:02:2b:05:07:06 + 09:02:2b:05:07:07 + 09:02:2f:05:07:07 + 09:02:2b:05:07:06 +(12 rows) + +DROP TABLE macaddr_data; diff --git a/src/test/singlenode_regress/expected/macaddr8.out b/src/test/singlenode_regress/expected/macaddr8.out new file mode 100644 index 00000000000..74f53a121f2 --- /dev/null +++ b/src/test/singlenode_regress/expected/macaddr8.out @@ -0,0 +1,354 @@ +-- +-- macaddr8 +-- +-- test various cases of valid and invalid input +-- valid +SELECT '08:00:2b:01:02:03 '::macaddr8; + macaddr8 +------------------------- + 08:00:2b:ff:fe:01:02:03 +(1 row) + +SELECT ' 08:00:2b:01:02:03 '::macaddr8; + macaddr8 +------------------------- + 08:00:2b:ff:fe:01:02:03 +(1 row) + +SELECT ' 08:00:2b:01:02:03'::macaddr8; + macaddr8 +------------------------- + 08:00:2b:ff:fe:01:02:03 +(1 row) + +SELECT '08:00:2b:01:02:03:04:05 '::macaddr8; + macaddr8 +------------------------- + 08:00:2b:01:02:03:04:05 +(1 row) + +SELECT ' 08:00:2b:01:02:03:04:05 '::macaddr8; + macaddr8 +------------------------- + 08:00:2b:01:02:03:04:05 +(1 row) + +SELECT ' 08:00:2b:01:02:03:04:05'::macaddr8; + macaddr8 +------------------------- + 08:00:2b:01:02:03:04:05 +(1 row) + +SELECT '123 08:00:2b:01:02:03'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "123 08:00:2b:01:02:03" +LINE 1: SELECT '123 08:00:2b:01:02:03'::macaddr8; + ^ +SELECT '08:00:2b:01:02:03 123'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08:00:2b:01:02:03 123" +LINE 1: SELECT '08:00:2b:01:02:03 123'::macaddr8; + ^ +SELECT '123 08:00:2b:01:02:03:04:05'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "123 08:00:2b:01:02:03:04:05" +LINE 1: SELECT '123 08:00:2b:01:02:03:04:05'::macaddr8; + ^ +SELECT '08:00:2b:01:02:03:04:05 123'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08:00:2b:01:02:03:04:05 123" +LINE 1: SELECT '08:00:2b:01:02:03:04:05 123'::macaddr8; + ^ +SELECT '08:00:2b:01:02:03:04:05:06:07'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08:00:2b:01:02:03:04:05:06:07" +LINE 1: SELECT '08:00:2b:01:02:03:04:05:06:07'::macaddr8; + ^ +SELECT '08-00-2b-01-02-03-04-05-06-07'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08-00-2b-01-02-03-04-05-06-07" +LINE 1: SELECT '08-00-2b-01-02-03-04-05-06-07'::macaddr8; + ^ +SELECT '08002b:01020304050607'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08002b:01020304050607" +LINE 1: SELECT '08002b:01020304050607'::macaddr8; + ^ +SELECT '08002b01020304050607'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08002b01020304050607" +LINE 1: SELECT '08002b01020304050607'::macaddr8; + ^ +SELECT '0z002b0102030405'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "0z002b0102030405" +LINE 1: SELECT '0z002b0102030405'::macaddr8; + ^ +SELECT '08002b010203xyza'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08002b010203xyza" +LINE 1: SELECT '08002b010203xyza'::macaddr8; + ^ +SELECT '08:00-2b:01:02:03:04:05'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08:00-2b:01:02:03:04:05" +LINE 1: SELECT '08:00-2b:01:02:03:04:05'::macaddr8; + ^ +SELECT '08:00-2b:01:02:03:04:05'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08:00-2b:01:02:03:04:05" +LINE 1: SELECT '08:00-2b:01:02:03:04:05'::macaddr8; + ^ +SELECT '08:00:2b:01.02:03:04:05'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08:00:2b:01.02:03:04:05" +LINE 1: SELECT '08:00:2b:01.02:03:04:05'::macaddr8; + ^ +SELECT '08:00:2b:01.02:03:04:05'::macaddr8; -- invalid +ERROR: invalid input syntax for type macaddr8: "08:00:2b:01.02:03:04:05" +LINE 1: SELECT '08:00:2b:01.02:03:04:05'::macaddr8; + ^ +-- test converting a MAC address to modified EUI-64 for inclusion +-- in an ipv6 address +SELECT macaddr8_set7bit('00:08:2b:01:02:03'::macaddr8); + macaddr8_set7bit +------------------------- + 02:08:2b:ff:fe:01:02:03 +(1 row) + +CREATE TABLE macaddr8_data (a int, b macaddr8); +INSERT INTO macaddr8_data VALUES (1, '08:00:2b:01:02:03'); +INSERT INTO macaddr8_data VALUES (2, '08-00-2b-01-02-03'); +INSERT INTO macaddr8_data VALUES (3, '08002b:010203'); +INSERT INTO macaddr8_data VALUES (4, '08002b-010203'); +INSERT INTO macaddr8_data VALUES (5, '0800.2b01.0203'); +INSERT INTO macaddr8_data VALUES (6, '0800-2b01-0203'); +INSERT INTO macaddr8_data VALUES (7, '08002b010203'); +INSERT INTO macaddr8_data VALUES (8, '0800:2b01:0203'); +INSERT INTO macaddr8_data VALUES (9, 'not even close'); -- invalid +ERROR: invalid input syntax for type macaddr8: "not even close" +LINE 1: INSERT INTO macaddr8_data VALUES (9, 'not even close'); + ^ +INSERT INTO macaddr8_data VALUES (10, '08:00:2b:01:02:04'); +INSERT INTO macaddr8_data VALUES (11, '08:00:2b:01:02:02'); +INSERT INTO macaddr8_data VALUES (12, '08:00:2a:01:02:03'); +INSERT INTO macaddr8_data VALUES (13, '08:00:2c:01:02:03'); +INSERT INTO macaddr8_data VALUES (14, '08:00:2a:01:02:04'); +INSERT INTO macaddr8_data VALUES (15, '08:00:2b:01:02:03:04:05'); +INSERT INTO macaddr8_data VALUES (16, '08-00-2b-01-02-03-04-05'); +INSERT INTO macaddr8_data VALUES (17, '08002b:0102030405'); +INSERT INTO macaddr8_data VALUES (18, '08002b-0102030405'); +INSERT INTO macaddr8_data VALUES (19, '0800.2b01.0203.0405'); +INSERT INTO macaddr8_data VALUES (20, '08002b01:02030405'); +INSERT INTO macaddr8_data VALUES (21, '08002b0102030405'); +SELECT * FROM macaddr8_data ORDER BY 1; + a | b +----+------------------------- + 1 | 08:00:2b:ff:fe:01:02:03 + 2 | 08:00:2b:ff:fe:01:02:03 + 3 | 08:00:2b:ff:fe:01:02:03 + 4 | 08:00:2b:ff:fe:01:02:03 + 5 | 08:00:2b:ff:fe:01:02:03 + 6 | 08:00:2b:ff:fe:01:02:03 + 7 | 08:00:2b:ff:fe:01:02:03 + 8 | 08:00:2b:ff:fe:01:02:03 + 10 | 08:00:2b:ff:fe:01:02:04 + 11 | 08:00:2b:ff:fe:01:02:02 + 12 | 08:00:2a:ff:fe:01:02:03 + 13 | 08:00:2c:ff:fe:01:02:03 + 14 | 08:00:2a:ff:fe:01:02:04 + 15 | 08:00:2b:01:02:03:04:05 + 16 | 08:00:2b:01:02:03:04:05 + 17 | 08:00:2b:01:02:03:04:05 + 18 | 08:00:2b:01:02:03:04:05 + 19 | 08:00:2b:01:02:03:04:05 + 20 | 08:00:2b:01:02:03:04:05 + 21 | 08:00:2b:01:02:03:04:05 +(20 rows) + +CREATE INDEX macaddr8_data_btree ON macaddr8_data USING btree (b); +CREATE INDEX macaddr8_data_hash ON macaddr8_data USING hash (b); +SELECT a, b, trunc(b) FROM macaddr8_data ORDER BY 2, 1; + a | b | trunc +----+-------------------------+------------------------- + 12 | 08:00:2a:ff:fe:01:02:03 | 08:00:2a:00:00:00:00:00 + 14 | 08:00:2a:ff:fe:01:02:04 | 08:00:2a:00:00:00:00:00 + 15 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00 + 16 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00 + 17 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00 + 18 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00 + 19 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00 + 20 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00 + 21 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00 + 11 | 08:00:2b:ff:fe:01:02:02 | 08:00:2b:00:00:00:00:00 + 1 | 08:00:2b:ff:fe:01:02:03 | 08:00:2b:00:00:00:00:00 + 2 | 08:00:2b:ff:fe:01:02:03 | 08:00:2b:00:00:00:00:00 + 3 | 08:00:2b:ff:fe:01:02:03 | 08:00:2b:00:00:00:00:00 + 4 | 08:00:2b:ff:fe:01:02:03 | 08:00:2b:00:00:00:00:00 + 5 | 08:00:2b:ff:fe:01:02:03 | 08:00:2b:00:00:00:00:00 + 6 | 08:00:2b:ff:fe:01:02:03 | 08:00:2b:00:00:00:00:00 + 7 | 08:00:2b:ff:fe:01:02:03 | 08:00:2b:00:00:00:00:00 + 8 | 08:00:2b:ff:fe:01:02:03 | 08:00:2b:00:00:00:00:00 + 10 | 08:00:2b:ff:fe:01:02:04 | 08:00:2b:00:00:00:00:00 + 13 | 08:00:2c:ff:fe:01:02:03 | 08:00:2c:00:00:00:00:00 +(20 rows) + +SELECT b < '08:00:2b:01:02:04' FROM macaddr8_data WHERE a = 1; -- true + ?column? +---------- + t +(1 row) + +SELECT b > '08:00:2b:ff:fe:01:02:04' FROM macaddr8_data WHERE a = 1; -- false + ?column? +---------- + f +(1 row) + +SELECT b > '08:00:2b:ff:fe:01:02:03' FROM macaddr8_data WHERE a = 1; -- false + ?column? +---------- + f +(1 row) + +SELECT b::macaddr <= '08:00:2b:01:02:04' FROM macaddr8_data WHERE a = 1; -- true + ?column? +---------- + t +(1 row) + +SELECT b::macaddr >= '08:00:2b:01:02:04' FROM macaddr8_data WHERE a = 1; -- false + ?column? +---------- + f +(1 row) + +SELECT b = '08:00:2b:ff:fe:01:02:03' FROM macaddr8_data WHERE a = 1; -- true + ?column? +---------- + t +(1 row) + +SELECT b::macaddr <> '08:00:2b:01:02:04'::macaddr FROM macaddr8_data WHERE a = 1; -- true + ?column? +---------- + t +(1 row) + +SELECT b::macaddr <> '08:00:2b:01:02:03'::macaddr FROM macaddr8_data WHERE a = 1; -- false + ?column? +---------- + f +(1 row) + +SELECT b < '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- true + ?column? +---------- + t +(1 row) + +SELECT b > '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- false + ?column? +---------- + f +(1 row) + +SELECT b > '08:00:2b:01:02:03:04:05' FROM macaddr8_data WHERE a = 15; -- false + ?column? +---------- + f +(1 row) + +SELECT b <= '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- true + ?column? +---------- + t +(1 row) + +SELECT b >= '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- false + ?column? +---------- + f +(1 row) + +SELECT b = '08:00:2b:01:02:03:04:05' FROM macaddr8_data WHERE a = 15; -- true + ?column? +---------- + t +(1 row) + +SELECT b <> '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- true + ?column? +---------- + t +(1 row) + +SELECT b <> '08:00:2b:01:02:03:04:05' FROM macaddr8_data WHERE a = 15; -- false + ?column? +---------- + f +(1 row) + +SELECT ~b FROM macaddr8_data; + ?column? +------------------------- + f7:ff:d4:00:01:fe:fd:fc + f7:ff:d4:00:01:fe:fd:fc + f7:ff:d4:00:01:fe:fd:fc + f7:ff:d4:00:01:fe:fd:fc + f7:ff:d4:00:01:fe:fd:fc + f7:ff:d4:00:01:fe:fd:fc + f7:ff:d4:00:01:fe:fd:fc + f7:ff:d4:00:01:fe:fd:fc + f7:ff:d4:00:01:fe:fd:fb + f7:ff:d4:00:01:fe:fd:fd + f7:ff:d5:00:01:fe:fd:fc + f7:ff:d3:00:01:fe:fd:fc + f7:ff:d5:00:01:fe:fd:fb + f7:ff:d4:fe:fd:fc:fb:fa + f7:ff:d4:fe:fd:fc:fb:fa + f7:ff:d4:fe:fd:fc:fb:fa + f7:ff:d4:fe:fd:fc:fb:fa + f7:ff:d4:fe:fd:fc:fb:fa + f7:ff:d4:fe:fd:fc:fb:fa + f7:ff:d4:fe:fd:fc:fb:fa +(20 rows) + +SELECT b & '00:00:00:ff:ff:ff' FROM macaddr8_data; + ?column? +------------------------- + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:04 + 00:00:00:ff:fe:01:02:02 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:03 + 00:00:00:ff:fe:01:02:04 + 00:00:00:01:02:03:04:05 + 00:00:00:01:02:03:04:05 + 00:00:00:01:02:03:04:05 + 00:00:00:01:02:03:04:05 + 00:00:00:01:02:03:04:05 + 00:00:00:01:02:03:04:05 + 00:00:00:01:02:03:04:05 +(20 rows) + +SELECT b | '01:02:03:04:05:06' FROM macaddr8_data; + ?column? +------------------------- + 09:02:2b:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:06 + 09:02:2b:ff:fe:05:07:06 + 09:02:2b:ff:fe:05:07:07 + 09:02:2f:ff:fe:05:07:07 + 09:02:2b:ff:fe:05:07:06 + 09:02:2b:ff:fe:07:05:07 + 09:02:2b:ff:fe:07:05:07 + 09:02:2b:ff:fe:07:05:07 + 09:02:2b:ff:fe:07:05:07 + 09:02:2b:ff:fe:07:05:07 + 09:02:2b:ff:fe:07:05:07 + 09:02:2b:ff:fe:07:05:07 +(20 rows) + +DROP TABLE macaddr8_data; diff --git a/src/test/singlenode_regress/expected/matview.out b/src/test/singlenode_regress/expected/matview.out new file mode 100644 index 00000000000..de78b3da078 --- /dev/null +++ b/src/test/singlenode_regress/expected/matview.out @@ -0,0 +1,676 @@ +-- create a table to use as a basis for views and materialized views in various combinations +CREATE TABLE mvtest_t (id int NOT NULL PRIMARY KEY, type text NOT NULL, amt numeric NOT NULL); +INSERT INTO mvtest_t VALUES + (1, 'x', 2), + (2, 'x', 3), + (3, 'y', 5), + (4, 'y', 7), + (5, 'z', 11); +-- we want a view based on the table, too, since views present additional challenges +CREATE VIEW mvtest_tv AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type; +SELECT * FROM mvtest_tv ORDER BY type; + type | totamt +------+-------- + x | 5 + y | 12 + z | 11 +(3 rows) + +-- create a materialized view with no data, and confirm correct behavior +EXPLAIN (costs off) + CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA; + QUERY PLAN +---------------------------- + HashAggregate + Group Key: type + -> Seq Scan on mvtest_t +(3 rows) + +CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA; +SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass; + relispopulated +---------------- + f +(1 row) + +SELECT * FROM mvtest_tm ORDER BY type; +ERROR: materialized view "mvtest_tm" has not been populated +HINT: Use the REFRESH MATERIALIZED VIEW command. +REFRESH MATERIALIZED VIEW mvtest_tm; +SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass; + relispopulated +---------------- + t +(1 row) + +CREATE UNIQUE INDEX mvtest_tm_type ON mvtest_tm (type); +SELECT * FROM mvtest_tm ORDER BY type; + type | totamt +------+-------- + x | 5 + y | 12 + z | 11 +(3 rows) + +-- create various views +EXPLAIN (costs off) + CREATE MATERIALIZED VIEW mvtest_tvm AS SELECT * FROM mvtest_tv ORDER BY type; + QUERY PLAN +---------------------------------- + Sort + Sort Key: mvtest_t.type + -> HashAggregate + Group Key: mvtest_t.type + -> Seq Scan on mvtest_t +(5 rows) + +CREATE MATERIALIZED VIEW mvtest_tvm AS SELECT * FROM mvtest_tv ORDER BY type; +SELECT * FROM mvtest_tvm; + type | totamt +------+-------- + x | 5 + y | 12 + z | 11 +(3 rows) + +CREATE MATERIALIZED VIEW mvtest_tmm AS SELECT sum(totamt) AS grandtot FROM mvtest_tm; +CREATE MATERIALIZED VIEW mvtest_tvmm AS SELECT sum(totamt) AS grandtot FROM mvtest_tvm; +CREATE UNIQUE INDEX mvtest_tvmm_expr ON mvtest_tvmm ((grandtot > 0)); +CREATE UNIQUE INDEX mvtest_tvmm_pred ON mvtest_tvmm (grandtot) WHERE grandtot < 0; +CREATE VIEW mvtest_tvv AS SELECT sum(totamt) AS grandtot FROM mvtest_tv; +EXPLAIN (costs off) + CREATE MATERIALIZED VIEW mvtest_tvvm AS SELECT * FROM mvtest_tvv; + QUERY PLAN +---------------------------------- + Aggregate + -> HashAggregate + Group Key: mvtest_t.type + -> Seq Scan on mvtest_t +(4 rows) + +CREATE MATERIALIZED VIEW mvtest_tvvm AS SELECT * FROM mvtest_tvv; +CREATE VIEW mvtest_tvvmv AS SELECT * FROM mvtest_tvvm; +CREATE MATERIALIZED VIEW mvtest_bb AS SELECT * FROM mvtest_tvvmv; +CREATE INDEX mvtest_aa ON mvtest_bb (grandtot); +-- check that plans seem reasonable +\d+ mvtest_tvm + Materialized view "public.mvtest_tvm" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + type | text | | | | extended | | + totamt | numeric | | | | main | | +View definition: + SELECT mvtest_tv.type, + mvtest_tv.totamt + FROM mvtest_tv + ORDER BY mvtest_tv.type; + +\d+ mvtest_tvm + Materialized view "public.mvtest_tvm" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + type | text | | | | extended | | + totamt | numeric | | | | main | | +View definition: + SELECT mvtest_tv.type, + mvtest_tv.totamt + FROM mvtest_tv + ORDER BY mvtest_tv.type; + +\d+ mvtest_tvvm + Materialized view "public.mvtest_tvvm" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +----------+---------+-----------+----------+---------+---------+--------------+------------- + grandtot | numeric | | | | main | | +View definition: + SELECT mvtest_tvv.grandtot + FROM mvtest_tvv; + +\d+ mvtest_bb + Materialized view "public.mvtest_bb" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +----------+---------+-----------+----------+---------+---------+--------------+------------- + grandtot | numeric | | | | main | | +Indexes: + "mvtest_aa" btree (grandtot) +View definition: + SELECT mvtest_tvvmv.grandtot + FROM mvtest_tvvmv; + +-- test schema behavior +CREATE SCHEMA mvtest_mvschema; +ALTER MATERIALIZED VIEW mvtest_tvm SET SCHEMA mvtest_mvschema; +\d+ mvtest_tvm +\d+ mvtest_tvmm + Materialized view "public.mvtest_tvmm" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +----------+---------+-----------+----------+---------+---------+--------------+------------- + grandtot | numeric | | | | main | | +Indexes: + "mvtest_tvmm_expr" UNIQUE, btree ((grandtot > 0::numeric)) + "mvtest_tvmm_pred" UNIQUE, btree (grandtot) WHERE grandtot < 0::numeric +View definition: + SELECT sum(mvtest_tvm.totamt) AS grandtot + FROM mvtest_mvschema.mvtest_tvm; + +SET search_path = mvtest_mvschema, public; +\d+ mvtest_tvm + Materialized view "mvtest_mvschema.mvtest_tvm" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + type | text | | | | extended | | + totamt | numeric | | | | main | | +View definition: + SELECT mvtest_tv.type, + mvtest_tv.totamt + FROM mvtest_tv + ORDER BY mvtest_tv.type; + +-- modify the underlying table data +INSERT INTO mvtest_t VALUES (6, 'z', 13); +-- confirm pre- and post-refresh contents of fairly simple materialized views +SELECT * FROM mvtest_tm ORDER BY type; + type | totamt +------+-------- + x | 5 + y | 12 + z | 11 +(3 rows) + +SELECT * FROM mvtest_tvm ORDER BY type; + type | totamt +------+-------- + x | 5 + y | 12 + z | 11 +(3 rows) + +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_tm; +REFRESH MATERIALIZED VIEW mvtest_tvm; +SELECT * FROM mvtest_tm ORDER BY type; + type | totamt +------+-------- + x | 5 + y | 12 + z | 24 +(3 rows) + +SELECT * FROM mvtest_tvm ORDER BY type; + type | totamt +------+-------- + x | 5 + y | 12 + z | 24 +(3 rows) + +RESET search_path; +-- confirm pre- and post-refresh contents of nested materialized views +EXPLAIN (costs off) + SELECT * FROM mvtest_tmm; + QUERY PLAN +------------------------ + Seq Scan on mvtest_tmm +(1 row) + +EXPLAIN (costs off) + SELECT * FROM mvtest_tvmm; + QUERY PLAN +------------------------- + Seq Scan on mvtest_tvmm +(1 row) + +EXPLAIN (costs off) + SELECT * FROM mvtest_tvvm; + QUERY PLAN +------------------------- + Seq Scan on mvtest_tvvm +(1 row) + +SELECT * FROM mvtest_tmm; + grandtot +---------- + 28 +(1 row) + +SELECT * FROM mvtest_tvmm; + grandtot +---------- + 28 +(1 row) + +SELECT * FROM mvtest_tvvm; + grandtot +---------- + 28 +(1 row) + +REFRESH MATERIALIZED VIEW mvtest_tmm; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_tvmm; +ERROR: cannot refresh materialized view "public.mvtest_tvmm" concurrently +HINT: Create a unique index with no WHERE clause on one or more columns of the materialized view. +REFRESH MATERIALIZED VIEW mvtest_tvmm; +REFRESH MATERIALIZED VIEW mvtest_tvvm; +EXPLAIN (costs off) + SELECT * FROM mvtest_tmm; + QUERY PLAN +------------------------ + Seq Scan on mvtest_tmm +(1 row) + +EXPLAIN (costs off) + SELECT * FROM mvtest_tvmm; + QUERY PLAN +------------------------- + Seq Scan on mvtest_tvmm +(1 row) + +EXPLAIN (costs off) + SELECT * FROM mvtest_tvvm; + QUERY PLAN +------------------------- + Seq Scan on mvtest_tvvm +(1 row) + +SELECT * FROM mvtest_tmm; + grandtot +---------- + 41 +(1 row) + +SELECT * FROM mvtest_tvmm; + grandtot +---------- + 41 +(1 row) + +SELECT * FROM mvtest_tvvm; + grandtot +---------- + 41 +(1 row) + +-- test diemv when the mv does not exist +DROP MATERIALIZED VIEW IF EXISTS no_such_mv; +NOTICE: materialized view "no_such_mv" does not exist, skipping +-- make sure invalid combination of options is prohibited +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_tvmm WITH NO DATA; +ERROR: CONCURRENTLY and WITH NO DATA options cannot be used together +-- no tuple locks on materialized views +SELECT * FROM mvtest_tvvm FOR SHARE; +ERROR: cannot lock rows in materialized view "mvtest_tvvm" +-- test join of mv and view +SELECT type, m.totamt AS mtot, v.totamt AS vtot FROM mvtest_tm m LEFT JOIN mvtest_tv v USING (type) ORDER BY type; + type | mtot | vtot +------+------+------ + x | 5 | 5 + y | 12 | 12 + z | 24 | 24 +(3 rows) + +-- make sure that dependencies are reported properly when they block the drop +DROP TABLE mvtest_t; +ERROR: cannot drop table mvtest_t because other objects depend on it +DETAIL: view mvtest_tv depends on table mvtest_t +materialized view mvtest_mvschema.mvtest_tvm depends on view mvtest_tv +materialized view mvtest_tvmm depends on materialized view mvtest_mvschema.mvtest_tvm +view mvtest_tvv depends on view mvtest_tv +materialized view mvtest_tvvm depends on view mvtest_tvv +view mvtest_tvvmv depends on materialized view mvtest_tvvm +materialized view mvtest_bb depends on view mvtest_tvvmv +materialized view mvtest_tm depends on table mvtest_t +materialized view mvtest_tmm depends on materialized view mvtest_tm +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- make sure dependencies are dropped and reported +-- and make sure that transactional behavior is correct on rollback +-- incidentally leaving some interesting materialized views for pg_dump testing +BEGIN; +DROP TABLE mvtest_t CASCADE; +NOTICE: drop cascades to 9 other objects +DETAIL: drop cascades to view mvtest_tv +drop cascades to materialized view mvtest_mvschema.mvtest_tvm +drop cascades to materialized view mvtest_tvmm +drop cascades to view mvtest_tvv +drop cascades to materialized view mvtest_tvvm +drop cascades to view mvtest_tvvmv +drop cascades to materialized view mvtest_bb +drop cascades to materialized view mvtest_tm +drop cascades to materialized view mvtest_tmm +ROLLBACK; +-- some additional tests not using base tables +CREATE VIEW mvtest_vt1 AS SELECT 1 moo; +CREATE VIEW mvtest_vt2 AS SELECT moo, 2*moo FROM mvtest_vt1 UNION ALL SELECT moo, 3*moo FROM mvtest_vt1; +\d+ mvtest_vt2 + View "public.mvtest_vt2" + Column | Type | Collation | Nullable | Default | Storage | Description +----------+---------+-----------+----------+---------+---------+------------- + moo | integer | | | | plain | + ?column? | integer | | | | plain | +View definition: + SELECT mvtest_vt1.moo, + 2 * mvtest_vt1.moo AS "?column?" + FROM mvtest_vt1 +UNION ALL + SELECT mvtest_vt1.moo, + 3 * mvtest_vt1.moo + FROM mvtest_vt1; + +CREATE MATERIALIZED VIEW mv_test2 AS SELECT moo, 2*moo FROM mvtest_vt2 UNION ALL SELECT moo, 3*moo FROM mvtest_vt2; +\d+ mv_test2 + Materialized view "public.mv_test2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +----------+---------+-----------+----------+---------+---------+--------------+------------- + moo | integer | | | | plain | | + ?column? | integer | | | | plain | | +View definition: + SELECT mvtest_vt2.moo, + 2 * mvtest_vt2.moo AS "?column?" + FROM mvtest_vt2 +UNION ALL + SELECT mvtest_vt2.moo, + 3 * mvtest_vt2.moo + FROM mvtest_vt2; + +CREATE MATERIALIZED VIEW mv_test3 AS SELECT * FROM mv_test2 WHERE moo = 12345; +SELECT relispopulated FROM pg_class WHERE oid = 'mv_test3'::regclass; + relispopulated +---------------- + t +(1 row) + +DROP VIEW mvtest_vt1 CASCADE; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to view mvtest_vt2 +drop cascades to materialized view mv_test2 +drop cascades to materialized view mv_test3 +-- test that duplicate values on unique index prevent refresh +CREATE TABLE mvtest_foo(a, b) AS VALUES(1, 10); +CREATE MATERIALIZED VIEW mvtest_mv AS SELECT * FROM mvtest_foo; +CREATE UNIQUE INDEX ON mvtest_mv(a); +INSERT INTO mvtest_foo SELECT * FROM mvtest_foo; +REFRESH MATERIALIZED VIEW mvtest_mv; +ERROR: could not create unique index "mvtest_mv_a_idx" +DETAIL: Key (a)=(1) is duplicated. +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv; +ERROR: new data for materialized view "mvtest_mv" contains duplicate rows without any null columns +DETAIL: Row: (1,10) +DROP TABLE mvtest_foo CASCADE; +NOTICE: drop cascades to materialized view mvtest_mv +-- make sure that all columns covered by unique indexes works +CREATE TABLE mvtest_foo(a, b, c) AS VALUES(1, 2, 3); +CREATE MATERIALIZED VIEW mvtest_mv AS SELECT * FROM mvtest_foo; +CREATE UNIQUE INDEX ON mvtest_mv (a); +CREATE UNIQUE INDEX ON mvtest_mv (b); +CREATE UNIQUE INDEX on mvtest_mv (c); +INSERT INTO mvtest_foo VALUES(2, 3, 4); +INSERT INTO mvtest_foo VALUES(3, 4, 5); +REFRESH MATERIALIZED VIEW mvtest_mv; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv; +DROP TABLE mvtest_foo CASCADE; +NOTICE: drop cascades to materialized view mvtest_mv +-- allow subquery to reference unpopulated matview if WITH NO DATA is specified +CREATE MATERIALIZED VIEW mvtest_mv1 AS SELECT 1 AS col1 WITH NO DATA; +CREATE MATERIALIZED VIEW mvtest_mv2 AS SELECT * FROM mvtest_mv1 + WHERE col1 = (SELECT LEAST(col1) FROM mvtest_mv1) WITH NO DATA; +DROP MATERIALIZED VIEW mvtest_mv1 CASCADE; +NOTICE: drop cascades to materialized view mvtest_mv2 +-- make sure that types with unusual equality tests work +CREATE TABLE mvtest_boxes (id serial primary key, b box); +INSERT INTO mvtest_boxes (b) VALUES + ('(32,32),(31,31)'), + ('(2.0000004,2.0000004),(1,1)'), + ('(1.9999996,1.9999996),(1,1)'); +CREATE MATERIALIZED VIEW mvtest_boxmv AS SELECT * FROM mvtest_boxes; +CREATE UNIQUE INDEX mvtest_boxmv_id ON mvtest_boxmv (id); +UPDATE mvtest_boxes SET b = '(2,2),(1,1)' WHERE id = 2; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_boxmv; +SELECT * FROM mvtest_boxmv ORDER BY id; + id | b +----+----------------------------- + 1 | (32,32),(31,31) + 2 | (2,2),(1,1) + 3 | (1.9999996,1.9999996),(1,1) +(3 rows) + +DROP TABLE mvtest_boxes CASCADE; +NOTICE: drop cascades to materialized view mvtest_boxmv +-- make sure that column names are handled correctly +CREATE TABLE mvtest_v (i int, j int); +CREATE MATERIALIZED VIEW mvtest_mv_v (ii, jj, kk) AS SELECT i, j FROM mvtest_v; -- error +ERROR: too many column names were specified +CREATE MATERIALIZED VIEW mvtest_mv_v (ii, jj) AS SELECT i, j FROM mvtest_v; -- ok +CREATE MATERIALIZED VIEW mvtest_mv_v_2 (ii) AS SELECT i, j FROM mvtest_v; -- ok +CREATE MATERIALIZED VIEW mvtest_mv_v_3 (ii, jj, kk) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- error +ERROR: too many column names were specified +CREATE MATERIALIZED VIEW mvtest_mv_v_3 (ii, jj) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- ok +CREATE MATERIALIZED VIEW mvtest_mv_v_4 (ii) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- ok +ALTER TABLE mvtest_v RENAME COLUMN i TO x; +INSERT INTO mvtest_v values (1, 2); +CREATE UNIQUE INDEX mvtest_mv_v_ii ON mvtest_mv_v (ii); +REFRESH MATERIALIZED VIEW mvtest_mv_v; +UPDATE mvtest_v SET j = 3 WHERE x = 1; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_v; +REFRESH MATERIALIZED VIEW mvtest_mv_v_2; +REFRESH MATERIALIZED VIEW mvtest_mv_v_3; +REFRESH MATERIALIZED VIEW mvtest_mv_v_4; +SELECT * FROM mvtest_v; + x | j +---+--- + 1 | 3 +(1 row) + +SELECT * FROM mvtest_mv_v; + ii | jj +----+---- + 1 | 3 +(1 row) + +SELECT * FROM mvtest_mv_v_2; + ii | j +----+--- + 1 | 3 +(1 row) + +SELECT * FROM mvtest_mv_v_3; + ii | jj +----+---- + 1 | 3 +(1 row) + +SELECT * FROM mvtest_mv_v_4; + ii | j +----+--- + 1 | 3 +(1 row) + +DROP TABLE mvtest_v CASCADE; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to materialized view mvtest_mv_v +drop cascades to materialized view mvtest_mv_v_2 +drop cascades to materialized view mvtest_mv_v_3 +drop cascades to materialized view mvtest_mv_v_4 +-- Check that unknown literals are converted to "text" in CREATE MATVIEW, +-- so that we don't end up with unknown-type columns. +CREATE MATERIALIZED VIEW mv_unspecified_types AS + SELECT 42 as i, 42.5 as num, 'foo' as u, 'foo'::unknown as u2, null as n; +\d+ mv_unspecified_types + Materialized view "public.mv_unspecified_types" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + i | integer | | | | plain | | + num | numeric | | | | main | | + u | text | | | | extended | | + u2 | text | | | | extended | | + n | text | | | | extended | | +View definition: + SELECT 42 AS i, + 42.5 AS num, + 'foo'::text AS u, + 'foo'::text AS u2, + NULL::text AS n; + +SELECT * FROM mv_unspecified_types; + i | num | u | u2 | n +----+------+-----+-----+--- + 42 | 42.5 | foo | foo | +(1 row) + +DROP MATERIALIZED VIEW mv_unspecified_types; +-- make sure that create WITH NO DATA does not plan the query (bug #13907) +create materialized view mvtest_error as select 1/0 as x; -- fail +ERROR: division by zero +create materialized view mvtest_error as select 1/0 as x with no data; +ERROR: division by zero +-- make sure that matview rows can be referenced as source rows (bug #9398) +CREATE TABLE mvtest_v AS SELECT generate_series(1,10) AS a; +CREATE MATERIALIZED VIEW mvtest_mv_v AS SELECT a FROM mvtest_v WHERE a <= 5; +DELETE FROM mvtest_v WHERE EXISTS ( SELECT * FROM mvtest_mv_v WHERE mvtest_mv_v.a = mvtest_v.a ); +SELECT * FROM mvtest_v; + a +---- + 6 + 7 + 8 + 9 + 10 +(5 rows) + +SELECT * FROM mvtest_mv_v; + a +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) + +DROP TABLE mvtest_v CASCADE; +NOTICE: drop cascades to materialized view mvtest_mv_v +-- make sure running as superuser works when MV owned by another role (bug #11208) +CREATE ROLE regress_user_mvtest; +SET ROLE regress_user_mvtest; +-- this test case also checks for ambiguity in the queries issued by +-- refresh_by_match_merge(), by choosing column names that intentionally +-- duplicate all the aliases used in those queries +CREATE TABLE mvtest_foo_data AS SELECT i, + i+1 AS tid, + md5(random()::text) AS mv, + md5(random()::text) AS newdata, + md5(random()::text) AS newdata2, + md5(random()::text) AS diff + FROM generate_series(1, 10) i; +CREATE MATERIALIZED VIEW mvtest_mv_foo AS SELECT * FROM mvtest_foo_data; +CREATE MATERIALIZED VIEW mvtest_mv_foo AS SELECT * FROM mvtest_foo_data; +ERROR: relation "mvtest_mv_foo" already exists +CREATE MATERIALIZED VIEW IF NOT EXISTS mvtest_mv_foo AS SELECT * FROM mvtest_foo_data; +NOTICE: relation "mvtest_mv_foo" already exists, skipping +CREATE UNIQUE INDEX ON mvtest_mv_foo (i); +RESET ROLE; +REFRESH MATERIALIZED VIEW mvtest_mv_foo; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo; +DROP OWNED BY regress_user_mvtest CASCADE; +DROP ROLE regress_user_mvtest; +-- make sure that create WITH NO DATA works via SPI +BEGIN; +CREATE FUNCTION mvtest_func() + RETURNS void AS $$ +BEGIN + CREATE MATERIALIZED VIEW mvtest1 AS SELECT 1 AS x; + CREATE MATERIALIZED VIEW mvtest2 AS SELECT 1 AS x WITH NO DATA; +END; +$$ LANGUAGE plpgsql; +SELECT mvtest_func(); + mvtest_func +------------- + +(1 row) + +SELECT * FROM mvtest1; + x +--- + 1 +(1 row) + +SELECT * FROM mvtest2; +ERROR: materialized view "mvtest2" has not been populated +HINT: Use the REFRESH MATERIALIZED VIEW command. +ROLLBACK; +-- INSERT privileges if relation owner is not allowed to insert. +CREATE SCHEMA matview_schema; +CREATE USER regress_matview_user; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_matview_user + REVOKE INSERT ON TABLES FROM regress_matview_user; +GRANT ALL ON SCHEMA matview_schema TO public; +SET SESSION AUTHORIZATION regress_matview_user; +CREATE MATERIALIZED VIEW matview_schema.mv_withdata1 (a) AS + SELECT generate_series(1, 10) WITH DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW matview_schema.mv_withdata2 (a) AS + SELECT generate_series(1, 10) WITH DATA; + QUERY PLAN +-------------------------------------- + ProjectSet (actual rows=10 loops=1) + -> Result (actual rows=1 loops=1) +(2 rows) + +REFRESH MATERIALIZED VIEW matview_schema.mv_withdata2; +CREATE MATERIALIZED VIEW matview_schema.mv_nodata1 (a) AS + SELECT generate_series(1, 10) WITH NO DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW matview_schema.mv_nodata2 (a) AS + SELECT generate_series(1, 10) WITH NO DATA; + QUERY PLAN +------------------------------- + ProjectSet (never executed) + -> Result (never executed) +(2 rows) + +REFRESH MATERIALIZED VIEW matview_schema.mv_nodata2; +RESET SESSION AUTHORIZATION; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_matview_user + GRANT INSERT ON TABLES TO regress_matview_user; +DROP SCHEMA matview_schema CASCADE; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to materialized view matview_schema.mv_withdata1 +drop cascades to materialized view matview_schema.mv_withdata2 +drop cascades to materialized view matview_schema.mv_nodata1 +drop cascades to materialized view matview_schema.mv_nodata2 +DROP USER regress_matview_user; +-- CREATE MATERIALIZED VIEW ... IF NOT EXISTS +CREATE MATERIALIZED VIEW matview_ine_tab AS SELECT 1; +CREATE MATERIALIZED VIEW matview_ine_tab AS SELECT 1 / 0; -- error +ERROR: relation "matview_ine_tab" already exists +CREATE MATERIALIZED VIEW IF NOT EXISTS matview_ine_tab AS + SELECT 1 / 0; -- ok +NOTICE: relation "matview_ine_tab" already exists, skipping +CREATE MATERIALIZED VIEW matview_ine_tab AS + SELECT 1 / 0 WITH NO DATA; -- error +ERROR: relation "matview_ine_tab" already exists +CREATE MATERIALIZED VIEW IF NOT EXISTS matview_ine_tab AS + SELECT 1 / 0 WITH NO DATA; -- ok +NOTICE: relation "matview_ine_tab" already exists, skipping +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW matview_ine_tab AS + SELECT 1 / 0; -- error +ERROR: relation "matview_ine_tab" already exists +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW IF NOT EXISTS matview_ine_tab AS + SELECT 1 / 0; -- ok +NOTICE: relation "matview_ine_tab" already exists, skipping + QUERY PLAN +------------ +(0 rows) + +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW matview_ine_tab AS + SELECT 1 / 0 WITH NO DATA; -- error +ERROR: relation "matview_ine_tab" already exists +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW IF NOT EXISTS matview_ine_tab AS + SELECT 1 / 0 WITH NO DATA; -- ok +NOTICE: relation "matview_ine_tab" already exists, skipping + QUERY PLAN +------------ +(0 rows) + +DROP MATERIALIZED VIEW matview_ine_tab; diff --git a/src/test/singlenode_regress/expected/matview_ao.out b/src/test/singlenode_regress/expected/matview_ao.out new file mode 100644 index 00000000000..9f3c82b6827 --- /dev/null +++ b/src/test/singlenode_regress/expected/matview_ao.out @@ -0,0 +1,125 @@ +CREATE ROLE matview_ao_role; +SET ROLE matview_ao_role; +CREATE TABLE t_matview_ao (id int NOT NULL PRIMARY KEY, type text NOT NULL, amt numeric NOT NULL); +INSERT INTO t_matview_ao VALUES + (1, 'x', 2), + (2, 'x', 3), + (3, 'y', 5), + (4, 'y', 7), + (5, 'z', 11); +CREATE MATERIALIZED VIEW m_heap AS SELECT type, sum(amt) AS totamt FROM t_matview_ao GROUP BY type WITH NO DATA; +CREATE UNIQUE INDEX m_heap_index ON m_heap(type); +SELECT * from m_heap; +ERROR: materialized view "m_heap" has not been populated +HINT: Use the REFRESH MATERIALIZED VIEW command. +REFRESH MATERIALIZED VIEW CONCURRENTLY m_heap; +ERROR: CONCURRENTLY cannot be used when the materialized view is not populated +REFRESH MATERIALIZED VIEW m_heap; +SELECT * FROM m_heap; + type | totamt +------+-------- + z | 11 + y | 12 + x | 5 +(3 rows) + +REFRESH MATERIALIZED VIEW CONCURRENTLY m_heap; +SELECT * FROM m_heap; + type | totamt +------+-------- + y | 12 + x | 5 + z | 11 +(3 rows) + +REFRESH MATERIALIZED VIEW m_heap WITH NO DATA; +SELECT * FROM m_heap; +ERROR: materialized view "m_heap" has not been populated +HINT: Use the REFRESH MATERIALIZED VIEW command. +-- test WITH NO DATA is also dispatched to QEs +-- select relispopulated from gp_dist_random('pg_class') where relname = 'm_heap'; +REFRESH MATERIALIZED VIEW m_heap; +SELECT * FROM m_heap; + type | totamt +------+-------- + y | 12 + x | 5 + z | 11 +(3 rows) + +CREATE MATERIALIZED VIEW m_ao with (appendonly=true) AS SELECT type, sum(amt) AS totamt FROM t_matview_ao GROUP BY type WITH NO DATA; +SELECT * from m_ao; +ERROR: materialized view "m_ao" has not been populated +HINT: Use the REFRESH MATERIALIZED VIEW command. +REFRESH MATERIALIZED VIEW m_ao; +SELECT * FROM m_ao; + type | totamt +------+-------- + y | 12 + x | 5 + z | 11 +(3 rows) + +REFRESH MATERIALIZED VIEW m_ao WITH NO DATA; +SELECT * FROM m_ao; +ERROR: materialized view "m_ao" has not been populated +HINT: Use the REFRESH MATERIALIZED VIEW command. +REFRESH MATERIALIZED VIEW m_ao; +SELECT * FROM m_ao; + type | totamt +------+-------- + y | 12 + x | 5 + z | 11 +(3 rows) + +CREATE MATERIALIZED VIEW m_aocs with (appendonly=true, orientation=column) AS SELECT type, sum(amt) AS totamt FROM t_matview_ao GROUP BY type WITH NO DATA; +SELECT * from m_aocs; +ERROR: materialized view "m_aocs" has not been populated +HINT: Use the REFRESH MATERIALIZED VIEW command. +REFRESH MATERIALIZED VIEW m_aocs; +SELECT * FROM m_aocs; + type | totamt +------+-------- + z | 11 + y | 12 + x | 5 +(3 rows) + +REFRESH MATERIALIZED VIEW m_aocs WITH NO DATA; +SELECT * FROM m_aocs; +ERROR: materialized view "m_aocs" has not been populated +HINT: Use the REFRESH MATERIALIZED VIEW command. +REFRESH MATERIALIZED VIEW m_aocs; +SELECT * FROM m_aocs; + type | totamt +------+-------- + z | 11 + y | 12 + x | 5 +(3 rows) + +\dm m_heap + List of relations + Schema | Name | Type | Owner +--------+--------+-------------------+----------------- + public | m_heap | materialized view | matview_ao_role +(1 row) + +\dm m_ao + List of relations + Schema | Name | Type | Owner +--------+------+-------------------+----------------- + public | m_ao | materialized view | matview_ao_role +(1 row) + +\dm m_aocs + List of relations + Schema | Name | Type | Owner +--------+--------+-------------------+----------------- + public | m_aocs | materialized view | matview_ao_role +(1 row) + +RESET ROLE; +DROP OWNED BY matview_ao_role CASCADE; +DROP ROLE matview_ao_role; diff --git a/src/test/singlenode_regress/expected/memoize.out b/src/test/singlenode_regress/expected/memoize.out new file mode 100644 index 00000000000..3ce36a5342d --- /dev/null +++ b/src/test/singlenode_regress/expected/memoize.out @@ -0,0 +1,285 @@ +-- Perform tests on the Memoize node. +-- GPDB_14_MERGE_FIXME: +-- 1.test memoize in CBDB as enable_nestloop is false by default +-- 2.enable memoize in orca +-- The cache hits/misses/evictions from the Memoize node can vary between +-- machines. Let's just replace the number with an 'N'. In order to allow us +-- to perform validation when the measure was zero, we replace a zero value +-- with "Zero". All other numbers are replaced with 'N'. +create function explain_memoize(query text, hide_hitmiss bool) returns setof text +language plpgsql as +$$ +declare + ln text; +begin + for ln in + execute format('explain (analyze, costs off, summary off, timing off) %s', + query) + loop + if hide_hitmiss = true then + ln := regexp_replace(ln, 'Hits: 0', 'Hits: Zero'); + ln := regexp_replace(ln, 'Hits: \d+', 'Hits: N'); + ln := regexp_replace(ln, 'Misses: 0', 'Misses: Zero'); + ln := regexp_replace(ln, 'Misses: \d+', 'Misses: N'); + end if; + ln := regexp_replace(ln, 'Evictions: 0', 'Evictions: Zero'); + ln := regexp_replace(ln, 'Evictions: \d+', 'Evictions: N'); + ln := regexp_replace(ln, 'Memory Usage: \d+', 'Memory Usage: N'); + ln := regexp_replace(ln, 'Memory: \d+', 'Memory: N'); + ln := regexp_replace(ln, 'Heap Fetches: \d+', 'Heap Fetches: N'); + ln := regexp_replace(ln, 'loops=\d+', 'loops=N'); + return next ln; + end loop; +end; +$$; +-- Ensure we get a memoize node on the inner side of the nested loop +SET enable_hashjoin TO off; +SET enable_bitmapscan TO off; +SELECT explain_memoize(' +SELECT COUNT(*),AVG(t1.unique1) FROM tenk1 t1 +INNER JOIN tenk1 t2 ON t1.unique1 = t2.twenty +WHERE t2.unique1 < 1000;', false); + explain_memoize +------------------------------------------------------------------------------------------- + Aggregate (actual rows=1 loops=N) + -> Nested Loop (actual rows=1000 loops=N) + -> Seq Scan on tenk1 t2 (actual rows=1000 loops=N) + Filter: (unique1 < 1000) + Rows Removed by Filter: 9000 + -> Memoize (actual rows=1 loops=N) + Cache Key: t2.twenty + Cache Mode: logical + Hits: 980 Misses: 20 Evictions: Zero Overflows: 0 Memory Usage: NkB + -> Index Only Scan using tenk1_unique1 on tenk1 t1 (actual rows=1 loops=N) + Index Cond: (unique1 = t2.twenty) + Heap Fetches: N + Optimizer: Postgres query optimizer +(13 rows) + +-- And check we get the expected results. +SELECT COUNT(*),AVG(t1.unique1) FROM tenk1 t1 +INNER JOIN tenk1 t2 ON t1.unique1 = t2.twenty +WHERE t2.unique1 < 1000; + count | avg +-------+-------------------- + 1000 | 9.5000000000000000 +(1 row) + +-- Try with LATERAL joins +SELECT explain_memoize(' +SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, +LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 +WHERE t1.unique1 < 1000;', false); + explain_memoize +------------------------------------------------------------------------------------------- + Aggregate (actual rows=1 loops=N) + -> Nested Loop (actual rows=1000 loops=N) + -> Seq Scan on tenk1 t1 (actual rows=1000 loops=N) + Filter: (unique1 < 1000) + Rows Removed by Filter: 9000 + -> Memoize (actual rows=1 loops=N) + Cache Key: t1.twenty + Cache Mode: logical + Hits: 980 Misses: 20 Evictions: Zero Overflows: 0 Memory Usage: NkB + -> Index Only Scan using tenk1_unique1 on tenk1 t2 (actual rows=1 loops=N) + Index Cond: (unique1 = t1.twenty) + Heap Fetches: N + Optimizer: Postgres query optimizer +(13 rows) + +-- And check we get the expected results. +SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, +LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 +WHERE t1.unique1 < 1000; + count | avg +-------+-------------------- + 1000 | 9.5000000000000000 +(1 row) + +-- Reduce work_mem so that we see some cache evictions +SET work_mem TO '64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +SET enable_mergejoin TO off; +-- Ensure we get some evictions. We're unable to validate the hits and misses +-- here as the number of entries that fit in the cache at once will vary +-- between different machines. +SELECT explain_memoize(' +SELECT COUNT(*),AVG(t1.unique1) FROM tenk1 t1 +INNER JOIN tenk1 t2 ON t1.unique1 = t2.thousand +WHERE t2.unique1 < 1200;', true); + explain_memoize +---------------------------------------------------------------------------------------- + Aggregate (actual rows=1 loops=N) + -> Merge Join (actual rows=1200 loops=N) + Merge Cond: (t1.unique1 = t2.thousand) + -> Index Only Scan using tenk1_unique1 on tenk1 t1 (actual rows=1001 loops=N) + Heap Fetches: N + -> Sort (actual rows=1200 loops=N) + Sort Key: t2.thousand + Sort Method: external sort Disk: 64kB + -> Seq Scan on tenk1 t2 (actual rows=1200 loops=N) + Filter: (unique1 < 1200) + Rows Removed by Filter: 8800 + Optimizer: Postgres query optimizer +(12 rows) + +CREATE TABLE flt (f float); +CREATE INDEX flt_f_idx ON flt (f); +INSERT INTO flt VALUES('-0.0'::float),('+0.0'::float); +ANALYZE flt; +SET enable_seqscan TO off; +-- Ensure memoize operates in logical mode +SELECT explain_memoize(' +SELECT * FROM flt f1 INNER JOIN flt f2 ON f1.f = f2.f;', false); + explain_memoize +------------------------------------------------------------------------------- + Nested Loop (actual rows=4 loops=N) + -> Index Only Scan using flt_f_idx on flt f1 (actual rows=2 loops=N) + Heap Fetches: N + -> Memoize (actual rows=2 loops=N) + Cache Key: f1.f + Cache Mode: logical + Hits: 1 Misses: 1 Evictions: Zero Overflows: 0 Memory Usage: NkB + -> Index Only Scan using flt_f_idx on flt f2 (actual rows=2 loops=N) + Index Cond: (f = f1.f) + Heap Fetches: N + Optimizer: Postgres query optimizer +(11 rows) + +-- Ensure memoize operates in binary mode +SELECT explain_memoize(' +SELECT * FROM flt f1 INNER JOIN flt f2 ON f1.f >= f2.f;', false); + explain_memoize +------------------------------------------------------------------------------- + Nested Loop (actual rows=4 loops=N) + -> Index Only Scan using flt_f_idx on flt f1 (actual rows=2 loops=N) + Heap Fetches: N + -> Memoize (actual rows=2 loops=N) + Cache Key: f1.f + Cache Mode: binary + Hits: 0 Misses: 2 Evictions: Zero Overflows: 0 Memory Usage: NkB + -> Index Only Scan using flt_f_idx on flt f2 (actual rows=2 loops=N) + Index Cond: (f <= f1.f) + Heap Fetches: N + Optimizer: Postgres query optimizer +(11 rows) + +DROP TABLE flt; +-- Exercise Memoize in binary mode with a large fixed width type and a +-- varlena type. +CREATE TABLE strtest (n name, t text); +CREATE INDEX strtest_n_idx ON strtest (n); +CREATE INDEX strtest_t_idx ON strtest (t); +INSERT INTO strtest VALUES('one','one'),('two','two'),('three',repeat(md5('three'),100)); +-- duplicate rows so we get some cache hits +INSERT INTO strtest SELECT * FROM strtest; +ANALYZE strtest; +-- Ensure we get 3 hits and 3 misses +SELECT explain_memoize(' +SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.n >= s2.n;', false); + explain_memoize +---------------------------------------------------------------------------------- + Nested Loop (actual rows=24 loops=N) + -> Seq Scan on strtest s1 (actual rows=6 loops=N) + -> Memoize (actual rows=4 loops=N) + Cache Key: s1.n + Cache Mode: binary + Hits: 3 Misses: 3 Evictions: Zero Overflows: 0 Memory Usage: NkB + -> Index Scan using strtest_n_idx on strtest s2 (actual rows=4 loops=N) + Index Cond: (n <= s1.n) + Optimizer: Postgres query optimizer +(9 rows) + +-- Ensure we get 3 hits and 3 misses +SELECT explain_memoize(' +SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.t >= s2.t;', false); + explain_memoize +---------------------------------------------------------------------------- + Nested Loop (actual rows=24 loops=N) + -> Seq Scan on strtest s1 (actual rows=6 loops=N) + -> Index Scan using strtest_t_idx on strtest s2 (actual rows=4 loops=N) + Index Cond: (t <= s1.t) + Optimizer: Postgres query optimizer +(5 rows) + +DROP TABLE strtest; +-- Exercise Memoize code that flushes the cache when a parameter changes which +-- is not part of the cache key. +-- Ensure we get a Memoize plan +EXPLAIN (COSTS OFF) +SELECT unique1 FROM tenk1 t0 +WHERE unique1 < 3 + AND EXISTS ( + SELECT 1 FROM tenk1 t1 + INNER JOIN tenk1 t2 ON t1.unique1 = t2.hundred + WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0); + QUERY PLAN +---------------------------------------------------------- + Index Scan using tenk1_unique1 on tenk1 t0 + Index Cond: (unique1 < 3) + Filter: (SubPlan 1) + SubPlan 1 + -> Merge Join + Merge Cond: (t1.unique1 = t2.hundred) + -> Index Scan using tenk1_unique1 on tenk1 t1 + Filter: (t0.ten = twenty) + -> Index Scan using tenk1_hundred on tenk1 t2 + Filter: (t0.two <> four) + Optimizer: Postgres query optimizer +(11 rows) + +-- Ensure the above query returns the correct result +SELECT unique1 FROM tenk1 t0 +WHERE unique1 < 3 + AND EXISTS ( + SELECT 1 FROM tenk1 t1 + INNER JOIN tenk1 t2 ON t1.unique1 = t2.hundred + WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0); + unique1 +--------- + 2 +(1 row) + +RESET enable_seqscan; +RESET enable_mergejoin; +RESET work_mem; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +RESET enable_bitmapscan; +RESET enable_hashjoin; +-- Test parallel plans with Memoize +SET min_parallel_table_scan_size TO 0; +SET parallel_setup_cost TO 0; +SET parallel_tuple_cost TO 0; +SET max_parallel_workers_per_gather TO 2; +-- Ensure we get a parallel plan. +EXPLAIN (COSTS OFF) +SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, +LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 +WHERE t1.unique1 < 1000; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Hash Join + Hash Cond: (t2.unique1 = t1.twenty) + -> Seq Scan on tenk1 t2 + -> Hash + -> Bitmap Heap Scan on tenk1 t1 + Recheck Cond: (unique1 < 1000) + -> Bitmap Index Scan on tenk1_unique1 + Index Cond: (unique1 < 1000) + Optimizer: Postgres query optimizer +(10 rows) + +-- And ensure the parallel plan gives us the correct results. +SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, +LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 +WHERE t1.unique1 < 1000; + count | avg +-------+-------------------- + 1000 | 9.5000000000000000 +(1 row) + +RESET max_parallel_workers_per_gather; +RESET parallel_tuple_cost; +RESET parallel_setup_cost; +RESET min_parallel_table_scan_size; diff --git a/src/test/singlenode_regress/expected/misc_functions.out b/src/test/singlenode_regress/expected/misc_functions.out new file mode 100644 index 00000000000..6d58133f08c --- /dev/null +++ b/src/test/singlenode_regress/expected/misc_functions.out @@ -0,0 +1,278 @@ +-- +-- num_nulls() +-- +-- GPDB: Persuade the planner to produce the same plans as in upstream. +set enable_nestloop=on; +SELECT num_nonnulls(NULL); + num_nonnulls +-------------- + 0 +(1 row) + +SELECT num_nonnulls('1'); + num_nonnulls +-------------- + 1 +(1 row) + +SELECT num_nonnulls(NULL::text); + num_nonnulls +-------------- + 0 +(1 row) + +SELECT num_nonnulls(NULL::text, NULL::int); + num_nonnulls +-------------- + 0 +(1 row) + +SELECT num_nonnulls(1, 2, NULL::text, NULL::point, '', int8 '9', 1.0 / NULL); + num_nonnulls +-------------- + 4 +(1 row) + +SELECT num_nonnulls(VARIADIC '{1,2,NULL,3}'::int[]); + num_nonnulls +-------------- + 3 +(1 row) + +SELECT num_nonnulls(VARIADIC '{"1","2","3","4"}'::text[]); + num_nonnulls +-------------- + 4 +(1 row) + +SELECT num_nonnulls(VARIADIC ARRAY(SELECT CASE WHEN i <> 40 THEN i END FROM generate_series(1, 100) i)); + num_nonnulls +-------------- + 99 +(1 row) + +SELECT num_nulls(NULL); + num_nulls +----------- + 1 +(1 row) + +SELECT num_nulls('1'); + num_nulls +----------- + 0 +(1 row) + +SELECT num_nulls(NULL::text); + num_nulls +----------- + 1 +(1 row) + +SELECT num_nulls(NULL::text, NULL::int); + num_nulls +----------- + 2 +(1 row) + +SELECT num_nulls(1, 2, NULL::text, NULL::point, '', int8 '9', 1.0 / NULL); + num_nulls +----------- + 3 +(1 row) + +SELECT num_nulls(VARIADIC '{1,2,NULL,3}'::int[]); + num_nulls +----------- + 1 +(1 row) + +SELECT num_nulls(VARIADIC '{"1","2","3","4"}'::text[]); + num_nulls +----------- + 0 +(1 row) + +SELECT num_nulls(VARIADIC ARRAY(SELECT CASE WHEN i <> 40 THEN i END FROM generate_series(1, 100) i)); + num_nulls +----------- + 1 +(1 row) + +-- special cases +SELECT num_nonnulls(VARIADIC NULL::text[]); + num_nonnulls +-------------- + +(1 row) + +SELECT num_nonnulls(VARIADIC '{}'::int[]); + num_nonnulls +-------------- + 0 +(1 row) + +SELECT num_nulls(VARIADIC NULL::text[]); + num_nulls +----------- + +(1 row) + +SELECT num_nulls(VARIADIC '{}'::int[]); + num_nulls +----------- + 0 +(1 row) + +-- should fail, one or more arguments is required +SELECT num_nonnulls(); +ERROR: function num_nonnulls() does not exist +LINE 1: SELECT num_nonnulls(); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +SELECT num_nulls(); +ERROR: function num_nulls() does not exist +LINE 1: SELECT num_nulls(); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +-- +-- pg_log_backend_memory_contexts() +-- +-- Memory contexts are logged and they are not returned to the function. +-- Furthermore, their contents can vary depending on the timing. However, +-- we can at least verify that the code doesn't fail. +-- +SELECT * FROM pg_log_backend_memory_contexts(pg_backend_pid()); + pg_log_backend_memory_contexts +-------------------------------- + t +(1 row) + +-- +-- Test some built-in SRFs +-- +-- The outputs of these are variable, so we can't just print their results +-- directly, but we can at least verify that the code doesn't fail. +-- +select setting as segsize +from pg_settings where name = 'wal_segment_size' +\gset +select count(*) > 0 as ok from pg_ls_waldir(); + ok +---- + t +(1 row) + +-- Test ProjectSet as well as FunctionScan +select count(*) > 0 as ok from (select pg_ls_waldir()) ss; + ok +---- + t +(1 row) + +-- Test not-run-to-completion cases. +select * from pg_ls_waldir() limit 0; + name | size | modification +------+------+-------------- +(0 rows) + +select count(*) > 0 as ok from (select * from pg_ls_waldir() limit 1) ss; + ok +---- + t +(1 row) + +select (w).size = :segsize as ok +from (select pg_ls_waldir() w) ss where length((w).name) = 24 limit 1; + ok +---- + t +(1 row) + +select count(*) >= 0 as ok from pg_ls_archive_statusdir(); + ok +---- + t +(1 row) + +select * from (select pg_ls_dir('.') a) a where a = 'base' limit 1; + a +------ + base +(1 row) + +select * from (select (pg_timezone_names()).name) ptn where name='UTC' limit 1; + name +------ + UTC +(1 row) + +select count(*) > 0 from + (select pg_tablespace_databases(oid) as pts from pg_tablespace + where spcname = 'pg_default') pts + join pg_database db on pts.pts = db.oid; + ?column? +---------- + t +(1 row) + +-- +-- Test adding a support function to a subject function +-- +CREATE FUNCTION my_int_eq(int, int) RETURNS bool + LANGUAGE internal STRICT IMMUTABLE PARALLEL SAFE + AS $$int4eq$$; +-- By default, planner does not think that's selective +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN tenk1 b ON a.unique1 = b.unique1 +WHERE my_int_eq(a.unique2, 42); + QUERY PLAN +---------------------------------------------- + Hash Join + Hash Cond: (b.unique1 = a.unique1) + -> Seq Scan on tenk1 b + -> Hash + -> Seq Scan on tenk1 a + Filter: my_int_eq(unique2, 42) +(6 rows) + +-- With support function that knows it's int4eq, we get a different plan +ALTER FUNCTION my_int_eq(int, int) SUPPORT test_support_func; +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN tenk1 b ON a.unique1 = b.unique1 +WHERE my_int_eq(a.unique2, 42); + QUERY PLAN +------------------------------------------------- + Nested Loop + -> Seq Scan on tenk1 a + Filter: my_int_eq(unique2, 42) + -> Index Scan using tenk1_unique1 on tenk1 b + Index Cond: (unique1 = a.unique1) +(5 rows) + +-- Also test non-default rowcount estimate +CREATE FUNCTION my_gen_series(int, int) RETURNS SETOF integer + LANGUAGE internal STRICT IMMUTABLE PARALLEL SAFE + AS $$generate_series_int4$$ + SUPPORT test_support_func; +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN my_gen_series(1,1000) g ON a.unique1 = g; + QUERY PLAN +---------------------------------------- + Hash Join + Hash Cond: (g.g = a.unique1) + -> Function Scan on my_gen_series g + -> Hash + -> Seq Scan on tenk1 a +(5 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN my_gen_series(1,10) g ON a.unique1 = g; + QUERY PLAN +------------------------------------------------- + Nested Loop + -> Function Scan on my_gen_series g + -> Index Scan using tenk1_unique1 on tenk1 a + Index Cond: (unique1 = g.g) +(4 rows) + diff --git a/src/test/singlenode_regress/expected/misc_sanity.out b/src/test/singlenode_regress/expected/misc_sanity.out new file mode 100644 index 00000000000..7e1df68863b --- /dev/null +++ b/src/test/singlenode_regress/expected/misc_sanity.out @@ -0,0 +1,189 @@ +-- +-- MISC_SANITY +-- Sanity checks for common errors in making system tables that don't fit +-- comfortably into either opr_sanity or type_sanity. +-- +-- Every test failure in this file should be closely inspected. +-- The description of the failing test should be read carefully before +-- adjusting the expected output. In most cases, the queries should +-- not find *any* matching entries. +-- +-- NB: run this test early, because some later tests create bogus entries. +-- **************** pg_depend **************** +-- Look for illegal values in pg_depend fields. +-- classid/objid can be zero, but only in 'p' entries +SELECT * +FROM pg_depend as d1 +WHERE refclassid = 0 OR refobjid = 0 OR + deptype NOT IN ('a', 'e', 'i', 'n', 'p') OR + (deptype != 'p' AND (classid = 0 OR objid = 0)) OR + (deptype = 'p' AND (classid != 0 OR objid != 0 OR objsubid != 0)); + classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype +---------+-------+----------+------------+----------+-------------+--------- +(0 rows) + +-- **************** pg_shdepend **************** +-- Look for illegal values in pg_shdepend fields. +-- classid/objid can be zero, but only in 'p' entries +SELECT * +FROM pg_shdepend as d1 +WHERE refclassid = 0 OR refobjid = 0 OR + deptype NOT IN ('a', 'o', 'p', 'r') OR + (deptype != 'p' AND (classid = 0 OR objid = 0)) OR + (deptype = 'p' AND (dbid != 0 OR classid != 0 OR objid != 0 OR objsubid != 0)); + dbid | classid | objid | objsubid | refclassid | refobjid | deptype +------+---------+-------+----------+------------+----------+--------- +(0 rows) + +-- Check each OID-containing system catalog to see if its lowest-numbered OID +-- is pinned. If not, and if that OID was generated during initdb, then +-- perhaps initdb forgot to scan that catalog for pinnable entries. +-- Generally, it's okay for a catalog to be listed in the output of this +-- test if that catalog is scanned by initdb.c's setup_depend() function; +-- whatever OID the test is complaining about must have been added later +-- in initdb, where it intentionally isn't pinned. Legitimate exceptions +-- to that rule are listed in the comments in setup_depend(). +-- Currently, pg_rewrite is also listed by this check, even though it is +-- covered by setup_depend(). That happens because there are no rules in +-- the pinned data, but initdb creates some intentionally-not-pinned views. +do $$ +declare relnm text; + reloid oid; + shared bool; + lowoid oid; + pinned bool; +begin +for relnm, reloid, shared in + select relname, oid, relisshared from pg_class + where EXISTS( + SELECT * FROM pg_attribute + WHERE attrelid = pg_class.oid AND attname = 'oid') + and relkind = 'r' and oid < 16384 order by 1 +loop + execute 'select min(oid) from ' || relnm into lowoid; + continue when lowoid is null or lowoid >= 16384; + if shared then + pinned := exists(select 1 from pg_shdepend + where refclassid = reloid and refobjid = lowoid + and deptype = 'p'); + else + pinned := exists(select 1 from pg_depend + where refclassid = reloid and refobjid = lowoid + and deptype = 'p'); + end if; + if not pinned then + raise notice '% contains unpinned initdb-created object(s)', relnm; + end if; +end loop; +end$$; +NOTICE: pg_database contains unpinned initdb-created object(s) +NOTICE: pg_extension contains unpinned initdb-created object(s) +NOTICE: pg_foreign_data_wrapper contains unpinned initdb-created object(s) +NOTICE: pg_foreign_server contains unpinned initdb-created object(s) +NOTICE: pg_rewrite contains unpinned initdb-created object(s) +NOTICE: pg_tablespace contains unpinned initdb-created object(s) +-- **************** pg_class **************** +-- Look for system tables with varlena columns but no toast table. All +-- system tables with toastable columns should have toast tables, with +-- the following exceptions: +-- 1. pg_class, pg_attribute, and pg_index, due to fear of recursive +-- dependencies as toast tables depend on them. +-- 2. pg_largeobject and pg_largeobject_metadata. Large object catalogs +-- and toast tables are mutually exclusive and large object data is handled +-- as user data by pg_upgrade, which would cause failures. +-- GPDB: A few GPDB catalog tables are also missing toast tables. Not +-- for any particular reason, but the fields are only used to store short +-- system-generated values, so they don't need toasting. +SELECT relname, attname, atttypid::regtype +FROM pg_class c JOIN pg_attribute a ON c.oid = attrelid +WHERE c.oid < 16384 AND + reltoastrelid = 0 AND + relkind = 'r' AND + attstorage != 'p' +ORDER BY 1, 2; + relname | attname | atttypid +--------------------------+--------------------+-------------- + gp_configuration_history | desc | text + gp_version_at_initdb | productversion | text + gp_warehouse | warehouse_name | text + pg_attribute | attacl | aclitem[] + pg_attribute | attfdwoptions | text[] + pg_attribute | attmissingval | anyarray + pg_attribute | attoptions | text[] + pg_class | relacl | aclitem[] + pg_class | reloptions | text[] + pg_class | relpartbound | pg_node_tree + pg_index | indexprs | pg_node_tree + pg_index | indpred | pg_node_tree + pg_largeobject | data | bytea + pg_largeobject_metadata | lomacl | aclitem[] + pg_resgroupcapability | value | text + pg_resourcetype | resdefaultsetting | text + pg_resourcetype | resdisabledsetting | text + pg_resqueuecapability | ressetting | text + pg_stat_last_operation | stasubtype | text + pg_stat_last_shoperation | stasubtype | text + pg_task | command | text + pg_task | database | text + pg_task | jobname | text + pg_task | nodename | text + pg_task | schedule | text + pg_task | username | text + pg_task_run_history | command | text + pg_task_run_history | database | text + pg_task_run_history | return_message | text + pg_task_run_history | status | text + pg_task_run_history | username | text +(31 rows) + +-- system catalogs without primary keys +-- +-- Current exceptions: +-- * pg_depend, pg_shdepend don't have a unique key +SELECT relname +FROM pg_class +WHERE relnamespace = 'pg_catalog'::regnamespace AND relkind = 'r' + AND pg_class.oid NOT IN (SELECT indrelid FROM pg_index WHERE indisprimary) + AND relname NOT like 'gp_segment_configuration' +ORDER BY 1; + relname +-------------------------- + gp_configuration_history + gp_distribution_policy + gp_fastsequence + gp_id + gp_partition_template + gp_version_at_initdb + gp_warehouse + pg_appendonly + pg_attribute_encoding + pg_auth_time_constraint + pg_compression + pg_depend + pg_extprotocol + pg_password_history + pg_proc_callback + pg_profile + pg_resgroup + pg_resgroupcapability + pg_resourcetype + pg_resqueue + pg_resqueuecapability + pg_shdepend + pg_stat_last_operation + pg_stat_last_shoperation + pg_type_encoding +(25 rows) + +-- system catalog unique indexes not wrapped in a constraint +-- (There should be none.) +SELECT relname +FROM pg_class c JOIN pg_index i ON c.oid = i.indexrelid +WHERE relnamespace = 'pg_catalog'::regnamespace AND relkind = 'i' + AND i.indisunique + AND c.oid NOT IN (SELECT conindid FROM pg_constraint) +ORDER BY 1; + relname +--------- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/money.out b/src/test/singlenode_regress/expected/money.out new file mode 100644 index 00000000000..fc71a72fed3 --- /dev/null +++ b/src/test/singlenode_regress/expected/money.out @@ -0,0 +1,505 @@ +-- +-- MONEY +-- +-- Note that we assume lc_monetary has been set to C. +-- +CREATE TABLE money_data (m money); +INSERT INTO money_data VALUES ('123'); +SELECT * FROM money_data; + m +--------- + $123.00 +(1 row) + +SELECT m + '123' FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT m + '123.45' FROM money_data; + ?column? +---------- + $246.45 +(1 row) + +SELECT m - '123.45' FROM money_data; + ?column? +---------- + -$0.45 +(1 row) + +SELECT m / '2'::money FROM money_data; + ?column? +---------- + 61.5 +(1 row) + +SELECT m * 2 FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT 2 * m FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT m / 2 FROM money_data; + ?column? +---------- + $61.50 +(1 row) + +SELECT m * 2::int2 FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT 2::int2 * m FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT m / 2::int2 FROM money_data; + ?column? +---------- + $61.50 +(1 row) + +SELECT m * 2::int8 FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT 2::int8 * m FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT m / 2::int8 FROM money_data; + ?column? +---------- + $61.50 +(1 row) + +SELECT m * 2::float8 FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT 2::float8 * m FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT m / 2::float8 FROM money_data; + ?column? +---------- + $61.50 +(1 row) + +SELECT m * 2::float4 FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT 2::float4 * m FROM money_data; + ?column? +---------- + $246.00 +(1 row) + +SELECT m / 2::float4 FROM money_data; + ?column? +---------- + $61.50 +(1 row) + +-- All true +SELECT m = '$123.00' FROM money_data; + ?column? +---------- + t +(1 row) + +SELECT m != '$124.00' FROM money_data; + ?column? +---------- + t +(1 row) + +SELECT m <= '$123.00' FROM money_data; + ?column? +---------- + t +(1 row) + +SELECT m >= '$123.00' FROM money_data; + ?column? +---------- + t +(1 row) + +SELECT m < '$124.00' FROM money_data; + ?column? +---------- + t +(1 row) + +SELECT m > '$122.00' FROM money_data; + ?column? +---------- + t +(1 row) + +-- All false +SELECT m = '$123.01' FROM money_data; + ?column? +---------- + f +(1 row) + +SELECT m != '$123.00' FROM money_data; + ?column? +---------- + f +(1 row) + +SELECT m <= '$122.99' FROM money_data; + ?column? +---------- + f +(1 row) + +SELECT m >= '$123.01' FROM money_data; + ?column? +---------- + f +(1 row) + +SELECT m > '$124.00' FROM money_data; + ?column? +---------- + f +(1 row) + +SELECT m < '$122.00' FROM money_data; + ?column? +---------- + f +(1 row) + +SELECT cashlarger(m, '$124.00') FROM money_data; + cashlarger +------------ + $124.00 +(1 row) + +SELECT cashsmaller(m, '$124.00') FROM money_data; + cashsmaller +------------- + $123.00 +(1 row) + +SELECT cash_words(m) FROM money_data; + cash_words +------------------------------------------------- + One hundred twenty three dollars and zero cents +(1 row) + +SELECT cash_words(m + '1.23') FROM money_data; + cash_words +-------------------------------------------------------- + One hundred twenty four dollars and twenty three cents +(1 row) + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.45'); +SELECT * FROM money_data; + m +--------- + $123.45 +(1 row) + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.451'); +SELECT * FROM money_data; + m +--------- + $123.45 +(1 row) + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.454'); +SELECT * FROM money_data; + m +--------- + $123.45 +(1 row) + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.455'); +SELECT * FROM money_data; + m +--------- + $123.46 +(1 row) + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.456'); +SELECT * FROM money_data; + m +--------- + $123.46 +(1 row) + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.459'); +SELECT * FROM money_data; + m +--------- + $123.46 +(1 row) + +-- input checks +SELECT '1234567890'::money; + money +------------------- + $1,234,567,890.00 +(1 row) + +SELECT '12345678901234567'::money; + money +---------------------------- + $12,345,678,901,234,567.00 +(1 row) + +SELECT '123456789012345678'::money; +ERROR: value "123456789012345678" is out of range for type money +LINE 1: SELECT '123456789012345678'::money; + ^ +SELECT '9223372036854775807'::money; +ERROR: value "9223372036854775807" is out of range for type money +LINE 1: SELECT '9223372036854775807'::money; + ^ +SELECT '-12345'::money; + money +------------- + -$12,345.00 +(1 row) + +SELECT '-1234567890'::money; + money +-------------------- + -$1,234,567,890.00 +(1 row) + +SELECT '-12345678901234567'::money; + money +----------------------------- + -$12,345,678,901,234,567.00 +(1 row) + +SELECT '-123456789012345678'::money; +ERROR: value "-123456789012345678" is out of range for type money +LINE 1: SELECT '-123456789012345678'::money; + ^ +SELECT '-9223372036854775808'::money; +ERROR: value "-9223372036854775808" is out of range for type money +LINE 1: SELECT '-9223372036854775808'::money; + ^ +-- special characters +SELECT '(1)'::money; + money +-------- + -$1.00 +(1 row) + +SELECT '($123,456.78)'::money; + money +-------------- + -$123,456.78 +(1 row) + +-- documented minimums and maximums +SELECT '-92233720368547758.08'::money; + money +----------------------------- + -$92,233,720,368,547,758.08 +(1 row) + +SELECT '92233720368547758.07'::money; + money +---------------------------- + $92,233,720,368,547,758.07 +(1 row) + +SELECT '-92233720368547758.09'::money; +ERROR: value "-92233720368547758.09" is out of range for type money +LINE 1: SELECT '-92233720368547758.09'::money; + ^ +SELECT '92233720368547758.08'::money; +ERROR: value "92233720368547758.08" is out of range for type money +LINE 1: SELECT '92233720368547758.08'::money; + ^ +-- rounding +SELECT '-92233720368547758.085'::money; +ERROR: value "-92233720368547758.085" is out of range for type money +LINE 1: SELECT '-92233720368547758.085'::money; + ^ +SELECT '92233720368547758.075'::money; +ERROR: value "92233720368547758.075" is out of range for type money +LINE 1: SELECT '92233720368547758.075'::money; + ^ +-- rounding vs. truncation in division +SELECT '878.08'::money / 11::float8; + ?column? +---------- + $79.83 +(1 row) + +SELECT '878.08'::money / 11::float4; + ?column? +---------- + $79.83 +(1 row) + +SELECT '878.08'::money / 11::bigint; + ?column? +---------- + $79.82 +(1 row) + +SELECT '878.08'::money / 11::int; + ?column? +---------- + $79.82 +(1 row) + +SELECT '878.08'::money / 11::smallint; + ?column? +---------- + $79.82 +(1 row) + +-- check for precision loss in division +SELECT '90000000000000099.00'::money / 10::bigint; + ?column? +--------------------------- + $9,000,000,000,000,009.90 +(1 row) + +SELECT '90000000000000099.00'::money / 10::int; + ?column? +--------------------------- + $9,000,000,000,000,009.90 +(1 row) + +SELECT '90000000000000099.00'::money / 10::smallint; + ?column? +--------------------------- + $9,000,000,000,000,009.90 +(1 row) + +-- Cast int4/int8/numeric to money +SELECT 1234567890::money; + money +------------------- + $1,234,567,890.00 +(1 row) + +SELECT 12345678901234567::money; + money +---------------------------- + $12,345,678,901,234,567.00 +(1 row) + +SELECT (-12345)::money; + money +------------- + -$12,345.00 +(1 row) + +SELECT (-1234567890)::money; + money +-------------------- + -$1,234,567,890.00 +(1 row) + +SELECT (-12345678901234567)::money; + money +----------------------------- + -$12,345,678,901,234,567.00 +(1 row) + +SELECT 1234567890::int4::money; + money +------------------- + $1,234,567,890.00 +(1 row) + +SELECT 12345678901234567::int8::money; + money +---------------------------- + $12,345,678,901,234,567.00 +(1 row) + +SELECT 12345678901234567::numeric::money; + money +---------------------------- + $12,345,678,901,234,567.00 +(1 row) + +SELECT (-1234567890)::int4::money; + money +-------------------- + -$1,234,567,890.00 +(1 row) + +SELECT (-12345678901234567)::int8::money; + money +----------------------------- + -$12,345,678,901,234,567.00 +(1 row) + +SELECT (-12345678901234567)::numeric::money; + money +----------------------------- + -$12,345,678,901,234,567.00 +(1 row) + +-- Cast from money to numeric +SELECT '12345678901234567'::money::numeric; + numeric +---------------------- + 12345678901234567.00 +(1 row) + +SELECT '-12345678901234567'::money::numeric; + numeric +----------------------- + -12345678901234567.00 +(1 row) + +SELECT '92233720368547758.07'::money::numeric; + numeric +---------------------- + 92233720368547758.07 +(1 row) + +SELECT '-92233720368547758.08'::money::numeric; + numeric +----------------------- + -92233720368547758.08 +(1 row) + diff --git a/src/test/singlenode_regress/expected/multirangetypes.out b/src/test/singlenode_regress/expected/multirangetypes.out new file mode 100644 index 00000000000..bde3f248a75 --- /dev/null +++ b/src/test/singlenode_regress/expected/multirangetypes.out @@ -0,0 +1,3232 @@ +-- Tests for multirange data types. +-- +-- test input parser +-- +-- negative tests; should fail +select ''::textmultirange; +ERROR: malformed multirange literal: "" +LINE 1: select ''::textmultirange; + ^ +DETAIL: Missing left brace. +select '{,}'::textmultirange; +ERROR: malformed multirange literal: "{,}" +LINE 1: select '{,}'::textmultirange; + ^ +DETAIL: Expected range start. +select '{(,)}.'::textmultirange; +ERROR: malformed multirange literal: "{(,)}." +LINE 1: select '{(,)}.'::textmultirange; + ^ +DETAIL: Junk after closing right brace. +select '{[a,c),}'::textmultirange; +ERROR: malformed multirange literal: "{[a,c),}" +LINE 1: select '{[a,c),}'::textmultirange; + ^ +DETAIL: Expected range start. +select '{,[a,c)}'::textmultirange; +ERROR: malformed multirange literal: "{,[a,c)}" +LINE 1: select '{,[a,c)}'::textmultirange; + ^ +DETAIL: Expected range start. +select '{-[a,z)}'::textmultirange; +ERROR: malformed multirange literal: "{-[a,z)}" +LINE 1: select '{-[a,z)}'::textmultirange; + ^ +DETAIL: Expected range start. +select '{[a,z) - }'::textmultirange; +ERROR: malformed multirange literal: "{[a,z) - }" +LINE 1: select '{[a,z) - }'::textmultirange; + ^ +DETAIL: Expected comma or end of multirange. +select '{(",a)}'::textmultirange; +ERROR: malformed multirange literal: "{(",a)}" +LINE 1: select '{(",a)}'::textmultirange; + ^ +DETAIL: Unexpected end of input. +select '{(,,a)}'::textmultirange; +ERROR: malformed range literal: "(,,a)" +LINE 1: select '{(,,a)}'::textmultirange; + ^ +DETAIL: Too many commas. +select '{(),a)}'::textmultirange; +ERROR: malformed range literal: "()" +LINE 1: select '{(),a)}'::textmultirange; + ^ +DETAIL: Missing comma after lower bound. +select '{(a,))}'::textmultirange; +ERROR: malformed multirange literal: "{(a,))}" +LINE 1: select '{(a,))}'::textmultirange; + ^ +DETAIL: Expected comma or end of multirange. +select '{(],a)}'::textmultirange; +ERROR: malformed range literal: "(]" +LINE 1: select '{(],a)}'::textmultirange; + ^ +DETAIL: Missing comma after lower bound. +select '{(a,])}'::textmultirange; +ERROR: malformed multirange literal: "{(a,])}" +LINE 1: select '{(a,])}'::textmultirange; + ^ +DETAIL: Expected comma or end of multirange. +select '{[z,a]}'::textmultirange; +ERROR: range lower bound must be less than or equal to range upper bound +LINE 1: select '{[z,a]}'::textmultirange; + ^ +-- should succeed +select '{}'::textmultirange; + textmultirange +---------------- + {} +(1 row) + +select ' {} '::textmultirange; + textmultirange +---------------- + {} +(1 row) + +select ' { empty, empty } '::textmultirange; + textmultirange +---------------- + {} +(1 row) + +select ' {( " a " " a ", " z " " z " ) }'::textmultirange; + textmultirange +---------------------------- + {(" a a "," z z ")} +(1 row) + +select textrange('\\\\', repeat('a', 200))::textmultirange; + textrange +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)} +(1 row) + +select '{(,z)}'::textmultirange; + textmultirange +---------------- + {(,z)} +(1 row) + +select '{(a,)}'::textmultirange; + textmultirange +---------------- + {(a,)} +(1 row) + +select '{[,z]}'::textmultirange; + textmultirange +---------------- + {(,z]} +(1 row) + +select '{[a,]}'::textmultirange; + textmultirange +---------------- + {[a,)} +(1 row) + +select '{(,)}'::textmultirange; + textmultirange +---------------- + {(,)} +(1 row) + +select '{[ , ]}'::textmultirange; + textmultirange +---------------- + {[" "," "]} +(1 row) + +select '{["",""]}'::textmultirange; + textmultirange +---------------- + {["",""]} +(1 row) + +select '{[",",","]}'::textmultirange; + textmultirange +---------------- + {[",",","]} +(1 row) + +select '{["\\","\\"]}'::textmultirange; + textmultirange +---------------- + {["\\","\\"]} +(1 row) + +select '{["""","\""]}'::textmultirange; + textmultirange +---------------- + {["""",""""]} +(1 row) + +select '{(\\,a)}'::textmultirange; + textmultirange +---------------- + {("\\",a)} +(1 row) + +select '{((,z)}'::textmultirange; + textmultirange +---------------- + {("(",z)} +(1 row) + +select '{([,z)}'::textmultirange; + textmultirange +---------------- + {("[",z)} +(1 row) + +select '{(!,()}'::textmultirange; + textmultirange +---------------- + {(!,"(")} +(1 row) + +select '{(!,[)}'::textmultirange; + textmultirange +---------------- + {(!,"[")} +(1 row) + +select '{[a,a]}'::textmultirange; + textmultirange +---------------- + {[a,a]} +(1 row) + +select '{[a,a],[a,b]}'::textmultirange; + textmultirange +---------------- + {[a,b]} +(1 row) + +select '{[a,b), [b,e]}'::textmultirange; + textmultirange +---------------- + {[a,e]} +(1 row) + +select '{[a,d), [b,f]}'::textmultirange; + textmultirange +---------------- + {[a,f]} +(1 row) + +select '{[a,a],[b,b]}'::textmultirange; + textmultirange +---------------- + {[a,a],[b,b]} +(1 row) + +-- without canonicalization, we can't join these: +select '{[a,a], [b,b]}'::textmultirange; + textmultirange +---------------- + {[a,a],[b,b]} +(1 row) + +-- with canonicalization, we can join these: +select '{[1,2], [3,4]}'::int4multirange; + int4multirange +---------------- + {[1,5)} +(1 row) + +select '{[a,a], [b,b], [c,c]}'::textmultirange; + textmultirange +--------------------- + {[a,a],[b,b],[c,c]} +(1 row) + +select '{[a,d], [b,e]}'::textmultirange; + textmultirange +---------------- + {[a,e]} +(1 row) + +select '{[a,d), [d,e)}'::textmultirange; + textmultirange +---------------- + {[a,e)} +(1 row) + +-- these are allowed but normalize to empty: +select '{[a,a)}'::textmultirange; + textmultirange +---------------- + {} +(1 row) + +select '{(a,a]}'::textmultirange; + textmultirange +---------------- + {} +(1 row) + +select '{(a,a)}'::textmultirange; + textmultirange +---------------- + {} +(1 row) + +-- +-- test the constructor +--- +select textmultirange(); + textmultirange +---------------- + {} +(1 row) + +select textmultirange(textrange('a', 'c')); + textmultirange +---------------- + {[a,c)} +(1 row) + +select textmultirange(textrange('a', 'c'), textrange('f', 'g')); + textmultirange +---------------- + {[a,c),[f,g)} +(1 row) + +select textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd')); + textmultirange +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),[c,d)} +(1 row) + +-- +-- test casts, both a built-in range type and a user-defined one: +-- +select 'empty'::int4range::int4multirange; + int4multirange +---------------- + {} +(1 row) + +select int4range(1, 3)::int4multirange; + int4range +----------- + {[1,3)} +(1 row) + +select int4range(1, null)::int4multirange; + int4range +----------- + {[1,)} +(1 row) + +select int4range(null, null)::int4multirange; + int4range +----------- + {(,)} +(1 row) + +select 'empty'::textrange::textmultirange; + textmultirange +---------------- + {} +(1 row) + +select textrange('a', 'c')::textmultirange; + textrange +----------- + {[a,c)} +(1 row) + +select textrange('a', null)::textmultirange; + textrange +----------- + {[a,)} +(1 row) + +select textrange(null, null)::textmultirange; + textrange +----------- + {(,)} +(1 row) + +-- +-- test unnest(multirange) function +-- +select unnest(int4multirange(int4range('5', '6'), int4range('1', '2'))); + unnest +-------- + [1,2) + [5,6) +(2 rows) + +select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e'))); + unnest +-------- + [a,b) + [d,e) +(2 rows) + +select unnest(textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd'))); + unnest +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) + [c,d) +(2 rows) + +-- +-- create some test data and test the operators +-- +CREATE TABLE nummultirange_test (nmr NUMMULTIRANGE); +CREATE INDEX nummultirange_test_btree ON nummultirange_test(nmr); +INSERT INTO nummultirange_test VALUES('{}'); +INSERT INTO nummultirange_test VALUES('{[,)}'); +INSERT INTO nummultirange_test VALUES('{[3,]}'); +INSERT INTO nummultirange_test VALUES('{[,), [3,]}'); +INSERT INTO nummultirange_test VALUES('{[, 5)}'); +INSERT INTO nummultirange_test VALUES(nummultirange()); +INSERT INTO nummultirange_test VALUES(nummultirange(variadic '{}'::numrange[])); +INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.1, 2.2))); +INSERT INTO nummultirange_test VALUES('{empty}'); +INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.7, 1.7, '[]'), numrange(1.7, 1.9))); +INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.7, 1.7, '[]'), numrange(1.9, 2.1))); +SELECT nmr, isempty(nmr), lower(nmr), upper(nmr) FROM nummultirange_test ORDER BY nmr; + nmr | isempty | lower | upper +-----------------------+---------+-------+------- + {} | t | | + {} | t | | + {} | t | | + {} | t | | + {(,5)} | f | | 5 + {(,)} | f | | + {(,)} | f | | + {[1.1,2.2)} | f | 1.1 | 2.2 + {[1.7,1.7],[1.9,2.1)} | f | 1.7 | 2.1 + {[1.7,1.9)} | f | 1.7 | 1.9 + {[3,)} | f | 3 | +(11 rows) + +SELECT nmr, lower_inc(nmr), lower_inf(nmr), upper_inc(nmr), upper_inf(nmr) FROM nummultirange_test ORDER BY nmr; + nmr | lower_inc | lower_inf | upper_inc | upper_inf +-----------------------+-----------+-----------+-----------+----------- + {} | f | f | f | f + {} | f | f | f | f + {} | f | f | f | f + {} | f | f | f | f + {(,5)} | f | t | f | f + {(,)} | f | t | f | t + {(,)} | f | t | f | t + {[1.1,2.2)} | t | f | f | f + {[1.7,1.7],[1.9,2.1)} | t | f | f | f + {[1.7,1.9)} | t | f | f | f + {[3,)} | t | f | f | t +(11 rows) + +SELECT * FROM nummultirange_test WHERE nmr = '{}'; + nmr +----- + {} + {} + {} + {} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr = '{(,5)}'; + nmr +-------- + {(,5)} +(1 row) + +SELECT * FROM nummultirange_test WHERE nmr = '{[3,)}'; + nmr +-------- + {[3,)} +(1 row) + +SELECT * FROM nummultirange_test WHERE nmr = '{[1.7,1.7]}'; + nmr +----- +(0 rows) + +SELECT * FROM nummultirange_test WHERE nmr = '{[1.7,1.7],[1.9,2.1)}'; + nmr +----------------------- + {[1.7,1.7],[1.9,2.1)} +(1 row) + +SELECT * FROM nummultirange_test WHERE nmr < '{}'; + nmr +----- +(0 rows) + +SELECT * FROM nummultirange_test WHERE nmr < '{[-1000.0, -1000.0]}'; + nmr +-------- + {} + {(,)} + {(,)} + {(,5)} + {} + {} + {} +(7 rows) + +SELECT * FROM nummultirange_test WHERE nmr < '{[0.0, 1.0]}'; + nmr +-------- + {} + {(,)} + {(,)} + {(,5)} + {} + {} + {} +(7 rows) + +SELECT * FROM nummultirange_test WHERE nmr < '{[1000.0, 1001.0]}'; + nmr +----------------------- + {} + {(,)} + {[3,)} + {(,)} + {(,5)} + {} + {} + {[1.1,2.2)} + {} + {[1.7,1.9)} + {[1.7,1.7],[1.9,2.1)} +(11 rows) + +SELECT * FROM nummultirange_test WHERE nmr <= '{}'; + nmr +----- + {} + {} + {} + {} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr <= '{[3,)}'; + nmr +----------------------- + {} + {(,)} + {[3,)} + {(,)} + {(,5)} + {} + {} + {[1.1,2.2)} + {} + {[1.7,1.9)} + {[1.7,1.7],[1.9,2.1)} +(11 rows) + +SELECT * FROM nummultirange_test WHERE nmr >= '{}'; + nmr +----------------------- + {} + {(,)} + {[3,)} + {(,)} + {(,5)} + {} + {} + {[1.1,2.2)} + {} + {[1.7,1.9)} + {[1.7,1.7],[1.9,2.1)} +(11 rows) + +SELECT * FROM nummultirange_test WHERE nmr >= '{[3,)}'; + nmr +-------- + {[3,)} +(1 row) + +SELECT * FROM nummultirange_test WHERE nmr > '{}'; + nmr +----------------------- + {(,)} + {[3,)} + {(,)} + {(,5)} + {[1.1,2.2)} + {[1.7,1.9)} + {[1.7,1.7],[1.9,2.1)} +(7 rows) + +SELECT * FROM nummultirange_test WHERE nmr > '{[-1000.0, -1000.0]}'; + nmr +----------------------- + {[3,)} + {[1.1,2.2)} + {[1.7,1.9)} + {[1.7,1.7],[1.9,2.1)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr > '{[0.0, 1.0]}'; + nmr +----------------------- + {[3,)} + {[1.1,2.2)} + {[1.7,1.9)} + {[1.7,1.7],[1.9,2.1)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr > '{[1000.0, 1001.0]}'; + nmr +----- +(0 rows) + +SELECT * FROM nummultirange_test WHERE nmr <> '{}'; + nmr +----------------------- + {(,)} + {[3,)} + {(,)} + {(,5)} + {[1.1,2.2)} + {[1.7,1.9)} + {[1.7,1.7],[1.9,2.1)} +(7 rows) + +SELECT * FROM nummultirange_test WHERE nmr <> '{(,5)}'; + nmr +----------------------- + {} + {(,)} + {[3,)} + {(,)} + {} + {} + {[1.1,2.2)} + {} + {[1.7,1.9)} + {[1.7,1.7],[1.9,2.1)} +(10 rows) + +select nummultirange(numrange(2.0, 1.0)); +ERROR: range lower bound must be less than or equal to range upper bound +select nummultirange(numrange(5.0, 6.0), numrange(1.0, 2.0)); + nummultirange +----------------------- + {[1.0,2.0),[5.0,6.0)} +(1 row) + +analyze nummultirange_test; +-- overlaps +SELECT * FROM nummultirange_test WHERE range_overlaps_multirange(numrange(4.0, 4.2), nmr); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE numrange(4.0, 4.2) && nmr; + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE multirange_overlaps_range(nmr, numrange(4.0, 4.2)); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr && numrange(4.0, 4.2); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE multirange_overlaps_multirange(nmr, nummultirange(numrange(4.0, 4.2), numrange(6.0, 7.0))); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(4.0, 4.2), numrange(6.0, 7.0)); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(6.0, 7.0)); + nmr +-------- + {(,)} + {[3,)} + {(,)} +(3 rows) + +SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(6.0, 7.0), numrange(8.0, 9.0)); + nmr +-------- + {(,)} + {[3,)} + {(,)} +(3 rows) + +-- mr contains x +SELECT * FROM nummultirange_test WHERE multirange_contains_elem(nmr, 4.0); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr @> 4.0; + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE multirange_contains_range(nmr, numrange(4.0, 4.2)); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE nmr @> numrange(4.0, 4.2); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE multirange_contains_multirange(nmr, '{[4.0,4.2), [6.0, 8.0)}'); + nmr +-------- + {(,)} + {[3,)} + {(,)} +(3 rows) + +SELECT * FROM nummultirange_test WHERE nmr @> '{[4.0,4.2), [6.0, 8.0)}'::nummultirange; + nmr +-------- + {(,)} + {[3,)} + {(,)} +(3 rows) + +-- x is contained by mr +SELECT * FROM nummultirange_test WHERE elem_contained_by_multirange(4.0, nmr); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE 4.0 <@ nmr; + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE range_contained_by_multirange(numrange(4.0, 4.2), nmr); + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE numrange(4.0, 4.2) <@ nmr; + nmr +-------- + {(,)} + {[3,)} + {(,)} + {(,5)} +(4 rows) + +SELECT * FROM nummultirange_test WHERE multirange_contained_by_multirange('{[4.0,4.2), [6.0, 8.0)}', nmr); + nmr +-------- + {(,)} + {[3,)} + {(,)} +(3 rows) + +SELECT * FROM nummultirange_test WHERE '{[4.0,4.2), [6.0, 8.0)}'::nummultirange <@ nmr; + nmr +-------- + {(,)} + {[3,)} + {(,)} +(3 rows) + +-- overlaps +SELECT 'empty'::numrange && nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT 'empty'::numrange && nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange() && 'empty'::numrange; + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) && 'empty'::numrange; + ?column? +---------- + f +(1 row) + +SELECT nummultirange() && nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT nummultirange() && nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) && nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(7,8)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(7,8)) && nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(3.5,8)); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && numrange(3,4); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && nummultirange(numrange(3,4)); + ?column? +---------- + t +(1 row) + +select '{(10,20),(30,40),(50,60)}'::nummultirange && '(42,92)'::numrange; + ?column? +---------- + t +(1 row) + +-- contains +SELECT nummultirange() @> nummultirange(); + ?column? +---------- + t +(1 row) + +SELECT nummultirange() @> 'empty'::numrange; + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(null,null)) @> numrange(1,2); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(null,null)) @> numrange(null,2); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(null,null)) @> numrange(2,null); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(null,5)) @> numrange(null,3); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(null,5)) @> numrange(null,8); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(5,null)) @> numrange(8,null); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(5,null)) @> numrange(3,null); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,5)) @> numrange(8,9); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,5)) @> numrange(3,9); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,5)) @> numrange(1,4); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,5)) @> numrange(1,5); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(-4,-2), numrange(1,5)) @> numrange(1,5); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,5), numrange(8,9)) @> numrange(1,5); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,5), numrange(8,9)) @> numrange(6,7); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,5), numrange(6,9)) @> numrange(6,7); + ?column? +---------- + t +(1 row) + +SELECT '{[1,5)}'::nummultirange @> '{[1,5)}'; + ?column? +---------- + t +(1 row) + +SELECT '{[-4,-2), [1,5)}'::nummultirange @> '{[1,5)}'; + ?column? +---------- + t +(1 row) + +SELECT '{[1,5), [8,9)}'::nummultirange @> '{[1,5)}'; + ?column? +---------- + t +(1 row) + +SELECT '{[1,5), [8,9)}'::nummultirange @> '{[6,7)}'; + ?column? +---------- + f +(1 row) + +SELECT '{[1,5), [6,9)}'::nummultirange @> '{[6,7)}'; + ?column? +---------- + t +(1 row) + +select '{(10,20),(30,40),(50,60)}'::nummultirange @> '(52,56)'::numrange; + ?column? +---------- + t +(1 row) + +SELECT numrange(null,null) @> nummultirange(numrange(1,2)); + ?column? +---------- + t +(1 row) + +SELECT numrange(null,null) @> nummultirange(numrange(null,2)); + ?column? +---------- + t +(1 row) + +SELECT numrange(null,null) @> nummultirange(numrange(2,null)); + ?column? +---------- + t +(1 row) + +SELECT numrange(null,5) @> nummultirange(numrange(null,3)); + ?column? +---------- + t +(1 row) + +SELECT numrange(null,5) @> nummultirange(numrange(null,8)); + ?column? +---------- + f +(1 row) + +SELECT numrange(5,null) @> nummultirange(numrange(8,null)); + ?column? +---------- + t +(1 row) + +SELECT numrange(5,null) @> nummultirange(numrange(3,null)); + ?column? +---------- + f +(1 row) + +SELECT numrange(1,5) @> nummultirange(numrange(8,9)); + ?column? +---------- + f +(1 row) + +SELECT numrange(1,5) @> nummultirange(numrange(3,9)); + ?column? +---------- + f +(1 row) + +SELECT numrange(1,5) @> nummultirange(numrange(1,4)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,5) @> nummultirange(numrange(1,5)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,9) @> nummultirange(numrange(-4,-2), numrange(1,5)); + ?column? +---------- + f +(1 row) + +SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(8,9)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(6,9)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(6,10)); + ?column? +---------- + f +(1 row) + +SELECT '{[1,9)}' @> '{[1,5)}'::nummultirange; + ?column? +---------- + t +(1 row) + +SELECT '{[1,9)}' @> '{[-4,-2), [1,5)}'::nummultirange; + ?column? +---------- + f +(1 row) + +SELECT '{[1,9)}' @> '{[1,5), [8,9)}'::nummultirange; + ?column? +---------- + t +(1 row) + +SELECT '{[1,9)}' @> '{[1,5), [6,9)}'::nummultirange; + ?column? +---------- + t +(1 row) + +SELECT '{[1,9)}' @> '{[1,5), [6,10)}'::nummultirange; + ?column? +---------- + f +(1 row) + +-- is contained by +SELECT nummultirange() <@ nummultirange(); + ?column? +---------- + t +(1 row) + +SELECT 'empty'::numrange <@ nummultirange(); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,2) <@ nummultirange(numrange(null,null)); + ?column? +---------- + t +(1 row) + +SELECT numrange(null,2) <@ nummultirange(numrange(null,null)); + ?column? +---------- + t +(1 row) + +SELECT numrange(2,null) <@ nummultirange(numrange(null,null)); + ?column? +---------- + t +(1 row) + +SELECT numrange(null,3) <@ nummultirange(numrange(null,5)); + ?column? +---------- + t +(1 row) + +SELECT numrange(null,8) <@ nummultirange(numrange(null,5)); + ?column? +---------- + f +(1 row) + +SELECT numrange(8,null) <@ nummultirange(numrange(5,null)); + ?column? +---------- + t +(1 row) + +SELECT numrange(3,null) <@ nummultirange(numrange(5,null)); + ?column? +---------- + f +(1 row) + +SELECT numrange(8,9) <@ nummultirange(numrange(1,5)); + ?column? +---------- + f +(1 row) + +SELECT numrange(3,9) <@ nummultirange(numrange(1,5)); + ?column? +---------- + f +(1 row) + +SELECT numrange(1,4) <@ nummultirange(numrange(1,5)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,5) <@ nummultirange(numrange(1,5)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,5) <@ nummultirange(numrange(-4,-2), numrange(1,5)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,5) <@ nummultirange(numrange(1,5), numrange(8,9)); + ?column? +---------- + t +(1 row) + +SELECT numrange(6,7) <@ nummultirange(numrange(1,5), numrange(8,9)); + ?column? +---------- + f +(1 row) + +SELECT numrange(6,7) <@ nummultirange(numrange(1,5), numrange(6,9)); + ?column? +---------- + t +(1 row) + +SELECT '{[1,5)}' <@ '{[1,5)}'::nummultirange; + ?column? +---------- + t +(1 row) + +SELECT '{[1,5)}' <@ '{[-4,-2), [1,5)}'::nummultirange; + ?column? +---------- + t +(1 row) + +SELECT '{[1,5)}' <@ '{[1,5), [8,9)}'::nummultirange; + ?column? +---------- + t +(1 row) + +SELECT '{[6,7)}' <@ '{[1,5), [8,9)}'::nummultirange; + ?column? +---------- + f +(1 row) + +SELECT '{[6,7)}' <@ '{[1,5), [6,9)}'::nummultirange; + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,2)) <@ numrange(null,null); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(null,2)) <@ numrange(null,null); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(2,null)) <@ numrange(null,null); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(null,3)) <@ numrange(null,5); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(null,8)) <@ numrange(null,5); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(8,null)) <@ numrange(5,null); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(3,null)) <@ numrange(5,null); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(8,9)) <@ numrange(1,5); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3,9)) <@ numrange(1,5); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,4)) <@ numrange(1,5); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,5)) <@ numrange(1,5); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(-4,-2), numrange(1,5)) <@ numrange(1,9); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,5), numrange(8,9)) <@ numrange(1,9); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,5), numrange(6,9)) <@ numrange(1,9); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,5), numrange(6,10)) <@ numrange(1,9); + ?column? +---------- + f +(1 row) + +SELECT '{[1,5)}'::nummultirange <@ '{[1,9)}'; + ?column? +---------- + t +(1 row) + +SELECT '{[-4,-2), [1,5)}'::nummultirange <@ '{[1,9)}'; + ?column? +---------- + f +(1 row) + +SELECT '{[1,5), [8,9)}'::nummultirange <@ '{[1,9)}'; + ?column? +---------- + t +(1 row) + +SELECT '{[1,5), [6,9)}'::nummultirange <@ '{[1,9)}'; + ?column? +---------- + t +(1 row) + +SELECT '{[1,5), [6,10)}'::nummultirange <@ '{[1,9)}'; + ?column? +---------- + f +(1 row) + +-- overleft +SELECT 'empty'::numrange &< nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT 'empty'::numrange &< nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange() &< 'empty'::numrange; + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) &< 'empty'::numrange; + ?column? +---------- + f +(1 row) + +SELECT nummultirange() &< nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) &< nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT nummultirange() &< nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +SELECT numrange(6,7) &< nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT numrange(1,2) &< nummultirange(numrange(3,4)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,4) &< nummultirange(numrange(3,4)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,6) &< nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT numrange(3.5,6) &< nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(6,7)) &< numrange(3,4); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) &< numrange(3,4); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,4)) &< numrange(3,4); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,6)) &< numrange(3,4); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3.5,6)) &< numrange(3,4); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(6,7)) &< nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) &< nummultirange(numrange(3,4)); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,4)) &< nummultirange(numrange(3,4)); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,6)) &< nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3.5,6)) &< nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +-- overright +SELECT nummultirange() &> 'empty'::numrange; + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) &> 'empty'::numrange; + ?column? +---------- + f +(1 row) + +SELECT 'empty'::numrange &> nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT 'empty'::numrange &> nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange() &> nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT nummultirange() &> nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) &> nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3,4)) &> numrange(6,7); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3,4)) &> numrange(1,2); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(3,4)) &> numrange(1,4); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(3,4)) &> numrange(1,6); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(3,4)) &> numrange(3.5,6); + ?column? +---------- + f +(1 row) + +SELECT numrange(3,4) &> nummultirange(numrange(6,7)); + ?column? +---------- + f +(1 row) + +SELECT numrange(3,4) &> nummultirange(numrange(1,2)); + ?column? +---------- + t +(1 row) + +SELECT numrange(3,4) &> nummultirange(numrange(1,4)); + ?column? +---------- + t +(1 row) + +SELECT numrange(3,4) &> nummultirange(numrange(1,6)); + ?column? +---------- + t +(1 row) + +SELECT numrange(3,4) &> nummultirange(numrange(3.5,6)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(6,7)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,2)); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,4)); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,6)); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(3.5,6)); + ?column? +---------- + f +(1 row) + +-- meets +SELECT 'empty'::numrange -|- nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT 'empty'::numrange -|- nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange() -|- 'empty'::numrange; + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) -|- 'empty'::numrange; + ?column? +---------- + f +(1 row) + +SELECT nummultirange() -|- nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) -|- nummultirange(); + ?column? +---------- + f +(1 row) + +SELECT nummultirange() -|- nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +SELECT numrange(1,2) -|- nummultirange(numrange(2,4)); + ?column? +---------- + t +(1 row) + +SELECT numrange(1,2) -|- nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) -|- numrange(2,4); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,2)) -|- numrange(3,4); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(2,4)); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(6,7)); + ?column? +---------- + t +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(8,9)); + ?column? +---------- + f +(1 row) + +SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(2,4), numrange(6,7)); + ?column? +---------- + t +(1 row) + +-- strictly left +select 'empty'::numrange << nummultirange(); + ?column? +---------- + f +(1 row) + +select numrange(1,2) << nummultirange(); + ?column? +---------- + f +(1 row) + +select numrange(1,2) << nummultirange(numrange(3,4)); + ?column? +---------- + t +(1 row) + +select numrange(1,2) << nummultirange(numrange(0,4)); + ?column? +---------- + f +(1 row) + +select numrange(1,2) << nummultirange(numrange(0,4), numrange(7,8)); + ?column? +---------- + f +(1 row) + +select nummultirange() << 'empty'::numrange; + ?column? +---------- + f +(1 row) + +select nummultirange() << numrange(1,2); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(3,4)) << numrange(3,6); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(0,2)) << numrange(3,6); + ?column? +---------- + t +(1 row) + +select nummultirange(numrange(0,2), numrange(7,8)) << numrange(3,6); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(-4,-2), numrange(0,2)) << numrange(3,6); + ?column? +---------- + t +(1 row) + +select nummultirange() << nummultirange(); + ?column? +---------- + f +(1 row) + +select nummultirange() << nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(1,2)) << nummultirange(); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(1,2)) << nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(1,2)) << nummultirange(numrange(3,4)); + ?column? +---------- + t +(1 row) + +select nummultirange(numrange(1,2)) << nummultirange(numrange(3,4), numrange(7,8)); + ?column? +---------- + t +(1 row) + +select nummultirange(numrange(1,2), numrange(4,5)) << nummultirange(numrange(3,4), numrange(7,8)); + ?column? +---------- + f +(1 row) + +-- strictly right +select nummultirange() >> 'empty'::numrange; + ?column? +---------- + f +(1 row) + +select nummultirange() >> numrange(1,2); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(3,4)) >> numrange(1,2); + ?column? +---------- + t +(1 row) + +select nummultirange(numrange(0,4)) >> numrange(1,2); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(0,4), numrange(7,8)) >> numrange(1,2); + ?column? +---------- + f +(1 row) + +select 'empty'::numrange >> nummultirange(); + ?column? +---------- + f +(1 row) + +select numrange(1,2) >> nummultirange(); + ?column? +---------- + f +(1 row) + +select numrange(3,6) >> nummultirange(numrange(3,4)); + ?column? +---------- + f +(1 row) + +select numrange(3,6) >> nummultirange(numrange(0,2)); + ?column? +---------- + t +(1 row) + +select numrange(3,6) >> nummultirange(numrange(0,2), numrange(7,8)); + ?column? +---------- + f +(1 row) + +select numrange(3,6) >> nummultirange(numrange(-4,-2), numrange(0,2)); + ?column? +---------- + t +(1 row) + +select nummultirange() >> nummultirange(); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(1,2)) >> nummultirange(); + ?column? +---------- + f +(1 row) + +select nummultirange() >> nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(1,2)) >> nummultirange(numrange(1,2)); + ?column? +---------- + f +(1 row) + +select nummultirange(numrange(3,4)) >> nummultirange(numrange(1,2)); + ?column? +---------- + t +(1 row) + +select nummultirange(numrange(3,4), numrange(7,8)) >> nummultirange(numrange(1,2)); + ?column? +---------- + t +(1 row) + +select nummultirange(numrange(3,4), numrange(7,8)) >> nummultirange(numrange(1,2), numrange(4,5)); + ?column? +---------- + f +(1 row) + +-- union +SELECT nummultirange() + nummultirange(); + ?column? +---------- + {} +(1 row) + +SELECT nummultirange() + nummultirange(numrange(1,2)); + ?column? +---------- + {[1,2)} +(1 row) + +SELECT nummultirange(numrange(1,2)) + nummultirange(); + ?column? +---------- + {[1,2)} +(1 row) + +SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(1,2)); + ?column? +---------- + {[1,2)} +(1 row) + +SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(2,4)); + ?column? +---------- + {[1,4)} +(1 row) + +SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(3,4)); + ?column? +--------------- + {[1,2),[3,4)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(2,4)); + ?column? +---------- + {[1,5)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(3,4)); + ?column? +--------------- + {[1,2),[3,5)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(0,9)); + ?column? +---------- + {[0,9)} +(1 row) + +-- merge +SELECT range_merge(nummultirange()); + range_merge +------------- + empty +(1 row) + +SELECT range_merge(nummultirange(numrange(1,2))); + range_merge +------------- + [1,2) +(1 row) + +SELECT range_merge(nummultirange(numrange(1,2), numrange(7,8))); + range_merge +------------- + [1,8) +(1 row) + +-- minus +SELECT nummultirange() - nummultirange(); + ?column? +---------- + {} +(1 row) + +SELECT nummultirange() - nummultirange(numrange(1,2)); + ?column? +---------- + {} +(1 row) + +SELECT nummultirange(numrange(1,2)) - nummultirange(); + ?column? +---------- + {[1,2)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(3,4)) - nummultirange(); + ?column? +--------------- + {[1,2),[3,4)} +(1 row) + +SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(1,2)); + ?column? +---------- + {} +(1 row) + +SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(2,4)); + ?column? +---------- + {[1,2)} +(1 row) + +SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(3,4)); + ?column? +---------- + {[1,2)} +(1 row) + +SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(1,2)); + ?column? +---------- + {[2,4)} +(1 row) + +SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(2,3)); + ?column? +--------------- + {[1,2),[3,4)} +(1 row) + +SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(0,8)); + ?column? +---------- + {} +(1 row) + +SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(0,2)); + ?column? +---------- + {[2,4)} +(1 row) + +SELECT nummultirange(numrange(1,8)) - nummultirange(numrange(0,2), numrange(3,4)); + ?column? +--------------- + {[2,3),[4,8)} +(1 row) + +SELECT nummultirange(numrange(1,8)) - nummultirange(numrange(2,3), numrange(5,null)); + ?column? +--------------- + {[1,2),[3,5)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(-2,0)); + ?column? +--------------- + {[1,2),[4,5)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(2,4)); + ?column? +--------------- + {[1,2),[4,5)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(3,5)); + ?column? +---------- + {[1,2)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(0,9)); + ?column? +---------- + {} +(1 row) + +SELECT nummultirange(numrange(1,3), numrange(4,5)) - nummultirange(numrange(2,9)); + ?column? +---------- + {[1,2)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(8,9)); + ?column? +--------------- + {[1,2),[4,5)} +(1 row) + +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(-2,0), numrange(8,9)); + ?column? +--------------- + {[1,2),[4,5)} +(1 row) + +-- intersection +SELECT nummultirange() * nummultirange(); + ?column? +---------- + {} +(1 row) + +SELECT nummultirange() * nummultirange(numrange(1,2)); + ?column? +---------- + {} +(1 row) + +SELECT nummultirange(numrange(1,2)) * nummultirange(); + ?column? +---------- + {} +(1 row) + +SELECT '{[1,3)}'::nummultirange * '{[1,5)}'::nummultirange; + ?column? +---------- + {[1,3)} +(1 row) + +SELECT '{[1,3)}'::nummultirange * '{[0,5)}'::nummultirange; + ?column? +---------- + {[1,3)} +(1 row) + +SELECT '{[1,3)}'::nummultirange * '{[0,2)}'::nummultirange; + ?column? +---------- + {[1,2)} +(1 row) + +SELECT '{[1,3)}'::nummultirange * '{[2,5)}'::nummultirange; + ?column? +---------- + {[2,3)} +(1 row) + +SELECT '{[1,4)}'::nummultirange * '{[2,3)}'::nummultirange; + ?column? +---------- + {[2,3)} +(1 row) + +SELECT '{[1,4)}'::nummultirange * '{[0,2), [3,5)}'::nummultirange; + ?column? +--------------- + {[1,2),[3,4)} +(1 row) + +SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,8), [9,12)}'::nummultirange; + ?column? +---------------------- + {[1,4),[7,8),[9,10)} +(1 row) + +SELECT '{[1,4), [7,10)}'::nummultirange * '{[9,12)}'::nummultirange; + ?column? +---------- + {[9,10)} +(1 row) + +SELECT '{[1,4), [7,10)}'::nummultirange * '{[-5,-4), [5,6), [9,12)}'::nummultirange; + ?column? +---------- + {[9,10)} +(1 row) + +SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,2), [3,8), [9,12)}'::nummultirange; + ?column? +---------------------------- + {[1,2),[3,4),[7,8),[9,10)} +(1 row) + +SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,2), [3,8), [9,12)}'::nummultirange; + ?column? +---------------------------- + {[1,2),[3,4),[7,8),[9,10)} +(1 row) + +-- test GiST index +create table test_multirange_gist(mr int4multirange); +insert into test_multirange_gist select int4multirange(int4range(g, g+10),int4range(g+20, g+30),int4range(g+40, g+50)) from generate_series(1,2000) g; +insert into test_multirange_gist select '{}'::int4multirange from generate_series(1,500) g; +insert into test_multirange_gist select int4multirange(int4range(g, g+10000)) from generate_series(1,1000) g; +insert into test_multirange_gist select int4multirange(int4range(NULL, g*10, '(]'), int4range(g*10, g*20, '(]')) from generate_series(1,100) g; +insert into test_multirange_gist select int4multirange(int4range(g*10, g*20, '(]'), int4range(g*20, NULL, '(]')) from generate_series(1,100) g; +create index test_mulrirange_gist_idx on test_multirange_gist using gist (mr); +-- test statistics and selectivity estimation as well +-- +-- We don't check the accuracy of selectivity estimation, but at least check +-- it doesn't fall. +analyze test_multirange_gist; +-- first, verify non-indexed results +SET enable_seqscan = t; +SET enable_indexscan = f; +SET enable_bitmapscan = f; +select count(*) from test_multirange_gist where mr = '{}'::int4multirange; + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr @> 'empty'::int4range; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr && 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr <@ 'empty'::int4range; + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr << 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr >> 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr &< 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr &> 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr -|- 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr && '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange; + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr << '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr >> '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr &< '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr &> '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60)); + count +------- + 1 +(1 row) + +select count(*) from test_multirange_gist where mr @> 10; + count +------- + 120 +(1 row) + +select count(*) from test_multirange_gist where mr @> int4range(10,20); + count +------- + 111 +(1 row) + +select count(*) from test_multirange_gist where mr && int4range(10,20); + count +------- + 139 +(1 row) + +select count(*) from test_multirange_gist where mr <@ int4range(10,50); + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr << int4range(100,500); + count +------- + 54 +(1 row) + +select count(*) from test_multirange_gist where mr >> int4range(100,500); + count +------- + 2053 +(1 row) + +select count(*) from test_multirange_gist where mr &< int4range(100,500); + count +------- + 474 +(1 row) + +select count(*) from test_multirange_gist where mr &> int4range(100,500); + count +------- + 2893 +(1 row) + +select count(*) from test_multirange_gist where mr -|- int4range(100,500); + count +------- + 3 +(1 row) + +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr @> int4multirange(int4range(10,20), int4range(30,40)); + count +------- + 110 +(1 row) + +select count(*) from test_multirange_gist where mr && '{(10,20),(30,40),(50,60)}'::int4multirange; + count +------- + 218 +(1 row) + +select count(*) from test_multirange_gist where mr <@ '{(10,30),(40,60),(70,90)}'::int4multirange; + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr << int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 54 +(1 row) + +select count(*) from test_multirange_gist where mr >> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 2053 +(1 row) + +select count(*) from test_multirange_gist where mr &< int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 474 +(1 row) + +select count(*) from test_multirange_gist where mr &> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 2893 +(1 row) + +select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 3 +(1 row) + +-- now check same queries using index +SET enable_seqscan = f; +SET enable_indexscan = t; +SET enable_bitmapscan = f; +select count(*) from test_multirange_gist where mr = '{}'::int4multirange; + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr @> 'empty'::int4range; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr && 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr <@ 'empty'::int4range; + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr << 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr >> 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr &< 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr &> 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr -|- 'empty'::int4range; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr && '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange; + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr << '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr >> '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr &< '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr &> '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange; + count +------- + 0 +(1 row) + +select count(*) from test_multirange_gist where mr @> 'empty'::int4range; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60)); + count +------- + 1 +(1 row) + +select count(*) from test_multirange_gist where mr @> 10; + count +------- + 120 +(1 row) + +select count(*) from test_multirange_gist where mr @> int4range(10,20); + count +------- + 111 +(1 row) + +select count(*) from test_multirange_gist where mr && int4range(10,20); + count +------- + 139 +(1 row) + +select count(*) from test_multirange_gist where mr <@ int4range(10,50); + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr << int4range(100,500); + count +------- + 54 +(1 row) + +select count(*) from test_multirange_gist where mr >> int4range(100,500); + count +------- + 2053 +(1 row) + +select count(*) from test_multirange_gist where mr &< int4range(100,500); + count +------- + 474 +(1 row) + +select count(*) from test_multirange_gist where mr &> int4range(100,500); + count +------- + 2893 +(1 row) + +select count(*) from test_multirange_gist where mr -|- int4range(100,500); + count +------- + 3 +(1 row) + +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; + count +------- + 3700 +(1 row) + +select count(*) from test_multirange_gist where mr @> int4multirange(int4range(10,20), int4range(30,40)); + count +------- + 110 +(1 row) + +select count(*) from test_multirange_gist where mr && '{(10,20),(30,40),(50,60)}'::int4multirange; + count +------- + 218 +(1 row) + +select count(*) from test_multirange_gist where mr <@ '{(10,30),(40,60),(70,90)}'::int4multirange; + count +------- + 500 +(1 row) + +select count(*) from test_multirange_gist where mr << int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 54 +(1 row) + +select count(*) from test_multirange_gist where mr >> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 2053 +(1 row) + +select count(*) from test_multirange_gist where mr &< int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 474 +(1 row) + +select count(*) from test_multirange_gist where mr &> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 2893 +(1 row) + +select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 3 +(1 row) + +drop table test_multirange_gist; +-- +-- range_agg function +-- +create table reservations ( room_id integer not null, booked_during daterange ); +insert into reservations values +-- 1: has a meets and a gap +(1, daterange('2018-07-01', '2018-07-07')), +(1, daterange('2018-07-07', '2018-07-14')), +(1, daterange('2018-07-20', '2018-07-22')), +-- 2: just a single row +(2, daterange('2018-07-01', '2018-07-03')), +-- 3: one null range +(3, NULL), +-- 4: two null ranges +(4, NULL), +(4, NULL), +-- 5: a null range and a non-null range +(5, NULL), +(5, daterange('2018-07-01', '2018-07-03')), +-- 6: has overlap +(6, daterange('2018-07-01', '2018-07-07')), +(6, daterange('2018-07-05', '2018-07-10')), +-- 7: two ranges that meet: no gap or overlap +(7, daterange('2018-07-01', '2018-07-07')), +(7, daterange('2018-07-07', '2018-07-14')), +-- 8: an empty range +(8, 'empty'::daterange) +; +SELECT room_id, range_agg(booked_during) +FROM reservations +GROUP BY room_id +ORDER BY room_id; + room_id | range_agg +---------+--------------------------------------------------- + 1 | {[07-01-2018,07-14-2018),[07-20-2018,07-22-2018)} + 2 | {[07-01-2018,07-03-2018)} + 3 | + 4 | + 5 | {[07-01-2018,07-03-2018)} + 6 | {[07-01-2018,07-10-2018)} + 7 | {[07-01-2018,07-14-2018)} + 8 | {} +(8 rows) + +-- range_agg on a custom range type too +SELECT range_agg(r) +FROM (VALUES + ('[a,c]'::textrange), + ('[b,b]'::textrange), + ('[c,f]'::textrange), + ('[g,h)'::textrange), + ('[h,j)'::textrange) + ) t(r); + range_agg +--------------- + {[a,f],[g,j)} +(1 row) + +select range_intersect_agg(nmr) from nummultirange_test; + range_intersect_agg +--------------------- + {} +(1 row) + +select range_intersect_agg(nmr) from nummultirange_test where false; + range_intersect_agg +--------------------- + +(1 row) + +-- test with just one input: +select range_intersect_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr); + range_intersect_agg +--------------------- + {[1,2]} +(1 row) + +select range_intersect_agg(nmr) from nummultirange_test where nmr @> 4.0; + range_intersect_agg +--------------------- + {[3,5)} +(1 row) + +create table nummultirange_test2(nmr nummultirange); +create index nummultirange_test2_hash_idx on nummultirange_test2 using hash (nmr); +INSERT INTO nummultirange_test2 VALUES('{[, 5)}'); +INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2))); +INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2))); +INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2,'()'))); +INSERT INTO nummultirange_test2 VALUES('{}'); +select * from nummultirange_test2 where nmr = '{}'; + nmr +----- + {} +(1 row) + +select * from nummultirange_test2 where nmr = nummultirange(numrange(1.1, 2.2)); + nmr +------------- + {[1.1,2.2)} + {[1.1,2.2)} +(2 rows) + +select * from nummultirange_test2 where nmr = nummultirange(numrange(1.1, 2.3)); + nmr +----- +(0 rows) + +set enable_nestloop=t; +set enable_hashjoin=f; +set enable_mergejoin=f; +select * from nummultirange_test natural join nummultirange_test2 order by nmr; + nmr +------------- + {} + {} + {} + {} + {(,5)} + {[1.1,2.2)} + {[1.1,2.2)} +(7 rows) + +set enable_nestloop=f; +set enable_hashjoin=t; +set enable_mergejoin=f; +select * from nummultirange_test natural join nummultirange_test2 order by nmr; + nmr +------------- + {} + {} + {} + {} + {(,5)} + {[1.1,2.2)} + {[1.1,2.2)} +(7 rows) + +set enable_nestloop=f; +set enable_hashjoin=f; +set enable_mergejoin=t; +select * from nummultirange_test natural join nummultirange_test2 order by nmr; + nmr +------------- + {} + {} + {} + {} + {(,5)} + {[1.1,2.2)} + {[1.1,2.2)} +(7 rows) + +set enable_nestloop to default; +set enable_hashjoin to default; +set enable_mergejoin to default; +DROP TABLE nummultirange_test2; +-- +-- Test user-defined multirange of floats +-- +select '{[123.001, 5.e9)}'::float8multirange @> 888.882::float8; + ?column? +---------- + t +(1 row) + +create table float8multirange_test(f8mr float8multirange, i int); +insert into float8multirange_test values(float8multirange(float8range(-100.00007, '1.111113e9')), 42); +select * from float8multirange_test; + f8mr | i +---------------------------+---- + {[-100.00007,1111113000)} | 42 +(1 row) + +drop table float8multirange_test; +-- +-- Test multirange types over domains +-- +create domain mydomain as int4; +create type mydomainrange as range(subtype=mydomain); +select '{[4,50)}'::mydomainmultirange @> 7::mydomain; + ?column? +---------- + t +(1 row) + +drop domain mydomain cascade; +NOTICE: drop cascades to type mydomainrange +-- +-- Test domains over multirange types +-- +create domain restrictedmultirange as int4multirange check (upper(value) < 10); +select '{[4,5)}'::restrictedmultirange @> 7; + ?column? +---------- + f +(1 row) + +select '{[4,50)}'::restrictedmultirange @> 7; -- should fail +ERROR: value for domain restrictedmultirange violates check constraint "restrictedmultirange_check" +drop domain restrictedmultirange; +--- +-- Check automatic naming of multiranges +--- +create type intr as range(subtype=int); +select intr_multirange(intr(1,10)); + intr_multirange +----------------- + {[1,10)} +(1 row) + +drop type intr; +create type intmultirange as (x int, y int); +create type intrange as range(subtype=int); -- should fail +ERROR: type "intmultirange" already exists +DETAIL: Failed while creating a multirange type for type "intrange". +HINT: You can manually specify a multirange type name using the "multirange_type_name" attribute. +drop type intmultirange; +create type intr_multirange as (x int, y int); +create type intr as range(subtype=int); -- should fail +ERROR: type "intr_multirange" already exists +DETAIL: Failed while creating a multirange type for type "intr". +HINT: You can manually specify a multirange type name using the "multirange_type_name" attribute. +drop type intr_multirange; +-- +-- Test multiple multirange types over the same subtype and manual naming of +-- the multirange type. +-- +-- should fail +create type textrange1 as range(subtype=text, multirange_type_name=int, collation="C"); +ERROR: type "int4" already exists +-- should pass +create type textrange1 as range(subtype=text, multirange_type_name=multirange_of_text, collation="C"); +-- should pass, because existing _textrange1 is automatically renamed +create type textrange2 as range(subtype=text, multirange_type_name=_textrange1, collation="C"); +select multirange_of_text(textrange2('a','Z')); -- should fail +ERROR: function multirange_of_text(textrange2) does not exist +LINE 1: select multirange_of_text(textrange2('a','Z')); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select multirange_of_text(textrange1('a','Z')) @> 'b'::text; +ERROR: range lower bound must be less than or equal to range upper bound +select unnest(multirange_of_text(textrange1('a','b'), textrange1('d','e'))); + unnest +-------- + [a,b) + [d,e) +(2 rows) + +select _textrange1(textrange2('a','z')) @> 'b'::text; + ?column? +---------- + t +(1 row) + +drop type textrange1; +drop type textrange2; +-- +-- Test polymorphic type system +-- +create function anyarray_anymultirange_func(a anyarray, r anymultirange) + returns anyelement as 'select $1[1] + lower($2);' language sql; +select anyarray_anymultirange_func(ARRAY[1,2], int4multirange(int4range(10,20))); + anyarray_anymultirange_func +----------------------------- + 11 +(1 row) + +-- should fail +select anyarray_anymultirange_func(ARRAY[1,2], nummultirange(numrange(10,20))); +ERROR: function anyarray_anymultirange_func(integer[], nummultirange) does not exist +LINE 1: select anyarray_anymultirange_func(ARRAY[1,2], nummultirange... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anyarray_anymultirange_func(anyarray, anymultirange); +-- should fail +create function bogus_func(anyelement) + returns anymultirange as 'select int4multirange(int4range(1,10))' language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anymultirange requires at least one input of type anyrange or anymultirange. +-- should fail +create function bogus_func(int) + returns anymultirange as 'select int4multirange(int4range(1,10))' language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anymultirange requires at least one input of type anyrange or anymultirange. +create function range_add_bounds(anymultirange) + returns anyelement as 'select lower($1) + upper($1)' language sql; +select range_add_bounds(int4multirange(int4range(1, 17))); + range_add_bounds +------------------ + 18 +(1 row) + +select range_add_bounds(nummultirange(numrange(1.0001, 123.123))); + range_add_bounds +------------------ + 124.1231 +(1 row) + +create function multirangetypes_sql(q anymultirange, b anyarray, out c anyelement) + as $$ select upper($1) + $2[1] $$ + language sql; +select multirangetypes_sql(int4multirange(int4range(1,10)), ARRAY[2,20]); + multirangetypes_sql +--------------------- + 12 +(1 row) + +select multirangetypes_sql(nummultirange(numrange(1,10)), ARRAY[2,20]); -- match failure +ERROR: function multirangetypes_sql(nummultirange, integer[]) does not exist +LINE 1: select multirangetypes_sql(nummultirange(numrange(1,10)), AR... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +create function anycompatiblearray_anycompatiblemultirange_func(a anycompatiblearray, mr anycompatiblemultirange) + returns anycompatible as 'select $1[1] + lower($2);' language sql; +select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1,2], multirange(int4range(10,20))); + anycompatiblearray_anycompatiblemultirange_func +------------------------------------------------- + 11 +(1 row) + +select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1,2], multirange(numrange(10,20))); + anycompatiblearray_anycompatiblemultirange_func +------------------------------------------------- + 11 +(1 row) + +-- should fail +select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1.1,2], multirange(int4range(10,20))); +ERROR: function anycompatiblearray_anycompatiblemultirange_func(numeric[], int4multirange) does not exist +LINE 1: select anycompatiblearray_anycompatiblemultirange_func(ARRAY... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anycompatiblearray_anycompatiblemultirange_func(anycompatiblearray, anycompatiblemultirange); +create function anycompatiblerange_anycompatiblemultirange_func(r anycompatiblerange, mr anycompatiblemultirange) + returns anycompatible as 'select lower($1) + lower($2);' language sql; +select anycompatiblerange_anycompatiblemultirange_func(int4range(1,2), multirange(int4range(10,20))); + anycompatiblerange_anycompatiblemultirange_func +------------------------------------------------- + 11 +(1 row) + +-- should fail +select anycompatiblerange_anycompatiblemultirange_func(numrange(1,2), multirange(int4range(10,20))); +ERROR: function anycompatiblerange_anycompatiblemultirange_func(numrange, int4multirange) does not exist +LINE 1: select anycompatiblerange_anycompatiblemultirange_func(numra... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anycompatiblerange_anycompatiblemultirange_func(anycompatiblerange, anycompatiblemultirange); +-- should fail +create function bogus_func(anycompatible) + returns anycompatiblerange as 'select int4range(1,10)' language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anycompatiblerange requires at least one input of type anycompatiblerange or anycompatiblemultirange. +-- +-- Arrays of multiranges +-- +select ARRAY[nummultirange(numrange(1.1, 1.2)), nummultirange(numrange(12.3, 155.5))]; + array +---------------------------------- + {"{[1.1,1.2)}","{[12.3,155.5)}"} +(1 row) + +create table i8mr_array (f1 int, f2 int8multirange[]); +insert into i8mr_array values (42, array[int8multirange(int8range(1,10)), int8multirange(int8range(2,20))]); +select * from i8mr_array; + f1 | f2 +----+------------------------- + 42 | {"{[1,10)}","{[2,20)}"} +(1 row) + +drop table i8mr_array; +-- +-- Multiranges of arrays +-- +select arraymultirange(arrayrange(ARRAY[1,2], ARRAY[2,1])); + arraymultirange +--------------------- + {["{1,2}","{2,1}")} +(1 row) + +select arraymultirange(arrayrange(ARRAY[2,1], ARRAY[1,2])); -- fail +ERROR: range lower bound must be less than or equal to range upper bound +select array[1,1] <@ arraymultirange(arrayrange(array[1,2], array[2,1])); + ?column? +---------- + f +(1 row) + +select array[1,3] <@ arraymultirange(arrayrange(array[1,2], array[2,1])); + ?column? +---------- + t +(1 row) + +-- +-- Ranges of composites +-- +create type two_ints as (a int, b int); +create type two_ints_range as range (subtype = two_ints); +-- with force_parallel_mode on, this exercises tqueue.c's range remapping +select *, row_to_json(upper(t)) as u from + (values (two_ints_multirange(two_ints_range(row(1,2), row(3,4)))), + (two_ints_multirange(two_ints_range(row(5,6), row(7,8))))) v(t); + t | u +---------------------+--------------- + {["(1,2)","(3,4)")} | {"a":3,"b":4} + {["(5,6)","(7,8)")} | {"a":7,"b":8} +(2 rows) + +drop type two_ints cascade; +NOTICE: drop cascades to type two_ints_range +-- +-- Check behavior when subtype lacks a hash function +-- +set enable_sort = off; -- try to make it pick a hash setop implementation +select '{(2,5)}'::cashmultirange except select '{(5,6)}'::cashmultirange; + cashmultirange +----------------- + {($2.00,$5.00)} +(1 row) + +reset enable_sort; +-- +-- OUT/INOUT/TABLE functions +-- +-- infer anymultirange from anymultirange +create function mr_outparam_succeed(i anymultirange, out r anymultirange, out t text) + as $$ select $1, 'foo'::text $$ language sql; +select * from mr_outparam_succeed(int4multirange(int4range(1,2))); + r | t +---------+----- + {[1,2)} | foo +(1 row) + +-- infer anyarray from anymultirange +create function mr_outparam_succeed2(i anymultirange, out r anyarray, out t text) + as $$ select ARRAY[upper($1)], 'foo'::text $$ language sql; +select * from mr_outparam_succeed2(int4multirange(int4range(1,2))); + r | t +-----+----- + {2} | foo +(1 row) + +-- infer anyrange from anymultirange +create function mr_outparam_succeed3(i anymultirange, out r anyrange, out t text) + as $$ select range_merge($1), 'foo'::text $$ language sql; +select * from mr_outparam_succeed3(int4multirange(int4range(1,2))); + r | t +-------+----- + [1,2) | foo +(1 row) + +-- infer anymultirange from anyrange +create function mr_outparam_succeed4(i anyrange, out r anymultirange, out t text) + as $$ select multirange($1), 'foo'::text $$ language sql; +select * from mr_outparam_succeed4(int4range(1,2)); + r | t +---------+----- + {[1,2)} | foo +(1 row) + +-- infer anyelement from anymultirange +create function mr_inoutparam_succeed(out i anyelement, inout r anymultirange) + as $$ select upper($1), $1 $$ language sql; +select * from mr_inoutparam_succeed(int4multirange(int4range(1,2))); + i | r +---+--------- + 2 | {[1,2)} +(1 row) + +-- infer anyelement+anymultirange from anyelement+anymultirange +create function mr_table_succeed(i anyelement, r anymultirange) returns table(i anyelement, r anymultirange) + as $$ select $1, $2 $$ language sql; +select * from mr_table_succeed(123, int4multirange(int4range(1,11))); + i | r +-----+---------- + 123 | {[1,11)} +(1 row) + +-- use anymultirange in plpgsql +create function mr_polymorphic(i anyrange) returns anymultirange + as $$ begin return multirange($1); end; $$ language plpgsql; +select mr_polymorphic(int4range(1, 4)); + mr_polymorphic +---------------- + {[1,4)} +(1 row) + +-- should fail +create function mr_outparam_fail(i anyelement, out r anymultirange, out t text) + as $$ select '[1,10]', 'foo' $$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anymultirange requires at least one input of type anyrange or anymultirange. +--should fail +create function mr_inoutparam_fail(inout i anyelement, out r anymultirange) + as $$ select $1, '[1,10]' $$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anymultirange requires at least one input of type anyrange or anymultirange. +--should fail +create function mr_table_fail(i anyelement) returns table(i anyelement, r anymultirange) + as $$ select $1, '[1,10]' $$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anymultirange requires at least one input of type anyrange or anymultirange. diff --git a/src/test/singlenode_regress/expected/mvcc.out b/src/test/singlenode_regress/expected/mvcc.out new file mode 100644 index 00000000000..16ed4ddf2d8 --- /dev/null +++ b/src/test/singlenode_regress/expected/mvcc.out @@ -0,0 +1,42 @@ +-- +-- Verify that index scans encountering dead rows produced by an +-- aborted subtransaction of the current transaction can utilize the +-- kill_prio_tuple optimization +-- +-- NB: The table size is currently *not* expected to stay the same, we +-- don't have logic to trigger opportunistic pruning in cases like +-- this. +BEGIN; +SET LOCAL enable_seqscan = false; +SET LOCAL enable_indexonlyscan = false; +SET LOCAL enable_bitmapscan = false; +-- Can't easily use a unique index, since dead tuples can be found +-- independent of the kill_prior_tuples optimization. +CREATE TABLE clean_aborted_self(key int, data text); +CREATE INDEX clean_aborted_self_key ON clean_aborted_self(key); +INSERT INTO clean_aborted_self (key, data) VALUES (-1, 'just to allocate metapage'); +-- save index size from before the changes, for comparison +SELECT pg_relation_size('clean_aborted_self_key') AS clean_aborted_self_key_before \gset +DO $$ +BEGIN + -- iterate often enough to see index growth even on larger-than-default page sizes + FOR i IN 1..100 LOOP + BEGIN + -- perform index scan over all the inserted keys to get them to be seen as dead + IF EXISTS(SELECT * FROM clean_aborted_self WHERE key > 0 AND key < 100) THEN + RAISE data_corrupted USING MESSAGE = 'these rows should not exist'; + END IF; + INSERT INTO clean_aborted_self SELECT g.i, 'rolling back in a sec' FROM generate_series(1, 100) g(i); + -- just some error that's not normally thrown + RAISE reading_sql_data_not_permitted USING MESSAGE = 'round and round again'; + EXCEPTION WHEN reading_sql_data_not_permitted THEN END; + END LOOP; +END;$$; +-- show sizes only if they differ +SELECT :clean_aborted_self_key_before AS size_before, pg_relation_size('clean_aborted_self_key') size_after +WHERE :clean_aborted_self_key_before != pg_relation_size('clean_aborted_self_key'); + size_before | size_after +-------------+------------ +(0 rows) + +ROLLBACK; diff --git a/src/test/singlenode_regress/expected/name.out b/src/test/singlenode_regress/expected/name.out new file mode 100644 index 00000000000..d58df2ba415 --- /dev/null +++ b/src/test/singlenode_regress/expected/name.out @@ -0,0 +1,197 @@ +-- +-- NAME +-- all inputs are silently truncated at NAMEDATALEN-1 (63) characters +-- +-- fixed-length by reference +SELECT name 'name string' = name 'name string' AS "True"; + True +------ + t +(1 row) + +SELECT name 'name string' = name 'name string ' AS "False"; + False +------- + f +(1 row) + +-- +-- +-- +CREATE TABLE NAME_TBL(f1 name); +INSERT INTO NAME_TBL(f1) VALUES ('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'); +INSERT INTO NAME_TBL(f1) VALUES ('1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqr'); +INSERT INTO NAME_TBL(f1) VALUES ('asdfghjkl;'); +INSERT INTO NAME_TBL(f1) VALUES ('343f%2a'); +INSERT INTO NAME_TBL(f1) VALUES ('d34aaasdf'); +INSERT INTO NAME_TBL(f1) VALUES (''); +INSERT INTO NAME_TBL(f1) VALUES ('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'); +SELECT * FROM NAME_TBL; + f1 +----------------------------------------------------------------- + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ + 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopq + asdfghjkl; + 343f%2a + d34aaasdf + + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ +(7 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 <> '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + f1 +----------------------------------------------------------------- + 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopq + asdfghjkl; + 343f%2a + d34aaasdf + +(5 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + f1 +----------------------------------------------------------------- + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ +(2 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 < '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + f1 +---- + +(1 row) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 <= '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + f1 +----------------------------------------------------------------- + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ + + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ +(3 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 > '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + f1 +----------------------------------------------------------------- + 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopq + asdfghjkl; + 343f%2a + d34aaasdf +(4 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 >= '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + f1 +----------------------------------------------------------------- + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ + 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopq + asdfghjkl; + 343f%2a + d34aaasdf + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ +(6 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 ~ '.*'; + f1 +----------------------------------------------------------------- + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ + 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopq + asdfghjkl; + 343f%2a + d34aaasdf + + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ +(7 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 !~ '.*'; + f1 +---- +(0 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 ~ '[0-9]'; + f1 +----------------------------------------------------------------- + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ + 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopq + 343f%2a + d34aaasdf + 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQ +(5 rows) + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 ~ '.*asdf.*'; + f1 +------------ + asdfghjkl; + d34aaasdf +(2 rows) + +DROP TABLE NAME_TBL; +DO $$ +DECLARE r text[]; +BEGIN + r := parse_ident('Schemax.Tabley'); + RAISE NOTICE '%', format('%I.%I', r[1], r[2]); + r := parse_ident('"SchemaX"."TableY"'); + RAISE NOTICE '%', format('%I.%I', r[1], r[2]); +END; +$$; +NOTICE: schemax.tabley +NOTICE: "SchemaX"."TableY" +SELECT parse_ident('foo.boo'); + parse_ident +------------- + {foo,boo} +(1 row) + +SELECT parse_ident('foo.boo[]'); -- should fail +ERROR: string is not a valid identifier: "foo.boo[]" +SELECT parse_ident('foo.boo[]', strict => false); -- ok + parse_ident +------------- + {foo,boo} +(1 row) + +-- should fail +SELECT parse_ident(' '); +ERROR: string is not a valid identifier: " " +SELECT parse_ident(' .aaa'); +ERROR: string is not a valid identifier: " .aaa" +DETAIL: No valid identifier before ".". +SELECT parse_ident(' aaa . '); +ERROR: string is not a valid identifier: " aaa . " +DETAIL: No valid identifier after ".". +SELECT parse_ident('aaa.a%b'); +ERROR: string is not a valid identifier: "aaa.a%b" +SELECT parse_ident(E'X\rXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); +ERROR: string is not a valid identifier: "X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +SELECT length(a[1]), length(a[2]) from parse_ident('"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy') as a ; + length | length +--------+-------- + 414 | 289 +(1 row) + +SELECT parse_ident(' first . " second " ." third ". " ' || repeat('x',66) || '"'); + parse_ident +----------------------------------------------------------------------------------------------------------- + {first," second "," third "," xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"} +(1 row) + +SELECT parse_ident(' first . " second " ." third ". " ' || repeat('x',66) || '"')::name[]; + parse_ident +------------------------------------------------------------------------------------------------------ + {first," second "," third "," xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"} +(1 row) + +SELECT parse_ident(E'"c".X XXXX\002XXXXXX'); +ERROR: string is not a valid identifier: ""c".X XXXXXXXXXX" +SELECT parse_ident('1020'); +ERROR: string is not a valid identifier: "1020" +SELECT parse_ident('10.20'); +ERROR: string is not a valid identifier: "10.20" +SELECT parse_ident('.'); +ERROR: string is not a valid identifier: "." +DETAIL: No valid identifier before ".". +SELECT parse_ident('.1020'); +ERROR: string is not a valid identifier: ".1020" +DETAIL: No valid identifier before ".". +SELECT parse_ident('xxx.1020'); +ERROR: string is not a valid identifier: "xxx.1020" +DETAIL: No valid identifier after ".". diff --git a/src/test/singlenode_regress/expected/namespace.out b/src/test/singlenode_regress/expected/namespace.out new file mode 100644 index 00000000000..0c874cf1047 --- /dev/null +++ b/src/test/singlenode_regress/expected/namespace.out @@ -0,0 +1,71 @@ +-- +-- Regression tests for schemas (namespaces) +-- +CREATE SCHEMA test_ns_schema_1 + CREATE INDEX abc_a_idx ON abc (a) + CREATE VIEW abc_view AS + SELECT a+1 AS a, b+1 AS b FROM abc + CREATE TABLE abc ( + a serial, + b int UNIQUE + ); +-- verify that the objects were created +SELECT COUNT(*) FROM pg_class WHERE relnamespace = + (SELECT oid FROM pg_namespace WHERE nspname = 'test_ns_schema_1'); + count +------- + 5 +(1 row) + +INSERT INTO test_ns_schema_1.abc DEFAULT VALUES; +INSERT INTO test_ns_schema_1.abc DEFAULT VALUES; +INSERT INTO test_ns_schema_1.abc DEFAULT VALUES; +SELECT * FROM test_ns_schema_1.abc; + a | b +---+--- + 1 | + 2 | + 3 | +(3 rows) + +SELECT * FROM test_ns_schema_1.abc_view; + a | b +---+--- + 2 | + 3 | + 4 | +(3 rows) + +ALTER SCHEMA test_ns_schema_1 RENAME TO test_ns_schema_renamed; +SELECT COUNT(*) FROM pg_class WHERE relnamespace = + (SELECT oid FROM pg_namespace WHERE nspname = 'test_ns_schema_1'); + count +------- + 0 +(1 row) + +-- test IF NOT EXISTS cases +CREATE SCHEMA test_ns_schema_renamed; -- fail, already exists +ERROR: schema "test_ns_schema_renamed" already exists +CREATE SCHEMA IF NOT EXISTS test_ns_schema_renamed; -- ok with notice +NOTICE: schema "test_ns_schema_renamed" already exists, skipping +CREATE SCHEMA IF NOT EXISTS test_ns_schema_renamed -- fail, disallowed + CREATE TABLE abc ( + a serial, + b int UNIQUE + ); +ERROR: CREATE SCHEMA IF NOT EXISTS cannot include schema elements +LINE 2: CREATE TABLE abc ( + ^ +DROP SCHEMA test_ns_schema_renamed CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table test_ns_schema_renamed.abc +drop cascades to view test_ns_schema_renamed.abc_view +-- verify that the objects were dropped +SELECT COUNT(*) FROM pg_class WHERE relnamespace = + (SELECT oid FROM pg_namespace WHERE nspname = 'test_ns_schema_renamed'); + count +------- + 0 +(1 row) + diff --git a/src/test/singlenode_regress/expected/numeric.out b/src/test/singlenode_regress/expected/numeric.out new file mode 100644 index 00000000000..bea33181bee --- /dev/null +++ b/src/test/singlenode_regress/expected/numeric.out @@ -0,0 +1,3226 @@ +-- +-- NUMERIC +-- +CREATE TABLE num_data (id int4, val numeric(210,10)); +CREATE TABLE num_exp_add (id1 int4, id2 int4, expected numeric(210,10)); +CREATE TABLE num_exp_sub (id1 int4, id2 int4, expected numeric(210,10)); +CREATE TABLE num_exp_div (id1 int4, id2 int4, expected numeric(210,10)); +CREATE TABLE num_exp_mul (id1 int4, id2 int4, expected numeric(210,10)); +CREATE TABLE num_exp_sqrt (id int4, expected numeric(210,10)); +CREATE TABLE num_exp_ln (id int4, expected numeric(210,10)); +CREATE TABLE num_exp_log10 (id int4, expected numeric(210,10)); +CREATE TABLE num_exp_power_10_ln (id int4, expected numeric(210,10)); +CREATE TABLE num_result (id1 int4, id2 int4, result numeric(210,10)); +-- ****************************** +-- * The following EXPECTED results are computed by bc(1) +-- * with a scale of 200 +-- ****************************** +BEGIN TRANSACTION; +INSERT INTO num_exp_add VALUES (0,0,'0'); +INSERT INTO num_exp_sub VALUES (0,0,'0'); +INSERT INTO num_exp_mul VALUES (0,0,'0'); +INSERT INTO num_exp_div VALUES (0,0,'NaN'); +INSERT INTO num_exp_add VALUES (0,1,'0'); +INSERT INTO num_exp_sub VALUES (0,1,'0'); +INSERT INTO num_exp_mul VALUES (0,1,'0'); +INSERT INTO num_exp_div VALUES (0,1,'NaN'); +INSERT INTO num_exp_add VALUES (0,2,'-34338492.215397047'); +INSERT INTO num_exp_sub VALUES (0,2,'34338492.215397047'); +INSERT INTO num_exp_mul VALUES (0,2,'0'); +INSERT INTO num_exp_div VALUES (0,2,'0'); +INSERT INTO num_exp_add VALUES (0,3,'4.31'); +INSERT INTO num_exp_sub VALUES (0,3,'-4.31'); +INSERT INTO num_exp_mul VALUES (0,3,'0'); +INSERT INTO num_exp_div VALUES (0,3,'0'); +INSERT INTO num_exp_add VALUES (0,4,'7799461.4119'); +INSERT INTO num_exp_sub VALUES (0,4,'-7799461.4119'); +INSERT INTO num_exp_mul VALUES (0,4,'0'); +INSERT INTO num_exp_div VALUES (0,4,'0'); +INSERT INTO num_exp_add VALUES (0,5,'16397.038491'); +INSERT INTO num_exp_sub VALUES (0,5,'-16397.038491'); +INSERT INTO num_exp_mul VALUES (0,5,'0'); +INSERT INTO num_exp_div VALUES (0,5,'0'); +INSERT INTO num_exp_add VALUES (0,6,'93901.57763026'); +INSERT INTO num_exp_sub VALUES (0,6,'-93901.57763026'); +INSERT INTO num_exp_mul VALUES (0,6,'0'); +INSERT INTO num_exp_div VALUES (0,6,'0'); +INSERT INTO num_exp_add VALUES (0,7,'-83028485'); +INSERT INTO num_exp_sub VALUES (0,7,'83028485'); +INSERT INTO num_exp_mul VALUES (0,7,'0'); +INSERT INTO num_exp_div VALUES (0,7,'0'); +INSERT INTO num_exp_add VALUES (0,8,'74881'); +INSERT INTO num_exp_sub VALUES (0,8,'-74881'); +INSERT INTO num_exp_mul VALUES (0,8,'0'); +INSERT INTO num_exp_div VALUES (0,8,'0'); +INSERT INTO num_exp_add VALUES (0,9,'-24926804.045047420'); +INSERT INTO num_exp_sub VALUES (0,9,'24926804.045047420'); +INSERT INTO num_exp_mul VALUES (0,9,'0'); +INSERT INTO num_exp_div VALUES (0,9,'0'); +INSERT INTO num_exp_add VALUES (1,0,'0'); +INSERT INTO num_exp_sub VALUES (1,0,'0'); +INSERT INTO num_exp_mul VALUES (1,0,'0'); +INSERT INTO num_exp_div VALUES (1,0,'NaN'); +INSERT INTO num_exp_add VALUES (1,1,'0'); +INSERT INTO num_exp_sub VALUES (1,1,'0'); +INSERT INTO num_exp_mul VALUES (1,1,'0'); +INSERT INTO num_exp_div VALUES (1,1,'NaN'); +INSERT INTO num_exp_add VALUES (1,2,'-34338492.215397047'); +INSERT INTO num_exp_sub VALUES (1,2,'34338492.215397047'); +INSERT INTO num_exp_mul VALUES (1,2,'0'); +INSERT INTO num_exp_div VALUES (1,2,'0'); +INSERT INTO num_exp_add VALUES (1,3,'4.31'); +INSERT INTO num_exp_sub VALUES (1,3,'-4.31'); +INSERT INTO num_exp_mul VALUES (1,3,'0'); +INSERT INTO num_exp_div VALUES (1,3,'0'); +INSERT INTO num_exp_add VALUES (1,4,'7799461.4119'); +INSERT INTO num_exp_sub VALUES (1,4,'-7799461.4119'); +INSERT INTO num_exp_mul VALUES (1,4,'0'); +INSERT INTO num_exp_div VALUES (1,4,'0'); +INSERT INTO num_exp_add VALUES (1,5,'16397.038491'); +INSERT INTO num_exp_sub VALUES (1,5,'-16397.038491'); +INSERT INTO num_exp_mul VALUES (1,5,'0'); +INSERT INTO num_exp_div VALUES (1,5,'0'); +INSERT INTO num_exp_add VALUES (1,6,'93901.57763026'); +INSERT INTO num_exp_sub VALUES (1,6,'-93901.57763026'); +INSERT INTO num_exp_mul VALUES (1,6,'0'); +INSERT INTO num_exp_div VALUES (1,6,'0'); +INSERT INTO num_exp_add VALUES (1,7,'-83028485'); +INSERT INTO num_exp_sub VALUES (1,7,'83028485'); +INSERT INTO num_exp_mul VALUES (1,7,'0'); +INSERT INTO num_exp_div VALUES (1,7,'0'); +INSERT INTO num_exp_add VALUES (1,8,'74881'); +INSERT INTO num_exp_sub VALUES (1,8,'-74881'); +INSERT INTO num_exp_mul VALUES (1,8,'0'); +INSERT INTO num_exp_div VALUES (1,8,'0'); +INSERT INTO num_exp_add VALUES (1,9,'-24926804.045047420'); +INSERT INTO num_exp_sub VALUES (1,9,'24926804.045047420'); +INSERT INTO num_exp_mul VALUES (1,9,'0'); +INSERT INTO num_exp_div VALUES (1,9,'0'); +INSERT INTO num_exp_add VALUES (2,0,'-34338492.215397047'); +INSERT INTO num_exp_sub VALUES (2,0,'-34338492.215397047'); +INSERT INTO num_exp_mul VALUES (2,0,'0'); +INSERT INTO num_exp_div VALUES (2,0,'NaN'); +INSERT INTO num_exp_add VALUES (2,1,'-34338492.215397047'); +INSERT INTO num_exp_sub VALUES (2,1,'-34338492.215397047'); +INSERT INTO num_exp_mul VALUES (2,1,'0'); +INSERT INTO num_exp_div VALUES (2,1,'NaN'); +INSERT INTO num_exp_add VALUES (2,2,'-68676984.430794094'); +INSERT INTO num_exp_sub VALUES (2,2,'0'); +INSERT INTO num_exp_mul VALUES (2,2,'1179132047626883.596862135856320209'); +INSERT INTO num_exp_div VALUES (2,2,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (2,3,'-34338487.905397047'); +INSERT INTO num_exp_sub VALUES (2,3,'-34338496.525397047'); +INSERT INTO num_exp_mul VALUES (2,3,'-147998901.44836127257'); +INSERT INTO num_exp_div VALUES (2,3,'-7967167.56737750510440835266'); +INSERT INTO num_exp_add VALUES (2,4,'-26539030.803497047'); +INSERT INTO num_exp_sub VALUES (2,4,'-42137953.627297047'); +INSERT INTO num_exp_mul VALUES (2,4,'-267821744976817.8111137106593'); +INSERT INTO num_exp_div VALUES (2,4,'-4.40267480046830116685'); +INSERT INTO num_exp_add VALUES (2,5,'-34322095.176906047'); +INSERT INTO num_exp_sub VALUES (2,5,'-34354889.253888047'); +INSERT INTO num_exp_mul VALUES (2,5,'-563049578578.769242506736077'); +INSERT INTO num_exp_div VALUES (2,5,'-2094.18866914563535496429'); +INSERT INTO num_exp_add VALUES (2,6,'-34244590.637766787'); +INSERT INTO num_exp_sub VALUES (2,6,'-34432393.793027307'); +INSERT INTO num_exp_mul VALUES (2,6,'-3224438592470.18449811926184222'); +INSERT INTO num_exp_div VALUES (2,6,'-365.68599891479766440940'); +INSERT INTO num_exp_add VALUES (2,7,'-117366977.215397047'); +INSERT INTO num_exp_sub VALUES (2,7,'48689992.784602953'); +INSERT INTO num_exp_mul VALUES (2,7,'2851072985828710.485883795'); +INSERT INTO num_exp_div VALUES (2,7,'.41357483778485235518'); +INSERT INTO num_exp_add VALUES (2,8,'-34263611.215397047'); +INSERT INTO num_exp_sub VALUES (2,8,'-34413373.215397047'); +INSERT INTO num_exp_mul VALUES (2,8,'-2571300635581.146276407'); +INSERT INTO num_exp_div VALUES (2,8,'-458.57416721727870888476'); +INSERT INTO num_exp_add VALUES (2,9,'-59265296.260444467'); +INSERT INTO num_exp_sub VALUES (2,9,'-9411688.170349627'); +INSERT INTO num_exp_mul VALUES (2,9,'855948866655588.453741509242968740'); +INSERT INTO num_exp_div VALUES (2,9,'1.37757299946438931811'); +INSERT INTO num_exp_add VALUES (3,0,'4.31'); +INSERT INTO num_exp_sub VALUES (3,0,'4.31'); +INSERT INTO num_exp_mul VALUES (3,0,'0'); +INSERT INTO num_exp_div VALUES (3,0,'NaN'); +INSERT INTO num_exp_add VALUES (3,1,'4.31'); +INSERT INTO num_exp_sub VALUES (3,1,'4.31'); +INSERT INTO num_exp_mul VALUES (3,1,'0'); +INSERT INTO num_exp_div VALUES (3,1,'NaN'); +INSERT INTO num_exp_add VALUES (3,2,'-34338487.905397047'); +INSERT INTO num_exp_sub VALUES (3,2,'34338496.525397047'); +INSERT INTO num_exp_mul VALUES (3,2,'-147998901.44836127257'); +INSERT INTO num_exp_div VALUES (3,2,'-.00000012551512084352'); +INSERT INTO num_exp_add VALUES (3,3,'8.62'); +INSERT INTO num_exp_sub VALUES (3,3,'0'); +INSERT INTO num_exp_mul VALUES (3,3,'18.5761'); +INSERT INTO num_exp_div VALUES (3,3,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (3,4,'7799465.7219'); +INSERT INTO num_exp_sub VALUES (3,4,'-7799457.1019'); +INSERT INTO num_exp_mul VALUES (3,4,'33615678.685289'); +INSERT INTO num_exp_div VALUES (3,4,'.00000055260225961552'); +INSERT INTO num_exp_add VALUES (3,5,'16401.348491'); +INSERT INTO num_exp_sub VALUES (3,5,'-16392.728491'); +INSERT INTO num_exp_mul VALUES (3,5,'70671.23589621'); +INSERT INTO num_exp_div VALUES (3,5,'.00026285234387695504'); +INSERT INTO num_exp_add VALUES (3,6,'93905.88763026'); +INSERT INTO num_exp_sub VALUES (3,6,'-93897.26763026'); +INSERT INTO num_exp_mul VALUES (3,6,'404715.7995864206'); +INSERT INTO num_exp_div VALUES (3,6,'.00004589912234457595'); +INSERT INTO num_exp_add VALUES (3,7,'-83028480.69'); +INSERT INTO num_exp_sub VALUES (3,7,'83028489.31'); +INSERT INTO num_exp_mul VALUES (3,7,'-357852770.35'); +INSERT INTO num_exp_div VALUES (3,7,'-.00000005190989574240'); +INSERT INTO num_exp_add VALUES (3,8,'74885.31'); +INSERT INTO num_exp_sub VALUES (3,8,'-74876.69'); +INSERT INTO num_exp_mul VALUES (3,8,'322737.11'); +INSERT INTO num_exp_div VALUES (3,8,'.00005755799201399553'); +INSERT INTO num_exp_add VALUES (3,9,'-24926799.735047420'); +INSERT INTO num_exp_sub VALUES (3,9,'24926808.355047420'); +INSERT INTO num_exp_mul VALUES (3,9,'-107434525.43415438020'); +INSERT INTO num_exp_div VALUES (3,9,'-.00000017290624149854'); +INSERT INTO num_exp_add VALUES (4,0,'7799461.4119'); +INSERT INTO num_exp_sub VALUES (4,0,'7799461.4119'); +INSERT INTO num_exp_mul VALUES (4,0,'0'); +INSERT INTO num_exp_div VALUES (4,0,'NaN'); +INSERT INTO num_exp_add VALUES (4,1,'7799461.4119'); +INSERT INTO num_exp_sub VALUES (4,1,'7799461.4119'); +INSERT INTO num_exp_mul VALUES (4,1,'0'); +INSERT INTO num_exp_div VALUES (4,1,'NaN'); +INSERT INTO num_exp_add VALUES (4,2,'-26539030.803497047'); +INSERT INTO num_exp_sub VALUES (4,2,'42137953.627297047'); +INSERT INTO num_exp_mul VALUES (4,2,'-267821744976817.8111137106593'); +INSERT INTO num_exp_div VALUES (4,2,'-.22713465002993920385'); +INSERT INTO num_exp_add VALUES (4,3,'7799465.7219'); +INSERT INTO num_exp_sub VALUES (4,3,'7799457.1019'); +INSERT INTO num_exp_mul VALUES (4,3,'33615678.685289'); +INSERT INTO num_exp_div VALUES (4,3,'1809619.81714617169373549883'); +INSERT INTO num_exp_add VALUES (4,4,'15598922.8238'); +INSERT INTO num_exp_sub VALUES (4,4,'0'); +INSERT INTO num_exp_mul VALUES (4,4,'60831598315717.14146161'); +INSERT INTO num_exp_div VALUES (4,4,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (4,5,'7815858.450391'); +INSERT INTO num_exp_sub VALUES (4,5,'7783064.373409'); +INSERT INTO num_exp_mul VALUES (4,5,'127888068979.9935054429'); +INSERT INTO num_exp_div VALUES (4,5,'475.66281046305802686061'); +INSERT INTO num_exp_add VALUES (4,6,'7893362.98953026'); +INSERT INTO num_exp_sub VALUES (4,6,'7705559.83426974'); +INSERT INTO num_exp_mul VALUES (4,6,'732381731243.745115764094'); +INSERT INTO num_exp_div VALUES (4,6,'83.05996138436129499606'); +INSERT INTO num_exp_add VALUES (4,7,'-75229023.5881'); +INSERT INTO num_exp_sub VALUES (4,7,'90827946.4119'); +INSERT INTO num_exp_mul VALUES (4,7,'-647577464846017.9715'); +INSERT INTO num_exp_div VALUES (4,7,'-.09393717604145131637'); +INSERT INTO num_exp_add VALUES (4,8,'7874342.4119'); +INSERT INTO num_exp_sub VALUES (4,8,'7724580.4119'); +INSERT INTO num_exp_mul VALUES (4,8,'584031469984.4839'); +INSERT INTO num_exp_div VALUES (4,8,'104.15808298366741897143'); +INSERT INTO num_exp_add VALUES (4,9,'-17127342.633147420'); +INSERT INTO num_exp_sub VALUES (4,9,'32726265.456947420'); +INSERT INTO num_exp_mul VALUES (4,9,'-194415646271340.1815956522980'); +INSERT INTO num_exp_div VALUES (4,9,'-.31289456112403769409'); +INSERT INTO num_exp_add VALUES (5,0,'16397.038491'); +INSERT INTO num_exp_sub VALUES (5,0,'16397.038491'); +INSERT INTO num_exp_mul VALUES (5,0,'0'); +INSERT INTO num_exp_div VALUES (5,0,'NaN'); +INSERT INTO num_exp_add VALUES (5,1,'16397.038491'); +INSERT INTO num_exp_sub VALUES (5,1,'16397.038491'); +INSERT INTO num_exp_mul VALUES (5,1,'0'); +INSERT INTO num_exp_div VALUES (5,1,'NaN'); +INSERT INTO num_exp_add VALUES (5,2,'-34322095.176906047'); +INSERT INTO num_exp_sub VALUES (5,2,'34354889.253888047'); +INSERT INTO num_exp_mul VALUES (5,2,'-563049578578.769242506736077'); +INSERT INTO num_exp_div VALUES (5,2,'-.00047751189505192446'); +INSERT INTO num_exp_add VALUES (5,3,'16401.348491'); +INSERT INTO num_exp_sub VALUES (5,3,'16392.728491'); +INSERT INTO num_exp_mul VALUES (5,3,'70671.23589621'); +INSERT INTO num_exp_div VALUES (5,3,'3804.41728329466357308584'); +INSERT INTO num_exp_add VALUES (5,4,'7815858.450391'); +INSERT INTO num_exp_sub VALUES (5,4,'-7783064.373409'); +INSERT INTO num_exp_mul VALUES (5,4,'127888068979.9935054429'); +INSERT INTO num_exp_div VALUES (5,4,'.00210232958726897192'); +INSERT INTO num_exp_add VALUES (5,5,'32794.076982'); +INSERT INTO num_exp_sub VALUES (5,5,'0'); +INSERT INTO num_exp_mul VALUES (5,5,'268862871.275335557081'); +INSERT INTO num_exp_div VALUES (5,5,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (5,6,'110298.61612126'); +INSERT INTO num_exp_sub VALUES (5,6,'-77504.53913926'); +INSERT INTO num_exp_mul VALUES (5,6,'1539707782.76899778633766'); +INSERT INTO num_exp_div VALUES (5,6,'.17461941433576102689'); +INSERT INTO num_exp_add VALUES (5,7,'-83012087.961509'); +INSERT INTO num_exp_sub VALUES (5,7,'83044882.038491'); +INSERT INTO num_exp_mul VALUES (5,7,'-1361421264394.416135'); +INSERT INTO num_exp_div VALUES (5,7,'-.00019748690453643710'); +INSERT INTO num_exp_add VALUES (5,8,'91278.038491'); +INSERT INTO num_exp_sub VALUES (5,8,'-58483.961509'); +INSERT INTO num_exp_mul VALUES (5,8,'1227826639.244571'); +INSERT INTO num_exp_div VALUES (5,8,'.21897461960978085228'); +INSERT INTO num_exp_add VALUES (5,9,'-24910407.006556420'); +INSERT INTO num_exp_sub VALUES (5,9,'24943201.083538420'); +INSERT INTO num_exp_mul VALUES (5,9,'-408725765384.257043660243220'); +INSERT INTO num_exp_div VALUES (5,9,'-.00065780749354660427'); +INSERT INTO num_exp_add VALUES (6,0,'93901.57763026'); +INSERT INTO num_exp_sub VALUES (6,0,'93901.57763026'); +INSERT INTO num_exp_mul VALUES (6,0,'0'); +INSERT INTO num_exp_div VALUES (6,0,'NaN'); +INSERT INTO num_exp_add VALUES (6,1,'93901.57763026'); +INSERT INTO num_exp_sub VALUES (6,1,'93901.57763026'); +INSERT INTO num_exp_mul VALUES (6,1,'0'); +INSERT INTO num_exp_div VALUES (6,1,'NaN'); +INSERT INTO num_exp_add VALUES (6,2,'-34244590.637766787'); +INSERT INTO num_exp_sub VALUES (6,2,'34432393.793027307'); +INSERT INTO num_exp_mul VALUES (6,2,'-3224438592470.18449811926184222'); +INSERT INTO num_exp_div VALUES (6,2,'-.00273458651128995823'); +INSERT INTO num_exp_add VALUES (6,3,'93905.88763026'); +INSERT INTO num_exp_sub VALUES (6,3,'93897.26763026'); +INSERT INTO num_exp_mul VALUES (6,3,'404715.7995864206'); +INSERT INTO num_exp_div VALUES (6,3,'21786.90896293735498839907'); +INSERT INTO num_exp_add VALUES (6,4,'7893362.98953026'); +INSERT INTO num_exp_sub VALUES (6,4,'-7705559.83426974'); +INSERT INTO num_exp_mul VALUES (6,4,'732381731243.745115764094'); +INSERT INTO num_exp_div VALUES (6,4,'.01203949512295682469'); +INSERT INTO num_exp_add VALUES (6,5,'110298.61612126'); +INSERT INTO num_exp_sub VALUES (6,5,'77504.53913926'); +INSERT INTO num_exp_mul VALUES (6,5,'1539707782.76899778633766'); +INSERT INTO num_exp_div VALUES (6,5,'5.72674008674192359679'); +INSERT INTO num_exp_add VALUES (6,6,'187803.15526052'); +INSERT INTO num_exp_sub VALUES (6,6,'0'); +INSERT INTO num_exp_mul VALUES (6,6,'8817506281.4517452372676676'); +INSERT INTO num_exp_div VALUES (6,6,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (6,7,'-82934583.42236974'); +INSERT INTO num_exp_sub VALUES (6,7,'83122386.57763026'); +INSERT INTO num_exp_mul VALUES (6,7,'-7796505729750.37795610'); +INSERT INTO num_exp_div VALUES (6,7,'-.00113095617281538980'); +INSERT INTO num_exp_add VALUES (6,8,'168782.57763026'); +INSERT INTO num_exp_sub VALUES (6,8,'19020.57763026'); +INSERT INTO num_exp_mul VALUES (6,8,'7031444034.53149906'); +INSERT INTO num_exp_div VALUES (6,8,'1.25401073209839612184'); +INSERT INTO num_exp_add VALUES (6,9,'-24832902.467417160'); +INSERT INTO num_exp_sub VALUES (6,9,'25020705.622677680'); +INSERT INTO num_exp_mul VALUES (6,9,'-2340666225110.29929521292692920'); +INSERT INTO num_exp_div VALUES (6,9,'-.00376709254265256789'); +INSERT INTO num_exp_add VALUES (7,0,'-83028485'); +INSERT INTO num_exp_sub VALUES (7,0,'-83028485'); +INSERT INTO num_exp_mul VALUES (7,0,'0'); +INSERT INTO num_exp_div VALUES (7,0,'NaN'); +INSERT INTO num_exp_add VALUES (7,1,'-83028485'); +INSERT INTO num_exp_sub VALUES (7,1,'-83028485'); +INSERT INTO num_exp_mul VALUES (7,1,'0'); +INSERT INTO num_exp_div VALUES (7,1,'NaN'); +INSERT INTO num_exp_add VALUES (7,2,'-117366977.215397047'); +INSERT INTO num_exp_sub VALUES (7,2,'-48689992.784602953'); +INSERT INTO num_exp_mul VALUES (7,2,'2851072985828710.485883795'); +INSERT INTO num_exp_div VALUES (7,2,'2.41794207151503385700'); +INSERT INTO num_exp_add VALUES (7,3,'-83028480.69'); +INSERT INTO num_exp_sub VALUES (7,3,'-83028489.31'); +INSERT INTO num_exp_mul VALUES (7,3,'-357852770.35'); +INSERT INTO num_exp_div VALUES (7,3,'-19264149.65197215777262180974'); +INSERT INTO num_exp_add VALUES (7,4,'-75229023.5881'); +INSERT INTO num_exp_sub VALUES (7,4,'-90827946.4119'); +INSERT INTO num_exp_mul VALUES (7,4,'-647577464846017.9715'); +INSERT INTO num_exp_div VALUES (7,4,'-10.64541262725136247686'); +INSERT INTO num_exp_add VALUES (7,5,'-83012087.961509'); +INSERT INTO num_exp_sub VALUES (7,5,'-83044882.038491'); +INSERT INTO num_exp_mul VALUES (7,5,'-1361421264394.416135'); +INSERT INTO num_exp_div VALUES (7,5,'-5063.62688881730941836574'); +INSERT INTO num_exp_add VALUES (7,6,'-82934583.42236974'); +INSERT INTO num_exp_sub VALUES (7,6,'-83122386.57763026'); +INSERT INTO num_exp_mul VALUES (7,6,'-7796505729750.37795610'); +INSERT INTO num_exp_div VALUES (7,6,'-884.20756174009028770294'); +INSERT INTO num_exp_add VALUES (7,7,'-166056970'); +INSERT INTO num_exp_sub VALUES (7,7,'0'); +INSERT INTO num_exp_mul VALUES (7,7,'6893729321395225'); +INSERT INTO num_exp_div VALUES (7,7,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (7,8,'-82953604'); +INSERT INTO num_exp_sub VALUES (7,8,'-83103366'); +INSERT INTO num_exp_mul VALUES (7,8,'-6217255985285'); +INSERT INTO num_exp_div VALUES (7,8,'-1108.80577182462841041118'); +INSERT INTO num_exp_add VALUES (7,9,'-107955289.045047420'); +INSERT INTO num_exp_sub VALUES (7,9,'-58101680.954952580'); +INSERT INTO num_exp_mul VALUES (7,9,'2069634775752159.035758700'); +INSERT INTO num_exp_div VALUES (7,9,'3.33089171198810413382'); +INSERT INTO num_exp_add VALUES (8,0,'74881'); +INSERT INTO num_exp_sub VALUES (8,0,'74881'); +INSERT INTO num_exp_mul VALUES (8,0,'0'); +INSERT INTO num_exp_div VALUES (8,0,'NaN'); +INSERT INTO num_exp_add VALUES (8,1,'74881'); +INSERT INTO num_exp_sub VALUES (8,1,'74881'); +INSERT INTO num_exp_mul VALUES (8,1,'0'); +INSERT INTO num_exp_div VALUES (8,1,'NaN'); +INSERT INTO num_exp_add VALUES (8,2,'-34263611.215397047'); +INSERT INTO num_exp_sub VALUES (8,2,'34413373.215397047'); +INSERT INTO num_exp_mul VALUES (8,2,'-2571300635581.146276407'); +INSERT INTO num_exp_div VALUES (8,2,'-.00218067233500788615'); +INSERT INTO num_exp_add VALUES (8,3,'74885.31'); +INSERT INTO num_exp_sub VALUES (8,3,'74876.69'); +INSERT INTO num_exp_mul VALUES (8,3,'322737.11'); +INSERT INTO num_exp_div VALUES (8,3,'17373.78190255220417633410'); +INSERT INTO num_exp_add VALUES (8,4,'7874342.4119'); +INSERT INTO num_exp_sub VALUES (8,4,'-7724580.4119'); +INSERT INTO num_exp_mul VALUES (8,4,'584031469984.4839'); +INSERT INTO num_exp_div VALUES (8,4,'.00960079113741758956'); +INSERT INTO num_exp_add VALUES (8,5,'91278.038491'); +INSERT INTO num_exp_sub VALUES (8,5,'58483.961509'); +INSERT INTO num_exp_mul VALUES (8,5,'1227826639.244571'); +INSERT INTO num_exp_div VALUES (8,5,'4.56673929509287019456'); +INSERT INTO num_exp_add VALUES (8,6,'168782.57763026'); +INSERT INTO num_exp_sub VALUES (8,6,'-19020.57763026'); +INSERT INTO num_exp_mul VALUES (8,6,'7031444034.53149906'); +INSERT INTO num_exp_div VALUES (8,6,'.79744134113322314424'); +INSERT INTO num_exp_add VALUES (8,7,'-82953604'); +INSERT INTO num_exp_sub VALUES (8,7,'83103366'); +INSERT INTO num_exp_mul VALUES (8,7,'-6217255985285'); +INSERT INTO num_exp_div VALUES (8,7,'-.00090187120721280172'); +INSERT INTO num_exp_add VALUES (8,8,'149762'); +INSERT INTO num_exp_sub VALUES (8,8,'0'); +INSERT INTO num_exp_mul VALUES (8,8,'5607164161'); +INSERT INTO num_exp_div VALUES (8,8,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (8,9,'-24851923.045047420'); +INSERT INTO num_exp_sub VALUES (8,9,'25001685.045047420'); +INSERT INTO num_exp_mul VALUES (8,9,'-1866544013697.195857020'); +INSERT INTO num_exp_div VALUES (8,9,'-.00300403532938582735'); +INSERT INTO num_exp_add VALUES (9,0,'-24926804.045047420'); +INSERT INTO num_exp_sub VALUES (9,0,'-24926804.045047420'); +INSERT INTO num_exp_mul VALUES (9,0,'0'); +INSERT INTO num_exp_div VALUES (9,0,'NaN'); +INSERT INTO num_exp_add VALUES (9,1,'-24926804.045047420'); +INSERT INTO num_exp_sub VALUES (9,1,'-24926804.045047420'); +INSERT INTO num_exp_mul VALUES (9,1,'0'); +INSERT INTO num_exp_div VALUES (9,1,'NaN'); +INSERT INTO num_exp_add VALUES (9,2,'-59265296.260444467'); +INSERT INTO num_exp_sub VALUES (9,2,'9411688.170349627'); +INSERT INTO num_exp_mul VALUES (9,2,'855948866655588.453741509242968740'); +INSERT INTO num_exp_div VALUES (9,2,'.72591434384152961526'); +INSERT INTO num_exp_add VALUES (9,3,'-24926799.735047420'); +INSERT INTO num_exp_sub VALUES (9,3,'-24926808.355047420'); +INSERT INTO num_exp_mul VALUES (9,3,'-107434525.43415438020'); +INSERT INTO num_exp_div VALUES (9,3,'-5783481.21694835730858468677'); +INSERT INTO num_exp_add VALUES (9,4,'-17127342.633147420'); +INSERT INTO num_exp_sub VALUES (9,4,'-32726265.456947420'); +INSERT INTO num_exp_mul VALUES (9,4,'-194415646271340.1815956522980'); +INSERT INTO num_exp_div VALUES (9,4,'-3.19596478892958416484'); +INSERT INTO num_exp_add VALUES (9,5,'-24910407.006556420'); +INSERT INTO num_exp_sub VALUES (9,5,'-24943201.083538420'); +INSERT INTO num_exp_mul VALUES (9,5,'-408725765384.257043660243220'); +INSERT INTO num_exp_div VALUES (9,5,'-1520.20159364322004505807'); +INSERT INTO num_exp_add VALUES (9,6,'-24832902.467417160'); +INSERT INTO num_exp_sub VALUES (9,6,'-25020705.622677680'); +INSERT INTO num_exp_mul VALUES (9,6,'-2340666225110.29929521292692920'); +INSERT INTO num_exp_div VALUES (9,6,'-265.45671195426965751280'); +INSERT INTO num_exp_add VALUES (9,7,'-107955289.045047420'); +INSERT INTO num_exp_sub VALUES (9,7,'58101680.954952580'); +INSERT INTO num_exp_mul VALUES (9,7,'2069634775752159.035758700'); +INSERT INTO num_exp_div VALUES (9,7,'.30021990699995814689'); +INSERT INTO num_exp_add VALUES (9,8,'-24851923.045047420'); +INSERT INTO num_exp_sub VALUES (9,8,'-25001685.045047420'); +INSERT INTO num_exp_mul VALUES (9,8,'-1866544013697.195857020'); +INSERT INTO num_exp_div VALUES (9,8,'-332.88556569820675471748'); +INSERT INTO num_exp_add VALUES (9,9,'-49853608.090094840'); +INSERT INTO num_exp_sub VALUES (9,9,'0'); +INSERT INTO num_exp_mul VALUES (9,9,'621345559900192.420120630048656400'); +INSERT INTO num_exp_div VALUES (9,9,'1.00000000000000000000'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_sqrt VALUES (0,'0'); +INSERT INTO num_exp_sqrt VALUES (1,'0'); +INSERT INTO num_exp_sqrt VALUES (2,'5859.90547836712524903505'); +INSERT INTO num_exp_sqrt VALUES (3,'2.07605394920266944396'); +INSERT INTO num_exp_sqrt VALUES (4,'2792.75158435189147418923'); +INSERT INTO num_exp_sqrt VALUES (5,'128.05092147657509145473'); +INSERT INTO num_exp_sqrt VALUES (6,'306.43364311096782703406'); +INSERT INTO num_exp_sqrt VALUES (7,'9111.99676251039939975230'); +INSERT INTO num_exp_sqrt VALUES (8,'273.64392922189960397542'); +INSERT INTO num_exp_sqrt VALUES (9,'4992.67503899937593364766'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_ln VALUES (0,'NaN'); +INSERT INTO num_exp_ln VALUES (1,'NaN'); +INSERT INTO num_exp_ln VALUES (2,'17.35177750493897715514'); +INSERT INTO num_exp_ln VALUES (3,'1.46093790411565641971'); +INSERT INTO num_exp_ln VALUES (4,'15.86956523951936572464'); +INSERT INTO num_exp_ln VALUES (5,'9.70485601768871834038'); +INSERT INTO num_exp_ln VALUES (6,'11.45000246622944403127'); +INSERT INTO num_exp_ln VALUES (7,'18.23469429965478772991'); +INSERT INTO num_exp_ln VALUES (8,'11.22365546576315513668'); +INSERT INTO num_exp_ln VALUES (9,'17.03145425013166006962'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_log10 VALUES (0,'NaN'); +INSERT INTO num_exp_log10 VALUES (1,'NaN'); +INSERT INTO num_exp_log10 VALUES (2,'7.53578122160797276459'); +INSERT INTO num_exp_log10 VALUES (3,'.63447727016073160075'); +INSERT INTO num_exp_log10 VALUES (4,'6.89206461372691743345'); +INSERT INTO num_exp_log10 VALUES (5,'4.21476541614777768626'); +INSERT INTO num_exp_log10 VALUES (6,'4.97267288886207207671'); +INSERT INTO num_exp_log10 VALUES (7,'7.91922711353275546914'); +INSERT INTO num_exp_log10 VALUES (8,'4.87437163556421004138'); +INSERT INTO num_exp_log10 VALUES (9,'7.39666659961986567059'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_power_10_ln VALUES (0,'NaN'); +INSERT INTO num_exp_power_10_ln VALUES (1,'NaN'); +INSERT INTO num_exp_power_10_ln VALUES (2,'224790267919917955.13261618583642653184'); +INSERT INTO num_exp_power_10_ln VALUES (3,'28.90266599445155957393'); +INSERT INTO num_exp_power_10_ln VALUES (4,'7405685069594999.07733999469386277636'); +INSERT INTO num_exp_power_10_ln VALUES (5,'5068226527.32127265408584640098'); +INSERT INTO num_exp_power_10_ln VALUES (6,'281839893606.99372343357047819067'); +INSERT INTO num_exp_power_10_ln VALUES (7,'1716699575118597095.42330819910640247627'); +INSERT INTO num_exp_power_10_ln VALUES (8,'167361463828.07491320069016125952'); +INSERT INTO num_exp_power_10_ln VALUES (9,'107511333880052007.04141124673540337457'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_data VALUES (0, '0'); +INSERT INTO num_data VALUES (1, '0'); +INSERT INTO num_data VALUES (2, '-34338492.215397047'); +INSERT INTO num_data VALUES (3, '4.31'); +INSERT INTO num_data VALUES (4, '7799461.4119'); +INSERT INTO num_data VALUES (5, '16397.038491'); +INSERT INTO num_data VALUES (6, '93901.57763026'); +INSERT INTO num_data VALUES (7, '-83028485'); +INSERT INTO num_data VALUES (8, '74881'); +INSERT INTO num_data VALUES (9, '-24926804.045047420'); +COMMIT TRANSACTION; +-- ****************************** +-- * Create indices for faster checks +-- ****************************** +CREATE UNIQUE INDEX num_exp_add_idx ON num_exp_add (id1, id2); +CREATE UNIQUE INDEX num_exp_sub_idx ON num_exp_sub (id1, id2); +CREATE UNIQUE INDEX num_exp_div_idx ON num_exp_div (id1, id2); +CREATE UNIQUE INDEX num_exp_mul_idx ON num_exp_mul (id1, id2); +CREATE UNIQUE INDEX num_exp_sqrt_idx ON num_exp_sqrt (id); +CREATE UNIQUE INDEX num_exp_ln_idx ON num_exp_ln (id); +CREATE UNIQUE INDEX num_exp_log10_idx ON num_exp_log10 (id); +CREATE UNIQUE INDEX num_exp_power_10_ln_idx ON num_exp_power_10_ln (id); +VACUUM ANALYZE num_exp_add; +VACUUM ANALYZE num_exp_sub; +VACUUM ANALYZE num_exp_div; +VACUUM ANALYZE num_exp_mul; +VACUUM ANALYZE num_exp_sqrt; +VACUUM ANALYZE num_exp_ln; +VACUUM ANALYZE num_exp_log10; +VACUUM ANALYZE num_exp_power_10_ln; +-- ****************************** +-- * Now check the behaviour of the NUMERIC type +-- ****************************** +-- ****************************** +-- * Addition check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_add t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 10) as expected + FROM num_result t1, num_exp_add t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 10); + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Subtraction check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_sub t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 40) + FROM num_result t1, num_exp_sub t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 40); + id1 | id2 | result | round +-----+-----+--------+------- +(0 rows) + +-- ****************************** +-- * Multiply check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_mul t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 30) as expected + FROM num_result t1, num_exp_mul t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 30); + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Division check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val / t2.val + FROM num_data t1, num_data t2 + WHERE t2.val != '0.0'; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_div t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val / t2.val, 80) + FROM num_data t1, num_data t2 + WHERE t2.val != '0.0'; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 80) as expected + FROM num_result t1, num_exp_div t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 80); + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Square root check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, SQRT(ABS(val)) + FROM num_data; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_sqrt t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + id1 | result | expected +-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Natural logarithm check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, LN(ABS(val)) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_ln t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + id1 | result | expected +-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Logarithm base 10 check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, LOG(numeric '10', ABS(val)) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_log10 t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + id1 | result | expected +-----+--------+---------- +(0 rows) + +-- ****************************** +-- * POWER(10, LN(value)) check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200)))) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_power_10_ln t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + id1 | result | expected +-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Check behavior with Inf and NaN inputs. It's easiest to handle these +-- * separately from the num_data framework used above, because some input +-- * combinations will throw errors. +-- ****************************** +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan')) +SELECT x1, x2, + x1 + x2 AS sum, + x1 - x2 AS diff, + x1 * x2 AS prod +FROM v AS v1(x1), v AS v2(x2); + x1 | x2 | sum | diff | prod +-----------+-----------+-----------+-----------+----------- + 0 | 0 | 0 | 0 | 0 + 0 | 1 | 1 | -1 | 0 + 0 | -1 | -1 | 1 | 0 + 0 | 4.2 | 4.2 | -4.2 | 0.0 + 0 | Infinity | Infinity | -Infinity | NaN + 0 | -Infinity | -Infinity | Infinity | NaN + 0 | NaN | NaN | NaN | NaN + 1 | 0 | 1 | 1 | 0 + 1 | 1 | 2 | 0 | 1 + 1 | -1 | 0 | 2 | -1 + 1 | 4.2 | 5.2 | -3.2 | 4.2 + 1 | Infinity | Infinity | -Infinity | Infinity + 1 | -Infinity | -Infinity | Infinity | -Infinity + 1 | NaN | NaN | NaN | NaN + -1 | 0 | -1 | -1 | 0 + -1 | 1 | 0 | -2 | -1 + -1 | -1 | -2 | 0 | 1 + -1 | 4.2 | 3.2 | -5.2 | -4.2 + -1 | Infinity | Infinity | -Infinity | -Infinity + -1 | -Infinity | -Infinity | Infinity | Infinity + -1 | NaN | NaN | NaN | NaN + 4.2 | 0 | 4.2 | 4.2 | 0.0 + 4.2 | 1 | 5.2 | 3.2 | 4.2 + 4.2 | -1 | 3.2 | 5.2 | -4.2 + 4.2 | 4.2 | 8.4 | 0.0 | 17.64 + 4.2 | Infinity | Infinity | -Infinity | Infinity + 4.2 | -Infinity | -Infinity | Infinity | -Infinity + 4.2 | NaN | NaN | NaN | NaN + Infinity | 0 | Infinity | Infinity | NaN + Infinity | 1 | Infinity | Infinity | Infinity + Infinity | -1 | Infinity | Infinity | -Infinity + Infinity | 4.2 | Infinity | Infinity | Infinity + Infinity | Infinity | Infinity | NaN | Infinity + Infinity | -Infinity | NaN | Infinity | -Infinity + Infinity | NaN | NaN | NaN | NaN + -Infinity | 0 | -Infinity | -Infinity | NaN + -Infinity | 1 | -Infinity | -Infinity | -Infinity + -Infinity | -1 | -Infinity | -Infinity | Infinity + -Infinity | 4.2 | -Infinity | -Infinity | -Infinity + -Infinity | Infinity | NaN | -Infinity | -Infinity + -Infinity | -Infinity | -Infinity | NaN | Infinity + -Infinity | NaN | NaN | NaN | NaN + NaN | 0 | NaN | NaN | NaN + NaN | 1 | NaN | NaN | NaN + NaN | -1 | NaN | NaN | NaN + NaN | 4.2 | NaN | NaN | NaN + NaN | Infinity | NaN | NaN | NaN + NaN | -Infinity | NaN | NaN | NaN + NaN | NaN | NaN | NaN | NaN +(49 rows) + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan')) +SELECT x1, x2, + x1 / x2 AS quot, + x1 % x2 AS mod, + div(x1, x2) AS div +FROM v AS v1(x1), v AS v2(x2) WHERE x2 != 0; + x1 | x2 | quot | mod | div +-----------+-----------+-------------------------+------+----------- + 0 | 1 | 0.00000000000000000000 | 0 | 0 + 1 | 1 | 1.00000000000000000000 | 0 | 1 + -1 | 1 | -1.00000000000000000000 | 0 | -1 + 4.2 | 1 | 4.2000000000000000 | 0.2 | 4 + Infinity | 1 | Infinity | NaN | Infinity + -Infinity | 1 | -Infinity | NaN | -Infinity + NaN | 1 | NaN | NaN | NaN + 0 | -1 | 0.00000000000000000000 | 0 | 0 + 1 | -1 | -1.00000000000000000000 | 0 | -1 + -1 | -1 | 1.00000000000000000000 | 0 | 1 + 4.2 | -1 | -4.2000000000000000 | 0.2 | -4 + Infinity | -1 | -Infinity | NaN | -Infinity + -Infinity | -1 | Infinity | NaN | Infinity + NaN | -1 | NaN | NaN | NaN + 0 | 4.2 | 0.00000000000000000000 | 0.0 | 0 + 1 | 4.2 | 0.23809523809523809524 | 1.0 | 0 + -1 | 4.2 | -0.23809523809523809524 | -1.0 | 0 + 4.2 | 4.2 | 1.00000000000000000000 | 0.0 | 1 + Infinity | 4.2 | Infinity | NaN | Infinity + -Infinity | 4.2 | -Infinity | NaN | -Infinity + NaN | 4.2 | NaN | NaN | NaN + 0 | Infinity | 0 | 0 | 0 + 1 | Infinity | 0 | 1 | 0 + -1 | Infinity | 0 | -1 | 0 + 4.2 | Infinity | 0 | 4.2 | 0 + Infinity | Infinity | NaN | NaN | NaN + -Infinity | Infinity | NaN | NaN | NaN + NaN | Infinity | NaN | NaN | NaN + 0 | -Infinity | 0 | 0 | 0 + 1 | -Infinity | 0 | 1 | 0 + -1 | -Infinity | 0 | -1 | 0 + 4.2 | -Infinity | 0 | 4.2 | 0 + Infinity | -Infinity | NaN | NaN | NaN + -Infinity | -Infinity | NaN | NaN | NaN + NaN | -Infinity | NaN | NaN | NaN + 0 | NaN | NaN | NaN | NaN + 1 | NaN | NaN | NaN | NaN + -1 | NaN | NaN | NaN | NaN + 4.2 | NaN | NaN | NaN | NaN + Infinity | NaN | NaN | NaN | NaN + -Infinity | NaN | NaN | NaN | NaN + NaN | NaN | NaN | NaN | NaN +(42 rows) + +SELECT 'inf'::numeric / '0'; +ERROR: division by zero +SELECT '-inf'::numeric / '0'; +ERROR: division by zero +SELECT 'nan'::numeric / '0'; + ?column? +---------- + NaN +(1 row) + +SELECT '0'::numeric / '0'; +ERROR: division by zero +SELECT 'inf'::numeric % '0'; +ERROR: division by zero +SELECT '-inf'::numeric % '0'; +ERROR: division by zero +SELECT 'nan'::numeric % '0'; + ?column? +---------- + NaN +(1 row) + +SELECT '0'::numeric % '0'; +ERROR: division by zero +SELECT div('inf'::numeric, '0'); +ERROR: division by zero +SELECT div('-inf'::numeric, '0'); +ERROR: division by zero +SELECT div('nan'::numeric, '0'); + div +----- + NaN +(1 row) + +SELECT div('0'::numeric, '0'); +ERROR: division by zero +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan')) +SELECT x, -x as minusx, abs(x), floor(x), ceil(x), sign(x), numeric_inc(x) as inc +FROM v; + x | minusx | abs | floor | ceil | sign | inc +-----------+-----------+----------+-----------+-----------+------+----------- + 0 | 0 | 0 | 0 | 0 | 0 | 1 + 1 | -1 | 1 | 1 | 1 | 1 | 2 + -1 | 1 | 1 | -1 | -1 | -1 | 0 + 4.2 | -4.2 | 4.2 | 4 | 5 | 1 | 5.2 + -7.777 | 7.777 | 7.777 | -8 | -7 | -1 | -6.777 + Infinity | -Infinity | Infinity | Infinity | Infinity | 1 | Infinity + -Infinity | Infinity | Infinity | -Infinity | -Infinity | -1 | -Infinity + NaN | NaN | NaN | NaN | NaN | NaN | NaN +(8 rows) + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan')) +SELECT x, round(x), round(x,1) as round1, trunc(x), trunc(x,1) as trunc1 +FROM v; + x | round | round1 | trunc | trunc1 +-----------+-----------+-----------+-----------+----------- + 0 | 0 | 0.0 | 0 | 0.0 + 1 | 1 | 1.0 | 1 | 1.0 + -1 | -1 | -1.0 | -1 | -1.0 + 4.2 | 4 | 4.2 | 4 | 4.2 + -7.777 | -8 | -7.8 | -7 | -7.7 + Infinity | Infinity | Infinity | Infinity | Infinity + -Infinity | -Infinity | -Infinity | -Infinity | -Infinity + NaN | NaN | NaN | NaN | NaN +(8 rows) + +-- the large values fall into the numeric abbreviation code's maximal classes +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('1e340'),('-1e340'), + ('inf'),('-inf'),('nan'), + ('inf'),('-inf'),('nan')) +SELECT substring(x::text, 1, 32) +FROM v ORDER BY x; + substring +---------------------------------- + -Infinity + -Infinity + -1000000000000000000000000000000 + -7.777 + -1 + 0 + 1 + 4.2 + 10000000000000000000000000000000 + Infinity + Infinity + NaN + NaN +(13 rows) + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('4.2'),('inf'),('nan')) +SELECT x, sqrt(x) +FROM v; + x | sqrt +----------+------------------- + 0 | 0.000000000000000 + 1 | 1.000000000000000 + 4.2 | 2.049390153191920 + Infinity | Infinity + NaN | NaN +(5 rows) + +SELECT sqrt('-1'::numeric); +ERROR: cannot take square root of a negative number +SELECT sqrt('-inf'::numeric); +ERROR: cannot take square root of a negative number +WITH v(x) AS + (VALUES('1'::numeric),('4.2'),('inf'),('nan')) +SELECT x, + log(x), + log10(x), + ln(x) +FROM v; + x | log | log10 | ln +----------+--------------------+--------------------+-------------------- + 1 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 4.2 | 0.6232492903979005 | 0.6232492903979005 | 1.4350845252893226 + Infinity | Infinity | Infinity | Infinity + NaN | NaN | NaN | NaN +(4 rows) + +SELECT ln('0'::numeric); +ERROR: cannot take logarithm of zero +SELECT ln('-1'::numeric); +ERROR: cannot take logarithm of a negative number +SELECT ln('-inf'::numeric); +ERROR: cannot take logarithm of a negative number +WITH v(x) AS + (VALUES('2'::numeric),('4.2'),('inf'),('nan')) +SELECT x1, x2, + log(x1, x2) +FROM v AS v1(x1), v AS v2(x2); + x1 | x2 | log +----------+----------+-------------------- + 2 | 2 | 1.0000000000000000 + 2 | 4.2 | 2.0703893278913979 + 2 | Infinity | Infinity + 2 | NaN | NaN + 4.2 | 2 | 0.4830009440873890 + 4.2 | 4.2 | 1.0000000000000000 + 4.2 | Infinity | Infinity + 4.2 | NaN | NaN + Infinity | 2 | 0 + Infinity | 4.2 | 0 + Infinity | Infinity | NaN + Infinity | NaN | NaN + NaN | 2 | NaN + NaN | 4.2 | NaN + NaN | Infinity | NaN + NaN | NaN | NaN +(16 rows) + +SELECT log('0'::numeric, '10'); +ERROR: cannot take logarithm of zero +SELECT log('10'::numeric, '0'); +ERROR: cannot take logarithm of zero +SELECT log('-inf'::numeric, '10'); +ERROR: cannot take logarithm of a negative number +SELECT log('10'::numeric, '-inf'); +ERROR: cannot take logarithm of a negative number +SELECT log('inf'::numeric, '0'); +ERROR: cannot take logarithm of zero +SELECT log('inf'::numeric, '-inf'); +ERROR: cannot take logarithm of a negative number +SELECT log('-inf'::numeric, 'inf'); +ERROR: cannot take logarithm of a negative number +WITH v(x) AS + (VALUES('0'::numeric),('1'),('2'),('4.2'),('inf'),('nan')) +SELECT x1, x2, + power(x1, x2) +FROM v AS v1(x1), v AS v2(x2) WHERE x1 != 0 OR x2 >= 0; + x1 | x2 | power +----------+----------+--------------------- + 0 | 0 | 1.0000000000000000 + 0 | 1 | 0.0000000000000000 + 0 | 2 | 0.0000000000000000 + 0 | 4.2 | 0.0000000000000000 + 0 | Infinity | 0 + 0 | NaN | NaN + 1 | 0 | 1.0000000000000000 + 1 | 1 | 1.0000000000000000 + 1 | 2 | 1.0000000000000000 + 1 | 4.2 | 1.0000000000000000 + 1 | Infinity | 1 + 1 | NaN | 1 + 2 | 0 | 1.0000000000000000 + 2 | 1 | 2.0000000000000000 + 2 | 2 | 4.0000000000000000 + 2 | 4.2 | 18.379173679952560 + 2 | Infinity | Infinity + 2 | NaN | NaN + 4.2 | 0 | 1.0000000000000000 + 4.2 | 1 | 4.2000000000000000 + 4.2 | 2 | 17.6400000000000000 + 4.2 | 4.2 | 414.61691860129675 + 4.2 | Infinity | Infinity + 4.2 | NaN | NaN + Infinity | 0 | 1 + Infinity | 1 | Infinity + Infinity | 2 | Infinity + Infinity | 4.2 | Infinity + Infinity | Infinity | Infinity + Infinity | NaN | NaN + NaN | 0 | 1 + NaN | 1 | NaN + NaN | 2 | NaN + NaN | 4.2 | NaN + NaN | Infinity | NaN + NaN | NaN | NaN +(36 rows) + +SELECT power('0'::numeric, '-1'); +ERROR: zero raised to a negative power is undefined +SELECT power('0'::numeric, '-inf'); +ERROR: zero raised to a negative power is undefined +SELECT power('-1'::numeric, 'inf'); + power +------- + 1 +(1 row) + +SELECT power('-2'::numeric, '3'); + power +--------------------- + -8.0000000000000000 +(1 row) + +SELECT power('-2'::numeric, '3.3'); +ERROR: a negative number raised to a non-integer power yields a complex result +SELECT power('-2'::numeric, '-1'); + power +--------------------- + -0.5000000000000000 +(1 row) + +SELECT power('-2'::numeric, '-1.5'); +ERROR: a negative number raised to a non-integer power yields a complex result +SELECT power('-2'::numeric, 'inf'); + power +---------- + Infinity +(1 row) + +SELECT power('-2'::numeric, '-inf'); + power +------- + 0 +(1 row) + +SELECT power('inf'::numeric, '-2'); + power +------- + 0 +(1 row) + +SELECT power('inf'::numeric, '-inf'); + power +------- + 0 +(1 row) + +SELECT power('-inf'::numeric, '2'); + power +---------- + Infinity +(1 row) + +SELECT power('-inf'::numeric, '3'); + power +----------- + -Infinity +(1 row) + +SELECT power('-inf'::numeric, '4.5'); +ERROR: a negative number raised to a non-integer power yields a complex result +SELECT power('-inf'::numeric, '-2'); + power +------- + 0 +(1 row) + +SELECT power('-inf'::numeric, '-3'); + power +------- + 0 +(1 row) + +SELECT power('-inf'::numeric, '0'); + power +------- + 1 +(1 row) + +SELECT power('-inf'::numeric, 'inf'); + power +---------- + Infinity +(1 row) + +SELECT power('-inf'::numeric, '-inf'); + power +------- + 0 +(1 row) + +-- ****************************** +-- * miscellaneous checks for things that have been broken in the past... +-- ****************************** +-- numeric AVG used to fail on some platforms +SELECT AVG(val) FROM num_data; + avg +------------------------ + -13430913.592242320700 +(1 row) + +SELECT MAX(val) FROM num_data; + max +-------------------- + 7799461.4119000000 +(1 row) + +SELECT MIN(val) FROM num_data; + min +---------------------- + -83028485.0000000000 +(1 row) + +SELECT STDDEV(val) FROM num_data; + stddev +------------------------------- + 27791203.28758835329805617386 +(1 row) + +SELECT VARIANCE(val) FROM num_data; + variance +-------------------------------------- + 772350980172061.69659105821915863601 +(1 row) + +-- Check for appropriate rounding and overflow +CREATE TABLE fract_only (id int, val numeric(4,4)); +INSERT INTO fract_only VALUES (1, '0.0'); +INSERT INTO fract_only VALUES (2, '0.1'); +INSERT INTO fract_only VALUES (3, '1.0'); -- should fail +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 4 must round to an absolute value less than 1. +INSERT INTO fract_only VALUES (4, '-0.9999'); +INSERT INTO fract_only VALUES (5, '0.99994'); +INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 4 must round to an absolute value less than 1. +INSERT INTO fract_only VALUES (7, '0.00001'); +INSERT INTO fract_only VALUES (8, '0.00017'); +INSERT INTO fract_only VALUES (9, 'NaN'); +INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 4 cannot hold an infinite value. +INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 4 cannot hold an infinite value. +SELECT * FROM fract_only; + id | val +----+--------- + 1 | 0.0000 + 2 | 0.1000 + 4 | -0.9999 + 5 | 0.9999 + 7 | 0.0000 + 8 | 0.0002 + 9 | NaN +(7 rows) + +DROP TABLE fract_only; +-- Check conversion to integers +SELECT (-9223372036854775808.5)::int8; -- should fail +ERROR: bigint out of range +SELECT (-9223372036854775808.4)::int8; -- ok + int8 +---------------------- + -9223372036854775808 +(1 row) + +SELECT 9223372036854775807.4::int8; -- ok + int8 +--------------------- + 9223372036854775807 +(1 row) + +SELECT 9223372036854775807.5::int8; -- should fail +ERROR: bigint out of range +SELECT (-2147483648.5)::int4; -- should fail +ERROR: integer out of range +SELECT (-2147483648.4)::int4; -- ok + int4 +------------- + -2147483648 +(1 row) + +SELECT 2147483647.4::int4; -- ok + int4 +------------ + 2147483647 +(1 row) + +SELECT 2147483647.5::int4; -- should fail +ERROR: integer out of range +SELECT (-32768.5)::int2; -- should fail +ERROR: smallint out of range +SELECT (-32768.4)::int2; -- ok + int2 +-------- + -32768 +(1 row) + +SELECT 32767.4::int2; -- ok + int2 +------- + 32767 +(1 row) + +SELECT 32767.5::int2; -- should fail +ERROR: smallint out of range +-- Check inf/nan conversion behavior +SELECT 'NaN'::float8::numeric; + numeric +--------- + NaN +(1 row) + +SELECT 'Infinity'::float8::numeric; + numeric +---------- + Infinity +(1 row) + +SELECT '-Infinity'::float8::numeric; + numeric +----------- + -Infinity +(1 row) + +SELECT 'NaN'::numeric::float8; + float8 +-------- + NaN +(1 row) + +SELECT 'Infinity'::numeric::float8; + float8 +---------- + Infinity +(1 row) + +SELECT '-Infinity'::numeric::float8; + float8 +----------- + -Infinity +(1 row) + +SELECT 'NaN'::float4::numeric; + numeric +--------- + NaN +(1 row) + +SELECT 'Infinity'::float4::numeric; + numeric +---------- + Infinity +(1 row) + +SELECT '-Infinity'::float4::numeric; + numeric +----------- + -Infinity +(1 row) + +SELECT 'NaN'::numeric::float4; + float4 +-------- + NaN +(1 row) + +SELECT 'Infinity'::numeric::float4; + float4 +---------- + Infinity +(1 row) + +SELECT '-Infinity'::numeric::float4; + float4 +----------- + -Infinity +(1 row) + +SELECT '42'::int2::numeric; + numeric +--------- + 42 +(1 row) + +SELECT 'NaN'::numeric::int2; +ERROR: cannot convert NaN to smallint +SELECT 'Infinity'::numeric::int2; +ERROR: cannot convert infinity to smallint +SELECT '-Infinity'::numeric::int2; +ERROR: cannot convert infinity to smallint +SELECT 'NaN'::numeric::int4; +ERROR: cannot convert NaN to integer +SELECT 'Infinity'::numeric::int4; +ERROR: cannot convert infinity to integer +SELECT '-Infinity'::numeric::int4; +ERROR: cannot convert infinity to integer +SELECT 'NaN'::numeric::int8; +ERROR: cannot convert NaN to bigint +SELECT 'Infinity'::numeric::int8; +ERROR: cannot convert infinity to bigint +SELECT '-Infinity'::numeric::int8; +ERROR: cannot convert infinity to bigint +-- Simple check that ceil(), floor(), and round() work correctly +CREATE TABLE ceil_floor_round (a numeric); +INSERT INTO ceil_floor_round VALUES ('-5.5'); +INSERT INTO ceil_floor_round VALUES ('-5.499999'); +INSERT INTO ceil_floor_round VALUES ('9.5'); +INSERT INTO ceil_floor_round VALUES ('9.4999999'); +INSERT INTO ceil_floor_round VALUES ('0.0'); +INSERT INTO ceil_floor_round VALUES ('0.0000001'); +INSERT INTO ceil_floor_round VALUES ('-0.000001'); +SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round; + a | ceil | ceiling | floor | round +-----------+------+---------+-------+------- + -5.5 | -5 | -5 | -6 | -6 + -5.499999 | -5 | -5 | -6 | -5 + 9.5 | 10 | 10 | 9 | 10 + 9.4999999 | 10 | 10 | 9 | 9 + 0.0 | 0 | 0 | 0 | 0 + 0.0000001 | 1 | 1 | 0 | 0 + -0.000001 | 0 | 0 | -1 | 0 +(7 rows) + +DROP TABLE ceil_floor_round; +-- Check rounding, it should round ties away from zero. +SELECT i as pow, + round((-2.5 * 10 ^ i)::numeric, -i), + round((-1.5 * 10 ^ i)::numeric, -i), + round((-0.5 * 10 ^ i)::numeric, -i), + round((0.5 * 10 ^ i)::numeric, -i), + round((1.5 * 10 ^ i)::numeric, -i), + round((2.5 * 10 ^ i)::numeric, -i) +FROM generate_series(-5,5) AS t(i); + pow | round | round | round | round | round | round +-----+----------+----------+----------+---------+---------+--------- + -5 | -0.00003 | -0.00002 | -0.00001 | 0.00001 | 0.00002 | 0.00003 + -4 | -0.0003 | -0.0002 | -0.0001 | 0.0001 | 0.0002 | 0.0003 + -3 | -0.003 | -0.002 | -0.001 | 0.001 | 0.002 | 0.003 + -2 | -0.03 | -0.02 | -0.01 | 0.01 | 0.02 | 0.03 + -1 | -0.3 | -0.2 | -0.1 | 0.1 | 0.2 | 0.3 + 0 | -3 | -2 | -1 | 1 | 2 | 3 + 1 | -30 | -20 | -10 | 10 | 20 | 30 + 2 | -300 | -200 | -100 | 100 | 200 | 300 + 3 | -3000 | -2000 | -1000 | 1000 | 2000 | 3000 + 4 | -30000 | -20000 | -10000 | 10000 | 20000 | 30000 + 5 | -300000 | -200000 | -100000 | 100000 | 200000 | 300000 +(11 rows) + +-- Testing for width_bucket(). For convenience, we test both the +-- numeric and float8 versions of the function in this file. +-- errors +SELECT width_bucket(5.0, 3.0, 4.0, 0); +ERROR: count must be greater than zero +SELECT width_bucket(5.0, 3.0, 4.0, -5); +ERROR: count must be greater than zero +SELECT width_bucket(3.5, 3.0, 3.0, 888); +ERROR: lower bound cannot equal upper bound +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, 0); +ERROR: count must be greater than zero +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, -5); +ERROR: count must be greater than zero +SELECT width_bucket(3.5::float8, 3.0::float8, 3.0::float8, 888); +ERROR: lower bound cannot equal upper bound +SELECT width_bucket('NaN', 3.0, 4.0, 888); +ERROR: operand, lower bound, and upper bound cannot be NaN +SELECT width_bucket(0::float8, 'NaN', 4.0::float8, 888); +ERROR: operand, lower bound, and upper bound cannot be NaN +SELECT width_bucket(2.0, 3.0, '-inf', 888); +ERROR: lower and upper bounds must be finite +SELECT width_bucket(0::float8, '-inf', 4.0::float8, 888); +ERROR: lower and upper bounds must be finite +-- normal operation +CREATE TABLE width_bucket_test (operand_num numeric, operand_f8 float8); +COPY width_bucket_test (operand_num) FROM stdin; +UPDATE width_bucket_test SET operand_f8 = operand_num::float8; +SELECT + operand_num, + width_bucket(operand_num, 0, 10, 5) AS wb_1, + width_bucket(operand_f8, 0, 10, 5) AS wb_1f, + width_bucket(operand_num, 10, 0, 5) AS wb_2, + width_bucket(operand_f8, 10, 0, 5) AS wb_2f, + width_bucket(operand_num, 2, 8, 4) AS wb_3, + width_bucket(operand_f8, 2, 8, 4) AS wb_3f, + width_bucket(operand_num, 5.0, 5.5, 20) AS wb_4, + width_bucket(operand_f8, 5.0, 5.5, 20) AS wb_4f, + width_bucket(operand_num, -25, 25, 10) AS wb_5, + width_bucket(operand_f8, -25, 25, 10) AS wb_5f + FROM width_bucket_test; + operand_num | wb_1 | wb_1f | wb_2 | wb_2f | wb_3 | wb_3f | wb_4 | wb_4f | wb_5 | wb_5f +------------------+------+-------+------+-------+------+-------+------+-------+------+------- + -5.2 | 0 | 0 | 6 | 6 | 0 | 0 | 0 | 0 | 4 | 4 + -0.0000000001 | 0 | 0 | 6 | 6 | 0 | 0 | 0 | 0 | 5 | 5 + 0.000000000001 | 1 | 1 | 5 | 5 | 0 | 0 | 0 | 0 | 6 | 6 + 1 | 1 | 1 | 5 | 5 | 0 | 0 | 0 | 0 | 6 | 6 + 1.99999999999999 | 1 | 1 | 5 | 5 | 0 | 0 | 0 | 0 | 6 | 6 + 2 | 2 | 2 | 5 | 5 | 1 | 1 | 0 | 0 | 6 | 6 + 2.00000000000001 | 2 | 2 | 4 | 4 | 1 | 1 | 0 | 0 | 6 | 6 + 3 | 2 | 2 | 4 | 4 | 1 | 1 | 0 | 0 | 6 | 6 + 4 | 3 | 3 | 4 | 4 | 2 | 2 | 0 | 0 | 6 | 6 + 4.5 | 3 | 3 | 3 | 3 | 2 | 2 | 0 | 0 | 6 | 6 + 5 | 3 | 3 | 3 | 3 | 3 | 3 | 1 | 1 | 7 | 7 + 5.5 | 3 | 3 | 3 | 3 | 3 | 3 | 21 | 21 | 7 | 7 + 6 | 4 | 4 | 3 | 3 | 3 | 3 | 21 | 21 | 7 | 7 + 7 | 4 | 4 | 2 | 2 | 4 | 4 | 21 | 21 | 7 | 7 + 8 | 5 | 5 | 2 | 2 | 5 | 5 | 21 | 21 | 7 | 7 + 9 | 5 | 5 | 1 | 1 | 5 | 5 | 21 | 21 | 7 | 7 + 9.99999999999999 | 5 | 5 | 1 | 1 | 5 | 5 | 21 | 21 | 7 | 7 + 10 | 6 | 6 | 1 | 1 | 5 | 5 | 21 | 21 | 8 | 8 + 10.0000000000001 | 6 | 6 | 0 | 0 | 5 | 5 | 21 | 21 | 8 | 8 +(19 rows) + +-- Check positive and negative infinity: we require +-- finite bucket bounds, but allow an infinite operand +SELECT width_bucket(0.0::numeric, 'Infinity'::numeric, 5, 10); -- error +ERROR: lower and upper bounds must be finite +SELECT width_bucket(0.0::numeric, 5, '-Infinity'::numeric, 20); -- error +ERROR: lower and upper bounds must be finite +SELECT width_bucket('Infinity'::numeric, 1, 10, 10), + width_bucket('-Infinity'::numeric, 1, 10, 10); + width_bucket | width_bucket +--------------+-------------- + 11 | 0 +(1 row) + +SELECT width_bucket(0.0::float8, 'Infinity'::float8, 5, 10); -- error +ERROR: lower and upper bounds must be finite +SELECT width_bucket(0.0::float8, 5, '-Infinity'::float8, 20); -- error +ERROR: lower and upper bounds must be finite +SELECT width_bucket('Infinity'::float8, 1, 10, 10), + width_bucket('-Infinity'::float8, 1, 10, 10); + width_bucket | width_bucket +--------------+-------------- + 11 | 0 +(1 row) + +DROP TABLE width_bucket_test; +-- Simple test for roundoff error when results should be exact +SELECT x, width_bucket(x::float8, 10, 100, 9) as flt, + width_bucket(x::numeric, 10, 100, 9) as num +FROM generate_series(0, 110, 10) x; + x | flt | num +-----+-----+----- + 0 | 0 | 0 + 10 | 1 | 1 + 20 | 2 | 2 + 30 | 3 | 3 + 40 | 4 | 4 + 50 | 5 | 5 + 60 | 6 | 6 + 70 | 7 | 7 + 80 | 8 | 8 + 90 | 9 | 9 + 100 | 10 | 10 + 110 | 10 | 10 +(12 rows) + +SELECT x, width_bucket(x::float8, 100, 10, 9) as flt, + width_bucket(x::numeric, 100, 10, 9) as num +FROM generate_series(0, 110, 10) x; + x | flt | num +-----+-----+----- + 0 | 10 | 10 + 10 | 10 | 10 + 20 | 9 | 9 + 30 | 8 | 8 + 40 | 7 | 7 + 50 | 6 | 6 + 60 | 5 | 5 + 70 | 4 | 4 + 80 | 3 | 3 + 90 | 2 | 2 + 100 | 1 | 1 + 110 | 0 | 0 +(12 rows) + +-- +-- TO_CHAR() +-- +SELECT to_char(val, '9G999G999G999G999G999') + FROM num_data; + to_char +------------------------ + 0 + 0 + -34,338,492 + 4 + 7,799,461 + 16,397 + 93,902 + -83,028,485 + 74,881 + -24,926,804 +(10 rows) + +SELECT to_char(val, '9G999G999G999G999G999D999G999G999G999G999') + FROM num_data; + to_char +-------------------------------------------- + .000,000,000,000,000 + .000,000,000,000,000 + -34,338,492.215,397,047,000,000 + 4.310,000,000,000,000 + 7,799,461.411,900,000,000,000 + 16,397.038,491,000,000,000 + 93,901.577,630,260,000,000 + -83,028,485.000,000,000,000,000 + 74,881.000,000,000,000,000 + -24,926,804.045,047,420,000,000 +(10 rows) + +SELECT to_char(val, '9999999999999999.999999999999999PR') + FROM num_data; + to_char +------------------------------------ + .000000000000000 + .000000000000000 + <34338492.215397047000000> + 4.310000000000000 + 7799461.411900000000000 + 16397.038491000000000 + 93901.577630260000000 + <83028485.000000000000000> + 74881.000000000000000 + <24926804.045047420000000> +(10 rows) + +SELECT to_char(val, '9999999999999999.999999999999999S') + FROM num_data; + to_char +----------------------------------- + .000000000000000+ + .000000000000000+ + 34338492.215397047000000- + 4.310000000000000+ + 7799461.411900000000000+ + 16397.038491000000000+ + 93901.577630260000000+ + 83028485.000000000000000- + 74881.000000000000000+ + 24926804.045047420000000- +(10 rows) + +SELECT to_char(val, 'MI9999999999999999.999999999999999') FROM num_data; + to_char +----------------------------------- + .000000000000000 + .000000000000000 + - 34338492.215397047000000 + 4.310000000000000 + 7799461.411900000000000 + 16397.038491000000000 + 93901.577630260000000 + - 83028485.000000000000000 + 74881.000000000000000 + - 24926804.045047420000000 +(10 rows) + +SELECT to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data; + to_char +--------------------- + +0. + +0. + -34338492.215397047 + +4.31 + +7799461.4119 + +16397.038491 + +93901.57763026 + -83028485. + +74881. + -24926804.04504742 +(10 rows) + +SELECT to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data; + to_char +---------------------- + 0. + 0. + <34338492.215397047> + 4.31 + 7799461.4119 + 16397.038491 + 93901.57763026 + <83028485.> + 74881. + <24926804.04504742> +(10 rows) + +SELECT to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data; + to_char +----------------------------------- + + .000000000000000 + + .000000000000000 + - 34338492.215397047000000 + + 4.310000000000000 + + 7799461.411900000000000 + + 16397.038491000000000 + + 93901.577630260000000 + - 83028485.000000000000000 + + 74881.000000000000000 + - 24926804.045047420000000 +(10 rows) + +SELECT to_char(val, '0999999999999999.999999999999999') FROM num_data; + to_char +----------------------------------- + 0000000000000000.000000000000000 + 0000000000000000.000000000000000 + -0000000034338492.215397047000000 + 0000000000000004.310000000000000 + 0000000007799461.411900000000000 + 0000000000016397.038491000000000 + 0000000000093901.577630260000000 + -0000000083028485.000000000000000 + 0000000000074881.000000000000000 + -0000000024926804.045047420000000 +(10 rows) + +SELECT to_char(val, 'S0999999999999999.999999999999999') FROM num_data; + to_char +----------------------------------- + +0000000000000000.000000000000000 + +0000000000000000.000000000000000 + -0000000034338492.215397047000000 + +0000000000000004.310000000000000 + +0000000007799461.411900000000000 + +0000000000016397.038491000000000 + +0000000000093901.577630260000000 + -0000000083028485.000000000000000 + +0000000000074881.000000000000000 + -0000000024926804.045047420000000 +(10 rows) + +SELECT to_char(val, 'FM0999999999999999.999999999999999') FROM num_data; + to_char +----------------------------- + 0000000000000000. + 0000000000000000. + -0000000034338492.215397047 + 0000000000000004.31 + 0000000007799461.4119 + 0000000000016397.038491 + 0000000000093901.57763026 + -0000000083028485. + 0000000000074881. + -0000000024926804.04504742 +(10 rows) + +SELECT to_char(val, 'FM9999999999999999.099999999999999') FROM num_data; + to_char +--------------------- + .0 + .0 + -34338492.215397047 + 4.31 + 7799461.4119 + 16397.038491 + 93901.57763026 + -83028485.0 + 74881.0 + -24926804.04504742 +(10 rows) + +SELECT to_char(val, 'FM9999999999990999.990999999999999') FROM num_data; + to_char +--------------------- + 0000.000 + 0000.000 + -34338492.215397047 + 0004.310 + 7799461.4119 + 16397.038491 + 93901.57763026 + -83028485.000 + 74881.000 + -24926804.04504742 +(10 rows) + +SELECT to_char(val, 'FM0999999999999999.999909999999999') FROM num_data; + to_char +----------------------------- + 0000000000000000.00000 + 0000000000000000.00000 + -0000000034338492.215397047 + 0000000000000004.31000 + 0000000007799461.41190 + 0000000000016397.038491 + 0000000000093901.57763026 + -0000000083028485.00000 + 0000000000074881.00000 + -0000000024926804.04504742 +(10 rows) + +SELECT to_char(val, 'FM9999999990999999.099999999999999') FROM num_data; + to_char +--------------------- + 0000000.0 + 0000000.0 + -34338492.215397047 + 0000004.31 + 7799461.4119 + 0016397.038491 + 0093901.57763026 + -83028485.0 + 0074881.0 + -24926804.04504742 +(10 rows) + +SELECT to_char(val, 'L9999999999999999.099999999999999') FROM num_data; + to_char +------------------------------------ + .000000000000000 + .000000000000000 + -34338492.215397047000000 + 4.310000000000000 + 7799461.411900000000000 + 16397.038491000000000 + 93901.577630260000000 + -83028485.000000000000000 + 74881.000000000000000 + -24926804.045047420000000 +(10 rows) + +SELECT to_char(val, 'FM9999999999999999.99999999999999') FROM num_data; + to_char +--------------------- + 0. + 0. + -34338492.215397047 + 4.31 + 7799461.4119 + 16397.038491 + 93901.57763026 + -83028485. + 74881. + -24926804.04504742 +(10 rows) + +SELECT to_char(val, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data; + to_char +----------------------------------------------------------------------- + +. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + -3 4 3 3 8 4 9 2 . 2 1 5 3 9 7 0 4 7 0 0 0 0 0 0 0 0 + +4 . 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +7 7 9 9 4 6 1 . 4 1 1 9 0 0 0 0 0 0 0 0 0 0 0 0 0 + +1 6 3 9 7 . 0 3 8 4 9 1 0 0 0 0 0 0 0 0 0 0 0 + +9 3 9 0 1 . 5 7 7 6 3 0 2 6 0 0 0 0 0 0 0 0 0 + -8 3 0 2 8 4 8 5 . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +7 4 8 8 1 . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + -2 4 9 2 6 8 0 4 . 0 4 5 0 4 7 4 2 0 0 0 0 0 0 0 0 0 +(10 rows) + +SELECT to_char(val, 'FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data; + to_char +------------------------------------------------------- + +0 . + +0 . + -3 4 3 3 8 4 9 2 . 2 1 5 3 9 7 0 4 7 + +4 . 3 1 + +7 7 9 9 4 6 1 . 4 1 1 9 + +1 6 3 9 7 . 0 3 8 4 9 1 + +9 3 9 0 1 . 5 7 7 6 3 0 2 6 + -8 3 0 2 8 4 8 5 . + +7 4 8 8 1 . + -2 4 9 2 6 8 0 4 . 0 4 5 0 4 7 4 2 +(10 rows) + +SELECT to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data; + to_char +----------------------------------------------------------- + text 9999 "text between quote marks" 0 + text 9999 "text between quote marks" 0 + text -3 9999 433 "text between quote marks" 8492 + text 9999 "text between quote marks" 4 + text 9999 779 "text between quote marks" 9461 + text 9999 1 "text between quote marks" 6397 + text 9999 9 "text between quote marks" 3902 + text -8 9999 302 "text between quote marks" 8485 + text 9999 7 "text between quote marks" 4881 + text -2 9999 492 "text between quote marks" 6804 +(10 rows) + +SELECT to_char(val, '999999SG9999999999') FROM num_data; + to_char +------------------- + + 0 + + 0 + - 34338492 + + 4 + + 7799461 + + 16397 + + 93902 + - 83028485 + + 74881 + - 24926804 +(10 rows) + +SELECT to_char(val, 'FM9999999999999999.999999999999999') FROM num_data; + to_char +--------------------- + 0. + 0. + -34338492.215397047 + 4.31 + 7799461.4119 + 16397.038491 + 93901.57763026 + -83028485. + 74881. + -24926804.04504742 +(10 rows) + +SELECT to_char(val, '9.999EEEE') FROM num_data; + to_char +------------ + 0.000e+00 + 0.000e+00 + -3.434e+07 + 4.310e+00 + 7.799e+06 + 1.640e+04 + 9.390e+04 + -8.303e+07 + 7.488e+04 + -2.493e+07 +(10 rows) + +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, '9.999EEEE') as numeric, + to_char(val::float8, '9.999EEEE') as float8, + to_char(val::float4, '9.999EEEE') as float4 +FROM v; + val | numeric | float8 | float4 +------------+------------+------------+------------ + 0 | 0.000e+00 | 0.000e+00 | 0.000e+00 + -4.2 | -4.200e+00 | -4.200e+00 | -4.200e+00 + 4200000000 | 4.200e+09 | 4.200e+09 | 4.200e+09 + 0.000012 | 1.200e-05 | 1.200e-05 | 1.200e-05 + Infinity | #.####### | #.####### | #.####### + -Infinity | #.####### | #.####### | #.####### + NaN | #.####### | #.####### | #.####### +(7 rows) + +WITH v(exp) AS + (VALUES(-16379),(-16378),(-1234),(-789),(-45),(-5),(-4),(-3),(-2),(-1),(0), + (1),(2),(3),(4),(5),(38),(275),(2345),(45678),(131070),(131071)) +SELECT exp, + to_char(('1.2345e'||exp)::numeric, '9.999EEEE') as numeric +FROM v; + exp | numeric +--------+---------------- + -16379 | 1.235e-16379 + -16378 | 1.235e-16378 + -1234 | 1.235e-1234 + -789 | 1.235e-789 + -45 | 1.235e-45 + -5 | 1.235e-05 + -4 | 1.235e-04 + -3 | 1.235e-03 + -2 | 1.235e-02 + -1 | 1.235e-01 + 0 | 1.235e+00 + 1 | 1.235e+01 + 2 | 1.235e+02 + 3 | 1.235e+03 + 4 | 1.235e+04 + 5 | 1.235e+05 + 38 | 1.235e+38 + 275 | 1.235e+275 + 2345 | 1.235e+2345 + 45678 | 1.235e+45678 + 131070 | 1.235e+131070 + 131071 | 1.235e+131071 +(22 rows) + +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, 'MI9999999999.99') as numeric, + to_char(val::float8, 'MI9999999999.99') as float8, + to_char(val::float4, 'MI9999999999.99') as float4 +FROM v; + val | numeric | float8 | float4 +------------+----------------+----------------+---------------- + 0 | .00 | .00 | .00 + -4.2 | - 4.20 | - 4.20 | - 4.20 + 4200000000 | 4200000000.00 | 4200000000.00 | 4200000000 + 0.000012 | .00 | .00 | .00 + Infinity | Infinity | Infinity | Infinity + -Infinity | - Infinity | - Infinity | - Infinity + NaN | NaN | NaN | NaN +(7 rows) + +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, 'MI99.99') as numeric, + to_char(val::float8, 'MI99.99') as float8, + to_char(val::float4, 'MI99.99') as float4 +FROM v; + val | numeric | float8 | float4 +------------+---------+--------+-------- + 0 | .00 | .00 | .00 + -4.2 | - 4.20 | - 4.20 | - 4.20 + 4200000000 | ##.## | ##.## | ##. + 0.000012 | .00 | .00 | .00 + Infinity | ##.## | ##.## | ##. + -Infinity | -##.## | -##.## | -##. + NaN | ##.## | ##.## | ##.## +(7 rows) + +SELECT to_char('100'::numeric, 'FM999.9'); + to_char +--------- + 100. +(1 row) + +SELECT to_char('100'::numeric, 'FM999.'); + to_char +--------- + 100 +(1 row) + +SELECT to_char('100'::numeric, 'FM999'); + to_char +--------- + 100 +(1 row) + +-- Check parsing of literal text in a format string +SELECT to_char('100'::numeric, 'foo999'); + to_char +--------- + foo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f\oo999'); + to_char +---------- + f\oo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f\\oo999'); + to_char +----------- + f\\oo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f\"oo999'); + to_char +---------- + f"oo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f\\"oo999'); + to_char +----------- + f\"oo 100 +(1 row) + +SELECT to_char('100'::numeric, 'f"ool"999'); + to_char +---------- + fool 100 +(1 row) + +SELECT to_char('100'::numeric, 'f"\ool"999'); + to_char +---------- + fool 100 +(1 row) + +SELECT to_char('100'::numeric, 'f"\\ool"999'); + to_char +----------- + f\ool 100 +(1 row) + +SELECT to_char('100'::numeric, 'f"ool\"999'); + to_char +---------- + fool"999 +(1 row) + +SELECT to_char('100'::numeric, 'f"ool\\"999'); + to_char +----------- + fool\ 100 +(1 row) + +-- TO_NUMBER() +-- +SET lc_numeric = 'C'; +SELECT to_number('-34,338,492', '99G999G999'); + to_number +----------- + -34338492 +(1 row) + +SELECT to_number('-34,338,492.654,878', '99G999G999D999G999'); + to_number +------------------ + -34338492.654878 +(1 row) + +SELECT to_number('<564646.654564>', '999999.999999PR'); + to_number +---------------- + -564646.654564 +(1 row) + +SELECT to_number('0.00001-', '9.999999S'); + to_number +----------- + -0.00001 +(1 row) + +SELECT to_number('5.01-', 'FM9.999999S'); + to_number +----------- + -5.01 +(1 row) + +SELECT to_number('5.01-', 'FM9.999999MI'); + to_number +----------- + -5.01 +(1 row) + +SELECT to_number('5 4 4 4 4 8 . 7 8', '9 9 9 9 9 9 . 9 9'); + to_number +----------- + 544448.78 +(1 row) + +SELECT to_number('.01', 'FM9.99'); + to_number +----------- + 0.01 +(1 row) + +SELECT to_number('.0', '99999999.99999999'); + to_number +----------- + 0.0 +(1 row) + +SELECT to_number('0', '99.99'); + to_number +----------- + 0 +(1 row) + +SELECT to_number('.-01', 'S99.99'); + to_number +----------- + -0.01 +(1 row) + +SELECT to_number('.01-', '99.99S'); + to_number +----------- + -0.01 +(1 row) + +SELECT to_number(' . 0 1-', ' 9 9 . 9 9 S'); + to_number +----------- + -0.01 +(1 row) + +SELECT to_number('34,50','999,99'); + to_number +----------- + 3450 +(1 row) + +SELECT to_number('123,000','999G'); + to_number +----------- + 123 +(1 row) + +SELECT to_number('123456','999G999'); + to_number +----------- + 123456 +(1 row) + +SELECT to_number('$1234.56','L9,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('$1234.56','L99,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('$1,234.56','L99,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('1234.56','L99,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('1,234.56','L99,999.99'); + to_number +----------- + 1234.56 +(1 row) + +SELECT to_number('42nd', '99th'); + to_number +----------- + 42 +(1 row) + +RESET lc_numeric; +-- +-- Input syntax +-- +CREATE TABLE num_input_test (n1 numeric); +-- good inputs +INSERT INTO num_input_test(n1) VALUES (' 123'); +INSERT INTO num_input_test(n1) VALUES (' 3245874 '); +INSERT INTO num_input_test(n1) VALUES (' -93853'); +INSERT INTO num_input_test(n1) VALUES ('555.50'); +INSERT INTO num_input_test(n1) VALUES ('-555.50'); +INSERT INTO num_input_test(n1) VALUES ('NaN '); +INSERT INTO num_input_test(n1) VALUES (' nan'); +INSERT INTO num_input_test(n1) VALUES (' inf '); +INSERT INTO num_input_test(n1) VALUES (' +inf '); +INSERT INTO num_input_test(n1) VALUES (' -inf '); +INSERT INTO num_input_test(n1) VALUES (' Infinity '); +INSERT INTO num_input_test(n1) VALUES (' +inFinity '); +INSERT INTO num_input_test(n1) VALUES (' -INFINITY '); +-- bad inputs +INSERT INTO num_input_test(n1) VALUES (' '); +ERROR: invalid input syntax for type numeric: " " +LINE 1: INSERT INTO num_input_test(n1) VALUES (' '); + ^ +INSERT INTO num_input_test(n1) VALUES (' 1234 %'); +ERROR: invalid input syntax for type numeric: " 1234 %" +LINE 1: INSERT INTO num_input_test(n1) VALUES (' 1234 %'); + ^ +INSERT INTO num_input_test(n1) VALUES ('xyz'); +ERROR: invalid input syntax for type numeric: "xyz" +LINE 1: INSERT INTO num_input_test(n1) VALUES ('xyz'); + ^ +INSERT INTO num_input_test(n1) VALUES ('- 1234'); +ERROR: invalid input syntax for type numeric: "- 1234" +LINE 1: INSERT INTO num_input_test(n1) VALUES ('- 1234'); + ^ +INSERT INTO num_input_test(n1) VALUES ('5 . 0'); +ERROR: invalid input syntax for type numeric: "5 . 0" +LINE 1: INSERT INTO num_input_test(n1) VALUES ('5 . 0'); + ^ +INSERT INTO num_input_test(n1) VALUES ('5. 0 '); +ERROR: invalid input syntax for type numeric: "5. 0 " +LINE 1: INSERT INTO num_input_test(n1) VALUES ('5. 0 '); + ^ +INSERT INTO num_input_test(n1) VALUES (''); +ERROR: invalid input syntax for type numeric: "" +LINE 1: INSERT INTO num_input_test(n1) VALUES (''); + ^ +INSERT INTO num_input_test(n1) VALUES (' N aN '); +ERROR: invalid input syntax for type numeric: " N aN " +LINE 1: INSERT INTO num_input_test(n1) VALUES (' N aN '); + ^ +INSERT INTO num_input_test(n1) VALUES ('+ infinity'); +ERROR: invalid input syntax for type numeric: "+ infinity" +LINE 1: INSERT INTO num_input_test(n1) VALUES ('+ infinity'); + ^ +SELECT * FROM num_input_test; + n1 +----------- + 123 + 3245874 + -93853 + 555.50 + -555.50 + NaN + NaN + Infinity + Infinity + -Infinity + Infinity + Infinity + -Infinity +(13 rows) + +-- +-- Test some corner cases for multiplication +-- +select 4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; + ?column? +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 47909999999999999999999999999999999999999999999999999999999999999999999999999999999999985209000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +(1 row) + +select 4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; + ?column? +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 47899999999999999999999999999999999999999999999999999999999999999999999999999999999999985210000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +(1 row) + +select 4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; + ?column? +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 47709999999999999999999999999999999999999999999999999999999999999999999999999999999999985229000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +(1 row) + +select 4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; + ?column? +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 47699999999999999999999999999999999999999999999999999999999999999999999999999999999999985230000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +(1 row) + +select trim_scale((0.1 - 2e-16383) * (0.1 - 3e-16383)); + trim_scale +------------ + 0.01 +(1 row) + +-- +-- Test some corner cases for division +-- +select 999999999999999999999::numeric/1000000000000000000000; + ?column? +------------------------ + 1.00000000000000000000 +(1 row) + +select div(999999999999999999999::numeric,1000000000000000000000); + div +----- + 0 +(1 row) + +select mod(999999999999999999999::numeric,1000000000000000000000); + mod +----------------------- + 999999999999999999999 +(1 row) + +select div(-9999999999999999999999::numeric,1000000000000000000000); + div +----- + -9 +(1 row) + +select mod(-9999999999999999999999::numeric,1000000000000000000000); + mod +------------------------ + -999999999999999999999 +(1 row) + +select div(-9999999999999999999999::numeric,1000000000000000000000)*1000000000000000000000 + mod(-9999999999999999999999::numeric,1000000000000000000000); + ?column? +------------------------- + -9999999999999999999999 +(1 row) + +select mod (70.0,70) ; + mod +----- + 0.0 +(1 row) + +select div (70.0,70) ; + div +----- + 1 +(1 row) + +select 70.0 / 70 ; + ?column? +------------------------ + 1.00000000000000000000 +(1 row) + +select 12345678901234567890 % 123; + ?column? +---------- + 78 +(1 row) + +select 12345678901234567890 / 123; + ?column? +-------------------- + 100371373180768845 +(1 row) + +select div(12345678901234567890, 123); + div +-------------------- + 100371373180768844 +(1 row) + +select div(12345678901234567890, 123) * 123 + 12345678901234567890 % 123; + ?column? +---------------------- + 12345678901234567890 +(1 row) + +-- +-- Test some corner cases for square root +-- +select sqrt(1.000000000000003::numeric); + sqrt +------------------- + 1.000000000000001 +(1 row) + +select sqrt(1.000000000000004::numeric); + sqrt +------------------- + 1.000000000000002 +(1 row) + +select sqrt(96627521408608.56340355805::numeric); + sqrt +--------------------- + 9829929.87811248648 +(1 row) + +select sqrt(96627521408608.56340355806::numeric); + sqrt +--------------------- + 9829929.87811248649 +(1 row) + +select sqrt(515549506212297735.073688290367::numeric); + sqrt +------------------------ + 718017761.766585921184 +(1 row) + +select sqrt(515549506212297735.073688290368::numeric); + sqrt +------------------------ + 718017761.766585921185 +(1 row) + +select sqrt(8015491789940783531003294973900306::numeric); + sqrt +------------------- + 89529278953540017 +(1 row) + +select sqrt(8015491789940783531003294973900307::numeric); + sqrt +------------------- + 89529278953540018 +(1 row) + +-- +-- Test code path for raising to integer powers +-- +select 10.0 ^ -2147483648 as rounds_to_zero; + rounds_to_zero +-------------------- + 0.0000000000000000 +(1 row) + +select 10.0 ^ -2147483647 as rounds_to_zero; + rounds_to_zero +-------------------- + 0.0000000000000000 +(1 row) + +select 10.0 ^ 2147483647 as overflows; +ERROR: value overflows numeric format +select 117743296169.0 ^ 1000000000 as overflows; +ERROR: value overflows numeric format +-- cases that used to return inaccurate results +select 3.789 ^ 21; + ?column? +-------------------------------- + 1409343026052.8716016316022141 +(1 row) + +select 3.789 ^ 35; + ?column? +---------------------------------------- + 177158169650516670809.3820586142670135 +(1 row) + +select 1.2 ^ 345; + ?column? +----------------------------------------------- + 2077446682327378559843444695.5827049735727869 +(1 row) + +select 0.12 ^ (-20); + ?column? +-------------------------------------- + 2608405330458882702.5529619561355838 +(1 row) + +select 1.000000000123 ^ (-2147483648); + ?column? +-------------------- + 0.7678656556403084 +(1 row) + +select coalesce(nullif(0.9999999999 ^ 23300000000000, 0), 0) as rounds_to_zero; + rounds_to_zero +---------------- + 0 +(1 row) + +select round(((1 - 1.500012345678e-1000) ^ 1.45e1003) * 1e1000); + round +---------------------------------------------------------- + 25218976308958387188077465658068501556514992509509282366 +(1 row) + +-- cases that used to error out +select 0.12 ^ (-25); + ?column? +------------------------------------------- + 104825960103961013959336.4983657883169110 +(1 row) + +select 0.5678 ^ (-85); + ?column? +---------------------------------------- + 782333637740774446257.7719390061997396 +(1 row) + +select coalesce(nullif(0.9999999999 ^ 70000000000000, 0), 0) as underflows; + underflows +------------ + 0 +(1 row) + +-- negative base to integer powers +select (-1.0) ^ 2147483646; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select (-1.0) ^ 2147483647; + ?column? +--------------------- + -1.0000000000000000 +(1 row) + +select (-1.0) ^ 2147483648; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select (-1.0) ^ 1000000000000000; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select (-1.0) ^ 1000000000000001; + ?column? +--------------------- + -1.0000000000000000 +(1 row) + +-- +-- Tests for raising to non-integer powers +-- +-- special cases +select 0.0 ^ 0.0; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select (-12.34) ^ 0.0; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select 12.34 ^ 0.0; + ?column? +-------------------- + 1.0000000000000000 +(1 row) + +select 0.0 ^ 12.34; + ?column? +-------------------- + 0.0000000000000000 +(1 row) + +-- NaNs +select 'NaN'::numeric ^ 'NaN'::numeric; + ?column? +---------- + NaN +(1 row) + +select 'NaN'::numeric ^ 0; + ?column? +---------- + 1 +(1 row) + +select 'NaN'::numeric ^ 1; + ?column? +---------- + NaN +(1 row) + +select 0 ^ 'NaN'::numeric; + ?column? +---------- + NaN +(1 row) + +select 1 ^ 'NaN'::numeric; + ?column? +---------- + 1 +(1 row) + +-- invalid inputs +select 0.0 ^ (-12.34); +ERROR: zero raised to a negative power is undefined +select (-12.34) ^ 1.2; +ERROR: a negative number raised to a non-integer power yields a complex result +-- cases that used to generate inaccurate results +select 32.1 ^ 9.8; + ?column? +-------------------- + 580429286790711.10 +(1 row) + +select 32.1 ^ (-9.8); + ?column? +---------------------------------- + 0.000000000000001722862754788209 +(1 row) + +select 12.3 ^ 45.6; + ?column? +------------------------------------------------------ + 50081010321492803393171165777624533697036806969694.9 +(1 row) + +select 12.3 ^ (-45.6); + ?column? +--------------------------------------------------------------------- + 0.00000000000000000000000000000000000000000000000001996764828785491 +(1 row) + +-- big test +select 1.234 ^ 5678; + ?column? +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 307239295662090741644584872593956173493568238595074141254349565406661439636598896798876823220904084953233015553994854875890890858118656468658643918169805277399402542281777901029346337707622181574346585989613344285010764501017625366742865066948856161360224801370482171458030533346309750557140549621313515752078638620714732831815297168231790779296290266207315344008883935010274044001522606235576584215999260117523114297033944018699691024106823438431754073086813382242140602291215149759520833200152654884259619588924545324.5973362312547382 +(1 row) + +-- +-- Tests for EXP() +-- +-- special cases +select exp(0.0); + exp +-------------------- + 1.0000000000000000 +(1 row) + +select exp(1.0); + exp +-------------------- + 2.7182818284590452 +(1 row) + +select exp(1.0::numeric(71,70)); + exp +-------------------------------------------------------------------------- + 2.7182818284590452353602874713526624977572470936999595749669676277240766 +(1 row) + +select exp('nan'::numeric); + exp +----- + NaN +(1 row) + +select exp('inf'::numeric); + exp +---------- + Infinity +(1 row) + +select exp('-inf'::numeric); + exp +----- + 0 +(1 row) + +select coalesce(nullif(exp(-5000::numeric), 0), 0) as rounds_to_zero; + rounds_to_zero +---------------- + 0 +(1 row) + +select coalesce(nullif(exp(-10000::numeric), 0), 0) as underflows; + underflows +------------ + 0 +(1 row) + +-- cases that used to generate inaccurate results +select exp(32.999); + exp +--------------------- + 214429043492155.053 +(1 row) + +select exp(-32.999); + exp +---------------------------------- + 0.000000000000004663547361468248 +(1 row) + +select exp(123.456); + exp +------------------------------------------------------------ + 413294435277809344957685441227343146614594393746575438.725 +(1 row) + +select exp(-123.456); + exp +------------------------------------------------------------------------- + 0.000000000000000000000000000000000000000000000000000002419582541264601 +(1 row) + +-- big test +select exp(1234.5678); + exp +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 146549072930959479983482138503979804217622199675223653966270157446954995433819741094410764947112047906012815540251009949604426069672532417736057033099274204598385314594846509975629046864798765888104789074984927709616261452461385220475510438783429612447831614003668421849727379202555580791042606170523016207262965336641214601082882495255771621327088265411334088968112458492660609809762865582162764292604697957813514621259353683899630997077707406305730694385703091201347848855199354307506425820147289848677003277208302716466011827836279231.9667 +(1 row) + +-- +-- Tests for generate_series +-- +select * from generate_series(0.0::numeric, 4.0::numeric); + generate_series +----------------- + 0.0 + 1.0 + 2.0 + 3.0 + 4.0 +(5 rows) + +select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric); + generate_series +----------------- + 0.1 + 1.4 + 2.7 + 4.0 +(4 rows) + +select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric); + generate_series +----------------- + 4.0 + 1.8 + -0.4 +(3 rows) + +-- Trigger errors +select * from generate_series(-100::numeric, 100::numeric, 0::numeric); +ERROR: step size cannot equal zero +select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric); +ERROR: step size cannot be NaN +select * from generate_series('nan'::numeric, 100::numeric, 10::numeric); +ERROR: start value cannot be NaN +select * from generate_series(0::numeric, 'nan'::numeric, 10::numeric); +ERROR: stop value cannot be NaN +select * from generate_series('inf'::numeric, 'inf'::numeric, 10::numeric); +ERROR: start value cannot be infinity +select * from generate_series(0::numeric, 'inf'::numeric, 10::numeric); +ERROR: stop value cannot be infinity +select * from generate_series(0::numeric, '42'::numeric, '-inf'::numeric); +ERROR: step size cannot be infinity +-- Checks maximum, output is truncated +select (i / (10::numeric ^ 131071))::numeric(1,0) + from generate_series(6 * (10::numeric ^ 131071), + 9 * (10::numeric ^ 131071), + 10::numeric ^ 131071) as a(i); + numeric +--------- + 6 + 7 + 8 + 9 +(4 rows) + +-- Check usage with variables +select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j; + i | j +---+--- + 1 | 1 + 1 | 2 + 1 | 3 + 2 | 2 + 2 | 3 + 3 | 3 +(6 rows) + +select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j; + i | j +---+--- + 1 | 1 + 2 | 1 + 2 | 2 + 3 | 1 + 3 | 2 + 3 | 3 +(6 rows) + +select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j; + i | j +---+--- + 1 | 1 + 1 | 2 + 1 | 3 + 1 | 4 + 1 | 5 + 2 | 1 + 2 | 3 + 2 | 5 + 3 | 1 + 3 | 4 +(10 rows) + +-- +-- Tests for LN() +-- +-- Invalid inputs +select ln(-12.34); +ERROR: cannot take logarithm of a negative number +select ln(0.0); +ERROR: cannot take logarithm of zero +-- Some random tests +select ln(1.2345678e-28); + ln +----------------------------------------- + -64.26166165451762991204894255882820859 +(1 row) + +select ln(0.0456789); + ln +--------------------- + -3.0861187944847439 +(1 row) + +select ln(0.349873948359354029493948309745709580730482050975); + ln +----------------------------------------------------- + -1.050182336912082775693991697979750253056317885460 +(1 row) + +select ln(0.99949452); + ln +------------------------- + -0.00050560779808326467 +(1 row) + +select ln(1.00049687395); + ln +------------------------ + 0.00049675054901370394 +(1 row) + +select ln(1234.567890123456789); + ln +-------------------- + 7.1184763012977896 +(1 row) + +select ln(5.80397490724e5); + ln +-------------------- + 13.271468476626518 +(1 row) + +select ln(9.342536355e34); + ln +-------------------- + 80.522470935524187 +(1 row) + +-- +-- Tests for LOG() (base 10) +-- +-- invalid inputs +select log(-12.34); +ERROR: cannot take logarithm of a negative number +CONTEXT: SQL function "log" statement 1 +select log(0.0); +ERROR: cannot take logarithm of zero +CONTEXT: SQL function "log" statement 1 +-- some random tests +select log(1.234567e-89); + log +----------------------------------------------------------------------------------------------------- + -88.90848533591373725637496492944925187293052336306443143312825869985819779294142441287021741054275 +(1 row) + +select log(3.4634998359873254962349856073435545); + log +-------------------------------------- + 0.5395151714070134409152404011959981 +(1 row) + +select log(9.999999999999999999); + log +---------------------- + 1.000000000000000000 +(1 row) + +select log(10.00000000000000000); + log +--------------------- + 1.00000000000000000 +(1 row) + +select log(10.00000000000000001); + log +--------------------- + 1.00000000000000000 +(1 row) + +select log(590489.45235237); + log +------------------- + 5.771212144411727 +(1 row) + +-- +-- Tests for LOG() (arbitrary base) +-- +-- invalid inputs +select log(-12.34, 56.78); +ERROR: cannot take logarithm of a negative number +select log(-12.34, -56.78); +ERROR: cannot take logarithm of a negative number +select log(12.34, -56.78); +ERROR: cannot take logarithm of a negative number +select log(0.0, 12.34); +ERROR: cannot take logarithm of zero +select log(12.34, 0.0); +ERROR: cannot take logarithm of zero +select log(1.0, 12.34); +ERROR: division by zero +-- some random tests +select log(1.23e-89, 6.4689e45); + log +------------------------------------------------------------------------------------------------ + -0.5152489207781856983977054971756484879653568168479201885425588841094788842469115325262329756 +(1 row) + +select log(0.99923, 4.58934e34); + log +--------------------- + -103611.55579544132 +(1 row) + +select log(1.000016, 8.452010e18); + log +-------------------- + 2723830.2877097365 +(1 row) + +select log(3.1954752e47, 9.4792021e-73); + log +------------------------------------------------------------------------------------- + -1.51613372350688302142917386143459361608600157692779164475351842333265418126982165 +(1 row) + +-- +-- Tests for scale() +-- +select scale(numeric 'NaN'); + scale +------- + +(1 row) + +select scale(numeric 'inf'); + scale +------- + +(1 row) + +select scale(NULL::numeric); + scale +------- + +(1 row) + +select scale(1.12); + scale +------- + 2 +(1 row) + +select scale(0); + scale +------- + 0 +(1 row) + +select scale(0.00); + scale +------- + 2 +(1 row) + +select scale(1.12345); + scale +------- + 5 +(1 row) + +select scale(110123.12475871856128); + scale +------- + 14 +(1 row) + +select scale(-1123.12471856128); + scale +------- + 11 +(1 row) + +select scale(-13.000000000000000); + scale +------- + 15 +(1 row) + +-- +-- Tests for min_scale() +-- +select min_scale(numeric 'NaN') is NULL; -- should be true + ?column? +---------- + t +(1 row) + +select min_scale(numeric 'inf') is NULL; -- should be true + ?column? +---------- + t +(1 row) + +select min_scale(0); -- no digits + min_scale +----------- + 0 +(1 row) + +select min_scale(0.00); -- no digits again + min_scale +----------- + 0 +(1 row) + +select min_scale(1.0); -- no scale + min_scale +----------- + 0 +(1 row) + +select min_scale(1.1); -- scale 1 + min_scale +----------- + 1 +(1 row) + +select min_scale(1.12); -- scale 2 + min_scale +----------- + 2 +(1 row) + +select min_scale(1.123); -- scale 3 + min_scale +----------- + 3 +(1 row) + +select min_scale(1.1234); -- scale 4, filled digit + min_scale +----------- + 4 +(1 row) + +select min_scale(1.12345); -- scale 5, 2 NDIGITS + min_scale +----------- + 5 +(1 row) + +select min_scale(1.1000); -- 1 pos in NDIGITS + min_scale +----------- + 1 +(1 row) + +select min_scale(1e100); -- very big number + min_scale +----------- + 0 +(1 row) + +-- +-- Tests for trim_scale() +-- +select trim_scale(numeric 'NaN'); + trim_scale +------------ + NaN +(1 row) + +select trim_scale(numeric 'inf'); + trim_scale +------------ + Infinity +(1 row) + +select trim_scale(1.120); + trim_scale +------------ + 1.12 +(1 row) + +select trim_scale(0); + trim_scale +------------ + 0 +(1 row) + +select trim_scale(0.00); + trim_scale +------------ + 0 +(1 row) + +select trim_scale(1.1234500); + trim_scale +------------ + 1.12345 +(1 row) + +select trim_scale(110123.12475871856128000); + trim_scale +----------------------- + 110123.12475871856128 +(1 row) + +select trim_scale(-1123.124718561280000000); + trim_scale +------------------- + -1123.12471856128 +(1 row) + +select trim_scale(-13.00000000000000000000); + trim_scale +------------ + -13 +(1 row) + +select trim_scale(1e100); + trim_scale +------------------------------------------------------------------------------------------------------- + 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +(1 row) + +-- +-- Tests for SUM() +-- +-- cases that need carry propagation +SELECT SUM(9999::numeric) FROM generate_series(1, 100000); + sum +----------- + 999900000 +(1 row) + +SELECT SUM((-9999)::numeric) FROM generate_series(1, 100000); + sum +------------ + -999900000 +(1 row) + +-- +-- Tests for GCD() +-- +SELECT a, b, gcd(a, b), gcd(a, -b), gcd(-b, a), gcd(-b, -a) +FROM (VALUES (0::numeric, 0::numeric), + (0::numeric, numeric 'NaN'), + (0::numeric, 46375::numeric), + (433125::numeric, 46375::numeric), + (43312.5::numeric, 4637.5::numeric), + (4331.250::numeric, 463.75000::numeric), + ('inf', '0'), + ('inf', '42'), + ('inf', 'inf') + ) AS v(a, b); + a | b | gcd | gcd | gcd | gcd +----------+-----------+---------+---------+---------+--------- + 0 | 0 | 0 | 0 | 0 | 0 + 0 | NaN | NaN | NaN | NaN | NaN + 0 | 46375 | 46375 | 46375 | 46375 | 46375 + 433125 | 46375 | 875 | 875 | 875 | 875 + 43312.5 | 4637.5 | 87.5 | 87.5 | 87.5 | 87.5 + 4331.250 | 463.75000 | 8.75000 | 8.75000 | 8.75000 | 8.75000 + Infinity | 0 | NaN | NaN | NaN | NaN + Infinity | 42 | NaN | NaN | NaN | NaN + Infinity | Infinity | NaN | NaN | NaN | NaN +(9 rows) + +-- +-- Tests for LCM() +-- +SELECT a,b, lcm(a, b), lcm(a, -b), lcm(-b, a), lcm(-b, -a) +FROM (VALUES (0::numeric, 0::numeric), + (0::numeric, numeric 'NaN'), + (0::numeric, 13272::numeric), + (13272::numeric, 13272::numeric), + (423282::numeric, 13272::numeric), + (42328.2::numeric, 1327.2::numeric), + (4232.820::numeric, 132.72000::numeric), + ('inf', '0'), + ('inf', '42'), + ('inf', 'inf') + ) AS v(a, b); + a | b | lcm | lcm | lcm | lcm +----------+-----------+--------------+--------------+--------------+-------------- + 0 | 0 | 0 | 0 | 0 | 0 + 0 | NaN | NaN | NaN | NaN | NaN + 0 | 13272 | 0 | 0 | 0 | 0 + 13272 | 13272 | 13272 | 13272 | 13272 | 13272 + 423282 | 13272 | 11851896 | 11851896 | 11851896 | 11851896 + 42328.2 | 1327.2 | 1185189.6 | 1185189.6 | 1185189.6 | 1185189.6 + 4232.820 | 132.72000 | 118518.96000 | 118518.96000 | 118518.96000 | 118518.96000 + Infinity | 0 | NaN | NaN | NaN | NaN + Infinity | 42 | NaN | NaN | NaN | NaN + Infinity | Infinity | NaN | NaN | NaN | NaN +(10 rows) + +SELECT lcm(9999 * (10::numeric)^131068 + (10::numeric^131068 - 1), 2); -- overflow +ERROR: value overflows numeric format +-- +-- Tests for factorial +-- +SELECT factorial(4); + factorial +----------- + 24 +(1 row) + +SELECT factorial(15); + factorial +--------------- + 1307674368000 +(1 row) + +SELECT factorial(100000); +ERROR: value overflows numeric format +SELECT factorial(0); + factorial +----------- + 1 +(1 row) + +SELECT factorial(-4); +ERROR: factorial of a negative number is undefined +-- +-- Tests for pg_lsn() +-- +SELECT pg_lsn(23783416::numeric); + pg_lsn +----------- + 0/16AE7F8 +(1 row) + +SELECT pg_lsn(0::numeric); + pg_lsn +-------- + 0/0 +(1 row) + +SELECT pg_lsn(18446744073709551615::numeric); + pg_lsn +------------------- + FFFFFFFF/FFFFFFFF +(1 row) + +SELECT pg_lsn(-1::numeric); +ERROR: pg_lsn out of range +SELECT pg_lsn(18446744073709551616::numeric); +ERROR: pg_lsn out of range +SELECT pg_lsn('NaN'::numeric); +ERROR: cannot convert NaN to pg_lsn diff --git a/src/test/singlenode_regress/expected/numeric_big.out b/src/test/singlenode_regress/expected/numeric_big.out new file mode 100644 index 00000000000..468c6026bcd --- /dev/null +++ b/src/test/singlenode_regress/expected/numeric_big.out @@ -0,0 +1,2082 @@ +-- ****************************** +-- * Test suite for the Postgres NUMERIC data type +-- ****************************** +-- Must drop tables created by short numeric test. +DROP TABLE num_data; +DROP TABLE num_exp_add; +DROP TABLE num_exp_sub; +DROP TABLE num_exp_div; +DROP TABLE num_exp_mul; +DROP TABLE num_exp_sqrt; +DROP TABLE num_exp_ln; +DROP TABLE num_exp_log10; +DROP TABLE num_exp_power_10_ln; +DROP TABLE num_result; +CREATE TABLE num_data (id int4, val numeric(1000,800)); +CREATE TABLE num_exp_add (id1 int4, id2 int4, expected numeric(1000,800)); +CREATE TABLE num_exp_sub (id1 int4, id2 int4, expected numeric(1000,800)); +CREATE TABLE num_exp_div (id1 int4, id2 int4, expected numeric(1000,800)); +CREATE TABLE num_exp_mul (id1 int4, id2 int4, expected numeric(1000,800)); +CREATE TABLE num_exp_sqrt (id int4, expected numeric(1000,800)); +CREATE TABLE num_exp_ln (id int4, expected numeric(1000,800)); +CREATE TABLE num_exp_log10 (id int4, expected numeric(1000,800)); +CREATE TABLE num_exp_power_10_ln (id int4, expected numeric(1000,800)); +CREATE TABLE num_result (id1 int4, id2 int4, result numeric(1000,800)); +-- ****************************** +-- * The following EXPECTED results are computed by bc(1) +-- * with a scale of 1000 +-- ****************************** +BEGIN TRANSACTION; +INSERT INTO num_exp_add VALUES (0,0,'0'); +INSERT INTO num_exp_sub VALUES (0,0,'0'); +INSERT INTO num_exp_mul VALUES (0,0,'0'); +INSERT INTO num_exp_div VALUES (0,0,'NaN'); +INSERT INTO num_exp_add VALUES (0,1,'85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (0,1,'-85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (0,1,'0'); +INSERT INTO num_exp_div VALUES (0,1,'0'); +INSERT INTO num_exp_add VALUES (0,2,'-994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (0,2,'994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (0,2,'0'); +INSERT INTO num_exp_div VALUES (0,2,'0'); +INSERT INTO num_exp_add VALUES (0,3,'-60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (0,3,'60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (0,3,'0'); +INSERT INTO num_exp_div VALUES (0,3,'0'); +INSERT INTO num_exp_add VALUES (0,4,'5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (0,4,'-5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (0,4,'0'); +INSERT INTO num_exp_div VALUES (0,4,'0'); +INSERT INTO num_exp_add VALUES (0,5,'-652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (0,5,'652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (0,5,'0'); +INSERT INTO num_exp_div VALUES (0,5,'0'); +INSERT INTO num_exp_add VALUES (0,6,'.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_sub VALUES (0,6,'-.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_mul VALUES (0,6,'0'); +INSERT INTO num_exp_div VALUES (0,6,'0'); +INSERT INTO num_exp_add VALUES (0,7,'-818934540071845742'); +INSERT INTO num_exp_sub VALUES (0,7,'818934540071845742'); +INSERT INTO num_exp_mul VALUES (0,7,'0'); +INSERT INTO num_exp_div VALUES (0,7,'0'); +INSERT INTO num_exp_add VALUES (0,8,'8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_sub VALUES (0,8,'-8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (0,8,'0'); +INSERT INTO num_exp_div VALUES (0,8,'0'); +INSERT INTO num_exp_add VALUES (0,9,'54863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (0,9,'-54863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (0,9,'0'); +INSERT INTO num_exp_div VALUES (0,9,'0'); +INSERT INTO num_exp_add VALUES (1,0,'85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (1,0,'85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,0,'0'); +INSERT INTO num_exp_div VALUES (1,0,'NaN'); +INSERT INTO num_exp_add VALUES (1,1,'170486.79080049955252152479695727201571965474311716541919780029226071455736587237347615553466832461907447637054203186991790701615551214692555785671028648640897898741246882118067609728317430043806625387779037980513762118868084887015059202190301421555269486602797852927777567694581746398790609996101506730430853942556475840126871131898407356048450541232591147357021858041662012293323494543567675306406079659294204054863522259037763051870433216859794083051717080761509518250300466106939998045710070'); +INSERT INTO num_exp_sub VALUES (1,1,'0'); +INSERT INTO num_exp_mul VALUES (1,1,'7266436459.363324713115467666113895787027372854351303425444968800459979742082292257107107767894843498525848597439323325297125474674300428669958003640228730876886174255457103020291514229439701871032118057857763809224712818579091741996335014138185389554630910658876423205103697147288306070059640369158894028731728589073730895396494400175420670713113234800826523252075036892246807434088405522834549449664122407363485486902219500109237667016524913027290777216477989904700729228025571098410870506256758678625928245828210775042611512394316804583459576285681159178280400209217948833631961377519855502763611693070238579591463373484424582723121059964236704135695706864890193388054537703767833595331866551990460050750959493829603581882430597105627056085260296454181999581594565113210481151487049158699087454047624433576922179904629'); +INSERT INTO num_exp_div VALUES (1,1,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (1,2,'-994877526002806872754342148663997.64812998474240514147207095573950146764154822009863493316394610578375247334825932838513167168342610420582834742950389452212867974756590355021495169819086060202117180229196935525386766373096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (1,2,'994877526002806872754342148834484.43893048429492666626902822775522112238466538551783273345620682034111834572173548391979999630250058057637037929942180153828419189449146140692523818459983958943364062347264545253704196416903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,2,'-84806738323879544552397401815149740513.8505875535743013876823142649666132764556588225959336097903898464616542203793600590311980154402068027051522932586050753865288419084437796768749509032177577451738712965496693249429231838833655025794915864261585848007162358912070811805298210095333433397862313304655108809804359760907473898420016370058274978588765092161529583480924554820756527238472641797198545539410039895140087686344382628317530286295498797849942258314364503000942821309916954725689781458590617068629906894951122301020797266469357701283289275708774593896770378558232444454118891917258610753077932026885574920166837998049508644891327208474213193224700658584824407382455480657734911543930195324144216374573825'); +INSERT INTO num_exp_div VALUES (1,2,'-.000000000000000000000000000085682300757901809257711279577127388124986344391495296640171942990079130291883279872719240502687189411421655284515420074848478500192127657883342858267913417679786356766341637336955924836847768457039175660279784295612167899455618405343686908907695358239088351870495830739180518509859269437015797489301844593920484927630172344269378248455657186218762679357609204333669024237648538465053048724383898528808961206696787294681884412485427843796696788390072124570957047672341581447744981862017791206857428430183366004980966398716823512288330174863890117558744630102020144500158878244146399686532935435591262767487823942606452349972401012308378888947381934278131785907155692007064636085000405504866631011593239041758448995933095907216863744502344014999804306234830774259496097549717476344048'); +INSERT INTO num_exp_add VALUES (1,3,'-60302029489319384367663884408085672236.83687099063256754698860828386302509843815398979402006244388708674093244201278399438376682321121138429850885935540924586964982855913223221441591310211730902799041126800414795030815514254713522692405212716783388698431088814919226444677188004928663343696636297536500970117716818423689175692808344185016908913828066250587407384563498516598672584120143890364303296142744031320345312431817858545326010704685255237541162931904446804064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (1,3,'60302029489319384367663884408085842723.62767149018508907178556555587874475318127115521321786273614780129829831438626014991843514783028586066905089122532715288580534070605779007112619958852628801540288008918482404759132944298520148080184250697297150817299173701934285646867489426483932830299434150464278537812298564822479785688909850915447762856384542090714278516461905872647123125352735037721325154184406043613668806975385533851732090363979459292404685190942209855935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,3,'-5140349743195574373979577554212527512597024.162480344833040409158673429491690439298506850052285119390701002577176786023622062742050099464897084793357329597395417632908812044304066963549928478520702505283307379218587635434673128958824348493758429380623577527186462464399974242800361134191519694694139153279582776168995426125926314513926640766117733774558011741611075336271613675760116784769700605008122422944290652448956922432960815546502965310676913079866511016221573557684245901002643719965652152439520727383305120298495304784052489867651462175349450610643411043707261107569691076730261762793560088893354750383257372118118753366377402045596735023445172252225346164608897913115394905485106225627590643805003075069931177395059698550161546962768768895596088478488887530518018212441345360153523733317120037436403475909117998647781920105313938836144009539683'); +INSERT INTO num_exp_div VALUES (1,3,'-.000000000000000000000000000000001413607404628860353773457807436398753936801768769045711604884548436548520368932184112069166807060840219636509423284498981041814526856251281381511288768719259120481595036745286884246627534964287523188738499223075292690431699417313258943941279343383979626641848305343592679057491670166887054819766294147341982669243114259272404203080347707713358471397866402657818267495050115642987782080912962056565478445923456884713049272637646637760989004917643369240372476411912794578381690666695711891846833983534126217706309741885844723208036219144146342212915129560758201609824034610223907791643110990898577049488934294259106725414517181607988173722432655731491050637087261030314548853334338835938120502930424813699221083197863303458179445322810087784892821862085562891180364134284641396475'); +INSERT INTO num_exp_add VALUES (1,4,'5329378275943663322300488.64471790965256505869684245785528331091076155554650629138833809683459634328609777839510066435612911583108717191216693735823717997111970662575497378762952496582183738308720094529950793570383580785385569873278068217936841324404119828637880370718028782103860007754579779716996004352284614661690063919125301052941328989181561787543541920734755989452320799185700078241880935083616978140555713297241612718277766918005268951861880490889884082730841740604517529391011862694381726143520658746305661338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (1,4,'-5329378275943663322130001.85391741010004353389988518583956365616764439012730849109607738227723047091262162286043233973705463946054514004224903034208166782419414876904468730122054597840936856190652484801633363526576955397606531892764306099068756437389060626447578949162759295501062154826802212022414257953494004665588557188694447110384853149054690655645134564686305448219729651828678220200218922790293483596988037990835533058983562863141746692824117439019450865871047657552800448629502344444081260036580660700595591338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (1,4,'454294299613767152878025320780.534199313974295807138790763501115780294529340799108297697573066187975311338382917022391830256203305238757334106943821060545424417350991354829668286194840925251162479496893943917530660694097932059166013476064988623431110002057735318529554555260199417935495388243829261809007709919225000608711536928171687251088217591210419208480251102484043683131687013687838713055660405381318396419588727500715930145098362997142075433472039319292466570912777345841400769387321465602989947078951135489852486382469990409873227894248208197179481868230244584527040573428134962626267135732247029762468417273891700661832893497067151409134724061246612631376075173287264787886064622106855886785805818642123776489793586531950438285720668411465570116161790343538663297713926678759640594912243360541590368666922379919514826022141331900181'); +INSERT INTO num_exp_div VALUES (1,4,'.000000000000000000015994998100440878014888861029956505927201309704413242103407885948184870841766875212766910686894450511886242468216220470061916924303252919423028993720180330014505454865704155281502763018913215741264982350384245753394656021401865680441649920273268554396350483440173848850052788410943178207336328451359951614056237100465802151856198860908371340425459435127133071447273887829397881221098443685586506647314622864702873235212396755866459409263439958011711379929751157260020133239574261188528305921244365838405372320186907437842180388704854605498842516581811515413843298370501194935797268161171428747542997504369133579105180311662221854071962295818264211400101689450830279979372422749150894553349570063000769685274875561760334738424509532610467832951796852051505383374693614022043010735004494395190'); +INSERT INTO num_exp_add VALUES (1,5,'-652670387.03916046850422757312745971450663862747133703839829692066597367760104802542475264601221776157515632293978442027199108085723617181683235487266149426304575903892721468296143475297345699313102262188759506518376019936160961709578829069446312051432780603656651983414612264636232727512091101057374054475214114364113300402823059519499217878746766275164739724770556122895799337810694888119810524986616938847385753562624139431982468828696587199570410008890188532132652095915565323400735066310142303225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (1,5,'652840873.82996096805674909792441698652235828221445420381749472095823439215841389779822880154688608619423079931032645214190898787339168396375791272937178074945473802633968350414211085025663129356908887576538544498889782055029046596593888271636613472988050090259449836342389832330814473910881711053475561205644968306669776242949930651397625234795216816397330872127577980937461350104018382663378200293023018506679957617487661691020231880567020416430204091941905612894161614165865789507675064355852373225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (1,5,'-55643106304872.575994253221940844841058071061962511162776681458310912066379595519265546225338405882027547140476045378015935579066580347282075024392379464189067155567624835346798806677988850250198082355055954078446421075165109896091047534711081616362392995575466807084807876544560268050611445006601394735810211678919646667455478469014906335433468365011768049600750224822391684377238242162320161552720449713229523135506671063115436813348612986916614320012995541575293478341408982118538094438068036422562665160411591652618670802973618768526197813319204816293073794413317669922144705633308090832805914096147659820167569140291210526520361556881576175809360614782817717579318298657744021133210954279487777567785280633309576696708168342539425395482429923273623865667723482418178781573723597156804085501875735112311466228778929147929'); +INSERT INTO num_exp_div VALUES (1,5,'-.000130590057635351941758745900947472461593749814351229292370661147301124533787181489468804246182606762727711479707901680546780430454163647774077629503207962424213266902732555945190365467801995495570282501722505521485829885605904543846887348545254658726343578684749830307120625129857380290225370772763609458975555029415082569247186899112975387051141777417911244576134390940441209829852154391377911942082738699481875795620569383196133124499983396562167632007454221121465745085962247988140942672429187053671899537331280701003778040796615094903602095098880716919238394057384949891444700347825726273725378453454782330181608182747900774711384845635284701538541452235224216112380245660177463043471814071809869894647262285332580556739424040615194137651616350340752691170045698234853734471923738591898290468792787543896'); +INSERT INTO num_exp_add VALUES (1,6,'85243.44233732197133191329295927531563604777955507322414928382967007765263923984471408038635831036097817458527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (1,6,'85243.34846317758118961150399799670008360696356209219504851646259063690472663252876207514831001425809630178527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,6,'4001.075404054519813215296429095020391062109905613738157927030437221793757373268325953178030040276107574363822832168160758728653712686313134828282109532831190239521843808940611025488601517574653932032236616573457735900045655665690517797280666732780030171712864961531623060353548802466577910774711998056232872212688464691036260746751992072745518373073825852119460094113694393273456369345499434994672730920070410547163082189385645712866100999708173472360864669110044660667614583576570496399103026286828660558854973376227247132815728164629722965145778698957093136175449225024685874279280018547740'); +INSERT INTO num_exp_div VALUES (1,6,'1816120.848909727306817960620941575637231136442992819290405125420545200026620306446043740992108329883383706060582482495616151605111275635501481354526017831484915013545483361715432312183101964395505340188909970344423950565285639911521082834494088840596716495422427543520536844348040681236845850482165744696068209384509064196671206362539077218412355776790921130042376467606683622970728503408501481791356294886150690067651815776445750760428874351556866105285911902433352126498951242195408782804314174041618879250740246352525074791310920062276490422853700893340860452528740673590486626464460321410814395342850270921486724297414692313177440726749004398703147904603937755702369682956482832074779404350351752662820773690162594400557957241676636030332988289683112176900913522668426137377289536793838959751008646843014106876005'); +INSERT INTO num_exp_add VALUES (1,7,'-818934540071760498.60459975022373923760152136399214017262844141729040109985386964272131706381326192223266583769046276181472898406504104649192224392653722107164485675679551050629376558940966195135841284978096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (1,7,'818934540071930985.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,7,'-69808760806266041400340.70700818693892852138813934414383886494691670042143650609934777814995087699409404201920249076407981012095999320858479644760715204999741683528746097757549835956359129287002171391961763797857794730120426599135099619822532290339000466211195776337667123320942107370731349851576864242697412616810236323676004067839744992733887503405311090677026008324895177587064547630828026123718296429295638934384446325302964896473296829265805737112709269803814942537657996725913938408781715328945194948010970'); +INSERT INTO num_exp_div VALUES (1,7,'-.000000000000104090609479936344103210175655521317012597986331111866307697262848964666360492361638117930801818899121383806224630563676018240181412174154250663423230239912527388431901852952893943812666142740182651125508583527237123596541789628675379232473721293630968882045044077795828674268595016625198802475186587918019739056755398151182369187670251750080227679555002307777300392769289647975058449905106584837938556260801229545589323224752038795423164214112897202147313792076165011373139219134850954217300915326944185918762838321705825423789073869940092569940135329697980600082436317664012683589681419530904283106912171330819469065141821685734295058255484933744156717782754922568796985634397878149984177882018261742637463462647452140104146195353696596211873925359508622779658904411330975862442989437933211964821'); +INSERT INTO num_exp_add VALUES (1,8,'8497071467.03603749330791582407836434318377133169438097066269854720538319012928851657498035372443556191720308219530866834905045144302106406146277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (1,8,'-8496900980.24523699375539429928140707116805167695126380524350074691312247557192264420150419818976723729812860582476663647913254442686555191453722107164485675679551050629376558940966195135841284978096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_mul VALUES (1,8,'724311956372274.0135050255361637906710330203036651743488213007179039756514944640108625580172737414192938789413338554327986697518463087452612658955180411327002900979574347739956600177846996063741787205122007268468674386396156638261992679442768654367111433834151087792255469957061758837789341439211010331332174981459471333376067541234901538285101103690622656631026001337239036711179989456674399137008584021283568040818388709554256523118702728176420022080138548890713013682480239784198421500241995499841675772793497485550923152267616622892846304530712344886979674416990935007952941652591352603797627920865960622077762568060903908151958000'); +INSERT INTO num_exp_div VALUES (1,8,'.000010032191786198542900505683562217892317481076466949299850809276743457759270150820565375820388277409258249926696079166209409657808406245382887790534127749833677458375931047385994887406206232330491317602830654688957983804698568410728278089250379255157030886262396950539100566975000094268415749476738358914633948867977798590927055566888255636132486899287919515638902721543629183577900872078173883974905921239149419877613723476347774771230668479296621531969573505480695490386225866950545725121902534610730154727385072738079149623798073810167706094070842646222833137345669922898403368997676634709281456818189049718956207208697021706186341405575300648248555331280690778367620868775005181264547924615247991795542738868003191757946979714250339430363902549866892041102771965653407197094250270379367437342632741280710'); +INSERT INTO num_exp_add VALUES (1,9,'54948723.74225051983134098996071145685528795757427462111901537365053896571438476055974853245403475510333627298551845046116291696445177112567064282766115207407461565363967417615506303416694032848457927390574251904212425813072768882213388082765916956736282110801611726537663292922699021333445658549608928179155685881583228490235606377831724593358583903616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (1,9,'-54778236.95145002027881946516375418483956830283115745569981757335827825115701888818627237691936643048426179661497641859124500994829625897874508497095086558766563666622720535497438693688376602804651302002795213923698663694204683995198328880575615535181012624198813873609885725228117274934655048553507421448724831939026752650108735245933317237310133362383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_mul VALUES (1,9,'4676749348240.390309875431213992853550297086049749814750492488995108783145961719774217441193547534210468967573344456866203963659951312519988497979489304488948342258375915152429008993288817366720647491166024151209542534474867042837694499222928509320280684557676243780452100132238968233413333851595648146954975713386711764268506890884764704949969602122157394714663532141060559896359465918874990769222345665160127552795532197771168442486088776803398878354288847069602460071745966589164282641033852314335279121191855487126430176047553895892632834940595958394834437871886013513058514896870683979585091413977173250824451205330441299000850618134248917380244749589254309567551846327349592529960432446947239714236828401206843011440433362544797025114476612133622499094287321570559088587999417440664282418005102546343020409520421747216'); +INSERT INTO num_exp_div VALUES (1,9,'.001553736563217204408368240901181555234014339476186598647410198373122572205209277343865051610898136462487966496673511261433286284257044548634547569923035899634327495195510767312478861719221916387940027268721306540663743713345337497285507595251328382906111997524508729275471287648008479480805967901972481289402930660848950039779707354469389216931774094174326513465502460315792834278614886136688161679443873815113442220055827192996984074129528034845339130162104547166079591654852164993577408422015514100323825529286511720963047269483211930770803479398243069649400360625259869765138545866815758888670363356947311319523139395191102286838888146829667276592755438606664644975648828848738708349790766370694194763606850690923803984129157519048493985198591771429264967247245289970213262206709011468289046840862597010969'); +INSERT INTO num_exp_add VALUES (2,0,'-994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (2,0,'-994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (2,0,'0'); +INSERT INTO num_exp_div VALUES (2,0,'NaN'); +INSERT INTO num_exp_add VALUES (2,1,'-994877526002806872754342148663997.64812998474240514147207095573950146764154822009863493316394610578375247334825932838513167168342610420582834742950389452212867974756590355021495169819086060202117180229196935525386766373096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (2,1,'-994877526002806872754342148834484.43893048429492666626902822775522112238466538551783273345620682034111834572173548391979999630250058057637037929942180153828419189449146140692523818459983958943364062347264545253704196416903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (2,1,'-84806738323879544552397401815149740513.8505875535743013876823142649666132764556588225959336097903898464616542203793600590311980154402068027051522932586050753865288419084437796768749509032177577451738712965496693249429231838833655025794915864261585848007162358912070811805298210095333433397862313304655108809804359760907473898420016370058274978588765092161529583480924554820756527238472641797198545539410039895140087686344382628317530286295498797849942258314364503000942821309916954725689781458590617068629906894951122301020797266469357701283289275708774593896770378558232444454118891917258610753077932026885574920166837998049508644891327208474213193224700658584824407382455480657734911543930195324144216374573825'); +INSERT INTO num_exp_div VALUES (2,1,'-11671021799770914903865020509.301561107153561058074179843542446420696517132461554451075945807420674211966679216615407057626541711186781735967334896541890595771915856783008831770988426637435694856170266346306640678577376310547806764332837625966429200996250687908930748245035578756314083608655163891041399241377675534416837659335561005203219889972336214863417948542956735403991871098341470996860469878038840964359144637726669728240650066795729910649523281308716277906908340457162235831526838308777581569974551673352306004330423694524256415657620427590352277556907586751621496248973165690360552007637570957980230685679819820147036159174977086193494572117089582758015847544798464543446227632367713941117001423437766840744488426025388612316819120660814681298624293065972395923651314350558006567251033289878238407790871784676348196394482477767774'); +INSERT INTO num_exp_add VALUES (2,2,'-1989755052005613745508684297498482.08706046903733180774109918349472259002621360561646766662015292612487081906999481230493166798592668478219872672892569606041287164205736495714018988279070019145481242576461480779090962790'); +INSERT INTO num_exp_sub VALUES (2,2,'0'); +INSERT INTO num_exp_mul VALUES (2,2,'989781291745465665243281323944996915810556285052564220274237162526.1617859904902612197894543199389468971679632139059029459520163585971122643624316475417489000981872666677202334180945949860058384424993911721081868337499377890298636260338063268639283065887210924895929155083478140340889209440025415565915964293989840603863813531303253038823629712989041722072693449251635519992922148998556112923060331794396659338057474019846675262291146025'); +INSERT INTO num_exp_div VALUES (2,2,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (2,3,'-60303024366845387174536638750234506721.2758014749274942132576365116182462208228193753118527959000939070820507877345194783035668195137119648748792386548310474079340204536236936213411512867171486174240518914767934028451971067161683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (2,3,'60301034611793381560791130065937008239.1887410058901624055165373281235236307966057696953851292799409809571799686645246659986351515277852800926805119259053513475211488115663286642009614039264484259692394657121785950542874788161683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (2,3,'59993133911282372667149627097418449223835595194300848703012380022306762.154418449236691515146061305380465061074531890529497774836941002526095632166401249277270674802626154774328055399254982998368191676630276960361274433270795772477146870294928855773172789856196219950097157391050424577381777627004101100872747943673762087675405200265837631665464736842180920496158545887039337399558993437594084473932658319914390365451919627956823980800124880375978662052111797881386060353490432427832058851094210488804887183034572364751639107535041308434932952695103493677600969712634416241541391613699710826602011076372592299807609658979777598672141389319098817824624950794758296679318319299142035'); +INSERT INTO num_exp_div VALUES (2,3,'.000016498242835741013709859217005931279826178662180173096568520102488480129191427472581644597420895622947234184547373944996197105916093347103336318249582032230903680989710242610024298937774441533502282949127537125997753002819456724709929935850697744632904111143787011103837624936502324835260843148595669524694347566421203164808527739207590986975750648112133699756328511947175496694080071202064255118777680958612315513441989609682655431197367166056616661045712867189326408877133865572680407329449150282415810958772293869902662884761202424695742898573841869524376684740249281181605067345203479719345061595919652192297531638467223956758315591610733251562492794891852151639643060692698365496208796638230566761231611376199140556503620471090364900792180618741355091923808605890415081571900697282725022629812561702118'); +INSERT INTO num_exp_add VALUES (2,4,'-994877520673428596810678826533995.79421257464236160757218576989993781147390382997132644206786872350652200243563770552469933194637146474528320738725486418004701192337175478117026439697031462361180324038544450723753402846519731908503949116978812841497201119103409772457270340059605961197538918709309004130294868847110690336360689446090125918336908930881873778405661757289469281163974774492810850778950071063044769131228124355961427111369335109426492177657001035045332525699055300921341010989742896430768506909949340276549373661076950964959025967328861569387160956730002517417236732463510495205173523163676450203614971844583064927040066684531931069310935516821795449174271052747559395296525950219449541557191520903507653089998307641491381797101485104546410643'); +INSERT INTO num_exp_sub VALUES (2,4,'-994877531332185148698005470964486.29284789439497020016891341359478477855230977564514122455228420261834881663435710678023233603955522003691551934167083188036585971868561017596992548582038556784300918537917030055337559943480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (2,4,'-5302078674303935968062773235453828254014583744527466365136.236414807326868572353809920518232561005161225922028750078608989965741402418802255050636954800114792425419735155504035469350521800895164087027043476055514245942961100610551646034472084954313670284875310691807937254054948742125729353864014122131419164449567115006621212424805182687707372956385102095255735458593389920872596796806885847543910224476727171570873698525606016990229936284811067826588349092841322512643043008589065847223683467371925773023109720951609815041012521485326120380123169545818055967455575736140138663815073081494226676896278654189873597341203197903408668523514375373841493189836809506003729379742035629498519683885268256481104619815130659628225053833297766479068686119691010593208135616363994230674606991733148502293102108193522604968743948323130517040609601859735899914987426089053869350663'); +INSERT INTO num_exp_div VALUES (2,4,'-186677971.517539861245390308778107722315862721823627804195528485535806132067679059453022306691281662574091826898288146790399178357754908901382135796783067563944022498807930452234032896817601590728156392188660701355670595952594500812333935362955625137944589981298793332621503315902294100258945995827423279442031218510259915311555745581797315793010762585658196457363672908315687720174516274528662385172326028870945153551774300419158584379602045442200523311437013776079979639415633358878239012925000523542907592866797199229858272764668664323316251874027468128770456766875866492004650352654523634716923150212263912760225390093339729495231675627059805624175587380165509763048913150826017167286786277908970769297060278191518730887417202276531151575412404467497036737825989088867451153485938272367300939127313445244028528055624'); +INSERT INTO num_exp_add VALUES (2,5,'-994877526002806872754342801504871.47809095279915423939648794226185974985600242391612965412218049794216637114648812993201775787765690351615479957141288239552036371132381627958673244764559862836085530643408020551049895730005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (2,5,'-994877526002806872754341495993610.60896951623817756834461124123286284017021118170033801249797242818270444792350668237291391010826978126604392715751281366489250793073354867755345743514510156309395711933053460228041067059994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (2,5,'649411906691138274293985410502516861224852.2323455192714410716272307781034189160865613770320102043319541634113746032638191509585045862973333645830298922352816245477556264222094036953195419857712804755170632292914187367964994214922001758104594052499795564860466055599417895782179851297585155129541589802249540436678824225950907268084876110445460948679383611117263673106597132046331719468816839434908155684738864149955129235751738204036443603521478609787295079710078973503970964790273461142497259987849074597264522099648376356902360358310245001183020992360260836105404118742418040965190000718736837422434593694808973939805954329718232693154128543253581495885789333274488461716809104532693754070810202831113003978085636579574171344721710232931261731022478029314435363413498991740750878099825781577297965642009156858479681236085226911858782115'); +INSERT INTO num_exp_div VALUES (2,5,'1524119409495532727030986.638577103454261465522025182901477334004986357902177024959076085490119358611626688213654669281670407680244740174673394111775678935383154847014211641601227316639834450258566053805263858706381900273201146454036688771735398324537667996974210741719621449948660517037619359095556637235980122706739013220201060795557114248610410815988952748489854367480813823114296393315170621979351958306734282429929421779129764262568942699813166237466796852578307944635545174715298176546980314973426586923195248536376403319094417073026382024413817222396402299695717290716014320518777088811749776114378145110676170242861393274018655137797545194817703831240390631723050378397773341835222892981773205967439339460305257986693600088957772328044922955990976285151896366292514128607363007421484320868718566256882080399264346243272770200676'); +INSERT INTO num_exp_add VALUES (2,6,'-994877526002806872754342148749240.99659316232359475297606895243958507460511031229368344962653674268847910587702140353344168594152240599109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (2,6,'-994877526002806872754342148749241.09046730671373705476503023105513751542110329332278421699361618343639171319297340877148998204440427879109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (2,6,'-46696638263247522384986521136500.479312417066793299922708112595886608370451213741279484136907754744903470430131032928908162742687359367826808123516519335458861613010646992354378739165872253762686683966945711430182491860196341344982195078000259063231136011430995647812149294224699587849791008794261026932467933475782780'); +INSERT INTO num_exp_div VALUES (2,6,'-21195986018643887410662481595901800.342199657994285865579781485758715114242459388977583220756870314514884887803267837816669111279417861218648323488364513921592045485003563036021370174294475403630933854767386355037781881144701319212711655881277140183173924089814927297045029394618083349813549439341772734606115369911736164723942330187830605893993276674913563980890459604886172701331890746621222114280438198802989678877404376001410627722336243835841751052795437979198996482216031399073597399901975686733315751292369326904428230195579137225651689857057115970784985439417129044974524632220457594191305254649113470116960582543784928547885740020507755033347968928034294570497118410435615856155184563329718831512839630769097935523279881940380220955993456451396417879773380305142918906742431812580562496634831735169817705720949712410595406012323294829461'); +INSERT INTO num_exp_add VALUES (2,7,'-994877526002807691688882220594983.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (2,7,'-994877526002806053819802076903499.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (2,7,'814739569184924399102711674444306584731316176345067.39834031417849342571224916231092924046722938910652929295271097903377854123984307101079073134405782275535446337229706620713104545454319555885847481531722101704765783025789147453570970090'); +INSERT INTO num_exp_div VALUES (2,7,'1214843772391778.127361407585140553741220126410637250571020684739034685508176000812180032686291124045768750332493129822580347351032145964983629059968936201592138368806173099130176852606440296388856520582890650384142745607345709716826703676313341953999327129144154152914234659001555055379537780751567782847296067128932113870102563522810980359433259696591977617184951677390423898232135100000764121508662830515405980450892222598485287609657612482190264517684867291774820716746063133066053446257163185646067618679478975882247893469409405379034723543061767846895135644429012095930584952053545016706315299076691015196261253199176743281648949731423486208098120903720124071047872917636988241710583721537777321338769039241700203546247947405745989053846970910400831817998342969657501678430211657755864160072525313889413731419647001970593'); +INSERT INTO num_exp_add VALUES (2,8,'-994877526002806872754333651763017.40289299098701084219066388457144979069028441485513418625082363021182982914675513019536443438529749838106171095037135009526312783302868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (2,8,'-994877526002806872754350645735464.68416747805032096555043529892327279933592919076133348036932929591304098992323968210956723360062918640113701577855434596514974380902868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (2,8,'-8453460632655529853033389979024265783461224.3195241893307807116624750282852146303290708492834695194274289713076935297734670940696121761483641291930931061232942894577813178566088927221374036301485916497770984757492912292002695944367308880163698595015497307574177176409203214324418237020500352652934909632442547242092296504047310806151851207329042221920888326000'); +INSERT INTO num_exp_div VALUES (2,8,'-117085929036205907700251.219065234073336548829793284434494573185718678644093751558890746941383215425734761534822966779511801033216479269605150574332107020180872343673157350081102818832254463561564431056604957702984438484261858890324442581609284935850435611342611117035589511568432559140282381526487115307554496353616929034919886387903446436924514812698404129456069856633480965357915969548215985452939172313964007318881987188665231550330515412104367728617802960792164260429920719961650164518261501571220901151359208484337831586551714193024143212288426326740373893030225940355268499071669300664200888186064836443459131985786957267268845966279576380786883200277187591448294590370986026461176853573555996139940001165172158855197070946665074838360933025833716166930231164328918316437195201546383664484983447934244744303265471044295601062898'); +INSERT INTO num_exp_add VALUES (2,9,'-994877526002806872754342093885760.69667996446358567630831677089993316481039076439881735980566785462673358516198695146576524119916430759085192883825888457383242076882081857926408611052522393579396644731758241837010163568445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_sub VALUES (2,9,'-994877526002806872754342203612721.39038050457374613143278241259478942521582284121765030681448507149813723390800786083916642678676237719134679789066681148658045087323654637787610377226547625566084597844703238942080799221554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (2,9,'-54582443595378013373024060492546032003692.4875677735896411267274323339692558458420972958075073392126734000341372096298914875892612108329218081214550050039133117695428196702128258481789017059073444323729583900855712795086447886053552786449313809589992185978097430132940882612817775035217244553616977182049775786664446683332098226841743818600819221587510039430478859412452506872131851471967577741190323481953867845129745440745526578327709351120432530702446916035797432129052518980799424635406993848916727957825620638983706180841278402925286540375225365057191075559133035'); +INSERT INTO num_exp_div VALUES (2,9,'-18133693300409132895168796.074616314168631402221003009151140409826855230810646429042722071403306917323628118792142878282108022292754325022530103525285999179488507720688317761243448898240836430183645778132937666952111134601563043980164547020295727057908447220163534134835130866457657964382363853570827467081988390359191484798677813656413640874450449802233520570178139244957518604566383671867773821069602665918688868868894979351219381089954104823746091972754649316823714354000113723793845707472924569647945844436702275724514171940901057842455729977729388911537391920702753167125695758365521631000334183494148229356487592577177344247694925635113222720411958290166668659311154664393442690740373285505786584987609789805525300762074682544164213490532272590665630428583216403362629445153016404037983825555019274338559686335405719430737559715778'); +INSERT INTO num_exp_add VALUES (3,0,'-60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,0,'-60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,0,'0'); +INSERT INTO num_exp_div VALUES (3,0,'NaN'); +INSERT INTO num_exp_add VALUES (3,1,'-60302029489319384367663884408085672236.83687099063256754698860828386302509843815398979402006244388708674093244201278399438376682321121138429850885935540924586964982855913223221441591310211730902799041126800414795030815514254713522692405212716783388698431088814919226444677188004928663343696636297536500970117716818423689175692808344185016908913828066250587407384563498516598672584120143890364303296142744031320345312431817858545326010704685255237541162931904446804064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (3,1,'-60302029489319384367663884408085842723.62767149018508907178556555587874475318127115521321786273614780129829831438626014991843514783028586066905089122532715288580534070605779007112619958852628801540288008918482404759132944298520148080184250697297150817299173701934285646867489426483932830299434150464278537812298564822479785688909850915447762856384542090714278516461905872647123125352735037721325154184406043613668806975385533851732090363979459292404685190942209855935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (3,1,'-5140349743195574373979577554212527512597024.162480344833040409158673429491690439298506850052285119390701002577176786023622062742050099464897084793357329597395417632908812044304066963549928478520702505283307379218587635434673128958824348493758429380623577527186462464399974242800361134191519694694139153279582776168995426125926314513926640766117733774558011741611075336271613675760116784769700605008122422944290652448956922432960815546502965310676913079866511016221573557684245901002643719965652152439520727383305120298495304784052489867651462175349450610643411043707261107569691076730261762793560088893354750383257372118118753366377402045596735023445172252225346164608897913115394905485106225627590643805003075069931177395059698550161546962768768895596088478488887530518018212441345360153523733317120037436403475909117998647781920105313938836144009539683'); +INSERT INTO num_exp_div VALUES (3,1,'-707409990019504668223608170643582.082425157530076679823177950190511141917761066423266390864536360056345386873500583953954967225431526056199231768143978526582904071798714789552447782850723926323452633811653766838064983821149041415149067433978085927687765773012158659685363079191901396502099956189371719135315616249471739677995520904113581848295732911534266040260836644379296158092198514963023001686666281725991605685524015227112003429486755206848316731257322742428352116058878710728614841247581716185886403744830796740424927494009978599974431617064012221450054532987372285996679180090592706458366967534834069977644215413076082570497451654516268857039718730203921980307096740864747006176117071983875364434497517026142488015705391255750729200497229031250705777282987863242056223584453312226818451807347197583925624299372040413470456696588043062815'); +INSERT INTO num_exp_add VALUES (3,2,'-60303024366845387174536638750234506721.2758014749274942132576365116182462208228193753118527959000939070820507877345194783035668195137119648748792386548310474079340204536236936213411512867171486174240518914767934028451971067161683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,2,'-60301034611793381560791130065937008239.1887410058901624055165373281235236307966057696953851292799409809571799686645246659986351515277852800926805119259053513475211488115663286642009614039264484259692394657121785950542874788161683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,2,'59993133911282372667149627097418449223835595194300848703012380022306762.154418449236691515146061305380465061074531890529497774836941002526095632166401249277270674802626154774328055399254982998368191676630276960361274433270795772477146870294928855773172789856196219950097157391050424577381777627004101100872747943673762087675405200265837631665464736842180920496158545887039337399558993437594084473932658319914390365451919627956823980800124880375978662052111797881386060353490432427832058851094210488804887183034572364751639107535041308434932952695103493677600969712634416241541391613699710826602011076372592299807609658979777598672141389319098817824624950794758296679318319299142035'); +INSERT INTO num_exp_div VALUES (3,2,'60612.515523995516156897729403721504966784736064970538891936016753206905080265887046037910122269129293912171105589512464185386239562077778499936203155976336284324712221812806801062157592930664021782540155687632208890794166119782594464410498356083266087045927038416810562596141871858142749062925965665039981381277808608946877852933015970874447235220989360704166270479475802673572039541121473138382812420076284458769543418652217394352637294823914346726065145538710933281768776286965107974980550163605068693568717671571780028113969794125200592691656568731359981803586296135840575095063824258761205175762907549288801963550628589530419118771779395037240198270853609924445368393952404606326559485235840170339343865253618184271158932135392539396160392488927771488269959497352568205940636180870805982484030168838833607478593'); +INSERT INTO num_exp_add VALUES (3,3,'-120604058978638768735327768816171514960.4645424808176566187741738397417698516194251450072379251800348880392307563990441443022019710414972449675597505807363987554551692651900222855421126906435970433932913571889719978994845855323367077258946341408053951573026251685351209154467743141259617399607044800077950793001538324616896138171819510046467177021260834130168590102540438924579570947287892808562845032715007493401411940720339239705810106866471452994584812284665666'); +INSERT INTO num_exp_sub VALUES (3,3,'0'); +INSERT INTO num_exp_mul VALUES (3,3,'3636334760530744652235488357607657374520053530993537920755375319352615385278.023608692512217812784472508939511216316773023870624171279878340621219698109986095090336065266376220109007718694455520948311677863167090936408887147442375455695868593092154861636486745490748828207939155392396090682312136290864359484540126174821846208064763823279315343506148025281475729723686566174395516982893064510403581479746673749128344955124070957545815390178764940816628194640888255387443237798761377617383817511745005525149990207764725040109364671749403389999498572538135588695345112358160274671918953118753964073105250116426665508214894805722798842017943220605600452911496071424281587802689830031742105619630787641205011894680546049982654601956546154572720177337696285354350903475239411654436042931409507429892682706228354459580412759920815932840348933425754970917910500027837428631661182510071352138858'); +INSERT INTO num_exp_div VALUES (3,3,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (3,4,'-60302029489314054989387940744763542234.98295358053252401308872309802346144227050959966671157134780970446370197110016237152333448347415674483796371931316021552756816073493808344537122580089676304958104270609762310229182150728136567294798680824019082599362332377530165818229609055765904048195574142709698758095302560470195171027219786996322461803443213101532716728918363951912367135900414238535625075942525108530051828834829820554490477645701692374399416239080329365045332525699055300921341010989742896430768506909949340276549373661076950964959025967328861569387160956730002517417236732463510495205173523163676450203614971844583064927040066684531931069310935516821795449174271052747559395296525950219449541557191520903507653089998307641491381797101485104546410643'); +INSERT INTO num_exp_sub VALUES (3,4,'-60302029489324713745939828071407972725.48158890028513260568545074171830840934891554534052635383222518357552878529888177277886748756734050012959603126757618322788700853025193884017088688974683399381224865109134889560766307825097103477790782590061456916367930139323346273315068375646692125800496305291080749834712822775973790354498408104142209966769395239768969172107040437333428573572464689550003374384624966403962290572373571842567623422963022155546431883766327294954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (3,4,'-321372325955692885069615337209737469749246561535004445508427591.072860243358366933071485495726715620133686420023451450292996945184959542770492705998350644739298629407567812798540119555932604687814429669592481327761428042980782672136901602006622227365754036664912989085940235439697789102358431343119457114603363936544931303133371137532006899162833369543279729021228901466728220729625107362063321334489394782322741444425117731922691457341543446841167138481424319752111748042440994701571955325673470021626946676976482516292402239416632497972073915818846704053624707839813514171497746804751780741682011937606462260710753056669269928580460921188286249923152921382198282201761171043384698319895970192114563900025573490442674225227682235790590616707857188385274186584856872573669591460447105688151281208238908470285147895678001948902280493477604361481216667716971590499226735103039'); +INSERT INTO num_exp_div VALUES (3,4,'-11315021446594.877643290091276308982961654569173523687151347727612592478433578066762912541361898899908505997444632820107356713116459078630334224890355872486337973552333755378190316811715776951317058334754704988120078733912131691682869448731717816749620336196719541702138949084375907248656748314375183301372633028246109596775255074617515860012417935744433243071057057560464360663978361945666099558526069794464437818864063206829678640156992474597480916575712563493776637239091589972373682399519931569163592317107392231951775499293572134702843085474656152913351183535194499521618027894129537558509428098859715020703897463518891082573242502356303078754574312965093639182648263511466558336912294702019648266054331227425119096294871153811412169351624751542166779635702042223762951850816568617453355571302500885410532963789364822647'); +INSERT INTO num_exp_add VALUES (3,5,'-60302029489319384367663884408738513110.66683195868931664491302527038538338065260819361151478340212147889934633981101279593065290940544218360883531149731823374304151252289014494378769385157204705433009477214625880056478643611622410268943757215673170753460135411513114716313801477916713433956086133878890802448531292334570886746283905390661877220497842493537338035961123751393889400517474762491881277080205381424363695095196058838349029211365212855028824622924678684631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (3,5,'-60302029489319384367663884407433001849.79771052212833997386114856935638647096681695139572314177791340913988441658803134837154906163605506135872443908341816501241365674229987734175441883907154998906319658504271319733469814941611260503645706198407368762270127105340397375230875953495882740039984314121888705481484090911598074635434289709802794549714765847764347865064280637851906308955404165593747173246944693509650424312007333558709071857299501674917023499921977975368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (3,5,'39362489275784146262776411377472433635883331946.794473520543457442955620133347015506556162839462623905489255080102447195050109095701660164272430316804466254467810714209179752718730906325952685817112992943656292503112803950215110778476301809440329937774061163668461957943313261962261081942055908935814323069621279128270849852239727888939033546870208376394878842958202403235309372240005941467570230067124830916866857395233038346727879951123599893174252558078732888910139309038957525961212820831321973219557165558911222848692996406741318948607549825343491479728117062814094258484536263158005174429922237853707635743736923521032098496725445243775790161216159399180889906705265012270270348146530113428221072591696851818281866095288773371414866822270689959827332258348570976075184933893434327278299820594014788148344260948638847457822697682605612771344335201258128'); +INSERT INTO num_exp_div VALUES (3,5,'92380711368470856513514428781.033155715252174277753317877861994356621252232374386687048394529670637693505779282500567256835271428113529026462111032257747830329068594622091282098767000694818101994264352932243278144124687156236926607422077479412495979777588932692081795130282128890441931602671468684153168580234070246201722180460130467506344034452687371838907269162119534950946217165384250603250357360223255177692065141037447374172264943732616165429783010079281851748804739433821308362193703012671569249508710820679009084891198169587484117171861141580870066764275087111843275285564262902405980617569581840831518012986031156042600391943605532635833608358301306456966765206853910579231447150839538731157206153540873916893579943906851149770881336811951119112558311734171557608362620988555075663589827484854016702489324791126228380209309587206299'); +INSERT INTO num_exp_add VALUES (3,6,'-60302029489319384367663884408085757480.1853341682137571584926062805631087054017160819890685789064777236456590745415460695320768374693076860837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,6,'-60302029489319384367663884408085757480.2792083126038994602815675591786611462177090630181693462735571643935716818574980747701251335721895588837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,6,'-2830400711649493468815157129316992649.40542786074520931471973065281957756940496588853021620372179463538053123396140685749478530925306163968207226329985017644835203709485594362663495728106061878665324856417118064730721101615473194292620972173690618491026470353143141125614124440035267592258385099934706896692953497971326605145704135723011753705907329979207428661473172503098296622281647255008204864404416199384701720347319806375450632245634238172654086373193251877533131784268854289406126119630708578053354762596511353053106459297339360827562281168219966099848212'); +INSERT INTO num_exp_div VALUES (3,6,'-1284742031601444539630782308463065726620.121021225455596762466053504195700643301310745151565435123335541550963124666304408503436412726848834604336377169205828654564329888653766451656774534718709065521243637375270687684572524302099749018591530352756390467862377335526634920857924031482455373589053524922608255779040656019538392173139295812160325688504210040741075388404155144782519528791757450256668977268409265390016721724966592135644698341754332845002439113523127047593325646484654291494607100188094186116001064043796216982681807318598789324900462932294782971663150070521334398542559480877366424630693734132836518604260869235580641521264976411493166969530737254118968281271908306432918913600567757535151861421384835424322504855607676315840963696944683182767935565256136130185809101891760917733694553800748568697830680328155128016670099315391685422333'); +INSERT INTO num_exp_add VALUES (3,7,'-60302029489319384368482818948157603222.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,7,'-60302029489319384366844949868013911738.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,7,'49383414785234649002982046297226894664526726187218771083.0993243619030008310875293647868815940421844461627295157812843657782639833900543200310573708100000958929315945039020410482966753145208427035917753919085618457760620513481628641658765820294863970581642745379331727722585319163262763708386199720411053619449096019862596221607526610103408936214184850115071874430846697061554769773328338028749631552202705583855831155461651414320570061181212214810086436100771547030013079997847086'); +INSERT INTO num_exp_div VALUES (3,7,'73634737013325927185.787791148221519354461791539553527545166847382784629235192342551464898036004011575416717008403527685470842765455409054592207142526523023201841973047779202013398235864494503216973882479116841765663948294836180515686647139678530220909072497288527276378202532400736141014848907023234659020093073127450778982904578906877634654521825977382116752537063128793631412296206704078569268566614023846282524151679028060869175439188773864994186109445961525301841201265289707928211114515861536069733921800160245586536759625418951427346236213019358749196674633237197452976517130405065120577692737021174118093373953642724512531935525024447977867020930500433287279183436509990047372809400167546185096048971157700858970777301410692908939206693154161335335755844997198191427289546263182822280127912118140820265025555165337881999926'); +INSERT INTO num_exp_add VALUES (3,8,'-60302029489319384367663884399588771256.5916339968771732477072012126949734214868901845505193155307646111690097978112797961939995859130827784737422228762767014427842766445950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,8,'-60302029489319384367663884416582743703.8729084839404833710669726270467964301325349604567186096492702768702209585877643481082023851284144664938175277044596973126708926205950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,8,'-512385513828318260570283740065493064477880918352.732624553690077857674083796435724202494963885926573907185100543184828131859183999195040110586155435203949963570735841632689374488877298209082579317039061893012560130258753218955057387206477423088065663401594359617882154814262843273526859406265633827109554791772242178864873774889091687515990672487380368975556580539271333144212685871370972163560839446696514092637412587953506052848750866803569213269271165856310101244342151576488190595936869490659700946174362872797854591188391982770203203644172999264143929484089237665313698600170041324566984832357000400'); +INSERT INTO num_exp_div VALUES (3,8,'-7096872691348467943606706217.907270287823269424282176534343841939501231816905820949045946136373255017076943323578903040918266385724756894003692978391468202345397178445216069294845721607024056189567609414049207292919519881725733381453217071918292453682942046440563446278374996563501512335133749731529362537349288419883140401056747081065947774593869673146309163791076953204291951821124894409171722911526435445719071769008713367057971351892550570642991097981458696464929009464411568672010548002196406312721789582428747564855324072212842315229302959908665089850886951261233852165624100634055045684536311382452553544676139507899503993644452161529145849579200003677255968757773363970434791501820320494192909660871475590637419913907191608957830524390049664686282439567943053924245852983990958276537000732363895444894582579142752920882750130052682'); +INSERT INTO num_exp_add VALUES (3,9,'-60302029489319384367663884408030893999.8854209703537480818248540990234567956069965340942024890856088355839135538265116174644003927269495876835324407641642359213535695803871472434650475144516723617632059130297610134243891145006222068960999879308472500422640481972089756410157246974765071949782242392661524488959954348903412713930092273629207697480131360047867213863018127928853922173643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,9,'-60302029489319384367663884408140620960.5791215104639085369493197407183130560124286109130354360944260524553172025725325268378015783145476572840273098165721628341015996848028750420770651761919246816300854441592109844750954710317145008297946462099581451150385769713261452744310496166494545449824802407416426304041583975713483424241727236417259479541129474082301376239522310995725648773643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,9,'-3308379209762459471107480259839508279070920437.883503980178028214343751083865562028455061662673132221930429904398963590401793045470444301883103141901787466923883803951815572606105617157736442670792467625964359169270739534412932791178258858918086886061702512427989129732248215348301444245772127142869263635282888226326427510486246184233225114523636171202034558843515894542952126988613018789833835507734620046994907453602573865012044120483116345444810078666601100257620969379968264504287700045822481492526688635364586344704730579892342786173395802035361824932075736340405960099542224953439044947229246847140957298841482874444906129049023002897135347878048572628834749795298712449864571996898774444932083319581439741625832405434317985988163261591679157437224404970927012111196724239860528859217322132733404472897289'); +INSERT INTO num_exp_div VALUES (3,9,'-1099128766678422054524173986658.839339966689456265703816212189145237878729886466041806078542573981227645802109969871638687985985845489422516004202630099080709709893022100481258818112345013009059633421290241583864468453396484606925071369550998772875840640325758308835852391176503689677263605949075815552026731067384737231681068134099746550363063940273625924224721503126912810251607546172009765059506591787282558727077669973711491157840340631805422942099954647016059576777054339588421998882440726473698513560202030309804089250300097589174314677765341104767702983421063649104691583044460507666600260994707192787133590502137391691330098102374713996115782701417107878938473243874299874872852713499024851414757892169376458916467621226859152075901273014182163212783658933754507272478777304254191033562324994395916168496097385872331012258027431094381'); +INSERT INTO num_exp_add VALUES (4,0,'5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,0,'5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,0,'0'); +INSERT INTO num_exp_div VALUES (4,0,'NaN'); +INSERT INTO num_exp_add VALUES (4,1,'5329378275943663322300488.64471790965256505869684245785528331091076155554650629138833809683459634328609777839510066435612911583108717191216693735823717997111970662575497378762952496582183738308720094529950793570383580785385569873278068217936841324404119828637880370718028782103860007754579779716996004352284614661690063919125301052941328989181561787543541920734755989452320799185700078241880935083616978140555713297241612718277766918005268951861880490889884082730841740604517529391011862694381726143520658746305661338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,1,'5329378275943663322130001.85391741010004353389988518583956365616764439012730849109607738227723047091262162286043233973705463946054514004224903034208166782419414876904468730122054597840936856190652484801633363526576955397606531892764306099068756437389060626447578949162759295501062154826802212022414257953494004665588557188694447110384853149054690655645134564686305448219729651828678220200218922790293483596988037990835533058983562863141746692824117439019450865871047657552800448629502344444081260036580660700595591338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,1,'454294299613767152878025320780.534199313974295807138790763501115780294529340799108297697573066187975311338382917022391830256203305238757334106943821060545424417350991354829668286194840925251162479496893943917530660694097932059166013476064988623431110002057735318529554555260199417935495388243829261809007709919225000608711536928171687251088217591210419208480251102484043683131687013687838713055660405381318396419588727500715930145098362997142075433472039319292466570912777345841400769387321465602989947078951135489852486382469990409873227894248208197179481868230244584527040573428134962626267135732247029762468417273891700661832893497067151409134724061246612631376075173287264787886064622106855886785805818642123776489793586531950438285720668411465570116161790343538663297713926678759640594912243360541590368666922379919514826022141331900181'); +INSERT INTO num_exp_div VALUES (4,1,'62519544780217042176.800424689664850775296526267109332647921183817056683200043718160298562843864918741523494444361916531159341418970534833628106062976341639276761669219281771109561175175033739624472497927501467465456946098280878993371659461957361369508794842102784763955539708800574418468150309301129490186416766691183270872711413796386178009615777589066235359283212636467980113350635181915492452697347977967985810294150853782607014649150457138118264698071689065469752702524632313088938504181640435324554007553994564705401249228914199354821595855823113730697333390936834057091883654016371107974899726642500486005445063301647520527084320363513388355471718583708935211830796440056542408492723718088396437530207347815505844074508948817594746824098278470533148171941442049323578854023683167934569551595335539887777638716651319134577441'); +INSERT INTO num_exp_add VALUES (4,2,'-994877520673428596810678826533995.79421257464236160757218576989993781147390382997132644206786872350652200243563770552469933194637146474528320738725486418004701192337175478117026439697031462361180324038544450723753402846519731908503949116978812841497201119103409772457270340059605961197538918709309004130294868847110690336360689446090125918336908930881873778405661757289469281163974774492810850778950071063044769131228124355961427111369335109426492177657001035045332525699055300921341010989742896430768506909949340276549373661076950964959025967328861569387160956730002517417236732463510495205173523163676450203614971844583064927040066684531931069310935516821795449174271052747559395296525950219449541557191520903507653089998307641491381797101485104546410643'); +INSERT INTO num_exp_sub VALUES (4,2,'994877531332185148698005470964486.29284789439497020016891341359478477855230977564514122455228420261834881663435710678023233603955522003691551934167083188036585971868561017596992548582038556784300918537917030055337559943480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,2,'-5302078674303935968062773235453828254014583744527466365136.236414807326868572353809920518232561005161225922028750078608989965741402418802255050636954800114792425419735155504035469350521800895164087027043476055514245942961100610551646034472084954313670284875310691807937254054948742125729353864014122131419164449567115006621212424805182687707372956385102095255735458593389920872596796806885847543910224476727171570873698525606016990229936284811067826588349092841322512643043008589065847223683467371925773023109720951609815041012521485326120380123169545818055967455575736140138663815073081494226676896278654189873597341203197903408668523514375373841493189836809506003729379742035629498519683885268256481104619815130659628225053833297766479068686119691010593208135616363994230674606991733148502293102108193522604968743948323130517040609601859735899914987426089053869350663'); +INSERT INTO num_exp_div VALUES (4,2,'-.000000005356818439105666775800262590702859770599410113087721172791624002387236505438218124867814437523686300450045582100868990117124343222534568799037421944272316277130975314766456260710406160143182498931595199129228915695802952695510723443157825968340043198200740606202264287904755124946591110599335909404657109057432686191440989434662797205973563889238804413861126260401987949920244286377128599413927273444061572120561496904543200956508673923547626768641271397088562966176629018606103663605145666976048261236691866387601532424530473754175270500777679603569715192364542901360534980926452487443629100484491344001509360344122933911316486556042277769848194790964257060927912344609376571637126617813506411190014141992988288983968823792971270853369317867326071952900448455162898476163801382836761898292684175721846'); +INSERT INTO num_exp_add VALUES (4,3,'-60302029489314054989387940744763542234.98295358053252401308872309802346144227050959966671157134780970446370197110016237152333448347415674483796371931316021552756816073493808344537122580089676304958104270609762310229182150728136567294798680824019082599362332377530165818229609055765904048195574142709698758095302560470195171027219786996322461803443213101532716728918363951912367135900414238535625075942525108530051828834829820554490477645701692374399416239080329365045332525699055300921341010989742896430768506909949340276549373661076950964959025967328861569387160956730002517417236732463510495205173523163676450203614971844583064927040066684531931069310935516821795449174271052747559395296525950219449541557191520903507653089998307641491381797101485104546410643'); +INSERT INTO num_exp_sub VALUES (4,3,'60302029489324713745939828071407972725.48158890028513260568545074171830840934891554534052635383222518357552878529888177277886748756734050012959603126757618322788700853025193884017088688974683399381224865109134889560766307825097103477790782590061456916367930139323346273315068375646692125800496305291080749834712822775973790354498408104142209966769395239768969172107040437333428573572464689550003374384624966403962290572373571842567623422963022155546431883766327294954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,3,'-321372325955692885069615337209737469749246561535004445508427591.072860243358366933071485495726715620133686420023451450292996945184959542770492705998350644739298629407567812798540119555932604687814429669592481327761428042980782672136901602006622227365754036664912989085940235439697789102358431343119457114603363936544931303133371137532006899162833369543279729021228901466728220729625107362063321334489394782322741444425117731922691457341543446841167138481424319752111748042440994701571955325673470021626946676976482516292402239416632497972073915818846704053624707839813514171497746804751780741682011937606462260710753056669269928580460921188286249923152921382198282201761171043384698319895970192114563900025573490442674225227682235790590616707857188385274186584856872573669591460447105688151281208238908470285147895678001948902280493477604361481216667716971590499226735103039'); +INSERT INTO num_exp_div VALUES (4,3,'-.000000000000088378091435340426596348183959201660680284222502095357746364378698792730669202270228092348823133529449019715406417264278615046537007844589547485282959556860316942508808911542109265489435572674031608663747132688980867386885961271358592278360097086532747883342438036287136994589308551796702164612609710942175900921197001888540314760352113821737014875886635147123114456910985089625906448913621495025509697742196814421833448856595853403450682101743559369637786458968714240975228615283970739279506239628546165569688434254286341567486905374255702980370754235630955328837646999003123103831262789115646588779721625156078607919060762857866951417867378220773543985422722165221371084387943737083254760594128718841665355053236168688218864433967871311858292181233490194833547273501436630325295640020916257836404'); +INSERT INTO num_exp_add VALUES (4,4,'10658756551887326644430490.49863531975260859259672764369484696707840594567381478248441547911182681419871940125553300409318375529163231195441596770031884779531385539479966108885007094423120594499372579331584157096960536182992101766042374317005597761793180455085459319880788077604922162581381991739410262305778619327278621107819748163326182138236252443188676485421061437672050451014378298442099857873910461737543751288077145777261329781147015644685997929909334948601889398157317978020514207138462986180101319446901252677846098070081948065342276861225678086539994965165526535072979009589652953672647099592770056310833870145919866630936137861378128966356409101651457894504881209406948099561100916885616958192984693820003384717017236405797029790907178714'); +INSERT INTO num_exp_sub VALUES (4,4,'0'); +INSERT INTO num_exp_mul VALUES (4,4,'28402272808100253242547006276715304015308580784958.804614276533085644370816876160290159450291717634111299841065255625515058118012211808741402904995080624675460593676923639082981788732031193774047612589113654423166826140872334380708795266307037944059108148612979119729408762532396036043629484049508789880964586236575769826806092391573178899640321403656891487586452524427223891405519836671312830183895761747460911777623703557946796784873885800089025388390522992806365773290733075927321101736155663727528284512100509273076328103465333687228713897893434161293693971954442699482857938492961830350598789444266860160794913830991304996676299650460125000959751177037694425217989910261807246272771711816326991282202653917488360776928533800529297474279497910326579608191975246060946079639658615178160271122713225105861574160788280907842327681375920919676063500116492292319'); +INSERT INTO num_exp_div VALUES (4,4,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (4,5,'5329378275943662669459614.81475694159581596077242547133292502869630735172901157043010370467618244548786897684821457816189831652076071977025794948484549600736179389638319303817478693948215387894509009504287664213474693208847025374388286162907794727810231557001266897729978691844410171412189947386181530441402903608214502713480332746271552746231631136145916685939539173054989927058122097304419584979598595477177513004218594211597809300517607260841648610322863666300637648662611916496850248528515936635845594390453288113296413254893687029540384176335735114863908372780241463999450547422213639667099644505472777149095004849805371205203850993689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,5,'5329378275943663974970875.68387837815679263182430217236192193838209859394480321205431177443564436871085042440731842593128543877087159218415801821547335178795206149841646805067528400474905206604863569827296492883485842974145076391654088154097803033982948898084192422150809385760511991169192044353228731864375715719064118394339415417054629392004621307042759799481522264617060523956256201137680272894311866260366238283858551565663520480629408383844349319586471282301251749494706061523663958609947049544255725056447964564549684815188261035801892684889942971676086592385285071073528462167439314005547455087297279161738865296114495425732286867689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,5,'-3478781676337858247983014311182511.567538638808357215203593479841446379226774481291286361639429856698999485760647422501864626078375852610019829111004807806660731243672830787729048847342063218718651165150612717759770504648306347926061960607388621011846314969634048226452709389995594961695723139571002939804473057725442880410434039783304583526414509590532906062732322732569475349107437896717416548237633532805602064623969799081086996320156575550896200848758685986331692388099427314008504506503745527468550106879602399030419569897808150076298414568875477195447656904373310322813412927463518325927626891046356679526447117311923853482118502868148386882363449163182892615259995945992014431502761210899772725227648729095696228388558331052524469604046072203605897109629560683446827492904111565278516043939137760721315953500281379039771826554155511347152'); +INSERT INTO num_exp_div VALUES (4,5,'-8164430956184510.184223536017248184022252663660196916321116266103608317725855237211273642694947892658721606226082017525816544904635887836163201565923338826779819876742736219975639586566502584026349778499211535661173597356253186281116862244165796632756909578140184577853088376334255860281874385669242675881761388233070861374295536603371778669602656670852115614651462552069294889723058758969660566508798011830996965570446030123780674316363670374970480994905368006454513642480180066435609577311074332150098288374616437489163254821095377348025470309665651059603665062887597814064136313866690824972464351274062540825405003954064175728198182815347642172934453828192850870808373638597839434504241236228591053696481146252072190903430582534862988719805163692697482513169856291048966811374872266165034373412719593685881972700171726777938'); +INSERT INTO num_exp_add VALUES (4,6,'5329378275943663322215245.29625473207137544719284446115519970394719946335145777492574745992986971075733570324679065009803281404581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,6,'5329378275943663322215245.20238058768123314540388318253964726313120648232235700755866801918195710344138369800874235399515094124581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,6,'250145412892811547138949.592621291590152419206270097656346630226508074074623894951308487425470437268130465956063593951784820669318897182831355375451719125809800516979013437732298382708070979871283132689492336823087794373113039154669229889503700598930220858275174342776478898670277868700384853696009897221747924643343353942154528501454689084608965009561564638167714973711022212547096732831847202912862290958304510651828842182545311077713664465815992616213663619529378061133917572474298028065850515876361609671565914027186063801852554353160801534696062207299890867876199323530337336273950892723090754719547285920090419070001019943385293110663922226230169381423410428577990604776655422105400452217085311617728003688836185608912367677734364834577573255789160419371322775733777518997638403409000055707558465286469808848200141192627396502735'); +INSERT INTO num_exp_div VALUES (4,6,'113543048739697485358574290.758354267447744932153707340542459183720907885610125346262898114677742971240785031722334497858930434531517077525413654346644836353208132641713415396062580605566225794048569430676355036264762949452090151450855446984773994337170590068740235544320694721909983307239491151139099779296496785240814600627140543144068640768857707110930453204162312973998304574796413938461971472337040811785231390930046688391955000749644938061585377150632133417156866197053052425576957646564943278156977176976876921235395711611898108821587442609611001702344783440618040704066809035404237786023075676374788819144406909313755996914145273176359246052899650387182222905558751208368173052381982668563471143298720677965028880626152749773712037769548408324298835212547215352657271696665387200792785056233953536347605130973626194099064678842085'); +INSERT INTO num_exp_add VALUES (4,7,'5329377457009123250369503.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,7,'5329379094878203394060987.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,7,'-4364411947278810125327066890819882483326918.05664098958260550284395870948992407314161088028674246708928421994893923699743452802989464864039994566042797942433140378990308345483670828497915478397481687305406460330009319949623844175096007381662809083363069100235985794575399268709260901964834244796150883807308976949196661411035264619638771824190014274817662519438658481432363824187693821267613212631153175155634316128036152465184903927860719447693468054624663668062006049759837326188252927823612718163916100588143128358998656306593393889422386501730237442526450419990376323903182669190482615734972147533221144682538647497701130447816148459762464395194383090936159579764712919396391813914821973715879062992249315474841639591907249142779103650773383644785606333916967894'); +INSERT INTO num_exp_div VALUES (4,7,'-6507697.520580964829176145824902679560705744817573189143227837387224410616222039115571544850095278317993922427931439719549137387753697989249394347047436951117850128104928719365703899136632100669607126357491484781141296021264049762417528697619931558728863308905257358126654378784709213859234056696519305650316810797382293500878834933984458810656133463638442959750083607649924453935287420620424368291770694630751828333903156364366745210911640207075765008558904788350844410055253643515389003711759818446776538393914018427075074171758415188027562645239606914126802490579848138218395145734902830046359100742374008993296019987093605275289913663224324033923096998194326249508491872193747944673057257521552387923218450155737056841633810711295424578984452176016198348344913655301417872189073133147510027427530833694019910340299'); +INSERT INTO num_exp_add VALUES (4,8,'5329378275943671819201468.88995490340795935797824952902333498786202536079000703830146057240651898748760197658486790165425772165585380839129948178510273188565692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,8,'5329378275943654825229021.60868041634464923461847811467151197921638058488380774418295490670530782671111742467066510243892603363577850356311648591521611590965692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,8,'45283653791262997781451381354094822.762732909505051438036873220502792213670540454778361182993875916509061144859281577740137081988678361247725064336120451090222456518107029158304937620179032477664627949959143233370320432203497828243297406462513350790251761540074946469824444452248386782451723637769289822576372357189700319768797708375563651655860093365309717823602754924352327588945034832436331911584742966378275504545736896430718939807674966738116698454215555860047859161126694019895490767779791933882712567492115664113775047192011252893773389940988533801360010782816196288710063568554147458866942816721046004257953642508395867837127678980002737669139369781058046396738606563716339660654364541530532834806205571191828994250708412638796240377704994928921528330863683630622922959130920715261879547446054261914770022377059156125037157979236658010950'); +INSERT INTO num_exp_div VALUES (4,8,'627208063620965.397582272040628872773601055303353339700043792111288801181637510303989399395425313995651311362368773096988861977687484912995632130587762386590996099363383976320342247076516604162469063709298438133327434461462906199160715395064249299615054970359309619951777972710299484596875999967582794277241285253106817446259313281064844416249524876385699646393555435017820686376877981018047574348711991428666249794623006175739581915209218834701034964043360823844816042368184094857692062884223864639972005010863342567608351008172649209459933114800143792514183138995700133608613158857147417653998048890116531052767737435620558349226865105888201598712435680481803901906613772821370519525404423549161696526405320391828194356063547089626322474164332505209233143121068245585662919687001395119229263995765376465304715643388771609446'); +INSERT INTO num_exp_add VALUES (4,9,'5329378275943663377078725.59616792993138452386059664269485161374191901124632386474661634799161523147237015531446709484039091244606359050341194730653343894986479159670583937529516163204904273806158788218327396375034882788180783796976731912141525319602448709213495905899041406302673881364465504945113279286939663215197485367850132991968081639290297033476859158044889351836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,9,'5329378275943663267351764.90246738982122406873613100099999535333648693442749091773779913112021158272634924594106590925279284284556872145100402039378540884544906379809382171355490931218216320693213791113256760721925653394811317969065642404864072442190731745871963413981746671302248281216916486794296983018838956112081135739969615171358100498945955409711817327376172085836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,9,'292388240303165948041827159734686.255558469787242316676287235194652580157149226950109397295920730296960145548003120827363226435916209781396711693581454960342091452830648929118261388933297036933167543189308061917640517578583521401267417187854611829815212778183983326568586118831109538377828156118900313778053576483381085207892754728937946691892849474364477434665960112125254104966566712906532318984871145605839506991591027939136026602051635433295687547552796828217859648186757719639965988287173297286034098497871707197092627676226053609131138590878743560287292934815277894463305001278326023708395571840850120055316276256138004565442099731931051413153564744766098053176049414330146267604802971221161572130161432525297614616942172815141372973870720928125699420370428856022295499447755488148545048400795053604349570217878099721865670458104653570360'); +INSERT INTO num_exp_div VALUES (4,9,'97138902640718538.241246716463110895614166618530828908023040947887095196830690221211560526562522274118188963051412359798837957512805692731972838989047910709158995922699598619854907969493232150042212406549916252602794415099066259707018021422154933830674786488990033885447289593742424717170197810316367637885248684134204152352748803532396210051700193575105804898183523770153431536054848843504020390623875664696278263569145547515663340450903772852615789980257449146000410036925975898331113013857953289990299253584950458042598491897496393582249411290555264437893099880371008957017323366523688894303458743415715114628052487518110654201696604914159777300997374156315186315524817636714210119873791848535246674326877611945112249137224923201544452904111118569299934059002046318394345055859769572070097973298522564724884895879226870720839'); +INSERT INTO num_exp_add VALUES (5,0,'-652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,0,'-652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,0,'0'); +INSERT INTO num_exp_div VALUES (5,0,'NaN'); +INSERT INTO num_exp_add VALUES (5,1,'-652670387.03916046850422757312745971450663862747133703839829692066597367760104802542475264601221776157515632293978442027199108085723617181683235487266149426304575903892721468296143475297345699313102262188759506518376019936160961709578829069446312051432780603656651983414612264636232727512091101057374054475214114364113300402823059519499217878746766275164739724770556122895799337810694888119810524986616938847385753562624139431982468828696587199570410008890188532132652095915565323400735066310142303225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,1,'-652840873.82996096805674909792441698652235828221445420381749472095823439215841389779822880154688608619423079931032645214190898787339168396375791272937178074945473802633968350414211085025663129356908887576538544498889782055029046596593888271636613472988050090259449836342389832330814473910881711053475561205644968306669776242949930651397625234795216816397330872127577980937461350104018382663378200293023018506679957617487661691020231880567020416430204091941905612894161614165865789507675064355852373225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,1,'-55643106304872.575994253221940844841058071061962511162776681458310912066379595519265546225338405882027547140476045378015935579066580347282075024392379464189067155567624835346798806677988850250198082355055954078446421075165109896091047534711081616362392995575466807084807876544560268050611445006601394735810211678919646667455478469014906335433468365011768049600750224822391684377238242162320161552720449713229523135506671063115436813348612986916614320012995541575293478341408982118538094438068036422562665160411591652618670802973618768526197813319204816293073794413317669922144705633308090832805914096147659820167569140291210526520361556881576175809360614782817717579318298657744021133210954279487777567785280633309576696708168342539425395482429923273623865667723482418178781573723597156804085501875735112311466228778929147929'); +INSERT INTO num_exp_div VALUES (5,1,'-7657.550797567691019915353529993301413746369700087741672762343206271266232635965032053368224472333368713006346867984576168784127503674579531243603836945595880917241997606783133673324236134063757452734295148763280059050480246827193380861494669624151921824660313516974440913733511526807313019192263170823268678149435664224184903925632177789052038092611394447709922076676981043877747276056677801802695466205531230350209787298926245402046182150996849906836743231861317120171583577624262765589605263477198809166390259128339127005924586833372241946051704497188891325715185091060185547236923494393813210904033520844572880475265306843414506359253445517738473745552980984097762509546161690823646176501838559393690565709795724159196133663168004773260451322595899506776323262195323943138344537866088159583331807728944620284996'); +INSERT INTO num_exp_add VALUES (5,2,'-994877526002806872754342801504871.47809095279915423939648794226185974985600242391612965412218049794216637114648812993201775787765690351615479957141288239552036371132381627958673244764559862836085530643408020551049895730005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,2,'994877526002806872754341495993610.60896951623817756834461124123286284017021118170033801249797242818270444792350668237291391010826978126604392715751281366489250793073354867755345743514510156309395711933053460228041067059994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (5,2,'649411906691138274293985410502516861224852.2323455192714410716272307781034189160865613770320102043319541634113746032638191509585045862973333645830298922352816245477556264222094036953195419857712804755170632292914187367964994214922001758104594052499795564860466055599417895782179851297585155129541589802249540436678824225950907268084876110445460948679383611117263673106597132046331719468816839434908155684738864149955129235751738204036443603521478609787295079710078973503970964790273461142497259987849074597264522099648376356902360358310245001183020992360260836105404118742418040965190000718736837422434593694808973939805954329718232693154128543253581495885789333274488461716809104532693754070810202831113003978085636579574171344721710232931261731022478029314435363413498991740750878099825781577297965642009156858479681236085226911858782115'); +INSERT INTO num_exp_div VALUES (5,2,'.000000000000000000000000656116570506105776235076334177868550033347254561166417969910286926369599900073757929714260350320362090452092025380232792749476245042480546813848702351830607516880397305138543526307608094143028291193163613755680419049060162928958489964834941920423432354996040147818253087783193280640282263490705632002572757216731766513434035163528102590524432221718194164133959630768718395847710529339782880381264265894322494716854757290930538739000043383104085867828258790010654331660516512156519838978751447311068903958136482041673109857552178367614498426226323001399275980281507353231821022591045797658991388304873240910526149138339658220844723880158150606035181559877351791752701872877147074033569061408920725522180134133183999181370354585872214368766629114773129541658653693832843354053701079334077'); +INSERT INTO num_exp_add VALUES (5,3,'-60302029489319384367663884408738513110.66683195868931664491302527038538338065260819361151478340212147889934633981101279593065290940544218360883531149731823374304151252289014494378769385157204705433009477214625880056478643611622410268943757215673170753460135411513114716313801477916713433956086133878890802448531292334570886746283905390661877220497842493537338035961123751393889400517474762491881277080205381424363695095196058838349029211365212855028824622924678684631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,3,'60302029489319384367663884407433001849.79771052212833997386114856935638647096681695139572314177791340913988441658803134837154906163605506135872443908341816501241365674229987734175441883907154998906319658504271319733469814941611260503645706198407368762270127105340397375230875953495882740039984314121888705481484090911598074635434289709802794549714765847764347865064280637851906308955404165593747173246944693509650424312007333558709071857299501674917023499921977975368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (5,3,'39362489275784146262776411377472433635883331946.794473520543457442955620133347015506556162839462623905489255080102447195050109095701660164272430316804466254467810714209179752718730906325952685817112992943656292503112803950215110778476301809440329937774061163668461957943313261962261081942055908935814323069621279128270849852239727888939033546870208376394878842958202403235309372240005941467570230067124830916866857395233038346727879951123599893174252558078732888910139309038957525961212820831321973219557165558911222848692996406741318948607549825343491479728117062814094258484536263158005174429922237853707635743736923521032098496725445243775790161216159399180889906705265012270270348146530113428221072591696851818281866095288773371414866822270689959827332258348570976075184933893434327278299820594014788148344260948638847457822697682605612771344335201258128'); +INSERT INTO num_exp_div VALUES (5,3,'.000000000000000000000000000010824770508763323320533297369674519056450544793568147911931789010432012750062661590994728968589403602468229106206242395792957238667714358401601098858606386995096923432407249369639633268143022787987190106724545750803196130511146323174462918572423414631798141263222875752767731279138952850500369328934959764805948568471324562210715908420467881411844098258193571194910997918428786213948547748701831331312040839544355427357749520227124858111324859160114175254197992204974033767300989488517391063188153561391320190653403747521648794370679322504188364455328709488846777004202196382575648619395139553279192346251133156445942281048959845827006761160755031086836046398020850814350246219929303018051720203943879538087954853996826539712240458022307680912400297508925714946398031304516583939283'); +INSERT INTO num_exp_add VALUES (5,4,'5329378275943662669459614.81475694159581596077242547133292502869630735172901157043010370467618244548786897684821457816189831652076071977025794948484549600736179389638319303817478693948215387894509009504287664213474693208847025374388286162907794727810231557001266897729978691844410171412189947386181530441402903608214502713480332746271552746231631136145916685939539173054989927058122097304419584979598595477177513004218594211597809300517607260841648610322863666300637648662611916496850248528515936635845594390453288113296413254893687029540384176335735114863908372780241463999450547422213639667099644505472777149095004849805371205203850993689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (5,4,'-5329378275943663974970875.68387837815679263182430217236192193838209859394480321205431177443564436871085042440731842593128543877087159218415801821547335178795206149841646805067528400474905206604863569827296492883485842974145076391654088154097803033982948898084192422150809385760511991169192044353228731864375715719064118394339415417054629392004621307042759799481522264617060523956256201137680272894311866260366238283858551565663520480629408383844349319586471282301251749494706061523663958609947049544255725056447964564549684815188261035801892684889942971676086592385285071073528462167439314005547455087297279161738865296114495425732286867689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (5,4,'-3478781676337858247983014311182511.567538638808357215203593479841446379226774481291286361639429856698999485760647422501864626078375852610019829111004807806660731243672830787729048847342063218718651165150612717759770504648306347926061960607388621011846314969634048226452709389995594961695723139571002939804473057725442880410434039783304583526414509590532906062732322732569475349107437896717416548237633532805602064623969799081086996320156575550896200848758685986331692388099427314008504506503745527468550106879602399030419569897808150076298414568875477195447656904373310322813412927463518325927626891046356679526447117311923853482118502868148386882363449163182892615259995945992014431502761210899772725227648729095696228388558331052524469604046072203605897109629560683446827492904111565278516043939137760721315953500281379039771826554155511347152'); +INSERT INTO num_exp_div VALUES (5,4,'-.000000000000000122482510461124748279475400009367345900846466958806966807399903713411658400733717078392550780910604704603123670767210550800752620037863340961255721285160854785449315208955654408132775022766783343331151895973970395232686910362226184006990485313002943710214511418310741271074710741339586430026286272098156531835438969774325517509155992092194349661122678547097423264670055720422496527272118788005921590521726691666219504214087867030003203385360001614199656989667055583749577099440092378355805901262289841168751608673297446473709956390142112843400255748161809121986096092991616144443486023218404881798896685413932215981950393130292001833627899480153863300557853617312991880655905907971211246077450786084079040513198340644157868678782195341316027563717617074364438885981635394382733697473265872796207'); +INSERT INTO num_exp_add VALUES (5,5,'-1305511260.86912143656097667105187670102899690968579124221579164162420806975946192322298144755910384776938712225011087241390006873062785578059026760203327501250049706526689818710354560323008828670011149765298051017265801991190008306172717341082925524420830693916101819757002096967047201422972812110849615680859082670783076645772990170896843113541983091562070596898134103833260687914713270783188725279639957354065711180111801123002700709263607616000614100832094145026813710081431112908410130665994676451253271560294574006261508508554207856812178219605043607074077914745225674338447810581824502012643860446309124220528435874'); +INSERT INTO num_exp_sub VALUES (5,5,'0'); +INSERT INTO num_exp_mul VALUES (5,5,'426089913064020811.057708378200224487694731586862745370027417544052374884336177893807736467646454486029424673621605232432043672119510371547153895504456723242262639262542904151307250842477327375961936454637964429999741717244285121019840463692418987118402683746281993192269229200465080358289645050337976214115902915692028162689089167194843185708212911364017271332623359100711545479273675423617018342297822477514128997410642005300368966199980354369928371655155437291469427189561877718971914040675572136507472590254222870537216617260612835805368361975725573009455402822669103118872235140158440342063571894152305875004532651814592458133460160514384171804043127771746596286988679698684698755896736275307574630777027620558428909546664763675431701332632828281070572045822129984625797185173815273651376003614106277727279230096226977335510'); +INSERT INTO num_exp_div VALUES (5,5,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (5,6,'-652755630.38762364608541718463145771120672223443489913059334543712856431450577465795351472116052777583325262472505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,6,'-652755630.48149779047555948642041898982227467525089211162244620449564375525368726526946672639857607193613449752505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,6,'-30638438.151446159804025029882398388155309149089870990062944469684482366692824338098201222171115395923414887930224163525189097571163687285244255335505387733673499447610577050114902372990462064696637481657064525319516004273769831260452832960893174173254560250804003884280384718123289136453955482855362019158401218620018346500189769819687260476334734259702665316562988639223597110627626759216850014150105605927773639897638043177685498804811787888811168524202700283461266793154726325540776914500415140842975457394524215869103737379109516024460317825645645301237375972914247141703084877141866316168268901439172491577729880760950895760711857112463508064820414904611059588717092145484656103798852859978690742216940980929562068'); +INSERT INTO num_exp_div VALUES (5,6,'-13907037655.047994416383638650569341223199042786813441967582376077478024677494832069402897226848055043557486983268019376307288565911231748501636517992289743940159005664424461285010295150828744259113760652210086696250085454819340987566229400805422509198052317518991183515696724846560872057916862620762789778660622787735923967096950195583369113574365386627110408307941105082873469072519133330718161987781080307947247163619814890462416622144825161521790673339279047700672881113718394727610096366361422482794458375587355933614201638489194194834709433413694420512869179976485096875057742460003147602405353823942488343056906912173170809084207937229591627643451380735179767199816663168139837088183577975769442341678933576388936845704303859241320794255052627716474860113993958556604381707826493168941926878481079724185426298004604'); +INSERT INTO num_exp_add VALUES (5,7,'-818934540724601372.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,7,'818934539419090111.56543928171951166447406164948550154515710437889210417918789596512026903838850927622044807611530643887494456379304996563468607210970486619898336249374975146736655090644822719838495585664994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (5,7,'534564131989234694540350103.27821462973515555648644772098605028371173048154132108733819196629002548296868548691993248746628993380136454426833349407578676005545111508293942736555269938962058196496152360848131645787941032968937794930046928523006455386861100809286408671908320322523368135203881520526880998279355848280412933152306299256343179622513731096363088094541514890135766460631462465021694553063366717467560655272004461368865264059368514271105464855575429914212085797297268595943955105608543373940035636033207568676745293499106348500559628723682588033431457023964317090780615020801564861497990103549650624438425421690193862533733474254'); +INSERT INTO num_exp_div VALUES (5,7,'.000000000797079129642393611556079160915147221153735075943759104977169600937534508973732991117540626046659124172765761873705978811124901421049332579161931652390647472911517923131800238903184679028518657818755558526885018755394697157094867449047655737107085020874974955627907737126958129710597811740696534189608639914753884882702680512272194316887744972931453458445314561564591875764930680945589486999586667912816485821717403892703364322658245615895415781719033810595358092343690359557942948213374234065052300866661453767599465059289920067095083062096458980564265691295895672503728815182981118876144075942348853666085714846210822847053889733510154276933759200630639642310562242207518883342516103725757482864105340008709446643820864294556778969997115586027866760708448174502158738150605938364482719960251612464993'); +INSERT INTO num_exp_add VALUES (5,8,'7844230593.20607652525116672615394735666141304947992676684520382624714879797087461877675155217754947572297228288498221620714146356962938009770486619898336249374975146736655090644822719838495585664994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_sub VALUES (5,8,'-9149741854.07519796181214339720582405769040995916571800906099546787135686773033654199973299973665332349235940513509308862104153230025723587829513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,8,'-5546455599206321494.0676583421119904300307105296377723816472192007866147764761501865875232824814135783697976183493106885436876081315217834621720906478074798596116645640251460842350553806256223963023430631066024389364515688765194373161385579258482225808660340732705687558150699172147896486727530192499184101617379930846663835628510376484675411350654979679181852179924386290069790336316958202582966248703889464308649631486542724072047294216362186036638115240070658004553260251510288423749333873893917690832829128021808383128393431810674177390352413548658782609064839524756041501835115152819802758773711821322162752064589750295542985780512921839490040396053737870038534216948323935020460307350020911362024271167085905714873548388570602799432705061561572854498075600'); +INSERT INTO num_exp_div VALUES (5,8,'-.076822018213756690975099471985461347542955923191183223634407380481978143225129486622351714276452369661632980197282261508936298649901018470846144321441236073683990324039849865750139470288565622579952182053792815638469841531577235191276257498209844422440366423136595067535337374223115507557306455001792362506235886189722508617024948653046102060677266555476719102193278190540414934812073355995577639986512222998268934000209944414236509139290657402937840986061987219441410741189615344050459067454369371094189930607834375561948483494321255500497786795636801854613881105643003358210407867114145806225724880370339074242480071595684502491827709175732777776915682786771730423733673667248186336046898260378049328204094804755195626798951644386924178161926128482002518979482630732440619051262620098544265763306253807191182'); +INSERT INTO num_exp_add VALUES (5,9,'-597892150.08771044822540810796370552966707032464017958269847934730769542644402913723848026909285133109089452632480800168074607090893991283808726990171062867538012237270000932798704781608969096508450960185964292594677356241956277714380500188870696516251767979457838109804726539408115452577436052503866633026489282425086547752714324273565900641436632912781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,9,'-707619110.78141098833556856308817117136192658504561165951731229431651264331543278598450117846625251667849259592530287073315399782168794294250299770032264633712037469256688885911649778714039732161560189579333758422588445749233730591792217152212229008169062714458263709952275557558931748845536759606982982654369800245696528893058665897330942472105350178781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,9,'-35812445701642379.972368737320206275515144213236752803936806738624588812089615098329765811617509505790110909629109400553415312470540217508070421816878544125783329593128638405659896184248784794258084116406472768709113030915308410565617764394827427154923321461158387012978726512246146545834669665093228316853342805604075936530371665576147966721599968786161939347726656168798065647411457701453987215491345496003650288850096338695703984042549594979897253521041581573388369367579323607093487743440894765114619634001789457486407909224339065748496715380572175183589195611952939575073075140094901024063428239223964510824958346570603142906309198033196987949067156046076497974760641964978711558209708743776024313916111738542765749928287600981397080809041007714387564206594515733287925008053261840295560398311905155157989225181164097547541'); +INSERT INTO num_exp_div VALUES (5,9,'-11.897816658873986795664687519069203701902563457968097729876034796143085813450454323128600602495745166997629078984618283588337379184733369491549230343315369634754204412939757136108898254582353378508832611703989221079986765793923635928759179573599208612516427628403686659479459867527627014558600521732194240404211484706621458983727740143568799713006127585168144158660566534382037451913967363675002134687952374080694449905223371627606557311710348820900963340884001770733452314715448053233208783321215998063958966729954113843581448912079950334969908657535514847005768455377990262943747367245613296497099716892292154137652893990339292671106003657659470243633112063075297194691349631518467702876183897580432003030164590920118726657290102377710611324297862045849839571689192181090062958059281673245670440852080202548743'); +INSERT INTO num_exp_add VALUES (6,0,'.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_sub VALUES (6,0,'.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_mul VALUES (6,0,'0'); +INSERT INTO num_exp_div VALUES (6,0,'NaN'); +INSERT INTO num_exp_add VALUES (6,1,'85243.44233732197133191329295927531563604777955507322414928382967007765263923984471408038635831036097817458527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (6,1,'-85243.34846317758118961150399799670008360696356209219504851646259063690472663252876207514831001425809630178527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (6,1,'4001.075404054519813215296429095020391062109905613738157927030437221793757373268325953178030040276107574363822832168160758728653712686313134828282109532831190239521843808940611025488601517574653932032236616573457735900045655665690517797280666732780030171712864961531623060353548802466577910774711998056232872212688464691036260746751992072745518373073825852119460094113694393273456369345499434994672730920070410547163082189385645712866100999708173472360864669110044660667614583576570496399103026286828660558854973376227247132815728164629722965145778698957093136175449225024685874279280018547740'); +INSERT INTO num_exp_div VALUES (6,1,'.000000550624150700285432940805295709861455424264970126953321538967550091614148982212874391026630805836518138806917934859138493583812313778188030836027246840794439412443826640206464415527687555214009725107630387889854278497875708390050387195108441635824296563108288712340902423706104029452615686971019125750530034798026103476074158922893374911891438688457439945897348811702908216883650280617098402133628688982793791562476980709924382381505517834196446365877784931355599480881104446907801805570471686295270927836995181422963320376948188855989986414581755633425437161760674162177776773597848142496583128607548351599750592863590334617838124741567654525843413232313914310487355539260264225486180000012813397807525203822863232682089295055713257835007742845010741137213301116647610033909062369843750685396196342928455'); +INSERT INTO num_exp_add VALUES (6,2,'-994877526002806872754342148749240.99659316232359475297606895243958507460511031229368344962653674268847910587702140353344168594152240599109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (6,2,'994877526002806872754342148749241.09046730671373705476503023105513751542110329332278421699361618343639171319297340877148998204440427879109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (6,2,'-46696638263247522384986521136500.479312417066793299922708112595886608370451213741279484136907754744903470430131032928908162742687359367826808123516519335458861613010646992354378739165872253762686683966945711430182491860196341344982195078000259063231136011430995647812149294224699587849791008794261026932467933475782780'); +INSERT INTO num_exp_div VALUES (6,2,'-.000000000000000000000000000000000047178744084866106587600962473825168237820701199970144691815329658682341685812472535816245052671243808078367856957579485152424914481414614360809698177236664771558713606961423658442962083541733004775309314926918118528217478256885324362912426275407382550929085958089798861918760121727491366034496581249711153289495601712583077918760003840368008056353090552282274780428335438032908213783490070198414584291402513547386013689752310173492320159738977752795528725029134841933604057954874523842273790958618375118974623107241366036640538085329921129023905888674299774726871808862832797230915933851225308164365269753526489223540580759951230801125605963901491073619448437890841032149898629231552019804656219062534881074125995130202820302133432951999011667568746004715268323913437054078537'); +INSERT INTO num_exp_add VALUES (6,3,'-60302029489319384367663884408085757480.1853341682137571584926062805631087054017160819890685789064777236456590745415460695320768374693076860837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (6,3,'60302029489319384367663884408085757480.2792083126038994602815675591786611462177090630181693462735571643935716818574980747701251335721895588837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (6,3,'-2830400711649493468815157129316992649.40542786074520931471973065281957756940496588853021620372179463538053123396140685749478530925306163968207226329985017644835203709485594362663495728106061878665324856417118064730721101615473194292620972173690618491026470353143141125614124440035267592258385099934706896692953497971326605145704135723011753705907329979207428661473172503098296622281647255008204864404416199384701720347319806375450632245634238172654086373193251877533131784268854289406126119630708578053354762596511353053106459297339360827562281168219966099848212'); +INSERT INTO num_exp_div VALUES (6,3,'-.000000000000000000000000000000000000000778366376597400971124059102619954214055884926284646546105035591052258074563706355894551049631537984053410850060739107742208523938741961208742831871056600773325053133977559789796700130019975964192371715826863472981072974742704091801166438465082519558956925444635729210849210496466189037623555622901738570979273502405907969114110345815802999687171113749364073269902319653450479463404003706147915064100959774312307195946966281098140229199529866429134937742584938255441169541436021827079647129394362379406256722903991353136733939395366152312959281905058592776286736536360235356737359904478313225848562436632109470589310799000750518904145312512621838935796912993778920622238202744037977772169066929474233952081158212174549695244127987299282384885288897893503991509410567351494'); +INSERT INTO num_exp_add VALUES (6,4,'5329378275943663322215245.29625473207137544719284446115519970394719946335145777492574745992986971075733570324679065009803281404581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (6,4,'-5329378275943663322215245.20238058768123314540388318253964726313120648232235700755866801918195710344138369800874235399515094124581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (6,4,'250145412892811547138949.592621291590152419206270097656346630226508074074623894951308487425470437268130465956063593951784820669318897182831355375451719125809800516979013437732298382708070979871283132689492336823087794373113039154669229889503700598930220858275174342776478898670277868700384853696009897221747924643343353942154528501454689084608965009561564638167714973711022212547096732831847202912862290958304510651828842182545311077713664465815992616213663619529378061133917572474298028065850515876361609671565914027186063801852554353160801534696062207299890867876199323530337336273950892723090754719547285920090419070001019943385293110663922226230169381423410428577990604776655422105400452217085311617728003688836185608912367677734364834577573255789160419371322775733777518997638403409000055707558465286469808848200141192627396502735'); +INSERT INTO num_exp_div VALUES (6,4,'.000000000000000000000000008807232244507937251856465017967626593430084223212999583902527587737263981869382895220711835510154989851222501080395520249593128253795609198666884523792646863341248402687314509176781281863891589925961900674092953408613128961234166906173266411035009516545964362406728942021813644419154548354247112601793685146960840364604115937119024575638240439041250900118977183124605578660115160551830946251713350556181960983267689939549506518185340972020820080460565392359379680036788592213479105831301723237102710863182596413567756605711230290883888612188805367801369264231165178487334557824054205160222371548005742602736713668548450400926514169967213301919971189065307721110805424950794015852531342286935114651278691214233054575660712537044810163930633456573860895791198853393107188289695511873068'); +INSERT INTO num_exp_add VALUES (6,5,'-652755630.38762364608541718463145771120672223443489913059334543712856431450577465795351472116052777583325262472505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (6,5,'652755630.48149779047555948642041898982227467525089211162244620449564375525368726526946672639857607193613449752505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (6,5,'-30638438.151446159804025029882398388155309149089870990062944469684482366692824338098201222171115395923414887930224163525189097571163687285244255335505387733673499447610577050114902372990462064696637481657064525319516004273769831260452832960893174173254560250804003884280384718123289136453955482855362019158401218620018346500189769819687260476334734259702665316562988639223597110627626759216850014150105605927773639897638043177685498804811787888811168524202700283461266793154726325540776914500415140842975457394524215869103737379109516024460317825645645301237375972914247141703084877141866316168268901439172491577729880760950895760711857112463508064820414904611059588717092145484656103798852859978690742216940980929562068'); +INSERT INTO num_exp_div VALUES (6,5,'-.000000000071906039575366987930696117572143566208825430801491864851999044659045681114433294052065377679745375399878664822361548237094424148992770296383642432040129230180142339557437679166815114510467763288057917694948929009212876391059413439647163295629904270262780935228234994930653489111444964446097124407804311494588517082748514970905563707392765567625639455978464081409330528324962333492925267647686759704415549221137291475247571296491073010175087298752769122449499990102435819414671847617062560524758344361194566796343756743243766853291113852464023843527189221162680613675369708907935197867458588904367993736363321133720345058432019986643353417257503619558797249295232894674255060861358071309619524800424087896023710729815248847792174290644245138831518072176198607255346603270853333176255533974364728342822'); +INSERT INTO num_exp_add VALUES (6,6,'.0938741443901423017889612786155524408159929810291007673670794407479126073159520052380482961028818728'); +INSERT INTO num_exp_sub VALUES (6,6,'0'); +INSERT INTO num_exp_mul VALUES (6,6,'.00220308874624532134736695825088747995945783791378828770826401323533973395137378460250799184832278118133622563295093909508983301127615815865216895482784469538070133388154961402881325731054433770884496'); +INSERT INTO num_exp_div VALUES (6,6,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (6,7,'-818934540071845741.9530629278049288491055193606922237795920035094854496163164602796260436963420239973809758519485590636'); +INSERT INTO num_exp_sub VALUES (6,7,'818934540071845742.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_mul VALUES (6,7,'-38438389630389612.0042045464692275627184627672063157323631169405883031379129843031477339360597564128205768842448328088'); +INSERT INTO num_exp_div VALUES (6,7,'-.000000000000000000057314803440765029050667129936880528769333499793237773980613524885506515999851858649385968476426313207429914995755091541422893944525222307473169425244462149015717526718376299808423552027796204632286454853167559026787019718806449038446612978917236245943248168920696452018925986743620392955122431521581268518101342690974749463089739042586011924590503136498488946387508310209984849243014542648765897536338824721211252335866349509669538308454367849024503312249951727948786393404944555844863805495937835281927012430439403132382055464307180153473189842433614777883826783689904293115204700185380661601223693428304020047393499702811581067120117405280772944184877279069842269329959037186324135435468322336398566440055479142909170224780318371473684868152271947368867666706912563225912012901437076773416'); +INSERT INTO num_exp_add VALUES (6,8,'8496986223.68757431572672621257436634648368772473081887846765003074279255322456188404621827857612554765910678041003765241409149793494330798800'); +INSERT INTO num_exp_sub VALUES (6,8,'-8496986223.59370017133658391078540506786813528391482589743854926337571311247664927673026627333807725155622490761003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (6,8,'398823655.819545574205652791249227663407026876411660299394659390409794761643751582473390322547798567169668246138880832642141417531427935520467563318363116897177899262525720710134129529640376020947774470933902793259531840625444267816319963200'); +INSERT INTO num_exp_div VALUES (6,8,'.000000000005523967081937952184172713994498918048454262874017009201501812494019618863622631634736130436187167745347383745890248619882896153083428308074678908731005176810208100004498415662458272149380846809398637385270265351808328466537502823071145089961996689711299405627596294988646826454676198092260759424935699382655736524042353938814268760468122584678267125994645166955751211397353140569987758938572953312303398024147927938612934833827734142292697389251052485981023756760420972614486278837214553818521196182883489483756785207650821722660455451660719560529693418375773124813290305501923899840247103166971466167032437598057958226806335324315214908788839919408525748236713611579486768218564733151121028172253396652755590051310396973181595992981076269789287489208817712754098019817792758730835341151711523474207'); +INSERT INTO num_exp_add VALUES (6,9,'54863480.39378734225015137845671346015520435061071252892396685718794832880965812803098645730572474084523997120024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (6,9,'-54863480.29991319786000907666775218153965190979471954789486608982086888806174552071503445206767644474235809840024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (6,9,'2575131.137912978352131546639620215541477987701194164886305951830806120142596646541302305984776928560906754259789485960991272272782091464270104432109904222200473616116525297615725803495463468272171161659654385929185160689572943852767523792651123455283534072794326647404332228203001469884016996499768656263775233430922446983838511590562929268821678518640501686017030536100955531423152839988008496919169395159653034847677470665418765966542111749439412'); +INSERT INTO num_exp_div VALUES (6,9,'.000000000855524875533453524582534418967571681572635027972658867593464437484123442242521660317156546196609749230372398872487667521984251509483676665788527375343148382604836976332389890799079878151841905152004537926201190193814594954194044560537664560344224646197027029681984683465852110060077865421064400958821808374370779297676624123638191407441015008434084079839721156870032377372497814037418047056438760664237367081226979226606227037631073946209105678283624370820396871058367779887709720661001099338250009251834581804647326512873792849059661525874160414378459696930831877643599421297749483849526695657467708603491876916749718079725746259119898269814551222336219537198318796277931946529242436502235147453584237994498566122973953203597470078105606906752099294162422474758048436539653041606499637623370030079916'); +INSERT INTO num_exp_add VALUES (7,0,'-818934540071845742'); +INSERT INTO num_exp_sub VALUES (7,0,'-818934540071845742'); +INSERT INTO num_exp_mul VALUES (7,0,'0'); +INSERT INTO num_exp_div VALUES (7,0,'NaN'); +INSERT INTO num_exp_add VALUES (7,1,'-818934540071760498.60459975022373923760152136399214017262844141729040109985386964272131706381326192223266583769046276181472898406504104649192224392653722107164485675679551050629376558940966195135841284978096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (7,1,'-818934540071930985.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (7,1,'-69808760806266041400340.70700818693892852138813934414383886494691670042143650609934777814995087699409404201920249076407981012095999320858479644760715204999741683528746097757549835956359129287002171391961763797857794730120426599135099619822532290339000466211195776337667123320942107370731349851576864242697412616810236323676004067839744992733887503405311090677026008324895177587064547630828026123718296429295638934384446325302964896473296829265805737112709269803814942537657996725913938408781715328945194948010970'); +INSERT INTO num_exp_div VALUES (7,1,'-9607014551997.140858001442365669993007297071681832468350855627077185145567261170534005832165603932891201648027598773639089125980996652005412450490063683624648655909636499261774535015914730479401090227915382926027949990128880284298688443593909017437720828163877690126019616194376778317148693270900349151496295698078575648169637635898560612738481294674167553369445426793073304518646116539082953755973571046622684332425840412198776081251646424875405772676893185726872613804612566569794177506268399878105117763696990094108960076591684779180089885283939385808214239337829666227427148603057941899878123459708920227867371285837642561064461118016739395972994827327543594846953341750907541716807985738518071480209106185726125017342997283356926976052909493074301401955202616191210810331245427141945840542129607439703255628683506772979'); +INSERT INTO num_exp_add VALUES (7,2,'-994877526002807691688882220594983.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (7,2,'994877526002806053819802076903499.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (7,2,'814739569184924399102711674444306584731316176345067.39834031417849342571224916231092924046722938910652929295271097903377854123984307101079073134405782275535446337229706620713104545454319555885847481531722101704765783025789147453570970090'); +INSERT INTO num_exp_div VALUES (7,2,'.000000000000000823151110229758332661330617426417726331211894330147399760458555778324097596176117291103184653828305857999638466183347321835058943563347767579219763002258622507889760416640758842509635599414768344140175277742935564567127659688612699366182158030839083982896107176174766408199870924563237827899202849733606842856491701660599599211106794572237923985121475458446997860253437578966578617985764298513928307852082168209458400544457824307270777530312648199364084272310536024283945598340590403612752287693234647719354745060851129534452514828239800716088248915975054881011343555492596002595181046121935660176097475159074973635534016835214952415720717896518544064238656360099884889450237541254761746029507300068198731306211736696956568648033834554273602524147075895460874922913883751452403825099444642503437'); +INSERT INTO num_exp_add VALUES (7,3,'-60302029489319384368482818948157603222.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (7,3,'60302029489319384366844949868013911738.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (7,3,'49383414785234649002982046297226894664526726187218771083.0993243619030008310875293647868815940421844461627295157812843657782639833900543200310573708100000958929315945039020410482966753145208427035917753919085618457760620513481628641658765820294863970581642745379331727722585319163262763708386199720411053619449096019862596221607526610103408936214184850115071874430846697061554769773328338028749631552202705583855831155461651414320570061181212214810086436100771547030013079997847086'); +INSERT INTO num_exp_div VALUES (7,3,'.000000000000000000013580546907080371873577430837141172674171921610919544849037647398734065712983603204704663262116138799357430947986241590690589753181299773842880079777640016786921825609617596862828930939366173224366864448436461306602680780407912534492687474933386043505172346330210659476505435994582446405414027199938970759003336829722057241708213838318628292667946636226143164221380503228191376939596663443230082698085439531600756771639601022064620204571458766303985028143400866776954225590745596639602613498355332049777798367675438365442468743270334407716567057368347458892075084694158566383133325959042076573734408841629149903649365079563374278550978052491499304166424686842598833319515705663176855033865872333988551611996194856472662292344160194821687681312501127516922809221030420253714666026321243515830'); +INSERT INTO num_exp_add VALUES (7,4,'5329377457009123250369503.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (7,4,'-5329379094878203394060987.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (7,4,'-4364411947278810125327066890819882483326918.05664098958260550284395870948992407314161088028674246708928421994893923699743452802989464864039994566042797942433140378990308345483670828497915478397481687305406460330009319949623844175096007381662809083363069100235985794575399268709260901964834244796150883807308976949196661411035264619638771824190014274817662519438658481432363824187693821267613212631153175155634316128036152465184903927860719447693468054624663668062006049759837326188252927823612718163916100588143128358998656306593393889422386501730237442526450419990376323903182669190482615734972147533221144682538647497701130447816148459762464395194383090936159579764712919396391813914821973715879062992249315474841639591907249142779103650773383644785606333916967894'); +INSERT INTO num_exp_div VALUES (7,4,'-.000000153664179510102140733858340480800294287837601105047285453457000254577644933901525444082336054243749405512900867540483190494113677173628646221933766421338612376123824684592850465460156248403574333545090544920568230979754949827013129083778435107488003838746926270955224758508832133483591156567868631938590248213604979638895901933775098150684618378235712437137852195098700137765601802898366867034641606131280434771339920637353140131159441790904703083143627590062236537714415872864218260252838432414759890832271190606933534662897006726154587341385852258168335058931957995901987808602365467861573344491265289043037273815504867254228957776127752540924854546837197432384563153608878864912196453587628891285275067452280357349897203095502806923463147414086919014592380804424300739713935051357374227246098303140106'); +INSERT INTO num_exp_add VALUES (7,5,'-818934540724601372.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (7,5,'-818934539419090111.56543928171951166447406164948550154515710437889210417918789596512026903838850927622044807611530643887494456379304996563468607210970486619898336249374975146736655090644822719838495585664994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (7,5,'534564131989234694540350103.27821462973515555648644772098605028371173048154132108733819196629002548296868548691993248746628993380136454426833349407578676005545111508293942736555269938962058196496152360848131645787941032968937794930046928523006455386861100809286408671908320322523368135203881520526880998279355848280412933152306299256343179622513731096363088094541514890135766460631462465021694553063366717467560655272004461368865264059368514271105464855575429914212085797297268595943955105608543373940035636033207568676745293499106348500559628723682588033431457023964317090780615020801564861497990103549650624438425421690193862533733474254'); +INSERT INTO num_exp_div VALUES (7,5,'1254580584.048971438599349046867230181719371038956756285986415773300837165755558702217197735811549684202279755101552533605390208155708695952004683670878589028717509749282693444655857296902117478518511492735290086040573521482737598395369632843374456793385511847676556826348943588519880411018079886373631771830925920986588708409208527042927229627786932908015502292313887561198156623702404977221789649731458241770690830680067801377815840764873662400590343236662968218256211697981048576328148435241545372543075051594952109757428031762469834781538302930957095080167901199455226976113347018972534334210416375400979738414416582588689496706548495076287263281908191770792203069614447622517839588243746755480572371988630084226963919158931419126724681617069720048557166545204944250492282054791996953359013543036918134163144772567093'); +INSERT INTO num_exp_add VALUES (7,6,'-818934540071845741.9530629278049288491055193606922237795920035094854496163164602796260436963420239973809758519485590636'); +INSERT INTO num_exp_sub VALUES (7,6,'-818934540071845742.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_mul VALUES (7,6,'-38438389630389612.0042045464692275627184627672063157323631169405883031379129843031477339360597564128205768842448328088'); +INSERT INTO num_exp_div VALUES (7,6,'-17447499423661151023.558342555162228919125358089491573318627107322332520978657843895009110781773496490472817700487707134216424855867015781267287628022535529641238372370292374146871103236048507252055787621394728096799222976387108688980537900309311204203302960751747509648304056939321473462375648710590981564101023812800603438271190184064874290215309040519813024962909469701968804925443161094255632624090623433640078421818321246597728308302979223833487133268472455479442002005374793705431817866798804822885690193667521606781156962792120052947767160957903073698536973292205899421787948529970837601521657406211962967291912148632072929662185840265855612193255596825032457033402506154930851214421895488796227471490998190312007513478459049382774782886773158311656817014322925167278223360446454868236479549745612973293185989975394307678926'); +INSERT INTO num_exp_add VALUES (7,7,'-1637869080143691484'); +INSERT INTO num_exp_sub VALUES (7,7,'0'); +INSERT INTO num_exp_mul VALUES (7,7,'670653780922685519356619170643530564'); +INSERT INTO num_exp_div VALUES (7,7,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (7,8,'-818934531574859518.35936275646834493832011429282408849567717761204690035294074716714939441961175772404289860039233415598996234758590850206505669201200'); +INSERT INTO num_exp_sub VALUES (7,8,'-818934548568831965.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (7,8,'-6958475505053954666339703437.48985528725312694198056665033448258303533387675711770743843194274181580881296671866212320171337132096489224277825857521033238709600'); +INSERT INTO num_exp_div VALUES (7,8,'-96379412.478435590945480884955616049873645089637121682284625533034225619945532704111492738646389632607594293500930307222576571876059094206480673293295865214240456906965855425738072430281475736130342229749511650392658808510082775031098547507966544723255869156056349218776847523349173551313282283869146710349521487706884633419341568648959204688757523312579312713453540395840470692533267158388401676533369105590789036132185107859069994833345453200014884023709597817280132465224778002071890368479648934317322270613208789859930618055792958996389145963056607200020526949699302565905917600478429628844015684879886549766473809801710003649193772354147104446894109928903223843036925147624639466770660174828940577089095480826473544099693433597812637069287644606693066736302793687011165899362920686114156254982709172925265118077531'); +INSERT INTO num_exp_add VALUES (7,9,'-818934540016982261.65314972994491977243776717915257186979728396159058352649559139156429817562698954531329940720620096519975256547379603654362598494779213610069399116912987384006656023443527501447464682173445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_sub VALUES (7,9,'-818934540126709222.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (7,9,'-44929599044588573810654775.83678007633232843418115790847152455559258007804727916986432256198687661496804050903769496933400455947645400628259699874770581538122521805603947464462448454681701547899144129061961394870320463199545502030106801911915987309444301341575451240764927967432593181449618816978119423290767783843864768557371257918447461479570164065303599994081990686'); +INSERT INTO num_exp_div VALUES (7,9,'-14926769772.797708334489652004325241753714626257641081061212878627972973992233480868793527325656854681817156284203427388055525855608883067129036717726368707982450450575794623567027457808927082390474261155500697096284790656757163047499531247323702909360444831707029353441147768321257650234732286165724178549576948957405037843360446785505536809409054071975214796532504678683693402401018726571884721963641317944453797513145055081061680091585467186975354801535734149952115333241283186621720677488342266420359417174224757781125498130120775969091933838082305123652811689513300403051544682523761263183781206840940347226802620226164265210810994106136738030959199259066517106713585343004140573604437146025585149934286364795122716971496775012412420105368351774715982565252533025207453326002101655121126631180162560463548157187175671'); +INSERT INTO num_exp_add VALUES (8,0,'8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_sub VALUES (8,0,'8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (8,0,'0'); +INSERT INTO num_exp_div VALUES (8,0,'NaN'); +INSERT INTO num_exp_add VALUES (8,1,'8497071467.03603749330791582407836434318377133169438097066269854720538319012928851657498035372443556191720308219530866834905045144302106406146277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (8,1,'8496900980.24523699375539429928140707116805167695126380524350074691312247557192264420150419818976723729812860582476663647913254442686555191453722107164485675679551050629376558940966195135841284978096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_mul VALUES (8,1,'724311956372274.0135050255361637906710330203036651743488213007179039756514944640108625580172737414192938789413338554327986697518463087452612658955180411327002900979574347739956600177846996063741787205122007268468674386396156638261992679442768654367111433834151087792255469957061758837789341439211010331332174981459471333376067541234901538285101103690622656631026001337239036711179989456674399137008584021283568040818388709554256523118702728176420022080138548890713013682480239784198421500241995499841675772793497485550923152267616622892846304530712344886979674416990935007952941652591352603797627920865960622077762568060903908151958000'); +INSERT INTO num_exp_div VALUES (8,1,'99679.115123747637190903598543851248555278745675862923884476564848911494649941770503156134872464666625927195645517181131678518619856156844072856993813601495176097972982587061507650426363887871820112714099226501603733968262566093655417466145183587899155614471697804006772915054739361437054029183182533671508695646413074668188590846200362324428338974890534273352188276373478524543505805545661569395314989170104140776362043880099775594658817242753124957385625811310332354760117110779649164022618274859298031549851269619167173746259018497289174255201452265070501056913033329291819570027877856677145579673495987354805150868813877928857472561883332547900866904764950837506993759536410161752469488392566682723027340638271076406246129989851281210810196699482980833204884400423019400653089825859983062096326294783573417554749'); +INSERT INTO num_exp_add VALUES (8,2,'-994877526002806872754333651763017.40289299098701084219066388457144979069028441485513418625082363021182982914675513019536443438529749838106171095037135009526312783302868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (8,2,'994877526002806872754350645735464.68416747805032096555043529892327279933592919076133348036932929591304098992323968210956723360062918640113701577855434596514974380902868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (8,2,'-8453460632655529853033389979024265783461224.3195241893307807116624750282852146303290708492834695194274289713076935297734670940696121761483641291930931061232942894577813178566088927221374036301485916497770984757492912292002695944367308880163698595015497307574177176409203214324418237020500352652934909632442547242092296504047310806151851207329042221920888326000'); +INSERT INTO num_exp_div VALUES (8,2,'-.000000000000000000000008540735921314463871578184793632135730756619558669911183806487803411545406462244216408739432325839683804021466133071768612386706692296158696852363349481716813410857655324486448455846562309041306880675446880859847445987588059144788756984750993583865748280824370754934966494724951583311563735533173023858438364336214213295786266815116844775733072416507474834701984381586060478606371028156925222726225495235702395502085206072985373035972506738983640539009567237336002073370431753469632428303255926718930619221521257726366850472572830063284204851204189447233044832163423057501488364913539948261528280564870049935369825245920984413480757133585498984374354957754078525161296201228031555280486615145365039415418251448980923331334883673792135893857917681235883506783408111446970710546686739582471'); +INSERT INTO num_exp_add VALUES (8,3,'-60302029489319384367663884399588771256.5916339968771732477072012126949734214868901845505193155307646111690097978112797961939995859130827784737422228762767014427842766445950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (8,3,'60302029489319384367663884416582743703.8729084839404833710669726270467964301325349604567186096492702768702209585877643481082023851284144664938175277044596973126708926205950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (8,3,'-512385513828318260570283740065493064477880918352.732624553690077857674083796435724202494963885926573907185100543184828131859183999195040110586155435203949963570735841632689374488877298209082579317039061893012560130258753218955057387206477423088065663401594359617882154814262843273526859406265633827109554791772242178864873774889091687515990672487380368975556580539271333144212685871370972163560839446696514092637412587953506052848750866803569213269271165856310101244342151576488190595936869490659700946174362872797854591188391982770203203644172999264143929484089237665313698600170041324566984832357000400'); +INSERT INTO num_exp_div VALUES (8,3,'-.000000000000000000000000000140907135225782279761112255989433531718277338909398600029580768021365259747075253760824424092983497958717844671162530550507041138147836569244869107757945370200122955794509365120853536859837243314494576053441804831018954867623755033888264275704547752628348151132333655667171970175829826792355986148522268067032057293494927558322394395160508723637192234110428953945018965078022622950949911124494740703606109543716688008516750321047603009424529696862953094999450658951089435460411028678817795100630449046993274191915359520936265372754315076684798942557329584282177053819106884196674660057281227248874819417305259132106690385871316407455034281900110779740008476645291647094776093567400422266906817555937149628005629880142615126571231411138926043531449659320501743591992888328328980526602'); +INSERT INTO num_exp_add VALUES (8,4,'5329378275943671819201468.88995490340795935797824952902333498786202536079000703830146057240651898748760197658486790165425772165585380839129948178510273188565692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (8,4,'-5329378275943654825229021.60868041634464923461847811467151197921638058488380774418295490670530782671111742467066510243892603363577850356311648591521611590965692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (8,4,'45283653791262997781451381354094822.762732909505051438036873220502792213670540454778361182993875916509061144859281577740137081988678361247725064336120451090222456518107029158304937620179032477664627949959143233370320432203497828243297406462513350790251761540074946469824444452248386782451723637769289822576372357189700319768797708375563651655860093365309717823602754924352327588945034832436331911584742966378275504545736896430718939807674966738116698454215555860047859161126694019895490767779791933882712567492115664113775047192011252893773389940988533801360010782816196288710063568554147458866942816721046004257953642508395867837127678980002737669139369781058046396738606563716339660654364541530532834806205571191828994250708412638796240377704994928921528330863683630622922959130920715261879547446054261914770022377059156125037157979236658010950'); +INSERT INTO num_exp_div VALUES (8,4,'.000000000000001594367257057971052149628499448029056279649281098852958322409409919964709324200796473211884339143791758566019217634542932882694487712398244322522748736692741288668885362384266615527166964187404128216235057387796054457728789109537338988453837993084016408244895452291151218602815057669592284587317035387004942691671916981967449109983992675125005085762403043329820872839739877674121174083273716295673230993049263574856197011389828478636779342320299895806297835595427859271617831720398457416685435560152182883615601663820189195644140652141180949257192740185075408019971747810015931542757445763460947106918998459997631117642552273815713467150465548031203738878873114842844016176922502916339025283749846225376341878386377192605865913018132981323065698049618379727531925408677611856682983907951667054819'); +INSERT INTO num_exp_add VALUES (8,5,'7844230593.20607652525116672615394735666141304947992676684520382624714879797087461877675155217754947572297228288498221620714146356962938009770486619898336249374975146736655090644822719838495585664994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_sub VALUES (8,5,'9149741854.07519796181214339720582405769040995916571800906099546787135686773033654199973299973665332349235940513509308862104153230025723587829513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (8,5,'-5546455599206321494.0676583421119904300307105296377723816472192007866147764761501865875232824814135783697976183493106885436876081315217834621720906478074798596116645640251460842350553806256223963023430631066024389364515688765194373161385579258482225808660340732705687558150699172147896486727530192499184101617379930846663835628510376484675411350654979679181852179924386290069790336316958202582966248703889464308649631486542724072047294216362186036638115240070658004553260251510288423749333873893917690832829128021808383128393431810674177390352413548658782609064839524756041501835115152819802758773711821322162752064589750295542985780512921839490040396053737870038534216948323935020460307350020911362024271167085905714873548388570602799432705061561572854498075600'); +INSERT INTO num_exp_div VALUES (8,5,'-13.017101389051085341042057308965769356145255575582875626848796382322826525772114256699384710400140437710569924703769685567402446691691210934185000959063158239023412379691360587119206695513775971704926722817528818197919265145207032750407924774510773427697188520818450702875142190949766251178733262143962213111236591970766836685919581025629742334704854852196126735685421250263035895756028805974153787560164935038227108975229771590754808331856162035119882347418116049174638416621093907738608991987582465865527947015457540650512339263071898410531735438556948115098562123055444965056347091625748703503220861221718449714020622377233272042277814766996198081939221253025243417993701684007826177845003391944496774674489538520354606358872276671998045196738090133576377830721671972381371985771591052597345572374064920279182'); +INSERT INTO num_exp_add VALUES (8,6,'8496986223.68757431572672621257436634648368772473081887846765003074279255322456188404621827857612554765910678041003765241409149793494330798800'); +INSERT INTO num_exp_sub VALUES (8,6,'8496986223.59370017133658391078540506786813528391482589743854926337571311247664927673026627333807725155622490761003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (8,6,'398823655.819545574205652791249227663407026876411660299394659390409794761643751582473390322547798567169668246138880832642141417531427935520467563318363116897177899262525720710134129529640376020947774470933902793259531840625444267816319963200'); +INSERT INTO num_exp_div VALUES (8,6,'181029319177.110996740664566780784253502559986936959009611748146099327460471609593148344991059106574612143724330935988823134137686051475120980257829276671900076859337187540608483895641504622910361858962883971613675309676443079313179200981488761707281247447120551917205792352229666049191991270809865110506639390610910481490688182068719005593641339338678014189749279508731647492051879768743158839680867283217578754666643688259810863605002821607490100820241093473083445658378988069593782353275713240897038366242558466047071334385431080003439842348547427066389352198560236731403235927478177780757802759046212921140424771887928786549573201311120885052685761195784207710933764480136690216943336587118385525047554334029388869436622866247240903231799829259264158812528305210833683370536416861544931420820452512390255774498188962903'); +INSERT INTO num_exp_add VALUES (8,7,'-818934531574859518.35936275646834493832011429282408849567717761204690035294074716714939441961175772404289860039233415598996234758590850206505669201200'); +INSERT INTO num_exp_sub VALUES (8,7,'818934548568831965.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (8,7,'-6958475505053954666339703437.48985528725312694198056665033448258303533387675711770743843194274181580881296671866212320171337132096489224277825857521033238709600'); +INSERT INTO num_exp_div VALUES (8,7,'-.000000010375659845651632013446652385870617923988120764298690164486716047614260682259722116360931978511176121353975789418625836899338225571166376573732227571704071000348895791547943896682585450808398324252224265156214259224488248639550967292466343168350213394398101712526534464002532408445204630441167137710565437434313424987517531891145368203998329086865151248833625645567863740298397742783405267970015165358620026813812552194344790169289440822038223606218360105618852154152168496637886434061050281055613760360200323363465925493033734895631921307644481639236601187225135325401868178006133838932915485272554505684060229409404902185944047523033315868230944723282246159741659387362889777495094736963530708159604929268812778894177095572578862150793098548829744006499229853198046828954650334595737117597239208825268'); +INSERT INTO num_exp_add VALUES (8,8,'16993972447.28127448706331012335977141435182300864564477590619929411850566570121116077648455191420279921533168802007530482818299586988661597600'); +INSERT INTO num_exp_sub VALUES (8,8,'0'); +INSERT INTO num_exp_mul VALUES (8,8,'72198774884738777393.8687539247642452953425155400068591498151280875559609979248583367700231031634872342122563819478919600402159024059794279536786611373504966204744811722007869415559012475160471227957857756325962941799428857291371597146319816910515366298862558849452235442246081440000'); +INSERT INTO num_exp_div VALUES (8,8,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (8,9,'8551849703.98748751358673528924211852802333963452553842636251612056366144128630740476125273064380199240146487881028508694029546139131732304020786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (8,9,'8442122743.29378697347657483411765288632848337412010634954368317355484422441490375601523182127040080681386680920979021788788753447856929293579213610069399116912987384006656023443527501447464682173445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_mul VALUES (8,9,'466174236688165594.9218054325256670866060556227711696100465581464881295978997280335378678072434776702952026828137140986670189756965420183565968027969700090735690246176791371115610886533930223141650377886909408268207750238603105232560663571044993507074695683027062426288270199495225881785499139012931143826099668999261931834700467395442768201666740663642498098541516326470052372008385656719236306238735524802875519713512894448940917708118676095378518264553310312628830009314653641136566040400'); +INSERT INTO num_exp_div VALUES (8,9,'154.875085756903716715488911525453064308758123952566428258639786597308109810869086867746263482721081985848551254298524280231489145092826397833394044637104667137816928932471315095067524966582810436282901424423215992139000153713476369887383242289102867530775908269805285313842050961754114751975054515055089553180717444020378611767296609130477264722612784088270193199394531972594028420402254831778715196248487757266330454269044609134602570688339750190391651801546906342796660819535014295618246236706572780627362908121159003488810140236665846928586992082180006454824311789091323774002510945263351862712964422865623934112293184149374573706760114682326698881257123280119140924775171374360283137569618025005229268057970275164869735173660958715166148344076027212231446680947914004346760896298312286730627916684448923824769'); +INSERT INTO num_exp_add VALUES (9,0,'54863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (9,0,'54863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (9,0,'0'); +INSERT INTO num_exp_div VALUES (9,0,'NaN'); +INSERT INTO num_exp_add VALUES (9,1,'54948723.74225051983134098996071145685528795757427462111901537365053896571438476055974853245403475510333627298551845046116291696445177112567064282766115207407461565363967417615506303416694032848457927390574251904212425813072768882213388082765916956736282110801611726537663292922699021333445658549608928179155685881583228490235606377831724593358583903616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (9,1,'54778236.95145002027881946516375418483956830283115745569981757335827825115701888818627237691936643048426179661497641859124500994829625897874508497095086558766563666622720535497438693688376602804651302002795213923698663694204683995198328880575615535181012624198813873609885725228117274934655048553507421448724831939026752650108735245933317237310133362383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_mul VALUES (9,1,'4676749348240.390309875431213992853550297086049749814750492488995108783145961719774217441193547534210468967573344456866203963659951312519988497979489304488948342258375915152429008993288817366720647491166024151209542534474867042837694499222928509320280684557676243780452100132238968233413333851595648146954975713386711764268506890884764704949969602122157394714663532141060559896359465918874990769222345665160127552795532197771168442486088776803398878354288847069602460071745966589164282641033852314335279121191855487126430176047553895892632834940595958394834437871886013513058514896870683979585091413977173250824451205330441299000850618134248917380244749589254309567551846327349592529960432446947239714236828401206843011440433362544797025114476612133622499094287321570559088587999417440664282418005102546343020409520421747216'); +INSERT INTO num_exp_div VALUES (9,1,'643.609749344751131516972294140174556703217311736700045690413622699888869645595256683013323517984528456698303984909359393772036036540901870537096836621035845014213031549051156299974682317824766457362427063305495772666640279328909129870227828460705733995380145417663304348663705694070309475835826101153850359826502235923289787750107778906593010060115662191620280031872002110849782776325630424918493602259707267214006217268630948545349980430128422952869610116216278256812581821942763705098526140427280008360043829906543029486315209818099697988089748683904695870401517598840185535891464842870210715421728852789815860153472208176465166954851895457846723102438114697692610933532992841803219018495137378534010155991355251803548866919409031477821173935696065078362044927492034445482457329200246282082707380974745411383781'); +INSERT INTO num_exp_add VALUES (9,2,'-994877526002806872754342093885760.69667996446358567630831677089993316481039076439881735980566785462673358516198695146576524119916430759085192883825888457383242076882081857926408611052522393579396644731758241837010163568445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_sub VALUES (9,2,'994877526002806872754342203612721.39038050457374613143278241259478942521582284121765030681448507149813723390800786083916642678676237719134679789066681148658045087323654637787610377226547625566084597844703238942080799221554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (9,2,'-54582443595378013373024060492546032003692.4875677735896411267274323339692558458420972958075073392126734000341372096298914875892612108329218081214550050039133117695428196702128258481789017059073444323729583900855712795086447886053552786449313809589992185978097430132940882612817775035217244553616977182049775786664446683332098226841743818600819221587510039430478859412452506872131851471967577741190323481953867845129745440745526578327709351120432530702446916035797432129052518980799424635406993848916727957825620638983706180841278402925286540375225365057191075559133035'); +INSERT INTO num_exp_div VALUES (9,2,'-.000000000000000000000000055145964114074763360265614481666934002579974728749248345352023099030383962250681574081874554842623852433135871821620640200582985140388676650602814646133317791813938390695683843848260103199745295436998313216878337673674660966362155480524935736646623766057029148471463569162153009963312016563281545776175277904913263614668092319707343286073000287493274965714031678784835459999763925833141049057636632430975424499618419962303087175237320046300285962065818926167792812657620724550768858763098967149546312995222223400007044549870620849992226072041407997925405957501929449911416474388622107825120486594723448780503829317691081601820425151593487431389373265285594626753418140874747955925763163132984655078996173911578832035721963554569605730262976354029623260224710106409129114204296314733036'); +INSERT INTO num_exp_add VALUES (9,3,'-60302029489319384367663884408030893999.8854209703537480818248540990234567956069965340942024890856088355839135538265116174644003927269495876835324407641642359213535695803871472434650475144516723617632059130297610134243891145006222068960999879308472500422640481972089756410157246974765071949782242392661524488959954348903412713930092273629207697480131360047867213863018127928853922173643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (9,3,'60302029489319384367663884408140620960.5791215104639085369493197407183130560124286109130354360944260524553172025725325268378015783145476572840273098165721628341015996848028750420770651761919246816300854441592109844750954710317145008297946462099581451150385769713261452744310496166494545449824802407416426304041583975713483424241727236417259479541129474082301376239522310995725648773643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (9,3,'-3308379209762459471107480259839508279070920437.883503980178028214343751083865562028455061662673132221930429904398963590401793045470444301883103141901787466923883803951815572606105617157736442670792467625964359169270739534412932791178258858918086886061702512427989129732248215348301444245772127142869263635282888226326427510486246184233225114523636171202034558843515894542952126988613018789833835507734620046994907453602573865012044120483116345444810078666601100257620969379968264504287700045822481492526688635364586344704730579892342786173395802035361824932075736340405960099542224953439044947229246847140957298841482874444906129049023002897135347878048572628834749795298712449864571996898774444932083319581439741625832405434317985988163261591679157437224404970927012111196724239860528859217322132733404472897289'); +INSERT INTO num_exp_div VALUES (9,3,'-.000000000000000000000000000000909811507365065002714756487495210579371808512079908127938523896001746219475805196061435010714649189975968123072269549018826343830061696154665503565341929634172463095299662727352635590451263034658630449260378893723785917860125051787451512267088404686342938118993621396641623525252649748977992770709930435013456855344203854749977414354164157192885125263071636468941596567220391082793700307461350484216679632552883058303710297475827456761138832914743429330069022439380297715971317819244718196187172770061156794130040674050533617155253444764036426045091327368023602807193742585178432544430741520636125146531502042579276206322507516332917325631822606079220413965396706334639331097621824106950192993127113903265025719013680733760540930122186345919977470628988674677630636632053583144327'); +INSERT INTO num_exp_add VALUES (9,4,'5329378275943663377078725.59616792993138452386059664269485161374191901124632386474661634799161523147237015531446709484039091244606359050341194730653343894986479159670583937529516163204904273806158788218327396375034882788180783796976731912141525319602448709213495905899041406302673881364465504945113279286939663215197485367850132991968081639290297033476859158044889351836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (9,4,'-5329378275943663267351764.90246738982122406873613100099999535333648693442749091773779913112021158272634924594106590925279284284556872145100402039378540884544906379809382171355490931218216320693213791113256760721925653394811317969065642404864072442190731745871963413981746671302248281216916486794296983018838956112081135739969615171358100498945955409711817327376172085836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (9,4,'292388240303165948041827159734686.255558469787242316676287235194652580157149226950109397295920730296960145548003120827363226435916209781396711693581454960342091452830648929118261388933297036933167543189308061917640517578583521401267417187854611829815212778183983326568586118831109538377828156118900313778053576483381085207892754728937946691892849474364477434665960112125254104966566712906532318984871145605839506991591027939136026602051635433295687547552796828217859648186757719639965988287173297286034098497871707197092627676226053609131138590878743560287292934815277894463305001278326023708395571840850120055316276256138004565442099731931051413153564744766098053176049414330146267604802971221161572130161432525297614616942172815141372973870720928125699420370428856022295499447755488148545048400795053604349570217878099721865670458104653570360'); +INSERT INTO num_exp_div VALUES (9,4,'.000000000000000010294536718194523982241053267404812827031741197656209184880073175960433631103885281961037127283726462743623757855378209281373475473018922090781553213750339001555832360656399849031527008437303091226051008068950896796359518673740801770866360774945096397034708173365378527676779736929035450380795854046109380272505550244458858231227568118355064007614608452292270378691774826689216790090661497154742954386244856792006376222923780801296832612827123778915598893970651480451509706836620045721191411824060983487064555397842027454385628620582036592315345973096405447742002746762099231557054678593446667904250189208490698468539396733604833688133512716508825505666644390119877423938820483653319376926639295680552194966870285838815705038244628263602997511842285889300557188773128635554621378148419364876651'); +INSERT INTO num_exp_add VALUES (9,5,'-597892150.08771044822540810796370552966707032464017958269847934730769542644402913723848026909285133109089452632480800168074607090893991283808726990171062867538012237270000932798704781608969096508450960185964292594677356241956277714380500188870696516251767979457838109804726539408115452577436052503866633026489282425086547752714324273565900641436632912781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (9,5,'707619110.78141098833556856308817117136192658504561165951731229431651264331543278598450117846625251667849259592530287073315399782168794294250299770032264633712037469256688885911649778714039732161560189579333758422588445749233730591792217152212229008169062714458263709952275557558931748845536759606982982654369800245696528893058665897330942472105350178781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (9,5,'-35812445701642379.972368737320206275515144213236752803936806738624588812089615098329765811617509505790110909629109400553415312470540217508070421816878544125783329593128638405659896184248784794258084116406472768709113030915308410565617764394827427154923321461158387012978726512246146545834669665093228316853342805604075936530371665576147966721599968786161939347726656168798065647411457701453987215491345496003650288850096338695703984042549594979897253521041581573388369367579323607093487743440894765114619634001789457486407909224339065748496715380572175183589195611952939575073075140094901024063428239223964510824958346570603142906309198033196987949067156046076497974760641964978711558209708743776024313916111738542765749928287600981397080809041007714387564206594515733287925008053261840295560398311905155157989225181164097547541'); +INSERT INTO num_exp_div VALUES (9,5,'-.084049034261605466896663277055600903951276881294745183935726262038673990196778002490449355450474227878560465916800470848046625257516764244432096856845087412397406701521972651300484716852035267197801389708234913163750232707469240634303111868882057393120649919262424619226282082184091177505826009374043368623853156698509808569378758387708910629731005691079770517679511879694426434724918004419953301426679939010592502325130576915399009756468717124460489039474155719834555522581553817856854607844133431854471292027873672356863673617090151801474016666978499651970627896504709551656249007718965259502928591648533670568214972768900993459927860068104745163979267716597907297073374689384723943955361288974065531322408839914599555769945298758102515352082822617428033648130099822033393662643586331479103933840387663729387'); +INSERT INTO num_exp_add VALUES (9,6,'54863480.39378734225015137845671346015520435061071252892396685718794832880965812803098645730572474084523997120024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (9,6,'54863480.29991319786000907666775218153965190979471954789486608982086888806174552071503445206767644474235809840024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (9,6,'2575131.137912978352131546639620215541477987701194164886305951830806120142596646541302305984776928560906754259789485960991272272782091464270104432109904222200473616116525297615725803495463468272171161659654385929185160689572943852767523792651123455283534072794326647404332228203001469884016996499768656263775233430922446983838511590562929268821678518640501686017030536100955531423152839988008496919169395159653034847677470665418765966542111749439412'); +INSERT INTO num_exp_div VALUES (9,6,'1168873084.346566233232746391559830634361431940000227460271861554316197556566224118756340501278103405856646766537018954185964066240457859194626558143313125824412559635129130086906976028635444060218797992547370132082916380788496584864016645155338102476357490305222392452114945853620686975383081427840791892729407194179236897452655907829255937027286698570784397487382242990326347080472574546312522326038419753951437799831430690304084087684303035538181812523230890783372773953961677974396907303758903934808035747944477277528267001070234880092255363221274303820343225415479126819937070570562654065195009839593938440374000473302075568746771126391307584779249330981594640387657042725725493800876630516005713789705652827210295338592985225924959199657729900181287069808881130884115897407246324220524401243575641227725030779990490'); +INSERT INTO num_exp_add VALUES (9,7,'-818934540016982261.65314972994491977243776717915257186979728396159058352649559139156429817562698954531329940720620096519975256547379603654362598494779213610069399116912987384006656023443527501447464682173445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_sub VALUES (9,7,'818934540126709222.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (9,7,'-44929599044588573810654775.83678007633232843418115790847152455559258007804727916986432256198687661496804050903769496933400455947645400628259699874770581538122521805603947464462448454681701547899144129061961394870320463199545502030106801911915987309444301341575451240764927967432593181449618816978119423290767783843864768557371257918447461479570164065303599994081990686'); +INSERT INTO num_exp_div VALUES (9,7,'-.000000000066993731076524206362744068866774567920404984046399050881532938231826344009126898802592302273719505485084766150904380671495128604515800845609713368334606489445184535043833069145643553083555507533900955661105251251918425885537513359541698046533092111969478225528665278023069818968531644884466229545497943710817187632203193468836772459599856856811131193744272314519908999458320275710240994009061040198159739169960258978462113813370513611735006229733329565083659159456172425715216475781507996483885669437855000029758892126410922067202159414570164537031153818197618428471046051340835826664787585016361564969663413176434498159140395476980277574789931364078570781760777773379636490084338326576889857824344578398580499610233575273027387501809967324874264742269453420400624883982643066864175851881870402856698'); +INSERT INTO num_exp_add VALUES (9,8,'8551849703.98748751358673528924211852802333963452553842636251612056366144128630740476125273064380199240146487881028508694029546139131732304020786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (9,8,'-8442122743.29378697347657483411765288632848337412010634954368317355484422441490375601523182127040080681386680920979021788788753447856929293579213610069399116912987384006656023443527501447464682173445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_mul VALUES (9,8,'466174236688165594.9218054325256670866060556227711696100465581464881295978997280335378678072434776702952026828137140986670189756965420183565968027969700090735690246176791371115610886533930223141650377886909408268207750238603105232560663571044993507074695683027062426288270199495225881785499139012931143826099668999261931834700467395442768201666740663642498098541516326470052372008385656719236306238735524802875519713512894448940917708118676095378518264553310312628830009314653641136566040400'); +INSERT INTO num_exp_div VALUES (9,8,'.006456816440893715330247418029019114736889626790871612141686117271826070935285769018710680035004320626745647926106882508048159628931624522666638442625219959259156539178378186912871506893482633695438850964052285542425753626455183282159259999492971992739484319464700978750304962671213318202670228197968646486740006148091321740497272644910882302412140576608739962605210964504469426861972705740810533465451230811358870068391007718532021526225893542801514255726272411690175555142385382688220121052891017808391607717500701760375927811435030512071347521837090721052128992926357375527600337655573639413811262412492632491693179011503973930804928749370652038245414768103001067902012962988384812280453070895781287237746786414435546976395632454474312533482077585837153357017362048554313154580576238549196250793055676215164'); +INSERT INTO num_exp_add VALUES (9,9,'109726960.69370054011016045512446564169485626040543207681883294700881721687140364874602090937340118558759806960049486905240792691274803010441572779861201766174025231986687953112944997105070635653109229393369465827911089507277452877411716963341532491917294735000425600147549018150816296268100707103116349627880517820609981140344341623765041830668717266'); +INSERT INTO num_exp_sub VALUES (9,9,'0'); +INSERT INTO num_exp_mul VALUES (9,9,'3010001475769225.8286280957637941018500905354415197182850820227163907782811814730309044010416886791014702373809932926301368137684091094408663914110947072451332976891128659038142954192986392936981664792370678656287232795203974766040821110221158579481177539669363513848425151485663431478439528936592701070340012569297177488556353760756495238304538439278682066056721729656193616571456456325016960870401748115848423105783116854283646624807603476682295234280408938557209608025246638166902335016025467565869375885610813662767004038102486303756741615124814580306266901273803721191779461890468156043551004644728343579032524687612403663816107770451694666844862368101122025340182510019516924578414085461628689'); +INSERT INTO num_exp_div VALUES (9,9,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_sqrt VALUES (0,'0'); +INSERT INTO num_exp_sqrt VALUES (1,'291.964716019333021494947753821238960905461614737525349376826064492714634914263808902604580614735501799528494357560837535773816469841426747889103714048646989532842972129124080559131220979335403729022278994440514872845756198274805589586120535745968205107562348427941379641465378272611453955517402598409789621997041856848783989993820946766177453801729783316269310186191833995557234577548740940419224137195404391193633808203715191863638616433190672511651125299379882126530500870287424768024674231651229908224729856278167033444719242144302972892419034855417126978468296581589282861879645409909873113678361180607775255758820910366926076380306290306477790931129670172989289536405788838857428768869345763784112862591549008321546447442552533919976570125718481191724503352619626562352280522949665158335559389298720990302071'); +INSERT INTO num_exp_sqrt VALUES (2,'31541679188064906.712574384704440356216787857626740375004266523720148374188511622980520374202725176835435173058936870163875556102907654264048353814040480579464700545975346621546520503928314632418705230212623378642743044255181848913683862360044189531298446109955034944189751302497670367665492719604026161836224535961347218522748523360100432275693829501972749859329753224444694962089604095212784768854310289429208671271394086829270986183171968944659703708706544668326267327938226750760690620258967209626420981505237183055363540806281098871221581265173394406715458619627534396065960117454160969749739483126059760636526242783235685190739315590041294766649891987044641492234243404608847939002062827210734973778130441825067858641461599799772535304379732674727995848518807202053316225824685704785148921785964036119338754973714515974054'); +INSERT INTO num_exp_sqrt VALUES (3,'7765438138915239878.949520541017683429203286303188179443533225547096446554008374834292278237558244698868300666061834105683999048386497322007336816482648302911579331582895326423063492240235074387242190187374869842856897538718280497895072291181675294000739548676781615025944675912072664211455701112700937190832332966000160156597821149428032612782336278939437593991008833233156511435294360065004167893309428565243314846456225604669764879344135321428948841659419438769652686215993544390780212859309497190065178705035652106614050448518931820975038314187040226298661787490226917902356569717171481159691409131778764973037046501816919243659681416263730519167614043077472097520207347950292377914586524327206547377189493301153212000966249655331053184913579513686655963686155890934436604123384536027235444923674128269748280097789270784333442'); +INSERT INTO num_exp_sqrt VALUES (4,'2308544622905.016172868282330339228589083058636874526727829838244942341440716909466939214393597311710652963849541394758298277969240038668406494621950956862959196896847352631445328917063551082418729435554972200530109505384839391233286173517804321019323644218483570886304028175359854335870835404627608254205407525763332087823548640923282031978903399118139052814618531713327991857575390136755426466065839913887477577516426991104516201265995293600539957187007068885368699949673989051443005684755994465547159213587471972139403333249259808344536605314911144950465968669770276463111776581675944967401948957460097365849699783091843609965345747287667911324039374314413430490112443463386381631812537639503425989372084906324702158112088898424705684574998783112519152403201231176840068666882123684602080460378627639651465436618032671756'); +INSERT INTO num_exp_sqrt VALUES (5,'25549.082770905117529972076915050747181125832857399138345044265535151111965091602789684342996759657333588444489085160336703294705499665424408218434077722506748278242942379566431768762487954917389137120540138359870652558814224523699917122023018717544160579704907452934297025088008618627873220397030397424422097405152321366495319708580932627092620533785271831833326130796638935296720064431288560292191928489034307645738331451165431755179025359993690642194334018457793169983249853388987495489562746304107188105521296156525984787815685365255240654972150342496329030279439124533240114879332406941960563154881888172285475336782757262639979527682925214971861707635327995621436598536743180180978457735632181738067997521785965451385630326464388080990200265186437768409003553910194212076755448477164192901658547251079126833187'); +INSERT INTO num_exp_sqrt VALUES (6,'.216649653115510782473161631235601739254284877523828136703593069337209747459679979369185882839688430004369697316986054374456779366220242645866798278985273820408495361607183119980716020227424205519727777568954933592987351750339481522149106749713967143685591960510946511796062486795368200503801097611436787402191532618456991115230272084771674098613479989808680789347124789253499967359190605681912854639520917409710307182238065185749856554472717209097115325999946728168357936779767099041518574001682560265549916593333117469681763348860131760281253987626822958726920016922608371657319505153308390495179319529587670415367205193280809809356733443291197315823747505896510820272670040485083775482983378341120809542502350385555577946098824446199419354197416933858522419312733314383889554606932774046771497129486979593226'); +INSERT INTO num_exp_sqrt VALUES (7,'904950020.759072496304165474991957396337281699986101765045213964054286624338102141970514306010139529492299343393832200631760194440206005974547202512275476562767685193838576516154915404389465528270010938533075930081897392863141132529694804621418663424569202655893682412466871297412964570322984865326770090075582481194532433411398133265643849129084449161396724635797324126396071308557057830046688990212282866035593809633839882468628249964862932050189148498591642162462777480125024786829078066012617362076651920045684345679767223337287825546294839320770903419463644110383560050404456170063805115223954191445548226706113970164823214416171441655706141596091717118495955441099867737827763335880891937222647408575142200256804313345924443344596462585960919126827045197885802122062165934504665811115031150357820196176799560314653'); +INSERT INTO num_exp_sqrt VALUES (8,'92179.098626752893864900181023972781406074846653380680747862421481598042923358730531575438403865501429843141967819802251116774924400485954931201776260931315313253827346015775662310076094882239170765060649024538403329505426563390044695320714825481746233901773893996663258170360232639353378395244461670781152793416950717050461856097473105730100523010642696332151571372764781034028324977128554099993021459338419164426784774496292405945103200724413639660488309795423335142455569853549710795692020963174011003447023610692365550245567840477105794884132665155376243735213346877116105595296043532605899184658904822980397411096930267453332143879534914237169761039374689145860503772331147367757318826885494994339695470190886515765452545019167989882527248872835783707554463866334705735781549392895480816605355996057201589681125'); +INSERT INTO num_exp_sqrt VALUES (9,'7406.988615277484686670011157489572203134420118818648711986549881046321377798441006745317356200279801348355202517703531020643333388857073977704009782384103170022716610432579974132111487533733493986910583223121269323909760573942980360508642443245341392335557152177332615977623338526935953706604224108508582338123915133189529507760875123300397933931420500010248194253078118618381590347297853307090813639981736227771834732256867579490224181748450683295253634852775448770576585177080941820456051588076218688792321741398867304684922665590162004919486643750098085197190000638539994723704724550600891137853975703823903659121582583388450687255538838161486019214242094423895463814933532217776443473765708693285683261505695170847285063013324823850724236845500162436661946026097459146424122412596018946436589967013641971183281'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_ln VALUES (0,'NaN'); +INSERT INTO num_exp_ln VALUES (1,'11.353265918833698201334218522735144514838241118349715803442713722607336732214173255618762341321138898556011520430414052782971985419141860417968593746833898952016980791997105866598425597066404919489902082738711038276194174786383758877067916049129476352925010880025206629976454341252818402788928939407784629386362069592202090897264194883276572978998896242281239126931595483958092059051047739223830394259082355969005503976135238921488192773135287876801394308064862257453262299764712613486466254696464150007113953810688169396432889052881763511661127351872408811370081346456019961324265446884877073712053408327408917588393884214304220369626106333713688792094943405258431214313197283237071070354654837081449831786573831004911008790533179001070424813584405346221388686999574752038655226138085374176702005198770598232862'); +INSERT INTO num_exp_ln VALUES (2,'75.980172429959420723484178622920965327708652620924912610122049843800380131746381968266727388919414524075492921510147435877107720844487333947572033626887969846858337336557672107987074468763307953130616555202495401302128216460637786993535376622372745654109623249396257174895352222213037880060756992073605135503615371392439827458529942230210514752764526895030759481226199720092008002458654297737883219558685499445394647863430593136350562417924068100891680398878483362058595716232013516337079804607378041880078724811071904523716775991447489914128580100888252698281559809224785596795038122963619830942475652745611551345360922016753939774272970008770647516790944335173711498988149783075646985898883858697162003144539047532603946093022417842140993960433780913606807466518632121884254341907122163281927271483110212890483'); +INSERT INTO num_exp_ln VALUES (3,'86.992429107491709045555322727377654177072455841678650084144967727028762699430180506209786297136121512625728883607972513154010138109866327600596617277403558404624813332464431424791338402731178416819791932126837396086742033973404980654712734845137075562739300866280737071167943367603243180515859476717635339619107593771719314284984269343476343816253634799874584843436046260962736006310389088154751401911743739429257286834178656182340416539923956100441369280015412718483971113838923221170027312390404790743389872757674342133486652087007983701950040432125562287337697971646750563062524010514537132255605131615248097901911480464339325353279118429890601202554448469387179349495284716473293965884844451619766312048304583068386805927433174443889441171878078987788018564357316138422561213329104267180509029624308926098065'); +INSERT INTO num_exp_ln VALUES (4,'56.935276817066740776567329017240462885579486075188456418197311631774373422196025180114152248099799048545382060930401786002025479108787121595516444894009593031141335985913019897883627990503003577804436730367402618412514152465206336556967419434371593632864308139215157721913158949066717186782560422199668568894551013785702491365073449320535603830475158258853167712460432995074161536886421366716995573365924430692151761737886552457036412140640821310927642146210426044265504978418405684030862182425702683702307323138985481047994648222224089112998195621687911787785594701557252468626097576375468916953563766801336922479861708649876362257086586679701715813254414915314296890025577780265459584203893089574567331742100451277992780400302806430264717887468808962517029442262560742822875484362427192693300423729233467613910'); +INSERT INTO num_exp_ln VALUES (5,'20.296713391219923821414834924710998522858242536565236229645868008008504475111229451635162536658197320282791428572861452713483981402773630985812066048575864982038046409484905688236579134672910905547858248343712686247795669280482288748331949478864729205285910525962001251260319741279139167559906461672936902355959755164523720443059989357054368460911050707727029320725144824995614445423492687177126412520389766864793826362309254124276325522276592246655562770110024099522184080118637524912964002223613671995639705240767929562023556724031894855094820328152633412077228479168557819219970917880393852962560319397442566813746504969336443969816954424715197797253670026862362130664772772977978222813915593329422557592316429203293264572088112274848838446633519530653849595288125585730314673691986554304725866754516304420665'); +INSERT INTO num_exp_ln VALUES (6,'-3.058947463851998053084898503420969773173569760507671013593014983772013099601022840164736581595033399273677583253456908293015637115395777673836877852797643436458673662566205707359569792482081945396989472318998080581824382006377064185813936544714612287417301161454496258176319380348780934551188852900784476213986897306897793456700682073399936398243222895442594762628402487110466705108765286617060826203345783502301472192906817785365563881556293576463515218574477264521950513789471494214626744754200844840310516235570475410854073969787604451971790833680742315518808178608136598148628107328076871698598743664423452623124027059698038466681488746505289551548778131621576387262707147068500249466398507704796800459013580425992071957391417767257856002976954566094297724379688683375704613872658653366052459242767328235849'); +INSERT INTO num_exp_ln VALUES (7,'41.246780548917246608934265057073076900048579756649769602488660179351587788197892095257027979113051775079905924990472069951828742350559917110289416201523653941731339141666097617614477426376799479821365070373247490598890520285155435501242427296281987676879064510605563522117334502131946383957407685328562874307957108543536378261847119286989184256009392692140821396916222386573424618796707564187152459973446833193743614720624765332006827171872712331032607870580880807058576154429597725560836582655488602546786785520452359711161305828045237044625934404295366273012300148250900116489718279757540843657039519736455668388572899273464839528462223812926410544976290646668870192676914370659142463304861500879195867873346447316374869974900582948166687948531910220128160490935170837209017355954301127162240133341813847180541'); +INSERT INTO num_exp_ln VALUES (8,'22.862977375646110045361670561177818139082238721442691850491173190000619222046296383571431877856442345505931635735363450488731186880557789439424987680284612480261693386095598289519783790826332183796775862215503493910816035128476952347072320869461206895223935484838130924268616681347949695029657753251443811448783435000569829291535036468240771401957519222523032235686030017496209956550934543164421459898155836108824017735809352580723262896259290484291175350770265895317482371895188221452083719817251845416195168686335127805092334984596224320638378502008767433534450949989322562311171685891891122105437154553106840103473941148230953978989145470651955269817951560544095229079088083494695756914405635176899994279484466773598435268700064279990885608144109747858515514066444373797446449729058958270758597627587968112958'); +INSERT INTO num_exp_ln VALUES (9,'17.820358481980064387183481028572263407130633079314879566896470101569251997264841660326428805413719418277889123643557369421967068805165885825106611310020187894256310674762734896979157570968168599492401269694048046876387337971177513661006711375440365724346137980004810780215236524986274043416621637509807126148966029923572853117418545426960105154053049098579812135003711132897895016476695223444397389521434633067499404903493027304737402519428197015899833229473322655155458942323004249812974150129789653469524573801259946118454333405580647485894435301530550214095993989552176497867244278699359917247910082169086524111229983698975613609318418313798992088206507831757327320958918656453341769110558376097374227592021075267882222057385413453949580066342977546145482215220982989992069525148522710254796105001938615214263'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_log10 VALUES (0,'NaN'); +INSERT INTO num_exp_log10 VALUES (1,'4.930660740129727276654889314296515979425461685461970306647398411855044094312185293195497201658739777714943974003690119189101973212927970410047992001003936259467465542044528955416040460487922970233600641954269411521809500203864460110903973264337093883907933081597350982496469748131390809569321256206859934619579029279954574676601709408712255490686948453752571699579252140062805776361984468580258289509013081691778727372026090522694670379557247829136504595898935235926069699309392675806881162434168418505908116911054206058735257796918687777716036307205415038158583184624809880157060625643069601549803887864772092583549388533013233603450097615537162442973385137488450178790573546382354482351187412256794374383453695483855501587939419102008302408157959291557415763034668013452188944554607063362933134950906875499201'); +INSERT INTO num_exp_log10 VALUES (2,'32.997769620388965086774969704518222090258389987679691893351902336370051104718852164011301929506188893338106627980171059175447833290713847317665944354651476245003161501753612545484635275306181777040447675475670149066399611203341262105766118892586541910243351018829302798733989560900125591073082441126709911019648451232244139674063434385451279378543163944005973452562993913383659295688375546058256196254319767218634546732685705517341998116744642480938405113447415486950667007645850519659606476727681944251201236366198374488204017630268083077471516734133869728427050843306716313813724061560369884508660845630727190444623729815564381063131729592825825486515070406390371638817503915214206586939112681762984038333298146999891250107667687034785493312416966635780188163871680959873288697497561452228182734430749066579749'); +INSERT INTO num_exp_log10 VALUES (3,'37.780331928743475574895606142114739140772838801045013007323050327909196792739138159615327729728110344767302636436234256468332011934881494997184865617793179255006442447189720642997935223133982347184994174261506212652322213673745795726283311685835974151422721233207287206894148660531800622455957268888702309499182978182878524951883775154983702898237404558813230370364953160102391101897560104513279410610948028599674950811462114131673380477843456965645417025376374320207504913806546872166094337441573669261285052323206348035827948287081776955945081345131570610652073053464020209215624179904586956137079321655773178387441622685682721151900601340680061607114354850640946256225260430676099781727317540719923791064452012925902993317349390523278687089530234444415688602090547516647302454865526291471706301790881694022223'); +INSERT INTO num_exp_log10 VALUES (4,'24.726676547286224970759328746582840552419566534667446425423046931401641497155587075591229106937829957279943690528061985864558314570189069764367933957499905044566413640017549478921384160584906257607957223101377816440084188042395098536074479064548620374152344954289432050971466476174493306432228880930006524504974367146536665170956555486181410864034862861231267121149652317599303804477688621597163730470970207231328339082779056152481480926452142005969020950341307977091850953883445808399574256295803245530993204179747743812544604144379381347499056545148243304041538981954204310612049423688645476667184129189153715486929216331980316967699254518020077226689317148303152585009031597809279387172427408557115400021035692880631275593381822805377317270568779655383061987766693697518921188619814204902583361096973421134004'); +INSERT INTO num_exp_log10 VALUES (5,'8.814750626578650238811431417807018895270298639823442501111235973209197727215795256506525221092818797578008152140054383421240180435087611869193019443372556081555311825248667278358330916098378127100899126895012782320751838528480712942601038190627182482614147263228588284866661508052724762701223357327343090598060805245853527435948381893458352744679795853650453594546267600486696643924152372736774331080527157374379043696696647158270918245668579680394279565181670004245143555617589138267976417280970718829942998800499312890580011246294669585429723974582350357991472101919333996770115834067969654217063942059882195268353998096891812525364797586486311202350700339609637274043915687880562465121559531284337603363356183320193656553931871200575467929714875483123706358278876389849119105053294688326141759401230994901405'); +INSERT INTO num_exp_log10 VALUES (6,'-1.328484003982869642690619298690906747763234110040562640557173509402512757735587333095924652711056556491908059708986413635120656426593745303715671199761364516107844087845783714418487426723538440387069985879601248897538855843115404484229652166941838283489828419407478748732927617251897244190697443966424660881366993754577233476597163021768156814527570512834684713730559883782625870597080940193303268818336816535968869931456641949301731046034660616615392129109391145214470757259042172416816936479713743188047425796931722546185493217275537303458837771965375448968719169174136287532752370175863826715450565025635651343928205805494319778539652563499901671319955144823432132740582617949774638538594081514904904341299199113721131520557004571803778698005652464301037962272085633628653321081368256925971558076970172779715'); +INSERT INTO num_exp_log10 VALUES (7,'17.913249188669140643510654105014358282516966474257460687880559542190804665566625978925406311113121982595279826214959603627387555578965653325278444455875162277940655989601428868642914577248262147833499137348602966573601719040813549936948178463592211685237720748377879836890106515699728652218324794927458352954247096536337594789471529493944292143186953509162522579060020018226817623648563806559917579317916242706559131476179714031602207057714677845347616752450567251644277767418397621490301286115159509360375419599968738067461569666699939732107480135216621373057421990702923042287910730395998082514702629760389192370666675364405730936537832803383367187639209534697198515928978064543150195911463663617683085348965065679311986715357338675515370634753254774665197233934933271954463040729779956682570415317734489164385'); +INSERT INTO num_exp_log10 VALUES (8,'9.929264914121995501917993119394933531225401243275938207624866270551448544301376913376130982251708700134720886862945040266148728213253651323129942781577143957084726727561987639140151337848818195806259935747329665025823709044567138449084349729747202164413995795609659711723455165142329822773177102845804114214340046404641970845707372809306219463962664551623665322610139794354769767829380018857313559373283673392337954610346290037758389035140213224696023751541663171574697035012610534455189013755134090933979479069288110010954211669067225249755249337768792642303351914884187159646984708862430789018895140670365476746734456807215043628059581947593694929159076346249490593187993386780521089745819640214783614157516171005086731241769146397577246387886107367648843380733370112546792442909347322732196805316614555689762'); +INSERT INTO num_exp_log10 VALUES (9,'7.739283354261751283625223433456284905560931805428759681411970457812279544250432389511382263439324085689734710188041049046660480575958686859942980599595036769090747781359217248301544587434077376812293034848418204834388504169166350770257248896025815531248627658465029806509131631454856186387892627989218208026727504548130018922325585619738185507999433763118148418722504204066578294826264005398891049629199412773138457218976050467479292777172717500219850781664314597312411301296201533610562886229900497272268364496763758868455934979903774531992886483396489868888731578355541611359130188566524240259770918423445785338175040098706500034487703124623745259139247432324145633151895802637182446905097253961951018926565652497920605819785424451050191604602898777804133717341512568151920576684198443843944721398831404081859'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_power_10_ln VALUES (0,'NaN'); +INSERT INTO num_exp_power_10_ln VALUES (1,'225561990715.277245515991117670624124484084762557459065170589803293759247930753528436379932442146759103295277479258327642314622036941865221478746258727236601688778946696303277607709407496616423493315166963938393760548678730128692212077086588682984700837334554241405763691119669847463520746595280034536307041368063462023793177898200220207765205127584303464304601759554817607633012272490650155253979182893585119965271975927569080191838676053084168631217591768468344106219831174026139608715965691941366334940196517120885214887008671956523579678156919416435031020452971977153991139145404842034138317592877675821045409772456977018293365238179815614004574330200783530118851005077771478448804470170641452481992602803877112958872108069738434946694089025321283178188028224338756015337492913115267362635647236447601252924834642796058'); +INSERT INTO num_exp_power_10_ln VALUES (2,'9553718264533556311125292459627965006385666643531070061102266984368939757379.536714147420215784125170401370065894858487440153494392538261078415409784085960333028254155527328359894197540839556987826344995348426293585457768226283066583722499658006242709930685932246087653832230889613022921575445199055131152661556678809191264086381976922223866204038615136758192929883317207903579770917317641181652055458721731297347443662717939116561947785705140374908203404860090658919334137955075887697259604047657534191202566335372150375993361370075961180728155127447781364264047857624746079509591666068708743260905728661917791822925979235918475633100283148558978385583805341715868143937062092264994833222352433299015979561976964779350640064096690062929265992966564232453102431600199173711947391200249130712039686700111791790265309426741120465259677894665532560198051256215915373145226284270408649736509'); +INSERT INTO num_exp_power_10_ln VALUES (3,'982718444846268846508445482774217796844461660819285525931206164100817251856409365450682.362683768066405322653747385034480250394145008573806022660379219602846285813744865438912887625784087005970975437905783802114553690522787857272953842288090141945268495451006273685577260054069522075046955466204804067271437138871789034722069934693546671607506851844248427950939791205412350536883779850165603116191193657054604569586553874805856647223849267039531773072343908345333155562072887754900969504551717514980465801806565999410206735831440712124661645970935112535081991606671600328471264697018198676317466846450405861359235297846597981143547119390922405594115478086038680663368675222949247096131378724350715530605691796680604309063173515781378545860473572389718345696107553363715518601596249508215455106779522851210398208919496668879040223859884166805448827948087400426315425231119801173387715922086154065273'); +INSERT INTO num_exp_power_10_ln VALUES (4,'861542720105376650266753999919217194383259935058507531116.774511336660822591851369622743235084609149542494189385785321912210129989390054947787009383210009523204976629456268332186620016067379702483800883493431423160815760933380418976582725913410929214462739708321325884209636272001805871036779154087677637129248122540412937033791526383240502286607736226090213753913654673523613612439527815137888202973659987501649474772884055648603290154867585312925699571949539600328906295652872654314913539778815035321695215634102441494403825526533235061083947035338872599854931230001361227174477274708230470794066733245241594719912710139298949856243576688344051439047966427547889756037265151798639614843866387316916203238068277912991427278268083231579195846744438643659745041780103653332041031419793815914447232121937821142169172566753399257291244398531365781832297786941359729799400'); +INSERT INTO num_exp_power_10_ln VALUES (5,'198021976607570296508.271597639984889464620426933601643322058775615235389194561064983706229795978402690473201671702614911129095149240715527556855309177671128442458698638704394974473956869419481315262823632891676087912529523219333012290621046361106033860210270638559271706082115529424772192777643046125905852037759566224116373416253787241195450409652089019290072319861181399387753223422998872180810295299831487867222464355713552301775702554189470264147325049133532522718679336524769566984150923939420759804463781082299907043016120177416779442865059261387111806785876531152192378576258351599534512031062777609734092707165605364139201322351960602280089186180302246827234844736393745487324460438448807241887783263546165171099497316415863122023114646876909575845860402164818094500541234974716577550807551946414081410743197768993152975501'); +INSERT INTO num_exp_power_10_ln VALUES (6,'.000873076977206566818052116526263730226812004454463281371489634779519089200224205946321120805055212090024554381349223642352209212670470260295303361873760972918129853308169576675500721645609379420329169271088810484607337679253503247351324049221970104335289487989027621978310506220905131150125321713385148268584530413680037620544212746920563790371941626294733473967065607791756894237438288480748407449237446113996117912144587258434808327522518688617394025018756570740098795745692805352377041347367240475846033282850136270250633825482156304826383360291164928049344226886150285595932088884965511963310715773499733217615863523253012606066583814112265708693122563204149232245895551314975524172504103194858904869273185785182598234060315036187756490539352752560361560286717869643902435677448962235275054804452967413005'); +INSERT INTO num_exp_power_10_ln VALUES (7,'176514565873872717825163931126806100435750.096278384530154766967061948052237623936423931849868926020451465515367348890410352640552194499619062823622476972850692557798609619250753020363520533767813563613425606228355802781302735485038377521515850536680425059519814786118919994914180918228654298075183514200191737597656810036850772127169441661576862538643715648802139886576391427423689320082366572297580054381937437005879583216745596935643579262248665490169331304003204939561361718554509909313409421397022626924406091551900222555950699170864234411017062042057683304265485826061096835531732950909546314722726990314852356462874701181085379772134121978510387397276859318242238150439474660772561390798432890789762504242822787017140808209820627435991445529404692793744568204608385843245177656436105160780897472099970336514833257055017279707999437302548655364559'); +INSERT INTO num_exp_power_10_ln VALUES (8,'72941951052009383458167.300747500436981484566111756088702608000390737594784514635592222758882092500858797317505303492923829092720870826490477962201959426813271424853341826896270963213736922458746003100613943600855942721319226948714369219316345322636075285343544788982588956431405042577296229122673590336976893594798942025893296105815818487227300314490440902574022885833779324177053242170024559675073866612316965636832258283516275906085642459351367507561963945012828379111856700009391438637054015804558386733558956649061672420804826896303889067785497738203077050774825608647969196321506624991188638449047860249367840775936911749905927108478444112230174584693363226143549933224252679398881354887872642908328737917862751077365602631600279486028043329404269490375935308156815477700961014566228692743960491745353377403533037122586797765130'); +INSERT INTO num_exp_power_10_ln VALUES (9,'661239032819374816.097553651299556484820492272269662685578275493609248662925676004753503494252951243895572437264999063878330704584509915845096232798927524470286655554736724913758600775591269525423912692080421094644542553026831758426157681271572808657664918053119324646138457659418857926209701677786068580819823633713337632456905824562235373422309621872998037966404189020165296080436871220718574009921789858751384547836431858428729570977259373272041837411903005303672798845573379758630607982213326716018594073712340609488043353995410508475153538231445235003980586600882223782814368245305160648543466496726973755388826656879616734762068443462618454921858705377028522664844761719759342490380417060255776725333319537746890406213693117052223545525717132695297770810635066731941724108167146710297146989770382041617889670713111888375717'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_data VALUES (0, '0'); +INSERT INTO num_data VALUES (1, '85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_data VALUES (2, '-994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_data VALUES (3, '-60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_data VALUES (4, '5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_data VALUES (5, '-652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_data VALUES (6, '0.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_data VALUES (7, '-818934540071845742'); +INSERT INTO num_data VALUES (8, '8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_data VALUES (9, '054863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +COMMIT TRANSACTION; +-- ****************************** +-- * Create indices for faster checks +-- ****************************** +CREATE UNIQUE INDEX num_exp_add_idx ON num_exp_add (id1, id2); +CREATE UNIQUE INDEX num_exp_sub_idx ON num_exp_sub (id1, id2); +CREATE UNIQUE INDEX num_exp_div_idx ON num_exp_div (id1, id2); +CREATE UNIQUE INDEX num_exp_mul_idx ON num_exp_mul (id1, id2); +CREATE UNIQUE INDEX num_exp_sqrt_idx ON num_exp_sqrt (id); +CREATE UNIQUE INDEX num_exp_ln_idx ON num_exp_ln (id); +CREATE UNIQUE INDEX num_exp_log10_idx ON num_exp_log10 (id); +CREATE UNIQUE INDEX num_exp_power_10_ln_idx ON num_exp_power_10_ln (id); +VACUUM ANALYZE num_exp_add; +VACUUM ANALYZE num_exp_sub; +VACUUM ANALYZE num_exp_div; +VACUUM ANALYZE num_exp_mul; +VACUUM ANALYZE num_exp_sqrt; +VACUUM ANALYZE num_exp_ln; +VACUUM ANALYZE num_exp_log10; +VACUUM ANALYZE num_exp_power_10_ln; +-- ****************************** +-- * Now check the behaviour of the NUMERIC type +-- ****************************** +-- ****************************** +-- * Addition check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_add t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 10) as expected + FROM num_result t1, num_exp_add t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 10); + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Subtraction check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_sub t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 40) + FROM num_result t1, num_exp_sub t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 40); + id1 | id2 | result | round +-----+-----+--------+------- +(0 rows) + +-- ****************************** +-- * Multiply check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_mul t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 30) as expected + FROM num_result t1, num_exp_mul t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 30); + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Division check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val / t2.val + FROM num_data t1, num_data t2 + WHERE t2.val != '0.0'; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_div t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val / t2.val, 80) + FROM num_data t1, num_data t2 + WHERE t2.val != '0.0'; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 80) as expected + FROM num_result t1, num_exp_div t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 80); + id1 | id2 | result | expected +-----+-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Square root check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, SQRT(ABS(val)) + FROM num_data; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_sqrt t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + id1 | result | expected +-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Natural logarithm check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, LN(ABS(val)) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_ln t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + id1 | result | expected +-----+--------+---------- +(0 rows) + +-- ****************************** +-- * Logarithm base 10 check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, LOG('10'::numeric, ABS(val)) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_log10 t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + id1 | result | expected +-----+--------+---------- +(0 rows) + +-- ****************************** +-- * POW(10, LN(value)) check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, POW(numeric '10', LN(ABS(round(val,1000)))) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_power_10_ln t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + id1 | result | expected +-----+--------+---------- +(0 rows) + +-- +-- Test code path for raising to integer powers +-- +-- base less than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of POW(): +-- +-- for p in {-20..20} +-- do +-- b="0.084738" +-- r=$(bc -ql <<< "scale=500 ; $b^$p" | head -n 1) +-- echo "($b, $p, $r)," +-- done +WITH t(b, p, bc_result) AS (VALUES +(0.084738, -20, 2744326694304960114888.7859130502035257), +(0.084738, -19, 232548755422013710215.4459407000481464), +(0.084738, -18, 19705716436950597776.2364581230406798), +(0.084738, -17, 1669822999434319754.3627249884302211), +(0.084738, -16, 141497461326065387.3451885900696001), +(0.084738, -15, 11990211877848128.7928565907453178), +(0.084738, -14, 1016026574105094.7376490817865767), +(0.084738, -13, 86096059836517.5178789078924309), +(0.084738, -12, 7295607918426.8214300228969888), +(0.084738, -11, 618215223791.6519943372802450), +(0.084738, -10, 52386321633.6570066961524534), +(0.084738, -9, 4439112122.5928274334185666), +(0.084738, -8, 376161483.0442710110530225), +(0.084738, -7, 31875171.7502054369346110), +(0.084738, -6, 2701038.3037689083149651), +(0.084738, -5, 228880.5837847697527935), +(0.084738, -4, 19394.8829087538193122), +(0.084738, -3, 1643.4835879219811409), +(0.084738, -2, 139.2655122733328379), +(0.084738, -1, 11.8010809790176780), +(0.084738, 0, 1), +(0.084738, 1, .084738), +(0.084738, 2, .007180528644), +(0.084738, 3, .0006084636362353), +(0.084738, 4, .0000515599916073), +(0.084738, 5, .0000043690905688), +(0.084738, 6, .0000003702279966), +(0.084738, 7, .0000000313723800), +(0.084738, 8, .0000000026584327), +(0.084738, 9, .0000000002252703), +(0.084738, 10, .0000000000190890), +(0.084738, 11, .0000000000016176), +(0.084738, 12, .0000000000001371), +(0.084738, 13, .0000000000000116), +(0.084738, 14, .0000000000000010), +(0.084738, 15, .0000000000000001), +(0.084738, 16, .0000000000000000), +(0.084738, 17, .0000000000000000), +(0.084738, 18, .0000000000000000), +(0.084738, 19, .0000000000000000), +(0.084738, 20, .0000000000000000)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + b | p | bc_result | power | diff +----------+-----+-----------------------------------------+-----------------------------------------+-------------------- + 0.084738 | -20 | 2744326694304960114888.7859130502035257 | 2744326694304960114888.7859130502035257 | 0.0000000000000000 + 0.084738 | -19 | 232548755422013710215.4459407000481464 | 232548755422013710215.4459407000481464 | 0.0000000000000000 + 0.084738 | -18 | 19705716436950597776.2364581230406798 | 19705716436950597776.2364581230406798 | 0.0000000000000000 + 0.084738 | -17 | 1669822999434319754.3627249884302211 | 1669822999434319754.3627249884302211 | 0.0000000000000000 + 0.084738 | -16 | 141497461326065387.3451885900696001 | 141497461326065387.3451885900696001 | 0.0000000000000000 + 0.084738 | -15 | 11990211877848128.7928565907453178 | 11990211877848128.7928565907453178 | 0.0000000000000000 + 0.084738 | -14 | 1016026574105094.7376490817865767 | 1016026574105094.7376490817865767 | 0.0000000000000000 + 0.084738 | -13 | 86096059836517.5178789078924309 | 86096059836517.5178789078924309 | 0.0000000000000000 + 0.084738 | -12 | 7295607918426.8214300228969888 | 7295607918426.8214300228969888 | 0.0000000000000000 + 0.084738 | -11 | 618215223791.6519943372802450 | 618215223791.6519943372802450 | 0.0000000000000000 + 0.084738 | -10 | 52386321633.6570066961524534 | 52386321633.6570066961524534 | 0.0000000000000000 + 0.084738 | -9 | 4439112122.5928274334185666 | 4439112122.5928274334185666 | 0.0000000000000000 + 0.084738 | -8 | 376161483.0442710110530225 | 376161483.0442710110530225 | 0.0000000000000000 + 0.084738 | -7 | 31875171.7502054369346110 | 31875171.7502054369346110 | 0.0000000000000000 + 0.084738 | -6 | 2701038.3037689083149651 | 2701038.3037689083149651 | 0.0000000000000000 + 0.084738 | -5 | 228880.5837847697527935 | 228880.5837847697527935 | 0.0000000000000000 + 0.084738 | -4 | 19394.8829087538193122 | 19394.8829087538193122 | 0.0000000000000000 + 0.084738 | -3 | 1643.4835879219811409 | 1643.4835879219811409 | 0.0000000000000000 + 0.084738 | -2 | 139.2655122733328379 | 139.2655122733328379 | 0.0000000000000000 + 0.084738 | -1 | 11.8010809790176780 | 11.8010809790176780 | 0.0000000000000000 + 0.084738 | 0 | 1 | 1.0000000000000000 | 0.0000000000000000 + 0.084738 | 1 | 0.084738 | 0.0847380000000000 | 0.0000000000000000 + 0.084738 | 2 | 0.007180528644 | 0.0071805286440000 | 0.0000000000000000 + 0.084738 | 3 | 0.0006084636362353 | 0.0006084636362353 | 0.0000000000000000 + 0.084738 | 4 | 0.0000515599916073 | 0.0000515599916073 | 0.0000000000000000 + 0.084738 | 5 | 0.0000043690905688 | 0.0000043690905688 | 0.0000000000000000 + 0.084738 | 6 | 0.0000003702279966 | 0.0000003702279966 | 0.0000000000000000 + 0.084738 | 7 | 0.0000000313723800 | 0.0000000313723800 | 0.0000000000000000 + 0.084738 | 8 | 0.0000000026584327 | 0.0000000026584327 | 0.0000000000000000 + 0.084738 | 9 | 0.0000000002252703 | 0.0000000002252703 | 0.0000000000000000 + 0.084738 | 10 | 0.0000000000190890 | 0.0000000000190890 | 0.0000000000000000 + 0.084738 | 11 | 0.0000000000016176 | 0.0000000000016176 | 0.0000000000000000 + 0.084738 | 12 | 0.0000000000001371 | 0.0000000000001371 | 0.0000000000000000 + 0.084738 | 13 | 0.0000000000000116 | 0.0000000000000116 | 0.0000000000000000 + 0.084738 | 14 | 0.0000000000000010 | 0.0000000000000010 | 0.0000000000000000 + 0.084738 | 15 | 0.0000000000000001 | 0.0000000000000001 | 0.0000000000000000 + 0.084738 | 16 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 0.084738 | 17 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 0.084738 | 18 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 0.084738 | 19 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 0.084738 | 20 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 +(41 rows) + +-- base greater than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of POW(): +-- +-- for p in {-20..20} +-- do +-- b="37.821637" +-- r=$(bc -ql <<< "scale=500 ; $b^$p" | head -n 1) +-- echo "($b, $p, $r)," +-- done +WITH t(b, p, bc_result) AS (VALUES +(37.821637, -20, .0000000000000000), +(37.821637, -19, .0000000000000000), +(37.821637, -18, .0000000000000000), +(37.821637, -17, .0000000000000000), +(37.821637, -16, .0000000000000000), +(37.821637, -15, .0000000000000000), +(37.821637, -14, .0000000000000000), +(37.821637, -13, .0000000000000000), +(37.821637, -12, .0000000000000000), +(37.821637, -11, .0000000000000000), +(37.821637, -10, .0000000000000002), +(37.821637, -9, .0000000000000063), +(37.821637, -8, .0000000000002388), +(37.821637, -7, .0000000000090327), +(37.821637, -6, .0000000003416316), +(37.821637, -5, .0000000129210673), +(37.821637, -4, .0000004886959182), +(37.821637, -3, .0000184832796213), +(37.821637, -2, .0006990678924066), +(37.821637, -1, .0264398920649574), +(37.821637, 0, 1), +(37.821637, 1, 37.821637), +(37.821637, 2, 1430.476225359769), +(37.821637, 3, 54102.9525326873775219), +(37.821637, 4, 2046262.2313195326271135), +(37.821637, 5, 77392987.3197773940323425), +(37.821637, 6, 2927129472.7542235178972258), +(37.821637, 7, 110708828370.5116321107718772), +(37.821637, 8, 4187189119324.7924539711577286), +(37.821637, 9, 158366346921451.9852944363360812), +(37.821637, 10, 5989674486279224.5007355092228730), +(37.821637, 11, 226539294168214309.7083246628376531), +(37.821637, 12, 8568086950266418559.9938312759931069), +(37.821637, 13, 324059074417413536066.1494087598581043), +(37.821637, 14, 12256444679171401239980.3109258799733927), +(37.821637, 15, 463558801566202198479885.2069857662592280), +(37.821637, 16, 17532552720991931019508170.1002855156233684), +(37.821637, 17, 663109844696719094948877928.0672523682648687), +(37.821637, 18, 25079899837245684700124994552.6717306599041850), +(37.821637, 19, 948562867640665366544581398598.1275771806665398), +(37.821637, 20, 35876200451584291931921101974730.6901038166532866)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + b | p | bc_result | power | diff +-----------+-----+---------------------------------------------------+---------------------------------------------------+-------------------- + 37.821637 | -20 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -19 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -18 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -17 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -16 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -15 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -14 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -13 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -12 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -11 | 0.0000000000000000 | 0.0000000000000000 | 0.0000000000000000 + 37.821637 | -10 | 0.0000000000000002 | 0.0000000000000002 | 0.0000000000000000 + 37.821637 | -9 | 0.0000000000000063 | 0.0000000000000063 | 0.0000000000000000 + 37.821637 | -8 | 0.0000000000002388 | 0.0000000000002388 | 0.0000000000000000 + 37.821637 | -7 | 0.0000000000090327 | 0.0000000000090327 | 0.0000000000000000 + 37.821637 | -6 | 0.0000000003416316 | 0.0000000003416316 | 0.0000000000000000 + 37.821637 | -5 | 0.0000000129210673 | 0.0000000129210673 | 0.0000000000000000 + 37.821637 | -4 | 0.0000004886959182 | 0.0000004886959182 | 0.0000000000000000 + 37.821637 | -3 | 0.0000184832796213 | 0.0000184832796213 | 0.0000000000000000 + 37.821637 | -2 | 0.0006990678924066 | 0.0006990678924066 | 0.0000000000000000 + 37.821637 | -1 | 0.0264398920649574 | 0.0264398920649574 | 0.0000000000000000 + 37.821637 | 0 | 1 | 1.0000000000000000 | 0.0000000000000000 + 37.821637 | 1 | 37.821637 | 37.8216370000000000 | 0.0000000000000000 + 37.821637 | 2 | 1430.476225359769 | 1430.4762253597690000 | 0.0000000000000000 + 37.821637 | 3 | 54102.9525326873775219 | 54102.9525326873775219 | 0.0000000000000000 + 37.821637 | 4 | 2046262.2313195326271135 | 2046262.2313195326271135 | 0.0000000000000000 + 37.821637 | 5 | 77392987.3197773940323425 | 77392987.3197773940323425 | 0.0000000000000000 + 37.821637 | 6 | 2927129472.7542235178972258 | 2927129472.7542235178972258 | 0.0000000000000000 + 37.821637 | 7 | 110708828370.5116321107718772 | 110708828370.5116321107718772 | 0.0000000000000000 + 37.821637 | 8 | 4187189119324.7924539711577286 | 4187189119324.7924539711577286 | 0.0000000000000000 + 37.821637 | 9 | 158366346921451.9852944363360812 | 158366346921451.9852944363360812 | 0.0000000000000000 + 37.821637 | 10 | 5989674486279224.5007355092228730 | 5989674486279224.5007355092228730 | 0.0000000000000000 + 37.821637 | 11 | 226539294168214309.7083246628376531 | 226539294168214309.7083246628376531 | 0.0000000000000000 + 37.821637 | 12 | 8568086950266418559.9938312759931069 | 8568086950266418559.9938312759931069 | 0.0000000000000000 + 37.821637 | 13 | 324059074417413536066.1494087598581043 | 324059074417413536066.1494087598581043 | 0.0000000000000000 + 37.821637 | 14 | 12256444679171401239980.3109258799733927 | 12256444679171401239980.3109258799733927 | 0.0000000000000000 + 37.821637 | 15 | 463558801566202198479885.2069857662592280 | 463558801566202198479885.2069857662592280 | 0.0000000000000000 + 37.821637 | 16 | 17532552720991931019508170.1002855156233684 | 17532552720991931019508170.1002855156233684 | 0.0000000000000000 + 37.821637 | 17 | 663109844696719094948877928.0672523682648687 | 663109844696719094948877928.0672523682648687 | 0.0000000000000000 + 37.821637 | 18 | 25079899837245684700124994552.6717306599041850 | 25079899837245684700124994552.6717306599041850 | 0.0000000000000000 + 37.821637 | 19 | 948562867640665366544581398598.1275771806665398 | 948562867640665366544581398598.1275771806665398 | 0.0000000000000000 + 37.821637 | 20 | 35876200451584291931921101974730.6901038166532866 | 35876200451584291931921101974730.6901038166532866 | 0.0000000000000000 +(41 rows) + +-- +-- Tests for raising to non-integer powers +-- +-- base less than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of POW(): +-- +-- for n in {-20..20} +-- do +-- b="0.06933247" +-- p="$n.342987" +-- r=$(bc -ql <<< "scale=500 ; e($p*l($b))" | head -n 1) +-- echo "($b, $p, $r)," +-- done +WITH t(b, p, bc_result) AS (VALUES +(0.06933247, -20.342987, 379149253615977128356318.39406340), +(0.06933247, -19.342987, 26287354251852125772450.59436685), +(0.06933247, -18.342987, 1822567200045909954554.65766042), +(0.06933247, -17.342987, 126363085720167050546.86216560), +(0.06933247, -16.342987, 8761064849800910427.02880469), +(0.06933247, -15.342987, 607426265866876128.15466179), +(0.06933247, -14.342987, 42114363355427213.14899924), +(0.06933247, -13.342987, 2919892833909256.59283660), +(0.06933247, -12.342987, 202443382310228.51544515), +(0.06933247, -11.342987, 14035899730722.44924025), +(0.06933247, -10.342987, 973143597003.32229028), +(0.06933247, -9.342987, 67470449244.92493259), +(0.06933247, -8.342987, 4677892898.16028054), +(0.06933247, -7.342987, 324329869.02491071), +(0.06933247, -6.342987, 22486590.914273551), +(0.06933247, -5.342987, 1559050.8899661435), +(0.06933247, -4.342987, 108092.84905705095), +(0.06933247, -3.342987, 7494.3442144625131), +(0.06933247, -2.342987, 519.60139541889576), +(0.06933247, -1.342987, 36.025248159838727), +(0.06933247, 0.342987, .40036522320023350), +(0.06933247, 1.342987, .02775830982657349), +(0.06933247, 2.342987, .001924552183301612), +(0.06933247, 3.342987, .0001334339565121935), +(0.06933247, 4.342987, .000009251305786862961), +(0.06933247, 5.342987, .0000006414158809285026), +(0.06933247, 6.342987, .00000004447094732199898), +(0.06933247, 7.342987, .000000003083280621074075), +(0.06933247, 8.342987, .0000000002137714611621997), +(0.06933247, 9.342987, .00000000001482130341788437), +(0.06933247, 10.342987, .000000000001027597574581366), +(0.06933247, 11.342987, .00000000000007124587801173530), +(0.06933247, 12.342987, .000000000000004939652699872298), +(0.06933247, 13.342987, .0000000000000003424783226243151), +(0.06933247, 14.342987, .00000000000000002374486802900065), +(0.06933247, 15.342987, .000000000000000001646290350274646), +(0.06933247, 16.342987, .0000000000000000001141413763217064), +(0.06933247, 17.342987, .000000000000000000007913703549583420), +(0.06933247, 18.342987, .0000000000000000000005486766139403860), +(0.06933247, 19.342987, .00000000000000000000003804110487572339), +(0.06933247, 20.342987, .000000000000000000000002637483762562946)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + b | p | bc_result | power | diff +------------+------------+-------------------------------------------+-------------------------------------------+------------------------------------------- + 0.06933247 | -20.342987 | 379149253615977128356318.39406340 | 379149253615977128356318.39406340 | 0.00000000 + 0.06933247 | -19.342987 | 26287354251852125772450.59436685 | 26287354251852125772450.59436685 | 0.00000000 + 0.06933247 | -18.342987 | 1822567200045909954554.65766042 | 1822567200045909954554.65766042 | 0.00000000 + 0.06933247 | -17.342987 | 126363085720167050546.86216560 | 126363085720167050546.86216560 | 0.00000000 + 0.06933247 | -16.342987 | 8761064849800910427.02880469 | 8761064849800910427.02880469 | 0.00000000 + 0.06933247 | -15.342987 | 607426265866876128.15466179 | 607426265866876128.15466179 | 0.00000000 + 0.06933247 | -14.342987 | 42114363355427213.14899924 | 42114363355427213.14899924 | 0.00000000 + 0.06933247 | -13.342987 | 2919892833909256.59283660 | 2919892833909256.59283660 | 0.00000000 + 0.06933247 | -12.342987 | 202443382310228.51544515 | 202443382310228.51544515 | 0.00000000 + 0.06933247 | -11.342987 | 14035899730722.44924025 | 14035899730722.44924025 | 0.00000000 + 0.06933247 | -10.342987 | 973143597003.32229028 | 973143597003.32229028 | 0.00000000 + 0.06933247 | -9.342987 | 67470449244.92493259 | 67470449244.92493259 | 0.00000000 + 0.06933247 | -8.342987 | 4677892898.16028054 | 4677892898.16028054 | 0.00000000 + 0.06933247 | -7.342987 | 324329869.02491071 | 324329869.02491071 | 0.00000000 + 0.06933247 | -6.342987 | 22486590.914273551 | 22486590.914273551 | 0.000000000 + 0.06933247 | -5.342987 | 1559050.8899661435 | 1559050.8899661435 | 0.0000000000 + 0.06933247 | -4.342987 | 108092.84905705095 | 108092.84905705095 | 0.00000000000 + 0.06933247 | -3.342987 | 7494.3442144625131 | 7494.3442144625131 | 0.0000000000000 + 0.06933247 | -2.342987 | 519.60139541889576 | 519.60139541889576 | 0.00000000000000 + 0.06933247 | -1.342987 | 36.025248159838727 | 36.025248159838727 | 0.000000000000000 + 0.06933247 | 0.342987 | 0.40036522320023350 | 0.4003652232002335 | 0.00000000000000000 + 0.06933247 | 1.342987 | 0.02775830982657349 | 0.02775830982657349 | 0.00000000000000000 + 0.06933247 | 2.342987 | 0.001924552183301612 | 0.001924552183301612 | 0.000000000000000000 + 0.06933247 | 3.342987 | 0.0001334339565121935 | 0.0001334339565121935 | 0.0000000000000000000 + 0.06933247 | 4.342987 | 0.000009251305786862961 | 0.000009251305786862961 | 0.000000000000000000000 + 0.06933247 | 5.342987 | 0.0000006414158809285026 | 0.0000006414158809285026 | 0.0000000000000000000000 + 0.06933247 | 6.342987 | 0.00000004447094732199898 | 0.00000004447094732199898 | 0.00000000000000000000000 + 0.06933247 | 7.342987 | 0.000000003083280621074075 | 0.000000003083280621074075 | 0.000000000000000000000000 + 0.06933247 | 8.342987 | 0.0000000002137714611621997 | 0.0000000002137714611621997 | 0.0000000000000000000000000 + 0.06933247 | 9.342987 | 0.00000000001482130341788437 | 0.00000000001482130341788437 | 0.00000000000000000000000000 + 0.06933247 | 10.342987 | 0.000000000001027597574581366 | 0.000000000001027597574581366 | 0.000000000000000000000000000 + 0.06933247 | 11.342987 | 0.00000000000007124587801173530 | 0.00000000000007124587801173530 | 0.00000000000000000000000000000 + 0.06933247 | 12.342987 | 0.000000000000004939652699872298 | 0.000000000000004939652699872298 | 0.000000000000000000000000000000 + 0.06933247 | 13.342987 | 0.0000000000000003424783226243151 | 0.0000000000000003424783226243151 | 0.0000000000000000000000000000000 + 0.06933247 | 14.342987 | 0.00000000000000002374486802900065 | 0.00000000000000002374486802900065 | 0.00000000000000000000000000000000 + 0.06933247 | 15.342987 | 0.000000000000000001646290350274646 | 0.000000000000000001646290350274646 | 0.000000000000000000000000000000000 + 0.06933247 | 16.342987 | 0.0000000000000000001141413763217064 | 0.0000000000000000001141413763217064 | 0.0000000000000000000000000000000000 + 0.06933247 | 17.342987 | 0.000000000000000000007913703549583420 | 0.000000000000000000007913703549583420 | 0.000000000000000000000000000000000000 + 0.06933247 | 18.342987 | 0.0000000000000000000005486766139403860 | 0.0000000000000000000005486766139403860 | 0.0000000000000000000000000000000000000 + 0.06933247 | 19.342987 | 0.00000000000000000000003804110487572339 | 0.00000000000000000000003804110487572339 | 0.00000000000000000000000000000000000000 + 0.06933247 | 20.342987 | 0.000000000000000000000002637483762562946 | 0.000000000000000000000002637483762562946 | 0.000000000000000000000000000000000000000 +(41 rows) + +-- base greater than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of POW(): +-- +-- for n in {-20..20} +-- do +-- b="27.234987" +-- p="$n.230957" +-- r=$(bc -ql <<< "scale=500 ; e($p*l($b))" | head -n 1) +-- echo "($b, $p, $r)," +-- done +WITH t(b, p, bc_result) AS (VALUES +(27.234987, -20.230957, .000000000000000000000000000009247064512095633), +(27.234987, -19.230957, .0000000000000000000000000002518436817750859), +(27.234987, -18.230957, .000000000000000000000000006858959399176602), +(27.234987, -17.230957, .0000000000000000000000001868036700701026), +(27.234987, -16.230957, .000000000000000000000005087595525911532), +(27.234987, -15.230957, .0000000000000000000001385605980094587), +(27.234987, -14.230957, .000000000000000000003773696085499835), +(27.234987, -13.230957, .0000000000000000001027765638305389), +(27.234987, -12.230957, .000000000000000002799118379829397), +(27.234987, -11.230957, .00000000000000007623395268611469), +(27.234987, -10.230957, .000000000000002076230710364949), +(27.234987, -9.230957, .00000000000005654611640579014), +(27.234987, -8.230957, .000000000001540032745212181), +(27.234987, -7.230957, .00000000004194277179542807), +(27.234987, -6.230957, .000000001142310844592450), +(27.234987, -5.230957, .00000003111082100243440), +(27.234987, -4.230957, .0000008473028055606278), +(27.234987, -3.230957, .00002307628089450723), +(27.234987, -2.230957, .0006284822101702527), +(27.234987, -1.230957, .01711670482371810), +(27.234987, 0.230957, 2.1451253063142300), +(27.234987, 1.230957, 58.422459830839071), +(27.234987, 2.230957, 1591.1349340009243), +(27.234987, 3.230957, 43334.539242761031), +(27.234987, 4.230957, 1180215.6129275865), +(27.234987, 5.230957, 32143156.875279851), +(27.234987, 6.230957, 875418459.63720737), +(27.234987, 7.230957, 23842010367.779367), +(27.234987, 8.230957, 649336842420.336290), +(27.234987, 9.230957, 17684680461938.907402), +(27.234987, 10.230957, 481642042480060.137900), +(27.234987, 11.230957, 13117514765597885.614921), +(27.234987, 12.230957, 357255344113366461.949871), +(27.234987, 13.230957, 9729844652608062117.440722), +(27.234987, 14.230957, 264992192625800087863.690528), +(27.234987, 15.230957, 7217058921265161257566.469315), +(27.234987, 16.230957, 196556505898890690402726.443417), +(27.234987, 17.230957, 5353213882921711267539279.451015), +(27.234987, 18.230957, 145794710509592328389185797.837767), +(27.234987, 19.230957, 3970717045397510438979206144.696206), +(27.234987, 20.230957, 108142427112079606637962972621.121293)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + b | p | bc_result | power | diff +-----------+------------+-------------------------------------------------+-------------------------------------------------+------------------------------------------------- + 27.234987 | -20.230957 | 0.000000000000000000000000000009247064512095633 | 0.000000000000000000000000000009247064512095633 | 0.000000000000000000000000000000000000000000000 + 27.234987 | -19.230957 | 0.0000000000000000000000000002518436817750859 | 0.0000000000000000000000000002518436817750859 | 0.0000000000000000000000000000000000000000000 + 27.234987 | -18.230957 | 0.000000000000000000000000006858959399176602 | 0.000000000000000000000000006858959399176602 | 0.000000000000000000000000000000000000000000 + 27.234987 | -17.230957 | 0.0000000000000000000000001868036700701026 | 0.0000000000000000000000001868036700701026 | 0.0000000000000000000000000000000000000000 + 27.234987 | -16.230957 | 0.000000000000000000000005087595525911532 | 0.000000000000000000000005087595525911532 | 0.000000000000000000000000000000000000000 + 27.234987 | -15.230957 | 0.0000000000000000000001385605980094587 | 0.0000000000000000000001385605980094587 | 0.0000000000000000000000000000000000000 + 27.234987 | -14.230957 | 0.000000000000000000003773696085499835 | 0.000000000000000000003773696085499835 | 0.000000000000000000000000000000000000 + 27.234987 | -13.230957 | 0.0000000000000000001027765638305389 | 0.0000000000000000001027765638305389 | 0.0000000000000000000000000000000000 + 27.234987 | -12.230957 | 0.000000000000000002799118379829397 | 0.000000000000000002799118379829397 | 0.000000000000000000000000000000000 + 27.234987 | -11.230957 | 0.00000000000000007623395268611469 | 0.00000000000000007623395268611469 | 0.00000000000000000000000000000000 + 27.234987 | -10.230957 | 0.000000000000002076230710364949 | 0.000000000000002076230710364949 | 0.000000000000000000000000000000 + 27.234987 | -9.230957 | 0.00000000000005654611640579014 | 0.00000000000005654611640579014 | 0.00000000000000000000000000000 + 27.234987 | -8.230957 | 0.000000000001540032745212181 | 0.000000000001540032745212181 | 0.000000000000000000000000000 + 27.234987 | -7.230957 | 0.00000000004194277179542807 | 0.00000000004194277179542807 | 0.00000000000000000000000000 + 27.234987 | -6.230957 | 0.000000001142310844592450 | 0.000000001142310844592450 | 0.000000000000000000000000 + 27.234987 | -5.230957 | 0.00000003111082100243440 | 0.00000003111082100243440 | 0.00000000000000000000000 + 27.234987 | -4.230957 | 0.0000008473028055606278 | 0.0000008473028055606278 | 0.0000000000000000000000 + 27.234987 | -3.230957 | 0.00002307628089450723 | 0.00002307628089450723 | 0.00000000000000000000 + 27.234987 | -2.230957 | 0.0006284822101702527 | 0.0006284822101702527 | 0.0000000000000000000 + 27.234987 | -1.230957 | 0.01711670482371810 | 0.01711670482371810 | 0.00000000000000000 + 27.234987 | 0.230957 | 2.1451253063142300 | 2.1451253063142300 | 0.0000000000000000 + 27.234987 | 1.230957 | 58.422459830839071 | 58.422459830839071 | 0.000000000000000 + 27.234987 | 2.230957 | 1591.1349340009243 | 1591.1349340009243 | 0.0000000000000 + 27.234987 | 3.230957 | 43334.539242761031 | 43334.539242761031 | 0.000000000000 + 27.234987 | 4.230957 | 1180215.6129275865 | 1180215.6129275865 | 0.0000000000 + 27.234987 | 5.230957 | 32143156.875279851 | 32143156.875279851 | 0.000000000 + 27.234987 | 6.230957 | 875418459.63720737 | 875418459.63720737 | 0.00000000 + 27.234987 | 7.230957 | 23842010367.779367 | 23842010367.779367 | 0.000000 + 27.234987 | 8.230957 | 649336842420.336290 | 649336842420.336290 | 0.000000 + 27.234987 | 9.230957 | 17684680461938.907402 | 17684680461938.907402 | 0.000000 + 27.234987 | 10.230957 | 481642042480060.137900 | 481642042480060.137900 | 0.000000 + 27.234987 | 11.230957 | 13117514765597885.614921 | 13117514765597885.614921 | 0.000000 + 27.234987 | 12.230957 | 357255344113366461.949871 | 357255344113366461.949871 | 0.000000 + 27.234987 | 13.230957 | 9729844652608062117.440722 | 9729844652608062117.440722 | 0.000000 + 27.234987 | 14.230957 | 264992192625800087863.690528 | 264992192625800087863.690528 | 0.000000 + 27.234987 | 15.230957 | 7217058921265161257566.469315 | 7217058921265161257566.469315 | 0.000000 + 27.234987 | 16.230957 | 196556505898890690402726.443417 | 196556505898890690402726.443417 | 0.000000 + 27.234987 | 17.230957 | 5353213882921711267539279.451015 | 5353213882921711267539279.451015 | 0.000000 + 27.234987 | 18.230957 | 145794710509592328389185797.837767 | 145794710509592328389185797.837767 | 0.000000 + 27.234987 | 19.230957 | 3970717045397510438979206144.696206 | 3970717045397510438979206144.696206 | 0.000000 + 27.234987 | 20.230957 | 108142427112079606637962972621.121293 | 108142427112079606637962972621.121293 | 0.000000 +(41 rows) + +-- Inputs close to overflow +-- +-- bc(1) results computed with a scale of 2700 and truncated to 4 decimal +-- places. +WITH t(b, p, bc_result) AS (VALUES +(0.12, -2829.8369, 58463948950011752465280493160293790845494328939320966633018493248607815580903065923369555885857984675501574162389726507612128133630191173383130639968378879506624785786843501848666498440326970769604109017960864573408272864266102690849952650095786874354625921641729880352858506454246180842452983243549491658464046163869265572232996388827878976066830374513768599285647145439771472435206769249126377164951470622827631950210853282324510655982757098065657709137845327135766013147354253426364240746381620690117663724329288646510198895137275207992825719846135857839292915100523542874885080351683587865157015032404901182924720371819942957083390475846809517968191151435281268695782594904484795360890092607679215675240583291240729468370895035823777914792823688291214492607109455017754453939895630226174304357121900605689015734289765672740769194115142607443713769825894380064727556869268488695795705030158832909348803019429370973064732712469794182891757241046263341655894972953512257981661670321890336672832647028099324621932563236459127918144141230217523147304565594514812518826936144181257723061181656522095236928347413997136815409159361412494284201481609684892562646522086577634100783077813105675590737823924220663206479031113753135119759722725207724879578900186075841393115040465401462266086907464970054073340036852442184414587772177753008511913377364966775792477387717262694468450099866775550614257191941835797445874557362115814601886902749237439492398087966544817154173072811937702110580330775581851211123491341435883319798273456296794954514173820352334127081705706502510709179711510240917772628308487366740741280043704807717608366220401933596364641284631036907635403895053036499618723044314773148779735006542501244942039455169872946018271985844759209768927953340447524637670938413827595013338859796135512187473850161303598087634723542727044978083220970836296653305188470017342167913572166172051819741354902582606590658382067039498769674611071582171914886494269818475850690414812481252963932223686078322390396586222238852602472958831686564971334200490182175112490433364675164900946902818404704835106260174052265784055642968397240262737313737007322288203637798365320295080314524864099419556398713380156353062937736280885716820226469419928595465390700629307079710611273715705695938635644841913194091407807776191951797748706106000922803167645881087385311847268311361092838264814899353459146959869764278464187826798546290981492648723002412475976344071283321798061003719251864595518596639432393032991023409676558943539937377229130132816883146259468718344018277257037013406135980469482324577407154032999045733141275895.3432), +(1.2, 32908.8896, 58463467728170833376633133695001863276259293590926929026251227859007891876739460057725441400966420577009060860805883032969522911803372870882799865787473726926215148161529632590083389287080925059682489116446754279752928005457087175157581627230586554364417068189211136840990661174760199073702207450133797324318403866058202372178813998850887986769280847189341565507156189065295823921162851958925352114220880236114784962150135485415106748467247897246441194126125699204912883449386043559785865023459356275014504597646990160571664166410683323036984805434677654413174177920726210827006973855410386789516533036723888687725436216478665958434776205940192130053647653715221076841771578099896259902368829351569726536927952661429685419815305418450230567773264738536471211804481206474781470237730069753206249915908804615495060673071058534441654604668770343616386612119048579369195201590008082689834456232255266932976831478404670192731621439902738547169253818323045451045749609624500171633897705543164388470746657118050314064066768449450440405619135824055131398727045420324382226572368236570500391463795989258779677208133531636928003546809249007993065200108076924439703799231711400266122025052209803513232429907231051873161206025860851056337427740362763618748092029386371493898291580557004812947013231371383576580415676519066503391905962989205397824064923920045371823949776899815750413244195402085917098964452866825666226141169411712884994564949174271056284898570445214367063763956186792886147126466387576513166370247576466566827375268334148320298849218878848928271566491769458471357076035396330179659440244425914213309776100351793665960978678576150833311810944729586040624059867137538839913141142139636023129691775489034134511666020819676247950267220131499463010350308195762769192775344260909521732256844149916046793599150786757764962585268686580124987490115873389726527572428003433405659445349155536369077209682951123806333170190998931670309088422483075609203671527331975811507450670132060984691061148836994322505371265263690017938762760088575875666254883673433331627055180154954694693433502522592907190906966067656027637884202418119121728966267936832338377284832958974299187166554160783467156478554899314000348357280306042140481751668215838656488457943830180819301102535170705017482946779698265096226184239631924271857062033454725540956591929965181603262502135610768915716020374362368495244256420143645126927013882334008435586481691725030031204304273292938132599127402133470745819213047706793887965197191137237066440328777206799072470374264316425913530947082957300047105685634407092811630672103242089966046839626911122.7149)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + b | p | bc_result | power | diff +------+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------- + 0.12 | -2829.8369 | 58463948950011752465280493160293790845494328939320966633018493248607815580903065923369555885857984675501574162389726507612128133630191173383130639968378879506624785786843501848666498440326970769604109017960864573408272864266102690849952650095786874354625921641729880352858506454246180842452983243549491658464046163869265572232996388827878976066830374513768599285647145439771472435206769249126377164951470622827631950210853282324510655982757098065657709137845327135766013147354253426364240746381620690117663724329288646510198895137275207992825719846135857839292915100523542874885080351683587865157015032404901182924720371819942957083390475846809517968191151435281268695782594904484795360890092607679215675240583291240729468370895035823777914792823688291214492607109455017754453939895630226174304357121900605689015734289765672740769194115142607443713769825894380064727556869268488695795705030158832909348803019429370973064732712469794182891757241046263341655894972953512257981661670321890336672832647028099324621932563236459127918144141230217523147304565594514812518826936144181257723061181656522095236928347413997136815409159361412494284201481609684892562646522086577634100783077813105675590737823924220663206479031113753135119759722725207724879578900186075841393115040465401462266086907464970054073340036852442184414587772177753008511913377364966775792477387717262694468450099866775550614257191941835797445874557362115814601886902749237439492398087966544817154173072811937702110580330775581851211123491341435883319798273456296794954514173820352334127081705706502510709179711510240917772628308487366740741280043704807717608366220401933596364641284631036907635403895053036499618723044314773148779735006542501244942039455169872946018271985844759209768927953340447524637670938413827595013338859796135512187473850161303598087634723542727044978083220970836296653305188470017342167913572166172051819741354902582606590658382067039498769674611071582171914886494269818475850690414812481252963932223686078322390396586222238852602472958831686564971334200490182175112490433364675164900946902818404704835106260174052265784055642968397240262737313737007322288203637798365320295080314524864099419556398713380156353062937736280885716820226469419928595465390700629307079710611273715705695938635644841913194091407807776191951797748706106000922803167645881087385311847268311361092838264814899353459146959869764278464187826798546290981492648723002412475976344071283321798061003719251864595518596639432393032991023409676558943539937377229130132816883146259468718344018277257037013406135980469482324577407154032999045733141275895.3432 | 58463948950011752465280493160293790845494328939320966633018493248607815580903065923369555885857984675501574162389726507612128133630191173383130639968378879506624785786843501848666498440326970769604109017960864573408272864266102690849952650095786874354625921641729880352858506454246180842452983243549491658464046163869265572232996388827878976066830374513768599285647145439771472435206769249126377164951470622827631950210853282324510655982757098065657709137845327135766013147354253426364240746381620690117663724329288646510198895137275207992825719846135857839292915100523542874885080351683587865157015032404901182924720371819942957083390475846809517968191151435281268695782594904484795360890092607679215675240583291240729468370895035823777914792823688291214492607109455017754453939895630226174304357121900605689015734289765672740769194115142607443713769825894380064727556869268488695795705030158832909348803019429370973064732712469794182891757241046263341655894972953512257981661670321890336672832647028099324621932563236459127918144141230217523147304565594514812518826936144181257723061181656522095236928347413997136815409159361412494284201481609684892562646522086577634100783077813105675590737823924220663206479031113753135119759722725207724879578900186075841393115040465401462266086907464970054073340036852442184414587772177753008511913377364966775792477387717262694468450099866775550614257191941835797445874557362115814601886902749237439492398087966544817154173072811937702110580330775581851211123491341435883319798273456296794954514173820352334127081705706502510709179711510240917772628308487366740741280043704807717608366220401933596364641284631036907635403895053036499618723044314773148779735006542501244942039455169872946018271985844759209768927953340447524637670938413827595013338859796135512187473850161303598087634723542727044978083220970836296653305188470017342167913572166172051819741354902582606590658382067039498769674611071582171914886494269818475850690414812481252963932223686078322390396586222238852602472958831686564971334200490182175112490433364675164900946902818404704835106260174052265784055642968397240262737313737007322288203637798365320295080314524864099419556398713380156353062937736280885716820226469419928595465390700629307079710611273715705695938635644841913194091407807776191951797748706106000922803167645881087385311847268311361092838264814899353459146959869764278464187826798546290981492648723002412475976344071283321798061003719251864595518596639432393032991023409676558943539937377229130132816883146259468718344018277257037013406135980469482324577407154032999045733141275895.3432 | 0.0000 + 1.2 | 32908.8896 | 58463467728170833376633133695001863276259293590926929026251227859007891876739460057725441400966420577009060860805883032969522911803372870882799865787473726926215148161529632590083389287080925059682489116446754279752928005457087175157581627230586554364417068189211136840990661174760199073702207450133797324318403866058202372178813998850887986769280847189341565507156189065295823921162851958925352114220880236114784962150135485415106748467247897246441194126125699204912883449386043559785865023459356275014504597646990160571664166410683323036984805434677654413174177920726210827006973855410386789516533036723888687725436216478665958434776205940192130053647653715221076841771578099896259902368829351569726536927952661429685419815305418450230567773264738536471211804481206474781470237730069753206249915908804615495060673071058534441654604668770343616386612119048579369195201590008082689834456232255266932976831478404670192731621439902738547169253818323045451045749609624500171633897705543164388470746657118050314064066768449450440405619135824055131398727045420324382226572368236570500391463795989258779677208133531636928003546809249007993065200108076924439703799231711400266122025052209803513232429907231051873161206025860851056337427740362763618748092029386371493898291580557004812947013231371383576580415676519066503391905962989205397824064923920045371823949776899815750413244195402085917098964452866825666226141169411712884994564949174271056284898570445214367063763956186792886147126466387576513166370247576466566827375268334148320298849218878848928271566491769458471357076035396330179659440244425914213309776100351793665960978678576150833311810944729586040624059867137538839913141142139636023129691775489034134511666020819676247950267220131499463010350308195762769192775344260909521732256844149916046793599150786757764962585268686580124987490115873389726527572428003433405659445349155536369077209682951123806333170190998931670309088422483075609203671527331975811507450670132060984691061148836994322505371265263690017938762760088575875666254883673433331627055180154954694693433502522592907190906966067656027637884202418119121728966267936832338377284832958974299187166554160783467156478554899314000348357280306042140481751668215838656488457943830180819301102535170705017482946779698265096226184239631924271857062033454725540956591929965181603262502135610768915716020374362368495244256420143645126927013882334008435586481691725030031204304273292938132599127402133470745819213047706793887965197191137237066440328777206799072470374264316425913530947082957300047105685634407092811630672103242089966046839626911122.7149 | 58463467728170833376633133695001863276259293590926929026251227859007891876739460057725441400966420577009060860805883032969522911803372870882799865787473726926215148161529632590083389287080925059682489116446754279752928005457087175157581627230586554364417068189211136840990661174760199073702207450133797324318403866058202372178813998850887986769280847189341565507156189065295823921162851958925352114220880236114784962150135485415106748467247897246441194126125699204912883449386043559785865023459356275014504597646990160571664166410683323036984805434677654413174177920726210827006973855410386789516533036723888687725436216478665958434776205940192130053647653715221076841771578099896259902368829351569726536927952661429685419815305418450230567773264738536471211804481206474781470237730069753206249915908804615495060673071058534441654604668770343616386612119048579369195201590008082689834456232255266932976831478404670192731621439902738547169253818323045451045749609624500171633897705543164388470746657118050314064066768449450440405619135824055131398727045420324382226572368236570500391463795989258779677208133531636928003546809249007993065200108076924439703799231711400266122025052209803513232429907231051873161206025860851056337427740362763618748092029386371493898291580557004812947013231371383576580415676519066503391905962989205397824064923920045371823949776899815750413244195402085917098964452866825666226141169411712884994564949174271056284898570445214367063763956186792886147126466387576513166370247576466566827375268334148320298849218878848928271566491769458471357076035396330179659440244425914213309776100351793665960978678576150833311810944729586040624059867137538839913141142139636023129691775489034134511666020819676247950267220131499463010350308195762769192775344260909521732256844149916046793599150786757764962585268686580124987490115873389726527572428003433405659445349155536369077209682951123806333170190998931670309088422483075609203671527331975811507450670132060984691061148836994322505371265263690017938762760088575875666254883673433331627055180154954694693433502522592907190906966067656027637884202418119121728966267936832338377284832958974299187166554160783467156478554899314000348357280306042140481751668215838656488457943830180819301102535170705017482946779698265096226184239631924271857062033454725540956591929965181603262502135610768915716020374362368495244256420143645126927013882334008435586481691725030031204304273292938132599127402133470745819213047706793887965197191137237066440328777206799072470374264316425913530947082957300047105685634407092811630672103242089966046839626911122.7149 | 0.0000 +(2 rows) + +-- +-- Tests for EXP() +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of EXP(): +-- +-- for n in {-20..20} +-- do +-- x="$n.29837" +-- r=$(bc -ql <<< "scale=500 ; e($x)" | head -n 1) +-- echo "($x, $r)," +-- done +WITH t(x, bc_result) AS (VALUES +(-20.29837, .000000001529431101152222), +(-19.29837, .000000004157424770142192), +(-18.29837, .00000001130105220586304), +(-17.29837, .00000003071944485366452), +(-16.29837, .00000008350410872606600), +(-15.29837, .0000002269877013517336), +(-14.29837, .0000006170165438681061), +(-13.29837, .000001677224859055276), +(-12.29837, .000004559169856609741), +(-11.29837, .00001239310857408049), +(-10.29837, .00003368796183504298), +(-9.29837, .00009157337449401917), +(-8.29837, .0002489222398577673), +(-7.29837, .0006766408013046928), +(-6.29837, .001839300394580514), +(-5.29837, .004999736839665763), +(-4.29837, .01359069379834070), +(-3.29837, .03694333598818056), +(-2.29837, .1004223988993283), +(-1.29837, .2729763820983097), +(0.29837, 1.3476603299656679), +(1.29837, 3.6633205858807959), +(2.29837, 9.9579377804197108), +(3.29837, 27.068481317440698), +(4.29837, 73.579760889182206), +(5.29837, 200.01052696742555), +(6.29837, 543.68498095607070), +(7.29837, 1477.8890041389891), +(8.29837, 4017.3188244304487), +(9.29837, 10920.204759575742), +(10.29837, 29684.194161006717), +(11.29837, 80690.005580314652), +(12.29837, 219338.17590722828), +(13.29837, 596222.97785597218), +(14.29837, 1620702.0864156289), +(15.29837, 4405525.0308492653), +(16.29837, 11975458.636179032), +(17.29837, 32552671.598188404), +(18.29837, 88487335.673150406), +(19.29837, 240533516.60908059), +(20.29837, 653837887.33381570)) +SELECT x, bc_result, exp(x), exp(x)-bc_result AS diff FROM t; + x | bc_result | exp | diff +-----------+----------------------------+----------------------------+---------------------------- + -20.29837 | 0.000000001529431101152222 | 0.000000001529431101152222 | 0.000000000000000000000000 + -19.29837 | 0.000000004157424770142192 | 0.000000004157424770142192 | 0.000000000000000000000000 + -18.29837 | 0.00000001130105220586304 | 0.00000001130105220586304 | 0.00000000000000000000000 + -17.29837 | 0.00000003071944485366452 | 0.00000003071944485366452 | 0.00000000000000000000000 + -16.29837 | 0.00000008350410872606600 | 0.00000008350410872606600 | 0.00000000000000000000000 + -15.29837 | 0.0000002269877013517336 | 0.0000002269877013517336 | 0.0000000000000000000000 + -14.29837 | 0.0000006170165438681061 | 0.0000006170165438681061 | 0.0000000000000000000000 + -13.29837 | 0.000001677224859055276 | 0.000001677224859055276 | 0.000000000000000000000 + -12.29837 | 0.000004559169856609741 | 0.000004559169856609741 | 0.000000000000000000000 + -11.29837 | 0.00001239310857408049 | 0.00001239310857408049 | 0.00000000000000000000 + -10.29837 | 0.00003368796183504298 | 0.00003368796183504298 | 0.00000000000000000000 + -9.29837 | 0.00009157337449401917 | 0.00009157337449401917 | 0.00000000000000000000 + -8.29837 | 0.0002489222398577673 | 0.0002489222398577673 | 0.0000000000000000000 + -7.29837 | 0.0006766408013046928 | 0.0006766408013046928 | 0.0000000000000000000 + -6.29837 | 0.001839300394580514 | 0.001839300394580514 | 0.000000000000000000 + -5.29837 | 0.004999736839665763 | 0.004999736839665763 | 0.000000000000000000 + -4.29837 | 0.01359069379834070 | 0.01359069379834070 | 0.00000000000000000 + -3.29837 | 0.03694333598818056 | 0.03694333598818056 | 0.00000000000000000 + -2.29837 | 0.1004223988993283 | 0.1004223988993283 | 0.0000000000000000 + -1.29837 | 0.2729763820983097 | 0.2729763820983097 | 0.0000000000000000 + 0.29837 | 1.3476603299656679 | 1.3476603299656679 | 0.0000000000000000 + 1.29837 | 3.6633205858807959 | 3.6633205858807959 | 0.0000000000000000 + 2.29837 | 9.9579377804197108 | 9.9579377804197108 | 0.0000000000000000 + 3.29837 | 27.068481317440698 | 27.068481317440698 | 0.000000000000000 + 4.29837 | 73.579760889182206 | 73.579760889182206 | 0.000000000000000 + 5.29837 | 200.01052696742555 | 200.01052696742555 | 0.00000000000000 + 6.29837 | 543.68498095607070 | 543.68498095607070 | 0.00000000000000 + 7.29837 | 1477.8890041389891 | 1477.8890041389891 | 0.0000000000000 + 8.29837 | 4017.3188244304487 | 4017.3188244304487 | 0.0000000000000 + 9.29837 | 10920.204759575742 | 10920.204759575742 | 0.000000000000 + 10.29837 | 29684.194161006717 | 29684.194161006717 | 0.000000000000 + 11.29837 | 80690.005580314652 | 80690.005580314652 | 0.000000000000 + 12.29837 | 219338.17590722828 | 219338.17590722828 | 0.00000000000 + 13.29837 | 596222.97785597218 | 596222.97785597218 | 0.00000000000 + 14.29837 | 1620702.0864156289 | 1620702.0864156289 | 0.0000000000 + 15.29837 | 4405525.0308492653 | 4405525.0308492653 | 0.0000000000 + 16.29837 | 11975458.636179032 | 11975458.636179032 | 0.000000000 + 17.29837 | 32552671.598188404 | 32552671.598188404 | 0.000000000 + 18.29837 | 88487335.673150406 | 88487335.673150406 | 0.000000000 + 19.29837 | 240533516.60908059 | 240533516.60908059 | 0.00000000 + 20.29837 | 653837887.33381570 | 653837887.33381570 | 0.00000000 +(41 rows) + +-- +-- Tests for LN() +-- +-- input very small +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(10^-$p)" | head -n 1) +-- echo "('1.0e-$p', $l)," +-- done +WITH t(x, bc_result) AS (VALUES +('1.0e-1', -2.3025850929940457), +('1.0e-2', -4.6051701859880914), +('1.0e-3', -6.9077552789821371), +('1.0e-4', -9.2103403719761827), +('1.0e-5', -11.512925464970228), +('1.0e-6', -13.815510557964274), +('1.0e-7', -16.118095650958320), +('1.0e-8', -18.420680743952365), +('1.0e-9', -20.723265836946411), +('1.0e-10', -23.025850929940457), +('1.0e-11', -25.328436022934503), +('1.0e-12', -27.631021115928548), +('1.0e-13', -29.933606208922594), +('1.0e-14', -32.236191301916640), +('1.0e-15', -34.5387763949106853), +('1.0e-16', -36.84136148790473094), +('1.0e-17', -39.143946580898776628), +('1.0e-18', -41.4465316738928223123), +('1.0e-19', -43.74911676688686799634), +('1.0e-20', -46.051701859880913680360), +('1.0e-21', -48.3542869528749593643778), +('1.0e-22', -50.65687204586900504839581), +('1.0e-23', -52.959457138863050732413803), +('1.0e-24', -55.2620422318570964164317949), +('1.0e-25', -57.56462732485114210044978637), +('1.0e-26', -59.867212417845187784467777822), +('1.0e-27', -62.1697975108392334684857692765), +('1.0e-28', -64.47238260383327915250376073116), +('1.0e-29', -66.774967696827324836521752185847), +('1.0e-30', -69.0775527898213705205397436405309), +('1.0e-31', -71.38013788281541620455773509521529), +('1.0e-32', -73.682722975809461888575726549899655), +('1.0e-33', -75.9853080688035075725937180045840189), +('1.0e-34', -78.28789316179755325661170945926838306), +('1.0e-35', -80.590478254791598940629700913952747266), +('1.0e-36', -82.8930633477856446246476923686371114736), +('1.0e-37', -85.19564844077969030866568382332147568124), +('1.0e-38', -87.498233533773735992683675278005839888842), +('1.0e-39', -89.8008186267677816767016667326902040964430), +('1.0e-40', -92.10340371976182736071965818737456830404406)) +SELECT x, bc_result, ln(x::numeric), ln(x::numeric)-bc_result AS diff FROM t; + x | bc_result | ln | diff +---------+-----------------------------------------------+-----------------------------------------------+--------------------------------------------- + 1.0e-1 | -2.3025850929940457 | -2.3025850929940457 | 0.0000000000000000 + 1.0e-2 | -4.6051701859880914 | -4.6051701859880914 | 0.0000000000000000 + 1.0e-3 | -6.9077552789821371 | -6.9077552789821371 | 0.0000000000000000 + 1.0e-4 | -9.2103403719761827 | -9.2103403719761827 | 0.0000000000000000 + 1.0e-5 | -11.512925464970228 | -11.512925464970228 | 0.000000000000000 + 1.0e-6 | -13.815510557964274 | -13.815510557964274 | 0.000000000000000 + 1.0e-7 | -16.118095650958320 | -16.118095650958320 | 0.000000000000000 + 1.0e-8 | -18.420680743952365 | -18.420680743952365 | 0.000000000000000 + 1.0e-9 | -20.723265836946411 | -20.723265836946411 | 0.000000000000000 + 1.0e-10 | -23.025850929940457 | -23.025850929940457 | 0.000000000000000 + 1.0e-11 | -25.328436022934503 | -25.328436022934503 | 0.000000000000000 + 1.0e-12 | -27.631021115928548 | -27.631021115928548 | 0.000000000000000 + 1.0e-13 | -29.933606208922594 | -29.933606208922594 | 0.000000000000000 + 1.0e-14 | -32.236191301916640 | -32.236191301916640 | 0.000000000000000 + 1.0e-15 | -34.5387763949106853 | -34.5387763949106853 | 0.0000000000000000 + 1.0e-16 | -36.84136148790473094 | -36.84136148790473094 | 0.00000000000000000 + 1.0e-17 | -39.143946580898776628 | -39.143946580898776628 | 0.000000000000000000 + 1.0e-18 | -41.4465316738928223123 | -41.4465316738928223123 | 0.0000000000000000000 + 1.0e-19 | -43.74911676688686799634 | -43.74911676688686799634 | 0.00000000000000000000 + 1.0e-20 | -46.051701859880913680360 | -46.051701859880913680360 | 0.000000000000000000000 + 1.0e-21 | -48.3542869528749593643778 | -48.3542869528749593643778 | 0.0000000000000000000000 + 1.0e-22 | -50.65687204586900504839581 | -50.65687204586900504839581 | 0.00000000000000000000000 + 1.0e-23 | -52.959457138863050732413803 | -52.959457138863050732413803 | 0.000000000000000000000000 + 1.0e-24 | -55.2620422318570964164317949 | -55.2620422318570964164317949 | 0.0000000000000000000000000 + 1.0e-25 | -57.56462732485114210044978637 | -57.56462732485114210044978637 | 0.00000000000000000000000000 + 1.0e-26 | -59.867212417845187784467777822 | -59.867212417845187784467777822 | 0.000000000000000000000000000 + 1.0e-27 | -62.1697975108392334684857692765 | -62.1697975108392334684857692765 | 0.0000000000000000000000000000 + 1.0e-28 | -64.47238260383327915250376073116 | -64.47238260383327915250376073116 | 0.00000000000000000000000000000 + 1.0e-29 | -66.774967696827324836521752185847 | -66.774967696827324836521752185847 | 0.000000000000000000000000000000 + 1.0e-30 | -69.0775527898213705205397436405309 | -69.0775527898213705205397436405309 | 0.0000000000000000000000000000000 + 1.0e-31 | -71.38013788281541620455773509521529 | -71.38013788281541620455773509521529 | 0.00000000000000000000000000000000 + 1.0e-32 | -73.682722975809461888575726549899655 | -73.682722975809461888575726549899655 | 0.000000000000000000000000000000000 + 1.0e-33 | -75.9853080688035075725937180045840189 | -75.9853080688035075725937180045840189 | 0.0000000000000000000000000000000000 + 1.0e-34 | -78.28789316179755325661170945926838306 | -78.28789316179755325661170945926838306 | 0.00000000000000000000000000000000000 + 1.0e-35 | -80.590478254791598940629700913952747266 | -80.590478254791598940629700913952747266 | 0.000000000000000000000000000000000000 + 1.0e-36 | -82.8930633477856446246476923686371114736 | -82.8930633477856446246476923686371114736 | 0.0000000000000000000000000000000000000 + 1.0e-37 | -85.19564844077969030866568382332147568124 | -85.19564844077969030866568382332147568124 | 0.00000000000000000000000000000000000000 + 1.0e-38 | -87.498233533773735992683675278005839888842 | -87.498233533773735992683675278005839888842 | 0.000000000000000000000000000000000000000 + 1.0e-39 | -89.8008186267677816767016667326902040964430 | -89.8008186267677816767016667326902040964430 | 0.0000000000000000000000000000000000000000 + 1.0e-40 | -92.10340371976182736071965818737456830404406 | -92.10340371976182736071965818737456830404406 | 0.00000000000000000000000000000000000000000 +(40 rows) + +-- input very close to but smaller than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(1-10^-$p)" | head -n 1) +-- echo "('1.0e-$p', $l)," +-- done +WITH t(x, bc_result) AS (VALUES +('1.0e-1', -.10536051565782630), +('1.0e-2', -.010050335853501441), +('1.0e-3', -.0010005003335835335), +('1.0e-4', -.00010000500033335834), +('1.0e-5', -.000010000050000333336), +('1.0e-6', -.0000010000005000003333), +('1.0e-7', -.00000010000000500000033), +('1.0e-8', -.000000010000000050000000), +('1.0e-9', -.0000000010000000005000000), +('1.0e-10', -.00000000010000000000500000), +('1.0e-11', -.000000000010000000000050000), +('1.0e-12', -.0000000000010000000000005000), +('1.0e-13', -.00000000000010000000000000500), +('1.0e-14', -.000000000000010000000000000050), +('1.0e-15', -.0000000000000010000000000000005), +('1.0e-16', -.00000000000000010000000000000001), +('1.0e-17', -.000000000000000010000000000000000), +('1.0e-18', -.0000000000000000010000000000000000), +('1.0e-19', -.00000000000000000010000000000000000), +('1.0e-20', -.000000000000000000010000000000000000), +('1.0e-21', -.0000000000000000000010000000000000000), +('1.0e-22', -.00000000000000000000010000000000000000), +('1.0e-23', -.000000000000000000000010000000000000000), +('1.0e-24', -.0000000000000000000000010000000000000000), +('1.0e-25', -.00000000000000000000000010000000000000000), +('1.0e-26', -.000000000000000000000000010000000000000000), +('1.0e-27', -.0000000000000000000000000010000000000000000), +('1.0e-28', -.00000000000000000000000000010000000000000000), +('1.0e-29', -.000000000000000000000000000010000000000000000), +('1.0e-30', -.0000000000000000000000000000010000000000000000), +('1.0e-31', -.00000000000000000000000000000010000000000000000), +('1.0e-32', -.000000000000000000000000000000010000000000000000), +('1.0e-33', -.0000000000000000000000000000000010000000000000000), +('1.0e-34', -.00000000000000000000000000000000010000000000000000), +('1.0e-35', -.000000000000000000000000000000000010000000000000000), +('1.0e-36', -.0000000000000000000000000000000000010000000000000000), +('1.0e-37', -.00000000000000000000000000000000000010000000000000000), +('1.0e-38', -.000000000000000000000000000000000000010000000000000000), +('1.0e-39', -.0000000000000000000000000000000000000010000000000000000), +('1.0e-40', -.00000000000000000000000000000000000000010000000000000000)) +SELECT '1-'||x, bc_result, ln(1.0-x::numeric), ln(1.0-x::numeric)-bc_result AS diff FROM t; + ?column? | bc_result | ln | diff +-----------+-------------------------------------------------------------+-------------------------------------------------------------+------------------------------------------------------------ + 1-1.0e-1 | -0.10536051565782630 | -0.10536051565782630 | 0.00000000000000000 + 1-1.0e-2 | -0.010050335853501441 | -0.010050335853501441 | 0.000000000000000000 + 1-1.0e-3 | -0.0010005003335835335 | -0.0010005003335835335 | 0.0000000000000000000 + 1-1.0e-4 | -0.00010000500033335834 | -0.00010000500033335834 | 0.00000000000000000000 + 1-1.0e-5 | -0.000010000050000333336 | -0.000010000050000333336 | 0.000000000000000000000 + 1-1.0e-6 | -0.0000010000005000003333 | -0.0000010000005000003333 | 0.0000000000000000000000 + 1-1.0e-7 | -0.00000010000000500000033 | -0.00000010000000500000033 | 0.00000000000000000000000 + 1-1.0e-8 | -0.000000010000000050000000 | -0.000000010000000050000000 | 0.000000000000000000000000 + 1-1.0e-9 | -0.0000000010000000005000000 | -0.0000000010000000005000000 | 0.0000000000000000000000000 + 1-1.0e-10 | -0.00000000010000000000500000 | -0.00000000010000000000500000 | 0.00000000000000000000000000 + 1-1.0e-11 | -0.000000000010000000000050000 | -0.000000000010000000000050000 | 0.000000000000000000000000000 + 1-1.0e-12 | -0.0000000000010000000000005000 | -0.0000000000010000000000005000 | 0.0000000000000000000000000000 + 1-1.0e-13 | -0.00000000000010000000000000500 | -0.00000000000010000000000000500 | 0.00000000000000000000000000000 + 1-1.0e-14 | -0.000000000000010000000000000050 | -0.000000000000010000000000000050 | 0.000000000000000000000000000000 + 1-1.0e-15 | -0.0000000000000010000000000000005 | -0.0000000000000010000000000000005 | 0.0000000000000000000000000000000 + 1-1.0e-16 | -0.00000000000000010000000000000001 | -0.00000000000000010000000000000001 | 0.00000000000000000000000000000000 + 1-1.0e-17 | -0.000000000000000010000000000000000 | -0.000000000000000010000000000000000 | 0.000000000000000000000000000000000 + 1-1.0e-18 | -0.0000000000000000010000000000000000 | -0.0000000000000000010000000000000000 | 0.0000000000000000000000000000000000 + 1-1.0e-19 | -0.00000000000000000010000000000000000 | -0.00000000000000000010000000000000000 | 0.00000000000000000000000000000000000 + 1-1.0e-20 | -0.000000000000000000010000000000000000 | -0.000000000000000000010000000000000000 | 0.000000000000000000000000000000000000 + 1-1.0e-21 | -0.0000000000000000000010000000000000000 | -0.0000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000 + 1-1.0e-22 | -0.00000000000000000000010000000000000000 | -0.00000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000 + 1-1.0e-23 | -0.000000000000000000000010000000000000000 | -0.000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000 + 1-1.0e-24 | -0.0000000000000000000000010000000000000000 | -0.0000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000 + 1-1.0e-25 | -0.00000000000000000000000010000000000000000 | -0.00000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000 + 1-1.0e-26 | -0.000000000000000000000000010000000000000000 | -0.000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000 + 1-1.0e-27 | -0.0000000000000000000000000010000000000000000 | -0.0000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000 + 1-1.0e-28 | -0.00000000000000000000000000010000000000000000 | -0.00000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000 + 1-1.0e-29 | -0.000000000000000000000000000010000000000000000 | -0.000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000000 + 1-1.0e-30 | -0.0000000000000000000000000000010000000000000000 | -0.0000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000000 + 1-1.0e-31 | -0.00000000000000000000000000000010000000000000000 | -0.00000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000000 + 1-1.0e-32 | -0.000000000000000000000000000000010000000000000000 | -0.000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000000000 + 1-1.0e-33 | -0.0000000000000000000000000000000010000000000000000 | -0.0000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000000000 + 1-1.0e-34 | -0.00000000000000000000000000000000010000000000000000 | -0.00000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000000000 + 1-1.0e-35 | -0.000000000000000000000000000000000010000000000000000 | -0.000000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000000000000 + 1-1.0e-36 | -0.0000000000000000000000000000000000010000000000000000 | -0.0000000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000000000000 + 1-1.0e-37 | -0.00000000000000000000000000000000000010000000000000000 | -0.00000000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000000000000 + 1-1.0e-38 | -0.000000000000000000000000000000000000010000000000000000 | -0.000000000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000000000000000 + 1-1.0e-39 | -0.0000000000000000000000000000000000000010000000000000000 | -0.0000000000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000000000000000 + 1-1.0e-40 | -0.00000000000000000000000000000000000000010000000000000000 | -0.00000000000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000000000000000 +(40 rows) + +-- input very close to but larger than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(1+10^-$p)" | head -n 1) +-- echo "('1.0e-$p', $l)," +-- done +WITH t(x, bc_result) AS (VALUES +('1.0e-1', .09531017980432486), +('1.0e-2', .009950330853168083), +('1.0e-3', .0009995003330835332), +('1.0e-4', .00009999500033330834), +('1.0e-5', .000009999950000333331), +('1.0e-6', .0000009999995000003333), +('1.0e-7', .00000009999999500000033), +('1.0e-8', .000000009999999950000000), +('1.0e-9', .0000000009999999995000000), +('1.0e-10', .00000000009999999999500000), +('1.0e-11', .000000000009999999999950000), +('1.0e-12', .0000000000009999999999995000), +('1.0e-13', .00000000000009999999999999500), +('1.0e-14', .000000000000009999999999999950), +('1.0e-15', .0000000000000009999999999999995), +('1.0e-16', .00000000000000010000000000000000), +('1.0e-17', .000000000000000010000000000000000), +('1.0e-18', .0000000000000000010000000000000000), +('1.0e-19', .00000000000000000010000000000000000), +('1.0e-20', .000000000000000000010000000000000000), +('1.0e-21', .0000000000000000000010000000000000000), +('1.0e-22', .00000000000000000000010000000000000000), +('1.0e-23', .000000000000000000000010000000000000000), +('1.0e-24', .0000000000000000000000010000000000000000), +('1.0e-25', .00000000000000000000000010000000000000000), +('1.0e-26', .000000000000000000000000010000000000000000), +('1.0e-27', .0000000000000000000000000010000000000000000), +('1.0e-28', .00000000000000000000000000010000000000000000), +('1.0e-29', .000000000000000000000000000010000000000000000), +('1.0e-30', .0000000000000000000000000000010000000000000000), +('1.0e-31', .00000000000000000000000000000010000000000000000), +('1.0e-32', .000000000000000000000000000000010000000000000000), +('1.0e-33', .0000000000000000000000000000000010000000000000000), +('1.0e-34', .00000000000000000000000000000000010000000000000000), +('1.0e-35', .000000000000000000000000000000000010000000000000000), +('1.0e-36', .0000000000000000000000000000000000010000000000000000), +('1.0e-37', .00000000000000000000000000000000000010000000000000000), +('1.0e-38', .000000000000000000000000000000000000010000000000000000), +('1.0e-39', .0000000000000000000000000000000000000010000000000000000), +('1.0e-40', .00000000000000000000000000000000000000010000000000000000)) +SELECT '1+'||x, bc_result, ln(1.0+x::numeric), ln(1.0+x::numeric)-bc_result AS diff FROM t; + ?column? | bc_result | ln | diff +-----------+------------------------------------------------------------+------------------------------------------------------------+------------------------------------------------------------ + 1+1.0e-1 | 0.09531017980432486 | 0.09531017980432486 | 0.00000000000000000 + 1+1.0e-2 | 0.009950330853168083 | 0.009950330853168083 | 0.000000000000000000 + 1+1.0e-3 | 0.0009995003330835332 | 0.0009995003330835332 | 0.0000000000000000000 + 1+1.0e-4 | 0.00009999500033330834 | 0.00009999500033330834 | 0.00000000000000000000 + 1+1.0e-5 | 0.000009999950000333331 | 0.000009999950000333331 | 0.000000000000000000000 + 1+1.0e-6 | 0.0000009999995000003333 | 0.0000009999995000003333 | 0.0000000000000000000000 + 1+1.0e-7 | 0.00000009999999500000033 | 0.00000009999999500000033 | 0.00000000000000000000000 + 1+1.0e-8 | 0.000000009999999950000000 | 0.000000009999999950000000 | 0.000000000000000000000000 + 1+1.0e-9 | 0.0000000009999999995000000 | 0.0000000009999999995000000 | 0.0000000000000000000000000 + 1+1.0e-10 | 0.00000000009999999999500000 | 0.00000000009999999999500000 | 0.00000000000000000000000000 + 1+1.0e-11 | 0.000000000009999999999950000 | 0.000000000009999999999950000 | 0.000000000000000000000000000 + 1+1.0e-12 | 0.0000000000009999999999995000 | 0.0000000000009999999999995000 | 0.0000000000000000000000000000 + 1+1.0e-13 | 0.00000000000009999999999999500 | 0.00000000000009999999999999500 | 0.00000000000000000000000000000 + 1+1.0e-14 | 0.000000000000009999999999999950 | 0.000000000000009999999999999950 | 0.000000000000000000000000000000 + 1+1.0e-15 | 0.0000000000000009999999999999995 | 0.0000000000000009999999999999995 | 0.0000000000000000000000000000000 + 1+1.0e-16 | 0.00000000000000010000000000000000 | 0.00000000000000010000000000000000 | 0.00000000000000000000000000000000 + 1+1.0e-17 | 0.000000000000000010000000000000000 | 0.000000000000000010000000000000000 | 0.000000000000000000000000000000000 + 1+1.0e-18 | 0.0000000000000000010000000000000000 | 0.0000000000000000010000000000000000 | 0.0000000000000000000000000000000000 + 1+1.0e-19 | 0.00000000000000000010000000000000000 | 0.00000000000000000010000000000000000 | 0.00000000000000000000000000000000000 + 1+1.0e-20 | 0.000000000000000000010000000000000000 | 0.000000000000000000010000000000000000 | 0.000000000000000000000000000000000000 + 1+1.0e-21 | 0.0000000000000000000010000000000000000 | 0.0000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000 + 1+1.0e-22 | 0.00000000000000000000010000000000000000 | 0.00000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000 + 1+1.0e-23 | 0.000000000000000000000010000000000000000 | 0.000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000 + 1+1.0e-24 | 0.0000000000000000000000010000000000000000 | 0.0000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000 + 1+1.0e-25 | 0.00000000000000000000000010000000000000000 | 0.00000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000 + 1+1.0e-26 | 0.000000000000000000000000010000000000000000 | 0.000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000 + 1+1.0e-27 | 0.0000000000000000000000000010000000000000000 | 0.0000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000 + 1+1.0e-28 | 0.00000000000000000000000000010000000000000000 | 0.00000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000 + 1+1.0e-29 | 0.000000000000000000000000000010000000000000000 | 0.000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000000 + 1+1.0e-30 | 0.0000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000000 + 1+1.0e-31 | 0.00000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000000 + 1+1.0e-32 | 0.000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000000000 + 1+1.0e-33 | 0.0000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000000000 + 1+1.0e-34 | 0.00000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000000000 + 1+1.0e-35 | 0.000000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000000000000 + 1+1.0e-36 | 0.0000000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000000000000 + 1+1.0e-37 | 0.00000000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000000000000 + 1+1.0e-38 | 0.000000000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000010000000000000000 | 0.000000000000000000000000000000000000000000000000000000 + 1+1.0e-39 | 0.0000000000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000010000000000000000 | 0.0000000000000000000000000000000000000000000000000000000 + 1+1.0e-40 | 0.00000000000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000010000000000000000 | 0.00000000000000000000000000000000000000000000000000000000 +(40 rows) + +-- input very large +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(10^$p)" | head -n 1) +-- echo "('1.0e$p', $l)," +-- done +WITH t(x, bc_result) AS (VALUES +('1.0e1', 2.3025850929940457), +('1.0e2', 4.6051701859880914), +('1.0e3', 6.9077552789821371), +('1.0e4', 9.2103403719761827), +('1.0e5', 11.512925464970228), +('1.0e6', 13.815510557964274), +('1.0e7', 16.118095650958320), +('1.0e8', 18.420680743952365), +('1.0e9', 20.723265836946411), +('1.0e10', 23.025850929940457), +('1.0e11', 25.328436022934503), +('1.0e12', 27.631021115928548), +('1.0e13', 29.933606208922594), +('1.0e14', 32.236191301916640), +('1.0e15', 34.538776394910685), +('1.0e16', 36.841361487904731), +('1.0e17', 39.143946580898777), +('1.0e18', 41.446531673892822), +('1.0e19', 43.749116766886868), +('1.0e20', 46.051701859880914), +('1.0e21', 48.354286952874959), +('1.0e22', 50.656872045869005), +('1.0e23', 52.959457138863051), +('1.0e24', 55.262042231857096), +('1.0e25', 57.564627324851142), +('1.0e26', 59.867212417845188), +('1.0e27', 62.169797510839233), +('1.0e28', 64.472382603833279), +('1.0e29', 66.774967696827325), +('1.0e30', 69.077552789821371), +('1.0e31', 71.380137882815416), +('1.0e32', 73.682722975809462), +('1.0e33', 75.985308068803508), +('1.0e34', 78.287893161797553), +('1.0e35', 80.590478254791599), +('1.0e36', 82.893063347785645), +('1.0e37', 85.195648440779690), +('1.0e38', 87.498233533773736), +('1.0e39', 89.800818626767782), +('1.0e40', 92.103403719761827)) +SELECT x, bc_result, ln(x::numeric), ln(x::numeric)-bc_result AS diff FROM t; + x | bc_result | ln | diff +--------+--------------------+--------------------+-------------------- + 1.0e1 | 2.3025850929940457 | 2.3025850929940457 | 0.0000000000000000 + 1.0e2 | 4.6051701859880914 | 4.6051701859880914 | 0.0000000000000000 + 1.0e3 | 6.9077552789821371 | 6.9077552789821371 | 0.0000000000000000 + 1.0e4 | 9.2103403719761827 | 9.2103403719761827 | 0.0000000000000000 + 1.0e5 | 11.512925464970228 | 11.512925464970228 | 0.000000000000000 + 1.0e6 | 13.815510557964274 | 13.815510557964274 | 0.000000000000000 + 1.0e7 | 16.118095650958320 | 16.118095650958320 | 0.000000000000000 + 1.0e8 | 18.420680743952365 | 18.420680743952365 | 0.000000000000000 + 1.0e9 | 20.723265836946411 | 20.723265836946411 | 0.000000000000000 + 1.0e10 | 23.025850929940457 | 23.025850929940457 | 0.000000000000000 + 1.0e11 | 25.328436022934503 | 25.328436022934503 | 0.000000000000000 + 1.0e12 | 27.631021115928548 | 27.631021115928548 | 0.000000000000000 + 1.0e13 | 29.933606208922594 | 29.933606208922594 | 0.000000000000000 + 1.0e14 | 32.236191301916640 | 32.236191301916640 | 0.000000000000000 + 1.0e15 | 34.538776394910685 | 34.538776394910685 | 0.000000000000000 + 1.0e16 | 36.841361487904731 | 36.841361487904731 | 0.000000000000000 + 1.0e17 | 39.143946580898777 | 39.143946580898777 | 0.000000000000000 + 1.0e18 | 41.446531673892822 | 41.446531673892822 | 0.000000000000000 + 1.0e19 | 43.749116766886868 | 43.749116766886868 | 0.000000000000000 + 1.0e20 | 46.051701859880914 | 46.051701859880914 | 0.000000000000000 + 1.0e21 | 48.354286952874959 | 48.354286952874959 | 0.000000000000000 + 1.0e22 | 50.656872045869005 | 50.656872045869005 | 0.000000000000000 + 1.0e23 | 52.959457138863051 | 52.959457138863051 | 0.000000000000000 + 1.0e24 | 55.262042231857096 | 55.262042231857096 | 0.000000000000000 + 1.0e25 | 57.564627324851142 | 57.564627324851142 | 0.000000000000000 + 1.0e26 | 59.867212417845188 | 59.867212417845188 | 0.000000000000000 + 1.0e27 | 62.169797510839233 | 62.169797510839233 | 0.000000000000000 + 1.0e28 | 64.472382603833279 | 64.472382603833279 | 0.000000000000000 + 1.0e29 | 66.774967696827325 | 66.774967696827325 | 0.000000000000000 + 1.0e30 | 69.077552789821371 | 69.077552789821371 | 0.000000000000000 + 1.0e31 | 71.380137882815416 | 71.380137882815416 | 0.000000000000000 + 1.0e32 | 73.682722975809462 | 73.682722975809462 | 0.000000000000000 + 1.0e33 | 75.985308068803508 | 75.985308068803508 | 0.000000000000000 + 1.0e34 | 78.287893161797553 | 78.287893161797553 | 0.000000000000000 + 1.0e35 | 80.590478254791599 | 80.590478254791599 | 0.000000000000000 + 1.0e36 | 82.893063347785645 | 82.893063347785645 | 0.000000000000000 + 1.0e37 | 85.195648440779690 | 85.195648440779690 | 0.000000000000000 + 1.0e38 | 87.498233533773736 | 87.498233533773736 | 0.000000000000000 + 1.0e39 | 89.800818626767782 | 89.800818626767782 | 0.000000000000000 + 1.0e40 | 92.103403719761827 | 92.103403719761827 | 0.000000000000000 +(40 rows) + +-- input huge +-- +-- bc(1) results computed with a scale of 1000 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..10} +-- do +-- l=$(bc -ql <<< "scale=1000 ; l(10^${p}00)" | head -n 1) +-- echo "('1.0e${p}00', $l)," +-- done +WITH t(x, bc_result) AS (VALUES +('1.0e100', 230.25850929940457), +('1.0e200', 460.51701859880914), +('1.0e300', 690.77552789821371), +('1.0e400', 921.03403719761827), +('1.0e500', 1151.2925464970228), +('1.0e600', 1381.5510557964274), +('1.0e700', 1611.8095650958320), +('1.0e800', 1842.0680743952365), +('1.0e900', 2072.3265836946411), +('1.0e1000', 2302.5850929940457)) +SELECT x, bc_result, ln(x::numeric), ln(x::numeric)-bc_result AS diff FROM t; + x | bc_result | ln | diff +----------+--------------------+--------------------+------------------ + 1.0e100 | 230.25850929940457 | 230.25850929940457 | 0.00000000000000 + 1.0e200 | 460.51701859880914 | 460.51701859880914 | 0.00000000000000 + 1.0e300 | 690.77552789821371 | 690.77552789821371 | 0.00000000000000 + 1.0e400 | 921.03403719761827 | 921.03403719761827 | 0.00000000000000 + 1.0e500 | 1151.2925464970228 | 1151.2925464970228 | 0.0000000000000 + 1.0e600 | 1381.5510557964274 | 1381.5510557964274 | 0.0000000000000 + 1.0e700 | 1611.8095650958320 | 1611.8095650958320 | 0.0000000000000 + 1.0e800 | 1842.0680743952365 | 1842.0680743952365 | 0.0000000000000 + 1.0e900 | 2072.3265836946411 | 2072.3265836946411 | 0.0000000000000 + 1.0e1000 | 2302.5850929940457 | 2302.5850929940457 | 0.0000000000000 +(10 rows) + +-- inputs with 1000 decimal places +-- +-- bc(1) results computed with a scale of 2000 and rounded to 1000 decimal +-- places +WITH t(x, bc_result) AS (VALUES +(484990182159328900690402236933516249572671683638747490717351807610531884491845416923860371219625151551889257298200816555016472471293780254009492949585031653913930735918829139712249577547959394351523545901788627247613322896296041868431769047433229466634098452564756860190085118463828382895145244362033728480588969626012192733802377468089120757046364393407262957242230928854711898925295251902007136232994524624903257456111389508582206404271734668422903183500589303866613158037169610592539145461637447957948521714058034772237111009429638870236361143304703683377693378577075353794118557951847394763531830696578809001981568860219578880229402696449243344235099860421846016326538272155937175661905904288335499593232232926636205909086901191153907183842087577811871344870731324067822883041265129394268082883745408414994.8967939438561591657171240282983703914075472645212002662497023142663831371447287624846942598424990784971781730103682951722370983277124599054059027055336437808366784501932987082321905202623642371063626378290734289114618092750984153422293450048717769065428713836637664433167768445609659527458911187829232316677137895259433038764404970599325009178297626038331436654541552998098529141205301472138026818453893127265938030066392881979113522757891639646670670272542401773230506961559808927249585675430838495658225557294666522469887436551840596777627408780618586500922973500018513068499587683746133637919751545157547095670767246977244726331271787622126889459658539988980096764323712767863722912919120929339399753431689512753214200090670880647731689804555417871258907716687575767185444541243606329768784843125926070743277339790277626515824924290352180761378846035233155198504033292692893297993698953705472933411199778880561376633444249703838589180474329586470353212010427945060694794274109764269805332803290229, + 1864.3702986939570026328504202935192533137907736189919154633800554877738455118081651650863235106905871352085850240570561347180517240105510505203972860921397909573687877993477806728098306202020229409548306695695574102950949468160529713610952021974630774784174851619325758380143625473386495586347322798415543385655090746985183329114860118551572428921774322172798724455202876781611633419444058398798142214904998877857425038669920064728855823072107227506485770367799671977282350083029452784747350395161797215115525867416898416360638482342253129160308632504217096916335590470843180746834864303790913372081974355613359678634194879425862536147988835528973291020680020540866655622823550861337486588647231688134992810403147262346312159819432914207194632564009749236609081399504118359354620598232725290537215007867979331582119891661859015726276335168158288396939655310210558566592649049602925182137256134162660116182293851038854455437841571331011002023088829768308520393956515509475418031437505751407687618234418262), +(87190145885430429849953615409019208993240447426362428988181639909267773304254748257120061524000254226856815085523676417146197197996896030672521334101413071112068202429835905642444187493717977611730127126387257253646790849384975208460867137315507010888782632024640844766297185244443116696943912406389670302370461137850160539373600494054874979342373255280815156048999900951842673141766630630919020492255966628630634124452614590400422133958133100159154995520080124736657520969784129924799670552560034302960877087853678350801769339861812435411200669026902417951572668727488315537985378304242438181615160041688723201917323705450185975141141262578884689500612295576288125956289035673242989906973367691922065122033180281670221390667818909912035903387888639331486823729897326624516015340.0330856710565117793999512551468220085711713631167607285185762046751452975325645379302403715842570486302993296501788672462090620871511446272026693318239212657949496275318383141403236705902077406660768573015707706831878445598837931116223956945944726162551477136715847593742032488181481888084716920605114101902724395659898621880016853548602514706686907951229872573180602614761229992106144727082722940736406782659562775289407005631298246624198606031298081220736931229256511054595028182057216042683060059115371651410352645266000330509331097811566633211452233019461903115970558624057877018778178814946285827512359903934291318219271464841957435711594154280905473802599888081783098187210283997106131616471807951265003903143099667366508222327805543948921694362089860577380749774036318574113007382111997454202845559941557812813566442364810680529092880773126707073967537693927177460459341763934709686530005721141046645111784404932103241501569571235364365556796422998363930810983452790309019295181282099408260156, + 1793.5767085750017553306932533574391150814202249805881581227430032600579405884415934520704053351781361105595296647510475380766428668443641914861849764330704062323054023252886955844207807229267936432730818329225450152491146839618683772020068682795388746108876393249306737841247788224204701299467519965182171772253974884845661168860422489046657965359832930382114760565628765599962013955588754803194908990025689040598990346417563277021386852342928910383706995866844541160576254266641602065102228267316550706943783591722246885978355472097314691737807509436806788803362444745551013400341861820755594413819894154786253014501454443272120342005711761286524843010157182464200556865694401941794983935172457481497909987740544409272349152397774548604845897687504977786762391359552407068124283290504752932824699865504970420939586707791994870941813718246825616335675307740641350673558328821461530563823677144691877374809441673507467507447891562257806191361453045937798278733402269265623588493124129181374135958668436774), +(93936642222690597390233191619858485419795942047468396309991947772747208870873993801669373075421461116465960407843923269693395211616591453397070258466704654943689268224479477016161636938138334729982904232438440955361656138189836032891825113139184685132178764873033678116450665758561650355252211196676137179184043639278410827092182700922151290703747496962700158844772453483316974221113826173404445159281421213715669245417896170368554410830320000019029956317336703559699859949692222685614036912057150632902650913831404804982509990655560731349634628713944739168096272097122388116038119844786988276635032016787352796502360718569977397214936366251320294621522016.6483354941025384161536675750898007896744690911429670830432784905421638721478353275821072200938900938046264210604940707974410950770029535636602548377806284157951164875821446035013896786653932045182167021839184824627082391478016195098055107001433336586881395912782883663046617432598969149948351689103230162742769845955320418573803127107923535948653168889411316007796459064267436246637115946581149511513369842911210359447262641996566147462977170742544980481275049898092152042927981394239266559286915303786701737610786594006685748456635797125029722684151298695274097006242412384086302106763844070230264910503179385988626477852818174114043927841085089058972074427820150462261941575665882880501074676800316585217150509780489224388148722603385921057007086785238310735038314861960410473809826927329368597558806004392175746233568789445929554890241140656324160187253042639339549705859147930476532359840809944163908006480881926041259363654863689570520534301207043189181147254153307163555433328278834311658232337, + 1510.4332713542154696529645934345554302578243896764921637693542962119938599884313210100957753316832762996428481801312323020427109678979117469716796746760060470871840325255146954580681101106876674367471955788143763250819168311353856748872452260808797135108102729064040463343792765872545182299889360257515315869180266759715933989413256377582681707188367254513700731642913479683031478361835565783219287780434673712341147656477670848734998849030451414278832848680301511646182446524915091598080243532068451726548537866633622180283865668708517173065893429240665300584705585310049892047293928733753369421499719516009692095913169665213597158441636480707309244604139865130782756488091268094213446272360006907802989573582755585110277620911226015342778471352130366770729972784317323917141031824334355639769512749560550167491709646539950725523461943580211843652293561678342656010571108219244870234329176123205423872844099992204896411752620881541000940129833754169391528449211839693800724450201835161044717173715867437)) +SELECT trim_scale(ln(x::numeric)-bc_result) AS diff FROM t; + diff +------ + 0 + 0 + 0 +(3 rows) + +-- +-- Tests for LOG() (base 10) +-- +-- input very small, exact result known +WITH t(x) AS (SELECT '1e-'||n FROM generate_series(1, 100) g(n)) +SELECT x, log(x::numeric) FROM t; + x | log +--------+----------------------------------------------------------------------------------------------------------- + 1e-1 | -1.0000000000000000 + 1e-2 | -2.0000000000000000 + 1e-3 | -3.0000000000000000 + 1e-4 | -4.0000000000000000 + 1e-5 | -5.000000000000000 + 1e-6 | -6.000000000000000 + 1e-7 | -7.000000000000000 + 1e-8 | -8.000000000000000 + 1e-9 | -9.000000000000000 + 1e-10 | -10.000000000000000 + 1e-11 | -11.000000000000000 + 1e-12 | -12.000000000000000 + 1e-13 | -13.000000000000000 + 1e-14 | -14.000000000000000 + 1e-15 | -15.000000000000000 + 1e-16 | -16.0000000000000000 + 1e-17 | -17.00000000000000000 + 1e-18 | -18.000000000000000000 + 1e-19 | -19.0000000000000000000 + 1e-20 | -20.00000000000000000000 + 1e-21 | -21.000000000000000000000 + 1e-22 | -22.0000000000000000000000 + 1e-23 | -23.00000000000000000000000 + 1e-24 | -24.000000000000000000000000 + 1e-25 | -25.0000000000000000000000000 + 1e-26 | -26.00000000000000000000000000 + 1e-27 | -27.000000000000000000000000000 + 1e-28 | -28.0000000000000000000000000000 + 1e-29 | -29.00000000000000000000000000000 + 1e-30 | -30.000000000000000000000000000000 + 1e-31 | -31.0000000000000000000000000000000 + 1e-32 | -32.00000000000000000000000000000000 + 1e-33 | -33.000000000000000000000000000000000 + 1e-34 | -34.0000000000000000000000000000000000 + 1e-35 | -35.00000000000000000000000000000000000 + 1e-36 | -36.000000000000000000000000000000000000 + 1e-37 | -37.0000000000000000000000000000000000000 + 1e-38 | -38.00000000000000000000000000000000000000 + 1e-39 | -39.000000000000000000000000000000000000000 + 1e-40 | -40.0000000000000000000000000000000000000000 + 1e-41 | -41.00000000000000000000000000000000000000000 + 1e-42 | -42.000000000000000000000000000000000000000000 + 1e-43 | -43.0000000000000000000000000000000000000000000 + 1e-44 | -44.00000000000000000000000000000000000000000000 + 1e-45 | -45.000000000000000000000000000000000000000000000 + 1e-46 | -46.0000000000000000000000000000000000000000000000 + 1e-47 | -47.00000000000000000000000000000000000000000000000 + 1e-48 | -48.000000000000000000000000000000000000000000000000 + 1e-49 | -49.0000000000000000000000000000000000000000000000000 + 1e-50 | -50.00000000000000000000000000000000000000000000000000 + 1e-51 | -51.000000000000000000000000000000000000000000000000000 + 1e-52 | -52.0000000000000000000000000000000000000000000000000000 + 1e-53 | -53.00000000000000000000000000000000000000000000000000000 + 1e-54 | -54.000000000000000000000000000000000000000000000000000000 + 1e-55 | -55.0000000000000000000000000000000000000000000000000000000 + 1e-56 | -56.00000000000000000000000000000000000000000000000000000000 + 1e-57 | -57.000000000000000000000000000000000000000000000000000000000 + 1e-58 | -58.0000000000000000000000000000000000000000000000000000000000 + 1e-59 | -59.00000000000000000000000000000000000000000000000000000000000 + 1e-60 | -60.000000000000000000000000000000000000000000000000000000000000 + 1e-61 | -61.0000000000000000000000000000000000000000000000000000000000000 + 1e-62 | -62.00000000000000000000000000000000000000000000000000000000000000 + 1e-63 | -63.000000000000000000000000000000000000000000000000000000000000000 + 1e-64 | -64.0000000000000000000000000000000000000000000000000000000000000000 + 1e-65 | -65.00000000000000000000000000000000000000000000000000000000000000000 + 1e-66 | -66.000000000000000000000000000000000000000000000000000000000000000000 + 1e-67 | -67.0000000000000000000000000000000000000000000000000000000000000000000 + 1e-68 | -68.00000000000000000000000000000000000000000000000000000000000000000000 + 1e-69 | -69.000000000000000000000000000000000000000000000000000000000000000000000 + 1e-70 | -70.0000000000000000000000000000000000000000000000000000000000000000000000 + 1e-71 | -71.00000000000000000000000000000000000000000000000000000000000000000000000 + 1e-72 | -72.000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-73 | -73.0000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-74 | -74.00000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-75 | -75.000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-76 | -76.0000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-77 | -77.00000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-78 | -78.000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-79 | -79.0000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-80 | -80.00000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-81 | -81.000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-82 | -82.0000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-83 | -83.00000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-84 | -84.000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-85 | -85.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-86 | -86.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-87 | -87.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-88 | -88.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-89 | -89.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-90 | -90.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-91 | -91.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-92 | -92.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-93 | -93.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-94 | -94.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-95 | -95.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-96 | -96.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-97 | -97.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-98 | -98.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-99 | -99.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 1e-100 | -100.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +(100 rows) + +-- input very small, non-exact results +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..50..7} +-- do +-- for d in {9..1..3} +-- do +-- l=$(bc -ql <<< "scale=500 ; l($d*10^-$p) / l(10)" | head -n 1) +-- echo "('${d}.0e-$p', $l)," +-- done +-- done +WITH t(x, bc_result) AS (VALUES +('9.0e-1', -.04575749056067513), +('6.0e-1', -.2218487496163564), +('3.0e-1', -.5228787452803376), +('9.0e-8', -7.045757490560675), +('6.0e-8', -7.221848749616356), +('3.0e-8', -7.522878745280338), +('9.0e-15', -14.0457574905606751), +('6.0e-15', -14.2218487496163564), +('3.0e-15', -14.5228787452803376), +('9.0e-22', -21.04575749056067512540994), +('6.0e-22', -21.22184874961635636749123), +('3.0e-22', -21.52287874528033756270497), +('9.0e-29', -28.045757490560675125409944193490), +('6.0e-29', -28.221848749616356367491233202020), +('3.0e-29', -28.522878745280337562704972096745), +('9.0e-36', -35.0457574905606751254099441934897693816), +('6.0e-36', -35.2218487496163563674912332020203916640), +('3.0e-36', -35.5228787452803375627049720967448846908), +('9.0e-43', -42.04575749056067512540994419348976938159974227), +('6.0e-43', -42.22184874961635636749123320202039166403168125), +('3.0e-43', -42.52287874528033756270497209674488469079987114), +('9.0e-50', -49.045757490560675125409944193489769381599742271618608), +('6.0e-50', -49.221848749616356367491233202020391664031681254347196), +('3.0e-50', -49.522878745280337562704972096744884690799871135809304)) +SELECT x, bc_result, log(x::numeric), log(x::numeric)-bc_result AS diff FROM t; + x | bc_result | log | diff +---------+---------------------------------------------------------+---------------------------------------------------------+------------------------------------------------------- + 9.0e-1 | -0.04575749056067513 | -0.04575749056067513 | 0.00000000000000000 + 6.0e-1 | -0.2218487496163564 | -0.2218487496163564 | 0.0000000000000000 + 3.0e-1 | -0.5228787452803376 | -0.5228787452803376 | 0.0000000000000000 + 9.0e-8 | -7.045757490560675 | -7.045757490560675 | 0.000000000000000 + 6.0e-8 | -7.221848749616356 | -7.221848749616356 | 0.000000000000000 + 3.0e-8 | -7.522878745280338 | -7.522878745280338 | 0.000000000000000 + 9.0e-15 | -14.0457574905606751 | -14.0457574905606751 | 0.0000000000000000 + 6.0e-15 | -14.2218487496163564 | -14.2218487496163564 | 0.0000000000000000 + 3.0e-15 | -14.5228787452803376 | -14.5228787452803376 | 0.0000000000000000 + 9.0e-22 | -21.04575749056067512540994 | -21.04575749056067512540994 | 0.00000000000000000000000 + 6.0e-22 | -21.22184874961635636749123 | -21.22184874961635636749123 | 0.00000000000000000000000 + 3.0e-22 | -21.52287874528033756270497 | -21.52287874528033756270497 | 0.00000000000000000000000 + 9.0e-29 | -28.045757490560675125409944193490 | -28.045757490560675125409944193490 | 0.000000000000000000000000000000 + 6.0e-29 | -28.221848749616356367491233202020 | -28.221848749616356367491233202020 | 0.000000000000000000000000000000 + 3.0e-29 | -28.522878745280337562704972096745 | -28.522878745280337562704972096745 | 0.000000000000000000000000000000 + 9.0e-36 | -35.0457574905606751254099441934897693816 | -35.0457574905606751254099441934897693816 | 0.0000000000000000000000000000000000000 + 6.0e-36 | -35.2218487496163563674912332020203916640 | -35.2218487496163563674912332020203916640 | 0.0000000000000000000000000000000000000 + 3.0e-36 | -35.5228787452803375627049720967448846908 | -35.5228787452803375627049720967448846908 | 0.0000000000000000000000000000000000000 + 9.0e-43 | -42.04575749056067512540994419348976938159974227 | -42.04575749056067512540994419348976938159974227 | 0.00000000000000000000000000000000000000000000 + 6.0e-43 | -42.22184874961635636749123320202039166403168125 | -42.22184874961635636749123320202039166403168125 | 0.00000000000000000000000000000000000000000000 + 3.0e-43 | -42.52287874528033756270497209674488469079987114 | -42.52287874528033756270497209674488469079987114 | 0.00000000000000000000000000000000000000000000 + 9.0e-50 | -49.045757490560675125409944193489769381599742271618608 | -49.045757490560675125409944193489769381599742271618608 | 0.000000000000000000000000000000000000000000000000000 + 6.0e-50 | -49.221848749616356367491233202020391664031681254347196 | -49.221848749616356367491233202020391664031681254347196 | 0.000000000000000000000000000000000000000000000000000 + 3.0e-50 | -49.522878745280337562704972096744884690799871135809304 | -49.522878745280337562704972096744884690799871135809304 | 0.000000000000000000000000000000000000000000000000000 +(24 rows) + +-- input very close to but smaller than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40..7} +-- do +-- for d in {9..1..3} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(1-$d*10^-$p) / l(10)" | head -n 1) +-- echo "('${d}.0e-$p', $l)," +-- done +-- done +WITH t(x, bc_result) AS (VALUES +('9.0e-1', -1.0000000000000000), +('6.0e-1', -.3979400086720376), +('3.0e-1', -.1549019599857432), +('9.0e-8', -.000000039086505130185422), +('6.0e-8', -.000000026057669695925208), +('3.0e-8', -.000000013028834652530076), +('9.0e-15', -.0000000000000039086503371292840), +('6.0e-15', -.0000000000000026057668914195188), +('3.0e-15', -.0000000000000013028834457097574), +('9.0e-22', -.00000000000000000000039086503371292664), +('6.0e-22', -.00000000000000000000026057668914195110), +('3.0e-22', -.00000000000000000000013028834457097555), +('9.0e-29', -.000000000000000000000000000039086503371292664), +('6.0e-29', -.000000000000000000000000000026057668914195110), +('3.0e-29', -.000000000000000000000000000013028834457097555), +('9.0e-36', -.0000000000000000000000000000000000039086503371292664), +('6.0e-36', -.0000000000000000000000000000000000026057668914195110), +('3.0e-36', -.0000000000000000000000000000000000013028834457097555)) +SELECT '1-'||x, bc_result, log(1.0-x::numeric), log(1.0-x::numeric)-bc_result AS diff FROM t; + ?column? | bc_result | log | diff +-----------+---------------------------------------------------------+---------------------------------------------------------+-------------------------------------------------------- + 1-9.0e-1 | -1.0000000000000000 | -1.0000000000000000 | 0.0000000000000000 + 1-6.0e-1 | -0.3979400086720376 | -0.3979400086720376 | 0.0000000000000000 + 1-3.0e-1 | -0.1549019599857432 | -0.1549019599857432 | 0.0000000000000000 + 1-9.0e-8 | -0.000000039086505130185422 | -0.000000039086505130185422 | 0.000000000000000000000000 + 1-6.0e-8 | -0.000000026057669695925208 | -0.000000026057669695925208 | 0.000000000000000000000000 + 1-3.0e-8 | -0.000000013028834652530076 | -0.000000013028834652530076 | 0.000000000000000000000000 + 1-9.0e-15 | -0.0000000000000039086503371292840 | -0.0000000000000039086503371292840 | 0.0000000000000000000000000000000 + 1-6.0e-15 | -0.0000000000000026057668914195188 | -0.0000000000000026057668914195188 | 0.0000000000000000000000000000000 + 1-3.0e-15 | -0.0000000000000013028834457097574 | -0.0000000000000013028834457097574 | 0.0000000000000000000000000000000 + 1-9.0e-22 | -0.00000000000000000000039086503371292664 | -0.00000000000000000000039086503371292664 | 0.00000000000000000000000000000000000000 + 1-6.0e-22 | -0.00000000000000000000026057668914195110 | -0.00000000000000000000026057668914195110 | 0.00000000000000000000000000000000000000 + 1-3.0e-22 | -0.00000000000000000000013028834457097555 | -0.00000000000000000000013028834457097555 | 0.00000000000000000000000000000000000000 + 1-9.0e-29 | -0.000000000000000000000000000039086503371292664 | -0.000000000000000000000000000039086503371292664 | 0.000000000000000000000000000000000000000000000 + 1-6.0e-29 | -0.000000000000000000000000000026057668914195110 | -0.000000000000000000000000000026057668914195110 | 0.000000000000000000000000000000000000000000000 + 1-3.0e-29 | -0.000000000000000000000000000013028834457097555 | -0.000000000000000000000000000013028834457097555 | 0.000000000000000000000000000000000000000000000 + 1-9.0e-36 | -0.0000000000000000000000000000000000039086503371292664 | -0.0000000000000000000000000000000000039086503371292664 | 0.0000000000000000000000000000000000000000000000000000 + 1-6.0e-36 | -0.0000000000000000000000000000000000026057668914195110 | -0.0000000000000000000000000000000000026057668914195110 | 0.0000000000000000000000000000000000000000000000000000 + 1-3.0e-36 | -0.0000000000000000000000000000000000013028834457097555 | -0.0000000000000000000000000000000000013028834457097555 | 0.0000000000000000000000000000000000000000000000000000 +(18 rows) + +-- input very close to but larger than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40..7} +-- do +-- for d in {9..1..3} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(1+$d*10^-$p) / l(10)" | head -n 1) +-- echo "('${d}.0e-$p', $l)," +-- done +-- done +WITH t(x, bc_result) AS (VALUES +('9.0e-1', .2787536009528290), +('6.0e-1', .2041199826559248), +('3.0e-1', .1139433523068368), +('9.0e-8', .000000039086501612400118), +('6.0e-8', .000000026057668132465074), +('3.0e-8', .000000013028834261665042), +('9.0e-15', .0000000000000039086503371292489), +('6.0e-15', .0000000000000026057668914195031), +('3.0e-15', .0000000000000013028834457097535), +('9.0e-22', .00000000000000000000039086503371292664), +('6.0e-22', .00000000000000000000026057668914195110), +('3.0e-22', .00000000000000000000013028834457097555), +('9.0e-29', .000000000000000000000000000039086503371292664), +('6.0e-29', .000000000000000000000000000026057668914195110), +('3.0e-29', .000000000000000000000000000013028834457097555), +('9.0e-36', .0000000000000000000000000000000000039086503371292664), +('6.0e-36', .0000000000000000000000000000000000026057668914195110), +('3.0e-36', .0000000000000000000000000000000000013028834457097555)) +SELECT '1+'||x, bc_result, log(1.0+x::numeric), log(1.0+x::numeric)-bc_result AS diff FROM t; + ?column? | bc_result | log | diff +-----------+--------------------------------------------------------+--------------------------------------------------------+-------------------------------------------------------- + 1+9.0e-1 | 0.2787536009528290 | 0.2787536009528290 | 0.0000000000000000 + 1+6.0e-1 | 0.2041199826559248 | 0.2041199826559248 | 0.0000000000000000 + 1+3.0e-1 | 0.1139433523068368 | 0.1139433523068368 | 0.0000000000000000 + 1+9.0e-8 | 0.000000039086501612400118 | 0.000000039086501612400118 | 0.000000000000000000000000 + 1+6.0e-8 | 0.000000026057668132465074 | 0.000000026057668132465074 | 0.000000000000000000000000 + 1+3.0e-8 | 0.000000013028834261665042 | 0.000000013028834261665042 | 0.000000000000000000000000 + 1+9.0e-15 | 0.0000000000000039086503371292489 | 0.0000000000000039086503371292489 | 0.0000000000000000000000000000000 + 1+6.0e-15 | 0.0000000000000026057668914195031 | 0.0000000000000026057668914195031 | 0.0000000000000000000000000000000 + 1+3.0e-15 | 0.0000000000000013028834457097535 | 0.0000000000000013028834457097535 | 0.0000000000000000000000000000000 + 1+9.0e-22 | 0.00000000000000000000039086503371292664 | 0.00000000000000000000039086503371292664 | 0.00000000000000000000000000000000000000 + 1+6.0e-22 | 0.00000000000000000000026057668914195110 | 0.00000000000000000000026057668914195110 | 0.00000000000000000000000000000000000000 + 1+3.0e-22 | 0.00000000000000000000013028834457097555 | 0.00000000000000000000013028834457097555 | 0.00000000000000000000000000000000000000 + 1+9.0e-29 | 0.000000000000000000000000000039086503371292664 | 0.000000000000000000000000000039086503371292664 | 0.000000000000000000000000000000000000000000000 + 1+6.0e-29 | 0.000000000000000000000000000026057668914195110 | 0.000000000000000000000000000026057668914195110 | 0.000000000000000000000000000000000000000000000 + 1+3.0e-29 | 0.000000000000000000000000000013028834457097555 | 0.000000000000000000000000000013028834457097555 | 0.000000000000000000000000000000000000000000000 + 1+9.0e-36 | 0.0000000000000000000000000000000000039086503371292664 | 0.0000000000000000000000000000000000039086503371292664 | 0.0000000000000000000000000000000000000000000000000000 + 1+6.0e-36 | 0.0000000000000000000000000000000000026057668914195110 | 0.0000000000000000000000000000000000026057668914195110 | 0.0000000000000000000000000000000000000000000000000000 + 1+3.0e-36 | 0.0000000000000000000000000000000000013028834457097555 | 0.0000000000000000000000000000000000013028834457097555 | 0.0000000000000000000000000000000000000000000000000000 +(18 rows) + +-- input very large, exact result known +WITH t(x) AS (SELECT '1e'||n FROM generate_series(1, 100) g(n)) +SELECT x, log(x::numeric) FROM t; + x | log +-------+-------------------- + 1e1 | 1.0000000000000000 + 1e2 | 2.0000000000000000 + 1e3 | 3.0000000000000000 + 1e4 | 4.0000000000000000 + 1e5 | 5.000000000000000 + 1e6 | 6.000000000000000 + 1e7 | 7.000000000000000 + 1e8 | 8.000000000000000 + 1e9 | 9.000000000000000 + 1e10 | 10.000000000000000 + 1e11 | 11.000000000000000 + 1e12 | 12.000000000000000 + 1e13 | 13.000000000000000 + 1e14 | 14.000000000000000 + 1e15 | 15.000000000000000 + 1e16 | 16.000000000000000 + 1e17 | 17.000000000000000 + 1e18 | 18.000000000000000 + 1e19 | 19.000000000000000 + 1e20 | 20.000000000000000 + 1e21 | 21.000000000000000 + 1e22 | 22.000000000000000 + 1e23 | 23.000000000000000 + 1e24 | 24.000000000000000 + 1e25 | 25.000000000000000 + 1e26 | 26.000000000000000 + 1e27 | 27.000000000000000 + 1e28 | 28.000000000000000 + 1e29 | 29.000000000000000 + 1e30 | 30.000000000000000 + 1e31 | 31.000000000000000 + 1e32 | 32.000000000000000 + 1e33 | 33.000000000000000 + 1e34 | 34.000000000000000 + 1e35 | 35.000000000000000 + 1e36 | 36.000000000000000 + 1e37 | 37.000000000000000 + 1e38 | 38.000000000000000 + 1e39 | 39.000000000000000 + 1e40 | 40.000000000000000 + 1e41 | 41.000000000000000 + 1e42 | 42.000000000000000 + 1e43 | 43.000000000000000 + 1e44 | 44.00000000000000 + 1e45 | 45.00000000000000 + 1e46 | 46.00000000000000 + 1e47 | 47.00000000000000 + 1e48 | 48.00000000000000 + 1e49 | 49.00000000000000 + 1e50 | 50.00000000000000 + 1e51 | 51.00000000000000 + 1e52 | 52.00000000000000 + 1e53 | 53.00000000000000 + 1e54 | 54.00000000000000 + 1e55 | 55.00000000000000 + 1e56 | 56.00000000000000 + 1e57 | 57.00000000000000 + 1e58 | 58.00000000000000 + 1e59 | 59.00000000000000 + 1e60 | 60.00000000000000 + 1e61 | 61.00000000000000 + 1e62 | 62.00000000000000 + 1e63 | 63.00000000000000 + 1e64 | 64.00000000000000 + 1e65 | 65.00000000000000 + 1e66 | 66.00000000000000 + 1e67 | 67.00000000000000 + 1e68 | 68.00000000000000 + 1e69 | 69.00000000000000 + 1e70 | 70.00000000000000 + 1e71 | 71.00000000000000 + 1e72 | 72.00000000000000 + 1e73 | 73.00000000000000 + 1e74 | 74.00000000000000 + 1e75 | 75.00000000000000 + 1e76 | 76.00000000000000 + 1e77 | 77.00000000000000 + 1e78 | 78.00000000000000 + 1e79 | 79.00000000000000 + 1e80 | 80.00000000000000 + 1e81 | 81.00000000000000 + 1e82 | 82.00000000000000 + 1e83 | 83.00000000000000 + 1e84 | 84.00000000000000 + 1e85 | 85.00000000000000 + 1e86 | 86.00000000000000 + 1e87 | 87.00000000000000 + 1e88 | 88.00000000000000 + 1e89 | 89.00000000000000 + 1e90 | 90.00000000000000 + 1e91 | 91.00000000000000 + 1e92 | 92.00000000000000 + 1e93 | 93.00000000000000 + 1e94 | 94.00000000000000 + 1e95 | 95.00000000000000 + 1e96 | 96.00000000000000 + 1e97 | 97.00000000000000 + 1e98 | 98.00000000000000 + 1e99 | 99.00000000000000 + 1e100 | 100.00000000000000 +(100 rows) + +-- input very large, non-exact results +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {10..50..7} +-- do +-- for d in {2..9..3} +-- do +-- l=$(bc -ql <<< "scale=500 ; l($d*10^$p) / l(10)" | head -n 1) +-- echo "('${d}.0e$p', $l)," +-- done +-- done +WITH t(x, bc_result) AS (VALUES +('2.0e10', 10.301029995663981), +('5.0e10', 10.698970004336019), +('8.0e10', 10.903089986991944), +('2.0e17', 17.301029995663981), +('5.0e17', 17.698970004336019), +('8.0e17', 17.903089986991944), +('2.0e24', 24.301029995663981), +('5.0e24', 24.698970004336019), +('8.0e24', 24.903089986991944), +('2.0e31', 31.301029995663981), +('5.0e31', 31.698970004336019), +('8.0e31', 31.903089986991944), +('2.0e38', 38.301029995663981), +('5.0e38', 38.698970004336019), +('8.0e38', 38.903089986991944), +('2.0e45', 45.30102999566398), +('5.0e45', 45.69897000433602), +('8.0e45', 45.90308998699194)) +SELECT x, bc_result, log(x::numeric), log(x::numeric)-bc_result AS diff FROM t; + x | bc_result | log | diff +--------+--------------------+--------------------+------------------- + 2.0e10 | 10.301029995663981 | 10.301029995663981 | 0.000000000000000 + 5.0e10 | 10.698970004336019 | 10.698970004336019 | 0.000000000000000 + 8.0e10 | 10.903089986991944 | 10.903089986991944 | 0.000000000000000 + 2.0e17 | 17.301029995663981 | 17.301029995663981 | 0.000000000000000 + 5.0e17 | 17.698970004336019 | 17.698970004336019 | 0.000000000000000 + 8.0e17 | 17.903089986991944 | 17.903089986991944 | 0.000000000000000 + 2.0e24 | 24.301029995663981 | 24.301029995663981 | 0.000000000000000 + 5.0e24 | 24.698970004336019 | 24.698970004336019 | 0.000000000000000 + 8.0e24 | 24.903089986991944 | 24.903089986991944 | 0.000000000000000 + 2.0e31 | 31.301029995663981 | 31.301029995663981 | 0.000000000000000 + 5.0e31 | 31.698970004336019 | 31.698970004336019 | 0.000000000000000 + 8.0e31 | 31.903089986991944 | 31.903089986991944 | 0.000000000000000 + 2.0e38 | 38.301029995663981 | 38.301029995663981 | 0.000000000000000 + 5.0e38 | 38.698970004336019 | 38.698970004336019 | 0.000000000000000 + 8.0e38 | 38.903089986991944 | 38.903089986991944 | 0.000000000000000 + 2.0e45 | 45.30102999566398 | 45.30102999566398 | 0.00000000000000 + 5.0e45 | 45.69897000433602 | 45.69897000433602 | 0.00000000000000 + 8.0e45 | 45.90308998699194 | 45.90308998699194 | 0.00000000000000 +(18 rows) + diff --git a/src/test/singlenode_regress/expected/numerology.out b/src/test/singlenode_regress/expected/numerology.out new file mode 100644 index 00000000000..44d6c435ded --- /dev/null +++ b/src/test/singlenode_regress/expected/numerology.out @@ -0,0 +1,136 @@ +-- +-- NUMEROLOGY +-- Test various combinations of numeric types and functions. +-- +-- +-- Test implicit type conversions +-- This fails for Postgres v6.1 (and earlier?) +-- so let's try explicit conversions for now - tgl 97/05/07 +-- +CREATE TABLE TEMP_FLOAT (f1 FLOAT8); +INSERT INTO TEMP_FLOAT (f1) + SELECT float8(f1) FROM INT4_TBL; +INSERT INTO TEMP_FLOAT (f1) + SELECT float8(f1) FROM INT2_TBL; +SELECT f1 FROM TEMP_FLOAT + ORDER BY f1; + f1 +------------- + -2147483647 + -123456 + -32767 + -1234 + 0 + 0 + 1234 + 32767 + 123456 + 2147483647 +(10 rows) + +-- int4 +CREATE TABLE TEMP_INT4 (f1 INT4); +INSERT INTO TEMP_INT4 (f1) + SELECT int4(f1) FROM FLOAT8_TBL + WHERE (f1 > -2147483647) AND (f1 < 2147483647); +INSERT INTO TEMP_INT4 (f1) + SELECT int4(f1) FROM INT2_TBL; +SELECT f1 FROM TEMP_INT4 + ORDER BY f1; + f1 +-------- + -32767 + -1234 + -1004 + -35 + 0 + 0 + 0 + 1234 + 32767 +(9 rows) + +-- int2 +CREATE TABLE TEMP_INT2 (f1 INT2); +INSERT INTO TEMP_INT2 (f1) + SELECT int2(f1) FROM FLOAT8_TBL + WHERE (f1 >= -32767) AND (f1 <= 32767); +INSERT INTO TEMP_INT2 (f1) + SELECT int2(f1) FROM INT4_TBL + WHERE (f1 >= -32767) AND (f1 <= 32767); +SELECT f1 FROM TEMP_INT2 + ORDER BY f1; + f1 +------- + -1004 + -35 + 0 + 0 + 0 +(5 rows) + +-- +-- Group-by combinations +-- +CREATE TABLE TEMP_GROUP (f1 INT4, f2 INT4, f3 FLOAT8); +INSERT INTO TEMP_GROUP + SELECT 1, (- i.f1), (- f.f1) + FROM INT4_TBL i, FLOAT8_TBL f; +INSERT INTO TEMP_GROUP + SELECT 2, i.f1, f.f1 + FROM INT4_TBL i, FLOAT8_TBL f; +SELECT DISTINCT f1 AS two FROM TEMP_GROUP ORDER BY 1; + two +----- + 1 + 2 +(2 rows) + +SELECT f1 AS two, max(f3) AS max_float, min(f3) as min_float + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, max_float, min_float; + two | max_float | min_float +-----+----------------------+----------------------- + 1 | 1.2345678901234e+200 | -0 + 2 | 0 | -1.2345678901234e+200 +(2 rows) + +-- GROUP BY a result column name is not legal per SQL92, but we accept it +-- anyway (if the name is not the name of any column exposed by FROM). +SELECT f1 AS two, max(f3) AS max_float, min(f3) AS min_float + FROM TEMP_GROUP + GROUP BY two + ORDER BY two, max_float, min_float; + two | max_float | min_float +-----+----------------------+----------------------- + 1 | 1.2345678901234e+200 | -0 + 2 | 0 | -1.2345678901234e+200 +(2 rows) + +SELECT f1 AS two, (max(f3) + 1) AS max_plus_1, (min(f3) - 1) AS min_minus_1 + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, min_minus_1; + two | max_plus_1 | min_minus_1 +-----+----------------------+----------------------- + 1 | 1.2345678901234e+200 | -1 + 2 | 1 | -1.2345678901234e+200 +(2 rows) + +SELECT f1 AS two, + max(f2) + min(f2) AS max_plus_min, + min(f3) - 1 AS min_minus_1 + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, min_minus_1; + two | max_plus_min | min_minus_1 +-----+--------------+----------------------- + 1 | 0 | -1 + 2 | 0 | -1.2345678901234e+200 +(2 rows) + +DROP TABLE TEMP_INT2; +DROP TABLE TEMP_INT4; +DROP TABLE TEMP_FLOAT; +DROP TABLE TEMP_GROUP; diff --git a/src/test/singlenode_regress/expected/object_address.out b/src/test/singlenode_regress/expected/object_address.out new file mode 100644 index 00000000000..388097a6957 --- /dev/null +++ b/src/test/singlenode_regress/expected/object_address.out @@ -0,0 +1,623 @@ +-- +-- Test for pg_get_object_address +-- +-- Clean up in case a prior regression run failed +SET client_min_messages TO 'warning'; +DROP ROLE IF EXISTS regress_addr_user; +RESET client_min_messages; +CREATE USER regress_addr_user; +-- Test generic object addressing/identification functions +CREATE SCHEMA addr_nsp; +SET search_path TO 'addr_nsp'; +CREATE FOREIGN DATA WRAPPER addr_fdw; +CREATE SERVER addr_fserv FOREIGN DATA WRAPPER addr_fdw; +CREATE TEXT SEARCH DICTIONARY addr_ts_dict (template=simple); +CREATE TEXT SEARCH CONFIGURATION addr_ts_conf (copy=english); +CREATE TEXT SEARCH TEMPLATE addr_ts_temp (lexize=dsimple_lexize); +CREATE TEXT SEARCH PARSER addr_ts_prs + (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +CREATE TABLE addr_nsp.gentable ( + a serial primary key CONSTRAINT a_chk CHECK (a > 0), + b text DEFAULT 'hello'); +CREATE TABLE addr_nsp.parttable ( + a int PRIMARY KEY +) PARTITION BY RANGE (a); +CREATE VIEW addr_nsp.genview AS SELECT * from addr_nsp.gentable; +CREATE MATERIALIZED VIEW addr_nsp.genmatview AS SELECT * FROM addr_nsp.gentable; +CREATE TYPE addr_nsp.gencomptype AS (a int); +CREATE TYPE addr_nsp.genenum AS ENUM ('one', 'two'); +CREATE FOREIGN TABLE addr_nsp.genftable (a int) SERVER addr_fserv; +CREATE AGGREGATE addr_nsp.genaggr(int4) (sfunc = int4pl, stype = int4); +CREATE DOMAIN addr_nsp.gendomain AS int4 CONSTRAINT domconstr CHECK (value > 0); +CREATE FUNCTION addr_nsp.trig() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN END; $$; +CREATE TRIGGER t BEFORE INSERT ON addr_nsp.gentable FOR EACH ROW EXECUTE PROCEDURE addr_nsp.trig(); +CREATE POLICY genpol ON addr_nsp.gentable; +CREATE PROCEDURE addr_nsp.proc(int4) LANGUAGE SQL AS $$ $$; +CREATE SERVER "integer" FOREIGN DATA WRAPPER addr_fdw; +CREATE USER MAPPING FOR regress_addr_user SERVER "integer"; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_addr_user IN SCHEMA public GRANT ALL ON TABLES TO regress_addr_user; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_addr_user REVOKE DELETE ON TABLES FROM regress_addr_user; +-- this transform would be quite unsafe to leave lying around, +-- except that the SQL language pays no attention to transforms: +CREATE TRANSFORM FOR int LANGUAGE SQL ( + FROM SQL WITH FUNCTION prsd_lextype(internal), + TO SQL WITH FUNCTION int4recv(internal)); +-- suppress warning that depends on wal_level +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; +RESET client_min_messages; +CREATE SUBSCRIPTION regress_addr_sub CONNECTION '' PUBLICATION bar WITH (connect = false, slot_name = NONE); +WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables +CREATE STATISTICS addr_nsp.gentable_stat ON a, b FROM addr_nsp.gentable; +-- test some error cases +SELECT pg_get_object_address('stone', '{}', '{}'); +ERROR: unrecognized object type "stone" +SELECT pg_get_object_address('table', '{}', '{}'); +ERROR: name list length must be at least 1 +SELECT pg_get_object_address('table', '{NULL}', '{}'); +ERROR: name or argument lists may not contain nulls +-- unrecognized object types +DO $$ +DECLARE + objtype text; +BEGIN + FOR objtype IN VALUES ('toast table'), ('index column'), ('sequence column'), + ('toast table column'), ('view column'), ('materialized view column') + LOOP + BEGIN + PERFORM pg_get_object_address(objtype, '{one}', '{}'); + EXCEPTION WHEN invalid_parameter_value THEN + RAISE WARNING 'error for %: %', objtype, sqlerrm; + END; + END LOOP; +END; +$$; +WARNING: error for toast table: unsupported object type "toast table" +WARNING: error for index column: unsupported object type "index column" +WARNING: error for sequence column: unsupported object type "sequence column" +WARNING: error for toast table column: unsupported object type "toast table column" +WARNING: error for view column: unsupported object type "view column" +WARNING: error for materialized view column: unsupported object type "materialized view column" +-- miscellaneous other errors +select * from pg_get_object_address('operator of access method', '{btree,integer_ops,1}', '{int4,bool}'); +ERROR: operator 1 (int4, bool) of operator family integer_ops for access method btree does not exist +select * from pg_get_object_address('operator of access method', '{btree,integer_ops,99}', '{int4,int4}'); +ERROR: operator 99 (int4, int4) of operator family integer_ops for access method btree does not exist +select * from pg_get_object_address('function of access method', '{btree,integer_ops,1}', '{int4,bool}'); +ERROR: function 1 (int4, bool) of operator family integer_ops for access method btree does not exist +select * from pg_get_object_address('function of access method', '{btree,integer_ops,99}', '{int4,int4}'); +ERROR: function 99 (int4, int4) of operator family integer_ops for access method btree does not exist +DO $$ +DECLARE + objtype text; + names text[]; + args text[]; +BEGIN + FOR objtype IN VALUES + ('table'), ('index'), ('sequence'), ('view'), + ('materialized view'), ('foreign table'), + ('table column'), ('foreign table column'), + ('aggregate'), ('function'), ('procedure'), ('type'), ('cast'), + ('table constraint'), ('domain constraint'), ('conversion'), ('default value'), + ('operator'), ('operator class'), ('operator family'), ('rule'), ('trigger'), + ('text search parser'), ('text search dictionary'), + ('text search template'), ('text search configuration'), + ('policy'), ('user mapping'), ('default acl'), ('transform'), + ('operator of access method'), ('function of access method'), + ('publication relation') + LOOP + FOR names IN VALUES ('{eins}'), ('{addr_nsp, zwei}'), ('{eins, zwei, drei}') + LOOP + FOR args IN VALUES ('{}'), ('{integer}') + LOOP + BEGIN + PERFORM pg_get_object_address(objtype, names, args); + EXCEPTION WHEN OTHERS THEN + RAISE WARNING 'error for %,%,%: %', objtype, names, args, sqlerrm; + END; + END LOOP; + END LOOP; + END LOOP; +END; +$$; +WARNING: error for table,{eins},{}: relation "eins" does not exist +WARNING: error for table,{eins},{integer}: relation "eins" does not exist +WARNING: error for table,{addr_nsp,zwei},{}: relation "addr_nsp.zwei" does not exist +WARNING: error for table,{addr_nsp,zwei},{integer}: relation "addr_nsp.zwei" does not exist +WARNING: error for table,{eins,zwei,drei},{}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for table,{eins,zwei,drei},{integer}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for index,{eins},{}: relation "eins" does not exist +WARNING: error for index,{eins},{integer}: relation "eins" does not exist +WARNING: error for index,{addr_nsp,zwei},{}: relation "addr_nsp.zwei" does not exist +WARNING: error for index,{addr_nsp,zwei},{integer}: relation "addr_nsp.zwei" does not exist +WARNING: error for index,{eins,zwei,drei},{}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for index,{eins,zwei,drei},{integer}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for sequence,{eins},{}: relation "eins" does not exist +WARNING: error for sequence,{eins},{integer}: relation "eins" does not exist +WARNING: error for sequence,{addr_nsp,zwei},{}: relation "addr_nsp.zwei" does not exist +WARNING: error for sequence,{addr_nsp,zwei},{integer}: relation "addr_nsp.zwei" does not exist +WARNING: error for sequence,{eins,zwei,drei},{}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for sequence,{eins,zwei,drei},{integer}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for view,{eins},{}: relation "eins" does not exist +WARNING: error for view,{eins},{integer}: relation "eins" does not exist +WARNING: error for view,{addr_nsp,zwei},{}: relation "addr_nsp.zwei" does not exist +WARNING: error for view,{addr_nsp,zwei},{integer}: relation "addr_nsp.zwei" does not exist +WARNING: error for view,{eins,zwei,drei},{}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for view,{eins,zwei,drei},{integer}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for materialized view,{eins},{}: relation "eins" does not exist +WARNING: error for materialized view,{eins},{integer}: relation "eins" does not exist +WARNING: error for materialized view,{addr_nsp,zwei},{}: relation "addr_nsp.zwei" does not exist +WARNING: error for materialized view,{addr_nsp,zwei},{integer}: relation "addr_nsp.zwei" does not exist +WARNING: error for materialized view,{eins,zwei,drei},{}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for materialized view,{eins,zwei,drei},{integer}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for foreign table,{eins},{}: relation "eins" does not exist +WARNING: error for foreign table,{eins},{integer}: relation "eins" does not exist +WARNING: error for foreign table,{addr_nsp,zwei},{}: relation "addr_nsp.zwei" does not exist +WARNING: error for foreign table,{addr_nsp,zwei},{integer}: relation "addr_nsp.zwei" does not exist +WARNING: error for foreign table,{eins,zwei,drei},{}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for foreign table,{eins,zwei,drei},{integer}: cross-database references are not implemented: "eins.zwei.drei" +WARNING: error for table column,{eins},{}: column name must be qualified +WARNING: error for table column,{eins},{integer}: column name must be qualified +WARNING: error for table column,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist +WARNING: error for table column,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist +WARNING: error for table column,{eins,zwei,drei},{}: schema "eins" does not exist +WARNING: error for table column,{eins,zwei,drei},{integer}: schema "eins" does not exist +WARNING: error for foreign table column,{eins},{}: column name must be qualified +WARNING: error for foreign table column,{eins},{integer}: column name must be qualified +WARNING: error for foreign table column,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist +WARNING: error for foreign table column,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist +WARNING: error for foreign table column,{eins,zwei,drei},{}: schema "eins" does not exist +WARNING: error for foreign table column,{eins,zwei,drei},{integer}: schema "eins" does not exist +WARNING: error for aggregate,{eins},{}: aggregate eins(*) does not exist +WARNING: error for aggregate,{eins},{integer}: aggregate eins(integer) does not exist +WARNING: error for aggregate,{addr_nsp,zwei},{}: aggregate addr_nsp.zwei(*) does not exist +WARNING: error for aggregate,{addr_nsp,zwei},{integer}: aggregate addr_nsp.zwei(integer) does not exist +WARNING: error for aggregate,{eins,zwei,drei},{}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for aggregate,{eins,zwei,drei},{integer}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for function,{eins},{}: function eins() does not exist +WARNING: error for function,{eins},{integer}: function eins(integer) does not exist +WARNING: error for function,{addr_nsp,zwei},{}: function addr_nsp.zwei() does not exist +WARNING: error for function,{addr_nsp,zwei},{integer}: function addr_nsp.zwei(integer) does not exist +WARNING: error for function,{eins,zwei,drei},{}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for function,{eins,zwei,drei},{integer}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for procedure,{eins},{}: procedure eins() does not exist +WARNING: error for procedure,{eins},{integer}: procedure eins(integer) does not exist +WARNING: error for procedure,{addr_nsp,zwei},{}: procedure addr_nsp.zwei() does not exist +WARNING: error for procedure,{addr_nsp,zwei},{integer}: procedure addr_nsp.zwei(integer) does not exist +WARNING: error for procedure,{eins,zwei,drei},{}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for procedure,{eins,zwei,drei},{integer}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for type,{eins},{}: type "eins" does not exist +WARNING: error for type,{eins},{integer}: type "eins" does not exist +WARNING: error for type,{addr_nsp,zwei},{}: name list length must be exactly 1 +WARNING: error for type,{addr_nsp,zwei},{integer}: name list length must be exactly 1 +WARNING: error for type,{eins,zwei,drei},{}: name list length must be exactly 1 +WARNING: error for type,{eins,zwei,drei},{integer}: name list length must be exactly 1 +WARNING: error for cast,{eins},{}: argument list length must be exactly 1 +WARNING: error for cast,{eins},{integer}: type "eins" does not exist +WARNING: error for cast,{addr_nsp,zwei},{}: name list length must be exactly 1 +WARNING: error for cast,{addr_nsp,zwei},{integer}: name list length must be exactly 1 +WARNING: error for cast,{eins,zwei,drei},{}: name list length must be exactly 1 +WARNING: error for cast,{eins,zwei,drei},{integer}: name list length must be exactly 1 +WARNING: error for table constraint,{eins},{}: must specify relation and object name +WARNING: error for table constraint,{eins},{integer}: must specify relation and object name +WARNING: error for table constraint,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist +WARNING: error for table constraint,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist +WARNING: error for table constraint,{eins,zwei,drei},{}: schema "eins" does not exist +WARNING: error for table constraint,{eins,zwei,drei},{integer}: schema "eins" does not exist +WARNING: error for domain constraint,{eins},{}: argument list length must be exactly 1 +WARNING: error for domain constraint,{eins},{integer}: type "eins" does not exist +WARNING: error for domain constraint,{addr_nsp,zwei},{}: name list length must be exactly 1 +WARNING: error for domain constraint,{addr_nsp,zwei},{integer}: name list length must be exactly 1 +WARNING: error for domain constraint,{eins,zwei,drei},{}: name list length must be exactly 1 +WARNING: error for domain constraint,{eins,zwei,drei},{integer}: name list length must be exactly 1 +WARNING: error for conversion,{eins},{}: conversion "eins" does not exist +WARNING: error for conversion,{eins},{integer}: conversion "eins" does not exist +WARNING: error for conversion,{addr_nsp,zwei},{}: conversion "addr_nsp.zwei" does not exist +WARNING: error for conversion,{addr_nsp,zwei},{integer}: conversion "addr_nsp.zwei" does not exist +WARNING: error for conversion,{eins,zwei,drei},{}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for conversion,{eins,zwei,drei},{integer}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for default value,{eins},{}: column name must be qualified +WARNING: error for default value,{eins},{integer}: column name must be qualified +WARNING: error for default value,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist +WARNING: error for default value,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist +WARNING: error for default value,{eins,zwei,drei},{}: schema "eins" does not exist +WARNING: error for default value,{eins,zwei,drei},{integer}: schema "eins" does not exist +WARNING: error for operator,{eins},{}: argument list length must be exactly 2 +WARNING: error for operator,{eins},{integer}: argument list length must be exactly 2 +WARNING: error for operator,{addr_nsp,zwei},{}: argument list length must be exactly 2 +WARNING: error for operator,{addr_nsp,zwei},{integer}: argument list length must be exactly 2 +WARNING: error for operator,{eins,zwei,drei},{}: argument list length must be exactly 2 +WARNING: error for operator,{eins,zwei,drei},{integer}: argument list length must be exactly 2 +WARNING: error for operator class,{eins},{}: name list length must be at least 2 +WARNING: error for operator class,{eins},{integer}: name list length must be at least 2 +WARNING: error for operator class,{addr_nsp,zwei},{}: access method "addr_nsp" does not exist +WARNING: error for operator class,{addr_nsp,zwei},{integer}: access method "addr_nsp" does not exist +WARNING: error for operator class,{eins,zwei,drei},{}: access method "eins" does not exist +WARNING: error for operator class,{eins,zwei,drei},{integer}: access method "eins" does not exist +WARNING: error for operator family,{eins},{}: name list length must be at least 2 +WARNING: error for operator family,{eins},{integer}: name list length must be at least 2 +WARNING: error for operator family,{addr_nsp,zwei},{}: access method "addr_nsp" does not exist +WARNING: error for operator family,{addr_nsp,zwei},{integer}: access method "addr_nsp" does not exist +WARNING: error for operator family,{eins,zwei,drei},{}: access method "eins" does not exist +WARNING: error for operator family,{eins,zwei,drei},{integer}: access method "eins" does not exist +WARNING: error for rule,{eins},{}: must specify relation and object name +WARNING: error for rule,{eins},{integer}: must specify relation and object name +WARNING: error for rule,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist +WARNING: error for rule,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist +WARNING: error for rule,{eins,zwei,drei},{}: schema "eins" does not exist +WARNING: error for rule,{eins,zwei,drei},{integer}: schema "eins" does not exist +WARNING: error for trigger,{eins},{}: must specify relation and object name +WARNING: error for trigger,{eins},{integer}: must specify relation and object name +WARNING: error for trigger,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist +WARNING: error for trigger,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist +WARNING: error for trigger,{eins,zwei,drei},{}: schema "eins" does not exist +WARNING: error for trigger,{eins,zwei,drei},{integer}: schema "eins" does not exist +WARNING: error for text search parser,{eins},{}: text search parser "eins" does not exist +WARNING: error for text search parser,{eins},{integer}: text search parser "eins" does not exist +WARNING: error for text search parser,{addr_nsp,zwei},{}: text search parser "addr_nsp.zwei" does not exist +WARNING: error for text search parser,{addr_nsp,zwei},{integer}: text search parser "addr_nsp.zwei" does not exist +WARNING: error for text search parser,{eins,zwei,drei},{}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for text search parser,{eins,zwei,drei},{integer}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for text search dictionary,{eins},{}: text search dictionary "eins" does not exist +WARNING: error for text search dictionary,{eins},{integer}: text search dictionary "eins" does not exist +WARNING: error for text search dictionary,{addr_nsp,zwei},{}: text search dictionary "addr_nsp.zwei" does not exist +WARNING: error for text search dictionary,{addr_nsp,zwei},{integer}: text search dictionary "addr_nsp.zwei" does not exist +WARNING: error for text search dictionary,{eins,zwei,drei},{}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for text search dictionary,{eins,zwei,drei},{integer}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for text search template,{eins},{}: text search template "eins" does not exist +WARNING: error for text search template,{eins},{integer}: text search template "eins" does not exist +WARNING: error for text search template,{addr_nsp,zwei},{}: text search template "addr_nsp.zwei" does not exist +WARNING: error for text search template,{addr_nsp,zwei},{integer}: text search template "addr_nsp.zwei" does not exist +WARNING: error for text search template,{eins,zwei,drei},{}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for text search template,{eins,zwei,drei},{integer}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for text search configuration,{eins},{}: text search configuration "eins" does not exist +WARNING: error for text search configuration,{eins},{integer}: text search configuration "eins" does not exist +WARNING: error for text search configuration,{addr_nsp,zwei},{}: text search configuration "addr_nsp.zwei" does not exist +WARNING: error for text search configuration,{addr_nsp,zwei},{integer}: text search configuration "addr_nsp.zwei" does not exist +WARNING: error for text search configuration,{eins,zwei,drei},{}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for text search configuration,{eins,zwei,drei},{integer}: cross-database references are not implemented: eins.zwei.drei +WARNING: error for policy,{eins},{}: must specify relation and object name +WARNING: error for policy,{eins},{integer}: must specify relation and object name +WARNING: error for policy,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist +WARNING: error for policy,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist +WARNING: error for policy,{eins,zwei,drei},{}: schema "eins" does not exist +WARNING: error for policy,{eins,zwei,drei},{integer}: schema "eins" does not exist +WARNING: error for user mapping,{eins},{}: argument list length must be exactly 1 +WARNING: error for user mapping,{eins},{integer}: user mapping for user "eins" on server "integer" does not exist +WARNING: error for user mapping,{addr_nsp,zwei},{}: argument list length must be exactly 1 +WARNING: error for user mapping,{addr_nsp,zwei},{integer}: user mapping for user "addr_nsp" on server "integer" does not exist +WARNING: error for user mapping,{eins,zwei,drei},{}: argument list length must be exactly 1 +WARNING: error for user mapping,{eins,zwei,drei},{integer}: user mapping for user "eins" on server "integer" does not exist +WARNING: error for default acl,{eins},{}: argument list length must be exactly 1 +WARNING: error for default acl,{eins},{integer}: unrecognized default ACL object type "i" +WARNING: error for default acl,{addr_nsp,zwei},{}: argument list length must be exactly 1 +WARNING: error for default acl,{addr_nsp,zwei},{integer}: unrecognized default ACL object type "i" +WARNING: error for default acl,{eins,zwei,drei},{}: argument list length must be exactly 1 +WARNING: error for default acl,{eins,zwei,drei},{integer}: unrecognized default ACL object type "i" +WARNING: error for transform,{eins},{}: argument list length must be exactly 1 +WARNING: error for transform,{eins},{integer}: type "eins" does not exist +WARNING: error for transform,{addr_nsp,zwei},{}: name list length must be exactly 1 +WARNING: error for transform,{addr_nsp,zwei},{integer}: name list length must be exactly 1 +WARNING: error for transform,{eins,zwei,drei},{}: name list length must be exactly 1 +WARNING: error for transform,{eins,zwei,drei},{integer}: name list length must be exactly 1 +WARNING: error for operator of access method,{eins},{}: name list length must be at least 3 +WARNING: error for operator of access method,{eins},{integer}: name list length must be at least 3 +WARNING: error for operator of access method,{addr_nsp,zwei},{}: name list length must be at least 3 +WARNING: error for operator of access method,{addr_nsp,zwei},{integer}: name list length must be at least 3 +WARNING: error for operator of access method,{eins,zwei,drei},{}: argument list length must be exactly 2 +WARNING: error for operator of access method,{eins,zwei,drei},{integer}: argument list length must be exactly 2 +WARNING: error for function of access method,{eins},{}: name list length must be at least 3 +WARNING: error for function of access method,{eins},{integer}: name list length must be at least 3 +WARNING: error for function of access method,{addr_nsp,zwei},{}: name list length must be at least 3 +WARNING: error for function of access method,{addr_nsp,zwei},{integer}: name list length must be at least 3 +WARNING: error for function of access method,{eins,zwei,drei},{}: argument list length must be exactly 2 +WARNING: error for function of access method,{eins,zwei,drei},{integer}: argument list length must be exactly 2 +WARNING: error for publication relation,{eins},{}: argument list length must be exactly 1 +WARNING: error for publication relation,{eins},{integer}: relation "eins" does not exist +WARNING: error for publication relation,{addr_nsp,zwei},{}: argument list length must be exactly 1 +WARNING: error for publication relation,{addr_nsp,zwei},{integer}: relation "addr_nsp.zwei" does not exist +WARNING: error for publication relation,{eins,zwei,drei},{}: argument list length must be exactly 1 +WARNING: error for publication relation,{eins,zwei,drei},{integer}: cross-database references are not implemented: "eins.zwei.drei" +-- these object types cannot be qualified names +SELECT pg_get_object_address('language', '{one}', '{}'); +ERROR: language "one" does not exist +SELECT pg_get_object_address('language', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('large object', '{123}', '{}'); +ERROR: large object 123 does not exist +SELECT pg_get_object_address('large object', '{123,456}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('large object', '{blargh}', '{}'); +ERROR: invalid input syntax for type oid: "blargh" +SELECT pg_get_object_address('schema', '{one}', '{}'); +ERROR: schema "one" does not exist +SELECT pg_get_object_address('schema', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('role', '{one}', '{}'); +ERROR: role "one" does not exist +SELECT pg_get_object_address('role', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('database', '{one}', '{}'); +ERROR: database "one" does not exist +SELECT pg_get_object_address('database', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('tablespace', '{one}', '{}'); +ERROR: tablespace "one" does not exist +SELECT pg_get_object_address('tablespace', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('foreign-data wrapper', '{one}', '{}'); +ERROR: foreign-data wrapper "one" does not exist +SELECT pg_get_object_address('foreign-data wrapper', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('server', '{one}', '{}'); +ERROR: server "one" does not exist +SELECT pg_get_object_address('server', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('extension', '{one}', '{}'); +ERROR: extension "one" does not exist +SELECT pg_get_object_address('extension', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('event trigger', '{one}', '{}'); +ERROR: event trigger "one" does not exist +SELECT pg_get_object_address('event trigger', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('access method', '{one}', '{}'); +ERROR: access method "one" does not exist +SELECT pg_get_object_address('access method', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('publication', '{one}', '{}'); +ERROR: publication "one" does not exist +SELECT pg_get_object_address('publication', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +SELECT pg_get_object_address('subscription', '{one}', '{}'); +ERROR: subscription "one" does not exist +SELECT pg_get_object_address('subscription', '{one,two}', '{}'); +ERROR: name list length must be exactly 1 +-- test successful cases +WITH objects (type, name, args) AS (VALUES + ('table', '{addr_nsp, gentable}'::text[], '{}'::text[]), + ('table', '{addr_nsp, parttable}'::text[], '{}'::text[]), + ('index', '{addr_nsp, gentable_pkey}', '{}'), + ('index', '{addr_nsp, parttable_pkey}', '{}'), + ('sequence', '{addr_nsp, gentable_a_seq}', '{}'), + -- toast table + ('view', '{addr_nsp, genview}', '{}'), + ('materialized view', '{addr_nsp, genmatview}', '{}'), + ('foreign table', '{addr_nsp, genftable}', '{}'), + ('table column', '{addr_nsp, gentable, b}', '{}'), + ('foreign table column', '{addr_nsp, genftable, a}', '{}'), + ('aggregate', '{addr_nsp, genaggr}', '{int4}'), + ('function', '{pg_catalog, pg_identify_object}', '{pg_catalog.oid, pg_catalog.oid, int4}'), + ('procedure', '{addr_nsp, proc}', '{int4}'), + ('type', '{pg_catalog._int4}', '{}'), + ('type', '{addr_nsp.gendomain}', '{}'), + ('type', '{addr_nsp.gencomptype}', '{}'), + ('type', '{addr_nsp.genenum}', '{}'), + ('cast', '{int8}', '{int4}'), + ('collation', '{default}', '{}'), + ('table constraint', '{addr_nsp, gentable, a_chk}', '{}'), + ('domain constraint', '{addr_nsp.gendomain}', '{domconstr}'), + ('conversion', '{pg_catalog, koi8_r_to_mic}', '{}'), + ('default value', '{addr_nsp, gentable, b}', '{}'), + ('language', '{plpgsql}', '{}'), + -- large object + ('operator', '{+}', '{int4, int4}'), + ('operator class', '{btree, int4_ops}', '{}'), + ('operator family', '{btree, integer_ops}', '{}'), + ('operator of access method', '{btree,integer_ops,1}', '{integer,integer}'), + ('function of access method', '{btree,integer_ops,2}', '{integer,integer}'), + ('rule', '{addr_nsp, genview, _RETURN}', '{}'), + ('trigger', '{addr_nsp, gentable, t}', '{}'), + ('schema', '{addr_nsp}', '{}'), + ('text search parser', '{addr_ts_prs}', '{}'), + ('text search dictionary', '{addr_ts_dict}', '{}'), + ('text search template', '{addr_ts_temp}', '{}'), + ('text search configuration', '{addr_ts_conf}', '{}'), + ('role', '{regress_addr_user}', '{}'), + -- database + -- tablespace + ('foreign-data wrapper', '{addr_fdw}', '{}'), + ('server', '{addr_fserv}', '{}'), + ('user mapping', '{regress_addr_user}', '{integer}'), + ('default acl', '{regress_addr_user,public}', '{r}'), + ('default acl', '{regress_addr_user}', '{r}'), + -- extension + -- event trigger + ('policy', '{addr_nsp, gentable, genpol}', '{}'), + ('transform', '{int}', '{sql}'), + ('access method', '{btree}', '{}'), + ('publication', '{addr_pub}', '{}'), + ('publication relation', '{addr_nsp, gentable}', '{addr_pub}'), + ('subscription', '{regress_addr_sub}', '{}'), + ('statistics object', '{addr_nsp, gentable_stat}', '{}') + ) +SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)).*, + -- test roundtrip through pg_identify_object_as_address + ROW(pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)) = + ROW(pg_identify_object(addr2.classid, addr2.objid, addr2.objsubid)) + FROM objects, pg_get_object_address(type, name, args) addr1, + pg_identify_object_as_address(classid, objid, objsubid) ioa(typ,nms,args), + pg_get_object_address(typ, nms, ioa.args) as addr2 + ORDER BY addr1.classid, addr1.objid, addr1.objsubid; + type | schema | name | identity | ?column? +---------------------------+------------+-------------------+----------------------------------------------------------------------+---------- + default acl | | | for role regress_addr_user in schema public on tables | t + default acl | | | for role regress_addr_user on tables | t + type | pg_catalog | _int4 | integer[] | t + type | addr_nsp | gencomptype | addr_nsp.gencomptype | t + type | addr_nsp | genenum | addr_nsp.genenum | t + type | addr_nsp | gendomain | addr_nsp.gendomain | t + function | pg_catalog | | pg_catalog.pg_identify_object(pg_catalog.oid,pg_catalog.oid,integer) | t + aggregate | addr_nsp | | addr_nsp.genaggr(integer) | t + procedure | addr_nsp | | addr_nsp.proc(integer) | t + sequence | addr_nsp | gentable_a_seq | addr_nsp.gentable_a_seq | t + table | addr_nsp | gentable | addr_nsp.gentable | t + table column | addr_nsp | gentable | addr_nsp.gentable.b | t + index | addr_nsp | gentable_pkey | addr_nsp.gentable_pkey | t + table | addr_nsp | parttable | addr_nsp.parttable | t + index | addr_nsp | parttable_pkey | addr_nsp.parttable_pkey | t + view | addr_nsp | genview | addr_nsp.genview | t + materialized view | addr_nsp | genmatview | addr_nsp.genmatview | t + foreign table | addr_nsp | genftable | addr_nsp.genftable | t + foreign table column | addr_nsp | genftable | addr_nsp.genftable.a | t + role | | regress_addr_user | regress_addr_user | t + server | | addr_fserv | addr_fserv | t + user mapping | | | regress_addr_user on server integer | t + foreign-data wrapper | | addr_fdw | addr_fdw | t + access method | | btree | btree | t + operator of access method | | | operator 1 (integer, integer) of pg_catalog.integer_ops USING btree | t + function of access method | | | function 2 (integer, integer) of pg_catalog.integer_ops USING btree | t + default value | | | for addr_nsp.gentable.b | t + cast | | | (bigint AS integer) | t + table constraint | addr_nsp | | a_chk on addr_nsp.gentable | t + domain constraint | addr_nsp | | domconstr on addr_nsp.gendomain | t + conversion | pg_catalog | koi8_r_to_mic | pg_catalog.koi8_r_to_mic | t + language | | plpgsql | plpgsql | t + schema | | addr_nsp | addr_nsp | t + operator class | pg_catalog | int4_ops | pg_catalog.int4_ops USING btree | t + operator | pg_catalog | | pg_catalog.+(integer,integer) | t + rule | | | "_RETURN" on addr_nsp.genview | t + trigger | | | t on addr_nsp.gentable | t + operator family | pg_catalog | integer_ops | pg_catalog.integer_ops USING btree | t + policy | | | genpol on addr_nsp.gentable | t + statistics object | addr_nsp | gentable_stat | addr_nsp.gentable_stat | t + collation | pg_catalog | "default" | pg_catalog."default" | t + transform | | | for integer on language sql | t + text search dictionary | addr_nsp | addr_ts_dict | addr_nsp.addr_ts_dict | t + text search parser | addr_nsp | addr_ts_prs | addr_nsp.addr_ts_prs | t + text search configuration | addr_nsp | addr_ts_conf | addr_nsp.addr_ts_conf | t + text search template | addr_nsp | addr_ts_temp | addr_nsp.addr_ts_temp | t + subscription | | regress_addr_sub | regress_addr_sub | t + publication | | addr_pub | addr_pub | t + publication relation | | | addr_nsp.gentable in publication addr_pub | t +(49 rows) + +--- +--- Cleanup resources +--- +DROP FOREIGN DATA WRAPPER addr_fdw CASCADE; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to server addr_fserv +drop cascades to foreign table genftable +drop cascades to server integer +drop cascades to user mapping for regress_addr_user on server integer +DROP PUBLICATION addr_pub; +DROP SUBSCRIPTION regress_addr_sub; +DROP SCHEMA addr_nsp CASCADE; +NOTICE: drop cascades to 14 other objects +DETAIL: drop cascades to text search dictionary addr_ts_dict +drop cascades to text search configuration addr_ts_conf +drop cascades to text search template addr_ts_temp +drop cascades to text search parser addr_ts_prs +drop cascades to table gentable +drop cascades to table parttable +drop cascades to view genview +drop cascades to materialized view genmatview +drop cascades to type gencomptype +drop cascades to type genenum +drop cascades to function genaggr(integer) +drop cascades to type gendomain +drop cascades to function trig() +drop cascades to function proc(integer) +DROP OWNED BY regress_addr_user; +DROP USER regress_addr_user; +-- +-- Checks for invalid objects +-- +-- Make sure that NULL handling is correct. +\pset null 'NULL' +-- Temporarily disable fancy output, so as future additions never create +-- a large amount of diffs. +\a\t +-- Keep this list in the same order as getObjectIdentityParts() +-- in objectaddress.c. +WITH objects (classid, objid, objsubid) AS (VALUES + ('pg_class'::regclass, 0, 0), -- no relation + ('pg_class'::regclass, 'pg_class'::regclass, 100), -- no column for relation + ('pg_proc'::regclass, 0, 0), -- no function + ('pg_type'::regclass, 0, 0), -- no type + ('pg_cast'::regclass, 0, 0), -- no cast + ('pg_collation'::regclass, 0, 0), -- no collation + ('pg_constraint'::regclass, 0, 0), -- no constraint + ('pg_conversion'::regclass, 0, 0), -- no conversion + ('pg_attrdef'::regclass, 0, 0), -- no default attribute + ('pg_language'::regclass, 0, 0), -- no language + ('pg_largeobject'::regclass, 0, 0), -- no large object, no error + ('pg_operator'::regclass, 0, 0), -- no operator + ('pg_opclass'::regclass, 0, 0), -- no opclass, no need to check for no access method + ('pg_opfamily'::regclass, 0, 0), -- no opfamily + ('pg_am'::regclass, 0, 0), -- no access method + ('pg_amop'::regclass, 0, 0), -- no AM operator + ('pg_amproc'::regclass, 0, 0), -- no AM proc + ('pg_rewrite'::regclass, 0, 0), -- no rewrite + ('pg_trigger'::regclass, 0, 0), -- no trigger + ('pg_namespace'::regclass, 0, 0), -- no schema + ('pg_statistic_ext'::regclass, 0, 0), -- no statistics + ('pg_ts_parser'::regclass, 0, 0), -- no TS parser + ('pg_ts_dict'::regclass, 0, 0), -- no TS dictionnary + ('pg_ts_template'::regclass, 0, 0), -- no TS template + ('pg_ts_config'::regclass, 0, 0), -- no TS configuration + ('pg_authid'::regclass, 0, 0), -- no role + ('pg_database'::regclass, 0, 0), -- no database + ('pg_tablespace'::regclass, 0, 0), -- no tablespace + ('pg_foreign_data_wrapper'::regclass, 0, 0), -- no FDW + ('pg_foreign_server'::regclass, 0, 0), -- no server + ('pg_user_mapping'::regclass, 0, 0), -- no user mapping + ('pg_default_acl'::regclass, 0, 0), -- no default ACL + ('pg_extension'::regclass, 0, 0), -- no extension + ('pg_event_trigger'::regclass, 0, 0), -- no event trigger + ('pg_policy'::regclass, 0, 0), -- no policy + ('pg_publication'::regclass, 0, 0), -- no publication + ('pg_publication_rel'::regclass, 0, 0), -- no publication relation + ('pg_subscription'::regclass, 0, 0), -- no subscription + ('pg_transform'::regclass, 0, 0) -- no transformation + ) +SELECT ROW(pg_identify_object(objects.classid, objects.objid, objects.objsubid)) + AS ident, + ROW(pg_identify_object_as_address(objects.classid, objects.objid, objects.objsubid)) + AS addr, + pg_describe_object(objects.classid, objects.objid, objects.objsubid) + AS descr +FROM objects +ORDER BY objects.classid, objects.objid, objects.objsubid; +("(""default acl"",,,)")|("(""default acl"",,)")|NULL +("(tablespace,,,)")|("(tablespace,,)")|NULL +("(type,,,)")|("(type,,)")|NULL +("(routine,,,)")|("(routine,,)")|NULL +("(relation,,,)")|("(relation,,)")|NULL +("(""table column"",,,)")|("(""table column"",,)")|NULL +("(role,,,)")|("(role,,)")|NULL +("(database,,,)")|("(database,,)")|NULL +("(server,,,)")|("(server,,)")|NULL +("(""user mapping"",,,)")|("(""user mapping"",,)")|NULL +("(""foreign-data wrapper"",,,)")|("(""foreign-data wrapper"",,)")|NULL +("(""access method"",,,)")|("(""access method"",,)")|NULL +("(""operator of access method"",,,)")|("(""operator of access method"",,)")|NULL +("(""function of access method"",,,)")|("(""function of access method"",,)")|NULL +("(""default value"",,,)")|("(""default value"",,)")|NULL +("(cast,,,)")|("(cast,,)")|NULL +("(constraint,,,)")|("(constraint,,)")|NULL +("(conversion,,,)")|("(conversion,,)")|NULL +("(language,,,)")|("(language,,)")|NULL +("(""large object"",,,)")|("(""large object"",,)")|NULL +("(schema,,,)")|("(schema,,)")|NULL +("(""operator class"",,,)")|("(""operator class"",,)")|NULL +("(operator,,,)")|("(operator,,)")|NULL +("(rule,,,)")|("(rule,,)")|NULL +("(trigger,,,)")|("(trigger,,)")|NULL +("(""operator family"",,,)")|("(""operator family"",,)")|NULL +("(extension,,,)")|("(extension,,)")|NULL +("(policy,,,)")|("(policy,,)")|NULL +("(""statistics object"",,,)")|("(""statistics object"",,)")|NULL +("(collation,,,)")|("(collation,,)")|NULL +("(""event trigger"",,,)")|("(""event trigger"",,)")|NULL +("(transform,,,)")|("(transform,,)")|NULL +("(""text search dictionary"",,,)")|("(""text search dictionary"",,)")|NULL +("(""text search parser"",,,)")|("(""text search parser"",,)")|NULL +("(""text search configuration"",,,)")|("(""text search configuration"",,)")|NULL +("(""text search template"",,,)")|("(""text search template"",,)")|NULL +("(subscription,,,)")|("(subscription,,)")|NULL +("(publication,,,)")|("(publication,,)")|NULL +("(""publication relation"",,,)")|("(""publication relation"",,)")|NULL +-- restore normal output mode +\a\t diff --git a/src/test/singlenode_regress/expected/oid.out b/src/test/singlenode_regress/expected/oid.out new file mode 100644 index 00000000000..89093734536 --- /dev/null +++ b/src/test/singlenode_regress/expected/oid.out @@ -0,0 +1,122 @@ +-- +-- OID +-- +CREATE TABLE OID_TBL(f1 oid); +INSERT INTO OID_TBL(f1) VALUES ('1234'); +INSERT INTO OID_TBL(f1) VALUES ('1235'); +INSERT INTO OID_TBL(f1) VALUES ('987'); +INSERT INTO OID_TBL(f1) VALUES ('-1040'); +INSERT INTO OID_TBL(f1) VALUES ('99999999'); +INSERT INTO OID_TBL(f1) VALUES ('5 '); +INSERT INTO OID_TBL(f1) VALUES (' 10 '); +-- leading/trailing hard tab is also allowed +INSERT INTO OID_TBL(f1) VALUES (' 15 '); +-- bad inputs +INSERT INTO OID_TBL(f1) VALUES (''); +ERROR: invalid input syntax for type oid: "" +LINE 1: INSERT INTO OID_TBL(f1) VALUES (''); + ^ +INSERT INTO OID_TBL(f1) VALUES (' '); +ERROR: invalid input syntax for type oid: " " +LINE 1: INSERT INTO OID_TBL(f1) VALUES (' '); + ^ +INSERT INTO OID_TBL(f1) VALUES ('asdfasd'); +ERROR: invalid input syntax for type oid: "asdfasd" +LINE 1: INSERT INTO OID_TBL(f1) VALUES ('asdfasd'); + ^ +INSERT INTO OID_TBL(f1) VALUES ('99asdfasd'); +ERROR: invalid input syntax for type oid: "99asdfasd" +LINE 1: INSERT INTO OID_TBL(f1) VALUES ('99asdfasd'); + ^ +INSERT INTO OID_TBL(f1) VALUES ('5 d'); +ERROR: invalid input syntax for type oid: "5 d" +LINE 1: INSERT INTO OID_TBL(f1) VALUES ('5 d'); + ^ +INSERT INTO OID_TBL(f1) VALUES (' 5d'); +ERROR: invalid input syntax for type oid: " 5d" +LINE 1: INSERT INTO OID_TBL(f1) VALUES (' 5d'); + ^ +INSERT INTO OID_TBL(f1) VALUES ('5 5'); +ERROR: invalid input syntax for type oid: "5 5" +LINE 1: INSERT INTO OID_TBL(f1) VALUES ('5 5'); + ^ +INSERT INTO OID_TBL(f1) VALUES (' - 500'); +ERROR: invalid input syntax for type oid: " - 500" +LINE 1: INSERT INTO OID_TBL(f1) VALUES (' - 500'); + ^ +INSERT INTO OID_TBL(f1) VALUES ('32958209582039852935'); +ERROR: value "32958209582039852935" is out of range for type oid +LINE 1: INSERT INTO OID_TBL(f1) VALUES ('32958209582039852935'); + ^ +INSERT INTO OID_TBL(f1) VALUES ('-23582358720398502385'); +ERROR: value "-23582358720398502385" is out of range for type oid +LINE 1: INSERT INTO OID_TBL(f1) VALUES ('-23582358720398502385'); + ^ +SELECT * FROM OID_TBL; + f1 +------------ + 1234 + 1235 + 987 + 4294966256 + 99999999 + 5 + 10 + 15 +(8 rows) + +SELECT o.* FROM OID_TBL o WHERE o.f1 = 1234; + f1 +------ + 1234 +(1 row) + +SELECT o.* FROM OID_TBL o WHERE o.f1 <> '1234'; + f1 +------------ + 1235 + 987 + 4294966256 + 99999999 + 5 + 10 + 15 +(7 rows) + +SELECT o.* FROM OID_TBL o WHERE o.f1 <= '1234'; + f1 +------ + 1234 + 987 + 5 + 10 + 15 +(5 rows) + +SELECT o.* FROM OID_TBL o WHERE o.f1 < '1234'; + f1 +----- + 987 + 5 + 10 + 15 +(4 rows) + +SELECT o.* FROM OID_TBL o WHERE o.f1 >= '1234'; + f1 +------------ + 1234 + 1235 + 4294966256 + 99999999 +(4 rows) + +SELECT o.* FROM OID_TBL o WHERE o.f1 > '1234'; + f1 +------------ + 1235 + 4294966256 + 99999999 +(3 rows) + +DROP TABLE OID_TBL; diff --git a/src/test/singlenode_regress/expected/oidjoins.out b/src/test/singlenode_regress/expected/oidjoins.out new file mode 100644 index 00000000000..8ef30c843c7 --- /dev/null +++ b/src/test/singlenode_regress/expected/oidjoins.out @@ -0,0 +1,272 @@ +-- +-- Verify system catalog foreign key relationships +-- +DO $doblock$ +declare + fk record; + nkeys integer; + cmd text; + err record; +begin + for fk in select * from pg_get_catalog_foreign_keys() + loop + raise notice 'checking % % => % %', + fk.fktable, fk.fkcols, fk.pktable, fk.pkcols; + nkeys := array_length(fk.fkcols, 1); + cmd := 'SELECT ctid'; + for i in 1 .. nkeys loop + cmd := cmd || ', ' || quote_ident(fk.fkcols[i]); + end loop; + if fk.is_array then + cmd := cmd || ' FROM (SELECT ctid'; + for i in 1 .. nkeys-1 loop + cmd := cmd || ', ' || quote_ident(fk.fkcols[i]); + end loop; + cmd := cmd || ', unnest(' || quote_ident(fk.fkcols[nkeys]); + cmd := cmd || ') as ' || quote_ident(fk.fkcols[nkeys]); + cmd := cmd || ' FROM ' || fk.fktable::text || ') fk WHERE '; + else + cmd := cmd || ' FROM ' || fk.fktable::text || ' fk WHERE '; + end if; + if fk.is_opt then + for i in 1 .. nkeys loop + cmd := cmd || quote_ident(fk.fkcols[i]) || ' != 0 AND '; + end loop; + end if; + cmd := cmd || 'NOT EXISTS(SELECT 1 FROM ' || fk.pktable::text || ' pk WHERE '; + for i in 1 .. nkeys loop + if i > 1 then cmd := cmd || ' AND '; end if; + cmd := cmd || 'pk.' || quote_ident(fk.pkcols[i]); + cmd := cmd || ' = fk.' || quote_ident(fk.fkcols[i]); + end loop; + cmd := cmd || ')'; + -- raise notice 'cmd = %', cmd; + for err in execute cmd loop + raise warning 'FK VIOLATION IN %(%): %', fk.fktable, fk.fkcols, err; + end loop; + end loop; +end +$doblock$; +NOTICE: checking pg_proc {pronamespace} => pg_namespace {oid} +NOTICE: checking pg_proc {proowner} => pg_authid {oid} +NOTICE: checking pg_proc {prolang} => pg_language {oid} +NOTICE: checking pg_proc {provariadic} => pg_type {oid} +NOTICE: checking pg_proc {prosupport} => pg_proc {oid} +NOTICE: checking pg_proc {prorettype} => pg_type {oid} +NOTICE: checking pg_proc {proargtypes} => pg_type {oid} +NOTICE: checking pg_proc {proallargtypes} => pg_type {oid} +NOTICE: checking pg_proc {protrftypes} => pg_type {oid} +NOTICE: checking pg_type {typnamespace} => pg_namespace {oid} +NOTICE: checking pg_type {typowner} => pg_authid {oid} +NOTICE: checking pg_type {typrelid} => pg_class {oid} +NOTICE: checking pg_type {typsubscript} => pg_proc {oid} +NOTICE: checking pg_type {typelem} => pg_type {oid} +NOTICE: checking pg_type {typarray} => pg_type {oid} +NOTICE: checking pg_type {typinput} => pg_proc {oid} +NOTICE: checking pg_type {typoutput} => pg_proc {oid} +NOTICE: checking pg_type {typreceive} => pg_proc {oid} +NOTICE: checking pg_type {typsend} => pg_proc {oid} +NOTICE: checking pg_type {typmodin} => pg_proc {oid} +NOTICE: checking pg_type {typmodout} => pg_proc {oid} +NOTICE: checking pg_type {typanalyze} => pg_proc {oid} +NOTICE: checking pg_type {typbasetype} => pg_type {oid} +NOTICE: checking pg_type {typcollation} => pg_collation {oid} +NOTICE: checking pg_attribute {attrelid} => pg_class {oid} +NOTICE: checking pg_attribute {atttypid} => pg_type {oid} +NOTICE: checking pg_attribute {attcollation} => pg_collation {oid} +NOTICE: checking pg_class {relnamespace} => pg_namespace {oid} +NOTICE: checking pg_class {reltype} => pg_type {oid} +NOTICE: checking pg_class {reloftype} => pg_type {oid} +NOTICE: checking pg_class {relowner} => pg_authid {oid} +NOTICE: checking pg_class {relam} => pg_am {oid} +NOTICE: checking pg_class {reltablespace} => pg_tablespace {oid} +NOTICE: checking pg_class {reltoastrelid} => pg_class {oid} +NOTICE: checking pg_class {relrewrite} => pg_class {oid} +NOTICE: checking pg_attrdef {adrelid} => pg_class {oid} +NOTICE: checking pg_attrdef {adrelid,adnum} => pg_attribute {attrelid,attnum} +NOTICE: checking pg_constraint {connamespace} => pg_namespace {oid} +NOTICE: checking pg_constraint {conrelid} => pg_class {oid} +NOTICE: checking pg_constraint {contypid} => pg_type {oid} +NOTICE: checking pg_constraint {conindid} => pg_class {oid} +NOTICE: checking pg_constraint {conparentid} => pg_constraint {oid} +NOTICE: checking pg_constraint {confrelid} => pg_class {oid} +NOTICE: checking pg_constraint {conpfeqop} => pg_operator {oid} +NOTICE: checking pg_constraint {conppeqop} => pg_operator {oid} +NOTICE: checking pg_constraint {conffeqop} => pg_operator {oid} +NOTICE: checking pg_constraint {conexclop} => pg_operator {oid} +NOTICE: checking pg_constraint {conrelid,conkey} => pg_attribute {attrelid,attnum} +NOTICE: checking pg_constraint {confrelid,confkey} => pg_attribute {attrelid,attnum} +NOTICE: checking pg_inherits {inhrelid} => pg_class {oid} +NOTICE: checking pg_inherits {inhparent} => pg_class {oid} +NOTICE: checking pg_index {indexrelid} => pg_class {oid} +NOTICE: checking pg_index {indrelid} => pg_class {oid} +NOTICE: checking pg_index {indcollation} => pg_collation {oid} +NOTICE: checking pg_index {indclass} => pg_opclass {oid} +NOTICE: checking pg_index {indrelid,indkey} => pg_attribute {attrelid,attnum} +NOTICE: checking pg_operator {oprnamespace} => pg_namespace {oid} +NOTICE: checking pg_operator {oprowner} => pg_authid {oid} +NOTICE: checking pg_operator {oprleft} => pg_type {oid} +NOTICE: checking pg_operator {oprright} => pg_type {oid} +NOTICE: checking pg_operator {oprresult} => pg_type {oid} +NOTICE: checking pg_operator {oprcom} => pg_operator {oid} +NOTICE: checking pg_operator {oprnegate} => pg_operator {oid} +NOTICE: checking pg_operator {oprcode} => pg_proc {oid} +NOTICE: checking pg_operator {oprrest} => pg_proc {oid} +NOTICE: checking pg_operator {oprjoin} => pg_proc {oid} +NOTICE: checking pg_opfamily {opfmethod} => pg_am {oid} +NOTICE: checking pg_opfamily {opfnamespace} => pg_namespace {oid} +NOTICE: checking pg_opfamily {opfowner} => pg_authid {oid} +NOTICE: checking pg_opclass {opcmethod} => pg_am {oid} +NOTICE: checking pg_opclass {opcnamespace} => pg_namespace {oid} +NOTICE: checking pg_opclass {opcowner} => pg_authid {oid} +NOTICE: checking pg_opclass {opcfamily} => pg_opfamily {oid} +NOTICE: checking pg_opclass {opcintype} => pg_type {oid} +NOTICE: checking pg_opclass {opckeytype} => pg_type {oid} +NOTICE: checking pg_am {amhandler} => pg_proc {oid} +NOTICE: checking pg_amop {amopfamily} => pg_opfamily {oid} +NOTICE: checking pg_amop {amoplefttype} => pg_type {oid} +NOTICE: checking pg_amop {amoprighttype} => pg_type {oid} +NOTICE: checking pg_amop {amopopr} => pg_operator {oid} +NOTICE: checking pg_amop {amopmethod} => pg_am {oid} +NOTICE: checking pg_amop {amopsortfamily} => pg_opfamily {oid} +NOTICE: checking pg_amproc {amprocfamily} => pg_opfamily {oid} +NOTICE: checking pg_amproc {amproclefttype} => pg_type {oid} +NOTICE: checking pg_amproc {amprocrighttype} => pg_type {oid} +NOTICE: checking pg_amproc {amproc} => pg_proc {oid} +NOTICE: checking pg_language {lanowner} => pg_authid {oid} +NOTICE: checking pg_language {lanplcallfoid} => pg_proc {oid} +NOTICE: checking pg_language {laninline} => pg_proc {oid} +NOTICE: checking pg_language {lanvalidator} => pg_proc {oid} +NOTICE: checking pg_largeobject_metadata {lomowner} => pg_authid {oid} +NOTICE: checking pg_largeobject {loid} => pg_largeobject_metadata {oid} +NOTICE: checking pg_aggregate {aggfnoid} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggtransfn} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggfinalfn} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggcombinefn} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggserialfn} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggdeserialfn} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggmtransfn} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggminvtransfn} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggmfinalfn} => pg_proc {oid} +NOTICE: checking pg_aggregate {aggsortop} => pg_operator {oid} +NOTICE: checking pg_aggregate {aggtranstype} => pg_type {oid} +NOTICE: checking pg_aggregate {aggmtranstype} => pg_type {oid} +NOTICE: checking pg_statistic {starelid} => pg_class {oid} +NOTICE: checking pg_statistic {staop1} => pg_operator {oid} +NOTICE: checking pg_statistic {staop2} => pg_operator {oid} +NOTICE: checking pg_statistic {staop3} => pg_operator {oid} +NOTICE: checking pg_statistic {staop4} => pg_operator {oid} +NOTICE: checking pg_statistic {staop5} => pg_operator {oid} +NOTICE: checking pg_statistic {stacoll1} => pg_collation {oid} +NOTICE: checking pg_statistic {stacoll2} => pg_collation {oid} +NOTICE: checking pg_statistic {stacoll3} => pg_collation {oid} +NOTICE: checking pg_statistic {stacoll4} => pg_collation {oid} +NOTICE: checking pg_statistic {stacoll5} => pg_collation {oid} +NOTICE: checking pg_statistic {starelid,staattnum} => pg_attribute {attrelid,attnum} +NOTICE: checking pg_statistic_ext {stxrelid} => pg_class {oid} +NOTICE: checking pg_statistic_ext {stxnamespace} => pg_namespace {oid} +NOTICE: checking pg_statistic_ext {stxowner} => pg_authid {oid} +NOTICE: checking pg_statistic_ext {stxrelid,stxkeys} => pg_attribute {attrelid,attnum} +NOTICE: checking pg_statistic_ext_data {stxoid} => pg_statistic_ext {oid} +NOTICE: checking pg_rewrite {ev_class} => pg_class {oid} +NOTICE: checking pg_trigger {tgrelid} => pg_class {oid} +NOTICE: checking pg_trigger {tgparentid} => pg_trigger {oid} +NOTICE: checking pg_trigger {tgfoid} => pg_proc {oid} +NOTICE: checking pg_trigger {tgconstrrelid} => pg_class {oid} +NOTICE: checking pg_trigger {tgconstrindid} => pg_class {oid} +NOTICE: checking pg_trigger {tgconstraint} => pg_constraint {oid} +NOTICE: checking pg_trigger {tgrelid,tgattr} => pg_attribute {attrelid,attnum} +NOTICE: checking pg_event_trigger {evtowner} => pg_authid {oid} +NOTICE: checking pg_event_trigger {evtfoid} => pg_proc {oid} +NOTICE: checking pg_description {classoid} => pg_class {oid} +NOTICE: checking pg_cast {castsource} => pg_type {oid} +NOTICE: checking pg_cast {casttarget} => pg_type {oid} +NOTICE: checking pg_cast {castfunc} => pg_proc {oid} +NOTICE: checking pg_enum {enumtypid} => pg_type {oid} +NOTICE: checking pg_namespace {nspowner} => pg_authid {oid} +NOTICE: checking pg_conversion {connamespace} => pg_namespace {oid} +NOTICE: checking pg_conversion {conowner} => pg_authid {oid} +NOTICE: checking pg_conversion {conproc} => pg_proc {oid} +NOTICE: checking pg_depend {classid} => pg_class {oid} +NOTICE: checking pg_depend {refclassid} => pg_class {oid} +NOTICE: checking pg_database {datdba} => pg_authid {oid} +NOTICE: checking pg_database {dattablespace} => pg_tablespace {oid} +NOTICE: checking pg_db_role_setting {setdatabase} => pg_database {oid} +NOTICE: checking pg_db_role_setting {setrole} => pg_authid {oid} +NOTICE: checking pg_tablespace {spcowner} => pg_authid {oid} +NOTICE: checking pg_auth_members {roleid} => pg_authid {oid} +NOTICE: checking pg_auth_members {member} => pg_authid {oid} +NOTICE: checking pg_auth_members {grantor} => pg_authid {oid} +NOTICE: checking pg_shdepend {dbid} => pg_database {oid} +NOTICE: checking pg_shdepend {classid} => pg_class {oid} +NOTICE: checking pg_shdepend {refclassid} => pg_class {oid} +NOTICE: checking pg_shdescription {classoid} => pg_class {oid} +NOTICE: checking pg_ts_config {cfgnamespace} => pg_namespace {oid} +NOTICE: checking pg_ts_config {cfgowner} => pg_authid {oid} +NOTICE: checking pg_ts_config {cfgparser} => pg_ts_parser {oid} +NOTICE: checking pg_ts_config_map {mapcfg} => pg_ts_config {oid} +NOTICE: checking pg_ts_config_map {mapdict} => pg_ts_dict {oid} +NOTICE: checking pg_ts_dict {dictnamespace} => pg_namespace {oid} +NOTICE: checking pg_ts_dict {dictowner} => pg_authid {oid} +NOTICE: checking pg_ts_dict {dicttemplate} => pg_ts_template {oid} +NOTICE: checking pg_ts_parser {prsnamespace} => pg_namespace {oid} +NOTICE: checking pg_ts_parser {prsstart} => pg_proc {oid} +NOTICE: checking pg_ts_parser {prstoken} => pg_proc {oid} +NOTICE: checking pg_ts_parser {prsend} => pg_proc {oid} +NOTICE: checking pg_ts_parser {prsheadline} => pg_proc {oid} +NOTICE: checking pg_ts_parser {prslextype} => pg_proc {oid} +NOTICE: checking pg_ts_template {tmplnamespace} => pg_namespace {oid} +NOTICE: checking pg_ts_template {tmplinit} => pg_proc {oid} +NOTICE: checking pg_ts_template {tmpllexize} => pg_proc {oid} +NOTICE: checking pg_extension {extowner} => pg_authid {oid} +NOTICE: checking pg_extension {extnamespace} => pg_namespace {oid} +NOTICE: checking pg_extension {extconfig} => pg_class {oid} +NOTICE: checking pg_foreign_data_wrapper {fdwowner} => pg_authid {oid} +NOTICE: checking pg_foreign_data_wrapper {fdwhandler} => pg_proc {oid} +NOTICE: checking pg_foreign_data_wrapper {fdwvalidator} => pg_proc {oid} +NOTICE: checking pg_foreign_server {srvowner} => pg_authid {oid} +NOTICE: checking pg_foreign_server {srvfdw} => pg_foreign_data_wrapper {oid} +NOTICE: checking pg_user_mapping {umuser} => pg_authid {oid} +NOTICE: checking pg_user_mapping {umserver} => pg_foreign_server {oid} +NOTICE: checking pg_compression {compconstructor} => pg_proc {oid} +NOTICE: checking pg_compression {compdestructor} => pg_proc {oid} +NOTICE: checking pg_compression {compcompressor} => pg_proc {oid} +NOTICE: checking pg_compression {compdecompressor} => pg_proc {oid} +NOTICE: checking pg_compression {compvalidator} => pg_proc {oid} +NOTICE: checking pg_compression {compowner} => pg_authid {oid} +NOTICE: checking pg_foreign_table {ftrelid} => pg_class {oid} +NOTICE: checking pg_foreign_table {ftserver} => pg_foreign_server {oid} +NOTICE: checking pg_policy {polrelid} => pg_class {oid} +NOTICE: checking pg_policy {polroles} => pg_authid {oid} +NOTICE: checking pg_default_acl {defaclrole} => pg_authid {oid} +NOTICE: checking pg_default_acl {defaclnamespace} => pg_namespace {oid} +NOTICE: checking pg_init_privs {classoid} => pg_class {oid} +NOTICE: checking pg_seclabel {classoid} => pg_class {oid} +NOTICE: checking pg_shseclabel {classoid} => pg_class {oid} +NOTICE: checking pg_collation {collnamespace} => pg_namespace {oid} +NOTICE: checking pg_collation {collowner} => pg_authid {oid} +NOTICE: checking pg_partitioned_table {partrelid} => pg_class {oid} +NOTICE: checking pg_partitioned_table {partdefid} => pg_class {oid} +NOTICE: checking pg_partitioned_table {partclass} => pg_opclass {oid} +NOTICE: checking pg_partitioned_table {partcollation} => pg_collation {oid} +NOTICE: checking pg_partitioned_table {partrelid,partattrs} => pg_attribute {attrelid,attnum} +NOTICE: checking pg_range {rngtypid} => pg_type {oid} +NOTICE: checking pg_range {rngsubtype} => pg_type {oid} +NOTICE: checking pg_range {rngmultitypid} => pg_type {oid} +NOTICE: checking pg_range {rngcollation} => pg_collation {oid} +NOTICE: checking pg_range {rngsubopc} => pg_opclass {oid} +NOTICE: checking pg_range {rngcanonical} => pg_proc {oid} +NOTICE: checking pg_range {rngsubdiff} => pg_proc {oid} +NOTICE: checking pg_transform {trftype} => pg_type {oid} +NOTICE: checking pg_transform {trflang} => pg_language {oid} +NOTICE: checking pg_transform {trffromsql} => pg_proc {oid} +NOTICE: checking pg_transform {trftosql} => pg_proc {oid} +NOTICE: checking pg_sequence {seqrelid} => pg_class {oid} +NOTICE: checking pg_sequence {seqtypid} => pg_type {oid} +NOTICE: checking pg_publication {pubowner} => pg_authid {oid} +NOTICE: checking pg_publication_rel {prpubid} => pg_publication {oid} +NOTICE: checking pg_publication_rel {prrelid} => pg_class {oid} +NOTICE: checking pg_subscription {subdbid} => pg_database {oid} +NOTICE: checking pg_subscription {subowner} => pg_authid {oid} +NOTICE: checking pg_subscription_rel {srsubid} => pg_subscription {oid} +NOTICE: checking pg_subscription_rel {srrelid} => pg_class {oid} diff --git a/src/test/singlenode_regress/expected/opr_sanity.out b/src/test/singlenode_regress/expected/opr_sanity.out new file mode 100644 index 00000000000..fbac24e2306 --- /dev/null +++ b/src/test/singlenode_regress/expected/opr_sanity.out @@ -0,0 +1,2312 @@ +-- +-- OPR_SANITY +-- Sanity checks for common errors in making operator/procedure system tables: +-- pg_operator, pg_proc, pg_cast, pg_conversion, pg_aggregate, pg_am, +-- pg_amop, pg_amproc, pg_opclass, pg_opfamily, pg_index. +-- +-- Every test failure in this file should be closely inspected. +-- The description of the failing test should be read carefully before +-- adjusting the expected output. In most cases, the queries should +-- not find *any* matching entries. +-- +-- NB: we assume the oidjoins test will have caught any dangling links, +-- that is OID or REGPROC fields that are not zero and do not match some +-- row in the linked-to table. However, if we want to enforce that a link +-- field can't be 0, we have to check it here. +-- +-- NB: run this test earlier than the create_operator test, because +-- that test creates some bogus operators... +-- **************** pg_proc **************** +-- Look for illegal values in pg_proc fields. +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prolang = 0 OR p1.prorettype = 0 OR + p1.pronargs < 0 OR + p1.pronargdefaults < 0 OR + p1.pronargdefaults > p1.pronargs OR + array_lower(p1.proargtypes, 1) != 0 OR + array_upper(p1.proargtypes, 1) != p1.pronargs-1 OR + 0::oid = ANY (p1.proargtypes) OR + procost <= 0 OR + CASE WHEN proretset THEN prorows <= 0 ELSE prorows != 0 END OR + prokind NOT IN ('f', 'a', 'w', 'p') OR + provolatile NOT IN ('i', 's', 'v') OR + proparallel NOT IN ('s', 'r', 'u'); + oid | proname +------+------------------------------ + 6040 | gp_current_snapshot + 7097 | gp_get_segment_configuration +(2 rows) + +-- prosrc should never be null; it can be empty only if prosqlbody isn't null +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE prosrc IS NULL; + oid | proname +-----+--------- +(0 rows) + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE (prosrc = '' OR prosrc = '-') AND prosqlbody IS NULL; + oid | proname +-----+--------- +(0 rows) + +-- proretset should only be set for normal functions +SELECT p1.oid, p1.proname +FROM pg_proc AS p1 +WHERE proretset AND prokind != 'f'; + oid | proname +-----+--------- +(0 rows) + +-- currently, no built-in functions should be SECURITY DEFINER; +-- this might change in future, but there will probably never be many. +SELECT p1.oid, p1.proname +FROM pg_proc AS p1 +WHERE prosecdef +ORDER BY 1; + oid | proname +-----+--------- +(0 rows) + +-- pronargdefaults should be 0 iff proargdefaults is null +SELECT p1.oid, p1.proname +FROM pg_proc AS p1 +WHERE (pronargdefaults <> 0) != (proargdefaults IS NOT NULL); + oid | proname +-----+--------- +(0 rows) + +-- probin should be non-empty for C functions, null everywhere else +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE prolang = 13 AND (probin IS NULL OR probin = '' OR probin = '-'); + oid | proname +-----+--------- +(0 rows) + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE prolang != 13 AND probin IS NOT NULL; + oid | proname +-----+--------- +(0 rows) + +-- Look for conflicting proc definitions (same names and input datatypes). +-- (This test should be dead code now that we have the unique index +-- pg_proc_proname_args_nsp_index, but I'll leave it in anyway.) +SELECT p1.oid, p1.proname, p2.oid, p2.proname +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.proname = p2.proname AND + p1.pronargs = p2.pronargs AND + p1.proargtypes = p2.proargtypes; + oid | proname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Considering only built-in procs (prolang = 12), look for multiple uses +-- of the same internal function (ie, matching prosrc fields). It's OK to +-- have several entries with different pronames for the same internal function, +-- but conflicts in the number of arguments and other critical items should +-- be complained of. (We don't check data types here; see next query.) +-- Note: ignore aggregate functions here, since they all point to the same +-- dummy built-in function. +SELECT p1.oid, p1.proname, p2.oid, p2.proname +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid < p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + (p1.prokind != 'a' OR p2.prokind != 'a') AND + (p1.prolang != p2.prolang OR + p1.prokind != p2.prokind OR + p1.prosecdef != p2.prosecdef OR + p1.proleakproof != p2.proleakproof OR + p1.proisstrict != p2.proisstrict OR + p1.proretset != p2.proretset OR + p1.provolatile != p2.provolatile OR + p1.pronargs != p2.pronargs); + oid | proname | oid | proname +------+-------------------+------+--------------------- + 6212 | int2_matrix_accum | 6215 | float8_matrix_accum + 6212 | int2_matrix_accum | 6214 | int8_matrix_accum + 6213 | int4_matrix_accum | 6215 | float8_matrix_accum + 6213 | int4_matrix_accum | 6214 | int8_matrix_accum +(4 rows) + +-- Look for uses of different type OIDs in the argument/result type fields +-- for different aliases of the same built-in function. +-- This indicates that the types are being presumed to be binary-equivalent, +-- or that the built-in function is prepared to deal with different types. +-- That's not wrong, necessarily, but we make lists of all the types being +-- so treated. Note that the expected output of this part of the test will +-- need to be modified whenever new pairs of types are made binary-equivalent, +-- or when new polymorphic built-in functions are added! +-- Note: ignore aggregate functions here, since they all point to the same +-- dummy built-in function. Likewise, ignore range and multirange constructor +-- functions. +SELECT DISTINCT p1.prorettype::regtype, p2.prorettype::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + p1.prosrc NOT LIKE E'range\\_constructor_' AND + p2.prosrc NOT LIKE E'range\\_constructor_' AND + p1.prosrc NOT LIKE E'multirange\\_constructor_' AND + p2.prosrc NOT LIKE E'multirange\\_constructor_' AND + (p1.prorettype < p2.prorettype) + -- int2/int4/int8/float8_matrix_accum functions violate this + AND p1.proname NOT LIKE E'%_matrix_accum' + AND p2.proname NOT LIKE E'%_matrix_accum' +ORDER BY 1, 2; + prorettype | prorettype +-----------------------------+-------------------------- + bigint | xid8 + text | character varying + timestamp without time zone | timestamp with time zone + txid_snapshot | pg_snapshot +(4 rows) + +SELECT DISTINCT p1.proargtypes[0]::regtype, p2.proargtypes[0]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + p1.prosrc NOT LIKE E'range\\_constructor_' AND + p2.prosrc NOT LIKE E'range\\_constructor_' AND + p1.prosrc NOT LIKE E'multirange\\_constructor_' AND + p2.prosrc NOT LIKE E'multirange\\_constructor_' AND + (p1.proargtypes[0] < p2.proargtypes[0]) + -- int2/int4/int8/float8_matrix_accum functions violate this + AND p1.proname NOT LIKE E'%_matrix_accum' + AND p2.proname NOT LIKE E'%_matrix_accum' +ORDER BY 1, 2; + proargtypes | proargtypes +-----------------------------+-------------------------- + bigint | xid8 + text | character + text | character varying + timestamp without time zone | timestamp with time zone + bit | bit varying + txid_snapshot | pg_snapshot +(6 rows) + +SELECT DISTINCT p1.proargtypes[1]::regtype, p2.proargtypes[1]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + p1.prosrc NOT LIKE E'range\\_constructor_' AND + p2.prosrc NOT LIKE E'range\\_constructor_' AND + p1.prosrc NOT LIKE E'multirange\\_constructor_' AND + p2.prosrc NOT LIKE E'multirange\\_constructor_' AND + (p1.proargtypes[1] < p2.proargtypes[1]) + -- int2/int4/int8/float8_matrix_accum functions violate this + AND p1.proname NOT LIKE E'%_matrix_accum' + AND p2.proname NOT LIKE E'%_matrix_accum' +ORDER BY 1, 2; + proargtypes | proargtypes +-----------------------------+-------------------------- + integer | xid + timestamp without time zone | timestamp with time zone + bit | bit varying + txid_snapshot | pg_snapshot +(4 rows) + +SELECT DISTINCT p1.proargtypes[2]::regtype, p2.proargtypes[2]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[2] < p2.proargtypes[2]) +ORDER BY 1, 2; + proargtypes | proargtypes +-----------------------------+-------------------------- + timestamp without time zone | timestamp with time zone +(1 row) + +SELECT DISTINCT p1.proargtypes[3]::regtype, p2.proargtypes[3]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[3] < p2.proargtypes[3]) +ORDER BY 1, 2; + proargtypes | proargtypes +-----------------------------+-------------------------- + timestamp without time zone | timestamp with time zone +(1 row) + +SELECT DISTINCT p1.proargtypes[4]::regtype, p2.proargtypes[4]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[4] < p2.proargtypes[4]) +ORDER BY 1, 2; + proargtypes | proargtypes +-------------+------------- +(0 rows) + +SELECT DISTINCT p1.proargtypes[5]::regtype, p2.proargtypes[5]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[5] < p2.proargtypes[5]) +ORDER BY 1, 2; + proargtypes | proargtypes +-------------+------------- +(0 rows) + +SELECT DISTINCT p1.proargtypes[6]::regtype, p2.proargtypes[6]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[6] < p2.proargtypes[6]) +ORDER BY 1, 2; + proargtypes | proargtypes +-------------+------------- +(0 rows) + +SELECT DISTINCT p1.proargtypes[7]::regtype, p2.proargtypes[7]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[7] < p2.proargtypes[7]) +ORDER BY 1, 2; + proargtypes | proargtypes +-------------+------------- +(0 rows) + +-- Look for functions that return type "internal" and do not have any +-- "internal" argument. Such a function would be a security hole since +-- it might be used to call an internal function from an SQL command. +-- As of 7.3 this query should find only internal_in, which is safe because +-- it always throws an error when called. +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype = 'internal'::regtype AND NOT + 'internal'::regtype = ANY (p1.proargtypes); + oid | proname +------+------------- + 2304 | internal_in +(1 row) + +-- Look for functions that return a polymorphic type and do not have any +-- polymorphic argument. Calls of such functions would be unresolvable +-- at parse time. As of 9.6 this query should find only some input functions +-- and GiST support functions associated with these pseudotypes. +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype IN + ('anyelement'::regtype, 'anyarray'::regtype, 'anynonarray'::regtype, + 'anyenum'::regtype) + AND NOT + ('anyelement'::regtype = ANY (p1.proargtypes) OR + 'anyarray'::regtype = ANY (p1.proargtypes) OR + 'anynonarray'::regtype = ANY (p1.proargtypes) OR + 'anyenum'::regtype = ANY (p1.proargtypes) OR + 'anyrange'::regtype = ANY (p1.proargtypes) OR + 'anymultirange'::regtype = ANY (p1.proargtypes)) +ORDER BY 2; + oid | proname +------+---------------- + 2296 | anyarray_in + 2502 | anyarray_recv + 2312 | anyelement_in + 3504 | anyenum_in + 2777 | anynonarray_in + 750 | array_in + 2400 | array_recv + 3506 | enum_in + 3532 | enum_recv +(9 rows) + +-- anyrange and anymultirange are tighter than the rest, can only resolve +-- from each other +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype IN ('anyrange'::regtype, 'anymultirange'::regtype) + AND NOT + ('anyrange'::regtype = ANY (p1.proargtypes) OR + 'anymultirange'::regtype = ANY (p1.proargtypes)) +ORDER BY 2; + oid | proname +------+------------------ + 4229 | anymultirange_in + 3832 | anyrange_in + 4231 | multirange_in + 4233 | multirange_recv + 3876 | range_gist_union + 3834 | range_in + 3836 | range_recv +(7 rows) + +-- similarly for the anycompatible family +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype IN + ('anycompatible'::regtype, 'anycompatiblearray'::regtype, + 'anycompatiblenonarray'::regtype) + AND NOT + ('anycompatible'::regtype = ANY (p1.proargtypes) OR + 'anycompatiblearray'::regtype = ANY (p1.proargtypes) OR + 'anycompatiblenonarray'::regtype = ANY (p1.proargtypes) OR + 'anycompatiblerange'::regtype = ANY (p1.proargtypes)) +ORDER BY 2; + oid | proname +------+-------------------------- + 5086 | anycompatible_in + 5088 | anycompatiblearray_in + 5090 | anycompatiblearray_recv + 5092 | anycompatiblenonarray_in +(4 rows) + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype = 'anycompatiblerange'::regtype + AND NOT + 'anycompatiblerange'::regtype = ANY (p1.proargtypes) +ORDER BY 2; + oid | proname +------+----------------------- + 5094 | anycompatiblerange_in +(1 row) + +-- Look for functions that accept cstring and are neither datatype input +-- functions nor encoding conversion functions. It's almost never a good +-- idea to use cstring input for a function meant to be called from SQL; +-- text should be used instead, because cstring lacks suitable casts. +-- As of 9.6 this query should find only cstring_out and cstring_send. +-- However, we must manually exclude shell_in, which might or might not be +-- rejected by the EXISTS clause depending on whether there are currently +-- any shell types. +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE 'cstring'::regtype = ANY (p1.proargtypes) + AND NOT EXISTS(SELECT 1 FROM pg_type WHERE typinput = p1.oid) + AND NOT EXISTS(SELECT 1 FROM pg_conversion WHERE conproc = p1.oid) + AND p1.oid != 'shell_in(cstring)'::regprocedure +ORDER BY 1; + oid | proname +------+----------------- + 2293 | cstring_out + 2501 | cstring_send + 7060 | get_role_status +(3 rows) + +-- Likewise, look for functions that return cstring and aren't datatype output +-- functions nor typmod output functions. +-- As of 9.6 this query should find only cstring_in and cstring_recv. +-- However, we must manually exclude shell_out. +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype = 'cstring'::regtype + AND NOT EXISTS(SELECT 1 FROM pg_type WHERE typoutput = p1.oid) + AND NOT EXISTS(SELECT 1 FROM pg_type WHERE typmodout = p1.oid) + AND p1.oid != 'shell_out(void)'::regprocedure +ORDER BY 1; + oid | proname +------+----------------- + 2292 | cstring_in + 2500 | cstring_recv + 7060 | get_role_status +(3 rows) + +-- Check for length inconsistencies between the various argument-info arrays. +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proallargtypes IS NOT NULL AND + array_length(proallargtypes,1) < array_length(proargtypes,1); + oid | proname +-----+--------- +(0 rows) + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proargmodes IS NOT NULL AND + array_length(proargmodes,1) < array_length(proargtypes,1); + oid | proname +-----+--------- +(0 rows) + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proargnames IS NOT NULL AND + array_length(proargnames,1) < array_length(proargtypes,1); + oid | proname +-----+--------- +(0 rows) + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proallargtypes IS NOT NULL AND proargmodes IS NOT NULL AND + array_length(proallargtypes,1) <> array_length(proargmodes,1); + oid | proname +-----+--------- +(0 rows) + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proallargtypes IS NOT NULL AND proargnames IS NOT NULL AND + array_length(proallargtypes,1) <> array_length(proargnames,1); + oid | proname +-----+--------- +(0 rows) + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proargmodes IS NOT NULL AND proargnames IS NOT NULL AND + array_length(proargmodes,1) <> array_length(proargnames,1); + oid | proname +-----+--------- +(0 rows) + +-- Check that proallargtypes matches proargtypes +SELECT p1.oid, p1.proname, p1.proargtypes, p1.proallargtypes, p1.proargmodes +FROM pg_proc as p1 +WHERE proallargtypes IS NOT NULL AND + ARRAY(SELECT unnest(proargtypes)) <> + ARRAY(SELECT proallargtypes[i] + FROM generate_series(1, array_length(proallargtypes, 1)) g(i) + WHERE proargmodes IS NULL OR proargmodes[i] IN ('i', 'b', 'v')); + oid | proname | proargtypes | proallargtypes | proargmodes +-----+---------+-------------+----------------+------------- +(0 rows) + +-- Check for prosupport functions with the wrong signature +SELECT p1.oid, p1.proname, p2.oid, p2.proname +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p2.oid = p1.prosupport AND + (p2.prorettype != 'internal'::regtype OR p2.proretset OR p2.pronargs != 1 + OR p2.proargtypes[0] != 'internal'::regtype); + oid | proname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Insist that all built-in pg_proc entries have descriptions +SELECT p1.oid, p1.proname +FROM pg_proc as p1 LEFT JOIN pg_description as d + ON p1.tableoid = d.classoid and p1.oid = d.objoid and d.objsubid = 0 +WHERE d.classoid IS NULL AND p1.oid <= 9999; + oid | proname +-----+--------- +(0 rows) + +-- List of built-in leakproof functions +-- +-- Leakproof functions should only be added after carefully +-- scrutinizing all possibly executed codepaths for possible +-- information leaks. Don't add functions here unless you know what a +-- leakproof function is. If unsure, don't mark it as such. +-- temporarily disable fancy output, so catalog changes create less diff noise +\a\t +SELECT p1.oid::regprocedure +FROM pg_proc p1 JOIN pg_namespace pn + ON pronamespace = pn.oid +WHERE nspname = 'pg_catalog' AND proleakproof +ORDER BY 1; +boollt(boolean,boolean) +boolgt(boolean,boolean) +booleq(boolean,boolean) +chareq("char","char") +nameeq(name,name) +int2eq(smallint,smallint) +int2lt(smallint,smallint) +int4eq(integer,integer) +int4lt(integer,integer) +texteq(text,text) +xideq(xid,xid) +cideq(cid,cid) +charne("char","char") +charle("char","char") +chargt("char","char") +charge("char","char") +boolne(boolean,boolean) +int4ne(integer,integer) +int2ne(smallint,smallint) +int2gt(smallint,smallint) +int4gt(integer,integer) +int2le(smallint,smallint) +int4le(integer,integer) +int4ge(integer,integer) +int2ge(smallint,smallint) +textne(text,text) +int24eq(smallint,integer) +int42eq(integer,smallint) +int24lt(smallint,integer) +int42lt(integer,smallint) +int24gt(smallint,integer) +int42gt(integer,smallint) +int24ne(smallint,integer) +int42ne(integer,smallint) +int24le(smallint,integer) +int42le(integer,smallint) +int24ge(smallint,integer) +int42ge(integer,smallint) +oideq(oid,oid) +oidne(oid,oid) +float8(smallint) +float4(smallint) +nameeqtext(name,text) +namelttext(name,text) +nameletext(name,text) +namegetext(name,text) +namegttext(name,text) +namenetext(name,text) +btnametextcmp(name,text) +texteqname(text,name) +textltname(text,name) +textlename(text,name) +textgename(text,name) +textgtname(text,name) +textnename(text,name) +bttextnamecmp(text,name) +float4eq(real,real) +float4ne(real,real) +float4lt(real,real) +float4le(real,real) +float4gt(real,real) +float4ge(real,real) +float8eq(double precision,double precision) +float8ne(double precision,double precision) +float8lt(double precision,double precision) +float8le(double precision,double precision) +float8gt(double precision,double precision) +float8ge(double precision,double precision) +float48eq(real,double precision) +float48ne(real,double precision) +float48lt(real,double precision) +float48le(real,double precision) +float48gt(real,double precision) +float48ge(real,double precision) +float84eq(double precision,real) +float84ne(double precision,real) +float84lt(double precision,real) +float84le(double precision,real) +float84gt(double precision,real) +float84ge(double precision,real) +float8(real) +int4(smallint) +float8(integer) +float4(integer) +btint2cmp(smallint,smallint) +btint4cmp(integer,integer) +btfloat4cmp(real,real) +btfloat8cmp(double precision,double precision) +btoidcmp(oid,oid) +btcharcmp("char","char") +btnamecmp(name,name) +bttextcmp(text,text) +cash_cmp(money,money) +btoidvectorcmp(oidvector,oidvector) +text(name) +name(text) +name(character) +text_larger(text,text) +text_smaller(text,text) +int8eq(bigint,bigint) +int8ne(bigint,bigint) +int8lt(bigint,bigint) +int8gt(bigint,bigint) +int8le(bigint,bigint) +int8ge(bigint,bigint) +int84eq(bigint,integer) +int84ne(bigint,integer) +int84lt(bigint,integer) +int84gt(bigint,integer) +int84le(bigint,integer) +int84ge(bigint,integer) +int8(integer) +float8(bigint) +oidvectorne(oidvector,oidvector) +float4(bigint) +namelt(name,name) +namele(name,name) +namegt(name,name) +namege(name,name) +namene(name,name) +oidvectorlt(oidvector,oidvector) +oidvectorle(oidvector,oidvector) +oidvectoreq(oidvector,oidvector) +oidvectorge(oidvector,oidvector) +oidvectorgt(oidvector,oidvector) +oidlt(oid,oid) +oidle(oid,oid) +text_lt(text,text) +text_le(text,text) +text_gt(text,text) +text_ge(text,text) +int8(smallint) +macaddr_eq(macaddr,macaddr) +macaddr_lt(macaddr,macaddr) +macaddr_le(macaddr,macaddr) +macaddr_gt(macaddr,macaddr) +macaddr_ge(macaddr,macaddr) +macaddr_ne(macaddr,macaddr) +macaddr_cmp(macaddr,macaddr) +btint8cmp(bigint,bigint) +int48eq(integer,bigint) +int48ne(integer,bigint) +int48lt(integer,bigint) +int48gt(integer,bigint) +int48le(integer,bigint) +int48ge(integer,bigint) +cash_eq(money,money) +cash_ne(money,money) +cash_lt(money,money) +cash_le(money,money) +cash_gt(money,money) +cash_ge(money,money) +network_eq(inet,inet) +network_lt(inet,inet) +network_le(inet,inet) +network_gt(inet,inet) +network_ge(inet,inet) +network_ne(inet,inet) +network_cmp(inet,inet) +lseg_eq(lseg,lseg) +bpchareq(character,character) +bpcharlt(character,character) +bpcharle(character,character) +bpchargt(character,character) +bpcharge(character,character) +bpcharne(character,character) +bpchar_larger(character,character) +bpchar_smaller(character,character) +bpcharcmp(character,character) +date_eq(date,date) +date_lt(date,date) +date_le(date,date) +date_gt(date,date) +date_ge(date,date) +date_ne(date,date) +date_cmp(date,date) +time_lt(time without time zone,time without time zone) +time_le(time without time zone,time without time zone) +time_gt(time without time zone,time without time zone) +time_ge(time without time zone,time without time zone) +time_ne(time without time zone,time without time zone) +time_cmp(time without time zone,time without time zone) +time_eq(time without time zone,time without time zone) +timestamptz_eq(timestamp with time zone,timestamp with time zone) +timestamptz_ne(timestamp with time zone,timestamp with time zone) +timestamptz_lt(timestamp with time zone,timestamp with time zone) +timestamptz_le(timestamp with time zone,timestamp with time zone) +timestamptz_ge(timestamp with time zone,timestamp with time zone) +timestamptz_gt(timestamp with time zone,timestamp with time zone) +interval_eq(interval,interval) +interval_ne(interval,interval) +interval_lt(interval,interval) +interval_le(interval,interval) +interval_ge(interval,interval) +interval_gt(interval,interval) +charlt("char","char") +tidne(tid,tid) +int8(oid) +tideq(tid,tid) +timestamptz_cmp(timestamp with time zone,timestamp with time zone) +interval_cmp(interval,interval) +xideqint4(xid,integer) +timetz_eq(time with time zone,time with time zone) +timetz_ne(time with time zone,time with time zone) +timetz_lt(time with time zone,time with time zone) +timetz_le(time with time zone,time with time zone) +timetz_ge(time with time zone,time with time zone) +timetz_gt(time with time zone,time with time zone) +timetz_cmp(time with time zone,time with time zone) +"interval"(time without time zone) +name(character varying) +"varchar"(name) +circle_eq(circle,circle) +circle_ne(circle,circle) +circle_lt(circle,circle) +circle_gt(circle,circle) +circle_le(circle,circle) +circle_ge(circle,circle) +lseg_ne(lseg,lseg) +lseg_lt(lseg,lseg) +lseg_le(lseg,lseg) +lseg_gt(lseg,lseg) +lseg_ge(lseg,lseg) +biteq(bit,bit) +bitne(bit,bit) +bitge(bit,bit) +bitgt(bit,bit) +bitle(bit,bit) +bitlt(bit,bit) +bitcmp(bit,bit) +oidgt(oid,oid) +oidge(oid,oid) +varbiteq(bit varying,bit varying) +varbitne(bit varying,bit varying) +varbitge(bit varying,bit varying) +varbitgt(bit varying,bit varying) +varbitle(bit varying,bit varying) +varbitlt(bit varying,bit varying) +varbitcmp(bit varying,bit varying) +boolle(boolean,boolean) +boolge(boolean,boolean) +btboolcmp(boolean,boolean) +"numeric"(integer) +"numeric"(real) +"numeric"(double precision) +"numeric"(bigint) +"numeric"(smallint) +int28eq(smallint,bigint) +int28ne(smallint,bigint) +int28lt(smallint,bigint) +int28gt(smallint,bigint) +int28le(smallint,bigint) +int28ge(smallint,bigint) +int82eq(bigint,smallint) +int82ne(bigint,smallint) +int82lt(bigint,smallint) +int82gt(bigint,smallint) +int82le(bigint,smallint) +int82ge(bigint,smallint) +byteaeq(bytea,bytea) +bytealt(bytea,bytea) +byteale(bytea,bytea) +byteagt(bytea,bytea) +byteage(bytea,bytea) +byteane(bytea,bytea) +byteacmp(bytea,bytea) +timestamp_cmp(timestamp without time zone,timestamp without time zone) +timestamp_eq(timestamp without time zone,timestamp without time zone) +timestamp_ne(timestamp without time zone,timestamp without time zone) +timestamp_lt(timestamp without time zone,timestamp without time zone) +timestamp_le(timestamp without time zone,timestamp without time zone) +timestamp_ge(timestamp without time zone,timestamp without time zone) +timestamp_gt(timestamp without time zone,timestamp without time zone) +text_pattern_lt(text,text) +text_pattern_le(text,text) +text_pattern_ge(text,text) +text_pattern_gt(text,text) +bttext_pattern_cmp(text,text) +bpchar_pattern_lt(character,character) +bpchar_pattern_le(character,character) +bpchar_pattern_ge(character,character) +bpchar_pattern_gt(character,character) +btbpchar_pattern_cmp(character,character) +btint48cmp(integer,bigint) +btint84cmp(bigint,integer) +btint24cmp(smallint,integer) +btint42cmp(integer,smallint) +btint28cmp(smallint,bigint) +btint82cmp(bigint,smallint) +btfloat48cmp(real,double precision) +btfloat84cmp(double precision,real) +md5(text) +md5(bytea) +bool(integer) +int4(boolean) +tidgt(tid,tid) +tidlt(tid,tid) +tidge(tid,tid) +tidle(tid,tid) +bttidcmp(tid,tid) +uuid_lt(uuid,uuid) +uuid_le(uuid,uuid) +uuid_eq(uuid,uuid) +uuid_ge(uuid,uuid) +uuid_gt(uuid,uuid) +uuid_ne(uuid,uuid) +uuid_cmp(uuid,uuid) +pg_lsn_lt(pg_lsn,pg_lsn) +pg_lsn_le(pg_lsn,pg_lsn) +pg_lsn_eq(pg_lsn,pg_lsn) +pg_lsn_ge(pg_lsn,pg_lsn) +pg_lsn_gt(pg_lsn,pg_lsn) +pg_lsn_ne(pg_lsn,pg_lsn) +pg_lsn_cmp(pg_lsn,pg_lsn) +xidneq(xid,xid) +xidneqint4(xid,integer) +sha224(bytea) +sha256(bytea) +sha384(bytea) +sha512(bytea) +gen_random_uuid() +starts_with(text,text) +macaddr8_eq(macaddr8,macaddr8) +macaddr8_lt(macaddr8,macaddr8) +macaddr8_le(macaddr8,macaddr8) +macaddr8_gt(macaddr8,macaddr8) +macaddr8_ge(macaddr8,macaddr8) +macaddr8_ne(macaddr8,macaddr8) +macaddr8_cmp(macaddr8,macaddr8) +macaddr8(macaddr) +sm3(bytea) +xid8lt(xid8,xid8) +xid8gt(xid8,xid8) +xid8le(xid8,xid8) +xid8ge(xid8,xid8) +xid8eq(xid8,xid8) +xid8ne(xid8,xid8) +xid8cmp(xid8,xid8) +-- restore normal output mode +\a\t +-- List of functions used by libpq's fe-lobj.c +-- +-- If the output of this query changes, you probably broke libpq. +-- lo_initialize() assumes that there will be at most one match for +-- each listed name. +select proname, oid from pg_catalog.pg_proc +where proname in ( + 'lo_open', + 'lo_close', + 'lo_creat', + 'lo_create', + 'lo_unlink', + 'lo_lseek', + 'lo_lseek64', + 'lo_tell', + 'lo_tell64', + 'lo_truncate', + 'lo_truncate64', + 'loread', + 'lowrite') +and pronamespace = (select oid from pg_catalog.pg_namespace + where nspname = 'pg_catalog') +order by 1; + proname | oid +---------------+------ + lo_close | 953 + lo_creat | 957 + lo_create | 715 + lo_lseek | 956 + lo_lseek64 | 3170 + lo_open | 952 + lo_tell | 958 + lo_tell64 | 3171 + lo_truncate | 1004 + lo_truncate64 | 3172 + lo_unlink | 964 + loread | 954 + lowrite | 955 +(13 rows) + +-- Check that all immutable functions are marked parallel safe +SELECT p1.oid, p1.proname +FROM pg_proc AS p1 +WHERE provolatile = 'i' AND proparallel = 'u'; + oid | proname +-----+--------- +(0 rows) + +-- **************** pg_cast **************** +-- Catch bogus values in pg_cast columns (other than cases detected by +-- oidjoins test). +SELECT * +FROM pg_cast c +WHERE castsource = 0 OR casttarget = 0 OR castcontext NOT IN ('e', 'a', 'i') + OR castmethod NOT IN ('f', 'b' ,'i'); + oid | castsource | casttarget | castfunc | castcontext | castmethod +-----+------------+------------+----------+-------------+------------ +(0 rows) + +-- Check that castfunc is nonzero only for cast methods that need a function, +-- and zero otherwise +SELECT * +FROM pg_cast c +WHERE (castmethod = 'f' AND castfunc = 0) + OR (castmethod IN ('b', 'i') AND castfunc <> 0); + oid | castsource | casttarget | castfunc | castcontext | castmethod +-----+------------+------------+----------+-------------+------------ +(0 rows) + +-- Look for casts to/from the same type that aren't length coercion functions. +-- (We assume they are length coercions if they take multiple arguments.) +-- Such entries are not necessarily harmful, but they are useless. +SELECT * +FROM pg_cast c +WHERE castsource = casttarget AND castfunc = 0; + oid | castsource | casttarget | castfunc | castcontext | castmethod +-----+------------+------------+----------+-------------+------------ +(0 rows) + +SELECT c.* +FROM pg_cast c, pg_proc p +WHERE c.castfunc = p.oid AND p.pronargs < 2 AND castsource = casttarget; + oid | castsource | casttarget | castfunc | castcontext | castmethod +-----+------------+------------+----------+-------------+------------ +(0 rows) + +-- Look for cast functions that don't have the right signature. The +-- argument and result types in pg_proc must be the same as, or binary +-- compatible with, what it says in pg_cast. +-- As a special case, we allow casts from CHAR(n) that use functions +-- declared to take TEXT. This does not pass the binary-coercibility test +-- because CHAR(n)-to-TEXT normally invokes rtrim(). However, the results +-- are the same, so long as the function is one that ignores trailing blanks. +SELECT c.* +FROM pg_cast c, pg_proc p +WHERE c.castfunc = p.oid AND + (p.pronargs < 1 OR p.pronargs > 3 + OR NOT (binary_coercible(c.castsource, p.proargtypes[0]) + OR (c.castsource = 'character'::regtype AND + p.proargtypes[0] = 'text'::regtype)) + OR NOT binary_coercible(p.prorettype, c.casttarget)); + oid | castsource | casttarget | castfunc | castcontext | castmethod +-----+------------+------------+----------+-------------+------------ +(0 rows) + +SELECT c.* +FROM pg_cast c, pg_proc p +WHERE c.castfunc = p.oid AND + ((p.pronargs > 1 AND p.proargtypes[1] != 'int4'::regtype) OR + (p.pronargs > 2 AND p.proargtypes[2] != 'bool'::regtype)); + oid | castsource | casttarget | castfunc | castcontext | castmethod +-----+------------+------------+----------+-------------+------------ +(0 rows) + +-- Look for binary compatible casts that do not have the reverse +-- direction registered as well, or where the reverse direction is not +-- also binary compatible. This is legal, but usually not intended. +-- As of 7.4, this finds the casts from text and varchar to bpchar, because +-- those are binary-compatible while the reverse way goes through rtrim(). +-- As of 8.2, this finds the cast from cidr to inet, because that is a +-- trivial binary coercion while the other way goes through inet_to_cidr(). +-- As of 8.3, this finds the casts from xml to text, varchar, and bpchar, +-- because those are binary-compatible while the reverse goes through +-- texttoxml(), which does an XML syntax check. +-- As of 9.1, this finds the cast from pg_node_tree to text, which we +-- intentionally do not provide a reverse pathway for. +SELECT castsource::regtype, casttarget::regtype, castfunc, castcontext +FROM pg_cast c +WHERE c.castmethod = 'b' AND + NOT EXISTS (SELECT 1 FROM pg_cast k + WHERE k.castmethod = 'b' AND + k.castsource = c.casttarget AND + k.casttarget = c.castsource); + castsource | casttarget | castfunc | castcontext +-------------------+-------------------+----------+------------- + text | character | 0 | i + character varying | character | 0 | i + pg_node_tree | text | 0 | i + pg_ndistinct | bytea | 0 | i + pg_dependencies | bytea | 0 | i + pg_mcv_list | bytea | 0 | i + cidr | inet | 0 | i + xml | text | 0 | a + xml | character varying | 0 | a + xml | character | 0 | a +(10 rows) + +-- **************** pg_conversion **************** +-- Look for illegal values in pg_conversion fields. +SELECT p1.oid, p1.conname +FROM pg_conversion as p1 +WHERE p1.conproc = 0 OR + pg_encoding_to_char(conforencoding) = '' OR + pg_encoding_to_char(contoencoding) = ''; + oid | conname +-----+--------- +(0 rows) + +-- Look for conprocs that don't have the expected signature. +SELECT p.oid, p.proname, c.oid, c.conname +FROM pg_proc p, pg_conversion c +WHERE p.oid = c.conproc AND + (p.prorettype != 'int4'::regtype OR p.proretset OR + p.pronargs != 6 OR + p.proargtypes[0] != 'int4'::regtype OR + p.proargtypes[1] != 'int4'::regtype OR + p.proargtypes[2] != 'cstring'::regtype OR + p.proargtypes[3] != 'internal'::regtype OR + p.proargtypes[4] != 'int4'::regtype OR + p.proargtypes[5] != 'bool'::regtype); + oid | proname | oid | conname +-----+---------+-----+--------- +(0 rows) + +-- Check for conprocs that don't perform the specific conversion that +-- pg_conversion alleges they do, by trying to invoke each conversion +-- on some simple ASCII data. (The conproc should throw an error if +-- it doesn't accept the encodings that are passed to it.) +-- Unfortunately, we can't test non-default conprocs this way, because +-- there is no way to ask convert() to invoke them, and we cannot call +-- them directly from SQL. But there are no non-default built-in +-- conversions anyway. +-- (Similarly, this doesn't cope with any search path issues.) +SELECT p1.oid, p1.conname +FROM pg_conversion as p1 +WHERE condefault AND + convert('ABC'::bytea, pg_encoding_to_char(conforencoding), + pg_encoding_to_char(contoencoding)) != 'ABC'; + oid | conname +-----+--------- +(0 rows) + +-- **************** pg_operator **************** +-- Look for illegal values in pg_operator fields. +SELECT p1.oid, p1.oprname +FROM pg_operator as p1 +WHERE (p1.oprkind != 'b' AND p1.oprkind != 'l') OR + p1.oprresult = 0 OR p1.oprcode = 0; + oid | oprname +-----+--------- +(0 rows) + +-- Look for missing or unwanted operand types +SELECT p1.oid, p1.oprname +FROM pg_operator as p1 +WHERE (p1.oprleft = 0 and p1.oprkind != 'l') OR + (p1.oprleft != 0 and p1.oprkind = 'l') OR + p1.oprright = 0; + oid | oprname +-----+--------- +(0 rows) + +-- Look for conflicting operator definitions (same names and input datatypes). +SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode +FROM pg_operator AS p1, pg_operator AS p2 +WHERE p1.oid != p2.oid AND + p1.oprname = p2.oprname AND + p1.oprkind = p2.oprkind AND + p1.oprleft = p2.oprleft AND + p1.oprright = p2.oprright; + oid | oprcode | oid | oprcode +-----+---------+-----+--------- +(0 rows) + +-- Look for commutative operators that don't commute. +-- DEFINITIONAL NOTE: If A.oprcom = B, then x A y has the same result as y B x. +-- We expect that B will always say that B.oprcom = A as well; that's not +-- inherently essential, but it would be inefficient not to mark it so. +SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode +FROM pg_operator AS p1, pg_operator AS p2 +WHERE p1.oprcom = p2.oid AND + (p1.oprkind != 'b' OR + p1.oprleft != p2.oprright OR + p1.oprright != p2.oprleft OR + p1.oprresult != p2.oprresult OR + p1.oid != p2.oprcom); + oid | oprcode | oid | oprcode +-----+---------+-----+--------- +(0 rows) + +-- Look for negatory operators that don't agree. +-- DEFINITIONAL NOTE: If A.oprnegate = B, then both A and B must yield +-- boolean results, and (x A y) == ! (x B y), or the equivalent for +-- single-operand operators. +-- We expect that B will always say that B.oprnegate = A as well; that's not +-- inherently essential, but it would be inefficient not to mark it so. +-- Also, A and B had better not be the same operator. +SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode +FROM pg_operator AS p1, pg_operator AS p2 +WHERE p1.oprnegate = p2.oid AND + (p1.oprkind != p2.oprkind OR + p1.oprleft != p2.oprleft OR + p1.oprright != p2.oprright OR + p1.oprresult != 'bool'::regtype OR + p2.oprresult != 'bool'::regtype OR + p1.oid != p2.oprnegate OR + p1.oid = p2.oid); + oid | oprcode | oid | oprcode +-----+---------+-----+--------- +(0 rows) + +-- Make a list of the names of operators that are claimed to be commutator +-- pairs. This list will grow over time, but before accepting a new entry +-- make sure you didn't link the wrong operators. +SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2 +FROM pg_operator o1, pg_operator o2 +WHERE o1.oprcom = o2.oid AND o1.oprname <= o2.oprname +ORDER BY 1, 2; + op1 | op2 +------+------ + # | # + & | & + && | && + * | * + *< | *> + *<= | *>= + *<> | *<> + *= | *= + + | + + -|- | -|- + < | > + <-> | <-> + << | >> + <<= | >>= + <= | >= + <> | <> + <@ | @> + = | = + ?# | ?# + ?- | ?- + ?-| | ?-| + ?| | ?| + ?|| | ?|| + @@ | @@ + @@@ | @@@ + | | | + ~<=~ | ~>=~ + ~<~ | ~>~ + ~= | ~= +(29 rows) + +-- Likewise for negator pairs. +SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2 +FROM pg_operator o1, pg_operator o2 +WHERE o1.oprnegate = o2.oid AND o1.oprname <= o2.oprname +ORDER BY 1, 2; + op1 | op2 +------+------ + !~ | ~ + !~* | ~* + !~~ | ~~ + !~~* | ~~* + *< | *>= + *<= | *> + *<> | *= + < | >= + << | >>= + <<= | >> + <= | > + <> | = + <> | ~= + ~<=~ | ~>~ + ~<~ | ~>=~ +(15 rows) + +-- A mergejoinable or hashjoinable operator must be binary, must return +-- boolean, and must have a commutator (itself, unless it's a cross-type +-- operator). +SELECT p1.oid, p1.oprname FROM pg_operator AS p1 +WHERE (p1.oprcanmerge OR p1.oprcanhash) AND NOT + (p1.oprkind = 'b' AND p1.oprresult = 'bool'::regtype AND p1.oprcom != 0); + oid | oprname +-----+--------- +(0 rows) + +-- What's more, the commutator had better be mergejoinable/hashjoinable too. +SELECT p1.oid, p1.oprname, p2.oid, p2.oprname +FROM pg_operator AS p1, pg_operator AS p2 +WHERE p1.oprcom = p2.oid AND + (p1.oprcanmerge != p2.oprcanmerge OR + p1.oprcanhash != p2.oprcanhash); + oid | oprname | oid | oprname +-----+---------+-----+--------- +(0 rows) + +-- Mergejoinable operators should appear as equality members of btree index +-- opfamilies. +SELECT p1.oid, p1.oprname +FROM pg_operator AS p1 +WHERE p1.oprcanmerge AND NOT EXISTS + (SELECT 1 FROM pg_amop + WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') AND + amopopr = p1.oid AND amopstrategy = 3); + oid | oprname +-----+--------- +(0 rows) + +-- And the converse. +SELECT p1.oid, p1.oprname, p.amopfamily +FROM pg_operator AS p1, pg_amop p +WHERE amopopr = p1.oid + AND amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') + AND amopstrategy = 3 + AND NOT p1.oprcanmerge; + oid | oprname | amopfamily +-----+---------+------------ +(0 rows) + +-- Hashable operators should appear as members of hash index opfamilies. +SELECT p1.oid, p1.oprname +FROM pg_operator AS p1 +WHERE p1.oprcanhash AND NOT EXISTS + (SELECT 1 FROM pg_amop + WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'hash') AND + amopopr = p1.oid AND amopstrategy = 1); + oid | oprname +-----+--------- +(0 rows) + +-- And the converse. +SELECT p1.oid, p1.oprname, p.amopfamily +FROM pg_operator AS p1, pg_amop p +WHERE amopopr = p1.oid + AND amopmethod = (SELECT oid FROM pg_am WHERE amname = 'hash') + AND NOT p1.oprcanhash; + oid | oprname | amopfamily +-----+---------+------------ +(0 rows) + +-- Check that each operator defined in pg_operator matches its oprcode entry +-- in pg_proc. Easiest to do this separately for each oprkind. +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprcode = p2.oid AND + p1.oprkind = 'b' AND + (p2.pronargs != 2 + OR NOT binary_coercible(p2.prorettype, p1.oprresult) + OR NOT binary_coercible(p1.oprleft, p2.proargtypes[0]) + OR NOT binary_coercible(p1.oprright, p2.proargtypes[1])); + oid | oprname | oid | proname +-----+---------+-----+--------- +(0 rows) + +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprcode = p2.oid AND + p1.oprkind = 'l' AND + (p2.pronargs != 1 + OR NOT binary_coercible(p2.prorettype, p1.oprresult) + OR NOT binary_coercible(p1.oprright, p2.proargtypes[0]) + OR p1.oprleft != 0); + oid | oprname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- If the operator is mergejoinable or hashjoinable, its underlying function +-- should not be volatile. +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprcode = p2.oid AND + (p1.oprcanmerge OR p1.oprcanhash) AND + p2.provolatile = 'v'; + oid | oprname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- If oprrest is set, the operator must return boolean, +-- and it must link to a proc with the right signature +-- to be a restriction selectivity estimator. +-- The proc signature we want is: float8 proc(internal, oid, internal, int4) +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprrest = p2.oid AND + (p1.oprresult != 'bool'::regtype OR + p2.prorettype != 'float8'::regtype OR p2.proretset OR + p2.pronargs != 4 OR + p2.proargtypes[0] != 'internal'::regtype OR + p2.proargtypes[1] != 'oid'::regtype OR + p2.proargtypes[2] != 'internal'::regtype OR + p2.proargtypes[3] != 'int4'::regtype); + oid | oprname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- If oprjoin is set, the operator must be a binary boolean op, +-- and it must link to a proc with the right signature +-- to be a join selectivity estimator. +-- The proc signature we want is: float8 proc(internal, oid, internal, int2, internal) +-- (Note: the old signature with only 4 args is still allowed, but no core +-- estimator should be using it.) +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprjoin = p2.oid AND + (p1.oprkind != 'b' OR p1.oprresult != 'bool'::regtype OR + p2.prorettype != 'float8'::regtype OR p2.proretset OR + p2.pronargs != 5 OR + p2.proargtypes[0] != 'internal'::regtype OR + p2.proargtypes[1] != 'oid'::regtype OR + p2.proargtypes[2] != 'internal'::regtype OR + p2.proargtypes[3] != 'int2'::regtype OR + p2.proargtypes[4] != 'internal'::regtype); + oid | oprname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Insist that all built-in pg_operator entries have descriptions +SELECT p1.oid, p1.oprname +FROM pg_operator as p1 LEFT JOIN pg_description as d + ON p1.tableoid = d.classoid and p1.oid = d.objoid and d.objsubid = 0 +WHERE d.classoid IS NULL AND p1.oid <= 9999; + oid | oprname +-----+--------- +(0 rows) + +-- Check that operators' underlying functions have suitable comments, +-- namely 'implementation of XXX operator'. (Note: it's not necessary to +-- put such comments into pg_proc.dat; initdb will generate them as needed.) +-- In some cases involving legacy names for operators, there are multiple +-- operators referencing the same pg_proc entry, so ignore operators whose +-- comments say they are deprecated. +-- We also have a few functions that are both operator support and meant to +-- be called directly; those should have comments matching their operator. +WITH funcdescs AS ( + SELECT p.oid as p_oid, proname, o.oid as o_oid, + pd.description as prodesc, + 'implementation of ' || oprname || ' operator' as expecteddesc, + od.description as oprdesc + FROM pg_proc p JOIN pg_operator o ON oprcode = p.oid + LEFT JOIN pg_description pd ON + (pd.objoid = p.oid and pd.classoid = p.tableoid and pd.objsubid = 0) + LEFT JOIN pg_description od ON + (od.objoid = o.oid and od.classoid = o.tableoid and od.objsubid = 0) + WHERE o.oid <= 9999 +) +SELECT * FROM funcdescs + WHERE prodesc IS DISTINCT FROM expecteddesc + AND oprdesc NOT LIKE 'deprecated%' + AND prodesc IS DISTINCT FROM oprdesc; + p_oid | proname | o_oid | prodesc | expecteddesc | oprdesc +-------+---------+-------+---------+--------------+--------- +(0 rows) + +-- Show all the operator-implementation functions that have their own +-- comments. This should happen only in cases where the function and +-- operator syntaxes are both documented at the user level. +-- This should be a pretty short list; it's mostly legacy cases. +WITH funcdescs AS ( + SELECT p.oid as p_oid, proname, o.oid as o_oid, + pd.description as prodesc, + 'implementation of ' || oprname || ' operator' as expecteddesc, + od.description as oprdesc + FROM pg_proc p JOIN pg_operator o ON oprcode = p.oid + LEFT JOIN pg_description pd ON + (pd.objoid = p.oid and pd.classoid = p.tableoid and pd.objsubid = 0) + LEFT JOIN pg_description od ON + (od.objoid = o.oid and od.classoid = o.tableoid and od.objsubid = 0) + WHERE o.oid <= 9999 +) +SELECT p_oid, proname, prodesc FROM funcdescs + WHERE prodesc IS DISTINCT FROM expecteddesc + AND oprdesc NOT LIKE 'deprecated%' +ORDER BY 1; + p_oid | proname | prodesc +-------+-------------------------+------------------------------------------------- + 378 | array_append | append element onto end of array + 379 | array_prepend | prepend element onto front of array + 1035 | aclinsert | add/update ACL item + 1036 | aclremove | remove ACL item + 1037 | aclcontains | contains + 3217 | jsonb_extract_path | get value from jsonb with path elements + 3940 | jsonb_extract_path_text | get value from jsonb as text with path elements + 3951 | json_extract_path | get value from json with path elements + 3953 | json_extract_path_text | get value from json as text with path elements +(9 rows) + +-- Operators that are commutator pairs should have identical volatility +-- and leakproofness markings on their implementation functions. +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2, pg_proc AS p1, pg_proc AS p2 +WHERE o1.oprcom = o2.oid AND p1.oid = o1.oprcode AND p2.oid = o2.oprcode AND + (p1.provolatile != p2.provolatile OR + p1.proleakproof != p2.proleakproof); + oid | oprcode | oid | oprcode +-----+---------+-----+--------- +(0 rows) + +-- Likewise for negator pairs. +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2, pg_proc AS p1, pg_proc AS p2 +WHERE o1.oprnegate = o2.oid AND p1.oid = o1.oprcode AND p2.oid = o2.oprcode AND + (p1.provolatile != p2.provolatile OR + p1.proleakproof != p2.proleakproof); + oid | oprcode | oid | oprcode +-----+---------+-----+--------- +(0 rows) + +-- Btree comparison operators' functions should have the same volatility +-- and leakproofness markings as the associated comparison support function. +SELECT pp.oid::regprocedure as proc, pp.provolatile as vp, pp.proleakproof as lp, + po.oid::regprocedure as opr, po.provolatile as vo, po.proleakproof as lo +FROM pg_proc pp, pg_proc po, pg_operator o, pg_amproc ap, pg_amop ao +WHERE pp.oid = ap.amproc AND po.oid = o.oprcode AND o.oid = ao.amopopr AND + ao.amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') AND + ao.amopfamily = ap.amprocfamily AND + ao.amoplefttype = ap.amproclefttype AND + ao.amoprighttype = ap.amprocrighttype AND + ap.amprocnum = 1 AND + (pp.provolatile != po.provolatile OR + pp.proleakproof != po.proleakproof) +ORDER BY 1; + proc | vp | lp | opr | vo | lo +------+----+----+-----+----+---- +(0 rows) + +-- **************** pg_aggregate **************** +-- Look for illegal values in pg_aggregate fields. +SELECT ctid, aggfnoid::oid +FROM pg_aggregate as p1 +WHERE aggfnoid = 0 OR aggtransfn = 0 OR + aggkind NOT IN ('n', 'o', 'h') OR + aggnumdirectargs < 0 OR + (aggkind = 'n' AND aggnumdirectargs > 0) OR + aggfinalmodify NOT IN ('r', 's', 'w') OR + aggmfinalmodify NOT IN ('r', 's', 'w') OR + aggtranstype = 0 OR aggtransspace < 0 OR aggmtransspace < 0; + ctid | aggfnoid +------+---------- +(0 rows) + +-- Make sure the matching pg_proc entry is sensible, too. +SELECT a.aggfnoid::oid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggfnoid = p.oid AND + (p.prokind != 'a' OR p.proretset OR p.pronargs < a.aggnumdirectargs); + aggfnoid | proname +----------+--------- +(0 rows) + +-- Make sure there are no prokind = PROKIND_AGGREGATE pg_proc entries without matches. +SELECT oid, proname +FROM pg_proc as p +WHERE p.prokind = 'a' AND + NOT EXISTS (SELECT 1 FROM pg_aggregate a WHERE a.aggfnoid = p.oid); + oid | proname +-----+--------- +(0 rows) + +-- If there is no finalfn then the output type must be the transtype. +SELECT a.aggfnoid::oid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggfnoid = p.oid AND + a.aggfinalfn = 0 AND p.prorettype != a.aggtranstype; + aggfnoid | proname +----------+--------- +(0 rows) + +-- Cross-check transfn against its entry in pg_proc. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggtransfn = ptr.oid AND + (ptr.proretset + OR NOT (ptr.pronargs = + CASE WHEN a.aggkind = 'n' THEN p.pronargs + 1 + ELSE greatest(p.pronargs - a.aggnumdirectargs, 1) + 1 END) + OR NOT binary_coercible(ptr.prorettype, a.aggtranstype) + OR NOT binary_coercible(a.aggtranstype, ptr.proargtypes[0]) + OR (p.pronargs > 0 AND + NOT binary_coercible(p.proargtypes[0], ptr.proargtypes[1])) + OR (p.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[1], ptr.proargtypes[2])) + OR (p.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[2], ptr.proargtypes[3])) + -- we could carry the check further, but 3 args is enough for now + OR (p.pronargs > 3) + ); + aggfnoid | proname | oid | proname +----------+---------+-----+--------- +(0 rows) + +-- Cross-check finalfn (if present) against its entry in pg_proc. +SELECT a.aggfnoid::oid, p.proname, pfn.oid, pfn.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS pfn +WHERE a.aggfnoid = p.oid AND + a.aggfinalfn = pfn.oid AND + (pfn.proretset OR + NOT binary_coercible(pfn.prorettype, p.prorettype) OR + NOT binary_coercible(a.aggtranstype, pfn.proargtypes[0]) OR + CASE WHEN a.aggfinalextra THEN pfn.pronargs != p.pronargs + 1 + ELSE pfn.pronargs != a.aggnumdirectargs + 1 END + OR (pfn.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[0], pfn.proargtypes[1])) + OR (pfn.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[1], pfn.proargtypes[2])) + OR (pfn.pronargs > 3 AND + NOT binary_coercible(p.proargtypes[2], pfn.proargtypes[3])) + -- we could carry the check further, but 4 args is enough for now + OR (pfn.pronargs > 4) + ); + aggfnoid | proname | oid | proname +----------+---------+-----+--------- +(0 rows) + +-- If transfn is strict then either initval should be non-NULL, or +-- input type should match transtype so that the first non-null input +-- can be assigned as the state value. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggtransfn = ptr.oid AND ptr.proisstrict AND + a.agginitval IS NULL AND + NOT binary_coercible(p.proargtypes[0], a.aggtranstype); + aggfnoid | proname | oid | proname +----------+---------+-----+--------- +(0 rows) + +-- Check for inconsistent specifications of moving-aggregate columns. +SELECT ctid, aggfnoid::oid +FROM pg_aggregate as p1 +WHERE aggmtranstype != 0 AND + (aggmtransfn = 0 OR aggminvtransfn = 0); + ctid | aggfnoid +------+---------- +(0 rows) + +SELECT ctid, aggfnoid::oid +FROM pg_aggregate as p1 +WHERE aggmtranstype = 0 AND + (aggmtransfn != 0 OR aggminvtransfn != 0 OR aggmfinalfn != 0 OR + aggmtransspace != 0 OR aggminitval IS NOT NULL); + ctid | aggfnoid +------+---------- +(0 rows) + +-- If there is no mfinalfn then the output type must be the mtranstype. +SELECT a.aggfnoid::oid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggfnoid = p.oid AND + a.aggmtransfn != 0 AND + a.aggmfinalfn = 0 AND p.prorettype != a.aggmtranstype; + aggfnoid | proname +----------+--------- +(0 rows) + +-- Cross-check mtransfn (if present) against its entry in pg_proc. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggmtransfn = ptr.oid AND + (ptr.proretset + OR NOT (ptr.pronargs = + CASE WHEN a.aggkind = 'n' THEN p.pronargs + 1 + ELSE greatest(p.pronargs - a.aggnumdirectargs, 1) + 1 END) + OR NOT binary_coercible(ptr.prorettype, a.aggmtranstype) + OR NOT binary_coercible(a.aggmtranstype, ptr.proargtypes[0]) + OR (p.pronargs > 0 AND + NOT binary_coercible(p.proargtypes[0], ptr.proargtypes[1])) + OR (p.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[1], ptr.proargtypes[2])) + OR (p.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[2], ptr.proargtypes[3])) + -- we could carry the check further, but 3 args is enough for now + OR (p.pronargs > 3) + ); + aggfnoid | proname | oid | proname +----------+---------+-----+--------- +(0 rows) + +-- Cross-check minvtransfn (if present) against its entry in pg_proc. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggminvtransfn = ptr.oid AND + (ptr.proretset + OR NOT (ptr.pronargs = + CASE WHEN a.aggkind = 'n' THEN p.pronargs + 1 + ELSE greatest(p.pronargs - a.aggnumdirectargs, 1) + 1 END) + OR NOT binary_coercible(ptr.prorettype, a.aggmtranstype) + OR NOT binary_coercible(a.aggmtranstype, ptr.proargtypes[0]) + OR (p.pronargs > 0 AND + NOT binary_coercible(p.proargtypes[0], ptr.proargtypes[1])) + OR (p.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[1], ptr.proargtypes[2])) + OR (p.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[2], ptr.proargtypes[3])) + -- we could carry the check further, but 3 args is enough for now + OR (p.pronargs > 3) + ); + aggfnoid | proname | oid | proname +----------+---------+-----+--------- +(0 rows) + +-- Cross-check mfinalfn (if present) against its entry in pg_proc. +SELECT a.aggfnoid::oid, p.proname, pfn.oid, pfn.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS pfn +WHERE a.aggfnoid = p.oid AND + a.aggmfinalfn = pfn.oid AND + (pfn.proretset OR + NOT binary_coercible(pfn.prorettype, p.prorettype) OR + NOT binary_coercible(a.aggmtranstype, pfn.proargtypes[0]) OR + CASE WHEN a.aggmfinalextra THEN pfn.pronargs != p.pronargs + 1 + ELSE pfn.pronargs != a.aggnumdirectargs + 1 END + OR (pfn.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[0], pfn.proargtypes[1])) + OR (pfn.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[1], pfn.proargtypes[2])) + OR (pfn.pronargs > 3 AND + NOT binary_coercible(p.proargtypes[2], pfn.proargtypes[3])) + -- we could carry the check further, but 4 args is enough for now + OR (pfn.pronargs > 4) + ); + aggfnoid | proname | oid | proname +----------+---------+-----+--------- +(0 rows) + +-- If mtransfn is strict then either minitval should be non-NULL, or +-- input type should match mtranstype so that the first non-null input +-- can be assigned as the state value. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggmtransfn = ptr.oid AND ptr.proisstrict AND + a.aggminitval IS NULL AND + NOT binary_coercible(p.proargtypes[0], a.aggmtranstype); + aggfnoid | proname | oid | proname +----------+---------+-----+--------- +(0 rows) + +-- mtransfn and minvtransfn should have same strictness setting. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname, iptr.oid, iptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr, pg_proc AS iptr +WHERE a.aggfnoid = p.oid AND + a.aggmtransfn = ptr.oid AND + a.aggminvtransfn = iptr.oid AND + ptr.proisstrict != iptr.proisstrict; + aggfnoid | proname | oid | proname | oid | proname +----------+---------+-----+---------+-----+--------- +(0 rows) + +-- Check that all combine functions have signature +-- combine(transtype, transtype) returns transtype +SELECT a.aggfnoid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggcombinefn = p.oid AND + (p.pronargs != 2 OR + p.prorettype != p.proargtypes[0] OR + p.prorettype != p.proargtypes[1] OR + NOT binary_coercible(a.aggtranstype, p.proargtypes[0])); + aggfnoid | proname +----------+--------- +(0 rows) + +-- Check that no combine function for an INTERNAL transtype is strict. +SELECT a.aggfnoid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggcombinefn = p.oid AND + a.aggtranstype = 'internal'::regtype AND p.proisstrict; + aggfnoid | proname +----------+--------- +(0 rows) + +-- serialize/deserialize functions should be specified only for aggregates +-- with transtype internal and a combine function, and we should have both +-- or neither of them. +SELECT aggfnoid, aggtranstype, aggserialfn, aggdeserialfn +FROM pg_aggregate +WHERE (aggserialfn != 0 OR aggdeserialfn != 0) + AND (aggtranstype != 'internal'::regtype OR aggcombinefn = 0 OR + aggserialfn = 0 OR aggdeserialfn = 0); + aggfnoid | aggtranstype | aggserialfn | aggdeserialfn +----------+--------------+-------------+--------------- +(0 rows) + +-- Check that all serialization functions have signature +-- serialize(internal) returns bytea +-- Also insist that they be strict; it's wasteful to run them on NULLs. +SELECT a.aggfnoid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggserialfn = p.oid AND + (p.prorettype != 'bytea'::regtype OR p.pronargs != 1 OR + p.proargtypes[0] != 'internal'::regtype OR + NOT p.proisstrict); + aggfnoid | proname +----------+--------- +(0 rows) + +-- Check that all deserialization functions have signature +-- deserialize(bytea, internal) returns internal +-- Also insist that they be strict; it's wasteful to run them on NULLs. +SELECT a.aggfnoid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggdeserialfn = p.oid AND + (p.prorettype != 'internal'::regtype OR p.pronargs != 2 OR + p.proargtypes[0] != 'bytea'::regtype OR + p.proargtypes[1] != 'internal'::regtype OR + NOT p.proisstrict); + aggfnoid | proname +----------+--------- +(0 rows) + +-- Check that aggregates which have the same transition function also have +-- the same combine, serialization, and deserialization functions. +-- While that isn't strictly necessary, it's fishy if they don't. +SELECT a.aggfnoid, a.aggcombinefn, a.aggserialfn, a.aggdeserialfn, + b.aggfnoid, b.aggcombinefn, b.aggserialfn, b.aggdeserialfn +FROM + pg_aggregate a, pg_aggregate b +WHERE + a.aggfnoid < b.aggfnoid AND a.aggtransfn = b.aggtransfn AND + (a.aggcombinefn != b.aggcombinefn OR a.aggserialfn != b.aggserialfn + OR a.aggdeserialfn != b.aggdeserialfn); + aggfnoid | aggcombinefn | aggserialfn | aggdeserialfn | aggfnoid | aggcombinefn | aggserialfn | aggdeserialfn +----------+--------------+-------------+---------------+----------+--------------+-------------+--------------- +(0 rows) + +-- Cross-check aggsortop (if present) against pg_operator. +-- We expect to find entries for bool_and, bool_or, every, max, and min. +SELECT DISTINCT proname, oprname +FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p +WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid +ORDER BY 1, 2; + proname | oprname +----------+--------- + bool_and | < + bool_or | > + every | < + max | > + min | < +(5 rows) + +-- Check datatypes match +SELECT a.aggfnoid::oid, o.oid +FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p +WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid AND + (oprkind != 'b' OR oprresult != 'boolean'::regtype + OR oprleft != p.proargtypes[0] OR oprright != p.proargtypes[0]); + aggfnoid | oid +----------+----- +(0 rows) + +-- Check operator is a suitable btree opfamily member +SELECT a.aggfnoid::oid, o.oid +FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p +WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid AND + NOT EXISTS(SELECT 1 FROM pg_amop + WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') + AND amopopr = o.oid + AND amoplefttype = o.oprleft + AND amoprighttype = o.oprright); + aggfnoid | oid +----------+----- +(0 rows) + +-- Check correspondence of btree strategies and names +SELECT DISTINCT proname, oprname, amopstrategy +FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p, + pg_amop as ao +WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid AND + amopopr = o.oid AND + amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') +ORDER BY 1, 2; + proname | oprname | amopstrategy +----------+---------+-------------- + bool_and | < | 1 + bool_or | > | 5 + every | < | 1 + max | > | 5 + min | < | 1 +(5 rows) + +-- Check that there are not aggregates with the same name and different +-- numbers of arguments. While not technically wrong, we have a project policy +-- to avoid this because it opens the door for confusion in connection with +-- ORDER BY: novices frequently put the ORDER BY in the wrong place. +-- See the fate of the single-argument form of string_agg() for history. +-- (Note: we don't forbid users from creating such aggregates; the policy is +-- just to think twice before creating built-in aggregates like this.) +-- The only aggregates that should show up here are count(x) and count(*). +SELECT p1.oid::regprocedure, p2.oid::regprocedure +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid < p2.oid AND p1.proname = p2.proname AND + p1.prokind = 'a' AND p2.prokind = 'a' AND + array_dims(p1.proargtypes) != array_dims(p2.proargtypes) +ORDER BY 1; + oid | oid +--------------+--------- + count("any") | count() +(1 row) + +-- For the same reason, built-in aggregates with default arguments are no good. +SELECT oid, proname +FROM pg_proc AS p +WHERE prokind = 'a' AND proargdefaults IS NOT NULL; + oid | proname +-----+--------- +(0 rows) + +-- For the same reason, we avoid creating built-in variadic aggregates, except +-- that variadic ordered-set aggregates are OK (since they have special syntax +-- that is not subject to the misplaced ORDER BY issue). +SELECT p.oid, proname +FROM pg_proc AS p JOIN pg_aggregate AS a ON a.aggfnoid = p.oid +WHERE prokind = 'a' AND provariadic != 0 AND a.aggkind = 'n'; + oid | proname +-----+--------- +(0 rows) + +-- **************** pg_opfamily **************** +-- Look for illegal values in pg_opfamily fields +SELECT p1.oid +FROM pg_opfamily as p1 +WHERE p1.opfmethod = 0 OR p1.opfnamespace = 0; + oid +----- +(0 rows) + +-- Look for opfamilies having no opclasses. While most validation of +-- opfamilies is now handled by AM-specific amvalidate functions, that's +-- driven from pg_opclass entries below, so an empty opfamily would not +-- get noticed. +SELECT oid, opfname FROM pg_opfamily f +WHERE NOT EXISTS (SELECT 1 FROM pg_opclass WHERE opcfamily = f.oid); + oid | opfname +-----+--------- +(0 rows) + +-- **************** pg_opclass **************** +-- Look for illegal values in pg_opclass fields +SELECT p1.oid +FROM pg_opclass AS p1 +WHERE p1.opcmethod = 0 OR p1.opcnamespace = 0 OR p1.opcfamily = 0 + OR p1.opcintype = 0; + oid +----- +(0 rows) + +-- opcmethod must match owning opfamily's opfmethod +SELECT p1.oid, p2.oid +FROM pg_opclass AS p1, pg_opfamily AS p2 +WHERE p1.opcfamily = p2.oid AND p1.opcmethod != p2.opfmethod; + oid | oid +-----+----- +(0 rows) + +-- There should not be multiple entries in pg_opclass with opcdefault true +-- and the same opcmethod/opcintype combination. +SELECT p1.oid, p2.oid +FROM pg_opclass AS p1, pg_opclass AS p2 +WHERE p1.oid != p2.oid AND + p1.opcmethod = p2.opcmethod AND p1.opcintype = p2.opcintype AND + p1.opcdefault AND p2.opcdefault; + oid | oid +-----+----- +(0 rows) + +-- Ask access methods to validate opclasses +-- (this replaces a lot of SQL-level checks that used to be done in this file) +SELECT oid, opcname FROM pg_opclass WHERE NOT amvalidate(oid); + oid | opcname +-----+--------- +(0 rows) + +-- **************** pg_am **************** +-- Look for illegal values in pg_am fields +SELECT p1.oid, p1.amname +FROM pg_am AS p1 +WHERE p1.amhandler = 0; + oid | amname +-----+-------- +(0 rows) + +-- Check for index amhandler functions with the wrong signature +SELECT p1.oid, p1.amname, p2.oid, p2.proname +FROM pg_am AS p1, pg_proc AS p2 +WHERE p2.oid = p1.amhandler AND p1.amtype = 'i' AND + (p2.prorettype != 'index_am_handler'::regtype + OR p2.proretset + OR p2.pronargs != 1 + OR p2.proargtypes[0] != 'internal'::regtype); + oid | amname | oid | proname +-----+--------+-----+--------- +(0 rows) + +-- Check for table amhandler functions with the wrong signature +SELECT p1.oid, p1.amname, p2.oid, p2.proname +FROM pg_am AS p1, pg_proc AS p2 +WHERE p2.oid = p1.amhandler AND p1.amtype = 's' AND + (p2.prorettype != 'table_am_handler'::regtype + OR p2.proretset + OR p2.pronargs != 1 + OR p2.proargtypes[0] != 'internal'::regtype); + oid | amname | oid | proname +-----+--------+-----+--------- +(0 rows) + +-- **************** pg_amop **************** +-- Look for illegal values in pg_amop fields +SELECT p1.amopfamily, p1.amopstrategy +FROM pg_amop as p1 +WHERE p1.amopfamily = 0 OR p1.amoplefttype = 0 OR p1.amoprighttype = 0 + OR p1.amopopr = 0 OR p1.amopmethod = 0 OR p1.amopstrategy < 1; + amopfamily | amopstrategy +------------+-------------- +(0 rows) + +SELECT p1.amopfamily, p1.amopstrategy +FROM pg_amop as p1 +WHERE NOT ((p1.amoppurpose = 's' AND p1.amopsortfamily = 0) OR + (p1.amoppurpose = 'o' AND p1.amopsortfamily <> 0)); + amopfamily | amopstrategy +------------+-------------- +(0 rows) + +-- amopmethod must match owning opfamily's opfmethod +SELECT p1.oid, p2.oid +FROM pg_amop AS p1, pg_opfamily AS p2 +WHERE p1.amopfamily = p2.oid AND p1.amopmethod != p2.opfmethod; + oid | oid +-----+----- +(0 rows) + +-- Make a list of all the distinct operator names being used in particular +-- strategy slots. This is a bit hokey, since the list might need to change +-- in future releases, but it's an effective way of spotting mistakes such as +-- swapping two operators within a family. +SELECT DISTINCT amopmethod, amopstrategy, oprname +FROM pg_amop p1 LEFT JOIN pg_operator p2 ON amopopr = p2.oid +ORDER BY 1, 2, 3; + amopmethod | amopstrategy | oprname +------------+--------------+--------- + 403 | 1 | *< + 403 | 1 | < + 403 | 1 | << + 403 | 1 | ~<~ + 403 | 2 | *<= + 403 | 2 | <<= + 403 | 2 | <= + 403 | 2 | ~<=~ + 403 | 3 | *= + 403 | 3 | = + 403 | 4 | *>= + 403 | 4 | >= + 403 | 4 | >>= + 403 | 4 | ~>=~ + 403 | 5 | *> + 403 | 5 | > + 403 | 5 | >> + 403 | 5 | ~>~ + 405 | 1 | = + 783 | 1 | << + 783 | 1 | @@ + 783 | 2 | &< + 783 | 3 | && + 783 | 4 | &> + 783 | 5 | >> + 783 | 6 | -|- + 783 | 6 | ~= + 783 | 7 | @> + 783 | 8 | <@ + 783 | 9 | &<| + 783 | 10 | <<| + 783 | 11 | |>> + 783 | 12 | |&> + 783 | 15 | <-> + 783 | 16 | @> + 783 | 18 | = + 783 | 19 | <> + 783 | 20 | < + 783 | 21 | <= + 783 | 22 | > + 783 | 23 | >= + 783 | 24 | << + 783 | 25 | <<= + 783 | 26 | >> + 783 | 27 | >>= + 783 | 28 | <@ + 783 | 29 | <^ + 783 | 30 | >^ + 783 | 48 | <@ + 783 | 68 | <@ + 2742 | 1 | && + 2742 | 1 | @@ + 2742 | 2 | @> + 2742 | 2 | @@@ + 2742 | 3 | <@ + 2742 | 4 | = + 2742 | 7 | @> + 2742 | 9 | ? + 2742 | 10 | ?| + 2742 | 11 | ?& + 2742 | 15 | @? + 2742 | 16 | @@ + 3580 | 1 | < + 3580 | 1 | << + 3580 | 1 | = + 3580 | 2 | &< + 3580 | 2 | <= + 3580 | 3 | && + 3580 | 3 | = + 3580 | 4 | &> + 3580 | 4 | >= + 3580 | 5 | > + 3580 | 5 | >> + 3580 | 6 | ~= + 3580 | 7 | >>= + 3580 | 7 | @> + 3580 | 8 | <<= + 3580 | 8 | <@ + 3580 | 9 | &<| + 3580 | 10 | <<| + 3580 | 11 | |>> + 3580 | 12 | |&> + 3580 | 16 | @> + 3580 | 17 | -|- + 3580 | 18 | = + 3580 | 20 | < + 3580 | 21 | <= + 3580 | 22 | > + 3580 | 23 | >= + 3580 | 24 | >> + 3580 | 26 | << + 4000 | 1 | << + 4000 | 1 | ~<~ + 4000 | 2 | &< + 4000 | 2 | ~<=~ + 4000 | 3 | && + 4000 | 3 | = + 4000 | 4 | &> + 4000 | 4 | ~>=~ + 4000 | 5 | >> + 4000 | 5 | ~>~ + 4000 | 6 | -|- + 4000 | 6 | ~= + 4000 | 7 | @> + 4000 | 8 | <@ + 4000 | 9 | &<| + 4000 | 10 | <<| + 4000 | 11 | < + 4000 | 11 | |>> + 4000 | 12 | <= + 4000 | 12 | |&> + 4000 | 14 | >= + 4000 | 15 | <-> + 4000 | 15 | > + 4000 | 16 | @> + 4000 | 18 | = + 4000 | 19 | <> + 4000 | 20 | < + 4000 | 21 | <= + 4000 | 22 | > + 4000 | 23 | >= + 4000 | 24 | << + 4000 | 25 | <<= + 4000 | 26 | >> + 4000 | 27 | >>= + 4000 | 28 | ^@ + 4000 | 29 | <^ + 4000 | 30 | >^ + 7013 | 1 | *< + 7013 | 1 | < + 7013 | 1 | << + 7013 | 1 | ~<~ + 7013 | 2 | *<= + 7013 | 2 | <<= + 7013 | 2 | <= + 7013 | 2 | ~<=~ + 7013 | 3 | *= + 7013 | 3 | = + 7013 | 4 | *>= + 7013 | 4 | >= + 7013 | 4 | >>= + 7013 | 4 | ~>=~ + 7013 | 5 | *> + 7013 | 5 | > + 7013 | 5 | >> + 7013 | 5 | ~>~ +(146 rows) + +-- Check that all opclass search operators have selectivity estimators. +-- This is not absolutely required, but it seems a reasonable thing +-- to insist on for all standard datatypes. +SELECT p1.amopfamily, p1.amopopr, p2.oid, p2.oprname +FROM pg_amop AS p1, pg_operator AS p2 +WHERE p1.amopopr = p2.oid AND p1.amoppurpose = 's' AND + (p2.oprrest = 0 OR p2.oprjoin = 0); + amopfamily | amopopr | oid | oprname +------------+---------+-----+--------- +(0 rows) + +-- Check that each opclass in an opfamily has associated operators, that is +-- ones whose oprleft matches opcintype (possibly by coercion). +SELECT p1.opcname, p1.opcfamily +FROM pg_opclass AS p1 +WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS p2 + WHERE p2.amopfamily = p1.opcfamily + AND binary_coercible(p1.opcintype, p2.amoplefttype)); + opcname | opcfamily +---------+----------- +(0 rows) + +-- Check that each operator listed in pg_amop has an associated opclass, +-- that is one whose opcintype matches oprleft (possibly by coercion). +-- Otherwise the operator is useless because it cannot be matched to an index. +-- (In principle it could be useful to list such operators in multiple-datatype +-- btree opfamilies, but in practice you'd expect there to be an opclass for +-- every datatype the family knows about.) +SELECT p1.amopfamily, p1.amopstrategy, p1.amopopr +FROM pg_amop AS p1 +WHERE NOT EXISTS(SELECT 1 FROM pg_opclass AS p2 + WHERE p2.opcfamily = p1.amopfamily + AND binary_coercible(p2.opcintype, p1.amoplefttype)); + amopfamily | amopstrategy | amopopr +------------+--------------+--------- +(0 rows) + +-- Operators that are primary members of opclasses must be immutable (else +-- it suggests that the index ordering isn't fixed). Operators that are +-- cross-type members need only be stable, since they are just shorthands +-- for index probe queries. +SELECT p1.amopfamily, p1.amopopr, p2.oprname, p3.prosrc +FROM pg_amop AS p1, pg_operator AS p2, pg_proc AS p3 +WHERE p1.amopopr = p2.oid AND p2.oprcode = p3.oid AND + p1.amoplefttype = p1.amoprighttype AND + p3.provolatile != 'i'; + amopfamily | amopopr | oprname | prosrc +------------+---------+---------+-------- +(0 rows) + +SELECT p1.amopfamily, p1.amopopr, p2.oprname, p3.prosrc +FROM pg_amop AS p1, pg_operator AS p2, pg_proc AS p3 +WHERE p1.amopopr = p2.oid AND p2.oprcode = p3.oid AND + p1.amoplefttype != p1.amoprighttype AND + p3.provolatile = 'v'; + amopfamily | amopopr | oprname | prosrc +------------+---------+---------+-------- +(0 rows) + +-- **************** pg_amproc **************** +-- Look for illegal values in pg_amproc fields +SELECT p1.amprocfamily, p1.amprocnum +FROM pg_amproc as p1 +WHERE p1.amprocfamily = 0 OR p1.amproclefttype = 0 OR p1.amprocrighttype = 0 + OR p1.amprocnum < 0 OR p1.amproc = 0; + amprocfamily | amprocnum +--------------+----------- +(0 rows) + +-- Support routines that are primary members of opfamilies must be immutable +-- (else it suggests that the index ordering isn't fixed). But cross-type +-- members need only be stable, since they are just shorthands +-- for index probe queries. +SELECT p1.amprocfamily, p1.amproc, p2.prosrc +FROM pg_amproc AS p1, pg_proc AS p2 +WHERE p1.amproc = p2.oid AND + p1.amproclefttype = p1.amprocrighttype AND + p2.provolatile != 'i'; + amprocfamily | amproc | prosrc +--------------+--------+-------- +(0 rows) + +SELECT p1.amprocfamily, p1.amproc, p2.prosrc +FROM pg_amproc AS p1, pg_proc AS p2 +WHERE p1.amproc = p2.oid AND + p1.amproclefttype != p1.amprocrighttype AND + p2.provolatile = 'v'; + amprocfamily | amproc | prosrc +--------------+--------+-------- +(0 rows) + +-- Almost all of the core distribution's Btree opclasses can use one of the +-- two generic "equalimage" functions as their support function 4. Look for +-- opclasses that don't allow deduplication unconditionally here. +-- +-- Newly added Btree opclasses don't have to support deduplication. It will +-- usually be trivial to add support, though. Note that the expected output +-- of this part of the test will need to be updated when a new opclass cannot +-- support deduplication (by using btequalimage). +SELECT amp.amproc::regproc AS proc, opf.opfname AS opfamily_name, + opc.opcname AS opclass_name, opc.opcintype::regtype AS opcintype +FROM pg_am AS am +JOIN pg_opclass AS opc ON opc.opcmethod = am.oid +JOIN pg_opfamily AS opf ON opc.opcfamily = opf.oid +LEFT JOIN pg_amproc AS amp ON amp.amprocfamily = opf.oid AND + amp.amproclefttype = opc.opcintype AND amp.amprocnum = 4 +WHERE am.amname = 'btree' AND + amp.amproc IS DISTINCT FROM 'btequalimage'::regproc +ORDER BY 1, 2, 3; + proc | opfamily_name | opclass_name | opcintype +--------------------+------------------+------------------+------------------ + btvarstrequalimage | bpchar_ops | bpchar_ops | character + btvarstrequalimage | text_ops | name_ops | name + btvarstrequalimage | text_ops | text_ops | text + btvarstrequalimage | text_ops | varchar_ops | text + | array_ops | array_ops | anyarray + | complex_ops | complex_ops | complex + | float_ops | float4_ops | real + | float_ops | float8_ops | double precision + | jsonb_ops | jsonb_ops | jsonb + | multirange_ops | multirange_ops | anymultirange + | numeric_ops | numeric_ops | numeric + | range_ops | range_ops | anyrange + | record_image_ops | record_image_ops | record + | record_ops | record_ops | record + | tsquery_ops | tsquery_ops | tsquery + | tsvector_ops | tsvector_ops | tsvector +(16 rows) + +-- **************** pg_index **************** +-- Look for illegal values in pg_index fields. +SELECT p1.indexrelid, p1.indrelid +FROM pg_index as p1 +WHERE p1.indexrelid = 0 OR p1.indrelid = 0 OR + p1.indnatts <= 0 OR p1.indnatts > 32; + indexrelid | indrelid +------------+---------- +(0 rows) + +-- oidvector and int2vector fields should be of length indnatts. +SELECT p1.indexrelid, p1.indrelid +FROM pg_index as p1 +WHERE array_lower(indkey, 1) != 0 OR array_upper(indkey, 1) != indnatts-1 OR + array_lower(indclass, 1) != 0 OR array_upper(indclass, 1) != indnatts-1 OR + array_lower(indcollation, 1) != 0 OR array_upper(indcollation, 1) != indnatts-1 OR + array_lower(indoption, 1) != 0 OR array_upper(indoption, 1) != indnatts-1; + indexrelid | indrelid +------------+---------- +(0 rows) + +-- Check that opclasses and collations match the underlying columns. +-- (As written, this test ignores expression indexes.) +SELECT indexrelid::regclass, indrelid::regclass, attname, atttypid::regtype, opcname +FROM (SELECT indexrelid, indrelid, unnest(indkey) as ikey, + unnest(indclass) as iclass, unnest(indcollation) as icoll + FROM pg_index) ss, + pg_attribute a, + pg_opclass opc +WHERE a.attrelid = indrelid AND a.attnum = ikey AND opc.oid = iclass AND + (NOT binary_coercible(atttypid, opcintype) OR icoll != attcollation); + indexrelid | indrelid | attname | atttypid | opcname +------------+----------+---------+----------+--------- +(0 rows) + +-- For system catalogs, be even tighter: nearly all indexes should be +-- exact type matches not binary-coercible matches. At this writing +-- the only exception is an OID index on a regproc column. +SELECT indexrelid::regclass, indrelid::regclass, attname, atttypid::regtype, opcname +FROM (SELECT indexrelid, indrelid, unnest(indkey) as ikey, + unnest(indclass) as iclass, unnest(indcollation) as icoll + FROM pg_index + WHERE indrelid < 16384) ss, + pg_attribute a, + pg_opclass opc +WHERE a.attrelid = indrelid AND a.attnum = ikey AND opc.oid = iclass AND + (opcintype != atttypid OR icoll != attcollation) +ORDER BY 1; + indexrelid | indrelid | attname | atttypid | opcname +-------------------------------------------+------------------+----------+----------+--------- + pg_aggregate_fnoid_index | pg_aggregate | aggfnoid | regproc | oid_ops + pg_proc_callback_profnoid_promethod_index | pg_proc_callback | profnoid | regproc | oid_ops +(2 rows) + +-- Check for system catalogs with collation-sensitive ordering. This is not +-- a representational error in pg_index, but simply wrong catalog design. +-- It's bad because we expect to be able to clone template0 and assign the +-- copy a different database collation. It would especially not work for +-- shared catalogs. +SELECT relname, attname, attcollation +FROM pg_class c, pg_attribute a +WHERE c.oid = attrelid AND c.oid < 16384 AND + c.relkind != 'v' AND -- we don't care about columns in views + c.relkind != 'f' AND -- GPDB: foreign/external tables are also OK. + c.relkind != 'c' AND -- GPDB: as well as composite types + attcollation != 0 AND + attcollation != (SELECT oid FROM pg_collation WHERE collname = 'C'); + relname | attname | attcollation +---------+---------+-------------- +(0 rows) + +-- Double-check that collation-sensitive indexes have "C" collation, too. +SELECT indexrelid::regclass, indrelid::regclass, iclass, icoll +FROM (SELECT indexrelid, indrelid, + unnest(indclass) as iclass, unnest(indcollation) as icoll + FROM pg_index + WHERE indrelid < 16384) ss +WHERE icoll != 0 AND + icoll != (SELECT oid FROM pg_collation WHERE collname = 'C'); + indexrelid | indrelid | iclass | icoll +------------+----------+--------+------- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/partition.out b/src/test/singlenode_regress/expected/partition.out new file mode 100755 index 00000000000..24a9e8ff161 --- /dev/null +++ b/src/test/singlenode_regress/expected/partition.out @@ -0,0 +1,5637 @@ +drop table if exists d; +drop table if exists c; +drop table if exists b; +drop table if exists a; +-- Check multi level partition COPY +create table region +( + r_regionkey integer not null, + r_name char(25), + r_comment varchar(152) +) +partition by range (r_regionkey) +subpartition by list (r_name) subpartition template +( + subpartition africa values ('AFRICA'), + subpartition america values ('AMERICA'), + subpartition asia values ('ASIA'), + subpartition europe values ('EUROPE'), + subpartition mideast values ('MIDDLE EAST'), + subpartition australia values ('AUSTRALIA'), + subpartition antarctica values ('ANTARCTICA') +) +( + partition region1 start (0), + partition region2 start (3), + partition region3 start (5) end (8) +); +-- root and internal parent partitions should have relfrozenxid as 0 +select relname, relkind from pg_class where relkind in ('r', 'p') and relname like 'region%' and relfrozenxid=0; + relname | relkind +----------------------+--------- + region | p + region_1_prt_region1 | p + region_1_prt_region2 | p + region_1_prt_region3 | p +(4 rows) + +select gp_segment_id, relname, relkind from gp_dist_random('pg_class') where relkind in ('r', 'p') and relname like 'region%' and relfrozenxid=0; + gp_segment_id | relname | relkind +---------------+----------------------+--------- + -1 | region | p + -1 | region_1_prt_region1 | p + -1 | region_1_prt_region2 | p + -1 | region_1_prt_region3 | p +(4 rows) + +create unique index region_pkey on region(r_regionkey, r_name); +copy region from stdin with delimiter '|'; +-- Test indexes +set enable_seqscan to off; +select * from region where r_regionkey = 1; + r_regionkey | r_name | r_comment +-------------+---------------------------+--------------------------------- + 1 | AMERICA | hs use ironic, even requests. s +(1 row) + +select * from region where r_regionkey = 2; + r_regionkey | r_name | r_comment +-------------+---------------------------+--------------------------------- + 2 | ASIA | ges. thinly even pinto beans ca +(1 row) + +select * from region where r_regionkey = 3; + r_regionkey | r_name | r_comment +-------------+---------------------------+----------------------------------------------- + 3 | EUROPE | ly final courts cajole furiously final excuse +(1 row) + +select * from region where r_regionkey = 4; + r_regionkey | r_name | r_comment +-------------+---------------------------+---------------------------------------------------------- + 4 | MIDDLE EAST | uickly special accounts cajole carefully blithely close +(1 row) + +select * from region where r_regionkey = 5; + r_regionkey | r_name | r_comment +-------------+---------------------------+----------- + 5 | AUSTRALIA | sdf +(1 row) + +select * from region where r_regionkey = 6; + r_regionkey | r_name | r_comment +-------------+---------------------------+----------- + 6 | ANTARCTICA | dsfdfg +(1 row) + +-- Test indexes with insert +insert into region values(7, 'AUSTRALIA', 'def'); +select * from region where r_regionkey = '7'; + r_regionkey | r_name | r_comment +-------------+---------------------------+----------- + 7 | AUSTRALIA | def +(1 row) + +-- test duplicate key. We shouldn't really allow primary keys on partitioned +-- tables since we cannot enforce them. But since this insert maps to a +-- single definitive partition, we can detect it. +insert into region values(7, 'AUSTRALIA', 'def'); +ERROR: duplicate key value violates unique constraint "region_1_prt_region3_2_prt_australia_r_regionkey_r_name_idx" +DETAIL: Key (r_regionkey, r_name)=(7, AUSTRALIA ) already exists. +drop table region; +-- exchange +-- 1) test all sanity checking +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); +-- start_ignore +-- policies are different +create table bar_p_diff_pol (i int, j int); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_diff_pol; +-- random policy vs. hash policy +create table bar_p_rand_pol (i int, j int); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_rand_pol; +-- end_ignore +-- different number of columns +create table bar_p_diff_col (i int, j int, k int); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_diff_col; +ERROR: table "bar_p_diff_col" contains column "k" not found in parent "foo_p" +DETAIL: The new partition may contain only the columns present in parent. +-- different types +create table bar_p_diff_typ (i int, j int8); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_diff_typ; +ERROR: child table "bar_p_diff_typ" has different type for column "j" +-- different column names +create table bar_p_diff_colnam (i int, m int); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_diff_colnam; +ERROR: table "bar_p_diff_colnam" contains column "m" not found in parent "foo_p" +DETAIL: The new partition may contain only the columns present in parent. +-- still different schema, but more than one level partitioning +CREATE TABLE two_level_pt(a int, b int, c int) +PARTITION BY RANGE (b) + SUBPARTITION BY RANGE (c) + SUBPARTITION TEMPLATE ( + START (11) END (12) EVERY (1)) + ( START (1) END (2) EVERY (1)); +CREATE TABLE candidate_for_leaf(a int, c int); +-- should fail +ALTER TABLE two_level_pt ALTER PARTITION FOR (1) + EXCHANGE PARTITION FOR (11) WITH TABLE candidate_for_leaf; +ERROR: child table is missing column "b" +-- different owner +create role part_role; +create table bar_p (i int, j int); +set session authorization part_role; +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +ERROR: must be owner of table foo_p +-- back to superuser +\c - +alter table bar_p owner to part_role; +set session authorization part_role; +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +ERROR: must be owner of table foo_p +\c - +-- owners should be the same, error out +alter table foo_p exchange partition for(6) with table bar_p; +drop table foo_p; +drop table bar_p; +-- should work, and new partition should inherit ownership (mpp-6538) +set role part_role; +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(6) every(3)); +reset role; +alter table foo_p split partition for (1) at (2) into (partition prt_11, partition prt_12); +\dt foo_* + List of relations + Schema | Name | Type | Owner | Storage +--------+--------------------+-------------------+-----------+--------- + public | foo_p | partitioned table | part_role | + public | foo_p_1_prt_2 | table | part_role | heap + public | foo_p_1_prt_prt_11 | table | part_role | heap + public | foo_p_1_prt_prt_12 | table | part_role | heap +(4 rows) + +drop table foo_p; +drop role part_role; +-- WITH OIDS is no longer supported. Check that it't rejected with the GPDB +-- partitioning syntax, too. +create table foo_p (i int, j int) with (oids = true) +partition by range(j) +(start(1) end(10) every(1)); +ERROR: tables declared WITH OIDS are not supported +-- non-partition table involved in inheritance +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); +create table barparent(i int, j int); +create table bar_p () inherits(barparent); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +ERROR: cannot attach inheritance child as partition +drop table bar_p; +drop table barparent; +-- non-partition table involved in inheritance +create table bar_p(i int, j int); +create table barchild () inherits(bar_p); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +ERROR: cannot attach inheritance parent as partition +drop table barchild; +drop table bar_p; +-- rules on non-partition table +create table bar_p(i int, j int); +create table baz_p(i int, j int); +create rule bar_baz as on insert to bar_p do instead insert into baz_p + values(NEW.i, NEW.j); +alter table foo_p exchange partition for(2) with table bar_p; +drop table foo_p, bar_p, baz_p; +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(5) every(1)); +-- Shouldn't fail: check constraint matches partition rule. +-- Note this test is slightly different from prior versions to get +-- in line with constraint consistency requirement. +create table bar_d(i int, j int check (j >= 2 and j < 3 )) +; +insert into bar_d values(100000, 2); +alter table foo_p exchange partition for(2) with table bar_d; +insert into bar_d values(200000, 2); +select * from bar_d; + i | j +--------+--- + 200000 | 2 +(1 row) + +drop table foo_p, bar_d; +-- permissions +create role part_role; +create table foo_p (i int) partition by range(i) (start(1) end(10) every(1)); +create table bar_p (i int); +grant select on foo_p to part_role; +revoke all on bar_p from part_role; +NOTICE: no privileges could be revoked +select has_table_privilege('part_role', 'foo_p_1_prt_6'::regclass, 'select'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('part_role', 'bar_p'::regclass, 'select'); + has_table_privilege +--------------------- + f +(1 row) + +alter table foo_p exchange partition for(6) with table bar_p; +select has_table_privilege('part_role', 'foo_p_1_prt_6'::regclass, 'select'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('part_role', 'bar_p'::regclass, 'select'); + has_table_privilege +--------------------- + t +(1 row) + +drop table foo_p; +drop table bar_p; +drop role part_role; +-- validation +create table foo_p (i int) partition by range(i) +(start(1) end(10) every(1)); +create table bar_p (i int); +insert into bar_p values(6); +insert into bar_p values(100); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +ERROR: partition constraint of relation "bar_p" is violated by some row +alter table foo_p exchange partition for(6) with table bar_p without +validation; +NOTICE: specifying "WITHOUT VALIDATION" acts as no operation. If the new partition is a regular table, validation is performed to make sure all the rows obey partition constraint. If the new partition is external or foreign table, no validation is performed. +ERROR: partition constraint of relation "bar_p" is violated by some row +analyze foo_p; +select * from foo_p; + i +--- +(0 rows) + +drop table foo_p, bar_p; +-- basic test +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int); +insert into bar_p values(0,6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; + i | j +---+--- + 0 | 6 +(1 row) + +select * from bar_p; + i | j +---+--- +(0 rows) + +-- test that we got the dependencies right +drop table bar_p; +select * from foo_p; + i | j +---+--- + 0 | 6 +(1 row) + +drop table foo_p; +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int); +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +insert into bar_p values(10, 10); +drop table foo_p; +select * from bar_p; + i | j +----+---- + 10 | 10 +(1 row) + +insert into bar_p values(6, 6); +select * from bar_p; + i | j +----+---- + 10 | 10 + 6 | 6 +(2 rows) + +drop table bar_p; +-- AO exchange with heap +create table foo_p (i int, j int) with(appendonly = true) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int); +insert into foo_p values(1, 1), (2, 1), (3, 1); +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; + i | j +---+--- + 1 | 1 + 2 | 1 + 3 | 1 + 6 | 6 +(4 rows) + +drop table bar_p; +drop table foo_p; +-- other way around +create table foo_p (i int, j int) with(appendonly = false) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int) with(appendonly = true); +insert into foo_p values(1, 1), (2, 1), (3, 2); +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; + i | j +---+--- + 1 | 1 + 2 | 1 + 3 | 2 + 6 | 6 +(4 rows) + +drop table bar_p; +drop table foo_p; +-- exchange AO with AO +create table foo_p (i int, j int) with(appendonly = true) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int) with(appendonly = true); +insert into foo_p values(1, 2), (2, 3), (3, 4); +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; + i | j +---+--- + 1 | 2 + 2 | 3 + 3 | 4 + 6 | 6 +(4 rows) + +drop table bar_p; +drop table foo_p; +-- exchange same table more than once +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int); +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; + i | j +---+--- + 6 | 6 +(1 row) + +select * from bar_p; + i | j +---+--- +(0 rows) + +alter table foo_p exchange partition for(6) with table bar_p; +select * from foo_p; + i | j +---+--- +(0 rows) + +select * from bar_p; + i | j +---+--- + 6 | 6 +(1 row) + +alter table foo_p exchange partition for(6) with table bar_p; +select * from foo_p; + i | j +---+--- + 6 | 6 +(1 row) + +select * from bar_p; + i | j +---+--- +(0 rows) + +drop table foo_p; +drop table bar_p; +-- exchange default partition is not allowed (single level) +drop table if exists dex; +NOTICE: table "dex" does not exist, skipping +drop table if exists exh_abc; +NOTICE: table "exh_abc" does not exist, skipping +create table dex (i int, j int) partition by range(j) +(partition a start (1) end(10), partition b start(11) end(20), +default partition abc); +create table exh_abc (like dex); +alter table dex exchange default partition with table exh_abc; +drop table dex; +drop table exh_abc; +-- exchange default partition is not allowed (multi level) +Drop table if exists sto_ao_ao; +NOTICE: table "sto_ao_ao" does not exist, skipping +drop table if exists exh_ao_ao; +NOTICE: table "exh_ao_ao" does not exist, skipping +Create table sto_ao_ao + ( + col1 bigint, col2 date, col3 text, col4 int) with(appendonly=true) + partition by range(col2) + subpartition by list (col3) + subpartition template ( default subpartition subothers, subpartition sub1 values ('one'), subpartition sub2 values ('two')) + (default partition others, start(date '2008-01-01') end(date '2008-04-30') every(interval '1 month')); +create table exh_ao_ao (like sto_ao_ao) with (appendonly=true); +alter table sto_ao_ao alter partition for ('2008-03-01') exchange default partition with table exh_ao_ao; +-- Exchange a non-default sub-partition of a default partition, should fail +alter table sto_ao_ao alter default partition exchange partition for ('one') with table exh_ao_ao; +ERROR: cannot specify a name, rank, or value for a DEFAULT partition in this context +-- Exchange a partition that has sub partitions, should fail. +alter table sto_ao_ao exchange partition for ('2008-01-01') with table exh_ao_ao; +ERROR: cannot EXCHANGE PARTITION for relation "sto_ao_ao" -- partition has children +-- XXX: not yet: VALIDATE parameter +-- Exchange a partition with an external table; +create table foo_p (i int, j int) partition by range(j) (start(1) end(10) every(2)); +create readable external table bar_p(i int, j int) location ('gpfdist://host.invalid:8000/file') format 'text'; +alter table foo_p exchange partition for(3) with table bar_p; +truncate foo_p; +ERROR: cannot truncate foreign table "foo_p_1_prt_2" +drop table foo_p; +drop table bar_p; +-- Check for overflow of circular data types like time +-- Should fail +CREATE TABLE TIME_TBL_HOUR_2 (f1 time(2)) +partition by range (f1) +( + start (time '00:00') end (time '24:00') EVERY (INTERVAL '1 hour') +); +ERROR: END parameter not reached before type overflows +LINE 4: start (time '00:00') end (time '24:00') EVERY (INTERVAL '1... + ^ +-- Should fail +CREATE TABLE TIME_TBL_HOUR_2 (f1 time(2)) +partition by range (f1) +( + start (time '00:00') end (time '23:59') EVERY (INTERVAL '1 hour') +); +ERROR: END parameter not reached before type overflows +LINE 4: start (time '00:00') end (time '23:59') EVERY (INTERVAL '1... + ^ +-- Should work +CREATE TABLE TIME_TBL_HOUR_2 (f1 time(2)) +partition by range (f1) +( + start (time '00:00') end (time '23:00') EVERY (INTERVAL '1 hour') +); +drop table TIME_TBL_HOUR_2; +-- Check for every parameters that just don't make sense +create table hhh_r2 (a char(1), b date, d char(3)) + partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01') + every (interval '0 days') +); +ERROR: EVERY parameter too small +LINE 5: every (interval '0 days') + ^ +create table foo_p (i int) +partition by range(i) +(start (1) end (20) every(0)); +ERROR: EVERY parameter too small +LINE 3: (start (1) end (20) every(0)); + ^ +-- Check for ambiguous EVERY parameters +create table foo_p (i int) +partition by range(i) +(start (1) end (3) every (0.6)); +\d+ foo_p + Partitioned table "public.foo_p" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Partition key: RANGE (i) +Partitions: foo_p_1_prt_1 FOR VALUES FROM (1) TO (2), + foo_p_1_prt_2 FOR VALUES FROM (2) TO (3) + +drop table foo_p; +-- should fail +create table foo_p (i int) +partition by range(i) +(start (1) end (3) every (0.3)); +ERROR: EVERY parameter too small +LINE 3: (start (1) end (3) every (0.3)); + ^ +create table foo_p (i int) +partition by range(i) +(start (1) end (3) every (1.3)); +\d+ foo_p + Partitioned table "public.foo_p" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Partition key: RANGE (i) +Partitions: foo_p_1_prt_1 FOR VALUES FROM (1) TO (2), + foo_p_1_prt_2 FOR VALUES FROM (2) TO (3) + +drop table foo_p; +create table foo_p (i int) +partition by range(i) +(start (1) end (20) every (10.9)); +\d+ foo_p + Partitioned table "public.foo_p" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Partition key: RANGE (i) +Partitions: foo_p_1_prt_1 FOR VALUES FROM (1) TO (12), + foo_p_1_prt_2 FOR VALUES FROM (12) TO (20) + +drop table foo_p; +-- should fail +create table foo_p (i int, j date) +partition by range(j) +(start ('2007-01-01') end ('2008-01-01') every (interval '0.5 days')); +ERROR: EVERY parameter too small +LINE 3: (start ('2007-01-01') end ('2008-01-01') every (interval '0.... + ^ +-- should fail +create table foo_p (i int, j date) +partition by range(j) +(start ('2007-01-01') end ('2008-01-01') every (interval '12 hours')); +ERROR: EVERY parameter too small +LINE 3: (start ('2007-01-01') end ('2008-01-01') every (interval '12... + ^ +create table foo_p (i int, j date) +partition by range(j) +(start ('2007-01-01') end ('2007-01-05') every (interval '1.2 days')); +\d+ foo_p + Partitioned table "public.foo_p" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | + j | date | | | | plain | | +Partition key: RANGE (j) +Partitions: foo_p_1_prt_1 FOR VALUES FROM ('01-01-2007') TO ('01-02-2007'), + foo_p_1_prt_2 FOR VALUES FROM ('01-02-2007') TO ('01-03-2007'), + foo_p_1_prt_3 FOR VALUES FROM ('01-03-2007') TO ('01-04-2007'), + foo_p_1_prt_4 FOR VALUES FROM ('01-04-2007') TO ('01-05-2007') + +drop table foo_p; +-- should work +create table foo_p (i int, j timestamp) +partition by range(j) +(start ('2007-01-01') end ('2007-01-05') every (interval '1.2 days')); +\d+ foo_p + Partitioned table "public.foo_p" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | + j | timestamp without time zone | | | | plain | | +Partition key: RANGE (j) +Partitions: foo_p_1_prt_1 FOR VALUES FROM ('Mon Jan 01 00:00:00 2007') TO ('Tue Jan 02 04:48:00 2007'), + foo_p_1_prt_2 FOR VALUES FROM ('Tue Jan 02 04:48:00 2007') TO ('Wed Jan 03 09:36:00 2007'), + foo_p_1_prt_3 FOR VALUES FROM ('Wed Jan 03 09:36:00 2007') TO ('Thu Jan 04 14:24:00 2007'), + foo_p_1_prt_4 FOR VALUES FROM ('Thu Jan 04 14:24:00 2007') TO ('Fri Jan 05 00:00:00 2007') + +drop table foo_p; +-- test inclusive/exclusive +CREATE TABLE supplier2( + S_SUPPKEY INTEGER, + S_NAME CHAR(25), + S_ADDRESS VARCHAR(40), + S_NATIONKEY INTEGER, + S_PHONECHAR char(15), + S_ACCTBAL decimal, + S_COMMENT VARCHAR(100) +) +partition by range (s_nationkey) +( +partition p1 start(0) , +partition p2 start(12) end(13), +partition p3 end(20) inclusive, +partition p4 start(20) exclusive , +partition p5 start(22) end(25) +); +\d+ supplier2 + Partitioned table "public.supplier2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +-------------+------------------------+-----------+----------+---------+----------+--------------+------------- + s_suppkey | integer | | | | plain | | + s_name | character(25) | | | | extended | | + s_address | character varying(40) | | | | extended | | + s_nationkey | integer | | | | plain | | + s_phonechar | character(15) | | | | extended | | + s_acctbal | numeric | | | | main | | + s_comment | character varying(100) | | | | extended | | +Partition key: RANGE (s_nationkey) +Partitions: supplier2_1_prt_p1 FOR VALUES FROM (0) TO (12), + supplier2_1_prt_p2 FOR VALUES FROM (12) TO (13), + supplier2_1_prt_p3 FOR VALUES FROM (13) TO (21), + supplier2_1_prt_p4 FOR VALUES FROM (21) TO (22), + supplier2_1_prt_p5 FOR VALUES FROM (22) TO (25) + +insert into supplier2 (s_suppkey, s_nationkey) select i, i +from generate_series(1, 24) i; +select * from supplier2_1_prt_p1 order by S_NATIONKEY; + s_suppkey | s_name | s_address | s_nationkey | s_phonechar | s_acctbal | s_comment +-----------+--------+-----------+-------------+-------------+-----------+----------- + 1 | | | 1 | | | + 2 | | | 2 | | | + 3 | | | 3 | | | + 4 | | | 4 | | | + 5 | | | 5 | | | + 6 | | | 6 | | | + 7 | | | 7 | | | + 8 | | | 8 | | | + 9 | | | 9 | | | + 10 | | | 10 | | | + 11 | | | 11 | | | +(11 rows) + +select * from supplier2_1_prt_p2 order by S_NATIONKEY; + s_suppkey | s_name | s_address | s_nationkey | s_phonechar | s_acctbal | s_comment +-----------+--------+-----------+-------------+-------------+-----------+----------- + 12 | | | 12 | | | +(1 row) + +select * from supplier2_1_prt_p3 order by S_NATIONKEY; + s_suppkey | s_name | s_address | s_nationkey | s_phonechar | s_acctbal | s_comment +-----------+--------+-----------+-------------+-------------+-----------+----------- + 13 | | | 13 | | | + 14 | | | 14 | | | + 15 | | | 15 | | | + 16 | | | 16 | | | + 17 | | | 17 | | | + 18 | | | 18 | | | + 19 | | | 19 | | | + 20 | | | 20 | | | +(8 rows) + +select * from supplier2_1_prt_p4 order by S_NATIONKEY; + s_suppkey | s_name | s_address | s_nationkey | s_phonechar | s_acctbal | s_comment +-----------+--------+-----------+-------------+-------------+-----------+----------- + 21 | | | 21 | | | +(1 row) + +select * from supplier2_1_prt_p5 order by S_NATIONKEY; + s_suppkey | s_name | s_address | s_nationkey | s_phonechar | s_acctbal | s_comment +-----------+--------+-----------+-------------+-------------+-----------+----------- + 22 | | | 22 | | | + 23 | | | 23 | | | + 24 | | | 24 | | | +(3 rows) + +drop table supplier2; +-- mpp3238 +create table foo_p (i int) partition by range (i) +( + partition p1 start('1') , + partition p2 start('2639161') , + partition p3 start('5957166') , + partition p4 start('5981976') end('5994376') inclusive, + partition p5 end('6000001') +); +\d+ foo_p + Partitioned table "public.foo_p" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Partition key: RANGE (i) +Partitions: foo_p_1_prt_p1 FOR VALUES FROM (1) TO (2639161), + foo_p_1_prt_p2 FOR VALUES FROM (2639161) TO (5957166), + foo_p_1_prt_p3 FOR VALUES FROM (5957166) TO (5981976), + foo_p_1_prt_p4 FOR VALUES FROM (5981976) TO (5994377), + foo_p_1_prt_p5 FOR VALUES FROM (5994377) TO (6000001) + +insert into foo_p values(5994400); +insert into foo_p values(1); +insert into foo_p values(6000002); +ERROR: no partition of relation "foo_p" found for row +DETAIL: Partition key of the failing row contains (i) = (6000002). +insert into foo_p values(5994376); +drop table foo_p; +create table foo_p (i int) +partition by range(i) +(partition p1 start(1) end(5), + partition p2 start(10), + partition p3 end(10) exclusive); +\d+ foo_p + Partitioned table "public.foo_p" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Partition key: RANGE (i) +Partitions: foo_p_1_prt_p1 FOR VALUES FROM (1) TO (5), + foo_p_1_prt_p2 FOR VALUES FROM (10) TO (MAXVALUE), + foo_p_1_prt_p3 FOR VALUES FROM (5) TO (10) + +drop table foo_p; +create table foo_p (i int) +partition by range(i) +(partition p1 start(1) end(5), + partition p2 start(10) exclusive, + partition p3 end(10) inclusive); +\d+ foo_p + Partitioned table "public.foo_p" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Partition key: RANGE (i) +Partitions: foo_p_1_prt_p1 FOR VALUES FROM (1) TO (5), + foo_p_1_prt_p2 FOR VALUES FROM (11) TO (MAXVALUE), + foo_p_1_prt_p3 FOR VALUES FROM (5) TO (11) + +insert into foo_p values(1), (5), (10); +drop table foo_p; +-- MPP-3264 +-- mix AO with master HEAP and see if copy works +create table foo_p (i int) +partition by list(i) +(partition p1 values(1, 2, 3) with (appendonly = true), + partition p2 values(4) +); +copy foo_p from stdin; +select * from foo_p; + i +--- + 1 + 2 + 3 + 4 +(4 rows) + +select * from foo_p_1_prt_p1; + i +--- + 1 + 2 + 3 +(3 rows) + +select * from foo_p_1_prt_p2; + i +--- + 4 +(1 row) + +drop table foo_p; +-- other way around +create table foo_p (i int) with(appendonly = true) +partition by list(i) +(partition p1 values(1, 2, 3) with (appendonly = false), + partition p2 values(4) +); +copy foo_p from stdin; +select * from foo_p; + i +--- + 1 + 2 + 3 + 4 +(4 rows) + +select * from foo_p_1_prt_p1; + i +--- + 1 + 2 + 3 +(3 rows) + +select * from foo_p_1_prt_p2; + i +--- + 4 +(1 row) + +drop table foo_p; +-- Same as above, but the input is ordered so that the inserts to the heap +-- partition happen first. Had a bug related flushing the multi-insert +-- buffers in that scenario at one point. +-- (https://github.com/greenplum-db/gpdb/issues/6678 +create table mixed_ao_part(distkey int, partkey int) +with (appendonly=true) +partition by range(partkey) ( + partition p1 start(0) end(100) with (appendonly = false), + partition p2 start(100) end(199) +); +copy mixed_ao_part from stdin; +select * from mixed_ao_part; + distkey | partkey +---------+--------- + 1 | 95 + 2 | 96 + 3 | 97 + 4 | 98 + 5 | 99 + 1 | 100 + 2 | 101 + 3 | 102 + 4 | 103 + 5 | 104 +(10 rows) + +-- Don't drop the table, so that we leave behind a mixed table in the +-- regression database for pg_dump/restore testing. +-- MPP-3283 +CREATE TABLE PARTSUPP ( +PS_PARTKEY INTEGER, +PS_SUPPKEY INTEGER, +PS_AVAILQTY integer, +PS_SUPPLYCOST decimal, +PS_COMMENT VARCHAR(199) +) +partition by range (ps_suppkey) +subpartition by range (ps_partkey) +subpartition by range (ps_supplycost) subpartition template (start('1') +end('1001') every(500)) +( +partition p1 start('1') end('10001') every(5000) +(subpartition sp1 start('1') end('200001') every(66666) +) +); +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'); +copy partsupp from stdin with delimiter '|'; +drop table partsupp; +--MPP-3285 +CREATE TABLE PARTLINEITEM ( + L_ORDERKEY INT8, + L_PARTKEY INTEGER, + L_SUPPKEY INTEGER, + L_LINENUMBER integer, + L_QUANTITY decimal, + L_EXTENDEDPRICE decimal, + L_DISCOUNT decimal, + L_TAX decimal, + L_RETURNFLAG CHAR(1), + L_LINESTATUS CHAR(1), + L_SHIPDATE date, + L_COMMITDATE date, + L_RECEIPTDATE date, + L_SHIPINSTRUCT CHAR(25), + L_SHIPMODE CHAR(10), + L_COMMENT VARCHAR(44) + ) +partition by range (l_commitdate) +( +partition p1 start('1992-01-31') end('1998-11-01') every(interval '20 months') +); +copy partlineitem from stdin with delimiter '|'; +\d+ partlineitem + Partitioned table "public.partlineitem" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +-----------------+-----------------------+-----------+----------+---------+----------+--------------+------------- + l_orderkey | bigint | | | | plain | | + l_partkey | integer | | | | plain | | + l_suppkey | integer | | | | plain | | + l_linenumber | integer | | | | plain | | + l_quantity | numeric | | | | main | | + l_extendedprice | numeric | | | | main | | + l_discount | numeric | | | | main | | + l_tax | numeric | | | | main | | + l_returnflag | character(1) | | | | extended | | + l_linestatus | character(1) | | | | extended | | + l_shipdate | date | | | | plain | | + l_commitdate | date | | | | plain | | + l_receiptdate | date | | | | plain | | + l_shipinstruct | character(25) | | | | extended | | + l_shipmode | character(10) | | | | extended | | + l_comment | character varying(44) | | | | extended | | +Partition key: RANGE (l_commitdate) +Partitions: partlineitem_1_prt_p1_1 FOR VALUES FROM ('01-31-1992') TO ('09-30-1993'), + partlineitem_1_prt_p1_2 FOR VALUES FROM ('09-30-1993') TO ('05-30-1995'), + partlineitem_1_prt_p1_3 FOR VALUES FROM ('05-30-1995') TO ('01-30-1997'), + partlineitem_1_prt_p1_4 FOR VALUES FROM ('01-30-1997') TO ('09-30-1998'), + partlineitem_1_prt_p1_5 FOR VALUES FROM ('09-30-1998') TO ('11-01-1998') + +drop table partlineitem; +-- Make sure ADD creates dependencies +create table i (i int) partition by range(i) (start (1) end(3) every(1)); +alter table i add partition foo2 start(40) end (50); +drop table i; +create table i (i int) partition by range(i) (start (1) end(3) every(1)); +alter table i add partition foo2 start(40) end (50); +alter table i drop partition foo2; +-- when using the partition name to find target partition table, +-- we shoud check whether the matched table belong to the partitioned table. +-- raise error instead of executing on the irrelevant table. +create table i_1_prt_3 (like i); +-- create another partitioned table which contains a partition table that +-- could be matched by partition name when targeted on an irrelevant table. +create table i2 (i int) partition by range(i) (start (1) end(3) every(1)); +create table i_1_prt_4 partition of i2 for values from (4) to (5); +-- the matechd table name is i_1_prt_3, but it's a normal table, raise error. +alter table i drop partition "3"; +ERROR: partition "3" of "i" does not exist +-- the matched table name is i_1_prt_4, but it belongs to i2, raise error +alter table i drop partition "4"; +ERROR: partition "4" of "i" does not exist +-- should raise error since we always make sure the partitioned table at least have one partition; +alter table i drop partition "1", drop partition "2"; +ERROR: cannot drop partition "i_1_prt_2" of "i" -- only one remains +HINT: Use DROP TABLE "i" to remove the table and the final partition +drop table i; +drop table i2; +drop table i_1_prt_3; +create table i (i int) partition by range(i) (start(1) end(3) every(1), default partition extra); +-- should raise error since we always make sure the partitioned table at least have one partition; +alter table i drop partition "2", drop partition "3", drop default partition; +ERROR: cannot drop partition "i_1_prt_extra" of "i" -- only one remains +HINT: Use DROP TABLE "i" to remove the table and the final partition +drop table i; +create table i (i int, c text) partition by range(i) subpartition by list(c) +subpartition template (subpartition a values ('a'), subpartition b values ('b')) +(start (1) end(3) every(1)); +-- should raise error since we always make sure the partitioned table at least have one partition; +alter table i alter partition "1" drop partition a, alter partition "1" drop partition b; +ERROR: cannot drop partition "i_1_prt_1_2_prt_b" of "i_1_prt_1" -- only one remains +HINT: Use DROP TABLE "i_1_prt_1" to remove the table and the final partition +drop table i; +CREATE TABLE PARTSUPP ( +PS_PARTKEY INTEGER, +PS_SUPPKEY INTEGER, +PS_AVAILQTY integer, +PS_SUPPLYCOST decimal, +PS_COMMENT VARCHAR(199) +) +partition by range (ps_suppkey) +subpartition by range (ps_partkey) +subpartition by range (ps_supplycost) subpartition template (start('1') +end('1001') every(500)) +( +partition p1 start('1') end('10001') every(5000) +(subpartition sp1 start('1') end('200001') every(66666) +) +); +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'partsupp%'; + relname | pg_get_expr +-----------------------------------------+-------------------------------------- + partsupp | + partsupp_1_prt_p1_1 | FOR VALUES FROM (1) TO (5001) + partsupp_1_prt_p1_1_2_prt_sp1_1 | FOR VALUES FROM (1) TO (66667) + partsupp_1_prt_p1_1_2_prt_sp1_1_3_prt_1 | FOR VALUES FROM ('1') TO ('501') + partsupp_1_prt_p1_1_2_prt_sp1_1_3_prt_2 | FOR VALUES FROM ('501') TO ('1001') + partsupp_1_prt_p1_1_2_prt_sp1_2 | FOR VALUES FROM (66667) TO (133333) + partsupp_1_prt_p1_1_2_prt_sp1_2_3_prt_1 | FOR VALUES FROM ('1') TO ('501') + partsupp_1_prt_p1_1_2_prt_sp1_2_3_prt_2 | FOR VALUES FROM ('501') TO ('1001') + partsupp_1_prt_p1_1_2_prt_sp1_3 | FOR VALUES FROM (133333) TO (199999) + partsupp_1_prt_p1_1_2_prt_sp1_3_3_prt_1 | FOR VALUES FROM ('1') TO ('501') + partsupp_1_prt_p1_1_2_prt_sp1_3_3_prt_2 | FOR VALUES FROM ('501') TO ('1001') + partsupp_1_prt_p1_1_2_prt_sp1_4 | FOR VALUES FROM (199999) TO (200001) + partsupp_1_prt_p1_1_2_prt_sp1_4_3_prt_1 | FOR VALUES FROM ('1') TO ('501') + partsupp_1_prt_p1_1_2_prt_sp1_4_3_prt_2 | FOR VALUES FROM ('501') TO ('1001') + partsupp_1_prt_p1_2 | FOR VALUES FROM (5001) TO (10001) + partsupp_1_prt_p1_2_2_prt_sp1_1 | FOR VALUES FROM (1) TO (66667) + partsupp_1_prt_p1_2_2_prt_sp1_1_3_prt_1 | FOR VALUES FROM ('1') TO ('501') + partsupp_1_prt_p1_2_2_prt_sp1_1_3_prt_2 | FOR VALUES FROM ('501') TO ('1001') + partsupp_1_prt_p1_2_2_prt_sp1_2 | FOR VALUES FROM (66667) TO (133333) + partsupp_1_prt_p1_2_2_prt_sp1_2_3_prt_1 | FOR VALUES FROM ('1') TO ('501') + partsupp_1_prt_p1_2_2_prt_sp1_2_3_prt_2 | FOR VALUES FROM ('501') TO ('1001') + partsupp_1_prt_p1_2_2_prt_sp1_3 | FOR VALUES FROM (133333) TO (199999) + partsupp_1_prt_p1_2_2_prt_sp1_3_3_prt_1 | FOR VALUES FROM ('1') TO ('501') + partsupp_1_prt_p1_2_2_prt_sp1_3_3_prt_2 | FOR VALUES FROM ('501') TO ('1001') + partsupp_1_prt_p1_2_2_prt_sp1_4 | FOR VALUES FROM (199999) TO (200001) + partsupp_1_prt_p1_2_2_prt_sp1_4_3_prt_1 | FOR VALUES FROM ('1') TO ('501') + partsupp_1_prt_p1_2_2_prt_sp1_4_3_prt_2 | FOR VALUES FROM ('501') TO ('1001') +(27 rows) + +drop table partsupp; +-- ALTER TABLE ALTER PARTITION tests +CREATE TABLE ataprank (id int, rank int, +year date, gender char(1), +usstate char(2)) +partition by list (gender) +subpartition by range (year) +subpartition template ( +subpartition jan01 start (date '2001-01-01'), +subpartition jan02 start (date '2002-01-01'), +subpartition jan03 start (date '2003-01-01'), +subpartition jan04 start (date '2004-01-01'), +subpartition jan05 start (date '2005-01-01') +) +subpartition by list (usstate) +subpartition template ( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +) +( + partition boys values ('M'), + partition girls values ('F') +); +-- and without subpartition templates... +CREATE TABLE ataprank2 (id int, rank int, +year date, gender char(1), +usstate char(2)) +partition by list (gender) +subpartition by range (year) +subpartition by list (usstate) +( + partition boys values ('M') +( +subpartition jan01 start (date '2001-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan02 start (date '2002-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan03 start (date '2003-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan04 start (date '2004-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan05 start (date '2005-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +) +), + partition girls values ('F') +( +subpartition jan01 start (date '2001-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan02 start (date '2002-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan03 start (date '2003-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan04 start (date '2004-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan05 start (date '2005-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +) +) +); +-- ok +alter table ataprank truncate partition girls; +alter table ataprank alter partition girls truncate partition for ('2001-01-01'); +alter table ataprank alter partition girls alter partition +for ('2001-01-01') truncate partition mass; +-- addressing partitions by RANK is no longer supported +alter table ataprank truncate partition for (rank (1)); +ERROR: addressing partition by RANK is no longer supported +LINE 1: alter table ataprank truncate partition for (rank (1)); + ^ +HINT: Use partition name or FOR () instead. +-- don't NOTIFY of children if cascade +alter table ataprank truncate partition girls cascade; +-- fail - no partition for '1999-01-01' +alter table ataprank alter partition girls truncate partition for ('1999-01-01'); +ERROR: partition for specified value of ataprank_1_prt_girls does not exist +-- fail - no funky +alter table ataprank alter partition girls alter partition +for ('2001-01-01') truncate partition "funky"; +ERROR: relation "public.ataprank_1_prt_girls_2_prt_jan01_3_prt_funky" does not exist +-- fail - no funky (drop) +alter table ataprank alter partition girls alter partition +for ('2001-01-01') drop partition "funky"; +ERROR: relation "public.ataprank_1_prt_girls_2_prt_jan01_3_prt_funky" does not exist +-- fail - missing name +alter table ataprank alter partition girls alter partition +for ('2001-01-01') drop partition; +ERROR: syntax error at or near ";" +LINE 2: for ('2001-01-01') drop partition; + ^ +-- ok +alter table ataprank alter partition girls drop partition +for ('2001-01-01'); +-- ok , skipping +alter table ataprank alter partition girls drop partition if exists jan01; +-- ok +alter table ataprank alter partition girls drop partition for ('2002-01-01'); +alter table ataprank alter partition girls drop partition for ('2003-01-01'); +alter table ataprank alter partition girls drop partition for ('2004-01-01'); +-- ok, skipping +alter table ataprank alter partition girls drop partition if exists for ('2004-01-01'); +-- ok +alter table ataprank alter partition girls rename partition jan05 +to "funky fresh"; +alter table ataprank alter partition girls rename partition "funky fresh" +to jan05; +-- fail , not exist +alter table ataprank alter partition girls alter partition jan05 rename +partition jan01 to foo; +ERROR: relation "public.ataprank_1_prt_girls_2_prt_jan05_3_prt_jan01" does not exist +-- fail not exist +alter table ataprank alter partition girls alter partition jan05 alter +partition cali rename partition foo to bar; +ERROR: table "ataprank_1_prt_girls_2_prt_jan05_3_prt_cali" is not partitioned +-- fail not partitioned +alter table ataprank alter partition girls alter partition jan05 alter +partition cali alter partition foo drop partition bar; +ERROR: table "ataprank_1_prt_girls_2_prt_jan05_3_prt_cali" is not partitioned +-- ADD PARTITION, with and without templates +-- fails for ataprank (due to template), works for ataprank2 +alter table ataprank +add partition neuter values ('N') + (subpartition foo + start ('2001-01-01') end ('2002-01-01') + every (interval '1 month') + (subpartition bar values ('AZ'))); +ERROR: subpartition configuration conflicts with subpartition template +LINE 3: (subpartition foo + ^ +alter table ataprank2 +add partition neuter values ('N') + (subpartition foo + start ('2001-01-01') end ('2002-01-01') + every (interval '1 month') + (subpartition bar values ('AZ'))); +-- fail , no subpartition spec for ataprank2, works for ataprank +alter table ataprank alter partition boys +add partition jan00 start ('2000-01-01') end ('2001-01-01'); +alter table ataprank2 alter partition boys +add partition jan00 start ('2000-01-01') end ('2001-01-01'); +ERROR: no partitions specified at depth 3 +-- work - create subpartition for ataprank2, fail for ataprank +alter table ataprank alter partition boys +add partition jan99 start ('1999-01-01') end ('2000-01-01') + (subpartition ariz values ('AZ')); +ERROR: subpartition configuration conflicts with subpartition template +alter table ataprank2 alter partition boys +add partition jan00 start ('2000-01-01') end ('2001-01-01') + (subpartition ariz values ('AZ')); +-- works for both -- adding leaf partition doesn't conflict with template +alter table ataprank alter partition boys +alter partition jan00 +add partition haw values ('HI'); +alter table ataprank2 alter partition boys +alter partition jan00 +add partition haw values ('HI'); +alter table ataprank drop partition neuter; +ERROR: relation "public.ataprank_1_prt_neuter" does not exist +alter table ataprank2 drop partition neuter; +-- fail , no subpartition spec for ataprank2, work for ataprank +alter table ataprank +add default partition neuter; +alter table ataprank2 +add default partition neuter; +ERROR: no partitions specified at depth 2 +alter table ataprank +add default partition neuter + (subpartition foo + start ('2001-01-01') end ('2002-01-01') + every (interval '1 month') + (subpartition ariz values ('AZ'))); +ERROR: subpartition configuration conflicts with subpartition template +LINE 3: (subpartition foo + ^ +alter table ataprank2 +add default partition neuter + (subpartition foo + start ('2001-01-01') end ('2002-01-01') + every (interval '1 month') + (subpartition ariz values ('AZ'))); +-- fail +alter table ataprank +alter default partition add default partition def1 +(subpartition haw values ('HI')); +ERROR: subpartition configuration conflicts with subpartition template +-- fail +alter table ataprank +alter default partition alter default partition +add default partition def2; +ERROR: DEFAULT partition of relation "ataprank_1_prt_neuter" does not exist +-- work +alter table ataprank +alter default partition add default partition def1; +alter table ataprank +alter default partition alter default partition +add default partition def2; +alter table ataprank2 +alter default partition add default partition def1 +(subpartition haw values ('HI')); +alter table ataprank2 +alter default partition alter default partition +add default partition def2; +drop table ataprank; +drop table ataprank2; +-- **END** ALTER TABLE ALTER PARTITION tests +-- Test casting +create table f (i int) partition by range (i) (start(1::int) end(10::int)); +drop table f; +create table f (i bigint) partition by range (i) (start(1::int8) +end(1152921504606846976::int8) every(576460752303423488)); +drop table f; +create table f (n numeric(20, 2)) partition by range(n) (start(1::bigint) +end(10000::bigint)); +drop table f; +--should fail, there's no assignment cast from text to numeric +create table f (n numeric(20, 2)) partition by range(n) (start(1::bigint) +end(10000::text)); +ERROR: specified value cannot be cast to type numeric for column "n" +LINE 2: end(10000::text)); + ^ +--should fail. there's no assignment cast from bool to numeric +create table f (n numeric(20, 2)) partition by range(n) (start(1::bigint) +end('f'::bool)); +ERROR: specified value cannot be cast to type numeric for column "n" +LINE 2: end('f'::bool)); + ^ +-- see that grant and revoke cascade to children +create role part_role; +create table granttest (i int, j int) partition by range(i) +subpartition by list(j) subpartition template (values(1, 2, 3)) +(start(1) end(4) every(1)); +select relname, has_table_privilege('part_role', oid,'select') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'select') as i_priv, + has_column_privilege('part_role', oid, 'j', 'select') as j_priv +from pg_class where relname like 'granttest%'; + relname | tabpriv | i_priv | j_priv +---------------------------+---------+--------+-------- + granttest | f | f | f + granttest_1_prt_1 | f | f | f + granttest_1_prt_1_2_prt_1 | f | f | f + granttest_1_prt_2 | f | f | f + granttest_1_prt_2_2_prt_1 | f | f | f + granttest_1_prt_3 | f | f | f + granttest_1_prt_3_2_prt_1 | f | f | f +(7 rows) + +grant select (i) on granttest to part_role; +select relname, has_table_privilege('part_role', oid,'select') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'select') as i_priv, + has_column_privilege('part_role', oid, 'j', 'select') as j_priv +from pg_class where relname like 'granttest%'; + relname | tabpriv | i_priv | j_priv +---------------------------+---------+--------+-------- + granttest | f | t | f + granttest_1_prt_1 | f | t | f + granttest_1_prt_1_2_prt_1 | f | t | f + granttest_1_prt_2 | f | t | f + granttest_1_prt_2_2_prt_1 | f | t | f + granttest_1_prt_3 | f | t | f + granttest_1_prt_3_2_prt_1 | f | t | f +(7 rows) + +grant select on granttest to part_role; +select relname, has_table_privilege('part_role', oid,'select') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'select') as i_priv, + has_column_privilege('part_role', oid, 'j', 'select') as j_priv +from pg_class where relname like 'granttest%'; + relname | tabpriv | i_priv | j_priv +---------------------------+---------+--------+-------- + granttest | t | t | t + granttest_1_prt_1 | t | t | t + granttest_1_prt_1_2_prt_1 | t | t | t + granttest_1_prt_2 | t | t | t + granttest_1_prt_2_2_prt_1 | t | t | t + granttest_1_prt_3 | t | t | t + granttest_1_prt_3_2_prt_1 | t | t | t +(7 rows) + +grant insert on granttest to part_role; +select relname, has_table_privilege('part_role', oid, 'insert') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'insert') as i_priv, + has_column_privilege('part_role', oid, 'j', 'insert') as j_priv +from pg_class where relname like 'granttest%'; + relname | tabpriv | i_priv | j_priv +---------------------------+---------+--------+-------- + granttest | t | t | t + granttest_1_prt_1 | t | t | t + granttest_1_prt_1_2_prt_1 | t | t | t + granttest_1_prt_2 | t | t | t + granttest_1_prt_2_2_prt_1 | t | t | t + granttest_1_prt_3 | t | t | t + granttest_1_prt_3_2_prt_1 | t | t | t +(7 rows) + +revoke insert on granttest from part_role; +grant insert (j) on granttest to part_role; +select relname, has_table_privilege('part_role', oid, 'insert') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'insert') as i_priv, + has_column_privilege('part_role', oid, 'j', 'insert') as j_priv +from pg_class where relname like 'granttest%'; + relname | tabpriv | i_priv | j_priv +---------------------------+---------+--------+-------- + granttest | f | f | t + granttest_1_prt_1 | f | f | t + granttest_1_prt_1_2_prt_1 | f | f | t + granttest_1_prt_2 | f | f | t + granttest_1_prt_2_2_prt_1 | f | f | t + granttest_1_prt_3 | f | f | t + granttest_1_prt_3_2_prt_1 | f | f | t +(7 rows) + +-- Check that when a new partition is created, it inherits the permissions +-- from the parent. +alter table granttest add partition newpart start(100) end (101); +-- same with the new upstream syntax. +create table granttest_newpartsyntax partition of granttest for values from (110) to (120); +select relname, has_table_privilege('part_role', oid, 'select') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'select') as i_priv, + has_column_privilege('part_role', oid, 'j', 'select') as j_priv +from pg_class where relname like 'granttest%'; + relname | tabpriv | i_priv | j_priv +---------------------------------+---------+--------+-------- + granttest | t | t | t + granttest_1_prt_1 | t | t | t + granttest_1_prt_1_2_prt_1 | t | t | t + granttest_1_prt_2 | t | t | t + granttest_1_prt_2_2_prt_1 | t | t | t + granttest_1_prt_3 | t | t | t + granttest_1_prt_3_2_prt_1 | t | t | t + granttest_1_prt_newpart | t | t | t + granttest_1_prt_newpart_2_prt_1 | t | t | t + granttest_newpartsyntax | t | t | t +(10 rows) + +select relname, has_table_privilege('part_role', oid, 'insert') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'insert') as i_priv, + has_column_privilege('part_role', oid, 'j', 'insert') as j_priv +from pg_class where relname like 'granttest%'; + relname | tabpriv | i_priv | j_priv +---------------------------------+---------+--------+-------- + granttest | f | f | t + granttest_1_prt_1 | f | f | t + granttest_1_prt_1_2_prt_1 | f | f | t + granttest_1_prt_2 | f | f | t + granttest_1_prt_2_2_prt_1 | f | f | t + granttest_1_prt_3 | f | f | t + granttest_1_prt_3_2_prt_1 | f | f | t + granttest_1_prt_newpart | f | f | t + granttest_1_prt_newpart_2_prt_1 | f | f | t + granttest_newpartsyntax | f | f | t +(10 rows) + +revoke all on granttest from part_role; +select relname, has_table_privilege('part_role', oid, 'insert') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'insert') as i_priv, + has_column_privilege('part_role', oid, 'j', 'insert') as j_priv +from pg_class where relname like 'granttest%'; + relname | tabpriv | i_priv | j_priv +---------------------------------+---------+--------+-------- + granttest | f | f | f + granttest_1_prt_1 | f | f | f + granttest_1_prt_1_2_prt_1 | f | f | f + granttest_1_prt_2 | f | f | f + granttest_1_prt_2_2_prt_1 | f | f | f + granttest_1_prt_3 | f | f | f + granttest_1_prt_3_2_prt_1 | f | f | f + granttest_1_prt_newpart | f | f | f + granttest_1_prt_newpart_2_prt_1 | f | f | f + granttest_newpartsyntax | f | f | f +(10 rows) + +drop table granttest; +drop role part_role; +-- deep inline + optional subpartition comma: +CREATE TABLE partsupp_1 ( + ps_partkey integer, + ps_suppkey integer, + ps_availqty integer, + ps_supplycost numeric, + ps_comment character varying(199) +) PARTITION BY RANGE(ps_suppkey) + SUBPARTITION BY RANGE(ps_partkey) + SUBPARTITION BY RANGE(ps_supplycost) + ( + PARTITION p1_1 START (1) END (1666667) EVERY (1666666) + ( + START (1) END (19304783) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ), + START (19304783) END (100000001) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ) + ), + PARTITION p1_2 START (1666667) END (3333333) EVERY (1666666) + ( + START (1) END (19304783) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ), + START (19304783) END (100000001) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ) + ), + PARTITION p1_3 START (3333333) END (4999999) EVERY (1666666) + ( + START (1) END (19304783) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ), + START (19304783) END (100000001) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ) + ), + PARTITION p1_4 START (4999999) END (5000001) EVERY (1666666) + ( + START (1) END (19304783) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ), + START (19304783) END (100000001) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ) + ) + ); +-- Accept negative values trivially: +create table partition_g (i int) partition by range(i) (start((-1)) end(10)); +drop table partition_g; +create table partition_g (i int) partition by range(i) (start(-1) end(10)); +drop table partition_g; +CREATE TABLE orders ( + o_orderkey bigint, + o_custkey integer, + o_orderstatus character(1), + o_totalprice numeric, + o_orderdate date, + o_orderpriority character(15), + o_clerk character(15), + o_shippriority integer, + o_comment character varying(79) +) +WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) PARTITION BY RANGE(o_orderdate) + SUBPARTITION BY RANGE(o_custkey) + SUBPARTITION BY RANGE(o_orderkey) + ( + PARTITION p1_1 START ('1992-01-01'::date) END ('1993-06-01'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ), + PARTITION p1_2 START ('1993-06-01'::date) END ('1994-11-01'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ), + PARTITION p1_3 START ('1994-11-01'::date) END ('1996-04-01'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ), + PARTITION p1_4 START ('1996-04-01'::date) END ('1997-09-01'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ), + PARTITION p1_5 START ('1997-09-01'::date) END ('1998-08-03'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ) + ); +-- grammar bug: MPP-3361 +create table i2 (i int) partition by range(i) (start(-2::int) end(20)); +drop table i2; +create table i2 (i int) partition by range(i) (start((-2)::int) end(20)); +drop table i2; +create table i2 (i int) partition by range(i) (start(cast ((-2)::bigint as int)) +end(20)); +drop table i2; +CREATE TABLE partsupp ( + ps_partkey integer, + ps_suppkey integer, + ps_availqty integer, + ps_supplycost numeric, + ps_comment character varying(199) +) PARTITION BY RANGE(ps_supplycost) + ( + PARTITION newpart START ((-10000)::numeric) EXCLUSIVE END (1::numeric) +, + PARTITION p1 START (1::numeric) END (1001::numeric) + ); +ERROR: START EXCLUSIVE not supported for partition key data type: numeric +HINT: Specify an inclusive START value and remove the EXCLUSIVE keyword +drop table partsupp; +ERROR: table "partsupp" does not exist +-- Deletion tests +CREATE TABLE tmp_nation_region (n_regionkey integer); +drop table if exists tmp_nation; +NOTICE: table "tmp_nation" does not exist, skipping +CREATE TABLE tmp_nation (N_NATIONKEY INTEGER, N_NAME CHAR(25), N_REGIONKEY INTEGER, N_COMMENT VARCHAR(152)) +partition by range (n_nationkey) + ( +partition p1 start('0') WITH (appendonly=true,checksum=true,blocksize=1998848,compresslevel=4), +partition p2 start('11') end('15') inclusive WITH (checksum=false,appendonly=true,blocksize=655360,compresslevel=4), +partition p3 start('15') exclusive end('19'), partition p4 start('19') WITH (compresslevel=8,appendonly=true,checksum=false,blocksize=884736), +partition p5 start('20') +); +delete from tmp_nation where n_regionkey in (select n_regionkey from tmp_nation_region) and n_nationkey between 1 and 5; +drop table tmp_nation; +-- SPLIT tests +-- basic sanity tests. All should pass. +create table k (i int) partition by range(i) (start(1) end(10) every(2), +default partition mydef); +insert into k select i from generate_series(1, 100) i; +alter table k split partition mydef at (20) into (partition mydef, +partition foo); +ERROR: AT clause cannot be used when splitting a default RANGE partition +drop table k; +create table j (i int) partition by list(i) (partition a values(1, 2, 3, 4), +partition b values(5, 6, 7, 8)); +insert into j select i from generate_series(1, 8) i; +alter table j split partition for(1) at (2, 3) into (partition fa, partition +fb); +select * from j_1_prt_fa; + i +--- + 1 + 4 +(2 rows) + +select * from j_1_prt_fb; + i +--- + 2 + 3 +(2 rows) + +alter table j split partition for(5) at (6); +select * from j; + i +--- + 1 + 4 + 2 + 3 + 5 + 7 + 8 + 6 +(8 rows) + +-- should fail +alter table j split partition for (1) at (100); +ERROR: AT clause parameter is not a member of the target partition specification +drop table j; +create table k (i int) partition by range(i) (start(1) end(10) every(2), +default partition mydef); +-- should fail +alter table k split default partition start(30) end (300) into (partition mydef, partition mydef); +ERROR: both INTO partitions already exist +alter table k split partition for(3) at (20); +ERROR: partition "k_1_prt_1" would overlap partition "k_1_prt_4" +drop table k; +-- should work +create table k (i int) partition by range(i) (start(1) end(10) every(2), +default partition mydef); +insert into k select i from generate_series(1, 30) i; +alter table k split default partition start(15) end(20) into +(partition mydef, partition foo); +select * from k_1_prt_foo; + i +---- + 15 + 16 + 17 + 18 + 19 +(5 rows) + +alter table k split default partition start(22) exclusive end(25) inclusive +into (partition bar, partition mydef); +select * from k_1_prt_bar; + i +---- + 23 + 24 + 25 +(3 rows) + +-- This fails, because it would create a partition with an empty range. Before +-- GPDB 7, this passed, because a partition like "start (22) exclusive end (23) +-- exclusive" was considered valid. +alter table k split partition bar at (23) into (partition baz, partition foz); +ERROR: empty range bound specified for partition "k_1_prt_baz" +DETAIL: Specified lower bound (23) is greater than or equal to upper bound (23). +\d+ k + Partitioned table "public.k" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Partition key: RANGE (i) +Partitions: k_1_prt_2 FOR VALUES FROM (1) TO (3), + k_1_prt_3 FOR VALUES FROM (3) TO (5), + k_1_prt_4 FOR VALUES FROM (5) TO (7), + k_1_prt_5 FOR VALUES FROM (7) TO (9), + k_1_prt_6 FOR VALUES FROM (9) TO (10), + k_1_prt_bar FOR VALUES FROM (23) TO (26), + k_1_prt_foo FOR VALUES FROM (15) TO (20), + k_1_prt_mydef DEFAULT + +drop table k; +-- Add CO partition and split, reported in MPP-17761 +create table k (i int) with (appendonly = true, orientation = column) partition by range(i) (start(1) end(10) every(5)); +alter table k add partition co start(11) end (17) with (appendonly = true, orientation = column); +alter table k split partition co at (14) into (partition co1, partition co2); +drop table k; +create table k (a int, b int) with (appendonly = true) partition by list(b) +( + partition a values (1, 2, 3, 4) with (appendonly = true, orientation = column), + partition b values (5, 6, 7 ,8) with (appendonly = true, orientation = column) +); +alter table k split partition for(2) at(2) into (partition one, partition two); +drop table k; +-- Test errors for default handling +create table k (i int) partition by range(i) (start(1) end(2), +default partition mydef); +alter table k split partition mydef at (25) into (partition foo, partition +mydef); +ERROR: AT clause cannot be used when splitting a default RANGE partition +drop table k; +create table k (i int) partition by list(i) (values(1), values(2), +default partition mydef); +alter table k split default partition start(10) end(20); +ERROR: cannot SPLIT LIST PARTITION with START +HINT: Use SPLIT with the AT clause instead. +drop table k; +-- Check that we support int2 +CREATE TABLE myINT2_TBL(q1 int2) + partition by range (q1) + (start (1) end (3) every (1)); +insert into myint2_tbl values(1), (2); +drop table myint2_tbl; +-- try SREH on a partitioned table. +create table ao_p (i int) with (appendonly = true) + partition by range(i) + (start(1) end(5) every(1)); +copy ao_p from stdin log errors segment reject limit 100; +NOTICE: found 2 data formatting errors (2 or more input rows), rejected related input data +select * from ao_p; + i +--- + 2 + 3 +(2 rows) + +drop table ao_p; +-- MPP-3591: make sure we get inclusive/exclusive right with every(). +create table k (i int) partition by range(i) +(start(0) exclusive end(100) inclusive every(25)); +\d+ k + Partitioned table "public.k" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Partition key: RANGE (i) +Partitions: k_1_prt_1 FOR VALUES FROM (1) TO (26), + k_1_prt_2 FOR VALUES FROM (26) TO (51), + k_1_prt_3 FOR VALUES FROM (51) TO (76), + k_1_prt_4 FOR VALUES FROM (76) TO (101) + +insert into k select i from generate_series(1, 100) i; +drop table k; +-- ADD and SPLIT must get inherit permissions of the partition they're +-- modifying +create role part_role; +create table a (a int, b int, c int) partition by range(a) subpartition by +range(b) subpartition template (subpartition h start(1) end(10)) +subpartition by range(c) +subpartition template(subpartition i start(1) end(10)) +(partition g start(1) end(2)); +revoke all on a from public; +NOTICE: no privileges could be revoked +grant insert on a to part_role; +-- revoke it from one existing partition, to make sure we don't screw up +-- existing permissions +revoke all on a_1_prt_g_2_prt_h_3_prt_i from part_role; +alter table a add partition b start(40) end(50); +set session authorization part_role; +select has_table_privilege('part_role', 'a'::regclass,'insert'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('part_role', 'a_1_prt_b_2_prt_h'::regclass,'insert'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('part_role', 'a_1_prt_b_2_prt_h_3_prt_i'::regclass,'insert'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('part_role', 'a_1_prt_g_2_prt_h_3_prt_i'::regclass, +'insert'); + has_table_privilege +--------------------- + f +(1 row) + +insert into a values(45, 5, 5); +-- didn't grant select +select has_table_privilege('part_role', 'a'::regclass,'select'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('part_role', 'a_1_prt_b_2_prt_h'::regclass,'select'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('part_role', 'a_1_prt_b_2_prt_h_3_prt_i'::regclass,'select'); + has_table_privilege +--------------------- + f +(1 row) + +\c - +drop table a; +create table a (i date) partition by range(i) +(partition f start(date '2005-01-01') end (date '2009-01-01') + every(interval '2 years')); +revoke all on a from public; +NOTICE: no privileges could be revoked +grant insert on a to part_role; +alter table a split partition for ('2005-01-01') at (date '2006-01-01') + into (partition f, partition g); +alter table a add default partition mydef; +alter table a split default partition start(date '2010-01-01') end(date +'2011-01-01') into(partition mydef, partition other); +set session authorization part_role; +select has_table_privilege('part_role', 'a'::regclass,'insert'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('part_role', 'a_1_prt_f'::regclass,'insert'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('part_role', 'a_1_prt_mydef'::regclass,'insert'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('part_role', 'a_1_prt_other'::regclass,'insert'); + has_table_privilege +--------------------- + t +(1 row) + +insert into a values('2005-05-05'); +insert into a values('2006-05-05'); +insert into a values('2010-10-10'); +\c - +drop table a; +drop role part_role; +-- Check that when we split a default, the INTO clause must named the default +create table k (i date) partition by range(i) (start('2008-01-01') +end('2009-01-01') every(interval '1 month'), default partition default_part); +alter table k split default partition start ('2009-01-01') end ('2009-02-01') +into (partition aa, partition nodate); +ERROR: default partition name missing from INTO clause +alter table k split default partition start ('2009-01-01') end ('2009-02-01') +into (partition aa, partition default_part); +-- check that it works without INTO +alter table k split default partition start ('2009-02-01') end ('2009-03-01'); +drop table k; +-- List too +create table k (i int) partition by list(i) (partition a values(1, 2), +partition b values(3, 4), default partition mydef); +alter table k split partition mydef at (5) into (partition foo, partition bar); +ERROR: default partition name missing from INTO clause +alter table k split partition mydef at (5) into (partition foo, partition mydef); +alter table k split partition mydef at (10); +drop table k; +-- For LIST, make sure that we reject AT() clauses which match all parameters +create table j (i int) partition by list(i) (partition a values(1, 2, 3, 4), + partition b values(5, 6, 7, 8)); +alter table j split partition for(1) at (1,2) into (partition fa, partition fb); +alter table j split partition for(1) at (1,2) +into (partition f1a, partition f1b); -- This has partition rules that overlaps +ERROR: AT clause cannot contain all values in the partition to be split +drop table j; +-- Check that we can split LIST partitions that have a default partition +create table j (i int) partition by list(i) (partition a values(1, 2, 3, 4), +partition b values(5, 6, 7, 8), default partition default_part); +alter table j split partition for(1) at (1,2) into (partition f1a, partition +f1b); +drop table j; +-- Make sure range can too +create table j (i int) partition by range(i) (partition a start(1) end(10), +default partition default_part); +alter table j split partition for(1) at (5) into (partition f1a, partition f1b); +drop table j; +-- MPP-3667 ADD PARTITION overlaps +create table mpp3621 (aa date, bb date) partition by range (bb) +(partition foo start('2008-01-01')); +-- these are ok +alter table mpp3621 add partition a1 start ('2007-01-01') end ('2007-02-01'); +alter table mpp3621 add partition a2 start ('2007-02-01') end ('2007-03-01'); +alter table mpp3621 add partition a3 start ('2007-03-01') end ('2007-04-01'); +alter table mpp3621 add partition a4 start ('2007-09-01') end ('2007-10-01'); +alter table mpp3621 add partition a5 start ('2007-08-01') end ('2007-09-01'); +alter table mpp3621 add partition a6 start ('2007-04-01') end ('2007-05-01'); +alter table mpp3621 add partition a7 start ('2007-05-01') end ('2007-06-01'); + -- was error due to startSearchpoint != endSearchpoint +alter table mpp3621 add partition a8 start ('2007-07-01') end ('2007-08-01'); +-- ok +alter table mpp3621 add partition a9 start ('2007-06-01') end ('2007-07-01'); +drop table mpp3621; +-- Check for MPP-3679 and MPP-3692 +create table list_test (a text, b text) partition by list (a) ( + partition foo values ('foo'), + partition bar values ('bar'), + default partition baz); +insert into list_test values ('foo', 'blah'); +insert into list_test values ('bar', 'blah'); +insert into list_test values ('baz', 'blah'); +alter table list_test split default partition at ('baz') + into (partition bing, default partition); +drop table list_test; +-- MPP-3816: cannot drop column which is the subject of partition config +create table list_test(a int, b int, c int) + partition by list(b) + subpartition by list(c) subpartition template(subpartition c values(2)) + (partition b values(1)); +-- should fail +alter table list_test drop column b; +ERROR: cannot drop column "b" because it is part of the partition key of relation "list_test" +alter table list_test drop column c; +ERROR: cannot drop column "c" because it is part of the partition key of relation "list_test_1_prt_b" +drop table list_test; +-- MPP-3678: allow exchange and split on tables with subpartitioning +CREATE TABLE rank_exc ( +id int, +rank int, +year int, +gender char(1), +count int ) +PARTITION BY LIST (gender) +SUBPARTITION BY RANGE (year) +SUBPARTITION TEMPLATE ( +SUBPARTITION year1 START (2001), +SUBPARTITION year2 START (2002), +SUBPARTITION year3 START (2003), +SUBPARTITION year4 START (2004), +SUBPARTITION year5 START (2005), +SUBPARTITION year6 START (2006) END (2007) ) +(PARTITION girls VALUES ('F'), +PARTITION boys VALUES ('M') +); +alter table rank_exc alter partition girls add default partition gfuture; +alter table rank_exc alter partition boys add default partition bfuture; +insert into rank_exc values(1, 1, 2007, 'M', 1); +insert into rank_exc values(2, 2, 2008, 'M', 3); +select * from rank_exc; + id | rank | year | gender | count +----+------+------+--------+------- + 1 | 1 | 2007 | M | 1 + 2 | 2 | 2008 | M | 3 +(2 rows) + +alter table rank_exc alter partition boys split default partition start ('2007') +end ('2008') into (partition bfuture, partition year7); +select * from rank_exc_1_prt_boys_2_prt_bfuture; + id | rank | year | gender | count +----+------+------+--------+------- + 2 | 2 | 2008 | M | 3 +(1 row) + +select * from rank_exc_1_prt_boys_2_prt_year7; + id | rank | year | gender | count +----+------+------+--------+------- + 1 | 1 | 2007 | M | 1 +(1 row) + +select * from rank_exc; + id | rank | year | gender | count +----+------+------+--------+------- + 1 | 1 | 2007 | M | 1 + 2 | 2 | 2008 | M | 3 +(2 rows) + +--exchange test +create table r (like rank_exc); +insert into rank_exc values(3, 3, 2004, 'F', 100); +insert into r values(3, 3, 2004, 'F', 100000); +alter table rank_exc alter partition girls exchange partition year4 with table r; +select * from rank_exc_1_prt_girls_2_prt_year4; + id | rank | year | gender | count +----+------+------+--------+-------- + 3 | 3 | 2004 | F | 100000 +(1 row) + +select * from r; + id | rank | year | gender | count +----+------+------+--------+------- + 3 | 3 | 2004 | F | 100 +(1 row) + +alter table rank_exc alter partition girls exchange partition year4 with table r; +select * from rank_exc_1_prt_girls_2_prt_year4; + id | rank | year | gender | count +----+------+------+--------+------- + 3 | 3 | 2004 | F | 100 +(1 row) + +select * from r; + id | rank | year | gender | count +----+------+------+--------+-------- + 3 | 3 | 2004 | F | 100000 +(1 row) + +-- Split test +alter table rank_exc alter partition girls split default partition start('2008') + end('2020') into (partition years, partition gfuture); +insert into rank_exc values(4, 4, 2009, 'F', 100); +drop table rank_exc; +drop table r; +-- MPP-4245: remove virtual subpartition templates when we drop the partitioned +-- table +create table bar_p (i int, j int) partition by range(i) subpartition by range(j) +subpartition template(start(1) end(10) every(1)) subpartition by range(i) +subpartition template(start(1) end(10) every(5)) (start(1) end(10)); +alter table bar_p alter partition for ('5') alter partition for ('5') + drop partition for ('5'); +insert into bar_p values(1, 1); +insert into bar_p values(5, 5); +ERROR: no partition of relation "bar_p_1_prt_1_2_prt_5" found for row +DETAIL: Partition key of the failing row contains (i) = (5). +drop table bar_p; +-- Drop should not leave anything lingering for bar_p or its +-- subpartitions in pg_partition* catalog tables. +select relid, level, template from gp_partition_template where not exists (select oid from pg_class where oid = relid); + relid | level | template +-------+-------+---------- +(0 rows) + +-- MPP-4172 +-- should fail +create table ggg (a char(1), b int) +partition by range(a) +( +partition aa start ('2006') end ('2009'), partition bb start ('2007') end ('2008') +); +ERROR: value too long for type character(1) +-- MPP-4892 SET SUBPARTITION TEMPLATE +create table mpp4892 (a char, b int, d char) +partition by range (b) +subpartition by list (d) +subpartition template ( + subpartition sp1 values ('a'), + subpartition sp2 values ('b')) +( +start (1) end (10) every (1) +); +-- works +alter table mpp4892 add partition p1 end (11); +-- complain about existing template +alter table mpp4892 add partition p3 end (13) (subpartition sp3 values ('c')); +ERROR: subpartition configuration conflicts with subpartition template +LINE 1: alter table mpp4892 add partition p3 end (13) (subpartition ... + ^ +-- remove template +alter table mpp4892 set subpartition template (); +-- should work (because the template is gone) +alter table mpp4892 add partition p3 end (13) (subpartition sp3 values ('c')); +-- complain because the template is already gone +alter table mpp4892 set subpartition template (); +ERROR: relation "mpp4892" does not have a level 1 subpartition template specification +-- should work +alter table mpp4892 set subpartition template (subpartition sp3 values ('c')); +-- should work +alter table mpp4892 add partition p4 end (15); +drop table mpp4892; +-- make sure we do not allow overlapping range intervals +-- should fail +-- unordered elems +create table ttt (t int) partition by range(t) ( +partition a start (1) end(10) inclusive, +partition c start(11) end(14), +partition b start(5) end(15) +); +ERROR: partition "ttt_1_prt_b" would overlap partition "ttt_1_prt_a" +-- should fail, this time it's ordered +create table ttt (t int) partition by range(t) ( +partition a start (1) end(10) inclusive, +partition b start(5) end(15), +partition c start(11) end(14) +); +ERROR: partition "ttt_1_prt_b" would overlap partition "ttt_1_prt_a" +-- should fail +create table ttt (t date) partition by range(t) ( +partition a start ('2005-01-01') end('2006-01-01') inclusive, +partition b start('2005-05-01') end('2005-06-11'), +partition c start('2006-01-01') exclusive end('2006-01-10') +); +ERROR: partition "ttt_1_prt_b" would overlap partition "ttt_1_prt_a" +-- should fail +create table ttt (t char) partition by range(t) ( +partition a start('a') end('f'), +partition b start('e') end('g') +); +ERROR: partition "ttt_1_prt_b" would overlap partition "ttt_1_prt_a" +-- MPP-5159 MPP-26829 +-- Should fail -- missing partition spec and subpartition template follows the +-- partition declaration. +CREATE TABLE list_sales (trans_id int, date date, amount +decimal(9,2), region text) +PARTITION BY LIST (region) +SUBPARTITION TEMPLATE +( SUBPARTITION usa VALUES ('usa'), + SUBPARTITION asia VALUES ('asia'), + SUBPARTITION europe VALUES ('europe') +); +ERROR: syntax error at or near "TEMPLATE" +LINE 4: SUBPARTITION TEMPLATE + ^ +-- MPP-5185 MPP-26829 +-- Should work +CREATE TABLE rank_settemp (id int, rank int, year date, gender +char(1)) +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01'), +start (date '2002-01-01'), +start (date '2003-01-01'), +start (date '2004-01-01'), +start (date '2005-01-01') +) +( +partition boys values ('M'), +partition girls values ('F') +); +alter table rank_settemp set subpartition template (); +-- nothing there +select relid::regclass, level from gp_partition_template where relid = 'rank_settemp'::regclass; + relid | level +-------+------- +(0 rows) + +alter table rank_settemp set subpartition template (default subpartition def2); +-- def2 is there +select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; + relid | level | template +--------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} +(1 row) + +alter table rank_settemp set subpartition template (default subpartition def2); +-- Should still be there +select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; + relid | level | template +--------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} +(1 row) + +alter table rank_settemp set subpartition template (start (date '2006-01-01') with (appendonly=true)); +alter table rank_settemp add partition f1 values ('N'); +alter table rank_settemp set subpartition template (start (date '2007-01-01') with (appendonly=true, compresslevel=5)); +alter table rank_settemp add partition f2 values ('C'); +select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; + relid | level | template +--------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1} :partEnd <> :partEvery <>} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} +(1 row) + +drop table rank_settemp; +-- MPP-5397 and MPP-7002 +-- should be able to add/split/exchange partition after dropped a col +create table mpp_5397 (a int, b int, c int, d int) + + partition by range (b) + (partition a1 start (0) end (5), + partition a2 end (10), + partition a3 end(15)); +alter table mpp_5397 drop column c; +-- should work now +alter table mpp_5397 add partition z end (20); +-- ensure splitting default partition also works +alter table mpp_5397 add default partition adefault; +alter table mpp_5397 drop column d; +alter table mpp_5397 split default partition start (21) inclusive end (25) inclusive; +drop table mpp_5397; +-- MPP-4987 -- make sure we can't damage a partitioning configuration +-- this works +create table rank_damage (i int, j int) +partition by range(j) (start(1) end(5) every(1)); +-- should all fail +alter table rank_damage_1_prt_1 no inherit rank_damage; +ERROR: cannot change inheritance of a partition +create table rank2_damage(like rank_damage); +alter table rank_damage_1_prt_1 inherit rank2_damage; +ERROR: cannot change inheritance of a partition +alter table rank_damage_1_prt_1 alter column i type bigint; +ERROR: cannot alter inherited column "i" +alter table rank_damage_1_prt_1 set without oids; -- no-op +alter table rank_damage add partition ppo end (22) with (oids = true); +ERROR: tables declared WITH OIDS are not supported +drop table rank_damage, rank2_damage; +-- MPP-5831, type cast in SPLIT +CREATE TABLE sg_cal_event_silvertail_hour ( +caldt date NOT NULL, +calhr smallint NOT NULL, +ip character varying(128), +transactionid character varying(32), +transactiontime timestamp(2) without time zone +) +WITH (appendonly=true, compresslevel=5) + PARTITION BY RANGE(transactiontime) +( +PARTITION "P2009041607" +START ('2009-04-16 07:00:00'::timestamp without time zone) +END ('2009-04-16 08:00:00'::timestamp without time zone), +PARTITION "P2009041608" +START ('2009-04-16 08:00:00'::timestamp without time zone) +END ('2009-04-16 09:00:00'::timestamp without time zone), +DEFAULT PARTITION st_default +); +ALTER TABLE SG_CAL_EVENT_SILVERTAIL_HOUR SPLIT DEFAULT PARTITION +START ('2009-04-29 07:00:00'::timestamp) INCLUSIVE END ('2009-04-29 +08:00:00'::timestamp) EXCLUSIVE INTO ( PARTITION P2009042907 , +PARTITION st_default ); +\d+ sg_cal_event_silvertail_hour + Partitioned table "public.sg_cal_event_silvertail_hour" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +-----------------+--------------------------------+-----------+----------+---------+----------+--------------+------------- + caldt | date | | not null | | plain | | + calhr | smallint | | not null | | plain | | + ip | character varying(128) | | | | extended | | + transactionid | character varying(32) | | | | extended | | + transactiontime | timestamp(2) without time zone | | | | plain | | +Partition key: RANGE (transactiontime) +Partitions: "sg_cal_event_silvertail_hour_1_prt_P2009041607" FOR VALUES FROM ('Thu Apr 16 07:00:00 2009') TO ('Thu Apr 16 08:00:00 2009'), + "sg_cal_event_silvertail_hour_1_prt_P2009041608" FOR VALUES FROM ('Thu Apr 16 08:00:00 2009') TO ('Thu Apr 16 09:00:00 2009'), + sg_cal_event_silvertail_hour_1_prt_p2009042907 FOR VALUES FROM ('Wed Apr 29 07:00:00 2009') TO ('Wed Apr 29 08:00:00 2009'), + sg_cal_event_silvertail_hour_1_prt_st_default DEFAULT + +\d+ sg_cal_event_silvertail_hour_1_prt_P2009042907 + Table "public.sg_cal_event_silvertail_hour_1_prt_p2009042907" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +-----------------+--------------------------------+-----------+----------+---------+----------+--------------+------------- + caldt | date | | not null | | plain | | + calhr | smallint | | not null | | plain | | + ip | character varying(128) | | | | extended | | + transactionid | character varying(32) | | | | extended | | + transactiontime | timestamp(2) without time zone | | | | plain | | +Partition of: sg_cal_event_silvertail_hour FOR VALUES FROM ('Wed Apr 29 07:00:00 2009') TO ('Wed Apr 29 08:00:00 2009') +Partition constraint: ((transactiontime IS NOT NULL) AND (transactiontime >= 'Wed Apr 29 07:00:00 2009'::timestamp(2) without time zone) AND (transactiontime < 'Wed Apr 29 08:00:00 2009'::timestamp(2) without time zone)) +Compression Type: zlib +Compression Level: 5 +Block Size: 32768 +Checksum: t +Options: compresslevel=5 + +drop table sg_cal_event_silvertail_hour; +-- Make sure we inherit master's storage settings +create table foo_p (i int, j int, k text) +with (appendonly = true, compresslevel = 5) +partition by range(j) (start(1) end(10) every(1), default partition def); +insert into foo_p select i, i+1, repeat('fooo', 9000) from generate_series(1, 100) i; +alter table foo_p split default partition start (10) end(20) +into (partition p10_20, default partition); +select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = relam where c.oid = 'foo_p_1_prt_p10_20'::regclass; + oid | relkind | amname | reloptions +--------------------+---------+--------+------------------- + foo_p_1_prt_p10_20 | r | ao_row | {compresslevel=5} +(1 row) + +select count(distinct k) from foo_p; + count +------- + 1 +(1 row) + +drop table foo_p; +create table foo_p (i int, j int, k text) +partition by range(j) (start(1) end(10) every(1), default partition def +with(appendonly = true)); +insert into foo_p select i, i+1, repeat('fooo', 9000) from generate_series(1, 100) i; +alter table foo_p split default partition start (10) end(20) +into (partition p10_20, default partition); +select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = relam where c.oid in ('foo_p_1_prt_p10_20'::regclass, 'foo_p_1_prt_def'::regclass); + oid | relkind | amname | reloptions +--------------------+---------+--------+------------ + foo_p_1_prt_p10_20 | r | ao_row | + foo_p_1_prt_def | r | ao_row | +(2 rows) + +select count(distinct k) from foo_p; + count +------- + 1 +(1 row) + +drop table foo_p; +-- MPP-5941: work with many levels of templates +CREATE TABLE mpp5941 (a int, b date, c char, + d char(4), e varchar(20), f timestamp) +partition by range (b) +subpartition by list (a) +subpartition template ( +subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ) +subpartition by list (e) +subpartition template ( +subpartition ll1 values ('Engineering'), +subpartition ll2 values ('QA') ) +subpartition by list (c) +subpartition template ( +subpartition lll1 values ('M'), +subpartition lll2 values ('F') ) +( + start (date '2007-01-01') + end (date '2010-01-01') every (interval '1 year') +); +-- just truncate for fun to see that everything is there +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) alter partition for ('QA') +truncate partition for ('M'); +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) truncate partition for ('QA'); +alter table mpp5941 alter partition for ('2008-01-01') +truncate partition for (1); +alter table mpp5941 truncate partition for ('2008-01-01'); +truncate table mpp5941; +-- now look at the templates that we have +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +---------+------- + mpp5941 | 1 + mpp5941 | 2 + mpp5941 | 3 +(3 rows) + +-- clear level 1 +alter table mpp5941 set subpartition template (); +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +---------+------- + mpp5941 | 2 + mpp5941 | 3 +(2 rows) + +-- clear level 2 +alter table mpp5941 alter partition for ('2008-01-01') +set subpartition template (); +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +---------+------- + mpp5941 | 3 +(1 row) + +-- clear level 3 +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) +set subpartition template (); +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +-------+------- +(0 rows) + +-- no level 4 (error) +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) alter partition for ('QA') +set subpartition template (); +ERROR: relation "mpp5941" does not have a level 4 subpartition template specification +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +-------+------- +(0 rows) + +-- no level 5 (error) +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) alter partition for ('QA') +alter partition for ('M') +set subpartition template (); +ERROR: table "mpp5941_1_prt_2_2_prt_l1_3_prt_ll2_4_prt_lll1" is not partitioned +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +-------+------- +(0 rows) + +-- set level 1 (error, because no templates for level 2, 3) +alter table mpp5941 set subpartition template ( +subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ); +ERROR: can't add sub-partition template at level 1 since next level template doesn't exist +HINT: Add sub-partition template for next level. +-- MPP-5992 - add deep templates correctly +-- Note: need to re-add the templates from deepest to shallowest, +-- because adding a template has a dependency on the existence of the +-- deeper template. +-- set level 3 +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) +set subpartition template ( +subpartition lll1 values ('M'), +subpartition lll2 values ('F') ); +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +---------+------- + mpp5941 | 3 +(1 row) + +-- set level 2 +alter table mpp5941 alter partition for ('2008-01-01') +set subpartition template ( +subpartition ll1 values ('Engineering'), +subpartition ll2 values ('QA') ); +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +---------+------- + mpp5941 | 3 + mpp5941 | 2 +(2 rows) + +-- set level 1 +alter table mpp5941 set subpartition template ( +subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ); +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + relid | level +---------+------- + mpp5941 | 3 + mpp5941 | 2 + mpp5941 | 1 +(3 rows) + +drop table mpp5941; +-- MPP-5984 - NULL is not allowed in RANGE partition +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition nnull start (NULL) end (300) +); +ERROR: cannot use NULL with range partition specification +LINE 6: partition nnull start (NULL) end (300) + ^ +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition nnull start (300) end (NULL) +); +ERROR: cannot use NULL with range partition specification +LINE 6: partition nnull start (300) end (NULL) + ^ +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition nnull start (300) end (NULL::int) +); +ERROR: cannot use NULL with range partition specification +LINE 6: partition nnull start (300) end (NULL::int) + ^ +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition p1 start(1) end(10), +partition p2 start(10) end(20), +default partition def +); +alter table partsupp split partition p2 at (NULL); +ERROR: cannot use NULL with range partition specification +LINE 1: alter table partsupp split partition p2 at (NULL); + ^ +alter table partsupp split default partition start(null) end(200); +ERROR: cannot use NULL with range partition specification +LINE 1: ...table partsupp split default partition start(null) end(200); + ^ +drop table partsupp; +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition nnull start (300) end (400) +); +alter table partsupp add partition foo start(500) end(NULL); +ERROR: cannot use NULL with range partition specification +LINE 1: alter table partsupp add partition foo start(500) end(NULL); + ^ +drop table partsupp; +-- Test for an old bug, where we used to crash on NULLs, because the code +-- to order the partitions by their start/end boundaries did not anticipate +-- NULLs. NULLs in boundaries are not accepted, but because we check for +-- them only after ordering the partitions, the sorting code needs to +-- handle them. (This test needs at least two partitions, so that there +-- is something to sort.) +create table partnulltest ( + col1 int, + col2 numeric +) +partition by range(col2) +( + partition part2 start(1) end(10) , + partition part1 start (NULL) +); +ERROR: cannot use NULL with range partition specification +LINE 8: partition part1 start (NULL) + ^ +-- Test pg_dump on a somewhat complicated partitioned table. (MPP-6240) +-- We actually just create the table here, and leave it behind, so that +-- it gets dumped by pg_dump at end of the regression test suite. +CREATE TABLE supplier_hybrid_part( + S_SUPPKEY INTEGER, + S_NAME CHAR(25), + S_ADDRESS VARCHAR(40), + S_NATIONKEY INTEGER, S_PHONE CHAR(15), + S_ACCTBAL decimal, + S_COMMENT VARCHAR(101) + ) +partition by range (s_suppkey) +subpartition by list (s_nationkey) subpartition template ( + values('22','21','17'), + values('6','11','1','7','16','2') WITH (checksum=false,appendonly=true,blocksize=1171456, compresslevel=3), + values('18','20'), + values('9','23','13') WITH (checksum=true,appendonly=true,blocksize=1335296,compresslevel=7), + values('0','3','12','15','14','8','4','24','19','10','5') +) +( +partition p1 start('1') end('10001') every(10000) +); +-- MPP-3544 +-- Domain +create domain domainvarchar varchar(5); +create domain domainnumeric numeric(8,2); +create domain domainint4 int4; +create domain domaintext text; +-- Test tables using domains +-- list +create table basictest1 + ( testint4 domainint4 + , testtext domaintext + , testvarchar domainvarchar + , testnumeric domainnumeric + ) +partition by LIST(testvarchar) +( +partition aa values ('aaaaa'), +partition bb values ('bbbbb'), +partition cc values ('ccccc') +); +alter table basictest1 add partition dd values('ddddd'); +insert into basictest1 values(1, 1, 'ddddd', 1); +insert into basictest1 values(1, 1, 'ccccc', 1); +insert into basictest1 values(1, 1, 'bbbbb', 1); +insert into basictest1 values(1, 1, 'aaaaa', 1); +drop table basictest1; +--range +create table basictest1 (testnumeric domainint4) +partition by range(testnumeric) + (start(1) end(10) every(5)); +insert into basictest1 values(1); +insert into basictest1 values(2); +alter table basictest1 add partition ff start(10) end(20); +insert into basictest1 values(10); +drop table basictest1; +drop domain domainvarchar, domainnumeric, domainint4, domaintext; +-- Test index inheritance with partitions +create table ti (i int not null, j int) +partition by range (j) +(start(1) end(3) every(1)); +create unique index ti_pkey on ti(i,j); +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; + schemaname | tablename | indexname | tablespace | indexdef +------------+------------+--------------------+------------+-------------------------------------------------------------------------------- + public | ti_1_prt_1 | ti_1_prt_1_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_1_i_j_idx ON public.ti_1_prt_1 USING btree (i, j) + public | ti | ti_pkey | | CREATE UNIQUE INDEX ti_pkey ON ONLY public.ti USING btree (i, j) + public | ti_1_prt_2 | ti_1_prt_2_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_2_i_j_idx ON public.ti_1_prt_2 USING btree (i, j) +(3 rows) + +create index ti_j_idx on ti using bitmap(j); +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; + schemaname | tablename | indexname | tablespace | indexdef +------------+------------+--------------------+------------+-------------------------------------------------------------------------------- + public | ti_1_prt_1 | ti_1_prt_1_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_1_i_j_idx ON public.ti_1_prt_1 USING btree (i, j) + public | ti | ti_pkey | | CREATE UNIQUE INDEX ti_pkey ON ONLY public.ti USING btree (i, j) + public | ti_1_prt_2 | ti_1_prt_2_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_2_i_j_idx ON public.ti_1_prt_2 USING btree (i, j) + public | ti_1_prt_1 | ti_1_prt_1_j_idx | | CREATE INDEX ti_1_prt_1_j_idx ON public.ti_1_prt_1 USING bitmap (j) + public | ti | ti_j_idx | | CREATE INDEX ti_j_idx ON ONLY public.ti USING bitmap (j) + public | ti_1_prt_2 | ti_1_prt_2_j_idx | | CREATE INDEX ti_1_prt_2_j_idx ON public.ti_1_prt_2 USING bitmap (j) +(6 rows) + +alter table ti add partition p3 start(3) end(10); +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; + schemaname | tablename | indexname | tablespace | indexdef +------------+-------------+---------------------+------------+---------------------------------------------------------------------------------- + public | ti_1_prt_p3 | ti_1_prt_p3_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_p3_i_j_idx ON public.ti_1_prt_p3 USING btree (i, j) + public | ti_1_prt_p3 | ti_1_prt_p3_j_idx | | CREATE INDEX ti_1_prt_p3_j_idx ON public.ti_1_prt_p3 USING bitmap (j) + public | ti_1_prt_1 | ti_1_prt_1_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_1_i_j_idx ON public.ti_1_prt_1 USING btree (i, j) + public | ti | ti_pkey | | CREATE UNIQUE INDEX ti_pkey ON ONLY public.ti USING btree (i, j) + public | ti_1_prt_2 | ti_1_prt_2_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_2_i_j_idx ON public.ti_1_prt_2 USING btree (i, j) + public | ti_1_prt_1 | ti_1_prt_1_j_idx | | CREATE INDEX ti_1_prt_1_j_idx ON public.ti_1_prt_1 USING bitmap (j) + public | ti | ti_j_idx | | CREATE INDEX ti_j_idx ON ONLY public.ti USING bitmap (j) + public | ti_1_prt_2 | ti_1_prt_2_j_idx | | CREATE INDEX ti_1_prt_2_j_idx ON public.ti_1_prt_2 USING bitmap (j) +(8 rows) + +-- Should not be able to drop child indexes added implicitly via ADD PARTITION +drop index ti_1_prt_p3_i_j_idx; +ERROR: cannot drop index ti_1_prt_p3_i_j_idx because index ti_pkey requires it +HINT: You can drop index ti_pkey instead. +drop index ti_1_prt_p3_j_idx; +ERROR: cannot drop index ti_1_prt_p3_j_idx because index ti_j_idx requires it +HINT: You can drop index ti_j_idx instead. +alter table ti split partition p3 at (7) into (partition pnew1, partition pnew2); +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; + schemaname | tablename | indexname | tablespace | indexdef +------------+----------------+------------------------+------------+---------------------------------------------------------------------------------------- + public | ti_1_prt_pnew1 | ti_1_prt_pnew1_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_pnew1_i_j_idx ON public.ti_1_prt_pnew1 USING btree (i, j) + public | ti_1_prt_pnew1 | ti_1_prt_pnew1_j_idx | | CREATE INDEX ti_1_prt_pnew1_j_idx ON public.ti_1_prt_pnew1 USING bitmap (j) + public | ti_1_prt_pnew2 | ti_1_prt_pnew2_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_pnew2_i_j_idx ON public.ti_1_prt_pnew2 USING btree (i, j) + public | ti_1_prt_pnew2 | ti_1_prt_pnew2_j_idx | | CREATE INDEX ti_1_prt_pnew2_j_idx ON public.ti_1_prt_pnew2 USING bitmap (j) + public | ti_1_prt_1 | ti_1_prt_1_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_1_i_j_idx ON public.ti_1_prt_1 USING btree (i, j) + public | ti | ti_pkey | | CREATE UNIQUE INDEX ti_pkey ON ONLY public.ti USING btree (i, j) + public | ti_1_prt_2 | ti_1_prt_2_i_j_idx | | CREATE UNIQUE INDEX ti_1_prt_2_i_j_idx ON public.ti_1_prt_2 USING btree (i, j) + public | ti_1_prt_1 | ti_1_prt_1_j_idx | | CREATE INDEX ti_1_prt_1_j_idx ON public.ti_1_prt_1 USING bitmap (j) + public | ti | ti_j_idx | | CREATE INDEX ti_j_idx ON ONLY public.ti USING bitmap (j) + public | ti_1_prt_2 | ti_1_prt_2_j_idx | | CREATE INDEX ti_1_prt_2_j_idx ON public.ti_1_prt_2 USING bitmap (j) +(10 rows) + +-- Should not be able to drop child indexes added implicitly via SPLIT PARTITION +drop index ti_1_prt_pnew1_i_j_idx; +ERROR: cannot drop index ti_1_prt_pnew1_i_j_idx because index ti_pkey requires it +HINT: You can drop index ti_pkey instead. +drop index ti_1_prt_pnew1_j_idx; +ERROR: cannot drop index ti_1_prt_pnew1_j_idx because index ti_j_idx requires it +HINT: You can drop index ti_j_idx instead. +drop index ti_1_prt_pnew2_i_j_idx; +ERROR: cannot drop index ti_1_prt_pnew2_i_j_idx because index ti_pkey requires it +HINT: You can drop index ti_pkey instead. +drop index ti_1_prt_pnew2_j_idx; +ERROR: cannot drop index ti_1_prt_pnew2_j_idx because index ti_j_idx requires it +HINT: You can drop index ti_j_idx instead. +-- Index drop should cascade to all partitions- including those later added via +-- ADD PARTITION or SPLIT PARTITION +drop index ti_pkey; +drop index ti_j_idx; +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; + schemaname | tablename | indexname | tablespace | indexdef +------------+-----------+-----------+------------+---------- +(0 rows) + +drop table ti; +-- Partitioned table with btree index and hash aggregate should use a correct +-- memory context for its tuples` descriptor +drop table if exists dis_tupdesc; +NOTICE: table "dis_tupdesc" does not exist, skipping +create table dis_tupdesc (a int, b int, c int) +partition by list (b) +( + partition p1 values (1), + partition p2 values (2), + default partition junk_data +); +create index dis_tupdesc_idx on dis_tupdesc using btree (c); +insert into dis_tupdesc select i, i % 3, i % 4 from generate_series (1, 240) as i; +analyze dis_tupdesc; +set gp_segments_for_planner = 2; +set optimizer_segments = 2; +select distinct b from dis_tupdesc where c >= 2; + b +--- + 0 + 1 + 2 +(3 rows) + +reset gp_segments_for_planner; +reset optimizer_segments; +-- MPP-6611, make sure rename works with default partitions +create table it (i int, j int) partition by range(i) +subpartition by range(j) subpartition template(start(1) end(10) every(5)) +(start(1) end(3) every(1)); +alter table it rename to newit; +select schemaname, tablename from pg_tables where schemaname = 'public' and tablename like 'newit%'; + schemaname | tablename +------------+----------------------- + public | newit + public | newit_1_prt_1 + public | newit_1_prt_1_2_prt_1 + public | newit_1_prt_1_2_prt_2 + public | newit_1_prt_2 + public | newit_1_prt_2_2_prt_1 + public | newit_1_prt_2_2_prt_2 +(7 rows) + +alter table newit add default partition def; +select schemaname, tablename from pg_tables where schemaname = 'public' and tablename like 'newit%'; + schemaname | tablename +------------+------------------------- + public | newit + public | newit_1_prt_1 + public | newit_1_prt_1_2_prt_1 + public | newit_1_prt_1_2_prt_2 + public | newit_1_prt_2 + public | newit_1_prt_2_2_prt_1 + public | newit_1_prt_2_2_prt_2 + public | newit_1_prt_def + public | newit_1_prt_def_2_prt_1 + public | newit_1_prt_def_2_prt_2 +(10 rows) + +alter table newit rename to anotherit; +select schemaname, tablename from pg_tables where schemaname = 'public' and tablename like +'anotherit%'; + schemaname | tablename +------------+----------------------------- + public | anotherit + public | anotherit_1_prt_1 + public | anotherit_1_prt_1_2_prt_1 + public | anotherit_1_prt_1_2_prt_2 + public | anotherit_1_prt_2 + public | anotherit_1_prt_2_2_prt_1 + public | anotherit_1_prt_2_2_prt_2 + public | anotherit_1_prt_def + public | anotherit_1_prt_def_2_prt_1 + public | anotherit_1_prt_def_2_prt_2 +(10 rows) + +drop table anotherit; +-- +-- Test table constraint inheritance +-- +-- with a named UNIQUE constraint +create table it (i int) partition by range(i) (start(1) end(3) every(1)); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; + schemaname | tablename | indexname +------------+-----------+----------- +(0 rows) + +alter table it add constraint it_unique_i unique (i); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; + schemaname | tablename | indexname +------------+------------+------------------ + public | it_1_prt_1 | it_1_prt_1_i_key + public | it | it_unique_i + public | it_1_prt_2 | it_1_prt_2_i_key +(3 rows) + +alter table it drop constraint it_unique_i; +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; + schemaname | tablename | indexname +------------+-----------+----------- +(0 rows) + +drop table it; +-- with a PRIMARY KEY constraint, without giving it a name explicitly. +create table it (i int) partition by range(i) (start(1) end(3) every(1)); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; + schemaname | tablename | indexname +------------+-----------+----------- +(0 rows) + +alter table it add primary key(i); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; + schemaname | tablename | indexname +------------+------------+----------------- + public | it_1_prt_1 | it_1_prt_1_pkey + public | it | it_pkey + public | it_1_prt_2 | it_1_prt_2_pkey +(3 rows) + +-- FIXME: dropping a primary key doesn't currently work correctly. It doesn't +-- drop the key on the partitions, only the parent. See +-- https://github.com/greenplum-db/gpdb/issues/3750 +-- +-- alter table it add primary key(i); +-- select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +drop table it; +create table it (i int) partition by range(i) (start(1) end(3) every(1)); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; + schemaname | tablename | indexname +------------+-----------+----------- +(0 rows) + +alter table it add primary key(i); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; + schemaname | tablename | indexname +------------+------------+----------------- + public | it_1_prt_1 | it_1_prt_1_pkey + public | it | it_pkey + public | it_1_prt_2 | it_1_prt_2_pkey +(3 rows) + +drop table it; +-- +-- Exclusion constraints are currently not supported on partitioned tables. +-- +create table parttab_with_excl_constraint ( + i int, + j int, + CONSTRAINT part_excl EXCLUDE (i WITH =) ) + partition by list (i) ( + partition a values (1), + partition b values (2), + partition c values (3) +); +ERROR: exclusion constraints are not supported on partitioned tables +LINE 4: CONSTRAINT part_excl EXCLUDE (i WITH =) ) + ^ +create table parttab_with_excl_constraint ( + i int, + j int) + partition by list (i) ( + partition a values (1), + partition b values (2), + partition c values (3) +); +alter table parttab_with_excl_constraint ADD CONSTRAINT part_excl EXCLUDE (i WITH =); +ERROR: exclusion constraints are not supported on partitioned tables +LINE 1: alter table parttab_with_excl_constraint ADD CONSTRAINT part... + ^ +drop table parttab_with_excl_constraint; +-- MPP-6297: test special WITH(tablename=...) syntax for dump/restore +-- original table was: +-- PARTITION BY RANGE(l_commitdate) +-- ( +-- PARTITION p1 +-- START ('1992-01-31'::date) END ('1995-04-30'::date) +-- EVERY ('1 year 1 mon'::interval) +-- ) +-- dump used to give a definition like this: +-- without the WITH(tablename=...), the vagaries of EVERY arithmetic +-- create >3 partitions +CREATE TABLE mpp6297 ( l_orderkey bigint, +l_commitdate date +) + PARTITION BY RANGE(l_commitdate) +( +PARTITION p1_1 START ('1992-01-31'::date) END ('1993-02-28'::date) +EVERY ('1 year 1 mon'::interval) +, +PARTITION p1_2 START ('1993-02-28'::date) END ('1994-03-31'::date) +EVERY ('1 year 1 mon'::interval) +, +PARTITION p1_3 START ('1994-03-31'::date) END ('1995-04-30'::date) +EVERY ('1 year 1 mon'::interval) +); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------------+--------+-----------+----------+---------+---------+--------------+------------- + l_orderkey | bigint | | | | plain | | + l_commitdate | date | | | | plain | | +Partition key: RANGE (l_commitdate) +Partitions: mpp6297_1_prt_p1_1_1 FOR VALUES FROM ('01-31-1992') TO ('02-28-1993'), + mpp6297_1_prt_p1_2_1 FOR VALUES FROM ('02-28-1993') TO ('03-28-1994'), + mpp6297_1_prt_p1_2_2 FOR VALUES FROM ('03-28-1994') TO ('03-31-1994'), + mpp6297_1_prt_p1_3_1 FOR VALUES FROM ('03-31-1994') TO ('04-30-1995') + +drop table mpp6297; +-- when WITH(tablename=...) is specified, the EVERY is stored as an +-- attribute, but not expanded into additional partitions +CREATE TABLE mpp6297 ( l_orderkey bigint, +l_commitdate date +) + PARTITION BY RANGE(l_commitdate) +( +PARTITION p1_1 START ('1992-01-31'::date) END ('1993-02-28'::date) +EVERY ('1 year 1 mon'::interval) +WITH (tablename='mpp6297_1_prt_p1_1'), +PARTITION p1_2 START ('1993-02-28'::date) END ('1994-03-31'::date) +EVERY ('1 year 1 mon'::interval) +WITH (tablename='mpp6297_1_prt_p1_2'), +PARTITION p1_3 START ('1994-03-31'::date) END ('1995-04-30'::date) +EVERY ('1 year 1 mon'::interval) +WITH (tablename='mpp6297_1_prt_p1_3') +); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------------+--------+-----------+----------+---------+---------+--------------+------------- + l_orderkey | bigint | | | | plain | | + l_commitdate | date | | | | plain | | +Partition key: RANGE (l_commitdate) +Partitions: mpp6297_1_prt_p1_1 FOR VALUES FROM ('01-31-1992') TO ('02-28-1993'), + mpp6297_1_prt_p1_2 FOR VALUES FROM ('02-28-1993') TO ('03-31-1994'), + mpp6297_1_prt_p1_3 FOR VALUES FROM ('03-31-1994') TO ('04-30-1995') + +drop table mpp6297; +-- more with basic cases +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) end (10) every (1), +end (11) +); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (1) TO (2), + mpp6297_1_prt_10 FOR VALUES FROM (10) TO (11), + mpp6297_1_prt_2 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_3 FOR VALUES FROM (3) TO (4), + mpp6297_1_prt_4 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_5 FOR VALUES FROM (5) TO (6), + mpp6297_1_prt_6 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_7 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_8 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_9 FOR VALUES FROM (9) TO (10) + +alter table mpp6297 drop partition for (3); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (1) TO (2), + mpp6297_1_prt_10 FOR VALUES FROM (10) TO (11), + mpp6297_1_prt_2 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_4 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_5 FOR VALUES FROM (5) TO (6), + mpp6297_1_prt_6 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_7 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_8 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_9 FOR VALUES FROM (9) TO (10) + +-- this isn't legal (but it would be nice) +alter table mpp6297 add partition start (3) end (4) every (1); +ERROR: syntax error at or near "every" +LINE 1: ...ter table mpp6297 add partition start (3) end (4) every (1); + ^ +-- this is legal but it doesn't fix the EVERY clause +alter table mpp6297 add partition start (3) end (4); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (1) TO (2), + mpp6297_1_prt_10 FOR VALUES FROM (10) TO (11), + mpp6297_1_prt_11 FOR VALUES FROM (3) TO (4), + mpp6297_1_prt_2 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_4 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_5 FOR VALUES FROM (5) TO (6), + mpp6297_1_prt_6 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_7 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_8 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_9 FOR VALUES FROM (9) TO (10) + +drop table mpp6297; +-- similarly, we can merge adjacent EVERY clauses if they match +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) end (5) every (1), +start (5) end (10) every (1) +); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (1) TO (2), + mpp6297_1_prt_2 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_3 FOR VALUES FROM (3) TO (4), + mpp6297_1_prt_4 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_5 FOR VALUES FROM (5) TO (6), + mpp6297_1_prt_6 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_7 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_8 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_9 FOR VALUES FROM (9) TO (10) + +drop table mpp6297; +-- we cannot merge adjacent EVERY clauses if inclusivity/exclusivity is wrong +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) end (5) every (1), +start (5) exclusive end (10) every (1) +); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (1) TO (2), + mpp6297_1_prt_2 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_3 FOR VALUES FROM (3) TO (4), + mpp6297_1_prt_4 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_5 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_6 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_7 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_8 FOR VALUES FROM (9) TO (10) + +drop table mpp6297; +-- more fun with inclusivity/exclusivity (normal case) +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) inclusive end (10) exclusive every (1) +); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (1) TO (2), + mpp6297_1_prt_2 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_3 FOR VALUES FROM (3) TO (4), + mpp6297_1_prt_4 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_5 FOR VALUES FROM (5) TO (6), + mpp6297_1_prt_6 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_7 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_8 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_9 FOR VALUES FROM (9) TO (10) + +drop table mpp6297; +-- more fun with inclusivity/exclusivity (abnormal case) +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) exclusive end (10) inclusive every (1) +); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_2 FOR VALUES FROM (3) TO (4), + mpp6297_1_prt_3 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_4 FOR VALUES FROM (5) TO (6), + mpp6297_1_prt_5 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_6 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_7 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_8 FOR VALUES FROM (9) TO (10), + mpp6297_1_prt_9 FOR VALUES FROM (10) TO (11) + +alter table mpp6297 drop partition for (3); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_3 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_4 FOR VALUES FROM (5) TO (6), + mpp6297_1_prt_5 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_6 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_7 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_8 FOR VALUES FROM (9) TO (10), + mpp6297_1_prt_9 FOR VALUES FROM (10) TO (11) + +drop table mpp6297; +-- we cannot merge adjacent EVERY clauses, even though the +-- inclusivity/exclusivity matches, because it is different from the +-- normal start inclusive/end exclusive +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) end (5) inclusive every (1), +start (5) exclusive end (10) every (1) +); +\d+ mpp6297 + Partitioned table "public.mpp6297" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp6297_1_prt_1 FOR VALUES FROM (1) TO (2), + mpp6297_1_prt_2 FOR VALUES FROM (2) TO (3), + mpp6297_1_prt_3 FOR VALUES FROM (3) TO (4), + mpp6297_1_prt_4 FOR VALUES FROM (4) TO (5), + mpp6297_1_prt_5 FOR VALUES FROM (5) TO (6), + mpp6297_1_prt_6 FOR VALUES FROM (6) TO (7), + mpp6297_1_prt_7 FOR VALUES FROM (7) TO (8), + mpp6297_1_prt_8 FOR VALUES FROM (8) TO (9), + mpp6297_1_prt_9 FOR VALUES FROM (9) TO (10) + +drop table mpp6297; +-- MPP-6589: SPLITting an "open" ended partition (ie, no start or end) +CREATE TABLE mpp6589a +( + id bigint, + day_dt date +) +PARTITION BY RANGE(day_dt) + ( + PARTITION p20090312 END ('2009-03-12'::date) + ); +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589a%'; + relname | pg_get_expr +--------------------------+---------------------------------------------- + mpp6589a | + mpp6589a_1_prt_p20090312 | FOR VALUES FROM (MINVALUE) TO ('03-12-2009') +(2 rows) + +-- should work +ALTER TABLE mpp6589a +SPLIT PARTITION p20090312 AT( '20090310' ) +INTO( PARTITION p20090309, PARTITION p20090312_tmp); +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589a%'; + relname | pg_get_expr +------------------------------+-------------------------------------------------- + mpp6589a | + mpp6589a_1_prt_p20090309 | FOR VALUES FROM (MINVALUE) TO ('03-10-2009') + mpp6589a_1_prt_p20090312_tmp | FOR VALUES FROM ('03-10-2009') TO ('03-12-2009') +(3 rows) + +CREATE TABLE mpp6589i(a int, b int) +partition by range (b) (start (1) end (3)); +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589i%'; + relname | pg_get_expr +------------------+---------------------------- + mpp6589i | + mpp6589i_1_prt_1 | FOR VALUES FROM (1) TO (3) +(2 rows) + +-- should fail (overlap) +ALTER TABLE mpp6589i ADD PARTITION start (2); +ERROR: partition "mpp6589i_1_prt_11" would overlap partition "mpp6589i_1_prt_1" +-- should work (there's a "point" hole at value 2) +ALTER TABLE mpp6589i ADD PARTITION start (3) exclusive; +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589i%'; + relname | pg_get_expr +-------------------+----------------------------------- + mpp6589i | + mpp6589i_1_prt_1 | FOR VALUES FROM (1) TO (3) + mpp6589i_1_prt_11 | FOR VALUES FROM (4) TO (MAXVALUE) +(3 rows) + +-- test open-ended SPLIT +CREATE TABLE mpp6589b +( + id bigint, + day_dt date +) +PARTITION BY RANGE(day_dt) + ( + PARTITION p20090312 START ('2008-03-12'::date) + ); +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589b%'; + relname | pg_get_expr +--------------------------+---------------------------------------------- + mpp6589b | + mpp6589b_1_prt_p20090312 | FOR VALUES FROM ('03-12-2008') TO (MAXVALUE) +(2 rows) + +-- should work +ALTER TABLE mpp6589b +SPLIT PARTITION p20090312 AT( '20090310' ) +INTO( PARTITION p20090309, PARTITION p20090312_tmp); +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589b%'; + relname | pg_get_expr +------------------------------+-------------------------------------------------- + mpp6589b | + mpp6589b_1_prt_p20090309 | FOR VALUES FROM ('03-12-2008') TO ('03-10-2009') + mpp6589b_1_prt_p20090312_tmp | FOR VALUES FROM ('03-10-2009') TO (MAXVALUE) +(3 rows) + +-- MPP-7191, MPP-7193: partitioned tables - fully-qualify storage type +-- if not specified (and not a template) +CREATE TABLE mpp5992 (a int, b date, c char, + d char(4), e varchar(20), f timestamp) +WITH (orientation=column,appendonly=true) +partition by range (b) +subpartition by list (a) +subpartition template ( +subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ) +subpartition by list (e) +subpartition template ( +subpartition ll1 values ('Engineering'), +subpartition ll2 values ('QA') ) +subpartition by list (c) +subpartition template ( +subpartition lll1 values ('M'), +subpartition lll2 values ('F') ) +( + start (date '2007-01-01') + end (date '2010-01-01') every (interval '1 year') +); +-- Delete subpartition template +alter table mpp5992 alter partition for ('2008-01-01') +set subpartition template (); +alter table mpp5992 alter partition for ('2008-01-01') +alter partition for (1) +set subpartition template (); +alter table mpp5992 set subpartition template (); +-- Add subpartition template +alter table mpp5992 alter partition for ('2008-01-01') +alter partition for (1) +set subpartition template ( subpartition lll1 values ('M'), +subpartition lll2 values ('F')); +alter table mpp5992 alter partition for ('2008-01-01') +set subpartition template ( +subpartition ll1 values ('Engineering'), +subpartition ll2 values ('QA') +); +alter table mpp5992 +set subpartition template (subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ); +alter table mpp5992 +set subpartition template (subpartition l1 values (1,2,3), +subpartition l2 values (4,5,6), subpartition l3 values (7,8,9,10)); +select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; + relid | level | template +---------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} +(3 rows) + +-- Now we can add a new partition +alter table mpp5992 +add partition foo1 +start (date '2011-01-01') +end (date '2012-01-01'); -- should inherit from parent storage option +alter table mpp5992 +add partition foo2 +start (date '2012-01-01') +end (date '2013-01-01') WITH (orientation=column,appendonly=true); +alter table mpp5992 +add partition foo3 +start (date '2013-01-01') end (date '2014-01-01') WITH (appendonly=true); +select * from pg_partition_tree('mpp5992'); + relid | parentrelid | isleaf | level +--------------------------------------------------+---------------------------------------+--------+------- + mpp5992 | | f | 0 + mpp5992_1_prt_1 | mpp5992 | f | 1 + mpp5992_1_prt_2 | mpp5992 | f | 1 + mpp5992_1_prt_3 | mpp5992 | f | 1 + mpp5992_1_prt_foo1 | mpp5992 | f | 1 + mpp5992_1_prt_foo2 | mpp5992 | f | 1 + mpp5992_1_prt_foo3 | mpp5992 | f | 1 + mpp5992_1_prt_1_2_prt_l1 | mpp5992_1_prt_1 | f | 2 + mpp5992_1_prt_1_2_prt_l2 | mpp5992_1_prt_1 | f | 2 + mpp5992_1_prt_2_2_prt_l1 | mpp5992_1_prt_2 | f | 2 + mpp5992_1_prt_2_2_prt_l2 | mpp5992_1_prt_2 | f | 2 + mpp5992_1_prt_3_2_prt_l1 | mpp5992_1_prt_3 | f | 2 + mpp5992_1_prt_3_2_prt_l2 | mpp5992_1_prt_3 | f | 2 + mpp5992_1_prt_foo1_2_prt_l1 | mpp5992_1_prt_foo1 | f | 2 + mpp5992_1_prt_foo1_2_prt_l2 | mpp5992_1_prt_foo1 | f | 2 + mpp5992_1_prt_foo1_2_prt_l3 | mpp5992_1_prt_foo1 | f | 2 + mpp5992_1_prt_foo2_2_prt_l1 | mpp5992_1_prt_foo2 | f | 2 + mpp5992_1_prt_foo2_2_prt_l2 | mpp5992_1_prt_foo2 | f | 2 + mpp5992_1_prt_foo2_2_prt_l3 | mpp5992_1_prt_foo2 | f | 2 + mpp5992_1_prt_foo3_2_prt_l1 | mpp5992_1_prt_foo3 | f | 2 + mpp5992_1_prt_foo3_2_prt_l2 | mpp5992_1_prt_foo3 | f | 2 + mpp5992_1_prt_foo3_2_prt_l3 | mpp5992_1_prt_foo3 | f | 2 + mpp5992_1_prt_1_2_prt_l1_3_prt_ll1 | mpp5992_1_prt_1_2_prt_l1 | f | 3 + mpp5992_1_prt_1_2_prt_l1_3_prt_ll2 | mpp5992_1_prt_1_2_prt_l1 | f | 3 + mpp5992_1_prt_1_2_prt_l2_3_prt_ll1 | mpp5992_1_prt_1_2_prt_l2 | f | 3 + mpp5992_1_prt_1_2_prt_l2_3_prt_ll2 | mpp5992_1_prt_1_2_prt_l2 | f | 3 + mpp5992_1_prt_2_2_prt_l1_3_prt_ll1 | mpp5992_1_prt_2_2_prt_l1 | f | 3 + mpp5992_1_prt_2_2_prt_l1_3_prt_ll2 | mpp5992_1_prt_2_2_prt_l1 | f | 3 + mpp5992_1_prt_2_2_prt_l2_3_prt_ll1 | mpp5992_1_prt_2_2_prt_l2 | f | 3 + mpp5992_1_prt_2_2_prt_l2_3_prt_ll2 | mpp5992_1_prt_2_2_prt_l2 | f | 3 + mpp5992_1_prt_3_2_prt_l1_3_prt_ll1 | mpp5992_1_prt_3_2_prt_l1 | f | 3 + mpp5992_1_prt_3_2_prt_l1_3_prt_ll2 | mpp5992_1_prt_3_2_prt_l1 | f | 3 + mpp5992_1_prt_3_2_prt_l2_3_prt_ll1 | mpp5992_1_prt_3_2_prt_l2 | f | 3 + mpp5992_1_prt_3_2_prt_l2_3_prt_ll2 | mpp5992_1_prt_3_2_prt_l2 | f | 3 + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll1 | mpp5992_1_prt_foo1_2_prt_l1 | f | 3 + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll2 | mpp5992_1_prt_foo1_2_prt_l1 | f | 3 + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll1 | mpp5992_1_prt_foo1_2_prt_l2 | f | 3 + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll2 | mpp5992_1_prt_foo1_2_prt_l2 | f | 3 + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll1 | mpp5992_1_prt_foo1_2_prt_l3 | f | 3 + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll2 | mpp5992_1_prt_foo1_2_prt_l3 | f | 3 + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll1 | mpp5992_1_prt_foo2_2_prt_l1 | f | 3 + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll2 | mpp5992_1_prt_foo2_2_prt_l1 | f | 3 + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll1 | mpp5992_1_prt_foo2_2_prt_l2 | f | 3 + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll2 | mpp5992_1_prt_foo2_2_prt_l2 | f | 3 + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll1 | mpp5992_1_prt_foo2_2_prt_l3 | f | 3 + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll2 | mpp5992_1_prt_foo2_2_prt_l3 | f | 3 + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll1 | mpp5992_1_prt_foo3_2_prt_l1 | f | 3 + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll2 | mpp5992_1_prt_foo3_2_prt_l1 | f | 3 + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll1 | mpp5992_1_prt_foo3_2_prt_l2 | f | 3 + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll2 | mpp5992_1_prt_foo3_2_prt_l2 | f | 3 + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll1 | mpp5992_1_prt_foo3_2_prt_l3 | f | 3 + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll2 | mpp5992_1_prt_foo3_2_prt_l3 | f | 3 + mpp5992_1_prt_1_2_prt_l1_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_1_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_1_2_prt_l1_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_1_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_1_2_prt_l1_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_1_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_1_2_prt_l1_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_1_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_1_2_prt_l2_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_1_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_1_2_prt_l2_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_1_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_1_2_prt_l2_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_1_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_1_2_prt_l2_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_1_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_2_2_prt_l1_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_2_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_2_2_prt_l1_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_2_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_2_2_prt_l1_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_2_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_2_2_prt_l1_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_2_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_2_2_prt_l2_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_2_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_2_2_prt_l2_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_2_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_2_2_prt_l2_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_2_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_2_2_prt_l2_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_2_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_3_2_prt_l1_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_3_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_3_2_prt_l1_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_3_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_3_2_prt_l1_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_3_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_3_2_prt_l1_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_3_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_3_2_prt_l2_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_3_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_3_2_prt_l2_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_3_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_3_2_prt_l2_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_3_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_3_2_prt_l2_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_3_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll1_4_prt_lll1 | mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll1_4_prt_lll2 | mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll1 | t | 4 + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll2_4_prt_lll1 | mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll2 | t | 4 + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll2_4_prt_lll2 | mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll2 | t | 4 +(112 rows) + +select relname, relam, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp5992%'; + relname | relam | pg_get_expr +--------------------------------------------------+-------+-------------------------------------------------- + mpp5992 | 0 | + mpp5992_1_prt_1 | 0 | FOR VALUES FROM ('01-01-2007') TO ('01-01-2008') + mpp5992_1_prt_1_2_prt_l1 | 0 | FOR VALUES IN (1, 2, 3, 4, 5) + mpp5992_1_prt_1_2_prt_l1_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_1_2_prt_l1_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_1_2_prt_l1_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_1_2_prt_l1_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_1_2_prt_l1_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_1_2_prt_l1_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_1_2_prt_l2 | 0 | FOR VALUES IN (6, 7, 8, 9, 10) + mpp5992_1_prt_1_2_prt_l2_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_1_2_prt_l2_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_1_2_prt_l2_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_1_2_prt_l2_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_1_2_prt_l2_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_1_2_prt_l2_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_2 | 0 | FOR VALUES FROM ('01-01-2008') TO ('01-01-2009') + mpp5992_1_prt_2_2_prt_l1 | 0 | FOR VALUES IN (1, 2, 3, 4, 5) + mpp5992_1_prt_2_2_prt_l1_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_2_2_prt_l1_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_2_2_prt_l1_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_2_2_prt_l1_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_2_2_prt_l1_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_2_2_prt_l1_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_2_2_prt_l2 | 0 | FOR VALUES IN (6, 7, 8, 9, 10) + mpp5992_1_prt_2_2_prt_l2_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_2_2_prt_l2_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_2_2_prt_l2_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_2_2_prt_l2_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_2_2_prt_l2_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_2_2_prt_l2_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_3 | 0 | FOR VALUES FROM ('01-01-2009') TO ('01-01-2010') + mpp5992_1_prt_3_2_prt_l1 | 0 | FOR VALUES IN (1, 2, 3, 4, 5) + mpp5992_1_prt_3_2_prt_l1_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_3_2_prt_l1_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_3_2_prt_l1_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_3_2_prt_l1_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_3_2_prt_l1_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_3_2_prt_l1_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_3_2_prt_l2 | 0 | FOR VALUES IN (6, 7, 8, 9, 10) + mpp5992_1_prt_3_2_prt_l2_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_3_2_prt_l2_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_3_2_prt_l2_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_3_2_prt_l2_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_3_2_prt_l2_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_3_2_prt_l2_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_foo1 | 0 | FOR VALUES FROM ('01-01-2011') TO ('01-01-2012') + mpp5992_1_prt_foo1_2_prt_l1 | 0 | FOR VALUES IN (1, 2, 3) + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll1_4_prt_lll1 | 2 | FOR VALUES IN ('M') + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll1_4_prt_lll2 | 2 | FOR VALUES IN ('F') + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll2_4_prt_lll1 | 2 | FOR VALUES IN ('M') + mpp5992_1_prt_foo1_2_prt_l1_3_prt_ll2_4_prt_lll2 | 2 | FOR VALUES IN ('F') + mpp5992_1_prt_foo1_2_prt_l2 | 0 | FOR VALUES IN (4, 5, 6) + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll1_4_prt_lll1 | 2 | FOR VALUES IN ('M') + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll1_4_prt_lll2 | 2 | FOR VALUES IN ('F') + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll2_4_prt_lll1 | 2 | FOR VALUES IN ('M') + mpp5992_1_prt_foo1_2_prt_l2_3_prt_ll2_4_prt_lll2 | 2 | FOR VALUES IN ('F') + mpp5992_1_prt_foo1_2_prt_l3 | 0 | FOR VALUES IN (7, 8, 9, 10) + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll1_4_prt_lll1 | 2 | FOR VALUES IN ('M') + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll1_4_prt_lll2 | 2 | FOR VALUES IN ('F') + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll2_4_prt_lll1 | 2 | FOR VALUES IN ('M') + mpp5992_1_prt_foo1_2_prt_l3_3_prt_ll2_4_prt_lll2 | 2 | FOR VALUES IN ('F') + mpp5992_1_prt_foo2 | 0 | FOR VALUES FROM ('01-01-2012') TO ('01-01-2013') + mpp5992_1_prt_foo2_2_prt_l1 | 0 | FOR VALUES IN (1, 2, 3) + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_foo2_2_prt_l1_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_foo2_2_prt_l2 | 0 | FOR VALUES IN (4, 5, 6) + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_foo2_2_prt_l2_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_foo2_2_prt_l3 | 0 | FOR VALUES IN (7, 8, 9, 10) + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll1_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll1_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll2_4_prt_lll1 | 7166 | FOR VALUES IN ('M') + mpp5992_1_prt_foo2_2_prt_l3_3_prt_ll2_4_prt_lll2 | 7166 | FOR VALUES IN ('F') + mpp5992_1_prt_foo3 | 0 | FOR VALUES FROM ('01-01-2013') TO ('01-01-2014') + mpp5992_1_prt_foo3_2_prt_l1 | 0 | FOR VALUES IN (1, 2, 3) + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll1_4_prt_lll1 | 7024 | FOR VALUES IN ('M') + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll1_4_prt_lll2 | 7024 | FOR VALUES IN ('F') + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll2_4_prt_lll1 | 7024 | FOR VALUES IN ('M') + mpp5992_1_prt_foo3_2_prt_l1_3_prt_ll2_4_prt_lll2 | 7024 | FOR VALUES IN ('F') + mpp5992_1_prt_foo3_2_prt_l2 | 0 | FOR VALUES IN (4, 5, 6) + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll1_4_prt_lll1 | 7024 | FOR VALUES IN ('M') + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll1_4_prt_lll2 | 7024 | FOR VALUES IN ('F') + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll2_4_prt_lll1 | 7024 | FOR VALUES IN ('M') + mpp5992_1_prt_foo3_2_prt_l2_3_prt_ll2_4_prt_lll2 | 7024 | FOR VALUES IN ('F') + mpp5992_1_prt_foo3_2_prt_l3 | 0 | FOR VALUES IN (7, 8, 9, 10) + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll1 | 0 | FOR VALUES IN ('Engineering') + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll1_4_prt_lll1 | 7024 | FOR VALUES IN ('M') + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll1_4_prt_lll2 | 7024 | FOR VALUES IN ('F') + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll2 | 0 | FOR VALUES IN ('QA') + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll2_4_prt_lll1 | 7024 | FOR VALUES IN ('M') + mpp5992_1_prt_foo3_2_prt_l3_3_prt_ll2_4_prt_lll2 | 7024 | FOR VALUES IN ('F') +(112 rows) + +select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; + relid | level | template +---------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} +(3 rows) + +-- MPP-10223: split subpartitions +CREATE TABLE MPP10223pk +( +rnc VARCHAR(100), +wbts VARCHAR(100), +axc VARCHAR(100), +vptt VARCHAR(100), +vcct VARCHAR(100), +agg_level CHAR(5), +period_start_time TIMESTAMP WITH TIME ZONE, +load_time TIMESTAMP WITH TIME ZONE DEFAULT now(), +interval INTEGER, +totcellsegress double precision, +totcellsingress double precision, + + CONSTRAINT "axc_vcct1_atmvcct_pk_test2" +PRIMARY KEY (rnc,wbts,axc,vptt,vcct,agg_level,period_start_time) +) + + +PARTITION BY LIST (AGG_LEVEL) + SUBPARTITION BY RANGE (PERIOD_START_TIME) +( + PARTITION min15part VALUES ('15min') + ( + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION hourpart VALUES ('hour') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P20100623 START (date '2010-06-23') INCLUSIVE, + SUBPARTITION P20100624 START (date '2010-06-24') INCLUSIVE, + SUBPARTITION P20100625 START (date '2010-06-25') INCLUSIVE, + SUBPARTITION P20100626 START (date '2010-06-26') INCLUSIVE, + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION daypart VALUES ('day') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P20100623 START (date '2010-06-23') INCLUSIVE, + SUBPARTITION P20100624 START (date '2010-06-24') INCLUSIVE, + SUBPARTITION P20100625 START (date '2010-06-25') INCLUSIVE, + SUBPARTITION P20100626 START (date '2010-06-26') INCLUSIVE, + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ) +); +-- MPP-10421: works -- can re-use name for non-DEFAULT partitions, and +-- primary key problems fixed +ALTER TABLE MPP10223pk + ALTER PARTITION min15part +SPLIT PARTITION P_FUTURE AT ('2010-06-25') +INTO (PARTITION P20010101, PARTITION P_FUTURE); +drop table mpp10223pk; +-- rebuild the table without a primary key +CREATE TABLE MPP10223 +( +rnc VARCHAR(100), +wbts VARCHAR(100), +axc VARCHAR(100), +vptt VARCHAR(100), +vcct VARCHAR(100), +agg_level CHAR(5), +period_start_time TIMESTAMP WITH TIME ZONE, +load_time TIMESTAMP WITH TIME ZONE DEFAULT now(), +interval INTEGER, +totcellsegress double precision, +totcellsingress double precision +) + + +PARTITION BY LIST (AGG_LEVEL) + SUBPARTITION BY RANGE (PERIOD_START_TIME) +( + PARTITION min15part VALUES ('15min') + ( + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION hourpart VALUES ('hour') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P20100623 START (date '2010-06-23') INCLUSIVE, + SUBPARTITION P20100624 START (date '2010-06-24') INCLUSIVE, + SUBPARTITION P20100625 START (date '2010-06-25') INCLUSIVE, + SUBPARTITION P20100626 START (date '2010-06-26') INCLUSIVE, + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION daypart VALUES ('day') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P20100623 START (date '2010-06-23') INCLUSIVE, + SUBPARTITION P20100624 START (date '2010-06-24') INCLUSIVE, + SUBPARTITION P20100625 START (date '2010-06-25') INCLUSIVE, + SUBPARTITION P20100626 START (date '2010-06-26') INCLUSIVE, + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ) +); +-- this works +ALTER TABLE MPP10223 + ALTER PARTITION min15part +SPLIT PARTITION P_FUTURE AT ('2010-06-25') +INTO (PARTITION P20010101, PARTITION P_FUTURE2); +select * from pg_partition_tree('mpp10223'); + relid | parentrelid | isleaf | level +------------------------------------------+--------------------------+--------+------- + mpp10223 | | f | 0 + mpp10223_1_prt_min15part | mpp10223 | f | 1 + mpp10223_1_prt_hourpart | mpp10223 | f | 1 + mpp10223_1_prt_daypart | mpp10223 | f | 1 + mpp10223_1_prt_min15part_2_prt_p_endpart | mpp10223_1_prt_min15part | t | 2 + mpp10223_1_prt_min15part_2_prt_p20010101 | mpp10223_1_prt_min15part | t | 2 + mpp10223_1_prt_min15part_2_prt_p_future2 | mpp10223_1_prt_min15part | t | 2 + mpp10223_1_prt_hourpart_2_prt_p_future | mpp10223_1_prt_hourpart | t | 2 + mpp10223_1_prt_hourpart_2_prt_p20100622 | mpp10223_1_prt_hourpart | t | 2 + mpp10223_1_prt_hourpart_2_prt_p20100623 | mpp10223_1_prt_hourpart | t | 2 + mpp10223_1_prt_hourpart_2_prt_p20100624 | mpp10223_1_prt_hourpart | t | 2 + mpp10223_1_prt_hourpart_2_prt_p20100625 | mpp10223_1_prt_hourpart | t | 2 + mpp10223_1_prt_hourpart_2_prt_p20100626 | mpp10223_1_prt_hourpart | t | 2 + mpp10223_1_prt_hourpart_2_prt_p_endpart | mpp10223_1_prt_hourpart | t | 2 + mpp10223_1_prt_daypart_2_prt_p_future | mpp10223_1_prt_daypart | t | 2 + mpp10223_1_prt_daypart_2_prt_p20100622 | mpp10223_1_prt_daypart | t | 2 + mpp10223_1_prt_daypart_2_prt_p20100623 | mpp10223_1_prt_daypart | t | 2 + mpp10223_1_prt_daypart_2_prt_p20100624 | mpp10223_1_prt_daypart | t | 2 + mpp10223_1_prt_daypart_2_prt_p20100625 | mpp10223_1_prt_daypart | t | 2 + mpp10223_1_prt_daypart_2_prt_p20100626 | mpp10223_1_prt_daypart | t | 2 + mpp10223_1_prt_daypart_2_prt_p_endpart | mpp10223_1_prt_daypart | t | 2 +(21 rows) + +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp10223%'; + relname | pg_get_expr +------------------------------------------+-------------------------------------------------------------------------------------- + mpp10223 | + mpp10223_1_prt_daypart | FOR VALUES IN ('day ') + mpp10223_1_prt_daypart_2_prt_p20100622 | FOR VALUES FROM ('Tue Jun 22 00:00:00 2010 PDT') TO ('Wed Jun 23 00:00:00 2010 PDT') + mpp10223_1_prt_daypart_2_prt_p20100623 | FOR VALUES FROM ('Wed Jun 23 00:00:00 2010 PDT') TO ('Thu Jun 24 00:00:00 2010 PDT') + mpp10223_1_prt_daypart_2_prt_p20100624 | FOR VALUES FROM ('Thu Jun 24 00:00:00 2010 PDT') TO ('Fri Jun 25 00:00:00 2010 PDT') + mpp10223_1_prt_daypart_2_prt_p20100625 | FOR VALUES FROM ('Fri Jun 25 00:00:00 2010 PDT') TO ('Sat Jun 26 00:00:00 2010 PDT') + mpp10223_1_prt_daypart_2_prt_p20100626 | FOR VALUES FROM ('Sat Jun 26 00:00:00 2010 PDT') TO ('Mon Dec 30 00:00:00 2999 PST') + mpp10223_1_prt_daypart_2_prt_p_endpart | FOR VALUES FROM ('Mon Dec 30 00:00:00 2999 PST') TO ('Tue Dec 31 00:00:00 2999 PST') + mpp10223_1_prt_daypart_2_prt_p_future | FOR VALUES FROM ('Mon Jan 01 00:00:00 2001 PST') TO ('Tue Jun 22 00:00:00 2010 PDT') + mpp10223_1_prt_hourpart | FOR VALUES IN ('hour ') + mpp10223_1_prt_hourpart_2_prt_p20100622 | FOR VALUES FROM ('Tue Jun 22 00:00:00 2010 PDT') TO ('Wed Jun 23 00:00:00 2010 PDT') + mpp10223_1_prt_hourpart_2_prt_p20100623 | FOR VALUES FROM ('Wed Jun 23 00:00:00 2010 PDT') TO ('Thu Jun 24 00:00:00 2010 PDT') + mpp10223_1_prt_hourpart_2_prt_p20100624 | FOR VALUES FROM ('Thu Jun 24 00:00:00 2010 PDT') TO ('Fri Jun 25 00:00:00 2010 PDT') + mpp10223_1_prt_hourpart_2_prt_p20100625 | FOR VALUES FROM ('Fri Jun 25 00:00:00 2010 PDT') TO ('Sat Jun 26 00:00:00 2010 PDT') + mpp10223_1_prt_hourpart_2_prt_p20100626 | FOR VALUES FROM ('Sat Jun 26 00:00:00 2010 PDT') TO ('Mon Dec 30 00:00:00 2999 PST') + mpp10223_1_prt_hourpart_2_prt_p_endpart | FOR VALUES FROM ('Mon Dec 30 00:00:00 2999 PST') TO ('Tue Dec 31 00:00:00 2999 PST') + mpp10223_1_prt_hourpart_2_prt_p_future | FOR VALUES FROM ('Mon Jan 01 00:00:00 2001 PST') TO ('Tue Jun 22 00:00:00 2010 PDT') + mpp10223_1_prt_min15part | FOR VALUES IN ('15min') + mpp10223_1_prt_min15part_2_prt_p20010101 | FOR VALUES FROM ('Mon Jan 01 00:00:00 2001 PST') TO ('Fri Jun 25 00:00:00 2010 PDT') + mpp10223_1_prt_min15part_2_prt_p_endpart | FOR VALUES FROM ('Mon Dec 30 00:00:00 2999 PST') TO ('Tue Dec 31 00:00:00 2999 PST') + mpp10223_1_prt_min15part_2_prt_p_future2 | FOR VALUES FROM ('Fri Jun 25 00:00:00 2010 PDT') TO ('Mon Dec 30 00:00:00 2999 PST') +(21 rows) + +-- simpler version +create table mpp10223b (a int, b int , d int) +partition by range (b) +subpartition by range (d) +(partition p1 start (1) end (10) +(subpartition sp2 start (20) end (30))); +-- MPP-10421: allow re-use sp2 for non-DEFAULT partition +alter table mpp10223b alter partition p1 +split partition for (20) at (25) +into (partition sp2, partition sp3); +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp10223b%'; + relname | pg_get_expr +------------------------------+------------------------------ + mpp10223b | + mpp10223b_1_prt_p1 | FOR VALUES FROM (1) TO (10) + mpp10223b_1_prt_p1_2_prt_sp2 | FOR VALUES FROM (20) TO (25) + mpp10223b_1_prt_p1_2_prt_sp3 | FOR VALUES FROM (25) TO (30) +(4 rows) + +-- MPP-10480: dump templates (but don't use "foo") +create table MPP10480 (a int, b int, d int) +partition by range (b) +subpartition by range(d) +subpartition template (start (1) end (10) every (1)) +(start (20) end (30) every (1)); +select relid::regclass, level, template from gp_partition_template where relid = 'MPP10480'::regclass; + relid | level | template +----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2} :partEvery ({A_CONST :val 1 :location 141})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} +(1 row) + +-- MPP-10421: fix SPLIT of partitions with PRIMARY KEY constraint/indexes +CREATE TABLE mpp10321a +( + rnc VARCHAR(100), + wbts VARCHAR(100), + axc VARCHAR(100), + vptt VARCHAR(100), + vcct VARCHAR(100), + agg_level CHAR(5), + period_start_time TIMESTAMP WITH TIME ZONE, + load_time TIMESTAMP WITH TIME ZONE DEFAULT now(), + interval INTEGER, + totcellsegress double precision, + totcellsingress double precision, + CONSTRAINT "mpp10321a_pk" +PRIMARY KEY (rnc,wbts,axc,vptt,vcct,agg_level,period_start_time) +) +PARTITION BY LIST (AGG_LEVEL) + SUBPARTITION BY RANGE (PERIOD_START_TIME) +( + PARTITION min15part VALUES ('15min') + ( + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION hourpart VALUES ('hour') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ) +); +ALTER TABLE mpp10321a +ALTER PARTITION min15part +SPLIT PARTITION P_FUTURE AT ('2010-06-25') +INTO (PARTITION P20010101, PARTITION P_FUTURE); +DROP TABLE mpp10321a; +-- test for default partition with boundary spec +create table bhagp_range (a int, b int) + +partition by range (b) +( + default partition x + start (0) inclusive + end (2) exclusive + every (1) +); +ERROR: syntax error at or near "start" +LINE 6: start (0) inclusive + ^ +create table bhagp_list (a int, b int) + +partition by list (b) +( + default partition x + values (1,2) +); +ERROR: syntax error at or near "values" +LINE 6: values (1,2) + ^ +-- more coverage tests +-- bad partition by type +create table cov1 (a int, b int) +partition by (b) +( +start (1) end (10) every (1) +); +ERROR: syntax error at or near "(" +LINE 2: partition by (b) + ^ +-- bad partition by type +create table cov1 (a int, b int) +partition by funky (b) +( +start (1) end (10) every (1) +); +ERROR: unrecognized partitioning strategy "funky" +drop table cov1; +ERROR: table "cov1" does not exist +create table cov1 (a int, b int) +partition by range (b) +( +start (1) end (10) every (1) +); +-- syntax error +alter table cov1 drop partition for (funky(1)); +ERROR: syntax error at or near ")" +LINE 1: alter table cov1 drop partition for (funky(1)); + ^ +-- no rank for default +alter table cov1 drop default partition for (1); +ERROR: cannot specify a name, rank, or value for a DEFAULT partition in this context +-- no default +alter table cov1 split default partition at (9); +ERROR: DEFAULT partition of relation "cov1" does not exist +alter table cov1 drop default partition; +ERROR: DEFAULT partition of relation "cov1" does not exist +-- cannot add except by name +alter table cov1 add partition for (1); +ERROR: can only ADD a partition by name +-- bad template +alter table cov1 set subpartition template (values (1,2) (values (2,3))); +ERROR: template cannot contain specification for child partition +-- create and drop default partition in one statement! +alter table cov1 add default partition def1, drop default partition; +drop table cov1; +-- every 5 (1) now disallowed... +create table cov1 (a int, b int) +partition by range (b) +( +start (1) end(20) every 5 (1) +); +ERROR: syntax error at or near "5" +LINE 4: start (1) end(20) every 5 (1) + ^ +drop table if exists cov1; +NOTICE: table "cov1" does not exist, skipping +create table cov1 (a int, b int) +partition by list (b) +( +partition p1 values (1,2,3,4,5,6,7,8) +); +-- bad split +alter table cov1 split partition p1 at (5,50); +ERROR: AT clause parameter is not a member of the target partition specification +-- good split +alter table cov1 split partition p1 at (5,6,7) +into (partition p1, partition p2); +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'cov1%'; + relname | pg_get_expr +---------------+------------------------------- + cov1 | + cov1_1_prt_p1 | FOR VALUES IN (1, 2, 3, 4, 8) + cov1_1_prt_p2 | FOR VALUES IN (5, 6, 7) +(3 rows) + +drop table cov1; +-- MPP-11120 +-- ADD PARTITION didn't explicitly specify the distribution policy in the +-- CreateStmt distributedBy field and as such we followed the behaviour encoded +-- in transformDistributedBy(). Unfortunately, it chooses to set the +-- distribution policy to that of the primary key if the distribution policy +-- is not explicitly set. +create table tbl11120 ( + a int, + b int, + c int, + primary key (a,b,c) +) +partition by range (b) +( + default partition default_partition, + partition p1 start (1) end (2) +); +insert into tbl11120 values(1,2,3); +select * from tbl11120; -- expected: (1,2,3) + a | b | c +---+---+--- + 1 | 2 | 3 +(1 row) + +delete from tbl11120 where a=1 and b=2 and c=3; -- this should delete the row in tbl11120 +select * from tbl11120; -- expected, no rows + a | b | c +---+---+--- +(0 rows) + +insert into tbl11120 values(1,2,3); -- reinsert data +-- all partitions should have same distribution policy +select relname, distkey as distribution_attributes from +gp_distribution_policy p, pg_class c +where p.localoid = c.oid and relname like 'tbl11120%' order by p.localoid; + relname | distribution_attributes +---------+------------------------- +(0 rows) + +alter table tbl11120 split default partition + start (3) + end (4) + into (partition p2, default partition); +select relname, distkey as distribution_attributes from +gp_distribution_policy p, pg_class c where p.localoid = c.oid and +relname like 'tbl11120%' order by p.localoid; + relname | distribution_attributes +---------+------------------------- +(0 rows) + +delete from tbl11120 where a=1 and b=2 and c=3; -- this should delete the row in tbl11120 +select * from tbl11120; -- expected, no rows! But we see the row. Wrong results! + a | b | c +---+---+--- +(0 rows) + +alter table tbl11120 drop partition default_partition; +alter table tbl11120 add partition foo start(10) end(20); +select relname, distkey as distribution_attributes from +gp_distribution_policy p, pg_class c where p.localoid = c.oid and +relname like 'tbl11120%' order by p.localoid; + relname | distribution_attributes +---------+------------------------- +(0 rows) + +drop table tbl11120; +-- MPP-6979: EXCHANGE partitions - fix namespaces if they differ +-- new schema +create schema mpp6979dummy; +create table mpp6979part(a int, b int) +partition by range(b) +( +start (1) end (10) every (1) +); +-- append-only table in new schema +create table mpp6979dummy.mpp6979tab(like mpp6979part) with (appendonly=true); +-- check that table and all parts in public schema +select relname, nspname, relispartition from pg_class c, pg_namespace n +where c.relnamespace = n.oid and relname like ('mpp6979%'); + relname | nspname | relispartition +---------------------+--------------+---------------- + mpp6979part | public | f + mpp6979part_1_prt_1 | public | t + mpp6979part_1_prt_2 | public | t + mpp6979part_1_prt_3 | public | t + mpp6979part_1_prt_4 | public | t + mpp6979part_1_prt_5 | public | t + mpp6979part_1_prt_6 | public | t + mpp6979part_1_prt_7 | public | t + mpp6979part_1_prt_8 | public | t + mpp6979part_1_prt_9 | public | t + mpp6979tab | mpp6979dummy | f +(11 rows) + +-- note that we have heap partitions in public, and ao table in mpp6979dummy +select nspname, relname, amname +from pg_class pc +inner join pg_namespace ns on pc.relnamespace=ns.oid +left join pg_am am on am.oid = pc.relam +where relname like ('mpp6979%'); + nspname | relname | amname +--------------+---------------------+-------- + public | mpp6979part | + public | mpp6979part_1_prt_1 | heap + public | mpp6979part_1_prt_2 | heap + public | mpp6979part_1_prt_3 | heap + public | mpp6979part_1_prt_4 | heap + public | mpp6979part_1_prt_5 | heap + public | mpp6979part_1_prt_6 | heap + public | mpp6979part_1_prt_7 | heap + public | mpp6979part_1_prt_8 | heap + public | mpp6979part_1_prt_9 | heap + mpp6979dummy | mpp6979tab | ao_row +(11 rows) + +-- exchange the partition with the ao table. +-- Now we have an ao partition and mpp6979tab is heap! +alter table mpp6979part exchange partition for (1) +with table mpp6979dummy.mpp6979tab; +-- after the exchange, all partitions are still in public +select relname, nspname, relispartition from pg_class c, pg_namespace n +where c.relnamespace = n.oid and relname like ('mpp6979%'); + relname | nspname | relispartition +---------------------+--------------+---------------- + mpp6979part | public | f + mpp6979part_1_prt_1 | public | t + mpp6979part_1_prt_2 | public | t + mpp6979part_1_prt_3 | public | t + mpp6979part_1_prt_4 | public | t + mpp6979part_1_prt_5 | public | t + mpp6979part_1_prt_6 | public | t + mpp6979part_1_prt_7 | public | t + mpp6979part_1_prt_8 | public | t + mpp6979part_1_prt_9 | public | t + mpp6979tab | mpp6979dummy | f +(11 rows) + +-- the rank 1 partition is ao, but still in public, and +-- table mpp6979tab is now heap, but still in mpp6979dummy +select relname, nspname, relispartition, amname +from pg_class c inner join pg_namespace n on c.relnamespace = n.oid +left join pg_am am on am.oid = c.relam +where relname like ('mpp6979%'); + relname | nspname | relispartition | amname +---------------------+--------------+----------------+-------- + mpp6979part | public | f | + mpp6979part_1_prt_1 | public | t | ao_row + mpp6979part_1_prt_2 | public | t | heap + mpp6979part_1_prt_3 | public | t | heap + mpp6979part_1_prt_4 | public | t | heap + mpp6979part_1_prt_5 | public | t | heap + mpp6979part_1_prt_6 | public | t | heap + mpp6979part_1_prt_7 | public | t | heap + mpp6979part_1_prt_8 | public | t | heap + mpp6979part_1_prt_9 | public | t | heap + mpp6979tab | mpp6979dummy | f | heap +(11 rows) + +drop table mpp6979part; +drop table mpp6979dummy.mpp6979tab; +drop schema mpp6979dummy; +-- MPP-7898: +create table parent_s + (a int, b text) + ; + +insert into parent_s values + (1, 'one'); +-- Try to create a table that mixes inheritance and partitioning. +-- Correct behavior: ERROR +create table child_r + ( c int, d int) + inherits (parent_s) + partition by range(d) + ( + start (0) + end (2) + every (1) + ); +ERROR: cannot create partitioned table as inheritance child + -- If (incorrectly) the previous statement works, the next one is + -- likely to fail with in unexpected internal error. This is residual + -- issue MPP-7898. +insert into child_r values + (0, 'from r', 0, 0); +ERROR: relation "child_r" does not exist +LINE 1: insert into child_r values + ^ +drop table if exists parent_s cascade; --ignore +drop table if exists child_r cascade; --ignore +NOTICE: table "child_r" does not exist, skipping +create table parent_r + ( a int, b text, c int, d int ) + + partition by range(d) + ( + start (0) + end (2) + every (1) + ); + +insert into parent_r values + (0, 'from r', 0, 0); +create table parent_s + ( a int, b text, c int, d int ) + ; + +insert into parent_s values + (1, 'from s', 555, 555); +create table child_t + ( ) + inherits (parent_s) + ; +insert into child_t values + (0, 'from t', 666, 666); +-- Try to exchange in the child and parent. +-- Correct behavior: ERROR in both cases. +alter table parent_r exchange partition for (1) with table child_t; +ERROR: cannot attach inheritance child as partition +alter table parent_r exchange partition for (1) with table parent_s; +ERROR: cannot attach inheritance parent as partition +drop table child_t cascade; --ignore +drop table parent_s cascade; --ignore +drop table parent_r cascade; --ignore +-- MPP-7898 end. +-- ( MPP-13750 +CREATE TABLE s (id int, date date, amt decimal(10,2), units int) + +PARTITION BY RANGE (date) +( START (date '2008-01-01') INCLUSIVE + END (date '2008-01-02') EXCLUSIVE + EVERY (INTERVAL '1 day') ); +create index s_i on s(amt) + where (id > 1) + ; +create index s_j on s(units) + where (id <= 1) + ; +create index s_i_expr on s(log(units)); +alter table s add partition s_test + start(date '2008-01-03') end (date '2008-01-05'); +alter table s split partition for (date '2008-01-03') at (date '2008-01-04') + into (partition s_test, partition s_test2); +-- start_ignore +select + relname, + (select count(distinct content) - 1 + from gp_segment_configuration) - count(*) as missing, + count(distinct relid) oid_count +from ( + select gp_execution_segment(), oid, relname + from gp_dist_random('pg_class') + ) seg_class(segid, relid, relname) +where relname ~ '^s_' +group by relname; + relname | missing | oid_count +---------------------------+---------+----------- + s_1_prt_1 | -1 | 1 + s_1_prt_1_amt_idx | -1 | 1 + s_1_prt_1_log_idx | -1 | 1 + s_1_prt_1_units_idx | -1 | 1 + s_1_prt_s_test | -1 | 1 + s_1_prt_s_test2 | -1 | 1 + s_1_prt_s_test2_amt_idx | -1 | 1 + s_1_prt_s_test2_log_idx | -1 | 1 + s_1_prt_s_test2_units_idx | -1 | 1 + s_1_prt_s_test_amt_idx1 | -1 | 1 + s_1_prt_s_test_log_idx1 | -1 | 1 + s_1_prt_s_test_units_idx1 | -1 | 1 + s_i | -1 | 1 + s_i_expr | -1 | 1 + s_j | -1 | 1 +(15 rows) +-- end_ignore +drop table s cascade; +-- MPP-13750 ) +-- MPP-13806 start +drop table if exists mpp13806; +NOTICE: table "mpp13806" does not exist, skipping + CREATE TABLE mpp13806 (id int, date date, amt decimal(10,2)) + PARTITION BY RANGE (date) + ( START (date '2008-01-01') INCLUSIVE + END (date '2008-01-05') EXCLUSIVE + EVERY (INTERVAL '1 day') ); + +-- Adding unbound partition right before the start used to fail +alter table mpp13806 add partition test end (date '2008-01-01') exclusive; + +drop table if exists mpp13806; + CREATE TABLE mpp13806 (id int, date date, amt decimal(10,2)) + PARTITION BY RANGE (date) + ( START (date '2008-01-01') EXCLUSIVE + END (date '2008-01-05') EXCLUSIVE + EVERY (INTERVAL '1 day') ); +-- For good measure, test the opposite case +alter table mpp13806 add partition test end (date '2008-01-01') inclusive; +drop table mpp13806; +-- MPP-13806 end +-- MPP-14471 start +-- No unenforceable PK/UK constraints! (UNIQUE INDEXes still allowed; tested above) +drop table if exists tc cascade; +NOTICE: table "tc" does not exist, skipping +drop table if exists cc cascade; +NOTICE: table "cc" does not exist, skipping +drop table if exists at cascade; +NOTICE: table "at" does not exist, skipping +create table tc + (a int, b int, c int, primary key(a) ) + partition by range (b) + ( + default partition d, + start (0) inclusive end(100) inclusive every (50) + ); +DETAIL: PRIMARY KEY constraint on table "tc" lacks column "b" which is part of the partition key. +ERROR: unique constraint on partitioned table must include all partitioning columns +create table cc + (a int primary key, b int, c int) + partition by range (b) + ( + default partition d, + start (0) inclusive end(100) inclusive every (50) + ); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: PRIMARY KEY constraint on table "cc" lacks column "b" which is part of the partition key. +create table at + (a int, b int, c int) + partition by range (b) + ( + default partition d, + start (0) inclusive end(100) inclusive every (50) + ); +alter table at + add primary key (a); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: PRIMARY KEY constraint on table "at" lacks column "b" which is part of the partition key. +-- MPP-14471 end +-- MPP-17606 (using table "at" from above) +alter table at + alter column b + type numeric; +ERROR: cannot alter column "b" because it is part of the partition key of relation "at" + +-- MPP-17606 end +-- MPP-17707 start +create table mpp17707 +( d int, p int ,x text) +with (appendonly = true) +partition by range (p) +(start (0) end (3) every (2)); +-- Create a expression index on the partitioned table +create index idx_abc on mpp17707(upper(x)); +-- split partition 1 of table +alter table mpp17707 split partition for (0) at (1) + into (partition x1, partition x2); +-- MPP-17707 end +-- MPP-17814 start +drop table if exists plst2 cascade; +NOTICE: table "plst2" does not exist, skipping +-- positive; bug was that it failed whereas it should succeed +create type plst2_partkey as (a integer, c integer); +create table plst2 + ( + b integer not null, + d plst2_partkey + ) + partition by list (d) + ( + partition p1 values ( CAST('(1,2)' as plst2_partkey), CAST('(3,4)' as plst2_partkey) ), + partition p2 values ( CAST('(5,6)' as plst2_partkey) ), + partition p3 values ( CAST('(2,1)' as plst2_partkey) ) + ); +\d+ plst2 + Partitioned table "public.plst2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------------+-----------+----------+---------+----------+--------------+------------- + b | integer | | not null | | plain | | + d | plst2_partkey | | | | extended | | +Partition key: LIST (d) +Partitions: plst2_1_prt_p1 FOR VALUES IN ('(1,2)', '(3,4)'), + plst2_1_prt_p2 FOR VALUES IN ('(5,6)'), + plst2_1_prt_p3 FOR VALUES IN ('(2,1)') + +drop table if exists plst2 cascade; +--negative; test legitimate failure +create table plst2 + ( + b integer not null, + d plst2_partkey + ) + partition by list (d) + ( + partition p1 values ( CAST('(1,2)' as plst2_partkey), CAST('(3,4)' as plst2_partkey) ), + partition p2 values ( CAST('(5,6)' as plst2_partkey) ), + partition p3 values ( CAST('(1,2)' as plst2_partkey) ) + ); +ERROR: partition "plst2_1_prt_p3" would overlap partition "plst2_1_prt_p1" +LINE 10: partition p3 values ( CAST('(1,2)' as plst2_partkey)... + ^ +-- postive; make sure inner part duplicates are accepted and quietly removed. +drop table if exists plst2; +NOTICE: table "plst2" does not exist, skipping +drop type plst2_partkey; +create type plst2_partkey as (a int, b int); +create table plst2 + ( d int, c plst2_partkey) + partition by list (c) + ( + partition p0 values ( CAST('(1,2)' as plst2_partkey), CAST('(3,4)' as plst2_partkey) ), + partition p1 values ( CAST('(4,3)' as plst2_partkey), CAST('(2,1)' as plst2_partkey) ), + partition p2 values ( CAST('(4,4)' as plst2_partkey), CAST('(5,5)' as plst2_partkey), CAST('(4,4)' as plst2_partkey), CAST('(5,5)' as plst2_partkey), CAST('(4,4)' as plst2_partkey), CAST('(5,5)' as plst2_partkey)), + partition p3 values (CAST('(4,5)' as plst2_partkey), CAST('(5,6)' as plst2_partkey)) + ); +-- positive; make sure legitimate alters work. +alter table plst2 add partition p4 values (CAST('(5,4)' as plst2_partkey), CAST('(6,5)' as plst2_partkey)); +alter table plst2 add partition p5 values (CAST('(7,8)' as plst2_partkey), CAST('(7,8)' as plst2_partkey)); +\d+ plst2 + Partitioned table "public.plst2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------------+-----------+----------+---------+----------+--------------+------------- + d | integer | | | | plain | | + c | plst2_partkey | | | | extended | | +Partition key: LIST (c) +Partitions: plst2_1_prt_p0 FOR VALUES IN ('(1,2)', '(3,4)'), + plst2_1_prt_p1 FOR VALUES IN ('(4,3)', '(2,1)'), + plst2_1_prt_p2 FOR VALUES IN ('(4,4)', '(5,5)'), + plst2_1_prt_p3 FOR VALUES IN ('(4,5)', '(5,6)'), + plst2_1_prt_p4 FOR VALUES IN ('(5,4)', '(6,5)'), + plst2_1_prt_p5 FOR VALUES IN ('(7,8)') + +-- negative; make sure conflicting alters fail. +alter table plst2 add partition p6 values (CAST('(7,8)' as plst2_partkey), CAST('(2,1)' as plst2_partkey)); +ERROR: partition "plst2_1_prt_p6" would overlap partition "plst2_1_prt_p5" +LINE 1: alter table plst2 add partition p6 values (CAST('(7,8)' as p... + ^ +drop table if exists plst2; +-- MPP-17814 end +-- MPP-18441 +create table s_heap (i1 int, t1 text, t2 text, i2 int, i3 int, n1 numeric, b1 bool) +partition by list (t1) + (partition abc values('abc0', 'abc1', 'abc2')); +insert into s_heap (t1, i1, i2, i3, n1, b1) select 'abc0', 1, 1, 1, 2.3, true + from generate_series(1, 5); +alter table s_heap drop column t2; +alter table s_heap drop column i3; +-- create co table for exchange +create table s_heap_ex_abc (i1 int, t1 text, f1 float, i2 int, n1 numeric, b1 bool) + WITH (appendonly=true, orientation=column, compresstype=zlib); +alter table s_heap_ex_abc drop column f1; +insert into s_heap_ex_abc select 1, 'abc1', 2, 2, true from generate_series(1, 5); +-- exchange partition +alter table s_heap exchange partition abc with table s_heap_ex_abc; +alter table s_heap exchange partition abc with table s_heap_ex_abc; +drop table s_heap, s_heap_ex_abc; +-- MPP-18441 end +-- MPP-18443 +create table s_heap (i1 int, t1 text, i2 int , i3 int, n1 numeric,b1 bool) +partition by list (t1) + (partition def values('def0', 'def1', 'def2', 'def3', 'def4', 'def5', 'def6', 'def7', 'def8', 'def9')); +insert into s_heap(t1, i1, i2, i3, n1, b1) + select 'def0', 1, 1, 1, 2.3 , true from generate_series(1, 5); +alter table s_heap drop column i3; +create index s_heap_index on s_heap (i2); +alter table s_heap split partition def + at ('def0', 'def1', 'def2', 'def3', 'def4') into (partition def5, partition def0); +select * from s_heap_1_prt_def0; + i1 | t1 | i2 | n1 | b1 +----+------+----+-----+---- + 1 | def0 | 1 | 2.3 | t + 1 | def0 | 1 | 2.3 | t + 1 | def0 | 1 | 2.3 | t + 1 | def0 | 1 | 2.3 | t + 1 | def0 | 1 | 2.3 | t +(5 rows) + +drop table s_heap; +-- MPP-18443 end +-- MPP-18445 +create table s_heap_ao ( i1 int, t1 text, i2 int , i3 int, n1 numeric,b1 bool) +partition by list (t1) + (partition def values('def0', 'def1', 'def2', 'def3', 'def4', 'def5', 'def6', 'def7', 'def8', 'def9') + with (appendonly=true, orientation=row)); +insert into s_heap_ao(t1, i1, i2, i3, n1, b1) + select 'def4', 1, 1, 1, 2.3, true from generate_series(1, 2); +insert into s_heap_ao(t1, i1, i2, i3, n1, b1) + select 'def5', 1, 1, 1, 2.3, true from generate_series(1, 2); +alter table s_heap_ao drop column i3; +create index s_heap_ao_index on s_heap_ao (i2); +alter table s_heap_ao split partition def + at ('def0', 'def1', 'def2', 'def3', 'def4') into (partition def5, partition def0); +select * from s_heap_ao_1_prt_def0; + i1 | t1 | i2 | n1 | b1 +----+------+----+-----+---- + 1 | def4 | 1 | 2.3 | t + 1 | def4 | 1 | 2.3 | t +(2 rows) + +drop table s_heap_ao; +-- MPP-18445 end +-- MPP-18456 +create table s_heap_co (i1 int, t1 text, i2 int, i3 int, n1 numeric, b1 bool) +partition by list (t1) + (partition def values('def0', 'def1', 'def2', 'def3', 'def4', 'def5', 'def6', 'def7', 'def8', 'def9') + with (appendonly=true, orientation=column)); +insert into s_heap_co(t1, i1, i2, i3, n1, b1) + select 'def4', 1,1, 1, 2.3, true from generate_series(1, 2); +insert into s_heap_co(t1, i1, i2, i3, n1, b1) + select 'def5', 1,1, 1, 2.3, true from generate_series(1, 2); +alter table s_heap_co drop column i3; +create index s_heap_co_index on s_heap_co (i2); +alter table s_heap_co split partition def + at ('def0', 'def1', 'def2', 'def3', 'def4') into (partition def5, partition def0); +select * from s_heap_co_1_prt_def0; + i1 | t1 | i2 | n1 | b1 +----+------+----+-----+---- + 1 | def4 | 1 | 2.3 | t + 1 | def4 | 1 | 2.3 | t +(2 rows) + +drop table s_heap_co; +-- MPP-18456 end +-- MPP-18457, MPP-18415 +CREATE TABLE non_ws_phone_leads ( + lead_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + source_system_lead_id character varying(60) NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_event_type_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_site_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_date_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_time_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_number_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + duration_second smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_program_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_call_status_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_department_set_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_channel_set_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_provider_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_ad_set_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +) +WITH (appendonly=true, compresstype=zlib, orientation=column) PARTITION BY RANGE(dim_date_key) + ( + PARTITION p_max START (2451545) END (9999999) WITH (tablename='non_ws_phone_leads_1_prt_p_max', orientation=column, appendonly=true ) + COLUMN lead_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN source_system_lead_id ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_event_type_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_site_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_date_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_time_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_number_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN duration_second ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_program_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_call_status_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_department_set_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_channel_set_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_provider_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_ad_set_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + ); +INSERT INTO non_ws_phone_leads VALUES (63962490, 'CA6qOEyxOmNJUQC7', 5058, 999901, 2455441, 40435, 999904, 207, 79, 2, 9901, 9901, 1, 9901); +CREATE TABLE dim_phone_numbers ( + dim_phone_number_key integer NOT NULL, + media_tracker_description character varying(40) NOT NULL, + formatted_phone_number character varying(20) NOT NULL, + source_system_phone_number_id character varying(100) NOT NULL, + last_modified_date timestamp without time zone NOT NULL +); +ALTER TABLE ONLY dim_phone_numbers + ADD CONSTRAINT dim_phone_numbers_pk1 PRIMARY KEY (dim_phone_number_key); +INSERT INTO dim_phone_numbers VALUES (999902, 'test', '800-123-4568', '8001234568', '2012-09-25 13:34:35.037637'); +INSERT INTO dim_phone_numbers VALUES (999904, 'test', '(800) 123-4570', '8001234570', '2012-09-25 13:34:35.148104'); +INSERT INTO dim_phone_numbers VALUES (999903, 'test', '(800) 123-4569', '8001234569', '2012-09-25 13:34:35.093523'); +INSERT INTO dim_phone_numbers VALUES (999901, 'test', '(800)123-4567', '8001234567', '2012-09-25 13:34:34.781042'); +INSERT INTO dim_phone_numbers SELECT gs.*, dim_phone_numbers.media_tracker_description, dim_phone_numbers.formatted_phone_number, dim_phone_numbers.source_system_phone_number_id, dim_phone_numbers.last_modified_date FROM dim_phone_numbers, generate_series(1,100000) gs WHERE dim_phone_numbers.dim_phone_number_key = 999901; +ANALYZE dim_phone_numbers; +-- Table NON_WS_PHONE_LEADS has two distribution keys +-- Equality condition with constant on one distribution key +-- Redistribute over Append +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY +FROM NON_WS_PHONE_LEADS PL +LEFT outer JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY = DPN.DIM_PHONE_NUMBER_KEY +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441; + duration_second | dim_program_key | dim_site_key | dim_date_key +-----------------+-----------------+--------------+-------------- + 207 | 79 | 999901 | 2455441 +(1 row) + +-- Table NON_WS_PHONE_LEADS has two distribution keys +-- Equality conditions with constants on all distribution keys +-- Redistribute over Append +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY +FROM NON_WS_PHONE_LEADS PL +LEFT outer JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY = DPN.DIM_PHONE_NUMBER_KEY +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441 +AND PL.dim_site_key = 999901; + duration_second | dim_program_key | dim_site_key | dim_date_key +-----------------+-----------------+--------------+-------------- + 207 | 79 | 999901 | 2455441 +(1 row) + +-- Table NON_WS_PHONE_LEADS has two distribution keys +-- Broadcast over Append +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY +FROM NON_WS_PHONE_LEADS PL +JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY = DPN.DIM_PHONE_NUMBER_KEY +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441 +AND PL.dim_site_key = 999901; + duration_second | dim_program_key | dim_site_key | dim_date_key +-----------------+-----------------+--------------+-------------- + 207 | 79 | 999901 | 2455441 +(1 row) + +-- Join condition uses functions +-- Broadcast over Append +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY +FROM NON_WS_PHONE_LEADS PL +JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY + 1 = DPN.DIM_PHONE_NUMBER_KEY + 1 +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441 +AND PL.dim_site_key = 999901; + duration_second | dim_program_key | dim_site_key | dim_date_key +-----------------+-----------------+--------------+-------------- + 207 | 79 | 999901 | 2455441 +(1 row) + +-- Equality condition with constant on one distribution key +-- Redistribute over Append +-- Accessing a varchar in the SELECT clause should cause a SIGSEGV +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY, source_system_lead_id +FROM NON_WS_PHONE_LEADS PL +LEFT outer JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY = DPN.DIM_PHONE_NUMBER_KEY +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441; + duration_second | dim_program_key | dim_site_key | dim_date_key | source_system_lead_id +-----------------+-----------------+--------------+--------------+----------------------- + 207 | 79 | 999901 | 2455441 | CA6qOEyxOmNJUQC7 +(1 row) + +DROP TABLE non_ws_phone_leads; +DROP TABLE dim_phone_numbers; +-- Equality condition with a constant expression on one distribution key +drop table if exists foo_p; +NOTICE: table "foo_p" does not exist, skipping +drop table if exists bar; +NOTICE: table "bar" does not exist, skipping +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar( a int, b int, k int, t text, p int); +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar; +set optimizer_segments = 3; +set optimizer_nestloop_factor = 1.0; +explain select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1]; + QUERY PLAN +-------------------------------------------------------------------------------------------- + Hash Right Join (cost=17.62..445.93 rows=13416 width=31) + Hash Cond: (bar.k = foo_p.a) + -> Seq Scan on bar (cost=0.00..288.25 rows=2236 width=4) + Filter: (k = 1) + -> Hash (cost=17.54..17.54 rows=6 width=35) + -> Append (cost=0.00..17.54 rows=6 width=35) + -> Seq Scan on foo_p_1_prt_2 foo_p_1 (cost=0.00..3.50 rows=1 width=34) + Filter: ((t IS NOT NULL) AND (a = 1)) + -> Seq Scan on foo_p_1_prt_3 foo_p_2 (cost=0.00..3.50 rows=1 width=34) + Filter: ((t IS NOT NULL) AND (a = 1)) + -> Seq Scan on foo_p_1_prt_4 foo_p_3 (cost=0.00..3.50 rows=1 width=34) + Filter: ((t IS NOT NULL) AND (a = 1)) + -> Seq Scan on foo_p_1_prt_5 foo_p_4 (cost=0.00..3.50 rows=1 width=34) + Filter: ((t IS NOT NULL) AND (a = 1)) + -> Seq Scan on foo_p_1_prt_6 foo_p_5 (cost=0.00..3.50 rows=1 width=34) + Filter: ((t IS NOT NULL) AND (a = 1)) + -> Seq Scan on foo_p_1_prt_other foo_p_6 (cost=0.00..0.01 rows=1 width=40) + Filter: ((t IS NOT NULL) AND (a = 1)) + Optimizer: Postgres query optimizer +(19 rows) + +reset optimizer_segments; +drop table if exists foo_p; +drop table if exists bar; +-- MPP-18457, MPP-18415 end +drop table if exists pnx; +NOTICE: table "pnx" does not exist, skipping +create table pnx + (x int , y text) + + partition by list (y) + ( + partition a values ('x1', 'x2'), + partition c values ('x3', 'x4') + ); +insert into pnx values + (1,'x1'), + (2,'x2'), + (3,'x3'), + (4,'x4'); +select tableoid::regclass, * +from pnx; + tableoid | x | y +-------------+---+---- + pnx_1_prt_a | 1 | x1 + pnx_1_prt_a | 2 | x2 + pnx_1_prt_c | 3 | x3 + pnx_1_prt_c | 4 | x4 +(4 rows) + +alter table pnx + split partition a at ('x1') + into (partition b, partition c); +ERROR: relation "pnx_1_prt_c" already exists +select tableoid::regclass, * +from pnx; + tableoid | x | y +-------------+---+---- + pnx_1_prt_a | 1 | x1 + pnx_1_prt_a | 2 | x2 + pnx_1_prt_c | 3 | x3 + pnx_1_prt_c | 4 | x4 +(4 rows) + +select tableoid::regclass, * +from pnx +where y = 'x1'; + tableoid | x | y +-------------+---+---- + pnx_1_prt_a | 1 | x1 +(1 row) + +select tableoid::regclass, * +from pnx +where x = 1; + tableoid | x | y +-------------+---+---- + pnx_1_prt_a | 1 | x1 +(1 row) + +drop table if exists pxn; +NOTICE: table "pxn" does not exist, skipping +create table pxn + (x int , y text) + + partition by list (y) + ( + partition a values ('x1', 'x2'), + partition c values ('x3', 'x4') + ); +insert into pxn values + (1,'x1'), + (2,'x2'), + (3,'x3'), + (4,'x4'); +select tableoid::regclass, * +from pxn; + tableoid | x | y +-------------+---+---- + pxn_1_prt_a | 1 | x1 + pxn_1_prt_a | 2 | x2 + pxn_1_prt_c | 3 | x3 + pxn_1_prt_c | 4 | x4 +(4 rows) + +alter table pxn + split partition a at ('x1') + into (partition c, partition b); +ERROR: relation "pxn_1_prt_c" already exists +select tableoid::regclass, * +from pxn; + tableoid | x | y +-------------+---+---- + pxn_1_prt_a | 1 | x1 + pxn_1_prt_a | 2 | x2 + pxn_1_prt_c | 3 | x3 + pxn_1_prt_c | 4 | x4 +(4 rows) + +select tableoid::regclass, * +from pxn +where y = 'x2'; + tableoid | x | y +-------------+---+---- + pxn_1_prt_a | 2 | x2 +(1 row) + +select tableoid::regclass, * +from pxn +where x = 2; + tableoid | x | y +-------------+---+---- + pxn_1_prt_a | 2 | x2 +(1 row) + +drop table if exists pxn; +create table pxn + (x int , y int) + + partition by range (y) + ( + partition a start (0) end (10), + partition c start (11) end (20) + ); +insert into pxn values + (4,4), + (9,9), + (14,14), + (19,19); +select tableoid::regclass, * +from pxn; + tableoid | x | y +-------------+----+---- + pxn_1_prt_a | 4 | 4 + pxn_1_prt_a | 9 | 9 + pxn_1_prt_c | 14 | 14 + pxn_1_prt_c | 19 | 19 +(4 rows) + +alter table pxn + split partition a at (5) + into (partition b, partition c); +ERROR: relation "pxn_1_prt_c" already exists +select tableoid::regclass, * +from pxn; + tableoid | x | y +-------------+----+---- + pxn_1_prt_a | 4 | 4 + pxn_1_prt_a | 9 | 9 + pxn_1_prt_c | 14 | 14 + pxn_1_prt_c | 19 | 19 +(4 rows) + +select tableoid::regclass, * +from pxn +where y = 4; + tableoid | x | y +-------------+---+--- + pxn_1_prt_a | 4 | 4 +(1 row) + +select tableoid::regclass, * +from pxn +where x = 4; + tableoid | x | y +-------------+---+--- + pxn_1_prt_a | 4 | 4 +(1 row) + +drop table if exists pxn; +create table pxn + (x int , y int) + + partition by range (y) + ( + partition a start (0) end (10), + partition c start (11) end (20) + ); +insert into pxn values + (4,4), + (9,9), + (14,14), + (19,19); +select tableoid::regclass, * +from pxn; + tableoid | x | y +-------------+----+---- + pxn_1_prt_a | 4 | 4 + pxn_1_prt_a | 9 | 9 + pxn_1_prt_c | 14 | 14 + pxn_1_prt_c | 19 | 19 +(4 rows) + +alter table pxn + split partition a at (5) + into (partition c, partition b); +ERROR: relation "pxn_1_prt_c" already exists +select tableoid::regclass, * +from pxn; + tableoid | x | y +-------------+----+---- + pxn_1_prt_a | 4 | 4 + pxn_1_prt_a | 9 | 9 + pxn_1_prt_c | 14 | 14 + pxn_1_prt_c | 19 | 19 +(4 rows) + +select tableoid::regclass, * +from pxn +where y = 9; + tableoid | x | y +-------------+---+--- + pxn_1_prt_a | 9 | 9 +(1 row) + +select tableoid::regclass, * +from pxn +where x = 9; + tableoid | x | y +-------------+---+--- + pxn_1_prt_a | 9 | 9 +(1 row) + +-- MPP-18359 end +-- MPP-19105 +-- Base partitions with trailing dropped columns +create table parttest_t ( + a int, + b int, + c char, + d varchar(50) +) +partition by range (a) +( + partition p1 start(1) end(5), + partition p2 start(5) +); +-- Drop column +alter table parttest_t drop column d; +-- Alter table split partition +alter table parttest_t split partition for(1) at (2) into (partition p11, partition p22); +insert into parttest_t values(1,2,'a'); +select * from parttest_t; + a | b | c +---+---+--- + 1 | 2 | a +(1 row) + +-- END MPP-19105 +reset optimizer_nestloop_factor; +-- Sub-partition insertion with checking if the user provided correct leaf part +create table part_tab ( i int, j int) partition by range(j) (start(0) end(10) every(2)); +-- Wrong part +insert into part_tab_1_prt_1 values(5,5); +ERROR: new row for relation "part_tab_1_prt_1" violates partition constraint +DETAIL: Failing row contains (5, 5). +select * from part_tab; + i | j +---+--- +(0 rows) + +select * from part_tab_1_prt_1; + i | j +---+--- +(0 rows) + +insert into part_tab_1_prt_2 values(5,5); +ERROR: new row for relation "part_tab_1_prt_2" violates partition constraint +DETAIL: Failing row contains (5, 5). +select * from part_tab; + i | j +---+--- +(0 rows) + +select * from part_tab_1_prt_2; + i | j +---+--- +(0 rows) + +-- Right part +insert into part_tab_1_prt_3 values(5,5); +analyze part_tab; +select * from part_tab; + i | j +---+--- + 5 | 5 +(1 row) + +select * from part_tab_1_prt_3; + i | j +---+--- + 5 | 5 +(1 row) + +-- Root part +insert into part_tab values(5,5); +select * from part_tab; + i | j +---+--- + 5 | 5 + 5 | 5 +(2 rows) + +drop table if exists input1; +NOTICE: table "input1" does not exist, skipping +create table input1 (x int, y int); +insert into input1 select i, i from (select generate_series(1,10) as i) as t; +drop table if exists input2; +NOTICE: table "input2" does not exist, skipping +create table input2 (x int, y int); +insert into input2 select i, i from (select generate_series(1,10) as i) as t; +-- Multiple range table entries in the plan +insert into part_tab_1_prt_1 select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x where i2.y = 5; +ERROR: new row for relation "part_tab_1_prt_1" violates partition constraint +DETAIL: Failing row contains (5, 5). +analyze part_tab; +select * from part_tab; + i | j +---+--- + 5 | 5 + 5 | 5 +(2 rows) + +select * from part_tab_1_prt_1; + i | j +---+--- +(0 rows) + +insert into part_tab_1_prt_2 select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x where i2.y = 5; +ERROR: new row for relation "part_tab_1_prt_2" violates partition constraint +DETAIL: Failing row contains (5, 5). +select * from part_tab; + i | j +---+--- + 5 | 5 + 5 | 5 +(2 rows) + +select * from part_tab_1_prt_2; + i | j +---+--- +(0 rows) + +-- Right part +insert into part_tab_1_prt_3 select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x where i1.x between 4 and 5; +select * from part_tab; + i | j +---+--- + 5 | 5 + 5 | 5 + 4 | 4 + 5 | 5 +(4 rows) + +select * from part_tab_1_prt_3; + i | j +---+--- + 5 | 5 + 5 | 5 + 4 | 4 + 5 | 5 +(4 rows) + +-- Root part but no matching part for i2.y == 10 +insert into part_tab select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x; +ERROR: no partition of relation "part_tab" found for row +DETAIL: Partition key of the failing row contains (j) = (10). +select * from part_tab; + i | j +---+--- + 5 | 5 + 5 | 5 + 4 | 4 + 5 | 5 +(4 rows) + +-- Root part +insert into part_tab select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x where i2.y < 10; +select * from part_tab; + i | j +---+--- + 1 | 1 + 2 | 2 + 3 | 3 + 5 | 5 + 5 | 5 + 4 | 4 + 5 | 5 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 +(13 rows) + +-- Multi-level partitioning +create table deep_part ( i int, j int, k int, s char(5)) +partition by list(s) +subpartition by range (j) subpartition template (start(1) end(10) every(2)) +subpartition by range (k) subpartition template (start(1) end(10) every(2)) +(partition female values('F'), partition male values('M')) +; +-- Intermediate partition insert is allowed +insert into deep_part_1_prt_male_2_prt_2 values(1,3,1,'M'); +-- but only if it's the right partition. +insert into deep_part_1_prt_male_2_prt_2 values(1,1,1,'M'); +ERROR: new row for relation "deep_part_1_prt_male_2_prt_2" violates partition constraint +DETAIL: Failing row contains (1, 1, 1, M ). +-- Wrong sub-partition (inserting a female value in male partition) +insert into deep_part_1_prt_male_2_prt_2_3_prt_2 values (1, 1, 1, 'F'); +ERROR: new row for relation "deep_part_1_prt_male_2_prt_2_3_prt_2" violates partition constraint +DETAIL: Failing row contains (1, 1, 1, F ). +select * from deep_part; + i | j | k | s +---+---+---+------- + 1 | 3 | 1 | M +(1 row) + +-- Correct leaf part +insert into deep_part_1_prt_male_2_prt_1_3_prt_1 values (1, 1, 1, 'M'); +analyze deep_part; +select * from deep_part; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | M + 1 | 3 | 1 | M +(2 rows) + +select * from deep_part_1_prt_male_2_prt_1_3_prt_1; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | M +(1 row) + +-- Root part of a multi-level partitioned table +insert into deep_part values (1, 1, 1, 'M'); +select * from deep_part; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | M + 1 | 1 | 1 | M + 1 | 3 | 1 | M +(3 rows) + +select * from deep_part_1_prt_male_2_prt_1_3_prt_1; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | M + 1 | 1 | 1 | M +(2 rows) + +insert into deep_part values (1, 1, 1, 'F'); +select * from deep_part; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | F + 1 | 1 | 1 | M + 1 | 1 | 1 | M + 1 | 3 | 1 | M +(4 rows) + +select * from deep_part_1_prt_female_2_prt_1_3_prt_1; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | F +(1 row) + +insert into deep_part values (5, 5, 5, 'M'); +select * from deep_part; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | F + 1 | 1 | 1 | M + 1 | 1 | 1 | M + 1 | 3 | 1 | M + 5 | 5 | 5 | M +(5 rows) + +select * from deep_part_1_prt_male_2_prt_3_3_prt_3; + i | j | k | s +---+---+---+------- + 5 | 5 | 5 | M +(1 row) + +insert into deep_part values (9, 9, 9, 'F'); +select * from deep_part; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | F + 9 | 9 | 9 | F + 1 | 1 | 1 | M + 1 | 1 | 1 | M + 1 | 3 | 1 | M + 5 | 5 | 5 | M +(6 rows) + +select * from deep_part_1_prt_female_2_prt_5_3_prt_5; + i | j | k | s +---+---+---+------- + 9 | 9 | 9 | F +(1 row) + +-- Out of range partition +insert into deep_part values (9, 9, 10, 'F'); +ERROR: no partition of relation "deep_part_1_prt_female_2_prt_5" found for row +DETAIL: Partition key of the failing row contains (k) = (10). +select * from deep_part; + i | j | k | s +---+---+---+------- + 1 | 1 | 1 | F + 9 | 9 | 9 | F + 1 | 1 | 1 | M + 1 | 1 | 1 | M + 1 | 3 | 1 | M + 5 | 5 | 5 | M +(6 rows) + +drop table input2; +drop table input1; +-- Avoid TupleDesc leak when COPY partition table from files +-- This also covers the bug reported in MPP-9548 where insertion +-- into a dropped/added column yielded incorrect results +drop table if exists pt_td_leak; +NOTICE: table "pt_td_leak" does not exist, skipping +CREATE TABLE pt_td_leak +( +col1 int, +col2 int, +col3 int +) +partition by range(col2) +( + partition part1 start(1) end(5), + partition part2 start(5) end(10) +); +insert into pt_td_leak select i,i,i from generate_series(1,9) i; +copy pt_td_leak to '/tmp/pt_td_leak.out' csv; +alter table pt_td_leak drop column col3; +alter table pt_td_leak add column col3 int default 7; +drop table if exists pt_td_leak_exchange; +NOTICE: table "pt_td_leak_exchange" does not exist, skipping +CREATE TABLE pt_td_leak_exchange ( col1 int, col2 int, col3 int); +alter table pt_td_leak exchange partition part2 with table pt_td_leak_exchange; +insert into pt_td_leak values(1,8,1); +copy pt_td_leak from '/tmp/pt_td_leak.out' with delimiter ','; +select * from pt_td_leak where col1 = 5; + col1 | col2 | col3 +------+------+------ + 5 | 5 | 5 +(1 row) + +-- Check that data inserted into dropped/added column is correct +select * from pt_td_leak where col3 = 1; + col1 | col2 | col3 +------+------+------ + 1 | 1 | 1 + 1 | 8 | 1 +(2 rows) + +drop table pt_td_leak; +drop table pt_td_leak_exchange; +-- +-- Test COPY, when distribution keys have different attribute numbers, +-- because of dropped columns +-- +CREATE TABLE pt_dropped_col_distkey (i int, to_be_dropped text, t text) + PARTITION BY RANGE (i) (START (1) END(10) EVERY (5)); +INSERT INTO pt_dropped_col_distkey SELECT g, 'dropped' || g, 'before drop ' || g FROM generate_series(1, 7) g; +ALTER TABLE pt_dropped_col_distkey DROP COLUMN to_be_dropped; +-- This new partition won't have the dropped column. Because the distribution +-- key was after the dropped column, the attribute number of the distribution +-- key column will be different in this partition and the parent. +ALTER TABLE pt_dropped_col_distkey ADD PARTITION pt_dropped_col_distkey_new_part START (10) END (100); +INSERT INTO pt_dropped_col_distkey SELECT g, 'after drop ' || g FROM generate_series(8, 15) g; +SELECT * FROM pt_dropped_col_distkey ORDER BY i; + i | t +----+--------------- + 1 | before drop 1 + 2 | before drop 2 + 3 | before drop 3 + 4 | before drop 4 + 5 | before drop 5 + 6 | before drop 6 + 7 | before drop 7 + 8 | after drop 8 + 9 | after drop 9 + 10 | after drop 10 + 11 | after drop 11 + 12 | after drop 12 + 13 | after drop 13 + 14 | after drop 14 + 15 | after drop 15 +(15 rows) + +COPY pt_dropped_col_distkey TO '/tmp/pt_dropped_col_distkey.out'; +DELETE FROM pt_dropped_col_distkey; +COPY pt_dropped_col_distkey FROM '/tmp/pt_dropped_col_distkey.out'; +SELECT * FROM pt_dropped_col_distkey ORDER BY i; + i | t +----+--------------- + 1 | before drop 1 + 2 | before drop 2 + 3 | before drop 3 + 4 | before drop 4 + 5 | before drop 5 + 6 | before drop 6 + 7 | before drop 7 + 8 | after drop 8 + 9 | after drop 9 + 10 | after drop 10 + 11 | after drop 11 + 12 | after drop 12 + 13 | after drop 13 + 14 | after drop 14 + 15 | after drop 15 +(15 rows) + +-- don't drop the table, so that we have a partitioned table like this still +-- in the database, when we test pg_upgrade later. +-- +-- Test split default partition while per tuple memory context is reset +-- +drop table if exists test_split_part cascade; +NOTICE: table "test_split_part" does not exist, skipping +CREATE TABLE test_split_part ( log_id int NOT NULL, f_array int[] NOT NULL) +PARTITION BY RANGE(log_id) +( + START (1::int) END (100::int) EVERY (5) WITH (appendonly=false), + PARTITION "Old" START (101::int) END (201::int) WITH (appendonly=false), + DEFAULT PARTITION other_log_ids WITH (appendonly=false) +); +insert into test_split_part (log_id , f_array) select id, '{10}' from generate_series(1,1000) id; +ALTER TABLE test_split_part SPLIT DEFAULT PARTITION START (201) INCLUSIVE END (301) EXCLUSIVE INTO (PARTITION "New", DEFAULT PARTITION); +-- In GPDB 6 and below, an automatic array type was only created for the root +-- partition. Nowadays we rely on upstream partitioning code, which creates +-- an array type for all partition. +select typname, typtype, typcategory from pg_type where typname like '%test_split_part%' and typcategory = 'A'; + typname | typtype | typcategory +--------------------------------------+---------+------------- + _test_split_part | b | A + _test_split_part_1_prt_2 | b | A + _test_split_part_1_prt_3 | b | A + _test_split_part_1_prt_4 | b | A + _test_split_part_1_prt_5 | b | A + _test_split_part_1_prt_6 | b | A + _test_split_part_1_prt_7 | b | A + _test_split_part_1_prt_8 | b | A + _test_split_part_1_prt_9 | b | A + _test_split_part_1_prt_10 | b | A + _test_split_part_1_prt_11 | b | A + _test_split_part_1_prt_12 | b | A + _test_split_part_1_prt_13 | b | A + _test_split_part_1_prt_14 | b | A + _test_split_part_1_prt_15 | b | A + _test_split_part_1_prt_16 | b | A + _test_split_part_1_prt_17 | b | A + _test_split_part_1_prt_18 | b | A + _test_split_part_1_prt_19 | b | A + _test_split_part_1_prt_20 | b | A + _test_split_part_1_prt_21 | b | A + _test_split_part_1_prt_Old | b | A + _test_split_part_1_prt_New | b | A + _test_split_part_1_prt_other_log_ids | b | A +(24 rows) + +select array_agg(test_split_part) from test_split_part where log_id = 500; + array_agg +---------------- + {"(500,{10})"} +(1 row) + +select array_agg(test_split_part_1_prt_other_log_ids) from test_split_part_1_prt_other_log_ids where log_id = 500; + array_agg +---------------- + {"(500,{10})"} +(1 row) + +-- Originally reported in MPP-7232 +create table mpp7232a (a int, b int) partition by range (b) (start (1) end (3) every (1)); +\d+ mpp7232a + Partitioned table "public.mpp7232a" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp7232a_1_prt_1 FOR VALUES FROM (1) TO (2), + mpp7232a_1_prt_2 FOR VALUES FROM (2) TO (3) + +alter table mpp7232a rename partition for (1) to alpha; +alter table mpp7232a rename partition for (2) to bravo; +\d+ mpp7232a + Partitioned table "public.mpp7232a" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp7232a_1_prt_alpha FOR VALUES FROM (1) TO (2), + mpp7232a_1_prt_bravo FOR VALUES FROM (2) TO (3) + +create table mpp7232b (a int, b int) partition by range (b) (partition alpha start (1) end (3) every (1)); +alter table mpp7232b rename partition for (1) to foo; +\d+ mpp7232b + Partitioned table "public.mpp7232b" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: mpp7232b_1_prt_alpha_2 FOR VALUES FROM (2) TO (3), + mpp7232b_1_prt_foo FOR VALUES FROM (1) TO (2) + +-- Test .. WITH (tablename = ..) syntax. +create table mpp17740 (a integer, b integer, e date) with (appendonly = true, orientation = column) +partition by range(e) +( + partition mpp17740_20120523 start ('2012-05-23'::date) inclusive end ('2012-05-24'::date) exclusive with (tablename = 'mpp17740_20120523', appendonly = true), + partition mpp17740_20120524 start ('2012-05-24'::date) inclusive end ('2012-05-25'::date) exclusive with (tablename = 'mpp17740_20120524', appendonly = true) +); +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp17740%'; + relname | pg_get_expr +-------------------+-------------------------------------------------- + mpp17740 | + mpp17740_20120523 | FOR VALUES FROM ('05-23-2012') TO ('05-24-2012') + mpp17740_20120524 | FOR VALUES FROM ('05-24-2012') TO ('05-25-2012') +(3 rows) + +alter table mpp17740 add partition mpp17740_20120520 start ('2012-05-20'::date) inclusive end ('2012-05-21'::date) exclusive with (tablename = 'mpp17740_20120520', appendonly=true); +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp17740%'; + relname | pg_get_expr +-------------------+-------------------------------------------------- + mpp17740 | + mpp17740_20120520 | FOR VALUES FROM ('05-20-2012') TO ('05-21-2012') + mpp17740_20120523 | FOR VALUES FROM ('05-23-2012') TO ('05-24-2012') + mpp17740_20120524 | FOR VALUES FROM ('05-24-2012') TO ('05-25-2012') +(4 rows) + +-- Test mix of add and drop various column before split, and exchange partition at the end +create table sales (pkid serial, option1 int, option2 int, option3 int, constraint partable_pkey primary key(pkid, option3)) + partition by range (option3) +( + partition aa start(1) end(100), + partition bb start(101) end(200), + partition cc start(201) end (300) +); +-- should error out since no subpartition in sales. +alter table sales add partition dd start(301) end(300) + ( subpartition opt1_1 VALUES (1), + subpartition opt1_2 VALUES (2) ); +ERROR: subpartition specification provided but table doesn't have SUBPARTITION BY clause +LINE 2: ( subpartition opt1_1 VALUES (1), + ^ +-- root partition (and only root) should have relfrozenxid as 0 +select relname, relkind from pg_class where relkind in ('r', 'p') and relname like 'sales%' and relfrozenxid=0; + relname | relkind +---------+--------- + sales | p +(1 row) + +-- start_ignore +select gp_segment_id, relname, relkind from gp_dist_random('pg_class') where relkind in ('r', 'p') and relname like 'sales%' and relfrozenxid=0; + gp_segment_id | relname | relkind +---------------+---------+--------- + -1 | sales | p +(1 row) +-- end_ignore +alter table sales add column tax float; +-- root partition (and only root) continues to have relfrozenxid as 0 +select relname, relkind from pg_class where relkind in ('r', 'p') and relname like 'sales%' and relfrozenxid=0; + relname | relkind +---------+--------- + sales | p +(1 row) + +-- start_ignore +select gp_segment_id, relname, relkind from gp_dist_random('pg_class') where relkind in ('r', 'p') and relname like 'sales%' and relfrozenxid=0; + gp_segment_id | relname | relkind +---------------+---------+--------- + -1 | sales | p +(1 row) +-- end_ignore +alter table sales drop column tax; +create table newpart(like sales); +alter table newpart add constraint newpart_pkey primary key(pkid, option3); +alter table sales split partition for(1) at (50) into (partition aa1, partition aa2); +select table_schema, table_name, constraint_name, constraint_type + from information_schema.table_constraints + where table_name in ('sales', 'newpart') + and constraint_name in ('partable_pkey', 'newpart_pkey') + order by table_name desc; + table_schema | table_name | constraint_name | constraint_type +--------------+------------+-----------------+----------------- + public | sales | partable_pkey | PRIMARY KEY + public | newpart | newpart_pkey | PRIMARY KEY +(2 rows) + +alter table sales exchange partition for (101) with table newpart; +select * from sales order by pkid; + pkid | option1 | option2 | option3 +------+---------+---------+--------- +(0 rows) + +-- Create exchange table before drop column, make sure the consistency check still exist +create table newpart2(like sales); +alter table sales drop column option2; +alter table sales exchange partition for (101) with table newpart2; +ERROR: table "newpart2" contains column "option2" not found in parent "sales" +DETAIL: The new partition may contain only the columns present in parent. +select * from sales order by pkid; + pkid | option1 | option3 +------+---------+--------- +(0 rows) + +drop table sales cascade; +NOTICE: drop cascades to default value for column pkid of table newpart +-- Exchage partiton table with a table having dropped column +create table exchange_part(a int, b int) partition by range(b) (start (0) end (10) every (5)); +create table exchange1(a int, c int, b int); +alter table exchange1 drop column c; +alter table exchange_part exchange partition for (1) with table exchange1; +copy exchange_part from STDIN DELIMITER as '|'; +select * from exchange_part; + a | b +------+--- + 9794 | 1 + 9795 | 2 + 9797 | 3 + 9799 | 4 + 9808 | 1 + 9810 | 2 + 9814 | 3 + 9815 | 4 + 9827 | 1 + 9828 | 2 + 9831 | 3 + 9832 | 4 + 9801 | 5 + 9802 | 6 + 9803 | 7 + 9806 | 8 + 9807 | 9 + 9817 | 5 + 9818 | 6 + 9822 | 7 + 9824 | 8 + 9825 | 9 + 9836 | 5 + 9840 | 6 + 9843 | 7 + 9844 | 8 +(26 rows) + +drop table exchange_part; +drop table exchange1; +-- Ensure that new partitions get the correct attributes (MPP17110) +CREATE TABLE pt_tab_encode (a int, b text) +with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) +partition by list(b) (partition s_abc values ('abc') with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1)); +alter table pt_tab_encode add partition "s_xyz" values ('xyz') WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'pt_tab_encode%'; + relname | pg_get_expr +---------------------------+----------------------- + pt_tab_encode | + pt_tab_encode_1_prt_s_abc | FOR VALUES IN ('abc') + pt_tab_encode_1_prt_s_xyz | FOR VALUES IN ('xyz') +(3 rows) + +select gp_segment_id, attrelid::regclass, attnum, attoptions from pg_attribute_encoding where attrelid = 'pt_tab_encode_1_prt_s_abc'::regclass; + gp_segment_id | attrelid | attnum | attoptions +---------------+---------------------------+--------+----------------------------------------------------- + -1 | pt_tab_encode_1_prt_s_abc | 1 | {compresstype=zlib,compresslevel=1,blocksize=32768} + -1 | pt_tab_encode_1_prt_s_abc | 2 | {compresstype=zlib,compresslevel=1,blocksize=32768} +(2 rows) + +-- start_ignore +select gp_segment_id, attrelid::regclass, attnum, attoptions from gp_dist_random('pg_attribute_encoding') where attrelid = 'pt_tab_encode_1_prt_s_abc'::regclass order by 1,3 limit 5; + gp_segment_id | attrelid | attnum | attoptions +---------------+---------------------------+--------+----------------------------------------------------- + -1 | pt_tab_encode_1_prt_s_abc | 1 | {compresstype=zlib,compresslevel=1,blocksize=32768} + -1 | pt_tab_encode_1_prt_s_abc | 2 | {compresstype=zlib,compresslevel=1,blocksize=32768} +(2 rows) +-- end_ignore +select gp_segment_id, attrelid::regclass, attnum, attoptions from pg_attribute_encoding where attrelid = 'pt_tab_encode_1_prt_s_xyz'::regclass; + gp_segment_id | attrelid | attnum | attoptions +---------------+---------------------------+--------+----------------------------------------------------- + -1 | pt_tab_encode_1_prt_s_xyz | 1 | {compresstype=zlib,compresslevel=1,blocksize=32768} + -1 | pt_tab_encode_1_prt_s_xyz | 2 | {compresstype=zlib,compresslevel=1,blocksize=32768} +(2 rows) + +-- start_ignore +select gp_segment_id, attrelid::regclass, attnum, attoptions from gp_dist_random('pg_attribute_encoding') where attrelid = 'pt_tab_encode_1_prt_s_xyz'::regclass order by 1,3 limit 5; + gp_segment_id | attrelid | attnum | attoptions +---------------+---------------------------+--------+----------------------------------------------------- + -1 | pt_tab_encode_1_prt_s_xyz | 1 | {compresstype=zlib,compresslevel=1,blocksize=32768} + -1 | pt_tab_encode_1_prt_s_xyz | 2 | {compresstype=zlib,compresslevel=1,blocksize=32768} +(2 rows) +-- end_ignore +select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = relam where c.oid = 'pt_tab_encode_1_prt_s_abc'::regclass; + oid | relkind | amname | reloptions +---------------------------+---------+-----------+------------------------------------- + pt_tab_encode_1_prt_s_abc | r | ao_column | {compresstype=zlib,compresslevel=1} +(1 row) + +select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = relam where c.oid = 'pt_tab_encode_1_prt_s_xyz'::regclass; + oid | relkind | amname | reloptions +---------------------------+---------+-----------+------------------------------------- + pt_tab_encode_1_prt_s_xyz | r | ao_column | {compresstype=zlib,compresslevel=1} +(1 row) + +-- Ensure that only the correct type of partitions can be added +create table at_range (a int) partition by range (a) (start(1) end(5)); +create table at_list (i int) partition by list(i) (partition p1 values(1)); +alter table at_list add partition foo2 start(6) end (10); +ERROR: invalid boundary specification for LIST partition +LINE 1: alter table at_list add partition foo2 start(6) end (10); + ^ +alter table at_range add partition test values(5); +ERROR: invalid boundary specification for RANGE partition +LINE 1: alter table at_range add partition test values(5); + ^ +-- Ensure array type for the non-partition table is there after partition exchange. +CREATE TABLE pt_xchg(a int) PARTITION BY RANGE(a) (START(1) END(4) EVERY (2)); +create table xchg_tab1(a int); +CREATE SCHEMA xchg_schema; +create table xchg_schema.xchg_tab2(a int); +alter table pt_xchg exchange partition for (1) with table xchg_tab1; +alter table pt_xchg exchange partition for (3) with table xchg_schema.xchg_tab2; +select a.typowner=b.typowner from pg_type a join pg_type b on true where a.typname = 'xchg_tab1' and b.typname = '_xchg_tab1'; + ?column? +---------- + t +(1 row) + +select nspname from pg_namespace join pg_type on pg_namespace.oid = pg_type.typnamespace where pg_type.typname = 'xchg_tab1' or pg_type.typname = '_xchg_tab1'; + nspname +--------- + public + public +(2 rows) + +select nspname from pg_namespace join pg_type on pg_namespace.oid = pg_type.typnamespace where pg_type.typname = 'xchg_tab2' or pg_type.typname = '_xchg_tab2'; + nspname +------------- + xchg_schema + xchg_schema +(2 rows) + +select typname from pg_type where typelem = 'xchg_tab1'::regtype; + typname +------------ + _xchg_tab1 +(1 row) + +select typname from pg_type where typelem = 'xchg_schema.xchg_tab2'::regtype; + typname +------------ + _xchg_tab2 +(1 row) + +select typname from pg_type where typarray = '_xchg_tab1'::regtype; + typname +----------- + xchg_tab1 +(1 row) + +select typname from pg_type where typarray = 'xchg_schema._xchg_tab2'::regtype; + typname +----------- + xchg_tab2 +(1 row) + +alter table pt_xchg exchange partition for (1) with table xchg_tab1; +select a.typowner=b.typowner from pg_type a join pg_type b on true where a.typname = 'xchg_tab1' and b.typname = '_xchg_tab1'; + ?column? +---------- + t +(1 row) + +select nspname from pg_namespace join pg_type on pg_namespace.oid = pg_type.typnamespace where pg_type.typname = 'xchg_tab1' or pg_type.typname = '_xchg_tab1'; + nspname +--------- + public + public +(2 rows) + +select typname from pg_type where typelem = 'xchg_tab1'::regtype; + typname +------------ + _xchg_tab1 +(1 row) + +select typname from pg_type where typarray = '_xchg_tab1'::regtype; + typname +----------- + xchg_tab1 +(1 row) + +-- Test with an incomplete operator class. Create a custom operator class and +-- only define equality on it. You can't do much with that. +-- +-- Before GPDB 7, Cloudberry used to allow creating the table, but you got an +-- error when inserting to it. Nowadays we rely on PostgreSQL partitioning +-- code, which rejects it at CREATE TABLE already. +create type employee_type as (empid int, empname text); +create function emp_equal(employee_type, employee_type) returns boolean + as 'select $1.empid = $2.empid;' + language sql + immutable + returns null on null input; +create operator = ( + leftarg = employee_type, + rightarg = employee_type, + procedure = emp_equal +); +create operator class employee_incomplete_op_class default for type employee_type + using btree as + operator 3 =; +create table employee_table(timest date, user_id numeric(16,0) not null, tag1 char(5), emp employee_type) + partition by list(emp) + (partition part1 values('(1, ''foo'')'::employee_type), partition part2 values('(2, ''foo'')'::employee_type)); +ERROR: operator class "employee_incomplete_op_class" of access method btree is missing support function 1 for type employee_type +-- Test partition table with ACL. +-- We grant default SELECT permission to a new user, this new user should be +-- able to SELECT from any partition table we create later. +-- (https://github.com/greenplum-db/gpdb/issues/9524) +DROP TABLE IF EXISTS public.t_part_acl; +NOTICE: table "t_part_acl" does not exist, skipping +DROP ROLE IF EXISTS user_prt_acl; +CREATE ROLE user_prt_acl; +ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user_prt_acl; +CREATE TABLE public.t_part_acl (dt date) +PARTITION BY RANGE (dt) +( + START (date '2019-12-01') INCLUSIVE + END (date '2020-02-01') EXCLUSIVE + EVERY (INTERVAL '1 month') +); +INSERT INTO public.t_part_acl VALUES (date '2019-12-01'), (date '2020-01-31'); +-- check if parent and child table have same relacl +SELECT relname FROM pg_class +WHERE relname LIKE 't_part_acl%' + AND relacl = (SELECT relacl FROM pg_class WHERE relname = 't_part_acl'); + relname +-------------------- + t_part_acl + t_part_acl_1_prt_1 + t_part_acl_1_prt_2 +(3 rows) + +-- check if new user can SELECT all data +SET ROLE user_prt_acl; +SELECT * FROM public.t_part_acl; + dt +------------ + 12-01-2019 + 01-31-2020 +(2 rows) + +RESET ROLE; +DROP TABLE public.t_part_acl; +ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM user_prt_acl; +DROP ROLE user_prt_acl; diff --git a/src/test/singlenode_regress/expected/partition1.out b/src/test/singlenode_regress/expected/partition1.out new file mode 100644 index 00000000000..496dc20152f --- /dev/null +++ b/src/test/singlenode_regress/expected/partition1.out @@ -0,0 +1,2703 @@ +drop table if exists d; +drop table if exists c; +drop table if exists b; +drop table if exists a; +--ERROR: Missing boundary specification in partition 'aa' of type LIST +create table fff (a char(1), b char(2), d char(3)) +partition by list (b) (partition aa ); +ERROR: missing boundary specification in partition "aa" of type LIST +LINE 2: partition by list (b) (partition aa ); + ^ +-- ERROR: Invalid use of RANGE boundary specification in partition +-- number 1 of type LIST +create table fff (a char(1), b char(2), d char(3)) +partition by list (b) (start ('a') ); +ERROR: invalid boundary specification for LIST partition +LINE 2: partition by list (b) (start ('a') ); + ^ +-- should work +create table fff (a char(1), b char(2), d char(3)) +partition by list (b) (partition aa values ('2')); +drop table fff cascade; +-- this is subtly wrong -- it defines 4 partitions +-- the problem is the comma before "end", which causes us to +-- generate 2 anonymous partitions. +-- This is an error: +-- ERROR: invalid use of mixed named and unnamed RANGE boundary specifications +create table ggg (a char(1), b int, d char(3)) +partition by range (b) +( +partition aa start ('2007'), end ('2008'), +partition bb start ('2008'), end ('2009') +); +ERROR: cannot derive ending value of partition based upon starting of next partition +LINE 4: partition aa start ('2007'), end ('2008'), + ^ +create table ggg (a char(1), b int) +partition by range(b) +( +partition aa start ('2007'), end ('2008') +); +ERROR: cannot derive ending value of partition based upon starting of next partition +LINE 4: partition aa start ('2007'), end ('2008') + ^ +drop table ggg cascade; +ERROR: table "ggg" does not exist +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01'), +partition bb start (date '2008-01-01') end (date '2009-01-01') +); +drop table ggg cascade; +-- Expressions are allowed +create table ggg (a char(1), b numeric, d numeric) +partition by range (b) +( +partition aa start (2007) end (2007+1), +partition bb start (2008) end (2009) +); +drop table ggg cascade; +-- Even volatile expressions are OK. They are evaluted immediately. +create table ggg (a char(1), b numeric, d numeric) +partition by range (b) +( +partition aa start (2007) end (2008+(random()*9)::integer), +partition bb start (2018) end (2019) +); +drop table ggg cascade; +-- too many columns for RANGE partition +create table ggg (a char(1), b numeric, d numeric) +partition by range (b,d) +( +partition aa start (2007,1) end (2008,2), +partition bb start (2008,2) end (2009,3) +); +ERROR: too many columns for RANGE partition -- only one column is allowed +drop table ggg cascade; +ERROR: table "ggg" does not exist +-- Mismatch between number of columns in PARTITION BY and in the START/END clauses +create table pby_mismatch (a char(1), b numeric, d numeric) +partition by range (b) +( + partition aa start (2007,1) end (2008), + partition bb start (2008,2) end (2009) +); +ERROR: number of START values should cover all partition key columns +LINE 4: partition aa start (2007,1) end (2008), + ^ +create table pby_mismatch (a char(1), b numeric, d numeric) +partition by range (b) +( + partition aa start (2007) end (2008,1), + partition bb start (2008) end (2009,1) +); +ERROR: number of END values should cover all partition key columns +LINE 4: partition aa start (2007) end (2008,1), + ^ +-- basic list partition +create table ggg (a char(1), b char(2), d char(3)) +partition by LIST (b) +( +partition aa values ('a', 'b', 'c', 'd'), +partition bb values ('e', 'f', 'g') +); +insert into ggg values ('x', 'a'); +insert into ggg values ('x', 'b'); +insert into ggg values ('x', 'c'); +insert into ggg values ('x', 'd'); +insert into ggg values ('x', 'e'); +insert into ggg values ('x', 'f'); +insert into ggg values ('x', 'g'); +insert into ggg values ('x', 'a'); +insert into ggg values ('x', 'b'); +insert into ggg values ('x', 'c'); +insert into ggg values ('x', 'd'); +insert into ggg values ('x', 'e'); +insert into ggg values ('x', 'f'); +insert into ggg values ('x', 'g'); +select * from ggg order by 1, 2; + a | b | d +---+----+--- + x | a | + x | a | + x | b | + x | b | + x | c | + x | c | + x | d | + x | d | + x | e | + x | e | + x | f | + x | f | + x | g | + x | g | +(14 rows) + +-- ok +select * from ggg_1_prt_aa order by 1, 2; + a | b | d +---+----+--- + x | a | + x | a | + x | b | + x | b | + x | c | + x | c | + x | d | + x | d | +(8 rows) + +select * from ggg_1_prt_bb order by 1, 2; + a | b | d +---+----+--- + x | e | + x | e | + x | f | + x | f | + x | g | + x | g | +(6 rows) + +drop table ggg cascade; +-- documentation example - partition by list and range +CREATE TABLE rank (id int, rank int, year date, gender +char(1)) +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01'), +start (date '2002-01-01'), +start (date '2003-01-01'), +start (date '2004-01-01'), +start (date '2005-01-01') +) +( + partition boys values ('M'), + partition girls values ('F') +); +insert into rank values (1, 1, date '2001-01-15', 'M'); +insert into rank values (2, 1, date '2002-02-15', 'M'); +insert into rank values (3, 1, date '2003-03-15', 'M'); +insert into rank values (4, 1, date '2004-04-15', 'M'); +insert into rank values (5, 1, date '2005-05-15', 'M'); +insert into rank values (6, 1, date '2001-01-15', 'F'); +insert into rank values (7, 1, date '2002-02-15', 'F'); +insert into rank values (8, 1, date '2003-03-15', 'F'); +insert into rank values (9, 1, date '2004-04-15', 'F'); +insert into rank values (10, 1, date '2005-05-15', 'F'); +select * from rank order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 1 | 1 | 01-15-2001 | M + 2 | 1 | 02-15-2002 | M + 3 | 1 | 03-15-2003 | M + 4 | 1 | 04-15-2004 | M + 5 | 1 | 05-15-2005 | M + 6 | 1 | 01-15-2001 | F + 7 | 1 | 02-15-2002 | F + 8 | 1 | 03-15-2003 | F + 9 | 1 | 04-15-2004 | F + 10 | 1 | 05-15-2005 | F +(10 rows) + +select * from rank_1_prt_boys order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 1 | 1 | 01-15-2001 | M + 2 | 1 | 02-15-2002 | M + 3 | 1 | 03-15-2003 | M + 4 | 1 | 04-15-2004 | M + 5 | 1 | 05-15-2005 | M +(5 rows) + +select * from rank_1_prt_girls order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 6 | 1 | 01-15-2001 | F + 7 | 1 | 02-15-2002 | F + 8 | 1 | 03-15-2003 | F + 9 | 1 | 04-15-2004 | F + 10 | 1 | 05-15-2005 | F +(5 rows) + +select * from rank_1_prt_girls_2_prt_1 order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 6 | 1 | 01-15-2001 | F +(1 row) + +select * from rank_1_prt_girls_2_prt_2 order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 7 | 1 | 02-15-2002 | F +(1 row) + +drop table rank cascade; +-- range list combo +create table ggg (a char(1), b date, d char(3), e numeric) +partition by range (b) +subpartition by list(d) +( +partition aa +start (date '2007-01-01') +end (date '2008-01-01') + (subpartition dd values ('1', '2', '3'), + subpartition ee values ('4', '5', '6')), +partition bb +start (date '2008-01-01') +end (date '2009-01-01') + (subpartition dd values ('1', '2', '3'), + subpartition ee values ('4', '5', '6')) +); +drop table ggg cascade; +-- demo ends here +-- LIST validation +-- duplicate partition name +CREATE TABLE rank (id int, rank int, year date, gender +char(1)) +partition by list (gender) +( + partition boys values ('M'), + partition girls values ('a'), + partition girls values ('b'), + partition girls values ('c'), + partition girls values ('d'), + partition girls values ('e'), + partition bob values ('M') +); +ERROR: relation "rank_1_prt_girls" already exists +-- duplicate values +CREATE TYPE rank_partkey AS (rank int, gender char(1)); +CREATE TABLE rank (id int, rankgender rank_partkey, year date) +partition by list (rankgender) +( + values (CAST ('(1,M)' AS rank_partkey)), + values (CAST ('(2,M)' AS rank_partkey)), + values (CAST ('(3,M)' AS rank_partkey)), + values (CAST ('(1,F)' AS rank_partkey)), + partition ff values (CAST ('(4,M)' AS rank_partkey)), + partition bb values (CAST ('(1,M)' AS rank_partkey)) +); +ERROR: partition "rank_1_prt_bb" would overlap partition "rank_1_prt_1" +LINE 9: partition bb values (CAST ('(1,M)' AS rank_partkey)) + ^ +-- RANGE validation +-- legal if end of aa not inclusive +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition aa start (date '2007-08-01') end (date '2008-01-01'), +partition bb start (date '2008-01-01') end (date '2008-03-01') +every (interval '10 days')); +drop table ggg cascade; +-- bad - legal if end of aa not inclusive +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01') inclusive, +partition bb start (date '2008-01-01') end (date '2009-01-01') +every (interval '10 days')); +ERROR: partition "ggg_1_prt_bb_1" would overlap partition "ggg_1_prt_aa" +drop table ggg cascade; +ERROR: table "ggg" does not exist +-- legal because start of bb not inclusive +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition aa start (date '2007-08-01') end (date '2008-01-01') inclusive, +partition bb start (date '2008-01-01') exclusive end (date '2008-03-01') +every (interval '10 days')); +drop table ggg cascade; +-- legal if end of aa not inclusive +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition bb start (date '2008-01-01') end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2008-01-01') +); +drop table ggg cascade; +-- bad - legal if end of aa not inclusive +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition bb start (date '2008-01-01') end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2008-01-01') inclusive +); +ERROR: partition "ggg_1_prt_aa" would overlap partition "ggg_1_prt_bb" +drop table ggg cascade; +ERROR: table "ggg" does not exist +-- legal because start of bb not inclusive +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition bb start (date '2008-01-01') exclusive end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2008-01-01') inclusive +); +drop table ggg cascade; +-- validate aa - start greater than end +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition bb start (date '2008-01-01') end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2006-01-01') +); +ERROR: empty range bound specified for partition "ggg_1_prt_aa" +DETAIL: Specified lower bound ('01-01-2007') is greater than or equal to upper bound ('01-01-2006'). +drop table ggg cascade; +ERROR: table "ggg" does not exist +-- formerly we could not set end of first partition because next is before +-- but we can sort them now so this is legal. +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition bb start (date '2008-01-01') , +partition aa start (date '2007-01-01') +); +drop table ggg cascade; +-- test cross type coercion +-- int -> char(N) +create table ggg (i int, a char(1)) +partition by list(a) +(partition aa values(1, 2)); +drop table ggg cascade; +-- int -> numeric +create table ggg (i int, n numeric(20, 2)) +partition by list(n) +(partition aa values(1.22, 4.1)); +drop table ggg cascade; +-- EVERY +-- the documentation example, rewritten with EVERY in a template +CREATE TABLE rank (id int, +rank int, year date, gender char(1)) +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01') +end (date '2006-01-01') every (interval '1 year')) ( +partition boys values ('M'), +partition girls values ('F') +); +insert into rank values (1, 1, date '2001-01-15', 'M'); +insert into rank values (2, 1, date '2002-02-15', 'M'); +insert into rank values (3, 1, date '2003-03-15', 'M'); +insert into rank values (4, 1, date '2004-04-15', 'M'); +insert into rank values (5, 1, date '2005-05-15', 'M'); +insert into rank values (6, 1, date '2001-01-15', 'F'); +insert into rank values (7, 1, date '2002-02-15', 'F'); +insert into rank values (8, 1, date '2003-03-15', 'F'); +insert into rank values (9, 1, date '2004-04-15', 'F'); +insert into rank values (10, 1, date '2005-05-15', 'F'); +select * from rank order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 1 | 1 | 01-15-2001 | M + 2 | 1 | 02-15-2002 | M + 3 | 1 | 03-15-2003 | M + 4 | 1 | 04-15-2004 | M + 5 | 1 | 05-15-2005 | M + 6 | 1 | 01-15-2001 | F + 7 | 1 | 02-15-2002 | F + 8 | 1 | 03-15-2003 | F + 9 | 1 | 04-15-2004 | F + 10 | 1 | 05-15-2005 | F +(10 rows) + +select * from rank_1_prt_boys order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 1 | 1 | 01-15-2001 | M + 2 | 1 | 02-15-2002 | M + 3 | 1 | 03-15-2003 | M + 4 | 1 | 04-15-2004 | M + 5 | 1 | 05-15-2005 | M +(5 rows) + +select * from rank_1_prt_girls order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 6 | 1 | 01-15-2001 | F + 7 | 1 | 02-15-2002 | F + 8 | 1 | 03-15-2003 | F + 9 | 1 | 04-15-2004 | F + 10 | 1 | 05-15-2005 | F +(5 rows) + +select * from rank_1_prt_girls_2_prt_1 order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 6 | 1 | 01-15-2001 | F +(1 row) + +select * from rank_1_prt_girls_2_prt_2 order by 1, 2, 3, 4; + id | rank | year | gender +----+------+------------+-------- + 7 | 1 | 02-15-2002 | F +(1 row) + +drop table rank cascade; +-- integer ranges work too +create table ggg (id integer, a integer) +partition by range (a) +(start (1) end (10) every (1)); +insert into ggg values (1, 1); +insert into ggg values (2, 2); +insert into ggg values (3, 3); +insert into ggg values (4, 4); +insert into ggg values (5, 5); +insert into ggg values (6, 6); +insert into ggg values (7, 7); +insert into ggg values (8, 8); +insert into ggg values (9, 9); +insert into ggg values (10, 10); +ERROR: no partition of relation "ggg" found for row +DETAIL: Partition key of the failing row contains (a) = (10). +select * from ggg order by 1, 2; + id | a +----+--- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 +(9 rows) + +select * from ggg_1_prt_1 order by 1, 2; + id | a +----+--- + 1 | 1 +(1 row) + +select * from ggg_1_prt_2 order by 1, 2; + id | a +----+--- + 2 | 2 +(1 row) + +select * from ggg_1_prt_3 order by 1, 2; + id | a +----+--- + 3 | 3 +(1 row) + +select * from ggg_1_prt_4 order by 1, 2; + id | a +----+--- + 4 | 4 +(1 row) + +drop table ggg cascade; +-- EVERY works by invoking the + operator. We haven't explictly documented +-- that user can create his own, but better still test it. +create domain funnytext as text; +create function funnytext_plus (funnytext, integer) returns funnytext +as $$ select (chr(ascii($1) + $2))::funnytext $$ language sql; +create operator pg_catalog.+ (function=funnytext_plus, leftarg=funnytext, rightarg=integer); +create table ggg (a char(1), t funnytext) +partition by range (t) +( + start ('aaa') end ('foobar') every (1) +); +\d+ ggg + Partitioned table "public.ggg" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+--------------+-----------+----------+---------+----------+--------------+------------- + a | character(1) | | | | extended | | + t | funnytext | | | | extended | | +Partition key: RANGE (t) +Partitions: ggg_1_prt_1 FOR VALUES FROM ('aaa') TO ('b'), + ggg_1_prt_2 FOR VALUES FROM ('b') TO ('c'), + ggg_1_prt_3 FOR VALUES FROM ('c') TO ('d'), + ggg_1_prt_4 FOR VALUES FROM ('d') TO ('e'), + ggg_1_prt_5 FOR VALUES FROM ('e') TO ('f'), + ggg_1_prt_6 FOR VALUES FROM ('f') TO ('foobar') + +drop table ggg cascade; +-- What if the + operator returns NULL? +create or replace function funnytext_plus (funnytext, integer) returns funnytext +as $$ select NULL::funnytext $$ language sql; +create table ggg (a char(1), t funnytext) +partition by range (t) +( + start ('aaa') end ('foobar') every (1) +); +ERROR: could not compute next partition boundary with EVERY, plus-operator returned NULL +LINE 4: start ('aaa') end ('foobar') every (1) + ^ +create table fff (a char(1), b char(2), d char(3)) +partition by list (b) (partition aa values ('2')); +drop table fff cascade; +create table ggg (a char(1), b numeric, d numeric) +partition by range (b,d) +( +partition aa start (2007,1) end (2008,2), +partition bb start (2008,2) end (2009,3) +); +ERROR: too many columns for RANGE partition -- only one column is allowed +drop table ggg cascade; +ERROR: table "ggg" does not exist +create table ggg (a char(1), b date, d char(3)) +partition by range (b) +( +partition bb start (date '2008-01-01') end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2006-01-01') +); +ERROR: empty range bound specified for partition "ggg_1_prt_aa" +DETAIL: Specified lower bound ('01-01-2007') is greater than or equal to upper bound ('01-01-2006'). +drop table ggg cascade; +ERROR: table "ggg" does not exist +-- append only tests +create table foz (i int, d date) with (appendonly = true) +partition by range (d) (start (date '2001-01-01') end (date '2005-01-01') +every(interval '1 year')); +insert into foz select i, '2001-01-01'::date + ('1 day'::interval * i) from +generate_series(1, 1000) i; +select count(*) from foz; + count +------- + 1000 +(1 row) + +select count(*) from foz_1_prt_1; + count +------- + 364 +(1 row) + +select min(d), max(d) from foz; + min | max +------------+------------ + 01-02-2001 | 09-28-2003 +(1 row) + +select min(d), max(d) from foz_1_prt_1; + min | max +------------+------------ + 01-02-2001 | 12-31-2001 +(1 row) + +select min(d), max(d) from foz_1_prt_2; + min | max +------------+------------ + 01-01-2002 | 12-31-2002 +(1 row) + +select min(d), max(d) from foz_1_prt_3; + min | max +------------+------------ + 01-01-2003 | 09-28-2003 +(1 row) + +select min(d), max(d) from foz_1_prt_4; + min | max +-----+----- + | +(1 row) + +drop table foz cascade; +-- copy test +create table foz (i int, d date) +partition by range (d) (start (date '2001-01-01') end (date '2005-01-01') +every(interval '1 year')); +COPY foz FROM stdin DELIMITER '|'; +select * from foz_1_prt_1; + i | d +---+------------ + 1 | 01-02-2001 + 2 | 10-10-2001 +(2 rows) + +select * from foz_1_prt_2; + i | d +---+------------ + 3 | 10-30-2002 +(1 row) + +select * from foz_1_prt_3; + i | d +---+------------ + 4 | 01-01-2003 +(1 row) + +select * from foz_1_prt_4; + i | d +---+------------ + 5 | 05-05-2004 +(1 row) + +-- Check behaviour of key for which there is no partition +COPY foz FROM stdin DELIMITER '|'; +ERROR: no partition of relation "foz" found for row +DETAIL: Partition key of the failing row contains (d) = (01-01-2010). +CONTEXT: COPY foz, line 1: "6|2010-01-01" +drop table foz cascade; +-- Same test with append only +create table foz (i int, d date) with (appendonly = true) +partition by range (d) (start (date '2001-01-01') end (date '2005-01-01') +every(interval '1 year')); +COPY foz FROM stdin DELIMITER '|'; +select * from foz_1_prt_1; + i | d +---+------------ + 1 | 01-02-2001 + 2 | 10-10-2001 +(2 rows) + +select * from foz_1_prt_2; + i | d +---+------------ + 3 | 10-30-2002 +(1 row) + +select * from foz_1_prt_3; + i | d +---+------------ + 4 | 01-01-2003 +(1 row) + +select * from foz_1_prt_4; + i | d +---+------------ + 5 | 05-05-2004 +(1 row) + +-- Check behaviour of key for which there is no partition +COPY foz FROM stdin DELIMITER '|'; +ERROR: no partition of relation "foz" found for row +DETAIL: Partition key of the failing row contains (d) = (01-01-2010). +CONTEXT: COPY foz, line 1: "6|2010-01-01" +drop table foz cascade; +-- complain if create table as select (CTAS) +CREATE TABLE rank1 (id int, +rank int, year date, gender char(1)); +create table rank2 as select * from rank1 +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01') +end (date '2006-01-01') every (interval '1 year')) ( +partition boys values ('M'), +partition girls values ('F') +); +ERROR: cannot create a partitioned table using CREATE TABLE AS SELECT +HINT: Use CREATE TABLE...LIKE (followed by INSERT...SELECT) instead. +-- like is ok +create table rank2 (like rank1) +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01') +end (date '2003-01-01') every (interval '1 year')) ( +partition boys values ('M'), +partition girls values ('F') +); +drop table rank1 cascade; +drop table rank2 cascade; +-- alter table testing +create table hhh (a char(1), b date, d char(3)) +partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01') + with (appendonly=true), +partition bb start (date '2008-01-01') end (date '2009-01-01') + with (appendonly=false) +); +-- already exists +alter table hhh add partition aa start ('2010-01-01') end ('2011-01-01'); +ERROR: relation "hhh_1_prt_aa" already exists +-- no partition spec +alter table hhh add partition cc; +ERROR: missing boundary specification in partition "cc" of type RANGE +-- overlaps +alter table hhh add partition cc start ('2008-01-01') end ('2010-01-01'); +ERROR: partition "hhh_1_prt_cc" would overlap partition "hhh_1_prt_bb" +alter table hhh add partition cc end ('2008-01-01'); +ERROR: partition "hhh_1_prt_cc" would overlap partition "hhh_1_prt_aa" +-- reversed (start > end) +alter table hhh add partition cc start ('2010-01-01') end ('2009-01-01'); +ERROR: empty range bound specified for partition "hhh_1_prt_cc" +DETAIL: Specified lower bound ('01-01-2010') is greater than or equal to upper bound ('01-01-2009'). +-- works +--alter table hhh add partition cc start ('2009-01-01') end ('2010-01-01'); +alter table hhh add partition cc end ('2010-01-01'); +-- works - anonymous partition MPP-3350 +alter table hhh add partition end ('2010-02-01'); +-- MPP-3607 - ADD PARTITION with open intervals +create table no_end1 (aa int, bb int) partition by range (bb) +(partition foo start(3)); +-- fail overlap +alter table no_end1 add partition baz end (4); +ERROR: partition "no_end1_1_prt_baz" would overlap partition "no_end1_1_prt_foo" +-- fail overlap (because prior partition has no end) +alter table no_end1 add partition baz start (5); +ERROR: partition "no_end1_1_prt_baz" would overlap partition "no_end1_1_prt_foo" +-- ok (terminates on foo start) +alter table no_end1 add partition baz start (2); +-- ok (because ends before baz start) +alter table no_end1 add partition baz2 end (1); +create table no_start1 (aa int, bb int) partition by range (bb) +(partition foo end(3)); +-- fail overlap (because next partition has no start) +alter table no_start1 add partition baz start (2); +ERROR: partition "no_start1_1_prt_baz" would overlap partition "no_start1_1_prt_foo" +-- fail overlap (because next partition has no start) +alter table no_start1 add partition baz end (1); +ERROR: partition "no_start1_1_prt_baz" would overlap partition "no_start1_1_prt_foo" +-- ok (starts on foo end) +alter table no_start1 add partition baz end (4); +-- ok (because starts after baz end) +alter table no_start1 add partition baz2 start (5); +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'no_start%' or relname like 'no_end%'; + relname | pg_get_expr +----------------------+----------------------------------- + no_end1 | + no_end1_1_prt_foo | FOR VALUES FROM (3) TO (MAXVALUE) + no_end1_1_prt_baz | FOR VALUES FROM (2) TO (3) + no_end1_1_prt_baz2 | FOR VALUES FROM (MINVALUE) TO (1) + no_start1 | + no_start1_1_prt_foo | FOR VALUES FROM (MINVALUE) TO (3) + no_start1_1_prt_baz | FOR VALUES FROM (3) TO (4) + no_start1_1_prt_baz2 | FOR VALUES FROM (5) TO (MAXVALUE) +(8 rows) + +drop table no_end1; +drop table no_start1; +-- default partitions cannot have boundary specifications +create table jjj (aa int, bb date) +partition by range(bb) +(partition j1 end (date '2008-01-01'), +partition j2 end (date '2009-01-01')); +-- must have a name +alter table jjj add default partition; +ERROR: syntax error at or near ";" +LINE 1: alter table jjj add default partition; + ^ +alter table jjj add default partition for ('2008-01-01'); +ERROR: can only ADD a partition by name +-- cannot have boundary spec +alter table jjj add default partition j3 end (date '2010-01-01'); +ERROR: syntax error at or near "end" +LINE 1: alter table jjj add default partition j3 end (date '2010-01-... + ^ +drop table jjj cascade; +-- only one default partition +create table jjj (aa int, bb date) +partition by range(bb) +(partition j1 end (date '2008-01-01'), +partition j2 end (date '2009-01-01'), +default partition j3); +alter table jjj add default partition j3 ; +ERROR: relation "jjj_1_prt_j3" already exists +alter table jjj add default partition j4 ; +ERROR: partition "jjj_1_prt_j4" conflicts with existing default partition "jjj_1_prt_j3" +alter table jjj add partition j5 end (date '2010-01-01'); +drop table jjj cascade; +alter table hhh alter partition cc set tablespace foo_p; +ERROR: tablespace "foo_p" does not exist +alter table hhh alter partition aa set tablespace foo_p; +ERROR: tablespace "foo_p" does not exist +alter table hhh drop partition cc; +alter table hhh drop partition cc cascade; +ERROR: relation "public.hhh_1_prt_cc" does not exist +alter table hhh drop partition cc restrict; +ERROR: relation "public.hhh_1_prt_cc" does not exist +alter table hhh drop partition if exists cc; +-- fail (mpp-3265) +alter table hhh drop partition for ('2001-01-01'); +ERROR: partition for specified value of hhh does not exist +create table hhh_r1 (a char(1), b date, d char(3)) +partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01') + every (interval '1 month') +); +create table hhh_l1 (a char(1), b date, d char(3)) +partition by list (b) +( +partition aa values ('2007-01-01'), +partition bb values ('2008-01-01'), +partition cc values ('2009-01-01') +); +-- must have name or value for partition +alter table hhh_l1 drop partition; +ERROR: syntax error at or near ";" +LINE 1: alter table hhh_l1 drop partition; + ^ +alter table hhh_l1 drop partition aa; +alter table hhh_l1 drop partition for ('2008-01-01'); +-- same with range partitioning +alter table hhh_r1 drop partition; +ERROR: syntax error at or near ";" +LINE 1: alter table hhh_r1 drop partition; + ^ +alter table hhh_r1 drop partition for ('2007-04-01'); +alter table hhh_r1 drop partition for ('2007-01-01'); +alter table hhh_r1 drop partition aa_2; +alter table hhh_r1 drop partition aa_3; +alter table hhh_r1 drop partition aa_5; +alter table hhh_r1 drop partition aa_6; +-- more add partition tests +-- start before first partition (fail because start equal end) +alter table hhh_r1 add partition zaa start ('2007-07-01'); +ERROR: partition "hhh_r1_1_prt_zaa" would overlap partition "hhh_r1_1_prt_aa_7" +-- start before first partition (ok) +alter table hhh_r1 add partition zaa start ('2007-06-01'); +-- start > last (fail because start equal end) +alter table hhh_r1 add partition bb start ('2008-01-01') end ('2008-01-01') ; +ERROR: empty range bound specified for partition "hhh_r1_1_prt_bb" +DETAIL: Specified lower bound ('01-01-2008') is greater than or equal to upper bound ('01-01-2008'). +-- start > last (ok) +alter table hhh_r1 add partition bb start ('2008-01-01') +end ('2008-02-01') inclusive; +-- start > last (fail because start == last end inclusive) +alter table hhh_r1 add partition cc start ('2008-02-01') end ('2008-03-01') ; +ERROR: partition "hhh_r1_1_prt_cc" would overlap partition "hhh_r1_1_prt_bb" +-- start > last (ok [and leave a gap]) +alter table hhh_r1 add partition cc start ('2008-04-01') end ('2008-05-01') ; +-- overlap (fail) +alter table hhh_r1 add partition dd start ('2008-01-01') end ('2008-05-01') ; +ERROR: partition "hhh_r1_1_prt_dd" would overlap partition "hhh_r1_1_prt_bb" +-- new partition in "gap" (ok) +alter table hhh_r1 add partition dd start ('2008-03-01') end ('2008-04-01') ; +-- overlap all partitions (fail) +alter table hhh_r1 add partition ee start ('2006-01-01') end ('2009-01-01') ; +ERROR: partition "hhh_r1_1_prt_ee" would overlap partition "hhh_r1_1_prt_zaa" +-- start before first partition (fail because end in "gap" [and overlaps]) +alter table hhh_r1 add partition yaa start ('2007-05-01') end ('2007-07-01'); +ERROR: partition "hhh_r1_1_prt_yaa" would overlap partition "hhh_r1_1_prt_zaa" +-- start before first partition (fail ) +alter table hhh_r1 add partition yaa start ('2007-05-01') +end ('2007-10-01') inclusive; +ERROR: partition "hhh_r1_1_prt_yaa" would overlap partition "hhh_r1_1_prt_zaa" +-- start before first partition (fail because end overlaps) +alter table hhh_r1 add partition yaa start ('2007-05-01') +end ('2007-10-01') exclusive; +ERROR: partition "hhh_r1_1_prt_yaa" would overlap partition "hhh_r1_1_prt_zaa" +drop table hhh_r1 cascade; +drop table hhh_l1 cascade; +-- the documentation example, rewritten with EVERY in a template +-- and also with a default partition +CREATE TABLE rank (id int, +rank int, year date, gender char(1)) +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01') +end (date '2006-01-01') every (interval '1 year')) ( +partition boys values ('M'), +partition girls values ('F'), +default partition neuter +); +insert into rank values (1, 1, date '2001-01-15', 'M'); +insert into rank values (2, 1, date '2002-02-15', 'M'); +insert into rank values (3, 1, date '2003-03-15', 'M'); +insert into rank values (4, 1, date '2004-04-15', 'M'); +insert into rank values (5, 1, date '2005-05-15', 'M'); +insert into rank values (6, 1, date '2001-01-15', 'F'); +insert into rank values (7, 1, date '2002-02-15', 'F'); +insert into rank values (8, 1, date '2003-03-15', 'F'); +insert into rank values (9, 1, date '2004-04-15', 'F'); +insert into rank values (10, 1, date '2005-05-15', 'F'); +select * from rank ; + id | rank | year | gender +----+------+------------+-------- + 3 | 1 | 03-15-2003 | M + 5 | 1 | 05-15-2005 | M + 6 | 1 | 01-15-2001 | F + 7 | 1 | 02-15-2002 | F + 8 | 1 | 03-15-2003 | F + 9 | 1 | 04-15-2004 | F + 10 | 1 | 05-15-2005 | F + 2 | 1 | 02-15-2002 | M + 1 | 1 | 01-15-2001 | M + 4 | 1 | 04-15-2004 | M +(10 rows) + +alter table rank DROP partition boys restrict; +select * from rank ; + id | rank | year | gender +----+------+------------+-------- + 6 | 1 | 01-15-2001 | F + 7 | 1 | 02-15-2002 | F + 8 | 1 | 03-15-2003 | F + 9 | 1 | 04-15-2004 | F + 10 | 1 | 05-15-2005 | F +(5 rows) + +-- MPP-3722: complain if for(value) matches the default partition +alter table rank truncate partition for('N'); +ERROR: FOR expression matches DEFAULT partition for specified value of relation "rank" +HINT: FOR expression may only specify a non-default partition in this context. +alter table rank DROP partition for('N'); +ERROR: FOR expression matches DEFAULT partition for specified value of relation "rank" +HINT: FOR expression may only specify a non-default partition in this context. +alter table rank DROP partition if exists for('N'); +ERROR: FOR expression matches DEFAULT partition for specified value of relation "rank" +HINT: FOR expression may only specify a non-default partition in this context. +alter table rank DROP default partition if exists ; +-- can't drop the final partition - must drop the table +alter table rank DROP partition girls; +ERROR: cannot drop partition "rank_1_prt_girls" of "rank" -- only one remains +HINT: Use DROP TABLE "rank" to remove the table and the final partition +-- MPP-4011: make FOR(value) work +alter table rank alter partition for ('F') add default partition def1; +alter table rank alter partition for ('F') +truncate partition for ('2010-10-10'); +ERROR: FOR expression matches DEFAULT partition for specified value of relation "rank_1_prt_girls" +HINT: FOR expression may only specify a non-default partition in this context. +alter table rank truncate partition for ('F'); +drop table rank cascade; +alter table hhh exchange partition cc with table nosuchtable; +ERROR: relation "public.hhh_1_prt_cc" does not exist +alter table hhh exchange partition aa with table nosuchtable; +ERROR: relation "nosuchtable" does not exist +alter table hhh rename partition cc to aa; +ERROR: relation "public.hhh_1_prt_cc" does not exist +alter table hhh rename partition bb to aa; +ERROR: relation "hhh_1_prt_aa" already exists +alter table hhh rename partition aa to aa; +ERROR: relation "hhh_1_prt_aa" already exists +alter table hhh rename partition aa to "funky fresh"; +alter table hhh rename partition "funky fresh" to aa; +-- use FOR PARTITION VALUE (with implicate date conversion) +alter table hhh rename partition for ('2007-01-01') to "funky fresh"; +alter table hhh rename partition for ('2007-01-01') to aa; +alter table hhh set subpartition template (); +ERROR: relation "hhh" does not have a level 1 subpartition template specification +alter table hhh split partition cc at ('a'); +ERROR: relation "public.hhh_1_prt_cc" does not exist +alter table hhh split partition cc at ('a') into (partition gg, partition hh); +ERROR: relation "public.hhh_1_prt_cc" does not exist +alter table hhh split partition aa at ('a'); +ERROR: invalid input syntax for type date: "a" +LINE 1: alter table hhh split partition aa at ('a'); + ^ +alter table hhh truncate partition cc; +ERROR: relation "public.hhh_1_prt_cc" does not exist +alter table hhh truncate partition aa; +insert into hhh values('a', date '2007-01-02', 'b'); +insert into hhh values('a', date '2007-02-01', 'b'); +insert into hhh values('a', date '2007-03-01', 'b'); +insert into hhh values('a', date '2007-04-01', 'b'); +insert into hhh values('a', date '2007-05-01', 'b'); +insert into hhh values('a', date '2007-06-01', 'b'); +insert into hhh values('a', date '2007-07-01', 'b'); +insert into hhh values('a', date '2007-08-01', 'b'); +insert into hhh values('a', date '2007-09-01', 'b'); +insert into hhh values('a', date '2007-10-01', 'b'); +insert into hhh values('a', date '2007-11-01', 'b'); +insert into hhh values('a', date '2007-12-01', 'b'); +insert into hhh values('a', date '2008-01-02', 'b'); +insert into hhh values('a', date '2008-02-01', 'b'); +insert into hhh values('a', date '2008-03-01', 'b'); +insert into hhh values('a', date '2008-04-01', 'b'); +insert into hhh values('a', date '2008-05-01', 'b'); +insert into hhh values('a', date '2008-06-01', 'b'); +insert into hhh values('a', date '2008-07-01', 'b'); +insert into hhh values('a', date '2008-08-01', 'b'); +insert into hhh values('a', date '2008-09-01', 'b'); +insert into hhh values('a', date '2008-10-01', 'b'); +insert into hhh values('a', date '2008-11-01', 'b'); +insert into hhh values('a', date '2008-12-01', 'b'); +select * from hhh; + a | b | d +---+------------+----- + a | 01-02-2007 | b + a | 02-01-2007 | b + a | 03-01-2007 | b + a | 04-01-2007 | b + a | 05-01-2007 | b + a | 06-01-2007 | b + a | 07-01-2007 | b + a | 08-01-2007 | b + a | 09-01-2007 | b + a | 10-01-2007 | b + a | 11-01-2007 | b + a | 12-01-2007 | b + a | 01-02-2008 | b + a | 02-01-2008 | b + a | 03-01-2008 | b + a | 04-01-2008 | b + a | 05-01-2008 | b + a | 06-01-2008 | b + a | 07-01-2008 | b + a | 08-01-2008 | b + a | 09-01-2008 | b + a | 10-01-2008 | b + a | 11-01-2008 | b + a | 12-01-2008 | b +(24 rows) + +alter table hhh truncate partition aa; +select * from hhh; + a | b | d +---+------------+----- + a | 01-02-2008 | b + a | 02-01-2008 | b + a | 03-01-2008 | b + a | 04-01-2008 | b + a | 05-01-2008 | b + a | 06-01-2008 | b + a | 07-01-2008 | b + a | 08-01-2008 | b + a | 09-01-2008 | b + a | 10-01-2008 | b + a | 11-01-2008 | b + a | 12-01-2008 | b +(12 rows) + +alter table hhh truncate partition bb; +select * from hhh; + a | b | d +---+---+--- +(0 rows) + +insert into hhh values('a', date '2007-01-02', 'b'); +insert into hhh values('a', date '2007-02-01', 'b'); +insert into hhh values('a', date '2007-03-01', 'b'); +insert into hhh values('a', date '2007-04-01', 'b'); +insert into hhh values('a', date '2007-05-01', 'b'); +insert into hhh values('a', date '2007-06-01', 'b'); +insert into hhh values('a', date '2007-07-01', 'b'); +insert into hhh values('a', date '2007-08-01', 'b'); +insert into hhh values('a', date '2007-09-01', 'b'); +insert into hhh values('a', date '2007-10-01', 'b'); +insert into hhh values('a', date '2007-11-01', 'b'); +insert into hhh values('a', date '2007-12-01', 'b'); +insert into hhh values('a', date '2008-01-02', 'b'); +insert into hhh values('a', date '2008-02-01', 'b'); +insert into hhh values('a', date '2008-03-01', 'b'); +insert into hhh values('a', date '2008-04-01', 'b'); +insert into hhh values('a', date '2008-05-01', 'b'); +insert into hhh values('a', date '2008-06-01', 'b'); +insert into hhh values('a', date '2008-07-01', 'b'); +insert into hhh values('a', date '2008-08-01', 'b'); +insert into hhh values('a', date '2008-09-01', 'b'); +insert into hhh values('a', date '2008-10-01', 'b'); +insert into hhh values('a', date '2008-11-01', 'b'); +insert into hhh values('a', date '2008-12-01', 'b'); +select * from hhh; + a | b | d +---+------------+----- + a | 01-02-2007 | b + a | 02-01-2007 | b + a | 03-01-2007 | b + a | 04-01-2007 | b + a | 05-01-2007 | b + a | 06-01-2007 | b + a | 07-01-2007 | b + a | 08-01-2007 | b + a | 09-01-2007 | b + a | 10-01-2007 | b + a | 11-01-2007 | b + a | 12-01-2007 | b + a | 01-02-2008 | b + a | 02-01-2008 | b + a | 03-01-2008 | b + a | 04-01-2008 | b + a | 05-01-2008 | b + a | 06-01-2008 | b + a | 07-01-2008 | b + a | 08-01-2008 | b + a | 09-01-2008 | b + a | 10-01-2008 | b + a | 11-01-2008 | b + a | 12-01-2008 | b +(24 rows) + +-- truncate child partitions recursively +truncate table hhh; +select * from hhh; + a | b | d +---+---+--- +(0 rows) + +drop table hhh cascade; +-- default partitions +-- default partitions cannot have boundary specifications +create table jjj (aa int, bb date) +partition by range(bb) +(partition j1 end (date '2008-01-01'), +partition j2 end (date '2009-01-01'), +default partition j3 end (date '2010-01-01')); +ERROR: syntax error at or near "end" +LINE 5: default partition j3 end (date '2010-01-01')); + ^ +-- more than one default partition +create table jjj (aa int, bb date) +partition by range(bb) +(partition j1 end (date '2008-01-01'), +partition j2 end (date '2009-01-01'), +default partition j3, +default partition j4); +ERROR: multiple default partitions are not allowed +LINE 6: default partition j4); + ^ +-- check default +create table foz (i int, d date) +partition by range (d) +( + default partition dsf, + partition foo start (date '2001-01-01') end (date '2005-01-01') + every(interval '1 year') +); +insert into foz values(1, '2003-04-01'); +insert into foz values(2, '2010-04-01'); +select * from foz; + i | d +---+------------ + 2 | 04-01-2010 + 1 | 04-01-2003 +(2 rows) + +select * from foz_1_prt_dsf; + i | d +---+------------ + 2 | 04-01-2010 +(1 row) + +drop table foz cascade; +-- check for out of order partition definitions. We should order these correctly +-- and determine the appropriate boundaries. +create table d (i int, j int) partition by range(j) +( start (10), start(5), start(50) end(60)); +insert into d values(1, 5); +insert into d values(1, 10); +insert into d values(1, 11); +insert into d values(1, 55); +insert into d values(1, 70); +ERROR: no partition of relation "d" found for row +DETAIL: Partition key of the failing row contains (j) = (70). +\d+ d + Partitioned table "public.d" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | + j | integer | | | | plain | | +Partition key: RANGE (j) +Partitions: d_1_prt_1 FOR VALUES FROM (10) TO (50), + d_1_prt_2 FOR VALUES FROM (5) TO (10), + d_1_prt_3 FOR VALUES FROM (50) TO (60) + +select * from d; + i | j +---+---- + 1 | 5 + 1 | 10 + 1 | 11 + 1 | 55 +(4 rows) + +select * from d_1_prt_1; + i | j +---+---- + 1 | 10 + 1 | 11 +(2 rows) + +select * from d_1_prt_2; + i | j +---+--- + 1 | 5 +(1 row) + +select * from d_1_prt_3; + i | j +---+---- + 1 | 55 +(1 row) + +drop table d cascade; +-- check for NULL support +-- list +create table d (i int, j int) partition by list(j) +(partition a values(1, 2, NULL), + partition b values(3, 4) +); +insert into d values(1, 1); +insert into d values(1, 2); +insert into d values(1, NULL); +insert into d values(1, 3); +insert into d values(1, 4); +select * from d_1_prt_a; + i | j +---+--- + 1 | 1 + 1 | 2 + 1 | +(3 rows) + +select * from d_1_prt_b; + i | j +---+--- + 1 | 3 + 1 | 4 +(2 rows) + +drop table d cascade; +--range +-- Reject NULL values +create table d (i int, j int) partition by range(j) +(partition a start (1) end(10), partition b start(11) end(20)); +insert into d values (1, 1); +insert into d values (1, 2); +insert into d values (1, NULL); +ERROR: no partition of relation "d" found for row +DETAIL: Partition key of the failing row contains (j) = (null). +drop table d cascade; +-- allow NULLs into the default partition +create table d (i int, j int) partition by range(j) +(partition a start (1) end(10), partition b start(11) end(20), +default partition abc); +insert into d values (1, 1); +insert into d values (1, 2); +insert into d values (1, NULL); +select * from d_1_prt_abc; + i | j +---+--- + 1 | +(1 row) + +alter table d split default partition start (21,1) end (30) into (partition c, default partition); +ERROR: number of START values should cover all partition key columns +LINE 1: alter table d split default partition start (21,1) end (30) ... + ^ +alter table d split default partition start (21) end (30,1) into (partition c, default partition); +ERROR: number of END values should cover all partition key columns +LINE 1: alter table d split default partition start (21) end (30,1) ... + ^ +drop table d cascade; +-- multicolumn list support +create type d_partkey as (b int, c int); +create table d (a int, k d_partkey) +partition by list(k) +(partition a values(CAST('(1,2)' as d_partkey), CAST('(3,4)' as d_partkey)), + partition b values(CAST('(100,20)' as d_partkey)), + partition c values(CAST('(1000,1001)' as d_partkey), CAST('(1001,1002)' as d_partkey), CAST('(1003,1004)' as d_partkey))); +\d+ d + Partitioned table "public.d" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + k | d_partkey | | | | extended | | +Partition key: LIST (k) +Partitions: d_1_prt_a FOR VALUES IN ('(1,2)', '(3,4)'), + d_1_prt_b FOR VALUES IN ('(100,20)'), + d_1_prt_c FOR VALUES IN ('(1000,1001)', '(1001,1002)', '(1003,1004)') + +insert into d values(1, (1, 2)); +insert into d values(1, (3, 4)); +insert into d values(1, (100, 20)); +insert into d values(1, (100, 2000)); +ERROR: no partition of relation "d" found for row +DETAIL: Partition key of the failing row contains (k) = ((100,2000)). +insert into d values(1, ('1000', '1001')), (1, ('1001', '1002')), (1, ('1003', '1004')); +insert into d values(1, (100, NULL)); +ERROR: no partition of relation "d" found for row +DETAIL: Partition key of the failing row contains (k) = ((100,)). +select * from d_1_prt_a; + a | k +---+------- + 1 | (1,2) + 1 | (3,4) +(2 rows) + +select * from d_1_prt_b; + a | k +---+---------- + 1 | (100,20) +(1 row) + +select * from d_1_prt_c; + a | k +---+------------- + 1 | (1000,1001) + 1 | (1001,1002) + 1 | (1003,1004) +(3 rows) + +drop table d cascade; +-- test multi value range partitioning +create table b (i int, j date) +partition by range (i, j) +(start(1, '2008-01-01') end (10, '2009-01-01'), + start(1, '2009-01-01') end(15, '2010-01-01'), + start(15, '2010-01-01') end (30, '2011-01-01'), + start(1, '2011-01-01') end (100, '2012-01-01') +); +ERROR: too many columns for RANGE partition -- only one column is allowed +-- should work +insert into b values(1, '2008-06-11'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(1, '2008-06-11'); + ^ +insert into b values(11, '2009-08-24'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(11, '2009-08-24'); + ^ +insert into b values(25, '2010-01-22'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(25, '2010-01-22'); + ^ +insert into b values(90, '2011-05-04'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(90, '2011-05-04'); + ^ +-- shouldn't work +insert into b values(1, '2019-01-01'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(1, '2019-01-01'); + ^ +insert into b values(91, '2008-05-05'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(91, '2008-05-05'); + ^ +select * from b_1_prt_1; +ERROR: relation "b_1_prt_1" does not exist +LINE 1: select * from b_1_prt_1; + ^ +select * from b_1_prt_2; +ERROR: relation "b_1_prt_2" does not exist +LINE 1: select * from b_1_prt_2; + ^ +select * from b_1_prt_3; +ERROR: relation "b_1_prt_3" does not exist +LINE 1: select * from b_1_prt_3; + ^ +select * from b_1_prt_4; +ERROR: relation "b_1_prt_4" does not exist +LINE 1: select * from b_1_prt_4; + ^ +drop table b; +ERROR: table "b" does not exist +-- try some different combinations +create table b (i int, n numeric(20, 2), t timestamp, s text) +partition by range(n, t, s) +( +start(2000.99, '2007-01-01 00:00:00', 'AAA') + end (4000.95, '2007-02-02 15:00:00', 'BBB'), +start(2000.99, '2007-01-01 00:00:00', 'BBB') + end (4000.95, '2007-02-02 16:00:00', 'CCC'), +start(4000.95, '2007-01-01 00:00:00', 'AAA') + end (7000.95, '2007-02-02 15:00:00', 'BBB') +); +ERROR: too many columns for RANGE partition -- only one column is allowed +-- should work +insert into b values(1, 2000.99, '2007-01-01 00:00:00', 'AAA'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(1, 2000.99, '2007-01-01 00:00:00', 'AAA... + ^ +insert into b values(2, 2000.99, '2007-01-01 00:00:00', 'BBB'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(2, 2000.99, '2007-01-01 00:00:00', 'BBB... + ^ +insert into b values(3, 4000.95, '2007-01-01 00:00:00', 'AAA'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(3, 4000.95, '2007-01-01 00:00:00', 'AAA... + ^ +insert into b values(6, 3000, '2007-02-02 15:30:00', 'BBC'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 3000, '2007-02-02 15:30:00', 'BBC'); + ^ +insert into b values(6, 3000, '2007-02-02 15:30:00', 'CC'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 3000, '2007-02-02 15:30:00', 'CC'); + ^ +insert into b values(6, 3000, '2007-02-02 16:00:00'::timestamp - + '1 second'::interval, 'BBZZZZZZZZZZ'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 3000, '2007-02-02 16:00:00'::timesta... + ^ +-- should fail +insert into b values(6, 3000, '2007-02-02 15:30:00', 'CCCCCCC'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 3000, '2007-02-02 15:30:00', 'CCCCCC... + ^ +insert into b values(4, 5000, '2007-01-01 12:00:00', 'BCC'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(4, 5000, '2007-01-01 12:00:00', 'BCC'); + ^ +insert into b values(5, 8000, '2007-01-01 12:00:00', 'ZZZ'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(5, 8000, '2007-01-01 12:00:00', 'ZZZ'); + ^ +insert into b values(6, 3000, '2007-02-02 16:00:00', 'ABZZZZZZZZZZ'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 3000, '2007-02-02 16:00:00', 'ABZZZZ... + ^ +insert into b values(6, 1000, '2007-02-02 16:00:00', 'ABZZZZZZZZZZ'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 1000, '2007-02-02 16:00:00', 'ABZZZZ... + ^ +insert into b values(6, 3000, '2006-02-02 16:00:00', 'ABZZZZZZZZZZ'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 3000, '2006-02-02 16:00:00', 'ABZZZZ... + ^ +insert into b values(6, 3000, '2007-02-02 00:00:00', 'A'); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 3000, '2007-02-02 00:00:00', 'A'); + ^ +-- NULL tests +insert into b default values; +ERROR: relation "b" does not exist +LINE 1: insert into b default values; + ^ +insert into b values(6, 3000, '2007-01-01 12:00:00', NULL); +ERROR: relation "b" does not exist +LINE 1: insert into b values(6, 3000, '2007-01-01 12:00:00', NULL); + ^ +drop table b; +ERROR: table "b" does not exist +-- MPP-3988: allow same column in multiple partitioning keys at +-- different levels -- so this is legal again... +drop table if exists a; +-- TEST: make sure GPOPT (aka pivotal query optimizer) fall back to Postgres query optimizer +-- for queries with partition elimination over FULL OUTER JOIN +-- between partitioned tables. +-- SETUP +-- start_ignore +drop table if exists s1; +NOTICE: table "s1" does not exist, skipping +drop table if exists s2; +NOTICE: table "s2" does not exist, skipping +-- setup two partitioned tables s1 and s2 +create table s1 (d1 int, p1 int) +partition by list (p1) +( + values (0), + values (1)); +create table s2 (d2 int, p2 int) +partition by list (p2) +( + values (0), + values (1)); +-- end_ignore +-- VERIFY +-- expect GPOPT fall back to Postgres query optimizer +-- since GPOPT don't support partition elimination through full outer joins +select * from s1 full outer join s2 on s1.d1 = s2.d2 and s1.p1 = s2.p2 where s1.p1 = 1; + d1 | p1 | d2 | p2 +----+----+----+---- +(0 rows) + +-- CLEANUP +-- start_ignore +drop table if exists s1; +drop table if exists s2; +-- end_ignore +-- the following case is to test when we have a template +-- we can correct add new subpartition with relation options. +create table test_part_relops_tmpl (id int, p1 text, p2 text, count int) +partition by list (p1) +subpartition by list (p2) +( + partition m1 values ('m1') + (subpartition l1 values ('l1'), + subpartition l2 values ('l2')), + partition m2 values ('m2') + (subpartition l1 values ('l1'), + subpartition l2 values ('l2')) +); +alter table test_part_relops_tmpl +set subpartition template +( + subpartition l1 values('l1') +); +-- previously, we do wrong in the function of `add_partition_rule` +-- which invokes `transformRelOptions`, and transformRelOptions +-- may return NULL in some cases. For example, the invokation of +-- transformRelOptions in add_partition_rule set ignoreOids = true, +-- so the following statement creates such senario by passing oids options, +-- then transformRelOptions return NULL and we should correctly handle +-- null pointers. +alter table test_part_relops_tmpl alter partition for ('m1') add partition l3 values ('l3') +with (oids=false); +create table mpp_2914A(id int, buyDate date, kind char(1)) +partition by list (kind) +subpartition by range(buyDate) +subpartition template +( + start (date '2001-01-01'), + start (date '2002-01-01'), + start (date '2003-01-01'), + start (date '2004-01-01'), + start (date '2005-01-01') +) +( + partition auction values('a','A'), + partition buyItNow values('b', 'B'), + default partition catchall +); +select count(*) from mpp_2914A; + count +------- + 0 +(1 row) + +\d mpp_2914a* + Partitioned table "public.mpp_2914a" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition key: LIST (kind) +Number of partitions: 3 (Use \d+ to list them.) + + Partitioned table "public.mpp_2914a_1_prt_auction" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a FOR VALUES IN ('a', 'A') +Partition key: RANGE (buydate) +Number of partitions: 5 (Use \d+ to list them.) + + Table "public.mpp_2914a_1_prt_auction_2_prt_1" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_auction FOR VALUES FROM ('01-01-2001') TO ('01-01-2002') + + Table "public.mpp_2914a_1_prt_auction_2_prt_2" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_auction FOR VALUES FROM ('01-01-2002') TO ('01-01-2003') + + Table "public.mpp_2914a_1_prt_auction_2_prt_3" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_auction FOR VALUES FROM ('01-01-2003') TO ('01-01-2004') + + Table "public.mpp_2914a_1_prt_auction_2_prt_4" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_auction FOR VALUES FROM ('01-01-2004') TO ('01-01-2005') + + Table "public.mpp_2914a_1_prt_auction_2_prt_5" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_auction FOR VALUES FROM ('01-01-2005') TO (MAXVALUE) + + Partitioned table "public.mpp_2914a_1_prt_buyitnow" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a FOR VALUES IN ('b', 'B') +Partition key: RANGE (buydate) +Number of partitions: 5 (Use \d+ to list them.) + + Table "public.mpp_2914a_1_prt_buyitnow_2_prt_1" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_buyitnow FOR VALUES FROM ('01-01-2001') TO ('01-01-2002') + + Table "public.mpp_2914a_1_prt_buyitnow_2_prt_2" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_buyitnow FOR VALUES FROM ('01-01-2002') TO ('01-01-2003') + + Table "public.mpp_2914a_1_prt_buyitnow_2_prt_3" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_buyitnow FOR VALUES FROM ('01-01-2003') TO ('01-01-2004') + + Table "public.mpp_2914a_1_prt_buyitnow_2_prt_4" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_buyitnow FOR VALUES FROM ('01-01-2004') TO ('01-01-2005') + + Table "public.mpp_2914a_1_prt_buyitnow_2_prt_5" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_buyitnow FOR VALUES FROM ('01-01-2005') TO (MAXVALUE) + + Partitioned table "public.mpp_2914a_1_prt_catchall" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a DEFAULT +Partition key: RANGE (buydate) +Number of partitions: 5 (Use \d+ to list them.) + + Table "public.mpp_2914a_1_prt_catchall_2_prt_1" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_catchall FOR VALUES FROM ('01-01-2001') TO ('01-01-2002') + + Table "public.mpp_2914a_1_prt_catchall_2_prt_2" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_catchall FOR VALUES FROM ('01-01-2002') TO ('01-01-2003') + + Table "public.mpp_2914a_1_prt_catchall_2_prt_3" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_catchall FOR VALUES FROM ('01-01-2003') TO ('01-01-2004') + + Table "public.mpp_2914a_1_prt_catchall_2_prt_4" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_catchall FOR VALUES FROM ('01-01-2004') TO ('01-01-2005') + + Table "public.mpp_2914a_1_prt_catchall_2_prt_5" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914a_1_prt_catchall FOR VALUES FROM ('01-01-2005') TO (MAXVALUE) + +create table mpp_2914B(id int, buyDate date, kind char(1)) +partition by list (kind) +subpartition by range(buyDate) +( + partition auction values('a','A') + ( + subpartition y2001 start (date '2001-01-01'), + subpartition y2002 start (date '2002-01-01'), + subpartition y2003 start (date '2003-01-01'), + subpartition y2004 start (date '2004-01-01'), + subpartition y2005 start (date '2005-01-01') + ), + partition buyitnow values('b','B') + ( + subpartition y2001 start (date '2001-01-01'), + subpartition y2002 start (date '2002-01-01'), + subpartition y2003 start (date '2003-01-01'), + subpartition y2004 start (date '2004-01-01'), + subpartition y2005 start (date '2005-01-01') + ), + default partition catchAll + ( + subpartition y2001 start (date '2001-01-01'), + subpartition y2002 start (date '2002-01-01'), + subpartition y2003 start (date '2003-01-01'), + subpartition y2004 start (date '2004-01-01'), + subpartition y2005 start (date '2005-01-01') + ) +); +select count(*) from mpp_2914B; + count +------- + 0 +(1 row) + +\d mpp_2914b* + Partitioned table "public.mpp_2914b" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition key: LIST (kind) +Number of partitions: 3 (Use \d+ to list them.) + + Partitioned table "public.mpp_2914b_1_prt_auction" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b FOR VALUES IN ('a', 'A') +Partition key: RANGE (buydate) +Number of partitions: 5 (Use \d+ to list them.) + + Table "public.mpp_2914b_1_prt_auction_2_prt_y2001" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_auction FOR VALUES FROM ('01-01-2001') TO ('01-01-2002') + + Table "public.mpp_2914b_1_prt_auction_2_prt_y2002" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_auction FOR VALUES FROM ('01-01-2002') TO ('01-01-2003') + + Table "public.mpp_2914b_1_prt_auction_2_prt_y2003" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_auction FOR VALUES FROM ('01-01-2003') TO ('01-01-2004') + + Table "public.mpp_2914b_1_prt_auction_2_prt_y2004" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_auction FOR VALUES FROM ('01-01-2004') TO ('01-01-2005') + + Table "public.mpp_2914b_1_prt_auction_2_prt_y2005" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_auction FOR VALUES FROM ('01-01-2005') TO (MAXVALUE) + + Partitioned table "public.mpp_2914b_1_prt_buyitnow" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b FOR VALUES IN ('b', 'B') +Partition key: RANGE (buydate) +Number of partitions: 5 (Use \d+ to list them.) + + Table "public.mpp_2914b_1_prt_buyitnow_2_prt_y2001" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_buyitnow FOR VALUES FROM ('01-01-2001') TO ('01-01-2002') + + Table "public.mpp_2914b_1_prt_buyitnow_2_prt_y2002" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_buyitnow FOR VALUES FROM ('01-01-2002') TO ('01-01-2003') + + Table "public.mpp_2914b_1_prt_buyitnow_2_prt_y2003" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_buyitnow FOR VALUES FROM ('01-01-2003') TO ('01-01-2004') + + Table "public.mpp_2914b_1_prt_buyitnow_2_prt_y2004" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_buyitnow FOR VALUES FROM ('01-01-2004') TO ('01-01-2005') + + Table "public.mpp_2914b_1_prt_buyitnow_2_prt_y2005" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_buyitnow FOR VALUES FROM ('01-01-2005') TO (MAXVALUE) + + Partitioned table "public.mpp_2914b_1_prt_catchall" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b DEFAULT +Partition key: RANGE (buydate) +Number of partitions: 5 (Use \d+ to list them.) + + Table "public.mpp_2914b_1_prt_catchall_2_prt_y2001" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_catchall FOR VALUES FROM ('01-01-2001') TO ('01-01-2002') + + Table "public.mpp_2914b_1_prt_catchall_2_prt_y2002" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_catchall FOR VALUES FROM ('01-01-2002') TO ('01-01-2003') + + Table "public.mpp_2914b_1_prt_catchall_2_prt_y2003" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_catchall FOR VALUES FROM ('01-01-2003') TO ('01-01-2004') + + Table "public.mpp_2914b_1_prt_catchall_2_prt_y2004" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_catchall FOR VALUES FROM ('01-01-2004') TO ('01-01-2005') + + Table "public.mpp_2914b_1_prt_catchall_2_prt_y2005" + Column | Type | Collation | Nullable | Default +---------+--------------+-----------+----------+--------- + id | integer | | | + buydate | date | | | + kind | character(1) | | | +Partition of: mpp_2914b_1_prt_catchall FOR VALUES FROM ('01-01-2005') TO (MAXVALUE) + +drop table mpp_2914a cascade; +drop table mpp_2914b cascade; +create table mpp10847_pkeyconstraints( + pkid serial, + option1 int, + option2 int, + option3 int, + primary key(pkid, option3)) + partition by range (option3) +( +partition aa start(1) end(100) inclusive, +partition bb start(101) end(200) inclusive, +partition cc start(201) end (300) inclusive +); +insert into mpp10847_pkeyconstraints values (10000, 50, 50, 102); +-- This is supposed to fail as you're not supposed to be able to use the same +-- primary key in the same table. But GPDB cannot currently enforce that. +insert into mpp10847_pkeyconstraints values (10000, 50, 50, 5); +select * from mpp10847_pkeyconstraints; + pkid | option1 | option2 | option3 +-------+---------+---------+--------- + 10000 | 50 | 50 | 5 + 10000 | 50 | 50 | 102 +(2 rows) + +drop table mpp10847_pkeyconstraints; +-- Test that ADD/EXCHANGE/SPLIT PARTITION works, even when there are partial or expression +-- indexes on the table. (MPP-13750) +create table dcl_messaging_test +( + message_create_date timestamp(3) not null, + trace_socket varchar(1024) null, + trace_count varchar(1024) null, + variable_10 varchar(1024) null, + variable_11 varchar(1024) null, + variable_12 varchar(1024) null, + variable_13 varchar(1024) default('-1'), + variable_14 varchar(1024) null, + variable_15 varchar(1024) null, + variable_16 varchar(1024) null, + variable_17 varchar(1024) null, + variable_18 varchar(1024) null, + variable_19 varchar(1024) null, + variable_20 varchar(1024) null +) +partition by range (message_create_date) +( + START (timestamp '2011-09-01') END (timestamp '2011-09-10') EVERY (interval '1 day'), + DEFAULT PARTITION outlying_dates +); +-- partial index +create index dcl_messaging_test_index13 on dcl_messaging_test(variable_13) where message_create_date > '2011-09-02'; +-- expression index +create index dcl_messaging_test_index16 on dcl_messaging_test(upper(variable_16)); +alter table dcl_messaging_test drop default partition; +-- ADD case +alter table dcl_messaging_test add partition start (timestamp '2011-09-10') inclusive end (timestamp '2011-09-11') exclusive; +-- EXCHANGE case +create table dcl_candidate(like dcl_messaging_test including indexes) with (appendonly=true); +insert into dcl_candidate(message_create_date) values (timestamp '2011-09-06'); +alter table dcl_messaging_test exchange partition for ('2011-09-06') with table dcl_candidate; +-- SPLIT case +alter table dcl_messaging_test split partition for (timestamp '2011-09-06') at (timestamp '2011-09-06 12:00:00') into (partition x1, partition x2); +-- +-- Create table with 4 partitions +CREATE TABLE mpp13806 (id int, date date, amt decimal(10,2)) +PARTITION BY RANGE (date) +( START (date '2008-01-01') INCLUSIVE + END (date '2008-01-05') EXCLUSIVE + EVERY (INTERVAL '1 day') ); +-- Add unbound partition right before the start succeeds +alter table mpp13806 add partition test end (date '2008-01-01') exclusive; +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp13806%'; + relname | pg_get_expr +---------------------+-------------------------------------------------- + mpp13806 | + mpp13806_1_prt_1 | FOR VALUES FROM ('01-01-2008') TO ('01-02-2008') + mpp13806_1_prt_2 | FOR VALUES FROM ('01-02-2008') TO ('01-03-2008') + mpp13806_1_prt_3 | FOR VALUES FROM ('01-03-2008') TO ('01-04-2008') + mpp13806_1_prt_4 | FOR VALUES FROM ('01-04-2008') TO ('01-05-2008') + mpp13806_1_prt_test | FOR VALUES FROM (MINVALUE) TO ('01-01-2008') +(6 rows) + +-- Drop the partition +alter TABLE mpp13806 drop partition test; +-- Add unbound partition with a gap succeeds +alter table mpp13806 add partition test end (date '2007-12-31') exclusive; +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp13806%'; + relname | pg_get_expr +---------------------+-------------------------------------------------- + mpp13806 | + mpp13806_1_prt_1 | FOR VALUES FROM ('01-01-2008') TO ('01-02-2008') + mpp13806_1_prt_2 | FOR VALUES FROM ('01-02-2008') TO ('01-03-2008') + mpp13806_1_prt_3 | FOR VALUES FROM ('01-03-2008') TO ('01-04-2008') + mpp13806_1_prt_4 | FOR VALUES FROM ('01-04-2008') TO ('01-05-2008') + mpp13806_1_prt_test | FOR VALUES FROM (MINVALUE) TO ('12-31-2007') +(6 rows) + +-- Fill the gap succeeds/adding immediately before the first partition succeeds +alter table mpp13806 add partition test1 start (date '2007-12-31') inclusive end (date '2008-01-01') exclusive; +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp13806%'; + relname | pg_get_expr +----------------------+-------------------------------------------------- + mpp13806 | + mpp13806_1_prt_1 | FOR VALUES FROM ('01-01-2008') TO ('01-02-2008') + mpp13806_1_prt_2 | FOR VALUES FROM ('01-02-2008') TO ('01-03-2008') + mpp13806_1_prt_3 | FOR VALUES FROM ('01-03-2008') TO ('01-04-2008') + mpp13806_1_prt_4 | FOR VALUES FROM ('01-04-2008') TO ('01-05-2008') + mpp13806_1_prt_test | FOR VALUES FROM (MINVALUE) TO ('12-31-2007') + mpp13806_1_prt_test1 | FOR VALUES FROM ('12-31-2007') TO ('01-01-2008') +(7 rows) + +-- +-- Create two tables mpp14613_range (range partitioned) and +-- mpp14613_list (list partitioned) with 5 partitions (including default +-- partition) and 3 subpartitions (including default subpartition) each +create table mpp14613_list( + a int, + b int, + c int, + d int) + partition by range(b) + subpartition by list(c) + subpartition template + ( + default subpartition subothers, + subpartition s1 values(1,2,3), + subpartition s2 values(4,5,6) + ) + ( + default partition others, + start(1) end(5) every(1) + ); +create table mpp14613_range( + a int, + b int, + c int, + d int + ) + partition by range(b) + subpartition by range(c) + subpartition template + ( + default subpartition subothers, + start (1) end(7) every (3) + ) + ( + default partition others, + start(1) end(5) every(1) + ); +-- SPLIT partition +alter table mpp14613_list alter partition others split partition subothers at (10) into (partition b1, partition subothers); +ERROR: SPLIT PARTITION is not currently supported when leaf partition is list partitioned in multi level partition table +alter table mpp14613_range alter partition others split partition subothers at (10) into (partition b1, partition subothers); +ERROR: AT clause cannot be used when splitting a default RANGE partition +-- ALTER TABLE ... ALTER PARTITION ... SPLIT DEFAULT PARTITION +create table foo( + a int, + b int, + c int, + d int) + partition by range(b) + subpartition by list(c) + subpartition template + ( + default subpartition subothers, + subpartition s1 values(1,2,3), + subpartition s2 values(4,5,6) + ) + ( + default partition others, + start(1) end(5) every(1) + ); +alter table foo alter partition others split partition subothers at (10) into (partition b1, partition subothers); +ERROR: SPLIT PARTITION is not currently supported when leaf partition is list partitioned in multi level partition table +alter table foo alter partition others split partition subothers at (10) into (partition b1, default partition); +ERROR: INTO can only have second partition by name +LINE 1: ...artition others split partition subothers at (10) into (part... + ^ +alter table foo alter partition others split default partition at (10) into (partition b1, default partition); +ERROR: SPLIT PARTITION is not currently supported when leaf partition is list partitioned in multi level partition table +drop table foo; +-- +-- Drop index on a partitioned table. The indexes on the partitions are removed. +-- +create table pt_indx_tab (c1 integer, c2 int, c3 text) partition by range (c1) (partition A start (integer '0') end (integer '5') every (integer '1')); +create unique index pt_indx_drop on pt_indx_tab(c1); +select count(*) from pg_index where indrelid='pt_indx_tab'::regclass; + count +------- + 1 +(1 row) + +select count(*) from pg_index where indrelid='pt_indx_tab_1_prt_a_1'::regclass; + count +------- + 1 +(1 row) + +drop index pt_indx_drop; +select count(*) from pg_index where indrelid='pt_indx_tab'::regclass; + count +------- + 0 +(1 row) + +select count(*) from pg_index where indrelid='pt_indx_tab_1_prt_a_1'::regclass; + count +------- + 0 +(1 row) + +-- +-- Test changing the datatype of a column in a partitioning key column. +-- (Not supported, throws an error). +-- +create table mpp18179 (a int, b int, i int) +partition by list (b) + ( PARTITION ab1 VALUES (1), + PARTITION ab2 values (2), + default partition other + ); +alter table mpp18179 alter column b type varchar(20); +ERROR: cannot alter column "b" because it is part of the partition key of relation "mpp18179" +-- +-- Drop index on partitioned table, and recreate it. +-- +CREATE TABLE mpp7635_aoi_table2 (id INTEGER) + PARTITION BY RANGE (id) + (START (0) END (200000) EVERY (100000)) +; +INSERT INTO mpp7635_aoi_table2(id) VALUES (0); +-- Create index +CREATE INDEX mpp7635_ix3 ON mpp7635_aoi_table2 USING BITMAP (id); +select * from pg_indexes where tablename like 'mpp7635%'; + schemaname | tablename | indexname | tablespace | indexdef +------------+----------------------------+-----------------------------------+------------+------------------------------------------------------------------------------------------------------- + public | mpp7635_aoi_table2 | mpp7635_ix3 | | CREATE INDEX mpp7635_ix3 ON ONLY public.mpp7635_aoi_table2 USING bitmap (id) + public | mpp7635_aoi_table2_1_prt_1 | mpp7635_aoi_table2_1_prt_1_id_idx | | CREATE INDEX mpp7635_aoi_table2_1_prt_1_id_idx ON public.mpp7635_aoi_table2_1_prt_1 USING bitmap (id) + public | mpp7635_aoi_table2_1_prt_2 | mpp7635_aoi_table2_1_prt_2_id_idx | | CREATE INDEX mpp7635_aoi_table2_1_prt_2_id_idx ON public.mpp7635_aoi_table2_1_prt_2 USING bitmap (id) +(3 rows) + +-- Drop it +DROP INDEX mpp7635_ix3; +select * from pg_indexes where tablename like 'mpp7635%'; + schemaname | tablename | indexname | tablespace | indexdef +------------+-----------+-----------+------------+---------- +(0 rows) + +-- Create it again. +CREATE INDEX mpp7635_ix3 ON mpp7635_aoi_table2 (id); +select * from pg_indexes where tablename like 'mpp7635%'; + schemaname | tablename | indexname | tablespace | indexdef +------------+----------------------------+-----------------------------------+------------+------------------------------------------------------------------------------------------------------ + public | mpp7635_aoi_table2 | mpp7635_ix3 | | CREATE INDEX mpp7635_ix3 ON ONLY public.mpp7635_aoi_table2 USING btree (id) + public | mpp7635_aoi_table2_1_prt_1 | mpp7635_aoi_table2_1_prt_1_id_idx | | CREATE INDEX mpp7635_aoi_table2_1_prt_1_id_idx ON public.mpp7635_aoi_table2_1_prt_1 USING btree (id) + public | mpp7635_aoi_table2_1_prt_2 | mpp7635_aoi_table2_1_prt_2_id_idx | | CREATE INDEX mpp7635_aoi_table2_1_prt_2_id_idx ON public.mpp7635_aoi_table2_1_prt_2 USING btree (id) +(3 rows) + +-- +-- Test handling of NULL values in SPLIT PARTITION. +-- +CREATE TABLE mpp7863 (id int, dat char(8)) +PARTITION BY RANGE (dat) +( PARTITION Oct09 START (200910) INCLUSIVE END (200911) EXCLUSIVE , +PARTITION Nov09 START (200911) INCLUSIVE END (200912) EXCLUSIVE , +PARTITION Dec09 START (200912) INCLUSIVE END (201001) EXCLUSIVE , +DEFAULT PARTITION extra); +insert into mpp7863 values(generate_series(1, 100),'200910'); +insert into mpp7863 values(generate_series(101, 200),'200911'); +insert into mpp7863 values(generate_series(201, 300),'200912'); +insert into mpp7863 values(generate_series(301, 30300),''); +insert into mpp7863 (id) values(generate_series(30301, 60300)); +insert into mpp7863 values(generate_series(60301, 60400),'201001'); +select count(*) from mpp7863_1_prt_extra; + count +------- + 60100 +(1 row) + +select count(*) from mpp7863_1_prt_extra where dat is null; + count +------- + 30000 +(1 row) + +select count(*) from mpp7863_1_prt_extra where dat =''; + count +------- + 30000 +(1 row) + +select count(*) from mpp7863; + count +------- + 60400 +(1 row) + +alter table mpp7863 split default partition start (201001) inclusive end (201002) exclusive into (partition jan10,default partition); +select count(*) from mpp7863_1_prt_extra where dat is null; + count +------- + 30000 +(1 row) + +select count(*) from mpp7863_1_prt_extra where dat =''; + count +------- + 30000 +(1 row) + +select count(*) from mpp7863_1_prt_extra; + count +------- + 60000 +(1 row) + +select dat, count(*) from mpp7863 group by 1 order by 2,1; + dat | count +----------+------- + 200910 | 100 + 200911 | 100 + 200912 | 100 + 201001 | 100 + | 30000 + | 30000 +(6 rows) + +-- +-- Test handling of dropped columns in SPLIT PARTITION. (PR #9386) +-- +DROP TABLE IF EXISTS users_test; +NOTICE: table "users_test" does not exist, skipping +CREATE TABLE users_test +( + id INT, + dd TEXT, + user_name VARCHAR(40), + user_email VARCHAR(60), + born_time TIMESTAMP, + create_time TIMESTAMP +) +PARTITION BY RANGE (create_time) +( + PARTITION p2019 START ('2019-01-01'::TIMESTAMP) END ('2020-01-01'::TIMESTAMP), + DEFAULT PARTITION extra +); +-- Drop useless column dd for some reason +ALTER TABLE users_test DROP COLUMN dd; +-- Assume we forgot/failed to split out new partitions beforehand +INSERT INTO users_test VALUES(1, 'A', 'A@abc.com', '1970-01-01', '2019-01-01 12:00:00'); +INSERT INTO users_test VALUES(2, 'B', 'B@abc.com', '1980-01-01', '2020-01-01 12:00:00'); +INSERT INTO users_test VALUES(3, 'C', 'C@abc.com', '1990-01-01', '2021-01-01 12:00:00'); +-- New partition arrives late +ALTER TABLE users_test SPLIT DEFAULT PARTITION START ('2020-01-01'::TIMESTAMP) END ('2021-01-01'::TIMESTAMP) + INTO (PARTITION p2020, DEFAULT PARTITION); +-- Expect A +SELECT user_name FROM users_test_1_prt_p2019; + user_name +----------- + A +(1 row) + +-- Expect B +SELECT user_name FROM users_test_1_prt_p2020; + user_name +----------- + B +(1 row) + +-- Expect C +SELECT user_name FROM users_test_1_prt_extra; + user_name +----------- + C +(1 row) + +-- Github issue: https://github.com/greenplum-db/gpdb/issues/9460 +-- When creating unique or primary key index on Partition table, +-- the cols in index must contain all partition keys. +CREATE TABLE t_idx_col_contain_partkey(a int, b int) +PARTITION BY list (b) +(PARTITION t1 values (1), + PARTITION t2 values (2)); +-- the following statement should fail because index cols does not contain part key +CREATE UNIQUE INDEX uidx_t_idx_col_contain_partkey on t_idx_col_contain_partkey(a); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "t_idx_col_contain_partkey" lacks column "b" which is part of the partition key. +-- the following statement should work +CREATE UNIQUE INDEX uidx_t_idx_col_contain_partkey on t_idx_col_contain_partkey(a, b); +DROP INDEX uidx_t_idx_col_contain_partkey; +DROP TABLE t_idx_col_contain_partkey; +-- test unique index for multi level partition table +CREATE TABLE t_idx_col_contain_partkey +( + r_regionkey integer not null, + r_name char(25), + r_comment varchar(152) +) +PARTITION BY RANGE (r_regionkey) +SUBPARTITION BY LIST (r_name) SUBPARTITION TEMPLATE +( + SUBPARTITION africa VALUES ('AFRICA'), + SUBPARTITION america VALUES ('AMERICA'), + SUBPARTITION asia VALUES ('ASIA'), + SUBPARTITION europe VALUES ('EUROPE'), + SUBPARTITION mideast VALUES ('MIDDLE EAST'), + SUBPARTITION australia VALUES ('AUSTRALIA'), + SUBPARTITION antarctica VALUES ('ANTARCTICA') +) +( + PARTITION region1 start (0), + PARTITION region2 start (3), + PARTITION region3 start (5) end (8) +); +-- should fail, must contain all the partition keys of all levels +CREATE UNIQUE INDEX uidx_t_idx_col_contain_partkey on t_idx_col_contain_partkey(r_regionkey); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "t_idx_col_contain_partkey_1_prt_region1" lacks column "r_name" which is part of the partition key. +-- should work +CREATE UNIQUE INDEX uidx_t_idx_col_contain_partkey on t_idx_col_contain_partkey(r_regionkey, r_name); +DROP INDEX uidx_t_idx_col_contain_partkey; +DROP TABLE t_idx_col_contain_partkey; +-- +-- Test EXCHANGE PARTITION, when the new table has different CHECK constraints +-- +CREATE TABLE constraint_mismatch_tbl ( + id int, + date date, + amt decimal(10,2) + CONSTRAINT amt_check CHECK (amt > 0) +) +PARTITION BY RANGE (date) + (PARTITION Jan08 START (date '2008-01-01'), + PARTITION Feb08 START (date '2008-02-01'), + PARTITION Mar08 START (date '2008-03-01') END (date '2008-04-01')); +-- fail: new table doesn't have 'amt_check' constraint +CREATE TABLE mismatch_exchange_tbl ( + id int, + date date, + amt decimal(10,2) +); +INSERT INTO mismatch_exchange_tbl SELECT i, '2008-03-02', i FROM generate_series(11,15)i; +ALTER TABLE constraint_mismatch_tbl EXCHANGE PARTITION mar08 WITH TABLE mismatch_exchange_tbl; +ERROR: child table is missing constraint "amt_check" +-- fail: new table has a constraint called 'amt_check', but it's different from the parent's +DROP TABLE mismatch_exchange_tbl; +CREATE TABLE mismatch_exchange_tbl ( + id int, + date date, + amt decimal(10,2) + CONSTRAINT amt_check CHECK (amt <> 0) +); +INSERT INTO mismatch_exchange_tbl SELECT i, '2008-03-02', i FROM generate_series(11,15)i; +ALTER TABLE constraint_mismatch_tbl EXCHANGE PARTITION mar08 WITH TABLE mismatch_exchange_tbl; +ERROR: child table "mismatch_exchange_tbl" has different definition for check constraint "amt_check" +-- success: new table has compatible 'amt_check' constraint +DROP TABLE mismatch_exchange_tbl; +CREATE TABLE mismatch_exchange_tbl ( + id int, + date date, + amt decimal(10,2) + CONSTRAINT amt_check CHECK (amt > 0) +); +INSERT INTO mismatch_exchange_tbl SELECT i, '2008-03-02', i FROM generate_series(11,15)i; +ALTER TABLE constraint_mismatch_tbl EXCHANGE PARTITION mar08 WITH TABLE mismatch_exchange_tbl; +-- +-- END INCLUSIVE should work for CREATE, ADD PARTITION, and SPLIT PARTITION for +-- the following data types. The INCLUSIVE END value will be converted to an +-- EXCLUSIVE upper bound during transformation. If the INCLUSIVE END value is +-- smaller than the maximum value of the data type, the exclusive upper bound +-- will be the END INCLUSIVE value + '1', where '1' is the resolution of the +-- data type. Otherwise, MAXVALUE will be stored as the upper bound. +-- +-- END INCLUSIVE should work for bigint +CREATE TABLE end_inclusive_bigint (a int, b bigint) + + PARTITION BY RANGE (b) + ( + PARTITION pmax_create START (9223372036854775805) END (9223372036854775807) INCLUSIVE EVERY (1), + PARTITION p1 START (1) END (3) INCLUSIVE, + PARTITION p20 START (20), + DEFAULT PARTITION other + ); +ALTER TABLE end_inclusive_bigint SPLIT DEFAULT PARTITION START (7) END (10) INCLUSIVE INTO (PARTITION p7, DEFAULT PARTITION); +\d+ end_inclusive_bigint + Partitioned table "public.end_inclusive_bigint" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | bigint | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_bigint_1_prt_p1 FOR VALUES FROM ('1') TO ('4'), + end_inclusive_bigint_1_prt_p20 FOR VALUES FROM ('20') TO ('9223372036854775805'), + end_inclusive_bigint_1_prt_p7 FOR VALUES FROM ('7') TO ('11'), + end_inclusive_bigint_1_prt_pmax_create_1 FOR VALUES FROM ('9223372036854775805') TO ('9223372036854775806'), + end_inclusive_bigint_1_prt_pmax_create_2 FOR VALUES FROM ('9223372036854775806') TO (MAXVALUE), + end_inclusive_bigint_1_prt_other DEFAULT + +ALTER TABLE end_inclusive_bigint DROP PARTITION pmax_create_1; +ALTER TABLE end_inclusive_bigint DROP PARTITION pmax_create_2; +ALTER TABLE end_inclusive_bigint ADD PARTITION pmax_add START (9223372036854775805) END (9223372036854775807) INCLUSIVE; +\d+ end_inclusive_bigint + Partitioned table "public.end_inclusive_bigint" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | bigint | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_bigint_1_prt_p1 FOR VALUES FROM ('1') TO ('4'), + end_inclusive_bigint_1_prt_p20 FOR VALUES FROM ('20') TO ('9223372036854775805'), + end_inclusive_bigint_1_prt_p7 FOR VALUES FROM ('7') TO ('11'), + end_inclusive_bigint_1_prt_pmax_add FOR VALUES FROM ('9223372036854775805') TO (MAXVALUE), + end_inclusive_bigint_1_prt_other DEFAULT + +ALTER TABLE end_inclusive_bigint DROP PARTITION pmax_add; +ALTER TABLE end_inclusive_bigint SPLIT DEFAULT PARTITION START (9223372036854775805) END (9223372036854775807) INCLUSIVE INTO (PARTITION pmax_split, DEFAULT PARTITION); +\d+ end_inclusive_bigint + Partitioned table "public.end_inclusive_bigint" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | bigint | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_bigint_1_prt_p1 FOR VALUES FROM ('1') TO ('4'), + end_inclusive_bigint_1_prt_p20 FOR VALUES FROM ('20') TO ('9223372036854775805'), + end_inclusive_bigint_1_prt_p7 FOR VALUES FROM ('7') TO ('11'), + end_inclusive_bigint_1_prt_pmax_split FOR VALUES FROM ('9223372036854775805') TO (MAXVALUE), + end_inclusive_bigint_1_prt_other DEFAULT + +-- END INCLUSIVE should work for int +CREATE TABLE end_inclusive_int (a int, b int) + + PARTITION BY RANGE (b) + ( + PARTITION p1 END (3) INCLUSIVE, + PARTITION pmax END (2147483647) INCLUSIVE + ); +\d+ end_inclusive_int + Partitioned table "public.end_inclusive_int" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_int_1_prt_p1 FOR VALUES FROM (MINVALUE) TO (4), + end_inclusive_int_1_prt_pmax FOR VALUES FROM (4) TO (MAXVALUE) + +-- END INCLUSIVE should work for smallint +CREATE TABLE end_inclusive_smallint (a int, b smallint) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (1) END (3) INCLUSIVE, + PARTITION pmax START (4) END (32767) INCLUSIVE + ); +\d+ end_inclusive_smallint + Partitioned table "public.end_inclusive_smallint" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+----------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | smallint | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_smallint_1_prt_p1 FOR VALUES FROM ('1') TO ('4'), + end_inclusive_smallint_1_prt_pmax FOR VALUES FROM ('4') TO (MAXVALUE) + +-- END INCLUSIVE should work for date +CREATE TABLE end_inclusive_date (a int, b date) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('2020-06-16') END ('2020-06-17') INCLUSIVE, + PARTITION pmax START ('2020-06-18') END ('infinity') INCLUSIVE + ); +\d+ end_inclusive_date + Partitioned table "public.end_inclusive_date" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | date | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_date_1_prt_p1 FOR VALUES FROM ('06-16-2020') TO ('06-18-2020'), + end_inclusive_date_1_prt_pmax FOR VALUES FROM ('06-18-2020') TO (MAXVALUE) + +-- END INCLUSIVE should work for time without time zone +CREATE TABLE end_inclusive_time (a int, b time) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('00:00:00.000001') END ('01:00:00') INCLUSIVE, + PARTITION pmax START ('23:00:00') END ('24:00:00') INCLUSIVE + ); +\d+ end_inclusive_time + Partitioned table "public.end_inclusive_time" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+------------------------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | time without time zone | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_time_1_prt_p1 FOR VALUES FROM ('00:00:00.000001') TO ('01:00:00.000001'), + end_inclusive_time_1_prt_pmax FOR VALUES FROM ('23:00:00') TO (MAXVALUE) + +-- END INCLUSIVE should work for time with time zone +CREATE TABLE end_inclusive_timetz (a int, b time with time zone) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('00:00:00 EST') END ('01:00:00 PST') INCLUSIVE, + PARTITION pmax START ('23:00:00 EST') END ('24:00:00 PST') INCLUSIVE + ); +\d+ end_inclusive_timetz + Partitioned table "public.end_inclusive_timetz" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------------------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | time with time zone | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_timetz_1_prt_p1 FOR VALUES FROM ('00:00:00-05') TO ('01:00:00.000001-08'), + end_inclusive_timetz_1_prt_pmax FOR VALUES FROM ('23:00:00-05') TO (MAXVALUE) + +-- END INCLUSIVE should work for timestamp without time zone +CREATE TABLE end_inclusive_timestamp (a int, b timestamp) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('2020-06-16 00:00:00') END ('2020-06-16 01:00:00') INCLUSIVE, + PARTITION pmax START ('2020-06-16 23:00:00') END ('infinity') INCLUSIVE + ); +\d+ end_inclusive_timestamp + Partitioned table "public.end_inclusive_timestamp" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-----------------------------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | timestamp without time zone | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_timestamp_1_prt_p1 FOR VALUES FROM ('Tue Jun 16 00:00:00 2020') TO ('Tue Jun 16 01:00:00.000001 2020'), + end_inclusive_timestamp_1_prt_pmax FOR VALUES FROM ('Tue Jun 16 23:00:00 2020') TO (MAXVALUE) + +-- END INCLUSIVE should work for timestamp with time zone +CREATE TABLE end_inclusive_timestamptz (a int, b timestamp with time zone) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('2020-06-16 00:00:00 PST') END ('2020-06-16 01:00:00 PST') INCLUSIVE, + PARTITION pmax START ('2020-06-16 23:00:00 EST') END ('infinity') INCLUSIVE + ); +\d+ end_inclusive_timestamptz + Partitioned table "public.end_inclusive_timestamptz" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+--------------------------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | timestamp with time zone | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_timestamptz_1_prt_p1 FOR VALUES FROM ('Tue Jun 16 01:00:00 2020 PDT') TO ('Tue Jun 16 02:00:00.000001 2020 PDT'), + end_inclusive_timestamptz_1_prt_pmax FOR VALUES FROM ('Tue Jun 16 21:00:00 2020 PDT') TO (MAXVALUE) + +-- END INCLUSIVE should work for interval +CREATE TABLE end_inclusive_interval (a int, b interval) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('1 year') END ('2 years') INCLUSIVE + ); +\d+ end_inclusive_interval + Partitioned table "public.end_inclusive_interval" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+----------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | interval | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_interval_1_prt_p1 FOR VALUES FROM ('@ 1 year') TO ('@ 2 years 0.000001 secs') + +-- END INCLUSIVE with MAXVALUE should work with implicit START/END +DROP TABLE end_inclusive_int; +CREATE TABLE end_inclusive_int (a int, b int) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (1), + PARTITION pmax END (2147483647) INCLUSIVE, + PARTITION p2 START (2) END (5) INCLUSIVE + ); +\d+ end_inclusive_int + Partitioned table "public.end_inclusive_int" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_int_1_prt_p1 FOR VALUES FROM (1) TO (2), + end_inclusive_int_1_prt_p2 FOR VALUES FROM (2) TO (6), + end_inclusive_int_1_prt_pmax FOR VALUES FROM (6) TO (MAXVALUE) + +DROP TABLE end_inclusive_int; +CREATE TABLE end_inclusive_int (a int, b int) + + PARTITION BY RANGE (b) + ( + PARTITION pmax END (2147483647) INCLUSIVE, + PARTITION p1 START (1), + PARTITION p2 START (2) END (5) INCLUSIVE + ); +\d+ end_inclusive_int + Partitioned table "public.end_inclusive_int" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Partition key: RANGE (b) +Partitions: end_inclusive_int_1_prt_p1 FOR VALUES FROM (1) TO (2), + end_inclusive_int_1_prt_p2 FOR VALUES FROM (2) TO (6), + end_inclusive_int_1_prt_pmax FOR VALUES FROM (6) TO (MAXVALUE) + +-- END INCLUSIVE should fail when precision is specified +CREATE TABLE end_inclusive_time_with_precision (a int, b time(5)) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('00:00:00') END ('01:00:00') INCLUSIVE + ); +ERROR: END INCLUSIVE not supported when partition key has precision specification: time(5) without time zone +HINT: Specify an exclusive END value and remove the INCLUSIVE keyword +-- END INCLUSIVE should fail for unsupported data types +CREATE TABLE end_inclusive_numeric (a int, b numeric) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (1) END (3) INCLUSIVE + ); +ERROR: END INCLUSIVE not supported for partition key data type: numeric +HINT: Specify an exclusive END value and remove the INCLUSIVE keyword +-- Also check START EXCLUSIVE +CREATE TABLE start_exclusive_smallint (a int, b smallint) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (0) EXCLUSIVE END (3) INCLUSIVE, + PARTITION pmax START (4) EXCLUSIVE + ); +\d+ start_exclusive_smallint + Partitioned table "public.start_exclusive_smallint" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+----------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | smallint | | | | plain | | +Partition key: RANGE (b) +Partitions: start_exclusive_smallint_1_prt_p1 FOR VALUES FROM ('1') TO ('4'), + start_exclusive_smallint_1_prt_pmax FOR VALUES FROM ('5') TO (MAXVALUE) + +-- If the START EXCLUSIVE value + 1 would overflow, you get an error +CREATE TABLE start_exclusive_smallint_overflow (a int, b smallint) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (0) EXCLUSIVE END (3) INCLUSIVE, + PARTITION pmax START (32767) EXCLUSIVE + ); +ERROR: START EXCLUSIVE is out of range +LINE 6: PARTITION pmax START (32767) EXCLUSIVE + ^ +-- Test for ALTER TABLE WITH/WITHOUT VALIDATION. +-- It doesn't do anything anymore, but check that the syntax is accepted. +CREATE TABLE validation_syntax_tbl (a int) + + PARTITION BY RANGE (a) + ( + PARTITION p1 START (1) END (3) + ); +CREATE TABLE exchange_tbl (a int4); +INSERT INTO exchange_tbl VALUES (100); +ALTER TABLE validation_syntax_tbl EXCHANGE PARTITION p1 WITH TABLE exchange_tbl WITH VALIDATION; +NOTICE: specifying "WITH VALIDATION" acts as no operation. If the new partition is a regular table, validation is performed to make sure all the rows obey partition constraint. If the new partition is external or foreign table, no validation is performed. +ERROR: partition constraint of relation "exchange_tbl" is violated by some row +ALTER TABLE validation_syntax_tbl EXCHANGE PARTITION p1 WITH TABLE exchange_tbl WITHOUT VALIDATION; +NOTICE: specifying "WITHOUT VALIDATION" acts as no operation. If the new partition is a regular table, validation is performed to make sure all the rows obey partition constraint. If the new partition is external or foreign table, no validation is performed. +ERROR: partition constraint of relation "exchange_tbl" is violated by some row +DROP TABLE exchange_tbl; +DROP TABLE validation_syntax_tbl; +-- +-- Test a case where the automatically created partition name clashes with +-- another table or partition. +-- Before GPDB 7, the automatic table name generation used check if the name is +-- in use, and pick another name to avoid the clash. It's not as smart anymore. +-- It's more tricky now, because e.g. the ALTER TABLE ALTER/DROP/ADD PARTITION +-- commands rely on the deterministic naming of the partitions. If a user runs +-- into this, the work around is to use different table/partition names, or +-- use the upstream syntax and name each partition explicitly. +-- +CREATE TABLE partitioned_table_with_very_long_name_123456789x +( + col1 int4, + col2 int4 +) +PARTITION BY RANGE(col2) + (partition partone start(1) end(100000001), + partition parttwo start(100000001) end(200000001), + partition partthree start(200000001) end(300000001)); +CREATE TABLE partitioned_table_with_very_long_name_123456789y +( + col1 int4, + col2 int4 +) +PARTITION BY RANGE(col2) + (partition partone start(1) end(100000001), + partition parttwo start(100000001) end(200000001), + partition partthree start(200000001) end(300000001)); +ERROR: relation "partitioned_table_with_very_long_name_123456789_1_prt_partthree" already exists diff --git a/src/test/singlenode_regress/expected/partition_aggregate.out b/src/test/singlenode_regress/expected/partition_aggregate.out new file mode 100644 index 00000000000..e5658fb09f3 --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_aggregate.out @@ -0,0 +1,1535 @@ +-- +-- PARTITION_AGGREGATE +-- Test partitionwise aggregation on partitioned tables +-- +-- Note: to ensure plan stability, it's a good idea to make the partitions of +-- any one partitioned table in this test all have different numbers of rows. +-- +-- Enable partitionwise aggregate, which by default is disabled. +SET enable_partitionwise_aggregate TO true; +-- Enable partitionwise join, which by default is disabled. +SET enable_partitionwise_join TO true; +-- Disable parallel plans. +SET max_parallel_workers_per_gather TO 0; +-- Disable incremental sort, which can influence selected plans due to fuzz factor. +SET enable_incremental_sort TO off; +-- +-- Tests for list partitioned tables. +-- +CREATE TABLE pagg_tab (a int, b int, c text, d int) PARTITION BY LIST(c); +CREATE TABLE pagg_tab_p1 PARTITION OF pagg_tab FOR VALUES IN ('0000', '0001', '0002', '0003', '0004'); +CREATE TABLE pagg_tab_p2 PARTITION OF pagg_tab FOR VALUES IN ('0005', '0006', '0007', '0008'); +CREATE TABLE pagg_tab_p3 PARTITION OF pagg_tab FOR VALUES IN ('0009', '0010', '0011'); +INSERT INTO pagg_tab SELECT i % 20, i % 30, to_char(i % 12, 'FM0000'), i % 30 FROM generate_series(0, 2999) i; +ANALYZE pagg_tab; +-- When GROUP BY clause matches; full aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT c, sum(a), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY c HAVING avg(d) < 15 ORDER BY 1, 2, 3; + QUERY PLAN +-------------------------------------------------------------- + Sort + Sort Key: pagg_tab.c, (sum(pagg_tab.a)), (avg(pagg_tab.b)) + -> Append + -> HashAggregate + Group Key: pagg_tab.c + Filter: (avg(pagg_tab.d) < '15'::numeric) + -> Seq Scan on pagg_tab_p1 pagg_tab + -> HashAggregate + Group Key: pagg_tab_1.c + Filter: (avg(pagg_tab_1.d) < '15'::numeric) + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> HashAggregate + Group Key: pagg_tab_2.c + Filter: (avg(pagg_tab_2.d) < '15'::numeric) + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT c, sum(a), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY c HAVING avg(d) < 15 ORDER BY 1, 2, 3; + c | sum | avg | count | min | max +------+------+---------------------+-------+-----+----- + 0000 | 2000 | 12.0000000000000000 | 250 | 0 | 24 + 0001 | 2250 | 13.0000000000000000 | 250 | 1 | 25 + 0002 | 2500 | 14.0000000000000000 | 250 | 2 | 26 + 0006 | 2500 | 12.0000000000000000 | 250 | 2 | 24 + 0007 | 2750 | 13.0000000000000000 | 250 | 3 | 25 + 0008 | 2000 | 14.0000000000000000 | 250 | 0 | 26 +(6 rows) + +-- When GROUP BY clause does not match; partial aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY a HAVING avg(d) < 15 ORDER BY 1, 2, 3; + QUERY PLAN +-------------------------------------------------------------- + Sort + Sort Key: pagg_tab.a, (sum(pagg_tab.b)), (avg(pagg_tab.b)) + -> Finalize HashAggregate + Group Key: pagg_tab.a + Filter: (avg(pagg_tab.d) < '15'::numeric) + -> Append + -> Partial HashAggregate + Group Key: pagg_tab.a + -> Seq Scan on pagg_tab_p1 pagg_tab + -> Partial HashAggregate + Group Key: pagg_tab_1.a + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> Partial HashAggregate + Group Key: pagg_tab_2.a + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT a, sum(b), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY a HAVING avg(d) < 15 ORDER BY 1, 2, 3; + a | sum | avg | count | min | max +----+------+---------------------+-------+-----+----- + 0 | 1500 | 10.0000000000000000 | 150 | 0 | 20 + 1 | 1650 | 11.0000000000000000 | 150 | 1 | 21 + 2 | 1800 | 12.0000000000000000 | 150 | 2 | 22 + 3 | 1950 | 13.0000000000000000 | 150 | 3 | 23 + 4 | 2100 | 14.0000000000000000 | 150 | 4 | 24 + 10 | 1500 | 10.0000000000000000 | 150 | 10 | 20 + 11 | 1650 | 11.0000000000000000 | 150 | 11 | 21 + 12 | 1800 | 12.0000000000000000 | 150 | 12 | 22 + 13 | 1950 | 13.0000000000000000 | 150 | 13 | 23 + 14 | 2100 | 14.0000000000000000 | 150 | 14 | 24 +(10 rows) + +-- Check with multiple columns in GROUP BY +EXPLAIN (COSTS OFF) +SELECT a, c, count(*) FROM pagg_tab GROUP BY a, c; + QUERY PLAN +------------------------------------------------ + Append + -> HashAggregate + Group Key: pagg_tab.a, pagg_tab.c + -> Seq Scan on pagg_tab_p1 pagg_tab + -> HashAggregate + Group Key: pagg_tab_1.a, pagg_tab_1.c + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> HashAggregate + Group Key: pagg_tab_2.a, pagg_tab_2.c + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(11 rows) + +-- Check with multiple columns in GROUP BY, order in GROUP BY is reversed +EXPLAIN (COSTS OFF) +SELECT a, c, count(*) FROM pagg_tab GROUP BY c, a; + QUERY PLAN +------------------------------------------------ + Append + -> HashAggregate + Group Key: pagg_tab.c, pagg_tab.a + -> Seq Scan on pagg_tab_p1 pagg_tab + -> HashAggregate + Group Key: pagg_tab_1.c, pagg_tab_1.a + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> HashAggregate + Group Key: pagg_tab_2.c, pagg_tab_2.a + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(11 rows) + +-- Check with multiple columns in GROUP BY, order in target-list is reversed +EXPLAIN (COSTS OFF) +SELECT c, a, count(*) FROM pagg_tab GROUP BY a, c; + QUERY PLAN +------------------------------------------------ + Append + -> HashAggregate + Group Key: pagg_tab.a, pagg_tab.c + -> Seq Scan on pagg_tab_p1 pagg_tab + -> HashAggregate + Group Key: pagg_tab_1.a, pagg_tab_1.c + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> HashAggregate + Group Key: pagg_tab_2.a, pagg_tab_2.c + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(11 rows) + +-- Test when input relation for grouping is dummy +EXPLAIN (COSTS OFF) +SELECT c, sum(a) FROM pagg_tab WHERE 1 = 2 GROUP BY c; + QUERY PLAN +------------------------------------- + HashAggregate + Group Key: c + -> Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(5 rows) + +SELECT c, sum(a) FROM pagg_tab WHERE 1 = 2 GROUP BY c; + c | sum +---+----- +(0 rows) + +EXPLAIN (COSTS OFF) +SELECT c, sum(a) FROM pagg_tab WHERE c = 'x' GROUP BY c; + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: c + -> Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(5 rows) + +SELECT c, sum(a) FROM pagg_tab WHERE c = 'x' GROUP BY c; + c | sum +---+----- +(0 rows) + +-- Test GroupAggregate paths by disabling hash aggregates. +SET enable_hashagg TO false; +-- When GROUP BY clause matches full aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT c, sum(a), avg(b), count(*) FROM pagg_tab GROUP BY 1 HAVING avg(d) < 15 ORDER BY 1, 2, 3; + QUERY PLAN +-------------------------------------------------------------- + Sort + Sort Key: pagg_tab.c, (sum(pagg_tab.a)), (avg(pagg_tab.b)) + -> Append + -> GroupAggregate + Group Key: pagg_tab.c + Filter: (avg(pagg_tab.d) < '15'::numeric) + -> Sort + Sort Key: pagg_tab.c + -> Seq Scan on pagg_tab_p1 pagg_tab + -> GroupAggregate + Group Key: pagg_tab_1.c + Filter: (avg(pagg_tab_1.d) < '15'::numeric) + -> Sort + Sort Key: pagg_tab_1.c + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> GroupAggregate + Group Key: pagg_tab_2.c + Filter: (avg(pagg_tab_2.d) < '15'::numeric) + -> Sort + Sort Key: pagg_tab_2.c + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT c, sum(a), avg(b), count(*) FROM pagg_tab GROUP BY 1 HAVING avg(d) < 15 ORDER BY 1, 2, 3; + c | sum | avg | count +------+------+---------------------+------- + 0000 | 2000 | 12.0000000000000000 | 250 + 0001 | 2250 | 13.0000000000000000 | 250 + 0002 | 2500 | 14.0000000000000000 | 250 + 0006 | 2500 | 12.0000000000000000 | 250 + 0007 | 2750 | 13.0000000000000000 | 250 + 0008 | 2000 | 14.0000000000000000 | 250 +(6 rows) + +-- When GROUP BY clause does not match; partial aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), avg(b), count(*) FROM pagg_tab GROUP BY 1 HAVING avg(d) < 15 ORDER BY 1, 2, 3; + QUERY PLAN +------------------------------------------------------------------ + Sort + Sort Key: pagg_tab.a, (sum(pagg_tab.b)), (avg(pagg_tab.b)) + -> Finalize GroupAggregate + Group Key: pagg_tab.a + Filter: (avg(pagg_tab.d) < '15'::numeric) + -> Merge Append + Sort Key: pagg_tab.a + -> Partial GroupAggregate + Group Key: pagg_tab.a + -> Sort + Sort Key: pagg_tab.a + -> Seq Scan on pagg_tab_p1 pagg_tab + -> Partial GroupAggregate + Group Key: pagg_tab_1.a + -> Sort + Sort Key: pagg_tab_1.a + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> Partial GroupAggregate + Group Key: pagg_tab_2.a + -> Sort + Sort Key: pagg_tab_2.a + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(23 rows) + +SELECT a, sum(b), avg(b), count(*) FROM pagg_tab GROUP BY 1 HAVING avg(d) < 15 ORDER BY 1, 2, 3; + a | sum | avg | count +----+------+---------------------+------- + 0 | 1500 | 10.0000000000000000 | 150 + 1 | 1650 | 11.0000000000000000 | 150 + 2 | 1800 | 12.0000000000000000 | 150 + 3 | 1950 | 13.0000000000000000 | 150 + 4 | 2100 | 14.0000000000000000 | 150 + 10 | 1500 | 10.0000000000000000 | 150 + 11 | 1650 | 11.0000000000000000 | 150 + 12 | 1800 | 12.0000000000000000 | 150 + 13 | 1950 | 13.0000000000000000 | 150 + 14 | 2100 | 14.0000000000000000 | 150 +(10 rows) + +-- Test partitionwise grouping without any aggregates +EXPLAIN (COSTS OFF) +SELECT c FROM pagg_tab GROUP BY c ORDER BY 1; + QUERY PLAN +------------------------------------------------------ + Merge Append + Sort Key: pagg_tab.c + -> GroupAggregate + Group Key: pagg_tab.c + -> Sort + Sort Key: pagg_tab.c + -> Seq Scan on pagg_tab_p1 pagg_tab + -> GroupAggregate + Group Key: pagg_tab_1.c + -> Sort + Sort Key: pagg_tab_1.c + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> GroupAggregate + Group Key: pagg_tab_2.c + -> Sort + Sort Key: pagg_tab_2.c + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(18 rows) + +SELECT c FROM pagg_tab GROUP BY c ORDER BY 1; + c +------ + 0000 + 0001 + 0002 + 0003 + 0004 + 0005 + 0006 + 0007 + 0008 + 0009 + 0010 + 0011 +(12 rows) + +EXPLAIN (COSTS OFF) +SELECT a FROM pagg_tab WHERE a < 3 GROUP BY a ORDER BY 1; + QUERY PLAN +------------------------------------------------------------ + Finalize GroupAggregate + Group Key: pagg_tab.a + -> Merge Append + Sort Key: pagg_tab.a + -> Partial GroupAggregate + Group Key: pagg_tab.a + -> Sort + Sort Key: pagg_tab.a + -> Seq Scan on pagg_tab_p1 pagg_tab + Filter: (a < 3) + -> Partial GroupAggregate + Group Key: pagg_tab_1.a + -> Sort + Sort Key: pagg_tab_1.a + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + Filter: (a < 3) + -> Partial GroupAggregate + Group Key: pagg_tab_2.a + -> Sort + Sort Key: pagg_tab_2.a + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Filter: (a < 3) + Optimizer: Postgres query optimizer +(23 rows) + +SELECT a FROM pagg_tab WHERE a < 3 GROUP BY a ORDER BY 1; + a +--- + 0 + 1 + 2 +(3 rows) + +RESET enable_hashagg; +-- ROLLUP, partitionwise aggregation does not apply +EXPLAIN (COSTS OFF) +SELECT c, sum(a) FROM pagg_tab GROUP BY rollup(c) ORDER BY 1, 2; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: pagg_tab.c, (sum(pagg_tab.a)) + -> MixedAggregate + Hash Key: pagg_tab.c + Group Key: () + -> Append + -> Seq Scan on pagg_tab_p1 pagg_tab_1 + -> Seq Scan on pagg_tab_p2 pagg_tab_2 + -> Seq Scan on pagg_tab_p3 pagg_tab_3 + Optimizer: Postgres query optimizer +(10 rows) + +-- ORDERED SET within the aggregate. +-- Full aggregation; since all the rows that belong to the same group come +-- from the same partition, having an ORDER BY within the aggregate doesn't +-- make any difference. +EXPLAIN (COSTS OFF) +SELECT c, sum(b order by a) FROM pagg_tab GROUP BY c ORDER BY 1, 2; + QUERY PLAN +--------------------------------------------------------------- + Sort + Sort Key: pagg_tab.c, (sum(pagg_tab.b ORDER BY pagg_tab.a)) + -> Append + -> GroupAggregate + Group Key: pagg_tab.c + -> Sort + Sort Key: pagg_tab.c + -> Seq Scan on pagg_tab_p1 pagg_tab + -> GroupAggregate + Group Key: pagg_tab_1.c + -> Sort + Sort Key: pagg_tab_1.c + -> Seq Scan on pagg_tab_p2 pagg_tab_1 + -> GroupAggregate + Group Key: pagg_tab_2.c + -> Sort + Sort Key: pagg_tab_2.c + -> Seq Scan on pagg_tab_p3 pagg_tab_2 + Optimizer: Postgres query optimizer +(19 rows) + +-- Since GROUP BY clause does not match with PARTITION KEY; we need to do +-- partial aggregation. However, ORDERED SET are not partial safe and thus +-- partitionwise aggregation plan is not generated. +EXPLAIN (COSTS OFF) +SELECT a, sum(b order by a) FROM pagg_tab GROUP BY a ORDER BY 1, 2; + QUERY PLAN +--------------------------------------------------------------- + Sort + Sort Key: pagg_tab.a, (sum(pagg_tab.b ORDER BY pagg_tab.a)) + -> GroupAggregate + Group Key: pagg_tab.a + -> Sort + Sort Key: pagg_tab.a + -> Append + -> Seq Scan on pagg_tab_p1 pagg_tab_1 + -> Seq Scan on pagg_tab_p2 pagg_tab_2 + -> Seq Scan on pagg_tab_p3 pagg_tab_3 + Optimizer: Postgres query optimizer +(11 rows) + +-- JOIN query +CREATE TABLE pagg_tab1(x int, y int) PARTITION BY RANGE(x); +CREATE TABLE pagg_tab1_p1 PARTITION OF pagg_tab1 FOR VALUES FROM (0) TO (10); +CREATE TABLE pagg_tab1_p2 PARTITION OF pagg_tab1 FOR VALUES FROM (10) TO (20); +CREATE TABLE pagg_tab1_p3 PARTITION OF pagg_tab1 FOR VALUES FROM (20) TO (30); +CREATE TABLE pagg_tab2(x int, y int) PARTITION BY RANGE(y); +CREATE TABLE pagg_tab2_p1 PARTITION OF pagg_tab2 FOR VALUES FROM (0) TO (10); +CREATE TABLE pagg_tab2_p2 PARTITION OF pagg_tab2 FOR VALUES FROM (10) TO (20); +CREATE TABLE pagg_tab2_p3 PARTITION OF pagg_tab2 FOR VALUES FROM (20) TO (30); +INSERT INTO pagg_tab1 SELECT i % 30, i % 20 FROM generate_series(0, 299, 2) i; +INSERT INTO pagg_tab2 SELECT i % 20, i % 30 FROM generate_series(0, 299, 3) i; +ANALYZE pagg_tab1; +ANALYZE pagg_tab2; +-- When GROUP BY clause matches; full aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT t1.x, sum(t1.y), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.x ORDER BY 1, 2, 3; + QUERY PLAN +------------------------------------------------------------- + Sort + Sort Key: t1.x, (sum(t1.y)), (count(*)) + -> Append + -> HashAggregate + Group Key: t1.x + -> Hash Join + Hash Cond: (t1.x = t2.y) + -> Seq Scan on pagg_tab1_p1 t1 + -> Hash + -> Seq Scan on pagg_tab2_p1 t2 + -> HashAggregate + Group Key: t1_1.x + -> Hash Join + Hash Cond: (t1_1.x = t2_1.y) + -> Seq Scan on pagg_tab1_p2 t1_1 + -> Hash + -> Seq Scan on pagg_tab2_p2 t2_1 + -> HashAggregate + Group Key: t1_2.x + -> Hash Join + Hash Cond: (t2_2.y = t1_2.x) + -> Seq Scan on pagg_tab2_p3 t2_2 + -> Hash + -> Seq Scan on pagg_tab1_p3 t1_2 + Optimizer: Postgres query optimizer +(25 rows) + +SELECT t1.x, sum(t1.y), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.x ORDER BY 1, 2, 3; + x | sum | count +----+------+------- + 0 | 500 | 100 + 6 | 1100 | 100 + 12 | 700 | 100 + 18 | 1300 | 100 + 24 | 900 | 100 +(5 rows) + +-- Check with whole-row reference; partitionwise aggregation does not apply +EXPLAIN (COSTS OFF) +SELECT t1.x, sum(t1.y), count(t1) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.x ORDER BY 1, 2, 3; + QUERY PLAN +------------------------------------------------------------- + Sort + Sort Key: t1.x, (sum(t1.y)), (count(((t1.*)::pagg_tab1))) + -> HashAggregate + Group Key: t1.x + -> Hash Join + Hash Cond: (t1.x = t2.y) + -> Append + -> Seq Scan on pagg_tab1_p1 t1_1 + -> Seq Scan on pagg_tab1_p2 t1_2 + -> Seq Scan on pagg_tab1_p3 t1_3 + -> Hash + -> Append + -> Seq Scan on pagg_tab2_p1 t2_1 + -> Seq Scan on pagg_tab2_p2 t2_2 + -> Seq Scan on pagg_tab2_p3 t2_3 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT t1.x, sum(t1.y), count(t1) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.x ORDER BY 1, 2, 3; + x | sum | count +----+------+------- + 0 | 500 | 100 + 6 | 1100 | 100 + 12 | 700 | 100 + 18 | 1300 | 100 + 24 | 900 | 100 +(5 rows) + +-- GROUP BY having other matching key +EXPLAIN (COSTS OFF) +SELECT t2.y, sum(t1.y), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t2.y ORDER BY 1, 2, 3; + QUERY PLAN +------------------------------------------------------------- + Sort + Sort Key: t2.y, (sum(t1.y)), (count(*)) + -> Append + -> HashAggregate + Group Key: t2.y + -> Hash Join + Hash Cond: (t1.x = t2.y) + -> Seq Scan on pagg_tab1_p1 t1 + -> Hash + -> Seq Scan on pagg_tab2_p1 t2 + -> HashAggregate + Group Key: t2_1.y + -> Hash Join + Hash Cond: (t1_1.x = t2_1.y) + -> Seq Scan on pagg_tab1_p2 t1_1 + -> Hash + -> Seq Scan on pagg_tab2_p2 t2_1 + -> HashAggregate + Group Key: t2_2.y + -> Hash Join + Hash Cond: (t2_2.y = t1_2.x) + -> Seq Scan on pagg_tab2_p3 t2_2 + -> Hash + -> Seq Scan on pagg_tab1_p3 t1_2 + Optimizer: Postgres query optimizer +(25 rows) + +-- When GROUP BY clause does not match; partial aggregation is performed for each partition. +-- Also test GroupAggregate paths by disabling hash aggregates. +SET enable_hashagg TO false; +EXPLAIN (COSTS OFF) +SELECT t1.y, sum(t1.x), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.y HAVING avg(t1.x) > 10 ORDER BY 1, 2, 3; + QUERY PLAN +------------------------------------------------------------------------- + Sort + Sort Key: t1.y, (sum(t1.x)), (count(*)) + -> Finalize GroupAggregate + Group Key: t1.y + Filter: (avg(t1.x) > '10'::numeric) + -> Merge Append + Sort Key: t1.y + -> Partial GroupAggregate + Group Key: t1.y + -> Sort + Sort Key: t1.y + -> Hash Join + Hash Cond: (t1.x = t2.y) + -> Seq Scan on pagg_tab1_p1 t1 + -> Hash + -> Seq Scan on pagg_tab2_p1 t2 + -> Partial GroupAggregate + Group Key: t1_1.y + -> Sort + Sort Key: t1_1.y + -> Hash Join + Hash Cond: (t1_1.x = t2_1.y) + -> Seq Scan on pagg_tab1_p2 t1_1 + -> Hash + -> Seq Scan on pagg_tab2_p2 t2_1 + -> Partial GroupAggregate + Group Key: t1_2.y + -> Sort + Sort Key: t1_2.y + -> Hash Join + Hash Cond: (t2_2.y = t1_2.x) + -> Seq Scan on pagg_tab2_p3 t2_2 + -> Hash + -> Seq Scan on pagg_tab1_p3 t1_2 + Optimizer: Postgres query optimizer +(35 rows) + +SELECT t1.y, sum(t1.x), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.y HAVING avg(t1.x) > 10 ORDER BY 1, 2, 3; + y | sum | count +----+------+------- + 2 | 600 | 50 + 4 | 1200 | 50 + 8 | 900 | 50 + 12 | 600 | 50 + 14 | 1200 | 50 + 18 | 900 | 50 +(6 rows) + +RESET enable_hashagg; +-- Check with LEFT/RIGHT/FULL OUTER JOINs which produces NULL values for +-- aggregation +-- LEFT JOIN, should produce partial partitionwise aggregation plan as +-- GROUP BY is on nullable column +EXPLAIN (COSTS OFF) +SELECT b.y, sum(a.y) FROM pagg_tab1 a LEFT JOIN pagg_tab2 b ON a.x = b.y GROUP BY b.y ORDER BY 1 NULLS LAST; + QUERY PLAN +------------------------------------------------------------------ + Finalize GroupAggregate + Group Key: b.y + -> Sort + Sort Key: b.y + -> Append + -> Partial HashAggregate + Group Key: b.y + -> Hash Left Join + Hash Cond: (a.x = b.y) + -> Seq Scan on pagg_tab1_p1 a + -> Hash + -> Seq Scan on pagg_tab2_p1 b + -> Partial HashAggregate + Group Key: b_1.y + -> Hash Left Join + Hash Cond: (a_1.x = b_1.y) + -> Seq Scan on pagg_tab1_p2 a_1 + -> Hash + -> Seq Scan on pagg_tab2_p2 b_1 + -> Partial HashAggregate + Group Key: b_2.y + -> Hash Right Join + Hash Cond: (b_2.y = a_2.x) + -> Seq Scan on pagg_tab2_p3 b_2 + -> Hash + -> Seq Scan on pagg_tab1_p3 a_2 + Optimizer: Postgres query optimizer +(27 rows) + +SELECT b.y, sum(a.y) FROM pagg_tab1 a LEFT JOIN pagg_tab2 b ON a.x = b.y GROUP BY b.y ORDER BY 1 NULLS LAST; + y | sum +----+------ + 0 | 500 + 6 | 1100 + 12 | 700 + 18 | 1300 + 24 | 900 + | 900 +(6 rows) + +-- RIGHT JOIN, should produce full partitionwise aggregation plan as +-- GROUP BY is on non-nullable column +EXPLAIN (COSTS OFF) +SELECT b.y, sum(a.y) FROM pagg_tab1 a RIGHT JOIN pagg_tab2 b ON a.x = b.y GROUP BY b.y ORDER BY 1 NULLS LAST; + QUERY PLAN +------------------------------------------------------------ + Sort + Sort Key: b.y + -> Append + -> HashAggregate + Group Key: b.y + -> Hash Right Join + Hash Cond: (a.x = b.y) + -> Seq Scan on pagg_tab1_p1 a + -> Hash + -> Seq Scan on pagg_tab2_p1 b + -> HashAggregate + Group Key: b_1.y + -> Hash Right Join + Hash Cond: (a_1.x = b_1.y) + -> Seq Scan on pagg_tab1_p2 a_1 + -> Hash + -> Seq Scan on pagg_tab2_p2 b_1 + -> HashAggregate + Group Key: b_2.y + -> Hash Left Join + Hash Cond: (b_2.y = a_2.x) + -> Seq Scan on pagg_tab2_p3 b_2 + -> Hash + -> Seq Scan on pagg_tab1_p3 a_2 + Optimizer: Postgres query optimizer +(25 rows) + +SELECT b.y, sum(a.y) FROM pagg_tab1 a RIGHT JOIN pagg_tab2 b ON a.x = b.y GROUP BY b.y ORDER BY 1 NULLS LAST; + y | sum +----+------ + 0 | 500 + 3 | + 6 | 1100 + 9 | + 12 | 700 + 15 | + 18 | 1300 + 21 | + 24 | 900 + 27 | +(10 rows) + +-- FULL JOIN, should produce partial partitionwise aggregation plan as +-- GROUP BY is on nullable column +EXPLAIN (COSTS OFF) +SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x ORDER BY 1 NULLS LAST; + QUERY PLAN +------------------------------------------------------------------ + Finalize GroupAggregate + Group Key: a.x + -> Sort + Sort Key: a.x + -> Append + -> Partial HashAggregate + Group Key: a.x + -> Hash Full Join + Hash Cond: (a.x = b.y) + -> Seq Scan on pagg_tab1_p1 a + -> Hash + -> Seq Scan on pagg_tab2_p1 b + -> Partial HashAggregate + Group Key: a_1.x + -> Hash Full Join + Hash Cond: (a_1.x = b_1.y) + -> Seq Scan on pagg_tab1_p2 a_1 + -> Hash + -> Seq Scan on pagg_tab2_p2 b_1 + -> Partial HashAggregate + Group Key: a_2.x + -> Hash Full Join + Hash Cond: (b_2.y = a_2.x) + -> Seq Scan on pagg_tab2_p3 b_2 + -> Hash + -> Seq Scan on pagg_tab1_p3 a_2 + Optimizer: Postgres query optimizer +(27 rows) + +SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x ORDER BY 1 NULLS LAST; + x | sum +----+------ + 0 | 500 + 2 | + 4 | + 6 | 1100 + 8 | + 10 | + 12 | 700 + 14 | + 16 | + 18 | 1300 + 20 | + 22 | + 24 | 900 + 26 | + 28 | + | 500 +(16 rows) + +-- LEFT JOIN, with dummy relation on right side, ideally +-- should produce full partitionwise aggregation plan as GROUP BY is on +-- non-nullable columns. +-- But right now we are unable to do partitionwise join in this case. +EXPLAIN (COSTS OFF) +SELECT a.x, b.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x < 20) a LEFT JOIN (SELECT * FROM pagg_tab2 WHERE y > 10) b ON a.x = b.y WHERE a.x > 5 or b.y < 20 GROUP BY a.x, b.y ORDER BY 1, 2; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: pagg_tab1.x, pagg_tab2.y + -> HashAggregate + Group Key: pagg_tab1.x, pagg_tab2.y + -> Hash Left Join + Hash Cond: (pagg_tab1.x = pagg_tab2.y) + Filter: ((pagg_tab1.x > 5) OR (pagg_tab2.y < 20)) + -> Append + -> Seq Scan on pagg_tab1_p1 pagg_tab1_1 + Filter: (x < 20) + -> Seq Scan on pagg_tab1_p2 pagg_tab1_2 + Filter: (x < 20) + -> Hash + -> Append + -> Seq Scan on pagg_tab2_p2 pagg_tab2_1 + Filter: (y > 10) + -> Seq Scan on pagg_tab2_p3 pagg_tab2_2 + Filter: (y > 10) + Optimizer: Postgres query optimizer +(19 rows) + +SELECT a.x, b.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x < 20) a LEFT JOIN (SELECT * FROM pagg_tab2 WHERE y > 10) b ON a.x = b.y WHERE a.x > 5 or b.y < 20 GROUP BY a.x, b.y ORDER BY 1, 2; + x | y | count +----+----+------- + 6 | | 10 + 8 | | 10 + 10 | | 10 + 12 | 12 | 100 + 14 | | 10 + 16 | | 10 + 18 | 18 | 100 +(7 rows) + +-- FULL JOIN, with dummy relations on both sides, ideally +-- should produce partial partitionwise aggregation plan as GROUP BY is on +-- nullable columns. +-- But right now we are unable to do partitionwise join in this case. +EXPLAIN (COSTS OFF) +SELECT a.x, b.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x < 20) a FULL JOIN (SELECT * FROM pagg_tab2 WHERE y > 10) b ON a.x = b.y WHERE a.x > 5 or b.y < 20 GROUP BY a.x, b.y ORDER BY 1, 2; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: pagg_tab1.x, pagg_tab2.y + -> HashAggregate + Group Key: pagg_tab1.x, pagg_tab2.y + -> Hash Full Join + Hash Cond: (pagg_tab1.x = pagg_tab2.y) + Filter: ((pagg_tab1.x > 5) OR (pagg_tab2.y < 20)) + -> Append + -> Seq Scan on pagg_tab1_p1 pagg_tab1_1 + Filter: (x < 20) + -> Seq Scan on pagg_tab1_p2 pagg_tab1_2 + Filter: (x < 20) + -> Hash + -> Append + -> Seq Scan on pagg_tab2_p2 pagg_tab2_1 + Filter: (y > 10) + -> Seq Scan on pagg_tab2_p3 pagg_tab2_2 + Filter: (y > 10) + Optimizer: Postgres query optimizer +(19 rows) + +SELECT a.x, b.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x < 20) a FULL JOIN (SELECT * FROM pagg_tab2 WHERE y > 10) b ON a.x = b.y WHERE a.x > 5 or b.y < 20 GROUP BY a.x, b.y ORDER BY 1, 2; + x | y | count +----+----+------- + 6 | | 10 + 8 | | 10 + 10 | | 10 + 12 | 12 | 100 + 14 | | 10 + 16 | | 10 + 18 | 18 | 100 + | 15 | 10 +(8 rows) + +-- Empty join relation because of empty outer side, no partitionwise agg plan +EXPLAIN (COSTS OFF) +SELECT a.x, a.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x = 1 AND x = 2) a LEFT JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x, a.y ORDER BY 1, 2; + QUERY PLAN +--------------------------------------- + GroupAggregate + Group Key: pagg_tab1.x, pagg_tab1.y + -> Sort + Sort Key: pagg_tab1.y + -> Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(7 rows) + +SELECT a.x, a.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x = 1 AND x = 2) a LEFT JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x, a.y ORDER BY 1, 2; + x | y | count +---+---+------- +(0 rows) + +-- Partition by multiple columns +CREATE TABLE pagg_tab_m (a int, b int, c int) PARTITION BY RANGE(a, ((a+b)/2)); +CREATE TABLE pagg_tab_m_p1 PARTITION OF pagg_tab_m FOR VALUES FROM (0, 0) TO (12, 12); +CREATE TABLE pagg_tab_m_p2 PARTITION OF pagg_tab_m FOR VALUES FROM (12, 12) TO (22, 22); +CREATE TABLE pagg_tab_m_p3 PARTITION OF pagg_tab_m FOR VALUES FROM (22, 22) TO (30, 30); +INSERT INTO pagg_tab_m SELECT i % 30, i % 40, i % 50 FROM generate_series(0, 2999) i; +ANALYZE pagg_tab_m; +-- Partial aggregation as GROUP BY clause does not match with PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT a, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY a HAVING avg(c) < 22 ORDER BY 1, 2, 3; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_m.a, (sum(pagg_tab_m.b)), (avg(pagg_tab_m.c)) + -> Finalize HashAggregate + Group Key: pagg_tab_m.a + Filter: (avg(pagg_tab_m.c) < '22'::numeric) + -> Append + -> Partial HashAggregate + Group Key: pagg_tab_m.a + -> Seq Scan on pagg_tab_m_p1 pagg_tab_m + -> Partial HashAggregate + Group Key: pagg_tab_m_1.a + -> Seq Scan on pagg_tab_m_p2 pagg_tab_m_1 + -> Partial HashAggregate + Group Key: pagg_tab_m_2.a + -> Seq Scan on pagg_tab_m_p3 pagg_tab_m_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT a, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY a HAVING avg(c) < 22 ORDER BY 1, 2, 3; + a | sum | avg | count +----+------+---------------------+------- + 0 | 1500 | 20.0000000000000000 | 100 + 1 | 1600 | 21.0000000000000000 | 100 + 10 | 1500 | 20.0000000000000000 | 100 + 11 | 1600 | 21.0000000000000000 | 100 + 20 | 1500 | 20.0000000000000000 | 100 + 21 | 1600 | 21.0000000000000000 | 100 +(6 rows) + +-- Full aggregation as GROUP BY clause matches with PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT a, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY a, (a+b)/2 HAVING sum(b) < 50 ORDER BY 1, 2, 3; + QUERY PLAN +---------------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_m.a, (sum(pagg_tab_m.b)), (avg(pagg_tab_m.c)) + -> Append + -> HashAggregate + Group Key: pagg_tab_m.a, ((pagg_tab_m.a + pagg_tab_m.b) / 2) + Filter: (sum(pagg_tab_m.b) < 50) + -> Seq Scan on pagg_tab_m_p1 pagg_tab_m + -> HashAggregate + Group Key: pagg_tab_m_1.a, ((pagg_tab_m_1.a + pagg_tab_m_1.b) / 2) + Filter: (sum(pagg_tab_m_1.b) < 50) + -> Seq Scan on pagg_tab_m_p2 pagg_tab_m_1 + -> HashAggregate + Group Key: pagg_tab_m_2.a, ((pagg_tab_m_2.a + pagg_tab_m_2.b) / 2) + Filter: (sum(pagg_tab_m_2.b) < 50) + -> Seq Scan on pagg_tab_m_p3 pagg_tab_m_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT a, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY a, (a+b)/2 HAVING sum(b) < 50 ORDER BY 1, 2, 3; + a | sum | avg | count +----+-----+---------------------+------- + 0 | 0 | 20.0000000000000000 | 25 + 1 | 25 | 21.0000000000000000 | 25 + 10 | 0 | 20.0000000000000000 | 25 + 11 | 25 | 21.0000000000000000 | 25 + 20 | 0 | 20.0000000000000000 | 25 + 21 | 25 | 21.0000000000000000 | 25 +(6 rows) + +-- Full aggregation as PARTITION KEY is part of GROUP BY clause +EXPLAIN (COSTS OFF) +SELECT a, c, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY (a+b)/2, 2, 1 HAVING sum(b) = 50 AND avg(c) > 25 ORDER BY 1, 2, 3; + QUERY PLAN +-------------------------------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_m.a, pagg_tab_m.c, (sum(pagg_tab_m.b)) + -> Append + -> HashAggregate + Group Key: ((pagg_tab_m.a + pagg_tab_m.b) / 2), pagg_tab_m.c, pagg_tab_m.a + Filter: ((sum(pagg_tab_m.b) = 50) AND (avg(pagg_tab_m.c) > '25'::numeric)) + -> Seq Scan on pagg_tab_m_p1 pagg_tab_m + -> HashAggregate + Group Key: ((pagg_tab_m_1.a + pagg_tab_m_1.b) / 2), pagg_tab_m_1.c, pagg_tab_m_1.a + Filter: ((sum(pagg_tab_m_1.b) = 50) AND (avg(pagg_tab_m_1.c) > '25'::numeric)) + -> Seq Scan on pagg_tab_m_p2 pagg_tab_m_1 + -> HashAggregate + Group Key: ((pagg_tab_m_2.a + pagg_tab_m_2.b) / 2), pagg_tab_m_2.c, pagg_tab_m_2.a + Filter: ((sum(pagg_tab_m_2.b) = 50) AND (avg(pagg_tab_m_2.c) > '25'::numeric)) + -> Seq Scan on pagg_tab_m_p3 pagg_tab_m_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT a, c, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY (a+b)/2, 2, 1 HAVING sum(b) = 50 AND avg(c) > 25 ORDER BY 1, 2, 3; + a | c | sum | avg | count +----+----+-----+---------------------+------- + 0 | 30 | 50 | 30.0000000000000000 | 5 + 0 | 40 | 50 | 40.0000000000000000 | 5 + 10 | 30 | 50 | 30.0000000000000000 | 5 + 10 | 40 | 50 | 40.0000000000000000 | 5 + 20 | 30 | 50 | 30.0000000000000000 | 5 + 20 | 40 | 50 | 40.0000000000000000 | 5 +(6 rows) + +-- Test with multi-level partitioning scheme +CREATE TABLE pagg_tab_ml (a int, b int, c text) PARTITION BY RANGE(a); +CREATE TABLE pagg_tab_ml_p1 PARTITION OF pagg_tab_ml FOR VALUES FROM (0) TO (12); +CREATE TABLE pagg_tab_ml_p2 PARTITION OF pagg_tab_ml FOR VALUES FROM (12) TO (20) PARTITION BY LIST (c); +CREATE TABLE pagg_tab_ml_p2_s1 PARTITION OF pagg_tab_ml_p2 FOR VALUES IN ('0000', '0001', '0002'); +CREATE TABLE pagg_tab_ml_p2_s2 PARTITION OF pagg_tab_ml_p2 FOR VALUES IN ('0003'); +-- This level of partitioning has different column positions than the parent +CREATE TABLE pagg_tab_ml_p3(b int, c text, a int) PARTITION BY RANGE (b); +CREATE TABLE pagg_tab_ml_p3_s1(c text, a int, b int); +CREATE TABLE pagg_tab_ml_p3_s2 PARTITION OF pagg_tab_ml_p3 FOR VALUES FROM (7) TO (10); +ALTER TABLE pagg_tab_ml_p3 ATTACH PARTITION pagg_tab_ml_p3_s1 FOR VALUES FROM (0) TO (7); +ALTER TABLE pagg_tab_ml ATTACH PARTITION pagg_tab_ml_p3 FOR VALUES FROM (20) TO (30); +INSERT INTO pagg_tab_ml SELECT i % 30, i % 10, to_char(i % 4, 'FM0000') FROM generate_series(0, 29999) i; +ANALYZE pagg_tab_ml; +-- For Parallel Append +SET max_parallel_workers_per_gather TO 2; +-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY +-- for level 1 only. For subpartitions, GROUP BY clause does not match with +-- PARTITION KEY, but still we do not see a partial aggregation as array_agg() +-- is not partial agg safe. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + QUERY PLAN +-------------------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_ml.a, (sum(pagg_tab_ml.b)), (array_agg(DISTINCT pagg_tab_ml.c)) + -> Append + -> GroupAggregate + Group Key: pagg_tab_ml.a + Filter: (avg(pagg_tab_ml.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml.a + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> GroupAggregate + Group Key: pagg_tab_ml_2.a + Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_2.a + -> Append + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2 + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 + -> GroupAggregate + Group Key: pagg_tab_ml_5.a + Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_5.a + -> Append + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5 + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6 + Optimizer: Postgres query optimizer +(26 rows) + +SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + a | sum | array_agg | count +----+------+-------------+------- + 0 | 0 | {0000,0002} | 1000 + 1 | 1000 | {0001,0003} | 1000 + 2 | 2000 | {0000,0002} | 1000 + 10 | 0 | {0000,0002} | 1000 + 11 | 1000 | {0001,0003} | 1000 + 12 | 2000 | {0000,0002} | 1000 + 20 | 0 | {0000,0002} | 1000 + 21 | 1000 | {0001,0003} | 1000 + 22 | 2000 | {0000,0002} | 1000 +(9 rows) + +-- Without ORDER BY clause, to test Gather at top-most path +EXPLAIN (COSTS OFF) +SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3; + QUERY PLAN +--------------------------------------------------------------------- + Append + -> GroupAggregate + Group Key: pagg_tab_ml.a + Filter: (avg(pagg_tab_ml.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml.a + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> GroupAggregate + Group Key: pagg_tab_ml_2.a + Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_2.a + -> Append + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2 + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 + -> GroupAggregate + Group Key: pagg_tab_ml_5.a + Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_5.a + -> Append + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5 + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6 + Optimizer: Postgres query optimizer +(24 rows) + +-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY +-- for level 1 only. For subpartitions, GROUP BY clause does not match with +-- PARTITION KEY, thus we will have a partial aggregation for them. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + QUERY PLAN +--------------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_ml.a, (sum(pagg_tab_ml.b)), (count(*)) + -> Append + -> HashAggregate + Group Key: pagg_tab_ml.a + Filter: (avg(pagg_tab_ml.b) < '3'::numeric) + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> Finalize GroupAggregate + Group Key: pagg_tab_ml_2.a + Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_2.a + -> Append + -> Partial HashAggregate + Group Key: pagg_tab_ml_2.a + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2 + -> Partial HashAggregate + Group Key: pagg_tab_ml_3.a + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 + -> Finalize GroupAggregate + Group Key: pagg_tab_ml_5.a + Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_5.a + -> Append + -> Partial HashAggregate + Group Key: pagg_tab_ml_5.a + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5 + -> Partial HashAggregate + Group Key: pagg_tab_ml_6.a + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6 + Optimizer: Postgres query optimizer +(32 rows) + +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + a | sum | count +----+------+------- + 0 | 0 | 1000 + 1 | 1000 | 1000 + 2 | 2000 | 1000 + 10 | 0 | 1000 + 11 | 1000 | 1000 + 12 | 2000 | 1000 + 20 | 0 | 1000 + 21 | 1000 | 1000 + 22 | 2000 | 1000 +(9 rows) + +-- Partial aggregation at all levels as GROUP BY clause does not match with +-- PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3; + QUERY PLAN +--------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_ml.b, (sum(pagg_tab_ml.a)), (count(*)) + -> Finalize GroupAggregate + Group Key: pagg_tab_ml.b + -> Sort + Sort Key: pagg_tab_ml.b + -> Append + -> Partial HashAggregate + Group Key: pagg_tab_ml.b + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> Partial HashAggregate + Group Key: pagg_tab_ml_1.b + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_1 + -> Partial HashAggregate + Group Key: pagg_tab_ml_2.b + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2 + -> Partial HashAggregate + Group Key: pagg_tab_ml_3.b + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_3 + -> Partial HashAggregate + Group Key: pagg_tab_ml_4.b + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_4 + Optimizer: Postgres query optimizer +(23 rows) + +SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3; + b | sum | count +---+-------+------- + 0 | 30000 | 3000 + 1 | 33000 | 3000 + 2 | 36000 | 3000 + 3 | 39000 | 3000 + 4 | 42000 | 3000 +(5 rows) + +-- Full aggregation at all levels as GROUP BY clause matches with PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3; + QUERY PLAN +---------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_ml.a, (sum(pagg_tab_ml.b)), (count(*)) + -> Append + -> HashAggregate + Group Key: pagg_tab_ml.a, pagg_tab_ml.b, pagg_tab_ml.c + Filter: (avg(pagg_tab_ml.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> HashAggregate + Group Key: pagg_tab_ml_1.a, pagg_tab_ml_1.b, pagg_tab_ml_1.c + Filter: (avg(pagg_tab_ml_1.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_1 + -> HashAggregate + Group Key: pagg_tab_ml_2.a, pagg_tab_ml_2.b, pagg_tab_ml_2.c + Filter: (avg(pagg_tab_ml_2.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2 + -> HashAggregate + Group Key: pagg_tab_ml_3.a, pagg_tab_ml_3.b, pagg_tab_ml_3.c + Filter: (avg(pagg_tab_ml_3.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_3 + -> HashAggregate + Group Key: pagg_tab_ml_4.a, pagg_tab_ml_4.b, pagg_tab_ml_4.c + Filter: (avg(pagg_tab_ml_4.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_4 + Optimizer: Postgres query optimizer +(24 rows) + +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3; + a | sum | count +----+------+------- + 8 | 4000 | 500 + 8 | 4000 | 500 + 9 | 4500 | 500 + 9 | 4500 | 500 + 18 | 4000 | 500 + 18 | 4000 | 500 + 19 | 4500 | 500 + 19 | 4500 | 500 + 28 | 4000 | 500 + 28 | 4000 | 500 + 29 | 4500 | 500 + 29 | 4500 | 500 +(12 rows) + +-- Parallelism within partitionwise aggregates +SET min_parallel_table_scan_size TO '8kB'; +SET parallel_setup_cost TO 0; +-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY +-- for level 1 only. For subpartitions, GROUP BY clause does not match with +-- PARTITION KEY, thus we will have a partial aggregation for them. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + QUERY PLAN +--------------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_ml.a, (sum(pagg_tab_ml.b)), (count(*)) + -> Append + -> HashAggregate + Group Key: pagg_tab_ml.a + Filter: (avg(pagg_tab_ml.b) < '3'::numeric) + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> Finalize GroupAggregate + Group Key: pagg_tab_ml_2.a + Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_2.a + -> Append + -> Partial HashAggregate + Group Key: pagg_tab_ml_2.a + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2 + -> Partial HashAggregate + Group Key: pagg_tab_ml_3.a + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 + -> Finalize GroupAggregate + Group Key: pagg_tab_ml_5.a + Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_5.a + -> Append + -> Partial HashAggregate + Group Key: pagg_tab_ml_5.a + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5 + -> Partial HashAggregate + Group Key: pagg_tab_ml_6.a + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6 + Optimizer: Postgres query optimizer +(32 rows) + +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + a | sum | count +----+------+------- + 0 | 0 | 1000 + 1 | 1000 | 1000 + 2 | 2000 | 1000 + 10 | 0 | 1000 + 11 | 1000 | 1000 + 12 | 2000 | 1000 + 20 | 0 | 1000 + 21 | 1000 | 1000 + 22 | 2000 | 1000 +(9 rows) + +-- Partial aggregation at all levels as GROUP BY clause does not match with +-- PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3; + QUERY PLAN +--------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_ml.b, (sum(pagg_tab_ml.a)), (count(*)) + -> Finalize GroupAggregate + Group Key: pagg_tab_ml.b + -> Sort + Sort Key: pagg_tab_ml.b + -> Append + -> Partial HashAggregate + Group Key: pagg_tab_ml.b + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> Partial HashAggregate + Group Key: pagg_tab_ml_1.b + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_1 + -> Partial HashAggregate + Group Key: pagg_tab_ml_2.b + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2 + -> Partial HashAggregate + Group Key: pagg_tab_ml_3.b + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_3 + -> Partial HashAggregate + Group Key: pagg_tab_ml_4.b + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_4 + Optimizer: Postgres query optimizer +(23 rows) + +SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3; + b | sum | count +---+-------+------- + 0 | 30000 | 3000 + 1 | 33000 | 3000 + 2 | 36000 | 3000 + 3 | 39000 | 3000 + 4 | 42000 | 3000 +(5 rows) + +-- Full aggregation at all levels as GROUP BY clause matches with PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3; + QUERY PLAN +---------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_ml.a, (sum(pagg_tab_ml.b)), (count(*)) + -> Append + -> HashAggregate + Group Key: pagg_tab_ml.a, pagg_tab_ml.b, pagg_tab_ml.c + Filter: (avg(pagg_tab_ml.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> HashAggregate + Group Key: pagg_tab_ml_1.a, pagg_tab_ml_1.b, pagg_tab_ml_1.c + Filter: (avg(pagg_tab_ml_1.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_1 + -> HashAggregate + Group Key: pagg_tab_ml_2.a, pagg_tab_ml_2.b, pagg_tab_ml_2.c + Filter: (avg(pagg_tab_ml_2.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_2 + -> HashAggregate + Group Key: pagg_tab_ml_3.a, pagg_tab_ml_3.b, pagg_tab_ml_3.c + Filter: (avg(pagg_tab_ml_3.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_3 + -> HashAggregate + Group Key: pagg_tab_ml_4.a, pagg_tab_ml_4.b, pagg_tab_ml_4.c + Filter: (avg(pagg_tab_ml_4.b) > '7'::numeric) + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_4 + Optimizer: Postgres query optimizer +(24 rows) + +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3; + a | sum | count +----+------+------- + 8 | 4000 | 500 + 8 | 4000 | 500 + 9 | 4500 | 500 + 9 | 4500 | 500 + 18 | 4000 | 500 + 18 | 4000 | 500 + 19 | 4500 | 500 + 19 | 4500 | 500 + 28 | 4000 | 500 + 28 | 4000 | 500 + 29 | 4500 | 500 + 29 | 4500 | 500 +(12 rows) + +-- Parallelism within partitionwise aggregates (single level) +-- Add few parallel setup cost, so that we will see a plan which gathers +-- partially created paths even for full aggregation and sticks a single Gather +-- followed by finalization step. +-- Without this, the cost of doing partial aggregation + Gather + finalization +-- for each partition and then Append over it turns out to be same and this +-- wins as we add it first. This parallel_setup_cost plays a vital role in +-- costing such plans. +SET parallel_setup_cost TO 10; +CREATE TABLE pagg_tab_para(x int, y int) PARTITION BY RANGE(x); +CREATE TABLE pagg_tab_para_p1 PARTITION OF pagg_tab_para FOR VALUES FROM (0) TO (12); +CREATE TABLE pagg_tab_para_p2 PARTITION OF pagg_tab_para FOR VALUES FROM (12) TO (22); +CREATE TABLE pagg_tab_para_p3 PARTITION OF pagg_tab_para FOR VALUES FROM (22) TO (30); +INSERT INTO pagg_tab_para SELECT i % 30, i % 20 FROM generate_series(0, 29999) i; +ANALYZE pagg_tab_para; +-- When GROUP BY clause matches; full aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + QUERY PLAN +----------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_para.x, (sum(pagg_tab_para.y)), (avg(pagg_tab_para.y)) + -> Append + -> HashAggregate + Group Key: pagg_tab_para.x + Filter: (avg(pagg_tab_para.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p1 pagg_tab_para + -> HashAggregate + Group Key: pagg_tab_para_1.x + Filter: (avg(pagg_tab_para_1.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p2 pagg_tab_para_1 + -> HashAggregate + Group Key: pagg_tab_para_2.x + Filter: (avg(pagg_tab_para_2.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p3 pagg_tab_para_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + x | sum | avg | count +----+------+--------------------+------- + 0 | 5000 | 5.0000000000000000 | 1000 + 1 | 6000 | 6.0000000000000000 | 1000 + 10 | 5000 | 5.0000000000000000 | 1000 + 11 | 6000 | 6.0000000000000000 | 1000 + 20 | 5000 | 5.0000000000000000 | 1000 + 21 | 6000 | 6.0000000000000000 | 1000 +(6 rows) + +-- When GROUP BY clause does not match; partial aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT y, sum(x), avg(x), count(*) FROM pagg_tab_para GROUP BY y HAVING avg(x) < 12 ORDER BY 1, 2, 3; + QUERY PLAN +----------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_para.y, (sum(pagg_tab_para.x)), (avg(pagg_tab_para.x)) + -> Finalize GroupAggregate + Group Key: pagg_tab_para.y + Filter: (avg(pagg_tab_para.x) < '12'::numeric) + -> Sort + Sort Key: pagg_tab_para.y + -> Append + -> Partial HashAggregate + Group Key: pagg_tab_para.y + -> Seq Scan on pagg_tab_para_p1 pagg_tab_para + -> Partial HashAggregate + Group Key: pagg_tab_para_1.y + -> Seq Scan on pagg_tab_para_p2 pagg_tab_para_1 + -> Partial HashAggregate + Group Key: pagg_tab_para_2.y + -> Seq Scan on pagg_tab_para_p3 pagg_tab_para_2 + Optimizer: Postgres query optimizer +(18 rows) + +SELECT y, sum(x), avg(x), count(*) FROM pagg_tab_para GROUP BY y HAVING avg(x) < 12 ORDER BY 1, 2, 3; + y | sum | avg | count +----+-------+---------------------+------- + 0 | 15000 | 10.0000000000000000 | 1500 + 1 | 16500 | 11.0000000000000000 | 1500 + 10 | 15000 | 10.0000000000000000 | 1500 + 11 | 16500 | 11.0000000000000000 | 1500 +(4 rows) + +-- Test when parent can produce parallel paths but not any (or some) of its children +-- (Use one more aggregate to tilt the cost estimates for the plan we want) +ALTER TABLE pagg_tab_para_p1 SET (parallel_workers = 0); +ALTER TABLE pagg_tab_para_p3 SET (parallel_workers = 0); +ANALYZE pagg_tab_para; +EXPLAIN (COSTS OFF) +SELECT x, sum(y), avg(y), sum(x+y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + QUERY PLAN +----------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_para.x, (sum(pagg_tab_para.y)), (avg(pagg_tab_para.y)) + -> Append + -> HashAggregate + Group Key: pagg_tab_para.x + Filter: (avg(pagg_tab_para.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p1 pagg_tab_para + -> HashAggregate + Group Key: pagg_tab_para_1.x + Filter: (avg(pagg_tab_para_1.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p2 pagg_tab_para_1 + -> HashAggregate + Group Key: pagg_tab_para_2.x + Filter: (avg(pagg_tab_para_2.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p3 pagg_tab_para_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT x, sum(y), avg(y), sum(x+y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + x | sum | avg | sum | count +----+------+--------------------+-------+------- + 0 | 5000 | 5.0000000000000000 | 5000 | 1000 + 1 | 6000 | 6.0000000000000000 | 7000 | 1000 + 10 | 5000 | 5.0000000000000000 | 15000 | 1000 + 11 | 6000 | 6.0000000000000000 | 17000 | 1000 + 20 | 5000 | 5.0000000000000000 | 25000 | 1000 + 21 | 6000 | 6.0000000000000000 | 27000 | 1000 +(6 rows) + +ALTER TABLE pagg_tab_para_p2 SET (parallel_workers = 0); +ANALYZE pagg_tab_para; +EXPLAIN (COSTS OFF) +SELECT x, sum(y), avg(y), sum(x+y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + QUERY PLAN +----------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_para.x, (sum(pagg_tab_para.y)), (avg(pagg_tab_para.y)) + -> Append + -> HashAggregate + Group Key: pagg_tab_para.x + Filter: (avg(pagg_tab_para.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p1 pagg_tab_para + -> HashAggregate + Group Key: pagg_tab_para_1.x + Filter: (avg(pagg_tab_para_1.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p2 pagg_tab_para_1 + -> HashAggregate + Group Key: pagg_tab_para_2.x + Filter: (avg(pagg_tab_para_2.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p3 pagg_tab_para_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT x, sum(y), avg(y), sum(x+y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + x | sum | avg | sum | count +----+------+--------------------+-------+------- + 0 | 5000 | 5.0000000000000000 | 5000 | 1000 + 1 | 6000 | 6.0000000000000000 | 7000 | 1000 + 10 | 5000 | 5.0000000000000000 | 15000 | 1000 + 11 | 6000 | 6.0000000000000000 | 17000 | 1000 + 20 | 5000 | 5.0000000000000000 | 25000 | 1000 + 21 | 6000 | 6.0000000000000000 | 27000 | 1000 +(6 rows) + +-- Reset parallelism parameters to get partitionwise aggregation plan. +RESET min_parallel_table_scan_size; +RESET parallel_setup_cost; +EXPLAIN (COSTS OFF) +SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + QUERY PLAN +----------------------------------------------------------------------------- + Sort + Sort Key: pagg_tab_para.x, (sum(pagg_tab_para.y)), (avg(pagg_tab_para.y)) + -> Append + -> HashAggregate + Group Key: pagg_tab_para.x + Filter: (avg(pagg_tab_para.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p1 pagg_tab_para + -> HashAggregate + Group Key: pagg_tab_para_1.x + Filter: (avg(pagg_tab_para_1.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p2 pagg_tab_para_1 + -> HashAggregate + Group Key: pagg_tab_para_2.x + Filter: (avg(pagg_tab_para_2.y) < '7'::numeric) + -> Seq Scan on pagg_tab_para_p3 pagg_tab_para_2 + Optimizer: Postgres query optimizer +(16 rows) + +SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + x | sum | avg | count +----+------+--------------------+------- + 0 | 5000 | 5.0000000000000000 | 1000 + 1 | 6000 | 6.0000000000000000 | 1000 + 10 | 5000 | 5.0000000000000000 | 1000 + 11 | 6000 | 6.0000000000000000 | 1000 + 20 | 5000 | 5.0000000000000000 | 1000 + 21 | 6000 | 6.0000000000000000 | 1000 +(6 rows) + diff --git a/src/test/singlenode_regress/expected/partition_indexing.out b/src/test/singlenode_regress/expected/partition_indexing.out new file mode 100644 index 00000000000..5a3b9d985df --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_indexing.out @@ -0,0 +1,581 @@ +-- start_matchsubs +-- m/NOTICE: One or more columns in the following table\(s\) do not have statistics: / +-- s/.//gs +-- m/HINT: For non-partitioned tables, run analyze .+\. For partitioned tables, run analyze rootpartition .+\. See log for columns missing statistics\./ +-- s/.//gs +-- end_matchsubs +-- partition_list_index.sql +-- Test partition with CREATE INDEX +DROP TABLE if exists mpp3033a; +DROP TABLE if exists mpp3033b; +CREATE TABLE mpp3033a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by list (unique1) ( +partition aa values (1,2,3,4,5,6,7,8,9,10), +partition bb values (11,12,13,14,15,16,17,18,19,20), +default partition default_part +); +CREATE TABLE mpp3033b ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by list (unique1) +subpartition by list (unique2) +( +partition aa values (1,2,3,4,5,6,7,8,9,10) (subpartition cc values (1,2,3), subpartition dd values (4,5,6) ), +partition bb values (11,12,13,14,15,16,17,18,19,20) (subpartition cc values (1,2,3), subpartition dd values (4,5,6) ) +); +alter table mpp3033b add default partition default_part; +ERROR: no partitions specified at depth 2 +\copy mpp3033a from 'data/onek.data'; +\copy mpp3033b from 'data/onek.data'; +ERROR: no partition of relation "mpp3033b" found for row +DETAIL: Partition key of the failing row contains (unique1) = (147). +CONTEXT: COPY mpp3033b, line 1: "147 0 1 3 7 7 7 47 147 147 147 14 15 RFAAAA AAAAAA AAAAxx" +CREATE INDEX mpp3033a_unique1 ON mpp3033a USING btree(unique1 int4_ops); +CREATE INDEX mpp3033a_unique2 ON mpp3033a USING btree(unique2 int4_ops); +CREATE INDEX mpp3033a_hundred ON mpp3033a USING btree(hundred int4_ops); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a USING btree(stringu1 name_ops); +CREATE INDEX mpp3033b_unique1 ON mpp3033b USING btree(unique1 int4_ops); +CREATE INDEX mpp3033b_unique2 ON mpp3033b USING btree(unique2 int4_ops); +CREATE INDEX mpp3033b_hundred ON mpp3033b USING btree(hundred int4_ops); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b USING btree(stringu1 name_ops); +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 0 +(1 row) + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 0 +(1 row) + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; +CREATE INDEX mpp3033a_unique1 ON mpp3033a (unique1); +CREATE INDEX mpp3033a_unique2 ON mpp3033a (unique2); +CREATE INDEX mpp3033a_hundred ON mpp3033a (hundred); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a (stringu1); +CREATE INDEX mpp3033b_unique1 ON mpp3033b (unique1); +CREATE INDEX mpp3033b_unique2 ON mpp3033b (unique2); +CREATE INDEX mpp3033b_hundred ON mpp3033b (hundred); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b (stringu1); +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 0 +(1 row) + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 0 +(1 row) + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; +CREATE UNIQUE INDEX mpp3033a_unique1 ON mpp3033a (unique1); +CREATE UNIQUE INDEX mpp3033a_unique2 ON mpp3033a (unique2); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033a" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033a_hundred ON mpp3033a (hundred); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033a" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033a_stringu1 ON mpp3033a (stringu1); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033a" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033b_unique1 ON mpp3033b (unique1); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033b_1_prt_aa" lacks column "unique2" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033b_unique2 ON mpp3033b (unique2); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033b" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033b_hundred ON mpp3033b (hundred); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033b" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033b_stringu1 ON mpp3033b (stringu1); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033b" lacks column "unique1" which is part of the partition key. +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 0 +(1 row) + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +ERROR: relation "mpp3033a_unique2" does not exist +reindex index mpp3033a_hundred; +ERROR: relation "mpp3033a_hundred" does not exist +reindex index mpp3033a_stringu1; +ERROR: relation "mpp3033a_stringu1" does not exist +reindex index mpp3033b_unique1; +ERROR: relation "mpp3033b_unique1" does not exist +reindex index mpp3033b_unique2; +ERROR: relation "mpp3033b_unique2" does not exist +reindex index mpp3033b_hundred; +ERROR: relation "mpp3033b_hundred" does not exist +reindex index mpp3033b_stringu1; +ERROR: relation "mpp3033b_stringu1" does not exist +select count(*) from mpp3033b; + count +------- + 0 +(1 row) + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +ERROR: index "mpp3033a_unique2" does not exist +drop index mpp3033a_hundred; +ERROR: index "mpp3033a_hundred" does not exist +drop index mpp3033a_stringu1; +ERROR: index "mpp3033a_stringu1" does not exist +drop index mpp3033b_unique1; +ERROR: index "mpp3033b_unique1" does not exist +drop index mpp3033b_unique2; +ERROR: index "mpp3033b_unique2" does not exist +drop index mpp3033b_hundred; +ERROR: index "mpp3033b_hundred" does not exist +drop index mpp3033b_stringu1; +ERROR: index "mpp3033b_stringu1" does not exist +CREATE INDEX mpp3033a_unique1 ON mpp3033a USING bitmap (unique1); +CREATE INDEX mpp3033a_unique2 ON mpp3033a USING bitmap (unique2); +CREATE INDEX mpp3033a_hundred ON mpp3033a USING bitmap (hundred); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a USING bitmap (stringu1); +CREATE INDEX mpp3033b_unique1 ON mpp3033b USING bitmap (unique1); +CREATE INDEX mpp3033b_unique2 ON mpp3033b USING bitmap (unique2); +CREATE INDEX mpp3033b_hundred ON mpp3033b USING bitmap (hundred); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b USING bitmap (stringu1); +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 0 +(1 row) + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 0 +(1 row) + +-- partition_range_index.sql +-- Test partition with CREATE INDEX +DROP TABLE if exists mpp3033a; +DROP TABLE if exists mpp3033b; +CREATE TABLE mpp3033a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +( partition aa start (0) end (1000) every (100), default partition default_part ); +CREATE TABLE mpp3033b ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (500) ) +( start (0) end (1000) every (200)); +alter table mpp3033b add default partition default_part; +\copy mpp3033a from 'data/onek.data'; +\copy mpp3033b from 'data/onek.data'; +drop index if exists mpp3033a_unique1; +NOTICE: index "mpp3033a_unique1" does not exist, skipping +drop index if exists mpp3033a_unique2; +NOTICE: index "mpp3033a_unique2" does not exist, skipping +drop index if exists mpp3033a_hundred; +NOTICE: index "mpp3033a_hundred" does not exist, skipping +drop index if exists mpp3033a_stringu1; +NOTICE: index "mpp3033a_stringu1" does not exist, skipping +drop index if exists mpp3033b_unique1; +NOTICE: index "mpp3033b_unique1" does not exist, skipping +drop index if exists mpp3033b_unique2; +NOTICE: index "mpp3033b_unique2" does not exist, skipping +drop index if exists mpp3033b_hundred; +NOTICE: index "mpp3033b_hundred" does not exist, skipping +drop index if exists mpp3033b_stringu1; +NOTICE: index "mpp3033b_stringu1" does not exist, skipping +CREATE INDEX mpp3033a_unique1 ON mpp3033a USING btree(unique1 int4_ops); +CREATE INDEX mpp3033a_unique2 ON mpp3033a USING btree(unique2 int4_ops); +CREATE INDEX mpp3033a_hundred ON mpp3033a USING btree(hundred int4_ops); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a USING btree(stringu1 name_ops); +CREATE INDEX mpp3033b_unique1 ON mpp3033b USING btree(unique1 int4_ops); +CREATE INDEX mpp3033b_unique2 ON mpp3033b USING btree(unique2 int4_ops); +CREATE INDEX mpp3033b_hundred ON mpp3033b USING btree(hundred int4_ops); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b USING btree(stringu1 name_ops); +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 1000 +(1 row) + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 1000 +(1 row) + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; +CREATE INDEX mpp3033a_unique1 ON mpp3033a (unique1); +CREATE INDEX mpp3033a_unique2 ON mpp3033a (unique2); +CREATE INDEX mpp3033a_hundred ON mpp3033a (hundred); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a (stringu1); +CREATE INDEX mpp3033b_unique1 ON mpp3033b (unique1); +CREATE INDEX mpp3033b_unique2 ON mpp3033b (unique2); +CREATE INDEX mpp3033b_hundred ON mpp3033b (hundred); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b (stringu1); +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 1000 +(1 row) + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 1000 +(1 row) + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; +CREATE UNIQUE INDEX mpp3033a_unique1 ON mpp3033a (unique1); +CREATE UNIQUE INDEX mpp3033a_unique2 ON mpp3033a (unique2); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033a" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033a_hundred ON mpp3033a (hundred); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033a" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033a_stringu1 ON mpp3033a (stringu1); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033a" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033b_unique1 ON mpp3033b (unique1); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033b_1_prt_1" lacks column "unique2" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033b_unique2 ON mpp3033b (unique2); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033b" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033b_hundred ON mpp3033b (hundred); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033b" lacks column "unique1" which is part of the partition key. +CREATE UNIQUE INDEX mpp3033b_stringu1 ON mpp3033b (stringu1); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: UNIQUE constraint on table "mpp3033b" lacks column "unique1" which is part of the partition key. +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 1000 +(1 row) + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +ERROR: relation "mpp3033a_unique2" does not exist +reindex index mpp3033a_hundred; +ERROR: relation "mpp3033a_hundred" does not exist +reindex index mpp3033a_stringu1; +ERROR: relation "mpp3033a_stringu1" does not exist +reindex index mpp3033b_unique1; +ERROR: relation "mpp3033b_unique1" does not exist +reindex index mpp3033b_unique2; +ERROR: relation "mpp3033b_unique2" does not exist +reindex index mpp3033b_hundred; +ERROR: relation "mpp3033b_hundred" does not exist +reindex index mpp3033b_stringu1; +ERROR: relation "mpp3033b_stringu1" does not exist +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 1000 +(1 row) + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +ERROR: index "mpp3033a_unique2" does not exist +drop index mpp3033a_hundred; +ERROR: index "mpp3033a_hundred" does not exist +drop index mpp3033a_stringu1; +ERROR: index "mpp3033a_stringu1" does not exist +drop index mpp3033b_unique1; +ERROR: index "mpp3033b_unique1" does not exist +drop index mpp3033b_unique2; +ERROR: index "mpp3033b_unique2" does not exist +drop index mpp3033b_hundred; +ERROR: index "mpp3033b_hundred" does not exist +drop index mpp3033b_stringu1; +ERROR: index "mpp3033b_stringu1" does not exist +CREATE INDEX mpp3033a_unique1 ON mpp3033a USING bitmap (unique1); +CREATE INDEX mpp3033a_unique2 ON mpp3033a USING bitmap (unique2); +CREATE INDEX mpp3033a_hundred ON mpp3033a USING bitmap (hundred); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a USING bitmap (stringu1); +CREATE INDEX mpp3033b_unique1 ON mpp3033b USING bitmap (unique1); +CREATE INDEX mpp3033b_unique2 ON mpp3033b USING bitmap (unique2); +CREATE INDEX mpp3033b_hundred ON mpp3033b USING bitmap (hundred); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b USING bitmap (stringu1); +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 1000 +(1 row) + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; +select count(*) from mpp3033a; + count +------- + 1000 +(1 row) + +select count(*) from mpp3033b; + count +------- + 1000 +(1 row) + +create table mpp6379(a int, b date, primary key (a,b)) partition by range (b) (partition p1 end ('2009-01-02'::date)); +insert into mpp6379( a, b ) values( 1, '20090101' ); +insert into mpp6379( a, b ) values( 1, '20090101' ); +ERROR: duplicate key value violates unique constraint "mpp6379_1_prt_p1_pkey" +DETAIL: Key (a, b)=(1, 01-01-2009) already exists. +alter table mpp6379 add partition p2 end(date '2009-01-03'); +insert into mpp6379( a, b ) values( 2, '20090102' ); +insert into mpp6379( a, b ) values( 2, '20090102' ); +ERROR: duplicate key value violates unique constraint "mpp6379_1_prt_p2_pkey" +DETAIL: Key (a, b)=(2, 01-02-2009) already exists. +drop table mpp6379; +-- Creating an index on a partitioned table makes the partitions +-- automatically get the index +create table gpidxpart (a int, b int, c text) +partition by range (a) +subpartition by range(b) +subpartition template + (start(1) end (3)) +(start (1) end (3)); +-- relhassubclass of a partitioned index is false before creating any partition. +-- It will be set after the first partition is created. +create index gpidxpart_idx on gpidxpart (a); +select relhassubclass from pg_class where relname = 'gpidxpart_idx'; + relhassubclass +---------------- + t +(1 row) + +drop index gpidxpart_idx; +-- Even with partitions, relhassubclass should not be set if a partitioned +-- index is created only on the parent. +create index gpidxpart_idx on only gpidxpart(a); +select relhassubclass from pg_class where relname = 'gpidxpart_idx'; + relhassubclass +---------------- + f +(1 row) + +drop index gpidxpart_idx; diff --git a/src/test/singlenode_regress/expected/partition_info.out b/src/test/singlenode_regress/expected/partition_info.out new file mode 100644 index 00000000000..42b6bc77cad --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_info.out @@ -0,0 +1,351 @@ +-- +-- Tests for functions providing information about partitions +-- +SELECT * FROM pg_partition_tree(NULL); + relid | parentrelid | isleaf | level +-------+-------------+--------+------- +(0 rows) + +SELECT * FROM pg_partition_tree(0); + relid | parentrelid | isleaf | level +-------+-------------+--------+------- +(0 rows) + +SELECT * FROM pg_partition_ancestors(NULL); + relid +------- +(0 rows) + +SELECT * FROM pg_partition_ancestors(0); + relid +------- +(0 rows) + +SELECT pg_partition_root(NULL); + pg_partition_root +------------------- + +(1 row) + +SELECT pg_partition_root(0); + pg_partition_root +------------------- + +(1 row) + +-- Test table partition trees +CREATE TABLE ptif_test (a int, b int) PARTITION BY range (a); +CREATE TABLE ptif_test0 PARTITION OF ptif_test + FOR VALUES FROM (minvalue) TO (0) PARTITION BY list (b); +CREATE TABLE ptif_test01 PARTITION OF ptif_test0 FOR VALUES IN (1); +CREATE TABLE ptif_test1 PARTITION OF ptif_test + FOR VALUES FROM (0) TO (100) PARTITION BY list (b); +CREATE TABLE ptif_test11 PARTITION OF ptif_test1 FOR VALUES IN (1); +CREATE TABLE ptif_test2 PARTITION OF ptif_test + FOR VALUES FROM (100) TO (200); +-- This partitioned table should remain with no partitions. +CREATE TABLE ptif_test3 PARTITION OF ptif_test + FOR VALUES FROM (200) TO (maxvalue) PARTITION BY list (b); +-- Test pg_partition_root for tables +SELECT pg_partition_root('ptif_test'); + pg_partition_root +------------------- + ptif_test +(1 row) + +SELECT pg_partition_root('ptif_test0'); + pg_partition_root +------------------- + ptif_test +(1 row) + +SELECT pg_partition_root('ptif_test01'); + pg_partition_root +------------------- + ptif_test +(1 row) + +SELECT pg_partition_root('ptif_test3'); + pg_partition_root +------------------- + ptif_test +(1 row) + +-- Test index partition tree +CREATE INDEX ptif_test_index ON ONLY ptif_test (a); +CREATE INDEX ptif_test0_index ON ONLY ptif_test0 (a); +ALTER INDEX ptif_test_index ATTACH PARTITION ptif_test0_index; +CREATE INDEX ptif_test01_index ON ptif_test01 (a); +ALTER INDEX ptif_test0_index ATTACH PARTITION ptif_test01_index; +CREATE INDEX ptif_test1_index ON ONLY ptif_test1 (a); +ALTER INDEX ptif_test_index ATTACH PARTITION ptif_test1_index; +CREATE INDEX ptif_test11_index ON ptif_test11 (a); +ALTER INDEX ptif_test1_index ATTACH PARTITION ptif_test11_index; +CREATE INDEX ptif_test2_index ON ptif_test2 (a); +ALTER INDEX ptif_test_index ATTACH PARTITION ptif_test2_index; +CREATE INDEX ptif_test3_index ON ptif_test3 (a); +ALTER INDEX ptif_test_index ATTACH PARTITION ptif_test3_index; +-- Test pg_partition_root for indexes +SELECT pg_partition_root('ptif_test_index'); + pg_partition_root +------------------- + ptif_test_index +(1 row) + +SELECT pg_partition_root('ptif_test0_index'); + pg_partition_root +------------------- + ptif_test_index +(1 row) + +SELECT pg_partition_root('ptif_test01_index'); + pg_partition_root +------------------- + ptif_test_index +(1 row) + +SELECT pg_partition_root('ptif_test3_index'); + pg_partition_root +------------------- + ptif_test_index +(1 row) + +-- List all tables members of the tree +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test'); + relid | parentrelid | level | isleaf +-------------+-------------+-------+-------- + ptif_test | | 0 | f + ptif_test0 | ptif_test | 1 | f + ptif_test1 | ptif_test | 1 | f + ptif_test2 | ptif_test | 1 | t + ptif_test3 | ptif_test | 1 | f + ptif_test01 | ptif_test0 | 2 | t + ptif_test11 | ptif_test1 | 2 | t +(7 rows) + +-- List tables from an intermediate level +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test0') p + JOIN pg_class c ON (p.relid = c.oid); + relid | parentrelid | level | isleaf +-------------+-------------+-------+-------- + ptif_test0 | ptif_test | 0 | f + ptif_test01 | ptif_test0 | 1 | t +(2 rows) + +-- List from leaf table +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test01') p + JOIN pg_class c ON (p.relid = c.oid); + relid | parentrelid | level | isleaf +-------------+-------------+-------+-------- + ptif_test01 | ptif_test0 | 0 | t +(1 row) + +-- List from partitioned table with no partitions +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test3') p + JOIN pg_class c ON (p.relid = c.oid); + relid | parentrelid | level | isleaf +------------+-------------+-------+-------- + ptif_test3 | ptif_test | 0 | f +(1 row) + +-- List all ancestors of root and leaf tables +SELECT * FROM pg_partition_ancestors('ptif_test01'); + relid +------------- + ptif_test01 + ptif_test0 + ptif_test +(3 rows) + +SELECT * FROM pg_partition_ancestors('ptif_test'); + relid +----------- + ptif_test +(1 row) + +-- List all members using pg_partition_root with leaf table reference +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree(pg_partition_root('ptif_test01')) p + JOIN pg_class c ON (p.relid = c.oid); + relid | parentrelid | level | isleaf +-------------+-------------+-------+-------- + ptif_test | | 0 | f + ptif_test0 | ptif_test | 1 | f + ptif_test1 | ptif_test | 1 | f + ptif_test2 | ptif_test | 1 | t + ptif_test3 | ptif_test | 1 | f + ptif_test01 | ptif_test0 | 2 | t + ptif_test11 | ptif_test1 | 2 | t +(7 rows) + +-- List all indexes members of the tree +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test_index'); + relid | parentrelid | level | isleaf +-------------------+------------------+-------+-------- + ptif_test_index | | 0 | f + ptif_test0_index | ptif_test_index | 1 | f + ptif_test1_index | ptif_test_index | 1 | f + ptif_test2_index | ptif_test_index | 1 | t + ptif_test3_index | ptif_test_index | 1 | f + ptif_test01_index | ptif_test0_index | 2 | t + ptif_test11_index | ptif_test1_index | 2 | t +(7 rows) + +-- List indexes from an intermediate level +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test0_index') p + JOIN pg_class c ON (p.relid = c.oid); + relid | parentrelid | level | isleaf +-------------------+------------------+-------+-------- + ptif_test0_index | ptif_test_index | 0 | f + ptif_test01_index | ptif_test0_index | 1 | t +(2 rows) + +-- List from leaf index +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test01_index') p + JOIN pg_class c ON (p.relid = c.oid); + relid | parentrelid | level | isleaf +-------------------+------------------+-------+-------- + ptif_test01_index | ptif_test0_index | 0 | t +(1 row) + +-- List from partitioned index with no partitions +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test3_index') p + JOIN pg_class c ON (p.relid = c.oid); + relid | parentrelid | level | isleaf +------------------+-----------------+-------+-------- + ptif_test3_index | ptif_test_index | 0 | f +(1 row) + +-- List all members using pg_partition_root with leaf index reference +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree(pg_partition_root('ptif_test01_index')) p + JOIN pg_class c ON (p.relid = c.oid); + relid | parentrelid | level | isleaf +-------------------+------------------+-------+-------- + ptif_test_index | | 0 | f + ptif_test0_index | ptif_test_index | 1 | f + ptif_test1_index | ptif_test_index | 1 | f + ptif_test2_index | ptif_test_index | 1 | t + ptif_test3_index | ptif_test_index | 1 | f + ptif_test01_index | ptif_test0_index | 2 | t + ptif_test11_index | ptif_test1_index | 2 | t +(7 rows) + +-- List all ancestors of root and leaf indexes +SELECT * FROM pg_partition_ancestors('ptif_test01_index'); + relid +------------------- + ptif_test01_index + ptif_test0_index + ptif_test_index +(3 rows) + +SELECT * FROM pg_partition_ancestors('ptif_test_index'); + relid +----------------- + ptif_test_index +(1 row) + +DROP TABLE ptif_test; +-- Table that is not part of any partition tree is not listed. +CREATE TABLE ptif_normal_table(a int); +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_normal_table'); + relid | parentrelid | level | isleaf +-------+-------------+-------+-------- +(0 rows) + +SELECT * FROM pg_partition_ancestors('ptif_normal_table'); + relid +------- +(0 rows) + +SELECT pg_partition_root('ptif_normal_table'); + pg_partition_root +------------------- + +(1 row) + +DROP TABLE ptif_normal_table; +-- Various partitioning-related functions return empty/NULL if passed relations +-- of types that cannot be part of a partition tree; for example, views, +-- materialized views, legacy inheritance children or parents, etc. +CREATE VIEW ptif_test_view AS SELECT 1; +CREATE MATERIALIZED VIEW ptif_test_matview AS SELECT 1; +CREATE TABLE ptif_li_parent (); +CREATE TABLE ptif_li_child () INHERITS (ptif_li_parent); +SELECT * FROM pg_partition_tree('ptif_test_view'); + relid | parentrelid | isleaf | level +-------+-------------+--------+------- +(0 rows) + +SELECT * FROM pg_partition_tree('ptif_test_matview'); + relid | parentrelid | isleaf | level +-------+-------------+--------+------- +(0 rows) + +SELECT * FROM pg_partition_tree('ptif_li_parent'); + relid | parentrelid | isleaf | level +-------+-------------+--------+------- +(0 rows) + +SELECT * FROM pg_partition_tree('ptif_li_child'); + relid | parentrelid | isleaf | level +-------+-------------+--------+------- +(0 rows) + +SELECT * FROM pg_partition_ancestors('ptif_test_view'); + relid +------- +(0 rows) + +SELECT * FROM pg_partition_ancestors('ptif_test_matview'); + relid +------- +(0 rows) + +SELECT * FROM pg_partition_ancestors('ptif_li_parent'); + relid +------- +(0 rows) + +SELECT * FROM pg_partition_ancestors('ptif_li_child'); + relid +------- +(0 rows) + +SELECT pg_partition_root('ptif_test_view'); + pg_partition_root +------------------- + +(1 row) + +SELECT pg_partition_root('ptif_test_matview'); + pg_partition_root +------------------- + +(1 row) + +SELECT pg_partition_root('ptif_li_parent'); + pg_partition_root +------------------- + +(1 row) + +SELECT pg_partition_root('ptif_li_child'); + pg_partition_root +------------------- + +(1 row) + +DROP VIEW ptif_test_view; +DROP MATERIALIZED VIEW ptif_test_matview; +DROP TABLE ptif_li_parent, ptif_li_child; diff --git a/src/test/singlenode_regress/expected/partition_join.out b/src/test/singlenode_regress/expected/partition_join.out new file mode 100644 index 00000000000..6ab7226c663 --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_join.out @@ -0,0 +1,4981 @@ +-- +-- PARTITION_JOIN +-- Test partitionwise join between partitioned tables +-- +-- Enable partitionwise join, which by default is disabled. +SET enable_partitionwise_join to true; +-- +-- partitioned by a single column +-- +CREATE TABLE prt1 (a int, b int, c varchar) PARTITION BY RANGE(a); +CREATE TABLE prt1_p1 PARTITION OF prt1 FOR VALUES FROM (0) TO (250); +CREATE TABLE prt1_p3 PARTITION OF prt1 FOR VALUES FROM (500) TO (600); +CREATE TABLE prt1_p2 PARTITION OF prt1 FOR VALUES FROM (250) TO (500); +INSERT INTO prt1 SELECT i, i % 25, to_char(i, 'FM0000') FROM generate_series(0, 599) i WHERE i % 2 = 0; +CREATE INDEX iprt1_p1_a on prt1_p1(a); +CREATE INDEX iprt1_p2_a on prt1_p2(a); +CREATE INDEX iprt1_p3_a on prt1_p3(a); +ANALYZE prt1; +CREATE TABLE prt2 (a int, b int, c varchar) PARTITION BY RANGE(b); +CREATE TABLE prt2_p1 PARTITION OF prt2 FOR VALUES FROM (0) TO (250); +CREATE TABLE prt2_p2 PARTITION OF prt2 FOR VALUES FROM (250) TO (500); +CREATE TABLE prt2_p3 PARTITION OF prt2 FOR VALUES FROM (500) TO (600); +INSERT INTO prt2 SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(0, 599) i WHERE i % 3 = 0; +CREATE INDEX iprt2_p1_b on prt2_p1(b); +CREATE INDEX iprt2_p2_b on prt2_p2(b); +CREATE INDEX iprt2_p3_b on prt2_p3(b); +ANALYZE prt2; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +-------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_p1 t2_1 + -> Hash + -> Seq Scan on prt1_p1 t1_1 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_p2 t2_2 + -> Hash + -> Seq Scan on prt1_p2 t1_2 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_p3 t2_3 + -> Hash + -> Seq Scan on prt1_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 0 | 0000 | 0 | 0000 + 150 | 0150 | 150 | 0150 + 300 | 0300 | 300 | 0300 + 450 | 0450 | 450 | 0450 +(4 rows) + +-- left outer join, with whole-row reference; partitionwise join does not apply +EXPLAIN (COSTS OFF) +SELECT t1, t2 FROM prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +-------------------------------------------------- + Sort + Sort Key: t1.a, t2.b + -> Hash Right Join + Hash Cond: (t2.b = t1.a) + -> Append + -> Seq Scan on prt2_p1 t2_1 + -> Seq Scan on prt2_p2 t2_2 + -> Seq Scan on prt2_p3 t2_3 + -> Hash + -> Append + -> Seq Scan on prt1_p1 t1_1 + Filter: (b = 0) + -> Seq Scan on prt1_p2 t1_2 + Filter: (b = 0) + -> Seq Scan on prt1_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(17 rows) + +SELECT t1, t2 FROM prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + t1 | t2 +--------------+-------------- + (0,0,0000) | (0,0,0000) + (50,0,0050) | + (100,0,0100) | + (150,0,0150) | (0,150,0150) + (200,0,0200) | + (250,0,0250) | + (300,0,0300) | (0,300,0300) + (350,0,0350) | + (400,0,0400) | + (450,0,0450) | (0,450,0450) + (500,0,0500) | + (550,0,0550) | +(12 rows) + +-- right outer join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +-------------------------------------------------- + Sort + Sort Key: t1.a, t2.b + -> Append + -> Hash Right Join + Hash Cond: (t1_1.a = t2_1.b) + -> Seq Scan on prt1_p1 t1_1 + -> Hash + -> Seq Scan on prt2_p1 t2_1 + Filter: (a = 0) + -> Hash Right Join + Hash Cond: (t1_2.a = t2_2.b) + -> Seq Scan on prt1_p2 t1_2 + -> Hash + -> Seq Scan on prt2_p2 t2_2 + Filter: (a = 0) + -> Hash Right Join + Hash Cond: (t1_3.a = t2_3.b) + -> Seq Scan on prt1_p3 t1_3 + -> Hash + -> Seq Scan on prt2_p3 t2_3 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 0 | 0000 | 0 | 0000 + 150 | 0150 | 150 | 0150 + 300 | 0300 | 300 | 0300 + 450 | 0450 | 450 | 0450 + | | 75 | 0075 + | | 225 | 0225 + | | 375 | 0375 + | | 525 | 0525 +(8 rows) + +-- full outer join, with placeholder vars +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 50 phv, * FROM prt1 WHERE prt1.b = 0) t1 FULL JOIN (SELECT 75 phv, * FROM prt2 WHERE prt2.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + QUERY PLAN +---------------------------------------------------------------- + Sort + Sort Key: prt1.a, prt2.b + -> Append + -> Hash Full Join + Hash Cond: (prt1_1.a = prt2_1.b) + Filter: (((50) = prt1_1.a) OR ((75) = prt2_1.b)) + -> Seq Scan on prt1_p1 prt1_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p1 prt2_1 + Filter: (a = 0) + -> Hash Full Join + Hash Cond: (prt1_2.a = prt2_2.b) + Filter: (((50) = prt1_2.a) OR ((75) = prt2_2.b)) + -> Seq Scan on prt1_p2 prt1_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p2 prt2_2 + Filter: (a = 0) + -> Hash Full Join + Hash Cond: (prt1_3.a = prt2_3.b) + Filter: (((50) = prt1_3.a) OR ((75) = prt2_3.b)) + -> Seq Scan on prt1_p3 prt1_3 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p3 prt2_3 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(28 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 50 phv, * FROM prt1 WHERE prt1.b = 0) t1 FULL JOIN (SELECT 75 phv, * FROM prt2 WHERE prt2.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + a | c | b | c +----+------+----+------ + 50 | 0050 | | + | | 75 | 0075 +(2 rows) + +-- Join with pruned partitions from joining relations +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.a < 450 AND t2.b > 250 AND t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Join + Hash Cond: (t2.b = t1.a) + -> Seq Scan on prt2_p2 t2 + Filter: ((b > 250) AND (b < 450)) + -> Hash + -> Seq Scan on prt1_p2 t1 + Filter: ((a < 450) AND (a > 250) AND (b = 0)) + Optimizer: Postgres query optimizer +(10 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.a < 450 AND t2.b > 250 AND t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 300 | 0300 | 300 | 0300 +(1 row) + +-- Currently we can't do partitioned join if nullable-side partitions are pruned +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a < 450) t1 LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +----------------------------------------------------------- + Sort + Sort Key: prt1.a, prt2.b + -> Hash Right Join + Hash Cond: (prt2.b = prt1.a) + -> Append + -> Seq Scan on prt2_p2 prt2_1 + Filter: (b > 250) + -> Seq Scan on prt2_p3 prt2_2 + Filter: (b > 250) + -> Hash + -> Append + -> Seq Scan on prt1_p1 prt1_1 + Filter: ((a < 450) AND (b = 0)) + -> Seq Scan on prt1_p2 prt1_2 + Filter: ((a < 450) AND (b = 0)) + Optimizer: Postgres query optimizer +(16 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a < 450) t1 LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 0 | 0000 | | + 50 | 0050 | | + 100 | 0100 | | + 150 | 0150 | | + 200 | 0200 | | + 250 | 0250 | | + 300 | 0300 | 300 | 0300 + 350 | 0350 | | + 400 | 0400 | | +(9 rows) + +-- Currently we can't do partitioned join if nullable-side partitions are pruned +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a < 450) t1 FULL JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 OR t2.a = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +---------------------------------------------------- + Sort + Sort Key: prt1.a, prt2.b + -> Hash Full Join + Hash Cond: (prt1.a = prt2.b) + Filter: ((prt1.b = 0) OR (prt2.a = 0)) + -> Append + -> Seq Scan on prt1_p1 prt1_1 + Filter: (a < 450) + -> Seq Scan on prt1_p2 prt1_2 + Filter: (a < 450) + -> Hash + -> Append + -> Seq Scan on prt2_p2 prt2_1 + Filter: (b > 250) + -> Seq Scan on prt2_p3 prt2_2 + Filter: (b > 250) + Optimizer: Postgres query optimizer +(17 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a < 450) t1 FULL JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 OR t2.a = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 0 | 0000 | | + 50 | 0050 | | + 100 | 0100 | | + 150 | 0150 | | + 200 | 0200 | | + 250 | 0250 | | + 300 | 0300 | 300 | 0300 + 350 | 0350 | | + 400 | 0400 | | + | | 375 | 0375 + | | 450 | 0450 + | | 525 | 0525 +(12 rows) + +-- Semi-join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t2.b FROM prt2 t2 WHERE t2.a = 0) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Semi Join + Hash Cond: (t1_1.a = t2_1.b) + -> Seq Scan on prt1_p1 t1_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p1 t2_1 + Filter: (a = 0) + -> Hash Semi Join + Hash Cond: (t1_2.a = t2_2.b) + -> Seq Scan on prt1_p2 t1_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p2 t2_2 + Filter: (a = 0) + -> Hash Semi Join + Hash Cond: (t1_3.a = t2_3.b) + -> Seq Scan on prt1_p3 t1_3 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p3 t2_3 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(25 rows) + +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t2.b FROM prt2 t2 WHERE t2.a = 0) AND t1.b = 0 ORDER BY t1.a; + a | b | c +-----+---+------ + 0 | 0 | 0000 + 150 | 0 | 0150 + 300 | 0 | 0300 + 450 | 0 | 0450 +(4 rows) + +-- Anti-join with aggregates +EXPLAIN (COSTS OFF) +SELECT sum(t1.a), avg(t1.a), sum(t1.b), avg(t1.b) FROM prt1 t1 WHERE NOT EXISTS (SELECT 1 FROM prt2 t2 WHERE t1.a = t2.b); + QUERY PLAN +-------------------------------------------------- + Aggregate + -> Append + -> Hash Anti Join + Hash Cond: (t1_1.a = t2_1.b) + -> Seq Scan on prt1_p1 t1_1 + -> Hash + -> Seq Scan on prt2_p1 t2_1 + -> Hash Anti Join + Hash Cond: (t1_2.a = t2_2.b) + -> Seq Scan on prt1_p2 t1_2 + -> Hash + -> Seq Scan on prt2_p2 t2_2 + -> Hash Anti Join + Hash Cond: (t1_3.a = t2_3.b) + -> Seq Scan on prt1_p3 t1_3 + -> Hash + -> Seq Scan on prt2_p3 t2_3 + Optimizer: Postgres query optimizer +(18 rows) + +SELECT sum(t1.a), avg(t1.a), sum(t1.b), avg(t1.b) FROM prt1 t1 WHERE NOT EXISTS (SELECT 1 FROM prt2 t2 WHERE t1.a = t2.b); + sum | avg | sum | avg +-------+----------------------+------+--------------------- + 60000 | 300.0000000000000000 | 2400 | 12.0000000000000000 +(1 row) + +-- lateral reference +EXPLAIN (COSTS OFF) +SELECT * FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t3.a AS t3a, least(t1.a,t2.a,t3.b) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss + ON t1.a = ss.t2a WHERE t1.b = 0 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------------- + Merge Append + Sort Key: t1.a + -> Nested Loop Left Join + -> Index Scan using iprt1_p1_a on prt1_p1 t1_1 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t3_1.b = t2_1.a) + -> Seq Scan on prt2_p1 t3_1 + -> Hash + -> Index Only Scan using iprt1_p1_a on prt1_p1 t2_1 + Index Cond: (a = t1_1.a) + -> Nested Loop Left Join + -> Index Scan using iprt1_p2_a on prt1_p2 t1_2 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t3_2.b = t2_2.a) + -> Seq Scan on prt2_p2 t3_2 + -> Hash + -> Index Only Scan using iprt1_p2_a on prt1_p2 t2_2 + Index Cond: (a = t1_2.a) + -> Nested Loop Left Join + -> Index Scan using iprt1_p3_a on prt1_p3 t1_3 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t3_3.b = t2_3.a) + -> Seq Scan on prt2_p3 t3_3 + -> Hash + -> Index Only Scan using iprt1_p3_a on prt1_p3 t2_3 + Index Cond: (a = t1_3.a) + Optimizer: Postgres query optimizer +(30 rows) + +SELECT * FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t3.a AS t3a, least(t1.a,t2.a,t3.b) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss + ON t1.a = ss.t2a WHERE t1.b = 0 ORDER BY t1.a; + a | b | c | t2a | t3a | least +-----+---+------+-----+-----+------- + 0 | 0 | 0000 | 0 | 0 | 0 + 50 | 0 | 0050 | | | + 100 | 0 | 0100 | | | + 150 | 0 | 0150 | 150 | 0 | 150 + 200 | 0 | 0200 | | | + 250 | 0 | 0250 | | | + 300 | 0 | 0300 | 300 | 0 | 300 + 350 | 0 | 0350 | | | + 400 | 0 | 0400 | | | + 450 | 0 | 0450 | 450 | 0 | 450 + 500 | 0 | 0500 | | | + 550 | 0 | 0550 | | | +(12 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, ss.t2a, ss.t2c FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t3.a AS t3a, t2.b t2b, t2.c t2c, least(t1.a,t2.a,t3.b) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss + ON t1.c = ss.t2c WHERE (t1.b + coalesce(ss.t2b, 0)) = 0 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Left Join + Hash Cond: ((t1.c)::text = (t2.c)::text) + Filter: ((t1.b + COALESCE(t2.b, 0)) = 0) + -> Append + -> Seq Scan on prt1_p1 t1_1 + -> Seq Scan on prt1_p2 t1_2 + -> Seq Scan on prt1_p3 t1_3 + -> Hash + -> Append + -> Hash Join + Hash Cond: (t2_1.a = t3_1.b) + -> Seq Scan on prt1_p1 t2_1 + -> Hash + -> Seq Scan on prt2_p1 t3_1 + -> Hash Join + Hash Cond: (t2_2.a = t3_2.b) + -> Seq Scan on prt1_p2 t2_2 + -> Hash + -> Seq Scan on prt2_p2 t3_2 + -> Hash Join + Hash Cond: (t2_3.a = t3_3.b) + -> Seq Scan on prt1_p3 t2_3 + -> Hash + -> Seq Scan on prt2_p3 t3_3 + Optimizer: Postgres query optimizer +(27 rows) + +SELECT t1.a, ss.t2a, ss.t2c FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t3.a AS t3a, t2.b t2b, t2.c t2c, least(t1.a,t2.a,t3.a) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss + ON t1.c = ss.t2c WHERE (t1.b + coalesce(ss.t2b, 0)) = 0 ORDER BY t1.a; + a | t2a | t2c +-----+-----+------ + 0 | 0 | 0000 + 50 | | + 100 | | + 150 | 150 | 0150 + 200 | | + 250 | | + 300 | 300 | 0300 + 350 | | + 400 | | + 450 | 450 | 0450 + 500 | | + 550 | | +(12 rows) + +-- bug with inadequate sort key representation +SET enable_partitionwise_aggregate TO true; +SET enable_hashjoin TO false; +EXPLAIN (COSTS OFF) +SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) + WHERE a BETWEEN 490 AND 510 + GROUP BY 1, 2 ORDER BY 1, 2; + QUERY PLAN +----------------------------------------------------------------------------------------------------------- + GroupAggregate + Group Key: (COALESCE(prt1.a, p2.a)), (COALESCE(prt1.b, p2.b)) + -> Sort + Sort Key: (COALESCE(prt1.a, p2.a)), (COALESCE(prt1.b, p2.b)) + -> Append + -> Hash Full Join + Hash Cond: ((prt1_1.a = p2_1.a) AND (prt1_1.b = p2_1.b)) + Filter: ((COALESCE(prt1_1.a, p2_1.a) >= 490) AND (COALESCE(prt1_1.a, p2_1.a) <= 510)) + -> Seq Scan on prt1_p1 prt1_1 + -> Hash + -> Seq Scan on prt2_p1 p2_1 + -> Hash Full Join + Hash Cond: ((prt1_2.a = p2_2.a) AND (prt1_2.b = p2_2.b)) + Filter: ((COALESCE(prt1_2.a, p2_2.a) >= 490) AND (COALESCE(prt1_2.a, p2_2.a) <= 510)) + -> Seq Scan on prt1_p2 prt1_2 + -> Hash + -> Seq Scan on prt2_p2 p2_2 + -> Hash Full Join + Hash Cond: ((prt1_3.a = p2_3.a) AND (prt1_3.b = p2_3.b)) + Filter: ((COALESCE(prt1_3.a, p2_3.a) >= 490) AND (COALESCE(prt1_3.a, p2_3.a) <= 510)) + -> Seq Scan on prt1_p3 prt1_3 + -> Hash + -> Seq Scan on prt2_p3 p2_3 + Optimizer: Postgres query optimizer +(24 rows) + +SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) + WHERE a BETWEEN 490 AND 510 + GROUP BY 1, 2 ORDER BY 1, 2; + a | b +-----+---- + 490 | 15 + 492 | 17 + 494 | 19 + 495 | 20 + 496 | 21 + 498 | 23 + 500 | 0 + 501 | 1 + 502 | 2 + 504 | 4 + 506 | 6 + 507 | 7 + 508 | 8 + 510 | 10 +(14 rows) + +RESET enable_partitionwise_aggregate; +RESET enable_hashjoin; +-- +-- partitioned by expression +-- +CREATE TABLE prt1_e (a int, b int, c int) PARTITION BY RANGE(((a + b)/2)); +CREATE TABLE prt1_e_p1 PARTITION OF prt1_e FOR VALUES FROM (0) TO (250); +CREATE TABLE prt1_e_p2 PARTITION OF prt1_e FOR VALUES FROM (250) TO (500); +CREATE TABLE prt1_e_p3 PARTITION OF prt1_e FOR VALUES FROM (500) TO (600); +INSERT INTO prt1_e SELECT i, i, i % 25 FROM generate_series(0, 599, 2) i; +CREATE INDEX iprt1_e_p1_ab2 on prt1_e_p1(((a+b)/2)); +CREATE INDEX iprt1_e_p2_ab2 on prt1_e_p2(((a+b)/2)); +CREATE INDEX iprt1_e_p3_ab2 on prt1_e_p3(((a+b)/2)); +ANALYZE prt1_e; +CREATE TABLE prt2_e (a int, b int, c int) PARTITION BY RANGE(((b + a)/2)); +CREATE TABLE prt2_e_p1 PARTITION OF prt2_e FOR VALUES FROM (0) TO (250); +CREATE TABLE prt2_e_p2 PARTITION OF prt2_e FOR VALUES FROM (250) TO (500); +CREATE TABLE prt2_e_p3 PARTITION OF prt2_e FOR VALUES FROM (500) TO (600); +INSERT INTO prt2_e SELECT i, i, i % 25 FROM generate_series(0, 599, 3) i; +ANALYZE prt2_e; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_e t1, prt2_e t2 WHERE (t1.a + t1.b)/2 = (t2.b + t2.a)/2 AND t1.c = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------------------------------ + Sort + Sort Key: t1.a, t2.b + -> Append + -> Hash Join + Hash Cond: (((t2_1.b + t2_1.a) / 2) = ((t1_1.a + t1_1.b) / 2)) + -> Seq Scan on prt2_e_p1 t2_1 + -> Hash + -> Seq Scan on prt1_e_p1 t1_1 + Filter: (c = 0) + -> Hash Join + Hash Cond: (((t2_2.b + t2_2.a) / 2) = ((t1_2.a + t1_2.b) / 2)) + -> Seq Scan on prt2_e_p2 t2_2 + -> Hash + -> Seq Scan on prt1_e_p2 t1_2 + Filter: (c = 0) + -> Hash Join + Hash Cond: (((t2_3.b + t2_3.a) / 2) = ((t1_3.a + t1_3.b) / 2)) + -> Seq Scan on prt2_e_p3 t2_3 + -> Hash + -> Seq Scan on prt1_e_p3 t1_3 + Filter: (c = 0) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_e t1, prt2_e t2 WHERE (t1.a + t1.b)/2 = (t2.b + t2.a)/2 AND t1.c = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+---+-----+--- + 0 | 0 | 0 | 0 + 150 | 0 | 150 | 0 + 300 | 0 | 300 | 0 + 450 | 0 | 450 | 0 +(4 rows) + +-- +-- N-way join +-- +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM prt1 t1, prt2 t2, prt1_e t3 WHERE t1.a = t2.b AND t1.a = (t3.a + t3.b)/2 AND t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +-------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (((t3_1.a + t3_1.b) / 2) = t1_1.a) + -> Seq Scan on prt1_e_p1 t3_1 + -> Hash + -> Hash Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_p1 t2_1 + -> Hash + -> Seq Scan on prt1_p1 t1_1 + Filter: (b = 0) + -> Hash Join + Hash Cond: (((t3_2.a + t3_2.b) / 2) = t1_2.a) + -> Seq Scan on prt1_e_p2 t3_2 + -> Hash + -> Hash Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_p2 t2_2 + -> Hash + -> Seq Scan on prt1_p2 t1_2 + Filter: (b = 0) + -> Hash Join + Hash Cond: (((t3_3.a + t3_3.b) / 2) = t1_3.a) + -> Seq Scan on prt1_e_p3 t3_3 + -> Hash + -> Hash Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_p3 t2_3 + -> Hash + -> Seq Scan on prt1_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(34 rows) + +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM prt1 t1, prt2 t2, prt1_e t3 WHERE t1.a = t2.b AND t1.a = (t3.a + t3.b)/2 AND t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c | ?column? | c +-----+------+-----+------+----------+--- + 0 | 0000 | 0 | 0000 | 0 | 0 + 150 | 0150 | 150 | 0150 | 300 | 0 + 300 | 0300 | 300 | 0300 | 600 | 0 + 450 | 0450 | 450 | 0450 | 900 | 0 +(4 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) LEFT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t1.b = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + QUERY PLAN +-------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.b, ((t3.a + t3.b)) + -> Append + -> Hash Right Join + Hash Cond: (((t3_1.a + t3_1.b) / 2) = t1_1.a) + -> Seq Scan on prt1_e_p1 t3_1 + -> Hash + -> Hash Right Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_p1 t2_1 + -> Hash + -> Seq Scan on prt1_p1 t1_1 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: (((t3_2.a + t3_2.b) / 2) = t1_2.a) + -> Seq Scan on prt1_e_p2 t3_2 + -> Hash + -> Hash Right Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_p2 t2_2 + -> Hash + -> Seq Scan on prt1_p2 t1_2 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: (((t3_3.a + t3_3.b) / 2) = t1_3.a) + -> Seq Scan on prt1_e_p3 t3_3 + -> Hash + -> Hash Right Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_p3 t2_3 + -> Hash + -> Seq Scan on prt1_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(34 rows) + +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) LEFT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t1.b = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + a | c | b | c | ?column? | c +-----+------+-----+------+----------+--- + 0 | 0000 | 0 | 0000 | 0 | 0 + 50 | 0050 | | | 100 | 0 + 100 | 0100 | | | 200 | 0 + 150 | 0150 | 150 | 0150 | 300 | 0 + 200 | 0200 | | | 400 | 0 + 250 | 0250 | | | 500 | 0 + 300 | 0300 | 300 | 0300 | 600 | 0 + 350 | 0350 | | | 700 | 0 + 400 | 0400 | | | 800 | 0 + 450 | 0450 | 450 | 0450 | 900 | 0 + 500 | 0500 | | | 1000 | 0 + 550 | 0550 | | | 1100 | 0 +(12 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) RIGHT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t3.c = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + QUERY PLAN +------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.b, ((t3.a + t3.b)) + -> Append + -> Hash Right Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_p1 t2_1 + -> Hash + -> Hash Right Join + Hash Cond: (t1_1.a = ((t3_1.a + t3_1.b) / 2)) + -> Seq Scan on prt1_p1 t1_1 + -> Hash + -> Seq Scan on prt1_e_p1 t3_1 + Filter: (c = 0) + -> Hash Right Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_p2 t2_2 + -> Hash + -> Hash Right Join + Hash Cond: (t1_2.a = ((t3_2.a + t3_2.b) / 2)) + -> Seq Scan on prt1_p2 t1_2 + -> Hash + -> Seq Scan on prt1_e_p2 t3_2 + Filter: (c = 0) + -> Hash Right Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_p3 t2_3 + -> Hash + -> Hash Right Join + Hash Cond: (t1_3.a = ((t3_3.a + t3_3.b) / 2)) + -> Seq Scan on prt1_p3 t1_3 + -> Hash + -> Seq Scan on prt1_e_p3 t3_3 + Filter: (c = 0) + Optimizer: Postgres query optimizer +(34 rows) + +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) RIGHT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t3.c = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + a | c | b | c | ?column? | c +-----+------+-----+------+----------+--- + 0 | 0000 | 0 | 0000 | 0 | 0 + 50 | 0050 | | | 100 | 0 + 100 | 0100 | | | 200 | 0 + 150 | 0150 | 150 | 0150 | 300 | 0 + 200 | 0200 | | | 400 | 0 + 250 | 0250 | | | 500 | 0 + 300 | 0300 | 300 | 0300 | 600 | 0 + 350 | 0350 | | | 700 | 0 + 400 | 0400 | | | 800 | 0 + 450 | 0450 | 450 | 0450 | 900 | 0 + 500 | 0500 | | | 1000 | 0 + 550 | 0550 | | | 1100 | 0 +(12 rows) + +-- +-- 3-way full join +-- +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) + WHERE a BETWEEN 490 AND 510; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + -> Append + -> Hash Full Join + Hash Cond: ((COALESCE(prt1_1.a, p2_1.a) = p3_1.a) AND (COALESCE(prt1_1.b, p2_1.b) = p3_1.b)) + Filter: ((COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a) >= 490) AND (COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a) <= 510)) + -> Hash Full Join + Hash Cond: ((prt1_1.a = p2_1.a) AND (prt1_1.b = p2_1.b)) + -> Seq Scan on prt1_p1 prt1_1 + -> Hash + -> Seq Scan on prt2_p1 p2_1 + -> Hash + -> Seq Scan on prt2_p1 p3_1 + -> Hash Full Join + Hash Cond: ((COALESCE(prt1_2.a, p2_2.a) = p3_2.a) AND (COALESCE(prt1_2.b, p2_2.b) = p3_2.b)) + Filter: ((COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a) >= 490) AND (COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a) <= 510)) + -> Hash Full Join + Hash Cond: ((prt1_2.a = p2_2.a) AND (prt1_2.b = p2_2.b)) + -> Seq Scan on prt1_p2 prt1_2 + -> Hash + -> Seq Scan on prt2_p2 p2_2 + -> Hash + -> Seq Scan on prt2_p2 p3_2 + -> Hash Full Join + Hash Cond: ((COALESCE(prt1_3.a, p2_3.a) = p3_3.a) AND (COALESCE(prt1_3.b, p2_3.b) = p3_3.b)) + Filter: ((COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a) >= 490) AND (COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a) <= 510)) + -> Hash Full Join + Hash Cond: ((prt1_3.a = p2_3.a) AND (prt1_3.b = p2_3.b)) + -> Seq Scan on prt1_p3 prt1_3 + -> Hash + -> Seq Scan on prt2_p3 p2_3 + -> Hash + -> Seq Scan on prt2_p3 p3_3 + Optimizer: Postgres query optimizer +(33 rows) + +SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) + WHERE a BETWEEN 490 AND 510; + count +------- + 14 +(1 row) + +-- +-- 4-way full join +-- +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) FULL JOIN prt1 p4 (a,b,c) USING (a, b) + WHERE a BETWEEN 490 AND 510; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + -> Append + -> Hash Full Join + Hash Cond: ((COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a) = p4_1.a) AND (COALESCE(COALESCE(prt1_1.b, p2_1.b), p3_1.b) = p4_1.b)) + Filter: ((COALESCE(COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a), p4_1.a) >= 490) AND (COALESCE(COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a), p4_1.a) <= 510)) + -> Hash Full Join + Hash Cond: ((COALESCE(prt1_1.a, p2_1.a) = p3_1.a) AND (COALESCE(prt1_1.b, p2_1.b) = p3_1.b)) + -> Hash Full Join + Hash Cond: ((prt1_1.a = p2_1.a) AND (prt1_1.b = p2_1.b)) + -> Seq Scan on prt1_p1 prt1_1 + -> Hash + -> Seq Scan on prt2_p1 p2_1 + -> Hash + -> Seq Scan on prt2_p1 p3_1 + -> Hash + -> Seq Scan on prt1_p1 p4_1 + -> Hash Full Join + Hash Cond: ((COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a) = p4_2.a) AND (COALESCE(COALESCE(prt1_2.b, p2_2.b), p3_2.b) = p4_2.b)) + Filter: ((COALESCE(COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a), p4_2.a) >= 490) AND (COALESCE(COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a), p4_2.a) <= 510)) + -> Hash Full Join + Hash Cond: ((COALESCE(prt1_2.a, p2_2.a) = p3_2.a) AND (COALESCE(prt1_2.b, p2_2.b) = p3_2.b)) + -> Hash Full Join + Hash Cond: ((prt1_2.a = p2_2.a) AND (prt1_2.b = p2_2.b)) + -> Seq Scan on prt1_p2 prt1_2 + -> Hash + -> Seq Scan on prt2_p2 p2_2 + -> Hash + -> Seq Scan on prt2_p2 p3_2 + -> Hash + -> Seq Scan on prt1_p2 p4_2 + -> Hash Full Join + Hash Cond: ((COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a) = p4_3.a) AND (COALESCE(COALESCE(prt1_3.b, p2_3.b), p3_3.b) = p4_3.b)) + Filter: ((COALESCE(COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a), p4_3.a) >= 490) AND (COALESCE(COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a), p4_3.a) <= 510)) + -> Hash Full Join + Hash Cond: ((COALESCE(prt1_3.a, p2_3.a) = p3_3.a) AND (COALESCE(prt1_3.b, p2_3.b) = p3_3.b)) + -> Hash Full Join + Hash Cond: ((prt1_3.a = p2_3.a) AND (prt1_3.b = p2_3.b)) + -> Seq Scan on prt1_p3 prt1_3 + -> Hash + -> Seq Scan on prt2_p3 p2_3 + -> Hash + -> Seq Scan on prt2_p3 p3_3 + -> Hash + -> Seq Scan on prt1_p3 p4_3 + Optimizer: Postgres query optimizer +(45 rows) + +SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) FULL JOIN prt1 p4 (a,b,c) USING (a, b) + WHERE a BETWEEN 490 AND 510; + count +------- + 14 +(1 row) + +-- Cases with non-nullable expressions in subquery results; +-- make sure these go to null as expected +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.phv, t2.b, t2.phv, t3.a + t3.b, t3.phv FROM ((SELECT 50 phv, * FROM prt1 WHERE prt1.b = 0) t1 FULL JOIN (SELECT 75 phv, * FROM prt2 WHERE prt2.a = 0) t2 ON (t1.a = t2.b)) FULL JOIN (SELECT 50 phv, * FROM prt1_e WHERE prt1_e.c = 0) t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t1.a = t1.phv OR t2.b = t2.phv OR (t3.a + t3.b)/2 = t3.phv ORDER BY t1.a, t2.b, t3.a + t3.b; + QUERY PLAN +------------------------------------------------------------------------------------------------------------ + Sort + Sort Key: prt1.a, prt2.b, ((prt1_e.a + prt1_e.b)) + -> Append + -> Hash Full Join + Hash Cond: (prt1_1.a = ((prt1_e_1.a + prt1_e_1.b) / 2)) + Filter: ((prt1_1.a = (50)) OR (prt2_1.b = (75)) OR (((prt1_e_1.a + prt1_e_1.b) / 2) = (50))) + -> Hash Full Join + Hash Cond: (prt1_1.a = prt2_1.b) + -> Seq Scan on prt1_p1 prt1_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p1 prt2_1 + Filter: (a = 0) + -> Hash + -> Seq Scan on prt1_e_p1 prt1_e_1 + Filter: (c = 0) + -> Hash Full Join + Hash Cond: (prt1_2.a = ((prt1_e_2.a + prt1_e_2.b) / 2)) + Filter: ((prt1_2.a = (50)) OR (prt2_2.b = (75)) OR (((prt1_e_2.a + prt1_e_2.b) / 2) = (50))) + -> Hash Full Join + Hash Cond: (prt1_2.a = prt2_2.b) + -> Seq Scan on prt1_p2 prt1_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p2 prt2_2 + Filter: (a = 0) + -> Hash + -> Seq Scan on prt1_e_p2 prt1_e_2 + Filter: (c = 0) + -> Hash Full Join + Hash Cond: (prt1_3.a = ((prt1_e_3.a + prt1_e_3.b) / 2)) + Filter: ((prt1_3.a = (50)) OR (prt2_3.b = (75)) OR (((prt1_e_3.a + prt1_e_3.b) / 2) = (50))) + -> Hash Full Join + Hash Cond: (prt1_3.a = prt2_3.b) + -> Seq Scan on prt1_p3 prt1_3 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_p3 prt2_3 + Filter: (a = 0) + -> Hash + -> Seq Scan on prt1_e_p3 prt1_e_3 + Filter: (c = 0) + Optimizer: Postgres query optimizer +(43 rows) + +SELECT t1.a, t1.phv, t2.b, t2.phv, t3.a + t3.b, t3.phv FROM ((SELECT 50 phv, * FROM prt1 WHERE prt1.b = 0) t1 FULL JOIN (SELECT 75 phv, * FROM prt2 WHERE prt2.a = 0) t2 ON (t1.a = t2.b)) FULL JOIN (SELECT 50 phv, * FROM prt1_e WHERE prt1_e.c = 0) t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t1.a = t1.phv OR t2.b = t2.phv OR (t3.a + t3.b)/2 = t3.phv ORDER BY t1.a, t2.b, t3.a + t3.b; + a | phv | b | phv | ?column? | phv +----+-----+----+-----+----------+----- + 50 | 50 | | | 100 | 50 + | | 75 | 75 | | +(2 rows) + +-- Semi-join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1, prt1_e t2 WHERE t1.a = 0 AND t1.b = (t2.a + t2.b)/2) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Semi Join + Hash Cond: (t1_2.a = t1_5.b) + -> Seq Scan on prt1_p1 t1_2 + Filter: (b = 0) + -> Hash + -> Hash Join + Hash Cond: (((t2_1.a + t2_1.b) / 2) = t1_5.b) + -> Seq Scan on prt1_e_p1 t2_1 + -> Hash + -> Seq Scan on prt2_p1 t1_5 + Filter: (a = 0) + -> Hash Join + Hash Cond: (t1_3.a = t1_6.b) + -> Seq Scan on prt1_p2 t1_3 + Filter: (b = 0) + -> Hash + -> HashAggregate + Group Key: t1_6.b + -> Hash Join + Hash Cond: (((t2_2.a + t2_2.b) / 2) = t1_6.b) + -> Seq Scan on prt1_e_p2 t2_2 + -> Hash + -> Seq Scan on prt2_p2 t1_6 + Filter: (a = 0) + -> Hash Join + Hash Cond: (t1_4.a = t1_7.b) + -> Seq Scan on prt1_p3 t1_4 + Filter: (b = 0) + -> Hash + -> HashAggregate + Group Key: t1_7.b + -> Hash Join + Hash Cond: (((t2_3.a + t2_3.b) / 2) = t1_7.b) + -> Seq Scan on prt1_e_p3 t2_3 + -> Hash + -> Seq Scan on prt2_p3 t1_7 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(41 rows) + +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1, prt1_e t2 WHERE t1.a = 0 AND t1.b = (t2.a + t2.b)/2) AND t1.b = 0 ORDER BY t1.a; + a | b | c +-----+---+------ + 0 | 0 | 0000 + 150 | 0 | 0150 + 300 | 0 | 0300 + 450 | 0 | 0450 +(4 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1 WHERE t1.b IN (SELECT (t1.a + t1.b)/2 FROM prt1_e t1 WHERE t1.c = 0)) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +--------------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Semi Join + Hash Cond: (t1_3.a = t1_6.b) + -> Seq Scan on prt1_p1 t1_3 + Filter: (b = 0) + -> Hash + -> Hash Semi Join + Hash Cond: (t1_6.b = ((t1_9.a + t1_9.b) / 2)) + -> Seq Scan on prt2_p1 t1_6 + -> Hash + -> Seq Scan on prt1_e_p1 t1_9 + Filter: (c = 0) + -> Hash Semi Join + Hash Cond: (t1_4.a = t1_7.b) + -> Seq Scan on prt1_p2 t1_4 + Filter: (b = 0) + -> Hash + -> Hash Semi Join + Hash Cond: (t1_7.b = ((t1_10.a + t1_10.b) / 2)) + -> Seq Scan on prt2_p2 t1_7 + -> Hash + -> Seq Scan on prt1_e_p2 t1_10 + Filter: (c = 0) + -> Hash Semi Join + Hash Cond: (t1_5.a = t1_8.b) + -> Seq Scan on prt1_p3 t1_5 + Filter: (b = 0) + -> Hash + -> Hash Semi Join + Hash Cond: (t1_8.b = ((t1_11.a + t1_11.b) / 2)) + -> Seq Scan on prt2_p3 t1_8 + -> Hash + -> Seq Scan on prt1_e_p3 t1_11 + Filter: (c = 0) + Optimizer: Postgres query optimizer +(37 rows) + +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1 WHERE t1.b IN (SELECT (t1.a + t1.b)/2 FROM prt1_e t1 WHERE t1.c = 0)) AND t1.b = 0 ORDER BY t1.a; + a | b | c +-----+---+------ + 0 | 0 | 0000 + 150 | 0 | 0150 + 300 | 0 | 0300 + 450 | 0 | 0450 +(4 rows) + +-- test merge joins +SET enable_hashjoin TO off; +SET enable_nestloop TO off; +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1 WHERE t1.b IN (SELECT (t1.a + t1.b)/2 FROM prt1_e t1 WHERE t1.c = 0)) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------------------------ + Sort + Sort Key: t1.a + -> Append + -> Merge Semi Join + Merge Cond: (t1_3.a = t1_6.b) + -> Sort + Sort Key: t1_3.a + -> Seq Scan on prt1_p1 t1_3 + Filter: (b = 0) + -> Merge Semi Join + Merge Cond: (t1_6.b = (((t1_9.a + t1_9.b) / 2))) + -> Sort + Sort Key: t1_6.b + -> Seq Scan on prt2_p1 t1_6 + -> Sort + Sort Key: (((t1_9.a + t1_9.b) / 2)) + -> Seq Scan on prt1_e_p1 t1_9 + Filter: (c = 0) + -> Merge Semi Join + Merge Cond: (t1_4.a = t1_7.b) + -> Sort + Sort Key: t1_4.a + -> Seq Scan on prt1_p2 t1_4 + Filter: (b = 0) + -> Merge Semi Join + Merge Cond: (t1_7.b = (((t1_10.a + t1_10.b) / 2))) + -> Sort + Sort Key: t1_7.b + -> Seq Scan on prt2_p2 t1_7 + -> Sort + Sort Key: (((t1_10.a + t1_10.b) / 2)) + -> Seq Scan on prt1_e_p2 t1_10 + Filter: (c = 0) + -> Merge Semi Join + Merge Cond: (t1_5.a = t1_8.b) + -> Sort + Sort Key: t1_5.a + -> Seq Scan on prt1_p3 t1_5 + Filter: (b = 0) + -> Merge Semi Join + Merge Cond: (t1_8.b = (((t1_11.a + t1_11.b) / 2))) + -> Sort + Sort Key: t1_8.b + -> Seq Scan on prt2_p3 t1_8 + -> Sort + Sort Key: (((t1_11.a + t1_11.b) / 2)) + -> Seq Scan on prt1_e_p3 t1_11 + Filter: (c = 0) + Optimizer: Postgres query optimizer +(49 rows) + +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1 WHERE t1.b IN (SELECT (t1.a + t1.b)/2 FROM prt1_e t1 WHERE t1.c = 0)) AND t1.b = 0 ORDER BY t1.a; + a | b | c +-----+---+------ + 0 | 0 | 0000 + 150 | 0 | 0150 + 300 | 0 | 0300 + 450 | 0 | 0450 +(4 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) RIGHT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t3.c = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + QUERY PLAN +--------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.b, ((t3.a + t3.b)) + -> Append + -> Merge Left Join + Merge Cond: (t1_1.a = t2_1.b) + -> Sort + Sort Key: t1_1.a + -> Nested Loop Left Join + -> Seq Scan on prt1_e_p1 t3_1 + Filter: (c = 0) + -> Index Scan using iprt1_p1_a on prt1_p1 t1_1 + Index Cond: (a = ((t3_1.a + t3_1.b) / 2)) + -> Sort + Sort Key: t2_1.b + -> Seq Scan on prt2_p1 t2_1 + -> Merge Left Join + Merge Cond: (t1_2.a = t2_2.b) + -> Sort + Sort Key: t1_2.a + -> Nested Loop Left Join + -> Seq Scan on prt1_e_p2 t3_2 + Filter: (c = 0) + -> Index Scan using iprt1_p2_a on prt1_p2 t1_2 + Index Cond: (a = ((t3_2.a + t3_2.b) / 2)) + -> Sort + Sort Key: t2_2.b + -> Seq Scan on prt2_p2 t2_2 + -> Merge Left Join + Merge Cond: (t1_3.a = t2_3.b) + -> Sort + Sort Key: t1_3.a + -> Nested Loop Left Join + -> Seq Scan on prt1_e_p3 t3_3 + Filter: (c = 0) + -> Index Scan using iprt1_p3_a on prt1_p3 t1_3 + Index Cond: (a = ((t3_3.a + t3_3.b) / 2)) + -> Sort + Sort Key: t2_3.b + -> Seq Scan on prt2_p3 t2_3 + Optimizer: Postgres query optimizer +(40 rows) + +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) RIGHT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t3.c = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + a | c | b | c | ?column? | c +-----+------+-----+------+----------+--- + 0 | 0000 | 0 | 0000 | 0 | 0 + 50 | 0050 | | | 100 | 0 + 100 | 0100 | | | 200 | 0 + 150 | 0150 | 150 | 0150 | 300 | 0 + 200 | 0200 | | | 400 | 0 + 250 | 0250 | | | 500 | 0 + 300 | 0300 | 300 | 0300 | 600 | 0 + 350 | 0350 | | | 700 | 0 + 400 | 0400 | | | 800 | 0 + 450 | 0450 | 450 | 0450 | 900 | 0 + 500 | 0500 | | | 1000 | 0 + 550 | 0550 | | | 1100 | 0 +(12 rows) + +-- MergeAppend on nullable column +-- This should generate a partitionwise join, but currently fails to +EXPLAIN (COSTS OFF) +SELECT t1.a, t2.b FROM (SELECT * FROM prt1 WHERE a < 450) t1 LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +----------------------------------------------------------- + Sort + Sort Key: prt1.a, prt2.b + -> Merge Left Join + Merge Cond: (prt1.a = prt2.b) + -> Sort + Sort Key: prt1.a + -> Append + -> Seq Scan on prt1_p1 prt1_1 + Filter: ((a < 450) AND (b = 0)) + -> Seq Scan on prt1_p2 prt1_2 + Filter: ((a < 450) AND (b = 0)) + -> Sort + Sort Key: prt2.b + -> Append + -> Seq Scan on prt2_p2 prt2_1 + Filter: (b > 250) + -> Seq Scan on prt2_p3 prt2_2 + Filter: (b > 250) + Optimizer: Postgres query optimizer +(19 rows) + +SELECT t1.a, t2.b FROM (SELECT * FROM prt1 WHERE a < 450) t1 LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + a | b +-----+----- + 0 | + 50 | + 100 | + 150 | + 200 | + 250 | + 300 | 300 + 350 | + 400 | +(9 rows) + +-- merge join when expression with whole-row reference needs to be sorted; +-- partitionwise join does not apply +EXPLAIN (COSTS OFF) +SELECT t1.a, t2.b FROM prt1 t1, prt2 t2 WHERE t1::text = t2::text AND t1.a = t2.b ORDER BY t1.a; + QUERY PLAN +----------------------------------------------------------------------------------------- + Merge Join + Merge Cond: ((t1.a = t2.b) AND (((((t1.*)::prt1))::text) = ((((t2.*)::prt2))::text))) + -> Sort + Sort Key: t1.a, ((((t1.*)::prt1))::text) + -> Result + -> Append + -> Seq Scan on prt1_p1 t1_1 + -> Seq Scan on prt1_p2 t1_2 + -> Seq Scan on prt1_p3 t1_3 + -> Sort + Sort Key: t2.b, ((((t2.*)::prt2))::text) + -> Result + -> Append + -> Seq Scan on prt2_p1 t2_1 + -> Seq Scan on prt2_p2 t2_2 + -> Seq Scan on prt2_p3 t2_3 + Optimizer: Postgres query optimizer +(17 rows) + +SELECT t1.a, t2.b FROM prt1 t1, prt2 t2 WHERE t1::text = t2::text AND t1.a = t2.b ORDER BY t1.a; + a | b +----+---- + 0 | 0 + 6 | 6 + 12 | 12 + 18 | 18 + 24 | 24 +(5 rows) + +RESET enable_hashjoin; +RESET enable_nestloop; +-- +-- partitioned by multiple columns +-- +CREATE TABLE prt1_m (a int, b int, c int) PARTITION BY RANGE(a, ((a + b)/2)); +CREATE TABLE prt1_m_p1 PARTITION OF prt1_m FOR VALUES FROM (0, 0) TO (250, 250); +CREATE TABLE prt1_m_p2 PARTITION OF prt1_m FOR VALUES FROM (250, 250) TO (500, 500); +CREATE TABLE prt1_m_p3 PARTITION OF prt1_m FOR VALUES FROM (500, 500) TO (600, 600); +INSERT INTO prt1_m SELECT i, i, i % 25 FROM generate_series(0, 599, 2) i; +ANALYZE prt1_m; +CREATE TABLE prt2_m (a int, b int, c int) PARTITION BY RANGE(((b + a)/2), b); +CREATE TABLE prt2_m_p1 PARTITION OF prt2_m FOR VALUES FROM (0, 0) TO (250, 250); +CREATE TABLE prt2_m_p2 PARTITION OF prt2_m FOR VALUES FROM (250, 250) TO (500, 500); +CREATE TABLE prt2_m_p3 PARTITION OF prt2_m FOR VALUES FROM (500, 500) TO (600, 600); +INSERT INTO prt2_m SELECT i, i, i % 25 FROM generate_series(0, 599, 3) i; +ANALYZE prt2_m; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_m WHERE prt1_m.c = 0) t1 FULL JOIN (SELECT * FROM prt2_m WHERE prt2_m.c = 0) t2 ON (t1.a = (t2.b + t2.a)/2 AND t2.b = (t1.a + t1.b)/2) ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------ + Sort + Sort Key: prt1_m.a, prt2_m.b + -> Append + -> Hash Full Join + Hash Cond: ((prt1_m_1.a = ((prt2_m_1.b + prt2_m_1.a) / 2)) AND (((prt1_m_1.a + prt1_m_1.b) / 2) = prt2_m_1.b)) + -> Seq Scan on prt1_m_p1 prt1_m_1 + Filter: (c = 0) + -> Hash + -> Seq Scan on prt2_m_p1 prt2_m_1 + Filter: (c = 0) + -> Hash Full Join + Hash Cond: ((prt1_m_2.a = ((prt2_m_2.b + prt2_m_2.a) / 2)) AND (((prt1_m_2.a + prt1_m_2.b) / 2) = prt2_m_2.b)) + -> Seq Scan on prt1_m_p2 prt1_m_2 + Filter: (c = 0) + -> Hash + -> Seq Scan on prt2_m_p2 prt2_m_2 + Filter: (c = 0) + -> Hash Full Join + Hash Cond: ((prt1_m_3.a = ((prt2_m_3.b + prt2_m_3.a) / 2)) AND (((prt1_m_3.a + prt1_m_3.b) / 2) = prt2_m_3.b)) + -> Seq Scan on prt1_m_p3 prt1_m_3 + Filter: (c = 0) + -> Hash + -> Seq Scan on prt2_m_p3 prt2_m_3 + Filter: (c = 0) + Optimizer: Postgres query optimizer +(25 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_m WHERE prt1_m.c = 0) t1 FULL JOIN (SELECT * FROM prt2_m WHERE prt2_m.c = 0) t2 ON (t1.a = (t2.b + t2.a)/2 AND t2.b = (t1.a + t1.b)/2) ORDER BY t1.a, t2.b; + a | c | b | c +-----+---+-----+--- + 0 | 0 | 0 | 0 + 50 | 0 | | + 100 | 0 | | + 150 | 0 | 150 | 0 + 200 | 0 | | + 250 | 0 | | + 300 | 0 | 300 | 0 + 350 | 0 | | + 400 | 0 | | + 450 | 0 | 450 | 0 + 500 | 0 | | + 550 | 0 | | + | | 75 | 0 + | | 225 | 0 + | | 375 | 0 + | | 525 | 0 +(16 rows) + +-- +-- tests for list partitioned tables. +-- +CREATE TABLE plt1 (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE plt1_p1 PARTITION OF plt1 FOR VALUES IN ('0000', '0003', '0004', '0010'); +CREATE TABLE plt1_p2 PARTITION OF plt1 FOR VALUES IN ('0001', '0005', '0002', '0009'); +CREATE TABLE plt1_p3 PARTITION OF plt1 FOR VALUES IN ('0006', '0007', '0008', '0011'); +INSERT INTO plt1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE plt1; +CREATE TABLE plt2 (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE plt2_p1 PARTITION OF plt2 FOR VALUES IN ('0000', '0003', '0004', '0010'); +CREATE TABLE plt2_p2 PARTITION OF plt2 FOR VALUES IN ('0001', '0005', '0002', '0009'); +CREATE TABLE plt2_p3 PARTITION OF plt2 FOR VALUES IN ('0006', '0007', '0008', '0011'); +INSERT INTO plt2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 3) i; +ANALYZE plt2; +-- +-- list partitioned by expression +-- +CREATE TABLE plt1_e (a int, b int, c text) PARTITION BY LIST(ltrim(c, 'A')); +CREATE TABLE plt1_e_p1 PARTITION OF plt1_e FOR VALUES IN ('0000', '0003', '0004', '0010'); +CREATE TABLE plt1_e_p2 PARTITION OF plt1_e FOR VALUES IN ('0001', '0005', '0002', '0009'); +CREATE TABLE plt1_e_p3 PARTITION OF plt1_e FOR VALUES IN ('0006', '0007', '0008', '0011'); +INSERT INTO plt1_e SELECT i, i, 'A' || to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE plt1_e; +-- test partition matching with N-way join +EXPLAIN (COSTS OFF) +SELECT avg(t1.a), avg(t2.b), avg(t3.a + t3.b), t1.c, t2.c, t3.c FROM plt1 t1, plt2 t2, plt1_e t3 WHERE t1.b = t2.b AND t1.c = t2.c AND ltrim(t3.c, 'A') = t1.c GROUP BY t1.c, t2.c, t3.c ORDER BY t1.c, t2.c, t3.c; + QUERY PLAN +-------------------------------------------------------------------------------------- + GroupAggregate + Group Key: t1.c, t2.c, t3.c + -> Sort + Sort Key: t1.c, t3.c + -> Append + -> Hash Join + Hash Cond: (ltrim(t3_1.c, 'A'::text) = t1_1.c) + -> Seq Scan on plt1_e_p1 t3_1 + -> Hash + -> Hash Join + Hash Cond: ((t1_1.b = t2_1.b) AND (t1_1.c = t2_1.c)) + -> Seq Scan on plt1_p1 t1_1 + -> Hash + -> Seq Scan on plt2_p1 t2_1 + -> Hash Join + Hash Cond: (ltrim(t3_2.c, 'A'::text) = t1_2.c) + -> Seq Scan on plt1_e_p2 t3_2 + -> Hash + -> Hash Join + Hash Cond: ((t1_2.b = t2_2.b) AND (t1_2.c = t2_2.c)) + -> Seq Scan on plt1_p2 t1_2 + -> Hash + -> Seq Scan on plt2_p2 t2_2 + -> Hash Join + Hash Cond: (ltrim(t3_3.c, 'A'::text) = t1_3.c) + -> Seq Scan on plt1_e_p3 t3_3 + -> Hash + -> Hash Join + Hash Cond: ((t1_3.b = t2_3.b) AND (t1_3.c = t2_3.c)) + -> Seq Scan on plt1_p3 t1_3 + -> Hash + -> Seq Scan on plt2_p3 t2_3 + Optimizer: Postgres query optimizer +(33 rows) + +SELECT avg(t1.a), avg(t2.b), avg(t3.a + t3.b), t1.c, t2.c, t3.c FROM plt1 t1, plt2 t2, plt1_e t3 WHERE t1.b = t2.b AND t1.c = t2.c AND ltrim(t3.c, 'A') = t1.c GROUP BY t1.c, t2.c, t3.c ORDER BY t1.c, t2.c, t3.c; + avg | avg | avg | c | c | c +----------------------+----------------------+-----------------------+------+------+------- + 24.0000000000000000 | 24.0000000000000000 | 48.0000000000000000 | 0000 | 0000 | A0000 + 75.0000000000000000 | 75.0000000000000000 | 148.0000000000000000 | 0001 | 0001 | A0001 + 123.0000000000000000 | 123.0000000000000000 | 248.0000000000000000 | 0002 | 0002 | A0002 + 174.0000000000000000 | 174.0000000000000000 | 348.0000000000000000 | 0003 | 0003 | A0003 + 225.0000000000000000 | 225.0000000000000000 | 448.0000000000000000 | 0004 | 0004 | A0004 + 273.0000000000000000 | 273.0000000000000000 | 548.0000000000000000 | 0005 | 0005 | A0005 + 324.0000000000000000 | 324.0000000000000000 | 648.0000000000000000 | 0006 | 0006 | A0006 + 375.0000000000000000 | 375.0000000000000000 | 748.0000000000000000 | 0007 | 0007 | A0007 + 423.0000000000000000 | 423.0000000000000000 | 848.0000000000000000 | 0008 | 0008 | A0008 + 474.0000000000000000 | 474.0000000000000000 | 948.0000000000000000 | 0009 | 0009 | A0009 + 525.0000000000000000 | 525.0000000000000000 | 1048.0000000000000000 | 0010 | 0010 | A0010 + 573.0000000000000000 | 573.0000000000000000 | 1148.0000000000000000 | 0011 | 0011 | A0011 +(12 rows) + +-- joins where one of the relations is proven empty +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.a = 1 AND t1.a = 2; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 LEFT JOIN prt2 t2 ON t1.a = t2.b; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b, prt1 t3 WHERE t2.b = t3.a; + QUERY PLAN +-------------------------------------------------- + Hash Left Join + Hash Cond: (t2.b = a) + -> Append + -> Hash Join + Hash Cond: (t3_1.a = t2_1.b) + -> Seq Scan on prt1_p1 t3_1 + -> Hash + -> Seq Scan on prt2_p1 t2_1 + -> Hash Join + Hash Cond: (t3_2.a = t2_2.b) + -> Seq Scan on prt1_p2 t3_2 + -> Hash + -> Seq Scan on prt2_p2 t2_2 + -> Hash Join + Hash Cond: (t3_3.a = t2_3.b) + -> Seq Scan on prt1_p3 t3_3 + -> Hash + -> Seq Scan on prt2_p3 t2_3 + -> Hash + -> Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(22 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 FULL JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +-------------------------------------------- + Sort + Sort Key: a, t2.b + -> Hash Left Join + Hash Cond: (t2.b = a) + -> Append + -> Seq Scan on prt2_p1 t2_1 + Filter: (a = 0) + -> Seq Scan on prt2_p2 t2_2 + Filter: (a = 0) + -> Seq Scan on prt2_p3 t2_3 + Filter: (a = 0) + -> Hash + -> Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(15 rows) + +-- +-- tests for hash partitioned tables. +-- +CREATE TABLE pht1 (a int, b int, c text) PARTITION BY HASH(c); +CREATE TABLE pht1_p1 PARTITION OF pht1 FOR VALUES WITH (MODULUS 3, REMAINDER 0); +CREATE TABLE pht1_p2 PARTITION OF pht1 FOR VALUES WITH (MODULUS 3, REMAINDER 1); +CREATE TABLE pht1_p3 PARTITION OF pht1 FOR VALUES WITH (MODULUS 3, REMAINDER 2); +INSERT INTO pht1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE pht1; +CREATE TABLE pht2 (a int, b int, c text) PARTITION BY HASH(c); +CREATE TABLE pht2_p1 PARTITION OF pht2 FOR VALUES WITH (MODULUS 3, REMAINDER 0); +CREATE TABLE pht2_p2 PARTITION OF pht2 FOR VALUES WITH (MODULUS 3, REMAINDER 1); +CREATE TABLE pht2_p3 PARTITION OF pht2 FOR VALUES WITH (MODULUS 3, REMAINDER 2); +INSERT INTO pht2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 3) i; +ANALYZE pht2; +-- +-- hash partitioned by expression +-- +CREATE TABLE pht1_e (a int, b int, c text) PARTITION BY HASH(ltrim(c, 'A')); +CREATE TABLE pht1_e_p1 PARTITION OF pht1_e FOR VALUES WITH (MODULUS 3, REMAINDER 0); +CREATE TABLE pht1_e_p2 PARTITION OF pht1_e FOR VALUES WITH (MODULUS 3, REMAINDER 1); +CREATE TABLE pht1_e_p3 PARTITION OF pht1_e FOR VALUES WITH (MODULUS 3, REMAINDER 2); +INSERT INTO pht1_e SELECT i, i, 'A' || to_char(i/50, 'FM0000') FROM generate_series(0, 299, 2) i; +ANALYZE pht1_e; +-- test partition matching with N-way join +EXPLAIN (COSTS OFF) +SELECT avg(t1.a), avg(t2.b), avg(t3.a + t3.b), t1.c, t2.c, t3.c FROM pht1 t1, pht2 t2, pht1_e t3 WHERE t1.b = t2.b AND t1.c = t2.c AND ltrim(t3.c, 'A') = t1.c GROUP BY t1.c, t2.c, t3.c ORDER BY t1.c, t2.c, t3.c; + QUERY PLAN +-------------------------------------------------------------------------------------- + GroupAggregate + Group Key: t1.c, t2.c, t3.c + -> Sort + Sort Key: t1.c, t3.c + -> Append + -> Hash Join + Hash Cond: (ltrim(t3_1.c, 'A'::text) = t1_1.c) + -> Seq Scan on pht1_e_p1 t3_1 + -> Hash + -> Hash Join + Hash Cond: ((t1_1.b = t2_1.b) AND (t1_1.c = t2_1.c)) + -> Seq Scan on pht1_p1 t1_1 + -> Hash + -> Seq Scan on pht2_p1 t2_1 + -> Hash Join + Hash Cond: (ltrim(t3_2.c, 'A'::text) = t1_2.c) + -> Seq Scan on pht1_e_p2 t3_2 + -> Hash + -> Hash Join + Hash Cond: ((t1_2.b = t2_2.b) AND (t1_2.c = t2_2.c)) + -> Seq Scan on pht1_p2 t1_2 + -> Hash + -> Seq Scan on pht2_p2 t2_2 + -> Hash Join + Hash Cond: (ltrim(t3_3.c, 'A'::text) = t1_3.c) + -> Seq Scan on pht1_e_p3 t3_3 + -> Hash + -> Hash Join + Hash Cond: ((t1_3.b = t2_3.b) AND (t1_3.c = t2_3.c)) + -> Seq Scan on pht1_p3 t1_3 + -> Hash + -> Seq Scan on pht2_p3 t2_3 + Optimizer: Postgres query optimizer +(33 rows) + +SELECT avg(t1.a), avg(t2.b), avg(t3.a + t3.b), t1.c, t2.c, t3.c FROM pht1 t1, pht2 t2, pht1_e t3 WHERE t1.b = t2.b AND t1.c = t2.c AND ltrim(t3.c, 'A') = t1.c GROUP BY t1.c, t2.c, t3.c ORDER BY t1.c, t2.c, t3.c; + avg | avg | avg | c | c | c +----------------------+----------------------+----------------------+------+------+------- + 24.0000000000000000 | 24.0000000000000000 | 48.0000000000000000 | 0000 | 0000 | A0000 + 75.0000000000000000 | 75.0000000000000000 | 148.0000000000000000 | 0001 | 0001 | A0001 + 123.0000000000000000 | 123.0000000000000000 | 248.0000000000000000 | 0002 | 0002 | A0002 + 174.0000000000000000 | 174.0000000000000000 | 348.0000000000000000 | 0003 | 0003 | A0003 + 225.0000000000000000 | 225.0000000000000000 | 448.0000000000000000 | 0004 | 0004 | A0004 + 273.0000000000000000 | 273.0000000000000000 | 548.0000000000000000 | 0005 | 0005 | A0005 +(6 rows) + +-- test default partition behavior for range +ALTER TABLE prt1 DETACH PARTITION prt1_p3; +ALTER TABLE prt1 ATTACH PARTITION prt1_p3 DEFAULT; +ANALYZE prt1; +ALTER TABLE prt2 DETACH PARTITION prt2_p3; +ALTER TABLE prt2 ATTACH PARTITION prt2_p3 DEFAULT; +ANALYZE prt2; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +-------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_p1 t2_1 + -> Hash + -> Seq Scan on prt1_p1 t1_1 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_p2 t2_2 + -> Hash + -> Seq Scan on prt1_p2 t1_2 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_p3 t2_3 + -> Hash + -> Seq Scan on prt1_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(22 rows) + +-- test default partition behavior for list +ALTER TABLE plt1 DETACH PARTITION plt1_p3; +ALTER TABLE plt1 ATTACH PARTITION plt1_p3 DEFAULT; +ANALYZE plt1; +ALTER TABLE plt2 DETACH PARTITION plt2_p3; +ALTER TABLE plt2 ATTACH PARTITION plt2_p3 DEFAULT; +ANALYZE plt2; +EXPLAIN (COSTS OFF) +SELECT avg(t1.a), avg(t2.b), t1.c, t2.c FROM plt1 t1 RIGHT JOIN plt2 t2 ON t1.c = t2.c WHERE t1.a % 25 = 0 GROUP BY t1.c, t2.c ORDER BY t1.c, t2.c; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: t1.c + -> HashAggregate + Group Key: t1.c, t2.c + -> Append + -> Hash Join + Hash Cond: (t2_1.c = t1_1.c) + -> Seq Scan on plt2_p1 t2_1 + -> Hash + -> Seq Scan on plt1_p1 t1_1 + Filter: ((a % 25) = 0) + -> Hash Join + Hash Cond: (t2_2.c = t1_2.c) + -> Seq Scan on plt2_p2 t2_2 + -> Hash + -> Seq Scan on plt1_p2 t1_2 + Filter: ((a % 25) = 0) + -> Hash Join + Hash Cond: (t2_3.c = t1_3.c) + -> Seq Scan on plt2_p3 t2_3 + -> Hash + -> Seq Scan on plt1_p3 t1_3 + Filter: ((a % 25) = 0) + Optimizer: Postgres query optimizer +(24 rows) + +-- +-- multiple levels of partitioning +-- +CREATE TABLE prt1_l (a int, b int, c varchar) PARTITION BY RANGE(a); +CREATE TABLE prt1_l_p1 PARTITION OF prt1_l FOR VALUES FROM (0) TO (250); +CREATE TABLE prt1_l_p2 PARTITION OF prt1_l FOR VALUES FROM (250) TO (500) PARTITION BY LIST (c); +CREATE TABLE prt1_l_p2_p1 PARTITION OF prt1_l_p2 FOR VALUES IN ('0000', '0001'); +CREATE TABLE prt1_l_p2_p2 PARTITION OF prt1_l_p2 FOR VALUES IN ('0002', '0003'); +CREATE TABLE prt1_l_p3 PARTITION OF prt1_l FOR VALUES FROM (500) TO (600) PARTITION BY RANGE (b); +CREATE TABLE prt1_l_p3_p1 PARTITION OF prt1_l_p3 FOR VALUES FROM (0) TO (13); +CREATE TABLE prt1_l_p3_p2 PARTITION OF prt1_l_p3 FOR VALUES FROM (13) TO (25); +INSERT INTO prt1_l SELECT i, i % 25, to_char(i % 4, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE prt1_l; +CREATE TABLE prt2_l (a int, b int, c varchar) PARTITION BY RANGE(b); +CREATE TABLE prt2_l_p1 PARTITION OF prt2_l FOR VALUES FROM (0) TO (250); +CREATE TABLE prt2_l_p2 PARTITION OF prt2_l FOR VALUES FROM (250) TO (500) PARTITION BY LIST (c); +CREATE TABLE prt2_l_p2_p1 PARTITION OF prt2_l_p2 FOR VALUES IN ('0000', '0001'); +CREATE TABLE prt2_l_p2_p2 PARTITION OF prt2_l_p2 FOR VALUES IN ('0002', '0003'); +CREATE TABLE prt2_l_p3 PARTITION OF prt2_l FOR VALUES FROM (500) TO (600) PARTITION BY RANGE (a); +CREATE TABLE prt2_l_p3_p1 PARTITION OF prt2_l_p3 FOR VALUES FROM (0) TO (13); +CREATE TABLE prt2_l_p3_p2 PARTITION OF prt2_l_p3 FOR VALUES FROM (13) TO (25); +INSERT INTO prt2_l SELECT i % 25, i, to_char(i % 4, 'FM0000') FROM generate_series(0, 599, 3) i; +ANALYZE prt2_l; +-- inner join, qual covering only top-level partitions +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1, prt2_l t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_l_p1 t2_1 + -> Hash + -> Seq Scan on prt1_l_p1 t1_1 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_3.b = t1_3.a) + -> Append + -> Seq Scan on prt2_l_p2_p1 t2_3 + -> Seq Scan on prt2_l_p2_p2 t2_4 + -> Hash + -> Append + -> Seq Scan on prt1_l_p2_p1 t1_3 + Filter: (b = 0) + -> Seq Scan on prt1_l_p2_p2 t1_4 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_6.b = t1_5.a) + -> Append + -> Seq Scan on prt2_l_p3_p1 t2_6 + -> Seq Scan on prt2_l_p3_p2 t2_7 + -> Hash + -> Seq Scan on prt1_l_p3_p1 t1_5 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(29 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1, prt2_l t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 0 | 0000 | 0 | 0000 + 150 | 0002 | 150 | 0002 + 300 | 0000 | 300 | 0000 + 450 | 0002 | 450 | 0002 +(4 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1 LEFT JOIN prt2_l t2 ON t1.a = t2.b AND t1.c = t2.c WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------------------------------------ + Sort + Sort Key: t1.a, t2.b + -> Append + -> Hash Right Join + Hash Cond: ((t2_1.b = t1_1.a) AND ((t2_1.c)::text = (t1_1.c)::text)) + -> Seq Scan on prt2_l_p1 t2_1 + -> Hash + -> Seq Scan on prt1_l_p1 t1_1 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: ((t2_2.b = t1_2.a) AND ((t2_2.c)::text = (t1_2.c)::text)) + -> Seq Scan on prt2_l_p2_p1 t2_2 + -> Hash + -> Seq Scan on prt1_l_p2_p1 t1_2 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: ((t2_3.b = t1_3.a) AND ((t2_3.c)::text = (t1_3.c)::text)) + -> Seq Scan on prt2_l_p2_p2 t2_3 + -> Hash + -> Seq Scan on prt1_l_p2_p2 t1_3 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: ((t2_5.b = t1_4.a) AND ((t2_5.c)::text = (t1_4.c)::text)) + -> Append + -> Seq Scan on prt2_l_p3_p1 t2_5 + -> Seq Scan on prt2_l_p3_p2 t2_6 + -> Hash + -> Seq Scan on prt1_l_p3_p1 t1_4 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(30 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1 LEFT JOIN prt2_l t2 ON t1.a = t2.b AND t1.c = t2.c WHERE t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 0 | 0000 | 0 | 0000 + 50 | 0002 | | + 100 | 0000 | | + 150 | 0002 | 150 | 0002 + 200 | 0000 | | + 250 | 0002 | | + 300 | 0000 | 300 | 0000 + 350 | 0002 | | + 400 | 0000 | | + 450 | 0002 | 450 | 0002 + 500 | 0000 | | + 550 | 0002 | | +(12 rows) + +-- right join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.c = t2.c WHERE t2.a = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------------------------------------ + Sort + Sort Key: t1.a, t2.b + -> Append + -> Hash Right Join + Hash Cond: ((t1_1.a = t2_1.b) AND ((t1_1.c)::text = (t2_1.c)::text)) + -> Seq Scan on prt1_l_p1 t1_1 + -> Hash + -> Seq Scan on prt2_l_p1 t2_1 + Filter: (a = 0) + -> Hash Right Join + Hash Cond: ((t1_2.a = t2_2.b) AND ((t1_2.c)::text = (t2_2.c)::text)) + -> Seq Scan on prt1_l_p2_p1 t1_2 + -> Hash + -> Seq Scan on prt2_l_p2_p1 t2_2 + Filter: (a = 0) + -> Hash Right Join + Hash Cond: ((t1_3.a = t2_3.b) AND ((t1_3.c)::text = (t2_3.c)::text)) + -> Seq Scan on prt1_l_p2_p2 t1_3 + -> Hash + -> Seq Scan on prt2_l_p2_p2 t2_3 + Filter: (a = 0) + -> Hash Right Join + Hash Cond: ((t1_5.a = t2_4.b) AND ((t1_5.c)::text = (t2_4.c)::text)) + -> Append + -> Seq Scan on prt1_l_p3_p1 t1_5 + -> Seq Scan on prt1_l_p3_p2 t1_6 + -> Hash + -> Seq Scan on prt2_l_p3_p1 t2_4 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(30 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.c = t2.c WHERE t2.a = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 0 | 0000 | 0 | 0000 + 150 | 0002 | 150 | 0002 + 300 | 0000 | 300 | 0000 + 450 | 0002 | 450 | 0002 + | | 75 | 0003 + | | 225 | 0001 + | | 375 | 0003 + | | 525 | 0001 +(8 rows) + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE prt1_l.b = 0) t1 FULL JOIN (SELECT * FROM prt2_l WHERE prt2_l.a = 0) t2 ON (t1.a = t2.b AND t1.c = t2.c) ORDER BY t1.a, t2.b; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Sort + Sort Key: prt1_l.a, prt2_l.b + -> Append + -> Hash Full Join + Hash Cond: ((prt1_l_1.a = prt2_l_1.b) AND ((prt1_l_1.c)::text = (prt2_l_1.c)::text)) + -> Seq Scan on prt1_l_p1 prt1_l_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_l_p1 prt2_l_1 + Filter: (a = 0) + -> Hash Full Join + Hash Cond: ((prt1_l_2.a = prt2_l_2.b) AND ((prt1_l_2.c)::text = (prt2_l_2.c)::text)) + -> Seq Scan on prt1_l_p2_p1 prt1_l_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_l_p2_p1 prt2_l_2 + Filter: (a = 0) + -> Hash Full Join + Hash Cond: ((prt1_l_3.a = prt2_l_3.b) AND ((prt1_l_3.c)::text = (prt2_l_3.c)::text)) + -> Seq Scan on prt1_l_p2_p2 prt1_l_3 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_l_p2_p2 prt2_l_3 + Filter: (a = 0) + -> Hash Full Join + Hash Cond: ((prt1_l_4.a = prt2_l_4.b) AND ((prt1_l_4.c)::text = (prt2_l_4.c)::text)) + -> Seq Scan on prt1_l_p3_p1 prt1_l_4 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_l_p3_p1 prt2_l_4 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(32 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE prt1_l.b = 0) t1 FULL JOIN (SELECT * FROM prt2_l WHERE prt2_l.a = 0) t2 ON (t1.a = t2.b AND t1.c = t2.c) ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 0 | 0000 | 0 | 0000 + 50 | 0002 | | + 100 | 0000 | | + 150 | 0002 | 150 | 0002 + 200 | 0000 | | + 250 | 0002 | | + 300 | 0000 | 300 | 0000 + 350 | 0002 | | + 400 | 0000 | | + 450 | 0002 | 450 | 0002 + 500 | 0000 | | + 550 | 0002 | | + | | 75 | 0003 + | | 225 | 0001 + | | 375 | 0003 + | | 525 | 0001 +(16 rows) + +-- lateral partitionwise join +EXPLAIN (COSTS OFF) +SELECT * FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t2.c AS t2c, t2.b AS t2b, t3.b AS t3b, least(t1.a,t2.a,t3.b) FROM prt1_l t2 JOIN prt2_l t3 ON (t2.a = t3.b AND t2.c = t3.c)) ss + ON t1.a = ss.t2a AND t1.c = ss.t2c WHERE t1.b = 0 ORDER BY t1.a; + QUERY PLAN +----------------------------------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Nested Loop Left Join + -> Seq Scan on prt1_l_p1 t1_1 + Filter: (b = 0) + -> Hash Join + Hash Cond: ((t3_1.b = t2_1.a) AND ((t3_1.c)::text = (t2_1.c)::text)) + -> Seq Scan on prt2_l_p1 t3_1 + -> Hash + -> Seq Scan on prt1_l_p1 t2_1 + Filter: ((t1_1.a = a) AND ((t1_1.c)::text = (c)::text)) + -> Nested Loop Left Join + -> Seq Scan on prt1_l_p2_p1 t1_2 + Filter: (b = 0) + -> Hash Join + Hash Cond: ((t3_2.b = t2_2.a) AND ((t3_2.c)::text = (t2_2.c)::text)) + -> Seq Scan on prt2_l_p2_p1 t3_2 + -> Hash + -> Seq Scan on prt1_l_p2_p1 t2_2 + Filter: ((t1_2.a = a) AND ((t1_2.c)::text = (c)::text)) + -> Nested Loop Left Join + -> Seq Scan on prt1_l_p2_p2 t1_3 + Filter: (b = 0) + -> Hash Join + Hash Cond: ((t3_3.b = t2_3.a) AND ((t3_3.c)::text = (t2_3.c)::text)) + -> Seq Scan on prt2_l_p2_p2 t3_3 + -> Hash + -> Seq Scan on prt1_l_p2_p2 t2_3 + Filter: ((t1_3.a = a) AND ((t1_3.c)::text = (c)::text)) + -> Nested Loop Left Join + -> Seq Scan on prt1_l_p3_p1 t1_4 + Filter: (b = 0) + -> Hash Join + Hash Cond: ((t3_5.b = t2_5.a) AND ((t3_5.c)::text = (t2_5.c)::text)) + -> Append + -> Seq Scan on prt2_l_p3_p1 t3_5 + -> Seq Scan on prt2_l_p3_p2 t3_6 + -> Hash + -> Append + -> Seq Scan on prt1_l_p3_p1 t2_5 + Filter: ((t1_4.a = a) AND ((t1_4.c)::text = (c)::text)) + -> Seq Scan on prt1_l_p3_p2 t2_6 + Filter: ((t1_4.a = a) AND ((t1_4.c)::text = (c)::text)) + Optimizer: Postgres query optimizer +(45 rows) + +SELECT * FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t2.c AS t2c, t2.b AS t2b, t3.b AS t3b, least(t1.a,t2.a,t3.b) FROM prt1_l t2 JOIN prt2_l t3 ON (t2.a = t3.b AND t2.c = t3.c)) ss + ON t1.a = ss.t2a AND t1.c = ss.t2c WHERE t1.b = 0 ORDER BY t1.a; + a | b | c | t2a | t2c | t2b | t3b | least +-----+---+------+-----+------+-----+-----+------- + 0 | 0 | 0000 | 0 | 0000 | 0 | 0 | 0 + 50 | 0 | 0002 | | | | | + 100 | 0 | 0000 | | | | | + 150 | 0 | 0002 | 150 | 0002 | 0 | 150 | 150 + 200 | 0 | 0000 | | | | | + 250 | 0 | 0002 | | | | | + 300 | 0 | 0000 | 300 | 0000 | 0 | 300 | 300 + 350 | 0 | 0002 | | | | | + 400 | 0 | 0000 | | | | | + 450 | 0 | 0002 | 450 | 0002 | 0 | 450 | 450 + 500 | 0 | 0000 | | | | | + 550 | 0 | 0002 | | | | | +(12 rows) + +-- join with one side empty +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.b = t2.a AND t1.c = t2.c; + QUERY PLAN +------------------------------------------------------------------------- + Hash Left Join + Hash Cond: ((t2.b = a) AND (t2.a = b) AND ((t2.c)::text = (c)::text)) + -> Append + -> Seq Scan on prt2_l_p1 t2_1 + -> Seq Scan on prt2_l_p2_p1 t2_2 + -> Seq Scan on prt2_l_p2_p2 t2_3 + -> Seq Scan on prt2_l_p3_p1 t2_4 + -> Seq Scan on prt2_l_p3_p2 t2_5 + -> Hash + -> Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(12 rows) + +-- Test case to verify proper handling of subqueries in a partitioned delete. +-- The weird-looking lateral join is just there to force creation of a +-- nestloop parameter within the subquery, which exposes the problem if the +-- planner fails to make multiple copies of the subquery as appropriate. +EXPLAIN (COSTS OFF) +DELETE FROM prt1_l +WHERE EXISTS ( + SELECT 1 + FROM int4_tbl, + LATERAL (SELECT int4_tbl.f1 FROM int8_tbl LIMIT 2) ss + WHERE prt1_l.c IS NULL); + QUERY PLAN +---------------------------------------------------------------- + Delete on prt1_l + Delete on prt1_l_p1 prt1_l_1 + Delete on prt1_l_p3_p1 prt1_l_2 + Delete on prt1_l_p3_p2 prt1_l_3 + -> Nested Loop Semi Join + -> Append + -> Seq Scan on prt1_l_p1 prt1_l_1 + Filter: (c IS NULL) + -> Seq Scan on prt1_l_p3_p1 prt1_l_2 + Filter: (c IS NULL) + -> Seq Scan on prt1_l_p3_p2 prt1_l_3 + Filter: (c IS NULL) + -> Materialize + -> Nested Loop + -> Seq Scan on int4_tbl + -> Materialize + -> Subquery Scan on ss + -> Limit + -> Seq Scan on int8_tbl + Optimizer: Postgres query optimizer +(20 rows) + +-- +-- negative testcases +-- +CREATE TABLE prt1_n (a int, b int, c varchar) PARTITION BY RANGE(c); +CREATE TABLE prt1_n_p1 PARTITION OF prt1_n FOR VALUES FROM ('0000') TO ('0250'); +CREATE TABLE prt1_n_p2 PARTITION OF prt1_n FOR VALUES FROM ('0250') TO ('0500'); +INSERT INTO prt1_n SELECT i, i, to_char(i, 'FM0000') FROM generate_series(0, 499, 2) i; +ANALYZE prt1_n; +CREATE TABLE prt2_n (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE prt2_n_p1 PARTITION OF prt2_n FOR VALUES IN ('0000', '0003', '0004', '0010', '0006', '0007'); +CREATE TABLE prt2_n_p2 PARTITION OF prt2_n FOR VALUES IN ('0001', '0005', '0002', '0009', '0008', '0011'); +INSERT INTO prt2_n SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE prt2_n; +CREATE TABLE prt3_n (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE prt3_n_p1 PARTITION OF prt3_n FOR VALUES IN ('0000', '0004', '0006', '0007'); +CREATE TABLE prt3_n_p2 PARTITION OF prt3_n FOR VALUES IN ('0001', '0002', '0008', '0010'); +CREATE TABLE prt3_n_p3 PARTITION OF prt3_n FOR VALUES IN ('0003', '0005', '0009', '0011'); +INSERT INTO prt2_n SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE prt3_n; +CREATE TABLE prt4_n (a int, b int, c text) PARTITION BY RANGE(a); +CREATE TABLE prt4_n_p1 PARTITION OF prt4_n FOR VALUES FROM (0) TO (300); +CREATE TABLE prt4_n_p2 PARTITION OF prt4_n FOR VALUES FROM (300) TO (500); +CREATE TABLE prt4_n_p3 PARTITION OF prt4_n FOR VALUES FROM (500) TO (600); +INSERT INTO prt4_n SELECT i, i, to_char(i, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE prt4_n; +-- partitionwise join can not be applied if the partition ranges differ +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt4_n t2 WHERE t1.a = t2.a; + QUERY PLAN +---------------------------------------------- + Hash Join + Hash Cond: (t1.a = t2.a) + -> Append + -> Seq Scan on prt1_p1 t1_1 + -> Seq Scan on prt1_p2 t1_2 + -> Seq Scan on prt1_p3 t1_3 + -> Hash + -> Append + -> Seq Scan on prt4_n_p1 t2_1 + -> Seq Scan on prt4_n_p2 t2_2 + -> Seq Scan on prt4_n_p3 t2_3 + Optimizer: Postgres query optimizer +(12 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt4_n t2, prt2 t3 WHERE t1.a = t2.a and t1.a = t3.b; + QUERY PLAN +-------------------------------------------------------- + Hash Join + Hash Cond: (t2.a = t1.a) + -> Append + -> Seq Scan on prt4_n_p1 t2_1 + -> Seq Scan on prt4_n_p2 t2_2 + -> Seq Scan on prt4_n_p3 t2_3 + -> Hash + -> Append + -> Hash Join + Hash Cond: (t1_1.a = t3_1.b) + -> Seq Scan on prt1_p1 t1_1 + -> Hash + -> Seq Scan on prt2_p1 t3_1 + -> Hash Join + Hash Cond: (t1_2.a = t3_2.b) + -> Seq Scan on prt1_p2 t1_2 + -> Hash + -> Seq Scan on prt2_p2 t3_2 + -> Hash Join + Hash Cond: (t1_3.a = t3_3.b) + -> Seq Scan on prt1_p3 t1_3 + -> Hash + -> Seq Scan on prt2_p3 t3_3 + Optimizer: Postgres query optimizer +(24 rows) + +-- partitionwise join can not be applied if there are no equi-join conditions +-- between partition keys +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1 LEFT JOIN prt2 t2 ON (t1.a < t2.b); + QUERY PLAN +--------------------------------------------------------- + Nested Loop Left Join + -> Append + -> Seq Scan on prt1_p1 t1_1 + -> Seq Scan on prt1_p2 t1_2 + -> Seq Scan on prt1_p3 t1_3 + -> Append + -> Index Scan using iprt2_p1_b on prt2_p1 t2_1 + Index Cond: (b > t1.a) + -> Index Scan using iprt2_p2_b on prt2_p2 t2_2 + Index Cond: (b > t1.a) + -> Index Scan using iprt2_p3_b on prt2_p3 t2_3 + Index Cond: (b > t1.a) + Optimizer: Postgres query optimizer +(13 rows) + +-- equi-join with join condition on partial keys does not qualify for +-- partitionwise join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_m t1, prt2_m t2 WHERE t1.a = (t2.b + t2.a)/2; + QUERY PLAN +---------------------------------------------- + Hash Join + Hash Cond: (t1.a = ((t2.b + t2.a) / 2)) + -> Append + -> Seq Scan on prt1_m_p1 t1_1 + -> Seq Scan on prt1_m_p2 t1_2 + -> Seq Scan on prt1_m_p3 t1_3 + -> Hash + -> Append + -> Seq Scan on prt2_m_p1 t2_1 + -> Seq Scan on prt2_m_p2 t2_2 + -> Seq Scan on prt2_m_p3 t2_3 + Optimizer: Postgres query optimizer +(12 rows) + +-- equi-join between out-of-order partition key columns does not qualify for +-- partitionwise join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_m t1 LEFT JOIN prt2_m t2 ON t1.a = t2.b; + QUERY PLAN +---------------------------------------------- + Hash Left Join + Hash Cond: (t1.a = t2.b) + -> Append + -> Seq Scan on prt1_m_p1 t1_1 + -> Seq Scan on prt1_m_p2 t1_2 + -> Seq Scan on prt1_m_p3 t1_3 + -> Hash + -> Append + -> Seq Scan on prt2_m_p1 t2_1 + -> Seq Scan on prt2_m_p2 t2_2 + -> Seq Scan on prt2_m_p3 t2_3 + Optimizer: Postgres query optimizer +(12 rows) + +-- equi-join between non-key columns does not qualify for partitionwise join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_m t1 LEFT JOIN prt2_m t2 ON t1.c = t2.c; + QUERY PLAN +---------------------------------------------- + Hash Left Join + Hash Cond: (t1.c = t2.c) + -> Append + -> Seq Scan on prt1_m_p1 t1_1 + -> Seq Scan on prt1_m_p2 t1_2 + -> Seq Scan on prt1_m_p3 t1_3 + -> Hash + -> Append + -> Seq Scan on prt2_m_p1 t2_1 + -> Seq Scan on prt2_m_p2 t2_2 + -> Seq Scan on prt2_m_p3 t2_3 + Optimizer: Postgres query optimizer +(12 rows) + +-- partitionwise join can not be applied for a join between list and range +-- partitioned tables +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_n t1 LEFT JOIN prt2_n t2 ON (t1.c = t2.c); + QUERY PLAN +---------------------------------------------- + Hash Right Join + Hash Cond: (t2.c = (t1.c)::text) + -> Append + -> Seq Scan on prt2_n_p1 t2_1 + -> Seq Scan on prt2_n_p2 t2_2 + -> Hash + -> Append + -> Seq Scan on prt1_n_p1 t1_1 + -> Seq Scan on prt1_n_p2 t1_2 + Optimizer: Postgres query optimizer +(10 rows) + +-- partitionwise join can not be applied between tables with different +-- partition lists +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_n t1 JOIN prt2_n t2 ON (t1.c = t2.c) JOIN plt1 t3 ON (t1.c = t3.c); + QUERY PLAN +---------------------------------------------------- + Hash Join + Hash Cond: ((t1.c)::text = t2.c) + -> Hash Join + Hash Cond: (t3.c = (t1.c)::text) + -> Append + -> Seq Scan on plt1_p1 t3_1 + -> Seq Scan on plt1_p2 t3_2 + -> Seq Scan on plt1_p3 t3_3 + -> Hash + -> Append + -> Seq Scan on prt1_n_p1 t1_1 + -> Seq Scan on prt1_n_p2 t1_2 + -> Hash + -> Append + -> Seq Scan on prt2_n_p1 t2_1 + -> Seq Scan on prt2_n_p2 t2_2 + Optimizer: Postgres query optimizer +(17 rows) + +-- partitionwise join can not be applied for a join between key column and +-- non-key column +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_n t1 FULL JOIN prt1 t2 ON (t1.c = t2.c); + QUERY PLAN +---------------------------------------------- + Hash Full Join + Hash Cond: ((t2.c)::text = (t1.c)::text) + -> Append + -> Seq Scan on prt1_p1 t2_1 + -> Seq Scan on prt1_p2 t2_2 + -> Seq Scan on prt1_p3 t2_3 + -> Hash + -> Append + -> Seq Scan on prt1_n_p1 t1_1 + -> Seq Scan on prt1_n_p2 t1_2 + Optimizer: Postgres query optimizer +(11 rows) + +-- +-- Test some other plan types in a partitionwise join (unfortunately, +-- we need larger tables to get the planner to choose these plan types) +-- +create temp table prtx1 (a integer, b integer, c integer) + partition by range (a); +create temp table prtx1_1 partition of prtx1 for values from (1) to (11); +create temp table prtx1_2 partition of prtx1 for values from (11) to (21); +create temp table prtx1_3 partition of prtx1 for values from (21) to (31); +create temp table prtx2 (a integer, b integer, c integer) + partition by range (a); +create temp table prtx2_1 partition of prtx2 for values from (1) to (11); +create temp table prtx2_2 partition of prtx2 for values from (11) to (21); +create temp table prtx2_3 partition of prtx2 for values from (21) to (31); +insert into prtx1 select 1 + i%30, i, i + from generate_series(1,1000) i; +insert into prtx2 select 1 + i%30, i, i + from generate_series(1,500) i, generate_series(1,10) j; +create index on prtx2 (b); +create index on prtx2 (c); +analyze prtx1; +analyze prtx2; +explain (costs off) +select * from prtx1 +where not exists (select 1 from prtx2 + where prtx2.a=prtx1.a and prtx2.b=prtx1.b and prtx2.c=123) + and a<20 and c=120; + QUERY PLAN +-------------------------------------------------------------------------- + Append + -> Hash Anti Join + Hash Cond: ((prtx1_1.a = prtx2_1.a) AND (prtx1_1.b = prtx2_1.b)) + -> Seq Scan on prtx1_1 + Filter: ((a < 20) AND (c = 120)) + -> Hash + -> Bitmap Heap Scan on prtx2_1 + Recheck Cond: (c = 123) + -> Bitmap Index Scan on prtx2_1_c_idx + Index Cond: (c = 123) + -> Hash Anti Join + Hash Cond: ((prtx1_2.a = prtx2_2.a) AND (prtx1_2.b = prtx2_2.b)) + -> Seq Scan on prtx1_2 + Filter: ((a < 20) AND (c = 120)) + -> Hash + -> Bitmap Heap Scan on prtx2_2 + Recheck Cond: (c = 123) + -> Bitmap Index Scan on prtx2_2_c_idx + Index Cond: (c = 123) + Optimizer: Postgres query optimizer +(20 rows) + +select * from prtx1 +where not exists (select 1 from prtx2 + where prtx2.a=prtx1.a and prtx2.b=prtx1.b and prtx2.c=123) + and a<20 and c=120; + a | b | c +---+-----+----- + 1 | 120 | 120 +(1 row) + +explain (costs off) +select * from prtx1 +where not exists (select 1 from prtx2 + where prtx2.a=prtx1.a and (prtx2.b=prtx1.b+1 or prtx2.c=99)) + and a<20 and c=91; + QUERY PLAN +-------------------------------------------------------------------------- + Append + -> Hash Anti Join + Hash Cond: (prtx1_1.a = prtx2_1.a) + Join Filter: ((prtx2_1.b = (prtx1_1.b + 1)) OR (prtx2_1.c = 99)) + -> Seq Scan on prtx1_1 + Filter: ((a < 20) AND (c = 91)) + -> Hash + -> Seq Scan on prtx2_1 + -> Hash Anti Join + Hash Cond: (prtx1_2.a = prtx2_2.a) + Join Filter: ((prtx2_2.b = (prtx1_2.b + 1)) OR (prtx2_2.c = 99)) + -> Seq Scan on prtx1_2 + Filter: ((a < 20) AND (c = 91)) + -> Hash + -> Seq Scan on prtx2_2 + Optimizer: Postgres query optimizer +(16 rows) + +select * from prtx1 +where not exists (select 1 from prtx2 + where prtx2.a=prtx1.a and (prtx2.b=prtx1.b+1 or prtx2.c=99)) + and a<20 and c=91; + a | b | c +---+----+---- + 2 | 91 | 91 +(1 row) + +-- +-- Test advanced partition-matching algorithm for partitioned join +-- +-- Tests for range-partitioned tables +CREATE TABLE prt1_adv (a int, b int, c varchar) PARTITION BY RANGE (a); +CREATE TABLE prt1_adv_p1 PARTITION OF prt1_adv FOR VALUES FROM (100) TO (200); +CREATE TABLE prt1_adv_p2 PARTITION OF prt1_adv FOR VALUES FROM (200) TO (300); +CREATE TABLE prt1_adv_p3 PARTITION OF prt1_adv FOR VALUES FROM (300) TO (400); +CREATE INDEX prt1_adv_a_idx ON prt1_adv (a); +INSERT INTO prt1_adv SELECT i, i % 25, to_char(i, 'FM0000') FROM generate_series(100, 399) i; +ANALYZE prt1_adv; +CREATE TABLE prt2_adv (a int, b int, c varchar) PARTITION BY RANGE (b); +CREATE TABLE prt2_adv_p1 PARTITION OF prt2_adv FOR VALUES FROM (100) TO (150); +CREATE TABLE prt2_adv_p2 PARTITION OF prt2_adv FOR VALUES FROM (200) TO (300); +CREATE TABLE prt2_adv_p3 PARTITION OF prt2_adv FOR VALUES FROM (350) TO (500); +CREATE INDEX prt2_adv_b_idx ON prt2_adv (b); +INSERT INTO prt2_adv_p1 SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(100, 149) i; +INSERT INTO prt2_adv_p2 SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(200, 299) i; +INSERT INTO prt2_adv_p3 SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(350, 499) i; +ANALYZE prt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 100 | 0100 | 100 | 0100 + 125 | 0125 | 125 | 0125 + 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 + 350 | 0350 | 350 | 0350 + 375 | 0375 | 375 | 0375 +(8 rows) + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Append + -> Hash Semi Join + Hash Cond: (t1_1.a = t2_1.b) + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash Semi Join + Hash Cond: (t1_2.a = t2_2.b) + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash Semi Join + Hash Cond: (t1_3.a = t2_3.b) + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + a | b | c +-----+---+------ + 100 | 0 | 0100 + 125 | 0 | 0125 + 200 | 0 | 0200 + 225 | 0 | 0225 + 250 | 0 | 0250 + 275 | 0 | 0275 + 350 | 0 | 0350 + 375 | 0 | 0375 +(8 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a, t2.b + -> Append + -> Hash Right Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 100 | 0100 | 100 | 0100 + 125 | 0125 | 125 | 0125 + 150 | 0150 | | + 175 | 0175 | | + 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 + 300 | 0300 | | + 325 | 0325 | | + 350 | 0350 | 350 | 0350 + 375 | 0375 | 375 | 0375 +(12 rows) + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Append + -> Hash Anti Join + Hash Cond: (t1_1.a = t2_1.b) + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash Anti Join + Hash Cond: (t1_2.a = t2_2.b) + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash Anti Join + Hash Cond: (t1_3.a = t2_3.b) + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + a | b | c +-----+---+------ + 150 | 0 | 0150 + 175 | 0 | 0175 + 300 | 0 | 0300 + 325 | 0 | 0325 +(4 rows) + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 175 phv, * FROM prt1_adv WHERE prt1_adv.b = 0) t1 FULL JOIN (SELECT 425 phv, * FROM prt2_adv WHERE prt2_adv.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + QUERY PLAN +-------------------------------------------------------------------------- + Sort + Sort Key: prt1_adv.a, prt2_adv.b + -> Append + -> Hash Full Join + Hash Cond: (prt1_adv_1.a = prt2_adv_1.b) + Filter: (((175) = prt1_adv_1.a) OR ((425) = prt2_adv_1.b)) + -> Seq Scan on prt1_adv_p1 prt1_adv_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p1 prt2_adv_1 + Filter: (a = 0) + -> Hash Full Join + Hash Cond: (prt1_adv_2.a = prt2_adv_2.b) + Filter: (((175) = prt1_adv_2.a) OR ((425) = prt2_adv_2.b)) + -> Seq Scan on prt1_adv_p2 prt1_adv_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p2 prt2_adv_2 + Filter: (a = 0) + -> Hash Full Join + Hash Cond: (prt2_adv_3.b = prt1_adv_3.a) + Filter: (((175) = prt1_adv_3.a) OR ((425) = prt2_adv_3.b)) + -> Seq Scan on prt2_adv_p3 prt2_adv_3 + Filter: (a = 0) + -> Hash + -> Seq Scan on prt1_adv_p3 prt1_adv_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(28 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 175 phv, * FROM prt1_adv WHERE prt1_adv.b = 0) t1 FULL JOIN (SELECT 425 phv, * FROM prt2_adv WHERE prt2_adv.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 175 | 0175 | | + | | 425 | 0425 +(2 rows) + +-- Test cases where one side has an extra partition +CREATE TABLE prt2_adv_extra PARTITION OF prt2_adv FOR VALUES FROM (500) TO (MAXVALUE); +INSERT INTO prt2_adv SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(500, 599) i; +ANALYZE prt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 100 | 0100 | 100 | 0100 + 125 | 0125 | 125 | 0125 + 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 + 350 | 0350 | 350 | 0350 + 375 | 0375 | 375 | 0375 +(8 rows) + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Append + -> Hash Semi Join + Hash Cond: (t1_1.a = t2_1.b) + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash Semi Join + Hash Cond: (t1_2.a = t2_2.b) + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash Semi Join + Hash Cond: (t1_3.a = t2_3.b) + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + a | b | c +-----+---+------ + 100 | 0 | 0100 + 125 | 0 | 0125 + 200 | 0 | 0200 + 225 | 0 | 0225 + 250 | 0 | 0250 + 275 | 0 | 0275 + 350 | 0 | 0350 + 375 | 0 | 0375 +(8 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a, t2.b + -> Append + -> Hash Right Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: (t2_3.b = t1_3.a) + -> Seq Scan on prt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 100 | 0100 | 100 | 0100 + 125 | 0125 | 125 | 0125 + 150 | 0150 | | + 175 | 0175 | | + 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 + 300 | 0300 | | + 325 | 0325 | | + 350 | 0350 | 350 | 0350 + 375 | 0375 | 375 | 0375 +(12 rows) + +-- left join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.b, t1.c, t2.a, t2.c FROM prt2_adv t1 LEFT JOIN prt1_adv t2 ON (t1.b = t2.a) WHERE t1.a = 0 ORDER BY t1.b, t2.a; + QUERY PLAN +--------------------------------------------------------- + Sort + Sort Key: t1.b, t2.a + -> Hash Right Join + Hash Cond: (t2.a = t1.b) + -> Append + -> Seq Scan on prt1_adv_p1 t2_1 + -> Seq Scan on prt1_adv_p2 t2_2 + -> Seq Scan on prt1_adv_p3 t2_3 + -> Hash + -> Append + -> Seq Scan on prt2_adv_p1 t1_1 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p2 t1_2 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p3 t1_3 + Filter: (a = 0) + -> Seq Scan on prt2_adv_extra t1_4 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(19 rows) + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Append + -> Hash Anti Join + Hash Cond: (t1_1.a = t2_1.b) + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash Anti Join + Hash Cond: (t1_2.a = t2_2.b) + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash Anti Join + Hash Cond: (t1_3.a = t2_3.b) + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + -> Hash + -> Seq Scan on prt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + a | b | c +-----+---+------ + 150 | 0 | 0150 + 175 | 0 | 0175 + 300 | 0 | 0300 + 325 | 0 | 0325 +(4 rows) + +-- anti join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt2_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt1_adv t2 WHERE t1.b = t2.a) AND t1.a = 0 ORDER BY t1.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.b + -> Hash Anti Join + Hash Cond: (t1.b = t2.a) + -> Append + -> Seq Scan on prt2_adv_p1 t1_1 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p2 t1_2 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p3 t1_3 + Filter: (a = 0) + -> Seq Scan on prt2_adv_extra t1_4 + Filter: (a = 0) + -> Hash + -> Append + -> Seq Scan on prt1_adv_p1 t2_1 + -> Seq Scan on prt1_adv_p2 t2_2 + -> Seq Scan on prt1_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(19 rows) + +-- full join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 175 phv, * FROM prt1_adv WHERE prt1_adv.b = 0) t1 FULL JOIN (SELECT 425 phv, * FROM prt2_adv WHERE prt2_adv.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + QUERY PLAN +---------------------------------------------------------------- + Sort + Sort Key: prt1_adv.a, prt2_adv.b + -> Hash Full Join + Hash Cond: (prt2_adv.b = prt1_adv.a) + Filter: (((175) = prt1_adv.a) OR ((425) = prt2_adv.b)) + -> Append + -> Seq Scan on prt2_adv_p1 prt2_adv_1 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p2 prt2_adv_2 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p3 prt2_adv_3 + Filter: (a = 0) + -> Seq Scan on prt2_adv_extra prt2_adv_4 + Filter: (a = 0) + -> Hash + -> Append + -> Seq Scan on prt1_adv_p1 prt1_adv_1 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p2 prt1_adv_2 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p3 prt1_adv_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(23 rows) + +-- 3-way join where not every pair of relations can do partitioned join +EXPLAIN (COSTS OFF) +SELECT t1.b, t1.c, t2.a, t2.c, t3.a, t3.c FROM prt2_adv t1 LEFT JOIN prt1_adv t2 ON (t1.b = t2.a) INNER JOIN prt1_adv t3 ON (t1.b = t3.a) WHERE t1.a = 0 ORDER BY t1.b, t2.a, t3.a; + QUERY PLAN +------------------------------------------------------------------ + Sort + Sort Key: t1.b, t2.a + -> Append + -> Hash Right Join + Hash Cond: (t2_1.a = t1_1.b) + -> Seq Scan on prt1_adv_p1 t2_1 + -> Hash + -> Hash Join + Hash Cond: (t3_1.a = t1_1.b) + -> Seq Scan on prt1_adv_p1 t3_1 + -> Hash + -> Seq Scan on prt2_adv_p1 t1_1 + Filter: (a = 0) + -> Hash Right Join + Hash Cond: (t2_2.a = t1_2.b) + -> Seq Scan on prt1_adv_p2 t2_2 + -> Hash + -> Hash Join + Hash Cond: (t3_2.a = t1_2.b) + -> Seq Scan on prt1_adv_p2 t3_2 + -> Hash + -> Seq Scan on prt2_adv_p2 t1_2 + Filter: (a = 0) + -> Hash Right Join + Hash Cond: (t2_3.a = t1_3.b) + -> Seq Scan on prt1_adv_p3 t2_3 + -> Hash + -> Hash Join + Hash Cond: (t3_3.a = t1_3.b) + -> Seq Scan on prt1_adv_p3 t3_3 + -> Hash + -> Seq Scan on prt2_adv_p3 t1_3 + Filter: (a = 0) + Optimizer: Postgres query optimizer +(34 rows) + +SELECT t1.b, t1.c, t2.a, t2.c, t3.a, t3.c FROM prt2_adv t1 LEFT JOIN prt1_adv t2 ON (t1.b = t2.a) INNER JOIN prt1_adv t3 ON (t1.b = t3.a) WHERE t1.a = 0 ORDER BY t1.b, t2.a, t3.a; + b | c | a | c | a | c +-----+------+-----+------+-----+------ + 100 | 0100 | 100 | 0100 | 100 | 0100 + 125 | 0125 | 125 | 0125 | 125 | 0125 + 200 | 0200 | 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 | 275 | 0275 + 350 | 0350 | 350 | 0350 | 350 | 0350 + 375 | 0375 | 375 | 0375 | 375 | 0375 +(8 rows) + +DROP TABLE prt2_adv_extra; +-- Test cases where a partition on one side matches multiple partitions on +-- the other side; we currently can't do partitioned join in such cases +ALTER TABLE prt2_adv DETACH PARTITION prt2_adv_p3; +-- Split prt2_adv_p3 into two partitions so that prt1_adv_p3 matches both +CREATE TABLE prt2_adv_p3_1 PARTITION OF prt2_adv FOR VALUES FROM (350) TO (375); +CREATE TABLE prt2_adv_p3_2 PARTITION OF prt2_adv FOR VALUES FROM (375) TO (500); +INSERT INTO prt2_adv SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(350, 499) i; +ANALYZE prt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Join + Hash Cond: (t2.b = t1.a) + -> Append + -> Seq Scan on prt2_adv_p1 t2_1 + -> Seq Scan on prt2_adv_p2 t2_2 + -> Seq Scan on prt2_adv_p3_1 t2_3 + -> Seq Scan on prt2_adv_p3_2 t2_4 + -> Hash + -> Append + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(18 rows) + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Semi Join + Hash Cond: (t1.a = t2.b) + -> Append + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + -> Hash + -> Append + -> Seq Scan on prt2_adv_p1 t2_1 + -> Seq Scan on prt2_adv_p2 t2_2 + -> Seq Scan on prt2_adv_p3_1 t2_3 + -> Seq Scan on prt2_adv_p3_2 t2_4 + Optimizer: Postgres query optimizer +(18 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a, t2.b + -> Hash Right Join + Hash Cond: (t2.b = t1.a) + -> Append + -> Seq Scan on prt2_adv_p1 t2_1 + -> Seq Scan on prt2_adv_p2 t2_2 + -> Seq Scan on prt2_adv_p3_1 t2_3 + -> Seq Scan on prt2_adv_p3_2 t2_4 + -> Hash + -> Append + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(18 rows) + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Anti Join + Hash Cond: (t1.a = t2.b) + -> Append + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p3 t1_3 + Filter: (b = 0) + -> Hash + -> Append + -> Seq Scan on prt2_adv_p1 t2_1 + -> Seq Scan on prt2_adv_p2 t2_2 + -> Seq Scan on prt2_adv_p3_1 t2_3 + -> Seq Scan on prt2_adv_p3_2 t2_4 + Optimizer: Postgres query optimizer +(18 rows) + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 175 phv, * FROM prt1_adv WHERE prt1_adv.b = 0) t1 FULL JOIN (SELECT 425 phv, * FROM prt2_adv WHERE prt2_adv.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + QUERY PLAN +---------------------------------------------------------------- + Sort + Sort Key: prt1_adv.a, prt2_adv.b + -> Hash Full Join + Hash Cond: (prt2_adv.b = prt1_adv.a) + Filter: (((175) = prt1_adv.a) OR ((425) = prt2_adv.b)) + -> Append + -> Seq Scan on prt2_adv_p1 prt2_adv_1 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p2 prt2_adv_2 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p3_1 prt2_adv_3 + Filter: (a = 0) + -> Seq Scan on prt2_adv_p3_2 prt2_adv_4 + Filter: (a = 0) + -> Hash + -> Append + -> Seq Scan on prt1_adv_p1 prt1_adv_1 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p2 prt1_adv_2 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p3 prt1_adv_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(23 rows) + +DROP TABLE prt2_adv_p3_1; +DROP TABLE prt2_adv_p3_2; +ANALYZE prt2_adv; +-- Test default partitions +ALTER TABLE prt1_adv DETACH PARTITION prt1_adv_p1; +-- Change prt1_adv_p1 to the default partition +ALTER TABLE prt1_adv ATTACH PARTITION prt1_adv_p1 DEFAULT; +ALTER TABLE prt1_adv DETACH PARTITION prt1_adv_p3; +ANALYZE prt1_adv; +-- We can do partitioned join even if only one of relations has the default +-- partition +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (t2_1.b = t1_2.a) + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on prt1_adv_p1 t1_2 + Filter: (b = 0) + -> Hash Join + Hash Cond: (t2_2.b = t1_1.a) + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on prt1_adv_p2 t1_1 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(16 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 100 | 0100 | 100 | 0100 + 125 | 0125 | 125 | 0125 + 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 +(6 rows) + +-- Restore prt1_adv_p3 +ALTER TABLE prt1_adv ATTACH PARTITION prt1_adv_p3 FOR VALUES FROM (300) TO (400); +ANALYZE prt1_adv; +-- Restore prt2_adv_p3 +ALTER TABLE prt2_adv ATTACH PARTITION prt2_adv_p3 FOR VALUES FROM (350) TO (500); +ANALYZE prt2_adv; +-- Partitioned join can't be applied because the default partition of prt1_adv +-- matches prt2_adv_p1 and prt2_adv_p3 +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Join + Hash Cond: (t2.b = t1.a) + -> Append + -> Seq Scan on prt2_adv_p1 t2_1 + -> Seq Scan on prt2_adv_p2 t2_2 + -> Seq Scan on prt2_adv_p3 t2_3 + -> Hash + -> Append + -> Seq Scan on prt1_adv_p2 t1_1 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p3 t1_2 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p1 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(17 rows) + +ALTER TABLE prt2_adv DETACH PARTITION prt2_adv_p3; +-- Change prt2_adv_p3 to the default partition +ALTER TABLE prt2_adv ATTACH PARTITION prt2_adv_p3 DEFAULT; +ANALYZE prt2_adv; +-- Partitioned join can't be applied because the default partition of prt1_adv +-- matches prt2_adv_p1 and prt2_adv_p3 +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Join + Hash Cond: (t2.b = t1.a) + -> Append + -> Seq Scan on prt2_adv_p1 t2_1 + -> Seq Scan on prt2_adv_p2 t2_2 + -> Seq Scan on prt2_adv_p3 t2_3 + -> Hash + -> Append + -> Seq Scan on prt1_adv_p2 t1_1 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p3 t1_2 + Filter: (b = 0) + -> Seq Scan on prt1_adv_p1 t1_3 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(17 rows) + +DROP TABLE prt1_adv_p3; +ANALYZE prt1_adv; +DROP TABLE prt2_adv_p3; +ANALYZE prt2_adv; +CREATE TABLE prt3_adv (a int, b int, c varchar) PARTITION BY RANGE (a); +CREATE TABLE prt3_adv_p1 PARTITION OF prt3_adv FOR VALUES FROM (200) TO (300); +CREATE TABLE prt3_adv_p2 PARTITION OF prt3_adv FOR VALUES FROM (300) TO (400); +CREATE INDEX prt3_adv_a_idx ON prt3_adv (a); +INSERT INTO prt3_adv SELECT i, i % 25, to_char(i, 'FM0000') FROM generate_series(200, 399) i; +ANALYZE prt3_adv; +-- 3-way join to test the default partition of a join relation +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a, t3.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) LEFT JOIN prt3_adv t3 ON (t1.a = t3.a) WHERE t1.b = 0 ORDER BY t1.a, t2.b, t3.a; + QUERY PLAN +------------------------------------------------------------------ + Sort + Sort Key: t1.a, t2.b, t3.a + -> Append + -> Hash Right Join + Hash Cond: (t3_1.a = t1_1.a) + -> Seq Scan on prt3_adv_p1 t3_1 + -> Hash + -> Hash Right Join + Hash Cond: (t2_2.b = t1_1.a) + -> Seq Scan on prt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on prt1_adv_p2 t1_1 + Filter: (b = 0) + -> Hash Right Join + Hash Cond: (t3_2.a = t1_2.a) + -> Seq Scan on prt3_adv_p2 t3_2 + -> Hash + -> Hash Right Join + Hash Cond: (t2_1.b = t1_2.a) + -> Seq Scan on prt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on prt1_adv_p1 t1_2 + Filter: (b = 0) + Optimizer: Postgres query optimizer +(24 rows) + +SELECT t1.a, t1.c, t2.b, t2.c, t3.a, t3.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) LEFT JOIN prt3_adv t3 ON (t1.a = t3.a) WHERE t1.b = 0 ORDER BY t1.a, t2.b, t3.a; + a | c | b | c | a | c +-----+------+-----+------+-----+------ + 100 | 0100 | 100 | 0100 | | + 125 | 0125 | 125 | 0125 | | + 150 | 0150 | | | | + 175 | 0175 | | | | + 200 | 0200 | 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 | 275 | 0275 +(8 rows) + +DROP TABLE prt1_adv; +DROP TABLE prt2_adv; +DROP TABLE prt3_adv; +-- Test interaction of partitioned join with partition pruning +CREATE TABLE prt1_adv (a int, b int, c varchar) PARTITION BY RANGE (a); +CREATE TABLE prt1_adv_p1 PARTITION OF prt1_adv FOR VALUES FROM (100) TO (200); +CREATE TABLE prt1_adv_p2 PARTITION OF prt1_adv FOR VALUES FROM (200) TO (300); +CREATE TABLE prt1_adv_p3 PARTITION OF prt1_adv FOR VALUES FROM (300) TO (400); +CREATE INDEX prt1_adv_a_idx ON prt1_adv (a); +INSERT INTO prt1_adv SELECT i, i % 25, to_char(i, 'FM0000') FROM generate_series(100, 399) i; +ANALYZE prt1_adv; +CREATE TABLE prt2_adv (a int, b int, c varchar) PARTITION BY RANGE (b); +CREATE TABLE prt2_adv_p1 PARTITION OF prt2_adv FOR VALUES FROM (100) TO (200); +CREATE TABLE prt2_adv_p2 PARTITION OF prt2_adv FOR VALUES FROM (200) TO (400); +CREATE INDEX prt2_adv_b_idx ON prt2_adv (b); +INSERT INTO prt2_adv SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(100, 399) i; +ANALYZE prt2_adv; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.a < 300 AND t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +----------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_adv_p1 t2_1 + Filter: (b < 300) + -> Hash + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: ((a < 300) AND (b = 0)) + -> Hash Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_adv_p2 t2_2 + Filter: (b < 300) + -> Hash + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: ((a < 300) AND (b = 0)) + Optimizer: Postgres query optimizer +(18 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.a < 300 AND t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 100 | 0100 | 100 | 0100 + 125 | 0125 | 125 | 0125 + 150 | 0150 | 150 | 0150 + 175 | 0175 | 175 | 0175 + 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 +(8 rows) + +DROP TABLE prt1_adv_p3; +CREATE TABLE prt1_adv_default PARTITION OF prt1_adv DEFAULT; +ANALYZE prt1_adv; +CREATE TABLE prt2_adv_default PARTITION OF prt2_adv DEFAULT; +ANALYZE prt2_adv; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.a >= 100 AND t1.a < 300 AND t1.b = 0 ORDER BY t1.a, t2.b; + QUERY PLAN +-------------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: (t2_1.b = t1_1.a) + -> Seq Scan on prt2_adv_p1 t2_1 + Filter: ((b >= 100) AND (b < 300)) + -> Hash + -> Seq Scan on prt1_adv_p1 t1_1 + Filter: ((a >= 100) AND (a < 300) AND (b = 0)) + -> Hash Join + Hash Cond: (t2_2.b = t1_2.a) + -> Seq Scan on prt2_adv_p2 t2_2 + Filter: ((b >= 100) AND (b < 300)) + -> Hash + -> Seq Scan on prt1_adv_p2 t1_2 + Filter: ((a >= 100) AND (a < 300) AND (b = 0)) + Optimizer: Postgres query optimizer +(18 rows) + +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.a >= 100 AND t1.a < 300 AND t1.b = 0 ORDER BY t1.a, t2.b; + a | c | b | c +-----+------+-----+------ + 100 | 0100 | 100 | 0100 + 125 | 0125 | 125 | 0125 + 150 | 0150 | 150 | 0150 + 175 | 0175 | 175 | 0175 + 200 | 0200 | 200 | 0200 + 225 | 0225 | 225 | 0225 + 250 | 0250 | 250 | 0250 + 275 | 0275 | 275 | 0275 +(8 rows) + +DROP TABLE prt1_adv; +DROP TABLE prt2_adv; +-- Tests for list-partitioned tables +CREATE TABLE plt1_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt1_adv_p1 PARTITION OF plt1_adv FOR VALUES IN ('0001', '0003'); +CREATE TABLE plt1_adv_p2 PARTITION OF plt1_adv FOR VALUES IN ('0004', '0006'); +CREATE TABLE plt1_adv_p3 PARTITION OF plt1_adv FOR VALUES IN ('0008', '0009'); +INSERT INTO plt1_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 3, 4, 6, 8, 9); +ANALYZE plt1_adv; +CREATE TABLE plt2_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt2_adv_p1 PARTITION OF plt2_adv FOR VALUES IN ('0002', '0003'); +CREATE TABLE plt2_adv_p2 PARTITION OF plt2_adv FOR VALUES IN ('0004', '0006'); +CREATE TABLE plt2_adv_p3 PARTITION OF plt2_adv FOR VALUES IN ('0007', '0009'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +ANALYZE plt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 9 | 0009 | 9 | 0009 +(4 rows) + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Semi Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Semi Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Semi Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.c = t2_3.c)) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + a | b | c +---+---+------ + 3 | 3 | 0003 + 4 | 4 | 0004 + 6 | 6 | 0006 + 9 | 9 | 0009 +(4 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Right Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 1 | 0001 | | + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 8 | 0008 | | + 9 | 0009 | 9 | 0009 +(6 rows) + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Anti Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Anti Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Anti Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.c = t2_3.c)) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + a | b | c +---+---+------ + 1 | 1 | 0001 + 8 | 8 | 0008 +(2 rows) + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + QUERY PLAN +----------------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.a + -> Append + -> Hash Full Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + Filter: ((COALESCE(t1_1.b, 0) < 10) AND (COALESCE(t2_1.b, 0) < 10)) + -> Seq Scan on plt1_adv_p1 t1_1 + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Full Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + Filter: ((COALESCE(t1_2.b, 0) < 10) AND (COALESCE(t2_2.b, 0) < 10)) + -> Seq Scan on plt1_adv_p2 t1_2 + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Full Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.c = t2_3.c)) + Filter: ((COALESCE(t1_3.b, 0) < 10) AND (COALESCE(t2_3.b, 0) < 10)) + -> Seq Scan on plt1_adv_p3 t1_3 + -> Hash + -> Seq Scan on plt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + a | c | a | c +---+------+---+------ + 1 | 0001 | | + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 8 | 0008 | | + 9 | 0009 | 9 | 0009 + | | 2 | 0002 + | | 7 | 0007 +(8 rows) + +-- Test cases where one side has an extra partition +CREATE TABLE plt2_adv_extra PARTITION OF plt2_adv FOR VALUES IN ('0000'); +INSERT INTO plt2_adv_extra VALUES (0, 0, '0000'); +ANALYZE plt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 9 | 0009 | 9 | 0009 +(4 rows) + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Semi Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Semi Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Semi Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.c = t2_3.c)) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + a | b | c +---+---+------ + 3 | 3 | 0003 + 4 | 4 | 0004 + 6 | 6 | 0006 + 9 | 9 | 0009 +(4 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Right Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 1 | 0001 | | + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 8 | 0008 | | + 9 | 0009 | 9 | 0009 +(6 rows) + +-- left join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt2_adv t1 LEFT JOIN plt1_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +--------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Right Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Append + -> Seq Scan on plt1_adv_p1 t2_1 + -> Seq Scan on plt1_adv_p2 t2_2 + -> Seq Scan on plt1_adv_p3 t2_3 + -> Hash + -> Append + -> Seq Scan on plt2_adv_extra t1_1 + Filter: (b < 10) + -> Seq Scan on plt2_adv_p1 t1_2 + Filter: (b < 10) + -> Seq Scan on plt2_adv_p2 t1_3 + Filter: (b < 10) + -> Seq Scan on plt2_adv_p3 t1_4 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(19 rows) + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Anti Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Anti Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Anti Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.c = t2_3.c)) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + a | b | c +---+---+------ + 1 | 1 | 0001 + 8 | 8 | 0008 +(2 rows) + +-- anti join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt2_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt1_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Anti Join + Hash Cond: ((t1.a = t2.a) AND (t1.c = t2.c)) + -> Append + -> Seq Scan on plt2_adv_extra t1_1 + Filter: (b < 10) + -> Seq Scan on plt2_adv_p1 t1_2 + Filter: (b < 10) + -> Seq Scan on plt2_adv_p2 t1_3 + Filter: (b < 10) + -> Seq Scan on plt2_adv_p3 t1_4 + Filter: (b < 10) + -> Hash + -> Append + -> Seq Scan on plt1_adv_p1 t2_1 + -> Seq Scan on plt1_adv_p2 t2_2 + -> Seq Scan on plt1_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(19 rows) + +-- full join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + QUERY PLAN +------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.a + -> Hash Full Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + Filter: ((COALESCE(t1.b, 0) < 10) AND (COALESCE(t2.b, 0) < 10)) + -> Append + -> Seq Scan on plt2_adv_extra t2_1 + -> Seq Scan on plt2_adv_p1 t2_2 + -> Seq Scan on plt2_adv_p2 t2_3 + -> Seq Scan on plt2_adv_p3 t2_4 + -> Hash + -> Append + -> Seq Scan on plt1_adv_p1 t1_1 + -> Seq Scan on plt1_adv_p2 t1_2 + -> Seq Scan on plt1_adv_p3 t1_3 + Optimizer: Postgres query optimizer +(16 rows) + +DROP TABLE plt2_adv_extra; +-- Test cases where a partition on one side matches multiple partitions on +-- the other side; we currently can't do partitioned join in such cases +ALTER TABLE plt2_adv DETACH PARTITION plt2_adv_p2; +-- Split plt2_adv_p2 into two partitions so that plt1_adv_p2 matches both +CREATE TABLE plt2_adv_p2_1 PARTITION OF plt2_adv FOR VALUES IN ('0004'); +CREATE TABLE plt2_adv_p2_2 PARTITION OF plt2_adv FOR VALUES IN ('0006'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (4, 6); +ANALYZE plt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2_1 t2_2 + -> Seq Scan on plt2_adv_p2_2 t2_3 + -> Seq Scan on plt2_adv_p3 t2_4 + -> Hash + -> Append + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(18 rows) + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Semi Join + Hash Cond: ((t1.a = t2.a) AND (t1.c = t2.c)) + -> Append + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2_1 t2_2 + -> Seq Scan on plt2_adv_p2_2 t2_3 + -> Seq Scan on plt2_adv_p3 t2_4 + Optimizer: Postgres query optimizer +(18 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Right Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2_1 t2_2 + -> Seq Scan on plt2_adv_p2_2 t2_3 + -> Seq Scan on plt2_adv_p3 t2_4 + -> Hash + -> Append + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(18 rows) + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Anti Join + Hash Cond: ((t1.a = t2.a) AND (t1.c = t2.c)) + -> Append + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2_1 t2_2 + -> Seq Scan on plt2_adv_p2_2 t2_3 + -> Seq Scan on plt2_adv_p3 t2_4 + Optimizer: Postgres query optimizer +(18 rows) + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + QUERY PLAN +------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.a + -> Hash Full Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + Filter: ((COALESCE(t1.b, 0) < 10) AND (COALESCE(t2.b, 0) < 10)) + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2_1 t2_2 + -> Seq Scan on plt2_adv_p2_2 t2_3 + -> Seq Scan on plt2_adv_p3 t2_4 + -> Hash + -> Append + -> Seq Scan on plt1_adv_p1 t1_1 + -> Seq Scan on plt1_adv_p2 t1_2 + -> Seq Scan on plt1_adv_p3 t1_3 + Optimizer: Postgres query optimizer +(16 rows) + +DROP TABLE plt2_adv_p2_1; +DROP TABLE plt2_adv_p2_2; +-- Restore plt2_adv_p2 +ALTER TABLE plt2_adv ATTACH PARTITION plt2_adv_p2 FOR VALUES IN ('0004', '0006'); +-- Test NULL partitions +ALTER TABLE plt1_adv DETACH PARTITION plt1_adv_p1; +-- Change plt1_adv_p1 to the NULL partition +CREATE TABLE plt1_adv_p1_null PARTITION OF plt1_adv FOR VALUES IN (NULL, '0001', '0003'); +INSERT INTO plt1_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 3); +INSERT INTO plt1_adv VALUES (-1, -1, NULL); +ANALYZE plt1_adv; +ALTER TABLE plt2_adv DETACH PARTITION plt2_adv_p3; +-- Change plt2_adv_p3 to the NULL partition +CREATE TABLE plt2_adv_p3_null PARTITION OF plt2_adv FOR VALUES IN (NULL, '0007', '0009'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (7, 9); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1_null t1_1 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3_null t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 9 | 0009 | 9 | 0009 +(4 rows) + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Semi Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + -> Seq Scan on plt1_adv_p1_null t1_1 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Semi Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Semi Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.c = t2_3.c)) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p3_null t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + a | b | c +---+---+------ + 3 | 3 | 0003 + 4 | 4 | 0004 + 6 | 6 | 0006 + 9 | 9 | 0009 +(4 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Right Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1_null t1_1 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3_null t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +----+------+---+------ + -1 | | | + 1 | 0001 | | + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 8 | 0008 | | + 9 | 0009 | 9 | 0009 +(7 rows) + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Anti Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + -> Seq Scan on plt1_adv_p1_null t1_1 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Anti Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Anti Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.c = t2_3.c)) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_p3_null t2_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + a | b | c +----+----+------ + -1 | -1 | + 1 | 1 | 0001 + 8 | 8 | 0008 +(3 rows) + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + QUERY PLAN +----------------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.a + -> Append + -> Hash Full Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + Filter: ((COALESCE(t1_1.b, 0) < 10) AND (COALESCE(t2_1.b, 0) < 10)) + -> Seq Scan on plt1_adv_p1_null t1_1 + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Full Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + Filter: ((COALESCE(t1_2.b, 0) < 10) AND (COALESCE(t2_2.b, 0) < 10)) + -> Seq Scan on plt1_adv_p2 t1_2 + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Full Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + Filter: ((COALESCE(t1_3.b, 0) < 10) AND (COALESCE(t2_3.b, 0) < 10)) + -> Seq Scan on plt2_adv_p3_null t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + a | c | a | c +----+------+----+------ + -1 | | | + 1 | 0001 | | + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 8 | 0008 | | + 9 | 0009 | 9 | 0009 + | | -1 | + | | 2 | 0002 + | | 7 | 0007 +(10 rows) + +DROP TABLE plt1_adv_p1_null; +-- Restore plt1_adv_p1 +ALTER TABLE plt1_adv ATTACH PARTITION plt1_adv_p1 FOR VALUES IN ('0001', '0003'); +-- Add to plt1_adv the extra NULL partition containing only NULL values as the +-- key values +CREATE TABLE plt1_adv_extra PARTITION OF plt1_adv FOR VALUES IN (NULL); +INSERT INTO plt1_adv VALUES (-1, -1, NULL); +ANALYZE plt1_adv; +DROP TABLE plt2_adv_p3_null; +-- Restore plt2_adv_p3 +ALTER TABLE plt2_adv ATTACH PARTITION plt2_adv_p3 FOR VALUES IN ('0007', '0009'); +ANALYZE plt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 9 | 0009 | 9 | 0009 +(4 rows) + +-- left join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +--------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Right Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2 t2_2 + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Append + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Seq Scan on plt1_adv_extra t1_4 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(19 rows) + +-- full join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + QUERY PLAN +------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.a + -> Hash Full Join + Hash Cond: ((t1.a = t2.a) AND (t1.c = t2.c)) + Filter: ((COALESCE(t1.b, 0) < 10) AND (COALESCE(t2.b, 0) < 10)) + -> Append + -> Seq Scan on plt1_adv_p1 t1_1 + -> Seq Scan on plt1_adv_p2 t1_2 + -> Seq Scan on plt1_adv_p3 t1_3 + -> Seq Scan on plt1_adv_extra t1_4 + -> Hash + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2 t2_2 + -> Seq Scan on plt2_adv_p3 t2_3 + Optimizer: Postgres query optimizer +(16 rows) + +-- Add to plt2_adv the extra NULL partition containing only NULL values as the +-- key values +CREATE TABLE plt2_adv_extra PARTITION OF plt2_adv FOR VALUES IN (NULL); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(22 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 9 | 0009 | 9 | 0009 +(4 rows) + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Right Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash Left Join + Hash Cond: ((t1_4.a = t2_4.a) AND (t1_4.c = t2_4.c)) + -> Seq Scan on plt1_adv_extra t1_4 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_extra t2_4 + Optimizer: Postgres query optimizer +(28 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +----+------+---+------ + -1 | | | + 1 | 0001 | | + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 8 | 0008 | | + 9 | 0009 | 9 | 0009 +(7 rows) + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + QUERY PLAN +----------------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t2.a + -> Append + -> Hash Full Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.c = t2_1.c)) + Filter: ((COALESCE(t1_1.b, 0) < 10) AND (COALESCE(t2_1.b, 0) < 10)) + -> Seq Scan on plt1_adv_p1 t1_1 + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash Full Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + Filter: ((COALESCE(t1_2.b, 0) < 10) AND (COALESCE(t2_2.b, 0) < 10)) + -> Seq Scan on plt1_adv_p2 t1_2 + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash Full Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.c = t2_3.c)) + Filter: ((COALESCE(t1_3.b, 0) < 10) AND (COALESCE(t2_3.b, 0) < 10)) + -> Seq Scan on plt1_adv_p3 t1_3 + -> Hash + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash Full Join + Hash Cond: ((t1_4.a = t2_4.a) AND (t1_4.c = t2_4.c)) + Filter: ((COALESCE(t1_4.b, 0) < 10) AND (COALESCE(t2_4.b, 0) < 10)) + -> Seq Scan on plt1_adv_extra t1_4 + -> Hash + -> Seq Scan on plt2_adv_extra t2_4 + Optimizer: Postgres query optimizer +(28 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + a | c | a | c +----+------+----+------ + -1 | | | + 1 | 0001 | | + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 + 8 | 0008 | | + 9 | 0009 | 9 | 0009 + | | -1 | + | | 2 | 0002 + | | 7 | 0007 +(10 rows) + +-- 3-way join to test the NULL partition of a join relation +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) LEFT JOIN plt1_adv t3 ON (t1.a = t3.a AND t1.c = t3.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Right Join + Hash Cond: ((t3_1.a = t1_1.a) AND (t3_1.c = t1_1.c)) + -> Seq Scan on plt1_adv_p1 t3_1 + -> Hash + -> Hash Right Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_1 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t3_2.a = t1_2.a) AND (t3_2.c = t1_2.c)) + -> Seq Scan on plt1_adv_p2 t3_2 + -> Hash + -> Hash Right Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_2 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t3_3.a = t1_3.a) AND (t3_3.c = t1_3.c)) + -> Seq Scan on plt1_adv_p3 t3_3 + -> Hash + -> Hash Right Join + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.c = t1_3.c)) + -> Seq Scan on plt2_adv_p3 t2_3 + -> Hash + -> Seq Scan on plt1_adv_p3 t1_3 + Filter: (b < 10) + -> Hash Left Join + Hash Cond: ((t1_4.a = t3_4.a) AND (t1_4.c = t3_4.c)) + -> Hash Left Join + Hash Cond: ((t1_4.a = t2_4.a) AND (t1_4.c = t2_4.c)) + -> Seq Scan on plt1_adv_extra t1_4 + Filter: (b < 10) + -> Hash + -> Seq Scan on plt2_adv_extra t2_4 + -> Hash + -> Seq Scan on plt1_adv_extra t3_4 + Optimizer: Postgres query optimizer +(44 rows) + +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) LEFT JOIN plt1_adv t3 ON (t1.a = t3.a AND t1.c = t3.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c | a | c +----+------+---+------+---+------ + -1 | | | | | + 1 | 0001 | | | 1 | 0001 + 3 | 0003 | 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 | 6 | 0006 + 8 | 0008 | | | 8 | 0008 + 9 | 0009 | 9 | 0009 | 9 | 0009 +(7 rows) + +DROP TABLE plt1_adv_extra; +DROP TABLE plt2_adv_extra; +-- Test default partitions +ALTER TABLE plt1_adv DETACH PARTITION plt1_adv_p1; +-- Change plt1_adv_p1 to the default partition +ALTER TABLE plt1_adv ATTACH PARTITION plt1_adv_p1 DEFAULT; +DROP TABLE plt1_adv_p3; +ANALYZE plt1_adv; +DROP TABLE plt2_adv_p3; +ANALYZE plt2_adv; +-- We can do partitioned join even if only one of relations has the default +-- partition +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_2.a) AND (t2_1.c = t1_2.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_2 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_2.a = t1_1.a) AND (t2_2.c = t1_1.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_1 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(16 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 +(3 rows) + +ALTER TABLE plt2_adv DETACH PARTITION plt2_adv_p2; +-- Change plt2_adv_p2 to contain '0005' in addition to '0004' and '0006' as +-- the key values +CREATE TABLE plt2_adv_p2_ext PARTITION OF plt2_adv FOR VALUES IN ('0004', '0005', '0006'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (4, 5, 6); +ANALYZE plt2_adv; +-- Partitioned join can't be applied because the default partition of plt1_adv +-- matches plt2_adv_p1 and plt2_adv_p2_ext +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2_ext t2_2 + -> Hash + -> Append + -> Seq Scan on plt1_adv_p2 t1_1 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p1 t1_2 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(14 rows) + +ALTER TABLE plt2_adv DETACH PARTITION plt2_adv_p2_ext; +-- Change plt2_adv_p2_ext to the default partition +ALTER TABLE plt2_adv ATTACH PARTITION plt2_adv_p2_ext DEFAULT; +ANALYZE plt2_adv; +-- Partitioned join can't be applied because the default partition of plt1_adv +-- matches plt2_adv_p1 and plt2_adv_p2_ext +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Append + -> Seq Scan on plt2_adv_p1 t2_1 + -> Seq Scan on plt2_adv_p2_ext t2_2 + -> Hash + -> Append + -> Seq Scan on plt1_adv_p2 t1_1 + Filter: (b < 10) + -> Seq Scan on plt1_adv_p1 t1_2 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(14 rows) + +DROP TABLE plt2_adv_p2_ext; +-- Restore plt2_adv_p2 +ALTER TABLE plt2_adv ATTACH PARTITION plt2_adv_p2 FOR VALUES IN ('0004', '0006'); +ANALYZE plt2_adv; +CREATE TABLE plt3_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt3_adv_p1 PARTITION OF plt3_adv FOR VALUES IN ('0004', '0006'); +CREATE TABLE plt3_adv_p2 PARTITION OF plt3_adv FOR VALUES IN ('0007', '0009'); +INSERT INTO plt3_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (4, 6, 7, 9); +ANALYZE plt3_adv; +-- 3-way join to test the default partition of a join relation +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) LEFT JOIN plt3_adv t3 ON (t1.a = t3.a AND t1.c = t3.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Right Join + Hash Cond: ((t3_1.a = t1_1.a) AND (t3_1.c = t1_1.c)) + -> Seq Scan on plt3_adv_p1 t3_1 + -> Hash + -> Hash Right Join + Hash Cond: ((t2_2.a = t1_1.a) AND (t2_2.c = t1_1.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_1 + Filter: (b < 10) + -> Hash Right Join + Hash Cond: ((t3_2.a = t1_2.a) AND (t3_2.c = t1_2.c)) + -> Seq Scan on plt3_adv_p2 t3_2 + -> Hash + -> Hash Right Join + Hash Cond: ((t2_1.a = t1_2.a) AND (t2_1.c = t1_2.c)) + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_2 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(24 rows) + +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) LEFT JOIN plt3_adv t3 ON (t1.a = t3.a AND t1.c = t3.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c | a | c +---+------+---+------+---+------ + 1 | 0001 | | | | + 3 | 0003 | 3 | 0003 | | + 4 | 0004 | 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 | 6 | 0006 +(4 rows) + +-- Test cases where one side has the default partition while the other side +-- has the NULL partition +DROP TABLE plt2_adv_p1; +-- Add the NULL partition to plt2_adv +CREATE TABLE plt2_adv_p1_null PARTITION OF plt2_adv FOR VALUES IN (NULL, '0001', '0003'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 3); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_2.a) AND (t2_1.c = t1_2.c)) + -> Seq Scan on plt2_adv_p1_null t2_1 + -> Hash + -> Seq Scan on plt1_adv_p1 t1_2 + Filter: (b < 10) + -> Hash Join + Hash Cond: ((t2_2.a = t1_1.a) AND (t2_2.c = t1_1.c)) + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1_1 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(16 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 1 | 0001 | 1 | 0001 + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 +(4 rows) + +DROP TABLE plt2_adv_p1_null; +-- Add the NULL partition that contains only NULL values as the key values +CREATE TABLE plt2_adv_p1_null PARTITION OF plt2_adv FOR VALUES IN (NULL); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + QUERY PLAN +------------------------------------------------------ + Sort + Sort Key: t1.a + -> Hash Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Seq Scan on plt2_adv_p2 t2 + -> Hash + -> Seq Scan on plt1_adv_p2 t1 + Filter: (b < 10) + Optimizer: Postgres query optimizer +(9 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 4 | 0004 | 4 | 0004 + 6 | 0006 | 6 | 0006 +(2 rows) + +DROP TABLE plt1_adv; +DROP TABLE plt2_adv; +DROP TABLE plt3_adv; +-- Test interaction of partitioned join with partition pruning +CREATE TABLE plt1_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt1_adv_p1 PARTITION OF plt1_adv FOR VALUES IN ('0001'); +CREATE TABLE plt1_adv_p2 PARTITION OF plt1_adv FOR VALUES IN ('0002'); +CREATE TABLE plt1_adv_p3 PARTITION OF plt1_adv FOR VALUES IN ('0003'); +CREATE TABLE plt1_adv_p4 PARTITION OF plt1_adv FOR VALUES IN (NULL, '0004', '0005'); +INSERT INTO plt1_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 2, 3, 4, 5); +INSERT INTO plt1_adv VALUES (-1, -1, NULL); +ANALYZE plt1_adv; +CREATE TABLE plt2_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt2_adv_p1 PARTITION OF plt2_adv FOR VALUES IN ('0001', '0002'); +CREATE TABLE plt2_adv_p2 PARTITION OF plt2_adv FOR VALUES IN (NULL); +CREATE TABLE plt2_adv_p3 PARTITION OF plt2_adv FOR VALUES IN ('0003'); +CREATE TABLE plt2_adv_p4 PARTITION OF plt2_adv FOR VALUES IN ('0004', '0005'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 2, 3, 4, 5); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IN ('0003', '0004', '0005') AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +----------------------------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p3 t2_1 + Filter: (c = ANY ('{0003,0004,0005}'::text[])) + -> Hash + -> Seq Scan on plt1_adv_p3 t1_1 + Filter: ((b < 10) AND (c = ANY ('{0003,0004,0005}'::text[]))) + -> Hash Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p4 t2_2 + Filter: (c = ANY ('{0003,0004,0005}'::text[])) + -> Hash + -> Seq Scan on plt1_adv_p4 t1_2 + Filter: ((b < 10) AND (c = ANY ('{0003,0004,0005}'::text[]))) + Optimizer: Postgres query optimizer +(18 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IN ('0003', '0004', '0005') AND t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 5 | 0005 | 5 | 0005 +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IS NULL AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Right Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Seq Scan on plt2_adv_p4 t2 + -> Hash + -> Seq Scan on plt1_adv_p4 t1 + Filter: ((c IS NULL) AND (b < 10)) + Optimizer: Postgres query optimizer +(9 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IS NULL AND t1.b < 10 ORDER BY t1.a; + a | c | a | c +----+---+---+--- + -1 | | | +(1 row) + +CREATE TABLE plt1_adv_default PARTITION OF plt1_adv DEFAULT; +ANALYZE plt1_adv; +CREATE TABLE plt2_adv_default PARTITION OF plt2_adv DEFAULT; +ANALYZE plt2_adv; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IN ('0003', '0004', '0005') AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +----------------------------------------------------------------------------------------- + Sort + Sort Key: t1.a + -> Append + -> Hash Join + Hash Cond: ((t2_1.a = t1_1.a) AND (t2_1.c = t1_1.c)) + -> Seq Scan on plt2_adv_p3 t2_1 + Filter: (c = ANY ('{0003,0004,0005}'::text[])) + -> Hash + -> Seq Scan on plt1_adv_p3 t1_1 + Filter: ((b < 10) AND (c = ANY ('{0003,0004,0005}'::text[]))) + -> Hash Join + Hash Cond: ((t2_2.a = t1_2.a) AND (t2_2.c = t1_2.c)) + -> Seq Scan on plt2_adv_p4 t2_2 + Filter: (c = ANY ('{0003,0004,0005}'::text[])) + -> Hash + -> Seq Scan on plt1_adv_p4 t1_2 + Filter: ((b < 10) AND (c = ANY ('{0003,0004,0005}'::text[]))) + Optimizer: Postgres query optimizer +(18 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IN ('0003', '0004', '0005') AND t1.b < 10 ORDER BY t1.a; + a | c | a | c +---+------+---+------ + 3 | 0003 | 3 | 0003 + 4 | 0004 | 4 | 0004 + 5 | 0005 | 5 | 0005 +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IS NULL AND t1.b < 10 ORDER BY t1.a; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: t1.a + -> Hash Right Join + Hash Cond: ((t2.a = t1.a) AND (t2.c = t1.c)) + -> Seq Scan on plt2_adv_p4 t2 + -> Hash + -> Seq Scan on plt1_adv_p4 t1 + Filter: ((c IS NULL) AND (b < 10)) + Optimizer: Postgres query optimizer +(9 rows) + +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IS NULL AND t1.b < 10 ORDER BY t1.a; + a | c | a | c +----+---+---+--- + -1 | | | +(1 row) + +DROP TABLE plt1_adv; +DROP TABLE plt2_adv; +-- Test the process_outer_partition() code path +CREATE TABLE plt1_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt1_adv_p1 PARTITION OF plt1_adv FOR VALUES IN ('0000', '0001', '0002'); +CREATE TABLE plt1_adv_p2 PARTITION OF plt1_adv FOR VALUES IN ('0003', '0004'); +INSERT INTO plt1_adv SELECT i, i, to_char(i % 5, 'FM0000') FROM generate_series(0, 24) i; +ANALYZE plt1_adv; +CREATE TABLE plt2_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt2_adv_p1 PARTITION OF plt2_adv FOR VALUES IN ('0002'); +CREATE TABLE plt2_adv_p2 PARTITION OF plt2_adv FOR VALUES IN ('0003', '0004'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 5, 'FM0000') FROM generate_series(0, 24) i WHERE i % 5 IN (2, 3, 4); +ANALYZE plt2_adv; +CREATE TABLE plt3_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt3_adv_p1 PARTITION OF plt3_adv FOR VALUES IN ('0001'); +CREATE TABLE plt3_adv_p2 PARTITION OF plt3_adv FOR VALUES IN ('0003', '0004'); +INSERT INTO plt3_adv SELECT i, i, to_char(i % 5, 'FM0000') FROM generate_series(0, 24) i WHERE i % 5 IN (1, 3, 4); +ANALYZE plt3_adv; +-- This tests that when merging partitions from plt1_adv and plt2_adv in +-- merge_list_bounds(), process_outer_partition() returns an already-assigned +-- merged partition when re-called with plt1_adv_p1 for the second list value +-- '0001' of that partition +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM (plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.c = t2.c)) FULL JOIN plt3_adv t3 ON (t1.c = t3.c) WHERE coalesce(t1.a, 0) % 5 != 3 AND coalesce(t1.a, 0) % 5 != 4 ORDER BY t1.c, t1.a, t2.a, t3.a; + QUERY PLAN +----------------------------------------------------------------------------------------------- + Sort + Sort Key: t1.c, t1.a, t2.a, t3.a + -> Append + -> Hash Full Join + Hash Cond: (t1_1.c = t3_1.c) + Filter: (((COALESCE(t1_1.a, 0) % 5) <> 3) AND ((COALESCE(t1_1.a, 0) % 5) <> 4)) + -> Hash Left Join + Hash Cond: (t1_1.c = t2_1.c) + -> Seq Scan on plt1_adv_p1 t1_1 + -> Hash + -> Seq Scan on plt2_adv_p1 t2_1 + -> Hash + -> Seq Scan on plt3_adv_p1 t3_1 + -> Hash Full Join + Hash Cond: (t1_2.c = t3_2.c) + Filter: (((COALESCE(t1_2.a, 0) % 5) <> 3) AND ((COALESCE(t1_2.a, 0) % 5) <> 4)) + -> Hash Left Join + Hash Cond: (t1_2.c = t2_2.c) + -> Seq Scan on plt1_adv_p2 t1_2 + -> Hash + -> Seq Scan on plt2_adv_p2 t2_2 + -> Hash + -> Seq Scan on plt3_adv_p2 t3_2 + Optimizer: Postgres query optimizer +(24 rows) + +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM (plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.c = t2.c)) FULL JOIN plt3_adv t3 ON (t1.c = t3.c) WHERE coalesce(t1.a, 0) % 5 != 3 AND coalesce(t1.a, 0) % 5 != 4 ORDER BY t1.c, t1.a, t2.a, t3.a; + a | c | a | c | a | c +----+------+----+------+----+------ + 0 | 0000 | | | | + 5 | 0000 | | | | + 10 | 0000 | | | | + 15 | 0000 | | | | + 20 | 0000 | | | | + 1 | 0001 | | | 1 | 0001 + 1 | 0001 | | | 6 | 0001 + 1 | 0001 | | | 11 | 0001 + 1 | 0001 | | | 16 | 0001 + 1 | 0001 | | | 21 | 0001 + 6 | 0001 | | | 1 | 0001 + 6 | 0001 | | | 6 | 0001 + 6 | 0001 | | | 11 | 0001 + 6 | 0001 | | | 16 | 0001 + 6 | 0001 | | | 21 | 0001 + 11 | 0001 | | | 1 | 0001 + 11 | 0001 | | | 6 | 0001 + 11 | 0001 | | | 11 | 0001 + 11 | 0001 | | | 16 | 0001 + 11 | 0001 | | | 21 | 0001 + 16 | 0001 | | | 1 | 0001 + 16 | 0001 | | | 6 | 0001 + 16 | 0001 | | | 11 | 0001 + 16 | 0001 | | | 16 | 0001 + 16 | 0001 | | | 21 | 0001 + 21 | 0001 | | | 1 | 0001 + 21 | 0001 | | | 6 | 0001 + 21 | 0001 | | | 11 | 0001 + 21 | 0001 | | | 16 | 0001 + 21 | 0001 | | | 21 | 0001 + 2 | 0002 | 2 | 0002 | | + 2 | 0002 | 7 | 0002 | | + 2 | 0002 | 12 | 0002 | | + 2 | 0002 | 17 | 0002 | | + 2 | 0002 | 22 | 0002 | | + 7 | 0002 | 2 | 0002 | | + 7 | 0002 | 7 | 0002 | | + 7 | 0002 | 12 | 0002 | | + 7 | 0002 | 17 | 0002 | | + 7 | 0002 | 22 | 0002 | | + 12 | 0002 | 2 | 0002 | | + 12 | 0002 | 7 | 0002 | | + 12 | 0002 | 12 | 0002 | | + 12 | 0002 | 17 | 0002 | | + 12 | 0002 | 22 | 0002 | | + 17 | 0002 | 2 | 0002 | | + 17 | 0002 | 7 | 0002 | | + 17 | 0002 | 12 | 0002 | | + 17 | 0002 | 17 | 0002 | | + 17 | 0002 | 22 | 0002 | | + 22 | 0002 | 2 | 0002 | | + 22 | 0002 | 7 | 0002 | | + 22 | 0002 | 12 | 0002 | | + 22 | 0002 | 17 | 0002 | | + 22 | 0002 | 22 | 0002 | | +(55 rows) + +DROP TABLE plt1_adv; +DROP TABLE plt2_adv; +DROP TABLE plt3_adv; +-- Tests for multi-level partitioned tables +CREATE TABLE alpha (a double precision, b int, c text) PARTITION BY RANGE (a); +CREATE TABLE alpha_neg PARTITION OF alpha FOR VALUES FROM ('-Infinity') TO (0) PARTITION BY RANGE (b); +CREATE TABLE alpha_pos PARTITION OF alpha FOR VALUES FROM (0) TO (10.0) PARTITION BY LIST (c); +CREATE TABLE alpha_neg_p1 PARTITION OF alpha_neg FOR VALUES FROM (100) TO (200); +CREATE TABLE alpha_neg_p2 PARTITION OF alpha_neg FOR VALUES FROM (200) TO (300); +CREATE TABLE alpha_neg_p3 PARTITION OF alpha_neg FOR VALUES FROM (300) TO (400); +CREATE TABLE alpha_pos_p1 PARTITION OF alpha_pos FOR VALUES IN ('0001', '0003'); +CREATE TABLE alpha_pos_p2 PARTITION OF alpha_pos FOR VALUES IN ('0004', '0006'); +CREATE TABLE alpha_pos_p3 PARTITION OF alpha_pos FOR VALUES IN ('0008', '0009'); +INSERT INTO alpha_neg SELECT -1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(100, 399) i WHERE i % 10 IN (1, 3, 4, 6, 8, 9); +INSERT INTO alpha_pos SELECT 1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(100, 399) i WHERE i % 10 IN (1, 3, 4, 6, 8, 9); +ANALYZE alpha; +CREATE TABLE beta (a double precision, b int, c text) PARTITION BY RANGE (a); +CREATE TABLE beta_neg PARTITION OF beta FOR VALUES FROM (-10.0) TO (0) PARTITION BY RANGE (b); +CREATE TABLE beta_pos PARTITION OF beta FOR VALUES FROM (0) TO ('Infinity') PARTITION BY LIST (c); +CREATE TABLE beta_neg_p1 PARTITION OF beta_neg FOR VALUES FROM (100) TO (150); +CREATE TABLE beta_neg_p2 PARTITION OF beta_neg FOR VALUES FROM (200) TO (300); +CREATE TABLE beta_neg_p3 PARTITION OF beta_neg FOR VALUES FROM (350) TO (500); +CREATE TABLE beta_pos_p1 PARTITION OF beta_pos FOR VALUES IN ('0002', '0003'); +CREATE TABLE beta_pos_p2 PARTITION OF beta_pos FOR VALUES IN ('0004', '0006'); +CREATE TABLE beta_pos_p3 PARTITION OF beta_pos FOR VALUES IN ('0007', '0009'); +INSERT INTO beta_neg SELECT -1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(100, 149) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_neg SELECT -1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(200, 299) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_neg SELECT -1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(350, 499) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_pos SELECT 1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(100, 149) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_pos SELECT 1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(200, 299) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_pos SELECT 1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(350, 499) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +ANALYZE beta; +EXPLAIN (COSTS OFF) +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b) WHERE t1.b >= 125 AND t1.b < 225 ORDER BY t1.a, t1.b; + QUERY PLAN +-------------------------------------------------------------------- + Sort + Sort Key: t1.a, t1.b + -> Append + -> Hash Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.b = t2_1.b)) + -> Seq Scan on alpha_neg_p1 t1_1 + Filter: ((b >= 125) AND (b < 225)) + -> Hash + -> Seq Scan on beta_neg_p1 t2_1 + Filter: ((b >= 125) AND (b < 225)) + -> Hash Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.b = t2_2.b)) + -> Seq Scan on alpha_neg_p2 t1_2 + Filter: ((b >= 125) AND (b < 225)) + -> Hash + -> Seq Scan on beta_neg_p2 t2_2 + Filter: ((b >= 125) AND (b < 225)) + -> Hash Join + Hash Cond: ((t1_4.a = t2_4.a) AND (t1_4.b = t2_4.b)) + -> Append + -> Seq Scan on alpha_pos_p1 t1_4 + Filter: ((b >= 125) AND (b < 225)) + -> Seq Scan on alpha_pos_p2 t1_5 + Filter: ((b >= 125) AND (b < 225)) + -> Seq Scan on alpha_pos_p3 t1_6 + Filter: ((b >= 125) AND (b < 225)) + -> Hash + -> Append + -> Seq Scan on beta_pos_p1 t2_4 + Filter: ((b >= 125) AND (b < 225)) + -> Seq Scan on beta_pos_p2 t2_5 + Filter: ((b >= 125) AND (b < 225)) + -> Seq Scan on beta_pos_p3 t2_6 + Filter: ((b >= 125) AND (b < 225)) + Optimizer: Postgres query optimizer +(35 rows) + +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b) WHERE t1.b >= 125 AND t1.b < 225 ORDER BY t1.a, t1.b; + a | b | c | a | b | c +----+-----+------+----+-----+------ + -1 | 126 | 0006 | -1 | 126 | 0006 + -1 | 129 | 0009 | -1 | 129 | 0009 + -1 | 133 | 0003 | -1 | 133 | 0003 + -1 | 134 | 0004 | -1 | 134 | 0004 + -1 | 136 | 0006 | -1 | 136 | 0006 + -1 | 139 | 0009 | -1 | 139 | 0009 + -1 | 143 | 0003 | -1 | 143 | 0003 + -1 | 144 | 0004 | -1 | 144 | 0004 + -1 | 146 | 0006 | -1 | 146 | 0006 + -1 | 149 | 0009 | -1 | 149 | 0009 + -1 | 203 | 0003 | -1 | 203 | 0003 + -1 | 204 | 0004 | -1 | 204 | 0004 + -1 | 206 | 0006 | -1 | 206 | 0006 + -1 | 209 | 0009 | -1 | 209 | 0009 + -1 | 213 | 0003 | -1 | 213 | 0003 + -1 | 214 | 0004 | -1 | 214 | 0004 + -1 | 216 | 0006 | -1 | 216 | 0006 + -1 | 219 | 0009 | -1 | 219 | 0009 + -1 | 223 | 0003 | -1 | 223 | 0003 + -1 | 224 | 0004 | -1 | 224 | 0004 + 1 | 126 | 0006 | 1 | 126 | 0006 + 1 | 129 | 0009 | 1 | 129 | 0009 + 1 | 133 | 0003 | 1 | 133 | 0003 + 1 | 134 | 0004 | 1 | 134 | 0004 + 1 | 136 | 0006 | 1 | 136 | 0006 + 1 | 139 | 0009 | 1 | 139 | 0009 + 1 | 143 | 0003 | 1 | 143 | 0003 + 1 | 144 | 0004 | 1 | 144 | 0004 + 1 | 146 | 0006 | 1 | 146 | 0006 + 1 | 149 | 0009 | 1 | 149 | 0009 + 1 | 203 | 0003 | 1 | 203 | 0003 + 1 | 204 | 0004 | 1 | 204 | 0004 + 1 | 206 | 0006 | 1 | 206 | 0006 + 1 | 209 | 0009 | 1 | 209 | 0009 + 1 | 213 | 0003 | 1 | 213 | 0003 + 1 | 214 | 0004 | 1 | 214 | 0004 + 1 | 216 | 0006 | 1 | 216 | 0006 + 1 | 219 | 0009 | 1 | 219 | 0009 + 1 | 223 | 0003 | 1 | 223 | 0003 + 1 | 224 | 0004 | 1 | 224 | 0004 +(40 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b, t2.b; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t1.b, t2.b + -> Append + -> Hash Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.c = t2_2.c)) + -> Append + -> Seq Scan on alpha_neg_p1 t1_2 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Seq Scan on alpha_neg_p2 t1_3 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash + -> Append + -> Seq Scan on beta_neg_p1 t2_2 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Seq Scan on beta_neg_p2 t2_3 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash Join + Hash Cond: ((t1_4.a = t2_4.a) AND (t1_4.c = t2_4.c)) + -> Seq Scan on alpha_pos_p2 t1_4 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash + -> Seq Scan on beta_pos_p2 t2_4 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash Join + Hash Cond: ((t1_5.a = t2_5.a) AND (t1_5.c = t2_5.c)) + -> Seq Scan on alpha_pos_p3 t1_5 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash + -> Seq Scan on beta_pos_p3 t2_5 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + Optimizer: Postgres query optimizer +(31 rows) + +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b, t2.b; + a | b | c | a | b | c +----+-----+------+----+-----+------ + -1 | 104 | 0004 | -1 | 104 | 0004 + -1 | 104 | 0004 | -1 | 204 | 0004 + -1 | 109 | 0009 | -1 | 109 | 0009 + -1 | 109 | 0009 | -1 | 209 | 0009 + -1 | 204 | 0004 | -1 | 104 | 0004 + -1 | 204 | 0004 | -1 | 204 | 0004 + -1 | 209 | 0009 | -1 | 109 | 0009 + -1 | 209 | 0009 | -1 | 209 | 0009 + 1 | 104 | 0004 | 1 | 104 | 0004 + 1 | 104 | 0004 | 1 | 204 | 0004 + 1 | 109 | 0009 | 1 | 109 | 0009 + 1 | 109 | 0009 | 1 | 209 | 0009 + 1 | 204 | 0004 | 1 | 104 | 0004 + 1 | 204 | 0004 | 1 | 204 | 0004 + 1 | 209 | 0009 | 1 | 109 | 0009 + 1 | 209 | 0009 | 1 | 209 | 0009 +(16 rows) + +EXPLAIN (COSTS OFF) +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------- + Sort + Sort Key: t1.a, t1.b + -> Append + -> Hash Join + Hash Cond: ((t1_1.a = t2_1.a) AND (t1_1.b = t2_1.b) AND (t1_1.c = t2_1.c)) + -> Seq Scan on alpha_neg_p1 t1_1 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash + -> Seq Scan on beta_neg_p1 t2_1 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash Join + Hash Cond: ((t1_2.a = t2_2.a) AND (t1_2.b = t2_2.b) AND (t1_2.c = t2_2.c)) + -> Seq Scan on alpha_neg_p2 t1_2 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash + -> Seq Scan on beta_neg_p2 t2_2 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash Join + Hash Cond: ((t1_3.a = t2_3.a) AND (t1_3.b = t2_3.b) AND (t1_3.c = t2_3.c)) + -> Seq Scan on alpha_pos_p2 t1_3 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash + -> Seq Scan on beta_pos_p2 t2_3 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash Join + Hash Cond: ((t1_4.a = t2_4.a) AND (t1_4.b = t2_4.b) AND (t1_4.c = t2_4.c)) + -> Seq Scan on alpha_pos_p3 t1_4 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + -> Hash + -> Seq Scan on beta_pos_p3 t2_4 + Filter: ((c = ANY ('{0004,0009}'::text[])) AND (((b >= 100) AND (b < 110)) OR ((b >= 200) AND (b < 210)))) + Optimizer: Postgres query optimizer +(32 rows) + +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b; + a | b | c | a | b | c +----+-----+------+----+-----+------ + -1 | 104 | 0004 | -1 | 104 | 0004 + -1 | 109 | 0009 | -1 | 109 | 0009 + -1 | 204 | 0004 | -1 | 204 | 0004 + -1 | 209 | 0009 | -1 | 209 | 0009 + 1 | 104 | 0004 | 1 | 104 | 0004 + 1 | 109 | 0009 | 1 | 109 | 0009 + 1 | 204 | 0004 | 1 | 204 | 0004 + 1 | 209 | 0009 | 1 | 209 | 0009 +(8 rows) + diff --git a/src/test/singlenode_regress/expected/partition_prune.out b/src/test/singlenode_regress/expected/partition_prune.out new file mode 100644 index 00000000000..bc22ccf42d0 --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_prune.out @@ -0,0 +1,4154 @@ +-- +-- Test partitioning planner code +-- +-- GPDB: +-- One of the queries EXPLAINed in this file executes on one or two segments, +-- depending on random choice by the planner. Accept either plan. +-- start_matchsubs +-- m/ Gather Motion [12]:1 \(slice1; segments: [12]\)/ +-- s/ Gather Motion [12]:1 \(slice1; segments: [12]\)/ Gather Motion XXX/ +-- m/Memory Usage: \d+\w?B/ +-- s/Memory Usage: \d+\w?B/Memory Usage: ###B/ +-- m/Buckets: \d+/ +-- s/Buckets: \d+/Buckets: ###/ +-- m/Batches: \d+/ +-- s/Batches: \d+/Batches: ###/ +-- m/Extra Text: \(seg\d+\)/ +-- s/Extra Text: \(seg\d+\)/Extra Text: ###/ +-- m/Hash chain length \d+\.\d+ avg, \d+ max/ +-- s/Hash chain length \d+\.\d+ avg, \d+ max/Hash chain length ###/ +-- m/using \d+ of \d+ buckets/ +-- s/using \d+ of \d+ buckets/using ## of ### buckets/ +-- m/((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9])|(0[13-9]|1[0-2])-30|(0[13578]|1[02])-31)-(?!0000)[0-9]{4}/ +-- s/((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9])|(0[13-9]|1[0-2])-30|(0[13578]|1[02])-31)-(?!0000)[0-9]{4}/xx-xx-xxxx/ +-- m/((Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](.[0-9]+)? (?!0000)[0-9]{4}.*)+(['"])/ +-- s/((Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](.[0-9]+)? (?!0000)[0-9]{4}.*)+(['"])/xxx xx xx xx:xx:xx xxxx"/ +-- end_matchsubs +-- Force generic plans to be used for all prepared statements in this file. +set plan_cache_mode = force_generic_plan; +create table lp (a char) partition by list (a); +create table lp_default partition of lp default; +create table lp_ef partition of lp for values in ('e', 'f'); +create table lp_ad partition of lp for values in ('a', 'd'); +create table lp_bc partition of lp for values in ('b', 'c'); +create table lp_g partition of lp for values in ('g'); +create table lp_null partition of lp for values in (null); +explain (costs off) select * from lp; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on lp_ad lp_1 + -> Seq Scan on lp_bc lp_2 + -> Seq Scan on lp_ef lp_3 + -> Seq Scan on lp_g lp_4 + -> Seq Scan on lp_null lp_5 + -> Seq Scan on lp_default lp_6 + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from lp where a > 'a' and a < 'd'; + QUERY PLAN +----------------------------------------------------------- + Append + -> Seq Scan on lp_bc lp_1 + Filter: ((a > 'a'::bpchar) AND (a < 'd'::bpchar)) + -> Seq Scan on lp_default lp_2 + Filter: ((a > 'a'::bpchar) AND (a < 'd'::bpchar)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from lp where a > 'a' and a <= 'd'; + QUERY PLAN +------------------------------------------------------------ + Append + -> Seq Scan on lp_ad lp_1 + Filter: ((a > 'a'::bpchar) AND (a <= 'd'::bpchar)) + -> Seq Scan on lp_bc lp_2 + Filter: ((a > 'a'::bpchar) AND (a <= 'd'::bpchar)) + -> Seq Scan on lp_default lp_3 + Filter: ((a > 'a'::bpchar) AND (a <= 'd'::bpchar)) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from lp where a = 'a'; + QUERY PLAN +------------------------------------- + Seq Scan on lp_ad lp + Filter: (a = 'a'::bpchar) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from lp where 'a' = a; /* commuted */ + QUERY PLAN +------------------------------------- + Seq Scan on lp_ad lp + Filter: ('a'::bpchar = a) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from lp where a is not null; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on lp_ad lp_1 + Filter: (a IS NOT NULL) + -> Seq Scan on lp_bc lp_2 + Filter: (a IS NOT NULL) + -> Seq Scan on lp_ef lp_3 + Filter: (a IS NOT NULL) + -> Seq Scan on lp_g lp_4 + Filter: (a IS NOT NULL) + -> Seq Scan on lp_default lp_5 + Filter: (a IS NOT NULL) + Optimizer: Postgres query optimizer +(12 rows) + +explain (costs off) select * from lp where a is null; + QUERY PLAN +------------------------------------- + Seq Scan on lp_null lp + Filter: (a IS NULL) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from lp where a = 'a' or a = 'c'; + QUERY PLAN +---------------------------------------------------------- + Append + -> Seq Scan on lp_ad lp_1 + Filter: ((a = 'a'::bpchar) OR (a = 'c'::bpchar)) + -> Seq Scan on lp_bc lp_2 + Filter: ((a = 'a'::bpchar) OR (a = 'c'::bpchar)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from lp where a is not null and (a = 'a' or a = 'c'); + QUERY PLAN +-------------------------------------------------------------------------------- + Append + -> Seq Scan on lp_ad lp_1 + Filter: ((a IS NOT NULL) AND ((a = 'a'::bpchar) OR (a = 'c'::bpchar))) + -> Seq Scan on lp_bc lp_2 + Filter: ((a IS NOT NULL) AND ((a = 'a'::bpchar) OR (a = 'c'::bpchar))) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from lp where a <> 'g'; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on lp_ad lp_1 + Filter: (a <> 'g'::bpchar) + -> Seq Scan on lp_bc lp_2 + Filter: (a <> 'g'::bpchar) + -> Seq Scan on lp_ef lp_3 + Filter: (a <> 'g'::bpchar) + -> Seq Scan on lp_default lp_4 + Filter: (a <> 'g'::bpchar) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from lp where a <> 'a' and a <> 'd'; + QUERY PLAN +------------------------------------------------------------- + Append + -> Seq Scan on lp_bc lp_1 + Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) + -> Seq Scan on lp_ef lp_2 + Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) + -> Seq Scan on lp_g lp_3 + Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) + -> Seq Scan on lp_default lp_4 + Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from lp where a not in ('a', 'd'); + QUERY PLAN +------------------------------------------------ + Append + -> Seq Scan on lp_bc lp_1 + Filter: (a <> ALL ('{a,d}'::bpchar[])) + -> Seq Scan on lp_ef lp_2 + Filter: (a <> ALL ('{a,d}'::bpchar[])) + -> Seq Scan on lp_g lp_3 + Filter: (a <> ALL ('{a,d}'::bpchar[])) + -> Seq Scan on lp_default lp_4 + Filter: (a <> ALL ('{a,d}'::bpchar[])) + Optimizer: Postgres query optimizer +(10 rows) + +-- collation matches the partitioning collation, pruning works +create table coll_pruning (a text collate "C") partition by list (a); +create table coll_pruning_a partition of coll_pruning for values in ('a'); +create table coll_pruning_b partition of coll_pruning for values in ('b'); +create table coll_pruning_def partition of coll_pruning default; +explain (costs off) select * from coll_pruning where a collate "C" = 'a' collate "C"; + QUERY PLAN +----------------------------------------- + Seq Scan on coll_pruning_a coll_pruning + Filter: (a = 'a'::text COLLATE "C") + Optimizer: Postgres query optimizer +(3 rows) + +-- collation doesn't match the partitioning collation, no pruning occurs +explain (costs off) select * from coll_pruning where a collate "POSIX" = 'a' collate "POSIX"; + QUERY PLAN +--------------------------------------------------------- + Append + -> Seq Scan on coll_pruning_a coll_pruning_1 + Filter: ((a)::text = 'a'::text COLLATE "POSIX") + -> Seq Scan on coll_pruning_b coll_pruning_2 + Filter: ((a)::text = 'a'::text COLLATE "POSIX") + -> Seq Scan on coll_pruning_def coll_pruning_3 + Filter: ((a)::text = 'a'::text COLLATE "POSIX") + Optimizer: Postgres query optimizer +(8 rows) + +create table rlp (a int, b varchar) partition by range (a); +create table rlp_default partition of rlp default partition by list (a); +create table rlp_default_default partition of rlp_default default; +create table rlp_default_10 partition of rlp_default for values in (10); +create table rlp_default_30 partition of rlp_default for values in (30); +create table rlp_default_null partition of rlp_default for values in (null); +create table rlp1 partition of rlp for values from (minvalue) to (1); +create table rlp2 partition of rlp for values from (1) to (10); +create table rlp3 (b varchar, a int) partition by list (b varchar_ops); +create table rlp3_default partition of rlp3 default; +create table rlp3abcd partition of rlp3 for values in ('ab', 'cd'); +create table rlp3efgh partition of rlp3 for values in ('ef', 'gh'); +create table rlp3nullxy partition of rlp3 for values in (null, 'xy'); +alter table rlp attach partition rlp3 for values from (15) to (20); +create table rlp4 partition of rlp for values from (20) to (30) partition by range (a); +create table rlp4_default partition of rlp4 default; +create table rlp4_1 partition of rlp4 for values from (20) to (25); +create table rlp4_2 partition of rlp4 for values from (25) to (29); +create table rlp5 partition of rlp for values from (31) to (maxvalue) partition by range (a); +create table rlp5_default partition of rlp5 default; +create table rlp5_1 partition of rlp5 for values from (31) to (40); +explain (costs off) select * from rlp where a < 1; + QUERY PLAN +------------------------------------- + Seq Scan on rlp1 rlp + Filter: (a < 1) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where 1 > a; /* commuted */ + QUERY PLAN +------------------------------------- + Seq Scan on rlp1 rlp + Filter: (1 > a) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a <= 1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on rlp1 rlp_1 + Filter: (a <= 1) + -> Seq Scan on rlp2 rlp_2 + Filter: (a <= 1) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from rlp where a = 1; + QUERY PLAN +------------------------------------- + Seq Scan on rlp2 rlp + Filter: (a = 1) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a = 1::bigint; /* same as above */ + QUERY PLAN +------------------------------------- + Seq Scan on rlp2 rlp + Filter: (a = '1'::bigint) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a = 1::numeric; /* no pruning */ + QUERY PLAN +----------------------------------------------- + Append + -> Seq Scan on rlp1 rlp_1 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp2 rlp_2 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp3abcd rlp_3 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp3efgh rlp_4 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp3nullxy rlp_5 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp3_default rlp_6 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp4_1 rlp_7 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp4_2 rlp_8 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp4_default rlp_9 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp5_1 rlp_10 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp5_default rlp_11 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp_default_10 rlp_12 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp_default_30 rlp_13 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp_default_null rlp_14 + Filter: ((a)::numeric = '1'::numeric) + -> Seq Scan on rlp_default_default rlp_15 + Filter: ((a)::numeric = '1'::numeric) + Optimizer: Postgres query optimizer +(32 rows) + +explain (costs off) select * from rlp where a <= 10; + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on rlp1 rlp_1 + Filter: (a <= 10) + -> Seq Scan on rlp2 rlp_2 + Filter: (a <= 10) + -> Seq Scan on rlp_default_10 rlp_3 + Filter: (a <= 10) + -> Seq Scan on rlp_default_default rlp_4 + Filter: (a <= 10) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from rlp where a > 10; + QUERY PLAN +---------------------------------------------- + Append + -> Seq Scan on rlp3abcd rlp_1 + Filter: (a > 10) + -> Seq Scan on rlp3efgh rlp_2 + Filter: (a > 10) + -> Seq Scan on rlp3nullxy rlp_3 + Filter: (a > 10) + -> Seq Scan on rlp3_default rlp_4 + Filter: (a > 10) + -> Seq Scan on rlp4_1 rlp_5 + Filter: (a > 10) + -> Seq Scan on rlp4_2 rlp_6 + Filter: (a > 10) + -> Seq Scan on rlp4_default rlp_7 + Filter: (a > 10) + -> Seq Scan on rlp5_1 rlp_8 + Filter: (a > 10) + -> Seq Scan on rlp5_default rlp_9 + Filter: (a > 10) + -> Seq Scan on rlp_default_30 rlp_10 + Filter: (a > 10) + -> Seq Scan on rlp_default_default rlp_11 + Filter: (a > 10) + Optimizer: Postgres query optimizer +(24 rows) + +explain (costs off) select * from rlp where a < 15; + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on rlp1 rlp_1 + Filter: (a < 15) + -> Seq Scan on rlp2 rlp_2 + Filter: (a < 15) + -> Seq Scan on rlp_default_10 rlp_3 + Filter: (a < 15) + -> Seq Scan on rlp_default_default rlp_4 + Filter: (a < 15) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from rlp where a <= 15; + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on rlp1 rlp_1 + Filter: (a <= 15) + -> Seq Scan on rlp2 rlp_2 + Filter: (a <= 15) + -> Seq Scan on rlp3abcd rlp_3 + Filter: (a <= 15) + -> Seq Scan on rlp3efgh rlp_4 + Filter: (a <= 15) + -> Seq Scan on rlp3nullxy rlp_5 + Filter: (a <= 15) + -> Seq Scan on rlp3_default rlp_6 + Filter: (a <= 15) + -> Seq Scan on rlp_default_10 rlp_7 + Filter: (a <= 15) + -> Seq Scan on rlp_default_default rlp_8 + Filter: (a <= 15) + Optimizer: Postgres query optimizer +(18 rows) + +explain (costs off) select * from rlp where a > 15 and b = 'ab'; + QUERY PLAN +--------------------------------------------------------- + Append + -> Seq Scan on rlp3abcd rlp_1 + Filter: ((a > 15) AND ((b)::text = 'ab'::text)) + -> Seq Scan on rlp4_1 rlp_2 + Filter: ((a > 15) AND ((b)::text = 'ab'::text)) + -> Seq Scan on rlp4_2 rlp_3 + Filter: ((a > 15) AND ((b)::text = 'ab'::text)) + -> Seq Scan on rlp4_default rlp_4 + Filter: ((a > 15) AND ((b)::text = 'ab'::text)) + -> Seq Scan on rlp5_1 rlp_5 + Filter: ((a > 15) AND ((b)::text = 'ab'::text)) + -> Seq Scan on rlp5_default rlp_6 + Filter: ((a > 15) AND ((b)::text = 'ab'::text)) + -> Seq Scan on rlp_default_30 rlp_7 + Filter: ((a > 15) AND ((b)::text = 'ab'::text)) + -> Seq Scan on rlp_default_default rlp_8 + Filter: ((a > 15) AND ((b)::text = 'ab'::text)) + Optimizer: Postgres query optimizer +(18 rows) + +explain (costs off) select * from rlp where a = 16; + QUERY PLAN +-------------------------------------- + Append + -> Seq Scan on rlp3abcd rlp_1 + Filter: (a = 16) + -> Seq Scan on rlp3efgh rlp_2 + Filter: (a = 16) + -> Seq Scan on rlp3nullxy rlp_3 + Filter: (a = 16) + -> Seq Scan on rlp3_default rlp_4 + Filter: (a = 16) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from rlp where a = 16 and b in ('not', 'in', 'here'); + QUERY PLAN +---------------------------------------------------------------------- + Seq Scan on rlp3_default rlp + Filter: ((a = 16) AND ((b)::text = ANY ('{not,in,here}'::text[]))) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a = 16 and b < 'ab'; + QUERY PLAN +--------------------------------------------------- + Seq Scan on rlp3_default rlp + Filter: (((b)::text < 'ab'::text) AND (a = 16)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a = 16 and b <= 'ab'; + QUERY PLAN +---------------------------------------------------------- + Append + -> Seq Scan on rlp3abcd rlp_1 + Filter: (((b)::text <= 'ab'::text) AND (a = 16)) + -> Seq Scan on rlp3_default rlp_2 + Filter: (((b)::text <= 'ab'::text) AND (a = 16)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from rlp where a = 16 and b is null; + QUERY PLAN +-------------------------------------- + Seq Scan on rlp3nullxy rlp + Filter: ((b IS NULL) AND (a = 16)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a = 16 and b is not null; + QUERY PLAN +------------------------------------------------ + Append + -> Seq Scan on rlp3abcd rlp_1 + Filter: ((b IS NOT NULL) AND (a = 16)) + -> Seq Scan on rlp3efgh rlp_2 + Filter: ((b IS NOT NULL) AND (a = 16)) + -> Seq Scan on rlp3nullxy rlp_3 + Filter: ((b IS NOT NULL) AND (a = 16)) + -> Seq Scan on rlp3_default rlp_4 + Filter: ((b IS NOT NULL) AND (a = 16)) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from rlp where a is null; + QUERY PLAN +------------------------------------- + Seq Scan on rlp_default_null rlp + Filter: (a IS NULL) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a is not null; + QUERY PLAN +---------------------------------------------- + Append + -> Seq Scan on rlp1 rlp_1 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp2 rlp_2 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp3abcd rlp_3 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp3efgh rlp_4 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp3nullxy rlp_5 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp3_default rlp_6 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp4_1 rlp_7 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp4_2 rlp_8 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp4_default rlp_9 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp5_1 rlp_10 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp5_default rlp_11 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp_default_10 rlp_12 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp_default_30 rlp_13 + Filter: (a IS NOT NULL) + -> Seq Scan on rlp_default_default rlp_14 + Filter: (a IS NOT NULL) + Optimizer: Postgres query optimizer +(30 rows) + +explain (costs off) select * from rlp where a > 30; + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on rlp5_1 rlp_1 + Filter: (a > 30) + -> Seq Scan on rlp5_default rlp_2 + Filter: (a > 30) + -> Seq Scan on rlp_default_default rlp_3 + Filter: (a > 30) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from rlp where a = 30; /* only default is scanned */ + QUERY PLAN +------------------------------------- + Seq Scan on rlp_default_30 rlp + Filter: (a = 30) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a <= 31; + QUERY PLAN +---------------------------------------------- + Append + -> Seq Scan on rlp1 rlp_1 + Filter: (a <= 31) + -> Seq Scan on rlp2 rlp_2 + Filter: (a <= 31) + -> Seq Scan on rlp3abcd rlp_3 + Filter: (a <= 31) + -> Seq Scan on rlp3efgh rlp_4 + Filter: (a <= 31) + -> Seq Scan on rlp3nullxy rlp_5 + Filter: (a <= 31) + -> Seq Scan on rlp3_default rlp_6 + Filter: (a <= 31) + -> Seq Scan on rlp4_1 rlp_7 + Filter: (a <= 31) + -> Seq Scan on rlp4_2 rlp_8 + Filter: (a <= 31) + -> Seq Scan on rlp4_default rlp_9 + Filter: (a <= 31) + -> Seq Scan on rlp5_1 rlp_10 + Filter: (a <= 31) + -> Seq Scan on rlp_default_10 rlp_11 + Filter: (a <= 31) + -> Seq Scan on rlp_default_30 rlp_12 + Filter: (a <= 31) + -> Seq Scan on rlp_default_default rlp_13 + Filter: (a <= 31) + Optimizer: Postgres query optimizer +(28 rows) + +explain (costs off) select * from rlp where a = 1 or a = 7; + QUERY PLAN +------------------------------------- + Seq Scan on rlp2 rlp + Filter: ((a = 1) OR (a = 7)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a = 1 or b = 'ab'; + QUERY PLAN +------------------------------------------------------- + Append + -> Seq Scan on rlp1 rlp_1 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp2 rlp_2 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp3abcd rlp_3 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp4_1 rlp_4 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp4_2 rlp_5 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp4_default rlp_6 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp5_1 rlp_7 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp5_default rlp_8 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp_default_10 rlp_9 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp_default_30 rlp_10 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp_default_null rlp_11 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + -> Seq Scan on rlp_default_default rlp_12 + Filter: ((a = 1) OR ((b)::text = 'ab'::text)) + Optimizer: Postgres query optimizer +(26 rows) + +explain (costs off) select * from rlp where a > 20 and a < 27; + QUERY PLAN +----------------------------------------- + Append + -> Seq Scan on rlp4_1 rlp_1 + Filter: ((a > 20) AND (a < 27)) + -> Seq Scan on rlp4_2 rlp_2 + Filter: ((a > 20) AND (a < 27)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from rlp where a = 29; + QUERY PLAN +------------------------------------- + Seq Scan on rlp4_default rlp + Filter: (a = 29) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a >= 29; + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on rlp4_default rlp_1 + Filter: (a >= 29) + -> Seq Scan on rlp5_1 rlp_2 + Filter: (a >= 29) + -> Seq Scan on rlp5_default rlp_3 + Filter: (a >= 29) + -> Seq Scan on rlp_default_30 rlp_4 + Filter: (a >= 29) + -> Seq Scan on rlp_default_default rlp_5 + Filter: (a >= 29) + Optimizer: Postgres query optimizer +(12 rows) + +explain (costs off) select * from rlp where a < 1 or (a > 20 and a < 25); + QUERY PLAN +------------------------------------------------------ + Append + -> Seq Scan on rlp1 rlp_1 + Filter: ((a < 1) OR ((a > 20) AND (a < 25))) + -> Seq Scan on rlp4_1 rlp_2 + Filter: ((a < 1) OR ((a > 20) AND (a < 25))) + Optimizer: Postgres query optimizer +(6 rows) + +-- where clause contradicts sub-partition's constraint +explain (costs off) select * from rlp where a = 20 or a = 40; + QUERY PLAN +---------------------------------------- + Append + -> Seq Scan on rlp4_1 rlp_1 + Filter: ((a = 20) OR (a = 40)) + -> Seq Scan on rlp5_default rlp_2 + Filter: ((a = 20) OR (a = 40)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from rlp3 where a = 20; /* empty */ + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +-- redundant clauses are eliminated +explain (costs off) select * from rlp where a > 1 and a = 10; /* only default */ + QUERY PLAN +------------------------------------- + Seq Scan on rlp_default_10 rlp + Filter: ((a > 1) AND (a = 10)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where a > 1 and a >=15; /* rlp3 onwards, including default */ + QUERY PLAN +---------------------------------------------- + Append + -> Seq Scan on rlp3abcd rlp_1 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp3efgh rlp_2 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp3nullxy rlp_3 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp3_default rlp_4 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp4_1 rlp_5 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp4_2 rlp_6 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp4_default rlp_7 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp5_1 rlp_8 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp5_default rlp_9 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp_default_30 rlp_10 + Filter: ((a > 1) AND (a >= 15)) + -> Seq Scan on rlp_default_default rlp_11 + Filter: ((a > 1) AND (a >= 15)) + Optimizer: Postgres query optimizer +(24 rows) + +explain (costs off) select * from rlp where a = 1 and a = 3; /* empty */ + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from rlp where (a = 1 and a = 3) or (a > 1 and a = 15); + QUERY PLAN +------------------------------------------------------------------- + Append + -> Seq Scan on rlp2 rlp_1 + Filter: (((a = 1) AND (a = 3)) OR ((a > 1) AND (a = 15))) + -> Seq Scan on rlp3abcd rlp_2 + Filter: (((a = 1) AND (a = 3)) OR ((a > 1) AND (a = 15))) + -> Seq Scan on rlp3efgh rlp_3 + Filter: (((a = 1) AND (a = 3)) OR ((a > 1) AND (a = 15))) + -> Seq Scan on rlp3nullxy rlp_4 + Filter: (((a = 1) AND (a = 3)) OR ((a > 1) AND (a = 15))) + -> Seq Scan on rlp3_default rlp_5 + Filter: (((a = 1) AND (a = 3)) OR ((a > 1) AND (a = 15))) + Optimizer: Postgres query optimizer +(12 rows) + +-- multi-column keys +create table mc3p (a int, b int, c int) partition by range (a, abs(b), c); +create table mc3p_default partition of mc3p default; +create table mc3p0 partition of mc3p for values from (minvalue, minvalue, minvalue) to (1, 1, 1); +create table mc3p1 partition of mc3p for values from (1, 1, 1) to (10, 5, 10); +create table mc3p2 partition of mc3p for values from (10, 5, 10) to (10, 10, 10); +create table mc3p3 partition of mc3p for values from (10, 10, 10) to (10, 10, 20); +create table mc3p4 partition of mc3p for values from (10, 10, 20) to (10, maxvalue, maxvalue); +create table mc3p5 partition of mc3p for values from (11, 1, 1) to (20, 10, 10); +create table mc3p6 partition of mc3p for values from (20, 10, 10) to (20, 20, 20); +create table mc3p7 partition of mc3p for values from (20, 20, 20) to (maxvalue, maxvalue, maxvalue); +explain (costs off) select * from mc3p where a = 1; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: (a = 1) + -> Seq Scan on mc3p1 mc3p_2 + Filter: (a = 1) + -> Seq Scan on mc3p_default mc3p_3 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from mc3p where a = 1 and abs(b) < 1; + QUERY PLAN +-------------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: ((a = 1) AND (abs(b) < 1)) + -> Seq Scan on mc3p_default mc3p_2 + Filter: ((a = 1) AND (abs(b) < 1)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from mc3p where a = 1 and abs(b) = 1; + QUERY PLAN +-------------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: ((a = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p1 mc3p_2 + Filter: ((a = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p_default mc3p_3 + Filter: ((a = 1) AND (abs(b) = 1)) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from mc3p where a = 1 and abs(b) = 1 and c < 8; + QUERY PLAN +-------------------------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: ((c < 8) AND (a = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p1 mc3p_2 + Filter: ((c < 8) AND (a = 1) AND (abs(b) = 1)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from mc3p where a = 10 and abs(b) between 5 and 35; + QUERY PLAN +----------------------------------------------------------------- + Append + -> Seq Scan on mc3p1 mc3p_1 + Filter: ((a = 10) AND (abs(b) >= 5) AND (abs(b) <= 35)) + -> Seq Scan on mc3p2 mc3p_2 + Filter: ((a = 10) AND (abs(b) >= 5) AND (abs(b) <= 35)) + -> Seq Scan on mc3p3 mc3p_3 + Filter: ((a = 10) AND (abs(b) >= 5) AND (abs(b) <= 35)) + -> Seq Scan on mc3p4 mc3p_4 + Filter: ((a = 10) AND (abs(b) >= 5) AND (abs(b) <= 35)) + -> Seq Scan on mc3p_default mc3p_5 + Filter: ((a = 10) AND (abs(b) >= 5) AND (abs(b) <= 35)) + Optimizer: Postgres query optimizer +(12 rows) + +explain (costs off) select * from mc3p where a > 10; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on mc3p5 mc3p_1 + Filter: (a > 10) + -> Seq Scan on mc3p6 mc3p_2 + Filter: (a > 10) + -> Seq Scan on mc3p7 mc3p_3 + Filter: (a > 10) + -> Seq Scan on mc3p_default mc3p_4 + Filter: (a > 10) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from mc3p where a >= 10; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on mc3p1 mc3p_1 + Filter: (a >= 10) + -> Seq Scan on mc3p2 mc3p_2 + Filter: (a >= 10) + -> Seq Scan on mc3p3 mc3p_3 + Filter: (a >= 10) + -> Seq Scan on mc3p4 mc3p_4 + Filter: (a >= 10) + -> Seq Scan on mc3p5 mc3p_5 + Filter: (a >= 10) + -> Seq Scan on mc3p6 mc3p_6 + Filter: (a >= 10) + -> Seq Scan on mc3p7 mc3p_7 + Filter: (a >= 10) + -> Seq Scan on mc3p_default mc3p_8 + Filter: (a >= 10) + Optimizer: Postgres query optimizer +(18 rows) + +explain (costs off) select * from mc3p where a < 10; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: (a < 10) + -> Seq Scan on mc3p1 mc3p_2 + Filter: (a < 10) + -> Seq Scan on mc3p_default mc3p_3 + Filter: (a < 10) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from mc3p where a <= 10 and abs(b) < 10; + QUERY PLAN +----------------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: ((a <= 10) AND (abs(b) < 10)) + -> Seq Scan on mc3p1 mc3p_2 + Filter: ((a <= 10) AND (abs(b) < 10)) + -> Seq Scan on mc3p2 mc3p_3 + Filter: ((a <= 10) AND (abs(b) < 10)) + -> Seq Scan on mc3p_default mc3p_4 + Filter: ((a <= 10) AND (abs(b) < 10)) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from mc3p where a = 11 and abs(b) = 0; + QUERY PLAN +--------------------------------------- + Seq Scan on mc3p_default mc3p + Filter: ((a = 11) AND (abs(b) = 0)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from mc3p where a = 20 and abs(b) = 10 and c = 100; + QUERY PLAN +------------------------------------------------------ + Seq Scan on mc3p6 mc3p + Filter: ((a = 20) AND (c = 100) AND (abs(b) = 10)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from mc3p where a > 20; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on mc3p7 mc3p_1 + Filter: (a > 20) + -> Seq Scan on mc3p_default mc3p_2 + Filter: (a > 20) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from mc3p where a >= 20; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on mc3p5 mc3p_1 + Filter: (a >= 20) + -> Seq Scan on mc3p6 mc3p_2 + Filter: (a >= 20) + -> Seq Scan on mc3p7 mc3p_3 + Filter: (a >= 20) + -> Seq Scan on mc3p_default mc3p_4 + Filter: (a >= 20) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1 and c = 1) or (a = 10 and abs(b) = 5 and c = 10) or (a > 11 and a < 20); + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------- + Append + -> Seq Scan on mc3p1 mc3p_1 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20))) + -> Seq Scan on mc3p2 mc3p_2 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20))) + -> Seq Scan on mc3p5 mc3p_3 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20))) + -> Seq Scan on mc3p_default mc3p_4 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20))) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1 and c = 1) or (a = 10 and abs(b) = 5 and c = 10) or (a > 11 and a < 20) or a < 1; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1)) + -> Seq Scan on mc3p1 mc3p_2 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1)) + -> Seq Scan on mc3p2 mc3p_3 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1)) + -> Seq Scan on mc3p5 mc3p_4 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1)) + -> Seq Scan on mc3p_default mc3p_5 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1)) + Optimizer: Postgres query optimizer +(12 rows) + +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1 and c = 1) or (a = 10 and abs(b) = 5 and c = 10) or (a > 11 and a < 20) or a < 1 or a = 1; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1) OR (a = 1)) + -> Seq Scan on mc3p1 mc3p_2 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1) OR (a = 1)) + -> Seq Scan on mc3p2 mc3p_3 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1) OR (a = 1)) + -> Seq Scan on mc3p5 mc3p_4 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1) OR (a = 1)) + -> Seq Scan on mc3p_default mc3p_5 + Filter: (((a = 1) AND (abs(b) = 1) AND (c = 1)) OR ((a = 10) AND (abs(b) = 5) AND (c = 10)) OR ((a > 11) AND (a < 20)) OR (a < 1) OR (a = 1)) + Optimizer: Postgres query optimizer +(12 rows) + +explain (costs off) select * from mc3p where a = 1 or abs(b) = 1 or c = 1; + QUERY PLAN +------------------------------------------------------ + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + -> Seq Scan on mc3p1 mc3p_2 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + -> Seq Scan on mc3p2 mc3p_3 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + -> Seq Scan on mc3p3 mc3p_4 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + -> Seq Scan on mc3p4 mc3p_5 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + -> Seq Scan on mc3p5 mc3p_6 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + -> Seq Scan on mc3p6 mc3p_7 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + -> Seq Scan on mc3p7 mc3p_8 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + -> Seq Scan on mc3p_default mc3p_9 + Filter: ((a = 1) OR (abs(b) = 1) OR (c = 1)) + Optimizer: Postgres query optimizer +(20 rows) + +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1) or (a = 10 and abs(b) = 10); + QUERY PLAN +------------------------------------------------------------------------------ + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 10))) + -> Seq Scan on mc3p1 mc3p_2 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 10))) + -> Seq Scan on mc3p2 mc3p_3 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 10))) + -> Seq Scan on mc3p3 mc3p_4 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 10))) + -> Seq Scan on mc3p4 mc3p_5 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 10))) + -> Seq Scan on mc3p_default mc3p_6 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 10))) + Optimizer: Postgres query optimizer +(14 rows) + +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1) or (a = 10 and abs(b) = 9); + QUERY PLAN +----------------------------------------------------------------------------- + Append + -> Seq Scan on mc3p0 mc3p_1 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 9))) + -> Seq Scan on mc3p1 mc3p_2 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 9))) + -> Seq Scan on mc3p2 mc3p_3 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 9))) + -> Seq Scan on mc3p_default mc3p_4 + Filter: (((a = 1) AND (abs(b) = 1)) OR ((a = 10) AND (abs(b) = 9))) + Optimizer: Postgres query optimizer +(10 rows) + +-- a simpler multi-column keys case +create table mc2p (a int, b int) partition by range (a, b); +create table mc2p_default partition of mc2p default; +create table mc2p0 partition of mc2p for values from (minvalue, minvalue) to (1, minvalue); +create table mc2p1 partition of mc2p for values from (1, minvalue) to (1, 1); +create table mc2p2 partition of mc2p for values from (1, 1) to (2, minvalue); +create table mc2p3 partition of mc2p for values from (2, minvalue) to (2, 1); +create table mc2p4 partition of mc2p for values from (2, 1) to (2, maxvalue); +create table mc2p5 partition of mc2p for values from (2, maxvalue) to (maxvalue, maxvalue); +explain (costs off) select * from mc2p where a < 2; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on mc2p0 mc2p_1 + Filter: (a < 2) + -> Seq Scan on mc2p1 mc2p_2 + Filter: (a < 2) + -> Seq Scan on mc2p2 mc2p_3 + Filter: (a < 2) + -> Seq Scan on mc2p_default mc2p_4 + Filter: (a < 2) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from mc2p where a = 2 and b < 1; + QUERY PLAN +------------------------------------- + Seq Scan on mc2p3 mc2p + Filter: ((b < 1) AND (a = 2)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from mc2p where a > 1; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on mc2p2 mc2p_1 + Filter: (a > 1) + -> Seq Scan on mc2p3 mc2p_2 + Filter: (a > 1) + -> Seq Scan on mc2p4 mc2p_3 + Filter: (a > 1) + -> Seq Scan on mc2p5 mc2p_4 + Filter: (a > 1) + -> Seq Scan on mc2p_default mc2p_5 + Filter: (a > 1) + Optimizer: Postgres query optimizer +(12 rows) + +explain (costs off) select * from mc2p where a = 1 and b > 1; + QUERY PLAN +------------------------------------- + Seq Scan on mc2p2 mc2p + Filter: ((b > 1) AND (a = 1)) + Optimizer: Postgres query optimizer +(3 rows) + +-- all partitions but the default one should be pruned +explain (costs off) select * from mc2p where a = 1 and b is null; + QUERY PLAN +------------------------------------- + Seq Scan on mc2p_default mc2p + Filter: ((b IS NULL) AND (a = 1)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from mc2p where a is null and b is null; + QUERY PLAN +----------------------------------------- + Seq Scan on mc2p_default mc2p + Filter: ((a IS NULL) AND (b IS NULL)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from mc2p where a is null and b = 1; + QUERY PLAN +------------------------------------- + Seq Scan on mc2p_default mc2p + Filter: ((a IS NULL) AND (b = 1)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from mc2p where a is null; + QUERY PLAN +------------------------------------- + Seq Scan on mc2p_default mc2p + Filter: (a IS NULL) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from mc2p where b is null; + QUERY PLAN +------------------------------------- + Seq Scan on mc2p_default mc2p + Filter: (b IS NULL) + Optimizer: Postgres query optimizer +(3 rows) + +-- boolean partitioning +create table boolpart (a bool) partition by list (a); +create table boolpart_default partition of boolpart default; +create table boolpart_t partition of boolpart for values in ('true'); +create table boolpart_f partition of boolpart for values in ('false'); +explain (costs off) select * from boolpart where a in (true, false); + QUERY PLAN +------------------------------------------------ + Append + -> Seq Scan on boolpart_f boolpart_1 + Filter: (a = ANY ('{t,f}'::boolean[])) + -> Seq Scan on boolpart_t boolpart_2 + Filter: (a = ANY ('{t,f}'::boolean[])) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from boolpart where a = false; + QUERY PLAN +------------------------------------- + Seq Scan on boolpart_f boolpart + Filter: (NOT a) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from boolpart where not a = false; + QUERY PLAN +------------------------------------- + Seq Scan on boolpart_t boolpart + Filter: a + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from boolpart where a is true or a is not true; + QUERY PLAN +-------------------------------------------------- + Append + -> Seq Scan on boolpart_f boolpart_1 + Filter: ((a IS TRUE) OR (a IS NOT TRUE)) + -> Seq Scan on boolpart_t boolpart_2 + Filter: ((a IS TRUE) OR (a IS NOT TRUE)) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from boolpart where a is not true; + QUERY PLAN +------------------------------------- + Seq Scan on boolpart_f boolpart + Filter: (a IS NOT TRUE) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from boolpart where a is not true and a is not false; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from boolpart where a is unknown; + QUERY PLAN +----------------------------------------------- + Append + -> Seq Scan on boolpart_f boolpart_1 + Filter: (a IS UNKNOWN) + -> Seq Scan on boolpart_t boolpart_2 + Filter: (a IS UNKNOWN) + -> Seq Scan on boolpart_default boolpart_3 + Filter: (a IS UNKNOWN) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from boolpart where a is not unknown; + QUERY PLAN +----------------------------------------------- + Append + -> Seq Scan on boolpart_f boolpart_1 + Filter: (a IS NOT UNKNOWN) + -> Seq Scan on boolpart_t boolpart_2 + Filter: (a IS NOT UNKNOWN) + -> Seq Scan on boolpart_default boolpart_3 + Filter: (a IS NOT UNKNOWN) + Optimizer: Postgres query optimizer +(8 rows) + +create table boolrangep (a bool, b bool, c int) partition by range (a,b,c); +create table boolrangep_tf partition of boolrangep for values from ('true', 'false', 0) to ('true', 'false', 100); +create table boolrangep_ft partition of boolrangep for values from ('false', 'true', 0) to ('false', 'true', 100); +create table boolrangep_ff1 partition of boolrangep for values from ('false', 'false', 0) to ('false', 'false', 50); +create table boolrangep_ff2 partition of boolrangep for values from ('false', 'false', 50) to ('false', 'false', 100); +-- try a more complex case that's been known to trip up pruning in the past +explain (costs off) select * from boolrangep where not a and not b and c = 25; + QUERY PLAN +---------------------------------------------- + Seq Scan on boolrangep_ff1 boolrangep + Filter: ((NOT a) AND (NOT b) AND (c = 25)) + Optimizer: Postgres query optimizer +(3 rows) + +-- test scalar-to-array operators +create table coercepart (a varchar) partition by list (a); +create table coercepart_ab partition of coercepart for values in ('ab'); +create table coercepart_bc partition of coercepart for values in ('bc'); +create table coercepart_cd partition of coercepart for values in ('cd'); +explain (costs off) select * from coercepart where a in ('ab', to_char(125, '999')); + QUERY PLAN +----------------------------------------------------- + Seq Scan on coercepart_ab coercepart + Filter: ((a)::text = ANY ('{ab," 125"}'::text[])) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from coercepart where a ~ any ('{ab}'); + QUERY PLAN +---------------------------------------------------- + Append + -> Seq Scan on coercepart_ab coercepart_1 + Filter: ((a)::text ~ ANY ('{ab}'::text[])) + -> Seq Scan on coercepart_bc coercepart_2 + Filter: ((a)::text ~ ANY ('{ab}'::text[])) + -> Seq Scan on coercepart_cd coercepart_3 + Filter: ((a)::text ~ ANY ('{ab}'::text[])) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from coercepart where a !~ all ('{ab}'); + QUERY PLAN +----------------------------------------------------- + Append + -> Seq Scan on coercepart_ab coercepart_1 + Filter: ((a)::text !~ ALL ('{ab}'::text[])) + -> Seq Scan on coercepart_bc coercepart_2 + Filter: ((a)::text !~ ALL ('{ab}'::text[])) + -> Seq Scan on coercepart_cd coercepart_3 + Filter: ((a)::text !~ ALL ('{ab}'::text[])) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from coercepart where a ~ any ('{ab,bc}'); + QUERY PLAN +------------------------------------------------------- + Append + -> Seq Scan on coercepart_ab coercepart_1 + Filter: ((a)::text ~ ANY ('{ab,bc}'::text[])) + -> Seq Scan on coercepart_bc coercepart_2 + Filter: ((a)::text ~ ANY ('{ab,bc}'::text[])) + -> Seq Scan on coercepart_cd coercepart_3 + Filter: ((a)::text ~ ANY ('{ab,bc}'::text[])) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from coercepart where a !~ all ('{ab,bc}'); + QUERY PLAN +-------------------------------------------------------- + Append + -> Seq Scan on coercepart_ab coercepart_1 + Filter: ((a)::text !~ ALL ('{ab,bc}'::text[])) + -> Seq Scan on coercepart_bc coercepart_2 + Filter: ((a)::text !~ ALL ('{ab,bc}'::text[])) + -> Seq Scan on coercepart_cd coercepart_3 + Filter: ((a)::text !~ ALL ('{ab,bc}'::text[])) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from coercepart where a = any ('{ab,bc}'); + QUERY PLAN +------------------------------------------------------- + Append + -> Seq Scan on coercepart_ab coercepart_1 + Filter: ((a)::text = ANY ('{ab,bc}'::text[])) + -> Seq Scan on coercepart_bc coercepart_2 + Filter: ((a)::text = ANY ('{ab,bc}'::text[])) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) select * from coercepart where a = any ('{ab,null}'); + QUERY PLAN +--------------------------------------------------- + Seq Scan on coercepart_ab coercepart + Filter: ((a)::text = ANY ('{ab,NULL}'::text[])) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from coercepart where a = any (null::text[]); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from coercepart where a = all ('{ab}'); + QUERY PLAN +---------------------------------------------- + Seq Scan on coercepart_ab coercepart + Filter: ((a)::text = ALL ('{ab}'::text[])) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from coercepart where a = all ('{ab,bc}'); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from coercepart where a = all ('{ab,null}'); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from coercepart where a = all (null::text[]); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +drop table coercepart; +CREATE TABLE part (a INT, b INT) PARTITION BY LIST (a); +CREATE TABLE part_p1 PARTITION OF part FOR VALUES IN (-2,-1,0,1,2); +CREATE TABLE part_p2 PARTITION OF part DEFAULT PARTITION BY RANGE(a); +CREATE TABLE part_p2_p1 PARTITION OF part_p2 DEFAULT; +CREATE TABLE part_rev (b INT, c INT, a INT); +ALTER TABLE part ATTACH PARTITION part_rev FOR VALUES IN (3); -- fail +ERROR: table "part_rev" contains column "c" not found in parent "part" +DETAIL: The new partition may contain only the columns present in parent. +ALTER TABLE part_rev DROP COLUMN c; +ALTER TABLE part ATTACH PARTITION part_rev FOR VALUES IN (3); -- now it's ok +INSERT INTO part VALUES (-1,-1), (1,1), (2,NULL), (NULL,-2),(NULL,NULL); +EXPLAIN (COSTS OFF) SELECT tableoid::regclass as part, a, b FROM part WHERE a IS NULL ORDER BY 1, 2, 3; + QUERY PLAN +--------------------------------------------------------- + Sort + Sort Key: ((part.tableoid)::regclass), part.a, part.b + -> Seq Scan on part_p2_p1 part + Filter: (a IS NULL) + Optimizer: Postgres query optimizer +(5 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM part p(x) ORDER BY x; + QUERY PLAN +-------------------------------------------------- + Sort + Output: p.x, p.b + Sort Key: p.x + -> Append + -> Seq Scan on public.part_p1 p_1 + Output: p_1.x, p_1.b + -> Seq Scan on public.part_rev p_2 + Output: p_2.x, p_2.b + -> Seq Scan on public.part_p2_p1 p_3 + Output: p_3.x, p_3.b + Settings: plan_cache_mode = 'force_generic_plan' + Optimizer: Postgres query optimizer +(12 rows) + +-- +-- some more cases +-- +-- +-- pruning for partitioned table appearing inside a sub-query +-- +-- pruning won't work for mc3p, because some keys are Params +explain (costs off) select * from mc2p t1, lateral (select count(*) from mc3p t2 where t2.a = t1.b and abs(t2.b) = 1 and t2.c = 1) s where t1.a = 1; + QUERY PLAN +----------------------------------------------------------------------------- + Nested Loop + -> Append + -> Seq Scan on mc2p1 t1_1 + Filter: (a = 1) + -> Seq Scan on mc2p2 t1_2 + Filter: (a = 1) + -> Seq Scan on mc2p_default t1_3 + Filter: (a = 1) + -> Materialize + -> Aggregate + -> Append + -> Seq Scan on mc3p0 t2_1 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p1 t2_2 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p2 t2_3 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p3 t2_4 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p4 t2_5 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p5 t2_6 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p6 t2_7 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p7 t2_8 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p_default t2_9 + Filter: ((a = t1.b) AND (c = 1) AND (abs(b) = 1)) + Optimizer: Postgres query optimizer +(30 rows) + +-- pruning should work fine, because values for a prefix of keys (a, b) are +-- available +explain (costs off) select * from mc2p t1, lateral (select count(*) from mc3p t2 where t2.c = t1.b and abs(t2.b) = 1 and t2.a = 1) s where t1.a = 1; + QUERY PLAN +----------------------------------------------------------------------------- + Nested Loop + -> Append + -> Seq Scan on mc2p1 t1_1 + Filter: (a = 1) + -> Seq Scan on mc2p2 t1_2 + Filter: (a = 1) + -> Seq Scan on mc2p_default t1_3 + Filter: (a = 1) + -> Materialize + -> Aggregate + -> Append + -> Seq Scan on mc3p0 t2_1 + Filter: ((c = t1.b) AND (a = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p1 t2_2 + Filter: ((c = t1.b) AND (a = 1) AND (abs(b) = 1)) + -> Seq Scan on mc3p_default t2_3 + Filter: ((c = t1.b) AND (a = 1) AND (abs(b) = 1)) + Optimizer: Postgres query optimizer +(18 rows) + +-- also here, because values for all keys are provided +explain (costs off) select * from mc2p t1, lateral (select count(*) from mc3p t2 where t2.a = 1 and abs(t2.b) = 1 and t2.c = 1) s where t1.a = 1; + QUERY PLAN +-------------------------------------------------------------------- + Nested Loop + -> Append + -> Seq Scan on mc2p1 t1_1 + Filter: (a = 1) + -> Seq Scan on mc2p2 t1_2 + Filter: (a = 1) + -> Seq Scan on mc2p_default t1_3 + Filter: (a = 1) + -> Materialize + -> Aggregate + -> Seq Scan on mc3p1 t2 + Filter: ((a = 1) AND (c = 1) AND (abs(b) = 1)) + Optimizer: Postgres query optimizer +(13 rows) + +-- +-- pruning with clauses containing <> operator +-- +-- doesn't prune range partitions +create table rp (a int) partition by range (a); +create table rp0 partition of rp for values from (minvalue) to (1); +create table rp1 partition of rp for values from (1) to (2); +create table rp2 partition of rp for values from (2) to (maxvalue); +explain (costs off) select * from rp where a <> 1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on rp0 rp_1 + Filter: (a <> 1) + -> Seq Scan on rp1 rp_2 + Filter: (a <> 1) + -> Seq Scan on rp2 rp_3 + Filter: (a <> 1) + Optimizer: Postgres query optimizer +(8 rows) + +explain (costs off) select * from rp where a <> 1 and a <> 2; + QUERY PLAN +----------------------------------------- + Append + -> Seq Scan on rp0 rp_1 + Filter: ((a <> 1) AND (a <> 2)) + -> Seq Scan on rp1 rp_2 + Filter: ((a <> 1) AND (a <> 2)) + -> Seq Scan on rp2 rp_3 + Filter: ((a <> 1) AND (a <> 2)) + Optimizer: Postgres query optimizer +(8 rows) + +-- null partition should be eliminated due to strict <> clause. +explain (costs off) select * from lp where a <> 'a'; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on lp_ad lp_1 + Filter: (a <> 'a'::bpchar) + -> Seq Scan on lp_bc lp_2 + Filter: (a <> 'a'::bpchar) + -> Seq Scan on lp_ef lp_3 + Filter: (a <> 'a'::bpchar) + -> Seq Scan on lp_g lp_4 + Filter: (a <> 'a'::bpchar) + -> Seq Scan on lp_default lp_5 + Filter: (a <> 'a'::bpchar) + Optimizer: Postgres query optimizer +(12 rows) + +-- ensure we detect contradictions in clauses; a can't be NULL and NOT NULL. +explain (costs off) select * from lp where a <> 'a' and a is null; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from lp where (a <> 'a' and a <> 'd') or a is null; + QUERY PLAN +------------------------------------------------------------------------------ + Append + -> Seq Scan on lp_bc lp_1 + Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL)) + -> Seq Scan on lp_ef lp_2 + Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL)) + -> Seq Scan on lp_g lp_3 + Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL)) + -> Seq Scan on lp_null lp_4 + Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL)) + -> Seq Scan on lp_default lp_5 + Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL)) + Optimizer: Postgres query optimizer +(12 rows) + +-- check that it also works for a partitioned table that's not root, +-- which in this case are partitions of rlp that are themselves +-- list-partitioned on b +explain (costs off) select * from rlp where a = 15 and b <> 'ab' and b <> 'cd' and b <> 'xy' and b is not null; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------ + Append + -> Seq Scan on rlp3efgh rlp_1 + Filter: ((b IS NOT NULL) AND ((b)::text <> 'ab'::text) AND ((b)::text <> 'cd'::text) AND ((b)::text <> 'xy'::text) AND (a = 15)) + -> Seq Scan on rlp3_default rlp_2 + Filter: ((b IS NOT NULL) AND ((b)::text <> 'ab'::text) AND ((b)::text <> 'cd'::text) AND ((b)::text <> 'xy'::text) AND (a = 15)) + Optimizer: Postgres query optimizer +(6 rows) + +-- +-- different collations for different keys with same expression +-- +create table coll_pruning_multi (a text) partition by range (substr(a, 1) collate "POSIX", substr(a, 1) collate "C"); +create table coll_pruning_multi1 partition of coll_pruning_multi for values from ('a', 'a') to ('a', 'e'); +create table coll_pruning_multi2 partition of coll_pruning_multi for values from ('a', 'e') to ('a', 'z'); +create table coll_pruning_multi3 partition of coll_pruning_multi for values from ('b', 'a') to ('b', 'e'); +-- no pruning, because no value for the leading key +explain (costs off) select * from coll_pruning_multi where substr(a, 1) = 'e' collate "C"; + QUERY PLAN +------------------------------------------------------------ + Append + -> Seq Scan on coll_pruning_multi1 coll_pruning_multi_1 + Filter: (substr(a, 1) = 'e'::text COLLATE "C") + -> Seq Scan on coll_pruning_multi2 coll_pruning_multi_2 + Filter: (substr(a, 1) = 'e'::text COLLATE "C") + -> Seq Scan on coll_pruning_multi3 coll_pruning_multi_3 + Filter: (substr(a, 1) = 'e'::text COLLATE "C") + Optimizer: Postgres query optimizer +(8 rows) + +-- pruning, with a value provided for the leading key +explain (costs off) select * from coll_pruning_multi where substr(a, 1) = 'a' collate "POSIX"; + QUERY PLAN +------------------------------------------------------------ + Append + -> Seq Scan on coll_pruning_multi1 coll_pruning_multi_1 + Filter: (substr(a, 1) = 'a'::text COLLATE "POSIX") + -> Seq Scan on coll_pruning_multi2 coll_pruning_multi_2 + Filter: (substr(a, 1) = 'a'::text COLLATE "POSIX") + Optimizer: Postgres query optimizer +(6 rows) + +-- pruning, with values provided for both keys +explain (costs off) select * from coll_pruning_multi where substr(a, 1) = 'e' collate "C" and substr(a, 1) = 'a' collate "POSIX"; + QUERY PLAN +--------------------------------------------------------------------------------------------------- + Seq Scan on coll_pruning_multi2 coll_pruning_multi + Filter: ((substr(a, 1) = 'e'::text COLLATE "C") AND (substr(a, 1) = 'a'::text COLLATE "POSIX")) + Optimizer: Postgres query optimizer +(3 rows) + +-- +-- LIKE operators don't prune +-- +create table like_op_noprune (a text) partition by list (a); +create table like_op_noprune1 partition of like_op_noprune for values in ('ABC'); +create table like_op_noprune2 partition of like_op_noprune for values in ('BCD'); +explain (costs off) select * from like_op_noprune where a like '%BC'; + QUERY PLAN +------------------------------------------------------ + Append + -> Seq Scan on like_op_noprune1 like_op_noprune_1 + Filter: (a ~~ '%BC'::text) + -> Seq Scan on like_op_noprune2 like_op_noprune_2 + Filter: (a ~~ '%BC'::text) + Optimizer: Postgres query optimizer +(6 rows) + +-- +-- tests wherein clause value requires a cross-type comparison function +-- +create table lparted_by_int2 (a smallint) partition by list (a); +create table lparted_by_int2_1 partition of lparted_by_int2 for values in (1); +create table lparted_by_int2_16384 partition of lparted_by_int2 for values in (16384); +explain (costs off) select * from lparted_by_int2 where a = 100000000000000; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +create table rparted_by_int2 (a smallint) partition by range (a); +create table rparted_by_int2_1 partition of rparted_by_int2 for values from (1) to (10); +create table rparted_by_int2_16384 partition of rparted_by_int2 for values from (10) to (16384); +-- all partitions pruned +explain (costs off) select * from rparted_by_int2 where a > 100000000000000; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +create table rparted_by_int2_maxvalue partition of rparted_by_int2 for values from (16384) to (maxvalue); +-- all partitions but rparted_by_int2_maxvalue pruned +explain (costs off) select * from rparted_by_int2 where a > 100000000000000; + QUERY PLAN +------------------------------------------------------ + Seq Scan on rparted_by_int2_maxvalue rparted_by_int2 + Filter: (a > '100000000000000'::bigint) + Optimizer: Postgres query optimizer +(3 rows) + +drop table lp, coll_pruning, rlp, mc3p, mc2p, boolpart, boolrangep, rp, coll_pruning_multi, like_op_noprune, lparted_by_int2, rparted_by_int2; +-- +-- Test Partition pruning for HASH partitioning +-- +-- Use hand-rolled hash functions and operator classes to get predictable +-- result on different machines. See the definitions of +-- part_part_test_int4_ops and part_test_text_ops in insert.sql. +-- +create table hp (a int, b text, c int) + partition by hash (a part_test_int4_ops, b part_test_text_ops); +create table hp0 partition of hp for values with (modulus 4, remainder 0); +create table hp3 partition of hp for values with (modulus 4, remainder 3); +create table hp1 partition of hp for values with (modulus 4, remainder 1); +create table hp2 partition of hp for values with (modulus 4, remainder 2); +insert into hp values (null, null, 0); +insert into hp values (1, null, 1); +insert into hp values (1, 'xxx', 2); +insert into hp values (null, 'xxx', 3); +insert into hp values (2, 'xxx', 4); +insert into hp values (1, 'abcde', 5); +select tableoid::regclass, * from hp order by c; + tableoid | a | b | c +----------+---+-------+--- + hp0 | | | 0 + hp1 | 1 | | 1 + hp0 | 1 | xxx | 2 + hp2 | | xxx | 3 + hp3 | 2 | xxx | 4 + hp2 | 1 | abcde | 5 +(6 rows) + +-- partial keys won't prune, nor would non-equality conditions +explain (costs off) select * from hp where a = 1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on hp0 hp_1 + Filter: (a = 1) + -> Seq Scan on hp1 hp_2 + Filter: (a = 1) + -> Seq Scan on hp2 hp_3 + Filter: (a = 1) + -> Seq Scan on hp3 hp_4 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from hp where b = 'xxx'; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on hp0 hp_1 + Filter: (b = 'xxx'::text) + -> Seq Scan on hp1 hp_2 + Filter: (b = 'xxx'::text) + -> Seq Scan on hp2 hp_3 + Filter: (b = 'xxx'::text) + -> Seq Scan on hp3 hp_4 + Filter: (b = 'xxx'::text) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from hp where a is null; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on hp0 hp_1 + Filter: (a IS NULL) + -> Seq Scan on hp1 hp_2 + Filter: (a IS NULL) + -> Seq Scan on hp2 hp_3 + Filter: (a IS NULL) + -> Seq Scan on hp3 hp_4 + Filter: (a IS NULL) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from hp where b is null; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on hp0 hp_1 + Filter: (b IS NULL) + -> Seq Scan on hp1 hp_2 + Filter: (b IS NULL) + -> Seq Scan on hp2 hp_3 + Filter: (b IS NULL) + -> Seq Scan on hp3 hp_4 + Filter: (b IS NULL) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from hp where a < 1 and b = 'xxx'; + QUERY PLAN +------------------------------------------------- + Append + -> Seq Scan on hp0 hp_1 + Filter: ((a < 1) AND (b = 'xxx'::text)) + -> Seq Scan on hp1 hp_2 + Filter: ((a < 1) AND (b = 'xxx'::text)) + -> Seq Scan on hp2 hp_3 + Filter: ((a < 1) AND (b = 'xxx'::text)) + -> Seq Scan on hp3 hp_4 + Filter: ((a < 1) AND (b = 'xxx'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from hp where a <> 1 and b = 'yyy'; + QUERY PLAN +-------------------------------------------------- + Append + -> Seq Scan on hp0 hp_1 + Filter: ((a <> 1) AND (b = 'yyy'::text)) + -> Seq Scan on hp1 hp_2 + Filter: ((a <> 1) AND (b = 'yyy'::text)) + -> Seq Scan on hp2 hp_3 + Filter: ((a <> 1) AND (b = 'yyy'::text)) + -> Seq Scan on hp3 hp_4 + Filter: ((a <> 1) AND (b = 'yyy'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) select * from hp where a <> 1 and b <> 'xxx'; + QUERY PLAN +--------------------------------------------------- + Append + -> Seq Scan on hp0 hp_1 + Filter: ((a <> 1) AND (b <> 'xxx'::text)) + -> Seq Scan on hp1 hp_2 + Filter: ((a <> 1) AND (b <> 'xxx'::text)) + -> Seq Scan on hp2 hp_3 + Filter: ((a <> 1) AND (b <> 'xxx'::text)) + -> Seq Scan on hp3 hp_4 + Filter: ((a <> 1) AND (b <> 'xxx'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +-- pruning should work if either a value or a IS NULL clause is provided for +-- each of the keys +explain (costs off) select * from hp where a is null and b is null; + QUERY PLAN +----------------------------------------- + Seq Scan on hp0 hp + Filter: ((a IS NULL) AND (b IS NULL)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from hp where a = 1 and b is null; + QUERY PLAN +------------------------------------- + Seq Scan on hp1 hp + Filter: ((b IS NULL) AND (a = 1)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from hp where a = 1 and b = 'xxx'; + QUERY PLAN +------------------------------------------- + Seq Scan on hp0 hp + Filter: ((a = 1) AND (b = 'xxx'::text)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from hp where a is null and b = 'xxx'; + QUERY PLAN +----------------------------------------------- + Seq Scan on hp2 hp + Filter: ((a IS NULL) AND (b = 'xxx'::text)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from hp where a = 2 and b = 'xxx'; + QUERY PLAN +------------------------------------------- + Seq Scan on hp3 hp + Filter: ((a = 2) AND (b = 'xxx'::text)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from hp where a = 1 and b = 'abcde'; + QUERY PLAN +--------------------------------------------- + Seq Scan on hp2 hp + Filter: ((a = 1) AND (b = 'abcde'::text)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from hp where (a = 1 and b = 'abcde') or (a = 2 and b = 'xxx') or (a is null and b is null); + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------- + Append + -> Seq Scan on hp0 hp_1 + Filter: (((a = 1) AND (b = 'abcde'::text)) OR ((a = 2) AND (b = 'xxx'::text)) OR ((a IS NULL) AND (b IS NULL))) + -> Seq Scan on hp2 hp_2 + Filter: (((a = 1) AND (b = 'abcde'::text)) OR ((a = 2) AND (b = 'xxx'::text)) OR ((a IS NULL) AND (b IS NULL))) + -> Seq Scan on hp3 hp_3 + Filter: (((a = 1) AND (b = 'abcde'::text)) OR ((a = 2) AND (b = 'xxx'::text)) OR ((a IS NULL) AND (b IS NULL))) + Optimizer: Postgres query optimizer +(8 rows) + +-- test pruning when not all the partitions exist +drop table hp1; +drop table hp3; +explain (costs off) select * from hp where a = 1 and b = 'abcde'; + QUERY PLAN +--------------------------------------------- + Seq Scan on hp2 hp + Filter: ((a = 1) AND (b = 'abcde'::text)) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from hp where a = 1 and b = 'abcde' and + (c = 2 or c = 3); + QUERY PLAN +---------------------------------------------------------------------- + Seq Scan on hp2 hp + Filter: ((a = 1) AND (b = 'abcde'::text) AND ((c = 2) OR (c = 3))) + Optimizer: Postgres query optimizer +(3 rows) + +drop table hp2; +explain (costs off) select * from hp where a = 1 and b = 'abcde' and + (c = 2 or c = 3); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +drop table hp; +-- +-- Test runtime partition pruning +-- +create table ab (a int not null, b int not null) partition by list (a); +create table ab_a2 partition of ab for values in(2) partition by list (b); +create table ab_a2_b1 partition of ab_a2 for values in (1); +create table ab_a2_b2 partition of ab_a2 for values in (2); +create table ab_a2_b3 partition of ab_a2 for values in (3); +create table ab_a1 partition of ab for values in(1) partition by list (b); +create table ab_a1_b1 partition of ab_a1 for values in (1); +create table ab_a1_b2 partition of ab_a1 for values in (2); +create table ab_a1_b3 partition of ab_a1 for values in (3); +create table ab_a3 partition of ab for values in(3) partition by list (b); +create table ab_a3_b1 partition of ab_a3 for values in (1); +create table ab_a3_b2 partition of ab_a3 for values in (2); +create table ab_a3_b3 partition of ab_a3 for values in (3); +-- Disallow index only scans as concurrent transactions may stop visibility +-- bits being set causing "Heap Fetches" to be unstable in the EXPLAIN ANALYZE +-- output. +set enable_indexonlyscan = off; +prepare ab_q1 (int, int, int) as +select * from ab where a between $1 and $2 and b <= $3; +explain (analyze, costs off, summary off, timing off) execute ab_q1 (2, 2, 3); + QUERY PLAN +--------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 6 + -> Seq Scan on ab_a2_b1 ab_1 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + -> Seq Scan on ab_a2_b2 ab_2 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + -> Seq Scan on ab_a2_b3 ab_3 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + Optimizer: Postgres query optimizer +(9 rows) + +explain (analyze, costs off, summary off, timing off) execute ab_q1 (1, 2, 3); + QUERY PLAN +--------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 3 + -> Seq Scan on ab_a1_b1 ab_1 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + -> Seq Scan on ab_a1_b2 ab_2 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + -> Seq Scan on ab_a1_b3 ab_3 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + -> Seq Scan on ab_a2_b1 ab_4 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + -> Seq Scan on ab_a2_b2 ab_5 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + -> Seq Scan on ab_a2_b3 ab_6 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b <= $3)) + Optimizer: Postgres query optimizer +(15 rows) + +deallocate ab_q1; +-- Runtime pruning after optimizer pruning +prepare ab_q1 (int, int) as +select a from ab where a between $1 and $2 and b < 3; +explain (analyze, costs off, summary off, timing off) execute ab_q1 (2, 2); + QUERY PLAN +--------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 4 + -> Seq Scan on ab_a2_b1 ab_1 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b < 3)) + -> Seq Scan on ab_a2_b2 ab_2 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b < 3)) + Optimizer: Postgres query optimizer +(7 rows) + +explain (analyze, costs off, summary off, timing off) execute ab_q1 (2, 4); + QUERY PLAN +--------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 2 + -> Seq Scan on ab_a2_b1 ab_1 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b < 3)) + -> Seq Scan on ab_a2_b2 ab_2 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b < 3)) + -> Seq Scan on ab_a3_b1 ab_3 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b < 3)) + -> Seq Scan on ab_a3_b2 ab_4 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b < 3)) + Optimizer: Postgres query optimizer +(11 rows) + +-- Ensure a mix of PARAM_EXTERN and PARAM_EXEC Params work together at +-- different levels of partitioning. +prepare ab_q2 (int, int) as +select a from ab where a between $1 and $2 and b < (select 3); +explain (analyze, costs off, summary off, timing off) execute ab_q2 (2, 2); + QUERY PLAN +--------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 6 + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Seq Scan on ab_a2_b1 ab_1 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b < $0)) + -> Seq Scan on ab_a2_b2 ab_2 (actual rows=0 loops=1) + Filter: ((a >= $1) AND (a <= $2) AND (b < $0)) + -> Seq Scan on ab_a2_b3 ab_3 (never executed) + Filter: ((a >= $1) AND (a <= $2) AND (b < $0)) + Optimizer: Postgres query optimizer +(11 rows) + +-- As above, but swap the PARAM_EXEC Param to the first partition level +prepare ab_q3 (int, int) as +select a from ab where b between $1 and $2 and a < (select 3); +explain (analyze, costs off, summary off, timing off) execute ab_q3 (2, 2); + QUERY PLAN +--------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 6 + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Seq Scan on ab_a1_b2 ab_1 (actual rows=0 loops=1) + Filter: ((b >= $1) AND (b <= $2) AND (a < $0)) + -> Seq Scan on ab_a2_b2 ab_2 (actual rows=0 loops=1) + Filter: ((b >= $1) AND (b <= $2) AND (a < $0)) + -> Seq Scan on ab_a3_b2 ab_3 (never executed) + Filter: ((b >= $1) AND (b <= $2) AND (a < $0)) + Optimizer: Postgres query optimizer +(11 rows) + +-- Test a backwards Append scan +create table list_part (a int) partition by list (a); +create table list_part1 partition of list_part for values in (1); +create table list_part2 partition of list_part for values in (2); +create table list_part3 partition of list_part for values in (3); +create table list_part4 partition of list_part for values in (4); +insert into list_part select generate_series(1,4); +begin; +-- Don't select an actual value out of the table as the order of the Append's +-- subnodes may not be stable. +declare cur SCROLL CURSOR for select 1 from list_part where a > (select 1) and a < (select 4); +-- move beyond the final row +move 3 from cur; +-- Ensure we get two rows. +fetch backward all from cur; +ERROR: backward scan is not supported in this version of Cloudberry Database +commit; +begin; +-- Test run-time pruning using stable functions +create function list_part_fn(int) returns int as $$ begin return $1; end;$$ language plpgsql stable; +-- Ensure pruning works using a stable function containing no Vars +explain (analyze, costs off, summary off, timing off) select * from list_part where a = list_part_fn(1); + QUERY PLAN +---------------------------------------------------------- + Seq Scan on list_part1 list_part (actual rows=1 loops=1) + Filter: (a = 1) + Optimizer: Postgres query optimizer +(3 rows) + +-- Ensure pruning does not take place when the function has a Var parameter +explain (analyze, costs off, summary off, timing off) select * from list_part where a = list_part_fn(a); + QUERY PLAN +------------------------------------------------------------------ + Append (actual rows=4 loops=1) + -> Seq Scan on list_part1 list_part_1 (actual rows=1 loops=1) + Filter: (a = list_part_fn(a)) + -> Seq Scan on list_part2 list_part_2 (actual rows=1 loops=1) + Filter: (a = list_part_fn(a)) + -> Seq Scan on list_part3 list_part_3 (actual rows=1 loops=1) + Filter: (a = list_part_fn(a)) + -> Seq Scan on list_part4 list_part_4 (actual rows=1 loops=1) + Filter: (a = list_part_fn(a)) + Optimizer: Postgres query optimizer +(10 rows) + +-- Ensure pruning does not take place when the expression contains a Var. +explain (analyze, costs off, summary off, timing off) select * from list_part where a = list_part_fn(1) + a; + QUERY PLAN +------------------------------------------------------------------ + Append (actual rows=0 loops=1) + -> Seq Scan on list_part1 list_part_1 (actual rows=0 loops=1) + Filter: (a = (1 + a)) + Rows Removed by Filter: 1 + -> Seq Scan on list_part2 list_part_2 (actual rows=0 loops=1) + Filter: (a = (1 + a)) + Rows Removed by Filter: 1 + -> Seq Scan on list_part3 list_part_3 (actual rows=0 loops=1) + Filter: (a = (1 + a)) + Rows Removed by Filter: 1 + -> Seq Scan on list_part4 list_part_4 (actual rows=0 loops=1) + Filter: (a = (1 + a)) + Rows Removed by Filter: 1 + Optimizer: Postgres query optimizer +(14 rows) + +rollback; +drop table list_part; +-- Parallel append +-- Parallel queries won't necessarily get as many workers as the planner +-- asked for. This affects not only the "Workers Launched:" field of EXPLAIN +-- results, but also row counts and loop counts for parallel scans, Gathers, +-- and everything in between. This function filters out the values we can't +-- rely on to be stable. +-- This removes enough info that you might wonder why bother with EXPLAIN +-- ANALYZE at all. The answer is that we need to see '(never executed)' +-- notations because that's the only way to verify runtime pruning. +create function explain_parallel_append(text) returns setof text +language plpgsql as +$$ +declare + ln text; +begin + for ln in + execute format('explain (analyze, costs off, summary off, timing off) %s', + $1) + loop + ln := regexp_replace(ln, 'Workers Launched: \d+', 'Workers Launched: N'); + ln := regexp_replace(ln, 'actual rows=\d+ loops=\d+', 'actual rows=N loops=N'); + ln := regexp_replace(ln, 'Rows Removed by Filter: \d+', 'Rows Removed by Filter: N'); + return next ln; + end loop; +end; +$$; +prepare ab_q4 (int, int) as +select avg(a) from ab where a between $1 and $2 and b < 4; +-- Encourage use of parallel plans +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set min_parallel_table_scan_size = 0; +set max_parallel_workers_per_gather = 2; +select explain_parallel_append('execute ab_q4 (2, 2)'); + explain_parallel_append +--------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + -> Append (actual rows=N loops=N) + Subplans Removed: 6 + -> Seq Scan on ab_a2_b1 ab_1 (actual rows=N loops=N) + Filter: ((a >= $1) AND (a <= $2) AND (b < 4)) + -> Seq Scan on ab_a2_b2 ab_2 (actual rows=N loops=N) + Filter: ((a >= $1) AND (a <= $2) AND (b < 4)) + -> Seq Scan on ab_a2_b3 ab_3 (actual rows=N loops=N) + Filter: ((a >= $1) AND (a <= $2) AND (b < 4)) + Optimizer: Postgres query optimizer +(10 rows) + +-- Test run-time pruning with IN lists. +prepare ab_q5 (int, int, int) as +select avg(a) from ab where a in($1,$2,$3) and b < 4; +select explain_parallel_append('execute ab_q5 (1, 1, 1)'); + explain_parallel_append +------------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + -> Append (actual rows=N loops=N) + Subplans Removed: 6 + -> Seq Scan on ab_a1_b1 ab_1 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + -> Seq Scan on ab_a1_b2 ab_2 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + -> Seq Scan on ab_a1_b3 ab_3 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + Optimizer: Postgres query optimizer +(10 rows) + +select explain_parallel_append('execute ab_q5 (2, 3, 3)'); + explain_parallel_append +------------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + -> Append (actual rows=N loops=N) + Subplans Removed: 3 + -> Seq Scan on ab_a2_b1 ab_1 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + -> Seq Scan on ab_a2_b2 ab_2 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + -> Seq Scan on ab_a2_b3 ab_3 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + -> Seq Scan on ab_a3_b1 ab_4 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + -> Seq Scan on ab_a3_b2 ab_5 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + -> Seq Scan on ab_a3_b3 ab_6 (actual rows=N loops=N) + Filter: ((b < 4) AND (a = ANY (ARRAY[$1, $2, $3]))) + Optimizer: Postgres query optimizer +(16 rows) + +-- Try some params whose values do not belong to any partition. +select explain_parallel_append('execute ab_q5 (33, 44, 55)'); + explain_parallel_append +-------------------------------------- + Aggregate (actual rows=N loops=N) + -> Append (actual rows=N loops=N) + Subplans Removed: 9 + Optimizer: Postgres query optimizer +(4 rows) + +-- Test Parallel Append with PARAM_EXEC Params +select explain_parallel_append('select count(*) from ab where (a = (select 1) or a = (select 3)) and b = 2'); + explain_parallel_append +--------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + InitPlan 1 (returns $0) + -> Result (actual rows=N loops=N) + InitPlan 2 (returns $1) + -> Result (actual rows=N loops=N) + -> Append (actual rows=N loops=N) + -> Seq Scan on ab_a1_b2 ab_1 (actual rows=N loops=N) + Filter: ((b = 2) AND ((a = $0) OR (a = $1))) + -> Seq Scan on ab_a2_b2 ab_2 (never executed) + Filter: ((b = 2) AND ((a = $0) OR (a = $1))) + -> Seq Scan on ab_a3_b2 ab_3 (actual rows=N loops=N) + Filter: ((b = 2) AND ((a = $0) OR (a = $1))) + Optimizer: Postgres query optimizer +(13 rows) + +-- Test pruning during parallel nested loop query +create table lprt_a (a int not null); +-- Insert some values we won't find in ab +insert into lprt_a select 0 from generate_series(1,100); +-- and insert some values that we should find. +insert into lprt_a values(1),(1); +analyze lprt_a; +create index ab_a2_b1_a_idx on ab_a2_b1 (a); +create index ab_a2_b2_a_idx on ab_a2_b2 (a); +create index ab_a2_b3_a_idx on ab_a2_b3 (a); +create index ab_a1_b1_a_idx on ab_a1_b1 (a); +create index ab_a1_b2_a_idx on ab_a1_b2 (a); +create index ab_a1_b3_a_idx on ab_a1_b3 (a); +create index ab_a3_b1_a_idx on ab_a3_b1 (a); +create index ab_a3_b2_a_idx on ab_a3_b2 (a); +create index ab_a3_b3_a_idx on ab_a3_b3 (a); +set enable_hashjoin = 0; +set enable_mergejoin = 0; +set enable_memoize = 0; +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a where a.a in(0, 0, 1)'); + explain_parallel_append +------------------------------------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + -> Merge Join (actual rows=N loops=N) + Merge Cond: (ab.a = a.a) + -> Sort (actual rows=N loops=N) + Sort Key: ab.a + Sort Method: quicksort Memory: 25kB + -> Append (actual rows=N loops=N) + -> Bitmap Heap Scan on ab_a1_b1 ab_1 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{0,0,1}'::integer[])) + -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{0,0,1}'::integer[])) + -> Bitmap Heap Scan on ab_a1_b2 ab_2 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{0,0,1}'::integer[])) + -> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{0,0,1}'::integer[])) + -> Bitmap Heap Scan on ab_a1_b3 ab_3 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{0,0,1}'::integer[])) + -> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{0,0,1}'::integer[])) + -> Sort (never executed) + Sort Key: a.a + -> Seq Scan on lprt_a a (never executed) + Filter: (a = ANY ('{0,0,1}'::integer[])) + Optimizer: Postgres query optimizer +(24 rows) + +-- Ensure the same partitions are pruned when we make the nested loop +-- parameter an Expr rather than a plain Param. +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a + 0 where a.a in(0, 0, 1)'); + explain_parallel_append +-------------------------------------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + -> Nested Loop (actual rows=N loops=N) + -> Seq Scan on lprt_a a (actual rows=N loops=N) + Filter: (a = ANY ('{0,0,1}'::integer[])) + -> Append (actual rows=N loops=N) + -> Index Scan using ab_a1_b1_a_idx on ab_a1_b1 ab_1 (actual rows=N loops=N) + Index Cond: (a = (a.a + 0)) + -> Index Scan using ab_a1_b2_a_idx on ab_a1_b2 ab_2 (actual rows=N loops=N) + Index Cond: (a = (a.a + 0)) + -> Index Scan using ab_a1_b3_a_idx on ab_a1_b3 ab_3 (actual rows=N loops=N) + Index Cond: (a = (a.a + 0)) + -> Index Scan using ab_a2_b1_a_idx on ab_a2_b1 ab_4 (never executed) + Index Cond: (a = (a.a + 0)) + -> Index Scan using ab_a2_b2_a_idx on ab_a2_b2 ab_5 (never executed) + Index Cond: (a = (a.a + 0)) + -> Index Scan using ab_a2_b3_a_idx on ab_a2_b3 ab_6 (never executed) + Index Cond: (a = (a.a + 0)) + -> Index Scan using ab_a3_b1_a_idx on ab_a3_b1 ab_7 (never executed) + Index Cond: (a = (a.a + 0)) + -> Index Scan using ab_a3_b2_a_idx on ab_a3_b2 ab_8 (never executed) + Index Cond: (a = (a.a + 0)) + -> Index Scan using ab_a3_b3_a_idx on ab_a3_b3 ab_9 (never executed) + Index Cond: (a = (a.a + 0)) + Optimizer: Postgres query optimizer +(24 rows) + +insert into lprt_a values(3),(3); +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a where a.a in(1, 0, 3)'); + explain_parallel_append +------------------------------------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + -> Merge Join (actual rows=N loops=N) + Merge Cond: (ab.a = a.a) + -> Sort (actual rows=N loops=N) + Sort Key: ab.a + Sort Method: quicksort Memory: 25kB + -> Append (actual rows=N loops=N) + -> Bitmap Heap Scan on ab_a1_b1 ab_1 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Heap Scan on ab_a1_b2 ab_2 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Heap Scan on ab_a1_b3 ab_3 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Heap Scan on ab_a3_b1 ab_4 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Index Scan on ab_a3_b1_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Heap Scan on ab_a3_b2 ab_5 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Index Scan on ab_a3_b2_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Heap Scan on ab_a3_b3 ab_6 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Bitmap Index Scan on ab_a3_b3_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,3}'::integer[])) + -> Sort (never executed) + Sort Key: a.a + -> Seq Scan on lprt_a a (never executed) + Filter: (a = ANY ('{1,0,3}'::integer[])) + Optimizer: Postgres query optimizer +(36 rows) + +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a where a.a in(1, 0, 0)'); + explain_parallel_append +------------------------------------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + -> Merge Join (actual rows=N loops=N) + Merge Cond: (ab.a = a.a) + -> Sort (actual rows=N loops=N) + Sort Key: ab.a + Sort Method: quicksort Memory: 25kB + -> Append (actual rows=N loops=N) + -> Bitmap Heap Scan on ab_a1_b1 ab_1 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Heap Scan on ab_a1_b2 ab_2 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Heap Scan on ab_a1_b3 ab_3 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Sort (never executed) + Sort Key: a.a + -> Seq Scan on lprt_a a (never executed) + Filter: (a = ANY ('{1,0,0}'::integer[])) + Optimizer: Postgres query optimizer +(24 rows) + +delete from lprt_a where a = 1; +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a where a.a in(1, 0, 0)'); + explain_parallel_append +------------------------------------------------------------------------------------------- + Aggregate (actual rows=N loops=N) + -> Merge Join (actual rows=N loops=N) + Merge Cond: (ab.a = a.a) + -> Sort (actual rows=N loops=N) + Sort Key: ab.a + Sort Method: quicksort Memory: 25kB + -> Append (actual rows=N loops=N) + -> Bitmap Heap Scan on ab_a1_b1 ab_1 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Heap Scan on ab_a1_b2 ab_2 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Heap Scan on ab_a1_b3 ab_3 (actual rows=N loops=N) + Recheck Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=N loops=N) + Index Cond: (a = ANY ('{1,0,0}'::integer[])) + -> Sort (never executed) + Sort Key: a.a + -> Seq Scan on lprt_a a (never executed) + Filter: (a = ANY ('{1,0,0}'::integer[])) + Optimizer: Postgres query optimizer +(24 rows) + +reset enable_hashjoin; +reset enable_mergejoin; +reset enable_memoize; +reset parallel_setup_cost; +reset parallel_tuple_cost; +reset min_parallel_table_scan_size; +reset max_parallel_workers_per_gather; +-- Test run-time partition pruning with an initplan +explain (analyze, costs off, summary off, timing off) +select * from ab where a = (select max(a) from lprt_a) and b = (select max(a)-1 from lprt_a); + QUERY PLAN +------------------------------------------------------------------------- + Append (actual rows=0 loops=1) + InitPlan 1 (returns $0) + -> Aggregate (actual rows=1 loops=1) + -> Seq Scan on lprt_a (actual rows=102 loops=1) + InitPlan 2 (returns $1) + -> Aggregate (actual rows=1 loops=1) + -> Seq Scan on lprt_a lprt_a_1 (actual rows=102 loops=1) + -> Bitmap Heap Scan on ab_a1_b1 ab_1 (never executed) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a1_b1_a_idx (never executed) + Index Cond: (a = $0) + -> Bitmap Heap Scan on ab_a1_b2 ab_2 (never executed) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a1_b2_a_idx (never executed) + Index Cond: (a = $0) + -> Bitmap Heap Scan on ab_a1_b3 ab_3 (never executed) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a1_b3_a_idx (never executed) + Index Cond: (a = $0) + -> Bitmap Heap Scan on ab_a2_b1 ab_4 (never executed) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a2_b1_a_idx (never executed) + Index Cond: (a = $0) + -> Bitmap Heap Scan on ab_a2_b2 ab_5 (never executed) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a2_b2_a_idx (never executed) + Index Cond: (a = $0) + -> Bitmap Heap Scan on ab_a2_b3 ab_6 (never executed) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a2_b3_a_idx (never executed) + Index Cond: (a = $0) + -> Bitmap Heap Scan on ab_a3_b1 ab_7 (never executed) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a3_b1_a_idx (never executed) + Index Cond: (a = $0) + -> Bitmap Heap Scan on ab_a3_b2 ab_8 (actual rows=0 loops=1) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a3_b2_a_idx (actual rows=0 loops=1) + Index Cond: (a = $0) + -> Bitmap Heap Scan on ab_a3_b3 ab_9 (never executed) + Recheck Cond: (a = $0) + Filter: (b = $1) + -> Bitmap Index Scan on ab_a3_b3_a_idx (never executed) + Index Cond: (a = $0) + Optimizer: Postgres query optimizer +(53 rows) + +-- Test run-time partition pruning with UNION ALL parents +explain (analyze, costs off, summary off, timing off) +select * from (select * from ab where a = 1 union all select * from ab) ab where b = (select 1); + QUERY PLAN +------------------------------------------------------------------------------- + Append (actual rows=0 loops=1) + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Append (actual rows=0 loops=1) + -> Bitmap Heap Scan on ab_a1_b1 ab_11 (actual rows=0 loops=1) + Recheck Cond: (a = 1) + Filter: (b = $0) + -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1) + Index Cond: (a = 1) + -> Bitmap Heap Scan on ab_a1_b2 ab_12 (never executed) + Recheck Cond: (a = 1) + Filter: (b = $0) + -> Bitmap Index Scan on ab_a1_b2_a_idx (never executed) + Index Cond: (a = 1) + -> Bitmap Heap Scan on ab_a1_b3 ab_13 (never executed) + Recheck Cond: (a = 1) + Filter: (b = $0) + -> Bitmap Index Scan on ab_a1_b3_a_idx (never executed) + Index Cond: (a = 1) + -> Seq Scan on ab_a1_b1 ab_1 (actual rows=0 loops=1) + Filter: (b = $0) + -> Seq Scan on ab_a1_b2 ab_2 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a1_b3 ab_3 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a2_b1 ab_4 (actual rows=0 loops=1) + Filter: (b = $0) + -> Seq Scan on ab_a2_b2 ab_5 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a2_b3 ab_6 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a3_b1 ab_7 (actual rows=0 loops=1) + Filter: (b = $0) + -> Seq Scan on ab_a3_b2 ab_8 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a3_b3 ab_9 (never executed) + Filter: (b = $0) + Optimizer: Postgres query optimizer +(38 rows) + +-- A case containing a UNION ALL with a non-partitioned child. +explain (analyze, costs off, summary off, timing off) +select * from (select * from ab where a = 1 union all (values(10,5)) union all select * from ab) ab where b = (select 1); + QUERY PLAN +------------------------------------------------------------------------------- + Append (actual rows=0 loops=1) + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Append (actual rows=0 loops=1) + -> Bitmap Heap Scan on ab_a1_b1 ab_11 (actual rows=0 loops=1) + Recheck Cond: (a = 1) + Filter: (b = $0) + -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1) + Index Cond: (a = 1) + -> Bitmap Heap Scan on ab_a1_b2 ab_12 (never executed) + Recheck Cond: (a = 1) + Filter: (b = $0) + -> Bitmap Index Scan on ab_a1_b2_a_idx (never executed) + Index Cond: (a = 1) + -> Bitmap Heap Scan on ab_a1_b3 ab_13 (never executed) + Recheck Cond: (a = 1) + Filter: (b = $0) + -> Bitmap Index Scan on ab_a1_b3_a_idx (never executed) + Index Cond: (a = 1) + -> Result (actual rows=0 loops=1) + One-Time Filter: (5 = $0) + -> Seq Scan on ab_a1_b1 ab_1 (actual rows=0 loops=1) + Filter: (b = $0) + -> Seq Scan on ab_a1_b2 ab_2 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a1_b3 ab_3 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a2_b1 ab_4 (actual rows=0 loops=1) + Filter: (b = $0) + -> Seq Scan on ab_a2_b2 ab_5 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a2_b3 ab_6 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a3_b1 ab_7 (actual rows=0 loops=1) + Filter: (b = $0) + -> Seq Scan on ab_a3_b2 ab_8 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a3_b3 ab_9 (never executed) + Filter: (b = $0) + Optimizer: Postgres query optimizer +(40 rows) + +-- Another UNION ALL test, but containing a mix of exec init and exec run-time pruning. +create table xy_1 (x int, y int); +insert into xy_1 values(100,-10); +set enable_bitmapscan = 0; +set enable_indexscan = 0; +prepare ab_q6 as +select * from ( + select tableoid::regclass,a,b from ab +union all + select tableoid::regclass,x,y from xy_1 +union all + select tableoid::regclass,a,b from ab +) ab where a = $1 and b = (select -10); +-- Ensure the xy_1 subplan is not pruned. +explain (analyze, costs off, summary off, timing off) execute ab_q6(1); + QUERY PLAN +-------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 12 + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Seq Scan on ab_a1_b1 ab_1 (never executed) + Filter: ((a = $1) AND (b = $0)) + -> Seq Scan on ab_a1_b2 ab_2 (never executed) + Filter: ((a = $1) AND (b = $0)) + -> Seq Scan on ab_a1_b3 ab_3 (never executed) + Filter: ((a = $1) AND (b = $0)) + -> Seq Scan on xy_1 (actual rows=0 loops=1) + Filter: ((x = $1) AND (y = $0)) + Rows Removed by Filter: 1 + -> Seq Scan on ab_a1_b1 ab_4 (never executed) + Filter: ((a = $1) AND (b = $0)) + -> Seq Scan on ab_a1_b2 ab_5 (never executed) + Filter: ((a = $1) AND (b = $0)) + -> Seq Scan on ab_a1_b3 ab_6 (never executed) + Filter: ((a = $1) AND (b = $0)) + Optimizer: Postgres query optimizer +(20 rows) + +-- Ensure we see just the xy_1 row. +execute ab_q6(100); + tableoid | a | b +----------+-----+----- + xy_1 | 100 | -10 +(1 row) + +reset enable_bitmapscan; +reset enable_indexscan; +deallocate ab_q1; +deallocate ab_q2; +deallocate ab_q3; +deallocate ab_q4; +deallocate ab_q5; +deallocate ab_q6; +-- UPDATE on a partition subtree has been seen to have problems. +insert into ab values (1,2); +explain (analyze, costs off, summary off, timing off) +update ab_a1 set b = 3 from ab where ab.a = 1 and ab.a = ab_a1.a; + QUERY PLAN +------------------------------------------------------------------------------------------- + Update on ab_a1 (actual rows=0 loops=1) + Update on ab_a1_b1 ab_a1_1 + Update on ab_a1_b2 ab_a1_2 + Update on ab_a1_b3 ab_a1_3 + -> Nested Loop (actual rows=1 loops=1) + -> Append (actual rows=1 loops=1) + -> Bitmap Heap Scan on ab_a1_b1 ab_a1_1 (actual rows=0 loops=1) + Recheck Cond: (a = 1) + -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1) + Index Cond: (a = 1) + -> Bitmap Heap Scan on ab_a1_b2 ab_a1_2 (actual rows=1 loops=1) + Recheck Cond: (a = 1) + Heap Blocks: exact=1 + -> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=1 loops=1) + Index Cond: (a = 1) + -> Bitmap Heap Scan on ab_a1_b3 ab_a1_3 (actual rows=0 loops=1) + Recheck Cond: (a = 1) + -> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1) + Index Cond: (a = 1) + -> Materialize (actual rows=1 loops=1) + -> Append (actual rows=1 loops=1) + -> Bitmap Heap Scan on ab_a1_b1 ab_1 (actual rows=0 loops=1) + Recheck Cond: (a = 1) + -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1) + Index Cond: (a = 1) + -> Bitmap Heap Scan on ab_a1_b2 ab_2 (actual rows=1 loops=1) + Recheck Cond: (a = 1) + Heap Blocks: exact=1 + -> Bitmap Index Scan on ab_a1_b2_a_idx (actual rows=1 loops=1) + Index Cond: (a = 1) + -> Bitmap Heap Scan on ab_a1_b3 ab_3 (actual rows=0 loops=1) + Recheck Cond: (a = 1) + -> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1) + Index Cond: (a = 1) + Optimizer: Postgres query optimizer +(35 rows) + +table ab; + a | b +---+--- + 1 | 3 +(1 row) + +-- Test UPDATE where source relation has run-time pruning enabled +truncate ab; +insert into ab values (1, 1), (1, 2), (1, 3), (2, 1); +explain (analyze, costs off, summary off, timing off) +update ab_a1 set b = 3 from ab_a2 where ab_a2.b = (select 1); + QUERY PLAN +------------------------------------------------------------------------------ + Update on ab_a1 (actual rows=0 loops=1) + Update on ab_a1_b1 ab_a1_1 + Update on ab_a1_b2 ab_a1_2 + Update on ab_a1_b3 ab_a1_3 + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Nested Loop (actual rows=3 loops=1) + -> Append (actual rows=3 loops=1) + -> Seq Scan on ab_a1_b1 ab_a1_1 (actual rows=1 loops=1) + -> Seq Scan on ab_a1_b2 ab_a1_2 (actual rows=1 loops=1) + -> Seq Scan on ab_a1_b3 ab_a1_3 (actual rows=1 loops=1) + -> Materialize (actual rows=1 loops=3) + -> Append (actual rows=1 loops=1) + -> Seq Scan on ab_a2_b1 ab_a2_1 (actual rows=1 loops=1) + Filter: (b = $0) + -> Seq Scan on ab_a2_b2 ab_a2_2 (never executed) + Filter: (b = $0) + -> Seq Scan on ab_a2_b3 ab_a2_3 (never executed) + Filter: (b = $0) + Optimizer: Postgres query optimizer +(20 rows) + +select tableoid::regclass, * from ab; + tableoid | a | b +----------+---+--- + ab_a1_b3 | 1 | 3 + ab_a1_b3 | 1 | 3 + ab_a1_b3 | 1 | 3 + ab_a2_b1 | 2 | 1 +(4 rows) + +drop table ab, lprt_a; +-- Join +create table tbl1(col1 int); +insert into tbl1 values (501), (505); +analyze tbl1; +-- Basic table +create table tprt (col1 int) partition by range (col1); +create table tprt_1 partition of tprt for values from (1) to (501); +create table tprt_2 partition of tprt for values from (501) to (1001); +create table tprt_3 partition of tprt for values from (1001) to (2001); +create table tprt_4 partition of tprt for values from (2001) to (3001); +create table tprt_5 partition of tprt for values from (3001) to (4001); +create table tprt_6 partition of tprt for values from (4001) to (5001); +create index tprt1_idx on tprt_1 (col1); +create index tprt2_idx on tprt_2 (col1); +create index tprt3_idx on tprt_3 (col1); +create index tprt4_idx on tprt_4 (col1); +create index tprt5_idx on tprt_5 (col1); +create index tprt6_idx on tprt_6 (col1); +insert into tprt values (10), (20), (501), (502), (505), (1001), (4500); +set enable_hashjoin = off; +set enable_mergejoin = off; +set enable_seqscan=off; +explain (analyze, costs off, summary off, timing off) +select * from tbl1 join tprt on tbl1.col1 > tprt.col1; + QUERY PLAN +-------------------------------------------------------------------------- + Nested Loop (actual rows=6 loops=1) + -> Seq Scan on tbl1 (actual rows=2 loops=1) + -> Append (actual rows=3 loops=2) + -> Bitmap Heap Scan on tprt_1 (actual rows=2 loops=2) + Recheck Cond: (tbl1.col1 > col1) + Heap Blocks: exact=2 + -> Bitmap Index Scan on tprt1_idx (actual rows=2 loops=2) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_2 (actual rows=2 loops=1) + Recheck Cond: (tbl1.col1 > col1) + Heap Blocks: exact=1 + -> Bitmap Index Scan on tprt2_idx (actual rows=2 loops=1) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_3 (never executed) + Recheck Cond: (tbl1.col1 > col1) + -> Bitmap Index Scan on tprt3_idx (never executed) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_4 (never executed) + Recheck Cond: (tbl1.col1 > col1) + -> Bitmap Index Scan on tprt4_idx (never executed) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_5 (never executed) + Recheck Cond: (tbl1.col1 > col1) + -> Bitmap Index Scan on tprt5_idx (never executed) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_6 (never executed) + Recheck Cond: (tbl1.col1 > col1) + -> Bitmap Index Scan on tprt6_idx (never executed) + Index Cond: (col1 < tbl1.col1) + Optimizer: Postgres query optimizer +(30 rows) + +explain (analyze, costs off, summary off, timing off) +select * from tbl1 join tprt on tbl1.col1 = tprt.col1; + QUERY PLAN +-------------------------------------------------------------------------- + Nested Loop (actual rows=2 loops=1) + -> Seq Scan on tbl1 (actual rows=2 loops=1) + -> Append (actual rows=1 loops=2) + -> Bitmap Heap Scan on tprt_1 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt1_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_2 (actual rows=1 loops=2) + Recheck Cond: (col1 = tbl1.col1) + Heap Blocks: exact=2 + -> Bitmap Index Scan on tprt2_idx (actual rows=1 loops=2) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_3 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt3_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_4 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt4_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_5 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt5_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_6 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt6_idx (never executed) + Index Cond: (col1 = tbl1.col1) + Optimizer: Postgres query optimizer +(29 rows) + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 > tprt.col1 +order by tbl1.col1, tprt.col1; + col1 | col1 +------+------ + 501 | 10 + 501 | 20 + 505 | 10 + 505 | 20 + 505 | 501 + 505 | 502 +(6 rows) + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 = tprt.col1 +order by tbl1.col1, tprt.col1; + col1 | col1 +------+------ + 501 | 501 + 505 | 505 +(2 rows) + +-- Multiple partitions +insert into tbl1 values (1001), (1010), (1011); +explain (analyze, costs off, summary off, timing off) +select * from tbl1 inner join tprt on tbl1.col1 > tprt.col1; + QUERY PLAN +-------------------------------------------------------------------------- + Nested Loop (actual rows=23 loops=1) + -> Seq Scan on tbl1 (actual rows=5 loops=1) + -> Append (actual rows=5 loops=5) + -> Bitmap Heap Scan on tprt_1 (actual rows=2 loops=5) + Recheck Cond: (tbl1.col1 > col1) + Heap Blocks: exact=5 + -> Bitmap Index Scan on tprt1_idx (actual rows=2 loops=5) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_2 (actual rows=3 loops=4) + Recheck Cond: (tbl1.col1 > col1) + Heap Blocks: exact=4 + -> Bitmap Index Scan on tprt2_idx (actual rows=3 loops=4) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_3 (actual rows=1 loops=2) + Recheck Cond: (tbl1.col1 > col1) + Heap Blocks: exact=2 + -> Bitmap Index Scan on tprt3_idx (actual rows=1 loops=2) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_4 (never executed) + Recheck Cond: (tbl1.col1 > col1) + -> Bitmap Index Scan on tprt4_idx (never executed) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_5 (never executed) + Recheck Cond: (tbl1.col1 > col1) + -> Bitmap Index Scan on tprt5_idx (never executed) + Index Cond: (col1 < tbl1.col1) + -> Bitmap Heap Scan on tprt_6 (never executed) + Recheck Cond: (tbl1.col1 > col1) + -> Bitmap Index Scan on tprt6_idx (never executed) + Index Cond: (col1 < tbl1.col1) + Optimizer: Postgres query optimizer +(31 rows) + +explain (analyze, costs off, summary off, timing off) +select * from tbl1 inner join tprt on tbl1.col1 = tprt.col1; + QUERY PLAN +-------------------------------------------------------------------------- + Nested Loop (actual rows=3 loops=1) + -> Seq Scan on tbl1 (actual rows=5 loops=1) + -> Append (actual rows=1 loops=5) + -> Bitmap Heap Scan on tprt_1 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt1_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_2 (actual rows=1 loops=2) + Recheck Cond: (col1 = tbl1.col1) + Heap Blocks: exact=2 + -> Bitmap Index Scan on tprt2_idx (actual rows=1 loops=2) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_3 (actual rows=0 loops=3) + Recheck Cond: (col1 = tbl1.col1) + Heap Blocks: exact=1 + -> Bitmap Index Scan on tprt3_idx (actual rows=0 loops=3) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_4 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt4_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_5 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt5_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_6 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt6_idx (never executed) + Index Cond: (col1 = tbl1.col1) + Optimizer: Postgres query optimizer +(30 rows) + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 > tprt.col1 +order by tbl1.col1, tprt.col1; + col1 | col1 +------+------ + 501 | 10 + 501 | 20 + 505 | 10 + 505 | 20 + 505 | 501 + 505 | 502 + 1001 | 10 + 1001 | 20 + 1001 | 501 + 1001 | 502 + 1001 | 505 + 1010 | 10 + 1010 | 20 + 1010 | 501 + 1010 | 502 + 1010 | 505 + 1010 | 1001 + 1011 | 10 + 1011 | 20 + 1011 | 501 + 1011 | 502 + 1011 | 505 + 1011 | 1001 +(23 rows) + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 = tprt.col1 +order by tbl1.col1, tprt.col1; + col1 | col1 +------+------ + 501 | 501 + 505 | 505 + 1001 | 1001 +(3 rows) + +-- Last partition +delete from tbl1; +insert into tbl1 values (4400); +explain (analyze, costs off, summary off, timing off) +select * from tbl1 join tprt on tbl1.col1 < tprt.col1; + QUERY PLAN +-------------------------------------------------------------------------- + Nested Loop (actual rows=1 loops=1) + -> Seq Scan on tbl1 (actual rows=1 loops=1) + -> Append (actual rows=1 loops=1) + -> Bitmap Heap Scan on tprt_1 (never executed) + Recheck Cond: (tbl1.col1 < col1) + -> Bitmap Index Scan on tprt1_idx (never executed) + Index Cond: (col1 > tbl1.col1) + -> Bitmap Heap Scan on tprt_2 (never executed) + Recheck Cond: (tbl1.col1 < col1) + -> Bitmap Index Scan on tprt2_idx (never executed) + Index Cond: (col1 > tbl1.col1) + -> Bitmap Heap Scan on tprt_3 (never executed) + Recheck Cond: (tbl1.col1 < col1) + -> Bitmap Index Scan on tprt3_idx (never executed) + Index Cond: (col1 > tbl1.col1) + -> Bitmap Heap Scan on tprt_4 (never executed) + Recheck Cond: (tbl1.col1 < col1) + -> Bitmap Index Scan on tprt4_idx (never executed) + Index Cond: (col1 > tbl1.col1) + -> Bitmap Heap Scan on tprt_5 (never executed) + Recheck Cond: (tbl1.col1 < col1) + -> Bitmap Index Scan on tprt5_idx (never executed) + Index Cond: (col1 > tbl1.col1) + -> Bitmap Heap Scan on tprt_6 (actual rows=1 loops=1) + Recheck Cond: (tbl1.col1 < col1) + Heap Blocks: exact=1 + -> Bitmap Index Scan on tprt6_idx (actual rows=1 loops=1) + Index Cond: (col1 > tbl1.col1) + Optimizer: Postgres query optimizer +(29 rows) + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 < tprt.col1 +order by tbl1.col1, tprt.col1; + col1 | col1 +------+------ + 4400 | 4500 +(1 row) + +reset enable_seqscan; +-- No matching partition +delete from tbl1; +insert into tbl1 values (10000); +explain (analyze, costs off, summary off, timing off) +select * from tbl1 join tprt on tbl1.col1 = tprt.col1; + QUERY PLAN +------------------------------------------------------------------- + Nested Loop (actual rows=0 loops=1) + -> Seq Scan on tbl1 (actual rows=1 loops=1) + -> Append (actual rows=0 loops=1) + -> Bitmap Heap Scan on tprt_1 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt1_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_2 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt2_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_3 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt3_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_4 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt4_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_5 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt5_idx (never executed) + Index Cond: (col1 = tbl1.col1) + -> Bitmap Heap Scan on tprt_6 (never executed) + Recheck Cond: (col1 = tbl1.col1) + -> Bitmap Index Scan on tprt6_idx (never executed) + Index Cond: (col1 = tbl1.col1) + Optimizer: Postgres query optimizer +(28 rows) + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 = tprt.col1 +order by tbl1.col1, tprt.col1; + col1 | col1 +------+------ +(0 rows) + +drop table tbl1, tprt; +-- Test with columns defined in varying orders between each level +create table part_abc (a int not null, b int not null, c int not null) partition by list (a); +create table part_bac (b int not null, a int not null, c int not null) partition by list (b); +create table part_cab (c int not null, a int not null, b int not null) partition by list (c); +create table part_abc_p1 (a int not null, b int not null, c int not null); +alter table part_abc attach partition part_bac for values in(1); +alter table part_bac attach partition part_cab for values in(2); +alter table part_cab attach partition part_abc_p1 for values in(3); +prepare part_abc_q1 (int, int, int) as +select * from part_abc where a = $1 and b = $2 and c = $3; +-- Single partition should be scanned. +explain (analyze, costs off, summary off, timing off) execute part_abc_q1 (1, 2, 3); + QUERY PLAN +---------------------------------------------------------- + Seq Scan on part_abc_p1 part_abc (actual rows=0 loops=1) + Filter: ((a = $1) AND (b = $2) AND (c = $3)) + Optimizer: Postgres query optimizer +(3 rows) + +deallocate part_abc_q1; +drop table part_abc; +-- Ensure that an Append node properly handles a sub-partitioned table +-- matching without any of its leaf partitions matching the clause. +create table listp (a int, b int) partition by list (a); +create table listp_1 partition of listp for values in(1) partition by list (b); +create table listp_1_1 partition of listp_1 for values in(1); +create table listp_2 partition of listp for values in(2) partition by list (b); +create table listp_2_1 partition of listp_2 for values in(2); +select * from listp where b = 1; + a | b +---+--- +(0 rows) + +-- Ensure that an Append node properly can handle selection of all first level +-- partitions before finally detecting the correct set of 2nd level partitions +-- which match the given parameter. +prepare q1 (int,int) as select * from listp where b in ($1,$2); +explain (analyze, costs off, summary off, timing off) execute q1 (1,1); + QUERY PLAN +------------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 1 + -> Seq Scan on listp_1_1 listp_1 (actual rows=0 loops=1) + Filter: (b = ANY (ARRAY[$1, $2])) + Optimizer: Postgres query optimizer +(5 rows) + +explain (analyze, costs off, summary off, timing off) execute q1 (2,2); + QUERY PLAN +------------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 1 + -> Seq Scan on listp_2_1 listp_1 (actual rows=0 loops=1) + Filter: (b = ANY (ARRAY[$1, $2])) + Optimizer: Postgres query optimizer +(5 rows) + +-- Try with no matching partitions. +explain (analyze, costs off, summary off, timing off) execute q1 (0,0); + QUERY PLAN +------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 2 + Optimizer: Postgres query optimizer +(3 rows) + +deallocate q1; +-- Test more complex cases where a not-equal condition further eliminates partitions. +prepare q1 (int,int,int,int) as select * from listp where b in($1,$2) and $3 <> b and $4 <> b; +-- Both partitions allowed by IN clause, but one disallowed by <> clause +explain (analyze, costs off, summary off, timing off) execute q1 (1,2,2,0); + QUERY PLAN +------------------------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 1 + -> Seq Scan on listp_1_1 listp_1 (actual rows=0 loops=1) + Filter: ((b = ANY (ARRAY[$1, $2])) AND ($3 <> b) AND ($4 <> b)) + Optimizer: Postgres query optimizer +(5 rows) + +-- Both partitions allowed by IN clause, then both excluded again by <> clauses. +explain (analyze, costs off, summary off, timing off) execute q1 (1,2,2,1); + QUERY PLAN +------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 2 + Optimizer: Postgres query optimizer +(3 rows) + +-- Ensure Params that evaluate to NULL properly prune away all partitions +explain (analyze, costs off, summary off, timing off) +select * from listp where a = (select null::int); + QUERY PLAN +------------------------------------------------------ + Append (actual rows=0 loops=1) + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Seq Scan on listp_1_1 listp_1 (never executed) + Filter: (a = $0) + -> Seq Scan on listp_2_1 listp_2 (never executed) + Filter: (a = $0) + Optimizer: Postgres query optimizer +(8 rows) + +drop table listp; +-- +-- check that stable query clauses are only used in run-time pruning +-- +create table stable_qual_pruning (a timestamp) partition by range (a); +create table stable_qual_pruning1 partition of stable_qual_pruning + for values from ('2000-01-01') to ('2000-02-01'); +create table stable_qual_pruning2 partition of stable_qual_pruning + for values from ('2000-02-01') to ('2000-03-01'); +create table stable_qual_pruning3 partition of stable_qual_pruning + for values from ('3000-02-01') to ('3000-03-01'); +-- comparison against a stable value requires run-time pruning +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning where a < localtimestamp; + QUERY PLAN +-------------------------------------------------------------------------------------- + Append (actual rows=0 loops=1) + -> Seq Scan on stable_qual_pruning1 stable_qual_pruning_1 (actual rows=0 loops=1) + Filter: (a < 'Wed Jul 12 19:59:52.327873 2023'::timestamp without time zone) + -> Seq Scan on stable_qual_pruning2 stable_qual_pruning_2 (actual rows=0 loops=1) + Filter: (a < 'Wed Jul 12 19:59:52.327873 2023'::timestamp without time zone) + Optimizer: Postgres query optimizer +(6 rows) + +-- timestamp < timestamptz comparison is only stable, not immutable +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning where a < '2000-02-01'::timestamptz; + QUERY PLAN +-------------------------------------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 2 + -> Seq Scan on stable_qual_pruning1 stable_qual_pruning_1 (actual rows=0 loops=1) + Filter: (a < 'Tue Feb 01 00:00:00 2000 PST'::timestamp with time zone) + Optimizer: Postgres query optimizer +(5 rows) + +-- check ScalarArrayOp cases +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2010-02-01', '2020-01-01']::timestamp[]); + QUERY PLAN +------------------------------------- + Result (actual rows=0 loops=1) + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2000-02-01', '2010-01-01']::timestamp[]); + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Seq Scan on stable_qual_pruning2 stable_qual_pruning (actual rows=0 loops=1) + Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Fri Jan 01 00:00:00 2010"}'::timestamp without time zone[])) + Optimizer: Postgres query optimizer +(3 rows) + +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2000-02-01', localtimestamp]::timestamp[]); + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------- + Seq Scan on stable_qual_pruning2 stable_qual_pruning (actual rows=0 loops=1) + Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Wed Jul 12 19:59:52.333201 2023"}'::timestamp without time zone[])) + Optimizer: Postgres query optimizer +(3 rows) + +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2010-02-01', '2020-01-01']::timestamptz[]); + QUERY PLAN +------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 3 + Optimizer: Postgres query optimizer +(3 rows) + +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2000-02-01', '2010-01-01']::timestamptz[]); + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------- + Append (actual rows=0 loops=1) + Subplans Removed: 2 + -> Seq Scan on stable_qual_pruning2 stable_qual_pruning_1 (actual rows=0 loops=1) + Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000 PST","Fri Jan 01 00:00:00 2010 PST"}'::timestamp with time zone[])) + Optimizer: Postgres query optimizer +(5 rows) + +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(null::timestamptz[]); + QUERY PLAN +-------------------------------------------------------------------------------------- + Append (actual rows=0 loops=1) + -> Seq Scan on stable_qual_pruning1 stable_qual_pruning_1 (actual rows=0 loops=1) + Filter: (a = ANY (NULL::timestamp with time zone[])) + -> Seq Scan on stable_qual_pruning2 stable_qual_pruning_2 (actual rows=0 loops=1) + Filter: (a = ANY (NULL::timestamp with time zone[])) + -> Seq Scan on stable_qual_pruning3 stable_qual_pruning_3 (actual rows=0 loops=1) + Filter: (a = ANY (NULL::timestamp with time zone[])) + Optimizer: Postgres query optimizer +(8 rows) + +drop table stable_qual_pruning; +-- +-- Check that pruning with composite range partitioning works correctly when +-- it must ignore clauses for trailing keys once it has seen a clause with +-- non-inclusive operator for an earlier key +-- +create table mc3p (a int, b int, c int) partition by range (a, abs(b), c); +create table mc3p0 partition of mc3p + for values from (0, 0, 0) to (0, maxvalue, maxvalue); +create table mc3p1 partition of mc3p + for values from (1, 1, 1) to (2, minvalue, minvalue); +create table mc3p2 partition of mc3p + for values from (2, minvalue, minvalue) to (3, maxvalue, maxvalue); +insert into mc3p values (0, 1, 1), (1, 1, 1), (2, 1, 1); +explain (analyze, costs off, summary off, timing off) +select * from mc3p where a < 3 and abs(b) = 1; + QUERY PLAN +-------------------------------------------------------- + Append (actual rows=3 loops=1) + -> Seq Scan on mc3p0 mc3p_1 (actual rows=1 loops=1) + Filter: ((a < 3) AND (abs(b) = 1)) + -> Seq Scan on mc3p1 mc3p_2 (actual rows=1 loops=1) + Filter: ((a < 3) AND (abs(b) = 1)) + -> Seq Scan on mc3p2 mc3p_3 (actual rows=1 loops=1) + Filter: ((a < 3) AND (abs(b) = 1)) + Optimizer: Postgres query optimizer +(8 rows) + +-- +-- Check that pruning with composite range partitioning works correctly when +-- a combination of runtime parameters is specified, not all of whose values +-- are available at the same time +-- +prepare ps1 as + select * from mc3p where a = $1 and abs(b) < (select 3); +explain (analyze, costs off, summary off, timing off) +execute ps1(1); + QUERY PLAN +-------------------------------------------------------- + Append (actual rows=1 loops=1) + Subplans Removed: 2 + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Seq Scan on mc3p1 mc3p_1 (actual rows=1 loops=1) + Filter: ((a = $1) AND (abs(b) < $0)) + Optimizer: Postgres query optimizer +(7 rows) + +deallocate ps1; +prepare ps2 as + select * from mc3p where a <= $1 and abs(b) < (select 3); +explain (analyze, costs off, summary off, timing off) +execute ps2(1); + QUERY PLAN +-------------------------------------------------------- + Append (actual rows=2 loops=1) + Subplans Removed: 1 + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + -> Seq Scan on mc3p0 mc3p_1 (actual rows=1 loops=1) + Filter: ((a <= $1) AND (abs(b) < $0)) + -> Seq Scan on mc3p1 mc3p_2 (actual rows=1 loops=1) + Filter: ((a <= $1) AND (abs(b) < $0)) + Optimizer: Postgres query optimizer +(9 rows) + +deallocate ps2; +drop table mc3p; +-- Ensure runtime pruning works with initplans params with boolean types +create table boolvalues (value bool not null); +insert into boolvalues values('t'),('f'); +create table boolp (a bool) partition by list (a); +create table boolp_t partition of boolp for values in('t'); +create table boolp_f partition of boolp for values in('f'); +explain (analyze, costs off, summary off, timing off) +select * from boolp where a = (select value from boolvalues where value); + QUERY PLAN +----------------------------------------------------------- + Append (actual rows=0 loops=1) + InitPlan 1 (returns $0) + -> Seq Scan on boolvalues (actual rows=1 loops=1) + Filter: value + Rows Removed by Filter: 1 + -> Seq Scan on boolp_f boolp_1 (never executed) + Filter: (a = $0) + -> Seq Scan on boolp_t boolp_2 (actual rows=0 loops=1) + Filter: (a = $0) + Optimizer: Postgres query optimizer +(10 rows) + +explain (analyze, costs off, summary off, timing off) +select * from boolp where a = (select value from boolvalues where not value); + QUERY PLAN +----------------------------------------------------------- + Append (actual rows=0 loops=1) + InitPlan 1 (returns $0) + -> Seq Scan on boolvalues (actual rows=1 loops=1) + Filter: (NOT value) + Rows Removed by Filter: 1 + -> Seq Scan on boolp_f boolp_1 (actual rows=0 loops=1) + Filter: (a = $0) + -> Seq Scan on boolp_t boolp_2 (never executed) + Filter: (a = $0) + Optimizer: Postgres query optimizer +(10 rows) + +drop table boolp; +-- +-- Test run-time pruning of MergeAppend subnodes +-- +set enable_seqscan = off; +set enable_sort = off; +create table ma_test (a int, b int) partition by range (a); +create table ma_test_p1 partition of ma_test for values from (0) to (10); +create table ma_test_p2 partition of ma_test for values from (10) to (20); +create table ma_test_p3 partition of ma_test for values from (20) to (30); +insert into ma_test select x,x from generate_series(0,29) t(x); +create index on ma_test (b); +analyze ma_test; +prepare mt_q1 (int) as select a from ma_test where a >= $1 and a % 10 = 5 order by b; +explain (analyze, costs off, summary off, timing off) execute mt_q1(15); + QUERY PLAN +----------------------------------------------------------------------------------------- + Merge Append (actual rows=2 loops=1) + Sort Key: ma_test.b + Subplans Removed: 1 + -> Index Scan using ma_test_p2_b_idx on ma_test_p2 ma_test_1 (actual rows=1 loops=1) + Filter: ((a >= $1) AND ((a % 10) = 5)) + Rows Removed by Filter: 9 + -> Index Scan using ma_test_p3_b_idx on ma_test_p3 ma_test_2 (actual rows=1 loops=1) + Filter: ((a >= $1) AND ((a % 10) = 5)) + Rows Removed by Filter: 9 + Optimizer: Postgres query optimizer +(10 rows) + +execute mt_q1(15); + a +---- + 15 + 25 +(2 rows) + +explain (analyze, costs off, summary off, timing off) execute mt_q1(25); + QUERY PLAN +----------------------------------------------------------------------------------------- + Merge Append (actual rows=1 loops=1) + Sort Key: ma_test.b + Subplans Removed: 2 + -> Index Scan using ma_test_p3_b_idx on ma_test_p3 ma_test_1 (actual rows=1 loops=1) + Filter: ((a >= $1) AND ((a % 10) = 5)) + Rows Removed by Filter: 9 + Optimizer: Postgres query optimizer +(7 rows) + +execute mt_q1(25); + a +---- + 25 +(1 row) + +-- Ensure MergeAppend behaves correctly when no subplans match +explain (analyze, costs off, summary off, timing off) execute mt_q1(35); + QUERY PLAN +-------------------------------------- + Merge Append (actual rows=0 loops=1) + Sort Key: ma_test.b + Subplans Removed: 3 + Optimizer: Postgres query optimizer +(4 rows) + +execute mt_q1(35); + a +--- +(0 rows) + +deallocate mt_q1; +prepare mt_q2 (int) as select * from ma_test where a >= $1 order by b limit 1; +-- Ensure output list looks sane when the MergeAppend has no subplans. +explain (analyze, verbose, costs off, summary off, timing off) execute mt_q2 (35); + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Limit (actual rows=0 loops=1) + Output: ma_test.a, ma_test.b + -> Merge Append (actual rows=0 loops=1) + Sort Key: ma_test.b + Subplans Removed: 3 + Settings: enable_hashjoin = 'off', enable_indexonlyscan = 'off', enable_mergejoin = 'off', enable_seqscan = 'off', enable_sort = 'off', plan_cache_mode = 'force_generic_plan' + Optimizer: Postgres query optimizer +(7 rows) + +deallocate mt_q2; +-- ensure initplan params properly prune partitions +explain (analyze, costs off, summary off, timing off) select * from ma_test where a >= (select min(b) from ma_test_p2) order by b; + QUERY PLAN +----------------------------------------------------------------------------------------------- + Merge Append (actual rows=20 loops=1) + Sort Key: ma_test.b + InitPlan 2 (returns $1) + -> Result (actual rows=1 loops=1) + InitPlan 1 (returns $0) + -> Limit (actual rows=1 loops=1) + -> Index Scan using ma_test_p2_b_idx on ma_test_p2 (actual rows=1 loops=1) + Index Cond: (b IS NOT NULL) + -> Index Scan using ma_test_p1_b_idx on ma_test_p1 ma_test_1 (never executed) + Filter: (a >= $1) + -> Index Scan using ma_test_p2_b_idx on ma_test_p2 ma_test_2 (actual rows=10 loops=1) + Filter: (a >= $1) + -> Index Scan using ma_test_p3_b_idx on ma_test_p3 ma_test_3 (actual rows=10 loops=1) + Filter: (a >= $1) + Optimizer: Postgres query optimizer +(15 rows) + +reset enable_seqscan; +reset enable_sort; +drop table ma_test; +reset enable_indexonlyscan; +-- +-- check that pruning works properly when the partition key is of a +-- pseudotype +-- +-- array type list partition key +create table pp_arrpart (a int[]) partition by list (a); +create table pp_arrpart1 partition of pp_arrpart for values in ('{1}'); +create table pp_arrpart2 partition of pp_arrpart for values in ('{2, 3}', '{4, 5}'); +explain (costs off) select * from pp_arrpart where a = '{1}'; + QUERY PLAN +------------------------------------- + Seq Scan on pp_arrpart1 pp_arrpart + Filter: (a = '{1}'::integer[]) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from pp_arrpart where a = '{1, 2}'; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from pp_arrpart where a in ('{4, 5}', '{1}'); + QUERY PLAN +---------------------------------------------------------------------- + Append + -> Seq Scan on pp_arrpart1 pp_arrpart_1 + Filter: ((a = '{4,5}'::integer[]) OR (a = '{1}'::integer[])) + -> Seq Scan on pp_arrpart2 pp_arrpart_2 + Filter: ((a = '{4,5}'::integer[]) OR (a = '{1}'::integer[])) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) update pp_arrpart set a = a where a = '{1}'; + QUERY PLAN +-------------------------------------------- + Update on pp_arrpart + Update on pp_arrpart1 pp_arrpart_1 + -> Seq Scan on pp_arrpart1 pp_arrpart_1 + Filter: (a = '{1}'::integer[]) + Optimizer: Postgres query optimizer +(5 rows) + +explain (costs off) delete from pp_arrpart where a = '{1}'; + QUERY PLAN +-------------------------------------------- + Delete on pp_arrpart + Delete on pp_arrpart1 pp_arrpart_1 + -> Seq Scan on pp_arrpart1 pp_arrpart_1 + Filter: (a = '{1}'::integer[]) + Optimizer: Postgres query optimizer +(5 rows) + +drop table pp_arrpart; +-- array type hash partition key +create table pph_arrpart (a int[]) partition by hash (a); +create table pph_arrpart1 partition of pph_arrpart for values with (modulus 2, remainder 0); +create table pph_arrpart2 partition of pph_arrpart for values with (modulus 2, remainder 1); +insert into pph_arrpart values ('{1}'), ('{1, 2}'), ('{4, 5}'); +select tableoid::regclass, * from pph_arrpart order by 1; + tableoid | a +--------------+------- + pph_arrpart1 | {1,2} + pph_arrpart1 | {4,5} + pph_arrpart2 | {1} +(3 rows) + +explain (costs off) select * from pph_arrpart where a = '{1}'; + QUERY PLAN +-------------------------------------- + Seq Scan on pph_arrpart2 pph_arrpart + Filter: (a = '{1}'::integer[]) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from pph_arrpart where a = '{1, 2}'; + QUERY PLAN +-------------------------------------- + Seq Scan on pph_arrpart1 pph_arrpart + Filter: (a = '{1,2}'::integer[]) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from pph_arrpart where a in ('{4, 5}', '{1}'); + QUERY PLAN +---------------------------------------------------------------------- + Append + -> Seq Scan on pph_arrpart1 pph_arrpart_1 + Filter: ((a = '{4,5}'::integer[]) OR (a = '{1}'::integer[])) + -> Seq Scan on pph_arrpart2 pph_arrpart_2 + Filter: ((a = '{4,5}'::integer[]) OR (a = '{1}'::integer[])) + Optimizer: Postgres query optimizer +(6 rows) + +drop table pph_arrpart; +-- enum type list partition key +create type pp_colors as enum ('green', 'blue', 'black'); +create table pp_enumpart (a pp_colors) partition by list (a); +create table pp_enumpart_green partition of pp_enumpart for values in ('green'); +create table pp_enumpart_blue partition of pp_enumpart for values in ('blue'); +explain (costs off) select * from pp_enumpart where a = 'blue'; + QUERY PLAN +------------------------------------------ + Seq Scan on pp_enumpart_blue pp_enumpart + Filter: (a = 'blue'::pp_colors) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from pp_enumpart where a = 'black'; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +drop table pp_enumpart; +drop type pp_colors; +-- record type as partition key +create type pp_rectype as (a int, b int); +create table pp_recpart (a pp_rectype) partition by list (a); +create table pp_recpart_11 partition of pp_recpart for values in ('(1,1)'); +create table pp_recpart_23 partition of pp_recpart for values in ('(2,3)'); +explain (costs off) select * from pp_recpart where a = '(1,1)'::pp_rectype; + QUERY PLAN +-------------------------------------- + Seq Scan on pp_recpart_11 pp_recpart + Filter: (a = '(1,1)'::pp_rectype) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from pp_recpart where a = '(1,2)'::pp_rectype; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +drop table pp_recpart; +drop type pp_rectype; +-- range type partition key +create table pp_intrangepart (a int4range) partition by list (a); +create table pp_intrangepart12 partition of pp_intrangepart for values in ('[1,2]'); +create table pp_intrangepart2inf partition of pp_intrangepart for values in ('[2,)'); +explain (costs off) select * from pp_intrangepart where a = '[1,2]'::int4range; + QUERY PLAN +----------------------------------------------- + Seq Scan on pp_intrangepart12 pp_intrangepart + Filter: (a = '[1,3)'::int4range) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from pp_intrangepart where a = '(1,2)'::int4range; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +drop table pp_intrangepart; +-- +-- Ensure the enable_partition_prune GUC properly disables partition pruning. +-- +create table pp_lp (a int, value int) partition by list (a); +create table pp_lp1 partition of pp_lp for values in(1); +create table pp_lp2 partition of pp_lp for values in(2); +explain (costs off) select * from pp_lp where a = 1; + QUERY PLAN +------------------------------------- + Seq Scan on pp_lp1 pp_lp + Filter: (a = 1) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) update pp_lp set value = 10 where a = 1; + QUERY PLAN +------------------------------------- + Update on pp_lp + Update on pp_lp1 pp_lp_1 + -> Seq Scan on pp_lp1 pp_lp_1 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(5 rows) + +explain (costs off) delete from pp_lp where a = 1; + QUERY PLAN +------------------------------------- + Delete on pp_lp + Delete on pp_lp1 pp_lp_1 + -> Seq Scan on pp_lp1 pp_lp_1 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(5 rows) + +set enable_partition_pruning = off; +set constraint_exclusion = 'partition'; -- this should not affect the result. +explain (costs off) select * from pp_lp where a = 1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on pp_lp1 pp_lp_1 + Filter: (a = 1) + -> Seq Scan on pp_lp2 pp_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) update pp_lp set value = 10 where a = 1; + QUERY PLAN +---------------------------------------- + Update on pp_lp + Update on pp_lp1 pp_lp_1 + Update on pp_lp2 pp_lp_2 + -> Append + -> Seq Scan on pp_lp1 pp_lp_1 + Filter: (a = 1) + -> Seq Scan on pp_lp2 pp_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(9 rows) + +explain (costs off) delete from pp_lp where a = 1; + QUERY PLAN +---------------------------------------- + Delete on pp_lp + Delete on pp_lp1 pp_lp_1 + Delete on pp_lp2 pp_lp_2 + -> Append + -> Seq Scan on pp_lp1 pp_lp_1 + Filter: (a = 1) + -> Seq Scan on pp_lp2 pp_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(9 rows) + +set constraint_exclusion = 'off'; -- this should not affect the result. +explain (costs off) select * from pp_lp where a = 1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on pp_lp1 pp_lp_1 + Filter: (a = 1) + -> Seq Scan on pp_lp2 pp_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) update pp_lp set value = 10 where a = 1; + QUERY PLAN +---------------------------------------- + Update on pp_lp + Update on pp_lp1 pp_lp_1 + Update on pp_lp2 pp_lp_2 + -> Append + -> Seq Scan on pp_lp1 pp_lp_1 + Filter: (a = 1) + -> Seq Scan on pp_lp2 pp_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(9 rows) + +explain (costs off) delete from pp_lp where a = 1; + QUERY PLAN +---------------------------------------- + Delete on pp_lp + Delete on pp_lp1 pp_lp_1 + Delete on pp_lp2 pp_lp_2 + -> Append + -> Seq Scan on pp_lp1 pp_lp_1 + Filter: (a = 1) + -> Seq Scan on pp_lp2 pp_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(9 rows) + +drop table pp_lp; +-- Ensure enable_partition_prune does not affect non-partitioned tables. +create table inh_lp (a int, value int); +create table inh_lp1 (a int, value int, check(a = 1)) inherits (inh_lp); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "value" with inherited definition +create table inh_lp2 (a int, value int, check(a = 2)) inherits (inh_lp); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "value" with inherited definition +set constraint_exclusion = 'partition'; +-- inh_lp2 should be removed in the following 3 cases. +explain (costs off) select * from inh_lp where a = 1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on inh_lp inh_lp_1 + Filter: (a = 1) + -> Seq Scan on inh_lp1 inh_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) update inh_lp set value = 10 where a = 1; + QUERY PLAN +------------------------------------------------ + Update on inh_lp + Update on inh_lp inh_lp_1 + Update on inh_lp1 inh_lp_2 + -> Result + -> Append + -> Seq Scan on inh_lp inh_lp_1 + Filter: (a = 1) + -> Seq Scan on inh_lp1 inh_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(10 rows) + +explain (costs off) delete from inh_lp where a = 1; + QUERY PLAN +------------------------------------------ + Delete on inh_lp + Delete on inh_lp inh_lp_1 + Delete on inh_lp1 inh_lp_2 + -> Append + -> Seq Scan on inh_lp inh_lp_1 + Filter: (a = 1) + -> Seq Scan on inh_lp1 inh_lp_2 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(9 rows) + +-- Ensure we don't exclude normal relations when we only expect to exclude +-- inheritance children +explain (costs off) update inh_lp1 set value = 10 where a = 2; + QUERY PLAN +------------------------------------- + Update on inh_lp1 + -> Seq Scan on inh_lp1 + Filter: (a = 2) + Optimizer: Postgres query optimizer +(4 rows) + +drop table inh_lp cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table inh_lp1 +drop cascades to table inh_lp2 +reset enable_partition_pruning; +reset constraint_exclusion; +-- Check pruning for a partition tree containing only temporary relations +create temp table pp_temp_parent (a int) partition by list (a); +create temp table pp_temp_part_1 partition of pp_temp_parent for values in (1); +create temp table pp_temp_part_def partition of pp_temp_parent default; +explain (costs off) select * from pp_temp_parent where true; + QUERY PLAN +----------------------------------------------------- + Append + -> Seq Scan on pp_temp_part_1 pp_temp_parent_1 + -> Seq Scan on pp_temp_part_def pp_temp_parent_2 + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) select * from pp_temp_parent where a = 2; + QUERY PLAN +--------------------------------------------- + Seq Scan on pp_temp_part_def pp_temp_parent + Filter: (a = 2) + Optimizer: Postgres query optimizer +(3 rows) + +drop table pp_temp_parent; +-- Stress run-time partition pruning a bit more, per bug reports +create temp table p (a int, b int, c int) partition by list (a); +create temp table p1 partition of p for values in (1); +create temp table p2 partition of p for values in (2); +create temp table q (a int, b int, c int) partition by list (a); +create temp table q1 partition of q for values in (1) partition by list (b); +create temp table q11 partition of q1 for values in (1) partition by list (c); +create temp table q111 partition of q11 for values in (1); +create temp table q2 partition of q for values in (2) partition by list (b); +create temp table q21 partition of q2 for values in (1); +create temp table q22 partition of q2 for values in (2); +insert into q22 values (2, 2, 3); +explain (costs off) +select * +from ( + select * from p + union all + select * from q1 + union all + select 1, 1, 1 + ) s(a, b, c) +where s.a = 1 and s.b = 1 and s.c = (select 1); + QUERY PLAN +---------------------------------------------------- + Append + InitPlan 1 (returns $0) + -> Result + -> Seq Scan on p1 p + Filter: ((a = 1) AND (b = 1) AND (c = $0)) + -> Seq Scan on q111 q1 + Filter: ((a = 1) AND (b = 1) AND (c = $0)) + -> Result + One-Time Filter: (1 = $0) + Optimizer: Postgres query optimizer +(10 rows) + +select * +from ( + select * from p + union all + select * from q1 + union all + select 1, 1, 1 + ) s(a, b, c) +where s.a = 1 and s.b = 1 and s.c = (select 1); + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +prepare q (int, int) as +select * +from ( + select * from p + union all + select * from q1 + union all + select 1, 1, 1 + ) s(a, b, c) +where s.a = $1 and s.b = $2 and s.c = (select 1); +explain (costs off) execute q (1, 1); + QUERY PLAN +--------------------------------------------------------------- + Append + Subplans Removed: 1 + InitPlan 1 (returns $0) + -> Result + -> Seq Scan on p1 p + Filter: ((a = $1) AND (b = $2) AND (c = $0)) + -> Seq Scan on q111 q1 + Filter: ((a = $1) AND (b = $2) AND (c = $0)) + -> Result + One-Time Filter: ((1 = $1) AND (1 = $2) AND (1 = $0)) + Optimizer: Postgres query optimizer +(11 rows) + +execute q (1, 1); + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) + +drop table p, q; +-- Ensure run-time pruning works correctly when we match a partitioned table +-- on the first level but find no matching partitions on the second level. +create table listp (a int, b int) partition by list (a); +create table listp1 partition of listp for values in(1); +create table listp2 partition of listp for values in(2) partition by list(b); +create table listp2_10 partition of listp2 for values in (10); +explain (analyze, costs off, summary off, timing off) +select * from listp where a = (select 2) and b <> 10; + QUERY PLAN +-------------------------------------------------- + Seq Scan on listp1 listp (actual rows=0 loops=1) + Filter: ((b <> 10) AND (a = $0)) + InitPlan 1 (returns $0) + -> Result (never executed) + Optimizer: Postgres query optimizer +(5 rows) + +-- +-- check that a partition directly accessed in a query is excluded with +-- constraint_exclusion = on +-- +-- turn off partition pruning, so that it doesn't interfere +set enable_partition_pruning to off; +-- setting constraint_exclusion to 'partition' disables exclusion +set constraint_exclusion to 'partition'; +explain (costs off) select * from listp1 where a = 2; + QUERY PLAN +------------------------------------- + Seq Scan on listp1 + Filter: (a = 2) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) update listp1 set a = 1 where a = 2; + QUERY PLAN +------------------------------------- + Update on listp1 + -> Seq Scan on listp1 + Filter: (a = 2) + Optimizer: Postgres query optimizer +(4 rows) + +-- constraint exclusion enabled +set constraint_exclusion to 'on'; +explain (costs off) select * from listp1 where a = 2; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) update listp1 set a = 1 where a = 2; + QUERY PLAN +------------------------------------- + Update on listp1 + -> Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(4 rows) + +reset constraint_exclusion; +reset enable_partition_pruning; +drop table listp; +-- Ensure run-time pruning works correctly for nested Append nodes +set parallel_setup_cost to 0; +set parallel_tuple_cost to 0; +create table listp (a int) partition by list(a); +create table listp_12 partition of listp for values in(1,2) partition by list(a); +create table listp_12_1 partition of listp_12 for values in(1); +create table listp_12_2 partition of listp_12 for values in(2); +-- Force the 2nd subnode of the Append to be non-parallel. This results in +-- a nested Append node because the mixed parallel / non-parallel paths cannot +-- be pulled into the top-level Append. +alter table listp_12_1 set (parallel_workers = 0); +-- Ensure that listp_12_2 is not scanned. (The nested Append is not seen in +-- the plan as it's pulled in setref.c due to having just a single subnode). +select explain_parallel_append('select * from listp where a = (select 1);'); + explain_parallel_append +-------------------------------------------------------------- + Append (actual rows=N loops=N) + InitPlan 1 (returns $0) + -> Result (actual rows=N loops=N) + -> Seq Scan on listp_12_1 listp_1 (actual rows=N loops=N) + Filter: (a = $0) + -> Seq Scan on listp_12_2 listp_2 (never executed) + Filter: (a = $0) + Optimizer: Postgres query optimizer +(8 rows) + +-- Like the above but throw some more complexity at the planner by adding +-- a UNION ALL. We expect both sides of the union not to scan the +-- non-required partitions. +select explain_parallel_append( +'select * from listp where a = (select 1) + union all +select * from listp where a = (select 2);'); + explain_parallel_append +-------------------------------------------------------------------- + Append (actual rows=N loops=N) + -> Append (actual rows=N loops=N) + InitPlan 1 (returns $0) + -> Result (actual rows=N loops=N) + -> Seq Scan on listp_12_1 listp_1 (actual rows=N loops=N) + Filter: (a = $0) + -> Seq Scan on listp_12_2 listp_2 (never executed) + Filter: (a = $0) + -> Append (actual rows=N loops=N) + InitPlan 2 (returns $1) + -> Result (actual rows=N loops=N) + -> Seq Scan on listp_12_1 listp_4 (never executed) + Filter: (a = $1) + -> Seq Scan on listp_12_2 listp_5 (actual rows=N loops=N) + Filter: (a = $1) + Optimizer: Postgres query optimizer +(16 rows) + +drop table listp; +reset parallel_tuple_cost; +reset parallel_setup_cost; +-- Test case for run-time pruning with a nested Merge Append +set enable_sort to 0; +create table rangep (a int, b int) partition by range (a); +create table rangep_0_to_100 partition of rangep for values from (0) to (100) partition by list (b); +-- We need 3 sub-partitions. 1 to validate pruning worked and another two +-- because a single remaining partition would be pulled up to the main Append. +create table rangep_0_to_100_1 partition of rangep_0_to_100 for values in(1); +create table rangep_0_to_100_2 partition of rangep_0_to_100 for values in(2); +create table rangep_0_to_100_3 partition of rangep_0_to_100 for values in(3); +create table rangep_100_to_200 partition of rangep for values from (100) to (200); +create index on rangep (a); +-- Ensure run-time pruning works on the nested Merge Append +explain (analyze on, costs off, timing off, summary off) +select * from rangep where b IN((select 1),(select 2)) order by a; + QUERY PLAN +------------------------------------------------------------------------------------------------------------ + Append (actual rows=0 loops=1) + InitPlan 1 (returns $0) + -> Result (actual rows=1 loops=1) + InitPlan 2 (returns $1) + -> Result (actual rows=1 loops=1) + -> Merge Append (actual rows=0 loops=1) + Sort Key: rangep_2.a + -> Index Scan using rangep_0_to_100_1_a_idx on rangep_0_to_100_1 rangep_2 (actual rows=0 loops=1) + Filter: (b = ANY (ARRAY[$0, $1])) + -> Index Scan using rangep_0_to_100_2_a_idx on rangep_0_to_100_2 rangep_3 (actual rows=0 loops=1) + Filter: (b = ANY (ARRAY[$0, $1])) + -> Index Scan using rangep_0_to_100_3_a_idx on rangep_0_to_100_3 rangep_4 (never executed) + Filter: (b = ANY (ARRAY[$0, $1])) + -> Index Scan using rangep_100_to_200_a_idx on rangep_100_to_200 rangep_5 (actual rows=0 loops=1) + Filter: (b = ANY (ARRAY[$0, $1])) + Optimizer: Postgres query optimizer +(16 rows) + +reset enable_sort; +drop table rangep; +-- +-- Check that gen_prune_steps_from_opexps() works well for various cases of +-- clauses for different partition keys +-- +create table rp_prefix_test1 (a int, b varchar) partition by range(a, b); +create table rp_prefix_test1_p1 partition of rp_prefix_test1 for values from (1, 'a') to (1, 'b'); +create table rp_prefix_test1_p2 partition of rp_prefix_test1 for values from (2, 'a') to (2, 'b'); +-- Don't call get_steps_using_prefix() with the last partition key b plus +-- an empty prefix +explain (costs off) select * from rp_prefix_test1 where a <= 1 and b = 'a'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on rp_prefix_test1_p1 rp_prefix_test1 + Filter: ((a <= 1) AND ((b)::text = 'a'::text)) + Optimizer: Postgres query optimizer +(3 rows) + +create table rp_prefix_test2 (a int, b int, c int) partition by range(a, b, c); +create table rp_prefix_test2_p1 partition of rp_prefix_test2 for values from (1, 1, 0) to (1, 1, 10); +create table rp_prefix_test2_p2 partition of rp_prefix_test2 for values from (2, 2, 0) to (2, 2, 10); +-- Don't call get_steps_using_prefix() with the last partition key c plus +-- an invalid prefix (ie, b = 1) +explain (costs off) select * from rp_prefix_test2 where a <= 1 and b = 1 and c >= 0; + QUERY PLAN +------------------------------------------------ + Seq Scan on rp_prefix_test2_p1 rp_prefix_test2 + Filter: ((a <= 1) AND (c >= 0) AND (b = 1)) + Optimizer: Postgres query optimizer +(3 rows) + +create table rp_prefix_test3 (a int, b int, c int, d int) partition by range(a, b, c, d); +create table rp_prefix_test3_p1 partition of rp_prefix_test3 for values from (1, 1, 1, 0) to (1, 1, 1, 10); +create table rp_prefix_test3_p2 partition of rp_prefix_test3 for values from (2, 2, 2, 0) to (2, 2, 2, 10); +-- Test that get_steps_using_prefix() handles a prefix that contains multiple +-- clauses for the partition key b (ie, b >= 1 and b >= 2) +explain (costs off) select * from rp_prefix_test3 where a >= 1 and b >= 1 and b >= 2 and c >= 2 and d >= 0; + QUERY PLAN +-------------------------------------------------------------------------- + Seq Scan on rp_prefix_test3_p2 rp_prefix_test3 + Filter: ((a >= 1) AND (b >= 1) AND (b >= 2) AND (c >= 2) AND (d >= 0)) + Optimizer: Postgres query optimizer +(3 rows) + +-- Test that get_steps_using_prefix() handles a prefix that contains multiple +-- clauses for the partition key b (ie, b >= 1 and b = 2) (This also tests +-- that the caller arranges clauses in that prefix in the required order) +explain (costs off) select * from rp_prefix_test3 where a >= 1 and b >= 1 and b = 2 and c = 2 and d >= 0; + QUERY PLAN +------------------------------------------------------------------------------------- + Seq Scan on rp_prefix_test3_p2 rp_prefix_test3 + Filter: ((a >= 1) AND (b >= 1) AND (d >= 0) AND (c >= 1) AND (b = 2) AND (c = 2)) + Optimizer: Postgres query optimizer +(3 rows) + +create table hp_prefix_test (a int, b int, c int, d int) partition by hash (a part_test_int4_ops, b part_test_int4_ops, c part_test_int4_ops, d part_test_int4_ops); +create table hp_prefix_test_p1 partition of hp_prefix_test for values with (modulus 2, remainder 0); +create table hp_prefix_test_p2 partition of hp_prefix_test for values with (modulus 2, remainder 1); +-- Test that get_steps_using_prefix() handles non-NULL step_nullkeys +explain (costs off) select * from hp_prefix_test where a = 1 and b is null and c = 1 and d = 1; + QUERY PLAN +------------------------------------------------------------- + Seq Scan on hp_prefix_test_p1 hp_prefix_test + Filter: ((b IS NULL) AND (a = 1) AND (c = 1) AND (d = 1)) + Optimizer: Postgres query optimizer +(3 rows) + +drop table rp_prefix_test1; +drop table rp_prefix_test2; +drop table rp_prefix_test3; +drop table hp_prefix_test; +-- +-- Check that gen_partprune_steps() detects self-contradiction from clauses +-- regardless of the order of the clauses (Here we use a custom operator to +-- prevent the equivclass.c machinery from reordering the clauses) +-- +create operator === ( + leftarg = int4, + rightarg = int4, + procedure = int4eq, + commutator = ===, + hashes +); +create operator class part_test_int4_ops2 +for type int4 +using hash as +operator 1 ===, +function 2 part_hashint4_noop(int4, int8); +create table hp_contradict_test (a int, b int) partition by hash (a part_test_int4_ops2, b part_test_int4_ops2); +create table hp_contradict_test_p1 partition of hp_contradict_test for values with (modulus 2, remainder 0); +create table hp_contradict_test_p2 partition of hp_contradict_test for values with (modulus 2, remainder 1); +explain (costs off) select * from hp_contradict_test where a is null and a === 1 and b === 1; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from hp_contradict_test where a === 1 and b === 1 and a is null; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +drop table hp_contradict_test; +drop operator class part_test_int4_ops2 using hash; +drop operator ===(int4, int4); diff --git a/src/test/singlenode_regress/expected/partition_storage.out b/src/test/singlenode_regress/expected/partition_storage.out new file mode 100644 index 00000000000..fdf3c32c19e --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_storage.out @@ -0,0 +1,781 @@ +--Create a heap table with partitions ( having diff storage parameters) + Create table pt_heap_tab(a int, b text, c int , d int, e numeric,success bool) with ( appendonly=false ) + partition by list(b) + ( + partition abc values ('abc','abc1','abc2') with (appendonly=false), -- HEAP + partition def values ('def','def1','def3') with (appendonly=true, compresslevel=1), + partition ghi values ('ghi','ghi1','ghi2') with (appendonly=true), -- AO + default partition dft + ); +--Create indexes on the table + -- Partial index + create index heap_idx1 on pt_heap_tab(a) where c > 10; + -- Expression index + create index heap_idx2 on pt_heap_tab(upper(b)); +--Drop partition + alter table pt_heap_tab drop default partition; +--Add partition + alter table pt_heap_tab add partition xyz values ('xyz','xyz1','xyz2') WITH (appendonly=true, orientation=column, compresslevel=5); -- CO + alter table pt_heap_tab add partition jkl values ('jkl','jkl1','jkl2') WITH (appendonly=true); -- AO + alter table pt_heap_tab add partition mno values ('mno','mno1','mno2') WITH (appendonly=false); --Heap +--Check properties of the added partition tables + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_heap_tab_1_prt_xyz', 'pt_heap_tab_1_prt_jkl','pt_heap_tab_1_prt_mno')); + oid | relkind | amname | reloptions +-----------------------+---------+-----------+------------------- + pt_heap_tab_1_prt_mno | r | heap | + pt_heap_tab_1_prt_xyz | r | ao_column | {compresslevel=5} + pt_heap_tab_1_prt_jkl | r | ao_row | +(3 rows) + +--Insert Data + insert into pt_heap_tab select 1, 'xyz', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'abc', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'def', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'ghi', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'jkl', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'mno', 1, 1, 1.0 , true from generate_series(1, 10); +--Split partition [Creates new partitions to be of the same type as the parent partition. All heap partitions created] + alter table pt_heap_tab split partition abc at ('abc1') into ( partition abc1,partition abc2); -- Heap + alter table pt_heap_tab split partition ghi at ('ghi1') into ( partition ghi1,partition ghi2); --AO + alter table pt_heap_tab split partition xyz at ('xyz1') into ( partition xyz1,partition xyz2); --CO +--Check the storage type and properties of the split partition + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ('pt_heap_tab_1_prt_xyz1','pt_heap_tab_1_prt_xyz2','pt_heap_tab_1_prt_ghi1','pt_heap_tab_1_prt_ghi2','pt_heap_tab_1_prt_abc1','pt_heap_tab_1_prt_abc2')); + oid | relkind | amname | reloptions +------------------------+---------+-----------+------------------- + pt_heap_tab_1_prt_abc1 | r | heap | + pt_heap_tab_1_prt_abc2 | r | heap | + pt_heap_tab_1_prt_xyz1 | r | ao_column | {compresslevel=5} + pt_heap_tab_1_prt_ghi1 | r | ao_row | + pt_heap_tab_1_prt_ghi2 | r | ao_row | + pt_heap_tab_1_prt_xyz2 | r | ao_column | {compresslevel=5} +(6 rows) + +--Exchange partition + -- Create candidate table + create table heap_can(like pt_heap_tab including indexes); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table ao_can(like pt_heap_tab including indexes) with (appendonly=true); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table co_can(like pt_heap_tab including indexes) with (appendonly=true,orientation=column); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + -- Exchange + alter table pt_heap_tab exchange partition for ('abc') with table ao_can ; -- Heap exchanged with AO + alter table pt_heap_tab add partition pqr values ('pqr','pqr1','pqr2') WITH (appendonly=true, orientation=column, compresslevel=5); + alter table pt_heap_tab exchange partition for ('def') with table co_can; -- AO exchanged with CO + alter table pt_heap_tab exchange partition for ('pqr') with table heap_can; -- CO exchanged with Heap +--Check for the storage properties and indexes of the two tables involved in the exchange + \d+ heap_can + Table "public.heap_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +---------+---------+-----------+----------+---------+----------+--------------+------------------+-------------------+------------+------------- + a | integer | | | | plain | | zlib | 5 | 32768 | + b | text | | | | extended | | zlib | 5 | 32768 | + c | integer | | | | plain | | zlib | 5 | 32768 | + d | integer | | | | plain | | zlib | 5 | 32768 | + e | numeric | | | | main | | zlib | 5 | 32768 | + success | boolean | | | | plain | | zlib | 5 | 32768 | +Checksum: t +Indexes: + "pt_heap_tab_1_prt_pqr_a_idx" btree (a) WHERE c > 10 + "pt_heap_tab_1_prt_pqr_upper_idx" btree (upper(b)) +Distributed by: (a) +Options: compresslevel=5 + + \d+ co_can + Table "public.co_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Compression Type: zlib +Compression Level: 1 +Block Size: 32768 +Checksum: t +Indexes: + "pt_heap_tab_1_prt_def_a_idx" btree (a) WHERE c > 10 + "pt_heap_tab_1_prt_def_upper_idx" btree (upper(b)) +Distributed by: (a) +Options: compresslevel=1 + + \d+ ao_can + Table "public.ao_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Indexes: + "pt_heap_tab_1_prt_abc1_a_idx" btree (a) WHERE c > 10 + "pt_heap_tab_1_prt_abc1_upper_idx" btree (upper(b)) +Distributed by: (a) + +--Further operations + alter table pt_heap_tab drop partition jkl; + truncate table pt_heap_tab; +--Further create some more indexes + create index heap_idx3 on pt_heap_tab(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX heap_idx4 ON pt_heap_tab ((b || ' ' || e)); --Expression +--Add default partition + alter table pt_heap_tab add default partition dft; +--Split default partition + alter table pt_heap_tab split default partition at ('uvw') into (partition dft, partition uvw); +--Create an AO table with partitions ( having diff storage parameters) + Create table pt_ao_tab(a int, b text, c int , d int, e numeric,success bool) with ( appendonly=true ) + partition by list(b) + ( + partition abc values ('abc','abc1','abc2') with (appendonly=false), -- HEAP + partition def values ('def','def1','def3') with (appendonly=true, compresslevel=1), + partition ghi values ('ghi','ghi1','ghi2') with (appendonly=true), -- AO + default partition dft + ); +--Create indexes on the table + -- Partial index + create index ao_idx1 on pt_ao_tab(a) where c > 10; + -- Expression index + create index ao_idx2 on pt_ao_tab(upper(b)); +--Drop partition + alter table pt_ao_tab drop default partition; +--Add partition + alter table pt_ao_tab add partition xyz values ('xyz','xyz1','xyz2') WITH (appendonly=true,orientation=column,compresslevel=5); --CO + alter table pt_ao_tab add partition jkl values ('jkl','jkl1','jkl2') WITH (appendonly=true); -- AO + alter table pt_ao_tab add partition mno values ('mno','mno1','mno2') WITH (appendonly=false); --Heap +--Check properties of the added partition tables + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_ao_tab_1_prt_xyz', 'pt_ao_tab_1_prt_jkl','pt_ao_tab_1_prt_mno')); + oid | relkind | amname | reloptions +---------------------+---------+-----------+------------------- + pt_ao_tab_1_prt_xyz | r | ao_column | {compresslevel=5} + pt_ao_tab_1_prt_jkl | r | ao_row | + pt_ao_tab_1_prt_mno | r | heap | +(3 rows) + +--Insert Data + insert into pt_ao_tab select 1, 'xyz', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'abc', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'def', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'ghi', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'jkl', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'mno', 1, 1, 1.0 , true from generate_series(1, 10); +--Split partition [Creates new partitions to be of the same type as the parent partition. All heap partitions created] + alter table pt_ao_tab split partition abc at ('abc1') into ( partition abc1,partition abc2); -- Heap + alter table pt_ao_tab split partition ghi at ('ghi1') into ( partition ghi1,partition ghi2); --AO + alter table pt_ao_tab split partition xyz at ('xyz1') into ( partition xyz1,partition xyz2); --CO +--Check the storage type and properties of the split partition + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in (select oid from pg_class where relname in ('pt_ao_tab_1_prt_xyz1','pt_ao_tab_1_prt_xyz2','pt_ao_tab_1_prt_ghi1','pt_ao_tab_1_prt_ghi2','pt_ao_tab_1_prt_abc1','pt_ao_tab_1_prt_abc2')); + oid | relkind | amname | reloptions +----------------------+---------+-----------+------------------- + pt_ao_tab_1_prt_abc1 | r | heap | + pt_ao_tab_1_prt_abc2 | r | heap | + pt_ao_tab_1_prt_ghi1 | r | ao_row | + pt_ao_tab_1_prt_ghi2 | r | ao_row | + pt_ao_tab_1_prt_xyz1 | r | ao_column | {compresslevel=5} + pt_ao_tab_1_prt_xyz2 | r | ao_column | {compresslevel=5} +(6 rows) + +--Exchange partition + -- Create candidate table +--start_ignore +drop table if exists heap_can cascade; +drop table if exists ao_can cascade; +drop table if exists co_can cascade; +--end_ignore + create table heap_can(like pt_ao_tab including indexes); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table ao_can(like pt_ao_tab including indexes) with (appendonly=true); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table co_can(like pt_ao_tab including indexes) with (appendonly=true,orientation=column); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + -- Exchange + alter table pt_ao_tab add partition pqr values ('pqr','pqr1','pqr2') WITH (appendonly=true,orientation=column,compresslevel=5);-- CO + alter table pt_ao_tab add partition stu values ('stu','stu1','stu2') WITH (appendonly=false);-- heap + alter table pt_ao_tab exchange partition for ('stu') with table ao_can ;-- Heap tab exchanged with AO + alter table pt_ao_tab exchange partition for ('def') with table co_can; --AO tab exchanged with CO + alter table pt_ao_tab exchange partition for ('pqr') with table heap_can; --CO tab exchanged with Heap +--Check for the storage properties and indexes of the two tables involved in the exchange + \d+ heap_can + Table "public.heap_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +---------+---------+-----------+----------+---------+----------+--------------+------------------+-------------------+------------+------------- + a | integer | | | | plain | | zlib | 5 | 32768 | + b | text | | | | extended | | zlib | 5 | 32768 | + c | integer | | | | plain | | zlib | 5 | 32768 | + d | integer | | | | plain | | zlib | 5 | 32768 | + e | numeric | | | | main | | zlib | 5 | 32768 | + success | boolean | | | | plain | | zlib | 5 | 32768 | +Checksum: t +Indexes: + "pt_ao_tab_1_prt_pqr_a_idx" btree (a) WHERE c > 10 + "pt_ao_tab_1_prt_pqr_upper_idx" btree (upper(b)) +Distributed by: (a) +Options: compresslevel=5 + + \d+ co_can + Table "public.co_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Compression Type: zlib +Compression Level: 1 +Block Size: 32768 +Checksum: t +Indexes: + "pt_ao_tab_1_prt_def_a_idx" btree (a) WHERE c > 10 + "pt_ao_tab_1_prt_def_upper_idx" btree (upper(b)) +Distributed by: (a) +Options: compresslevel=1 + + \d+ ao_can + Table "public.ao_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Indexes: + "pt_ao_tab_1_prt_stu_a_idx" btree (a) WHERE c > 10 + "pt_ao_tab_1_prt_stu_upper_idx" btree (upper(b)) +Distributed by: (a) + +--Further operations + alter table pt_ao_tab drop partition jkl; + truncate table pt_ao_tab; +--Further create some more indexes + create index ao_idx3 on pt_ao_tab(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX ao_idx4 ON pt_ao_tab ((b || ' ' || e)); --Expression +--Add default partition + alter table pt_ao_tab add default partition dft; +--Split default partition + alter table pt_ao_tab split default partition at ('uvw') into (partition dft, partition uvw); +--Create an CO table with partitions ( having diff storage parameters) +--start_ignore + drop table if exists pt_co_tab cascade; +NOTICE: table "pt_co_tab" does not exist, skipping +--end_ignore +Create table pt_co_tab(a int, b text, c int , d int, e numeric,success bool) with ( appendonly = true, orientation = column) + partition by list(b) + ( + partition abc values ('abc','abc1','abc2') with (appendonly=false), -- HEAP + partition def values ('def','def1','def3') with (appendonly=true, compresslevel=1), + partition ghi values ('ghi','ghi1','ghi2') with (appendonly=true), -- AO + default partition dft + ); +--Create indexes on the table +--start_ignore +drop index if exists co_idx1 cascade; +NOTICE: index "co_idx1" does not exist, skipping +drop index if exists co_idx2 cascade; +NOTICE: index "co_idx2" does not exist, skipping +--end_ignore + -- Partial index + create index co_idx1 on pt_co_tab(a) where c > 10; + -- Expression index + create index co_idx2 on pt_co_tab(upper(b)); +--Drop partition + alter table pt_co_tab drop default partition; +--Add partition + alter table pt_co_tab add partition xyz values ('xyz','xyz1','xyz2') WITH (appendonly=true,orientation=column,compresslevel=5); --CO + alter table pt_co_tab add partition jkl values ('jkl','jkl1','jkl2') WITH (appendonly=true,compresslevel=1); -- AO + alter table pt_co_tab add partition mno values ('mno','mno1','mno2') WITH (appendonly=false); --Heap +--Check properties of the added partition tables + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_co_tab_1_prt_xyz', 'pt_co_tab_1_prt_jkl','pt_co_tab_1_prt_mno')); + oid | relkind | amname | reloptions +---------------------+---------+-----------+------------------- + pt_co_tab_1_prt_xyz | r | ao_column | {compresslevel=5} + pt_co_tab_1_prt_jkl | r | ao_row | {compresslevel=1} + pt_co_tab_1_prt_mno | r | heap | +(3 rows) + +--Insert Data + insert into pt_co_tab select 1, 'xyz', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'abc', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'def', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'ghi', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'jkl', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'mno', 1, 1, 1.0 , true from generate_series(1, 10); +--Split partition [Creates new partitions to be of the same type as the parent partition. All heap partitions created] + alter table pt_co_tab split partition abc at ('abc1') into ( partition abc1,partition abc2); -- Heap + alter table pt_co_tab split partition ghi at ('ghi1') into ( partition ghi1,partition ghi2); --AO + alter table pt_co_tab split partition xyz at ('xyz1') into ( partition xyz1,partition xyz2); --CO +--Check the storage type and properties of the split partition + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in (select oid from pg_class where relname in ('pt_co_tab_1_prt_xyz1','pt_co_tab_1_prt_xyz2','pt_co_tab_1_prt_ghi1','pt_co_tab_1_prt_ghi2','pt_co_tab_1_prt_abc1','pt_co_tab_1_prt_abc2')); + oid | relkind | amname | reloptions +----------------------+---------+-----------+------------------- + pt_co_tab_1_prt_ghi2 | r | ao_row | + pt_co_tab_1_prt_abc1 | r | heap | + pt_co_tab_1_prt_abc2 | r | heap | + pt_co_tab_1_prt_ghi1 | r | ao_row | + pt_co_tab_1_prt_xyz1 | r | ao_column | {compresslevel=5} + pt_co_tab_1_prt_xyz2 | r | ao_column | {compresslevel=5} +(6 rows) + +--Exchange partition + -- Create candidate table +--start_ignore +drop table if exists heap_can cascade; +drop table if exists ao_can cascade; +drop table if exists co_can cascade; +--end_ignore + create table heap_can(like pt_co_tab including indexes); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table ao_can(like pt_co_tab including indexes) with (appendonly=true); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table co_can(like pt_co_tab including indexes) with (appendonly=true,orientation=column); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + -- Exchange + alter table pt_co_tab add partition pqr values ('pqr','pqr1','pqr2') WITH (appendonly=true,compresslevel=5);-- AO + alter table pt_co_tab add partition stu values ('stu','stu1','stu2') WITH (appendonly=false);-- heap + alter table pt_co_tab exchange partition for ('stu') with table ao_can ; -- Heap exchanged with AO + alter table pt_co_tab exchange partition for ('pqr') with table co_can; -- AO exchanged with CO + alter table pt_co_tab exchange partition for ('xyz1') with table heap_can; -- CO exchanged with Heap +--Check for the storage properties and indexes of the two tables involved in the exchange + \d+ heap_can + Table "public.heap_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +---------+---------+-----------+----------+---------+----------+--------------+------------------+-------------------+------------+------------- + a | integer | | | | plain | | zlib | 5 | 32768 | + b | text | | | | extended | | zlib | 5 | 32768 | + c | integer | | | | plain | | zlib | 5 | 32768 | + d | integer | | | | plain | | zlib | 5 | 32768 | + e | numeric | | | | main | | zlib | 5 | 32768 | + success | boolean | | | | plain | | zlib | 5 | 32768 | +Checksum: t +Indexes: + "pt_co_tab_1_prt_xyz2_a_idx" btree (a) WHERE c > 10 + "pt_co_tab_1_prt_xyz2_upper_idx" btree (upper(b)) +Distributed by: (a) +Options: compresslevel=5 + + \d+ co_can + Table "public.co_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Compression Type: zlib +Compression Level: 5 +Block Size: 32768 +Checksum: t +Indexes: + "pt_co_tab_1_prt_pqr_a_idx" btree (a) WHERE c > 10 + "pt_co_tab_1_prt_pqr_upper_idx" btree (upper(b)) +Distributed by: (a) +Options: compresslevel=5 + + \d+ ao_can + Table "public.ao_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Indexes: + "pt_co_tab_1_prt_stu_a_idx" btree (a) WHERE c > 10 + "pt_co_tab_1_prt_stu_upper_idx" btree (upper(b)) +Distributed by: (a) + +-- Further operations + alter table pt_co_tab drop partition jkl; + truncate table pt_co_tab; +--Further create some more indexes + create index idx3 on pt_co_tab(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX idx5 ON pt_co_tab ((b || ' ' || e)); --Expression +--Add default partition + alter table pt_co_tab add default partition dft; +--Split default partition + alter table pt_co_tab split default partition at ('uvw') into (partition dft, partition uvw); +-- create range partitioned Heap table +--start_ignore + drop table if exists pt_heap_tab_rng cascade; +NOTICE: table "pt_heap_tab_rng" does not exist, skipping +--end_ignore + CREATE TABLE pt_heap_tab_rng (a int, b text, c int , d int, e numeric,success bool) with (appendonly=false) + partition by range(a) + ( + start(1) end(20) every(5), + default partition dft + ); +-- Create indexes on the table + -- partial index + create index heap_rng_idx1 on pt_heap_tab_rng(a) where c > 10; + -- expression index + create index heap_rng_idx2 on pt_heap_tab_rng(upper(b)); +-- Drop partition + Alter table pt_heap_tab_rng drop default partition; +-- ADD partitions + alter table pt_heap_tab_rng add partition heap start(21) end(25) with (appendonly=false); + alter table pt_heap_tab_rng add partition ao start(25) end(30) with (appendonly=true); + alter table pt_heap_tab_rng add partition co start(31) end(35) with (appendonly=true,orientation=column); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_heap_tab_rng_1_prt_heap', 'pt_heap_tab_rng_1_prt_ao','pt_heap_tab_rng_1_prt_co')); + oid | relkind | amname | reloptions +----------------------------+---------+-----------+------------ + pt_heap_tab_rng_1_prt_heap | r | heap | + pt_heap_tab_rng_1_prt_ao | r | ao_row | + pt_heap_tab_rng_1_prt_co | r | ao_column | +(3 rows) + +-- Split partition + alter table pt_heap_tab_rng split partition heap at (23) into (partition heap1,partition heap2); + alter table pt_heap_tab_rng split partition ao at (27) into (partition ao1,partition ao2); + alter table pt_heap_tab_rng split partition co at (33) into (partition co1,partition co2); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_heap_tab_rng_1_prt_heap1' ,'pt_heap_tab_rng_1_prt_heap2' ,'pt_heap_tab_rng_1_prt_ao1', 'pt_heap_tab_rng_1_prt_ao2', 'pt_heap_tab_rng_1_prt_co1', 'pt_heap_tab_rng_1_prt_co2')); + oid | relkind | amname | reloptions +-----------------------------+---------+-----------+------------ + pt_heap_tab_rng_1_prt_heap1 | r | heap | + pt_heap_tab_rng_1_prt_heap2 | r | heap | + pt_heap_tab_rng_1_prt_ao1 | r | ao_row | + pt_heap_tab_rng_1_prt_ao2 | r | ao_row | + pt_heap_tab_rng_1_prt_co1 | r | ao_column | + pt_heap_tab_rng_1_prt_co2 | r | ao_column | +(6 rows) + +-- Exchange + -- Create candidate table +--start_ignore + drop table if exists heap_can; + drop table if exists ao_can; + drop table if exists co_can; +--end_ignore + create table heap_can(like pt_heap_tab_rng including indexes); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table ao_can(like pt_heap_tab_rng including indexes) with (appendonly=true); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table co_can(like pt_heap_tab_rng including indexes) with (appendonly=true,orientation=column); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + alter table pt_heap_tab_rng add partition newco start(36) end(40) with (appendonly= true, orientation = column); + alter table pt_heap_tab_rng add partition newao start(40) end(45) with (appendonly= true); + -- Exchange + alter table pt_heap_tab_rng exchange partition heap1 with table ao_can; -- HEAP <=> AO + alter table pt_heap_tab_rng exchange partition newao with table co_can; -- AO <=> CO + alter table pt_heap_tab_rng exchange partition newco with table heap_can; -- CO <=> HEAP + \d+ ao_can + Table "public.ao_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Indexes: + "pt_heap_tab_rng_1_prt_heap1_a_idx" btree (a) WHERE c > 10 + "pt_heap_tab_rng_1_prt_heap1_upper_idx" btree (upper(b)) +Distributed by: (a) + + \d+ co_can + Table "public.co_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Compression Type: None +Compression Level: 0 +Block Size: 32768 +Checksum: t +Indexes: + "pt_heap_tab_rng_1_prt_newao_a_idx" btree (a) WHERE c > 10 + "pt_heap_tab_rng_1_prt_newao_upper_idx" btree (upper(b)) +Distributed by: (a) + + \d+ heap_can + Table "public.heap_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +---------+---------+-----------+----------+---------+----------+--------------+------------------+-------------------+------------+------------- + a | integer | | | | plain | | none | 0 | 32768 | + b | text | | | | extended | | none | 0 | 32768 | + c | integer | | | | plain | | none | 0 | 32768 | + d | integer | | | | plain | | none | 0 | 32768 | + e | numeric | | | | main | | none | 0 | 32768 | + success | boolean | | | | plain | | none | 0 | 32768 | +Checksum: t +Indexes: + "pt_heap_tab_rng_1_prt_newco_a_idx" btree (a) WHERE c > 10 + "pt_heap_tab_rng_1_prt_newco_upper_idx" btree (upper(b)) +Distributed by: (a) + +-- Create more index indexes + create index heap_rng_idx3 on pt_heap_tab_rng(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX heap_rng_idx4 ON pt_heap_tab_rng ((b || ' ' || e)); --Expression +-- Add default partition + alter table pt_heap_tab_rng add default partition dft; +--Split default partition + alter table pt_heap_tab_rng split default partition start(45) end(60) into (partition dft, partition two); +-- create range partitioned AO table +--start_ignore + drop table if exists pt_ao_tab_rng cascade; +NOTICE: table "pt_ao_tab_rng" does not exist, skipping +--end_ignore + CREATE TABLE pt_ao_tab_rng (a int, b text, c int , d int, e numeric,success bool) with (appendonly=true,compresstype=zlib, compresslevel=1) + partition by range(a) + ( + start(1) end(20) every(5), + default partition dft + ); +--Create indexes on the table + -- partial index + create index ao_rng_idx1 on pt_ao_tab_rng(a) where c > 10; + -- expression index + create index ao_rng_idx2 on pt_ao_tab_rng(upper(b)); +--Drop partition + Alter table pt_ao_tab_rng drop default partition; +--ADD partitions + alter table pt_ao_tab_rng add partition heap start(21) end(25) with (appendonly=false); + alter table pt_ao_tab_rng add partition ao start(25) end(30) with (appendonly=true); + alter table pt_ao_tab_rng add partition co start(31) end(35) with (appendonly=true,orientation=column); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_ao_tab_rng_1_prt_heap', 'pt_ao_tab_rng_1_prt_ao','pt_ao_tab_rng_1_prt_co')); + oid | relkind | amname | reloptions +--------------------------+---------+-----------+------------ + pt_ao_tab_rng_1_prt_heap | r | heap | + pt_ao_tab_rng_1_prt_ao | r | ao_row | + pt_ao_tab_rng_1_prt_co | r | ao_column | +(3 rows) + +--Split partition + alter table pt_ao_tab_rng split partition heap at (23) into (partition heap1,partition heap2); + alter table pt_ao_tab_rng split partition ao at (27) into (partition ao1,partition ao2); + alter table pt_ao_tab_rng split partition co at (33) into (partition co1,partition co2); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_ao_tab_rng_1_prt_heap1' ,'pt_ao_tab_rng_1_prt_heap2' ,'pt_ao_tab_rng_1_prt_ao1', 'pt_ao_tab_rng_1_prt_ao2', 'pt_ao_tab_rng_1_prt_co1', 'pt_ao_tab_rng_1_prt_co2')); + oid | relkind | amname | reloptions +---------------------------+---------+-----------+------------ + pt_ao_tab_rng_1_prt_heap1 | r | heap | + pt_ao_tab_rng_1_prt_heap2 | r | heap | + pt_ao_tab_rng_1_prt_ao2 | r | ao_row | + pt_ao_tab_rng_1_prt_co2 | r | ao_column | + pt_ao_tab_rng_1_prt_ao1 | r | ao_row | + pt_ao_tab_rng_1_prt_co1 | r | ao_column | +(6 rows) + +--Exchange + -- Create candidate table +--start_ignore +drop table if exists heap_can cascade; +drop table if exists ao_can cascade; +drop table if exists co_can cascade; +--end_ignore + create table heap_can(like pt_ao_tab_rng including indexes); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table ao_can(like pt_ao_tab_rng including indexes) with (appendonly=true); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table co_can(like pt_ao_tab_rng including indexes) with (appendonly=true,orientation=column); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + alter table pt_ao_tab_rng add partition newco start(36) end(40) with (appendonly= true, orientation = column); + alter table pt_ao_tab_rng add partition newheap start(40) end(45) with (appendonly= false); + -- Exchange + alter table pt_ao_tab_rng exchange partition newheap with table ao_can; -- HEAP <=> AO + alter table pt_ao_tab_rng exchange partition ao1 with table co_can;-- AO <=> CO + alter table pt_ao_tab_rng exchange partition newco with table heap_can; --CO <=> HEAP + \d+ ao_can + Table "public.ao_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Indexes: + "pt_ao_tab_rng_1_prt_newheap_a_idx" btree (a) WHERE c > 10 + "pt_ao_tab_rng_1_prt_newheap_upper_idx" btree (upper(b)) +Distributed by: (a) + + \d+ co_can + Table "public.co_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Compression Type: None +Compression Level: 0 +Block Size: 32768 +Checksum: t +Indexes: + "pt_ao_tab_rng_1_prt_ao1_a_idx" btree (a) WHERE c > 10 + "pt_ao_tab_rng_1_prt_ao1_upper_idx" btree (upper(b)) +Distributed by: (a) + + \d+ heap_can + Table "public.heap_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +---------+---------+-----------+----------+---------+----------+--------------+------------------+-------------------+------------+------------- + a | integer | | | | plain | | none | 0 | 32768 | + b | text | | | | extended | | none | 0 | 32768 | + c | integer | | | | plain | | none | 0 | 32768 | + d | integer | | | | plain | | none | 0 | 32768 | + e | numeric | | | | main | | none | 0 | 32768 | + success | boolean | | | | plain | | none | 0 | 32768 | +Checksum: t +Indexes: + "pt_ao_tab_rng_1_prt_newco_a_idx" btree (a) WHERE c > 10 + "pt_ao_tab_rng_1_prt_newco_upper_idx" btree (upper(b)) +Distributed by: (a) + +-- Create more index indexes + create index ao_rng_idx3 on pt_ao_tab_rng(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX ao_rng_idx4 ON pt_ao_tab_rng ((b || ' ' || e)); --Expression +--Add default partition + alter table pt_ao_tab_rng add default partition dft; +--Split default partition + alter table pt_ao_tab_rng split default partition start(45) end(60) into (partition dft, partition two); +--create range partitioned CO table +--start_ignore + drop table if exists pt_co_tab_rng cascade; +NOTICE: table "pt_co_tab_rng" does not exist, skipping +--end_ignore + CREATE TABLE pt_co_tab_rng (a int, b text, c int , d int, e numeric,success bool) with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + partition by range(a) + ( + start(1) end(20) every(5), + default partition dft + ); +--Create indexes on the table + -- partial index + create index co_rng_idx1 on pt_co_tab_rng(a) where c > 10; + -- expression index + create index co_rng_idx2 on pt_co_tab_rng(upper(b)); +--Drop partition + Alter table pt_co_tab_rng drop default partition; +--ADD partitions + alter table pt_co_tab_rng add partition heap start(21) end(25) with (appendonly=false); + alter table pt_co_tab_rng add partition ao start(25) end(30) with (appendonly=true); + alter table pt_co_tab_rng add partition co start(31) end(35) with (appendonly=true,orientation=column); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_co_tab_rng_1_prt_heap', 'pt_co_tab_rng_1_prt_ao','pt_co_tab_rng_1_prt_co')); + oid | relkind | amname | reloptions +--------------------------+---------+-----------+------------ + pt_co_tab_rng_1_prt_heap | r | heap | + pt_co_tab_rng_1_prt_ao | r | ao_row | + pt_co_tab_rng_1_prt_co | r | ao_column | +(3 rows) + +--Split partition + alter table pt_co_tab_rng split partition heap at (23) into (partition heap1,partition heap2); + alter table pt_co_tab_rng split partition ao at (27) into (partition ao1,partition ao2); + alter table pt_co_tab_rng split partition co at (33) into (partition co1,partition co2); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_co_tab_rng_1_prt_heap1' ,'pt_co_tab_rng_1_prt_heap2' ,'pt_co_tab_rng_1_prt_ao1', 'pt_co_tab_rng_1_prt_ao2', 'pt_co_tab_rng_1_prt_co1', 'pt_co_tab_rng_1_prt_co2')); + oid | relkind | amname | reloptions +---------------------------+---------+-----------+------------ + pt_co_tab_rng_1_prt_heap1 | r | heap | + pt_co_tab_rng_1_prt_heap2 | r | heap | + pt_co_tab_rng_1_prt_ao1 | r | ao_row | + pt_co_tab_rng_1_prt_ao2 | r | ao_row | + pt_co_tab_rng_1_prt_co1 | r | ao_column | + pt_co_tab_rng_1_prt_co2 | r | ao_column | +(6 rows) + +--Exchange + -- Create candidate table +--start_ignore +drop table if exists heap_can cascade; +drop table if exists ao_can cascade; +drop table if exists co_can cascade; +--end_ignore + create table heap_can(like pt_co_tab_rng including indexes); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table ao_can(like pt_co_tab_rng including indexes) with (appendonly=true); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + create table co_can(like pt_co_tab_rng including indexes) with (appendonly=true,orientation=column); +NOTICE: table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE table + alter table pt_co_tab_rng add partition newao start(36) end(40) with (appendonly= true); + alter table pt_co_tab_rng add partition newheap start(40) end(45) with (appendonly= false); + -- Exchange + alter table pt_co_tab_rng exchange partition newheap with table ao_can;-- HEAP <=> AO + alter table pt_co_tab_rng exchange partition newao with table co_can; -- AO <=> CO + alter table pt_co_tab_rng exchange partition co1 with table heap_can; -- CO <=> HEAP + \d+ ao_can + Table "public.ao_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Indexes: + "pt_co_tab_rng_1_prt_newheap_a_idx" btree (a) WHERE c > 10 + "pt_co_tab_rng_1_prt_newheap_upper_idx" btree (upper(b)) +Distributed by: (a) + + \d+ co_can + Table "public.co_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | + c | integer | | | | plain | | + d | integer | | | | plain | | + e | numeric | | | | main | | + success | boolean | | | | plain | | +Compression Type: None +Compression Level: 0 +Block Size: 32768 +Checksum: t +Indexes: + "pt_co_tab_rng_1_prt_newao_a_idx" btree (a) WHERE c > 10 + "pt_co_tab_rng_1_prt_newao_upper_idx" btree (upper(b)) +Distributed by: (a) + + \d+ heap_can + Table "public.heap_can" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +---------+---------+-----------+----------+---------+----------+--------------+------------------+-------------------+------------+------------- + a | integer | | | | plain | | none | 0 | 32768 | + b | text | | | | extended | | none | 0 | 32768 | + c | integer | | | | plain | | none | 0 | 32768 | + d | integer | | | | plain | | none | 0 | 32768 | + e | numeric | | | | main | | none | 0 | 32768 | + success | boolean | | | | plain | | none | 0 | 32768 | +Checksum: t +Indexes: + "pt_co_tab_rng_1_prt_co1_a_idx" btree (a) WHERE c > 10 + "pt_co_tab_rng_1_prt_co1_upper_idx" btree (upper(b)) +Distributed by: (a) + +-- Create more index indexes + create index co_rng_idx3 on pt_co_tab_rng(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX co_rng_idx4 ON pt_co_tab_rng ((b || ' ' || e)); --Expression +-- Add default partition + alter table pt_co_tab_rng add default partition dft; +-- Split default partition + alter table pt_co_tab_rng split default partition start(45) end(60) into (partition dft, partition two); diff --git a/src/test/singlenode_regress/expected/partition_subquery.out b/src/test/singlenode_regress/expected/partition_subquery.out new file mode 100644 index 00000000000..340bd8ebb76 --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_subquery.out @@ -0,0 +1,21 @@ +CREATE SCHEMA partition_subquery; +SET SEARCH_PATH=partition_subquery; +-- Given a partition table +CREATE TABLE pt1(id int) PARTITION BY RANGE (id) (DEFAULT PARTITION p1); +-- When I run a query, outermost query, and it is selecting FROM a subquery +-- And that subquery, subquery 1, contains another subquery, subquery 2 +-- And the outermost query aggregates over a column from an inherited table +-- And the subquery 1 is prevented from being pulled up into a join +SELECT id FROM ( + SELECT id, sum(id) OVER() as sum_id FROM ( + SELECT id FROM pt1 + ) as sq1 +) as sq2 GROUP BY id; + id +---- +(0 rows) + +-- Then, the query executes successfully +--start_ignore +DROP TABLE IF EXISTS pt1; +--end_ignore diff --git a/src/test/singlenode_regress/expected/partition_unlogged.out b/src/test/singlenode_regress/expected/partition_unlogged.out new file mode 100644 index 00000000000..5dacc9b204f --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_unlogged.out @@ -0,0 +1,30 @@ +-- Given an unlogged partition table with two leaf partitions +CREATE UNLOGGED TABLE unlogged_pt1(a int) PARTITION BY RANGE(a) (START(1) END(4) EVERY (2)); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +SELECT relpersistence, relname FROM pg_class WHERE relname like 'unlogged_pt1%'; + relpersistence | relname +----------------+---------------------- + u | unlogged_pt1 + u | unlogged_pt1_1_prt_1 + u | unlogged_pt1_1_prt_2 +(3 rows) + +-- When I split the first partition +ALTER TABLE unlogged_pt1 SPLIT PARTITION FOR(2) AT(2) INTO (PARTITION p1, PARTITION p2); +-- Then the resulting two new relations have relation persistence type 'u' for unlogged +SELECT relpersistence, relname FROM pg_class WHERE relname like 'unlogged_pt1%'; + relpersistence | relname +----------------+----------------------- + u | unlogged_pt1 + u | unlogged_pt1_1_prt_2 + u | unlogged_pt1_1_prt_p1 + u | unlogged_pt1_1_prt_p2 +(4 rows) + +-- Given a permanent table +CREATE TABLE perm_tab(a INT); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +-- When I exchange partition 2 from unlogged_pt1 with this permanent table, perm_tab +ALTER TABLE unlogged_pt1 EXCHANGE PARTITION FOR (3) WITH TABLE perm_tab; diff --git a/src/test/singlenode_regress/expected/partition_with_user_defined_function.out b/src/test/singlenode_regress/expected/partition_with_user_defined_function.out new file mode 100644 index 00000000000..83e74604981 --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_with_user_defined_function.out @@ -0,0 +1,34 @@ +CREATE SCHEMA IF NOT EXISTS partition_with_user_defined_function; +-- Given there is a partitioned table + create table partition_with_user_defined_function.some_partitioned_table + ( + a integer + ) + partition by range (a) ( + partition b start (0) + ); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +-- And a function that queried the partitioned table + CREATE OR REPLACE FUNCTION partition_with_user_defined_function.query_a_partition_table() RETURNS VOID AS + $$ + BEGIN + PERFORM * FROM partition_with_user_defined_function.some_partitioned_table; + END; + $$ LANGUAGE plpgsql; +-- When I call the function twice + select partition_with_user_defined_function.query_a_partition_table(); + query_a_partition_table +------------------------- + +(1 row) + +-- Then I get the same result both times (no rows) +-- Note: We're using a cached plan that includes a Dynamic Seq Scan. +-- Ensure the dynamic table scan information in the cached plan does not get freed. + select partition_with_user_defined_function.query_a_partition_table(); + query_a_partition_table +------------------------- + +(1 row) + diff --git a/src/test/singlenode_regress/expected/partition_with_user_defined_function_that_truncates.out b/src/test/singlenode_regress/expected/partition_with_user_defined_function_that_truncates.out new file mode 100644 index 00000000000..1f0df73747e --- /dev/null +++ b/src/test/singlenode_regress/expected/partition_with_user_defined_function_that_truncates.out @@ -0,0 +1,59 @@ +-- Given there is a partitioned table + create table some_partitioned_table_to_truncate + ( + a integer + ) + partition by range (a) ( + partition b start (0) + ); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +-- And a function that truncates the partitioned table + CREATE OR REPLACE FUNCTION truncate_a_partition_table() RETURNS VOID AS + $$ + BEGIN + TRUNCATE some_partitioned_table_to_truncate; + END; + $$ LANGUAGE plpgsql; +-- When I truncate the table twice + insert into some_partitioned_table_to_truncate + select i from generate_series(1, 10) i; + select count(*) from some_partitioned_table_to_truncate; + count +------- + 10 +(1 row) + + select truncate_a_partition_table(); + truncate_a_partition_table +---------------------------- + +(1 row) + + select count(*) from some_partitioned_table_to_truncate; + count +------- + 0 +(1 row) + +-- Then I get the same result both times (no rows) + insert into some_partitioned_table_to_truncate + select i from generate_series(1, 10) i; + select count(*) from some_partitioned_table_to_truncate; + count +------- + 10 +(1 row) + + select truncate_a_partition_table(); + truncate_a_partition_table +---------------------------- + +(1 row) + + select count(*) from some_partitioned_table_to_truncate; + count +------- + 0 +(1 row) + diff --git a/src/test/singlenode_regress/expected/password.out b/src/test/singlenode_regress/expected/password.out new file mode 100644 index 00000000000..7c84c9da337 --- /dev/null +++ b/src/test/singlenode_regress/expected/password.out @@ -0,0 +1,144 @@ +-- +-- Tests for password types +-- +-- Tests for GUC password_encryption +SET password_encryption = 'novalue'; -- error +ERROR: invalid value for parameter "password_encryption": "novalue" +HINT: Available values: md5, scram-sha-256. +SET password_encryption = true; -- error +ERROR: invalid value for parameter "password_encryption": "true" +HINT: Available values: md5, scram-sha-256. +SET password_encryption = 'md5'; -- ok +SET password_encryption = 'scram-sha-256'; -- ok +-- consistency of password entries +SET password_encryption = 'md5'; +CREATE ROLE regress_passwd1 PASSWORD 'role_pwd1'; +CREATE ROLE regress_passwd2 PASSWORD 'role_pwd2'; +SET password_encryption = 'scram-sha-256'; +CREATE ROLE regress_passwd3 PASSWORD 'role_pwd3'; +CREATE ROLE regress_passwd4 PASSWORD NULL; +-- check list of created entries +-- +-- The scram secret will look something like: +-- SCRAM-SHA-256$4096:E4HxLGtnRzsYwg==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo= +-- +-- Since the salt is random, the exact value stored will be different on every test +-- run. Use a regular expression to mask the changing parts. +SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:$:') as rolpassword_masked + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; + rolname | rolpassword_masked +-----------------+--------------------------------------------------- + regress_passwd1 | md5783277baca28003b33453252be4dbb34 + regress_passwd2 | md54044304ba511dd062133eb5b4b84a2a3 + regress_passwd3 | SCRAM-SHA-256$4096:$: + regress_passwd4 | +(4 rows) + +-- Rename a role +ALTER ROLE regress_passwd2 RENAME TO regress_passwd2_new; +NOTICE: MD5 password cleared because of role rename +-- md5 entry should have been removed +SELECT rolname, rolpassword + FROM pg_authid + WHERE rolname LIKE 'regress_passwd2_new' + ORDER BY rolname, rolpassword; + rolname | rolpassword +---------------------+------------- + regress_passwd2_new | +(1 row) + +ALTER ROLE regress_passwd2_new RENAME TO regress_passwd2; +-- Change passwords with ALTER USER. With plaintext or already-encrypted +-- passwords. +SET password_encryption = 'md5'; +-- encrypt with MD5 +ALTER ROLE regress_passwd2 PASSWORD 'foo'; +-- already encrypted, use as they are +ALTER ROLE regress_passwd1 PASSWORD 'md5cd3578025fe2c3d7ed1b9a9b26238b70'; +ALTER ROLE regress_passwd3 PASSWORD 'SCRAM-SHA-256$4096:VLK4RMaQLCvNtQ==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo='; +SET password_encryption = 'scram-sha-256'; +-- create SCRAM secret +ALTER ROLE regress_passwd4 PASSWORD 'foo'; +-- already encrypted with MD5, use as it is +CREATE ROLE regress_passwd5 PASSWORD 'md5e73a4b11df52a6068f8b39f90be36023'; +-- This looks like a valid SCRAM-SHA-256 secret, but it is not +-- so it should be hashed with SCRAM-SHA-256. +CREATE ROLE regress_passwd6 PASSWORD 'SCRAM-SHA-256$1234'; +-- These may look like valid MD5 secrets, but they are not, so they +-- should be hashed with SCRAM-SHA-256. +-- trailing garbage at the end +CREATE ROLE regress_passwd7 PASSWORD 'md5012345678901234567890123456789zz'; +-- invalid length +CREATE ROLE regress_passwd8 PASSWORD 'md501234567890123456789012345678901zz'; +SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:$:') as rolpassword_masked + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; + rolname | rolpassword_masked +-----------------+--------------------------------------------------- + regress_passwd1 | md5cd3578025fe2c3d7ed1b9a9b26238b70 + regress_passwd2 | md5dfa155cadd5f4ad57860162f3fab9cdb + regress_passwd3 | SCRAM-SHA-256$4096:$: + regress_passwd4 | SCRAM-SHA-256$4096:$: + regress_passwd5 | md5e73a4b11df52a6068f8b39f90be36023 + regress_passwd6 | SCRAM-SHA-256$4096:$: + regress_passwd7 | SCRAM-SHA-256$4096:$: + regress_passwd8 | SCRAM-SHA-256$4096:$: +(8 rows) + +-- An empty password is not allowed, in any form +CREATE ROLE regress_passwd_empty PASSWORD ''; +NOTICE: empty string is not a valid password, clearing password +ALTER ROLE regress_passwd_empty PASSWORD 'md585939a5ce845f1a1b620742e3c659e0a'; +NOTICE: empty string is not a valid password, clearing password +ALTER ROLE regress_passwd_empty PASSWORD 'SCRAM-SHA-256$4096:hpFyHTUsSWcR7O9P$LgZFIt6Oqdo27ZFKbZ2nV+vtnYM995pDh9ca6WSi120=:qVV5NeluNfUPkwm7Vqat25RjSPLkGeoZBQs6wVv+um4='; +NOTICE: empty string is not a valid password, clearing password +SELECT rolpassword FROM pg_authid WHERE rolname='regress_passwd_empty'; + rolpassword +------------- + +(1 row) + +-- Test with invalid stored and server keys. +-- +-- The first is valid, to act as a control. The others have too long +-- stored/server keys. They will be re-hashed. +CREATE ROLE regress_passwd_sha_len0 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI='; +CREATE ROLE regress_passwd_sha_len1 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96RqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI='; +CREATE ROLE regress_passwd_sha_len2 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; +-- Check that the invalid secrets were re-hashed. A re-hashed secret +-- should not contain the original salt. +SELECT rolname, rolpassword not like '%A6xHKoH/494E941doaPOYg==%' as is_rolpassword_rehashed + FROM pg_authid + WHERE rolname LIKE 'regress_passwd_sha_len%' + ORDER BY rolname; + rolname | is_rolpassword_rehashed +-------------------------+------------------------- + regress_passwd_sha_len0 | f + regress_passwd_sha_len1 | t + regress_passwd_sha_len2 | t +(3 rows) + +DROP ROLE regress_passwd1; +DROP ROLE regress_passwd2; +DROP ROLE regress_passwd3; +DROP ROLE regress_passwd4; +DROP ROLE regress_passwd5; +DROP ROLE regress_passwd6; +DROP ROLE regress_passwd7; +DROP ROLE regress_passwd8; +DROP ROLE regress_passwd_empty; +DROP ROLE regress_passwd_sha_len0; +DROP ROLE regress_passwd_sha_len1; +DROP ROLE regress_passwd_sha_len2; +-- all entries should have been removed +SELECT rolname, rolpassword + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; + rolname | rolpassword +---------+------------- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/path.out b/src/test/singlenode_regress/expected/path.out new file mode 100644 index 00000000000..7ef68d0cd56 --- /dev/null +++ b/src/test/singlenode_regress/expected/path.out @@ -0,0 +1,82 @@ +-- +-- PATH +-- +--DROP TABLE PATH_TBL; +CREATE TABLE PATH_TBL (f1 path); +INSERT INTO PATH_TBL VALUES ('[(1,2),(3,4)]'); +INSERT INTO PATH_TBL VALUES (' ( ( 1 , 2 ) , ( 3 , 4 ) ) '); +INSERT INTO PATH_TBL VALUES ('[ (0,0),(3,0),(4,5),(1,6) ]'); +INSERT INTO PATH_TBL VALUES ('((1,2) ,(3,4 ))'); +INSERT INTO PATH_TBL VALUES ('1,2 ,3,4 '); +INSERT INTO PATH_TBL VALUES (' [1,2,3, 4] '); +INSERT INTO PATH_TBL VALUES ('((10,20))'); -- Only one point +INSERT INTO PATH_TBL VALUES ('[ 11,12,13,14 ]'); +INSERT INTO PATH_TBL VALUES ('( 11,12,13,14) '); +-- bad values for parser testing +INSERT INTO PATH_TBL VALUES ('[]'); +ERROR: invalid input syntax for type path: "[]" +LINE 1: INSERT INTO PATH_TBL VALUES ('[]'); + ^ +INSERT INTO PATH_TBL VALUES ('[(,2),(3,4)]'); +ERROR: invalid input syntax for type path: "[(,2),(3,4)]" +LINE 1: INSERT INTO PATH_TBL VALUES ('[(,2),(3,4)]'); + ^ +INSERT INTO PATH_TBL VALUES ('[(1,2),(3,4)'); +ERROR: invalid input syntax for type path: "[(1,2),(3,4)" +LINE 1: INSERT INTO PATH_TBL VALUES ('[(1,2),(3,4)'); + ^ +INSERT INTO PATH_TBL VALUES ('(1,2,3,4'); +ERROR: invalid input syntax for type path: "(1,2,3,4" +LINE 1: INSERT INTO PATH_TBL VALUES ('(1,2,3,4'); + ^ +INSERT INTO PATH_TBL VALUES ('(1,2),(3,4)]'); +ERROR: invalid input syntax for type path: "(1,2),(3,4)]" +LINE 1: INSERT INTO PATH_TBL VALUES ('(1,2),(3,4)]'); + ^ +SELECT f1 AS open_path FROM PATH_TBL WHERE isopen(f1); + open_path +--------------------------- + [(1,2),(3,4)] + [(0,0),(3,0),(4,5),(1,6)] + [(1,2),(3,4)] + [(11,12),(13,14)] +(4 rows) + +SELECT f1 AS closed_path FROM PATH_TBL WHERE isclosed(f1); + closed_path +------------------- + ((1,2),(3,4)) + ((1,2),(3,4)) + ((1,2),(3,4)) + ((10,20)) + ((11,12),(13,14)) +(5 rows) + +SELECT pclose(f1) AS closed_path FROM PATH_TBL; + closed_path +--------------------------- + ((1,2),(3,4)) + ((1,2),(3,4)) + ((0,0),(3,0),(4,5),(1,6)) + ((1,2),(3,4)) + ((1,2),(3,4)) + ((1,2),(3,4)) + ((10,20)) + ((11,12),(13,14)) + ((11,12),(13,14)) +(9 rows) + +SELECT popen(f1) AS open_path FROM PATH_TBL; + open_path +--------------------------- + [(1,2),(3,4)] + [(1,2),(3,4)] + [(0,0),(3,0),(4,5),(1,6)] + [(1,2),(3,4)] + [(1,2),(3,4)] + [(1,2),(3,4)] + [(10,20)] + [(11,12),(13,14)] + [(11,12),(13,14)] +(9 rows) + diff --git a/src/test/singlenode_regress/expected/pg_lsn.out b/src/test/singlenode_regress/expected/pg_lsn.out new file mode 100644 index 00000000000..b10c452540e --- /dev/null +++ b/src/test/singlenode_regress/expected/pg_lsn.out @@ -0,0 +1,257 @@ +-- +-- PG_LSN +-- +CREATE TABLE PG_LSN_TBL (f1 pg_lsn); +-- Largest and smallest input +INSERT INTO PG_LSN_TBL VALUES ('0/0'); +INSERT INTO PG_LSN_TBL VALUES ('FFFFFFFF/FFFFFFFF'); +-- Incorrect input +INSERT INTO PG_LSN_TBL VALUES ('G/0'); +ERROR: invalid input syntax for type pg_lsn: "G/0" +LINE 1: INSERT INTO PG_LSN_TBL VALUES ('G/0'); + ^ +INSERT INTO PG_LSN_TBL VALUES ('-1/0'); +ERROR: invalid input syntax for type pg_lsn: "-1/0" +LINE 1: INSERT INTO PG_LSN_TBL VALUES ('-1/0'); + ^ +INSERT INTO PG_LSN_TBL VALUES (' 0/12345678'); +ERROR: invalid input syntax for type pg_lsn: " 0/12345678" +LINE 1: INSERT INTO PG_LSN_TBL VALUES (' 0/12345678'); + ^ +INSERT INTO PG_LSN_TBL VALUES ('ABCD/'); +ERROR: invalid input syntax for type pg_lsn: "ABCD/" +LINE 1: INSERT INTO PG_LSN_TBL VALUES ('ABCD/'); + ^ +INSERT INTO PG_LSN_TBL VALUES ('/ABCD'); +ERROR: invalid input syntax for type pg_lsn: "/ABCD" +LINE 1: INSERT INTO PG_LSN_TBL VALUES ('/ABCD'); + ^ +-- Min/Max aggregation +SELECT MIN(f1), MAX(f1) FROM PG_LSN_TBL; + min | max +-----+------------------- + 0/0 | FFFFFFFF/FFFFFFFF +(1 row) + +DROP TABLE PG_LSN_TBL; +-- Operators +SELECT '0/16AE7F8' = '0/16AE7F8'::pg_lsn; + ?column? +---------- + t +(1 row) + +SELECT '0/16AE7F8'::pg_lsn != '0/16AE7F7'; + ?column? +---------- + t +(1 row) + +SELECT '0/16AE7F7' < '0/16AE7F8'::pg_lsn; + ?column? +---------- + t +(1 row) + +SELECT '0/16AE7F8' > pg_lsn '0/16AE7F7'; + ?column? +---------- + t +(1 row) + +SELECT '0/16AE7F7'::pg_lsn - '0/16AE7F8'::pg_lsn; + ?column? +---------- + -1 +(1 row) + +SELECT '0/16AE7F8'::pg_lsn - '0/16AE7F7'::pg_lsn; + ?column? +---------- + 1 +(1 row) + +SELECT '0/16AE7F7'::pg_lsn + 16::numeric; + ?column? +----------- + 0/16AE807 +(1 row) + +SELECT 16::numeric + '0/16AE7F7'::pg_lsn; + ?column? +----------- + 0/16AE807 +(1 row) + +SELECT '0/16AE7F7'::pg_lsn - 16::numeric; + ?column? +----------- + 0/16AE7E7 +(1 row) + +SELECT 'FFFFFFFF/FFFFFFFE'::pg_lsn + 1::numeric; + ?column? +------------------- + FFFFFFFF/FFFFFFFF +(1 row) + +SELECT 'FFFFFFFF/FFFFFFFE'::pg_lsn + 2::numeric; -- out of range error +ERROR: pg_lsn out of range +SELECT '0/1'::pg_lsn - 1::numeric; + ?column? +---------- + 0/0 +(1 row) + +SELECT '0/1'::pg_lsn - 2::numeric; -- out of range error +ERROR: pg_lsn out of range +SELECT '0/0'::pg_lsn + ('FFFFFFFF/FFFFFFFF'::pg_lsn - '0/0'::pg_lsn); + ?column? +------------------- + FFFFFFFF/FFFFFFFF +(1 row) + +SELECT 'FFFFFFFF/FFFFFFFF'::pg_lsn - ('FFFFFFFF/FFFFFFFF'::pg_lsn - '0/0'::pg_lsn); + ?column? +---------- + 0/0 +(1 row) + +SELECT '0/16AE7F7'::pg_lsn + 'NaN'::numeric; +ERROR: cannot add NaN to pg_lsn +SELECT '0/16AE7F7'::pg_lsn - 'NaN'::numeric; +ERROR: cannot subtract NaN from pg_lsn +-- Check btree and hash opclasses +EXPLAIN (COSTS OFF) +SELECT DISTINCT (i || '/' || j)::pg_lsn f + FROM generate_series(1, 10) i, + generate_series(1, 10) j, + generate_series(1, 5) k + WHERE i <= 10 AND j > 0 AND j <= 10 + ORDER BY f; + QUERY PLAN +--------------------------------------------------------------------------- + Unique + Group Key: (((((i.i)::text || '/'::text) || (j.j)::text))::pg_lsn) + -> Sort + Sort Key: (((((i.i)::text || '/'::text) || (j.j)::text))::pg_lsn) + -> Nested Loop + -> Nested Loop + -> Function Scan on generate_series i + Filter: (i <= 10) + -> Function Scan on generate_series j + Filter: ((j > 0) AND (j <= 10)) + -> Function Scan on generate_series k + Optimizer: Postgres query optimizer +(12 rows) + +SELECT DISTINCT (i || '/' || j)::pg_lsn f + FROM generate_series(1, 10) i, + generate_series(1, 10) j, + generate_series(1, 5) k + WHERE i <= 10 AND j > 0 AND j <= 10 + ORDER BY f; + f +------- + 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9 + 1/10 + 2/1 + 2/2 + 2/3 + 2/4 + 2/5 + 2/6 + 2/7 + 2/8 + 2/9 + 2/10 + 3/1 + 3/2 + 3/3 + 3/4 + 3/5 + 3/6 + 3/7 + 3/8 + 3/9 + 3/10 + 4/1 + 4/2 + 4/3 + 4/4 + 4/5 + 4/6 + 4/7 + 4/8 + 4/9 + 4/10 + 5/1 + 5/2 + 5/3 + 5/4 + 5/5 + 5/6 + 5/7 + 5/8 + 5/9 + 5/10 + 6/1 + 6/2 + 6/3 + 6/4 + 6/5 + 6/6 + 6/7 + 6/8 + 6/9 + 6/10 + 7/1 + 7/2 + 7/3 + 7/4 + 7/5 + 7/6 + 7/7 + 7/8 + 7/9 + 7/10 + 8/1 + 8/2 + 8/3 + 8/4 + 8/5 + 8/6 + 8/7 + 8/8 + 8/9 + 8/10 + 9/1 + 9/2 + 9/3 + 9/4 + 9/5 + 9/6 + 9/7 + 9/8 + 9/9 + 9/10 + 10/1 + 10/2 + 10/3 + 10/4 + 10/5 + 10/6 + 10/7 + 10/8 + 10/9 + 10/10 +(100 rows) + diff --git a/src/test/singlenode_regress/expected/plancache.out b/src/test/singlenode_regress/expected/plancache.out new file mode 100644 index 00000000000..1033c19bfdd --- /dev/null +++ b/src/test/singlenode_regress/expected/plancache.out @@ -0,0 +1,406 @@ +-- +-- Tests to exercise the plan caching/invalidation mechanism +-- +CREATE TEMP TABLE pcachetest AS SELECT * FROM int8_tbl; +-- create and use a cached plan +PREPARE prepstmt AS SELECT * FROM pcachetest; +EXECUTE prepstmt; + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +-- and one with parameters +PREPARE prepstmt2(bigint) AS SELECT * FROM pcachetest WHERE q1 = $1; +EXECUTE prepstmt2(123); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +-- invalidate the plans and see what happens +DROP TABLE pcachetest; +EXECUTE prepstmt; +ERROR: relation "pcachetest" does not exist +EXECUTE prepstmt2(123); +ERROR: relation "pcachetest" does not exist +-- recreate the temp table (this demonstrates that the raw plan is +-- purely textual and doesn't depend on OIDs, for instance) +CREATE TEMP TABLE pcachetest AS SELECT * FROM int8_tbl ORDER BY 2; +EXECUTE prepstmt; + q1 | q2 +------------------+------------------- + 4567890123456789 | -4567890123456789 + 4567890123456789 | 123 + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(5 rows) + +EXECUTE prepstmt2(123); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +-- prepared statements should prevent change in output tupdesc, +-- since clients probably aren't expecting that to change on the fly +ALTER TABLE pcachetest ADD COLUMN q3 bigint; +EXECUTE prepstmt; +ERROR: cached plan must not change result type +DETAIL: resultDesc is not NULL. plansource->resulDesc is not NULL. +EXECUTE prepstmt2(123); +ERROR: cached plan must not change result type +DETAIL: resultDesc is not NULL. plansource->resulDesc is not NULL. +-- but we're nice guys and will let you undo your mistake +ALTER TABLE pcachetest DROP COLUMN q3; +EXECUTE prepstmt; + q1 | q2 +------------------+------------------- + 4567890123456789 | -4567890123456789 + 4567890123456789 | 123 + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(5 rows) + +EXECUTE prepstmt2(123); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +-- Try it with a view, which isn't directly used in the resulting plan +-- but should trigger invalidation anyway +CREATE TEMP VIEW pcacheview AS + SELECT * FROM pcachetest; +PREPARE vprep AS SELECT * FROM pcacheview; +EXECUTE vprep; + q1 | q2 +------------------+------------------- + 4567890123456789 | -4567890123456789 + 4567890123456789 | 123 + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 4567890123456789 +(5 rows) + +CREATE OR REPLACE TEMP VIEW pcacheview AS + SELECT q1, q2/2 AS q2 FROM pcachetest; +EXECUTE vprep; + q1 | q2 +------------------+------------------- + 4567890123456789 | -2283945061728394 + 4567890123456789 | 61 + 123 | 228 + 123 | 2283945061728394 + 4567890123456789 | 2283945061728394 +(5 rows) + +-- Check basic SPI plan invalidation +create function cache_test(int) returns int as $$ +declare total int; +begin + create temp table t1(f1 int); + insert into t1 values($1); + insert into t1 values(11); + insert into t1 values(12); + insert into t1 values(13); + select sum(f1) into total from t1; + drop table t1; + return total; +end +$$ language plpgsql; +select cache_test(1); + cache_test +------------ + 37 +(1 row) + +select cache_test(2); + cache_test +------------ + 38 +(1 row) + +select cache_test(3); + cache_test +------------ + 39 +(1 row) + +-- Check invalidation of plpgsql "simple expression" +create temp view v1 as + select 2+2 as f1; +create function cache_test_2() returns int as $$ +begin + return f1 from v1; +end$$ language plpgsql; +select cache_test_2(); + cache_test_2 +-------------- + 4 +(1 row) + +create or replace temp view v1 as + select 2+2+4 as f1; +select cache_test_2(); + cache_test_2 +-------------- + 8 +(1 row) + +create or replace temp view v1 as + select 2+2+4+(select max(unique1) from tenk1) as f1; +select cache_test_2(); + cache_test_2 +-------------- + 10007 +(1 row) + +--- Check that change of search_path is honored when re-using cached plan +create schema s1 + create table abc (f1 int); +create schema s2 + create table abc (f1 int); +insert into s1.abc values(123); +insert into s2.abc values(456); +set search_path = s1; +prepare p1 as select f1 from abc; +execute p1; + f1 +----- + 123 +(1 row) + +set search_path = s2; +select f1 from abc; + f1 +----- + 456 +(1 row) + +execute p1; + f1 +----- + 456 +(1 row) + +alter table s1.abc add column f2 float8; -- force replan +execute p1; + f1 +----- + 456 +(1 row) + +drop schema s1 cascade; +NOTICE: drop cascades to table s1.abc +drop schema s2 cascade; +NOTICE: drop cascades to table abc +reset search_path; +-- Check that invalidation deals with regclass constants +create temp sequence seq; +prepare p2 as select nextval('seq'); +execute p2; + nextval +--------- + 1 +(1 row) + +drop sequence seq; +create temp sequence seq; +execute p2; + nextval +--------- + 1 +(1 row) + +-- Check DDL via SPI, immediately followed by SPI plan re-use +-- (bug in original coding) +create function cachebug() returns void as $$ +declare r int; +begin + drop table if exists temptable cascade; + create temp table temptable as select * from generate_series(1,3) as f1; + create temp view vv as select * from temptable; + for r in select * from vv loop + raise notice '%', r; + end loop; +end$$ language plpgsql; +select cachebug(); +NOTICE: table "temptable" does not exist, skipping +NOTICE: 1 +NOTICE: 2 +NOTICE: 3 + cachebug +---------- + +(1 row) + +select cachebug(); +NOTICE: drop cascades to view vv +NOTICE: 1 +NOTICE: 2 +NOTICE: 3 + cachebug +---------- + +(1 row) + +-- Check that addition or removal of any partition is correctly dealt with by +-- default partition table when it is being used in prepared statement. +create table pc_list_parted (a int) partition by list(a); +create table pc_list_part_null partition of pc_list_parted for values in (null); +create table pc_list_part_1 partition of pc_list_parted for values in (1); +create table pc_list_part_def partition of pc_list_parted default; +prepare pstmt_def_insert (int) as insert into pc_list_part_def values($1); +-- should fail +execute pstmt_def_insert(null); +ERROR: new row for relation "pc_list_part_def" violates partition constraint +DETAIL: Failing row contains (null). +execute pstmt_def_insert(1); +ERROR: new row for relation "pc_list_part_def" violates partition constraint +DETAIL: Failing row contains (1). +create table pc_list_part_2 partition of pc_list_parted for values in (2); +execute pstmt_def_insert(2); +ERROR: new row for relation "pc_list_part_def" violates partition constraint +DETAIL: Failing row contains (2). +alter table pc_list_parted detach partition pc_list_part_null; +-- should be ok +execute pstmt_def_insert(null); +drop table pc_list_part_1; +-- should be ok +execute pstmt_def_insert(1); +drop table pc_list_parted, pc_list_part_null; +deallocate pstmt_def_insert; +-- Test plan_cache_mode +create table test_mode (a int); +insert into test_mode select 1 from generate_series(1,1000) union all select 2; +create index on test_mode (a); +analyze test_mode; +prepare test_mode_pp (int) as select count(*) from test_mode where a = $1; +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + name | generic_plans | custom_plans +--------------+---------------+-------------- + test_mode_pp | 0 | 0 +(1 row) + +-- up to 5 executions, custom plan is used +set plan_cache_mode to auto; +explain (costs off) execute test_mode_pp(2); + QUERY PLAN +---------------------------------------------------------- + Aggregate + -> Index Only Scan using test_mode_a_idx on test_mode + Index Cond: (a = 2) + Optimizer: Postgres query optimizer +(4 rows) + +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + name | generic_plans | custom_plans +--------------+---------------+-------------- + test_mode_pp | 0 | 1 +(1 row) + +-- force generic plan +set plan_cache_mode to force_generic_plan; +explain (costs off) execute test_mode_pp(2); + QUERY PLAN +------------------------------------- + Aggregate + -> Seq Scan on test_mode + Filter: (a = $1) + Optimizer: Postgres query optimizer +(4 rows) + +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + name | generic_plans | custom_plans +--------------+---------------+-------------- + test_mode_pp | 1 | 1 +(1 row) + +-- get to generic plan by 5 executions +set plan_cache_mode to auto; +execute test_mode_pp(1); -- 1x + count +------- + 1000 +(1 row) + +execute test_mode_pp(1); -- 2x + count +------- + 1000 +(1 row) + +execute test_mode_pp(1); -- 3x + count +------- + 1000 +(1 row) + +execute test_mode_pp(1); -- 4x + count +------- + 1000 +(1 row) + +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + name | generic_plans | custom_plans +--------------+---------------+-------------- + test_mode_pp | 1 | 5 +(1 row) + +execute test_mode_pp(1); -- 5x + count +------- + 1000 +(1 row) + +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + name | generic_plans | custom_plans +--------------+---------------+-------------- + test_mode_pp | 1 | 6 +(1 row) + +-- we should now get a really bad plan +explain (costs off) execute test_mode_pp(2); + QUERY PLAN +---------------------------------------------------------- + Aggregate + -> Index Only Scan using test_mode_a_idx on test_mode + Index Cond: (a = 2) + Optimizer: Postgres query optimizer +(4 rows) + +-- but we can force a custom plan +set plan_cache_mode to force_custom_plan; +explain (costs off) execute test_mode_pp(2); + QUERY PLAN +---------------------------------------------------------- + Aggregate + -> Index Only Scan using test_mode_a_idx on test_mode + Index Cond: (a = 2) + Optimizer: Postgres query optimizer +(4 rows) + +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + name | generic_plans | custom_plans +--------------+---------------+-------------- + test_mode_pp | 1 | 8 +(1 row) + +drop table test_mode; diff --git a/src/test/singlenode_regress/expected/plpgsql.out b/src/test/singlenode_regress/expected/plpgsql.out new file mode 100644 index 00000000000..20485971801 --- /dev/null +++ b/src/test/singlenode_regress/expected/plpgsql.out @@ -0,0 +1,5325 @@ +-- +-- PLPGSQL +-- +-- Scenario: +-- +-- A building with a modern TP cable installation where any +-- of the wall connectors can be used to plug in phones, +-- ethernet interfaces or local office hubs. The backside +-- of the wall connectors is wired to one of several patch- +-- fields in the building. +-- +-- In the patchfields, there are hubs and all the slots +-- representing the wall connectors. In addition there are +-- slots that can represent a phone line from the central +-- phone system. +-- +-- Triggers ensure consistency of the patching information. +-- +-- Functions are used to build up powerful views that let +-- you look behind the wall when looking at a patchfield +-- or into a room. +-- +create table Room ( + roomno char(8), + comment text +); +create unique index Room_rno on Room using btree (roomno bpchar_ops); +create table WSlot ( + slotname char(20), + roomno char(8), + slotlink char(20), + backlink char(20) +); +create unique index WSlot_name on WSlot using btree (slotname bpchar_ops); +create table PField ( + name text, + comment text +); +create unique index PField_name on PField using btree (name text_ops); +create table PSlot ( + slotname char(20), + pfname text, + slotlink char(20), + backlink char(20) +); +create unique index PSlot_name on PSlot using btree (slotname bpchar_ops); +create table PLine ( + slotname char(20), + phonenumber char(20), + comment text, + backlink char(20) +); +create unique index PLine_name on PLine using btree (slotname bpchar_ops); +create table Hub ( + name char(14), + comment text, + nslots integer +); +create unique index Hub_name on Hub using btree (name bpchar_ops); +create table HSlot ( + slotname char(20), + hubname char(14), + slotno integer, + slotlink char(20) +); +create unique index HSlot_name on HSlot using btree (slotname bpchar_ops); +create index HSlot_hubname on HSlot using btree (hubname bpchar_ops); +create table System ( + name text, + comment text +); +create unique index System_name on System using btree (name text_ops); +create table IFace ( + slotname char(20), + sysname text, + ifname text, + slotlink char(20) +); +create unique index IFace_name on IFace using btree (slotname bpchar_ops); +create table PHone ( + slotname char(20), + comment text, + slotlink char(20) +); +create unique index PHone_name on PHone using btree (slotname bpchar_ops); +-- ************************************************************ +-- * +-- * Trigger procedures and functions for the patchfield +-- * test of PL/pgSQL +-- * +-- ************************************************************ +-- ************************************************************ +-- * AFTER UPDATE on Room +-- * - If room no changes let wall slots follow +-- ************************************************************ +create function tg_room_au() returns trigger as ' +begin + if new.roomno != old.roomno then + update WSlot set roomno = new.roomno where roomno = old.roomno; + end if; + return new; +end; +' language plpgsql; +create trigger tg_room_au after update + on Room for each row execute procedure tg_room_au(); +-- ************************************************************ +-- * AFTER DELETE on Room +-- * - delete wall slots in this room +-- ************************************************************ +create function tg_room_ad() returns trigger as ' +begin + delete from WSlot where roomno = old.roomno; + return old; +end; +' language plpgsql; +create trigger tg_room_ad after delete + on Room for each row execute procedure tg_room_ad(); +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on WSlot +-- * - Check that room exists +-- ************************************************************ +create function tg_wslot_biu() returns trigger as $$ +begin + if count(*) = 0 from Room where roomno = new.roomno then + raise exception 'Room % does not exist', new.roomno; + end if; + return new; +end; +$$ language plpgsql; +create trigger tg_wslot_biu before insert or update + on WSlot for each row execute procedure tg_wslot_biu(); +-- ************************************************************ +-- * AFTER UPDATE on PField +-- * - Let PSlots of this field follow +-- ************************************************************ +create function tg_pfield_au() returns trigger as ' +begin + if new.name != old.name then + update PSlot set pfname = new.name where pfname = old.name; + end if; + return new; +end; +' language plpgsql; +create trigger tg_pfield_au after update + on PField for each row execute procedure tg_pfield_au(); +-- ************************************************************ +-- * AFTER DELETE on PField +-- * - Remove all slots of this patchfield +-- ************************************************************ +create function tg_pfield_ad() returns trigger as ' +begin + delete from PSlot where pfname = old.name; + return old; +end; +' language plpgsql; +create trigger tg_pfield_ad after delete + on PField for each row execute procedure tg_pfield_ad(); +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on PSlot +-- * - Ensure that our patchfield does exist +-- ************************************************************ +create function tg_pslot_biu() returns trigger as $proc$ +declare + pfrec record; + ps alias for new; +begin + select into pfrec * from PField where name = ps.pfname; + if not found then + raise exception $$Patchfield "%" does not exist$$, ps.pfname; + end if; + return ps; +end; +$proc$ language plpgsql; +create trigger tg_pslot_biu before insert or update + on PSlot for each row execute procedure tg_pslot_biu(); +-- ************************************************************ +-- * AFTER UPDATE on System +-- * - If system name changes let interfaces follow +-- ************************************************************ +create function tg_system_au() returns trigger as ' +begin + if new.name != old.name then + update IFace set sysname = new.name where sysname = old.name; + end if; + return new; +end; +' language plpgsql; +create trigger tg_system_au after update + on System for each row execute procedure tg_system_au(); +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on IFace +-- * - set the slotname to IF.sysname.ifname +-- ************************************************************ +create function tg_iface_biu() returns trigger as $$ +declare + sname text; + sysrec record; +begin + select into sysrec * from system where name = new.sysname; + if not found then + raise exception $q$system "%" does not exist$q$, new.sysname; + end if; + sname := 'IF.' || new.sysname; + sname := sname || '.'; + sname := sname || new.ifname; + if length(sname) > 20 then + raise exception 'IFace slotname "%" too long (20 char max)', sname; + end if; + new.slotname := sname; + return new; +end; +$$ language plpgsql; +create trigger tg_iface_biu before insert or update + on IFace for each row execute procedure tg_iface_biu(); +-- ************************************************************ +-- * AFTER INSERT or UPDATE or DELETE on Hub +-- * - insert/delete/rename slots as required +-- ************************************************************ +create function tg_hub_a() returns trigger as ' +declare + hname text; + dummy integer; +begin + if tg_op = ''INSERT'' then + dummy := tg_hub_adjustslots(new.name, 0, new.nslots); + return new; + end if; + if tg_op = ''UPDATE'' then + if new.name != old.name then + update HSlot set hubname = new.name where hubname = old.name; + end if; + dummy := tg_hub_adjustslots(new.name, old.nslots, new.nslots); + return new; + end if; + if tg_op = ''DELETE'' then + dummy := tg_hub_adjustslots(old.name, old.nslots, 0); + return old; + end if; +end; +' language plpgsql; +create trigger tg_hub_a after insert or update or delete + on Hub for each row execute procedure tg_hub_a(); +-- ************************************************************ +-- * Support function to add/remove slots of Hub +-- ************************************************************ +create function tg_hub_adjustslots(hname bpchar, + oldnslots integer, + newnslots integer) +returns integer as ' +begin + if newnslots = oldnslots then + return 0; + end if; + if newnslots < oldnslots then + delete from HSlot where hubname = hname and slotno > newnslots; + return 0; + end if; + for i in oldnslots + 1 .. newnslots loop + insert into HSlot (slotname, hubname, slotno, slotlink) + values (''HS.dummy'', hname, i, ''''); + end loop; + return 0; +end +' language plpgsql; +-- Test comments +COMMENT ON FUNCTION tg_hub_adjustslots_wrong(bpchar, integer, integer) IS 'function with args'; +ERROR: function tg_hub_adjustslots_wrong(character, integer, integer) does not exist +COMMENT ON FUNCTION tg_hub_adjustslots(bpchar, integer, integer) IS 'function with args'; +COMMENT ON FUNCTION tg_hub_adjustslots(bpchar, integer, integer) IS NULL; +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on HSlot +-- * - prevent from manual manipulation +-- * - set the slotname to HS.hubname.slotno +-- ************************************************************ +create function tg_hslot_biu() returns trigger as ' +declare + sname text; + xname HSlot.slotname%TYPE; + hubrec record; +begin + select into hubrec * from Hub where name = new.hubname; + if not found then + raise exception ''no manual manipulation of HSlot''; + end if; + if new.slotno < 1 or new.slotno > hubrec.nslots then + raise exception ''no manual manipulation of HSlot''; + end if; + if tg_op = ''UPDATE'' and new.hubname != old.hubname then + if count(*) > 0 from Hub where name = old.hubname then + raise exception ''no manual manipulation of HSlot''; + end if; + end if; + sname := ''HS.'' || trim(new.hubname); + sname := sname || ''.''; + sname := sname || new.slotno::text; + if length(sname) > 20 then + raise exception ''HSlot slotname "%" too long (20 char max)'', sname; + end if; + new.slotname := sname; + return new; +end; +' language plpgsql; +create trigger tg_hslot_biu before insert or update + on HSlot for each row execute procedure tg_hslot_biu(); +-- ************************************************************ +-- * BEFORE DELETE on HSlot +-- * - prevent from manual manipulation +-- ************************************************************ +create function tg_hslot_bd() returns trigger as ' +declare + hubrec record; +begin + select into hubrec * from Hub where name = old.hubname; + if not found then + return old; + end if; + if old.slotno > hubrec.nslots then + return old; + end if; + raise exception ''no manual manipulation of HSlot''; +end; +' language plpgsql; +create trigger tg_hslot_bd before delete + on HSlot for each row execute procedure tg_hslot_bd(); +-- ************************************************************ +-- * BEFORE INSERT on all slots +-- * - Check name prefix +-- ************************************************************ +create function tg_chkslotname() returns trigger as ' +begin + if substr(new.slotname, 1, 2) != tg_argv[0] then + raise exception ''slotname must begin with %'', tg_argv[0]; + end if; + return new; +end; +' language plpgsql; +create trigger tg_chkslotname before insert + on PSlot for each row execute procedure tg_chkslotname('PS'); +create trigger tg_chkslotname before insert + on WSlot for each row execute procedure tg_chkslotname('WS'); +create trigger tg_chkslotname before insert + on PLine for each row execute procedure tg_chkslotname('PL'); +create trigger tg_chkslotname before insert + on IFace for each row execute procedure tg_chkslotname('IF'); +create trigger tg_chkslotname before insert + on PHone for each row execute procedure tg_chkslotname('PH'); +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on all slots with slotlink +-- * - Set slotlink to empty string if NULL value given +-- ************************************************************ +create function tg_chkslotlink() returns trigger as ' +begin + if new.slotlink isnull then + new.slotlink := ''''; + end if; + return new; +end; +' language plpgsql; +create trigger tg_chkslotlink before insert or update + on PSlot for each row execute procedure tg_chkslotlink(); +create trigger tg_chkslotlink before insert or update + on WSlot for each row execute procedure tg_chkslotlink(); +create trigger tg_chkslotlink before insert or update + on IFace for each row execute procedure tg_chkslotlink(); +create trigger tg_chkslotlink before insert or update + on HSlot for each row execute procedure tg_chkslotlink(); +create trigger tg_chkslotlink before insert or update + on PHone for each row execute procedure tg_chkslotlink(); +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on all slots with backlink +-- * - Set backlink to empty string if NULL value given +-- ************************************************************ +create function tg_chkbacklink() returns trigger as ' +begin + if new.backlink isnull then + new.backlink := ''''; + end if; + return new; +end; +' language plpgsql; +create trigger tg_chkbacklink before insert or update + on PSlot for each row execute procedure tg_chkbacklink(); +create trigger tg_chkbacklink before insert or update + on WSlot for each row execute procedure tg_chkbacklink(); +create trigger tg_chkbacklink before insert or update + on PLine for each row execute procedure tg_chkbacklink(); +-- ************************************************************ +-- * BEFORE UPDATE on PSlot +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_pslot_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from PSlot where slotname = old.slotname; + insert into PSlot ( + slotname, + pfname, + slotlink, + backlink + ) values ( + new.slotname, + new.pfname, + new.slotlink, + new.backlink + ); + return null; + end if; + return new; +end; +' language plpgsql; +create trigger tg_pslot_bu before update + on PSlot for each row execute procedure tg_pslot_bu(); +-- ************************************************************ +-- * BEFORE UPDATE on WSlot +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_wslot_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from WSlot where slotname = old.slotname; + insert into WSlot ( + slotname, + roomno, + slotlink, + backlink + ) values ( + new.slotname, + new.roomno, + new.slotlink, + new.backlink + ); + return null; + end if; + return new; +end; +' language plpgsql; +create trigger tg_wslot_bu before update + on WSlot for each row execute procedure tg_Wslot_bu(); +-- ************************************************************ +-- * BEFORE UPDATE on PLine +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_pline_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from PLine where slotname = old.slotname; + insert into PLine ( + slotname, + phonenumber, + comment, + backlink + ) values ( + new.slotname, + new.phonenumber, + new.comment, + new.backlink + ); + return null; + end if; + return new; +end; +' language plpgsql; +create trigger tg_pline_bu before update + on PLine for each row execute procedure tg_pline_bu(); +-- ************************************************************ +-- * BEFORE UPDATE on IFace +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_iface_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from IFace where slotname = old.slotname; + insert into IFace ( + slotname, + sysname, + ifname, + slotlink + ) values ( + new.slotname, + new.sysname, + new.ifname, + new.slotlink + ); + return null; + end if; + return new; +end; +' language plpgsql; +create trigger tg_iface_bu before update + on IFace for each row execute procedure tg_iface_bu(); +-- ************************************************************ +-- * BEFORE UPDATE on HSlot +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_hslot_bu() returns trigger as ' +begin + if new.slotname != old.slotname or new.hubname != old.hubname then + delete from HSlot where slotname = old.slotname; + insert into HSlot ( + slotname, + hubname, + slotno, + slotlink + ) values ( + new.slotname, + new.hubname, + new.slotno, + new.slotlink + ); + return null; + end if; + return new; +end; +' language plpgsql; +create trigger tg_hslot_bu before update + on HSlot for each row execute procedure tg_hslot_bu(); +-- ************************************************************ +-- * BEFORE UPDATE on PHone +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_phone_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from PHone where slotname = old.slotname; + insert into PHone ( + slotname, + comment, + slotlink + ) values ( + new.slotname, + new.comment, + new.slotlink + ); + return null; + end if; + return new; +end; +' language plpgsql; +create trigger tg_phone_bu before update + on PHone for each row execute procedure tg_phone_bu(); +-- ************************************************************ +-- * AFTER INSERT or UPDATE or DELETE on slot with backlink +-- * - Ensure that the opponent correctly points back to us +-- ************************************************************ +create function tg_backlink_a() returns trigger as ' +declare + dummy integer; +begin + if tg_op = ''INSERT'' then + if new.backlink != '''' then + dummy := tg_backlink_set(new.backlink, new.slotname); + end if; + return new; + end if; + if tg_op = ''UPDATE'' then + if new.backlink != old.backlink then + if old.backlink != '''' then + dummy := tg_backlink_unset(old.backlink, old.slotname); + end if; + if new.backlink != '''' then + dummy := tg_backlink_set(new.backlink, new.slotname); + end if; + else + if new.slotname != old.slotname and new.backlink != '''' then + dummy := tg_slotlink_set(new.backlink, new.slotname); + end if; + end if; + return new; + end if; + if tg_op = ''DELETE'' then + if old.backlink != '''' then + dummy := tg_backlink_unset(old.backlink, old.slotname); + end if; + return old; + end if; +end; +' language plpgsql; +create trigger tg_backlink_a after insert or update or delete + on PSlot for each row execute procedure tg_backlink_a('PS'); +create trigger tg_backlink_a after insert or update or delete + on WSlot for each row execute procedure tg_backlink_a('WS'); +create trigger tg_backlink_a after insert or update or delete + on PLine for each row execute procedure tg_backlink_a('PL'); +-- ************************************************************ +-- * Support function to set the opponents backlink field +-- * if it does not already point to the requested slot +-- ************************************************************ +create function tg_backlink_set(myname bpchar, blname bpchar) +returns integer as ' +declare + mytype char(2); + link char(4); + rec record; +begin + mytype := substr(myname, 1, 2); + link := mytype || substr(blname, 1, 2); + if link = ''PLPL'' then + raise exception + ''backlink between two phone lines does not make sense''; + end if; + if link in (''PLWS'', ''WSPL'') then + raise exception + ''direct link of phone line to wall slot not permitted''; + end if; + if mytype = ''PS'' then + select into rec * from PSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.backlink != blname then + update PSlot set backlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''WS'' then + select into rec * from WSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.backlink != blname then + update WSlot set backlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''PL'' then + select into rec * from PLine where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.backlink != blname then + update PLine set backlink = blname where slotname = myname; + end if; + return 0; + end if; + raise exception ''illegal backlink beginning with %'', mytype; +end; +' language plpgsql; +-- ************************************************************ +-- * Support function to clear out the backlink field if +-- * it still points to specific slot +-- ************************************************************ +create function tg_backlink_unset(bpchar, bpchar) +returns integer as ' +declare + myname alias for $1; + blname alias for $2; + mytype char(2); + rec record; +begin + mytype := substr(myname, 1, 2); + if mytype = ''PS'' then + select into rec * from PSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.backlink = blname then + update PSlot set backlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''WS'' then + select into rec * from WSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.backlink = blname then + update WSlot set backlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''PL'' then + select into rec * from PLine where slotname = myname; + if not found then + return 0; + end if; + if rec.backlink = blname then + update PLine set backlink = '''' where slotname = myname; + end if; + return 0; + end if; +end +' language plpgsql; +-- ************************************************************ +-- * AFTER INSERT or UPDATE or DELETE on slot with slotlink +-- * - Ensure that the opponent correctly points back to us +-- ************************************************************ +create function tg_slotlink_a() returns trigger as ' +declare + dummy integer; +begin + if tg_op = ''INSERT'' then + if new.slotlink != '''' then + dummy := tg_slotlink_set(new.slotlink, new.slotname); + end if; + return new; + end if; + if tg_op = ''UPDATE'' then + if new.slotlink != old.slotlink then + if old.slotlink != '''' then + dummy := tg_slotlink_unset(old.slotlink, old.slotname); + end if; + if new.slotlink != '''' then + dummy := tg_slotlink_set(new.slotlink, new.slotname); + end if; + else + if new.slotname != old.slotname and new.slotlink != '''' then + dummy := tg_slotlink_set(new.slotlink, new.slotname); + end if; + end if; + return new; + end if; + if tg_op = ''DELETE'' then + if old.slotlink != '''' then + dummy := tg_slotlink_unset(old.slotlink, old.slotname); + end if; + return old; + end if; +end; +' language plpgsql; +create trigger tg_slotlink_a after insert or update or delete + on PSlot for each row execute procedure tg_slotlink_a('PS'); +create trigger tg_slotlink_a after insert or update or delete + on WSlot for each row execute procedure tg_slotlink_a('WS'); +create trigger tg_slotlink_a after insert or update or delete + on IFace for each row execute procedure tg_slotlink_a('IF'); +create trigger tg_slotlink_a after insert or update or delete + on HSlot for each row execute procedure tg_slotlink_a('HS'); +create trigger tg_slotlink_a after insert or update or delete + on PHone for each row execute procedure tg_slotlink_a('PH'); +-- ************************************************************ +-- * Support function to set the opponents slotlink field +-- * if it does not already point to the requested slot +-- ************************************************************ +create function tg_slotlink_set(bpchar, bpchar) +returns integer as ' +declare + myname alias for $1; + blname alias for $2; + mytype char(2); + link char(4); + rec record; +begin + mytype := substr(myname, 1, 2); + link := mytype || substr(blname, 1, 2); + if link = ''PHPH'' then + raise exception + ''slotlink between two phones does not make sense''; + end if; + if link in (''PHHS'', ''HSPH'') then + raise exception + ''link of phone to hub does not make sense''; + end if; + if link in (''PHIF'', ''IFPH'') then + raise exception + ''link of phone to hub does not make sense''; + end if; + if link in (''PSWS'', ''WSPS'') then + raise exception + ''slotlink from patchslot to wallslot not permitted''; + end if; + if mytype = ''PS'' then + select into rec * from PSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update PSlot set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''WS'' then + select into rec * from WSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update WSlot set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''IF'' then + select into rec * from IFace where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update IFace set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''HS'' then + select into rec * from HSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update HSlot set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''PH'' then + select into rec * from PHone where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update PHone set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + raise exception ''illegal slotlink beginning with %'', mytype; +end; +' language plpgsql; +-- ************************************************************ +-- * Support function to clear out the slotlink field if +-- * it still points to specific slot +-- ************************************************************ +create function tg_slotlink_unset(bpchar, bpchar) +returns integer as ' +declare + myname alias for $1; + blname alias for $2; + mytype char(2); + rec record; +begin + mytype := substr(myname, 1, 2); + if mytype = ''PS'' then + select into rec * from PSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update PSlot set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''WS'' then + select into rec * from WSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update WSlot set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''IF'' then + select into rec * from IFace where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update IFace set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''HS'' then + select into rec * from HSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update HSlot set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''PH'' then + select into rec * from PHone where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update PHone set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; +end; +' language plpgsql; +-- ************************************************************ +-- * Describe the backside of a patchfield slot +-- ************************************************************ +create function pslot_backlink_view(bpchar) +returns text as ' +<> +declare + rec record; + bltype char(2); + retval text; +begin + select into rec * from PSlot where slotname = $1; + if not found then + return ''''; + end if; + if rec.backlink = '''' then + return ''-''; + end if; + bltype := substr(rec.backlink, 1, 2); + if bltype = ''PL'' then + declare + rec record; + begin + select into rec * from PLine where slotname = "outer".rec.backlink; + retval := ''Phone line '' || trim(rec.phonenumber); + if rec.comment != '''' then + retval := retval || '' (''; + retval := retval || rec.comment; + retval := retval || '')''; + end if; + return retval; + end; + end if; + if bltype = ''WS'' then + select into rec * from WSlot where slotname = rec.backlink; + retval := trim(rec.slotname) || '' in room ''; + retval := retval || trim(rec.roomno); + retval := retval || '' -> ''; + return retval || wslot_slotlink_view(rec.slotname); + end if; + return rec.backlink; +end; +' language plpgsql; +-- ************************************************************ +-- * Describe the front of a patchfield slot +-- ************************************************************ +create function pslot_slotlink_view(bpchar) +returns text as ' +declare + psrec record; + sltype char(2); + retval text; +begin + select into psrec * from PSlot where slotname = $1; + if not found then + return ''''; + end if; + if psrec.slotlink = '''' then + return ''-''; + end if; + sltype := substr(psrec.slotlink, 1, 2); + if sltype = ''PS'' then + retval := trim(psrec.slotlink) || '' -> ''; + return retval || pslot_backlink_view(psrec.slotlink); + end if; + if sltype = ''HS'' then + retval := comment from Hub H, HSlot HS + where HS.slotname = psrec.slotlink + and H.name = HS.hubname; + retval := retval || '' slot ''; + retval := retval || slotno::text from HSlot + where slotname = psrec.slotlink; + return retval; + end if; + return psrec.slotlink; +end; +' language plpgsql; +-- ************************************************************ +-- * Describe the front of a wall connector slot +-- ************************************************************ +create function wslot_slotlink_view(bpchar) +returns text as ' +declare + rec record; + sltype char(2); + retval text; +begin + select into rec * from WSlot where slotname = $1; + if not found then + return ''''; + end if; + if rec.slotlink = '''' then + return ''-''; + end if; + sltype := substr(rec.slotlink, 1, 2); + if sltype = ''PH'' then + select into rec * from PHone where slotname = rec.slotlink; + retval := ''Phone '' || trim(rec.slotname); + if rec.comment != '''' then + retval := retval || '' (''; + retval := retval || rec.comment; + retval := retval || '')''; + end if; + return retval; + end if; + if sltype = ''IF'' then + declare + syrow System%RowType; + ifrow IFace%ROWTYPE; + begin + select into ifrow * from IFace where slotname = rec.slotlink; + select into syrow * from System where name = ifrow.sysname; + retval := syrow.name || '' IF ''; + retval := retval || ifrow.ifname; + if syrow.comment != '''' then + retval := retval || '' (''; + retval := retval || syrow.comment; + retval := retval || '')''; + end if; + return retval; + end; + end if; + return rec.slotlink; +end; +' language plpgsql; +-- ************************************************************ +-- * View of a patchfield describing backside and patches +-- ************************************************************ +create view Pfield_v1 as select PF.pfname, PF.slotname, + pslot_backlink_view(PF.slotname) as backside, + pslot_slotlink_view(PF.slotname) as patch + from PSlot PF; +-- +-- First we build the house - so we create the rooms +-- +insert into Room values ('001', 'Entrance'); +insert into Room values ('002', 'Office'); +insert into Room values ('003', 'Office'); +insert into Room values ('004', 'Technical'); +insert into Room values ('101', 'Office'); +insert into Room values ('102', 'Conference'); +insert into Room values ('103', 'Restroom'); +insert into Room values ('104', 'Technical'); +insert into Room values ('105', 'Office'); +insert into Room values ('106', 'Office'); +-- +-- Second we install the wall connectors +-- +insert into WSlot values ('WS.001.1a', '001', '', ''); +insert into WSlot values ('WS.001.1b', '001', '', ''); +insert into WSlot values ('WS.001.2a', '001', '', ''); +insert into WSlot values ('WS.001.2b', '001', '', ''); +insert into WSlot values ('WS.001.3a', '001', '', ''); +insert into WSlot values ('WS.001.3b', '001', '', ''); +insert into WSlot values ('WS.002.1a', '002', '', ''); +insert into WSlot values ('WS.002.1b', '002', '', ''); +insert into WSlot values ('WS.002.2a', '002', '', ''); +insert into WSlot values ('WS.002.2b', '002', '', ''); +insert into WSlot values ('WS.002.3a', '002', '', ''); +insert into WSlot values ('WS.002.3b', '002', '', ''); +insert into WSlot values ('WS.003.1a', '003', '', ''); +insert into WSlot values ('WS.003.1b', '003', '', ''); +insert into WSlot values ('WS.003.2a', '003', '', ''); +insert into WSlot values ('WS.003.2b', '003', '', ''); +insert into WSlot values ('WS.003.3a', '003', '', ''); +insert into WSlot values ('WS.003.3b', '003', '', ''); +insert into WSlot values ('WS.101.1a', '101', '', ''); +insert into WSlot values ('WS.101.1b', '101', '', ''); +insert into WSlot values ('WS.101.2a', '101', '', ''); +insert into WSlot values ('WS.101.2b', '101', '', ''); +insert into WSlot values ('WS.101.3a', '101', '', ''); +insert into WSlot values ('WS.101.3b', '101', '', ''); +insert into WSlot values ('WS.102.1a', '102', '', ''); +insert into WSlot values ('WS.102.1b', '102', '', ''); +insert into WSlot values ('WS.102.2a', '102', '', ''); +insert into WSlot values ('WS.102.2b', '102', '', ''); +insert into WSlot values ('WS.102.3a', '102', '', ''); +insert into WSlot values ('WS.102.3b', '102', '', ''); +insert into WSlot values ('WS.105.1a', '105', '', ''); +insert into WSlot values ('WS.105.1b', '105', '', ''); +insert into WSlot values ('WS.105.2a', '105', '', ''); +insert into WSlot values ('WS.105.2b', '105', '', ''); +insert into WSlot values ('WS.105.3a', '105', '', ''); +insert into WSlot values ('WS.105.3b', '105', '', ''); +insert into WSlot values ('WS.106.1a', '106', '', ''); +insert into WSlot values ('WS.106.1b', '106', '', ''); +insert into WSlot values ('WS.106.2a', '106', '', ''); +insert into WSlot values ('WS.106.2b', '106', '', ''); +insert into WSlot values ('WS.106.3a', '106', '', ''); +insert into WSlot values ('WS.106.3b', '106', '', ''); +-- +-- Now create the patch fields and their slots +-- +insert into PField values ('PF0_1', 'Wallslots basement'); +-- +-- The cables for these will be made later, so they are unconnected for now +-- +insert into PSlot values ('PS.base.a1', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a2', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a3', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a4', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a5', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a6', 'PF0_1', '', ''); +-- +-- These are already wired to the wall connectors +-- +insert into PSlot values ('PS.base.b1', 'PF0_1', '', 'WS.002.1a'); +insert into PSlot values ('PS.base.b2', 'PF0_1', '', 'WS.002.1b'); +insert into PSlot values ('PS.base.b3', 'PF0_1', '', 'WS.002.2a'); +insert into PSlot values ('PS.base.b4', 'PF0_1', '', 'WS.002.2b'); +insert into PSlot values ('PS.base.b5', 'PF0_1', '', 'WS.002.3a'); +insert into PSlot values ('PS.base.b6', 'PF0_1', '', 'WS.002.3b'); +insert into PSlot values ('PS.base.c1', 'PF0_1', '', 'WS.003.1a'); +insert into PSlot values ('PS.base.c2', 'PF0_1', '', 'WS.003.1b'); +insert into PSlot values ('PS.base.c3', 'PF0_1', '', 'WS.003.2a'); +insert into PSlot values ('PS.base.c4', 'PF0_1', '', 'WS.003.2b'); +insert into PSlot values ('PS.base.c5', 'PF0_1', '', 'WS.003.3a'); +insert into PSlot values ('PS.base.c6', 'PF0_1', '', 'WS.003.3b'); +-- +-- This patchfield will be renamed later into PF0_2 - so its +-- slots references in pfname should follow +-- +insert into PField values ('PF0_X', 'Phonelines basement'); +insert into PSlot values ('PS.base.ta1', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta2', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta3', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta4', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta5', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta6', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb1', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb2', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb3', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb4', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb5', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb6', 'PF0_X', '', ''); +insert into PField values ('PF1_1', 'Wallslots first floor'); +insert into PSlot values ('PS.first.a1', 'PF1_1', '', 'WS.101.1a'); +insert into PSlot values ('PS.first.a2', 'PF1_1', '', 'WS.101.1b'); +insert into PSlot values ('PS.first.a3', 'PF1_1', '', 'WS.101.2a'); +insert into PSlot values ('PS.first.a4', 'PF1_1', '', 'WS.101.2b'); +insert into PSlot values ('PS.first.a5', 'PF1_1', '', 'WS.101.3a'); +insert into PSlot values ('PS.first.a6', 'PF1_1', '', 'WS.101.3b'); +insert into PSlot values ('PS.first.b1', 'PF1_1', '', 'WS.102.1a'); +insert into PSlot values ('PS.first.b2', 'PF1_1', '', 'WS.102.1b'); +insert into PSlot values ('PS.first.b3', 'PF1_1', '', 'WS.102.2a'); +insert into PSlot values ('PS.first.b4', 'PF1_1', '', 'WS.102.2b'); +insert into PSlot values ('PS.first.b5', 'PF1_1', '', 'WS.102.3a'); +insert into PSlot values ('PS.first.b6', 'PF1_1', '', 'WS.102.3b'); +insert into PSlot values ('PS.first.c1', 'PF1_1', '', 'WS.105.1a'); +insert into PSlot values ('PS.first.c2', 'PF1_1', '', 'WS.105.1b'); +insert into PSlot values ('PS.first.c3', 'PF1_1', '', 'WS.105.2a'); +insert into PSlot values ('PS.first.c4', 'PF1_1', '', 'WS.105.2b'); +insert into PSlot values ('PS.first.c5', 'PF1_1', '', 'WS.105.3a'); +insert into PSlot values ('PS.first.c6', 'PF1_1', '', 'WS.105.3b'); +insert into PSlot values ('PS.first.d1', 'PF1_1', '', 'WS.106.1a'); +insert into PSlot values ('PS.first.d2', 'PF1_1', '', 'WS.106.1b'); +insert into PSlot values ('PS.first.d3', 'PF1_1', '', 'WS.106.2a'); +insert into PSlot values ('PS.first.d4', 'PF1_1', '', 'WS.106.2b'); +insert into PSlot values ('PS.first.d5', 'PF1_1', '', 'WS.106.3a'); +insert into PSlot values ('PS.first.d6', 'PF1_1', '', 'WS.106.3b'); +-- +-- Now we wire the wall connectors 1a-2a in room 001 to the +-- patchfield. In the second update we make an error, and +-- correct it after +-- +update PSlot set backlink = 'WS.001.1a' where slotname = 'PS.base.a1'; +update PSlot set backlink = 'WS.001.1b' where slotname = 'PS.base.a3'; +select * from WSlot where roomno = '001' order by slotname; + slotname | roomno | slotlink | backlink +----------------------+----------+----------------------+---------------------- + WS.001.1a | 001 | | PS.base.a1 + WS.001.1b | 001 | | PS.base.a3 + WS.001.2a | 001 | | + WS.001.2b | 001 | | + WS.001.3a | 001 | | + WS.001.3b | 001 | | +(6 rows) + +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; + slotname | pfname | slotlink | backlink +----------------------+--------+----------------------+---------------------- + PS.base.a1 | PF0_1 | | WS.001.1a + PS.base.a2 | PF0_1 | | + PS.base.a3 | PF0_1 | | WS.001.1b + PS.base.a4 | PF0_1 | | + PS.base.a5 | PF0_1 | | + PS.base.a6 | PF0_1 | | +(6 rows) + +update PSlot set backlink = 'WS.001.2a' where slotname = 'PS.base.a3'; +select * from WSlot where roomno = '001' order by slotname; + slotname | roomno | slotlink | backlink +----------------------+----------+----------------------+---------------------- + WS.001.1a | 001 | | PS.base.a1 + WS.001.1b | 001 | | + WS.001.2a | 001 | | PS.base.a3 + WS.001.2b | 001 | | + WS.001.3a | 001 | | + WS.001.3b | 001 | | +(6 rows) + +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; + slotname | pfname | slotlink | backlink +----------------------+--------+----------------------+---------------------- + PS.base.a1 | PF0_1 | | WS.001.1a + PS.base.a2 | PF0_1 | | + PS.base.a3 | PF0_1 | | WS.001.2a + PS.base.a4 | PF0_1 | | + PS.base.a5 | PF0_1 | | + PS.base.a6 | PF0_1 | | +(6 rows) + +update PSlot set backlink = 'WS.001.1b' where slotname = 'PS.base.a2'; +select * from WSlot where roomno = '001' order by slotname; + slotname | roomno | slotlink | backlink +----------------------+----------+----------------------+---------------------- + WS.001.1a | 001 | | PS.base.a1 + WS.001.1b | 001 | | PS.base.a2 + WS.001.2a | 001 | | PS.base.a3 + WS.001.2b | 001 | | + WS.001.3a | 001 | | + WS.001.3b | 001 | | +(6 rows) + +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; + slotname | pfname | slotlink | backlink +----------------------+--------+----------------------+---------------------- + PS.base.a1 | PF0_1 | | WS.001.1a + PS.base.a2 | PF0_1 | | WS.001.1b + PS.base.a3 | PF0_1 | | WS.001.2a + PS.base.a4 | PF0_1 | | + PS.base.a5 | PF0_1 | | + PS.base.a6 | PF0_1 | | +(6 rows) + +-- +-- Same procedure for 2b-3b but this time updating the WSlot instead +-- of the PSlot. Due to the triggers the result is the same: +-- WSlot and corresponding PSlot point to each other. +-- +update WSlot set backlink = 'PS.base.a4' where slotname = 'WS.001.2b'; +update WSlot set backlink = 'PS.base.a6' where slotname = 'WS.001.3a'; +select * from WSlot where roomno = '001' order by slotname; + slotname | roomno | slotlink | backlink +----------------------+----------+----------------------+---------------------- + WS.001.1a | 001 | | PS.base.a1 + WS.001.1b | 001 | | PS.base.a2 + WS.001.2a | 001 | | PS.base.a3 + WS.001.2b | 001 | | PS.base.a4 + WS.001.3a | 001 | | PS.base.a6 + WS.001.3b | 001 | | +(6 rows) + +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; + slotname | pfname | slotlink | backlink +----------------------+--------+----------------------+---------------------- + PS.base.a1 | PF0_1 | | WS.001.1a + PS.base.a2 | PF0_1 | | WS.001.1b + PS.base.a3 | PF0_1 | | WS.001.2a + PS.base.a4 | PF0_1 | | WS.001.2b + PS.base.a5 | PF0_1 | | + PS.base.a6 | PF0_1 | | WS.001.3a +(6 rows) + +update WSlot set backlink = 'PS.base.a6' where slotname = 'WS.001.3b'; +select * from WSlot where roomno = '001' order by slotname; + slotname | roomno | slotlink | backlink +----------------------+----------+----------------------+---------------------- + WS.001.1a | 001 | | PS.base.a1 + WS.001.1b | 001 | | PS.base.a2 + WS.001.2a | 001 | | PS.base.a3 + WS.001.2b | 001 | | PS.base.a4 + WS.001.3a | 001 | | + WS.001.3b | 001 | | PS.base.a6 +(6 rows) + +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; + slotname | pfname | slotlink | backlink +----------------------+--------+----------------------+---------------------- + PS.base.a1 | PF0_1 | | WS.001.1a + PS.base.a2 | PF0_1 | | WS.001.1b + PS.base.a3 | PF0_1 | | WS.001.2a + PS.base.a4 | PF0_1 | | WS.001.2b + PS.base.a5 | PF0_1 | | + PS.base.a6 | PF0_1 | | WS.001.3b +(6 rows) + +update WSlot set backlink = 'PS.base.a5' where slotname = 'WS.001.3a'; +select * from WSlot where roomno = '001' order by slotname; + slotname | roomno | slotlink | backlink +----------------------+----------+----------------------+---------------------- + WS.001.1a | 001 | | PS.base.a1 + WS.001.1b | 001 | | PS.base.a2 + WS.001.2a | 001 | | PS.base.a3 + WS.001.2b | 001 | | PS.base.a4 + WS.001.3a | 001 | | PS.base.a5 + WS.001.3b | 001 | | PS.base.a6 +(6 rows) + +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; + slotname | pfname | slotlink | backlink +----------------------+--------+----------------------+---------------------- + PS.base.a1 | PF0_1 | | WS.001.1a + PS.base.a2 | PF0_1 | | WS.001.1b + PS.base.a3 | PF0_1 | | WS.001.2a + PS.base.a4 | PF0_1 | | WS.001.2b + PS.base.a5 | PF0_1 | | WS.001.3a + PS.base.a6 | PF0_1 | | WS.001.3b +(6 rows) + +insert into PField values ('PF1_2', 'Phonelines first floor'); +insert into PSlot values ('PS.first.ta1', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta2', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta3', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta4', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta5', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta6', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb1', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb2', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb3', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb4', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb5', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb6', 'PF1_2', '', ''); +-- +-- Fix the wrong name for patchfield PF0_2 +-- +update PField set name = 'PF0_2' where name = 'PF0_X'; +select * from PSlot order by slotname; + slotname | pfname | slotlink | backlink +----------------------+--------+----------------------+---------------------- + PS.base.a1 | PF0_1 | | WS.001.1a + PS.base.a2 | PF0_1 | | WS.001.1b + PS.base.a3 | PF0_1 | | WS.001.2a + PS.base.a4 | PF0_1 | | WS.001.2b + PS.base.a5 | PF0_1 | | WS.001.3a + PS.base.a6 | PF0_1 | | WS.001.3b + PS.base.b1 | PF0_1 | | WS.002.1a + PS.base.b2 | PF0_1 | | WS.002.1b + PS.base.b3 | PF0_1 | | WS.002.2a + PS.base.b4 | PF0_1 | | WS.002.2b + PS.base.b5 | PF0_1 | | WS.002.3a + PS.base.b6 | PF0_1 | | WS.002.3b + PS.base.c1 | PF0_1 | | WS.003.1a + PS.base.c2 | PF0_1 | | WS.003.1b + PS.base.c3 | PF0_1 | | WS.003.2a + PS.base.c4 | PF0_1 | | WS.003.2b + PS.base.c5 | PF0_1 | | WS.003.3a + PS.base.c6 | PF0_1 | | WS.003.3b + PS.base.ta1 | PF0_2 | | + PS.base.ta2 | PF0_2 | | + PS.base.ta3 | PF0_2 | | + PS.base.ta4 | PF0_2 | | + PS.base.ta5 | PF0_2 | | + PS.base.ta6 | PF0_2 | | + PS.base.tb1 | PF0_2 | | + PS.base.tb2 | PF0_2 | | + PS.base.tb3 | PF0_2 | | + PS.base.tb4 | PF0_2 | | + PS.base.tb5 | PF0_2 | | + PS.base.tb6 | PF0_2 | | + PS.first.a1 | PF1_1 | | WS.101.1a + PS.first.a2 | PF1_1 | | WS.101.1b + PS.first.a3 | PF1_1 | | WS.101.2a + PS.first.a4 | PF1_1 | | WS.101.2b + PS.first.a5 | PF1_1 | | WS.101.3a + PS.first.a6 | PF1_1 | | WS.101.3b + PS.first.b1 | PF1_1 | | WS.102.1a + PS.first.b2 | PF1_1 | | WS.102.1b + PS.first.b3 | PF1_1 | | WS.102.2a + PS.first.b4 | PF1_1 | | WS.102.2b + PS.first.b5 | PF1_1 | | WS.102.3a + PS.first.b6 | PF1_1 | | WS.102.3b + PS.first.c1 | PF1_1 | | WS.105.1a + PS.first.c2 | PF1_1 | | WS.105.1b + PS.first.c3 | PF1_1 | | WS.105.2a + PS.first.c4 | PF1_1 | | WS.105.2b + PS.first.c5 | PF1_1 | | WS.105.3a + PS.first.c6 | PF1_1 | | WS.105.3b + PS.first.d1 | PF1_1 | | WS.106.1a + PS.first.d2 | PF1_1 | | WS.106.1b + PS.first.d3 | PF1_1 | | WS.106.2a + PS.first.d4 | PF1_1 | | WS.106.2b + PS.first.d5 | PF1_1 | | WS.106.3a + PS.first.d6 | PF1_1 | | WS.106.3b + PS.first.ta1 | PF1_2 | | + PS.first.ta2 | PF1_2 | | + PS.first.ta3 | PF1_2 | | + PS.first.ta4 | PF1_2 | | + PS.first.ta5 | PF1_2 | | + PS.first.ta6 | PF1_2 | | + PS.first.tb1 | PF1_2 | | + PS.first.tb2 | PF1_2 | | + PS.first.tb3 | PF1_2 | | + PS.first.tb4 | PF1_2 | | + PS.first.tb5 | PF1_2 | | + PS.first.tb6 | PF1_2 | | +(66 rows) + +select * from WSlot order by slotname; + slotname | roomno | slotlink | backlink +----------------------+----------+----------------------+---------------------- + WS.001.1a | 001 | | PS.base.a1 + WS.001.1b | 001 | | PS.base.a2 + WS.001.2a | 001 | | PS.base.a3 + WS.001.2b | 001 | | PS.base.a4 + WS.001.3a | 001 | | PS.base.a5 + WS.001.3b | 001 | | PS.base.a6 + WS.002.1a | 002 | | PS.base.b1 + WS.002.1b | 002 | | PS.base.b2 + WS.002.2a | 002 | | PS.base.b3 + WS.002.2b | 002 | | PS.base.b4 + WS.002.3a | 002 | | PS.base.b5 + WS.002.3b | 002 | | PS.base.b6 + WS.003.1a | 003 | | PS.base.c1 + WS.003.1b | 003 | | PS.base.c2 + WS.003.2a | 003 | | PS.base.c3 + WS.003.2b | 003 | | PS.base.c4 + WS.003.3a | 003 | | PS.base.c5 + WS.003.3b | 003 | | PS.base.c6 + WS.101.1a | 101 | | PS.first.a1 + WS.101.1b | 101 | | PS.first.a2 + WS.101.2a | 101 | | PS.first.a3 + WS.101.2b | 101 | | PS.first.a4 + WS.101.3a | 101 | | PS.first.a5 + WS.101.3b | 101 | | PS.first.a6 + WS.102.1a | 102 | | PS.first.b1 + WS.102.1b | 102 | | PS.first.b2 + WS.102.2a | 102 | | PS.first.b3 + WS.102.2b | 102 | | PS.first.b4 + WS.102.3a | 102 | | PS.first.b5 + WS.102.3b | 102 | | PS.first.b6 + WS.105.1a | 105 | | PS.first.c1 + WS.105.1b | 105 | | PS.first.c2 + WS.105.2a | 105 | | PS.first.c3 + WS.105.2b | 105 | | PS.first.c4 + WS.105.3a | 105 | | PS.first.c5 + WS.105.3b | 105 | | PS.first.c6 + WS.106.1a | 106 | | PS.first.d1 + WS.106.1b | 106 | | PS.first.d2 + WS.106.2a | 106 | | PS.first.d3 + WS.106.2b | 106 | | PS.first.d4 + WS.106.3a | 106 | | PS.first.d5 + WS.106.3b | 106 | | PS.first.d6 +(42 rows) + +-- +-- Install the central phone system and create the phone numbers. +-- They are wired on insert to the patchfields. Again the +-- triggers automatically tell the PSlots to update their +-- backlink field. +-- +insert into PLine values ('PL.001', '-0', 'Central call', 'PS.base.ta1'); +insert into PLine values ('PL.002', '-101', '', 'PS.base.ta2'); +insert into PLine values ('PL.003', '-102', '', 'PS.base.ta3'); +insert into PLine values ('PL.004', '-103', '', 'PS.base.ta5'); +insert into PLine values ('PL.005', '-104', '', 'PS.base.ta6'); +insert into PLine values ('PL.006', '-106', '', 'PS.base.tb2'); +insert into PLine values ('PL.007', '-108', '', 'PS.base.tb3'); +insert into PLine values ('PL.008', '-109', '', 'PS.base.tb4'); +insert into PLine values ('PL.009', '-121', '', 'PS.base.tb5'); +insert into PLine values ('PL.010', '-122', '', 'PS.base.tb6'); +insert into PLine values ('PL.015', '-134', '', 'PS.first.ta1'); +insert into PLine values ('PL.016', '-137', '', 'PS.first.ta3'); +insert into PLine values ('PL.017', '-139', '', 'PS.first.ta4'); +insert into PLine values ('PL.018', '-362', '', 'PS.first.tb1'); +insert into PLine values ('PL.019', '-363', '', 'PS.first.tb2'); +insert into PLine values ('PL.020', '-364', '', 'PS.first.tb3'); +insert into PLine values ('PL.021', '-365', '', 'PS.first.tb5'); +insert into PLine values ('PL.022', '-367', '', 'PS.first.tb6'); +insert into PLine values ('PL.028', '-501', 'Fax entrance', 'PS.base.ta2'); +insert into PLine values ('PL.029', '-502', 'Fax first floor', 'PS.first.ta1'); +-- +-- Buy some phones, plug them into the wall and patch the +-- phone lines to the corresponding patchfield slots. +-- +insert into PHone values ('PH.hc001', 'Hicom standard', 'WS.001.1a'); +update PSlot set slotlink = 'PS.base.ta1' where slotname = 'PS.base.a1'; +insert into PHone values ('PH.hc002', 'Hicom standard', 'WS.002.1a'); +update PSlot set slotlink = 'PS.base.ta5' where slotname = 'PS.base.b1'; +insert into PHone values ('PH.hc003', 'Hicom standard', 'WS.002.2a'); +update PSlot set slotlink = 'PS.base.tb2' where slotname = 'PS.base.b3'; +insert into PHone values ('PH.fax001', 'Canon fax', 'WS.001.2a'); +update PSlot set slotlink = 'PS.base.ta2' where slotname = 'PS.base.a3'; +-- +-- Install a hub at one of the patchfields, plug a computers +-- ethernet interface into the wall and patch it to the hub. +-- +insert into Hub values ('base.hub1', 'Patchfield PF0_1 hub', 16); +insert into System values ('orion', 'PC'); +insert into IFace values ('IF', 'orion', 'eth0', 'WS.002.1b'); +update PSlot set slotlink = 'HS.base.hub1.1' where slotname = 'PS.base.b2'; +-- +-- Now we take a look at the patchfield +-- +select * from PField_v1 where pfname = 'PF0_1' order by slotname; + pfname | slotname | backside | patch +--------+----------------------+----------------------------------------------------------+----------------------------------------------- + PF0_1 | PS.base.a1 | WS.001.1a in room 001 -> Phone PH.hc001 (Hicom standard) | PS.base.ta1 -> Phone line -0 (Central call) + PF0_1 | PS.base.a2 | WS.001.1b in room 001 -> - | - + PF0_1 | PS.base.a3 | WS.001.2a in room 001 -> Phone PH.fax001 (Canon fax) | PS.base.ta2 -> Phone line -501 (Fax entrance) + PF0_1 | PS.base.a4 | WS.001.2b in room 001 -> - | - + PF0_1 | PS.base.a5 | WS.001.3a in room 001 -> - | - + PF0_1 | PS.base.a6 | WS.001.3b in room 001 -> - | - + PF0_1 | PS.base.b1 | WS.002.1a in room 002 -> Phone PH.hc002 (Hicom standard) | PS.base.ta5 -> Phone line -103 + PF0_1 | PS.base.b2 | WS.002.1b in room 002 -> orion IF eth0 (PC) | Patchfield PF0_1 hub slot 1 + PF0_1 | PS.base.b3 | WS.002.2a in room 002 -> Phone PH.hc003 (Hicom standard) | PS.base.tb2 -> Phone line -106 + PF0_1 | PS.base.b4 | WS.002.2b in room 002 -> - | - + PF0_1 | PS.base.b5 | WS.002.3a in room 002 -> - | - + PF0_1 | PS.base.b6 | WS.002.3b in room 002 -> - | - + PF0_1 | PS.base.c1 | WS.003.1a in room 003 -> - | - + PF0_1 | PS.base.c2 | WS.003.1b in room 003 -> - | - + PF0_1 | PS.base.c3 | WS.003.2a in room 003 -> - | - + PF0_1 | PS.base.c4 | WS.003.2b in room 003 -> - | - + PF0_1 | PS.base.c5 | WS.003.3a in room 003 -> - | - + PF0_1 | PS.base.c6 | WS.003.3b in room 003 -> - | - +(18 rows) + +select * from PField_v1 where pfname = 'PF0_2' order by slotname; + pfname | slotname | backside | patch +--------+----------------------+--------------------------------+------------------------------------------------------------------------ + PF0_2 | PS.base.ta1 | Phone line -0 (Central call) | PS.base.a1 -> WS.001.1a in room 001 -> Phone PH.hc001 (Hicom standard) + PF0_2 | PS.base.ta2 | Phone line -501 (Fax entrance) | PS.base.a3 -> WS.001.2a in room 001 -> Phone PH.fax001 (Canon fax) + PF0_2 | PS.base.ta3 | Phone line -102 | - + PF0_2 | PS.base.ta4 | - | - + PF0_2 | PS.base.ta5 | Phone line -103 | PS.base.b1 -> WS.002.1a in room 002 -> Phone PH.hc002 (Hicom standard) + PF0_2 | PS.base.ta6 | Phone line -104 | - + PF0_2 | PS.base.tb1 | - | - + PF0_2 | PS.base.tb2 | Phone line -106 | PS.base.b3 -> WS.002.2a in room 002 -> Phone PH.hc003 (Hicom standard) + PF0_2 | PS.base.tb3 | Phone line -108 | - + PF0_2 | PS.base.tb4 | Phone line -109 | - + PF0_2 | PS.base.tb5 | Phone line -121 | - + PF0_2 | PS.base.tb6 | Phone line -122 | - +(12 rows) + +-- +-- Finally we want errors +-- +insert into PField values ('PF1_1', 'should fail due to unique index'); +ERROR: duplicate key value violates unique constraint "pfield_name" +DETAIL: Key (name)=(PF1_1) already exists. +update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1'; +ERROR: WS.not.there does not exist +CONTEXT: PL/pgSQL function tg_backlink_set(character,character) line 30 at RAISE +PL/pgSQL function tg_backlink_a() line 17 at assignment +update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1'; +ERROR: illegal backlink beginning with XX +CONTEXT: PL/pgSQL function tg_backlink_set(character,character) line 47 at RAISE +PL/pgSQL function tg_backlink_a() line 17 at assignment +update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1'; +ERROR: PS.not.there does not exist +CONTEXT: PL/pgSQL function tg_slotlink_set(character,character) line 30 at RAISE +PL/pgSQL function tg_slotlink_a() line 17 at assignment +update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1'; +ERROR: illegal slotlink beginning with XX +CONTEXT: PL/pgSQL function tg_slotlink_set(character,character) line 77 at RAISE +PL/pgSQL function tg_slotlink_a() line 17 at assignment +insert into HSlot values ('HS', 'base.hub1', 1, ''); +ERROR: duplicate key value violates unique constraint "hslot_name" +DETAIL: Key (slotname)=(HS.base.hub1.1 ) already exists. +insert into HSlot values ('HS', 'base.hub1', 20, ''); +ERROR: no manual manipulation of HSlot +CONTEXT: PL/pgSQL function tg_hslot_biu() line 12 at RAISE +delete from HSlot; +ERROR: no manual manipulation of HSlot +CONTEXT: PL/pgSQL function tg_hslot_bd() line 12 at RAISE +insert into IFace values ('IF', 'notthere', 'eth0', ''); +ERROR: system "notthere" does not exist +CONTEXT: PL/pgSQL function tg_iface_biu() line 8 at RAISE +insert into IFace values ('IF', 'orion', 'ethernet_interface_name_too_long', ''); +ERROR: IFace slotname "IF.orion.ethernet_interface_name_too_long" too long (20 char max) +CONTEXT: PL/pgSQL function tg_iface_biu() line 14 at RAISE +-- +-- The following tests are unrelated to the scenario outlined above; +-- they merely exercise specific parts of PL/pgSQL +-- +-- +-- Test recursion, per bug report 7-Sep-01 +-- +CREATE FUNCTION recursion_test(int,int) RETURNS text AS ' +DECLARE rslt text; +BEGIN + IF $1 <= 0 THEN + rslt = CAST($2 AS TEXT); + ELSE + rslt = CAST($1 AS TEXT) || '','' || recursion_test($1 - 1, $2); + END IF; + RETURN rslt; +END;' LANGUAGE plpgsql; +SELECT recursion_test(4,3); + recursion_test +---------------- + 4,3,2,1,3 +(1 row) + +-- +-- Test the FOUND magic variable +-- +CREATE TABLE found_test_tbl (a int); +create function test_found() + returns boolean as ' + declare + begin + insert into found_test_tbl values (1); + if FOUND then + insert into found_test_tbl values (2); + end if; + + update found_test_tbl set a = 100 where a = 1; + if FOUND then + insert into found_test_tbl values (3); + end if; + + delete from found_test_tbl where a = 9999; -- matches no rows + if not FOUND then + insert into found_test_tbl values (4); + end if; + + for i in 1 .. 10 loop + -- no need to do anything + end loop; + if FOUND then + insert into found_test_tbl values (5); + end if; + + -- never executes the loop + for i in 2 .. 1 loop + -- no need to do anything + end loop; + if not FOUND then + insert into found_test_tbl values (6); + end if; + return true; + end;' language plpgsql; +select test_found(); + test_found +------------ + t +(1 row) + +select * from found_test_tbl; + a +----- + 2 + 100 + 3 + 4 + 5 + 6 +(6 rows) + +-- +-- Test set-returning functions for PL/pgSQL +-- +create function test_table_func_rec() returns setof found_test_tbl as ' +DECLARE + rec RECORD; +BEGIN + FOR rec IN select * from found_test_tbl LOOP + RETURN NEXT rec; + END LOOP; + RETURN; +END;' language plpgsql; +select * from test_table_func_rec(); + a +----- + 2 + 100 + 3 + 4 + 5 + 6 +(6 rows) + +create function test_table_func_row() returns setof found_test_tbl as ' +DECLARE + row found_test_tbl%ROWTYPE; +BEGIN + FOR row IN select * from found_test_tbl LOOP + RETURN NEXT row; + END LOOP; + RETURN; +END;' language plpgsql; +select * from test_table_func_row(); + a +----- + 2 + 100 + 3 + 4 + 5 + 6 +(6 rows) + +create function test_ret_set_scalar(int,int) returns setof int as ' +DECLARE + i int; +BEGIN + FOR i IN $1 .. $2 LOOP + RETURN NEXT i + 1; + END LOOP; + RETURN; +END;' language plpgsql; +select * from test_ret_set_scalar(1,10); + test_ret_set_scalar +--------------------- + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 +(10 rows) + +create function test_ret_set_rec_dyn(int) returns setof record as ' +DECLARE + retval RECORD; +BEGIN + IF $1 > 10 THEN + SELECT INTO retval 5, 10, 15; + RETURN NEXT retval; + RETURN NEXT retval; + ELSE + SELECT INTO retval 50, 5::numeric, ''xxx''::text; + RETURN NEXT retval; + RETURN NEXT retval; + END IF; + RETURN; +END;' language plpgsql; +SELECT * FROM test_ret_set_rec_dyn(1500) AS (a int, b int, c int); + a | b | c +---+----+---- + 5 | 10 | 15 + 5 | 10 | 15 +(2 rows) + +SELECT * FROM test_ret_set_rec_dyn(5) AS (a int, b numeric, c text); + a | b | c +----+---+----- + 50 | 5 | xxx + 50 | 5 | xxx +(2 rows) + +create function test_ret_rec_dyn(int) returns record as ' +DECLARE + retval RECORD; +BEGIN + IF $1 > 10 THEN + SELECT INTO retval 5, 10, 15; + RETURN retval; + ELSE + SELECT INTO retval 50, 5::numeric, ''xxx''::text; + RETURN retval; + END IF; +END;' language plpgsql; +SELECT * FROM test_ret_rec_dyn(1500) AS (a int, b int, c int); + a | b | c +---+----+---- + 5 | 10 | 15 +(1 row) + +SELECT * FROM test_ret_rec_dyn(5) AS (a int, b numeric, c text); + a | b | c +----+---+----- + 50 | 5 | xxx +(1 row) + +-- +-- Test some simple polymorphism cases. +-- +create function f1(x anyelement) returns anyelement as $$ +begin + return x + 1; +end$$ language plpgsql; +select f1(42) as int, f1(4.5) as num; + int | num +-----+----- + 43 | 5.5 +(1 row) + +select f1(point(3,4)); -- fail for lack of + operator +ERROR: operator does not exist: point + integer +LINE 1: x + 1 + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +QUERY: x + 1 +CONTEXT: PL/pgSQL function f1(anyelement) line 3 at RETURN +drop function f1(x anyelement); +create function f1(x anyelement) returns anyarray as $$ +begin + return array[x + 1, x + 2]; +end$$ language plpgsql; +select f1(42) as int, f1(4.5) as num; + int | num +---------+----------- + {43,44} | {5.5,6.5} +(1 row) + +drop function f1(x anyelement); +create function f1(x anyarray) returns anyelement as $$ +begin + return x[1]; +end$$ language plpgsql; +select f1(array[2,4]) as int, f1(array[4.5, 7.7]) as num; + int | num +-----+----- + 2 | 4.5 +(1 row) + +select f1(stavalues1) from pg_statistic; -- fail, can't infer element type +ERROR: cannot determine element type of "anyarray" argument +drop function f1(x anyarray); +create function f1(x anyarray) returns anyarray as $$ +begin + return x; +end$$ language plpgsql; +select f1(array[2,4]) as int, f1(array[4.5, 7.7]) as num; + int | num +-------+----------- + {2,4} | {4.5,7.7} +(1 row) + +select f1(stavalues1) from pg_statistic; -- fail, can't infer element type +ERROR: PL/pgSQL functions cannot accept type anyarray +CONTEXT: compilation of PL/pgSQL function "f1" near line 1 +drop function f1(x anyarray); +-- fail, can't infer type: +create function f1(x anyelement) returns anyrange as $$ +begin + return array[x + 1, x + 2]; +end$$ language plpgsql; +ERROR: cannot determine result data type +DETAIL: A result of type anyrange requires at least one input of type anyrange or anymultirange. +create function f1(x anyrange) returns anyarray as $$ +begin + return array[lower(x), upper(x)]; +end$$ language plpgsql; +select f1(int4range(42, 49)) as int, f1(float8range(4.5, 7.8)) as num; + int | num +---------+----------- + {42,49} | {4.5,7.8} +(1 row) + +drop function f1(x anyrange); +create function f1(x anycompatible, y anycompatible) returns anycompatiblearray as $$ +begin + return array[x, y]; +end$$ language plpgsql; +select f1(2, 4) as int, f1(2, 4.5) as num; + int | num +-------+--------- + {2,4} | {2,4.5} +(1 row) + +drop function f1(x anycompatible, y anycompatible); +create function f1(x anycompatiblerange, y anycompatible, z anycompatible) returns anycompatiblearray as $$ +begin + return array[lower(x), upper(x), y, z]; +end$$ language plpgsql; +select f1(int4range(42, 49), 11, 2::smallint) as int, f1(float8range(4.5, 7.8), 7.8, 11::real) as num; + int | num +--------------+------------------ + {42,49,11,2} | {4.5,7.8,7.8,11} +(1 row) + +select f1(int4range(42, 49), 11, 4.5) as fail; -- range type doesn't fit +ERROR: function f1(int4range, integer, numeric) does not exist +LINE 1: select f1(int4range(42, 49), 11, 4.5) as fail; + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function f1(x anycompatiblerange, y anycompatible, z anycompatible); +-- fail, can't infer type: +create function f1(x anycompatible) returns anycompatiblerange as $$ +begin + return array[x + 1, x + 2]; +end$$ language plpgsql; +ERROR: cannot determine result data type +DETAIL: A result of type anycompatiblerange requires at least one input of type anycompatiblerange or anycompatiblemultirange. +create function f1(x anycompatiblerange, y anycompatiblearray) returns anycompatiblerange as $$ +begin + return x; +end$$ language plpgsql; +select f1(int4range(42, 49), array[11]) as int, f1(float8range(4.5, 7.8), array[7]) as num; + int | num +---------+----------- + [42,49) | [4.5,7.8) +(1 row) + +drop function f1(x anycompatiblerange, y anycompatiblearray); +create function f1(a anyelement, b anyarray, + c anycompatible, d anycompatible, + OUT x anyarray, OUT y anycompatiblearray) +as $$ +begin + x := a || b; + y := array[c, d]; +end$$ language plpgsql; +select x, pg_typeof(x), y, pg_typeof(y) + from f1(11, array[1, 2], 42, 34.5); + x | pg_typeof | y | pg_typeof +----------+-----------+-----------+----------- + {11,1,2} | integer[] | {42,34.5} | numeric[] +(1 row) + +select x, pg_typeof(x), y, pg_typeof(y) + from f1(11, array[1, 2], point(1,2), point(3,4)); + x | pg_typeof | y | pg_typeof +----------+-----------+-------------------+----------- + {11,1,2} | integer[] | {"(1,2)","(3,4)"} | point[] +(1 row) + +select x, pg_typeof(x), y, pg_typeof(y) + from f1(11, '{1,2}', point(1,2), '(3,4)'); + x | pg_typeof | y | pg_typeof +----------+-----------+-------------------+----------- + {11,1,2} | integer[] | {"(1,2)","(3,4)"} | point[] +(1 row) + +select x, pg_typeof(x), y, pg_typeof(y) + from f1(11, array[1, 2.2], 42, 34.5); -- fail +ERROR: function f1(integer, numeric[], integer, numeric) does not exist +LINE 2: from f1(11, array[1, 2.2], 42, 34.5); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function f1(a anyelement, b anyarray, + c anycompatible, d anycompatible); +-- +-- Test handling of OUT parameters, including polymorphic cases. +-- Note that RETURN is optional with OUT params; we try both ways. +-- +-- wrong way to do it: +create function f1(in i int, out j int) returns int as $$ +begin + return i+1; +end$$ language plpgsql; +ERROR: RETURN cannot have a parameter in function with OUT parameters +LINE 3: return i+1; + ^ +create function f1(in i int, out j int) as $$ +begin + j := i+1; + return; +end$$ language plpgsql; +select f1(42); + f1 +---- + 43 +(1 row) + +select * from f1(42); + j +---- + 43 +(1 row) + +create or replace function f1(inout i int) as $$ +begin + i := i+1; +end$$ language plpgsql; +select f1(42); + f1 +---- + 43 +(1 row) + +select * from f1(42); + i +---- + 43 +(1 row) + +drop function f1(int); +create function f1(in i int, out j int) returns setof int as $$ +begin + j := i+1; + return next; + j := i+2; + return next; + return; +end$$ language plpgsql; +select * from f1(42); + j +---- + 43 + 44 +(2 rows) + +drop function f1(int); +create function f1(in i int, out j int, out k text) as $$ +begin + j := i; + j := j+1; + k := 'foo'; +end$$ language plpgsql; +select f1(42); + f1 +---------- + (43,foo) +(1 row) + +select * from f1(42); + j | k +----+----- + 43 | foo +(1 row) + +drop function f1(int); +create function f1(in i int, out j int, out k text) returns setof record as $$ +begin + j := i+1; + k := 'foo'; + return next; + j := j+1; + k := 'foot'; + return next; +end$$ language plpgsql; +select * from f1(42); + j | k +----+------ + 43 | foo + 44 | foot +(2 rows) + +drop function f1(int); +create function duplic(in i anyelement, out j anyelement, out k anyarray) as $$ +begin + j := i; + k := array[j,j]; + return; +end$$ language plpgsql; +select * from duplic(42); + j | k +----+--------- + 42 | {42,42} +(1 row) + +select * from duplic('foo'::text); + j | k +-----+----------- + foo | {foo,foo} +(1 row) + +drop function duplic(anyelement); +create function duplic(in i anycompatiblerange, out j anycompatible, out k anycompatiblearray) as $$ +begin + j := lower(i); + k := array[lower(i),upper(i)]; + return; +end$$ language plpgsql; +select * from duplic(int4range(42,49)); + j | k +----+--------- + 42 | {42,49} +(1 row) + +select * from duplic(textrange('aaa', 'bbb')); + j | k +-----+----------- + aaa | {aaa,bbb} +(1 row) + +drop function duplic(anycompatiblerange); +-- +-- test PERFORM +-- +create table perform_test ( + a INT, + b INT +); +create function perform_simple_func(int) returns boolean as ' +BEGIN + IF $1 < 20 THEN + INSERT INTO perform_test VALUES ($1, $1 + 10); + RETURN TRUE; + ELSE + RETURN FALSE; + END IF; +END;' language plpgsql; +create function perform_test_func() returns void as ' +BEGIN + IF FOUND then + INSERT INTO perform_test VALUES (100, 100); + END IF; + + PERFORM perform_simple_func(5); + + IF FOUND then + INSERT INTO perform_test VALUES (100, 100); + END IF; + + PERFORM perform_simple_func(50); + + IF FOUND then + INSERT INTO perform_test VALUES (100, 100); + END IF; + + RETURN; +END;' language plpgsql; +SELECT perform_test_func(); + perform_test_func +------------------- + +(1 row) + +SELECT * FROM perform_test; + a | b +-----+----- + 5 | 15 + 100 | 100 + 100 | 100 +(3 rows) + +drop table perform_test; +-- +-- Test proper snapshot handling in simple expressions +-- +create temp table users(login text, id serial); +create function sp_id_user(a_login text) returns int as $$ +declare x int; +begin + select into x id from users where login = a_login; + if found then return x; end if; + return 0; +end$$ language plpgsql stable; +insert into users values('user1'); +select sp_id_user('user1'); + sp_id_user +------------ + 1 +(1 row) + +select sp_id_user('userx'); + sp_id_user +------------ + 0 +(1 row) + +create function sp_add_user(a_login text) returns int as $$ +declare my_id_user int; +begin + my_id_user = sp_id_user( a_login ); + IF my_id_user > 0 THEN + RETURN -1; -- error code for existing user + END IF; + INSERT INTO users ( login ) VALUES ( a_login ); + my_id_user = sp_id_user( a_login ); + IF my_id_user = 0 THEN + RETURN -2; -- error code for insertion failure + END IF; + RETURN my_id_user; +end$$ language plpgsql; +select sp_add_user('user1'); + sp_add_user +------------- + -1 +(1 row) + +select sp_add_user('user2'); + sp_add_user +------------- + 2 +(1 row) + +select sp_add_user('user2'); + sp_add_user +------------- + -1 +(1 row) + +select sp_add_user('user3'); + sp_add_user +------------- + 3 +(1 row) + +select sp_add_user('user3'); + sp_add_user +------------- + -1 +(1 row) + +drop function sp_add_user(text); +drop function sp_id_user(text); +-- +-- tests for refcursors +-- +create table rc_test (a int, b int); +copy rc_test from stdin; +create function return_unnamed_refcursor() returns refcursor as $$ +declare + rc refcursor; +begin + open rc for select a from rc_test; + return rc; +end +$$ language plpgsql; +create function use_refcursor(rc refcursor) returns int as $$ +declare + rc refcursor; + x record; +begin + rc := return_unnamed_refcursor(); + fetch next from rc into x; + return x.a; +end +$$ language plpgsql; +select use_refcursor(return_unnamed_refcursor()); + use_refcursor +--------------- + 5 +(1 row) + +create function return_refcursor(rc refcursor) returns refcursor as $$ +begin + open rc for select a from rc_test; + return rc; +end +$$ language plpgsql; +create function refcursor_test1(refcursor) returns refcursor as $$ +begin + perform return_refcursor($1); + return $1; +end +$$ language plpgsql; +begin; +select refcursor_test1('test1'); + refcursor_test1 +----------------- + test1 +(1 row) + +fetch next in test1; + a +--- + 5 +(1 row) + +select refcursor_test1('test2'); + refcursor_test1 +----------------- + test2 +(1 row) + +fetch all from test2; + a +----- + 5 + 50 + 500 +(3 rows) + +commit; +-- should fail +fetch next from test1; +ERROR: cursor "test1" does not exist +create function refcursor_test2(int, int) returns boolean as $$ +declare + c1 cursor (param1 int, param2 int) for select * from rc_test where a > param1 and b > param2; + nonsense record; +begin + open c1($1, $2); + fetch c1 into nonsense; + close c1; + if found then + return true; + else + return false; + end if; +end +$$ language plpgsql; +select refcursor_test2(20000, 20000) as "Should be false", + refcursor_test2(20, 20) as "Should be true"; + Should be false | Should be true +-----------------+---------------- + f | t +(1 row) + +-- +-- tests for cursors with named parameter arguments +-- +create function namedparmcursor_test1(int, int) returns boolean as $$ +declare + c1 cursor (param1 int, param12 int) for select * from rc_test where a > param1 and b > param12; + nonsense record; +begin + open c1(param12 := $2, param1 := $1); + fetch c1 into nonsense; + close c1; + if found then + return true; + else + return false; + end if; +end +$$ language plpgsql; +select namedparmcursor_test1(20000, 20000) as "Should be false", + namedparmcursor_test1(20, 20) as "Should be true"; + Should be false | Should be true +-----------------+---------------- + f | t +(1 row) + +-- mixing named and positional argument notations +create function namedparmcursor_test2(int, int) returns boolean as $$ +declare + c1 cursor (param1 int, param2 int) for select * from rc_test where a > param1 and b > param2; + nonsense record; +begin + open c1(param1 := $1, $2); + fetch c1 into nonsense; + close c1; + if found then + return true; + else + return false; + end if; +end +$$ language plpgsql; +select namedparmcursor_test2(20, 20); + namedparmcursor_test2 +----------------------- + t +(1 row) + +-- mixing named and positional: param2 is given twice, once in named notation +-- and second time in positional notation. Should throw an error at parse time +create function namedparmcursor_test3() returns void as $$ +declare + c1 cursor (param1 int, param2 int) for select * from rc_test where a > param1 and b > param2; +begin + open c1(param2 := 20, 21); +end +$$ language plpgsql; +ERROR: value for parameter "param2" of cursor "c1" specified more than once +LINE 5: open c1(param2 := 20, 21); + ^ +-- mixing named and positional: same as previous test, but param1 is duplicated +create function namedparmcursor_test4() returns void as $$ +declare + c1 cursor (param1 int, param2 int) for select * from rc_test where a > param1 and b > param2; +begin + open c1(20, param1 := 21); +end +$$ language plpgsql; +ERROR: value for parameter "param1" of cursor "c1" specified more than once +LINE 5: open c1(20, param1 := 21); + ^ +-- duplicate named parameter, should throw an error at parse time +create function namedparmcursor_test5() returns void as $$ +declare + c1 cursor (p1 int, p2 int) for + select * from tenk1 where thousand = p1 and tenthous = p2; +begin + open c1 (p2 := 77, p2 := 42); +end +$$ language plpgsql; +ERROR: value for parameter "p2" of cursor "c1" specified more than once +LINE 6: open c1 (p2 := 77, p2 := 42); + ^ +-- not enough parameters, should throw an error at parse time +create function namedparmcursor_test6() returns void as $$ +declare + c1 cursor (p1 int, p2 int) for + select * from tenk1 where thousand = p1 and tenthous = p2; +begin + open c1 (p2 := 77); +end +$$ language plpgsql; +ERROR: not enough arguments for cursor "c1" +LINE 6: open c1 (p2 := 77); + ^ +-- division by zero runtime error, the context given in the error message +-- should be sensible +create function namedparmcursor_test7() returns void as $$ +declare + c1 cursor (p1 int, p2 int) for + select * from tenk1 where thousand = p1 and tenthous = p2; +begin + open c1 (p2 := 77, p1 := 42/0); +end $$ language plpgsql; +select namedparmcursor_test7(); +ERROR: division by zero +CONTEXT: SQL expression "42/0 AS p1, 77 AS p2" +PL/pgSQL function namedparmcursor_test7() line 6 at OPEN +-- check that line comments work correctly within the argument list (there +-- is some special handling of this case in the code: the newline after the +-- comment must be preserved when the argument-evaluating query is +-- constructed, otherwise the comment effectively comments out the next +-- argument, too) +create function namedparmcursor_test8() returns int4 as $$ +declare + c1 cursor (p1 int, p2 int) for + select count(*) from tenk1 where thousand = p1 and tenthous = p2; + n int4; +begin + open c1 (77 -- test + , 42); + fetch c1 into n; + return n; +end $$ language plpgsql; +select namedparmcursor_test8(); + namedparmcursor_test8 +----------------------- + 0 +(1 row) + +-- cursor parameter name can match plpgsql variable or unreserved keyword +create function namedparmcursor_test9(p1 int) returns int4 as $$ +declare + c1 cursor (p1 int, p2 int, debug int) for + select count(*) from tenk1 where thousand = p1 and tenthous = p2 + and four = debug; + p2 int4 := 1006; + n int4; +begin + open c1 (p1 := p1, p2 := p2, debug := 2); + fetch c1 into n; + return n; +end $$ language plpgsql; +select namedparmcursor_test9(6); + namedparmcursor_test9 +----------------------- + 1 +(1 row) + +-- +-- tests for "raise" processing +-- +create function raise_test1(int) returns int as $$ +begin + raise notice 'This message has too many parameters!', $1; + return $1; +end; +$$ language plpgsql; +ERROR: too many parameters specified for RAISE +CONTEXT: compilation of PL/pgSQL function "raise_test1" near line 3 +create function raise_test2(int) returns int as $$ +begin + raise notice 'This message has too few parameters: %, %, %', $1, $1; + return $1; +end; +$$ language plpgsql; +ERROR: too few parameters specified for RAISE +CONTEXT: compilation of PL/pgSQL function "raise_test2" near line 3 +create function raise_test3(int) returns int as $$ +begin + raise notice 'This message has no parameters (despite having %% signs in it)!'; + return $1; +end; +$$ language plpgsql; +select raise_test3(1); +NOTICE: This message has no parameters (despite having % signs in it)! + raise_test3 +------------- + 1 +(1 row) + +-- Test re-RAISE inside a nested exception block. This case is allowed +-- by Oracle's PL/SQL but was handled differently by PG before 9.1. +CREATE FUNCTION reraise_test() RETURNS void AS $$ +BEGIN + BEGIN + RAISE syntax_error; + EXCEPTION + WHEN syntax_error THEN + BEGIN + raise notice 'exception % thrown in inner block, reraising', sqlerrm; + RAISE; + EXCEPTION + WHEN OTHERS THEN + raise notice 'RIGHT - exception % caught in inner block', sqlerrm; + END; + END; +EXCEPTION + WHEN OTHERS THEN + raise notice 'WRONG - exception % caught in outer block', sqlerrm; +END; +$$ LANGUAGE plpgsql; +SELECT reraise_test(); +NOTICE: exception syntax_error thrown in inner block, reraising +NOTICE: RIGHT - exception syntax_error caught in inner block + reraise_test +-------------- + +(1 row) + +-- +-- reject function definitions that contain malformed SQL queries at +-- compile-time, where possible +-- +create function bad_sql1() returns int as $$ +declare a int; +begin + a := 5; + Johnny Yuma; + a := 10; + return a; +end$$ language plpgsql; +ERROR: syntax error at or near "Johnny" +LINE 5: Johnny Yuma; + ^ +create function bad_sql2() returns int as $$ +declare r record; +begin + for r in select I fought the law, the law won LOOP + raise notice 'in loop'; + end loop; + return 5; +end;$$ language plpgsql; +ERROR: syntax error at or near "the" +LINE 4: for r in select I fought the law, the law won LOOP + ^ +-- a RETURN expression is mandatory, except for void-returning +-- functions, where it is not allowed +create function missing_return_expr() returns int as $$ +begin + return ; +end;$$ language plpgsql; +ERROR: missing expression at or near ";" +LINE 3: return ; + ^ +create function void_return_expr() returns void as $$ +begin + return 5; +end;$$ language plpgsql; +ERROR: RETURN cannot have a parameter in function returning void +LINE 3: return 5; + ^ +-- VOID functions are allowed to omit RETURN +create function void_return_expr() returns void as $$ +begin + perform 2+2; +end;$$ language plpgsql; +select void_return_expr(); + void_return_expr +------------------ + +(1 row) + +-- but ordinary functions are not +create function missing_return_expr() returns int as $$ +begin + perform 2+2; +end;$$ language plpgsql; +select missing_return_expr(); +ERROR: control reached end of function without RETURN +CONTEXT: PL/pgSQL function missing_return_expr() +drop function void_return_expr(); +drop function missing_return_expr(); +-- +-- EXECUTE ... INTO test +-- +create table eifoo (i integer, y integer); +create type eitype as (i integer, y integer); +create or replace function execute_into_test(varchar) returns record as $$ +declare + _r record; + _rt eifoo%rowtype; + _v eitype; + i int; + j int; + k int; +begin + execute 'insert into '||$1||' values(10,15)'; + execute 'select (row).* from (select row(10,1)::eifoo) s' into _r; + raise notice '% %', _r.i, _r.y; + execute 'select * from '||$1||' limit 1' into _rt; + raise notice '% %', _rt.i, _rt.y; + execute 'select *, 20 from '||$1||' limit 1' into i, j, k; + raise notice '% % %', i, j, k; + execute 'select 1,2' into _v; + return _v; +end; $$ language plpgsql; +select execute_into_test('eifoo'); +NOTICE: 10 1 +NOTICE: 10 15 +NOTICE: 10 15 20 + execute_into_test +------------------- + (1,2) +(1 row) + +drop table eifoo cascade; +drop type eitype cascade; +-- +-- SQLSTATE and SQLERRM test +-- +create function excpt_test1() returns void as $$ +begin + raise notice '% %', sqlstate, sqlerrm; +end; $$ language plpgsql; +-- should fail: SQLSTATE and SQLERRM are only in defined EXCEPTION +-- blocks +select excpt_test1(); +ERROR: column "sqlstate" does not exist +LINE 1: sqlstate + ^ +QUERY: sqlstate +CONTEXT: PL/pgSQL function excpt_test1() line 3 at RAISE +create function excpt_test2() returns void as $$ +begin + begin + begin + raise notice '% %', sqlstate, sqlerrm; + end; + end; +end; $$ language plpgsql; +-- should fail +select excpt_test2(); +ERROR: column "sqlstate" does not exist +LINE 1: sqlstate + ^ +QUERY: sqlstate +CONTEXT: PL/pgSQL function excpt_test2() line 5 at RAISE +create function excpt_test3() returns void as $$ +begin + begin + raise exception 'user exception'; + exception when others then + raise notice 'caught exception % %', sqlstate, sqlerrm; + begin + raise notice '% %', sqlstate, sqlerrm; + perform 10/0; + exception + when substring_error then + -- this exception handler shouldn't be invoked + raise notice 'unexpected exception: % %', sqlstate, sqlerrm; + when division_by_zero then + raise notice 'caught exception % %', sqlstate, sqlerrm; + end; + raise notice '% %', sqlstate, sqlerrm; + end; +end; $$ language plpgsql; +select excpt_test3(); +NOTICE: caught exception P0001 user exception +NOTICE: P0001 user exception +NOTICE: caught exception 22012 division by zero +NOTICE: P0001 user exception + excpt_test3 +------------- + +(1 row) + +create function excpt_test4() returns text as $$ +begin + begin perform 1/0; + exception when others then return sqlerrm; end; +end; $$ language plpgsql; +select excpt_test4(); + excpt_test4 +------------------ + division by zero +(1 row) + +drop function excpt_test1(); +drop function excpt_test2(); +drop function excpt_test3(); +drop function excpt_test4(); +-- parameters of raise stmt can be expressions +create function raise_exprs() returns void as $$ +declare + a integer[] = '{10,20,30}'; + c varchar = 'xyz'; + i integer; +begin + i := 2; + raise notice '%; %; %; %; %; %', a, a[i], c, (select c || 'abc'), row(10,'aaa',NULL,30), NULL; +end;$$ language plpgsql; +select raise_exprs(); +NOTICE: {10,20,30}; 20; xyz; xyzabc; (10,aaa,,30); + raise_exprs +------------- + +(1 row) + +drop function raise_exprs(); +-- regression test: verify that multiple uses of same plpgsql datum within +-- a SQL command all get mapped to the same $n parameter. The return value +-- of the SELECT is not important, we only care that it doesn't fail with +-- a complaint about an ungrouped column reference. +create function multi_datum_use(p1 int) returns bool as $$ +declare + x int; + y int; +begin + select into x,y unique1/p1, unique1/$1 from tenk1 group by unique1/p1; + return x = y; +end$$ language plpgsql; +select multi_datum_use(42); + multi_datum_use +----------------- + t +(1 row) + +-- +-- Test STRICT limiter in both planned and EXECUTE invocations. +-- Note that a data-modifying query is quasi strict (disallow multi rows) +-- by default in the planned case, but not in EXECUTE. +-- +create temp table foo (f1 int, f2 int); +insert into foo values (1,2), (3,4); +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should work + insert into foo values(5,6) returning * into x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +NOTICE: x.f1 = 5, x.f2 = 6 + stricttest +------------ + +(1 row) + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail due to implicit strict + insert into foo values(7,8),(9,10) returning * into x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +HINT: Make sure the query returns a single row, or use LIMIT 1. +CONTEXT: PL/pgSQL function stricttest() line 5 at SQL statement +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should work + execute 'insert into foo values(5,6) returning *' into x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +NOTICE: x.f1 = 5, x.f2 = 6 + stricttest +------------ + +(1 row) + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- this should work since EXECUTE isn't as picky + execute 'insert into foo values(7,8),(9,10) returning *' into x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +NOTICE: x.f1 = 7, x.f2 = 8 + stricttest +------------ + +(1 row) + +select * from foo; + f1 | f2 +----+---- + 1 | 2 + 3 | 4 + 5 | 6 + 5 | 6 + 7 | 8 + 9 | 10 +(6 rows) + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should work + select * from foo where f1 = 3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +NOTICE: x.f1 = 3, x.f2 = 4 + stricttest +------------ + +(1 row) + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail, no rows + select * from foo where f1 = 0 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned no rows +CONTEXT: PL/pgSQL function stricttest() line 5 at SQL statement +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail, too many rows + select * from foo where f1 > 3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +HINT: Make sure the query returns a single row, or use LIMIT 1. +CONTEXT: PL/pgSQL function stricttest() line 5 at SQL statement +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should work + execute 'select * from foo where f1 = 3' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +NOTICE: x.f1 = 3, x.f2 = 4 + stricttest +------------ + +(1 row) + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail, no rows + execute 'select * from foo where f1 = 0' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned no rows +CONTEXT: PL/pgSQL function stricttest() line 5 at EXECUTE +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail, too many rows + execute 'select * from foo where f1 > 3' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +CONTEXT: PL/pgSQL function stricttest() line 5 at EXECUTE +drop function stricttest(); +-- test printing parameters after failure due to STRICT +set plpgsql.print_strict_params to true; +create or replace function stricttest() returns void as $$ +declare +x record; +p1 int := 2; +p3 text := 'foo'; +begin + -- no rows + select * from foo where f1 = p1 and f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned no rows +DETAIL: parameters: p1 = '2', p3 = 'foo' +CONTEXT: PL/pgSQL function stricttest() line 8 at SQL statement +create or replace function stricttest() returns void as $$ +declare +x record; +p1 int := 2; +p3 text := $a$'Valame Dios!' dijo Sancho; 'no le dije yo a vuestra merced que mirase bien lo que hacia?'$a$; +begin + -- no rows + select * from foo where f1 = p1 and f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned no rows +DETAIL: parameters: p1 = '2', p3 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que mirase bien lo que hacia?''' +CONTEXT: PL/pgSQL function stricttest() line 8 at SQL statement +create or replace function stricttest() returns void as $$ +declare +x record; +p1 int := 2; +p3 text := 'foo'; +begin + -- too many rows + select * from foo where f1 > p1 or f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +DETAIL: parameters: p1 = '2', p3 = 'foo' +HINT: Make sure the query returns a single row, or use LIMIT 1. +CONTEXT: PL/pgSQL function stricttest() line 8 at SQL statement +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- too many rows, no params + select * from foo where f1 > 3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +HINT: Make sure the query returns a single row, or use LIMIT 1. +CONTEXT: PL/pgSQL function stricttest() line 5 at SQL statement +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- no rows + execute 'select * from foo where f1 = $1 or f1::text = $2' using 0, 'foo' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned no rows +DETAIL: parameters: $1 = '0', $2 = 'foo' +CONTEXT: PL/pgSQL function stricttest() line 5 at EXECUTE +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- too many rows + execute 'select * from foo where f1 > $1' using 1 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +DETAIL: parameters: $1 = '1' +CONTEXT: PL/pgSQL function stricttest() line 5 at EXECUTE +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- too many rows, no parameters + execute 'select * from foo where f1 > 3' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +CONTEXT: PL/pgSQL function stricttest() line 5 at EXECUTE +create or replace function stricttest() returns void as $$ +-- override the global +#print_strict_params off +declare +x record; +p1 int := 2; +p3 text := 'foo'; +begin + -- too many rows + select * from foo where f1 > p1 or f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +HINT: Make sure the query returns a single row, or use LIMIT 1. +CONTEXT: PL/pgSQL function stricttest() line 10 at SQL statement +reset plpgsql.print_strict_params; +create or replace function stricttest() returns void as $$ +-- override the global +#print_strict_params on +declare +x record; +p1 int := 2; +p3 text := 'foo'; +begin + -- too many rows + select * from foo where f1 > p1 or f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; +select stricttest(); +ERROR: query returned more than one row +DETAIL: parameters: p1 = '2', p3 = 'foo' +HINT: Make sure the query returns a single row, or use LIMIT 1. +CONTEXT: PL/pgSQL function stricttest() line 10 at SQL statement +-- test warnings and errors +set plpgsql.extra_warnings to 'all'; +set plpgsql.extra_warnings to 'none'; +set plpgsql.extra_errors to 'all'; +set plpgsql.extra_errors to 'none'; +-- test warnings when shadowing a variable +set plpgsql.extra_warnings to 'shadowed_variables'; +-- simple shadowing of input and output parameters +create or replace function shadowtest(in1 int) + returns table (out1 int) as $$ +declare +in1 int; +out1 int; +begin +end +$$ language plpgsql; +WARNING: variable "in1" shadows a previously defined variable +LINE 4: in1 int; + ^ +WARNING: variable "out1" shadows a previously defined variable +LINE 5: out1 int; + ^ +select shadowtest(1); + shadowtest +------------ +(0 rows) + +set plpgsql.extra_warnings to 'shadowed_variables'; +select shadowtest(1); + shadowtest +------------ +(0 rows) + +create or replace function shadowtest(in1 int) + returns table (out1 int) as $$ +declare +in1 int; +out1 int; +begin +end +$$ language plpgsql; +WARNING: variable "in1" shadows a previously defined variable +LINE 4: in1 int; + ^ +WARNING: variable "out1" shadows a previously defined variable +LINE 5: out1 int; + ^ +select shadowtest(1); + shadowtest +------------ +(0 rows) + +drop function shadowtest(int); +-- shadowing in a second DECLARE block +create or replace function shadowtest() + returns void as $$ +declare +f1 int; +begin + declare + f1 int; + begin + end; +end$$ language plpgsql; +WARNING: variable "f1" shadows a previously defined variable +LINE 7: f1 int; + ^ +drop function shadowtest(); +-- several levels of shadowing +create or replace function shadowtest(in1 int) + returns void as $$ +declare +in1 int; +begin + declare + in1 int; + begin + end; +end$$ language plpgsql; +WARNING: variable "in1" shadows a previously defined variable +LINE 4: in1 int; + ^ +WARNING: variable "in1" shadows a previously defined variable +LINE 7: in1 int; + ^ +drop function shadowtest(int); +-- shadowing in cursor definitions +create or replace function shadowtest() + returns void as $$ +declare +f1 int; +c1 cursor (f1 int) for select 1; +begin +end$$ language plpgsql; +WARNING: variable "f1" shadows a previously defined variable +LINE 5: c1 cursor (f1 int) for select 1; + ^ +drop function shadowtest(); +-- test errors when shadowing a variable +set plpgsql.extra_errors to 'shadowed_variables'; +create or replace function shadowtest(f1 int) + returns boolean as $$ +declare f1 int; begin return 1; end $$ language plpgsql; +ERROR: variable "f1" shadows a previously defined variable +LINE 3: declare f1 int; begin return 1; end $$ language plpgsql; + ^ +select shadowtest(1); +ERROR: function shadowtest(integer) does not exist +LINE 1: select shadowtest(1); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +reset plpgsql.extra_errors; +reset plpgsql.extra_warnings; +create or replace function shadowtest(f1 int) + returns boolean as $$ +declare f1 int; begin return 1; end $$ language plpgsql; +select shadowtest(1); + shadowtest +------------ + t +(1 row) + +-- runtime extra checks +set plpgsql.extra_warnings to 'too_many_rows'; +do $$ +declare x int; +begin + select v from generate_series(1,2) g(v) into x; +end; +$$; +WARNING: query returned more than one row +HINT: Make sure the query returns a single row, or use LIMIT 1. +set plpgsql.extra_errors to 'too_many_rows'; +do $$ +declare x int; +begin + select v from generate_series(1,2) g(v) into x; +end; +$$; +ERROR: query returned more than one row +HINT: Make sure the query returns a single row, or use LIMIT 1. +CONTEXT: PL/pgSQL function inline_code_block line 4 at SQL statement +reset plpgsql.extra_errors; +reset plpgsql.extra_warnings; +set plpgsql.extra_warnings to 'strict_multi_assignment'; +do $$ +declare + x int; + y int; +begin + select 1 into x, y; + select 1,2 into x, y; + select 1,2,3 into x, y; +end +$$; +WARNING: number of source and target fields in assignment does not match +DETAIL: strict_multi_assignment check of extra_warnings is active. +HINT: Make sure the query returns the exact list of columns. +WARNING: number of source and target fields in assignment does not match +DETAIL: strict_multi_assignment check of extra_warnings is active. +HINT: Make sure the query returns the exact list of columns. +set plpgsql.extra_errors to 'strict_multi_assignment'; +do $$ +declare + x int; + y int; +begin + select 1 into x, y; + select 1,2 into x, y; + select 1,2,3 into x, y; +end +$$; +ERROR: number of source and target fields in assignment does not match +DETAIL: strict_multi_assignment check of extra_errors is active. +HINT: Make sure the query returns the exact list of columns. +CONTEXT: PL/pgSQL function inline_code_block line 6 at SQL statement +create table test_01(a int, b int, c int); +alter table test_01 drop column a; +-- the check is active only when source table is not empty +insert into test_01 values(10,20); +do $$ +declare + x int; + y int; +begin + select * from test_01 into x, y; -- should be ok + raise notice 'ok'; + select * from test_01 into x; -- should to fail +end; +$$; +NOTICE: ok +ERROR: number of source and target fields in assignment does not match +DETAIL: strict_multi_assignment check of extra_errors is active. +HINT: Make sure the query returns the exact list of columns. +CONTEXT: PL/pgSQL function inline_code_block line 8 at SQL statement +do $$ +declare + t test_01; +begin + select 1, 2 into t; -- should be ok + raise notice 'ok'; + select 1, 2, 3 into t; -- should fail; +end; +$$; +NOTICE: ok +ERROR: number of source and target fields in assignment does not match +DETAIL: strict_multi_assignment check of extra_errors is active. +HINT: Make sure the query returns the exact list of columns. +CONTEXT: PL/pgSQL function inline_code_block line 7 at SQL statement +do $$ +declare + t test_01; +begin + select 1 into t; -- should fail; +end; +$$; +ERROR: number of source and target fields in assignment does not match +DETAIL: strict_multi_assignment check of extra_errors is active. +HINT: Make sure the query returns the exact list of columns. +CONTEXT: PL/pgSQL function inline_code_block line 5 at SQL statement +drop table test_01; +reset plpgsql.extra_errors; +reset plpgsql.extra_warnings; +-- test scrollable cursor support +create function sc_test() returns setof integer as $$ +declare + c scroll cursor for select f1 from int4_tbl; + x integer; +begin + open c; + fetch last from c into x; + while found loop + return next x; + fetch prior from c into x; + end loop; + close c; +end; +$$ language plpgsql; +select * from sc_test(); +ERROR: backward scan is not supported in this version of Cloudberry Database +CONTEXT: PL/pgSQL function sc_test() line 7 at FETCH +create or replace function sc_test() returns setof integer as $$ +declare + c no scroll cursor for select f1 from int4_tbl; + x integer; +begin + open c; + fetch last from c into x; + while found loop + return next x; + fetch prior from c into x; + end loop; + close c; +end; +$$ language plpgsql; +select * from sc_test(); -- fails because of NO SCROLL specification +ERROR: backward scan is not supported in this version of Cloudberry Database +CONTEXT: PL/pgSQL function sc_test() line 7 at FETCH +create or replace function sc_test() returns setof integer as $$ +declare + c refcursor; + x integer; +begin + open c scroll for select f1 from int4_tbl; + fetch last from c into x; + while found loop + return next x; + fetch prior from c into x; + end loop; + close c; +end; +$$ language plpgsql; +select * from sc_test(); +ERROR: backward scan is not supported in this version of Cloudberry Database +CONTEXT: PL/pgSQL function sc_test() line 7 at FETCH +create or replace function sc_test() returns setof integer as $$ +declare + c refcursor; + x integer; +begin + open c scroll for execute 'select f1 from int4_tbl'; + fetch last from c into x; + while found loop + return next x; + fetch relative -2 from c into x; + end loop; + close c; +end; +$$ language plpgsql; +select * from sc_test(); +ERROR: backward scan is not supported in this version of Cloudberry Database +CONTEXT: PL/pgSQL function sc_test() line 7 at FETCH +create or replace function sc_test() returns setof integer as $$ +declare + c refcursor; + x integer; +begin + open c scroll for execute 'select f1 from int4_tbl'; + fetch last from c into x; + while found loop + return next x; + move backward 2 from c; + fetch relative -1 from c into x; + end loop; + close c; +end; +$$ language plpgsql; +select * from sc_test(); +ERROR: backward scan is not supported in this version of Cloudberry Database +CONTEXT: PL/pgSQL function sc_test() line 7 at FETCH +create or replace function sc_test() returns setof integer as $$ +declare + c cursor for select * from generate_series(1, 10); + x integer; +begin + open c; + loop + move relative 2 in c; + if not found then + exit; + end if; + fetch next from c into x; + if found then + return next x; + end if; + end loop; + close c; +end; +$$ language plpgsql; +select * from sc_test(); + sc_test +--------- + 3 + 6 + 9 +(3 rows) + +create or replace function sc_test() returns setof integer as $$ +declare + c cursor for select * from generate_series(1, 10); + x integer; +begin + open c; + move forward all in c; + fetch backward from c into x; + if found then + return next x; + end if; + close c; +end; +$$ language plpgsql; +select * from sc_test(); +ERROR: backward scan is not supported in this version of Cloudberry Database +CONTEXT: PL/pgSQL function sc_test() line 8 at FETCH +drop function sc_test(); +-- test qualified variable names +create function pl_qual_names (param1 int) returns void as $$ +<> +declare + param1 int := 1; +begin + <> + declare + param1 int := 2; + begin + raise notice 'param1 = %', param1; + raise notice 'pl_qual_names.param1 = %', pl_qual_names.param1; + raise notice 'outerblock.param1 = %', outerblock.param1; + raise notice 'innerblock.param1 = %', innerblock.param1; + end; +end; +$$ language plpgsql; +select pl_qual_names(42); +NOTICE: param1 = 2 +NOTICE: pl_qual_names.param1 = 42 +NOTICE: outerblock.param1 = 1 +NOTICE: innerblock.param1 = 2 + pl_qual_names +--------------- + +(1 row) + +drop function pl_qual_names(int); +-- tests for RETURN QUERY +create function ret_query1(out int, out int) returns setof record as $$ +begin + $1 := -1; + $2 := -2; + return next; + return query select x + 1, x * 10 from generate_series(0, 10) s (x); + return next; +end; +$$ language plpgsql; +select * from ret_query1(); + column1 | column2 +---------+--------- + -1 | -2 + 1 | 0 + 2 | 10 + 3 | 20 + 4 | 30 + 5 | 40 + 6 | 50 + 7 | 60 + 8 | 70 + 9 | 80 + 10 | 90 + 11 | 100 + -1 | -2 +(13 rows) + +create type record_type as (x text, y int, z boolean); +create or replace function ret_query2(lim int) returns setof record_type as $$ +begin + return query select md5(s.x::text), s.x, s.x > 0 + from generate_series(-8, lim) s (x) where s.x % 2 = 0; +end; +$$ language plpgsql; +select * from ret_query2(8); + x | y | z +----------------------------------+----+--- + a8d2ec85eaf98407310b72eb73dda247 | -8 | f + 596a3d04481816330f07e4f97510c28f | -6 | f + 0267aaf632e87a63288a08331f22c7c3 | -4 | f + 5d7b9adcbe1c629ec722529dd12e5129 | -2 | f + cfcd208495d565ef66e7dff9f98764da | 0 | f + c81e728d9d4c2f636f067f89cc14862c | 2 | t + a87ff679a2f3e71d9181a67b7542122c | 4 | t + 1679091c5a880faf6fb5e6087eb1b2dc | 6 | t + c9f0f895fb98ab9159f51fd0297e236d | 8 | t +(9 rows) + +-- test EXECUTE USING +create function exc_using(int, text) returns int as $$ +declare i int; +begin + for i in execute 'select * from generate_series(1,$1)' using $1+1 loop + raise notice '%', i; + end loop; + execute 'select $2 + $2*3 + length($1)' into i using $2,$1; + return i; +end +$$ language plpgsql; +select exc_using(5, 'foobar'); +NOTICE: 1 +NOTICE: 2 +NOTICE: 3 +NOTICE: 4 +NOTICE: 5 +NOTICE: 6 + exc_using +----------- + 26 +(1 row) + +drop function exc_using(int, text); +create or replace function exc_using(int) returns void as $$ +declare + c refcursor; + i int; +begin + open c for execute 'select * from generate_series(1,$1)' using $1+1; + loop + fetch c into i; + exit when not found; + raise notice '%', i; + end loop; + close c; + return; +end; +$$ language plpgsql; +select exc_using(5); +NOTICE: 1 +NOTICE: 2 +NOTICE: 3 +NOTICE: 4 +NOTICE: 5 +NOTICE: 6 + exc_using +----------- + +(1 row) + +drop function exc_using(int); +-- test FOR-over-cursor +create or replace function forc01() returns void as $$ +declare + c cursor(r1 integer, r2 integer) + for select * from generate_series(r1,r2) i; + c2 cursor + for select * from generate_series(41,43) i; +begin + for r in c(5,7) loop + raise notice '% from %', r.i, c; + end loop; + -- again, to test if cursor was closed properly + for r in c(9,10) loop + raise notice '% from %', r.i, c; + end loop; + -- and test a parameterless cursor + for r in c2 loop + raise notice '% from %', r.i, c2; + end loop; + -- and try it with a hand-assigned name + raise notice 'after loop, c2 = %', c2; + c2 := 'special_name'; + for r in c2 loop + raise notice '% from %', r.i, c2; + end loop; + raise notice 'after loop, c2 = %', c2; + -- and try it with a generated name + -- (which we can't show in the output because it's variable) + c2 := null; + for r in c2 loop + raise notice '%', r.i; + end loop; + raise notice 'after loop, c2 = %', c2; + return; +end; +$$ language plpgsql; +select forc01(); +NOTICE: 5 from c +NOTICE: 6 from c +NOTICE: 7 from c +NOTICE: 9 from c +NOTICE: 10 from c +NOTICE: 41 from c2 +NOTICE: 42 from c2 +NOTICE: 43 from c2 +NOTICE: after loop, c2 = c2 +NOTICE: 41 from special_name +NOTICE: 42 from special_name +NOTICE: 43 from special_name +NOTICE: after loop, c2 = special_name +NOTICE: 41 +NOTICE: 42 +NOTICE: 43 +NOTICE: after loop, c2 = + forc01 +-------- + +(1 row) + +-- try updating the cursor's current row +create temp table forc_test as + select n as i, n as j from generate_series(1,10) n; +create or replace function forc01() returns void as $$ +declare + c cursor for select * from forc_test; +begin + for r in c loop + raise notice '%, %', r.i, r.j; + update forc_test set i = i * 100, j = r.j * 2 where current of c; + end loop; +end; +$$ language plpgsql; +select forc01(); +NOTICE: 1, 1 +NOTICE: 2, 2 +NOTICE: 3, 3 +NOTICE: 4, 4 +NOTICE: 5, 5 +NOTICE: 6, 6 +NOTICE: 7, 7 +NOTICE: 8, 8 +NOTICE: 9, 9 +NOTICE: 10, 10 + forc01 +-------- + +(1 row) + +select * from forc_test; + i | j +------+---- + 100 | 2 + 200 | 4 + 300 | 6 + 400 | 8 + 500 | 10 + 600 | 12 + 700 | 14 + 800 | 16 + 900 | 18 + 1000 | 20 +(10 rows) + +-- same, with a cursor whose portal name doesn't match variable name +create or replace function forc01() returns void as $$ +declare + c refcursor := 'fooled_ya'; + r record; +begin + open c for select * from forc_test; + loop + fetch c into r; + exit when not found; + raise notice '%, %', r.i, r.j; + update forc_test set i = i * 100, j = r.j * 2 where current of c; + end loop; +end; +$$ language plpgsql; +select forc01(); +NOTICE: 100, 2 +NOTICE: 200, 4 +NOTICE: 300, 6 +NOTICE: 400, 8 +NOTICE: 500, 10 +NOTICE: 600, 12 +NOTICE: 700, 14 +NOTICE: 800, 16 +NOTICE: 900, 18 +NOTICE: 1000, 20 + forc01 +-------- + +(1 row) + +select * from forc_test; + i | j +--------+---- + 10000 | 4 + 20000 | 8 + 30000 | 12 + 40000 | 16 + 50000 | 20 + 60000 | 24 + 70000 | 28 + 80000 | 32 + 90000 | 36 + 100000 | 40 +(10 rows) + +drop function forc01(); +-- fail because cursor has no query bound to it +create or replace function forc_bad() returns void as $$ +declare + c refcursor; +begin + for r in c loop + raise notice '%', r.i; + end loop; +end; +$$ language plpgsql; +ERROR: cursor FOR loop must use a bound cursor variable +LINE 5: for r in c loop + ^ +-- test RETURN QUERY EXECUTE +create or replace function return_dquery() +returns setof int as $$ +begin + return query execute 'select * from (values(10),(20)) f'; + return query execute 'select * from (values($1),($2)) f' using 40,50; +end; +$$ language plpgsql; +select * from return_dquery(); + return_dquery +--------------- + 10 + 20 + 40 + 50 +(4 rows) + +drop function return_dquery(); +-- test RETURN QUERY with dropped columns +create table tabwithcols(a int, b int, c int, d int); +insert into tabwithcols values(10,20,30,40),(50,60,70,80); +create or replace function returnqueryf() +returns setof tabwithcols as $$ +begin + return query select * from tabwithcols; + return query execute 'select * from tabwithcols'; +end; +$$ language plpgsql; +select * from returnqueryf(); + a | b | c | d +----+----+----+---- + 10 | 20 | 30 | 40 + 50 | 60 | 70 | 80 + 10 | 20 | 30 | 40 + 50 | 60 | 70 | 80 +(4 rows) + +alter table tabwithcols drop column b; +select * from returnqueryf(); + a | c | d +----+----+---- + 10 | 30 | 40 + 50 | 70 | 80 + 10 | 30 | 40 + 50 | 70 | 80 +(4 rows) + +alter table tabwithcols drop column d; +select * from returnqueryf(); + a | c +----+---- + 10 | 30 + 50 | 70 + 10 | 30 + 50 | 70 +(4 rows) + +alter table tabwithcols add column d int; +select * from returnqueryf(); + a | c | d +----+----+--- + 10 | 30 | + 50 | 70 | + 10 | 30 | + 50 | 70 | +(4 rows) + +drop function returnqueryf(); +drop table tabwithcols; +-- +-- Tests for composite-type results +-- +create type compostype as (x int, y varchar); +-- test: use of variable of composite type in return statement +create or replace function compos() returns compostype as $$ +declare + v compostype; +begin + v := (1, 'hello'); + return v; +end; +$$ language plpgsql; +select compos(); + compos +----------- + (1,hello) +(1 row) + +-- test: use of variable of record type in return statement +create or replace function compos() returns compostype as $$ +declare + v record; +begin + v := (1, 'hello'::varchar); + return v; +end; +$$ language plpgsql; +select compos(); + compos +----------- + (1,hello) +(1 row) + +-- test: use of row expr in return statement +create or replace function compos() returns compostype as $$ +begin + return (1, 'hello'::varchar); +end; +$$ language plpgsql; +select compos(); + compos +----------- + (1,hello) +(1 row) + +-- this does not work currently (no implicit casting) +create or replace function compos() returns compostype as $$ +begin + return (1, 'hello'); +end; +$$ language plpgsql; +select compos(); +ERROR: returned record type does not match expected record type +DETAIL: Returned type unknown does not match expected type character varying in column 2. +CONTEXT: PL/pgSQL function compos() while casting return value to function's return type +-- ... but this does +create or replace function compos() returns compostype as $$ +begin + return (1, 'hello')::compostype; +end; +$$ language plpgsql; +select compos(); + compos +----------- + (1,hello) +(1 row) + +drop function compos(); +-- test: return a row expr as record. +create or replace function composrec() returns record as $$ +declare + v record; +begin + v := (1, 'hello'); + return v; +end; +$$ language plpgsql; +select composrec(); + composrec +----------- + (1,hello) +(1 row) + +-- test: return row expr in return statement. +create or replace function composrec() returns record as $$ +begin + return (1, 'hello'); +end; +$$ language plpgsql; +select composrec(); + composrec +----------- + (1,hello) +(1 row) + +drop function composrec(); +-- test: row expr in RETURN NEXT statement. +create or replace function compos() returns setof compostype as $$ +begin + for i in 1..3 + loop + return next (1, 'hello'::varchar); + end loop; + return next null::compostype; + return next (2, 'goodbye')::compostype; +end; +$$ language plpgsql; +select * from compos(); + x | y +---+--------- + 1 | hello + 1 | hello + 1 | hello + | + 2 | goodbye +(5 rows) + +drop function compos(); +-- test: use invalid expr in return statement. +create or replace function compos() returns compostype as $$ +begin + return 1 + 1; +end; +$$ language plpgsql; +select compos(); +ERROR: cannot return non-composite value from function returning composite type +CONTEXT: PL/pgSQL function compos() line 3 at RETURN +-- RETURN variable is a different code path ... +create or replace function compos() returns compostype as $$ +declare x int := 42; +begin + return x; +end; +$$ language plpgsql; +select * from compos(); +ERROR: cannot return non-composite value from function returning composite type +CONTEXT: PL/pgSQL function compos() line 4 at RETURN +drop function compos(); +-- test: invalid use of composite variable in scalar-returning function +create or replace function compos() returns int as $$ +declare + v compostype; +begin + v := (1, 'hello'); + return v; +end; +$$ language plpgsql; +select compos(); +ERROR: invalid input syntax for type integer: "(1,hello)" +CONTEXT: PL/pgSQL function compos() while casting return value to function's return type +-- test: invalid use of composite expression in scalar-returning function +create or replace function compos() returns int as $$ +begin + return (1, 'hello')::compostype; +end; +$$ language plpgsql; +select compos(); +ERROR: invalid input syntax for type integer: "(1,hello)" +CONTEXT: PL/pgSQL function compos() while casting return value to function's return type +drop function compos(); +drop type compostype; +-- +-- Tests for 8.4's new RAISE features +-- +create or replace function raise_test() returns void as $$ +begin + raise notice '% % %', 1, 2, 3 + using errcode = '55001', detail = 'some detail info', hint = 'some hint'; + raise '% % %', 1, 2, 3 + using errcode = 'division_by_zero', detail = 'some detail info'; +end; +$$ language plpgsql; +select raise_test(); +NOTICE: 1 2 3 +DETAIL: some detail info +HINT: some hint +ERROR: 1 2 3 +DETAIL: some detail info +CONTEXT: PL/pgSQL function raise_test() line 5 at RAISE +-- Since we can't actually see the thrown SQLSTATE in default psql output, +-- test it like this; this also tests re-RAISE +create or replace function raise_test() returns void as $$ +begin + raise 'check me' + using errcode = 'division_by_zero', detail = 'some detail info'; + exception + when others then + raise notice 'SQLSTATE: % SQLERRM: %', sqlstate, sqlerrm; + raise; +end; +$$ language plpgsql; +select raise_test(); +NOTICE: SQLSTATE: 22012 SQLERRM: check me +ERROR: check me +DETAIL: some detail info +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +create or replace function raise_test() returns void as $$ +begin + raise 'check me' + using errcode = '1234F', detail = 'some detail info'; + exception + when others then + raise notice 'SQLSTATE: % SQLERRM: %', sqlstate, sqlerrm; + raise; +end; +$$ language plpgsql; +select raise_test(); +NOTICE: SQLSTATE: 1234F SQLERRM: check me +ERROR: check me +DETAIL: some detail info +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +-- SQLSTATE specification in WHEN +create or replace function raise_test() returns void as $$ +begin + raise 'check me' + using errcode = '1234F', detail = 'some detail info'; + exception + when sqlstate '1234F' then + raise notice 'SQLSTATE: % SQLERRM: %', sqlstate, sqlerrm; + raise; +end; +$$ language plpgsql; +select raise_test(); +NOTICE: SQLSTATE: 1234F SQLERRM: check me +ERROR: check me +DETAIL: some detail info +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +create or replace function raise_test() returns void as $$ +begin + raise division_by_zero using detail = 'some detail info'; + exception + when others then + raise notice 'SQLSTATE: % SQLERRM: %', sqlstate, sqlerrm; + raise; +end; +$$ language plpgsql; +select raise_test(); +NOTICE: SQLSTATE: 22012 SQLERRM: division_by_zero +ERROR: division_by_zero +DETAIL: some detail info +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +create or replace function raise_test() returns void as $$ +begin + raise division_by_zero; +end; +$$ language plpgsql; +select raise_test(); +ERROR: division_by_zero +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +create or replace function raise_test() returns void as $$ +begin + raise sqlstate '1234F'; +end; +$$ language plpgsql; +select raise_test(); +ERROR: 1234F +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +create or replace function raise_test() returns void as $$ +begin + raise division_by_zero using message = 'custom' || ' message'; +end; +$$ language plpgsql; +select raise_test(); +ERROR: custom message +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +create or replace function raise_test() returns void as $$ +begin + raise using message = 'custom' || ' message', errcode = '22012'; +end; +$$ language plpgsql; +select raise_test(); +ERROR: custom message +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +-- conflict on message +create or replace function raise_test() returns void as $$ +begin + raise notice 'some message' using message = 'custom' || ' message', errcode = '22012'; +end; +$$ language plpgsql; +select raise_test(); +ERROR: RAISE option already specified: MESSAGE +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +-- conflict on errcode +create or replace function raise_test() returns void as $$ +begin + raise division_by_zero using message = 'custom' || ' message', errcode = '22012'; +end; +$$ language plpgsql; +select raise_test(); +ERROR: RAISE option already specified: ERRCODE +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +-- nothing to re-RAISE +create or replace function raise_test() returns void as $$ +begin + raise; +end; +$$ language plpgsql; +select raise_test(); +ERROR: RAISE without parameters cannot be used outside an exception handler +CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE +-- test access to exception data +create function zero_divide() returns int as $$ +declare v int := 0; +begin + return 10 / v; +end; +$$ language plpgsql; +create or replace function raise_test() returns void as $$ +begin + raise exception 'custom exception' + using detail = 'some detail of custom exception', + hint = 'some hint related to custom exception'; +end; +$$ language plpgsql; +create function stacked_diagnostics_test() returns void as $$ +declare _sqlstate text; + _message text; + _context text; +begin + perform zero_divide(); +exception when others then + get stacked diagnostics + _sqlstate = returned_sqlstate, + _message = message_text, + _context = pg_exception_context; + raise notice 'sqlstate: %, message: %, context: [%]', + _sqlstate, _message, replace(_context, E'\n', ' <- '); +end; +$$ language plpgsql; +select stacked_diagnostics_test(); +NOTICE: sqlstate: 22012, message: division by zero, context: [PL/pgSQL function zero_divide() line 4 at RETURN <- SQL statement "SELECT zero_divide()" <- PL/pgSQL function stacked_diagnostics_test() line 6 at PERFORM] + stacked_diagnostics_test +-------------------------- + +(1 row) + +create or replace function stacked_diagnostics_test() returns void as $$ +declare _detail text; + _hint text; + _message text; +begin + perform raise_test(); +exception when others then + get stacked diagnostics + _message = message_text, + _detail = pg_exception_detail, + _hint = pg_exception_hint; + raise notice 'message: %, detail: %, hint: %', _message, _detail, _hint; +end; +$$ language plpgsql; +select stacked_diagnostics_test(); +NOTICE: message: custom exception, detail: some detail of custom exception, hint: some hint related to custom exception + stacked_diagnostics_test +-------------------------- + +(1 row) + +-- fail, cannot use stacked diagnostics statement outside handler +create or replace function stacked_diagnostics_test() returns void as $$ +declare _detail text; + _hint text; + _message text; +begin + get stacked diagnostics + _message = message_text, + _detail = pg_exception_detail, + _hint = pg_exception_hint; + raise notice 'message: %, detail: %, hint: %', _message, _detail, _hint; +end; +$$ language plpgsql; +select stacked_diagnostics_test(); +ERROR: GET STACKED DIAGNOSTICS cannot be used outside an exception handler +CONTEXT: PL/pgSQL function stacked_diagnostics_test() line 6 at GET STACKED DIAGNOSTICS +drop function zero_divide(); +drop function stacked_diagnostics_test(); +-- check cases where implicit SQLSTATE variable could be confused with +-- SQLSTATE as a keyword, cf bug #5524 +create or replace function raise_test() returns void as $$ +begin + perform 1/0; +exception + when sqlstate '22012' then + raise notice using message = sqlstate; + raise sqlstate '22012' using message = 'substitute message'; +end; +$$ language plpgsql; +select raise_test(); +NOTICE: 22012 +ERROR: substitute message +CONTEXT: PL/pgSQL function raise_test() line 7 at RAISE +drop function raise_test(); +-- test passing column_name, constraint_name, datatype_name, table_name +-- and schema_name error fields +create or replace function stacked_diagnostics_test() returns void as $$ +declare _column_name text; + _constraint_name text; + _datatype_name text; + _table_name text; + _schema_name text; +begin + raise exception using + column = '>>some column name<<', + constraint = '>>some constraint name<<', + datatype = '>>some datatype name<<', + table = '>>some table name<<', + schema = '>>some schema name<<'; +exception when others then + get stacked diagnostics + _column_name = column_name, + _constraint_name = constraint_name, + _datatype_name = pg_datatype_name, + _table_name = table_name, + _schema_name = schema_name; + raise notice 'column %, constraint %, type %, table %, schema %', + _column_name, _constraint_name, _datatype_name, _table_name, _schema_name; +end; +$$ language plpgsql; +select stacked_diagnostics_test(); +NOTICE: column >>some column name<<, constraint >>some constraint name<<, type >>some datatype name<<, table >>some table name<<, schema >>some schema name<< + stacked_diagnostics_test +-------------------------- + +(1 row) + +drop function stacked_diagnostics_test(); +-- test variadic functions +create or replace function vari(variadic int[]) +returns void as $$ +begin + for i in array_lower($1,1)..array_upper($1,1) loop + raise notice '%', $1[i]; + end loop; end; +$$ language plpgsql; +select vari(1,2,3,4,5); +NOTICE: 1 +NOTICE: 2 +NOTICE: 3 +NOTICE: 4 +NOTICE: 5 + vari +------ + +(1 row) + +select vari(3,4,5); +NOTICE: 3 +NOTICE: 4 +NOTICE: 5 + vari +------ + +(1 row) + +select vari(variadic array[5,6,7]); +NOTICE: 5 +NOTICE: 6 +NOTICE: 7 + vari +------ + +(1 row) + +drop function vari(int[]); +-- coercion test +create or replace function pleast(variadic numeric[]) +returns numeric as $$ +declare aux numeric = $1[array_lower($1,1)]; +begin + for i in array_lower($1,1)+1..array_upper($1,1) loop + if $1[i] < aux then aux := $1[i]; end if; + end loop; + return aux; +end; +$$ language plpgsql immutable strict; +select pleast(10,1,2,3,-16); + pleast +-------- + -16 +(1 row) + +select pleast(10.2,2.2,-1.1); + pleast +-------- + -1.1 +(1 row) + +select pleast(10.2,10, -20); + pleast +-------- + -20 +(1 row) + +select pleast(10,20, -1.0); + pleast +-------- + -1.0 +(1 row) + +-- in case of conflict, non-variadic version is preferred +create or replace function pleast(numeric) +returns numeric as $$ +begin + raise notice 'non-variadic function called'; + return $1; +end; +$$ language plpgsql immutable strict; +select pleast(10); +NOTICE: non-variadic function called + pleast +-------- + 10 +(1 row) + +drop function pleast(numeric[]); +drop function pleast(numeric); +-- test table functions +create function tftest(int) returns table(a int, b int) as $$ +begin + return query select $1, $1+i from generate_series(1,5) g(i); +end; +$$ language plpgsql immutable strict; +select * from tftest(10); + a | b +----+---- + 10 | 11 + 10 | 12 + 10 | 13 + 10 | 14 + 10 | 15 +(5 rows) + +create or replace function tftest(a1 int) returns table(a int, b int) as $$ +begin + a := a1; b := a1 + 1; + return next; + a := a1 * 10; b := a1 * 10 + 1; + return next; +end; +$$ language plpgsql immutable strict; +select * from tftest(10); + a | b +-----+----- + 10 | 11 + 100 | 101 +(2 rows) + +drop function tftest(int); +create function rttest() +returns setof int as $$ +declare rc int; +begin + return query values(10),(20); + get diagnostics rc = row_count; + raise notice '% %', found, rc; + return query select * from (values(10),(20)) f(a) where false; + get diagnostics rc = row_count; + raise notice '% %', found, rc; + return query execute 'values(10),(20)'; + get diagnostics rc = row_count; + raise notice '% %', found, rc; + return query execute 'select * from (values(10),(20)) f(a) where false'; + get diagnostics rc = row_count; + raise notice '% %', found, rc; +end; +$$ language plpgsql; +select * from rttest(); +NOTICE: t 2 +NOTICE: f 0 +NOTICE: t 2 +NOTICE: f 0 + rttest +-------- + 10 + 20 + 10 + 20 +(4 rows) + +-- check some error cases, too +create or replace function rttest() +returns setof int as $$ +begin + return query select 10 into no_such_table; +end; +$$ language plpgsql; +select * from rttest(); +ERROR: SELECT INTO query does not return tuples +CONTEXT: SQL statement "select 10 into no_such_table" +PL/pgSQL function rttest() line 3 at RETURN QUERY +create or replace function rttest() +returns setof int as $$ +begin + return query execute 'select 10 into no_such_table'; +end; +$$ language plpgsql; +select * from rttest(); +ERROR: SELECT INTO query does not return tuples +CONTEXT: SQL statement "select 10 into no_such_table" +PL/pgSQL function rttest() line 3 at RETURN QUERY +select * from no_such_table; +ERROR: relation "no_such_table" does not exist +LINE 1: select * from no_such_table; + ^ +drop function rttest(); +-- Test for proper cleanup at subtransaction exit. This example +-- exposed a bug in PG 8.2. +CREATE FUNCTION leaker_1(fail BOOL) RETURNS INTEGER AS $$ +DECLARE + v_var INTEGER; +BEGIN + BEGIN + v_var := (leaker_2(fail)).error_code; + EXCEPTION + WHEN others THEN RETURN 0; + END; + RETURN 1; +END; +$$ LANGUAGE plpgsql; +CREATE FUNCTION leaker_2(fail BOOL, OUT error_code INTEGER, OUT new_id INTEGER) + RETURNS RECORD AS $$ +BEGIN + IF fail THEN + RAISE EXCEPTION 'fail ...'; + END IF; + error_code := 1; + new_id := 1; + RETURN; +END; +$$ LANGUAGE plpgsql; +SELECT * FROM leaker_1(false); + leaker_1 +---------- + 1 +(1 row) + +SELECT * FROM leaker_1(true); + leaker_1 +---------- + 0 +(1 row) + +DROP FUNCTION leaker_1(bool); +DROP FUNCTION leaker_2(bool); +-- Test for appropriate cleanup of non-simple expression evaluations +-- (bug in all versions prior to August 2010) +CREATE FUNCTION nonsimple_expr_test() RETURNS text[] AS $$ +DECLARE + arr text[]; + lr text; + i integer; +BEGIN + arr := array[array['foo','bar'], array['baz', 'quux']]; + lr := 'fool'; + i := 1; + -- use sub-SELECTs to make expressions non-simple + arr[(SELECT i)][(SELECT i+1)] := (SELECT lr); + RETURN arr; +END; +$$ LANGUAGE plpgsql; +SELECT nonsimple_expr_test(); + nonsimple_expr_test +------------------------- + {{foo,fool},{baz,quux}} +(1 row) + +DROP FUNCTION nonsimple_expr_test(); +CREATE FUNCTION nonsimple_expr_test() RETURNS integer AS $$ +declare + i integer NOT NULL := 0; +begin + begin + i := (SELECT NULL::integer); -- should throw error + exception + WHEN OTHERS THEN + i := (SELECT 1::integer); + end; + return i; +end; +$$ LANGUAGE plpgsql; +SELECT nonsimple_expr_test(); + nonsimple_expr_test +--------------------- + 1 +(1 row) + +DROP FUNCTION nonsimple_expr_test(); +-- +-- Test cases involving recursion and error recovery in simple expressions +-- (bugs in all versions before October 2010). The problems are most +-- easily exposed by mutual recursion between plpgsql and sql functions. +-- +create function recurse(float8) returns float8 as +$$ +begin + if ($1 > 0) then + return sql_recurse($1 - 1); + else + return $1; + end if; +end; +$$ language plpgsql; +-- "limit" is to prevent this from being inlined +create function sql_recurse(float8) returns float8 as +$$ select recurse($1) limit 1; $$ language sql; +select recurse(10); + recurse +--------- + 0 +(1 row) + +create function error1(text) returns text language sql as +$$ SELECT relname::text FROM pg_class c WHERE c.oid = $1::regclass $$; +create function error2(p_name_table text) returns text language plpgsql as $$ +begin + return error1(p_name_table); +end$$; +BEGIN; +create table public.stuffs (stuff text); +SAVEPOINT a; +select error2('nonexistent.stuffs'); +ERROR: schema "nonexistent" does not exist +CONTEXT: SQL function "error1" statement 1 +PL/pgSQL function error2(text) line 3 at RETURN +ROLLBACK TO a; +select error2('public.stuffs'); + error2 +-------- + stuffs +(1 row) + +rollback; +drop function error2(p_name_table text); +drop function error1(text); +-- Test for proper handling of cast-expression caching +create function sql_to_date(integer) returns date as $$ +select $1::text::date +$$ language sql immutable strict; +create cast (integer as date) with function sql_to_date(integer) as assignment; +create function cast_invoker(integer) returns date as $$ +begin + return $1; +end$$ language plpgsql; +select cast_invoker(20150717); + cast_invoker +-------------- + 07-17-2015 +(1 row) + +select cast_invoker(20150718); -- second call crashed in pre-release 9.5 + cast_invoker +-------------- + 07-18-2015 +(1 row) + +begin; +select cast_invoker(20150717); + cast_invoker +-------------- + 07-17-2015 +(1 row) + +select cast_invoker(20150718); + cast_invoker +-------------- + 07-18-2015 +(1 row) + +savepoint s1; +select cast_invoker(20150718); + cast_invoker +-------------- + 07-18-2015 +(1 row) + +select cast_invoker(-1); -- fails +ERROR: invalid input syntax for type date: "-1" +CONTEXT: SQL function "sql_to_date" statement 1 +PL/pgSQL function cast_invoker(integer) while casting return value to function's return type +rollback to savepoint s1; +select cast_invoker(20150719); + cast_invoker +-------------- + 07-19-2015 +(1 row) + +select cast_invoker(20150720); + cast_invoker +-------------- + 07-20-2015 +(1 row) + +commit; +drop function cast_invoker(integer); +drop function sql_to_date(integer) cascade; +NOTICE: drop cascades to cast from integer to date +-- Test handling of cast cache inside DO blocks +-- (to check the original crash case, this must be a cast not previously +-- used in this session) +begin; +do $$ declare x text[]; begin x := '{1.23, 4.56}'::numeric[]; end $$; +do $$ declare x text[]; begin x := '{1.23, 4.56}'::numeric[]; end $$; +end; +-- Test for consistent reporting of error context +create function fail() returns int language plpgsql as $$ +begin + return 1/0; +end +$$; +select fail(); +ERROR: division by zero +CONTEXT: SQL expression "1/0" +PL/pgSQL function fail() line 3 at RETURN +select fail(); +ERROR: division by zero +CONTEXT: SQL expression "1/0" +PL/pgSQL function fail() line 3 at RETURN +drop function fail(); +-- Test handling of string literals. +set standard_conforming_strings = off; +create or replace function strtest() returns text as $$ +begin + raise notice 'foo\\bar\041baz'; + return 'foo\\bar\041baz'; +end +$$ language plpgsql; +WARNING: nonstandard use of \\ in a string literal +LINE 3: raise notice 'foo\\bar\041baz'; + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +WARNING: nonstandard use of \\ in a string literal +LINE 4: return 'foo\\bar\041baz'; + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +WARNING: nonstandard use of \\ in a string literal +LINE 4: return 'foo\\bar\041baz'; + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +select strtest(); +NOTICE: foo\bar!baz +WARNING: nonstandard use of \\ in a string literal +LINE 1: 'foo\\bar\041baz' + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +QUERY: 'foo\\bar\041baz' + strtest +------------- + foo\bar!baz +(1 row) + +create or replace function strtest() returns text as $$ +begin + raise notice E'foo\\bar\041baz'; + return E'foo\\bar\041baz'; +end +$$ language plpgsql; +select strtest(); +NOTICE: foo\bar!baz + strtest +------------- + foo\bar!baz +(1 row) + +set standard_conforming_strings = on; +create or replace function strtest() returns text as $$ +begin + raise notice 'foo\\bar\041baz\'; + return 'foo\\bar\041baz\'; +end +$$ language plpgsql; +select strtest(); +NOTICE: foo\\bar\041baz\ + strtest +------------------ + foo\\bar\041baz\ +(1 row) + +create or replace function strtest() returns text as $$ +begin + raise notice E'foo\\bar\041baz'; + return E'foo\\bar\041baz'; +end +$$ language plpgsql; +select strtest(); +NOTICE: foo\bar!baz + strtest +------------- + foo\bar!baz +(1 row) + +drop function strtest(); +-- Test anonymous code blocks. +DO $$ +DECLARE r record; +BEGIN + FOR r IN SELECT rtrim(roomno) AS roomno, comment FROM Room ORDER BY roomno + LOOP + RAISE NOTICE '%, %', r.roomno, r.comment; + END LOOP; +END$$; +NOTICE: 001, Entrance +NOTICE: 002, Office +NOTICE: 003, Office +NOTICE: 004, Technical +NOTICE: 101, Office +NOTICE: 102, Conference +NOTICE: 103, Restroom +NOTICE: 104, Technical +NOTICE: 105, Office +NOTICE: 106, Office +-- these are to check syntax error reporting +DO LANGUAGE plpgsql $$begin return 1; end$$; +ERROR: RETURN cannot have a parameter in function returning void +LINE 1: DO LANGUAGE plpgsql $$begin return 1; end$$; + ^ +DO $$ +DECLARE r record; +BEGIN + FOR r IN SELECT rtrim(roomno) AS roomno, foo FROM Room ORDER BY roomno + LOOP + RAISE NOTICE '%, %', r.roomno, r.comment; + END LOOP; +END$$; +ERROR: column "foo" does not exist +LINE 1: SELECT rtrim(roomno) AS roomno, foo FROM Room ORDER BY roomn... + ^ +QUERY: SELECT rtrim(roomno) AS roomno, foo FROM Room ORDER BY roomno +CONTEXT: PL/pgSQL function inline_code_block line 4 at FOR over SELECT rows +-- Check handling of errors thrown from/into anonymous code blocks. +do $outer$ +begin + for i in 1..10 loop + begin + execute $ex$ + do $$ + declare x int = 0; + begin + x := 1 / x; + end; + $$; + $ex$; + exception when division_by_zero then + raise notice 'caught division by zero'; + end; + end loop; +end; +$outer$; +NOTICE: caught division by zero +NOTICE: caught division by zero +NOTICE: caught division by zero +NOTICE: caught division by zero +NOTICE: caught division by zero +NOTICE: caught division by zero +NOTICE: caught division by zero +NOTICE: caught division by zero +NOTICE: caught division by zero +NOTICE: caught division by zero +-- Check variable scoping -- a var is not available in its own or prior +-- default expressions. +create function scope_test() returns int as $$ +declare x int := 42; +begin + declare y int := x + 1; + x int := x + 2; + begin + return x * 100 + y; + end; +end; +$$ language plpgsql; +select scope_test(); + scope_test +------------ + 4443 +(1 row) + +drop function scope_test(); +-- Check handling of conflicts between plpgsql vars and table columns. +set plpgsql.variable_conflict = error; +create function conflict_test() returns setof int8_tbl as $$ +declare r record; + q1 bigint := 42; +begin + for r in select q1,q2 from int8_tbl loop + return next r; + end loop; +end; +$$ language plpgsql; +select * from conflict_test(); +ERROR: column reference "q1" is ambiguous +LINE 1: select q1,q2 from int8_tbl + ^ +DETAIL: It could refer to either a PL/pgSQL variable or a table column. +QUERY: select q1,q2 from int8_tbl +CONTEXT: PL/pgSQL function conflict_test() line 5 at FOR over SELECT rows +create or replace function conflict_test() returns setof int8_tbl as $$ +#variable_conflict use_variable +declare r record; + q1 bigint := 42; +begin + for r in select q1,q2 from int8_tbl loop + return next r; + end loop; +end; +$$ language plpgsql; +select * from conflict_test(); + q1 | q2 +----+------------------- + 42 | 456 + 42 | 4567890123456789 + 42 | 123 + 42 | 4567890123456789 + 42 | -4567890123456789 +(5 rows) + +create or replace function conflict_test() returns setof int8_tbl as $$ +#variable_conflict use_column +declare r record; + q1 bigint := 42; +begin + for r in select q1,q2 from int8_tbl loop + return next r; + end loop; +end; +$$ language plpgsql; +select * from conflict_test(); + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +drop function conflict_test(); +-- Check that an unreserved keyword can be used as a variable name +create function unreserved_test() returns int as $$ +declare + forward int := 21; +begin + forward := forward * 2; + return forward; +end +$$ language plpgsql; +select unreserved_test(); + unreserved_test +----------------- + 42 +(1 row) + +create or replace function unreserved_test() returns int as $$ +declare + return int := 42; +begin + return := return + 1; + return return; +end +$$ language plpgsql; +select unreserved_test(); + unreserved_test +----------------- + 43 +(1 row) + +create or replace function unreserved_test() returns int as $$ +declare + comment int := 21; +begin + comment := comment * 2; + comment on function unreserved_test() is 'this is a test'; + return comment; +end +$$ language plpgsql; +select unreserved_test(); + unreserved_test +----------------- + 42 +(1 row) + +select obj_description('unreserved_test()'::regprocedure, 'pg_proc'); + obj_description +----------------- + this is a test +(1 row) + +drop function unreserved_test(); +-- +-- Test FOREACH over arrays +-- +create function foreach_test(anyarray) +returns void as $$ +declare x int; +begin + foreach x in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; +select foreach_test(ARRAY[1,2,3,4]); +NOTICE: 1 +NOTICE: 2 +NOTICE: 3 +NOTICE: 4 + foreach_test +-------------- + +(1 row) + +select foreach_test(ARRAY[[1,2],[3,4]]); +NOTICE: 1 +NOTICE: 2 +NOTICE: 3 +NOTICE: 4 + foreach_test +-------------- + +(1 row) + +create or replace function foreach_test(anyarray) +returns void as $$ +declare x int; +begin + foreach x slice 1 in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; +-- should fail +select foreach_test(ARRAY[1,2,3,4]); +ERROR: FOREACH ... SLICE loop variable must be of an array type +CONTEXT: PL/pgSQL function foreach_test(anyarray) line 4 at FOREACH over array +select foreach_test(ARRAY[[1,2],[3,4]]); +ERROR: FOREACH ... SLICE loop variable must be of an array type +CONTEXT: PL/pgSQL function foreach_test(anyarray) line 4 at FOREACH over array +create or replace function foreach_test(anyarray) +returns void as $$ +declare x int[]; +begin + foreach x slice 1 in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; +select foreach_test(ARRAY[1,2,3,4]); +NOTICE: {1,2,3,4} + foreach_test +-------------- + +(1 row) + +select foreach_test(ARRAY[[1,2],[3,4]]); +NOTICE: {1,2} +NOTICE: {3,4} + foreach_test +-------------- + +(1 row) + +-- higher level of slicing +create or replace function foreach_test(anyarray) +returns void as $$ +declare x int[]; +begin + foreach x slice 2 in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; +-- should fail +select foreach_test(ARRAY[1,2,3,4]); +ERROR: slice dimension (2) is out of the valid range 0..1 +CONTEXT: PL/pgSQL function foreach_test(anyarray) line 4 at FOREACH over array +-- ok +select foreach_test(ARRAY[[1,2],[3,4]]); +NOTICE: {{1,2},{3,4}} + foreach_test +-------------- + +(1 row) + +select foreach_test(ARRAY[[[1,2]],[[3,4]]]); +NOTICE: {{1,2}} +NOTICE: {{3,4}} + foreach_test +-------------- + +(1 row) + +create type xy_tuple AS (x int, y int); +-- iteration over array of records +create or replace function foreach_test(anyarray) +returns void as $$ +declare r record; +begin + foreach r in array $1 + loop + raise notice '%', r; + end loop; + end; +$$ language plpgsql; +select foreach_test(ARRAY[(10,20),(40,69),(35,78)]::xy_tuple[]); +NOTICE: (10,20) +NOTICE: (40,69) +NOTICE: (35,78) + foreach_test +-------------- + +(1 row) + +select foreach_test(ARRAY[[(10,20),(40,69)],[(35,78),(88,76)]]::xy_tuple[]); +NOTICE: (10,20) +NOTICE: (40,69) +NOTICE: (35,78) +NOTICE: (88,76) + foreach_test +-------------- + +(1 row) + +create or replace function foreach_test(anyarray) +returns void as $$ +declare x int; y int; +begin + foreach x, y in array $1 + loop + raise notice 'x = %, y = %', x, y; + end loop; + end; +$$ language plpgsql; +select foreach_test(ARRAY[(10,20),(40,69),(35,78)]::xy_tuple[]); +NOTICE: x = 10, y = 20 +NOTICE: x = 40, y = 69 +NOTICE: x = 35, y = 78 + foreach_test +-------------- + +(1 row) + +select foreach_test(ARRAY[[(10,20),(40,69)],[(35,78),(88,76)]]::xy_tuple[]); +NOTICE: x = 10, y = 20 +NOTICE: x = 40, y = 69 +NOTICE: x = 35, y = 78 +NOTICE: x = 88, y = 76 + foreach_test +-------------- + +(1 row) + +-- slicing over array of composite types +create or replace function foreach_test(anyarray) +returns void as $$ +declare x xy_tuple[]; +begin + foreach x slice 1 in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; +select foreach_test(ARRAY[(10,20),(40,69),(35,78)]::xy_tuple[]); +NOTICE: {"(10,20)","(40,69)","(35,78)"} + foreach_test +-------------- + +(1 row) + +select foreach_test(ARRAY[[(10,20),(40,69)],[(35,78),(88,76)]]::xy_tuple[]); +NOTICE: {"(10,20)","(40,69)"} +NOTICE: {"(35,78)","(88,76)"} + foreach_test +-------------- + +(1 row) + +drop function foreach_test(anyarray); +drop type xy_tuple; +-- +-- Assorted tests for array subscript assignment +-- +create temp table rtype (id int, ar text[]); +create function arrayassign1() returns text[] language plpgsql as $$ +declare + r record; +begin + r := row(12, '{foo,bar,baz}')::rtype; + r.ar[2] := 'replace'; + return r.ar; +end$$; +select arrayassign1(); + arrayassign1 +------------------- + {foo,replace,baz} +(1 row) + +select arrayassign1(); -- try again to exercise internal caching + arrayassign1 +------------------- + {foo,replace,baz} +(1 row) + +create domain orderedarray as int[2] + constraint sorted check (value[1] < value[2]); +select '{1,2}'::orderedarray; + orderedarray +-------------- + {1,2} +(1 row) + +select '{2,1}'::orderedarray; -- fail +ERROR: value for domain orderedarray violates check constraint "sorted" +create function testoa(x1 int, x2 int, x3 int) returns orderedarray +language plpgsql as $$ +declare res orderedarray; +begin + res := array[x1, x2]; + res[2] := x3; + return res; +end$$; +select testoa(1,2,3); + testoa +-------- + {1,3} +(1 row) + +select testoa(1,2,3); -- try again to exercise internal caching + testoa +-------- + {1,3} +(1 row) + +select testoa(2,1,3); -- fail at initial assign +ERROR: value for domain orderedarray violates check constraint "sorted" +CONTEXT: PL/pgSQL function testoa(integer,integer,integer) line 4 at assignment +select testoa(1,2,1); -- fail at update +ERROR: value for domain orderedarray violates check constraint "sorted" +CONTEXT: PL/pgSQL function testoa(integer,integer,integer) line 5 at assignment +drop function arrayassign1(); +drop function testoa(x1 int, x2 int, x3 int); +-- +-- Test handling of expanded arrays +-- +create function returns_rw_array(int) returns int[] +language plpgsql as $$ + declare r int[]; + begin r := array[$1, $1]; return r; end; +$$ stable; +create function consumes_rw_array(int[]) returns int +language plpgsql as $$ + begin return $1[1]; end; +$$ stable; +select consumes_rw_array(returns_rw_array(42)); + consumes_rw_array +------------------- + 42 +(1 row) + +-- bug #14174 +explain (verbose, costs off) +select i, a from + (select returns_rw_array(1) as a offset 0) ss, + lateral consumes_rw_array(a) i; + QUERY PLAN +---------------------------------------------------------------- + Nested Loop + Output: i.i, ('{1,1}'::integer[]) + -> Result + Output: '{1,1}'::integer[] + -> Function Scan on public.consumes_rw_array i + Output: i.i + Function Call: consumes_rw_array(('{1,1}'::integer[])) + Optimizer: Postgres query optimizer +(8 rows) + +select i, a from + (select returns_rw_array(1) as a offset 0) ss, + lateral consumes_rw_array(a) i; + i | a +---+------- + 1 | {1,1} +(1 row) + +explain (verbose, costs off) +select consumes_rw_array(a), a from returns_rw_array(1) a; + QUERY PLAN +--------------------------------------------------------------------- + Result + Output: consumes_rw_array('{1,1}'::integer[]), '{1,1}'::integer[] + Optimizer: Postgres query optimizer +(3 rows) + +select consumes_rw_array(a), a from returns_rw_array(1) a; + consumes_rw_array | a +-------------------+------- + 1 | {1,1} +(1 row) + +explain (verbose, costs off) +select consumes_rw_array(a), a from + (values (returns_rw_array(1)), (returns_rw_array(2))) v(a); + QUERY PLAN +--------------------------------------------------------------------- + Values Scan on "*VALUES*" + Output: consumes_rw_array("*VALUES*".column1), "*VALUES*".column1 + Optimizer: Postgres query optimizer +(3 rows) + +select consumes_rw_array(a), a from + (values (returns_rw_array(1)), (returns_rw_array(2))) v(a); + consumes_rw_array | a +-------------------+------- + 1 | {1,1} + 2 | {2,2} +(2 rows) + +do $$ +declare a int[] := array[1,2]; +begin + a := a || 3; + raise notice 'a = %', a; +end$$; +NOTICE: a = {1,2,3} +-- +-- Test access to call stack +-- +create function inner_func(int) +returns int as $$ +declare _context text; +begin + get diagnostics _context = pg_context; + raise notice '***%***', _context; + -- lets do it again, just for fun.. + get diagnostics _context = pg_context; + raise notice '***%***', _context; + raise notice 'lets make sure we didnt break anything'; + return 2 * $1; +end; +$$ language plpgsql; +create or replace function outer_func(int) +returns int as $$ +declare + myresult int; +begin + raise notice 'calling down into inner_func()'; + myresult := inner_func($1); + raise notice 'inner_func() done'; + return myresult; +end; +$$ language plpgsql; +create or replace function outer_outer_func(int) +returns int as $$ +declare + myresult int; +begin + raise notice 'calling down into outer_func()'; + myresult := outer_func($1); + raise notice 'outer_func() done'; + return myresult; +end; +$$ language plpgsql; +select outer_outer_func(10); +NOTICE: calling down into outer_func() +NOTICE: calling down into inner_func() +NOTICE: ***PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS +PL/pgSQL function outer_func(integer) line 6 at assignment +PL/pgSQL function outer_outer_func(integer) line 6 at assignment*** +NOTICE: ***PL/pgSQL function inner_func(integer) line 7 at GET DIAGNOSTICS +PL/pgSQL function outer_func(integer) line 6 at assignment +PL/pgSQL function outer_outer_func(integer) line 6 at assignment*** +NOTICE: lets make sure we didnt break anything +NOTICE: inner_func() done +NOTICE: outer_func() done + outer_outer_func +------------------ + 20 +(1 row) + +-- repeated call should to work +select outer_outer_func(20); +NOTICE: calling down into outer_func() +NOTICE: calling down into inner_func() +NOTICE: ***PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS +PL/pgSQL function outer_func(integer) line 6 at assignment +PL/pgSQL function outer_outer_func(integer) line 6 at assignment*** +NOTICE: ***PL/pgSQL function inner_func(integer) line 7 at GET DIAGNOSTICS +PL/pgSQL function outer_func(integer) line 6 at assignment +PL/pgSQL function outer_outer_func(integer) line 6 at assignment*** +NOTICE: lets make sure we didnt break anything +NOTICE: inner_func() done +NOTICE: outer_func() done + outer_outer_func +------------------ + 40 +(1 row) + +drop function outer_outer_func(int); +drop function outer_func(int); +drop function inner_func(int); +-- access to call stack from exception +create function inner_func(int) +returns int as $$ +declare + _context text; + sx int := 5; +begin + begin + perform sx / 0; + exception + when division_by_zero then + get diagnostics _context = pg_context; + raise notice '***%***', _context; + end; + + -- lets do it again, just for fun.. + get diagnostics _context = pg_context; + raise notice '***%***', _context; + raise notice 'lets make sure we didnt break anything'; + return 2 * $1; +end; +$$ language plpgsql; +create or replace function outer_func(int) +returns int as $$ +declare + myresult int; +begin + raise notice 'calling down into inner_func()'; + myresult := inner_func($1); + raise notice 'inner_func() done'; + return myresult; +end; +$$ language plpgsql; +create or replace function outer_outer_func(int) +returns int as $$ +declare + myresult int; +begin + raise notice 'calling down into outer_func()'; + myresult := outer_func($1); + raise notice 'outer_func() done'; + return myresult; +end; +$$ language plpgsql; +select outer_outer_func(10); +NOTICE: calling down into outer_func() +NOTICE: calling down into inner_func() +NOTICE: ***PL/pgSQL function inner_func(integer) line 10 at GET DIAGNOSTICS +PL/pgSQL function outer_func(integer) line 6 at assignment +PL/pgSQL function outer_outer_func(integer) line 6 at assignment*** +NOTICE: ***PL/pgSQL function inner_func(integer) line 15 at GET DIAGNOSTICS +PL/pgSQL function outer_func(integer) line 6 at assignment +PL/pgSQL function outer_outer_func(integer) line 6 at assignment*** +NOTICE: lets make sure we didnt break anything +NOTICE: inner_func() done +NOTICE: outer_func() done + outer_outer_func +------------------ + 20 +(1 row) + +-- repeated call should to work +select outer_outer_func(20); +NOTICE: calling down into outer_func() +NOTICE: calling down into inner_func() +NOTICE: ***PL/pgSQL function inner_func(integer) line 10 at GET DIAGNOSTICS +PL/pgSQL function outer_func(integer) line 6 at assignment +PL/pgSQL function outer_outer_func(integer) line 6 at assignment*** +NOTICE: ***PL/pgSQL function inner_func(integer) line 15 at GET DIAGNOSTICS +PL/pgSQL function outer_func(integer) line 6 at assignment +PL/pgSQL function outer_outer_func(integer) line 6 at assignment*** +NOTICE: lets make sure we didnt break anything +NOTICE: inner_func() done +NOTICE: outer_func() done + outer_outer_func +------------------ + 40 +(1 row) + +drop function outer_outer_func(int); +drop function outer_func(int); +drop function inner_func(int); +-- +-- Test ASSERT +-- +do $$ +begin + assert 1=1; -- should succeed +end; +$$; +do $$ +begin + assert 1=0; -- should fail +end; +$$; +ERROR: assertion failed +CONTEXT: PL/pgSQL function inline_code_block line 3 at ASSERT +do $$ +begin + assert NULL; -- should fail +end; +$$; +ERROR: assertion failed +CONTEXT: PL/pgSQL function inline_code_block line 3 at ASSERT +-- check controlling GUC +set plpgsql.check_asserts = off; +do $$ +begin + assert 1=0; -- won't be tested +end; +$$; +reset plpgsql.check_asserts; +-- test custom message +do $$ +declare var text := 'some value'; +begin + assert 1=0, format('assertion failed, var = "%s"', var); +end; +$$; +ERROR: assertion failed, var = "some value" +CONTEXT: PL/pgSQL function inline_code_block line 4 at ASSERT +-- ensure assertions are not trapped by 'others' +do $$ +begin + assert 1=0, 'unhandled assertion'; +exception when others then + null; -- do nothing +end; +$$; +ERROR: unhandled assertion +CONTEXT: PL/pgSQL function inline_code_block line 3 at ASSERT +-- Test use of plpgsql in a domain check constraint (cf. bug #14414) +create function plpgsql_domain_check(val int) returns boolean as $$ +begin return val > 0; end +$$ language plpgsql immutable; +create domain plpgsql_domain as integer check(plpgsql_domain_check(value)); +do $$ +declare v_test plpgsql_domain; +begin + v_test := 1; +end; +$$; +do $$ +declare v_test plpgsql_domain := 1; +begin + v_test := 0; -- fail +end; +$$; +ERROR: value for domain plpgsql_domain violates check constraint "plpgsql_domain_check" +CONTEXT: PL/pgSQL function inline_code_block line 4 at assignment +-- Test handling of expanded array passed to a domain constraint (bug #14472) +create function plpgsql_arr_domain_check(val int[]) returns boolean as $$ +begin return val[1] > 0; end +$$ language plpgsql immutable; +create domain plpgsql_arr_domain as int[] check(plpgsql_arr_domain_check(value)); +do $$ +declare v_test plpgsql_arr_domain; +begin + v_test := array[1]; + v_test := v_test || 2; +end; +$$; +do $$ +declare v_test plpgsql_arr_domain := array[1]; +begin + v_test := 0 || v_test; -- fail +end; +$$; +ERROR: value for domain plpgsql_arr_domain violates check constraint "plpgsql_arr_domain_check" +CONTEXT: PL/pgSQL function inline_code_block line 4 at assignment diff --git a/src/test/singlenode_regress/expected/point.out b/src/test/singlenode_regress/expected/point.out new file mode 100644 index 00000000000..7c3cd090363 --- /dev/null +++ b/src/test/singlenode_regress/expected/point.out @@ -0,0 +1,476 @@ +-- +-- POINT +-- +-- avoid bit-exact output here because operations may not be bit-exact. +SET extra_float_digits = 0; +CREATE TABLE POINT_TBL(f1 point); +INSERT INTO POINT_TBL(f1) VALUES ('(0.0,0.0)'); +ANALYZE POINT_TBL; +INSERT INTO POINT_TBL(f1) VALUES ('(-10.0,0.0)'); +INSERT INTO POINT_TBL(f1) VALUES ('(-3.0,4.0)'); +INSERT INTO POINT_TBL(f1) VALUES ('(5.1, 34.5)'); +INSERT INTO POINT_TBL(f1) VALUES ('(-5.0,-12.0)'); +INSERT INTO POINT_TBL(f1) VALUES ('(1e-300,-1e-300)'); -- To underflow +INSERT INTO POINT_TBL(f1) VALUES ('(1e+300,Inf)'); -- To overflow +INSERT INTO POINT_TBL(f1) VALUES ('(Inf,1e+300)'); -- Transposed +INSERT INTO POINT_TBL(f1) VALUES (' ( Nan , NaN ) '); +-- bad format points +INSERT INTO POINT_TBL(f1) VALUES ('asdfasdf'); +ERROR: invalid input syntax for type point: "asdfasdf" +LINE 1: INSERT INTO POINT_TBL(f1) VALUES ('asdfasdf'); + ^ +INSERT INTO POINT_TBL(f1) VALUES ('10.0,10.0'); +INSERT INTO POINT_TBL(f1) VALUES ('(10.0 10.0)'); +ERROR: invalid input syntax for type point: "(10.0 10.0)" +LINE 1: INSERT INTO POINT_TBL(f1) VALUES ('(10.0 10.0)'); + ^ +INSERT INTO POINT_TBL(f1) VALUES ('(10.0, 10.0) x'); +ERROR: invalid input syntax for type point: "(10.0, 10.0) x" +LINE 1: INSERT INTO POINT_TBL(f1) VALUES ('(10.0, 10.0) x'); + ^ +INSERT INTO POINT_TBL(f1) VALUES ('(10.0,10.0'); +ERROR: invalid input syntax for type point: "(10.0,10.0" +LINE 1: INSERT INTO POINT_TBL(f1) VALUES ('(10.0,10.0'); + ^ +INSERT INTO POINT_TBL(f1) VALUES ('(10.0, 1e+500)'); -- Out of range +ERROR: value out of range: overflow +LINE 1: INSERT INTO POINT_TBL(f1) VALUES ('(10.0, 1e+500)'); + ^ +SELECT * FROM POINT_TBL; + f1 +------------------- + (0,0) + (-10,0) + (-3,4) + (5.1,34.5) + (-5,-12) + (1e-300,-1e-300) + (1e+300,Infinity) + (Infinity,1e+300) + (NaN,NaN) + (10,10) +(10 rows) + +-- left of +SELECT p.* FROM POINT_TBL p WHERE p.f1 << '(0.0, 0.0)'; + f1 +---------- + (-10,0) + (-3,4) + (-5,-12) +(3 rows) + +-- right of +SELECT p.* FROM POINT_TBL p WHERE '(0.0,0.0)' >> p.f1; + f1 +---------- + (-10,0) + (-3,4) + (-5,-12) +(3 rows) + +-- above +SELECT p.* FROM POINT_TBL p WHERE '(0.0,0.0)' |>> p.f1; + f1 +---------- + (-5,-12) +(1 row) + +-- below +SELECT p.* FROM POINT_TBL p WHERE p.f1 <<| '(0.0, 0.0)'; + f1 +---------- + (-5,-12) +(1 row) + +-- equal +SELECT p.* FROM POINT_TBL p WHERE p.f1 ~= '(5.1, 34.5)'; + f1 +------------ + (5.1,34.5) +(1 row) + +-- point in box +SELECT p.* FROM POINT_TBL p + WHERE p.f1 <@ box '(0,0,100,100)'; + f1 +------------ + (0,0) + (5.1,34.5) + (10,10) +(3 rows) + +SELECT p.* FROM POINT_TBL p + WHERE box '(0,0,100,100)' @> p.f1; + f1 +------------ + (0,0) + (5.1,34.5) + (10,10) +(3 rows) + +SELECT p.* FROM POINT_TBL p + WHERE not p.f1 <@ box '(0,0,100,100)'; + f1 +------------------- + (-10,0) + (-3,4) + (-5,-12) + (1e-300,-1e-300) + (1e+300,Infinity) + (Infinity,1e+300) + (NaN,NaN) +(7 rows) + +SELECT p.* FROM POINT_TBL p + WHERE p.f1 <@ path '[(0,0),(-10,0),(-10,10)]'; + f1 +------------------ + (0,0) + (-10,0) + (1e-300,-1e-300) +(3 rows) + +SELECT p.* FROM POINT_TBL p + WHERE not box '(0,0,100,100)' @> p.f1; + f1 +------------------- + (-10,0) + (-3,4) + (-5,-12) + (1e-300,-1e-300) + (1e+300,Infinity) + (Infinity,1e+300) + (NaN,NaN) +(7 rows) + +SELECT p.f1, p.f1 <-> point '(0,0)' AS dist + FROM POINT_TBL p + ORDER BY dist; + f1 | dist +-------------------+---------------------- + (0,0) | 0 + (1e-300,-1e-300) | 1.4142135623731e-300 + (-3,4) | 5 + (-10,0) | 10 + (-5,-12) | 13 + (10,10) | 14.142135623731 + (5.1,34.5) | 34.8749193547455 + (1e+300,Infinity) | Infinity + (Infinity,1e+300) | Infinity + (NaN,NaN) | NaN +(10 rows) + +SELECT p1.f1 AS point1, p2.f1 AS point2, p1.f1 <-> p2.f1 AS dist + FROM POINT_TBL p1, POINT_TBL p2 + ORDER BY dist, p1.f1[0], p2.f1[0]; + point1 | point2 | dist +-------------------+-------------------+---------------------- + (-10,0) | (-10,0) | 0 + (-5,-12) | (-5,-12) | 0 + (-3,4) | (-3,4) | 0 + (0,0) | (0,0) | 0 + (1e-300,-1e-300) | (1e-300,-1e-300) | 0 + (5.1,34.5) | (5.1,34.5) | 0 + (10,10) | (10,10) | 0 + (0,0) | (1e-300,-1e-300) | 1.4142135623731e-300 + (1e-300,-1e-300) | (0,0) | 1.4142135623731e-300 + (-3,4) | (0,0) | 5 + (-3,4) | (1e-300,-1e-300) | 5 + (0,0) | (-3,4) | 5 + (1e-300,-1e-300) | (-3,4) | 5 + (-10,0) | (-3,4) | 8.06225774829855 + (-3,4) | (-10,0) | 8.06225774829855 + (-10,0) | (0,0) | 10 + (-10,0) | (1e-300,-1e-300) | 10 + (0,0) | (-10,0) | 10 + (1e-300,-1e-300) | (-10,0) | 10 + (-10,0) | (-5,-12) | 13 + (-5,-12) | (-10,0) | 13 + (-5,-12) | (0,0) | 13 + (-5,-12) | (1e-300,-1e-300) | 13 + (0,0) | (-5,-12) | 13 + (1e-300,-1e-300) | (-5,-12) | 13 + (0,0) | (10,10) | 14.142135623731 + (1e-300,-1e-300) | (10,10) | 14.142135623731 + (10,10) | (0,0) | 14.142135623731 + (10,10) | (1e-300,-1e-300) | 14.142135623731 + (-3,4) | (10,10) | 14.3178210632764 + (10,10) | (-3,4) | 14.3178210632764 + (-5,-12) | (-3,4) | 16.1245154965971 + (-3,4) | (-5,-12) | 16.1245154965971 + (-10,0) | (10,10) | 22.3606797749979 + (10,10) | (-10,0) | 22.3606797749979 + (5.1,34.5) | (10,10) | 24.9851956166046 + (10,10) | (5.1,34.5) | 24.9851956166046 + (-5,-12) | (10,10) | 26.6270539113887 + (10,10) | (-5,-12) | 26.6270539113887 + (-3,4) | (5.1,34.5) | 31.5572495632937 + (5.1,34.5) | (-3,4) | 31.5572495632937 + (0,0) | (5.1,34.5) | 34.8749193547455 + (1e-300,-1e-300) | (5.1,34.5) | 34.8749193547455 + (5.1,34.5) | (0,0) | 34.8749193547455 + (5.1,34.5) | (1e-300,-1e-300) | 34.8749193547455 + (-10,0) | (5.1,34.5) | 37.6597928831267 + (5.1,34.5) | (-10,0) | 37.6597928831267 + (-5,-12) | (5.1,34.5) | 47.5842410888311 + (5.1,34.5) | (-5,-12) | 47.5842410888311 + (-10,0) | (1e+300,Infinity) | Infinity + (-10,0) | (Infinity,1e+300) | Infinity + (-5,-12) | (1e+300,Infinity) | Infinity + (-5,-12) | (Infinity,1e+300) | Infinity + (-3,4) | (1e+300,Infinity) | Infinity + (-3,4) | (Infinity,1e+300) | Infinity + (0,0) | (1e+300,Infinity) | Infinity + (0,0) | (Infinity,1e+300) | Infinity + (1e-300,-1e-300) | (1e+300,Infinity) | Infinity + (1e-300,-1e-300) | (Infinity,1e+300) | Infinity + (5.1,34.5) | (1e+300,Infinity) | Infinity + (5.1,34.5) | (Infinity,1e+300) | Infinity + (10,10) | (1e+300,Infinity) | Infinity + (10,10) | (Infinity,1e+300) | Infinity + (1e+300,Infinity) | (-10,0) | Infinity + (1e+300,Infinity) | (-5,-12) | Infinity + (1e+300,Infinity) | (-3,4) | Infinity + (1e+300,Infinity) | (0,0) | Infinity + (1e+300,Infinity) | (1e-300,-1e-300) | Infinity + (1e+300,Infinity) | (5.1,34.5) | Infinity + (1e+300,Infinity) | (10,10) | Infinity + (1e+300,Infinity) | (Infinity,1e+300) | Infinity + (Infinity,1e+300) | (-10,0) | Infinity + (Infinity,1e+300) | (-5,-12) | Infinity + (Infinity,1e+300) | (-3,4) | Infinity + (Infinity,1e+300) | (0,0) | Infinity + (Infinity,1e+300) | (1e-300,-1e-300) | Infinity + (Infinity,1e+300) | (5.1,34.5) | Infinity + (Infinity,1e+300) | (10,10) | Infinity + (Infinity,1e+300) | (1e+300,Infinity) | Infinity + (-10,0) | (NaN,NaN) | NaN + (-5,-12) | (NaN,NaN) | NaN + (-3,4) | (NaN,NaN) | NaN + (0,0) | (NaN,NaN) | NaN + (1e-300,-1e-300) | (NaN,NaN) | NaN + (5.1,34.5) | (NaN,NaN) | NaN + (10,10) | (NaN,NaN) | NaN + (1e+300,Infinity) | (1e+300,Infinity) | NaN + (1e+300,Infinity) | (NaN,NaN) | NaN + (Infinity,1e+300) | (Infinity,1e+300) | NaN + (Infinity,1e+300) | (NaN,NaN) | NaN + (NaN,NaN) | (-10,0) | NaN + (NaN,NaN) | (-5,-12) | NaN + (NaN,NaN) | (-3,4) | NaN + (NaN,NaN) | (0,0) | NaN + (NaN,NaN) | (1e-300,-1e-300) | NaN + (NaN,NaN) | (5.1,34.5) | NaN + (NaN,NaN) | (10,10) | NaN + (NaN,NaN) | (1e+300,Infinity) | NaN + (NaN,NaN) | (Infinity,1e+300) | NaN + (NaN,NaN) | (NaN,NaN) | NaN +(100 rows) + +SELECT p1.f1 AS point1, p2.f1 AS point2 + FROM POINT_TBL p1, POINT_TBL p2 + WHERE (p1.f1 <-> p2.f1) > 3; + point1 | point2 +-------------------+------------------- + (0,0) | (-10,0) + (0,0) | (-3,4) + (0,0) | (5.1,34.5) + (0,0) | (-5,-12) + (0,0) | (1e+300,Infinity) + (0,0) | (Infinity,1e+300) + (0,0) | (NaN,NaN) + (0,0) | (10,10) + (-10,0) | (0,0) + (-10,0) | (-3,4) + (-10,0) | (5.1,34.5) + (-10,0) | (-5,-12) + (-10,0) | (1e-300,-1e-300) + (-10,0) | (1e+300,Infinity) + (-10,0) | (Infinity,1e+300) + (-10,0) | (NaN,NaN) + (-10,0) | (10,10) + (-3,4) | (0,0) + (-3,4) | (-10,0) + (-3,4) | (5.1,34.5) + (-3,4) | (-5,-12) + (-3,4) | (1e-300,-1e-300) + (-3,4) | (1e+300,Infinity) + (-3,4) | (Infinity,1e+300) + (-3,4) | (NaN,NaN) + (-3,4) | (10,10) + (5.1,34.5) | (0,0) + (5.1,34.5) | (-10,0) + (5.1,34.5) | (-3,4) + (5.1,34.5) | (-5,-12) + (5.1,34.5) | (1e-300,-1e-300) + (5.1,34.5) | (1e+300,Infinity) + (5.1,34.5) | (Infinity,1e+300) + (5.1,34.5) | (NaN,NaN) + (5.1,34.5) | (10,10) + (-5,-12) | (0,0) + (-5,-12) | (-10,0) + (-5,-12) | (-3,4) + (-5,-12) | (5.1,34.5) + (-5,-12) | (1e-300,-1e-300) + (-5,-12) | (1e+300,Infinity) + (-5,-12) | (Infinity,1e+300) + (-5,-12) | (NaN,NaN) + (-5,-12) | (10,10) + (1e-300,-1e-300) | (-10,0) + (1e-300,-1e-300) | (-3,4) + (1e-300,-1e-300) | (5.1,34.5) + (1e-300,-1e-300) | (-5,-12) + (1e-300,-1e-300) | (1e+300,Infinity) + (1e-300,-1e-300) | (Infinity,1e+300) + (1e-300,-1e-300) | (NaN,NaN) + (1e-300,-1e-300) | (10,10) + (1e+300,Infinity) | (0,0) + (1e+300,Infinity) | (-10,0) + (1e+300,Infinity) | (-3,4) + (1e+300,Infinity) | (5.1,34.5) + (1e+300,Infinity) | (-5,-12) + (1e+300,Infinity) | (1e-300,-1e-300) + (1e+300,Infinity) | (1e+300,Infinity) + (1e+300,Infinity) | (Infinity,1e+300) + (1e+300,Infinity) | (NaN,NaN) + (1e+300,Infinity) | (10,10) + (Infinity,1e+300) | (0,0) + (Infinity,1e+300) | (-10,0) + (Infinity,1e+300) | (-3,4) + (Infinity,1e+300) | (5.1,34.5) + (Infinity,1e+300) | (-5,-12) + (Infinity,1e+300) | (1e-300,-1e-300) + (Infinity,1e+300) | (1e+300,Infinity) + (Infinity,1e+300) | (Infinity,1e+300) + (Infinity,1e+300) | (NaN,NaN) + (Infinity,1e+300) | (10,10) + (NaN,NaN) | (0,0) + (NaN,NaN) | (-10,0) + (NaN,NaN) | (-3,4) + (NaN,NaN) | (5.1,34.5) + (NaN,NaN) | (-5,-12) + (NaN,NaN) | (1e-300,-1e-300) + (NaN,NaN) | (1e+300,Infinity) + (NaN,NaN) | (Infinity,1e+300) + (NaN,NaN) | (NaN,NaN) + (NaN,NaN) | (10,10) + (10,10) | (0,0) + (10,10) | (-10,0) + (10,10) | (-3,4) + (10,10) | (5.1,34.5) + (10,10) | (-5,-12) + (10,10) | (1e-300,-1e-300) + (10,10) | (1e+300,Infinity) + (10,10) | (Infinity,1e+300) + (10,10) | (NaN,NaN) +(91 rows) + +-- put distance result into output to allow sorting with GEQ optimizer - tgl 97/05/10 +SELECT p1.f1 AS point1, p2.f1 AS point2, (p1.f1 <-> p2.f1) AS distance + FROM POINT_TBL p1, POINT_TBL p2 + WHERE (p1.f1 <-> p2.f1) > 3 and p1.f1 << p2.f1 + ORDER BY distance, p1.f1[0], p2.f1[0]; + point1 | point2 | distance +-------------------+-------------------+------------------ + (-3,4) | (0,0) | 5 + (-3,4) | (1e-300,-1e-300) | 5 + (-10,0) | (-3,4) | 8.06225774829855 + (-10,0) | (0,0) | 10 + (-10,0) | (1e-300,-1e-300) | 10 + (-10,0) | (-5,-12) | 13 + (-5,-12) | (0,0) | 13 + (-5,-12) | (1e-300,-1e-300) | 13 + (0,0) | (10,10) | 14.142135623731 + (1e-300,-1e-300) | (10,10) | 14.142135623731 + (-3,4) | (10,10) | 14.3178210632764 + (-5,-12) | (-3,4) | 16.1245154965971 + (-10,0) | (10,10) | 22.3606797749979 + (5.1,34.5) | (10,10) | 24.9851956166046 + (-5,-12) | (10,10) | 26.6270539113887 + (-3,4) | (5.1,34.5) | 31.5572495632937 + (0,0) | (5.1,34.5) | 34.8749193547455 + (1e-300,-1e-300) | (5.1,34.5) | 34.8749193547455 + (-10,0) | (5.1,34.5) | 37.6597928831267 + (-5,-12) | (5.1,34.5) | 47.5842410888311 + (-10,0) | (1e+300,Infinity) | Infinity + (-10,0) | (Infinity,1e+300) | Infinity + (-5,-12) | (1e+300,Infinity) | Infinity + (-5,-12) | (Infinity,1e+300) | Infinity + (-3,4) | (1e+300,Infinity) | Infinity + (-3,4) | (Infinity,1e+300) | Infinity + (0,0) | (1e+300,Infinity) | Infinity + (0,0) | (Infinity,1e+300) | Infinity + (1e-300,-1e-300) | (1e+300,Infinity) | Infinity + (1e-300,-1e-300) | (Infinity,1e+300) | Infinity + (5.1,34.5) | (1e+300,Infinity) | Infinity + (5.1,34.5) | (Infinity,1e+300) | Infinity + (10,10) | (1e+300,Infinity) | Infinity + (10,10) | (Infinity,1e+300) | Infinity + (1e+300,Infinity) | (Infinity,1e+300) | Infinity +(35 rows) + +-- put distance result into output to allow sorting with GEQ optimizer - tgl 97/05/10 +SELECT p1.f1 AS point1, p2.f1 AS point2, (p1.f1 <-> p2.f1) AS distance + FROM POINT_TBL p1, POINT_TBL p2 + WHERE (p1.f1 <-> p2.f1) > 3 and p1.f1 << p2.f1 and p1.f1 |>> p2.f1 + ORDER BY distance; + point1 | point2 | distance +-------------------+-------------------+------------------ + (-3,4) | (0,0) | 5 + (-3,4) | (1e-300,-1e-300) | 5 + (-10,0) | (-5,-12) | 13 + (5.1,34.5) | (10,10) | 24.9851956166046 + (1e+300,Infinity) | (Infinity,1e+300) | Infinity +(5 rows) + +-- Test that GiST indexes provide same behavior as sequential scan +CREATE TEMP TABLE point_gist_tbl(f1 point); +INSERT INTO point_gist_tbl SELECT '(0,0)' FROM generate_series(0,1000); +CREATE INDEX point_gist_tbl_index ON point_gist_tbl USING gist (f1); +INSERT INTO point_gist_tbl VALUES ('(0.0000009,0.0000009)'); +SET enable_seqscan TO true; +SET enable_indexscan TO false; +SET enable_bitmapscan TO false; +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 ~= '(0.0000009,0.0000009)'::point; + count +------- + 1002 +(1 row) + +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 <@ '(0.0000009,0.0000009),(0.0000009,0.0000009)'::box; + count +------- + 1 +(1 row) + +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 ~= '(0.0000018,0.0000018)'::point; + count +------- + 1 +(1 row) + +SET enable_seqscan TO false; +SET enable_indexscan TO true; +SET enable_bitmapscan TO true; +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 ~= '(0.0000009,0.0000009)'::point; + count +------- + 1002 +(1 row) + +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 <@ '(0.0000009,0.0000009),(0.0000009,0.0000009)'::box; + count +------- + 1 +(1 row) + +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 ~= '(0.0000018,0.0000018)'::point; + count +------- + 1 +(1 row) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/src/test/singlenode_regress/expected/polygon.out b/src/test/singlenode_regress/expected/polygon.out new file mode 100644 index 00000000000..4da20a74d6d --- /dev/null +++ b/src/test/singlenode_regress/expected/polygon.out @@ -0,0 +1,322 @@ +-- +-- POLYGON +-- +-- polygon logic +-- +CREATE TABLE POLYGON_TBL(f1 polygon); +INSERT INTO POLYGON_TBL(f1) VALUES ('(2.0,0.0),(2.0,4.0),(0.0,0.0)'); +INSERT INTO POLYGON_TBL(f1) VALUES ('(3.0,1.0),(3.0,3.0),(1.0,0.0)'); +INSERT INTO POLYGON_TBL(f1) VALUES ('(1,2),(3,4),(5,6),(7,8)'); +INSERT INTO POLYGON_TBL(f1) VALUES ('(7,8),(5,6),(3,4),(1,2)'); -- Reverse +INSERT INTO POLYGON_TBL(f1) VALUES ('(1,2),(7,8),(5,6),(3,-4)'); +-- degenerate polygons +INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0,0.0)'); +INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0,1.0),(0.0,1.0)'); +-- bad polygon input strings +INSERT INTO POLYGON_TBL(f1) VALUES ('0.0'); +ERROR: invalid input syntax for type polygon: "0.0" +LINE 1: INSERT INTO POLYGON_TBL(f1) VALUES ('0.0'); + ^ +INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0 0.0'); +ERROR: invalid input syntax for type polygon: "(0.0 0.0" +LINE 1: INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0 0.0'); + ^ +INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2)'); +ERROR: invalid input syntax for type polygon: "(0,1,2)" +LINE 1: INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2)'); + ^ +INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2,3'); +ERROR: invalid input syntax for type polygon: "(0,1,2,3" +LINE 1: INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2,3'); + ^ +INSERT INTO POLYGON_TBL(f1) VALUES ('asdf'); +ERROR: invalid input syntax for type polygon: "asdf" +LINE 1: INSERT INTO POLYGON_TBL(f1) VALUES ('asdf'); + ^ +SELECT * FROM POLYGON_TBL; + f1 +---------------------------- + ((2,0),(2,4),(0,0)) + ((3,1),(3,3),(1,0)) + ((1,2),(3,4),(5,6),(7,8)) + ((7,8),(5,6),(3,4),(1,2)) + ((1,2),(7,8),(5,6),(3,-4)) + ((0,0)) + ((0,1),(0,1)) +(7 rows) + +-- +-- Test the SP-GiST index +-- +CREATE TABLE quad_poly_tbl (id int, p polygon); +INSERT INTO quad_poly_tbl + SELECT (x - 1) * 100 + y, polygon(circle(point(x * 10, y * 10), 1 + (x + y) % 10)) + FROM generate_series(1, 100) x, + generate_series(1, 100) y; +INSERT INTO quad_poly_tbl + SELECT i, polygon '((200, 300),(210, 310),(230, 290))' + FROM generate_series(10001, 11000) AS i; +INSERT INTO quad_poly_tbl + VALUES + (11001, NULL), + (11002, NULL), + (11003, NULL); +CREATE INDEX quad_poly_tbl_idx ON quad_poly_tbl USING spgist(p); +-- get reference results for ORDER BY distance from seq scan +SET enable_seqscan = ON; +SET enable_indexscan = OFF; +SET enable_bitmapscan = OFF; +CREATE TEMP TABLE quad_poly_tbl_ord_seq2 AS +SELECT rank() OVER (ORDER BY p <-> point '123,456') n, p <-> point '123,456' dist, id +FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; +-- check results from index scan +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_bitmapscan = ON; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p << polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +--------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p << '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p << '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p << polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 3890 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p &< polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +--------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p &< '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p &< '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p &< polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 7900 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p && polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +--------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p && '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p && '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p && polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 977 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p &> polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +--------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p &> '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p &> '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p &> polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 7000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p >> polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +--------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p >> '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p >> '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p >> polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 2990 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p <<| polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +---------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p <<| '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p <<| '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p <<| polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 1890 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p &<| polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +---------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p &<| '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p &<| '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p &<| polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 6900 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p |&> polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +---------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p |&> '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p |&> '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p |&> polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 9000 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p |>> polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +---------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p |>> '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p |>> '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p |>> polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 3990 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +--------------------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p <@ '((300,300),(400,600),(600,500),(700,200))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p <@ '((300,300),(400,600),(600,500),(700,200))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; + count +------- + 831 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p @> polygon '((340,550),(343,552),(341,553))'; + QUERY PLAN +----------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p @> '((340,550),(343,552),(341,553))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p @> '((340,550),(343,552),(341,553))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p @> polygon '((340,550),(343,552),(341,553))'; + count +------- + 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p ~= polygon '((200, 300),(210, 310),(230, 290))'; + QUERY PLAN +----------------------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on quad_poly_tbl + Recheck Cond: (p ~= '((200,300),(210,310),(230,290))'::polygon) + -> Bitmap Index Scan on quad_poly_tbl_idx + Index Cond: (p ~= '((200,300),(210,310),(230,290))'::polygon) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM quad_poly_tbl WHERE p ~= polygon '((200, 300),(210, 310),(230, 290))'; + count +------- + 1000 +(1 row) + +-- test ORDER BY distance +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; +EXPLAIN (COSTS OFF) +SELECT rank() OVER (ORDER BY p <-> point '123,456') n, p <-> point '123,456' dist, id +FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; + QUERY PLAN +--------------------------------------------------------------------------------- + WindowAgg + Order By: (p <-> '(123,456)'::point) + -> Index Scan using quad_poly_tbl_idx on quad_poly_tbl + Index Cond: (p <@ '((300,300),(400,600),(600,500),(700,200))'::polygon) + Order By: (p <-> '(123,456)'::point) + Optimizer: Postgres query optimizer +(6 rows) + +CREATE TEMP TABLE quad_poly_tbl_ord_idx2 AS +SELECT rank() OVER (ORDER BY p <-> point '123,456') n, p <-> point '123,456' dist, id +FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT * +FROM quad_poly_tbl_ord_seq2 seq FULL JOIN quad_poly_tbl_ord_idx2 idx + ON seq.n = idx.n AND seq.id = idx.id AND + (seq.dist = idx.dist OR seq.dist IS NULL AND idx.dist IS NULL) +WHERE seq.id IS NULL OR idx.id IS NULL; + n | dist | id | n | dist | id +---+------+----+---+------+---- +(0 rows) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/src/test/singlenode_regress/expected/polymorphism.out b/src/test/singlenode_regress/expected/polymorphism.out new file mode 100644 index 00000000000..1cd558d668f --- /dev/null +++ b/src/test/singlenode_regress/expected/polymorphism.out @@ -0,0 +1,2098 @@ +-- +-- Tests for polymorphic SQL functions and aggregates based on them. +-- Tests for other features related to function-calling have snuck in, too. +-- +create function polyf(x anyelement) returns anyelement as $$ + select x + 1 +$$ language sql; +select polyf(42) as int, polyf(4.5) as num; + int | num +-----+----- + 43 | 5.5 +(1 row) + +select polyf(point(3,4)); -- fail for lack of + operator +ERROR: operator does not exist: point + integer +LINE 2: select x + 1 + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +QUERY: + select x + 1 + +CONTEXT: SQL function "polyf" during inlining +drop function polyf(x anyelement); +create function polyf(x anyelement) returns anyarray as $$ + select array[x + 1, x + 2] +$$ language sql; +select polyf(42) as int, polyf(4.5) as num; + int | num +---------+----------- + {43,44} | {5.5,6.5} +(1 row) + +drop function polyf(x anyelement); +create function polyf(x anyarray) returns anyelement as $$ + select x[1] +$$ language sql; +select polyf(array[2,4]) as int, polyf(array[4.5, 7.7]) as num; + int | num +-----+----- + 2 | 4.5 +(1 row) + +select polyf(stavalues1) from pg_statistic; -- fail, can't infer element type +ERROR: cannot determine element type of "anyarray" argument +drop function polyf(x anyarray); +create function polyf(x anyarray) returns anyarray as $$ + select x +$$ language sql; +select polyf(array[2,4]) as int, polyf(array[4.5, 7.7]) as num; + int | num +-------+----------- + {2,4} | {4.5,7.7} +(1 row) + +select polyf(stavalues1) from pg_statistic; -- fail, can't infer element type +ERROR: return type anyarray is not supported for SQL functions +CONTEXT: SQL function "polyf" during inlining +drop function polyf(x anyarray); +-- fail, can't infer type: +create function polyf(x anyelement) returns anyrange as $$ + select array[x + 1, x + 2] +$$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anyrange requires at least one input of type anyrange or anymultirange. +create function polyf(x anyrange) returns anyarray as $$ + select array[lower(x), upper(x)] +$$ language sql; +select polyf(int4range(42, 49)) as int, polyf(float8range(4.5, 7.8)) as num; + int | num +---------+----------- + {42,49} | {4.5,7.8} +(1 row) + +drop function polyf(x anyrange); +create function polyf(x anycompatible, y anycompatible) returns anycompatiblearray as $$ + select array[x, y] +$$ language sql; +select polyf(2, 4) as int, polyf(2, 4.5) as num; + int | num +-------+--------- + {2,4} | {2,4.5} +(1 row) + +drop function polyf(x anycompatible, y anycompatible); +create function polyf(x anycompatiblerange, y anycompatible, z anycompatible) returns anycompatiblearray as $$ + select array[lower(x), upper(x), y, z] +$$ language sql; +select polyf(int4range(42, 49), 11, 2::smallint) as int, polyf(float8range(4.5, 7.8), 7.8, 11::real) as num; + int | num +--------------+------------------ + {42,49,11,2} | {4.5,7.8,7.8,11} +(1 row) + +select polyf(int4range(42, 49), 11, 4.5) as fail; -- range type doesn't fit +ERROR: function polyf(int4range, integer, numeric) does not exist +LINE 1: select polyf(int4range(42, 49), 11, 4.5) as fail; + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function polyf(x anycompatiblerange, y anycompatible, z anycompatible); +create function polyf(x anycompatiblemultirange, y anycompatible, z anycompatible) returns anycompatiblearray as $$ + select array[lower(x), upper(x), y, z] +$$ language sql; +select polyf(multirange(int4range(42, 49)), 11, 2::smallint) as int, polyf(multirange(float8range(4.5, 7.8)), 7.8, 11::real) as num; + int | num +--------------+------------------ + {42,49,11,2} | {4.5,7.8,7.8,11} +(1 row) + +select polyf(multirange(int4range(42, 49)), 11, 4.5) as fail; -- range type doesn't fit +ERROR: function polyf(int4multirange, integer, numeric) does not exist +LINE 1: select polyf(multirange(int4range(42, 49)), 11, 4.5) as fail... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function polyf(x anycompatiblemultirange, y anycompatible, z anycompatible); +-- fail, can't infer type: +create function polyf(x anycompatible) returns anycompatiblerange as $$ + select array[x + 1, x + 2] +$$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anycompatiblerange requires at least one input of type anycompatiblerange or anycompatiblemultirange. +create function polyf(x anycompatiblerange, y anycompatiblearray) returns anycompatiblerange as $$ + select x +$$ language sql; +select polyf(int4range(42, 49), array[11]) as int, polyf(float8range(4.5, 7.8), array[7]) as num; + int | num +---------+----------- + [42,49) | [4.5,7.8) +(1 row) + +drop function polyf(x anycompatiblerange, y anycompatiblearray); +-- fail, can't infer type: +create function polyf(x anycompatible) returns anycompatiblemultirange as $$ + select array[x + 1, x + 2] +$$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anycompatiblemultirange requires at least one input of type anycompatiblerange or anycompatiblemultirange. +create function polyf(x anycompatiblemultirange, y anycompatiblearray) returns anycompatiblemultirange as $$ + select x +$$ language sql; +select polyf(multirange(int4range(42, 49)), array[11]) as int, polyf(multirange(float8range(4.5, 7.8)), array[7]) as num; + int | num +-----------+------------- + {[42,49)} | {[4.5,7.8)} +(1 row) + +drop function polyf(x anycompatiblemultirange, y anycompatiblearray); +create function polyf(a anyelement, b anyarray, + c anycompatible, d anycompatible, + OUT x anyarray, OUT y anycompatiblearray) +as $$ + select a || b, array[c, d] +$$ language sql; +select x, pg_typeof(x), y, pg_typeof(y) + from polyf(11, array[1, 2], 42, 34.5); + x | pg_typeof | y | pg_typeof +----------+-----------+-----------+----------- + {11,1,2} | integer[] | {42,34.5} | numeric[] +(1 row) + +select x, pg_typeof(x), y, pg_typeof(y) + from polyf(11, array[1, 2], point(1,2), point(3,4)); + x | pg_typeof | y | pg_typeof +----------+-----------+-------------------+----------- + {11,1,2} | integer[] | {"(1,2)","(3,4)"} | point[] +(1 row) + +select x, pg_typeof(x), y, pg_typeof(y) + from polyf(11, '{1,2}', point(1,2), '(3,4)'); + x | pg_typeof | y | pg_typeof +----------+-----------+-------------------+----------- + {11,1,2} | integer[] | {"(1,2)","(3,4)"} | point[] +(1 row) + +select x, pg_typeof(x), y, pg_typeof(y) + from polyf(11, array[1, 2.2], 42, 34.5); -- fail +ERROR: function polyf(integer, numeric[], integer, numeric) does not exist +LINE 2: from polyf(11, array[1, 2.2], 42, 34.5); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function polyf(a anyelement, b anyarray, + c anycompatible, d anycompatible); +create function polyf(anyrange) returns anymultirange +as 'select multirange($1);' language sql; +select polyf(int4range(1,10)); + polyf +---------- + {[1,10)} +(1 row) + +select polyf(null); +ERROR: could not determine polymorphic type because input has type unknown +drop function polyf(anyrange); +create function polyf(anymultirange) returns anyelement +as 'select lower($1);' language sql; +select polyf(int4multirange(int4range(1,10), int4range(20,30))); + polyf +------- + 1 +(1 row) + +select polyf(null); +ERROR: could not determine polymorphic type because input has type unknown +drop function polyf(anymultirange); +create function polyf(anycompatiblerange) returns anycompatiblemultirange +as 'select multirange($1);' language sql; +select polyf(int4range(1,10)); + polyf +---------- + {[1,10)} +(1 row) + +select polyf(null); +ERROR: could not determine polymorphic type anycompatiblerange because input has type unknown +drop function polyf(anycompatiblerange); +create function polyf(anymultirange) returns anyrange +as 'select range_merge($1);' language sql; +select polyf(int4multirange(int4range(1,10), int4range(20,30))); + polyf +-------- + [1,30) +(1 row) + +select polyf(null); +ERROR: could not determine polymorphic type because input has type unknown +drop function polyf(anymultirange); +create function polyf(anycompatiblemultirange) returns anycompatiblerange +as 'select range_merge($1);' language sql; +select polyf(int4multirange(int4range(1,10), int4range(20,30))); + polyf +-------- + [1,30) +(1 row) + +select polyf(null); +ERROR: could not determine polymorphic type anycompatiblerange because input has type unknown +drop function polyf(anycompatiblemultirange); +create function polyf(anycompatiblemultirange) returns anycompatible +as 'select lower($1);' language sql; +select polyf(int4multirange(int4range(1,10), int4range(20,30))); + polyf +------- + 1 +(1 row) + +select polyf(null); +ERROR: could not determine polymorphic type anycompatiblemultirange because input has type unknown +drop function polyf(anycompatiblemultirange); +-- +-- Polymorphic aggregate tests +-- +-- Legend: +----------- +-- A = type is ANY +-- P = type is polymorphic +-- N = type is non-polymorphic +-- B = aggregate base type +-- S = aggregate state type +-- R = aggregate return type +-- 1 = arg1 of a function +-- 2 = arg2 of a function +-- ag = aggregate +-- tf = trans (state) function +-- ff = final function +-- rt = return type of a function +-- -> = implies +-- => = allowed +-- !> = not allowed +-- E = exists +-- NE = not-exists +-- +-- Possible states: +-- ---------------- +-- B = (A || P || N) +-- when (B = A) -> (tf2 = NE) +-- S = (P || N) +-- ff = (E || NE) +-- tf1 = (P || N) +-- tf2 = (NE || P || N) +-- R = (P || N) +-- create functions for use as tf and ff with the needed combinations of +-- argument polymorphism, but within the constraints of valid aggregate +-- functions, i.e. tf arg1 and tf return type must match +-- polymorphic single arg transfn +CREATE FUNCTION stfp(anyarray) RETURNS anyarray AS +'select $1' LANGUAGE SQL; +-- non-polymorphic single arg transfn +CREATE FUNCTION stfnp(int[]) RETURNS int[] AS +'select $1' LANGUAGE SQL; +-- dual polymorphic transfn +CREATE FUNCTION tfp(anyarray,anyelement) RETURNS anyarray AS +'select $1 || $2' LANGUAGE SQL; +-- dual non-polymorphic transfn +CREATE FUNCTION tfnp(int[],int) RETURNS int[] AS +'select $1 || $2' LANGUAGE SQL; +-- arg1 only polymorphic transfn +CREATE FUNCTION tf1p(anyarray,int) RETURNS anyarray AS +'select $1' LANGUAGE SQL; +-- arg2 only polymorphic transfn +CREATE FUNCTION tf2p(int[],anyelement) RETURNS int[] AS +'select $1' LANGUAGE SQL; +-- multi-arg polymorphic +CREATE FUNCTION sum3(anyelement,anyelement,anyelement) returns anyelement AS +'select $1+$2+$3' language sql strict; +-- finalfn polymorphic +CREATE FUNCTION ffp(anyarray) RETURNS anyarray AS +'select $1' LANGUAGE SQL; +-- finalfn non-polymorphic +CREATE FUNCTION ffnp(int[]) returns int[] as +'select $1' LANGUAGE SQL; +-- Try to cover all the possible states: +-- +-- Note: in Cases 1 & 2, we are trying to return P. Therefore, if the transfn +-- is stfnp, tfnp, or tf2p, we must use ffp as finalfn, because stfnp, tfnp, +-- and tf2p do not return P. Conversely, in Cases 3 & 4, we are trying to +-- return N. Therefore, if the transfn is stfp, tfp, or tf1p, we must use ffnp +-- as finalfn, because stfp, tfp, and tf1p do not return N. +-- +-- Case1 (R = P) && (B = A) +-- ------------------------ +-- S tf1 +-- ------- +-- N N +-- should CREATE +CREATE AGGREGATE myaggp01a(*) (SFUNC = stfnp, STYPE = int4[], + FINALFUNC = ffp, INITCOND = '{}'); +-- P N +-- should ERROR: stfnp(anyarray) not matched by stfnp(int[]) +CREATE AGGREGATE myaggp02a(*) (SFUNC = stfnp, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- N P +-- should CREATE +CREATE AGGREGATE myaggp03a(*) (SFUNC = stfp, STYPE = int4[], + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp03b(*) (SFUNC = stfp, STYPE = int4[], + INITCOND = '{}'); +-- P P +-- should ERROR: we have no way to resolve S +CREATE AGGREGATE myaggp04a(*) (SFUNC = stfp, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +CREATE AGGREGATE myaggp04b(*) (SFUNC = stfp, STYPE = anyarray, + INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- Case2 (R = P) && ((B = P) || (B = N)) +-- ------------------------------------- +-- S tf1 B tf2 +-- ----------------------- +-- N N N N +-- should CREATE +CREATE AGGREGATE myaggp05a(BASETYPE = int, SFUNC = tfnp, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +-- N N N P +-- should CREATE +CREATE AGGREGATE myaggp06a(BASETYPE = int, SFUNC = tf2p, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +-- N N P N +-- should ERROR: tfnp(int[], anyelement) not matched by tfnp(int[], int) +CREATE AGGREGATE myaggp07a(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: function tfnp(integer[], anyelement) does not exist +-- N N P P +-- should CREATE +CREATE AGGREGATE myaggp08a(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +-- N P N N +-- should CREATE +CREATE AGGREGATE myaggp09a(BASETYPE = int, SFUNC = tf1p, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp09b(BASETYPE = int, SFUNC = tf1p, STYPE = int[], + INITCOND = '{}'); +-- N P N P +-- should CREATE +CREATE AGGREGATE myaggp10a(BASETYPE = int, SFUNC = tfp, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp10b(BASETYPE = int, SFUNC = tfp, STYPE = int[], + INITCOND = '{}'); +-- N P P N +-- should ERROR: tf1p(int[],anyelement) not matched by tf1p(anyarray,int) +CREATE AGGREGATE myaggp11a(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: function tf1p(integer[], anyelement) does not exist +CREATE AGGREGATE myaggp11b(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], + INITCOND = '{}'); +ERROR: function tf1p(integer[], anyelement) does not exist +-- N P P P +-- should ERROR: tfp(int[],anyelement) not matched by tfp(anyarray,anyelement) +CREATE AGGREGATE myaggp12a(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: function tfp(integer[], anyelement) does not exist +CREATE AGGREGATE myaggp12b(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], + INITCOND = '{}'); +ERROR: function tfp(integer[], anyelement) does not exist +-- P N N N +-- should ERROR: tfnp(anyarray, int) not matched by tfnp(int[],int) +CREATE AGGREGATE myaggp13a(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- P N N P +-- should ERROR: tf2p(anyarray, int) not matched by tf2p(int[],anyelement) +CREATE AGGREGATE myaggp14a(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- P N P N +-- should ERROR: tfnp(anyarray, anyelement) not matched by tfnp(int[],int) +CREATE AGGREGATE myaggp15a(BASETYPE = anyelement, SFUNC = tfnp, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); +ERROR: function tfnp(anyarray, anyelement) does not exist +-- P N P P +-- should ERROR: tf2p(anyarray, anyelement) not matched by tf2p(int[],anyelement) +CREATE AGGREGATE myaggp16a(BASETYPE = anyelement, SFUNC = tf2p, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); +ERROR: function tf2p(anyarray, anyelement) does not exist +-- P P N N +-- should ERROR: we have no way to resolve S +CREATE AGGREGATE myaggp17a(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +CREATE AGGREGATE myaggp17b(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, + INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- P P N P +-- should ERROR: tfp(anyarray, int) not matched by tfp(anyarray, anyelement) +CREATE AGGREGATE myaggp18a(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +CREATE AGGREGATE myaggp18b(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, + INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- P P P N +-- should ERROR: tf1p(anyarray, anyelement) not matched by tf1p(anyarray, int) +CREATE AGGREGATE myaggp19a(BASETYPE = anyelement, SFUNC = tf1p, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); +ERROR: function tf1p(anyarray, anyelement) does not exist +CREATE AGGREGATE myaggp19b(BASETYPE = anyelement, SFUNC = tf1p, + STYPE = anyarray, INITCOND = '{}'); +ERROR: function tf1p(anyarray, anyelement) does not exist +-- P P P P +-- should CREATE +CREATE AGGREGATE myaggp20a(BASETYPE = anyelement, SFUNC = tfp, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp20b(BASETYPE = anyelement, SFUNC = tfp, + STYPE = anyarray, INITCOND = '{}'); +-- Case3 (R = N) && (B = A) +-- ------------------------ +-- S tf1 +-- ------- +-- N N +-- should CREATE +CREATE AGGREGATE myaggn01a(*) (SFUNC = stfnp, STYPE = int4[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn01b(*) (SFUNC = stfnp, STYPE = int4[], + INITCOND = '{}'); +-- P N +-- should ERROR: stfnp(anyarray) not matched by stfnp(int[]) +CREATE AGGREGATE myaggn02a(*) (SFUNC = stfnp, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +CREATE AGGREGATE myaggn02b(*) (SFUNC = stfnp, STYPE = anyarray, + INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- N P +-- should CREATE +CREATE AGGREGATE myaggn03a(*) (SFUNC = stfp, STYPE = int4[], + FINALFUNC = ffnp, INITCOND = '{}'); +-- P P +-- should ERROR: ffnp(anyarray) not matched by ffnp(int[]) +CREATE AGGREGATE myaggn04a(*) (SFUNC = stfp, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- Case4 (R = N) && ((B = P) || (B = N)) +-- ------------------------------------- +-- S tf1 B tf2 +-- ----------------------- +-- N N N N +-- should CREATE +CREATE AGGREGATE myaggn05a(BASETYPE = int, SFUNC = tfnp, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn05b(BASETYPE = int, SFUNC = tfnp, STYPE = int[], + INITCOND = '{}'); +-- N N N P +-- should CREATE +CREATE AGGREGATE myaggn06a(BASETYPE = int, SFUNC = tf2p, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn06b(BASETYPE = int, SFUNC = tf2p, STYPE = int[], + INITCOND = '{}'); +-- N N P N +-- should ERROR: tfnp(int[], anyelement) not matched by tfnp(int[], int) +CREATE AGGREGATE myaggn07a(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: function tfnp(integer[], anyelement) does not exist +CREATE AGGREGATE myaggn07b(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], + INITCOND = '{}'); +ERROR: function tfnp(integer[], anyelement) does not exist +-- N N P P +-- should CREATE +CREATE AGGREGATE myaggn08a(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn08b(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], + INITCOND = '{}'); +-- N P N N +-- should CREATE +CREATE AGGREGATE myaggn09a(BASETYPE = int, SFUNC = tf1p, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +-- N P N P +-- should CREATE +CREATE AGGREGATE myaggn10a(BASETYPE = int, SFUNC = tfp, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +-- N P P N +-- should ERROR: tf1p(int[],anyelement) not matched by tf1p(anyarray,int) +CREATE AGGREGATE myaggn11a(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: function tf1p(integer[], anyelement) does not exist +-- N P P P +-- should ERROR: tfp(int[],anyelement) not matched by tfp(anyarray,anyelement) +CREATE AGGREGATE myaggn12a(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: function tfp(integer[], anyelement) does not exist +-- P N N N +-- should ERROR: tfnp(anyarray, int) not matched by tfnp(int[],int) +CREATE AGGREGATE myaggn13a(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +CREATE AGGREGATE myaggn13b(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, + INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- P N N P +-- should ERROR: tf2p(anyarray, int) not matched by tf2p(int[],anyelement) +CREATE AGGREGATE myaggn14a(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +CREATE AGGREGATE myaggn14b(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, + INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- P N P N +-- should ERROR: tfnp(anyarray, anyelement) not matched by tfnp(int[],int) +CREATE AGGREGATE myaggn15a(BASETYPE = anyelement, SFUNC = tfnp, + STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: function tfnp(anyarray, anyelement) does not exist +CREATE AGGREGATE myaggn15b(BASETYPE = anyelement, SFUNC = tfnp, + STYPE = anyarray, INITCOND = '{}'); +ERROR: function tfnp(anyarray, anyelement) does not exist +-- P N P P +-- should ERROR: tf2p(anyarray, anyelement) not matched by tf2p(int[],anyelement) +CREATE AGGREGATE myaggn16a(BASETYPE = anyelement, SFUNC = tf2p, + STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: function tf2p(anyarray, anyelement) does not exist +CREATE AGGREGATE myaggn16b(BASETYPE = anyelement, SFUNC = tf2p, + STYPE = anyarray, INITCOND = '{}'); +ERROR: function tf2p(anyarray, anyelement) does not exist +-- P P N N +-- should ERROR: ffnp(anyarray) not matched by ffnp(int[]) +CREATE AGGREGATE myaggn17a(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- P P N P +-- should ERROR: tfp(anyarray, int) not matched by tfp(anyarray, anyelement) +CREATE AGGREGATE myaggn18a(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: cannot determine transition data type +DETAIL: A result of type anyarray requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +-- P P P N +-- should ERROR: tf1p(anyarray, anyelement) not matched by tf1p(anyarray, int) +CREATE AGGREGATE myaggn19a(BASETYPE = anyelement, SFUNC = tf1p, + STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: function tf1p(anyarray, anyelement) does not exist +-- P P P P +-- should ERROR: ffnp(anyarray) not matched by ffnp(int[]) +CREATE AGGREGATE myaggn20a(BASETYPE = anyelement, SFUNC = tfp, + STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); +ERROR: function ffnp(anyarray) does not exist +-- multi-arg polymorphic +CREATE AGGREGATE mysum2(anyelement,anyelement) (SFUNC = sum3, + STYPE = anyelement, INITCOND = '0'); +-- create test data for polymorphic aggregates +create temp table t(f1 int, f2 int[], f3 text); +insert into t values(1,array[1],'a'); +insert into t values(1,array[11],'b'); +insert into t values(1,array[111],'c'); +insert into t values(2,array[2],'a'); +insert into t values(2,array[22],'b'); +insert into t values(2,array[222],'c'); +insert into t values(3,array[3],'a'); +insert into t values(3,array[3],'b'); +-- test the successfully created polymorphic aggregates +select f3, myaggp01a(*) from t group by f3 order by f3; + f3 | myaggp01a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggp03a(*) from t group by f3 order by f3; + f3 | myaggp03a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggp03b(*) from t group by f3 order by f3; + f3 | myaggp03b +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggp05a(f1) from t group by f3 order by f3; + f3 | myaggp05a +----+----------- + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +select f3, myaggp06a(f1) from t group by f3 order by f3; + f3 | myaggp06a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggp08a(f1) from t group by f3 order by f3; + f3 | myaggp08a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggp09a(f1) from t group by f3 order by f3; + f3 | myaggp09a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggp09b(f1) from t group by f3 order by f3; + f3 | myaggp09b +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggp10a(f1) from t group by f3 order by f3; + f3 | myaggp10a +----+----------- + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +select f3, myaggp10b(f1) from t group by f3 order by f3; + f3 | myaggp10b +----+----------- + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +select f3, myaggp20a(f1) from t group by f3 order by f3; + f3 | myaggp20a +----+----------- + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +select f3, myaggp20b(f1) from t group by f3 order by f3; + f3 | myaggp20b +----+----------- + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +select f3, myaggn01a(*) from t group by f3 order by f3; + f3 | myaggn01a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggn01b(*) from t group by f3 order by f3; + f3 | myaggn01b +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggn03a(*) from t group by f3 order by f3; + f3 | myaggn03a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggn05a(f1) from t group by f3 order by f3; + f3 | myaggn05a +----+----------- + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +select f3, myaggn05b(f1) from t group by f3 order by f3; + f3 | myaggn05b +----+----------- + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +select f3, myaggn06a(f1) from t group by f3 order by f3; + f3 | myaggn06a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggn06b(f1) from t group by f3 order by f3; + f3 | myaggn06b +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggn08a(f1) from t group by f3 order by f3; + f3 | myaggn08a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggn08b(f1) from t group by f3 order by f3; + f3 | myaggn08b +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggn09a(f1) from t group by f3 order by f3; + f3 | myaggn09a +----+----------- + a | {} + b | {} + c | {} +(3 rows) + +select f3, myaggn10a(f1) from t group by f3 order by f3; + f3 | myaggn10a +----+----------- + a | {1,2,3} + b | {1,2,3} + c | {1,2} +(3 rows) + +select mysum2(f1, f1 + 1) from t; + mysum2 +-------- + 38 +(1 row) + +-- test inlining of polymorphic SQL functions +create function bleat(int) returns int as $$ +begin + raise notice 'bleat %', $1; + return $1; +end$$ language plpgsql; +create function sql_if(bool, anyelement, anyelement) returns anyelement as $$ +select case when $1 then $2 else $3 end $$ language sql; +-- Note this would fail with integer overflow, never mind wrong bleat() output, +-- if the CASE expression were not successfully inlined +select f1, sql_if(f1 > 0, bleat(f1), bleat(f1 + 1)) from int4_tbl; +NOTICE: bleat 1 +NOTICE: bleat 123456 +NOTICE: bleat -123455 +NOTICE: bleat 2147483647 +NOTICE: bleat -2147483646 + f1 | sql_if +-------------+------------- + 0 | 1 + 123456 | 123456 + -123456 | -123455 + 2147483647 | 2147483647 + -2147483647 | -2147483646 +(5 rows) + +select q2, sql_if(q2 > 0, q2, q2 + 1) from int8_tbl; + q2 | sql_if +-------------------+------------------- + 456 | 456 + 4567890123456789 | 4567890123456789 + 123 | 123 + 4567890123456789 | 4567890123456789 + -4567890123456789 | -4567890123456788 +(5 rows) + +-- another sort of polymorphic aggregate +CREATE AGGREGATE array_larger_accum (anyarray) +( + sfunc = array_larger, + stype = anyarray, + initcond = '{}' +); +SELECT array_larger_accum(i) +FROM (VALUES (ARRAY[1,2]), (ARRAY[3,4])) as t(i); + array_larger_accum +-------------------- + {3,4} +(1 row) + +SELECT array_larger_accum(i) +FROM (VALUES (ARRAY[row(1,2),row(3,4)]), (ARRAY[row(5,6),row(7,8)])) as t(i); + array_larger_accum +-------------------- + {"(5,6)","(7,8)"} +(1 row) + +-- another kind of polymorphic aggregate +create function add_group(grp anyarray, ad anyelement, size integer) + returns anyarray + as $$ +begin + if grp is null then + return array[ad]; + end if; + if array_upper(grp, 1) < size then + return grp || ad; + end if; + return grp; +end; +$$ + language plpgsql immutable; +create aggregate build_group(anyelement, integer) ( + SFUNC = add_group, + STYPE = anyarray +); +select build_group(q1,3) from int8_tbl; + build_group +---------------------------- + {123,123,4567890123456789} +(1 row) + +-- this should fail because stype isn't compatible with arg +create aggregate build_group(int8, integer) ( + SFUNC = add_group, + STYPE = int2[] +); +ERROR: function add_group(smallint[], bigint, integer) does not exist +-- but we can make a non-poly agg from a poly sfunc if types are OK +create aggregate build_group(int8, integer) ( + SFUNC = add_group, + STYPE = int8[] +); +-- check proper resolution of data types for polymorphic transfn/finalfn +create function first_el_transfn(anyarray, anyelement) returns anyarray as +'select $1 || $2' language sql immutable; +create function first_el(anyarray) returns anyelement as +'select $1[1]' language sql strict immutable; +create aggregate first_el_agg_f8(float8) ( + SFUNC = array_append, + STYPE = float8[], + FINALFUNC = first_el +); +create aggregate first_el_agg_any(anyelement) ( + SFUNC = first_el_transfn, + STYPE = anyarray, + FINALFUNC = first_el +); +select first_el_agg_f8(x::float8) from generate_series(1,10) x; + first_el_agg_f8 +----------------- + 1 +(1 row) + +select first_el_agg_any(x) from generate_series(1,10) x; + first_el_agg_any +------------------ + 1 +(1 row) + +select first_el_agg_f8(x::float8) over(order by x) from generate_series(1,10) x; + first_el_agg_f8 +----------------- + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +(10 rows) + +select first_el_agg_any(x) over(order by x) from generate_series(1,10) x; + first_el_agg_any +------------------ + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +(10 rows) + +-- check that we can apply functions taking ANYARRAY to pg_stats +select distinct array_ndims(histogram_bounds) from pg_stats +where histogram_bounds is not null; + array_ndims +------------- + 1 +(1 row) + +-- such functions must protect themselves if varying element type isn't OK +-- (WHERE clause here is to avoid possibly getting a collation error instead) +select max(histogram_bounds) from pg_stats where tablename = 'pg_am'; +ERROR: cannot compare arrays of different element types +-- another corner case is the input functions for polymorphic pseudotypes +select array_in('{1,2,3}','int4'::regtype,-1); -- this has historically worked + array_in +---------- + {1,2,3} +(1 row) + +select * from array_in('{1,2,3}','int4'::regtype,-1); -- this not +ERROR: function "array_in" in FROM has unsupported return type anyarray +LINE 1: select * from array_in('{1,2,3}','int4'::regtype,-1); + ^ +select anyrange_in('[10,20)','int4range'::regtype,-1); +ERROR: cannot accept a value of type anyrange +-- test variadic polymorphic functions +create function myleast(variadic anyarray) returns anyelement as $$ + select min($1[i]) from generate_subscripts($1,1) g(i) +$$ language sql immutable strict; +select myleast(10, 1, 20, 33); + myleast +--------- + 1 +(1 row) + +select myleast(1.1, 0.22, 0.55); + myleast +--------- + 0.22 +(1 row) + +select myleast('z'::text); + myleast +--------- + z +(1 row) + +select myleast(); -- fail +ERROR: function myleast() does not exist +LINE 1: select myleast(); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +-- test with variadic call parameter +select myleast(variadic array[1,2,3,4,-1]); + myleast +--------- + -1 +(1 row) + +select myleast(variadic array[1.1, -5.5]); + myleast +--------- + -5.5 +(1 row) + +--test with empty variadic call parameter +select myleast(variadic array[]::int[]); + myleast +--------- + +(1 row) + +-- an example with some ordinary arguments too +create function concat(text, variadic anyarray) returns text as $$ + select array_to_string($2, $1); +$$ language sql immutable strict; +select concat('%', 1, 2, 3, 4, 5); + concat +----------- + 1%2%3%4%5 +(1 row) + +select concat('|', 'a'::text, 'b', 'c'); + concat +-------- + a|b|c +(1 row) + +select concat('|', variadic array[1,2,33]); + concat +-------- + 1|2|33 +(1 row) + +select concat('|', variadic array[]::int[]); + concat +-------- + +(1 row) + +drop function concat(text, anyarray); +-- mix variadic with anyelement +create function formarray(anyelement, variadic anyarray) returns anyarray as $$ + select array_prepend($1, $2); +$$ language sql immutable strict; +select formarray(1,2,3,4,5); + formarray +------------- + {1,2,3,4,5} +(1 row) + +select formarray(1.1, variadic array[1.2,55.5]); + formarray +---------------- + {1.1,1.2,55.5} +(1 row) + +select formarray(1.1, array[1.2,55.5]); -- fail without variadic +ERROR: function formarray(numeric, numeric[]) does not exist +LINE 1: select formarray(1.1, array[1.2,55.5]); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select formarray(1, 'x'::text); -- fail, type mismatch +ERROR: function formarray(integer, text) does not exist +LINE 1: select formarray(1, 'x'::text); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select formarray(1, variadic array['x'::text]); -- fail, type mismatch +ERROR: function formarray(integer, text[]) does not exist +LINE 1: select formarray(1, variadic array['x'::text]); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function formarray(anyelement, variadic anyarray); +-- test pg_typeof() function +select pg_typeof(null); -- unknown + pg_typeof +----------- + unknown +(1 row) + +select pg_typeof(0); -- integer + pg_typeof +----------- + integer +(1 row) + +select pg_typeof(0.0); -- numeric + pg_typeof +----------- + numeric +(1 row) + +select pg_typeof(1+1 = 2); -- boolean + pg_typeof +----------- + boolean +(1 row) + +select pg_typeof('x'); -- unknown + pg_typeof +----------- + unknown +(1 row) + +select pg_typeof('' || ''); -- text + pg_typeof +----------- + text +(1 row) + +select pg_typeof(pg_typeof(0)); -- regtype + pg_typeof +----------- + regtype +(1 row) + +select pg_typeof(array[1.2,55.5]); -- numeric[] + pg_typeof +----------- + numeric[] +(1 row) + +select pg_typeof(myleast(10, 1, 20, 33)); -- polymorphic input + pg_typeof +----------- + integer +(1 row) + +-- test functions with default parameters +-- test basic functionality +create function dfunc(a int = 1, int = 2) returns int as $$ + select $1 + $2; +$$ language sql; +select dfunc(); + dfunc +------- + 3 +(1 row) + +select dfunc(10); + dfunc +------- + 12 +(1 row) + +select dfunc(10, 20); + dfunc +------- + 30 +(1 row) + +select dfunc(10, 20, 30); -- fail +ERROR: function dfunc(integer, integer, integer) does not exist +LINE 1: select dfunc(10, 20, 30); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function dfunc(); -- fail +ERROR: function dfunc() does not exist +drop function dfunc(int); -- fail +ERROR: function dfunc(integer) does not exist +drop function dfunc(int, int); -- ok +-- fail: defaults must be at end of argument list +create function dfunc(a int = 1, b int) returns int as $$ + select $1 + $2; +$$ language sql; +ERROR: input parameters after one with a default value must also have defaults +-- however, this should work: +create function dfunc(a int = 1, out sum int, b int = 2) as $$ + select $1 + $2; +$$ language sql; +select dfunc(); + dfunc +------- + 3 +(1 row) + +-- verify it lists properly +\df dfunc + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+-------+------------------+-----------------------------------------------------------+------ + public | dfunc | integer | a integer DEFAULT 1, OUT sum integer, b integer DEFAULT 2 | func +(1 row) + +drop function dfunc(int, int); +-- check implicit coercion +create function dfunc(a int DEFAULT 1.0, int DEFAULT '-1') returns int as $$ + select $1 + $2; +$$ language sql; +select dfunc(); + dfunc +------- + 0 +(1 row) + +create function dfunc(a text DEFAULT 'Hello', b text DEFAULT 'World') returns text as $$ + select $1 || ', ' || $2; +$$ language sql; +select dfunc(); -- fail: which dfunc should be called? int or text +ERROR: function dfunc() is not unique +LINE 1: select dfunc(); + ^ +HINT: Could not choose a best candidate function. You might need to add explicit type casts. +select dfunc('Hi'); -- ok + dfunc +----------- + Hi, World +(1 row) + +select dfunc('Hi', 'City'); -- ok + dfunc +---------- + Hi, City +(1 row) + +select dfunc(0); -- ok + dfunc +------- + -1 +(1 row) + +select dfunc(10, 20); -- ok + dfunc +------- + 30 +(1 row) + +drop function dfunc(int, int); +drop function dfunc(text, text); +create function dfunc(int = 1, int = 2) returns int as $$ + select 2; +$$ language sql; +create function dfunc(int = 1, int = 2, int = 3, int = 4) returns int as $$ + select 4; +$$ language sql; +-- Now, dfunc(nargs = 2) and dfunc(nargs = 4) are ambiguous when called +-- with 0 to 2 arguments. +select dfunc(); -- fail +ERROR: function dfunc() is not unique +LINE 1: select dfunc(); + ^ +HINT: Could not choose a best candidate function. You might need to add explicit type casts. +select dfunc(1); -- fail +ERROR: function dfunc(integer) is not unique +LINE 1: select dfunc(1); + ^ +HINT: Could not choose a best candidate function. You might need to add explicit type casts. +select dfunc(1, 2); -- fail +ERROR: function dfunc(integer, integer) is not unique +LINE 1: select dfunc(1, 2); + ^ +HINT: Could not choose a best candidate function. You might need to add explicit type casts. +select dfunc(1, 2, 3); -- ok + dfunc +------- + 4 +(1 row) + +select dfunc(1, 2, 3, 4); -- ok + dfunc +------- + 4 +(1 row) + +drop function dfunc(int, int); +drop function dfunc(int, int, int, int); +-- default values are not allowed for output parameters +create function dfunc(out int = 20) returns int as $$ + select 1; +$$ language sql; +ERROR: only input parameters can have default values +-- polymorphic parameter test +create function dfunc(anyelement = 'World'::text) returns text as $$ + select 'Hello, ' || $1::text; +$$ language sql; +select dfunc(); + dfunc +-------------- + Hello, World +(1 row) + +select dfunc(0); + dfunc +---------- + Hello, 0 +(1 row) + +select dfunc(to_date('20081215','YYYYMMDD')); + dfunc +------------------- + Hello, 12-15-2008 +(1 row) + +select dfunc('City'::text); + dfunc +------------- + Hello, City +(1 row) + +drop function dfunc(anyelement); +-- check defaults for variadics +create function dfunc(a variadic int[]) returns int as +$$ select array_upper($1, 1) $$ language sql; +select dfunc(); -- fail +ERROR: function dfunc() does not exist +LINE 1: select dfunc(); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select dfunc(10); + dfunc +------- + 1 +(1 row) + +select dfunc(10,20); + dfunc +------- + 2 +(1 row) + +create or replace function dfunc(a variadic int[] default array[]::int[]) returns int as +$$ select array_upper($1, 1) $$ language sql; +select dfunc(); -- now ok + dfunc +------- + +(1 row) + +select dfunc(10); + dfunc +------- + 1 +(1 row) + +select dfunc(10,20); + dfunc +------- + 2 +(1 row) + +-- can't remove the default once it exists +create or replace function dfunc(a variadic int[]) returns int as +$$ select array_upper($1, 1) $$ language sql; +ERROR: cannot remove parameter defaults from existing function +HINT: Use DROP FUNCTION dfunc(integer[]) first. +\df dfunc + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+-------+------------------+-------------------------------------------------+------ + public | dfunc | integer | VARIADIC a integer[] DEFAULT ARRAY[]::integer[] | func +(1 row) + +drop function dfunc(a variadic int[]); +-- Ambiguity should be reported only if there's not a better match available +create function dfunc(int = 1, int = 2, int = 3) returns int as $$ + select 3; +$$ language sql; +create function dfunc(int = 1, int = 2) returns int as $$ + select 2; +$$ language sql; +create function dfunc(text) returns text as $$ + select $1; +$$ language sql; +-- dfunc(narg=2) and dfunc(narg=3) are ambiguous +select dfunc(1); -- fail +ERROR: function dfunc(integer) is not unique +LINE 1: select dfunc(1); + ^ +HINT: Could not choose a best candidate function. You might need to add explicit type casts. +-- but this works since the ambiguous functions aren't preferred anyway +select dfunc('Hi'); + dfunc +------- + Hi +(1 row) + +drop function dfunc(int, int, int); +drop function dfunc(int, int); +drop function dfunc(text); +-- +-- Tests for named- and mixed-notation function calling +-- +create function dfunc(a int, b int, c int = 0, d int = 0) + returns table (a int, b int, c int, d int) as $$ + select $1, $2, $3, $4; +$$ language sql; +select (dfunc(10,20,30)).*; + a | b | c | d +----+----+----+--- + 10 | 20 | 30 | 0 +(1 row) + +select (dfunc(a := 10, b := 20, c := 30)).*; + a | b | c | d +----+----+----+--- + 10 | 20 | 30 | 0 +(1 row) + +select * from dfunc(a := 10, b := 20); + a | b | c | d +----+----+---+--- + 10 | 20 | 0 | 0 +(1 row) + +select * from dfunc(b := 10, a := 20); + a | b | c | d +----+----+---+--- + 20 | 10 | 0 | 0 +(1 row) + +select * from dfunc(0); -- fail +ERROR: function dfunc(integer) does not exist +LINE 1: select * from dfunc(0); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select * from dfunc(1,2); + a | b | c | d +---+---+---+--- + 1 | 2 | 0 | 0 +(1 row) + +select * from dfunc(1,2,c := 3); + a | b | c | d +---+---+---+--- + 1 | 2 | 3 | 0 +(1 row) + +select * from dfunc(1,2,d := 3); + a | b | c | d +---+---+---+--- + 1 | 2 | 0 | 3 +(1 row) + +select * from dfunc(x := 20, b := 10, x := 30); -- fail, duplicate name +ERROR: argument name "x" used more than once +LINE 1: select * from dfunc(x := 20, b := 10, x := 30); + ^ +select * from dfunc(10, b := 20, 30); -- fail, named args must be last +ERROR: positional argument cannot follow named argument +LINE 1: select * from dfunc(10, b := 20, 30); + ^ +select * from dfunc(x := 10, b := 20, c := 30); -- fail, unknown param +ERROR: function dfunc(x => integer, b => integer, c => integer) does not exist +LINE 1: select * from dfunc(x := 10, b := 20, c := 30); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select * from dfunc(10, 10, a := 20); -- fail, a overlaps positional parameter +ERROR: function dfunc(integer, integer, a => integer) does not exist +LINE 1: select * from dfunc(10, 10, a := 20); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select * from dfunc(1,c := 2,d := 3); -- fail, no value for b +ERROR: function dfunc(integer, c => integer, d => integer) does not exist +LINE 1: select * from dfunc(1,c := 2,d := 3); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function dfunc(int, int, int, int); +-- test with different parameter types +create function dfunc(a varchar, b numeric, c date = current_date) + returns table (a varchar, b numeric, c date) as $$ + select $1, $2, $3; +$$ language sql; +select (dfunc('Hello World', 20, '2009-07-25'::date)).*; + a | b | c +-------------+----+------------ + Hello World | 20 | 07-25-2009 +(1 row) + +select * from dfunc('Hello World', 20, '2009-07-25'::date); + a | b | c +-------------+----+------------ + Hello World | 20 | 07-25-2009 +(1 row) + +select * from dfunc(c := '2009-07-25'::date, a := 'Hello World', b := 20); + a | b | c +-------------+----+------------ + Hello World | 20 | 07-25-2009 +(1 row) + +select * from dfunc('Hello World', b := 20, c := '2009-07-25'::date); + a | b | c +-------------+----+------------ + Hello World | 20 | 07-25-2009 +(1 row) + +select * from dfunc('Hello World', c := '2009-07-25'::date, b := 20); + a | b | c +-------------+----+------------ + Hello World | 20 | 07-25-2009 +(1 row) + +select * from dfunc('Hello World', c := 20, b := '2009-07-25'::date); -- fail +ERROR: function dfunc(unknown, c => integer, b => date) does not exist +LINE 1: select * from dfunc('Hello World', c := 20, b := '2009-07-25... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function dfunc(varchar, numeric, date); +-- test out parameters with named params +create function dfunc(a varchar = 'def a', out _a varchar, c numeric = NULL, out _c numeric) +returns record as $$ + select $1, $2; +$$ language sql; +select (dfunc()).*; + _a | _c +-------+---- + def a | +(1 row) + +select * from dfunc(); + _a | _c +-------+---- + def a | +(1 row) + +select * from dfunc('Hello', 100); + _a | _c +-------+----- + Hello | 100 +(1 row) + +select * from dfunc(a := 'Hello', c := 100); + _a | _c +-------+----- + Hello | 100 +(1 row) + +select * from dfunc(c := 100, a := 'Hello'); + _a | _c +-------+----- + Hello | 100 +(1 row) + +select * from dfunc('Hello'); + _a | _c +-------+---- + Hello | +(1 row) + +select * from dfunc('Hello', c := 100); + _a | _c +-------+----- + Hello | 100 +(1 row) + +select * from dfunc(c := 100); + _a | _c +-------+----- + def a | 100 +(1 row) + +-- fail, can no longer change an input parameter's name +create or replace function dfunc(a varchar = 'def a', out _a varchar, x numeric = NULL, out _c numeric) +returns record as $$ + select $1, $2; +$$ language sql; +ERROR: cannot change name of input parameter "c" +HINT: Use DROP FUNCTION dfunc(character varying,numeric) first. +create or replace function dfunc(a varchar = 'def a', out _a varchar, numeric = NULL, out _c numeric) +returns record as $$ + select $1, $2; +$$ language sql; +ERROR: cannot change name of input parameter "c" +HINT: Use DROP FUNCTION dfunc(character varying,numeric) first. +drop function dfunc(varchar, numeric); +--fail, named parameters are not unique +create function testpolym(a int, a int) returns int as $$ select 1;$$ language sql; +ERROR: parameter name "a" used more than once +create function testpolym(int, out a int, out a int) returns int as $$ select 1;$$ language sql; +ERROR: parameter name "a" used more than once +create function testpolym(out a int, inout a int) returns int as $$ select 1;$$ language sql; +ERROR: parameter name "a" used more than once +create function testpolym(a int, inout a int) returns int as $$ select 1;$$ language sql; +ERROR: parameter name "a" used more than once +-- valid +create function testpolym(a int, out a int) returns int as $$ select $1;$$ language sql; +select testpolym(37); + testpolym +----------- + 37 +(1 row) + +drop function testpolym(int); +create function testpolym(a int) returns table(a int) as $$ select $1;$$ language sql; +select * from testpolym(37); + a +---- + 37 +(1 row) + +drop function testpolym(int); +-- test polymorphic params and defaults +create function dfunc(a anyelement, b anyelement = null, flag bool = true) +returns anyelement as $$ + select case when $3 then $1 else $2 end; +$$ language sql; +select dfunc(1,2); + dfunc +------- + 1 +(1 row) + +select dfunc('a'::text, 'b'); -- positional notation with default + dfunc +------- + a +(1 row) + +select dfunc(a := 1, b := 2); + dfunc +------- + 1 +(1 row) + +select dfunc(a := 'a'::text, b := 'b'); + dfunc +------- + a +(1 row) + +select dfunc(a := 'a'::text, b := 'b', flag := false); -- named notation + dfunc +------- + b +(1 row) + +select dfunc(b := 'b'::text, a := 'a'); -- named notation with default + dfunc +------- + a +(1 row) + +select dfunc(a := 'a'::text, flag := true); -- named notation with default + dfunc +------- + a +(1 row) + +select dfunc(a := 'a'::text, flag := false); -- named notation with default + dfunc +------- + +(1 row) + +select dfunc(b := 'b'::text, a := 'a', flag := true); -- named notation + dfunc +------- + a +(1 row) + +select dfunc('a'::text, 'b', false); -- full positional notation + dfunc +------- + b +(1 row) + +select dfunc('a'::text, 'b', flag := false); -- mixed notation + dfunc +------- + b +(1 row) + +select dfunc('a'::text, 'b', true); -- full positional notation + dfunc +------- + a +(1 row) + +select dfunc('a'::text, 'b', flag := true); -- mixed notation + dfunc +------- + a +(1 row) + +-- ansi/sql syntax +select dfunc(a => 1, b => 2); + dfunc +------- + 1 +(1 row) + +select dfunc(a => 'a'::text, b => 'b'); + dfunc +------- + a +(1 row) + +select dfunc(a => 'a'::text, b => 'b', flag => false); -- named notation + dfunc +------- + b +(1 row) + +select dfunc(b => 'b'::text, a => 'a'); -- named notation with default + dfunc +------- + a +(1 row) + +select dfunc(a => 'a'::text, flag => true); -- named notation with default + dfunc +------- + a +(1 row) + +select dfunc(a => 'a'::text, flag => false); -- named notation with default + dfunc +------- + +(1 row) + +select dfunc(b => 'b'::text, a => 'a', flag => true); -- named notation + dfunc +------- + a +(1 row) + +select dfunc('a'::text, 'b', false); -- full positional notation + dfunc +------- + b +(1 row) + +select dfunc('a'::text, 'b', flag => false); -- mixed notation + dfunc +------- + b +(1 row) + +select dfunc('a'::text, 'b', true); -- full positional notation + dfunc +------- + a +(1 row) + +select dfunc('a'::text, 'b', flag => true); -- mixed notation + dfunc +------- + a +(1 row) + +-- this tests lexer edge cases around => +select dfunc(a =>-1); + dfunc +------- + -1 +(1 row) + +select dfunc(a =>+1); + dfunc +------- + 1 +(1 row) + +select dfunc(a =>/**/1); + dfunc +------- + 1 +(1 row) + +select dfunc(a =>--comment to be removed by psql + 1); + dfunc +------- + 1 +(1 row) + +-- need DO to protect the -- from psql +do $$ + declare r integer; + begin + select dfunc(a=>-- comment + 1) into r; + raise info 'r = %', r; + end; +$$; +INFO: r = 1 +-- check reverse-listing of named-arg calls +CREATE VIEW dfview AS + SELECT q1, q2, + dfunc(q1,q2, flag := q1>q2) as c3, + dfunc(q1, flag := q1 int8_tbl.q1 > int8_tbl.q2) AS c3, + dfunc(int8_tbl.q1, flag => int8_tbl.q1 < int8_tbl.q2, b => int8_tbl.q2) AS c4 + FROM int8_tbl; + +drop view dfview; +drop function dfunc(anyelement, anyelement, bool); +-- +-- Tests for ANYCOMPATIBLE polymorphism family +-- +create function anyctest(anycompatible, anycompatible) +returns anycompatible as $$ + select greatest($1, $2) +$$ language sql; +select x, pg_typeof(x) from anyctest(11, 12) x; + x | pg_typeof +----+----------- + 12 | integer +(1 row) + +select x, pg_typeof(x) from anyctest(11, 12.3) x; + x | pg_typeof +------+----------- + 12.3 | numeric +(1 row) + +select x, pg_typeof(x) from anyctest(11, point(1,2)) x; -- fail +ERROR: function anyctest(integer, point) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11, point(1,2)) x; + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select x, pg_typeof(x) from anyctest('11', '12.3') x; -- defaults to text + x | pg_typeof +------+----------- + 12.3 | text +(1 row) + +drop function anyctest(anycompatible, anycompatible); +create function anyctest(anycompatible, anycompatible) +returns anycompatiblearray as $$ + select array[$1, $2] +$$ language sql; +select x, pg_typeof(x) from anyctest(11, 12) x; + x | pg_typeof +---------+----------- + {11,12} | integer[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, 12.3) x; + x | pg_typeof +-----------+----------- + {11,12.3} | numeric[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, array[1,2]) x; -- fail +ERROR: function anyctest(integer, integer[]) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11, array[1,2]) x; + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anyctest(anycompatible, anycompatible); +create function anyctest(anycompatible, anycompatiblearray) +returns anycompatiblearray as $$ + select array[$1] || $2 +$$ language sql; +select x, pg_typeof(x) from anyctest(11, array[12]) x; + x | pg_typeof +---------+----------- + {11,12} | integer[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, array[12.3]) x; + x | pg_typeof +-----------+----------- + {11,12.3} | numeric[] +(1 row) + +select x, pg_typeof(x) from anyctest(12.3, array[13]) x; + x | pg_typeof +-----------+----------- + {12.3,13} | numeric[] +(1 row) + +select x, pg_typeof(x) from anyctest(12.3, '{13,14.4}') x; + x | pg_typeof +----------------+----------- + {12.3,13,14.4} | numeric[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, array[point(1,2)]) x; -- fail +ERROR: function anyctest(integer, point[]) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11, array[point(1,2)]) ... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select x, pg_typeof(x) from anyctest(11, 12) x; -- fail +ERROR: function anyctest(integer, integer) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11, 12) x; + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anyctest(anycompatible, anycompatiblearray); +create function anyctest(anycompatible, anycompatiblerange) +returns anycompatiblerange as $$ + select $2 +$$ language sql; +select x, pg_typeof(x) from anyctest(11, int4range(4,7)) x; + x | pg_typeof +-------+----------- + [4,7) | int4range +(1 row) + +select x, pg_typeof(x) from anyctest(11, numrange(4,7)) x; + x | pg_typeof +-------+----------- + [4,7) | numrange +(1 row) + +select x, pg_typeof(x) from anyctest(11, 12) x; -- fail +ERROR: function anyctest(integer, integer) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11, 12) x; + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select x, pg_typeof(x) from anyctest(11.2, int4range(4,7)) x; -- fail +ERROR: function anyctest(numeric, int4range) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11.2, int4range(4,7)) x... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select x, pg_typeof(x) from anyctest(11.2, '[4,7)') x; -- fail +ERROR: could not determine polymorphic type anycompatiblerange because input has type unknown +drop function anyctest(anycompatible, anycompatiblerange); +create function anyctest(anycompatiblerange, anycompatiblerange) +returns anycompatible as $$ + select lower($1) + upper($2) +$$ language sql; +select x, pg_typeof(x) from anyctest(int4range(11,12), int4range(4,7)) x; + x | pg_typeof +----+----------- + 18 | integer +(1 row) + +select x, pg_typeof(x) from anyctest(int4range(11,12), numrange(4,7)) x; -- fail +ERROR: function anyctest(int4range, numrange) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(int4range(11,12), numra... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anyctest(anycompatiblerange, anycompatiblerange); +-- fail, can't infer result type: +create function anyctest(anycompatible) +returns anycompatiblerange as $$ + select $1 +$$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anycompatiblerange requires at least one input of type anycompatiblerange or anycompatiblemultirange. +create function anyctest(anycompatible, anycompatiblemultirange) +returns anycompatiblemultirange as $$ + select $2 +$$ language sql; +select x, pg_typeof(x) from anyctest(11, multirange(int4range(4,7))) x; + x | pg_typeof +---------+---------------- + {[4,7)} | int4multirange +(1 row) + +select x, pg_typeof(x) from anyctest(11, multirange(numrange(4,7))) x; + x | pg_typeof +---------+--------------- + {[4,7)} | nummultirange +(1 row) + +select x, pg_typeof(x) from anyctest(11, 12) x; -- fail +ERROR: function anyctest(integer, integer) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11, 12) x; + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select x, pg_typeof(x) from anyctest(11.2, multirange(int4range(4,7))) x; -- fail +ERROR: function anyctest(numeric, int4multirange) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11.2, multirange(int4ra... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select x, pg_typeof(x) from anyctest(11.2, '{[4,7)}') x; -- fail +ERROR: could not determine polymorphic type anycompatiblemultirange because input has type unknown +drop function anyctest(anycompatible, anycompatiblemultirange); +create function anyctest(anycompatiblemultirange, anycompatiblemultirange) +returns anycompatible as $$ + select lower($1) + upper($2) +$$ language sql; +select x, pg_typeof(x) from anyctest(multirange(int4range(11,12)), multirange(int4range(4,7))) x; + x | pg_typeof +----+----------- + 18 | integer +(1 row) + +select x, pg_typeof(x) from anyctest(multirange(int4range(11,12)), multirange(numrange(4,7))) x; -- fail +ERROR: function anyctest(int4multirange, nummultirange) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(multirange(int4range(11... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anyctest(anycompatiblemultirange, anycompatiblemultirange); +-- fail, can't infer result type: +create function anyctest(anycompatible) +returns anycompatiblemultirange as $$ + select $1 +$$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anycompatiblemultirange requires at least one input of type anycompatiblerange or anycompatiblemultirange. +create function anyctest(anycompatiblenonarray, anycompatiblenonarray) +returns anycompatiblearray as $$ + select array[$1, $2] +$$ language sql; +select x, pg_typeof(x) from anyctest(11, 12) x; + x | pg_typeof +---------+----------- + {11,12} | integer[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, 12.3) x; + x | pg_typeof +-----------+----------- + {11,12.3} | numeric[] +(1 row) + +select x, pg_typeof(x) from anyctest(array[11], array[1,2]) x; -- fail +ERROR: function anyctest(integer[], integer[]) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(array[11], array[1,2]) ... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anyctest(anycompatiblenonarray, anycompatiblenonarray); +create function anyctest(a anyelement, b anyarray, + c anycompatible, d anycompatible) +returns anycompatiblearray as $$ + select array[c, d] +$$ language sql; +select x, pg_typeof(x) from anyctest(11, array[1, 2], 42, 34.5) x; + x | pg_typeof +-----------+----------- + {42,34.5} | numeric[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, array[1, 2], point(1,2), point(3,4)) x; + x | pg_typeof +-------------------+----------- + {"(1,2)","(3,4)"} | point[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, '{1,2}', point(1,2), '(3,4)') x; + x | pg_typeof +-------------------+----------- + {"(1,2)","(3,4)"} | point[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, array[1, 2.2], 42, 34.5) x; -- fail +ERROR: function anyctest(integer, numeric[], integer, numeric) does not exist +LINE 1: select x, pg_typeof(x) from anyctest(11, array[1, 2.2], 42, ... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anyctest(a anyelement, b anyarray, + c anycompatible, d anycompatible); +create function anyctest(variadic anycompatiblearray) +returns anycompatiblearray as $$ + select $1 +$$ language sql; +select x, pg_typeof(x) from anyctest(11, 12) x; + x | pg_typeof +---------+----------- + {11,12} | integer[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, 12.2) x; + x | pg_typeof +-----------+----------- + {11,12.2} | numeric[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, '12') x; + x | pg_typeof +---------+----------- + {11,12} | integer[] +(1 row) + +select x, pg_typeof(x) from anyctest(11, '12.2') x; -- fail +ERROR: invalid input syntax for type integer: "12.2" +LINE 1: select x, pg_typeof(x) from anyctest(11, '12.2') x; + ^ +select x, pg_typeof(x) from anyctest(variadic array[11, 12]) x; + x | pg_typeof +---------+----------- + {11,12} | integer[] +(1 row) + +select x, pg_typeof(x) from anyctest(variadic array[11, 12.2]) x; + x | pg_typeof +-----------+----------- + {11,12.2} | numeric[] +(1 row) + +drop function anyctest(variadic anycompatiblearray); diff --git a/src/test/singlenode_regress/expected/portals.out b/src/test/singlenode_regress/expected/portals.out new file mode 100644 index 00000000000..783288b50aa --- /dev/null +++ b/src/test/singlenode_regress/expected/portals.out @@ -0,0 +1,1296 @@ +set optimizer_print_missing_stats = off; +-- +-- Cursor regression tests +-- +BEGIN; +DECLARE foo1 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo2 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo3 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo4 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo5 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo6 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo7 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo8 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo9 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo10 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo11 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo12 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo13 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo14 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo15 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo16 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo17 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo18 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo19 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo20 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo21 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +DECLARE foo22 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +DECLARE foo23 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +FETCH 1 in foo1; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx +(1 row) + +FETCH 2 in foo2; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx +(2 rows) + +FETCH 3 in foo3; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx +(3 rows) + +FETCH 4 in foo4; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx +(4 rows) + +FETCH 5 in foo5; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx +(5 rows) + +FETCH 6 in foo6; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx +(6 rows) + +FETCH 7 in foo7; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx +(7 rows) + +FETCH 8 in foo8; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx + 6 | 2855 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | VFEAAA | VVVVxx + 7 | 8518 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | QPMAAA | OOOOxx +(8 rows) + +FETCH 9 in foo9; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx + 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx + 4321 | 8 | 1 | 1 | 1 | 1 | 21 | 321 | 321 | 4321 | 4321 | 42 | 43 | FKAAAA | IAAAAA | AAAAxx +(9 rows) + +FETCH 10 in foo10; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx + 6 | 2855 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | VFEAAA | VVVVxx + 7 | 8518 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | QPMAAA | OOOOxx + 8 | 5435 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | BBIAAA | VVVVxx + 9 | 4463 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | RPGAAA | VVVVxx +(10 rows) + +FETCH 11 in foo11; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx + 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx + 4321 | 8 | 1 | 1 | 1 | 1 | 21 | 321 | 321 | 4321 | 4321 | 42 | 43 | FKAAAA | IAAAAA | AAAAxx + 3043 | 9 | 1 | 3 | 3 | 3 | 43 | 43 | 1043 | 3043 | 3043 | 86 | 87 | BNAAAA | JAAAAA | HHHHxx + 1314 | 10 | 0 | 2 | 4 | 14 | 14 | 314 | 1314 | 1314 | 1314 | 28 | 29 | OYAAAA | KAAAAA | OOOOxx +(11 rows) + +FETCH 12 in foo12; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx + 6 | 2855 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | VFEAAA | VVVVxx + 7 | 8518 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | QPMAAA | OOOOxx + 8 | 5435 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | BBIAAA | VVVVxx + 9 | 4463 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | RPGAAA | VVVVxx + 10 | 8788 | 0 | 2 | 0 | 10 | 10 | 10 | 10 | 10 | 10 | 20 | 21 | KAAAAA | AANAAA | AAAAxx + 11 | 8396 | 1 | 3 | 1 | 11 | 11 | 11 | 11 | 11 | 11 | 22 | 23 | LAAAAA | YKMAAA | AAAAxx +(12 rows) + +FETCH 13 in foo13; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx + 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx + 4321 | 8 | 1 | 1 | 1 | 1 | 21 | 321 | 321 | 4321 | 4321 | 42 | 43 | FKAAAA | IAAAAA | AAAAxx + 3043 | 9 | 1 | 3 | 3 | 3 | 43 | 43 | 1043 | 3043 | 3043 | 86 | 87 | BNAAAA | JAAAAA | HHHHxx + 1314 | 10 | 0 | 2 | 4 | 14 | 14 | 314 | 1314 | 1314 | 1314 | 28 | 29 | OYAAAA | KAAAAA | OOOOxx + 1504 | 11 | 0 | 0 | 4 | 4 | 4 | 504 | 1504 | 1504 | 1504 | 8 | 9 | WFAAAA | LAAAAA | VVVVxx + 5222 | 12 | 0 | 2 | 2 | 2 | 22 | 222 | 1222 | 222 | 5222 | 44 | 45 | WSAAAA | MAAAAA | AAAAxx +(13 rows) + +FETCH 14 in foo14; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx + 6 | 2855 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | VFEAAA | VVVVxx + 7 | 8518 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | QPMAAA | OOOOxx + 8 | 5435 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | BBIAAA | VVVVxx + 9 | 4463 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | RPGAAA | VVVVxx + 10 | 8788 | 0 | 2 | 0 | 10 | 10 | 10 | 10 | 10 | 10 | 20 | 21 | KAAAAA | AANAAA | AAAAxx + 11 | 8396 | 1 | 3 | 1 | 11 | 11 | 11 | 11 | 11 | 11 | 22 | 23 | LAAAAA | YKMAAA | AAAAxx + 12 | 6605 | 0 | 0 | 2 | 12 | 12 | 12 | 12 | 12 | 12 | 24 | 25 | MAAAAA | BUJAAA | HHHHxx + 13 | 5696 | 1 | 1 | 3 | 13 | 13 | 13 | 13 | 13 | 13 | 26 | 27 | NAAAAA | CLIAAA | AAAAxx +(14 rows) + +FETCH 15 in foo15; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx + 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx + 4321 | 8 | 1 | 1 | 1 | 1 | 21 | 321 | 321 | 4321 | 4321 | 42 | 43 | FKAAAA | IAAAAA | AAAAxx + 3043 | 9 | 1 | 3 | 3 | 3 | 43 | 43 | 1043 | 3043 | 3043 | 86 | 87 | BNAAAA | JAAAAA | HHHHxx + 1314 | 10 | 0 | 2 | 4 | 14 | 14 | 314 | 1314 | 1314 | 1314 | 28 | 29 | OYAAAA | KAAAAA | OOOOxx + 1504 | 11 | 0 | 0 | 4 | 4 | 4 | 504 | 1504 | 1504 | 1504 | 8 | 9 | WFAAAA | LAAAAA | VVVVxx + 5222 | 12 | 0 | 2 | 2 | 2 | 22 | 222 | 1222 | 222 | 5222 | 44 | 45 | WSAAAA | MAAAAA | AAAAxx + 6243 | 13 | 1 | 3 | 3 | 3 | 43 | 243 | 243 | 1243 | 6243 | 86 | 87 | DGAAAA | NAAAAA | HHHHxx + 5471 | 14 | 1 | 3 | 1 | 11 | 71 | 471 | 1471 | 471 | 5471 | 142 | 143 | LCAAAA | OAAAAA | OOOOxx +(15 rows) + +FETCH 16 in foo16; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx + 6 | 2855 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | VFEAAA | VVVVxx + 7 | 8518 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | QPMAAA | OOOOxx + 8 | 5435 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | BBIAAA | VVVVxx + 9 | 4463 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | RPGAAA | VVVVxx + 10 | 8788 | 0 | 2 | 0 | 10 | 10 | 10 | 10 | 10 | 10 | 20 | 21 | KAAAAA | AANAAA | AAAAxx + 11 | 8396 | 1 | 3 | 1 | 11 | 11 | 11 | 11 | 11 | 11 | 22 | 23 | LAAAAA | YKMAAA | AAAAxx + 12 | 6605 | 0 | 0 | 2 | 12 | 12 | 12 | 12 | 12 | 12 | 24 | 25 | MAAAAA | BUJAAA | HHHHxx + 13 | 5696 | 1 | 1 | 3 | 13 | 13 | 13 | 13 | 13 | 13 | 26 | 27 | NAAAAA | CLIAAA | AAAAxx + 14 | 4341 | 0 | 2 | 4 | 14 | 14 | 14 | 14 | 14 | 14 | 28 | 29 | OAAAAA | ZKGAAA | HHHHxx + 15 | 1358 | 1 | 3 | 5 | 15 | 15 | 15 | 15 | 15 | 15 | 30 | 31 | PAAAAA | GACAAA | OOOOxx +(16 rows) + +FETCH 17 in foo17; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx + 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx + 4321 | 8 | 1 | 1 | 1 | 1 | 21 | 321 | 321 | 4321 | 4321 | 42 | 43 | FKAAAA | IAAAAA | AAAAxx + 3043 | 9 | 1 | 3 | 3 | 3 | 43 | 43 | 1043 | 3043 | 3043 | 86 | 87 | BNAAAA | JAAAAA | HHHHxx + 1314 | 10 | 0 | 2 | 4 | 14 | 14 | 314 | 1314 | 1314 | 1314 | 28 | 29 | OYAAAA | KAAAAA | OOOOxx + 1504 | 11 | 0 | 0 | 4 | 4 | 4 | 504 | 1504 | 1504 | 1504 | 8 | 9 | WFAAAA | LAAAAA | VVVVxx + 5222 | 12 | 0 | 2 | 2 | 2 | 22 | 222 | 1222 | 222 | 5222 | 44 | 45 | WSAAAA | MAAAAA | AAAAxx + 6243 | 13 | 1 | 3 | 3 | 3 | 43 | 243 | 243 | 1243 | 6243 | 86 | 87 | DGAAAA | NAAAAA | HHHHxx + 5471 | 14 | 1 | 3 | 1 | 11 | 71 | 471 | 1471 | 471 | 5471 | 142 | 143 | LCAAAA | OAAAAA | OOOOxx + 5006 | 15 | 0 | 2 | 6 | 6 | 6 | 6 | 1006 | 6 | 5006 | 12 | 13 | OKAAAA | PAAAAA | VVVVxx + 5387 | 16 | 1 | 3 | 7 | 7 | 87 | 387 | 1387 | 387 | 5387 | 174 | 175 | FZAAAA | QAAAAA | AAAAxx +(17 rows) + +FETCH 18 in foo18; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx + 6 | 2855 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | VFEAAA | VVVVxx + 7 | 8518 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | QPMAAA | OOOOxx + 8 | 5435 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | BBIAAA | VVVVxx + 9 | 4463 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | RPGAAA | VVVVxx + 10 | 8788 | 0 | 2 | 0 | 10 | 10 | 10 | 10 | 10 | 10 | 20 | 21 | KAAAAA | AANAAA | AAAAxx + 11 | 8396 | 1 | 3 | 1 | 11 | 11 | 11 | 11 | 11 | 11 | 22 | 23 | LAAAAA | YKMAAA | AAAAxx + 12 | 6605 | 0 | 0 | 2 | 12 | 12 | 12 | 12 | 12 | 12 | 24 | 25 | MAAAAA | BUJAAA | HHHHxx + 13 | 5696 | 1 | 1 | 3 | 13 | 13 | 13 | 13 | 13 | 13 | 26 | 27 | NAAAAA | CLIAAA | AAAAxx + 14 | 4341 | 0 | 2 | 4 | 14 | 14 | 14 | 14 | 14 | 14 | 28 | 29 | OAAAAA | ZKGAAA | HHHHxx + 15 | 1358 | 1 | 3 | 5 | 15 | 15 | 15 | 15 | 15 | 15 | 30 | 31 | PAAAAA | GACAAA | OOOOxx + 16 | 9675 | 0 | 0 | 6 | 16 | 16 | 16 | 16 | 16 | 16 | 32 | 33 | QAAAAA | DIOAAA | VVVVxx + 17 | 8274 | 1 | 1 | 7 | 17 | 17 | 17 | 17 | 17 | 17 | 34 | 35 | RAAAAA | GGMAAA | OOOOxx +(18 rows) + +FETCH 19 in foo19; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx + 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx + 4321 | 8 | 1 | 1 | 1 | 1 | 21 | 321 | 321 | 4321 | 4321 | 42 | 43 | FKAAAA | IAAAAA | AAAAxx + 3043 | 9 | 1 | 3 | 3 | 3 | 43 | 43 | 1043 | 3043 | 3043 | 86 | 87 | BNAAAA | JAAAAA | HHHHxx + 1314 | 10 | 0 | 2 | 4 | 14 | 14 | 314 | 1314 | 1314 | 1314 | 28 | 29 | OYAAAA | KAAAAA | OOOOxx + 1504 | 11 | 0 | 0 | 4 | 4 | 4 | 504 | 1504 | 1504 | 1504 | 8 | 9 | WFAAAA | LAAAAA | VVVVxx + 5222 | 12 | 0 | 2 | 2 | 2 | 22 | 222 | 1222 | 222 | 5222 | 44 | 45 | WSAAAA | MAAAAA | AAAAxx + 6243 | 13 | 1 | 3 | 3 | 3 | 43 | 243 | 243 | 1243 | 6243 | 86 | 87 | DGAAAA | NAAAAA | HHHHxx + 5471 | 14 | 1 | 3 | 1 | 11 | 71 | 471 | 1471 | 471 | 5471 | 142 | 143 | LCAAAA | OAAAAA | OOOOxx + 5006 | 15 | 0 | 2 | 6 | 6 | 6 | 6 | 1006 | 6 | 5006 | 12 | 13 | OKAAAA | PAAAAA | VVVVxx + 5387 | 16 | 1 | 3 | 7 | 7 | 87 | 387 | 1387 | 387 | 5387 | 174 | 175 | FZAAAA | QAAAAA | AAAAxx + 5785 | 17 | 1 | 1 | 5 | 5 | 85 | 785 | 1785 | 785 | 5785 | 170 | 171 | NOAAAA | RAAAAA | HHHHxx + 6621 | 18 | 1 | 1 | 1 | 1 | 21 | 621 | 621 | 1621 | 6621 | 42 | 43 | RUAAAA | SAAAAA | OOOOxx +(19 rows) + +FETCH 20 in foo20; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx + 6 | 2855 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | VFEAAA | VVVVxx + 7 | 8518 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | QPMAAA | OOOOxx + 8 | 5435 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | BBIAAA | VVVVxx + 9 | 4463 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | RPGAAA | VVVVxx + 10 | 8788 | 0 | 2 | 0 | 10 | 10 | 10 | 10 | 10 | 10 | 20 | 21 | KAAAAA | AANAAA | AAAAxx + 11 | 8396 | 1 | 3 | 1 | 11 | 11 | 11 | 11 | 11 | 11 | 22 | 23 | LAAAAA | YKMAAA | AAAAxx + 12 | 6605 | 0 | 0 | 2 | 12 | 12 | 12 | 12 | 12 | 12 | 24 | 25 | MAAAAA | BUJAAA | HHHHxx + 13 | 5696 | 1 | 1 | 3 | 13 | 13 | 13 | 13 | 13 | 13 | 26 | 27 | NAAAAA | CLIAAA | AAAAxx + 14 | 4341 | 0 | 2 | 4 | 14 | 14 | 14 | 14 | 14 | 14 | 28 | 29 | OAAAAA | ZKGAAA | HHHHxx + 15 | 1358 | 1 | 3 | 5 | 15 | 15 | 15 | 15 | 15 | 15 | 30 | 31 | PAAAAA | GACAAA | OOOOxx + 16 | 9675 | 0 | 0 | 6 | 16 | 16 | 16 | 16 | 16 | 16 | 32 | 33 | QAAAAA | DIOAAA | VVVVxx + 17 | 8274 | 1 | 1 | 7 | 17 | 17 | 17 | 17 | 17 | 17 | 34 | 35 | RAAAAA | GGMAAA | OOOOxx + 18 | 376 | 0 | 2 | 8 | 18 | 18 | 18 | 18 | 18 | 18 | 36 | 37 | SAAAAA | MOAAAA | AAAAxx + 19 | 7303 | 1 | 3 | 9 | 19 | 19 | 19 | 19 | 19 | 19 | 38 | 39 | TAAAAA | XUKAAA | VVVVxx +(20 rows) + +FETCH 21 in foo21; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx + 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx + 4321 | 8 | 1 | 1 | 1 | 1 | 21 | 321 | 321 | 4321 | 4321 | 42 | 43 | FKAAAA | IAAAAA | AAAAxx + 3043 | 9 | 1 | 3 | 3 | 3 | 43 | 43 | 1043 | 3043 | 3043 | 86 | 87 | BNAAAA | JAAAAA | HHHHxx + 1314 | 10 | 0 | 2 | 4 | 14 | 14 | 314 | 1314 | 1314 | 1314 | 28 | 29 | OYAAAA | KAAAAA | OOOOxx + 1504 | 11 | 0 | 0 | 4 | 4 | 4 | 504 | 1504 | 1504 | 1504 | 8 | 9 | WFAAAA | LAAAAA | VVVVxx + 5222 | 12 | 0 | 2 | 2 | 2 | 22 | 222 | 1222 | 222 | 5222 | 44 | 45 | WSAAAA | MAAAAA | AAAAxx + 6243 | 13 | 1 | 3 | 3 | 3 | 43 | 243 | 243 | 1243 | 6243 | 86 | 87 | DGAAAA | NAAAAA | HHHHxx + 5471 | 14 | 1 | 3 | 1 | 11 | 71 | 471 | 1471 | 471 | 5471 | 142 | 143 | LCAAAA | OAAAAA | OOOOxx + 5006 | 15 | 0 | 2 | 6 | 6 | 6 | 6 | 1006 | 6 | 5006 | 12 | 13 | OKAAAA | PAAAAA | VVVVxx + 5387 | 16 | 1 | 3 | 7 | 7 | 87 | 387 | 1387 | 387 | 5387 | 174 | 175 | FZAAAA | QAAAAA | AAAAxx + 5785 | 17 | 1 | 1 | 5 | 5 | 85 | 785 | 1785 | 785 | 5785 | 170 | 171 | NOAAAA | RAAAAA | HHHHxx + 6621 | 18 | 1 | 1 | 1 | 1 | 21 | 621 | 621 | 1621 | 6621 | 42 | 43 | RUAAAA | SAAAAA | OOOOxx + 6969 | 19 | 1 | 1 | 9 | 9 | 69 | 969 | 969 | 1969 | 6969 | 138 | 139 | BIAAAA | TAAAAA | VVVVxx + 9460 | 20 | 0 | 0 | 0 | 0 | 60 | 460 | 1460 | 4460 | 9460 | 120 | 121 | WZAAAA | UAAAAA | AAAAxx +(21 rows) + +FETCH 22 in foo22; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx + 4 | 1621 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | JKCAAA | HHHHxx + 5 | 5557 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | TFIAAA | HHHHxx + 6 | 2855 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | VFEAAA | VVVVxx + 7 | 8518 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | QPMAAA | OOOOxx + 8 | 5435 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | BBIAAA | VVVVxx + 9 | 4463 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | RPGAAA | VVVVxx + 10 | 8788 | 0 | 2 | 0 | 10 | 10 | 10 | 10 | 10 | 10 | 20 | 21 | KAAAAA | AANAAA | AAAAxx + 11 | 8396 | 1 | 3 | 1 | 11 | 11 | 11 | 11 | 11 | 11 | 22 | 23 | LAAAAA | YKMAAA | AAAAxx + 12 | 6605 | 0 | 0 | 2 | 12 | 12 | 12 | 12 | 12 | 12 | 24 | 25 | MAAAAA | BUJAAA | HHHHxx + 13 | 5696 | 1 | 1 | 3 | 13 | 13 | 13 | 13 | 13 | 13 | 26 | 27 | NAAAAA | CLIAAA | AAAAxx + 14 | 4341 | 0 | 2 | 4 | 14 | 14 | 14 | 14 | 14 | 14 | 28 | 29 | OAAAAA | ZKGAAA | HHHHxx + 15 | 1358 | 1 | 3 | 5 | 15 | 15 | 15 | 15 | 15 | 15 | 30 | 31 | PAAAAA | GACAAA | OOOOxx + 16 | 9675 | 0 | 0 | 6 | 16 | 16 | 16 | 16 | 16 | 16 | 32 | 33 | QAAAAA | DIOAAA | VVVVxx + 17 | 8274 | 1 | 1 | 7 | 17 | 17 | 17 | 17 | 17 | 17 | 34 | 35 | RAAAAA | GGMAAA | OOOOxx + 18 | 376 | 0 | 2 | 8 | 18 | 18 | 18 | 18 | 18 | 18 | 36 | 37 | SAAAAA | MOAAAA | AAAAxx + 19 | 7303 | 1 | 3 | 9 | 19 | 19 | 19 | 19 | 19 | 19 | 38 | 39 | TAAAAA | XUKAAA | VVVVxx + 20 | 5574 | 0 | 0 | 0 | 0 | 20 | 20 | 20 | 20 | 20 | 40 | 41 | UAAAAA | KGIAAA | OOOOxx + 21 | 1628 | 1 | 1 | 1 | 1 | 21 | 21 | 21 | 21 | 21 | 42 | 43 | VAAAAA | QKCAAA | AAAAxx +(22 rows) + +FETCH 23 in foo23; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx + 3420 | 2 | 0 | 0 | 0 | 0 | 20 | 420 | 1420 | 3420 | 3420 | 40 | 41 | OBAAAA | CAAAAA | OOOOxx + 9850 | 3 | 0 | 2 | 0 | 10 | 50 | 850 | 1850 | 4850 | 9850 | 100 | 101 | WOAAAA | DAAAAA | VVVVxx + 7164 | 4 | 0 | 0 | 4 | 4 | 64 | 164 | 1164 | 2164 | 7164 | 128 | 129 | OPAAAA | EAAAAA | AAAAxx + 8009 | 5 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 3009 | 8009 | 18 | 19 | BWAAAA | FAAAAA | HHHHxx + 5057 | 6 | 1 | 1 | 7 | 17 | 57 | 57 | 1057 | 57 | 5057 | 114 | 115 | NMAAAA | GAAAAA | OOOOxx + 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx + 4321 | 8 | 1 | 1 | 1 | 1 | 21 | 321 | 321 | 4321 | 4321 | 42 | 43 | FKAAAA | IAAAAA | AAAAxx + 3043 | 9 | 1 | 3 | 3 | 3 | 43 | 43 | 1043 | 3043 | 3043 | 86 | 87 | BNAAAA | JAAAAA | HHHHxx + 1314 | 10 | 0 | 2 | 4 | 14 | 14 | 314 | 1314 | 1314 | 1314 | 28 | 29 | OYAAAA | KAAAAA | OOOOxx + 1504 | 11 | 0 | 0 | 4 | 4 | 4 | 504 | 1504 | 1504 | 1504 | 8 | 9 | WFAAAA | LAAAAA | VVVVxx + 5222 | 12 | 0 | 2 | 2 | 2 | 22 | 222 | 1222 | 222 | 5222 | 44 | 45 | WSAAAA | MAAAAA | AAAAxx + 6243 | 13 | 1 | 3 | 3 | 3 | 43 | 243 | 243 | 1243 | 6243 | 86 | 87 | DGAAAA | NAAAAA | HHHHxx + 5471 | 14 | 1 | 3 | 1 | 11 | 71 | 471 | 1471 | 471 | 5471 | 142 | 143 | LCAAAA | OAAAAA | OOOOxx + 5006 | 15 | 0 | 2 | 6 | 6 | 6 | 6 | 1006 | 6 | 5006 | 12 | 13 | OKAAAA | PAAAAA | VVVVxx + 5387 | 16 | 1 | 3 | 7 | 7 | 87 | 387 | 1387 | 387 | 5387 | 174 | 175 | FZAAAA | QAAAAA | AAAAxx + 5785 | 17 | 1 | 1 | 5 | 5 | 85 | 785 | 1785 | 785 | 5785 | 170 | 171 | NOAAAA | RAAAAA | HHHHxx + 6621 | 18 | 1 | 1 | 1 | 1 | 21 | 621 | 621 | 1621 | 6621 | 42 | 43 | RUAAAA | SAAAAA | OOOOxx + 6969 | 19 | 1 | 1 | 9 | 9 | 69 | 969 | 969 | 1969 | 6969 | 138 | 139 | BIAAAA | TAAAAA | VVVVxx + 9460 | 20 | 0 | 0 | 0 | 0 | 60 | 460 | 1460 | 4460 | 9460 | 120 | 121 | WZAAAA | UAAAAA | AAAAxx + 59 | 21 | 1 | 3 | 9 | 19 | 59 | 59 | 59 | 59 | 59 | 118 | 119 | HCAAAA | VAAAAA | HHHHxx + 8020 | 22 | 0 | 0 | 0 | 0 | 20 | 20 | 20 | 3020 | 8020 | 40 | 41 | MWAAAA | WAAAAA | OOOOxx +(23 rows) + +CLOSE foo1; +CLOSE foo2; +CLOSE foo3; +CLOSE foo4; +CLOSE foo5; +CLOSE foo6; +CLOSE foo7; +CLOSE foo8; +CLOSE foo9; +CLOSE foo10; +CLOSE foo11; +CLOSE foo12; +-- leave some cursors open, to test that auto-close works. +-- record this in the system view as well (don't query the time field there +-- however) +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY 1; + name | statement | is_holdable | is_binary | is_scrollable +-------+-----------------------------------------------------------------------+-------------+-----------+--------------- + foo13 | DECLARE foo13 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; | f | f | f + foo14 | DECLARE foo14 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; | f | f | f + foo15 | DECLARE foo15 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; | f | f | f + foo16 | DECLARE foo16 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; | f | f | f + foo17 | DECLARE foo17 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; | f | f | f + foo18 | DECLARE foo18 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; | f | f | f + foo19 | DECLARE foo19 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; | f | f | f + foo20 | DECLARE foo20 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; | f | f | f + foo21 | DECLARE foo21 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; | f | f | f + foo22 | DECLARE foo22 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; | f | f | f + foo23 | DECLARE foo23 SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; | f | f | f +(11 rows) + +END; +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors; + name | statement | is_holdable | is_binary | is_scrollable +------+-----------+-------------+-----------+--------------- +(0 rows) + +-- +-- NO SCROLL disallows backward fetching +-- +BEGIN; +DECLARE foo24 NO SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +FETCH 1 FROM foo24; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx +(1 row) + +FETCH BACKWARD 1 FROM foo24; -- should fail +ERROR: backward scan is not supported in this version of Cloudberry Database +END; +-- +-- Cursors outside transaction blocks +-- +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors; + name | statement | is_holdable | is_binary | is_scrollable +------+-----------+-------------+-----------+--------------- +(0 rows) + +BEGIN; +DECLARE foo25 CURSOR WITH HOLD FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +FETCH FROM foo25; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(1 row) + +FETCH FROM foo25; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx +(1 row) + +COMMIT; +FETCH FROM foo25; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx +(1 row) + +--FETCH BACKWARD FROM foo25; -- backwards scans not supported in GPDB +--FETCH ABSOLUTE -1 FROM foo25; -- backwards scans not supported in GPDB +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors; + name | statement | is_holdable | is_binary | is_scrollable +-------+--------------------------------------------------------------------------+-------------+-----------+--------------- + foo25 | DECLARE foo25 CURSOR WITH HOLD FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; | t | f | f +(1 row) + +CLOSE foo25; +BEGIN; +DECLARE foo25ns NO SCROLL CURSOR WITH HOLD FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; +FETCH FROM foo25ns; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(1 row) + +FETCH FROM foo25ns; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 1 | 2838 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | EFEAAA | OOOOxx +(1 row) + +COMMIT; +FETCH FROM foo25ns; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx +(1 row) + +FETCH ABSOLUTE 4 FROM foo25ns; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 3 | 5679 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | LKIAAA | VVVVxx +(1 row) + +FETCH ABSOLUTE 4 FROM foo25ns; -- fail +ERROR: cursor can only scan forward +HINT: Declare it with SCROLL option to enable backward scan. +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors; + name | statement | is_holdable | is_binary | is_scrollable +---------+--------------------------------------------------------------------------------------+-------------+-----------+--------------- + foo25ns | DECLARE foo25ns NO SCROLL CURSOR WITH HOLD FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; | t | f | f +(1 row) + +CLOSE foo25ns; +-- +-- ROLLBACK should close holdable cursors +-- +BEGIN; +DECLARE foo26 CURSOR WITH HOLD FOR SELECT * FROM tenk1 ORDER BY unique2; +ROLLBACK; +-- should fail +FETCH FROM foo26; +ERROR: cursor "foo26" does not exist +-- +-- Parameterized DECLARE needs to insert param values into the cursor portal +-- +BEGIN; +CREATE FUNCTION declares_cursor(text) + RETURNS void + AS 'DECLARE c CURSOR FOR SELECT stringu1 FROM tenk1 WHERE stringu1 LIKE $1;' + LANGUAGE SQL READS SQL DATA; +SELECT declares_cursor('AB%'); + declares_cursor +----------------- + +(1 row) + +FETCH ALL FROM c; + stringu1 +---------- + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA + ABAAAA +(15 rows) + +ROLLBACK; +-- +-- Test behavior of both volatile and stable functions inside a cursor; +-- in particular we want to see what happens during commit of a holdable +-- cursor +-- +create temp table tt1(f1 int); +create function count_tt1_v() returns int8 as +'select count(*) from tt1' language sql volatile READS SQL DATA; +create function count_tt1_s() returns int8 as +'select count(*) from tt1' language sql stable READS SQL DATA; +begin; +insert into tt1 values(1); +declare c1 cursor for select count_tt1_v(), count_tt1_s(); +insert into tt1 values(2); +-- fetch all from c1; -- DISABLED: see open JIRA MPP-835 +rollback; +begin; +insert into tt1 values(1); +declare c2 cursor with hold for select count_tt1_v(), count_tt1_s(); +insert into tt1 values(2); +commit; +delete from tt1; +-- fetch all from c2; -- DISABLED: see open JIRA MPP-835 +drop function count_tt1_v(); +drop function count_tt1_s(); +-- Create a cursor with the BINARY option and check the pg_cursors view +BEGIN; +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors; + name | statement | is_holdable | is_binary | is_scrollable +------+----------------------------------------------------------------------+-------------+-----------+--------------- + c2 | declare c2 cursor with hold for select count_tt1_v(), count_tt1_s(); | t | f | f +(1 row) + +DECLARE bc BINARY CURSOR FOR SELECT * FROM tenk1; +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors; + name | statement | is_holdable | is_binary | is_scrollable +------+----------------------------------------------------------------------+-------------+-----------+--------------- + bc | DECLARE bc BINARY CURSOR FOR SELECT * FROM tenk1; | f | t | f + c2 | declare c2 cursor with hold for select count_tt1_v(), count_tt1_s(); | t | f | f +(2 rows) + +ROLLBACK; +-- We should not see the portal that is created internally to +-- implement EXECUTE in pg_cursors +PREPARE cprep AS + SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors; +EXECUTE cprep; + name | statement | is_holdable | is_binary | is_scrollable +------+----------------------------------------------------------------------+-------------+-----------+--------------- + c2 | declare c2 cursor with hold for select count_tt1_v(), count_tt1_s(); | t | f | f +(1 row) + +-- test CLOSE ALL; +SELECT name FROM pg_cursors ORDER BY 1; + name +------ + c2 +(1 row) + +CLOSE ALL; +SELECT name FROM pg_cursors ORDER BY 1; + name +------ +(0 rows) + +BEGIN; +DECLARE foo1 CURSOR WITH HOLD FOR SELECT 1; +DECLARE foo2 CURSOR WITHOUT HOLD FOR SELECT 1; +SELECT name FROM pg_cursors ORDER BY 1; + name +------ + foo1 + foo2 +(2 rows) + +CLOSE ALL; +SELECT name FROM pg_cursors ORDER BY 1; + name +------ +(0 rows) + +COMMIT; +-- +-- Tests for updatable cursors +-- +-- In GPDB, we use a dummy column as distribution key, so that all the +-- rows land on the same segment. Otherwise the order the cursor returns +-- the rows is unstable. +CREATE TEMP TABLE uctest(f1 int, f2 text, distkey text); +INSERT INTO uctest VALUES (1, 'one'), (2, 'two'), (3, 'three'); +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 1 | one + 2 | two + 3 | three +(3 rows) + +-- Check DELETE WHERE CURRENT +BEGIN; +DECLARE c1 CURSOR FOR SELECT f1, f2 FROM uctest; +FETCH 2 FROM c1; + f1 | f2 +----+----- + 1 | one + 2 | two +(2 rows) + +DELETE FROM uctest WHERE CURRENT OF c1; +-- should show deletion +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 1 | one + 3 | three +(2 rows) + +-- cursor did not move +FETCH ALL FROM c1; + f1 | f2 +----+------- + 3 | three +(1 row) + +-- cursor is insensitive +--MOVE BACKWARD ALL IN c1; -- backwards scans not supported in GPDB +--FETCH ALL FROM c1; +COMMIT; +-- should still see deletion +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 1 | one + 3 | three +(2 rows) + +-- Check UPDATE WHERE CURRENT; this time use FOR UPDATE +BEGIN; +DECLARE c1 CURSOR FOR SELECT f1, f2 FROM uctest FOR UPDATE; +FETCH c1; + f1 | f2 +----+----- + 1 | one +(1 row) + +UPDATE uctest SET f1 = 8 WHERE CURRENT OF c1; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 3 | three + 8 | one +(2 rows) + +COMMIT; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 3 | three + 8 | one +(2 rows) + +-- Check repeated-update and update-then-delete cases +BEGIN; +DECLARE c1 CURSOR FOR SELECT f1, f2 FROM uctest; +FETCH c1; + f1 | f2 +----+------- + 3 | three +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 8 | one + 13 | three +(2 rows) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 8 | one + 23 | three +(2 rows) + +-- insensitive cursor should not show effects of updates or deletes +--FETCH RELATIVE 0 FROM c1; -- backwards scans not supported in GPDB +DELETE FROM uctest WHERE CURRENT OF c1; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+----- + 8 | one +(1 row) + +DELETE FROM uctest WHERE CURRENT OF c1; -- no-op +SELECT f1, f2 FROM uctest; + f1 | f2 +----+----- + 8 | one +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; -- no-op +SELECT f1, f2 FROM uctest; + f1 | f2 +----+----- + 8 | one +(1 row) + +--FETCH RELATIVE 0 FROM c1; -- backwards scans not supported in GPDB +ROLLBACK; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 3 | three + 8 | one +(2 rows) + +BEGIN; +DECLARE c1 CURSOR FOR SELECT f1, f2 FROM uctest FOR UPDATE; +FETCH c1; + f1 | f2 +----+------- + 3 | three +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 8 | one + 13 | three +(2 rows) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 8 | one + 23 | three +(2 rows) + +DELETE FROM uctest WHERE CURRENT OF c1; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+----- + 8 | one +(1 row) + +DELETE FROM uctest WHERE CURRENT OF c1; -- no-op +SELECT f1, f2 FROM uctest; + f1 | f2 +----+----- + 8 | one +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; -- no-op +SELECT f1, f2 FROM uctest; + f1 | f2 +----+----- + 8 | one +(1 row) + +--- sensitive cursors can't currently scroll back, so this is an error: +FETCH RELATIVE 0 FROM c1; +ERROR: cursor can only scan forward +HINT: Declare it with SCROLL option to enable backward scan. +ROLLBACK; +SELECT f1, f2 FROM uctest; + f1 | f2 +----+------- + 3 | three + 8 | one +(2 rows) + +-- Check insensitive cursor with INSERT +-- (The above tests don't test the SQL notion of an insensitive cursor +-- correctly, because per SQL standard, changes from WHERE CURRENT OF +-- commands should be visible in the cursor. So here we make the +-- changes with a command that is independent of the cursor.) +BEGIN; +DECLARE c1 INSENSITIVE CURSOR FOR SELECT * FROM uctest; +INSERT INTO uctest VALUES (10, 'ten'); +FETCH NEXT FROM c1; + f1 | f2 | distkey +----+-------+--------- + 3 | three | +(1 row) + +FETCH NEXT FROM c1; + f1 | f2 | distkey +----+-----+--------- + 8 | one | +(1 row) + +FETCH NEXT FROM c1; -- insert not visible + f1 | f2 | distkey +----+----+--------- +(0 rows) + +COMMIT; +SELECT * FROM uctest; + f1 | f2 | distkey +----+-------+--------- + 3 | three | + 8 | one | + 10 | ten | +(3 rows) + +DELETE FROM uctest WHERE f1 = 10; -- restore test table state +-- Check inheritance cases +CREATE TEMP TABLE ucchild () inherits (uctest); +INSERT INTO ucchild values(100, 'hundred'); +SELECT f1, f2 FROM uctest; + f1 | f2 +-----+--------- + 3 | three + 8 | one + 100 | hundred +(3 rows) + +BEGIN; +DECLARE c1 CURSOR FOR SELECT f1, f2 FROM uctest FOR UPDATE; +FETCH 1 FROM c1; + f1 | f2 +----+------- + 3 | three +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; +FETCH 1 FROM c1; + f1 | f2 +----+----- + 8 | one +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; +FETCH 1 FROM c1; + f1 | f2 +-----+--------- + 100 | hundred +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; +FETCH 1 FROM c1; + f1 | f2 +----+---- +(0 rows) + +COMMIT; +SELECT f1, f2 FROM uctest; + f1 | f2 +-----+--------- + 13 | three + 18 | one + 110 | hundred +(3 rows) + +-- Can update from a self-join, but only if FOR UPDATE says which to use +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM uctest a, uctest b WHERE a.f1 = b.f1 + 5; +FETCH 1 FROM c1; + f1 | f2 | distkey | f1 | f2 | distkey +----+-----+---------+----+-------+--------- + 18 | one | | 13 | three | +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; -- fail +ERROR: cursor "c1" is not a simply updatable scan of table "uctest" +ROLLBACK; +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM uctest a, uctest b WHERE a.f1 = b.f1 + 5 FOR UPDATE; +FETCH 1 FROM c1; + f1 | f2 | distkey | f1 | f2 | distkey +----+-----+---------+----+-------+--------- + 18 | one | | 13 | three | +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; -- fail +ERROR: cursor "c1" is not a simply updatable scan of table "uctest" +ROLLBACK; +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM uctest a, uctest b WHERE a.f1 = b.f1 + 5 FOR SHARE OF a; +FETCH 1 FROM c1; + f1 | f2 | distkey | f1 | f2 | distkey +----+-----+---------+----+-------+--------- + 18 | one | | 13 | three | +(1 row) + +UPDATE uctest SET f1 = f1 + 10 WHERE CURRENT OF c1; +ERROR: cursor "c1" is not a simply updatable scan of table "uctest" +SELECT * FROM uctest; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- Check various error cases +DELETE FROM uctest WHERE CURRENT OF c1; -- fail, no such cursor +ERROR: cursor "c1" does not exist +DECLARE cx CURSOR WITH HOLD FOR SELECT * FROM uctest; +DELETE FROM uctest WHERE CURRENT OF cx; -- fail, can't use held cursor +ERROR: cursor "cx" is held from a previous transaction +BEGIN; +DECLARE c CURSOR FOR SELECT * FROM tenk2; +DELETE FROM uctest WHERE CURRENT OF c; -- fail, cursor on wrong table +ERROR: cursor "c" is not a simply updatable scan of table "uctest" +ROLLBACK; +BEGIN; +DECLARE c CURSOR FOR SELECT * FROM tenk2 FOR SHARE; +DELETE FROM uctest WHERE CURRENT OF c; -- fail, cursor on wrong table +ERROR: cursor "c" is not a simply updatable scan of table "uctest" +ROLLBACK; +BEGIN; +DECLARE c CURSOR FOR SELECT * FROM tenk1 JOIN tenk2 USING (unique1); +DELETE FROM tenk1 WHERE CURRENT OF c; -- fail, cursor is on a join +ERROR: cursor "c" is not a simply updatable scan of table "tenk1" +ROLLBACK; +BEGIN; +DECLARE c CURSOR FOR SELECT f1,count(*) FROM uctest GROUP BY f1; +DELETE FROM uctest WHERE CURRENT OF c; -- fail, cursor is on aggregation +ERROR: cursor "c" is not a simply updatable scan of table "uctest" +ROLLBACK; +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM uctest; +DELETE FROM uctest WHERE CURRENT OF c1; -- fail, no current row +ERROR: cursor "c1" is not positioned on a row +ROLLBACK; +BEGIN; +DECLARE c1 CURSOR FOR SELECT MIN(f1) FROM uctest FOR UPDATE; +ERROR: FOR UPDATE is not allowed with aggregate functions +ROLLBACK; +-- WHERE CURRENT OF may someday work with views, but today is not that day. +-- For now, just make sure it errors out cleanly. +CREATE TEMP VIEW ucview AS SELECT f1, f2 FROM uctest; +CREATE RULE ucrule AS ON DELETE TO ucview DO INSTEAD + DELETE FROM uctest WHERE f1 = OLD.f1; +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM ucview; +FETCH FROM c1; + f1 | f2 +----+------- + 13 | three +(1 row) + +DELETE FROM ucview WHERE CURRENT OF c1; -- fail, views not supported +ERROR: WHERE CURRENT OF on a view is not implemented +ROLLBACK; +-- Check cursors for functions. +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM LOWER('TEST'); +FETCH ALL FROM c1; + lower +------- + test +(1 row) + +COMMIT; +-- Check WHERE CURRENT OF with an index-only scan +BEGIN; +EXPLAIN (costs off) +DECLARE c1 CURSOR FOR SELECT stringu1 FROM onek WHERE stringu1 = 'DZAAAA'; + QUERY PLAN +--------------------------------------------- + Index Only Scan using onek_stringu1 on onek + Index Cond: (stringu1 = 'DZAAAA'::name) + Optimizer: Postgres query optimizer +(3 rows) + +DECLARE c1 CURSOR FOR SELECT stringu1 FROM onek WHERE stringu1 = 'DZAAAA'; +FETCH FROM c1; + stringu1 +---------- + DZAAAA +(1 row) + +DELETE FROM onek WHERE CURRENT OF c1; +SELECT stringu1 FROM onek WHERE stringu1 = 'DZAAAA'; + stringu1 +---------- +(0 rows) + +ROLLBACK; +-- start_ignore +-- ignore the block, because cursor can only scan forward +-- Check behavior with rewinding to a previous child scan node, +-- as per bug #15395 +BEGIN; +CREATE TABLE current_check (currentid int, payload text); +CREATE TABLE current_check_1 () INHERITS (current_check); +CREATE TABLE current_check_2 () INHERITS (current_check); +INSERT INTO current_check_1 SELECT i, 'p' || i FROM generate_series(1,9) i; +INSERT INTO current_check_2 SELECT i, 'P' || i FROM generate_series(10,19) i; +DECLARE c1 SCROLL CURSOR FOR SELECT * FROM current_check; +-- This tests the fetch-backwards code path +FETCH ABSOLUTE 12 FROM c1; + currentid | payload +-----------+--------- + 12 | P12 +(1 row) + +FETCH ABSOLUTE 8 FROM c1; + currentid | payload +-----------+--------- + 8 | p8 +(1 row) + +DELETE FROM current_check WHERE CURRENT OF c1 RETURNING *; + currentid | payload +-----------+--------- + 8 | p8 +(1 row) + +-- This tests the ExecutorRewind code path +FETCH ABSOLUTE 13 FROM c1; + currentid | payload +-----------+--------- + 13 | P13 +(1 row) + +FETCH ABSOLUTE 1 FROM c1; + currentid | payload +-----------+--------- + 1 | p1 +(1 row) + +DELETE FROM current_check WHERE CURRENT OF c1 RETURNING *; + currentid | payload +-----------+--------- + 1 | p1 +(1 row) + +SELECT * FROM current_check; + currentid | payload +-----------+--------- + 2 | p2 + 3 | p3 + 4 | p4 + 5 | p5 + 6 | p6 + 7 | p7 + 9 | p9 + 10 | P10 + 11 | P11 + 12 | P12 + 13 | P13 + 14 | P14 + 15 | P15 + 16 | P16 + 17 | P17 + 18 | P18 + 19 | P19 +(17 rows) + +ROLLBACK; +-- end_ignore +-- Make sure snapshot management works okay, per bug report in +-- 235395b90909301035v7228ce63q392931f15aa74b31@mail.gmail.com +-- GPDB_90_MERGE_FIXME: This doesn't work correctly. Two issues: +-- 1. In GPDB, an UPDATE, or FOR UPDATE, locks the whole table. Because of +-- that, there cannot be concurrent updates, and we don't bother with +-- LockRows nodes in FOR UPDATE plans. However, in the upstream, the +-- LockRows node also handles fetching the latest tuple version, if it +-- was updated in the same transaction, by a *later* command. +-- +-- 2. Even if we had LockRows in the plan, it still wouldn't work, at least +-- not always. In PostgreSQL, the LockRows node checks the visibility +-- when a row is FETCHed. Not before that. So if a row is UPDATEd in +-- the same transaction, before it's FETCHed, the FETCH is supposed to +-- see the effects of the UPDATE. In GPDB, however, a cursor starts +-- executing in the segments, as soon as the DECLARE CURSOR is issued, +-- so there's a race condition. +BEGIN; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +CREATE TABLE cursor (a int, b int); +INSERT INTO cursor VALUES (1, 1); +DECLARE c1 NO SCROLL CURSOR FOR SELECT * FROM cursor FOR UPDATE; +UPDATE cursor SET b = 2; +FETCH ALL FROM c1; + a | b +---+--- + 1 | 1 +(1 row) + +COMMIT; +DROP TABLE cursor; +-- Check rewinding a cursor containing a stable function in LIMIT, +-- per bug report in 8336843.9833.1399385291498.JavaMail.root@quick +-- GPDB: ignore the result of the FETCH, because the order the rows +-- arrive from the segments is arbitrary in GPDB. This test isn't +-- very useful in GPDB anyway, as the bug that this was testing +-- happened when rewinding the cursor, and GPDB doesn't support +-- MOVE BACKWARD at all. But doesn't hurt to keep it to the extent +-- we can, I guess.. +begin; +create function nochange(int) returns int + as 'select $1 limit 1' language sql stable; +declare c cursor for select * from int8_tbl limit nochange(3); +-- start_ignore +fetch all from c; + q1 | q2 +------------------+------------------ + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 +(3 rows) + +-- end_ignore +move backward all in c; +ERROR: backward scan is not supported in this version of Cloudberry Database +fetch all from c; +ERROR: current transaction is aborted, commands ignored until end of transaction block +rollback; +-- Check handling of non-backwards-scan-capable plans with scroll cursors +begin; +explain (costs off) declare c1 cursor for select (select 42) as x; + QUERY PLAN +------------------------------------- + Result + InitPlan 1 (returns $0) + -> Result + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) declare c1 scroll cursor for select (select 42) as x; + QUERY PLAN +------------------------------------- + Result + InitPlan 1 (returns $0) + -> Result + Optimizer: Postgres query optimizer +(4 rows) + +declare c1 scroll cursor for select (select 42) as x; +fetch all in c1; + x +---- + 42 +(1 row) + +fetch backward all in c1; +ERROR: backward scan is not supported in this version of Cloudberry Database +rollback; +begin; +explain (costs off) declare c2 cursor for select generate_series(1,3) as g; + QUERY PLAN +------------------------------------- + ProjectSet + -> Result + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) declare c2 scroll cursor for select generate_series(1,3) as g; + QUERY PLAN +------------------------------------- + ProjectSet + -> Result + Optimizer: Postgres query optimizer +(3 rows) + +declare c2 scroll cursor for select generate_series(1,3) as g; +fetch all in c2; + g +--- + 1 + 2 + 3 +(3 rows) + +fetch backward all in c2; +ERROR: backward scan is not supported in this version of Cloudberry Database +rollback; +-- gpdb: Test executor should return NULL directly during commit for holdable +-- cursor if previously executor has emitted all tuples. We've seen two issues +-- below. +-- Assert failure: +-- DETAIL: FailedAssertion("!(!((heap)->bh_size == 0) && heap->bh_has_heap_property)", File: "binaryheap.c", Line: 161) +CREATE TABLE foo1_tbl (a int); +INSERT INTO foo1_tbl values(2); +BEGIN; +DECLARE foo1 CURSOR WITH HOLD FOR SELECT * FROM foo1_tbl ORDER BY a; +FETCH ALL FROM foo1; + a +--- + 2 +(1 row) + +COMMIT; +FETCH ALL FROM foo1; + a +--- +(0 rows) + +CLOSE foo1; +DROP TABLE foo1_tbl; +-- ERROR: cannot execute squelched plan node of type: 232 (execProcnode.c:887) +BEGIN; +DECLARE foo2 CURSOR WITH HOLD FOR SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c where c.reltablespace = t.oid AND c.relname = 'foo1_tbl'; +FETCH ALL FROM foo2; + relname | spcname +---------+--------- +(0 rows) + +COMMIT; +FETCH ALL FROM foo2; + relname | spcname +---------+--------- +(0 rows) + +CLOSE foo2; diff --git a/src/test/singlenode_regress/expected/portals_p2.out b/src/test/singlenode_regress/expected/portals_p2.out new file mode 100644 index 00000000000..1e2365a2a6a --- /dev/null +++ b/src/test/singlenode_regress/expected/portals_p2.out @@ -0,0 +1,122 @@ +-- +-- PORTALS_P2 +-- +BEGIN; +DECLARE foo13 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 50; +DECLARE foo14 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 51; +DECLARE foo15 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 52; +DECLARE foo16 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 53; +DECLARE foo17 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 54; +DECLARE foo18 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 55; +DECLARE foo19 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 56; +DECLARE foo20 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 57; +DECLARE foo21 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 58; +DECLARE foo22 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 59; +DECLARE foo23 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 60; +DECLARE foo24 CURSOR FOR + SELECT * FROM onek2 WHERE unique1 = 50; +DECLARE foo25 CURSOR FOR + SELECT * FROM onek2 WHERE unique1 = 60; +FETCH all in foo13; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 50 | 253 | 0 | 2 | 0 | 10 | 0 | 50 | 50 | 50 | 50 | 0 | 1 | YBAAAA | TJAAAA | HHHHxx +(1 row) + +FETCH all in foo14; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 51 | 76 | 1 | 3 | 1 | 11 | 1 | 51 | 51 | 51 | 51 | 2 | 3 | ZBAAAA | YCAAAA | AAAAxx +(1 row) + +FETCH all in foo15; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 52 | 985 | 0 | 0 | 2 | 12 | 2 | 52 | 52 | 52 | 52 | 4 | 5 | ACAAAA | XLBAAA | HHHHxx +(1 row) + +FETCH all in foo16; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 53 | 196 | 1 | 1 | 3 | 13 | 3 | 53 | 53 | 53 | 53 | 6 | 7 | BCAAAA | OHAAAA | AAAAxx +(1 row) + +FETCH all in foo17; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 54 | 356 | 0 | 2 | 4 | 14 | 4 | 54 | 54 | 54 | 54 | 8 | 9 | CCAAAA | SNAAAA | AAAAxx +(1 row) + +FETCH all in foo18; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 55 | 627 | 1 | 3 | 5 | 15 | 5 | 55 | 55 | 55 | 55 | 10 | 11 | DCAAAA | DYAAAA | VVVVxx +(1 row) + +FETCH all in foo19; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 56 | 54 | 0 | 0 | 6 | 16 | 6 | 56 | 56 | 56 | 56 | 12 | 13 | ECAAAA | CCAAAA | OOOOxx +(1 row) + +FETCH all in foo20; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 57 | 942 | 1 | 1 | 7 | 17 | 7 | 57 | 57 | 57 | 57 | 14 | 15 | FCAAAA | GKBAAA | OOOOxx +(1 row) + +FETCH all in foo21; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 58 | 114 | 0 | 2 | 8 | 18 | 8 | 58 | 58 | 58 | 58 | 16 | 17 | GCAAAA | KEAAAA | OOOOxx +(1 row) + +FETCH all in foo22; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 59 | 593 | 1 | 3 | 9 | 19 | 9 | 59 | 59 | 59 | 59 | 18 | 19 | HCAAAA | VWAAAA | HHHHxx +(1 row) + +FETCH all in foo23; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 60 | 483 | 0 | 0 | 0 | 0 | 0 | 60 | 60 | 60 | 60 | 0 | 1 | ICAAAA | PSAAAA | VVVVxx +(1 row) + +FETCH all in foo24; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 50 | 253 | 0 | 2 | 0 | 10 | 0 | 50 | 50 | 50 | 50 | 0 | 1 | YBAAAA | TJAAAA | HHHHxx +(1 row) + +FETCH all in foo25; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 60 | 483 | 0 | 0 | 0 | 0 | 0 | 60 | 60 | 60 | 60 | 0 | 1 | ICAAAA | PSAAAA | VVVVxx +(1 row) + +CLOSE foo13; +CLOSE foo14; +CLOSE foo15; +CLOSE foo16; +CLOSE foo17; +CLOSE foo18; +CLOSE foo19; +CLOSE foo20; +CLOSE foo21; +CLOSE foo22; +CLOSE foo23; +CLOSE foo24; +CLOSE foo25; +END; diff --git a/src/test/singlenode_regress/expected/prepare.out b/src/test/singlenode_regress/expected/prepare.out new file mode 100644 index 00000000000..8eb2264fc74 --- /dev/null +++ b/src/test/singlenode_regress/expected/prepare.out @@ -0,0 +1,189 @@ +-- Regression tests for prepareable statements. We query the content +-- of the pg_prepared_statements view as prepared statements are +-- created and removed. +SELECT name, statement, parameter_types FROM pg_prepared_statements; + name | statement | parameter_types +------+-----------+----------------- +(0 rows) + +PREPARE q1 AS SELECT 1 AS a; +EXECUTE q1; + a +--- + 1 +(1 row) + +SELECT name, statement, parameter_types FROM pg_prepared_statements; + name | statement | parameter_types +------+------------------------------+----------------- + q1 | PREPARE q1 AS SELECT 1 AS a; | {} +(1 row) + +-- should fail +PREPARE q1 AS SELECT 2; +ERROR: prepared statement "q1" already exists +-- should succeed +DEALLOCATE q1; +PREPARE q1 AS SELECT 2; +EXECUTE q1; + ?column? +---------- + 2 +(1 row) + +PREPARE q2 AS SELECT 2 AS b; +SELECT name, statement, parameter_types FROM pg_prepared_statements; + name | statement | parameter_types +------+------------------------------+----------------- + q1 | PREPARE q1 AS SELECT 2; | {} + q2 | PREPARE q2 AS SELECT 2 AS b; | {} +(2 rows) + +-- sql92 syntax +DEALLOCATE PREPARE q1; +SELECT name, statement, parameter_types FROM pg_prepared_statements; + name | statement | parameter_types +------+------------------------------+----------------- + q2 | PREPARE q2 AS SELECT 2 AS b; | {} +(1 row) + +DEALLOCATE PREPARE q2; +-- the view should return the empty set again +SELECT name, statement, parameter_types FROM pg_prepared_statements; + name | statement | parameter_types +------+-----------+----------------- +(0 rows) + +-- parameterized queries +PREPARE q2(text) AS + SELECT datname, datistemplate, datallowconn + FROM pg_database WHERE datname = $1; +EXECUTE q2('postgres'); + datname | datistemplate | datallowconn +----------+---------------+-------------- + postgres | t | t +(1 row) + +PREPARE q3(text, int, float, boolean, smallint) AS + SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR + ten = $3::bigint OR true = $4 OR odd = $5::int) + ORDER BY unique1; +EXECUTE q3('AAAAxx', 5::smallint, 10.5::float, false, 4::bigint); + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 2 | 2716 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | MAEAAA | AAAAxx + 102 | 612 | 0 | 2 | 2 | 2 | 2 | 102 | 102 | 102 | 102 | 4 | 5 | YDAAAA | OXAAAA | AAAAxx + 802 | 2908 | 0 | 2 | 2 | 2 | 2 | 802 | 802 | 802 | 802 | 4 | 5 | WEAAAA | WHEAAA | AAAAxx + 902 | 1104 | 0 | 2 | 2 | 2 | 2 | 902 | 902 | 902 | 902 | 4 | 5 | SIAAAA | MQBAAA | AAAAxx + 1002 | 2580 | 0 | 2 | 2 | 2 | 2 | 2 | 1002 | 1002 | 1002 | 4 | 5 | OMAAAA | GVDAAA | AAAAxx + 1602 | 8148 | 0 | 2 | 2 | 2 | 2 | 602 | 1602 | 1602 | 1602 | 4 | 5 | QJAAAA | KBMAAA | AAAAxx + 1702 | 7940 | 0 | 2 | 2 | 2 | 2 | 702 | 1702 | 1702 | 1702 | 4 | 5 | MNAAAA | KTLAAA | AAAAxx + 2102 | 6184 | 0 | 2 | 2 | 2 | 2 | 102 | 102 | 2102 | 2102 | 4 | 5 | WCAAAA | WDJAAA | AAAAxx + 2202 | 8028 | 0 | 2 | 2 | 2 | 2 | 202 | 202 | 2202 | 2202 | 4 | 5 | SGAAAA | UWLAAA | AAAAxx + 2302 | 7112 | 0 | 2 | 2 | 2 | 2 | 302 | 302 | 2302 | 2302 | 4 | 5 | OKAAAA | ONKAAA | AAAAxx + 2902 | 6816 | 0 | 2 | 2 | 2 | 2 | 902 | 902 | 2902 | 2902 | 4 | 5 | QHAAAA | ECKAAA | AAAAxx + 3202 | 7128 | 0 | 2 | 2 | 2 | 2 | 202 | 1202 | 3202 | 3202 | 4 | 5 | ETAAAA | EOKAAA | AAAAxx + 3902 | 9224 | 0 | 2 | 2 | 2 | 2 | 902 | 1902 | 3902 | 3902 | 4 | 5 | CUAAAA | UQNAAA | AAAAxx + 4102 | 7676 | 0 | 2 | 2 | 2 | 2 | 102 | 102 | 4102 | 4102 | 4 | 5 | UBAAAA | GJLAAA | AAAAxx + 4202 | 6628 | 0 | 2 | 2 | 2 | 2 | 202 | 202 | 4202 | 4202 | 4 | 5 | QFAAAA | YUJAAA | AAAAxx + 4502 | 412 | 0 | 2 | 2 | 2 | 2 | 502 | 502 | 4502 | 4502 | 4 | 5 | ERAAAA | WPAAAA | AAAAxx + 4702 | 2520 | 0 | 2 | 2 | 2 | 2 | 702 | 702 | 4702 | 4702 | 4 | 5 | WYAAAA | YSDAAA | AAAAxx + 4902 | 1600 | 0 | 2 | 2 | 2 | 2 | 902 | 902 | 4902 | 4902 | 4 | 5 | OGAAAA | OJCAAA | AAAAxx + 5602 | 8796 | 0 | 2 | 2 | 2 | 2 | 602 | 1602 | 602 | 5602 | 4 | 5 | MHAAAA | IANAAA | AAAAxx + 6002 | 8932 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 1002 | 6002 | 4 | 5 | WWAAAA | OFNAAA | AAAAxx + 6402 | 3808 | 0 | 2 | 2 | 2 | 2 | 402 | 402 | 1402 | 6402 | 4 | 5 | GMAAAA | MQFAAA | AAAAxx + 7602 | 1040 | 0 | 2 | 2 | 2 | 2 | 602 | 1602 | 2602 | 7602 | 4 | 5 | KGAAAA | AOBAAA | AAAAxx + 7802 | 7508 | 0 | 2 | 2 | 2 | 2 | 802 | 1802 | 2802 | 7802 | 4 | 5 | COAAAA | UCLAAA | AAAAxx + 8002 | 9980 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 3002 | 8002 | 4 | 5 | UVAAAA | WTOAAA | AAAAxx + 8302 | 7800 | 0 | 2 | 2 | 2 | 2 | 302 | 302 | 3302 | 8302 | 4 | 5 | IHAAAA | AOLAAA | AAAAxx + 8402 | 5708 | 0 | 2 | 2 | 2 | 2 | 402 | 402 | 3402 | 8402 | 4 | 5 | ELAAAA | OLIAAA | AAAAxx + 8602 | 5440 | 0 | 2 | 2 | 2 | 2 | 602 | 602 | 3602 | 8602 | 4 | 5 | WSAAAA | GBIAAA | AAAAxx + 9502 | 1812 | 0 | 2 | 2 | 2 | 2 | 502 | 1502 | 4502 | 9502 | 4 | 5 | MBAAAA | SRCAAA | AAAAxx + 9602 | 9972 | 0 | 2 | 2 | 2 | 2 | 602 | 1602 | 4602 | 9602 | 4 | 5 | IFAAAA | OTOAAA | AAAAxx +(29 rows) + +-- too few params +EXECUTE q3('bool'); +ERROR: wrong number of parameters for prepared statement "q3" +DETAIL: Expected 5 parameters but got 1. +-- too many params +EXECUTE q3('bytea', 5::smallint, 10.5::float, false, 4::bigint, true); +ERROR: wrong number of parameters for prepared statement "q3" +DETAIL: Expected 5 parameters but got 6. +-- wrong param types +EXECUTE q3(5::smallint, 10.5::float, false, 4::bigint, 'bytea'); +ERROR: parameter $3 of type boolean cannot be coerced to the expected type double precision +LINE 1: EXECUTE q3(5::smallint, 10.5::float, false, 4::bigint, 'byte... + ^ +HINT: You will need to rewrite or cast the expression. +-- invalid type +PREPARE q4(nonexistenttype) AS SELECT $1; +ERROR: type "nonexistenttype" does not exist +LINE 1: PREPARE q4(nonexistenttype) AS SELECT $1; + ^ +-- create table as execute +PREPARE q5(int, text) AS + SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2 + ORDER BY unique1; +CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA'); +SELECT * FROM q5_prep_results; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 200 | 9441 | 0 | 0 | 0 | 0 | 0 | 200 | 200 | 200 | 200 | 0 | 1 | SHAAAA | DZNAAA | HHHHxx + 497 | 9092 | 1 | 1 | 7 | 17 | 97 | 497 | 497 | 497 | 497 | 194 | 195 | DTAAAA | SLNAAA | AAAAxx + 1173 | 6699 | 1 | 1 | 3 | 13 | 73 | 173 | 1173 | 1173 | 1173 | 146 | 147 | DTAAAA | RXJAAA | VVVVxx + 1849 | 8143 | 1 | 1 | 9 | 9 | 49 | 849 | 1849 | 1849 | 1849 | 98 | 99 | DTAAAA | FBMAAA | VVVVxx + 2525 | 64 | 1 | 1 | 5 | 5 | 25 | 525 | 525 | 2525 | 2525 | 50 | 51 | DTAAAA | MCAAAA | AAAAxx + 3201 | 7309 | 1 | 1 | 1 | 1 | 1 | 201 | 1201 | 3201 | 3201 | 2 | 3 | DTAAAA | DVKAAA | HHHHxx + 3877 | 4060 | 1 | 1 | 7 | 17 | 77 | 877 | 1877 | 3877 | 3877 | 154 | 155 | DTAAAA | EAGAAA | AAAAxx + 4553 | 4113 | 1 | 1 | 3 | 13 | 53 | 553 | 553 | 4553 | 4553 | 106 | 107 | DTAAAA | FCGAAA | HHHHxx + 5229 | 6407 | 1 | 1 | 9 | 9 | 29 | 229 | 1229 | 229 | 5229 | 58 | 59 | DTAAAA | LMJAAA | VVVVxx + 5905 | 9537 | 1 | 1 | 5 | 5 | 5 | 905 | 1905 | 905 | 5905 | 10 | 11 | DTAAAA | VCOAAA | HHHHxx + 6581 | 4686 | 1 | 1 | 1 | 1 | 81 | 581 | 581 | 1581 | 6581 | 162 | 163 | DTAAAA | GYGAAA | OOOOxx + 7257 | 1895 | 1 | 1 | 7 | 17 | 57 | 257 | 1257 | 2257 | 7257 | 114 | 115 | DTAAAA | XUCAAA | VVVVxx + 7933 | 4514 | 1 | 1 | 3 | 13 | 33 | 933 | 1933 | 2933 | 7933 | 66 | 67 | DTAAAA | QRGAAA | OOOOxx + 8609 | 5918 | 1 | 1 | 9 | 9 | 9 | 609 | 609 | 3609 | 8609 | 18 | 19 | DTAAAA | QTIAAA | OOOOxx + 9285 | 8469 | 1 | 1 | 5 | 5 | 85 | 285 | 1285 | 4285 | 9285 | 170 | 171 | DTAAAA | TNMAAA | HHHHxx + 9961 | 2058 | 1 | 1 | 1 | 1 | 61 | 961 | 1961 | 4961 | 9961 | 122 | 123 | DTAAAA | EBDAAA | OOOOxx +(16 rows) + +CREATE TEMPORARY TABLE q5_prep_nodata AS EXECUTE q5(200, 'DTAAAA') + WITH NO DATA; +SELECT * FROM q5_prep_nodata; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- +(0 rows) + +-- unknown or unspecified parameter types: should succeed +PREPARE q6 AS + SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2; +PREPARE q7(unknown) AS + SELECT * FROM road WHERE thepath = $1; +SELECT name, statement, parameter_types FROM pg_prepared_statements + ORDER BY name; + name | statement | parameter_types +------+------------------------------------------------------------------+---------------------------------------------------- + q2 | PREPARE q2(text) AS +| {text} + | SELECT datname, datistemplate, datallowconn +| + | FROM pg_database WHERE datname = $1; | + q3 | PREPARE q3(text, int, float, boolean, smallint) AS +| {text,integer,"double precision",boolean,smallint} + | SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR+| + | ten = $3::bigint OR true = $4 OR odd = $5::int) +| + | ORDER BY unique1; | + q5 | PREPARE q5(int, text) AS +| {integer,text} + | SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2 +| + | ORDER BY unique1; | + q6 | PREPARE q6 AS +| {integer,name} + | SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2; | + q7 | PREPARE q7(unknown) AS +| {path} + | SELECT * FROM road WHERE thepath = $1; | +(5 rows) + +-- test DEALLOCATE ALL; +DEALLOCATE ALL; +SELECT name, statement, parameter_types FROM pg_prepared_statements + ORDER BY name; + name | statement | parameter_types +------+-----------+----------------- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/prepared_xacts.out b/src/test/singlenode_regress/expected/prepared_xacts.out new file mode 100644 index 00000000000..ba8e3ccc6c9 --- /dev/null +++ b/src/test/singlenode_regress/expected/prepared_xacts.out @@ -0,0 +1,270 @@ +-- +-- PREPARED TRANSACTIONS (two-phase commit) +-- +-- We can't readily test persistence of prepared xacts within the +-- regression script framework, unfortunately. Note that a crash +-- isn't really needed ... stopping and starting the postmaster would +-- be enough, but we can't even do that here. +-- create a simple table that we'll use in the tests +CREATE TABLE pxtest1 (foobar VARCHAR(10)); +INSERT INTO pxtest1 VALUES ('aaa'); +-- Test PREPARE TRANSACTION +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'bbb' WHERE foobar = 'aaa'; +SELECT * FROM pxtest1; + foobar +-------- + bbb +(1 row) + +PREPARE TRANSACTION 'foo1'; +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +-- Test pg_prepared_xacts system view +SELECT gid FROM pg_prepared_xacts; + gid +------ + foo1 +(1 row) + +-- Test ROLLBACK PREPARED +ROLLBACK PREPARED 'foo1'; +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- Test COMMIT PREPARED +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +INSERT INTO pxtest1 VALUES ('ddd'); +SELECT * FROM pxtest1; + foobar +-------- + aaa + ddd +(2 rows) + +PREPARE TRANSACTION 'foo2'; +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +COMMIT PREPARED 'foo2'; +SELECT * FROM pxtest1; + foobar +-------- + aaa + ddd +(2 rows) + +-- Test duplicate gids +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; +SELECT * FROM pxtest1; + foobar +-------- + aaa + eee +(2 rows) + +PREPARE TRANSACTION 'foo3'; +SELECT gid FROM pg_prepared_xacts; + gid +------ + foo3 +(1 row) + +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +INSERT INTO pxtest1 VALUES ('fff'); +-- This should fail, because the gid foo3 is already in use +PREPARE TRANSACTION 'foo3'; +ERROR: transaction identifier "foo3" is already in use +SELECT * FROM pxtest1; + foobar +-------- + aaa + ddd +(2 rows) + +ROLLBACK PREPARED 'foo3'; +SELECT * FROM pxtest1; + foobar +-------- + aaa + ddd +(2 rows) + +-- Test serialization failure (SSI) +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; +SELECT * FROM pxtest1; + foobar +-------- + aaa + eee +(2 rows) + +PREPARE TRANSACTION 'foo4'; +SELECT gid FROM pg_prepared_xacts; + gid +------ + foo4 +(1 row) + +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SELECT * FROM pxtest1; + foobar +-------- + aaa + ddd +(2 rows) + +-- This should fail, because the two transactions have a write-skew anomaly +INSERT INTO pxtest1 VALUES ('fff'); +ERROR: could not serialize access due to read/write dependencies among transactions +DETAIL: Reason code: Canceled on identification as a pivot, during write. +HINT: The transaction might succeed if retried. +PREPARE TRANSACTION 'foo5'; +SELECT gid FROM pg_prepared_xacts; + gid +------ + foo4 +(1 row) + +ROLLBACK PREPARED 'foo4'; +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- Clean up +DROP TABLE pxtest1; +-- Test detection of session-level and xact-level locks on same object +BEGIN; +SELECT pg_advisory_lock(1); + pg_advisory_lock +------------------ + +(1 row) + +SELECT pg_advisory_xact_lock_shared(1); + pg_advisory_xact_lock_shared +------------------------------ + +(1 row) + +PREPARE TRANSACTION 'foo6'; -- fails +ERROR: cannot PREPARE while holding both session-level and transaction-level locks on the same object +-- Test subtransactions +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; + CREATE TABLE pxtest2 (a int); + INSERT INTO pxtest2 VALUES (1); + SAVEPOINT a; + INSERT INTO pxtest2 VALUES (2); + ROLLBACK TO a; + SAVEPOINT b; + INSERT INTO pxtest2 VALUES (3); +PREPARE TRANSACTION 'regress-one'; +CREATE TABLE pxtest3(fff int); +-- Test shared invalidation +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; + DROP TABLE pxtest3; + CREATE TABLE pxtest4 (a int); + INSERT INTO pxtest4 VALUES (1); + INSERT INTO pxtest4 VALUES (2); + DECLARE foo CURSOR FOR SELECT * FROM pxtest4; + -- Fetch 1 tuple, keeping the cursor open + FETCH 1 FROM foo; + a +--- + 1 +(1 row) + +PREPARE TRANSACTION 'regress-two'; +-- No such cursor +FETCH 1 FROM foo; +ERROR: cursor "foo" does not exist +-- Table doesn't exist, the creation hasn't been committed yet +SELECT * FROM pxtest2; +ERROR: relation "pxtest2" does not exist +LINE 1: SELECT * FROM pxtest2; + ^ +-- There should be two prepared transactions +SELECT gid FROM pg_prepared_xacts; + gid +------------- + regress-one + regress-two +(2 rows) + +-- pxtest3 should be locked because of the pending DROP +begin; +lock table pxtest3 in access share mode nowait; +ERROR: could not obtain lock on relation "pxtest3" +rollback; +-- Disconnect, we will continue testing in a different backend +\c - +-- There should still be two prepared transactions +SELECT gid FROM pg_prepared_xacts; + gid +------------- + regress-one + regress-two +(2 rows) + +-- pxtest3 should still be locked because of the pending DROP +begin; +lock table pxtest3 in access share mode nowait; +ERROR: could not obtain lock on relation "pxtest3" +rollback; +-- Commit table creation +COMMIT PREPARED 'regress-one'; +\d pxtest2 + Table "public.pxtest2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + +SELECT * FROM pxtest2; + a +--- + 1 + 3 +(2 rows) + +-- There should be one prepared transaction +SELECT gid FROM pg_prepared_xacts; + gid +------------- + regress-two +(1 row) + +-- Commit table drop +COMMIT PREPARED 'regress-two'; +SELECT * FROM pxtest3; +ERROR: relation "pxtest3" does not exist +LINE 1: SELECT * FROM pxtest3; + ^ +-- There should be no prepared transactions +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- Clean up +DROP TABLE pxtest2; +DROP TABLE pxtest3; -- will still be there if prepared xacts are disabled +ERROR: table "pxtest3" does not exist +DROP TABLE pxtest4; diff --git a/src/test/singlenode_regress/expected/prepared_xacts_1.out b/src/test/singlenode_regress/expected/prepared_xacts_1.out new file mode 100644 index 00000000000..2cd50ad9470 --- /dev/null +++ b/src/test/singlenode_regress/expected/prepared_xacts_1.out @@ -0,0 +1,266 @@ +-- +-- PREPARED TRANSACTIONS (two-phase commit) +-- +-- We can't readily test persistence of prepared xacts within the +-- regression script framework, unfortunately. Note that a crash +-- isn't really needed ... stopping and starting the postmaster would +-- be enough, but we can't even do that here. +-- create a simple table that we'll use in the tests +CREATE TABLE pxtest1 (foobar VARCHAR(10)); +INSERT INTO pxtest1 VALUES ('aaa'); +-- Test PREPARE TRANSACTION +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'bbb' WHERE foobar = 'aaa'; +SELECT * FROM pxtest1; + foobar +-------- + bbb +(1 row) + +PREPARE TRANSACTION 'foo1'; +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +-- Test pg_prepared_xacts system view +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- Test ROLLBACK PREPARED +ROLLBACK PREPARED 'foo1'; +ERROR: prepared transaction with identifier "foo1" does not exist +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- Test COMMIT PREPARED +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +INSERT INTO pxtest1 VALUES ('ddd'); +SELECT * FROM pxtest1; + foobar +-------- + aaa + ddd +(2 rows) + +PREPARE TRANSACTION 'foo2'; +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +COMMIT PREPARED 'foo2'; +ERROR: prepared transaction with identifier "foo2" does not exist +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +-- Test duplicate gids +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +PREPARE TRANSACTION 'foo3'; +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +INSERT INTO pxtest1 VALUES ('fff'); +-- This should fail, because the gid foo3 is already in use +PREPARE TRANSACTION 'foo3'; +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +ROLLBACK PREPARED 'foo3'; +ERROR: prepared transaction with identifier "foo3" does not exist +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +-- Test serialization failure (SSI) +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +PREPARE TRANSACTION 'foo4'; +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SELECT * FROM pxtest1; + foobar +-------- + aaa +(1 row) + +-- This should fail, because the two transactions have a write-skew anomaly +INSERT INTO pxtest1 VALUES ('fff'); +PREPARE TRANSACTION 'foo5'; +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +ROLLBACK PREPARED 'foo4'; +ERROR: prepared transaction with identifier "foo4" does not exist +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- Clean up +DROP TABLE pxtest1; +-- Test detection of session-level and xact-level locks on same object +BEGIN; +SELECT pg_advisory_lock(1); + pg_advisory_lock +------------------ + +(1 row) + +SELECT pg_advisory_xact_lock_shared(1); + pg_advisory_xact_lock_shared +------------------------------ + +(1 row) + +PREPARE TRANSACTION 'foo6'; -- fails +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +-- Test subtransactions +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; + CREATE TABLE pxtest2 (a int); + INSERT INTO pxtest2 VALUES (1); + SAVEPOINT a; + INSERT INTO pxtest2 VALUES (2); + ROLLBACK TO a; + SAVEPOINT b; + INSERT INTO pxtest2 VALUES (3); +PREPARE TRANSACTION 'regress-one'; +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +CREATE TABLE pxtest3(fff int); +-- Test shared invalidation +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; + DROP TABLE pxtest3; + CREATE TABLE pxtest4 (a int); + INSERT INTO pxtest4 VALUES (1); + INSERT INTO pxtest4 VALUES (2); + DECLARE foo CURSOR FOR SELECT * FROM pxtest4; + -- Fetch 1 tuple, keeping the cursor open + FETCH 1 FROM foo; + a +--- + 1 +(1 row) + +PREPARE TRANSACTION 'regress-two'; +ERROR: prepared transactions are disabled +HINT: Set max_prepared_transactions to a nonzero value. +-- No such cursor +FETCH 1 FROM foo; +ERROR: cursor "foo" does not exist +-- Table doesn't exist, the creation hasn't been committed yet +SELECT * FROM pxtest2; +ERROR: relation "pxtest2" does not exist +LINE 1: SELECT * FROM pxtest2; + ^ +-- There should be two prepared transactions +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- pxtest3 should be locked because of the pending DROP +begin; +lock table pxtest3 in access share mode nowait; +rollback; +-- Disconnect, we will continue testing in a different backend +\c - +-- There should still be two prepared transactions +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- pxtest3 should still be locked because of the pending DROP +begin; +lock table pxtest3 in access share mode nowait; +rollback; +-- Commit table creation +COMMIT PREPARED 'regress-one'; +ERROR: prepared transaction with identifier "regress-one" does not exist +\d pxtest2 +SELECT * FROM pxtest2; +ERROR: relation "pxtest2" does not exist +LINE 1: SELECT * FROM pxtest2; + ^ +-- There should be one prepared transaction +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- Commit table drop +COMMIT PREPARED 'regress-two'; +ERROR: prepared transaction with identifier "regress-two" does not exist +SELECT * FROM pxtest3; + fff +----- +(0 rows) + +-- There should be no prepared transactions +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + +-- Clean up +DROP TABLE pxtest2; +ERROR: table "pxtest2" does not exist +DROP TABLE pxtest3; -- will still be there if prepared xacts are disabled +DROP TABLE pxtest4; +ERROR: table "pxtest4" does not exist diff --git a/src/test/singlenode_regress/expected/privileges.out b/src/test/singlenode_regress/expected/privileges.out new file mode 100644 index 00000000000..88f3057cd45 --- /dev/null +++ b/src/test/singlenode_regress/expected/privileges.out @@ -0,0 +1,2460 @@ +-- +-- Test access privileges +-- +-- start_matchsubs +-- m/DETAIL: Failing row contains \(.*\) = \(.*\)/ +-- s/DETAIL: Failing row contains \(.*\) = \(.*\)/DETAIL: Failing row contains (#####)/ +-- end_matchsubs +set optimizer=off; +set enable_nestloop=on; +-- Clean up in case a prior regression run failed +-- Suppress NOTICE messages when users/groups don't exist +SET client_min_messages TO 'warning'; +DROP ROLE IF EXISTS regress_priv_group1; +DROP ROLE IF EXISTS regress_priv_group2; +DROP ROLE IF EXISTS regress_priv_user1; +DROP ROLE IF EXISTS regress_priv_user2; +DROP ROLE IF EXISTS regress_priv_user3; +DROP ROLE IF EXISTS regress_priv_user4; +DROP ROLE IF EXISTS regress_priv_user5; +DROP ROLE IF EXISTS regress_priv_user6; +DROP ROLE IF EXISTS regress_priv_user7; +-- start_ignore +SELECT lo_unlink(oid) FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid; + lo_unlink +----------- +(0 rows) + +-- end_ignore +RESET client_min_messages; +-- test proper begins here +CREATE USER regress_priv_user1; +CREATE USER regress_priv_user2; +CREATE USER regress_priv_user3; +CREATE USER regress_priv_user4; +CREATE USER regress_priv_user5; +CREATE USER regress_priv_user5; -- duplicate +ERROR: role "regress_priv_user5" already exists +CREATE USER regress_priv_user6; +CREATE USER regress_priv_user7; +CREATE ROLE regress_priv_role; +GRANT pg_read_all_data TO regress_priv_user6; +GRANT pg_write_all_data TO regress_priv_user7; +CREATE GROUP regress_priv_group1; +CREATE GROUP regress_priv_group2 WITH USER regress_priv_user1, regress_priv_user2; +ALTER GROUP regress_priv_group1 ADD USER regress_priv_user4; +ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; -- duplicate +NOTICE: role "regress_priv_user2" is already a member of role "regress_priv_group2" +ALTER GROUP regress_priv_group2 DROP USER regress_priv_user2; +GRANT regress_priv_group2 TO regress_priv_user4 WITH ADMIN OPTION; +-- prepare non-leakproof function for later +CREATE FUNCTION leak(integer,integer) RETURNS boolean + AS 'int4lt' + LANGUAGE internal IMMUTABLE STRICT; -- but deliberately not LEAKPROOF +ALTER FUNCTION leak(integer,integer) OWNER TO regress_priv_user1; +-- test owner privileges +GRANT regress_priv_role TO regress_priv_user1 WITH ADMIN OPTION GRANTED BY CURRENT_ROLE; +REVOKE ADMIN OPTION FOR regress_priv_role FROM regress_priv_user1 GRANTED BY foo; -- error +REVOKE ADMIN OPTION FOR regress_priv_role FROM regress_priv_user1 GRANTED BY regress_priv_user2; -- error +REVOKE ADMIN OPTION FOR regress_priv_role FROM regress_priv_user1 GRANTED BY CURRENT_USER; +REVOKE regress_priv_role FROM regress_priv_user1 GRANTED BY CURRENT_ROLE; +DROP ROLE regress_priv_role; +SET SESSION AUTHORIZATION regress_priv_user1; +SELECT session_user, current_user; + session_user | current_user +--------------------+-------------------- + regress_priv_user1 | regress_priv_user1 +(1 row) + +CREATE TABLE atest1 ( a int, b text ); +SELECT * FROM atest1; + a | b +---+--- +(0 rows) + +INSERT INTO atest1 VALUES (1, 'one'); +DELETE FROM atest1; +UPDATE atest1 SET a = 1 WHERE b = 'blech'; +TRUNCATE atest1; +BEGIN; +LOCK atest1 IN ACCESS EXCLUSIVE MODE; +COMMIT; +REVOKE ALL ON atest1 FROM PUBLIC; +NOTICE: no privileges could be revoked +SELECT * FROM atest1; + a | b +---+--- +(0 rows) + +GRANT ALL ON atest1 TO regress_priv_user2; +GRANT SELECT ON atest1 TO regress_priv_user3, regress_priv_user4; +SELECT * FROM atest1; + a | b +---+--- +(0 rows) + +CREATE TABLE atest2 (col1 varchar(10), col2 boolean); +GRANT SELECT ON atest2 TO regress_priv_user2; +GRANT UPDATE ON atest2 TO regress_priv_user3; +GRANT INSERT ON atest2 TO regress_priv_user4 GRANTED BY CURRENT_USER; +GRANT TRUNCATE ON atest2 TO regress_priv_user5 GRANTED BY CURRENT_ROLE; +GRANT TRUNCATE ON atest2 TO regress_priv_user4 GRANTED BY regress_priv_user5; -- error +ERROR: grantor must be current user +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT session_user, current_user; + session_user | current_user +--------------------+-------------------- + regress_priv_user2 | regress_priv_user2 +(1 row) + +-- try various combinations of queries on atest1 and atest2 +SELECT * FROM atest1; -- ok + a | b +---+--- +(0 rows) + +SELECT * FROM atest2; -- ok + col1 | col2 +------+------ +(0 rows) + +INSERT INTO atest1 VALUES (2, 'two'); -- ok +INSERT INTO atest2 VALUES ('foo', true); -- fail +ERROR: permission denied for table atest2 +INSERT INTO atest1 SELECT 1, b FROM atest1; -- ok +UPDATE atest1 SET a = 1 WHERE a = 2; -- ok +UPDATE atest2 SET col2 = NOT col2; -- fail +ERROR: permission denied for table atest2 +SELECT * FROM atest1 FOR UPDATE; -- ok + a | b +---+----- + 1 | two + 1 | two +(2 rows) + +SELECT * FROM atest2 FOR UPDATE; -- fail +ERROR: permission denied for table atest2 +DELETE FROM atest2; -- fail +ERROR: permission denied for table atest2 +TRUNCATE atest2; -- fail +ERROR: permission denied for table atest2 +BEGIN; +LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- fail +ERROR: permission denied for table atest2 +COMMIT; +COPY atest2 FROM stdin; -- fail +ERROR: permission denied for table atest2 +GRANT ALL ON atest1 TO PUBLIC; -- fail +WARNING: no privileges were granted for "atest1" +-- checks in subquery, both ok +SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) ); + a | b +---+--- +(0 rows) + +SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) ); + col1 | col2 +------+------ +(0 rows) + +SET SESSION AUTHORIZATION regress_priv_user6; +SELECT * FROM atest1; -- ok + a | b +---+----- + 1 | two + 1 | two +(2 rows) + +SELECT * FROM atest2; -- ok + col1 | col2 +------+------ +(0 rows) + +INSERT INTO atest2 VALUES ('foo', true); -- fail +ERROR: permission denied for table atest2 +SET SESSION AUTHORIZATION regress_priv_user7; +SELECT * FROM atest1; -- fail +ERROR: permission denied for table atest1 +SELECT * FROM atest2; -- fail +ERROR: permission denied for table atest2 +INSERT INTO atest2 VALUES ('foo', true); -- ok +UPDATE atest2 SET col2 = true; -- ok +DELETE FROM atest2; -- ok +-- Make sure we are not able to modify system catalogs +UPDATE pg_catalog.pg_class SET relname = '123'; -- fail +ERROR: permission denied: "pg_class" is a system catalog +DELETE FROM pg_catalog.pg_class; -- fail +ERROR: permission denied: "pg_class" is a system catalog +UPDATE pg_toast.pg_toast_1213 SET chunk_id = 1; -- fail +ERROR: permission denied: "pg_toast_1213" is a system catalog +SET SESSION AUTHORIZATION regress_priv_user3; +SELECT session_user, current_user; + session_user | current_user +--------------------+-------------------- + regress_priv_user3 | regress_priv_user3 +(1 row) + +SELECT * FROM atest1; -- ok + a | b +---+----- + 1 | two + 1 | two +(2 rows) + +SELECT * FROM atest2; -- fail +ERROR: permission denied for table atest2 +INSERT INTO atest1 VALUES (2, 'two'); -- fail +ERROR: permission denied for table atest1 +INSERT INTO atest2 VALUES ('foo', true); -- fail +ERROR: permission denied for table atest2 +INSERT INTO atest1 SELECT 1, b FROM atest1; -- fail +ERROR: permission denied for table atest1 +UPDATE atest1 SET a = 1 WHERE a = 2; -- fail +ERROR: permission denied for table atest1 +UPDATE atest2 SET col2 = NULL; -- ok +UPDATE atest2 SET col2 = NOT col2; -- fails; requires SELECT on atest2 +ERROR: permission denied for table atest2 +UPDATE atest2 SET col2 = true FROM atest1 WHERE atest1.a = 5; -- ok +SELECT * FROM atest1 FOR UPDATE; -- fail +ERROR: permission denied for table atest1 +SELECT * FROM atest2 FOR UPDATE; -- fail +ERROR: permission denied for table atest2 +DELETE FROM atest2; -- fail +ERROR: permission denied for table atest2 +TRUNCATE atest2; -- fail +ERROR: permission denied for table atest2 +BEGIN; +LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- ok +COMMIT; +COPY atest2 FROM stdin; -- fail +ERROR: permission denied for table atest2 +-- checks in subquery, both fail +SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) ); +ERROR: permission denied for table atest2 +SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) ); +ERROR: permission denied for table atest2 +SET SESSION AUTHORIZATION regress_priv_user4; +COPY atest2 FROM stdin; -- ok +SELECT * FROM atest1; -- ok + a | b +---+----- + 1 | two + 1 | two +(2 rows) + +-- test leaky-function protections in selfuncs +-- regress_priv_user1 will own a table and provide views for it. +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE atest12 as + SELECT x AS a, 10001 - x AS b FROM generate_series(1,10000) x; +CREATE INDEX ON atest12 (a); +CREATE INDEX ON atest12 (abs(a)); +-- results below depend on having quite accurate stats for atest12, so... +ALTER TABLE atest12 SET (autovacuum_enabled = off); +WARNING: autovacuum is not supported in Cloudberry +SET default_statistics_target = 10000; +VACUUM ANALYZE atest12; +RESET default_statistics_target; +CREATE OPERATOR <<< (procedure = leak, leftarg = integer, rightarg = integer, + restrict = scalarltsel); +-- views with leaky operator +CREATE VIEW atest12v AS + SELECT * FROM atest12 WHERE b <<< 5; +CREATE VIEW atest12sbv WITH (security_barrier=true) AS + SELECT * FROM atest12 WHERE b <<< 5; +GRANT SELECT ON atest12v TO PUBLIC; +GRANT SELECT ON atest12sbv TO PUBLIC; +-- This plan should use nestloop, knowing that few rows will be selected. +EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; + QUERY PLAN +------------------------------------------------- + Nested Loop + -> Seq Scan on atest12 atest12_1 + Filter: (b <<< 5) + -> Index Scan using atest12_a_idx on atest12 + Index Cond: (a = atest12_1.b) + Filter: (b <<< 5) + Optimizer: Postgres query optimizer +(7 rows) + +-- And this one. +EXPLAIN (COSTS OFF) SELECT * FROM atest12 x, atest12 y + WHERE x.a = y.b and abs(y.a) <<< 5; + QUERY PLAN +--------------------------------------------------- + Nested Loop + -> Seq Scan on atest12 y + Filter: (abs(a) <<< 5) + -> Index Scan using atest12_a_idx on atest12 x + Index Cond: (a = y.b) + Optimizer: Postgres query optimizer +(6 rows) + +-- This should also be a nestloop, but the security barrier forces the inner +-- scan to be materialized +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv x, atest12sbv y WHERE x.a = y.b; + QUERY PLAN +------------------------------------------- + Nested Loop + Join Filter: (atest12.a = atest12_1.b) + -> Seq Scan on atest12 + Filter: (b <<< 5) + -> Materialize + -> Seq Scan on atest12 atest12_1 + Filter: (b <<< 5) + Optimizer: Postgres query optimizer +(8 rows) + +-- Check if regress_priv_user2 can break security. +SET SESSION AUTHORIZATION regress_priv_user2; +CREATE FUNCTION leak2(integer,integer) RETURNS boolean + AS $$begin raise notice 'leak % %', $1, $2; return $1 > $2; end$$ + LANGUAGE plpgsql immutable; +CREATE OPERATOR >>> (procedure = leak2, leftarg = integer, rightarg = integer, + restrict = scalargtsel); +-- This should not show any "leak" notices before failing. +EXPLAIN (COSTS OFF) SELECT * FROM atest12 WHERE a >>> 0; +ERROR: permission denied for table atest12 +-- These plans should continue to use a nestloop, since they execute with the +-- privileges of the view owner. +EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; + QUERY PLAN +------------------------------------------------- + Nested Loop + -> Seq Scan on atest12 atest12_1 + Filter: (b <<< 5) + -> Index Scan using atest12_a_idx on atest12 + Index Cond: (a = atest12_1.b) + Filter: (b <<< 5) + Optimizer: Postgres query optimizer +(7 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv x, atest12sbv y WHERE x.a = y.b; + QUERY PLAN +------------------------------------------- + Nested Loop + Join Filter: (atest12.a = atest12_1.b) + -> Seq Scan on atest12 + Filter: (b <<< 5) + -> Materialize + -> Seq Scan on atest12 atest12_1 + Filter: (b <<< 5) + Optimizer: Postgres query optimizer +(8 rows) + +-- A non-security barrier view does not guard against information leakage. +EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y + WHERE x.a = y.b and abs(y.a) <<< 5; + QUERY PLAN +------------------------------------------------- + Nested Loop + -> Seq Scan on atest12 atest12_1 + Filter: ((b <<< 5) AND (abs(a) <<< 5)) + -> Index Scan using atest12_a_idx on atest12 + Index Cond: (a = atest12_1.b) + Filter: (b <<< 5) + Optimizer: Postgres query optimizer +(7 rows) + +-- But a security barrier view isolates the leaky operator. +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv x, atest12sbv y + WHERE x.a = y.b and abs(y.a) <<< 5; + QUERY PLAN +------------------------------------------------- + Nested Loop + Join Filter: (atest12.a = y.b) + -> Seq Scan on atest12 + Filter: (b <<< 5) + -> Materialize + -> Subquery Scan on y + Filter: (abs(y.a) <<< 5) + -> Seq Scan on atest12 atest12_1 + Filter: (b <<< 5) + Optimizer: Postgres query optimizer +(10 rows) + +-- Now regress_priv_user1 grants sufficient access to regress_priv_user2. +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (a, b) ON atest12 TO PUBLIC; +SET SESSION AUTHORIZATION regress_priv_user2; +-- regress_priv_user2 should continue to get a good row estimate. +EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; + QUERY PLAN +------------------------------------------------- + Nested Loop + -> Seq Scan on atest12 atest12_1 + Filter: (b <<< 5) + -> Index Scan using atest12_a_idx on atest12 + Index Cond: (a = atest12_1.b) + Filter: (b <<< 5) + Optimizer: Postgres query optimizer +(7 rows) + +-- But not for this, due to lack of table-wide permissions needed +-- to make use of the expression index's statistics. +EXPLAIN (COSTS OFF) SELECT * FROM atest12 x, atest12 y + WHERE x.a = y.b and abs(y.a) <<< 5; + QUERY PLAN +-------------------------------------- + Hash Join + Hash Cond: (x.a = y.b) + -> Seq Scan on atest12 x + -> Hash + -> Seq Scan on atest12 y + Filter: (abs(a) <<< 5) + Optimizer: Postgres query optimizer +(7 rows) + +-- clean up (regress_priv_user1's objects are all dropped later) +DROP FUNCTION leak2(integer, integer) CASCADE; +NOTICE: drop cascades to operator >>>(integer,integer) +-- groups +SET SESSION AUTHORIZATION regress_priv_user3; +CREATE TABLE atest3 (one int, two int, three int); +GRANT DELETE ON atest3 TO GROUP regress_priv_group2; +SET SESSION AUTHORIZATION regress_priv_user1; +SELECT * FROM atest3; -- fail +ERROR: permission denied for table atest3 +DELETE FROM atest3; -- ok +BEGIN; +RESET SESSION AUTHORIZATION; +ALTER ROLE regress_priv_user1 NOINHERIT; +SET SESSION AUTHORIZATION regress_priv_user1; +DELETE FROM atest3; +ERROR: permission denied for table atest3 +ROLLBACK; +-- views +SET SESSION AUTHORIZATION regress_priv_user3; +CREATE VIEW atestv1 AS SELECT * FROM atest1; -- ok +/* The next *should* fail, but it's not implemented that way yet. */ +CREATE VIEW atestv2 AS SELECT * FROM atest2; +CREATE VIEW atestv3 AS SELECT * FROM atest3; -- ok +/* Empty view is a corner case that failed in 9.2. */ +CREATE VIEW atestv0 AS SELECT 0 as x WHERE false; -- ok +SELECT * FROM atestv1; -- ok + a | b +---+----- + 1 | two + 1 | two +(2 rows) + +SELECT * FROM atestv2; -- fail +ERROR: permission denied for table atest2 +GRANT SELECT ON atestv1, atestv3 TO regress_priv_user4; +GRANT SELECT ON atestv2 TO regress_priv_user2; +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT * FROM atestv1; -- ok + a | b +---+----- + 1 | two + 1 | two +(2 rows) + +SELECT * FROM atestv2; -- fail +ERROR: permission denied for view atestv2 +SELECT * FROM atestv3; -- ok + one | two | three +-----+-----+------- +(0 rows) + +SELECT * FROM atestv0; -- fail +ERROR: permission denied for view atestv0 +-- Appendrels excluded by constraints failed to check permissions in 8.4-9.2. +select * from + ((select a.q1 as x from int8_tbl a offset 0) + union all + (select b.q2 as x from int8_tbl b offset 0)) ss +where false; +ERROR: permission denied for table int8_tbl +set constraint_exclusion = on; +select * from + ((select a.q1 as x, random() from int8_tbl a where q1 > 0) + union all + (select b.q2 as x, random() from int8_tbl b where q2 > 0)) ss +where x < 0; +ERROR: permission denied for table int8_tbl +reset constraint_exclusion; +CREATE VIEW atestv4 AS SELECT * FROM atestv3; -- nested view +SELECT * FROM atestv4; -- ok + one | two | three +-----+-----+------- +(0 rows) + +GRANT SELECT ON atestv4 TO regress_priv_user2; +SET SESSION AUTHORIZATION regress_priv_user2; +-- Two complex cases: +SELECT * FROM atestv3; -- fail +ERROR: permission denied for view atestv3 +SELECT * FROM atestv4; -- ok (even though regress_priv_user2 cannot access underlying atestv3) + one | two | three +-----+-----+------- +(0 rows) + +SELECT * FROM atest2; -- ok + col1 | col2 +------+------ + bar | t +(1 row) + +SELECT * FROM atestv2; -- fail (even though regress_priv_user2 can access underlying atest2) +ERROR: permission denied for table atest2 +-- Test column level permissions +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE atest5 (one int, two int unique, three int, four int unique); +CREATE TABLE atest6 (one int, two int, blue int); +GRANT SELECT (one), INSERT (two), UPDATE (three) ON atest5 TO regress_priv_user4; +GRANT ALL (one) ON atest5 TO regress_priv_user3; +INSERT INTO atest5 VALUES (1,2,3); +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT * FROM atest5; -- fail +ERROR: permission denied for table atest5 +SELECT one FROM atest5; -- ok + one +----- + 1 +(1 row) + +COPY atest5 (one) TO stdout; -- ok +1 +SELECT two FROM atest5; -- fail +ERROR: permission denied for table atest5 +COPY atest5 (two) TO stdout; -- fail +ERROR: permission denied for table atest5 +SELECT atest5 FROM atest5; -- fail +ERROR: permission denied for table atest5 +COPY atest5 (one,two) TO stdout; -- fail +ERROR: permission denied for table atest5 +SELECT 1 FROM atest5; -- ok + ?column? +---------- + 1 +(1 row) + +SELECT 1 FROM atest5 a JOIN atest5 b USING (one); -- ok + ?column? +---------- + 1 +(1 row) + +SELECT 1 FROM atest5 a JOIN atest5 b USING (two); -- fail +ERROR: permission denied for table atest5 +SELECT 1 FROM atest5 a NATURAL JOIN atest5 b; -- fail +ERROR: permission denied for table atest5 +SELECT * FROM (atest5 a JOIN atest5 b USING (one)) j; -- fail +ERROR: permission denied for table atest5 +SELECT j.* FROM (atest5 a JOIN atest5 b USING (one)) j; -- fail +ERROR: permission denied for table atest5 +SELECT (j.*) IS NULL FROM (atest5 a JOIN atest5 b USING (one)) j; -- fail +ERROR: permission denied for table atest5 +SELECT one FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- ok + one +----- + 1 +(1 row) + +SELECT j.one FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- ok + one +----- + 1 +(1 row) + +SELECT two FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- fail +ERROR: permission denied for table atest5 +SELECT j.two FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- fail +ERROR: permission denied for table atest5 +SELECT y FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- fail +ERROR: permission denied for table atest5 +SELECT j.y FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- fail +ERROR: permission denied for table atest5 +SELECT * FROM (atest5 a JOIN atest5 b USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT a.* FROM (atest5 a JOIN atest5 b USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT (a.*) IS NULL FROM (atest5 a JOIN atest5 b USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT two FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT a.two FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT y FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT b.y FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT y FROM (atest5 a LEFT JOIN atest5 b(one,x,y,z) USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT b.y FROM (atest5 a LEFT JOIN atest5 b(one,x,y,z) USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT y FROM (atest5 a FULL JOIN atest5 b(one,x,y,z) USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT b.y FROM (atest5 a FULL JOIN atest5 b(one,x,y,z) USING (one)); -- fail +ERROR: permission denied for table atest5 +SELECT 1 FROM atest5 WHERE two = 2; -- fail +ERROR: permission denied for table atest5 +SELECT * FROM atest1, atest5; -- fail +ERROR: permission denied for table atest5 +SELECT atest1.* FROM atest1, atest5; -- ok + a | b +---+----- + 1 | two + 1 | two +(2 rows) + +SELECT atest1.*,atest5.one FROM atest1, atest5; -- ok + a | b | one +---+-----+----- + 1 | two | 1 + 1 | two | 1 +(2 rows) + +SELECT atest1.*,atest5.one FROM atest1 JOIN atest5 ON (atest1.a = atest5.two); -- fail +ERROR: permission denied for table atest5 +SELECT atest1.*,atest5.one FROM atest1 JOIN atest5 ON (atest1.a = atest5.one); -- ok + a | b | one +---+-----+----- + 1 | two | 1 + 1 | two | 1 +(2 rows) + +SELECT one, two FROM atest5; -- fail +ERROR: permission denied for table atest5 +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (one,two) ON atest6 TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT one, two FROM atest5 NATURAL JOIN atest6; -- fail still +ERROR: permission denied for table atest5 +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (two) ON atest5 TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT one, two FROM atest5 NATURAL JOIN atest6; -- ok now + one | two +-----+----- +(0 rows) + +-- test column-level privileges for INSERT and UPDATE +INSERT INTO atest5 (two) VALUES (3); -- ok +COPY atest5 FROM stdin; -- fail +ERROR: permission denied for table atest5 +COPY atest5 (two) FROM stdin; -- ok +INSERT INTO atest5 (three) VALUES (4); -- fail +ERROR: permission denied for table atest5 +INSERT INTO atest5 VALUES (5,5,5); -- fail +ERROR: permission denied for table atest5 +UPDATE atest5 SET three = 10; -- ok +UPDATE atest5 SET one = 8; -- fail +ERROR: permission denied for table atest5 +UPDATE atest5 SET three = 5, one = 2; -- fail +ERROR: permission denied for table atest5 +-- Check that column level privs are enforced in RETURNING +-- Ok. +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = 10; +-- Error. No SELECT on column three. +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = 10 RETURNING atest5.three; +ERROR: permission denied for table atest5 +-- Ok. May SELECT on column "one": +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = 10 RETURNING atest5.one; + one +----- + +(1 row) + +-- Check that column level privileges are enforced for EXCLUDED +-- Ok. we may select one +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = EXCLUDED.one; +-- Error. No select rights on three +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = EXCLUDED.three; +ERROR: permission denied for table atest5 +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set one = 8; -- fails (due to UPDATE) +ERROR: permission denied for table atest5 +INSERT INTO atest5(three) VALUES (4) ON CONFLICT (two) DO UPDATE set three = 10; -- fails (due to INSERT) +ERROR: permission denied for table atest5 +-- Check that the columns in the inference require select privileges +INSERT INTO atest5(four) VALUES (4); -- fail +ERROR: permission denied for table atest5 +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT INSERT (four) ON atest5 TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +INSERT INTO atest5(four) VALUES (4) ON CONFLICT (four) DO UPDATE set three = 3; -- fails (due to SELECT) +ERROR: permission denied for table atest5 +INSERT INTO atest5(four) VALUES (4) ON CONFLICT ON CONSTRAINT atest5_four_key DO UPDATE set three = 3; -- fails (due to SELECT) +ERROR: permission denied for table atest5 +INSERT INTO atest5(four) VALUES (4); -- ok +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (four) ON atest5 TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +INSERT INTO atest5(four) VALUES (4) ON CONFLICT (four) DO UPDATE set three = 3; -- ok +INSERT INTO atest5(four) VALUES (4) ON CONFLICT ON CONSTRAINT atest5_four_key DO UPDATE set three = 3; -- ok +SET SESSION AUTHORIZATION regress_priv_user1; +REVOKE ALL (one) ON atest5 FROM regress_priv_user4; +GRANT SELECT (one,two,blue) ON atest6 TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT one FROM atest5; -- fail +ERROR: permission denied for table atest5 +UPDATE atest5 SET one = 1; -- fail +ERROR: permission denied for table atest5 +SELECT atest6 FROM atest6; -- ok + atest6 +-------- +(0 rows) + +COPY atest6 TO stdout; -- ok +-- check error reporting with column privs +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE t1 (c1 int, c2 int, c3 int check (c3 < 5), primary key (c1, c2)); +GRANT SELECT (c1) ON t1 TO regress_priv_user2; +GRANT INSERT (c1, c2, c3) ON t1 TO regress_priv_user2; +GRANT UPDATE (c1, c2, c3) ON t1 TO regress_priv_user2; +-- seed data +INSERT INTO t1 VALUES (1, 1, 1); +INSERT INTO t1 VALUES (1, 2, 1); +INSERT INTO t1 VALUES (2, 1, 2); +INSERT INTO t1 VALUES (2, 2, 2); +INSERT INTO t1 VALUES (3, 1, 3); +SET SESSION AUTHORIZATION regress_priv_user2; +INSERT INTO t1 (c1, c2) VALUES (1, 1); -- fail, but row not shown +ERROR: duplicate key value violates unique constraint "t1_pkey" +UPDATE t1 SET c2 = 1; -- fail, but row not shown +ERROR: duplicate key value violates unique constraint "t1_pkey" +INSERT INTO t1 (c1, c2) VALUES (null, null); -- fail, but see columns being inserted +ERROR: null value in column "c1" of relation "t1" violates not-null constraint +DETAIL: Failing row contains (c1, c2) = (null, null). +INSERT INTO t1 (c3) VALUES (null); -- fail, but see columns being inserted or have SELECT +ERROR: null value in column "c1" of relation "t1" violates not-null constraint +DETAIL: Failing row contains (c1, c3) = (null, null). +INSERT INTO t1 (c1) VALUES (5); -- fail, but see columns being inserted or have SELECT +ERROR: null value in column "c2" of relation "t1" violates not-null constraint +DETAIL: Failing row contains (c1) = (5). +UPDATE t1 SET c3 = 10; -- fail, but see columns with SELECT rights, or being modified +ERROR: new row for relation "t1" violates check constraint "t1_c3_check" +DETAIL: Failing row contains (c1, c3) = (1, 10). +SET SESSION AUTHORIZATION regress_priv_user1; +DROP TABLE t1; +-- check error reporting with column privs on a partitioned table +CREATE TABLE errtst(a text, b text NOT NULL, c text, secret1 text, secret2 text) PARTITION BY LIST (a); +CREATE TABLE errtst_part_1(secret2 text, c text, a text, b text NOT NULL, secret1 text); +CREATE TABLE errtst_part_2(secret1 text, secret2 text, a text, c text, b text NOT NULL); +ALTER TABLE errtst ATTACH PARTITION errtst_part_1 FOR VALUES IN ('aaa'); +ALTER TABLE errtst ATTACH PARTITION errtst_part_2 FOR VALUES IN ('aaaa'); +GRANT SELECT (a, b, c) ON TABLE errtst TO regress_priv_user2; +GRANT UPDATE (a, b, c) ON TABLE errtst TO regress_priv_user2; +GRANT INSERT (a, b, c) ON TABLE errtst TO regress_priv_user2; +INSERT INTO errtst_part_1 (a, b, c, secret1, secret2) +VALUES ('aaa', 'bbb', 'ccc', 'the body', 'is in the attic'); +SET SESSION AUTHORIZATION regress_priv_user2; +-- Perform a few updates that violate the NOT NULL constraint. Make sure +-- the error messages don't leak the secret fields. +-- simple insert. +INSERT INTO errtst (a, b) VALUES ('aaa', NULL); +ERROR: null value in column "b" of relation "errtst_part_1" violates not-null constraint +DETAIL: Failing row contains (a, b, c) = (aaa, null, null). +-- simple update. +UPDATE errtst SET b = NULL; +ERROR: null value in column "b" of relation "errtst_part_1" violates not-null constraint +DETAIL: Failing row contains (a, b, c) = (aaa, null, ccc). +-- partitioning key is updated, doesn't move the row. +UPDATE errtst SET a = 'aaa', b = NULL; +ERROR: null value in column "b" of relation "errtst_part_1" violates not-null constraint +DETAIL: Failing row contains (a, b, c) = (aaa, null, ccc). +-- row is moved to another partition. +UPDATE errtst SET a = 'aaaa', b = NULL; +ERROR: null value in column "b" of relation "errtst_part_2" violates not-null constraint +DETAIL: Failing row contains (a, b, c) = (aaaa, null, ccc). +-- row is moved to another partition. This differs from the previous case in +-- that the new partition is excluded by constraint exclusion, so its +-- ResultRelInfo is not created at ExecInitModifyTable, but needs to be +-- constructed on the fly when the updated tuple is routed to it. +UPDATE errtst SET a = 'aaaa', b = NULL WHERE a = 'aaa'; +ERROR: null value in column "b" of relation "errtst_part_2" violates not-null constraint +DETAIL: Failing row contains (a, b, c) = (aaaa, null, ccc). +SET SESSION AUTHORIZATION regress_priv_user1; +DROP TABLE errtst; +-- test column-level privileges when involved with DELETE +SET SESSION AUTHORIZATION regress_priv_user1; +ALTER TABLE atest6 ADD COLUMN three integer; +GRANT DELETE ON atest5 TO regress_priv_user3; +GRANT SELECT (two) ON atest5 TO regress_priv_user3; +REVOKE ALL (one) ON atest5 FROM regress_priv_user3; +GRANT SELECT (one) ON atest5 TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT atest6 FROM atest6; -- fail +ERROR: permission denied for table atest6 +SELECT one FROM atest5 NATURAL JOIN atest6; -- fail +ERROR: permission denied for table atest5 +SET SESSION AUTHORIZATION regress_priv_user1; +ALTER TABLE atest6 DROP COLUMN three; +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT atest6 FROM atest6; -- ok + atest6 +-------- +(0 rows) + +SELECT one FROM atest5 NATURAL JOIN atest6; -- ok + one +----- +(0 rows) + +SET SESSION AUTHORIZATION regress_priv_user1; +ALTER TABLE atest6 DROP COLUMN two; +REVOKE SELECT (one,blue) ON atest6 FROM regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT * FROM atest6; -- fail +ERROR: permission denied for table atest6 +SELECT 1 FROM atest6; -- fail +ERROR: permission denied for table atest6 +SET SESSION AUTHORIZATION regress_priv_user3; +DELETE FROM atest5 WHERE one = 1; -- fail +ERROR: permission denied for table atest5 +DELETE FROM atest5 WHERE two = 2; -- ok +-- check inheritance cases +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE atestp1 (f1 int, f2 int); +CREATE TABLE atestp2 (fx int, fy int); +CREATE TABLE atestc (fz int) INHERITS (atestp1, atestp2); +GRANT SELECT(fx,fy,tableoid) ON atestp2 TO regress_priv_user2; +GRANT SELECT(fx) ON atestc TO regress_priv_user2; +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT fx FROM atestp2; -- ok + fx +---- +(0 rows) + +SELECT fy FROM atestp2; -- ok + fy +---- +(0 rows) + +SELECT atestp2 FROM atestp2; -- ok + atestp2 +--------- +(0 rows) + +SELECT tableoid FROM atestp2; -- ok + tableoid +---------- +(0 rows) + +SELECT fy FROM atestc; -- fail +ERROR: permission denied for table atestc +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT(fy,tableoid) ON atestc TO regress_priv_user2; +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT fx FROM atestp2; -- still ok + fx +---- +(0 rows) + +SELECT fy FROM atestp2; -- ok + fy +---- +(0 rows) + +SELECT atestp2 FROM atestp2; -- ok + atestp2 +--------- +(0 rows) + +SELECT tableoid FROM atestp2; -- ok + tableoid +---------- +(0 rows) + +-- child's permissions do not apply when operating on parent +SET SESSION AUTHORIZATION regress_priv_user1; +REVOKE ALL ON atestc FROM regress_priv_user2; +GRANT ALL ON atestp1 TO regress_priv_user2; +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT f2 FROM atestp1; -- ok + f2 +---- +(0 rows) + +SELECT f2 FROM atestc; -- fail +ERROR: permission denied for table atestc +DELETE FROM atestp1; -- ok +DELETE FROM atestc; -- fail +ERROR: permission denied for table atestc +UPDATE atestp1 SET f1 = 1; -- ok +UPDATE atestc SET f1 = 1; -- fail +ERROR: permission denied for table atestc +TRUNCATE atestp1; -- ok +TRUNCATE atestc; -- fail +ERROR: permission denied for table atestc +BEGIN; +LOCK atestp1; +END; +BEGIN; +LOCK atestc; +ERROR: permission denied for table atestc +END; +-- privileges on functions, languages +-- switch to superuser +\c - +REVOKE ALL PRIVILEGES ON LANGUAGE sql FROM PUBLIC; +GRANT USAGE ON LANGUAGE sql TO regress_priv_user1; -- ok +GRANT USAGE ON LANGUAGE c TO PUBLIC; -- fail +ERROR: language "c" is not trusted +DETAIL: GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages. +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT USAGE ON LANGUAGE sql TO regress_priv_user2; -- fail +WARNING: no privileges were granted for "sql" +CREATE FUNCTION priv_testfunc1(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql; +CREATE FUNCTION priv_testfunc2(int) RETURNS int AS 'select 3 * $1;' LANGUAGE sql; +CREATE AGGREGATE priv_testagg1(int) (sfunc = int4pl, stype = int4); +CREATE PROCEDURE priv_testproc1(int) AS 'select $1;' LANGUAGE sql; +REVOKE ALL ON FUNCTION priv_testfunc1(int), priv_testfunc2(int), priv_testagg1(int) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION priv_testfunc1(int), priv_testfunc2(int), priv_testagg1(int) TO regress_priv_user2; +REVOKE ALL ON FUNCTION priv_testproc1(int) FROM PUBLIC; -- fail, not a function +ERROR: priv_testproc1(integer) is not a function +REVOKE ALL ON PROCEDURE priv_testproc1(int) FROM PUBLIC; +GRANT EXECUTE ON PROCEDURE priv_testproc1(int) TO regress_priv_user2; +GRANT USAGE ON FUNCTION priv_testfunc1(int) TO regress_priv_user3; -- semantic error +ERROR: invalid privilege type USAGE for function +GRANT USAGE ON FUNCTION priv_testagg1(int) TO regress_priv_user3; -- semantic error +ERROR: invalid privilege type USAGE for function +GRANT USAGE ON PROCEDURE priv_testproc1(int) TO regress_priv_user3; -- semantic error +ERROR: invalid privilege type USAGE for procedure +GRANT ALL PRIVILEGES ON FUNCTION priv_testfunc1(int) TO regress_priv_user4; +GRANT ALL PRIVILEGES ON FUNCTION priv_testfunc_nosuch(int) TO regress_priv_user4; +ERROR: function priv_testfunc_nosuch(integer) does not exist +GRANT ALL PRIVILEGES ON FUNCTION priv_testagg1(int) TO regress_priv_user4; +GRANT ALL PRIVILEGES ON PROCEDURE priv_testproc1(int) TO regress_priv_user4; +CREATE FUNCTION priv_testfunc4(boolean) RETURNS text + AS 'select col1 from atest2 where col2 = $1;' + LANGUAGE sql SECURITY DEFINER; +GRANT EXECUTE ON FUNCTION priv_testfunc4(boolean) TO regress_priv_user3; +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT priv_testfunc1(5), priv_testfunc2(5); -- ok + priv_testfunc1 | priv_testfunc2 +----------------+---------------- + 10 | 15 +(1 row) + +CREATE FUNCTION priv_testfunc3(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql; -- fail +ERROR: permission denied for language sql +SELECT priv_testagg1(x) FROM (VALUES (1), (2), (3)) _(x); -- ok + priv_testagg1 +--------------- + 6 +(1 row) + +CALL priv_testproc1(6); -- ok +SET SESSION AUTHORIZATION regress_priv_user3; +SELECT priv_testfunc1(5); -- fail +ERROR: permission denied for function priv_testfunc1 +SELECT priv_testagg1(x) FROM (VALUES (1), (2), (3)) _(x); -- fail +ERROR: permission denied for aggregate priv_testagg1 +CALL priv_testproc1(6); -- fail +ERROR: permission denied for procedure priv_testproc1 +SELECT col1 FROM atest2 WHERE col2 = true; -- fail +ERROR: permission denied for table atest2 +SELECT priv_testfunc4(true); -- ok + priv_testfunc4 +---------------- + bar +(1 row) + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT priv_testfunc1(5); -- ok + priv_testfunc1 +---------------- + 10 +(1 row) + +SELECT priv_testagg1(x) FROM (VALUES (1), (2), (3)) _(x); -- ok + priv_testagg1 +--------------- + 6 +(1 row) + +CALL priv_testproc1(6); -- ok +DROP FUNCTION priv_testfunc1(int); -- fail +ERROR: must be owner of function priv_testfunc1 +DROP AGGREGATE priv_testagg1(int); -- fail +ERROR: must be owner of aggregate priv_testagg1 +DROP PROCEDURE priv_testproc1(int); -- fail +ERROR: must be owner of procedure priv_testproc1 +\c - +DROP FUNCTION priv_testfunc1(int); -- ok +-- restore to sanity +GRANT ALL PRIVILEGES ON LANGUAGE sql TO PUBLIC; +-- verify privilege checks on array-element coercions +BEGIN; +SELECT '{1}'::int4[]::int8[]; + int8 +------ + {1} +(1 row) + +REVOKE ALL ON FUNCTION int8(integer) FROM PUBLIC; +SELECT '{1}'::int4[]::int8[]; --superuser, succeed + int8 +------ + {1} +(1 row) + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT '{1}'::int4[]::int8[]; --other user, fail +ERROR: permission denied for function int8 +ROLLBACK; +-- privileges on types +-- switch to superuser +\c - +CREATE TYPE priv_testtype1 AS (a int, b text); +REVOKE USAGE ON TYPE priv_testtype1 FROM PUBLIC; +GRANT USAGE ON TYPE priv_testtype1 TO regress_priv_user2; +GRANT USAGE ON TYPE _priv_testtype1 TO regress_priv_user2; -- fail +ERROR: cannot set privileges of array types +HINT: Set the privileges of the element type instead. +GRANT USAGE ON DOMAIN priv_testtype1 TO regress_priv_user2; -- fail +ERROR: "priv_testtype1" is not a domain +CREATE DOMAIN priv_testdomain1 AS int; +REVOKE USAGE on DOMAIN priv_testdomain1 FROM PUBLIC; +GRANT USAGE ON DOMAIN priv_testdomain1 TO regress_priv_user2; +GRANT USAGE ON TYPE priv_testdomain1 TO regress_priv_user2; -- ok +SET SESSION AUTHORIZATION regress_priv_user1; +-- commands that should fail +CREATE AGGREGATE priv_testagg1a(priv_testdomain1) (sfunc = int4_sum, stype = bigint); +ERROR: permission denied for type priv_testdomain1 +CREATE DOMAIN priv_testdomain2a AS priv_testdomain1; +ERROR: permission denied for type priv_testdomain1 +CREATE DOMAIN priv_testdomain3a AS int; +CREATE FUNCTION castfunc(int) RETURNS priv_testdomain3a AS $$ SELECT $1::priv_testdomain3a $$ LANGUAGE SQL; +CREATE CAST (priv_testdomain1 AS priv_testdomain3a) WITH FUNCTION castfunc(int); +ERROR: permission denied for type priv_testdomain1 +DROP FUNCTION castfunc(int) CASCADE; +DROP DOMAIN priv_testdomain3a; +CREATE FUNCTION priv_testfunc5a(a priv_testdomain1) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; +ERROR: permission denied for type priv_testdomain1 +CREATE FUNCTION priv_testfunc6a(b int) RETURNS priv_testdomain1 LANGUAGE SQL AS $$ SELECT $1::priv_testdomain1 $$; +ERROR: permission denied for type priv_testdomain1 +CREATE OPERATOR !+! (PROCEDURE = int4pl, LEFTARG = priv_testdomain1, RIGHTARG = priv_testdomain1); +ERROR: permission denied for type priv_testdomain1 +CREATE TABLE test5a (a int, b priv_testdomain1); +ERROR: permission denied for type priv_testdomain1 +CREATE TABLE test6a OF priv_testtype1; +ERROR: permission denied for type priv_testtype1 +CREATE TABLE test10a (a int[], b priv_testtype1[]); +ERROR: permission denied for type priv_testtype1 +CREATE TABLE test9a (a int, b int); +ALTER TABLE test9a ADD COLUMN c priv_testdomain1; +ERROR: permission denied for type priv_testdomain1 +ALTER TABLE test9a ALTER COLUMN b TYPE priv_testdomain1; +ERROR: permission denied for type priv_testdomain1 +CREATE TYPE test7a AS (a int, b priv_testdomain1); +ERROR: permission denied for type priv_testdomain1 +CREATE TYPE test8a AS (a int, b int); +ALTER TYPE test8a ADD ATTRIBUTE c priv_testdomain1; +ERROR: permission denied for type priv_testdomain1 +ALTER TYPE test8a ALTER ATTRIBUTE b TYPE priv_testdomain1; +ERROR: permission denied for type priv_testdomain1 +CREATE TABLE test11a AS (SELECT 1::priv_testdomain1 AS a); +ERROR: permission denied for type priv_testdomain1 +REVOKE ALL ON TYPE priv_testtype1 FROM PUBLIC; +ERROR: permission denied for type priv_testtype1 +SET SESSION AUTHORIZATION regress_priv_user2; +-- commands that should succeed +CREATE AGGREGATE priv_testagg1b(priv_testdomain1) (sfunc = int4_sum, stype = bigint); +CREATE DOMAIN priv_testdomain2b AS priv_testdomain1; +CREATE DOMAIN priv_testdomain3b AS int; +CREATE FUNCTION castfunc(int) RETURNS priv_testdomain3b AS $$ SELECT $1::priv_testdomain3b $$ LANGUAGE SQL; +CREATE CAST (priv_testdomain1 AS priv_testdomain3b) WITH FUNCTION castfunc(int); +WARNING: cast will be ignored because the source data type is a domain +CREATE FUNCTION priv_testfunc5b(a priv_testdomain1) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; +CREATE FUNCTION priv_testfunc6b(b int) RETURNS priv_testdomain1 LANGUAGE SQL AS $$ SELECT $1::priv_testdomain1 $$; +CREATE OPERATOR !! (PROCEDURE = priv_testfunc5b, RIGHTARG = priv_testdomain1); +CREATE TABLE test5b (a int, b priv_testdomain1); +CREATE TABLE test6b OF priv_testtype1; +CREATE TABLE test10b (a int[], b priv_testtype1[]); +CREATE TABLE test9b (a int, b int); +ALTER TABLE test9b ADD COLUMN c priv_testdomain1; +ALTER TABLE test9b ALTER COLUMN b TYPE priv_testdomain1; +CREATE TYPE test7b AS (a int, b priv_testdomain1); +CREATE TYPE test8b AS (a int, b int); +ALTER TYPE test8b ADD ATTRIBUTE c priv_testdomain1; +ALTER TYPE test8b ALTER ATTRIBUTE b TYPE priv_testdomain1; +CREATE TABLE test11b AS (SELECT 1::priv_testdomain1 AS a); +REVOKE ALL ON TYPE priv_testtype1 FROM PUBLIC; +WARNING: no privileges could be revoked for "priv_testtype1" +NOTICE: no privileges could be revoked +\c - +DROP AGGREGATE priv_testagg1b(priv_testdomain1); +DROP DOMAIN priv_testdomain2b; +DROP OPERATOR !! (NONE, priv_testdomain1); +DROP FUNCTION priv_testfunc5b(a priv_testdomain1); +DROP FUNCTION priv_testfunc6b(b int); +DROP TABLE test5b; +DROP TABLE test6b; +DROP TABLE test9b; +DROP TABLE test10b; +DROP TYPE test7b; +DROP TYPE test8b; +DROP CAST (priv_testdomain1 AS priv_testdomain3b); +DROP FUNCTION castfunc(int) CASCADE; +DROP DOMAIN priv_testdomain3b; +DROP TABLE test11b; +DROP TYPE priv_testtype1; -- ok +DROP DOMAIN priv_testdomain1; -- ok +-- truncate +SET SESSION AUTHORIZATION regress_priv_user5; +TRUNCATE atest2; -- ok +TRUNCATE atest3; -- fail +ERROR: permission denied for table atest3 +-- has_table_privilege function +-- bad-input checks +select has_table_privilege(NULL,'pg_authid','select'); + has_table_privilege +--------------------- + +(1 row) + +select has_table_privilege('pg_shad','select'); +ERROR: relation "pg_shad" does not exist +select has_table_privilege('nosuchuser','pg_authid','select'); +ERROR: role "nosuchuser" does not exist +select has_table_privilege('pg_authid','sel'); +ERROR: unrecognized privilege type: "sel" +select has_table_privilege(-999999,'pg_authid','update'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(1,'select'); + has_table_privilege +--------------------- + +(1 row) + +-- superuser +\c - +select has_table_privilege(current_user,'pg_authid','select'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(current_user,'pg_authid','insert'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t2.oid,'pg_authid','update') +from (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t2.oid,'pg_authid','delete') +from (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + t +(1 row) + +-- 'rule' privilege no longer exists, but for backwards compatibility +-- has_table_privilege still recognizes the keyword and says FALSE +select has_table_privilege(current_user,t1.oid,'rule') +from (select oid from pg_class where relname = 'pg_authid') as t1; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(current_user,t1.oid,'references') +from (select oid from pg_class where relname = 'pg_authid') as t1; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t2.oid,t1.oid,'select') +from (select oid from pg_class where relname = 'pg_authid') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t2.oid,t1.oid,'insert') +from (select oid from pg_class where relname = 'pg_authid') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('pg_authid','update'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('pg_authid','delete'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege('pg_authid','truncate'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t1.oid,'select') +from (select oid from pg_class where relname = 'pg_authid') as t1; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t1.oid,'trigger') +from (select oid from pg_class where relname = 'pg_authid') as t1; + has_table_privilege +--------------------- + t +(1 row) + +-- non-superuser +SET SESSION AUTHORIZATION regress_priv_user3; +select has_table_privilege(current_user,'pg_class','select'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(current_user,'pg_class','insert'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(t2.oid,'pg_class','update') +from (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(t2.oid,'pg_class','delete') +from (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(current_user,t1.oid,'references') +from (select oid from pg_class where relname = 'pg_class') as t1; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(t2.oid,t1.oid,'select') +from (select oid from pg_class where relname = 'pg_class') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t2.oid,t1.oid,'insert') +from (select oid from pg_class where relname = 'pg_class') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('pg_class','update'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('pg_class','delete'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('pg_class','truncate'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(t1.oid,'select') +from (select oid from pg_class where relname = 'pg_class') as t1; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t1.oid,'trigger') +from (select oid from pg_class where relname = 'pg_class') as t1; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(current_user,'atest1','select'); + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(current_user,'atest1','insert'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(t2.oid,'atest1','update') +from (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(t2.oid,'atest1','delete') +from (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(current_user,t1.oid,'references') +from (select oid from pg_class where relname = 'atest1') as t1; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(t2.oid,t1.oid,'select') +from (select oid from pg_class where relname = 'atest1') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t2.oid,t1.oid,'insert') +from (select oid from pg_class where relname = 'atest1') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('atest1','update'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('atest1','delete'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege('atest1','truncate'); + has_table_privilege +--------------------- + f +(1 row) + +select has_table_privilege(t1.oid,'select') +from (select oid from pg_class where relname = 'atest1') as t1; + has_table_privilege +--------------------- + t +(1 row) + +select has_table_privilege(t1.oid,'trigger') +from (select oid from pg_class where relname = 'atest1') as t1; + has_table_privilege +--------------------- + f +(1 row) + +-- has_column_privilege function +-- bad-input checks (as non-super-user) +select has_column_privilege('pg_authid',NULL,'select'); + has_column_privilege +---------------------- + +(1 row) + +select has_column_privilege('pg_authid','nosuchcol','select'); +ERROR: column "nosuchcol" of relation "pg_authid" does not exist +select has_column_privilege(9999,'nosuchcol','select'); + has_column_privilege +---------------------- + +(1 row) + +select has_column_privilege(9999,99::int2,'select'); + has_column_privilege +---------------------- + +(1 row) + +select has_column_privilege('pg_authid',99::int2,'select'); + has_column_privilege +---------------------- + +(1 row) + +select has_column_privilege(9999,99::int2,'select'); + has_column_privilege +---------------------- + +(1 row) + +create temp table mytable(f1 int, f2 int, f3 int); +alter table mytable drop column f2; +select has_column_privilege('mytable','f2','select'); +ERROR: column "f2" of relation "mytable" does not exist +select has_column_privilege('mytable','........pg.dropped.2........','select'); + has_column_privilege +---------------------- + +(1 row) + +select has_column_privilege('mytable',2::int2,'select'); + has_column_privilege +---------------------- + +(1 row) + +select has_column_privilege('mytable',99::int2,'select'); + has_column_privilege +---------------------- + +(1 row) + +revoke select on table mytable from regress_priv_user3; +select has_column_privilege('mytable',2::int2,'select'); + has_column_privilege +---------------------- + +(1 row) + +select has_column_privilege('mytable',99::int2,'select'); + has_column_privilege +---------------------- + +(1 row) + +drop table mytable; +-- Grant options +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE atest4 (a int); +GRANT SELECT ON atest4 TO regress_priv_user2 WITH GRANT OPTION; +GRANT UPDATE ON atest4 TO regress_priv_user2; +GRANT SELECT ON atest4 TO GROUP regress_priv_group1 WITH GRANT OPTION; +SET SESSION AUTHORIZATION regress_priv_user2; +GRANT SELECT ON atest4 TO regress_priv_user3; +GRANT UPDATE ON atest4 TO regress_priv_user3; -- fail +WARNING: no privileges were granted for "atest4" +SET SESSION AUTHORIZATION regress_priv_user1; +REVOKE SELECT ON atest4 FROM regress_priv_user3; -- does nothing +NOTICE: no privileges could be revoked +SELECT has_table_privilege('regress_priv_user3', 'atest4', 'SELECT'); -- true + has_table_privilege +--------------------- + t +(1 row) + +REVOKE SELECT ON atest4 FROM regress_priv_user2; -- fail +ERROR: dependent privileges exist +HINT: Use CASCADE to revoke them too. +REVOKE GRANT OPTION FOR SELECT ON atest4 FROM regress_priv_user2 CASCADE; -- ok +SELECT has_table_privilege('regress_priv_user2', 'atest4', 'SELECT'); -- true + has_table_privilege +--------------------- + t +(1 row) + +SELECT has_table_privilege('regress_priv_user3', 'atest4', 'SELECT'); -- false + has_table_privilege +--------------------- + f +(1 row) + +SELECT has_table_privilege('regress_priv_user1', 'atest4', 'SELECT WITH GRANT OPTION'); -- true + has_table_privilege +--------------------- + t +(1 row) + +-- security-restricted operations +\c - +CREATE ROLE regress_sro_user; +-- Check that index expressions and predicates are run as the table's owner +-- A dummy index function checking current_user +CREATE FUNCTION sro_ifun(int) RETURNS int AS $$ +BEGIN + -- Below we set the table's owner to regress_sro_user + ASSERT current_user = 'regress_sro_user', + format('sro_ifun(%s) called by %s', $1, current_user); + RETURN $1; +END; +$$ LANGUAGE plpgsql IMMUTABLE; +-- Create a table owned by regress_sro_user +CREATE TABLE sro_tab (a int); +ALTER TABLE sro_tab OWNER TO regress_sro_user; +INSERT INTO sro_tab VALUES (1), (2), (3); +-- Create an expression index with a predicate +CREATE INDEX sro_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +DROP INDEX sro_idx; +-- Do the same concurrently +CREATE INDEX sro_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +-- REINDEX +REINDEX TABLE sro_tab; +REINDEX INDEX sro_idx; +REINDEX TABLE sro_tab; +DROP INDEX sro_idx; +-- CLUSTER +CREATE INDEX sro_cluster_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))); +CLUSTER sro_tab USING sro_cluster_idx; +DROP INDEX sro_cluster_idx; +-- BRIN index +CREATE INDEX sro_brin ON sro_tab USING brin ((sro_ifun(a) + sro_ifun(0))); +SELECT brin_desummarize_range('sro_brin', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_summarize_range('sro_brin', 0); +ERROR: Cloudberry could not summarize indicated page range +CONTEXT: SQL function "brin_summarize_range" statement 1 +DROP TABLE sro_tab; +-- Check with a partitioned table +CREATE TABLE sro_ptab (a int) PARTITION BY RANGE (a); +ALTER TABLE sro_ptab OWNER TO regress_sro_user; +CREATE TABLE sro_part PARTITION OF sro_ptab FOR VALUES FROM (1) TO (10); +ALTER TABLE sro_part OWNER TO regress_sro_user; +INSERT INTO sro_ptab VALUES (1), (2), (3); +CREATE INDEX sro_pidx ON sro_ptab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +REINDEX TABLE sro_ptab; +REINDEX INDEX sro_pidx; +SET SESSION AUTHORIZATION regress_sro_user; +CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS + 'GRANT regress_priv_group2 TO regress_sro_user'; +CREATE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS + 'DECLARE c CURSOR WITH HOLD FOR SELECT unwanted_grant(); SELECT true'; +-- REFRESH of this MV will queue a GRANT at end of transaction +CREATE MATERIALIZED VIEW sro_mv AS SELECT mv_action() WITH NO DATA; +REFRESH MATERIALIZED VIEW sro_mv; +ERROR: cannot create a cursor WITH HOLD within security-restricted operation +CONTEXT: SQL function "mv_action" statement 1 +\c - +REFRESH MATERIALIZED VIEW sro_mv; +ERROR: cannot create a cursor WITH HOLD within security-restricted operation +CONTEXT: SQL function "mv_action" statement 1 +SET SESSION AUTHORIZATION regress_sro_user; +-- INSERT to this table will queue a GRANT at end of transaction +CREATE TABLE sro_trojan_table (); +CREATE FUNCTION sro_trojan() RETURNS trigger LANGUAGE plpgsql AS + 'BEGIN PERFORM unwanted_grant(); RETURN NULL; END'; +CREATE CONSTRAINT TRIGGER t AFTER INSERT ON sro_trojan_table + INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE sro_trojan(); +-- Now, REFRESH will issue such an INSERT, queueing the GRANT +CREATE OR REPLACE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS + 'INSERT INTO sro_trojan_table DEFAULT VALUES; SELECT true'; +REFRESH MATERIALIZED VIEW sro_mv; +ERROR: cannot fire deferred trigger within security-restricted operation +CONTEXT: SQL function "mv_action" statement 1 +\c - +REFRESH MATERIALIZED VIEW sro_mv; +ERROR: cannot fire deferred trigger within security-restricted operation +CONTEXT: SQL function "mv_action" statement 1 +BEGIN; SET allow_segment_DML = ON; SET CONSTRAINTS ALL IMMEDIATE; REFRESH MATERIALIZED VIEW sro_mv; COMMIT; +ERROR: must have admin option on role "regress_priv_group2" +CONTEXT: SQL function "unwanted_grant" statement 1 +SQL statement "SELECT unwanted_grant()" +PL/pgSQL function sro_trojan() line 1 at PERFORM +SQL function "mv_action" statement 1 +-- REFRESH MATERIALIZED VIEW CONCURRENTLY use of eval_const_expressions() +SET SESSION AUTHORIZATION regress_sro_user; +CREATE FUNCTION unwanted_grant_nofail(int) RETURNS int + IMMUTABLE LANGUAGE plpgsql AS $$ +BEGIN + PERFORM unwanted_grant(); + RAISE WARNING 'owned'; + RETURN 1; +EXCEPTION WHEN OTHERS THEN + RETURN 2; +END$$; +CREATE MATERIALIZED VIEW sro_index_mv AS SELECT 1 AS c; +-- start_ignore +-- GPDB_14_MERGE_FIXME: the following command will abort the sub-transaction +-- in a DDL. The problem is that aborting the sub-transaction will also erase +-- the `dispatch_oids` needed by the QEs. It's a rare case. +-- We don't support this case now +CREATE UNIQUE INDEX ON sro_index_mv (c) WHERE unwanted_grant_nofail(1) > 0; +-- end_ignore +\c - +-- REFRESH MATERIALIZED VIEW CONCURRENTLY sro_index_mv; +REFRESH MATERIALIZED VIEW sro_index_mv; +DROP OWNED BY regress_sro_user; +DROP ROLE regress_sro_user; +-- Admin options +SET SESSION AUTHORIZATION regress_priv_user4; +CREATE FUNCTION dogrant_ok() RETURNS void LANGUAGE sql SECURITY DEFINER AS + 'GRANT regress_priv_group2 TO regress_priv_user5'; +GRANT regress_priv_group2 TO regress_priv_user5; -- ok: had ADMIN OPTION +SET ROLE regress_priv_group2; +GRANT regress_priv_group2 TO regress_priv_user5; -- fails: SET ROLE suspended privilege +ERROR: must have admin option on role "regress_priv_group2" +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT regress_priv_group2 TO regress_priv_user5; -- fails: no ADMIN OPTION +ERROR: must have admin option on role "regress_priv_group2" +SELECT dogrant_ok(); -- ok: SECURITY DEFINER conveys ADMIN +NOTICE: role "regress_priv_user5" is already a member of role "regress_priv_group2" + dogrant_ok +------------ + +(1 row) + +SET ROLE regress_priv_group2; +GRANT regress_priv_group2 TO regress_priv_user5; -- fails: SET ROLE did not help +ERROR: must have admin option on role "regress_priv_group2" +SET SESSION AUTHORIZATION regress_priv_group2; +GRANT regress_priv_group2 TO regress_priv_user5; -- ok: a role can self-admin +NOTICE: role "regress_priv_user5" is already a member of role "regress_priv_group2" +CREATE FUNCTION dogrant_fails() RETURNS void LANGUAGE sql SECURITY DEFINER AS + 'GRANT regress_priv_group2 TO regress_priv_user5'; +SELECT dogrant_fails(); -- fails: no self-admin in SECURITY DEFINER +ERROR: must have admin option on role "regress_priv_group2" +CONTEXT: SQL function "dogrant_fails" statement 1 +DROP FUNCTION dogrant_fails(); +SET SESSION AUTHORIZATION regress_priv_user4; +DROP FUNCTION dogrant_ok(); +REVOKE regress_priv_group2 FROM regress_priv_user5; +-- has_sequence_privilege tests +\c - +CREATE SEQUENCE x_seq; +GRANT USAGE on x_seq to regress_priv_user2; +SELECT has_sequence_privilege('regress_priv_user1', 'atest1', 'SELECT'); +ERROR: "atest1" is not a sequence +SELECT has_sequence_privilege('regress_priv_user1', 'x_seq', 'INSERT'); +ERROR: unrecognized privilege type: "INSERT" +SELECT has_sequence_privilege('regress_priv_user1', 'x_seq', 'SELECT'); + has_sequence_privilege +------------------------ + f +(1 row) + +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT has_sequence_privilege('x_seq', 'USAGE'); + has_sequence_privilege +------------------------ + t +(1 row) + +-- largeobject privilege tests +\c - +SET SESSION AUTHORIZATION regress_priv_user1; +-- start_ignore +SELECT lo_create(1001); +ERROR: large objects are not supported +SELECT lo_create(1002); +ERROR: large objects are not supported +SELECT lo_create(1003); +ERROR: large objects are not supported +SELECT lo_create(1004); +ERROR: large objects are not supported +SELECT lo_create(1005); +ERROR: large objects are not supported +GRANT ALL ON LARGE OBJECT 1001 TO PUBLIC; +ERROR: large objects are not supported +GRANT SELECT ON LARGE OBJECT 1003 TO regress_priv_user2; +ERROR: large objects are not supported +GRANT SELECT,UPDATE ON LARGE OBJECT 1004 TO regress_priv_user2; +ERROR: large objects are not supported +GRANT ALL ON LARGE OBJECT 1005 TO regress_priv_user2; +ERROR: large objects are not supported +GRANT SELECT ON LARGE OBJECT 1005 TO regress_priv_user2 WITH GRANT OPTION; +ERROR: large objects are not supported +GRANT SELECT, INSERT ON LARGE OBJECT 1001 TO PUBLIC; -- to be failed +ERROR: large objects are not supported +GRANT SELECT, UPDATE ON LARGE OBJECT 1001 TO nosuchuser; -- to be failed +ERROR: large objects are not supported +GRANT SELECT, UPDATE ON LARGE OBJECT 999 TO PUBLIC; -- to be failed +ERROR: large objects are not supported +-- end_ignore +\c - +SET SESSION AUTHORIZATION regress_priv_user2; +-- start_ignore +SELECT lo_create(2001); +ERROR: large objects are not supported +SELECT lo_create(2002); +ERROR: large objects are not supported +SELECT loread(lo_open(1001, x'20000'::int), 32); -- allowed, for now +ERROR: large objects are not supported +SELECT lowrite(lo_open(1001, x'40000'::int), 'abcd'); -- fail, wrong mode +ERROR: large objects are not supported +SELECT loread(lo_open(1001, x'40000'::int), 32); +ERROR: large objects are not supported +SELECT loread(lo_open(1002, x'40000'::int), 32); -- to be denied +ERROR: large objects are not supported +SELECT loread(lo_open(1003, x'40000'::int), 32); +ERROR: large objects are not supported +SELECT loread(lo_open(1004, x'40000'::int), 32); +ERROR: large objects are not supported +SELECT lowrite(lo_open(1001, x'20000'::int), 'abcd'); +ERROR: large objects are not supported +SELECT lowrite(lo_open(1002, x'20000'::int), 'abcd'); -- to be denied +ERROR: large objects are not supported +SELECT lowrite(lo_open(1003, x'20000'::int), 'abcd'); -- to be denied +ERROR: large objects are not supported +SELECT lowrite(lo_open(1004, x'20000'::int), 'abcd'); +ERROR: large objects are not supported +GRANT SELECT ON LARGE OBJECT 1005 TO regress_priv_user3; +ERROR: large objects are not supported +GRANT UPDATE ON LARGE OBJECT 1006 TO regress_priv_user3; -- to be denied +ERROR: large objects are not supported +REVOKE ALL ON LARGE OBJECT 2001, 2002 FROM PUBLIC; +ERROR: large objects are not supported +GRANT ALL ON LARGE OBJECT 2001 TO regress_priv_user3; +ERROR: large objects are not supported +SELECT lo_unlink(1001); -- to be denied +ERROR: large objects are not supported +SELECT lo_unlink(2002); +ERROR: large objects are not supported +-- end_ignore +\c - +-- start_ignore +-- confirm ACL setting +SELECT oid, pg_get_userbyid(lomowner) ownername, lomacl FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid; + oid | ownername | lomacl +-----+-----------+-------- +(0 rows) + +-- end_ignore +SET SESSION AUTHORIZATION regress_priv_user3; +-- start_ignore +SELECT loread(lo_open(1001, x'40000'::int), 32); +ERROR: large objects are not supported +SELECT loread(lo_open(1003, x'40000'::int), 32); -- to be denied +ERROR: large objects are not supported +SELECT loread(lo_open(1005, x'40000'::int), 32); +ERROR: large objects are not supported +SELECT lo_truncate(lo_open(1005, x'20000'::int), 10); -- to be denied +ERROR: large objects are not supported +SELECT lo_truncate(lo_open(2001, x'20000'::int), 10); +ERROR: large objects are not supported +-- end_ignore +-- compatibility mode in largeobject permission +\c - +SET lo_compat_privileges = false; -- default setting +SET SESSION AUTHORIZATION regress_priv_user4; +-- start_ignore +SELECT loread(lo_open(1002, x'40000'::int), 32); -- to be denied +ERROR: large objects are not supported +SELECT lowrite(lo_open(1002, x'20000'::int), 'abcd'); -- to be denied +ERROR: large objects are not supported +SELECT lo_truncate(lo_open(1002, x'20000'::int), 10); -- to be denied +ERROR: large objects are not supported +SELECT lo_put(1002, 1, 'abcd'); -- to be denied +ERROR: large object 1002 does not exist +SELECT lo_unlink(1002); -- to be denied +ERROR: large objects are not supported +SELECT lo_export(1001, '/dev/null'); -- to be denied +ERROR: permission denied for function lo_export +SELECT lo_import('/dev/null'); -- to be denied +ERROR: permission denied for function lo_import +SELECT lo_import('/dev/null', 2003); -- to be denied +ERROR: permission denied for function lo_import +-- end_ignore +\c - +SET lo_compat_privileges = true; -- compatibility mode +SET SESSION AUTHORIZATION regress_priv_user4; +-- start_ignore +SELECT loread(lo_open(1002, x'40000'::int), 32); +ERROR: large objects are not supported +SELECT lowrite(lo_open(1002, x'20000'::int), 'abcd'); +ERROR: large objects are not supported +SELECT lo_truncate(lo_open(1002, x'20000'::int), 10); +ERROR: large objects are not supported +SELECT lo_unlink(1002); +ERROR: large objects are not supported +SELECT lo_export(1001, '/dev/null'); -- to be denied +ERROR: permission denied for function lo_export +-- end_ignore +-- don't allow unpriv users to access pg_largeobject contents +\c - +SELECT * FROM pg_largeobject LIMIT 0; + loid | pageno | data +------+--------+------ +(0 rows) + +SET SESSION AUTHORIZATION regress_priv_user1; +SELECT * FROM pg_largeobject LIMIT 0; -- to be denied +ERROR: permission denied for table pg_largeobject +-- test pg_database_owner +RESET SESSION AUTHORIZATION; +GRANT pg_database_owner TO regress_priv_user1; +ERROR: role "pg_database_owner" cannot have explicit members +GRANT regress_priv_user1 TO pg_database_owner; +ERROR: role "pg_database_owner" cannot be a member of any role +CREATE TABLE datdba_only (); +ALTER TABLE datdba_only OWNER TO pg_database_owner; +REVOKE DELETE ON datdba_only FROM pg_database_owner; +SELECT + pg_has_role('regress_priv_user1', 'pg_database_owner', 'USAGE') as priv, + pg_has_role('regress_priv_user1', 'pg_database_owner', 'MEMBER') as mem, + pg_has_role('regress_priv_user1', 'pg_database_owner', + 'MEMBER WITH ADMIN OPTION') as admin; + priv | mem | admin +------+-----+------- + f | f | f +(1 row) + +BEGIN; +DO $$BEGIN EXECUTE format( + 'ALTER DATABASE %I OWNER TO regress_priv_group2', current_catalog); END$$; +SELECT + pg_has_role('regress_priv_user1', 'pg_database_owner', 'USAGE') as priv, + pg_has_role('regress_priv_user1', 'pg_database_owner', 'MEMBER') as mem, + pg_has_role('regress_priv_user1', 'pg_database_owner', + 'MEMBER WITH ADMIN OPTION') as admin; + priv | mem | admin +------+-----+------- + t | t | f +(1 row) + +SET SESSION AUTHORIZATION regress_priv_user1; +TABLE information_schema.enabled_roles ORDER BY role_name COLLATE "C"; + role_name +--------------------- + pg_database_owner + regress_priv_group2 + regress_priv_user1 +(3 rows) + +TABLE information_schema.applicable_roles ORDER BY role_name COLLATE "C"; + grantee | role_name | is_grantable +---------------------+---------------------+-------------- + regress_priv_group2 | pg_database_owner | NO + regress_priv_user1 | regress_priv_group2 | NO +(2 rows) + +INSERT INTO datdba_only DEFAULT VALUES; +SAVEPOINT q; DELETE FROM datdba_only; ROLLBACK TO q; +ERROR: permission denied for table datdba_only +SET SESSION AUTHORIZATION regress_priv_user2; +TABLE information_schema.enabled_roles; + role_name +-------------------- + regress_priv_user2 +(1 row) + +INSERT INTO datdba_only DEFAULT VALUES; +ERROR: permission denied for table datdba_only +ROLLBACK; +-- test default ACLs +\c - +CREATE SCHEMA testns; +GRANT ALL ON SCHEMA testns TO regress_priv_user1; +CREATE TABLE testns.acltest1 (x int); +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- no + has_table_privilege +--------------------- + f +(1 row) + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no + has_table_privilege +--------------------- + f +(1 row) + +-- placeholder for test with duplicated schema and role names +ALTER DEFAULT PRIVILEGES IN SCHEMA testns,testns GRANT SELECT ON TABLES TO public,public; +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- no + has_table_privilege +--------------------- + f +(1 row) + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no + has_table_privilege +--------------------- + f +(1 row) + +DROP TABLE testns.acltest1; +CREATE TABLE testns.acltest1 (x int); +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- yes + has_table_privilege +--------------------- + t +(1 row) + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no + has_table_privilege +--------------------- + f +(1 row) + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT INSERT ON TABLES TO regress_priv_user1; +DROP TABLE testns.acltest1; +CREATE TABLE testns.acltest1 (x int); +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- yes + has_table_privilege +--------------------- + t +(1 row) + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- yes + has_table_privilege +--------------------- + t +(1 row) + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns REVOKE INSERT ON TABLES FROM regress_priv_user1; +DROP TABLE testns.acltest1; +CREATE TABLE testns.acltest1 (x int); +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- yes + has_table_privilege +--------------------- + t +(1 row) + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no + has_table_privilege +--------------------- + f +(1 row) + +ALTER DEFAULT PRIVILEGES FOR ROLE regress_priv_user1 REVOKE EXECUTE ON FUNCTIONS FROM public; +ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT USAGE ON SCHEMAS TO regress_priv_user2; -- error +ERROR: cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS +-- +-- Testing blanket default grants is very hazardous since it might change +-- the privileges attached to objects created by concurrent regression tests. +-- To avoid that, be sure to revoke the privileges again before committing. +-- +BEGIN; +ALTER DEFAULT PRIVILEGES GRANT USAGE ON SCHEMAS TO regress_priv_user2; +CREATE SCHEMA testns2; +SELECT has_schema_privilege('regress_priv_user2', 'testns2', 'USAGE'); -- yes + has_schema_privilege +---------------------- + t +(1 row) + +SELECT has_schema_privilege('regress_priv_user6', 'testns2', 'USAGE'); -- yes + has_schema_privilege +---------------------- + t +(1 row) + +SELECT has_schema_privilege('regress_priv_user2', 'testns2', 'CREATE'); -- no + has_schema_privilege +---------------------- + f +(1 row) + +ALTER DEFAULT PRIVILEGES REVOKE USAGE ON SCHEMAS FROM regress_priv_user2; +CREATE SCHEMA testns3; +SELECT has_schema_privilege('regress_priv_user2', 'testns3', 'USAGE'); -- no + has_schema_privilege +---------------------- + f +(1 row) + +SELECT has_schema_privilege('regress_priv_user2', 'testns3', 'CREATE'); -- no + has_schema_privilege +---------------------- + f +(1 row) + +ALTER DEFAULT PRIVILEGES GRANT ALL ON SCHEMAS TO regress_priv_user2; +CREATE SCHEMA testns4; +SELECT has_schema_privilege('regress_priv_user2', 'testns4', 'USAGE'); -- yes + has_schema_privilege +---------------------- + t +(1 row) + +SELECT has_schema_privilege('regress_priv_user2', 'testns4', 'CREATE'); -- yes + has_schema_privilege +---------------------- + t +(1 row) + +ALTER DEFAULT PRIVILEGES REVOKE ALL ON SCHEMAS FROM regress_priv_user2; +COMMIT; +-- Test for DROP OWNED BY with shared dependencies. This is done in a +-- separate, rollbacked, transaction to avoid any trouble with other +-- regression sessions. +BEGIN; +ALTER DEFAULT PRIVILEGES GRANT ALL ON FUNCTIONS TO regress_priv_user2; +ALTER DEFAULT PRIVILEGES GRANT ALL ON SCHEMAS TO regress_priv_user2; +ALTER DEFAULT PRIVILEGES GRANT ALL ON SEQUENCES TO regress_priv_user2; +ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO regress_priv_user2; +ALTER DEFAULT PRIVILEGES GRANT ALL ON TYPES TO regress_priv_user2; +SELECT count(*) FROM pg_shdepend + WHERE deptype = 'a' AND + refobjid = 'regress_priv_user2'::regrole AND + classid = 'pg_default_acl'::regclass; + count +------- + 5 +(1 row) + +DROP OWNED BY regress_priv_user2, regress_priv_user2; +SELECT count(*) FROM pg_shdepend + WHERE deptype = 'a' AND + refobjid = 'regress_priv_user2'::regrole AND + classid = 'pg_default_acl'::regclass; + count +------- + 0 +(1 row) + +ROLLBACK; +CREATE SCHEMA testns5; +SELECT has_schema_privilege('regress_priv_user2', 'testns5', 'USAGE'); -- no + has_schema_privilege +---------------------- + f +(1 row) + +SELECT has_schema_privilege('regress_priv_user2', 'testns5', 'CREATE'); -- no + has_schema_privilege +---------------------- + f +(1 row) + +SET ROLE regress_priv_user1; +CREATE FUNCTION testns.foo() RETURNS int AS 'select 1' LANGUAGE sql; +CREATE AGGREGATE testns.agg1(int) (sfunc = int4pl, stype = int4); +CREATE PROCEDURE testns.bar() AS 'select 1' LANGUAGE sql; +SELECT has_function_privilege('regress_priv_user2', 'testns.foo()', 'EXECUTE'); -- no + has_function_privilege +------------------------ + f +(1 row) + +SELECT has_function_privilege('regress_priv_user2', 'testns.agg1(int)', 'EXECUTE'); -- no + has_function_privilege +------------------------ + f +(1 row) + +SELECT has_function_privilege('regress_priv_user2', 'testns.bar()', 'EXECUTE'); -- no + has_function_privilege +------------------------ + f +(1 row) + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT EXECUTE ON ROUTINES to public; +DROP FUNCTION testns.foo(); +CREATE FUNCTION testns.foo() RETURNS int AS 'select 1' LANGUAGE sql; +DROP AGGREGATE testns.agg1(int); +CREATE AGGREGATE testns.agg1(int) (sfunc = int4pl, stype = int4); +DROP PROCEDURE testns.bar(); +CREATE PROCEDURE testns.bar() AS 'select 1' LANGUAGE sql; +SELECT has_function_privilege('regress_priv_user2', 'testns.foo()', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_priv_user2', 'testns.agg1(int)', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_priv_user2', 'testns.bar()', 'EXECUTE'); -- yes (counts as function here) + has_function_privilege +------------------------ + t +(1 row) + +DROP FUNCTION testns.foo(); +DROP AGGREGATE testns.agg1(int); +DROP PROCEDURE testns.bar(); +ALTER DEFAULT PRIVILEGES FOR ROLE regress_priv_user1 REVOKE USAGE ON TYPES FROM public; +CREATE DOMAIN testns.priv_testdomain1 AS int; +SELECT has_type_privilege('regress_priv_user2', 'testns.priv_testdomain1', 'USAGE'); -- no + has_type_privilege +-------------------- + f +(1 row) + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT USAGE ON TYPES to public; +DROP DOMAIN testns.priv_testdomain1; +CREATE DOMAIN testns.priv_testdomain1 AS int; +SELECT has_type_privilege('regress_priv_user2', 'testns.priv_testdomain1', 'USAGE'); -- yes + has_type_privilege +-------------------- + t +(1 row) + +DROP DOMAIN testns.priv_testdomain1; +RESET ROLE; +SELECT count(*) + FROM pg_default_acl d LEFT JOIN pg_namespace n ON defaclnamespace = n.oid + WHERE nspname = 'testns'; + count +------- + 3 +(1 row) + +DROP SCHEMA testns CASCADE; +NOTICE: drop cascades to table testns.acltest1 +DROP SCHEMA testns2 CASCADE; +DROP SCHEMA testns3 CASCADE; +DROP SCHEMA testns4 CASCADE; +DROP SCHEMA testns5 CASCADE; +SELECT d.* -- check that entries went away + FROM pg_default_acl d LEFT JOIN pg_namespace n ON defaclnamespace = n.oid + WHERE nspname IS NULL AND defaclnamespace != 0; + oid | defaclrole | defaclnamespace | defaclobjtype | defaclacl +-----+------------+-----------------+---------------+----------- +(0 rows) + +-- Grant on all objects of given type in a schema +\c - +-- GPDB: Create a helper function to inspect the segment information also +DROP FUNCTION IF EXISTS has_table_privilege_seg(u text, r text, p text); +NOTICE: function has_table_privilege_seg(text,text,text) does not exist, skipping +CREATE FUNCTION has_table_privilege_seg(us text, rel text, priv text) +RETURNS TABLE ( + segid int, + has_table_privilege bool +) AS $$ + SELECT + gp_execution_segment() AS gegid, + p.* + FROM + has_table_privilege($1, $2, $3) p +$$ LANGUAGE SQL VOLATILE +CONTAINS SQL EXECUTE ON ALL SEGMENTS; +CREATE SCHEMA testns; +CREATE TABLE testns.t1 (f1 int); +CREATE TABLE testns.t2 (f1 int); +SELECT has_table_privilege('regress_priv_user1', 'testns.t1', 'SELECT'); -- false + has_table_privilege +--------------------- + f +(1 row) + +GRANT ALL ON ALL TABLES IN SCHEMA testns TO regress_priv_user1; +SELECT has_table_privilege('regress_priv_user1', 'testns.t1', 'SELECT'); -- true + has_table_privilege +--------------------- + t +(1 row) + +SELECT has_table_privilege('regress_priv_user1', 'testns.t2', 'SELECT'); -- true + has_table_privilege +--------------------- + t +(1 row) + +REVOKE ALL ON ALL TABLES IN SCHEMA testns FROM regress_priv_user1; +SELECT has_table_privilege('regress_priv_user1', 'testns.t1', 'SELECT'); -- false + has_table_privilege +--------------------- + f +(1 row) + +SELECT has_table_privilege('regress_priv_user1', 'testns.t2', 'SELECT'); -- false + has_table_privilege +--------------------- + f +(1 row) + +CREATE FUNCTION testns.priv_testfunc(int) RETURNS int AS 'select 3 * $1;' LANGUAGE sql; +CREATE AGGREGATE testns.priv_testagg(int) (sfunc = int4pl, stype = int4); +CREATE PROCEDURE testns.priv_testproc(int) AS 'select 3' LANGUAGE sql; +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testfunc(int)', 'EXECUTE'); -- true by default + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testagg(int)', 'EXECUTE'); -- true by default + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testproc(int)', 'EXECUTE'); -- true by default + has_function_privilege +------------------------ + t +(1 row) + +REVOKE ALL ON ALL FUNCTIONS IN SCHEMA testns FROM PUBLIC; +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testfunc(int)', 'EXECUTE'); -- false + has_function_privilege +------------------------ + f +(1 row) + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testagg(int)', 'EXECUTE'); -- false + has_function_privilege +------------------------ + f +(1 row) + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testproc(int)', 'EXECUTE'); -- still true, not a function + has_function_privilege +------------------------ + t +(1 row) + +REVOKE ALL ON ALL PROCEDURES IN SCHEMA testns FROM PUBLIC; +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testproc(int)', 'EXECUTE'); -- now false + has_function_privilege +------------------------ + f +(1 row) + +GRANT ALL ON ALL ROUTINES IN SCHEMA testns TO PUBLIC; +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testfunc(int)', 'EXECUTE'); -- true + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testagg(int)', 'EXECUTE'); -- true + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testproc(int)', 'EXECUTE'); -- true + has_function_privilege +------------------------ + t +(1 row) + +DROP SCHEMA testns CASCADE; +NOTICE: drop cascades to 5 other objects +DETAIL: drop cascades to table testns.t1 +drop cascades to table testns.t2 +drop cascades to function testns.priv_testfunc(integer) +drop cascades to function testns.priv_testagg(integer) +drop cascades to function testns.priv_testproc(integer) +-- Change owner of the schema & and rename of new schema owner +\c - +CREATE ROLE regress_schemauser1 superuser login; +CREATE ROLE regress_schemauser2 superuser login; +SET SESSION ROLE regress_schemauser1; +CREATE SCHEMA testns; +SELECT nspname, rolname FROM pg_namespace, pg_roles WHERE pg_namespace.nspname = 'testns' AND pg_namespace.nspowner = pg_roles.oid; + nspname | rolname +---------+--------------------- + testns | regress_schemauser1 +(1 row) + +ALTER SCHEMA testns OWNER TO regress_schemauser2; +ALTER ROLE regress_schemauser2 RENAME TO regress_schemauser_renamed; +SELECT nspname, rolname FROM pg_namespace, pg_roles WHERE pg_namespace.nspname = 'testns' AND pg_namespace.nspowner = pg_roles.oid; + nspname | rolname +---------+---------------------------- + testns | regress_schemauser_renamed +(1 row) + +set session role regress_schemauser_renamed; +DROP SCHEMA testns CASCADE; +-- clean up +\c - +DROP ROLE regress_schemauser1; +DROP ROLE regress_schemauser_renamed; +-- test that dependent privileges are revoked (or not) properly +\c - +set session role regress_priv_user1; +create table dep_priv_test (a int); +grant select on dep_priv_test to regress_priv_user2 with grant option; +grant select on dep_priv_test to regress_priv_user3 with grant option; +set session role regress_priv_user2; +grant select on dep_priv_test to regress_priv_user4 with grant option; +set session role regress_priv_user3; +grant select on dep_priv_test to regress_priv_user4 with grant option; +set session role regress_priv_user4; +grant select on dep_priv_test to regress_priv_user5; +\dp dep_priv_test + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+---------------+-------+-----------------------------------------------+-------------------+---------- + public | dep_priv_test | table | regress_priv_user1=arwdDxt/regress_priv_user1+| | + | | | regress_priv_user2=r*/regress_priv_user1 +| | + | | | regress_priv_user3=r*/regress_priv_user1 +| | + | | | regress_priv_user4=r*/regress_priv_user2 +| | + | | | regress_priv_user4=r*/regress_priv_user3 +| | + | | | regress_priv_user5=r/regress_priv_user4 | | +(1 row) + +set session role regress_priv_user2; +revoke select on dep_priv_test from regress_priv_user4 cascade; +\dp dep_priv_test + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+---------------+-------+-----------------------------------------------+-------------------+---------- + public | dep_priv_test | table | regress_priv_user1=arwdDxt/regress_priv_user1+| | + | | | regress_priv_user2=r*/regress_priv_user1 +| | + | | | regress_priv_user3=r*/regress_priv_user1 +| | + | | | regress_priv_user4=r*/regress_priv_user3 +| | + | | | regress_priv_user5=r/regress_priv_user4 | | +(1 row) + +set session role regress_priv_user3; +revoke select on dep_priv_test from regress_priv_user4 cascade; +\dp dep_priv_test + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+---------------+-------+-----------------------------------------------+-------------------+---------- + public | dep_priv_test | table | regress_priv_user1=arwdDxt/regress_priv_user1+| | + | | | regress_priv_user2=r*/regress_priv_user1 +| | + | | | regress_priv_user3=r*/regress_priv_user1 | | +(1 row) + +set session role regress_priv_user1; +drop table dep_priv_test; +-- clean up +\c +drop sequence x_seq; +DROP AGGREGATE priv_testagg1(int); +DROP FUNCTION priv_testfunc2(int); +DROP FUNCTION priv_testfunc4(boolean); +DROP PROCEDURE priv_testproc1(int); +DROP VIEW atestv0; +DROP VIEW atestv1; +DROP VIEW atestv2; +-- this should cascade to drop atestv4 +DROP VIEW atestv3 CASCADE; +NOTICE: drop cascades to view atestv4 +-- this should complain "does not exist" +DROP VIEW atestv4; +ERROR: view "atestv4" does not exist +DROP TABLE atest1; +DROP TABLE atest2; +DROP TABLE atest3; +DROP TABLE atest4; +DROP TABLE atest5; +DROP TABLE atest6; +DROP TABLE atestc; +DROP TABLE atestp1; +DROP TABLE atestp2; +-- start_ignore +SELECT lo_unlink(oid) FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid; + lo_unlink +----------- +(0 rows) + +-- end_ignore +DROP GROUP regress_priv_group1; +DROP GROUP regress_priv_group2; +-- these are needed to clean up permissions +REVOKE USAGE ON LANGUAGE sql FROM regress_priv_user1; +DROP OWNED BY regress_priv_user1; +DROP USER regress_priv_user1; +DROP USER regress_priv_user2; +DROP USER regress_priv_user3; +DROP USER regress_priv_user4; +DROP USER regress_priv_user5; +DROP USER regress_priv_user6; +DROP USER regress_priv_user7; +DROP USER regress_priv_user8; -- does not exist +ERROR: role "regress_priv_user8" does not exist +-- permissions with LOCK TABLE +CREATE USER regress_locktable_user; +CREATE TABLE lock_table (a int); +-- LOCK TABLE and SELECT permission +GRANT SELECT ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should fail +ERROR: permission denied for table lock_table +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should fail +ERROR: permission denied for table lock_table +ROLLBACK; +\c +REVOKE SELECT ON lock_table FROM regress_locktable_user; +-- LOCK TABLE and INSERT permission +GRANT INSERT ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should fail +ERROR: permission denied for table lock_table +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should fail +ERROR: permission denied for table lock_table +ROLLBACK; +\c +REVOKE INSERT ON lock_table FROM regress_locktable_user; +-- LOCK TABLE and UPDATE permission +GRANT UPDATE ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should fail +ERROR: permission denied for table lock_table +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should pass +COMMIT; +\c +REVOKE UPDATE ON lock_table FROM regress_locktable_user; +-- LOCK TABLE and DELETE permission +GRANT DELETE ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should fail +ERROR: permission denied for table lock_table +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should pass +COMMIT; +\c +REVOKE DELETE ON lock_table FROM regress_locktable_user; +-- LOCK TABLE and TRUNCATE permission +GRANT TRUNCATE ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should fail +ERROR: permission denied for table lock_table +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should pass +COMMIT; +\c +REVOKE TRUNCATE ON lock_table FROM regress_locktable_user; +-- clean up +DROP TABLE lock_table; +DROP USER regress_locktable_user; diff --git a/src/test/singlenode_regress/expected/psql.out b/src/test/singlenode_regress/expected/psql.out new file mode 100644 index 00000000000..85567284c69 --- /dev/null +++ b/src/test/singlenode_regress/expected/psql.out @@ -0,0 +1,6097 @@ +-- +-- Tests for psql features that aren't closely connected to any +-- specific server features +-- +-- \set +-- fail: invalid name +\set invalid/name foo +invalid variable name: "invalid/name" +-- fail: invalid value for special variable +\set AUTOCOMMIT foo +unrecognized value "foo" for "AUTOCOMMIT": Boolean expected +\set FETCH_COUNT foo +invalid value "foo" for "FETCH_COUNT": integer expected +-- check handling of built-in boolean variable +\echo :ON_ERROR_ROLLBACK +off +\set ON_ERROR_ROLLBACK +\echo :ON_ERROR_ROLLBACK +on +\set ON_ERROR_ROLLBACK foo +unrecognized value "foo" for "ON_ERROR_ROLLBACK" +Available values are: on, off, interactive. +\echo :ON_ERROR_ROLLBACK +on +\set ON_ERROR_ROLLBACK on +\echo :ON_ERROR_ROLLBACK +on +\unset ON_ERROR_ROLLBACK +\echo :ON_ERROR_ROLLBACK +off +-- \g and \gx +SELECT 1 as one, 2 as two \g + one | two +-----+----- + 1 | 2 +(1 row) + +\gx +-[ RECORD 1 ] +one | 1 +two | 2 + +SELECT 3 as three, 4 as four \gx +-[ RECORD 1 ] +three | 3 +four | 4 + +\g + three | four +-------+------ + 3 | 4 +(1 row) + +-- \gx should work in FETCH_COUNT mode too +\set FETCH_COUNT 1 +SELECT 1 as one, 2 as two \g + one | two +-----+----- + 1 | 2 +(1 row) + +\gx +-[ RECORD 1 ] +one | 1 +two | 2 + +SELECT 3 as three, 4 as four \gx +-[ RECORD 1 ] +three | 3 +four | 4 + +\g + three | four +-------+------ + 3 | 4 +(1 row) + +\unset FETCH_COUNT +-- \g/\gx with pset options +SELECT 1 as one, 2 as two \g (format=csv csv_fieldsep='\t') +one two +1 2 +\g + one | two +-----+----- + 1 | 2 +(1 row) + +SELECT 1 as one, 2 as two \gx (title='foo bar') +foo bar +-[ RECORD 1 ] +one | 1 +two | 2 + +\g + one | two +-----+----- + 1 | 2 +(1 row) + +-- \gset +select 10 as test01, 20 as test02, 'Hello' as test03 \gset pref01_ +\echo :pref01_test01 :pref01_test02 :pref01_test03 +10 20 Hello +-- should fail: bad variable name +select 10 as "bad name" +\gset +invalid variable name: "bad name" +select 97 as "EOF", 'ok' as _foo \gset IGNORE +attempt to \gset into specially treated variable "IGNOREEOF" ignored +\echo :IGNORE_foo :IGNOREEOF +ok 0 +-- multiple backslash commands in one line +select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x +1 +select 3 as x, 4 as y \gset pref01_ \echo :pref01_x \echo :pref01_y +3 +4 +select 5 as x, 6 as y \gset pref01_ \\ \g \echo :pref01_x :pref01_y + x | y +---+--- + 5 | 6 +(1 row) + +5 6 +select 7 as x, 8 as y \g \gset pref01_ \echo :pref01_x :pref01_y + x | y +---+--- + 7 | 8 +(1 row) + +7 8 +-- NULL should unset the variable +\set var2 xyz +select 1 as var1, NULL as var2, 3 as var3 \gset +\echo :var1 :var2 :var3 +1 :var2 3 +-- \gset requires just one tuple +select 10 as test01, 20 as test02 from generate_series(1,3) \gset +more than one row returned for \gset +select 10 as test01, 20 as test02 from generate_series(1,0) \gset +no rows returned for \gset +-- \gset should work in FETCH_COUNT mode too +\set FETCH_COUNT 1 +select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x +1 +select 3 as x, 4 as y \gset pref01_ \echo :pref01_x \echo :pref01_y +3 +4 +select 10 as test01, 20 as test02 from generate_series(1,3) \gset +more than one row returned for \gset +select 10 as test01, 20 as test02 from generate_series(1,0) \gset +no rows returned for \gset +\unset FETCH_COUNT +-- \gdesc +SELECT + NULL AS zero, + 1 AS one, + 2.0 AS two, + 'three' AS three, + $1 AS four, + sin($2) as five, + 'foo'::varchar(4) as six, + CURRENT_DATE AS now +\gdesc + Column | Type +--------+---------------------- + zero | text + one | integer + two | numeric + three | text + four | text + five | double precision + six | character varying(4) + now | date +(8 rows) + +-- should work with tuple-returning utilities, such as EXECUTE +PREPARE test AS SELECT 1 AS first, 2 AS second; +EXECUTE test \gdesc + Column | Type +--------+--------- + first | integer + second | integer +(2 rows) + +EXPLAIN EXECUTE test \gdesc + Column | Type +------------+------ + QUERY PLAN | text +(1 row) + +-- should fail cleanly - syntax error +SELECT 1 + \gdesc +ERROR: syntax error at end of input +LINE 1: SELECT 1 + + ^ +-- check behavior with empty results +SELECT \gdesc +The command has no result, or the result has no columns. +CREATE TABLE bububu(a int) \gdesc +The command has no result, or the result has no columns. +-- subject command should not have executed +TABLE bububu; -- fail +ERROR: relation "bububu" does not exist +LINE 1: TABLE bububu; + ^ +-- query buffer should remain unchanged +SELECT 1 AS x, 'Hello', 2 AS y, true AS "dirty\name" +\gdesc + Column | Type +------------+--------- + x | integer + ?column? | text + y | integer + dirty\name | boolean +(4 rows) + +\g + x | ?column? | y | dirty\name +---+----------+---+------------ + 1 | Hello | 2 | t +(1 row) + +-- all on one line +SELECT 3 AS x, 'Hello', 4 AS y, true AS "dirty\name" \gdesc \g + Column | Type +------------+--------- + x | integer + ?column? | text + y | integer + dirty\name | boolean +(4 rows) + + x | ?column? | y | dirty\name +---+----------+---+------------ + 3 | Hello | 4 | t +(1 row) + +-- \gexec +create temporary table gexec_test(a int, b text, c date, d float); +select format('create index on gexec_test(%I)', attname) +from pg_attribute +where attrelid = 'gexec_test'::regclass and attnum > 0 +order by attnum +\gexec +create index on gexec_test(a) +create index on gexec_test(b) +create index on gexec_test(c) +create index on gexec_test(d) +-- \gexec should work in FETCH_COUNT mode too +-- (though the fetch limit applies to the executed queries not the meta query) +\set FETCH_COUNT 1 +select 'select 1 as ones', 'select x.y, x.y*2 as double from generate_series(1,4) as x(y)' +union all +select 'drop table gexec_test', NULL +union all +select 'drop table gexec_test', 'select ''2000-01-01''::date as party_over' +\gexec +select 1 as ones + ones +------ + 1 +(1 row) + +select x.y, x.y*2 as double from generate_series(1,4) as x(y) + y | double +---+-------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 +(4 rows) + +drop table gexec_test +drop table gexec_test +ERROR: table "gexec_test" does not exist +select '2000-01-01'::date as party_over + party_over +------------ + 01-01-2000 +(1 row) + +\unset FETCH_COUNT +-- show all pset options +\pset +border 1 +columns 0 +csv_fieldsep ',' +expanded off +fieldsep '|' +fieldsep_zero off +footer on +format aligned +linestyle ascii +null '' +numericlocale off +pager 1 +pager_min_lines 0 +recordsep '\n' +recordsep_zero off +tableattr +title +tuples_only off +unicode_border_linestyle single +unicode_column_linestyle single +unicode_header_linestyle single +-- test multi-line headers, wrapping, and newline indicators +-- in aligned, unaligned, and wrapped formats +prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab + +c", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a +bc" from generate_series(1,10) as n(n) group by n>1 order by n>1; +\pset linestyle ascii +\pset expanded off +\pset columns 40 +\pset border 0 +\pset format unaligned +execute q; +ab + +c|a +bc +xx|yyyyyyyyyyyyyyyyyy +xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +(2 rows) +\pset format aligned +execute q; + ab + a + + + bc + c +-------------------- ------------------ +xx yyyyyyyyyyyyyyyyyy +xxxx +yyyyyyyyyyyyyyyy + +xxxxxx +yyyyyyyyyyyyyy + +xxxxxxxx +yyyyyyyyyyyy + +xxxxxxxxxx +yyyyyyyyyy + +xxxxxxxxxxxx +yyyyyyyy + +xxxxxxxxxxxxxx +yyyyyy + +xxxxxxxxxxxxxxxx +yyyy + +xxxxxxxxxxxxxxxxxx +yy + +xxxxxxxxxxxxxxxxxxxx +(2 rows) + +\pset format wrapped +execute q; + ab + a + + + bc + c +-------------------- ------------------ +xx yyyyyyyyyyyyyyyyyy +xxxx +yyyyyyyyyyyyyyyy + +xxxxxx +yyyyyyyyyyyyyy + +xxxxxxxx +yyyyyyyyyyyy + +xxxxxxxxxx +yyyyyyyyyy + +xxxxxxxxxxxx +yyyyyyyy + +xxxxxxxxxxxxxx +yyyyyy + +xxxxxxxxxxxxxxxx +yyyy + +xxxxxxxxxxxxxxxxxx +yy + +xxxxxxxxxxxxxxxxxxxx +(2 rows) + +\pset border 1 +\pset format unaligned +execute q; +ab + +c|a +bc +xx|yyyyyyyyyyyyyyyyyy +xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +(2 rows) +\pset format aligned +execute q; + ab +| a + + +| bc + c | +----------------------+-------------------- + xx | yyyyyyyyyyyyyyyyyy + xxxx +| yyyyyyyyyyyyyyyy + + xxxxxx +| yyyyyyyyyyyyyy + + xxxxxxxx +| yyyyyyyyyyyy + + xxxxxxxxxx +| yyyyyyyyyy + + xxxxxxxxxxxx +| yyyyyyyy + + xxxxxxxxxxxxxx +| yyyyyy + + xxxxxxxxxxxxxxxx +| yyyy + + xxxxxxxxxxxxxxxxxx +| yy + + xxxxxxxxxxxxxxxxxxxx | +(2 rows) + +\pset format wrapped +execute q; + ab +| a + + +| bc + c | +-------------------+-------------------- + xx | yyyyyyyyyyyyyyyyyy + xxxx +| yyyyyyyyyyyyyyyy + + xxxxxx +| yyyyyyyyyyyyyy + + xxxxxxxx +| yyyyyyyyyyyy + + xxxxxxxxxx +| yyyyyyyyyy + + xxxxxxxxxxxx +| yyyyyyyy + + xxxxxxxxxxxxxx +| yyyyyy + + xxxxxxxxxxxxxxxx +| yyyy + + xxxxxxxxxxxxxxxxx.| yy + +.x +| + xxxxxxxxxxxxxxxxx.| +.xxx | +(2 rows) + +\pset border 2 +\pset format unaligned +execute q; +ab + +c|a +bc +xx|yyyyyyyyyyyyyyyyyy +xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +(2 rows) +\pset format aligned +execute q; ++----------------------+--------------------+ +| ab +| a +| +| +| bc | +| c | | ++----------------------+--------------------+ +| xx | yyyyyyyyyyyyyyyyyy | +| xxxx +| yyyyyyyyyyyyyyyy +| +| xxxxxx +| yyyyyyyyyyyyyy +| +| xxxxxxxx +| yyyyyyyyyyyy +| +| xxxxxxxxxx +| yyyyyyyyyy +| +| xxxxxxxxxxxx +| yyyyyyyy +| +| xxxxxxxxxxxxxx +| yyyyyy +| +| xxxxxxxxxxxxxxxx +| yyyy +| +| xxxxxxxxxxxxxxxxxx +| yy +| +| xxxxxxxxxxxxxxxxxxxx | | ++----------------------+--------------------+ +(2 rows) + +\pset format wrapped +execute q; ++-----------------+--------------------+ +| ab +| a +| +| +| bc | +| c | | ++-----------------+--------------------+ +| xx | yyyyyyyyyyyyyyyyyy | +| xxxx +| yyyyyyyyyyyyyyyy +| +| xxxxxx +| yyyyyyyyyyyyyy +| +| xxxxxxxx +| yyyyyyyyyyyy +| +| xxxxxxxxxx +| yyyyyyyyyy +| +| xxxxxxxxxxxx +| yyyyyyyy +| +| xxxxxxxxxxxxxx +| yyyyyy +| +| xxxxxxxxxxxxxxx.| yyyy +| +|.x +| yy +| +| xxxxxxxxxxxxxxx.| | +|.xxx +| | +| xxxxxxxxxxxxxxx.| | +|.xxxxx | | ++-----------------+--------------------+ +(2 rows) + +\pset expanded on +\pset columns 20 +\pset border 0 +\pset format unaligned +execute q; +ab + +c|xx +a +bc|yyyyyyyyyyyyyyyyyy + +ab + +c|xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx +a +bc|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +\pset format aligned +execute q; +* Record 1 +ab+ xx + + +c +a + yyyyyyyyyyyyyyyyyy +bc +* Record 2 +ab+ xxxx + + + xxxxxx + +c xxxxxxxx + + xxxxxxxxxx + + xxxxxxxxxxxx + + xxxxxxxxxxxxxx + + xxxxxxxxxxxxxxxx + + xxxxxxxxxxxxxxxxxx + + xxxxxxxxxxxxxxxxxxxx +a + yyyyyyyyyyyyyyyy + +bc yyyyyyyyyyyyyy + + yyyyyyyyyyyy + + yyyyyyyyyy + + yyyyyyyy + + yyyyyy + + yyyy + + yy + + + +\pset format wrapped +execute q; +* Record 1 +ab+ xx + + +c +a + yyyyyyyyyyyyyyy. +bc .yyy +* Record 2 +ab+ xxxx + + + xxxxxx + +c xxxxxxxx + + xxxxxxxxxx + + xxxxxxxxxxxx + + xxxxxxxxxxxxxx + + xxxxxxxxxxxxxxx. + .x + + xxxxxxxxxxxxxxx. + .xxx + + xxxxxxxxxxxxxxx. + .xxxxx +a + yyyyyyyyyyyyyyy. +bc .y + + yyyyyyyyyyyyyy + + yyyyyyyyyyyy + + yyyyyyyyyy + + yyyyyyyy + + yyyyyy + + yyyy + + yy + + + +\pset border 1 +\pset format unaligned +execute q; +ab + +c|xx +a +bc|yyyyyyyyyyyyyyyyyy + +ab + +c|xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx +a +bc|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +\pset format aligned +execute q; +-[ RECORD 1 ]------------ +ab+| xx + +| +c | +a +| yyyyyyyyyyyyyyyyyy +bc | +-[ RECORD 2 ]------------ +ab+| xxxx + + +| xxxxxx + +c | xxxxxxxx + + | xxxxxxxxxx + + | xxxxxxxxxxxx + + | xxxxxxxxxxxxxx + + | xxxxxxxxxxxxxxxx + + | xxxxxxxxxxxxxxxxxx + + | xxxxxxxxxxxxxxxxxxxx +a +| yyyyyyyyyyyyyyyy + +bc | yyyyyyyyyyyyyy + + | yyyyyyyyyyyy + + | yyyyyyyyyy + + | yyyyyyyy + + | yyyyyy + + | yyyy + + | yy + + | + +\pset format wrapped +execute q; +-[ RECORD 1 ]------ +ab+| xx + +| +c | +a +| yyyyyyyyyyyyyy. +bc |.yyyy +-[ RECORD 2 ]------ +ab+| xxxx + + +| xxxxxx + +c | xxxxxxxx + + | xxxxxxxxxx + + | xxxxxxxxxxxx + + | xxxxxxxxxxxxxx+ + | xxxxxxxxxxxxxx. + |.xx + + | xxxxxxxxxxxxxx. + |.xxxx + + | xxxxxxxxxxxxxx. + |.xxxxxx +a +| yyyyyyyyyyyyyy. +bc |.yy + + | yyyyyyyyyyyyyy+ + | yyyyyyyyyyyy + + | yyyyyyyyyy + + | yyyyyyyy + + | yyyyyy + + | yyyy + + | yy + + | + +\pset border 2 +\pset format unaligned +execute q; +ab + +c|xx +a +bc|yyyyyyyyyyyyyyyyyy + +ab + +c|xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx +a +bc|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +\pset format aligned +execute q; ++-[ RECORD 1 ]--------------+ +| ab+| xx | +| +| | +| c | | +| a +| yyyyyyyyyyyyyyyyyy | +| bc | | ++-[ RECORD 2 ]--------------+ +| ab+| xxxx +| +| +| xxxxxx +| +| c | xxxxxxxx +| +| | xxxxxxxxxx +| +| | xxxxxxxxxxxx +| +| | xxxxxxxxxxxxxx +| +| | xxxxxxxxxxxxxxxx +| +| | xxxxxxxxxxxxxxxxxx +| +| | xxxxxxxxxxxxxxxxxxxx | +| a +| yyyyyyyyyyyyyyyy +| +| bc | yyyyyyyyyyyyyy +| +| | yyyyyyyyyyyy +| +| | yyyyyyyyyy +| +| | yyyyyyyy +| +| | yyyyyy +| +| | yyyy +| +| | yy +| +| | | ++----+----------------------+ + +\pset format wrapped +execute q; ++-[ RECORD 1 ]-----+ +| ab+| xx | +| +| | +| c | | +| a +| yyyyyyyyyyy.| +| bc |.yyyyyyy | ++-[ RECORD 2 ]-----+ +| ab+| xxxx +| +| +| xxxxxx +| +| c | xxxxxxxx +| +| | xxxxxxxxxx +| +| | xxxxxxxxxxx.| +| |.x +| +| | xxxxxxxxxxx.| +| |.xxx +| +| | xxxxxxxxxxx.| +| |.xxxxx +| +| | xxxxxxxxxxx.| +| |.xxxxxxx +| +| | xxxxxxxxxxx.| +| |.xxxxxxxxx | +| a +| yyyyyyyyyyy.| +| bc |.yyyyy +| +| | yyyyyyyyyyy.| +| |.yyy +| +| | yyyyyyyyyyy.| +| |.y +| +| | yyyyyyyyyy +| +| | yyyyyyyy +| +| | yyyyyy +| +| | yyyy +| +| | yy +| +| | | ++----+-------------+ + +\pset linestyle old-ascii +\pset expanded off +\pset columns 40 +\pset border 0 +\pset format unaligned +execute q; +ab + +c|a +bc +xx|yyyyyyyyyyyyyyyyyy +xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +(2 rows) +\pset format aligned +execute q; + ab a + + bc + c + +-------------------- ------------------ +xx yyyyyyyyyyyyyyyyyy +xxxx yyyyyyyyyyyyyyyy +xxxxxx yyyyyyyyyyyyyy +xxxxxxxx yyyyyyyyyyyy +xxxxxxxxxx yyyyyyyyyy +xxxxxxxxxxxx yyyyyyyy +xxxxxxxxxxxxxx yyyyyy +xxxxxxxxxxxxxxxx yyyy +xxxxxxxxxxxxxxxxxx yy +xxxxxxxxxxxxxxxxxxxx +(2 rows) + +\pset format wrapped +execute q; + ab a + + bc + c + +-------------------- ------------------ +xx yyyyyyyyyyyyyyyyyy +xxxx yyyyyyyyyyyyyyyy +xxxxxx yyyyyyyyyyyyyy +xxxxxxxx yyyyyyyyyyyy +xxxxxxxxxx yyyyyyyyyy +xxxxxxxxxxxx yyyyyyyy +xxxxxxxxxxxxxx yyyyyy +xxxxxxxxxxxxxxxx yyyy +xxxxxxxxxxxxxxxxxx yy +xxxxxxxxxxxxxxxxxxxx +(2 rows) + +\pset border 1 +\pset format unaligned +execute q; +ab + +c|a +bc +xx|yyyyyyyyyyyyyyyyyy +xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +(2 rows) +\pset format aligned +execute q; + ab | a ++ |+ bc ++ c |+ +----------------------+-------------------- + xx | yyyyyyyyyyyyyyyyyy + xxxx | yyyyyyyyyyyyyyyy + xxxxxx : yyyyyyyyyyyyyy + xxxxxxxx : yyyyyyyyyyyy + xxxxxxxxxx : yyyyyyyyyy + xxxxxxxxxxxx : yyyyyyyy + xxxxxxxxxxxxxx : yyyyyy + xxxxxxxxxxxxxxxx : yyyy + xxxxxxxxxxxxxxxxxx : yy + xxxxxxxxxxxxxxxxxxxx : +(2 rows) + +\pset format wrapped +execute q; + ab | a ++ |+ bc ++ c |+ +-------------------+-------------------- + xx | yyyyyyyyyyyyyyyyyy + xxxx | yyyyyyyyyyyyyyyy + xxxxxx : yyyyyyyyyyyyyy + xxxxxxxx : yyyyyyyyyyyy + xxxxxxxxxx : yyyyyyyyyy + xxxxxxxxxxxx : yyyyyyyy + xxxxxxxxxxxxxx : yyyyyy + xxxxxxxxxxxxxxxx : yyyy + xxxxxxxxxxxxxxxxx : yy + x : + xxxxxxxxxxxxxxxxx + xxx +(2 rows) + +\pset border 2 +\pset format unaligned +execute q; +ab + +c|a +bc +xx|yyyyyyyyyyyyyyyyyy +xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +(2 rows) +\pset format aligned +execute q; ++----------------------+--------------------+ +| ab | a | +|+ |+ bc | +|+ c |+ | ++----------------------+--------------------+ +| xx | yyyyyyyyyyyyyyyyyy | +| xxxx | yyyyyyyyyyyyyyyy | +| xxxxxx : yyyyyyyyyyyyyy | +| xxxxxxxx : yyyyyyyyyyyy | +| xxxxxxxxxx : yyyyyyyyyy | +| xxxxxxxxxxxx : yyyyyyyy | +| xxxxxxxxxxxxxx : yyyyyy | +| xxxxxxxxxxxxxxxx : yyyy | +| xxxxxxxxxxxxxxxxxx : yy | +| xxxxxxxxxxxxxxxxxxxx : | ++----------------------+--------------------+ +(2 rows) + +\pset format wrapped +execute q; ++-----------------+--------------------+ +| ab | a | +|+ |+ bc | +|+ c |+ | ++-----------------+--------------------+ +| xx | yyyyyyyyyyyyyyyyyy | +| xxxx | yyyyyyyyyyyyyyyy | +| xxxxxx : yyyyyyyyyyyyyy | +| xxxxxxxx : yyyyyyyyyyyy | +| xxxxxxxxxx : yyyyyyyyyy | +| xxxxxxxxxxxx : yyyyyyyy | +| xxxxxxxxxxxxxx : yyyyyy | +| xxxxxxxxxxxxxxx : yyyy | +| x : yy | +| xxxxxxxxxxxxxxx : | +| xxx | +| xxxxxxxxxxxxxxx | +| xxxxx | ++-----------------+--------------------+ +(2 rows) + +\pset expanded on +\pset columns 20 +\pset border 0 +\pset format unaligned +execute q; +ab + +c|xx +a +bc|yyyyyyyyyyyyyyyyyy + +ab + +c|xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx +a +bc|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +\pset format aligned +execute q; +* Record 1 + ab xx ++ ++c + a yyyyyyyyyyyyyyyyyy ++bc +* Record 2 + ab xxxx ++ xxxxxx ++c xxxxxxxx + xxxxxxxxxx + xxxxxxxxxxxx + xxxxxxxxxxxxxx + xxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxx + a yyyyyyyyyyyyyyyy ++bc yyyyyyyyyyyyyy + yyyyyyyyyyyy + yyyyyyyyyy + yyyyyyyy + yyyyyy + yyyy + yy + + +\pset format wrapped +execute q; +* Record 1 + ab xx ++ ++c + a yyyyyyyyyyyyyyyy ++bc yy +* Record 2 + ab xxxx ++ xxxxxx ++c xxxxxxxx + xxxxxxxxxx + xxxxxxxxxxxx + xxxxxxxxxxxxxx + xxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxx + xx + xxxxxxxxxxxxxxxx + xxxx + a yyyyyyyyyyyyyyyy ++bc yyyyyyyyyyyyyy + yyyyyyyyyyyy + yyyyyyyyyy + yyyyyyyy + yyyyyy + yyyy + yy + + +\pset border 1 +\pset format unaligned +execute q; +ab + +c|xx +a +bc|yyyyyyyyyyyyyyyyyy + +ab + +c|xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx +a +bc|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +\pset format aligned +execute q; +-[ RECORD 1 ]------------- + ab | xx ++ ; ++c ; + a | yyyyyyyyyyyyyyyyyy ++bc ; +-[ RECORD 2 ]------------- + ab | xxxx ++ : xxxxxx ++c : xxxxxxxx + : xxxxxxxxxx + : xxxxxxxxxxxx + : xxxxxxxxxxxxxx + : xxxxxxxxxxxxxxxx + : xxxxxxxxxxxxxxxxxx + : xxxxxxxxxxxxxxxxxxxx + a | yyyyyyyyyyyyyyyy ++bc : yyyyyyyyyyyyyy + : yyyyyyyyyyyy + : yyyyyyyyyy + : yyyyyyyy + : yyyyyy + : yyyy + : yy + : + +\pset format wrapped +execute q; +-[ RECORD 1 ]------- + ab | xx ++ ; ++c ; + a | yyyyyyyyyyyyyy ++bc ; yyyy +-[ RECORD 2 ]------- + ab | xxxx ++ : xxxxxx ++c : xxxxxxxx + : xxxxxxxxxx + : xxxxxxxxxxxx + : xxxxxxxxxxxxxx + : xxxxxxxxxxxxxx + ; xx + : xxxxxxxxxxxxxx + ; xxxx + : xxxxxxxxxxxxxx + ; xxxxxx + a | yyyyyyyyyyyyyy ++bc ; yy + : yyyyyyyyyyyyyy + : yyyyyyyyyyyy + : yyyyyyyyyy + : yyyyyyyy + : yyyyyy + : yyyy + : yy + : + +\pset border 2 +\pset format unaligned +execute q; +ab + +c|xx +a +bc|yyyyyyyyyyyyyyyyyy + +ab + +c|xxxx +xxxxxx +xxxxxxxx +xxxxxxxxxx +xxxxxxxxxxxx +xxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxx +a +bc|yyyyyyyyyyyyyyyy +yyyyyyyyyyyyyy +yyyyyyyyyyyy +yyyyyyyyyy +yyyyyyyy +yyyyyy +yyyy +yy + +\pset format aligned +execute q; ++-[ RECORD 1 ]--------------+ +| ab | xx | +|+ ; | +|+c ; | +| a | yyyyyyyyyyyyyyyyyy | +|+bc ; | ++-[ RECORD 2 ]--------------+ +| ab | xxxx | +|+ : xxxxxx | +|+c : xxxxxxxx | +| : xxxxxxxxxx | +| : xxxxxxxxxxxx | +| : xxxxxxxxxxxxxx | +| : xxxxxxxxxxxxxxxx | +| : xxxxxxxxxxxxxxxxxx | +| : xxxxxxxxxxxxxxxxxxxx | +| a | yyyyyyyyyyyyyyyy | +|+bc : yyyyyyyyyyyyyy | +| : yyyyyyyyyyyy | +| : yyyyyyyyyy | +| : yyyyyyyy | +| : yyyyyy | +| : yyyy | +| : yy | +| : | ++----+----------------------+ + +\pset format wrapped +execute q; ++-[ RECORD 1 ]-----+ +| ab | xx | +|+ ; | +|+c ; | +| a | yyyyyyyyyyy | +|+bc ; yyyyyyy | ++-[ RECORD 2 ]-----+ +| ab | xxxx | +|+ : xxxxxx | +|+c : xxxxxxxx | +| : xxxxxxxxxx | +| : xxxxxxxxxxx | +| ; x | +| : xxxxxxxxxxx | +| ; xxx | +| : xxxxxxxxxxx | +| ; xxxxx | +| : xxxxxxxxxxx | +| ; xxxxxxx | +| : xxxxxxxxxxx | +| ; xxxxxxxxx | +| a | yyyyyyyyyyy | +|+bc ; yyyyy | +| : yyyyyyyyyyy | +| ; yyy | +| : yyyyyyyyyyy | +| ; y | +| : yyyyyyyyyy | +| : yyyyyyyy | +| : yyyyyy | +| : yyyy | +| : yy | +| : | ++----+-------------+ + +deallocate q; +-- test single-line header and data +prepare q as select repeat('x',2*n) as "0123456789abcdef", repeat('y',20-2*n) as "0123456789" from generate_series(1,10) as n; +\pset linestyle ascii +\pset expanded off +\pset columns 40 +\pset border 0 +\pset format unaligned +execute q; +0123456789abcdef|0123456789 +xx|yyyyyyyyyyyyyyyyyy +xxxx|yyyyyyyyyyyyyyyy +xxxxxx|yyyyyyyyyyyyyy +xxxxxxxx|yyyyyyyyyyyy +xxxxxxxxxx|yyyyyyyyyy +xxxxxxxxxxxx|yyyyyyyy +xxxxxxxxxxxxxx|yyyyyy +xxxxxxxxxxxxxxxx|yyyy +xxxxxxxxxxxxxxxxxx|yy +xxxxxxxxxxxxxxxxxxxx| +(10 rows) +\pset format aligned +execute q; + 0123456789abcdef 0123456789 +-------------------- ------------------ +xx yyyyyyyyyyyyyyyyyy +xxxx yyyyyyyyyyyyyyyy +xxxxxx yyyyyyyyyyyyyy +xxxxxxxx yyyyyyyyyyyy +xxxxxxxxxx yyyyyyyyyy +xxxxxxxxxxxx yyyyyyyy +xxxxxxxxxxxxxx yyyyyy +xxxxxxxxxxxxxxxx yyyy +xxxxxxxxxxxxxxxxxx yy +xxxxxxxxxxxxxxxxxxxx +(10 rows) + +\pset format wrapped +execute q; + 0123456789abcdef 0123456789 +-------------------- ------------------ +xx yyyyyyyyyyyyyyyyyy +xxxx yyyyyyyyyyyyyyyy +xxxxxx yyyyyyyyyyyyyy +xxxxxxxx yyyyyyyyyyyy +xxxxxxxxxx yyyyyyyyyy +xxxxxxxxxxxx yyyyyyyy +xxxxxxxxxxxxxx yyyyyy +xxxxxxxxxxxxxxxx yyyy +xxxxxxxxxxxxxxxxxx yy +xxxxxxxxxxxxxxxxxxxx +(10 rows) + +\pset border 1 +\pset format unaligned +execute q; +0123456789abcdef|0123456789 +xx|yyyyyyyyyyyyyyyyyy +xxxx|yyyyyyyyyyyyyyyy +xxxxxx|yyyyyyyyyyyyyy +xxxxxxxx|yyyyyyyyyyyy +xxxxxxxxxx|yyyyyyyyyy +xxxxxxxxxxxx|yyyyyyyy +xxxxxxxxxxxxxx|yyyyyy +xxxxxxxxxxxxxxxx|yyyy +xxxxxxxxxxxxxxxxxx|yy +xxxxxxxxxxxxxxxxxxxx| +(10 rows) +\pset format aligned +execute q; + 0123456789abcdef | 0123456789 +----------------------+-------------------- + xx | yyyyyyyyyyyyyyyyyy + xxxx | yyyyyyyyyyyyyyyy + xxxxxx | yyyyyyyyyyyyyy + xxxxxxxx | yyyyyyyyyyyy + xxxxxxxxxx | yyyyyyyyyy + xxxxxxxxxxxx | yyyyyyyy + xxxxxxxxxxxxxx | yyyyyy + xxxxxxxxxxxxxxxx | yyyy + xxxxxxxxxxxxxxxxxx | yy + xxxxxxxxxxxxxxxxxxxx | +(10 rows) + +\pset format wrapped +execute q; + 0123456789abcdef | 0123456789 +---------------------+------------------ + xx | yyyyyyyyyyyyyyyy. + |.yy + xxxx | yyyyyyyyyyyyyyyy + xxxxxx | yyyyyyyyyyyyyy + xxxxxxxx | yyyyyyyyyyyy + xxxxxxxxxx | yyyyyyyyyy + xxxxxxxxxxxx | yyyyyyyy + xxxxxxxxxxxxxx | yyyyyy + xxxxxxxxxxxxxxxx | yyyy + xxxxxxxxxxxxxxxxxx | yy + xxxxxxxxxxxxxxxxxxx.| +.x | +(10 rows) + +\pset border 2 +\pset format unaligned +execute q; +0123456789abcdef|0123456789 +xx|yyyyyyyyyyyyyyyyyy +xxxx|yyyyyyyyyyyyyyyy +xxxxxx|yyyyyyyyyyyyyy +xxxxxxxx|yyyyyyyyyyyy +xxxxxxxxxx|yyyyyyyyyy +xxxxxxxxxxxx|yyyyyyyy +xxxxxxxxxxxxxx|yyyyyy +xxxxxxxxxxxxxxxx|yyyy +xxxxxxxxxxxxxxxxxx|yy +xxxxxxxxxxxxxxxxxxxx| +(10 rows) +\pset format aligned +execute q; ++----------------------+--------------------+ +| 0123456789abcdef | 0123456789 | ++----------------------+--------------------+ +| xx | yyyyyyyyyyyyyyyyyy | +| xxxx | yyyyyyyyyyyyyyyy | +| xxxxxx | yyyyyyyyyyyyyy | +| xxxxxxxx | yyyyyyyyyyyy | +| xxxxxxxxxx | yyyyyyyyyy | +| xxxxxxxxxxxx | yyyyyyyy | +| xxxxxxxxxxxxxx | yyyyyy | +| xxxxxxxxxxxxxxxx | yyyy | +| xxxxxxxxxxxxxxxxxx | yy | +| xxxxxxxxxxxxxxxxxxxx | | ++----------------------+--------------------+ +(10 rows) + +\pset format wrapped +execute q; ++--------------------+-----------------+ +| 0123456789abcdef | 0123456789 | ++--------------------+-----------------+ +| xx | yyyyyyyyyyyyyyy.| +| |.yyy | +| xxxx | yyyyyyyyyyyyyyy.| +| |.y | +| xxxxxx | yyyyyyyyyyyyyy | +| xxxxxxxx | yyyyyyyyyyyy | +| xxxxxxxxxx | yyyyyyyyyy | +| xxxxxxxxxxxx | yyyyyyyy | +| xxxxxxxxxxxxxx | yyyyyy | +| xxxxxxxxxxxxxxxx | yyyy | +| xxxxxxxxxxxxxxxxxx | yy | +| xxxxxxxxxxxxxxxxxx.| | +|.xx | | ++--------------------+-----------------+ +(10 rows) + +\pset expanded on +\pset columns 30 +\pset border 0 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; +* Record 1 +0123456789abcdef xx +0123456789 yyyyyyyyyyyyyyyyyy +* Record 2 +0123456789abcdef xxxx +0123456789 yyyyyyyyyyyyyyyy +* Record 3 +0123456789abcdef xxxxxx +0123456789 yyyyyyyyyyyyyy +* Record 4 +0123456789abcdef xxxxxxxx +0123456789 yyyyyyyyyyyy +* Record 5 +0123456789abcdef xxxxxxxxxx +0123456789 yyyyyyyyyy +* Record 6 +0123456789abcdef xxxxxxxxxxxx +0123456789 yyyyyyyy +* Record 7 +0123456789abcdef xxxxxxxxxxxxxx +0123456789 yyyyyy +* Record 8 +0123456789abcdef xxxxxxxxxxxxxxxx +0123456789 yyyy +* Record 9 +0123456789abcdef xxxxxxxxxxxxxxxxxx +0123456789 yy +* Record 10 +0123456789abcdef xxxxxxxxxxxxxxxxxxxx +0123456789 + +\pset format wrapped +execute q; +* Record 1 +0123456789abcdef xx +0123456789 yyyyyyyyyyyy. + .yyyyyy +* Record 2 +0123456789abcdef xxxx +0123456789 yyyyyyyyyyyy. + .yyyy +* Record 3 +0123456789abcdef xxxxxx +0123456789 yyyyyyyyyyyy. + .yy +* Record 4 +0123456789abcdef xxxxxxxx +0123456789 yyyyyyyyyyyy +* Record 5 +0123456789abcdef xxxxxxxxxx +0123456789 yyyyyyyyyy +* Record 6 +0123456789abcdef xxxxxxxxxxxx +0123456789 yyyyyyyy +* Record 7 +0123456789abcdef xxxxxxxxxxxx. + .xx +0123456789 yyyyyy +* Record 8 +0123456789abcdef xxxxxxxxxxxx. + .xxxx +0123456789 yyyy +* Record 9 +0123456789abcdef xxxxxxxxxxxx. + .xxxxxx +0123456789 yy +* Record 10 +0123456789abcdef xxxxxxxxxxxx. + .xxxxxxxx +0123456789 + +\pset border 1 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; +-[ RECORD 1 ]----+--------------------- +0123456789abcdef | xx +0123456789 | yyyyyyyyyyyyyyyyyy +-[ RECORD 2 ]----+--------------------- +0123456789abcdef | xxxx +0123456789 | yyyyyyyyyyyyyyyy +-[ RECORD 3 ]----+--------------------- +0123456789abcdef | xxxxxx +0123456789 | yyyyyyyyyyyyyy +-[ RECORD 4 ]----+--------------------- +0123456789abcdef | xxxxxxxx +0123456789 | yyyyyyyyyyyy +-[ RECORD 5 ]----+--------------------- +0123456789abcdef | xxxxxxxxxx +0123456789 | yyyyyyyyyy +-[ RECORD 6 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxx +0123456789 | yyyyyyyy +-[ RECORD 7 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxx +0123456789 | yyyyyy +-[ RECORD 8 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxx +0123456789 | yyyy +-[ RECORD 9 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxxxx +0123456789 | yy +-[ RECORD 10 ]---+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxxxxxx +0123456789 | + +\pset format wrapped +execute q; +-[ RECORD 1 ]----+----------- +0123456789abcdef | xx +0123456789 | yyyyyyyyyy. + |.yyyyyyyy +-[ RECORD 2 ]----+----------- +0123456789abcdef | xxxx +0123456789 | yyyyyyyyyy. + |.yyyyyy +-[ RECORD 3 ]----+----------- +0123456789abcdef | xxxxxx +0123456789 | yyyyyyyyyy. + |.yyyy +-[ RECORD 4 ]----+----------- +0123456789abcdef | xxxxxxxx +0123456789 | yyyyyyyyyy. + |.yy +-[ RECORD 5 ]----+----------- +0123456789abcdef | xxxxxxxxxx +0123456789 | yyyyyyyyyy +-[ RECORD 6 ]----+----------- +0123456789abcdef | xxxxxxxxxx. + |.xx +0123456789 | yyyyyyyy +-[ RECORD 7 ]----+----------- +0123456789abcdef | xxxxxxxxxx. + |.xxxx +0123456789 | yyyyyy +-[ RECORD 8 ]----+----------- +0123456789abcdef | xxxxxxxxxx. + |.xxxxxx +0123456789 | yyyy +-[ RECORD 9 ]----+----------- +0123456789abcdef | xxxxxxxxxx. + |.xxxxxxxx +0123456789 | yy +-[ RECORD 10 ]---+----------- +0123456789abcdef | xxxxxxxxxx. + |.xxxxxxxxxx +0123456789 | + +\pset border 2 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; ++-[ RECORD 1 ]-----+----------------------+ +| 0123456789abcdef | xx | +| 0123456789 | yyyyyyyyyyyyyyyyyy | ++-[ RECORD 2 ]-----+----------------------+ +| 0123456789abcdef | xxxx | +| 0123456789 | yyyyyyyyyyyyyyyy | ++-[ RECORD 3 ]-----+----------------------+ +| 0123456789abcdef | xxxxxx | +| 0123456789 | yyyyyyyyyyyyyy | ++-[ RECORD 4 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxx | +| 0123456789 | yyyyyyyyyyyy | ++-[ RECORD 5 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxx | +| 0123456789 | yyyyyyyyyy | ++-[ RECORD 6 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxx | +| 0123456789 | yyyyyyyy | ++-[ RECORD 7 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxx | +| 0123456789 | yyyyyy | ++-[ RECORD 8 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxx | +| 0123456789 | yyyy | ++-[ RECORD 9 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxxxx | +| 0123456789 | yy | ++-[ RECORD 10 ]----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxxxxxx | +| 0123456789 | | ++------------------+----------------------+ + +\pset format wrapped +execute q; ++-[ RECORD 1 ]-----+---------+ +| 0123456789abcdef | xx | +| 0123456789 | yyyyyyy.| +| |.yyyyyyy.| +| |.yyyy | ++-[ RECORD 2 ]-----+---------+ +| 0123456789abcdef | xxxx | +| 0123456789 | yyyyyyy.| +| |.yyyyyyy.| +| |.yy | ++-[ RECORD 3 ]-----+---------+ +| 0123456789abcdef | xxxxxx | +| 0123456789 | yyyyyyy.| +| |.yyyyyyy | ++-[ RECORD 4 ]-----+---------+ +| 0123456789abcdef | xxxxxxx.| +| |.x | +| 0123456789 | yyyyyyy.| +| |.yyyyy | ++-[ RECORD 5 ]-----+---------+ +| 0123456789abcdef | xxxxxxx.| +| |.xxx | +| 0123456789 | yyyyyyy.| +| |.yyy | ++-[ RECORD 6 ]-----+---------+ +| 0123456789abcdef | xxxxxxx.| +| |.xxxxx | +| 0123456789 | yyyyyyy.| +| |.y | ++-[ RECORD 7 ]-----+---------+ +| 0123456789abcdef | xxxxxxx.| +| |.xxxxxxx | +| 0123456789 | yyyyyy | ++-[ RECORD 8 ]-----+---------+ +| 0123456789abcdef | xxxxxxx.| +| |.xxxxxxx.| +| |.xx | +| 0123456789 | yyyy | ++-[ RECORD 9 ]-----+---------+ +| 0123456789abcdef | xxxxxxx.| +| |.xxxxxxx.| +| |.xxxx | +| 0123456789 | yy | ++-[ RECORD 10 ]----+---------+ +| 0123456789abcdef | xxxxxxx.| +| |.xxxxxxx.| +| |.xxxxxx | +| 0123456789 | | ++------------------+---------+ + +\pset expanded on +\pset columns 20 +\pset border 0 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; +* Record 1 +0123456789abcdef xx +0123456789 yyyyyyyyyyyyyyyyyy +* Record 2 +0123456789abcdef xxxx +0123456789 yyyyyyyyyyyyyyyy +* Record 3 +0123456789abcdef xxxxxx +0123456789 yyyyyyyyyyyyyy +* Record 4 +0123456789abcdef xxxxxxxx +0123456789 yyyyyyyyyyyy +* Record 5 +0123456789abcdef xxxxxxxxxx +0123456789 yyyyyyyyyy +* Record 6 +0123456789abcdef xxxxxxxxxxxx +0123456789 yyyyyyyy +* Record 7 +0123456789abcdef xxxxxxxxxxxxxx +0123456789 yyyyyy +* Record 8 +0123456789abcdef xxxxxxxxxxxxxxxx +0123456789 yyyy +* Record 9 +0123456789abcdef xxxxxxxxxxxxxxxxxx +0123456789 yy +* Record 10 +0123456789abcdef xxxxxxxxxxxxxxxxxxxx +0123456789 + +\pset format wrapped +execute q; +* Record 1 +0123456789abcdef xx +0123456789 yyy. + .yyy. + .yyy. + .yyy. + .yyy. + .yyy +* Record 2 +0123456789abcdef xxx. + .x +0123456789 yyy. + .yyy. + .yyy. + .yyy. + .yyy. + .y +* Record 3 +0123456789abcdef xxx. + .xxx +0123456789 yyy. + .yyy. + .yyy. + .yyy. + .yy +* Record 4 +0123456789abcdef xxx. + .xxx. + .xx +0123456789 yyy. + .yyy. + .yyy. + .yyy +* Record 5 +0123456789abcdef xxx. + .xxx. + .xxx. + .x +0123456789 yyy. + .yyy. + .yyy. + .y +* Record 6 +0123456789abcdef xxx. + .xxx. + .xxx. + .xxx +0123456789 yyy. + .yyy. + .yy +* Record 7 +0123456789abcdef xxx. + .xxx. + .xxx. + .xxx. + .xx +0123456789 yyy. + .yyy +* Record 8 +0123456789abcdef xxx. + .xxx. + .xxx. + .xxx. + .xxx. + .x +0123456789 yyy. + .y +* Record 9 +0123456789abcdef xxx. + .xxx. + .xxx. + .xxx. + .xxx. + .xxx +0123456789 yy +* Record 10 +0123456789abcdef xxx. + .xxx. + .xxx. + .xxx. + .xxx. + .xxx. + .xx +0123456789 + +\pset border 1 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; +-[ RECORD 1 ]----+--------------------- +0123456789abcdef | xx +0123456789 | yyyyyyyyyyyyyyyyyy +-[ RECORD 2 ]----+--------------------- +0123456789abcdef | xxxx +0123456789 | yyyyyyyyyyyyyyyy +-[ RECORD 3 ]----+--------------------- +0123456789abcdef | xxxxxx +0123456789 | yyyyyyyyyyyyyy +-[ RECORD 4 ]----+--------------------- +0123456789abcdef | xxxxxxxx +0123456789 | yyyyyyyyyyyy +-[ RECORD 5 ]----+--------------------- +0123456789abcdef | xxxxxxxxxx +0123456789 | yyyyyyyyyy +-[ RECORD 6 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxx +0123456789 | yyyyyyyy +-[ RECORD 7 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxx +0123456789 | yyyyyy +-[ RECORD 8 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxx +0123456789 | yyyy +-[ RECORD 9 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxxxx +0123456789 | yy +-[ RECORD 10 ]---+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxxxxxx +0123456789 | + +\pset format wrapped +execute q; +-[ RECORD 1 ]----+---- +0123456789abcdef | xx +0123456789 | yyy. + |.yyy. + |.yyy. + |.yyy. + |.yyy. + |.yyy +-[ RECORD 2 ]----+---- +0123456789abcdef | xxx. + |.x +0123456789 | yyy. + |.yyy. + |.yyy. + |.yyy. + |.yyy. + |.y +-[ RECORD 3 ]----+---- +0123456789abcdef | xxx. + |.xxx +0123456789 | yyy. + |.yyy. + |.yyy. + |.yyy. + |.yy +-[ RECORD 4 ]----+---- +0123456789abcdef | xxx. + |.xxx. + |.xx +0123456789 | yyy. + |.yyy. + |.yyy. + |.yyy +-[ RECORD 5 ]----+---- +0123456789abcdef | xxx. + |.xxx. + |.xxx. + |.x +0123456789 | yyy. + |.yyy. + |.yyy. + |.y +-[ RECORD 6 ]----+---- +0123456789abcdef | xxx. + |.xxx. + |.xxx. + |.xxx +0123456789 | yyy. + |.yyy. + |.yy +-[ RECORD 7 ]----+---- +0123456789abcdef | xxx. + |.xxx. + |.xxx. + |.xxx. + |.xx +0123456789 | yyy. + |.yyy +-[ RECORD 8 ]----+---- +0123456789abcdef | xxx. + |.xxx. + |.xxx. + |.xxx. + |.xxx. + |.x +0123456789 | yyy. + |.y +-[ RECORD 9 ]----+---- +0123456789abcdef | xxx. + |.xxx. + |.xxx. + |.xxx. + |.xxx. + |.xxx +0123456789 | yy +-[ RECORD 10 ]---+---- +0123456789abcdef | xxx. + |.xxx. + |.xxx. + |.xxx. + |.xxx. + |.xxx. + |.xx +0123456789 | + +\pset border 2 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; ++-[ RECORD 1 ]-----+----------------------+ +| 0123456789abcdef | xx | +| 0123456789 | yyyyyyyyyyyyyyyyyy | ++-[ RECORD 2 ]-----+----------------------+ +| 0123456789abcdef | xxxx | +| 0123456789 | yyyyyyyyyyyyyyyy | ++-[ RECORD 3 ]-----+----------------------+ +| 0123456789abcdef | xxxxxx | +| 0123456789 | yyyyyyyyyyyyyy | ++-[ RECORD 4 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxx | +| 0123456789 | yyyyyyyyyyyy | ++-[ RECORD 5 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxx | +| 0123456789 | yyyyyyyyyy | ++-[ RECORD 6 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxx | +| 0123456789 | yyyyyyyy | ++-[ RECORD 7 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxx | +| 0123456789 | yyyyyy | ++-[ RECORD 8 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxx | +| 0123456789 | yyyy | ++-[ RECORD 9 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxxxx | +| 0123456789 | yy | ++-[ RECORD 10 ]----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxxxxxx | +| 0123456789 | | ++------------------+----------------------+ + +\pset format wrapped +execute q; ++-[ RECORD 1 ]-----+-----+ +| 0123456789abcdef | xx | +| 0123456789 | yyy.| +| |.yyy.| +| |.yyy.| +| |.yyy.| +| |.yyy.| +| |.yyy | ++-[ RECORD 2 ]-----+-----+ +| 0123456789abcdef | xxx.| +| |.x | +| 0123456789 | yyy.| +| |.yyy.| +| |.yyy.| +| |.yyy.| +| |.yyy.| +| |.y | ++-[ RECORD 3 ]-----+-----+ +| 0123456789abcdef | xxx.| +| |.xxx | +| 0123456789 | yyy.| +| |.yyy.| +| |.yyy.| +| |.yyy.| +| |.yy | ++-[ RECORD 4 ]-----+-----+ +| 0123456789abcdef | xxx.| +| |.xxx.| +| |.xx | +| 0123456789 | yyy.| +| |.yyy.| +| |.yyy.| +| |.yyy | ++-[ RECORD 5 ]-----+-----+ +| 0123456789abcdef | xxx.| +| |.xxx.| +| |.xxx.| +| |.x | +| 0123456789 | yyy.| +| |.yyy.| +| |.yyy.| +| |.y | ++-[ RECORD 6 ]-----+-----+ +| 0123456789abcdef | xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx | +| 0123456789 | yyy.| +| |.yyy.| +| |.yy | ++-[ RECORD 7 ]-----+-----+ +| 0123456789abcdef | xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx.| +| |.xx | +| 0123456789 | yyy.| +| |.yyy | ++-[ RECORD 8 ]-----+-----+ +| 0123456789abcdef | xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx.| +| |.x | +| 0123456789 | yyy.| +| |.y | ++-[ RECORD 9 ]-----+-----+ +| 0123456789abcdef | xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx | +| 0123456789 | yy | ++-[ RECORD 10 ]----+-----+ +| 0123456789abcdef | xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx.| +| |.xxx.| +| |.xx | +| 0123456789 | | ++------------------+-----+ + +\pset linestyle old-ascii +\pset expanded off +\pset columns 40 +\pset border 0 +\pset format unaligned +execute q; +0123456789abcdef|0123456789 +xx|yyyyyyyyyyyyyyyyyy +xxxx|yyyyyyyyyyyyyyyy +xxxxxx|yyyyyyyyyyyyyy +xxxxxxxx|yyyyyyyyyyyy +xxxxxxxxxx|yyyyyyyyyy +xxxxxxxxxxxx|yyyyyyyy +xxxxxxxxxxxxxx|yyyyyy +xxxxxxxxxxxxxxxx|yyyy +xxxxxxxxxxxxxxxxxx|yy +xxxxxxxxxxxxxxxxxxxx| +(10 rows) +\pset format aligned +execute q; + 0123456789abcdef 0123456789 +-------------------- ------------------ +xx yyyyyyyyyyyyyyyyyy +xxxx yyyyyyyyyyyyyyyy +xxxxxx yyyyyyyyyyyyyy +xxxxxxxx yyyyyyyyyyyy +xxxxxxxxxx yyyyyyyyyy +xxxxxxxxxxxx yyyyyyyy +xxxxxxxxxxxxxx yyyyyy +xxxxxxxxxxxxxxxx yyyy +xxxxxxxxxxxxxxxxxx yy +xxxxxxxxxxxxxxxxxxxx +(10 rows) + +\pset format wrapped +execute q; + 0123456789abcdef 0123456789 +-------------------- ------------------ +xx yyyyyyyyyyyyyyyyyy +xxxx yyyyyyyyyyyyyyyy +xxxxxx yyyyyyyyyyyyyy +xxxxxxxx yyyyyyyyyyyy +xxxxxxxxxx yyyyyyyyyy +xxxxxxxxxxxx yyyyyyyy +xxxxxxxxxxxxxx yyyyyy +xxxxxxxxxxxxxxxx yyyy +xxxxxxxxxxxxxxxxxx yy +xxxxxxxxxxxxxxxxxxxx +(10 rows) + +\pset border 1 +\pset format unaligned +execute q; +0123456789abcdef|0123456789 +xx|yyyyyyyyyyyyyyyyyy +xxxx|yyyyyyyyyyyyyyyy +xxxxxx|yyyyyyyyyyyyyy +xxxxxxxx|yyyyyyyyyyyy +xxxxxxxxxx|yyyyyyyyyy +xxxxxxxxxxxx|yyyyyyyy +xxxxxxxxxxxxxx|yyyyyy +xxxxxxxxxxxxxxxx|yyyy +xxxxxxxxxxxxxxxxxx|yy +xxxxxxxxxxxxxxxxxxxx| +(10 rows) +\pset format aligned +execute q; + 0123456789abcdef | 0123456789 +----------------------+-------------------- + xx | yyyyyyyyyyyyyyyyyy + xxxx | yyyyyyyyyyyyyyyy + xxxxxx | yyyyyyyyyyyyyy + xxxxxxxx | yyyyyyyyyyyy + xxxxxxxxxx | yyyyyyyyyy + xxxxxxxxxxxx | yyyyyyyy + xxxxxxxxxxxxxx | yyyyyy + xxxxxxxxxxxxxxxx | yyyy + xxxxxxxxxxxxxxxxxx | yy + xxxxxxxxxxxxxxxxxxxx | +(10 rows) + +\pset format wrapped +execute q; + 0123456789abcdef | 0123456789 +---------------------+------------------ + xx | yyyyyyyyyyyyyyyy + ; yy + xxxx | yyyyyyyyyyyyyyyy + xxxxxx | yyyyyyyyyyyyyy + xxxxxxxx | yyyyyyyyyyyy + xxxxxxxxxx | yyyyyyyyyy + xxxxxxxxxxxx | yyyyyyyy + xxxxxxxxxxxxxx | yyyyyy + xxxxxxxxxxxxxxxx | yyyy + xxxxxxxxxxxxxxxxxx | yy + xxxxxxxxxxxxxxxxxxx | + x +(10 rows) + +\pset border 2 +\pset format unaligned +execute q; +0123456789abcdef|0123456789 +xx|yyyyyyyyyyyyyyyyyy +xxxx|yyyyyyyyyyyyyyyy +xxxxxx|yyyyyyyyyyyyyy +xxxxxxxx|yyyyyyyyyyyy +xxxxxxxxxx|yyyyyyyyyy +xxxxxxxxxxxx|yyyyyyyy +xxxxxxxxxxxxxx|yyyyyy +xxxxxxxxxxxxxxxx|yyyy +xxxxxxxxxxxxxxxxxx|yy +xxxxxxxxxxxxxxxxxxxx| +(10 rows) +\pset format aligned +execute q; ++----------------------+--------------------+ +| 0123456789abcdef | 0123456789 | ++----------------------+--------------------+ +| xx | yyyyyyyyyyyyyyyyyy | +| xxxx | yyyyyyyyyyyyyyyy | +| xxxxxx | yyyyyyyyyyyyyy | +| xxxxxxxx | yyyyyyyyyyyy | +| xxxxxxxxxx | yyyyyyyyyy | +| xxxxxxxxxxxx | yyyyyyyy | +| xxxxxxxxxxxxxx | yyyyyy | +| xxxxxxxxxxxxxxxx | yyyy | +| xxxxxxxxxxxxxxxxxx | yy | +| xxxxxxxxxxxxxxxxxxxx | | ++----------------------+--------------------+ +(10 rows) + +\pset format wrapped +execute q; ++--------------------+-----------------+ +| 0123456789abcdef | 0123456789 | ++--------------------+-----------------+ +| xx | yyyyyyyyyyyyyyy | +| ; yyy | +| xxxx | yyyyyyyyyyyyyyy | +| ; y | +| xxxxxx | yyyyyyyyyyyyyy | +| xxxxxxxx | yyyyyyyyyyyy | +| xxxxxxxxxx | yyyyyyyyyy | +| xxxxxxxxxxxx | yyyyyyyy | +| xxxxxxxxxxxxxx | yyyyyy | +| xxxxxxxxxxxxxxxx | yyyy | +| xxxxxxxxxxxxxxxxxx | yy | +| xxxxxxxxxxxxxxxxxx | | +| xx | ++--------------------+-----------------+ +(10 rows) + +\pset expanded on +\pset border 0 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; +* Record 1 +0123456789abcdef xx +0123456789 yyyyyyyyyyyyyyyyyy +* Record 2 +0123456789abcdef xxxx +0123456789 yyyyyyyyyyyyyyyy +* Record 3 +0123456789abcdef xxxxxx +0123456789 yyyyyyyyyyyyyy +* Record 4 +0123456789abcdef xxxxxxxx +0123456789 yyyyyyyyyyyy +* Record 5 +0123456789abcdef xxxxxxxxxx +0123456789 yyyyyyyyyy +* Record 6 +0123456789abcdef xxxxxxxxxxxx +0123456789 yyyyyyyy +* Record 7 +0123456789abcdef xxxxxxxxxxxxxx +0123456789 yyyyyy +* Record 8 +0123456789abcdef xxxxxxxxxxxxxxxx +0123456789 yyyy +* Record 9 +0123456789abcdef xxxxxxxxxxxxxxxxxx +0123456789 yy +* Record 10 +0123456789abcdef xxxxxxxxxxxxxxxxxxxx +0123456789 + +\pset format wrapped +execute q; +* Record 1 +0123456789abcdef xx +0123456789 yyyyyyyyyyyyyyyyyy +* Record 2 +0123456789abcdef xxxx +0123456789 yyyyyyyyyyyyyyyy +* Record 3 +0123456789abcdef xxxxxx +0123456789 yyyyyyyyyyyyyy +* Record 4 +0123456789abcdef xxxxxxxx +0123456789 yyyyyyyyyyyy +* Record 5 +0123456789abcdef xxxxxxxxxx +0123456789 yyyyyyyyyy +* Record 6 +0123456789abcdef xxxxxxxxxxxx +0123456789 yyyyyyyy +* Record 7 +0123456789abcdef xxxxxxxxxxxxxx +0123456789 yyyyyy +* Record 8 +0123456789abcdef xxxxxxxxxxxxxxxx +0123456789 yyyy +* Record 9 +0123456789abcdef xxxxxxxxxxxxxxxxxx +0123456789 yy +* Record 10 +0123456789abcdef xxxxxxxxxxxxxxxxxxxx +0123456789 + +\pset border 1 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; +-[ RECORD 1 ]----+--------------------- +0123456789abcdef | xx +0123456789 | yyyyyyyyyyyyyyyyyy +-[ RECORD 2 ]----+--------------------- +0123456789abcdef | xxxx +0123456789 | yyyyyyyyyyyyyyyy +-[ RECORD 3 ]----+--------------------- +0123456789abcdef | xxxxxx +0123456789 | yyyyyyyyyyyyyy +-[ RECORD 4 ]----+--------------------- +0123456789abcdef | xxxxxxxx +0123456789 | yyyyyyyyyyyy +-[ RECORD 5 ]----+--------------------- +0123456789abcdef | xxxxxxxxxx +0123456789 | yyyyyyyyyy +-[ RECORD 6 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxx +0123456789 | yyyyyyyy +-[ RECORD 7 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxx +0123456789 | yyyyyy +-[ RECORD 8 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxx +0123456789 | yyyy +-[ RECORD 9 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxxxx +0123456789 | yy +-[ RECORD 10 ]---+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxxxxxx +0123456789 | + +\pset format wrapped +execute q; +-[ RECORD 1 ]----+--------------------- +0123456789abcdef | xx +0123456789 | yyyyyyyyyyyyyyyyyy +-[ RECORD 2 ]----+--------------------- +0123456789abcdef | xxxx +0123456789 | yyyyyyyyyyyyyyyy +-[ RECORD 3 ]----+--------------------- +0123456789abcdef | xxxxxx +0123456789 | yyyyyyyyyyyyyy +-[ RECORD 4 ]----+--------------------- +0123456789abcdef | xxxxxxxx +0123456789 | yyyyyyyyyyyy +-[ RECORD 5 ]----+--------------------- +0123456789abcdef | xxxxxxxxxx +0123456789 | yyyyyyyyyy +-[ RECORD 6 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxx +0123456789 | yyyyyyyy +-[ RECORD 7 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxx +0123456789 | yyyyyy +-[ RECORD 8 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxx +0123456789 | yyyy +-[ RECORD 9 ]----+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxxxx +0123456789 | yy +-[ RECORD 10 ]---+--------------------- +0123456789abcdef | xxxxxxxxxxxxxxxxxxxx +0123456789 | + +\pset border 2 +\pset format unaligned +execute q; +0123456789abcdef|xx +0123456789|yyyyyyyyyyyyyyyyyy + +0123456789abcdef|xxxx +0123456789|yyyyyyyyyyyyyyyy + +0123456789abcdef|xxxxxx +0123456789|yyyyyyyyyyyyyy + +0123456789abcdef|xxxxxxxx +0123456789|yyyyyyyyyyyy + +0123456789abcdef|xxxxxxxxxx +0123456789|yyyyyyyyyy + +0123456789abcdef|xxxxxxxxxxxx +0123456789|yyyyyyyy + +0123456789abcdef|xxxxxxxxxxxxxx +0123456789|yyyyyy + +0123456789abcdef|xxxxxxxxxxxxxxxx +0123456789|yyyy + +0123456789abcdef|xxxxxxxxxxxxxxxxxx +0123456789|yy + +0123456789abcdef|xxxxxxxxxxxxxxxxxxxx +0123456789| +\pset format aligned +execute q; ++-[ RECORD 1 ]-----+----------------------+ +| 0123456789abcdef | xx | +| 0123456789 | yyyyyyyyyyyyyyyyyy | ++-[ RECORD 2 ]-----+----------------------+ +| 0123456789abcdef | xxxx | +| 0123456789 | yyyyyyyyyyyyyyyy | ++-[ RECORD 3 ]-----+----------------------+ +| 0123456789abcdef | xxxxxx | +| 0123456789 | yyyyyyyyyyyyyy | ++-[ RECORD 4 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxx | +| 0123456789 | yyyyyyyyyyyy | ++-[ RECORD 5 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxx | +| 0123456789 | yyyyyyyyyy | ++-[ RECORD 6 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxx | +| 0123456789 | yyyyyyyy | ++-[ RECORD 7 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxx | +| 0123456789 | yyyyyy | ++-[ RECORD 8 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxx | +| 0123456789 | yyyy | ++-[ RECORD 9 ]-----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxxxx | +| 0123456789 | yy | ++-[ RECORD 10 ]----+----------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxxxxxx | +| 0123456789 | | ++------------------+----------------------+ + +\pset format wrapped +execute q; ++-[ RECORD 1 ]-----+-------------------+ +| 0123456789abcdef | xx | +| 0123456789 | yyyyyyyyyyyyyyyyy | +| ; y | ++-[ RECORD 2 ]-----+-------------------+ +| 0123456789abcdef | xxxx | +| 0123456789 | yyyyyyyyyyyyyyyy | ++-[ RECORD 3 ]-----+-------------------+ +| 0123456789abcdef | xxxxxx | +| 0123456789 | yyyyyyyyyyyyyy | ++-[ RECORD 4 ]-----+-------------------+ +| 0123456789abcdef | xxxxxxxx | +| 0123456789 | yyyyyyyyyyyy | ++-[ RECORD 5 ]-----+-------------------+ +| 0123456789abcdef | xxxxxxxxxx | +| 0123456789 | yyyyyyyyyy | ++-[ RECORD 6 ]-----+-------------------+ +| 0123456789abcdef | xxxxxxxxxxxx | +| 0123456789 | yyyyyyyy | ++-[ RECORD 7 ]-----+-------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxx | +| 0123456789 | yyyyyy | ++-[ RECORD 8 ]-----+-------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxx | +| 0123456789 | yyyy | ++-[ RECORD 9 ]-----+-------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxxx | +| ; x | +| 0123456789 | yy | ++-[ RECORD 10 ]----+-------------------+ +| 0123456789abcdef | xxxxxxxxxxxxxxxxx | +| ; xxx | +| 0123456789 | | ++------------------+-------------------+ + +deallocate q; +\pset linestyle ascii +\pset border 1 +-- support table for output-format tests (useful to create a footer) +create table psql_serial_tab (id serial); +-- test header/footer/tuples_only behavior in aligned/unaligned/wrapped cases +\pset format aligned +\pset expanded off +\d psql_serial_tab_id_seq + Sequence "public.psql_serial_tab_id_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Owned by: public.psql_serial_tab.id + +\pset tuples_only true +\df exp + pg_catalog | exp | complex | complex | func + pg_catalog | exp | double precision | double precision | func + pg_catalog | exp | numeric | numeric | func + +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +Sequence "public.psql_serial_tab_id_seq" +-[ RECORD 1 ]--------- +Type | integer +Start | 1 +Minimum | 1 +Maximum | 2147483647 +Increment | 1 +Cycles? | no +Cache | 1 + +Owned by: public.psql_serial_tab.id + +\pset tuples_only true +\df exp +Schema | pg_catalog +Name | exp +Result data type | complex +Argument data types | complex +Type | func +--------------------+----------------- +Schema | pg_catalog +Name | exp +Result data type | double precision +Argument data types | double precision +Type | func +--------------------+----------------- +Schema | pg_catalog +Name | exp +Result data type | numeric +Argument data types | numeric +Type | func + +\pset tuples_only false +-- empty table is a special case for this format +select 1 where false; +(0 rows) + +\pset format unaligned +\pset expanded off +\d psql_serial_tab_id_seq +Sequence "public.psql_serial_tab_id_seq" +Type|Start|Minimum|Maximum|Increment|Cycles?|Cache +integer|1|1|2147483647|1|no|1 +Owned by: public.psql_serial_tab.id +\pset tuples_only true +\df exp +pg_catalog|exp|complex|complex|func +pg_catalog|exp|double precision|double precision|func +pg_catalog|exp|numeric|numeric|func +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +Sequence "public.psql_serial_tab_id_seq" + +Type|integer +Start|1 +Minimum|1 +Maximum|2147483647 +Increment|1 +Cycles?|no +Cache|1 + +Owned by: public.psql_serial_tab.id +\pset tuples_only true +\df exp +Schema|pg_catalog +Name|exp +Result data type|complex +Argument data types|complex +Type|func + +Schema|pg_catalog +Name|exp +Result data type|double precision +Argument data types|double precision +Type|func + +Schema|pg_catalog +Name|exp +Result data type|numeric +Argument data types|numeric +Type|func +\pset tuples_only false +\pset format wrapped +\pset expanded off +\d psql_serial_tab_id_seq + Sequence "public.psql_serial_tab_id_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Owned by: public.psql_serial_tab.id + +\pset tuples_only true +\df exp + pg_catalog | exp | complex | complex | func + pg_catalog | exp | double precision | double precision | func + pg_catalog | exp | numeric | numeric | func + +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +Sequence "public.psql_serial_tab_id_seq" +-[ RECORD 1 ]--------- +Type | integer +Start | 1 +Minimum | 1 +Maximum | 2147483647 +Increment | 1 +Cycles? | no +Cache | 1 + +Owned by: public.psql_serial_tab.id + +\pset tuples_only true +\df exp +Schema | pg_catalog +Name | exp +Result data type | complex +Argument data types | complex +Type | func +--------------------+----------------- +Schema | pg_catalog +Name | exp +Result data type | double precision +Argument data types | double precision +Type | func +--------------------+----------------- +Schema | pg_catalog +Name | exp +Result data type | numeric +Argument data types | numeric +Type | func + +\pset tuples_only false +-- check conditional am display +\pset expanded off +CREATE SCHEMA tableam_display; +CREATE ROLE regress_display_role; +ALTER SCHEMA tableam_display OWNER TO regress_display_role; +SET search_path TO tableam_display; +CREATE ACCESS METHOD heap_psql TYPE TABLE HANDLER heap_tableam_handler; +SET ROLE TO regress_display_role; +-- Use only relations with a physical size of zero. +CREATE TABLE tbl_heap_psql(f1 int, f2 char(100)) using heap_psql; +CREATE TABLE tbl_heap(f1 int, f2 char(100)) using heap; +CREATE VIEW view_heap_psql AS SELECT f1 from tbl_heap_psql; +CREATE MATERIALIZED VIEW mat_view_heap_psql USING heap_psql AS SELECT f1 from tbl_heap_psql; +\d+ tbl_heap_psql + Table "tableam_display.tbl_heap_psql" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+----------------+-----------+----------+---------+----------+--------------+------------- + f1 | integer | | | | plain | | + f2 | character(100) | | | | extended | | + +\d+ tbl_heap + Table "tableam_display.tbl_heap" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+----------------+-----------+----------+---------+----------+--------------+------------- + f1 | integer | | | | plain | | + f2 | character(100) | | | | extended | | + +\set HIDE_TABLEAM off +\d+ tbl_heap_psql + Table "tableam_display.tbl_heap_psql" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+----------------+-----------+----------+---------+----------+--------------+------------- + f1 | integer | | | | plain | | + f2 | character(100) | | | | extended | | +Access method: heap_psql + +\d+ tbl_heap + Table "tableam_display.tbl_heap" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+----------------+-----------+----------+---------+----------+--------------+------------- + f1 | integer | | | | plain | | + f2 | character(100) | | | | extended | | +Access method: heap + +-- AM is displayed for tables, indexes and materialized views. +\d+ + List of relations + Schema | Name | Type | Owner | Storage | Persistence | Access method | Size | Description +-----------------+--------------------+-------------------+----------------------+---------+-------------+---------------+---------+------------- + tableam_display | mat_view_heap_psql | materialized view | regress_display_role | | permanent | heap_psql | 0 bytes | + tableam_display | tbl_heap | table | regress_display_role | heap | permanent | heap | 0 bytes | + tableam_display | tbl_heap_psql | table | regress_display_role | | permanent | heap_psql | 0 bytes | + tableam_display | view_heap_psql | view | regress_display_role | | permanent | | 0 bytes | +(4 rows) + +\dt+ + List of relations + Schema | Name | Type | Owner | Storage | Persistence | Access method | Size | Description +-----------------+---------------+-------+----------------------+---------+-------------+---------------+---------+------------- + tableam_display | tbl_heap | table | regress_display_role | heap | permanent | heap | 0 bytes | + tableam_display | tbl_heap_psql | table | regress_display_role | | permanent | heap_psql | 0 bytes | +(2 rows) + +\dm+ + List of relations + Schema | Name | Type | Owner | Persistence | Access method | Size | Description +-----------------+--------------------+-------------------+----------------------+-------------+---------------+---------+------------- + tableam_display | mat_view_heap_psql | materialized view | regress_display_role | permanent | heap_psql | 0 bytes | +(1 row) + +-- But not for views and sequences. +\dv+ + List of relations + Schema | Name | Type | Owner | Persistence | Size | Description +-----------------+----------------+------+----------------------+-------------+---------+------------- + tableam_display | view_heap_psql | view | regress_display_role | permanent | 0 bytes | +(1 row) + +\set HIDE_TABLEAM on +\d+ + List of relations + Schema | Name | Type | Owner | Storage | Persistence | Size | Description +-----------------+--------------------+-------------------+----------------------+---------+-------------+---------+------------- + tableam_display | mat_view_heap_psql | materialized view | regress_display_role | | permanent | 0 bytes | + tableam_display | tbl_heap | table | regress_display_role | heap | permanent | 0 bytes | + tableam_display | tbl_heap_psql | table | regress_display_role | | permanent | 0 bytes | + tableam_display | view_heap_psql | view | regress_display_role | | permanent | 0 bytes | +(4 rows) + +RESET ROLE; +RESET search_path; +DROP SCHEMA tableam_display CASCADE; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to table tableam_display.tbl_heap_psql +drop cascades to table tableam_display.tbl_heap +drop cascades to view tableam_display.view_heap_psql +drop cascades to materialized view tableam_display.mat_view_heap_psql +DROP ACCESS METHOD heap_psql; +DROP ROLE regress_display_role; +-- test numericlocale (as best we can without control of psql's locale) +\pset format aligned +\pset expanded off +\pset numericlocale true +select n, -n as m, n * 111 as x, '1e90'::float8 as f +from generate_series(0,3) n; + n | m | x | f +---+----+-----+------- + 0 | 0 | 0 | 1e+90 + 1 | -1 | 111 | 1e+90 + 2 | -2 | 222 | 1e+90 + 3 | -3 | 333 | 1e+90 +(4 rows) + +\pset numericlocale false +-- test asciidoc output format +\pset format asciidoc +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq + +.Sequence "public.psql_serial_tab_id_seq" +[options="header",cols="l,>l,>l,>l,l",frame="none"] +|==== +^l|Type ^l|Start ^l|Minimum ^l|Maximum ^l|Increment ^l|Cycles? ^l|Cache +|integer |1 |1 |2147483647 |1 |no |1 +|==== + +.... +Owned by: public.psql_serial_tab.id +.... +\pset tuples_only true +\df exp + +[cols="l|1 +l|1 +l|2147483647 +l|1 +l|1 +|==== + +.... +Owned by: public.psql_serial_tab.id +.... +\pset tuples_only true +\df exp + +[cols="h,l",frame="none"] +|==== +2+| +l|1 +2+^|Record 2 +l|2 +|==== +\pset border 1 +execute q; + +[cols="h,l",frame="none"] +|==== +2+^|Record 1 +l|1 +2+^|Record 2 +l|2 +|==== +\pset border 2 +execute q; + +[cols="h,l",frame="all",grid="all"] +|==== +2+^|Record 1 +l|1 +2+^|Record 2 +l|2 +|==== +deallocate q; +-- test csv output format +\pset format csv +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +Type,Start,Minimum,Maximum,Increment,Cycles?,Cache +integer,1,1,2147483647,1,no,1 +\pset tuples_only true +\df exp +pg_catalog,exp,complex,complex,func +pg_catalog,exp,double precision,double precision,func +pg_catalog,exp,numeric,numeric,func +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +Type,integer +Start,1 +Minimum,1 +Maximum,2147483647 +Increment,1 +Cycles?,no +Cache,1 +\pset tuples_only true +\df exp +Schema,pg_catalog +Name,exp +Result data type,complex +Argument data types,complex +Type,func +Schema,pg_catalog +Name,exp +Result data type,double precision +Argument data types,double precision +Type,func +Schema,pg_catalog +Name,exp +Result data type,numeric +Argument data types,numeric +Type,func +\pset tuples_only false +prepare q as + select 'some"text' as "a""title", E' \n' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; +\pset expanded off +execute q; +"a""title",junk,empty,int +"some""text"," +", ,1 +"some""text"," +", ,2 +\pset expanded on +execute q; +"a""title","some""text" +junk," +" +empty, +int,1 +"a""title","some""text" +junk," +" +empty, +int,2 +deallocate q; +-- special cases +\pset expanded off +select 'comma,comma' as comma, 'semi;semi' as semi; +comma,semi +"comma,comma",semi;semi +\pset csv_fieldsep ';' +select 'comma,comma' as comma, 'semi;semi' as semi; +comma;semi +comma,comma;"semi;semi" +select '\.' as data; +data +"\." +\pset csv_fieldsep '.' +select '\' as d1, '' as d2; +"d1"."d2" +"\"."" +-- illegal csv separators +\pset csv_fieldsep '' +\pset: csv_fieldsep must be a single one-byte character +\pset csv_fieldsep '\0' +\pset: csv_fieldsep must be a single one-byte character +\pset csv_fieldsep '\n' +\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return +\pset csv_fieldsep '\r' +\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return +\pset csv_fieldsep '"' +\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return +\pset csv_fieldsep ',,' +\pset: csv_fieldsep must be a single one-byte character +\pset csv_fieldsep ',' +-- test html output format +\pset format html +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +
+ + + + + + + + + + + + + + + + + + + +
Sequence "public.psql_serial_tab_id_seq"
TypeStartMinimumMaximumIncrementCycles?Cache
integer1121474836471no1
+

Owned by: public.psql_serial_tab.id
+

+\pset tuples_only true +\df exp + + + + + + + + + + + + + + + + + + + + + + +
pg_catalogexpcomplexcomplexfunc
pg_catalogexpdouble precisiondouble precisionfunc
pg_catalogexpnumericnumericfunc
+ +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sequence "public.psql_serial_tab_id_seq"
Record 1
Typeinteger
Start1
Minimum1
Maximum2147483647
Increment1
Cycles?no
Cache1
+

Owned by: public.psql_serial_tab.id
+

+\pset tuples_only true +\df exp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Schemapg_catalog
Nameexp
Result data typecomplex
Argument data typescomplex
Typefunc
 
Schemapg_catalog
Nameexp
Result data typedouble precision
Argument data typesdouble precision
Typefunc
 
Schemapg_catalog
Nameexp
Result data typenumeric
Argument data typesnumeric
Typefunc
+ +\pset tuples_only false +prepare q as + select 'some"text' as "a&title", E' \n' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; +\pset expanded off +\pset border 0 +execute q; + + + + + + + + + + + + + + + + + + + +
a&titlejunkemptyint
some"text  <foo>
+<bar>
  1
some"text  <foo>
+<bar>
  2
+

(2 rows)
+

+\pset border 1 +execute q; + + + + + + + + + + + + + + + + + + + +
a&titlejunkemptyint
some"text  <foo>
+<bar>
  1
some"text  <foo>
+<bar>
  2
+

(2 rows)
+

+\pset tableattr foobar +execute q; + + + + + + + + + + + + + + + + + + + +
a&titlejunkemptyint
some"text  <foo>
+<bar>
  1
some"text  <foo>
+<bar>
  2
+

(2 rows)
+

+\pset tableattr +\pset expanded on +\pset border 0 +execute q; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Record 1
a&titlesome"text
junk  <foo>
+<bar>
empty 
int1
Record 2
a&titlesome"text
junk  <foo>
+<bar>
empty 
int2
+ +\pset border 1 +execute q; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Record 1
a&titlesome"text
junk  <foo>
+<bar>
empty 
int1
Record 2
a&titlesome"text
junk  <foo>
+<bar>
empty 
int2
+ +\pset tableattr foobar +execute q; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Record 1
a&titlesome"text
junk  <foo>
+<bar>
empty 
int1
Record 2
a&titlesome"text
junk  <foo>
+<bar>
empty 
int2
+ +\pset tableattr +deallocate q; +-- test latex output format +\pset format latex +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +\begin{center} +Sequence "public.psql\_serial\_tab\_id\_seq" +\end{center} + +\begin{tabular}{l | r | r | r | r | l | r} +\textit{Type} & \textit{Start} & \textit{Minimum} & \textit{Maximum} & \textit{Increment} & \textit{Cycles?} & \textit{Cache} \\ +\hline +integer & 1 & 1 & 2147483647 & 1 & no & 1 \\ +\end{tabular} + +\noindent Owned by: public.psql\_serial\_tab.id \\ + +\pset tuples_only true +\df exp +\begin{tabular}{l | l | l | l | l} +pg\_catalog & exp & complex & complex & func \\ +pg\_catalog & exp & double precision & double precision & func \\ +pg\_catalog & exp & numeric & numeric & func \\ +\end{tabular} + +\noindent +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\begin{center} +Sequence "public.psql\_serial\_tab\_id\_seq" +\end{center} + +\begin{tabular}{c|l} +\multicolumn{2}{c}{\textit{Record 1}} \\ +\hline +Type & integer \\ +Start & 1 \\ +Minimum & 1 \\ +Maximum & 2147483647 \\ +Increment & 1 \\ +Cycles? & no \\ +Cache & 1 \\ +\end{tabular} + +\noindent Owned by: public.psql\_serial\_tab.id \\ + +\pset tuples_only true +\df exp +\begin{tabular}{c|l} +\hline +Schema & pg\_catalog \\ +Name & exp \\ +Result data type & complex \\ +Argument data types & complex \\ +Type & func \\ +\hline +Schema & pg\_catalog \\ +Name & exp \\ +Result data type & double precision \\ +Argument data types & double precision \\ +Type & func \\ +\hline +Schema & pg\_catalog \\ +Name & exp \\ +Result data type & numeric \\ +Argument data types & numeric \\ +Type & func \\ +\end{tabular} + +\noindent +\pset tuples_only false +prepare q as + select 'some\more_text' as "a$title", E' #%&^~|\n{bar}' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; +\pset expanded off +\pset border 0 +execute q; +\begin{tabular}{lllr} +\textit{a\$title} & \textit{junk} & \textit{empty} & \textit{int} \\ +\hline +some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 1 \\ +some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 2 \\ +\end{tabular} + +\noindent (2 rows) \\ + +\pset border 1 +execute q; +\begin{tabular}{l | l | l | r} +\textit{a\$title} & \textit{junk} & \textit{empty} & \textit{int} \\ +\hline +some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 1 \\ +some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 2 \\ +\end{tabular} + +\noindent (2 rows) \\ + +\pset border 2 +execute q; +\begin{tabular}{| l | l | l | r |} +\hline +\textit{a\$title} & \textit{junk} & \textit{empty} & \textit{int} \\ +\hline +some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 1 \\ +some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 2 \\ +\hline +\end{tabular} + +\noindent (2 rows) \\ + +\pset border 3 +execute q; +\begin{tabular}{| l | l | l | r |} +\hline +\textit{a\$title} & \textit{junk} & \textit{empty} & \textit{int} \\ +\hline +some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 1 \\ +\hline +some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 2 \\ +\hline +\end{tabular} + +\noindent (2 rows) \\ + +\pset expanded on +\pset border 0 +execute q; +\begin{tabular}{cl} +\multicolumn{2}{c}{\textit{Record 1}} \\ +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\multicolumn{2}{c}{\textit{Record 2}} \\ +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\end{tabular} + +\noindent +\pset border 1 +execute q; +\begin{tabular}{c|l} +\multicolumn{2}{c}{\textit{Record 1}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\multicolumn{2}{c}{\textit{Record 2}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\end{tabular} + +\noindent +\pset border 2 +execute q; +\begin{tabular}{|c|l|} +\hline +\multicolumn{2}{|c|}{\textit{Record 1}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\hline +\multicolumn{2}{|c|}{\textit{Record 2}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\hline +\end{tabular} + +\noindent +\pset border 3 +execute q; +\begin{tabular}{|c|l|} +\hline +\multicolumn{2}{|c|}{\textit{Record 1}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\hline +\multicolumn{2}{|c|}{\textit{Record 2}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\hline +\end{tabular} + +\noindent +deallocate q; +-- test latex-longtable output format +\pset format latex-longtable +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +\begin{longtable}{l | r | r | r | r | l | r} +\small\textbf{\textit{Type}} & \small\textbf{\textit{Start}} & \small\textbf{\textit{Minimum}} & \small\textbf{\textit{Maximum}} & \small\textbf{\textit{Increment}} & \small\textbf{\textit{Cycles?}} & \small\textbf{\textit{Cache}} \\ +\midrule +\endfirsthead +\small\textbf{\textit{Type}} & \small\textbf{\textit{Start}} & \small\textbf{\textit{Minimum}} & \small\textbf{\textit{Maximum}} & \small\textbf{\textit{Increment}} & \small\textbf{\textit{Cycles?}} & \small\textbf{\textit{Cache}} \\ +\midrule +\endhead +\caption[Sequence "public.psql\_serial\_tab\_id\_seq" (Continued)]{Sequence "public.psql\_serial\_tab\_id\_seq"} +\endfoot +\caption[Sequence "public.psql\_serial\_tab\_id\_seq"]{Sequence "public.psql\_serial\_tab\_id\_seq"} +\endlastfoot +\raggedright{integer} +& +\raggedright{1} +& +\raggedright{1} +& +\raggedright{2147483647} +& +\raggedright{1} +& +\raggedright{no} +& +\raggedright{1} \tabularnewline +\end{longtable} +\pset tuples_only true +\df exp +\begin{longtable}{l | l | l | l | l} +\raggedright{pg\_catalog} +& +\raggedright{exp} +& +\raggedright{complex} +& +\raggedright{complex} +& +\raggedright{func} \tabularnewline +\raggedright{pg\_catalog} +& +\raggedright{exp} +& +\raggedright{double precision} +& +\raggedright{double precision} +& +\raggedright{func} \tabularnewline +\raggedright{pg\_catalog} +& +\raggedright{exp} +& +\raggedright{numeric} +& +\raggedright{numeric} +& +\raggedright{func} \tabularnewline +\end{longtable} +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\begin{center} +Sequence "public.psql\_serial\_tab\_id\_seq" +\end{center} + +\begin{tabular}{c|l} +\multicolumn{2}{c}{\textit{Record 1}} \\ +\hline +Type & integer \\ +Start & 1 \\ +Minimum & 1 \\ +Maximum & 2147483647 \\ +Increment & 1 \\ +Cycles? & no \\ +Cache & 1 \\ +\end{tabular} + +\noindent Owned by: public.psql\_serial\_tab.id \\ + +\pset tuples_only true +\df exp +\begin{tabular}{c|l} +\hline +Schema & pg\_catalog \\ +Name & exp \\ +Result data type & complex \\ +Argument data types & complex \\ +Type & func \\ +\hline +Schema & pg\_catalog \\ +Name & exp \\ +Result data type & double precision \\ +Argument data types & double precision \\ +Type & func \\ +\hline +Schema & pg\_catalog \\ +Name & exp \\ +Result data type & numeric \\ +Argument data types & numeric \\ +Type & func \\ +\end{tabular} + +\noindent +\pset tuples_only false +prepare q as + select 'some\more_text' as "a$title", E' #%&^~|\n{bar}' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; +\pset expanded off +\pset border 0 +execute q; +\begin{longtable}{lllr} +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\midrule +\endfirsthead +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\midrule +\endhead +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{1} \tabularnewline +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{2} \tabularnewline +\end{longtable} +\pset border 1 +execute q; +\begin{longtable}{l | l | l | r} +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\midrule +\endfirsthead +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\midrule +\endhead +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{1} \tabularnewline +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{2} \tabularnewline +\end{longtable} +\pset border 2 +execute q; +\begin{longtable}{| l | l | l | r |} +\toprule +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\midrule +\endfirsthead +\toprule +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\midrule +\endhead +\bottomrule +\endfoot +\bottomrule +\endlastfoot +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{1} \tabularnewline +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{2} \tabularnewline +\end{longtable} +\pset border 3 +execute q; +\begin{longtable}{| l | l | l | r |} +\toprule +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\midrule +\endfirsthead +\toprule +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\endhead +\bottomrule +\endfoot +\bottomrule +\endlastfoot +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{1} \tabularnewline + \hline +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{2} \tabularnewline + \hline +\end{longtable} +\pset tableattr lr +execute q; +\begin{longtable}{| p{lr\textwidth} | p{lr\textwidth} | p{lr\textwidth} | r |} +\toprule +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\midrule +\endfirsthead +\toprule +\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ +\endhead +\bottomrule +\endfoot +\bottomrule +\endlastfoot +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{1} \tabularnewline + \hline +\raggedright{some\textbackslash{}more\_text} +& +\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} +& +\raggedright{ } +& +\raggedright{2} \tabularnewline + \hline +\end{longtable} +\pset tableattr +\pset expanded on +\pset border 0 +execute q; +\begin{tabular}{cl} +\multicolumn{2}{c}{\textit{Record 1}} \\ +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\multicolumn{2}{c}{\textit{Record 2}} \\ +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\end{tabular} + +\noindent +\pset border 1 +execute q; +\begin{tabular}{c|l} +\multicolumn{2}{c}{\textit{Record 1}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\multicolumn{2}{c}{\textit{Record 2}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\end{tabular} + +\noindent +\pset border 2 +execute q; +\begin{tabular}{|c|l|} +\hline +\multicolumn{2}{|c|}{\textit{Record 1}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\hline +\multicolumn{2}{|c|}{\textit{Record 2}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\hline +\end{tabular} + +\noindent +\pset border 3 +execute q; +\begin{tabular}{|c|l|} +\hline +\multicolumn{2}{|c|}{\textit{Record 1}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\hline +\multicolumn{2}{|c|}{\textit{Record 2}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\hline +\end{tabular} + +\noindent +\pset tableattr lr +execute q; +\begin{tabular}{|c|l|} +\hline +\multicolumn{2}{|c|}{\textit{Record 1}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 1 \\ +\hline +\multicolumn{2}{|c|}{\textit{Record 2}} \\ +\hline +a\$title & some\textbackslash{}more\_text \\ +junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ +empty & \\ +int & 2 \\ +\hline +\end{tabular} + +\noindent +\pset tableattr +deallocate q; +-- test troff-ms output format +\pset format troff-ms +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +.LP +.DS C +Sequence "public.psql_serial_tab_id_seq" +.DE +.LP +.TS +center; +l | r | r | r | r | l | r. +\fIType\fP \fIStart\fP \fIMinimum\fP \fIMaximum\fP \fIIncrement\fP \fICycles?\fP \fICache\fP +_ +integer 1 1 2147483647 1 no 1 +.TE +.DS L +Owned by: public.psql_serial_tab.id +.DE +\pset tuples_only true +\df exp +.LP +.TS +center; +l | l | l | l | l. +pg_catalog exp complex complex func +pg_catalog exp double precision double precision func +pg_catalog exp numeric numeric func +.TE +.DS L +.DE +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +.LP +.DS C +Sequence "public.psql_serial_tab_id_seq" +.DE +.LP +.TS +center; +c s. +\fIRecord 1\fP +_ +.T& +c | l. +Type integer +Start 1 +Minimum 1 +Maximum 2147483647 +Increment 1 +Cycles? no +Cache 1 +.TE +.DS L +Owned by: public.psql_serial_tab.id +.DE +\pset tuples_only true +\df exp +.LP +.TS +center; +c l; +_ +Schema pg_catalog +Name exp +Result data type complex +Argument data types complex +Type func +_ +Schema pg_catalog +Name exp +Result data type double precision +Argument data types double precision +Type func +_ +Schema pg_catalog +Name exp +Result data type numeric +Argument data types numeric +Type func +.TE +.DS L +.DE +\pset tuples_only false +prepare q as + select 'some\text' as "a\title", E' \n' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; +\pset expanded off +\pset border 0 +execute q; +.LP +.TS +center; +lllr. +\fIa\(rstitle\fP \fIjunk\fP \fIempty\fP \fIint\fP +_ +some\(rstext + 1 +some\(rstext + 2 +.TE +.DS L +(2 rows) +.DE +\pset border 1 +execute q; +.LP +.TS +center; +l | l | l | r. +\fIa\(rstitle\fP \fIjunk\fP \fIempty\fP \fIint\fP +_ +some\(rstext + 1 +some\(rstext + 2 +.TE +.DS L +(2 rows) +.DE +\pset border 2 +execute q; +.LP +.TS +center box; +l | l | l | r. +\fIa\(rstitle\fP \fIjunk\fP \fIempty\fP \fIint\fP +_ +some\(rstext + 1 +some\(rstext + 2 +.TE +.DS L +(2 rows) +.DE +\pset expanded on +\pset border 0 +execute q; +.LP +.TS +center; +c s. +\fIRecord 1\fP +.T& +c l. +a\(rstitle some\(rstext +junk + +empty +int 1 +.T& +c s. +\fIRecord 2\fP +.T& +c l. +a\(rstitle some\(rstext +junk + +empty +int 2 +.TE +.DS L +.DE +\pset border 1 +execute q; +.LP +.TS +center; +c s. +\fIRecord 1\fP +_ +.T& +c | l. +a\(rstitle some\(rstext +junk + +empty +int 1 +.T& +c s. +\fIRecord 2\fP +_ +.T& +c | l. +a\(rstitle some\(rstext +junk + +empty +int 2 +.TE +.DS L +.DE +\pset border 2 +execute q; +.LP +.TS +center box; +c s. +\fIRecord 1\fP +_ +.T& +c l. +a\(rstitle some\(rstext +junk + +empty +int 1 +_ +.T& +c s. +\fIRecord 2\fP +_ +.T& +c l. +a\(rstitle some\(rstext +junk + +empty +int 2 +.TE +.DS L +.DE +deallocate q; +-- check ambiguous format requests +\pset format a +\pset: ambiguous abbreviation "a" matches both "aligned" and "asciidoc" +\pset format l +-- clean up after output format tests +drop table psql_serial_tab; +\pset format aligned +\pset expanded off +\pset border 1 +-- \echo and allied features +\echo this is a test +this is a test +\echo -n without newline +without newline\echo with -n newline +with -n newline +\echo '-n' with newline +-n with newline +\set foo bar +\echo foo = :foo +foo = bar +\qecho this is a test +this is a test +\qecho foo = :foo +foo = bar +\warn this is a test +this is a test +\warn foo = :foo +foo = bar +-- tests for \if ... \endif +\if true + select 'okay'; + ?column? +---------- + okay +(1 row) + + select 'still okay'; + ?column? +------------ + still okay +(1 row) + +\else + not okay; + still not okay +\endif +-- at this point query buffer should still have last valid line +\g + ?column? +------------ + still okay +(1 row) + +-- \if should work okay on part of a query +select + \if true + 42 + \else + (bogus + \endif + forty_two; + forty_two +----------- + 42 +(1 row) + +select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; + forty_two +----------- + 42 +(1 row) + +-- test a large nested if using a variety of true-equivalents +\if true + \if 1 + \if yes + \if on + \echo 'all true' +all true + \else + \echo 'should not print #1-1' + \endif + \else + \echo 'should not print #1-2' + \endif + \else + \echo 'should not print #1-3' + \endif +\else + \echo 'should not print #1-4' +\endif +-- test a variety of false-equivalents in an if/elif/else structure +\if false + \echo 'should not print #2-1' +\elif 0 + \echo 'should not print #2-2' +\elif no + \echo 'should not print #2-3' +\elif off + \echo 'should not print #2-4' +\else + \echo 'all false' +all false +\endif +-- test true-false elif after initial true branch +\if true + \echo 'should print #2-5' +should print #2-5 +\elif true + \echo 'should not print #2-6' +\elif false + \echo 'should not print #2-7' +\else + \echo 'should not print #2-8' +\endif +-- test simple true-then-else +\if true + \echo 'first thing true' +first thing true +\else + \echo 'should not print #3-1' +\endif +-- test simple false-true-else +\if false + \echo 'should not print #4-1' +\elif true + \echo 'second thing true' +second thing true +\else + \echo 'should not print #5-1' +\endif +-- invalid boolean expressions are false +\if invalid boolean expression +unrecognized value "invalid boolean expression" for "\if expression": Boolean expected + \echo 'will not print #6-1' +\else + \echo 'will print anyway #6-2' +will print anyway #6-2 +\endif +-- test un-matched endif +\endif +\endif: no matching \if +-- test un-matched else +\else +\else: no matching \if +-- test un-matched elif +\elif +\elif: no matching \if +-- test double-else error +\if true +\else +\else +\else: cannot occur after \else +\endif +-- test elif out-of-order +\if false +\else +\elif +\elif: cannot occur after \else +\endif +-- test if-endif matching in a false branch +\if false + \if false + \echo 'should not print #7-1' + \else + \echo 'should not print #7-2' + \endif + \echo 'should not print #7-3' +\else + \echo 'should print #7-4' +should print #7-4 +\endif +-- show that vars and backticks are not expanded when ignoring extra args +\set foo bar +\echo :foo :'foo' :"foo" +bar 'bar' "bar" +\pset fieldsep | `nosuchcommand` :foo :'foo' :"foo" +\pset: extra argument "nosuchcommand" ignored +\pset: extra argument ":foo" ignored +\pset: extra argument ":'foo'" ignored +\pset: extra argument ":"foo"" ignored +-- show that vars and backticks are not expanded and commands are ignored +-- when in a false if-branch +\set try_to_quit '\\q' +\if false + :try_to_quit + \echo `nosuchcommand` :foo :'foo' :"foo" + \pset fieldsep | `nosuchcommand` :foo :'foo' :"foo" + \a + \C arg1 + \c arg1 arg2 arg3 arg4 + \cd arg1 + \conninfo + \copy arg1 arg2 arg3 arg4 arg5 arg6 + \copyright + SELECT 1 as one, 2, 3 \crosstabview + \dt arg1 + \e arg1 arg2 + \ef whole_line + \ev whole_line + \echo arg1 arg2 arg3 arg4 arg5 + \echo arg1 + \encoding arg1 + \errverbose + \f arg1 + \g arg1 + \gx arg1 + \gexec + SELECT 1 AS one \gset + \h + \? + \html + \i arg1 + \ir arg1 + \l arg1 + \lo arg1 arg2 +invalid command \lo + \lo_list + \o arg1 + \p + \password arg1 + \prompt arg1 arg2 + \pset arg1 arg2 + \q + \reset + \s arg1 + \set arg1 arg2 arg3 arg4 arg5 arg6 arg7 + \setenv arg1 arg2 + \sf whole_line + \sv whole_line + \t arg1 + \T arg1 + \timing arg1 + \unset arg1 + \w arg1 + \watch arg1 + \x arg1 + -- \else here is eaten as part of OT_FILEPIPE argument + \w |/no/such/file \else + -- \endif here is eaten as part of whole-line argument + \! whole_line \endif + \z +\else + \echo 'should print #8-1' +should print #8-1 +\endif +-- :{?...} defined variable test +\set i 1 +\if :{?i} + \echo '#9-1 ok, variable i is defined' +#9-1 ok, variable i is defined +\else + \echo 'should not print #9-2' +\endif +\if :{?no_such_variable} + \echo 'should not print #10-1' +\else + \echo '#10-2 ok, variable no_such_variable is not defined' +#10-2 ok, variable no_such_variable is not defined +\endif +SELECT :{?i} AS i_is_defined; + i_is_defined +-------------- + t +(1 row) + +SELECT NOT :{?no_such_var} AS no_such_var_is_not_defined; + no_such_var_is_not_defined +---------------------------- + t +(1 row) + +-- SHOW_CONTEXT +\set SHOW_CONTEXT never +do $$ +begin + raise notice 'foo'; + raise exception 'bar'; +end $$; +NOTICE: foo +ERROR: bar +\set SHOW_CONTEXT errors +do $$ +begin + raise notice 'foo'; + raise exception 'bar'; +end $$; +NOTICE: foo +ERROR: bar +CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE +\set SHOW_CONTEXT always +do $$ +begin + raise notice 'foo'; + raise exception 'bar'; +end $$; +NOTICE: foo +CONTEXT: PL/pgSQL function inline_code_block line 3 at RAISE +ERROR: bar +CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE +-- test printing and clearing the query buffer +SELECT 1; + ?column? +---------- + 1 +(1 row) + +\p +SELECT 1; +SELECT 2 \r +\p +SELECT 1; +SELECT 3 \p +SELECT 3 +UNION SELECT 4 \p +SELECT 3 +UNION SELECT 4 +UNION SELECT 5 +ORDER BY 1; + ?column? +---------- + 3 + 4 + 5 +(3 rows) + +\r +\p +SELECT 3 +UNION SELECT 4 +UNION SELECT 5 +ORDER BY 1; +-- tests for special result variables +-- working query, 2 rows selected +SELECT 1 AS stuff UNION SELECT 2; + stuff +------- + 1 + 2 +(2 rows) + +\echo 'error:' :ERROR +error: false +\echo 'error code:' :SQLSTATE +error code: 00000 +\echo 'number of rows:' :ROW_COUNT +number of rows: 2 +-- syntax error +SELECT 1 UNION; +ERROR: syntax error at or near ";" +LINE 1: SELECT 1 UNION; + ^ +\echo 'error:' :ERROR +error: true +\echo 'error code:' :SQLSTATE +error code: 42601 +\echo 'number of rows:' :ROW_COUNT +number of rows: 0 +\echo 'last error message:' :LAST_ERROR_MESSAGE +last error message: syntax error at or near ";" +\echo 'last error code:' :LAST_ERROR_SQLSTATE +last error code: 42601 +-- empty query +; +\echo 'error:' :ERROR +error: false +\echo 'error code:' :SQLSTATE +error code: 00000 +\echo 'number of rows:' :ROW_COUNT +number of rows: 0 +-- must have kept previous values +\echo 'last error message:' :LAST_ERROR_MESSAGE +last error message: syntax error at or near ";" +\echo 'last error code:' :LAST_ERROR_SQLSTATE +last error code: 42601 +-- other query error +DROP TABLE this_table_does_not_exist; +ERROR: table "this_table_does_not_exist" does not exist +\echo 'error:' :ERROR +error: true +\echo 'error code:' :SQLSTATE +error code: 42P01 +\echo 'number of rows:' :ROW_COUNT +number of rows: 0 +\echo 'last error message:' :LAST_ERROR_MESSAGE +last error message: table "this_table_does_not_exist" does not exist +\echo 'last error code:' :LAST_ERROR_SQLSTATE +last error code: 42P01 +-- nondefault verbosity error settings (except verbose, which is too unstable) +\set VERBOSITY terse +SELECT 1 UNION; +ERROR: syntax error at or near ";" at character 15 +\echo 'error:' :ERROR +error: true +\echo 'error code:' :SQLSTATE +error code: 42601 +\echo 'last error message:' :LAST_ERROR_MESSAGE +last error message: syntax error at or near ";" +\set VERBOSITY sqlstate +SELECT 1/0; +ERROR: 22012 +\echo 'error:' :ERROR +error: true +\echo 'error code:' :SQLSTATE +error code: 22012 +\echo 'last error message:' :LAST_ERROR_MESSAGE +last error message: division by zero +\set VERBOSITY default +-- working \gdesc +SELECT 3 AS three, 4 AS four \gdesc + Column | Type +--------+--------- + three | integer + four | integer +(2 rows) + +\echo 'error:' :ERROR +error: false +\echo 'error code:' :SQLSTATE +error code: 00000 +\echo 'number of rows:' :ROW_COUNT +number of rows: 2 +-- \gdesc with an error +SELECT 4 AS \gdesc +ERROR: syntax error at end of input +LINE 1: SELECT 4 AS + ^ +\echo 'error:' :ERROR +error: true +\echo 'error code:' :SQLSTATE +error code: 42601 +\echo 'number of rows:' :ROW_COUNT +number of rows: 0 +\echo 'last error message:' :LAST_ERROR_MESSAGE +last error message: syntax error at end of input +\echo 'last error code:' :LAST_ERROR_SQLSTATE +last error code: 42601 +-- check row count for a cursor-fetched query +\set FETCH_COUNT 10 +select unique2 from tenk1 order by unique2 limit 19; + unique2 +--------- + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 +(19 rows) + +\echo 'error:' :ERROR +error: false +\echo 'error code:' :SQLSTATE +error code: 00000 +\echo 'number of rows:' :ROW_COUNT +number of rows: 19 +-- cursor-fetched query with an error after the first group. In GPDB, the +-- query used in PostgreSQL errors out too early in the segments. Use a +-- different query that behaves the way this is intended. +--select 1/(15-unique2) from tenk1 order by unique2 limit 19; +select 1/(15-g) from generate_series(1, 1000000) g; + ?column? +---------- + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +ERROR: division by zero +\echo 'error:' :ERROR +error: true +\echo 'error code:' :SQLSTATE +error code: 22012 +\echo 'number of rows:' :ROW_COUNT +number of rows: 0 +\echo 'last error message:' :LAST_ERROR_MESSAGE +last error message: division by zero +\echo 'last error code:' :LAST_ERROR_SQLSTATE +last error code: 22012 +\unset FETCH_COUNT +create schema testpart; +create role regress_partitioning_role; +alter schema testpart owner to regress_partitioning_role; +set role to regress_partitioning_role; +-- run test inside own schema and hide other partitions +set search_path to testpart; +create table testtable_apple(logdate date); +create table testtable_orange(logdate date); +create index testtable_apple_index on testtable_apple(logdate); +create index testtable_orange_index on testtable_orange(logdate); +create table testpart_apple(logdate date) partition by range(logdate); +create table testpart_orange(logdate date) partition by range(logdate); +create index testpart_apple_index on testpart_apple(logdate); +create index testpart_orange_index on testpart_orange(logdate); +-- only partition related object should be displayed +\dP test*apple* + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +----------+----------------------+---------------------------+-------------------+-------------+---------------- + testpart | testpart_apple | regress_partitioning_role | partitioned table | | + testpart | testpart_apple_index | regress_partitioning_role | partitioned index | | testpart_apple +(2 rows) + +\dPt test*apple* + List of partitioned tables + Schema | Name | Owner | Parent name +----------+----------------+---------------------------+------------- + testpart | testpart_apple | regress_partitioning_role | +(1 row) + +\dPi test*apple* + List of partitioned indexes + Schema | Name | Owner | Parent name | Table +----------+----------------------+---------------------------+-------------+---------------- + testpart | testpart_apple_index | regress_partitioning_role | | testpart_apple +(1 row) + +drop table testtable_apple; +drop table testtable_orange; +drop table testpart_apple; +drop table testpart_orange; +create table parent_tab (id int) partition by range (id); +create index parent_index on parent_tab (id); +create table child_0_10 partition of parent_tab + for values from (0) to (10); +create table child_10_20 partition of parent_tab + for values from (10) to (20); +create table child_20_30 partition of parent_tab + for values from (20) to (30); +insert into parent_tab values (generate_series(0,29)); +create table child_30_40 partition of parent_tab +for values from (30) to (40) + partition by range(id); +create table child_30_35 partition of child_30_40 + for values from (30) to (35); +create table child_35_40 partition of child_30_40 + for values from (35) to (40); +insert into parent_tab values (generate_series(30,39)); +\dPt + List of partitioned tables + Schema | Name | Owner +----------+------------+--------------------------- + testpart | parent_tab | regress_partitioning_role +(1 row) + +\dPi + List of partitioned indexes + Schema | Name | Owner | Table +----------+--------------+---------------------------+------------ + testpart | parent_index | regress_partitioning_role | parent_tab +(1 row) + +\dP testpart.* + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +----------+--------------------+---------------------------+-------------------+--------------+------------- + testpart | parent_tab | regress_partitioning_role | partitioned table | | + testpart | child_30_40 | regress_partitioning_role | partitioned table | parent_tab | + testpart | parent_index | regress_partitioning_role | partitioned index | | parent_tab + testpart | child_30_40_id_idx | regress_partitioning_role | partitioned index | parent_index | child_30_40 +(4 rows) + +\dP + List of partitioned relations + Schema | Name | Owner | Type | Table +----------+--------------+---------------------------+-------------------+------------ + testpart | parent_tab | regress_partitioning_role | partitioned table | + testpart | parent_index | regress_partitioning_role | partitioned index | parent_tab +(2 rows) + +\dPtn + List of partitioned tables + Schema | Name | Owner | Parent name +----------+-------------+---------------------------+------------- + testpart | parent_tab | regress_partitioning_role | + testpart | child_30_40 | regress_partitioning_role | parent_tab +(2 rows) + +\dPin + List of partitioned indexes + Schema | Name | Owner | Parent name | Table +----------+--------------------+---------------------------+--------------+------------- + testpart | parent_index | regress_partitioning_role | | parent_tab + testpart | child_30_40_id_idx | regress_partitioning_role | parent_index | child_30_40 +(2 rows) + +\dPn + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +----------+--------------------+---------------------------+-------------------+--------------+------------- + testpart | parent_tab | regress_partitioning_role | partitioned table | | + testpart | child_30_40 | regress_partitioning_role | partitioned table | parent_tab | + testpart | parent_index | regress_partitioning_role | partitioned index | | parent_tab + testpart | child_30_40_id_idx | regress_partitioning_role | partitioned index | parent_index | child_30_40 +(4 rows) + +\dPn testpart.* + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +----------+--------------------+---------------------------+-------------------+--------------+------------- + testpart | parent_tab | regress_partitioning_role | partitioned table | | + testpart | child_30_40 | regress_partitioning_role | partitioned table | parent_tab | + testpart | parent_index | regress_partitioning_role | partitioned index | | parent_tab + testpart | child_30_40_id_idx | regress_partitioning_role | partitioned index | parent_index | child_30_40 +(4 rows) + +drop table parent_tab cascade; +drop schema testpart; +set search_path to default; +set role to default; +drop role regress_partitioning_role; +-- \d on toast table (use pg_statistic's toast table, which has a known name) +\d pg_toast.pg_toast_2619 +TOAST table "pg_toast.pg_toast_2619" + Column | Type +------------+--------- + chunk_id | oid + chunk_seq | integer + chunk_data | bytea +Owning table: "pg_catalog.pg_statistic" +Indexes: + "pg_toast_2619_index" PRIMARY KEY, btree (chunk_id, chunk_seq) + +-- check printing info about access methods +\dA +List of access methods + Name | Type +-----------+------- + ao_column | Table + ao_row | Table + bitmap | Index + brin | Index + btree | Index + gin | Index + gist | Index + hash | Index + heap | Table + heap2 | Table + spgist | Index +(11 rows) + +\dA * +List of access methods + Name | Type +-----------+------- + ao_column | Table + ao_row | Table + bitmap | Index + brin | Index + btree | Index + gin | Index + gist | Index + hash | Index + heap | Table + heap2 | Table + spgist | Index +(11 rows) + +\dA h* +List of access methods + Name | Type +-------+------- + hash | Index + heap | Table + heap2 | Table +(3 rows) + +\dA foo +List of access methods + Name | Type +------+------ +(0 rows) + +\dA foo bar +List of access methods + Name | Type +------+------ +(0 rows) + +\dA: extra argument "bar" ignored +\dA+ + List of access methods + Name | Type | Handler | Description +-----------+-------+---------------------------+------------------------------------------------------ + ao_column | Table | ao_column_tableam_handler | column-oriented append-optimized table access method + ao_row | Table | ao_row_tableam_handler | row-oriented append-optimized table access method + bitmap | Index | bmhandler | bitmap index access method + brin | Index | brinhandler | block range index (BRIN) access method + btree | Index | bthandler | b-tree index access method + gin | Index | ginhandler | GIN index access method + gist | Index | gisthandler | GiST index access method + hash | Index | hashhandler | hash index access method + heap | Table | heap_tableam_handler | heap table access method + heap2 | Table | heap_tableam_handler | + spgist | Index | spghandler | SP-GiST index access method +(11 rows) + +\dA+ * + List of access methods + Name | Type | Handler | Description +-----------+-------+---------------------------+------------------------------------------------------ + ao_column | Table | ao_column_tableam_handler | column-oriented append-optimized table access method + ao_row | Table | ao_row_tableam_handler | row-oriented append-optimized table access method + bitmap | Index | bmhandler | bitmap index access method + brin | Index | brinhandler | block range index (BRIN) access method + btree | Index | bthandler | b-tree index access method + gin | Index | ginhandler | GIN index access method + gist | Index | gisthandler | GiST index access method + hash | Index | hashhandler | hash index access method + heap | Table | heap_tableam_handler | heap table access method + heap2 | Table | heap_tableam_handler | + spgist | Index | spghandler | SP-GiST index access method +(11 rows) + +\dA+ h* + List of access methods + Name | Type | Handler | Description +-------+-------+----------------------+-------------------------- + hash | Index | hashhandler | hash index access method + heap | Table | heap_tableam_handler | heap table access method + heap2 | Table | heap_tableam_handler | +(3 rows) + +\dA+ foo + List of access methods + Name | Type | Handler | Description +------+------+---------+------------- +(0 rows) + +\dAc brin pg*.oid* + List of operator classes + AM | Input type | Storage type | Operator class | Default? +------+------------+--------------+----------------------+---------- + brin | oid | | oid_bloom_ops | no + brin | oid | | oid_minmax_multi_ops | no + brin | oid | | oid_minmax_ops | yes +(3 rows) + +\dAf spgist + List of operator families + AM | Operator family | Applicable types +--------+-----------------+------------------ + spgist | box_ops | box + spgist | kd_point_ops | point + spgist | network_ops | inet + spgist | poly_ops | polygon + spgist | quad_point_ops | point + spgist | range_ops | anyrange + spgist | text_ops | text +(7 rows) + +\dAf btree int4 + List of operator families + AM | Operator family | Applicable types +-------+-----------------+--------------------------- + btree | integer_ops | smallint, integer, bigint +(1 row) + +\dAo+ btree float_ops + List of operators of operator families + AM | Operator family | Operator | Strategy | Purpose | Sort opfamily +-------+-----------------+---------------------------------------+----------+---------+--------------- + btree | float_ops | <(double precision,double precision) | 1 | search | + btree | float_ops | <=(double precision,double precision) | 2 | search | + btree | float_ops | =(double precision,double precision) | 3 | search | + btree | float_ops | >=(double precision,double precision) | 4 | search | + btree | float_ops | >(double precision,double precision) | 5 | search | + btree | float_ops | <(real,real) | 1 | search | + btree | float_ops | <=(real,real) | 2 | search | + btree | float_ops | =(real,real) | 3 | search | + btree | float_ops | >=(real,real) | 4 | search | + btree | float_ops | >(real,real) | 5 | search | + btree | float_ops | <(double precision,real) | 1 | search | + btree | float_ops | <=(double precision,real) | 2 | search | + btree | float_ops | =(double precision,real) | 3 | search | + btree | float_ops | >=(double precision,real) | 4 | search | + btree | float_ops | >(double precision,real) | 5 | search | + btree | float_ops | <(real,double precision) | 1 | search | + btree | float_ops | <=(real,double precision) | 2 | search | + btree | float_ops | =(real,double precision) | 3 | search | + btree | float_ops | >=(real,double precision) | 4 | search | + btree | float_ops | >(real,double precision) | 5 | search | +(20 rows) + +\dAo * pg_catalog.jsonb_path_ops + List of operators of operator families + AM | Operator family | Operator | Strategy | Purpose +-----+-----------------+--------------------+----------+--------- + gin | jsonb_path_ops | @>(jsonb,jsonb) | 7 | search + gin | jsonb_path_ops | @?(jsonb,jsonpath) | 15 | search + gin | jsonb_path_ops | @@(jsonb,jsonpath) | 16 | search +(3 rows) + +\dAp+ btree float_ops + List of support functions of operator families + AM | Operator family | Registered left type | Registered right type | Number | Function +-------+-----------------+----------------------+-----------------------+--------+------------------------------------------------------------------------------ + btree | float_ops | double precision | double precision | 1 | btfloat8cmp(double precision,double precision) + btree | float_ops | double precision | double precision | 2 | btfloat8sortsupport(internal) + btree | float_ops | double precision | double precision | 3 | in_range(double precision,double precision,double precision,boolean,boolean) + btree | float_ops | real | real | 1 | btfloat4cmp(real,real) + btree | float_ops | real | real | 2 | btfloat4sortsupport(internal) + btree | float_ops | double precision | real | 1 | btfloat84cmp(double precision,real) + btree | float_ops | real | double precision | 1 | btfloat48cmp(real,double precision) + btree | float_ops | real | double precision | 3 | in_range(real,real,double precision,boolean,boolean) +(8 rows) + +\dAp * pg_catalog.uuid_ops + List of support functions of operator families + AM | Operator family | Registered left type | Registered right type | Number | Function +--------+-----------------+----------------------+-----------------------+--------+-------------------- + bitmap | uuid_ops | uuid | uuid | 1 | uuid_cmp + bitmap | uuid_ops | uuid | uuid | 2 | uuid_sortsupport + bitmap | uuid_ops | uuid | uuid | 4 | btequalimage + btree | uuid_ops | uuid | uuid | 1 | uuid_cmp + btree | uuid_ops | uuid | uuid | 2 | uuid_sortsupport + btree | uuid_ops | uuid | uuid | 4 | btequalimage + hash | uuid_ops | uuid | uuid | 1 | uuid_hash + hash | uuid_ops | uuid | uuid | 2 | uuid_hash_extended +(8 rows) + +-- check \df, \do with argument specifications +\df *sqrt + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+--------------+------------------+---------------------+------ + pg_catalog | complex_sqrt | complex | complex | func + pg_catalog | dsqrt | double precision | double precision | func + pg_catalog | numeric_sqrt | numeric | numeric | func + pg_catalog | sqrt | complex | complex | func + pg_catalog | sqrt | double precision | double precision | func + pg_catalog | sqrt | numeric | numeric | func +(6 rows) + +\df *sqrt num* + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+--------------+------------------+---------------------+------ + pg_catalog | numeric_sqrt | numeric | numeric | func + pg_catalog | sqrt | numeric | numeric | func +(2 rows) + +\df int*pl + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+-------------+------------------+---------------------+------ + pg_catalog | int24pl | integer | smallint, integer | func + pg_catalog | int28pl | bigint | smallint, bigint | func + pg_catalog | int2pl | smallint | smallint, smallint | func + pg_catalog | int42pl | integer | integer, smallint | func + pg_catalog | int48pl | bigint | integer, bigint | func + pg_catalog | int4pl | integer | integer, integer | func + pg_catalog | int82pl | bigint | bigint, smallint | func + pg_catalog | int84pl | bigint | bigint, integer | func + pg_catalog | int8pl | bigint | bigint, bigint | func + pg_catalog | interval_pl | interval | interval, interval | func +(10 rows) + +\df int*pl int4 + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+---------+------------------+---------------------+------ + pg_catalog | int42pl | integer | integer, smallint | func + pg_catalog | int48pl | bigint | integer, bigint | func + pg_catalog | int4pl | integer | integer, integer | func +(3 rows) + +\df int*pl * pg_catalog.int8 + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+---------+------------------+---------------------+------ + pg_catalog | int28pl | bigint | smallint, bigint | func + pg_catalog | int48pl | bigint | integer, bigint | func + pg_catalog | int8pl | bigint | bigint, bigint | func +(3 rows) + +\df acl* aclitem[] + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+-------------+------------------+----------------------------------------------------------------------------------------------------+------ + pg_catalog | aclcontains | boolean | aclitem[], aclitem | func + pg_catalog | aclexplode | SETOF record | acl aclitem[], OUT grantor oid, OUT grantee oid, OUT privilege_type text, OUT is_grantable boolean | func + pg_catalog | aclinsert | aclitem[] | aclitem[], aclitem | func + pg_catalog | aclremove | aclitem[] | aclitem[], aclitem | func +(4 rows) + +\df has_database_privilege oid text + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+------------------------+------------------+---------------------+------ + pg_catalog | has_database_privilege | boolean | oid, text | func + pg_catalog | has_database_privilege | boolean | oid, text, text | func +(2 rows) + +\df has_database_privilege oid text - + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+------------------------+------------------+---------------------+------ + pg_catalog | has_database_privilege | boolean | oid, text | func +(1 row) + +\dfa bit* small* + List of functions + Schema | Name | Result data type | Argument data types | Type +------------+---------+------------------+---------------------+------ + pg_catalog | bit_and | smallint | smallint | agg + pg_catalog | bit_or | smallint | smallint | agg + pg_catalog | bit_xor | smallint | smallint | agg +(3 rows) + +\do - pg_catalog.int4 + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +------------+------+---------------+----------------+-------------+------------- + pg_catalog | - | | integer | integer | negate +(1 row) + +\do && anyarray * + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +------------+------+---------------+----------------+-------------+------------- + pg_catalog | && | anyarray | anyarray | boolean | overlaps +(1 row) + +-- check describing invalid multipart names +\dA regression.heap +improper qualified name (too many dotted names): regression.heap +\dA nonesuch.heap +improper qualified name (too many dotted names): nonesuch.heap +\dt host.regression.pg_catalog.pg_class +improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class +\dt |.pg_catalog.pg_class +cross-database references are not implemented: |.pg_catalog.pg_class +\dt nonesuch.pg_catalog.pg_class +cross-database references are not implemented: nonesuch.pg_catalog.pg_class +\da host.regression.pg_catalog.sum +improper qualified name (too many dotted names): host.regression.pg_catalog.sum +\da +.pg_catalog.sum +cross-database references are not implemented: +.pg_catalog.sum +\da nonesuch.pg_catalog.sum +cross-database references are not implemented: nonesuch.pg_catalog.sum +\dAc nonesuch.brin +improper qualified name (too many dotted names): nonesuch.brin +\dAc regression.brin +improper qualified name (too many dotted names): regression.brin +\dAf nonesuch.brin +improper qualified name (too many dotted names): nonesuch.brin +\dAf regression.brin +improper qualified name (too many dotted names): regression.brin +\dAo nonesuch.brin +improper qualified name (too many dotted names): nonesuch.brin +\dAo regression.brin +improper qualified name (too many dotted names): regression.brin +\dAp nonesuch.brin +improper qualified name (too many dotted names): nonesuch.brin +\dAp regression.brin +improper qualified name (too many dotted names): regression.brin +\db nonesuch.pg_default +improper qualified name (too many dotted names): nonesuch.pg_default +\db regression.pg_default +improper qualified name (too many dotted names): regression.pg_default +\dc host.regression.public.conversion +improper qualified name (too many dotted names): host.regression.public.conversion +\dc (.public.conversion +cross-database references are not implemented: (.public.conversion +\dc nonesuch.public.conversion +cross-database references are not implemented: nonesuch.public.conversion +\dC host.regression.pg_catalog.int8 +improper qualified name (too many dotted names): host.regression.pg_catalog.int8 +\dC ).pg_catalog.int8 +cross-database references are not implemented: ).pg_catalog.int8 +\dC nonesuch.pg_catalog.int8 +cross-database references are not implemented: nonesuch.pg_catalog.int8 +\dd host.regression.pg_catalog.pg_class +improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class +\dd [.pg_catalog.pg_class +cross-database references are not implemented: [.pg_catalog.pg_class +\dd nonesuch.pg_catalog.pg_class +cross-database references are not implemented: nonesuch.pg_catalog.pg_class +\dD host.regression.public.gtestdomain1 +improper qualified name (too many dotted names): host.regression.public.gtestdomain1 +\dD ].public.gtestdomain1 +cross-database references are not implemented: ].public.gtestdomain1 +\dD nonesuch.public.gtestdomain1 +cross-database references are not implemented: nonesuch.public.gtestdomain1 +\ddp host.regression.pg_catalog.pg_class +improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class +\ddp {.pg_catalog.pg_class +cross-database references are not implemented: {.pg_catalog.pg_class +\ddp nonesuch.pg_catalog.pg_class +cross-database references are not implemented: nonesuch.pg_catalog.pg_class +\dE host.regression.public.ft +improper qualified name (too many dotted names): host.regression.public.ft +\dE }.public.ft +cross-database references are not implemented: }.public.ft +\dE nonesuch.public.ft +cross-database references are not implemented: nonesuch.public.ft +\di host.regression.public.tenk1_hundred +improper qualified name (too many dotted names): host.regression.public.tenk1_hundred +\di ..public.tenk1_hundred +improper qualified name (too many dotted names): ..public.tenk1_hundred +\di nonesuch.public.tenk1_hundred +cross-database references are not implemented: nonesuch.public.tenk1_hundred +\dm host.regression.public.mvtest_bb +improper qualified name (too many dotted names): host.regression.public.mvtest_bb +\dm ^.public.mvtest_bb +cross-database references are not implemented: ^.public.mvtest_bb +\dm nonesuch.public.mvtest_bb +cross-database references are not implemented: nonesuch.public.mvtest_bb +\ds host.regression.public.check_seq +improper qualified name (too many dotted names): host.regression.public.check_seq +\ds regression|mydb.public.check_seq +cross-database references are not implemented: regression|mydb.public.check_seq +\ds nonesuch.public.check_seq +cross-database references are not implemented: nonesuch.public.check_seq +\dt host.regression.public.b_star +improper qualified name (too many dotted names): host.regression.public.b_star +\dt regres+ion.public.b_star +cross-database references are not implemented: regres+ion.public.b_star +\dt nonesuch.public.b_star +cross-database references are not implemented: nonesuch.public.b_star +\dv host.regression.public.shoe +improper qualified name (too many dotted names): host.regression.public.shoe +\dv regress(ion).public.shoe +cross-database references are not implemented: regress(ion).public.shoe +\dv nonesuch.public.shoe +cross-database references are not implemented: nonesuch.public.shoe +\des nonesuch.server +improper qualified name (too many dotted names): nonesuch.server +\des regression.server +improper qualified name (too many dotted names): regression.server +\des nonesuch.server +improper qualified name (too many dotted names): nonesuch.server +\des regression.server +improper qualified name (too many dotted names): regression.server +\des nonesuch.username +improper qualified name (too many dotted names): nonesuch.username +\des regression.username +improper qualified name (too many dotted names): regression.username +\dew nonesuch.fdw +improper qualified name (too many dotted names): nonesuch.fdw +\dew regression.fdw +improper qualified name (too many dotted names): regression.fdw +\df host.regression.public.namelen +improper qualified name (too many dotted names): host.regression.public.namelen +\df regres[qrstuv]ion.public.namelen +cross-database references are not implemented: regres[qrstuv]ion.public.namelen +\df nonesuch.public.namelen +cross-database references are not implemented: nonesuch.public.namelen +\dF host.regression.pg_catalog.arabic +improper qualified name (too many dotted names): host.regression.pg_catalog.arabic +\dF regres{1,2}ion.pg_catalog.arabic +cross-database references are not implemented: regres{1,2}ion.pg_catalog.arabic +\dF nonesuch.pg_catalog.arabic +cross-database references are not implemented: nonesuch.pg_catalog.arabic +\dFd host.regression.pg_catalog.arabic_stem +improper qualified name (too many dotted names): host.regression.pg_catalog.arabic_stem +\dFd regres?ion.pg_catalog.arabic_stem +cross-database references are not implemented: regres?ion.pg_catalog.arabic_stem +\dFd nonesuch.pg_catalog.arabic_stem +cross-database references are not implemented: nonesuch.pg_catalog.arabic_stem +\dFp host.regression.pg_catalog.default +improper qualified name (too many dotted names): host.regression.pg_catalog.default +\dFp ^regression.pg_catalog.default +cross-database references are not implemented: ^regression.pg_catalog.default +\dFp nonesuch.pg_catalog.default +cross-database references are not implemented: nonesuch.pg_catalog.default +\dFt host.regression.pg_catalog.ispell +improper qualified name (too many dotted names): host.regression.pg_catalog.ispell +\dFt regression$.pg_catalog.ispell +cross-database references are not implemented: regression$.pg_catalog.ispell +\dFt nonesuch.pg_catalog.ispell +cross-database references are not implemented: nonesuch.pg_catalog.ispell +\dg nonesuch.pg_database_owner +improper qualified name (too many dotted names): nonesuch.pg_database_owner +\dg regression.pg_database_owner +improper qualified name (too many dotted names): regression.pg_database_owner +\dL host.regression.plpgsql +improper qualified name (too many dotted names): host.regression.plpgsql +\dL *.plpgsql +cross-database references are not implemented: *.plpgsql +\dL nonesuch.plpgsql +cross-database references are not implemented: nonesuch.plpgsql +\dn host.regression.public +improper qualified name (too many dotted names): host.regression.public +\dn """".public +cross-database references are not implemented: """".public +\dn nonesuch.public +cross-database references are not implemented: nonesuch.public +\do host.regression.public.!=- +improper qualified name (too many dotted names): host.regression.public.!=- +\do "regression|mydb".public.!=- +cross-database references are not implemented: "regression|mydb".public.!=- +\do nonesuch.public.!=- +cross-database references are not implemented: nonesuch.public.!=- +\dO host.regression.pg_catalog.POSIX +improper qualified name (too many dotted names): host.regression.pg_catalog.POSIX +\dO .pg_catalog.POSIX +cross-database references are not implemented: .pg_catalog.POSIX +\dO nonesuch.pg_catalog.POSIX +cross-database references are not implemented: nonesuch.pg_catalog.POSIX +\dp host.regression.public.a_star +improper qualified name (too many dotted names): host.regression.public.a_star +\dp "regres+ion".public.a_star +cross-database references are not implemented: "regres+ion".public.a_star +\dp nonesuch.public.a_star +cross-database references are not implemented: nonesuch.public.a_star +\dP host.regression.public.mlparted +improper qualified name (too many dotted names): host.regression.public.mlparted +\dP "regres(sion)".public.mlparted +cross-database references are not implemented: "regres(sion)".public.mlparted +\dP nonesuch.public.mlparted +cross-database references are not implemented: nonesuch.public.mlparted +\drds nonesuch.lc_messages +improper qualified name (too many dotted names): nonesuch.lc_messages +\drds regression.lc_messages +improper qualified name (too many dotted names): regression.lc_messages +\dRp public.mypub +improper qualified name (too many dotted names): public.mypub +\dRp regression.mypub +improper qualified name (too many dotted names): regression.mypub +\dRs public.mysub +improper qualified name (too many dotted names): public.mysub +\dRs regression.mysub +improper qualified name (too many dotted names): regression.mysub +\dT host.regression.public.widget +improper qualified name (too many dotted names): host.regression.public.widget +\dT "regression{1,2}".public.widget +cross-database references are not implemented: "regression{1,2}".public.widget +\dT nonesuch.public.widget +cross-database references are not implemented: nonesuch.public.widget +\dx regression.plpgsql +improper qualified name (too many dotted names): regression.plpgsql +\dx nonesuch.plpgsql +improper qualified name (too many dotted names): nonesuch.plpgsql +\dX host.regression.public.func_deps_stat +improper qualified name (too many dotted names): host.regression.public.func_deps_stat +\dX "^regression$".public.func_deps_stat +cross-database references are not implemented: "^regression$".public.func_deps_stat +\dX nonesuch.public.func_deps_stat +cross-database references are not implemented: nonesuch.public.func_deps_stat +\dy regression.myevt +improper qualified name (too many dotted names): regression.myevt +\dy nonesuch.myevt +improper qualified name (too many dotted names): nonesuch.myevt +-- check that dots within quoted name segments are not counted +\dA "no.such.access.method" +List of access methods + Name | Type +------+------ +(0 rows) + +\dt "no.such.table.relation" + List of relations + Schema | Name | Type | Owner | Storage +--------+------+------+-------+--------- +(0 rows) + +\da "no.such.aggregate.function" + List of aggregate functions + Schema | Name | Result data type | Argument data types | Description +--------+------+------------------+---------------------+------------- +(0 rows) + +\dAc "no.such.operator.class" + List of operator classes + AM | Input type | Storage type | Operator class | Default? +----+------------+--------------+----------------+---------- +(0 rows) + +\dAf "no.such.operator.family" + List of operator families + AM | Operator family | Applicable types +----+-----------------+------------------ +(0 rows) + +\dAo "no.such.operator.of.operator.family" + List of operators of operator families + AM | Operator family | Operator | Strategy | Purpose +----+-----------------+----------+----------+--------- +(0 rows) + +\dAp "no.such.operator.support.function.of.operator.family" + List of support functions of operator families + AM | Operator family | Registered left type | Registered right type | Number | Function +----+-----------------+----------------------+-----------------------+--------+---------- +(0 rows) + +\db "no.such.tablespace" + List of tablespaces + Name | Owner | Location +------+-------+---------- +(0 rows) + +\dc "no.such.conversion" + List of conversions + Schema | Name | Source | Destination | Default? +--------+------+--------+-------------+---------- +(0 rows) + +\dC "no.such.cast" + List of casts + Source type | Target type | Function | Implicit? +-------------+-------------+----------+----------- +(0 rows) + +\dd "no.such.object.description" + Object descriptions + Schema | Name | Object | Description +--------+------+--------+------------- +(0 rows) + +\dD "no.such.domain" + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+------+------+-----------+----------+---------+------- +(0 rows) + +\ddp "no.such.default.access.privilege" + Default access privileges + Owner | Schema | Type | Access privileges +-------+--------+------+------------------- +(0 rows) + +\di "no.such.index.relation" + List of relations + Schema | Name | Type | Owner | Table +--------+------+------+-------+------- +(0 rows) + +\dm "no.such.materialized.view" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\ds "no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dt "no.such.relation" + List of relations + Schema | Name | Type | Owner | Storage +--------+------+------+-------+--------- +(0 rows) + +\dv "no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\des "no.such.foreign.server" + List of foreign servers + Name | Owner | Foreign-data wrapper +------+-------+---------------------- +(0 rows) + +\dew "no.such.foreign.data.wrapper" + List of foreign-data wrappers + Name | Owner | Handler | Validator +------+-------+---------+----------- +(0 rows) + +\df "no.such.function" + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+------+------------------+---------------------+------ +(0 rows) + +\dF "no.such.text.search.configuration" +List of text search configurations + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFd "no.such.text.search.dictionary" +List of text search dictionaries + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFp "no.such.text.search.parser" + List of text search parsers + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFt "no.such.text.search.template" +List of text search templates + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dg "no.such.role" + List of roles + Role name | Attributes | Member of +-----------+------------+----------- + +\dL "no.such.language" + List of languages + Name | Owner | Trusted | Description +------+-------+---------+------------- +(0 rows) + +\dn "no.such.schema" +List of schemas + Name | Owner +------+------- +(0 rows) + +\do "no.such.operator" + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +--------+------+---------------+----------------+-------------+------------- +(0 rows) + +\dO "no.such.collation" + List of collations + Schema | Name | Collate | Ctype | Provider | Deterministic? +--------+------+---------+-------+----------+---------------- +(0 rows) + +\dp "no.such.access.privilege" + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+------+------+-------------------+-------------------+---------- +(0 rows) + +\dP "no.such.partitioned.relation" + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +--------+------+-------+------+-------------+------- +(0 rows) + +\drds "no.such.setting" + List of settings + Role | Database | Settings +------+----------+---------- +(0 rows) + +\dRp "no.such.publication" + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +------+-------+------------+---------+---------+---------+-----------+---------- +(0 rows) + +\dRs "no.such.subscription" + List of subscriptions + Name | Owner | Enabled | Publication +------+-------+---------+------------- +(0 rows) + +\dT "no.such.data.type" + List of data types + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dx "no.such.installed.extension" + List of installed extensions + Name | Version | Schema | Description +------+---------+--------+------------- +(0 rows) + +\dX "no.such.extended.statistics" + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+------+------------+-----------+--------------+----- +(0 rows) + +\dy "no.such.event.trigger" + List of event triggers + Name | Event | Owner | Enabled | Function | Tags +------+-------+-------+---------+----------+------ +(0 rows) + +-- again, but with dotted schema qualifications. +\dA "no.such.schema"."no.such.access.method" +improper qualified name (too many dotted names): "no.such.schema"."no.such.access.method" +\dt "no.such.schema"."no.such.table.relation" + List of relations + Schema | Name | Type | Owner | Storage +--------+------+------+-------+--------- +(0 rows) + +\da "no.such.schema"."no.such.aggregate.function" + List of aggregate functions + Schema | Name | Result data type | Argument data types | Description +--------+------+------------------+---------------------+------------- +(0 rows) + +\dAc "no.such.schema"."no.such.operator.class" +improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.class" +\dAf "no.such.schema"."no.such.operator.family" +improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.family" +\dAo "no.such.schema"."no.such.operator.of.operator.family" +improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.of.operator.family" +\dAp "no.such.schema"."no.such.operator.support.function.of.operator.family" +improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.support.function.of.operator.family" +\db "no.such.schema"."no.such.tablespace" +improper qualified name (too many dotted names): "no.such.schema"."no.such.tablespace" +\dc "no.such.schema"."no.such.conversion" + List of conversions + Schema | Name | Source | Destination | Default? +--------+------+--------+-------------+---------- +(0 rows) + +\dC "no.such.schema"."no.such.cast" + List of casts + Source type | Target type | Function | Implicit? +-------------+-------------+----------+----------- +(0 rows) + +\dd "no.such.schema"."no.such.object.description" + Object descriptions + Schema | Name | Object | Description +--------+------+--------+------------- +(0 rows) + +\dD "no.such.schema"."no.such.domain" + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+------+------+-----------+----------+---------+------- +(0 rows) + +\ddp "no.such.schema"."no.such.default.access.privilege" + Default access privileges + Owner | Schema | Type | Access privileges +-------+--------+------+------------------- +(0 rows) + +\di "no.such.schema"."no.such.index.relation" + List of relations + Schema | Name | Type | Owner | Table +--------+------+------+-------+------- +(0 rows) + +\dm "no.such.schema"."no.such.materialized.view" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\ds "no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dt "no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner | Storage +--------+------+------+-------+--------- +(0 rows) + +\dv "no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\des "no.such.schema"."no.such.foreign.server" +improper qualified name (too many dotted names): "no.such.schema"."no.such.foreign.server" +\dew "no.such.schema"."no.such.foreign.data.wrapper" +improper qualified name (too many dotted names): "no.such.schema"."no.such.foreign.data.wrapper" +\df "no.such.schema"."no.such.function" + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+------+------------------+---------------------+------ +(0 rows) + +\dF "no.such.schema"."no.such.text.search.configuration" +List of text search configurations + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFd "no.such.schema"."no.such.text.search.dictionary" +List of text search dictionaries + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFp "no.such.schema"."no.such.text.search.parser" + List of text search parsers + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFt "no.such.schema"."no.such.text.search.template" +List of text search templates + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dg "no.such.schema"."no.such.role" +improper qualified name (too many dotted names): "no.such.schema"."no.such.role" +\dL "no.such.schema"."no.such.language" +cross-database references are not implemented: "no.such.schema"."no.such.language" +\do "no.such.schema"."no.such.operator" + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +--------+------+---------------+----------------+-------------+------------- +(0 rows) + +\dO "no.such.schema"."no.such.collation" + List of collations + Schema | Name | Collate | Ctype | Provider | Deterministic? +--------+------+---------+-------+----------+---------------- +(0 rows) + +\dp "no.such.schema"."no.such.access.privilege" + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+------+------+-------------------+-------------------+---------- +(0 rows) + +\dP "no.such.schema"."no.such.partitioned.relation" + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +--------+------+-------+------+-------------+------- +(0 rows) + +\drds "no.such.schema"."no.such.setting" +improper qualified name (too many dotted names): "no.such.schema"."no.such.setting" +\dRp "no.such.schema"."no.such.publication" +improper qualified name (too many dotted names): "no.such.schema"."no.such.publication" +\dRs "no.such.schema"."no.such.subscription" +improper qualified name (too many dotted names): "no.such.schema"."no.such.subscription" +\dT "no.such.schema"."no.such.data.type" + List of data types + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dx "no.such.schema"."no.such.installed.extension" +improper qualified name (too many dotted names): "no.such.schema"."no.such.installed.extension" +\dX "no.such.schema"."no.such.extended.statistics" + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+------+------------+-----------+--------------+----- +(0 rows) + +\dy "no.such.schema"."no.such.event.trigger" +improper qualified name (too many dotted names): "no.such.schema"."no.such.event.trigger" +-- again, but with current database and dotted schema qualifications. +\dt regression."no.such.schema"."no.such.table.relation" + List of relations + Schema | Name | Type | Owner | Storage +--------+------+------+-------+--------- +(0 rows) + +\da regression."no.such.schema"."no.such.aggregate.function" + List of aggregate functions + Schema | Name | Result data type | Argument data types | Description +--------+------+------------------+---------------------+------------- +(0 rows) + +\dc regression."no.such.schema"."no.such.conversion" + List of conversions + Schema | Name | Source | Destination | Default? +--------+------+--------+-------------+---------- +(0 rows) + +\dC regression."no.such.schema"."no.such.cast" + List of casts + Source type | Target type | Function | Implicit? +-------------+-------------+----------+----------- +(0 rows) + +\dd regression."no.such.schema"."no.such.object.description" + Object descriptions + Schema | Name | Object | Description +--------+------+--------+------------- +(0 rows) + +\dD regression."no.such.schema"."no.such.domain" + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+------+------+-----------+----------+---------+------- +(0 rows) + +\di regression."no.such.schema"."no.such.index.relation" + List of relations + Schema | Name | Type | Owner | Table +--------+------+------+-------+------- +(0 rows) + +\dm regression."no.such.schema"."no.such.materialized.view" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\ds regression."no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dt regression."no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner | Storage +--------+------+------+-------+--------- +(0 rows) + +\dv regression."no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\df regression."no.such.schema"."no.such.function" + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+------+------------------+---------------------+------ +(0 rows) + +\dF regression."no.such.schema"."no.such.text.search.configuration" +List of text search configurations + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFd regression."no.such.schema"."no.such.text.search.dictionary" +List of text search dictionaries + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFp regression."no.such.schema"."no.such.text.search.parser" + List of text search parsers + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFt regression."no.such.schema"."no.such.text.search.template" +List of text search templates + Schema | Name | Description +--------+------+------------- +(0 rows) + +\do regression."no.such.schema"."no.such.operator" + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +--------+------+---------------+----------------+-------------+------------- +(0 rows) + +\dO regression."no.such.schema"."no.such.collation" + List of collations + Schema | Name | Collate | Ctype | Provider | Deterministic? +--------+------+---------+-------+----------+---------------- +(0 rows) + +\dp regression."no.such.schema"."no.such.access.privilege" + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+------+------+-------------------+-------------------+---------- +(0 rows) + +\dP regression."no.such.schema"."no.such.partitioned.relation" + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +--------+------+-------+------+-------------+------- +(0 rows) + +\dT regression."no.such.schema"."no.such.data.type" + List of data types + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dX regression."no.such.schema"."no.such.extended.statistics" + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+------+------------+-----------+--------------+----- +(0 rows) + +-- again, but with dotted database and dotted schema qualifications. +\dt "no.such.database"."no.such.schema"."no.such.table.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.table.relation" +\da "no.such.database"."no.such.schema"."no.such.aggregate.function" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.aggregate.function" +\dc "no.such.database"."no.such.schema"."no.such.conversion" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.conversion" +\dC "no.such.database"."no.such.schema"."no.such.cast" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.cast" +\dd "no.such.database"."no.such.schema"."no.such.object.description" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.object.description" +\dD "no.such.database"."no.such.schema"."no.such.domain" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.domain" +\ddp "no.such.database"."no.such.schema"."no.such.default.access.privilege" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.default.access.privilege" +\di "no.such.database"."no.such.schema"."no.such.index.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.index.relation" +\dm "no.such.database"."no.such.schema"."no.such.materialized.view" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.materialized.view" +\ds "no.such.database"."no.such.schema"."no.such.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" +\dt "no.such.database"."no.such.schema"."no.such.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" +\dv "no.such.database"."no.such.schema"."no.such.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" +\df "no.such.database"."no.such.schema"."no.such.function" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.function" +\dF "no.such.database"."no.such.schema"."no.such.text.search.configuration" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.configuration" +\dFd "no.such.database"."no.such.schema"."no.such.text.search.dictionary" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.dictionary" +\dFp "no.such.database"."no.such.schema"."no.such.text.search.parser" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.parser" +\dFt "no.such.database"."no.such.schema"."no.such.text.search.template" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.template" +\do "no.such.database"."no.such.schema"."no.such.operator" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.operator" +\dO "no.such.database"."no.such.schema"."no.such.collation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.collation" +\dp "no.such.database"."no.such.schema"."no.such.access.privilege" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.access.privilege" +\dP "no.such.database"."no.such.schema"."no.such.partitioned.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.partitioned.relation" +\dT "no.such.database"."no.such.schema"."no.such.data.type" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.data.type" +\dX "no.such.database"."no.such.schema"."no.such.extended.statistics" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.extended.statistics" diff --git a/src/test/singlenode_regress/expected/psql_crosstab.out b/src/test/singlenode_regress/expected/psql_crosstab.out new file mode 100644 index 00000000000..6a2d8e9c11e --- /dev/null +++ b/src/test/singlenode_regress/expected/psql_crosstab.out @@ -0,0 +1,227 @@ +-- +-- \crosstabview +-- +-- ORCA plans produce slightly different plans, with different row order. +-- The row order differences are not masked out by gpdiff in the cross-tab +-- views. The point of this test is to test psql functionality, the queries +-- are not that interesting in the server side, so disable ORCA to make the +-- output consistent. +set optimizer=off; +CREATE TABLE ctv_data (v, h, c, i, d) AS +VALUES + ('v1','h2','foo', 3, '2015-04-01'::date), + ('v2','h1','bar', 3, '2015-01-02'), + ('v1','h0','baz', NULL, '2015-07-12'), + ('v0','h4','qux', 4, '2015-07-15'), + ('v0','h4','dbl', -3, '2014-12-15'), + ('v0',NULL,'qux', 5, '2014-07-15'), + ('v1','h2','quux',7, '2015-04-04'); +-- make plans more stable +ANALYZE ctv_data; +-- running \crosstabview after query uses query in buffer +SELECT v, EXTRACT(year FROM d), count(*) + FROM ctv_data + GROUP BY 1, 2 + ORDER BY 1, 2; + v | extract | count +----+---------+------- + v0 | 2014 | 2 + v0 | 2015 | 1 + v1 | 2015 | 3 + v2 | 2015 | 1 +(4 rows) + +-- basic usage with 3 columns + \crosstabview + v | 2014 | 2015 +----+------+------ + v0 | 2 | 1 + v1 | | 3 + v2 | | 1 +(3 rows) + +-- ordered months in horizontal header, quoted column name +SELECT v, to_char(d, 'Mon') AS "month name", EXTRACT(month FROM d) AS num, + count(*) FROM ctv_data GROUP BY 1,2,3 ORDER BY 1 + \crosstabview v "month name" 4 num + v | Jan | Apr | Jul | Dec +----+-----+-----+-----+----- + v0 | | | 2 | 1 + v1 | | 2 | 1 | + v2 | 1 | | | +(3 rows) + +-- ordered months in vertical header, ordered years in horizontal header +SELECT EXTRACT(year FROM d) AS year, to_char(d,'Mon') AS """month"" name", + EXTRACT(month FROM d) AS month, + format('sum=%s avg=%s', sum(i), avg(i)::numeric(2,1)) + FROM ctv_data + GROUP BY EXTRACT(year FROM d), to_char(d,'Mon'), EXTRACT(month FROM d) +ORDER BY month +\crosstabview """month"" name" year format year + "month" name | 2014 | 2015 +--------------+-----------------+---------------- + Jan | | sum=3 avg=3.0 + Apr | | sum=10 avg=5.0 + Jul | sum=5 avg=5.0 | sum=4 avg=4.0 + Dec | sum=-3 avg=-3.0 | +(4 rows) + +-- combine contents vertically into the same cell (V/H duplicates) +SELECT v, h, string_agg(c, E'\n') FROM ctv_data GROUP BY v, h ORDER BY 1,2,3 + \crosstabview 1 2 3 + v | h4 | | h0 | h2 | h1 +----+-----+-----+-----+------+----- + v0 | qux+| qux | | | + | dbl | | | | + v1 | | | baz | foo +| + | | | | quux | + v2 | | | | | bar +(3 rows) + +-- horizontal ASC order from window function +SELECT v,h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h) AS r +FROM ctv_data GROUP BY v, h ORDER BY 1,3,2 + \crosstabview v h c r + v | h0 | h1 | h2 | h4 | +----+-----+-----+------+-----+----- + v0 | | | | qux+| qux + | | | | dbl | + v1 | baz | | foo +| | + | | | quux | | + v2 | | bar | | | +(3 rows) + +-- horizontal DESC order from window function +SELECT v, h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h DESC) AS r +FROM ctv_data GROUP BY v, h ORDER BY 1,3,2 + \crosstabview v h c r + v | | h4 | h2 | h1 | h0 +----+-----+-----+------+-----+----- + v0 | qux | qux+| | | + | | dbl | | | + v1 | | | foo +| | baz + | | | quux | | + v2 | | | | bar | +(3 rows) + +-- horizontal ASC order from window function, NULLs pushed rightmost +SELECT v,h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h NULLS LAST) AS r +FROM ctv_data GROUP BY v, h ORDER BY 1,3,2 + \crosstabview v h c r + v | h0 | h1 | h2 | h4 | +----+-----+-----+------+-----+----- + v0 | | | | qux+| qux + | | | | dbl | + v1 | baz | | foo +| | + | | | quux | | + v2 | | bar | | | +(3 rows) + +-- only null, no column name, 2 columns: error +SELECT null,null \crosstabview +\crosstabview: query must return at least three columns +-- only null, no column name, 3 columns: works +SELECT null,null,null \crosstabview + ?column? | +----------+-- + | +(1 row) + +-- Make the test results closer to upstream. +-- If we use groupagg the order of agg result will be different. +set enable_groupagg to 0; +-- null display +\pset null '#null#' +SELECT v,h, string_agg(i::text, E'\n') AS i FROM ctv_data +GROUP BY v, h ORDER BY h,v + \crosstabview v h i + v | h0 | h1 | h2 | h4 | #null# +----+--------+----+----+----+-------- + v1 | #null# | | 3 +| | + | | | 7 | | + v2 | | 3 | | | + v0 | | | | 4 +| 5 + | | | | -3 | +(3 rows) + +\pset null '' +-- refer to columns by position +SELECT v,h,string_agg(i::text, E'\n'), string_agg(c, E'\n') +FROM ctv_data GROUP BY v, h ORDER BY h,v + \crosstabview 2 1 4 + h | v1 | v2 | v0 +----+------+-----+----- + h0 | baz | | + h1 | | bar | + h2 | foo +| | + | quux | | + h4 | | | qux+ + | | | dbl + | | | qux +(5 rows) + +-- refer to columns by positions and names mixed +SELECT v,h, string_agg(i::text, E'\n') AS i, string_agg(c, E'\n') AS c +FROM ctv_data GROUP BY v, h ORDER BY h,v + \crosstabview 1 "h" 4 + v | h0 | h1 | h2 | h4 | +----+-----+-----+------+-----+----- + v1 | baz | | foo +| | + | | | quux | | + v2 | | bar | | | + v0 | | | | qux+| qux + | | | | dbl | +(3 rows) + +-- reset the flag. +reset enable_groupagg; +-- refer to columns by quoted names, check downcasing of unquoted name +SELECT 1 as "22", 2 as b, 3 as "Foo" + \crosstabview "22" B "Foo" + 22 | 2 +----+--- + 1 | 3 +(1 row) + +-- error: bad column name +SELECT v,h,c,i FROM ctv_data + \crosstabview v h j +\crosstabview: column name not found: "j" +-- error: need to quote name +SELECT 1 as "22", 2 as b, 3 as "Foo" + \crosstabview 1 2 Foo +\crosstabview: column name not found: "foo" +-- error: need to not quote name +SELECT 1 as "22", 2 as b, 3 as "Foo" + \crosstabview 1 "B" "Foo" +\crosstabview: column name not found: "B" +-- error: bad column number +SELECT v,h,i,c FROM ctv_data + \crosstabview 2 1 5 +\crosstabview: column number 5 is out of range 1..4 +-- error: same H and V columns +SELECT v,h,i,c FROM ctv_data + \crosstabview 2 h 4 +\crosstabview: vertical and horizontal headers must be different columns +-- error: too many columns +SELECT a,a,1 FROM generate_series(1,3000) AS a + \crosstabview +\crosstabview: maximum number of columns (1600) exceeded +-- error: only one column +SELECT 1 \crosstabview +\crosstabview: query must return at least three columns +DROP TABLE ctv_data; +-- check error reporting (bug #14476) +CREATE TABLE ctv_data (x int, y int, v text); +INSERT INTO ctv_data SELECT 1, x, '*' || x FROM generate_series(1,10) x; +SELECT * FROM ctv_data \crosstabview + x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 +---+----+----+----+----+----+----+----+----+----+----- + 1 | *1 | *2 | *3 | *4 | *5 | *6 | *7 | *8 | *9 | *10 +(1 row) + +INSERT INTO ctv_data VALUES (1, 10, '*'); -- duplicate data to cause error +SELECT * FROM ctv_data \crosstabview +\crosstabview: query result contains multiple data values for row "1", column "10" +DROP TABLE ctv_data; diff --git a/src/test/singlenode_regress/expected/publication.out b/src/test/singlenode_regress/expected/publication.out new file mode 100644 index 00000000000..7c7e0226658 --- /dev/null +++ b/src/test/singlenode_regress/expected/publication.out @@ -0,0 +1,344 @@ +-- +-- PUBLICATION +-- +CREATE ROLE regress_publication_user LOGIN SUPERUSER; +CREATE ROLE regress_publication_user2; +CREATE ROLE regress_publication_user_dummy LOGIN NOSUPERUSER; +SET SESSION AUTHORIZATION 'regress_publication_user'; +-- suppress warning that depends on wal_level +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_default; +RESET client_min_messages; +COMMENT ON PUBLICATION testpub_default IS 'test publication'; +SELECT obj_description(p.oid, 'pg_publication') FROM pg_publication p; + obj_description +------------------ + test publication +(1 row) + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpib_ins_trunct WITH (publish = insert); +RESET client_min_messages; +ALTER PUBLICATION testpub_default SET (publish = update); +-- error cases +CREATE PUBLICATION testpub_xxx WITH (foo); +ERROR: unrecognized publication parameter: "foo" +CREATE PUBLICATION testpub_xxx WITH (publish = 'cluster, vacuum'); +ERROR: unrecognized "publish" value: "cluster" +CREATE PUBLICATION testpub_xxx WITH (publish_via_partition_root = 'true', publish_via_partition_root = '0'); +ERROR: conflicting or redundant options +\dRp + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------+--------------------------+------------+---------+---------+---------+-----------+---------- + testpib_ins_trunct | regress_publication_user | f | t | f | f | f | f + testpub_default | regress_publication_user | f | f | t | f | f | f +(2 rows) + +ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete'); +\dRp + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------+--------------------------+------------+---------+---------+---------+-----------+---------- + testpib_ins_trunct | regress_publication_user | f | t | f | f | f | f + testpub_default | regress_publication_user | f | t | t | t | f | f +(2 rows) + +--- adding tables +CREATE SCHEMA pub_test; +CREATE TABLE testpub_tbl1 (id serial primary key, data text); +CREATE TABLE pub_test.testpub_nopk (foo int, bar int); +CREATE VIEW testpub_view AS SELECT 1; +CREATE TABLE testpub_parted (a int) PARTITION BY LIST (a); +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_foralltables FOR ALL TABLES WITH (publish = 'insert'); +RESET client_min_messages; +ALTER PUBLICATION testpub_foralltables SET (publish = 'insert, update'); +CREATE TABLE testpub_tbl2 (id serial primary key, data text); +-- fail - can't add to for all tables publication +ALTER PUBLICATION testpub_foralltables ADD TABLE testpub_tbl2; +ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES +DETAIL: Tables cannot be added to or dropped from FOR ALL TABLES publications. +-- fail - can't drop from all tables publication +ALTER PUBLICATION testpub_foralltables DROP TABLE testpub_tbl2; +ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES +DETAIL: Tables cannot be added to or dropped from FOR ALL TABLES publications. +-- fail - can't add to for all tables publication +ALTER PUBLICATION testpub_foralltables SET TABLE pub_test.testpub_nopk; +ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES +DETAIL: Tables cannot be added to or dropped from FOR ALL TABLES publications. +SELECT pubname, puballtables FROM pg_publication WHERE pubname = 'testpub_foralltables'; + pubname | puballtables +----------------------+-------------- + testpub_foralltables | t +(1 row) + +\d+ testpub_tbl2 + Table "public.testpub_tbl2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('testpub_tbl2_id_seq'::regclass) | plain | | + data | text | | | | extended | | +Indexes: + "testpub_tbl2_pkey" PRIMARY KEY, btree (id) +Publications: + "testpub_foralltables" + +\dRp+ testpub_foralltables + Publication testpub_foralltables + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | t | t | t | f | f | f +(1 row) + +DROP TABLE testpub_tbl2; +DROP PUBLICATION testpub_foralltables; +CREATE TABLE testpub_tbl3 (a int); +CREATE TABLE testpub_tbl3a (b text) INHERITS (testpub_tbl3); +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub3 FOR TABLE testpub_tbl3; +CREATE PUBLICATION testpub4 FOR TABLE ONLY testpub_tbl3; +RESET client_min_messages; +\dRp+ testpub3 + Publication testpub3 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f +Tables: + "public.testpub_tbl3" + "public.testpub_tbl3a" + +\dRp+ testpub4 + Publication testpub4 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f +Tables: + "public.testpub_tbl3" + +DROP TABLE testpub_tbl3, testpub_tbl3a; +DROP PUBLICATION testpub3, testpub4; +-- Tests for partitioned tables +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forparted; +CREATE PUBLICATION testpub_forparted1; +RESET client_min_messages; +CREATE TABLE testpub_parted1 (LIKE testpub_parted); +CREATE TABLE testpub_parted2 (LIKE testpub_parted); +ALTER PUBLICATION testpub_forparted1 SET (publish='insert'); +ALTER TABLE testpub_parted ATTACH PARTITION testpub_parted1 FOR VALUES IN (1); +ALTER TABLE testpub_parted ATTACH PARTITION testpub_parted2 FOR VALUES IN (2); +-- works despite missing REPLICA IDENTITY, because updates are not replicated +UPDATE testpub_parted1 SET a = 1; +-- only parent is listed as being in publication, not the partition +ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted; +\dRp+ testpub_forparted + Publication testpub_forparted + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f +Tables: + "public.testpub_parted" + +-- should now fail, because parent's publication replicates updates +UPDATE testpub_parted1 SET a = 1; +ERROR: cannot update table "testpub_parted1" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +ALTER TABLE testpub_parted DETACH PARTITION testpub_parted1; +-- works again, because parent's publication is no longer considered +UPDATE testpub_parted1 SET a = 1; +ALTER PUBLICATION testpub_forparted SET (publish_via_partition_root = true); +\dRp+ testpub_forparted + Publication testpub_forparted + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | t +Tables: + "public.testpub_parted" + +-- still fail, because parent's publication replicates updates +UPDATE testpub_parted2 SET a = 2; +ERROR: cannot update table "testpub_parted2" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +ALTER PUBLICATION testpub_forparted DROP TABLE testpub_parted; +-- works again, because update is no longer replicated +UPDATE testpub_parted2 SET a = 2; +-- publication includes both the parent table and the child table +ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted, testpub_parted2; +-- only parent is listed as being in publication, not the partition +SELECT * FROM pg_publication_tables; + pubname | schemaname | tablename +-------------------+------------+---------------- + testpub_forparted | public | testpub_parted +(1 row) + +DROP TABLE testpub_parted1, testpub_parted2; +DROP PUBLICATION testpub_forparted, testpub_forparted1; +-- Test cache invalidation FOR ALL TABLES publication +SET client_min_messages = 'ERROR'; +CREATE TABLE testpub_tbl4(a int); +INSERT INTO testpub_tbl4 values(1); +UPDATE testpub_tbl4 set a = 2; +CREATE PUBLICATION testpub_foralltables FOR ALL TABLES; +RESET client_min_messages; +-- fail missing REPLICA IDENTITY +UPDATE testpub_tbl4 set a = 3; +ERROR: cannot update table "testpub_tbl4" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +DROP PUBLICATION testpub_foralltables; +-- should pass after dropping the publication +UPDATE testpub_tbl4 set a = 3; +DROP TABLE testpub_tbl4; +-- fail - view +CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_view; +ERROR: "testpub_view" is not a table +DETAIL: Only tables can be added to publications. +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1, pub_test.testpub_nopk; +RESET client_min_messages; +-- fail - already added +ALTER PUBLICATION testpub_fortbl ADD TABLE testpub_tbl1; +ERROR: relation "testpub_tbl1" is already member of publication "testpub_fortbl" +-- fail - already added +CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1; +ERROR: publication "testpub_fortbl" already exists +\dRp+ testpub_fortbl + Publication testpub_fortbl + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f +Tables: + "pub_test.testpub_nopk" + "public.testpub_tbl1" + +-- fail - view +ALTER PUBLICATION testpub_default ADD TABLE testpub_view; +ERROR: "testpub_view" is not a table +DETAIL: Only tables can be added to publications. +ALTER PUBLICATION testpub_default ADD TABLE testpub_tbl1; +ALTER PUBLICATION testpub_default SET TABLE testpub_tbl1; +ALTER PUBLICATION testpub_default ADD TABLE pub_test.testpub_nopk; +ALTER PUBLICATION testpib_ins_trunct ADD TABLE pub_test.testpub_nopk, testpub_tbl1; +\d+ pub_test.testpub_nopk + Table "pub_test.testpub_nopk" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + foo | integer | | | | plain | | + bar | integer | | | | plain | | +Publications: + "testpib_ins_trunct" + "testpub_default" + "testpub_fortbl" + +\d+ testpub_tbl1 + Table "public.testpub_tbl1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('testpub_tbl1_id_seq'::regclass) | plain | | + data | text | | | | extended | | +Indexes: + "testpub_tbl1_pkey" PRIMARY KEY, btree (id) +Publications: + "testpib_ins_trunct" + "testpub_default" + "testpub_fortbl" + +\dRp+ testpub_default + Publication testpub_default + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | f | f +Tables: + "pub_test.testpub_nopk" + "public.testpub_tbl1" + +ALTER PUBLICATION testpub_default DROP TABLE testpub_tbl1, pub_test.testpub_nopk; +-- fail - nonexistent +ALTER PUBLICATION testpub_default DROP TABLE pub_test.testpub_nopk; +ERROR: relation "testpub_nopk" is not part of the publication +\d+ testpub_tbl1 + Table "public.testpub_tbl1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('testpub_tbl1_id_seq'::regclass) | plain | | + data | text | | | | extended | | +Indexes: + "testpub_tbl1_pkey" PRIMARY KEY, btree (id) +Publications: + "testpib_ins_trunct" + "testpub_fortbl" + +-- verify relation cache invalidation when a primary key is added using +-- an existing index +CREATE TABLE pub_test.testpub_addpk (id int not null, data int); +ALTER PUBLICATION testpub_default ADD TABLE pub_test.testpub_addpk; +INSERT INTO pub_test.testpub_addpk VALUES(1, 11); +CREATE UNIQUE INDEX testpub_addpk_id_idx ON pub_test.testpub_addpk(id); +-- fail: +UPDATE pub_test.testpub_addpk SET id = 2; +ERROR: cannot update table "testpub_addpk" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +ALTER TABLE pub_test.testpub_addpk ADD PRIMARY KEY USING INDEX testpub_addpk_id_idx; +-- now it should work: +UPDATE pub_test.testpub_addpk SET id = 2; +DROP TABLE pub_test.testpub_addpk; +-- permissions +SET ROLE regress_publication_user2; +CREATE PUBLICATION testpub2; -- fail +ERROR: permission denied for database regression +SET ROLE regress_publication_user; +GRANT CREATE ON DATABASE regression TO regress_publication_user2; +SET ROLE regress_publication_user2; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub2; -- ok +RESET client_min_messages; +ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- fail +ERROR: must be owner of table testpub_tbl1 +SET ROLE regress_publication_user; +GRANT regress_publication_user TO regress_publication_user2; +SET ROLE regress_publication_user2; +ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- ok +DROP PUBLICATION testpub2; +SET ROLE regress_publication_user; +REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; +DROP TABLE testpub_parted; +DROP VIEW testpub_view; +DROP TABLE testpub_tbl1; +\dRp+ testpub_default + Publication testpub_default + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | f | f +(1 row) + +-- fail - must be owner of publication +SET ROLE regress_publication_user_dummy; +ALTER PUBLICATION testpub_default RENAME TO testpub_dummy; +ERROR: must be owner of publication testpub_default +RESET ROLE; +ALTER PUBLICATION testpub_default RENAME TO testpub_foo; +\dRp testpub_foo + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +-------------+--------------------------+------------+---------+---------+---------+-----------+---------- + testpub_foo | regress_publication_user | f | t | t | t | f | f +(1 row) + +-- rename back to keep the rest simple +ALTER PUBLICATION testpub_foo RENAME TO testpub_default; +ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2; +\dRp testpub_default + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +-----------------+---------------------------+------------+---------+---------+---------+-----------+---------- + testpub_default | regress_publication_user2 | f | t | t | t | f | f +(1 row) + +DROP PUBLICATION testpub_default; +DROP PUBLICATION testpib_ins_trunct; +DROP PUBLICATION testpub_fortbl; +DROP SCHEMA pub_test CASCADE; +NOTICE: drop cascades to table pub_test.testpub_nopk +RESET SESSION AUTHORIZATION; +DROP ROLE regress_publication_user, regress_publication_user2; +DROP ROLE regress_publication_user_dummy; diff --git a/src/test/singlenode_regress/expected/qp_left_anti_semi_join.out b/src/test/singlenode_regress/expected/qp_left_anti_semi_join.out new file mode 100644 index 00000000000..206bcc6f68f --- /dev/null +++ b/src/test/singlenode_regress/expected/qp_left_anti_semi_join.out @@ -0,0 +1,503 @@ +-- Tests for Left Anti Semi Joins +create schema lasj; +set search_path='lasj'; +create table foo (a int, b int); +create table bar (x int, y int); +insert into foo values (1, 2); +insert into foo values (12, 20); +insert into foo values (NULL, 2); +insert into foo values (15, 2); +insert into foo values (NULL, NULL); +insert into foo values (1, 12); +insert into foo values (1, 102); +insert into bar select i/10, i from generate_series(1, 100)i; +insert into bar values (NULL, 101); +insert into bar values (NULL, 102); +insert into bar values (NULL, NULL); +-- We will run the same queries with hash joins enabled, and disabled. First, +-- disabled. +set enable_hashjoin=off; +set optimizer_enable_hashjoin = off; +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND a = ALL (SELECT x FROM bar WHERE y <= 100); + a | b +---+--- +(0 rows) + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE b = 2 AND a = ALL (SELECT x FROM bar WHERE y >=10 AND y < 20); + a | b +---+--- + 1 | 2 +(1 row) + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE b = 2 AND a = ALL (SELECT x FROM bar WHERE y = -1) order by 1, 2; + a | b +----+--- + 1 | 2 + 15 | 2 + | 2 +(3 rows) + +-- outer with nulls, inner with nulls +SELECT * FROM foo WHERE a = ALL (SELECT x FROM bar WHERE x = 1 OR x IS NULL); + a | b +---+--- +(0 rows) + +-- empty outer, non-empty inner +SELECT * FROM (SELECT * FROM foo WHERE b = -1) foo2 FULL OUTER JOIN bar ON (a = x); + a | b | x | y +---+---+----+----- + | | 10 | 100 + | | 3 | 31 + | | 3 | 32 + | | 3 | 33 + | | 3 | 34 + | | 3 | 35 + | | 3 | 36 + | | 3 | 37 + | | 3 | 38 + | | 3 | 39 + | | 3 | 30 + | | 9 | 90 + | | 9 | 99 + | | 9 | 98 + | | 9 | 91 + | | 9 | 92 + | | 9 | 93 + | | 9 | 94 + | | 9 | 95 + | | 9 | 96 + | | 9 | 97 + | | | 101 + | | | + | | | 102 + | | 2 | 29 + | | 2 | 28 + | | 2 | 27 + | | 2 | 26 + | | 2 | 25 + | | 2 | 24 + | | 2 | 23 + | | 2 | 22 + | | 2 | 21 + | | 2 | 20 + | | 8 | 89 + | | 8 | 88 + | | 8 | 87 + | | 8 | 86 + | | 8 | 85 + | | 8 | 84 + | | 8 | 83 + | | 8 | 82 + | | 8 | 81 + | | 8 | 80 + | | 5 | 50 + | | 5 | 51 + | | 5 | 52 + | | 5 | 53 + | | 5 | 54 + | | 5 | 55 + | | 5 | 56 + | | 5 | 57 + | | 5 | 58 + | | 5 | 59 + | | 1 | 19 + | | 1 | 18 + | | 1 | 17 + | | 1 | 16 + | | 1 | 15 + | | 1 | 14 + | | 1 | 13 + | | 1 | 12 + | | 1 | 11 + | | 1 | 10 + | | 7 | 79 + | | 7 | 78 + | | 7 | 77 + | | 7 | 76 + | | 7 | 75 + | | 7 | 74 + | | 7 | 73 + | | 7 | 72 + | | 7 | 71 + | | 7 | 70 + | | 4 | 40 + | | 4 | 41 + | | 4 | 42 + | | 4 | 43 + | | 4 | 44 + | | 4 | 45 + | | 4 | 46 + | | 4 | 47 + | | 4 | 48 + | | 4 | 49 + | | 0 | 9 + | | 0 | 8 + | | 0 | 7 + | | 0 | 6 + | | 0 | 5 + | | 0 | 4 + | | 0 | 3 + | | 0 | 2 + | | 0 | 1 + | | 6 | 69 + | | 6 | 68 + | | 6 | 67 + | | 6 | 66 + | | 6 | 65 + | | 6 | 64 + | | 6 | 63 + | | 6 | 62 + | | 6 | 61 + | | 6 | 60 +(103 rows) + +-- non-empty outer, empty inner +SELECT * FROM foo FULL OUTER JOIN (SELECT * FROM bar WHERE y = -1) bar2 ON (a = x); + a | b | x | y +----+-----+---+--- + 15 | 2 | | + | 2 | | + | | | + 12 | 20 | | + 1 | 2 | | + 1 | 12 | | + 1 | 102 | | +(7 rows) + +-- non-empty outer, non-empty inner +SELECT * FROM (SELECT * FROM foo WHERE b = 2) foo2 FULL OUTER JOIN (SELECT * FROM bar WHERE y BETWEEN 16 AND 22 OR x IS NULL) bar2 ON (a = x); + a | b | x | y +----+---+---+----- + 15 | 2 | | + 1 | 2 | 1 | 16 + 1 | 2 | 1 | 17 + 1 | 2 | 1 | 18 + 1 | 2 | 1 | 19 + | 2 | | + | | | 101 + | | | 102 + | | | + | | 2 | 20 + | | 2 | 21 + | | 2 | 22 +(12 rows) + +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND (a, b) NOT IN (SELECT x, y FROM bar WHERE y <= 100); + a | b +---+--- +(0 rows) + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y <= 100); + a | b +----+----- + 1 | 2 + 1 | 102 + 15 | 2 + 12 | 20 +(4 rows) + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y = -1); + a | b +----+----- + 12 | 20 + 15 | 2 + | 2 + 1 | 2 + 1 | 12 + 1 | 102 + | +(7 rows) + +-- outer with nulls, inner with partial nulls +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y IS NOT NULL); + a | b +----+---- + 1 | 2 + 12 | 20 + 15 | 2 +(3 rows) + +-- outer with nulls, inner with null tuples +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar); + a | b +---+--- +(0 rows) + +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND a NOT IN (SELECT x FROM bar WHERE y <= 100); + a | b +---+--- +(0 rows) + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE b = 2 AND a NOT IN (SELECT x FROM bar WHERE y <= 100); + a | b +----+--- + 15 | 2 +(1 row) + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE b = 2 AND a NOT IN (SELECT x FROM bar WHERE y = -1) order by 1, 2; + a | b +----+--- + 1 | 2 + 15 | 2 + | 2 +(3 rows) + +-- outer with nulls, inner with nulls +SELECT * FROM foo WHERE a NOT IN (SELECT x FROM bar); + a | b +---+--- +(0 rows) + +-- Now run the same tests again, with hashjoins enabled. +set enable_hashjoin=on; +set optimizer_enable_hashjoin = on; +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND a = ALL (SELECT x FROM bar WHERE y <= 100); + a | b +---+--- +(0 rows) + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE b = 2 AND a = ALL (SELECT x FROM bar WHERE y >=10 AND y < 20); + a | b +---+--- + 1 | 2 +(1 row) + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE b = 2 AND a = ALL (SELECT x FROM bar WHERE y = -1) order by 1, 2; + a | b +----+--- + 1 | 2 + 15 | 2 + | 2 +(3 rows) + +-- outer with nulls, inner with nulls +SELECT * FROM foo WHERE a = ALL (SELECT x FROM bar WHERE x = 1 OR x IS NULL); + a | b +---+--- +(0 rows) + +-- empty outer, non-empty inner +SELECT * FROM (SELECT * FROM foo WHERE b = -1) foo2 FULL OUTER JOIN bar ON (a = x); + a | b | x | y +---+---+----+----- + | | 10 | 100 + | | 3 | 31 + | | 3 | 32 + | | 3 | 33 + | | 3 | 34 + | | 3 | 35 + | | 3 | 36 + | | 3 | 37 + | | 3 | 38 + | | 3 | 39 + | | 3 | 30 + | | 9 | 90 + | | 9 | 99 + | | 9 | 98 + | | 9 | 91 + | | 9 | 92 + | | 9 | 93 + | | 9 | 94 + | | 9 | 95 + | | 9 | 96 + | | 9 | 97 + | | | 101 + | | | + | | | 102 + | | 2 | 29 + | | 2 | 28 + | | 2 | 27 + | | 2 | 26 + | | 2 | 25 + | | 2 | 24 + | | 2 | 23 + | | 2 | 22 + | | 2 | 21 + | | 2 | 20 + | | 8 | 89 + | | 8 | 88 + | | 8 | 87 + | | 8 | 86 + | | 8 | 85 + | | 8 | 84 + | | 8 | 83 + | | 8 | 82 + | | 8 | 81 + | | 8 | 80 + | | 5 | 50 + | | 5 | 51 + | | 5 | 52 + | | 5 | 53 + | | 5 | 54 + | | 5 | 55 + | | 5 | 56 + | | 5 | 57 + | | 5 | 58 + | | 5 | 59 + | | 1 | 19 + | | 1 | 18 + | | 1 | 17 + | | 1 | 16 + | | 1 | 15 + | | 1 | 14 + | | 1 | 13 + | | 1 | 12 + | | 1 | 11 + | | 1 | 10 + | | 7 | 79 + | | 7 | 78 + | | 7 | 77 + | | 7 | 76 + | | 7 | 75 + | | 7 | 74 + | | 7 | 73 + | | 7 | 72 + | | 7 | 71 + | | 7 | 70 + | | 4 | 40 + | | 4 | 41 + | | 4 | 42 + | | 4 | 43 + | | 4 | 44 + | | 4 | 45 + | | 4 | 46 + | | 4 | 47 + | | 4 | 48 + | | 4 | 49 + | | 0 | 9 + | | 0 | 8 + | | 0 | 7 + | | 0 | 6 + | | 0 | 5 + | | 0 | 4 + | | 0 | 3 + | | 0 | 2 + | | 0 | 1 + | | 6 | 69 + | | 6 | 68 + | | 6 | 67 + | | 6 | 66 + | | 6 | 65 + | | 6 | 64 + | | 6 | 63 + | | 6 | 62 + | | 6 | 61 + | | 6 | 60 +(103 rows) + +-- non-empty outer, empty inner +SELECT * FROM foo FULL OUTER JOIN (SELECT * FROM bar WHERE y = -1) bar2 ON (a = x); + a | b | x | y +----+-----+---+--- + 15 | 2 | | + | 2 | | + | | | + 12 | 20 | | + 1 | 2 | | + 1 | 12 | | + 1 | 102 | | +(7 rows) + +-- non-empty outer, non-empty inner +SELECT * FROM (SELECT * FROM foo WHERE b = 2) foo2 FULL OUTER JOIN (SELECT * FROM bar WHERE y BETWEEN 16 AND 22 OR x IS NULL) bar2 ON (a = x); + a | b | x | y +----+---+---+----- + 15 | 2 | | + 1 | 2 | 1 | 16 + 1 | 2 | 1 | 17 + 1 | 2 | 1 | 18 + 1 | 2 | 1 | 19 + | 2 | | + | | | 101 + | | | 102 + | | | + | | 2 | 20 + | | 2 | 21 + | | 2 | 22 +(12 rows) + +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND (a, b) NOT IN (SELECT x, y FROM bar WHERE y <= 100); + a | b +---+--- +(0 rows) + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y <= 100); + a | b +----+----- + 1 | 2 + 1 | 102 + 15 | 2 + 12 | 20 +(4 rows) + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y = -1); + a | b +----+----- + 12 | 20 + 15 | 2 + | 2 + 1 | 2 + 1 | 12 + 1 | 102 + | +(7 rows) + +-- outer with nulls, inner with partial nulls +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y IS NOT NULL); + a | b +----+---- + 1 | 2 + 12 | 20 + 15 | 2 +(3 rows) + +-- outer with nulls, inner with null tuples +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar); + a | b +---+--- +(0 rows) + +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND a NOT IN (SELECT x FROM bar WHERE y <= 100); + a | b +---+--- +(0 rows) + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE b = 2 AND a NOT IN (SELECT x FROM bar WHERE y <= 100); + a | b +----+--- + 15 | 2 +(1 row) + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE b = 2 AND a NOT IN (SELECT x FROM bar WHERE y = -1) order by 1, 2; + a | b +----+--- + 1 | 2 + 15 | 2 + | 2 +(3 rows) + +-- outer with nulls, inner with nulls +SELECT * FROM foo WHERE a NOT IN (SELECT x FROM bar); + a | b +---+--- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/qp_query_execution.out b/src/test/singlenode_regress/expected/qp_query_execution.out new file mode 100644 index 00000000000..371418a6ed4 --- /dev/null +++ b/src/test/singlenode_regress/expected/qp_query_execution.out @@ -0,0 +1,1256 @@ +-- start_ignore +drop schema qp_query_execution cascade; +ERROR: schema "qp_query_execution" does not exist +create schema qp_query_execution; +set search_path to qp_query_execution; +-- count number of certain operators in a given plan +create language plpython3u; +create or replace function qx_count_operator(query text, planner_operator text, optimizer_operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN '+ query) +plan = '\n'.join([row['QUERY PLAN'] for row in rv]) +optimizer = plan.find('Pivotal Optimizer (GPORCA)') + +if optimizer >= 0: + return plan.count(optimizer_operator) +else: + return plan.count(planner_operator) +$$ +language plpython3u; +drop table if exists tmp1; +NOTICE: table "tmp1" does not exist, skipping +-- end_ignore +CREATE TABLE bugtest +( + a1 integer, + a2 integer, + a3 integer, + a4 character(1), + a5 text, + a6 text, + a7 character(1), + a8 integer, + a9 integer, + a10 integer, + a11 integer, + a12 integer, + a13 double precision, + a14 double precision, + a15 double precision, + a16 double precision, + a17 double precision, + a18 double precision, + a19 double precision, + a20 double precision, + a21 double precision, + a22 double precision, + a23 double precision, + a24 double precision, + a25 integer, + a26 integer, + a27 integer, + a28 text, + a29 integer, + a30 integer, + a31 integer, + a32 integer, + a33 text, + a34 integer, + a35 integer, + a36 character(1), + a37 double precision, + a38 integer, + a39 integer, + a40 integer, + a41 integer, + a42 integer, + a43 integer, + a44 integer, + a45 integer, + a46 integer, + a47 integer, + a48 integer, + a49 integer, + a50 integer, + a51 integer, + a52 integer, + a53 double precision, + a54 double precision, + a55 double precision, + a56 double precision +) +; +insert into bugtest +select a.* +from + ( + select +1,1,1,'a','a','a','a',11111,1111,11,16,6,0,0.125,0,0.25,0.875,0.125,0,0,0.9375,0.0625,125.9375,20.30810708273,0,1,0,'asdf',0,0,89,1,'aaa',0,0,'',33.5,69,38,5,6,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,2.29411764705882,5.57142857142857,33.5,0 + ) a, + generate_series(1,100000) b; +set statement_mem="10MB"; +create temporary table tmp1 as SELECT * FROM bugtest order by a2 limit 300000; +drop table tmp1; +create temporary table tmp1 as SELECT * FROM bugtest order by a2 limit 90000; +drop table tmp1; +create temporary table tmp1 as SELECT * FROM bugtest order by a2 limit 20000; +drop table tmp1; +create temporary table tmp1 as SELECT * FROM bugtest order by a1 limit 100000; +-- End of mpp16458 +drop table if exists lossmithe_colstor; +NOTICE: table "lossmithe_colstor" does not exist, skipping +create table lossmithe_colstor + (loannumber character varying(40), + var1 smallint, + var2 smallint, + partvar smallint, + isinterestonly bool, + upb smallint + ) + with (appendonly=true, orientation=column) + partition by range(partvar) (start (0) end (100) every (10)); +drop table if exists address_he_unique; +NOTICE: table "address_he_unique" does not exist, skipping +create table address_he_unique ( + var1 integer, + loannumber character varying(40), + var2 integer, + rand_no smallint) + ; +insert into lossmithe_colstor + select i::text, i, i, i % 100, true, i % 23 from generate_series(0,99) i; +insert into address_he_unique + select i, i::text, i, i % 7 from generate_series(0,999999) i; +SELECT SUM(upb), isinterestonly + FROM lossmithe_colstor b + LEFT JOIN address_he_unique a ON a.loannumber::text=b.loannumber::text + WHERE rand_no < 500 + GROUP BY isinterestonly; + sum | isinterestonly +------+---------------- + 1040 | t +(1 row) + + +-- End of mpp16598 + +-- Redistribute on top of Append with flow node +-- start_ignore +drop table if exists foo_p; +NOTICE: table "foo_p" does not exist, skipping +drop table if exists bar; +NOTICE: table "bar" does not exist, skipping +-- end_ignore +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar( a int, b int, k int, t text, p int); +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar; +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.k, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.k, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + k | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +-- Use all distribution keys in the select list +select foo_p.a,foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2, 3 desc limit 10; + a | b | t +---+---+-------------------------- + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER + 6 | 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +-- Non-equality predicates on one of the distribution keys +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a >= 6 order by 1, 2 desc limit 10; + b | t +---+---------------------------- + 0 | 990SOME NUMBER SOME NUMBER + 0 | 980SOME NUMBER SOME NUMBER + 0 | 970SOME NUMBER SOME NUMBER + 0 | 960SOME NUMBER SOME NUMBER + 0 | 950SOME NUMBER SOME NUMBER + 0 | 940SOME NUMBER SOME NUMBER + 0 | 930SOME NUMBER SOME NUMBER + 0 | 920SOME NUMBER SOME NUMBER + 0 | 910SOME NUMBER SOME NUMBER + 0 | 90SOME NUMBER SOME NUMBER +(10 rows) + +-- Equality predicates on non-distribution keys +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + b | t +---+---------------------------- + 6 | 996SOME NUMBER SOME NUMBER + 6 | 986SOME NUMBER SOME NUMBER + 6 | 976SOME NUMBER SOME NUMBER + 6 | 96SOME NUMBER SOME NUMBER + 6 | 966SOME NUMBER SOME NUMBER + 6 | 956SOME NUMBER SOME NUMBER + 6 | 946SOME NUMBER SOME NUMBER + 6 | 936SOME NUMBER SOME NUMBER + 6 | 926SOME NUMBER SOME NUMBER + 6 | 916SOME NUMBER SOME NUMBER +(10 rows) + +-- All distribution keys in the predicates +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6 and foo_p.b = 6 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6 or foo_p.b = 7 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +-- Broadcast on top of Append with flow node +-- Forge stats to force a broadcast instead of append +-- Make bar appear too big so that the planner chooses to do a flow on foo_p +-- Make foo_p appear too small so that the planner chooses to do a broadcast +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +set allow_system_table_mods=true; +update pg_class set reltuples = 100000000, relpages = 10000000 where relname = 'bar' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); +update pg_class set reltuples = 1, relpages = 1 where relname = 'foo_p_1_prt_other' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); +update pg_class set reltuples = 1, relpages = 1 where relname = 'foo_p_1_prt_2' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.a where foo_p.p =3 and foo_p.a = 6 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER + 3 | 1SOME NUMBER SOME NUMBER +(10 rows) + +-- Varchar in the select list with redistribute on top of an append with flow node +-- start_ignore +drop table if exists abbp; +NOTICE: table "abbp" does not exist, skipping +drop table if exists b; +NOTICE: table "b" does not exist, skipping +-- end_ignore +create table abbp ( a character varying(60), b character varying(60), k character varying(60), t int, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b ( a character varying(60), b character varying(60), k character varying(60), t int, p int) ; +insert into abbp select i || 'SOME NUMBER', i || 'SN', i || 'SN SN', i, i%10 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN', i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 100)i; +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +analyze abbp; +analyze b; +select qx_count_operator('select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6 order by 1, 2 desc limit 10; + k | t +----------+----- + 106SN SN | 106 + 116SN SN | 116 + 126SN SN | 126 + 136SN SN | 136 + 146SN SN | 146 + 156SN SN | 156 + 166SN SN | 166 + 16SN SN | 16 + 176SN SN | 176 + 186SN SN | 186 +(10 rows) + +select qx_count_operator('select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = E''6SOME NUMBER''', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = '6SOME NUMBER' order by 1, 2 desc limit 10; + b | t +-----+--- + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 +(10 rows) + +-- Varchar in the select list with a broadcast on top of an append with flow node +-- Forge stats to force a broadcast instead of append +-- Make b appear too big so that the planner chooses to do a flow on abbp +-- Make abbp appear too small so that the planner chooses to do a broadcast +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +set allow_system_table_mods=true; +update pg_class set reltuples = 100000000, relpages = 10000000 where relname = 'b' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); +update pg_class set reltuples = 1, relpages = 1 where relname like 'abbp%' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); +select abbp.b, abbp.t from abbp join (select abbp.* from b, abbp where abbp.a = b.k and abbp.a = '6SOME NUMBER') FOO on abbp.a = FOO.a where abbp.t is not null order by 1, 2 desc limit 10; + b | t +-----+--- + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 +(10 rows) + +select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = '6SOME NUMBER' order by 1, 2 desc limit 10; + b | t +-----+--- + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 +(10 rows) + +-- Queries without motion node on the partitioned table +-- start_ignore +drop table if exists abbp; +drop table if exists b; +-- end_ignore +create table abbp( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b (a int, b int, k int, t text, p int); +insert into abbp select i, i, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 1000) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 1000) i; +analyze abbp; +analyze b; +select qx_count_operator('select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6;', 'Hash Right Join', 'Hash Left Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6 order by 1, 2 desc limit 10; + k | t +----+--------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 16 | 16SOME NUMBER SOME NUMBER + 16 | 16SOME NUMBER SOME NUMBER + 16 | 16SOME NUMBER SOME NUMBER + 26 | 26SOME NUMBER SOME NUMBER + 26 | 26SOME NUMBER SOME NUMBER + 26 | 26SOME NUMBER SOME NUMBER + 36 | 36SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = 6;', 'Hash Right Join', 'Hash Left Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = 6 order by 1, 2 asc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(3 rows) + +-- Partitioned tables with decimal type distribution keys +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore +create table foo_p ( a decimal(10,2) , b int, k decimal(10,2), t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar ( a decimal(10, 2), b int, k decimal(10,2), t text, p int) ; +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar; +select qx_count_operator('select foo_p.k, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.k, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + k | t +------+-------------------------- + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6.00;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6.00 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +-- Partitioned tables with character type distribution keys used in predicates +-- start_ignore +drop table if exists abbp; +drop table if exists b; +-- end_ignore +create table abbp ( a character varying(60), b int, k character varying(60), t int, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b ( a character varying(60), b int, k character varying(60), t int, p int) ; +insert into abbp select i || 'SOME NUMBER', i, i || 'SN SN', i, i%10 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 100)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +analyze abbp; +analyze b; +select qx_count_operator('select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6 order by 1, 2 asc limit 10; + k | t +----------+----- + 106SN SN | 106 + 116SN SN | 116 + 126SN SN | 126 + 136SN SN | 136 + 146SN SN | 146 + 156SN SN | 156 + 166SN SN | 166 + 16SN SN | 16 + 176SN SN | 176 + 186SN SN | 186 +(10 rows) + +select qx_count_operator('select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = E''6SOME NUMBER''', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = '6SOME NUMBER' order by 1, 2 asc limit 10; + b | t +---+--- + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 +(10 rows) + +-- Partitioned tables on both sides of a join +-- start_ignore +drop table if exists foo_p; +drop table if exists bar_p; +NOTICE: table "bar_p" does not exist, skipping +-- end_ignore +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar_p; +select qx_count_operator('select foo_p.k, foo_p.t from foo_p left outer join bar_p on foo_p.k = bar_p.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.k, foo_p.t from foo_p left outer join bar_p on foo_p.k = bar_p.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + k | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2 asc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 14;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 14 order by 1, 2 desc limit 10; + b | t +---+--- +(0 rows) + +select qx_count_operator('select bar_p.a, foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select bar_p.a, foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2, 3 asc limit 10; + a | b | t +---+---+-------------------------- + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4 order by 1, 2 asc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.b where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.b where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4 order by 1, 2 asc limit 10; + b | t +---+--- +(0 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.b = bar_p.b where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.b = bar_p.b where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER +(1 row) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6 order by 1, 2 asc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +-- Queries where equality predicate is not an immediate constant +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar( a int, b int, k int, t text, p int); +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar; +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1];', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1] order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER +(10 rows) + +create function mytest(integer) returns integer as 'select $1/100' language sql; +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = mytest(100);', 'Hash Right Join', 'Hash Right Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = mytest(100) order by 1, 2 asc limit 10; + b | t +---+-------------------------- + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER +(10 rows) + +drop function if exists mytest(integer); +-- Repeat test cases with inner join instead of inner join: C87849 (Queries with inner join) +-- Redistribute on top of Append with flow node +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar( a int, b int, k int, t text, p int); +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar; +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.k, foo_p.t from foo_p inner join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.k, foo_p.t from foo_p inner join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + k | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +-- Varchar in the select list with redistribute on top of an append with flow node +-- start_ignore +drop table if exists a_p; +NOTICE: table "a_p" does not exist, skipping +drop table if exists bar; +-- end_ignore +create table a_p ( a character varying(60), b character varying(60), k character varying(60), t int, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b ( a character varying(60), b character varying(60), k character varying(60), t int, p int) ; +ERROR: relation "b" already exists +insert into a_p select i || 'SOME NUMBER', i || 'SN', i || 'SN SN', i, i%10 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN', i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 100)i; +ERROR: column "b" is of type integer but expression is of type text +LINE 1: insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN', i ... + ^ +HINT: You will need to rewrite or cast the expression. +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +ERROR: column "b" is of type integer but expression is of type text +LINE 1: insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i... + ^ +HINT: You will need to rewrite or cast the expression. +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +ERROR: column "b" is of type integer but expression is of type text +LINE 1: insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i... + ^ +HINT: You will need to rewrite or cast the expression. +analyze a_p; +analyze b; +select qx_count_operator('select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6 order by 1, 2 desc limit 10; + k | t +---+--- +(0 rows) + +select qx_count_operator('select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = E''6SOME NUMBER''', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = '6SOME NUMBER' order by 1, 2 desc limit 10; + b | t +-----+--- + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 + 6SN | 6 +(10 rows) + +-- Queries without motion node on the partitioned table +-- start_ignore +drop table if exists a_p; +drop table if exists b; +-- end_ignore +create table a_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b (a int, b int, k int, t text, p int); +insert into a_p select i, i, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 1000) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 1000) i; +analyze a_p; +analyze b; +select qx_count_operator('select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6 order by 1, 2 desc limit 10; + k | t +----+--------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 16 | 16SOME NUMBER SOME NUMBER + 16 | 16SOME NUMBER SOME NUMBER + 16 | 16SOME NUMBER SOME NUMBER + 26 | 26SOME NUMBER SOME NUMBER + 26 | 26SOME NUMBER SOME NUMBER + 26 | 26SOME NUMBER SOME NUMBER + 36 | 36SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = 6;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = 6 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(3 rows) + +-- Partitioned tables with decimal type distribution keys +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +NOTICE: table "bar" does not exist, skipping +-- end_ignore +create table foo_p ( a decimal(10,2) , b int, k decimal(10,2), t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar ( a decimal(10, 2), b int, k decimal(10,2), t text, p int) ; +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar; +select qx_count_operator('select foo_p.k, foo_p.t from foo_p inner join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.k, foo_p.t from foo_p inner join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + k | t +------+-------------------------- + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER + 6.00 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6.00;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6.00 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +-- Partitioned tables with character type distribution keys used in predicates +-- start_ignore +drop table if exists a_p; +drop table if exists b; +-- end_ignore +create table a_p ( a character varying(60), b int, k character varying(60), t int, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b ( a character varying(60), b int, k character varying(60), t int, p int) ; +insert into a_p select i || 'SOME NUMBER', i, i || 'SN SN', i, i%10 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 100)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +analyze a_p; +analyze b; +select qx_count_operator('select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6 order by 1, 2 asc limit 10; + k | t +---+--- +(0 rows) + +select qx_count_operator('select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = E''6SOME NUMBER''', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = '6SOME NUMBER' order by 1, 2 asc limit 10; + b | t +---+--- + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 + 6 | 6 +(10 rows) + +-- Partitioned tables on both sides of a join +-- start_ignore +drop table if exists foo_p; +drop table if exists bar_p; +-- end_ignore +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar_p; +select qx_count_operator('select foo_p.k, foo_p.t from foo_p inner join bar_p on foo_p.k = bar_p.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.k, foo_p.t from foo_p inner join bar_p on foo_p.k = bar_p.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + k | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 14;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 14 order by 1, 2 asc limit 10; + b | t +---+--- +(0 rows) + +select qx_count_operator('select bar_p.a, foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select bar_p.a, foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2, 3 desc limit 10; + a | b | t +---+---+-------------------------- + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER + 0 | 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4 order by 1, 2 asc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.b where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.b where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4 order by 1, 2 desc limit 10; + b | t +---+--- +(0 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.b = bar_p.b where foo_p.t is not null and foo_p.a = 6;', 'Hash Join', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.b = bar_p.b where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + b | t +---+--- +(0 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6 order by 1, 2 asc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER + 6 | 6SOME NUMBER SOME NUMBER +(10 rows) + +-- Queries where equality predicate is not an immediate constant +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar( a int, b int, k int, t text, p int); +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +analyze foo_p; +analyze bar; +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1];', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1] order by 1, 2 asc limit 10; + b | t +---+-------------------------- + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER +(10 rows) + +create function mytest(integer) returns integer as 'select $1/100' language sql; +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = mytest(100);', 'Nested Loop', 'Hash Join'); + qx_count_operator +------------------- + 1 +(1 row) + +select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = mytest(100) order by 1, 2 desc limit 10; + b | t +---+-------------------------- + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER + 1 | 1SOME NUMBER SOME NUMBER +(10 rows) + +drop function if exists mytest(integer); diff --git a/src/test/singlenode_regress/expected/qp_union_intersect.out b/src/test/singlenode_regress/expected/qp_union_intersect.out new file mode 100644 index 00000000000..42e76ab0f39 --- /dev/null +++ b/src/test/singlenode_regress/expected/qp_union_intersect.out @@ -0,0 +1,2091 @@ +-- Create common test tables +-- +-- All the test statements use these same test tables. To avoid having to +-- re-create them for every test, all the actual tests are wrapped in +-- begin-rollback blocks (except a few that throw an ERROR, and will +-- therefore roll back implicitly anyway). The purpose of these tests is to +-- exercise planner, so it doesn't matter that the changes are rolled back +-- afterwards. +-- start_matchsubs +-- m/DETAIL: Failing row contains \(.*\)/ +-- s/DETAIL: Failing row contains \(.*\)/DETAIL: Failing row contains (#####)/ +-- end_matchsubs +begin; +CREATE TABLE dml_union_r ( + a int CONSTRAINT r_check_a CHECK(a <> -1), + b int, + c text, + d numeric) +; +CREATE TABLE dml_union_s ( + a int , + b int not NULL, + c text , + d numeric default 10.00) +PARTITION BY range(d); +CREATE TABLE dml_union_s_1_prt_2 PARTITION OF dml_union_s FOR VALUES FROM (1) TO (1001); +CREATE TABLE dml_union_s_1_prt_3 PARTITION OF dml_union_s FOR VALUES FROM (1001) TO (1101); +CREATE TABLE dml_union_s_1_prt_4 PARTITION OF dml_union_s FOR VALUES FROM (1101) TO (1201); +CREATE TABLE dml_union_s_1_prt_5 PARTITION OF dml_union_s FOR VALUES FROM (1201) TO (1301); +CREATE TABLE dml_union_s_1_prt_6 PARTITION OF dml_union_s FOR VALUES FROM (1301) TO (1401); +CREATE TABLE dml_union_s_1_prt_7 PARTITION OF dml_union_s FOR VALUES FROM (1401) TO (1501); +CREATE TABLE dml_union_s_1_prt_8 PARTITION OF dml_union_s FOR VALUES FROM (1501) TO (1601); +CREATE TABLE dml_union_s_1_prt_9 PARTITION OF dml_union_s FOR VALUES FROM (1601) TO (1701); +CREATE TABLE dml_union_s_1_prt_10 PARTITION OF dml_union_s FOR VALUES FROM (1701) TO (1801); +CREATE TABLE dml_union_s_1_prt_11 PARTITION OF dml_union_s FOR VALUES FROM (1801) TO (1901); +CREATE TABLE dml_union_s_1_prt_def PARTITION OF dml_union_s DEFAULT; +INSERT INTO dml_union_r SELECT generate_series(1,100), generate_series(1,100) * 3,'r', generate_series(1,100) % 6; +INSERT INTO dml_union_r VALUES(NULL,NULL,'text',NULL),(NULL,NULL,'text',NULL),(NULL,NULL,'text',NULL),(NULL,NULL,'text',NULL),(NULL,NULL,'text',NULL); +INSERT INTO dml_union_r VALUES(1,1,'text',1),(2,2,'text',2),(3,3,'text',3),(4,4,'text',4),(5,5,'text',5); +INSERT INTO dml_union_r VALUES(1,1,'text',1),(2,2,'text',2),(3,3,'text',3),(4,4,'text',4),(5,5,'text',5); +INSERT INTO dml_union_r VALUES(1,2,'text',3),(2,3,'text',4),(3,4,'text',5),(4,5,'text',6),(5,6,'text',7); +INSERT INTO dml_union_s SELECT generate_series(1,100), generate_series(1,100) * 3,'s', generate_series(1,100) ; +INSERT INTO dml_union_s VALUES(1,1,'text',1),(2,2,'text',2),(3,3,'text',3),(4,4,'text',4),(5,5,'text',5); +INSERT INTO dml_union_s VALUES(1,1,'text',1),(2,2,'text',2),(3,3,'text',3),(4,4,'text',4),(5,5,'text',5); +INSERT INTO dml_union_s VALUES(1,2,'text',3),(2,3,'text',4),(3,4,'text',5),(4,5,'text',6),(5,6,'text',7); +commit; +-- @description union_test1: INSERT and INTERSECT operation +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r INTERSECT SELECT dml_union_s.* FROM dml_union_s)foo; + count +------- + 10 +(1 row) + +INSERT INTO dml_union_r SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r INTERSECT SELECT dml_union_s.* FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 130 +(1 row) + +rollback; +-- @description union_test2: INSERT and INTERSECT operation +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT dml_union_r.* FROM dml_union_r INTERSECT ALL SELECT dml_union_s.a, dml_union_s.b, dml_union_s.c, dml_union_s.d FROM dml_union_s)foo; + count +------- + 15 +(1 row) + +INSERT INTO dml_union_r SELECT dml_union_r.* FROM dml_union_r INTERSECT ALL SELECT dml_union_s.a, dml_union_s.b, dml_union_s.c, dml_union_s.d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 135 +(1 row) + +rollback; +-- @description union_test3: INTERSECT with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT generate_series(1,10) INTERSECT SELECT generate_series(1,100))foo; + count +------- + 10 +(1 row) + +INSERT INTO dml_union_r SELECT generate_series(1,10) INTERSECT SELECT generate_series(1,100); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 130 +(1 row) + +rollback; +-- @description union_test4: INTERSECT with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT generate_series(1,10) INTERSECT ALL SELECT generate_series(1,100))foo; + count +------- + 10 +(1 row) + +INSERT INTO dml_union_r SELECT generate_series(1,10) INTERSECT ALL SELECT generate_series(1,100); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 130 +(1 row) + +rollback; +-- @description union_test5: INTERSECT with constants +begin; +SELECT COUNT(*) FROM dml_union_s; + count +------- + 115 +(1 row) + +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b,'A' as c, 0 as d FROM dml_union_r INTERSECT SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s)foo; + count +------- + 110 +(1 row) + +INSERT INTO dml_union_s (SELECT dml_union_r.a, dml_union_r.b,'A' as c, 0 as d FROM dml_union_r INTERSECT SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_s; + count +------- + 225 +(1 row) + +rollback; +-- @description union_test6: INTERSECT with constants +begin; +SELECT COUNT(*) FROM dml_union_s; + count +------- + 115 +(1 row) + +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b,'A' as c ,0 as d FROM dml_union_r INTERSECT ALL SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s)foo; + count +------- + 115 +(1 row) + +INSERT INTO dml_union_s (SELECT dml_union_r.a, dml_union_r.b,'A' as c ,0 as d FROM dml_union_r INTERSECT ALL SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_s; + count +------- + 230 +(1 row) + +rollback; +-- @description union_test7: INTERSECT with DISTINCT +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r INTERSECT SELECT distinct a,b,c,d FROM dml_union_s)foo; + count +------- + 10 +(1 row) + +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r INTERSECT SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 130 +(1 row) + +rollback; +-- @description union_test8: INTERSECT with DISTINCT +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r INTERSECT ALL SELECT distinct a,b,c,d FROM dml_union_s)foo; + count +------- + 10 +(1 row) + +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r INTERSECT ALL SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 130 +(1 row) + +rollback; +-- @description union_test9: INSERT and EXCEPT operation +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r EXCEPT SELECT * FROM dml_union_s)foo; + count +------- + 101 +(1 row) + +INSERT INTO dml_union_r SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r EXCEPT SELECT * FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 221 +(1 row) + +rollback; +-- @description union_test10: INSERT and EXCEPT operation +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM dml_union_r EXCEPT ALL SELECT dml_union_s.* FROM dml_union_s)foo; + count +------- + 105 +(1 row) + +INSERT INTO dml_union_r SELECT * FROM dml_union_r EXCEPT ALL SELECT dml_union_s.* FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 225 +(1 row) + +rollback; +-- @description union_test12: EXCEPT with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT generate_series(1,10) EXCEPT ALL SELECT generate_series(1,10))foo; + count +------- + 0 +(1 row) + +INSERT INTO dml_union_r SELECT generate_series(1,10) EXCEPT ALL SELECT generate_series(1,10); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_test13: EXCEPT with predicate +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM (SELECT * FROM dml_union_r EXCEPT ALL SELECT * FROM dml_union_s) foo WHERE c='text')bar; + count +------- + 5 +(1 row) + +INSERT INTO dml_union_r SELECT * FROM (SELECT * FROM dml_union_r EXCEPT ALL SELECT * FROM dml_union_s) foo WHERE c='text'; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 125 +(1 row) + +rollback; +-- @description union_test14: EXCEPT with predicate (returns 0 rows) +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM (SELECT * FROM dml_union_r EXCEPT SELECT * FROM dml_union_s) foo WHERE c='s')bar; + count +------- + 0 +(1 row) + +INSERT INTO dml_union_r SELECT * FROM (SELECT * FROM dml_union_r EXCEPT SELECT * FROM dml_union_s) foo WHERE c='s'; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_test15: EXCEPT with constants +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b,'A' as c ,0 as d FROM dml_union_r EXCEPT ALL SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s)foo; + count +------- + 5 +(1 row) + +INSERT INTO dml_union_r (SELECT dml_union_r.a, dml_union_r.b,'A' as c ,0 as d FROM dml_union_r EXCEPT ALL SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 125 +(1 row) + +rollback; +-- @description union_test16: EXCEPT with distinct +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r EXCEPT SELECT distinct a,b,c,d FROM dml_union_s)foo; + count +------- + 101 +(1 row) + +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r EXCEPT SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 221 +(1 row) + +rollback; +-- @description union_test17: EXCEPT with distinct +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r EXCEPT ALL SELECT distinct a,b,c,d FROM dml_union_s)foo; + count +------- + 101 +(1 row) + +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r EXCEPT ALL SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 221 +(1 row) + +rollback; +-- @description union_test18: INSERT and UNION operation +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r UNION SELECT dml_union_s.* FROM dml_union_s)foo; + count +------- + 211 +(1 row) + +INSERT INTO dml_union_r SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r UNION SELECT dml_union_s.* FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 331 +(1 row) + +rollback; +-- @description union_test19: INSERT and UNION operation +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT dml_union_r.* FROM dml_union_r UNION All SELECT * FROM dml_union_s)foo; + count +------- + 235 +(1 row) + +INSERT INTO dml_union_r SELECT dml_union_r.* FROM dml_union_r UNION All SELECT * FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 355 +(1 row) + +rollback; +-- @description union_test20: UNION with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT generate_series(1,10) UNION SELECT generate_series(1,10))foo; + count +------- + 10 +(1 row) + +INSERT INTO dml_union_r SELECT generate_series(1,10) UNION SELECT generate_series(1,10); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 130 +(1 row) + +rollback; +-- @description union_test21: UNION with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT generate_series(1,10) UNION ALL SELECT generate_series(1,10))foo; + count +------- + 20 +(1 row) + +INSERT INTO dml_union_r SELECT generate_series(1,10) UNION ALL SELECT generate_series(1,10); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 140 +(1 row) + +rollback; +-- @description union_test22: UNION with limit +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM dml_union_r UNION ALL SELECT * FROM dml_union_s ORDER BY 1,2,3,4) foo LIMIT 10; + count +------- + 235 +(1 row) + +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +INSERT INTO dml_union_r SELECT * FROM (SELECT * FROM dml_union_r UNION ALL SELECT * FROM dml_union_s ORDER BY 1,2,3,4) foo LIMIT 10; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 130 +(1 row) + +rollback; +-- @description union_test23: UNION with dml_union_sub-query in SELECT +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT NULL,(SELECT NULL f1 FROM dml_union_r UNION SELECT NULL f1 FROM dml_union_s)::int, 'nullval',NULL)foo; + count +------- + 1 +(1 row) + +INSERT INTO dml_union_r SELECT NULL,(SELECT NULL f1 FROM dml_union_r UNION SELECT NULL f1 FROM dml_union_s)::int, 'nullval',NULL; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 121 +(1 row) + +rollback; +-- @description union_test24: UNION with exists +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT AVG(a),10,'avg',10 FROM dml_union_r WHERE exists (SELECT a FROM dml_union_r UNION ALL SELECT b FROM dml_union_s))foo; + count +------- + 1 +(1 row) + +INSERT INTO dml_union_r SELECT AVG(a),10,'avg',10 FROM dml_union_r WHERE exists (SELECT a FROM dml_union_r UNION ALL SELECT b FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 121 +(1 row) + +rollback; +-- @description union_test25: UNION with DISTINCT +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r UNION SELECT distinct a,b,c,d FROM dml_union_s)foo; + count +------- + 211 +(1 row) + +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r UNION SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 331 +(1 row) + +rollback; +-- @description union_test26: UNION with AGGREGATE +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM (SELECT AVG(a) as a FROM dml_union_r UNION SELECT AVG(b) as a FROM dml_union_s) foo)bar; + count +------- + 2 +(1 row) + +INSERT INTO dml_union_r SELECT * FROM (SELECT AVG(a) as a FROM dml_union_r UNION SELECT AVG(b) as a FROM dml_union_s) foo; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 122 +(1 row) + +rollback; +-- @description union_test27: Negative tests VIOLATES NULL VALUE CONSTRAINT +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM ( SELECT * FROM (SELECT * FROM dml_union_r EXCEPT SELECT * FROM dml_union_s ) foo WHERE c='text')bar; + count +------- + 1 +(1 row) + +INSERT INTO dml_union_s SELECT * FROM (SELECT * FROM dml_union_r EXCEPT SELECT * FROM dml_union_s) foo WHERE c='text'; +ERROR: null value in column "b" of relation "dml_union_s_1_prt_def" violates not-null constraint +DETAIL: Failing row contains (null, null, text, null). +--SELECT COUNT(*) FROM dml_union_r; +-- @description union_test28: Negative tests MORE THAN ONE ROW RETURNED +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +INSERT INTO dml_union_r SELECT (SELECT dml_union_r.d::int FROM dml_union_r INTERSECT SELECT dml_union_s.d FROM dml_union_s ORDER BY 1),1,'newval',1.000; +ERROR: more than one row returned by a subquery used as an expression +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +-- @description union_test29: INSERT NON ATOMICS with union/intersect/except +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +-- GPDB_12_MERGE_FIXME: ORCA doesn't produce the right intersect plan +set optimizer=off; +SELECT COUNT(*) FROM (SELECT dml_union_r.* FROM dml_union_r INTERSECT (SELECT dml_union_r.* FROM dml_union_r UNION ALL SELECT dml_union_s.* FROM dml_union_s) EXCEPT SELECT dml_union_s.* FROM dml_union_s)foo; + count +------- + 101 +(1 row) + +INSERT INTO dml_union_r SELECT dml_union_r.* FROM dml_union_r INTERSECT (SELECT dml_union_r.* FROM dml_union_r UNION ALL SELECT dml_union_s.* FROM dml_union_s) EXCEPT SELECT dml_union_s.* FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 221 +(1 row) + +reset optimizer; +rollback; +-- @description union_test30: INSERT NON ATOMICS with union/intersect/except +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT c,c+1,case when c = 1 then 'r' else 's' end,c+1 FROM ( SELECT COUNT(distinct c) c FROM (SELECT f1, f2 , COUNT(*) c FROM (SELECT 10 f1, 'r' f2 FROM dml_union_r UNION SELECT 40 f1, 's' f2 FROM dml_union_r UNION SELECT a, c FROM dml_union_r INTERSECT SELECT a, c FROM dml_union_s ORDER BY 1) foo group by f1,f2) foo)foo)bar; + count +------- + 1 +(1 row) + +INSERT INTO dml_union_r SELECT c,c+1,case when c = 1 then 'r' else 's' end,c+1 FROM (SELECT COUNT(distinct c) c FROM (SELECT f1, f2 , COUNT(*) c FROM (SELECT 10 f1, 'r' f2 FROM dml_union_r UNION SELECT 40 f1, 's' f2 FROM dml_union_r UNION SELECT a, c FROM dml_union_r INTERSECT SELECT a, c FROM dml_union_s ORDER BY 1) foo group by f1,f2) foo)foo; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 121 +(1 row) + +rollback; +-- @description union_test31: INSERT NON ATOMICS with union/intersect/except +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM dml_union_r WHERE a in (SELECT dml_union_r.d::int FROM dml_union_r INTERSECT SELECT dml_union_s.d FROM dml_union_s ORDER BY 1) UNION SELECT * FROM dml_union_s)bar; + count +------- + 117 +(1 row) + +INSERT INTO dml_union_r SELECT * FROM dml_union_r WHERE a in (SELECT dml_union_r.d::int FROM dml_union_r INTERSECT SELECT dml_union_s.d FROM dml_union_s ORDER BY 1) UNION SELECT * FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 237 +(1 row) + +rollback; +-- @description union_delete_test1: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 5 +(1 row) + +rollback; +-- @description union_delete_test2: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 5 +(1 row) + +rollback; +-- @description union_delete_test3: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r INTERSECT SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 5 +(1 row) + +rollback; +-- @description union_delete_test4: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r INTERSECT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 5 +(1 row) + +rollback; +-- @description union_delete_test5: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r EXCEPT SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_delete_test6: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_delete_test7: With UNION/INTERSECT/EXCEPT in the predicate condition ( 0 rows) +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a = (SELECT NULL UNION SELECT NULL)::int; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_delete_test8: With UNION/INTERSECT/EXCEPT in the predicate condition ( 0 rows ) +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a = (SELECT NULL INTERSECT SELECT NULL)::int; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_delete_test9: With UNION/INTERSECT/EXCEPT in the predicate condition( 0 rows ) +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a = (SELECT NULL EXCEPT SELECT NULL)::int; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_delete_test10: With UNION/INTERSECT/EXCEPT in the predicate condition +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a = (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s ORDER BY a LIMIT 1); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 116 +(1 row) + +rollback; +-- @description union_delete_test11: With UNION/INTERSECT/EXCEPT in the predicate condition +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a = (SELECT a FROM dml_union_r INTERSECT SELECT a FROM dml_union_s ORDER BY a LIMIT 1); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 116 +(1 row) + +rollback; +-- @description union_delete_test12: With UNION/INTERSECT/EXCEPT in the predicate condition +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r WHERE a = (SELECT a FROM dml_union_r EXCEPT SELECT a FROM dml_union_s ORDER BY a LIMIT 1); +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_delete_test13: With UNION/INTERSECT/EXCEPT +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r USING (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s) foo WHERE foo.a = dml_union_r.a; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 5 +(1 row) + +rollback; +-- @description union_delete_test14: With UNION/INTERSECT/EXCEPT +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r USING (SELECT a FROM dml_union_r INTERSECT SELECT a FROM dml_union_s) foo WHERE foo.a = dml_union_r.a; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 5 +(1 row) + +rollback; +-- @description union_delete_test15: With UNION/INTERSECT/EXCEPT +begin; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +DELETE FROM dml_union_r USING (SELECT a FROM dml_union_r EXCEPT SELECT a FROM dml_union_s) foo WHERE foo.a = dml_union_r.a; +SELECT COUNT(*) FROM dml_union_r; + count +------- + 120 +(1 row) + +rollback; +-- @description union_delete_test16: Using Partition table +begin; +SELECT COUNT(*) FROM dml_union_s; + count +------- + 115 +(1 row) + +DELETE FROM dml_union_s USING (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s_1_prt_def) foo; +SELECT COUNT(*) FROM dml_union_s; + count +------- + 0 +(1 row) + +rollback; +-- @description union_delete_test17: Using Partition table +begin; +SELECT COUNT(*) FROM dml_union_s; + count +------- + 115 +(1 row) + +DELETE FROM dml_union_s USING (SELECT * FROM dml_union_r UNION SELECT * FROM dml_union_s_1_prt_def) foo WHERE foo.d = dml_union_s.d; +SELECT COUNT(*) FROM dml_union_s; + count +------- + 93 +(1 row) + +rollback; +-- @description union_update_test1: Update distribution column with UNION +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s ORDER BY 1 LIMIT 1; + a +--- + 1 +(1 row) + +UPDATE dml_union_r SET a = (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s ORDER BY 1 LIMIT 1); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 1 +(1 row) + +rollback; +-- @description union_update_test2: Update distribution column with UNION +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +UPDATE dml_union_r SET a = (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s ORDER BY 1 LIMIT 1); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 1 +(1 row) + +SELECT DISTINCT(a) FROM dml_union_r; + a +--- + 1 +(1 row) + +rollback; +-- @description union_update_test3: Update distribution column with INTERSECT +begin; +SELECT COUNT(*) FROM dml_union_r WHERE a = 1; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM (SELECT a FROM dml_union_r order by a limit 1) foo INTERSECT SELECT a FROM dml_union_s)bar; + count +------- + 1 +(1 row) + +UPDATE dml_union_r SET a = ( SELECT * FROM (SELECT a FROM dml_union_r order by a limit 1) foo INTERSECT SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE a = 1; + count +------- + 120 +(1 row) + +rollback; +-- @description union_update_test4: Update distribution column with INTERSECT +begin; +SELECT COUNT(*) FROM dml_union_r WHERE a = 1; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM (SELECT a FROM dml_union_r ORDER BY 1 limit 1) foo INTERSECT ALL SELECT a FROM dml_union_s)bar; + count +------- + 1 +(1 row) + +UPDATE dml_union_r SET a = ( SELECT * FROM (SELECT a FROM dml_union_r ORDER BY 1 limit 1) foo INTERSECT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE a = 1; + count +------- + 120 +(1 row) + +rollback; +-- @description union_update_test5: Update distribution column with EXCEPT +begin; +SELECT SUM(a) FROM dml_union_r; + sum +------ + 5095 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM (SELECT a FROM dml_union_r limit 1) foo EXCEPT SELECT a FROM dml_union_s)bar; + count +------- + 0 +(1 row) + +UPDATE dml_union_r SET a = ( SELECT * FROM (SELECT a FROM dml_union_r limit 1) foo EXCEPT SELECT a FROM dml_union_s); +SELECT SUM(a) FROM dml_union_r; + sum +----- + +(1 row) + +rollback; +-- @description union_update_test6: Update distribution column with EXCEPT +begin; +UPDATE dml_union_r SET a = ( SELECT * FROM (SELECT a FROM dml_union_r limit 1) foo EXCEPT ALL SELECT a FROM dml_union_s); +SELECT DISTINCT(a) FROM dml_union_r; + a +--- + +(1 row) + +rollback; +-- @description union_update_test7: NULL values to distribution key +begin; +UPDATE dml_union_r SET a = (SELECT NULL UNION SELECT NULL)::int; +SELECT DISTINCT(a) FROM dml_union_r; + a +--- + +(1 row) + +rollback; +-- @description union_update_test8: NULL values to distribution key +begin; +UPDATE dml_union_r SET a = (SELECT NULL INTERSECT SELECT NULL)::int; +SELECT DISTINCT(a) FROM dml_union_r; + a +--- + +(1 row) + +rollback; +-- @description union_update_test9: NULL values to distribution key +begin; +UPDATE dml_union_r SET a = (SELECT NULL INTERSECT ALL SELECT NULL)::int; +SELECT DISTINCT(a) FROM dml_union_r; + a +--- + +(1 row) + +rollback; +-- @description union_update_test10: NULL values to distribution key +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +UPDATE dml_union_r SET a = (SELECT NULL EXCEPT SELECT NULL)::int; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 0 +(1 row) + +rollback; +-- @description union_update_test11: NULL values to text +begin; +SELECT COUNT(DISTINCT(c)) FROM dml_union_r; + count +------- + 2 +(1 row) + +UPDATE dml_union_r SET c = (SELECT NULL EXCEPT ALL SELECT NULL); +SELECT COUNT(DISTINCT(c)) FROM dml_union_r; + count +------- + 0 +(1 row) + +rollback; +-- @description union_update_test12: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 100 +(1 row) + +UPDATE dml_union_s SET d = (SELECT NULL UNION SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 0 +(1 row) + +rollback; +-- @description union_update_test13: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 100 +(1 row) + +UPDATE dml_union_s SET d = (SELECT NULL INTERSECT SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 0 +(1 row) + +rollback; +-- @description union_update_test14: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 100 +(1 row) + +UPDATE dml_union_s SET d = (SELECT NULL INTERSECT ALL SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 0 +(1 row) + +rollback; +-- @description union_update_test15: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 100 +(1 row) + +UPDATE dml_union_s SET d = (SELECT NULL EXCEPT SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 0 +(1 row) + +rollback; +-- @description union_update_test16: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 100 +(1 row) + +UPDATE dml_union_s SET d = (SELECT NULL EXCEPT ALL SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 0 +(1 row) + +rollback; +-- @description union_update_test17: Update partition key to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; + count +------- + 0 +(1 row) + +SELECT COUNT(*) FROM (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s)foo; + count +------- + 235 +(1 row) + +UPDATE dml_union_r SET d = 20000 WHERE a in (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; + count +------- + 115 +(1 row) + +rollback; +-- @description union_update_test18: Update partition key to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; + count +------- + 0 +(1 row) + +SELECT COUNT(*) FROM (SELECT a FROM dml_union_r INTERSECT ALL SELECT a FROM dml_union_s)foo; + count +------- + 115 +(1 row) + +UPDATE dml_union_r SET d = 20000 WHERE a in (SELECT a FROM dml_union_r INTERSECT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; + count +------- + 115 +(1 row) + +rollback; +-- @description union_update_test19: Update partition key to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; + count +------- + 0 +(1 row) + +SELECT COUNT(*) FROM (SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s)foo; + count +------- + 5 +(1 row) + +UPDATE dml_union_r SET d = 20000 WHERE a in (SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; + count +------- + 0 +(1 row) + +rollback; +-- we don't have the same issue greenplum has in single node mode, behave like pg. +-- start_ignore +-- @description union_update_test20: UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +UPDATE dml_union_r SET a = dml_union_s.a FROM dml_union_s WHERE dml_union_r.b in (SELECT b FROM dml_union_r UNION SELECT b FROM dml_union_s); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 1 +(1 row) + +rollback; +-- end_ignore +-- @description union_update_test21: UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +UPDATE dml_union_r SET a = dml_union_r.a WHERE b in (SELECT b FROM dml_union_r INTERSECT SELECT b FROM dml_union_s); +SELECT DISTINCT(a) FROM dml_union_r; + a +----- + 49 + 35 + 30 + 13 + 37 + 33 + 72 + 17 + 1 + 48 + 51 + 31 + 86 + 34 + 70 + 2 + 71 + 15 + 69 + 36 + 29 + 28 + 63 + 16 + 83 + 52 + 85 + 68 + 50 + 14 + 84 + 20 + 40 + 5 + 91 + 56 + 42 + 19 + 18 + 57 + 54 + 22 + 89 + 75 + 53 + 6 + 39 + 7 + 77 + 76 + 41 + 38 + 96 + 90 + 21 + 4 + 73 + 97 + + 3 + 88 + 55 + 87 + 74 + 23 + 78 + 24 + 67 + 66 + 11 + 10 + 60 + 45 + 27 + 100 + 12 + 80 + 79 + 46 + 44 + 82 + 59 + 62 + 47 + 65 + 92 + 61 + 8 + 43 + 95 + 93 + 64 + 94 + 26 + 58 + 25 + 99 + 98 + 9 + 81 + 32 +(101 rows) + +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +rollback; +-- @description union_update_test22: UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +UPDATE dml_union_r SET a = dml_union_r.a WHERE b in (SELECT b FROM dml_union_r EXCEPT SELECT b FROM dml_union_s); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +SELECT DISTINCT(a) FROM dml_union_r; + a +----- + 23 + 78 + 24 + 67 + 66 + 11 + 10 + 60 + 45 + 27 + 100 + 12 + 80 + 79 + 46 + 44 + 82 + 59 + 62 + 47 + 65 + 92 + 61 + 8 + 43 + 95 + 93 + 64 + 94 + 26 + 58 + 25 + 99 + 98 + 9 + 81 + 32 + 49 + 35 + 30 + 13 + 37 + 33 + 72 + 17 + 1 + 48 + 51 + 31 + 86 + 34 + 70 + 2 + 71 + 15 + 69 + 36 + 29 + 28 + 63 + 16 + 83 + 52 + 85 + 68 + 50 + 14 + 84 + 20 + 40 + 5 + 91 + 56 + 42 + 19 + 18 + 57 + 54 + 22 + 89 + 75 + 53 + 6 + 39 + 7 + 77 + 76 + 41 + 38 + 96 + 90 + 21 + 4 + 73 + 97 + + 3 + 88 + 55 + 87 + 74 +(101 rows) + +rollback; +-- @description union_update_test23: Update distribution column to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; + count +------- + 0 +(1 row) + +UPDATE dml_union_r SET a = 0 WHERE a in (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; + count +------- + 115 +(1 row) + +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 1 +(1 row) + +rollback; +-- @description union_update_test24: Update distribution column to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; + count +------- + 0 +(1 row) + +UPDATE dml_union_r SET a = 0 WHERE a in (SELECT a FROM dml_union_r INTERSECT ALL SELECT a FROM dml_union_s); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 1 +(1 row) + +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; + count +------- + 115 +(1 row) + +rollback; +-- @description union_update_test25: Update distribution column to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; + count +------- + 0 +(1 row) + +UPDATE dml_union_r SET a = 0 WHERE a in (SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; + count +------- + 0 +(1 row) + +rollback; +-- @description union_update_test26: Negative Tests Update the partition key to an out of dml_union_range value with no default partition +begin; +DROP TABLE dml_union_s_1_prt_def; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 100 +(1 row) + +UPDATE dml_union_s SET d = (SELECT NULL UNION SELECT NULL)::numeric; +ERROR: no partition of relation "dml_union_s" found for row +DETAIL: Partition key of the failing row contains (d) = (null). +--SELECT DISTINCT(d) FROM dml_union_s; +--SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; +-- @description union_update_test27: Negative Tests Update the partition key to an out of range value with no default partition +begin; +DROP TABLE dml_union_s_1_prt_def; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 100 +(1 row) + +UPDATE dml_union_s SET d = (SELECT NULL INTERSECT SELECT NULL)::numeric; +ERROR: no partition of relation "dml_union_s" found for row +DETAIL: Partition key of the failing row contains (d) = (null). +--SELECT DISTINCT(d) FROM dml_union_s; +--SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; +-- @description union_update_test28: Negative Tests Update the partition key to an out of dml_union_range value with no default partition +begin; +DROP TABLE dml_union_s_1_prt_def; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; + count +------- + 100 +(1 row) + +UPDATE dml_union_s SET d = (SELECT NULL EXCEPT SELECT NULL)::numeric; +ERROR: no partition of relation "dml_union_s" found for row +DETAIL: Partition key of the failing row contains (d) = (null). +--SELECT DISTINCT(d) FROM dml_union_s; +--SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; +-- @description union_update_test29: Negative Tests UPDATE violates the CHECK constraint on the column +SELECT COUNT(DISTINCT(b)) FROM dml_union_s; + count +------- + 104 +(1 row) + +UPDATE dml_union_s SET b = (SELECT NULL UNION SELECT NULL)::numeric; +ERROR: null value in column "b" of relation "dml_union_s_1_prt_2" violates not-null constraint (seg0 127.0.1.1:7002 pid=773223) +DETAIL: Failing row contains (5, null, s, 5). +--SELECT COUNT(DISTINCT(b)) FROM dml_union_s; +--SELECT DISTINCT(b) FROM dml_union_s; +-- @description union_update_test30: Negative Tests more than one row returned by a sub-query used as an expression +-- +-- The access plan of this UPDATE is sensitive to optimizer_segments. With +-- ORCA, the error message varies depending accesss plan; you either get: +-- +-- ERROR: more than one row returned by a subquery used as an expression +-- +-- like with the Postgres planner, or you get: +-- +-- ERROR: one or more assertions failed +-- DETAIL: Expected no more than one row to be returned by expression +-- +-- To make the output stable, arbitrarily fix optimizer_segments to 2, to get the latter. +set optimizer_segments=2; +ANALYZE dml_union_r, dml_union_s; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + count +------- + 100 +(1 row) + +UPDATE dml_union_r SET a = ( SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s); +ERROR: more than one row returned by a subquery used as an expression +reset optimizer_segments; +--SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +-- @description union_update_test31: Negative Tests more than one row returned by a sub-query used as an expression +UPDATE dml_union_r SET b = ( SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s); +ERROR: more than one row returned by a subquery used as an expression +-- +-- Test mixing a set-returning function, which can be evaluated anywhere, +-- (it has General locus) and a diststributed table, in an Append. +-- +explain (costs off) +select a from dml_union_r where a > 95 +union all +select g from generate_series(1,2) g; + QUERY PLAN +------------------------------------------ + Append + -> Seq Scan on dml_union_r + Filter: (a > 95) + -> Function Scan on generate_series g + Optimizer: Postgres query optimizer +(5 rows) + +select a from dml_union_r where a > 95 +union all +select g from generate_series(1,2) g; + a +----- + 96 + 100 + 97 + 99 + 98 + 1 + 2 +(7 rows) + +explain (costs off) +select sum(a) from ( + select a from dml_union_r where a > 95 + union all + select g from generate_series(1,2) g +) t; + QUERY PLAN +------------------------------------------------ + Aggregate + -> Append + -> Seq Scan on dml_union_r + Filter: (a > 95) + -> Function Scan on generate_series g + Optimizer: Postgres query optimizer +(6 rows) + +select sum(a) from ( + select a from dml_union_r where a > 95 + union all + select g from generate_series(1,2) g +) t; + sum +----- + 493 +(1 row) + +-- +-- Continue to test appending General to distributed table. +-- This time, the General is a dummy path, produced by pushing down condition. +-- (Only for planner, orca does not create dummy path here) +-- +create table t_test_append_hash(a int, b int, c int); +insert into t_test_append_hash select i, i+1, i+2 from generate_series(1, 5)i; +explain (costs off) +with t(a, b, s) as ( + select a, b, sum(c) from t_test_append_hash where a > b group by a, b + union all + select a, b, sum(c) from t_test_append_hash where a < b group by a, b +) select * from t where t.a < t.b; + QUERY PLAN +--------------------------------------------------------------- + Append + -> HashAggregate + Group Key: a, b + -> Result + One-Time Filter: false + -> HashAggregate + Group Key: t_test_append_hash.a, t_test_append_hash.b + -> Seq Scan on t_test_append_hash + Filter: ((a < b) AND (a < b)) + Optimizer: Postgres query optimizer +(10 rows) + +with t(a, b, s) as ( + select a, b, sum(c) from t_test_append_hash where a > b group by a, b + union all + select a, b, sum(c) from t_test_append_hash where a < b group by a, b +) select * from t where t.a < t.b; + a | b | s +---+---+--- + 2 | 3 | 4 + 3 | 4 | 5 + 4 | 5 | 6 + 1 | 2 | 3 + 5 | 6 | 7 +(5 rows) + +-- Test mixing a SegmentGeneral with distributed table. +create table t_test_append_rep(a int, b int, c int); +insert into t_test_append_rep select i, i+1, i+2 from generate_series(5, 10)i; +explain (costs off) +select * from t_test_append_rep +union all +select * from t_test_append_hash; + QUERY PLAN +-------------------------------------- + Append + -> Seq Scan on t_test_append_rep + -> Seq Scan on t_test_append_hash + Optimizer: Postgres query optimizer +(4 rows) + +select * from t_test_append_rep +union all +select * from t_test_append_hash; + a | b | c +----+----+---- + 5 | 6 | 7 + 1 | 2 | 3 + 5 | 6 | 7 + 6 | 7 | 8 + 7 | 8 | 9 + 8 | 9 | 10 + 9 | 10 | 11 + 10 | 11 | 12 + 2 | 3 | 4 + 3 | 4 | 5 + 4 | 5 | 6 +(11 rows) + +-- Test value scan union all with a distributed table that direct dispatch +-- value scan's locus is general, so it will use Result plan node with +-- resconstantqual to be gp_execution_segment() = to turn +-- general locus to partitioned locus to avoid gather partitioned locus +-- table to singleQE. When the subplan of partitioned table's scan can +-- use direct dispatch, previously, the result plan does not handle +-- direct dispatch correctly. This case cannot test plan, this is because +-- gp_execution_segment() = the filter segid is randomly picked. +-- So the result plan's direct dispatch info is also random. We print the plan +-- and ignore it for better debugging info if error happens. +-- See github issue https://github.com/greenplum-db/gpdb/issues/9874 for details. +create table t_github_issue_9874 (a int); +-- start_ignore +explain (costs off) +select 1 +union all +select * from t_github_issue_9874 where a = 1; + QUERY PLAN +--------------------------------------- + Append + -> Result + -> Seq Scan on t_github_issue_9874 + Filter: (a = 1) + Optimizer: Postgres query optimizer +(5 rows) + +-- end_ignore +select 1 +union all +select * from t_github_issue_9874 where a = 1; + ?column? +---------- + 1 +(1 row) + +-- +-- Test mixing a SegmentGeneral with distributed table +-- when gp_enable_direct_dispatch is off. +-- +begin; +create table rt1(a int, b int); +create table t1(a int, b int); +insert into t1 select i, i+1 from generate_series(6, 9) i; +insert into rt1 select i, i+1 from generate_series(1, 5) i; +set local gp_enable_direct_dispatch = on; +explain(costs off) select * from rt1 union all select * from t1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on rt1 + -> Seq Scan on t1 + Optimizer: Postgres query optimizer +(4 rows) + +select * from rt1 union all select * from t1; + a | b +---+---- + 7 | 8 + 8 | 9 + 1 | 2 + 2 | 3 + 3 | 4 + 4 | 5 + 5 | 6 + 6 | 7 + 9 | 10 +(9 rows) + +set local gp_enable_direct_dispatch = off; +select * from rt1 union all select * from t1; + a | b +---+---- + 7 | 8 + 8 | 9 + 1 | 2 + 2 | 3 + 3 | 4 + 4 | 5 + 5 | 6 + 6 | 7 + 9 | 10 +(9 rows) + +reset gp_enable_direct_dispatch; +abort; +-- Test mixing a SegmentGeneral with General locus scan. +explain (costs off) +select a from t_test_append_rep +union all +select * from generate_series(100, 105); + QUERY PLAN +---------------------------------------- + Append + -> Seq Scan on t_test_append_rep + -> Function Scan on generate_series + Optimizer: Postgres query optimizer +(4 rows) + +select a from t_test_append_rep +union all +select * from generate_series(100, 105); + a +----- + 5 + 6 + 7 + 8 + 9 + 10 + 100 + 101 + 102 + 103 + 104 + 105 +(12 rows) + +-- +-- Test for creation of MergeAppend paths. +-- +-- We used to have a bug in creation of MergeAppend paths, so that this failed +-- with "could not find pathkey item to sort" error. See +-- https://github.com/greenplum-db/gpdb/issues/5695 +-- +create table mergeappend_test ( a int, b int, x int ); +insert into mergeappend_test select g/100, g/100, g from generate_series(1, 500) g; +analyze mergeappend_test; +select a, b, array_dims(array_agg(x)) from mergeappend_test r group by a, b +union all +select null, null, array_dims(array_agg(x)) from mergeappend_test r +order by 1,2; + a | b | array_dims +---+---+------------ + 0 | 0 | [1:99] + 1 | 1 | [1:100] + 2 | 2 | [1:100] + 3 | 3 | [1:100] + 4 | 4 | [1:100] + 5 | 5 | [1:1] + | | [1:500] +(7 rows) + +-- Check that it's using a MergeAppend +set enable_hashagg=off; +explain (costs off) +select a, b, array_dims(array_agg(x)) from mergeappend_test r group by a, b +union all +select null, null, array_dims(array_agg(x)) from mergeappend_test r +order by 1,2; + QUERY PLAN +---------------------------------------------------- + Merge Append + Sort Key: r.a, r.b + -> GroupAggregate + Group Key: r.a, r.b + -> Sort + Sort Key: r.a, r.b + -> Seq Scan on mergeappend_test r + -> Sort + Sort Key: (NULL::integer), (NULL::integer) + -> Aggregate + -> Seq Scan on mergeappend_test r_1 + Optimizer: Postgres query optimizer +(12 rows) + +-- This used to trip an assertion in MotionStateFinderWalker(), when we were +-- missing support for MergeAppend in planstate_walk_kids(). +-- (https://github.com/greenplum-db/gpdb/issues/6668) +select a, b, array_dims(array_agg(x)) from mergeappend_test r group by a, b +union all +select null, null, array_dims(array_agg(x)) FROM mergeappend_test r, pg_sleep(0) +order by 1,2; + a | b | array_dims +---+---+------------ + 0 | 0 | [1:99] + 1 | 1 | [1:100] + 2 | 2 | [1:100] + 3 | 3 | [1:100] + 4 | 4 | [1:100] + 5 | 5 | [1:1] + | | [1:500] +(7 rows) + +-- check that EXPLAIN ANALYZE works on MergeAppend, too. +explain analyze select a, b, array_dims(array_agg(x)) from mergeappend_test r group by a, b +union all +select null, null, array_dims(array_agg(x)) FROM mergeappend_test r +order by 1,2; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------ + Merge Append (cost=35.71..41.98 rows=37 width=40) (actual time=0.247..0.353 rows=7 loops=1) + Sort Key: r.a, r.b + -> GroupAggregate (cost=28.41..33.95 rows=36 width=40) (actual time=0.148..0.250 rows=6 loops=1) + Group Key: r.a, r.b + -> Sort (cost=28.41..29.66 rows=500 width=12) (actual time=0.116..0.152 rows=500 loops=1) + Sort Key: r.a, r.b + Sort Method: quicksort Memory: 52kB + -> Seq Scan on mergeappend_test r (cost=0.00..6.00 rows=500 width=12) (actual time=0.011..0.047 rows=500 loops=1) + -> Sort (cost=7.29..7.29 rows=1 width=40) (actual time=0.099..0.100 rows=1 loops=1) + Sort Key: (NULL::integer), (NULL::integer) + Sort Method: quicksort Memory: 25kB + -> Aggregate (cost=7.25..7.27 rows=1 width=40) (actual time=0.097..0.097 rows=1 loops=1) + -> Seq Scan on mergeappend_test r_1 (cost=0.00..6.00 rows=500 width=4) (actual time=0.005..0.040 rows=500 loops=1) + Planning Time: 0.340 ms + (slice0) Executor memory: 114K bytes. Work_mem: 16K bytes max. + Memory used: 128000kB + Optimizer: Postgres query optimizer + Execution Time: 0.422 ms +(18 rows) + +CREATE TABLE t1(c1 int, c2 int, c3 int); +CREATE TABLE t2(c1 int, c2 int, c3 int); +INSERT INTO t1 SELECT i, i ,i + 1 FROM generate_series(1,10) i; +INSERT INTO t2 SELECT i, i ,i + 1 FROM generate_series(1,10) i; +SET enable_hashagg = off; +with tcte(c1, c2, c3) as ( + SELECT c1, sum(c2) as c2, c3 FROM t1 WHERE c3 > 0 GROUP BY c1, c3 + UNION ALL + SELECT c1, sum(c2) as c2, c3 FROM t2 WHERE c3 < 0 GROUP BY c1, c3 +) +SELECT * FROM tcte WHERE c3 = 1; + c1 | c2 | c3 +----+----+---- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/qp_with_clause.out b/src/test/singlenode_regress/expected/qp_with_clause.out new file mode 100644 index 00000000000..70620fb5dd8 --- /dev/null +++ b/src/test/singlenode_regress/expected/qp_with_clause.out @@ -0,0 +1,11117 @@ +-- +-- PostgreSQL port of the MySQL "World" database. +-- +-- The sample data used in the world database is Copyright Statistics +-- Finland, http://www.stat.fi/worldinfigures. +-- +-- Modified to use it with GPDB +set extra_float_digits=0; +--start_ignore +create schema qp_with_clause; +set search_path = qp_with_clause; +DROP TABLE IF EXISTS city cascade; +NOTICE: table "city" does not exist, skipping +DROP TABLE IF EXISTS country cascade; +NOTICE: table "country" does not exist, skipping +DROP TABLE IF EXISTS countrylanguage cascade; +NOTICE: table "countrylanguage" does not exist, skipping +--end_ignore +BEGIN; +--SET client_encoding = 'LATIN1'; +CREATE TABLE city ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +) ; +CREATE TABLE country ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea numeric(10,2) NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city (id, name, countrycode, district, population) FROM stdin; +-- +-- Data for Name: country; Type: TABLE DATA; Schema: public; Owner: chriskl +-- +COPY country (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM stdin WITH NULL AS ''; +-- +-- Data for Name: countrylanguage; Type: TABLE DATA; Schema: public; Owner: chriskl +-- +COPY countrylanguage (countrycode, "language", isofficial, percentage) FROM stdin; +ALTER TABLE ONLY city + ADD CONSTRAINT city_pkey PRIMARY KEY (id); +ALTER TABLE ONLY country + ADD CONSTRAINT country_pkey PRIMARY KEY (code); +ALTER TABLE ONLY countrylanguage + ADD CONSTRAINT countrylanguage_pkey PRIMARY KEY (countrycode, "language"); +COMMIT; +ANALYZE city; +ANALYZE country; +ANALYZE countrylanguage; +-- queries with one CTE that is referenced once +-- Using CTE in the FROM clause +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + code | id | name | countrycode | language | isofficial | percentage +------+------+-----------------------------------+-------------+------------------+------------+------------ + ABW | 129 | Oranjestad | ABW | Dutch | t | 5.3 + AFG | 1 | Kabul | AFG | Dari | t | 32.1 + AFG | 1 | Kabul | AFG | Pashto | t | 52.4 + AIA | 62 | The Valley | AIA | English | t | 0 + ALB | 34 | Tirana | ALB | Albaniana | t | 97.9 + AND | 55 | Andorra la Vella | AND | Catalan | t | 32.3 + ANT | 33 | Willemstad | ANT | Dutch | t | 0 + ANT | 33 | Willemstad | ANT | Papiamento | t | 86.2 + ARE | 65 | Abu Dhabi | ARE | Arabic | t | 42 + ARG | 69 | Buenos Aires | ARG | Spanish | t | 96.8 + ARM | 126 | Yerevan | ARM | Armenian | t | 93.4 + ASM | 54 | Fagatogo | ASM | English | t | 3.1 + ASM | 54 | Fagatogo | ASM | Samoan | t | 90.6 + ATG | 63 | Saint Johns | ATG | English | t | 0 + AUS | 135 | Canberra | AUS | English | t | 81.2 + AUT | 1523 | Wien | AUT | German | t | 92 + AZE | 144 | Baku | AZE | Azerbaijani | t | 89 + BDI | 552 | Bujumbura | BDI | French | t | 0 + BDI | 552 | Bujumbura | BDI | Kirundi | t | 98.1 + BEL | 179 | Bruxelles [Brussel] | BEL | Dutch | t | 59.2 + BEL | 179 | Bruxelles [Brussel] | BEL | French | t | 32.6 + BEL | 179 | Bruxelles [Brussel] | BEL | German | t | 1 + BGD | 150 | Dhaka | BGD | Bengali | t | 97.7 + BGR | 539 | Sofija | BGR | Bulgariana | t | 83.2 + BHR | 149 | al-Manama | BHR | Arabic | t | 67.7 + BIH | 201 | Sarajevo | BIH | Serbo-Croatian | t | 99.2 + BLR | 3520 | Minsk | BLR | Belorussian | t | 65.6 + BLR | 3520 | Minsk | BLR | Russian | t | 32 + BLZ | 185 | Belmopan | BLZ | English | t | 50.8 + BMU | 191 | Hamilton | BMU | English | t | 100 + BOL | 194 | La Paz | BOL | Aimara | t | 3.2 + BOL | 194 | La Paz | BOL | Ketdua | t | 8.1 + BOL | 194 | La Paz | BOL | Spanish | t | 87.7 + BRA | 211 | Brasilia | BRA | Portuguese | t | 97.5 + BRB | 174 | Bridgetown | BRB | English | t | 0 + BRN | 538 | Bandar Seri Begawan | BRN | Malay | t | 45.5 + BTN | 192 | Thimphu | BTN | Dzongkha | t | 50 + CAN | 1822 | Ottawa | CAN | English | t | 60.4 + CAN | 1822 | Ottawa | CAN | French | t | 23.4 + CCK | 2317 | West Island | CCK | English | t | 0 + CHE | 3248 | Bern | CHE | French | t | 19.2 + CHE | 3248 | Bern | CHE | German | t | 63.6 + CHE | 3248 | Bern | CHE | Italian | t | 7.7 + CHE | 3248 | Bern | CHE | Romansh | t | 0.6 + CHL | 554 | Santiago de Chile | CHL | Spanish | t | 89.7 + CHN | 1891 | Peking | CHN | Chinese | t | 92 + COK | 583 | Avarua | COK | Maori | t | 0 + COL | 2257 | Santafe de Bogota | COL | Spanish | t | 99 + COM | 2295 | Moroni | COM | Comorian | t | 75 + CPV | 1859 | Praia | CPV | Portuguese | t | 0 + CRI | 584 | San Jose | CRI | Spanish | t | 97.5 + CUB | 2413 | La Habana | CUB | Spanish | t | 100 + CXR | 1791 | Flying Fish Cove | CXR | English | t | 0 + CYM | 553 | George Town | CYM | English | t | 0 + CYP | 2430 | Nicosia | CYP | Greek | t | 74.1 + CYP | 2430 | Nicosia | CYP | Turkish | t | 22.4 + CZE | 3339 | Praha | CZE | Czech | t | 81.2 + DEU | 3068 | Berlin | DEU | German | t | 91.3 + DJI | 585 | Djibouti | DJI | Arabic | t | 10.6 + DNK | 3315 | Kobenhavn | DNK | Danish | t | 93.5 + DOM | 587 | Santo Domingo de Guzman | DOM | Spanish | t | 98 + DZA | 35 | Alger | DZA | Arabic | t | 86 + ECU | 594 | Quito | ECU | Spanish | t | 93 + EGY | 608 | Cairo | EGY | Arabic | t | 98.8 + ERI | 652 | Asmara | ERI | Tigrinja | t | 49.1 + ESH | 2453 | El-Aaiun | ESH | Arabic | t | 100 + ESP | 653 | Madrid | ESP | Spanish | t | 74.4 + EST | 3791 | Tallinn | EST | Estonian | t | 65.3 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Finnish | t | 92.7 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Swedish | t | 5.7 + FJI | 764 | Suva | FJI | Fijian | t | 50.8 + FLK | 763 | Stanley | FLK | English | t | 0 + FRA | 2974 | Paris | FRA | French | t | 93.6 + FRO | 901 | Torshavn | FRO | Danish | t | 0 + FRO | 901 | Torshavn | FRO | Faroese | t | 100 + GBR | 456 | London | GBR | English | t | 97.3 + GEO | 905 | Tbilisi | GEO | Georgiana | t | 71.7 + GIB | 915 | Gibraltar | GIB | English | t | 88.9 + GLP | 919 | Basse-Terre | GLP | French | t | 0 + GNB | 927 | Bissau | GNB | Portuguese | t | 8.1 + GRC | 2401 | Athenai | GRC | Greek | t | 98.5 + GRL | 917 | Nuuk | GRL | Danish | t | 12.5 + GRL | 917 | Nuuk | GRL | Greenlandic | t | 87.5 + GTM | 922 | Ciudad de Guatemala | GTM | Spanish | t | 64.7 + GUM | 921 | Agaaa | GUM | Chamorro | t | 29.6 + GUM | 921 | Agaaa | GUM | English | t | 37.5 + HKG | 937 | Victoria | HKG | English | t | 2.2 + HND | 933 | Tegucigalpa | HND | Spanish | t | 97.2 + HRV | 2409 | Zagreb | HRV | Serbo-Croatian | t | 95.9 + HTI | 929 | Port-au-Prince | HTI | French | t | 0 + HUN | 3483 | Budapest | HUN | Hungarian | t | 98.5 + IDN | 939 | Jakarta | IDN | Malay | t | 12.1 + IND | 1109 | New Delhi | IND | Hindi | t | 39.9 + IRL | 1447 | Dublin | IRL | English | t | 98.4 + IRL | 1447 | Dublin | IRL | Irish | t | 1.6 + IRN | 1380 | Teheran | IRN | Persian | t | 45.7 + IRQ | 1365 | Baghdad | IRQ | Arabic | t | 77.2 + ISL | 1449 | Reykjavik | ISL | Icelandic | t | 95.7 + ISR | 1450 | Jerusalem | ISR | Arabic | t | 18 + ISR | 1450 | Jerusalem | ISR | Hebrew | t | 63.1 + ITA | 1464 | Roma | ITA | Italian | t | 94.1 + JOR | 1786 | Amman | JOR | Arabic | t | 97.9 + JPN | 1532 | Tokyo | JPN | Japanese | t | 99.1 + KAZ | 1864 | Astana | KAZ | Kazakh | t | 46 + KGZ | 2253 | Bishkek | KGZ | Kirgiz | t | 59.7 + KGZ | 2253 | Bishkek | KGZ | Russian | t | 16.2 + KHM | 1800 | Phnom Penh | KHM | Khmer | t | 88.6 + KIR | 2256 | Bairiki | KIR | Kiribati | t | 98.9 + KNA | 3064 | Basseterre | KNA | English | t | 0 + KOR | 2331 | Seoul | KOR | Korean | t | 99.9 + KWT | 2429 | Kuwait | KWT | Arabic | t | 78.1 + LAO | 2432 | Vientiane | LAO | Lao | t | 67.2 + LBN | 2438 | Beirut | LBN | Arabic | t | 93 + LBY | 2441 | Tripoli | LBY | Arabic | t | 96 + LCA | 3065 | Castries | LCA | English | t | 20 + LIE | 2446 | Vaduz | LIE | German | t | 89 + LKA | 3217 | Colombo | LKA | Singali | t | 60.3 + LKA | 3217 | Colombo | LKA | Tamil | t | 19.6 + LSO | 2437 | Maseru | LSO | English | t | 0 + LSO | 2437 | Maseru | LSO | Sotho | t | 85 + LTU | 2447 | Vilnius | LTU | Lithuanian | t | 81.6 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | French | t | 4.2 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | German | t | 2.3 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | Luxembourgish | t | 64.4 + LVA | 2434 | Riga | LVA | Latvian | t | 55.1 + MAC | 2454 | Macao | MAC | Portuguese | t | 2.3 + MAR | 2486 | Rabat | MAR | Arabic | t | 65 + MCO | 2695 | Monaco-Ville | MCO | French | t | 41.9 + MDA | 2690 | Chisinau | MDA | Romanian | t | 61.9 + MDG | 2455 | Antananarivo | MDG | French | t | 0 + MDG | 2455 | Antananarivo | MDG | Malagasy | t | 98.9 + MDV | 2463 | Male | MDV | Dhivehi | t | 100 + MEX | 2515 | Ciudad de Mexico | MEX | Spanish | t | 92.1 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | English | t | 0 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | Marshallese | t | 96.8 + MKD | 2460 | Skopje | MKD | Macedonian | t | 66.5 + MLT | 2484 | Valletta | MLT | English | t | 2.1 + MLT | 2484 | Valletta | MLT | Maltese | t | 95.8 + MMR | 2710 | Rangoon (Yangon) | MMR | Burmese | t | 69 + MNG | 2696 | Ulan Bator | MNG | Mongolian | t | 78.8 + MNP | 2913 | Garapan | MNP | English | t | 4.8 + MSR | 2697 | Plymouth | MSR | English | t | 0 + MTQ | 2508 | Fort-de-France | MTQ | French | t | 0 + MWI | 2462 | Lilongwe | MWI | Chichewa | t | 58.3 + MYS | 2464 | Kuala Lumpur | MYS | Malay | t | 58.4 + MYT | 2514 | Mamoutzou | MYT | French | t | 20.3 + NCL | 3493 | Noumea | NCL | French | t | 34.3 + NFK | 2806 | Kingston | NFK | English | t | 0 + NIC | 2734 | Managua | NIC | Spanish | t | 97.6 + NIU | 2805 | Alofi | NIU | English | t | 0 + NLD | 5 | Amsterdam | NLD | Dutch | t | 95.6 + NOR | 2807 | Oslo | NOR | Norwegian | t | 96.6 + NPL | 2729 | Kathmandu | NPL | Nepali | t | 50.4 + NRU | 2728 | Yaren | NRU | English | t | 7.5 + NRU | 2728 | Yaren | NRU | Nauru | t | 57.5 + NZL | 3499 | Wellington | NZL | English | t | 87 + OMN | 2821 | Masqat | OMN | Arabic | t | 76.7 + PAK | 2831 | Islamabad | PAK | Urdu | t | 7.6 + PAN | 2882 | Ciudad de Panama | PAN | Spanish | t | 76.8 + PER | 2890 | Lima | PER | Aimara | t | 2.3 + PER | 2890 | Lima | PER | Ketdua | t | 16.4 + PER | 2890 | Lima | PER | Spanish | t | 79.8 + PHL | 766 | Manila | PHL | Pilipino | t | 29.3 + PLW | 2881 | Koror | PLW | English | t | 3.2 + PLW | 2881 | Koror | PLW | Palau | t | 82.2 + POL | 2928 | Warszawa | POL | Polish | t | 97.6 + PRI | 2919 | San Juan | PRI | Spanish | t | 51.3 + PRK | 2318 | Pyongyang | PRK | Korean | t | 99.9 + PRT | 2914 | Lisboa | PRT | Portuguese | t | 99 + PRY | 2885 | Asuncion | PRY | Guarani | t | 40.1 + PRY | 2885 | Asuncion | PRY | Spanish | t | 55.1 + PYF | 3016 | Papeete | PYF | French | t | 40.8 + QAT | 2973 | Doha | QAT | Arabic | t | 40.7 + ROM | 3018 | Bucuresti | ROM | Romani | t | 0.7 + ROM | 3018 | Bucuresti | ROM | Romanian | t | 90.7 + RUS | 3580 | Moscow | RUS | Russian | t | 86.6 + RWA | 3047 | Kigali | RWA | French | t | 0 + RWA | 3047 | Kigali | RWA | Rwanda | t | 100 + SAU | 3173 | Riyadh | SAU | Arabic | t | 95 + SDN | 3225 | Khartum | SDN | Arabic | t | 49.4 + SEN | 3198 | Dakar | SEN | Wolof | t | 48.1 + SGP | 3208 | Singapore | SGP | Chinese | t | 77.1 + SGP | 3208 | Singapore | SGP | Malay | t | 14.1 + SGP | 3208 | Singapore | SGP | Tamil | t | 7.4 + SHN | 3063 | Jamestown | SHN | English | t | 0 + SJM | 938 | Longyearbyen | SJM | Norwegian | t | 0 + SLV | 645 | San Salvador | SLV | Spanish | t | 100 + SMR | 3171 | San Marino | SMR | Italian | t | 100 + SOM | 3214 | Mogadishu | SOM | Arabic | t | 0 + SOM | 3214 | Mogadishu | SOM | Somali | t | 98.3 + SPM | 3067 | Saint-Pierre | SPM | French | t | 0 + SVK | 3209 | Bratislava | SVK | Slovak | t | 85.6 + SVN | 3212 | Ljubljana | SVN | Slovene | t | 87.9 + SWE | 3048 | Stockholm | SWE | Swedish | t | 89.5 + SWZ | 3244 | Mbabane | SWZ | Swazi | t | 89.9 + SYC | 3206 | Victoria | SYC | English | t | 3.8 + SYC | 3206 | Victoria | SYC | French | t | 1.3 + SYR | 3250 | Damascus | SYR | Arabic | t | 90 + TCA | 3423 | Cockburn Town | TCA | English | t | 0 + TCD | 3337 | NDjamena | TCD | Arabic | t | 12.3 + TGO | 3332 | Lome | TGO | Ewe | t | 23.2 + TGO | 3332 | Lome | TGO | Kabye | t | 13.8 + THA | 3320 | Bangkok | THA | Thai | t | 52.6 + TJK | 3261 | Dushanbe | TJK | Tadzhik | t | 62.2 + TKL | 3333 | Fakaofo | TKL | English | t | 0 + TKM | 3419 | Ashgabat | TKM | Turkmenian | t | 76.7 + TMP | 1522 | Dili | TMP | Portuguese | t | 0 + TON | 3334 | Nukualofa | TON | English | t | 0 + TON | 3334 | Nukualofa | TON | Tongan | t | 98.3 + TUN | 3349 | Tunis | TUN | Arabic | t | 69.9 + TUR | 3358 | Ankara | TUR | Turkish | t | 87.6 + TUV | 3424 | Funafuti | TUV | English | t | 0 + TUV | 3424 | Funafuti | TUV | Tuvalu | t | 92.5 + TWN | 3263 | Taipei | TWN | Mandarin Chinese | t | 20.1 + TZA | 3306 | Dodoma | TZA | Swahili | t | 8.8 + UKR | 3426 | Kyiv | UKR | Ukrainian | t | 64.7 + URY | 3492 | Montevideo | URY | Spanish | t | 95.7 + USA | 3813 | Washington | USA | English | t | 86.2 + UZB | 3503 | Toskent | UZB | Uzbek | t | 72.6 + VAT | 3538 | Citta del Vaticano | VAT | Italian | t | 0 + VCT | 3066 | Kingstown | VCT | English | t | 0 + VEN | 3539 | Caracas | VEN | Spanish | t | 96.9 + VGB | 537 | Road Town | VGB | English | t | 0 + VIR | 4067 | Charlotte Amalie | VIR | English | t | 81.7 + VNM | 3770 | Hanoi | VNM | Vietnamese | t | 86.8 + VUT | 3537 | Port-Vila | VUT | Bislama | t | 56.6 + VUT | 3537 | Port-Vila | VUT | English | t | 28.3 + VUT | 3537 | Port-Vila | VUT | French | t | 14.2 + WSM | 3169 | Apia | WSM | English | t | 0.6 + WSM | 3169 | Apia | WSM | Samoan | t | 47.5 + YEM | 1780 | Sanaa | YEM | Arabic | t | 99.6 + YUG | 1792 | Beograd | YUG | Serbo-Croatian | t | 75.2 + ZAF | 716 | Pretoria | ZAF | Afrikaans | t | 14.3 + ZAF | 716 | Pretoria | ZAF | English | t | 8.5 + ZAF | 716 | Pretoria | ZAF | Xhosa | t | 17.7 + ZAF | 716 | Pretoria | ZAF | Zulu | t | 22.7 + ZWE | 4068 | Harare | ZWE | English | t | 2.2 +(237 rows) + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + lang_count | code | name | continent | region | population +------------+------+---------------------------------+-----------+-----------------+------------ + 12 | RUS | Russian Federation | Europe | Eastern Europe | 146934000 + 6 | FSM | Micronesia, Federated States of | Oceania | Micronesia | 119000 + 4 | AZE | Azerbaijan | Asia | Middle East | 7734000 + 1 | BIH | Bosnia and Herzegovina | Europe | Southern Europe | 3972000 +(4 rows) + +-- Using CTE in the WHERE clause +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital; + name | name | cnt +--------------------+------------------+----- + Australia | Canberra | 8 + South Africa | Pretoria | 11 + India | New Delhi | 12 + Iran | Teheran | 10 + Italy | Roma | 8 + Austria | Wien | 8 + Canada | Ottawa | 12 + China | Peking | 12 + Myanmar | Rangoon (Yangon) | 8 + Denmark | Kobenhavn | 7 + Russian Federation | Moscow | 12 + United States | Washington | 12 +(12 rows) + +--query5 -Using a CTE in the select list +with bigcities as +( +select city.id,city.name,city.population,city.countrycode +from city +where city.population >= 0.5 * (select population from country where country.code=city.countrycode) +) +select +(select max(bigcities.population) from bigcities where bigcities.countrycode='QAT') as MAX_POP, +(select avg(bigcities.population) from bigcities) AS WORLD_AVG, + city.name,city.population + from + city where city.countrycode='QAT'; + max_pop | world_avg | name | population +---------+---------------------+------+------------ + 355000 | 376916.466666666667 | Doha | 355000 +(1 row) + +--query6 using CTE in the select list with a qual +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select * from +( +select +(select max(CNT) from diversecountries where diversecountries.code = country.code) CNT,country.name COUNTRY,city.name CAPITAL +from country,city where country.capital = city.id) FOO where FOO.CNT is not null; + cnt | country | capital +-----+--------------------+------------------ + 8 | Australia | Canberra + 11 | South Africa | Pretoria + 12 | India | New Delhi + 10 | Iran | Teheran + 8 | Italy | Roma + 8 | Austria | Wien + 12 | Canada | Ottawa + 12 | China | Peking + 8 | Myanmar | Rangoon (Yangon) + 7 | Denmark | Kobenhavn + 12 | Russian Federation | Moscow + 12 | United States | Washington +(12 rows) + +--queries Using a CTE in the HAVING clause +with notdiversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) < 3) d + where d.countrycode = country.code and country.gnp > 100000) +select country.name COUNTRY,city.name CAPITAL,count(*) LANGCNT from +country,city,countrylanguage +where country.code = countrylanguage.countrycode and country.capital = city.id +group by country.name,city.name +HAVING count(*) NOT IN (select CNT from notdiversecountries where notdiversecountries.name = country.name) +order by country.name +LIMIT 10; + country | capital | langcnt +---------------------+------------------+--------- + Afghanistan | Kabul | 5 + Albania | Tirana | 3 + Algeria | Alger | 2 + American Samoa | Fagatogo | 3 + Andorra | Andorra la Vella | 4 + Angola | Luanda | 9 + Anguilla | The Valley | 1 + Antigua and Barbuda | Saint Johns | 2 + Argentina | Buenos Aires | 3 + Armenia | Yerevan | 2 +(10 rows) + +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' +UNION ALL +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + code | country | capital | headofstate | compared_with_cheap_asian_cnt +------+----------------------------------+-------------------------+-----------------------------------+------------------------------- + ATG | Antigua and Barbuda | Saint Johns | Elisabeth II | 2 + ARG | Argentina | Buenos Aires | Fernando de la Rua | 3 + ABW | Aruba | Oranjestad | Beatrix | 4 + BHS | Bahamas | Nassau | Elisabeth II | 2 + BRB | Barbados | Bridgetown | Elisabeth II | 2 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + CAN | Canada | Ottawa | Elisabeth II | 12 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + CRI | Costa Rica | San Jose | Miguel Angel Rodriguez Echeverria | 4 + DMA | Dominica | Roseau | Vernon Shaw | 2 + DOM | Dominican Republic | Santo Domingo de Guzman | Hipolito Mejia Dominguez | 2 + ECU | Ecuador | Quito | Gustavo Noboa Bejarano | 2 + SLV | El Salvador | San Salvador | Francisco Guillermo Flores Perez | 2 + GUF | French Guiana | Cayenne | Jacques Chirac | 2 + GRL | Greenland | Nuuk | Margrethe II | 2 + GLP | Guadeloupe | Basse-Terre | Jacques Chirac | 2 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + GUY | Guyana | Georgetown | Bharrat Jagdeo | 3 + HTI | Haiti | Port-au-Prince | Jean-Bertrand Aristide | 2 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 + JAM | Jamaica | Kingston | Elisabeth II | 2 + MTQ | Martinique | Fort-de-France | Jacques Chirac | 2 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + ANT | Netherlands Antilles | Willemstad | Beatrix | 3 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + PER | Peru | Lima | Valentin Paniagua Corazao | 3 + PRI | Puerto Rico | San Juan | George W. Bush | 2 + KNA | Saint Kitts and Nevis | Basseterre | Elisabeth II | 2 + LCA | Saint Lucia | Castries | Elisabeth II | 2 + VCT | Saint Vincent and the Grenadines | Kingstown | Elisabeth II | 2 + SUR | Suriname | Paramaribo | Ronald Venetiaan | 2 + TTO | Trinidad and Tobago | Port-of-Spain | Arthur N. R. Robinson | 3 + USA | United States | Washington | George W. Bush | 12 + VEN | Venezuela | Caracas | Hugo Chavez Frias | 3 + VIR | Virgin Islands, U.S. | Charlotte Amalie | George W. Bush | 3 +(40 rows) + + + +-- ensure select includes with clause in it's syntax +-- query 1 using the same name for the CTE as a table. Main query should reference the CTE +with country as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') +select * from +(select * from country where isofficial='True') e1, +(select * from country where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language LIMIT 20; + code | country | capital | language | isofficial | percentage | code | country | capital | language | isofficial | percentage +------+------------------------+------------------------+----------------+------------+------------+------+------------------------+------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Tirana | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | Wien | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Russian | t | 32 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Praha | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Kobenhavn | Danish | t | 93.5 + EST | Estonia | Tallinn | Estonian | t | 65.3 | EST | Estonia | Tallinn | Estonian | t | 65.3 + FRO | Faroe Islands | Torshavn | Danish | t | 0 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FRA | France | Paris | French | t | 93.6 | FRA | France | Paris | French | t | 93.6 + DEU | Germany | Berlin | German | t | 91.3 | DEU | Germany | Berlin | German | t | 91.3 + GIB | Gibraltar | Gibraltar | English | t | 88.9 | GIB | Gibraltar | Gibraltar | English | t | 88.9 +(20 rows) + +-- query 2 using multiple CTEs with same names as tables. +with country as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +countrylanguage(code1,country1,capital1,language1,isofficial1,percentage1,code2,country2,capital2,language2,isofficial2,percentage2) as +( +select * from +(select * from country where isofficial='True') e1, +(select * from country where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language +) +select code1,country1,capital1,language1,isofficial1,percentage1,country.COUNTRY from country,countrylanguage where country.code = countrylanguage.code1 +and country.percentage = countrylanguage.percentage1 +order by COUNTRY,percentage1 LIMIT 20;-- queries using same name for CTEs and the subquery aliases in the main query + code1 | country1 | capital1 | language1 | isofficial1 | percentage1 | country +-------+------------------------+------------------------+----------------+-------------+-------------+------------------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | Albania + AUT | Austria | Wien | German | t | 92 | Austria + BLR | Belarus | Minsk | Russian | t | 32 | Belarus + BLR | Belarus | Minsk | Belorussian | t | 65.6 | Belarus + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | Belgium + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | Belgium + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | Belgium + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | Bosnia and Herzegovina + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | Bulgaria + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | Croatia + CZE | Czech Republic | Praha | Czech | t | 81.2 | Czech Republic + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | Denmark + EST | Estonia | Tallinn | Estonian | t | 65.3 | Estonia + FRO | Faroe Islands | Torshavn | Danish | t | 0 | Faroe Islands + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | Faroe Islands + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | Finland + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | Finland + FRA | France | Paris | French | t | 93.6 | France + DEU | Germany | Berlin | German | t | 91.3 | Germany + GIB | Gibraltar | Gibraltar | English | t | 88.9 | Gibraltar +(20 rows) + +-- query1 +with c1 as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +c2 as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Asia') +select * from +(select * from c1 where isofficial='True') c1, +(select * from c2 where percentage > 50) c2 +where c1.percentage = c2.percentage order by c2.COUNTRY,c1.language; + code | country | capital | language | isofficial | percentage | code | country | capital | language | isofficial | percentage +------+---------------+------------+----------------+------------+------------+------+------------+---------+----------------+------------+------------ + LIE | Liechtenstein | Vaduz | German | t | 89 | AZE | Azerbaijan | Baku | Azerbaijani | t | 89 + AUT | Austria | Wien | German | t | 92 | CHN | China | Peking | Chinese | t | 92 + ALB | Albania | Tirana | Albaniana | t | 97.9 | JOR | Jordan | Amman | Arabic | t | 97.9 + SVK | Slovakia | Bratislava | Slovak | t | 85.6 | MAC | Macao | Macao | Canton Chinese | f | 85.6 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | MDV | Maldives | Male | Dhivehi | t | 100 + SMR | San Marino | San Marino | Italian | t | 100 | MDV | Maldives | Male | Dhivehi | t | 100 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | PSE | Palestine | Gaza | Arabic | f | 95.9 +(7 rows) + +-- query2 using same names as tables +with country as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +countrylanguage as +(select country.code,country.COUNTRY,country.language,country.isofficial,country.percentage + FROM country,countrylanguage + WHERE country.code = countrylanguage.countrycode +) +select * from +(select * from country where isofficial='True') country, +(select * from countrylanguage where percentage > 50) countrylanguage +where country.percentage = countrylanguage.percentage order by countrylanguage.COUNTRY,country.language LIMIT 40; + code | country | capital | language | isofficial | percentage | code | country | language | isofficial | percentage +------+------------------------+---------------------+----------------+------------+------------+------+------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Albaniana | t | 97.9 + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Albaniana | t | 97.9 + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | German | t | 92 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | German | t | 92 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | German | t | 92 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | German | t | 92 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | German | t | 92 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | German | t | 92 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | German | t | 92 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Bulgariana | t | 83.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Bulgariana | t | 83.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Bulgariana | t | 83.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Serbo-Croatian | t | 95.9 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Czech | t | 81.2 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Czech | t | 81.2 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Czech | t | 81.2 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Czech | t | 81.2 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Czech | t | 81.2 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Czech | t | 81.2 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Czech | t | 81.2 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Danish | t | 93.5 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Danish | t | 93.5 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Danish | t | 93.5 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Danish | t | 93.5 +(40 rows) + +-- Using the same name for the CTE at every subquery-level +select avg(population12),CITY12 +from +( +with city(CITY1,POPULATION1) as (select city.name,city.population from city where city.population >= 100) +select CITY12,POPULATION12 from +( + with city(CITY2,POPULATION2) as ( select city1,population1 from city where population1 >= 1000 ) + select CITY12,POPULATION12 from + ( + with city(CITY3,POPULATION3) as (select city2,population2 from city where population2 >= 10000) + select CITY12,POPULATION12 from + ( + with city(CITY4,POPULATION4) as (select city3,population3 from city where population3 >= 20000) + select CITY12,POPULATION12 from + ( + with city(CITY5,POPULATION5) as (select city4,population4 from city where population4 >= 50000) + select CITY12,POPULATION12 from + ( + with city(CITY6,POPULATION6) as (select city5,population5 from city where population5 >= 80000) + select CITY12,POPULATION12 from + ( + with city(CITY7,POPULATION7) as (select city6,population6 from city where population6 >= 150000) + select CITY12,POPULATION12 from + ( + with city(CITY8,POPULATION8) as (select city7,population7 from city where population7 >= 200000) + select CITY12,POPULATION12 from + ( + with city(CITY9,POPULATION9) as (select city8,population8 from city where population8 >= 250000) + select CITY12,POPULATION12 from + ( + with city(CITY10,POPULATION10) as (select city9,population9 from city where population9 >= 300000) + select city12,population12 from + ( + with city(CITY11,POPULATION11) as (select city10,population10 from city where population10 >= 6500000) + select CITY12,POPULATION12 from + ( + with city(CITY12,POPULATION12) as (select city11,population11 from city where population11 >= 7000000) + select s1.city12,s1.population12 from city s1,city s2 + ) FOO11 + ) FOO10 + ) FOO9 + ) FOO8 + ) FOO7 + ) FOO6 + ) FOO5 + ) FOO4 + )FOO3 + ) FOO2 +) FOO1 +) FOO0 group by city12 order by city12;-- negative cases where queries have duplicate names in CTEs + avg | city12 +-----------------------+------------------ + 8591309.000000000000 | Ciudad de Mexico + 7206704.000000000000 | Delhi + 8787958.000000000000 | Istanbul + 9604900.000000000000 | Jakarta + 9269265.000000000000 | Karachi + 7285000.000000000000 | London + 8389200.000000000000 | Moscow + 10500000.000000000000 | Mumbai (Bombay) + 8008278.000000000000 | New York + 7472000.000000000000 | Peking + 9968485.000000000000 | Sao Paulo + 9981619.000000000000 | Seoul + 9696300.000000000000 | Shanghai + 7980230.000000000000 | Tokyo +(14 rows) + +-- Tests for duplicate column aliases +with capitals as +(select country.code,id,city.name,city.countrycode as code from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from capitals where id < 100; + code | id | name | code +------+----+------------------+------ + AFG | 1 | Kabul | AFG + NLD | 5 | Amsterdam | NLD + ANT | 33 | Willemstad | ANT + ALB | 34 | Tirana | ALB + DZA | 35 | Alger | DZA + ASM | 54 | Fagatogo | ASM + AND | 55 | Andorra la Vella | AND + AGO | 56 | Luanda | AGO + AIA | 62 | The Valley | AIA + ATG | 63 | Saint Johns | ATG + ARE | 65 | Abu Dhabi | ARE + ARG | 69 | Buenos Aires | ARG +(12 rows) + +with allofficiallanguages as +(select countrylanguage.countrycode,city.countrycode,language from + city,countrylanguage where countrylanguage.countrycode = city.countrycode and isofficial = 'True') +select * from allofficiallanguages where language like 'A%'; + countrycode | countrycode | language +-------------+-------------+------------- + ALB | ALB | Albaniana + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + DZA | DZA | Arabic + ARE | ARE | Arabic + ARE | ARE | Arabic + ARE | ARE | Arabic + ARE | ARE | Arabic + ARE | ARE | Arabic + ARM | ARM | Armenian + ARM | ARM | Armenian + ARM | ARM | Armenian + AZE | AZE | Azerbaijani + AZE | AZE | Azerbaijani + AZE | AZE | Azerbaijani + AZE | AZE | Azerbaijani + BHR | BHR | Arabic + BOL | BOL | Aimara + BOL | BOL | Aimara + BOL | BOL | Aimara + BOL | BOL | Aimara + BOL | BOL | Aimara + BOL | BOL | Aimara + BOL | BOL | Aimara + BOL | BOL | Aimara + DJI | DJI | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + EGY | EGY | Arabic + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + ZAF | ZAF | Afrikaans + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + IRQ | IRQ | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + ISR | ISR | Arabic + YEM | YEM | Arabic + YEM | YEM | Arabic + YEM | YEM | Arabic + YEM | YEM | Arabic + YEM | YEM | Arabic + YEM | YEM | Arabic + JOR | JOR | Arabic + JOR | JOR | Arabic + JOR | JOR | Arabic + JOR | JOR | Arabic + JOR | JOR | Arabic + KWT | KWT | Arabic + KWT | KWT | Arabic + KWT | KWT | Arabic + LBN | LBN | Arabic + LBN | LBN | Arabic + LBY | LBY | Arabic + LBY | LBY | Arabic + LBY | LBY | Arabic + LBY | LBY | Arabic + ESH | ESH | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + MAR | MAR | Arabic + OMN | OMN | Arabic + OMN | OMN | Arabic + OMN | OMN | Arabic + OMN | OMN | Arabic + OMN | OMN | Arabic + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + PER | PER | Aimara + QAT | QAT | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SAU | SAU | Arabic + SOM | SOM | Arabic + SOM | SOM | Arabic + SOM | SOM | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SDN | SDN | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + SYR | SYR | Arabic + TCD | TCD | Arabic + TCD | TCD | Arabic + TUN | TUN | Arabic + TUN | TUN | Arabic + TUN | TUN | Arabic + TUN | TUN | Arabic + TUN | TUN | Arabic + TUN | TUN | Arabic + TUN | TUN | Arabic + TUN | TUN | Arabic +(282 rows) + +with capitals(code,id,name,code) as +(select country.code,id,city.name,city.countrycode from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from capitals where id < 100; + code | id | name | code +------+----+------------------+------ + AFG | 1 | Kabul | AFG + NLD | 5 | Amsterdam | NLD + ANT | 33 | Willemstad | ANT + ALB | 34 | Tirana | ALB + DZA | 35 | Alger | DZA + ASM | 54 | Fagatogo | ASM + AND | 55 | Andorra la Vella | AND + AGO | 56 | Luanda | AGO + AIA | 62 | The Valley | AIA + ATG | 63 | Saint Johns | ATG + ARE | 65 | Abu Dhabi | ARE + ARG | 69 | Buenos Aires | ARG +(12 rows) + +-- query1 CTE referencing itself +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode + HAVING count(*) > (select max(lang_count) from lang_total) +) +select count(*) from lang_total; +ERROR: relation "lang_total" does not exist +LINE 5: HAVING count(*) > (select max(lang_count) from lang_total) + ^ +DETAIL: There is a WITH item named "lang_total", but it cannot be referenced from this part of the query. +HINT: Use WITH RECURSIVE, or re-order the WITH items to remove forward references. +--query2 CTE forward referencing another CTE +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital), +lang_total as +( select count(*) as lang_count,country.code,alleuropeanlanguages.code + from country join alleuropeanlanguages on (country.code=alleuropeanlanguages.code and governmentform='Federal Republic') + group by country.code,alleuropeanlanguages.code order by country.code), +alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') +select * from alleuropeanlanguages;-- negative cases with mismatching column list provided for CTEs +ERROR: relation "alleuropeanlanguages" does not exist +LINE 6: from country join alleuropeanlanguages on (country.code=al... + ^ +DETAIL: There is a WITH item named "alleuropeanlanguages", but it cannot be referenced from this part of the query. +HINT: Use WITH RECURSIVE, or re-order the WITH items to remove forward references. +--query1 +with capitals(code,id) as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from capitals; + code | id | name +------+------+----------------------------------- + AFG | 1 | Kabul + NLD | 5 | Amsterdam + ANT | 33 | Willemstad + ALB | 34 | Tirana + DZA | 35 | Alger + ASM | 54 | Fagatogo + AND | 55 | Andorra la Vella + AGO | 56 | Luanda + AIA | 62 | The Valley + ATG | 63 | Saint Johns + ARE | 65 | Abu Dhabi + ARG | 69 | Buenos Aires + ARM | 126 | Yerevan + ABW | 129 | Oranjestad + AUS | 135 | Canberra + AZE | 144 | Baku + BHS | 148 | Nassau + BHR | 149 | al-Manama + BGD | 150 | Dhaka + BRB | 174 | Bridgetown + BEL | 179 | Bruxelles [Brussel] + BLZ | 185 | Belmopan + BEN | 187 | Porto-Novo + BMU | 191 | Hamilton + BTN | 192 | Thimphu + BOL | 194 | La Paz + BIH | 201 | Sarajevo + BWA | 204 | Gaborone + BRA | 211 | Brasilia + GBR | 456 | London + VGB | 537 | Road Town + BRN | 538 | Bandar Seri Begawan + BGR | 539 | Sofija + BFA | 549 | Ouagadougou + BDI | 552 | Bujumbura + CYM | 553 | George Town + CHL | 554 | Santiago de Chile + COK | 583 | Avarua + CRI | 584 | San Jose + DJI | 585 | Djibouti + DMA | 586 | Roseau + DOM | 587 | Santo Domingo de Guzman + ECU | 594 | Quito + EGY | 608 | Cairo + SLV | 645 | San Salvador + ERI | 652 | Asmara + ESP | 653 | Madrid + ZAF | 716 | Pretoria + ETH | 756 | Addis Abeba + FLK | 763 | Stanley + FJI | 764 | Suva + PHL | 766 | Manila + FRO | 901 | Torshavn + GAB | 902 | Libreville + GMB | 904 | Banjul + GEO | 905 | Tbilisi + GHA | 910 | Accra + GIB | 915 | Gibraltar + GRD | 916 | Saint Georges + GRL | 917 | Nuuk + GLP | 919 | Basse-Terre + GUM | 921 | Agaaa + GTM | 922 | Ciudad de Guatemala + GIN | 926 | Conakry + GNB | 927 | Bissau + GUY | 928 | Georgetown + HTI | 929 | Port-au-Prince + HND | 933 | Tegucigalpa + HKG | 937 | Victoria + SJM | 938 | Longyearbyen + IDN | 939 | Jakarta + IND | 1109 | New Delhi + IRQ | 1365 | Baghdad + IRN | 1380 | Teheran + IRL | 1447 | Dublin + ISL | 1449 | Reykjavik + ISR | 1450 | Jerusalem + ITA | 1464 | Roma + TMP | 1522 | Dili + AUT | 1523 | Wien + JAM | 1530 | Kingston + JPN | 1532 | Tokyo + YEM | 1780 | Sanaa + JOR | 1786 | Amman + CXR | 1791 | Flying Fish Cove + YUG | 1792 | Beograd + KHM | 1800 | Phnom Penh + CMR | 1804 | Yaounde + CAN | 1822 | Ottawa + CPV | 1859 | Praia + KAZ | 1864 | Astana + KEN | 1881 | Nairobi + CAF | 1889 | Bangui + CHN | 1891 | Peking + KGZ | 2253 | Bishkek + KIR | 2256 | Bairiki + COL | 2257 | Santafe de Bogota + COM | 2295 | Moroni + COG | 2296 | Brazzaville + COD | 2298 | Kinshasa + CCK | 2317 | West Island + PRK | 2318 | Pyongyang + KOR | 2331 | Seoul + GRC | 2401 | Athenai + HRV | 2409 | Zagreb + CUB | 2413 | La Habana + KWT | 2429 | Kuwait + CYP | 2430 | Nicosia + LAO | 2432 | Vientiane + LVA | 2434 | Riga + LSO | 2437 | Maseru + LBN | 2438 | Beirut + LBR | 2440 | Monrovia + LBY | 2441 | Tripoli + LIE | 2446 | Vaduz + LTU | 2447 | Vilnius + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] + ESH | 2453 | El-Aaiun + MAC | 2454 | Macao + MDG | 2455 | Antananarivo + MKD | 2460 | Skopje + MWI | 2462 | Lilongwe + MDV | 2463 | Male + MYS | 2464 | Kuala Lumpur + MLI | 2482 | Bamako + MLT | 2484 | Valletta + MAR | 2486 | Rabat + MHL | 2507 | Dalap-Uliga-Darrit + MTQ | 2508 | Fort-de-France + MRT | 2509 | Nouakchott + MUS | 2511 | Port-Louis + MYT | 2514 | Mamoutzou + MEX | 2515 | Ciudad de Mexico + FSM | 2689 | Palikir + MDA | 2690 | Chisinau + MCO | 2695 | Monaco-Ville + MNG | 2696 | Ulan Bator + MSR | 2697 | Plymouth + MOZ | 2698 | Maputo + MMR | 2710 | Rangoon (Yangon) + NAM | 2726 | Windhoek + NRU | 2728 | Yaren + NPL | 2729 | Kathmandu + NIC | 2734 | Managua + NER | 2738 | Niamey + NGA | 2754 | Abuja + NIU | 2805 | Alofi + NFK | 2806 | Kingston + NOR | 2807 | Oslo + CIV | 2814 | Yamoussoukro + OMN | 2821 | Masqat + PAK | 2831 | Islamabad + PLW | 2881 | Koror + PAN | 2882 | Ciudad de Panama + PNG | 2884 | Port Moresby + PRY | 2885 | Asuncion + PER | 2890 | Lima + PCN | 2912 | Adamstown + MNP | 2913 | Garapan + PRT | 2914 | Lisboa + PRI | 2919 | San Juan + POL | 2928 | Warszawa + GNQ | 2972 | Malabo + QAT | 2973 | Doha + FRA | 2974 | Paris + GUF | 3014 | Cayenne + PYF | 3016 | Papeete + REU | 3017 | Saint-Denis + ROM | 3018 | Bucuresti + RWA | 3047 | Kigali + SWE | 3048 | Stockholm + SHN | 3063 | Jamestown + KNA | 3064 | Basseterre + LCA | 3065 | Castries + VCT | 3066 | Kingstown + SPM | 3067 | Saint-Pierre + DEU | 3068 | Berlin + SLB | 3161 | Honiara + ZMB | 3162 | Lusaka + WSM | 3169 | Apia + SMR | 3171 | San Marino + STP | 3172 | Sao Tome + SAU | 3173 | Riyadh + SEN | 3198 | Dakar + SYC | 3206 | Victoria + SLE | 3207 | Freetown + SGP | 3208 | Singapore + SVK | 3209 | Bratislava + SVN | 3212 | Ljubljana + SOM | 3214 | Mogadishu + LKA | 3217 | Colombo + SDN | 3225 | Khartum + FIN | 3236 | Helsinki [Helsingfors] + SUR | 3243 | Paramaribo + SWZ | 3244 | Mbabane + CHE | 3248 | Bern + SYR | 3250 | Damascus + TJK | 3261 | Dushanbe + TWN | 3263 | Taipei + TZA | 3306 | Dodoma + DNK | 3315 | Kobenhavn + THA | 3320 | Bangkok + TGO | 3332 | Lome + TKL | 3333 | Fakaofo + TON | 3334 | Nukualofa + TTO | 3336 | Port-of-Spain + TCD | 3337 | NDjamena + CZE | 3339 | Praha + TUN | 3349 | Tunis + TUR | 3358 | Ankara + TKM | 3419 | Ashgabat + TCA | 3423 | Cockburn Town + TUV | 3424 | Funafuti + UGA | 3425 | Kampala + UKR | 3426 | Kyiv + HUN | 3483 | Budapest + URY | 3492 | Montevideo + NCL | 3493 | Noumea + NZL | 3499 | Wellington + UZB | 3503 | Toskent + BLR | 3520 | Minsk + WLF | 3536 | Mata-Utu + VUT | 3537 | Port-Vila + VAT | 3538 | Citta del Vaticano + VEN | 3539 | Caracas + RUS | 3580 | Moscow + VNM | 3770 | Hanoi + EST | 3791 | Tallinn + USA | 3813 | Washington + VIR | 4067 | Charlotte Amalie + ZWE | 4068 | Harare + PSE | 4074 | Gaza +(232 rows) + +--query 2 +with lang_total(lang_count,code,countrycode,name) as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) +select * from lang_total; +ERROR: WITH query "lang_total" has 3 columns available but 4 columns specified +LINE 1: with lang_total(lang_count,code,countrycode,name) as + ^ +-- queries with CTEs using hash joins +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + code | id | name | countrycode | language | isofficial | percentage +------+------+-----------------------------------+-------------+------------------+------------+------------ + ABW | 129 | Oranjestad | ABW | Dutch | t | 5.3 + AFG | 1 | Kabul | AFG | Dari | t | 32.1 + AFG | 1 | Kabul | AFG | Pashto | t | 52.4 + AIA | 62 | The Valley | AIA | English | t | 0 + ALB | 34 | Tirana | ALB | Albaniana | t | 97.9 + AND | 55 | Andorra la Vella | AND | Catalan | t | 32.3 + ANT | 33 | Willemstad | ANT | Dutch | t | 0 + ANT | 33 | Willemstad | ANT | Papiamento | t | 86.2 + ARE | 65 | Abu Dhabi | ARE | Arabic | t | 42 + ARG | 69 | Buenos Aires | ARG | Spanish | t | 96.8 + ARM | 126 | Yerevan | ARM | Armenian | t | 93.4 + ASM | 54 | Fagatogo | ASM | English | t | 3.1 + ASM | 54 | Fagatogo | ASM | Samoan | t | 90.6 + ATG | 63 | Saint Johns | ATG | English | t | 0 + AUS | 135 | Canberra | AUS | English | t | 81.2 + AUT | 1523 | Wien | AUT | German | t | 92 + AZE | 144 | Baku | AZE | Azerbaijani | t | 89 + BDI | 552 | Bujumbura | BDI | French | t | 0 + BDI | 552 | Bujumbura | BDI | Kirundi | t | 98.1 + BEL | 179 | Bruxelles [Brussel] | BEL | Dutch | t | 59.2 + BEL | 179 | Bruxelles [Brussel] | BEL | French | t | 32.6 + BEL | 179 | Bruxelles [Brussel] | BEL | German | t | 1 + BGD | 150 | Dhaka | BGD | Bengali | t | 97.7 + BGR | 539 | Sofija | BGR | Bulgariana | t | 83.2 + BHR | 149 | al-Manama | BHR | Arabic | t | 67.7 + BIH | 201 | Sarajevo | BIH | Serbo-Croatian | t | 99.2 + BLR | 3520 | Minsk | BLR | Belorussian | t | 65.6 + BLR | 3520 | Minsk | BLR | Russian | t | 32 + BLZ | 185 | Belmopan | BLZ | English | t | 50.8 + BMU | 191 | Hamilton | BMU | English | t | 100 + BOL | 194 | La Paz | BOL | Aimara | t | 3.2 + BOL | 194 | La Paz | BOL | Ketdua | t | 8.1 + BOL | 194 | La Paz | BOL | Spanish | t | 87.7 + BRA | 211 | Brasilia | BRA | Portuguese | t | 97.5 + BRB | 174 | Bridgetown | BRB | English | t | 0 + BRN | 538 | Bandar Seri Begawan | BRN | Malay | t | 45.5 + BTN | 192 | Thimphu | BTN | Dzongkha | t | 50 + CAN | 1822 | Ottawa | CAN | English | t | 60.4 + CAN | 1822 | Ottawa | CAN | French | t | 23.4 + CCK | 2317 | West Island | CCK | English | t | 0 + CHE | 3248 | Bern | CHE | French | t | 19.2 + CHE | 3248 | Bern | CHE | German | t | 63.6 + CHE | 3248 | Bern | CHE | Italian | t | 7.7 + CHE | 3248 | Bern | CHE | Romansh | t | 0.6 + CHL | 554 | Santiago de Chile | CHL | Spanish | t | 89.7 + CHN | 1891 | Peking | CHN | Chinese | t | 92 + COK | 583 | Avarua | COK | Maori | t | 0 + COL | 2257 | Santafe de Bogota | COL | Spanish | t | 99 + COM | 2295 | Moroni | COM | Comorian | t | 75 + CPV | 1859 | Praia | CPV | Portuguese | t | 0 + CRI | 584 | San Jose | CRI | Spanish | t | 97.5 + CUB | 2413 | La Habana | CUB | Spanish | t | 100 + CXR | 1791 | Flying Fish Cove | CXR | English | t | 0 + CYM | 553 | George Town | CYM | English | t | 0 + CYP | 2430 | Nicosia | CYP | Greek | t | 74.1 + CYP | 2430 | Nicosia | CYP | Turkish | t | 22.4 + CZE | 3339 | Praha | CZE | Czech | t | 81.2 + DEU | 3068 | Berlin | DEU | German | t | 91.3 + DJI | 585 | Djibouti | DJI | Arabic | t | 10.6 + DNK | 3315 | Kobenhavn | DNK | Danish | t | 93.5 + DOM | 587 | Santo Domingo de Guzman | DOM | Spanish | t | 98 + DZA | 35 | Alger | DZA | Arabic | t | 86 + ECU | 594 | Quito | ECU | Spanish | t | 93 + EGY | 608 | Cairo | EGY | Arabic | t | 98.8 + ERI | 652 | Asmara | ERI | Tigrinja | t | 49.1 + ESH | 2453 | El-Aaiun | ESH | Arabic | t | 100 + ESP | 653 | Madrid | ESP | Spanish | t | 74.4 + EST | 3791 | Tallinn | EST | Estonian | t | 65.3 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Finnish | t | 92.7 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Swedish | t | 5.7 + FJI | 764 | Suva | FJI | Fijian | t | 50.8 + FLK | 763 | Stanley | FLK | English | t | 0 + FRA | 2974 | Paris | FRA | French | t | 93.6 + FRO | 901 | Torshavn | FRO | Danish | t | 0 + FRO | 901 | Torshavn | FRO | Faroese | t | 100 + GBR | 456 | London | GBR | English | t | 97.3 + GEO | 905 | Tbilisi | GEO | Georgiana | t | 71.7 + GIB | 915 | Gibraltar | GIB | English | t | 88.9 + GLP | 919 | Basse-Terre | GLP | French | t | 0 + GNB | 927 | Bissau | GNB | Portuguese | t | 8.1 + GRC | 2401 | Athenai | GRC | Greek | t | 98.5 + GRL | 917 | Nuuk | GRL | Danish | t | 12.5 + GRL | 917 | Nuuk | GRL | Greenlandic | t | 87.5 + GTM | 922 | Ciudad de Guatemala | GTM | Spanish | t | 64.7 + GUM | 921 | Agaaa | GUM | Chamorro | t | 29.6 + GUM | 921 | Agaaa | GUM | English | t | 37.5 + HKG | 937 | Victoria | HKG | English | t | 2.2 + HND | 933 | Tegucigalpa | HND | Spanish | t | 97.2 + HRV | 2409 | Zagreb | HRV | Serbo-Croatian | t | 95.9 + HTI | 929 | Port-au-Prince | HTI | French | t | 0 + HUN | 3483 | Budapest | HUN | Hungarian | t | 98.5 + IDN | 939 | Jakarta | IDN | Malay | t | 12.1 + IND | 1109 | New Delhi | IND | Hindi | t | 39.9 + IRL | 1447 | Dublin | IRL | English | t | 98.4 + IRL | 1447 | Dublin | IRL | Irish | t | 1.6 + IRN | 1380 | Teheran | IRN | Persian | t | 45.7 + IRQ | 1365 | Baghdad | IRQ | Arabic | t | 77.2 + ISL | 1449 | Reykjavik | ISL | Icelandic | t | 95.7 + ISR | 1450 | Jerusalem | ISR | Arabic | t | 18 + ISR | 1450 | Jerusalem | ISR | Hebrew | t | 63.1 + ITA | 1464 | Roma | ITA | Italian | t | 94.1 + JOR | 1786 | Amman | JOR | Arabic | t | 97.9 + JPN | 1532 | Tokyo | JPN | Japanese | t | 99.1 + KAZ | 1864 | Astana | KAZ | Kazakh | t | 46 + KGZ | 2253 | Bishkek | KGZ | Kirgiz | t | 59.7 + KGZ | 2253 | Bishkek | KGZ | Russian | t | 16.2 + KHM | 1800 | Phnom Penh | KHM | Khmer | t | 88.6 + KIR | 2256 | Bairiki | KIR | Kiribati | t | 98.9 + KNA | 3064 | Basseterre | KNA | English | t | 0 + KOR | 2331 | Seoul | KOR | Korean | t | 99.9 + KWT | 2429 | Kuwait | KWT | Arabic | t | 78.1 + LAO | 2432 | Vientiane | LAO | Lao | t | 67.2 + LBN | 2438 | Beirut | LBN | Arabic | t | 93 + LBY | 2441 | Tripoli | LBY | Arabic | t | 96 + LCA | 3065 | Castries | LCA | English | t | 20 + LIE | 2446 | Vaduz | LIE | German | t | 89 + LKA | 3217 | Colombo | LKA | Singali | t | 60.3 + LKA | 3217 | Colombo | LKA | Tamil | t | 19.6 + LSO | 2437 | Maseru | LSO | English | t | 0 + LSO | 2437 | Maseru | LSO | Sotho | t | 85 + LTU | 2447 | Vilnius | LTU | Lithuanian | t | 81.6 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | French | t | 4.2 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | German | t | 2.3 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | Luxembourgish | t | 64.4 + LVA | 2434 | Riga | LVA | Latvian | t | 55.1 + MAC | 2454 | Macao | MAC | Portuguese | t | 2.3 + MAR | 2486 | Rabat | MAR | Arabic | t | 65 + MCO | 2695 | Monaco-Ville | MCO | French | t | 41.9 + MDA | 2690 | Chisinau | MDA | Romanian | t | 61.9 + MDG | 2455 | Antananarivo | MDG | French | t | 0 + MDG | 2455 | Antananarivo | MDG | Malagasy | t | 98.9 + MDV | 2463 | Male | MDV | Dhivehi | t | 100 + MEX | 2515 | Ciudad de Mexico | MEX | Spanish | t | 92.1 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | English | t | 0 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | Marshallese | t | 96.8 + MKD | 2460 | Skopje | MKD | Macedonian | t | 66.5 + MLT | 2484 | Valletta | MLT | English | t | 2.1 + MLT | 2484 | Valletta | MLT | Maltese | t | 95.8 + MMR | 2710 | Rangoon (Yangon) | MMR | Burmese | t | 69 + MNG | 2696 | Ulan Bator | MNG | Mongolian | t | 78.8 + MNP | 2913 | Garapan | MNP | English | t | 4.8 + MSR | 2697 | Plymouth | MSR | English | t | 0 + MTQ | 2508 | Fort-de-France | MTQ | French | t | 0 + MWI | 2462 | Lilongwe | MWI | Chichewa | t | 58.3 + MYS | 2464 | Kuala Lumpur | MYS | Malay | t | 58.4 + MYT | 2514 | Mamoutzou | MYT | French | t | 20.3 + NCL | 3493 | Noumea | NCL | French | t | 34.3 + NFK | 2806 | Kingston | NFK | English | t | 0 + NIC | 2734 | Managua | NIC | Spanish | t | 97.6 + NIU | 2805 | Alofi | NIU | English | t | 0 + NLD | 5 | Amsterdam | NLD | Dutch | t | 95.6 + NOR | 2807 | Oslo | NOR | Norwegian | t | 96.6 + NPL | 2729 | Kathmandu | NPL | Nepali | t | 50.4 + NRU | 2728 | Yaren | NRU | English | t | 7.5 + NRU | 2728 | Yaren | NRU | Nauru | t | 57.5 + NZL | 3499 | Wellington | NZL | English | t | 87 + OMN | 2821 | Masqat | OMN | Arabic | t | 76.7 + PAK | 2831 | Islamabad | PAK | Urdu | t | 7.6 + PAN | 2882 | Ciudad de Panama | PAN | Spanish | t | 76.8 + PER | 2890 | Lima | PER | Aimara | t | 2.3 + PER | 2890 | Lima | PER | Ketdua | t | 16.4 + PER | 2890 | Lima | PER | Spanish | t | 79.8 + PHL | 766 | Manila | PHL | Pilipino | t | 29.3 + PLW | 2881 | Koror | PLW | English | t | 3.2 + PLW | 2881 | Koror | PLW | Palau | t | 82.2 + POL | 2928 | Warszawa | POL | Polish | t | 97.6 + PRI | 2919 | San Juan | PRI | Spanish | t | 51.3 + PRK | 2318 | Pyongyang | PRK | Korean | t | 99.9 + PRT | 2914 | Lisboa | PRT | Portuguese | t | 99 + PRY | 2885 | Asuncion | PRY | Guarani | t | 40.1 + PRY | 2885 | Asuncion | PRY | Spanish | t | 55.1 + PYF | 3016 | Papeete | PYF | French | t | 40.8 + QAT | 2973 | Doha | QAT | Arabic | t | 40.7 + ROM | 3018 | Bucuresti | ROM | Romani | t | 0.7 + ROM | 3018 | Bucuresti | ROM | Romanian | t | 90.7 + RUS | 3580 | Moscow | RUS | Russian | t | 86.6 + RWA | 3047 | Kigali | RWA | French | t | 0 + RWA | 3047 | Kigali | RWA | Rwanda | t | 100 + SAU | 3173 | Riyadh | SAU | Arabic | t | 95 + SDN | 3225 | Khartum | SDN | Arabic | t | 49.4 + SEN | 3198 | Dakar | SEN | Wolof | t | 48.1 + SGP | 3208 | Singapore | SGP | Chinese | t | 77.1 + SGP | 3208 | Singapore | SGP | Malay | t | 14.1 + SGP | 3208 | Singapore | SGP | Tamil | t | 7.4 + SHN | 3063 | Jamestown | SHN | English | t | 0 + SJM | 938 | Longyearbyen | SJM | Norwegian | t | 0 + SLV | 645 | San Salvador | SLV | Spanish | t | 100 + SMR | 3171 | San Marino | SMR | Italian | t | 100 + SOM | 3214 | Mogadishu | SOM | Arabic | t | 0 + SOM | 3214 | Mogadishu | SOM | Somali | t | 98.3 + SPM | 3067 | Saint-Pierre | SPM | French | t | 0 + SVK | 3209 | Bratislava | SVK | Slovak | t | 85.6 + SVN | 3212 | Ljubljana | SVN | Slovene | t | 87.9 + SWE | 3048 | Stockholm | SWE | Swedish | t | 89.5 + SWZ | 3244 | Mbabane | SWZ | Swazi | t | 89.9 + SYC | 3206 | Victoria | SYC | English | t | 3.8 + SYC | 3206 | Victoria | SYC | French | t | 1.3 + SYR | 3250 | Damascus | SYR | Arabic | t | 90 + TCA | 3423 | Cockburn Town | TCA | English | t | 0 + TCD | 3337 | NDjamena | TCD | Arabic | t | 12.3 + TGO | 3332 | Lome | TGO | Ewe | t | 23.2 + TGO | 3332 | Lome | TGO | Kabye | t | 13.8 + THA | 3320 | Bangkok | THA | Thai | t | 52.6 + TJK | 3261 | Dushanbe | TJK | Tadzhik | t | 62.2 + TKL | 3333 | Fakaofo | TKL | English | t | 0 + TKM | 3419 | Ashgabat | TKM | Turkmenian | t | 76.7 + TMP | 1522 | Dili | TMP | Portuguese | t | 0 + TON | 3334 | Nukualofa | TON | English | t | 0 + TON | 3334 | Nukualofa | TON | Tongan | t | 98.3 + TUN | 3349 | Tunis | TUN | Arabic | t | 69.9 + TUR | 3358 | Ankara | TUR | Turkish | t | 87.6 + TUV | 3424 | Funafuti | TUV | English | t | 0 + TUV | 3424 | Funafuti | TUV | Tuvalu | t | 92.5 + TWN | 3263 | Taipei | TWN | Mandarin Chinese | t | 20.1 + TZA | 3306 | Dodoma | TZA | Swahili | t | 8.8 + UKR | 3426 | Kyiv | UKR | Ukrainian | t | 64.7 + URY | 3492 | Montevideo | URY | Spanish | t | 95.7 + USA | 3813 | Washington | USA | English | t | 86.2 + UZB | 3503 | Toskent | UZB | Uzbek | t | 72.6 + VAT | 3538 | Citta del Vaticano | VAT | Italian | t | 0 + VCT | 3066 | Kingstown | VCT | English | t | 0 + VEN | 3539 | Caracas | VEN | Spanish | t | 96.9 + VGB | 537 | Road Town | VGB | English | t | 0 + VIR | 4067 | Charlotte Amalie | VIR | English | t | 81.7 + VNM | 3770 | Hanoi | VNM | Vietnamese | t | 86.8 + VUT | 3537 | Port-Vila | VUT | Bislama | t | 56.6 + VUT | 3537 | Port-Vila | VUT | English | t | 28.3 + VUT | 3537 | Port-Vila | VUT | French | t | 14.2 + WSM | 3169 | Apia | WSM | English | t | 0.6 + WSM | 3169 | Apia | WSM | Samoan | t | 47.5 + YEM | 1780 | Sanaa | YEM | Arabic | t | 99.6 + YUG | 1792 | Beograd | YUG | Serbo-Croatian | t | 75.2 + ZAF | 716 | Pretoria | ZAF | Afrikaans | t | 14.3 + ZAF | 716 | Pretoria | ZAF | English | t | 8.5 + ZAF | 716 | Pretoria | ZAF | Xhosa | t | 17.7 + ZAF | 716 | Pretoria | ZAF | Zulu | t | 22.7 + ZWE | 4068 | Harare | ZWE | English | t | 2.2 +(237 rows) + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + lang_count | code | name | continent | region | population +------------+------+---------------------------------+-----------+-----------------+------------ + 12 | RUS | Russian Federation | Europe | Eastern Europe | 146934000 + 6 | FSM | Micronesia, Federated States of | Oceania | Micronesia | 119000 + 4 | AZE | Azerbaijan | Asia | Middle East | 7734000 + 1 | BIH | Bosnia and Herzegovina | Europe | Southern Europe | 3972000 +(4 rows) + +-- Using CTE in the WHERE clause +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + name | name | cnt +--------------------+------------------+----- + Australia | Canberra | 8 + Austria | Wien | 8 + Canada | Ottawa | 12 + China | Peking | 12 + Denmark | Kobenhavn | 7 + India | New Delhi | 12 + Iran | Teheran | 10 + Italy | Roma | 8 + Myanmar | Rangoon (Yangon) | 8 + Russian Federation | Moscow | 12 + South Africa | Pretoria | 11 + United States | Washington | 12 +(12 rows) + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' +UNION ALL +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + code | country | capital | headofstate | compared_with_cheap_asian_cnt +------+----------------------------------+-------------------------+-----------------------------------+------------------------------- + ATG | Antigua and Barbuda | Saint Johns | Elisabeth II | 2 + ARG | Argentina | Buenos Aires | Fernando de la Rua | 3 + ABW | Aruba | Oranjestad | Beatrix | 4 + BHS | Bahamas | Nassau | Elisabeth II | 2 + BRB | Barbados | Bridgetown | Elisabeth II | 2 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + CAN | Canada | Ottawa | Elisabeth II | 12 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + CRI | Costa Rica | San Jose | Miguel Angel Rodriguez Echeverria | 4 + DMA | Dominica | Roseau | Vernon Shaw | 2 + DOM | Dominican Republic | Santo Domingo de Guzman | Hipolito Mejia Dominguez | 2 + ECU | Ecuador | Quito | Gustavo Noboa Bejarano | 2 + SLV | El Salvador | San Salvador | Francisco Guillermo Flores Perez | 2 + GUF | French Guiana | Cayenne | Jacques Chirac | 2 + GRL | Greenland | Nuuk | Margrethe II | 2 + GLP | Guadeloupe | Basse-Terre | Jacques Chirac | 2 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + GUY | Guyana | Georgetown | Bharrat Jagdeo | 3 + HTI | Haiti | Port-au-Prince | Jean-Bertrand Aristide | 2 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 + JAM | Jamaica | Kingston | Elisabeth II | 2 + MTQ | Martinique | Fort-de-France | Jacques Chirac | 2 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + ANT | Netherlands Antilles | Willemstad | Beatrix | 3 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + PER | Peru | Lima | Valentin Paniagua Corazao | 3 + PRI | Puerto Rico | San Juan | George W. Bush | 2 + KNA | Saint Kitts and Nevis | Basseterre | Elisabeth II | 2 + LCA | Saint Lucia | Castries | Elisabeth II | 2 + VCT | Saint Vincent and the Grenadines | Kingstown | Elisabeth II | 2 + SUR | Suriname | Paramaribo | Ronald Venetiaan | 2 + TTO | Trinidad and Tobago | Port-of-Spain | Arthur N. R. Robinson | 3 + USA | United States | Washington | George W. Bush | 12 + VEN | Venezuela | Caracas | Hugo Chavez Frias | 3 + VIR | Virgin Islands, U.S. | Charlotte Amalie | George W. Bush | 3 +(40 rows) + +-- query 6 + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + count +------- + 43 +(1 row) + +-- query7 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + code | country | capital | language | isofficial | percentage | code | country | capital | language | isofficial | percentage +------+------------------------+-----------------------------------+----------------+------------+------------+------+------------------------+-----------------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Tirana | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | Wien | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Russian | t | 32 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Praha | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Kobenhavn | Danish | t | 93.5 + EST | Estonia | Tallinn | Estonian | t | 65.3 | EST | Estonia | Tallinn | Estonian | t | 65.3 + FRO | Faroe Islands | Torshavn | Danish | t | 0 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FRA | France | Paris | French | t | 93.6 | FRA | France | Paris | French | t | 93.6 + DEU | Germany | Berlin | German | t | 91.3 | DEU | Germany | Berlin | German | t | 91.3 + GIB | Gibraltar | Gibraltar | English | t | 88.9 | GIB | Gibraltar | Gibraltar | English | t | 88.9 + GRC | Greece | Athenai | Greek | t | 98.5 | GRC | Greece | Athenai | Greek | t | 98.5 + HUN | Hungary | Budapest | Hungarian | t | 98.5 | HUN | Hungary | Budapest | Hungarian | t | 98.5 + ISL | Iceland | Reykjavik | Icelandic | t | 95.7 | ISL | Iceland | Reykjavik | Icelandic | t | 95.7 + IRL | Ireland | Dublin | English | t | 98.4 | IRL | Ireland | Dublin | English | t | 98.4 + IRL | Ireland | Dublin | Irish | t | 1.6 | IRL | Ireland | Dublin | English | t | 98.4 + ITA | Italy | Roma | Italian | t | 94.1 | ITA | Italy | Roma | Italian | t | 94.1 + LVA | Latvia | Riga | Latvian | t | 55.1 | LVA | Latvia | Riga | Latvian | t | 55.1 + LIE | Liechtenstein | Vaduz | German | t | 89 | LIE | Liechtenstein | Vaduz | German | t | 89 + LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 | LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | French | t | 4.2 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | German | t | 2.3 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + MKD | Macedonia | Skopje | Macedonian | t | 66.5 | MKD | Macedonia | Skopje | Macedonian | t | 66.5 + MLT | Malta | Valletta | English | t | 2.1 | MLT | Malta | Valletta | Maltese | t | 95.8 + MLT | Malta | Valletta | Maltese | t | 95.8 | MLT | Malta | Valletta | Maltese | t | 95.8 + MDA | Moldova | Chisinau | Romanian | t | 61.9 | MDA | Moldova | Chisinau | Romanian | t | 61.9 + NLD | Netherlands | Amsterdam | Dutch | t | 95.6 | NLD | Netherlands | Amsterdam | Dutch | t | 95.6 + NOR | Norway | Oslo | Norwegian | t | 96.6 | NOR | Norway | Oslo | Norwegian | t | 96.6 + POL | Poland | Warszawa | Polish | t | 97.6 | POL | Poland | Warszawa | Polish | t | 97.6 + PRT | Portugal | Lisboa | Portuguese | t | 99 | PRT | Portugal | Lisboa | Portuguese | t | 99 + ROM | Romania | Bucuresti | Romani | t | 0.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + ROM | Romania | Bucuresti | Romanian | t | 90.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + RUS | Russian Federation | Moscow | Russian | t | 86.6 | RUS | Russian Federation | Moscow | Russian | t | 86.6 + SMR | San Marino | San Marino | Italian | t | 100 | SMR | San Marino | San Marino | Italian | t | 100 + SVK | Slovakia | Bratislava | Slovak | t | 85.6 | SVK | Slovakia | Bratislava | Slovak | t | 85.6 + SVN | Slovenia | Ljubljana | Slovene | t | 87.9 | SVN | Slovenia | Ljubljana | Slovene | t | 87.9 + ESP | Spain | Madrid | Spanish | t | 74.4 | ESP | Spain | Madrid | Spanish | t | 74.4 + SWE | Sweden | Stockholm | Swedish | t | 89.5 | SWE | Sweden | Stockholm | Swedish | t | 89.5 + CHE | Switzerland | Bern | French | t | 19.2 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | German | t | 63.6 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Italian | t | 7.7 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Romansh | t | 0.6 | CHE | Switzerland | Bern | German | t | 63.6 + UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 | UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 + GBR | United Kingdom | London | English | t | 97.3 | GBR | United Kingdom | London | English | t | 97.3 + YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 | YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 +(55 rows) + +-- query8 +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + region_city_cnt | region_lang_cnt | region +-----------------+-----------------+--------------------------- + 840 | 192 | Caribbean + 2824 | 112 | Central America + 11336 | 384 | Eastern Asia + 2664 | 396 | Middle East + 1625 | 125 | North America + 3500 | 70 | South America + 3179 | 528 | Southeast Asia + 12278 | 896 | Southern and Central Asia +(8 rows) + +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + code | name | capital | capital_city | cnt | cnt +------+--------------------+---------+------------------+-----+----- + AUS | Australia | 135 | Canberra | 8 | + AUT | Austria | 1523 | Wien | 8 | + CAN | Canada | 1822 | Ottawa | 12 | + CHN | China | 1891 | Peking | 12 | + DNK | Denmark | 3315 | Kobenhavn | 7 | + IND | India | 1109 | New Delhi | 12 | + IRN | Iran | 1380 | Teheran | 10 | + ITA | Italy | 1464 | Roma | 8 | + MMR | Myanmar | 2710 | Rangoon (Yangon) | 8 | + RUS | Russian Federation | 3580 | Moscow | 12 | + ZAF | South Africa | 716 | Pretoria | 11 | + USA | United States | 3813 | Washington | 12 | +(12 rows) + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + city_cnt | lang_cnt | name | REGION_LIFETIME | REGION_POP | lang_count | REGION_GNP | region +----------+----------+---------------------------------------+------------------+------------+------------+------------+--------------------------- + 4 | 5 | Afghanistan | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 3 | Albania | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 18 | 2 | Algeria | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 5 | 9 | Angola | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 2 | Antigua and Barbuda | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 57 | 3 | Argentina | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 2 | Armenia | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 14 | 8 | Australia | 78.8000030517578 | 22753100 | 11 | 405851.00 | Australia and New Zealand + 6 | 8 | Austria | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 4 | 4 | Azerbaijan | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 1 | 2 | Bahamas | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 1 | 2 | Bahrain | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 24 | 7 | Bangladesh | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 2 | Barbados | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 16 | 4 | Belarus | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 9 | 6 | Belgium | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 2 | 4 | Belize | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 4 | 7 | Benin | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Bhutan | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 8 | 4 | Bolivia | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 1 | Bosnia and Herzegovina | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 2 | 5 | Botswana | 44.8199996948242 | 46886000 | 21 | 126931.00 | Southern Africa + 250 | 5 | Brazil | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 4 | Brunei | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 10 | 4 | Bulgaria | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 3 | 6 | Burkina Faso | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Burundi | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 3 | 4 | Cambodia | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 7 | 8 | Cameroon | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 49 | 12 | Canada | 75.8199996948242 | 309632000 | 18 | 9111890.00 | North America + 1 | 2 | Cape Verde | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 6 | Central African Republic | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 2 | 8 | Chad | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 29 | 4 | Chile | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 38 | 5 | Colombia | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 5 | Comoros | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 2 | 6 | Congo | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 4 | Costa Rica | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 5 | 5 | Cote deIvoire | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 4 | 2 | Croatia | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 14 | 1 | Cuba | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 2 | 2 | Cyprus | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 10 | 8 | Czech Republic | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 1 | 3 | Djibouti | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 1 | 2 | Dominica | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 6 | 2 | Dominican Republic | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 15 | 2 | Ecuador | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 37 | 2 | Egypt | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 7 | 2 | El Salvador | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America +(50 rows) + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + city_cnt | lang_cnt | identifier +----------+----------+--------------------------- + 494 | 10 | British Islands + 159 | 48 | Baltic Countries + 1295 | 161 | Nordic Countries + 50176 | 264 | Eastern Asia + 9414 | 369 | Western Europe + 11880 | 450 | Southern Europe + 32900 | 610 | Eastern Europe + 29161 | 616 | Southeast Asia + 8568 | 792 | Middle East + 80388 | 1092 | Southern and Central Asia +(10 rows) + +-- queries with CTEs using merge joins +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + code | id | name | countrycode | language | isofficial | percentage +------+------+-----------------------------------+-------------+------------------+------------+------------ + ABW | 129 | Oranjestad | ABW | Dutch | t | 5.3 + AFG | 1 | Kabul | AFG | Dari | t | 32.1 + AFG | 1 | Kabul | AFG | Pashto | t | 52.4 + AIA | 62 | The Valley | AIA | English | t | 0 + ALB | 34 | Tirana | ALB | Albaniana | t | 97.9 + AND | 55 | Andorra la Vella | AND | Catalan | t | 32.3 + ANT | 33 | Willemstad | ANT | Dutch | t | 0 + ANT | 33 | Willemstad | ANT | Papiamento | t | 86.2 + ARE | 65 | Abu Dhabi | ARE | Arabic | t | 42 + ARG | 69 | Buenos Aires | ARG | Spanish | t | 96.8 + ARM | 126 | Yerevan | ARM | Armenian | t | 93.4 + ASM | 54 | Fagatogo | ASM | English | t | 3.1 + ASM | 54 | Fagatogo | ASM | Samoan | t | 90.6 + ATG | 63 | Saint Johns | ATG | English | t | 0 + AUS | 135 | Canberra | AUS | English | t | 81.2 + AUT | 1523 | Wien | AUT | German | t | 92 + AZE | 144 | Baku | AZE | Azerbaijani | t | 89 + BDI | 552 | Bujumbura | BDI | French | t | 0 + BDI | 552 | Bujumbura | BDI | Kirundi | t | 98.1 + BEL | 179 | Bruxelles [Brussel] | BEL | Dutch | t | 59.2 + BEL | 179 | Bruxelles [Brussel] | BEL | French | t | 32.6 + BEL | 179 | Bruxelles [Brussel] | BEL | German | t | 1 + BGD | 150 | Dhaka | BGD | Bengali | t | 97.7 + BGR | 539 | Sofija | BGR | Bulgariana | t | 83.2 + BHR | 149 | al-Manama | BHR | Arabic | t | 67.7 + BIH | 201 | Sarajevo | BIH | Serbo-Croatian | t | 99.2 + BLR | 3520 | Minsk | BLR | Belorussian | t | 65.6 + BLR | 3520 | Minsk | BLR | Russian | t | 32 + BLZ | 185 | Belmopan | BLZ | English | t | 50.8 + BMU | 191 | Hamilton | BMU | English | t | 100 + BOL | 194 | La Paz | BOL | Aimara | t | 3.2 + BOL | 194 | La Paz | BOL | Ketdua | t | 8.1 + BOL | 194 | La Paz | BOL | Spanish | t | 87.7 + BRA | 211 | Brasilia | BRA | Portuguese | t | 97.5 + BRB | 174 | Bridgetown | BRB | English | t | 0 + BRN | 538 | Bandar Seri Begawan | BRN | Malay | t | 45.5 + BTN | 192 | Thimphu | BTN | Dzongkha | t | 50 + CAN | 1822 | Ottawa | CAN | English | t | 60.4 + CAN | 1822 | Ottawa | CAN | French | t | 23.4 + CCK | 2317 | West Island | CCK | English | t | 0 + CHE | 3248 | Bern | CHE | French | t | 19.2 + CHE | 3248 | Bern | CHE | German | t | 63.6 + CHE | 3248 | Bern | CHE | Italian | t | 7.7 + CHE | 3248 | Bern | CHE | Romansh | t | 0.6 + CHL | 554 | Santiago de Chile | CHL | Spanish | t | 89.7 + CHN | 1891 | Peking | CHN | Chinese | t | 92 + COK | 583 | Avarua | COK | Maori | t | 0 + COL | 2257 | Santafe de Bogota | COL | Spanish | t | 99 + COM | 2295 | Moroni | COM | Comorian | t | 75 + CPV | 1859 | Praia | CPV | Portuguese | t | 0 + CRI | 584 | San Jose | CRI | Spanish | t | 97.5 + CUB | 2413 | La Habana | CUB | Spanish | t | 100 + CXR | 1791 | Flying Fish Cove | CXR | English | t | 0 + CYM | 553 | George Town | CYM | English | t | 0 + CYP | 2430 | Nicosia | CYP | Greek | t | 74.1 + CYP | 2430 | Nicosia | CYP | Turkish | t | 22.4 + CZE | 3339 | Praha | CZE | Czech | t | 81.2 + DEU | 3068 | Berlin | DEU | German | t | 91.3 + DJI | 585 | Djibouti | DJI | Arabic | t | 10.6 + DNK | 3315 | Kobenhavn | DNK | Danish | t | 93.5 + DOM | 587 | Santo Domingo de Guzman | DOM | Spanish | t | 98 + DZA | 35 | Alger | DZA | Arabic | t | 86 + ECU | 594 | Quito | ECU | Spanish | t | 93 + EGY | 608 | Cairo | EGY | Arabic | t | 98.8 + ERI | 652 | Asmara | ERI | Tigrinja | t | 49.1 + ESH | 2453 | El-Aaiun | ESH | Arabic | t | 100 + ESP | 653 | Madrid | ESP | Spanish | t | 74.4 + EST | 3791 | Tallinn | EST | Estonian | t | 65.3 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Finnish | t | 92.7 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Swedish | t | 5.7 + FJI | 764 | Suva | FJI | Fijian | t | 50.8 + FLK | 763 | Stanley | FLK | English | t | 0 + FRA | 2974 | Paris | FRA | French | t | 93.6 + FRO | 901 | Torshavn | FRO | Danish | t | 0 + FRO | 901 | Torshavn | FRO | Faroese | t | 100 + GBR | 456 | London | GBR | English | t | 97.3 + GEO | 905 | Tbilisi | GEO | Georgiana | t | 71.7 + GIB | 915 | Gibraltar | GIB | English | t | 88.9 + GLP | 919 | Basse-Terre | GLP | French | t | 0 + GNB | 927 | Bissau | GNB | Portuguese | t | 8.1 + GRC | 2401 | Athenai | GRC | Greek | t | 98.5 + GRL | 917 | Nuuk | GRL | Danish | t | 12.5 + GRL | 917 | Nuuk | GRL | Greenlandic | t | 87.5 + GTM | 922 | Ciudad de Guatemala | GTM | Spanish | t | 64.7 + GUM | 921 | Agaaa | GUM | Chamorro | t | 29.6 + GUM | 921 | Agaaa | GUM | English | t | 37.5 + HKG | 937 | Victoria | HKG | English | t | 2.2 + HND | 933 | Tegucigalpa | HND | Spanish | t | 97.2 + HRV | 2409 | Zagreb | HRV | Serbo-Croatian | t | 95.9 + HTI | 929 | Port-au-Prince | HTI | French | t | 0 + HUN | 3483 | Budapest | HUN | Hungarian | t | 98.5 + IDN | 939 | Jakarta | IDN | Malay | t | 12.1 + IND | 1109 | New Delhi | IND | Hindi | t | 39.9 + IRL | 1447 | Dublin | IRL | English | t | 98.4 + IRL | 1447 | Dublin | IRL | Irish | t | 1.6 + IRN | 1380 | Teheran | IRN | Persian | t | 45.7 + IRQ | 1365 | Baghdad | IRQ | Arabic | t | 77.2 + ISL | 1449 | Reykjavik | ISL | Icelandic | t | 95.7 + ISR | 1450 | Jerusalem | ISR | Arabic | t | 18 + ISR | 1450 | Jerusalem | ISR | Hebrew | t | 63.1 + ITA | 1464 | Roma | ITA | Italian | t | 94.1 + JOR | 1786 | Amman | JOR | Arabic | t | 97.9 + JPN | 1532 | Tokyo | JPN | Japanese | t | 99.1 + KAZ | 1864 | Astana | KAZ | Kazakh | t | 46 + KGZ | 2253 | Bishkek | KGZ | Kirgiz | t | 59.7 + KGZ | 2253 | Bishkek | KGZ | Russian | t | 16.2 + KHM | 1800 | Phnom Penh | KHM | Khmer | t | 88.6 + KIR | 2256 | Bairiki | KIR | Kiribati | t | 98.9 + KNA | 3064 | Basseterre | KNA | English | t | 0 + KOR | 2331 | Seoul | KOR | Korean | t | 99.9 + KWT | 2429 | Kuwait | KWT | Arabic | t | 78.1 + LAO | 2432 | Vientiane | LAO | Lao | t | 67.2 + LBN | 2438 | Beirut | LBN | Arabic | t | 93 + LBY | 2441 | Tripoli | LBY | Arabic | t | 96 + LCA | 3065 | Castries | LCA | English | t | 20 + LIE | 2446 | Vaduz | LIE | German | t | 89 + LKA | 3217 | Colombo | LKA | Singali | t | 60.3 + LKA | 3217 | Colombo | LKA | Tamil | t | 19.6 + LSO | 2437 | Maseru | LSO | English | t | 0 + LSO | 2437 | Maseru | LSO | Sotho | t | 85 + LTU | 2447 | Vilnius | LTU | Lithuanian | t | 81.6 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | French | t | 4.2 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | German | t | 2.3 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | Luxembourgish | t | 64.4 + LVA | 2434 | Riga | LVA | Latvian | t | 55.1 + MAC | 2454 | Macao | MAC | Portuguese | t | 2.3 + MAR | 2486 | Rabat | MAR | Arabic | t | 65 + MCO | 2695 | Monaco-Ville | MCO | French | t | 41.9 + MDA | 2690 | Chisinau | MDA | Romanian | t | 61.9 + MDG | 2455 | Antananarivo | MDG | French | t | 0 + MDG | 2455 | Antananarivo | MDG | Malagasy | t | 98.9 + MDV | 2463 | Male | MDV | Dhivehi | t | 100 + MEX | 2515 | Ciudad de Mexico | MEX | Spanish | t | 92.1 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | English | t | 0 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | Marshallese | t | 96.8 + MKD | 2460 | Skopje | MKD | Macedonian | t | 66.5 + MLT | 2484 | Valletta | MLT | English | t | 2.1 + MLT | 2484 | Valletta | MLT | Maltese | t | 95.8 + MMR | 2710 | Rangoon (Yangon) | MMR | Burmese | t | 69 + MNG | 2696 | Ulan Bator | MNG | Mongolian | t | 78.8 + MNP | 2913 | Garapan | MNP | English | t | 4.8 + MSR | 2697 | Plymouth | MSR | English | t | 0 + MTQ | 2508 | Fort-de-France | MTQ | French | t | 0 + MWI | 2462 | Lilongwe | MWI | Chichewa | t | 58.3 + MYS | 2464 | Kuala Lumpur | MYS | Malay | t | 58.4 + MYT | 2514 | Mamoutzou | MYT | French | t | 20.3 + NCL | 3493 | Noumea | NCL | French | t | 34.3 + NFK | 2806 | Kingston | NFK | English | t | 0 + NIC | 2734 | Managua | NIC | Spanish | t | 97.6 + NIU | 2805 | Alofi | NIU | English | t | 0 + NLD | 5 | Amsterdam | NLD | Dutch | t | 95.6 + NOR | 2807 | Oslo | NOR | Norwegian | t | 96.6 + NPL | 2729 | Kathmandu | NPL | Nepali | t | 50.4 + NRU | 2728 | Yaren | NRU | English | t | 7.5 + NRU | 2728 | Yaren | NRU | Nauru | t | 57.5 + NZL | 3499 | Wellington | NZL | English | t | 87 + OMN | 2821 | Masqat | OMN | Arabic | t | 76.7 + PAK | 2831 | Islamabad | PAK | Urdu | t | 7.6 + PAN | 2882 | Ciudad de Panama | PAN | Spanish | t | 76.8 + PER | 2890 | Lima | PER | Aimara | t | 2.3 + PER | 2890 | Lima | PER | Ketdua | t | 16.4 + PER | 2890 | Lima | PER | Spanish | t | 79.8 + PHL | 766 | Manila | PHL | Pilipino | t | 29.3 + PLW | 2881 | Koror | PLW | English | t | 3.2 + PLW | 2881 | Koror | PLW | Palau | t | 82.2 + POL | 2928 | Warszawa | POL | Polish | t | 97.6 + PRI | 2919 | San Juan | PRI | Spanish | t | 51.3 + PRK | 2318 | Pyongyang | PRK | Korean | t | 99.9 + PRT | 2914 | Lisboa | PRT | Portuguese | t | 99 + PRY | 2885 | Asuncion | PRY | Guarani | t | 40.1 + PRY | 2885 | Asuncion | PRY | Spanish | t | 55.1 + PYF | 3016 | Papeete | PYF | French | t | 40.8 + QAT | 2973 | Doha | QAT | Arabic | t | 40.7 + ROM | 3018 | Bucuresti | ROM | Romani | t | 0.7 + ROM | 3018 | Bucuresti | ROM | Romanian | t | 90.7 + RUS | 3580 | Moscow | RUS | Russian | t | 86.6 + RWA | 3047 | Kigali | RWA | French | t | 0 + RWA | 3047 | Kigali | RWA | Rwanda | t | 100 + SAU | 3173 | Riyadh | SAU | Arabic | t | 95 + SDN | 3225 | Khartum | SDN | Arabic | t | 49.4 + SEN | 3198 | Dakar | SEN | Wolof | t | 48.1 + SGP | 3208 | Singapore | SGP | Chinese | t | 77.1 + SGP | 3208 | Singapore | SGP | Malay | t | 14.1 + SGP | 3208 | Singapore | SGP | Tamil | t | 7.4 + SHN | 3063 | Jamestown | SHN | English | t | 0 + SJM | 938 | Longyearbyen | SJM | Norwegian | t | 0 + SLV | 645 | San Salvador | SLV | Spanish | t | 100 + SMR | 3171 | San Marino | SMR | Italian | t | 100 + SOM | 3214 | Mogadishu | SOM | Arabic | t | 0 + SOM | 3214 | Mogadishu | SOM | Somali | t | 98.3 + SPM | 3067 | Saint-Pierre | SPM | French | t | 0 + SVK | 3209 | Bratislava | SVK | Slovak | t | 85.6 + SVN | 3212 | Ljubljana | SVN | Slovene | t | 87.9 + SWE | 3048 | Stockholm | SWE | Swedish | t | 89.5 + SWZ | 3244 | Mbabane | SWZ | Swazi | t | 89.9 + SYC | 3206 | Victoria | SYC | English | t | 3.8 + SYC | 3206 | Victoria | SYC | French | t | 1.3 + SYR | 3250 | Damascus | SYR | Arabic | t | 90 + TCA | 3423 | Cockburn Town | TCA | English | t | 0 + TCD | 3337 | NDjamena | TCD | Arabic | t | 12.3 + TGO | 3332 | Lome | TGO | Ewe | t | 23.2 + TGO | 3332 | Lome | TGO | Kabye | t | 13.8 + THA | 3320 | Bangkok | THA | Thai | t | 52.6 + TJK | 3261 | Dushanbe | TJK | Tadzhik | t | 62.2 + TKL | 3333 | Fakaofo | TKL | English | t | 0 + TKM | 3419 | Ashgabat | TKM | Turkmenian | t | 76.7 + TMP | 1522 | Dili | TMP | Portuguese | t | 0 + TON | 3334 | Nukualofa | TON | English | t | 0 + TON | 3334 | Nukualofa | TON | Tongan | t | 98.3 + TUN | 3349 | Tunis | TUN | Arabic | t | 69.9 + TUR | 3358 | Ankara | TUR | Turkish | t | 87.6 + TUV | 3424 | Funafuti | TUV | English | t | 0 + TUV | 3424 | Funafuti | TUV | Tuvalu | t | 92.5 + TWN | 3263 | Taipei | TWN | Mandarin Chinese | t | 20.1 + TZA | 3306 | Dodoma | TZA | Swahili | t | 8.8 + UKR | 3426 | Kyiv | UKR | Ukrainian | t | 64.7 + URY | 3492 | Montevideo | URY | Spanish | t | 95.7 + USA | 3813 | Washington | USA | English | t | 86.2 + UZB | 3503 | Toskent | UZB | Uzbek | t | 72.6 + VAT | 3538 | Citta del Vaticano | VAT | Italian | t | 0 + VCT | 3066 | Kingstown | VCT | English | t | 0 + VEN | 3539 | Caracas | VEN | Spanish | t | 96.9 + VGB | 537 | Road Town | VGB | English | t | 0 + VIR | 4067 | Charlotte Amalie | VIR | English | t | 81.7 + VNM | 3770 | Hanoi | VNM | Vietnamese | t | 86.8 + VUT | 3537 | Port-Vila | VUT | Bislama | t | 56.6 + VUT | 3537 | Port-Vila | VUT | English | t | 28.3 + VUT | 3537 | Port-Vila | VUT | French | t | 14.2 + WSM | 3169 | Apia | WSM | English | t | 0.6 + WSM | 3169 | Apia | WSM | Samoan | t | 47.5 + YEM | 1780 | Sanaa | YEM | Arabic | t | 99.6 + YUG | 1792 | Beograd | YUG | Serbo-Croatian | t | 75.2 + ZAF | 716 | Pretoria | ZAF | Afrikaans | t | 14.3 + ZAF | 716 | Pretoria | ZAF | English | t | 8.5 + ZAF | 716 | Pretoria | ZAF | Xhosa | t | 17.7 + ZAF | 716 | Pretoria | ZAF | Zulu | t | 22.7 + ZWE | 4068 | Harare | ZWE | English | t | 2.2 +(237 rows) + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + lang_count | code | name | continent | region | population +------------+------+---------------------------------+-----------+-----------------+------------ + 12 | RUS | Russian Federation | Europe | Eastern Europe | 146934000 + 6 | FSM | Micronesia, Federated States of | Oceania | Micronesia | 119000 + 4 | AZE | Azerbaijan | Asia | Middle East | 7734000 + 1 | BIH | Bosnia and Herzegovina | Europe | Southern Europe | 3972000 +(4 rows) + +-- Using CTE in the WHERE clause +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + name | name | cnt +--------------------+------------------+----- + Australia | Canberra | 8 + Austria | Wien | 8 + Canada | Ottawa | 12 + China | Peking | 12 + Denmark | Kobenhavn | 7 + India | New Delhi | 12 + Iran | Teheran | 10 + Italy | Roma | 8 + Myanmar | Rangoon (Yangon) | 8 + Russian Federation | Moscow | 12 + South Africa | Pretoria | 11 + United States | Washington | 12 +(12 rows) + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' +UNION ALL +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + code | country | capital | headofstate | compared_with_cheap_asian_cnt +------+----------------------------------+-------------------------+-----------------------------------+------------------------------- + ATG | Antigua and Barbuda | Saint Johns | Elisabeth II | 2 + ARG | Argentina | Buenos Aires | Fernando de la Rua | 3 + ABW | Aruba | Oranjestad | Beatrix | 4 + BHS | Bahamas | Nassau | Elisabeth II | 2 + BRB | Barbados | Bridgetown | Elisabeth II | 2 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + CAN | Canada | Ottawa | Elisabeth II | 12 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + CRI | Costa Rica | San Jose | Miguel Angel Rodriguez Echeverria | 4 + DMA | Dominica | Roseau | Vernon Shaw | 2 + DOM | Dominican Republic | Santo Domingo de Guzman | Hipolito Mejia Dominguez | 2 + ECU | Ecuador | Quito | Gustavo Noboa Bejarano | 2 + SLV | El Salvador | San Salvador | Francisco Guillermo Flores Perez | 2 + GUF | French Guiana | Cayenne | Jacques Chirac | 2 + GRL | Greenland | Nuuk | Margrethe II | 2 + GLP | Guadeloupe | Basse-Terre | Jacques Chirac | 2 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + GUY | Guyana | Georgetown | Bharrat Jagdeo | 3 + HTI | Haiti | Port-au-Prince | Jean-Bertrand Aristide | 2 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 + JAM | Jamaica | Kingston | Elisabeth II | 2 + MTQ | Martinique | Fort-de-France | Jacques Chirac | 2 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + ANT | Netherlands Antilles | Willemstad | Beatrix | 3 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + PER | Peru | Lima | Valentin Paniagua Corazao | 3 + PRI | Puerto Rico | San Juan | George W. Bush | 2 + KNA | Saint Kitts and Nevis | Basseterre | Elisabeth II | 2 + LCA | Saint Lucia | Castries | Elisabeth II | 2 + VCT | Saint Vincent and the Grenadines | Kingstown | Elisabeth II | 2 + SUR | Suriname | Paramaribo | Ronald Venetiaan | 2 + TTO | Trinidad and Tobago | Port-of-Spain | Arthur N. R. Robinson | 3 + USA | United States | Washington | George W. Bush | 12 + VEN | Venezuela | Caracas | Hugo Chavez Frias | 3 + VIR | Virgin Islands, U.S. | Charlotte Amalie | George W. Bush | 3 +(40 rows) + +-- query 6 + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + count +------- + 43 +(1 row) + +-- query7 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + code | country | capital | language | isofficial | percentage | code | country | capital | language | isofficial | percentage +------+------------------------+-----------------------------------+----------------+------------+------------+------+------------------------+-----------------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Tirana | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | Wien | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Russian | t | 32 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Praha | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Kobenhavn | Danish | t | 93.5 + EST | Estonia | Tallinn | Estonian | t | 65.3 | EST | Estonia | Tallinn | Estonian | t | 65.3 + FRO | Faroe Islands | Torshavn | Danish | t | 0 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FRA | France | Paris | French | t | 93.6 | FRA | France | Paris | French | t | 93.6 + DEU | Germany | Berlin | German | t | 91.3 | DEU | Germany | Berlin | German | t | 91.3 + GIB | Gibraltar | Gibraltar | English | t | 88.9 | GIB | Gibraltar | Gibraltar | English | t | 88.9 + GRC | Greece | Athenai | Greek | t | 98.5 | GRC | Greece | Athenai | Greek | t | 98.5 + HUN | Hungary | Budapest | Hungarian | t | 98.5 | HUN | Hungary | Budapest | Hungarian | t | 98.5 + ISL | Iceland | Reykjavik | Icelandic | t | 95.7 | ISL | Iceland | Reykjavik | Icelandic | t | 95.7 + IRL | Ireland | Dublin | English | t | 98.4 | IRL | Ireland | Dublin | English | t | 98.4 + IRL | Ireland | Dublin | Irish | t | 1.6 | IRL | Ireland | Dublin | English | t | 98.4 + ITA | Italy | Roma | Italian | t | 94.1 | ITA | Italy | Roma | Italian | t | 94.1 + LVA | Latvia | Riga | Latvian | t | 55.1 | LVA | Latvia | Riga | Latvian | t | 55.1 + LIE | Liechtenstein | Vaduz | German | t | 89 | LIE | Liechtenstein | Vaduz | German | t | 89 + LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 | LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | French | t | 4.2 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | German | t | 2.3 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + MKD | Macedonia | Skopje | Macedonian | t | 66.5 | MKD | Macedonia | Skopje | Macedonian | t | 66.5 + MLT | Malta | Valletta | English | t | 2.1 | MLT | Malta | Valletta | Maltese | t | 95.8 + MLT | Malta | Valletta | Maltese | t | 95.8 | MLT | Malta | Valletta | Maltese | t | 95.8 + MDA | Moldova | Chisinau | Romanian | t | 61.9 | MDA | Moldova | Chisinau | Romanian | t | 61.9 + NLD | Netherlands | Amsterdam | Dutch | t | 95.6 | NLD | Netherlands | Amsterdam | Dutch | t | 95.6 + NOR | Norway | Oslo | Norwegian | t | 96.6 | NOR | Norway | Oslo | Norwegian | t | 96.6 + POL | Poland | Warszawa | Polish | t | 97.6 | POL | Poland | Warszawa | Polish | t | 97.6 + PRT | Portugal | Lisboa | Portuguese | t | 99 | PRT | Portugal | Lisboa | Portuguese | t | 99 + ROM | Romania | Bucuresti | Romani | t | 0.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + ROM | Romania | Bucuresti | Romanian | t | 90.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + RUS | Russian Federation | Moscow | Russian | t | 86.6 | RUS | Russian Federation | Moscow | Russian | t | 86.6 + SMR | San Marino | San Marino | Italian | t | 100 | SMR | San Marino | San Marino | Italian | t | 100 + SVK | Slovakia | Bratislava | Slovak | t | 85.6 | SVK | Slovakia | Bratislava | Slovak | t | 85.6 + SVN | Slovenia | Ljubljana | Slovene | t | 87.9 | SVN | Slovenia | Ljubljana | Slovene | t | 87.9 + ESP | Spain | Madrid | Spanish | t | 74.4 | ESP | Spain | Madrid | Spanish | t | 74.4 + SWE | Sweden | Stockholm | Swedish | t | 89.5 | SWE | Sweden | Stockholm | Swedish | t | 89.5 + CHE | Switzerland | Bern | French | t | 19.2 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | German | t | 63.6 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Italian | t | 7.7 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Romansh | t | 0.6 | CHE | Switzerland | Bern | German | t | 63.6 + UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 | UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 + GBR | United Kingdom | London | English | t | 97.3 | GBR | United Kingdom | London | English | t | 97.3 + YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 | YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 +(55 rows) + +-- query8 +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + region_city_cnt | region_lang_cnt | region +-----------------+-----------------+--------------------------- + 840 | 192 | Caribbean + 2824 | 112 | Central America + 11336 | 384 | Eastern Asia + 2664 | 396 | Middle East + 1625 | 125 | North America + 3500 | 70 | South America + 3179 | 528 | Southeast Asia + 12278 | 896 | Southern and Central Asia +(8 rows) + +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + code | name | capital | capital_city | cnt | cnt +------+--------------------+---------+------------------+-----+----- + AUS | Australia | 135 | Canberra | 8 | + AUT | Austria | 1523 | Wien | 8 | + CAN | Canada | 1822 | Ottawa | 12 | + CHN | China | 1891 | Peking | 12 | + DNK | Denmark | 3315 | Kobenhavn | 7 | + IND | India | 1109 | New Delhi | 12 | + IRN | Iran | 1380 | Teheran | 10 | + ITA | Italy | 1464 | Roma | 8 | + MMR | Myanmar | 2710 | Rangoon (Yangon) | 8 | + RUS | Russian Federation | 3580 | Moscow | 12 | + ZAF | South Africa | 716 | Pretoria | 11 | + USA | United States | 3813 | Washington | 12 | +(12 rows) + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + city_cnt | lang_cnt | name | REGION_SURFACE_AREA | REGION_LIFETIME | REGION_POP | lang_count | REGION_GNP | region +----------+----------+---------------------------------------+---------------------+------------------+------------+------------+------------+--------------------------- + 4 | 5 | Afghanistan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 3 | Albania | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 18 | 2 | Algeria | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 5 | 9 | Angola | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 2 | Antigua and Barbuda | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 57 | 3 | Argentina | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 2 | Armenia | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 14 | 8 | Australia | 62471162.00 | 78.8000030517578 | 22753100 | 11 | 405851.00 | Australia and New Zealand + 6 | 8 | Austria | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 4 | 4 | Azerbaijan | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 1 | 2 | Bahamas | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 1 | 2 | Bahrain | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 24 | 7 | Bangladesh | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 2 | Barbados | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 16 | 4 | Belarus | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 9 | 6 | Belgium | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 2 | 4 | Belize | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 4 | 7 | Benin | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Bhutan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 8 | 4 | Bolivia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 1 | Bosnia and Herzegovina | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 2 | 5 | Botswana | 23060186.00 | 44.8199996948242 | 46886000 | 21 | 126931.00 | Southern Africa + 250 | 5 | Brazil | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 4 | Brunei | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 10 | 4 | Bulgaria | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 3 | 6 | Burkina Faso | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Burundi | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 3 | 4 | Cambodia | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 7 | 8 | Cameroon | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 49 | 12 | Canada | 236342035.00 | 75.8199996948242 | 309632000 | 18 | 9111890.00 | North America + 1 | 2 | Cape Verde | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 6 | Central African Republic | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 2 | 8 | Chad | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 29 | 4 | Chile | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 38 | 5 | Colombia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 5 | Comoros | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 2 | 6 | Congo | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 4 | Costa Rica | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 5 | 5 | Cote deIvoire | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 4 | 2 | Croatia | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 14 | 1 | Cuba | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 2 | 2 | Cyprus | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 10 | 8 | Czech Republic | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 1 | 3 | Djibouti | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 1 | 2 | Dominica | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 6 | 2 | Dominican Republic | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 15 | 2 | Ecuador | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 37 | 2 | Egypt | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 7 | 2 | El Salvador | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America +(50 rows) + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + city_cnt | lang_cnt | identifier +----------+----------+--------------------------- + 494 | 10 | British Islands + 159 | 48 | Baltic Countries + 1295 | 161 | Nordic Countries + 50176 | 264 | Eastern Asia + 9414 | 369 | Western Europe + 11880 | 450 | Southern Europe + 32900 | 610 | Eastern Europe + 29161 | 616 | Southeast Asia + 8568 | 792 | Middle East + 80388 | 1092 | Southern and Central Asia +(10 rows) + +-- queries with a single CTE used more than once in different parts of the main query +-- query1 +-- This kind of query is their only use case for CTE. We don't error, we give correct +-- results,use shared scan here and we are good! +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + count +------- + 43 +(1 row) + +-- query2 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + code | country | capital | language | isofficial | percentage | code | country | capital | language | isofficial | percentage +------+------------------------+-----------------------------------+----------------+------------+------------+------+------------------------+-----------------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Tirana | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | Wien | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Russian | t | 32 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Praha | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Kobenhavn | Danish | t | 93.5 + EST | Estonia | Tallinn | Estonian | t | 65.3 | EST | Estonia | Tallinn | Estonian | t | 65.3 + FRO | Faroe Islands | Torshavn | Danish | t | 0 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FRA | France | Paris | French | t | 93.6 | FRA | France | Paris | French | t | 93.6 + DEU | Germany | Berlin | German | t | 91.3 | DEU | Germany | Berlin | German | t | 91.3 + GIB | Gibraltar | Gibraltar | English | t | 88.9 | GIB | Gibraltar | Gibraltar | English | t | 88.9 + GRC | Greece | Athenai | Greek | t | 98.5 | GRC | Greece | Athenai | Greek | t | 98.5 + HUN | Hungary | Budapest | Hungarian | t | 98.5 | HUN | Hungary | Budapest | Hungarian | t | 98.5 + ISL | Iceland | Reykjavik | Icelandic | t | 95.7 | ISL | Iceland | Reykjavik | Icelandic | t | 95.7 + IRL | Ireland | Dublin | English | t | 98.4 | IRL | Ireland | Dublin | English | t | 98.4 + IRL | Ireland | Dublin | Irish | t | 1.6 | IRL | Ireland | Dublin | English | t | 98.4 + ITA | Italy | Roma | Italian | t | 94.1 | ITA | Italy | Roma | Italian | t | 94.1 + LVA | Latvia | Riga | Latvian | t | 55.1 | LVA | Latvia | Riga | Latvian | t | 55.1 + LIE | Liechtenstein | Vaduz | German | t | 89 | LIE | Liechtenstein | Vaduz | German | t | 89 + LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 | LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | French | t | 4.2 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | German | t | 2.3 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + MKD | Macedonia | Skopje | Macedonian | t | 66.5 | MKD | Macedonia | Skopje | Macedonian | t | 66.5 + MLT | Malta | Valletta | English | t | 2.1 | MLT | Malta | Valletta | Maltese | t | 95.8 + MLT | Malta | Valletta | Maltese | t | 95.8 | MLT | Malta | Valletta | Maltese | t | 95.8 + MDA | Moldova | Chisinau | Romanian | t | 61.9 | MDA | Moldova | Chisinau | Romanian | t | 61.9 + NLD | Netherlands | Amsterdam | Dutch | t | 95.6 | NLD | Netherlands | Amsterdam | Dutch | t | 95.6 + NOR | Norway | Oslo | Norwegian | t | 96.6 | NOR | Norway | Oslo | Norwegian | t | 96.6 + POL | Poland | Warszawa | Polish | t | 97.6 | POL | Poland | Warszawa | Polish | t | 97.6 + PRT | Portugal | Lisboa | Portuguese | t | 99 | PRT | Portugal | Lisboa | Portuguese | t | 99 + ROM | Romania | Bucuresti | Romani | t | 0.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + ROM | Romania | Bucuresti | Romanian | t | 90.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + RUS | Russian Federation | Moscow | Russian | t | 86.6 | RUS | Russian Federation | Moscow | Russian | t | 86.6 + SMR | San Marino | San Marino | Italian | t | 100 | SMR | San Marino | San Marino | Italian | t | 100 + SVK | Slovakia | Bratislava | Slovak | t | 85.6 | SVK | Slovakia | Bratislava | Slovak | t | 85.6 + SVN | Slovenia | Ljubljana | Slovene | t | 87.9 | SVN | Slovenia | Ljubljana | Slovene | t | 87.9 + ESP | Spain | Madrid | Spanish | t | 74.4 | ESP | Spain | Madrid | Spanish | t | 74.4 + SWE | Sweden | Stockholm | Swedish | t | 89.5 | SWE | Sweden | Stockholm | Swedish | t | 89.5 + CHE | Switzerland | Bern | French | t | 19.2 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | German | t | 63.6 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Italian | t | 7.7 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Romansh | t | 0.6 | CHE | Switzerland | Bern | German | t | 63.6 + UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 | UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 + GBR | United Kingdom | London | English | t | 97.3 | GBR | United Kingdom | London | English | t | 97.3 + YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 | YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 +(55 rows) + +-- query3 +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + region_city_cnt | region_lang_cnt | region +-----------------+-----------------+--------------------------- + 840 | 192 | Caribbean + 2824 | 112 | Central America + 11336 | 384 | Eastern Asia + 2664 | 396 | Middle East + 1625 | 125 | North America + 3500 | 70 | South America + 3179 | 528 | Southeast Asia + 12278 | 896 | Southern and Central Asia +(8 rows) + +--query 4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + code | name | capital | capital_city | cnt | cnt +------+--------------------+---------+------------------+-----+----- + AUS | Australia | 135 | Canberra | 8 | + AUT | Austria | 1523 | Wien | 8 | + CAN | Canada | 1822 | Ottawa | 12 | + CHN | China | 1891 | Peking | 12 | + DNK | Denmark | 3315 | Kobenhavn | 7 | + IND | India | 1109 | New Delhi | 12 | + IRN | Iran | 1380 | Teheran | 10 | + ITA | Italy | 1464 | Roma | 8 | + MMR | Myanmar | 2710 | Rangoon (Yangon) | 8 | + RUS | Russian Federation | 3580 | Moscow | 12 | + ZAF | South Africa | 716 | Pretoria | 11 | + USA | United States | 3813 | Washington | 12 | +(12 rows) + +--query 5 Use CTE more than once in select list , from clause and where clause without correlation +with official_languages as +( + select country.code,country.name,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and isofficial = 'True' + and country.governmentform NOT IN (select 'Commonwealth of the US' UNION ALL select 'Monarchy (Sultanate)' UNION ALL select 'Monarchy') + and country.gnp > (select min(gnpold) from country where country.region = 'Western Europe') +) +select +( select max(CNT) from (select count(*) CNT,o1.name from official_languages o1, official_languages o2 + where o1.code = o2.code group by o1.name) FOO +),* from official_languages; + max | code | name | language +-----+------+------------------------+------------------ + 16 | AFG | Afghanistan | Dari + 16 | AFG | Afghanistan | Pashto + 16 | ALB | Albania | Albaniana + 16 | AND | Andorra | Catalan + 16 | ANT | Netherlands Antilles | Dutch + 16 | ANT | Netherlands Antilles | Papiamento + 16 | ARE | United Arab Emirates | Arabic + 16 | ARG | Argentina | Spanish + 16 | ARM | Armenia | Armenian + 16 | AUS | Australia | English + 16 | AUT | Austria | German + 16 | AZE | Azerbaijan | Azerbaijani + 16 | BEL | Belgium | French + 16 | BEL | Belgium | German + 16 | BEL | Belgium | Dutch + 16 | BGD | Bangladesh | Bengali + 16 | BGR | Bulgaria | Bulgariana + 16 | BHR | Bahrain | Arabic + 16 | BIH | Bosnia and Herzegovina | Serbo-Croatian + 16 | BLR | Belarus | Russian + 16 | BLR | Belarus | Belorussian + 16 | BMU | Bermuda | English + 16 | BOL | Bolivia | Ketdua + 16 | BOL | Bolivia | Aimara + 16 | BOL | Bolivia | Spanish + 16 | BRA | Brazil | Portuguese + 16 | BRB | Barbados | English + 16 | CAN | Canada | French + 16 | CAN | Canada | English + 16 | CHE | Switzerland | Romansh + 16 | CHE | Switzerland | French + 16 | CHE | Switzerland | German + 16 | CHE | Switzerland | Italian + 16 | CHL | Chile | Spanish + 16 | CHN | China | Chinese + 16 | COL | Colombia | Spanish + 16 | COM | Comoros | Comorian + 16 | CRI | Costa Rica | Spanish + 16 | CUB | Cuba | Spanish + 16 | CYM | Cayman Islands | English + 16 | CYP | Cyprus | Turkish + 16 | CYP | Cyprus | Greek + 16 | CZE | Czech Republic | Czech + 16 | DEU | Germany | German + 16 | DNK | Denmark | Danish + 16 | DOM | Dominican Republic | Spanish + 16 | DZA | Algeria | Arabic + 16 | ECU | Ecuador | Spanish + 16 | EGY | Egypt | Arabic + 16 | ESP | Spain | Spanish + 16 | EST | Estonia | Estonian + 16 | FIN | Finland | Finnish + 16 | FIN | Finland | Swedish + 16 | FJI | Fiji Islands | Fijian + 16 | FRA | France | French + 16 | GBR | United Kingdom | English + 16 | GEO | Georgia | Georgiana + 16 | GLP | Guadeloupe | French + 16 | GRC | Greece | Greek + 16 | GTM | Guatemala | Spanish + 16 | GUM | Guam | English + 16 | GUM | Guam | Chamorro + 16 | HKG | Hong Kong | English + 16 | HND | Honduras | Spanish + 16 | HRV | Croatia | Serbo-Croatian + 16 | HTI | Haiti | French + 16 | HUN | Hungary | Hungarian + 16 | IDN | Indonesia | Malay + 16 | IND | India | Hindi + 16 | IRL | Ireland | English + 16 | IRL | Ireland | Irish + 16 | IRN | Iran | Persian + 16 | IRQ | Iraq | Arabic + 16 | ISL | Iceland | Icelandic + 16 | ISR | Israel | Arabic + 16 | ISR | Israel | Hebrew + 16 | ITA | Italy | Italian + 16 | JOR | Jordan | Arabic + 16 | JPN | Japan | Japanese + 16 | KAZ | Kazakstan | Kazakh + 16 | KGZ | Kyrgyzstan | Russian + 16 | KGZ | Kyrgyzstan | Kirgiz + 16 | KHM | Cambodia | Khmer + 16 | KOR | South Korea | Korean + 16 | KWT | Kuwait | Arabic + 16 | LAO | Laos | Lao + 16 | LBN | Lebanon | Arabic + 16 | LBY | Libyan Arab Jamahiriya | Arabic + 16 | LIE | Liechtenstein | German + 16 | LKA | Sri Lanka | Tamil + 16 | LKA | Sri Lanka | Singali + 16 | LTU | Lithuania | Lithuanian + 16 | LUX | Luxembourg | French + 16 | LUX | Luxembourg | Luxembourgish + 16 | LUX | Luxembourg | German + 16 | LVA | Latvia | Latvian + 16 | MAC | Macao | Portuguese + 16 | MAR | Morocco | Arabic + 16 | MDA | Moldova | Romanian + 16 | MDG | Madagascar | French + 16 | MDG | Madagascar | Malagasy + 16 | MEX | Mexico | Spanish + 16 | MKD | Macedonia | Macedonian + 16 | MLT | Malta | English + 16 | MLT | Malta | Maltese + 16 | MMR | Myanmar | Burmese + 16 | MTQ | Martinique | French + 16 | MWI | Malawi | Chichewa + 16 | MYS | Malaysia | Malay + 16 | NCL | New Caledonia | French + 16 | NIC | Nicaragua | Spanish + 16 | NLD | Netherlands | Dutch + 16 | NOR | Norway | Norwegian + 16 | NPL | Nepal | Nepali + 16 | NZL | New Zealand | English + 16 | PAK | Pakistan | Urdu + 16 | PAN | Panama | Spanish + 16 | PER | Peru | Aimara + 16 | PER | Peru | Spanish + 16 | PER | Peru | Ketdua + 16 | PHL | Philippines | Pilipino + 16 | POL | Poland | Polish + 16 | PRK | North Korea | Korean + 16 | PRT | Portugal | Portuguese + 16 | PRY | Paraguay | Guarani + 16 | PRY | Paraguay | Spanish + 16 | ROM | Romania | Romani + 16 | ROM | Romania | Romanian + 16 | RUS | Russian Federation | Russian + 16 | RWA | Rwanda | Rwanda + 16 | RWA | Rwanda | French + 16 | SDN | Sudan | Arabic + 16 | SEN | Senegal | Wolof + 16 | SGP | Singapore | Tamil + 16 | SGP | Singapore | Malay + 16 | SGP | Singapore | Chinese + 16 | SLV | El Salvador | Spanish + 16 | SVK | Slovakia | Slovak + 16 | SVN | Slovenia | Slovene + 16 | SWE | Sweden | Swedish + 16 | SYR | Syria | Arabic + 16 | TCD | Chad | Arabic + 16 | TGO | Togo | Kabye + 16 | TGO | Togo | Ewe + 16 | THA | Thailand | Thai + 16 | TJK | Tajikistan | Tadzhik + 16 | TKM | Turkmenistan | Turkmenian + 16 | TUN | Tunisia | Arabic + 16 | TUR | Turkey | Turkish + 16 | TWN | Taiwan | Mandarin Chinese + 16 | TZA | Tanzania | Swahili + 16 | UKR | Ukraine | Ukrainian + 16 | URY | Uruguay | Spanish + 16 | USA | United States | English + 16 | UZB | Uzbekistan | Uzbek + 16 | VEN | Venezuela | Spanish + 16 | VNM | Vietnam | Vietnamese + 16 | YEM | Yemen | Arabic + 16 | YUG | Yugoslavia | Serbo-Croatian + 16 | ZAF | South Africa | Zulu + 16 | ZAF | South Africa | Xhosa + 16 | ZAF | South Africa | English + 16 | ZAF | South Africa | Afrikaans + 16 | ZWE | Zimbabwe | English +(164 rows) + +--query 6 Use CTE in the main query and subqueries within the main query +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select OUTERMOST_FOO.*,bad_headofstates.headofstate from ( +select avg(population),region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +order by OUTERMOST_FOO.region,bad_headofstates.headofstate LIMIT 40; + avg | region | headofstate +-----------------------+---------------------------+---------------------------------- + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Fidel Castro Ruz + 744388.888888888889 | Caribbean | George W. Bush + 744388.888888888889 | Caribbean | Jacques Chirac + 7651000.000000000000 | Central Africa | Idriss Deby + 2657500.000000000000 | Central America | Arnoldo Aleman Lacayo + 2657500.000000000000 | Central America | Elisabeth II + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Bakili Muluzi + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | Isayas Afewerki [Isaias Afwerki] + 5982809.523809523810 | Eastern Africa | Ismail Omar Guelleh + 5982809.523809523810 | Eastern Africa | Jacques Chirac + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Robert G. Mugabe + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Jiang Zemin +(40 rows) + +-- query 7 Use CTE in the main query, where clause and having clause +with district_population as +(select sum(city.population) DISTRICT_POP,count(*) NUM_CITIES,district,countrycode,country.name COUNTRY + from city,country + where city.countrycode = country.code + group by district,countrycode,country.name + HAVING (sum(city.population)/count(*)) > ( select avg(population) from city where countrycode = 'CHN')) +select sum(FOO.DISTRICT_POP),sum(FOO.NUM_CITIES),COUNTRY,CAPITAL,CAPITAL_POP +from +( +(select district_population.*,city.name CAPITAL,city.population CAPITAL_POP from +district_population,country,city +where district_population.countrycode = country.code AND city.id = country.capital +AND DISTRICT_POP >= ( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'USA') ) +order by COUNTRY,district) +UNION ALL +(select district_population.*,city.name CAPITAL,city.population CAPITAL_POP from +district_population,country,city +where district_population.countrycode = country.code AND city.id = country.capital +AND DISTRICT_POP >= ( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'IND') ) +order by COUNTRY,district) +UNION ALL +(select district_population.*,city.name CAPITAL,city.population CAPITAL_POP from +district_population,country,city +where district_population.countrycode = country.code AND city.id = country.capital +AND DISTRICT_POP >= ( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'CHN') ) +order by COUNTRY,district) +) FOO +WHERE FOO.CAPITAL_POP > (select min(DISTRICT_POP) from district_population) +group by FOO.COUNTRY,FOO.CAPITAL,FOO.CAPITAL_POP +HAVING sum(FOO.DISTRICT_POP) >= ( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'AUS') ) +AND (sum(FOO.DISTRICT_POP)/sum(FOO.NUM_CITIES)) <= +( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'USA' or countrycode = 'IND' or countrycode = 'CHN')) +order by FOO.country; + sum | sum | country | capital | capital_pop +-----------+-----+---------------------------------------+-------------------+------------- + 4577018 | 8 | Bangladesh | Dhaka | 3612850 + 35875413 | 66 | Brazil | Brasilia | 1969868 + 5423156 | 4 | Chile | Santiago de Chile | 4703954 + 146743375 | 155 | China | Peking | 7472000 + 6260862 | 1 | Colombia | Santafe de Bogota | 6260862 + 5064000 | 1 | Congo, The Democratic Republic of the | Kinshasa | 5064000 + 10117675 | 2 | Egypt | Cairo | 6789479 + 3386667 | 1 | Germany | Berlin | 3386667 + 25060392 | 18 | Iran | Teheran | 6758845 + 4336000 | 1 | Iraq | Baghdad | 4336000 + 48546381 | 84 | Japan | Tokyo | 7980230 + 29789325 | 11 | Mexico | Ciudad de Mexico | 8591309 + 3095329 | 2 | Morocco | Rabat | 623457 + 3361700 | 1 | Myanmar | Rangoon (Yangon) | 3361700 + 33060243 | 12 | Pakistan | Islamabad | 524500 + 29545923 | 48 | Philippines | Manila | 1581082 + 30717000 | 9 | Russian Federation | Moscow | 8389200 + 6846000 | 5 | Saudi Arabia | Riyadh | 3324000 + 4017733 | 1 | Singapore | Singapore | 4017733 + 3962883 | 8 | Spain | Madrid | 2879052 + 6320174 | 1 | Thailand | Bangkok | 6320174 + 26997078 | 6 | Turkey | Ankara | 3038159 + 26874255 | 18 | United States | Washington | 572059 + 3980000 | 1 | Vietnam | Hanoi | 1410000 +(24 rows) + +-- query8 Use CTE in the select list and the from clause +with official_languages as +( + select country.code,country.name,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and isofficial = 'True' +) +select +( select max(CNT) from (select count(*) CNT from official_languages) FOO +) +,* from official_languages order by official_languages.code,official_languages.language; + max | code | name | language +-----+------+--------------------------------------+------------------ + 238 | ABW | Aruba | Dutch + 238 | AFG | Afghanistan | Dari + 238 | AFG | Afghanistan | Pashto + 238 | AIA | Anguilla | English + 238 | ALB | Albania | Albaniana + 238 | AND | Andorra | Catalan + 238 | ANT | Netherlands Antilles | Dutch + 238 | ANT | Netherlands Antilles | Papiamento + 238 | ARE | United Arab Emirates | Arabic + 238 | ARG | Argentina | Spanish + 238 | ARM | Armenia | Armenian + 238 | ASM | American Samoa | English + 238 | ASM | American Samoa | Samoan + 238 | ATG | Antigua and Barbuda | English + 238 | AUS | Australia | English + 238 | AUT | Austria | German + 238 | AZE | Azerbaijan | Azerbaijani + 238 | BDI | Burundi | French + 238 | BDI | Burundi | Kirundi + 238 | BEL | Belgium | Dutch + 238 | BEL | Belgium | French + 238 | BEL | Belgium | German + 238 | BGD | Bangladesh | Bengali + 238 | BGR | Bulgaria | Bulgariana + 238 | BHR | Bahrain | Arabic + 238 | BIH | Bosnia and Herzegovina | Serbo-Croatian + 238 | BLR | Belarus | Belorussian + 238 | BLR | Belarus | Russian + 238 | BLZ | Belize | English + 238 | BMU | Bermuda | English + 238 | BOL | Bolivia | Aimara + 238 | BOL | Bolivia | Ketdua + 238 | BOL | Bolivia | Spanish + 238 | BRA | Brazil | Portuguese + 238 | BRB | Barbados | English + 238 | BRN | Brunei | Malay + 238 | BTN | Bhutan | Dzongkha + 238 | CAN | Canada | English + 238 | CAN | Canada | French + 238 | CCK | Cocos (Keeling) Islands | English + 238 | CHE | Switzerland | French + 238 | CHE | Switzerland | German + 238 | CHE | Switzerland | Italian + 238 | CHE | Switzerland | Romansh + 238 | CHL | Chile | Spanish + 238 | CHN | China | Chinese + 238 | COK | Cook Islands | Maori + 238 | COL | Colombia | Spanish + 238 | COM | Comoros | Comorian + 238 | CPV | Cape Verde | Portuguese + 238 | CRI | Costa Rica | Spanish + 238 | CUB | Cuba | Spanish + 238 | CXR | Christmas Island | English + 238 | CYM | Cayman Islands | English + 238 | CYP | Cyprus | Greek + 238 | CYP | Cyprus | Turkish + 238 | CZE | Czech Republic | Czech + 238 | DEU | Germany | German + 238 | DJI | Djibouti | Arabic + 238 | DNK | Denmark | Danish + 238 | DOM | Dominican Republic | Spanish + 238 | DZA | Algeria | Arabic + 238 | ECU | Ecuador | Spanish + 238 | EGY | Egypt | Arabic + 238 | ERI | Eritrea | Tigrinja + 238 | ESH | Western Sahara | Arabic + 238 | ESP | Spain | Spanish + 238 | EST | Estonia | Estonian + 238 | FIN | Finland | Finnish + 238 | FIN | Finland | Swedish + 238 | FJI | Fiji Islands | Fijian + 238 | FLK | Falkland Islands | English + 238 | FRA | France | French + 238 | FRO | Faroe Islands | Danish + 238 | FRO | Faroe Islands | Faroese + 238 | GBR | United Kingdom | English + 238 | GEO | Georgia | Georgiana + 238 | GIB | Gibraltar | English + 238 | GLP | Guadeloupe | French + 238 | GNB | Guinea-Bissau | Portuguese + 238 | GRC | Greece | Greek + 238 | GRL | Greenland | Danish + 238 | GRL | Greenland | Greenlandic + 238 | GTM | Guatemala | Spanish + 238 | GUM | Guam | Chamorro + 238 | GUM | Guam | English + 238 | HKG | Hong Kong | English + 238 | HND | Honduras | Spanish + 238 | HRV | Croatia | Serbo-Croatian + 238 | HTI | Haiti | French + 238 | HUN | Hungary | Hungarian + 238 | IDN | Indonesia | Malay + 238 | IND | India | Hindi + 238 | IRL | Ireland | English + 238 | IRL | Ireland | Irish + 238 | IRN | Iran | Persian + 238 | IRQ | Iraq | Arabic + 238 | ISL | Iceland | Icelandic + 238 | ISR | Israel | Arabic + 238 | ISR | Israel | Hebrew + 238 | ITA | Italy | Italian + 238 | JOR | Jordan | Arabic + 238 | JPN | Japan | Japanese + 238 | KAZ | Kazakstan | Kazakh + 238 | KGZ | Kyrgyzstan | Kirgiz + 238 | KGZ | Kyrgyzstan | Russian + 238 | KHM | Cambodia | Khmer + 238 | KIR | Kiribati | Kiribati + 238 | KNA | Saint Kitts and Nevis | English + 238 | KOR | South Korea | Korean + 238 | KWT | Kuwait | Arabic + 238 | LAO | Laos | Lao + 238 | LBN | Lebanon | Arabic + 238 | LBY | Libyan Arab Jamahiriya | Arabic + 238 | LCA | Saint Lucia | English + 238 | LIE | Liechtenstein | German + 238 | LKA | Sri Lanka | Singali + 238 | LKA | Sri Lanka | Tamil + 238 | LSO | Lesotho | English + 238 | LSO | Lesotho | Sotho + 238 | LTU | Lithuania | Lithuanian + 238 | LUX | Luxembourg | French + 238 | LUX | Luxembourg | German + 238 | LUX | Luxembourg | Luxembourgish + 238 | LVA | Latvia | Latvian + 238 | MAC | Macao | Portuguese + 238 | MAR | Morocco | Arabic + 238 | MCO | Monaco | French + 238 | MDA | Moldova | Romanian + 238 | MDG | Madagascar | French + 238 | MDG | Madagascar | Malagasy + 238 | MDV | Maldives | Dhivehi + 238 | MEX | Mexico | Spanish + 238 | MHL | Marshall Islands | English + 238 | MHL | Marshall Islands | Marshallese + 238 | MKD | Macedonia | Macedonian + 238 | MLT | Malta | English + 238 | MLT | Malta | Maltese + 238 | MMR | Myanmar | Burmese + 238 | MNG | Mongolia | Mongolian + 238 | MNP | Northern Mariana Islands | English + 238 | MSR | Montserrat | English + 238 | MTQ | Martinique | French + 238 | MWI | Malawi | Chichewa + 238 | MYS | Malaysia | Malay + 238 | MYT | Mayotte | French + 238 | NCL | New Caledonia | French + 238 | NFK | Norfolk Island | English + 238 | NIC | Nicaragua | Spanish + 238 | NIU | Niue | English + 238 | NLD | Netherlands | Dutch + 238 | NOR | Norway | Norwegian + 238 | NPL | Nepal | Nepali + 238 | NRU | Nauru | English + 238 | NRU | Nauru | Nauru + 238 | NZL | New Zealand | English + 238 | OMN | Oman | Arabic + 238 | PAK | Pakistan | Urdu + 238 | PAN | Panama | Spanish + 238 | PER | Peru | Aimara + 238 | PER | Peru | Ketdua + 238 | PER | Peru | Spanish + 238 | PHL | Philippines | Pilipino + 238 | PLW | Palau | English + 238 | PLW | Palau | Palau + 238 | POL | Poland | Polish + 238 | PRI | Puerto Rico | Spanish + 238 | PRK | North Korea | Korean + 238 | PRT | Portugal | Portuguese + 238 | PRY | Paraguay | Guarani + 238 | PRY | Paraguay | Spanish + 238 | PYF | French Polynesia | French + 238 | QAT | Qatar | Arabic + 238 | ROM | Romania | Romani + 238 | ROM | Romania | Romanian + 238 | RUS | Russian Federation | Russian + 238 | RWA | Rwanda | French + 238 | RWA | Rwanda | Rwanda + 238 | SAU | Saudi Arabia | Arabic + 238 | SDN | Sudan | Arabic + 238 | SEN | Senegal | Wolof + 238 | SGP | Singapore | Chinese + 238 | SGP | Singapore | Malay + 238 | SGP | Singapore | Tamil + 238 | SHN | Saint Helena | English + 238 | SJM | Svalbard and Jan Mayen | Norwegian + 238 | SLV | El Salvador | Spanish + 238 | SMR | San Marino | Italian + 238 | SOM | Somalia | Arabic + 238 | SOM | Somalia | Somali + 238 | SPM | Saint Pierre and Miquelon | French + 238 | SVK | Slovakia | Slovak + 238 | SVN | Slovenia | Slovene + 238 | SWE | Sweden | Swedish + 238 | SWZ | Swaziland | Swazi + 238 | SYC | Seychelles | English + 238 | SYC | Seychelles | French + 238 | SYR | Syria | Arabic + 238 | TCA | Turks and Caicos Islands | English + 238 | TCD | Chad | Arabic + 238 | TGO | Togo | Ewe + 238 | TGO | Togo | Kabye + 238 | THA | Thailand | Thai + 238 | TJK | Tajikistan | Tadzhik + 238 | TKL | Tokelau | English + 238 | TKM | Turkmenistan | Turkmenian + 238 | TMP | East Timor | Portuguese + 238 | TON | Tonga | English + 238 | TON | Tonga | Tongan + 238 | TUN | Tunisia | Arabic + 238 | TUR | Turkey | Turkish + 238 | TUV | Tuvalu | English + 238 | TUV | Tuvalu | Tuvalu + 238 | TWN | Taiwan | Mandarin Chinese + 238 | TZA | Tanzania | Swahili + 238 | UKR | Ukraine | Ukrainian + 238 | UMI | United States Minor Outlying Islands | English + 238 | URY | Uruguay | Spanish + 238 | USA | United States | English + 238 | UZB | Uzbekistan | Uzbek + 238 | VAT | Holy See (Vatican City State) | Italian + 238 | VCT | Saint Vincent and the Grenadines | English + 238 | VEN | Venezuela | Spanish + 238 | VGB | Virgin Islands, British | English + 238 | VIR | Virgin Islands, U.S. | English + 238 | VNM | Vietnam | Vietnamese + 238 | VUT | Vanuatu | Bislama + 238 | VUT | Vanuatu | English + 238 | VUT | Vanuatu | French + 238 | WSM | Samoa | English + 238 | WSM | Samoa | Samoan + 238 | YEM | Yemen | Arabic + 238 | YUG | Yugoslavia | Serbo-Croatian + 238 | ZAF | South Africa | Afrikaans + 238 | ZAF | South Africa | English + 238 | ZAF | South Africa | Xhosa + 238 | ZAF | South Africa | Zulu + 238 | ZWE | Zimbabwe | English +(238 rows) + +-- queries with CTEs using index scans +set enable_seqscan=off; +set enable_indexscan=on; +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + code | id | name | countrycode | language | isofficial | percentage +------+------+-----------------------------------+-------------+------------------+------------+------------ + ABW | 129 | Oranjestad | ABW | Dutch | t | 5.3 + AFG | 1 | Kabul | AFG | Dari | t | 32.1 + AFG | 1 | Kabul | AFG | Pashto | t | 52.4 + AIA | 62 | The Valley | AIA | English | t | 0 + ALB | 34 | Tirana | ALB | Albaniana | t | 97.9 + AND | 55 | Andorra la Vella | AND | Catalan | t | 32.3 + ANT | 33 | Willemstad | ANT | Dutch | t | 0 + ANT | 33 | Willemstad | ANT | Papiamento | t | 86.2 + ARE | 65 | Abu Dhabi | ARE | Arabic | t | 42 + ARG | 69 | Buenos Aires | ARG | Spanish | t | 96.8 + ARM | 126 | Yerevan | ARM | Armenian | t | 93.4 + ASM | 54 | Fagatogo | ASM | English | t | 3.1 + ASM | 54 | Fagatogo | ASM | Samoan | t | 90.6 + ATG | 63 | Saint Johns | ATG | English | t | 0 + AUS | 135 | Canberra | AUS | English | t | 81.2 + AUT | 1523 | Wien | AUT | German | t | 92 + AZE | 144 | Baku | AZE | Azerbaijani | t | 89 + BDI | 552 | Bujumbura | BDI | French | t | 0 + BDI | 552 | Bujumbura | BDI | Kirundi | t | 98.1 + BEL | 179 | Bruxelles [Brussel] | BEL | Dutch | t | 59.2 + BEL | 179 | Bruxelles [Brussel] | BEL | French | t | 32.6 + BEL | 179 | Bruxelles [Brussel] | BEL | German | t | 1 + BGD | 150 | Dhaka | BGD | Bengali | t | 97.7 + BGR | 539 | Sofija | BGR | Bulgariana | t | 83.2 + BHR | 149 | al-Manama | BHR | Arabic | t | 67.7 + BIH | 201 | Sarajevo | BIH | Serbo-Croatian | t | 99.2 + BLR | 3520 | Minsk | BLR | Belorussian | t | 65.6 + BLR | 3520 | Minsk | BLR | Russian | t | 32 + BLZ | 185 | Belmopan | BLZ | English | t | 50.8 + BMU | 191 | Hamilton | BMU | English | t | 100 + BOL | 194 | La Paz | BOL | Aimara | t | 3.2 + BOL | 194 | La Paz | BOL | Ketdua | t | 8.1 + BOL | 194 | La Paz | BOL | Spanish | t | 87.7 + BRA | 211 | Brasilia | BRA | Portuguese | t | 97.5 + BRB | 174 | Bridgetown | BRB | English | t | 0 + BRN | 538 | Bandar Seri Begawan | BRN | Malay | t | 45.5 + BTN | 192 | Thimphu | BTN | Dzongkha | t | 50 + CAN | 1822 | Ottawa | CAN | English | t | 60.4 + CAN | 1822 | Ottawa | CAN | French | t | 23.4 + CCK | 2317 | West Island | CCK | English | t | 0 + CHE | 3248 | Bern | CHE | French | t | 19.2 + CHE | 3248 | Bern | CHE | German | t | 63.6 + CHE | 3248 | Bern | CHE | Italian | t | 7.7 + CHE | 3248 | Bern | CHE | Romansh | t | 0.6 + CHL | 554 | Santiago de Chile | CHL | Spanish | t | 89.7 + CHN | 1891 | Peking | CHN | Chinese | t | 92 + COK | 583 | Avarua | COK | Maori | t | 0 + COL | 2257 | Santafe de Bogota | COL | Spanish | t | 99 + COM | 2295 | Moroni | COM | Comorian | t | 75 + CPV | 1859 | Praia | CPV | Portuguese | t | 0 + CRI | 584 | San Jose | CRI | Spanish | t | 97.5 + CUB | 2413 | La Habana | CUB | Spanish | t | 100 + CXR | 1791 | Flying Fish Cove | CXR | English | t | 0 + CYM | 553 | George Town | CYM | English | t | 0 + CYP | 2430 | Nicosia | CYP | Greek | t | 74.1 + CYP | 2430 | Nicosia | CYP | Turkish | t | 22.4 + CZE | 3339 | Praha | CZE | Czech | t | 81.2 + DEU | 3068 | Berlin | DEU | German | t | 91.3 + DJI | 585 | Djibouti | DJI | Arabic | t | 10.6 + DNK | 3315 | Kobenhavn | DNK | Danish | t | 93.5 + DOM | 587 | Santo Domingo de Guzman | DOM | Spanish | t | 98 + DZA | 35 | Alger | DZA | Arabic | t | 86 + ECU | 594 | Quito | ECU | Spanish | t | 93 + EGY | 608 | Cairo | EGY | Arabic | t | 98.8 + ERI | 652 | Asmara | ERI | Tigrinja | t | 49.1 + ESH | 2453 | El-Aaiun | ESH | Arabic | t | 100 + ESP | 653 | Madrid | ESP | Spanish | t | 74.4 + EST | 3791 | Tallinn | EST | Estonian | t | 65.3 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Finnish | t | 92.7 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Swedish | t | 5.7 + FJI | 764 | Suva | FJI | Fijian | t | 50.8 + FLK | 763 | Stanley | FLK | English | t | 0 + FRA | 2974 | Paris | FRA | French | t | 93.6 + FRO | 901 | Torshavn | FRO | Danish | t | 0 + FRO | 901 | Torshavn | FRO | Faroese | t | 100 + GBR | 456 | London | GBR | English | t | 97.3 + GEO | 905 | Tbilisi | GEO | Georgiana | t | 71.7 + GIB | 915 | Gibraltar | GIB | English | t | 88.9 + GLP | 919 | Basse-Terre | GLP | French | t | 0 + GNB | 927 | Bissau | GNB | Portuguese | t | 8.1 + GRC | 2401 | Athenai | GRC | Greek | t | 98.5 + GRL | 917 | Nuuk | GRL | Danish | t | 12.5 + GRL | 917 | Nuuk | GRL | Greenlandic | t | 87.5 + GTM | 922 | Ciudad de Guatemala | GTM | Spanish | t | 64.7 + GUM | 921 | Agaaa | GUM | Chamorro | t | 29.6 + GUM | 921 | Agaaa | GUM | English | t | 37.5 + HKG | 937 | Victoria | HKG | English | t | 2.2 + HND | 933 | Tegucigalpa | HND | Spanish | t | 97.2 + HRV | 2409 | Zagreb | HRV | Serbo-Croatian | t | 95.9 + HTI | 929 | Port-au-Prince | HTI | French | t | 0 + HUN | 3483 | Budapest | HUN | Hungarian | t | 98.5 + IDN | 939 | Jakarta | IDN | Malay | t | 12.1 + IND | 1109 | New Delhi | IND | Hindi | t | 39.9 + IRL | 1447 | Dublin | IRL | English | t | 98.4 + IRL | 1447 | Dublin | IRL | Irish | t | 1.6 + IRN | 1380 | Teheran | IRN | Persian | t | 45.7 + IRQ | 1365 | Baghdad | IRQ | Arabic | t | 77.2 + ISL | 1449 | Reykjavik | ISL | Icelandic | t | 95.7 + ISR | 1450 | Jerusalem | ISR | Arabic | t | 18 + ISR | 1450 | Jerusalem | ISR | Hebrew | t | 63.1 + ITA | 1464 | Roma | ITA | Italian | t | 94.1 + JOR | 1786 | Amman | JOR | Arabic | t | 97.9 + JPN | 1532 | Tokyo | JPN | Japanese | t | 99.1 + KAZ | 1864 | Astana | KAZ | Kazakh | t | 46 + KGZ | 2253 | Bishkek | KGZ | Kirgiz | t | 59.7 + KGZ | 2253 | Bishkek | KGZ | Russian | t | 16.2 + KHM | 1800 | Phnom Penh | KHM | Khmer | t | 88.6 + KIR | 2256 | Bairiki | KIR | Kiribati | t | 98.9 + KNA | 3064 | Basseterre | KNA | English | t | 0 + KOR | 2331 | Seoul | KOR | Korean | t | 99.9 + KWT | 2429 | Kuwait | KWT | Arabic | t | 78.1 + LAO | 2432 | Vientiane | LAO | Lao | t | 67.2 + LBN | 2438 | Beirut | LBN | Arabic | t | 93 + LBY | 2441 | Tripoli | LBY | Arabic | t | 96 + LCA | 3065 | Castries | LCA | English | t | 20 + LIE | 2446 | Vaduz | LIE | German | t | 89 + LKA | 3217 | Colombo | LKA | Singali | t | 60.3 + LKA | 3217 | Colombo | LKA | Tamil | t | 19.6 + LSO | 2437 | Maseru | LSO | English | t | 0 + LSO | 2437 | Maseru | LSO | Sotho | t | 85 + LTU | 2447 | Vilnius | LTU | Lithuanian | t | 81.6 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | French | t | 4.2 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | German | t | 2.3 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | Luxembourgish | t | 64.4 + LVA | 2434 | Riga | LVA | Latvian | t | 55.1 + MAC | 2454 | Macao | MAC | Portuguese | t | 2.3 + MAR | 2486 | Rabat | MAR | Arabic | t | 65 + MCO | 2695 | Monaco-Ville | MCO | French | t | 41.9 + MDA | 2690 | Chisinau | MDA | Romanian | t | 61.9 + MDG | 2455 | Antananarivo | MDG | French | t | 0 + MDG | 2455 | Antananarivo | MDG | Malagasy | t | 98.9 + MDV | 2463 | Male | MDV | Dhivehi | t | 100 + MEX | 2515 | Ciudad de Mexico | MEX | Spanish | t | 92.1 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | English | t | 0 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | Marshallese | t | 96.8 + MKD | 2460 | Skopje | MKD | Macedonian | t | 66.5 + MLT | 2484 | Valletta | MLT | English | t | 2.1 + MLT | 2484 | Valletta | MLT | Maltese | t | 95.8 + MMR | 2710 | Rangoon (Yangon) | MMR | Burmese | t | 69 + MNG | 2696 | Ulan Bator | MNG | Mongolian | t | 78.8 + MNP | 2913 | Garapan | MNP | English | t | 4.8 + MSR | 2697 | Plymouth | MSR | English | t | 0 + MTQ | 2508 | Fort-de-France | MTQ | French | t | 0 + MWI | 2462 | Lilongwe | MWI | Chichewa | t | 58.3 + MYS | 2464 | Kuala Lumpur | MYS | Malay | t | 58.4 + MYT | 2514 | Mamoutzou | MYT | French | t | 20.3 + NCL | 3493 | Noumea | NCL | French | t | 34.3 + NFK | 2806 | Kingston | NFK | English | t | 0 + NIC | 2734 | Managua | NIC | Spanish | t | 97.6 + NIU | 2805 | Alofi | NIU | English | t | 0 + NLD | 5 | Amsterdam | NLD | Dutch | t | 95.6 + NOR | 2807 | Oslo | NOR | Norwegian | t | 96.6 + NPL | 2729 | Kathmandu | NPL | Nepali | t | 50.4 + NRU | 2728 | Yaren | NRU | English | t | 7.5 + NRU | 2728 | Yaren | NRU | Nauru | t | 57.5 + NZL | 3499 | Wellington | NZL | English | t | 87 + OMN | 2821 | Masqat | OMN | Arabic | t | 76.7 + PAK | 2831 | Islamabad | PAK | Urdu | t | 7.6 + PAN | 2882 | Ciudad de Panama | PAN | Spanish | t | 76.8 + PER | 2890 | Lima | PER | Aimara | t | 2.3 + PER | 2890 | Lima | PER | Ketdua | t | 16.4 + PER | 2890 | Lima | PER | Spanish | t | 79.8 + PHL | 766 | Manila | PHL | Pilipino | t | 29.3 + PLW | 2881 | Koror | PLW | English | t | 3.2 + PLW | 2881 | Koror | PLW | Palau | t | 82.2 + POL | 2928 | Warszawa | POL | Polish | t | 97.6 + PRI | 2919 | San Juan | PRI | Spanish | t | 51.3 + PRK | 2318 | Pyongyang | PRK | Korean | t | 99.9 + PRT | 2914 | Lisboa | PRT | Portuguese | t | 99 + PRY | 2885 | Asuncion | PRY | Guarani | t | 40.1 + PRY | 2885 | Asuncion | PRY | Spanish | t | 55.1 + PYF | 3016 | Papeete | PYF | French | t | 40.8 + QAT | 2973 | Doha | QAT | Arabic | t | 40.7 + ROM | 3018 | Bucuresti | ROM | Romani | t | 0.7 + ROM | 3018 | Bucuresti | ROM | Romanian | t | 90.7 + RUS | 3580 | Moscow | RUS | Russian | t | 86.6 + RWA | 3047 | Kigali | RWA | French | t | 0 + RWA | 3047 | Kigali | RWA | Rwanda | t | 100 + SAU | 3173 | Riyadh | SAU | Arabic | t | 95 + SDN | 3225 | Khartum | SDN | Arabic | t | 49.4 + SEN | 3198 | Dakar | SEN | Wolof | t | 48.1 + SGP | 3208 | Singapore | SGP | Chinese | t | 77.1 + SGP | 3208 | Singapore | SGP | Malay | t | 14.1 + SGP | 3208 | Singapore | SGP | Tamil | t | 7.4 + SHN | 3063 | Jamestown | SHN | English | t | 0 + SJM | 938 | Longyearbyen | SJM | Norwegian | t | 0 + SLV | 645 | San Salvador | SLV | Spanish | t | 100 + SMR | 3171 | San Marino | SMR | Italian | t | 100 + SOM | 3214 | Mogadishu | SOM | Arabic | t | 0 + SOM | 3214 | Mogadishu | SOM | Somali | t | 98.3 + SPM | 3067 | Saint-Pierre | SPM | French | t | 0 + SVK | 3209 | Bratislava | SVK | Slovak | t | 85.6 + SVN | 3212 | Ljubljana | SVN | Slovene | t | 87.9 + SWE | 3048 | Stockholm | SWE | Swedish | t | 89.5 + SWZ | 3244 | Mbabane | SWZ | Swazi | t | 89.9 + SYC | 3206 | Victoria | SYC | English | t | 3.8 + SYC | 3206 | Victoria | SYC | French | t | 1.3 + SYR | 3250 | Damascus | SYR | Arabic | t | 90 + TCA | 3423 | Cockburn Town | TCA | English | t | 0 + TCD | 3337 | NDjamena | TCD | Arabic | t | 12.3 + TGO | 3332 | Lome | TGO | Ewe | t | 23.2 + TGO | 3332 | Lome | TGO | Kabye | t | 13.8 + THA | 3320 | Bangkok | THA | Thai | t | 52.6 + TJK | 3261 | Dushanbe | TJK | Tadzhik | t | 62.2 + TKL | 3333 | Fakaofo | TKL | English | t | 0 + TKM | 3419 | Ashgabat | TKM | Turkmenian | t | 76.7 + TMP | 1522 | Dili | TMP | Portuguese | t | 0 + TON | 3334 | Nukualofa | TON | English | t | 0 + TON | 3334 | Nukualofa | TON | Tongan | t | 98.3 + TUN | 3349 | Tunis | TUN | Arabic | t | 69.9 + TUR | 3358 | Ankara | TUR | Turkish | t | 87.6 + TUV | 3424 | Funafuti | TUV | English | t | 0 + TUV | 3424 | Funafuti | TUV | Tuvalu | t | 92.5 + TWN | 3263 | Taipei | TWN | Mandarin Chinese | t | 20.1 + TZA | 3306 | Dodoma | TZA | Swahili | t | 8.8 + UKR | 3426 | Kyiv | UKR | Ukrainian | t | 64.7 + URY | 3492 | Montevideo | URY | Spanish | t | 95.7 + USA | 3813 | Washington | USA | English | t | 86.2 + UZB | 3503 | Toskent | UZB | Uzbek | t | 72.6 + VAT | 3538 | Citta del Vaticano | VAT | Italian | t | 0 + VCT | 3066 | Kingstown | VCT | English | t | 0 + VEN | 3539 | Caracas | VEN | Spanish | t | 96.9 + VGB | 537 | Road Town | VGB | English | t | 0 + VIR | 4067 | Charlotte Amalie | VIR | English | t | 81.7 + VNM | 3770 | Hanoi | VNM | Vietnamese | t | 86.8 + VUT | 3537 | Port-Vila | VUT | Bislama | t | 56.6 + VUT | 3537 | Port-Vila | VUT | English | t | 28.3 + VUT | 3537 | Port-Vila | VUT | French | t | 14.2 + WSM | 3169 | Apia | WSM | English | t | 0.6 + WSM | 3169 | Apia | WSM | Samoan | t | 47.5 + YEM | 1780 | Sanaa | YEM | Arabic | t | 99.6 + YUG | 1792 | Beograd | YUG | Serbo-Croatian | t | 75.2 + ZAF | 716 | Pretoria | ZAF | Afrikaans | t | 14.3 + ZAF | 716 | Pretoria | ZAF | English | t | 8.5 + ZAF | 716 | Pretoria | ZAF | Xhosa | t | 17.7 + ZAF | 716 | Pretoria | ZAF | Zulu | t | 22.7 + ZWE | 4068 | Harare | ZWE | English | t | 2.2 +(237 rows) + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + lang_count | code | name | continent | region | population +------------+------+---------------------------------+-----------+-----------------+------------ + 12 | RUS | Russian Federation | Europe | Eastern Europe | 146934000 + 6 | FSM | Micronesia, Federated States of | Oceania | Micronesia | 119000 + 4 | AZE | Azerbaijan | Asia | Middle East | 7734000 + 1 | BIH | Bosnia and Herzegovina | Europe | Southern Europe | 3972000 +(4 rows) + +-- Using CTE in the WHERE clause +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + name | name | cnt +--------------------+------------------+----- + Australia | Canberra | 8 + Austria | Wien | 8 + Canada | Ottawa | 12 + China | Peking | 12 + Denmark | Kobenhavn | 7 + India | New Delhi | 12 + Iran | Teheran | 10 + Italy | Roma | 8 + Myanmar | Rangoon (Yangon) | 8 + Russian Federation | Moscow | 12 + South Africa | Pretoria | 11 + United States | Washington | 12 +(12 rows) + +-- some queries with merge joins and index scans +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' +UNION ALL +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + code | country | capital | headofstate | compared_with_cheap_asian_cnt +------+----------------------------------+-------------------------+-----------------------------------+------------------------------- + ATG | Antigua and Barbuda | Saint Johns | Elisabeth II | 2 + ARG | Argentina | Buenos Aires | Fernando de la Rua | 3 + ABW | Aruba | Oranjestad | Beatrix | 4 + BHS | Bahamas | Nassau | Elisabeth II | 2 + BRB | Barbados | Bridgetown | Elisabeth II | 2 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + CAN | Canada | Ottawa | Elisabeth II | 12 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + CRI | Costa Rica | San Jose | Miguel Angel Rodriguez Echeverria | 4 + DMA | Dominica | Roseau | Vernon Shaw | 2 + DOM | Dominican Republic | Santo Domingo de Guzman | Hipolito Mejia Dominguez | 2 + ECU | Ecuador | Quito | Gustavo Noboa Bejarano | 2 + SLV | El Salvador | San Salvador | Francisco Guillermo Flores Perez | 2 + GUF | French Guiana | Cayenne | Jacques Chirac | 2 + GRL | Greenland | Nuuk | Margrethe II | 2 + GLP | Guadeloupe | Basse-Terre | Jacques Chirac | 2 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + GUY | Guyana | Georgetown | Bharrat Jagdeo | 3 + HTI | Haiti | Port-au-Prince | Jean-Bertrand Aristide | 2 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 + JAM | Jamaica | Kingston | Elisabeth II | 2 + MTQ | Martinique | Fort-de-France | Jacques Chirac | 2 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + ANT | Netherlands Antilles | Willemstad | Beatrix | 3 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + PER | Peru | Lima | Valentin Paniagua Corazao | 3 + PRI | Puerto Rico | San Juan | George W. Bush | 2 + KNA | Saint Kitts and Nevis | Basseterre | Elisabeth II | 2 + LCA | Saint Lucia | Castries | Elisabeth II | 2 + VCT | Saint Vincent and the Grenadines | Kingstown | Elisabeth II | 2 + SUR | Suriname | Paramaribo | Ronald Venetiaan | 2 + TTO | Trinidad and Tobago | Port-of-Spain | Arthur N. R. Robinson | 3 + USA | United States | Washington | George W. Bush | 12 + VEN | Venezuela | Caracas | Hugo Chavez Frias | 3 + VIR | Virgin Islands, U.S. | Charlotte Amalie | George W. Bush | 3 +(40 rows) + +-- query 6 + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + count +------- + 43 +(1 row) + +-- query7 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + code | country | capital | language | isofficial | percentage | code | country | capital | language | isofficial | percentage +------+------------------------+-----------------------------------+----------------+------------+------------+------+------------------------+-----------------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Tirana | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | Wien | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Russian | t | 32 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Praha | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Kobenhavn | Danish | t | 93.5 + EST | Estonia | Tallinn | Estonian | t | 65.3 | EST | Estonia | Tallinn | Estonian | t | 65.3 + FRO | Faroe Islands | Torshavn | Danish | t | 0 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FRA | France | Paris | French | t | 93.6 | FRA | France | Paris | French | t | 93.6 + DEU | Germany | Berlin | German | t | 91.3 | DEU | Germany | Berlin | German | t | 91.3 + GIB | Gibraltar | Gibraltar | English | t | 88.9 | GIB | Gibraltar | Gibraltar | English | t | 88.9 + GRC | Greece | Athenai | Greek | t | 98.5 | GRC | Greece | Athenai | Greek | t | 98.5 + HUN | Hungary | Budapest | Hungarian | t | 98.5 | HUN | Hungary | Budapest | Hungarian | t | 98.5 + ISL | Iceland | Reykjavik | Icelandic | t | 95.7 | ISL | Iceland | Reykjavik | Icelandic | t | 95.7 + IRL | Ireland | Dublin | English | t | 98.4 | IRL | Ireland | Dublin | English | t | 98.4 + IRL | Ireland | Dublin | Irish | t | 1.6 | IRL | Ireland | Dublin | English | t | 98.4 + ITA | Italy | Roma | Italian | t | 94.1 | ITA | Italy | Roma | Italian | t | 94.1 + LVA | Latvia | Riga | Latvian | t | 55.1 | LVA | Latvia | Riga | Latvian | t | 55.1 + LIE | Liechtenstein | Vaduz | German | t | 89 | LIE | Liechtenstein | Vaduz | German | t | 89 + LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 | LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | French | t | 4.2 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | German | t | 2.3 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + MKD | Macedonia | Skopje | Macedonian | t | 66.5 | MKD | Macedonia | Skopje | Macedonian | t | 66.5 + MLT | Malta | Valletta | English | t | 2.1 | MLT | Malta | Valletta | Maltese | t | 95.8 + MLT | Malta | Valletta | Maltese | t | 95.8 | MLT | Malta | Valletta | Maltese | t | 95.8 + MDA | Moldova | Chisinau | Romanian | t | 61.9 | MDA | Moldova | Chisinau | Romanian | t | 61.9 + NLD | Netherlands | Amsterdam | Dutch | t | 95.6 | NLD | Netherlands | Amsterdam | Dutch | t | 95.6 + NOR | Norway | Oslo | Norwegian | t | 96.6 | NOR | Norway | Oslo | Norwegian | t | 96.6 + POL | Poland | Warszawa | Polish | t | 97.6 | POL | Poland | Warszawa | Polish | t | 97.6 + PRT | Portugal | Lisboa | Portuguese | t | 99 | PRT | Portugal | Lisboa | Portuguese | t | 99 + ROM | Romania | Bucuresti | Romani | t | 0.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + ROM | Romania | Bucuresti | Romanian | t | 90.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + RUS | Russian Federation | Moscow | Russian | t | 86.6 | RUS | Russian Federation | Moscow | Russian | t | 86.6 + SMR | San Marino | San Marino | Italian | t | 100 | SMR | San Marino | San Marino | Italian | t | 100 + SVK | Slovakia | Bratislava | Slovak | t | 85.6 | SVK | Slovakia | Bratislava | Slovak | t | 85.6 + SVN | Slovenia | Ljubljana | Slovene | t | 87.9 | SVN | Slovenia | Ljubljana | Slovene | t | 87.9 + ESP | Spain | Madrid | Spanish | t | 74.4 | ESP | Spain | Madrid | Spanish | t | 74.4 + SWE | Sweden | Stockholm | Swedish | t | 89.5 | SWE | Sweden | Stockholm | Swedish | t | 89.5 + CHE | Switzerland | Bern | French | t | 19.2 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | German | t | 63.6 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Italian | t | 7.7 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Romansh | t | 0.6 | CHE | Switzerland | Bern | German | t | 63.6 + UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 | UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 + GBR | United Kingdom | London | English | t | 97.3 | GBR | United Kingdom | London | English | t | 97.3 + YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 | YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 +(55 rows) + +-- query8 +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + region_city_cnt | region_lang_cnt | region +-----------------+-----------------+--------------------------- + 840 | 192 | Caribbean + 2824 | 112 | Central America + 11336 | 384 | Eastern Asia + 2664 | 396 | Middle East + 1625 | 125 | North America + 3500 | 70 | South America + 3179 | 528 | Southeast Asia + 12278 | 896 | Southern and Central Asia +(8 rows) + +-- some queries with hash joins and index scans +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + code | name | capital | capital_city | cnt | cnt +------+--------------------+---------+------------------+-----+----- + AUS | Australia | 135 | Canberra | 8 | + AUT | Austria | 1523 | Wien | 8 | + CAN | Canada | 1822 | Ottawa | 12 | + CHN | China | 1891 | Peking | 12 | + DNK | Denmark | 3315 | Kobenhavn | 7 | + IND | India | 1109 | New Delhi | 12 | + IRN | Iran | 1380 | Teheran | 10 | + ITA | Italy | 1464 | Roma | 8 | + MMR | Myanmar | 2710 | Rangoon (Yangon) | 8 | + RUS | Russian Federation | 3580 | Moscow | 12 | + ZAF | South Africa | 716 | Pretoria | 11 | + USA | United States | 3813 | Washington | 12 | +(12 rows) + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + city_cnt | lang_cnt | name | REGION_SURFACE_AREA | REGION_LIFETIME | REGION_POP | lang_count | REGION_GNP | region +----------+----------+---------------------------------------+---------------------+------------------+------------+------------+------------+--------------------------- + 4 | 5 | Afghanistan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 3 | Albania | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 18 | 2 | Algeria | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 5 | 9 | Angola | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 2 | Antigua and Barbuda | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 57 | 3 | Argentina | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 2 | Armenia | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 14 | 8 | Australia | 62471162.00 | 78.8000030517578 | 22753100 | 11 | 405851.00 | Australia and New Zealand + 6 | 8 | Austria | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 4 | 4 | Azerbaijan | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 1 | 2 | Bahamas | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 1 | 2 | Bahrain | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 24 | 7 | Bangladesh | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 2 | Barbados | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 16 | 4 | Belarus | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 9 | 6 | Belgium | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 2 | 4 | Belize | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 4 | 7 | Benin | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Bhutan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 8 | 4 | Bolivia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 1 | Bosnia and Herzegovina | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 2 | 5 | Botswana | 23060186.00 | 44.8199996948242 | 46886000 | 21 | 126931.00 | Southern Africa + 250 | 5 | Brazil | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 4 | Brunei | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 10 | 4 | Bulgaria | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 3 | 6 | Burkina Faso | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Burundi | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 3 | 4 | Cambodia | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 7 | 8 | Cameroon | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 49 | 12 | Canada | 236342035.00 | 75.8199996948242 | 309632000 | 18 | 9111890.00 | North America + 1 | 2 | Cape Verde | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 6 | Central African Republic | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 2 | 8 | Chad | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 29 | 4 | Chile | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 38 | 5 | Colombia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 5 | Comoros | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 2 | 6 | Congo | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 4 | Costa Rica | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 5 | 5 | Cote deIvoire | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 4 | 2 | Croatia | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 14 | 1 | Cuba | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 2 | 2 | Cyprus | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 10 | 8 | Czech Republic | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 1 | 3 | Djibouti | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 1 | 2 | Dominica | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 6 | 2 | Dominican Republic | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 15 | 2 | Ecuador | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 37 | 2 | Egypt | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 7 | 2 | El Salvador | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America +(50 rows) + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + city_cnt | lang_cnt | identifier +----------+----------+--------------------------- + 494 | 10 | British Islands + 159 | 48 | Baltic Countries + 1295 | 161 | Nordic Countries + 50176 | 264 | Eastern Asia + 9414 | 369 | Western Europe + 11880 | 450 | Southern Europe + 32900 | 610 | Eastern Europe + 29161 | 616 | Southeast Asia + 8568 | 792 | Middle East + 80388 | 1092 | Southern and Central Asia +(10 rows) + +-- queries with CTEs using index scans on bitmap indexes +\echo --start_ignore +--start_ignore +Drop index bitmap_city_countrycode; +ERROR: index "bitmap_city_countrycode" does not exist +Drop index bitmap_country_gf; +ERROR: index "bitmap_country_gf" does not exist +Drop index bitmap_country_region; +ERROR: index "bitmap_country_region" does not exist +Drop index bitmap_country_continent; +ERROR: index "bitmap_country_continent" does not exist +Drop index bitmap_countrylanguage_countrycode; +ERROR: index "bitmap_countrylanguage_countrycode" does not exist +\echo --end_ignore +--end_ignore +create index bitmap_city_countrycode on city using bitmap(countrycode); +create index bitmap_country_gf on country using bitmap(governmentform); +create index bitmap_country_region on country using bitmap(region); +create index bitmap_country_continent on country using bitmap(continent); +create index bitmap_countrylanguage_countrycode on countrylanguage using bitmap(countrycode); +set enable_seqscan=off; +set enable_indexscan=on; +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + code | id | name | countrycode | language | isofficial | percentage +------+------+-----------------------------------+-------------+------------------+------------+------------ + ABW | 129 | Oranjestad | ABW | Dutch | t | 5.3 + AFG | 1 | Kabul | AFG | Dari | t | 32.1 + AFG | 1 | Kabul | AFG | Pashto | t | 52.4 + AIA | 62 | The Valley | AIA | English | t | 0 + ALB | 34 | Tirana | ALB | Albaniana | t | 97.9 + AND | 55 | Andorra la Vella | AND | Catalan | t | 32.3 + ANT | 33 | Willemstad | ANT | Dutch | t | 0 + ANT | 33 | Willemstad | ANT | Papiamento | t | 86.2 + ARE | 65 | Abu Dhabi | ARE | Arabic | t | 42 + ARG | 69 | Buenos Aires | ARG | Spanish | t | 96.8 + ARM | 126 | Yerevan | ARM | Armenian | t | 93.4 + ASM | 54 | Fagatogo | ASM | English | t | 3.1 + ASM | 54 | Fagatogo | ASM | Samoan | t | 90.6 + ATG | 63 | Saint Johns | ATG | English | t | 0 + AUS | 135 | Canberra | AUS | English | t | 81.2 + AUT | 1523 | Wien | AUT | German | t | 92 + AZE | 144 | Baku | AZE | Azerbaijani | t | 89 + BDI | 552 | Bujumbura | BDI | French | t | 0 + BDI | 552 | Bujumbura | BDI | Kirundi | t | 98.1 + BEL | 179 | Bruxelles [Brussel] | BEL | Dutch | t | 59.2 + BEL | 179 | Bruxelles [Brussel] | BEL | French | t | 32.6 + BEL | 179 | Bruxelles [Brussel] | BEL | German | t | 1 + BGD | 150 | Dhaka | BGD | Bengali | t | 97.7 + BGR | 539 | Sofija | BGR | Bulgariana | t | 83.2 + BHR | 149 | al-Manama | BHR | Arabic | t | 67.7 + BIH | 201 | Sarajevo | BIH | Serbo-Croatian | t | 99.2 + BLR | 3520 | Minsk | BLR | Belorussian | t | 65.6 + BLR | 3520 | Minsk | BLR | Russian | t | 32 + BLZ | 185 | Belmopan | BLZ | English | t | 50.8 + BMU | 191 | Hamilton | BMU | English | t | 100 + BOL | 194 | La Paz | BOL | Aimara | t | 3.2 + BOL | 194 | La Paz | BOL | Ketdua | t | 8.1 + BOL | 194 | La Paz | BOL | Spanish | t | 87.7 + BRA | 211 | Brasilia | BRA | Portuguese | t | 97.5 + BRB | 174 | Bridgetown | BRB | English | t | 0 + BRN | 538 | Bandar Seri Begawan | BRN | Malay | t | 45.5 + BTN | 192 | Thimphu | BTN | Dzongkha | t | 50 + CAN | 1822 | Ottawa | CAN | English | t | 60.4 + CAN | 1822 | Ottawa | CAN | French | t | 23.4 + CCK | 2317 | West Island | CCK | English | t | 0 + CHE | 3248 | Bern | CHE | French | t | 19.2 + CHE | 3248 | Bern | CHE | German | t | 63.6 + CHE | 3248 | Bern | CHE | Italian | t | 7.7 + CHE | 3248 | Bern | CHE | Romansh | t | 0.6 + CHL | 554 | Santiago de Chile | CHL | Spanish | t | 89.7 + CHN | 1891 | Peking | CHN | Chinese | t | 92 + COK | 583 | Avarua | COK | Maori | t | 0 + COL | 2257 | Santafe de Bogota | COL | Spanish | t | 99 + COM | 2295 | Moroni | COM | Comorian | t | 75 + CPV | 1859 | Praia | CPV | Portuguese | t | 0 + CRI | 584 | San Jose | CRI | Spanish | t | 97.5 + CUB | 2413 | La Habana | CUB | Spanish | t | 100 + CXR | 1791 | Flying Fish Cove | CXR | English | t | 0 + CYM | 553 | George Town | CYM | English | t | 0 + CYP | 2430 | Nicosia | CYP | Greek | t | 74.1 + CYP | 2430 | Nicosia | CYP | Turkish | t | 22.4 + CZE | 3339 | Praha | CZE | Czech | t | 81.2 + DEU | 3068 | Berlin | DEU | German | t | 91.3 + DJI | 585 | Djibouti | DJI | Arabic | t | 10.6 + DNK | 3315 | Kobenhavn | DNK | Danish | t | 93.5 + DOM | 587 | Santo Domingo de Guzman | DOM | Spanish | t | 98 + DZA | 35 | Alger | DZA | Arabic | t | 86 + ECU | 594 | Quito | ECU | Spanish | t | 93 + EGY | 608 | Cairo | EGY | Arabic | t | 98.8 + ERI | 652 | Asmara | ERI | Tigrinja | t | 49.1 + ESH | 2453 | El-Aaiun | ESH | Arabic | t | 100 + ESP | 653 | Madrid | ESP | Spanish | t | 74.4 + EST | 3791 | Tallinn | EST | Estonian | t | 65.3 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Finnish | t | 92.7 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Swedish | t | 5.7 + FJI | 764 | Suva | FJI | Fijian | t | 50.8 + FLK | 763 | Stanley | FLK | English | t | 0 + FRA | 2974 | Paris | FRA | French | t | 93.6 + FRO | 901 | Torshavn | FRO | Danish | t | 0 + FRO | 901 | Torshavn | FRO | Faroese | t | 100 + GBR | 456 | London | GBR | English | t | 97.3 + GEO | 905 | Tbilisi | GEO | Georgiana | t | 71.7 + GIB | 915 | Gibraltar | GIB | English | t | 88.9 + GLP | 919 | Basse-Terre | GLP | French | t | 0 + GNB | 927 | Bissau | GNB | Portuguese | t | 8.1 + GRC | 2401 | Athenai | GRC | Greek | t | 98.5 + GRL | 917 | Nuuk | GRL | Danish | t | 12.5 + GRL | 917 | Nuuk | GRL | Greenlandic | t | 87.5 + GTM | 922 | Ciudad de Guatemala | GTM | Spanish | t | 64.7 + GUM | 921 | Agaaa | GUM | Chamorro | t | 29.6 + GUM | 921 | Agaaa | GUM | English | t | 37.5 + HKG | 937 | Victoria | HKG | English | t | 2.2 + HND | 933 | Tegucigalpa | HND | Spanish | t | 97.2 + HRV | 2409 | Zagreb | HRV | Serbo-Croatian | t | 95.9 + HTI | 929 | Port-au-Prince | HTI | French | t | 0 + HUN | 3483 | Budapest | HUN | Hungarian | t | 98.5 + IDN | 939 | Jakarta | IDN | Malay | t | 12.1 + IND | 1109 | New Delhi | IND | Hindi | t | 39.9 + IRL | 1447 | Dublin | IRL | English | t | 98.4 + IRL | 1447 | Dublin | IRL | Irish | t | 1.6 + IRN | 1380 | Teheran | IRN | Persian | t | 45.7 + IRQ | 1365 | Baghdad | IRQ | Arabic | t | 77.2 + ISL | 1449 | Reykjavik | ISL | Icelandic | t | 95.7 + ISR | 1450 | Jerusalem | ISR | Arabic | t | 18 + ISR | 1450 | Jerusalem | ISR | Hebrew | t | 63.1 + ITA | 1464 | Roma | ITA | Italian | t | 94.1 + JOR | 1786 | Amman | JOR | Arabic | t | 97.9 + JPN | 1532 | Tokyo | JPN | Japanese | t | 99.1 + KAZ | 1864 | Astana | KAZ | Kazakh | t | 46 + KGZ | 2253 | Bishkek | KGZ | Kirgiz | t | 59.7 + KGZ | 2253 | Bishkek | KGZ | Russian | t | 16.2 + KHM | 1800 | Phnom Penh | KHM | Khmer | t | 88.6 + KIR | 2256 | Bairiki | KIR | Kiribati | t | 98.9 + KNA | 3064 | Basseterre | KNA | English | t | 0 + KOR | 2331 | Seoul | KOR | Korean | t | 99.9 + KWT | 2429 | Kuwait | KWT | Arabic | t | 78.1 + LAO | 2432 | Vientiane | LAO | Lao | t | 67.2 + LBN | 2438 | Beirut | LBN | Arabic | t | 93 + LBY | 2441 | Tripoli | LBY | Arabic | t | 96 + LCA | 3065 | Castries | LCA | English | t | 20 + LIE | 2446 | Vaduz | LIE | German | t | 89 + LKA | 3217 | Colombo | LKA | Singali | t | 60.3 + LKA | 3217 | Colombo | LKA | Tamil | t | 19.6 + LSO | 2437 | Maseru | LSO | English | t | 0 + LSO | 2437 | Maseru | LSO | Sotho | t | 85 + LTU | 2447 | Vilnius | LTU | Lithuanian | t | 81.6 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | French | t | 4.2 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | German | t | 2.3 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | Luxembourgish | t | 64.4 + LVA | 2434 | Riga | LVA | Latvian | t | 55.1 + MAC | 2454 | Macao | MAC | Portuguese | t | 2.3 + MAR | 2486 | Rabat | MAR | Arabic | t | 65 + MCO | 2695 | Monaco-Ville | MCO | French | t | 41.9 + MDA | 2690 | Chisinau | MDA | Romanian | t | 61.9 + MDG | 2455 | Antananarivo | MDG | French | t | 0 + MDG | 2455 | Antananarivo | MDG | Malagasy | t | 98.9 + MDV | 2463 | Male | MDV | Dhivehi | t | 100 + MEX | 2515 | Ciudad de Mexico | MEX | Spanish | t | 92.1 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | English | t | 0 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | Marshallese | t | 96.8 + MKD | 2460 | Skopje | MKD | Macedonian | t | 66.5 + MLT | 2484 | Valletta | MLT | English | t | 2.1 + MLT | 2484 | Valletta | MLT | Maltese | t | 95.8 + MMR | 2710 | Rangoon (Yangon) | MMR | Burmese | t | 69 + MNG | 2696 | Ulan Bator | MNG | Mongolian | t | 78.8 + MNP | 2913 | Garapan | MNP | English | t | 4.8 + MSR | 2697 | Plymouth | MSR | English | t | 0 + MTQ | 2508 | Fort-de-France | MTQ | French | t | 0 + MWI | 2462 | Lilongwe | MWI | Chichewa | t | 58.3 + MYS | 2464 | Kuala Lumpur | MYS | Malay | t | 58.4 + MYT | 2514 | Mamoutzou | MYT | French | t | 20.3 + NCL | 3493 | Noumea | NCL | French | t | 34.3 + NFK | 2806 | Kingston | NFK | English | t | 0 + NIC | 2734 | Managua | NIC | Spanish | t | 97.6 + NIU | 2805 | Alofi | NIU | English | t | 0 + NLD | 5 | Amsterdam | NLD | Dutch | t | 95.6 + NOR | 2807 | Oslo | NOR | Norwegian | t | 96.6 + NPL | 2729 | Kathmandu | NPL | Nepali | t | 50.4 + NRU | 2728 | Yaren | NRU | English | t | 7.5 + NRU | 2728 | Yaren | NRU | Nauru | t | 57.5 + NZL | 3499 | Wellington | NZL | English | t | 87 + OMN | 2821 | Masqat | OMN | Arabic | t | 76.7 + PAK | 2831 | Islamabad | PAK | Urdu | t | 7.6 + PAN | 2882 | Ciudad de Panama | PAN | Spanish | t | 76.8 + PER | 2890 | Lima | PER | Aimara | t | 2.3 + PER | 2890 | Lima | PER | Ketdua | t | 16.4 + PER | 2890 | Lima | PER | Spanish | t | 79.8 + PHL | 766 | Manila | PHL | Pilipino | t | 29.3 + PLW | 2881 | Koror | PLW | English | t | 3.2 + PLW | 2881 | Koror | PLW | Palau | t | 82.2 + POL | 2928 | Warszawa | POL | Polish | t | 97.6 + PRI | 2919 | San Juan | PRI | Spanish | t | 51.3 + PRK | 2318 | Pyongyang | PRK | Korean | t | 99.9 + PRT | 2914 | Lisboa | PRT | Portuguese | t | 99 + PRY | 2885 | Asuncion | PRY | Guarani | t | 40.1 + PRY | 2885 | Asuncion | PRY | Spanish | t | 55.1 + PYF | 3016 | Papeete | PYF | French | t | 40.8 + QAT | 2973 | Doha | QAT | Arabic | t | 40.7 + ROM | 3018 | Bucuresti | ROM | Romani | t | 0.7 + ROM | 3018 | Bucuresti | ROM | Romanian | t | 90.7 + RUS | 3580 | Moscow | RUS | Russian | t | 86.6 + RWA | 3047 | Kigali | RWA | French | t | 0 + RWA | 3047 | Kigali | RWA | Rwanda | t | 100 + SAU | 3173 | Riyadh | SAU | Arabic | t | 95 + SDN | 3225 | Khartum | SDN | Arabic | t | 49.4 + SEN | 3198 | Dakar | SEN | Wolof | t | 48.1 + SGP | 3208 | Singapore | SGP | Chinese | t | 77.1 + SGP | 3208 | Singapore | SGP | Malay | t | 14.1 + SGP | 3208 | Singapore | SGP | Tamil | t | 7.4 + SHN | 3063 | Jamestown | SHN | English | t | 0 + SJM | 938 | Longyearbyen | SJM | Norwegian | t | 0 + SLV | 645 | San Salvador | SLV | Spanish | t | 100 + SMR | 3171 | San Marino | SMR | Italian | t | 100 + SOM | 3214 | Mogadishu | SOM | Arabic | t | 0 + SOM | 3214 | Mogadishu | SOM | Somali | t | 98.3 + SPM | 3067 | Saint-Pierre | SPM | French | t | 0 + SVK | 3209 | Bratislava | SVK | Slovak | t | 85.6 + SVN | 3212 | Ljubljana | SVN | Slovene | t | 87.9 + SWE | 3048 | Stockholm | SWE | Swedish | t | 89.5 + SWZ | 3244 | Mbabane | SWZ | Swazi | t | 89.9 + SYC | 3206 | Victoria | SYC | English | t | 3.8 + SYC | 3206 | Victoria | SYC | French | t | 1.3 + SYR | 3250 | Damascus | SYR | Arabic | t | 90 + TCA | 3423 | Cockburn Town | TCA | English | t | 0 + TCD | 3337 | NDjamena | TCD | Arabic | t | 12.3 + TGO | 3332 | Lome | TGO | Ewe | t | 23.2 + TGO | 3332 | Lome | TGO | Kabye | t | 13.8 + THA | 3320 | Bangkok | THA | Thai | t | 52.6 + TJK | 3261 | Dushanbe | TJK | Tadzhik | t | 62.2 + TKL | 3333 | Fakaofo | TKL | English | t | 0 + TKM | 3419 | Ashgabat | TKM | Turkmenian | t | 76.7 + TMP | 1522 | Dili | TMP | Portuguese | t | 0 + TON | 3334 | Nukualofa | TON | English | t | 0 + TON | 3334 | Nukualofa | TON | Tongan | t | 98.3 + TUN | 3349 | Tunis | TUN | Arabic | t | 69.9 + TUR | 3358 | Ankara | TUR | Turkish | t | 87.6 + TUV | 3424 | Funafuti | TUV | English | t | 0 + TUV | 3424 | Funafuti | TUV | Tuvalu | t | 92.5 + TWN | 3263 | Taipei | TWN | Mandarin Chinese | t | 20.1 + TZA | 3306 | Dodoma | TZA | Swahili | t | 8.8 + UKR | 3426 | Kyiv | UKR | Ukrainian | t | 64.7 + URY | 3492 | Montevideo | URY | Spanish | t | 95.7 + USA | 3813 | Washington | USA | English | t | 86.2 + UZB | 3503 | Toskent | UZB | Uzbek | t | 72.6 + VAT | 3538 | Citta del Vaticano | VAT | Italian | t | 0 + VCT | 3066 | Kingstown | VCT | English | t | 0 + VEN | 3539 | Caracas | VEN | Spanish | t | 96.9 + VGB | 537 | Road Town | VGB | English | t | 0 + VIR | 4067 | Charlotte Amalie | VIR | English | t | 81.7 + VNM | 3770 | Hanoi | VNM | Vietnamese | t | 86.8 + VUT | 3537 | Port-Vila | VUT | Bislama | t | 56.6 + VUT | 3537 | Port-Vila | VUT | English | t | 28.3 + VUT | 3537 | Port-Vila | VUT | French | t | 14.2 + WSM | 3169 | Apia | WSM | English | t | 0.6 + WSM | 3169 | Apia | WSM | Samoan | t | 47.5 + YEM | 1780 | Sanaa | YEM | Arabic | t | 99.6 + YUG | 1792 | Beograd | YUG | Serbo-Croatian | t | 75.2 + ZAF | 716 | Pretoria | ZAF | Afrikaans | t | 14.3 + ZAF | 716 | Pretoria | ZAF | English | t | 8.5 + ZAF | 716 | Pretoria | ZAF | Xhosa | t | 17.7 + ZAF | 716 | Pretoria | ZAF | Zulu | t | 22.7 + ZWE | 4068 | Harare | ZWE | English | t | 2.2 +(237 rows) + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + lang_count | code | name | continent | region | population +------------+------+---------------------------------+-----------+-----------------+------------ + 12 | RUS | Russian Federation | Europe | Eastern Europe | 146934000 + 6 | FSM | Micronesia, Federated States of | Oceania | Micronesia | 119000 + 4 | AZE | Azerbaijan | Asia | Middle East | 7734000 + 1 | BIH | Bosnia and Herzegovina | Europe | Southern Europe | 3972000 +(4 rows) + +-- Using CTE in the WHERE clause +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + name | name | cnt +--------------------+------------------+----- + Australia | Canberra | 8 + Austria | Wien | 8 + Canada | Ottawa | 12 + China | Peking | 12 + Denmark | Kobenhavn | 7 + India | New Delhi | 12 + Iran | Teheran | 10 + Italy | Roma | 8 + Myanmar | Rangoon (Yangon) | 8 + Russian Federation | Moscow | 12 + South Africa | Pretoria | 11 + United States | Washington | 12 +(12 rows) + +-- some queries with merge joins and index scans +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' +UNION ALL +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + code | country | capital | headofstate | compared_with_cheap_asian_cnt +------+----------------------------------+-------------------------+-----------------------------------+------------------------------- + ATG | Antigua and Barbuda | Saint Johns | Elisabeth II | 2 + ARG | Argentina | Buenos Aires | Fernando de la Rua | 3 + ABW | Aruba | Oranjestad | Beatrix | 4 + BHS | Bahamas | Nassau | Elisabeth II | 2 + BRB | Barbados | Bridgetown | Elisabeth II | 2 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + CAN | Canada | Ottawa | Elisabeth II | 12 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + CRI | Costa Rica | San Jose | Miguel Angel Rodriguez Echeverria | 4 + DMA | Dominica | Roseau | Vernon Shaw | 2 + DOM | Dominican Republic | Santo Domingo de Guzman | Hipolito Mejia Dominguez | 2 + ECU | Ecuador | Quito | Gustavo Noboa Bejarano | 2 + SLV | El Salvador | San Salvador | Francisco Guillermo Flores Perez | 2 + GUF | French Guiana | Cayenne | Jacques Chirac | 2 + GRL | Greenland | Nuuk | Margrethe II | 2 + GLP | Guadeloupe | Basse-Terre | Jacques Chirac | 2 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + GUY | Guyana | Georgetown | Bharrat Jagdeo | 3 + HTI | Haiti | Port-au-Prince | Jean-Bertrand Aristide | 2 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 + JAM | Jamaica | Kingston | Elisabeth II | 2 + MTQ | Martinique | Fort-de-France | Jacques Chirac | 2 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + ANT | Netherlands Antilles | Willemstad | Beatrix | 3 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + PER | Peru | Lima | Valentin Paniagua Corazao | 3 + PRI | Puerto Rico | San Juan | George W. Bush | 2 + KNA | Saint Kitts and Nevis | Basseterre | Elisabeth II | 2 + LCA | Saint Lucia | Castries | Elisabeth II | 2 + VCT | Saint Vincent and the Grenadines | Kingstown | Elisabeth II | 2 + SUR | Suriname | Paramaribo | Ronald Venetiaan | 2 + TTO | Trinidad and Tobago | Port-of-Spain | Arthur N. R. Robinson | 3 + USA | United States | Washington | George W. Bush | 12 + VEN | Venezuela | Caracas | Hugo Chavez Frias | 3 + VIR | Virgin Islands, U.S. | Charlotte Amalie | George W. Bush | 3 +(40 rows) + +-- query 6 + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + count +------- + 43 +(1 row) + +-- query8 +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + region_city_cnt | region_lang_cnt | region +-----------------+-----------------+--------------------------- + 840 | 192 | Caribbean + 2824 | 112 | Central America + 11336 | 384 | Eastern Asia + 2664 | 396 | Middle East + 1625 | 125 | North America + 3500 | 70 | South America + 3179 | 528 | Southeast Asia + 12278 | 896 | Southern and Central Asia +(8 rows) + +-- some queries with hash joins and index scans +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + code | name | capital | capital_city | cnt | cnt +------+--------------------+---------+------------------+-----+----- + AUS | Australia | 135 | Canberra | 8 | + AUT | Austria | 1523 | Wien | 8 | + CAN | Canada | 1822 | Ottawa | 12 | + CHN | China | 1891 | Peking | 12 | + DNK | Denmark | 3315 | Kobenhavn | 7 | + IND | India | 1109 | New Delhi | 12 | + IRN | Iran | 1380 | Teheran | 10 | + ITA | Italy | 1464 | Roma | 8 | + MMR | Myanmar | 2710 | Rangoon (Yangon) | 8 | + RUS | Russian Federation | 3580 | Moscow | 12 | + ZAF | South Africa | 716 | Pretoria | 11 | + USA | United States | 3813 | Washington | 12 | +(12 rows) + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + city_cnt | lang_cnt | name | REGION_SURFACE_AREA | REGION_LIFETIME | REGION_POP | lang_count | REGION_GNP | region +----------+----------+---------------------------------------+---------------------+------------------+------------+------------+------------+--------------------------- + 4 | 5 | Afghanistan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 3 | Albania | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 18 | 2 | Algeria | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 5 | 9 | Angola | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 2 | Antigua and Barbuda | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 57 | 3 | Argentina | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 2 | Armenia | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 14 | 8 | Australia | 62471162.00 | 78.8000030517578 | 22753100 | 11 | 405851.00 | Australia and New Zealand + 6 | 8 | Austria | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 4 | 4 | Azerbaijan | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 1 | 2 | Bahamas | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 1 | 2 | Bahrain | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 24 | 7 | Bangladesh | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 2 | Barbados | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 16 | 4 | Belarus | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 9 | 6 | Belgium | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 2 | 4 | Belize | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 4 | 7 | Benin | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Bhutan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 8 | 4 | Bolivia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 1 | Bosnia and Herzegovina | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 2 | 5 | Botswana | 23060186.00 | 44.8199996948242 | 46886000 | 21 | 126931.00 | Southern Africa + 250 | 5 | Brazil | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 4 | Brunei | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 10 | 4 | Bulgaria | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 3 | 6 | Burkina Faso | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Burundi | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 3 | 4 | Cambodia | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 7 | 8 | Cameroon | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 49 | 12 | Canada | 236342035.00 | 75.8199996948242 | 309632000 | 18 | 9111890.00 | North America + 1 | 2 | Cape Verde | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 6 | Central African Republic | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 2 | 8 | Chad | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 29 | 4 | Chile | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 38 | 5 | Colombia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 5 | Comoros | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 2 | 6 | Congo | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 4 | Costa Rica | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 5 | 5 | Cote deIvoire | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 4 | 2 | Croatia | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 14 | 1 | Cuba | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 2 | 2 | Cyprus | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 10 | 8 | Czech Republic | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 1 | 3 | Djibouti | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 1 | 2 | Dominica | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 6 | 2 | Dominican Republic | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 15 | 2 | Ecuador | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 37 | 2 | Egypt | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 7 | 2 | El Salvador | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America +(50 rows) + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + city_cnt | lang_cnt | identifier +----------+----------+--------------------------- + 494 | 10 | British Islands + 159 | 48 | Baltic Countries + 1295 | 161 | Nordic Countries + 50176 | 264 | Eastern Asia + 9414 | 369 | Western Europe + 11880 | 450 | Southern Europe + 32900 | 610 | Eastern Europe + 29161 | 616 | Southeast Asia + 8568 | 792 | Middle East + 80388 | 1092 | Southern and Central Asia +(10 rows) + +-- queries with CTEs using hash aggs +set enable_groupagg=off; +set enable_hashagg=on; +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + code | id | name | countrycode | language | isofficial | percentage +------+------+-----------------------------------+-------------+------------------+------------+------------ + ABW | 129 | Oranjestad | ABW | Dutch | t | 5.3 + AFG | 1 | Kabul | AFG | Dari | t | 32.1 + AFG | 1 | Kabul | AFG | Pashto | t | 52.4 + AIA | 62 | The Valley | AIA | English | t | 0 + ALB | 34 | Tirana | ALB | Albaniana | t | 97.9 + AND | 55 | Andorra la Vella | AND | Catalan | t | 32.3 + ANT | 33 | Willemstad | ANT | Dutch | t | 0 + ANT | 33 | Willemstad | ANT | Papiamento | t | 86.2 + ARE | 65 | Abu Dhabi | ARE | Arabic | t | 42 + ARG | 69 | Buenos Aires | ARG | Spanish | t | 96.8 + ARM | 126 | Yerevan | ARM | Armenian | t | 93.4 + ASM | 54 | Fagatogo | ASM | English | t | 3.1 + ASM | 54 | Fagatogo | ASM | Samoan | t | 90.6 + ATG | 63 | Saint Johns | ATG | English | t | 0 + AUS | 135 | Canberra | AUS | English | t | 81.2 + AUT | 1523 | Wien | AUT | German | t | 92 + AZE | 144 | Baku | AZE | Azerbaijani | t | 89 + BDI | 552 | Bujumbura | BDI | French | t | 0 + BDI | 552 | Bujumbura | BDI | Kirundi | t | 98.1 + BEL | 179 | Bruxelles [Brussel] | BEL | Dutch | t | 59.2 + BEL | 179 | Bruxelles [Brussel] | BEL | French | t | 32.6 + BEL | 179 | Bruxelles [Brussel] | BEL | German | t | 1 + BGD | 150 | Dhaka | BGD | Bengali | t | 97.7 + BGR | 539 | Sofija | BGR | Bulgariana | t | 83.2 + BHR | 149 | al-Manama | BHR | Arabic | t | 67.7 + BIH | 201 | Sarajevo | BIH | Serbo-Croatian | t | 99.2 + BLR | 3520 | Minsk | BLR | Belorussian | t | 65.6 + BLR | 3520 | Minsk | BLR | Russian | t | 32 + BLZ | 185 | Belmopan | BLZ | English | t | 50.8 + BMU | 191 | Hamilton | BMU | English | t | 100 + BOL | 194 | La Paz | BOL | Aimara | t | 3.2 + BOL | 194 | La Paz | BOL | Ketdua | t | 8.1 + BOL | 194 | La Paz | BOL | Spanish | t | 87.7 + BRA | 211 | Brasilia | BRA | Portuguese | t | 97.5 + BRB | 174 | Bridgetown | BRB | English | t | 0 + BRN | 538 | Bandar Seri Begawan | BRN | Malay | t | 45.5 + BTN | 192 | Thimphu | BTN | Dzongkha | t | 50 + CAN | 1822 | Ottawa | CAN | English | t | 60.4 + CAN | 1822 | Ottawa | CAN | French | t | 23.4 + CCK | 2317 | West Island | CCK | English | t | 0 + CHE | 3248 | Bern | CHE | French | t | 19.2 + CHE | 3248 | Bern | CHE | German | t | 63.6 + CHE | 3248 | Bern | CHE | Italian | t | 7.7 + CHE | 3248 | Bern | CHE | Romansh | t | 0.6 + CHL | 554 | Santiago de Chile | CHL | Spanish | t | 89.7 + CHN | 1891 | Peking | CHN | Chinese | t | 92 + COK | 583 | Avarua | COK | Maori | t | 0 + COL | 2257 | Santafe de Bogota | COL | Spanish | t | 99 + COM | 2295 | Moroni | COM | Comorian | t | 75 + CPV | 1859 | Praia | CPV | Portuguese | t | 0 + CRI | 584 | San Jose | CRI | Spanish | t | 97.5 + CUB | 2413 | La Habana | CUB | Spanish | t | 100 + CXR | 1791 | Flying Fish Cove | CXR | English | t | 0 + CYM | 553 | George Town | CYM | English | t | 0 + CYP | 2430 | Nicosia | CYP | Greek | t | 74.1 + CYP | 2430 | Nicosia | CYP | Turkish | t | 22.4 + CZE | 3339 | Praha | CZE | Czech | t | 81.2 + DEU | 3068 | Berlin | DEU | German | t | 91.3 + DJI | 585 | Djibouti | DJI | Arabic | t | 10.6 + DNK | 3315 | Kobenhavn | DNK | Danish | t | 93.5 + DOM | 587 | Santo Domingo de Guzman | DOM | Spanish | t | 98 + DZA | 35 | Alger | DZA | Arabic | t | 86 + ECU | 594 | Quito | ECU | Spanish | t | 93 + EGY | 608 | Cairo | EGY | Arabic | t | 98.8 + ERI | 652 | Asmara | ERI | Tigrinja | t | 49.1 + ESH | 2453 | El-Aaiun | ESH | Arabic | t | 100 + ESP | 653 | Madrid | ESP | Spanish | t | 74.4 + EST | 3791 | Tallinn | EST | Estonian | t | 65.3 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Finnish | t | 92.7 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Swedish | t | 5.7 + FJI | 764 | Suva | FJI | Fijian | t | 50.8 + FLK | 763 | Stanley | FLK | English | t | 0 + FRA | 2974 | Paris | FRA | French | t | 93.6 + FRO | 901 | Torshavn | FRO | Danish | t | 0 + FRO | 901 | Torshavn | FRO | Faroese | t | 100 + GBR | 456 | London | GBR | English | t | 97.3 + GEO | 905 | Tbilisi | GEO | Georgiana | t | 71.7 + GIB | 915 | Gibraltar | GIB | English | t | 88.9 + GLP | 919 | Basse-Terre | GLP | French | t | 0 + GNB | 927 | Bissau | GNB | Portuguese | t | 8.1 + GRC | 2401 | Athenai | GRC | Greek | t | 98.5 + GRL | 917 | Nuuk | GRL | Danish | t | 12.5 + GRL | 917 | Nuuk | GRL | Greenlandic | t | 87.5 + GTM | 922 | Ciudad de Guatemala | GTM | Spanish | t | 64.7 + GUM | 921 | Agaaa | GUM | Chamorro | t | 29.6 + GUM | 921 | Agaaa | GUM | English | t | 37.5 + HKG | 937 | Victoria | HKG | English | t | 2.2 + HND | 933 | Tegucigalpa | HND | Spanish | t | 97.2 + HRV | 2409 | Zagreb | HRV | Serbo-Croatian | t | 95.9 + HTI | 929 | Port-au-Prince | HTI | French | t | 0 + HUN | 3483 | Budapest | HUN | Hungarian | t | 98.5 + IDN | 939 | Jakarta | IDN | Malay | t | 12.1 + IND | 1109 | New Delhi | IND | Hindi | t | 39.9 + IRL | 1447 | Dublin | IRL | English | t | 98.4 + IRL | 1447 | Dublin | IRL | Irish | t | 1.6 + IRN | 1380 | Teheran | IRN | Persian | t | 45.7 + IRQ | 1365 | Baghdad | IRQ | Arabic | t | 77.2 + ISL | 1449 | Reykjavik | ISL | Icelandic | t | 95.7 + ISR | 1450 | Jerusalem | ISR | Arabic | t | 18 + ISR | 1450 | Jerusalem | ISR | Hebrew | t | 63.1 + ITA | 1464 | Roma | ITA | Italian | t | 94.1 + JOR | 1786 | Amman | JOR | Arabic | t | 97.9 + JPN | 1532 | Tokyo | JPN | Japanese | t | 99.1 + KAZ | 1864 | Astana | KAZ | Kazakh | t | 46 + KGZ | 2253 | Bishkek | KGZ | Kirgiz | t | 59.7 + KGZ | 2253 | Bishkek | KGZ | Russian | t | 16.2 + KHM | 1800 | Phnom Penh | KHM | Khmer | t | 88.6 + KIR | 2256 | Bairiki | KIR | Kiribati | t | 98.9 + KNA | 3064 | Basseterre | KNA | English | t | 0 + KOR | 2331 | Seoul | KOR | Korean | t | 99.9 + KWT | 2429 | Kuwait | KWT | Arabic | t | 78.1 + LAO | 2432 | Vientiane | LAO | Lao | t | 67.2 + LBN | 2438 | Beirut | LBN | Arabic | t | 93 + LBY | 2441 | Tripoli | LBY | Arabic | t | 96 + LCA | 3065 | Castries | LCA | English | t | 20 + LIE | 2446 | Vaduz | LIE | German | t | 89 + LKA | 3217 | Colombo | LKA | Singali | t | 60.3 + LKA | 3217 | Colombo | LKA | Tamil | t | 19.6 + LSO | 2437 | Maseru | LSO | English | t | 0 + LSO | 2437 | Maseru | LSO | Sotho | t | 85 + LTU | 2447 | Vilnius | LTU | Lithuanian | t | 81.6 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | French | t | 4.2 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | German | t | 2.3 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | Luxembourgish | t | 64.4 + LVA | 2434 | Riga | LVA | Latvian | t | 55.1 + MAC | 2454 | Macao | MAC | Portuguese | t | 2.3 + MAR | 2486 | Rabat | MAR | Arabic | t | 65 + MCO | 2695 | Monaco-Ville | MCO | French | t | 41.9 + MDA | 2690 | Chisinau | MDA | Romanian | t | 61.9 + MDG | 2455 | Antananarivo | MDG | French | t | 0 + MDG | 2455 | Antananarivo | MDG | Malagasy | t | 98.9 + MDV | 2463 | Male | MDV | Dhivehi | t | 100 + MEX | 2515 | Ciudad de Mexico | MEX | Spanish | t | 92.1 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | English | t | 0 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | Marshallese | t | 96.8 + MKD | 2460 | Skopje | MKD | Macedonian | t | 66.5 + MLT | 2484 | Valletta | MLT | English | t | 2.1 + MLT | 2484 | Valletta | MLT | Maltese | t | 95.8 + MMR | 2710 | Rangoon (Yangon) | MMR | Burmese | t | 69 + MNG | 2696 | Ulan Bator | MNG | Mongolian | t | 78.8 + MNP | 2913 | Garapan | MNP | English | t | 4.8 + MSR | 2697 | Plymouth | MSR | English | t | 0 + MTQ | 2508 | Fort-de-France | MTQ | French | t | 0 + MWI | 2462 | Lilongwe | MWI | Chichewa | t | 58.3 + MYS | 2464 | Kuala Lumpur | MYS | Malay | t | 58.4 + MYT | 2514 | Mamoutzou | MYT | French | t | 20.3 + NCL | 3493 | Noumea | NCL | French | t | 34.3 + NFK | 2806 | Kingston | NFK | English | t | 0 + NIC | 2734 | Managua | NIC | Spanish | t | 97.6 + NIU | 2805 | Alofi | NIU | English | t | 0 + NLD | 5 | Amsterdam | NLD | Dutch | t | 95.6 + NOR | 2807 | Oslo | NOR | Norwegian | t | 96.6 + NPL | 2729 | Kathmandu | NPL | Nepali | t | 50.4 + NRU | 2728 | Yaren | NRU | English | t | 7.5 + NRU | 2728 | Yaren | NRU | Nauru | t | 57.5 + NZL | 3499 | Wellington | NZL | English | t | 87 + OMN | 2821 | Masqat | OMN | Arabic | t | 76.7 + PAK | 2831 | Islamabad | PAK | Urdu | t | 7.6 + PAN | 2882 | Ciudad de Panama | PAN | Spanish | t | 76.8 + PER | 2890 | Lima | PER | Aimara | t | 2.3 + PER | 2890 | Lima | PER | Ketdua | t | 16.4 + PER | 2890 | Lima | PER | Spanish | t | 79.8 + PHL | 766 | Manila | PHL | Pilipino | t | 29.3 + PLW | 2881 | Koror | PLW | English | t | 3.2 + PLW | 2881 | Koror | PLW | Palau | t | 82.2 + POL | 2928 | Warszawa | POL | Polish | t | 97.6 + PRI | 2919 | San Juan | PRI | Spanish | t | 51.3 + PRK | 2318 | Pyongyang | PRK | Korean | t | 99.9 + PRT | 2914 | Lisboa | PRT | Portuguese | t | 99 + PRY | 2885 | Asuncion | PRY | Guarani | t | 40.1 + PRY | 2885 | Asuncion | PRY | Spanish | t | 55.1 + PYF | 3016 | Papeete | PYF | French | t | 40.8 + QAT | 2973 | Doha | QAT | Arabic | t | 40.7 + ROM | 3018 | Bucuresti | ROM | Romani | t | 0.7 + ROM | 3018 | Bucuresti | ROM | Romanian | t | 90.7 + RUS | 3580 | Moscow | RUS | Russian | t | 86.6 + RWA | 3047 | Kigali | RWA | French | t | 0 + RWA | 3047 | Kigali | RWA | Rwanda | t | 100 + SAU | 3173 | Riyadh | SAU | Arabic | t | 95 + SDN | 3225 | Khartum | SDN | Arabic | t | 49.4 + SEN | 3198 | Dakar | SEN | Wolof | t | 48.1 + SGP | 3208 | Singapore | SGP | Chinese | t | 77.1 + SGP | 3208 | Singapore | SGP | Malay | t | 14.1 + SGP | 3208 | Singapore | SGP | Tamil | t | 7.4 + SHN | 3063 | Jamestown | SHN | English | t | 0 + SJM | 938 | Longyearbyen | SJM | Norwegian | t | 0 + SLV | 645 | San Salvador | SLV | Spanish | t | 100 + SMR | 3171 | San Marino | SMR | Italian | t | 100 + SOM | 3214 | Mogadishu | SOM | Arabic | t | 0 + SOM | 3214 | Mogadishu | SOM | Somali | t | 98.3 + SPM | 3067 | Saint-Pierre | SPM | French | t | 0 + SVK | 3209 | Bratislava | SVK | Slovak | t | 85.6 + SVN | 3212 | Ljubljana | SVN | Slovene | t | 87.9 + SWE | 3048 | Stockholm | SWE | Swedish | t | 89.5 + SWZ | 3244 | Mbabane | SWZ | Swazi | t | 89.9 + SYC | 3206 | Victoria | SYC | English | t | 3.8 + SYC | 3206 | Victoria | SYC | French | t | 1.3 + SYR | 3250 | Damascus | SYR | Arabic | t | 90 + TCA | 3423 | Cockburn Town | TCA | English | t | 0 + TCD | 3337 | NDjamena | TCD | Arabic | t | 12.3 + TGO | 3332 | Lome | TGO | Ewe | t | 23.2 + TGO | 3332 | Lome | TGO | Kabye | t | 13.8 + THA | 3320 | Bangkok | THA | Thai | t | 52.6 + TJK | 3261 | Dushanbe | TJK | Tadzhik | t | 62.2 + TKL | 3333 | Fakaofo | TKL | English | t | 0 + TKM | 3419 | Ashgabat | TKM | Turkmenian | t | 76.7 + TMP | 1522 | Dili | TMP | Portuguese | t | 0 + TON | 3334 | Nukualofa | TON | English | t | 0 + TON | 3334 | Nukualofa | TON | Tongan | t | 98.3 + TUN | 3349 | Tunis | TUN | Arabic | t | 69.9 + TUR | 3358 | Ankara | TUR | Turkish | t | 87.6 + TUV | 3424 | Funafuti | TUV | English | t | 0 + TUV | 3424 | Funafuti | TUV | Tuvalu | t | 92.5 + TWN | 3263 | Taipei | TWN | Mandarin Chinese | t | 20.1 + TZA | 3306 | Dodoma | TZA | Swahili | t | 8.8 + UKR | 3426 | Kyiv | UKR | Ukrainian | t | 64.7 + URY | 3492 | Montevideo | URY | Spanish | t | 95.7 + USA | 3813 | Washington | USA | English | t | 86.2 + UZB | 3503 | Toskent | UZB | Uzbek | t | 72.6 + VAT | 3538 | Citta del Vaticano | VAT | Italian | t | 0 + VCT | 3066 | Kingstown | VCT | English | t | 0 + VEN | 3539 | Caracas | VEN | Spanish | t | 96.9 + VGB | 537 | Road Town | VGB | English | t | 0 + VIR | 4067 | Charlotte Amalie | VIR | English | t | 81.7 + VNM | 3770 | Hanoi | VNM | Vietnamese | t | 86.8 + VUT | 3537 | Port-Vila | VUT | Bislama | t | 56.6 + VUT | 3537 | Port-Vila | VUT | English | t | 28.3 + VUT | 3537 | Port-Vila | VUT | French | t | 14.2 + WSM | 3169 | Apia | WSM | English | t | 0.6 + WSM | 3169 | Apia | WSM | Samoan | t | 47.5 + YEM | 1780 | Sanaa | YEM | Arabic | t | 99.6 + YUG | 1792 | Beograd | YUG | Serbo-Croatian | t | 75.2 + ZAF | 716 | Pretoria | ZAF | Afrikaans | t | 14.3 + ZAF | 716 | Pretoria | ZAF | English | t | 8.5 + ZAF | 716 | Pretoria | ZAF | Xhosa | t | 17.7 + ZAF | 716 | Pretoria | ZAF | Zulu | t | 22.7 + ZWE | 4068 | Harare | ZWE | English | t | 2.2 +(237 rows) + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + lang_count | code | name | continent | region | population +------------+------+---------------------------------+-----------+-----------------+------------ + 12 | RUS | Russian Federation | Europe | Eastern Europe | 146934000 + 6 | FSM | Micronesia, Federated States of | Oceania | Micronesia | 119000 + 4 | AZE | Azerbaijan | Asia | Middle East | 7734000 + 1 | BIH | Bosnia and Herzegovina | Europe | Southern Europe | 3972000 +(4 rows) + +-- Using CTE in the WHERE clause +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + name | name | cnt +--------------------+------------------+----- + Australia | Canberra | 8 + Austria | Wien | 8 + Canada | Ottawa | 12 + China | Peking | 12 + Denmark | Kobenhavn | 7 + India | New Delhi | 12 + Iran | Teheran | 10 + Italy | Roma | 8 + Myanmar | Rangoon (Yangon) | 8 + Russian Federation | Moscow | 12 + South Africa | Pretoria | 11 + United States | Washington | 12 +(12 rows) + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + UNION ALL + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' +UNION ALL +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + code | country | capital | headofstate | compared_with_cheap_asian_cnt +------+----------------------------------+-------------------------+-----------------------------------+------------------------------- + ATG | Antigua and Barbuda | Saint Johns | Elisabeth II | 2 + ARG | Argentina | Buenos Aires | Fernando de la Rua | 3 + ABW | Aruba | Oranjestad | Beatrix | 4 + BHS | Bahamas | Nassau | Elisabeth II | 2 + BRB | Barbados | Bridgetown | Elisabeth II | 2 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + CAN | Canada | Ottawa | Elisabeth II | 12 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + CRI | Costa Rica | San Jose | Miguel Angel Rodriguez Echeverria | 4 + DMA | Dominica | Roseau | Vernon Shaw | 2 + DOM | Dominican Republic | Santo Domingo de Guzman | Hipolito Mejia Dominguez | 2 + ECU | Ecuador | Quito | Gustavo Noboa Bejarano | 2 + SLV | El Salvador | San Salvador | Francisco Guillermo Flores Perez | 2 + GUF | French Guiana | Cayenne | Jacques Chirac | 2 + GRL | Greenland | Nuuk | Margrethe II | 2 + GLP | Guadeloupe | Basse-Terre | Jacques Chirac | 2 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + GUY | Guyana | Georgetown | Bharrat Jagdeo | 3 + HTI | Haiti | Port-au-Prince | Jean-Bertrand Aristide | 2 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 + JAM | Jamaica | Kingston | Elisabeth II | 2 + MTQ | Martinique | Fort-de-France | Jacques Chirac | 2 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + ANT | Netherlands Antilles | Willemstad | Beatrix | 3 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + PER | Peru | Lima | Valentin Paniagua Corazao | 3 + PRI | Puerto Rico | San Juan | George W. Bush | 2 + KNA | Saint Kitts and Nevis | Basseterre | Elisabeth II | 2 + LCA | Saint Lucia | Castries | Elisabeth II | 2 + VCT | Saint Vincent and the Grenadines | Kingstown | Elisabeth II | 2 + SUR | Suriname | Paramaribo | Ronald Venetiaan | 2 + TTO | Trinidad and Tobago | Port-of-Spain | Arthur N. R. Robinson | 3 + USA | United States | Washington | George W. Bush | 12 + VEN | Venezuela | Caracas | Hugo Chavez Frias | 3 + VIR | Virgin Islands, U.S. | Charlotte Amalie | George W. Bush | 3 +(40 rows) + +-- query 6 + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + count +------- + 43 +(1 row) + +-- query7 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + code | country | capital | language | isofficial | percentage | code | country | capital | language | isofficial | percentage +------+------------------------+-----------------------------------+----------------+------------+------------+------+------------------------+-----------------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Tirana | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | Wien | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Russian | t | 32 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Praha | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Kobenhavn | Danish | t | 93.5 + EST | Estonia | Tallinn | Estonian | t | 65.3 | EST | Estonia | Tallinn | Estonian | t | 65.3 + FRO | Faroe Islands | Torshavn | Danish | t | 0 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FRA | France | Paris | French | t | 93.6 | FRA | France | Paris | French | t | 93.6 + DEU | Germany | Berlin | German | t | 91.3 | DEU | Germany | Berlin | German | t | 91.3 + GIB | Gibraltar | Gibraltar | English | t | 88.9 | GIB | Gibraltar | Gibraltar | English | t | 88.9 + GRC | Greece | Athenai | Greek | t | 98.5 | GRC | Greece | Athenai | Greek | t | 98.5 + HUN | Hungary | Budapest | Hungarian | t | 98.5 | HUN | Hungary | Budapest | Hungarian | t | 98.5 + ISL | Iceland | Reykjavik | Icelandic | t | 95.7 | ISL | Iceland | Reykjavik | Icelandic | t | 95.7 + IRL | Ireland | Dublin | English | t | 98.4 | IRL | Ireland | Dublin | English | t | 98.4 + IRL | Ireland | Dublin | Irish | t | 1.6 | IRL | Ireland | Dublin | English | t | 98.4 + ITA | Italy | Roma | Italian | t | 94.1 | ITA | Italy | Roma | Italian | t | 94.1 + LVA | Latvia | Riga | Latvian | t | 55.1 | LVA | Latvia | Riga | Latvian | t | 55.1 + LIE | Liechtenstein | Vaduz | German | t | 89 | LIE | Liechtenstein | Vaduz | German | t | 89 + LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 | LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | French | t | 4.2 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | German | t | 2.3 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + MKD | Macedonia | Skopje | Macedonian | t | 66.5 | MKD | Macedonia | Skopje | Macedonian | t | 66.5 + MLT | Malta | Valletta | English | t | 2.1 | MLT | Malta | Valletta | Maltese | t | 95.8 + MLT | Malta | Valletta | Maltese | t | 95.8 | MLT | Malta | Valletta | Maltese | t | 95.8 + MDA | Moldova | Chisinau | Romanian | t | 61.9 | MDA | Moldova | Chisinau | Romanian | t | 61.9 + NLD | Netherlands | Amsterdam | Dutch | t | 95.6 | NLD | Netherlands | Amsterdam | Dutch | t | 95.6 + NOR | Norway | Oslo | Norwegian | t | 96.6 | NOR | Norway | Oslo | Norwegian | t | 96.6 + POL | Poland | Warszawa | Polish | t | 97.6 | POL | Poland | Warszawa | Polish | t | 97.6 + PRT | Portugal | Lisboa | Portuguese | t | 99 | PRT | Portugal | Lisboa | Portuguese | t | 99 + ROM | Romania | Bucuresti | Romani | t | 0.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + ROM | Romania | Bucuresti | Romanian | t | 90.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + RUS | Russian Federation | Moscow | Russian | t | 86.6 | RUS | Russian Federation | Moscow | Russian | t | 86.6 + SMR | San Marino | San Marino | Italian | t | 100 | SMR | San Marino | San Marino | Italian | t | 100 + SVK | Slovakia | Bratislava | Slovak | t | 85.6 | SVK | Slovakia | Bratislava | Slovak | t | 85.6 + SVN | Slovenia | Ljubljana | Slovene | t | 87.9 | SVN | Slovenia | Ljubljana | Slovene | t | 87.9 + ESP | Spain | Madrid | Spanish | t | 74.4 | ESP | Spain | Madrid | Spanish | t | 74.4 + SWE | Sweden | Stockholm | Swedish | t | 89.5 | SWE | Sweden | Stockholm | Swedish | t | 89.5 + CHE | Switzerland | Bern | French | t | 19.2 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | German | t | 63.6 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Italian | t | 7.7 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Romansh | t | 0.6 | CHE | Switzerland | Bern | German | t | 63.6 + UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 | UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 + GBR | United Kingdom | London | English | t | 97.3 | GBR | United Kingdom | London | English | t | 97.3 + YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 | YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 +(55 rows) + +-- query8 +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' +UNION ALL +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + region_city_cnt | region_lang_cnt | region +-----------------+-----------------+--------------------------- + 840 | 192 | Caribbean + 2824 | 112 | Central America + 11336 | 384 | Eastern Asia + 2664 | 396 | Middle East + 1625 | 125 | North America + 3500 | 70 | South America + 3179 | 528 | Southeast Asia + 12278 | 896 | Southern and Central Asia +(8 rows) + +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + code | name | capital | capital_city | cnt | cnt +------+--------------------+---------+------------------+-----+----- + AUS | Australia | 135 | Canberra | 8 | + AUT | Austria | 1523 | Wien | 8 | + CAN | Canada | 1822 | Ottawa | 12 | + CHN | China | 1891 | Peking | 12 | + DNK | Denmark | 3315 | Kobenhavn | 7 | + IND | India | 1109 | New Delhi | 12 | + IRN | Iran | 1380 | Teheran | 10 | + ITA | Italy | 1464 | Roma | 8 | + MMR | Myanmar | 2710 | Rangoon (Yangon) | 8 | + RUS | Russian Federation | 3580 | Moscow | 12 | + ZAF | South Africa | 716 | Pretoria | 11 | + USA | United States | 3813 | Washington | 12 | +(12 rows) + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + city_cnt | lang_cnt | name | REGION_SURFACE_AREA | REGION_LIFETIME | REGION_POP | lang_count | REGION_GNP | region +----------+----------+---------------------------------------+---------------------+------------------+------------+------------+------------+--------------------------- + 4 | 5 | Afghanistan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 3 | Albania | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 18 | 2 | Algeria | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 5 | 9 | Angola | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 2 | Antigua and Barbuda | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 57 | 3 | Argentina | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 2 | Armenia | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 14 | 8 | Australia | 62471162.00 | 78.8000030517578 | 22753100 | 11 | 405851.00 | Australia and New Zealand + 6 | 8 | Austria | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 4 | 4 | Azerbaijan | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 1 | 2 | Bahamas | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 1 | 2 | Bahrain | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 24 | 7 | Bangladesh | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 2 | Barbados | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 16 | 4 | Belarus | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 9 | 6 | Belgium | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 2 | 4 | Belize | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 4 | 7 | Benin | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Bhutan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 8 | 4 | Bolivia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 1 | Bosnia and Herzegovina | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 2 | 5 | Botswana | 23060186.00 | 44.8199996948242 | 46886000 | 21 | 126931.00 | Southern Africa + 250 | 5 | Brazil | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 4 | Brunei | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 10 | 4 | Bulgaria | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 3 | 6 | Burkina Faso | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Burundi | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 3 | 4 | Cambodia | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 7 | 8 | Cameroon | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 49 | 12 | Canada | 236342035.00 | 75.8199996948242 | 309632000 | 18 | 9111890.00 | North America + 1 | 2 | Cape Verde | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 6 | Central African Republic | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 2 | 8 | Chad | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 29 | 4 | Chile | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 38 | 5 | Colombia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 5 | Comoros | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 2 | 6 | Congo | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 4 | Costa Rica | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 5 | 5 | Cote deIvoire | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 4 | 2 | Croatia | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 14 | 1 | Cuba | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 2 | 2 | Cyprus | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 10 | 8 | Czech Republic | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 1 | 3 | Djibouti | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 1 | 2 | Dominica | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 6 | 2 | Dominican Republic | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 15 | 2 | Ecuador | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 37 | 2 | Egypt | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 7 | 2 | El Salvador | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America +(50 rows) + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + city_cnt | lang_cnt | identifier +----------+----------+--------------------------- + 494 | 10 | British Islands + 159 | 48 | Baltic Countries + 1295 | 161 | Nordic Countries + 50176 | 264 | Eastern Asia + 9414 | 369 | Western Europe + 11880 | 450 | Southern Europe + 32900 | 610 | Eastern Europe + 29161 | 616 | Southeast Asia + 8568 | 792 | Middle East + 80388 | 1092 | Southern and Central Asia +(10 rows) + +-- queries with CTEs on AO tables +DROP TABLE IF EXISTS CITY_AO; +NOTICE: table "city_ao" does not exist, skipping +CREATE TABLE CITY_AO ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +) with (appendonly=true) ; +DROP TABLE IF EXISTS country_ao; +NOTICE: table "country_ao" does not exist, skipping +CREATE TABLE country_ao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea numeric(10,2) NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +) with (appendonly=true); +DROP TABLE IF EXISTS countrylanguage_ao; +NOTICE: table "countrylanguage_ao" does not exist, skipping +CREATE TABLE countrylanguage_ao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +) with (appendonly=true); +create index bitmap_city_ao_countrycode on city_ao using bitmap(countrycode); +create index bitmap_country_ao_gf on country_ao using bitmap(governmentform); +create index bitmap_country_ao_region on country_ao using bitmap(region); +create index bitmap_country_ao_continent on country_ao using bitmap(continent); +create index bitmap_countrylanguage_ao_countrycode on countrylanguage_ao using bitmap(countrycode); +INSERT INTO CITY_AO SELECT * FROM CITY; +INSERT INTO COUNTRY_AO SELECT * FROM COUNTRY; +INSERT INTO COUNTRYLANGUAGE_AO SELECT * FROM COUNTRYLANGUAGE; +ANALYZE CITY_AO; +ANALYZE COUNTRY_AO; +ANALYZE COUNTRYLANGUAGE_AO; +set enable_seqscan=off; +set enable_indexscan=on; +--query1 +with capitals as +(select country_ao.code,id,city_ao.name from city_ao,country_ao + where city_ao.countrycode = country_ao.code AND city_ao.id = country_ao.capital) +select * from +capitals,countrylanguage_ao +where capitals.code = countrylanguage_ao.countrycode and isofficial='true' +order by capitals.code,countrylanguage_ao.language; + code | id | name | countrycode | language | isofficial | percentage +------+------+-----------------------------------+-------------+------------------+------------+------------ + ABW | 129 | Oranjestad | ABW | Dutch | t | 5.3 + AFG | 1 | Kabul | AFG | Dari | t | 32.1 + AFG | 1 | Kabul | AFG | Pashto | t | 52.4 + AIA | 62 | The Valley | AIA | English | t | 0 + ALB | 34 | Tirana | ALB | Albaniana | t | 97.9 + AND | 55 | Andorra la Vella | AND | Catalan | t | 32.3 + ANT | 33 | Willemstad | ANT | Dutch | t | 0 + ANT | 33 | Willemstad | ANT | Papiamento | t | 86.2 + ARE | 65 | Abu Dhabi | ARE | Arabic | t | 42 + ARG | 69 | Buenos Aires | ARG | Spanish | t | 96.8 + ARM | 126 | Yerevan | ARM | Armenian | t | 93.4 + ASM | 54 | Fagatogo | ASM | English | t | 3.1 + ASM | 54 | Fagatogo | ASM | Samoan | t | 90.6 + ATG | 63 | Saint Johns | ATG | English | t | 0 + AUS | 135 | Canberra | AUS | English | t | 81.2 + AUT | 1523 | Wien | AUT | German | t | 92 + AZE | 144 | Baku | AZE | Azerbaijani | t | 89 + BDI | 552 | Bujumbura | BDI | French | t | 0 + BDI | 552 | Bujumbura | BDI | Kirundi | t | 98.1 + BEL | 179 | Bruxelles [Brussel] | BEL | Dutch | t | 59.2 + BEL | 179 | Bruxelles [Brussel] | BEL | French | t | 32.6 + BEL | 179 | Bruxelles [Brussel] | BEL | German | t | 1 + BGD | 150 | Dhaka | BGD | Bengali | t | 97.7 + BGR | 539 | Sofija | BGR | Bulgariana | t | 83.2 + BHR | 149 | al-Manama | BHR | Arabic | t | 67.7 + BIH | 201 | Sarajevo | BIH | Serbo-Croatian | t | 99.2 + BLR | 3520 | Minsk | BLR | Belorussian | t | 65.6 + BLR | 3520 | Minsk | BLR | Russian | t | 32 + BLZ | 185 | Belmopan | BLZ | English | t | 50.8 + BMU | 191 | Hamilton | BMU | English | t | 100 + BOL | 194 | La Paz | BOL | Aimara | t | 3.2 + BOL | 194 | La Paz | BOL | Ketdua | t | 8.1 + BOL | 194 | La Paz | BOL | Spanish | t | 87.7 + BRA | 211 | Brasilia | BRA | Portuguese | t | 97.5 + BRB | 174 | Bridgetown | BRB | English | t | 0 + BRN | 538 | Bandar Seri Begawan | BRN | Malay | t | 45.5 + BTN | 192 | Thimphu | BTN | Dzongkha | t | 50 + CAN | 1822 | Ottawa | CAN | English | t | 60.4 + CAN | 1822 | Ottawa | CAN | French | t | 23.4 + CCK | 2317 | West Island | CCK | English | t | 0 + CHE | 3248 | Bern | CHE | French | t | 19.2 + CHE | 3248 | Bern | CHE | German | t | 63.6 + CHE | 3248 | Bern | CHE | Italian | t | 7.7 + CHE | 3248 | Bern | CHE | Romansh | t | 0.6 + CHL | 554 | Santiago de Chile | CHL | Spanish | t | 89.7 + CHN | 1891 | Peking | CHN | Chinese | t | 92 + COK | 583 | Avarua | COK | Maori | t | 0 + COL | 2257 | Santafe de Bogota | COL | Spanish | t | 99 + COM | 2295 | Moroni | COM | Comorian | t | 75 + CPV | 1859 | Praia | CPV | Portuguese | t | 0 + CRI | 584 | San Jose | CRI | Spanish | t | 97.5 + CUB | 2413 | La Habana | CUB | Spanish | t | 100 + CXR | 1791 | Flying Fish Cove | CXR | English | t | 0 + CYM | 553 | George Town | CYM | English | t | 0 + CYP | 2430 | Nicosia | CYP | Greek | t | 74.1 + CYP | 2430 | Nicosia | CYP | Turkish | t | 22.4 + CZE | 3339 | Praha | CZE | Czech | t | 81.2 + DEU | 3068 | Berlin | DEU | German | t | 91.3 + DJI | 585 | Djibouti | DJI | Arabic | t | 10.6 + DNK | 3315 | Kobenhavn | DNK | Danish | t | 93.5 + DOM | 587 | Santo Domingo de Guzman | DOM | Spanish | t | 98 + DZA | 35 | Alger | DZA | Arabic | t | 86 + ECU | 594 | Quito | ECU | Spanish | t | 93 + EGY | 608 | Cairo | EGY | Arabic | t | 98.8 + ERI | 652 | Asmara | ERI | Tigrinja | t | 49.1 + ESH | 2453 | El-Aaiun | ESH | Arabic | t | 100 + ESP | 653 | Madrid | ESP | Spanish | t | 74.4 + EST | 3791 | Tallinn | EST | Estonian | t | 65.3 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Finnish | t | 92.7 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Swedish | t | 5.7 + FJI | 764 | Suva | FJI | Fijian | t | 50.8 + FLK | 763 | Stanley | FLK | English | t | 0 + FRA | 2974 | Paris | FRA | French | t | 93.6 + FRO | 901 | Torshavn | FRO | Danish | t | 0 + FRO | 901 | Torshavn | FRO | Faroese | t | 100 + GBR | 456 | London | GBR | English | t | 97.3 + GEO | 905 | Tbilisi | GEO | Georgiana | t | 71.7 + GIB | 915 | Gibraltar | GIB | English | t | 88.9 + GLP | 919 | Basse-Terre | GLP | French | t | 0 + GNB | 927 | Bissau | GNB | Portuguese | t | 8.1 + GRC | 2401 | Athenai | GRC | Greek | t | 98.5 + GRL | 917 | Nuuk | GRL | Danish | t | 12.5 + GRL | 917 | Nuuk | GRL | Greenlandic | t | 87.5 + GTM | 922 | Ciudad de Guatemala | GTM | Spanish | t | 64.7 + GUM | 921 | Agaaa | GUM | Chamorro | t | 29.6 + GUM | 921 | Agaaa | GUM | English | t | 37.5 + HKG | 937 | Victoria | HKG | English | t | 2.2 + HND | 933 | Tegucigalpa | HND | Spanish | t | 97.2 + HRV | 2409 | Zagreb | HRV | Serbo-Croatian | t | 95.9 + HTI | 929 | Port-au-Prince | HTI | French | t | 0 + HUN | 3483 | Budapest | HUN | Hungarian | t | 98.5 + IDN | 939 | Jakarta | IDN | Malay | t | 12.1 + IND | 1109 | New Delhi | IND | Hindi | t | 39.9 + IRL | 1447 | Dublin | IRL | English | t | 98.4 + IRL | 1447 | Dublin | IRL | Irish | t | 1.6 + IRN | 1380 | Teheran | IRN | Persian | t | 45.7 + IRQ | 1365 | Baghdad | IRQ | Arabic | t | 77.2 + ISL | 1449 | Reykjavik | ISL | Icelandic | t | 95.7 + ISR | 1450 | Jerusalem | ISR | Arabic | t | 18 + ISR | 1450 | Jerusalem | ISR | Hebrew | t | 63.1 + ITA | 1464 | Roma | ITA | Italian | t | 94.1 + JOR | 1786 | Amman | JOR | Arabic | t | 97.9 + JPN | 1532 | Tokyo | JPN | Japanese | t | 99.1 + KAZ | 1864 | Astana | KAZ | Kazakh | t | 46 + KGZ | 2253 | Bishkek | KGZ | Kirgiz | t | 59.7 + KGZ | 2253 | Bishkek | KGZ | Russian | t | 16.2 + KHM | 1800 | Phnom Penh | KHM | Khmer | t | 88.6 + KIR | 2256 | Bairiki | KIR | Kiribati | t | 98.9 + KNA | 3064 | Basseterre | KNA | English | t | 0 + KOR | 2331 | Seoul | KOR | Korean | t | 99.9 + KWT | 2429 | Kuwait | KWT | Arabic | t | 78.1 + LAO | 2432 | Vientiane | LAO | Lao | t | 67.2 + LBN | 2438 | Beirut | LBN | Arabic | t | 93 + LBY | 2441 | Tripoli | LBY | Arabic | t | 96 + LCA | 3065 | Castries | LCA | English | t | 20 + LIE | 2446 | Vaduz | LIE | German | t | 89 + LKA | 3217 | Colombo | LKA | Singali | t | 60.3 + LKA | 3217 | Colombo | LKA | Tamil | t | 19.6 + LSO | 2437 | Maseru | LSO | English | t | 0 + LSO | 2437 | Maseru | LSO | Sotho | t | 85 + LTU | 2447 | Vilnius | LTU | Lithuanian | t | 81.6 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | French | t | 4.2 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | German | t | 2.3 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | Luxembourgish | t | 64.4 + LVA | 2434 | Riga | LVA | Latvian | t | 55.1 + MAC | 2454 | Macao | MAC | Portuguese | t | 2.3 + MAR | 2486 | Rabat | MAR | Arabic | t | 65 + MCO | 2695 | Monaco-Ville | MCO | French | t | 41.9 + MDA | 2690 | Chisinau | MDA | Romanian | t | 61.9 + MDG | 2455 | Antananarivo | MDG | French | t | 0 + MDG | 2455 | Antananarivo | MDG | Malagasy | t | 98.9 + MDV | 2463 | Male | MDV | Dhivehi | t | 100 + MEX | 2515 | Ciudad de Mexico | MEX | Spanish | t | 92.1 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | English | t | 0 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | Marshallese | t | 96.8 + MKD | 2460 | Skopje | MKD | Macedonian | t | 66.5 + MLT | 2484 | Valletta | MLT | English | t | 2.1 + MLT | 2484 | Valletta | MLT | Maltese | t | 95.8 + MMR | 2710 | Rangoon (Yangon) | MMR | Burmese | t | 69 + MNG | 2696 | Ulan Bator | MNG | Mongolian | t | 78.8 + MNP | 2913 | Garapan | MNP | English | t | 4.8 + MSR | 2697 | Plymouth | MSR | English | t | 0 + MTQ | 2508 | Fort-de-France | MTQ | French | t | 0 + MWI | 2462 | Lilongwe | MWI | Chichewa | t | 58.3 + MYS | 2464 | Kuala Lumpur | MYS | Malay | t | 58.4 + MYT | 2514 | Mamoutzou | MYT | French | t | 20.3 + NCL | 3493 | Noumea | NCL | French | t | 34.3 + NFK | 2806 | Kingston | NFK | English | t | 0 + NIC | 2734 | Managua | NIC | Spanish | t | 97.6 + NIU | 2805 | Alofi | NIU | English | t | 0 + NLD | 5 | Amsterdam | NLD | Dutch | t | 95.6 + NOR | 2807 | Oslo | NOR | Norwegian | t | 96.6 + NPL | 2729 | Kathmandu | NPL | Nepali | t | 50.4 + NRU | 2728 | Yaren | NRU | English | t | 7.5 + NRU | 2728 | Yaren | NRU | Nauru | t | 57.5 + NZL | 3499 | Wellington | NZL | English | t | 87 + OMN | 2821 | Masqat | OMN | Arabic | t | 76.7 + PAK | 2831 | Islamabad | PAK | Urdu | t | 7.6 + PAN | 2882 | Ciudad de Panama | PAN | Spanish | t | 76.8 + PER | 2890 | Lima | PER | Aimara | t | 2.3 + PER | 2890 | Lima | PER | Ketdua | t | 16.4 + PER | 2890 | Lima | PER | Spanish | t | 79.8 + PHL | 766 | Manila | PHL | Pilipino | t | 29.3 + PLW | 2881 | Koror | PLW | English | t | 3.2 + PLW | 2881 | Koror | PLW | Palau | t | 82.2 + POL | 2928 | Warszawa | POL | Polish | t | 97.6 + PRI | 2919 | San Juan | PRI | Spanish | t | 51.3 + PRK | 2318 | Pyongyang | PRK | Korean | t | 99.9 + PRT | 2914 | Lisboa | PRT | Portuguese | t | 99 + PRY | 2885 | Asuncion | PRY | Guarani | t | 40.1 + PRY | 2885 | Asuncion | PRY | Spanish | t | 55.1 + PYF | 3016 | Papeete | PYF | French | t | 40.8 + QAT | 2973 | Doha | QAT | Arabic | t | 40.7 + ROM | 3018 | Bucuresti | ROM | Romani | t | 0.7 + ROM | 3018 | Bucuresti | ROM | Romanian | t | 90.7 + RUS | 3580 | Moscow | RUS | Russian | t | 86.6 + RWA | 3047 | Kigali | RWA | French | t | 0 + RWA | 3047 | Kigali | RWA | Rwanda | t | 100 + SAU | 3173 | Riyadh | SAU | Arabic | t | 95 + SDN | 3225 | Khartum | SDN | Arabic | t | 49.4 + SEN | 3198 | Dakar | SEN | Wolof | t | 48.1 + SGP | 3208 | Singapore | SGP | Chinese | t | 77.1 + SGP | 3208 | Singapore | SGP | Malay | t | 14.1 + SGP | 3208 | Singapore | SGP | Tamil | t | 7.4 + SHN | 3063 | Jamestown | SHN | English | t | 0 + SJM | 938 | Longyearbyen | SJM | Norwegian | t | 0 + SLV | 645 | San Salvador | SLV | Spanish | t | 100 + SMR | 3171 | San Marino | SMR | Italian | t | 100 + SOM | 3214 | Mogadishu | SOM | Arabic | t | 0 + SOM | 3214 | Mogadishu | SOM | Somali | t | 98.3 + SPM | 3067 | Saint-Pierre | SPM | French | t | 0 + SVK | 3209 | Bratislava | SVK | Slovak | t | 85.6 + SVN | 3212 | Ljubljana | SVN | Slovene | t | 87.9 + SWE | 3048 | Stockholm | SWE | Swedish | t | 89.5 + SWZ | 3244 | Mbabane | SWZ | Swazi | t | 89.9 + SYC | 3206 | Victoria | SYC | English | t | 3.8 + SYC | 3206 | Victoria | SYC | French | t | 1.3 + SYR | 3250 | Damascus | SYR | Arabic | t | 90 + TCA | 3423 | Cockburn Town | TCA | English | t | 0 + TCD | 3337 | NDjamena | TCD | Arabic | t | 12.3 + TGO | 3332 | Lome | TGO | Ewe | t | 23.2 + TGO | 3332 | Lome | TGO | Kabye | t | 13.8 + THA | 3320 | Bangkok | THA | Thai | t | 52.6 + TJK | 3261 | Dushanbe | TJK | Tadzhik | t | 62.2 + TKL | 3333 | Fakaofo | TKL | English | t | 0 + TKM | 3419 | Ashgabat | TKM | Turkmenian | t | 76.7 + TMP | 1522 | Dili | TMP | Portuguese | t | 0 + TON | 3334 | Nukualofa | TON | English | t | 0 + TON | 3334 | Nukualofa | TON | Tongan | t | 98.3 + TUN | 3349 | Tunis | TUN | Arabic | t | 69.9 + TUR | 3358 | Ankara | TUR | Turkish | t | 87.6 + TUV | 3424 | Funafuti | TUV | English | t | 0 + TUV | 3424 | Funafuti | TUV | Tuvalu | t | 92.5 + TWN | 3263 | Taipei | TWN | Mandarin Chinese | t | 20.1 + TZA | 3306 | Dodoma | TZA | Swahili | t | 8.8 + UKR | 3426 | Kyiv | UKR | Ukrainian | t | 64.7 + URY | 3492 | Montevideo | URY | Spanish | t | 95.7 + USA | 3813 | Washington | USA | English | t | 86.2 + UZB | 3503 | Toskent | UZB | Uzbek | t | 72.6 + VAT | 3538 | Citta del Vaticano | VAT | Italian | t | 0 + VCT | 3066 | Kingstown | VCT | English | t | 0 + VEN | 3539 | Caracas | VEN | Spanish | t | 96.9 + VGB | 537 | Road Town | VGB | English | t | 0 + VIR | 4067 | Charlotte Amalie | VIR | English | t | 81.7 + VNM | 3770 | Hanoi | VNM | Vietnamese | t | 86.8 + VUT | 3537 | Port-Vila | VUT | Bislama | t | 56.6 + VUT | 3537 | Port-Vila | VUT | English | t | 28.3 + VUT | 3537 | Port-Vila | VUT | French | t | 14.2 + WSM | 3169 | Apia | WSM | English | t | 0.6 + WSM | 3169 | Apia | WSM | Samoan | t | 47.5 + YEM | 1780 | Sanaa | YEM | Arabic | t | 99.6 + YUG | 1792 | Beograd | YUG | Serbo-Croatian | t | 75.2 + ZAF | 716 | Pretoria | ZAF | Afrikaans | t | 14.3 + ZAF | 716 | Pretoria | ZAF | English | t | 8.5 + ZAF | 716 | Pretoria | ZAF | Xhosa | t | 17.7 + ZAF | 716 | Pretoria | ZAF | Zulu | t | 22.7 + ZWE | 4068 | Harare | ZWE | English | t | 2.2 +(237 rows) + +--query2 +with lang_total as +( select count(*) as lang_count,country_ao.code,countrylanguage_ao.countrycode + from country_ao join countrylanguage_ao on (country_ao.code=countrylanguage_ao.countrycode and governmentform='Federal Republic') + group by country_ao.code,countrylanguage_ao.countrycode order by country_ao.code) + +select lang_count,country_ao.code,country_ao.name,country_ao.continent,country_ao.region,country_ao.population + from country_ao left outer join lang_total + on (lang_total.code = country_ao.code) + where country_ao.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + lang_count | code | name | continent | region | population +------------+------+---------------------------------+-----------+-----------------+------------ + 12 | RUS | Russian Federation | Europe | Eastern Europe | 146934000 + 6 | FSM | Micronesia, Federated States of | Oceania | Micronesia | 119000 + 4 | AZE | Azerbaijan | Asia | Middle East | 7734000 + 1 | BIH | Bosnia and Herzegovina | Europe | Southern Europe | 3972000 +(4 rows) + +-- Using CTE in the WHERE clause +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country_ao.code,countrylanguage_ao.countrycode + from country_ao join countrylanguage_ao on (country_ao.code=countrylanguage_ao.countrycode and governmentform='Federal Republic') + group by country_ao.code,countrylanguage_ao.countrycode order by country_ao.code) + + UNION ALL + + ( + select count(*) as lang_count,country_ao.code,countrylanguage_ao.countrycode + from country_ao join countrylanguage_ao on (country_ao.code=countrylanguage_ao.countrycode and governmentform='Monarchy') + group by country_ao.code,countrylanguage_ao.countrycode order by country_ao.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country_ao.code,country_ao.name +from +country_ao,countrylanguage_ao +where country_ao.code=countrylanguage_ao.countrycode group by country_ao.code,country_ao.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +--query4 +with diversecountries as +(select country_ao.code,country_ao.name,country_ao.capital,d.CNT + from country_ao, + (select countrylanguage_ao.countrycode,count(*) as CNT from countrylanguage_ao group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country_ao.code and country_ao.gnp > 100000) + select diversecountries.name,city_ao.name,diversecountries.CNT + from diversecountries,city_ao where city_ao.id = diversecountries.capital + order by diversecountries.name; + name | name | cnt +--------------------+------------------+----- + Australia | Canberra | 8 + Austria | Wien | 8 + Canada | Ottawa | 12 + China | Peking | 12 + Denmark | Kobenhavn | 7 + India | New Delhi | 12 + Iran | Teheran | 10 + Italy | Roma | 8 + Myanmar | Rangoon (Yangon) | 8 + Russian Federation | Moscow | 12 + South Africa | Pretoria | 11 + United States | Washington | 12 +(12 rows) + +-- some queries with merge joins and index scans +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY_AO,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate + from country_ao,city_ao + where country_ao.capital = city_ao.id + and country_ao.gnp < 10000 + and country_ao.region = 'Southeast Asia' + and country_ao.continent = 'Asia' + + UNION ALL + select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate + from country_ao,city_ao + where country_ao.capital = city_ao.id + and country_ao.gnp < 10000 + and country_ao.region = 'Eastern Asia' + and country_ao.continent = 'Asia' + UNION ALL + select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate + from country_ao,city_ao + where country_ao.capital = city_ao.id + and country_ao.gnp < 10000 + and country_ao.region = 'Middle East' + and country_ao.continent = 'Asia' + ) FOO, countrylanguage_ao + where FOO.code = countrylanguage_ao.countrycode + group by FOO.code,FOO.COUNTRY_AO,FOO.CAPITAL,FOO.headofstate,countrylanguage_ao.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country_ao.code from countrylanguage_ao,country_ao + where countrylanguage_ao.countrycode=country_ao.code + and country_ao.continent = 'Asia' + and country_ao.region = 'Southern and Central Asia' + group by country_ao.code + ) FOO1 + ) +) +select FOO.code,FOO.COUNTRY_AO,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate +from country_ao,city_ao +where country_ao.capital = city_ao.id +and country_ao.continent = 'North America' +UNION ALL +select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate +from country_ao,city_ao +where country_ao.capital = city_ao.id +and country_ao.continent = 'South America' +) FOO,countrylanguage_ao +where FOO.code = countrylanguage_ao.countrycode +group by FOO.code,FOO.COUNTRY_AO,FOO.CAPITAL,FOO.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country_ao + where somecheapasiandiversecountries.code = country_ao.code + and country_ao.gnp >= country_ao.gnpold + ) ASIANCOUNT + ) +order by COUNTRY_AO; + code | country_ao | capital | headofstate | compared_with_cheap_asian_cnt +------+----------------------------------+-------------------------+-----------------------------------+------------------------------- + ATG | Antigua and Barbuda | Saint Johns | Elisabeth II | 2 + ARG | Argentina | Buenos Aires | Fernando de la Rua | 3 + ABW | Aruba | Oranjestad | Beatrix | 4 + BHS | Bahamas | Nassau | Elisabeth II | 2 + BRB | Barbados | Bridgetown | Elisabeth II | 2 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + CAN | Canada | Ottawa | Elisabeth II | 12 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + CRI | Costa Rica | San Jose | Miguel Angel Rodriguez Echeverria | 4 + DMA | Dominica | Roseau | Vernon Shaw | 2 + DOM | Dominican Republic | Santo Domingo de Guzman | Hipolito Mejia Dominguez | 2 + ECU | Ecuador | Quito | Gustavo Noboa Bejarano | 2 + SLV | El Salvador | San Salvador | Francisco Guillermo Flores Perez | 2 + GUF | French Guiana | Cayenne | Jacques Chirac | 2 + GRL | Greenland | Nuuk | Margrethe II | 2 + GLP | Guadeloupe | Basse-Terre | Jacques Chirac | 2 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + GUY | Guyana | Georgetown | Bharrat Jagdeo | 3 + HTI | Haiti | Port-au-Prince | Jean-Bertrand Aristide | 2 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 + JAM | Jamaica | Kingston | Elisabeth II | 2 + MTQ | Martinique | Fort-de-France | Jacques Chirac | 2 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + ANT | Netherlands Antilles | Willemstad | Beatrix | 3 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + PER | Peru | Lima | Valentin Paniagua Corazao | 3 + PRI | Puerto Rico | San Juan | George W. Bush | 2 + KNA | Saint Kitts and Nevis | Basseterre | Elisabeth II | 2 + LCA | Saint Lucia | Castries | Elisabeth II | 2 + VCT | Saint Vincent and the Grenadines | Kingstown | Elisabeth II | 2 + SUR | Suriname | Paramaribo | Ronald Venetiaan | 2 + TTO | Trinidad and Tobago | Port-of-Spain | Arthur N. R. Robinson | 3 + USA | United States | Washington | George W. Bush | 12 + VEN | Venezuela | Caracas | Hugo Chavez Frias | 3 + VIR | Virgin Islands, U.S. | Charlotte Amalie | George W. Bush | 3 +(40 rows) + +-- query 6 + +select count(*) from +( select r.* from + ( with fact as + ( + select country_ao.name as COUNTRY_AO,country_ao.code,city_ao.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city_ao.population >= 0.5 * country_ao.population) then country_ao.population else city_ao.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country_ao.region + from country_ao,city_ao + where governmentform != 'Constitutional Monarchy' + and country_ao.capital = city_ao.id + and indepyear > 0 + group by country_ao.region) AGG1 + ,country_ao,city_ao + where country_ao.capital = city_ao.id + and country_ao.region = AGG1.region + ) + + select code,COUNTRY_AO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_ao + where fact.code = countrylanguage_ao.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY_AO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_ao + where fact.code = countrylanguage_ao.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY_AO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_ao + where fact.code = countrylanguage_ao.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + count +------- + 43 +(1 row) + +-- query7 +with alleuropeanlanguages as +(select country_ao.code,country_ao.name COUNTRY_AO, city_ao.name CAPITAL, language, isofficial, percentage + FROM country_ao,city_ao,countrylanguage_ao + WHERE country_ao.code = countrylanguage_ao.countrycode + and country_ao.capital = city_ao.id + and country_ao.continent = 'Europe') +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY_AO,e1.language; + code | country_ao | capital | language | isofficial | percentage | code | country_ao | capital | language | isofficial | percentage +------+------------------------+-----------------------------------+----------------+------------+------------+------+------------------------+-----------------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Tirana | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | Wien | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Russian | t | 32 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Praha | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Kobenhavn | Danish | t | 93.5 + EST | Estonia | Tallinn | Estonian | t | 65.3 | EST | Estonia | Tallinn | Estonian | t | 65.3 + FRO | Faroe Islands | Torshavn | Danish | t | 0 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FRA | France | Paris | French | t | 93.6 | FRA | France | Paris | French | t | 93.6 + DEU | Germany | Berlin | German | t | 91.3 | DEU | Germany | Berlin | German | t | 91.3 + GIB | Gibraltar | Gibraltar | English | t | 88.9 | GIB | Gibraltar | Gibraltar | English | t | 88.9 + GRC | Greece | Athenai | Greek | t | 98.5 | GRC | Greece | Athenai | Greek | t | 98.5 + HUN | Hungary | Budapest | Hungarian | t | 98.5 | HUN | Hungary | Budapest | Hungarian | t | 98.5 + ISL | Iceland | Reykjavik | Icelandic | t | 95.7 | ISL | Iceland | Reykjavik | Icelandic | t | 95.7 + IRL | Ireland | Dublin | English | t | 98.4 | IRL | Ireland | Dublin | English | t | 98.4 + IRL | Ireland | Dublin | Irish | t | 1.6 | IRL | Ireland | Dublin | English | t | 98.4 + ITA | Italy | Roma | Italian | t | 94.1 | ITA | Italy | Roma | Italian | t | 94.1 + LVA | Latvia | Riga | Latvian | t | 55.1 | LVA | Latvia | Riga | Latvian | t | 55.1 + LIE | Liechtenstein | Vaduz | German | t | 89 | LIE | Liechtenstein | Vaduz | German | t | 89 + LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 | LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | French | t | 4.2 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | German | t | 2.3 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + MKD | Macedonia | Skopje | Macedonian | t | 66.5 | MKD | Macedonia | Skopje | Macedonian | t | 66.5 + MLT | Malta | Valletta | English | t | 2.1 | MLT | Malta | Valletta | Maltese | t | 95.8 + MLT | Malta | Valletta | Maltese | t | 95.8 | MLT | Malta | Valletta | Maltese | t | 95.8 + MDA | Moldova | Chisinau | Romanian | t | 61.9 | MDA | Moldova | Chisinau | Romanian | t | 61.9 + NLD | Netherlands | Amsterdam | Dutch | t | 95.6 | NLD | Netherlands | Amsterdam | Dutch | t | 95.6 + NOR | Norway | Oslo | Norwegian | t | 96.6 | NOR | Norway | Oslo | Norwegian | t | 96.6 + POL | Poland | Warszawa | Polish | t | 97.6 | POL | Poland | Warszawa | Polish | t | 97.6 + PRT | Portugal | Lisboa | Portuguese | t | 99 | PRT | Portugal | Lisboa | Portuguese | t | 99 + ROM | Romania | Bucuresti | Romani | t | 0.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + ROM | Romania | Bucuresti | Romanian | t | 90.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + RUS | Russian Federation | Moscow | Russian | t | 86.6 | RUS | Russian Federation | Moscow | Russian | t | 86.6 + SMR | San Marino | San Marino | Italian | t | 100 | SMR | San Marino | San Marino | Italian | t | 100 + SVK | Slovakia | Bratislava | Slovak | t | 85.6 | SVK | Slovakia | Bratislava | Slovak | t | 85.6 + SVN | Slovenia | Ljubljana | Slovene | t | 87.9 | SVN | Slovenia | Ljubljana | Slovene | t | 87.9 + ESP | Spain | Madrid | Spanish | t | 74.4 | ESP | Spain | Madrid | Spanish | t | 74.4 + SWE | Sweden | Stockholm | Swedish | t | 89.5 | SWE | Sweden | Stockholm | Swedish | t | 89.5 + CHE | Switzerland | Bern | French | t | 19.2 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | German | t | 63.6 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Italian | t | 7.7 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Romansh | t | 0.6 | CHE | Switzerland | Bern | German | t | 63.6 + UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 | UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 + GBR | United Kingdom | London | English | t | 97.3 | GBR | United Kingdom | London | English | t | 97.3 + YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 | YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 +(55 rows) + +-- query8 +with allcountry_aostats as +( select country_ao.code,country_ao.name,count(distinct city_ao.id) CITY_AO_CNT, + count(distinct countrylanguage_ao.language) LANG_CNT + from country_ao,city_ao,countrylanguage_ao + where country_ao.code = city_ao.countrycode + and country_ao.code = countrylanguage_ao.countrycode + group by country_ao.code,country_ao.name +) +select sum(FOO.CITY_AO_CNT) REGION_CITY_AO_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountry_aostats.code,allcountry_aostats.name COUNTRY_AO,CITY_AO_CNT,LANG_CNT,country_ao.region,city_ao.name CAPITAL +from allcountry_aostats,country_ao,city_ao +where allcountry_aostats.code = country_ao.code +and country_ao.capital = city_ao.id +and CITY_AO_CNT/LANG_CNT > 1 +and country_ao.continent = 'Asia' +UNION ALL +select allcountry_aostats.code,allcountry_aostats.name COUNTRY_AO,CITY_AO_CNT,LANG_CNT,country_ao.region,city_ao.name CAPITAL +from allcountry_aostats,country_ao,city_ao +where allcountry_aostats.code = country_ao.code +and country_ao.capital = city_ao.id +and CITY_AO_CNT/LANG_CNT > 1 +and country_ao.continent = 'North America' +UNION ALL +select allcountry_aostats.code,allcountry_aostats.name COUNTRY_AO,CITY_AO_CNT,LANG_CNT,country_ao.region,city_ao.name CAPITAL +from allcountry_aostats,country_ao,city_ao +where allcountry_aostats.code = country_ao.code +and country_ao.capital = city_ao.id +and CITY_AO_CNT/LANG_CNT > (select max(CITY_AO_CNT/LANG_CNT) from allcountry_aostats,country_ao where allcountry_aostats.code = country_ao.code AND country_ao.continent='Europe') +) FOO +,allcountry_aostats,country_ao +WHERE allcountry_aostats.code = country_ao.code +and FOO.region = country_ao.region +group by FOO.region order by FOO.region; + region_city_ao_cnt | region_lang_cnt | region +--------------------+-----------------+--------------------------- + 840 | 192 | Caribbean + 2824 | 112 | Central America + 11336 | 384 | Eastern Asia + 2664 | 396 | Middle East + 1625 | 125 | North America + 3500 | 70 | South America + 3179 | 528 | Southeast Asia + 12278 | 896 | Southern and Central Asia +(8 rows) + +-- some queries with hash joins and index scans +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; +--query 9 +with diversecountries as +(select country_ao.code,country_ao.name,country_ao.capital,d.CNT + from country_ao, + (select countrylanguage_ao.countrycode,count(*) as CNT from countrylanguage_ao group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country_ao.code and country_ao.gnp > 100000) +select d1.code,d1.name,d1.capital,city_ao.name CAPITAL_CITY_AO,d1.CNT,d2.CNT +from +diversecountries d1 left join country_ao +ON (d1.code = country_ao.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country_ao.code = d2.code AND d2.CNT > 8) +INNER JOIN city_ao +ON(d1.capital = city_ao.id) +ORDER BY d1.name; + code | name | capital | capital_city_ao | cnt | cnt +------+--------------------+---------+------------------+-----+----- + AUS | Australia | 135 | Canberra | 8 | + AUT | Austria | 1523 | Wien | 8 | + CAN | Canada | 1822 | Ottawa | 12 | + CHN | China | 1891 | Peking | 12 | + DNK | Denmark | 3315 | Kobenhavn | 7 | + IND | India | 1109 | New Delhi | 12 | + IRN | Iran | 1380 | Teheran | 10 | + ITA | Italy | 1464 | Roma | 8 | + MMR | Myanmar | 2710 | Rangoon (Yangon) | 8 | + RUS | Russian Federation | 3580 | Moscow | 12 | + ZAF | South Africa | 716 | Pretoria | 11 | + USA | United States | 3813 | Washington | 12 | +(12 rows) + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country_ao + group by region + ) FOO,countrylanguage_ao,country_ao +where + country_ao.code = countrylanguage_ao.countrycode + and FOO.region = country_ao.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country_ao + group by region + ) FOO,countrylanguage_ao,country_ao +where + country_ao.code = countrylanguage_ao.countrycode + and FOO.region = country_ao.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountry_aostats as +( select country_ao.code,country_ao.name,count(distinct city_ao.id) CITY_AO_CNT, + count(distinct countrylanguage_ao.language) LANG_CNT + from country_ao,city_ao,countrylanguage_ao + where country_ao.code = city_ao.countrycode + and country_ao.code = countrylanguage_ao.countrycode + group by country_ao.code,country_ao.name +) +select allcountry_aostats.CITY_AO_CNT,allcountry_aostats.LANG_CNT,allcountry_aostats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_aostats,country_ao +where longlivingregions.region = denseregions.region and allcountry_aostats.code = country_ao.code and country_ao.region = longlivingregions.region +and country_ao.indepyear between 1800 and 1850 +UNION ALL +select allcountry_aostats.CITY_AO_CNT,allcountry_aostats.LANG_CNT,allcountry_aostats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_aostats,country_ao +where longlivingregions.region = denseregions.region and allcountry_aostats.code = country_ao.code and country_ao.region = longlivingregions.region +and country_ao.indepyear between 1850 and 1900 +UNION ALL +select allcountry_aostats.CITY_AO_CNT,allcountry_aostats.LANG_CNT,allcountry_aostats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_aostats,country_ao +where longlivingregions.region = denseregions.region and allcountry_aostats.code = country_ao.code and country_ao.region = longlivingregions.region +and country_ao.indepyear > 1900 +order by name +LIMIT 50; + city_ao_cnt | lang_cnt | name | REGION_SURFACE_AREA | REGION_LIFETIME | REGION_POP | lang_count | REGION_GNP | region +-------------+----------+---------------------------------------+---------------------+------------------+------------+------------+------------+--------------------------- + 4 | 5 | Afghanistan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 3 | Albania | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 18 | 2 | Algeria | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 5 | 9 | Angola | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 2 | Antigua and Barbuda | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 57 | 3 | Argentina | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 2 | Armenia | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 14 | 8 | Australia | 62471162.00 | 78.8000030517578 | 22753100 | 11 | 405851.00 | Australia and New Zealand + 6 | 8 | Austria | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 4 | 4 | Azerbaijan | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 1 | 2 | Bahamas | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 1 | 2 | Bahrain | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 24 | 7 | Bangladesh | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 2 | Barbados | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 16 | 4 | Belarus | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 9 | 6 | Belgium | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 2 | 4 | Belize | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 4 | 7 | Benin | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Bhutan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 8 | 4 | Bolivia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 1 | Bosnia and Herzegovina | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 2 | 5 | Botswana | 23060186.00 | 44.8199996948242 | 46886000 | 21 | 126931.00 | Southern Africa + 250 | 5 | Brazil | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 4 | Brunei | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 10 | 4 | Bulgaria | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 3 | 6 | Burkina Faso | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Burundi | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 3 | 4 | Cambodia | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 7 | 8 | Cameroon | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 49 | 12 | Canada | 236342035.00 | 75.8199996948242 | 309632000 | 18 | 9111890.00 | North America + 1 | 2 | Cape Verde | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 6 | Central African Republic | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 2 | 8 | Chad | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 29 | 4 | Chile | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 38 | 5 | Colombia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 5 | Comoros | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 2 | 6 | Congo | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 4 | Costa Rica | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 5 | 5 | Cote deIvoire | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 4 | 2 | Croatia | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 14 | 1 | Cuba | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 2 | 2 | Cyprus | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 10 | 8 | Czech Republic | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 1 | 3 | Djibouti | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 1 | 2 | Dominica | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 6 | 2 | Dominican Republic | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 15 | 2 | Ecuador | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 37 | 2 | Egypt | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 7 | 2 | El Salvador | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America +(50 rows) + +--query 11 +with allcity_aostats as +( select city_ao.name CITY_AO,city_ao.id,country_ao.name COUNTRY_AO,city_ao.district,city_ao.population as CITY_AO_POP + from + city_ao,country_ao + where city_ao.countrycode = country_ao.code +), +alldistrictstats as +( select allcity_aostats.district,allcity_aostats.COUNTRY_AO,sum(CITY_AO_POP) DISTRICT_POP, + count(CITY_AO) as D_CITY_AO_CNT + from allcity_aostats + group by allcity_aostats.district,allcity_aostats.COUNTRY_AO + order by district,COUNTRY_AO +), +allcountry_aostats as +( select alldistrictstats.COUNTRY_AO,country_ao.code,sum(D_CITY_AO_CNT) C_CITY_AO_CNT, + count(distinct countrylanguage_ao.language) C_LANG_CNT + from alldistrictstats,country_ao,countrylanguage_ao + where alldistrictstats.COUNTRY_AO = country_ao.name + and country_ao.code = countrylanguage_ao.countrycode + group by COUNTRY_AO,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_AO_CNT) REGION_CITY_AO_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountry_aostats.code,allcountry_aostats.COUNTRY_AO,C_CITY_AO_CNT,C_LANG_CNT,country_ao.region,city_ao.name CAPITAL +from allcountry_aostats,country_ao,city_ao +where allcountry_aostats.code = country_ao.code +and country_ao.capital = city_ao.id +and C_CITY_AO_CNT/C_LANG_CNT > 1 +and country_ao.continent = 'Asia') FOO +,allcountry_aostats,country_ao +WHERE allcountry_aostats.code = country_ao.code +and FOO.region = country_ao.region +group by FOO.region order by FOO.region +) +select * from +( +select REGION_CITY_AO_CNT as CITY_AO_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_AO_CNT) CITY_AO_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountry_aostats.code,allcountry_aostats.COUNTRY_AO,C_CITY_AO_CNT,C_LANG_CNT,country_ao.region,allcity_aostats.CITY_AO CAPITAL +from allcountry_aostats,country_ao,allcity_aostats +where allcountry_aostats.code = country_ao.code +and country_ao.capital = allcity_aostats.id +and C_CITY_AO_CNT/C_LANG_CNT > 1 +and country_ao.continent = 'Europe') FOO +,allcountry_aostats,country_ao +WHERE allcountry_aostats.code = country_ao.code +and FOO.region = country_ao.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + city_ao_cnt | lang_cnt | identifier +-------------+----------+--------------------------- + 494 | 10 | British Islands + 159 | 48 | Baltic Countries + 1295 | 161 | Nordic Countries + 50176 | 264 | Eastern Asia + 9414 | 369 | Western Europe + 11880 | 450 | Southern Europe + 32900 | 610 | Eastern Europe + 29161 | 616 | Southeast Asia + 8568 | 792 | Middle East + 80388 | 1092 | Southern and Central Asia +(10 rows) + +-- queries with CTEs on CO tables +DROP TABLE IF EXISTS CITY_CO; +NOTICE: table "city_co" does not exist, skipping +CREATE TABLE CITY_CO ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +) with (appendonly=true,orientation=column) ; +DROP TABLE IF EXISTS country_co; +NOTICE: table "country_co" does not exist, skipping +CREATE TABLE country_co ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea numeric(10,2) NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +) with (appendonly=true,orientation=column); +DROP TABLE IF EXISTS countrylanguage_co; +NOTICE: table "countrylanguage_co" does not exist, skipping +CREATE TABLE countrylanguage_co ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +) with (appendonly=true,orientation=column); +create index bitmap_city_co_countrycode on city_co using bitmap(countrycode); +create index bitmap_country_co_gf on country_co using bitmap(governmentform); +create index bitmap_country_co_region on country_co using bitmap(region); +create index bitmap_country_co_continent on country_co using bitmap(continent); +create index bitmap_countrylanguage_co_countrycode on countrylanguage_co using bitmap(countrycode); +INSERT INTO CITY_CO SELECT * FROM CITY; +INSERT INTO COUNTRY_CO SELECT * FROM COUNTRY; +INSERT INTO COUNTRYLANGUAGE_CO SELECT * FROM COUNTRYLANGUAGE; +ANALYZE CITY_CO; +ANALYZE COUNTRY_CO; +ANALYZE COUNTRYLANGUAGE_CO; +set enable_seqscan=off; +set enable_indexscan=on; +--query1 +with capitals as +(select country_co.code,id,city_co.name from city_co,country_co + where city_co.countrycode = country_co.code AND city_co.id = country_co.capital) +select * from +capitals,countrylanguage_co +where capitals.code = countrylanguage_co.countrycode and isofficial='true' +order by capitals.code,countrylanguage_co.language; + code | id | name | countrycode | language | isofficial | percentage +------+------+-----------------------------------+-------------+------------------+------------+------------ + ABW | 129 | Oranjestad | ABW | Dutch | t | 5.3 + AFG | 1 | Kabul | AFG | Dari | t | 32.1 + AFG | 1 | Kabul | AFG | Pashto | t | 52.4 + AIA | 62 | The Valley | AIA | English | t | 0 + ALB | 34 | Tirana | ALB | Albaniana | t | 97.9 + AND | 55 | Andorra la Vella | AND | Catalan | t | 32.3 + ANT | 33 | Willemstad | ANT | Dutch | t | 0 + ANT | 33 | Willemstad | ANT | Papiamento | t | 86.2 + ARE | 65 | Abu Dhabi | ARE | Arabic | t | 42 + ARG | 69 | Buenos Aires | ARG | Spanish | t | 96.8 + ARM | 126 | Yerevan | ARM | Armenian | t | 93.4 + ASM | 54 | Fagatogo | ASM | English | t | 3.1 + ASM | 54 | Fagatogo | ASM | Samoan | t | 90.6 + ATG | 63 | Saint Johns | ATG | English | t | 0 + AUS | 135 | Canberra | AUS | English | t | 81.2 + AUT | 1523 | Wien | AUT | German | t | 92 + AZE | 144 | Baku | AZE | Azerbaijani | t | 89 + BDI | 552 | Bujumbura | BDI | French | t | 0 + BDI | 552 | Bujumbura | BDI | Kirundi | t | 98.1 + BEL | 179 | Bruxelles [Brussel] | BEL | Dutch | t | 59.2 + BEL | 179 | Bruxelles [Brussel] | BEL | French | t | 32.6 + BEL | 179 | Bruxelles [Brussel] | BEL | German | t | 1 + BGD | 150 | Dhaka | BGD | Bengali | t | 97.7 + BGR | 539 | Sofija | BGR | Bulgariana | t | 83.2 + BHR | 149 | al-Manama | BHR | Arabic | t | 67.7 + BIH | 201 | Sarajevo | BIH | Serbo-Croatian | t | 99.2 + BLR | 3520 | Minsk | BLR | Belorussian | t | 65.6 + BLR | 3520 | Minsk | BLR | Russian | t | 32 + BLZ | 185 | Belmopan | BLZ | English | t | 50.8 + BMU | 191 | Hamilton | BMU | English | t | 100 + BOL | 194 | La Paz | BOL | Aimara | t | 3.2 + BOL | 194 | La Paz | BOL | Ketdua | t | 8.1 + BOL | 194 | La Paz | BOL | Spanish | t | 87.7 + BRA | 211 | Brasilia | BRA | Portuguese | t | 97.5 + BRB | 174 | Bridgetown | BRB | English | t | 0 + BRN | 538 | Bandar Seri Begawan | BRN | Malay | t | 45.5 + BTN | 192 | Thimphu | BTN | Dzongkha | t | 50 + CAN | 1822 | Ottawa | CAN | English | t | 60.4 + CAN | 1822 | Ottawa | CAN | French | t | 23.4 + CCK | 2317 | West Island | CCK | English | t | 0 + CHE | 3248 | Bern | CHE | French | t | 19.2 + CHE | 3248 | Bern | CHE | German | t | 63.6 + CHE | 3248 | Bern | CHE | Italian | t | 7.7 + CHE | 3248 | Bern | CHE | Romansh | t | 0.6 + CHL | 554 | Santiago de Chile | CHL | Spanish | t | 89.7 + CHN | 1891 | Peking | CHN | Chinese | t | 92 + COK | 583 | Avarua | COK | Maori | t | 0 + COL | 2257 | Santafe de Bogota | COL | Spanish | t | 99 + COM | 2295 | Moroni | COM | Comorian | t | 75 + CPV | 1859 | Praia | CPV | Portuguese | t | 0 + CRI | 584 | San Jose | CRI | Spanish | t | 97.5 + CUB | 2413 | La Habana | CUB | Spanish | t | 100 + CXR | 1791 | Flying Fish Cove | CXR | English | t | 0 + CYM | 553 | George Town | CYM | English | t | 0 + CYP | 2430 | Nicosia | CYP | Greek | t | 74.1 + CYP | 2430 | Nicosia | CYP | Turkish | t | 22.4 + CZE | 3339 | Praha | CZE | Czech | t | 81.2 + DEU | 3068 | Berlin | DEU | German | t | 91.3 + DJI | 585 | Djibouti | DJI | Arabic | t | 10.6 + DNK | 3315 | Kobenhavn | DNK | Danish | t | 93.5 + DOM | 587 | Santo Domingo de Guzman | DOM | Spanish | t | 98 + DZA | 35 | Alger | DZA | Arabic | t | 86 + ECU | 594 | Quito | ECU | Spanish | t | 93 + EGY | 608 | Cairo | EGY | Arabic | t | 98.8 + ERI | 652 | Asmara | ERI | Tigrinja | t | 49.1 + ESH | 2453 | El-Aaiun | ESH | Arabic | t | 100 + ESP | 653 | Madrid | ESP | Spanish | t | 74.4 + EST | 3791 | Tallinn | EST | Estonian | t | 65.3 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Finnish | t | 92.7 + FIN | 3236 | Helsinki [Helsingfors] | FIN | Swedish | t | 5.7 + FJI | 764 | Suva | FJI | Fijian | t | 50.8 + FLK | 763 | Stanley | FLK | English | t | 0 + FRA | 2974 | Paris | FRA | French | t | 93.6 + FRO | 901 | Torshavn | FRO | Danish | t | 0 + FRO | 901 | Torshavn | FRO | Faroese | t | 100 + GBR | 456 | London | GBR | English | t | 97.3 + GEO | 905 | Tbilisi | GEO | Georgiana | t | 71.7 + GIB | 915 | Gibraltar | GIB | English | t | 88.9 + GLP | 919 | Basse-Terre | GLP | French | t | 0 + GNB | 927 | Bissau | GNB | Portuguese | t | 8.1 + GRC | 2401 | Athenai | GRC | Greek | t | 98.5 + GRL | 917 | Nuuk | GRL | Danish | t | 12.5 + GRL | 917 | Nuuk | GRL | Greenlandic | t | 87.5 + GTM | 922 | Ciudad de Guatemala | GTM | Spanish | t | 64.7 + GUM | 921 | Agaaa | GUM | Chamorro | t | 29.6 + GUM | 921 | Agaaa | GUM | English | t | 37.5 + HKG | 937 | Victoria | HKG | English | t | 2.2 + HND | 933 | Tegucigalpa | HND | Spanish | t | 97.2 + HRV | 2409 | Zagreb | HRV | Serbo-Croatian | t | 95.9 + HTI | 929 | Port-au-Prince | HTI | French | t | 0 + HUN | 3483 | Budapest | HUN | Hungarian | t | 98.5 + IDN | 939 | Jakarta | IDN | Malay | t | 12.1 + IND | 1109 | New Delhi | IND | Hindi | t | 39.9 + IRL | 1447 | Dublin | IRL | English | t | 98.4 + IRL | 1447 | Dublin | IRL | Irish | t | 1.6 + IRN | 1380 | Teheran | IRN | Persian | t | 45.7 + IRQ | 1365 | Baghdad | IRQ | Arabic | t | 77.2 + ISL | 1449 | Reykjavik | ISL | Icelandic | t | 95.7 + ISR | 1450 | Jerusalem | ISR | Arabic | t | 18 + ISR | 1450 | Jerusalem | ISR | Hebrew | t | 63.1 + ITA | 1464 | Roma | ITA | Italian | t | 94.1 + JOR | 1786 | Amman | JOR | Arabic | t | 97.9 + JPN | 1532 | Tokyo | JPN | Japanese | t | 99.1 + KAZ | 1864 | Astana | KAZ | Kazakh | t | 46 + KGZ | 2253 | Bishkek | KGZ | Kirgiz | t | 59.7 + KGZ | 2253 | Bishkek | KGZ | Russian | t | 16.2 + KHM | 1800 | Phnom Penh | KHM | Khmer | t | 88.6 + KIR | 2256 | Bairiki | KIR | Kiribati | t | 98.9 + KNA | 3064 | Basseterre | KNA | English | t | 0 + KOR | 2331 | Seoul | KOR | Korean | t | 99.9 + KWT | 2429 | Kuwait | KWT | Arabic | t | 78.1 + LAO | 2432 | Vientiane | LAO | Lao | t | 67.2 + LBN | 2438 | Beirut | LBN | Arabic | t | 93 + LBY | 2441 | Tripoli | LBY | Arabic | t | 96 + LCA | 3065 | Castries | LCA | English | t | 20 + LIE | 2446 | Vaduz | LIE | German | t | 89 + LKA | 3217 | Colombo | LKA | Singali | t | 60.3 + LKA | 3217 | Colombo | LKA | Tamil | t | 19.6 + LSO | 2437 | Maseru | LSO | English | t | 0 + LSO | 2437 | Maseru | LSO | Sotho | t | 85 + LTU | 2447 | Vilnius | LTU | Lithuanian | t | 81.6 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | French | t | 4.2 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | German | t | 2.3 + LUX | 2452 | Luxembourg [Luxemburg/Letzebuerg] | LUX | Luxembourgish | t | 64.4 + LVA | 2434 | Riga | LVA | Latvian | t | 55.1 + MAC | 2454 | Macao | MAC | Portuguese | t | 2.3 + MAR | 2486 | Rabat | MAR | Arabic | t | 65 + MCO | 2695 | Monaco-Ville | MCO | French | t | 41.9 + MDA | 2690 | Chisinau | MDA | Romanian | t | 61.9 + MDG | 2455 | Antananarivo | MDG | French | t | 0 + MDG | 2455 | Antananarivo | MDG | Malagasy | t | 98.9 + MDV | 2463 | Male | MDV | Dhivehi | t | 100 + MEX | 2515 | Ciudad de Mexico | MEX | Spanish | t | 92.1 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | English | t | 0 + MHL | 2507 | Dalap-Uliga-Darrit | MHL | Marshallese | t | 96.8 + MKD | 2460 | Skopje | MKD | Macedonian | t | 66.5 + MLT | 2484 | Valletta | MLT | English | t | 2.1 + MLT | 2484 | Valletta | MLT | Maltese | t | 95.8 + MMR | 2710 | Rangoon (Yangon) | MMR | Burmese | t | 69 + MNG | 2696 | Ulan Bator | MNG | Mongolian | t | 78.8 + MNP | 2913 | Garapan | MNP | English | t | 4.8 + MSR | 2697 | Plymouth | MSR | English | t | 0 + MTQ | 2508 | Fort-de-France | MTQ | French | t | 0 + MWI | 2462 | Lilongwe | MWI | Chichewa | t | 58.3 + MYS | 2464 | Kuala Lumpur | MYS | Malay | t | 58.4 + MYT | 2514 | Mamoutzou | MYT | French | t | 20.3 + NCL | 3493 | Noumea | NCL | French | t | 34.3 + NFK | 2806 | Kingston | NFK | English | t | 0 + NIC | 2734 | Managua | NIC | Spanish | t | 97.6 + NIU | 2805 | Alofi | NIU | English | t | 0 + NLD | 5 | Amsterdam | NLD | Dutch | t | 95.6 + NOR | 2807 | Oslo | NOR | Norwegian | t | 96.6 + NPL | 2729 | Kathmandu | NPL | Nepali | t | 50.4 + NRU | 2728 | Yaren | NRU | English | t | 7.5 + NRU | 2728 | Yaren | NRU | Nauru | t | 57.5 + NZL | 3499 | Wellington | NZL | English | t | 87 + OMN | 2821 | Masqat | OMN | Arabic | t | 76.7 + PAK | 2831 | Islamabad | PAK | Urdu | t | 7.6 + PAN | 2882 | Ciudad de Panama | PAN | Spanish | t | 76.8 + PER | 2890 | Lima | PER | Aimara | t | 2.3 + PER | 2890 | Lima | PER | Ketdua | t | 16.4 + PER | 2890 | Lima | PER | Spanish | t | 79.8 + PHL | 766 | Manila | PHL | Pilipino | t | 29.3 + PLW | 2881 | Koror | PLW | English | t | 3.2 + PLW | 2881 | Koror | PLW | Palau | t | 82.2 + POL | 2928 | Warszawa | POL | Polish | t | 97.6 + PRI | 2919 | San Juan | PRI | Spanish | t | 51.3 + PRK | 2318 | Pyongyang | PRK | Korean | t | 99.9 + PRT | 2914 | Lisboa | PRT | Portuguese | t | 99 + PRY | 2885 | Asuncion | PRY | Guarani | t | 40.1 + PRY | 2885 | Asuncion | PRY | Spanish | t | 55.1 + PYF | 3016 | Papeete | PYF | French | t | 40.8 + QAT | 2973 | Doha | QAT | Arabic | t | 40.7 + ROM | 3018 | Bucuresti | ROM | Romani | t | 0.7 + ROM | 3018 | Bucuresti | ROM | Romanian | t | 90.7 + RUS | 3580 | Moscow | RUS | Russian | t | 86.6 + RWA | 3047 | Kigali | RWA | French | t | 0 + RWA | 3047 | Kigali | RWA | Rwanda | t | 100 + SAU | 3173 | Riyadh | SAU | Arabic | t | 95 + SDN | 3225 | Khartum | SDN | Arabic | t | 49.4 + SEN | 3198 | Dakar | SEN | Wolof | t | 48.1 + SGP | 3208 | Singapore | SGP | Chinese | t | 77.1 + SGP | 3208 | Singapore | SGP | Malay | t | 14.1 + SGP | 3208 | Singapore | SGP | Tamil | t | 7.4 + SHN | 3063 | Jamestown | SHN | English | t | 0 + SJM | 938 | Longyearbyen | SJM | Norwegian | t | 0 + SLV | 645 | San Salvador | SLV | Spanish | t | 100 + SMR | 3171 | San Marino | SMR | Italian | t | 100 + SOM | 3214 | Mogadishu | SOM | Arabic | t | 0 + SOM | 3214 | Mogadishu | SOM | Somali | t | 98.3 + SPM | 3067 | Saint-Pierre | SPM | French | t | 0 + SVK | 3209 | Bratislava | SVK | Slovak | t | 85.6 + SVN | 3212 | Ljubljana | SVN | Slovene | t | 87.9 + SWE | 3048 | Stockholm | SWE | Swedish | t | 89.5 + SWZ | 3244 | Mbabane | SWZ | Swazi | t | 89.9 + SYC | 3206 | Victoria | SYC | English | t | 3.8 + SYC | 3206 | Victoria | SYC | French | t | 1.3 + SYR | 3250 | Damascus | SYR | Arabic | t | 90 + TCA | 3423 | Cockburn Town | TCA | English | t | 0 + TCD | 3337 | NDjamena | TCD | Arabic | t | 12.3 + TGO | 3332 | Lome | TGO | Ewe | t | 23.2 + TGO | 3332 | Lome | TGO | Kabye | t | 13.8 + THA | 3320 | Bangkok | THA | Thai | t | 52.6 + TJK | 3261 | Dushanbe | TJK | Tadzhik | t | 62.2 + TKL | 3333 | Fakaofo | TKL | English | t | 0 + TKM | 3419 | Ashgabat | TKM | Turkmenian | t | 76.7 + TMP | 1522 | Dili | TMP | Portuguese | t | 0 + TON | 3334 | Nukualofa | TON | English | t | 0 + TON | 3334 | Nukualofa | TON | Tongan | t | 98.3 + TUN | 3349 | Tunis | TUN | Arabic | t | 69.9 + TUR | 3358 | Ankara | TUR | Turkish | t | 87.6 + TUV | 3424 | Funafuti | TUV | English | t | 0 + TUV | 3424 | Funafuti | TUV | Tuvalu | t | 92.5 + TWN | 3263 | Taipei | TWN | Mandarin Chinese | t | 20.1 + TZA | 3306 | Dodoma | TZA | Swahili | t | 8.8 + UKR | 3426 | Kyiv | UKR | Ukrainian | t | 64.7 + URY | 3492 | Montevideo | URY | Spanish | t | 95.7 + USA | 3813 | Washington | USA | English | t | 86.2 + UZB | 3503 | Toskent | UZB | Uzbek | t | 72.6 + VAT | 3538 | Citta del Vaticano | VAT | Italian | t | 0 + VCT | 3066 | Kingstown | VCT | English | t | 0 + VEN | 3539 | Caracas | VEN | Spanish | t | 96.9 + VGB | 537 | Road Town | VGB | English | t | 0 + VIR | 4067 | Charlotte Amalie | VIR | English | t | 81.7 + VNM | 3770 | Hanoi | VNM | Vietnamese | t | 86.8 + VUT | 3537 | Port-Vila | VUT | Bislama | t | 56.6 + VUT | 3537 | Port-Vila | VUT | English | t | 28.3 + VUT | 3537 | Port-Vila | VUT | French | t | 14.2 + WSM | 3169 | Apia | WSM | English | t | 0.6 + WSM | 3169 | Apia | WSM | Samoan | t | 47.5 + YEM | 1780 | Sanaa | YEM | Arabic | t | 99.6 + YUG | 1792 | Beograd | YUG | Serbo-Croatian | t | 75.2 + ZAF | 716 | Pretoria | ZAF | Afrikaans | t | 14.3 + ZAF | 716 | Pretoria | ZAF | English | t | 8.5 + ZAF | 716 | Pretoria | ZAF | Xhosa | t | 17.7 + ZAF | 716 | Pretoria | ZAF | Zulu | t | 22.7 + ZWE | 4068 | Harare | ZWE | English | t | 2.2 +(237 rows) + +--query2 +with lang_total as +( select count(*) as lang_count,country_co.code,countrylanguage_co.countrycode + from country_co join countrylanguage_co on (country_co.code=countrylanguage_co.countrycode and governmentform='Federal Republic') + group by country_co.code,countrylanguage_co.countrycode order by country_co.code) + +select lang_count,country_co.code,country_co.name,country_co.continent,country_co.region,country_co.population + from country_co left outer join lang_total + on (lang_total.code = country_co.code) + where country_co.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + lang_count | code | name | continent | region | population +------------+------+---------------------------------+-----------+-----------------+------------ + 12 | RUS | Russian Federation | Europe | Eastern Europe | 146934000 + 6 | FSM | Micronesia, Federated States of | Oceania | Micronesia | 119000 + 4 | AZE | Azerbaijan | Asia | Middle East | 7734000 + 1 | BIH | Bosnia and Herzegovina | Europe | Southern Europe | 3972000 +(4 rows) + +-- Using CTE in the WHERE clause +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country_co.code,countrylanguage_co.countrycode + from country_co join countrylanguage_co on (country_co.code=countrylanguage_co.countrycode and governmentform='Federal Republic') + group by country_co.code,countrylanguage_co.countrycode order by country_co.code) + + UNION ALL + + ( + select count(*) as lang_count,country_co.code,countrylanguage_co.countrycode + from country_co join countrylanguage_co on (country_co.code=countrylanguage_co.countrycode and governmentform='Monarchy') + group by country_co.code,countrylanguage_co.countrycode order by country_co.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country_co.code,country_co.name +from +country_co,countrylanguage_co +where country_co.code=countrylanguage_co.countrycode group by country_co.code,country_co.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +--query4 +with diversecountries as +(select country_co.code,country_co.name,country_co.capital,d.CNT + from country_co, + (select countrylanguage_co.countrycode,count(*) as CNT from countrylanguage_co group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country_co.code and country_co.gnp > 100000) + select diversecountries.name,city_co.name,diversecountries.CNT + from diversecountries,city_co where city_co.id = diversecountries.capital + order by diversecountries.name; + name | name | cnt +--------------------+------------------+----- + Australia | Canberra | 8 + Austria | Wien | 8 + Canada | Ottawa | 12 + China | Peking | 12 + Denmark | Kobenhavn | 7 + India | New Delhi | 12 + Iran | Teheran | 10 + Italy | Roma | 8 + Myanmar | Rangoon (Yangon) | 8 + Russian Federation | Moscow | 12 + South Africa | Pretoria | 11 + United States | Washington | 12 +(12 rows) + +-- some queries with merge joins and index scans +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY_CO,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate + from country_co,city_co + where country_co.capital = city_co.id + and country_co.gnp < 10000 + and country_co.region = 'Southeast Asia' + and country_co.continent = 'Asia' + + UNION ALL + select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate + from country_co,city_co + where country_co.capital = city_co.id + and country_co.gnp < 10000 + and country_co.region = 'Eastern Asia' + and country_co.continent = 'Asia' + UNION ALL + select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate + from country_co,city_co + where country_co.capital = city_co.id + and country_co.gnp < 10000 + and country_co.region = 'Middle East' + and country_co.continent = 'Asia' + ) FOO, countrylanguage_co + where FOO.code = countrylanguage_co.countrycode + group by FOO.code,FOO.COUNTRY_CO,FOO.CAPITAL,FOO.headofstate,countrylanguage_co.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country_co.code from countrylanguage_co,country_co + where countrylanguage_co.countrycode=country_co.code + and country_co.continent = 'Asia' + and country_co.region = 'Southern and Central Asia' + group by country_co.code + ) FOO1 + ) +) +select FOO.code,FOO.COUNTRY_CO,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate +from country_co,city_co +where country_co.capital = city_co.id +and country_co.continent = 'North America' +UNION ALL +select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate +from country_co,city_co +where country_co.capital = city_co.id +and country_co.continent = 'South America' +) FOO,countrylanguage_co +where FOO.code = countrylanguage_co.countrycode +group by FOO.code,FOO.COUNTRY_CO,FOO.CAPITAL,FOO.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country_co + where somecheapasiandiversecountries.code = country_co.code + and country_co.gnp >= country_co.gnpold + ) ASIANCOUNT + ) +order by COUNTRY_CO; + code | country_co | capital | headofstate | compared_with_cheap_asian_cnt +------+----------------------------------+-------------------------+-----------------------------------+------------------------------- + ATG | Antigua and Barbuda | Saint Johns | Elisabeth II | 2 + ARG | Argentina | Buenos Aires | Fernando de la Rua | 3 + ABW | Aruba | Oranjestad | Beatrix | 4 + BHS | Bahamas | Nassau | Elisabeth II | 2 + BRB | Barbados | Bridgetown | Elisabeth II | 2 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + CAN | Canada | Ottawa | Elisabeth II | 12 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + CRI | Costa Rica | San Jose | Miguel Angel Rodriguez Echeverria | 4 + DMA | Dominica | Roseau | Vernon Shaw | 2 + DOM | Dominican Republic | Santo Domingo de Guzman | Hipolito Mejia Dominguez | 2 + ECU | Ecuador | Quito | Gustavo Noboa Bejarano | 2 + SLV | El Salvador | San Salvador | Francisco Guillermo Flores Perez | 2 + GUF | French Guiana | Cayenne | Jacques Chirac | 2 + GRL | Greenland | Nuuk | Margrethe II | 2 + GLP | Guadeloupe | Basse-Terre | Jacques Chirac | 2 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + GUY | Guyana | Georgetown | Bharrat Jagdeo | 3 + HTI | Haiti | Port-au-Prince | Jean-Bertrand Aristide | 2 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 + JAM | Jamaica | Kingston | Elisabeth II | 2 + MTQ | Martinique | Fort-de-France | Jacques Chirac | 2 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + ANT | Netherlands Antilles | Willemstad | Beatrix | 3 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + PER | Peru | Lima | Valentin Paniagua Corazao | 3 + PRI | Puerto Rico | San Juan | George W. Bush | 2 + KNA | Saint Kitts and Nevis | Basseterre | Elisabeth II | 2 + LCA | Saint Lucia | Castries | Elisabeth II | 2 + VCT | Saint Vincent and the Grenadines | Kingstown | Elisabeth II | 2 + SUR | Suriname | Paramaribo | Ronald Venetiaan | 2 + TTO | Trinidad and Tobago | Port-of-Spain | Arthur N. R. Robinson | 3 + USA | United States | Washington | George W. Bush | 12 + VEN | Venezuela | Caracas | Hugo Chavez Frias | 3 + VIR | Virgin Islands, U.S. | Charlotte Amalie | George W. Bush | 3 +(40 rows) + +-- query 6 +select count(*) from +( select r.* from + ( with fact as + ( + select country_co.name as COUNTRY_CO,country_co.code,city_co.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city_co.population >= 0.5 * country_co.population) then country_co.population else city_co.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country_co.region + from country_co,city_co + where governmentform != 'Constitutional Monarchy' + and country_co.capital = city_co.id + and indepyear > 0 + group by country_co.region) AGG1 + ,country_co,city_co + where country_co.capital = city_co.id + and country_co.region = AGG1.region + ) + select code,COUNTRY_CO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_co + where fact.code = countrylanguage_co.countrycode and isofficial = 'True' + and fact.region = 'South America' + UNION ALL + select code,COUNTRY_CO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_co + where fact.code = countrylanguage_co.countrycode and isofficial = 'True' + and fact.region = 'North America' + UNION ALL + select code,COUNTRY_CO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_co + where fact.code = countrylanguage_co.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + count +------- + 43 +(1 row) + +-- query7 +with alleuropeanlanguages as +(select country_co.code,country_co.name COUNTRY_CO, city_co.name CAPITAL, language, isofficial, percentage + FROM country_co,city_co,countrylanguage_co + WHERE country_co.code = countrylanguage_co.countrycode + and country_co.capital = city_co.id + and country_co.continent = 'Europe') +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY_CO,e1.language; + code | country_co | capital | language | isofficial | percentage | code | country_co | capital | language | isofficial | percentage +------+------------------------+-----------------------------------+----------------+------------+------------+------+------------------------+-----------------------------------+----------------+------------+------------ + ALB | Albania | Tirana | Albaniana | t | 97.9 | ALB | Albania | Tirana | Albaniana | t | 97.9 + AUT | Austria | Wien | German | t | 92 | AUT | Austria | Wien | German | t | 92 + BLR | Belarus | Minsk | Belorussian | t | 65.6 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BLR | Belarus | Minsk | Russian | t | 32 | BLR | Belarus | Minsk | Belorussian | t | 65.6 + BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | French | t | 32.6 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BEL | Belgium | Bruxelles [Brussel] | German | t | 1 | BEL | Belgium | Bruxelles [Brussel] | Dutch | t | 59.2 + BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 | BIH | Bosnia and Herzegovina | Sarajevo | Serbo-Croatian | t | 99.2 + BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 | BGR | Bulgaria | Sofija | Bulgariana | t | 83.2 + HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 | HRV | Croatia | Zagreb | Serbo-Croatian | t | 95.9 + CZE | Czech Republic | Praha | Czech | t | 81.2 | CZE | Czech Republic | Praha | Czech | t | 81.2 + DNK | Denmark | Kobenhavn | Danish | t | 93.5 | DNK | Denmark | Kobenhavn | Danish | t | 93.5 + EST | Estonia | Tallinn | Estonian | t | 65.3 | EST | Estonia | Tallinn | Estonian | t | 65.3 + FRO | Faroe Islands | Torshavn | Danish | t | 0 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FRO | Faroe Islands | Torshavn | Faroese | t | 100 | FRO | Faroe Islands | Torshavn | Faroese | t | 100 + FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FIN | Finland | Helsinki [Helsingfors] | Swedish | t | 5.7 | FIN | Finland | Helsinki [Helsingfors] | Finnish | t | 92.7 + FRA | France | Paris | French | t | 93.6 | FRA | France | Paris | French | t | 93.6 + DEU | Germany | Berlin | German | t | 91.3 | DEU | Germany | Berlin | German | t | 91.3 + GIB | Gibraltar | Gibraltar | English | t | 88.9 | GIB | Gibraltar | Gibraltar | English | t | 88.9 + GRC | Greece | Athenai | Greek | t | 98.5 | GRC | Greece | Athenai | Greek | t | 98.5 + HUN | Hungary | Budapest | Hungarian | t | 98.5 | HUN | Hungary | Budapest | Hungarian | t | 98.5 + ISL | Iceland | Reykjavik | Icelandic | t | 95.7 | ISL | Iceland | Reykjavik | Icelandic | t | 95.7 + IRL | Ireland | Dublin | English | t | 98.4 | IRL | Ireland | Dublin | English | t | 98.4 + IRL | Ireland | Dublin | Irish | t | 1.6 | IRL | Ireland | Dublin | English | t | 98.4 + ITA | Italy | Roma | Italian | t | 94.1 | ITA | Italy | Roma | Italian | t | 94.1 + LVA | Latvia | Riga | Latvian | t | 55.1 | LVA | Latvia | Riga | Latvian | t | 55.1 + LIE | Liechtenstein | Vaduz | German | t | 89 | LIE | Liechtenstein | Vaduz | German | t | 89 + LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 | LTU | Lithuania | Vilnius | Lithuanian | t | 81.6 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | French | t | 4.2 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | German | t | 2.3 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 | LUX | Luxembourg | Luxembourg [Luxemburg/Letzebuerg] | Luxembourgish | t | 64.4 + MKD | Macedonia | Skopje | Macedonian | t | 66.5 | MKD | Macedonia | Skopje | Macedonian | t | 66.5 + MLT | Malta | Valletta | English | t | 2.1 | MLT | Malta | Valletta | Maltese | t | 95.8 + MLT | Malta | Valletta | Maltese | t | 95.8 | MLT | Malta | Valletta | Maltese | t | 95.8 + MDA | Moldova | Chisinau | Romanian | t | 61.9 | MDA | Moldova | Chisinau | Romanian | t | 61.9 + NLD | Netherlands | Amsterdam | Dutch | t | 95.6 | NLD | Netherlands | Amsterdam | Dutch | t | 95.6 + NOR | Norway | Oslo | Norwegian | t | 96.6 | NOR | Norway | Oslo | Norwegian | t | 96.6 + POL | Poland | Warszawa | Polish | t | 97.6 | POL | Poland | Warszawa | Polish | t | 97.6 + PRT | Portugal | Lisboa | Portuguese | t | 99 | PRT | Portugal | Lisboa | Portuguese | t | 99 + ROM | Romania | Bucuresti | Romani | t | 0.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + ROM | Romania | Bucuresti | Romanian | t | 90.7 | ROM | Romania | Bucuresti | Romanian | t | 90.7 + RUS | Russian Federation | Moscow | Russian | t | 86.6 | RUS | Russian Federation | Moscow | Russian | t | 86.6 + SMR | San Marino | San Marino | Italian | t | 100 | SMR | San Marino | San Marino | Italian | t | 100 + SVK | Slovakia | Bratislava | Slovak | t | 85.6 | SVK | Slovakia | Bratislava | Slovak | t | 85.6 + SVN | Slovenia | Ljubljana | Slovene | t | 87.9 | SVN | Slovenia | Ljubljana | Slovene | t | 87.9 + ESP | Spain | Madrid | Spanish | t | 74.4 | ESP | Spain | Madrid | Spanish | t | 74.4 + SWE | Sweden | Stockholm | Swedish | t | 89.5 | SWE | Sweden | Stockholm | Swedish | t | 89.5 + CHE | Switzerland | Bern | French | t | 19.2 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | German | t | 63.6 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Italian | t | 7.7 | CHE | Switzerland | Bern | German | t | 63.6 + CHE | Switzerland | Bern | Romansh | t | 0.6 | CHE | Switzerland | Bern | German | t | 63.6 + UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 | UKR | Ukraine | Kyiv | Ukrainian | t | 64.7 + GBR | United Kingdom | London | English | t | 97.3 | GBR | United Kingdom | London | English | t | 97.3 + YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 | YUG | Yugoslavia | Beograd | Serbo-Croatian | t | 75.2 +(55 rows) + +-- query8 +with allcountry_costats as +( select country_co.code,country_co.name,count(distinct city_co.id) CITY_CO_CNT, + count(distinct countrylanguage_co.language) LANG_CNT + from country_co,city_co,countrylanguage_co + where country_co.code = city_co.countrycode + and country_co.code = countrylanguage_co.countrycode + group by country_co.code,country_co.name +) +select sum(FOO.CITY_CO_CNT) REGION_CITY_CO_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountry_costats.code,allcountry_costats.name COUNTRY_CO,CITY_CO_CNT,LANG_CNT,country_co.region,city_co.name CAPITAL +from allcountry_costats,country_co,city_co +where allcountry_costats.code = country_co.code +and country_co.capital = city_co.id +and CITY_CO_CNT/LANG_CNT > 1 +and country_co.continent = 'Asia' +UNION ALL +select allcountry_costats.code,allcountry_costats.name COUNTRY_CO,CITY_CO_CNT,LANG_CNT,country_co.region,city_co.name CAPITAL +from allcountry_costats,country_co,city_co +where allcountry_costats.code = country_co.code +and country_co.capital = city_co.id +and CITY_CO_CNT/LANG_CNT > 1 +and country_co.continent = 'North America' +UNION ALL +select allcountry_costats.code,allcountry_costats.name COUNTRY_CO,CITY_CO_CNT,LANG_CNT,country_co.region,city_co.name CAPITAL +from allcountry_costats,country_co,city_co +where allcountry_costats.code = country_co.code +and country_co.capital = city_co.id +and CITY_CO_CNT/LANG_CNT > (select max(CITY_CO_CNT/LANG_CNT) from allcountry_costats,country_co where allcountry_costats.code = country_co.code AND country_co.continent='Europe') +) FOO +,allcountry_costats,country_co +WHERE allcountry_costats.code = country_co.code +and FOO.region = country_co.region +group by FOO.region order by FOO.region; + region_city_co_cnt | region_lang_cnt | region +--------------------+-----------------+--------------------------- + 840 | 192 | Caribbean + 2824 | 112 | Central America + 11336 | 384 | Eastern Asia + 2664 | 396 | Middle East + 1625 | 125 | North America + 3500 | 70 | South America + 3179 | 528 | Southeast Asia + 12278 | 896 | Southern and Central Asia +(8 rows) + +-- some queries with hash joins and index scans +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; +--query 9 +with diversecountries as +(select country_co.code,country_co.name,country_co.capital,d.CNT + from country_co, + (select countrylanguage_co.countrycode,count(*) as CNT from countrylanguage_co group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country_co.code and country_co.gnp > 100000) +select d1.code,d1.name,d1.capital,city_co.name CAPITAL_CITY_CO,d1.CNT,d2.CNT +from +diversecountries d1 left join country_co +ON (d1.code = country_co.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country_co.code = d2.code AND d2.CNT > 8) +INNER JOIN city_co +ON(d1.capital = city_co.id) +ORDER BY d1.name; + code | name | capital | capital_city_co | cnt | cnt +------+--------------------+---------+------------------+-----+----- + AUS | Australia | 135 | Canberra | 8 | + AUT | Austria | 1523 | Wien | 8 | + CAN | Canada | 1822 | Ottawa | 12 | + CHN | China | 1891 | Peking | 12 | + DNK | Denmark | 3315 | Kobenhavn | 7 | + IND | India | 1109 | New Delhi | 12 | + IRN | Iran | 1380 | Teheran | 10 | + ITA | Italy | 1464 | Roma | 8 | + MMR | Myanmar | 2710 | Rangoon (Yangon) | 8 | + RUS | Russian Federation | 3580 | Moscow | 12 | + ZAF | South Africa | 716 | Pretoria | 11 | + USA | United States | 3813 | Washington | 12 | +(12 rows) + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country_co + group by region + ) FOO,countrylanguage_co,country_co +where + country_co.code = countrylanguage_co.countrycode + and FOO.region = country_co.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country_co + group by region + ) FOO,countrylanguage_co,country_co +where + country_co.code = countrylanguage_co.countrycode + and FOO.region = country_co.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountry_costats as +( select country_co.code,country_co.name,count(distinct city_co.id) CITY_CO_CNT, + count(distinct countrylanguage_co.language) LANG_CNT + from country_co,city_co,countrylanguage_co + where country_co.code = city_co.countrycode + and country_co.code = countrylanguage_co.countrycode + group by country_co.code,country_co.name +) +select allcountry_costats.CITY_CO_CNT,allcountry_costats.LANG_CNT,allcountry_costats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_costats,country_co +where longlivingregions.region = denseregions.region and allcountry_costats.code = country_co.code and country_co.region = longlivingregions.region +and country_co.indepyear between 1800 and 1850 +UNION ALL +select allcountry_costats.CITY_CO_CNT,allcountry_costats.LANG_CNT,allcountry_costats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_costats,country_co +where longlivingregions.region = denseregions.region and allcountry_costats.code = country_co.code and country_co.region = longlivingregions.region +and country_co.indepyear between 1850 and 1900 +UNION ALL +select allcountry_costats.CITY_CO_CNT,allcountry_costats.LANG_CNT,allcountry_costats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_costats,country_co +where longlivingregions.region = denseregions.region and allcountry_costats.code = country_co.code and country_co.region = longlivingregions.region +and country_co.indepyear > 1900 +order by name +LIMIT 50; + city_co_cnt | lang_cnt | name | REGION_SURFACE_AREA | REGION_LIFETIME | REGION_POP | lang_count | REGION_GNP | region +-------------+----------+---------------------------------------+---------------------+------------------+------------+------------+------------+--------------------------- + 4 | 5 | Afghanistan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 3 | Albania | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 18 | 2 | Algeria | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 5 | 9 | Angola | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 2 | Antigua and Barbuda | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 57 | 3 | Argentina | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 2 | Armenia | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 14 | 8 | Australia | 62471162.00 | 78.8000030517578 | 22753100 | 11 | 405851.00 | Australia and New Zealand + 6 | 8 | Austria | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 4 | 4 | Azerbaijan | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 1 | 2 | Bahamas | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 1 | 2 | Bahrain | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 24 | 7 | Bangladesh | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 2 | Barbados | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 16 | 4 | Belarus | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 9 | 6 | Belgium | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 2 | 4 | Belize | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 4 | 7 | Benin | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Bhutan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 8 | 4 | Bolivia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 1 | Bosnia and Herzegovina | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 2 | 5 | Botswana | 23060186.00 | 44.8199996948242 | 46886000 | 21 | 126931.00 | Southern Africa + 250 | 5 | Brazil | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 4 | Brunei | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 10 | 4 | Bulgaria | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 3 | 6 | Burkina Faso | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Burundi | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 3 | 4 | Cambodia | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 7 | 8 | Cameroon | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 49 | 12 | Canada | 236342035.00 | 75.8199996948242 | 309632000 | 18 | 9111890.00 | North America + 1 | 2 | Cape Verde | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 6 | Central African Republic | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 2 | 8 | Chad | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 29 | 4 | Chile | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 38 | 5 | Colombia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 5 | Comoros | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 2 | 6 | Congo | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 4 | Costa Rica | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 5 | 5 | Cote deIvoire | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 4 | 2 | Croatia | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 14 | 1 | Cuba | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 2 | 2 | Cyprus | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 10 | 8 | Czech Republic | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 1 | 3 | Djibouti | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 1 | 2 | Dominica | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 6 | 2 | Dominican Republic | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 15 | 2 | Ecuador | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 37 | 2 | Egypt | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 7 | 2 | El Salvador | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America +(50 rows) + +--query 11 +with allcity_costats as +( select city_co.name CITY_CO,city_co.id,country_co.name COUNTRY_CO,city_co.district,city_co.population as CITY_CO_POP + from + city_co,country_co + where city_co.countrycode = country_co.code +), +alldistrictstats as +( select allcity_costats.district,allcity_costats.COUNTRY_CO,sum(CITY_CO_POP) DISTRICT_POP, + count(CITY_CO) as D_CITY_CO_CNT + from allcity_costats + group by allcity_costats.district,allcity_costats.COUNTRY_CO + order by district,COUNTRY_CO +), +allcountry_costats as +( select alldistrictstats.COUNTRY_CO,country_co.code,sum(D_CITY_CO_CNT) C_CITY_CO_CNT, + count(distinct countrylanguage_co.language) C_LANG_CNT + from alldistrictstats,country_co,countrylanguage_co + where alldistrictstats.COUNTRY_CO = country_co.name + and country_co.code = countrylanguage_co.countrycode + group by COUNTRY_CO,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CO_CNT) REGION_CITY_CO_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountry_costats.code,allcountry_costats.COUNTRY_CO,C_CITY_CO_CNT,C_LANG_CNT,country_co.region,city_co.name CAPITAL +from allcountry_costats,country_co,city_co +where allcountry_costats.code = country_co.code +and country_co.capital = city_co.id +and C_CITY_CO_CNT/C_LANG_CNT > 1 +and country_co.continent = 'Asia') FOO +,allcountry_costats,country_co +WHERE allcountry_costats.code = country_co.code +and FOO.region = country_co.region +group by FOO.region order by FOO.region +) +select * from +( +select REGION_CITY_CO_CNT as CITY_CO_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CO_CNT) CITY_CO_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountry_costats.code,allcountry_costats.COUNTRY_CO,C_CITY_CO_CNT,C_LANG_CNT,country_co.region,allcity_costats.CITY_CO CAPITAL +from allcountry_costats,country_co,allcity_costats +where allcountry_costats.code = country_co.code +and country_co.capital = allcity_costats.id +and C_CITY_CO_CNT/C_LANG_CNT > 1 +and country_co.continent = 'Europe') FOO +,allcountry_costats,country_co +WHERE allcountry_costats.code = country_co.code +and FOO.region = country_co.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + city_co_cnt | lang_cnt | identifier +-------------+----------+--------------------------- + 494 | 10 | British Islands + 159 | 48 | Baltic Countries + 1295 | 161 | Nordic Countries + 50176 | 264 | Eastern Asia + 9414 | 369 | Western Europe + 11880 | 450 | Southern Europe + 32900 | 610 | Eastern Europe + 29161 | 616 | Southeast Asia + 8568 | 792 | Middle East + 80388 | 1092 | Southern and Central Asia +(10 rows) + +-- Queries using multiple CTEs +-- query1 - all CTEs being used once in the main query +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital), +lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code), +alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select capitals.name CAPITAL,lang_total.lang_count COUNTRY_LANG_COUNT,capitals.code,country.name +from capitals,lang_total,country +where capitals.code = lang_total.countrycode +and capitals.code = country.code +and country.code NOT IN (select diversecountries.code from diversecountries,alleuropeanlanguages + where diversecountries.code = alleuropeanlanguages.code) +order by capitals.code; + capital | country_lang_count | code | name +------------------+--------------------+------+--------------------------------- + Buenos Aires | 3 | ARG | Argentina + Baku | 4 | AZE | Azerbaijan + Sarajevo | 1 | BIH | Bosnia and Herzegovina + Brasilia | 5 | BRA | Brazil + Berlin | 6 | DEU | Germany + Palikir | 6 | FSM | Micronesia, Federated States of + New Delhi | 12 | IND | India + Antananarivo | 2 | MDG | Madagascar + Ciudad de Mexico | 6 | MEX | Mexico + Abuja | 10 | NGA | Nigeria + Washington | 12 | USA | United States + Caracas | 3 | VEN | Venezuela + Beograd | 6 | YUG | Yugoslavia +(13 rows) + +-- query 2 multiple CTEs being used multiple times through joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + city_cnt | lang_cnt | name | REGION_SURFACE_AREA | REGION_LIFETIME | REGION_POP | lang_count | REGION_GNP | region +----------+----------+---------------------------------------+---------------------+------------------+------------+------------+------------+--------------------------- + 4 | 5 | Afghanistan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 3 | Albania | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 18 | 2 | Algeria | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 5 | 9 | Angola | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 2 | Antigua and Barbuda | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 57 | 3 | Argentina | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 2 | Armenia | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 14 | 8 | Australia | 62471162.00 | 78.8000030517578 | 22753100 | 11 | 405851.00 | Australia and New Zealand + 6 | 8 | Austria | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 4 | 4 | Azerbaijan | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 1 | 2 | Bahamas | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 1 | 2 | Bahrain | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 24 | 7 | Bangladesh | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 1 | 2 | Barbados | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 16 | 4 | Belarus | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 9 | 6 | Belgium | 6649768.00 | 78.2555567423503 | 183247600 | 21 | 4673272.00 | Western Europe + 2 | 4 | Belize | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 4 | 7 | Benin | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Bhutan | 90749795.00 | 61.3500003814697 | 1490776000 | 54 | 810604.00 | Southern and Central Asia + 8 | 4 | Bolivia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 3 | 1 | Bosnia and Herzegovina | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 2 | 5 | Botswana | 23060186.00 | 44.8199996948242 | 46886000 | 21 | 126931.00 | Southern Africa + 250 | 5 | Brazil | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 4 | Brunei | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 10 | 4 | Bulgaria | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 3 | 6 | Burkina Faso | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 3 | Burundi | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 3 | 4 | Cambodia | 35322186.00 | 64.4000001387163 | 518541000 | 47 | 642643.00 | Southeast Asia + 7 | 8 | Cameroon | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 49 | 12 | Canada | 236342035.00 | 75.8199996948242 | 309632000 | 18 | 9111890.00 | North America + 1 | 2 | Cape Verde | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 1 | 6 | Central African Republic | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 2 | 8 | Chad | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 29 | 4 | Chile | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 38 | 5 | Colombia | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 1 | 5 | Comoros | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 2 | 6 | Congo | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | 55663022.00 | 50.3111110263401 | 95652000 | 47 | 32938.00 | Central Africa + 1 | 4 | Costa Rica | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America + 5 | 5 | Cote deIvoire | 39744907.00 | 52.7411768296186 | 221672000 | 65 | 106711.00 | Western Africa + 4 | 2 | Croatia | 5845195.40 | 76.5285720825195 | 144674200 | 22 | 2012289.00 | Southern Europe + 14 | 1 | Cuba | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 2 | 2 | Cyprus | 10153662.00 | 70.5666671329074 | 188380700 | 21 | 677260.00 | Middle East + 10 | 8 | Czech Republic | 214731845.00 | 69.9299995422363 | 307026000 | 28 | 659980.00 | Eastern Europe + 1 | 3 | Djibouti | 43631319.00 | 50.8105261953254 | 246999000 | 80 | 69925.00 | Eastern Africa + 1 | 2 | Dominica | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 6 | 2 | Dominican Republic | 363261.00 | 73.0583332379659 | 38140000 | 10 | 103586.20 | Caribbean + 15 | 2 | Ecuador | 74318167.00 | 70.9461532005897 | 345780000 | 21 | 1511874.00 | South America + 37 | 2 | Egypt | 36993520.00 | 65.3857127598354 | 173266000 | 14 | 243870.00 | Northern Africa + 7 | 2 | El Salvador | 14052371.00 | 71.0249996185303 | 135221000 | 23 | 473151.00 | Central America +(50 rows) + + +-- Queries with multiple CTEs referencing one another +-- query1 +with city_official_language as +(select city.id,city.name CITY,country.name COUNTRY,countrylanguage.language,city.population,country.capital + from city,countrylanguage,country + where city.countrycode = country.code + and country.code = countrylanguage.countrycode + and countrylanguage.isofficial = 'True' +), +capital_official_language as +(select c2.CITY, c1.COUNTRY,c1.language OFFICIAL_LANGUAGE,c1.CITY CAPITAL + from city_official_language c1 , city_official_language c2 + where c1.id = c2.capital + and c1.id != c2.id +), +alleuropeanlanguages as +(select c.COUNTRY,c.CITY,c.CAPITAL,c.OFFICIAL_LANGUAGE + from capital_official_language c, country + where c.COUNTRY = country.name + and country.continent = 'Europe' +) +select code,COUNTRY,CITY,alleuropeanlanguages.CAPITAL,OFFICIAL_LANGUAGE from alleuropeanlanguages,country +where alleuropeanlanguages.COUNTRY = country.name +and alleuropeanlanguages.city in (select CITY from city_official_language) +and alleuropeanlanguages.OFFICIAL_LANGUAGE IN (select OFFICIAL_LANGUAGE from capital_official_language) +order by code,country,city,official_language +limit 100; + code | country | city | capital | official_language +------+------------------------+--------------+---------------------+------------------- + AUT | Austria | Graz | Wien | German + AUT | Austria | Innsbruck | Wien | German + AUT | Austria | Klagenfurt | Wien | German + AUT | Austria | Linz | Wien | German + AUT | Austria | Salzburg | Wien | German + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | Dutch + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | Dutch + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | Dutch + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | French + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | French + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | French + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | German + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | German + BEL | Belgium | Antwerpen | Bruxelles [Brussel] | German + BEL | Belgium | Brugge | Bruxelles [Brussel] | Dutch + BEL | Belgium | Brugge | Bruxelles [Brussel] | Dutch + BEL | Belgium | Brugge | Bruxelles [Brussel] | Dutch + BEL | Belgium | Brugge | Bruxelles [Brussel] | French + BEL | Belgium | Brugge | Bruxelles [Brussel] | French + BEL | Belgium | Brugge | Bruxelles [Brussel] | French + BEL | Belgium | Brugge | Bruxelles [Brussel] | German + BEL | Belgium | Brugge | Bruxelles [Brussel] | German + BEL | Belgium | Brugge | Bruxelles [Brussel] | German + BEL | Belgium | Charleroi | Bruxelles [Brussel] | Dutch + BEL | Belgium | Charleroi | Bruxelles [Brussel] | Dutch + BEL | Belgium | Charleroi | Bruxelles [Brussel] | Dutch + BEL | Belgium | Charleroi | Bruxelles [Brussel] | French + BEL | Belgium | Charleroi | Bruxelles [Brussel] | French + BEL | Belgium | Charleroi | Bruxelles [Brussel] | French + BEL | Belgium | Charleroi | Bruxelles [Brussel] | German + BEL | Belgium | Charleroi | Bruxelles [Brussel] | German + BEL | Belgium | Charleroi | Bruxelles [Brussel] | German + BEL | Belgium | Gent | Bruxelles [Brussel] | Dutch + BEL | Belgium | Gent | Bruxelles [Brussel] | Dutch + BEL | Belgium | Gent | Bruxelles [Brussel] | Dutch + BEL | Belgium | Gent | Bruxelles [Brussel] | French + BEL | Belgium | Gent | Bruxelles [Brussel] | French + BEL | Belgium | Gent | Bruxelles [Brussel] | French + BEL | Belgium | Gent | Bruxelles [Brussel] | German + BEL | Belgium | Gent | Bruxelles [Brussel] | German + BEL | Belgium | Gent | Bruxelles [Brussel] | German + BEL | Belgium | Liege | Bruxelles [Brussel] | Dutch + BEL | Belgium | Liege | Bruxelles [Brussel] | Dutch + BEL | Belgium | Liege | Bruxelles [Brussel] | Dutch + BEL | Belgium | Liege | Bruxelles [Brussel] | French + BEL | Belgium | Liege | Bruxelles [Brussel] | French + BEL | Belgium | Liege | Bruxelles [Brussel] | French + BEL | Belgium | Liege | Bruxelles [Brussel] | German + BEL | Belgium | Liege | Bruxelles [Brussel] | German + BEL | Belgium | Liege | Bruxelles [Brussel] | German + BEL | Belgium | Mons | Bruxelles [Brussel] | Dutch + BEL | Belgium | Mons | Bruxelles [Brussel] | Dutch + BEL | Belgium | Mons | Bruxelles [Brussel] | Dutch + BEL | Belgium | Mons | Bruxelles [Brussel] | French + BEL | Belgium | Mons | Bruxelles [Brussel] | French + BEL | Belgium | Mons | Bruxelles [Brussel] | French + BEL | Belgium | Mons | Bruxelles [Brussel] | German + BEL | Belgium | Mons | Bruxelles [Brussel] | German + BEL | Belgium | Mons | Bruxelles [Brussel] | German + BEL | Belgium | Namur | Bruxelles [Brussel] | Dutch + BEL | Belgium | Namur | Bruxelles [Brussel] | Dutch + BEL | Belgium | Namur | Bruxelles [Brussel] | Dutch + BEL | Belgium | Namur | Bruxelles [Brussel] | French + BEL | Belgium | Namur | Bruxelles [Brussel] | French + BEL | Belgium | Namur | Bruxelles [Brussel] | French + BEL | Belgium | Namur | Bruxelles [Brussel] | German + BEL | Belgium | Namur | Bruxelles [Brussel] | German + BEL | Belgium | Namur | Bruxelles [Brussel] | German + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | Dutch + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | Dutch + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | Dutch + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | French + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | French + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | French + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | German + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | German + BEL | Belgium | Schaerbeek | Bruxelles [Brussel] | German + BGR | Bulgaria | Burgas | Sofija | Bulgariana + BGR | Bulgaria | Dobric | Sofija | Bulgariana + BGR | Bulgaria | Gumen | Sofija | Bulgariana + BGR | Bulgaria | Pleven | Sofija | Bulgariana + BGR | Bulgaria | Plovdiv | Sofija | Bulgariana + BGR | Bulgaria | Ruse | Sofija | Bulgariana + BGR | Bulgaria | Sliven | Sofija | Bulgariana + BGR | Bulgaria | Stara Zagora | Sofija | Bulgariana + BGR | Bulgaria | Varna | Sofija | Bulgariana + BIH | Bosnia and Herzegovina | Banja Luka | Sarajevo | Serbo-Croatian + BIH | Bosnia and Herzegovina | Zenica | Sarajevo | Serbo-Croatian + BLR | Belarus | Baranovitdi | Minsk | Belorussian + BLR | Belarus | Baranovitdi | Minsk | Belorussian + BLR | Belarus | Baranovitdi | Minsk | Russian + BLR | Belarus | Baranovitdi | Minsk | Russian + BLR | Belarus | Bobruisk | Minsk | Belorussian + BLR | Belarus | Bobruisk | Minsk | Belorussian + BLR | Belarus | Bobruisk | Minsk | Russian + BLR | Belarus | Bobruisk | Minsk | Russian + BLR | Belarus | Borisov | Minsk | Belorussian + BLR | Belarus | Borisov | Minsk | Belorussian + BLR | Belarus | Borisov | Minsk | Russian + BLR | Belarus | Borisov | Minsk | Russian +(100 rows) + +--query2 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + city_cnt | lang_cnt | identifier +----------+----------+--------------------------- + 494 | 10 | British Islands + 159 | 48 | Baltic Countries + 1295 | 161 | Nordic Countries + 50176 | 264 | Eastern Asia + 9414 | 369 | Western Europe + 11880 | 450 | Southern Europe + 32900 | 610 | Eastern Europe + 29161 | 616 | Southeast Asia + 8568 | 792 | Middle East + 80388 | 1092 | Southern and Central Asia +(10 rows) + +-- queries using column lists for CTEs +-- query 1 use column list despite having no duplicate names +with capitals("C","ID","CAP") as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital), +lang_total(LC,CC,CLC) as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) +select country.name,"C","ID","CAP",lang_total.lc +from capitals,lang_total,country +where capitals."C" = country.code +and country.code = lang_total.cc; + name | C | ID | CAP | lc +---------------------------------+-----+------+------------------+---- + Argentina | ARG | 69 | Buenos Aires | 3 + Azerbaijan | AZE | 144 | Baku | 4 + Bosnia and Herzegovina | BIH | 201 | Sarajevo | 1 + Brazil | BRA | 211 | Brasilia | 5 + India | IND | 1109 | New Delhi | 12 + Austria | AUT | 1523 | Wien | 8 + Yugoslavia | YUG | 1792 | Beograd | 6 + Madagascar | MDG | 2455 | Antananarivo | 2 + Mexico | MEX | 2515 | Ciudad de Mexico | 6 + Micronesia, Federated States of | FSM | 2689 | Palikir | 6 + Nigeria | NGA | 2754 | Abuja | 10 + Germany | DEU | 3068 | Berlin | 6 + Venezuela | VEN | 3539 | Caracas | 3 + Russian Federation | RUS | 3580 | Moscow | 12 + United States | USA | 3813 | Washington | 12 +(15 rows) + +-- query 2 Check case sensitivity for quoted names in column list. This should error out +with "lang_total"("LC",CC,CLC) as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) +select LC from lang_total; +ERROR: column "lc" does not exist +LINE 5: select LC from lang_total; + ^ +HINT: Perhaps you meant to reference the column "lang_total.cc" or the column "lang_total.clc". +-- query 3 use column list when there are duplicate names within the CTE +with capitals("CO_C","C_ID","CAPITAL",country) as +(select country.code,id,city.name,country.name from city,country + where city.countrycode = country.code AND city.id = country.capital) +select "CO_C","C_ID","CAPITAL",COUNTRY from capitals where "CO_C"='SMR'; + CO_C | C_ID | CAPITAL | country +------+------+------------+------------ + SMR | 3171 | San Marino | San Marino +(1 row) + +-- query4 use column list within another CTE +with capitals("CO_C","C_ID","CAPITAL",country) as +(select country.code,id,city.name,country.name from city,country + where city.countrycode = country.code AND city.id = country.capital), +south_asian_capitals(A_CO_C,"C_ID",A_C_NAME,A_CO_NAME) as +(select "CO_C","C_ID","CAPITAL",country from capitals,country where capitals."CO_C"=country.code and country.region = 'Southern and Central Asia') +select "a_co_c","C_ID",A_c_NaMe,"a_co_name" from south_asian_capitals order by A_CO_C;-- queries using CTEs in initplans and main plan + a_co_c | C_ID | a_c_name | a_co_name +--------+------+-----------+-------------- + AFG | 1 | Kabul | Afghanistan + BGD | 150 | Dhaka | Bangladesh + BTN | 192 | Thimphu | Bhutan + IND | 1109 | New Delhi | India + IRN | 1380 | Teheran | Iran + KAZ | 1864 | Astana | Kazakstan + KGZ | 2253 | Bishkek | Kyrgyzstan + LKA | 3217 | Colombo | Sri Lanka + MDV | 2463 | Male | Maldives + NPL | 2729 | Kathmandu | Nepal + PAK | 2831 | Islamabad | Pakistan + TJK | 3261 | Dushanbe | Tajikistan + TKM | 3419 | Ashgabat | Turkmenistan + UZB | 3503 | Toskent | Uzbekistan +(14 rows) + +--query1 using CTE in the select list(initplan) . One CTE using another CTE in it's initplan +with gnpstats as +( +select REG_GNP/REG_OLD_GNP as GNP_INDEX,region from +(select sum(gnpold) as REG_OLD_GNP, + sum(gnp) as REG_GNP,region + from country + group by region) FOO +where (case when (REG_GNP/REG_OLD_GNP) > 0 then 1.2 * (REG_GNP/REG_OLD_GNP) else null end) between 0.5 and 1.5 +order by region +), +gnp_index_compare as +( +select (select max(GNP_INDEX) from gnpstats) M_GNP_IDX,(gnp/gnpold) as GNP_IDX,country.name from +country where country.continent = 'Asia' +) +select (select min(GNP_IDX) from gnp_index_compare) MIN_COUNTRY_GNP_IDX, (select max(GNP_INDEX) from gnpstats) MAX_REG_GNP_IDX,city.name CAPITAL,country.name COUNTRY + from city,country where city.id = country.capital and country.continent='Europe'; + min_country_gnp_idx | max_reg_gnp_idx | capital | country +------------------------+--------------------+-----------------------------------+------------------------------- + 0.39526143942847043283 | 1.2055929013175585 | Amsterdam | Netherlands + 0.39526143942847043283 | 1.2055929013175585 | Tirana | Albania + 0.39526143942847043283 | 1.2055929013175585 | Andorra la Vella | Andorra + 0.39526143942847043283 | 1.2055929013175585 | Bruxelles [Brussel] | Belgium + 0.39526143942847043283 | 1.2055929013175585 | Sarajevo | Bosnia and Herzegovina + 0.39526143942847043283 | 1.2055929013175585 | London | United Kingdom + 0.39526143942847043283 | 1.2055929013175585 | Sofija | Bulgaria + 0.39526143942847043283 | 1.2055929013175585 | Madrid | Spain + 0.39526143942847043283 | 1.2055929013175585 | Torshavn | Faroe Islands + 0.39526143942847043283 | 1.2055929013175585 | Gibraltar | Gibraltar + 0.39526143942847043283 | 1.2055929013175585 | Longyearbyen | Svalbard and Jan Mayen + 0.39526143942847043283 | 1.2055929013175585 | Dublin | Ireland + 0.39526143942847043283 | 1.2055929013175585 | Reykjavik | Iceland + 0.39526143942847043283 | 1.2055929013175585 | Roma | Italy + 0.39526143942847043283 | 1.2055929013175585 | Wien | Austria + 0.39526143942847043283 | 1.2055929013175585 | Beograd | Yugoslavia + 0.39526143942847043283 | 1.2055929013175585 | Athenai | Greece + 0.39526143942847043283 | 1.2055929013175585 | Zagreb | Croatia + 0.39526143942847043283 | 1.2055929013175585 | Riga | Latvia + 0.39526143942847043283 | 1.2055929013175585 | Vaduz | Liechtenstein + 0.39526143942847043283 | 1.2055929013175585 | Vilnius | Lithuania + 0.39526143942847043283 | 1.2055929013175585 | Luxembourg [Luxemburg/Letzebuerg] | Luxembourg + 0.39526143942847043283 | 1.2055929013175585 | Skopje | Macedonia + 0.39526143942847043283 | 1.2055929013175585 | Valletta | Malta + 0.39526143942847043283 | 1.2055929013175585 | Chisinau | Moldova + 0.39526143942847043283 | 1.2055929013175585 | Monaco-Ville | Monaco + 0.39526143942847043283 | 1.2055929013175585 | Oslo | Norway + 0.39526143942847043283 | 1.2055929013175585 | Lisboa | Portugal + 0.39526143942847043283 | 1.2055929013175585 | Warszawa | Poland + 0.39526143942847043283 | 1.2055929013175585 | Paris | France + 0.39526143942847043283 | 1.2055929013175585 | Bucuresti | Romania + 0.39526143942847043283 | 1.2055929013175585 | Stockholm | Sweden + 0.39526143942847043283 | 1.2055929013175585 | Berlin | Germany + 0.39526143942847043283 | 1.2055929013175585 | San Marino | San Marino + 0.39526143942847043283 | 1.2055929013175585 | Bratislava | Slovakia + 0.39526143942847043283 | 1.2055929013175585 | Ljubljana | Slovenia + 0.39526143942847043283 | 1.2055929013175585 | Helsinki [Helsingfors] | Finland + 0.39526143942847043283 | 1.2055929013175585 | Bern | Switzerland + 0.39526143942847043283 | 1.2055929013175585 | Kobenhavn | Denmark + 0.39526143942847043283 | 1.2055929013175585 | Praha | Czech Republic + 0.39526143942847043283 | 1.2055929013175585 | Kyiv | Ukraine + 0.39526143942847043283 | 1.2055929013175585 | Budapest | Hungary + 0.39526143942847043283 | 1.2055929013175585 | Minsk | Belarus + 0.39526143942847043283 | 1.2055929013175585 | Citta del Vaticano | Holy See (Vatican City State) + 0.39526143942847043283 | 1.2055929013175585 | Moscow | Russian Federation + 0.39526143942847043283 | 1.2055929013175585 | Tallinn | Estonia +(46 rows) + +--query2 using the CTE in the where clause(initplan) of the main query. One CTE using another CTE in it's where clause as it's initplan +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000), +notdiversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) < 3) d + where d.countrycode = country.code and country.gnp > 100000 + and d.CNT < (select max(CNT) from diversecountries)) +select LANG_CNT,name from +( +select count(*) LANG_CNT,country.name,country.code from country,countrylanguage +where country.code = countrylanguage.countrycode and country.continent = 'North America' +group by country.name,country.code +) FOO +where FOO.LANG_CNT between (select min(CNT) from notdiversecountries) AND (select max(CNT) from diversecountries); + lang_cnt | name +----------+---------------------------------- + 2 | Jamaica + 2 | Barbados + 2 | El Salvador + 2 | Greenland + 5 | Guatemala + 1 | Bermuda + 12 | United States + 3 | Trinidad and Tobago + 1 | Montserrat + 3 | Virgin Islands, U.S. + 1 | Cuba + 2 | Haiti + 4 | Nicaragua + 12 | Canada + 2 | Saint Vincent and the Grenadines + 2 | Dominican Republic + 2 | Bahamas + 2 | Antigua and Barbuda + 4 | Aruba + 4 | Costa Rica + 1 | Grenada + 2 | Saint Kitts and Nevis + 2 | Puerto Rico + 6 | Panama + 2 | Martinique + 1 | Anguilla + 1 | Cayman Islands + 1 | Virgin Islands, British + 4 | Honduras + 2 | Saint Lucia + 1 | Saint Pierre and Miquelon + 4 | Belize + 1 | Turks and Caicos Islands + 2 | Dominica + 6 | Mexico + 2 | Guadeloupe + 3 | Netherlands Antilles +(37 rows) + +--query3 using CTE more than once in the same initplan and also more than once in the main query +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +all_official_languages as +( + select country.code,country.name,alleuropeanlanguages.language,alleuropeanlanguages.percentage + from + country,alleuropeanlanguages + where country.code = alleuropeanlanguages.code and isofficial = 'True' + and country.governmentform NOT IN (select 'Commonwealth of the US' UNION ALL select 'Monarchy (Sultanate)' UNION ALL select 'Monarchy') + and country.gnp > (select min(gnpold) from country where country.region = 'Western Europe') +) +SELECT avg(percentage),language +FROM +( +select country.name,city.name,percentage,language +from country,city,all_official_languages +where country.code = all_official_languages.code and country.capital = city.id and country.continent = 'Europe' +UNION ALL +select country.name,city.name,percentage,language +from country,city,all_official_languages +where country.code = all_official_languages.code and country.capital = city.id and country.continent = 'Asia' +) FOO +group by FOO.language +HAVING avg(percentage) >= +(select avg(percentage) from +( select percentage from all_official_languages,country where country.code = all_official_languages.code and country.region = 'British Islands' + UNION + select percentage from all_official_languages,country where country.code = all_official_languages.code and country.region = 'Western Europe' +) FOO ) +order by FOO.language; + avg | language +------------------+---------------- + 97.9000015258789 | Albaniana + 65.5999984741211 | Belorussian + 83.1999969482422 | Bulgariana + 81.1999969482422 | Czech + 93.5 | Danish + 77.3999996185303 | Dutch + 65.9333348274231 | English + 65.3000030517578 | Estonian + 92.6999969482422 | Finnish + 56.5333335796992 | German + 98.5 | Greek + 98.5 | Hungarian + 95.6999969482422 | Icelandic + 50.8999991416931 | Italian + 55.0999984741211 | Latvian + 81.5999984741211 | Lithuanian + 64.4000015258789 | Luxembourgish + 66.5 | Macedonian + 95.8000030517578 | Maltese + 96.5999984741211 | Norwegian + 97.5999984741211 | Polish + 99 | Portuguese + 76.2999992370605 | Romanian + 59.2999992370605 | Russian + 90.0999984741211 | Serbo-Croatian + 85.5999984741211 | Slovak + 87.9000015258789 | Slovene + 74.4000015258789 | Spanish + 64.6999969482422 | Ukrainian +(29 rows) + +-- queries using deeply nested CTEs +-- query1 using a CTE at every subquery level +select avg(population),CITY +from +( +with size0_cities(CITY,POPULATION) as (select city.name,city.population from city where city.population >= 100) +select CITY,POPULATION from +( + with size1_cities(CITY,POPULATION) as ( select city,population from size0_cities where population >= 1000 ) + select CITY,POPULATION from + ( + with size2_cities(CITY,POPULATION) as (select city,population from size1_cities where population >= 10000) + select CITY,POPULATION from + ( + with size3_cities as (select city,population from size2_cities where population >= 20000) + select CITY,POPULATION from + ( + with size4_cities as (select city,population from size3_cities where population >= 50000) + select CITY,POPULATION from + ( + with size5_cities as (select city,population from size4_cities where population >= 80000) + select CITY,POPULATION from + ( + with size6_cities as (select city,population from size5_cities where population >= 150000) + select CITY,POPULATION from + ( + with size7_cities as (select city,population from size6_cities where population >= 200000) + select CITY,POPULATION from + ( + with size8_cities as (select city,population from size7_cities where population >= 250000) + select CITY,POPULATION from + ( + with size9_cities as (select city,population from size8_cities where population >= 300000) + select city,population from + ( + with size10_cities as (select city,population from size9_cities where population >= 6500000) + select CITY,POPULATION from + ( + with size11_cities as (select city,population from size10_cities where population >= 7000000) + select s1.city,s1.population from size11_cities s1,size10_cities s2 + ) FOO11 + ) FOO10 + ) FOO9 + ) FOO8 + ) FOO7 + ) FOO6 + ) FOO5 + ) FOO4 + )FOO3 + ) FOO2 +) FOO1 order by city +) FOO0 group by city order by city; + avg | city +-----------------------+------------------ + 8591309.000000000000 | Ciudad de Mexico + 7206704.000000000000 | Delhi + 8787958.000000000000 | Istanbul + 9604900.000000000000 | Jakarta + 9269265.000000000000 | Karachi + 7285000.000000000000 | London + 8389200.000000000000 | Moscow + 10500000.000000000000 | Mumbai (Bombay) + 8008278.000000000000 | New York + 7472000.000000000000 | Peking + 9968485.000000000000 | Sao Paulo + 9981619.000000000000 | Seoul + 9696300.000000000000 | Shanghai + 7980230.000000000000 | Tokyo +(14 rows) + +--query 2 deeply nested CTEs with shared scans in the plan +select avg(population),CITY +from +( +with size0_cities(CITY,POPULATION) as (select city.name,city.population from city where city.population >= 100) +select CITY,POPULATION from +( + with size1_cities(CITY,POPULATION) as ( select city,population from size0_cities where population >= 1000 ) + select CITY,POPULATION from + ( + with size2_cities(CITY,POPULATION) as (select city,population from size1_cities where population >= 10000) + select CITY,POPULATION from + ( + with size3_cities as (select city,population from size2_cities where population >= 20000) + select CITY,POPULATION from + ( + with size4_cities as (select city,population from size3_cities where population >= 50000) + select CITY,POPULATION from + ( + with size5_cities as (select city,population from size4_cities where population >= 80000) + select CITY,POPULATION from + ( + with size6_cities as (select city,population from size5_cities where population >= 150000) + select CITY,POPULATION from + ( + with size7_cities as (select city,population from size6_cities where population >= 200000) + select CITY,POPULATION from + ( + with size8_cities as (select city,population from size7_cities where population >= 250000) + select CITY,POPULATION from + ( + with size9_cities as (select city,population from size8_cities where population >= 300000) + select city,population from + ( + with size10_cities as (select city,population from size9_cities where population >= 6500000) + select CITY,POPULATION from + ( + with size11_cities as (select city,population from size10_cities where population >= 7000000) + select s1.city,s1.population from size11_cities s1,size10_cities s2 + ) FOO11 + ) FOO10 + ) FOO9 + ) FOO8 + ) FOO7 + ) FOO6 + ) FOO5 + ) FOO4 + )FOO3 + ) FOO2 +) FOO1 order by city +) FOO0 group by city order by city; + avg | city +-----------------------+------------------ + 8591309.000000000000 | Ciudad de Mexico + 7206704.000000000000 | Delhi + 8787958.000000000000 | Istanbul + 9604900.000000000000 | Jakarta + 9269265.000000000000 | Karachi + 7285000.000000000000 | London + 8389200.000000000000 | Moscow + 10500000.000000000000 | Mumbai (Bombay) + 8008278.000000000000 | New York + 7472000.000000000000 | Peking + 9968485.000000000000 | Sao Paulo + 9981619.000000000000 | Seoul + 9696300.000000000000 | Shanghai + 7980230.000000000000 | Tokyo +(14 rows) + +-- query 3 deeply nested CTEs using every CTE defined +select avg(population) avg_p,CITY +from +( +with size0_cities(CITY,POPULATION) as (select city.name,city.population from city where city.population >= 350000) +select CITY,POPULATION from +( + with size1_cities(CITY,POPULATION) as ( select city,population from size0_cities where population >= 360000 ) + select CITY,POPULATION from + ( + with size2_cities(CITY,POPULATION) as (select city,population from size1_cities where population >= 370000) + select CITY,POPULATION from + ( + with size3_cities as (select city,population from size2_cities where population >= 380000) + select CITY,POPULATION from + ( + with size4_cities as (select city,population from size3_cities where population >= 390000) + select CITY,POPULATION from + ( + with size5_cities as (select city,population from size4_cities where population >= 400000) + select CITY,POPULATION from + ( + with size6_cities as (select city,population from size5_cities where population >= 410000) + select CITY,POPULATION from + ( + with size7_cities as (select city,population from size6_cities where population >= 420000) + select CITY,POPULATION from + ( + with size8_cities as (select city,population from size7_cities where population >= 430000) + select CITY,POPULATION from + ( + with size9_cities as (select city,population from size8_cities where population >= 440000) + select city,population from + ( + with size10_cities as (select city,population from size9_cities where population >= 6500000) + select CITY,POPULATION from + ( + with size11_cities as (select city,population from size10_cities where population >= 7000000) + select s1.city,s1.population from size11_cities s1,size1_cities s2 + UNION + select s1.city,s1.population from size10_cities s1,size2_cities s2 + UNION + select s1.city,s1.population from size9_cities s1,size3_cities s2 + UNION + select s1.city,s1.population from size8_cities s1,size4_cities s2 + UNION + select s1.city,s1.population from size7_cities s1,size5_cities s2 + UNION + select s1.city,s1.population from size6_cities s1,size6_cities s2 + ) FOO11 + ) FOO10 + ) FOO9 + ) FOO8 + ) FOO7 + ) FOO6 + ) FOO5 + ) FOO4 + )FOO3 + ) FOO2 +) FOO1 order by city +) FOO0 group by city order by avg_p,city +LIMIT 20; + avg_p | city +---------------------+---------------- + 410000.000000000000 | Port Harcourt + 410102.000000000000 | Alberton + 410407.000000000000 | Xiangfan + 410775.000000000000 | Pingdingshan + 411542.000000000000 | Bhubaneswar + 411822.000000000000 | General Santos + 412639.000000000000 | Kaunas + 415346.000000000000 | San Salvador + 415466.000000000000 | Panzhihua + 416100.000000000000 | al-Taif + 416289.000000000000 | Bikaner + 416428.000000000000 | Matamoros + 416474.000000000000 | Atlanta + 416988.000000000000 | Szczecin + 417517.000000000000 | Kisangani + 417597.000000000000 | Sialkot + 417610.000000000000 | Suez + 417748.000000000000 | Rasht + 417810.000000000000 | Kolwezi + 418624.000000000000 | Kirkuk +(20 rows) + +-- sanity tests with queries using CTEs in insert,update,delete and create +-- query 1 CTAS using CTE +create table bad_headofstates as +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select OUTERMOST_FOO.*,bad_headofstates.headofstate from ( +select avg(population),region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +order by OUTERMOST_FOO.region,bad_headofstates.headofstate LIMIT 40 +); +select * from bad_headofstates order by region,headofstate; + avg | region | headofstate +-----------------------+---------------------------+---------------------------------- + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Fidel Castro Ruz + 744388.888888888889 | Caribbean | George W. Bush + 744388.888888888889 | Caribbean | Jacques Chirac + 7651000.000000000000 | Central Africa | Idriss Deby + 2657500.000000000000 | Central America | Arnoldo Aleman Lacayo + 2657500.000000000000 | Central America | Elisabeth II + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Bakili Muluzi + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | Isayas Afewerki [Isaias Afwerki] + 5982809.523809523810 | Eastern Africa | Ismail Omar Guelleh + 5982809.523809523810 | Eastern Africa | Jacques Chirac + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Robert G. Mugabe + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Jiang Zemin +(40 rows) + +--query 2 insert using CTE +insert into bad_headofstates +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select OUTERMOST_FOO.*,bad_headofstates.headofstate from ( +select avg(population),region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +order by OUTERMOST_FOO.region,bad_headofstates.headofstate LIMIT 40 +); +select * from bad_headofstates order by region,headofstate; + avg | region | headofstate +-----------------------+---------------------------+---------------------------------- + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Beatrix + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Elisabeth II + 744388.888888888889 | Caribbean | Fidel Castro Ruz + 744388.888888888889 | Caribbean | Fidel Castro Ruz + 744388.888888888889 | Caribbean | George W. Bush + 744388.888888888889 | Caribbean | George W. Bush + 744388.888888888889 | Caribbean | Jacques Chirac + 744388.888888888889 | Caribbean | Jacques Chirac + 7651000.000000000000 | Central Africa | Idriss Deby + 7651000.000000000000 | Central Africa | Idriss Deby + 2657500.000000000000 | Central America | Arnoldo Aleman Lacayo + 2657500.000000000000 | Central America | Arnoldo Aleman Lacayo + 2657500.000000000000 | Central America | Elisabeth II + 2657500.000000000000 | Central America | Elisabeth II + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Bakili Muluzi + 5982809.523809523810 | Eastern Africa | Bakili Muluzi + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | Isayas Afewerki [Isaias Afwerki] + 5982809.523809523810 | Eastern Africa | Isayas Afewerki [Isaias Afwerki] + 5982809.523809523810 | Eastern Africa | Ismail Omar Guelleh + 5982809.523809523810 | Eastern Africa | Ismail Omar Guelleh + 5982809.523809523810 | Eastern Africa | Jacques Chirac + 5982809.523809523810 | Eastern Africa | Jacques Chirac + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Robert G. Mugabe + 5982809.523809523810 | Eastern Africa | Robert G. Mugabe + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Jiang Zemin + 34288500.000000000000 | Eastern Asia | Jiang Zemin +(80 rows) + +--query3 update using CTE +update bad_headofstates set region = cm.region FROM +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select avg(OUTERMOST_FOO.AVG),OUTERMOST_FOO.region from ( +select avg(population) AVG,region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +and OUTERMOST_FOO.region = 'Central America' +group by OUTERMOST_FOO.region +order by OUTERMOST_FOO.region +) cm +where bad_headofstates.region = 'Caribbean'; + +select * from bad_headofstates order by avg,region,headofstate; + avg | region | headofstate +-----------------------+---------------------------+---------------------------------- + 744388.888888888889 | Central America | Beatrix + 744388.888888888889 | Central America | Beatrix + 744388.888888888889 | Central America | Beatrix + 744388.888888888889 | Central America | Beatrix + 744388.888888888889 | Central America | Beatrix + 744388.888888888889 | Central America | Beatrix + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Elisabeth II + 744388.888888888889 | Central America | Fidel Castro Ruz + 744388.888888888889 | Central America | Fidel Castro Ruz + 744388.888888888889 | Central America | George W. Bush + 744388.888888888889 | Central America | George W. Bush + 744388.888888888889 | Central America | Jacques Chirac + 744388.888888888889 | Central America | Jacques Chirac + 2657500.000000000000 | Central America | Arnoldo Aleman Lacayo + 2657500.000000000000 | Central America | Arnoldo Aleman Lacayo + 2657500.000000000000 | Central America | Elisabeth II + 2657500.000000000000 | Central America | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Bakili Muluzi + 5982809.523809523810 | Eastern Africa | Bakili Muluzi + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | Isayas Afewerki [Isaias Afwerki] + 5982809.523809523810 | Eastern Africa | Isayas Afewerki [Isaias Afwerki] + 5982809.523809523810 | Eastern Africa | Ismail Omar Guelleh + 5982809.523809523810 | Eastern Africa | Ismail Omar Guelleh + 5982809.523809523810 | Eastern Africa | Jacques Chirac + 5982809.523809523810 | Eastern Africa | Jacques Chirac + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Robert G. Mugabe + 5982809.523809523810 | Eastern Africa | Robert G. Mugabe + 7651000.000000000000 | Central Africa | Idriss Deby + 7651000.000000000000 | Central Africa | Idriss Deby + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Jiang Zemin + 34288500.000000000000 | Eastern Asia | Jiang Zemin +(80 rows) + +--query4 delete using CTE +delete from bad_headofstates USING +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select avg(OUTERMOST_FOO.AVG),OUTERMOST_FOO.region from ( +select avg(population) AVG,region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +and OUTERMOST_FOO.region = 'Central America' +group by OUTERMOST_FOO.region +order by OUTERMOST_FOO.region +) as cm +where bad_headofstates.region = cm.region; +select * from bad_headofstates order by region,headofstate; + avg | region | headofstate +-----------------------+---------------------------+---------------------------------- + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 7651000.000000000000 | Central Africa | Idriss Deby + 7651000.000000000000 | Central Africa | Idriss Deby + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Abdiqassim Salad Hassan + 5982809.523809523810 | Eastern Africa | Bakili Muluzi + 5982809.523809523810 | Eastern Africa | Bakili Muluzi + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | France-Albert Rene + 5982809.523809523810 | Eastern Africa | Isayas Afewerki [Isaias Afwerki] + 5982809.523809523810 | Eastern Africa | Isayas Afewerki [Isaias Afwerki] + 5982809.523809523810 | Eastern Africa | Ismail Omar Guelleh + 5982809.523809523810 | Eastern Africa | Ismail Omar Guelleh + 5982809.523809523810 | Eastern Africa | Jacques Chirac + 5982809.523809523810 | Eastern Africa | Jacques Chirac + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Paul Kagame + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Pierre Buyoya + 5982809.523809523810 | Eastern Africa | Robert G. Mugabe + 5982809.523809523810 | Eastern Africa | Robert G. Mugabe + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Jiang Zemin + 34288500.000000000000 | Eastern Asia | Jiang Zemin +(44 rows) + +-- delete using CTE in its subplan +delete from bad_headofstates where bad_headofstates.avg NOT IN +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select OUTERMOST_FOO.AVG from ( +select avg(population) AVG,region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +and OUTERMOST_FOO.region = 'Australia and New Zealand' or OUTERMOST_FOO.region = 'Eastern Asia' +order by OUTERMOST_FOO.region +); +select * from bad_headofstates order by region,headofstate; + avg | region | headofstate +-----------------------+---------------------------+---------------- + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 4550620.000000000000 | Australia and New Zealand | Elisabeth II + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Akihito + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Chen Shui-bian + 34288500.000000000000 | Eastern Asia | Jiang Zemin + 34288500.000000000000 | Eastern Asia | Jiang Zemin +(16 rows) + +drop table bad_headofstates; +-- queries with views using CTEs +-- view1 with multiple CTEs being used multiple times +create view view_with_shared_scans as +( +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 +UNION ALL +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +); +\d+ view_with_shared_scans; + View "qp_with_clause.view_with_shared_scans" + Column | Type | Collation | Nullable | Default | Storage | Description +---------------------+------------------+-----------+----------+---------+----------+------------- + city_cnt | bigint | | | | plain | + lang_cnt | bigint | | | | plain | + name | text | | | | extended | + REGION_SURFACE_AREA | numeric | | | | main | + REGION_LIFETIME | double precision | | | | plain | + REGION_POP | bigint | | | | plain | + lang_count | bigint | | | | plain | + REGION_GNP | numeric | | | | main | + region | text | | | | extended | +View definition: + WITH longlivingregions AS ( + SELECT foo."REGION_POP", + foo."REGION_GNP", + foo."REGION_LIFETIME", + foo.region, + count(DISTINCT countrylanguage.language) AS lang_count + FROM ( SELECT sum(country_1.population) AS "REGION_POP", + sum(country_1.gnp) AS "REGION_GNP", + avg(country_1.lifeexpectancy) AS "REGION_LIFETIME", + country_1.region + FROM country country_1 + GROUP BY country_1.region) foo, + countrylanguage, + country + WHERE country.code = countrylanguage.countrycode AND foo.region = country.region + GROUP BY foo.region, foo."REGION_POP", foo."REGION_GNP", foo."REGION_LIFETIME" + ), denseregions AS ( + SELECT foo."REGION_POP", + foo."REGION_GNP", + foo.region, + count(DISTINCT countrylanguage.language) AS lang_count, + sum(country.surfacearea) AS "REGION_SURFACE_AREA" + FROM ( SELECT sum(country_1.population) AS "REGION_POP", + sum(country_1.gnp) AS "REGION_GNP", + country_1.region + FROM country country_1 + GROUP BY country_1.region) foo, + countrylanguage, + country + WHERE country.code = countrylanguage.countrycode AND foo.region = country.region AND foo."REGION_POP" <> 0 + GROUP BY foo.region, foo."REGION_POP", foo."REGION_GNP" + ORDER BY (sum(country.surfacearea) / foo."REGION_POP"::numeric) DESC + ), allcountrystats AS ( + SELECT country.code, + country.name, + count(DISTINCT city.id) AS city_cnt, + count(DISTINCT countrylanguage.language) AS lang_cnt + FROM country, + city, + countrylanguage + WHERE country.code = city.countrycode AND country.code = countrylanguage.countrycode + GROUP BY country.code, country.name + ) + SELECT allcountrystats.city_cnt, + allcountrystats.lang_cnt, + allcountrystats.name, + denseregions."REGION_SURFACE_AREA", + longlivingregions."REGION_LIFETIME", + longlivingregions."REGION_POP", + longlivingregions.lang_count, + longlivingregions."REGION_GNP", + longlivingregions.region + FROM longlivingregions, + denseregions, + allcountrystats, + country + WHERE longlivingregions.region = denseregions.region AND allcountrystats.code = country.code AND country.region = longlivingregions.region AND country.indepyear >= 1800 AND country.indepyear <= 1850 +UNION ALL + SELECT allcountrystats.city_cnt, + allcountrystats.lang_cnt, + allcountrystats.name, + denseregions."REGION_SURFACE_AREA", + longlivingregions."REGION_LIFETIME", + longlivingregions."REGION_POP", + longlivingregions.lang_count, + longlivingregions."REGION_GNP", + longlivingregions.region + FROM longlivingregions, + denseregions, + allcountrystats, + country + WHERE longlivingregions.region = denseregions.region AND allcountrystats.code = country.code AND country.region = longlivingregions.region AND country.indepyear >= 1850 AND country.indepyear <= 1900 +UNION ALL + SELECT allcountrystats.city_cnt, + allcountrystats.lang_cnt, + allcountrystats.name, + denseregions."REGION_SURFACE_AREA", + longlivingregions."REGION_LIFETIME", + longlivingregions."REGION_POP", + longlivingregions.lang_count, + longlivingregions."REGION_GNP", + longlivingregions.region + FROM longlivingregions, + denseregions, + allcountrystats, + country + WHERE longlivingregions.region = denseregions.region AND allcountrystats.code = country.code AND country.region = longlivingregions.region AND country.indepyear > 1900; + +select city_cnt,lang_cnt,name,region from view_with_shared_scans order by name LIMIT 50; + city_cnt | lang_cnt | name | region +----------+----------+---------------------------------------+--------------------------- + 4 | 5 | Afghanistan | Southern and Central Asia + 1 | 3 | Albania | Southern Europe + 18 | 2 | Algeria | Northern Africa + 5 | 9 | Angola | Central Africa + 1 | 2 | Antigua and Barbuda | Caribbean + 57 | 3 | Argentina | South America + 3 | 2 | Armenia | Middle East + 14 | 8 | Australia | Australia and New Zealand + 6 | 8 | Austria | Western Europe + 4 | 4 | Azerbaijan | Middle East + 1 | 2 | Bahamas | Caribbean + 1 | 2 | Bahrain | Middle East + 24 | 7 | Bangladesh | Southern and Central Asia + 1 | 2 | Barbados | Caribbean + 16 | 4 | Belarus | Eastern Europe + 9 | 6 | Belgium | Western Europe + 2 | 4 | Belize | Central America + 4 | 7 | Benin | Western Africa + 1 | 3 | Bhutan | Southern and Central Asia + 8 | 4 | Bolivia | South America + 3 | 1 | Bosnia and Herzegovina | Southern Europe + 2 | 5 | Botswana | Southern Africa + 250 | 5 | Brazil | South America + 1 | 4 | Brunei | Southeast Asia + 10 | 4 | Bulgaria | Eastern Europe + 3 | 6 | Burkina Faso | Western Africa + 1 | 3 | Burundi | Eastern Africa + 3 | 4 | Cambodia | Southeast Asia + 7 | 8 | Cameroon | Central Africa + 49 | 12 | Canada | North America + 1 | 2 | Cape Verde | Western Africa + 1 | 6 | Central African Republic | Central Africa + 2 | 8 | Chad | Central Africa + 29 | 4 | Chile | South America + 38 | 5 | Colombia | South America + 1 | 5 | Comoros | Eastern Africa + 2 | 6 | Congo | Central Africa + 18 | 10 | Congo, The Democratic Republic of the | Central Africa + 1 | 4 | Costa Rica | Central America + 5 | 5 | Cote deIvoire | Western Africa + 4 | 2 | Croatia | Southern Europe + 14 | 1 | Cuba | Caribbean + 2 | 2 | Cyprus | Middle East + 10 | 8 | Czech Republic | Eastern Europe + 1 | 3 | Djibouti | Eastern Africa + 1 | 2 | Dominica | Caribbean + 6 | 2 | Dominican Republic | Caribbean + 15 | 2 | Ecuador | South America + 37 | 2 | Egypt | Northern Africa + 7 | 2 | El Salvador | Central America +(50 rows) + +select city_cnt,lang_cnt,name,"REGION_POP","REGION_GNP",region from view_with_shared_scans where region = 'Eastern Europe'; + city_cnt | lang_cnt | name | REGION_POP | REGION_GNP | region +----------+----------+--------------------+------------+------------+---------------- + 29 | 6 | Romania | 307026000 | 659980.00 | Eastern Europe + 10 | 4 | Bulgaria | 307026000 | 659980.00 | Eastern Europe + 16 | 4 | Belarus | 307026000 | 659980.00 | Eastern Europe + 10 | 8 | Czech Republic | 307026000 | 659980.00 | Eastern Europe + 9 | 6 | Hungary | 307026000 | 659980.00 | Eastern Europe + 4 | 5 | Moldova | 307026000 | 659980.00 | Eastern Europe + 44 | 4 | Poland | 307026000 | 659980.00 | Eastern Europe + 189 | 12 | Russian Federation | 307026000 | 659980.00 | Eastern Europe + 3 | 5 | Slovakia | 307026000 | 659980.00 | Eastern Europe + 57 | 7 | Ukraine | 307026000 | 659980.00 | Eastern Europe +(10 rows) + +drop view view_with_shared_scans; +-- start_ignore +drop table if exists tbl87; +NOTICE: table "tbl87" does not exist, skipping +-- end_ignore +create table tbl87(code char(3), n numeric); +insert into tbl87 values ('abc',1); +insert into tbl87 values ('xyz',2); +insert into tbl87 values ('def',3); +with cte as + ( + select code, n, x + from tbl87 + , (select 100 as x) d + ) +select code from tbl87 t where 1= (select count(*) from cte where cte.code::text=t.code::text or cte.code::text = t.code::text); + code +------ + abc + xyz + def +(3 rows) + +with cte as + ( + select count(*) from + ( + select code, n, x + from tbl87 + , (select 100 as x) d + ) FOO + ) +select code from tbl87 t where 1= (select * from cte); + code +------ +(0 rows) + +with cte as + ( + select count(*) from + ( + select code, n, x + from tbl87 + , (select 100 as x) d + ) FOO + ) +select code from tbl87 t where 1= (select count(*) from cte); + code +------ + abc + xyz + def +(3 rows) + +--start_ignore +drop table if exists foo; +NOTICE: table "foo" does not exist, skipping +drop table if exists bar; +NOTICE: table "bar" does not exist, skipping +drop table if exists emp; +NOTICE: table "emp" does not exist, skipping +drop table if exists manager; +NOTICE: table "manager" does not exist, skipping +--end_ignore +------------------------------------------------------------------------------------------------------------------------------- +CREATE TABLE foo (key INTEGER, value INTEGER); +INSERT INTO foo SELECT i, i % 10 from generate_series(1, 100) i; +CREATE TABLE bar(bar_key INTEGER, bar_value INTEGER); +INSERT INTO bar SELECT i, i % 5 FROM generate_series(1, 1000) i; +SET enable_hashjoin = OFF; +SET enable_mergejoin = OFF; +SET enable_nestloop = ON; +------------------- +-- QUERY 1 +------------------- +-- Query has WITH clause +-- WITH clause subquery used once +-- The subquery in the WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is disabled +SET gp_cte_sharing = OFF; +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key) +-- SELECT o.key, bar_value FROM o, bar +-- WHERE +-- o.key != bar_value +-- ORDER BY 1, 2 LIMIT 20; +WITH o AS (SELECT * FROM foo AS o_key) + SELECT o.key, bar_value FROM o, bar +WHERE +o.key != bar_value +ORDER BY 1, 2 LIMIT 20; + key | bar_value +-----+----------- + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 +(20 rows) + +-- Query has WITH clause +-- WITH clause subquery used once +-- The subquery in the WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is disabled +SET gp_cte_sharing = ON; +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key) +-- SELECT o.key, bar_value FROM o, bar +-- WHERE +-- o.key != bar_value +-- ORDER BY 1, 2 LIMIT 20; +WITH o AS (SELECT * FROM foo AS o_key) + SELECT o.key, bar_value FROM o, bar +WHERE +o.key != bar_value +ORDER BY 1, 2 LIMIT 20; + key | bar_value +-----+----------- + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 +(20 rows) + +------------------- +-- Query 2, Query 3 +------------------- +-- Query has WITH clause +-- WITH clause subquery used multiple times +-- The subquery in the WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is disabled +SET gp_cte_sharing = OFF; +-- EXPLAIN +-- WITH o as (SELECT * FROM foo AS o_key) +-- SELECT o1.key, o2.value FROM o o1, o o2 +-- WHERE o1.key != o2.value ORDER BY 1, 2 DESC LIMIT 100; +WITH o as (SELECT * FROM foo AS o_key) + SELECT o1.key, o2.value FROM o o1, o o2 + WHERE o1.key != o2.value ORDER BY 1, 2 DESC LIMIT 100; + key | value +-----+------- + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 +(100 rows) + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo), +-- n AS (SELECT * FROM foo) +-- SELECT o.key , n.value +-- FROM +-- o JOIN n ON o.key = n.key +-- WHERE +-- o.key != n.value +-- ORDER BY 1, 2; +WITH o AS (SELECT * FROM foo), + n AS (SELECT * FROM foo) +SELECT o.key , n.value +FROM +o JOIN n ON o.key = n.key +WHERE +o.key != n.value +ORDER BY 1, 2; + key | value +-----+------- + 10 | 0 + 11 | 1 + 12 | 2 + 13 | 3 + 14 | 4 + 15 | 5 + 16 | 6 + 17 | 7 + 18 | 8 + 19 | 9 + 20 | 0 + 21 | 1 + 22 | 2 + 23 | 3 + 24 | 4 + 25 | 5 + 26 | 6 + 27 | 7 + 28 | 8 + 29 | 9 + 30 | 0 + 31 | 1 + 32 | 2 + 33 | 3 + 34 | 4 + 35 | 5 + 36 | 6 + 37 | 7 + 38 | 8 + 39 | 9 + 40 | 0 + 41 | 1 + 42 | 2 + 43 | 3 + 44 | 4 + 45 | 5 + 46 | 6 + 47 | 7 + 48 | 8 + 49 | 9 + 50 | 0 + 51 | 1 + 52 | 2 + 53 | 3 + 54 | 4 + 55 | 5 + 56 | 6 + 57 | 7 + 58 | 8 + 59 | 9 + 60 | 0 + 61 | 1 + 62 | 2 + 63 | 3 + 64 | 4 + 65 | 5 + 66 | 6 + 67 | 7 + 68 | 8 + 69 | 9 + 70 | 0 + 71 | 1 + 72 | 2 + 73 | 3 + 74 | 4 + 75 | 5 + 76 | 6 + 77 | 7 + 78 | 8 + 79 | 9 + 80 | 0 + 81 | 1 + 82 | 2 + 83 | 3 + 84 | 4 + 85 | 5 + 86 | 6 + 87 | 7 + 88 | 8 + 89 | 9 + 90 | 0 + 91 | 1 + 92 | 2 + 93 | 3 + 94 | 4 + 95 | 5 + 96 | 6 + 97 | 7 + 98 | 8 + 99 | 9 + 100 | 0 +(91 rows) + +-- Query has WITH clause +-- Subquery using WITH clause multiple times +-- The subquery in the WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is enabled +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH o AS (SELECT * FROM foo AS o_key) +-- SELECT o1.key, o2.value FROM o o1, o o2 +-- WHERE o1.key != o2.value ORDER BY 1, 2 DESC LIMIT 100; +WITH o AS (SELECT * FROM foo AS o_key) + SELECT o1.key, o2.value FROM o o1, o o2 + WHERE o1.key != o2.value ORDER BY 1, 2 DESC LIMIT 100; + key | value +-----+------- + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 +(100 rows) + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo), +-- n AS (SELECT * FROM foo) +-- SELECT o.key , n.value +-- FROM +-- o JOIN n ON o.key = n.key +-- WHERE +-- o.key != n.value +-- ORDER BY 1, 2; +WITH o AS (SELECT * FROM foo), + n AS (SELECT * FROM foo) +SELECT o.key , n.value +FROM +o JOIN n ON o.key = n.key +WHERE +o.key != n.value +ORDER BY 1, 2; + key | value +-----+------- + 10 | 0 + 11 | 1 + 12 | 2 + 13 | 3 + 14 | 4 + 15 | 5 + 16 | 6 + 17 | 7 + 18 | 8 + 19 | 9 + 20 | 0 + 21 | 1 + 22 | 2 + 23 | 3 + 24 | 4 + 25 | 5 + 26 | 6 + 27 | 7 + 28 | 8 + 29 | 9 + 30 | 0 + 31 | 1 + 32 | 2 + 33 | 3 + 34 | 4 + 35 | 5 + 36 | 6 + 37 | 7 + 38 | 8 + 39 | 9 + 40 | 0 + 41 | 1 + 42 | 2 + 43 | 3 + 44 | 4 + 45 | 5 + 46 | 6 + 47 | 7 + 48 | 8 + 49 | 9 + 50 | 0 + 51 | 1 + 52 | 2 + 53 | 3 + 54 | 4 + 55 | 5 + 56 | 6 + 57 | 7 + 58 | 8 + 59 | 9 + 60 | 0 + 61 | 1 + 62 | 2 + 63 | 3 + 64 | 4 + 65 | 5 + 66 | 6 + 67 | 7 + 68 | 8 + 69 | 9 + 70 | 0 + 71 | 1 + 72 | 2 + 73 | 3 + 74 | 4 + 75 | 5 + 76 | 6 + 77 | 7 + 78 | 8 + 79 | 9 + 80 | 0 + 81 | 1 + 82 | 2 + 83 | 3 + 84 | 4 + 85 | 5 + 86 | 6 + 87 | 7 + 88 | 8 + 89 | 9 + 90 | 0 + 91 | 1 + 92 | 2 + 93 | 3 + 94 | 4 + 95 | 5 + 96 | 6 + 97 | 7 + 98 | 8 + 99 | 9 + 100 | 0 +(91 rows) + +------------------- +-- Query 4, Query 5 +------------------- +-- Query has WITH clause +-- Subquery with nested WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is disabled +SET gp_cte_sharing = OFF; +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o WHERE o.key < 50) +-- SELECT m.key, bar_value FROM m, bar +-- WHERE +-- m.key != bar_value +-- ORDER BY 1, 2 LIMIT 20; +WITH o AS (SELECT * FROM foo AS o_key), +m AS (SELECT * FROM o WHERE o.key < 50) + SELECT m.key, bar_value FROM m, bar +WHERE +m.key != bar_value +ORDER BY 1, 2 LIMIT 20; + key | bar_value +-----+----------- + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 +(20 rows) + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o WHERE o.key < 50) +-- SELECT m1.key, m2.value FROM m m1, m m2 +-- WHERE m1.key != m2.value +-- ORDER BY 1, 2 DESC LIMIT 100; +WITH o AS (SELECT * FROM foo AS o_key), +m AS (SELECT * FROM o WHERE o.key < 50) + SELECT m1.key, m2.value FROM m m1, m m2 + WHERE m1.key != m2.value + ORDER BY 1, 2 DESC LIMIT 100; + key | value +-----+------- + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 8 + 2 | 8 + 2 | 8 + 2 | 8 + 2 | 8 + 2 | 7 + 2 | 7 + 2 | 7 + 2 | 7 + 2 | 7 + 2 | 6 + 2 | 6 + 2 | 6 + 2 | 6 + 2 | 6 + 2 | 5 + 2 | 5 + 2 | 5 + 2 | 5 + 2 | 5 + 2 | 4 + 2 | 4 + 2 | 4 + 2 | 4 + 2 | 4 + 2 | 3 + 2 | 3 + 2 | 3 + 2 | 3 + 2 | 3 + 2 | 1 + 2 | 1 + 2 | 1 + 2 | 1 + 2 | 1 + 2 | 0 + 2 | 0 + 2 | 0 + 2 | 0 + 3 | 9 + 3 | 9 + 3 | 9 + 3 | 9 + 3 | 9 + 3 | 8 + 3 | 8 + 3 | 8 + 3 | 8 + 3 | 8 + 3 | 7 + 3 | 7 +(100 rows) + +-- Query has WITH clause +-- Subquery with nested WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is enabled +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH o AS (SELECT * FROM foo AS o_key), +--m AS (SELECT * FROM o WHERE o.key < 50) +-- SELECT m.key, bar_value FROM m, bar +--WHERE +--m.key != bar_value +--ORDER BY 1, 2 LIMIT 20; +WITH o AS (SELECT * FROM foo AS o_key), +m AS (SELECT * FROM o WHERE o.key < 50) + SELECT m.key, bar_value FROM m, bar +WHERE +m.key != bar_value +ORDER BY 1, 2 LIMIT 20; + key | bar_value +-----+----------- + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 +(20 rows) + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * from o WHERE o.key < 50) +-- SELECT m1.key, m2.value FROM m m1, m m2 +-- WHERE m1.key != m2.value +-- ORDER BY 1, 2 DESC LIMIT 100; +WITH o AS (SELECT * FROM foo AS o_key), +m AS (SELECT * from o WHERE o.key < 50) + SELECT m1.key, m2.value FROM m m1, m m2 + WHERE m1.key != m2.value + ORDER BY 1, 2 DESC LIMIT 100; + key | value +-----+------- + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 9 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 8 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 7 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 6 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 5 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 4 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 3 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 2 + 1 | 0 + 1 | 0 + 1 | 0 + 1 | 0 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 9 + 2 | 8 + 2 | 8 + 2 | 8 + 2 | 8 + 2 | 8 + 2 | 7 + 2 | 7 + 2 | 7 + 2 | 7 + 2 | 7 + 2 | 6 + 2 | 6 + 2 | 6 + 2 | 6 + 2 | 6 + 2 | 5 + 2 | 5 + 2 | 5 + 2 | 5 + 2 | 5 + 2 | 4 + 2 | 4 + 2 | 4 + 2 | 4 + 2 | 4 + 2 | 3 + 2 | 3 + 2 | 3 + 2 | 3 + 2 | 3 + 2 | 1 + 2 | 1 + 2 | 1 + 2 | 1 + 2 | 1 + 2 | 0 + 2 | 0 + 2 | 0 + 2 | 0 + 3 | 9 + 3 | 9 + 3 | 9 + 3 | 9 + 3 | 9 + 3 | 8 + 3 | 8 + 3 | 8 + 3 | 8 + 3 | 8 + 3 | 7 + 3 | 7 +(100 rows) + +------------------- +-- Query 6, Query 7 +------------------- +-- Query has WITH clause +-- Subquery with nested WITH clause appears under a NLJ in the query plan +-- Nested WITH clause uses NLJ in query plan +-- The sharing of CTE is disabled +SET gp_cte_sharing = OFF; +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o join bar ON o.key < bar_value) +-- SELECT m.value, m.bar_key, bar.bar_value +-- FROM m, bar +-- WHERE m.bar_key = bar.bar_value +-- ORDER BY 2, 1 DESC LIMIT 100; +-- +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o join bar ON o.key < bar_value) +-- SELECT m1.key, m2.value FROM m m1, m m2 +-- WHERE m1.key != m2.value +-- ORDER BY 1, 2 DESC LIMIT 100; +-- Query has WITH clause +-- Subquery with nested WITH clause appears under a NLJ in the query plan +-- Nested WITH clause involves join in query plan +-- The sharing of CTE is enabled +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH o AS (SELECT * FROM foo AS o_key), +--m AS (SELECT * FROM o join bar ON o.key < bar_value) +-- SELECT m.value, m.bar_key, bar.bar_value +-- FROM m, bar +-- WHERE m.bar_key = bar.bar_value +-- ORDER BY 2, 1 DESC LIMIT 100; +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o join bar ON o.key < bar_value) +-- SELECT m1.key, m2.value FROM m m1, m m2 +-- WHERE m1.key != m2.value +-- ORDER BY 1, 2 DESC LIMIT 100; +------------------------------------------------------------------------------------------------------------------------------- +CREATE TABLE emp (ename CHARACTER VARYING(50), empno INTEGER, mgr INTEGER, deptno INTEGER); +INSERT INTO emp SELECT i || 'NAME', i, i%6, i%16 FROM generate_series(1, 100) i; +CREATE TABLE manager (dept_mgr_no INTEGER); +INSERT INTO manager SELECT i FROM generate_series(1, 100) i; +SET enable_hashjoin = OFF; +SET enable_mergejoin = OFF; +SET enable_nestloop = ON; +------------------- +-- Query 8 +------------------- +-- The sharing of CTE is disabled +SET gp_cte_sharing = OFF; +-- EXPLAIN +-- WITH dept_count AS +-- (SELECT deptno, COUNT(*) AS dept_count FROM emp +-- GROUP BY deptno) SELECT e.ename AS employee_name, +-- dc.dept_count AS emp_dept_count +-- FROM emp e, dept_count dc +-- WHERE e.deptno = dc.deptno +-- ORDER BY 1, 2 DESC LIMIT 20; +WITH dept_count AS + (SELECT deptno, COUNT(*) AS dept_count FROM emp + GROUP BY deptno) SELECT e.ename AS employee_name, + dc.dept_count AS emp_dept_count +FROM emp e, dept_count dc +WHERE e.deptno = dc.deptno +ORDER BY 1, 2 DESC LIMIT 20; + employee_name | emp_dept_count +---------------+---------------- + 100NAME | 7 + 10NAME | 6 + 11NAME | 6 + 12NAME | 6 + 13NAME | 6 + 14NAME | 6 + 15NAME | 6 + 16NAME | 6 + 17NAME | 7 + 18NAME | 7 + 19NAME | 7 + 1NAME | 7 + 20NAME | 7 + 21NAME | 6 + 22NAME | 6 + 23NAME | 6 + 24NAME | 6 + 25NAME | 6 + 26NAME | 6 + 27NAME | 6 +(20 rows) + +-- The sharing of CTE is enabled +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH dept_count AS +-- (SELECT deptno, COUNT(*) AS dept_count FROM emp +-- GROUP BY deptno) SELECT e.ename AS employee_name, +-- dc.dept_count AS emp_dept_count +--FROM emp e, dept_count dc +--WHERE e.deptno = dc.deptno +--ORDER BY 1, 2 DESC LIMIT 20; +WITH dept_count AS + (SELECT deptno, COUNT(*) AS dept_count FROM emp + GROUP BY deptno) SELECT e.ename AS employee_name, + dc.dept_count AS emp_dept_count +FROM emp e, dept_count dc +WHERE e.deptno = dc.deptno +ORDER BY 1, 2 DESC LIMIT 20; + employee_name | emp_dept_count +---------------+---------------- + 100NAME | 7 + 10NAME | 6 + 11NAME | 6 + 12NAME | 6 + 13NAME | 6 + 14NAME | 6 + 15NAME | 6 + 16NAME | 6 + 17NAME | 7 + 18NAME | 7 + 19NAME | 7 + 1NAME | 7 + 20NAME | 7 + 21NAME | 6 + 22NAME | 6 + 23NAME | 6 + 24NAME | 6 + 25NAME | 6 + 26NAME | 6 + 27NAME | 6 +(20 rows) + +------------------- +-- Query 9 +------------------- +-- The sharing of CTE is disabled +SET gp_cte_sharing = OFF; +--EXPLAIN +--WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno) +--SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name, +-- dc2.dept_count AS mgr_dept_count +--FROM emp e, +-- dept_count dc1, +-- emp m, +-- dept_count dc2 +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno AND +-- m.deptno = dc2.deptno +--ORDER BY 1, 2, 3, 4 DESC LIMIT 25; +WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno) +SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name, + dc2.dept_count AS mgr_dept_count +FROM emp e, + dept_count dc1, + emp m, + dept_count dc2 +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno AND + m.deptno = dc2.deptno +ORDER BY 1, 2, 3, 4 DESC LIMIT 25; + employee_name | emp_dept_count | manager_name | mgr_dept_count +---------------+----------------+--------------+---------------- + 100NAME | 7 | 4NAME | 7 + 10NAME | 6 | 4NAME | 7 + 11NAME | 6 | 5NAME | 6 + 13NAME | 6 | 1NAME | 7 + 14NAME | 6 | 2NAME | 7 + 15NAME | 6 | 3NAME | 7 + 16NAME | 6 | 4NAME | 7 + 17NAME | 7 | 5NAME | 6 + 19NAME | 7 | 1NAME | 7 + 1NAME | 7 | 1NAME | 7 + 20NAME | 7 | 2NAME | 7 + 21NAME | 6 | 3NAME | 7 + 22NAME | 6 | 4NAME | 7 + 23NAME | 6 | 5NAME | 6 + 25NAME | 6 | 1NAME | 7 + 26NAME | 6 | 2NAME | 7 + 27NAME | 6 | 3NAME | 7 + 28NAME | 6 | 4NAME | 7 + 29NAME | 6 | 5NAME | 6 + 2NAME | 7 | 2NAME | 7 + 31NAME | 6 | 1NAME | 7 + 32NAME | 6 | 2NAME | 7 + 33NAME | 7 | 3NAME | 7 + 34NAME | 7 | 4NAME | 7 + 35NAME | 7 | 5NAME | 6 +(25 rows) + +-- The sharing of CTE is enabled +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno) +--SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name, +-- dc2.dept_count AS mgr_dept_count +--FROM emp e, +-- dept_count dc1, +-- emp m, +-- dept_count dc2 +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno AND +-- m.deptno = dc2.deptno +--ORDER BY 1, 2, 3, 4 DESC LIMIT 25; +WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno) +SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name, + dc2.dept_count AS mgr_dept_count +FROM emp e, + dept_count dc1, + emp m, + dept_count dc2 +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno AND + m.deptno = dc2.deptno +ORDER BY 1, 2, 3, 4 DESC LIMIT 25; + employee_name | emp_dept_count | manager_name | mgr_dept_count +---------------+----------------+--------------+---------------- + 100NAME | 7 | 4NAME | 7 + 10NAME | 6 | 4NAME | 7 + 11NAME | 6 | 5NAME | 6 + 13NAME | 6 | 1NAME | 7 + 14NAME | 6 | 2NAME | 7 + 15NAME | 6 | 3NAME | 7 + 16NAME | 6 | 4NAME | 7 + 17NAME | 7 | 5NAME | 6 + 19NAME | 7 | 1NAME | 7 + 1NAME | 7 | 1NAME | 7 + 20NAME | 7 | 2NAME | 7 + 21NAME | 6 | 3NAME | 7 + 22NAME | 6 | 4NAME | 7 + 23NAME | 6 | 5NAME | 6 + 25NAME | 6 | 1NAME | 7 + 26NAME | 6 | 2NAME | 7 + 27NAME | 6 | 3NAME | 7 + 28NAME | 6 | 4NAME | 7 + 29NAME | 6 | 5NAME | 6 + 2NAME | 7 | 2NAME | 7 + 31NAME | 6 | 1NAME | 7 + 32NAME | 6 | 2NAME | 7 + 33NAME | 7 | 3NAME | 7 + 34NAME | 7 | 4NAME | 7 + 35NAME | 7 | 5NAME | 6 +(25 rows) + +------------------- +-- Query 10 +------------------- +-- The sharing of CTE is disabled +SET gp_cte_sharing = OFF; +--EXPLAIN +--WITH dept_count AS +-- (SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno) SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name +--FROM emp e, +-- dept_count dc1, emp m +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno +--ORDER BY 1, 2, 3 ASC LIMIT 20; +WITH dept_count AS + (SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno) SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name +FROM emp e, + dept_count dc1, emp m +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno +ORDER BY 1, 2, 3 ASC LIMIT 20; + employee_name | emp_dept_count | manager_name +---------------+----------------+-------------- + 100NAME | 7 | 4NAME + 10NAME | 6 | 4NAME + 11NAME | 6 | 5NAME + 13NAME | 6 | 1NAME + 14NAME | 6 | 2NAME + 15NAME | 6 | 3NAME + 16NAME | 6 | 4NAME + 17NAME | 7 | 5NAME + 19NAME | 7 | 1NAME + 1NAME | 7 | 1NAME + 20NAME | 7 | 2NAME + 21NAME | 6 | 3NAME + 22NAME | 6 | 4NAME + 23NAME | 6 | 5NAME + 25NAME | 6 | 1NAME + 26NAME | 6 | 2NAME + 27NAME | 6 | 3NAME + 28NAME | 6 | 4NAME + 29NAME | 6 | 5NAME + 2NAME | 7 | 2NAME +(20 rows) + +-- The sharing of CTE is enabled +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH dept_count AS +-- (SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno) SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name +--FROM emp e, +-- dept_count dc1, emp m +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno +--ORDER BY 1, 2, 3 ASC LIMIT 20; +WITH dept_count AS + (SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno) SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name +FROM emp e, + dept_count dc1, emp m +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno +ORDER BY 1, 2, 3 ASC LIMIT 20; + employee_name | emp_dept_count | manager_name +---------------+----------------+-------------- + 100NAME | 7 | 4NAME + 10NAME | 6 | 4NAME + 11NAME | 6 | 5NAME + 13NAME | 6 | 1NAME + 14NAME | 6 | 2NAME + 15NAME | 6 | 3NAME + 16NAME | 6 | 4NAME + 17NAME | 7 | 5NAME + 19NAME | 7 | 1NAME + 1NAME | 7 | 1NAME + 20NAME | 7 | 2NAME + 21NAME | 6 | 3NAME + 22NAME | 6 | 4NAME + 23NAME | 6 | 5NAME + 25NAME | 6 | 1NAME + 26NAME | 6 | 2NAME + 27NAME | 6 | 3NAME + 28NAME | 6 | 4NAME + 29NAME | 6 | 5NAME + 2NAME | 7 | 2NAME +(20 rows) + +------------------- +-- Query 11 +------------------- +-- The sharing of CTE is disabled +SET gp_cte_sharing = OFF; +--EXPLAIN +--WITH dept_count AS (SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno), +--mgr_count AS (SELECT dept_mgr_no, COUNT(*) AS mgr_count +-- FROM manager +-- GROUP BY dept_mgr_no) +--SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name, +-- dmc1.mgr_count AS mgr_dept_count +--FROM emp e, +-- dept_count dc1, emp m, +-- mgr_count dmc1 +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno AND +-- m.deptno = dmc1.dept_mgr_no +--ORDER BY 1, 2, 3, 4 DESC LIMIT 25; +WITH dept_count AS (SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno), +mgr_count AS (SELECT dept_mgr_no, COUNT(*) AS mgr_count + FROM manager + GROUP BY dept_mgr_no) +SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name, + dmc1.mgr_count AS mgr_dept_count +FROM emp e, + dept_count dc1, emp m, + mgr_count dmc1 +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno AND + m.deptno = dmc1.dept_mgr_no +ORDER BY 1, 2, 3, 4 DESC LIMIT 25; + employee_name | emp_dept_count | manager_name | mgr_dept_count +---------------+----------------+--------------+---------------- + 100NAME | 7 | 4NAME | 1 + 10NAME | 6 | 4NAME | 1 + 11NAME | 6 | 5NAME | 1 + 13NAME | 6 | 1NAME | 1 + 14NAME | 6 | 2NAME | 1 + 15NAME | 6 | 3NAME | 1 + 16NAME | 6 | 4NAME | 1 + 17NAME | 7 | 5NAME | 1 + 19NAME | 7 | 1NAME | 1 + 1NAME | 7 | 1NAME | 1 + 20NAME | 7 | 2NAME | 1 + 21NAME | 6 | 3NAME | 1 + 22NAME | 6 | 4NAME | 1 + 23NAME | 6 | 5NAME | 1 + 25NAME | 6 | 1NAME | 1 + 26NAME | 6 | 2NAME | 1 + 27NAME | 6 | 3NAME | 1 + 28NAME | 6 | 4NAME | 1 + 29NAME | 6 | 5NAME | 1 + 2NAME | 7 | 2NAME | 1 + 31NAME | 6 | 1NAME | 1 + 32NAME | 6 | 2NAME | 1 + 33NAME | 7 | 3NAME | 1 + 34NAME | 7 | 4NAME | 1 + 35NAME | 7 | 5NAME | 1 +(25 rows) + +-- The sharing of CTE is enabled +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH dept_count AS (SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno), +--mgr_count AS (SELECT dept_mgr_no, COUNT(*) AS mgr_count +-- FROM manager +-- GROUP BY dept_mgr_no) +--SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name, +-- dmc1.mgr_count AS mgr_dept_count +--FROM emp e, +-- dept_count dc1, emp m, +-- mgr_count dmc1 +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno AND +-- m.deptno = dmc1.dept_mgr_no +--ORDER BY 1, 2, 3, 4 DESC LIMIT 25; +WITH dept_count AS (SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno), +mgr_count AS (SELECT dept_mgr_no, COUNT(*) AS mgr_count + FROM manager + GROUP BY dept_mgr_no) +SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name, + dmc1.mgr_count AS mgr_dept_count +FROM emp e, + dept_count dc1, emp m, + mgr_count dmc1 +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno AND + m.deptno = dmc1.dept_mgr_no +ORDER BY 1, 2, 3, 4 DESC LIMIT 25; + employee_name | emp_dept_count | manager_name | mgr_dept_count +---------------+----------------+--------------+---------------- + 100NAME | 7 | 4NAME | 1 + 10NAME | 6 | 4NAME | 1 + 11NAME | 6 | 5NAME | 1 + 13NAME | 6 | 1NAME | 1 + 14NAME | 6 | 2NAME | 1 + 15NAME | 6 | 3NAME | 1 + 16NAME | 6 | 4NAME | 1 + 17NAME | 7 | 5NAME | 1 + 19NAME | 7 | 1NAME | 1 + 1NAME | 7 | 1NAME | 1 + 20NAME | 7 | 2NAME | 1 + 21NAME | 6 | 3NAME | 1 + 22NAME | 6 | 4NAME | 1 + 23NAME | 6 | 5NAME | 1 + 25NAME | 6 | 1NAME | 1 + 26NAME | 6 | 2NAME | 1 + 27NAME | 6 | 3NAME | 1 + 28NAME | 6 | 4NAME | 1 + 29NAME | 6 | 5NAME | 1 + 2NAME | 7 | 2NAME | 1 + 31NAME | 6 | 1NAME | 1 + 32NAME | 6 | 2NAME | 1 + 33NAME | 7 | 3NAME | 1 + 34NAME | 7 | 4NAME | 1 + 35NAME | 7 | 5NAME | 1 +(25 rows) + +-- Test that SharedInputScan within the same slice is always executed +set gp_cte_sharing=on; +-- start_ignore +CREATE TABLE car (a int, b int); +CREATE TABLE zoo (c int, d int); +insert into car select i, (i+1) from generate_series(1,10) i; +insert into zoo values (4,4); +-- end_ignore +WITH c as (SELECT sum(a) as a_sum, b FROM car GROUP BY b) +SELECT * FROM c as c1, zoo WHERE zoo.c != 4 AND c1.b = zoo.c +UNION ALL +SELECT * FROM c as c1, zoo WHERE zoo.c = c1.b; + a_sum | b | c | d +-------+---+---+--- + 3 | 4 | 4 | 4 +(1 row) + +-- start_ignore +drop schema qp_with_clause cascade; +NOTICE: drop cascades to 16 other objects +DETAIL: drop cascades to table city +drop cascades to table country +drop cascades to table countrylanguage +drop cascades to table city_ao +drop cascades to table country_ao +drop cascades to table countrylanguage_ao +drop cascades to table city_co +drop cascades to table country_co +drop cascades to table countrylanguage_co +drop cascades to table tbl87 +drop cascades to table foo +drop cascades to table bar +drop cascades to table emp +drop cascades to table manager +drop cascades to table car +drop cascades to table zoo +-- end_ignore diff --git a/src/test/singlenode_regress/expected/query_finish_pending.out b/src/test/singlenode_regress/expected/query_finish_pending.out new file mode 100644 index 00000000000..879ac9a1bde --- /dev/null +++ b/src/test/singlenode_regress/expected/query_finish_pending.out @@ -0,0 +1,206 @@ +drop table if exists _tmp_table; +NOTICE: table "_tmp_table" does not exist, skipping +create table _tmp_table (i1 int, i2 int, i3 int, i4 int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i1' as the Cloudberry Database 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. +insert into _tmp_table select i, i % 100, i % 10000, i % 75 from generate_series(0,99999) i; +-- make sort to spill +set statement_mem="2MB"; +set gp_cte_sharing=on; +select gp_inject_fault('execsort_sort_mergeruns', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- set QueryFinishPending=true in sort mergeruns. This will stop sort and set result_tape to NULL +select gp_inject_fault('execsort_sort_mergeruns', 'finish_pending', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- return results although sort will be interrupted in one of the segments +select DISTINCT S from (select row_number() over(partition by i1 order by i2) AS T, count(*) over (partition by i1) AS S from _tmp_table) AS TMP; + s +--- + 1 +(1 row) + +-- In single node, merge run won't be triggered. +-- start_ignore +select gp_inject_fault('execsort_sort_mergeruns', 'status', 1); + gp_inject_fault +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'execsort_sort_mergeruns' fault type:'finish_pending' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'1' extra arg:'0' fault injection state:'completed' num times hit:'1' + + +(1 row) +-- end_ignore +select gp_inject_fault('execsort_dumptuples', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- set QueryFinishPending=true in sort dumptuples. This will stop sort. +select gp_inject_fault('execsort_dumptuples', 'finish_pending', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- return results although sort will be interrupted in one of the segments +select DISTINCT S from (select row_number() over(partition by i1 order by i2) AS T, count(*) over (partition by i1) AS S from _tmp_table) AS TMP; + s +--- + 1 +(1 row) + +-- In single node, merge run won't be triggered. +-- start_ignore +select gp_inject_fault('execsort_dumptuples', 'status', 1); + gp_inject_fault +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'execsort_dumptuples' fault type:'finish_pending' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'1' extra arg:'0' fault injection state:'completed' num times hit:'1' + + +(1 row) +-- end_ignore +-- ORCA does not trigger sort_bounded_heap() in following queries +set optimizer=off; +select gp_inject_fault('execsort_sort_bounded_heap', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- set QueryFinishPending=true in sort_bounded_heap. This will stop sort. +select gp_inject_fault('execsort_sort_bounded_heap', 'finish_pending', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- In cbdb single node, if we inject fault in the single node, no data should return. +-- start_ignore +-- return results although sort will be interrupted in one of the segments +select i1 from _tmp_table order by i2 limit 3; + i1 +----- + 0 + 300 + 400 +(3 rows) +-- end_ignore +select gp_inject_fault('execsort_sort_bounded_heap', 'status', 1); + gp_inject_fault +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Success: fault name:'execsort_sort_bounded_heap' fault type:'finish_pending' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'1' extra arg:'0' fault injection state:'completed' num times hit:'1' + + +(1 row) + +-- test if shared input scan deletes memory correctly when QueryFinishPending and its child has been eagerly freed, +-- where the child is a Sort node +drop table if exists testsisc; +NOTICE: table "testsisc" does not exist, skipping +create table testsisc (i1 int, i2 int, i3 int, i4 int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i1' as the Cloudberry Database 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. +insert into testsisc select i, i % 1000, i % 100000, i % 75 from +(select generate_series(1, nsegments * 50000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= -1) foo) bar; +set gp_resqueue_print_operator_memory_limits=on; +set statement_mem='2MB'; +-- ORCA does not generate SharedInputScan with a Sort node underneath it. For +-- the following query, ORCA disregards the order by inside the cte definition; +-- planner on the other hand does not. +set optimizer=off; +select gp_inject_fault('execshare_input_next', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Set QueryFinishPending to true after SharedInputScan has retrieved the first tuple. +-- This will eagerly free the memory context of shared input scan's child node. +select gp_inject_fault('execshare_input_next', 'finish_pending', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- In cbdb single node, if we inject fault in the single node, no data should return. +-- start_ignore +with cte as (select i2 from testsisc order by i2) +select * from cte c1, cte c2 limit 2; + i2 | i2 +----+---- + 0 | 0 + 0 | 0 +(2 rows) +-- end_ignore +select gp_inject_fault('execshare_input_next', 'status', 1); + gp_inject_fault +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Success: fault name:'execshare_input_next' fault type:'finish_pending' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'1' extra arg:'0' fault injection state:'completed' num times hit:'1' + + +(1 row) + +-- test if shared input scan deletes memory correctly when QueryFinishPending and its child has been eagerly freed, +-- where the child is a Sort node and sort_mk algorithm is used +select gp_inject_fault('execshare_input_next', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Set QueryFinishPending to true after SharedInputScan has retrieved the first tuple. +-- This will eagerly free the memory context of shared input scan's child node. +select gp_inject_fault('execshare_input_next', 'finish_pending', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- In cbdb single node, if we inject fault in the single node, no data should return. +-- start_ignore +with cte as (select i2 from testsisc order by i2) +select * from cte c1, cte c2 limit 2; + i2 | i2 +----+---- + 0 | 0 + 0 | 0 +(2 rows) +-- end_ignore +select gp_inject_fault('execshare_input_next', 'status', 1); + gp_inject_fault +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Success: fault name:'execshare_input_next' fault type:'finish_pending' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'1' extra arg:'0' fault injection state:'completed' num times hit:'1' + + +(1 row) + +-- Disable faultinjectors +select gp_inject_fault('execsort_sort_mergeruns', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +select gp_inject_fault('execsort_dumptuples', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +select gp_inject_fault('execsort_sort_bounded_heap', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +select gp_inject_fault('execshare_input_next', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +drop table testsisc; diff --git a/src/test/singlenode_regress/expected/random.out b/src/test/singlenode_regress/expected/random.out new file mode 100644 index 00000000000..a919b28d8da --- /dev/null +++ b/src/test/singlenode_regress/expected/random.out @@ -0,0 +1,53 @@ +-- +-- RANDOM +-- Test the random function +-- +-- count the number of tuples originally, should be 1000 +SELECT count(*) FROM onek; + count +------- + 1000 +(1 row) + +-- pick three random rows, they shouldn't match +(SELECT unique1 AS random + FROM onek ORDER BY random() LIMIT 1) +INTERSECT +(SELECT unique1 AS random + FROM onek ORDER BY random() LIMIT 1) +INTERSECT +(SELECT unique1 AS random + FROM onek ORDER BY random() LIMIT 1); + random +-------- +(0 rows) + +-- count roughly 1/10 of the tuples +CREATE TABLE RANDOM_TBL AS + SELECT count(*) AS random + FROM onek WHERE random() < 1.0/10; +-- select again, the count should be different +INSERT INTO RANDOM_TBL (random) + SELECT count(*) + FROM onek WHERE random() < 1.0/10; +-- select again, the count should be different +INSERT INTO RANDOM_TBL (random) + SELECT count(*) + FROM onek WHERE random() < 1.0/10; +-- select again, the count should be different +INSERT INTO RANDOM_TBL (random) + SELECT count(*) + FROM onek WHERE random() < 1.0/10; +-- now test that they are different counts +SELECT random, count(random) FROM RANDOM_TBL + GROUP BY random HAVING count(random) > 3; + random | count +--------+------- +(0 rows) + +SELECT AVG(random) FROM RANDOM_TBL + HAVING AVG(random) NOT BETWEEN 80 AND 120; + avg +----- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/rangefuncs.out b/src/test/singlenode_regress/expected/rangefuncs.out new file mode 100644 index 00000000000..da2ec13c50a --- /dev/null +++ b/src/test/singlenode_regress/expected/rangefuncs.out @@ -0,0 +1,2511 @@ +CREATE TABLE rngfunc2(rngfuncid int, f2 int); +INSERT INTO rngfunc2 VALUES(1, 11); +INSERT INTO rngfunc2 VALUES(2, 22); +INSERT INTO rngfunc2 VALUES(1, 111); +CREATE FUNCTION rngfunct(int) returns setof rngfunc2 as 'SELECT * FROM rngfunc2 WHERE rngfuncid = $1 ORDER BY f2;' LANGUAGE SQL; +-- function with ORDINALITY +select * from rngfunct(1) with ordinality as z(a,b,ord); + a | b | ord +---+-----+----- + 1 | 11 | 1 + 1 | 111 | 2 +(2 rows) + +select * from rngfunct(1) with ordinality as z(a,b,ord) where b > 100; -- ordinal 2, not 1 + a | b | ord +---+-----+----- + 1 | 111 | 2 +(1 row) + +-- ordinality vs. column names and types +select a,b,ord from rngfunct(1) with ordinality as z(a,b,ord); + a | b | ord +---+-----+----- + 1 | 11 | 1 + 1 | 111 | 2 +(2 rows) + +select a,ord from unnest(array['a','b']) with ordinality as z(a,ord); + a | ord +---+----- + a | 1 + b | 2 +(2 rows) + +select * from unnest(array['a','b']) with ordinality as z(a,ord); + a | ord +---+----- + a | 1 + b | 2 +(2 rows) + +select a,ord from unnest(array[1.0::float8]) with ordinality as z(a,ord); + a | ord +---+----- + 1 | 1 +(1 row) + +select * from unnest(array[1.0::float8]) with ordinality as z(a,ord); + a | ord +---+----- + 1 | 1 +(1 row) + +select row_to_json(s.*) from generate_series(11,14) with ordinality s; + row_to_json +------------------------- + {"s":11,"ordinality":1} + {"s":12,"ordinality":2} + {"s":13,"ordinality":3} + {"s":14,"ordinality":4} +(4 rows) + +-- ordinality vs. views +create temporary view vw_ord as select * from (values (1)) v(n) join rngfunct(1) with ordinality as z(a,b,ord) on (n=ord); +select * from vw_ord; + n | a | b | ord +---+---+----+----- + 1 | 1 | 11 | 1 +(1 row) + +select definition from pg_views where viewname='vw_ord'; + definition +------------------------------------------------------------------------- + SELECT v.n, + + z.a, + + z.b, + + z.ord + + FROM (( VALUES (1)) v(n) + + JOIN rngfunct(1) WITH ORDINALITY z(a, b, ord) ON ((v.n = z.ord))); +(1 row) + +drop view vw_ord; +-- multiple functions +select * from rows from(rngfunct(1),rngfunct(2)) with ordinality as z(a,b,c,d,ord); + a | b | c | d | ord +---+-----+---+----+----- + 1 | 11 | 2 | 22 | 1 + 1 | 111 | | | 2 +(2 rows) + +create temporary view vw_ord as select * from (values (1)) v(n) join rows from(rngfunct(1),rngfunct(2)) with ordinality as z(a,b,c,d,ord) on (n=ord); +select * from vw_ord; + n | a | b | c | d | ord +---+---+----+---+----+----- + 1 | 1 | 11 | 2 | 22 | 1 +(1 row) + +select definition from pg_views where viewname='vw_ord'; + definition +------------------------------------------------------------------------------------------------------- + SELECT v.n, + + z.a, + + z.b, + + z.c, + + z.d, + + z.ord + + FROM (( VALUES (1)) v(n) + + JOIN ROWS FROM(rngfunct(1), rngfunct(2)) WITH ORDINALITY z(a, b, c, d, ord) ON ((v.n = z.ord))); +(1 row) + +drop view vw_ord; +-- expansions of unnest() +select * from unnest(array[10,20],array['foo','bar'],array[1.0]); + unnest | unnest | unnest +--------+--------+-------- + 10 | foo | 1.0 + 20 | bar | +(2 rows) + +select * from unnest(array[10,20],array['foo','bar'],array[1.0]) with ordinality as z(a,b,c,ord); + a | b | c | ord +----+-----+-----+----- + 10 | foo | 1.0 | 1 + 20 | bar | | 2 +(2 rows) + +select * from rows from(unnest(array[10,20],array['foo','bar'],array[1.0])) with ordinality as z(a,b,c,ord); + a | b | c | ord +----+-----+-----+----- + 10 | foo | 1.0 | 1 + 20 | bar | | 2 +(2 rows) + +select * from rows from(unnest(array[10,20],array['foo','bar']), generate_series(101,102)) with ordinality as z(a,b,c,ord); + a | b | c | ord +----+-----+-----+----- + 10 | foo | 101 | 1 + 20 | bar | 102 | 2 +(2 rows) + +create temporary view vw_ord as select * from unnest(array[10,20],array['foo','bar'],array[1.0]) as z(a,b,c); +select * from vw_ord; + a | b | c +----+-----+----- + 10 | foo | 1.0 + 20 | bar | +(2 rows) + +select definition from pg_views where viewname='vw_ord'; + definition +---------------------------------------------------------------------------------------- + SELECT z.a, + + z.b, + + z.c + + FROM UNNEST(ARRAY[10, 20], ARRAY['foo'::text, 'bar'::text], ARRAY[1.0]) z(a, b, c); +(1 row) + +drop view vw_ord; +create temporary view vw_ord as select * from rows from(unnest(array[10,20],array['foo','bar'],array[1.0])) as z(a,b,c); +select * from vw_ord; + a | b | c +----+-----+----- + 10 | foo | 1.0 + 20 | bar | +(2 rows) + +select definition from pg_views where viewname='vw_ord'; + definition +---------------------------------------------------------------------------------------- + SELECT z.a, + + z.b, + + z.c + + FROM UNNEST(ARRAY[10, 20], ARRAY['foo'::text, 'bar'::text], ARRAY[1.0]) z(a, b, c); +(1 row) + +drop view vw_ord; +create temporary view vw_ord as select * from rows from(unnest(array[10,20],array['foo','bar']), generate_series(1,2)) as z(a,b,c); +select * from vw_ord; + a | b | c +----+-----+--- + 10 | foo | 1 + 20 | bar | 2 +(2 rows) + +select definition from pg_views where viewname='vw_ord'; + definition +---------------------------------------------------------------------------------------------------------------------- + SELECT z.a, + + z.b, + + z.c + + FROM ROWS FROM(unnest(ARRAY[10, 20]), unnest(ARRAY['foo'::text, 'bar'::text]), generate_series(1, 2)) z(a, b, c); +(1 row) + +drop view vw_ord; +-- ordinality and multiple functions vs. rewind and reverse scan +-- Backward scan not supported in GPDB, which makes this a lot less +-- interesting than in PostgreSQL. +begin; +declare rf_cur scroll cursor for select * from rows from(generate_series(1,5),generate_series(1,2)) with ordinality as g(i,j,o); +fetch all from rf_cur; + i | j | o +---+---+--- + 1 | 1 | 1 + 2 | 2 | 2 + 3 | | 3 + 4 | | 4 + 5 | | 5 +(5 rows) + +--fetch backward all from rf_cur; +fetch all from rf_cur; + i | j | o +---+---+--- +(0 rows) + +fetch next from rf_cur; + i | j | o +---+---+--- +(0 rows) + +fetch next from rf_cur; + i | j | o +---+---+--- +(0 rows) + +--fetch prior from rf_cur; +--fetch absolute 1 from rf_cur; +fetch next from rf_cur; + i | j | o +---+---+--- +(0 rows) + +fetch next from rf_cur; + i | j | o +---+---+--- +(0 rows) + +fetch next from rf_cur; + i | j | o +---+---+--- +(0 rows) + +--fetch prior from rf_cur; +--fetch prior from rf_cur; +--fetch prior from rf_cur; +commit; +-- function with implicit LATERAL +select * from rngfunc2, rngfunct(rngfunc2.rngfuncid) z where rngfunc2.f2 = z.f2; + rngfuncid | f2 | rngfuncid | f2 +-----------+-----+-----------+----- + 1 | 11 | 1 | 11 + 2 | 22 | 2 | 22 + 1 | 111 | 1 | 111 +(3 rows) + +-- function with implicit LATERAL and explicit ORDINALITY +select * from rngfunc2, rngfunct(rngfunc2.rngfuncid) with ordinality as z(rngfuncid,f2,ord) where rngfunc2.f2 = z.f2; + rngfuncid | f2 | rngfuncid | f2 | ord +-----------+-----+-----------+-----+----- + 1 | 11 | 1 | 11 | 1 + 2 | 22 | 2 | 22 | 1 + 1 | 111 | 1 | 111 | 2 +(3 rows) + +-- function in subselect +select * from rngfunc2 where f2 in (select f2 from rngfunct(rngfunc2.rngfuncid) z where z.rngfuncid = rngfunc2.rngfuncid) ORDER BY 1,2; + rngfuncid | f2 +-----------+----- + 1 | 11 + 1 | 111 + 2 | 22 +(3 rows) + +-- function in subselect +select * from rngfunc2 where f2 in (select f2 from rngfunct(1) z where z.rngfuncid = rngfunc2.rngfuncid) ORDER BY 1,2; + rngfuncid | f2 +-----------+----- + 1 | 11 + 1 | 111 +(2 rows) + +-- function in subselect +select * from rngfunc2 where f2 in (select f2 from rngfunct(rngfunc2.rngfuncid) z where z.rngfuncid = 1) ORDER BY 1,2; + rngfuncid | f2 +-----------+----- + 1 | 11 + 1 | 111 +(2 rows) + +-- nested functions +select rngfunct.rngfuncid, rngfunct.f2 from rngfunct(sin(pi()/2)::int) ORDER BY 1,2; + rngfuncid | f2 +-----------+----- + 1 | 11 + 1 | 111 +(2 rows) + +CREATE TABLE rngfunc (rngfuncid int, rngfuncsubid int, rngfuncname text, primary key(rngfuncid,rngfuncsubid)); +INSERT INTO rngfunc VALUES(1,1,'Joe'); +INSERT INTO rngfunc VALUES(1,2,'Ed'); +INSERT INTO rngfunc VALUES(2,1,'Mary'); +-- sql, proretset = f, prorettype = b +CREATE FUNCTION getrngfunc1(int) RETURNS int AS 'SELECT $1;' LANGUAGE SQL; +SELECT * FROM getrngfunc1(1) AS t1; + t1 +---- + 1 +(1 row) + +SELECT * FROM getrngfunc1(1) WITH ORDINALITY AS t1(v,o); + v | o +---+--- + 1 | 1 +(1 row) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc1(1); +SELECT * FROM vw_getrngfunc; + getrngfunc1 +------------- + 1 +(1 row) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc1(1) WITH ORDINALITY as t1(v,o); +SELECT * FROM vw_getrngfunc; + v | o +---+--- + 1 | 1 +(1 row) + +DROP VIEW vw_getrngfunc; +-- sql, proretset = t, prorettype = b +CREATE FUNCTION getrngfunc2(int) RETURNS setof int AS 'SELECT rngfuncid FROM rngfunc WHERE rngfuncid = $1;' LANGUAGE SQL; +SELECT * FROM getrngfunc2(1) AS t1; + t1 +---- + 1 + 1 +(2 rows) + +SELECT * FROM getrngfunc2(1) WITH ORDINALITY AS t1(v,o); + v | o +---+--- + 1 | 1 + 1 | 2 +(2 rows) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc2(1); +SELECT * FROM vw_getrngfunc; + getrngfunc2 +------------- + 1 + 1 +(2 rows) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc2(1) WITH ORDINALITY AS t1(v,o); +SELECT * FROM vw_getrngfunc; + v | o +---+--- + 1 | 1 + 1 | 2 +(2 rows) + +DROP VIEW vw_getrngfunc; +-- sql, proretset = t, prorettype = b +CREATE FUNCTION getrngfunc3(int) RETURNS setof text AS 'SELECT rngfuncname FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc3(1) AS t1; + t1 +----- + Joe + Ed +(2 rows) + +SELECT * FROM getrngfunc3(1) WITH ORDINALITY AS t1(v,o); + v | o +-----+--- + Joe | 1 + Ed | 2 +(2 rows) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc3(1); +SELECT * FROM vw_getrngfunc; + getrngfunc3 +------------- + Joe + Ed +(2 rows) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc3(1) WITH ORDINALITY AS t1(v,o); +SELECT * FROM vw_getrngfunc; + v | o +-----+--- + Joe | 1 + Ed | 2 +(2 rows) + +DROP VIEW vw_getrngfunc; +-- sql, proretset = f, prorettype = c +CREATE FUNCTION getrngfunc4(int) RETURNS rngfunc AS 'SELECT * FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc4(1) AS t1; + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe +(1 row) + +SELECT * FROM getrngfunc4(1) WITH ORDINALITY AS t1(a,b,c,o); + a | b | c | o +---+---+-----+--- + 1 | 1 | Joe | 1 +(1 row) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc4(1); +SELECT * FROM vw_getrngfunc; + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe +(1 row) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc4(1) WITH ORDINALITY AS t1(a,b,c,o); +SELECT * FROM vw_getrngfunc; + a | b | c | o +---+---+-----+--- + 1 | 1 | Joe | 1 +(1 row) + +DROP VIEW vw_getrngfunc; +-- sql, proretset = t, prorettype = c +CREATE FUNCTION getrngfunc5(int) RETURNS setof rngfunc AS 'SELECT * FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc5(1) AS t1; + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe + 1 | 2 | Ed +(2 rows) + +SELECT * FROM getrngfunc5(1) WITH ORDINALITY AS t1(a,b,c,o); + a | b | c | o +---+---+-----+--- + 1 | 1 | Joe | 1 + 1 | 2 | Ed | 2 +(2 rows) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc5(1); +SELECT * FROM vw_getrngfunc; + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe + 1 | 2 | Ed +(2 rows) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc5(1) WITH ORDINALITY AS t1(a,b,c,o); +SELECT * FROM vw_getrngfunc; + a | b | c | o +---+---+-----+--- + 1 | 1 | Joe | 1 + 1 | 2 | Ed | 2 +(2 rows) + +DROP VIEW vw_getrngfunc; +-- sql, proretset = f, prorettype = record +CREATE FUNCTION getrngfunc6(int) RETURNS RECORD AS 'SELECT * FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc6(1) AS t1(rngfuncid int, rngfuncsubid int, rngfuncname text); + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe +(1 row) + +SELECT * FROM ROWS FROM( getrngfunc6(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text) ) WITH ORDINALITY; + rngfuncid | rngfuncsubid | rngfuncname | ordinality +-----------+--------------+-------------+------------ + 1 | 1 | Joe | 1 +(1 row) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc6(1) AS +(rngfuncid int, rngfuncsubid int, rngfuncname text); +SELECT * FROM vw_getrngfunc; + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe +(1 row) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS + SELECT * FROM ROWS FROM( getrngfunc6(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text) ) + WITH ORDINALITY; +SELECT * FROM vw_getrngfunc; + rngfuncid | rngfuncsubid | rngfuncname | ordinality +-----------+--------------+-------------+------------ + 1 | 1 | Joe | 1 +(1 row) + +DROP VIEW vw_getrngfunc; +-- sql, proretset = t, prorettype = record +CREATE FUNCTION getrngfunc7(int) RETURNS setof record AS 'SELECT * FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc7(1) AS t1(rngfuncid int, rngfuncsubid int, rngfuncname text); + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe + 1 | 2 | Ed +(2 rows) + +SELECT * FROM ROWS FROM( getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text) ) WITH ORDINALITY; + rngfuncid | rngfuncsubid | rngfuncname | ordinality +-----------+--------------+-------------+------------ + 1 | 1 | Joe | 1 + 1 | 2 | Ed | 2 +(2 rows) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc7(1) AS +(rngfuncid int, rngfuncsubid int, rngfuncname text); +SELECT * FROM vw_getrngfunc; + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe + 1 | 2 | Ed +(2 rows) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS + SELECT * FROM ROWS FROM( getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text) ) + WITH ORDINALITY; +SELECT * FROM vw_getrngfunc; + rngfuncid | rngfuncsubid | rngfuncname | ordinality +-----------+--------------+-------------+------------ + 1 | 1 | Joe | 1 + 1 | 2 | Ed | 2 +(2 rows) + +DROP VIEW vw_getrngfunc; +-- plpgsql, proretset = f, prorettype = b +CREATE FUNCTION getrngfunc8(int) RETURNS int AS 'DECLARE rngfuncint int; BEGIN SELECT rngfuncid into rngfuncint FROM rngfunc WHERE rngfuncid = $1; RETURN rngfuncint; END;' LANGUAGE plpgsql; +SELECT * FROM getrngfunc8(1) AS t1; + t1 +---- + 1 +(1 row) + +SELECT * FROM getrngfunc8(1) WITH ORDINALITY AS t1(v,o); + v | o +---+--- + 1 | 1 +(1 row) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc8(1); +SELECT * FROM vw_getrngfunc; + getrngfunc8 +------------- + 1 +(1 row) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc8(1) WITH ORDINALITY AS t1(v,o); +SELECT * FROM vw_getrngfunc; + v | o +---+--- + 1 | 1 +(1 row) + +DROP VIEW vw_getrngfunc; +-- plpgsql, proretset = f, prorettype = c +CREATE FUNCTION getrngfunc9(int) RETURNS rngfunc AS 'DECLARE rngfunctup rngfunc%ROWTYPE; BEGIN SELECT * into rngfunctup FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ; RETURN rngfunctup; END;' LANGUAGE plpgsql; +SELECT * FROM getrngfunc9(1) AS t1; + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe +(1 row) + +SELECT * FROM getrngfunc9(1) WITH ORDINALITY AS t1(a,b,c,o); + a | b | c | o +---+---+-----+--- + 1 | 1 | Joe | 1 +(1 row) + +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc9(1); +SELECT * FROM vw_getrngfunc; + rngfuncid | rngfuncsubid | rngfuncname +-----------+--------------+------------- + 1 | 1 | Joe +(1 row) + +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc9(1) WITH ORDINALITY AS t1(a,b,c,o); +SELECT * FROM vw_getrngfunc; + a | b | c | o +---+---+-----+--- + 1 | 1 | Joe | 1 +(1 row) + +DROP VIEW vw_getrngfunc; +-- mix 'n match kinds, to exercise expandRTE and related logic +select * from rows from(getrngfunc1(1),getrngfunc2(1),getrngfunc3(1),getrngfunc4(1),getrngfunc5(1), + getrngfunc6(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc8(1),getrngfunc9(1)) + with ordinality as t1(a,b,c,d,e,f,g,h,i,j,k,l,m,o,p,q,r,s,t,u); + a | b | c | d | e | f | g | h | i | j | k | l | m | o | p | q | r | s | t | u +---+---+-----+---+---+-----+---+---+-----+---+---+-----+---+---+-----+---+---+---+-----+--- + 1 | 1 | Joe | 1 | 1 | Joe | 1 | 1 | Joe | 1 | 1 | Joe | 1 | 1 | Joe | 1 | 1 | 1 | Joe | 1 + | 1 | Ed | | | | 1 | 2 | Ed | | | | 1 | 2 | Ed | | | | | 2 +(2 rows) + +select * from rows from(getrngfunc9(1),getrngfunc8(1), + getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc6(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc5(1),getrngfunc4(1),getrngfunc3(1),getrngfunc2(1),getrngfunc1(1)) + with ordinality as t1(a,b,c,d,e,f,g,h,i,j,k,l,m,o,p,q,r,s,t,u); + a | b | c | d | e | f | g | h | i | j | k | l | m | o | p | q | r | s | t | u +---+---+-----+---+---+---+-----+---+---+-----+---+---+-----+---+---+-----+-----+---+---+--- + 1 | 1 | Joe | 1 | 1 | 1 | Joe | 1 | 1 | Joe | 1 | 1 | Joe | 1 | 1 | Joe | Joe | 1 | 1 | 1 + | | | | 1 | 2 | Ed | | | | 1 | 2 | Ed | | | | Ed | 1 | | 2 +(2 rows) + +create temporary view vw_rngfunc as + select * from rows from(getrngfunc9(1), + getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc1(1)) + with ordinality as t1(a,b,c,d,e,f,g,n); +select * from vw_rngfunc; + a | b | c | d | e | f | g | n +---+---+-----+---+---+-----+---+--- + 1 | 1 | Joe | 1 | 1 | Joe | 1 | 1 + | | | 1 | 2 | Ed | | 2 +(2 rows) + +select pg_get_viewdef('vw_rngfunc'); + pg_get_viewdef +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + SELECT t1.a, + + t1.b, + + t1.c, + + t1.d, + + t1.e, + + t1.f, + + t1.g, + + t1.n + + FROM ROWS FROM(getrngfunc9(1), getrngfunc7(1) AS (rngfuncid integer, rngfuncsubid integer, rngfuncname text), getrngfunc1(1)) WITH ORDINALITY t1(a, b, c, d, e, f, g, n); +(1 row) + +drop view vw_rngfunc; +DROP FUNCTION getrngfunc1(int); +DROP FUNCTION getrngfunc2(int); +DROP FUNCTION getrngfunc3(int); +DROP FUNCTION getrngfunc4(int); +DROP FUNCTION getrngfunc5(int); +DROP FUNCTION getrngfunc6(int); +DROP FUNCTION getrngfunc7(int); +DROP FUNCTION getrngfunc8(int); +DROP FUNCTION getrngfunc9(int); +DROP FUNCTION rngfunct(int); +DROP TABLE rngfunc2; +DROP TABLE rngfunc; +-- Rescan tests -- +CREATE TEMPORARY SEQUENCE rngfunc_rescan_seq1; +CREATE TEMPORARY SEQUENCE rngfunc_rescan_seq2; +CREATE TYPE rngfunc_rescan_t AS (i integer, s bigint); +CREATE FUNCTION rngfunc_sql(int,int) RETURNS setof rngfunc_rescan_t AS 'SELECT i, nextval(''rngfunc_rescan_seq1'') FROM generate_series($1,$2) i;' LANGUAGE SQL; +-- plpgsql functions use materialize mode +CREATE FUNCTION rngfunc_mat(int,int) RETURNS setof rngfunc_rescan_t AS 'begin for i in $1..$2 loop return next (i, nextval(''rngfunc_rescan_seq2'')); end loop; end;' LANGUAGE plpgsql; +--invokes ExecReScanFunctionScan - all these cases should materialize the function only once +-- LEFT JOIN on a condition that the planner can't prove to be true is used to ensure the function +-- is on the inner path of a nestloop join +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN rngfunc_sql(11,13) ON (r+i)<100; + r | i | s +---+----+--- + 1 | 11 | 1 + 1 | 12 | 2 + 1 | 13 | 3 + 2 | 11 | 1 + 2 | 12 | 2 + 2 | 13 | 3 + 3 | 11 | 1 + 3 | 12 | 2 + 3 | 13 | 3 +(9 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN rngfunc_sql(11,13) WITH ORDINALITY AS f(i,s,o) ON (r+i)<100; + r | i | s | o +---+----+---+--- + 1 | 11 | 1 | 1 + 1 | 12 | 2 | 2 + 1 | 13 | 3 | 3 + 2 | 11 | 1 | 1 + 2 | 12 | 2 | 2 + 2 | 13 | 3 | 3 + 3 | 11 | 1 | 1 + 3 | 12 | 2 | 2 + 3 | 13 | 3 | 3 +(9 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN rngfunc_mat(11,13) ON (r+i)<100; + r | i | s +---+----+--- + 1 | 11 | 1 + 1 | 12 | 2 + 1 | 13 | 3 + 2 | 11 | 1 + 2 | 12 | 2 + 2 | 13 | 3 + 3 | 11 | 1 + 3 | 12 | 2 + 3 | 13 | 3 +(9 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN rngfunc_mat(11,13) WITH ORDINALITY AS f(i,s,o) ON (r+i)<100; + r | i | s | o +---+----+---+--- + 1 | 11 | 1 | 1 + 1 | 12 | 2 | 2 + 1 | 13 | 3 | 3 + 2 | 11 | 1 | 1 + 2 | 12 | 2 | 2 + 2 | 13 | 3 | 3 + 3 | 11 | 1 | 1 + 3 | 12 | 2 | 2 + 3 | 13 | 3 | 3 +(9 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN ROWS FROM( rngfunc_sql(11,13), rngfunc_mat(11,13) ) WITH ORDINALITY AS f(i1,s1,i2,s2,o) ON (r+i1+i2)<100; + r | i1 | s1 | i2 | s2 | o +---+----+----+----+----+--- + 1 | 11 | 1 | 11 | 1 | 1 + 1 | 12 | 2 | 12 | 2 | 2 + 1 | 13 | 3 | 13 | 3 | 3 + 2 | 11 | 1 | 11 | 1 | 1 + 2 | 12 | 2 | 12 | 2 | 2 + 2 | 13 | 3 | 13 | 3 | 3 + 3 | 11 | 1 | 11 | 1 | 1 + 3 | 12 | 2 | 12 | 2 | 2 + 3 | 13 | 3 | 13 | 3 | 3 +(9 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN generate_series(11,13) f(i) ON (r+i)<100; + r | i +---+---- + 1 | 11 + 1 | 12 + 1 | 13 + 2 | 11 + 2 | 12 + 2 | 13 + 3 | 11 + 3 | 12 + 3 | 13 +(9 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN generate_series(11,13) WITH ORDINALITY AS f(i,o) ON (r+i)<100; + r | i | o +---+----+--- + 1 | 11 | 1 + 1 | 12 | 2 + 1 | 13 | 3 + 2 | 11 | 1 + 2 | 12 | 2 + 2 | 13 | 3 + 3 | 11 | 1 + 3 | 12 | 2 + 3 | 13 | 3 +(9 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN unnest(array[10,20,30]) f(i) ON (r+i)<100; + r | i +---+---- + 1 | 10 + 1 | 20 + 1 | 30 + 2 | 10 + 2 | 20 + 2 | 30 + 3 | 10 + 3 | 20 + 3 | 30 +(9 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN unnest(array[10,20,30]) WITH ORDINALITY AS f(i,o) ON (r+i)<100; + r | i | o +---+----+--- + 1 | 10 | 1 + 1 | 20 | 2 + 1 | 30 | 3 + 2 | 10 | 1 + 2 | 20 | 2 + 2 | 30 | 3 + 3 | 10 | 1 + 3 | 20 | 2 + 3 | 30 | 3 +(9 rows) + +--invokes ExecReScanFunctionScan with chgParam != NULL (using implied LATERAL) +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_sql(10+r,13); + r | i | s +---+----+--- + 1 | 11 | 1 + 1 | 12 | 2 + 1 | 13 | 3 + 2 | 12 | 4 + 2 | 13 | 5 + 3 | 13 | 6 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_sql(10+r,13) WITH ORDINALITY AS f(i,s,o); + r | i | s | o +---+----+---+--- + 1 | 11 | 1 | 1 + 1 | 12 | 2 | 2 + 1 | 13 | 3 | 3 + 2 | 12 | 4 | 1 + 2 | 13 | 5 | 2 + 3 | 13 | 6 | 1 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_sql(11,10+r); + r | i | s +---+----+--- + 1 | 11 | 1 + 2 | 11 | 2 + 2 | 12 | 3 + 3 | 11 | 4 + 3 | 12 | 5 + 3 | 13 | 6 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_sql(11,10+r) WITH ORDINALITY AS f(i,s,o); + r | i | s | o +---+----+---+--- + 1 | 11 | 1 | 1 + 2 | 11 | 2 | 1 + 2 | 12 | 3 | 2 + 3 | 11 | 4 | 1 + 3 | 12 | 5 | 2 + 3 | 13 | 6 | 3 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (11,12),(13,15),(16,20)) v(r1,r2), rngfunc_sql(r1,r2); + r1 | r2 | i | s +----+----+----+---- + 11 | 12 | 11 | 1 + 11 | 12 | 12 | 2 + 13 | 15 | 13 | 3 + 13 | 15 | 14 | 4 + 13 | 15 | 15 | 5 + 16 | 20 | 16 | 6 + 16 | 20 | 17 | 7 + 16 | 20 | 18 | 8 + 16 | 20 | 19 | 9 + 16 | 20 | 20 | 10 +(10 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (11,12),(13,15),(16,20)) v(r1,r2), rngfunc_sql(r1,r2) WITH ORDINALITY AS f(i,s,o); + r1 | r2 | i | s | o +----+----+----+----+--- + 11 | 12 | 11 | 1 | 1 + 11 | 12 | 12 | 2 | 2 + 13 | 15 | 13 | 3 | 1 + 13 | 15 | 14 | 4 | 2 + 13 | 15 | 15 | 5 | 3 + 16 | 20 | 16 | 6 | 1 + 16 | 20 | 17 | 7 | 2 + 16 | 20 | 18 | 8 | 3 + 16 | 20 | 19 | 9 | 4 + 16 | 20 | 20 | 10 | 5 +(10 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_mat(10+r,13); + r | i | s +---+----+--- + 1 | 11 | 1 + 1 | 12 | 2 + 1 | 13 | 3 + 2 | 12 | 4 + 2 | 13 | 5 + 3 | 13 | 6 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_mat(10+r,13) WITH ORDINALITY AS f(i,s,o); + r | i | s | o +---+----+---+--- + 1 | 11 | 1 | 1 + 1 | 12 | 2 | 2 + 1 | 13 | 3 | 3 + 2 | 12 | 4 | 1 + 2 | 13 | 5 | 2 + 3 | 13 | 6 | 1 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_mat(11,10+r); + r | i | s +---+----+--- + 1 | 11 | 1 + 2 | 11 | 2 + 2 | 12 | 3 + 3 | 11 | 4 + 3 | 12 | 5 + 3 | 13 | 6 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_mat(11,10+r) WITH ORDINALITY AS f(i,s,o); + r | i | s | o +---+----+---+--- + 1 | 11 | 1 | 1 + 2 | 11 | 2 | 1 + 2 | 12 | 3 | 2 + 3 | 11 | 4 | 1 + 3 | 12 | 5 | 2 + 3 | 13 | 6 | 3 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (11,12),(13,15),(16,20)) v(r1,r2), rngfunc_mat(r1,r2); + r1 | r2 | i | s +----+----+----+---- + 11 | 12 | 11 | 1 + 11 | 12 | 12 | 2 + 13 | 15 | 13 | 3 + 13 | 15 | 14 | 4 + 13 | 15 | 15 | 5 + 16 | 20 | 16 | 6 + 16 | 20 | 17 | 7 + 16 | 20 | 18 | 8 + 16 | 20 | 19 | 9 + 16 | 20 | 20 | 10 +(10 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (11,12),(13,15),(16,20)) v(r1,r2), rngfunc_mat(r1,r2) WITH ORDINALITY AS f(i,s,o); + r1 | r2 | i | s | o +----+----+----+----+--- + 11 | 12 | 11 | 1 | 1 + 11 | 12 | 12 | 2 | 2 + 13 | 15 | 13 | 3 | 1 + 13 | 15 | 14 | 4 | 2 + 13 | 15 | 15 | 5 | 3 + 16 | 20 | 16 | 6 | 1 + 16 | 20 | 17 | 7 | 2 + 16 | 20 | 18 | 8 | 3 + 16 | 20 | 19 | 9 | 4 + 16 | 20 | 20 | 10 | 5 +(10 rows) + +-- selective rescan of multiple functions: +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), ROWS FROM( rngfunc_sql(11,11), rngfunc_mat(10+r,13) ); + r | i | s | i | s +---+----+---+----+--- + 1 | 11 | 1 | 11 | 1 + 1 | | | 12 | 2 + 1 | | | 13 | 3 + 2 | 11 | 1 | 12 | 4 + 2 | | | 13 | 5 + 3 | 11 | 1 | 13 | 6 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), ROWS FROM( rngfunc_sql(10+r,13), rngfunc_mat(11,11) ); + r | i | s | i | s +---+----+---+----+--- + 1 | 11 | 1 | 11 | 1 + 1 | 12 | 2 | | + 1 | 13 | 3 | | + 2 | 12 | 4 | 11 | 1 + 2 | 13 | 5 | | + 3 | 13 | 6 | 11 | 1 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), ROWS FROM( rngfunc_sql(10+r,13), rngfunc_mat(10+r,13) ); + r | i | s | i | s +---+----+---+----+--- + 1 | 11 | 1 | 11 | 1 + 1 | 12 | 2 | 12 | 2 + 1 | 13 | 3 | 13 | 3 + 2 | 12 | 4 | 12 | 4 + 2 | 13 | 5 | 13 | 5 + 3 | 13 | 6 | 13 | 6 +(6 rows) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); + setval | setval +--------+-------- + 1 | 1 +(1 row) + +SELECT * FROM generate_series(1,2) r1, generate_series(r1,3) r2, ROWS FROM( rngfunc_sql(10+r1,13), rngfunc_mat(10+r2,13) ); + r1 | r2 | i | s | i | s +----+----+----+----+----+--- + 1 | 1 | 11 | 1 | 11 | 1 + 1 | 1 | 12 | 2 | 12 | 2 + 1 | 1 | 13 | 3 | 13 | 3 + 1 | 2 | 11 | 4 | 12 | 4 + 1 | 2 | 12 | 5 | 13 | 5 + 1 | 2 | 13 | 6 | | + 1 | 3 | 11 | 7 | 13 | 6 + 1 | 3 | 12 | 8 | | + 1 | 3 | 13 | 9 | | + 2 | 2 | 12 | 10 | 12 | 7 + 2 | 2 | 13 | 11 | 13 | 8 + 2 | 3 | 12 | 12 | 13 | 9 + 2 | 3 | 13 | 13 | | +(13 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), generate_series(10+r,20-r) f(i); + r | i +---+---- + 1 | 11 + 1 | 12 + 1 | 13 + 1 | 14 + 1 | 15 + 1 | 16 + 1 | 17 + 1 | 18 + 1 | 19 + 2 | 12 + 2 | 13 + 2 | 14 + 2 | 15 + 2 | 16 + 2 | 17 + 2 | 18 + 3 | 13 + 3 | 14 + 3 | 15 + 3 | 16 + 3 | 17 +(21 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), generate_series(10+r,20-r) WITH ORDINALITY AS f(i,o); + r | i | o +---+----+--- + 1 | 11 | 1 + 1 | 12 | 2 + 1 | 13 | 3 + 1 | 14 | 4 + 1 | 15 | 5 + 1 | 16 | 6 + 1 | 17 | 7 + 1 | 18 | 8 + 1 | 19 | 9 + 2 | 12 | 1 + 2 | 13 | 2 + 2 | 14 | 3 + 2 | 15 | 4 + 2 | 16 | 5 + 2 | 17 | 6 + 2 | 18 | 7 + 3 | 13 | 1 + 3 | 14 | 2 + 3 | 15 | 3 + 3 | 16 | 4 + 3 | 17 | 5 +(21 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), unnest(array[r*10,r*20,r*30]) f(i); + r | i +---+---- + 1 | 10 + 1 | 20 + 1 | 30 + 2 | 20 + 2 | 40 + 2 | 60 + 3 | 30 + 3 | 60 + 3 | 90 +(9 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v(r), unnest(array[r*10,r*20,r*30]) WITH ORDINALITY AS f(i,o); + r | i | o +---+----+--- + 1 | 10 | 1 + 1 | 20 | 2 + 1 | 30 | 3 + 2 | 20 | 1 + 2 | 40 | 2 + 2 | 60 | 3 + 3 | 30 | 1 + 3 | 60 | 2 + 3 | 90 | 3 +(9 rows) + +-- deep nesting +SELECT * FROM (VALUES (1),(2),(3)) v1(r1), + LATERAL (SELECT r1, * FROM (VALUES (10),(20),(30)) v2(r2) + LEFT JOIN generate_series(21,23) f(i) ON ((r2+i)<100) OFFSET 0) s1; + r1 | r1 | r2 | i +----+----+----+---- + 1 | 1 | 10 | 21 + 1 | 1 | 10 | 22 + 1 | 1 | 10 | 23 + 1 | 1 | 20 | 21 + 1 | 1 | 20 | 22 + 1 | 1 | 20 | 23 + 1 | 1 | 30 | 21 + 1 | 1 | 30 | 22 + 1 | 1 | 30 | 23 + 2 | 2 | 10 | 21 + 2 | 2 | 10 | 22 + 2 | 2 | 10 | 23 + 2 | 2 | 20 | 21 + 2 | 2 | 20 | 22 + 2 | 2 | 20 | 23 + 2 | 2 | 30 | 21 + 2 | 2 | 30 | 22 + 2 | 2 | 30 | 23 + 3 | 3 | 10 | 21 + 3 | 3 | 10 | 22 + 3 | 3 | 10 | 23 + 3 | 3 | 20 | 21 + 3 | 3 | 20 | 22 + 3 | 3 | 20 | 23 + 3 | 3 | 30 | 21 + 3 | 3 | 30 | 22 + 3 | 3 | 30 | 23 +(27 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v1(r1), + LATERAL (SELECT r1, * FROM (VALUES (10),(20),(30)) v2(r2) + LEFT JOIN generate_series(20+r1,23) f(i) ON ((r2+i)<100) OFFSET 0) s1; + r1 | r1 | r2 | i +----+----+----+---- + 1 | 1 | 10 | 21 + 1 | 1 | 10 | 22 + 1 | 1 | 10 | 23 + 1 | 1 | 20 | 21 + 1 | 1 | 20 | 22 + 1 | 1 | 20 | 23 + 1 | 1 | 30 | 21 + 1 | 1 | 30 | 22 + 1 | 1 | 30 | 23 + 2 | 2 | 10 | 22 + 2 | 2 | 10 | 23 + 2 | 2 | 20 | 22 + 2 | 2 | 20 | 23 + 2 | 2 | 30 | 22 + 2 | 2 | 30 | 23 + 3 | 3 | 10 | 23 + 3 | 3 | 20 | 23 + 3 | 3 | 30 | 23 +(18 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v1(r1), + LATERAL (SELECT r1, * FROM (VALUES (10),(20),(30)) v2(r2) + LEFT JOIN generate_series(r2,r2+3) f(i) ON ((r2+i)<100) OFFSET 0) s1; + r1 | r1 | r2 | i +----+----+----+---- + 1 | 1 | 10 | 10 + 1 | 1 | 10 | 11 + 1 | 1 | 10 | 12 + 1 | 1 | 10 | 13 + 1 | 1 | 20 | 20 + 1 | 1 | 20 | 21 + 1 | 1 | 20 | 22 + 1 | 1 | 20 | 23 + 1 | 1 | 30 | 30 + 1 | 1 | 30 | 31 + 1 | 1 | 30 | 32 + 1 | 1 | 30 | 33 + 2 | 2 | 10 | 10 + 2 | 2 | 10 | 11 + 2 | 2 | 10 | 12 + 2 | 2 | 10 | 13 + 2 | 2 | 20 | 20 + 2 | 2 | 20 | 21 + 2 | 2 | 20 | 22 + 2 | 2 | 20 | 23 + 2 | 2 | 30 | 30 + 2 | 2 | 30 | 31 + 2 | 2 | 30 | 32 + 2 | 2 | 30 | 33 + 3 | 3 | 10 | 10 + 3 | 3 | 10 | 11 + 3 | 3 | 10 | 12 + 3 | 3 | 10 | 13 + 3 | 3 | 20 | 20 + 3 | 3 | 20 | 21 + 3 | 3 | 20 | 22 + 3 | 3 | 20 | 23 + 3 | 3 | 30 | 30 + 3 | 3 | 30 | 31 + 3 | 3 | 30 | 32 + 3 | 3 | 30 | 33 +(36 rows) + +SELECT * FROM (VALUES (1),(2),(3)) v1(r1), + LATERAL (SELECT r1, * FROM (VALUES (10),(20),(30)) v2(r2) + LEFT JOIN generate_series(r1,2+r2/5) f(i) ON ((r2+i)<100) OFFSET 0) s1; + r1 | r1 | r2 | i +----+----+----+--- + 1 | 1 | 10 | 1 + 1 | 1 | 10 | 2 + 1 | 1 | 10 | 3 + 1 | 1 | 10 | 4 + 1 | 1 | 20 | 1 + 1 | 1 | 20 | 2 + 1 | 1 | 20 | 3 + 1 | 1 | 20 | 4 + 1 | 1 | 20 | 5 + 1 | 1 | 20 | 6 + 1 | 1 | 30 | 1 + 1 | 1 | 30 | 2 + 1 | 1 | 30 | 3 + 1 | 1 | 30 | 4 + 1 | 1 | 30 | 5 + 1 | 1 | 30 | 6 + 1 | 1 | 30 | 7 + 1 | 1 | 30 | 8 + 2 | 2 | 10 | 2 + 2 | 2 | 10 | 3 + 2 | 2 | 10 | 4 + 2 | 2 | 20 | 2 + 2 | 2 | 20 | 3 + 2 | 2 | 20 | 4 + 2 | 2 | 20 | 5 + 2 | 2 | 20 | 6 + 2 | 2 | 30 | 2 + 2 | 2 | 30 | 3 + 2 | 2 | 30 | 4 + 2 | 2 | 30 | 5 + 2 | 2 | 30 | 6 + 2 | 2 | 30 | 7 + 2 | 2 | 30 | 8 + 3 | 3 | 10 | 3 + 3 | 3 | 10 | 4 + 3 | 3 | 20 | 3 + 3 | 3 | 20 | 4 + 3 | 3 | 20 | 5 + 3 | 3 | 20 | 6 + 3 | 3 | 30 | 3 + 3 | 3 | 30 | 4 + 3 | 3 | 30 | 5 + 3 | 3 | 30 | 6 + 3 | 3 | 30 | 7 + 3 | 3 | 30 | 8 +(45 rows) + +-- check handling of FULL JOIN with multiple lateral references (bug #15741) +SELECT * +FROM (VALUES (1),(2)) v1(r1) + LEFT JOIN LATERAL ( + SELECT * + FROM generate_series(1, v1.r1) AS gs1 + LEFT JOIN LATERAL ( + SELECT * + FROM generate_series(1, gs1) AS gs2 + LEFT JOIN generate_series(1, gs2) AS gs3 ON TRUE + ) AS ss1 ON TRUE + FULL JOIN generate_series(1, v1.r1) AS gs4 ON FALSE + ) AS ss0 ON TRUE; + r1 | gs1 | gs2 | gs3 | gs4 +----+-----+-----+-----+----- + 1 | | | | 1 + 1 | 1 | 1 | 1 | + 2 | | | | 1 + 2 | | | | 2 + 2 | 1 | 1 | 1 | + 2 | 2 | 1 | 1 | + 2 | 2 | 2 | 1 | + 2 | 2 | 2 | 2 | +(8 rows) + +DROP FUNCTION rngfunc_sql(int,int); +DROP FUNCTION rngfunc_mat(int,int); +DROP SEQUENCE rngfunc_rescan_seq1; +DROP SEQUENCE rngfunc_rescan_seq2; +-- +-- Test cases involving OUT parameters +-- +CREATE FUNCTION rngfunc(in f1 int, out f2 int) +AS 'select $1+1' LANGUAGE sql; +SELECT rngfunc(42); + rngfunc +--------- + 43 +(1 row) + +SELECT * FROM rngfunc(42); + f2 +---- + 43 +(1 row) + +SELECT * FROM rngfunc(42) AS p(x); + x +---- + 43 +(1 row) + +-- explicit spec of return type is OK +CREATE OR REPLACE FUNCTION rngfunc(in f1 int, out f2 int) RETURNS int +AS 'select $1+1' LANGUAGE sql; +-- error, wrong result type +CREATE OR REPLACE FUNCTION rngfunc(in f1 int, out f2 int) RETURNS float +AS 'select $1+1' LANGUAGE sql; +ERROR: function result type must be integer because of OUT parameters +-- with multiple OUT params you must get a RECORD result +CREATE OR REPLACE FUNCTION rngfunc(in f1 int, out f2 int, out f3 text) RETURNS int +AS 'select $1+1' LANGUAGE sql; +ERROR: function result type must be record because of OUT parameters +CREATE OR REPLACE FUNCTION rngfunc(in f1 int, out f2 int, out f3 text) +RETURNS record +AS 'select $1+1' LANGUAGE sql; +ERROR: cannot change return type of existing function +HINT: Use DROP FUNCTION rngfunc(integer) first. +CREATE OR REPLACE FUNCTION rngfuncr(in f1 int, out f2 int, out text) +AS $$select $1-1, $1::text || 'z'$$ LANGUAGE sql; +SELECT f1, rngfuncr(f1) FROM int4_tbl; + f1 | rngfuncr +-------------+---------------------------- + 0 | (-1,0z) + 123456 | (123455,123456z) + -123456 | (-123457,-123456z) + 2147483647 | (2147483646,2147483647z) + -2147483647 | (-2147483648,-2147483647z) +(5 rows) + +SELECT * FROM rngfuncr(42); + f2 | column2 +----+--------- + 41 | 42z +(1 row) + +SELECT * FROM rngfuncr(42) AS p(a,b); + a | b +----+----- + 41 | 42z +(1 row) + +CREATE OR REPLACE FUNCTION rngfuncb(in f1 int, inout f2 int, out text) +AS $$select $2-1, $1::text || 'z'$$ LANGUAGE sql; +SELECT f1, rngfuncb(f1, f1/2) FROM int4_tbl; + f1 | rngfuncb +-------------+---------------------------- + 0 | (-1,0z) + 123456 | (61727,123456z) + -123456 | (-61729,-123456z) + 2147483647 | (1073741822,2147483647z) + -2147483647 | (-1073741824,-2147483647z) +(5 rows) + +SELECT * FROM rngfuncb(42, 99); + f2 | column2 +----+--------- + 98 | 42z +(1 row) + +SELECT * FROM rngfuncb(42, 99) AS p(a,b); + a | b +----+----- + 98 | 42z +(1 row) + +-- Can reference function with or without OUT params for DROP, etc +DROP FUNCTION rngfunc(int); +DROP FUNCTION rngfuncr(in f2 int, out f1 int, out text); +DROP FUNCTION rngfuncb(in f1 int, inout f2 int); +-- +-- For my next trick, polymorphic OUT parameters +-- +CREATE FUNCTION dup (f1 anyelement, f2 out anyelement, f3 out anyarray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; +SELECT dup(22); + dup +---------------- + (22,"{22,22}") +(1 row) + +SELECT dup('xyz'); -- fails +ERROR: could not determine polymorphic type because input has type unknown +SELECT dup('xyz'::text); + dup +------------------- + (xyz,"{xyz,xyz}") +(1 row) + +SELECT * FROM dup('xyz'::text); + f2 | f3 +-----+----------- + xyz | {xyz,xyz} +(1 row) + +-- fails, as we are attempting to rename first argument +CREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; +ERROR: cannot change name of input parameter "f1" +HINT: Use DROP FUNCTION dup(anyelement) first. +DROP FUNCTION dup(anyelement); +-- equivalent behavior, though different name exposed for input arg +CREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; +SELECT dup(22); + dup +---------------- + (22,"{22,22}") +(1 row) + +DROP FUNCTION dup(anyelement); +-- fails, no way to deduce outputs +CREATE FUNCTION bad (f1 int, out f2 anyelement, out f3 anyarray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; +ERROR: cannot determine result data type +DETAIL: A result of type anyelement requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange. +CREATE FUNCTION dup (f1 anycompatible, f2 anycompatiblearray, f3 out anycompatible, f4 out anycompatiblearray) +AS 'select $1, $2' LANGUAGE sql; +SELECT dup(22, array[44]); + dup +----------- + (22,{44}) +(1 row) + +SELECT dup(4.5, array[44]); + dup +------------ + (4.5,{44}) +(1 row) + +SELECT dup(22, array[44::bigint]); + dup +----------- + (22,{44}) +(1 row) + +SELECT *, pg_typeof(f3), pg_typeof(f4) FROM dup(22, array[44::bigint]); + f3 | f4 | pg_typeof | pg_typeof +----+------+-----------+----------- + 22 | {44} | bigint | bigint[] +(1 row) + +DROP FUNCTION dup(f1 anycompatible, f2 anycompatiblearray); +CREATE FUNCTION dup (f1 anycompatiblerange, f2 out anycompatible, f3 out anycompatiblearray, f4 out anycompatiblerange) +AS 'select lower($1), array[lower($1), upper($1)], $1' LANGUAGE sql; +SELECT dup(int4range(4,7)); + dup +--------------------- + (4,"{4,7}","[4,7)") +(1 row) + +SELECT dup(numrange(4,7)); + dup +--------------------- + (4,"{4,7}","[4,7)") +(1 row) + +SELECT dup(textrange('aaa', 'bbb')); + dup +------------------------------- + (aaa,"{aaa,bbb}","[aaa,bbb)") +(1 row) + +DROP FUNCTION dup(f1 anycompatiblerange); +-- fails, no way to deduce outputs +CREATE FUNCTION bad (f1 anyarray, out f2 anycompatible, out f3 anycompatiblearray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; +ERROR: cannot determine result data type +DETAIL: A result of type anycompatible requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange. +-- +-- table functions +-- +CREATE OR REPLACE FUNCTION rngfunc() +RETURNS TABLE(a int) +AS $$ SELECT a FROM generate_series(1,5) a(a) $$ LANGUAGE sql; +SELECT * FROM rngfunc(); + a +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) + +DROP FUNCTION rngfunc(); +CREATE OR REPLACE FUNCTION rngfunc(int) +RETURNS TABLE(a int, b int) +AS $$ SELECT a, b + FROM generate_series(1,$1) a(a), + generate_series(1,$1) b(b) $$ LANGUAGE sql; +SELECT * FROM rngfunc(3); + a | b +---+--- + 1 | 1 + 1 | 2 + 1 | 3 + 2 | 1 + 2 | 2 + 2 | 3 + 3 | 1 + 3 | 2 + 3 | 3 +(9 rows) + +DROP FUNCTION rngfunc(int); +-- case that causes change of typmod knowledge during inlining +CREATE OR REPLACE FUNCTION rngfunc() +RETURNS TABLE(a varchar(5)) +AS $$ SELECT 'hello'::varchar(5) $$ LANGUAGE sql STABLE; +SELECT * FROM rngfunc() GROUP BY 1; + a +------- + hello +(1 row) + +DROP FUNCTION rngfunc(); +-- +-- some tests on SQL functions with RETURNING +-- +create temp table tt(f1 serial, data text); +-- GPDB: The tests below which throw NOTICEs, throw them in indeterminate +-- order, if the rows are hashed to different segments. Force the rows +-- that have problem to be hashed to the same segment, using a custom hash +-- function. +CREATE OPERATOR FAMILY dummy_int_hash_ops USING hash; +CREATE FUNCTION dummy_hashfunc(int) RETURNS int AS $$ +begin + return CASE WHEN $1 BETWEEN 7 AND 15 THEN 0 ELSE $1 END; +end; $$ LANGUAGE plpgsql STRICT IMMUTABLE; +CREATE OPERATOR CLASS dummy_int_hash_ops FOR TYPE int4 + USING hash FAMILY dummy_int_hash_ops AS + OPERATOR 1 =, + FUNCTION 1 dummy_hashfunc(int); +create function insert_tt(text) returns int as +$$ insert into tt(data) values($1) returning f1 $$ +language sql; +select insert_tt('foo'); + insert_tt +----------- + 1 +(1 row) + +select insert_tt('bar'); + insert_tt +----------- + 2 +(1 row) + +select * from tt; + f1 | data +----+------ + 1 | foo + 2 | bar +(2 rows) + +-- insert will execute to completion even if function needs just 1 row +create or replace function insert_tt(text) returns int as +$$ insert into tt(data) values($1),($1||$1) returning (f1>0)::int $$ +language sql; +select insert_tt('fool'); + insert_tt +----------- + 1 +(1 row) + +select * from tt; + f1 | data +----+---------- + 1 | foo + 2 | bar + 3 | fool + 4 | foolfool +(4 rows) + +-- setof does what's expected +create or replace function insert_tt2(text,text) returns setof int as +$$ insert into tt(data) values($1),($2) returning f1 $$ +language sql; +select insert_tt2('foolish','barrish'); + insert_tt2 +------------ + 5 + 6 +(2 rows) + +select * from insert_tt2('baz','quux'); + insert_tt2 +------------ + 7 + 8 +(2 rows) + +select * from tt; + f1 | data +----+---------- + 1 | foo + 2 | bar + 3 | fool + 4 | foolfool + 5 | foolish + 6 | barrish + 7 | baz + 8 | quux +(8 rows) + +-- limit doesn't prevent execution to completion +select insert_tt2('foolish','barrish') limit 1; + insert_tt2 +------------ + 9 +(1 row) + +select * from tt; + f1 | data +----+---------- + 1 | foo + 2 | bar + 3 | fool + 4 | foolfool + 5 | foolish + 6 | barrish + 7 | baz + 8 | quux + 9 | foolish + 10 | barrish +(10 rows) + +-- triggers will fire, too +create function noticetrigger() returns trigger as $$ +begin + raise notice 'noticetrigger % %', new.f1, new.data; + return null; +end $$ language plpgsql; +create trigger tnoticetrigger after insert on tt for each row +execute procedure noticetrigger(); +select insert_tt2('foolme','barme') limit 1; +NOTICE: noticetrigger 11 foolme +NOTICE: noticetrigger 12 barme + insert_tt2 +------------ + 11 +(1 row) + +select * from tt; + f1 | data +----+---------- + 1 | foo + 2 | bar + 3 | fool + 4 | foolfool + 5 | foolish + 6 | barrish + 7 | baz + 8 | quux + 9 | foolish + 10 | barrish + 11 | foolme + 12 | barme +(12 rows) + +-- and rules work +create temp table tt_log(f1 int, data text); +create rule insert_tt_rule as on insert to tt do also + insert into tt_log values(new.*); +select insert_tt2('foollog','barlog') limit 1; +NOTICE: noticetrigger 13 foollog +NOTICE: noticetrigger 14 barlog + insert_tt2 +------------ + 13 +(1 row) + +select * from tt; + f1 | data +----+---------- + 1 | foo + 2 | bar + 3 | fool + 4 | foolfool + 5 | foolish + 6 | barrish + 7 | baz + 8 | quux + 9 | foolish + 10 | barrish + 11 | foolme + 12 | barme + 13 | foollog + 14 | barlog +(14 rows) + +-- note that nextval() gets executed a second time in the rule expansion, +-- which is expected. +select * from tt_log; + f1 | data +----+--------- + 15 | foollog + 16 | barlog +(2 rows) + +-- test case for a whole-row-variable bug +create function rngfunc1(n integer, out a text, out b text) + returns setof record + language sql + as $$ select 'foo ' || i, 'bar ' || i from generate_series(1,$1) i $$; +set work_mem='64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select t.a, t, t.a from rngfunc1(10000) t limit 1; + a | t | a +-------+-------------------+------- + foo 1 | ("foo 1","bar 1") | foo 1 +(1 row) + +reset work_mem; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select t.a, t, t.a from rngfunc1(10000) t limit 1; + a | t | a +-------+-------------------+------- + foo 1 | ("foo 1","bar 1") | foo 1 +(1 row) + +drop function rngfunc1(n integer); +-- test use of SQL functions returning record +-- this is supported in some cases where the query doesn't specify +-- the actual record type ... +create function array_to_set(anyarray) returns setof record as $$ + select i AS "index", $1[i] AS "value" from generate_subscripts($1, 1) i +$$ language sql strict immutable; +select array_to_set(array['one', 'two']); + array_to_set +-------------- + (1,one) + (2,two) +(2 rows) + +select * from array_to_set(array['one', 'two']) as t(f1 int,f2 text); + f1 | f2 +----+----- + 1 | one + 2 | two +(2 rows) + +select * from array_to_set(array['one', 'two']); -- fail +ERROR: a column definition list is required for functions returning "record" +LINE 1: select * from array_to_set(array['one', 'two']); + ^ +-- after-the-fact coercion of the columns is now possible, too +select * from array_to_set(array['one', 'two']) as t(f1 numeric(4,2),f2 text); + f1 | f2 +------+----- + 1.00 | one + 2.00 | two +(2 rows) + +-- and if it doesn't work, you get a compile-time not run-time error +select * from array_to_set(array['one', 'two']) as t(f1 point,f2 text); +ERROR: return type mismatch in function declared to return record +DETAIL: Final statement returns integer instead of point at column 1. +CONTEXT: SQL function "array_to_set" during startup +-- with "strict", this function can't be inlined in FROM +explain (verbose, costs off) + select * from array_to_set(array['one', 'two']) as t(f1 numeric(4,2),f2 text); + QUERY PLAN +---------------------------------------------------- + Function Scan on public.array_to_set t + Output: f1, f2 + Function Call: array_to_set('{one,two}'::text[]) + Optimizer: Postgres query optimizer +(4 rows) + +-- but without, it can be: +create or replace function array_to_set(anyarray) returns setof record as $$ + select i AS "index", $1[i] AS "value" from generate_subscripts($1, 1) i +$$ language sql immutable; +select array_to_set(array['one', 'two']); + array_to_set +-------------- + (1,one) + (2,two) +(2 rows) + +select * from array_to_set(array['one', 'two']) as t(f1 int,f2 text); + f1 | f2 +----+----- + 1 | one + 2 | two +(2 rows) + +select * from array_to_set(array['one', 'two']) as t(f1 numeric(4,2),f2 text); + f1 | f2 +------+----- + 1.00 | one + 2.00 | two +(2 rows) + +select * from array_to_set(array['one', 'two']) as t(f1 point,f2 text); +ERROR: return type mismatch in function declared to return record +DETAIL: Final statement returns integer instead of point at column 1. +CONTEXT: SQL function "array_to_set" during inlining +explain (verbose, costs off) + select * from array_to_set(array['one', 'two']) as t(f1 numeric(4,2),f2 text); + QUERY PLAN +-------------------------------------------------------------- + Function Scan on pg_catalog.generate_subscripts i + Output: i.i, ('{one,two}'::text[])[i.i] + Function Call: generate_subscripts('{one,two}'::text[], 1) + Optimizer: Postgres query optimizer +(4 rows) + +create temp table rngfunc(f1 int8, f2 int8); +create function testrngfunc() returns record as $$ + insert into rngfunc values (1,2) returning *; +$$ language sql; +select testrngfunc(); + testrngfunc +------------- + (1,2) +(1 row) + +select * from testrngfunc() as t(f1 int8,f2 int8); + f1 | f2 +----+---- + 1 | 2 +(1 row) + +select * from testrngfunc(); -- fail +ERROR: a column definition list is required for functions returning "record" +LINE 1: select * from testrngfunc(); + ^ +drop function testrngfunc(); +create function testrngfunc() returns setof record as $$ + insert into rngfunc values (1,2), (3,4) returning *; +$$ language sql; +select testrngfunc(); + testrngfunc +------------- + (1,2) + (3,4) +(2 rows) + +select * from testrngfunc() as t(f1 int8,f2 int8); + f1 | f2 +----+---- + 1 | 2 + 3 | 4 +(2 rows) + +select * from testrngfunc(); -- fail +ERROR: a column definition list is required for functions returning "record" +LINE 1: select * from testrngfunc(); + ^ +drop function testrngfunc(); +-- Check that typmod imposed by a composite type is honored +create type rngfunc_type as (f1 numeric(35,6), f2 numeric(35,2)); +create function testrngfunc() returns rngfunc_type as $$ + select 7.136178319899999964, 7.136178319899999964; +$$ language sql immutable; +explain (verbose, costs off) +select testrngfunc(); + QUERY PLAN +------------------------------------------- + Result + Output: '(7.136178,7.14)'::rngfunc_type + Optimizer: Postgres query optimizer +(3 rows) + +select testrngfunc(); + testrngfunc +----------------- + (7.136178,7.14) +(1 row) + +explain (verbose, costs off) +select * from testrngfunc(); + QUERY PLAN +-------------------------------------------------- + Function Scan on testrngfunc + Output: f1, f2 + Function Call: '(7.136178,7.14)'::rngfunc_type + Optimizer: Postgres query optimizer +(4 rows) + +select * from testrngfunc(); + f1 | f2 +----------+------ + 7.136178 | 7.14 +(1 row) + +create or replace function testrngfunc() returns rngfunc_type as $$ + select 7.136178319899999964, 7.136178319899999964; +$$ language sql volatile; +explain (verbose, costs off) +select testrngfunc(); + QUERY PLAN +------------------------------------- + Result + Output: testrngfunc() + Optimizer: Postgres query optimizer +(3 rows) + +select testrngfunc(); + testrngfunc +----------------- + (7.136178,7.14) +(1 row) + +explain (verbose, costs off) +select * from testrngfunc(); + QUERY PLAN +---------------------------------------------------------------- + Subquery Scan on sirvf_sq + Output: (sirvf_sq.testrngfunc).f1, (sirvf_sq.testrngfunc).f2 + -> Result + Output: $0 + InitPlan 1 (returns $0) + -> Result + Output: testrngfunc() + Optimizer: Postgres query optimizer +(8 rows) + +select * from testrngfunc(); + f1 | f2 +----------+------ + 7.136178 | 7.14 +(1 row) + +drop function testrngfunc(); +create function testrngfunc() returns setof rngfunc_type as $$ + select 7.136178319899999964, 7.136178319899999964; +$$ language sql immutable; +explain (verbose, costs off) +select testrngfunc(); + QUERY PLAN +------------------------------------- + ProjectSet + Output: testrngfunc() + -> Result + Optimizer: Postgres query optimizer +(4 rows) + +select testrngfunc(); + testrngfunc +----------------- + (7.136178,7.14) +(1 row) + +explain (verbose, costs off) +select * from testrngfunc(); + QUERY PLAN +-------------------------------------------------------- + Result + Output: 7.136178::numeric(35,6), 7.14::numeric(35,2) + Optimizer: Postgres query optimizer +(3 rows) + +select * from testrngfunc(); + f1 | f2 +----------+------ + 7.136178 | 7.14 +(1 row) + +create or replace function testrngfunc() returns setof rngfunc_type as $$ + select 7.136178319899999964, 7.136178319899999964; +$$ language sql volatile; +explain (verbose, costs off) +select testrngfunc(); + QUERY PLAN +------------------------------------- + ProjectSet + Output: testrngfunc() + -> Result + Optimizer: Postgres query optimizer +(4 rows) + +select testrngfunc(); + testrngfunc +----------------- + (7.136178,7.14) +(1 row) + +explain (verbose, costs off) +select * from testrngfunc(); + QUERY PLAN +------------------------------------- + Function Scan on public.testrngfunc + Output: f1, f2 + Function Call: testrngfunc() + Optimizer: Postgres query optimizer +(4 rows) + +select * from testrngfunc(); + f1 | f2 +----------+------ + 7.136178 | 7.14 +(1 row) + +create or replace function testrngfunc() returns setof rngfunc_type as $$ + select 1, 2 union select 3, 4 order by 1; +$$ language sql immutable; +explain (verbose, costs off) +select testrngfunc(); + QUERY PLAN +------------------------------------- + ProjectSet + Output: testrngfunc() + -> Result + Optimizer: Postgres query optimizer +(4 rows) + +select testrngfunc(); + testrngfunc +----------------- + (1.000000,2.00) + (3.000000,4.00) +(2 rows) + +explain (verbose, costs off) +select * from testrngfunc(); + QUERY PLAN +---------------------------------------------------------- + Subquery Scan on "*SELECT*" + Output: "*SELECT*"."?column?", "*SELECT*"."?column?_1" + -> Unique + Output: (1), (2) + Group Key: (1), (2) + -> Sort + Output: (1), (2) + Sort Key: (1), (2) + -> Append + -> Result + Output: 1, 2 + -> Result + Output: 3, 4 + Optimizer: Postgres query optimizer +(14 rows) + +select * from testrngfunc(); + f1 | f2 +----------+------ + 1.000000 | 2.00 + 3.000000 | 4.00 +(2 rows) + +-- Check a couple of error cases while we're here +select * from testrngfunc() as t(f1 int8,f2 int8); -- fail, composite result +ERROR: a column definition list is redundant for a function returning a named composite type +LINE 1: select * from testrngfunc() as t(f1 int8,f2 int8); + ^ +select * from pg_get_keywords() as t(f1 int8,f2 int8); -- fail, OUT params +ERROR: a column definition list is redundant for a function with OUT parameters +LINE 1: select * from pg_get_keywords() as t(f1 int8,f2 int8); + ^ +select * from sin(3) as t(f1 int8,f2 int8); -- fail, scalar result type +ERROR: a column definition list is only allowed for functions returning "record" +LINE 1: select * from sin(3) as t(f1 int8,f2 int8); + ^ +drop type rngfunc_type cascade; +NOTICE: drop cascades to function testrngfunc() +-- +-- Check some cases involving added/dropped columns in a rowtype result +-- +create temp table users (userid text, seq int, email text, todrop bool, moredrop int, enabled bool); +insert into users values ('id',1,'email',true,11,true); +insert into users values ('id2',2,'email2',true,12,true); +alter table users drop column todrop; +create or replace function get_first_user() returns users as +$$ SELECT * FROM users ORDER BY userid LIMIT 1; $$ +language sql stable; +SELECT get_first_user(); + get_first_user +------------------- + (id,1,email,11,t) +(1 row) + +SELECT * FROM get_first_user(); + userid | seq | email | moredrop | enabled +--------+-----+-------+----------+--------- + id | 1 | email | 11 | t +(1 row) + +create or replace function get_users() returns setof users as +$$ SELECT * FROM users ORDER BY userid; $$ +language sql stable; +SELECT get_users(); + get_users +--------------------- + (id,1,email,11,t) + (id2,2,email2,12,t) +(2 rows) + +SELECT * FROM get_users(); + userid | seq | email | moredrop | enabled +--------+-----+--------+----------+--------- + id | 1 | email | 11 | t + id2 | 2 | email2 | 12 | t +(2 rows) + +SELECT * FROM get_users() WITH ORDINALITY; -- make sure ordinality copes + userid | seq | email | moredrop | enabled | ordinality +--------+-----+--------+----------+---------+------------ + id | 1 | email | 11 | t | 1 + id2 | 2 | email2 | 12 | t | 2 +(2 rows) + +-- multiple functions vs. dropped columns +SELECT * FROM ROWS FROM(generate_series(10,11), get_users()) WITH ORDINALITY; + generate_series | userid | seq | email | moredrop | enabled | ordinality +-----------------+--------+-----+--------+----------+---------+------------ + 10 | id | 1 | email | 11 | t | 1 + 11 | id2 | 2 | email2 | 12 | t | 2 +(2 rows) + +SELECT * FROM ROWS FROM(get_users(), generate_series(10,11)) WITH ORDINALITY; + userid | seq | email | moredrop | enabled | generate_series | ordinality +--------+-----+--------+----------+---------+-----------------+------------ + id | 1 | email | 11 | t | 10 | 1 + id2 | 2 | email2 | 12 | t | 11 | 2 +(2 rows) + +-- check that we can cope with post-parsing changes in rowtypes +create temp view usersview as +SELECT * FROM ROWS FROM(get_users(), generate_series(10,11)) WITH ORDINALITY; +select * from usersview; + userid | seq | email | moredrop | enabled | generate_series | ordinality +--------+-----+--------+----------+---------+-----------------+------------ + id | 1 | email | 11 | t | 10 | 1 + id2 | 2 | email2 | 12 | t | 11 | 2 +(2 rows) + +alter table users add column junk text; +select * from usersview; + userid | seq | email | moredrop | enabled | generate_series | ordinality +--------+-----+--------+----------+---------+-----------------+------------ + id | 1 | email | 11 | t | 10 | 1 + id2 | 2 | email2 | 12 | t | 11 | 2 +(2 rows) + +begin; +alter table users drop column moredrop; +select * from usersview; -- expect clean failure +ERROR: attribute 5 of type record has been dropped +rollback; +alter table users alter column seq type numeric; +select * from usersview; -- expect clean failure +ERROR: attribute 2 of type record has wrong type +DETAIL: Table has type numeric, but query expects integer. +drop view usersview; +drop function get_first_user(); +drop function get_users(); +drop table users; +-- check behavior with type coercion required for a set-op +create or replace function rngfuncbar() returns setof text as +$$ select 'foo'::varchar union all select 'bar'::varchar ; $$ +language sql stable; +select rngfuncbar(); + rngfuncbar +------------ + foo + bar +(2 rows) + +select * from rngfuncbar(); + rngfuncbar +------------ + foo + bar +(2 rows) + +-- this function is now inlinable, too: +explain (verbose, costs off) select * from rngfuncbar(); + QUERY PLAN +------------------------------------------------ + Result + Output: ('foo'::character varying) + -> Append + -> Result + Output: 'foo'::character varying + -> Result + Output: 'bar'::character varying + Optimizer: Postgres query optimizer +(8 rows) + +drop function rngfuncbar(); +-- check handling of a SQL function with multiple OUT params (bug #5777) +create or replace function rngfuncbar(out integer, out numeric) as +$$ select (1, 2.1) $$ language sql; +select * from rngfuncbar(); + column1 | column2 +---------+--------- + 1 | 2.1 +(1 row) + +create or replace function rngfuncbar(out integer, out numeric) as +$$ select (1, 2) $$ language sql; +select * from rngfuncbar(); -- fail +ERROR: function return row and query-specified return row do not match +DETAIL: Returned type integer at ordinal position 2, but query expects numeric. +create or replace function rngfuncbar(out integer, out numeric) as +$$ select (1, 2.1, 3) $$ language sql; +select * from rngfuncbar(); -- fail +ERROR: function return row and query-specified return row do not match +DETAIL: Returned row contains 3 attributes, but query expects 2. +drop function rngfuncbar(); +-- check whole-row-Var handling in nested lateral functions (bug #11703) +create function extractq2(t int8_tbl) returns int8 as $$ + select t.q2 +$$ language sql immutable; +explain (verbose, costs off) +select x from int8_tbl, extractq2(int8_tbl) f(x); + QUERY PLAN +------------------------------------------ + Nested Loop + Output: f.x + -> Seq Scan on public.int8_tbl + Output: int8_tbl.q1, int8_tbl.q2 + -> Function Scan on f + Output: f.x + Function Call: int8_tbl.q2 + Optimizer: Postgres query optimizer +(8 rows) + +select x from int8_tbl, extractq2(int8_tbl) f(x); + x +------------------- + 456 + 4567890123456789 + 123 + 4567890123456789 + -4567890123456789 +(5 rows) + +create function extractq2_2(t int8_tbl) returns table(ret1 int8) as $$ + select extractq2(t) offset 0 +$$ language sql immutable; +explain (verbose, costs off) +select x from int8_tbl, extractq2_2(int8_tbl) f(x); + QUERY PLAN +--------------------------------------- + Nested Loop + Output: ((int8_tbl.*).q2) + -> Seq Scan on public.int8_tbl + Output: int8_tbl.* + -> Materialize + Output: ((int8_tbl.*).q2) + -> Result + Output: (int8_tbl.*).q2 + Optimizer: Postgres query optimizer +(9 rows) + +select x from int8_tbl, extractq2_2(int8_tbl) f(x); + x +------------------- + 456 + 4567890123456789 + 123 + 4567890123456789 + -4567890123456789 +(5 rows) + +-- without the "offset 0", this function gets optimized quite differently +create function extractq2_2_opt(t int8_tbl) returns table(ret1 int8) as $$ + select extractq2(t) +$$ language sql immutable; +explain (verbose, costs off) +select x from int8_tbl, extractq2_2_opt(int8_tbl) f(x); + QUERY PLAN +------------------------------------- + Seq Scan on public.int8_tbl + Output: int8_tbl.q2 + Optimizer: Postgres query optimizer +(3 rows) + +select x from int8_tbl, extractq2_2_opt(int8_tbl) f(x); + x +------------------- + 456 + 4567890123456789 + 123 + 4567890123456789 + -4567890123456789 +(5 rows) + +-- gpdb: test append node in subquery_motionHazard_walker(). Without that +-- change the select query below will panic. +create function extractq2_append(t int8_tbl) returns table(ret1 int8) as $$ + select extractq2(t) union all select extractq2(t) +$$ language sql immutable; +explain (verbose, costs off) +select x from (select * from int8_tbl order by 1 limit 100) as int8_tbl, extractq2_append(int8_tbl) f(x); + QUERY PLAN +------------------------------------------------------ + Nested Loop + Output: (int8_tbl.q2) + -> Limit + Output: int8_tbl.q1, int8_tbl.q2 + -> Sort + Output: int8_tbl.q1, int8_tbl.q2 + Sort Key: int8_tbl.q1 + -> Seq Scan on public.int8_tbl + Output: int8_tbl.q1, int8_tbl.q2 + -> Append + -> Result + Output: int8_tbl.q2 + -> Result + Output: int8_tbl.q2 + Optimizer: Postgres query optimizer +(15 rows) + +select x from (select * from int8_tbl order by 1 limit 100) as int8_tbl, extractq2_append(int8_tbl) f(x); + x +------------------- + 456 + 456 + 4567890123456789 + 4567890123456789 + 123 + 123 + 4567890123456789 + 4567890123456789 + -4567890123456789 + -4567890123456789 +(10 rows) + +create function extractq2_wapper(t int8_tbl) returns table(ret1 int8) as $$ + select (select extractq2(t)) +$$ language sql immutable; +explain (verbose, costs off) select x from int8_tbl, extractq2_wapper(int8_tbl) f(x); + QUERY PLAN +------------------------------------- + Seq Scan on public.int8_tbl + Output: (SubPlan 1) + SubPlan 1 + -> Result + Output: (int8_tbl.*).q2 + Optimizer: Postgres query optimizer +(6 rows) + +select x from int8_tbl, extractq2_wapper(int8_tbl) f(x); + x +------------------- + 456 + 4567890123456789 + 123 + 4567890123456789 + -4567890123456789 +(5 rows) + +-- check handling of nulls in SRF results (bug #7808) +create type rngfunc2 as (a integer, b text); +select *, row_to_json(u) from unnest(array[(1,'foo')::rngfunc2, null::rngfunc2]) u; + a | b | row_to_json +---+-----+--------------------- + 1 | foo | {"a":1,"b":"foo"} + | | {"a":null,"b":null} +(2 rows) + +select *, row_to_json(u) from unnest(array[null::rngfunc2, null::rngfunc2]) u; + a | b | row_to_json +---+---+--------------------- + | | {"a":null,"b":null} + | | {"a":null,"b":null} +(2 rows) + +select *, row_to_json(u) from unnest(array[null::rngfunc2, (1,'foo')::rngfunc2, null::rngfunc2]) u; + a | b | row_to_json +---+-----+--------------------- + | | {"a":null,"b":null} + 1 | foo | {"a":1,"b":"foo"} + | | {"a":null,"b":null} +(3 rows) + +select *, row_to_json(u) from unnest(array[]::rngfunc2[]) u; + a | b | row_to_json +---+---+------------- +(0 rows) + +drop type rngfunc2; +-- check handling of functions pulled up into function RTEs (bug #17227) +explain (verbose, costs off) +select * from + (select jsonb_path_query_array(module->'lectures', '$[*]') as lecture + from unnest(array['{"lectures": [{"id": "1"}]}'::jsonb]) + as unnested_modules(module)) as ss, + jsonb_to_recordset(ss.lecture) as j (id text); + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: jsonb_path_query_array((unnested_modules.module -> 'lectures'::text), '$[*]'::jsonpath, '{}'::jsonb, false), j.id + -> Function Scan on pg_catalog.unnest unnested_modules + Output: unnested_modules.module + Function Call: unnest('{"{\"lectures\": [{\"id\": \"1\"}]}"}'::jsonb[]) + -> Function Scan on pg_catalog.jsonb_to_recordset j + Output: j.id + Function Call: jsonb_to_recordset(jsonb_path_query_array((unnested_modules.module -> 'lectures'::text), '$[*]'::jsonpath, '{}'::jsonb, false)) + Optimizer: Postgres query optimizer +(9 rows) + +select * from + (select jsonb_path_query_array(module->'lectures', '$[*]') as lecture + from unnest(array['{"lectures": [{"id": "1"}]}'::jsonb]) + as unnested_modules(module)) as ss, + jsonb_to_recordset(ss.lecture) as j (id text); + lecture | id +---------------+---- + [{"id": "1"}] | 1 +(1 row) + diff --git a/src/test/singlenode_regress/expected/rangetypes.out b/src/test/singlenode_regress/expected/rangetypes.out new file mode 100644 index 00000000000..2eaed6e1f4e --- /dev/null +++ b/src/test/singlenode_regress/expected/rangetypes.out @@ -0,0 +1,1770 @@ +-- Tests for range data types. +create type textrange as range (subtype=text, collation="C"); +-- +-- test input parser +-- +-- negative tests; should fail +select ''::textrange; +ERROR: malformed range literal: "" +LINE 1: select ''::textrange; + ^ +DETAIL: Missing left parenthesis or bracket. +select '-[a,z)'::textrange; +ERROR: malformed range literal: "-[a,z)" +LINE 1: select '-[a,z)'::textrange; + ^ +DETAIL: Missing left parenthesis or bracket. +select '[a,z) - '::textrange; +ERROR: malformed range literal: "[a,z) - " +LINE 1: select '[a,z) - '::textrange; + ^ +DETAIL: Junk after right parenthesis or bracket. +select '(",a)'::textrange; +ERROR: malformed range literal: "(",a)" +LINE 1: select '(",a)'::textrange; + ^ +DETAIL: Unexpected end of input. +select '(,,a)'::textrange; +ERROR: malformed range literal: "(,,a)" +LINE 1: select '(,,a)'::textrange; + ^ +DETAIL: Too many commas. +select '(),a)'::textrange; +ERROR: malformed range literal: "(),a)" +LINE 1: select '(),a)'::textrange; + ^ +DETAIL: Missing comma after lower bound. +select '(a,))'::textrange; +ERROR: malformed range literal: "(a,))" +LINE 1: select '(a,))'::textrange; + ^ +DETAIL: Junk after right parenthesis or bracket. +select '(],a)'::textrange; +ERROR: malformed range literal: "(],a)" +LINE 1: select '(],a)'::textrange; + ^ +DETAIL: Missing comma after lower bound. +select '(a,])'::textrange; +ERROR: malformed range literal: "(a,])" +LINE 1: select '(a,])'::textrange; + ^ +DETAIL: Junk after right parenthesis or bracket. +select '[z,a]'::textrange; +ERROR: range lower bound must be less than or equal to range upper bound +LINE 1: select '[z,a]'::textrange; + ^ +-- should succeed +select ' empty '::textrange; + textrange +----------- + empty +(1 row) + +select ' ( empty, empty ) '::textrange; + textrange +---------------------- + (" empty"," empty ") +(1 row) + +select ' ( " a " " a ", " z " " z " ) '::textrange; + textrange +-------------------------- + (" a a "," z z ") +(1 row) + +select '(a,)'::textrange; + textrange +----------- + (a,) +(1 row) + +select '[,z]'::textrange; + textrange +----------- + (,z] +(1 row) + +select '[a,]'::textrange; + textrange +----------- + [a,) +(1 row) + +select '(,)'::textrange; + textrange +----------- + (,) +(1 row) + +select '[ , ]'::textrange; + textrange +----------- + [" "," "] +(1 row) + +select '["",""]'::textrange; + textrange +----------- + ["",""] +(1 row) + +select '[",",","]'::textrange; + textrange +----------- + [",",","] +(1 row) + +select '["\\","\\"]'::textrange; + textrange +------------- + ["\\","\\"] +(1 row) + +select '(\\,a)'::textrange; + textrange +----------- + ("\\",a) +(1 row) + +select '((,z)'::textrange; + textrange +----------- + ("(",z) +(1 row) + +select '([,z)'::textrange; + textrange +----------- + ("[",z) +(1 row) + +select '(!,()'::textrange; + textrange +----------- + (!,"(") +(1 row) + +select '(!,[)'::textrange; + textrange +----------- + (!,"[") +(1 row) + +select '[a,a]'::textrange; + textrange +----------- + [a,a] +(1 row) + +-- these are allowed but normalize to empty: +select '[a,a)'::textrange; + textrange +----------- + empty +(1 row) + +select '(a,a]'::textrange; + textrange +----------- + empty +(1 row) + +select '(a,a)'::textrange; + textrange +----------- + empty +(1 row) + +-- +-- create some test data and test the operators +-- +CREATE TABLE numrange_test (nr NUMRANGE); +create index numrange_test_btree on numrange_test(nr); +INSERT INTO numrange_test VALUES('[,)'); +INSERT INTO numrange_test VALUES('[3,]'); +INSERT INTO numrange_test VALUES('[, 5)'); +INSERT INTO numrange_test VALUES(numrange(1.1, 2.2)); +INSERT INTO numrange_test VALUES('empty'); +INSERT INTO numrange_test VALUES(numrange(1.7, 1.7, '[]')); +SELECT nr, isempty(nr), lower(nr), upper(nr) FROM numrange_test; + nr | isempty | lower | upper +-----------+---------+-------+------- + (,) | f | | + [3,) | f | 3 | + (,5) | f | | 5 + [1.1,2.2) | f | 1.1 | 2.2 + empty | t | | + [1.7,1.7] | f | 1.7 | 1.7 +(6 rows) + +SELECT nr, lower_inc(nr), lower_inf(nr), upper_inc(nr), upper_inf(nr) FROM numrange_test; + nr | lower_inc | lower_inf | upper_inc | upper_inf +-----------+-----------+-----------+-----------+----------- + (,) | f | t | f | t + [3,) | t | f | f | t + (,5) | f | t | f | f + [1.1,2.2) | t | f | f | f + empty | f | f | f | f + [1.7,1.7] | t | f | t | f +(6 rows) + +SELECT * FROM numrange_test WHERE range_contains(nr, numrange(1.9,1.91)); + nr +----------- + (,) + (,5) + [1.1,2.2) +(3 rows) + +SELECT * FROM numrange_test WHERE nr @> numrange(1.0,10000.1); + nr +----- + (,) +(1 row) + +SELECT * FROM numrange_test WHERE range_contained_by(numrange(-1e7,-10000.1), nr); + nr +------ + (,) + (,5) +(2 rows) + +SELECT * FROM numrange_test WHERE 1.9 <@ nr; + nr +----------- + (,) + (,5) + [1.1,2.2) +(3 rows) + +select * from numrange_test where nr = 'empty'; + nr +------- + empty +(1 row) + +select * from numrange_test where nr = '(1.1, 2.2)'; + nr +---- +(0 rows) + +select * from numrange_test where nr = '[1.1, 2.2)'; + nr +----------- + [1.1,2.2) +(1 row) + +select * from numrange_test where nr < 'empty'; + nr +---- +(0 rows) + +select * from numrange_test where nr < numrange(-1000.0, -1000.0,'[]'); + nr +------- + (,) + (,5) + empty +(3 rows) + +select * from numrange_test where nr < numrange(0.0, 1.0,'[]'); + nr +------- + (,) + (,5) + empty +(3 rows) + +select * from numrange_test where nr < numrange(1000.0, 1001.0,'[]'); + nr +----------- + (,) + [3,) + (,5) + [1.1,2.2) + empty + [1.7,1.7] +(6 rows) + +select * from numrange_test where nr <= 'empty'; + nr +------- + empty +(1 row) + +select * from numrange_test where nr >= 'empty'; + nr +----------- + (,) + [3,) + (,5) + [1.1,2.2) + empty + [1.7,1.7] +(6 rows) + +select * from numrange_test where nr > 'empty'; + nr +----------- + (,) + [3,) + (,5) + [1.1,2.2) + [1.7,1.7] +(5 rows) + +select * from numrange_test where nr > numrange(-1001.0, -1000.0,'[]'); + nr +----------- + [3,) + [1.1,2.2) + [1.7,1.7] +(3 rows) + +select * from numrange_test where nr > numrange(0.0, 1.0,'[]'); + nr +----------- + [3,) + [1.1,2.2) + [1.7,1.7] +(3 rows) + +select * from numrange_test where nr > numrange(1000.0, 1000.0,'[]'); + nr +---- +(0 rows) + +select numrange(2.0, 1.0); +ERROR: range lower bound must be less than or equal to range upper bound +select numrange(2.0, 3.0) -|- numrange(3.0, 4.0); + ?column? +---------- + t +(1 row) + +select range_adjacent(numrange(2.0, 3.0), numrange(3.1, 4.0)); + range_adjacent +---------------- + f +(1 row) + +select range_adjacent(numrange(2.0, 3.0), numrange(3.1, null)); + range_adjacent +---------------- + f +(1 row) + +select numrange(2.0, 3.0, '[]') -|- numrange(3.0, 4.0, '()'); + ?column? +---------- + t +(1 row) + +select numrange(1.0, 2.0) -|- numrange(2.0, 3.0,'[]'); + ?column? +---------- + t +(1 row) + +select range_adjacent(numrange(2.0, 3.0, '(]'), numrange(1.0, 2.0, '(]')); + range_adjacent +---------------- + t +(1 row) + +select numrange(1.1, 3.3) <@ numrange(0.1,10.1); + ?column? +---------- + t +(1 row) + +select numrange(0.1, 10.1) <@ numrange(1.1,3.3); + ?column? +---------- + f +(1 row) + +select numrange(1.1, 2.2) - numrange(2.0, 3.0); + ?column? +----------- + [1.1,2.0) +(1 row) + +select numrange(1.1, 2.2) - numrange(2.2, 3.0); + ?column? +----------- + [1.1,2.2) +(1 row) + +select numrange(1.1, 2.2,'[]') - numrange(2.0, 3.0); + ?column? +----------- + [1.1,2.0) +(1 row) + +select range_minus(numrange(10.1,12.2,'[]'), numrange(110.0,120.2,'(]')); + range_minus +------------- + [10.1,12.2] +(1 row) + +select range_minus(numrange(10.1,12.2,'[]'), numrange(0.0,120.2,'(]')); + range_minus +------------- + empty +(1 row) + +select numrange(4.5, 5.5, '[]') && numrange(5.5, 6.5); + ?column? +---------- + t +(1 row) + +select numrange(1.0, 2.0) << numrange(3.0, 4.0); + ?column? +---------- + t +(1 row) + +select numrange(1.0, 3.0,'[]') << numrange(3.0, 4.0,'[]'); + ?column? +---------- + f +(1 row) + +select numrange(1.0, 3.0,'()') << numrange(3.0, 4.0,'()'); + ?column? +---------- + t +(1 row) + +select numrange(1.0, 2.0) >> numrange(3.0, 4.0); + ?column? +---------- + f +(1 row) + +select numrange(3.0, 70.0) &< numrange(6.6, 100.0); + ?column? +---------- + t +(1 row) + +select numrange(1.1, 2.2) < numrange(1.0, 200.2); + ?column? +---------- + f +(1 row) + +select numrange(1.1, 2.2) < numrange(1.1, 1.2); + ?column? +---------- + f +(1 row) + +select numrange(1.0, 2.0) + numrange(2.0, 3.0); + ?column? +----------- + [1.0,3.0) +(1 row) + +select numrange(1.0, 2.0) + numrange(1.5, 3.0); + ?column? +----------- + [1.0,3.0) +(1 row) + +select numrange(1.0, 2.0) + numrange(2.5, 3.0); -- should fail +ERROR: result of range union would not be contiguous +select range_merge(numrange(1.0, 2.0), numrange(2.0, 3.0)); + range_merge +------------- + [1.0,3.0) +(1 row) + +select range_merge(numrange(1.0, 2.0), numrange(1.5, 3.0)); + range_merge +------------- + [1.0,3.0) +(1 row) + +select range_merge(numrange(1.0, 2.0), numrange(2.5, 3.0)); -- shouldn't fail + range_merge +------------- + [1.0,3.0) +(1 row) + +select numrange(1.0, 2.0) * numrange(2.0, 3.0); + ?column? +---------- + empty +(1 row) + +select numrange(1.0, 2.0) * numrange(1.5, 3.0); + ?column? +----------- + [1.5,2.0) +(1 row) + +select numrange(1.0, 2.0) * numrange(2.5, 3.0); + ?column? +---------- + empty +(1 row) + +select range_intersect_agg(nr) from numrange_test; + range_intersect_agg +--------------------- + empty +(1 row) + +select range_intersect_agg(nr) from numrange_test where false; + range_intersect_agg +--------------------- + +(1 row) + +select range_intersect_agg(nr) from numrange_test where nr @> 4.0; + range_intersect_agg +--------------------- + [3,5) +(1 row) + +analyze numrange_test; +create table numrange_test2(nr numrange); +create index numrange_test2_hash_idx on numrange_test2 using hash (nr); +INSERT INTO numrange_test2 VALUES('[, 5)'); +INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2)); +INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2)); +INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2,'()')); +INSERT INTO numrange_test2 VALUES('empty'); +select * from numrange_test2 where nr = 'empty'::numrange; + nr +------- + empty +(1 row) + +select * from numrange_test2 where nr = numrange(1.1, 2.2); + nr +----------- + [1.1,2.2) + [1.1,2.2) +(2 rows) + +select * from numrange_test2 where nr = numrange(1.1, 2.3); + nr +---- +(0 rows) + +set enable_nestloop=t; +set enable_hashjoin=f; +set enable_mergejoin=f; +select * from numrange_test natural join numrange_test2 order by nr; + nr +----------- + empty + (,5) + [1.1,2.2) + [1.1,2.2) +(4 rows) + +set enable_nestloop=f; +set enable_hashjoin=t; +set enable_mergejoin=f; +select * from numrange_test natural join numrange_test2 order by nr; + nr +----------- + empty + (,5) + [1.1,2.2) + [1.1,2.2) +(4 rows) + +set enable_nestloop=f; +set enable_hashjoin=f; +set enable_mergejoin=t; +select * from numrange_test natural join numrange_test2 order by nr; + nr +----------- + empty + (,5) + [1.1,2.2) + [1.1,2.2) +(4 rows) + +set enable_nestloop to default; +set enable_hashjoin to default; +set enable_mergejoin to default; +-- keep numrange_test around to help exercise dump/reload +DROP TABLE numrange_test2; +-- +-- Apply a subset of the above tests on a collatable type, too +-- +CREATE TABLE textrange_test (tr textrange); +create index textrange_test_btree on textrange_test(tr); +INSERT INTO textrange_test VALUES('[,)'); +INSERT INTO textrange_test VALUES('["a",]'); +INSERT INTO textrange_test VALUES('[,"q")'); +INSERT INTO textrange_test VALUES(textrange('b', 'g')); +INSERT INTO textrange_test VALUES('empty'); +INSERT INTO textrange_test VALUES(textrange('d', 'd', '[]')); +SELECT tr, isempty(tr), lower(tr), upper(tr) FROM textrange_test; + tr | isempty | lower | upper +-------+---------+-------+------- + (,) | f | | + [a,) | f | a | + (,q) | f | | q + [b,g) | f | b | g + empty | t | | + [d,d] | f | d | d +(6 rows) + +SELECT tr, lower_inc(tr), lower_inf(tr), upper_inc(tr), upper_inf(tr) FROM textrange_test; + tr | lower_inc | lower_inf | upper_inc | upper_inf +-------+-----------+-----------+-----------+----------- + (,) | f | t | f | t + [a,) | t | f | f | t + (,q) | f | t | f | f + [b,g) | t | f | f | f + empty | f | f | f | f + [d,d] | t | f | t | f +(6 rows) + +SELECT * FROM textrange_test WHERE range_contains(tr, textrange('f', 'fx')); + tr +------- + (,) + [a,) + (,q) + [b,g) +(4 rows) + +SELECT * FROM textrange_test WHERE tr @> textrange('a', 'z'); + tr +------ + (,) + [a,) +(2 rows) + +SELECT * FROM textrange_test WHERE range_contained_by(textrange('0','9'), tr); + tr +------ + (,) + (,q) +(2 rows) + +SELECT * FROM textrange_test WHERE 'e'::text <@ tr; + tr +------- + (,) + [a,) + (,q) + [b,g) +(4 rows) + +select * from textrange_test where tr = 'empty'; + tr +------- + empty +(1 row) + +select * from textrange_test where tr = '("b","g")'; + tr +---- +(0 rows) + +select * from textrange_test where tr = '["b","g")'; + tr +------- + [b,g) +(1 row) + +select * from textrange_test where tr < 'empty'; + tr +---- +(0 rows) + +-- test canonical form for int4range +select int4range(1, 10, '[]'); + int4range +----------- + [1,11) +(1 row) + +select int4range(1, 10, '[)'); + int4range +----------- + [1,10) +(1 row) + +select int4range(1, 10, '(]'); + int4range +----------- + [2,11) +(1 row) + +select int4range(1, 10, '()'); + int4range +----------- + [2,10) +(1 row) + +select int4range(1, 2, '()'); + int4range +----------- + empty +(1 row) + +-- test canonical form for daterange +select daterange('2000-01-10'::date, '2000-01-20'::date, '[]'); + daterange +------------------------- + [01-10-2000,01-21-2000) +(1 row) + +select daterange('2000-01-10'::date, '2000-01-20'::date, '[)'); + daterange +------------------------- + [01-10-2000,01-20-2000) +(1 row) + +select daterange('2000-01-10'::date, '2000-01-20'::date, '(]'); + daterange +------------------------- + [01-11-2000,01-21-2000) +(1 row) + +select daterange('2000-01-10'::date, '2000-01-20'::date, '()'); + daterange +------------------------- + [01-11-2000,01-20-2000) +(1 row) + +select daterange('2000-01-10'::date, '2000-01-11'::date, '()'); + daterange +----------- + empty +(1 row) + +select daterange('2000-01-10'::date, '2000-01-11'::date, '(]'); + daterange +------------------------- + [01-11-2000,01-12-2000) +(1 row) + +select daterange('-infinity'::date, '2000-01-01'::date, '()'); + daterange +------------------------ + (-infinity,01-01-2000) +(1 row) + +select daterange('-infinity'::date, '2000-01-01'::date, '[)'); + daterange +------------------------ + [-infinity,01-01-2000) +(1 row) + +select daterange('2000-01-01'::date, 'infinity'::date, '[)'); + daterange +----------------------- + [01-01-2000,infinity) +(1 row) + +select daterange('2000-01-01'::date, 'infinity'::date, '[]'); + daterange +----------------------- + [01-01-2000,infinity] +(1 row) + +-- test GiST index that's been built incrementally +create table test_range_gist(ir int4range); +create index test_range_gist_idx on test_range_gist using gist (ir); +insert into test_range_gist select int4range(g, g+10) from generate_series(1,2000) g; +insert into test_range_gist select 'empty'::int4range from generate_series(1,500) g; +insert into test_range_gist select int4range(g, g+10000) from generate_series(1,1000) g; +insert into test_range_gist select 'empty'::int4range from generate_series(1,500) g; +insert into test_range_gist select int4range(NULL,g*10,'(]') from generate_series(1,100) g; +insert into test_range_gist select int4range(g*10,NULL,'(]') from generate_series(1,100) g; +insert into test_range_gist select int4range(g, g+10) from generate_series(1,2000) g; +-- test statistics and selectivity estimation as well +-- +-- We don't check the accuracy of selectivity estimation, but at least check +-- it doesn't fall. +analyze test_range_gist; +-- first, verify non-indexed results +SET enable_seqscan = t; +SET enable_indexscan = f; +SET enable_bitmapscan = f; +select count(*) from test_range_gist where ir @> 'empty'::int4range; + count +------- + 6200 +(1 row) + +select count(*) from test_range_gist where ir = int4range(10,20); + count +------- + 2 +(1 row) + +select count(*) from test_range_gist where ir @> 10; + count +------- + 130 +(1 row) + +select count(*) from test_range_gist where ir @> int4range(10,20); + count +------- + 111 +(1 row) + +select count(*) from test_range_gist where ir && int4range(10,20); + count +------- + 158 +(1 row) + +select count(*) from test_range_gist where ir <@ int4range(10,50); + count +------- + 1062 +(1 row) + +select count(*) from test_range_gist where ir << int4range(100,500); + count +------- + 189 +(1 row) + +select count(*) from test_range_gist where ir >> int4range(100,500); + count +------- + 3554 +(1 row) + +select count(*) from test_range_gist where ir &< int4range(100,500); + count +------- + 1029 +(1 row) + +select count(*) from test_range_gist where ir &> int4range(100,500); + count +------- + 4794 +(1 row) + +select count(*) from test_range_gist where ir -|- int4range(100,500); + count +------- + 5 +(1 row) + +select count(*) from test_range_gist where ir @> '{}'::int4multirange; + count +------- + 6200 +(1 row) + +select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40)); + count +------- + 107 +(1 row) + +select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange; + count +------- + 271 +(1 row) + +select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange; + count +------- + 1060 +(1 row) + +select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 189 +(1 row) + +select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 3554 +(1 row) + +select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 1029 +(1 row) + +select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 4794 +(1 row) + +select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 5 +(1 row) + +-- now check same queries using index +SET enable_seqscan = f; +SET enable_indexscan = t; +SET enable_bitmapscan = f; +select count(*) from test_range_gist where ir @> 'empty'::int4range; + count +------- + 6200 +(1 row) + +select count(*) from test_range_gist where ir = int4range(10,20); + count +------- + 2 +(1 row) + +select count(*) from test_range_gist where ir @> 10; + count +------- + 130 +(1 row) + +select count(*) from test_range_gist where ir @> int4range(10,20); + count +------- + 111 +(1 row) + +select count(*) from test_range_gist where ir && int4range(10,20); + count +------- + 158 +(1 row) + +select count(*) from test_range_gist where ir <@ int4range(10,50); + count +------- + 1062 +(1 row) + +select count(*) from test_range_gist where ir << int4range(100,500); + count +------- + 189 +(1 row) + +select count(*) from test_range_gist where ir >> int4range(100,500); + count +------- + 3554 +(1 row) + +select count(*) from test_range_gist where ir &< int4range(100,500); + count +------- + 1029 +(1 row) + +select count(*) from test_range_gist where ir &> int4range(100,500); + count +------- + 4794 +(1 row) + +select count(*) from test_range_gist where ir -|- int4range(100,500); + count +------- + 5 +(1 row) + +select count(*) from test_range_gist where ir @> '{}'::int4multirange; + count +------- + 6200 +(1 row) + +select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40)); + count +------- + 107 +(1 row) + +select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange; + count +------- + 271 +(1 row) + +select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange; + count +------- + 1060 +(1 row) + +select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 189 +(1 row) + +select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 3554 +(1 row) + +select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 1029 +(1 row) + +select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 4794 +(1 row) + +select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 5 +(1 row) + +-- now check same queries using a bulk-loaded index +drop index test_range_gist_idx; +create index test_range_gist_idx on test_range_gist using gist (ir); +select count(*) from test_range_gist where ir @> 'empty'::int4range; + count +------- + 6200 +(1 row) + +select count(*) from test_range_gist where ir = int4range(10,20); + count +------- + 2 +(1 row) + +select count(*) from test_range_gist where ir @> 10; + count +------- + 130 +(1 row) + +select count(*) from test_range_gist where ir @> int4range(10,20); + count +------- + 111 +(1 row) + +select count(*) from test_range_gist where ir && int4range(10,20); + count +------- + 158 +(1 row) + +select count(*) from test_range_gist where ir <@ int4range(10,50); + count +------- + 1062 +(1 row) + +select count(*) from test_range_gist where ir << int4range(100,500); + count +------- + 189 +(1 row) + +select count(*) from test_range_gist where ir >> int4range(100,500); + count +------- + 3554 +(1 row) + +select count(*) from test_range_gist where ir &< int4range(100,500); + count +------- + 1029 +(1 row) + +select count(*) from test_range_gist where ir &> int4range(100,500); + count +------- + 4794 +(1 row) + +select count(*) from test_range_gist where ir -|- int4range(100,500); + count +------- + 5 +(1 row) + +select count(*) from test_range_gist where ir @> '{}'::int4multirange; + count +------- + 6200 +(1 row) + +select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40)); + count +------- + 107 +(1 row) + +select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange; + count +------- + 271 +(1 row) + +select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange; + count +------- + 1060 +(1 row) + +select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 189 +(1 row) + +select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 3554 +(1 row) + +select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 1029 +(1 row) + +select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 4794 +(1 row) + +select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500)); + count +------- + 5 +(1 row) + +-- test SP-GiST index that's been built incrementally +create table test_range_spgist(ir int4range); +create index test_range_spgist_idx on test_range_spgist using spgist (ir); +insert into test_range_spgist select int4range(g, g+10) from generate_series(1,2000) g; +insert into test_range_spgist select 'empty'::int4range from generate_series(1,500) g; +insert into test_range_spgist select int4range(g, g+10000) from generate_series(1,1000) g; +insert into test_range_spgist select 'empty'::int4range from generate_series(1,500) g; +insert into test_range_spgist select int4range(NULL,g*10,'(]') from generate_series(1,100) g; +insert into test_range_spgist select int4range(g*10,NULL,'(]') from generate_series(1,100) g; +insert into test_range_spgist select int4range(g, g+10) from generate_series(1,2000) g; +-- first, verify non-indexed results +SET enable_seqscan = t; +SET enable_indexscan = f; +SET enable_bitmapscan = f; +select count(*) from test_range_spgist where ir @> 'empty'::int4range; + count +------- + 6200 +(1 row) + +select count(*) from test_range_spgist where ir = int4range(10,20); + count +------- + 2 +(1 row) + +select count(*) from test_range_spgist where ir @> 10; + count +------- + 130 +(1 row) + +select count(*) from test_range_spgist where ir @> int4range(10,20); + count +------- + 111 +(1 row) + +select count(*) from test_range_spgist where ir && int4range(10,20); + count +------- + 158 +(1 row) + +select count(*) from test_range_spgist where ir <@ int4range(10,50); + count +------- + 1062 +(1 row) + +select count(*) from test_range_spgist where ir << int4range(100,500); + count +------- + 189 +(1 row) + +select count(*) from test_range_spgist where ir >> int4range(100,500); + count +------- + 3554 +(1 row) + +select count(*) from test_range_spgist where ir &< int4range(100,500); + count +------- + 1029 +(1 row) + +select count(*) from test_range_spgist where ir &> int4range(100,500); + count +------- + 4794 +(1 row) + +select count(*) from test_range_spgist where ir -|- int4range(100,500); + count +------- + 5 +(1 row) + +-- now check same queries using index +SET enable_seqscan = f; +SET enable_indexscan = t; +SET enable_bitmapscan = f; +select count(*) from test_range_spgist where ir @> 'empty'::int4range; + count +------- + 6200 +(1 row) + +select count(*) from test_range_spgist where ir = int4range(10,20); + count +------- + 2 +(1 row) + +select count(*) from test_range_spgist where ir @> 10; + count +------- + 130 +(1 row) + +select count(*) from test_range_spgist where ir @> int4range(10,20); + count +------- + 111 +(1 row) + +select count(*) from test_range_spgist where ir && int4range(10,20); + count +------- + 158 +(1 row) + +select count(*) from test_range_spgist where ir <@ int4range(10,50); + count +------- + 1062 +(1 row) + +select count(*) from test_range_spgist where ir << int4range(100,500); + count +------- + 189 +(1 row) + +select count(*) from test_range_spgist where ir >> int4range(100,500); + count +------- + 3554 +(1 row) + +select count(*) from test_range_spgist where ir &< int4range(100,500); + count +------- + 1029 +(1 row) + +select count(*) from test_range_spgist where ir &> int4range(100,500); + count +------- + 4794 +(1 row) + +select count(*) from test_range_spgist where ir -|- int4range(100,500); + count +------- + 5 +(1 row) + +-- now check same queries using a bulk-loaded index +drop index test_range_spgist_idx; +create index test_range_spgist_idx on test_range_spgist using spgist (ir); +select count(*) from test_range_spgist where ir @> 'empty'::int4range; + count +------- + 6200 +(1 row) + +select count(*) from test_range_spgist where ir = int4range(10,20); + count +------- + 2 +(1 row) + +select count(*) from test_range_spgist where ir @> 10; + count +------- + 130 +(1 row) + +select count(*) from test_range_spgist where ir @> int4range(10,20); + count +------- + 111 +(1 row) + +select count(*) from test_range_spgist where ir && int4range(10,20); + count +------- + 158 +(1 row) + +select count(*) from test_range_spgist where ir <@ int4range(10,50); + count +------- + 1062 +(1 row) + +select count(*) from test_range_spgist where ir << int4range(100,500); + count +------- + 189 +(1 row) + +select count(*) from test_range_spgist where ir >> int4range(100,500); + count +------- + 3554 +(1 row) + +select count(*) from test_range_spgist where ir &< int4range(100,500); + count +------- + 1029 +(1 row) + +select count(*) from test_range_spgist where ir &> int4range(100,500); + count +------- + 4794 +(1 row) + +select count(*) from test_range_spgist where ir -|- int4range(100,500); + count +------- + 5 +(1 row) + +-- test index-only scans +explain (costs off) +select ir from test_range_spgist where ir -|- int4range(10,20) order by ir; + QUERY PLAN +------------------------------------------------------------------------ + Sort + Sort Key: ir + -> Index Only Scan using test_range_spgist_idx on test_range_spgist + Index Cond: (ir -|- '[10,20)'::int4range) +(4 rows) + +select ir from test_range_spgist where ir -|- int4range(10,20) order by ir; + ir +------------ + [20,30) + [20,30) + [20,10020) +(3 rows) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; +-- test elem <@ range operator +create table test_range_elem(i int4); +create index test_range_elem_idx on test_range_elem (i); +insert into test_range_elem select i from generate_series(1,100) i; +SET enable_seqscan = f; +select count(*) from test_range_elem where i <@ int4range(10,50); + count +------- + 40 +(1 row) + +-- also test spgist index on anyrange expression +create index on test_range_elem using spgist(int4range(i,i+10)); +explain (costs off) +select count(*) from test_range_elem where int4range(i,i+10) <@ int4range(10,30); + QUERY PLAN +------------------------------------------------------------------------- + Aggregate + -> Index Scan using test_range_elem_int4range_idx on test_range_elem + Index Cond: (int4range(i, (i + 10)) <@ '[10,30)'::int4range) +(3 rows) + +select count(*) from test_range_elem where int4range(i,i+10) <@ int4range(10,30); + count +------- + 11 +(1 row) + +RESET enable_seqscan; +drop table test_range_elem; +-- +-- Btree_gist is not included by default, so to test exclusion +-- constraints with range types, use singleton int ranges for the "=" +-- portion of the constraint. +-- +create table test_range_excl( + room int4range, + speaker int4range, + during tsrange, + exclude using gist (room with =, during with &&), + exclude using gist (speaker with =, during with &&) +); +insert into test_range_excl + values(int4range(123, 123, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:00, 2010-01-02 11:00)'); +insert into test_range_excl + values(int4range(123, 123, '[]'), int4range(2, 2, '[]'), '[2010-01-02 11:00, 2010-01-02 12:00)'); +insert into test_range_excl + values(int4range(123, 123, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)'); +ERROR: conflicting key value violates exclusion constraint "test_range_excl_room_during_excl" +DETAIL: Key (room, during)=([123,124), ["Sat Jan 02 10:10:00 2010","Sat Jan 02 11:00:00 2010")) conflicts with existing key (room, during)=([123,124), ["Sat Jan 02 10:00:00 2010","Sat Jan 02 11:00:00 2010")). +insert into test_range_excl + values(int4range(124, 124, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:10)'); +insert into test_range_excl + values(int4range(125, 125, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)'); +ERROR: conflicting key value violates exclusion constraint "test_range_excl_speaker_during_excl" +DETAIL: Key (speaker, during)=([1,2), ["Sat Jan 02 10:10:00 2010","Sat Jan 02 11:00:00 2010")) conflicts with existing key (speaker, during)=([1,2), ["Sat Jan 02 10:00:00 2010","Sat Jan 02 11:00:00 2010")). +-- test bigint ranges +select int8range(10000000000::int8, 20000000000::int8,'(]'); + int8range +--------------------------- + [10000000001,20000000001) +(1 row) + +-- test tstz ranges +set timezone to '-08'; +select '[2010-01-01 01:00:00 -05, 2010-01-01 02:00:00 -08)'::tstzrange; + tstzrange +----------------------------------------------------------------- + ["Thu Dec 31 22:00:00 2009 -08","Fri Jan 01 02:00:00 2010 -08") +(1 row) + +-- should fail +select '[2010-01-01 01:00:00 -08, 2010-01-01 02:00:00 -05)'::tstzrange; +ERROR: range lower bound must be less than or equal to range upper bound +LINE 1: select '[2010-01-01 01:00:00 -08, 2010-01-01 02:00:00 -05)':... + ^ +set timezone to default; +-- +-- Test user-defined range of floats +-- +--should fail +create type float8range as range (subtype=float8, subtype_diff=float4mi); +ERROR: function float4mi(double precision, double precision) does not exist +--should succeed +create type float8range as range (subtype=float8, subtype_diff=float8mi); +select '[123.001, 5.e9)'::float8range @> 888.882::float8; + ?column? +---------- + t +(1 row) + +create table float8range_test(f8r float8range, i int); +insert into float8range_test values(float8range(-100.00007, '1.111113e9'), 42); +select * from float8range_test; + f8r | i +-------------------------+---- + [-100.00007,1111113000) | 42 +(1 row) + +drop table float8range_test; +-- +-- Test range types over domains +-- +create domain mydomain as int4; +create type mydomainrange as range(subtype=mydomain); +select '[4,50)'::mydomainrange @> 7::mydomain; + ?column? +---------- + t +(1 row) + +drop domain mydomain; -- fail +ERROR: cannot drop type mydomain because other objects depend on it +DETAIL: type mydomainrange depends on type mydomain +HINT: Use DROP ... CASCADE to drop the dependent objects too. +drop domain mydomain cascade; +NOTICE: drop cascades to type mydomainrange +-- +-- Test domains over range types +-- +create domain restrictedrange as int4range check (upper(value) < 10); +select '[4,5)'::restrictedrange @> 7; + ?column? +---------- + f +(1 row) + +select '[4,50)'::restrictedrange @> 7; -- should fail +ERROR: value for domain restrictedrange violates check constraint "restrictedrange_check" +drop domain restrictedrange; +-- +-- Test multiple range types over the same subtype +-- +create type textrange1 as range(subtype=text, collation="C"); +create type textrange2 as range(subtype=text, collation="C"); +select textrange1('a','Z') @> 'b'::text; +ERROR: range lower bound must be less than or equal to range upper bound +select textrange2('a','z') @> 'b'::text; + ?column? +---------- + t +(1 row) + +drop type textrange1; +drop type textrange2; +-- +-- Test polymorphic type system +-- +create function anyarray_anyrange_func(a anyarray, r anyrange) + returns anyelement as 'select $1[1] + lower($2);' language sql; +select anyarray_anyrange_func(ARRAY[1,2], int4range(10,20)); + anyarray_anyrange_func +------------------------ + 11 +(1 row) + +-- should fail +select anyarray_anyrange_func(ARRAY[1,2], numrange(10,20)); +ERROR: function anyarray_anyrange_func(integer[], numrange) does not exist +LINE 1: select anyarray_anyrange_func(ARRAY[1,2], numrange(10,20)); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anyarray_anyrange_func(anyarray, anyrange); +-- should fail +create function bogus_func(anyelement) + returns anyrange as 'select int4range(1,10)' language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anyrange requires at least one input of type anyrange or anymultirange. +-- should fail +create function bogus_func(int) + returns anyrange as 'select int4range(1,10)' language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anyrange requires at least one input of type anyrange or anymultirange. +create function range_add_bounds(anyrange) + returns anyelement as 'select lower($1) + upper($1)' language sql; +select range_add_bounds(int4range(1, 17)); + range_add_bounds +------------------ + 18 +(1 row) + +select range_add_bounds(numrange(1.0001, 123.123)); + range_add_bounds +------------------ + 124.1231 +(1 row) + +create function rangetypes_sql(q anyrange, b anyarray, out c anyelement) + as $$ select upper($1) + $2[1] $$ + language sql; +select rangetypes_sql(int4range(1,10), ARRAY[2,20]); + rangetypes_sql +---------------- + 12 +(1 row) + +select rangetypes_sql(numrange(1,10), ARRAY[2,20]); -- match failure +ERROR: function rangetypes_sql(numrange, integer[]) does not exist +LINE 1: select rangetypes_sql(numrange(1,10), ARRAY[2,20]); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +create function anycompatiblearray_anycompatiblerange_func(a anycompatiblearray, r anycompatiblerange) + returns anycompatible as 'select $1[1] + lower($2);' language sql; +select anycompatiblearray_anycompatiblerange_func(ARRAY[1,2], int4range(10,20)); + anycompatiblearray_anycompatiblerange_func +-------------------------------------------- + 11 +(1 row) + +select anycompatiblearray_anycompatiblerange_func(ARRAY[1,2], numrange(10,20)); + anycompatiblearray_anycompatiblerange_func +-------------------------------------------- + 11 +(1 row) + +-- should fail +select anycompatiblearray_anycompatiblerange_func(ARRAY[1.1,2], int4range(10,20)); +ERROR: function anycompatiblearray_anycompatiblerange_func(numeric[], int4range) does not exist +LINE 1: select anycompatiblearray_anycompatiblerange_func(ARRAY[1.1,... + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +drop function anycompatiblearray_anycompatiblerange_func(anycompatiblearray, anycompatiblerange); +-- should fail +create function bogus_func(anycompatible) + returns anycompatiblerange as 'select int4range(1,10)' language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anycompatiblerange requires at least one input of type anycompatiblerange or anycompatiblemultirange. +-- +-- Arrays of ranges +-- +select ARRAY[numrange(1.1, 1.2), numrange(12.3, 155.5)]; + array +------------------------------ + {"[1.1,1.2)","[12.3,155.5)"} +(1 row) + +create table i8r_array (f1 int, f2 int8range[]); +insert into i8r_array values (42, array[int8range(1,10), int8range(2,20)]); +select * from i8r_array; + f1 | f2 +----+--------------------- + 42 | {"[1,10)","[2,20)"} +(1 row) + +drop table i8r_array; +-- +-- Ranges of arrays +-- +create type arrayrange as range (subtype=int4[]); +select arrayrange(ARRAY[1,2], ARRAY[2,1]); + arrayrange +------------------- + ["{1,2}","{2,1}") +(1 row) + +select arrayrange(ARRAY[2,1], ARRAY[1,2]); -- fail +ERROR: range lower bound must be less than or equal to range upper bound +select array[1,1] <@ arrayrange(array[1,2], array[2,1]); + ?column? +---------- + f +(1 row) + +select array[1,3] <@ arrayrange(array[1,2], array[2,1]); + ?column? +---------- + t +(1 row) + +-- +-- Ranges of composites +-- +create type two_ints as (a int, b int); +create type two_ints_range as range (subtype = two_ints); +-- with force_parallel_mode on, this exercises tqueue.c's range remapping +select *, row_to_json(upper(t)) as u from + (values (two_ints_range(row(1,2), row(3,4))), + (two_ints_range(row(5,6), row(7,8)))) v(t); + t | u +-------------------+--------------- + ["(1,2)","(3,4)") | {"a":3,"b":4} + ["(5,6)","(7,8)") | {"a":7,"b":8} +(2 rows) + +-- this must be rejected to avoid self-inclusion issues: +alter type two_ints add attribute c two_ints_range; +ERROR: composite type two_ints cannot be made a member of itself +drop type two_ints cascade; +NOTICE: drop cascades to type two_ints_range +-- +-- Check behavior when subtype lacks a hash function +-- +create type cashrange as range (subtype = money); +set enable_sort = off; -- try to make it pick a hash setop implementation +select '(2,5)'::cashrange except select '(5,6)'::cashrange; + cashrange +--------------- + ($2.00,$5.00) +(1 row) + +reset enable_sort; +-- +-- OUT/INOUT/TABLE functions +-- +-- infer anyrange from anyrange +create function outparam_succeed(i anyrange, out r anyrange, out t text) + as $$ select $1, 'foo'::text $$ language sql; +select * from outparam_succeed(int4range(1,2)); + r | t +-------+----- + [1,2) | foo +(1 row) + +create function outparam2_succeed(r anyrange, out lu anyarray, out ul anyarray) + as $$ select array[lower($1), upper($1)], array[upper($1), lower($1)] $$ + language sql; +select * from outparam2_succeed(int4range(1,11)); + lu | ul +--------+-------- + {1,11} | {11,1} +(1 row) + +-- infer anyarray from anyrange +create function outparam_succeed2(i anyrange, out r anyarray, out t text) + as $$ select ARRAY[upper($1)], 'foo'::text $$ language sql; +select * from outparam_succeed2(int4range(int4range(1,2))); + r | t +-----+----- + {2} | foo +(1 row) + +-- infer anyelement from anyrange +create function inoutparam_succeed(out i anyelement, inout r anyrange) + as $$ select upper($1), $1 $$ language sql; +select * from inoutparam_succeed(int4range(1,2)); + i | r +---+------- + 2 | [1,2) +(1 row) + +create function table_succeed(r anyrange) + returns table(l anyelement, u anyelement) + as $$ select lower($1), upper($1) $$ + language sql; +select * from table_succeed(int4range(1,11)); + l | u +---+---- + 1 | 11 +(1 row) + +-- should fail +create function outparam_fail(i anyelement, out r anyrange, out t text) + as $$ select '[1,10]', 'foo' $$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anyrange requires at least one input of type anyrange or anymultirange. +--should fail +create function inoutparam_fail(inout i anyelement, out r anyrange) + as $$ select $1, '[1,10]' $$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anyrange requires at least one input of type anyrange or anymultirange. +--should fail +create function table_fail(i anyelement) returns table(i anyelement, r anyrange) + as $$ select $1, '[1,10]' $$ language sql; +ERROR: cannot determine result data type +DETAIL: A result of type anyrange requires at least one input of type anyrange or anymultirange. diff --git a/src/test/singlenode_regress/expected/regex.linux.utf8.out b/src/test/singlenode_regress/expected/regex.linux.utf8.out new file mode 100644 index 00000000000..7c170a99f3d --- /dev/null +++ b/src/test/singlenode_regress/expected/regex.linux.utf8.out @@ -0,0 +1,164 @@ +/* + * This test is for Linux/glibc systems and others that implement proper + * locale classification of Unicode characters with high code values. + * It must be run in a database with UTF8 encoding and a Unicode-aware locale. + */ +SET client_encoding TO UTF8; +-- +-- Test the "high colormap" logic with single characters and ranges that +-- exceed the MAX_SIMPLE_CHR cutoff, here assumed to be less than U+2000. +-- +-- trivial cases: +SELECT 'aⓐ' ~ U&'a\24D0' AS t; + t +--- + t +(1 row) + +SELECT 'aⓐ' ~ U&'a\24D1' AS f; + f +--- + f +(1 row) + +SELECT 'aⓕ' ~ 'a[ⓐ-ⓩ]' AS t; + t +--- + t +(1 row) + +SELECT 'aⒻ' ~ 'a[ⓐ-ⓩ]' AS f; + f +--- + f +(1 row) + +-- cases requiring splitting of ranges: +SELECT 'aⓕⓕ' ~ 'aⓕ[ⓐ-ⓩ]' AS t; + t +--- + t +(1 row) + +SELECT 'aⓕⓐ' ~ 'aⓕ[ⓐ-ⓩ]' AS t; + t +--- + t +(1 row) + +SELECT 'aⓐⓕ' ~ 'aⓕ[ⓐ-ⓩ]' AS f; + f +--- + f +(1 row) + +SELECT 'aⓕⓕ' ~ 'a[ⓐ-ⓩ]ⓕ' AS t; + t +--- + t +(1 row) + +SELECT 'aⓕⓐ' ~ 'a[ⓐ-ⓩ]ⓕ' AS f; + f +--- + f +(1 row) + +SELECT 'aⓐⓕ' ~ 'a[ⓐ-ⓩ]ⓕ' AS t; + t +--- + t +(1 row) + +SELECT 'aⒶⓜ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; + t +--- + t +(1 row) + +SELECT 'aⓜⓜ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; + t +--- + t +(1 row) + +SELECT 'aⓜⓩ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; + t +--- + t +(1 row) + +SELECT 'aⓩⓩ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS f; + f +--- + f +(1 row) + +SELECT 'aⓜ⓪' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS f; + f +--- + f +(1 row) + +SELECT 'a0' ~ 'a[a-ⓩ]' AS f; + f +--- + f +(1 row) + +SELECT 'aq' ~ 'a[a-ⓩ]' AS t; + t +--- + t +(1 row) + +SELECT 'aⓜ' ~ 'a[a-ⓩ]' AS t; + t +--- + t +(1 row) + +SELECT 'a⓪' ~ 'a[a-ⓩ]' AS f; + f +--- + f +(1 row) + +-- Locale-dependent character classes +SELECT 'aⒶⓜ⓪' ~ '[[:alpha:]][[:alpha:]][[:alpha:]][[:graph:]]' AS t; + t +--- + t +(1 row) + +SELECT 'aⒶⓜ⓪' ~ '[[:alpha:]][[:alpha:]][[:alpha:]][[:alpha:]]' AS f; + f +--- + f +(1 row) + +-- Locale-dependent character classes with high ranges +SELECT 'aⒶⓜ⓪' ~ '[a-z][[:alpha:]][ⓐ-ⓩ][[:graph:]]' AS t; + t +--- + t +(1 row) + +SELECT 'aⓜⒶ⓪' ~ '[a-z][[:alpha:]][ⓐ-ⓩ][[:graph:]]' AS f; + f +--- + f +(1 row) + +SELECT 'aⓜⒶ⓪' ~ '[a-z][ⓐ-ⓩ][[:alpha:]][[:graph:]]' AS t; + t +--- + t +(1 row) + +SELECT 'aⒶⓜ⓪' ~ '[a-z][ⓐ-ⓩ][[:alpha:]][[:graph:]]' AS f; + f +--- + f +(1 row) + diff --git a/src/test/singlenode_regress/expected/regex.out b/src/test/singlenode_regress/expected/regex.out new file mode 100644 index 00000000000..851a2117499 --- /dev/null +++ b/src/test/singlenode_regress/expected/regex.out @@ -0,0 +1,656 @@ +-- +-- Regular expression tests +-- +-- Don't want to have to double backslashes in regexes +set standard_conforming_strings = on; +-- Test simple quantified backrefs +select 'bbbbb' ~ '^([bc])\1*$' as t; + t +--- + t +(1 row) + +select 'ccc' ~ '^([bc])\1*$' as t; + t +--- + t +(1 row) + +select 'xxx' ~ '^([bc])\1*$' as f; + f +--- + f +(1 row) + +select 'bbc' ~ '^([bc])\1*$' as f; + f +--- + f +(1 row) + +select 'b' ~ '^([bc])\1*$' as t; + t +--- + t +(1 row) + +-- Test quantified backref within a larger expression +select 'abc abc abc' ~ '^(\w+)( \1)+$' as t; + t +--- + t +(1 row) + +select 'abc abd abc' ~ '^(\w+)( \1)+$' as f; + f +--- + f +(1 row) + +select 'abc abc abd' ~ '^(\w+)( \1)+$' as f; + f +--- + f +(1 row) + +select 'abc abc abc' ~ '^(.+)( \1)+$' as t; + t +--- + t +(1 row) + +select 'abc abd abc' ~ '^(.+)( \1)+$' as f; + f +--- + f +(1 row) + +select 'abc abc abd' ~ '^(.+)( \1)+$' as f; + f +--- + f +(1 row) + +-- Test some cases that crashed in 9.2beta1 due to pmatch[] array overrun +select substring('asd TO foo' from ' TO (([a-z0-9._]+|"([^"]+|"")+")+)'); + substring +----------- + foo +(1 row) + +select substring('a' from '((a))+'); + substring +----------- + a +(1 row) + +select substring('a' from '((a)+)'); + substring +----------- + a +(1 row) + +-- Test regexp_match() +select regexp_match('abc', ''); + regexp_match +-------------- + {""} +(1 row) + +select regexp_match('abc', 'bc'); + regexp_match +-------------- + {bc} +(1 row) + +select regexp_match('abc', 'd') is null; + ?column? +---------- + t +(1 row) + +select regexp_match('abc', '(B)(c)', 'i'); + regexp_match +-------------- + {b,c} +(1 row) + +select regexp_match('abc', 'Bd', 'ig'); -- error +ERROR: regexp_match() does not support the "global" option +HINT: Use the regexp_matches function instead. +-- Test lookahead constraints +select regexp_matches('ab', 'a(?=b)b*'); + regexp_matches +---------------- + {ab} +(1 row) + +select regexp_matches('a', 'a(?=b)b*'); + regexp_matches +---------------- +(0 rows) + +select regexp_matches('abc', 'a(?=b)b*(?=c)c*'); + regexp_matches +---------------- + {abc} +(1 row) + +select regexp_matches('ab', 'a(?=b)b*(?=c)c*'); + regexp_matches +---------------- +(0 rows) + +select regexp_matches('ab', 'a(?!b)b*'); + regexp_matches +---------------- +(0 rows) + +select regexp_matches('a', 'a(?!b)b*'); + regexp_matches +---------------- + {a} +(1 row) + +select regexp_matches('b', '(?=b)b'); + regexp_matches +---------------- + {b} +(1 row) + +select regexp_matches('a', '(?=b)b'); + regexp_matches +---------------- +(0 rows) + +-- Test lookbehind constraints +select regexp_matches('abb', '(?<=a)b*'); + regexp_matches +---------------- + {bb} +(1 row) + +select regexp_matches('a', 'a(?<=a)b*'); + regexp_matches +---------------- + {a} +(1 row) + +select regexp_matches('abc', 'a(?<=a)b*(?<=b)c*'); + regexp_matches +---------------- + {abc} +(1 row) + +select regexp_matches('ab', 'a(?<=a)b*(?<=b)c*'); + regexp_matches +---------------- + {ab} +(1 row) + +select regexp_matches('ab', 'a*(?= 'abc'::text) AND (proname < 'abd'::text)) + Filter: (proname ~ '^abc'::text) + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) select * from pg_proc where proname ~ '^abc$'; + QUERY PLAN +----------------------------------------------------------- + Bitmap Heap Scan on pg_proc + Filter: (proname ~ '^abc$'::text) + -> Bitmap Index Scan on pg_proc_proname_args_nsp_index + Index Cond: (proname = 'abc'::text) + Optimizer: Postgres query optimizer +(5 rows) + +explain (costs off) select * from pg_proc where proname ~ '^abcd*e'; + QUERY PLAN +---------------------------------------------------------------------- + Index Scan using pg_proc_proname_args_nsp_index on pg_proc + Index Cond: ((proname >= 'abc'::text) AND (proname < 'abd'::text)) + Filter: (proname ~ '^abcd*e'::text) + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) select * from pg_proc where proname ~ '^abc+d'; + QUERY PLAN +---------------------------------------------------------------------- + Index Scan using pg_proc_proname_args_nsp_index on pg_proc + Index Cond: ((proname >= 'abc'::text) AND (proname < 'abd'::text)) + Filter: (proname ~ '^abc+d'::text) + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) select * from pg_proc where proname ~ '^(abc)(def)'; + QUERY PLAN +---------------------------------------------------------------------------- + Index Scan using pg_proc_proname_args_nsp_index on pg_proc + Index Cond: ((proname >= 'abcdef'::text) AND (proname < 'abcdeg'::text)) + Filter: (proname ~ '^(abc)(def)'::text) + Optimizer: Postgres query optimizer +(4 rows) + +explain (costs off) select * from pg_proc where proname ~ '^(abc)$'; + QUERY PLAN +----------------------------------------------------------- + Bitmap Heap Scan on pg_proc + Filter: (proname ~ '^(abc)$'::text) + -> Bitmap Index Scan on pg_proc_proname_args_nsp_index + Index Cond: (proname = 'abc'::text) + Optimizer: Postgres query optimizer +(5 rows) + +explain (costs off) select * from pg_proc where proname ~ '^(abc)?d'; + QUERY PLAN +---------------------------------------- + Seq Scan on pg_proc + Filter: (proname ~ '^(abc)?d'::text) + Optimizer: Postgres query optimizer +(3 rows) + +explain (costs off) select * from pg_proc where proname ~ '^abcd(x|(?=\w\w)q)'; + QUERY PLAN +------------------------------------------------------------------------ + Index Scan using pg_proc_proname_args_nsp_index on pg_proc + Index Cond: ((proname >= 'abcd'::text) AND (proname < 'abce'::text)) + Filter: (proname ~ '^abcd(x|(?=\w\w)q)'::text) + Optimizer: Postgres query optimizer +(4 rows) + +-- Test for infinite loop in pullback() (CVE-2007-4772) +select 'a' ~ '($|^)*'; + ?column? +---------- + t +(1 row) + +-- These cases expose a bug in the original fix for CVE-2007-4772 +select 'a' ~ '(^)+^'; + ?column? +---------- + t +(1 row) + +select 'a' ~ '$($$)+'; + ?column? +---------- + t +(1 row) + +-- More cases of infinite loop in pullback(), not fixed by CVE-2007-4772 fix +select 'a' ~ '($^)+'; + ?column? +---------- + f +(1 row) + +select 'a' ~ '(^$)*'; + ?column? +---------- + t +(1 row) + +select 'aa bb cc' ~ '(^(?!aa))+'; + ?column? +---------- + f +(1 row) + +select 'aa x' ~ '(^(?!aa)(?!bb)(?!cc))+'; + ?column? +---------- + f +(1 row) + +select 'bb x' ~ '(^(?!aa)(?!bb)(?!cc))+'; + ?column? +---------- + f +(1 row) + +select 'cc x' ~ '(^(?!aa)(?!bb)(?!cc))+'; + ?column? +---------- + f +(1 row) + +select 'dd x' ~ '(^(?!aa)(?!bb)(?!cc))+'; + ?column? +---------- + t +(1 row) + +-- Test for infinite loop in fixempties() (Tcl bugs 3604074, 3606683) +select 'a' ~ '((((((a)*)*)*)*)*)*'; + ?column? +---------- + t +(1 row) + +select 'a' ~ '((((((a+|)+|)+|)+|)+|)+|)'; + ?column? +---------- + t +(1 row) + +-- These cases used to give too-many-states failures +select 'x' ~ 'abcd(\m)+xyz'; + ?column? +---------- + f +(1 row) + +select 'a' ~ '^abcd*(((((^(a c(e?d)a+|)+|)+|)+|)+|a)+|)'; + ?column? +---------- + f +(1 row) + +select 'x' ~ 'a^(^)bcd*xy(((((($a+|)+|)+|)+$|)+|)+|)^$'; + ?column? +---------- + f +(1 row) + +select 'x' ~ 'xyz(\Y\Y)+'; + ?column? +---------- + f +(1 row) + +select 'x' ~ 'x|(?:\M)+'; + ?column? +---------- + t +(1 row) + +-- This generates O(N) states but O(N^2) arcs, so it causes problems +-- if arc count is not constrained +select 'x' ~ repeat('x*y*z*', 1000); +ERROR: invalid regular expression: regular expression is too complex +-- Test backref in combination with non-greedy quantifier +-- https://core.tcl.tk/tcl/tktview/6585b21ca8fa6f3678d442b97241fdd43dba2ec0 +select 'Programmer' ~ '(\w).*?\1' as t; + t +--- + t +(1 row) + +select regexp_matches('Programmer', '(\w)(.*?\1)', 'g'); + regexp_matches +---------------- + {r,ogr} + {m,m} +(2 rows) + +-- Test for proper matching of non-greedy iteration (bug #11478) +select regexp_matches('foo/bar/baz', + '^([^/]+?)(?:/([^/]+?))(?:/([^/]+?))?$', ''); + regexp_matches +---------------- + {foo,bar,baz} +(1 row) + +-- Test that greediness can be overridden by outer quantifier +select regexp_matches('llmmmfff', '^(l*)(.*)(f*)$'); + regexp_matches +---------------- + {ll,mmmfff,""} +(1 row) + +select regexp_matches('llmmmfff', '^(l*){1,1}(.*)(f*)$'); + regexp_matches +---------------- + {ll,mmmfff,""} +(1 row) + +select regexp_matches('llmmmfff', '^(l*){1,1}?(.*)(f*)$'); + regexp_matches +------------------ + {"",llmmmfff,""} +(1 row) + +select regexp_matches('llmmmfff', '^(l*){1,1}?(.*){1,1}?(f*)$'); + regexp_matches +---------------- + {"",llmmm,fff} +(1 row) + +select regexp_matches('llmmmfff', '^(l*?)(.*)(f*)$'); + regexp_matches +------------------ + {"",llmmmfff,""} +(1 row) + +select regexp_matches('llmmmfff', '^(l*?){1,1}(.*)(f*)$'); + regexp_matches +---------------- + {ll,mmmfff,""} +(1 row) + +select regexp_matches('llmmmfff', '^(l*?){1,1}?(.*)(f*)$'); + regexp_matches +------------------ + {"",llmmmfff,""} +(1 row) + +select regexp_matches('llmmmfff', '^(l*?){1,1}?(.*){1,1}?(f*)$'); + regexp_matches +---------------- + {"",llmmm,fff} +(1 row) + +-- Test for infinite loop in cfindloop with zero-length possible match +-- but no actual match (can only happen in the presence of backrefs) +select 'a' ~ '$()|^\1'; + ?column? +---------- + f +(1 row) + +select 'a' ~ '.. ()|\1'; + ?column? +---------- + f +(1 row) + +select 'a' ~ '()*\1'; + ?column? +---------- + t +(1 row) + +select 'a' ~ '()+\1'; + ?column? +---------- + t +(1 row) + +-- Test incorrect removal of capture groups within {0} +select 'xxx' ~ '(.){0}(\1)' as f; + f +--- + f +(1 row) + +select 'xxx' ~ '((.)){0}(\2)' as f; + f +--- + f +(1 row) + +select 'xyz' ~ '((.)){0}(\2){0}' as t; + t +--- + t +(1 row) + +-- Test ancient oversight in when to apply zaptreesubs +select 'abcdef' ~ '^(.)\1|\1.' as f; + f +--- + f +(1 row) + +select 'abadef' ~ '^((.)\2|..)\2' as f; + f +--- + f +(1 row) + +-- Add coverage for some cases in checkmatchall +select regexp_match('xy', '.|...'); + regexp_match +-------------- + {x} +(1 row) + +select regexp_match('xyz', '.|...'); + regexp_match +-------------- + {xyz} +(1 row) + +select regexp_match('xy', '.*'); + regexp_match +-------------- + {xy} +(1 row) + +select regexp_match('fooba', '(?:..)*'); + regexp_match +-------------- + {foob} +(1 row) + +select regexp_match('xyz', repeat('.', 260)); + regexp_match +-------------- + +(1 row) + +select regexp_match('foo', '(?:.|){99}'); + regexp_match +-------------- + {foo} +(1 row) + +-- Error conditions +select 'xyz' ~ 'x(\w)(?=\1)'; -- no backrefs in LACONs +ERROR: invalid regular expression: invalid backreference number +select 'xyz' ~ 'x(\w)(?=(\1))'; +ERROR: invalid regular expression: invalid backreference number +select 'a' ~ '\x7fffffff'; -- invalid chr code +ERROR: invalid regular expression: invalid escape \ sequence diff --git a/src/test/singlenode_regress/expected/regproc.out b/src/test/singlenode_regress/expected/regproc.out new file mode 100644 index 00000000000..7188cf58677 --- /dev/null +++ b/src/test/singlenode_regress/expected/regproc.out @@ -0,0 +1,439 @@ +-- +-- regproc +-- +/* If objects exist, return oids */ +CREATE ROLE regress_regrole_test; +-- without schemaname +-- GPDB: Use !! instead of ||/ in the test, because ||/ is not unique in GPDB +-- (there's an extra ||/ operator for complex datatype) +SELECT regoper('!!'); + regoper +--------- + !! +(1 row) + +SELECT regoperator('+(int4,int4)'); + regoperator +-------------------- + +(integer,integer) +(1 row) + +SELECT regproc('now'); + regproc +--------- + now +(1 row) + +SELECT regprocedure('abs(numeric)'); + regprocedure +-------------- + abs(numeric) +(1 row) + +SELECT regclass('pg_class'); + regclass +---------- + pg_class +(1 row) + +SELECT regtype('int4'); + regtype +--------- + integer +(1 row) + +SELECT regcollation('"POSIX"'); + regcollation +-------------- + "POSIX" +(1 row) + +SELECT to_regoper('!!'); + to_regoper +------------ + !! +(1 row) + +SELECT to_regoperator('+(int4,int4)'); + to_regoperator +-------------------- + +(integer,integer) +(1 row) + +SELECT to_regproc('now'); + to_regproc +------------ + now +(1 row) + +SELECT to_regprocedure('abs(numeric)'); + to_regprocedure +----------------- + abs(numeric) +(1 row) + +SELECT to_regclass('pg_class'); + to_regclass +------------- + pg_class +(1 row) + +SELECT to_regtype('int4'); + to_regtype +------------ + integer +(1 row) + +SELECT to_regcollation('"POSIX"'); + to_regcollation +----------------- + "POSIX" +(1 row) + +-- with schemaname +SELECT regoper('pg_catalog.!!'); + regoper +--------- + !! +(1 row) + +SELECT regoperator('pg_catalog.+(int4,int4)'); + regoperator +-------------------- + +(integer,integer) +(1 row) + +SELECT regproc('pg_catalog.now'); + regproc +--------- + now +(1 row) + +SELECT regprocedure('pg_catalog.abs(numeric)'); + regprocedure +-------------- + abs(numeric) +(1 row) + +SELECT regclass('pg_catalog.pg_class'); + regclass +---------- + pg_class +(1 row) + +SELECT regtype('pg_catalog.int4'); + regtype +--------- + integer +(1 row) + +SELECT regcollation('pg_catalog."POSIX"'); + regcollation +-------------- + "POSIX" +(1 row) + +SELECT to_regoper('pg_catalog.!!'); + to_regoper +------------ + !! +(1 row) + +SELECT to_regproc('pg_catalog.now'); + to_regproc +------------ + now +(1 row) + +SELECT to_regprocedure('pg_catalog.abs(numeric)'); + to_regprocedure +----------------- + abs(numeric) +(1 row) + +SELECT to_regclass('pg_catalog.pg_class'); + to_regclass +------------- + pg_class +(1 row) + +SELECT to_regtype('pg_catalog.int4'); + to_regtype +------------ + integer +(1 row) + +SELECT to_regcollation('pg_catalog."POSIX"'); + to_regcollation +----------------- + "POSIX" +(1 row) + +-- schemaname not applicable +SELECT regrole('regress_regrole_test'); + regrole +---------------------- + regress_regrole_test +(1 row) + +SELECT regrole('"regress_regrole_test"'); + regrole +---------------------- + regress_regrole_test +(1 row) + +SELECT regnamespace('pg_catalog'); + regnamespace +-------------- + pg_catalog +(1 row) + +SELECT regnamespace('"pg_catalog"'); + regnamespace +-------------- + pg_catalog +(1 row) + +SELECT to_regrole('regress_regrole_test'); + to_regrole +---------------------- + regress_regrole_test +(1 row) + +SELECT to_regrole('"regress_regrole_test"'); + to_regrole +---------------------- + regress_regrole_test +(1 row) + +SELECT to_regnamespace('pg_catalog'); + to_regnamespace +----------------- + pg_catalog +(1 row) + +SELECT to_regnamespace('"pg_catalog"'); + to_regnamespace +----------------- + pg_catalog +(1 row) + +/* If objects don't exist, raise errors. */ +DROP ROLE regress_regrole_test; +-- without schemaname +SELECT regoper('||//'); +ERROR: operator does not exist: ||// +LINE 1: SELECT regoper('||//'); + ^ +SELECT regoperator('++(int4,int4)'); +ERROR: operator does not exist: ++(int4,int4) +LINE 1: SELECT regoperator('++(int4,int4)'); + ^ +SELECT regproc('know'); +ERROR: function "know" does not exist +LINE 1: SELECT regproc('know'); + ^ +SELECT regprocedure('absinthe(numeric)'); +ERROR: function "absinthe(numeric)" does not exist +LINE 1: SELECT regprocedure('absinthe(numeric)'); + ^ +SELECT regclass('pg_classes'); +ERROR: relation "pg_classes" does not exist +LINE 1: SELECT regclass('pg_classes'); + ^ +SELECT regtype('int3'); +ERROR: type "int3" does not exist +LINE 1: SELECT regtype('int3'); + ^ +-- with schemaname +SELECT regoper('ng_catalog.||/'); +ERROR: schema "ng_catalog" does not exist +LINE 1: SELECT regoper('ng_catalog.||/'); + ^ +SELECT regoperator('ng_catalog.+(int4,int4)'); +ERROR: operator does not exist: ng_catalog.+(int4,int4) +LINE 1: SELECT regoperator('ng_catalog.+(int4,int4)'); + ^ +SELECT regproc('ng_catalog.now'); +ERROR: schema "ng_catalog" does not exist +LINE 1: SELECT regproc('ng_catalog.now'); + ^ +SELECT regprocedure('ng_catalog.abs(numeric)'); +ERROR: schema "ng_catalog" does not exist +LINE 1: SELECT regprocedure('ng_catalog.abs(numeric)'); + ^ +SELECT regclass('ng_catalog.pg_class'); +ERROR: schema "ng_catalog" does not exist +LINE 1: SELECT regclass('ng_catalog.pg_class'); + ^ +SELECT regtype('ng_catalog.int4'); +ERROR: schema "ng_catalog" does not exist +LINE 1: SELECT regtype('ng_catalog.int4'); + ^ +SELECT regcollation('ng_catalog."POSIX"'); +ERROR: schema "ng_catalog" does not exist +LINE 1: SELECT regcollation('ng_catalog."POSIX"'); + ^ +-- schemaname not applicable +SELECT regrole('regress_regrole_test'); +ERROR: role "regress_regrole_test" does not exist +LINE 1: SELECT regrole('regress_regrole_test'); + ^ +SELECT regrole('"regress_regrole_test"'); +ERROR: role "regress_regrole_test" does not exist +LINE 1: SELECT regrole('"regress_regrole_test"'); + ^ +SELECT regrole('Nonexistent'); +ERROR: role "nonexistent" does not exist +LINE 1: SELECT regrole('Nonexistent'); + ^ +SELECT regrole('"Nonexistent"'); +ERROR: role "Nonexistent" does not exist +LINE 1: SELECT regrole('"Nonexistent"'); + ^ +SELECT regrole('foo.bar'); +ERROR: invalid name syntax +LINE 1: SELECT regrole('foo.bar'); + ^ +SELECT regnamespace('Nonexistent'); +ERROR: schema "nonexistent" does not exist +LINE 1: SELECT regnamespace('Nonexistent'); + ^ +SELECT regnamespace('"Nonexistent"'); +ERROR: schema "Nonexistent" does not exist +LINE 1: SELECT regnamespace('"Nonexistent"'); + ^ +SELECT regnamespace('foo.bar'); +ERROR: invalid name syntax +LINE 1: SELECT regnamespace('foo.bar'); + ^ +/* If objects don't exist, return NULL with no error. */ +-- without schemaname +SELECT to_regoper('||//'); + to_regoper +------------ + +(1 row) + +SELECT to_regoperator('++(int4,int4)'); + to_regoperator +---------------- + +(1 row) + +SELECT to_regproc('know'); + to_regproc +------------ + +(1 row) + +SELECT to_regprocedure('absinthe(numeric)'); + to_regprocedure +----------------- + +(1 row) + +SELECT to_regclass('pg_classes'); + to_regclass +------------- + +(1 row) + +SELECT to_regtype('int3'); + to_regtype +------------ + +(1 row) + +SELECT to_regcollation('notacollation'); + to_regcollation +----------------- + +(1 row) + +-- with schemaname +SELECT to_regoper('ng_catalog.||/'); + to_regoper +------------ + +(1 row) + +SELECT to_regoperator('ng_catalog.+(int4,int4)'); + to_regoperator +---------------- + +(1 row) + +SELECT to_regproc('ng_catalog.now'); + to_regproc +------------ + +(1 row) + +SELECT to_regprocedure('ng_catalog.abs(numeric)'); + to_regprocedure +----------------- + +(1 row) + +SELECT to_regclass('ng_catalog.pg_class'); + to_regclass +------------- + +(1 row) + +SELECT to_regtype('ng_catalog.int4'); + to_regtype +------------ + +(1 row) + +SELECT to_regcollation('ng_catalog."POSIX"'); + to_regcollation +----------------- + +(1 row) + +-- schemaname not applicable +SELECT to_regrole('regress_regrole_test'); + to_regrole +------------ + +(1 row) + +SELECT to_regrole('"regress_regrole_test"'); + to_regrole +------------ + +(1 row) + +SELECT to_regrole('foo.bar'); +ERROR: invalid name syntax +SELECT to_regrole('Nonexistent'); + to_regrole +------------ + +(1 row) + +SELECT to_regrole('"Nonexistent"'); + to_regrole +------------ + +(1 row) + +SELECT to_regrole('foo.bar'); +ERROR: invalid name syntax +SELECT to_regnamespace('Nonexistent'); + to_regnamespace +----------------- + +(1 row) + +SELECT to_regnamespace('"Nonexistent"'); + to_regnamespace +----------------- + +(1 row) + +SELECT to_regnamespace('foo.bar'); +ERROR: invalid name syntax diff --git a/src/test/singlenode_regress/expected/reindex_catalog.out b/src/test/singlenode_regress/expected/reindex_catalog.out new file mode 100644 index 00000000000..204f056c9a5 --- /dev/null +++ b/src/test/singlenode_regress/expected/reindex_catalog.out @@ -0,0 +1,48 @@ +-- +-- Check that system tables can be reindexed. +-- +-- Note that this test currently is not included in the default +-- schedules, as currently reindexing catalog tables can cause +-- deadlocks: +-- +-- * The lock upgrade between the ShareLock acquired for the reindex +-- and RowExclusiveLock needed for pg_class/pg_index locks can +-- trigger deadlocks. +-- +-- * The uniqueness checks performed when reindexing a unique/primary +-- key index possibly need to wait for the transaction of a +-- about-to-deleted row in pg_class to commit. That can cause +-- deadlocks because, in contrast to user tables, locks on catalog +-- tables are routinely released before commit - therefore the lock +-- held for reindexing doesn't guarantee that no running transaction +-- performed modifications in the table underlying the index. +-- +-- This is particularly problematic as such conflicts can be +-- triggered even when run in isolation, as a previous session's +-- temporary table cleanup might still be running (even when the +-- session ended from a client perspective). +-- Check reindexing of whole tables +REINDEX TABLE pg_class; -- mapped, non-shared, critical +REINDEX TABLE pg_index; -- non-mapped, non-shared, critical +REINDEX TABLE pg_operator; -- non-mapped, non-shared, critical +REINDEX TABLE pg_database; -- mapped, shared, critical +REINDEX TABLE pg_shdescription; -- mapped, shared non-critical +-- Check that individual system indexes can be reindexed. That's a bit +-- different from the entire-table case because reindex_relation +-- treats e.g. pg_class special. +REINDEX INDEX pg_class_oid_index; -- mapped, non-shared, critical +REINDEX INDEX pg_class_relname_nsp_index; -- mapped, non-shared, non-critical +REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical +REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical +REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical +REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical +-- Check the same REINDEX INDEX statements under parallelism. +BEGIN; +SET min_parallel_table_scan_size = 0; +REINDEX INDEX pg_class_oid_index; -- mapped, non-shared, critical +REINDEX INDEX pg_class_relname_nsp_index; -- mapped, non-shared, non-critical +REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical +REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical +REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical +REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical +ROLLBACK; diff --git a/src/test/singlenode_regress/expected/reloptions.out b/src/test/singlenode_regress/expected/reloptions.out new file mode 100644 index 00000000000..ceb569e280b --- /dev/null +++ b/src/test/singlenode_regress/expected/reloptions.out @@ -0,0 +1,232 @@ +-- Simple create +CREATE TABLE reloptions_test(i INT) WITH (FiLLFaCToR=30, + autovacuum_enabled = false, autovacuum_analyze_scale_factor = 0.2); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +------------------------------------------------------------------------------ + {fillfactor=30,autovacuum_enabled=false,autovacuum_analyze_scale_factor=0.2} +(1 row) + +-- Fail min/max values check +CREATE TABLE reloptions_test2(i INT) WITH (fillfactor=2); +ERROR: value 2 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +CREATE TABLE reloptions_test2(i INT) WITH (fillfactor=110); +ERROR: value 110 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +CREATE TABLE reloptions_test2(i INT) WITH (autovacuum_analyze_scale_factor = -10.0); +ERROR: value -10.0 out of bounds for option "autovacuum_analyze_scale_factor" +DETAIL: Valid values are between "0.000000" and "100.000000". +CREATE TABLE reloptions_test2(i INT) WITH (autovacuum_analyze_scale_factor = 110.0); +ERROR: value 110.0 out of bounds for option "autovacuum_analyze_scale_factor" +DETAIL: Valid values are between "0.000000" and "100.000000". +-- Fail when option and namespace do not exist +CREATE TABLE reloptions_test2(i INT) WITH (not_existing_option=2); +ERROR: unrecognized parameter "not_existing_option" +CREATE TABLE reloptions_test2(i INT) WITH (not_existing_namespace.fillfactor=2); +ERROR: unrecognized parameter namespace "not_existing_namespace" +-- Fail while setting improper values +CREATE TABLE reloptions_test2(i INT) WITH (fillfactor=-30.1); +ERROR: value -30.1 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +CREATE TABLE reloptions_test2(i INT) WITH (fillfactor='string'); +ERROR: invalid value for integer option "fillfactor": string +CREATE TABLE reloptions_test2(i INT) WITH (fillfactor=true); +ERROR: invalid value for integer option "fillfactor": true +CREATE TABLE reloptions_test2(i INT) WITH (autovacuum_enabled=12); +ERROR: invalid value for boolean option "autovacuum_enabled": 12 +CREATE TABLE reloptions_test2(i INT) WITH (autovacuum_enabled=30.5); +ERROR: invalid value for boolean option "autovacuum_enabled": 30.5 +CREATE TABLE reloptions_test2(i INT) WITH (autovacuum_enabled='string'); +ERROR: invalid value for boolean option "autovacuum_enabled": string +CREATE TABLE reloptions_test2(i INT) WITH (autovacuum_analyze_scale_factor='string'); +ERROR: invalid value for floating point option "autovacuum_analyze_scale_factor": string +CREATE TABLE reloptions_test2(i INT) WITH (autovacuum_analyze_scale_factor=true); +ERROR: invalid value for floating point option "autovacuum_analyze_scale_factor": true +-- Fail if option is specified twice +CREATE TABLE reloptions_test2(i INT) WITH (fillfactor=30, fillfactor=40); +ERROR: parameter "fillfactor" specified more than once +-- Specifying name only for a non-Boolean option should fail +CREATE TABLE reloptions_test2(i INT) WITH (fillfactor); +ERROR: invalid value for integer option "fillfactor": true +-- Simple ALTER TABLE +ALTER TABLE reloptions_test SET (fillfactor=31, + autovacuum_analyze_scale_factor = 0.3); +WARNING: autovacuum is not supported in Cloudberry +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +------------------------------------------------------------------------------ + {autovacuum_enabled=false,fillfactor=31,autovacuum_analyze_scale_factor=0.3} +(1 row) + +-- Set boolean option to true without specifying value +ALTER TABLE reloptions_test SET (autovacuum_enabled, fillfactor=32); +WARNING: autovacuum is not supported in Cloudberry +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +----------------------------------------------------------------------------- + {autovacuum_analyze_scale_factor=0.3,autovacuum_enabled=true,fillfactor=32} +(1 row) + +-- Check that RESET works well +ALTER TABLE reloptions_test RESET (fillfactor); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +--------------------------------------------------------------- + {autovacuum_analyze_scale_factor=0.3,autovacuum_enabled=true} +(1 row) + +-- Resetting all values causes the column to become null +ALTER TABLE reloptions_test RESET (autovacuum_enabled, + autovacuum_analyze_scale_factor); +WARNING: autovacuum is not supported in Cloudberry +WARNING: autovacuum is not supported in Cloudberry +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass AND + reloptions IS NULL; + reloptions +------------ + +(1 row) + +-- RESET fails if a value is specified +ALTER TABLE reloptions_test RESET (fillfactor=12); +ERROR: RESET must not include values for parameters +-- Test vacuum_truncate option +DROP TABLE reloptions_test; +CREATE TEMP TABLE reloptions_test(i INT NOT NULL, j text) + WITH (vacuum_truncate=false, + toast.vacuum_truncate=false, + autovacuum_enabled=false); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +-------------------------------------------------- + {vacuum_truncate=false,autovacuum_enabled=false} +(1 row) + +INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL); +ERROR: null value in column "i" of relation "reloptions_test" violates not-null constraint +DETAIL: Failing row contains (null, null). +-- Do an aggressive vacuum to prevent page-skipping. +VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) reloptions_test; +SELECT pg_relation_size('reloptions_test') > 0; + ?column? +---------- + t +(1 row) + +SELECT reloptions FROM pg_class WHERE oid = + (SELECT reltoastrelid FROM pg_class + WHERE oid = 'reloptions_test'::regclass); + reloptions +------------------------- + {vacuum_truncate=false} +(1 row) + +ALTER TABLE reloptions_test RESET (vacuum_truncate); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +---------------------------- + {autovacuum_enabled=false} +(1 row) + +INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL); +ERROR: null value in column "i" of relation "reloptions_test" violates not-null constraint +DETAIL: Failing row contains (null, null). +-- Do an aggressive vacuum to prevent page-skipping. +VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) reloptions_test; +SELECT pg_relation_size('reloptions_test') = 0; + ?column? +---------- + t +(1 row) + +-- Test toast.* options +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test (s VARCHAR) + WITH (toast.autovacuum_vacuum_cost_delay = 23); +SELECT reltoastrelid as toast_oid + FROM pg_class WHERE oid = 'reloptions_test'::regclass \gset +SELECT reloptions FROM pg_class WHERE oid = :toast_oid; + reloptions +----------------------------------- + {autovacuum_vacuum_cost_delay=23} +(1 row) + +ALTER TABLE reloptions_test SET (toast.autovacuum_vacuum_cost_delay = 24); +WARNING: autovacuum is not supported in Cloudberry +SELECT reloptions FROM pg_class WHERE oid = :toast_oid; + reloptions +----------------------------------- + {autovacuum_vacuum_cost_delay=24} +(1 row) + +ALTER TABLE reloptions_test RESET (toast.autovacuum_vacuum_cost_delay); +WARNING: autovacuum is not supported in Cloudberry +SELECT reloptions FROM pg_class WHERE oid = :toast_oid; + reloptions +------------ + +(1 row) + +-- Fail on non-existent options in toast namespace +CREATE TABLE reloptions_test2 (i int) WITH (toast.not_existing_option = 42); +ERROR: unrecognized parameter "not_existing_option" +-- Mix TOAST & heap +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test (s VARCHAR) WITH + (toast.autovacuum_vacuum_cost_delay = 23, + autovacuum_vacuum_cost_delay = 24, fillfactor = 40); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +------------------------------------------------- + {autovacuum_vacuum_cost_delay=24,fillfactor=40} +(1 row) + +SELECT reloptions FROM pg_class WHERE oid = ( + SELECT reltoastrelid FROM pg_class WHERE oid = 'reloptions_test'::regclass); + reloptions +----------------------------------- + {autovacuum_vacuum_cost_delay=23} +(1 row) + +-- +-- CREATE INDEX, ALTER INDEX for btrees +-- +CREATE INDEX reloptions_test_idx ON reloptions_test (s) WITH (fillfactor=30); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test_idx'::regclass; + reloptions +----------------- + {fillfactor=30} +(1 row) + +-- Fail when option and namespace do not exist +CREATE INDEX reloptions_test_idx ON reloptions_test (s) + WITH (not_existing_option=2); +ERROR: unrecognized parameter "not_existing_option" +CREATE INDEX reloptions_test_idx ON reloptions_test (s) + WITH (not_existing_ns.fillfactor=2); +ERROR: unrecognized parameter namespace "not_existing_ns" +-- Check allowed ranges +CREATE INDEX reloptions_test_idx2 ON reloptions_test (s) WITH (fillfactor=1); +ERROR: value 1 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +CREATE INDEX reloptions_test_idx2 ON reloptions_test (s) WITH (fillfactor=130); +ERROR: value 130 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +-- Check ALTER +ALTER INDEX reloptions_test_idx SET (fillfactor=40); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test_idx'::regclass; + reloptions +----------------- + {fillfactor=40} +(1 row) + +-- Check ALTER on empty reloption list +CREATE INDEX reloptions_test_idx3 ON reloptions_test (s); +ALTER INDEX reloptions_test_idx3 SET (fillfactor=40); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test_idx3'::regclass; + reloptions +----------------- + {fillfactor=40} +(1 row) + diff --git a/src/test/singlenode_regress/expected/replica_identity.out b/src/test/singlenode_regress/expected/replica_identity.out new file mode 100644 index 00000000000..133d2bd8e11 --- /dev/null +++ b/src/test/singlenode_regress/expected/replica_identity.out @@ -0,0 +1,235 @@ +CREATE TABLE test_replica_identity ( + id serial primary key, + keya text not null, + keyb text not null, + nonkey text, + CONSTRAINT test_replica_identity_unique_defer UNIQUE (keya, keyb) DEFERRABLE, + CONSTRAINT test_replica_identity_unique_nondefer UNIQUE (keya, keyb) +) ; +CREATE TABLE test_replica_identity_othertable (id serial primary key); +CREATE INDEX test_replica_identity_keyab ON test_replica_identity (keya, keyb); +CREATE UNIQUE INDEX test_replica_identity_keyab_key ON test_replica_identity (keya, keyb); +CREATE UNIQUE INDEX test_replica_identity_nonkey ON test_replica_identity (keya, nonkey); +CREATE INDEX test_replica_identity_hash ON test_replica_identity USING hash (nonkey); +CREATE UNIQUE INDEX test_replica_identity_expr ON test_replica_identity (keya, keyb, (3)); +CREATE UNIQUE INDEX test_replica_identity_partial ON test_replica_identity (keya, keyb) WHERE keyb != '3'; +-- default is 'd'/DEFAULT for user created tables +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + relreplident +-------------- + d +(1 row) + +-- but 'none' for system tables +SELECT relreplident FROM pg_class WHERE oid = 'pg_class'::regclass; + relreplident +-------------- + n +(1 row) + +SELECT relreplident FROM pg_class WHERE oid = 'pg_constraint'::regclass; + relreplident +-------------- + n +(1 row) + +---- +-- Make sure we detect ineligible indexes +---- +-- fail, not unique +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab; +ERROR: cannot use non-unique index "test_replica_identity_keyab" as replica identity +-- fail, not a candidate key, nullable column +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_nonkey; +ERROR: index "test_replica_identity_nonkey" cannot be used as replica identity because column "nonkey" is nullable +-- fail, hash indexes cannot do uniqueness +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_hash; +ERROR: cannot use non-unique index "test_replica_identity_hash" as replica identity +-- fail, expression index +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_expr; +ERROR: cannot use expression index "test_replica_identity_expr" as replica identity +-- fail, partial index +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_partial; +ERROR: cannot use partial index "test_replica_identity_partial" as replica identity +-- fail, not our index +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_othertable_pkey; +ERROR: "test_replica_identity_othertable_pkey" is not an index for table "test_replica_identity" +-- fail, deferrable +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_unique_defer; +ERROR: cannot use non-immediate index "test_replica_identity_unique_defer" as replica identity +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + relreplident +-------------- + d +(1 row) + +---- +-- Make sure index cases succeed +---- +-- succeed, primary key +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_pkey; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + relreplident +-------------- + i +(1 row) + +\d test_replica_identity + Table "public.test_replica_identity" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------------------------------------------------- + id | integer | | not null | nextval('test_replica_identity_id_seq'::regclass) + keya | text | | not null | + keyb | text | | not null | + nonkey | text | | | +Indexes: + "test_replica_identity_pkey" PRIMARY KEY, btree (id) REPLICA IDENTITY + "test_replica_identity_expr" UNIQUE, btree (keya, keyb, (3)) + "test_replica_identity_hash" hash (nonkey) + "test_replica_identity_keyab" btree (keya, keyb) + "test_replica_identity_keyab_key" UNIQUE, btree (keya, keyb) + "test_replica_identity_nonkey" UNIQUE, btree (keya, nonkey) + "test_replica_identity_partial" UNIQUE, btree (keya, keyb) WHERE keyb <> '3'::text + "test_replica_identity_unique_defer" UNIQUE CONSTRAINT, btree (keya, keyb) DEFERRABLE + "test_replica_identity_unique_nondefer" UNIQUE CONSTRAINT, btree (keya, keyb) + +-- succeed, nondeferrable unique constraint over nonnullable cols +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_unique_nondefer; +-- succeed unique index over nonnullable cols +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab_key; +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab_key; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + relreplident +-------------- + i +(1 row) + +\d test_replica_identity + Table "public.test_replica_identity" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------------------------------------------------- + id | integer | | not null | nextval('test_replica_identity_id_seq'::regclass) + keya | text | | not null | + keyb | text | | not null | + nonkey | text | | | +Indexes: + "test_replica_identity_pkey" PRIMARY KEY, btree (id) + "test_replica_identity_expr" UNIQUE, btree (keya, keyb, (3)) + "test_replica_identity_hash" hash (nonkey) + "test_replica_identity_keyab" btree (keya, keyb) + "test_replica_identity_keyab_key" UNIQUE, btree (keya, keyb) REPLICA IDENTITY + "test_replica_identity_nonkey" UNIQUE, btree (keya, nonkey) + "test_replica_identity_partial" UNIQUE, btree (keya, keyb) WHERE keyb <> '3'::text + "test_replica_identity_unique_defer" UNIQUE CONSTRAINT, btree (keya, keyb) DEFERRABLE + "test_replica_identity_unique_nondefer" UNIQUE CONSTRAINT, btree (keya, keyb) + +SELECT count(*) FROM pg_index WHERE indrelid = 'test_replica_identity'::regclass AND indisreplident; + count +------- + 1 +(1 row) + +---- +-- Make sure non index cases work +---- +ALTER TABLE test_replica_identity REPLICA IDENTITY DEFAULT; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + relreplident +-------------- + d +(1 row) + +SELECT count(*) FROM pg_index WHERE indrelid = 'test_replica_identity'::regclass AND indisreplident; + count +------- + 0 +(1 row) + +ALTER TABLE test_replica_identity REPLICA IDENTITY FULL; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + relreplident +-------------- + f +(1 row) + +\d+ test_replica_identity + Table "public.test_replica_identity" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------------------------------------------------+----------+--------------+------------- + id | integer | | not null | nextval('test_replica_identity_id_seq'::regclass) | plain | | + keya | text | | not null | | extended | | + keyb | text | | not null | | extended | | + nonkey | text | | | | extended | | +Indexes: + "test_replica_identity_pkey" PRIMARY KEY, btree (id) + "test_replica_identity_expr" UNIQUE, btree (keya, keyb, (3)) + "test_replica_identity_hash" hash (nonkey) + "test_replica_identity_keyab" btree (keya, keyb) + "test_replica_identity_keyab_key" UNIQUE, btree (keya, keyb) + "test_replica_identity_nonkey" UNIQUE, btree (keya, nonkey) + "test_replica_identity_partial" UNIQUE, btree (keya, keyb) WHERE keyb <> '3'::text + "test_replica_identity_unique_defer" UNIQUE CONSTRAINT, btree (keya, keyb) DEFERRABLE + "test_replica_identity_unique_nondefer" UNIQUE CONSTRAINT, btree (keya, keyb) +Replica Identity: FULL + +ALTER TABLE test_replica_identity REPLICA IDENTITY NOTHING; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + relreplident +-------------- + n +(1 row) + +--- +-- Test that ALTER TABLE rewrite preserves nondefault replica identity +--- +-- constraint variant +CREATE TABLE test_replica_identity2 (id int UNIQUE NOT NULL); +ALTER TABLE test_replica_identity2 REPLICA IDENTITY USING INDEX test_replica_identity2_id_key; +\d test_replica_identity2 + Table "public.test_replica_identity2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | +Indexes: + "test_replica_identity2_id_key" UNIQUE CONSTRAINT, btree (id) REPLICA IDENTITY + +ALTER TABLE test_replica_identity2 ALTER COLUMN id TYPE bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +\d test_replica_identity2 + Table "public.test_replica_identity2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | +Indexes: + "test_replica_identity2_id_key" UNIQUE CONSTRAINT, btree (id) REPLICA IDENTITY + +-- straight index variant +CREATE TABLE test_replica_identity3 (id int NOT NULL); +CREATE UNIQUE INDEX test_replica_identity3_id_key ON test_replica_identity3 (id); +ALTER TABLE test_replica_identity3 REPLICA IDENTITY USING INDEX test_replica_identity3_id_key; +\d test_replica_identity3 + Table "public.test_replica_identity3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | +Indexes: + "test_replica_identity3_id_key" UNIQUE, btree (id) REPLICA IDENTITY + +ALTER TABLE test_replica_identity3 ALTER COLUMN id TYPE bigint; +\d test_replica_identity3 + Table "public.test_replica_identity3" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+--------- + id | bigint | | not null | +Indexes: + "test_replica_identity3_id_key" UNIQUE, btree (id) REPLICA IDENTITY + +-- ALTER TABLE DROP NOT NULL is not allowed for columns part of an index +-- used as replica identity. +ALTER TABLE test_replica_identity3 ALTER COLUMN id DROP NOT NULL; +ERROR: column "id" is in index used as replica identity +DROP TABLE test_replica_identity; +DROP TABLE test_replica_identity2; +DROP TABLE test_replica_identity3; +DROP TABLE test_replica_identity_othertable; diff --git a/src/test/singlenode_regress/expected/resource_queue.out b/src/test/singlenode_regress/expected/resource_queue.out new file mode 100755 index 00000000000..d8c00ed132f --- /dev/null +++ b/src/test/singlenode_regress/expected/resource_queue.out @@ -0,0 +1,616 @@ +-- SQL coverage of RESOURCE QUEUE +CREATE RESOURCE QUEUE regressq ACTIVE THRESHOLD 1; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 1 | -1 | f | 0 +(1 row) + +ALTER RESOURCE QUEUE regressq ACTIVE THRESHOLD 2 COST THRESHOLD 2000.00; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 2 | 2000 | f | 0 +(1 row) + +ALTER RESOURCE QUEUE regressq COST THRESHOLD 3000.00 OVERCOMMIT; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 2 | 3000 | t | 0 +(1 row) + +ALTER RESOURCE QUEUE regressq COST THRESHOLD 4e+3 NOOVERCOMMIT; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 2 | 4000 | f | 0 +(1 row) + +COMMENT ON RESOURCE QUEUE regressq IS 'regressq comment'; +DROP RESOURCE QUEUE regressq; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +---------+---------------+--------------+---------------+-------------------- +(0 rows) + +-- more coverage +CREATE RESOURCE QUEUE regressq ACTIVE THRESHOLD 1 WITH (max_cost=2000); +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 1 | 2000 | f | 0 +(1 row) + +ALTER RESOURCE QUEUE regressq ACTIVE THRESHOLD 1 WITHOUT (max_cost); +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 1 | -1 | f | 0 +(1 row) + +ALTER RESOURCE QUEUE regressq ACTIVE THRESHOLD 1 WITH (max_cost=2000) +WITHOUT (overcommit); -- negative +ERROR: option "overcommit" is not a valid resource type +ALTER RESOURCE QUEUE regressq ACTIVE THRESHOLD 1 WITH (max_cost=2000) +WITHOUT (cost_overcommit); -- works +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 1 | 2000 | f | 0 +(1 row) + +ALTER RESOURCE QUEUE regressq OVERCOMMIT WITH (max_cost=2000); +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 1 | 2000 | t | 0 +(1 row) + +ALTER RESOURCE QUEUE regressq IGNORE THRESHOLD 1 WITHOUT (max_cost); +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +----------+---------------+--------------+---------------+-------------------- + regressq | 1 | -1 | t | 1 +(1 row) + +ALTER RESOURCE QUEUE regressq WITH (priority=high); +SELECT * FROM pg_resqueue_attributes WHERE rsqname='regressq'; + rsqname | resname | ressetting | restypid +----------+-------------------+------------+---------- + regressq | active_statements | 1 | 1 + regressq | max_cost | -1 | 2 + regressq | min_cost | 1 | 3 + regressq | cost_overcommit | 1 | 4 + regressq | priority | high | 5 + regressq | memory_limit | -1 | 6 +(6 rows) + +ALTER RESOURCE QUEUE regressq WITH (priority='MeDiUm'); +SELECT * FROM pg_resqueue_attributes WHERE rsqname='regressq'; + rsqname | resname | ressetting | restypid +----------+-------------------+------------+---------- + regressq | active_statements | 1 | 1 + regressq | max_cost | -1 | 2 + regressq | min_cost | 1 | 3 + regressq | cost_overcommit | 1 | 4 + regressq | priority | MeDiUm | 5 + regressq | memory_limit | -1 | 6 +(6 rows) + +ALTER RESOURCE QUEUE regressq; +ERROR: at least one threshold, overcommit or ignore limit must be specified +DROP RESOURCE QUEUE regressq; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +---------+---------------+--------------+---------------+-------------------- +(0 rows) + +-- negative +CREATE RESOURCE QUEUE regressq2; +ERROR: at least one threshold ("ACTIVE_STATEMENTS", "MAX_COST") must be specified +CREATE RESOURCE QUEUE none ACTIVE THRESHOLD 2; +ERROR: resource queue name "none" is reserved +; +CREATE RESOURCE QUEUE regressq2 ACTIVE THRESHOLD 2; +ALTER RESOURCE QUEUE regressq2 ACTIVE THRESHOLD -10; +ERROR: active threshold cannot be less than -1 or equal to 0 +ALTER RESOURCE QUEUE regressq2 COST THRESHOLD -1000.00; +ERROR: cost threshold must be equal to -1 or greater than 0 +ALTER RESOURCE QUEUE regressq2 WITH(max_cost=20,max_cost=21); +ERROR: conflicting or redundant options +ALTER RESOURCE QUEUE regressq2 WITH(PRIORITY=funky); +ERROR: Invalid parameter value "funky" for resource type "PRIORITY" +ALTER RESOURCE QUEUE regressq2 WITHOUT(PRIORITY); +ERROR: option "priority" cannot be disabled +DROP RESOURCE QUEUE regressq2; +CREATE RESOURCE QUEUE regressq2 ACTIVE THRESHOLD -10; +ERROR: active threshold cannot be less than -1 or equal to 0 +CREATE RESOURCE QUEUE regressq2 COST THRESHOLD -1000.00; +ERROR: cost threshold cannot be less than -1 or equal to 0 +CREATE RESOURCE QUEUE regressq2 IGNORE THRESHOLD -10; +ERROR: min_cost threshold cannot be negative +CREATE RESOURCE QUEUE regressq2 ACTIVE THRESHOLD 2 ACTIVE THRESHOLD 2; +ERROR: conflicting or redundant options +CREATE RESOURCE QUEUE regressq2 COST THRESHOLD 2 COST THRESHOLD 2; +ERROR: conflicting or redundant options +CREATE RESOURCE QUEUE regressq2 OVERCOMMIT OVERCOMMIT; +ERROR: conflicting or redundant options +CREATE RESOURCE QUEUE regressq2 OVERCOMMIT NOOVERCOMMIT; +ERROR: conflicting or redundant options +CREATE RESOURCE QUEUE regressq2 IGNORE THRESHOLD 1 IGNORE THRESHOLD 1 ; +ERROR: conflicting or redundant options +CREATE RESOURCE QUEUE regressq2 WITH (WITHLISTSTART=funky); +ERROR: option "withliststart" is not a valid resource type +CREATE RESOURCE QUEUE regressq2 ACTIVE THRESHOLD 2; +ALTER RESOURCE QUEUE regressq2 ACTIVE THRESHOLD 2 ACTIVE THRESHOLD 2; +ERROR: conflicting or redundant options +ALTER RESOURCE QUEUE regressq2 COST THRESHOLD 2 COST THRESHOLD 2; +ERROR: conflicting or redundant options +ALTER RESOURCE QUEUE regressq2 OVERCOMMIT OVERCOMMIT; +ERROR: conflicting or redundant options +ALTER RESOURCE QUEUE regressq2 OVERCOMMIT NOOVERCOMMIT; +ERROR: conflicting or redundant options +ALTER RESOURCE QUEUE regressq2 IGNORE THRESHOLD 1 IGNORE THRESHOLD 1 ; +ERROR: conflicting or redundant options +ALTER RESOURCE QUEUE none IGNORE THRESHOLD 1 ; +ERROR: resource queue "none" does not exist +DROP RESOURCE QUEUE regressq2; +-- Create resource queue with cost_overcommit=true +create resource queue t3_test_q with (active_statements = 6,max_cost=5e+06 ,cost_overcommit=true, min_cost=50000); +select rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit from pg_resqueue where rsqname='t3_test_q'; + rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit +-----------+---------------+--------------+---------------+-------------------- + t3_test_q | 6 | 5e+06 | t | 50000 +(1 row) + +drop resource queue t3_test_q; +-- Resource Queue should not be created inside Transaction block the error is the expected behavior +begin; +CREATE RESOURCE QUEUE db_resque_new1 ACTIVE THRESHOLD 2 COST THRESHOLD 2000.00; +ERROR: CREATE RESOURCE QUEUE cannot run inside a transaction block +end; +-- +-- memory quota feature +-- +-- negative +create resource queue test_rq with (max_cost=2000000, memory_limit='1gB'); -- should error out +ERROR: Invalid parameter value "1gB" for resource type "MEMORY_LIMIT". Value must be in kB, MB or GB. +create resource queue test_rq with (max_cost=2000000, memory_limit='0'); -- should error out +ERROR: Invalid parameter value "0" for resource type "MEMORY_LIMIT". Value must be at least 10240kB +-- Creates and drops +create resource queue test_rq with (active_statements=2); +drop resource queue test_rq; +create resource queue test_rq with (active_statements=2, memory_limit='1024MB'); +-- +-- CPU priority feature +-- +create resource queue test_rq_cpu with (active_statements=2, priority='HIGH'); +create user test_rp_user with login; +alter role test_rp_user resource queue test_rq_cpu; +SET ROLE test_rp_user; +-- query priority and weight on master +select rqppriority, rqpweight from gp_toolkit.gp_resq_priority_backend where rqpsession in (select sess_id from pg_stat_activity where pid = pg_backend_pid()); + rqppriority | rqpweight +-------------+----------- + HIGH | 1000 +(1 row) + +-- start_ignore +-- query priority and weight on segments +select rqppriority, rqpweight from gp_dist_random('gp_toolkit.gp_resq_priority_backend') where rqpsession in (select sess_id from pg_stat_activity where pid = pg_backend_pid()); + rqppriority | rqpweight +-------------+----------- + HIGH | 1000 + HIGH | 1000 + HIGH | 1000 +(3 rows) +-- end_ignore +RESET ROLE; +drop user test_rp_user; +drop resource queue test_rq_cpu; +-- Alters +alter resource queue test_rq with (memory_limit='1024mb'); +ERROR: Invalid parameter value "1024mb" for resource type "MEMORY_LIMIT". Value must be in kB, MB or GB. +alter resource queue test_rq with (memory_limit='1024Kb'); +ERROR: Invalid parameter value "1024Kb" for resource type "MEMORY_LIMIT". Value must be in kB, MB or GB. +alter resource queue test_rq with (memory_limit='2GB'); +alter resource queue test_rq without (memory_limit); +drop resource queue test_rq; +-- SQL coverage of ROLE -> RESOURCE QUEUE +CREATE RESOURCE QUEUE reg_activeq ACTIVE THRESHOLD 2; +CREATE RESOURCE QUEUE reg_costq COST THRESHOLD 30000.00; +CREATE USER reg_u1 RESOURCE QUEUE reg_costq; +GRANT SELECT ON tenk1 TO reg_u1; +SELECT u.rolname, u.rolsuper, r.rsqname FROM pg_roles as u, pg_resqueue as r WHERE u.rolresqueue=r.oid and rolname='reg_u1'; + rolname | rolsuper | rsqname +---------+----------+----------- + reg_u1 | f | reg_costq +(1 row) + +ALTER USER reg_u1 RESOURCE QUEUE reg_activeq; +SELECT u.rolname, u.rolsuper, r.rsqname FROM pg_roles as u, pg_resqueue as r WHERE u.rolresqueue=r.oid and rolname='reg_u1'; + rolname | rolsuper | rsqname +---------+----------+------------- + reg_u1 | f | reg_activeq +(1 row) + +CREATE USER reg_u2 RESOURCE QUEUE reg_activeq; +GRANT SELECT ON tenk1 TO reg_u2; +SELECT u.rolname, u.rolsuper, r.rsqname FROM pg_roles as u, pg_resqueue as r WHERE u.rolresqueue=r.oid and r.rsqname='reg_activeq'; + rolname | rolsuper | rsqname +---------+----------+------------- + reg_u2 | f | reg_activeq + reg_u1 | f | reg_activeq +(2 rows) + +-- negative +CREATE USER reg_u3 RESOURCE QUEUE bogusq; +ERROR: resource queue "bogusq" does not exist +-- feature must be on for tests to be valid +show resource_scheduler; + resource_scheduler +-------------------- + on +(1 row) + +-- switch to a non privileged user for next tests +SET SESSION AUTHORIZATION reg_u1; +-- self deadlock (active queue threshold 2) +BEGIN; +DECLARE c1 CURSOR FOR SELECT 1 FROM tenk1; +DECLARE c2 CURSOR FOR SELECT 2 FROM tenk1; +DECLARE c3 CURSOR FOR SELECT 3 FROM tenk1; -- should detect deadlock +ERROR: deadlock detected, locking against self +END; +-- track cursor open/close count (should not deadlock) +BEGIN; +DECLARE c1 CURSOR FOR SELECT 1 FROM tenk1; +CLOSE c1; +DECLARE c2 CURSOR FOR SELECT 2 FROM tenk1; +DECLARE c3 CURSOR FOR SELECT 3 FROM tenk1; +CLOSE c3; +DECLARE c4 CURSOR FOR SELECT 4 FROM tenk1; +FETCH c4; + ?column? +---------- + 4 +(1 row) + +END; +-- switch to a cost-limited queue +RESET SESSION AUTHORIZATION; +ALTER USER reg_u2 RESOURCE QUEUE reg_costq; +SET SESSION AUTHORIZATION reg_u2; +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM tenk1; +SELECT rsqname, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; + rsqname | rsqholders +-----------+------------ + reg_costq | 2 +(1 row) + +DECLARE c2 CURSOR FOR SELECT * FROM tenk1 a NATURAL JOIN tenk1 b; +SELECT rsqname, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; + rsqname | rsqholders +-----------+------------ + reg_costq | 3 +(1 row) + +CLOSE c1; +CLOSE c2; +END; +-- rsqcostvalue should go back to 0 when queue is empty (MPP-3578) +SELECT rsqname, rsqholders FROM pg_resqueue_status where rsqcostvalue != 0 or rsqcountvalue != 0 or rsqholders != 0; + rsqname | rsqholders +-----------+------------ + reg_costq | 1 +(1 row) + +-- MPP-3796. When a cursor exceeds the cost limit and the transaction is +-- aborted, resources which had already been granted to other cursors should +-- be released. Here there are no other concurrent transactions sharing the +-- queue, so rsqcostvalue should go back to 0. +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM tenk1; +SELECT rsqname, rsqcostlimit, rsqwaiters, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; + rsqname | rsqcostlimit | rsqwaiters | rsqholders +-----------+--------------+------------+------------ + reg_costq | 30000 | 0 | 2 +(1 row) + +DECLARE c2 CURSOR FOR SELECT * FROM tenk1; +SELECT rsqname, rsqcostlimit, rsqwaiters, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; + rsqname | rsqcostlimit | rsqwaiters | rsqholders +-----------+--------------+------------+------------ + reg_costq | 30000 | 0 | 3 +(1 row) + +DECLARE c3 CURSOR FOR SELECT * FROM tenk1 a, tenk1 b; +ERROR: statement requires more resources than resource queue allows +SELECT rsqname, rsqcostlimit, rsqwaiters, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; +ERROR: current transaction is aborted, commands ignored until end of transaction block +DECLARE c4 CURSOR FOR SELECT * FROM tenk1 a, tenk1 b, tenk1 c; +ERROR: current transaction is aborted, commands ignored until end of transaction block +SELECT rsqname, rsqcostlimit, rsqwaiters, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; +ERROR: current transaction is aborted, commands ignored until end of transaction block +END; +SELECT rsqname, rsqholders FROM pg_resqueue_status where rsqcostvalue != 0 or rsqcountvalue != 0 or rsqholders != 0; -- 1 row expected + rsqname | rsqholders +-----------+------------ + reg_costq | 1 +(1 row) + +-- return to the super user +RESET SESSION AUTHORIZATION; +-- reset session to super user. make sure no longer queued +BEGIN; +DECLARE c1 CURSOR FOR SELECT 1 FROM tenk1; +DECLARE c2 CURSOR FOR SELECT 2 FROM tenk1; +DECLARE c3 CURSOR FOR SELECT 3 FROM tenk1; -- should not deadlock, we are SU. +END; +-- cleanup +DROP OWNED BY reg_u1, reg_u2 CASCADE; +DROP USER reg_u1; +DROP USER reg_u2; +DROP RESOURCE QUEUE reg_activeq; +DROP RESOURCE QUEUE reg_costq; +-- catalog tests +set optimizer_enable_master_only_queries = on; +select count(*)/1000 from +(select +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='priority') as "Priority", +(select count(*) from pg_resqueue x,pg_roles y +where x.oid=y.rolresqueue and a.rsqname=x.rsqname) as "RQAssignedUsers" +from ( select distinct rsqname from pg_resqueue_attributes ) a) +as foo; + ?column? +---------- + 0 +(1 row) + +select count(*)/1000 from +(select a.rsqname as "RQname", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='active_statements') as "ActiveStatment", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='max_cost') as "MaxCost", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='min_cost') as "MinCost", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='cost_overcommit') as "CostOvercommit", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='memory_limit') as "MemoryLimit", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='priority') as "Priority", +(select count(*) from pg_resqueue x,pg_roles y +where x.oid=y.rolresqueue and a.rsqname=x.rsqname) as "RQAssignedUsers" +from ( select distinct rsqname from pg_resqueue_attributes ) a) +as foo; + ?column? +---------- + 0 +(1 row) + +reset optimizer_enable_master_only_queries; +-- Followup additional tests. +-- MPP-7474 +CREATE RESOURCE QUEUE rq_test_q ACTIVE THRESHOLD 1; +CREATE USER rq_test_u RESOURCE QUEUE rq_test_q; +create table rq_product ( + pn int not null, + pname text not null, + pcolor text, + primary key (pn) +); +-- Products +insert into rq_product values + ( 100, 'Sword', 'Black'), + ( 200, 'Dream', 'Black'), + ( 300, 'Castle', 'Grey'), + ( 400, 'Justice', 'Clear'), + ( 500, 'Donuts', 'Plain'), + ( 600, 'Donuts', 'Chocolate'), + ( 700, 'Hamburger', 'Grey'), + ( 800, 'Fries', 'Grey'); +GRANT SELECT ON rq_product TO rq_test_u; +set session authorization rq_test_u; +begin; +declare c0 cursor for select pcolor, pname, pn from rq_product order by 1,2,3; +fetch c0; + pcolor | pname | pn +--------+-------+----- + Black | Dream | 200 +(1 row) + +fetch c0; + pcolor | pname | pn +--------+-------+----- + Black | Sword | 100 +(1 row) + +fetch c0; + pcolor | pname | pn +-----------+--------+----- + Chocolate | Donuts | 600 +(1 row) + +select * from rq_product; +ERROR: deadlock detected, locking against self +fetch c0; +ERROR: current transaction is aborted, commands ignored until end of transaction block +abort; +begin; +declare c0 cursor for select pcolor, pname, pn from rq_product order by 1,2,3; +fetch c0; + pcolor | pname | pn +--------+-------+----- + Black | Dream | 200 +(1 row) + +fetch c0; + pcolor | pname | pn +--------+-------+----- + Black | Sword | 100 +(1 row) + +fetch c0; + pcolor | pname | pn +-----------+--------+----- + Chocolate | Donuts | 600 +(1 row) + +fetch c0; + pcolor | pname | pn +--------+---------+----- + Clear | Justice | 400 +(1 row) + +select * from rq_product; +ERROR: deadlock detected, locking against self +fetch c0; +ERROR: current transaction is aborted, commands ignored until end of transaction block +abort; +begin; +declare c0 cursor for +select pcolor, pname, pn, + row_number() over (w) as n, + lag(pn+0) over (w) as l0, + lag(pn+1) over (w) as l1, + lag(pn+2) over (w) as l2, + lag(pn+3) over (w) as l3, + lag(pn+4) over (w) as l4, + lag(pn+5) over (w) as l5, + lag(pn+6) over (w) as l6, + lag(pn+7) over (w) as l7, + lag(pn+8) over (w) as l8, + lag(pn+9) over (w) as l9, + lag(pn+10) over (w) as l10, + lag(pn+11) over (w) as l11, + lag(pn+12) over (w) as l12, + lag(pn+13) over (w) as l13, + lag(pn+14) over (w) as l14, + lag(pn+15) over (w) as l15, + lag(pn+16) over (w) as l16, + lag(pn+17) over (w) as l17, + lag(pn+18) over (w) as l18, + lag(pn+19) over (w) as l19, + lag(pn+20) over (w) as l20, + lag(pn+21) over (w) as l21, + lag(pn+22) over (w) as l22, + lag(pn+23) over (w) as l23, + lag(pn+24) over (w) as l24, + lag(pn+25) over (w) as l25, + lag(pn+26) over (w) as l26, + lag(pn+27) over (w) as l27, + lag(pn+28) over (w) as l28, + lag(pn+29) over (w) as l29, + lag(pn+30) over (w) as l30, + lag(pn+31) over (w) as l31, + lag(pn+32) over (w) as l32 +from rq_product +window w as (partition by pcolor order by pname) order by 1,2,3; +fetch c0; + pcolor | pname | pn | n | l0 | l1 | l2 | l3 | l4 | l5 | l6 | l7 | l8 | l9 | l10 | l11 | l12 | l13 | l14 | l15 | l16 | l17 | l18 | l19 | l20 | l21 | l22 | l23 | l24 | l25 | l26 | l27 | l28 | l29 | l30 | l31 | l32 +--------+-------+-----+---+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+----- + Black | Dream | 200 | 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +(1 row) + +select * from rq_product; +ERROR: deadlock detected, locking against self +fetch c0; +ERROR: current transaction is aborted, commands ignored until end of transaction block +abort; +begin; +create view window_view as +select pcolor, pname, pn, + row_number() over (w) as n, + lag(pn+0) over (w) as l0, + lag(pn+1) over (w) as l1, + lag(pn+2) over (w) as l2, + lag(pn+3) over (w) as l3, + lag(pn+4) over (w) as l4, + lag(pn+5) over (w) as l5, + lag(pn+6) over (w) as l6, + lag(pn+7) over (w) as l7, + lag(pn+8) over (w) as l8, + lag(pn+9) over (w) as l9, + lag(pn+10) over (w) as l10, + lag(pn+11) over (w) as l11, + lag(pn+12) over (w) as l12, + lag(pn+13) over (w) as l13, + lag(pn+14) over (w) as l14, + lag(pn+15) over (w) as l15, + lag(pn+16) over (w) as l16, + lag(pn+17) over (w) as l17, + lag(pn+18) over (w) as l18, + lag(pn+19) over (w) as l19, + lag(pn+20) over (w) as l20, + lag(pn+21) over (w) as l21, + lag(pn+22) over (w) as l22, + lag(pn+23) over (w) as l23, + lag(pn+24) over (w) as l24, + lag(pn+25) over (w) as l25, + lag(pn+26) over (w) as l26, + lag(pn+27) over (w) as l27, + lag(pn+28) over (w) as l28, + lag(pn+29) over (w) as l29, + lag(pn+30) over (w) as l30, + lag(pn+31) over (w) as l31, + lag(pn+32) over (w) as l32 +from rq_product +window w as (partition by pcolor order by pname); +DECLARE c0 cursor for select * from window_view order by 1,2,3; +fetch c0; + pcolor | pname | pn | n | l0 | l1 | l2 | l3 | l4 | l5 | l6 | l7 | l8 | l9 | l10 | l11 | l12 | l13 | l14 | l15 | l16 | l17 | l18 | l19 | l20 | l21 | l22 | l23 | l24 | l25 | l26 | l27 | l28 | l29 | l30 | l31 | l32 +--------+-------+-----+---+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+----- + Black | Dream | 200 | 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +(1 row) + +select * from rq_product; +ERROR: deadlock detected, locking against self +fetch c0; +ERROR: current transaction is aborted, commands ignored until end of transaction block +abort; +RESET SESSION_AUTHORIZATION; +DROP OWNED BY rq_test_u CASCADE; +DROP USER rq_test_u; +DROP RESOURCE QUEUE rq_test_q; +DROP TABLE rq_product; +-- Coverage for resource queue error conditions +CREATE ROLE rq_test_oosm_role; +NOTICE: resource queue required -- using default resource queue "pg_default" +SET ROLE rq_test_oosm_role; +CREATE TABLE rq_test_oosm_table(i int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i' as the Cloudberry Database 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. +INSERT INTO rq_test_oosm_table VALUES(1); +-- Simulate an out-of-shared-memory condition during the course of grabbing a +-- resource queue lock (in ResLockAcquire()). +SELECT gp_inject_fault('res_increment_add_oosm', 'skip', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Queries should error out indicating that we have no shared memory left. +SELECT * FROM rq_test_oosm_table; +ERROR: out of shared memory adding portal increments +HINT: You may need to increase max_resource_portals_per_transaction. +SELECT gp_inject_fault('res_increment_add_oosm', 'reset', 1); + gp_inject_fault +----------------- + Success: +(1 row) + +-- Queries should succeed now. +SELECT * FROM rq_test_oosm_table; + i +--- + 1 +(1 row) + +DROP TABLE rq_test_oosm_table; +RESET ROLE; +DROP ROLE rq_test_oosm_role; diff --git a/src/test/singlenode_regress/expected/returning.out b/src/test/singlenode_regress/expected/returning.out new file mode 100644 index 00000000000..cb51bb86876 --- /dev/null +++ b/src/test/singlenode_regress/expected/returning.out @@ -0,0 +1,357 @@ +-- +-- Test INSERT/UPDATE/DELETE RETURNING +-- +-- Simple cases +CREATE TEMP TABLE foo (f1 serial, f2 text, f3 int default 42); +INSERT INTO foo (f2,f3) + VALUES ('test', DEFAULT), ('More', 11), (upper('more'), 7+9) + RETURNING *, f1+f3 AS sum; + f1 | f2 | f3 | sum +----+------+----+----- + 1 | test | 42 | 43 + 2 | More | 11 | 13 + 3 | MORE | 16 | 19 +(3 rows) + +SELECT * FROM foo; + f1 | f2 | f3 +----+------+---- + 1 | test | 42 + 2 | More | 11 + 3 | MORE | 16 +(3 rows) + +UPDATE foo SET f2 = lower(f2), f3 = DEFAULT RETURNING foo.*, f1+f3 AS sum13; + f1 | f2 | f3 | sum13 +----+------+----+------- + 1 | test | 42 | 43 + 2 | more | 42 | 44 + 3 | more | 42 | 45 +(3 rows) + +SELECT * FROM foo; + f1 | f2 | f3 +----+------+---- + 1 | test | 42 + 2 | more | 42 + 3 | more | 42 +(3 rows) + +DELETE FROM foo WHERE f1 > 2 RETURNING f3, f2, f1, least(f1,f3); + f3 | f2 | f1 | least +----+------+----+------- + 42 | more | 3 | 3 +(1 row) + +SELECT * FROM foo; + f1 | f2 | f3 +----+------+---- + 1 | test | 42 + 2 | more | 42 +(2 rows) + +-- Subplans and initplans in the RETURNING list +INSERT INTO foo SELECT f1+10, f2, f3+99 FROM foo + RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan, + EXISTS(SELECT * FROM int4_tbl) AS initplan; + f1 | f2 | f3 | subplan | initplan +----+------+-----+---------+---------- + 11 | test | 141 | t | t + 12 | more | 141 | f | t +(2 rows) + +UPDATE foo SET f3 = f3 * 2 + WHERE f1 > 10 + RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan, + EXISTS(SELECT * FROM int4_tbl) AS initplan; + f1 | f2 | f3 | subplan | initplan +----+------+-----+---------+---------- + 11 | test | 282 | t | t + 12 | more | 282 | f | t +(2 rows) + +DELETE FROM foo + WHERE f1 > 10 + RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan, + EXISTS(SELECT * FROM int4_tbl) AS initplan; + f1 | f2 | f3 | subplan | initplan +----+------+-----+---------+---------- + 11 | test | 282 | t | t + 12 | more | 282 | f | t +(2 rows) + +-- Joins +UPDATE foo SET f3 = f3*2 + FROM int4_tbl i + WHERE foo.f1 + 123455 = i.f1 + RETURNING foo.*, i.f1 as "i.f1"; + f1 | f2 | f3 | i.f1 +----+------+----+-------- + 1 | test | 84 | 123456 +(1 row) + +SELECT * FROM foo; + f1 | f2 | f3 +----+------+---- + 2 | more | 42 + 1 | test | 84 +(2 rows) + +DELETE FROM foo + USING int4_tbl i + WHERE foo.f1 + 123455 = i.f1 + RETURNING foo.*, i.f1 as "i.f1"; + f1 | f2 | f3 | i.f1 +----+------+----+-------- + 1 | test | 84 | 123456 +(1 row) + +SELECT * FROM foo; + f1 | f2 | f3 +----+------+---- + 2 | more | 42 +(1 row) + +-- Check inheritance cases +CREATE TEMP TABLE foochild (fc int) INHERITS (foo); +INSERT INTO foochild VALUES(123,'child',999,-123); +ALTER TABLE foo ADD COLUMN f4 int8 DEFAULT 99; +SELECT * FROM foo; + f1 | f2 | f3 | f4 +-----+-------+-----+---- + 2 | more | 42 | 99 + 123 | child | 999 | 99 +(2 rows) + +SELECT * FROM foochild; + f1 | f2 | f3 | fc | f4 +-----+-------+-----+------+---- + 123 | child | 999 | -123 | 99 +(1 row) + +UPDATE foo SET f4 = f4 + f3 WHERE f4 = 99 RETURNING *; + f1 | f2 | f3 | f4 +-----+-------+-----+------ + 2 | more | 42 | 141 + 123 | child | 999 | 1098 +(2 rows) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +-----+-------+-----+------ + 2 | more | 42 | 141 + 123 | child | 999 | 1098 +(2 rows) + +SELECT * FROM foochild; + f1 | f2 | f3 | fc | f4 +-----+-------+-----+------+------ + 123 | child | 999 | -123 | 1098 +(1 row) + +UPDATE foo SET f3 = f3*2 + FROM int8_tbl i + WHERE foo.f1 = i.q2 + RETURNING *; + f1 | f2 | f3 | f4 | q1 | q2 +-----+-------+------+------+------------------+----- + 123 | child | 1998 | 1098 | 4567890123456789 | 123 +(1 row) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +-----+-------+------+------ + 2 | more | 42 | 141 + 123 | child | 1998 | 1098 +(2 rows) + +SELECT * FROM foochild; + f1 | f2 | f3 | fc | f4 +-----+-------+------+------+------ + 123 | child | 1998 | -123 | 1098 +(1 row) + +DELETE FROM foo + USING int8_tbl i + WHERE foo.f1 = i.q2 + RETURNING *; + f1 | f2 | f3 | f4 | q1 | q2 +-----+-------+------+------+------------------+----- + 123 | child | 1998 | 1098 | 4567890123456789 | 123 +(1 row) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +----+------+----+----- + 2 | more | 42 | 141 +(1 row) + +SELECT * FROM foochild; + f1 | f2 | f3 | fc | f4 +----+----+----+----+---- +(0 rows) + +DROP TABLE foochild; +-- Rules and views +CREATE TEMP VIEW voo AS SELECT f1, f2 FROM foo; +CREATE RULE voo_i AS ON INSERT TO voo DO INSTEAD + INSERT INTO foo VALUES(new.*, 57); +INSERT INTO voo VALUES(11,'zit'); +-- fails: +INSERT INTO voo VALUES(12,'zoo') RETURNING *, f1*2; +ERROR: cannot perform INSERT RETURNING on relation "voo" +HINT: You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause. +-- fails, incompatible list: +CREATE OR REPLACE RULE voo_i AS ON INSERT TO voo DO INSTEAD + INSERT INTO foo VALUES(new.*, 57) RETURNING *; +ERROR: RETURNING list has too many entries +CREATE OR REPLACE RULE voo_i AS ON INSERT TO voo DO INSTEAD + INSERT INTO foo VALUES(new.*, 57) RETURNING f1, f2; +-- should still work +INSERT INTO voo VALUES(13,'zit2'); +-- works now +INSERT INTO voo VALUES(14,'zoo2') RETURNING *; + f1 | f2 +----+------ + 14 | zoo2 +(1 row) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +----+------+----+----- + 2 | more | 42 | 141 + 11 | zit | 57 | 99 + 13 | zit2 | 57 | 99 + 14 | zoo2 | 57 | 99 +(4 rows) + +SELECT * FROM voo; + f1 | f2 +----+------ + 2 | more + 11 | zit + 13 | zit2 + 14 | zoo2 +(4 rows) + +CREATE OR REPLACE RULE voo_u AS ON UPDATE TO voo DO INSTEAD + UPDATE foo SET f1 = new.f1, f2 = new.f2 WHERE f1 = old.f1 + RETURNING f1, f2; +update voo set f1 = f1 + 1 where f2 = 'zoo2'; +update voo set f1 = f1 + 1 where f2 = 'zoo2' RETURNING *, f1*2; + f1 | f2 | ?column? +----+------+---------- + 16 | zoo2 | 32 +(1 row) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +----+------+----+----- + 2 | more | 42 | 141 + 11 | zit | 57 | 99 + 13 | zit2 | 57 | 99 + 16 | zoo2 | 57 | 99 +(4 rows) + +SELECT * FROM voo; + f1 | f2 +----+------ + 2 | more + 11 | zit + 13 | zit2 + 16 | zoo2 +(4 rows) + +CREATE OR REPLACE RULE voo_d AS ON DELETE TO voo DO INSTEAD + DELETE FROM foo WHERE f1 = old.f1 + RETURNING f1, f2; +DELETE FROM foo WHERE f1 = 13; +DELETE FROM foo WHERE f2 = 'zit' RETURNING *; + f1 | f2 | f3 | f4 +----+-----+----+---- + 11 | zit | 57 | 99 +(1 row) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +----+------+----+----- + 2 | more | 42 | 141 + 16 | zoo2 | 57 | 99 +(2 rows) + +SELECT * FROM voo; + f1 | f2 +----+------ + 2 | more + 16 | zoo2 +(2 rows) + +-- Try a join case +CREATE TEMP TABLE joinme (f2j text, other int); +INSERT INTO joinme VALUES('more', 12345); +INSERT INTO joinme VALUES('zoo2', 54321); +INSERT INTO joinme VALUES('other', 0); +CREATE TEMP VIEW joinview AS + SELECT foo.*, other FROM foo JOIN joinme ON (f2 = f2j); +SELECT * FROM joinview; + f1 | f2 | f3 | f4 | other +----+------+----+-----+------- + 2 | more | 42 | 141 | 12345 + 16 | zoo2 | 57 | 99 | 54321 +(2 rows) + +CREATE RULE joinview_u AS ON UPDATE TO joinview DO INSTEAD + UPDATE foo SET f1 = new.f1, f3 = new.f3 + FROM joinme WHERE f2 = f2j AND f2 = old.f2 + RETURNING foo.*, other; +UPDATE joinview SET f1 = f1 + 1 WHERE f3 = 57 RETURNING *, other + 1; + f1 | f2 | f3 | f4 | other | ?column? +----+------+----+----+-------+---------- + 17 | zoo2 | 57 | 99 | 54321 | 54322 +(1 row) + +SELECT * FROM joinview; + f1 | f2 | f3 | f4 | other +----+------+----+-----+------- + 2 | more | 42 | 141 | 12345 + 17 | zoo2 | 57 | 99 | 54321 +(2 rows) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +----+------+----+----- + 2 | more | 42 | 141 + 17 | zoo2 | 57 | 99 +(2 rows) + +SELECT * FROM voo; + f1 | f2 +----+------ + 2 | more + 17 | zoo2 +(2 rows) + +-- Check aliased target relation +INSERT INTO foo AS bar DEFAULT VALUES RETURNING *; -- ok + f1 | f2 | f3 | f4 +----+----+----+---- + 4 | | 42 | 99 +(1 row) + +INSERT INTO foo AS bar DEFAULT VALUES RETURNING foo.*; -- fails, wrong name +ERROR: invalid reference to FROM-clause entry for table "foo" +LINE 1: INSERT INTO foo AS bar DEFAULT VALUES RETURNING foo.*; + ^ +HINT: Perhaps you meant to reference the table alias "bar". +INSERT INTO foo AS bar DEFAULT VALUES RETURNING bar.*; -- ok + f1 | f2 | f3 | f4 +----+----+----+---- + 5 | | 42 | 99 +(1 row) + +INSERT INTO foo AS bar DEFAULT VALUES RETURNING bar.f3; -- ok + f3 +---- + 42 +(1 row) + diff --git a/src/test/singlenode_regress/expected/returning_gp.out b/src/test/singlenode_regress/expected/returning_gp.out new file mode 100644 index 00000000000..171d40640b6 --- /dev/null +++ b/src/test/singlenode_regress/expected/returning_gp.out @@ -0,0 +1,133 @@ +-- +-- Extra GPDB tests on INSERT/UPDATE/DELETE RETURNING +-- +CREATE TABLE returning_parttab (distkey int4, partkey int4, i int, t text) +PARTITION BY RANGE (partkey) (START (1) END (10)); +-- +-- Test INSERT RETURNING with partitioning +-- +insert into returning_parttab values (1, 1, 1, 'single insert') returning *; + distkey | partkey | i | t +---------+---------+---+--------------- + 1 | 1 | 1 | single insert +(1 row) + +insert into returning_parttab +select 1, g, g, 'multi ' || g from generate_series(1, 5) g +returning distkey, partkey, i, t; + distkey | partkey | i | t +---------+---------+---+--------- + 1 | 1 | 1 | multi 1 + 1 | 2 | 2 | multi 2 + 1 | 3 | 3 | multi 3 + 1 | 4 | 4 | multi 4 + 1 | 5 | 5 | multi 5 +(5 rows) + +-- Drop a column, and create a new partition. The new partition will not have +-- the dropped column, while in the old partition, it's still physically there, +-- just marked as dropped. Make sure the executor maps the columns correctly. +ALTER TABLE returning_parttab DROP COLUMN i; +alter table returning_parttab add partition newpart start (10) end (20); +insert into returning_parttab values (1, 10, 'single2 insert') returning *; + distkey | partkey | t +---------+---------+---------------- + 1 | 10 | single2 insert +(1 row) + +insert into returning_parttab select 2, g + 10, 'multi2 ' || g from generate_series(1, 5) g +returning distkey, partkey, t; + distkey | partkey | t +---------+---------+---------- + 2 | 11 | multi2 1 + 2 | 12 | multi2 2 + 2 | 13 | multi2 3 + 2 | 14 | multi2 4 + 2 | 15 | multi2 5 +(5 rows) + +-- +-- Test UPDATE/DELETE RETURNING with partitioning +-- +update returning_parttab set partkey = 9 where partkey = 3 returning *; + distkey | partkey | t +---------+---------+--------- + 1 | 9 | multi 3 +(1 row) + +update returning_parttab set partkey = 19 where partkey = 13 returning *; + distkey | partkey | t +---------+---------+---------- + 2 | 19 | multi2 3 +(1 row) + +-- update that moves the tuple across partitions +update returning_parttab set partkey = 18 where partkey = 4 returning *; + distkey | partkey | t +---------+---------+--------- + 1 | 18 | multi 4 +(1 row) + +-- delete +delete from returning_parttab where partkey = 14 returning *; + distkey | partkey | t +---------+---------+---------- + 2 | 14 | multi2 4 +(1 row) + +-- Check table contents, to be sure that all the commands did what they claimed. +select * from returning_parttab; + distkey | partkey | t +---------+---------+---------------- + 1 | 1 | single insert + 1 | 1 | multi 1 + 1 | 2 | multi 2 + 1 | 5 | multi 5 + 1 | 9 | multi 3 + 1 | 18 | multi 4 + 1 | 10 | single2 insert + 2 | 11 | multi2 1 + 2 | 12 | multi2 2 + 2 | 15 | multi2 5 + 2 | 19 | multi2 3 +(11 rows) + +-- +-- DELETE RETURNING is currently not supported on AO tables. +-- +CREATE TEMP TABLE returning_aotab (id int4) WITH (appendonly=true); +INSERT INTO returning_aotab VALUES (1); +DELETE FROM returning_aotab RETURNING *; +ERROR: feature not supported on appendoptimized relations +-- +-- Test UPDATE RETURNING with a split update, i.e. an update of the distribution +-- key. +-- +CREATE TEMP TABLE returning_disttest (id int4); +INSERT INTO returning_disttest VALUES (1), (2); +-- Disable QUIET mode, so that we get some testing of the command tag as well. +-- (At one point, each split update incorrectly counted as two updated rows.) +\set QUIET off +UPDATE returning_disttest SET id = id + 1; +UPDATE 2 +SELECT * FROM returning_disttest; + id +---- + 3 + 2 +(2 rows) + +-- Test an UPDATE that moves the row to different segment and different partition +UPDATE returning_parttab SET distkey = 2, partkey = 13 WHERE partkey = 2 RETURNING distkey, partkey, t; + distkey | partkey | t +---------+---------+--------- + 2 | 13 | multi 2 +(1 row) + +UPDATE 1 +select * from returning_parttab WHERE distkey = 2 AND partkey = 13; + distkey | partkey | t +---------+---------+--------- + 2 | 13 | multi 2 +(1 row) + diff --git a/src/test/singlenode_regress/expected/roleattributes.out b/src/test/singlenode_regress/expected/roleattributes.out new file mode 100644 index 00000000000..5e6969b173e --- /dev/null +++ b/src/test/singlenode_regress/expected/roleattributes.out @@ -0,0 +1,249 @@ +-- default for superuser is false +CREATE ROLE regress_test_def_superuser; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_superuser'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_def_superuser | f | t | f | f | f | f | f | -1 | | +(1 row) + +CREATE ROLE regress_test_superuser WITH SUPERUSER; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_superuser'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_superuser | t | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_superuser WITH NOSUPERUSER; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_superuser'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_superuser | f | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_superuser WITH SUPERUSER; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_superuser'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_superuser | t | t | f | f | f | f | f | -1 | | +(1 row) + +-- default for inherit is true +CREATE ROLE regress_test_def_inherit; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_inherit'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +--------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_def_inherit | f | t | f | f | f | f | f | -1 | | +(1 row) + +CREATE ROLE regress_test_inherit WITH NOINHERIT; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_inherit'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_inherit | f | f | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_inherit WITH INHERIT; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_inherit'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_inherit | f | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_inherit WITH NOINHERIT; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_inherit'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_inherit | f | f | f | f | f | f | f | -1 | | +(1 row) + +-- default for create role is false +CREATE ROLE regress_test_def_createrole; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_createrole'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +-----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_def_createrole | f | t | f | f | f | f | f | -1 | | +(1 row) + +CREATE ROLE regress_test_createrole WITH CREATEROLE; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createrole'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +-------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_createrole | f | t | t | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_createrole WITH NOCREATEROLE; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createrole'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +-------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_createrole | f | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_createrole WITH CREATEROLE; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createrole'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +-------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_createrole | f | t | t | f | f | f | f | -1 | | +(1 row) + +-- default for create database is false +CREATE ROLE regress_test_def_createdb; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_createdb'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +---------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_def_createdb | f | t | f | f | f | f | f | -1 | | +(1 row) + +CREATE ROLE regress_test_createdb WITH CREATEDB; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createdb'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +-----------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_createdb | f | t | f | t | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_createdb WITH NOCREATEDB; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createdb'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +-----------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_createdb | f | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_createdb WITH CREATEDB; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createdb'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +-----------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_createdb | f | t | f | t | f | f | f | -1 | | +(1 row) + +-- default for can login is false for role +CREATE ROLE regress_test_def_role_canlogin; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_role_canlogin'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +--------------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_def_role_canlogin | f | t | f | f | f | f | f | -1 | | +(1 row) + +CREATE ROLE regress_test_role_canlogin WITH LOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_role_canlogin'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_role_canlogin | f | t | f | f | t | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_role_canlogin WITH NOLOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_role_canlogin'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_role_canlogin | f | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_role_canlogin WITH LOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_role_canlogin'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_role_canlogin | f | t | f | f | t | f | f | -1 | | +(1 row) + +-- default for can login is true for user +CREATE USER regress_test_def_user_canlogin; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_user_canlogin'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +--------------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_def_user_canlogin | f | t | f | f | t | f | f | -1 | | +(1 row) + +CREATE USER regress_test_user_canlogin WITH NOLOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_user_canlogin'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_user_canlogin | f | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER USER regress_test_user_canlogin WITH LOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_user_canlogin'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_user_canlogin | f | t | f | f | t | f | f | -1 | | +(1 row) + +ALTER USER regress_test_user_canlogin WITH NOLOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_user_canlogin'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_user_canlogin | f | t | f | f | f | f | f | -1 | | +(1 row) + +-- default for replication is false +CREATE ROLE regress_test_def_replication; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_replication'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +------------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_def_replication | f | t | f | f | f | f | f | -1 | | +(1 row) + +CREATE ROLE regress_test_replication WITH REPLICATION; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_replication'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +--------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_replication | f | t | f | f | f | t | f | -1 | | +(1 row) + +ALTER ROLE regress_test_replication WITH NOREPLICATION; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_replication'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +--------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_replication | f | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_replication WITH REPLICATION; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_replication'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +--------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_replication | f | t | f | f | f | t | f | -1 | | +(1 row) + +-- default for bypassrls is false +CREATE ROLE regress_test_def_bypassrls; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_bypassrls'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_def_bypassrls | f | t | f | f | f | f | f | -1 | | +(1 row) + +CREATE ROLE regress_test_bypassrls WITH BYPASSRLS; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_bypassrls'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_bypassrls | f | t | f | f | f | f | t | -1 | | +(1 row) + +ALTER ROLE regress_test_bypassrls WITH NOBYPASSRLS; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_bypassrls'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_bypassrls | f | t | f | f | f | f | f | -1 | | +(1 row) + +ALTER ROLE regress_test_bypassrls WITH BYPASSRLS; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_bypassrls'; + rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil +------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+--------------- + regress_test_bypassrls | f | t | f | f | f | f | t | -1 | | +(1 row) + +-- clean up roles +DROP ROLE regress_test_def_superuser; +DROP ROLE regress_test_superuser; +DROP ROLE regress_test_def_inherit; +DROP ROLE regress_test_inherit; +DROP ROLE regress_test_def_createrole; +DROP ROLE regress_test_createrole; +DROP ROLE regress_test_def_createdb; +DROP ROLE regress_test_createdb; +DROP ROLE regress_test_def_role_canlogin; +DROP ROLE regress_test_role_canlogin; +DROP USER regress_test_def_user_canlogin; +DROP USER regress_test_user_canlogin; +DROP ROLE regress_test_def_replication; +DROP ROLE regress_test_replication; +DROP ROLE regress_test_def_bypassrls; +DROP ROLE regress_test_bypassrls; diff --git a/src/test/singlenode_regress/expected/rowsecurity.out b/src/test/singlenode_regress/expected/rowsecurity.out new file mode 100644 index 00000000000..ad1311e8fea --- /dev/null +++ b/src/test/singlenode_regress/expected/rowsecurity.out @@ -0,0 +1,4144 @@ +-- +-- Test of Row-level security feature +-- +-- Clean up in case a prior regression run failed +-- Suppress NOTICE messages when users/groups don't exist +SET client_min_messages TO 'warning'; +SET gp_enable_relsize_collection to on; +DROP USER IF EXISTS regress_rls_alice; +DROP USER IF EXISTS regress_rls_bob; +DROP USER IF EXISTS regress_rls_carol; +DROP USER IF EXISTS regress_rls_dave; +DROP USER IF EXISTS regress_rls_exempt_user; +DROP ROLE IF EXISTS regress_rls_group1; +DROP ROLE IF EXISTS regress_rls_group2; +DROP SCHEMA IF EXISTS regress_rls_schema CASCADE; +-- RESET client_min_messages; RESET doesn't work well in GPDB, it doesn't reset +-- GUCs in QEs. +SET client_min_messages TO 'notice'; +-- initial setup +CREATE USER regress_rls_alice NOLOGIN; +CREATE USER regress_rls_bob NOLOGIN; +CREATE USER regress_rls_carol NOLOGIN; +CREATE USER regress_rls_dave NOLOGIN; +CREATE USER regress_rls_exempt_user BYPASSRLS NOLOGIN; +CREATE ROLE regress_rls_group1 NOLOGIN; +CREATE ROLE regress_rls_group2 NOLOGIN; +GRANT regress_rls_group1 TO regress_rls_bob; +GRANT regress_rls_group2 TO regress_rls_carol; +CREATE SCHEMA regress_rls_schema; +GRANT ALL ON SCHEMA regress_rls_schema to public; +SET search_path = regress_rls_schema; +-- setup of malicious function +CREATE OR REPLACE FUNCTION f_leak(text) RETURNS bool + COST 0.0000001 LANGUAGE plpgsql + AS 'BEGIN RAISE NOTICE ''f_leak => %'', $1; RETURN true; END'; +GRANT EXECUTE ON FUNCTION f_leak(text) TO public; +-- BASIC Row-Level Security Scenario +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE uaccount ( + pguser name primary key, + seclv int +); +GRANT SELECT ON uaccount TO public; +INSERT INTO uaccount VALUES + ('regress_rls_alice', 99), + ('regress_rls_bob', 1), + ('regress_rls_carol', 2), + ('regress_rls_dave', 3); +ANALYZE uaccount; +CREATE TABLE category ( + cid int primary key, + cname text +); +GRANT ALL ON category TO public; +INSERT INTO category VALUES + (11, 'novel'), + (22, 'science fiction'), + (33, 'technology'), + (44, 'manga'); +ANALYZE category; +CREATE TABLE document ( + did int primary key, + cid int references category(cid), + dlevel int not null, + dauthor name, + dtitle text +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +GRANT ALL ON document TO public; +INSERT INTO document VALUES + ( 1, 11, 1, 'regress_rls_bob', 'my first novel'), + ( 2, 11, 2, 'regress_rls_bob', 'my second novel'), + ( 3, 22, 2, 'regress_rls_bob', 'my science fiction'), + ( 4, 44, 1, 'regress_rls_bob', 'my first manga'), + ( 5, 44, 2, 'regress_rls_bob', 'my second manga'), + ( 6, 22, 1, 'regress_rls_carol', 'great science fiction'), + ( 7, 33, 2, 'regress_rls_carol', 'great technology book'), + ( 8, 44, 1, 'regress_rls_carol', 'great manga'), + ( 9, 22, 1, 'regress_rls_dave', 'awesome science fiction'), + (10, 33, 2, 'regress_rls_dave', 'awesome technology book'); +ANALYZE document; +ALTER TABLE document ENABLE ROW LEVEL SECURITY; +-- user's security level must be higher than or equal to document's +CREATE POLICY p1 ON document AS PERMISSIVE + USING (dlevel <= (SELECT seclv FROM uaccount WHERE pguser = current_user)); +-- try to create a policy of bogus type +CREATE POLICY p1 ON document AS UGLY + USING (dlevel <= (SELECT seclv FROM uaccount WHERE pguser = current_user)); +ERROR: unrecognized row security option "ugly" +LINE 1: CREATE POLICY p1 ON document AS UGLY + ^ +HINT: Only PERMISSIVE or RESTRICTIVE policies are supported currently. +-- but Dave isn't allowed to anything at cid 50 or above +-- this is to make sure that we sort the policies by name first +-- when applying WITH CHECK, a later INSERT by Dave should fail due +-- to p1r first +CREATE POLICY p2r ON document AS RESTRICTIVE TO regress_rls_dave + USING (cid <> 44 AND cid < 50); +-- and Dave isn't allowed to see manga documents +CREATE POLICY p1r ON document AS RESTRICTIVE TO regress_rls_dave + USING (cid <> 44); +\dp + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------------------+----------+-------+---------------------------------------------+-------------------+-------------------------------------------- + regress_rls_schema | category | table | regress_rls_alice=arwdDxt/regress_rls_alice+| | + | | | =arwdDxt/regress_rls_alice | | + regress_rls_schema | document | table | regress_rls_alice=arwdDxt/regress_rls_alice+| | p1: + + | | | =arwdDxt/regress_rls_alice | | (u): (dlevel <= ( SELECT uaccount.seclv + + | | | | | FROM uaccount + + | | | | | WHERE (uaccount.pguser = CURRENT_USER)))+ + | | | | | p2r (RESTRICTIVE): + + | | | | | (u): ((cid <> 44) AND (cid < 50)) + + | | | | | to: regress_rls_dave + + | | | | | p1r (RESTRICTIVE): + + | | | | | (u): (cid <> 44) + + | | | | | to: regress_rls_dave + regress_rls_schema | uaccount | table | regress_rls_alice=arwdDxt/regress_rls_alice+| | + | | | =r/regress_rls_alice | | +(3 rows) + +\d document + Table "regress_rls_schema.document" + Column | Type | Collation | Nullable | Default +---------+---------+-----------+----------+--------- + did | integer | | not null | + cid | integer | | | + dlevel | integer | | not null | + dauthor | name | | | + dtitle | text | | | +Indexes: + "document_pkey" PRIMARY KEY, btree (did) +Foreign-key constraints: + "document_cid_fkey" FOREIGN KEY (cid) REFERENCES category(cid) +Policies: + POLICY "p1" + USING ((dlevel <= ( SELECT uaccount.seclv + FROM uaccount + WHERE (uaccount.pguser = CURRENT_USER)))) + POLICY "p1r" AS RESTRICTIVE + TO regress_rls_dave + USING ((cid <> 44)) + POLICY "p2r" AS RESTRICTIVE + TO regress_rls_dave + USING (((cid <> 44) AND (cid < 50))) + +SELECT * FROM pg_policies WHERE schemaname = 'regress_rls_schema' AND tablename = 'document' ORDER BY policyname; + schemaname | tablename | policyname | permissive | roles | cmd | qual | with_check +--------------------+-----------+------------+-------------+--------------------+-----+--------------------------------------------+------------ + regress_rls_schema | document | p1 | PERMISSIVE | {public} | ALL | (dlevel <= ( SELECT uaccount.seclv +| + | | | | | | FROM uaccount +| + | | | | | | WHERE (uaccount.pguser = CURRENT_USER))) | + regress_rls_schema | document | p1r | RESTRICTIVE | {regress_rls_dave} | ALL | (cid <> 44) | + regress_rls_schema | document | p2r | RESTRICTIVE | {regress_rls_dave} | ALL | ((cid <> 44) AND (cid < 50)) | +(3 rows) + +-- viewpoint from regress_rls_bob +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my first manga +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great manga +NOTICE: f_leak => awesome science fiction + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 4 | 44 | 1 | regress_rls_bob | my first manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction +(5 rows) + +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my first manga +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great manga +NOTICE: f_leak => awesome science fiction + cid | did | dlevel | dauthor | dtitle | cname +-----+-----+--------+-------------------+-------------------------+----------------- + 11 | 1 | 1 | regress_rls_bob | my first novel | novel + 44 | 4 | 1 | regress_rls_bob | my first manga | manga + 22 | 6 | 1 | regress_rls_carol | great science fiction | science fiction + 44 | 8 | 1 | regress_rls_carol | great manga | manga + 22 | 9 | 1 | regress_rls_dave | awesome science fiction | science fiction +(5 rows) + +-- try a sampled version +SELECT * FROM document TABLESAMPLE BERNOULLI(50) REPEATABLE(0) + WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first manga +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great manga +NOTICE: f_leak => awesome science fiction + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 4 | 44 | 1 | regress_rls_bob | my first manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction +(4 rows) + +-- viewpoint from regress_rls_carol +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => my science fiction +NOTICE: f_leak => my first manga +NOTICE: f_leak => my second manga +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great technology book +NOTICE: f_leak => great manga +NOTICE: f_leak => awesome science fiction +NOTICE: f_leak => awesome technology book + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 22 | 2 | regress_rls_bob | my science fiction + 4 | 44 | 1 | regress_rls_bob | my first manga + 5 | 44 | 2 | regress_rls_bob | my second manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction + 10 | 33 | 2 | regress_rls_dave | awesome technology book +(10 rows) + +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => my science fiction +NOTICE: f_leak => my first manga +NOTICE: f_leak => my second manga +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great technology book +NOTICE: f_leak => great manga +NOTICE: f_leak => awesome science fiction +NOTICE: f_leak => awesome technology book + cid | did | dlevel | dauthor | dtitle | cname +-----+-----+--------+-------------------+-------------------------+----------------- + 11 | 1 | 1 | regress_rls_bob | my first novel | novel + 11 | 2 | 2 | regress_rls_bob | my second novel | novel + 22 | 3 | 2 | regress_rls_bob | my science fiction | science fiction + 44 | 4 | 1 | regress_rls_bob | my first manga | manga + 44 | 5 | 2 | regress_rls_bob | my second manga | manga + 22 | 6 | 1 | regress_rls_carol | great science fiction | science fiction + 33 | 7 | 2 | regress_rls_carol | great technology book | technology + 44 | 8 | 1 | regress_rls_carol | great manga | manga + 22 | 9 | 1 | regress_rls_dave | awesome science fiction | science fiction + 33 | 10 | 2 | regress_rls_dave | awesome technology book | technology +(10 rows) + +-- try a sampled version +SELECT * FROM document TABLESAMPLE BERNOULLI(50) REPEATABLE(0) + WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first manga +NOTICE: f_leak => my second manga +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great manga +NOTICE: f_leak => awesome science fiction + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 4 | 44 | 1 | regress_rls_bob | my first manga + 5 | 44 | 2 | regress_rls_bob | my second manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction +(5 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM document WHERE f_leak(dtitle); + QUERY PLAN +-------------------------------------------------------- + Seq Scan on document + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_carol'::name) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle); + QUERY PLAN +-------------------------------------------------------- + Hash Join + Hash Cond: (document.cid = category.cid) + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_carol'::name) + -> Seq Scan on document + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + -> Hash + -> Seq Scan on category + Optimizer: Postgres query optimizer +(10 rows) + +-- viewpoint from regress_rls_dave +SET SESSION AUTHORIZATION regress_rls_dave; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => my science fiction +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great technology book +NOTICE: f_leak => awesome science fiction +NOTICE: f_leak => awesome technology book + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 22 | 2 | regress_rls_bob | my science fiction + 6 | 22 | 1 | regress_rls_carol | great science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book + 9 | 22 | 1 | regress_rls_dave | awesome science fiction + 10 | 33 | 2 | regress_rls_dave | awesome technology book +(7 rows) + +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => my science fiction +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great technology book +NOTICE: f_leak => awesome science fiction +NOTICE: f_leak => awesome technology book + cid | did | dlevel | dauthor | dtitle | cname +-----+-----+--------+-------------------+-------------------------+----------------- + 11 | 1 | 1 | regress_rls_bob | my first novel | novel + 11 | 2 | 2 | regress_rls_bob | my second novel | novel + 22 | 3 | 2 | regress_rls_bob | my science fiction | science fiction + 22 | 6 | 1 | regress_rls_carol | great science fiction | science fiction + 33 | 7 | 2 | regress_rls_carol | great technology book | technology + 22 | 9 | 1 | regress_rls_dave | awesome science fiction | science fiction + 33 | 10 | 2 | regress_rls_dave | awesome technology book | technology +(7 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM document WHERE f_leak(dtitle); + QUERY PLAN +---------------------------------------------------------------------------------------------- + Seq Scan on document + Filter: ((cid <> 44) AND (cid <> 44) AND (cid < 50) AND (dlevel <= $0) AND f_leak(dtitle)) + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_dave'::name) + Optimizer: Postgres query optimizer +(6 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle); + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Hash Join + Hash Cond: (document.cid = category.cid) + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_dave'::name) + -> Seq Scan on document + Filter: ((cid <> 44) AND (cid <> 44) AND (cid < 50) AND (dlevel <= $0) AND f_leak(dtitle)) + -> Hash + -> Seq Scan on category + Filter: (cid < 50) + Optimizer: Postgres query optimizer +(11 rows) + +-- 44 would technically fail for both p2r and p1r, but we should get an error +-- back from p1r for this because it sorts first +INSERT INTO document VALUES (100, 44, 1, 'regress_rls_dave', 'testing sorting of policies'); -- fail +ERROR: new row violates row-level security policy "p1r" for table "document" +-- Just to see a p2r error +INSERT INTO document VALUES (100, 55, 1, 'regress_rls_dave', 'testing sorting of policies'); -- fail +ERROR: new row violates row-level security policy "p2r" for table "document" +-- only owner can change policies +ALTER POLICY p1 ON document USING (true); --fail +ERROR: must be owner of table document +DROP POLICY p1 ON document; --fail +ERROR: must be owner of relation document +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY p1 ON document USING (dauthor = current_user); +-- viewpoint from regress_rls_bob again +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => my science fiction +NOTICE: f_leak => my first manga +NOTICE: f_leak => my second manga + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-----------------+-------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 22 | 2 | regress_rls_bob | my science fiction + 4 | 44 | 1 | regress_rls_bob | my first manga + 5 | 44 | 2 | regress_rls_bob | my second manga +(5 rows) + +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER by did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => my science fiction +NOTICE: f_leak => my first manga +NOTICE: f_leak => my second manga + cid | did | dlevel | dauthor | dtitle | cname +-----+-----+--------+-----------------+--------------------+----------------- + 11 | 1 | 1 | regress_rls_bob | my first novel | novel + 11 | 2 | 2 | regress_rls_bob | my second novel | novel + 22 | 3 | 2 | regress_rls_bob | my science fiction | science fiction + 44 | 4 | 1 | regress_rls_bob | my first manga | manga + 44 | 5 | 2 | regress_rls_bob | my second manga | manga +(5 rows) + +-- viewpoint from rls_regres_carol again +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great technology book +NOTICE: f_leak => great manga + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------- + 6 | 22 | 1 | regress_rls_carol | great science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book + 8 | 44 | 1 | regress_rls_carol | great manga +(3 rows) + +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER by did; +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great technology book +NOTICE: f_leak => great manga + cid | did | dlevel | dauthor | dtitle | cname +-----+-----+--------+-------------------+-----------------------+----------------- + 22 | 6 | 1 | regress_rls_carol | great science fiction | science fiction + 33 | 7 | 2 | regress_rls_carol | great technology book | technology + 44 | 8 | 1 | regress_rls_carol | great manga | manga +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM document WHERE f_leak(dtitle); + QUERY PLAN +---------------------------------------------------------------------- + Seq Scan on document + Filter: ((dauthor = 'regress_rls_carol'::name) AND f_leak(dtitle)) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle); + QUERY PLAN +---------------------------------------------------------------------------- + Hash Join + Hash Cond: (document.cid = category.cid) + -> Seq Scan on document + Filter: ((dauthor = 'regress_rls_carol'::name) AND f_leak(dtitle)) + -> Hash + -> Seq Scan on category + Optimizer: Postgres query optimizer +(7 rows) + +-- interaction of FK/PK constraints +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE POLICY p2 ON category + USING (CASE WHEN current_user = 'regress_rls_bob' THEN cid IN (11, 33) + WHEN current_user = 'regress_rls_carol' THEN cid IN (22, 44) + ELSE false END); +ALTER TABLE category ENABLE ROW LEVEL SECURITY; +-- cannot delete PK referenced by invisible FK +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM document d FULL OUTER JOIN category c on d.cid = c.cid ORDER BY d.did, c.cid; + did | cid | dlevel | dauthor | dtitle | cid | cname +-----+-----+--------+-----------------+--------------------+-----+------------ + 1 | 11 | 1 | regress_rls_bob | my first novel | 11 | novel + 2 | 11 | 2 | regress_rls_bob | my second novel | 11 | novel + 3 | 22 | 2 | regress_rls_bob | my science fiction | | + 4 | 44 | 1 | regress_rls_bob | my first manga | | + 5 | 44 | 2 | regress_rls_bob | my second manga | | + | | | | | 33 | technology +(6 rows) + +-- GPDB: referential integrity checks are not enforced +-- start_ignore +-- DELETE FROM category WHERE cid = 33; -- fails with FK violation +-- end_ignore +-- can insert FK referencing invisible PK +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM document d FULL OUTER JOIN category c on d.cid = c.cid ORDER BY d.did, c.cid; + did | cid | dlevel | dauthor | dtitle | cid | cname +-----+-----+--------+-------------------+-----------------------+-----+----------------- + 6 | 22 | 1 | regress_rls_carol | great science fiction | 22 | science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book | | + 8 | 44 | 1 | regress_rls_carol | great manga | 44 | manga +(3 rows) + +INSERT INTO document VALUES (11, 33, 1, current_user, 'hoge'); +-- UNIQUE or PRIMARY KEY constraint violation DOES reveal presence of row +SET SESSION AUTHORIZATION regress_rls_bob; +INSERT INTO document VALUES (8, 44, 1, 'regress_rls_bob', 'my third manga'); -- Must fail with unique violation, revealing presence of did we can't see +ERROR: duplicate key value violates unique constraint "document_pkey" +SELECT * FROM document WHERE did = 8; -- and confirm we can't see it + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+---------+-------- +(0 rows) + +-- RLS policies are checked before constraints +INSERT INTO document VALUES (8, 44, 1, 'regress_rls_carol', 'my third manga'); -- Should fail with RLS check violation, not duplicate key violation +ERROR: new row violates row-level security policy for table "document" +-- GPDB: UPDATE on distributed key column not allowed on relation with update triggers +-- start_ignore +UPDATE document SET did = 8, dauthor = 'regress_rls_carol' WHERE did = 5; -- Should fail with RLS check violation, not duplicate key violation +ERROR: new row violates row-level security policy for table "document" +-- end_ignore +-- database superuser does bypass RLS policy when enabled +RESET SESSION AUTHORIZATION; +SET row_security TO ON; +SELECT * FROM document; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 22 | 2 | regress_rls_bob | my science fiction + 4 | 44 | 1 | regress_rls_bob | my first manga + 5 | 44 | 2 | regress_rls_bob | my second manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction + 10 | 33 | 2 | regress_rls_dave | awesome technology book + 11 | 33 | 1 | regress_rls_carol | hoge +(11 rows) + +SELECT * FROM category; + cid | cname +-----+----------------- + 11 | novel + 22 | science fiction + 33 | technology + 44 | manga +(4 rows) + +-- database superuser does bypass RLS policy when disabled +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +SELECT * FROM document; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 22 | 2 | regress_rls_bob | my science fiction + 4 | 44 | 1 | regress_rls_bob | my first manga + 5 | 44 | 2 | regress_rls_bob | my second manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction + 10 | 33 | 2 | regress_rls_dave | awesome technology book + 11 | 33 | 1 | regress_rls_carol | hoge +(11 rows) + +SELECT * FROM category; + cid | cname +-----+----------------- + 11 | novel + 22 | science fiction + 33 | technology + 44 | manga +(4 rows) + +-- database non-superuser with bypass privilege can bypass RLS policy when disabled +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +SELECT * FROM document; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 22 | 2 | regress_rls_bob | my science fiction + 4 | 44 | 1 | regress_rls_bob | my first manga + 5 | 44 | 2 | regress_rls_bob | my second manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction + 10 | 33 | 2 | regress_rls_dave | awesome technology book + 11 | 33 | 1 | regress_rls_carol | hoge +(11 rows) + +SELECT * FROM category; + cid | cname +-----+----------------- + 11 | novel + 22 | science fiction + 33 | technology + 44 | manga +(4 rows) + +-- RLS policy does not apply to table owner when RLS enabled. +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; +SELECT * FROM document; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 22 | 2 | regress_rls_bob | my science fiction + 4 | 44 | 1 | regress_rls_bob | my first manga + 5 | 44 | 2 | regress_rls_bob | my second manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction + 10 | 33 | 2 | regress_rls_dave | awesome technology book + 11 | 33 | 1 | regress_rls_carol | hoge +(11 rows) + +SELECT * FROM category; + cid | cname +-----+----------------- + 11 | novel + 22 | science fiction + 33 | technology + 44 | manga +(4 rows) + +-- RLS policy does not apply to table owner when RLS disabled. +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO OFF; +SELECT * FROM document; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 22 | 2 | regress_rls_bob | my science fiction + 4 | 44 | 1 | regress_rls_bob | my first manga + 5 | 44 | 2 | regress_rls_bob | my second manga + 6 | 22 | 1 | regress_rls_carol | great science fiction + 7 | 33 | 2 | regress_rls_carol | great technology book + 8 | 44 | 1 | regress_rls_carol | great manga + 9 | 22 | 1 | regress_rls_dave | awesome science fiction + 10 | 33 | 2 | regress_rls_dave | awesome technology book + 11 | 33 | 1 | regress_rls_carol | hoge +(11 rows) + +SELECT * FROM category; + cid | cname +-----+----------------- + 11 | novel + 22 | science fiction + 33 | technology + 44 | manga +(4 rows) + +-- +-- Table inheritance and RLS policy +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; +CREATE TABLE t1 (id int not null primary key, a int, junk1 text, b text); +ALTER TABLE t1 DROP COLUMN junk1; -- just a disturbing factor +GRANT ALL ON t1 TO public; +COPY t1 FROM stdin WITH ; +ANALYZE t1; +CREATE TABLE t2 (c float) INHERITS (t1); +GRANT ALL ON t2 TO public; +COPY t2 FROM stdin; +ANALYZE t2; +CREATE TABLE t3 (id int not null primary key, c text, b text, a int); +ALTER TABLE t3 INHERIT t1; +GRANT ALL ON t3 TO public; +COPY t3(id, a,b,c) FROM stdin; +ANALYZE t3; +CREATE POLICY p1 ON t1 FOR ALL TO PUBLIC USING (a % 2 = 0); -- be even number +CREATE POLICY p2 ON t2 FOR ALL TO PUBLIC USING (a % 2 = 1); -- be odd number +ALTER TABLE t1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE t2 ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM t1; + id | a | b +-----+---+----- + 102 | 2 | bbb + 104 | 4 | dad + 202 | 2 | bcd + 204 | 4 | def + 302 | 2 | yyy +(5 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: ((a % 2) = 0) + -> Seq Scan on t2 t1_2 + Filter: ((a % 2) = 0) + -> Seq Scan on t3 t1_3 + Filter: ((a % 2) = 0) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM t1 WHERE f_leak(b); +NOTICE: f_leak => bbb +NOTICE: f_leak => dad +NOTICE: f_leak => bcd +NOTICE: f_leak => def +NOTICE: f_leak => yyy + id | a | b +-----+---+----- + 102 | 2 | bbb + 104 | 4 | dad + 202 | 2 | bcd + 204 | 4 | def + 302 | 2 | yyy +(5 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t2 t1_2 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t3 t1_3 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(8 rows) + +-- reference to system column +SELECT tableoid::regclass, * FROM t1; + tableoid | id | a | b +----------+-----+---+----- + t1 | 102 | 2 | bbb + t1 | 104 | 4 | dad + t2 | 202 | 2 | bcd + t2 | 204 | 4 | def + t3 | 302 | 2 | yyy +(5 rows) + +EXPLAIN (COSTS OFF) SELECT *, t1 FROM t1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: ((a % 2) = 0) + -> Seq Scan on t2 t1_2 + Filter: ((a % 2) = 0) + -> Seq Scan on t3 t1_3 + Filter: ((a % 2) = 0) + Optimizer: Postgres query optimizer +(8 rows) + +-- reference to whole-row reference +SELECT *, t1 FROM t1; + id | a | b | t1 +-----+---+-----+------------- + 102 | 2 | bbb | (102,2,bbb) + 104 | 4 | dad | (104,4,dad) + 202 | 2 | bcd | (202,2,bcd) + 204 | 4 | def | (204,4,def) + 302 | 2 | yyy | (302,2,yyy) +(5 rows) + +EXPLAIN (COSTS OFF) SELECT *, t1 FROM t1; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: ((a % 2) = 0) + -> Seq Scan on t2 t1_2 + Filter: ((a % 2) = 0) + -> Seq Scan on t3 t1_3 + Filter: ((a % 2) = 0) + Optimizer: Postgres query optimizer +(8 rows) + +-- for share/update lock +SELECT * FROM t1 FOR SHARE; + id | a | b +-----+---+----- + 102 | 2 | bbb + 104 | 4 | dad + 202 | 2 | bcd + 204 | 4 | def + 302 | 2 | yyy +(5 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1 FOR SHARE; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: ((a % 2) = 0) + -> Seq Scan on t2 t1_2 + Filter: ((a % 2) = 0) + -> Seq Scan on t3 t1_3 + Filter: ((a % 2) = 0) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM t1 WHERE f_leak(b) FOR SHARE; +NOTICE: f_leak => bbb +NOTICE: f_leak => dad +NOTICE: f_leak => bcd +NOTICE: f_leak => def +NOTICE: f_leak => yyy + id | a | b +-----+---+----- + 102 | 2 | bbb + 104 | 4 | dad + 202 | 2 | bcd + 204 | 4 | def + 302 | 2 | yyy +(5 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b) FOR SHARE; + QUERY PLAN +----------------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t2 t1_2 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t3 t1_3 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(8 rows) + +-- union all query +SELECT a, b, tableoid::regclass FROM t2 UNION ALL SELECT a, b, tableoid::regclass FROM t3; + a | b | tableoid +---+-----+---------- + 1 | abc | t2 + 3 | cde | t2 + 1 | xxx | t3 + 2 | yyy | t3 + 3 | zzz | t3 +(5 rows) + +EXPLAIN (COSTS OFF) SELECT a, b, tableoid::regclass FROM t2 UNION ALL SELECT a, b, tableoid::regclass FROM t3; + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t2 + Filter: ((a % 2) = 1) + -> Seq Scan on t3 + Optimizer: Postgres query optimizer +(5 rows) + +-- superuser is allowed to bypass RLS checks +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +SELECT * FROM t1 WHERE f_leak(b); +NOTICE: f_leak => aba +NOTICE: f_leak => bbb +NOTICE: f_leak => ccc +NOTICE: f_leak => dad +NOTICE: f_leak => abc +NOTICE: f_leak => bcd +NOTICE: f_leak => cde +NOTICE: f_leak => def +NOTICE: f_leak => xxx +NOTICE: f_leak => yyy +NOTICE: f_leak => zzz + id | a | b +-----+---+----- + 101 | 1 | aba + 102 | 2 | bbb + 103 | 3 | ccc + 104 | 4 | dad + 201 | 1 | abc + 202 | 2 | bcd + 203 | 3 | cde + 204 | 4 | def + 301 | 1 | xxx + 302 | 2 | yyy + 303 | 3 | zzz +(11 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b); + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: f_leak(b) + -> Seq Scan on t2 t1_2 + Filter: f_leak(b) + -> Seq Scan on t3 t1_3 + Filter: f_leak(b) + Optimizer: Postgres query optimizer +(8 rows) + +-- non-superuser with bypass privilege can bypass RLS policy when disabled +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +SELECT * FROM t1 WHERE f_leak(b); +NOTICE: f_leak => aba +NOTICE: f_leak => bbb +NOTICE: f_leak => ccc +NOTICE: f_leak => dad +NOTICE: f_leak => abc +NOTICE: f_leak => bcd +NOTICE: f_leak => cde +NOTICE: f_leak => def +NOTICE: f_leak => xxx +NOTICE: f_leak => yyy +NOTICE: f_leak => zzz + id | a | b +-----+---+----- + 101 | 1 | aba + 102 | 2 | bbb + 103 | 3 | ccc + 104 | 4 | dad + 201 | 1 | abc + 202 | 2 | bcd + 203 | 3 | cde + 204 | 4 | def + 301 | 1 | xxx + 302 | 2 | yyy + 303 | 3 | zzz +(11 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b); + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: f_leak(b) + -> Seq Scan on t2 t1_2 + Filter: f_leak(b) + -> Seq Scan on t3 t1_3 + Filter: f_leak(b) + Optimizer: Postgres query optimizer +(8 rows) + +-- +-- Partitioned Tables +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE part_document ( + did int, + cid int, + dlevel int not null, + dauthor name, + dtitle text +) PARTITION BY RANGE (cid); +GRANT ALL ON part_document TO public; +-- Create partitions for document categories +CREATE TABLE part_document_fiction PARTITION OF part_document FOR VALUES FROM (11) to (12); +CREATE TABLE part_document_satire PARTITION OF part_document FOR VALUES FROM (55) to (56); +CREATE TABLE part_document_nonfiction PARTITION OF part_document FOR VALUES FROM (99) to (100); +GRANT ALL ON part_document_fiction TO public; +GRANT ALL ON part_document_satire TO public; +GRANT ALL ON part_document_nonfiction TO public; +INSERT INTO part_document VALUES + ( 1, 11, 1, 'regress_rls_bob', 'my first novel'), + ( 2, 11, 2, 'regress_rls_bob', 'my second novel'), + ( 3, 99, 2, 'regress_rls_bob', 'my science textbook'), + ( 4, 55, 1, 'regress_rls_bob', 'my first satire'), + ( 5, 99, 2, 'regress_rls_bob', 'my history book'), + ( 6, 11, 1, 'regress_rls_carol', 'great science fiction'), + ( 7, 99, 2, 'regress_rls_carol', 'great technology book'), + ( 8, 55, 2, 'regress_rls_carol', 'great satire'), + ( 9, 11, 1, 'regress_rls_dave', 'awesome science fiction'), + (10, 99, 2, 'regress_rls_dave', 'awesome technology book'); +ALTER TABLE part_document ENABLE ROW LEVEL SECURITY; +-- Create policy on parent +-- user's security level must be higher than or equal to document's +CREATE POLICY pp1 ON part_document AS PERMISSIVE + USING (dlevel <= (SELECT seclv FROM uaccount WHERE pguser = current_user)); +-- Dave is only allowed to see cid < 55 +CREATE POLICY pp1r ON part_document AS RESTRICTIVE TO regress_rls_dave + USING (cid < 55); +\d+ part_document + Partitioned table "regress_rls_schema.part_document" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +---------+---------+-----------+----------+---------+----------+--------------+------------- + did | integer | | | | plain | | + cid | integer | | | | plain | | + dlevel | integer | | not null | | plain | | + dauthor | name | | | | plain | | + dtitle | text | | | | extended | | +Partition key: RANGE (cid) +Policies: + POLICY "pp1" + USING ((dlevel <= ( SELECT uaccount.seclv + FROM uaccount + WHERE (uaccount.pguser = CURRENT_USER)))) + POLICY "pp1r" AS RESTRICTIVE + TO regress_rls_dave + USING ((cid < 55)) +Partitions: part_document_fiction FOR VALUES FROM (11) TO (12), + part_document_nonfiction FOR VALUES FROM (99) TO (100), + part_document_satire FOR VALUES FROM (55) TO (56) + +SELECT * FROM pg_policies WHERE schemaname = 'regress_rls_schema' AND tablename like '%part_document%' ORDER BY policyname; + schemaname | tablename | policyname | permissive | roles | cmd | qual | with_check +--------------------+---------------+------------+-------------+--------------------+-----+--------------------------------------------+------------ + regress_rls_schema | part_document | pp1 | PERMISSIVE | {public} | ALL | (dlevel <= ( SELECT uaccount.seclv +| + | | | | | | FROM uaccount +| + | | | | | | WHERE (uaccount.pguser = CURRENT_USER))) | + regress_rls_schema | part_document | pp1r | RESTRICTIVE | {regress_rls_dave} | ALL | (cid < 55) | +(2 rows) + +-- viewpoint from regress_rls_bob +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => great science fiction +NOTICE: f_leak => awesome science fiction +NOTICE: f_leak => my first satire + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 4 | 55 | 1 | regress_rls_bob | my first satire + 6 | 11 | 1 | regress_rls_carol | great science fiction + 9 | 11 | 1 | regress_rls_dave | awesome science fiction +(4 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + QUERY PLAN +------------------------------------------------------------ + Append + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_bob'::name) + -> Seq Scan on part_document_fiction part_document_1 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + -> Seq Scan on part_document_satire part_document_2 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + -> Seq Scan on part_document_nonfiction part_document_3 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Optimizer: Postgres query optimizer +(11 rows) + +-- viewpoint from regress_rls_carol +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => great science fiction +NOTICE: f_leak => awesome science fiction +NOTICE: f_leak => my first satire +NOTICE: f_leak => great satire +NOTICE: f_leak => my science textbook +NOTICE: f_leak => my history book +NOTICE: f_leak => great technology book +NOTICE: f_leak => awesome technology book + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 99 | 2 | regress_rls_bob | my science textbook + 4 | 55 | 1 | regress_rls_bob | my first satire + 5 | 99 | 2 | regress_rls_bob | my history book + 6 | 11 | 1 | regress_rls_carol | great science fiction + 7 | 99 | 2 | regress_rls_carol | great technology book + 8 | 55 | 2 | regress_rls_carol | great satire + 9 | 11 | 1 | regress_rls_dave | awesome science fiction + 10 | 99 | 2 | regress_rls_dave | awesome technology book +(10 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + QUERY PLAN +------------------------------------------------------------ + Append + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_carol'::name) + -> Seq Scan on part_document_fiction part_document_1 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + -> Seq Scan on part_document_satire part_document_2 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + -> Seq Scan on part_document_nonfiction part_document_3 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Optimizer: Postgres query optimizer +(11 rows) + +-- viewpoint from regress_rls_dave +SET SESSION AUTHORIZATION regress_rls_dave; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => great science fiction +NOTICE: f_leak => awesome science fiction + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 6 | 11 | 1 | regress_rls_carol | great science fiction + 9 | 11 | 1 | regress_rls_dave | awesome science fiction +(4 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + QUERY PLAN +-------------------------------------------------------------- + Seq Scan on part_document_fiction part_document + Filter: ((cid < 55) AND (dlevel <= $0) AND f_leak(dtitle)) + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_dave'::name) + Optimizer: Postgres query optimizer +(6 rows) + +-- pp1 ERROR +INSERT INTO part_document VALUES (100, 11, 5, 'regress_rls_dave', 'testing pp1'); -- fail +ERROR: new row violates row-level security policy for table "part_document" +-- pp1r ERROR +INSERT INTO part_document VALUES (100, 99, 1, 'regress_rls_dave', 'testing pp1r'); -- fail +ERROR: new row violates row-level security policy "pp1r" for table "part_document" +-- Show that RLS policy does not apply for direct inserts to children +-- This should fail with RLS POLICY pp1r violation. +INSERT INTO part_document VALUES (100, 55, 1, 'regress_rls_dave', 'testing RLS with partitions'); -- fail +ERROR: new row violates row-level security policy "pp1r" for table "part_document" +-- But this should succeed. +INSERT INTO part_document_satire VALUES (100, 55, 1, 'regress_rls_dave', 'testing RLS with partitions'); -- success +-- We still cannot see the row using the parent +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => great science fiction +NOTICE: f_leak => awesome science fiction + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 6 | 11 | 1 | regress_rls_carol | great science fiction + 9 | 11 | 1 | regress_rls_dave | awesome science fiction +(4 rows) + +-- But we can if we look directly +SELECT * FROM part_document_satire WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first satire +NOTICE: f_leak => great satire +NOTICE: f_leak => testing RLS with partitions + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------------- + 4 | 55 | 1 | regress_rls_bob | my first satire + 8 | 55 | 2 | regress_rls_carol | great satire + 100 | 55 | 1 | regress_rls_dave | testing RLS with partitions +(3 rows) + +-- Turn on RLS and create policy on child to show RLS is checked before constraints +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER TABLE part_document_satire ENABLE ROW LEVEL SECURITY; +CREATE POLICY pp3 ON part_document_satire AS RESTRICTIVE + USING (cid < 55); +-- This should fail with RLS violation now. +SET SESSION AUTHORIZATION regress_rls_dave; +INSERT INTO part_document_satire VALUES (101, 55, 1, 'regress_rls_dave', 'testing RLS with partitions'); -- fail +ERROR: new row violates row-level security policy for table "part_document_satire" +-- And now we cannot see directly into the partition either, due to RLS +SELECT * FROM part_document_satire WHERE f_leak(dtitle) ORDER BY did; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+---------+-------- +(0 rows) + +-- The parent looks same as before +-- viewpoint from regress_rls_dave +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => great science fiction +NOTICE: f_leak => awesome science fiction + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 6 | 11 | 1 | regress_rls_carol | great science fiction + 9 | 11 | 1 | regress_rls_dave | awesome science fiction +(4 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + QUERY PLAN +-------------------------------------------------------------- + Seq Scan on part_document_fiction part_document + Filter: ((cid < 55) AND (dlevel <= $0) AND f_leak(dtitle)) + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_dave'::name) + Optimizer: Postgres query optimizer +(6 rows) + +-- viewpoint from regress_rls_carol +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => great science fiction +NOTICE: f_leak => awesome science fiction +NOTICE: f_leak => my first satire +NOTICE: f_leak => great satire +NOTICE: f_leak => testing RLS with partitions +NOTICE: f_leak => my science textbook +NOTICE: f_leak => my history book +NOTICE: f_leak => great technology book +NOTICE: f_leak => awesome technology book + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 99 | 2 | regress_rls_bob | my science textbook + 4 | 55 | 1 | regress_rls_bob | my first satire + 5 | 99 | 2 | regress_rls_bob | my history book + 6 | 11 | 1 | regress_rls_carol | great science fiction + 7 | 99 | 2 | regress_rls_carol | great technology book + 8 | 55 | 2 | regress_rls_carol | great satire + 9 | 11 | 1 | regress_rls_dave | awesome science fiction + 10 | 99 | 2 | regress_rls_dave | awesome technology book + 100 | 55 | 1 | regress_rls_dave | testing RLS with partitions +(11 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + QUERY PLAN +------------------------------------------------------------ + Append + InitPlan 1 (returns $0) + -> Seq Scan on uaccount + Filter: (pguser = 'regress_rls_carol'::name) + -> Seq Scan on part_document_fiction part_document_1 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + -> Seq Scan on part_document_satire part_document_2 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + -> Seq Scan on part_document_nonfiction part_document_3 + Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Optimizer: Postgres query optimizer +(11 rows) + +-- only owner can change policies +ALTER POLICY pp1 ON part_document USING (true); --fail +ERROR: must be owner of table part_document +DROP POLICY pp1 ON part_document; --fail +ERROR: must be owner of relation part_document +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY pp1 ON part_document USING (dauthor = current_user); +-- viewpoint from regress_rls_bob again +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => my first novel +NOTICE: f_leak => my second novel +NOTICE: f_leak => my first satire +NOTICE: f_leak => my science textbook +NOTICE: f_leak => my history book + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-----------------+--------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 99 | 2 | regress_rls_bob | my science textbook + 4 | 55 | 1 | regress_rls_bob | my first satire + 5 | 99 | 2 | regress_rls_bob | my history book +(5 rows) + +-- viewpoint from rls_regres_carol again +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +NOTICE: f_leak => great science fiction +NOTICE: f_leak => great satire +NOTICE: f_leak => great technology book + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------- + 6 | 11 | 1 | regress_rls_carol | great science fiction + 7 | 99 | 2 | regress_rls_carol | great technology book + 8 | 55 | 2 | regress_rls_carol | great satire +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + QUERY PLAN +---------------------------------------------------------------------------- + Append + -> Seq Scan on part_document_fiction part_document_1 + Filter: ((dauthor = 'regress_rls_carol'::name) AND f_leak(dtitle)) + -> Seq Scan on part_document_satire part_document_2 + Filter: ((dauthor = 'regress_rls_carol'::name) AND f_leak(dtitle)) + -> Seq Scan on part_document_nonfiction part_document_3 + Filter: ((dauthor = 'regress_rls_carol'::name) AND f_leak(dtitle)) + Optimizer: Postgres query optimizer +(8 rows) + +-- database superuser does bypass RLS policy when enabled +RESET SESSION AUTHORIZATION; +SET row_security TO ON; +SELECT * FROM part_document ORDER BY did; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 99 | 2 | regress_rls_bob | my science textbook + 4 | 55 | 1 | regress_rls_bob | my first satire + 5 | 99 | 2 | regress_rls_bob | my history book + 6 | 11 | 1 | regress_rls_carol | great science fiction + 7 | 99 | 2 | regress_rls_carol | great technology book + 8 | 55 | 2 | regress_rls_carol | great satire + 9 | 11 | 1 | regress_rls_dave | awesome science fiction + 10 | 99 | 2 | regress_rls_dave | awesome technology book + 100 | 55 | 1 | regress_rls_dave | testing RLS with partitions +(11 rows) + +SELECT * FROM part_document_satire ORDER by did; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------------- + 4 | 55 | 1 | regress_rls_bob | my first satire + 8 | 55 | 2 | regress_rls_carol | great satire + 100 | 55 | 1 | regress_rls_dave | testing RLS with partitions +(3 rows) + +-- database non-superuser with bypass privilege can bypass RLS policy when disabled +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +SELECT * FROM part_document ORDER BY did; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 99 | 2 | regress_rls_bob | my science textbook + 4 | 55 | 1 | regress_rls_bob | my first satire + 5 | 99 | 2 | regress_rls_bob | my history book + 6 | 11 | 1 | regress_rls_carol | great science fiction + 7 | 99 | 2 | regress_rls_carol | great technology book + 8 | 55 | 2 | regress_rls_carol | great satire + 9 | 11 | 1 | regress_rls_dave | awesome science fiction + 10 | 99 | 2 | regress_rls_dave | awesome technology book + 100 | 55 | 1 | regress_rls_dave | testing RLS with partitions +(11 rows) + +SELECT * FROM part_document_satire ORDER by did; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------------- + 4 | 55 | 1 | regress_rls_bob | my first satire + 8 | 55 | 2 | regress_rls_carol | great satire + 100 | 55 | 1 | regress_rls_dave | testing RLS with partitions +(3 rows) + +-- RLS policy does not apply to table owner when RLS enabled. +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; +SELECT * FROM part_document ORDER by did; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------------- + 1 | 11 | 1 | regress_rls_bob | my first novel + 2 | 11 | 2 | regress_rls_bob | my second novel + 3 | 99 | 2 | regress_rls_bob | my science textbook + 4 | 55 | 1 | regress_rls_bob | my first satire + 5 | 99 | 2 | regress_rls_bob | my history book + 6 | 11 | 1 | regress_rls_carol | great science fiction + 7 | 99 | 2 | regress_rls_carol | great technology book + 8 | 55 | 2 | regress_rls_carol | great satire + 9 | 11 | 1 | regress_rls_dave | awesome science fiction + 10 | 99 | 2 | regress_rls_dave | awesome technology book + 100 | 55 | 1 | regress_rls_dave | testing RLS with partitions +(11 rows) + +SELECT * FROM part_document_satire ORDER by did; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-------------------+----------------------------- + 4 | 55 | 1 | regress_rls_bob | my first satire + 8 | 55 | 2 | regress_rls_carol | great satire + 100 | 55 | 1 | regress_rls_dave | testing RLS with partitions +(3 rows) + +-- When RLS disabled, other users get ERROR. +SET SESSION AUTHORIZATION regress_rls_dave; +SET row_security TO OFF; +SELECT * FROM part_document ORDER by did; +ERROR: query would be affected by row-level security policy for table "part_document" +SELECT * FROM part_document_satire ORDER by did; +ERROR: query would be affected by row-level security policy for table "part_document_satire" +-- Check behavior with a policy that uses a SubPlan not an InitPlan. +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; +CREATE POLICY pp3 ON part_document AS RESTRICTIVE + USING ((SELECT dlevel <= seclv FROM uaccount WHERE pguser = current_user)); +SET SESSION AUTHORIZATION regress_rls_carol; +INSERT INTO part_document VALUES (100, 11, 5, 'regress_rls_carol', 'testing pp3'); -- fail +ERROR: new row violates row-level security policy "pp3" for table "part_document" +----- Dependencies ----- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; +CREATE TABLE dependee (x integer, y integer); +CREATE TABLE dependent (x integer, y integer); +CREATE POLICY d1 ON dependent FOR ALL + TO PUBLIC + USING (x = (SELECT d.x FROM dependee d WHERE d.y = y)); +DROP TABLE dependee; -- Should fail without CASCADE due to dependency on row security qual? +ERROR: cannot drop table dependee because other objects depend on it +DETAIL: policy d1 on table dependent depends on table dependee +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TABLE dependee CASCADE; +NOTICE: drop cascades to policy d1 on table dependent +EXPLAIN (COSTS OFF) SELECT * FROM dependent; -- After drop, should be unqualified + QUERY PLAN +------------------------------------- + Seq Scan on dependent + Optimizer: Postgres query optimizer +(2 rows) + +----- RECURSION ---- +-- +-- Simple recursion +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE rec1 (x integer, y integer); +CREATE POLICY r1 ON rec1 USING (x = (SELECT r.x FROM rec1 r WHERE y = r.y)); +ALTER TABLE rec1 ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rec1; -- fail, direct recursion +ERROR: infinite recursion detected in policy for relation "rec1" +-- +-- Mutual recursion +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE rec2 (a integer, b integer); +ALTER POLICY r1 ON rec1 USING (x = (SELECT a FROM rec2 WHERE b = y)); +CREATE POLICY r2 ON rec2 USING (a = (SELECT x FROM rec1 WHERE y = b)); +ALTER TABLE rec2 ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rec1; -- fail, mutual recursion +ERROR: infinite recursion detected in policy for relation "rec1" +-- +-- Mutual recursion via views +-- +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW rec1v AS SELECT * FROM rec1; +CREATE VIEW rec2v AS SELECT * FROM rec2; +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY r1 ON rec1 USING (x = (SELECT a FROM rec2v WHERE b = y)); +ALTER POLICY r2 ON rec2 USING (a = (SELECT x FROM rec1v WHERE y = b)); +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rec1; -- fail, mutual recursion via views +ERROR: infinite recursion detected in policy for relation "rec1" +-- +-- Mutual recursion via .s.b views +-- +SET SESSION AUTHORIZATION regress_rls_bob; +DROP VIEW rec1v, rec2v CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to policy r1 on table rec1 +drop cascades to policy r2 on table rec2 +CREATE VIEW rec1v WITH (security_barrier) AS SELECT * FROM rec1; +CREATE VIEW rec2v WITH (security_barrier) AS SELECT * FROM rec2; +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE POLICY r1 ON rec1 USING (x = (SELECT a FROM rec2v WHERE b = y)); +CREATE POLICY r2 ON rec2 USING (a = (SELECT x FROM rec1v WHERE y = b)); +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rec1; -- fail, mutual recursion via s.b. views +ERROR: infinite recursion detected in policy for relation "rec1" +-- +-- recursive RLS and VIEWs in policy +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE s1 (a int, b text); +INSERT INTO s1 (SELECT x, md5(x::text) FROM generate_series(-10,10) x); +CREATE TABLE s2 (x int, y text); +INSERT INTO s2 (SELECT x, md5(x::text) FROM generate_series(-6,6) x); +GRANT SELECT ON s1, s2 TO regress_rls_bob; +CREATE POLICY p1 ON s1 USING (a in (select x from s2 where y like '%2f%')); +CREATE POLICY p2 ON s2 USING (x in (select a from s1 where b like '%22%')); +CREATE POLICY p3 ON s1 FOR INSERT WITH CHECK (a = (SELECT a FROM s1)); +ALTER TABLE s1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE s2 ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW v2 AS SELECT * FROM s2 WHERE y like '%af%'; +SELECT * FROM s1 WHERE f_leak(b); -- fail (infinite recursion) +ERROR: infinite recursion detected in policy for relation "s1" +INSERT INTO s1 VALUES (1, 'foo'); -- fail (infinite recursion) +ERROR: infinite recursion detected in policy for relation "s1" +SET SESSION AUTHORIZATION regress_rls_alice; +DROP POLICY p3 on s1; +ALTER POLICY p2 ON s2 USING (x % 2 = 0); +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM s1 WHERE f_leak(b); -- OK +NOTICE: f_leak => c81e728d9d4c2f636f067f89cc14862c +NOTICE: f_leak => a87ff679a2f3e71d9181a67b7542122c + a | b +---+---------------------------------- + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM only s1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------------------------- + Seq Scan on s1 + Filter: ((hashed SubPlan 1) AND f_leak(b)) + SubPlan 1 + -> Seq Scan on s2 + Filter: (((x % 2) = 0) AND (y ~~ '%2f%'::text)) + Optimizer: Postgres query optimizer +(6 rows) + +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY p1 ON s1 USING (a in (select x from v2)); -- using VIEW in RLS policy +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM s1 WHERE f_leak(b); -- OK +NOTICE: f_leak => 0267aaf632e87a63288a08331f22c7c3 +NOTICE: f_leak => 1679091c5a880faf6fb5e6087eb1b2dc + a | b +----+---------------------------------- + -4 | 0267aaf632e87a63288a08331f22c7c3 + 6 | 1679091c5a880faf6fb5e6087eb1b2dc +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM s1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------------------------- + Seq Scan on s1 + Filter: ((hashed SubPlan 1) AND f_leak(b)) + SubPlan 1 + -> Seq Scan on s2 + Filter: (((x % 2) = 0) AND (y ~~ '%af%'::text)) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT (SELECT x FROM s1 LIMIT 1) xx, * FROM s2 WHERE y like '%28%'; + xx | x | y +----+----+---------------------------------- + -6 | -6 | 596a3d04481816330f07e4f97510c28f + -4 | -4 | 0267aaf632e87a63288a08331f22c7c3 + 2 | 2 | c81e728d9d4c2f636f067f89cc14862c +(3 rows) + +EXPLAIN (COSTS OFF) SELECT (SELECT x FROM s1 LIMIT 1) xx, * FROM s2 WHERE y like '%28%'; + QUERY PLAN +------------------------------------------------------------------------- + Seq Scan on s2 + Filter: (((x % 2) = 0) AND (y ~~ '%28%'::text)) + SubPlan 2 + -> Limit + -> Seq Scan on s1 + Filter: (hashed SubPlan 1) + SubPlan 1 + -> Seq Scan on s2 s2_1 + Filter: (((x % 2) = 0) AND (y ~~ '%af%'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY p2 ON s2 USING (x in (select a from s1 where b like '%d2%')); +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM s1 WHERE f_leak(b); -- fail (infinite recursion via view) +ERROR: infinite recursion detected in policy for relation "s1" +-- prepared statement with regress_rls_alice privilege +PREPARE p1(int) AS SELECT * FROM t1 WHERE a <= $1; +EXECUTE p1(2); + id | a | b +-----+---+----- + 102 | 2 | bbb + 202 | 2 | bcd + 302 | 2 | yyy +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE p1(2); + QUERY PLAN +---------------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: ((a <= 2) AND ((a % 2) = 0)) + -> Seq Scan on t2 t1_2 + Filter: ((a <= 2) AND ((a % 2) = 0)) + -> Seq Scan on t3 t1_3 + Filter: ((a <= 2) AND ((a % 2) = 0)) + Optimizer: Postgres query optimizer +(8 rows) + +-- superuser is allowed to bypass RLS checks +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +SELECT * FROM t1 WHERE f_leak(b); +NOTICE: f_leak => aba +NOTICE: f_leak => bbb +NOTICE: f_leak => ccc +NOTICE: f_leak => dad +NOTICE: f_leak => abc +NOTICE: f_leak => bcd +NOTICE: f_leak => cde +NOTICE: f_leak => def +NOTICE: f_leak => xxx +NOTICE: f_leak => yyy +NOTICE: f_leak => zzz + id | a | b +-----+---+----- + 101 | 1 | aba + 102 | 2 | bbb + 103 | 3 | ccc + 104 | 4 | dad + 201 | 1 | abc + 202 | 2 | bcd + 203 | 3 | cde + 204 | 4 | def + 301 | 1 | xxx + 302 | 2 | yyy + 303 | 3 | zzz +(11 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b); + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: f_leak(b) + -> Seq Scan on t2 t1_2 + Filter: f_leak(b) + -> Seq Scan on t3 t1_3 + Filter: f_leak(b) + Optimizer: Postgres query optimizer +(8 rows) + +-- plan cache should be invalidated +EXECUTE p1(2); + id | a | b +-----+---+----- + 101 | 1 | aba + 102 | 2 | bbb + 201 | 1 | abc + 202 | 2 | bcd + 301 | 1 | xxx + 302 | 2 | yyy +(6 rows) + +EXPLAIN (COSTS OFF) EXECUTE p1(2); + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: (a <= 2) + -> Seq Scan on t2 t1_2 + Filter: (a <= 2) + -> Seq Scan on t3 t1_3 + Filter: (a <= 2) + Optimizer: Postgres query optimizer +(8 rows) + +PREPARE p2(int) AS SELECT * FROM t1 WHERE a = $1; +EXECUTE p2(2); + id | a | b +-----+---+----- + 102 | 2 | bbb + 202 | 2 | bcd + 302 | 2 | yyy +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE p2(2); + QUERY PLAN +------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: (a = 2) + -> Seq Scan on t2 t1_2 + Filter: (a = 2) + -> Seq Scan on t3 t1_3 + Filter: (a = 2) + Optimizer: Postgres query optimizer +(8 rows) + +-- also, case when privilege switch from superuser +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +EXECUTE p2(2); + id | a | b +-----+---+----- + 102 | 2 | bbb + 202 | 2 | bcd + 302 | 2 | yyy +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE p2(2); + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on t1 t1_1 + Filter: ((a = 2) AND ((a % 2) = 0)) + -> Seq Scan on t2 t1_2 + Filter: ((a = 2) AND ((a % 2) = 0)) + -> Seq Scan on t3 t1_3 + Filter: ((a = 2) AND ((a % 2) = 0)) + Optimizer: Postgres query optimizer +(8 rows) + +-- +-- UPDATE / DELETE and Row-level security +-- +SET SESSION AUTHORIZATION regress_rls_bob; +EXPLAIN (COSTS OFF) UPDATE t1 SET b = b || b WHERE f_leak(b); + QUERY PLAN +----------------------------------------------------------- + Update on t1 + Update on t1 t1_1 + Update on t2 t1_2 + Update on t3 t1_3 + -> Result + -> Append + -> Seq Scan on t1 t1_1 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t2 t1_2 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t3 t1_3 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(13 rows) + +UPDATE t1 SET b = b || b WHERE f_leak(b); +NOTICE: f_leak => bbb +NOTICE: f_leak => dad +NOTICE: f_leak => bcd +NOTICE: f_leak => def +NOTICE: f_leak => yyy +EXPLAIN (COSTS OFF) UPDATE only t1 SET b = b || '_updt' WHERE f_leak(b); + QUERY PLAN +----------------------------------------------- + Update on t1 + -> Seq Scan on t1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(4 rows) + +UPDATE only t1 SET b = b || '_updt' WHERE f_leak(b); +NOTICE: f_leak => bbbbbb +NOTICE: f_leak => daddad +-- returning clause with system column +UPDATE only t1 SET b = b WHERE f_leak(b) RETURNING tableoid::regclass, *, t1; +NOTICE: f_leak => bbbbbb_updt +NOTICE: f_leak => daddad_updt + tableoid | id | a | b | t1 +----------+-----+---+-------------+--------------------- + t1 | 102 | 2 | bbbbbb_updt | (102,2,bbbbbb_updt) + t1 | 104 | 4 | daddad_updt | (104,4,daddad_updt) +(2 rows) + +UPDATE t1 SET b = b WHERE f_leak(b) RETURNING *; +NOTICE: f_leak => bbbbbb_updt +NOTICE: f_leak => daddad_updt +NOTICE: f_leak => bcdbcd +NOTICE: f_leak => defdef +NOTICE: f_leak => yyyyyy + id | a | b +-----+---+------------- + 102 | 2 | bbbbbb_updt + 104 | 4 | daddad_updt + 202 | 2 | bcdbcd + 204 | 4 | defdef + 302 | 2 | yyyyyy +(5 rows) + +UPDATE t1 SET b = b WHERE f_leak(b) RETURNING tableoid::regclass, *, t1; +NOTICE: f_leak => bbbbbb_updt +NOTICE: f_leak => daddad_updt +NOTICE: f_leak => bcdbcd +NOTICE: f_leak => defdef +NOTICE: f_leak => yyyyyy + tableoid | id | a | b | t1 +----------+-----+---+-------------+--------------------- + t1 | 102 | 2 | bbbbbb_updt | (102,2,bbbbbb_updt) + t1 | 104 | 4 | daddad_updt | (104,4,daddad_updt) + t2 | 202 | 2 | bcdbcd | (202,2,bcdbcd) + t2 | 204 | 4 | defdef | (204,4,defdef) + t3 | 302 | 2 | yyyyyy | (302,2,yyyyyy) +(5 rows) + +-- updates with from clause +EXPLAIN (COSTS OFF) UPDATE t2 SET b=t2.b FROM t3 +WHERE t2.a = 3 and t3.a = 2 AND f_leak(t2.b) AND f_leak(t3.b); + QUERY PLAN +----------------------------------------------------------------- + Update on t2 + -> Nested Loop + -> Seq Scan on t2 + Filter: ((a = 3) AND ((a % 2) = 1) AND f_leak(b)) + -> Seq Scan on t3 + Filter: ((a = 2) AND f_leak(b)) + Optimizer: Postgres query optimizer +(7 rows) + +UPDATE t2 SET b=t2.b FROM t3 +WHERE t2.a = 3 and t3.a = 2 AND f_leak(t2.b) AND f_leak(t3.b); +NOTICE: f_leak => cde +NOTICE: f_leak => yyyyyy +EXPLAIN (COSTS OFF) UPDATE t1 SET b=t1.b FROM t2 +WHERE t1.a = 3 and t2.a = 3 AND f_leak(t1.b) AND f_leak(t2.b); + QUERY PLAN +----------------------------------------------------------------------- + Update on t1 + Update on t1 t1_1 + Update on t2 t1_2 + Update on t3 t1_3 + -> Nested Loop + -> Append + -> Seq Scan on t1 t1_1 + Filter: ((a = 3) AND ((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t2 t1_2 + Filter: ((a = 3) AND ((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t3 t1_3 + Filter: ((a = 3) AND ((a % 2) = 0) AND f_leak(b)) + -> Materialize + -> Seq Scan on t2 + Filter: ((a = 3) AND ((a % 2) = 1) AND f_leak(b)) + Optimizer: Postgres query optimizer +(16 rows) + +UPDATE t1 SET b=t1.b FROM t2 +WHERE t1.a = 3 and t2.a = 3 AND f_leak(t1.b) AND f_leak(t2.b); +EXPLAIN (COSTS OFF) UPDATE t2 SET b=t2.b FROM t1 +WHERE t1.a = 3 and t2.a = 3 AND f_leak(t1.b) AND f_leak(t2.b); + QUERY PLAN +----------------------------------------------------------------------- + Update on t2 + -> Nested Loop + -> Seq Scan on t2 + Filter: ((a = 3) AND ((a % 2) = 1) AND f_leak(b)) + -> Append + -> Seq Scan on t1 t1_1 + Filter: ((a = 3) AND ((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t2 t1_2 + Filter: ((a = 3) AND ((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t3 t1_3 + Filter: ((a = 3) AND ((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(12 rows) + +UPDATE t2 SET b=t2.b FROM t1 +WHERE t1.a = 3 and t2.a = 3 AND f_leak(t1.b) AND f_leak(t2.b); +NOTICE: f_leak => cde +-- updates with from clause self join +EXPLAIN (COSTS OFF) UPDATE t2 t2_1 SET b = t2_2.b FROM t2 t2_2 +WHERE t2_1.a = 3 AND t2_2.a = t2_1.a AND t2_2.b = t2_1.b +AND f_leak(t2_1.b) AND f_leak(t2_2.b) RETURNING *, t2_1, t2_2; + QUERY PLAN +----------------------------------------------------------------------- + Update on t2 t2_1 + -> Hash Join + Hash Cond: (t2_2.b = t2_1.b) + -> Seq Scan on t2 t2_2 + Filter: ((a = 3) AND ((a % 2) = 1) AND f_leak(b)) + -> Hash + -> Seq Scan on t2 t2_1 + Filter: ((a = 3) AND ((a % 2) = 1) AND f_leak(b)) + Optimizer: Postgres query optimizer +(9 rows) + +UPDATE t2 t2_1 SET b = t2_2.b FROM t2 t2_2 +WHERE t2_1.a = 3 AND t2_2.a = t2_1.a AND t2_2.b = t2_1.b +AND f_leak(t2_1.b) AND f_leak(t2_2.b) RETURNING *, t2_1, t2_2; +NOTICE: f_leak => cde +NOTICE: f_leak => cde + id | a | b | c | id | a | b | c | t2_1 | t2_2 +-----+---+-----+-----+-----+---+-----+-----+-----------------+----------------- + 203 | 3 | cde | 3.3 | 203 | 3 | cde | 3.3 | (203,3,cde,3.3) | (203,3,cde,3.3) +(1 row) + +EXPLAIN (COSTS OFF) UPDATE t1 t1_1 SET b = t1_2.b FROM t1 t1_2 +WHERE t1_1.a = 4 AND t1_2.a = t1_1.a AND t1_2.b = t1_1.b +AND f_leak(t1_1.b) AND f_leak(t1_2.b) RETURNING *, t1_1, t1_2; + QUERY PLAN +----------------------------------------------------------------------------- + Update on t1 t1_1 + Update on t1 t1_1_1 + Update on t2 t1_1_2 + Update on t3 t1_1_3 + -> Hash Join + Hash Cond: (t1_1.b = t1_2.b) + -> Append + -> Seq Scan on t1 t1_1_1 + Filter: ((a = 4) AND ((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t2 t1_1_2 + Filter: ((a = 4) AND ((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t3 t1_1_3 + Filter: ((a = 4) AND ((a % 2) = 0) AND f_leak(b)) + -> Hash + -> Append + -> Seq Scan on t1 t1_2_1 + Filter: ((a = 4) AND ((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t2 t1_2_2 + Filter: ((a = 4) AND ((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t3 t1_2_3 + Filter: ((a = 4) AND ((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(22 rows) + +UPDATE t1 t1_1 SET b = t1_2.b FROM t1 t1_2 +WHERE t1_1.a = 4 AND t1_2.a = t1_1.a AND t1_2.b = t1_1.b +AND f_leak(t1_1.b) AND f_leak(t1_2.b) RETURNING *, t1_1, t1_2; +NOTICE: f_leak => daddad_updt +NOTICE: f_leak => daddad_updt +NOTICE: f_leak => defdef +NOTICE: f_leak => defdef + id | a | b | id | a | b | t1_1 | t1_2 +-----+---+-------------+-----+---+-------------+---------------------+--------------------- + 104 | 4 | daddad_updt | 104 | 4 | daddad_updt | (104,4,daddad_updt) | (104,4,daddad_updt) + 204 | 4 | defdef | 204 | 4 | defdef | (204,4,defdef) | (204,4,defdef) +(2 rows) + +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +SELECT * FROM t1 ORDER BY a,b; + id | a | b +-----+---+------------- + 101 | 1 | aba + 201 | 1 | abc + 301 | 1 | xxx + 102 | 2 | bbbbbb_updt + 202 | 2 | bcdbcd + 302 | 2 | yyyyyy + 103 | 3 | ccc + 203 | 3 | cde + 303 | 3 | zzz + 104 | 4 | daddad_updt + 204 | 4 | defdef +(11 rows) + +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +EXPLAIN (COSTS OFF) DELETE FROM only t1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------------- + Delete on t1 + -> Seq Scan on t1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(4 rows) + +EXPLAIN (COSTS OFF) DELETE FROM t1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------------------- + Delete on t1 + Delete on t1 t1_1 + Delete on t2 t1_2 + Delete on t3 t1_3 + -> Append + -> Seq Scan on t1 t1_1 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t2 t1_2 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Seq Scan on t3 t1_3 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(12 rows) + +DELETE FROM only t1 WHERE f_leak(b) RETURNING tableoid::regclass, *, t1; +NOTICE: f_leak => bbbbbb_updt +NOTICE: f_leak => daddad_updt + tableoid | id | a | b | t1 +----------+-----+---+-------------+--------------------- + t1 | 102 | 2 | bbbbbb_updt | (102,2,bbbbbb_updt) + t1 | 104 | 4 | daddad_updt | (104,4,daddad_updt) +(2 rows) + +DELETE FROM t1 WHERE f_leak(b) RETURNING tableoid::regclass, *, t1; +NOTICE: f_leak => bcdbcd +NOTICE: f_leak => defdef +NOTICE: f_leak => yyyyyy + tableoid | id | a | b | t1 +----------+-----+---+--------+---------------- + t2 | 202 | 2 | bcdbcd | (202,2,bcdbcd) + t2 | 204 | 4 | defdef | (204,4,defdef) + t3 | 302 | 2 | yyyyyy | (302,2,yyyyyy) +(3 rows) + +-- +-- S.b. view on top of Row-level security +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE b1 (a int, b text); +INSERT INTO b1 (SELECT x, md5(x::text) FROM generate_series(-10,10) x); +CREATE POLICY p1 ON b1 USING (a % 2 = 0); +ALTER TABLE b1 ENABLE ROW LEVEL SECURITY; +GRANT ALL ON b1 TO regress_rls_bob; +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW bv1 WITH (security_barrier) AS SELECT * FROM b1 WHERE a > 0 WITH CHECK OPTION; +GRANT ALL ON bv1 TO regress_rls_carol; +SET SESSION AUTHORIZATION regress_rls_carol; +EXPLAIN (COSTS OFF) SELECT * FROM bv1 WHERE f_leak(b); + QUERY PLAN +--------------------------------------------- + Subquery Scan on bv1 + Filter: f_leak(bv1.b) + -> Seq Scan on b1 + Filter: ((a > 0) AND ((a % 2) = 0)) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT * FROM bv1 WHERE f_leak(b); +NOTICE: f_leak => c81e728d9d4c2f636f067f89cc14862c +NOTICE: f_leak => a87ff679a2f3e71d9181a67b7542122c +NOTICE: f_leak => 1679091c5a880faf6fb5e6087eb1b2dc +NOTICE: f_leak => c9f0f895fb98ab9159f51fd0297e236d +NOTICE: f_leak => d3d9446802a44259755d38e6d163e820 + a | b +----+---------------------------------- + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 10 | d3d9446802a44259755d38e6d163e820 +(5 rows) + +INSERT INTO bv1 VALUES (-1, 'xxx'); -- should fail view WCO +ERROR: new row violates row-level security policy for table "b1" +INSERT INTO bv1 VALUES (11, 'xxx'); -- should fail RLS check +ERROR: new row violates row-level security policy for table "b1" +INSERT INTO bv1 VALUES (12, 'xxx'); -- ok +EXPLAIN (COSTS OFF) UPDATE bv1 SET b = 'yyy' WHERE a = 4 AND f_leak(b); + QUERY PLAN +----------------------------------------------------------------------- + Update on b1 + -> Seq Scan on b1 + Filter: ((a > 0) AND (a = 4) AND ((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(4 rows) + +UPDATE bv1 SET b = 'yyy' WHERE a = 4 AND f_leak(b); +NOTICE: f_leak => a87ff679a2f3e71d9181a67b7542122c +EXPLAIN (COSTS OFF) DELETE FROM bv1 WHERE a = 6 AND f_leak(b); + QUERY PLAN +----------------------------------------------------------------------- + Delete on b1 + -> Seq Scan on b1 + Filter: ((a > 0) AND (a = 6) AND ((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(4 rows) + +DELETE FROM bv1 WHERE a = 6 AND f_leak(b); +NOTICE: f_leak => 1679091c5a880faf6fb5e6087eb1b2dc +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM b1; + a | b +-----+---------------------------------- + -10 | 1b0fd9efa5279c4203b7c70233f86dbf + -9 | 252e691406782824eec43d7eadc3d256 + -8 | a8d2ec85eaf98407310b72eb73dda247 + -7 | 74687a12d3915d3c4d83f1af7b3683d5 + -6 | 596a3d04481816330f07e4f97510c28f + -5 | 47c1b025fa18ea96c33fbb6718688c0f + -4 | 0267aaf632e87a63288a08331f22c7c3 + -3 | b3149ecea4628efd23d2f86e5a723472 + -2 | 5d7b9adcbe1c629ec722529dd12e5129 + -1 | 6bb61e3b7bce0931da574d19d1d82c88 + 0 | cfcd208495d565ef66e7dff9f98764da + 1 | c4ca4238a0b923820dcc509a6f75849b + 2 | c81e728d9d4c2f636f067f89cc14862c + 3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 + 5 | e4da3b7fbbce2345d7772b0674a318d5 + 7 | 8f14e45fceea167a5a36dedd4bea2543 + 8 | c9f0f895fb98ab9159f51fd0297e236d + 9 | 45c48cce2e2d7fbdea1afc51c7c6ad26 + 10 | d3d9446802a44259755d38e6d163e820 + 12 | xxx + 4 | yyy +(21 rows) + +-- +-- INSERT ... ON CONFLICT DO UPDATE and Row-level security +-- +SET SESSION AUTHORIZATION regress_rls_alice; +DROP POLICY p1 ON document; +DROP POLICY p1r ON document; +CREATE POLICY p1 ON document FOR SELECT USING (true); +CREATE POLICY p2 ON document FOR INSERT WITH CHECK (dauthor = current_user); +CREATE POLICY p3 ON document FOR UPDATE + USING (cid = (SELECT cid from category WHERE cname = 'novel')) + WITH CHECK (dauthor = current_user); +SET SESSION AUTHORIZATION regress_rls_bob; +-- Exists... +SELECT * FROM document WHERE did = 2; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-----------------+----------------- + 2 | 11 | 2 | regress_rls_bob | my second novel +(1 row) + +-- ...so violates actual WITH CHECK OPTION within UPDATE (not INSERT, since +-- alternative UPDATE path happens to be taken): +INSERT INTO document VALUES (2, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_carol', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, dauthor = EXCLUDED.dauthor; +ERROR: new row violates row-level security policy for table "document" +-- Violates USING qual for UPDATE policy p3. +-- +-- UPDATE path is taken, but UPDATE fails purely because *existing* row to be +-- updated is not a "novel"/cid 11 (row is not leaked, even though we have +-- SELECT privileges sufficient to see the row in this instance): +INSERT INTO document VALUES (33, 22, 1, 'regress_rls_bob', 'okay science fiction'); -- preparation for next statement +INSERT INTO document VALUES (33, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'Some novel, replaces sci-fi') -- takes UPDATE path + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle; +ERROR: new row violates row-level security policy (USING expression) for table "document" +-- Fine (we UPDATE, since INSERT WCOs and UPDATE security barrier quals + WCOs +-- not violated): +INSERT INTO document VALUES (2, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle RETURNING *; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-----------------+---------------- + 2 | 11 | 2 | regress_rls_bob | my first novel +(1 row) + +-- Fine (we INSERT, so "cid = 33" ("technology") isn't evaluated): +INSERT INTO document VALUES (78, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'some technology novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, cid = 33 RETURNING *; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-----------------+----------------------- + 78 | 11 | 1 | regress_rls_bob | some technology novel +(1 row) + +-- Fine (same query, but we UPDATE, so "cid = 33", ("technology") is not the +-- case in respect of *existing* tuple): +INSERT INTO document VALUES (78, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'some technology novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, cid = 33 RETURNING *; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-----------------+----------------------- + 78 | 33 | 1 | regress_rls_bob | some technology novel +(1 row) + +-- Same query a third time, but now fails due to existing tuple finally not +-- passing quals: +INSERT INTO document VALUES (78, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'some technology novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, cid = 33 RETURNING *; +ERROR: new row violates row-level security policy (USING expression) for table "document" +-- Don't fail just because INSERT doesn't satisfy WITH CHECK option that +-- originated as a barrier/USING() qual from the UPDATE. Note that the UPDATE +-- path *isn't* taken, and so UPDATE-related policy does not apply: +INSERT INTO document VALUES (79, (SELECT cid from category WHERE cname = 'technology'), 1, 'regress_rls_bob', 'technology book, can only insert') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle RETURNING *; + did | cid | dlevel | dauthor | dtitle +-----+-----+--------+-----------------+---------------------------------- + 79 | 33 | 1 | regress_rls_bob | technology book, can only insert +(1 row) + +-- But this time, the same statement fails, because the UPDATE path is taken, +-- and updating the row just inserted falls afoul of security barrier qual +-- (enforced as WCO) -- what we might have updated target tuple to is +-- irrelevant, in fact. +INSERT INTO document VALUES (79, (SELECT cid from category WHERE cname = 'technology'), 1, 'regress_rls_bob', 'technology book, can only insert') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle RETURNING *; +ERROR: new row violates row-level security policy (USING expression) for table "document" +-- Test default USING qual enforced as WCO +SET SESSION AUTHORIZATION regress_rls_alice; +DROP POLICY p1 ON document; +DROP POLICY p2 ON document; +DROP POLICY p3 ON document; +CREATE POLICY p3_with_default ON document FOR UPDATE + USING (cid = (SELECT cid from category WHERE cname = 'novel')); +SET SESSION AUTHORIZATION regress_rls_bob; +-- Just because WCO-style enforcement of USING quals occurs with +-- existing/target tuple does not mean that the implementation can be allowed +-- to fail to also enforce this qual against the final tuple appended to +-- relation (since in the absence of an explicit WCO, this is also interpreted +-- as an UPDATE/ALL WCO in general). +-- +-- UPDATE path is taken here (fails due to existing tuple). Note that this is +-- not reported as a "USING expression", because it's an RLS UPDATE check that originated as +-- a USING qual for the purposes of RLS in general, as opposed to an explicit +-- USING qual that is ordinarily a security barrier. We leave it up to the +-- UPDATE to make this fail: +INSERT INTO document VALUES (79, (SELECT cid from category WHERE cname = 'technology'), 1, 'regress_rls_bob', 'technology book, can only insert') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle RETURNING *; +ERROR: new row violates row-level security policy for table "document" +-- UPDATE path is taken here. Existing tuple passes, since its cid +-- corresponds to "novel", but default USING qual is enforced against +-- post-UPDATE tuple too (as always when updating with a policy that lacks an +-- explicit WCO), and so this fails: +INSERT INTO document VALUES (2, (SELECT cid from category WHERE cname = 'technology'), 1, 'regress_rls_bob', 'my first novel') + ON CONFLICT (did) DO UPDATE SET cid = EXCLUDED.cid, dtitle = EXCLUDED.dtitle RETURNING *; +ERROR: new row violates row-level security policy for table "document" +SET SESSION AUTHORIZATION regress_rls_alice; +DROP POLICY p3_with_default ON document; +-- +-- Test ALL policies with ON CONFLICT DO UPDATE (much the same as existing UPDATE +-- tests) +-- +CREATE POLICY p3_with_all ON document FOR ALL + USING (cid = (SELECT cid from category WHERE cname = 'novel')) + WITH CHECK (dauthor = current_user); +SET SESSION AUTHORIZATION regress_rls_bob; +-- Fails, since ALL WCO is enforced in insert path: +INSERT INTO document VALUES (80, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_carol', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, cid = 33; +ERROR: new row violates row-level security policy for table "document" +-- Fails, since ALL policy USING qual is enforced (existing, target tuple is in +-- violation, since it has the "manga" cid): +INSERT INTO document VALUES (4, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle; +ERROR: new row violates row-level security policy (USING expression) for table "document" +-- Fails, since ALL WCO are enforced: +INSERT INTO document VALUES (1, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dauthor = 'regress_rls_carol'; +ERROR: new row violates row-level security policy for table "document" +-- +-- ROLE/GROUP +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE z1 (a int, b text); +CREATE TABLE z2 (a int, b text); +GRANT SELECT ON z1,z2 TO regress_rls_group1, regress_rls_group2, + regress_rls_bob, regress_rls_carol; +INSERT INTO z1 VALUES + (1, 'aba'), + (2, 'bbb'), + (3, 'ccc'), + (4, 'dad'); +CREATE POLICY p1 ON z1 TO regress_rls_group1 USING (a % 2 = 0); +CREATE POLICY p2 ON z1 TO regress_rls_group2 USING (a % 2 = 1); +ALTER TABLE z1 ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM z1 WHERE f_leak(b); +NOTICE: f_leak => bbb +NOTICE: f_leak => dad + a | b +---+----- + 2 | bbb + 4 | dad +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +PREPARE plancache_test AS SELECT * FROM z1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) EXECUTE plancache_test; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +PREPARE plancache_test2 AS WITH q AS MATERIALIZED (SELECT * FROM z1 WHERE f_leak(b)) SELECT * FROM q,z2; +EXPLAIN (COSTS OFF) EXECUTE plancache_test2; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Shared Scan (share slice:id -1:0) + -> Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Materialize + -> Seq Scan on z2 + Optimizer: Postgres query optimizer +(7 rows) + +PREPARE plancache_test3 AS WITH q AS MATERIALIZED (SELECT * FROM z2) SELECT * FROM q,z1 WHERE f_leak(z1.b); +EXPLAIN (COSTS OFF) EXECUTE plancache_test3; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Shared Scan (share slice:id -1:0) + -> Seq Scan on z2 + -> Materialize + -> Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(7 rows) + +SET ROLE regress_rls_group1; +SELECT * FROM z1 WHERE f_leak(b); +NOTICE: f_leak => bbb +NOTICE: f_leak => dad + a | b +---+----- + 2 | bbb + 4 | dad +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test2; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Shared Scan (share slice:id -1:0) + -> Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + -> Materialize + -> Seq Scan on z2 + Optimizer: Postgres query optimizer +(7 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test3; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Shared Scan (share slice:id -1:0) + -> Seq Scan on z2 + -> Materialize + -> Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(7 rows) + +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM z1 WHERE f_leak(b); +NOTICE: f_leak => aba +NOTICE: f_leak => ccc + a | b +---+----- + 1 | aba + 3 | ccc +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test2; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Shared Scan (share slice:id -1:0) + -> Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) + -> Materialize + -> Seq Scan on z2 + Optimizer: Postgres query optimizer +(7 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test3; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Shared Scan (share slice:id -1:0) + -> Seq Scan on z2 + -> Materialize + -> Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) + Optimizer: Postgres query optimizer +(7 rows) + +SET ROLE regress_rls_group2; +SELECT * FROM z1 WHERE f_leak(b); +NOTICE: f_leak => aba +NOTICE: f_leak => ccc + a | b +---+----- + 1 | aba + 3 | ccc +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test2; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Shared Scan (share slice:id -1:0) + -> Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) + -> Materialize + -> Seq Scan on z2 + Optimizer: Postgres query optimizer +(7 rows) + +EXPLAIN (COSTS OFF) EXECUTE plancache_test3; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Shared Scan (share slice:id -1:0) + -> Seq Scan on z2 + -> Materialize + -> Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) + Optimizer: Postgres query optimizer +(7 rows) + +-- +-- Views should follow policy for view owner. +-- +-- View and Table owner are the same. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE VIEW rls_view AS SELECT * FROM z1 WHERE f_leak(b); +GRANT SELECT ON rls_view TO regress_rls_bob; +-- Query as role that is not owner of view or table. Should return all records. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +NOTICE: f_leak => aba +NOTICE: f_leak => bbb +NOTICE: f_leak => ccc +NOTICE: f_leak => dad + a | b +---+----- + 1 | aba + 2 | bbb + 3 | ccc + 4 | dad +(4 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +------------------------------------- + Seq Scan on z1 + Filter: f_leak(b) + Optimizer: Postgres query optimizer +(3 rows) + +-- Query as view/table owner. Should return all records. +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_view; +NOTICE: f_leak => aba +NOTICE: f_leak => bbb +NOTICE: f_leak => ccc +NOTICE: f_leak => dad + a | b +---+----- + 1 | aba + 2 | bbb + 3 | ccc + 4 | dad +(4 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +------------------------------------- + Seq Scan on z1 + Filter: f_leak(b) + Optimizer: Postgres query optimizer +(3 rows) + +DROP VIEW rls_view; +-- View and Table owners are different. +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW rls_view AS SELECT * FROM z1 WHERE f_leak(b); +GRANT SELECT ON rls_view TO regress_rls_alice; +-- Query as role that is not owner of view but is owner of table. +-- Should return records based on view owner policies. +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_view; +NOTICE: f_leak => bbb +NOTICE: f_leak => dad + a | b +---+----- + 2 | bbb + 4 | dad +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +-- Query as role that is not owner of table but is owner of view. +-- Should return records based on view owner policies. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +NOTICE: f_leak => bbb +NOTICE: f_leak => dad + a | b +---+----- + 2 | bbb + 4 | dad +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +-- Query as role that is not the owner of the table or view without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for view rls_view +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for view rls_view +-- Query as role that is not the owner of the table or view with permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +GRANT SELECT ON rls_view TO regress_rls_carol; +SELECT * FROM rls_view; +NOTICE: f_leak => bbb +NOTICE: f_leak => dad + a | b +---+----- + 2 | bbb + 4 | dad +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +SET SESSION AUTHORIZATION regress_rls_bob; +DROP VIEW rls_view; +-- +-- Command specific +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE x1 (a int, b text, c text); +GRANT ALL ON x1 TO PUBLIC; +INSERT INTO x1 VALUES + (1, 'abc', 'regress_rls_bob'), + (2, 'bcd', 'regress_rls_bob'), + (3, 'cde', 'regress_rls_carol'), + (4, 'def', 'regress_rls_carol'), + (5, 'efg', 'regress_rls_bob'), + (6, 'fgh', 'regress_rls_bob'), + (7, 'fgh', 'regress_rls_carol'), + (8, 'fgh', 'regress_rls_carol'); +CREATE POLICY p0 ON x1 FOR ALL USING (c = current_user); +CREATE POLICY p1 ON x1 FOR SELECT USING (a % 2 = 0); +CREATE POLICY p2 ON x1 FOR INSERT WITH CHECK (a % 2 = 1); +CREATE POLICY p3 ON x1 FOR UPDATE USING (a % 2 = 0); +CREATE POLICY p4 ON x1 FOR DELETE USING (a < 8); +ALTER TABLE x1 ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM x1 WHERE f_leak(b) ORDER BY a ASC; +NOTICE: f_leak => abc +NOTICE: f_leak => bcd +NOTICE: f_leak => def +NOTICE: f_leak => efg +NOTICE: f_leak => fgh +NOTICE: f_leak => fgh + a | b | c +---+-----+------------------- + 1 | abc | regress_rls_bob + 2 | bcd | regress_rls_bob + 4 | def | regress_rls_carol + 5 | efg | regress_rls_bob + 6 | fgh | regress_rls_bob + 8 | fgh | regress_rls_carol +(6 rows) + +UPDATE x1 SET b = b || '_updt' WHERE f_leak(b) RETURNING *; +NOTICE: f_leak => abc +NOTICE: f_leak => bcd +NOTICE: f_leak => def +NOTICE: f_leak => efg +NOTICE: f_leak => fgh +NOTICE: f_leak => fgh + a | b | c +---+----------+------------------- + 1 | abc_updt | regress_rls_bob + 2 | bcd_updt | regress_rls_bob + 4 | def_updt | regress_rls_carol + 5 | efg_updt | regress_rls_bob + 6 | fgh_updt | regress_rls_bob + 8 | fgh_updt | regress_rls_carol +(6 rows) + +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM x1 WHERE f_leak(b) ORDER BY a ASC; +NOTICE: f_leak => cde +NOTICE: f_leak => fgh +NOTICE: f_leak => bcd_updt +NOTICE: f_leak => def_updt +NOTICE: f_leak => fgh_updt +NOTICE: f_leak => fgh_updt + a | b | c +---+----------+------------------- + 2 | bcd_updt | regress_rls_bob + 3 | cde | regress_rls_carol + 4 | def_updt | regress_rls_carol + 6 | fgh_updt | regress_rls_bob + 7 | fgh | regress_rls_carol + 8 | fgh_updt | regress_rls_carol +(6 rows) + +UPDATE x1 SET b = b || '_updt' WHERE f_leak(b) RETURNING *; +NOTICE: f_leak => cde +NOTICE: f_leak => fgh +NOTICE: f_leak => bcd_updt +NOTICE: f_leak => def_updt +NOTICE: f_leak => fgh_updt +NOTICE: f_leak => fgh_updt + a | b | c +---+---------------+------------------- + 3 | cde_updt | regress_rls_carol + 7 | fgh_updt | regress_rls_carol + 2 | bcd_updt_updt | regress_rls_bob + 4 | def_updt_updt | regress_rls_carol + 6 | fgh_updt_updt | regress_rls_bob + 8 | fgh_updt_updt | regress_rls_carol +(6 rows) + +DELETE FROM x1 WHERE f_leak(b) RETURNING *; +NOTICE: f_leak => cde_updt +NOTICE: f_leak => fgh_updt +NOTICE: f_leak => bcd_updt_updt +NOTICE: f_leak => def_updt_updt +NOTICE: f_leak => fgh_updt_updt +NOTICE: f_leak => fgh_updt_updt + a | b | c +---+---------------+------------------- + 3 | cde_updt | regress_rls_carol + 7 | fgh_updt | regress_rls_carol + 2 | bcd_updt_updt | regress_rls_bob + 4 | def_updt_updt | regress_rls_carol + 6 | fgh_updt_updt | regress_rls_bob + 8 | fgh_updt_updt | regress_rls_carol +(6 rows) + +-- +-- Duplicate Policy Names +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE y1 (a int, b text); +CREATE TABLE y2 (a int, b text); +GRANT ALL ON y1, y2 TO regress_rls_bob; +CREATE POLICY p1 ON y1 FOR ALL USING (a % 2 = 0); +CREATE POLICY p2 ON y1 FOR SELECT USING (a > 2); +CREATE POLICY p1 ON y1 FOR SELECT USING (a % 2 = 1); --fail +ERROR: policy "p1" for table "y1" already exists +CREATE POLICY p1 ON y2 FOR ALL USING (a % 2 = 0); --OK +ALTER TABLE y1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE y2 ENABLE ROW LEVEL SECURITY; +-- +-- Expression structure with SBV +-- +-- Create view as table owner. RLS should NOT be applied. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE VIEW rls_sbv WITH (security_barrier) AS + SELECT * FROM y1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM rls_sbv WHERE (a = 1); + QUERY PLAN +------------------------------------- + Seq Scan on y1 + Filter: (f_leak(b) AND (a = 1)) + Optimizer: Postgres query optimizer +(3 rows) + +DROP VIEW rls_sbv; +-- Create view as role that does not own table. RLS should be applied. +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW rls_sbv WITH (security_barrier) AS + SELECT * FROM y1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM rls_sbv WHERE (a = 1); + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on y1 + Filter: ((a = 1) AND ((a > 2) OR ((a % 2) = 0)) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +DROP VIEW rls_sbv; +-- +-- Expression structure +-- +SET SESSION AUTHORIZATION regress_rls_alice; +INSERT INTO y2 (SELECT x, md5(x::text) FROM generate_series(0,20) x); +ANALYZE y2; +CREATE POLICY p2 ON y2 USING (a % 3 = 0); +CREATE POLICY p3 ON y2 USING (a % 4 = 0); +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM y2 WHERE f_leak(b); +NOTICE: f_leak => cfcd208495d565ef66e7dff9f98764da +NOTICE: f_leak => c81e728d9d4c2f636f067f89cc14862c +NOTICE: f_leak => eccbc87e4b5ce2fe28308fd9f2a7baf3 +NOTICE: f_leak => a87ff679a2f3e71d9181a67b7542122c +NOTICE: f_leak => 1679091c5a880faf6fb5e6087eb1b2dc +NOTICE: f_leak => c9f0f895fb98ab9159f51fd0297e236d +NOTICE: f_leak => 45c48cce2e2d7fbdea1afc51c7c6ad26 +NOTICE: f_leak => d3d9446802a44259755d38e6d163e820 +NOTICE: f_leak => c20ad4d76fe97759aa27a0c99bff6710 +NOTICE: f_leak => aab3238922bcc25a6f606eb525ffdc56 +NOTICE: f_leak => 9bf31c7ff062936a96d3c8bd1f8f2ff3 +NOTICE: f_leak => c74d97b01eae257e44aa9d5bade97baf +NOTICE: f_leak => 6f4922f45568161a8cdf4ad2299f6d23 +NOTICE: f_leak => 98f13708210194c475687be6106a3b84 + a | b +----+---------------------------------- + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 9 | 45c48cce2e2d7fbdea1afc51c7c6ad26 + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 15 | 9bf31c7ff062936a96d3c8bd1f8f2ff3 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 +(14 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM y2 WHERE f_leak(b); + QUERY PLAN +----------------------------------------------------------------------------- + Seq Scan on y2 + Filter: ((((a % 4) = 0) OR ((a % 3) = 0) OR ((a % 2) = 0)) AND f_leak(b)) + Optimizer: Postgres query optimizer +(3 rows) + +-- +-- Qual push-down of leaky functions, when not referring to table +-- +SELECT * FROM y2 WHERE f_leak('abc'); +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc +NOTICE: f_leak => abc + a | b +----+---------------------------------- + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 9 | 45c48cce2e2d7fbdea1afc51c7c6ad26 + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 15 | 9bf31c7ff062936a96d3c8bd1f8f2ff3 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 +(14 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM y2 WHERE f_leak('abc'); + QUERY PLAN +--------------------------------------------------------------------------------------- + Seq Scan on y2 + Filter: (f_leak('abc'::text) AND (((a % 4) = 0) OR ((a % 3) = 0) OR ((a % 2) = 0))) + Optimizer: Postgres query optimizer +(3 rows) + +CREATE TABLE test_qual_pushdown ( + abc text +); +INSERT INTO test_qual_pushdown VALUES ('abc'),('def'); +ANALYZE test_qual_pushdown; +SELECT * FROM y2 JOIN test_qual_pushdown ON (b = abc) WHERE f_leak(abc); +NOTICE: f_leak => abc +NOTICE: f_leak => def + a | b | abc +---+---+----- +(0 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM y2 JOIN test_qual_pushdown ON (b = abc) WHERE f_leak(abc); + QUERY PLAN +------------------------------------------------------------------- + Hash Join + Hash Cond: (y2.b = test_qual_pushdown.abc) + -> Seq Scan on y2 + Filter: (((a % 4) = 0) OR ((a % 3) = 0) OR ((a % 2) = 0)) + -> Hash + -> Seq Scan on test_qual_pushdown + Filter: f_leak(abc) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM y2 JOIN test_qual_pushdown ON (b = abc) WHERE f_leak(b); +NOTICE: f_leak => cfcd208495d565ef66e7dff9f98764da +NOTICE: f_leak => c81e728d9d4c2f636f067f89cc14862c +NOTICE: f_leak => eccbc87e4b5ce2fe28308fd9f2a7baf3 +NOTICE: f_leak => a87ff679a2f3e71d9181a67b7542122c +NOTICE: f_leak => 1679091c5a880faf6fb5e6087eb1b2dc +NOTICE: f_leak => c9f0f895fb98ab9159f51fd0297e236d +NOTICE: f_leak => 45c48cce2e2d7fbdea1afc51c7c6ad26 +NOTICE: f_leak => d3d9446802a44259755d38e6d163e820 +NOTICE: f_leak => c20ad4d76fe97759aa27a0c99bff6710 +NOTICE: f_leak => aab3238922bcc25a6f606eb525ffdc56 +NOTICE: f_leak => 9bf31c7ff062936a96d3c8bd1f8f2ff3 +NOTICE: f_leak => c74d97b01eae257e44aa9d5bade97baf +NOTICE: f_leak => 6f4922f45568161a8cdf4ad2299f6d23 +NOTICE: f_leak => 98f13708210194c475687be6106a3b84 + a | b | abc +---+---+----- +(0 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM y2 JOIN test_qual_pushdown ON (b = abc) WHERE f_leak(b); + QUERY PLAN +----------------------------------------------------------------------------------- + Hash Join + Hash Cond: (y2.b = test_qual_pushdown.abc) + -> Seq Scan on y2 + Filter: ((((a % 4) = 0) OR ((a % 3) = 0) OR ((a % 2) = 0)) AND f_leak(b)) + -> Hash + -> Seq Scan on test_qual_pushdown + Optimizer: Postgres query optimizer +(7 rows) + +DROP TABLE test_qual_pushdown; +-- +-- Plancache invalidate on user change. +-- +RESET SESSION AUTHORIZATION; +DROP TABLE t1 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table t2 +drop cascades to table t3 +CREATE TABLE t1 (a integer); +GRANT SELECT ON t1 TO regress_rls_bob, regress_rls_carol; +CREATE POLICY p1 ON t1 TO regress_rls_bob USING ((a % 2) = 0); +CREATE POLICY p2 ON t1 TO regress_rls_carol USING ((a % 4) = 0); +ALTER TABLE t1 ENABLE ROW LEVEL SECURITY; +-- Prepare as regress_rls_bob +SET ROLE regress_rls_bob; +PREPARE role_inval AS SELECT * FROM t1; +-- Check plan +EXPLAIN (COSTS OFF) EXECUTE role_inval; + QUERY PLAN +------------------------------------- + Seq Scan on t1 + Filter: ((a % 2) = 0) + Optimizer: Postgres query optimizer +(3 rows) + +-- Change to regress_rls_carol +SET ROLE regress_rls_carol; +-- Check plan- should be different +EXPLAIN (COSTS OFF) EXECUTE role_inval; + QUERY PLAN +------------------------------------- + Seq Scan on t1 + Filter: ((a % 4) = 0) + Optimizer: Postgres query optimizer +(3 rows) + +-- Change back to regress_rls_bob +SET ROLE regress_rls_bob; +-- Check plan- should be back to original +EXPLAIN (COSTS OFF) EXECUTE role_inval; + QUERY PLAN +------------------------------------- + Seq Scan on t1 + Filter: ((a % 2) = 0) + Optimizer: Postgres query optimizer +(3 rows) + +-- +-- CTE and RLS +-- +RESET SESSION AUTHORIZATION; +DROP TABLE t1 CASCADE; +CREATE TABLE t1 (a integer, b text); +CREATE POLICY p1 ON t1 USING (a % 2 = 0); +ALTER TABLE t1 ENABLE ROW LEVEL SECURITY; +GRANT ALL ON t1 TO regress_rls_bob; +INSERT INTO t1 (SELECT x, md5(x::text) FROM generate_series(0,20) x); +SET SESSION AUTHORIZATION regress_rls_bob; +WITH cte1 AS MATERIALIZED (SELECT * FROM t1 WHERE f_leak(b)) SELECT * FROM cte1; +NOTICE: f_leak => cfcd208495d565ef66e7dff9f98764da +NOTICE: f_leak => c81e728d9d4c2f636f067f89cc14862c +NOTICE: f_leak => a87ff679a2f3e71d9181a67b7542122c +NOTICE: f_leak => 1679091c5a880faf6fb5e6087eb1b2dc +NOTICE: f_leak => c9f0f895fb98ab9159f51fd0297e236d +NOTICE: f_leak => d3d9446802a44259755d38e6d163e820 +NOTICE: f_leak => c20ad4d76fe97759aa27a0c99bff6710 +NOTICE: f_leak => aab3238922bcc25a6f606eb525ffdc56 +NOTICE: f_leak => c74d97b01eae257e44aa9d5bade97baf +NOTICE: f_leak => 6f4922f45568161a8cdf4ad2299f6d23 +NOTICE: f_leak => 98f13708210194c475687be6106a3b84 + a | b +----+---------------------------------- + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 +(11 rows) + +EXPLAIN (COSTS OFF) +WITH cte1 AS MATERIALIZED (SELECT * FROM t1 WHERE f_leak(b)) SELECT * FROM cte1; + QUERY PLAN +----------------------------------------------- + Shared Scan (share slice:id -1:0) + -> Seq Scan on t1 + Filter: (((a % 2) = 0) AND f_leak(b)) + Optimizer: Postgres query optimizer +(4 rows) + +WITH cte1 AS (UPDATE t1 SET a = a + 1 RETURNING *) SELECT * FROM cte1; --fail +ERROR: new row violates row-level security policy for table "t1" +WITH cte1 AS (UPDATE t1 SET a = a RETURNING *) SELECT * FROM cte1; --ok + a | b +----+---------------------------------- + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 +(11 rows) + +WITH cte1 AS (INSERT INTO t1 VALUES (21, 'Fail') RETURNING *) SELECT * FROM cte1; --fail +ERROR: new row violates row-level security policy for table "t1" +WITH cte1 AS (INSERT INTO t1 VALUES (20, 'Success') RETURNING *) SELECT * FROM cte1; --ok + a | b +----+--------- + 20 | Success +(1 row) + +-- +-- Rename Policy +-- +RESET SESSION AUTHORIZATION; +ALTER POLICY p1 ON t1 RENAME TO p1; --fail +ERROR: policy "p1" for table "t1" already exists +SELECT polname, relname + FROM pg_policy pol + JOIN pg_class pc ON (pc.oid = pol.polrelid) + WHERE relname = 't1'; + polname | relname +---------+--------- + p1 | t1 +(1 row) + +ALTER POLICY p1 ON t1 RENAME TO p2; --ok +SELECT polname, relname + FROM pg_policy pol + JOIN pg_class pc ON (pc.oid = pol.polrelid) + WHERE relname = 't1'; + polname | relname +---------+--------- + p2 | t1 +(1 row) + +-- +-- Check INSERT SELECT +-- +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE TABLE t2 (a integer, b text); +INSERT INTO t2 (SELECT * FROM t1); +EXPLAIN (COSTS OFF) INSERT INTO t2 (SELECT * FROM t1); + QUERY PLAN +------------------------------------- + Insert on t2 + -> Seq Scan on t1 + Filter: ((a % 2) = 0) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT * FROM t2; + a | b +----+---------------------------------- + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 + 20 | Success +(12 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t2; + QUERY PLAN +------------------------------------- + Seq Scan on t2 + Optimizer: Postgres query optimizer +(2 rows) + +CREATE TABLE t3 AS SELECT * FROM t1; +SELECT * FROM t3; + a | b +----+---------------------------------- + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 + 20 | Success +(12 rows) + +SELECT * INTO t4 FROM t1; +SELECT * FROM t4; + a | b +----+---------------------------------- + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 + 20 | Success +(12 rows) + +-- +-- RLS with JOIN +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE blog (id integer, author text, post text); +CREATE TABLE comment (blog_id integer, message text); +GRANT ALL ON blog, comment TO regress_rls_bob; +CREATE POLICY blog_1 ON blog USING (id % 2 = 0); +ALTER TABLE blog ENABLE ROW LEVEL SECURITY; +INSERT INTO blog VALUES + (1, 'alice', 'blog #1'), + (2, 'bob', 'blog #1'), + (3, 'alice', 'blog #2'), + (4, 'alice', 'blog #3'), + (5, 'john', 'blog #1'); +INSERT INTO comment VALUES + (1, 'cool blog'), + (1, 'fun blog'), + (3, 'crazy blog'), + (5, 'what?'), + (4, 'insane!'), + (2, 'who did it?'); +SET SESSION AUTHORIZATION regress_rls_bob; +-- Check RLS JOIN with Non-RLS. +SELECT id, author, message FROM blog JOIN comment ON id = blog_id; + id | author | message +----+--------+------------- + 4 | alice | insane! + 2 | bob | who did it? +(2 rows) + +-- Check Non-RLS JOIN with RLS. +SELECT id, author, message FROM comment JOIN blog ON id = blog_id; + id | author | message +----+--------+------------- + 4 | alice | insane! + 2 | bob | who did it? +(2 rows) + +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE POLICY comment_1 ON comment USING (blog_id < 4); +ALTER TABLE comment ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +-- Check RLS JOIN RLS +SELECT id, author, message FROM blog JOIN comment ON id = blog_id; + id | author | message +----+--------+------------- + 2 | bob | who did it? +(1 row) + +SELECT id, author, message FROM comment JOIN blog ON id = blog_id; + id | author | message +----+--------+------------- + 2 | bob | who did it? +(1 row) + +SET SESSION AUTHORIZATION regress_rls_alice; +DROP TABLE blog, comment; +-- +-- Default Deny Policy +-- +RESET SESSION AUTHORIZATION; +DROP POLICY p2 ON t1; +ALTER TABLE t1 OWNER TO regress_rls_alice; +-- Check that default deny does not apply to superuser. +RESET SESSION AUTHORIZATION; +SELECT * FROM t1; + a | b +----+---------------------------------- + 1 | c4ca4238a0b923820dcc509a6f75849b + 3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 + 5 | e4da3b7fbbce2345d7772b0674a318d5 + 7 | 8f14e45fceea167a5a36dedd4bea2543 + 9 | 45c48cce2e2d7fbdea1afc51c7c6ad26 + 11 | 6512bd43d9caa6e02c990b0a82652dca + 13 | c51ce410c124a10e0db5e4b97fc2af39 + 15 | 9bf31c7ff062936a96d3c8bd1f8f2ff3 + 17 | 70efdf2ec9b086079795c442636b55fb + 19 | 1f0e3dad99908345f7439f8ffabdffc4 + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 + 20 | Success +(22 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1; + QUERY PLAN +------------------------------------- + Seq Scan on t1 + Optimizer: Postgres query optimizer +(2 rows) + +-- Check that default deny does not apply to table owner. +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM t1; + a | b +----+---------------------------------- + 1 | c4ca4238a0b923820dcc509a6f75849b + 3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 + 5 | e4da3b7fbbce2345d7772b0674a318d5 + 7 | 8f14e45fceea167a5a36dedd4bea2543 + 9 | 45c48cce2e2d7fbdea1afc51c7c6ad26 + 11 | 6512bd43d9caa6e02c990b0a82652dca + 13 | c51ce410c124a10e0db5e4b97fc2af39 + 15 | 9bf31c7ff062936a96d3c8bd1f8f2ff3 + 17 | 70efdf2ec9b086079795c442636b55fb + 19 | 1f0e3dad99908345f7439f8ffabdffc4 + 0 | cfcd208495d565ef66e7dff9f98764da + 2 | c81e728d9d4c2f636f067f89cc14862c + 4 | a87ff679a2f3e71d9181a67b7542122c + 6 | 1679091c5a880faf6fb5e6087eb1b2dc + 8 | c9f0f895fb98ab9159f51fd0297e236d + 10 | d3d9446802a44259755d38e6d163e820 + 12 | c20ad4d76fe97759aa27a0c99bff6710 + 14 | aab3238922bcc25a6f606eb525ffdc56 + 16 | c74d97b01eae257e44aa9d5bade97baf + 18 | 6f4922f45568161a8cdf4ad2299f6d23 + 20 | 98f13708210194c475687be6106a3b84 + 20 | Success +(22 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1; + QUERY PLAN +------------------------------------- + Seq Scan on t1 + Optimizer: Postgres query optimizer +(2 rows) + +-- Check that default deny applies to non-owner/non-superuser when RLS on. +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +SELECT * FROM t1; + a | b +---+--- +(0 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM t1; + a | b +---+--- +(0 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM t1; + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +-- +-- COPY TO/FROM +-- +RESET SESSION AUTHORIZATION; +DROP TABLE copy_t CASCADE; +ERROR: table "copy_t" does not exist +CREATE TABLE copy_t (a integer, b text); +CREATE POLICY p1 ON copy_t USING (a % 2 = 0); +ALTER TABLE copy_t ENABLE ROW LEVEL SECURITY; +GRANT ALL ON copy_t TO regress_rls_bob, regress_rls_exempt_user; +INSERT INTO copy_t (SELECT x, md5(x::text) FROM generate_series(0,10) x); +-- Check COPY TO as Superuser/owner. +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; +0,cfcd208495d565ef66e7dff9f98764da +1,c4ca4238a0b923820dcc509a6f75849b +2,c81e728d9d4c2f636f067f89cc14862c +3,eccbc87e4b5ce2fe28308fd9f2a7baf3 +4,a87ff679a2f3e71d9181a67b7542122c +5,e4da3b7fbbce2345d7772b0674a318d5 +6,1679091c5a880faf6fb5e6087eb1b2dc +7,8f14e45fceea167a5a36dedd4bea2543 +8,c9f0f895fb98ab9159f51fd0297e236d +9,45c48cce2e2d7fbdea1afc51c7c6ad26 +10,d3d9446802a44259755d38e6d163e820 +SET row_security TO ON; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; +0,cfcd208495d565ef66e7dff9f98764da +1,c4ca4238a0b923820dcc509a6f75849b +2,c81e728d9d4c2f636f067f89cc14862c +3,eccbc87e4b5ce2fe28308fd9f2a7baf3 +4,a87ff679a2f3e71d9181a67b7542122c +5,e4da3b7fbbce2345d7772b0674a318d5 +6,1679091c5a880faf6fb5e6087eb1b2dc +7,8f14e45fceea167a5a36dedd4bea2543 +8,c9f0f895fb98ab9159f51fd0297e236d +9,45c48cce2e2d7fbdea1afc51c7c6ad26 +10,d3d9446802a44259755d38e6d163e820 +-- Check COPY TO as user with permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO OFF; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - would be affected by RLS +ERROR: query would be affected by row-level security policy for table "copy_t" +SET row_security TO ON; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok +0,cfcd208495d565ef66e7dff9f98764da +2,c81e728d9d4c2f636f067f89cc14862c +4,a87ff679a2f3e71d9181a67b7542122c +6,1679091c5a880faf6fb5e6087eb1b2dc +8,c9f0f895fb98ab9159f51fd0297e236d +10,d3d9446802a44259755d38e6d163e820 +-- Check COPY TO as user with permissions and BYPASSRLS +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok +0,cfcd208495d565ef66e7dff9f98764da +1,c4ca4238a0b923820dcc509a6f75849b +2,c81e728d9d4c2f636f067f89cc14862c +3,eccbc87e4b5ce2fe28308fd9f2a7baf3 +4,a87ff679a2f3e71d9181a67b7542122c +5,e4da3b7fbbce2345d7772b0674a318d5 +6,1679091c5a880faf6fb5e6087eb1b2dc +7,8f14e45fceea167a5a36dedd4bea2543 +8,c9f0f895fb98ab9159f51fd0297e236d +9,45c48cce2e2d7fbdea1afc51c7c6ad26 +10,d3d9446802a44259755d38e6d163e820 +SET row_security TO ON; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok +0,cfcd208495d565ef66e7dff9f98764da +1,c4ca4238a0b923820dcc509a6f75849b +2,c81e728d9d4c2f636f067f89cc14862c +3,eccbc87e4b5ce2fe28308fd9f2a7baf3 +4,a87ff679a2f3e71d9181a67b7542122c +5,e4da3b7fbbce2345d7772b0674a318d5 +6,1679091c5a880faf6fb5e6087eb1b2dc +7,8f14e45fceea167a5a36dedd4bea2543 +8,c9f0f895fb98ab9159f51fd0297e236d +9,45c48cce2e2d7fbdea1afc51c7c6ad26 +10,d3d9446802a44259755d38e6d163e820 +-- Check COPY TO as user without permissions. SET row_security TO OFF; +SET SESSION AUTHORIZATION regress_rls_carol; +SET row_security TO OFF; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - would be affected by RLS +ERROR: query would be affected by row-level security policy for table "copy_t" +SET row_security TO ON; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - permission denied +ERROR: permission denied for table copy_t +-- Check COPY relation TO; keep it just one row to avoid reordering issues +RESET SESSION AUTHORIZATION; +SET row_security TO ON; +CREATE TABLE copy_rel_to (a integer, b text); +CREATE POLICY p1 ON copy_rel_to USING (a % 2 = 0); +ALTER TABLE copy_rel_to ENABLE ROW LEVEL SECURITY; +GRANT ALL ON copy_rel_to TO regress_rls_bob, regress_rls_exempt_user; +INSERT INTO copy_rel_to VALUES (1, md5('1')); +-- Check COPY TO as Superuser/owner. +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; +1,c4ca4238a0b923820dcc509a6f75849b +SET row_security TO ON; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; +1,c4ca4238a0b923820dcc509a6f75849b +-- Check COPY TO as user with permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO OFF; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - would be affected by RLS +ERROR: query would be affected by row-level security policy for table "copy_rel_to" +SET row_security TO ON; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok +-- Check COPY TO as user with permissions and BYPASSRLS +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok +1,c4ca4238a0b923820dcc509a6f75849b +SET row_security TO ON; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok +1,c4ca4238a0b923820dcc509a6f75849b +-- Check COPY TO as user without permissions. SET row_security TO OFF; +SET SESSION AUTHORIZATION regress_rls_carol; +SET row_security TO OFF; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied +ERROR: permission denied for table copy_rel_to +SET row_security TO ON; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied +ERROR: permission denied for table copy_rel_to +-- Check COPY FROM as Superuser/owner. +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +COPY copy_t FROM STDIN; --ok +SET row_security TO ON; +COPY copy_t FROM STDIN; --ok +-- Check COPY FROM as user with permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO OFF; +COPY copy_t FROM STDIN; --fail - would be affected by RLS. +ERROR: query would be affected by row-level security policy for table "copy_t" +SET row_security TO ON; +COPY copy_t FROM STDIN; --fail - COPY FROM not supported by RLS. +ERROR: COPY FROM not supported with row-level security +HINT: Use INSERT statements instead. +-- Check COPY FROM as user with permissions and BYPASSRLS +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO ON; +COPY copy_t FROM STDIN; --ok +-- Check COPY FROM as user without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SET row_security TO OFF; +COPY copy_t FROM STDIN; --fail - permission denied. +ERROR: permission denied for table copy_t +SET row_security TO ON; +COPY copy_t FROM STDIN; --fail - permission denied. +ERROR: permission denied for table copy_t +RESET SESSION AUTHORIZATION; +DROP TABLE copy_t; +DROP TABLE copy_rel_to CASCADE; +-- Check WHERE CURRENT OF +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE current_check (currentid int, payload text, rlsuser text); +GRANT ALL ON current_check TO PUBLIC; +INSERT INTO current_check VALUES + (1, 'abc', 'regress_rls_bob'), + (2, 'bcd', 'regress_rls_bob'), + (3, 'cde', 'regress_rls_bob'), + (4, 'def', 'regress_rls_bob'); +CREATE POLICY p1 ON current_check FOR SELECT USING (currentid % 2 = 0); +CREATE POLICY p2 ON current_check FOR DELETE USING (currentid = 4 AND rlsuser = current_user); +CREATE POLICY p3 ON current_check FOR UPDATE USING (currentid = 4) WITH CHECK (rlsuser = current_user); +ALTER TABLE current_check ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +-- Can SELECT even rows +SELECT * FROM current_check; + currentid | payload | rlsuser +-----------+---------+----------------- + 2 | bcd | regress_rls_bob + 4 | def | regress_rls_bob +(2 rows) + +-- Cannot UPDATE row 2 +UPDATE current_check SET payload = payload || '_new' WHERE currentid = 2 RETURNING *; + currentid | payload | rlsuser +-----------+---------+--------- +(0 rows) + +BEGIN; +DECLARE current_check_cursor SCROLL CURSOR FOR SELECT * FROM current_check; +-- Returns rows that can be seen according to SELECT policy, like plain SELECT +-- above (even rows) +FETCH ABSOLUTE 1 FROM current_check_cursor; + currentid | payload | rlsuser +-----------+---------+----------------- + 2 | bcd | regress_rls_bob +(1 row) + +-- Still cannot UPDATE row 2 through cursor +UPDATE current_check SET payload = payload || '_new' WHERE CURRENT OF current_check_cursor RETURNING *; + currentid | payload | rlsuser +-----------+---------+--------- +(0 rows) + +-- Can update row 4 through cursor, which is the next visible row +FETCH RELATIVE 1 FROM current_check_cursor; + currentid | payload | rlsuser +-----------+---------+----------------- + 4 | def | regress_rls_bob +(1 row) + +UPDATE current_check SET payload = payload || '_new' WHERE CURRENT OF current_check_cursor RETURNING *; + currentid | payload | rlsuser +-----------+---------+----------------- + 4 | def_new | regress_rls_bob +(1 row) + +SELECT * FROM current_check; + currentid | payload | rlsuser +-----------+---------+----------------- + 2 | bcd | regress_rls_bob + 4 | def_new | regress_rls_bob +(2 rows) + +-- Plan should be a subquery TID scan +EXPLAIN (COSTS OFF) UPDATE current_check SET payload = payload WHERE CURRENT OF current_check_cursor; + QUERY PLAN +------------------------------------------------------------- + Update on current_check + -> Tid Scan on current_check + TID Cond: CURRENT OF current_check_cursor + Filter: ((currentid = 4) AND ((currentid % 2) = 0)) + Optimizer: Postgres query optimizer +(5 rows) + +-- start_ignore +-- GPDB: does not support backwards scans, commit and restart +COMMIT; +BEGIN; +DECLARE current_check_cursor SCROLL CURSOR FOR SELECT * FROM current_check; +-- end_ignore +-- Similarly can only delete row 4 +FETCH ABSOLUTE 1 FROM current_check_cursor; + currentid | payload | rlsuser +-----------+---------+----------------- + 2 | bcd | regress_rls_bob +(1 row) + +DELETE FROM current_check WHERE CURRENT OF current_check_cursor RETURNING *; + currentid | payload | rlsuser +-----------+---------+--------- +(0 rows) + +FETCH RELATIVE 1 FROM current_check_cursor; + currentid | payload | rlsuser +-----------+---------+----------------- + 4 | def_new | regress_rls_bob +(1 row) + +DELETE FROM current_check WHERE CURRENT OF current_check_cursor RETURNING *; + currentid | payload | rlsuser +-----------+---------+----------------- + 4 | def_new | regress_rls_bob +(1 row) + +SELECT * FROM current_check; + currentid | payload | rlsuser +-----------+---------+----------------- + 2 | bcd | regress_rls_bob +(1 row) + +COMMIT; +-- +-- check pg_stats view filtering +-- +SET row_security TO ON; +SET SESSION AUTHORIZATION regress_rls_alice; +ANALYZE current_check; +-- Stats visible +SELECT row_security_active('current_check'); + row_security_active +--------------------- + f +(1 row) + +SELECT attname, most_common_vals FROM pg_stats + WHERE tablename = 'current_check' + ORDER BY 1; + attname | most_common_vals +-----------+------------------- + currentid | + payload | + rlsuser | {regress_rls_bob} +(3 rows) + +SET SESSION AUTHORIZATION regress_rls_bob; +-- Stats not visible +SELECT row_security_active('current_check'); + row_security_active +--------------------- + t +(1 row) + +SELECT attname, most_common_vals FROM pg_stats + WHERE tablename = 'current_check' + ORDER BY 1; + attname | most_common_vals +---------+------------------ +(0 rows) + +-- +-- Collation support +-- +BEGIN; +CREATE TABLE coll_t (c) AS VALUES ('bar'::text); +CREATE POLICY coll_p ON coll_t USING (c < ('foo'::text COLLATE "C")); +ALTER TABLE coll_t ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON coll_t TO regress_rls_alice; +SELECT (string_to_array(polqual, ':'))[7] AS inputcollid FROM pg_policy WHERE polrelid = 'coll_t'::regclass; + inputcollid +------------------ + inputcollid 950 +(1 row) + +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM coll_t; + c +----- + bar +(1 row) + +ROLLBACK; +-- +-- Shared Object Dependencies +-- +RESET SESSION AUTHORIZATION; +BEGIN; +CREATE ROLE regress_rls_eve; +CREATE ROLE regress_rls_frank; +CREATE TABLE tbl1 (c) AS VALUES ('bar'::text); +GRANT SELECT ON TABLE tbl1 TO regress_rls_eve; +CREATE POLICY P ON tbl1 TO regress_rls_eve, regress_rls_frank USING (true); +SELECT refclassid::regclass, deptype + FROM pg_depend + WHERE classid = 'pg_policy'::regclass + AND refobjid = 'tbl1'::regclass; + refclassid | deptype +------------+--------- + pg_class | a +(1 row) + +SELECT refclassid::regclass, deptype + FROM pg_shdepend + WHERE classid = 'pg_policy'::regclass + AND refobjid IN ('regress_rls_eve'::regrole, 'regress_rls_frank'::regrole); + refclassid | deptype +------------+--------- + pg_authid | r + pg_authid | r +(2 rows) + +SAVEPOINT q; +DROP ROLE regress_rls_eve; --fails due to dependency on POLICY p +ERROR: role "regress_rls_eve" cannot be dropped because some objects depend on it +DETAIL: privileges for table tbl1 +target of policy p on table tbl1 +ROLLBACK TO q; +ALTER POLICY p ON tbl1 TO regress_rls_frank USING (true); +SAVEPOINT q; +DROP ROLE regress_rls_eve; --fails due to dependency on GRANT SELECT +ERROR: role "regress_rls_eve" cannot be dropped because some objects depend on it +DETAIL: privileges for table tbl1 +ROLLBACK TO q; +REVOKE ALL ON TABLE tbl1 FROM regress_rls_eve; +SAVEPOINT q; +DROP ROLE regress_rls_eve; --succeeds +ROLLBACK TO q; +SAVEPOINT q; +DROP ROLE regress_rls_frank; --fails due to dependency on POLICY p +ERROR: role "regress_rls_frank" cannot be dropped because some objects depend on it +DETAIL: target of policy p on table tbl1 +ROLLBACK TO q; +DROP POLICY p ON tbl1; +SAVEPOINT q; +DROP ROLE regress_rls_frank; -- succeeds +ROLLBACK TO q; +ROLLBACK; -- cleanup +-- +-- Converting table to view +-- +BEGIN; +CREATE TABLE t (c int); +CREATE POLICY p ON t USING (c % 2 = 1); +ALTER TABLE t ENABLE ROW LEVEL SECURITY; +SAVEPOINT q; +CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD + SELECT * FROM generate_series(1,5) t0(c); -- fails due to row-level security enabled +ERROR: could not convert table "t" to a view because it has row security enabled +ROLLBACK TO q; +ALTER TABLE t DISABLE ROW LEVEL SECURITY; +SAVEPOINT q; +CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD + SELECT * FROM generate_series(1,5) t0(c); -- fails due to policy p on t +ERROR: could not convert table "t" to a view because it has row security policies +ROLLBACK TO q; +DROP POLICY p ON t; +CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD + SELECT * FROM generate_series(1,5) t0(c); -- succeeds +ROLLBACK; +-- +-- Policy expression handling +-- +BEGIN; +CREATE TABLE t (c) AS VALUES ('bar'::text); +CREATE POLICY p ON t USING (max(c)); -- fails: aggregate functions are not allowed in policy expressions +ERROR: aggregate functions are not allowed in policy expressions +ROLLBACK; +-- +-- Non-target relations are only subject to SELECT policies +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE r1 (a int); +CREATE TABLE r2 (a int); +INSERT INTO r1 VALUES (10), (20); +INSERT INTO r2 VALUES (10), (20); +GRANT ALL ON r1, r2 TO regress_rls_bob; +CREATE POLICY p1 ON r1 USING (true); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +CREATE POLICY p1 ON r2 FOR SELECT USING (true); +CREATE POLICY p2 ON r2 FOR INSERT WITH CHECK (false); +CREATE POLICY p3 ON r2 FOR UPDATE USING (false); +CREATE POLICY p4 ON r2 FOR DELETE USING (false); +ALTER TABLE r2 ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM r1; + a +---- + 10 + 20 +(2 rows) + +SELECT * FROM r2; + a +---- + 10 + 20 +(2 rows) + +-- r2 is read-only +INSERT INTO r2 VALUES (2); -- Not allowed +ERROR: new row violates row-level security policy for table "r2" +UPDATE r2 SET a = 2 RETURNING *; -- Updates nothing + a +--- +(0 rows) + +DELETE FROM r2 RETURNING *; -- Deletes nothing + a +--- +(0 rows) + +-- r2 can be used as a non-target relation in DML +INSERT INTO r1 SELECT a + 1 FROM r2 RETURNING *; -- OK + a +---- + 11 + 21 +(2 rows) + +UPDATE r1 SET a = r2.a + 2 FROM r2 WHERE r1.a = r2.a RETURNING *; -- OK + a | a +----+---- + 12 | 10 + 22 | 20 +(2 rows) + +DELETE FROM r1 USING r2 WHERE r1.a = r2.a + 2 RETURNING *; -- OK + a | a +----+---- + 12 | 10 + 22 | 20 +(2 rows) + +SELECT * FROM r1; + a +---- + 11 + 21 +(2 rows) + +SELECT * FROM r2; + a +---- + 10 + 20 +(2 rows) + +SET SESSION AUTHORIZATION regress_rls_alice; +DROP TABLE r1; +DROP TABLE r2; +-- +-- FORCE ROW LEVEL SECURITY applies RLS to owners too +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security = on; +CREATE TABLE r1 (a int); +INSERT INTO r1 VALUES (10), (20); +CREATE POLICY p1 ON r1 USING (false); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; +-- No error, but no rows +TABLE r1; + a +--- +(0 rows) + +-- RLS error +INSERT INTO r1 VALUES (1); +ERROR: new row violates row-level security policy for table "r1" +-- No error (unable to see any rows to update) +UPDATE r1 SET a = 1; +TABLE r1; + a +--- +(0 rows) + +-- No error (unable to see any rows to delete) +DELETE FROM r1; +TABLE r1; + a +--- +(0 rows) + +SET row_security = off; +-- these all fail, would be affected by RLS +TABLE r1; +ERROR: query would be affected by row-level security policy for table "r1" +HINT: To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY. +UPDATE r1 SET a = 1; +ERROR: query would be affected by row-level security policy for table "r1" +HINT: To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY. +DELETE FROM r1; +ERROR: query would be affected by row-level security policy for table "r1" +HINT: To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY. +DROP TABLE r1; +-- +-- FORCE ROW LEVEL SECURITY does not break RI +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security = on; +CREATE TABLE r1 (a int PRIMARY KEY); +CREATE TABLE r2 (a int REFERENCES r1); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO r1 VALUES (10), (20); +INSERT INTO r2 VALUES (10), (20); +-- Create policies on r2 which prevent the +-- owner from seeing any rows, but RI should +-- still see them. +CREATE POLICY p1 ON r2 USING (false); +ALTER TABLE r2 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r2 FORCE ROW LEVEL SECURITY; +-- Errors due to rows in r2 +-- GPDB: Foreign key constraints are not enforced in GPDB, so no error. +DELETE FROM r1; +-- Reset r2 to no-RLS +DROP POLICY p1 ON r2; +ALTER TABLE r2 NO FORCE ROW LEVEL SECURITY; +ALTER TABLE r2 DISABLE ROW LEVEL SECURITY; +-- clean out r2 for INSERT test below +DELETE FROM r2; +-- Change r1 to not allow rows to be seen +CREATE POLICY p1 ON r1 USING (false); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; +-- No rows seen +TABLE r1; + a +--- +(0 rows) + +-- No error, RI still sees that row exists in r1 +INSERT INTO r2 VALUES (10); +DROP TABLE r2; +DROP TABLE r1; +-- Ensure cascaded DELETE works +CREATE TABLE r1 (a int PRIMARY KEY); +CREATE TABLE r2 (a int REFERENCES r1 ON DELETE CASCADE); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO r1 VALUES (10), (20); +INSERT INTO r2 VALUES (10), (20); +-- Create policies on r2 which prevent the +-- owner from seeing any rows, but RI should +-- still see them. +CREATE POLICY p1 ON r2 USING (false); +ALTER TABLE r2 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r2 FORCE ROW LEVEL SECURITY; +-- Deletes all records from both +DELETE FROM r1; +-- Remove FORCE from r2 +ALTER TABLE r2 NO FORCE ROW LEVEL SECURITY; +-- As owner, we now bypass RLS +-- verify no rows in r2 now +-- GPDB: Foreign key constraints are not enforced in GPDB, hence the rows are still there. +TABLE r2; + a +---- + 10 + 20 +(2 rows) + +DROP TABLE r2; +DROP TABLE r1; +-- Ensure cascaded UPDATE works +CREATE TABLE r1 (a int PRIMARY KEY); +CREATE TABLE r2 (a int REFERENCES r1 ON UPDATE CASCADE); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO r1 VALUES (10), (20); +INSERT INTO r2 VALUES (10), (20); +-- Create policies on r2 which prevent the +-- owner from seeing any rows, but RI should +-- still see them. +CREATE POLICY p1 ON r2 USING (false); +ALTER TABLE r2 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r2 FORCE ROW LEVEL SECURITY; +-- Updates records in both +-- not supported in GPDB +UPDATE r1 SET a = a+5; +-- Remove FORCE from r2 +ALTER TABLE r2 NO FORCE ROW LEVEL SECURITY; +-- As owner, we now bypass RLS +-- verify records in r2 updated +TABLE r2; + a +---- + 10 + 20 +(2 rows) + +DROP TABLE r2; +DROP TABLE r1; +-- +-- Test INSERT+RETURNING applies SELECT policies as +-- WithCheckOptions (meaning an error is thrown) +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security = on; +CREATE TABLE r1 (a int); +CREATE POLICY p1 ON r1 FOR SELECT USING (false); +CREATE POLICY p2 ON r1 FOR INSERT WITH CHECK (true); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; +-- Works fine +INSERT INTO r1 VALUES (10), (20); +-- No error, but no rows +TABLE r1; + a +--- +(0 rows) + +SET row_security = off; +-- fail, would be affected by RLS +TABLE r1; +ERROR: query would be affected by row-level security policy for table "r1" +HINT: To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY. +SET row_security = on; +-- Error +INSERT INTO r1 VALUES (10), (20) RETURNING *; +ERROR: new row violates row-level security policy for table "r1" +DROP TABLE r1; +-- +-- Test UPDATE+RETURNING applies SELECT policies as +-- WithCheckOptions (meaning an error is thrown) +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security = on; +CREATE TABLE r1 (a int PRIMARY KEY); +CREATE POLICY p1 ON r1 FOR SELECT USING (a < 20); +CREATE POLICY p2 ON r1 FOR UPDATE USING (a < 20) WITH CHECK (true); +CREATE POLICY p3 ON r1 FOR INSERT WITH CHECK (true); +INSERT INTO r1 VALUES (10); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; +-- Works fine +UPDATE r1 SET a = 30; +-- Show updated rows +ALTER TABLE r1 NO FORCE ROW LEVEL SECURITY; +TABLE r1; + a +---- + 30 +(1 row) + +-- reset value in r1 for test with RETURNING +UPDATE r1 SET a = 10; +-- Verify row reset +TABLE r1; + a +---- + 10 +(1 row) + +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; +-- Error +UPDATE r1 SET a = 30 RETURNING *; +ERROR: new row violates row-level security policy for table "r1" +-- UPDATE path of INSERT ... ON CONFLICT DO UPDATE should also error out +INSERT INTO r1 VALUES (10) + ON CONFLICT (a) DO UPDATE SET a = 30 RETURNING *; +ERROR: new row violates row-level security policy for table "r1" +-- Should still error out without RETURNING (use of arbiter always requires +-- SELECT permissions) +INSERT INTO r1 VALUES (10) + ON CONFLICT (a) DO UPDATE SET a = 30; +ERROR: new row violates row-level security policy for table "r1" +INSERT INTO r1 VALUES (10) + ON CONFLICT ON CONSTRAINT r1_pkey DO UPDATE SET a = 30; +ERROR: new row violates row-level security policy for table "r1" +DROP TABLE r1; +-- Check dependency handling +RESET SESSION AUTHORIZATION; +CREATE TABLE dep1 (c1 int); +CREATE TABLE dep2 (c1 int); +CREATE POLICY dep_p1 ON dep1 TO regress_rls_bob USING (c1 > (select max(dep2.c1) from dep2)); +ALTER POLICY dep_p1 ON dep1 TO regress_rls_bob,regress_rls_carol; +-- Should return one +SELECT count(*) = 1 FROM pg_depend + WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1') + AND refobjid = (SELECT oid FROM pg_class WHERE relname = 'dep2'); + ?column? +---------- + t +(1 row) + +ALTER POLICY dep_p1 ON dep1 USING (true); +-- Should return one +SELECT count(*) = 1 FROM pg_shdepend + WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1') + AND refobjid = (SELECT oid FROM pg_authid WHERE rolname = 'regress_rls_bob'); + ?column? +---------- + t +(1 row) + +-- Should return one +SELECT count(*) = 1 FROM pg_shdepend + WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1') + AND refobjid = (SELECT oid FROM pg_authid WHERE rolname = 'regress_rls_carol'); + ?column? +---------- + t +(1 row) + +-- Should return zero +SELECT count(*) = 0 FROM pg_depend + WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1') + AND refobjid = (SELECT oid FROM pg_class WHERE relname = 'dep2'); + ?column? +---------- + t +(1 row) + +-- DROP OWNED BY testing +RESET SESSION AUTHORIZATION; +CREATE ROLE regress_rls_dob_role1; +CREATE ROLE regress_rls_dob_role2; +CREATE TABLE dob_t1 (c1 int); +CREATE TABLE dob_t2 (c1 int) PARTITION BY RANGE (c1); +CREATE POLICY p1 ON dob_t1 TO regress_rls_dob_role1 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t1; -- should fail, already gone +ERROR: policy "p1" for table "dob_t1" does not exist +CREATE POLICY p1 ON dob_t1 TO regress_rls_dob_role1,regress_rls_dob_role2 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t1; -- should succeed +-- same cases with duplicate polroles entries +CREATE POLICY p1 ON dob_t1 TO regress_rls_dob_role1,regress_rls_dob_role1 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t1; -- should fail, already gone +ERROR: policy "p1" for table "dob_t1" does not exist +CREATE POLICY p1 ON dob_t1 TO regress_rls_dob_role1,regress_rls_dob_role1,regress_rls_dob_role2 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t1; -- should succeed +-- partitioned target +CREATE POLICY p1 ON dob_t2 TO regress_rls_dob_role1,regress_rls_dob_role2 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t2; -- should succeed +DROP USER regress_rls_dob_role1; +DROP USER regress_rls_dob_role2; +-- Bug #15708: view + table with RLS should check policies as view owner +CREATE TABLE ref_tbl (a int); +INSERT INTO ref_tbl VALUES (1); +CREATE TABLE rls_tbl (a int); +INSERT INTO rls_tbl VALUES (10); +ALTER TABLE rls_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY p1 ON rls_tbl USING (EXISTS (SELECT 1 FROM ref_tbl)); +GRANT SELECT ON ref_tbl TO regress_rls_bob; +GRANT SELECT ON rls_tbl TO regress_rls_bob; +CREATE VIEW rls_view AS SELECT * FROM rls_tbl; +ALTER VIEW rls_view OWNER TO regress_rls_bob; +GRANT SELECT ON rls_view TO regress_rls_alice; +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM ref_tbl; -- Permission denied +ERROR: permission denied for table ref_tbl +SELECT * FROM rls_tbl; -- Permission denied +ERROR: permission denied for table rls_tbl +SELECT * FROM rls_view; -- OK + a +---- + 10 +(1 row) + +RESET SESSION AUTHORIZATION; +DROP VIEW rls_view; +DROP TABLE rls_tbl; +DROP TABLE ref_tbl; +-- Leaky operator test +CREATE TABLE rls_tbl (a int); +INSERT INTO rls_tbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_tbl; +ALTER TABLE rls_tbl ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_tbl TO regress_rls_alice; +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE FUNCTION op_leak(int, int) RETURNS bool + AS 'BEGIN RAISE NOTICE ''op_leak => %, %'', $1, $2; RETURN $1 < $2; END' + LANGUAGE plpgsql; +CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, + restrict = scalarltsel); +SELECT * FROM rls_tbl WHERE a <<< 1000; + a +--- +(0 rows) + +DROP OPERATOR <<< (int, int); +DROP FUNCTION op_leak(int, int); +RESET SESSION AUTHORIZATION; +DROP TABLE rls_tbl; +-- Bug #16006: whole-row Vars in a policy don't play nice with sub-selects +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE rls_tbl (a int, b int, c int); +CREATE POLICY p1 ON rls_tbl USING (rls_tbl >= ROW(1,1,1)); +ALTER TABLE rls_tbl ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_tbl FORCE ROW LEVEL SECURITY; +INSERT INTO rls_tbl SELECT 10, 20, 30; +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO rls_tbl + SELECT * FROM (SELECT b, c FROM rls_tbl ORDER BY a) ss; + QUERY PLAN +-------------------------------------------------------------------- + Insert on regress_rls_schema.rls_tbl + -> Subquery Scan on ss + Output: ss.b, ss.c, NULL::integer + -> Sort + Output: rls_tbl_1.b, rls_tbl_1.c, rls_tbl_1.a + Sort Key: rls_tbl_1.a + -> Seq Scan on regress_rls_schema.rls_tbl rls_tbl_1 + Output: rls_tbl_1.b, rls_tbl_1.c, rls_tbl_1.a + Filter: (rls_tbl_1.* >= ROW(1, 1, 1)) + Settings: gp_enable_relsize_collection = 'on' + Optimizer: Postgres query optimizer +(11 rows) + +INSERT INTO rls_tbl + SELECT * FROM (SELECT b, c FROM rls_tbl ORDER BY a) ss; +SELECT * FROM rls_tbl; + a | b | c +----+----+---- + 10 | 20 | 30 + 20 | 30 | +(2 rows) + +DROP TABLE rls_tbl; +RESET SESSION AUTHORIZATION; +-- +-- Clean up objects +-- +RESET SESSION AUTHORIZATION; +DROP SCHEMA regress_rls_schema CASCADE; +NOTICE: drop cascades to 29 other objects +DETAIL: drop cascades to function f_leak(text) +drop cascades to table uaccount +drop cascades to table category +drop cascades to table document +drop cascades to table part_document +drop cascades to table dependent +drop cascades to table rec1 +drop cascades to table rec2 +drop cascades to view rec1v +drop cascades to view rec2v +drop cascades to table s1 +drop cascades to table s2 +drop cascades to view v2 +drop cascades to table b1 +drop cascades to view bv1 +drop cascades to table z1 +drop cascades to table z2 +drop cascades to table x1 +drop cascades to table y1 +drop cascades to table y2 +drop cascades to table t1 +drop cascades to table t2 +drop cascades to table t3 +drop cascades to table t4 +drop cascades to table current_check +drop cascades to table dep1 +drop cascades to table dep2 +drop cascades to table dob_t1 +drop cascades to table dob_t2 +DROP USER regress_rls_alice; +DROP USER regress_rls_bob; +DROP USER regress_rls_carol; +DROP USER regress_rls_dave; +DROP USER regress_rls_exempt_user; +DROP ROLE regress_rls_group1; +DROP ROLE regress_rls_group2; +-- Arrange to have a few policies left over, for testing +-- pg_dump/pg_restore +CREATE SCHEMA regress_rls_schema; +CREATE TABLE rls_tbl (c1 int); +ALTER TABLE rls_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY p1 ON rls_tbl USING (c1 > 5); +CREATE POLICY p2 ON rls_tbl FOR SELECT USING (c1 <= 3); +CREATE POLICY p3 ON rls_tbl FOR UPDATE USING (c1 <= 3) WITH CHECK (c1 > 5); +CREATE POLICY p4 ON rls_tbl FOR DELETE USING (c1 <= 3); +CREATE TABLE rls_tbl_force (c1 int); +ALTER TABLE rls_tbl_force ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_tbl_force FORCE ROW LEVEL SECURITY; +CREATE POLICY p1 ON rls_tbl_force USING (c1 = 5) WITH CHECK (c1 < 5); +CREATE POLICY p2 ON rls_tbl_force FOR SELECT USING (c1 = 8); +CREATE POLICY p3 ON rls_tbl_force FOR UPDATE USING (c1 = 8) WITH CHECK (c1 >= 5); +CREATE POLICY p4 ON rls_tbl_force FOR DELETE USING (c1 = 8); diff --git a/src/test/singlenode_regress/expected/rowtypes.out b/src/test/singlenode_regress/expected/rowtypes.out new file mode 100644 index 00000000000..3a7e312f70a --- /dev/null +++ b/src/test/singlenode_regress/expected/rowtypes.out @@ -0,0 +1,1265 @@ +-- +-- ROWTYPES +-- +-- start_ignore +-- GPDB: With the default settings, the planner chooses different plans some +-- of the queries than in upstream. That is beause low vis fraction +-- estimation (pg_class.relallvisible) on GP causes higher index only scan +-- cost so bitmap index scan outperforms index only scan. +-- +-- Some tests do 'enable_sort=off' or 'enable_bitmapscan=off' to get the same +-- plans as in upstream. +-- end_ignore +-- Make both a standalone composite type and a table rowtype +create type complex_t as (r float8, i float8); +create temp table fullname (first text, last text); +-- Nested composite +create type quad as (c1 complex_t, c2 complex_t); +-- Some simple tests of I/O conversions and row construction +select (1.1,2.2)::complex_t, row((3.3,4.4),(5.5,null))::quad; + row | row +-----------+------------------------ + (1.1,2.2) | ("(3.3,4.4)","(5.5,)") +(1 row) + +select row('Joe', 'Blow')::fullname, '(Joe,Blow)'::fullname; + row | fullname +------------+------------ + (Joe,Blow) | (Joe,Blow) +(1 row) + +select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname; + fullname | fullname +------------------+-------------- + (Joe,"von Blow") | (Joe,d'Blow) +(1 row) + +select '(Joe,"von""Blow")'::fullname, E'(Joe,d\\\\Blow)'::fullname; + fullname | fullname +-------------------+----------------- + (Joe,"von""Blow") | (Joe,"d\\Blow") +(1 row) + +select '(Joe,"Blow,Jr")'::fullname; + fullname +----------------- + (Joe,"Blow,Jr") +(1 row) + +select '(Joe,)'::fullname; -- ok, null 2nd column + fullname +---------- + (Joe,) +(1 row) + +select '(Joe)'::fullname; -- bad +ERROR: malformed record literal: "(Joe)" +LINE 1: select '(Joe)'::fullname; + ^ +DETAIL: Too few columns. +select '(Joe,,)'::fullname; -- bad +ERROR: malformed record literal: "(Joe,,)" +LINE 1: select '(Joe,,)'::fullname; + ^ +DETAIL: Too many columns. +select '[]'::fullname; -- bad +ERROR: malformed record literal: "[]" +LINE 1: select '[]'::fullname; + ^ +DETAIL: Missing left parenthesis. +select ' (Joe,Blow) '::fullname; -- ok, extra whitespace + fullname +------------ + (Joe,Blow) +(1 row) + +select '(Joe,Blow) /'::fullname; -- bad +ERROR: malformed record literal: "(Joe,Blow) /" +LINE 1: select '(Joe,Blow) /'::fullname; + ^ +DETAIL: Junk after right parenthesis. +create temp table quadtable(f1 int, q quad); +insert into quadtable values (1, ((3.3,4.4),(5.5,6.6))); +insert into quadtable values (2, ((null,4.4),(5.5,6.6))); +select * from quadtable; + f1 | q +----+--------------------------- + 1 | ("(3.3,4.4)","(5.5,6.6)") + 2 | ("(,4.4)","(5.5,6.6)") +(2 rows) + +select f1, q.c1 from quadtable; -- fails, q is a table reference +ERROR: missing FROM-clause entry for table "q" +LINE 1: select f1, q.c1 from quadtable; + ^ +select f1, (q).c1, (qq.q).c1.i from quadtable qq; + f1 | c1 | i +----+-----------+----- + 1 | (3.3,4.4) | 4.4 + 2 | (,4.4) | 4.4 +(2 rows) + +create temp table people (fn fullname, bd date); +insert into people values ('(Joe,Blow)', '1984-01-10'); +select * from people; + fn | bd +------------+------------ + (Joe,Blow) | 01-10-1984 +(1 row) + +-- at the moment this will not work due to ALTER TABLE inadequacy: +alter table fullname add column suffix text default ''; +ERROR: cannot alter table "fullname" because column "people.fn" uses its row type +-- but this should work: +alter table fullname add column suffix text default null; +select * from people; + fn | bd +-------------+------------ + (Joe,Blow,) | 01-10-1984 +(1 row) + +-- test insertion/updating of subfields +update people set fn.suffix = 'Jr'; +select * from people; + fn | bd +---------------+------------ + (Joe,Blow,Jr) | 01-10-1984 +(1 row) + +insert into quadtable (f1, q.c1.r, q.c2.i) values(44,55,66); +update quadtable set q.c1.r = 12 where f1 = 2; +update quadtable set q.c1 = 12; -- error, type mismatch +ERROR: subfield "c1" is of type complex_t but expression is of type integer +LINE 1: update quadtable set q.c1 = 12; + ^ +HINT: You will need to rewrite or cast the expression. +select * from quadtable; + f1 | q +----+--------------------------- + 1 | ("(3.3,4.4)","(5.5,6.6)") + 44 | ("(55,)","(,66)") + 2 | ("(12,4.4)","(5.5,6.6)") +(3 rows) + +-- The object here is to ensure that toasted references inside +-- composite values don't cause problems. The large f1 value will +-- be toasted inside pp, it must still work after being copied to people. +create temp table pp (f1 text); +insert into pp values (repeat('abcdefghijkl', 100000)); +insert into people select ('Jim', f1, null)::fullname, current_date from pp; +select (fn).first, substr((fn).last, 1, 20), length((fn).last) from people; + first | substr | length +-------+----------------------+--------- + Joe | Blow | 4 + Jim | abcdefghijklabcdefgh | 1200000 +(2 rows) + +-- Test row comparison semantics. Prior to PG 8.2 we did this in a totally +-- non-spec-compliant way. +select ROW(1,2) < ROW(1,3) as true; + true +------ + t +(1 row) + +select ROW(1,2) < ROW(1,1) as false; + false +------- + f +(1 row) + +select ROW(1,2) < ROW(1,NULL) as null; + null +------ + +(1 row) + +select ROW(1,2,3) < ROW(1,3,NULL) as true; -- the NULL is not examined + true +------ + t +(1 row) + +select ROW(11,'ABC') < ROW(11,'DEF') as true; + true +------ + t +(1 row) + +select ROW(11,'ABC') > ROW(11,'DEF') as false; + false +------- + f +(1 row) + +select ROW(12,'ABC') > ROW(11,'DEF') as true; + true +------ + t +(1 row) + +-- = and <> have different NULL-behavior than < etc +select ROW(1,2,3) < ROW(1,NULL,4) as null; + null +------ + +(1 row) + +select ROW(1,2,3) = ROW(1,NULL,4) as false; + false +------- + f +(1 row) + +select ROW(1,2,3) <> ROW(1,NULL,4) as true; + true +------ + t +(1 row) + +-- We allow operators beyond the six standard ones, if they have btree +-- operator classes. +select ROW('ABC','DEF') ~<=~ ROW('DEF','ABC') as true; + true +------ + t +(1 row) + +select ROW('ABC','DEF') ~>=~ ROW('DEF','ABC') as false; + false +------- + f +(1 row) + +select ROW('ABC','DEF') ~~ ROW('DEF','ABC') as fail; +ERROR: could not determine interpretation of row comparison operator ~~ +LINE 1: select ROW('ABC','DEF') ~~ ROW('DEF','ABC') as fail; + ^ +HINT: Row comparison operators must be associated with btree operator families. +-- Comparisons of ROW() expressions can cope with some type mismatches +select ROW(1,2) = ROW(1,2::int8); + ?column? +---------- + t +(1 row) + +select ROW(1,2) in (ROW(3,4), ROW(1,2)); + ?column? +---------- + t +(1 row) + +select ROW(1,2) in (ROW(3,4), ROW(1,2::int8)); + ?column? +---------- + t +(1 row) + +-- Check row comparison with a subselect +select unique1, unique2 from tenk1 +where (unique1, unique2) < any (select ten, ten from tenk1 where hundred < 3) + and unique1 <= 20 +order by 1; + unique1 | unique2 +---------+--------- + 0 | 9998 + 1 | 2838 +(2 rows) + +-- Also check row comparison with an indexable condition +set enable_sort=off; +explain (costs off) +select thousand, tenthous from tenk1 +where (thousand, tenthous) >= (997, 5000) +order by thousand, tenthous; + QUERY PLAN +----------------------------------------------------------- + Index Only Scan using tenk1_thous_tenthous on tenk1 + Index Cond: (ROW(thousand, tenthous) >= ROW(997, 5000)) + Optimizer: Postgres query optimizer +(3 rows) + +select thousand, tenthous from tenk1 +where (thousand, tenthous) >= (997, 5000) +order by thousand, tenthous; + thousand | tenthous +----------+---------- + 997 | 5997 + 997 | 6997 + 997 | 7997 + 997 | 8997 + 997 | 9997 + 998 | 998 + 998 | 1998 + 998 | 2998 + 998 | 3998 + 998 | 4998 + 998 | 5998 + 998 | 6998 + 998 | 7998 + 998 | 8998 + 998 | 9998 + 999 | 999 + 999 | 1999 + 999 | 2999 + 999 | 3999 + 999 | 4999 + 999 | 5999 + 999 | 6999 + 999 | 7999 + 999 | 8999 + 999 | 9999 +(25 rows) + +reset enable_sort; +explain (costs off) +select thousand, tenthous, four from tenk1 +where (thousand, tenthous, four) > (998, 5000, 3) +order by thousand, tenthous; + QUERY PLAN +----------------------------------------------------------------------- + Sort + Sort Key: thousand, tenthous + -> Bitmap Heap Scan on tenk1 + Filter: (ROW(thousand, tenthous, four) > ROW(998, 5000, 3)) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (ROW(thousand, tenthous) >= ROW(998, 5000)) + Optimizer: Postgres query optimizer +(7 rows) + +select thousand, tenthous, four from tenk1 +where (thousand, tenthous, four) > (998, 5000, 3) +order by thousand, tenthous; + thousand | tenthous | four +----------+----------+------ + 998 | 5998 | 2 + 998 | 6998 | 2 + 998 | 7998 | 2 + 998 | 8998 | 2 + 998 | 9998 | 2 + 999 | 999 | 3 + 999 | 1999 | 3 + 999 | 2999 | 3 + 999 | 3999 | 3 + 999 | 4999 | 3 + 999 | 5999 | 3 + 999 | 6999 | 3 + 999 | 7999 | 3 + 999 | 8999 | 3 + 999 | 9999 | 3 +(15 rows) + +set enable_sort=off; +explain (costs off) +select thousand, tenthous from tenk1 +where (998, 5000) < (thousand, tenthous) +order by thousand, tenthous; + QUERY PLAN +---------------------------------------------------------- + Index Only Scan using tenk1_thous_tenthous on tenk1 + Index Cond: (ROW(thousand, tenthous) > ROW(998, 5000)) + Optimizer: Postgres query optimizer +(3 rows) + +select thousand, tenthous from tenk1 +where (998, 5000) < (thousand, tenthous) +order by thousand, tenthous; + thousand | tenthous +----------+---------- + 998 | 5998 + 998 | 6998 + 998 | 7998 + 998 | 8998 + 998 | 9998 + 999 | 999 + 999 | 1999 + 999 | 2999 + 999 | 3999 + 999 | 4999 + 999 | 5999 + 999 | 6999 + 999 | 7999 + 999 | 8999 + 999 | 9999 +(15 rows) + +reset enable_sort; +explain (costs off) +select thousand, hundred from tenk1 +where (998, 5000) < (thousand, hundred) +order by thousand, hundred; + QUERY PLAN +----------------------------------------------------------- + Sort + Sort Key: thousand, hundred + -> Bitmap Heap Scan on tenk1 + Filter: (ROW(998, 5000) < ROW(thousand, hundred)) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (thousand >= 998) + Optimizer: Postgres query optimizer +(7 rows) + +select thousand, hundred from tenk1 +where (998, 5000) < (thousand, hundred) +order by thousand, hundred; + thousand | hundred +----------+--------- + 999 | 99 + 999 | 99 + 999 | 99 + 999 | 99 + 999 | 99 + 999 | 99 + 999 | 99 + 999 | 99 + 999 | 99 + 999 | 99 +(10 rows) + +-- Test case for bug #14010: indexed row comparisons fail with nulls +create temp table test_table (a text, b text); +insert into test_table values ('a', 'b'); +insert into test_table select 'a', null from generate_series(1,1000); +insert into test_table values ('b', 'a'); +create index on test_table (a,b); +set enable_sort = off; +explain (costs off) +select a,b from test_table where (a,b) > ('a','a') order by a,b; + QUERY PLAN +-------------------------------------------------------- + Index Only Scan using test_table_a_b_idx on test_table + Index Cond: (ROW(a, b) > ROW('a'::text, 'a'::text)) + Optimizer: Postgres query optimizer +(3 rows) + +select a,b from test_table where (a,b) > ('a','a') order by a,b; + a | b +---+--- + a | b + b | a +(2 rows) + +reset enable_sort; +-- Check row comparisons with IN +select * from int8_tbl i8 where i8 in (row(123,456)); -- fail, type mismatch +ERROR: cannot compare dissimilar column types bigint and integer at record column 1 +explain (costs off) +select * from int8_tbl i8 +where i8 in (row(123,456)::int8_tbl, '(4567890123456789,123)'); + QUERY PLAN +------------------------------------------------------------------------------- + Seq Scan on int8_tbl i8 + Filter: (i8.* = ANY ('{"(123,456)","(4567890123456789,123)"}'::int8_tbl[])) + Optimizer: Postgres query optimizer +(3 rows) + +select * from int8_tbl i8 +where i8 in (row(123,456)::int8_tbl, '(4567890123456789,123)'); + q1 | q2 +------------------+----- + 123 | 456 + 4567890123456789 | 123 +(2 rows) + +-- Check ability to select columns from an anonymous rowtype +select (row(1, 2.0)).f1; + f1 +---- + 1 +(1 row) + +select (row(1, 2.0)).f2; + f2 +----- + 2.0 +(1 row) + +select (row(1, 2.0)).nosuch; -- fail +ERROR: could not identify column "nosuch" in record data type +LINE 1: select (row(1, 2.0)).nosuch; + ^ +select (row(1, 2.0)).*; + f1 | f2 +----+----- + 1 | 2.0 +(1 row) + +select (r).f1 from (select row(1, 2.0) as r) ss; + f1 +---- + 1 +(1 row) + +select (r).f3 from (select row(1, 2.0) as r) ss; -- fail +ERROR: could not identify column "f3" in record data type +LINE 1: select (r).f3 from (select row(1, 2.0) as r) ss; + ^ +select (r).* from (select row(1, 2.0) as r) ss; + f1 | f2 +----+----- + 1 | 2.0 +(1 row) + +-- Check some corner cases involving empty rowtypes +select ROW(); + row +----- + () +(1 row) + +select ROW() IS NULL; + ?column? +---------- + t +(1 row) + +select ROW() = ROW(); +ERROR: cannot compare rows of zero length +LINE 1: select ROW() = ROW(); + ^ +-- Check ability to create arrays of anonymous rowtypes +select array[ row(1,2), row(3,4), row(5,6) ]; + array +--------------------------- + {"(1,2)","(3,4)","(5,6)"} +(1 row) + +-- Check ability to compare an anonymous row to elements of an array +select row(1,1.1) = any (array[ row(7,7.7), row(1,1.1), row(0,0.0) ]); + ?column? +---------- + t +(1 row) + +select row(1,1.1) = any (array[ row(7,7.7), row(1,1.0), row(0,0.0) ]); + ?column? +---------- + f +(1 row) + +-- Check behavior with a non-comparable rowtype +create type cantcompare as (p point, r float8); +create temp table cc (f1 cantcompare); +insert into cc values('("(1,2)",3)'); +insert into cc values('("(4,5)",6)'); +select * from cc order by f1; -- fail, but should complain about cantcompare +ERROR: could not identify an ordering operator for type cantcompare +LINE 1: select * from cc order by f1; + ^ +HINT: Use an explicit ordering operator or modify the query. +-- +-- Tests for record_{eq,cmp} +-- +create type testtype1 as (a int, b int); +-- all true +select row(1, 2)::testtype1 < row(1, 3)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 2)::testtype1 <= row(1, 3)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 2)::testtype1 = row(1, 2)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 2)::testtype1 <> row(1, 3)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 3)::testtype1 >= row(1, 2)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 3)::testtype1 > row(1, 2)::testtype1; + ?column? +---------- + t +(1 row) + +-- all false +select row(1, -2)::testtype1 < row(1, -3)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -2)::testtype1 <= row(1, -3)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -2)::testtype1 = row(1, -3)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -2)::testtype1 <> row(1, -2)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -3)::testtype1 >= row(1, -2)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -3)::testtype1 > row(1, -2)::testtype1; + ?column? +---------- + f +(1 row) + +-- true, but see *< below +select row(1, -2)::testtype1 < row(1, 3)::testtype1; + ?column? +---------- + t +(1 row) + +-- mismatches +create type testtype3 as (a int, b text); +select row(1, 2)::testtype1 < row(1, 'abc')::testtype3; +ERROR: cannot compare dissimilar column types integer and text at record column 2 +select row(1, 2)::testtype1 <> row(1, 'abc')::testtype3; +ERROR: cannot compare dissimilar column types integer and text at record column 2 +create type testtype5 as (a int); +select row(1, 2)::testtype1 < row(1)::testtype5; +ERROR: cannot compare record types with different numbers of columns +select row(1, 2)::testtype1 <> row(1)::testtype5; +ERROR: cannot compare record types with different numbers of columns +-- non-comparable types +create type testtype6 as (a int, b point); +select row(1, '(1,2)')::testtype6 < row(1, '(1,3)')::testtype6; +ERROR: could not identify a comparison function for type point +select row(1, '(1,2)')::testtype6 <> row(1, '(1,3)')::testtype6; +ERROR: could not identify an equality operator for type point +drop type testtype1, testtype3, testtype5, testtype6; +-- +-- Tests for record_image_{eq,cmp} +-- +create type testtype1 as (a int, b int); +-- all true +select row(1, 2)::testtype1 *< row(1, 3)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 2)::testtype1 *<= row(1, 3)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 2)::testtype1 *= row(1, 2)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 2)::testtype1 *<> row(1, 3)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 3)::testtype1 *>= row(1, 2)::testtype1; + ?column? +---------- + t +(1 row) + +select row(1, 3)::testtype1 *> row(1, 2)::testtype1; + ?column? +---------- + t +(1 row) + +-- all false +select row(1, -2)::testtype1 *< row(1, -3)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -2)::testtype1 *<= row(1, -3)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -2)::testtype1 *= row(1, -3)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -2)::testtype1 *<> row(1, -2)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -3)::testtype1 *>= row(1, -2)::testtype1; + ?column? +---------- + f +(1 row) + +select row(1, -3)::testtype1 *> row(1, -2)::testtype1; + ?column? +---------- + f +(1 row) + +-- This returns the "wrong" order because record_image_cmp works on +-- unsigned datums without knowing about the actual data type. +select row(1, -2)::testtype1 *< row(1, 3)::testtype1; + ?column? +---------- + f +(1 row) + +-- other types +create type testtype2 as (a smallint, b bool); -- byval different sizes +select row(1, true)::testtype2 *< row(2, true)::testtype2; + ?column? +---------- + t +(1 row) + +select row(-2, true)::testtype2 *< row(-1, true)::testtype2; + ?column? +---------- + t +(1 row) + +select row(0, false)::testtype2 *< row(0, true)::testtype2; + ?column? +---------- + t +(1 row) + +select row(0, false)::testtype2 *<> row(0, true)::testtype2; + ?column? +---------- + t +(1 row) + +create type testtype3 as (a int, b text); -- variable length +select row(1, 'abc')::testtype3 *< row(1, 'abd')::testtype3; + ?column? +---------- + t +(1 row) + +select row(1, 'abc')::testtype3 *< row(1, 'abcd')::testtype3; + ?column? +---------- + t +(1 row) + +select row(1, 'abc')::testtype3 *> row(1, 'abd')::testtype3; + ?column? +---------- + f +(1 row) + +select row(1, 'abc')::testtype3 *<> row(1, 'abd')::testtype3; + ?column? +---------- + t +(1 row) + +create type testtype4 as (a int, b point); -- by ref, fixed length +select row(1, '(1,2)')::testtype4 *< row(1, '(1,3)')::testtype4; + ?column? +---------- + t +(1 row) + +select row(1, '(1,2)')::testtype4 *<> row(1, '(1,3)')::testtype4; + ?column? +---------- + t +(1 row) + +-- mismatches +select row(1, 2)::testtype1 *< row(1, 'abc')::testtype3; +ERROR: cannot compare dissimilar column types integer and text at record column 2 +select row(1, 2)::testtype1 *<> row(1, 'abc')::testtype3; +ERROR: cannot compare dissimilar column types integer and text at record column 2 +create type testtype5 as (a int); +select row(1, 2)::testtype1 *< row(1)::testtype5; +ERROR: cannot compare record types with different numbers of columns +select row(1, 2)::testtype1 *<> row(1)::testtype5; +ERROR: cannot compare record types with different numbers of columns +-- non-comparable types +create type testtype6 as (a int, b point); +select row(1, '(1,2)')::testtype6 *< row(1, '(1,3)')::testtype6; + ?column? +---------- + t +(1 row) + +select row(1, '(1,2)')::testtype6 *>= row(1, '(1,3)')::testtype6; + ?column? +---------- + f +(1 row) + +select row(1, '(1,2)')::testtype6 *<> row(1, '(1,3)')::testtype6; + ?column? +---------- + t +(1 row) + +-- anonymous rowtypes in coldeflists +select q.a, q.b = row(2), q.c = array[row(3)], q.d = row(row(4)) from + unnest(array[row(1, row(2), array[row(3)], row(row(4))), + row(2, row(3), array[row(4)], row(row(5)))]) + as q(a int, b record, c record[], d record); + a | ?column? | ?column? | ?column? +---+----------+----------+---------- + 1 | t | t | t + 2 | f | f | f +(2 rows) + +drop type testtype1, testtype2, testtype3, testtype4, testtype5, testtype6; +-- +-- Test case derived from bug #5716: check multiple uses of a rowtype result +-- +BEGIN; +CREATE TABLE price ( + id SERIAL PRIMARY KEY, + active BOOLEAN NOT NULL, + price NUMERIC +); +CREATE TYPE price_input AS ( + id INTEGER, + price NUMERIC +); +CREATE TYPE price_key AS ( + id INTEGER +); +CREATE FUNCTION price_key_from_table(price) RETURNS price_key AS $$ + SELECT $1.id +$$ LANGUAGE SQL; +CREATE FUNCTION price_key_from_input(price_input) RETURNS price_key AS $$ + SELECT $1.id +$$ LANGUAGE SQL; +insert into price values (1,false,42), (10,false,100), (11,true,17.99); +UPDATE price + SET active = true, price = input_prices.price + FROM unnest(ARRAY[(10, 123.00), (11, 99.99)]::price_input[]) input_prices + WHERE price_key_from_table(price.*) = price_key_from_input(input_prices.*); +select * from price; + id | active | price +----+--------+-------- + 1 | f | 42 + 10 | t | 123.00 + 11 | t | 99.99 +(3 rows) + +rollback; +-- +-- Test case derived from bug #9085: check * qualification of composite +-- parameters for SQL functions +-- +create temp table compos (f1 int, f2 text); +create function fcompos1(v compos) returns void as $$ +insert into compos values (v); -- fail +$$ language sql; +ERROR: column "f1" is of type integer but expression is of type compos +LINE 2: insert into compos values (v); -- fail + ^ +HINT: You will need to rewrite or cast the expression. +create function fcompos1(v compos) returns void as $$ +insert into compos values (v.*); +$$ language sql; +create function fcompos2(v compos) returns void as $$ +select fcompos1(v); +$$ language sql; +create function fcompos3(v compos) returns void as $$ +select fcompos1(fcompos3.v.*); +$$ language sql; +select fcompos1(row(1,'one')); + fcompos1 +---------- + +(1 row) + +select fcompos2(row(2,'two')); + fcompos2 +---------- + +(1 row) + +select fcompos3(row(3,'three')); + fcompos3 +---------- + +(1 row) + +select * from compos; + f1 | f2 +----+------- + 1 | one + 2 | two + 3 | three +(3 rows) + +-- +-- We allow I/O conversion casts from composite types to strings to be +-- invoked via cast syntax, but not functional syntax. This is because +-- the latter is too prone to be invoked unintentionally. +-- +select cast (fullname as text) from fullname; + fullname +---------- +(0 rows) + +select fullname::text from fullname; + fullname +---------- +(0 rows) + +select text(fullname) from fullname; -- error +ERROR: function text(fullname) does not exist +LINE 1: select text(fullname) from fullname; + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select fullname.text from fullname; -- error +ERROR: column fullname.text does not exist +LINE 1: select fullname.text from fullname; + ^ +-- same, but RECORD instead of named composite type: +select cast (row('Jim', 'Beam') as text); + row +------------ + (Jim,Beam) +(1 row) + +select (row('Jim', 'Beam'))::text; + row +------------ + (Jim,Beam) +(1 row) + +select text(row('Jim', 'Beam')); -- error +ERROR: function text(record) does not exist +LINE 1: select text(row('Jim', 'Beam')); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select (row('Jim', 'Beam')).text; -- error +ERROR: could not identify column "text" in record data type +LINE 1: select (row('Jim', 'Beam')).text; + ^ +-- +-- Check the equivalence of functional and column notation +-- +insert into fullname values ('Joe', 'Blow'); +select f.last from fullname f; + last +------ + Blow +(1 row) + +select last(f) from fullname f; + last +------ + Blow +(1 row) + +create function longname(fullname) returns text language sql +as $$select $1.first || ' ' || $1.last$$; +select f.longname from fullname f; + longname +---------- + Joe Blow +(1 row) + +select longname(f) from fullname f; + longname +---------- + Joe Blow +(1 row) + +-- Starting in v11, the notational form does matter if there's ambiguity +alter table fullname add column longname text; +select f.longname from fullname f; + longname +---------- + +(1 row) + +select longname(f) from fullname f; + longname +---------- + Joe Blow +(1 row) + +-- +-- Test that composite values are seen to have the correct column names +-- (bug #11210 and other reports) +-- +select row_to_json(i) from int8_tbl i; + row_to_json +------------------------------------------------ + {"q1":123,"q2":456} + {"q1":123,"q2":4567890123456789} + {"q1":4567890123456789,"q2":123} + {"q1":4567890123456789,"q2":4567890123456789} + {"q1":4567890123456789,"q2":-4567890123456789} +(5 rows) + +-- since "i" is of type "int8_tbl", attaching aliases doesn't change anything: +select row_to_json(i) from int8_tbl i(x,y); + row_to_json +------------------------------------------------ + {"q1":123,"q2":456} + {"q1":123,"q2":4567890123456789} + {"q1":4567890123456789,"q2":123} + {"q1":4567890123456789,"q2":4567890123456789} + {"q1":4567890123456789,"q2":-4567890123456789} +(5 rows) + +-- in these examples, we'll report the exposed column names of the subselect: +select row_to_json(ss) from + (select q1, q2 from int8_tbl) as ss; + row_to_json +------------------------------------------------ + {"q1":123,"q2":456} + {"q1":123,"q2":4567890123456789} + {"q1":4567890123456789,"q2":123} + {"q1":4567890123456789,"q2":4567890123456789} + {"q1":4567890123456789,"q2":-4567890123456789} +(5 rows) + +select row_to_json(ss) from + (select q1, q2 from int8_tbl offset 0) as ss; + row_to_json +------------------------------------------------ + {"q1":123,"q2":456} + {"q1":123,"q2":4567890123456789} + {"q1":4567890123456789,"q2":123} + {"q1":4567890123456789,"q2":4567890123456789} + {"q1":4567890123456789,"q2":-4567890123456789} +(5 rows) + +select row_to_json(ss) from + (select q1 as a, q2 as b from int8_tbl) as ss; + row_to_json +---------------------------------------------- + {"a":123,"b":456} + {"a":123,"b":4567890123456789} + {"a":4567890123456789,"b":123} + {"a":4567890123456789,"b":4567890123456789} + {"a":4567890123456789,"b":-4567890123456789} +(5 rows) + +select row_to_json(ss) from + (select q1 as a, q2 as b from int8_tbl offset 0) as ss; + row_to_json +---------------------------------------------- + {"a":123,"b":456} + {"a":123,"b":4567890123456789} + {"a":4567890123456789,"b":123} + {"a":4567890123456789,"b":4567890123456789} + {"a":4567890123456789,"b":-4567890123456789} +(5 rows) + +select row_to_json(ss) from + (select q1 as a, q2 as b from int8_tbl) as ss(x,y); + row_to_json +---------------------------------------------- + {"x":123,"y":456} + {"x":123,"y":4567890123456789} + {"x":4567890123456789,"y":123} + {"x":4567890123456789,"y":4567890123456789} + {"x":4567890123456789,"y":-4567890123456789} +(5 rows) + +select row_to_json(ss) from + (select q1 as a, q2 as b from int8_tbl offset 0) as ss(x,y); + row_to_json +---------------------------------------------- + {"x":123,"y":456} + {"x":123,"y":4567890123456789} + {"x":4567890123456789,"y":123} + {"x":4567890123456789,"y":4567890123456789} + {"x":4567890123456789,"y":-4567890123456789} +(5 rows) + +explain (costs off) +select row_to_json(q) from + (select thousand, tenthous from tenk1 + where thousand = 42 and tenthous < 2000 offset 0) q; + QUERY PLAN +------------------------------------------------------------- + Subquery Scan on q + -> Index Only Scan using tenk1_thous_tenthous on tenk1 + Index Cond: ((thousand = 42) AND (tenthous < 2000)) + Optimizer: Postgres query optimizer +(4 rows) + +select row_to_json(q) from + (select thousand, tenthous from tenk1 + where thousand = 42 and tenthous < 2000 offset 0) q; + row_to_json +--------------------------------- + {"thousand":42,"tenthous":42} + {"thousand":42,"tenthous":1042} +(2 rows) + +select row_to_json(q) from + (select thousand as x, tenthous as y from tenk1 + where thousand = 42 and tenthous < 2000 offset 0) q; + row_to_json +------------------- + {"x":42,"y":42} + {"x":42,"y":1042} +(2 rows) + +select row_to_json(q) from + (select thousand as x, tenthous as y from tenk1 + where thousand = 42 and tenthous < 2000 offset 0) q(a,b); + row_to_json +------------------- + {"a":42,"b":42} + {"a":42,"b":1042} +(2 rows) + +create temp table tt1 as select * from int8_tbl order by 1 limit 2; +create temp table tt2 () inherits(tt1); +insert into tt2 values(0,0); +select row_to_json(r) from (select q2,q1 from tt1 offset 0) r; + row_to_json +---------------------------------- + {"q2":4567890123456789,"q1":123} + {"q2":456,"q1":123} + {"q2":0,"q1":0} +(3 rows) + +-- check no-op rowtype conversions +create temp table tt3 () inherits(tt2); +insert into tt3 values(33,44); +select row_to_json(tt3::tt2::tt1) from tt3; + row_to_json +------------------- + {"q1":33,"q2":44} +(1 row) + +-- +-- IS [NOT] NULL should not recurse into nested composites (bug #14235) +-- +explain (verbose, costs off) +select r, r is null as isnull, r is not null as isnotnull +from (values (1,row(1,2)), (1,row(null,null)), (1,null), + (null,row(1,2)), (null,row(null,null)), (null,null) ) r(a,b); + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Values Scan on "*VALUES*" + Output: ROW("*VALUES*".column1, "*VALUES*".column2), (("*VALUES*".column1 IS NULL) AND ("*VALUES*".column2 IS NOT DISTINCT FROM NULL)), (("*VALUES*".column1 IS NOT NULL) AND ("*VALUES*".column2 IS DISTINCT FROM NULL)) + Optimizer: Postgres query optimizer +(3 rows) + +select r, r is null as isnull, r is not null as isnotnull +from (values (1,row(1,2)), (1,row(null,null)), (1,null), + (null,row(1,2)), (null,row(null,null)), (null,null) ) r(a,b); + r | isnull | isnotnull +-------------+--------+----------- + (1,"(1,2)") | f | t + (1,"(,)") | f | t + (1,) | f | f + (,"(1,2)") | f | f + (,"(,)") | f | f + (,) | t | f +(6 rows) + +explain (verbose, costs off) +with r(a,b) as materialized + (values (1,row(1,2)), (1,row(null,null)), (1,null), + (null,row(1,2)), (null,row(null,null)), (null,null) ) +select r, r is null as isnull, r is not null as isnotnull from r; + QUERY PLAN +-------------------------------------------------------------- + Subquery Scan on r + Output: r.*, (r.* IS NULL), (r.* IS NOT NULL) + -> Shared Scan (share slice:id -1:0) + Output: share0_ref1.column1, share0_ref1.column2 + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1, "*VALUES*".column2 + Optimizer: Postgres query optimizer +(7 rows) + +with r(a,b) as materialized + (values (1,row(1,2)), (1,row(null,null)), (1,null), + (null,row(1,2)), (null,row(null,null)), (null,null) ) +select r, r is null as isnull, r is not null as isnotnull from r; + r | isnull | isnotnull +-------------+--------+----------- + (1,"(1,2)") | f | t + (1,"(,)") | f | t + (1,) | f | f + (,"(1,2)") | f | f + (,"(,)") | f | f + (,) | t | f +(6 rows) + +-- +-- Tests for component access / FieldSelect +-- +CREATE TABLE compositetable(a text, b text); +INSERT INTO compositetable(a, b) VALUES('fa', 'fb'); +-- composite type columns can't directly be accessed (error) +SELECT d.a FROM (SELECT compositetable AS d FROM compositetable) s; +ERROR: missing FROM-clause entry for table "d" +LINE 1: SELECT d.a FROM (SELECT compositetable AS d FROM compositeta... + ^ +-- but can be accessed with proper parens +SELECT (d).a, (d).b FROM (SELECT compositetable AS d FROM compositetable) s; + a | b +----+---- + fa | fb +(1 row) + +-- system columns can't be accessed in composite types (error) +SELECT (d).ctid FROM (SELECT compositetable AS d FROM compositetable) s; +ERROR: column "ctid" not found in data type compositetable +LINE 1: SELECT (d).ctid FROM (SELECT compositetable AS d FROM compos... + ^ +-- accessing non-existing column in NULL datum errors out +SELECT (NULL::compositetable).nonexistent; +ERROR: column "nonexistent" not found in data type compositetable +LINE 1: SELECT (NULL::compositetable).nonexistent; + ^ +-- existing column in a NULL composite yield NULL +SELECT (NULL::compositetable).a; + a +--- + +(1 row) + +-- oids can't be accessed in composite types (error) +SELECT (NULL::compositetable).oid; +ERROR: column "oid" not found in data type compositetable +LINE 1: SELECT (NULL::compositetable).oid; + ^ +DROP TABLE compositetable; diff --git a/src/test/singlenode_regress/expected/rules.out b/src/test/singlenode_regress/expected/rules.out new file mode 100644 index 00000000000..2fa00a3c29a --- /dev/null +++ b/src/test/singlenode_regress/expected/rules.out @@ -0,0 +1,3701 @@ +-- +-- RULES +-- From Jan's original setup_ruletest.sql and run_ruletest.sql +-- - thomas 1998-09-13 +-- +-- +-- Tables and rules for the view test +-- +create table rtest_t1 (a int4, b int4); +create table rtest_t2 (a int4, b int4); +create table rtest_t3 (a int4, b int4); +create view rtest_v1 as select * from rtest_t1; +create rule rtest_v1_ins as on insert to rtest_v1 do instead + insert into rtest_t1 values (new.a, new.b); +create rule rtest_v1_upd as on update to rtest_v1 do instead + update rtest_t1 set a = new.a, b = new.b + where a = old.a; +create rule rtest_v1_del as on delete to rtest_v1 do instead + delete from rtest_t1 where a = old.a; +-- Test comments +COMMENT ON RULE rtest_v1_bad ON rtest_v1 IS 'bad rule'; +ERROR: rule "rtest_v1_bad" for relation "rtest_v1" does not exist +COMMENT ON RULE rtest_v1_del ON rtest_v1 IS 'delete rule'; +COMMENT ON RULE rtest_v1_del ON rtest_v1 IS NULL; +-- +-- Tables and rules for the constraint update/delete test +-- +-- Note: +-- Now that we have multiple action rule support, we check +-- both possible syntaxes to define them (The last action +-- can but must not have a semicolon at the end). +-- +create table rtest_system (sysname text, sysdesc text); +create table rtest_interface (sysname text, ifname text); +create table rtest_person (pname text, pdesc text); +create table rtest_admin (pname text, sysname text); +create rule rtest_sys_upd as on update to rtest_system do also ( + update rtest_interface set sysname = new.sysname + where sysname = old.sysname; + update rtest_admin set sysname = new.sysname + where sysname = old.sysname + ); +create rule rtest_sys_del as on delete to rtest_system do also ( + delete from rtest_interface where sysname = old.sysname; + delete from rtest_admin where sysname = old.sysname; + ); +create rule rtest_pers_upd as on update to rtest_person do also + update rtest_admin set pname = new.pname where pname = old.pname; +create rule rtest_pers_del as on delete to rtest_person do also + delete from rtest_admin where pname = old.pname; +-- +-- Tables and rules for the logging test +-- +create table rtest_emp (ename char(20), salary money); +create table rtest_emplog (ename char(20), who name, action char(10), newsal money, oldsal money); +create table rtest_empmass (ename char(20), salary money); +create rule rtest_emp_ins as on insert to rtest_emp do + insert into rtest_emplog values (new.ename, current_user, + 'hired', new.salary, '0.00'); +create rule rtest_emp_upd as on update to rtest_emp where new.salary != old.salary do + insert into rtest_emplog values (new.ename, current_user, + 'honored', new.salary, old.salary); +create rule rtest_emp_del as on delete to rtest_emp do + insert into rtest_emplog values (old.ename, current_user, + 'fired', '0.00', old.salary); +-- +-- Tables and rules for the multiple cascaded qualified instead +-- rule test +-- +create table rtest_t4 (a int4, b text); +create table rtest_t5 (a int4, b text); +create table rtest_t6 (a int4, b text); +create table rtest_t7 (a int4, b text); +create table rtest_t8 (a int4, b text); +create table rtest_t9 (a int4, b text); +create rule rtest_t4_ins1 as on insert to rtest_t4 + where new.a >= 10 and new.a < 20 do instead + insert into rtest_t5 values (new.a, new.b); +create rule rtest_t4_ins2 as on insert to rtest_t4 + where new.a >= 20 and new.a < 30 do + insert into rtest_t6 values (new.a, new.b); +create rule rtest_t5_ins as on insert to rtest_t5 + where new.a > 15 do + insert into rtest_t7 values (new.a, new.b); +create rule rtest_t6_ins as on insert to rtest_t6 + where new.a > 25 do instead + insert into rtest_t8 values (new.a, new.b); +-- +-- Tables and rules for the rule fire order test +-- +-- As of PG 7.3, the rules should fire in order by name, regardless +-- of INSTEAD attributes or creation order. +-- +create table rtest_order1 (a int4); +create table rtest_order2 (a int4, b int4, c text); +create sequence rtest_seq; +create rule rtest_order_r3 as on insert to rtest_order1 do instead + insert into rtest_order2 values (new.a, nextval('rtest_seq'), + 'rule 3 - this should run 3rd'); +create rule rtest_order_r4 as on insert to rtest_order1 + where a < 100 do instead + insert into rtest_order2 values (new.a, nextval('rtest_seq'), + 'rule 4 - this should run 4th'); +create rule rtest_order_r2 as on insert to rtest_order1 do + insert into rtest_order2 values (new.a, nextval('rtest_seq'), + 'rule 2 - this should run 2nd'); +create rule rtest_order_r1 as on insert to rtest_order1 do instead + insert into rtest_order2 values (new.a, nextval('rtest_seq'), + 'rule 1 - this should run 1st'); +-- +-- Tables and rules for the instead nothing test +-- +create table rtest_nothn1 (a int4, b text); +create table rtest_nothn2 (a int4, b text); +create table rtest_nothn3 (a int4, b text); +create table rtest_nothn4 (a int4, b text); +create rule rtest_nothn_r1 as on insert to rtest_nothn1 + where new.a >= 10 and new.a < 20 do instead nothing; +create rule rtest_nothn_r2 as on insert to rtest_nothn1 + where new.a >= 30 and new.a < 40 do instead nothing; +create rule rtest_nothn_r3 as on insert to rtest_nothn2 + where new.a >= 100 do instead + insert into rtest_nothn3 values (new.a, new.b); +create rule rtest_nothn_r4 as on insert to rtest_nothn2 + do instead nothing; +-- +-- Tests on a view that is select * of a table +-- and has insert/update/delete instead rules to +-- behave close like the real table. +-- +-- +-- We need test date later +-- +insert into rtest_t2 values (1, 21); +insert into rtest_t2 values (2, 22); +insert into rtest_t2 values (3, 23); +insert into rtest_t3 values (1, 31); +insert into rtest_t3 values (2, 32); +insert into rtest_t3 values (3, 33); +insert into rtest_t3 values (4, 34); +insert into rtest_t3 values (5, 35); +-- insert values +insert into rtest_v1 values (1, 11); +insert into rtest_v1 values (2, 12); +select * from rtest_v1; + a | b +---+---- + 1 | 11 + 2 | 12 +(2 rows) + +-- delete with constant expression +delete from rtest_v1 where a = 1; +select * from rtest_v1; + a | b +---+---- + 2 | 12 +(1 row) + +insert into rtest_v1 values (1, 11); +delete from rtest_v1 where b = 12; +select * from rtest_v1; + a | b +---+---- + 1 | 11 +(1 row) + +insert into rtest_v1 values (2, 12); +insert into rtest_v1 values (2, 13); +select * from rtest_v1; + a | b +---+---- + 1 | 11 + 2 | 12 + 2 | 13 +(3 rows) + +** Remember the delete rule on rtest_v1: It says +** DO INSTEAD DELETE FROM rtest_t1 WHERE a = old.a +** So this time both rows with a = 2 must get deleted +\p +** Remember the delete rule on rtest_v1: It says +** DO INSTEAD DELETE FROM rtest_t1 WHERE a = old.a +** So this time both rows with a = 2 must get deleted +\r +delete from rtest_v1 where b = 12; +select * from rtest_v1; + a | b +---+---- + 1 | 11 +(1 row) + +delete from rtest_v1; +-- insert select +insert into rtest_v1 select * from rtest_t2; +select * from rtest_v1; + a | b +---+---- + 1 | 21 + 2 | 22 + 3 | 23 +(3 rows) + +delete from rtest_v1; +-- same with swapped targetlist +insert into rtest_v1 (b, a) select b, a from rtest_t2; +select * from rtest_v1; + a | b +---+---- + 1 | 21 + 2 | 22 + 3 | 23 +(3 rows) + +-- now with only one target attribute +insert into rtest_v1 (a) select a from rtest_t3; +select * from rtest_v1; + a | b +---+---- + 1 | 21 + 2 | 22 + 3 | 23 + 1 | + 2 | + 3 | + 4 | + 5 | +(8 rows) + +select * from rtest_v1 where b isnull; + a | b +---+--- + 1 | + 2 | + 3 | + 4 | + 5 | +(5 rows) + +-- let attribute a differ (must be done on rtest_t1 - see above) +update rtest_t1 set a = a + 10 where b isnull; +delete from rtest_v1 where b isnull; +select * from rtest_v1; + a | b +---+---- + 1 | 21 + 2 | 22 + 3 | 23 +(3 rows) + +-- now updates with constant expression +update rtest_v1 set b = 42 where a = 2; +select * from rtest_v1; + a | b +---+---- + 1 | 21 + 3 | 23 + 2 | 42 +(3 rows) + +update rtest_v1 set b = 99 where b = 42; +select * from rtest_v1; + a | b +---+---- + 1 | 21 + 3 | 23 + 2 | 99 +(3 rows) + +update rtest_v1 set b = 88 where b < 50; +select * from rtest_v1; + a | b +---+---- + 2 | 99 + 1 | 88 + 3 | 88 +(3 rows) + +delete from rtest_v1; +insert into rtest_v1 select rtest_t2.a, rtest_t3.b + from rtest_t2, rtest_t3 + where rtest_t2.a = rtest_t3.a; +select * from rtest_v1; + a | b +---+---- + 1 | 31 + 2 | 32 + 3 | 33 +(3 rows) + +-- updates in a mergejoin +update rtest_v1 set b = rtest_t2.b from rtest_t2 where rtest_v1.a = rtest_t2.a; +select * from rtest_v1; + a | b +---+---- + 1 | 21 + 2 | 22 + 3 | 23 +(3 rows) + +insert into rtest_v1 select * from rtest_t3; +select * from rtest_v1; + a | b +---+---- + 1 | 21 + 2 | 22 + 3 | 23 + 1 | 31 + 2 | 32 + 3 | 33 + 4 | 34 + 5 | 35 +(8 rows) + +update rtest_t1 set a = a + 10 where b > 30; +select * from rtest_v1; + a | b +----+---- + 1 | 21 + 2 | 22 + 3 | 23 + 11 | 31 + 12 | 32 + 13 | 33 + 14 | 34 + 15 | 35 +(8 rows) + +update rtest_v1 set a = rtest_t3.a + 20 from rtest_t3 where rtest_v1.b = rtest_t3.b; +select * from rtest_v1; + a | b +----+---- + 1 | 21 + 2 | 22 + 3 | 23 + 21 | 31 + 22 | 32 + 23 | 33 + 24 | 34 + 25 | 35 +(8 rows) + +-- +-- Test for constraint updates/deletes +-- +insert into rtest_system values ('orion', 'Linux Jan Wieck'); +insert into rtest_system values ('notjw', 'WinNT Jan Wieck (notebook)'); +insert into rtest_system values ('neptun', 'Fileserver'); +insert into rtest_interface values ('orion', 'eth0'); +insert into rtest_interface values ('orion', 'eth1'); +insert into rtest_interface values ('notjw', 'eth0'); +insert into rtest_interface values ('neptun', 'eth0'); +insert into rtest_person values ('jw', 'Jan Wieck'); +insert into rtest_person values ('bm', 'Bruce Momjian'); +insert into rtest_admin values ('jw', 'orion'); +insert into rtest_admin values ('jw', 'notjw'); +insert into rtest_admin values ('bm', 'neptun'); +update rtest_system set sysname = 'pluto' where sysname = 'neptun'; +select * from rtest_interface; + sysname | ifname +---------+-------- + orion | eth0 + orion | eth1 + notjw | eth0 + pluto | eth0 +(4 rows) + +select * from rtest_admin; + pname | sysname +-------+--------- + jw | orion + jw | notjw + bm | pluto +(3 rows) + +update rtest_person set pname = 'jwieck' where pdesc = 'Jan Wieck'; +-- Note: use ORDER BY here to ensure consistent output across all systems. +-- The above UPDATE affects two rows with equal keys, so they could be +-- updated in either order depending on the whim of the local qsort(). +select * from rtest_admin order by pname, sysname; + pname | sysname +--------+--------- + bm | pluto + jwieck | notjw + jwieck | orion +(3 rows) + +delete from rtest_system where sysname = 'orion'; +select * from rtest_interface; + sysname | ifname +---------+-------- + notjw | eth0 + pluto | eth0 +(2 rows) + +select * from rtest_admin; + pname | sysname +--------+--------- + bm | pluto + jwieck | notjw +(2 rows) + +-- +-- Rule qualification test +-- +insert into rtest_emp values ('wiecc', '5000.00'); +insert into rtest_emp values ('gates', '80000.00'); +update rtest_emp set ename = 'wiecx' where ename = 'wiecc'; +update rtest_emp set ename = 'wieck', salary = '6000.00' where ename = 'wiecx'; +update rtest_emp set salary = '7000.00' where ename = 'wieck'; +delete from rtest_emp where ename = 'gates'; +select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; + ename | matches user | action | newsal | oldsal +----------------------+--------------+------------+------------+------------ + gates | t | fired | $0.00 | $80,000.00 + gates | t | hired | $80,000.00 | $0.00 + wiecc | t | hired | $5,000.00 | $0.00 + wieck | t | honored | $6,000.00 | $5,000.00 + wieck | t | honored | $7,000.00 | $6,000.00 +(5 rows) + +insert into rtest_empmass values ('meyer', '4000.00'); +insert into rtest_empmass values ('maier', '5000.00'); +insert into rtest_empmass values ('mayr', '6000.00'); +insert into rtest_emp select * from rtest_empmass; +select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; + ename | matches user | action | newsal | oldsal +----------------------+--------------+------------+------------+------------ + gates | t | fired | $0.00 | $80,000.00 + gates | t | hired | $80,000.00 | $0.00 + maier | t | hired | $5,000.00 | $0.00 + mayr | t | hired | $6,000.00 | $0.00 + meyer | t | hired | $4,000.00 | $0.00 + wiecc | t | hired | $5,000.00 | $0.00 + wieck | t | honored | $6,000.00 | $5,000.00 + wieck | t | honored | $7,000.00 | $6,000.00 +(8 rows) + +update rtest_empmass set salary = salary + '1000.00'; +update rtest_emp set salary = rtest_empmass.salary from rtest_empmass where rtest_emp.ename = rtest_empmass.ename; +select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; + ename | matches user | action | newsal | oldsal +----------------------+--------------+------------+------------+------------ + gates | t | fired | $0.00 | $80,000.00 + gates | t | hired | $80,000.00 | $0.00 + maier | t | hired | $5,000.00 | $0.00 + maier | t | honored | $6,000.00 | $5,000.00 + mayr | t | hired | $6,000.00 | $0.00 + mayr | t | honored | $7,000.00 | $6,000.00 + meyer | t | hired | $4,000.00 | $0.00 + meyer | t | honored | $5,000.00 | $4,000.00 + wiecc | t | hired | $5,000.00 | $0.00 + wieck | t | honored | $6,000.00 | $5,000.00 + wieck | t | honored | $7,000.00 | $6,000.00 +(11 rows) + +delete from rtest_emp using rtest_empmass where rtest_emp.ename = rtest_empmass.ename; +select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; + ename | matches user | action | newsal | oldsal +----------------------+--------------+------------+------------+------------ + gates | t | fired | $0.00 | $80,000.00 + gates | t | hired | $80,000.00 | $0.00 + maier | t | fired | $0.00 | $6,000.00 + maier | t | hired | $5,000.00 | $0.00 + maier | t | honored | $6,000.00 | $5,000.00 + mayr | t | fired | $0.00 | $7,000.00 + mayr | t | hired | $6,000.00 | $0.00 + mayr | t | honored | $7,000.00 | $6,000.00 + meyer | t | fired | $0.00 | $5,000.00 + meyer | t | hired | $4,000.00 | $0.00 + meyer | t | honored | $5,000.00 | $4,000.00 + wiecc | t | hired | $5,000.00 | $0.00 + wieck | t | honored | $6,000.00 | $5,000.00 + wieck | t | honored | $7,000.00 | $6,000.00 +(14 rows) + +-- +-- Multiple cascaded qualified instead rule test +-- +insert into rtest_t4 values (1, 'Record should go to rtest_t4'); +insert into rtest_t4 values (2, 'Record should go to rtest_t4'); +insert into rtest_t4 values (10, 'Record should go to rtest_t5'); +insert into rtest_t4 values (15, 'Record should go to rtest_t5'); +insert into rtest_t4 values (19, 'Record should go to rtest_t5 and t7'); +insert into rtest_t4 values (20, 'Record should go to rtest_t4 and t6'); +insert into rtest_t4 values (26, 'Record should go to rtest_t4 and t8'); +insert into rtest_t4 values (28, 'Record should go to rtest_t4 and t8'); +insert into rtest_t4 values (30, 'Record should go to rtest_t4'); +insert into rtest_t4 values (40, 'Record should go to rtest_t4'); +select * from rtest_t4; + a | b +----+------------------------------------- + 1 | Record should go to rtest_t4 + 2 | Record should go to rtest_t4 + 20 | Record should go to rtest_t4 and t6 + 26 | Record should go to rtest_t4 and t8 + 28 | Record should go to rtest_t4 and t8 + 30 | Record should go to rtest_t4 + 40 | Record should go to rtest_t4 +(7 rows) + +select * from rtest_t5; + a | b +----+------------------------------------- + 10 | Record should go to rtest_t5 + 15 | Record should go to rtest_t5 + 19 | Record should go to rtest_t5 and t7 +(3 rows) + +select * from rtest_t6; + a | b +----+------------------------------------- + 20 | Record should go to rtest_t4 and t6 +(1 row) + +select * from rtest_t7; + a | b +----+------------------------------------- + 19 | Record should go to rtest_t5 and t7 +(1 row) + +select * from rtest_t8; + a | b +----+------------------------------------- + 26 | Record should go to rtest_t4 and t8 + 28 | Record should go to rtest_t4 and t8 +(2 rows) + +delete from rtest_t4; +delete from rtest_t5; +delete from rtest_t6; +delete from rtest_t7; +delete from rtest_t8; +insert into rtest_t9 values (1, 'Record should go to rtest_t4'); +insert into rtest_t9 values (2, 'Record should go to rtest_t4'); +insert into rtest_t9 values (10, 'Record should go to rtest_t5'); +insert into rtest_t9 values (15, 'Record should go to rtest_t5'); +insert into rtest_t9 values (19, 'Record should go to rtest_t5 and t7'); +insert into rtest_t9 values (20, 'Record should go to rtest_t4 and t6'); +insert into rtest_t9 values (26, 'Record should go to rtest_t4 and t8'); +insert into rtest_t9 values (28, 'Record should go to rtest_t4 and t8'); +insert into rtest_t9 values (30, 'Record should go to rtest_t4'); +insert into rtest_t9 values (40, 'Record should go to rtest_t4'); +insert into rtest_t4 select * from rtest_t9 where a < 20; +select * from rtest_t4; + a | b +---+------------------------------ + 1 | Record should go to rtest_t4 + 2 | Record should go to rtest_t4 +(2 rows) + +select * from rtest_t5; + a | b +----+------------------------------------- + 10 | Record should go to rtest_t5 + 15 | Record should go to rtest_t5 + 19 | Record should go to rtest_t5 and t7 +(3 rows) + +select * from rtest_t6; + a | b +---+--- +(0 rows) + +select * from rtest_t7; + a | b +----+------------------------------------- + 19 | Record should go to rtest_t5 and t7 +(1 row) + +select * from rtest_t8; + a | b +---+--- +(0 rows) + +insert into rtest_t4 select * from rtest_t9 where b ~ 'and t8'; +select * from rtest_t4; + a | b +----+------------------------------------- + 1 | Record should go to rtest_t4 + 2 | Record should go to rtest_t4 + 26 | Record should go to rtest_t4 and t8 + 28 | Record should go to rtest_t4 and t8 +(4 rows) + +select * from rtest_t5; + a | b +----+------------------------------------- + 10 | Record should go to rtest_t5 + 15 | Record should go to rtest_t5 + 19 | Record should go to rtest_t5 and t7 +(3 rows) + +select * from rtest_t6; + a | b +---+--- +(0 rows) + +select * from rtest_t7; + a | b +----+------------------------------------- + 19 | Record should go to rtest_t5 and t7 +(1 row) + +select * from rtest_t8; + a | b +----+------------------------------------- + 26 | Record should go to rtest_t4 and t8 + 28 | Record should go to rtest_t4 and t8 +(2 rows) + +insert into rtest_t4 select a + 1, b from rtest_t9 where a in (20, 30, 40); +select * from rtest_t4; + a | b +----+------------------------------------- + 1 | Record should go to rtest_t4 + 2 | Record should go to rtest_t4 + 26 | Record should go to rtest_t4 and t8 + 28 | Record should go to rtest_t4 and t8 + 21 | Record should go to rtest_t4 and t6 + 31 | Record should go to rtest_t4 + 41 | Record should go to rtest_t4 +(7 rows) + +select * from rtest_t5; + a | b +----+------------------------------------- + 10 | Record should go to rtest_t5 + 15 | Record should go to rtest_t5 + 19 | Record should go to rtest_t5 and t7 +(3 rows) + +select * from rtest_t6; + a | b +----+------------------------------------- + 21 | Record should go to rtest_t4 and t6 +(1 row) + +select * from rtest_t7; + a | b +----+------------------------------------- + 19 | Record should go to rtest_t5 and t7 +(1 row) + +select * from rtest_t8; + a | b +----+------------------------------------- + 26 | Record should go to rtest_t4 and t8 + 28 | Record should go to rtest_t4 and t8 +(2 rows) + +-- +-- Check that the ordering of rules fired is correct +-- +insert into rtest_order1 values (1); +select * from rtest_order2; + a | b | c +---+---+------------------------------ + 1 | 1 | rule 1 - this should run 1st + 1 | 2 | rule 2 - this should run 2nd + 1 | 3 | rule 3 - this should run 3rd + 1 | 4 | rule 4 - this should run 4th +(4 rows) + +-- +-- Check if instead nothing w/without qualification works +-- +insert into rtest_nothn1 values (1, 'want this'); +insert into rtest_nothn1 values (2, 'want this'); +insert into rtest_nothn1 values (10, 'don''t want this'); +insert into rtest_nothn1 values (19, 'don''t want this'); +insert into rtest_nothn1 values (20, 'want this'); +insert into rtest_nothn1 values (29, 'want this'); +insert into rtest_nothn1 values (30, 'don''t want this'); +insert into rtest_nothn1 values (39, 'don''t want this'); +insert into rtest_nothn1 values (40, 'want this'); +insert into rtest_nothn1 values (50, 'want this'); +insert into rtest_nothn1 values (60, 'want this'); +select * from rtest_nothn1; + a | b +----+----------- + 1 | want this + 2 | want this + 20 | want this + 29 | want this + 40 | want this + 50 | want this + 60 | want this +(7 rows) + +insert into rtest_nothn2 values (10, 'too small'); +insert into rtest_nothn2 values (50, 'too small'); +insert into rtest_nothn2 values (100, 'OK'); +insert into rtest_nothn2 values (200, 'OK'); +select * from rtest_nothn2; + a | b +---+--- +(0 rows) + +select * from rtest_nothn3; + a | b +-----+---- + 100 | OK + 200 | OK +(2 rows) + +delete from rtest_nothn1; +delete from rtest_nothn2; +delete from rtest_nothn3; +insert into rtest_nothn4 values (1, 'want this'); +insert into rtest_nothn4 values (2, 'want this'); +insert into rtest_nothn4 values (10, 'don''t want this'); +insert into rtest_nothn4 values (19, 'don''t want this'); +insert into rtest_nothn4 values (20, 'want this'); +insert into rtest_nothn4 values (29, 'want this'); +insert into rtest_nothn4 values (30, 'don''t want this'); +insert into rtest_nothn4 values (39, 'don''t want this'); +insert into rtest_nothn4 values (40, 'want this'); +insert into rtest_nothn4 values (50, 'want this'); +insert into rtest_nothn4 values (60, 'want this'); +insert into rtest_nothn1 select * from rtest_nothn4; +select * from rtest_nothn1; + a | b +----+----------- + 1 | want this + 2 | want this + 20 | want this + 29 | want this + 40 | want this + 50 | want this + 60 | want this +(7 rows) + +delete from rtest_nothn4; +insert into rtest_nothn4 values (10, 'too small'); +insert into rtest_nothn4 values (50, 'too small'); +insert into rtest_nothn4 values (100, 'OK'); +insert into rtest_nothn4 values (200, 'OK'); +insert into rtest_nothn2 select * from rtest_nothn4; +select * from rtest_nothn2; + a | b +---+--- +(0 rows) + +select * from rtest_nothn3; + a | b +-----+---- + 100 | OK + 200 | OK +(2 rows) + +create table rtest_view1 (a int4, b text, v bool); +create table rtest_view2 (a int4); +create table rtest_view3 (a int4, b text); +create table rtest_view4 (a int4, b text, c int4); +create view rtest_vview1 as select a, b from rtest_view1 X + where 0 < (select count(*) from rtest_view2 Y where Y.a = X.a); +create view rtest_vview2 as select a, b from rtest_view1 where v; +create view rtest_vview3 as select a, b from rtest_vview2 X + where 0 < (select count(*) from rtest_view2 Y where Y.a = X.a); +create view rtest_vview4 as select X.a, X.b, count(Y.a) as refcount + from rtest_view1 X, rtest_view2 Y + where X.a = Y.a + group by X.a, X.b; +create function rtest_viewfunc1(int4) returns int4 as + 'select count(*)::int4 from rtest_view2 where a = $1' + language sql; +create view rtest_vview5 as select a, b, rtest_viewfunc1(a) as refcount + from rtest_view1; +insert into rtest_view1 values (1, 'item 1', 't'); +insert into rtest_view1 values (2, 'item 2', 't'); +insert into rtest_view1 values (3, 'item 3', 't'); +insert into rtest_view1 values (4, 'item 4', 'f'); +insert into rtest_view1 values (5, 'item 5', 't'); +insert into rtest_view1 values (6, 'item 6', 'f'); +insert into rtest_view1 values (7, 'item 7', 't'); +insert into rtest_view1 values (8, 'item 8', 't'); +insert into rtest_view2 values (2); +insert into rtest_view2 values (2); +insert into rtest_view2 values (4); +insert into rtest_view2 values (5); +insert into rtest_view2 values (7); +insert into rtest_view2 values (7); +insert into rtest_view2 values (7); +insert into rtest_view2 values (7); +select * from rtest_vview1; + a | b +---+-------- + 2 | item 2 + 4 | item 4 + 5 | item 5 + 7 | item 7 +(4 rows) + +select * from rtest_vview2; + a | b +---+-------- + 1 | item 1 + 2 | item 2 + 3 | item 3 + 5 | item 5 + 7 | item 7 + 8 | item 8 +(6 rows) + +select * from rtest_vview3; + a | b +---+-------- + 2 | item 2 + 5 | item 5 + 7 | item 7 +(3 rows) + +select * from rtest_vview4 order by a, b; + a | b | refcount +---+--------+---------- + 2 | item 2 | 2 + 4 | item 4 | 1 + 5 | item 5 | 1 + 7 | item 7 | 4 +(4 rows) + +select * from rtest_vview5; + a | b | refcount +---+--------+---------- + 1 | item 1 | 0 + 2 | item 2 | 2 + 3 | item 3 | 0 + 4 | item 4 | 1 + 5 | item 5 | 1 + 6 | item 6 | 0 + 7 | item 7 | 4 + 8 | item 8 | 0 +(8 rows) + +insert into rtest_view3 select * from rtest_vview1 where a < 7; +select * from rtest_view3; + a | b +---+-------- + 2 | item 2 + 4 | item 4 + 5 | item 5 +(3 rows) + +delete from rtest_view3; +insert into rtest_view3 select * from rtest_vview2 where a != 5 and b !~ '2'; +select * from rtest_view3; + a | b +---+-------- + 1 | item 1 + 3 | item 3 + 7 | item 7 + 8 | item 8 +(4 rows) + +delete from rtest_view3; +insert into rtest_view3 select * from rtest_vview3; +select * from rtest_view3; + a | b +---+-------- + 2 | item 2 + 5 | item 5 + 7 | item 7 +(3 rows) + +delete from rtest_view3; +insert into rtest_view4 select * from rtest_vview4 where 3 > refcount; +select * from rtest_view4 order by a, b; + a | b | c +---+--------+--- + 2 | item 2 | 2 + 4 | item 4 | 1 + 5 | item 5 | 1 +(3 rows) + +delete from rtest_view4; +insert into rtest_view4 select * from rtest_vview5 where a > 2 and refcount = 0; +select * from rtest_view4; + a | b | c +---+--------+--- + 3 | item 3 | 0 + 6 | item 6 | 0 + 8 | item 8 | 0 +(3 rows) + +delete from rtest_view4; +-- +-- Test for computations in views +-- +create table rtest_comp ( + part text, + unit char(4), + size float +); +create table rtest_unitfact ( + unit char(4), + factor float +); +create view rtest_vcomp as + select X.part, (X.size * Y.factor) as size_in_cm + from rtest_comp X, rtest_unitfact Y + where X.unit = Y.unit; +insert into rtest_unitfact values ('m', 100.0); +insert into rtest_unitfact values ('cm', 1.0); +insert into rtest_unitfact values ('inch', 2.54); +insert into rtest_comp values ('p1', 'm', 5.0); +insert into rtest_comp values ('p2', 'm', 3.0); +insert into rtest_comp values ('p3', 'cm', 5.0); +insert into rtest_comp values ('p4', 'cm', 15.0); +insert into rtest_comp values ('p5', 'inch', 7.0); +insert into rtest_comp values ('p6', 'inch', 4.4); +select * from rtest_vcomp order by part; + part | size_in_cm +------+-------------------- + p1 | 500 + p2 | 300 + p3 | 5 + p4 | 15 + p5 | 17.78 + p6 | 11.176000000000002 +(6 rows) + +select * from rtest_vcomp where size_in_cm > 10.0 order by size_in_cm using >; + part | size_in_cm +------+-------------------- + p1 | 500 + p2 | 300 + p5 | 17.78 + p4 | 15 + p6 | 11.176000000000002 +(5 rows) + +-- +-- In addition run the (slightly modified) queries from the +-- programmers manual section on the rule system. +-- +CREATE TABLE shoe_data ( + shoename char(10), -- primary key + sh_avail integer, -- available # of pairs + slcolor char(10), -- preferred shoelace color + slminlen float, -- minimum shoelace length + slmaxlen float, -- maximum shoelace length + slunit char(8) -- length unit +); +CREATE TABLE shoelace_data ( + sl_name char(10), -- primary key + sl_avail integer, -- available # of pairs + sl_color char(10), -- shoelace color + sl_len float, -- shoelace length + sl_unit char(8) -- length unit +); +CREATE TABLE unit ( + un_name char(8), -- the primary key + un_fact float -- factor to transform to cm +); +CREATE VIEW shoe AS + SELECT sh.shoename, + sh.sh_avail, + sh.slcolor, + sh.slminlen, + sh.slminlen * un.un_fact AS slminlen_cm, + sh.slmaxlen, + sh.slmaxlen * un.un_fact AS slmaxlen_cm, + sh.slunit + FROM shoe_data sh, unit un + WHERE sh.slunit = un.un_name; +CREATE VIEW shoelace AS + SELECT s.sl_name, + s.sl_avail, + s.sl_color, + s.sl_len, + s.sl_unit, + s.sl_len * u.un_fact AS sl_len_cm + FROM shoelace_data s, unit u + WHERE s.sl_unit = u.un_name; +CREATE VIEW shoe_ready AS + SELECT rsh.shoename, + rsh.sh_avail, + rsl.sl_name, + rsl.sl_avail, + int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail + FROM shoe rsh, shoelace rsl + WHERE rsl.sl_color = rsh.slcolor + AND rsl.sl_len_cm >= rsh.slminlen_cm + AND rsl.sl_len_cm <= rsh.slmaxlen_cm; +INSERT INTO unit VALUES ('cm', 1.0); +INSERT INTO unit VALUES ('m', 100.0); +INSERT INTO unit VALUES ('inch', 2.54); +INSERT INTO shoe_data VALUES ('sh1', 2, 'black', 70.0, 90.0, 'cm'); +INSERT INTO shoe_data VALUES ('sh2', 0, 'black', 30.0, 40.0, 'inch'); +INSERT INTO shoe_data VALUES ('sh3', 4, 'brown', 50.0, 65.0, 'cm'); +INSERT INTO shoe_data VALUES ('sh4', 3, 'brown', 40.0, 50.0, 'inch'); +INSERT INTO shoelace_data VALUES ('sl1', 5, 'black', 80.0, 'cm'); +INSERT INTO shoelace_data VALUES ('sl2', 6, 'black', 100.0, 'cm'); +INSERT INTO shoelace_data VALUES ('sl3', 0, 'black', 35.0 , 'inch'); +INSERT INTO shoelace_data VALUES ('sl4', 8, 'black', 40.0 , 'inch'); +INSERT INTO shoelace_data VALUES ('sl5', 4, 'brown', 1.0 , 'm'); +INSERT INTO shoelace_data VALUES ('sl6', 0, 'brown', 0.9 , 'm'); +INSERT INTO shoelace_data VALUES ('sl7', 7, 'brown', 60 , 'cm'); +INSERT INTO shoelace_data VALUES ('sl8', 1, 'brown', 40 , 'inch'); +-- SELECTs in doc +SELECT * FROM shoelace ORDER BY sl_name; + sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm +------------+----------+------------+--------+----------+----------- + sl1 | 5 | black | 80 | cm | 80 + sl2 | 6 | black | 100 | cm | 100 + sl3 | 0 | black | 35 | inch | 88.9 + sl4 | 8 | black | 40 | inch | 101.6 + sl5 | 4 | brown | 1 | m | 100 + sl6 | 0 | brown | 0.9 | m | 90 + sl7 | 7 | brown | 60 | cm | 60 + sl8 | 1 | brown | 40 | inch | 101.6 +(8 rows) + +SELECT * FROM shoe_ready WHERE total_avail >= 2 ORDER BY 1; + shoename | sh_avail | sl_name | sl_avail | total_avail +------------+----------+------------+----------+------------- + sh1 | 2 | sl1 | 5 | 2 + sh3 | 4 | sl7 | 7 | 4 +(2 rows) + + CREATE TABLE shoelace_log ( + sl_name char(10), -- shoelace changed + sl_avail integer, -- new available value + log_who name, -- who did it + log_when timestamp -- when + ); +-- Want "log_who" to be CURRENT_USER, +-- but that is non-portable for the regression test +-- - thomas 1999-02-21 + CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data + WHERE NEW.sl_avail != OLD.sl_avail + DO INSERT INTO shoelace_log VALUES ( + NEW.sl_name, + NEW.sl_avail, + 'Al Bundy', + 'epoch' + ); +UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7'; +SELECT * FROM shoelace_log; + sl_name | sl_avail | log_who | log_when +------------+----------+----------+-------------------------- + sl7 | 6 | Al Bundy | Thu Jan 01 00:00:00 1970 +(1 row) + + CREATE RULE shoelace_ins AS ON INSERT TO shoelace + DO INSTEAD + INSERT INTO shoelace_data VALUES ( + NEW.sl_name, + NEW.sl_avail, + NEW.sl_color, + NEW.sl_len, + NEW.sl_unit); + CREATE RULE shoelace_upd AS ON UPDATE TO shoelace + DO INSTEAD + UPDATE shoelace_data SET + sl_name = NEW.sl_name, + sl_avail = NEW.sl_avail, + sl_color = NEW.sl_color, + sl_len = NEW.sl_len, + sl_unit = NEW.sl_unit + WHERE sl_name = OLD.sl_name; + CREATE RULE shoelace_del AS ON DELETE TO shoelace + DO INSTEAD + DELETE FROM shoelace_data + WHERE sl_name = OLD.sl_name; + CREATE TABLE shoelace_arrive ( + arr_name char(10), + arr_quant integer + ); + CREATE TABLE shoelace_ok ( + ok_name char(10), + ok_quant integer + ); + CREATE RULE shoelace_ok_ins AS ON INSERT TO shoelace_ok + DO INSTEAD + UPDATE shoelace SET + sl_avail = sl_avail + NEW.ok_quant + WHERE sl_name = NEW.ok_name; +INSERT INTO shoelace_arrive VALUES ('sl3', 10); +INSERT INTO shoelace_arrive VALUES ('sl6', 20); +INSERT INTO shoelace_arrive VALUES ('sl8', 20); +SELECT * FROM shoelace ORDER BY sl_name; + sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm +------------+----------+------------+--------+----------+----------- + sl1 | 5 | black | 80 | cm | 80 + sl2 | 6 | black | 100 | cm | 100 + sl3 | 0 | black | 35 | inch | 88.9 + sl4 | 8 | black | 40 | inch | 101.6 + sl5 | 4 | brown | 1 | m | 100 + sl6 | 0 | brown | 0.9 | m | 90 + sl7 | 6 | brown | 60 | cm | 60 + sl8 | 1 | brown | 40 | inch | 101.6 +(8 rows) + +insert into shoelace_ok select * from shoelace_arrive; +SELECT * FROM shoelace ORDER BY sl_name; + sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm +------------+----------+------------+--------+----------+----------- + sl1 | 5 | black | 80 | cm | 80 + sl2 | 6 | black | 100 | cm | 100 + sl3 | 10 | black | 35 | inch | 88.9 + sl4 | 8 | black | 40 | inch | 101.6 + sl5 | 4 | brown | 1 | m | 100 + sl6 | 20 | brown | 0.9 | m | 90 + sl7 | 6 | brown | 60 | cm | 60 + sl8 | 21 | brown | 40 | inch | 101.6 +(8 rows) + +SELECT * FROM shoelace_log ORDER BY sl_name; + sl_name | sl_avail | log_who | log_when +------------+----------+----------+-------------------------- + sl3 | 10 | Al Bundy | Thu Jan 01 00:00:00 1970 + sl6 | 20 | Al Bundy | Thu Jan 01 00:00:00 1970 + sl7 | 6 | Al Bundy | Thu Jan 01 00:00:00 1970 + sl8 | 21 | Al Bundy | Thu Jan 01 00:00:00 1970 +(4 rows) + + CREATE VIEW shoelace_obsolete AS + SELECT * FROM shoelace WHERE NOT EXISTS + (SELECT shoename FROM shoe WHERE slcolor = sl_color); + CREATE VIEW shoelace_candelete AS + SELECT * FROM shoelace_obsolete WHERE sl_avail = 0; +insert into shoelace values ('sl9', 0, 'pink', 35.0, 'inch', 0.0); +insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0); +-- Unsupported (even though a similar updatable view construct is) +insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0) + on conflict do nothing; +ERROR: INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules +SELECT * FROM shoelace_obsolete ORDER BY sl_len_cm; + sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm +------------+----------+------------+--------+----------+----------- + sl9 | 0 | pink | 35 | inch | 88.9 + sl10 | 1000 | magenta | 40 | inch | 101.6 +(2 rows) + +SELECT * FROM shoelace_candelete; + sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm +------------+----------+------------+--------+----------+----------- + sl9 | 0 | pink | 35 | inch | 88.9 +(1 row) + +DELETE FROM shoelace WHERE EXISTS + (SELECT * FROM shoelace_candelete + WHERE sl_name = shoelace.sl_name); +SELECT * FROM shoelace ORDER BY sl_name; + sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm +------------+----------+------------+--------+----------+----------- + sl1 | 5 | black | 80 | cm | 80 + sl10 | 1000 | magenta | 40 | inch | 101.6 + sl2 | 6 | black | 100 | cm | 100 + sl3 | 10 | black | 35 | inch | 88.9 + sl4 | 8 | black | 40 | inch | 101.6 + sl5 | 4 | brown | 1 | m | 100 + sl6 | 20 | brown | 0.9 | m | 90 + sl7 | 6 | brown | 60 | cm | 60 + sl8 | 21 | brown | 40 | inch | 101.6 +(9 rows) + +SELECT * FROM shoe ORDER BY shoename; + shoename | sh_avail | slcolor | slminlen | slminlen_cm | slmaxlen | slmaxlen_cm | slunit +------------+----------+------------+----------+-------------+----------+-------------+---------- + sh1 | 2 | black | 70 | 70 | 90 | 90 | cm + sh2 | 0 | black | 30 | 76.2 | 40 | 101.6 | inch + sh3 | 4 | brown | 50 | 50 | 65 | 65 | cm + sh4 | 3 | brown | 40 | 101.6 | 50 | 127 | inch +(4 rows) + +SELECT count(*) FROM shoe; + count +------- + 4 +(1 row) + +-- +-- Simple test of qualified ON INSERT ... this did not work in 7.0 ... +-- +create table rules_foo (f1 int); +create table rules_foo2 (f1 int); +create rule rules_foorule as on insert to rules_foo where f1 < 100 +do instead nothing; +insert into rules_foo values(1); +insert into rules_foo values(1001); +select * from rules_foo; + f1 +------ + 1001 +(1 row) + +drop rule rules_foorule on rules_foo; +-- this should fail because f1 is not exposed for unqualified reference: +create rule rules_foorule as on insert to rules_foo where f1 < 100 +do instead insert into rules_foo2 values (f1); +ERROR: column "f1" does not exist +LINE 2: do instead insert into rules_foo2 values (f1); + ^ +HINT: There is a column named "f1" in table "old", but it cannot be referenced from this part of the query. +-- this is the correct way: +create rule rules_foorule as on insert to rules_foo where f1 < 100 +do instead insert into rules_foo2 values (new.f1); +insert into rules_foo values(2); +insert into rules_foo values(100); +select * from rules_foo; + f1 +------ + 1001 + 100 +(2 rows) + +select * from rules_foo2; + f1 +---- + 2 +(1 row) + +drop rule rules_foorule on rules_foo; +drop table rules_foo; +drop table rules_foo2; +-- +-- Test rules containing INSERT ... SELECT, which is a very ugly special +-- case as of 7.1. Example is based on bug report from Joel Burton. +-- +create table pparent (pid int, txt text); +insert into pparent values (1,'parent1'); +insert into pparent values (2,'parent2'); +create table cchild (pid int, descrip text); +insert into cchild values (1,'descrip1'); +create view vview as + select pparent.pid, txt, descrip from + pparent left join cchild using (pid); +create rule rrule as + on update to vview do instead +( + insert into cchild (pid, descrip) + select old.pid, new.descrip where old.descrip isnull; + update cchild set descrip = new.descrip where cchild.pid = old.pid; +); +select * from vview; + pid | txt | descrip +-----+---------+---------- + 1 | parent1 | descrip1 + 2 | parent2 | +(2 rows) + +update vview set descrip='test1' where pid=1; +select * from vview; + pid | txt | descrip +-----+---------+--------- + 1 | parent1 | test1 + 2 | parent2 | +(2 rows) + +update vview set descrip='test2' where pid=2; +select * from vview; + pid | txt | descrip +-----+---------+--------- + 1 | parent1 | test1 + 2 | parent2 | test2 +(2 rows) + +update vview set descrip='test3' where pid=3; +select * from vview; + pid | txt | descrip +-----+---------+--------- + 1 | parent1 | test1 + 2 | parent2 | test2 +(2 rows) + +select * from cchild; + pid | descrip +-----+--------- + 1 | test1 + 2 | test2 +(2 rows) + +drop rule rrule on vview; +drop view vview; +drop table pparent; +drop table cchild; +-- +-- Check that ruleutils are working +-- +-- temporarily disable fancy output, so view changes create less diff noise +\a\t +SELECT viewname, definition FROM pg_views +WHERE schemaname IN ('pg_catalog', 'public') +ORDER BY viewname; +iexit| SELECT ih.name, + ih.thepath, + interpt_pp(ih.thepath, r.thepath) AS exit + FROM ihighway ih, + ramp r + WHERE (ih.thepath ## r.thepath); +key_dependent_view| SELECT view_base_table.key, + view_base_table.data + FROM view_base_table + GROUP BY view_base_table.key; +key_dependent_view_no_cols| SELECT + FROM view_base_table + GROUP BY view_base_table.key + HAVING (length((view_base_table.data)::text) > 0); +mvtest_tv| SELECT mvtest_t.type, + sum(mvtest_t.amt) AS totamt + FROM mvtest_t + GROUP BY mvtest_t.type; +mvtest_tvv| SELECT sum(mvtest_tv.totamt) AS grandtot + FROM mvtest_tv; +mvtest_tvvmv| SELECT mvtest_tvvm.grandtot + FROM mvtest_tvvm; +pg_available_extension_versions| SELECT e.name, + e.version, + (x.extname IS NOT NULL) AS installed, + e.superuser, + e.trusted, + e.relocatable, + e.schema, + e.requires, + e.comment + FROM (pg_available_extension_versions() e(name, version, superuser, trusted, relocatable, schema, requires, comment) + LEFT JOIN pg_extension x ON (((e.name = x.extname) AND (e.version = x.extversion)))); +pg_available_extensions| SELECT e.name, + e.default_version, + x.extversion AS installed_version, + e.comment + FROM (pg_available_extensions() e(name, default_version, comment) + LEFT JOIN pg_extension x ON ((e.name = x.extname))); +pg_backend_memory_contexts| SELECT pg_get_backend_memory_contexts.name, + pg_get_backend_memory_contexts.ident, + pg_get_backend_memory_contexts.parent, + pg_get_backend_memory_contexts.level, + pg_get_backend_memory_contexts.total_bytes, + pg_get_backend_memory_contexts.total_nblocks, + pg_get_backend_memory_contexts.free_bytes, + pg_get_backend_memory_contexts.free_chunks, + pg_get_backend_memory_contexts.used_bytes + FROM pg_get_backend_memory_contexts() pg_get_backend_memory_contexts(name, ident, parent, level, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes); +pg_config| SELECT pg_config.name, + pg_config.setting + FROM pg_config() pg_config(name, setting); +pg_cursors| SELECT c.name, + c.statement, + c.is_holdable, + c.is_binary, + c.is_scrollable, + c.creation_time + FROM pg_cursor() c(name, statement, is_holdable, is_binary, is_scrollable, creation_time); +pg_file_settings| SELECT a.sourcefile, + a.sourceline, + a.seqno, + a.name, + a.setting, + a.applied, + a.error + FROM pg_show_all_file_settings() a(sourcefile, sourceline, seqno, name, setting, applied, error); +pg_group| SELECT pg_authid.rolname AS groname, + pg_authid.oid AS grosysid, + ARRAY( SELECT pg_auth_members.member + FROM pg_auth_members + WHERE (pg_auth_members.roleid = pg_authid.oid)) AS grolist + FROM pg_authid + WHERE (NOT pg_authid.rolcanlogin); +pg_hba_file_rules| SELECT a.line_number, + a.type, + a.database, + a.user_name, + a.address, + a.netmask, + a.auth_method, + a.options, + a.error + FROM pg_hba_file_rules() a(line_number, type, database, user_name, address, netmask, auth_method, options, error); +pg_indexes| SELECT n.nspname AS schemaname, + c.relname AS tablename, + i.relname AS indexname, + t.spcname AS tablespace, + pg_get_indexdef(i.oid) AS indexdef + FROM ((((pg_index x + JOIN pg_class c ON ((c.oid = x.indrelid))) + JOIN pg_class i ON ((i.oid = x.indexrelid))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace))) + WHERE ((c.relkind = ANY (ARRAY['r'::"char", 'm'::"char", 'p'::"char"])) AND (i.relkind = ANY (ARRAY['i'::"char", 'I'::"char"]))); +pg_locks| SELECT l.locktype, + l.database, + l.relation, + l.page, + l.tuple, + l.virtualxid, + l.transactionid, + l.classid, + l.objid, + l.objsubid, + l.virtualtransaction, + l.pid, + l.mode, + l.granted, + l.fastpath, + l.waitstart + FROM pg_lock_status() l(locktype, database, relation, page, tuple, virtualxid, transactionid, classid, objid, objsubid, virtualtransaction, pid, mode, granted, fastpath, waitstart); +pg_matviews| SELECT n.nspname AS schemaname, + c.relname AS matviewname, + pg_get_userbyid(c.relowner) AS matviewowner, + t.spcname AS tablespace, + c.relhasindex AS hasindexes, + c.relispopulated AS ispopulated, + pg_get_viewdef(c.oid) AS definition + FROM ((pg_class c + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) + WHERE (c.relkind = 'm'::"char"); +pg_policies| SELECT n.nspname AS schemaname, + c.relname AS tablename, + pol.polname AS policyname, + CASE + WHEN pol.polpermissive THEN 'PERMISSIVE'::text + ELSE 'RESTRICTIVE'::text + END AS permissive, + CASE + WHEN (pol.polroles = '{0}'::oid[]) THEN (string_to_array('public'::text, ''::text))::name[] + ELSE ARRAY( SELECT pg_authid.rolname + FROM pg_authid + WHERE (pg_authid.oid = ANY (pol.polroles)) + ORDER BY pg_authid.rolname) + END AS roles, + CASE pol.polcmd + WHEN 'r'::"char" THEN 'SELECT'::text + WHEN 'a'::"char" THEN 'INSERT'::text + WHEN 'w'::"char" THEN 'UPDATE'::text + WHEN 'd'::"char" THEN 'DELETE'::text + WHEN '*'::"char" THEN 'ALL'::text + ELSE NULL::text + END AS cmd, + pg_get_expr(pol.polqual, pol.polrelid) AS qual, + pg_get_expr(pol.polwithcheck, pol.polrelid) AS with_check + FROM ((pg_policy pol + JOIN pg_class c ON ((c.oid = pol.polrelid))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))); +pg_prepared_statements| SELECT p.name, + p.statement, + p.prepare_time, + p.parameter_types, + p.from_sql, + p.generic_plans, + p.custom_plans + FROM pg_prepared_statement() p(name, statement, prepare_time, parameter_types, from_sql, generic_plans, custom_plans); +pg_prepared_xacts| SELECT p.transaction, + p.gid, + p.prepared, + u.rolname AS owner, + d.datname AS database + FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) + LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) + LEFT JOIN pg_database d ON ((p.dbid = d.oid))); +pg_publication_tables| SELECT p.pubname, + n.nspname AS schemaname, + c.relname AS tablename + FROM pg_publication p, + LATERAL pg_get_publication_tables((p.pubname)::text) gpt(relid), + (pg_class c + JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.oid = gpt.relid); +pg_replication_origin_status| SELECT pg_show_replication_origin_status.local_id, + pg_show_replication_origin_status.external_id, + pg_show_replication_origin_status.remote_lsn, + pg_show_replication_origin_status.local_lsn + FROM pg_show_replication_origin_status() pg_show_replication_origin_status(local_id, external_id, remote_lsn, local_lsn); +pg_replication_slots| SELECT l.slot_name, + l.plugin, + l.slot_type, + l.datoid, + d.datname AS database, + l.temporary, + l.active, + l.active_pid, + l.xmin, + l.catalog_xmin, + l.restart_lsn, + l.confirmed_flush_lsn, + l.wal_status, + l.safe_wal_size, + l.two_phase + FROM (pg_get_replication_slots() l(slot_name, plugin, slot_type, datoid, temporary, active, active_pid, xmin, catalog_xmin, restart_lsn, confirmed_flush_lsn, wal_status, safe_wal_size, two_phase) + LEFT JOIN pg_database d ON ((l.datoid = d.oid))); +pg_roles| SELECT pg_authid.rolname, + pg_authid.rolsuper, + pg_authid.rolinherit, + pg_authid.rolcreaterole, + pg_authid.rolcreatedb, + pg_authid.rolcanlogin, + pg_authid.rolreplication, + pg_authid.rolconnlimit, + '********'::text AS rolpassword, + pg_authid.rolvaliduntil, + pg_authid.rolbypassrls, + s.setconfig AS rolconfig, + pg_authid.oid + FROM (pg_authid + LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid)))); +pg_rules| SELECT n.nspname AS schemaname, + c.relname AS tablename, + r.rulename, + pg_get_ruledef(r.oid) AS definition + FROM ((pg_rewrite r + JOIN pg_class c ON ((c.oid = r.ev_class))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (r.rulename <> '_RETURN'::name); +pg_seclabels| SELECT l.objoid, + l.classoid, + l.objsubid, + CASE + WHEN (rel.relkind = ANY (ARRAY['r'::"char", 'p'::"char"])) THEN 'table'::text + WHEN (rel.relkind = 'v'::"char") THEN 'view'::text + WHEN (rel.relkind = 'm'::"char") THEN 'materialized view'::text + WHEN (rel.relkind = 'S'::"char") THEN 'sequence'::text + WHEN (rel.relkind = 'f'::"char") THEN 'foreign table'::text + ELSE NULL::text + END AS objtype, + rel.relnamespace AS objnamespace, + CASE + WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) + ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) + END AS objname, + l.provider, + l.label + FROM ((pg_seclabel l + JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) + JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) + WHERE (l.objsubid = 0) +UNION ALL + SELECT l.objoid, + l.classoid, + l.objsubid, + 'column'::text AS objtype, + rel.relnamespace AS objnamespace, + (( + CASE + WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) + ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) + END || '.'::text) || (att.attname)::text) AS objname, + l.provider, + l.label + FROM (((pg_seclabel l + JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) + JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum)))) + JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) + WHERE (l.objsubid <> 0) +UNION ALL + SELECT l.objoid, + l.classoid, + l.objsubid, + CASE pro.prokind + WHEN 'a'::"char" THEN 'aggregate'::text + WHEN 'f'::"char" THEN 'function'::text + WHEN 'p'::"char" THEN 'procedure'::text + WHEN 'w'::"char" THEN 'window'::text + ELSE NULL::text + END AS objtype, + pro.pronamespace AS objnamespace, + ((( + CASE + WHEN pg_function_is_visible(pro.oid) THEN quote_ident((pro.proname)::text) + ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((pro.proname)::text)) + END || '('::text) || pg_get_function_arguments(pro.oid)) || ')'::text) AS objname, + l.provider, + l.label + FROM ((pg_seclabel l + JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid)))) + JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid))) + WHERE (l.objsubid = 0) +UNION ALL + SELECT l.objoid, + l.classoid, + l.objsubid, + CASE + WHEN (typ.typtype = 'd'::"char") THEN 'domain'::text + ELSE 'type'::text + END AS objtype, + typ.typnamespace AS objnamespace, + CASE + WHEN pg_type_is_visible(typ.oid) THEN quote_ident((typ.typname)::text) + ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((typ.typname)::text)) + END AS objname, + l.provider, + l.label + FROM ((pg_seclabel l + JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid)))) + JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid))) + WHERE (l.objsubid = 0) +UNION ALL + SELECT l.objoid, + l.classoid, + l.objsubid, + 'large object'::text AS objtype, + NULL::oid AS objnamespace, + (l.objoid)::text AS objname, + l.provider, + l.label + FROM (pg_seclabel l + JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid))) + WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0)) +UNION ALL + SELECT l.objoid, + l.classoid, + l.objsubid, + 'language'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident((lan.lanname)::text) AS objname, + l.provider, + l.label + FROM (pg_seclabel l + JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid)))) + WHERE (l.objsubid = 0) +UNION ALL + SELECT l.objoid, + l.classoid, + l.objsubid, + 'schema'::text AS objtype, + nsp.oid AS objnamespace, + quote_ident((nsp.nspname)::text) AS objname, + l.provider, + l.label + FROM (pg_seclabel l + JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid)))) + WHERE (l.objsubid = 0) +UNION ALL + SELECT l.objoid, + l.classoid, + l.objsubid, + 'event trigger'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident((evt.evtname)::text) AS objname, + l.provider, + l.label + FROM (pg_seclabel l + JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid)))) + WHERE (l.objsubid = 0) +UNION ALL + SELECT l.objoid, + l.classoid, + l.objsubid, + 'publication'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident((p.pubname)::text) AS objname, + l.provider, + l.label + FROM (pg_seclabel l + JOIN pg_publication p ON (((l.classoid = p.tableoid) AND (l.objoid = p.oid)))) + WHERE (l.objsubid = 0) +UNION ALL + SELECT l.objoid, + l.classoid, + 0 AS objsubid, + 'subscription'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident((s.subname)::text) AS objname, + l.provider, + l.label + FROM (pg_shseclabel l + JOIN pg_subscription s ON (((l.classoid = s.tableoid) AND (l.objoid = s.oid)))) +UNION ALL + SELECT l.objoid, + l.classoid, + 0 AS objsubid, + 'database'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident((dat.datname)::text) AS objname, + l.provider, + l.label + FROM (pg_shseclabel l + JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid)))) +UNION ALL + SELECT l.objoid, + l.classoid, + 0 AS objsubid, + 'tablespace'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident((spc.spcname)::text) AS objname, + l.provider, + l.label + FROM (pg_shseclabel l + JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid)))) +UNION ALL + SELECT l.objoid, + l.classoid, + 0 AS objsubid, + 'role'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident((rol.rolname)::text) AS objname, + l.provider, + l.label + FROM (pg_shseclabel l + JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid)))); +pg_sequences| SELECT n.nspname AS schemaname, + c.relname AS sequencename, + pg_get_userbyid(c.relowner) AS sequenceowner, + (s.seqtypid)::regtype AS data_type, + s.seqstart AS start_value, + s.seqmin AS min_value, + s.seqmax AS max_value, + s.seqincrement AS increment_by, + s.seqcycle AS cycle, + s.seqcache AS cache_size, + CASE + WHEN has_sequence_privilege(c.oid, 'SELECT,USAGE'::text) THEN pg_sequence_last_value((c.oid)::regclass) + ELSE NULL::bigint + END AS last_value + FROM ((pg_sequence s + JOIN pg_class c ON ((c.oid = s.seqrelid))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE ((NOT pg_is_other_temp_schema(n.oid)) AND (c.relkind = 'S'::"char")); +pg_settings| SELECT a.name, + a.setting, + a.unit, + a.category, + a.short_desc, + a.extra_desc, + a.context, + a.vartype, + a.source, + a.min_val, + a.max_val, + a.enumvals, + a.boot_val, + a.reset_val, + a.sourcefile, + a.sourceline, + a.pending_restart + FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, sourcefile, sourceline, pending_restart); +pg_shadow| SELECT pg_authid.rolname AS usename, + pg_authid.oid AS usesysid, + pg_authid.rolcreatedb AS usecreatedb, + pg_authid.rolsuper AS usesuper, + pg_authid.rolreplication AS userepl, + pg_authid.rolbypassrls AS usebypassrls, + pg_authid.rolpassword AS passwd, + pg_authid.rolvaliduntil AS valuntil, + s.setconfig AS useconfig + FROM (pg_authid + LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid)))) + WHERE pg_authid.rolcanlogin; +pg_shmem_allocations| SELECT pg_get_shmem_allocations.name, + pg_get_shmem_allocations.off, + pg_get_shmem_allocations.size, + pg_get_shmem_allocations.allocated_size + FROM pg_get_shmem_allocations() pg_get_shmem_allocations(name, off, size, allocated_size); +pg_stat_activity| SELECT s.datid, + d.datname, + s.pid, + s.leader_pid, + s.usesysid, + u.rolname AS usename, + s.application_name, + s.client_addr, + s.client_hostname, + s.client_port, + s.backend_start, + s.xact_start, + s.query_start, + s.state_change, + s.wait_event_type, + s.wait_event, + s.state, + s.backend_xid, + s.backend_xmin, + s.query_id, + s.query, + s.backend_type + FROM ((pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, leader_pid, query_id) + LEFT JOIN pg_database d ON ((s.datid = d.oid))) + LEFT JOIN pg_authid u ON ((s.usesysid = u.oid))); +pg_stat_all_indexes| SELECT c.oid AS relid, + i.oid AS indexrelid, + n.nspname AS schemaname, + c.relname, + i.relname AS indexrelname, + pg_stat_get_numscans(i.oid) AS idx_scan, + pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, + pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch + FROM (((pg_class c + JOIN pg_index x ON ((c.oid = x.indrelid))) + JOIN pg_class i ON ((i.oid = x.indexrelid))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"])); +pg_stat_all_tables| SELECT c.oid AS relid, + n.nspname AS schemaname, + c.relname, + pg_stat_get_numscans(c.oid) AS seq_scan, + pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, + (sum(pg_stat_get_numscans(i.indexrelid)))::bigint AS idx_scan, + ((sum(pg_stat_get_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch, + pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(c.oid) AS n_tup_del, + pg_stat_get_tuples_hot_updated(c.oid) AS n_tup_hot_upd, + pg_stat_get_live_tuples(c.oid) AS n_live_tup, + pg_stat_get_dead_tuples(c.oid) AS n_dead_tup, + pg_stat_get_mod_since_analyze(c.oid) AS n_mod_since_analyze, + pg_stat_get_ins_since_vacuum(c.oid) AS n_ins_since_vacuum, + pg_stat_get_last_vacuum_time(c.oid) AS last_vacuum, + pg_stat_get_last_autovacuum_time(c.oid) AS last_autovacuum, + pg_stat_get_last_analyze_time(c.oid) AS last_analyze, + pg_stat_get_last_autoanalyze_time(c.oid) AS last_autoanalyze, + pg_stat_get_vacuum_count(c.oid) AS vacuum_count, + pg_stat_get_autovacuum_count(c.oid) AS autovacuum_count, + pg_stat_get_analyze_count(c.oid) AS analyze_count, + pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_count + FROM ((pg_class c + LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char", 'p'::"char"])) + GROUP BY c.oid, n.nspname, c.relname; +pg_stat_archiver| SELECT s.archived_count, + s.last_archived_wal, + s.last_archived_time, + s.failed_count, + s.last_failed_wal, + s.last_failed_time, + s.stats_reset + FROM pg_stat_get_archiver() s(archived_count, last_archived_wal, last_archived_time, failed_count, last_failed_wal, last_failed_time, stats_reset); +pg_stat_bgwriter| SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, + pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, + pg_stat_get_checkpoint_write_time() AS checkpoint_write_time, + pg_stat_get_checkpoint_sync_time() AS checkpoint_sync_time, + pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, + pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, + pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, + pg_stat_get_buf_written_backend() AS buffers_backend, + pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, + pg_stat_get_buf_alloc() AS buffers_alloc, + pg_stat_get_bgwriter_stat_reset_time() AS stats_reset; +pg_stat_database| SELECT d.oid AS datid, + d.datname, + CASE + WHEN (d.oid = (0)::oid) THEN 0 + ELSE pg_stat_get_db_numbackends(d.oid) + END AS numbackends, + pg_stat_get_db_xact_commit(d.oid) AS xact_commit, + pg_stat_get_db_xact_rollback(d.oid) AS xact_rollback, + (pg_stat_get_db_blocks_fetched(d.oid) - pg_stat_get_db_blocks_hit(d.oid)) AS blks_read, + pg_stat_get_db_blocks_hit(d.oid) AS blks_hit, + pg_stat_get_db_tuples_returned(d.oid) AS tup_returned, + pg_stat_get_db_tuples_fetched(d.oid) AS tup_fetched, + pg_stat_get_db_tuples_inserted(d.oid) AS tup_inserted, + pg_stat_get_db_tuples_updated(d.oid) AS tup_updated, + pg_stat_get_db_tuples_deleted(d.oid) AS tup_deleted, + pg_stat_get_db_conflict_all(d.oid) AS conflicts, + pg_stat_get_db_temp_files(d.oid) AS temp_files, + pg_stat_get_db_temp_bytes(d.oid) AS temp_bytes, + pg_stat_get_db_deadlocks(d.oid) AS deadlocks, + pg_stat_get_db_checksum_failures(d.oid) AS checksum_failures, + pg_stat_get_db_checksum_last_failure(d.oid) AS checksum_last_failure, + pg_stat_get_db_blk_read_time(d.oid) AS blk_read_time, + pg_stat_get_db_blk_write_time(d.oid) AS blk_write_time, + pg_stat_get_db_session_time(d.oid) AS session_time, + pg_stat_get_db_active_time(d.oid) AS active_time, + pg_stat_get_db_idle_in_transaction_time(d.oid) AS idle_in_transaction_time, + pg_stat_get_db_sessions(d.oid) AS sessions, + pg_stat_get_db_sessions_abandoned(d.oid) AS sessions_abandoned, + pg_stat_get_db_sessions_fatal(d.oid) AS sessions_fatal, + pg_stat_get_db_sessions_killed(d.oid) AS sessions_killed, + pg_stat_get_db_stat_reset_time(d.oid) AS stats_reset + FROM ( SELECT 0 AS oid, + NULL::name AS datname + UNION ALL + SELECT pg_database.oid, + pg_database.datname + FROM pg_database) d; +pg_stat_database_conflicts| SELECT d.oid AS datid, + d.datname, + pg_stat_get_db_conflict_tablespace(d.oid) AS confl_tablespace, + pg_stat_get_db_conflict_lock(d.oid) AS confl_lock, + pg_stat_get_db_conflict_snapshot(d.oid) AS confl_snapshot, + pg_stat_get_db_conflict_bufferpin(d.oid) AS confl_bufferpin, + pg_stat_get_db_conflict_startup_deadlock(d.oid) AS confl_deadlock + FROM pg_database d; +pg_stat_gssapi| SELECT s.pid, + s.gss_auth AS gss_authenticated, + s.gss_princ AS principal, + s.gss_enc AS encrypted + FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, leader_pid, query_id) + WHERE (s.client_port IS NOT NULL); +pg_stat_progress_analyze| SELECT s.pid, + s.datid, + d.datname, + s.relid, + CASE s.param1 + WHEN 0 THEN 'initializing'::text + WHEN 1 THEN 'acquiring sample rows'::text + WHEN 2 THEN 'acquiring inherited sample rows'::text + WHEN 3 THEN 'computing statistics'::text + WHEN 4 THEN 'computing extended statistics'::text + WHEN 5 THEN 'finalizing analyze'::text + ELSE NULL::text + END AS phase, + s.param2 AS sample_blks_total, + s.param3 AS sample_blks_scanned, + s.param4 AS ext_stats_total, + s.param5 AS ext_stats_computed, + s.param6 AS child_tables_total, + s.param7 AS child_tables_done, + (s.param8)::oid AS current_child_table_relid + FROM (pg_stat_get_progress_info('ANALYZE'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) + LEFT JOIN pg_database d ON ((s.datid = d.oid))); +pg_stat_progress_basebackup| SELECT s.pid, + CASE s.param1 + WHEN 0 THEN 'initializing'::text + WHEN 1 THEN 'waiting for checkpoint to finish'::text + WHEN 2 THEN 'estimating backup size'::text + WHEN 3 THEN 'streaming database files'::text + WHEN 4 THEN 'waiting for wal archiving to finish'::text + WHEN 5 THEN 'transferring wal files'::text + ELSE NULL::text + END AS phase, + CASE s.param2 + WHEN '-1'::integer THEN NULL::bigint + ELSE s.param2 + END AS backup_total, + s.param3 AS backup_streamed, + s.param4 AS tablespaces_total, + s.param5 AS tablespaces_streamed + FROM pg_stat_get_progress_info('BASEBACKUP'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); +pg_stat_progress_cluster| SELECT s.pid, + s.datid, + d.datname, + s.relid, + CASE s.param1 + WHEN 1 THEN 'CLUSTER'::text + WHEN 2 THEN 'VACUUM FULL'::text + ELSE NULL::text + END AS command, + CASE s.param2 + WHEN 0 THEN 'initializing'::text + WHEN 1 THEN 'seq scanning heap'::text + WHEN 2 THEN 'index scanning heap'::text + WHEN 3 THEN 'sorting tuples'::text + WHEN 4 THEN 'writing new heap'::text + WHEN 5 THEN 'swapping relation files'::text + WHEN 6 THEN 'rebuilding index'::text + WHEN 7 THEN 'performing final cleanup'::text + ELSE NULL::text + END AS phase, + (s.param3)::oid AS cluster_index_relid, + s.param4 AS heap_tuples_scanned, + s.param5 AS heap_tuples_written, + s.param6 AS heap_blks_total, + s.param7 AS heap_blks_scanned, + s.param8 AS index_rebuild_count + FROM (pg_stat_get_progress_info('CLUSTER'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) + LEFT JOIN pg_database d ON ((s.datid = d.oid))); +pg_stat_progress_copy| SELECT s.pid, + s.datid, + d.datname, + s.relid, + CASE s.param5 + WHEN 1 THEN 'COPY FROM'::text + WHEN 2 THEN 'COPY TO'::text + ELSE NULL::text + END AS command, + CASE s.param6 + WHEN 1 THEN 'FILE'::text + WHEN 2 THEN 'PROGRAM'::text + WHEN 3 THEN 'PIPE'::text + WHEN 4 THEN 'CALLBACK'::text + ELSE NULL::text + END AS type, + s.param1 AS bytes_processed, + s.param2 AS bytes_total, + s.param3 AS tuples_processed, + s.param4 AS tuples_excluded + FROM (pg_stat_get_progress_info('COPY'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) + LEFT JOIN pg_database d ON ((s.datid = d.oid))); +pg_stat_progress_create_index| SELECT s.pid, + s.datid, + d.datname, + s.relid, + (s.param7)::oid AS index_relid, + CASE s.param1 + WHEN 1 THEN 'CREATE INDEX'::text + WHEN 2 THEN 'CREATE INDEX CONCURRENTLY'::text + WHEN 3 THEN 'REINDEX'::text + WHEN 4 THEN 'REINDEX CONCURRENTLY'::text + ELSE NULL::text + END AS command, + CASE s.param10 + WHEN 0 THEN 'initializing'::text + WHEN 1 THEN 'waiting for writers before build'::text + WHEN 2 THEN ('building index'::text || COALESCE((': '::text || pg_indexam_progress_phasename((s.param9)::oid, s.param11)), ''::text)) + WHEN 3 THEN 'waiting for writers before validation'::text + WHEN 4 THEN 'index validation: scanning index'::text + WHEN 5 THEN 'index validation: sorting tuples'::text + WHEN 6 THEN 'index validation: scanning table'::text + WHEN 7 THEN 'waiting for old snapshots'::text + WHEN 8 THEN 'waiting for readers before marking dead'::text + WHEN 9 THEN 'waiting for readers before dropping'::text + ELSE NULL::text + END AS phase, + s.param4 AS lockers_total, + s.param5 AS lockers_done, + s.param6 AS current_locker_pid, + s.param16 AS blocks_total, + s.param17 AS blocks_done, + s.param12 AS tuples_total, + s.param13 AS tuples_done, + s.param14 AS partitions_total, + s.param15 AS partitions_done + FROM (pg_stat_get_progress_info('CREATE INDEX'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) + LEFT JOIN pg_database d ON ((s.datid = d.oid))); +pg_stat_progress_vacuum| SELECT s.pid, + s.datid, + d.datname, + s.relid, + CASE s.param1 + WHEN 0 THEN 'initializing'::text + WHEN 1 THEN 'scanning heap'::text + WHEN 2 THEN 'vacuuming indexes'::text + WHEN 3 THEN 'vacuuming heap'::text + WHEN 4 THEN 'cleaning up indexes'::text + WHEN 5 THEN 'truncating heap'::text + WHEN 6 THEN 'performing final cleanup'::text + ELSE NULL::text + END AS phase, + s.param2 AS heap_blks_total, + s.param3 AS heap_blks_scanned, + s.param4 AS heap_blks_vacuumed, + s.param5 AS index_vacuum_count, + s.param6 AS max_dead_tuples, + s.param7 AS num_dead_tuples + FROM (pg_stat_get_progress_info('VACUUM'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) + LEFT JOIN pg_database d ON ((s.datid = d.oid))); +pg_stat_replication| SELECT s.pid, + s.usesysid, + u.rolname AS usename, + s.application_name, + s.client_addr, + s.client_hostname, + s.client_port, + s.backend_start, + s.backend_xmin, + w.state, + w.sent_lsn, + w.write_lsn, + w.flush_lsn, + w.replay_lsn, + w.write_lag, + w.flush_lag, + w.replay_lag, + w.sync_priority, + w.sync_state, + w.reply_time + FROM ((pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, leader_pid, query_id) + JOIN pg_stat_get_wal_senders() w(pid, state, sent_lsn, write_lsn, flush_lsn, replay_lsn, write_lag, flush_lag, replay_lag, sync_priority, sync_state, reply_time) ON ((s.pid = w.pid))) + LEFT JOIN pg_authid u ON ((s.usesysid = u.oid))); +pg_stat_replication_slots| SELECT s.slot_name, + s.spill_txns, + s.spill_count, + s.spill_bytes, + s.stream_txns, + s.stream_count, + s.stream_bytes, + s.total_txns, + s.total_bytes, + s.stats_reset + FROM pg_replication_slots r, + LATERAL pg_stat_get_replication_slot((r.slot_name)::text) s(slot_name, spill_txns, spill_count, spill_bytes, stream_txns, stream_count, stream_bytes, total_txns, total_bytes, stats_reset) + WHERE (r.datoid IS NOT NULL); +pg_stat_slru| SELECT s.name, + s.blks_zeroed, + s.blks_hit, + s.blks_read, + s.blks_written, + s.blks_exists, + s.flushes, + s.truncates, + s.stats_reset + FROM pg_stat_get_slru() s(name, blks_zeroed, blks_hit, blks_read, blks_written, blks_exists, flushes, truncates, stats_reset); +pg_stat_ssl| SELECT s.pid, + s.ssl, + s.sslversion AS version, + s.sslcipher AS cipher, + s.sslbits AS bits, + s.ssl_client_dn AS client_dn, + s.ssl_client_serial AS client_serial, + s.ssl_issuer_dn AS issuer_dn + FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, leader_pid, query_id) + WHERE (s.client_port IS NOT NULL); +pg_stat_subscription| SELECT su.oid AS subid, + su.subname, + st.pid, + st.relid, + st.received_lsn, + st.last_msg_send_time, + st.last_msg_receipt_time, + st.latest_end_lsn, + st.latest_end_time + FROM (pg_subscription su + LEFT JOIN pg_stat_get_subscription(NULL::oid) st(subid, relid, pid, received_lsn, last_msg_send_time, last_msg_receipt_time, latest_end_lsn, latest_end_time) ON ((st.subid = su.oid))); +pg_stat_sys_indexes| SELECT pg_stat_all_indexes.relid, + pg_stat_all_indexes.indexrelid, + pg_stat_all_indexes.schemaname, + pg_stat_all_indexes.relname, + pg_stat_all_indexes.indexrelname, + pg_stat_all_indexes.idx_scan, + pg_stat_all_indexes.idx_tup_read, + pg_stat_all_indexes.idx_tup_fetch + FROM pg_stat_all_indexes + WHERE ((pg_stat_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_indexes.schemaname ~ '^pg_toast'::text)); +pg_stat_sys_tables| SELECT pg_stat_all_tables.relid, + pg_stat_all_tables.schemaname, + pg_stat_all_tables.relname, + pg_stat_all_tables.seq_scan, + pg_stat_all_tables.seq_tup_read, + pg_stat_all_tables.idx_scan, + pg_stat_all_tables.idx_tup_fetch, + pg_stat_all_tables.n_tup_ins, + pg_stat_all_tables.n_tup_upd, + pg_stat_all_tables.n_tup_del, + pg_stat_all_tables.n_tup_hot_upd, + pg_stat_all_tables.n_live_tup, + pg_stat_all_tables.n_dead_tup, + pg_stat_all_tables.n_mod_since_analyze, + pg_stat_all_tables.n_ins_since_vacuum, + pg_stat_all_tables.last_vacuum, + pg_stat_all_tables.last_autovacuum, + pg_stat_all_tables.last_analyze, + pg_stat_all_tables.last_autoanalyze, + pg_stat_all_tables.vacuum_count, + pg_stat_all_tables.autovacuum_count, + pg_stat_all_tables.analyze_count, + pg_stat_all_tables.autoanalyze_count + FROM pg_stat_all_tables + WHERE ((pg_stat_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_tables.schemaname ~ '^pg_toast'::text)); +pg_stat_user_functions| SELECT p.oid AS funcid, + n.nspname AS schemaname, + p.proname AS funcname, + pg_stat_get_function_calls(p.oid) AS calls, + pg_stat_get_function_total_time(p.oid) AS total_time, + pg_stat_get_function_self_time(p.oid) AS self_time + FROM (pg_proc p + LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) + WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_function_calls(p.oid) IS NOT NULL)); +pg_stat_user_indexes| SELECT pg_stat_all_indexes.relid, + pg_stat_all_indexes.indexrelid, + pg_stat_all_indexes.schemaname, + pg_stat_all_indexes.relname, + pg_stat_all_indexes.indexrelname, + pg_stat_all_indexes.idx_scan, + pg_stat_all_indexes.idx_tup_read, + pg_stat_all_indexes.idx_tup_fetch + FROM pg_stat_all_indexes + WHERE ((pg_stat_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_indexes.schemaname !~ '^pg_toast'::text)); +pg_stat_user_tables| SELECT pg_stat_all_tables.relid, + pg_stat_all_tables.schemaname, + pg_stat_all_tables.relname, + pg_stat_all_tables.seq_scan, + pg_stat_all_tables.seq_tup_read, + pg_stat_all_tables.idx_scan, + pg_stat_all_tables.idx_tup_fetch, + pg_stat_all_tables.n_tup_ins, + pg_stat_all_tables.n_tup_upd, + pg_stat_all_tables.n_tup_del, + pg_stat_all_tables.n_tup_hot_upd, + pg_stat_all_tables.n_live_tup, + pg_stat_all_tables.n_dead_tup, + pg_stat_all_tables.n_mod_since_analyze, + pg_stat_all_tables.n_ins_since_vacuum, + pg_stat_all_tables.last_vacuum, + pg_stat_all_tables.last_autovacuum, + pg_stat_all_tables.last_analyze, + pg_stat_all_tables.last_autoanalyze, + pg_stat_all_tables.vacuum_count, + pg_stat_all_tables.autovacuum_count, + pg_stat_all_tables.analyze_count, + pg_stat_all_tables.autoanalyze_count + FROM pg_stat_all_tables + WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text)); +pg_stat_wal| SELECT w.wal_records, + w.wal_fpi, + w.wal_bytes, + w.wal_buffers_full, + w.wal_write, + w.wal_sync, + w.wal_write_time, + w.wal_sync_time, + w.stats_reset + FROM pg_stat_get_wal() w(wal_records, wal_fpi, wal_bytes, wal_buffers_full, wal_write, wal_sync, wal_write_time, wal_sync_time, stats_reset); +pg_stat_wal_receiver| SELECT s.pid, + s.status, + s.receive_start_lsn, + s.receive_start_tli, + s.written_lsn, + s.flushed_lsn, + s.received_tli, + s.last_msg_send_time, + s.last_msg_receipt_time, + s.latest_end_lsn, + s.latest_end_time, + s.slot_name, + s.sender_host, + s.sender_port, + s.conninfo + FROM pg_stat_get_wal_receiver() s(pid, status, receive_start_lsn, receive_start_tli, written_lsn, flushed_lsn, received_tli, last_msg_send_time, last_msg_receipt_time, latest_end_lsn, latest_end_time, slot_name, sender_host, sender_port, conninfo) + WHERE (s.pid IS NOT NULL); +pg_stat_xact_all_tables| SELECT c.oid AS relid, + n.nspname AS schemaname, + c.relname, + pg_stat_get_xact_numscans(c.oid) AS seq_scan, + pg_stat_get_xact_tuples_returned(c.oid) AS seq_tup_read, + (sum(pg_stat_get_xact_numscans(i.indexrelid)))::bigint AS idx_scan, + ((sum(pg_stat_get_xact_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_xact_tuples_fetched(c.oid)) AS idx_tup_fetch, + pg_stat_get_xact_tuples_inserted(c.oid) AS n_tup_ins, + pg_stat_get_xact_tuples_updated(c.oid) AS n_tup_upd, + pg_stat_get_xact_tuples_deleted(c.oid) AS n_tup_del, + pg_stat_get_xact_tuples_hot_updated(c.oid) AS n_tup_hot_upd + FROM ((pg_class c + LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char", 'p'::"char"])) + GROUP BY c.oid, n.nspname, c.relname; +pg_stat_xact_sys_tables| SELECT pg_stat_xact_all_tables.relid, + pg_stat_xact_all_tables.schemaname, + pg_stat_xact_all_tables.relname, + pg_stat_xact_all_tables.seq_scan, + pg_stat_xact_all_tables.seq_tup_read, + pg_stat_xact_all_tables.idx_scan, + pg_stat_xact_all_tables.idx_tup_fetch, + pg_stat_xact_all_tables.n_tup_ins, + pg_stat_xact_all_tables.n_tup_upd, + pg_stat_xact_all_tables.n_tup_del, + pg_stat_xact_all_tables.n_tup_hot_upd + FROM pg_stat_xact_all_tables + WHERE ((pg_stat_xact_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_xact_all_tables.schemaname ~ '^pg_toast'::text)); +pg_stat_xact_user_functions| SELECT p.oid AS funcid, + n.nspname AS schemaname, + p.proname AS funcname, + pg_stat_get_xact_function_calls(p.oid) AS calls, + pg_stat_get_xact_function_total_time(p.oid) AS total_time, + pg_stat_get_xact_function_self_time(p.oid) AS self_time + FROM (pg_proc p + LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) + WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_xact_function_calls(p.oid) IS NOT NULL)); +pg_stat_xact_user_tables| SELECT pg_stat_xact_all_tables.relid, + pg_stat_xact_all_tables.schemaname, + pg_stat_xact_all_tables.relname, + pg_stat_xact_all_tables.seq_scan, + pg_stat_xact_all_tables.seq_tup_read, + pg_stat_xact_all_tables.idx_scan, + pg_stat_xact_all_tables.idx_tup_fetch, + pg_stat_xact_all_tables.n_tup_ins, + pg_stat_xact_all_tables.n_tup_upd, + pg_stat_xact_all_tables.n_tup_del, + pg_stat_xact_all_tables.n_tup_hot_upd + FROM pg_stat_xact_all_tables + WHERE ((pg_stat_xact_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_xact_all_tables.schemaname !~ '^pg_toast'::text)); +pg_statio_all_indexes| SELECT c.oid AS relid, + i.oid AS indexrelid, + n.nspname AS schemaname, + c.relname, + i.relname AS indexrelname, + (pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read, + pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit + FROM (((pg_class c + JOIN pg_index x ON ((c.oid = x.indrelid))) + JOIN pg_class i ON ((i.oid = x.indexrelid))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"])); +pg_statio_all_sequences| SELECT c.oid AS relid, + n.nspname AS schemaname, + c.relname, + (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS blks_read, + pg_stat_get_blocks_hit(c.oid) AS blks_hit + FROM (pg_class c + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.relkind = 'S'::"char"); +pg_statio_all_tables| SELECT c.oid AS relid, + n.nspname AS schemaname, + c.relname, + (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS heap_blks_read, + pg_stat_get_blocks_hit(c.oid) AS heap_blks_hit, + (sum((pg_stat_get_blocks_fetched(i.indexrelid) - pg_stat_get_blocks_hit(i.indexrelid))))::bigint AS idx_blks_read, + (sum(pg_stat_get_blocks_hit(i.indexrelid)))::bigint AS idx_blks_hit, + (pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read, + pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit, + (pg_stat_get_blocks_fetched(x.indexrelid) - pg_stat_get_blocks_hit(x.indexrelid)) AS tidx_blks_read, + pg_stat_get_blocks_hit(x.indexrelid) AS tidx_blks_hit + FROM ((((pg_class c + LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) + LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid))) + LEFT JOIN pg_index x ON ((t.oid = x.indrelid))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"])) + GROUP BY c.oid, n.nspname, c.relname, t.oid, x.indexrelid; +pg_statio_sys_indexes| SELECT pg_statio_all_indexes.relid, + pg_statio_all_indexes.indexrelid, + pg_statio_all_indexes.schemaname, + pg_statio_all_indexes.relname, + pg_statio_all_indexes.indexrelname, + pg_statio_all_indexes.idx_blks_read, + pg_statio_all_indexes.idx_blks_hit + FROM pg_statio_all_indexes + WHERE ((pg_statio_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_indexes.schemaname ~ '^pg_toast'::text)); +pg_statio_sys_sequences| SELECT pg_statio_all_sequences.relid, + pg_statio_all_sequences.schemaname, + pg_statio_all_sequences.relname, + pg_statio_all_sequences.blks_read, + pg_statio_all_sequences.blks_hit + FROM pg_statio_all_sequences + WHERE ((pg_statio_all_sequences.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_sequences.schemaname ~ '^pg_toast'::text)); +pg_statio_sys_tables| SELECT pg_statio_all_tables.relid, + pg_statio_all_tables.schemaname, + pg_statio_all_tables.relname, + pg_statio_all_tables.heap_blks_read, + pg_statio_all_tables.heap_blks_hit, + pg_statio_all_tables.idx_blks_read, + pg_statio_all_tables.idx_blks_hit, + pg_statio_all_tables.toast_blks_read, + pg_statio_all_tables.toast_blks_hit, + pg_statio_all_tables.tidx_blks_read, + pg_statio_all_tables.tidx_blks_hit + FROM pg_statio_all_tables + WHERE ((pg_statio_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_tables.schemaname ~ '^pg_toast'::text)); +pg_statio_user_indexes| SELECT pg_statio_all_indexes.relid, + pg_statio_all_indexes.indexrelid, + pg_statio_all_indexes.schemaname, + pg_statio_all_indexes.relname, + pg_statio_all_indexes.indexrelname, + pg_statio_all_indexes.idx_blks_read, + pg_statio_all_indexes.idx_blks_hit + FROM pg_statio_all_indexes + WHERE ((pg_statio_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_indexes.schemaname !~ '^pg_toast'::text)); +pg_statio_user_sequences| SELECT pg_statio_all_sequences.relid, + pg_statio_all_sequences.schemaname, + pg_statio_all_sequences.relname, + pg_statio_all_sequences.blks_read, + pg_statio_all_sequences.blks_hit + FROM pg_statio_all_sequences + WHERE ((pg_statio_all_sequences.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_sequences.schemaname !~ '^pg_toast'::text)); +pg_statio_user_tables| SELECT pg_statio_all_tables.relid, + pg_statio_all_tables.schemaname, + pg_statio_all_tables.relname, + pg_statio_all_tables.heap_blks_read, + pg_statio_all_tables.heap_blks_hit, + pg_statio_all_tables.idx_blks_read, + pg_statio_all_tables.idx_blks_hit, + pg_statio_all_tables.toast_blks_read, + pg_statio_all_tables.toast_blks_hit, + pg_statio_all_tables.tidx_blks_read, + pg_statio_all_tables.tidx_blks_hit + FROM pg_statio_all_tables + WHERE ((pg_statio_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_tables.schemaname !~ '^pg_toast'::text)); +pg_stats| SELECT n.nspname AS schemaname, + c.relname AS tablename, + a.attname, + s.stainherit AS inherited, + s.stanullfrac AS null_frac, + s.stawidth AS avg_width, + s.stadistinct AS n_distinct, + CASE + WHEN (s.stakind1 = 1) THEN s.stavalues1 + WHEN (s.stakind2 = 1) THEN s.stavalues2 + WHEN (s.stakind3 = 1) THEN s.stavalues3 + WHEN (s.stakind4 = 1) THEN s.stavalues4 + WHEN (s.stakind5 = 1) THEN s.stavalues5 + ELSE NULL::anyarray + END AS most_common_vals, + CASE + WHEN (s.stakind1 = 1) THEN s.stanumbers1 + WHEN (s.stakind2 = 1) THEN s.stanumbers2 + WHEN (s.stakind3 = 1) THEN s.stanumbers3 + WHEN (s.stakind4 = 1) THEN s.stanumbers4 + WHEN (s.stakind5 = 1) THEN s.stanumbers5 + ELSE NULL::real[] + END AS most_common_freqs, + CASE + WHEN (s.stakind1 = 2) THEN s.stavalues1 + WHEN (s.stakind2 = 2) THEN s.stavalues2 + WHEN (s.stakind3 = 2) THEN s.stavalues3 + WHEN (s.stakind4 = 2) THEN s.stavalues4 + WHEN (s.stakind5 = 2) THEN s.stavalues5 + ELSE NULL::anyarray + END AS histogram_bounds, + CASE + WHEN (s.stakind1 = 3) THEN s.stanumbers1[1] + WHEN (s.stakind2 = 3) THEN s.stanumbers2[1] + WHEN (s.stakind3 = 3) THEN s.stanumbers3[1] + WHEN (s.stakind4 = 3) THEN s.stanumbers4[1] + WHEN (s.stakind5 = 3) THEN s.stanumbers5[1] + ELSE NULL::real + END AS correlation, + CASE + WHEN (s.stakind1 = 4) THEN s.stavalues1 + WHEN (s.stakind2 = 4) THEN s.stavalues2 + WHEN (s.stakind3 = 4) THEN s.stavalues3 + WHEN (s.stakind4 = 4) THEN s.stavalues4 + WHEN (s.stakind5 = 4) THEN s.stavalues5 + ELSE NULL::anyarray + END AS most_common_elems, + CASE + WHEN (s.stakind1 = 4) THEN s.stanumbers1 + WHEN (s.stakind2 = 4) THEN s.stanumbers2 + WHEN (s.stakind3 = 4) THEN s.stanumbers3 + WHEN (s.stakind4 = 4) THEN s.stanumbers4 + WHEN (s.stakind5 = 4) THEN s.stanumbers5 + ELSE NULL::real[] + END AS most_common_elem_freqs, + CASE + WHEN (s.stakind1 = 5) THEN s.stanumbers1 + WHEN (s.stakind2 = 5) THEN s.stanumbers2 + WHEN (s.stakind3 = 5) THEN s.stanumbers3 + WHEN (s.stakind4 = 5) THEN s.stanumbers4 + WHEN (s.stakind5 = 5) THEN s.stanumbers5 + ELSE NULL::real[] + END AS elem_count_histogram + FROM (((pg_statistic s + JOIN pg_class c ON ((c.oid = s.starelid))) + JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum)))) + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE ((NOT a.attisdropped) AND has_column_privilege(c.oid, a.attnum, 'select'::text) AND ((c.relrowsecurity = false) OR (NOT row_security_active(c.oid)))); +pg_stats_ext| SELECT cn.nspname AS schemaname, + c.relname AS tablename, + sn.nspname AS statistics_schemaname, + s.stxname AS statistics_name, + pg_get_userbyid(s.stxowner) AS statistics_owner, + ( SELECT array_agg(a.attname ORDER BY a.attnum) AS array_agg + FROM (unnest(s.stxkeys) k(k) + JOIN pg_attribute a ON (((a.attrelid = s.stxrelid) AND (a.attnum = k.k))))) AS attnames, + pg_get_statisticsobjdef_expressions(s.oid) AS exprs, + s.stxkind AS kinds, + sd.stxdndistinct AS n_distinct, + sd.stxddependencies AS dependencies, + m.most_common_vals, + m.most_common_val_nulls, + m.most_common_freqs, + m.most_common_base_freqs + FROM (((((pg_statistic_ext s + JOIN pg_class c ON ((c.oid = s.stxrelid))) + JOIN pg_statistic_ext_data sd ON ((s.oid = sd.stxoid))) + LEFT JOIN pg_namespace cn ON ((cn.oid = c.relnamespace))) + LEFT JOIN pg_namespace sn ON ((sn.oid = s.stxnamespace))) + LEFT JOIN LATERAL ( SELECT array_agg(pg_mcv_list_items."values") AS most_common_vals, + array_agg(pg_mcv_list_items.nulls) AS most_common_val_nulls, + array_agg(pg_mcv_list_items.frequency) AS most_common_freqs, + array_agg(pg_mcv_list_items.base_frequency) AS most_common_base_freqs + FROM pg_mcv_list_items(sd.stxdmcv) pg_mcv_list_items(index, "values", nulls, frequency, base_frequency)) m ON ((sd.stxdmcv IS NOT NULL))) + WHERE ((NOT (EXISTS ( SELECT 1 + FROM (unnest(s.stxkeys) k(k) + JOIN pg_attribute a ON (((a.attrelid = s.stxrelid) AND (a.attnum = k.k)))) + WHERE (NOT has_column_privilege(c.oid, a.attnum, 'select'::text))))) AND ((c.relrowsecurity = false) OR (NOT row_security_active(c.oid)))); +pg_stats_ext_exprs| SELECT cn.nspname AS schemaname, + c.relname AS tablename, + sn.nspname AS statistics_schemaname, + s.stxname AS statistics_name, + pg_get_userbyid(s.stxowner) AS statistics_owner, + stat.expr, + (stat.a).stanullfrac AS null_frac, + (stat.a).stawidth AS avg_width, + (stat.a).stadistinct AS n_distinct, + CASE + WHEN ((stat.a).stakind1 = 1) THEN (stat.a).stavalues1 + WHEN ((stat.a).stakind2 = 1) THEN (stat.a).stavalues2 + WHEN ((stat.a).stakind3 = 1) THEN (stat.a).stavalues3 + WHEN ((stat.a).stakind4 = 1) THEN (stat.a).stavalues4 + WHEN ((stat.a).stakind5 = 1) THEN (stat.a).stavalues5 + ELSE NULL::anyarray + END AS most_common_vals, + CASE + WHEN ((stat.a).stakind1 = 1) THEN (stat.a).stanumbers1 + WHEN ((stat.a).stakind2 = 1) THEN (stat.a).stanumbers2 + WHEN ((stat.a).stakind3 = 1) THEN (stat.a).stanumbers3 + WHEN ((stat.a).stakind4 = 1) THEN (stat.a).stanumbers4 + WHEN ((stat.a).stakind5 = 1) THEN (stat.a).stanumbers5 + ELSE NULL::real[] + END AS most_common_freqs, + CASE + WHEN ((stat.a).stakind1 = 2) THEN (stat.a).stavalues1 + WHEN ((stat.a).stakind2 = 2) THEN (stat.a).stavalues2 + WHEN ((stat.a).stakind3 = 2) THEN (stat.a).stavalues3 + WHEN ((stat.a).stakind4 = 2) THEN (stat.a).stavalues4 + WHEN ((stat.a).stakind5 = 2) THEN (stat.a).stavalues5 + ELSE NULL::anyarray + END AS histogram_bounds, + CASE + WHEN ((stat.a).stakind1 = 3) THEN (stat.a).stanumbers1[1] + WHEN ((stat.a).stakind2 = 3) THEN (stat.a).stanumbers2[1] + WHEN ((stat.a).stakind3 = 3) THEN (stat.a).stanumbers3[1] + WHEN ((stat.a).stakind4 = 3) THEN (stat.a).stanumbers4[1] + WHEN ((stat.a).stakind5 = 3) THEN (stat.a).stanumbers5[1] + ELSE NULL::real + END AS correlation, + CASE + WHEN ((stat.a).stakind1 = 4) THEN (stat.a).stavalues1 + WHEN ((stat.a).stakind2 = 4) THEN (stat.a).stavalues2 + WHEN ((stat.a).stakind3 = 4) THEN (stat.a).stavalues3 + WHEN ((stat.a).stakind4 = 4) THEN (stat.a).stavalues4 + WHEN ((stat.a).stakind5 = 4) THEN (stat.a).stavalues5 + ELSE NULL::anyarray + END AS most_common_elems, + CASE + WHEN ((stat.a).stakind1 = 4) THEN (stat.a).stanumbers1 + WHEN ((stat.a).stakind2 = 4) THEN (stat.a).stanumbers2 + WHEN ((stat.a).stakind3 = 4) THEN (stat.a).stanumbers3 + WHEN ((stat.a).stakind4 = 4) THEN (stat.a).stanumbers4 + WHEN ((stat.a).stakind5 = 4) THEN (stat.a).stanumbers5 + ELSE NULL::real[] + END AS most_common_elem_freqs, + CASE + WHEN ((stat.a).stakind1 = 5) THEN (stat.a).stanumbers1 + WHEN ((stat.a).stakind2 = 5) THEN (stat.a).stanumbers2 + WHEN ((stat.a).stakind3 = 5) THEN (stat.a).stanumbers3 + WHEN ((stat.a).stakind4 = 5) THEN (stat.a).stanumbers4 + WHEN ((stat.a).stakind5 = 5) THEN (stat.a).stanumbers5 + ELSE NULL::real[] + END AS elem_count_histogram + FROM (((((pg_statistic_ext s + JOIN pg_class c ON ((c.oid = s.stxrelid))) + LEFT JOIN pg_statistic_ext_data sd ON ((s.oid = sd.stxoid))) + LEFT JOIN pg_namespace cn ON ((cn.oid = c.relnamespace))) + LEFT JOIN pg_namespace sn ON ((sn.oid = s.stxnamespace))) + JOIN LATERAL ( SELECT unnest(pg_get_statisticsobjdef_expressions(s.oid)) AS expr, + unnest(sd.stxdexpr) AS a) stat ON ((stat.expr IS NOT NULL))); +pg_tables| SELECT n.nspname AS schemaname, + c.relname AS tablename, + pg_get_userbyid(c.relowner) AS tableowner, + t.spcname AS tablespace, + c.relhasindex AS hasindexes, + c.relhasrules AS hasrules, + c.relhastriggers AS hastriggers, + c.relrowsecurity AS rowsecurity + FROM ((pg_class c + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) + WHERE (c.relkind = ANY (ARRAY['r'::"char", 'p'::"char"])); +pg_timezone_abbrevs| SELECT pg_timezone_abbrevs.abbrev, + pg_timezone_abbrevs.utc_offset, + pg_timezone_abbrevs.is_dst + FROM pg_timezone_abbrevs() pg_timezone_abbrevs(abbrev, utc_offset, is_dst); +pg_timezone_names| SELECT pg_timezone_names.name, + pg_timezone_names.abbrev, + pg_timezone_names.utc_offset, + pg_timezone_names.is_dst + FROM pg_timezone_names() pg_timezone_names(name, abbrev, utc_offset, is_dst); +pg_user| SELECT pg_shadow.usename, + pg_shadow.usesysid, + pg_shadow.usecreatedb, + pg_shadow.usesuper, + pg_shadow.userepl, + pg_shadow.usebypassrls, + '********'::text AS passwd, + pg_shadow.valuntil, + pg_shadow.useconfig + FROM pg_shadow; +pg_user_mappings| SELECT u.oid AS umid, + s.oid AS srvid, + s.srvname, + u.umuser, + CASE + WHEN (u.umuser = (0)::oid) THEN 'public'::name + ELSE a.rolname + END AS usename, + CASE + WHEN (((u.umuser <> (0)::oid) AND (a.rolname = CURRENT_USER) AND (pg_has_role(s.srvowner, 'USAGE'::text) OR has_server_privilege(s.oid, 'USAGE'::text))) OR ((u.umuser = (0)::oid) AND pg_has_role(s.srvowner, 'USAGE'::text)) OR ( SELECT pg_authid.rolsuper + FROM pg_authid + WHERE (pg_authid.rolname = CURRENT_USER))) THEN u.umoptions + ELSE NULL::text[] + END AS umoptions + FROM ((pg_user_mapping u + JOIN pg_foreign_server s ON ((u.umserver = s.oid))) + LEFT JOIN pg_authid a ON ((a.oid = u.umuser))); +pg_views| SELECT n.nspname AS schemaname, + c.relname AS viewname, + pg_get_userbyid(c.relowner) AS viewowner, + pg_get_viewdef(c.oid) AS definition + FROM (pg_class c + LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.relkind = 'v'::"char"); +rtest_v1| SELECT rtest_t1.a, + rtest_t1.b + FROM rtest_t1; +rtest_vcomp| SELECT x.part, + (x.size * y.factor) AS size_in_cm + FROM rtest_comp x, + rtest_unitfact y + WHERE (x.unit = y.unit); +rtest_vview1| SELECT x.a, + x.b + FROM rtest_view1 x + WHERE (0 < ( SELECT count(*) AS count + FROM rtest_view2 y + WHERE (y.a = x.a))); +rtest_vview2| SELECT rtest_view1.a, + rtest_view1.b + FROM rtest_view1 + WHERE rtest_view1.v; +rtest_vview3| SELECT x.a, + x.b + FROM rtest_vview2 x + WHERE (0 < ( SELECT count(*) AS count + FROM rtest_view2 y + WHERE (y.a = x.a))); +rtest_vview4| SELECT x.a, + x.b, + count(y.a) AS refcount + FROM rtest_view1 x, + rtest_view2 y + WHERE (x.a = y.a) + GROUP BY x.a, x.b; +rtest_vview5| SELECT rtest_view1.a, + rtest_view1.b, + rtest_viewfunc1(rtest_view1.a) AS refcount + FROM rtest_view1; +shoe| SELECT sh.shoename, + sh.sh_avail, + sh.slcolor, + sh.slminlen, + (sh.slminlen * un.un_fact) AS slminlen_cm, + sh.slmaxlen, + (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, + sh.slunit + FROM shoe_data sh, + unit un + WHERE (sh.slunit = un.un_name); +shoe_ready| SELECT rsh.shoename, + rsh.sh_avail, + rsl.sl_name, + rsl.sl_avail, + int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail + FROM shoe rsh, + shoelace rsl + WHERE ((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >= rsh.slminlen_cm) AND (rsl.sl_len_cm <= rsh.slmaxlen_cm)); +shoelace| SELECT s.sl_name, + s.sl_avail, + s.sl_color, + s.sl_len, + s.sl_unit, + (s.sl_len * u.un_fact) AS sl_len_cm + FROM shoelace_data s, + unit u + WHERE (s.sl_unit = u.un_name); +shoelace_candelete| SELECT shoelace_obsolete.sl_name, + shoelace_obsolete.sl_avail, + shoelace_obsolete.sl_color, + shoelace_obsolete.sl_len, + shoelace_obsolete.sl_unit, + shoelace_obsolete.sl_len_cm + FROM shoelace_obsolete + WHERE (shoelace_obsolete.sl_avail = 0); +shoelace_obsolete| SELECT shoelace.sl_name, + shoelace.sl_avail, + shoelace.sl_color, + shoelace.sl_len, + shoelace.sl_unit, + shoelace.sl_len_cm + FROM shoelace + WHERE (NOT (EXISTS ( SELECT shoe.shoename + FROM shoe + WHERE (shoe.slcolor = shoelace.sl_color)))); +street| SELECT r.name, + r.thepath, + c.cname + FROM ONLY road r, + real_city c + WHERE (c.outline ## r.thepath); +test_tablesample_v1| SELECT test_tablesample.id + FROM test_tablesample TABLESAMPLE system ((10 * 2)) REPEATABLE (2); +test_tablesample_v2| SELECT test_tablesample.id + FROM test_tablesample TABLESAMPLE system (99); +toyemp| SELECT emp.name, + emp.age, + emp.location, + (12 * emp.salary) AS annualsal + FROM emp; +SELECT tablename, rulename, definition FROM pg_rules +WHERE schemaname IN ('pg_catalog', 'public') +ORDER BY tablename, rulename; +pg_settings|pg_settings_n|CREATE RULE pg_settings_n AS + ON UPDATE TO pg_catalog.pg_settings DO INSTEAD NOTHING; +pg_settings|pg_settings_u|CREATE RULE pg_settings_u AS + ON UPDATE TO pg_catalog.pg_settings + WHERE (new.name = old.name) DO SELECT set_config(old.name, new.setting, false) AS set_config; +rtest_emp|rtest_emp_del|CREATE RULE rtest_emp_del AS + ON DELETE TO public.rtest_emp DO INSERT INTO rtest_emplog (ename, who, action, newsal, oldsal) + VALUES (old.ename, CURRENT_USER, 'fired'::bpchar, '$0.00'::money, old.salary); +rtest_emp|rtest_emp_ins|CREATE RULE rtest_emp_ins AS + ON INSERT TO public.rtest_emp DO INSERT INTO rtest_emplog (ename, who, action, newsal, oldsal) + VALUES (new.ename, CURRENT_USER, 'hired'::bpchar, new.salary, '$0.00'::money); +rtest_emp|rtest_emp_upd|CREATE RULE rtest_emp_upd AS + ON UPDATE TO public.rtest_emp + WHERE (new.salary <> old.salary) DO INSERT INTO rtest_emplog (ename, who, action, newsal, oldsal) + VALUES (new.ename, CURRENT_USER, 'honored'::bpchar, new.salary, old.salary); +rtest_nothn1|rtest_nothn_r1|CREATE RULE rtest_nothn_r1 AS + ON INSERT TO public.rtest_nothn1 + WHERE ((new.a >= 10) AND (new.a < 20)) DO INSTEAD NOTHING; +rtest_nothn1|rtest_nothn_r2|CREATE RULE rtest_nothn_r2 AS + ON INSERT TO public.rtest_nothn1 + WHERE ((new.a >= 30) AND (new.a < 40)) DO INSTEAD NOTHING; +rtest_nothn2|rtest_nothn_r3|CREATE RULE rtest_nothn_r3 AS + ON INSERT TO public.rtest_nothn2 + WHERE (new.a >= 100) DO INSTEAD INSERT INTO rtest_nothn3 (a, b) + VALUES (new.a, new.b); +rtest_nothn2|rtest_nothn_r4|CREATE RULE rtest_nothn_r4 AS + ON INSERT TO public.rtest_nothn2 DO INSTEAD NOTHING; +rtest_order1|rtest_order_r1|CREATE RULE rtest_order_r1 AS + ON INSERT TO public.rtest_order1 DO INSTEAD INSERT INTO rtest_order2 (a, b, c) + VALUES (new.a, nextval('rtest_seq'::regclass), 'rule 1 - this should run 1st'::text); +rtest_order1|rtest_order_r2|CREATE RULE rtest_order_r2 AS + ON INSERT TO public.rtest_order1 DO INSERT INTO rtest_order2 (a, b, c) + VALUES (new.a, nextval('rtest_seq'::regclass), 'rule 2 - this should run 2nd'::text); +rtest_order1|rtest_order_r3|CREATE RULE rtest_order_r3 AS + ON INSERT TO public.rtest_order1 DO INSTEAD INSERT INTO rtest_order2 (a, b, c) + VALUES (new.a, nextval('rtest_seq'::regclass), 'rule 3 - this should run 3rd'::text); +rtest_order1|rtest_order_r4|CREATE RULE rtest_order_r4 AS + ON INSERT TO public.rtest_order1 + WHERE (new.a < 100) DO INSTEAD INSERT INTO rtest_order2 (a, b, c) + VALUES (new.a, nextval('rtest_seq'::regclass), 'rule 4 - this should run 4th'::text); +rtest_person|rtest_pers_del|CREATE RULE rtest_pers_del AS + ON DELETE TO public.rtest_person DO DELETE FROM rtest_admin + WHERE (rtest_admin.pname = old.pname); +rtest_person|rtest_pers_upd|CREATE RULE rtest_pers_upd AS + ON UPDATE TO public.rtest_person DO UPDATE rtest_admin SET pname = new.pname + WHERE (rtest_admin.pname = old.pname); +rtest_system|rtest_sys_del|CREATE RULE rtest_sys_del AS + ON DELETE TO public.rtest_system DO ( DELETE FROM rtest_interface + WHERE (rtest_interface.sysname = old.sysname); + DELETE FROM rtest_admin + WHERE (rtest_admin.sysname = old.sysname); +); +rtest_system|rtest_sys_upd|CREATE RULE rtest_sys_upd AS + ON UPDATE TO public.rtest_system DO ( UPDATE rtest_interface SET sysname = new.sysname + WHERE (rtest_interface.sysname = old.sysname); + UPDATE rtest_admin SET sysname = new.sysname + WHERE (rtest_admin.sysname = old.sysname); +); +rtest_t4|rtest_t4_ins1|CREATE RULE rtest_t4_ins1 AS + ON INSERT TO public.rtest_t4 + WHERE ((new.a >= 10) AND (new.a < 20)) DO INSTEAD INSERT INTO rtest_t5 (a, b) + VALUES (new.a, new.b); +rtest_t4|rtest_t4_ins2|CREATE RULE rtest_t4_ins2 AS + ON INSERT TO public.rtest_t4 + WHERE ((new.a >= 20) AND (new.a < 30)) DO INSERT INTO rtest_t6 (a, b) + VALUES (new.a, new.b); +rtest_t5|rtest_t5_ins|CREATE RULE rtest_t5_ins AS + ON INSERT TO public.rtest_t5 + WHERE (new.a > 15) DO INSERT INTO rtest_t7 (a, b) + VALUES (new.a, new.b); +rtest_t6|rtest_t6_ins|CREATE RULE rtest_t6_ins AS + ON INSERT TO public.rtest_t6 + WHERE (new.a > 25) DO INSTEAD INSERT INTO rtest_t8 (a, b) + VALUES (new.a, new.b); +rtest_v1|rtest_v1_del|CREATE RULE rtest_v1_del AS + ON DELETE TO public.rtest_v1 DO INSTEAD DELETE FROM rtest_t1 + WHERE (rtest_t1.a = old.a); +rtest_v1|rtest_v1_ins|CREATE RULE rtest_v1_ins AS + ON INSERT TO public.rtest_v1 DO INSTEAD INSERT INTO rtest_t1 (a, b) + VALUES (new.a, new.b); +rtest_v1|rtest_v1_upd|CREATE RULE rtest_v1_upd AS + ON UPDATE TO public.rtest_v1 DO INSTEAD UPDATE rtest_t1 SET a = new.a, b = new.b + WHERE (rtest_t1.a = old.a); +shoelace|shoelace_del|CREATE RULE shoelace_del AS + ON DELETE TO public.shoelace DO INSTEAD DELETE FROM shoelace_data + WHERE (shoelace_data.sl_name = old.sl_name); +shoelace|shoelace_ins|CREATE RULE shoelace_ins AS + ON INSERT TO public.shoelace DO INSTEAD INSERT INTO shoelace_data (sl_name, sl_avail, sl_color, sl_len, sl_unit) + VALUES (new.sl_name, new.sl_avail, new.sl_color, new.sl_len, new.sl_unit); +shoelace|shoelace_upd|CREATE RULE shoelace_upd AS + ON UPDATE TO public.shoelace DO INSTEAD UPDATE shoelace_data SET sl_name = new.sl_name, sl_avail = new.sl_avail, sl_color = new.sl_color, sl_len = new.sl_len, sl_unit = new.sl_unit + WHERE (shoelace_data.sl_name = old.sl_name); +shoelace_data|log_shoelace|CREATE RULE log_shoelace AS + ON UPDATE TO public.shoelace_data + WHERE (new.sl_avail <> old.sl_avail) DO INSERT INTO shoelace_log (sl_name, sl_avail, log_who, log_when) + VALUES (new.sl_name, new.sl_avail, 'Al Bundy'::name, 'Thu Jan 01 00:00:00 1970'::timestamp without time zone); +shoelace_ok|shoelace_ok_ins|CREATE RULE shoelace_ok_ins AS + ON INSERT TO public.shoelace_ok DO INSTEAD UPDATE shoelace SET sl_avail = (shoelace.sl_avail + new.ok_quant) + WHERE (shoelace.sl_name = new.ok_name); +-- restore normal output mode +\a\t +-- +-- CREATE OR REPLACE RULE +-- +CREATE TABLE ruletest_tbl (a int, b int); +CREATE TABLE ruletest_tbl2 (a int, b int); +CREATE OR REPLACE RULE myrule AS ON INSERT TO ruletest_tbl + DO INSTEAD INSERT INTO ruletest_tbl2 VALUES (10, 10); +INSERT INTO ruletest_tbl VALUES (99, 99); +CREATE OR REPLACE RULE myrule AS ON INSERT TO ruletest_tbl + DO INSTEAD INSERT INTO ruletest_tbl2 VALUES (1000, 1000); +INSERT INTO ruletest_tbl VALUES (99, 99); +SELECT * FROM ruletest_tbl2; + a | b +------+------ + 10 | 10 + 1000 | 1000 +(2 rows) + +-- Check that rewrite rules splitting one INSERT into multiple +-- conditional statements does not disable FK checking. +create table rule_and_refint_t1 ( + id1a integer, + id1b integer, + primary key (id1a, id1b) +); +create table rule_and_refint_t2 ( + id2a integer, + id2c integer, + primary key (id2a, id2c) +); +create table rule_and_refint_t3 ( + id3a integer, + id3b integer, + id3c integer, + data text, + primary key (id3a, id3b, id3c), + foreign key (id3a, id3b) references rule_and_refint_t1 (id1a, id1b), + foreign key (id3a, id3c) references rule_and_refint_t2 (id2a, id2c) +); +insert into rule_and_refint_t1 values (1, 11); +insert into rule_and_refint_t1 values (1, 12); +insert into rule_and_refint_t1 values (2, 21); +insert into rule_and_refint_t1 values (2, 22); +insert into rule_and_refint_t2 values (1, 11); +insert into rule_and_refint_t2 values (1, 12); +insert into rule_and_refint_t2 values (2, 21); +insert into rule_and_refint_t2 values (2, 22); +insert into rule_and_refint_t3 values (1, 11, 11, 'row1'); +insert into rule_and_refint_t3 values (1, 11, 12, 'row2'); +insert into rule_and_refint_t3 values (1, 12, 11, 'row3'); +insert into rule_and_refint_t3 values (1, 12, 12, 'row4'); +insert into rule_and_refint_t3 values (1, 11, 13, 'row5'); +ERROR: insert or update on table "rule_and_refint_t3" violates foreign key constraint "rule_and_refint_t3_id3a_id3c_fkey" +DETAIL: Key (id3a, id3c)=(1, 13) is not present in table "rule_and_refint_t2". +insert into rule_and_refint_t3 values (1, 13, 11, 'row6'); +ERROR: insert or update on table "rule_and_refint_t3" violates foreign key constraint "rule_and_refint_t3_id3a_id3b_fkey" +DETAIL: Key (id3a, id3b)=(1, 13) is not present in table "rule_and_refint_t1". +-- Ordinary table +insert into rule_and_refint_t3 values (1, 13, 11, 'row6') + on conflict do nothing; +ERROR: insert or update on table "rule_and_refint_t3" violates foreign key constraint "rule_and_refint_t3_id3a_id3b_fkey" +DETAIL: Key (id3a, id3b)=(1, 13) is not present in table "rule_and_refint_t1". +-- rule not fired, so fk violation +insert into rule_and_refint_t3 values (1, 13, 11, 'row6') + on conflict (id3a, id3b, id3c) do update + set id3b = excluded.id3b; +ERROR: insert or update on table "rule_and_refint_t3" violates foreign key constraint "rule_and_refint_t3_id3a_id3b_fkey" +DETAIL: Key (id3a, id3b)=(1, 13) is not present in table "rule_and_refint_t1". +-- rule fired, so unsupported +insert into shoelace values ('sl9', 0, 'pink', 35.0, 'inch', 0.0) + on conflict (sl_name) do update + set sl_avail = excluded.sl_avail; +ERROR: INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules +create rule rule_and_refint_t3_ins as on insert to rule_and_refint_t3 + where (exists (select 1 from rule_and_refint_t3 + where (((rule_and_refint_t3.id3a = new.id3a) + and (rule_and_refint_t3.id3b = new.id3b)) + and (rule_and_refint_t3.id3c = new.id3c)))) + do instead update rule_and_refint_t3 set data = new.data + where (((rule_and_refint_t3.id3a = new.id3a) + and (rule_and_refint_t3.id3b = new.id3b)) + and (rule_and_refint_t3.id3c = new.id3c)); +insert into rule_and_refint_t3 values (1, 11, 13, 'row7'); +ERROR: insert or update on table "rule_and_refint_t3" violates foreign key constraint "rule_and_refint_t3_id3a_id3c_fkey" +DETAIL: Key (id3a, id3c)=(1, 13) is not present in table "rule_and_refint_t2". +insert into rule_and_refint_t3 values (1, 13, 11, 'row8'); +ERROR: insert or update on table "rule_and_refint_t3" violates foreign key constraint "rule_and_refint_t3_id3a_id3b_fkey" +DETAIL: Key (id3a, id3b)=(1, 13) is not present in table "rule_and_refint_t1". +-- +-- disallow dropping a view's rule (bug #5072) +-- +create view rules_fooview as select 'rules_foo'::text; +drop rule "_RETURN" on rules_fooview; +ERROR: cannot drop rule _RETURN on view rules_fooview because view rules_fooview requires it +HINT: You can drop view rules_fooview instead. +drop view rules_fooview; +-- +-- test conversion of table to view (needed to load some pg_dump files) +-- +create table rules_fooview (x int, y text); +select xmin, * from rules_fooview; + xmin | x | y +------+---+--- +(0 rows) + +create rule "_RETURN" as on select to rules_fooview do instead + select 1 as x, 'aaa'::text as y; +select * from rules_fooview; + x | y +---+----- + 1 | aaa +(1 row) + +select xmin, * from rules_fooview; -- fail, views don't have such a column +ERROR: column "xmin" does not exist +LINE 1: select xmin, * from rules_fooview; + ^ +select reltoastrelid, relkind, relfrozenxid + from pg_class where oid = 'rules_fooview'::regclass; + reltoastrelid | relkind | relfrozenxid +---------------+---------+-------------- + 0 | v | 0 +(1 row) + +drop view rules_fooview; +-- cannot convert an inheritance parent or child to a view, though +create table rules_fooview (x int, y text); +create table rules_fooview_child () inherits (rules_fooview); +create rule "_RETURN" as on select to rules_fooview do instead + select 1 as x, 'aaa'::text as y; +ERROR: could not convert table "rules_fooview" to a view because it has child tables +create rule "_RETURN" as on select to rules_fooview_child do instead + select 1 as x, 'aaa'::text as y; +ERROR: could not convert table "rules_fooview_child" to a view because it has parent tables +drop table rules_fooview cascade; +NOTICE: drop cascades to table rules_fooview_child +-- likewise, converting a partitioned table or partition to view is not allowed +create table rules_fooview (x int, y text) partition by list (x); +create rule "_RETURN" as on select to rules_fooview do instead + select 1 as x, 'aaa'::text as y; +ERROR: cannot convert partitioned table "rules_fooview" to a view +create table rules_fooview_part partition of rules_fooview for values in (1); +create rule "_RETURN" as on select to rules_fooview_part do instead + select 1 as x, 'aaa'::text as y; +ERROR: cannot convert partition "rules_fooview_part" to a view +drop table rules_fooview; +-- +-- check for planner problems with complex inherited UPDATES +-- +create table id (id serial primary key, name text); +-- currently, must respecify PKEY for each inherited subtable +create table test_1 (id integer primary key) inherits (id); +NOTICE: merging column "id" with inherited definition +create table test_2 (id integer primary key) inherits (id); +NOTICE: merging column "id" with inherited definition +create table test_3 (id integer primary key) inherits (id); +NOTICE: merging column "id" with inherited definition +insert into test_1 (name) values ('Test 1'); +insert into test_1 (name) values ('Test 2'); +insert into test_2 (name) values ('Test 3'); +insert into test_2 (name) values ('Test 4'); +insert into test_3 (name) values ('Test 5'); +insert into test_3 (name) values ('Test 6'); +create view id_ordered as select * from id order by id; +create rule update_id_ordered as on update to id_ordered + do instead update id set name = new.name where id = old.id; +select * from id_ordered; + id | name +----+-------- + 1 | Test 1 + 2 | Test 2 + 3 | Test 3 + 4 | Test 4 + 5 | Test 5 + 6 | Test 6 +(6 rows) + +update id_ordered set name = 'update 2' where id = 2; +update id_ordered set name = 'update 4' where id = 4; +update id_ordered set name = 'update 5' where id = 5; +select * from id_ordered; + id | name +----+---------- + 1 | Test 1 + 2 | update 2 + 3 | Test 3 + 4 | update 4 + 5 | update 5 + 6 | Test 6 +(6 rows) + +drop table id cascade; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to table test_1 +drop cascades to table test_2 +drop cascades to table test_3 +drop cascades to view id_ordered +-- +-- check corner case where an entirely-dummy subplan is created by +-- constraint exclusion +-- +create temp table t1 (a integer primary key); +create temp table t1_1 (check (a >= 0 and a < 10)) inherits (t1); +create temp table t1_2 (check (a >= 10 and a < 20)) inherits (t1); +create rule t1_ins_1 as on insert to t1 + where new.a >= 0 and new.a < 10 + do instead + insert into t1_1 values (new.a); +create rule t1_ins_2 as on insert to t1 + where new.a >= 10 and new.a < 20 + do instead + insert into t1_2 values (new.a); +create rule t1_upd_1 as on update to t1 + where old.a >= 0 and old.a < 10 + do instead + update t1_1 set a = new.a where a = old.a; +create rule t1_upd_2 as on update to t1 + where old.a >= 10 and old.a < 20 + do instead + update t1_2 set a = new.a where a = old.a; +set constraint_exclusion = on; +insert into t1 select * from generate_series(5,19,1) g; +update t1 set a = 4 where a = 5; +select * from only t1; + a +--- +(0 rows) + +select * from only t1_1; + a +--- + 6 + 7 + 8 + 9 + 4 +(5 rows) + +select * from only t1_2; + a +---- + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 +(10 rows) + +reset constraint_exclusion; +-- test FOR UPDATE in rules +create table rules_base(f1 int, f2 int); +insert into rules_base values(1,2), (11,12); +create rule r1 as on update to rules_base do instead + select * from rules_base where f1 = 1 for update; +update rules_base set f2 = f2 + 1; + f1 | f2 +----+---- + 1 | 2 +(1 row) + +create or replace rule r1 as on update to rules_base do instead + select * from rules_base where f1 = 11 for update of rules_base; +update rules_base set f2 = f2 + 1; + f1 | f2 +----+---- + 11 | 12 +(1 row) + +create or replace rule r1 as on update to rules_base do instead + select * from rules_base where f1 = 11 for update of old; -- error +ERROR: relation "old" in FOR UPDATE clause not found in FROM clause +LINE 2: select * from rules_base where f1 = 11 for update of old; + ^ +drop table rules_base; +-- test various flavors of pg_get_viewdef() +select pg_get_viewdef('shoe'::regclass) as unpretty; + unpretty +------------------------------------------------ + SELECT sh.shoename, + + sh.sh_avail, + + sh.slcolor, + + sh.slminlen, + + (sh.slminlen * un.un_fact) AS slminlen_cm,+ + sh.slmaxlen, + + (sh.slmaxlen * un.un_fact) AS slmaxlen_cm,+ + sh.slunit + + FROM shoe_data sh, + + unit un + + WHERE (sh.slunit = un.un_name); +(1 row) + +select pg_get_viewdef('shoe'::regclass,true) as pretty; + pretty +---------------------------------------------- + SELECT sh.shoename, + + sh.sh_avail, + + sh.slcolor, + + sh.slminlen, + + sh.slminlen * un.un_fact AS slminlen_cm,+ + sh.slmaxlen, + + sh.slmaxlen * un.un_fact AS slmaxlen_cm,+ + sh.slunit + + FROM shoe_data sh, + + unit un + + WHERE sh.slunit = un.un_name; +(1 row) + +select pg_get_viewdef('shoe'::regclass,0) as prettier; + prettier +---------------------------------------------- + SELECT sh.shoename, + + sh.sh_avail, + + sh.slcolor, + + sh.slminlen, + + sh.slminlen * un.un_fact AS slminlen_cm,+ + sh.slmaxlen, + + sh.slmaxlen * un.un_fact AS slmaxlen_cm,+ + sh.slunit + + FROM shoe_data sh, + + unit un + + WHERE sh.slunit = un.un_name; +(1 row) + +-- +-- check multi-row VALUES in rules +-- +create table rules_src(f1 int, f2 int); +create table rules_log(f1 int, f2 int, tag text); +insert into rules_src values(1,2), (11,12); +create rule r1 as on update to rules_src do also + insert into rules_log values(old.*, 'old'), (new.*, 'new'); +update rules_src set f2 = f2 + 1; +update rules_src set f2 = f2 * 10; +select * from rules_src; + f1 | f2 +----+----- + 1 | 30 + 11 | 130 +(2 rows) + +select * from rules_log; + f1 | f2 | tag +----+-----+----- + 1 | 2 | old + 1 | 3 | new + 11 | 12 | old + 11 | 13 | new + 1 | 3 | old + 1 | 30 | new + 11 | 13 | old + 11 | 130 | new +(8 rows) + +create rule r2 as on update to rules_src do also + values(old.*, 'old'), (new.*, 'new'); +update rules_src set f2 = f2 / 10; + column1 | column2 | column3 +---------+---------+--------- + 1 | 30 | old + 1 | 3 | new + 11 | 130 | old + 11 | 13 | new +(4 rows) + +select * from rules_src; + f1 | f2 +----+---- + 1 | 3 + 11 | 13 +(2 rows) + +select * from rules_log; + f1 | f2 | tag +----+-----+----- + 1 | 2 | old + 1 | 3 | new + 11 | 12 | old + 11 | 13 | new + 1 | 3 | old + 1 | 30 | new + 11 | 13 | old + 11 | 130 | new + 1 | 30 | old + 1 | 3 | new + 11 | 130 | old + 11 | 13 | new +(12 rows) + +create rule r3 as on delete to rules_src do notify rules_src_deletion; +\d+ rules_src + Table "public.rules_src" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + f1 | integer | | | | plain | | + f2 | integer | | | | plain | | +Rules: + r1 AS + ON UPDATE TO rules_src DO INSERT INTO rules_log (f1, f2, tag) VALUES (old.f1,old.f2,'old'::text), (new.f1,new.f2,'new'::text) + r2 AS + ON UPDATE TO rules_src DO VALUES (old.f1,old.f2,'old'::text), (new.f1,new.f2,'new'::text) + r3 AS + ON DELETE TO rules_src DO + NOTIFY rules_src_deletion + +-- +-- Ensure an aliased target relation for insert is correctly deparsed. +-- +create rule r4 as on insert to rules_src do instead insert into rules_log AS trgt SELECT NEW.* RETURNING trgt.f1, trgt.f2; +create rule r5 as on update to rules_src do instead UPDATE rules_log AS trgt SET tag = 'updated' WHERE trgt.f1 = new.f1; +\d+ rules_src + Table "public.rules_src" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + f1 | integer | | | | plain | | + f2 | integer | | | | plain | | +Rules: + r1 AS + ON UPDATE TO rules_src DO INSERT INTO rules_log (f1, f2, tag) VALUES (old.f1,old.f2,'old'::text), (new.f1,new.f2,'new'::text) + r2 AS + ON UPDATE TO rules_src DO VALUES (old.f1,old.f2,'old'::text), (new.f1,new.f2,'new'::text) + r3 AS + ON DELETE TO rules_src DO + NOTIFY rules_src_deletion + r4 AS + ON INSERT TO rules_src DO INSTEAD INSERT INTO rules_log AS trgt (f1, f2) SELECT new.f1, + new.f2 + RETURNING trgt.f1, + trgt.f2 + r5 AS + ON UPDATE TO rules_src DO INSTEAD UPDATE rules_log trgt SET tag = 'updated'::text + WHERE trgt.f1 = new.f1 + +-- +-- Also check multiassignment deparsing. +-- +create table rule_t1(f1 int, f2 int); +create table rule_dest(f1 int, f2 int[], tag text); +create rule rr as on update to rule_t1 do instead UPDATE rule_dest trgt + SET (f2[1], f1, tag) = (SELECT new.f2, new.f1, 'updated'::varchar) + WHERE trgt.f1 = new.f1 RETURNING new.*; +\d+ rule_t1 + Table "public.rule_t1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + f1 | integer | | | | plain | | + f2 | integer | | | | plain | | +Rules: + rr AS + ON UPDATE TO rule_t1 DO INSTEAD UPDATE rule_dest trgt SET (f2[1], f1, tag) = ( SELECT new.f2, + new.f1, + 'updated'::character varying AS "varchar") + WHERE trgt.f1 = new.f1 + RETURNING new.f1, + new.f2 + +drop table rule_t1, rule_dest; +-- +-- check alter rename rule +-- +CREATE TABLE rule_t1 (a INT); +CREATE VIEW rule_v1 AS SELECT * FROM rule_t1; +CREATE RULE InsertRule AS + ON INSERT TO rule_v1 + DO INSTEAD + INSERT INTO rule_t1 VALUES(new.a); +ALTER RULE InsertRule ON rule_v1 RENAME to NewInsertRule; +INSERT INTO rule_v1 VALUES(1); +SELECT * FROM rule_v1; + a +--- + 1 +(1 row) + +\d+ rule_v1 + View "public.rule_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + a | integer | | | | plain | +View definition: + SELECT rule_t1.a + FROM rule_t1; +Rules: + newinsertrule AS + ON INSERT TO rule_v1 DO INSTEAD INSERT INTO rule_t1 (a) + VALUES (new.a) + +-- +-- error conditions for alter rename rule +-- +ALTER RULE InsertRule ON rule_v1 RENAME TO NewInsertRule; -- doesn't exist +ERROR: rule "insertrule" for relation "rule_v1" does not exist +ALTER RULE NewInsertRule ON rule_v1 RENAME TO "_RETURN"; -- already exists +ERROR: rule "_RETURN" for relation "rule_v1" already exists +ALTER RULE "_RETURN" ON rule_v1 RENAME TO abc; -- ON SELECT rule cannot be renamed +ERROR: renaming an ON SELECT rule is not allowed +DROP VIEW rule_v1; +DROP TABLE rule_t1; +-- +-- check display of VALUES in view definitions +-- +create view rule_v1 as values(1,2); +\d+ rule_v1 + View "public.rule_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +---------+---------+-----------+----------+---------+---------+------------- + column1 | integer | | | | plain | + column2 | integer | | | | plain | +View definition: + VALUES (1,2); + +alter table rule_v1 rename column column2 to q2; +\d+ rule_v1 + View "public.rule_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +---------+---------+-----------+----------+---------+---------+------------- + column1 | integer | | | | plain | + q2 | integer | | | | plain | +View definition: + SELECT "*VALUES*".column1, + "*VALUES*".column2 AS q2 + FROM (VALUES (1,2)) "*VALUES*"; + +drop view rule_v1; +create view rule_v1(x) as values(1,2); +\d+ rule_v1 + View "public.rule_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +---------+---------+-----------+----------+---------+---------+------------- + x | integer | | | | plain | + column2 | integer | | | | plain | +View definition: + SELECT "*VALUES*".column1 AS x, + "*VALUES*".column2 + FROM (VALUES (1,2)) "*VALUES*"; + +drop view rule_v1; +create view rule_v1(x) as select * from (values(1,2)) v; +\d+ rule_v1 + View "public.rule_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +---------+---------+-----------+----------+---------+---------+------------- + x | integer | | | | plain | + column2 | integer | | | | plain | +View definition: + SELECT v.column1 AS x, + v.column2 + FROM ( VALUES (1,2)) v; + +drop view rule_v1; +create view rule_v1(x) as select * from (values(1,2)) v(q,w); +\d+ rule_v1 + View "public.rule_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + x | integer | | | | plain | + w | integer | | | | plain | +View definition: + SELECT v.q AS x, + v.w + FROM ( VALUES (1,2)) v(q, w); + +drop view rule_v1; +-- +-- Check DO INSTEAD rules with ON CONFLICT +-- +CREATE TABLE hats ( + hat_name char(10) primary key, + hat_color char(10) -- hat color +); +CREATE TABLE hat_data ( + hat_name char(10), + hat_color char(10) -- hat color +); +create unique index hat_data_unique_idx + on hat_data (hat_name COLLATE "C" bpchar_pattern_ops); +-- DO NOTHING with ON CONFLICT +CREATE RULE hat_nosert AS ON INSERT TO hats + DO INSTEAD + INSERT INTO hat_data VALUES ( + NEW.hat_name, + NEW.hat_color) + ON CONFLICT (hat_name COLLATE "C" bpchar_pattern_ops) WHERE hat_color = 'green' + DO NOTHING + RETURNING *; +SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename; + definition +--------------------------------------------------------------------------------------------- + CREATE RULE hat_nosert AS + + ON INSERT TO public.hats DO INSTEAD INSERT INTO hat_data (hat_name, hat_color) + + VALUES (new.hat_name, new.hat_color) ON CONFLICT(hat_name COLLATE "C" bpchar_pattern_ops)+ + WHERE (hat_color = 'green'::bpchar) DO NOTHING + + RETURNING hat_data.hat_name, + + hat_data.hat_color; +(1 row) + +-- Works (projects row) +INSERT INTO hats VALUES ('h7', 'black') RETURNING *; + hat_name | hat_color +------------+------------ + h7 | black +(1 row) + +-- Works (does nothing) +INSERT INTO hats VALUES ('h7', 'black') RETURNING *; + hat_name | hat_color +----------+----------- +(0 rows) + +SELECT tablename, rulename, definition FROM pg_rules + WHERE tablename = 'hats'; + tablename | rulename | definition +-----------+------------+--------------------------------------------------------------------------------------------- + hats | hat_nosert | CREATE RULE hat_nosert AS + + | | ON INSERT TO public.hats DO INSTEAD INSERT INTO hat_data (hat_name, hat_color) + + | | VALUES (new.hat_name, new.hat_color) ON CONFLICT(hat_name COLLATE "C" bpchar_pattern_ops)+ + | | WHERE (hat_color = 'green'::bpchar) DO NOTHING + + | | RETURNING hat_data.hat_name, + + | | hat_data.hat_color; +(1 row) + +DROP RULE hat_nosert ON hats; +-- DO NOTHING without ON CONFLICT +CREATE RULE hat_nosert_all AS ON INSERT TO hats + DO INSTEAD + INSERT INTO hat_data VALUES ( + NEW.hat_name, + NEW.hat_color) + ON CONFLICT + DO NOTHING + RETURNING *; +SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename; + definition +------------------------------------------------------------------------------------- + CREATE RULE hat_nosert_all AS + + ON INSERT TO public.hats DO INSTEAD INSERT INTO hat_data (hat_name, hat_color)+ + VALUES (new.hat_name, new.hat_color) ON CONFLICT DO NOTHING + + RETURNING hat_data.hat_name, + + hat_data.hat_color; +(1 row) + +DROP RULE hat_nosert_all ON hats; +-- Works (does nothing) +INSERT INTO hats VALUES ('h7', 'black') RETURNING *; + hat_name | hat_color +------------+------------ + h7 | black +(1 row) + +-- DO UPDATE with a WHERE clause +CREATE RULE hat_upsert AS ON INSERT TO hats + DO INSTEAD + INSERT INTO hat_data VALUES ( + NEW.hat_name, + NEW.hat_color) + ON CONFLICT (hat_name) + DO UPDATE + SET hat_name = hat_data.hat_name, hat_color = excluded.hat_color + WHERE excluded.hat_color <> 'forbidden' AND hat_data.* != excluded.* + RETURNING *; +SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename; + definition +----------------------------------------------------------------------------------------------------------------------------------------- + CREATE RULE hat_upsert AS + + ON INSERT TO public.hats DO INSTEAD INSERT INTO hat_data (hat_name, hat_color) + + VALUES (new.hat_name, new.hat_color) ON CONFLICT(hat_name) DO UPDATE SET hat_name = hat_data.hat_name, hat_color = excluded.hat_color+ + WHERE ((excluded.hat_color <> 'forbidden'::bpchar) AND (hat_data.* <> excluded.*)) + + RETURNING hat_data.hat_name, + + hat_data.hat_color; +(1 row) + +-- Works (does upsert) +INSERT INTO hats VALUES ('h8', 'black') RETURNING *; + hat_name | hat_color +------------+------------ + h8 | black +(1 row) + +SELECT * FROM hat_data WHERE hat_name = 'h8'; + hat_name | hat_color +------------+------------ + h8 | black +(1 row) + +INSERT INTO hats VALUES ('h8', 'white') RETURNING *; + hat_name | hat_color +------------+------------ + h8 | white +(1 row) + +SELECT * FROM hat_data WHERE hat_name = 'h8'; + hat_name | hat_color +------------+------------ + h8 | white +(1 row) + +INSERT INTO hats VALUES ('h8', 'forbidden') RETURNING *; + hat_name | hat_color +----------+----------- +(0 rows) + +SELECT * FROM hat_data WHERE hat_name = 'h8'; + hat_name | hat_color +------------+------------ + h8 | white +(1 row) + +SELECT tablename, rulename, definition FROM pg_rules + WHERE tablename = 'hats'; + tablename | rulename | definition +-----------+------------+----------------------------------------------------------------------------------------------------------------------------------------- + hats | hat_upsert | CREATE RULE hat_upsert AS + + | | ON INSERT TO public.hats DO INSTEAD INSERT INTO hat_data (hat_name, hat_color) + + | | VALUES (new.hat_name, new.hat_color) ON CONFLICT(hat_name) DO UPDATE SET hat_name = hat_data.hat_name, hat_color = excluded.hat_color+ + | | WHERE ((excluded.hat_color <> 'forbidden'::bpchar) AND (hat_data.* <> excluded.*)) + + | | RETURNING hat_data.hat_name, + + | | hat_data.hat_color; +(1 row) + +-- ensure explain works for on insert conflict rules +explain (costs off) INSERT INTO hats VALUES ('h8', 'forbidden') RETURNING *; + QUERY PLAN +------------------------------------------------------------------------------------------------- + Insert on hat_data + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: hat_data_unique_idx + Conflict Filter: ((excluded.hat_color <> 'forbidden'::bpchar) AND (hat_data.* <> excluded.*)) + -> Result +(5 rows) + +-- ensure upserting into a rule, with a CTE (different offsets!) works +WITH data(hat_name, hat_color) AS MATERIALIZED ( + VALUES ('h8', 'green'), + ('h9', 'blue'), + ('h7', 'forbidden') +) +INSERT INTO hats + SELECT * FROM data +RETURNING *; + hat_name | hat_color +------------+------------ + h8 | green + h9 | blue +(2 rows) + +EXPLAIN (costs off) +WITH data(hat_name, hat_color) AS MATERIALIZED ( + VALUES ('h8', 'green'), + ('h9', 'blue'), + ('h7', 'forbidden') +) +INSERT INTO hats + SELECT * FROM data +RETURNING *; + QUERY PLAN +------------------------------------------------------------------------------------------------- + Insert on hat_data + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: hat_data_unique_idx + Conflict Filter: ((excluded.hat_color <> 'forbidden'::bpchar) AND (hat_data.* <> excluded.*)) + CTE data + -> Values Scan on "*VALUES*" + -> CTE Scan on data +(7 rows) + +SELECT * FROM hat_data WHERE hat_name IN ('h8', 'h9', 'h7') ORDER BY hat_name; + hat_name | hat_color +------------+------------ + h7 | black + h8 | green + h9 | blue +(3 rows) + +DROP RULE hat_upsert ON hats; +drop table hats; +drop table hat_data; +-- test for pg_get_functiondef properly regurgitating SET parameters +-- Note that the function is kept around to stress pg_dump. +CREATE FUNCTION func_with_set_params() RETURNS integer + AS 'select 1;' + LANGUAGE SQL + SET search_path TO PG_CATALOG + SET extra_float_digits TO 2 + SET work_mem TO '4MB' + SET datestyle to iso, mdy + SET local_preload_libraries TO "Mixed/Case", 'c:/''a"/path', '', '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' + IMMUTABLE STRICT; +SELECT pg_get_functiondef('func_with_set_params()'::regprocedure); + pg_get_functiondef +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION public.func_with_set_params() + + RETURNS integer + + LANGUAGE sql + + IMMUTABLE STRICT + + SET search_path TO 'pg_catalog' + + SET extra_float_digits TO '2' + + SET work_mem TO '4MB' + + SET "DateStyle" TO 'iso, mdy' + + SET local_preload_libraries TO 'Mixed/Case', 'c:/''a"/path', '', '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'+ + AS $function$select 1;$function$ + + +(1 row) + +-- tests for pg_get_*def with invalid objects +SELECT pg_get_constraintdef(0); + pg_get_constraintdef +---------------------- + +(1 row) + +SELECT pg_get_functiondef(0); + pg_get_functiondef +-------------------- + +(1 row) + +SELECT pg_get_indexdef(0); + pg_get_indexdef +----------------- + +(1 row) + +SELECT pg_get_ruledef(0); + pg_get_ruledef +---------------- + +(1 row) + +SELECT pg_get_statisticsobjdef(0); + pg_get_statisticsobjdef +------------------------- + +(1 row) + +SELECT pg_get_triggerdef(0); + pg_get_triggerdef +------------------- + +(1 row) + +SELECT pg_get_viewdef(0); + pg_get_viewdef +---------------- + +(1 row) + +SELECT pg_get_function_arguments(0); + pg_get_function_arguments +--------------------------- + +(1 row) + +SELECT pg_get_function_identity_arguments(0); + pg_get_function_identity_arguments +------------------------------------ + +(1 row) + +SELECT pg_get_function_result(0); + pg_get_function_result +------------------------ + +(1 row) + +SELECT pg_get_function_arg_default(0, 0); + pg_get_function_arg_default +----------------------------- + +(1 row) + +SELECT pg_get_function_arg_default('pg_class'::regclass, 0); + pg_get_function_arg_default +----------------------------- + +(1 row) + +SELECT pg_get_partkeydef(0); + pg_get_partkeydef +------------------- + +(1 row) + +-- test rename for a rule defined on a partitioned table +CREATE TABLE rules_parted_table (a int) PARTITION BY LIST (a); +CREATE TABLE rules_parted_table_1 PARTITION OF rules_parted_table FOR VALUES IN (1); +CREATE RULE rules_parted_table_insert AS ON INSERT to rules_parted_table + DO INSTEAD INSERT INTO rules_parted_table_1 VALUES (NEW.*); +ALTER RULE rules_parted_table_insert ON rules_parted_table RENAME TO rules_parted_table_insert_redirect; +DROP TABLE rules_parted_table; +-- +-- Test enabling/disabling +-- +CREATE TABLE ruletest1 (a int); +CREATE TABLE ruletest2 (b int); +CREATE RULE rule1 AS ON INSERT TO ruletest1 + DO INSTEAD INSERT INTO ruletest2 VALUES (NEW.*); +INSERT INTO ruletest1 VALUES (1); +ALTER TABLE ruletest1 DISABLE RULE rule1; +INSERT INTO ruletest1 VALUES (2); +ALTER TABLE ruletest1 ENABLE RULE rule1; +SET session_replication_role = replica; +INSERT INTO ruletest1 VALUES (3); +ALTER TABLE ruletest1 ENABLE REPLICA RULE rule1; +INSERT INTO ruletest1 VALUES (4); +RESET session_replication_role; +INSERT INTO ruletest1 VALUES (5); +SELECT * FROM ruletest1; + a +--- + 2 + 3 + 5 +(3 rows) + +SELECT * FROM ruletest2; + b +--- + 1 + 4 +(2 rows) + +DROP TABLE ruletest1; +DROP TABLE ruletest2; diff --git a/src/test/singlenode_regress/expected/sanity_check.out b/src/test/singlenode_regress/expected/sanity_check.out new file mode 100644 index 00000000000..94b31962a9b --- /dev/null +++ b/src/test/singlenode_regress/expected/sanity_check.out @@ -0,0 +1,271 @@ +VACUUM; +-- +-- sanity check, if we don't have indices the test will take years to +-- complete. But skip TOAST relations (since they will have varying +-- names depending on the current OID counter) as well as temp tables +-- of other backends (to avoid timing-dependent behavior). +-- +-- temporarily disable fancy output, so catalog changes create less diff noise +\a\t +-- filter tables with same name under schema singleseg created by GPDB +SELECT relname, relhasindex + FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace + WHERE relkind IN ('r', 'p') AND (nspname ~ '^pg_temp_') IS NOT TRUE + AND relname NOT LIKE 'gp_%' + AND relname NOT LIKE '__gp_%' + AND relname <> 'pg_resqueue' + AND n.nspname <> 'singleseg' + ORDER BY relname; +a|f +a_star|f +aggtest|f +array_index_op_test|t +array_op_test|f +b|f +b_star|f +bit_defaults|f +box_tbl|f +bprime|f +bt_f8_heap|t +bt_i4_heap|t +bt_name_heap|t +bt_txt_heap|t +c|f +c_star|f +char_tbl|f +check2_tbl|f +check_tbl|f +circle_tbl|t +city|f +copy_tbl|f +d|f +d_star|f +date_tbl|f +default_tbl|f +defaultexpr_tbl|f +dept|f +dupindexcols|t +e_star|f +emp|f +equipment_r|f +extra_wide_table|f +f_star|f +fast_emp4000|t +float4_tbl|f +float8_tbl|f +func_index_heap|t +hash_f8_heap|t +hash_i4_heap|t +hash_name_heap|t +hash_txt_heap|t +hobbies_r|f +ihighway|t +inet_tbl|f +insert_tbl|f +int2_tbl|f +int4_tbl|f +int8_tbl|f +interval_tbl|f +invalid_check_con|f +invalid_check_con_child|f +iportaltest|f +kd_point_tbl|t +line_tbl|f +log_table|f +lseg_tbl|f +main_table|f +mlparted|f +mlparted1|f +mlparted11|f +mlparted12|f +mlparted2|f +mlparted3|f +mlparted4|f +mlparted_def|f +mlparted_def1|f +mlparted_def2|f +mlparted_defd|f +money_data|f +num_data|f +num_exp_add|t +num_exp_div|t +num_exp_ln|t +num_exp_log10|t +num_exp_mul|t +num_exp_power_10_ln|t +num_exp_sqrt|t +num_exp_sub|t +num_input_test|f +num_result|f +nummultirange_test|t +numrange_test|t +onek|t +onek2|t +path_tbl|f +person|f +persons|f +persons2|t +persons3|t +pg_aggregate|t +pg_am|t +pg_amop|t +pg_amproc|t +pg_appendonly|t +pg_attrdef|t +pg_attribute|t +pg_attribute_encoding|t +pg_auth_members|t +pg_auth_time_constraint|t +pg_authid|t +pg_cast|t +pg_class|t +pg_collation|t +pg_compression|t +pg_constraint|t +pg_conversion|t +pg_database|t +pg_db_role_setting|t +pg_default_acl|t +pg_depend|t +pg_description|t +pg_enum|t +pg_event_trigger|t +pg_extension|t +pg_extprotocol|t +pg_foreign_data_wrapper|t +pg_foreign_server|t +pg_foreign_table|t +pg_index|t +pg_inherits|t +pg_init_privs|t +pg_language|t +pg_largeobject|t +pg_largeobject_metadata|t +pg_namespace|t +pg_opclass|t +pg_operator|t +pg_opfamily|t +pg_partitioned_table|t +pg_password_history|t +pg_policy|t +pg_proc|t +pg_proc_callback|t +pg_profile|t +pg_publication|t +pg_publication_rel|t +pg_range|t +pg_replication_origin|t +pg_resgroup|t +pg_resgroupcapability|t +pg_resourcetype|t +pg_resqueuecapability|t +pg_rewrite|t +pg_seclabel|t +pg_sequence|t +pg_shdepend|t +pg_shdescription|t +pg_shseclabel|t +pg_stat_last_operation|t +pg_stat_last_shoperation|t +pg_statistic|t +pg_statistic_ext|t +pg_statistic_ext_data|t +pg_subscription|t +pg_subscription_rel|t +pg_tablespace|t +pg_task|t +pg_task_run_history|t +pg_transform|t +pg_trigger|t +pg_ts_config|t +pg_ts_config_map|t +pg_ts_dict|t +pg_ts_parser|t +pg_ts_template|t +pg_type|t +pg_type_encoding|t +pg_user_mapping|t +point_tbl|t +polygon_tbl|t +quad_box_tbl|t +quad_box_tbl_ord_seq1|f +quad_box_tbl_ord_seq2|f +quad_point_tbl|t +quad_poly_tbl|t +radix_text_tbl|t +ramp|f +real_city|f +reservations|f +road|t +shighway|t +slow_emp4000|f +sql_features|f +sql_implementation_info|f +sql_parts|f +sql_sizing|f +stud_emp|f +student|f +tab_core_types|f +tableam_parted_a_heap2|f +tableam_parted_b_heap2|f +tableam_parted_c_heap2|f +tableam_parted_d_heap2|f +tableam_parted_heap2|f +tableam_tbl_heap2|f +tableam_tblas_heap2|f +tbl_include_box|t +tbl_include_box_pk|f +tbl_include_pk|t +tbl_include_reg|t +tbl_include_unique1|t +tbl_include_unique2|f +tenk1|t +tenk2|t +test_range_excl|t +test_range_gist|t +test_range_spgist|t +test_tsvector|f +testjsonb|f +text_tbl|f +textrange_test|t +time_tbl|f +timestamp_tbl|f +timestamptz_tbl|f +timetz_tbl|f +tmp|f +trigger_parted|t +trigger_parted_p1|t +trigger_parted_p1_1|t +trigger_parted_p2|t +trigger_parted_p2_2|t +unlogged_toast|f +varchar_tbl|f +view_base_table|t +-- restore normal output mode +\a\t +-- +-- another sanity check: every system catalog that has OIDs should have +-- a unique index on OID. This ensures that the OIDs will be unique, +-- even after the OID counter wraps around. +-- We exclude non-system tables from the check by looking at nspname. +-- +SELECT relname, nspname + FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace JOIN pg_attribute a ON (attrelid = c.oid AND attname = 'oid') + WHERE relkind = 'r' and c.oid < 16384 + AND ((nspname ~ '^pg_') IS NOT FALSE) + AND NOT EXISTS (SELECT 1 FROM pg_index i WHERE indrelid = c.oid + AND indkey[0] = a.attnum AND indnatts = 1 + AND indisunique AND indimmediate); + relname | nspname +---------+--------- +(0 rows) + +-- check that relations without storage don't have relfilenode +SELECT relname, relkind + FROM pg_class + WHERE relkind IN ('v', 'c', 'f', 'p', 'I') + AND relfilenode <> 0; + relname | relkind +---------+--------- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/security_label.out b/src/test/singlenode_regress/expected/security_label.out new file mode 100644 index 00000000000..a8e01a6220a --- /dev/null +++ b/src/test/singlenode_regress/expected/security_label.out @@ -0,0 +1,44 @@ +-- +-- Test for facilities of security label +-- +-- initial setups +SET client_min_messages TO 'warning'; +DROP ROLE IF EXISTS regress_seclabel_user1; +DROP ROLE IF EXISTS regress_seclabel_user2; +RESET client_min_messages; +CREATE USER regress_seclabel_user1 WITH CREATEROLE; +CREATE USER regress_seclabel_user2; +CREATE TABLE seclabel_tbl1 (a int, b text); +CREATE TABLE seclabel_tbl2 (x int, y text); +CREATE VIEW seclabel_view1 AS SELECT * FROM seclabel_tbl2; +CREATE FUNCTION seclabel_four() RETURNS integer AS $$SELECT 4$$ language sql; +CREATE DOMAIN seclabel_domain AS text; +ALTER TABLE seclabel_tbl1 OWNER TO regress_seclabel_user1; +ALTER TABLE seclabel_tbl2 OWNER TO regress_seclabel_user2; +-- +-- Test of SECURITY LABEL statement without a plugin +-- +SECURITY LABEL ON TABLE seclabel_tbl1 IS 'classified'; -- fail +ERROR: no security label providers have been loaded +SECURITY LABEL FOR 'dummy' ON TABLE seclabel_tbl1 IS 'classified'; -- fail +ERROR: security label provider "dummy" is not loaded +SECURITY LABEL ON TABLE seclabel_tbl1 IS '...invalid label...'; -- fail +ERROR: no security label providers have been loaded +SECURITY LABEL ON TABLE seclabel_tbl3 IS 'unclassified'; -- fail +ERROR: no security label providers have been loaded +SECURITY LABEL ON ROLE regress_seclabel_user1 IS 'classified'; -- fail +ERROR: no security label providers have been loaded +SECURITY LABEL FOR 'dummy' ON ROLE regress_seclabel_user1 IS 'classified'; -- fail +ERROR: security label provider "dummy" is not loaded +SECURITY LABEL ON ROLE regress_seclabel_user1 IS '...invalid label...'; -- fail +ERROR: no security label providers have been loaded +SECURITY LABEL ON ROLE regress_seclabel_user3 IS 'unclassified'; -- fail +ERROR: no security label providers have been loaded +-- clean up objects +DROP FUNCTION seclabel_four(); +DROP DOMAIN seclabel_domain; +DROP VIEW seclabel_view1; +DROP TABLE seclabel_tbl1; +DROP TABLE seclabel_tbl2; +DROP USER regress_seclabel_user1; +DROP USER regress_seclabel_user2; diff --git a/src/test/singlenode_regress/expected/select.out b/src/test/singlenode_regress/expected/select.out new file mode 100644 index 00000000000..a7014af1f98 --- /dev/null +++ b/src/test/singlenode_regress/expected/select.out @@ -0,0 +1,973 @@ +-- +-- SELECT +-- +-- btree index +-- awk '{if($1<10){print;}else{next;}}' onek.data | sort +0n -1 +-- +SELECT * FROM onek + WHERE onek.unique1 < 10 + ORDER BY onek.unique1; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | KMBAAA | OOOOxx + 1 | 214 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | GIAAAA | OOOOxx + 2 | 326 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | OMAAAA | OOOOxx + 3 | 431 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | PQAAAA | VVVVxx + 4 | 833 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | BGBAAA | HHHHxx + 5 | 541 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | VUAAAA | HHHHxx + 6 | 978 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | QLBAAA | OOOOxx + 7 | 647 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | XYAAAA | VVVVxx + 8 | 653 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | DZAAAA | HHHHxx + 9 | 49 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | XBAAAA | HHHHxx +(10 rows) + +-- +-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1 +-- +SELECT onek.unique1, onek.stringu1 FROM onek + WHERE onek.unique1 < 20 + ORDER BY unique1 using >; + unique1 | stringu1 +---------+---------- + 19 | TAAAAA + 18 | SAAAAA + 17 | RAAAAA + 16 | QAAAAA + 15 | PAAAAA + 14 | OAAAAA + 13 | NAAAAA + 12 | MAAAAA + 11 | LAAAAA + 10 | KAAAAA + 9 | JAAAAA + 8 | IAAAAA + 7 | HAAAAA + 6 | GAAAAA + 5 | FAAAAA + 4 | EAAAAA + 3 | DAAAAA + 2 | CAAAAA + 1 | BAAAAA + 0 | AAAAAA +(20 rows) + +-- +-- awk '{if($1>980){print $1,$14;}else{next;}}' onek.data | sort +1d -2 +-- +SELECT onek.unique1, onek.stringu1 FROM onek + WHERE onek.unique1 > 980 + ORDER BY stringu1 using <; + unique1 | stringu1 +---------+---------- + 988 | AMAAAA + 989 | BMAAAA + 990 | CMAAAA + 991 | DMAAAA + 992 | EMAAAA + 993 | FMAAAA + 994 | GMAAAA + 995 | HMAAAA + 996 | IMAAAA + 997 | JMAAAA + 998 | KMAAAA + 999 | LMAAAA + 981 | TLAAAA + 982 | ULAAAA + 983 | VLAAAA + 984 | WLAAAA + 985 | XLAAAA + 986 | YLAAAA + 987 | ZLAAAA +(19 rows) + +-- +-- awk '{if($1>980){print $1,$16;}else{next;}}' onek.data | +-- sort +1d -2 +0nr -1 +-- +SELECT onek.unique1, onek.string4 FROM onek + WHERE onek.unique1 > 980 + ORDER BY string4 using <, unique1 using >; + unique1 | string4 +---------+--------- + 999 | AAAAxx + 995 | AAAAxx + 983 | AAAAxx + 982 | AAAAxx + 981 | AAAAxx + 998 | HHHHxx + 997 | HHHHxx + 993 | HHHHxx + 990 | HHHHxx + 986 | HHHHxx + 996 | OOOOxx + 991 | OOOOxx + 988 | OOOOxx + 987 | OOOOxx + 985 | OOOOxx + 994 | VVVVxx + 992 | VVVVxx + 989 | VVVVxx + 984 | VVVVxx +(19 rows) + +-- +-- awk '{if($1>980){print $1,$16;}else{next;}}' onek.data | +-- sort +1dr -2 +0n -1 +-- +SELECT onek.unique1, onek.string4 FROM onek + WHERE onek.unique1 > 980 + ORDER BY string4 using >, unique1 using <; + unique1 | string4 +---------+--------- + 984 | VVVVxx + 989 | VVVVxx + 992 | VVVVxx + 994 | VVVVxx + 985 | OOOOxx + 987 | OOOOxx + 988 | OOOOxx + 991 | OOOOxx + 996 | OOOOxx + 986 | HHHHxx + 990 | HHHHxx + 993 | HHHHxx + 997 | HHHHxx + 998 | HHHHxx + 981 | AAAAxx + 982 | AAAAxx + 983 | AAAAxx + 995 | AAAAxx + 999 | AAAAxx +(19 rows) + +-- +-- awk '{if($1<20){print $1,$16;}else{next;}}' onek.data | +-- sort +0nr -1 +1d -2 +-- +SELECT onek.unique1, onek.string4 FROM onek + WHERE onek.unique1 < 20 + ORDER BY unique1 using >, string4 using <; + unique1 | string4 +---------+--------- + 19 | OOOOxx + 18 | VVVVxx + 17 | HHHHxx + 16 | OOOOxx + 15 | VVVVxx + 14 | AAAAxx + 13 | OOOOxx + 12 | AAAAxx + 11 | OOOOxx + 10 | AAAAxx + 9 | HHHHxx + 8 | HHHHxx + 7 | VVVVxx + 6 | OOOOxx + 5 | HHHHxx + 4 | HHHHxx + 3 | VVVVxx + 2 | OOOOxx + 1 | OOOOxx + 0 | OOOOxx +(20 rows) + +-- +-- awk '{if($1<20){print $1,$16;}else{next;}}' onek.data | +-- sort +0n -1 +1dr -2 +-- +SELECT onek.unique1, onek.string4 FROM onek + WHERE onek.unique1 < 20 + ORDER BY unique1 using <, string4 using >; + unique1 | string4 +---------+--------- + 0 | OOOOxx + 1 | OOOOxx + 2 | OOOOxx + 3 | VVVVxx + 4 | HHHHxx + 5 | HHHHxx + 6 | OOOOxx + 7 | VVVVxx + 8 | HHHHxx + 9 | HHHHxx + 10 | AAAAxx + 11 | OOOOxx + 12 | AAAAxx + 13 | OOOOxx + 14 | AAAAxx + 15 | VVVVxx + 16 | OOOOxx + 17 | HHHHxx + 18 | VVVVxx + 19 | OOOOxx +(20 rows) + +-- +-- test partial btree indexes +-- +-- As of 7.2, planner probably won't pick an indexscan without stats, +-- so ANALYZE first. Also, we want to prevent it from picking a bitmapscan +-- followed by sort, because that could hide index ordering problems. +-- +ANALYZE onek2; +SET enable_seqscan TO off; +SET enable_bitmapscan TO off; +SET enable_sort TO off; +-- +-- awk '{if($1<10){print $0;}else{next;}}' onek.data | sort +0n -1 +-- +SELECT onek2.* FROM onek2 WHERE onek2.unique1 < 10; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | KMBAAA | OOOOxx + 1 | 214 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | GIAAAA | OOOOxx + 2 | 326 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | OMAAAA | OOOOxx + 3 | 431 | 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 6 | 7 | DAAAAA | PQAAAA | VVVVxx + 4 | 833 | 0 | 0 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 9 | EAAAAA | BGBAAA | HHHHxx + 5 | 541 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 10 | 11 | FAAAAA | VUAAAA | HHHHxx + 6 | 978 | 0 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 12 | 13 | GAAAAA | QLBAAA | OOOOxx + 7 | 647 | 1 | 3 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 14 | 15 | HAAAAA | XYAAAA | VVVVxx + 8 | 653 | 0 | 0 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 16 | 17 | IAAAAA | DZAAAA | HHHHxx + 9 | 49 | 1 | 1 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 18 | 19 | JAAAAA | XBAAAA | HHHHxx +(10 rows) + +-- +-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1 +-- +SELECT onek2.unique1, onek2.stringu1 FROM onek2 + WHERE onek2.unique1 < 20 + ORDER BY unique1 using >; + unique1 | stringu1 +---------+---------- + 19 | TAAAAA + 18 | SAAAAA + 17 | RAAAAA + 16 | QAAAAA + 15 | PAAAAA + 14 | OAAAAA + 13 | NAAAAA + 12 | MAAAAA + 11 | LAAAAA + 10 | KAAAAA + 9 | JAAAAA + 8 | IAAAAA + 7 | HAAAAA + 6 | GAAAAA + 5 | FAAAAA + 4 | EAAAAA + 3 | DAAAAA + 2 | CAAAAA + 1 | BAAAAA + 0 | AAAAAA +(20 rows) + +-- +-- awk '{if($1>980){print $1,$14;}else{next;}}' onek.data | sort +1d -2 +-- +SELECT onek2.unique1, onek2.stringu1 FROM onek2 + WHERE onek2.unique1 > 980; + unique1 | stringu1 +---------+---------- + 981 | TLAAAA + 982 | ULAAAA + 983 | VLAAAA + 984 | WLAAAA + 985 | XLAAAA + 986 | YLAAAA + 987 | ZLAAAA + 988 | AMAAAA + 989 | BMAAAA + 990 | CMAAAA + 991 | DMAAAA + 992 | EMAAAA + 993 | FMAAAA + 994 | GMAAAA + 995 | HMAAAA + 996 | IMAAAA + 997 | JMAAAA + 998 | KMAAAA + 999 | LMAAAA +(19 rows) + +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET enable_sort; +SELECT two, stringu1, ten, string4 + INTO TABLE tmp + FROM onek; +-- +-- awk '{print $1,$2;}' person.data | +-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - emp.data | +-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - student.data | +-- awk 'BEGIN{FS=" ";}{if(NF!=2){print $4,$5;}else{print;}}' - stud_emp.data +-- +-- SELECT name, age FROM person*; ??? check if different +SELECT p.name, p.age FROM person* p; + name | age +---------+----- + mike | 40 + joe | 20 + sally | 34 + sandra | 19 + alex | 30 + sue | 50 + denise | 24 + sarah | 88 + teresa | 38 + nan | 28 + leah | 68 + wendy | 78 + melissa | 28 + joan | 18 + mary | 8 + jane | 58 + liza | 38 + jean | 28 + jenifer | 38 + juanita | 58 + susan | 78 + zena | 98 + martie | 88 + chris | 78 + pat | 18 + zola | 58 + louise | 98 + edna | 18 + bertha | 88 + sumi | 38 + koko | 88 + gina | 18 + rean | 48 + sharon | 78 + paula | 68 + julie | 68 + belinda | 38 + karen | 48 + carina | 58 + diane | 18 + esther | 98 + trudy | 88 + fanny | 8 + carmen | 78 + lita | 25 + pamela | 48 + sandy | 38 + trisha | 88 + uma | 78 + velma | 68 + sharon | 25 + sam | 30 + bill | 20 + fred | 28 + larry | 60 + jeff | 23 + cim | 30 + linda | 19 +(58 rows) + +-- +-- awk '{print $1,$2;}' person.data | +-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - emp.data | +-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - student.data | +-- awk 'BEGIN{FS=" ";}{if(NF!=1){print $4,$5;}else{print;}}' - stud_emp.data | +-- sort +1nr -2 +-- +SELECT p.name, p.age FROM person* p ORDER BY age using >, name; + name | age +---------+----- + esther | 98 + louise | 98 + zena | 98 + bertha | 88 + koko | 88 + martie | 88 + sarah | 88 + trisha | 88 + trudy | 88 + carmen | 78 + chris | 78 + sharon | 78 + susan | 78 + uma | 78 + wendy | 78 + julie | 68 + leah | 68 + paula | 68 + velma | 68 + larry | 60 + carina | 58 + jane | 58 + juanita | 58 + zola | 58 + sue | 50 + karen | 48 + pamela | 48 + rean | 48 + mike | 40 + belinda | 38 + jenifer | 38 + liza | 38 + sandy | 38 + sumi | 38 + teresa | 38 + sally | 34 + alex | 30 + cim | 30 + sam | 30 + fred | 28 + jean | 28 + melissa | 28 + nan | 28 + lita | 25 + sharon | 25 + denise | 24 + jeff | 23 + bill | 20 + joe | 20 + linda | 19 + sandra | 19 + diane | 18 + edna | 18 + gina | 18 + joan | 18 + pat | 18 + fanny | 8 + mary | 8 +(58 rows) + +-- +-- Test some cases involving whole-row Var referencing a subquery +-- +select foo from (select 1 offset 0) as foo; + foo +----- + (1) +(1 row) + +select foo from (select null offset 0) as foo; + foo +----- + () +(1 row) + +select foo from (select 'xyzzy',1,null offset 0) as foo; + foo +------------ + (xyzzy,1,) +(1 row) + +-- +-- Test VALUES lists +-- +select * from onek, (values(147, 'RFAAAA'), (931, 'VJAAAA')) as v (i, j) + WHERE onek.unique1 = v.i and onek.stringu1 = v.j; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 | i | j +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+---------+-----+-------- + 147 | 0 | 1 | 3 | 7 | 7 | 7 | 47 | 147 | 147 | 147 | 14 | 15 | RFAAAA | AAAAAA | AAAAxx | 147 | RFAAAA + 931 | 1 | 1 | 3 | 1 | 11 | 1 | 31 | 131 | 431 | 931 | 2 | 3 | VJAAAA | BAAAAA | HHHHxx | 931 | VJAAAA +(2 rows) + +-- a more complex case +-- looks like we're coding lisp :-) +select * from onek, + (values ((select i from + (values(10000), (2), (389), (1000), (2000), ((select 10029))) as foo(i) + order by i asc limit 1))) bar (i) + where onek.unique1 = bar.i; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 | i +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+---------+--- + 2 | 326 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 5 | CAAAAA | OMAAAA | OOOOxx | 2 +(1 row) + +-- try VALUES in a subquery +select * from onek + where (unique1,ten) in (values (1,1), (20,0), (99,9), (17,99)) + order by unique1; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 1 | 214 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | BAAAAA | GIAAAA | OOOOxx + 20 | 306 | 0 | 0 | 0 | 0 | 0 | 20 | 20 | 20 | 20 | 0 | 1 | UAAAAA | ULAAAA | OOOOxx + 99 | 101 | 1 | 3 | 9 | 19 | 9 | 99 | 99 | 99 | 99 | 18 | 19 | VDAAAA | XDAAAA | HHHHxx +(3 rows) + +-- VALUES is also legal as a standalone query or a set-operation member +VALUES (1,2), (3,4+4), (7,77.7); + column1 | column2 +---------+--------- + 1 | 2 + 3 | 8 + 7 | 77.7 +(3 rows) + +VALUES (1,2), (3,4+4), (7,77.7) +UNION ALL +SELECT 2+2, 57 +UNION ALL +TABLE int8_tbl; + column1 | column2 +------------------+------------------- + 1 | 2 + 3 | 8 + 7 | 77.7 + 4 | 57 + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(9 rows) + +-- corner case: VALUES with no columns +CREATE TEMP TABLE nocols(); +INSERT INTO nocols DEFAULT VALUES; +SELECT * FROM nocols n, LATERAL (VALUES(n.*)) v; +-- +(1 row) + +-- +-- Test ORDER BY options +-- +CREATE TEMP TABLE foo (f1 int); +INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1); +SELECT * FROM foo ORDER BY f1; + f1 +---- + 1 + 3 + 7 + 10 + 42 + + +(7 rows) + +SELECT * FROM foo ORDER BY f1 ASC; -- same thing + f1 +---- + 1 + 3 + 7 + 10 + 42 + + +(7 rows) + +SELECT * FROM foo ORDER BY f1 NULLS FIRST; + f1 +---- + + + 1 + 3 + 7 + 10 + 42 +(7 rows) + +SELECT * FROM foo ORDER BY f1 DESC; + f1 +---- + + + 42 + 10 + 7 + 3 + 1 +(7 rows) + +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + f1 +---- + 42 + 10 + 7 + 3 + 1 + + +(7 rows) + +-- check if indexscans do the right things +CREATE INDEX fooi ON foo (f1); +SET enable_sort = false; +SELECT * FROM foo ORDER BY f1; + f1 +---- + 1 + 3 + 7 + 10 + 42 + + +(7 rows) + +SELECT * FROM foo ORDER BY f1 NULLS FIRST; + f1 +---- + + + 1 + 3 + 7 + 10 + 42 +(7 rows) + +SELECT * FROM foo ORDER BY f1 DESC; + f1 +---- + + + 42 + 10 + 7 + 3 + 1 +(7 rows) + +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + f1 +---- + 42 + 10 + 7 + 3 + 1 + + +(7 rows) + +DROP INDEX fooi; +CREATE INDEX fooi ON foo (f1 DESC); +SELECT * FROM foo ORDER BY f1; + f1 +---- + 1 + 3 + 7 + 10 + 42 + + +(7 rows) + +SELECT * FROM foo ORDER BY f1 NULLS FIRST; + f1 +---- + + + 1 + 3 + 7 + 10 + 42 +(7 rows) + +SELECT * FROM foo ORDER BY f1 DESC; + f1 +---- + + + 42 + 10 + 7 + 3 + 1 +(7 rows) + +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + f1 +---- + 42 + 10 + 7 + 3 + 1 + + +(7 rows) + +DROP INDEX fooi; +CREATE INDEX fooi ON foo (f1 DESC NULLS LAST); +SELECT * FROM foo ORDER BY f1; + f1 +---- + 1 + 3 + 7 + 10 + 42 + + +(7 rows) + +SELECT * FROM foo ORDER BY f1 NULLS FIRST; + f1 +---- + + + 1 + 3 + 7 + 10 + 42 +(7 rows) + +SELECT * FROM foo ORDER BY f1 DESC; + f1 +---- + + + 42 + 10 + 7 + 3 + 1 +(7 rows) + +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + f1 +---- + 42 + 10 + 7 + 3 + 1 + + +(7 rows) + +-- +-- Test planning of some cases with partial indexes +-- +-- partial index is usable +explain (costs off) +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; + QUERY PLAN +----------------------------------------- + Index Scan using onek2_u2_prtl on onek2 + Index Cond: (unique2 = 11) + Filter: (stringu1 = 'ATAAAA'::name) +(3 rows) + +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 494 | 11 | 0 | 2 | 4 | 14 | 4 | 94 | 94 | 494 | 494 | 8 | 9 | ATAAAA | LAAAAA | VVVVxx +(1 row) + +-- actually run the query with an analyze to use the partial index +explain (costs off, analyze on, timing off, summary off) +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; + QUERY PLAN +----------------------------------------------------------------- + Index Scan using onek2_u2_prtl on onek2 (actual rows=1 loops=1) + Index Cond: (unique2 = 11) + Filter: (stringu1 = 'ATAAAA'::name) +(3 rows) + +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; + QUERY PLAN +----------------------------------------- + Index Scan using onek2_u2_prtl on onek2 + Index Cond: (unique2 = 11) + Filter: (stringu1 = 'ATAAAA'::name) +(3 rows) + +select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; + unique2 +--------- + 11 +(1 row) + +-- partial index predicate implies clause, so no need for retest +explain (costs off) +select * from onek2 where unique2 = 11 and stringu1 < 'B'; + QUERY PLAN +----------------------------------------- + Index Scan using onek2_u2_prtl on onek2 + Index Cond: (unique2 = 11) +(2 rows) + +select * from onek2 where unique2 = 11 and stringu1 < 'B'; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 494 | 11 | 0 | 2 | 4 | 14 | 4 | 94 | 94 | 494 | 494 | 8 | 9 | ATAAAA | LAAAAA | VVVVxx +(1 row) + +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; + QUERY PLAN +---------------------------------------------- + Index Only Scan using onek2_u2_prtl on onek2 + Index Cond: (unique2 = 11) +(2 rows) + +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; + unique2 +--------- + 11 +(1 row) + +-- but if it's an update target, must retest anyway +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update; + QUERY PLAN +----------------------------------------- + Index Scan using onek2_u2_prtl on onek2 + Index Cond: (unique2 = 11) + Filter: (stringu1 < 'B'::name) + Optimizer: Postgres query optimizer +(4 rows) + +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update; + unique2 +--------- + 11 +(1 row) + +-- partial index is not applicable +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'C'; + QUERY PLAN +------------------------------------------------------- + Seq Scan on onek2 + Filter: ((stringu1 < 'C'::name) AND (unique2 = 11)) +(2 rows) + +select unique2 from onek2 where unique2 = 11 and stringu1 < 'C'; + unique2 +--------- + 11 +(1 row) + +-- partial index implies clause, but bitmap scan must recheck predicate anyway +SET enable_indexscan TO off; +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; + QUERY PLAN +------------------------------------------------------------- + Bitmap Heap Scan on onek2 + Recheck Cond: ((unique2 = 11) AND (stringu1 < 'B'::name)) + -> Bitmap Index Scan on onek2_u2_prtl + Index Cond: (unique2 = 11) +(4 rows) + +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; + unique2 +--------- + 11 +(1 row) + +RESET enable_indexscan; +-- check multi-index cases too +explain (costs off) +select unique1, unique2 from onek2 + where (unique2 = 11 or unique1 = 0) and stringu1 < 'B'; + QUERY PLAN +-------------------------------------------------------------------------------- + Bitmap Heap Scan on onek2 + Recheck Cond: (((unique2 = 11) AND (stringu1 < 'B'::name)) OR (unique1 = 0)) + Filter: (stringu1 < 'B'::name) + -> BitmapOr + -> Bitmap Index Scan on onek2_u2_prtl + Index Cond: (unique2 = 11) + -> Bitmap Index Scan on onek2_u1_prtl + Index Cond: (unique1 = 0) +(8 rows) + +select unique1, unique2 from onek2 + where (unique2 = 11 or unique1 = 0) and stringu1 < 'B'; + unique1 | unique2 +---------+--------- + 494 | 11 + 0 | 998 +(2 rows) + +explain (costs off) +select unique1, unique2 from onek2 + where (unique2 = 11 and stringu1 < 'B') or unique1 = 0; + QUERY PLAN +-------------------------------------------------------------------------------- + Bitmap Heap Scan on onek2 + Recheck Cond: (((unique2 = 11) AND (stringu1 < 'B'::name)) OR (unique1 = 0)) + -> BitmapOr + -> Bitmap Index Scan on onek2_u2_prtl + Index Cond: (unique2 = 11) + -> Bitmap Index Scan on onek2_u1_prtl + Index Cond: (unique1 = 0) +(7 rows) + +select unique1, unique2 from onek2 + where (unique2 = 11 and stringu1 < 'B') or unique1 = 0; + unique1 | unique2 +---------+--------- + 494 | 11 + 0 | 998 +(2 rows) + +-- +-- Test some corner cases that have been known to confuse the planner +-- +-- ORDER BY on a constant doesn't really need any sorting +SELECT 1 AS x ORDER BY x; + x +--- + 1 +(1 row) + +-- But ORDER BY on a set-valued expression does +create function sillysrf(int) returns setof int as + 'values (1),(10),(2),($1)' language sql immutable; +select sillysrf(42); + sillysrf +---------- + 1 + 10 + 2 + 42 +(4 rows) + +select sillysrf(-1) order by 1; + sillysrf +---------- + -1 + 1 + 2 + 10 +(4 rows) + +drop function sillysrf(int); +-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict +-- (see bug #5084) +select * from (values (2),(null),(1)) v(k) where k = k order by k; + k +--- + 1 + 2 +(2 rows) + +select * from (values (2),(null),(1)) v(k) where k = k; + k +--- + 2 + 1 +(2 rows) + +-- Test partitioned tables with no partitions, which should be handled the +-- same as the non-inheritance case when expanding its RTE. +create table list_parted_tbl (a int,b int) partition by list (a); +create table list_parted_tbl1 partition of list_parted_tbl + for values in (1) partition by list(b); +explain (costs off) select * from list_parted_tbl; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + +drop table list_parted_tbl; diff --git a/src/test/singlenode_regress/expected/select_distinct.out b/src/test/singlenode_regress/expected/select_distinct.out new file mode 100644 index 00000000000..480b313f40e --- /dev/null +++ b/src/test/singlenode_regress/expected/select_distinct.out @@ -0,0 +1,311 @@ +-- +-- SELECT_DISTINCT +-- +-- +-- awk '{print $3;}' onek.data | sort -n | uniq +-- +SELECT DISTINCT two FROM tmp ORDER BY 1; + two +----- + 0 + 1 +(2 rows) + +-- +-- awk '{print $5;}' onek.data | sort -n | uniq +-- +SELECT DISTINCT ten FROM tmp ORDER BY 1; + ten +----- + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +(10 rows) + +-- +-- awk '{print $16;}' onek.data | sort -d | uniq +-- +SELECT DISTINCT string4 FROM tmp ORDER BY 1; + string4 +--------- + AAAAxx + HHHHxx + OOOOxx + VVVVxx +(4 rows) + +-- +-- awk '{print $3,$16,$5;}' onek.data | sort -d | uniq | +-- sort +0n -1 +1d -2 +2n -3 +-- +SELECT DISTINCT two, string4, ten + FROM tmp + ORDER BY two using <, string4 using <, ten using <; + two | string4 | ten +-----+---------+----- + 0 | AAAAxx | 0 + 0 | AAAAxx | 2 + 0 | AAAAxx | 4 + 0 | AAAAxx | 6 + 0 | AAAAxx | 8 + 0 | HHHHxx | 0 + 0 | HHHHxx | 2 + 0 | HHHHxx | 4 + 0 | HHHHxx | 6 + 0 | HHHHxx | 8 + 0 | OOOOxx | 0 + 0 | OOOOxx | 2 + 0 | OOOOxx | 4 + 0 | OOOOxx | 6 + 0 | OOOOxx | 8 + 0 | VVVVxx | 0 + 0 | VVVVxx | 2 + 0 | VVVVxx | 4 + 0 | VVVVxx | 6 + 0 | VVVVxx | 8 + 1 | AAAAxx | 1 + 1 | AAAAxx | 3 + 1 | AAAAxx | 5 + 1 | AAAAxx | 7 + 1 | AAAAxx | 9 + 1 | HHHHxx | 1 + 1 | HHHHxx | 3 + 1 | HHHHxx | 5 + 1 | HHHHxx | 7 + 1 | HHHHxx | 9 + 1 | OOOOxx | 1 + 1 | OOOOxx | 3 + 1 | OOOOxx | 5 + 1 | OOOOxx | 7 + 1 | OOOOxx | 9 + 1 | VVVVxx | 1 + 1 | VVVVxx | 3 + 1 | VVVVxx | 5 + 1 | VVVVxx | 7 + 1 | VVVVxx | 9 +(40 rows) + +-- +-- awk '{print $2;}' person.data | +-- awk '{if(NF!=1){print $2;}else{print;}}' - emp.data | +-- awk '{if(NF!=1){print $2;}else{print;}}' - student.data | +-- awk 'BEGIN{FS=" ";}{if(NF!=1){print $5;}else{print;}}' - stud_emp.data | +-- sort -n -r | uniq +-- +SELECT DISTINCT p.age FROM person* p ORDER BY age using >; + age +----- + 98 + 88 + 78 + 68 + 60 + 58 + 50 + 48 + 40 + 38 + 34 + 30 + 28 + 25 + 24 + 23 + 20 + 19 + 18 + 8 +(20 rows) + +-- +-- Check mentioning same column more than once +-- +EXPLAIN (VERBOSE, COSTS OFF) +SELECT count(*) FROM + (SELECT DISTINCT two, four, two FROM tenk1) ss; + QUERY PLAN +-------------------------------------------------------- + Aggregate + Output: count(*) + -> HashAggregate + Output: tenk1.two, tenk1.four, tenk1.two + Group Key: tenk1.two, tenk1.four, tenk1.two + -> Seq Scan on public.tenk1 + Output: tenk1.two, tenk1.four, tenk1.two +(7 rows) + +SELECT count(*) FROM + (SELECT DISTINCT two, four, two FROM tenk1) ss; + count +------- + 4 +(1 row) + +-- +-- Compare results between plans using sorting and plans using hash +-- aggregation. Force spilling in both cases by setting work_mem low. +-- +SET work_mem='64kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- Produce results with sorting. +SET enable_hashagg=FALSE; +SET jit_above_cost=0; +EXPLAIN (costs off) +SELECT DISTINCT g%1000 FROM generate_series(0,9999) g; + QUERY PLAN +------------------------------------------------ + Unique + Group Key: ((g % 1000)) + -> Sort + Sort Key: ((g % 1000)) + -> Function Scan on generate_series g +(4 rows) + +CREATE TABLE distinct_group_1 AS +SELECT DISTINCT g%1000 FROM generate_series(0,9999) g; +SET jit_above_cost TO DEFAULT; +CREATE TABLE distinct_group_2 AS +SELECT DISTINCT (g%1000)::text FROM generate_series(0,9999) g; +SET enable_hashagg=TRUE; +-- Produce results with hash aggregation. +SET enable_sort=FALSE; +SET jit_above_cost=0; +EXPLAIN (costs off) +SELECT DISTINCT g%1000 FROM generate_series(0,9999) g; + QUERY PLAN +------------------------------------------ + HashAggregate + Group Key: (g % 1000) + -> Function Scan on generate_series g +(3 rows) + +CREATE TABLE distinct_hash_1 AS +SELECT DISTINCT g%1000 FROM generate_series(0,9999) g; +SET jit_above_cost TO DEFAULT; +CREATE TABLE distinct_hash_2 AS +SELECT DISTINCT (g%1000)::text FROM generate_series(0,9999) g; +SET enable_sort=TRUE; +SET work_mem TO DEFAULT; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- Compare results +(SELECT * FROM distinct_hash_1 EXCEPT SELECT * FROM distinct_group_1) + UNION ALL +(SELECT * FROM distinct_group_1 EXCEPT SELECT * FROM distinct_hash_1); + ?column? +---------- +(0 rows) + +(SELECT * FROM distinct_hash_1 EXCEPT SELECT * FROM distinct_group_1) + UNION ALL +(SELECT * FROM distinct_group_1 EXCEPT SELECT * FROM distinct_hash_1); + ?column? +---------- +(0 rows) + +DROP TABLE distinct_hash_1; +DROP TABLE distinct_hash_2; +DROP TABLE distinct_group_1; +DROP TABLE distinct_group_2; +-- +-- Also, some tests of IS DISTINCT FROM, which doesn't quite deserve its +-- very own regression file. +-- +CREATE TEMP TABLE disttable (f1 integer); +INSERT INTO DISTTABLE VALUES(1); +INSERT INTO DISTTABLE VALUES(2); +INSERT INTO DISTTABLE VALUES(3); +INSERT INTO DISTTABLE VALUES(NULL); +-- basic cases +SELECT f1, f1 IS DISTINCT FROM 2 as "not 2" FROM disttable; + f1 | not 2 +----+------- + 1 | t + 2 | f + 3 | t + | t +(4 rows) + +SELECT f1, f1 IS DISTINCT FROM NULL as "not null" FROM disttable; + f1 | not null +----+---------- + 1 | t + 2 | t + 3 | t + | f +(4 rows) + +SELECT f1, f1 IS DISTINCT FROM f1 as "false" FROM disttable; + f1 | false +----+------- + 1 | f + 2 | f + 3 | f + | f +(4 rows) + +SELECT f1, f1 IS DISTINCT FROM f1+1 as "not null" FROM disttable; + f1 | not null +----+---------- + 1 | t + 2 | t + 3 | t + | f +(4 rows) + +-- check that optimizer constant-folds it properly +SELECT 1 IS DISTINCT FROM 2 as "yes"; + yes +----- + t +(1 row) + +SELECT 2 IS DISTINCT FROM 2 as "no"; + no +---- + f +(1 row) + +SELECT 2 IS DISTINCT FROM null as "yes"; + yes +----- + t +(1 row) + +SELECT null IS DISTINCT FROM null as "no"; + no +---- + f +(1 row) + +-- negated form +SELECT 1 IS NOT DISTINCT FROM 2 as "no"; + no +---- + f +(1 row) + +SELECT 2 IS NOT DISTINCT FROM 2 as "yes"; + yes +----- + t +(1 row) + +SELECT 2 IS NOT DISTINCT FROM null as "no"; + no +---- + f +(1 row) + +SELECT null IS NOT DISTINCT FROM null as "yes"; + yes +----- + t +(1 row) + diff --git a/src/test/singlenode_regress/expected/select_distinct_on.out b/src/test/singlenode_regress/expected/select_distinct_on.out new file mode 100644 index 00000000000..b787b307f69 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_distinct_on.out @@ -0,0 +1,75 @@ +-- +-- SELECT_DISTINCT_ON +-- +SELECT DISTINCT ON (string4) string4, two, ten + FROM tmp + ORDER BY string4 using <, two using >, ten using <; + string4 | two | ten +---------+-----+----- + AAAAxx | 1 | 1 + HHHHxx | 1 | 1 + OOOOxx | 1 | 1 + VVVVxx | 1 | 1 +(4 rows) + +-- this will fail due to conflict of ordering requirements +SELECT DISTINCT ON (string4, ten) string4, two, ten + FROM tmp + ORDER BY string4 using <, two using <, ten using <; +ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions +LINE 1: SELECT DISTINCT ON (string4, ten) string4, two, ten + ^ +SELECT DISTINCT ON (string4, ten) string4, ten, two + FROM tmp + ORDER BY string4 using <, ten using >, two using <; + string4 | ten | two +---------+-----+----- + AAAAxx | 9 | 1 + AAAAxx | 8 | 0 + AAAAxx | 7 | 1 + AAAAxx | 6 | 0 + AAAAxx | 5 | 1 + AAAAxx | 4 | 0 + AAAAxx | 3 | 1 + AAAAxx | 2 | 0 + AAAAxx | 1 | 1 + AAAAxx | 0 | 0 + HHHHxx | 9 | 1 + HHHHxx | 8 | 0 + HHHHxx | 7 | 1 + HHHHxx | 6 | 0 + HHHHxx | 5 | 1 + HHHHxx | 4 | 0 + HHHHxx | 3 | 1 + HHHHxx | 2 | 0 + HHHHxx | 1 | 1 + HHHHxx | 0 | 0 + OOOOxx | 9 | 1 + OOOOxx | 8 | 0 + OOOOxx | 7 | 1 + OOOOxx | 6 | 0 + OOOOxx | 5 | 1 + OOOOxx | 4 | 0 + OOOOxx | 3 | 1 + OOOOxx | 2 | 0 + OOOOxx | 1 | 1 + OOOOxx | 0 | 0 + VVVVxx | 9 | 1 + VVVVxx | 8 | 0 + VVVVxx | 7 | 1 + VVVVxx | 6 | 0 + VVVVxx | 5 | 1 + VVVVxx | 4 | 0 + VVVVxx | 3 | 1 + VVVVxx | 2 | 0 + VVVVxx | 1 | 1 + VVVVxx | 0 | 0 +(40 rows) + +-- bug #5049: early 8.4.x chokes on volatile DISTINCT ON clauses +select distinct on (1) floor(random()) as r, f1 from int4_tbl order by 1,2; + r | f1 +---+------------- + 0 | -2147483647 +(1 row) + diff --git a/src/test/singlenode_regress/expected/select_having.out b/src/test/singlenode_regress/expected/select_having.out new file mode 100644 index 00000000000..3950c0b4048 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_having.out @@ -0,0 +1,93 @@ +-- +-- SELECT_HAVING +-- +-- load test data +CREATE TABLE test_having (a int, b int, c char(8), d char); +INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A'); +INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b'); +INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c'); +INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D'); +INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e'); +INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F'); +INSERT INTO test_having VALUES (6, 4, 'cccc', 'g'); +INSERT INTO test_having VALUES (7, 4, 'cccc', 'h'); +INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I'); +INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j'); +SELECT b, c FROM test_having + GROUP BY b, c HAVING count(*) = 1 ORDER BY b, c; + b | c +---+---------- + 1 | XXXX + 3 | bbbb +(2 rows) + +-- HAVING is effectively equivalent to WHERE in this case +SELECT b, c FROM test_having + GROUP BY b, c HAVING b = 3 ORDER BY b, c; + b | c +---+---------- + 3 | BBBB + 3 | bbbb +(2 rows) + +SELECT lower(c), count(c) FROM test_having + GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY lower(c); + lower | count +-------+------- + bbbb | 3 + cccc | 4 + xxxx | 1 +(3 rows) + +SELECT c, max(a) FROM test_having + GROUP BY c HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY c; + c | max +----------+----- + XXXX | 0 + bbbb | 5 +(2 rows) + +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); + min | max +-----+----- +(0 rows) + +SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a); + min | max +-----+----- + 0 | 9 +(1 row) + +-- errors: ungrouped column references +SELECT a FROM test_having HAVING min(a) < max(a); +ERROR: column "test_having.a" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT a FROM test_having HAVING min(a) < max(a); + ^ +SELECT 1 AS one FROM test_having HAVING a > 1; +ERROR: column "test_having.a" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT 1 AS one FROM test_having HAVING a > 1; + ^ +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; + one +----- +(0 rows) + +SELECT 1 AS one FROM test_having HAVING 1 < 2; + one +----- + 1 +(1 row) + +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; + one +----- + 1 +(1 row) + +DROP TABLE test_having; diff --git a/src/test/singlenode_regress/expected/select_having_1.out b/src/test/singlenode_regress/expected/select_having_1.out new file mode 100644 index 00000000000..5c58da154c8 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_having_1.out @@ -0,0 +1,93 @@ +-- +-- SELECT_HAVING +-- +-- load test data +CREATE TABLE test_having (a int, b int, c char(8), d char); +INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A'); +INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b'); +INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c'); +INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D'); +INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e'); +INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F'); +INSERT INTO test_having VALUES (6, 4, 'cccc', 'g'); +INSERT INTO test_having VALUES (7, 4, 'cccc', 'h'); +INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I'); +INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j'); +SELECT b, c FROM test_having + GROUP BY b, c HAVING count(*) = 1 ORDER BY b, c; + b | c +---+---------- + 1 | XXXX + 3 | bbbb +(2 rows) + +-- HAVING is effectively equivalent to WHERE in this case +SELECT b, c FROM test_having + GROUP BY b, c HAVING b = 3 ORDER BY b, c; + b | c +---+---------- + 3 | BBBB + 3 | bbbb +(2 rows) + +SELECT lower(c), count(c) FROM test_having + GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY lower(c); + lower | count +-------+------- + bbbb | 3 + cccc | 4 + xxxx | 1 +(3 rows) + +SELECT c, max(a) FROM test_having + GROUP BY c HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY c; + c | max +----------+----- + bbbb | 5 + XXXX | 0 +(2 rows) + +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); + min | max +-----+----- +(0 rows) + +SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a); + min | max +-----+----- + 0 | 9 +(1 row) + +-- errors: ungrouped column references +SELECT a FROM test_having HAVING min(a) < max(a); +ERROR: column "test_having.a" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT a FROM test_having HAVING min(a) < max(a); + ^ +SELECT 1 AS one FROM test_having HAVING a > 1; +ERROR: column "test_having.a" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT 1 AS one FROM test_having HAVING a > 1; + ^ +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; + one +----- +(0 rows) + +SELECT 1 AS one FROM test_having HAVING 1 < 2; + one +----- + 1 +(1 row) + +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; + one +----- + 1 +(1 row) + +DROP TABLE test_having; diff --git a/src/test/singlenode_regress/expected/select_having_2.out b/src/test/singlenode_regress/expected/select_having_2.out new file mode 100644 index 00000000000..7087fb1c0c7 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_having_2.out @@ -0,0 +1,93 @@ +-- +-- SELECT_HAVING +-- +-- load test data +CREATE TABLE test_having (a int, b int, c char(8), d char); +INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A'); +INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b'); +INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c'); +INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D'); +INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e'); +INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F'); +INSERT INTO test_having VALUES (6, 4, 'cccc', 'g'); +INSERT INTO test_having VALUES (7, 4, 'cccc', 'h'); +INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I'); +INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j'); +SELECT b, c FROM test_having + GROUP BY b, c HAVING count(*) = 1 ORDER BY b, c; + b | c +---+---------- + 1 | XXXX + 3 | bbbb +(2 rows) + +-- HAVING is effectively equivalent to WHERE in this case +SELECT b, c FROM test_having + GROUP BY b, c HAVING b = 3 ORDER BY b, c; + b | c +---+---------- + 3 | bbbb + 3 | BBBB +(2 rows) + +SELECT lower(c), count(c) FROM test_having + GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY lower(c); + lower | count +-------+------- + bbbb | 3 + cccc | 4 + xxxx | 1 +(3 rows) + +SELECT c, max(a) FROM test_having + GROUP BY c HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY c; + c | max +----------+----- + bbbb | 5 + XXXX | 0 +(2 rows) + +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); + min | max +-----+----- +(0 rows) + +SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a); + min | max +-----+----- + 0 | 9 +(1 row) + +-- errors: ungrouped column references +SELECT a FROM test_having HAVING min(a) < max(a); +ERROR: column "test_having.a" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT a FROM test_having HAVING min(a) < max(a); + ^ +SELECT 1 AS one FROM test_having HAVING a > 1; +ERROR: column "test_having.a" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: SELECT 1 AS one FROM test_having HAVING a > 1; + ^ +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; + one +----- +(0 rows) + +SELECT 1 AS one FROM test_having HAVING 1 < 2; + one +----- + 1 +(1 row) + +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; + one +----- + 1 +(1 row) + +DROP TABLE test_having; diff --git a/src/test/singlenode_regress/expected/select_implicit.out b/src/test/singlenode_regress/expected/select_implicit.out new file mode 100644 index 00000000000..27c07de92cc --- /dev/null +++ b/src/test/singlenode_regress/expected/select_implicit.out @@ -0,0 +1,338 @@ +-- +-- SELECT_IMPLICIT +-- Test cases for queries with ordering terms missing from the target list. +-- This used to be called "junkfilter.sql". +-- The parser uses the term "resjunk" to handle these cases. +-- - thomas 1998-07-09 +-- +-- load test data +CREATE TABLE test_missing_target (a int, b int, c char(8), d char); +INSERT INTO test_missing_target VALUES (0, 1, 'XXXX', 'A'); +INSERT INTO test_missing_target VALUES (1, 2, 'ABAB', 'b'); +INSERT INTO test_missing_target VALUES (2, 2, 'ABAB', 'c'); +INSERT INTO test_missing_target VALUES (3, 3, 'BBBB', 'D'); +INSERT INTO test_missing_target VALUES (4, 3, 'BBBB', 'e'); +INSERT INTO test_missing_target VALUES (5, 3, 'bbbb', 'F'); +INSERT INTO test_missing_target VALUES (6, 4, 'cccc', 'g'); +INSERT INTO test_missing_target VALUES (7, 4, 'cccc', 'h'); +INSERT INTO test_missing_target VALUES (8, 4, 'CCCC', 'I'); +INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); +-- w/ existing GROUP BY target +SELECT c, count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; + c | count +----------+------- + ABAB | 2 + BBBB | 2 + CCCC | 2 + XXXX | 1 + bbbb | 1 + cccc | 2 +(6 rows) + +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; + count +------- + 2 + 2 + 2 + 1 + 1 + 2 +(6 rows) + +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; +ERROR: column "test_missing_target.b" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: ...ECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- w/ existing GROUP BY target using a relation name in target +SELECT test_missing_target.b, count(*) + FROM test_missing_target GROUP BY b ORDER BY b; + b | count +---+------- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(4 rows) + +-- w/o existing GROUP BY target +SELECT c FROM test_missing_target ORDER BY a; + c +---------- + XXXX + ABAB + ABAB + BBBB + BBBB + bbbb + cccc + cccc + CCCC + CCCC +(10 rows) + +-- w/o existing ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b desc; + count +------- + 4 + 3 + 2 + 1 +(4 rows) + +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; + count +------- + 10 +(1 row) + +-- order using reference number +SELECT c, count(*) FROM test_missing_target GROUP BY 1 ORDER BY 1; + c | count +----------+------- + ABAB | 2 + BBBB | 2 + CCCC | 2 + XXXX | 1 + bbbb | 1 + cccc | 2 +(6 rows) + +-- group using reference number out of range +-- failure expected +SELECT c, count(*) FROM test_missing_target GROUP BY 3; +ERROR: GROUP BY position 3 is not in select list +LINE 1: SELECT c, count(*) FROM test_missing_target GROUP BY 3; + ^ +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b ORDER BY b; +ERROR: column reference "b" is ambiguous +LINE 3: GROUP BY b ORDER BY b; + ^ +-- order w/ target under ambiguous condition +-- failure NOT expected +SELECT a, a FROM test_missing_target + ORDER BY a; + a | a +---+--- + 0 | 0 + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 +(10 rows) + +-- order expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + ORDER BY a/2; + ?column? | ?column? +----------+---------- + 0 | 0 + 0 | 0 + 1 | 1 + 1 | 1 + 2 | 2 + 2 | 2 + 3 | 3 + 3 | 3 + 4 | 4 + 4 | 4 +(10 rows) + +-- group expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + GROUP BY a/2 ORDER BY a/2; + ?column? | ?column? +----------+---------- + 0 | 0 + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(5 rows) + +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b, count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; + b | count +---+------- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(4 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target2 AS +SELECT count(*) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +SELECT * FROM test_missing_target2; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- Functions and expressions +-- w/ existing GROUP BY target +SELECT a%2, count(b) FROM test_missing_target +GROUP BY test_missing_target.a%2 +ORDER BY test_missing_target.a%2; + ?column? | count +----------+------- + 0 | 5 + 1 | 5 +(2 rows) + +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(c) FROM test_missing_target +GROUP BY lower(test_missing_target.c) +ORDER BY lower(test_missing_target.c); + count +------- + 2 + 3 + 4 + 1 +(4 rows) + +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; +ERROR: column "test_missing_target.b" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: ...ECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(b) FROM test_missing_target GROUP BY b/2 ORDER BY b/2; + count +------- + 1 + 5 + 4 +(3 rows) + +-- w/ existing GROUP BY target using a relation name in target +SELECT lower(test_missing_target.c), count(c) + FROM test_missing_target GROUP BY lower(c) ORDER BY lower(c); + lower | count +-------+------- + abab | 2 + bbbb | 3 + cccc | 4 + xxxx | 1 +(4 rows) + +-- w/o existing GROUP BY target +SELECT a FROM test_missing_target ORDER BY upper(d); + a +--- + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +(10 rows) + +-- w/o existing ORDER BY target +SELECT count(b) FROM test_missing_target + GROUP BY (b + 1) / 2 ORDER BY (b + 1) / 2 desc; + count +------- + 7 + 3 +(2 rows) + +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(x.a) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b/2 ORDER BY b/2; +ERROR: column reference "b" is ambiguous +LINE 3: GROUP BY b/2 ORDER BY b/2; + ^ +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b/2, count(x.b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; + ?column? | count +----------+------- + 0 | 1 + 1 | 5 + 2 | 4 +(3 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +-- failure expected due to ambiguous b in count(b) +SELECT count(b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2; +ERROR: column reference "b" is ambiguous +LINE 1: SELECT count(b) FROM test_missing_target x, test_missing_tar... + ^ +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target3 AS +SELECT count(x.b) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +SELECT * FROM test_missing_target3; + count +------- + 1 + 5 + 4 +(3 rows) + +-- Cleanup +DROP TABLE test_missing_target; +DROP TABLE test_missing_target2; +DROP TABLE test_missing_target3; diff --git a/src/test/singlenode_regress/expected/select_implicit_1.out b/src/test/singlenode_regress/expected/select_implicit_1.out new file mode 100644 index 00000000000..d67521e8f83 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_implicit_1.out @@ -0,0 +1,338 @@ +-- +-- SELECT_IMPLICIT +-- Test cases for queries with ordering terms missing from the target list. +-- This used to be called "junkfilter.sql". +-- The parser uses the term "resjunk" to handle these cases. +-- - thomas 1998-07-09 +-- +-- load test data +CREATE TABLE test_missing_target (a int, b int, c char(8), d char); +INSERT INTO test_missing_target VALUES (0, 1, 'XXXX', 'A'); +INSERT INTO test_missing_target VALUES (1, 2, 'ABAB', 'b'); +INSERT INTO test_missing_target VALUES (2, 2, 'ABAB', 'c'); +INSERT INTO test_missing_target VALUES (3, 3, 'BBBB', 'D'); +INSERT INTO test_missing_target VALUES (4, 3, 'BBBB', 'e'); +INSERT INTO test_missing_target VALUES (5, 3, 'bbbb', 'F'); +INSERT INTO test_missing_target VALUES (6, 4, 'cccc', 'g'); +INSERT INTO test_missing_target VALUES (7, 4, 'cccc', 'h'); +INSERT INTO test_missing_target VALUES (8, 4, 'CCCC', 'I'); +INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); +-- w/ existing GROUP BY target +SELECT c, count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; + c | count +----------+------- + ABAB | 2 + BBBB | 2 + bbbb | 1 + CCCC | 2 + cccc | 2 + XXXX | 1 +(6 rows) + +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; + count +------- + 2 + 2 + 1 + 2 + 2 + 1 +(6 rows) + +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; +ERROR: column "test_missing_target.b" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: ...ECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- w/ existing GROUP BY target using a relation name in target +SELECT test_missing_target.b, count(*) + FROM test_missing_target GROUP BY b ORDER BY b; + b | count +---+------- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(4 rows) + +-- w/o existing GROUP BY target +SELECT c FROM test_missing_target ORDER BY a; + c +---------- + XXXX + ABAB + ABAB + BBBB + BBBB + bbbb + cccc + cccc + CCCC + CCCC +(10 rows) + +-- w/o existing ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b desc; + count +------- + 4 + 3 + 2 + 1 +(4 rows) + +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; + count +------- + 10 +(1 row) + +-- order using reference number +SELECT c, count(*) FROM test_missing_target GROUP BY 1 ORDER BY 1; + c | count +----------+------- + ABAB | 2 + BBBB | 2 + bbbb | 1 + CCCC | 2 + cccc | 2 + XXXX | 1 +(6 rows) + +-- group using reference number out of range +-- failure expected +SELECT c, count(*) FROM test_missing_target GROUP BY 3; +ERROR: GROUP BY position 3 is not in select list +LINE 1: SELECT c, count(*) FROM test_missing_target GROUP BY 3; + ^ +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b ORDER BY b; +ERROR: column reference "b" is ambiguous +LINE 3: GROUP BY b ORDER BY b; + ^ +-- order w/ target under ambiguous condition +-- failure NOT expected +SELECT a, a FROM test_missing_target + ORDER BY a; + a | a +---+--- + 0 | 0 + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 +(10 rows) + +-- order expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + ORDER BY a/2; + ?column? | ?column? +----------+---------- + 0 | 0 + 0 | 0 + 1 | 1 + 1 | 1 + 2 | 2 + 2 | 2 + 3 | 3 + 3 | 3 + 4 | 4 + 4 | 4 +(10 rows) + +-- group expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + GROUP BY a/2 ORDER BY a/2; + ?column? | ?column? +----------+---------- + 0 | 0 + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(5 rows) + +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b, count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; + b | count +---+------- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(4 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target2 AS +SELECT count(*) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +SELECT * FROM test_missing_target2; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- Functions and expressions +-- w/ existing GROUP BY target +SELECT a%2, count(b) FROM test_missing_target +GROUP BY test_missing_target.a%2 +ORDER BY test_missing_target.a%2; + ?column? | count +----------+------- + 0 | 5 + 1 | 5 +(2 rows) + +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(c) FROM test_missing_target +GROUP BY lower(test_missing_target.c) +ORDER BY lower(test_missing_target.c); + count +------- + 2 + 3 + 4 + 1 +(4 rows) + +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; +ERROR: column "test_missing_target.b" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: ...ECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(b) FROM test_missing_target GROUP BY b/2 ORDER BY b/2; + count +------- + 1 + 5 + 4 +(3 rows) + +-- w/ existing GROUP BY target using a relation name in target +SELECT lower(test_missing_target.c), count(c) + FROM test_missing_target GROUP BY lower(c) ORDER BY lower(c); + lower | count +-------+------- + abab | 2 + bbbb | 3 + cccc | 4 + xxxx | 1 +(4 rows) + +-- w/o existing GROUP BY target +SELECT a FROM test_missing_target ORDER BY upper(d); + a +--- + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +(10 rows) + +-- w/o existing ORDER BY target +SELECT count(b) FROM test_missing_target + GROUP BY (b + 1) / 2 ORDER BY (b + 1) / 2 desc; + count +------- + 7 + 3 +(2 rows) + +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(x.a) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b/2 ORDER BY b/2; +ERROR: column reference "b" is ambiguous +LINE 3: GROUP BY b/2 ORDER BY b/2; + ^ +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b/2, count(x.b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; + ?column? | count +----------+------- + 0 | 1 + 1 | 5 + 2 | 4 +(3 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +-- failure expected due to ambiguous b in count(b) +SELECT count(b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2; +ERROR: column reference "b" is ambiguous +LINE 1: SELECT count(b) FROM test_missing_target x, test_missing_tar... + ^ +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target3 AS +SELECT count(x.b) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +SELECT * FROM test_missing_target3; + count +------- + 1 + 5 + 4 +(3 rows) + +-- Cleanup +DROP TABLE test_missing_target; +DROP TABLE test_missing_target2; +DROP TABLE test_missing_target3; diff --git a/src/test/singlenode_regress/expected/select_implicit_2.out b/src/test/singlenode_regress/expected/select_implicit_2.out new file mode 100644 index 00000000000..7a353d08627 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_implicit_2.out @@ -0,0 +1,338 @@ +-- +-- SELECT_IMPLICIT +-- Test cases for queries with ordering terms missing from the target list. +-- This used to be called "junkfilter.sql". +-- The parser uses the term "resjunk" to handle these cases. +-- - thomas 1998-07-09 +-- +-- load test data +CREATE TABLE test_missing_target (a int, b int, c char(8), d char); +INSERT INTO test_missing_target VALUES (0, 1, 'XXXX', 'A'); +INSERT INTO test_missing_target VALUES (1, 2, 'ABAB', 'b'); +INSERT INTO test_missing_target VALUES (2, 2, 'ABAB', 'c'); +INSERT INTO test_missing_target VALUES (3, 3, 'BBBB', 'D'); +INSERT INTO test_missing_target VALUES (4, 3, 'BBBB', 'e'); +INSERT INTO test_missing_target VALUES (5, 3, 'bbbb', 'F'); +INSERT INTO test_missing_target VALUES (6, 4, 'cccc', 'g'); +INSERT INTO test_missing_target VALUES (7, 4, 'cccc', 'h'); +INSERT INTO test_missing_target VALUES (8, 4, 'CCCC', 'I'); +INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); +-- w/ existing GROUP BY target +SELECT c, count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; + c | count +----------+------- + ABAB | 2 + bbbb | 1 + BBBB | 2 + cccc | 2 + CCCC | 2 + XXXX | 1 +(6 rows) + +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; + count +------- + 2 + 1 + 2 + 2 + 2 + 1 +(6 rows) + +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; +ERROR: column "test_missing_target.b" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: ...ECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- w/ existing GROUP BY target using a relation name in target +SELECT test_missing_target.b, count(*) + FROM test_missing_target GROUP BY b ORDER BY b; + b | count +---+------- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(4 rows) + +-- w/o existing GROUP BY target +SELECT c FROM test_missing_target ORDER BY a; + c +---------- + XXXX + ABAB + ABAB + BBBB + BBBB + bbbb + cccc + cccc + CCCC + CCCC +(10 rows) + +-- w/o existing ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b desc; + count +------- + 4 + 3 + 2 + 1 +(4 rows) + +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; + count +------- + 10 +(1 row) + +-- order using reference number +SELECT c, count(*) FROM test_missing_target GROUP BY 1 ORDER BY 1; + c | count +----------+------- + ABAB | 2 + bbbb | 1 + BBBB | 2 + cccc | 2 + CCCC | 2 + XXXX | 1 +(6 rows) + +-- group using reference number out of range +-- failure expected +SELECT c, count(*) FROM test_missing_target GROUP BY 3; +ERROR: GROUP BY position 3 is not in select list +LINE 1: SELECT c, count(*) FROM test_missing_target GROUP BY 3; + ^ +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b ORDER BY b; +ERROR: column reference "b" is ambiguous +LINE 3: GROUP BY b ORDER BY b; + ^ +-- order w/ target under ambiguous condition +-- failure NOT expected +SELECT a, a FROM test_missing_target + ORDER BY a; + a | a +---+--- + 0 | 0 + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 +(10 rows) + +-- order expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + ORDER BY a/2; + ?column? | ?column? +----------+---------- + 0 | 0 + 0 | 0 + 1 | 1 + 1 | 1 + 2 | 2 + 2 | 2 + 3 | 3 + 3 | 3 + 4 | 4 + 4 | 4 +(10 rows) + +-- group expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + GROUP BY a/2 ORDER BY a/2; + ?column? | ?column? +----------+---------- + 0 | 0 + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(5 rows) + +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b, count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; + b | count +---+------- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 +(4 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target2 AS +SELECT count(*) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +SELECT * FROM test_missing_target2; + count +------- + 1 + 2 + 3 + 4 +(4 rows) + +-- Functions and expressions +-- w/ existing GROUP BY target +SELECT a%2, count(b) FROM test_missing_target +GROUP BY test_missing_target.a%2 +ORDER BY test_missing_target.a%2; + ?column? | count +----------+------- + 0 | 5 + 1 | 5 +(2 rows) + +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(c) FROM test_missing_target +GROUP BY lower(test_missing_target.c) +ORDER BY lower(test_missing_target.c); + count +------- + 2 + 3 + 4 + 1 +(4 rows) + +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; +ERROR: column "test_missing_target.b" must appear in the GROUP BY clause or be used in an aggregate function +LINE 1: ...ECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + ^ +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(b) FROM test_missing_target GROUP BY b/2 ORDER BY b/2; + count +------- + 1 + 5 + 4 +(3 rows) + +-- w/ existing GROUP BY target using a relation name in target +SELECT lower(test_missing_target.c), count(c) + FROM test_missing_target GROUP BY lower(c) ORDER BY lower(c); + lower | count +-------+------- + abab | 2 + bbbb | 3 + cccc | 4 + xxxx | 1 +(4 rows) + +-- w/o existing GROUP BY target +SELECT a FROM test_missing_target ORDER BY upper(d); + a +--- + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +(10 rows) + +-- w/o existing ORDER BY target +SELECT count(b) FROM test_missing_target + GROUP BY (b + 1) / 2 ORDER BY (b + 1) / 2 desc; + count +------- + 7 + 3 +(2 rows) + +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(x.a) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b/2 ORDER BY b/2; +ERROR: column reference "b" is ambiguous +LINE 3: GROUP BY b/2 ORDER BY b/2; + ^ +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b/2, count(x.b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; + ?column? | count +----------+------- + 0 | 1 + 1 | 5 + 2 | 4 +(3 rows) + +-- group w/o existing GROUP BY target under ambiguous condition +-- failure expected due to ambiguous b in count(b) +SELECT count(b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2; +ERROR: column reference "b" is ambiguous +LINE 1: SELECT count(b) FROM test_missing_target x, test_missing_tar... + ^ +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target3 AS +SELECT count(x.b) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +SELECT * FROM test_missing_target3; + count +------- + 1 + 5 + 4 +(3 rows) + +-- Cleanup +DROP TABLE test_missing_target; +DROP TABLE test_missing_target2; +DROP TABLE test_missing_target3; diff --git a/src/test/singlenode_regress/expected/select_into.out b/src/test/singlenode_regress/expected/select_into.out new file mode 100644 index 00000000000..43b8209d229 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_into.out @@ -0,0 +1,222 @@ +-- +-- SELECT_INTO +-- +SELECT * + INTO TABLE sitmp1 + FROM onek + WHERE onek.unique1 < 2; +DROP TABLE sitmp1; +SELECT * + INTO TABLE sitmp1 + FROM onek2 + WHERE onek2.unique1 < 2; +DROP TABLE sitmp1; +-- +-- SELECT INTO and INSERT permission, if owner is not allowed to insert. +-- +CREATE SCHEMA selinto_schema; +CREATE USER regress_selinto_user; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user + REVOKE INSERT ON TABLES FROM regress_selinto_user; +GRANT ALL ON SCHEMA selinto_schema TO public; +SET SESSION AUTHORIZATION regress_selinto_user; +-- WITH DATA, passes. +CREATE TABLE selinto_schema.tbl_withdata1 (a) + AS SELECT generate_series(1,3) WITH DATA; +INSERT INTO selinto_schema.tbl_withdata1 VALUES (4); +ERROR: permission denied for table tbl_withdata1 +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE selinto_schema.tbl_withdata2 (a) AS + SELECT generate_series(1,3) WITH DATA; + QUERY PLAN +-------------------------------------- + ProjectSet (actual rows=3 loops=1) + -> Result (actual rows=1 loops=1) +(2 rows) + +-- WITH NO DATA, passes. +CREATE TABLE selinto_schema.tbl_nodata1 (a) AS + SELECT generate_series(1,3) WITH NO DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE selinto_schema.tbl_nodata2 (a) AS + SELECT generate_series(1,3) WITH NO DATA; + QUERY PLAN +------------------------------- + ProjectSet (never executed) + -> Result (never executed) +(2 rows) + +-- EXECUTE and WITH DATA, passes. +PREPARE data_sel AS SELECT generate_series(1,3); +CREATE TABLE selinto_schema.tbl_withdata3 (a) AS + EXECUTE data_sel WITH DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE selinto_schema.tbl_withdata4 (a) AS + EXECUTE data_sel WITH DATA; + QUERY PLAN +-------------------------------------- + ProjectSet (actual rows=3 loops=1) + -> Result (actual rows=1 loops=1) +(2 rows) + +-- EXECUTE and WITH NO DATA, passes. +CREATE TABLE selinto_schema.tbl_nodata3 (a) AS + EXECUTE data_sel WITH NO DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE selinto_schema.tbl_nodata4 (a) AS + EXECUTE data_sel WITH NO DATA; + QUERY PLAN +------------------------------- + ProjectSet (never executed) + -> Result (never executed) +(2 rows) + +RESET SESSION AUTHORIZATION; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user + GRANT INSERT ON TABLES TO regress_selinto_user; +SET SESSION AUTHORIZATION regress_selinto_user; +RESET SESSION AUTHORIZATION; +DEALLOCATE data_sel; +DROP SCHEMA selinto_schema CASCADE; +NOTICE: drop cascades to 8 other objects +DETAIL: drop cascades to table selinto_schema.tbl_withdata1 +drop cascades to table selinto_schema.tbl_withdata2 +drop cascades to table selinto_schema.tbl_nodata1 +drop cascades to table selinto_schema.tbl_nodata2 +drop cascades to table selinto_schema.tbl_withdata3 +drop cascades to table selinto_schema.tbl_withdata4 +drop cascades to table selinto_schema.tbl_nodata3 +drop cascades to table selinto_schema.tbl_nodata4 +DROP USER regress_selinto_user; +-- Tests for WITH NO DATA and column name consistency +CREATE TABLE ctas_base (i int, j int); +INSERT INTO ctas_base VALUES (1, 2); +CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base; -- Error +ERROR: too many column names were specified +CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base WITH NO DATA; -- Error +ERROR: too many column names were specified +CREATE TABLE ctas_nodata (ii, jj) AS SELECT i, j FROM ctas_base; -- OK +CREATE TABLE ctas_nodata_2 (ii, jj) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK +CREATE TABLE ctas_nodata_3 (ii) AS SELECT i, j FROM ctas_base; -- OK +CREATE TABLE ctas_nodata_4 (ii) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK +SELECT * FROM ctas_nodata; + ii | jj +----+---- + 1 | 2 +(1 row) + +SELECT * FROM ctas_nodata_2; + ii | jj +----+---- +(0 rows) + +SELECT * FROM ctas_nodata_3; + ii | j +----+--- + 1 | 2 +(1 row) + +SELECT * FROM ctas_nodata_4; + ii | j +----+--- +(0 rows) + +DROP TABLE ctas_base; +DROP TABLE ctas_nodata; +DROP TABLE ctas_nodata_2; +DROP TABLE ctas_nodata_3; +DROP TABLE ctas_nodata_4; +-- +-- CREATE TABLE AS/SELECT INTO as last command in a SQL function +-- have been known to cause problems +-- +CREATE FUNCTION make_table() RETURNS VOID +AS $$ + CREATE TABLE created_table AS SELECT * FROM int8_tbl; +$$ LANGUAGE SQL; +SELECT make_table(); + make_table +------------ + +(1 row) + +SELECT * FROM created_table; + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +-- Try EXPLAIN ANALYZE SELECT INTO and EXPLAIN ANALYZE CREATE TABLE AS +-- WITH NO DATA, but hide the outputs since they won't be stable. +DO $$ +BEGIN + EXECUTE 'EXPLAIN ANALYZE SELECT * INTO TABLE easi FROM int8_tbl'; + EXECUTE 'EXPLAIN ANALYZE CREATE TABLE easi2 AS SELECT * FROM int8_tbl WITH NO DATA'; +END$$; +DROP TABLE created_table; +DROP TABLE easi, easi2; +-- +-- Disallowed uses of SELECT ... INTO. All should fail +-- +DECLARE foo CURSOR FOR SELECT 1 INTO b; +ERROR: SELECT ... INTO is not allowed here +LINE 1: DECLARE foo CURSOR FOR SELECT 1 INTO b; + ^ +COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob'; +ERROR: COPY (SELECT INTO) is not supported +SELECT * FROM (SELECT 1 INTO f) bar; +ERROR: SELECT ... INTO is not allowed here +LINE 1: SELECT * FROM (SELECT 1 INTO f) bar; + ^ +CREATE VIEW foo AS SELECT 1 INTO b; +ERROR: views must not contain SELECT INTO +INSERT INTO b SELECT 1 INTO f; +ERROR: SELECT ... INTO is not allowed here +LINE 1: INSERT INTO b SELECT 1 INTO f; + ^ +-- Test CREATE TABLE AS ... IF NOT EXISTS +CREATE TABLE ctas_ine_tbl AS SELECT 1; +CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error +ERROR: relation "ctas_ine_tbl" already exists +CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok +NOTICE: relation "ctas_ine_tbl" already exists, skipping +CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error +ERROR: relation "ctas_ine_tbl" already exists +CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok +NOTICE: relation "ctas_ine_tbl" already exists, skipping +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error +ERROR: relation "ctas_ine_tbl" already exists +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok +NOTICE: relation "ctas_ine_tbl" already exists, skipping + QUERY PLAN +------------ +(0 rows) + +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error +ERROR: relation "ctas_ine_tbl" already exists +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok +NOTICE: relation "ctas_ine_tbl" already exists, skipping + QUERY PLAN +------------ +(0 rows) + +PREPARE ctas_ine_query AS SELECT 1 / 0; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE ctas_ine_tbl AS EXECUTE ctas_ine_query; -- error +ERROR: relation "ctas_ine_tbl" already exists +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS EXECUTE ctas_ine_query; -- ok +NOTICE: relation "ctas_ine_tbl" already exists, skipping + QUERY PLAN +------------ +(0 rows) + +DROP TABLE ctas_ine_tbl; diff --git a/src/test/singlenode_regress/expected/select_parallel.out b/src/test/singlenode_regress/expected/select_parallel.out new file mode 100644 index 00000000000..b8c8eb18b44 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_parallel.out @@ -0,0 +1,1119 @@ +-- +-- PARALLEL +-- +-- GPDB_96_MERGE_FIXME: We don't support parallel query. These tests won't actually +-- generate any parallel plans. Should we pay attention to the parallel restrictions +-- when creating MPP plans? For example, should we force parallel restricted functions +-- to run in the QD? +create function sp_parallel_restricted(int) returns int as + $$begin return $1; end$$ language plpgsql parallel restricted; +begin; +-- encourage use of parallel plans +set parallel_setup_cost=0; +set parallel_tuple_cost=0; +set min_parallel_table_scan_size=0; +set max_parallel_workers_per_gather=4; +-- Parallel Append with partial-subplans +explain (costs off) + select round(avg(aa)), sum(aa) from a_star; + QUERY PLAN +----------------------------------------- + Aggregate + -> Append + -> Seq Scan on a_star a_star_1 + -> Seq Scan on b_star a_star_2 + -> Seq Scan on c_star a_star_3 + -> Seq Scan on d_star a_star_4 + -> Seq Scan on e_star a_star_5 + -> Seq Scan on f_star a_star_6 + Optimizer: Postgres query optimizer +(9 rows) + +select round(avg(aa)), sum(aa) from a_star a1; + round | sum +-------+----- + 14 | 355 +(1 row) + +-- Parallel Append with both partial and non-partial subplans +alter table c_star set (parallel_workers = 0); +alter table d_star set (parallel_workers = 0); +explain (costs off) + select round(avg(aa)), sum(aa) from a_star; + QUERY PLAN +----------------------------------------- + Aggregate + -> Append + -> Seq Scan on a_star a_star_1 + -> Seq Scan on b_star a_star_2 + -> Seq Scan on c_star a_star_3 + -> Seq Scan on d_star a_star_4 + -> Seq Scan on e_star a_star_5 + -> Seq Scan on f_star a_star_6 + Optimizer: Postgres query optimizer +(9 rows) + +select round(avg(aa)), sum(aa) from a_star a2; + round | sum +-------+----- + 14 | 355 +(1 row) + +-- Parallel Append with only non-partial subplans +alter table a_star set (parallel_workers = 0); +alter table b_star set (parallel_workers = 0); +alter table e_star set (parallel_workers = 0); +alter table f_star set (parallel_workers = 0); +explain (costs off) + select round(avg(aa)), sum(aa) from a_star; + QUERY PLAN +----------------------------------------- + Aggregate + -> Append + -> Seq Scan on a_star a_star_1 + -> Seq Scan on b_star a_star_2 + -> Seq Scan on c_star a_star_3 + -> Seq Scan on d_star a_star_4 + -> Seq Scan on e_star a_star_5 + -> Seq Scan on f_star a_star_6 + Optimizer: Postgres query optimizer +(9 rows) + +select round(avg(aa)), sum(aa) from a_star a3; + round | sum +-------+----- + 14 | 355 +(1 row) + +-- Disable Parallel Append +alter table a_star reset (parallel_workers); +alter table b_star reset (parallel_workers); +alter table c_star reset (parallel_workers); +alter table d_star reset (parallel_workers); +alter table e_star reset (parallel_workers); +alter table f_star reset (parallel_workers); +set enable_parallel_append to off; +explain (costs off) + select round(avg(aa)), sum(aa) from a_star; + QUERY PLAN +----------------------------------------- + Aggregate + -> Append + -> Seq Scan on a_star a_star_1 + -> Seq Scan on b_star a_star_2 + -> Seq Scan on c_star a_star_3 + -> Seq Scan on d_star a_star_4 + -> Seq Scan on e_star a_star_5 + -> Seq Scan on f_star a_star_6 + Optimizer: Postgres query optimizer +(9 rows) + +select round(avg(aa)), sum(aa) from a_star a4; + round | sum +-------+----- + 14 | 355 +(1 row) + +reset enable_parallel_append; +-- Parallel Append that runs serially +create function sp_test_func() returns setof text as +$$ select 'foo'::varchar union all select 'bar'::varchar $$ +language sql stable; +select sp_test_func() order by 1; + sp_test_func +-------------- + bar + foo +(2 rows) + +-- Parallel Append is not to be used when the subpath depends on the outer param +create table part_pa_test(a int, b int) partition by range(a); +create table part_pa_test_p1 partition of part_pa_test for values from (minvalue) to (0); +create table part_pa_test_p2 partition of part_pa_test for values from (0) to (maxvalue); +explain (costs off) + select (select max((select pa1.b from part_pa_test pa1 where pa1.a = pa2.a))) + from part_pa_test pa2; + QUERY PLAN +------------------------------------------------- + Aggregate + -> Append + -> Seq Scan on part_pa_test_p1 pa2_1 + -> Seq Scan on part_pa_test_p2 pa2_2 + SubPlan 2 + -> Result + SubPlan 1 + -> Append + -> Seq Scan on part_pa_test_p1 pa1_1 + Filter: (a = pa2.a) + -> Seq Scan on part_pa_test_p2 pa1_2 + Filter: (a = pa2.a) + Optimizer: Postgres query optimizer +(13 rows) + +drop table part_pa_test; +-- test with leader participation disabled +set parallel_leader_participation = off; +explain (costs off) + select count(*) from tenk1 where stringu1 = 'GRAAAA'; + QUERY PLAN +--------------------------------------------- + Aggregate + -> Seq Scan on tenk1 + Filter: (stringu1 = 'GRAAAA'::name) + Optimizer: Postgres query optimizer +(4 rows) + +select count(*) from tenk1 where stringu1 = 'GRAAAA'; + count +------- + 15 +(1 row) + +-- test with leader participation disabled, but no workers available (so +-- the leader will have to run the plan despite the setting) +set max_parallel_workers = 0; +explain (costs off) + select count(*) from tenk1 where stringu1 = 'GRAAAA'; + QUERY PLAN +--------------------------------------------- + Aggregate + -> Seq Scan on tenk1 + Filter: (stringu1 = 'GRAAAA'::name) + Optimizer: Postgres query optimizer +(4 rows) + +select count(*) from tenk1 where stringu1 = 'GRAAAA'; + count +------- + 15 +(1 row) + +reset max_parallel_workers; +reset parallel_leader_participation; +-- test that parallel_restricted function doesn't run in worker +alter table tenk1 set (parallel_workers = 4); +explain (verbose, costs off) +select sp_parallel_restricted(unique1) from tenk1 + where stringu1 = 'GRAAAA' order by 1; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Sort + Output: (sp_parallel_restricted(unique1)) + Sort Key: (sp_parallel_restricted(tenk1.unique1)) + -> Seq Scan on public.tenk1 + Output: sp_parallel_restricted(unique1) + Filter: (tenk1.stringu1 = 'GRAAAA'::name) + Settings: min_parallel_table_scan_size = '0', parallel_setup_cost = '0', parallel_tuple_cost = '0' + Optimizer: Postgres query optimizer +(8 rows) + +-- test parallel plan when group by expression is in target list. +explain (costs off) + select length(stringu1) from tenk1 group by length(stringu1); + QUERY PLAN +--------------------------------------- + HashAggregate + Group Key: length((stringu1)::text) + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(4 rows) + +select length(stringu1) from tenk1 group by length(stringu1); + length +-------- + 6 +(1 row) + +explain (costs off) + select stringu1, count(*) from tenk1 group by stringu1 order by stringu1; + QUERY PLAN +------------------------------------- + Sort + Sort Key: stringu1 + -> HashAggregate + Group Key: stringu1 + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(6 rows) + +-- test that parallel plan for aggregates is not selected when +-- target list contains parallel restricted clause. +explain (costs off) + select sum(sp_parallel_restricted(unique1)) from tenk1 + group by(sp_parallel_restricted(unique1)); + QUERY PLAN +---------------------------------------------- + HashAggregate + Group Key: sp_parallel_restricted(unique1) + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(4 rows) + +-- test prepared statement +prepare tenk1_count(integer) As select count((unique1)) from tenk1 where hundred > $1; +explain (costs off) execute tenk1_count(1); + QUERY PLAN +------------------------------------- + Aggregate + -> Seq Scan on tenk1 + Filter: (hundred > 1) + Optimizer: Postgres query optimizer +(4 rows) + +execute tenk1_count(1); + count +------- + 9800 +(1 row) + +deallocate tenk1_count; +-- test parallel plans for queries containing un-correlated subplans. +alter table tenk2 set (parallel_workers = 0); +explain (costs off) + select count(*) from tenk1 where (two, four) not in + (select hundred, thousand from tenk2 where thousand > 100); + QUERY PLAN +-------------------------------------------------------------------------------------- + Aggregate + -> Nested Loop Left Anti Semi (Not-In) Join + Join Filter: ((tenk1.two = tenk2.hundred) AND (tenk1.four = tenk2.thousand)) + -> Seq Scan on tenk1 + -> Materialize + -> Seq Scan on tenk2 + Filter: (thousand > 100) + Optimizer: Postgres query optimizer +(8 rows) + +select count(*) from tenk1 where (two, four) not in + (select hundred, thousand from tenk2 where thousand > 100); + count +------- + 10000 +(1 row) + +-- this is not parallel-safe due to use of random() within SubLink's testexpr: +explain (costs off) + select * from tenk1 where (unique1 + random())::integer not in + (select ten from tenk2); + QUERY PLAN +------------------------------------- + Seq Scan on tenk1 + Filter: (SubPlan 1) + SubPlan 1 + -> Materialize + -> Seq Scan on tenk2 + Optimizer: Postgres query optimizer +(6 rows) + +alter table tenk2 reset (parallel_workers); +-- test parallel plan for a query containing initplan. +set enable_indexscan = off; +set enable_indexonlyscan = off; +set enable_bitmapscan = off; +alter table tenk2 set (parallel_workers = 2); +explain (costs off) + select count(*) from tenk1 + where tenk1.unique1 = (Select max(tenk2.unique1) from tenk2); + QUERY PLAN +------------------------------------- + Aggregate + InitPlan 1 (returns $1) + -> Aggregate + -> Seq Scan on tenk2 + -> Seq Scan on tenk1 + Filter: (unique1 = $1) + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from tenk1 + where tenk1.unique1 = (Select max(tenk2.unique1) from tenk2); + count +------- + 1 +(1 row) + +reset enable_indexscan; +reset enable_indexonlyscan; +reset enable_bitmapscan; +alter table tenk2 reset (parallel_workers); +-- test parallel index scans. +set enable_seqscan to off; +set enable_bitmapscan to off; +explain (costs off) + select count((unique1)) from tenk1 where hundred > 1; + QUERY PLAN +----------------------------------------------- + Aggregate + -> Index Scan using tenk1_hundred on tenk1 + Index Cond: (hundred > 1) + Optimizer: Postgres query optimizer +(4 rows) + +select count((unique1)) from tenk1 where hundred > 1; + count +------- + 9800 +(1 row) + +-- test parallel index-only scans. +explain (costs off) + select count(*) from tenk1 where thousand > 95; + QUERY PLAN +----------------------------------------------------------- + Aggregate + -> Index Only Scan using tenk1_thous_tenthous on tenk1 + Index Cond: (thousand > 95) + Optimizer: Postgres query optimizer +(4 rows) + +select count(*) from tenk1 where thousand > 95; + count +------- + 9040 +(1 row) + +-- test rescan cases too +set enable_material = false; +explain (costs off) +select * from + (select count(unique1) from tenk1 where hundred > 10) ss + right join (values (1),(2),(3)) v(x) on true; + QUERY PLAN +----------------------------------------------------------- + Nested Loop Left Join + -> Values Scan on "*VALUES*" + -> Materialize + -> Aggregate + -> Index Scan using tenk1_hundred on tenk1 + Index Cond: (hundred > 10) + Optimizer: Postgres query optimizer +(7 rows) + +select * from + (select count(unique1) from tenk1 where hundred > 10) ss + right join (values (1),(2),(3)) v(x) on true; + count | x +-------+--- + 8900 | 1 + 8900 | 2 + 8900 | 3 +(3 rows) + +explain (costs off) +select * from + (select count(*) from tenk1 where thousand > 99) ss + right join (values (1),(2),(3)) v(x) on true; + QUERY PLAN +----------------------------------------------------------------------- + Nested Loop Left Join + -> Values Scan on "*VALUES*" + -> Materialize + -> Aggregate + -> Index Only Scan using tenk1_thous_tenthous on tenk1 + Index Cond: (thousand > 99) + Optimizer: Postgres query optimizer +(7 rows) + +select * from + (select count(*) from tenk1 where thousand > 99) ss + right join (values (1),(2),(3)) v(x) on true; + count | x +-------+--- + 9000 | 1 + 9000 | 2 + 9000 | 3 +(3 rows) + +-- test rescans for a Limit node with a parallel node beneath it. +reset enable_seqscan; +set enable_indexonlyscan to off; +set enable_indexscan to off; +alter table tenk1 set (parallel_workers = 0); +alter table tenk2 set (parallel_workers = 1); +explain (costs off) +select count(*) from tenk1 + left join (select tenk2.unique1 from tenk2 order by 1 limit 1000) ss + on tenk1.unique1 < ss.unique1 + 1 + where tenk1.unique1 < 2; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Nested Loop Left Join + Join Filter: (tenk1.unique1 < (tenk2.unique1 + 1)) + -> Seq Scan on tenk1 + Filter: (unique1 < 2) + -> Materialize + -> Limit + -> Sort + Sort Key: tenk2.unique1 + -> Seq Scan on tenk2 + Optimizer: Postgres query optimizer +(11 rows) + +select count(*) from tenk1 + left join (select tenk2.unique1 from tenk2 order by 1 limit 1000) ss + on tenk1.unique1 < ss.unique1 + 1 + where tenk1.unique1 < 2; + count +------- + 1999 +(1 row) + +--reset the value of workers for each table as it was before this test. +alter table tenk1 set (parallel_workers = 4); +alter table tenk2 reset (parallel_workers); +reset enable_material; +reset enable_bitmapscan; +reset enable_indexonlyscan; +reset enable_indexscan; +-- test parallel bitmap heap scan. +set enable_seqscan to off; +set enable_indexscan to off; +set enable_hashjoin to off; +set enable_mergejoin to off; +set enable_material to off; +-- test prefetching, if the platform allows it +DO $$ +BEGIN + SET effective_io_concurrency = 50; +EXCEPTION WHEN invalid_parameter_value THEN +END $$; +set work_mem='64kB'; --set small work mem to force lossy pages +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +explain (costs off) + select count(*) from tenk1, tenk2 where tenk1.hundred > 1 and tenk2.thousand=0; + QUERY PLAN +------------------------------------------------------ + Aggregate + -> Nested Loop + -> Seq Scan on tenk2 + Filter: (thousand = 0) + -> Bitmap Heap Scan on tenk1 + Recheck Cond: (hundred > 1) + -> Bitmap Index Scan on tenk1_hundred + Index Cond: (hundred > 1) + Optimizer: Postgres query optimizer +(9 rows) + +select count(*) from tenk1, tenk2 where tenk1.hundred > 1 and tenk2.thousand=0; + count +------- + 98000 +(1 row) + +create table bmscantest (a int, t text); +insert into bmscantest select r, 'fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' FROM generate_series(1,100000) r; +create index i_bmtest ON bmscantest(a); +select count(*) from bmscantest where a>1; + count +------- + 99999 +(1 row) + +-- test accumulation of stats for parallel nodes +reset enable_seqscan; +alter table tenk2 set (parallel_workers = 0); +explain (analyze, timing off, summary off, costs off) + select count(*) from tenk1, tenk2 where tenk1.hundred > 1 + and tenk2.thousand=0; + QUERY PLAN +----------------------------------------------------------- + Aggregate (actual rows=1 loops=1) + -> Nested Loop (actual rows=98000 loops=1) + -> Seq Scan on tenk2 (actual rows=10 loops=1) + Filter: (thousand = 0) + Rows Removed by Filter: 9990 + -> Seq Scan on tenk1 (actual rows=9800 loops=10) + Filter: (hundred > 1) + Rows Removed by Filter: 200 + Optimizer: Postgres query optimizer +(9 rows) + +alter table tenk2 reset (parallel_workers); +reset work_mem; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +create function explain_parallel_sort_stats() returns setof text +language plpgsql as +$$ +declare ln text; +begin + for ln in + explain (analyze, timing off, summary off, costs off) + select * from + (select ten from tenk1 where ten < 100 order by ten) ss + right join (values (1),(2),(3)) v(x) on true + loop + ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); + return next ln; + end loop; +end; +$$; +select * from explain_parallel_sort_stats(); + explain_parallel_sort_stats +----------------------------------------------------------------- + Nested Loop Left Join (actual rows=30000 loops=1) + -> Values Scan on "*VALUES*" (actual rows=3 loops=1) + -> Materialize (actual rows=10000 loops=3) + -> Sort (actual rows=10000 loops=1) + Sort Key: tenk1.ten + Sort Method: quicksort Memory: xxx + -> Seq Scan on tenk1 (actual rows=10000 loops=1) + Filter: (ten < 100) + Optimizer: Postgres query optimizer +(9 rows) + +reset enable_indexscan; +reset enable_hashjoin; +reset enable_mergejoin; +reset enable_material; +reset effective_io_concurrency; +drop table bmscantest; +drop function explain_parallel_sort_stats(); +-- test parallel merge join path. +analyze tenk2; +set enable_hashjoin to off; +set enable_nestloop to off; +explain (costs off) + select count(*) from tenk1, tenk2 where tenk1.unique1 = tenk2.unique1; + QUERY PLAN +---------------------------------------------------------- + Aggregate + -> Merge Join + Merge Cond: (tenk1.unique1 = tenk2.unique1) + -> Index Only Scan using tenk1_unique1 on tenk1 + -> Index Only Scan using tenk2_unique1 on tenk2 + Optimizer: Postgres query optimizer +(6 rows) + +select count(*) from tenk1, tenk2 where tenk1.unique1 = tenk2.unique1; + count +------- + 10000 +(1 row) + +reset enable_hashjoin; +reset enable_nestloop; +-- test gather merge +set enable_hashagg = false; +explain (costs off) + select count(*) from tenk1 group by twenty; + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: twenty + -> Sort + Sort Key: twenty + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(6 rows) + +select count(*) from tenk1 group by twenty; + count +------- + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 +(20 rows) + +--test expressions in targetlist are pushed down for gather merge +create function sp_simple_func(var1 integer) returns integer +as $$ +begin + return var1 + 10; +end; +$$ language plpgsql PARALLEL SAFE; +explain (costs off, verbose) + select ten, sp_simple_func(ten) from tenk1 where ten < 100 order by ten; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------- + Result + Output: ten, sp_simple_func(ten) + -> Sort + Output: ten + Sort Key: tenk1.ten + -> Seq Scan on public.tenk1 + Output: ten + Filter: (tenk1.ten < 100) + Settings: enable_hashagg = 'off', min_parallel_table_scan_size = '0', parallel_setup_cost = '0', parallel_tuple_cost = '0' + Optimizer: Postgres query optimizer +(10 rows) + +drop function sp_simple_func(integer); +-- test handling of SRFs in targetlist (bug in 10.0) +explain (costs off) + select count(*), generate_series(1,2) from tenk1 group by twenty; + QUERY PLAN +------------------------------------- + ProjectSet + -> GroupAggregate + Group Key: twenty + -> Sort + Sort Key: twenty + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(7 rows) + +select count(*), generate_series(1,2) from tenk1 group by twenty; + count | generate_series +-------+----------------- + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 + 500 | 1 + 500 | 2 +(40 rows) + +-- test gather merge with parallel leader participation disabled +set parallel_leader_participation = off; +explain (costs off) + select count(*) from tenk1 group by twenty; + QUERY PLAN +------------------------------------- + GroupAggregate + Group Key: twenty + -> Sort + Sort Key: twenty + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(6 rows) + +select count(*) from tenk1 group by twenty; + count +------- + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 +(20 rows) + +reset parallel_leader_participation; +--test rescan behavior of gather merge +set enable_material = false; +explain (costs off) +select * from + (select string4, count(unique2) + from tenk1 group by string4 order by string4) ss + right join (values (1),(2),(3)) v(x) on true; + QUERY PLAN +--------------------------------------------- + Nested Loop Left Join + -> Values Scan on "*VALUES*" + -> Materialize + -> GroupAggregate + Group Key: tenk1.string4 + -> Sort + Sort Key: tenk1.string4 + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(9 rows) + +select * from + (select string4, count(unique2) + from tenk1 group by string4 order by string4) ss + right join (values (1),(2),(3)) v(x) on true; + string4 | count | x +---------+-------+--- + AAAAxx | 2500 | 1 + HHHHxx | 2500 | 1 + OOOOxx | 2500 | 1 + VVVVxx | 2500 | 1 + AAAAxx | 2500 | 2 + HHHHxx | 2500 | 2 + OOOOxx | 2500 | 2 + VVVVxx | 2500 | 2 + AAAAxx | 2500 | 3 + HHHHxx | 2500 | 3 + OOOOxx | 2500 | 3 + VVVVxx | 2500 | 3 +(12 rows) + +reset enable_material; +reset enable_hashagg; +-- check parallelized int8 aggregate (bug #14897) +explain (costs off) +select avg(unique1::int8) from tenk1; + QUERY PLAN +------------------------------------- + Aggregate + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(3 rows) + +select avg(unique1::int8) from tenk1; + avg +----------------------- + 4999.5000000000000000 +(1 row) + +-- gather merge test with a LIMIT +explain (costs off) + select fivethous from tenk1 order by fivethous limit 4; + QUERY PLAN +------------------------------------- + Limit + -> Sort + Sort Key: fivethous + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(5 rows) + +select fivethous from tenk1 order by fivethous limit 4; + fivethous +----------- + 0 + 0 + 1 + 1 +(4 rows) + +-- gather merge test with 0 worker +set max_parallel_workers = 0; +explain (costs off) + select string4 from tenk1 order by string4 limit 5; + QUERY PLAN +------------------------------------- + Limit + -> Sort + Sort Key: string4 + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(5 rows) + +select string4 from tenk1 order by string4 limit 5; + string4 +--------- + AAAAxx + AAAAxx + AAAAxx + AAAAxx + AAAAxx +(5 rows) + +-- gather merge test with 0 workers, with parallel leader +-- participation disabled (the leader will have to run the plan +-- despite the setting) +set parallel_leader_participation = off; +explain (costs off) + select string4 from tenk1 order by string4 limit 5; + QUERY PLAN +------------------------------------- + Limit + -> Sort + Sort Key: string4 + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(5 rows) + +select string4 from tenk1 order by string4 limit 5; + string4 +--------- + AAAAxx + AAAAxx + AAAAxx + AAAAxx + AAAAxx +(5 rows) + +reset parallel_leader_participation; +reset max_parallel_workers; +SAVEPOINT settings; +SET LOCAL force_parallel_mode = 1; +explain (costs off) + select stringu1::int2 from tenk1 where unique1 = 1; + QUERY PLAN +----------------------------------------- + Index Scan using tenk1_unique1 on tenk1 + Index Cond: (unique1 = 1) + Optimizer: Postgres query optimizer +(3 rows) + +ROLLBACK TO SAVEPOINT settings; +-- exercise record typmod remapping between backends +CREATE FUNCTION make_record(n int) + RETURNS RECORD LANGUAGE plpgsql PARALLEL SAFE 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; +$$; +SAVEPOINT settings; +SET LOCAL force_parallel_mode = 1; +SELECT make_record(x) FROM (SELECT generate_series(1, 5) x) ss ORDER BY x; + make_record +------------- + (1) + (1,2) + (1,2,3) + (1,2,3,4) + (1,2,3,4,5) +(5 rows) + +ROLLBACK TO SAVEPOINT settings; +DROP function make_record(n int); +-- test the sanity of parallel query after the active role is dropped. +drop role if exists regress_parallel_worker; +NOTICE: role "regress_parallel_worker" does not exist, skipping +create role regress_parallel_worker; +set role regress_parallel_worker; +reset session authorization; +drop role regress_parallel_worker; +set force_parallel_mode = 1; +select count(*) from tenk1; + count +------- + 10000 +(1 row) + +reset force_parallel_mode; +reset role; +-- Window function calculation can't be pushed to workers. +explain (costs off, verbose) + select count(*) from tenk1 a where (unique1, two) in + (select unique1, row_number() over() from tenk1 b); + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + Output: count(*) + -> Hash Semi Join + Hash Cond: ((a.unique1 = b.unique1) AND (a.two = (row_number() OVER (?)))) + -> Seq Scan on public.tenk1 a + Output: a.unique1, a.unique2, a.two, a.four, a.ten, a.twenty, a.hundred, a.thousand, a.twothousand, a.fivethous, a.tenthous, a.odd, a.even, a.stringu1, a.stringu2, a.string4 + -> Hash + Output: b.unique1, (row_number() OVER (?)) + -> WindowAgg + Output: b.unique1, row_number() OVER (?) + -> Seq Scan on public.tenk1 b + Output: b.unique1 + Settings: min_parallel_table_scan_size = '0', parallel_setup_cost = '0', parallel_tuple_cost = '0' + Optimizer: Postgres query optimizer +(14 rows) + +-- LIMIT/OFFSET within sub-selects can't be pushed to workers. +explain (costs off) + select * from tenk1 a where two in + (select two from tenk1 b where stringu1 like '%AAAA' limit 3); + QUERY PLAN +--------------------------------------------------------- + Hash Semi Join + Hash Cond: (a.two = b.two) + -> Seq Scan on tenk1 a + -> Hash + -> Limit + -> Seq Scan on tenk1 b + Filter: (stringu1 ~~ '%AAAA'::text) + Optimizer: Postgres query optimizer +(8 rows) + +-- to increase the parallel query test coverage +SAVEPOINT settings; +SET LOCAL force_parallel_mode = 1; +EXPLAIN (analyze, timing off, summary off, costs off) SELECT * FROM tenk1; + QUERY PLAN +----------------------------------------------- + Seq Scan on tenk1 (actual rows=10000 loops=1) + Optimizer: Postgres query optimizer +(2 rows) + +ROLLBACK TO SAVEPOINT settings; +-- provoke error in worker +-- (make the error message long enough to require multiple bufferloads) +SAVEPOINT settings; +SET LOCAL force_parallel_mode = 1; +select (stringu1 || repeat('abcd', 5000))::int2 from tenk1 where unique1 = 1; +ERROR: invalid input syntax for type smallint: "BAAAAAabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd" +ROLLBACK TO SAVEPOINT settings; +-- test interaction with set-returning functions +SAVEPOINT settings; +-- multiple subqueries under a single Gather node +-- must set parallel_setup_cost > 0 to discourage multiple Gather nodes +SET LOCAL parallel_setup_cost = 10; +EXPLAIN (COSTS OFF) +SELECT unique1 FROM tenk1 WHERE fivethous = tenthous + 1 +UNION ALL +SELECT unique1 FROM tenk1 WHERE fivethous = tenthous + 1; + QUERY PLAN +---------------------------------------------- + Append + -> Seq Scan on tenk1 + Filter: (fivethous = (tenthous + 1)) + -> Seq Scan on tenk1 tenk1_1 + Filter: (fivethous = (tenthous + 1)) + Optimizer: Postgres query optimizer +(6 rows) + +ROLLBACK TO SAVEPOINT settings; +-- can't use multiple subqueries under a single Gather node due to initPlans +EXPLAIN (COSTS OFF) +SELECT unique1 FROM tenk1 WHERE fivethous = + (SELECT unique1 FROM tenk1 WHERE fivethous = 1 LIMIT 1) +UNION ALL +SELECT unique1 FROM tenk1 WHERE fivethous = + (SELECT unique2 FROM tenk1 WHERE fivethous = 1 LIMIT 1) +ORDER BY 1; + QUERY PLAN +----------------------------------------------------- + Sort + Sort Key: tenk1.unique1 + -> Append + -> Seq Scan on tenk1 + Filter: (fivethous = $0) + InitPlan 1 (returns $0) + -> Limit + -> Seq Scan on tenk1 tenk1_2 + Filter: (fivethous = 1) + -> Seq Scan on tenk1 tenk1_1 + Filter: (fivethous = $1) + InitPlan 2 (returns $1) + -> Limit + -> Seq Scan on tenk1 tenk1_3 + Filter: (fivethous = 1) + Optimizer: Postgres query optimizer +(16 rows) + +-- test interaction with SRFs +SELECT * FROM information_schema.foreign_data_wrapper_options +ORDER BY 1, 2, 3; + foreign_data_wrapper_catalog | foreign_data_wrapper_name | option_name | option_value +------------------------------+---------------------------+-------------+-------------- +(0 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT generate_series(1, two), array(select generate_series(1, two)) + FROM tenk1 ORDER BY tenthous; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + ProjectSet + Output: generate_series(1, tenk1.two), (SubPlan 1), tenk1.tenthous + -> Result + Output: tenk1.two, tenk1.tenthous + -> Sort + Output: tenk1.tenthous, tenk1.two + Sort Key: tenk1.tenthous + -> Seq Scan on public.tenk1 + Output: tenk1.tenthous, tenk1.two + SubPlan 1 + -> ProjectSet + Output: generate_series(1, tenk1.two) + -> Result + Settings: min_parallel_table_scan_size = '0', parallel_setup_cost = '0', parallel_tuple_cost = '0' + Optimizer: Postgres query optimizer +(15 rows) + +-- test passing expanded-value representations to workers +CREATE FUNCTION make_some_array(int,int) returns int[] as +$$declare x int[]; + begin + x[1] := $1; + x[2] := $2; + return x; + end$$ language plpgsql parallel safe; +CREATE TABLE fooarr(f1 text, f2 int[], f3 text); +INSERT INTO fooarr VALUES('1', ARRAY[1,2], 'one'); +PREPARE pstmt(text, int[]) AS SELECT * FROM fooarr WHERE f1 = $1 AND f2 = $2; +EXPLAIN (COSTS OFF) EXECUTE pstmt('1', make_some_array(1,2)); + QUERY PLAN +------------------------------------------------------------ + Seq Scan on fooarr + Filter: ((f1 = '1'::text) AND (f2 = '{1,2}'::integer[])) + Optimizer: Postgres query optimizer +(3 rows) + +EXECUTE pstmt('1', make_some_array(1,2)); + f1 | f2 | f3 +----+-------+----- + 1 | {1,2} | one +(1 row) + +DEALLOCATE pstmt; +-- test interaction between subquery and partial_paths +CREATE VIEW tenk1_vw_sec WITH (security_barrier) AS SELECT * FROM tenk1; +EXPLAIN (COSTS OFF) +SELECT 1 FROM tenk1_vw_sec + WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100; + QUERY PLAN +----------------------------------------------------- + Subquery Scan on tenk1_vw_sec + Filter: ((SubPlan 1) < 100) + -> Seq Scan on tenk1 + SubPlan 1 + -> Aggregate + -> Seq Scan on int4_tbl + Filter: (f1 < tenk1_vw_sec.unique1) + Optimizer: Postgres query optimizer +(8 rows) + +rollback; diff --git a/src/test/singlenode_regress/expected/select_views.out b/src/test/singlenode_regress/expected/select_views.out new file mode 100644 index 00000000000..79f15911458 --- /dev/null +++ b/src/test/singlenode_regress/expected/select_views.out @@ -0,0 +1,1562 @@ +-- +-- SELECT_VIEWS +-- test the views defined in CREATE_VIEWS +-- +SELECT * FROM street; + name | thepath | cname +------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------- + Access Rd 25 | [(-121.9283,37.894),(-121.9283,37.9)] | Oakland + Ada St | [(-122.2487,37.398),(-122.2496,37.401)] | Lafayette + Agua Fria Creek | [(-121.9254,37.922),(-121.9281,37.889)] | Oakland + Allen Ct | [(-122.0131,37.602),(-122.0117,37.597)] | Berkeley + Alvarado Niles Road | [(-122.0325,37.903),(-122.0316,37.9)] | Berkeley + Andrea Cir | [(-121.733218,37.88641),(-121.733286,37.90617)] | Oakland + Apricot Lane | [(-121.9471,37.401),(-121.9456,37.392)] | Oakland + Apricot Lane | [(-121.9471,37.401),(-121.9456,37.392)] | Oakland + Arden Road | [(-122.0978,37.177),(-122.1,37.177)] | Oakland + Arizona St | [(-122.0381,37.901),(-122.0367,37.898)] | Berkeley + Arlington Dr | [(-121.8802,37.408),(-121.8807,37.394)] | Oakland + Arlington Dr | [(-121.8802,37.408),(-121.8807,37.394)] | Oakland + Arlington Road | [(-121.7957,37.898),(-121.7956,37.906)] | Oakland + Arroyo Las Positas | [(-121.7973,37.997),(-121.7957,37.005)] | Oakland + Arroyo Las Positas | [(-121.7973,37.997),(-121.7957,37.005)] | Oakland + Arroyo Seco | [(-121.7073,37.766),(-121.6997,37.729)] | Oakland + Ash St | [(-122.0408,37.31),(-122.04,37.292)] | Oakland + Avenue 134th | [(-122.1823,37.002),(-122.1851,37.992)] | Oakland + Avenue 134th | [(-122.1823,37.002),(-122.1851,37.992)] | Berkeley + Avenue 140th | [(-122.1656,37.003),(-122.1691,37.988)] | Oakland + Avenue 140th | [(-122.1656,37.003),(-122.1691,37.988)] | Berkeley + Avenue D | [(-122.298,37.848),(-122.3024,37.849)] | Berkeley + B St | [(-122.1749,37.451),(-122.1743,37.443)] | Oakland + Bancroft Ave | [(-122.15714,37.4242),(-122.156,37.409)] | Oakland + Bancroft Ave | [(-122.1643,37.523),(-122.1631,37.508),(-122.1621,37.493)] | Oakland + Birch St | [(-122.1617,37.425),(-122.1614,37.417)] | Oakland + Birch St | [(-122.1673,37.509),(-122.1661,37.492)] | Oakland + Blacow Road | [(-122.0179,37.469),(-122.0167,37.465)] | Oakland + Bridgepointe Dr | [(-122.0514,37.305),(-122.0509,37.299)] | Oakland + Broadmore Ave | [(-122.095,37.522),(-122.0936,37.497)] | Oakland + Broadway | [(-122.2409,37.586),(-122.2395,37.601)] | Berkeley + Buckingham Blvd | [(-122.2231,37.59),(-122.2214,37.606)] | Berkeley + Butterfield Dr | [(-122.0838,37.002),(-122.0834,37.987)] | Oakland + Butterfield Dr | [(-122.0838,37.002),(-122.0834,37.987)] | Oakland + Butterfield Dr | [(-122.0838,37.002),(-122.0834,37.987)] | Berkeley + C St | [(-122.1768,37.46),(-122.1749,37.435)] | Oakland + Calaveras Creek | [(-121.8203,37.035),(-121.8207,37.931)] | Oakland + Calaveras Creek | [(-121.8203,37.035),(-121.8207,37.931)] | Oakland + California St | [(-122.2032,37.005),(-122.2016,37.996)] | Berkeley + California St | [(-122.2032,37.005),(-122.2016,37.996)] | Lafayette + Cameron Ave | [(-122.1316,37.502),(-122.1327,37.481)] | Oakland + Campus Dr | [(-122.1704,37.905),(-122.1678,37.868),(-122.1671,37.865)] | Berkeley + Capricorn Ave | [(-122.2176,37.404),(-122.2164,37.384)] | Lafayette + Carson St | [(-122.1846,37.9),(-122.1843,37.901)] | Berkeley + Cedar Blvd | [(-122.0282,37.446),(-122.0265,37.43)] | Oakland + Cedar St | [(-122.3011,37.737),(-122.2999,37.739)] | Berkeley + Celia St | [(-122.0611,37.3),(-122.0616,37.299)] | Oakland + Central Ave | [(-122.2343,37.602),(-122.2331,37.595)] | Berkeley + Chambers Dr | [(-122.2004,37.352),(-122.1972,37.368)] | Lafayette + Chambers Lane | [(-122.2001,37.359),(-122.1975,37.371)] | Lafayette + Champion St | [(-122.214,37.991),(-122.2147,37.002)] | Berkeley + Champion St | [(-122.214,37.991),(-122.2147,37.002)] | Lafayette + Chapman Dr | [(-122.0421,37.504),(-122.0414,37.498)] | Oakland + Charles St | [(-122.0255,37.505),(-122.0252,37.499)] | Oakland + Cherry St | [(-122.0437,37.42),(-122.0434,37.413)] | Oakland + Claremont Pl | [(-122.0542,37.995),(-122.0542,37.008)] | Oakland + Claremont Pl | [(-122.0542,37.995),(-122.0542,37.008)] | Oakland + Claremont Pl | [(-122.0542,37.995),(-122.0542,37.008)] | Berkeley + Coliseum Way | [(-122.2001,37.47),(-122.1978,37.516)] | Oakland + Coliseum Way | [(-122.2113,37.626),(-122.2085,37.592),(-122.2063,37.568)] | Berkeley + Coolidge Ave | [(-122.2007,37.058),(-122.1992,37.06)] | Lafayette + Cornell Ave | [(-122.2956,37.925),(-122.2949,37.906),(-122.2939,37.875)] | Berkeley + Corriea Way | [(-121.9501,37.402),(-121.9505,37.398)] | Oakland + Corriea Way | [(-121.9501,37.402),(-121.9505,37.398)] | Oakland + Cowing Road | [(-122.0002,37.934),(-121.9772,37.782)] | Oakland + Creston Road | [(-122.2639,37.002),(-122.2613,37.986),(-122.2602,37.978),(-122.2598,37.973)] | Berkeley + Creston Road | [(-122.2639,37.002),(-122.2613,37.986),(-122.2602,37.978),(-122.2598,37.973)] | Lafayette + Crow Canyon Creek | [(-122.043,37.905),(-122.0368,37.71)] | Berkeley + Crystaline Dr | [(-121.925856,37),(-121.925869,37.00527)] | Oakland + Cull Canyon Road | [(-122.0536,37.435),(-122.0499,37.315)] | Oakland + Cull Creek | [(-122.0624,37.875),(-122.0582,37.527)] | Berkeley + D St | [(-122.1811,37.505),(-122.1805,37.497)] | Oakland + Decoto Road | [(-122.0159,37.006),(-122.016,37.002),(-122.0164,37.993)] | Oakland + Decoto Road | [(-122.0159,37.006),(-122.016,37.002),(-122.0164,37.993)] | Oakland + Decoto Road | [(-122.0159,37.006),(-122.016,37.002),(-122.0164,37.993)] | Berkeley + Deering St | [(-122.2146,37.904),(-122.2126,37.897)] | Berkeley + Dimond Ave | [(-122.2167,37.994),(-122.2162,37.006)] | Berkeley + Dimond Ave | [(-122.2167,37.994),(-122.2162,37.006)] | Lafayette + Donna Way | [(-122.1333,37.606),(-122.1316,37.599)] | Berkeley + Driftwood Dr | [(-122.0109,37.482),(-122.0113,37.477)] | Oakland + Driscoll Road | [(-121.9482,37.403),(-121.948451,37.39995)] | Oakland + Driscoll Road | [(-121.9482,37.403),(-121.948451,37.39995)] | Oakland + E St | [(-122.1832,37.505),(-122.1826,37.498),(-122.182,37.49)] | Oakland + Eden Ave | [(-122.1143,37.505),(-122.1142,37.491)] | Oakland + Eden Creek | [(-122.022037,37.00675),(-122.0221,37.998)] | Oakland + Eden Creek | [(-122.022037,37.00675),(-122.0221,37.998)] | Oakland + Eden Creek | [(-122.022037,37.00675),(-122.0221,37.998)] | Berkeley + Edgewater Dr | [(-122.201,37.379),(-122.2042,37.41)] | Lafayette + Enos Way | [(-121.7677,37.896),(-121.7673,37.91)] | Oakland + Euclid Ave | [(-122.2671,37.009),(-122.2666,37.987)] | Berkeley + Euclid Ave | [(-122.2671,37.009),(-122.2666,37.987)] | Lafayette + Fairview Ave | [(-121.999,37.428),(-121.9863,37.351)] | Oakland + Fairview Ave | [(-121.999,37.428),(-121.9863,37.351)] | Oakland + Foothill Blvd | [(-122.2414,37.9),(-122.2403,37.893)] | Berkeley + Fountain St | [(-122.2306,37.593),(-122.2293,37.605)] | Berkeley + Gading Road | [(-122.0801,37.343),(-122.08,37.336)] | Oakland + Grizzly Peak Blvd | [(-122.2213,37.638),(-122.2127,37.581)] | Berkeley + Grove Way | [(-122.0643,37.884),(-122.062679,37.89162),(-122.061796,37.89578),(-122.0609,37.9)] | Berkeley + Harris Road | [(-122.0659,37.372),(-122.0675,37.363)] | Oakland + Heartwood Dr | [(-122.2006,37.341),(-122.1992,37.338)] | Lafayette + Hegenberger Exwy | [(-122.1946,37.52),(-122.1947,37.497)] | Oakland + Herrier St | [(-122.1943,37.006),(-122.1936,37.998)] | Oakland + Herrier St | [(-122.1943,37.006),(-122.1936,37.998)] | Berkeley + Hesperian Blvd | [(-122.097,37.333),(-122.0956,37.31),(-122.0946,37.293)] | Oakland + Hesperian Blvd | [(-122.097,37.333),(-122.0956,37.31),(-122.0946,37.293)] | Oakland + Hesperian Blvd | [(-122.1132,37.6),(-122.1123,37.586)] | Berkeley + Hollis St | [(-122.2885,37.397),(-122.289,37.414)] | Lafayette + I- 580 | [(-121.727,37.074),(-121.7229,37.093),(-121.722301,37.09522),(-121.721001,37.10005),(-121.7194,37.106),(-121.7188,37.109),(-121.7168,37.12),(-121.7163,37.123),(-121.7145,37.127),(-121.7096,37.148),(-121.707731,37.1568),(-121.7058,37.166),(-121.7055,37.168),(-121.7044,37.174),(-121.7038,37.172),(-121.7037,37.172),(-121.7027,37.175),(-121.7001,37.181),(-121.6957,37.191),(-121.6948,37.192),(-121.6897,37.204),(-121.6697,37.185)] | Oakland + I- 580 | [(-121.9322,37.989),(-121.9243,37.006),(-121.9217,37.014)] | Oakland + I- 580 | [(-121.9322,37.989),(-121.9243,37.006),(-121.9217,37.014)] | Oakland + I- 580 | [(-122.018,37.019),(-122.0009,37.032),(-121.9787,37.983),(-121.958,37.984),(-121.9571,37.986)] | Oakland + I- 580 | [(-122.018,37.019),(-122.0009,37.032),(-121.9787,37.983),(-121.958,37.984),(-121.9571,37.986)] | Oakland + I- 580 | [(-122.1108,37.023),(-122.1101,37.02),(-122.108103,37.00764),(-122.108,37.007),(-122.1069,37.998),(-122.1064,37.994),(-122.1053,37.982),(-122.1048,37.977),(-122.1032,37.958),(-122.1026,37.953),(-122.1013,37.938),(-122.0989,37.911),(-122.0984,37.91),(-122.098,37.908)] | Oakland + I- 580 | [(-122.1108,37.023),(-122.1101,37.02),(-122.108103,37.00764),(-122.108,37.007),(-122.1069,37.998),(-122.1064,37.994),(-122.1053,37.982),(-122.1048,37.977),(-122.1032,37.958),(-122.1026,37.953),(-122.1013,37.938),(-122.0989,37.911),(-122.0984,37.91),(-122.098,37.908)] | Berkeley + I- 580 | [(-122.1543,37.703),(-122.1535,37.694),(-122.1512,37.655),(-122.1475,37.603),(-122.1468,37.583),(-122.1472,37.569),(-122.149044,37.54874),(-122.1493,37.546),(-122.1501,37.532),(-122.1506,37.509),(-122.1495,37.482),(-122.1487,37.467),(-122.1477,37.447),(-122.1414,37.383),(-122.1404,37.376),(-122.1398,37.372),(-122.139,37.356),(-122.1388,37.353),(-122.1385,37.34),(-122.1382,37.33),(-122.1378,37.316)] | Oakland + I- 580 | [(-122.1543,37.703),(-122.1535,37.694),(-122.1512,37.655),(-122.1475,37.603),(-122.1468,37.583),(-122.1472,37.569),(-122.149044,37.54874),(-122.1493,37.546),(-122.1501,37.532),(-122.1506,37.509),(-122.1495,37.482),(-122.1487,37.467),(-122.1477,37.447),(-122.1414,37.383),(-122.1404,37.376),(-122.1398,37.372),(-122.139,37.356),(-122.1388,37.353),(-122.1385,37.34),(-122.1382,37.33),(-122.1378,37.316)] | Berkeley + I- 580 | [(-122.2197,37.99),(-122.22,37.99),(-122.222092,37.99523),(-122.2232,37.998),(-122.224146,37.99963),(-122.2261,37.003),(-122.2278,37.007),(-122.2302,37.026),(-122.2323,37.043),(-122.2344,37.059),(-122.235405,37.06427),(-122.2365,37.07)] | Berkeley + I- 580 | [(-122.2197,37.99),(-122.22,37.99),(-122.222092,37.99523),(-122.2232,37.998),(-122.224146,37.99963),(-122.2261,37.003),(-122.2278,37.007),(-122.2302,37.026),(-122.2323,37.043),(-122.2344,37.059),(-122.235405,37.06427),(-122.2365,37.07)] | Lafayette + I- 580 Ramp | [(-121.8521,37.011),(-121.8479,37.999),(-121.8476,37.999),(-121.8456,37.01),(-121.8455,37.011)] | Oakland + I- 580 Ramp | [(-121.8521,37.011),(-121.8479,37.999),(-121.8476,37.999),(-121.8456,37.01),(-121.8455,37.011)] | Oakland + I- 580 Ramp | [(-121.8743,37.014),(-121.8722,37.999),(-121.8714,37.999)] | Oakland + I- 580 Ramp | [(-121.8743,37.014),(-121.8722,37.999),(-121.8714,37.999)] | Oakland + I- 580 Ramp | [(-121.9043,37.998),(-121.9036,37.013),(-121.902632,37.0174),(-121.9025,37.018)] | Oakland + I- 580 Ramp | [(-121.9043,37.998),(-121.9036,37.013),(-121.902632,37.0174),(-121.9025,37.018)] | Oakland + I- 580 Ramp | [(-121.9368,37.986),(-121.936483,37.98832),(-121.9353,37.997),(-121.93504,37.00035),(-121.9346,37.006),(-121.933764,37.00031),(-121.9333,37.997),(-121.9322,37.989)] | Oakland + I- 580 Ramp | [(-121.9368,37.986),(-121.936483,37.98832),(-121.9353,37.997),(-121.93504,37.00035),(-121.9346,37.006),(-121.933764,37.00031),(-121.9333,37.997),(-121.9322,37.989)] | Oakland + I- 580 Ramp | [(-122.093241,37.90351),(-122.09364,37.89634),(-122.093788,37.89212)] | Berkeley + I- 580 Ramp | [(-122.0934,37.896),(-122.09257,37.89961),(-122.0911,37.906)] | Berkeley + I- 580 Ramp | [(-122.0941,37.897),(-122.0943,37.902)] | Berkeley + I- 580 Ramp | [(-122.096,37.888),(-122.0962,37.891),(-122.0964,37.9)] | Berkeley + I- 580 Ramp | [(-122.101,37.898),(-122.1005,37.902),(-122.0989,37.911)] | Berkeley + I- 580 Ramp | [(-122.1086,37.003),(-122.1068,37.993),(-122.1066,37.992),(-122.1053,37.982)] | Oakland + I- 580 Ramp | [(-122.1086,37.003),(-122.1068,37.993),(-122.1066,37.992),(-122.1053,37.982)] | Berkeley + I- 580 Ramp | [(-122.1414,37.383),(-122.1407,37.376),(-122.1403,37.372),(-122.139,37.356)] | Oakland + I- 580/I-680 Ramp | ((-121.9207,37.988),(-121.9192,37.016)) | Oakland + I- 580/I-680 Ramp | ((-121.9207,37.988),(-121.9192,37.016)) | Oakland + I- 680 | ((-121.939,37.15),(-121.9387,37.145),(-121.9373,37.125),(-121.934242,37.07643),(-121.933886,37.0709),(-121.9337,37.068),(-121.933122,37.06139),(-121.932736,37.05698),(-121.93222,37.05108),(-121.931844,37.04678),(-121.930113,37.027),(-121.926829,37),(-121.9265,37.998),(-121.9217,37.96),(-121.9203,37.949),(-121.9184,37.934)) | Oakland + I- 680 | ((-121.939,37.15),(-121.9387,37.145),(-121.9373,37.125),(-121.934242,37.07643),(-121.933886,37.0709),(-121.9337,37.068),(-121.933122,37.06139),(-121.932736,37.05698),(-121.93222,37.05108),(-121.931844,37.04678),(-121.930113,37.027),(-121.926829,37),(-121.9265,37.998),(-121.9217,37.96),(-121.9203,37.949),(-121.9184,37.934)) | Oakland + I- 680 | [(-121.9101,37.715),(-121.911269,37.74682),(-121.9119,37.764),(-121.9124,37.776),(-121.9174,37.905),(-121.9194,37.957),(-121.9207,37.988)] | Oakland + I- 680 | [(-121.9184,37.934),(-121.917,37.913),(-121.9122,37.83),(-121.9052,37.702)] | Oakland + I- 680 Ramp | [(-121.8833,37.376),(-121.8833,37.392),(-121.883,37.4),(-121.8835,37.402),(-121.8852,37.422)] | Oakland + I- 680 Ramp | [(-121.8833,37.376),(-121.8833,37.392),(-121.883,37.4),(-121.8835,37.402),(-121.8852,37.422)] | Oakland + I- 680 Ramp | [(-121.92,37.438),(-121.9218,37.424),(-121.9238,37.408),(-121.9252,37.392)] | Oakland + I- 680 Ramp | [(-121.92,37.438),(-121.9218,37.424),(-121.9238,37.408),(-121.9252,37.392)] | Oakland + I- 680 Ramp | [(-121.9238,37.402),(-121.9234,37.395),(-121.923,37.399)] | Oakland + I- 680 Ramp | [(-121.9238,37.402),(-121.9234,37.395),(-121.923,37.399)] | Oakland + I- 80 | ((-122.2937,37.277),(-122.3016,37.262)) | Lafayette + I- 80 | ((-122.2962,37.273),(-122.3004,37.264)) | Lafayette + I- 80 Ramp | [(-122.2962,37.413),(-122.2959,37.382),(-122.2951,37.372)] | Lafayette + I- 880 | ((-121.9669,37.075),(-121.9663,37.071),(-121.9656,37.065),(-121.9618,37.037),(-121.95689,37),(-121.948,37.933)) | Oakland + I- 880 | ((-121.9669,37.075),(-121.9663,37.071),(-121.9656,37.065),(-121.9618,37.037),(-121.95689,37),(-121.948,37.933)) | Oakland + I- 880 | [(-121.948,37.933),(-121.9471,37.925),(-121.9467,37.923),(-121.946,37.918),(-121.9452,37.912),(-121.937,37.852)] | Oakland + I- 880 | [(-122.0219,37.466),(-122.0205,37.447),(-122.020331,37.44447),(-122.020008,37.43962),(-122.0195,37.432),(-122.0193,37.429),(-122.0164,37.393),(-122.010219,37.34771),(-122.0041,37.313)] | Oakland + I- 880 | [(-122.0375,37.632),(-122.0359,37.619),(-122.0358,37.616),(-122.034514,37.60409),(-122.031876,37.57965),(-122.031193,37.57332),(-122.03016,37.56375),(-122.02943,37.55698),(-122.028689,37.54929),(-122.027833,37.53908),(-122.025979,37.51698),(-122.0238,37.491)] | Oakland + I- 880 | [(-122.0375,37.632),(-122.0359,37.619),(-122.0358,37.616),(-122.034514,37.60409),(-122.031876,37.57965),(-122.031193,37.57332),(-122.03016,37.56375),(-122.02943,37.55698),(-122.028689,37.54929),(-122.027833,37.53908),(-122.025979,37.51698),(-122.0238,37.491)] | Berkeley + I- 880 | [(-122.0612,37.003),(-122.0604,37.991),(-122.0596,37.982),(-122.0585,37.967),(-122.0583,37.961),(-122.0553,37.918),(-122.053635,37.89475),(-122.050759,37.8546),(-122.05,37.844),(-122.0485,37.817),(-122.0483,37.813),(-122.0482,37.811)] | Oakland + I- 880 | [(-122.0612,37.003),(-122.0604,37.991),(-122.0596,37.982),(-122.0585,37.967),(-122.0583,37.961),(-122.0553,37.918),(-122.053635,37.89475),(-122.050759,37.8546),(-122.05,37.844),(-122.0485,37.817),(-122.0483,37.813),(-122.0482,37.811)] | Oakland + I- 880 | [(-122.0612,37.003),(-122.0604,37.991),(-122.0596,37.982),(-122.0585,37.967),(-122.0583,37.961),(-122.0553,37.918),(-122.053635,37.89475),(-122.050759,37.8546),(-122.05,37.844),(-122.0485,37.817),(-122.0483,37.813),(-122.0482,37.811)] | Berkeley + I- 880 | [(-122.0831,37.312),(-122.0819,37.296),(-122.081,37.285),(-122.0786,37.248),(-122.078,37.24),(-122.077642,37.23496),(-122.076983,37.22567),(-122.076599,37.22026),(-122.076229,37.21505),(-122.0758,37.209)] | Oakland + I- 880 | [(-122.0978,37.528),(-122.096,37.496),(-122.0931,37.453),(-122.09277,37.4496),(-122.090189,37.41442),(-122.0896,37.405),(-122.085,37.34)] | Oakland + I- 880 | [(-122.1365,37.902),(-122.1358,37.898),(-122.1333,37.881),(-122.1323,37.874),(-122.1311,37.866),(-122.1308,37.865),(-122.1307,37.864),(-122.1289,37.851),(-122.1277,37.843),(-122.1264,37.834),(-122.1231,37.812),(-122.1165,37.766),(-122.1104,37.72),(-122.109695,37.71094),(-122.109,37.702),(-122.108312,37.69168),(-122.1076,37.681)] | Berkeley + I- 880 | [(-122.1755,37.185),(-122.1747,37.178),(-122.1742,37.173),(-122.1692,37.126),(-122.167792,37.11594),(-122.16757,37.11435),(-122.1671,37.111),(-122.1655,37.1),(-122.165169,37.09811),(-122.1641,37.092),(-122.1596,37.061),(-122.158381,37.05275),(-122.155991,37.03657),(-122.1531,37.017),(-122.1478,37.98),(-122.1407,37.932),(-122.1394,37.924),(-122.1389,37.92),(-122.1376,37.91)] | Oakland + I- 880 | [(-122.1755,37.185),(-122.1747,37.178),(-122.1742,37.173),(-122.1692,37.126),(-122.167792,37.11594),(-122.16757,37.11435),(-122.1671,37.111),(-122.1655,37.1),(-122.165169,37.09811),(-122.1641,37.092),(-122.1596,37.061),(-122.158381,37.05275),(-122.155991,37.03657),(-122.1531,37.017),(-122.1478,37.98),(-122.1407,37.932),(-122.1394,37.924),(-122.1389,37.92),(-122.1376,37.91)] | Berkeley + I- 880 | [(-122.2214,37.711),(-122.2202,37.699),(-122.2199,37.695),(-122.219,37.682),(-122.2184,37.672),(-122.2173,37.652),(-122.2159,37.638),(-122.2144,37.616),(-122.2138,37.612),(-122.2135,37.609),(-122.212,37.592),(-122.2116,37.586),(-122.2111,37.581)] | Berkeley + I- 880 | [(-122.2707,37.975),(-122.2693,37.972),(-122.2681,37.966),(-122.267,37.962),(-122.2659,37.957),(-122.2648,37.952),(-122.2636,37.946),(-122.2625,37.935),(-122.2617,37.927),(-122.2607,37.921),(-122.2593,37.916),(-122.258,37.911),(-122.2536,37.898),(-122.2432,37.858),(-122.2408,37.845),(-122.2386,37.827),(-122.2374,37.811)] | Berkeley + I- 880 Ramp | [(-122.0019,37.301),(-122.002,37.293)] | Oakland + I- 880 Ramp | [(-122.0041,37.313),(-122.0018,37.315),(-122.0007,37.315),(-122.0005,37.313),(-122.0002,37.308),(-121.9995,37.289)] | Oakland + I- 880 Ramp | [(-122.0041,37.313),(-122.0038,37.308),(-122.0039,37.284),(-122.0013,37.287),(-121.9995,37.289)] | Oakland + I- 880 Ramp | [(-122.0236,37.488),(-122.0231,37.458),(-122.0227,37.458),(-122.0223,37.452),(-122.0205,37.447)] | Oakland + I- 880 Ramp | [(-122.0238,37.491),(-122.0215,37.483),(-122.0211,37.477),(-122.0205,37.447)] | Oakland + I- 880 Ramp | [(-122.059,37.982),(-122.0577,37.984),(-122.0612,37.003)] | Oakland + I- 880 Ramp | [(-122.059,37.982),(-122.0577,37.984),(-122.0612,37.003)] | Oakland + I- 880 Ramp | [(-122.059,37.982),(-122.0577,37.984),(-122.0612,37.003)] | Berkeley + I- 880 Ramp | [(-122.0618,37.011),(-122.0631,37.982),(-122.0585,37.967)] | Oakland + I- 880 Ramp | [(-122.0618,37.011),(-122.0631,37.982),(-122.0585,37.967)] | Oakland + I- 880 Ramp | [(-122.0618,37.011),(-122.0631,37.982),(-122.0585,37.967)] | Berkeley + I- 880 Ramp | [(-122.085,37.34),(-122.0801,37.316),(-122.081,37.285)] | Oakland + I- 880 Ramp | [(-122.085,37.34),(-122.0801,37.316),(-122.081,37.285)] | Oakland + I- 880 Ramp | [(-122.085,37.34),(-122.0866,37.316),(-122.0819,37.296)] | Oakland + I- 880 Ramp | [(-122.085,37.34),(-122.0866,37.316),(-122.0819,37.296)] | Oakland + I- 880 Ramp | [(-122.1029,37.61),(-122.1013,37.587),(-122.0999,37.569)] | Berkeley + I- 880 Ramp | [(-122.1379,37.891),(-122.1383,37.897),(-122.1377,37.902)] | Berkeley + I- 880 Ramp | [(-122.1379,37.931),(-122.137597,37.92736),(-122.1374,37.925),(-122.1373,37.924),(-122.1369,37.914),(-122.1358,37.905),(-122.1365,37.908),(-122.1358,37.898)] | Berkeley + I- 880 Ramp | [(-122.2536,37.898),(-122.254,37.902)] | Berkeley + I- 880 Ramp | [(-122.2771,37.002),(-122.278,37)] | Lafayette + Indian Way | [(-122.2066,37.398),(-122.2045,37.411)] | Lafayette + Jackson St | [(-122.0845,37.6),(-122.0842,37.606)] | Berkeley + Johnson Dr | [(-121.9145,37.901),(-121.915,37.877)] | Oakland + Joyce St | [(-122.0792,37.604),(-122.0774,37.581)] | Berkeley + Juniper St | [(-121.7823,37.897),(-121.7815,37.9)] | Oakland + Kaiser Dr | [(-122.067163,37.47821),(-122.060402,37.51961)] | Oakland + Keeler Ave | [(-122.2578,37.906),(-122.2579,37.899)] | Berkeley + Kildare Road | [(-122.0968,37.016),(-122.0959,37)] | Oakland + La Playa Dr | [(-122.1039,37.545),(-122.101,37.493)] | Oakland + Laguna Ave | [(-122.2099,37.989),(-122.2089,37)] | Berkeley + Laguna Ave | [(-122.2099,37.989),(-122.2089,37)] | Lafayette + Lakehurst Cir | [(-122.284729,37.89025),(-122.286096,37.90364)] | Berkeley + Lakeshore Ave | [(-122.2586,37.99),(-122.2556,37.006)] | Berkeley + Lakeshore Ave | [(-122.2586,37.99),(-122.2556,37.006)] | Lafayette + Las Positas Road | [(-121.764488,37.99199),(-121.75569,37.02022)] | Oakland + Las Positas Road | [(-121.764488,37.99199),(-121.75569,37.02022)] | Oakland + Linden St | [(-122.2867,37.998),(-122.2864,37.008)] | Berkeley + Linden St | [(-122.2867,37.998),(-122.2864,37.008)] | Lafayette + Livermore Ave | [(-121.7687,37.448),(-121.769,37.375)] | Oakland + Livermore Ave | [(-121.7687,37.448),(-121.769,37.375)] | Oakland + Livermore Ave | [(-121.772719,37.99085),(-121.7728,37.001)] | Oakland + Livermore Ave | [(-121.772719,37.99085),(-121.7728,37.001)] | Oakland + Locust St | [(-122.1606,37.007),(-122.1593,37.987)] | Oakland + Locust St | [(-122.1606,37.007),(-122.1593,37.987)] | Berkeley + Logan Ct | [(-122.0053,37.492),(-122.0061,37.484)] | Oakland + Magnolia St | [(-122.0971,37.5),(-122.0962,37.484)] | Oakland + Mandalay Road | [(-122.2322,37.397),(-122.2321,37.403)] | Lafayette + Marin Ave | [(-122.2741,37.894),(-122.272,37.901)] | Berkeley + Martin Luther King Jr Way | [(-122.2712,37.608),(-122.2711,37.599)] | Berkeley + Mattos Dr | [(-122.0005,37.502),(-122.000898,37.49683)] | Oakland + Maubert Ave | [(-122.1114,37.009),(-122.1096,37.995)] | Oakland + Maubert Ave | [(-122.1114,37.009),(-122.1096,37.995)] | Berkeley + McClure Ave | [(-122.1431,37.001),(-122.1436,37.998)] | Oakland + McClure Ave | [(-122.1431,37.001),(-122.1436,37.998)] | Berkeley + Medlar Dr | [(-122.0627,37.378),(-122.0625,37.375)] | Oakland + Mildred Ct | [(-122.0002,37.388),(-121.9998,37.386)] | Oakland + Miller Road | [(-122.0902,37.645),(-122.0865,37.545)] | Berkeley + Miramar Ave | [(-122.1009,37.025),(-122.099089,37.03209)] | Oakland + Mission Blvd | [(-121.918886,37),(-121.9194,37.976),(-121.9198,37.975)] | Oakland + Mission Blvd | [(-121.918886,37),(-121.9194,37.976),(-121.9198,37.975)] | Oakland + Mission Blvd | [(-122.0006,37.896),(-121.9989,37.88)] | Oakland + Mission Blvd | [(-122.0006,37.896),(-121.9989,37.88)] | Berkeley + Moores Ave | [(-122.0087,37.301),(-122.0094,37.292)] | Oakland + National Ave | [(-122.1192,37.5),(-122.1281,37.489)] | Oakland + Navajo Ct | [(-121.8779,37.901),(-121.8783,37.9)] | Oakland + Newark Blvd | [(-122.0352,37.438),(-122.0341,37.423)] | Oakland + Oakland Inner Harbor | [(-122.2625,37.913),(-122.260016,37.89484)] | Berkeley + Oakridge Road | [(-121.8316,37.049),(-121.828382,37)] | Oakland + Oneil Ave | [(-122.076754,37.62476),(-122.0745,37.595)] | Berkeley + Parkridge Dr | [(-122.1438,37.884),(-122.1428,37.9)] | Berkeley + Parkside Dr | [(-122.0475,37.603),(-122.0443,37.596)] | Berkeley + Paseo Padre Pkwy | [(-121.9143,37.005),(-121.913522,37)] | Oakland + Paseo Padre Pkwy | [(-122.0021,37.639),(-121.996,37.628)] | Oakland + Paseo Padre Pkwy | [(-122.0021,37.639),(-121.996,37.628)] | Berkeley + Pearl St | [(-122.2383,37.594),(-122.2366,37.615)] | Berkeley + Periwinkle Road | [(-122.0451,37.301),(-122.044758,37.29844)] | Oakland + Pimlico Dr | [(-121.8616,37.998),(-121.8618,37.008)] | Oakland + Pimlico Dr | [(-121.8616,37.998),(-121.8618,37.008)] | Oakland + Portsmouth Ave | [(-122.1064,37.315),(-122.1064,37.308)] | Oakland + Proctor Ave | [(-122.2267,37.406),(-122.2251,37.386)] | Lafayette + Railroad Ave | [(-122.0245,37.013),(-122.0234,37.003),(-122.0223,37.993)] | Oakland + Railroad Ave | [(-122.0245,37.013),(-122.0234,37.003),(-122.0223,37.993)] | Oakland + Railroad Ave | [(-122.0245,37.013),(-122.0234,37.003),(-122.0223,37.993)] | Berkeley + Ranspot Dr | [(-122.0972,37.999),(-122.0959,37)] | Oakland + Ranspot Dr | [(-122.0972,37.999),(-122.0959,37)] | Oakland + Ranspot Dr | [(-122.0972,37.999),(-122.0959,37)] | Berkeley + Redding St | [(-122.1978,37.901),(-122.1975,37.895)] | Berkeley + Redwood Road | [(-122.1493,37.98),(-122.1437,37.001)] | Oakland + Redwood Road | [(-122.1493,37.98),(-122.1437,37.001)] | Berkeley + Roca Dr | [(-122.0335,37.609),(-122.0314,37.599)] | Berkeley + Rosedale Ct | [(-121.9232,37.9),(-121.924,37.897)] | Oakland + Sacramento St | [(-122.2799,37.606),(-122.2797,37.597)] | Berkeley + Saddle Brook Dr | [(-122.1478,37.909),(-122.1454,37.904),(-122.1451,37.888)] | Berkeley + Saginaw Ct | [(-121.8803,37.898),(-121.8806,37.901)] | Oakland + San Andreas Dr | [(-122.0609,37.9),(-122.0614,37.895)] | Berkeley + Santa Maria Ave | [(-122.0773,37),(-122.0773,37.98)] | Oakland + Santa Maria Ave | [(-122.0773,37),(-122.0773,37.98)] | Oakland + Santa Maria Ave | [(-122.0773,37),(-122.0773,37.98)] | Berkeley + Shattuck Ave | [(-122.2686,37.904),(-122.2686,37.897)] | Berkeley + Sheridan Road | [(-122.2279,37.425),(-122.2253,37.411),(-122.2223,37.377)] | Lafayette + Shoreline Dr | [(-122.2657,37.603),(-122.2648,37.6)] | Berkeley + Skyline Blvd | [(-122.1738,37.01),(-122.1714,37.996)] | Oakland + Skyline Blvd | [(-122.1738,37.01),(-122.1714,37.996)] | Berkeley + Skyline Dr | [(-122.0277,37.5),(-122.0284,37.498)] | Oakland + Skywest Dr | [(-122.1161,37.62),(-122.1123,37.586)] | Berkeley + Southern Pacific Railroad | [(-122.3002,37.674),(-122.2999,37.661)] | Berkeley + Sp Railroad | [(-121.893564,37.99009),(-121.897,37.016)] | Oakland + Sp Railroad | [(-121.893564,37.99009),(-121.897,37.016)] | Oakland + Sp Railroad | [(-121.9565,37.898),(-121.9562,37.9)] | Oakland + Sp Railroad | [(-122.0734,37.001),(-122.0734,37.997)] | Oakland + Sp Railroad | [(-122.0734,37.001),(-122.0734,37.997)] | Oakland + Sp Railroad | [(-122.0734,37.001),(-122.0734,37.997)] | Berkeley + Sp Railroad | [(-122.0914,37.601),(-122.087,37.56),(-122.086408,37.5551)] | Berkeley + Sp Railroad | [(-122.137792,37.003),(-122.1365,37.992),(-122.131257,37.94612)] | Oakland + Sp Railroad | [(-122.137792,37.003),(-122.1365,37.992),(-122.131257,37.94612)] | Berkeley + Sp Railroad | [(-122.1947,37.497),(-122.193328,37.4848)] | Oakland + Stanton Ave | [(-122.100392,37.0697),(-122.099513,37.06052)] | Oakland + State Hwy 123 | [(-122.3004,37.986),(-122.2998,37.969),(-122.2995,37.962),(-122.2992,37.952),(-122.299,37.942),(-122.2987,37.935),(-122.2984,37.924),(-122.2982,37.92),(-122.2976,37.904),(-122.297,37.88),(-122.2966,37.869),(-122.2959,37.848),(-122.2961,37.843)] | Berkeley + State Hwy 13 | [(-122.1797,37.943),(-122.179871,37.91849),(-122.18,37.9),(-122.179023,37.86615),(-122.1787,37.862),(-122.1781,37.851),(-122.1777,37.845),(-122.1773,37.839),(-122.177,37.833)] | Berkeley + State Hwy 13 | [(-122.2049,37.2),(-122.20328,37.17975),(-122.1989,37.125),(-122.198078,37.11641),(-122.1975,37.11)] | Lafayette + State Hwy 13 Ramp | [(-122.2244,37.427),(-122.223,37.414),(-122.2214,37.396),(-122.2213,37.388)] | Lafayette + State Hwy 238 | ((-122.098,37.908),(-122.0983,37.907),(-122.099,37.905),(-122.101,37.898),(-122.101535,37.89711),(-122.103173,37.89438),(-122.1046,37.892),(-122.106,37.89)) | Berkeley + State Hwy 238 Ramp | [(-122.1288,37.9),(-122.1293,37.895),(-122.1296,37.906)] | Berkeley + State Hwy 24 | [(-122.2674,37.246),(-122.2673,37.248),(-122.267,37.261),(-122.2668,37.271),(-122.2663,37.298),(-122.2659,37.315),(-122.2655,37.336),(-122.265007,37.35882),(-122.264443,37.37286),(-122.2641,37.381),(-122.2638,37.388),(-122.2631,37.396),(-122.2617,37.405),(-122.2615,37.407),(-122.2605,37.412)] | Lafayette + State Hwy 84 | [(-121.9565,37.898),(-121.956589,37.89911),(-121.9569,37.903),(-121.956,37.91),(-121.9553,37.919)] | Oakland + State Hwy 84 | [(-122.0671,37.426),(-122.07,37.402),(-122.074,37.37),(-122.0773,37.338)] | Oakland + State Hwy 92 | [(-122.1085,37.326),(-122.1095,37.322),(-122.1111,37.316),(-122.1119,37.313),(-122.1125,37.311),(-122.1131,37.308),(-122.1167,37.292),(-122.1187,37.285),(-122.12,37.28)] | Oakland + State Hwy 92 Ramp | [(-122.1086,37.321),(-122.1089,37.315),(-122.1111,37.316)] | Oakland + Stuart St | [(-122.2518,37.6),(-122.2507,37.601),(-122.2491,37.606)] | Berkeley + Sunol Ridge Trl | [(-121.9419,37.455),(-121.9345,37.38)] | Oakland + Sunol Ridge Trl | [(-121.9419,37.455),(-121.9345,37.38)] | Oakland + Tassajara Creek | [(-121.87866,37.98898),(-121.8782,37.015)] | Oakland + Tassajara Creek | [(-121.87866,37.98898),(-121.8782,37.015)] | Oakland + Taurus Ave | [(-122.2159,37.416),(-122.2128,37.389)] | Lafayette + Tennyson Road | [(-122.0891,37.317),(-122.0927,37.317)] | Oakland + Thackeray Ave | [(-122.072,37.305),(-122.0715,37.298)] | Oakland + Theresa Way | [(-121.7289,37.906),(-121.728,37.899)] | Oakland + Tissiack Way | [(-121.920364,37),(-121.9208,37.995)] | Oakland + Tissiack Way | [(-121.920364,37),(-121.9208,37.995)] | Oakland + Tupelo Ter | [(-122.059087,37.6113),(-122.057021,37.59942)] | Berkeley + Vallecitos Road | [(-121.8699,37.916),(-121.8703,37.891)] | Oakland + Warm Springs Blvd | [(-121.933956,37),(-121.9343,37.97)] | Oakland + Warm Springs Blvd | [(-121.933956,37),(-121.9343,37.97)] | Oakland + Welch Creek Road | [(-121.7695,37.386),(-121.7737,37.413)] | Oakland + Welch Creek Road | [(-121.7695,37.386),(-121.7737,37.413)] | Oakland + West Loop Road | [(-122.0576,37.604),(-122.0602,37.586)] | Berkeley + Western Pacific Railroad Spur | [(-122.0394,37.018),(-122.0394,37.961)] | Oakland + Western Pacific Railroad Spur | [(-122.0394,37.018),(-122.0394,37.961)] | Oakland + Western Pacific Railroad Spur | [(-122.0394,37.018),(-122.0394,37.961)] | Berkeley + Whitlock Creek | [(-121.74683,37.91276),(-121.733107,37)] | Oakland + Whitlock Creek | [(-121.74683,37.91276),(-121.733107,37)] | Oakland + Willimet Way | [(-122.0964,37.517),(-122.0949,37.493)] | Oakland + Wisconsin St | [(-122.1994,37.017),(-122.1975,37.998),(-122.1971,37.994)] | Oakland + Wisconsin St | [(-122.1994,37.017),(-122.1975,37.998),(-122.1971,37.994)] | Berkeley + Wp Railroad | [(-122.254,37.902),(-122.2506,37.891)] | Berkeley + 100th Ave | [(-122.1657,37.429),(-122.1647,37.432)] | Oakland + 107th Ave | [(-122.1555,37.403),(-122.1531,37.41)] | Oakland + 14th St | [(-122.299,37.147),(-122.3,37.148)] | Lafayette + 19th Ave | [(-122.2366,37.897),(-122.2359,37.905)] | Berkeley + 1st St | [(-121.75508,37.89294),(-121.753581,37.90031)] | Oakland + 5th St | [(-122.278,37),(-122.2792,37.005),(-122.2803,37.009)] | Lafayette + 5th St | [(-122.296,37.615),(-122.2953,37.598)] | Berkeley + 82nd Ave | [(-122.1695,37.596),(-122.1681,37.603)] | Berkeley + 85th Ave | [(-122.1877,37.466),(-122.186,37.476)] | Oakland + 89th Ave | [(-122.1822,37.459),(-122.1803,37.471)] | Oakland + 98th Ave | [(-122.1568,37.498),(-122.1558,37.502)] | Oakland + 98th Ave | [(-122.1693,37.438),(-122.1682,37.444)] | Oakland + 98th Ave | [(-122.2001,37.258),(-122.1974,37.27)] | Lafayette +(333 rows) + +SELECT name, #thepath FROM iexit ORDER BY name COLLATE "C", 2; + name | ?column? +------------------------------------+---------- + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 2 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 3 + I- 580 | 4 + I- 580 | 4 + I- 580 | 4 + I- 580 | 4 + I- 580 | 5 + I- 580 | 5 + I- 580 | 5 + I- 580 | 5 + I- 580 | 5 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 6 + I- 580 | 7 + I- 580 | 7 + I- 580 | 7 + I- 580 | 7 + I- 580 | 7 + I- 580 | 7 + I- 580 | 7 + I- 580 | 8 + I- 580 | 8 + I- 580 | 8 + I- 580 | 8 + I- 580 | 8 + I- 580 | 8 + I- 580 | 8 + I- 580 | 8 + I- 580 | 8 + I- 580 | 9 + I- 580 | 9 + I- 580 | 9 + I- 580 | 9 + I- 580 | 9 + I- 580 | 12 + I- 580 | 12 + I- 580 | 12 + I- 580 | 12 + I- 580 | 12 + I- 580 | 12 + I- 580 | 12 + I- 580 | 12 + I- 580 | 12 + I- 580 | 12 + I- 580 | 13 + I- 580 | 13 + I- 580 | 13 + I- 580 | 13 + I- 580 | 13 + I- 580 | 13 + I- 580 | 14 + I- 580 | 14 + I- 580 | 14 + I- 580 | 14 + I- 580 | 14 + I- 580 | 14 + I- 580 | 14 + I- 580 | 14 + I- 580 | 18 + I- 580 | 18 + I- 580 | 18 + I- 580 | 18 + I- 580 | 18 + I- 580 | 18 + I- 580 | 21 + I- 580 | 21 + I- 580 | 21 + I- 580 | 21 + I- 580 | 21 + I- 580 | 21 + I- 580 | 21 + I- 580 | 21 + I- 580 | 21 + I- 580 | 21 + I- 580 | 22 + I- 580 | 22 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 2 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 3 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 4 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 5 + I- 580 Ramp | 6 + I- 580 Ramp | 6 + I- 580 Ramp | 6 + I- 580 Ramp | 7 + I- 580 Ramp | 8 + I- 580 Ramp | 8 + I- 580 Ramp | 8 + I- 580 Ramp | 8 + I- 580 Ramp | 8 + I- 580 Ramp | 8 + I- 580/I-680 Ramp | 2 + I- 580/I-680 Ramp | 2 + I- 580/I-680 Ramp | 2 + I- 580/I-680 Ramp | 2 + I- 580/I-680 Ramp | 2 + I- 580/I-680 Ramp | 2 + I- 580/I-680 Ramp | 4 + I- 580/I-680 Ramp | 4 + I- 580/I-680 Ramp | 4 + I- 580/I-680 Ramp | 4 + I- 580/I-680 Ramp | 5 + I- 580/I-680 Ramp | 6 + I- 580/I-680 Ramp | 6 + I- 580/I-680 Ramp | 6 + I- 680 | 2 + I- 680 | 2 + I- 680 | 2 + I- 680 | 2 + I- 680 | 2 + I- 680 | 2 + I- 680 | 2 + I- 680 | 3 + I- 680 | 3 + I- 680 | 3 + I- 680 | 4 + I- 680 | 4 + I- 680 | 4 + I- 680 | 5 + I- 680 | 5 + I- 680 | 5 + I- 680 | 7 + I- 680 | 7 + I- 680 | 7 + I- 680 | 7 + I- 680 | 8 + I- 680 | 8 + I- 680 | 8 + I- 680 | 8 + I- 680 | 10 + I- 680 | 10 + I- 680 | 10 + I- 680 | 10 + I- 680 | 10 + I- 680 | 10 + I- 680 | 10 + I- 680 | 16 + I- 680 | 16 + I- 680 | 16 + I- 680 | 16 + I- 680 | 16 + I- 680 | 16 + I- 680 | 16 + I- 680 | 16 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 2 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 3 + I- 680 Ramp | 4 + I- 680 Ramp | 4 + I- 680 Ramp | 4 + I- 680 Ramp | 5 + I- 680 Ramp | 5 + I- 680 Ramp | 5 + I- 680 Ramp | 5 + I- 680 Ramp | 5 + I- 680 Ramp | 5 + I- 680 Ramp | 6 + I- 680 Ramp | 6 + I- 680 Ramp | 6 + I- 680 Ramp | 6 + I- 680 Ramp | 7 + I- 680 Ramp | 7 + I- 680 Ramp | 7 + I- 680 Ramp | 7 + I- 680 Ramp | 8 + I- 680 Ramp | 8 + I- 680 Ramp | 8 + I- 680 Ramp | 8 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 2 + I- 80 | 3 + I- 80 | 3 + I- 80 | 3 + I- 80 | 4 + I- 80 | 4 + I- 80 | 4 + I- 80 | 4 + I- 80 | 4 + I- 80 | 5 + I- 80 | 5 + I- 80 | 5 + I- 80 | 5 + I- 80 | 5 + I- 80 | 5 + I- 80 | 5 + I- 80 | 5 + I- 80 | 5 + I- 80 | 11 + I- 80 | 11 + I- 80 | 11 + I- 80 | 11 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 2 + I- 80 Ramp | 3 + I- 80 Ramp | 3 + I- 80 Ramp | 3 + I- 80 Ramp | 3 + I- 80 Ramp | 3 + I- 80 Ramp | 3 + I- 80 Ramp | 3 + I- 80 Ramp | 3 + I- 80 Ramp | 3 + I- 80 Ramp | 4 + I- 80 Ramp | 4 + I- 80 Ramp | 4 + I- 80 Ramp | 4 + I- 80 Ramp | 5 + I- 80 Ramp | 5 + I- 80 Ramp | 5 + I- 80 Ramp | 5 + I- 80 Ramp | 5 + I- 80 Ramp | 5 + I- 80 Ramp | 5 + I- 80 Ramp | 7 + I- 80 Ramp | 7 + I- 80 Ramp | 7 + I- 80 Ramp | 7 + I- 880 | 2 + I- 880 | 2 + I- 880 | 2 + I- 880 | 2 + I- 880 | 2 + I- 880 | 5 + I- 880 | 5 + I- 880 | 5 + I- 880 | 5 + I- 880 | 5 + I- 880 | 5 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 6 + I- 880 | 7 + I- 880 | 7 + I- 880 | 7 + I- 880 | 7 + I- 880 | 7 + I- 880 | 7 + I- 880 | 7 + I- 880 | 9 + I- 880 | 9 + I- 880 | 9 + I- 880 | 9 + I- 880 | 9 + I- 880 | 9 + I- 880 | 9 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 10 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 12 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 13 + I- 880 | 14 + I- 880 | 14 + I- 880 | 14 + I- 880 | 14 + I- 880 | 14 + I- 880 | 14 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 17 + I- 880 | 19 + I- 880 | 19 + I- 880 | 19 + I- 880 | 19 + I- 880 | 19 + I- 880 | 19 + I- 880 | 19 + I- 880 | 19 + I- 880 | 19 + I- 880 | 19 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 2 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 3 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 4 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 5 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 6 + I- 880 Ramp | 8 + I- 880 Ramp | 8 + I- 880 Ramp | 8 + I- 980 | 2 + I- 980 | 2 + I- 980 | 2 + I- 980 | 2 + I- 980 | 2 + I- 980 | 2 + I- 980 | 2 + I- 980 | 2 + I- 980 | 3 + I- 980 | 3 + I- 980 | 3 + I- 980 | 3 + I- 980 | 3 + I- 980 | 3 + I- 980 | 3 + I- 980 | 3 + I- 980 | 3 + I- 980 | 4 + I- 980 | 4 + I- 980 | 5 + I- 980 | 5 + I- 980 | 7 + I- 980 | 7 + I- 980 | 7 + I- 980 | 7 + I- 980 | 12 + I- 980 Ramp | 3 + I- 980 Ramp | 3 + I- 980 Ramp | 3 + I- 980 Ramp | 7 +(896 rows) + +SELECT * FROM toyemp WHERE name = 'sharon'; + name | age | location | annualsal +--------+-----+----------+----------- + sharon | 25 | (15,12) | 12000 +(1 row) + +-- +-- Test for Leaky view scenario +-- +CREATE ROLE regress_alice; +CREATE FUNCTION f_leak (text) + RETURNS bool LANGUAGE 'plpgsql' COST 0.0000001 + AS 'BEGIN RAISE NOTICE ''f_leak => %'', $1; RETURN true; END'; +CREATE TABLE customer ( + cid int primary key, + name text not null, + tel text, + passwd text +); +CREATE TABLE credit_card ( + cid int references customer(cid), + cnum text, + climit int +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +CREATE TABLE credit_usage ( + cid int references customer(cid), + ymd date, + usage int +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO customer + VALUES (101, 'regress_alice', '+81-12-3456-7890', 'passwd123'), + (102, 'regress_bob', '+01-234-567-8901', 'beafsteak'), + (103, 'regress_eve', '+49-8765-43210', 'hamburger'); +INSERT INTO credit_card + VALUES (101, '1111-2222-3333-4444', 4000), + (102, '5555-6666-7777-8888', 3000), + (103, '9801-2345-6789-0123', 2000); +INSERT INTO credit_usage + VALUES (101, '2011-09-15', 120), + (101, '2011-10-05', 90), + (101, '2011-10-18', 110), + (101, '2011-10-21', 200), + (101, '2011-11-10', 80), + (102, '2011-09-22', 300), + (102, '2011-10-12', 120), + (102, '2011-10-28', 200), + (103, '2011-10-15', 480); +CREATE VIEW my_property_normal AS + SELECT * FROM customer WHERE name = current_user; +CREATE VIEW my_property_secure WITH (security_barrier) AS + SELECT * FROM customer WHERE name = current_user; +CREATE VIEW my_credit_card_normal AS + SELECT * FROM customer l NATURAL JOIN credit_card r + WHERE l.name = current_user; +CREATE VIEW my_credit_card_secure WITH (security_barrier) AS + SELECT * FROM customer l NATURAL JOIN credit_card r + WHERE l.name = current_user; +CREATE VIEW my_credit_card_usage_normal AS + SELECT * FROM my_credit_card_secure l NATURAL JOIN credit_usage r; +CREATE VIEW my_credit_card_usage_secure WITH (security_barrier) AS + SELECT * FROM my_credit_card_secure l NATURAL JOIN credit_usage r; +GRANT SELECT ON my_property_normal TO public; +GRANT SELECT ON my_property_secure TO public; +GRANT SELECT ON my_credit_card_normal TO public; +GRANT SELECT ON my_credit_card_secure TO public; +GRANT SELECT ON my_credit_card_usage_normal TO public; +GRANT SELECT ON my_credit_card_usage_secure TO public; +-- +-- Run leaky view scenarios +-- +SET SESSION AUTHORIZATION regress_alice; +-- +-- scenario: if a qualifier with tiny-cost is given, it shall be launched +-- prior to the security policy of the view. +-- +SELECT * FROM my_property_normal WHERE f_leak(passwd); +NOTICE: f_leak => passwd123 +NOTICE: f_leak => beafsteak +NOTICE: f_leak => hamburger + cid | name | tel | passwd +-----+---------------+------------------+----------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM my_property_normal WHERE f_leak(passwd); + QUERY PLAN +--------------------------------------------------------------- + Seq Scan on customer + Filter: (f_leak(passwd) AND (name = 'regress_alice'::name)) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM my_property_secure WHERE f_leak(passwd); +NOTICE: f_leak => passwd123 + cid | name | tel | passwd +-----+---------------+------------------+----------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM my_property_secure WHERE f_leak(passwd); + QUERY PLAN +------------------------------------------------ + Subquery Scan on my_property_secure + Filter: f_leak(my_property_secure.passwd) + -> Seq Scan on customer + Filter: (name = 'regress_alice'::name) + Optimizer: Postgres query optimizer +(5 rows) + +-- +-- scenario: qualifiers can be pushed down if they contain leaky functions, +-- provided they aren't passed data from inside the view. +-- +SELECT * FROM my_property_normal v + WHERE f_leak('passwd') AND f_leak(passwd); +NOTICE: f_leak => passwd +NOTICE: f_leak => passwd123 +NOTICE: f_leak => passwd +NOTICE: f_leak => beafsteak +NOTICE: f_leak => passwd +NOTICE: f_leak => hamburger + cid | name | tel | passwd +-----+---------------+------------------+----------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM my_property_normal v + WHERE f_leak('passwd') AND f_leak(passwd); + QUERY PLAN +------------------------------------------------------------------------------------------ + Seq Scan on customer + Filter: (f_leak('passwd'::text) AND f_leak(passwd) AND (name = 'regress_alice'::name)) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT * FROM my_property_secure v + WHERE f_leak('passwd') AND f_leak(passwd); +NOTICE: f_leak => passwd +NOTICE: f_leak => passwd123 +NOTICE: f_leak => passwd +NOTICE: f_leak => passwd + cid | name | tel | passwd +-----+---------------+------------------+----------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM my_property_secure v + WHERE f_leak('passwd') AND f_leak(passwd); + QUERY PLAN +----------------------------------------------------------------------------- + Subquery Scan on v + Filter: f_leak(v.passwd) + -> Seq Scan on customer + Filter: (f_leak('passwd'::text) AND (name = 'regress_alice'::name)) + Optimizer: Postgres query optimizer +(5 rows) + +-- +-- scenario: if a qualifier references only one-side of a particular join- +-- tree, it shall be distributed to the most deep scan plan as +-- possible as we can. +-- +SELECT * FROM my_credit_card_normal WHERE f_leak(cnum); +NOTICE: f_leak => 1111-2222-3333-4444 +NOTICE: f_leak => 5555-6666-7777-8888 +NOTICE: f_leak => 9801-2345-6789-0123 + cid | name | tel | passwd | cnum | climit +-----+---------------+------------------+-----------+---------------------+-------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 | 1111-2222-3333-4444 | 4000 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM my_credit_card_normal WHERE f_leak(cnum); + QUERY PLAN +------------------------------------------------------ + Hash Join + Hash Cond: (r.cid = l.cid) + -> Seq Scan on credit_card r + Filter: f_leak(cnum) + -> Hash + -> Seq Scan on customer l + Filter: (name = 'regress_alice'::name) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM my_credit_card_secure WHERE f_leak(cnum); +NOTICE: f_leak => 1111-2222-3333-4444 + cid | name | tel | passwd | cnum | climit +-----+---------------+------------------+-----------+---------------------+-------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 | 1111-2222-3333-4444 | 4000 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM my_credit_card_secure WHERE f_leak(cnum); + QUERY PLAN +------------------------------------------------------------ + Subquery Scan on my_credit_card_secure + Filter: f_leak(my_credit_card_secure.cnum) + -> Hash Join + Hash Cond: (r.cid = l.cid) + -> Seq Scan on credit_card r + -> Hash + -> Seq Scan on customer l + Filter: (name = 'regress_alice'::name) + Optimizer: Postgres query optimizer +(9 rows) + +-- +-- scenario: an external qualifier can be pushed-down by in-front-of the +-- views with "security_barrier" attribute, except for operators +-- implemented with leakproof functions. +-- +SELECT * FROM my_credit_card_usage_normal + WHERE f_leak(cnum) AND ymd >= '2011-10-01' AND ymd < '2011-11-01'; +NOTICE: f_leak => 1111-2222-3333-4444 + cid | name | tel | passwd | cnum | climit | ymd | usage +-----+---------------+------------------+-----------+---------------------+--------+------------+------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 | 1111-2222-3333-4444 | 4000 | 10-05-2011 | 90 + 101 | regress_alice | +81-12-3456-7890 | passwd123 | 1111-2222-3333-4444 | 4000 | 10-18-2011 | 110 + 101 | regress_alice | +81-12-3456-7890 | passwd123 | 1111-2222-3333-4444 | 4000 | 10-21-2011 | 200 +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM my_credit_card_usage_normal + WHERE f_leak(cnum) AND ymd >= '2011-10-01' AND ymd < '2011-11-01'; + QUERY PLAN +------------------------------------------------------------------------------ + Hash Join + Hash Cond: (r.cid = l.cid) + -> Seq Scan on credit_usage r + Filter: ((ymd >= '10-01-2011'::date) AND (ymd < '11-01-2011'::date)) + -> Hash + -> Subquery Scan on l + Filter: f_leak(l.cnum) + -> Hash Join + Hash Cond: (r_1.cid = l_1.cid) + -> Seq Scan on credit_card r_1 + -> Hash + -> Seq Scan on customer l_1 + Filter: (name = 'regress_alice'::name) + Optimizer: Postgres query optimizer +(14 rows) + +SELECT * FROM my_credit_card_usage_secure + WHERE f_leak(cnum) AND ymd >= '2011-10-01' AND ymd < '2011-11-01'; +NOTICE: f_leak => 1111-2222-3333-4444 +NOTICE: f_leak => 1111-2222-3333-4444 +NOTICE: f_leak => 1111-2222-3333-4444 + cid | name | tel | passwd | cnum | climit | ymd | usage +-----+---------------+------------------+-----------+---------------------+--------+------------+------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 | 1111-2222-3333-4444 | 4000 | 10-05-2011 | 90 + 101 | regress_alice | +81-12-3456-7890 | passwd123 | 1111-2222-3333-4444 | 4000 | 10-18-2011 | 110 + 101 | regress_alice | +81-12-3456-7890 | passwd123 | 1111-2222-3333-4444 | 4000 | 10-21-2011 | 200 +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM my_credit_card_usage_secure + WHERE f_leak(cnum) AND ymd >= '2011-10-01' AND ymd < '2011-11-01'; + QUERY PLAN +------------------------------------------------------------------------------------ + Subquery Scan on my_credit_card_usage_secure + Filter: f_leak(my_credit_card_usage_secure.cnum) + -> Hash Join + Hash Cond: (r.cid = l.cid) + -> Seq Scan on credit_usage r + Filter: ((ymd >= '10-01-2011'::date) AND (ymd < '11-01-2011'::date)) + -> Hash + -> Hash Join + Hash Cond: (r_1.cid = l.cid) + -> Seq Scan on credit_card r_1 + -> Hash + -> Seq Scan on customer l + Filter: (name = 'regress_alice'::name) + Optimizer: Postgres query optimizer +(14 rows) + +-- +-- Test for the case when security_barrier gets changed between rewriter +-- and planner stage. +-- +PREPARE p1 AS SELECT * FROM my_property_normal WHERE f_leak(passwd); +PREPARE p2 AS SELECT * FROM my_property_secure WHERE f_leak(passwd); +EXECUTE p1; +NOTICE: f_leak => passwd123 +NOTICE: f_leak => beafsteak +NOTICE: f_leak => hamburger + cid | name | tel | passwd +-----+---------------+------------------+----------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 +(1 row) + +EXECUTE p2; +NOTICE: f_leak => passwd123 + cid | name | tel | passwd +-----+---------------+------------------+----------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 +(1 row) + +RESET SESSION AUTHORIZATION; +ALTER VIEW my_property_normal SET (security_barrier=true); +ALTER VIEW my_property_secure SET (security_barrier=false); +SET SESSION AUTHORIZATION regress_alice; +EXECUTE p1; -- To be perform as a view with security-barrier +NOTICE: f_leak => passwd123 + cid | name | tel | passwd +-----+---------------+------------------+----------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 +(1 row) + +EXECUTE p2; -- To be perform as a view without security-barrier +NOTICE: f_leak => passwd123 +NOTICE: f_leak => beafsteak +NOTICE: f_leak => hamburger + cid | name | tel | passwd +-----+---------------+------------------+----------- + 101 | regress_alice | +81-12-3456-7890 | passwd123 +(1 row) + +-- Cleanup. +RESET SESSION AUTHORIZATION; +DROP ROLE regress_alice; diff --git a/src/test/singlenode_regress/expected/sequence.out b/src/test/singlenode_regress/expected/sequence.out new file mode 100644 index 00000000000..679555cb1ef --- /dev/null +++ b/src/test/singlenode_regress/expected/sequence.out @@ -0,0 +1,824 @@ +-- +-- CREATE SEQUENCE +-- +-- various error cases +CREATE UNLOGGED SEQUENCE sequence_testx; +ERROR: unlogged sequences are not supported +CREATE SEQUENCE sequence_testx INCREMENT BY 0; +ERROR: INCREMENT must not be zero +CREATE SEQUENCE sequence_testx INCREMENT BY -1 MINVALUE 20; +ERROR: MINVALUE (20) must be less than MAXVALUE (-1) +CREATE SEQUENCE sequence_testx INCREMENT BY 1 MAXVALUE -20; +ERROR: MINVALUE (1) must be less than MAXVALUE (-20) +CREATE SEQUENCE sequence_testx INCREMENT BY -1 START 10; +ERROR: START value (10) cannot be greater than MAXVALUE (-1) +CREATE SEQUENCE sequence_testx INCREMENT BY 1 START -10; +ERROR: START value (-10) cannot be less than MINVALUE (1) +CREATE SEQUENCE sequence_testx CACHE 0; +ERROR: CACHE (0) must be greater than zero +-- OWNED BY errors +CREATE SEQUENCE sequence_testx OWNED BY nobody; -- nonsense word +ERROR: invalid OWNED BY option +HINT: Specify OWNED BY table.column or OWNED BY NONE. +CREATE SEQUENCE sequence_testx OWNED BY pg_class_oid_index.oid; -- not a table +ERROR: referenced relation "pg_class_oid_index" is not a table or foreign table +CREATE SEQUENCE sequence_testx OWNED BY pg_class.relname; -- not same schema +ERROR: sequence must be in same schema as table it is linked to +CREATE TABLE sequence_test_table (a int); +CREATE SEQUENCE sequence_testx OWNED BY sequence_test_table.b; -- wrong column +ERROR: column "b" of relation "sequence_test_table" does not exist +DROP TABLE sequence_test_table; +-- sequence data types +CREATE SEQUENCE sequence_test5 AS integer; +CREATE SEQUENCE sequence_test6 AS smallint; +CREATE SEQUENCE sequence_test7 AS bigint; +CREATE SEQUENCE sequence_test8 AS integer MAXVALUE 100000; +CREATE SEQUENCE sequence_test9 AS integer INCREMENT BY -1; +CREATE SEQUENCE sequence_test10 AS integer MINVALUE -100000 START 1; +CREATE SEQUENCE sequence_test11 AS smallint; +CREATE SEQUENCE sequence_test12 AS smallint INCREMENT -1; +CREATE SEQUENCE sequence_test13 AS smallint MINVALUE -32768; +CREATE SEQUENCE sequence_test14 AS smallint MAXVALUE 32767 INCREMENT -1; +CREATE SEQUENCE sequence_testx AS text; +ERROR: sequence type must be smallint, integer, or bigint +CREATE SEQUENCE sequence_testx AS nosuchtype; +ERROR: type "nosuchtype" does not exist +LINE 1: CREATE SEQUENCE sequence_testx AS nosuchtype; + ^ +CREATE SEQUENCE sequence_testx AS smallint MAXVALUE 100000; +ERROR: MAXVALUE (100000) is out of range for sequence data type smallint +CREATE SEQUENCE sequence_testx AS smallint MINVALUE -100000; +ERROR: MINVALUE (-100000) is out of range for sequence data type smallint +ALTER SEQUENCE sequence_test5 AS smallint; -- success, max will be adjusted +ALTER SEQUENCE sequence_test8 AS smallint; -- fail, max has to be adjusted +ERROR: MAXVALUE (100000) is out of range for sequence data type smallint +ALTER SEQUENCE sequence_test8 AS smallint MAXVALUE 20000; -- ok now +ALTER SEQUENCE sequence_test9 AS smallint; -- success, min will be adjusted +ALTER SEQUENCE sequence_test10 AS smallint; -- fail, min has to be adjusted +ERROR: MINVALUE (-100000) is out of range for sequence data type smallint +ALTER SEQUENCE sequence_test10 AS smallint MINVALUE -20000; -- ok now +ALTER SEQUENCE sequence_test11 AS int; -- max will be adjusted +ALTER SEQUENCE sequence_test12 AS int; -- min will be adjusted +ALTER SEQUENCE sequence_test13 AS int; -- min and max will be adjusted +ALTER SEQUENCE sequence_test14 AS int; -- min and max will be adjusted +--- +--- test creation of SERIAL column +--- +CREATE TABLE serialTest1 (f1 text, f2 serial); +INSERT INTO serialTest1 VALUES ('foo'); +INSERT INTO serialTest1 VALUES ('bar'); +INSERT INTO serialTest1 VALUES ('force', 100); +INSERT INTO serialTest1 VALUES ('wrong', NULL); +ERROR: null value in column "f2" of relation "serialtest1" violates not-null constraint +DETAIL: Failing row contains (wrong, null). +SELECT * FROM serialTest1; + f1 | f2 +-------+----- + foo | 1 + bar | 2 + force | 100 +(3 rows) + +SELECT pg_get_serial_sequence('serialTest1', 'f2'); + pg_get_serial_sequence +--------------------------- + public.serialtest1_f2_seq +(1 row) + +-- test smallserial / bigserial +CREATE TABLE serialTest2 (f1 text, f2 serial, f3 smallserial, f4 serial2, + f5 bigserial, f6 serial8); +INSERT INTO serialTest2 (f1) + VALUES ('test_defaults'); +INSERT INTO serialTest2 (f1, f2, f3, f4, f5, f6) + VALUES ('test_max_vals', 2147483647, 32767, 32767, 9223372036854775807, + 9223372036854775807), + ('test_min_vals', -2147483648, -32768, -32768, -9223372036854775808, + -9223372036854775808); +-- All these INSERTs should fail: +INSERT INTO serialTest2 (f1, f3) + VALUES ('bogus', -32769); +ERROR: smallint out of range +INSERT INTO serialTest2 (f1, f4) + VALUES ('bogus', -32769); +ERROR: smallint out of range +INSERT INTO serialTest2 (f1, f3) + VALUES ('bogus', 32768); +ERROR: smallint out of range +INSERT INTO serialTest2 (f1, f4) + VALUES ('bogus', 32768); +ERROR: smallint out of range +INSERT INTO serialTest2 (f1, f5) + VALUES ('bogus', -9223372036854775809); +ERROR: bigint out of range +INSERT INTO serialTest2 (f1, f6) + VALUES ('bogus', -9223372036854775809); +ERROR: bigint out of range +INSERT INTO serialTest2 (f1, f5) + VALUES ('bogus', 9223372036854775808); +ERROR: bigint out of range +INSERT INTO serialTest2 (f1, f6) + VALUES ('bogus', 9223372036854775808); +ERROR: bigint out of range +SELECT * FROM serialTest2 ORDER BY f2 ASC; + f1 | f2 | f3 | f4 | f5 | f6 +---------------+-------------+--------+--------+----------------------+---------------------- + test_min_vals | -2147483648 | -32768 | -32768 | -9223372036854775808 | -9223372036854775808 + test_defaults | 1 | 1 | 1 | 1 | 1 + test_max_vals | 2147483647 | 32767 | 32767 | 9223372036854775807 | 9223372036854775807 +(3 rows) + +SELECT nextval('serialTest2_f2_seq'); + nextval +--------- + 2 +(1 row) + +SELECT nextval('serialTest2_f3_seq'); + nextval +--------- + 2 +(1 row) + +SELECT nextval('serialTest2_f4_seq'); + nextval +--------- + 2 +(1 row) + +SELECT nextval('serialTest2_f5_seq'); + nextval +--------- + 2 +(1 row) + +SELECT nextval('serialTest2_f6_seq'); + nextval +--------- + 2 +(1 row) + +-- basic sequence operations using both text and oid references +CREATE SEQUENCE sequence_test; +CREATE SEQUENCE IF NOT EXISTS sequence_test; +NOTICE: relation "sequence_test" already exists, skipping +SELECT nextval('sequence_test'::text); + nextval +--------- + 1 +(1 row) + +SELECT nextval('sequence_test'::regclass); + nextval +--------- + 2 +(1 row) + +SELECT currval('sequence_test'::text); + currval +--------- + 2 +(1 row) + +SELECT currval('sequence_test'::regclass); + currval +--------- + 2 +(1 row) + +SELECT setval('sequence_test'::text, 32); + setval +-------- + 32 +(1 row) + +SELECT nextval('sequence_test'::regclass); + nextval +--------- + 33 +(1 row) + +SELECT setval('sequence_test'::text, 99, false); + setval +-------- + 99 +(1 row) + +SELECT nextval('sequence_test'::regclass); + nextval +--------- + 99 +(1 row) + +SELECT setval('sequence_test'::regclass, 32); + setval +-------- + 32 +(1 row) + +SELECT nextval('sequence_test'::text); + nextval +--------- + 33 +(1 row) + +SELECT setval('sequence_test'::regclass, 99, false); + setval +-------- + 99 +(1 row) + +SELECT nextval('sequence_test'::text); + nextval +--------- + 99 +(1 row) + +DISCARD SEQUENCES; +SELECT currval('sequence_test'::regclass); +ERROR: currval of sequence "sequence_test" is not yet defined in this session +DROP SEQUENCE sequence_test; +-- renaming sequences +CREATE SEQUENCE foo_seq CACHE 1; +ALTER TABLE foo_seq RENAME TO foo_seq_new; +SELECT * FROM foo_seq_new; + last_value | log_cnt | is_called +------------+---------+----------- + 1 | 0 | f +(1 row) + +SELECT nextval('foo_seq_new'); + nextval +--------- + 1 +(1 row) + +SELECT nextval('foo_seq_new'); + nextval +--------- + 2 +(1 row) + +-- log_cnt can be higher if there is a checkpoint just at the right +-- time, so just test for the expected range +SELECT last_value, log_cnt IN (31, 32) AS log_cnt_ok, is_called FROM foo_seq_new; + last_value | log_cnt_ok | is_called +------------+------------+----------- + 2 | t | t +(1 row) + +DROP SEQUENCE foo_seq_new; +-- renaming serial sequences +ALTER TABLE serialtest1_f2_seq RENAME TO serialtest1_f2_foo; +INSERT INTO serialTest1 VALUES ('more'); +SELECT * FROM serialTest1; + f1 | f2 +-------+----- + foo | 1 + bar | 2 + force | 100 + more | 3 +(4 rows) + +-- +-- Check dependencies of serial and ordinary sequences +-- +CREATE TEMP SEQUENCE myseq2; +CREATE TEMP SEQUENCE myseq3; +CREATE TEMP TABLE t1 ( + f1 serial, + f2 int DEFAULT nextval('myseq2'), + f3 int DEFAULT nextval('myseq3'::text) +); +-- Both drops should fail, but with different error messages: +DROP SEQUENCE t1_f1_seq; +ERROR: cannot drop sequence t1_f1_seq because other objects depend on it +DETAIL: default value for column f1 of table t1 depends on sequence t1_f1_seq +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP SEQUENCE myseq2; +ERROR: cannot drop sequence myseq2 because other objects depend on it +DETAIL: default value for column f2 of table t1 depends on sequence myseq2 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- This however will work: +DROP SEQUENCE myseq3; +DROP TABLE t1; +-- Fails because no longer existent: +DROP SEQUENCE t1_f1_seq; +ERROR: sequence "t1_f1_seq" does not exist +-- Now OK: +DROP SEQUENCE myseq2; +-- +-- Alter sequence +-- +ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 24 + INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; +NOTICE: relation "sequence_test2" does not exist, skipping +ALTER SEQUENCE serialTest1 CYCLE; -- error, not a sequence +ERROR: "serialtest1" is not a sequence +CREATE SEQUENCE sequence_test2 START WITH 32; +CREATE SEQUENCE sequence_test4 INCREMENT BY -1; +SELECT nextval('sequence_test2'); + nextval +--------- + 32 +(1 row) + +SELECT nextval('sequence_test4'); + nextval +--------- + -1 +(1 row) + +ALTER SEQUENCE sequence_test2 RESTART; +SELECT nextval('sequence_test2'); + nextval +--------- + 32 +(1 row) + +ALTER SEQUENCE sequence_test2 RESTART WITH 0; -- error +ERROR: RESTART value (0) cannot be less than MINVALUE (1) +ALTER SEQUENCE sequence_test4 RESTART WITH 40; -- error +ERROR: RESTART value (40) cannot be greater than MAXVALUE (-1) +-- test CYCLE and NO CYCLE +ALTER SEQUENCE sequence_test2 RESTART WITH 24 + INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; +SELECT nextval('sequence_test2'); + nextval +--------- + 24 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + 28 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + 32 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + 36 +(1 row) + +SELECT nextval('sequence_test2'); -- cycled + nextval +--------- + 5 +(1 row) + +ALTER SEQUENCE sequence_test2 RESTART WITH 24 + NO CYCLE; +SELECT nextval('sequence_test2'); + nextval +--------- + 24 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + 28 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + 32 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + 36 +(1 row) + +SELECT nextval('sequence_test2'); -- error +ERROR: nextval: reached maximum value of sequence "sequence_test2" (36) +ALTER SEQUENCE sequence_test2 RESTART WITH -24 START WITH -24 + INCREMENT BY -4 MINVALUE -36 MAXVALUE -5 CYCLE; +SELECT nextval('sequence_test2'); + nextval +--------- + -24 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + -28 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + -32 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + -36 +(1 row) + +SELECT nextval('sequence_test2'); -- cycled + nextval +--------- + -5 +(1 row) + +ALTER SEQUENCE sequence_test2 RESTART WITH -24 + NO CYCLE; +SELECT nextval('sequence_test2'); + nextval +--------- + -24 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + -28 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + -32 +(1 row) + +SELECT nextval('sequence_test2'); + nextval +--------- + -36 +(1 row) + +SELECT nextval('sequence_test2'); -- error +ERROR: nextval: reached minimum value of sequence "sequence_test2" (-36) +-- reset +ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 32 START WITH 32 + INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; +SELECT setval('sequence_test2', -100); -- error +ERROR: setval: value -100 is out of bounds for sequence "sequence_test2" (5..36) +SELECT setval('sequence_test2', 100); -- error +ERROR: setval: value 100 is out of bounds for sequence "sequence_test2" (5..36) +SELECT setval('sequence_test2', 5); + setval +-------- + 5 +(1 row) + +CREATE SEQUENCE sequence_test3; -- not read from, to test is_called +-- Information schema +SELECT * FROM information_schema.sequences + WHERE sequence_name ~ ANY(ARRAY['sequence_test', 'serialtest']) + ORDER BY sequence_name ASC; + sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option +------------------+-----------------+--------------------+-----------+-------------------+-------------------------+---------------+-------------+----------------------+---------------------+-----------+-------------- + regression | public | sequence_test10 | smallint | 16 | 2 | 0 | 1 | -20000 | 32767 | 1 | NO + regression | public | sequence_test11 | integer | 32 | 2 | 0 | 1 | 1 | 2147483647 | 1 | NO + regression | public | sequence_test12 | integer | 32 | 2 | 0 | -1 | -2147483648 | -1 | -1 | NO + regression | public | sequence_test13 | integer | 32 | 2 | 0 | -32768 | -2147483648 | 2147483647 | 1 | NO + regression | public | sequence_test14 | integer | 32 | 2 | 0 | 32767 | -2147483648 | 2147483647 | -1 | NO + regression | public | sequence_test2 | bigint | 64 | 2 | 0 | 32 | 5 | 36 | 4 | YES + regression | public | sequence_test3 | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO + regression | public | sequence_test4 | bigint | 64 | 2 | 0 | -1 | -9223372036854775808 | -1 | -1 | NO + regression | public | sequence_test5 | smallint | 16 | 2 | 0 | 1 | 1 | 32767 | 1 | NO + regression | public | sequence_test6 | smallint | 16 | 2 | 0 | 1 | 1 | 32767 | 1 | NO + regression | public | sequence_test7 | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO + regression | public | sequence_test8 | smallint | 16 | 2 | 0 | 1 | 1 | 20000 | 1 | NO + regression | public | sequence_test9 | smallint | 16 | 2 | 0 | -1 | -32768 | -1 | -1 | NO + regression | public | serialtest1_f2_foo | integer | 32 | 2 | 0 | 1 | 1 | 2147483647 | 1 | NO + regression | public | serialtest2_f2_seq | integer | 32 | 2 | 0 | 1 | 1 | 2147483647 | 1 | NO + regression | public | serialtest2_f3_seq | smallint | 16 | 2 | 0 | 1 | 1 | 32767 | 1 | NO + regression | public | serialtest2_f4_seq | smallint | 16 | 2 | 0 | 1 | 1 | 32767 | 1 | NO + regression | public | serialtest2_f5_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO + regression | public | serialtest2_f6_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO +(19 rows) + +SELECT schemaname, sequencename, start_value, min_value, max_value, increment_by, cycle, cache_size, last_value +FROM pg_sequences +WHERE sequencename ~ ANY(ARRAY['sequence_test', 'serialtest']) + ORDER BY sequencename ASC; + schemaname | sequencename | start_value | min_value | max_value | increment_by | cycle | cache_size | last_value +------------+--------------------+-------------+----------------------+---------------------+--------------+-------+------------+------------ + public | sequence_test10 | 1 | -20000 | 32767 | 1 | f | 20 | + public | sequence_test11 | 1 | 1 | 2147483647 | 1 | f | 20 | + public | sequence_test12 | -1 | -2147483648 | -1 | -1 | f | 20 | + public | sequence_test13 | -32768 | -2147483648 | 2147483647 | 1 | f | 20 | + public | sequence_test14 | 32767 | -2147483648 | 2147483647 | -1 | f | 20 | + public | sequence_test2 | 32 | 5 | 36 | 4 | t | 20 | 5 + public | sequence_test3 | 1 | 1 | 9223372036854775807 | 1 | f | 20 | + public | sequence_test4 | -1 | -9223372036854775808 | -1 | -1 | f | 20 | -20 + public | sequence_test5 | 1 | 1 | 32767 | 1 | f | 20 | + public | sequence_test6 | 1 | 1 | 32767 | 1 | f | 20 | + public | sequence_test7 | 1 | 1 | 9223372036854775807 | 1 | f | 20 | + public | sequence_test8 | 1 | 1 | 20000 | 1 | f | 20 | + public | sequence_test9 | -1 | -32768 | -1 | -1 | f | 20 | + public | serialtest1_f2_foo | 1 | 1 | 2147483647 | 1 | f | 1 | 3 + public | serialtest2_f2_seq | 1 | 1 | 2147483647 | 1 | f | 1 | 2 + public | serialtest2_f3_seq | 1 | 1 | 32767 | 1 | f | 1 | 2 + public | serialtest2_f4_seq | 1 | 1 | 32767 | 1 | f | 1 | 2 + public | serialtest2_f5_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2 + public | serialtest2_f6_seq | 1 | 1 | 9223372036854775807 | 1 | f | 1 | 2 +(19 rows) + +SELECT * FROM pg_sequence_parameters('sequence_test4'::regclass); + start_value | minimum_value | maximum_value | increment | cycle_option | cache_size | data_type +-------------+----------------------+---------------+-----------+--------------+------------+----------- + -1 | -9223372036854775808 | -1 | -1 | f | 20 | 20 +(1 row) + +\d sequence_test4 + Sequence "public.sequence_test4" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+----------------------+---------+-----------+---------+------- + bigint | -1 | -9223372036854775808 | -1 | -1 | no | 20 + +\d serialtest2_f2_seq + Sequence "public.serialtest2_f2_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Owned by: public.serialtest2.f2 + +-- Test comments +COMMENT ON SEQUENCE asdf IS 'won''t work'; +ERROR: relation "asdf" does not exist +COMMENT ON SEQUENCE sequence_test2 IS 'will work'; +COMMENT ON SEQUENCE sequence_test2 IS NULL; +-- Test lastval() +CREATE SEQUENCE seq; +SELECT nextval('seq'); + nextval +--------- + 1 +(1 row) + +SELECT lastval(); + lastval +--------- + 1 +(1 row) + +SELECT setval('seq', 99); + setval +-------- + 99 +(1 row) + +SELECT lastval(); + lastval +--------- + 99 +(1 row) + +DISCARD SEQUENCES; +SELECT lastval(); +ERROR: lastval is not yet defined in this session +CREATE SEQUENCE seq2; +SELECT nextval('seq2'); + nextval +--------- + 1 +(1 row) + +SELECT lastval(); + lastval +--------- + 1 +(1 row) + +DROP SEQUENCE seq2; +-- should fail +SELECT lastval(); +ERROR: lastval is not yet defined in this session +-- Test sequences in read-only transactions +CREATE TEMPORARY SEQUENCE sequence_test_temp1; +START TRANSACTION READ ONLY; +SELECT nextval('sequence_test_temp1'); -- ok + nextval +--------- + 1 +(1 row) + +SELECT nextval('sequence_test2'); -- error +ERROR: cannot execute nextval() in a read-only transaction +ROLLBACK; +START TRANSACTION READ ONLY; +SELECT setval('sequence_test_temp1', 1); -- ok + setval +-------- + 1 +(1 row) + +SELECT setval('sequence_test2', 1); -- error +ERROR: cannot execute setval() in a read-only transaction +ROLLBACK; +-- privileges tests +CREATE USER regress_seq_user; +-- nextval +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT SELECT ON seq3 TO regress_seq_user; +SELECT nextval('seq3'); +ERROR: permission denied for sequence seq3 +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT UPDATE ON seq3 TO regress_seq_user; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT USAGE ON seq3 TO regress_seq_user; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +ROLLBACK; +-- currval +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT SELECT ON seq3 TO regress_seq_user; +SELECT currval('seq3'); + currval +--------- + 1 +(1 row) + +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT UPDATE ON seq3 TO regress_seq_user; +SELECT currval('seq3'); +ERROR: permission denied for sequence seq3 +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT USAGE ON seq3 TO regress_seq_user; +SELECT currval('seq3'); + currval +--------- + 1 +(1 row) + +ROLLBACK; +-- lastval +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT SELECT ON seq3 TO regress_seq_user; +SELECT lastval(); + lastval +--------- + 1 +(1 row) + +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT UPDATE ON seq3 TO regress_seq_user; +SELECT lastval(); +ERROR: permission denied for sequence seq3 +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT USAGE ON seq3 TO regress_seq_user; +SELECT lastval(); + lastval +--------- + 1 +(1 row) + +ROLLBACK; +-- setval +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM regress_seq_user; +SAVEPOINT save; +SELECT setval('seq3', 5); +ERROR: permission denied for sequence seq3 +ROLLBACK TO save; +GRANT UPDATE ON seq3 TO regress_seq_user; +SELECT setval('seq3', 5); + setval +-------- + 5 +(1 row) + +SELECT nextval('seq3'); + nextval +--------- + 6 +(1 row) + +ROLLBACK; +-- ALTER SEQUENCE +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +ALTER SEQUENCE sequence_test2 START WITH 1; +ERROR: must be owner of sequence sequence_test2 +ROLLBACK; +-- Sequences should get wiped out as well: +DROP TABLE serialTest1, serialTest2; +-- Make sure sequences are gone: +SELECT * FROM information_schema.sequences WHERE sequence_name IN + ('sequence_test2', 'serialtest2_f2_seq', 'serialtest2_f3_seq', + 'serialtest2_f4_seq', 'serialtest2_f5_seq', 'serialtest2_f6_seq') + ORDER BY sequence_name ASC; + sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option +------------------+-----------------+----------------+-----------+-------------------+-------------------------+---------------+-------------+---------------+---------------+-----------+-------------- + regression | public | sequence_test2 | bigint | 64 | 2 | 0 | 32 | 5 | 36 | 4 | YES +(1 row) + +DROP USER regress_seq_user; +DROP SEQUENCE seq; +-- cache tests +CREATE SEQUENCE test_seq1 CACHE 10; +SELECT nextval('test_seq1'); + nextval +--------- + 1 +(1 row) + +SELECT nextval('test_seq1'); + nextval +--------- + 2 +(1 row) + +SELECT nextval('test_seq1'); + nextval +--------- + 3 +(1 row) + +DROP SEQUENCE test_seq1; diff --git a/src/test/singlenode_regress/expected/sequence_gp.out b/src/test/singlenode_regress/expected/sequence_gp.out new file mode 100755 index 00000000000..e0444bc4cae --- /dev/null +++ b/src/test/singlenode_regress/expected/sequence_gp.out @@ -0,0 +1,223 @@ +-- +-- Test Overflow with NO CYCLE +-- +CREATE TABLE tmp_table (a int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO tmp_table VALUES (0),(1),(2),(3); +-- Test execution of nextval on master with CACHE 1 +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2 START 1 CACHE 1 NO CYCLE; +SELECT nextval('tmp_seq'); + nextval +--------- + 1 +(1 row) + +SELECT nextval('tmp_seq'); + nextval +--------- + 2 +(1 row) + +-- Fails because it reaches MAXVALUE +SELECT nextval('tmp_seq'); +ERROR: nextval: reached maximum value of sequence "tmp_seq" (2) +DROP SEQUENCE tmp_seq; +-- Test that ORCA and Planner return the same results although they produce different execution plans. +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 4 START 1 CACHE 1 NO CYCLE; +SELECT val from (SELECT nextval('tmp_seq'), a as val FROM tmp_table ORDER BY a) as val ORDER BY val; + val +----- + 0 + 1 + 2 + 3 +(4 rows) + +DROP SEQUENCE tmp_seq; +-- Test execution of nextval on master with CACHE > 1 +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2 START 1 CACHE 20 NO CYCLE; +SELECT nextval('tmp_seq'); + nextval +--------- + 1 +(1 row) + +SELECT nextval('tmp_seq'); + nextval +--------- + 2 +(1 row) + +-- Fails because it reaches MAXVALUE +SELECT nextval('tmp_seq'); +ERROR: nextval: reached maximum value of sequence "tmp_seq" (2) +DROP SEQUENCE tmp_seq; +-- Test execution of nextval on master (when optimizer = on) and segments (when optimizer=off) with CACHE > 1 +CREATE TABLE tmp_table_cache (a int, b int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +-- forcing the values to go on one segment only, to predict the sequence values. +INSERT INTO tmp_table_cache VALUES (1,0),(1,1),(1,2),(1,3); +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 4 START 1 CACHE 3 NO CYCLE; +SELECT nextval('tmp_seq'), * FROM tmp_table_cache; + nextval | a | b +---------+---+--- + 1 | 1 | 0 + 2 | 1 | 1 + 3 | 1 | 2 + 4 | 1 | 3 +(4 rows) + +SELECT * from tmp_seq; + last_value | log_cnt | is_called +------------+---------+----------- + 4 | 0 | t +(1 row) + +SELECT seqrelid::regclass, seqtypid::regtype, seqstart, seqincrement, seqmax, seqmin, seqcache, seqcycle FROM pg_sequence WHERE seqrelid='tmp_seq'::regclass; + seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle +----------+----------+----------+--------------+--------+--------+----------+---------- + tmp_seq | bigint | 1 | 1 | 4 | 1 | 3 | f +(1 row) + +DROP SEQUENCE tmp_seq; +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 3 START 1 CACHE 3 NO CYCLE; +SELECT nextval('tmp_seq'), a FROM tmp_table ORDER BY a; +ERROR: nextval: reached maximum value of sequence "tmp_seq" (3) +DROP SEQUENCE tmp_seq; +DROP TABLE tmp_table; +CREATE TABLE mytable (size INTEGER, gid bigserial NOT NULL); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'size' as the Cloudberry Database 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. +ALTER SEQUENCE mytable_gid_seq RESTART WITH 9223372036854775805; +/* Consume rest of serial sequence column values */ +INSERT INTO mytable VALUES (1), (2), (3); +SELECT gid FROM mytable; + gid +--------------------- + 9223372036854775805 + 9223372036854775806 + 9223372036854775807 +(3 rows) + +INSERT INTO mytable VALUES(4); +ERROR: nextval: reached maximum value of sequence "mytable_gid_seq" (9223372036854775807) +SELECT gid FROM mytable; + gid +--------------------- + 9223372036854775805 + 9223372036854775806 + 9223372036854775807 +(3 rows) + +INSERT INTO mytable SELECT * FROM generate_series(1, 10)i; +ERROR: nextval: reached maximum value of sequence "mytable_gid_seq" (9223372036854775807) +SELECT gid FROM mytable; + gid +--------------------- + 9223372036854775805 + 9223372036854775806 + 9223372036854775807 +(3 rows) + +SELECT * FROM mytable_gid_seq; + last_value | log_cnt | is_called +---------------------+---------+----------- + 9223372036854775807 | 0 | t +(1 row) + +SELECT seqrelid::regclass, seqtypid::regtype, seqstart, seqincrement, seqmax, seqmin, seqcache, seqcycle FROM pg_sequence WHERE seqrelid='mytable_gid_seq'::regclass; + seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle +-----------------+----------+----------+--------------+---------------------+--------+----------+---------- + mytable_gid_seq | bigint | 1 | 1 | 9223372036854775807 | 1 | 1 | f +(1 row) + +CREATE TABLE out_of_range_insert (size INTEGER, gid serial NOT NULL); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'size' as the Cloudberry Database 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. +ALTER SEQUENCE out_of_range_insert_gid_seq RESTART WITH 2147483646; +INSERT INTO out_of_range_insert VALUES (1), (2), (3); +ERROR: nextval: reached maximum value of sequence "out_of_range_insert_gid_seq" (2147483647) +SELECT * FROM out_of_range_insert ORDER BY gid; + size | gid +------+----- +(0 rows) + +SELECT * FROM out_of_range_insert_gid_seq; + last_value | log_cnt | is_called +------------+---------+----------- + 2147483647 | 0 | t +(1 row) + +SELECT seqrelid::regclass, seqtypid::regtype, seqstart, seqincrement, seqmax, seqmin, seqcache, seqcycle FROM pg_sequence WHERE seqrelid='out_of_range_insert_gid_seq'::regclass; + seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle +-----------------------------+----------+----------+--------------+------------+--------+----------+---------- + out_of_range_insert_gid_seq | integer | 1 | 1 | 2147483647 | 1 | 1 | f +(1 row) + +CREATE SEQUENCE descending_sequence INCREMENT -1 MINVALUE 1 MAXVALUE 9223372036854775806 START 9223372036854775806 CACHE 1; +SELECT nextval('descending_sequence'); + nextval +--------------------- + 9223372036854775806 +(1 row) + +CREATE TABLE descending_sequence_insert(a bigint, b bigint); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO descending_sequence_insert SELECT i, nextval('descending_sequence') FROM generate_series(1, 10)i; +SELECT * FROM descending_sequence_insert ORDER BY b DESC; + a | b +----+--------------------- + 1 | 9223372036854775805 + 2 | 9223372036854775804 + 3 | 9223372036854775803 + 4 | 9223372036854775802 + 5 | 9223372036854775801 + 6 | 9223372036854775800 + 7 | 9223372036854775799 + 8 | 9223372036854775798 + 9 | 9223372036854775797 + 10 | 9223372036854775796 +(10 rows) + +SELECT * FROM descending_sequence; + last_value | log_cnt | is_called +---------------------+---------+----------- + 9223372036854775796 | 22 | t +(1 row) + +SELECT seqrelid::regclass, seqtypid::regtype, seqstart, seqincrement, seqmax, seqmin, seqcache, seqcycle FROM pg_sequence WHERE seqrelid='descending_sequence'::regclass; + seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle +---------------------+----------+---------------------+--------------+---------------------+--------+----------+---------- + descending_sequence | bigint | 9223372036854775806 | -1 | 9223372036854775806 | 1 | 1 | f +(1 row) + +-- start_ignore +-- Test that we don't produce duplicate sequence values +DROP SEQUENCE IF EXISTS check_no_duplicates; +NOTICE: sequence "check_no_duplicates" does not exist, skipping +CREATE SEQUENCE check_no_duplicates; +SELECT nextval('check_no_duplicates') FROM gp_dist_random('gp_id'); + nextval +--------- + 1 + 21 + 41 +(3 rows) + +SELECT nextval('check_no_duplicates'); + nextval +--------- + 61 +(1 row) + +SELECT nextval('check_no_duplicates') FROM gp_dist_random('gp_id'); + nextval +--------- + 2 + 22 + 42 +(3 rows) +-- end_ignore \ No newline at end of file diff --git a/src/test/singlenode_regress/expected/spgist.out b/src/test/singlenode_regress/expected/spgist.out new file mode 100644 index 00000000000..1688e0e0a32 --- /dev/null +++ b/src/test/singlenode_regress/expected/spgist.out @@ -0,0 +1,88 @@ +-- +-- Test SP-GiST indexes. +-- +-- There are other tests to test different SP-GiST opclasses. This is for +-- testing SP-GiST code itself. +create table spgist_point_tbl(id int4, p point); +create index spgist_point_idx on spgist_point_tbl using spgist(p) with (fillfactor = 75); +-- Test vacuum-root operation. It gets invoked when the root is also a leaf, +-- i.e. the index is very small. +insert into spgist_point_tbl (id, p) +select g, point(g*10, g*10) from generate_series(1, 10) g; +delete from spgist_point_tbl where id < 5; +vacuum spgist_point_tbl; +-- Insert more data, to make the index a few levels deep. +insert into spgist_point_tbl (id, p) +select g, point(g*10, g*10) from generate_series(1, 10000) g; +insert into spgist_point_tbl (id, p) +select g+100000, point(g*10+1, g*10+1) from generate_series(1, 10000) g; +-- To test vacuum, delete some entries from all over the index. +delete from spgist_point_tbl where id % 2 = 1; +-- And also delete some concentration of values. (SP-GiST doesn't currently +-- attempt to delete pages even when they become empty, but if it did, this +-- would exercise it) +delete from spgist_point_tbl where id < 10000; +vacuum spgist_point_tbl; +-- Test rescan paths (cf. bug #15378) +-- use box and && rather than point, so that rescan happens when the +-- traverse stack is non-empty +create table spgist_box_tbl(id serial, b box); +insert into spgist_box_tbl(b) +select box(point(i,j),point(i+s,j+s)) + from generate_series(1,100,5) i, + generate_series(1,100,5) j, + generate_series(1,10) s; +create index spgist_box_idx on spgist_box_tbl using spgist (b); +select count(*) + from (values (point(5,5)),(point(8,8)),(point(12,12))) v(p) + where exists(select * from spgist_box_tbl b where b.b && box(v.p,v.p)); + count +------- + 3 +(1 row) + +-- The point opclass's choose method only uses the spgMatchNode action, +-- so the other actions are not tested by the above. Create an index using +-- text opclass, which uses the others actions. +create table spgist_text_tbl(id int4, t text); +create index spgist_text_idx on spgist_text_tbl using spgist(t); +insert into spgist_text_tbl (id, t) +select g, 'f' || repeat('o', 100) || g from generate_series(1, 10000) g +union all +select g, 'baaaaaaaaaaaaaar' || g from generate_series(1, 1000) g; +-- Do a lot of insertions that have to split an existing node. Hopefully +-- one of these will cause the page to run out of space, causing the inner +-- tuple to be moved to another page. +insert into spgist_text_tbl (id, t) +select -g, 'f' || repeat('o', 100-g) || 'surprise' from generate_series(1, 100) g; +-- Test out-of-range fillfactor values +create index spgist_point_idx2 on spgist_point_tbl using spgist(p) with (fillfactor = 9); +ERROR: value 9 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +create index spgist_point_idx2 on spgist_point_tbl using spgist(p) with (fillfactor = 101); +ERROR: value 101 out of bounds for option "fillfactor" +DETAIL: Valid values are between "10" and "100". +-- Modify fillfactor in existing index +alter index spgist_point_idx set (fillfactor = 90); +reindex index spgist_point_idx; +-- Test index over a domain +create domain spgist_text as varchar; +create table spgist_domain_tbl (f1 spgist_text); +create index spgist_domain_idx on spgist_domain_tbl using spgist(f1); +insert into spgist_domain_tbl values('fee'), ('fi'), ('fo'), ('fum'); +explain (costs off) +select * from spgist_domain_tbl where f1 = 'fo'; + QUERY PLAN +----------------------------------------------- + Bitmap Heap Scan on spgist_domain_tbl + Recheck Cond: ((f1)::text = 'fo'::text) + -> Bitmap Index Scan on spgist_domain_idx + Index Cond: ((f1)::text = 'fo'::text) +(4 rows) + +select * from spgist_domain_tbl where f1 = 'fo'; + f1 +---- + fo +(1 row) + diff --git a/src/test/singlenode_regress/expected/stats.out b/src/test/singlenode_regress/expected/stats.out new file mode 100644 index 00000000000..dfce61628cf --- /dev/null +++ b/src/test/singlenode_regress/expected/stats.out @@ -0,0 +1,229 @@ +-- +-- Test Statistics Collector +-- +-- Must be run after tenk2 has been created (by create_table), +-- populated (by create_misc) and indexed (by create_index). +-- +-- conditio sine qua non +SHOW track_counts; -- must be on + track_counts +-------------- + on +(1 row) + +-- ensure that both seqscan and indexscan plans are allowed +SET enable_seqscan TO on; +SET enable_indexscan TO on; +-- for the moment, we don't want index-only scans here +SET enable_indexonlyscan TO off; +-- save counters +CREATE TABLE prevstats AS +SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, + (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, + (b.idx_blks_read + b.idx_blks_hit) AS idx_blks, + pg_stat_get_snapshot_timestamp() as snap_ts + FROM pg_catalog.pg_stat_user_tables_single_node AS t, + pg_catalog.pg_statio_user_tables AS b + WHERE t.relname='tenk2' AND b.relname='tenk2'; +-- function to wait for counters to advance +create function wait_for_stats() returns void as $$ +declare + start_time timestamptz := clock_timestamp(); + updated1 bool; + updated2 bool; + updated3 bool; + updated4 bool; + updated5 bool; +begin + -- we don't want to wait forever; loop will exit after 30 seconds + for i in 1 .. 300 loop + + -- With parallel query, the seqscan and indexscan on tenk2 might be done + -- in parallel worker processes, which will send their stats counters + -- asynchronously to what our own session does. So we must check for + -- those counts to be registered separately from the update counts. + + -- check to see if seqscan has been sensed + SELECT (st.seq_scan >= pr.seq_scan + 1) INTO updated1 + FROM pg_stat_user_tables_single_node AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + + -- check to see if indexscan has been sensed + SELECT (st.idx_scan >= pr.idx_scan + 1) INTO updated2 + FROM pg_stat_user_tables_single_node AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + + -- check to see if all updates have been sensed + SELECT (n_tup_ins > 0) INTO updated3 + FROM pg_stat_user_tables_single_node WHERE relname='trunc_stats_test4'; + + -- We must also check explicitly that pg_stat_get_snapshot_timestamp has + -- advanced, because that comes from the global stats file which might + -- be older than the per-DB stats file we got the other values from. + SELECT (pr.snap_ts < pg_stat_get_snapshot_timestamp()) INTO updated4 + FROM prevstats AS pr; + + -- check to see if idx_tup_fetch has been sensed + SELECT (st.idx_tup_fetch >= pr.idx_tup_fetch + 1) INTO updated5 + FROM pg_stat_user_tables_single_node AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + + exit when updated1 and updated2 and updated3 and updated4 and updated5; + + -- wait a little + perform pg_sleep_for('100 milliseconds'); + + -- reset stats snapshot so we can test again + perform pg_stat_clear_snapshot(); + + end loop; + + -- report time waited in postmaster log (where it won't change test output) + raise log 'wait_for_stats delayed % seconds', + extract(epoch from clock_timestamp() - start_time); +end +$$ language plpgsql; +-- test effects of TRUNCATE on n_live_tup/n_dead_tup counters +CREATE TABLE trunc_stats_test(id serial); +CREATE TABLE trunc_stats_test1(id serial, stuff text); +CREATE TABLE trunc_stats_test2(id serial); +CREATE TABLE trunc_stats_test3(id serial, stuff text); +CREATE TABLE trunc_stats_test4(id serial); +-- check that n_live_tup is reset to 0 after truncate +INSERT INTO trunc_stats_test DEFAULT VALUES; +INSERT INTO trunc_stats_test DEFAULT VALUES; +INSERT INTO trunc_stats_test DEFAULT VALUES; +TRUNCATE trunc_stats_test; +-- test involving a truncate in a transaction; 4 ins but only 1 live +INSERT INTO trunc_stats_test1 DEFAULT VALUES; +INSERT INTO trunc_stats_test1 DEFAULT VALUES; +INSERT INTO trunc_stats_test1 DEFAULT VALUES; +UPDATE trunc_stats_test1 SET id = id + 10 WHERE id IN (1, 2); +DELETE FROM trunc_stats_test1 WHERE id = 3; +BEGIN; +UPDATE trunc_stats_test1 SET id = id + 100; +TRUNCATE trunc_stats_test1; +INSERT INTO trunc_stats_test1 DEFAULT VALUES; +COMMIT; +-- use a savepoint: 1 insert, 1 live +BEGIN; +INSERT INTO trunc_stats_test2 DEFAULT VALUES; +INSERT INTO trunc_stats_test2 DEFAULT VALUES; +SAVEPOINT p1; +INSERT INTO trunc_stats_test2 DEFAULT VALUES; +TRUNCATE trunc_stats_test2; +INSERT INTO trunc_stats_test2 DEFAULT VALUES; +RELEASE SAVEPOINT p1; +COMMIT; +-- rollback a savepoint: this should count 4 inserts and have 2 +-- live tuples after commit (and 2 dead ones due to aborted subxact) +BEGIN; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +SAVEPOINT p1; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +TRUNCATE trunc_stats_test3; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +ROLLBACK TO SAVEPOINT p1; +COMMIT; +-- rollback a truncate: this should count 2 inserts and produce 2 dead tuples +BEGIN; +INSERT INTO trunc_stats_test4 DEFAULT VALUES; +INSERT INTO trunc_stats_test4 DEFAULT VALUES; +TRUNCATE trunc_stats_test4; +INSERT INTO trunc_stats_test4 DEFAULT VALUES; +ROLLBACK; +-- do a seqscan +SELECT count(*) FROM tenk2; + count +------- + 10000 +(1 row) + +-- do an indexscan +-- make sure it is not a bitmap scan, which might skip fetching heap tuples +SET enable_bitmapscan TO off; +-- for orca, we don't want index-only scans here, +-- which might skip fetching heap tuples. +SET optimizer_enable_indexonlyscan TO off; +SELECT count(*) FROM tenk2 WHERE unique1 = 1; + count +------- + 1 +(1 row) + +RESET optimizer_enable_indexonlyscan; +SELECT * FROM tenk2 where unique1 = 10; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 10 | 8788 | 0 | 2 | 0 | 10 | 10 | 10 | 10 | 10 | 10 | 20 | 21 | KAAAAA | AANAAA | AAAAxx +(1 row) + +RESET enable_bitmapscan; +-- We can't just call wait_for_stats() at this point, because we only +-- transmit stats when the session goes idle, and we probably didn't +-- transmit the last couple of counts yet thanks to the rate-limiting logic +-- in pgstat_report_stat(). But instead of waiting for the rate limiter's +-- timeout to elapse, let's just start a new session. The old one will +-- then send its stats before dying. +\c - +-- wait for stats collector to update +SELECT wait_for_stats(); + wait_for_stats +---------------- + +(1 row) + +-- check effects +SELECT relname, n_tup_ins, n_tup_upd, n_tup_del, n_live_tup, n_dead_tup + FROM pg_stat_user_tables_single_node + WHERE relname like 'trunc_stats_test%' order by relname; + relname | n_tup_ins | n_tup_upd | n_tup_del | n_live_tup | n_dead_tup +-------------------+-----------+-----------+-----------+------------+------------ + trunc_stats_test | 3 | 0 | 0 | 0 | 0 + trunc_stats_test1 | 4 | 2 | 1 | 1 | 0 + trunc_stats_test2 | 1 | 0 | 0 | 1 | 0 + trunc_stats_test3 | 4 | 0 | 0 | 2 | 2 + trunc_stats_test4 | 2 | 0 | 0 | 0 | 2 +(5 rows) + +SELECT st.seq_scan >= pr.seq_scan + 1, + st.seq_tup_read >= pr.seq_tup_read + cl.reltuples, + st.idx_scan >= pr.idx_scan + 1, + st.idx_tup_fetch >= pr.idx_tup_fetch + 1 + FROM pg_stat_user_tables_single_node AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + ?column? | ?column? | ?column? | ?column? +----------+----------+----------+---------- + t | t | t | t +(1 row) + +-- GPDB_13_MERGE_FIXME: Some statistics are handled by stat collector process on each segment but not sent to master. +-- To keep this case, collect statistics from all segments. +-- lack of the second column case, see https://github.com/my-ship-it/database-core-upgrade/issues/151 +SELECT (SELECT sum(st.heap_blks_read) + sum(st.heap_blks_hit) - sum(pr.heap_blks) + FROM gp_dist_random('pg_statio_user_tables') AS st, gp_dist_random('prevstats') AS pr WHERE st.relname='tenk2') + > (select relpages from pg_class where relname='tenk2'); + ?column? +---------- + t +(1 row) + +SELECT pr.snap_ts < pg_stat_get_snapshot_timestamp() as snapshot_newer +FROM prevstats AS pr; + snapshot_newer +---------------- + t +(1 row) + +DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; +DROP TABLE prevstats; +-- ensure that stats accessors handle NULL input correctly +SELECT pg_stat_get_replication_slot(NULL); + pg_stat_get_replication_slot +------------------------------ + +(1 row) + +-- End of Stats Test diff --git a/src/test/singlenode_regress/expected/stats_ext.out b/src/test/singlenode_regress/expected/stats_ext.out new file mode 100644 index 00000000000..5c65ad44446 --- /dev/null +++ b/src/test/singlenode_regress/expected/stats_ext.out @@ -0,0 +1,3229 @@ +-- Generic extended statistics support +-- +-- Note: tables for which we check estimated row counts should be created +-- with autovacuum_enabled = off, so that we don't have unstable results +-- from auto-analyze happening when we didn't expect it. +-- +-- check the number of estimated/actual rows in the top node +create function check_estimated_rows(text) returns table (estimated int, actual int) +language plpgsql as +$$ +declare + ln text; + tmp text[]; + first_row bool := true; +begin + for ln in + execute format('explain analyze %s', $1) + loop + if first_row then + first_row := false; + tmp := regexp_match(ln, 'rows=(\d*) .* rows=(\d*)'); + return query select tmp[1]::int, tmp[2]::int; + end if; + end loop; +end; +$$; +-- Verify failures +CREATE TABLE ext_stats_test (x text, y int, z int); +CREATE STATISTICS tst; +ERROR: syntax error at or near ";" +LINE 1: CREATE STATISTICS tst; + ^ +CREATE STATISTICS tst ON a, b; +ERROR: syntax error at or near ";" +LINE 1: CREATE STATISTICS tst ON a, b; + ^ +CREATE STATISTICS tst FROM sometab; +ERROR: syntax error at or near "FROM" +LINE 1: CREATE STATISTICS tst FROM sometab; + ^ +CREATE STATISTICS tst ON a, b FROM nonexistent; +ERROR: relation "nonexistent" does not exist +CREATE STATISTICS tst ON a, b FROM ext_stats_test; +ERROR: column "a" does not exist +CREATE STATISTICS tst ON x, x, y FROM ext_stats_test; +ERROR: duplicate column name in statistics definition +CREATE STATISTICS tst ON x, x, y, x, x, y, x, x, y FROM ext_stats_test; +ERROR: cannot have more than 8 columns in statistics +CREATE STATISTICS tst ON x, x, y, x, x, (x || 'x'), (y + 1), (x || 'x'), (x || 'x'), (y + 1) FROM ext_stats_test; +ERROR: cannot have more than 8 columns in statistics +CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), (y + 1), (x || 'x'), (x || 'x'), (y + 1), (x || 'x'), (x || 'x'), (y + 1) FROM ext_stats_test; +ERROR: cannot have more than 8 columns in statistics +CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), y FROM ext_stats_test; +ERROR: duplicate expression in statistics definition +CREATE STATISTICS tst (unrecognized) ON x, y FROM ext_stats_test; +ERROR: unrecognized statistics kind "unrecognized" +-- incorrect expressions +CREATE STATISTICS tst ON (y) FROM ext_stats_test; -- single column reference +ERROR: extended statistics require at least 2 columns +CREATE STATISTICS tst ON y + z FROM ext_stats_test; -- missing parentheses +ERROR: syntax error at or near "+" +LINE 1: CREATE STATISTICS tst ON y + z FROM ext_stats_test; + ^ +CREATE STATISTICS tst ON (x, y) FROM ext_stats_test; -- tuple expression +ERROR: syntax error at or near "," +LINE 1: CREATE STATISTICS tst ON (x, y) FROM ext_stats_test; + ^ +DROP TABLE ext_stats_test; +-- Ensure stats are dropped sanely, and test IF NOT EXISTS while at it +CREATE TABLE ab1 (a INTEGER, b INTEGER, c INTEGER); +CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1; +COMMENT ON STATISTICS ab1_a_b_stats IS 'new comment'; +CREATE ROLE regress_stats_ext; +SET SESSION AUTHORIZATION regress_stats_ext; +COMMENT ON STATISTICS ab1_a_b_stats IS 'changed comment'; +ERROR: must be owner of statistics object ab1_a_b_stats +DROP STATISTICS ab1_a_b_stats; +ERROR: must be owner of statistics object ab1_a_b_stats +ALTER STATISTICS ab1_a_b_stats RENAME TO ab1_a_b_stats_new; +ERROR: must be owner of statistics object ab1_a_b_stats +RESET SESSION AUTHORIZATION; +DROP ROLE regress_stats_ext; +CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1; +NOTICE: statistics object "ab1_a_b_stats" already exists, skipping +DROP STATISTICS ab1_a_b_stats; +CREATE SCHEMA regress_schema_2; +CREATE STATISTICS regress_schema_2.ab1_a_b_stats ON a, b FROM ab1; +-- Let's also verify the pg_get_statisticsobjdef output looks sane. +SELECT pg_get_statisticsobjdef(oid) FROM pg_statistic_ext WHERE stxname = 'ab1_a_b_stats'; + pg_get_statisticsobjdef +------------------------------------------------------------------- + CREATE STATISTICS regress_schema_2.ab1_a_b_stats ON a, b FROM ab1 +(1 row) + +DROP STATISTICS regress_schema_2.ab1_a_b_stats; +-- Ensure statistics are dropped when columns are +CREATE STATISTICS ab1_b_c_stats ON b, c FROM ab1; +CREATE STATISTICS ab1_a_b_c_stats ON a, b, c FROM ab1; +CREATE STATISTICS ab1_b_a_stats ON b, a FROM ab1; +ALTER TABLE ab1 DROP COLUMN a; +\d ab1 + Table "public.ab1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + b | integer | | | + c | integer | | | +Statistics objects: + "public.ab1_b_c_stats" ON b, c FROM ab1 + +-- Ensure statistics are dropped when table is +SELECT stxname FROM pg_statistic_ext WHERE stxname LIKE 'ab1%'; + stxname +--------------- + ab1_b_c_stats +(1 row) + +DROP TABLE ab1; +SELECT stxname FROM pg_statistic_ext WHERE stxname LIKE 'ab1%'; + stxname +--------- +(0 rows) + +-- Ensure things work sanely with SET STATISTICS 0 +CREATE TABLE ab1 (a INTEGER, b INTEGER); +ALTER TABLE ab1 ALTER a SET STATISTICS 0; +INSERT INTO ab1 SELECT a, a%23 FROM generate_series(1, 1000) a; +CREATE STATISTICS ab1_a_b_stats ON a, b FROM ab1; +ANALYZE ab1; +WARNING: statistics object "public.ab1_a_b_stats" could not be computed for relation "public.ab1" +ALTER TABLE ab1 ALTER a SET STATISTICS -1; +-- setting statistics target 0 skips the statistics, without printing any message, so check catalog +ALTER STATISTICS ab1_a_b_stats SET STATISTICS 0; +\d ab1 + Table "public.ab1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Statistics objects: + "public.ab1_a_b_stats" ON a, b FROM ab1; STATISTICS 0 + +ANALYZE ab1; +SELECT stxname, stxdndistinct, stxddependencies, stxdmcv + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxname = 'ab1_a_b_stats' + AND d.stxoid = s.oid; + stxname | stxdndistinct | stxddependencies | stxdmcv +---------------+---------------+------------------+--------- + ab1_a_b_stats | | | +(1 row) + +ALTER STATISTICS ab1_a_b_stats SET STATISTICS -1; +\d+ ab1 + Table "public.ab1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | + b | integer | | | | plain | | +Statistics objects: + "public.ab1_a_b_stats" ON a, b FROM ab1 + +-- partial analyze doesn't build stats either +ANALYZE ab1 (a); +WARNING: statistics object "public.ab1_a_b_stats" could not be computed for relation "public.ab1" +ANALYZE ab1; +DROP TABLE ab1; +ALTER STATISTICS ab1_a_b_stats SET STATISTICS 0; +ERROR: statistics object "ab1_a_b_stats" does not exist +ALTER STATISTICS IF EXISTS ab1_a_b_stats SET STATISTICS 0; +NOTICE: statistics object "ab1_a_b_stats" does not exist, skipping +-- Ensure we can build statistics for tables with inheritance. +CREATE TABLE ab1 (a INTEGER, b INTEGER); +CREATE TABLE ab1c () INHERITS (ab1); +INSERT INTO ab1 VALUES (1,1); +CREATE STATISTICS ab1_a_b_stats ON a, b FROM ab1; +ANALYZE ab1; +DROP TABLE ab1 CASCADE; +NOTICE: drop cascades to table ab1c +-- Tests for stats with inheritance +CREATE TABLE stxdinh(a int, b int); +CREATE TABLE stxdinh1() INHERITS(stxdinh); +CREATE TABLE stxdinh2() INHERITS(stxdinh); +INSERT INTO stxdinh SELECT mod(a,50), mod(a,100) FROM generate_series(0, 1999) a; +INSERT INTO stxdinh1 SELECT mod(a,100), mod(a,100) FROM generate_series(0, 999) a; +INSERT INTO stxdinh2 SELECT mod(a,100), mod(a,100) FROM generate_series(0, 999) a; +VACUUM ANALYZE stxdinh, stxdinh1, stxdinh2; +-- Ensure non-inherited stats are not applied to inherited query +-- Without stats object, it looks like this +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* GROUP BY 1, 2'); + estimated | actual +-----------+-------- + 400 | 150 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* WHERE a = 0 AND b = 0'); + estimated | actual +-----------+-------- + 5 | 40 +(1 row) + +CREATE STATISTICS stxdinh ON a, b FROM stxdinh; +VACUUM ANALYZE stxdinh, stxdinh1, stxdinh2; +-- Since the stats object does not include inherited stats, it should not +-- affect the estimates +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* GROUP BY 1, 2'); + estimated | actual +-----------+-------- + 400 | 150 +(1 row) + +-- Dependencies are applied at individual relations (within append), so +-- this estimate changes a bit because we improve estimates for the parent +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* WHERE a = 0 AND b = 0'); + estimated | actual +-----------+-------- + 22 | 40 +(1 row) + +DROP TABLE stxdinh, stxdinh1, stxdinh2; +-- Ensure inherited stats ARE applied to inherited query in partitioned table +CREATE TABLE stxdinp(i int, a int, b int) PARTITION BY RANGE (i); +CREATE TABLE stxdinp1 PARTITION OF stxdinp FOR VALUES FROM (1) TO (100); +INSERT INTO stxdinp SELECT 1, a/100, a/100 FROM generate_series(1, 999) a; +CREATE STATISTICS stxdinp ON a, b FROM stxdinp; +VACUUM ANALYZE stxdinp; -- partitions are processed recursively +SELECT 1 FROM pg_statistic_ext WHERE stxrelid = 'stxdinp'::regclass; + ?column? +---------- + 1 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinp GROUP BY 1, 2'); + estimated | actual +-----------+-------- + 1 | 10 +(1 row) + +DROP TABLE stxdinp; +-- basic test for statistics on expressions +CREATE TABLE ab1 (a INTEGER, b INTEGER, c TIMESTAMP, d TIMESTAMPTZ); +-- expression stats may be built on a single expression column +CREATE STATISTICS ab1_exprstat_1 ON (a+b) FROM ab1; +-- with a single expression, we only enable expression statistics +CREATE STATISTICS ab1_exprstat_2 ON (a+b) FROM ab1; +SELECT stxkind FROM pg_statistic_ext WHERE stxname = 'ab1_exprstat_2'; + stxkind +--------- + {e} +(1 row) + +-- adding anything to the expression builds all statistics kinds +CREATE STATISTICS ab1_exprstat_3 ON (a+b), a FROM ab1; +SELECT stxkind FROM pg_statistic_ext WHERE stxname = 'ab1_exprstat_3'; + stxkind +----------- + {d,f,m,e} +(1 row) + +-- date_trunc on timestamptz is not immutable, but that should not matter +CREATE STATISTICS ab1_exprstat_4 ON date_trunc('day', d) FROM ab1; +-- date_trunc on timestamp is immutable +CREATE STATISTICS ab1_exprstat_5 ON date_trunc('day', c) FROM ab1; +-- insert some data and run analyze, to test that these cases build properly +INSERT INTO ab1 +SELECT + generate_series(1,10), + generate_series(1,10), + generate_series('2020-10-01'::timestamp, '2020-10-10'::timestamp, interval '1 day'), + generate_series('2020-10-01'::timestamptz, '2020-10-10'::timestamptz, interval '1 day'); +ANALYZE ab1; +DROP TABLE ab1; +-- Verify supported object types for extended statistics +CREATE schema tststats; +CREATE TABLE tststats.t (a int, b int, c text); +CREATE INDEX ti ON tststats.t (a, b); +CREATE SEQUENCE tststats.s; +CREATE VIEW tststats.v AS SELECT * FROM tststats.t; +CREATE MATERIALIZED VIEW tststats.mv AS SELECT * FROM tststats.t; +CREATE TYPE tststats.ty AS (a int, b int, c text); +CREATE FOREIGN DATA WRAPPER extstats_dummy_fdw; +CREATE SERVER extstats_dummy_srv FOREIGN DATA WRAPPER extstats_dummy_fdw; +CREATE FOREIGN TABLE tststats.f (a int, b int, c text) SERVER extstats_dummy_srv; +CREATE TABLE tststats.pt (a int, b int, c text) PARTITION BY RANGE (a, b); +CREATE TABLE tststats.pt1 PARTITION OF tststats.pt FOR VALUES FROM (-10, -10) TO (10, 10); +CREATE STATISTICS tststats.s1 ON a, b FROM tststats.t; +CREATE STATISTICS tststats.s2 ON a, b FROM tststats.ti; +ERROR: relation "ti" is not a table, foreign table, or materialized view +CREATE STATISTICS tststats.s3 ON a, b FROM tststats.s; +ERROR: relation "s" is not a table, foreign table, or materialized view +CREATE STATISTICS tststats.s4 ON a, b FROM tststats.v; +ERROR: relation "v" is not a table, foreign table, or materialized view +CREATE STATISTICS tststats.s5 ON a, b FROM tststats.mv; +CREATE STATISTICS tststats.s6 ON a, b FROM tststats.ty; +ERROR: relation "ty" is not a table, foreign table, or materialized view +CREATE STATISTICS tststats.s7 ON a, b FROM tststats.f; +CREATE STATISTICS tststats.s8 ON a, b FROM tststats.pt; +CREATE STATISTICS tststats.s9 ON a, b FROM tststats.pt1; +DO $$ +DECLARE + relname text := reltoastrelid::regclass FROM pg_class WHERE oid = 'tststats.t'::regclass; +BEGIN + EXECUTE 'CREATE STATISTICS tststats.s10 ON a, b FROM ' || relname; +EXCEPTION WHEN wrong_object_type THEN + RAISE NOTICE 'stats on toast table not created'; +END; +$$; +NOTICE: stats on toast table not created +DROP SCHEMA tststats CASCADE; +NOTICE: drop cascades to 7 other objects +DETAIL: drop cascades to table tststats.t +drop cascades to sequence tststats.s +drop cascades to view tststats.v +drop cascades to materialized view tststats.mv +drop cascades to type tststats.ty +drop cascades to foreign table tststats.f +drop cascades to table tststats.pt +DROP FOREIGN DATA WRAPPER extstats_dummy_fdw CASCADE; +NOTICE: drop cascades to server extstats_dummy_srv +-- n-distinct tests +CREATE TABLE ndistinct ( + filler1 TEXT, + filler2 NUMERIC, + a INT, + b INT, + filler3 DATE, + c INT, + d INT +) +WITH (autovacuum_enabled = off); +-- over-estimates when using only per-column statistics +INSERT INTO ndistinct (a, b, c, filler1) + SELECT i/100, i/100, i/100, cash_words((i/100)::money) + FROM generate_series(1,1000) s(i); +ANALYZE ndistinct; +-- Group Aggregate, due to over-estimate of the number of groups +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 100 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c'); + estimated | actual +-----------+-------- + 100 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c'); + estimated | actual +-----------+-------- + 100 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d'); + estimated | actual +-----------+-------- + 1000 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d'); + estimated | actual +-----------+-------- + 1000 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (a+1)'); + estimated | actual +-----------+-------- + 100 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + estimated | actual +-----------+-------- + 100 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + estimated | actual +-----------+-------- + 100 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + estimated | actual +-----------+-------- + 100 | 11 +(1 row) + +-- correct command +CREATE STATISTICS s10 ON a, b, c FROM ndistinct; +ANALYZE ndistinct; +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + stxkind | stxdndistinct +---------+----------------------------------------------------- + {d,f,m} | {"3, 4": 11, "3, 6": 11, "4, 6": 11, "3, 4, 6": 11} +(1 row) + +-- minor improvement, make sure the ctid does not break the matching +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY ctid, a, b'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +-- Hash Aggregate, thanks to estimates improved by the statistic +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 11 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c'); + estimated | actual +-----------+-------- + 11 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c'); + estimated | actual +-----------+-------- + 11 | 11 +(1 row) + +-- partial improvement (match on attributes) +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (a+1)'); + estimated | actual +-----------+-------- + 11 | 11 +(1 row) + +-- expressions - no improvement +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + estimated | actual +-----------+-------- + 11 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + estimated | actual +-----------+-------- + 11 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + estimated | actual +-----------+-------- + 11 | 11 +(1 row) + +-- last two plans keep using Group Aggregate, because 'd' is not covered +-- by the statistic and while it's NULL-only we assume 200 values for it +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d'); + estimated | actual +-----------+-------- + 1000 | 11 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d'); + estimated | actual +-----------+-------- + 1000 | 11 +(1 row) + +TRUNCATE TABLE ndistinct; +-- under-estimates when using only per-column statistics +INSERT INTO ndistinct (a, b, c, filler1) + SELECT mod(i,13), mod(i,17), mod(i,19), + cash_words(mod(i,23)::int::money) + FROM generate_series(1,1000) s(i); +ANALYZE ndistinct; +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + stxkind | stxdndistinct +---------+---------------------------------------------------------- + {d,f,m} | {"3, 4": 221, "3, 6": 247, "4, 6": 323, "3, 4, 6": 1000} +(1 row) + +-- correct estimates +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 221 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d'); + estimated | actual +-----------+-------- + 1000 | 323 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, d'); + estimated | actual +-----------+-------- + 1000 | 13 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (a+1)'); + estimated | actual +-----------+-------- + 221 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + estimated | actual +-----------+-------- + 221 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + estimated | actual +-----------+-------- + 221 | 221 +(1 row) + +DROP STATISTICS s10; +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + stxkind | stxdndistinct +---------+--------------- +(0 rows) + +-- dropping the statistics results in under-estimates +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 100 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c'); + estimated | actual +-----------+-------- + 100 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d'); + estimated | actual +-----------+-------- + 1000 | 323 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, d'); + estimated | actual +-----------+-------- + 1000 | 13 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (a+1)'); + estimated | actual +-----------+-------- + 100 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + estimated | actual +-----------+-------- + 100 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + estimated | actual +-----------+-------- + 100 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + estimated | actual +-----------+-------- + 100 | 221 +(1 row) + +-- ndistinct estimates with statistics on expressions +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + estimated | actual +-----------+-------- + 100 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + estimated | actual +-----------+-------- + 100 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + estimated | actual +-----------+-------- + 100 | 221 +(1 row) + +CREATE STATISTICS s10 (ndistinct) ON (a+1), (b+100), (2*c) FROM ndistinct; +ANALYZE ndistinct; +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + stxkind | stxdndistinct +---------+------------------------------------------------------------------- + {d,e} | {"-1, -2": 221, "-1, -3": 247, "-2, -3": 323, "-1, -2, -3": 1000} +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + estimated | actual +-----------+-------- + 221 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + estimated | actual +-----------+-------- + 221 | 221 +(1 row) + +DROP STATISTICS s10; +-- a mix of attributes and expressions +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 100 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (2*c)'); + estimated | actual +-----------+-------- + 100 | 247 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (2*c)'); + estimated | actual +-----------+-------- + 100 | 1000 +(1 row) + +CREATE STATISTICS s10 (ndistinct) ON a, b, (2*c) FROM ndistinct; +ANALYZE ndistinct; +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + stxkind | stxdndistinct +---------+------------------------------------------------------------- + {d,e} | {"3, 4": 221, "3, -1": 247, "4, -1": 323, "3, 4, -1": 1000} +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 221 | 221 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (2*c)'); + estimated | actual +-----------+-------- + 247 | 247 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (2*c)'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +DROP STATISTICS s10; +-- combination of multiple ndistinct statistics, with/without expressions +TRUNCATE ndistinct; +-- two mostly independent groups of columns +INSERT INTO ndistinct (a, b, c, d) + SELECT mod(i,3), mod(i,9), mod(i,5), mod(i,20) + FROM generate_series(1,1000) s(i); +ANALYZE ndistinct; +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 27 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + estimated | actual +-----------+-------- + 27 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + estimated | actual +-----------+-------- + 27 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + estimated | actual +-----------+-------- + 27 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + estimated | actual +-----------+-------- + 100 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + estimated | actual +-----------+-------- + 100 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + estimated | actual +-----------+-------- + 100 | 180 +(1 row) + +-- basic statistics on both attributes (no expressions) +CREATE STATISTICS s11 (ndistinct) ON a, b FROM ndistinct; +CREATE STATISTICS s12 (ndistinct) ON c, d FROM ndistinct; +ANALYZE ndistinct; +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + estimated | actual +-----------+-------- + 100 | 180 +(1 row) + +-- replace the second statistics by statistics on expressions +DROP STATISTICS s12; +CREATE STATISTICS s12 (ndistinct) ON (c * 10), (d - 1) FROM ndistinct; +ANALYZE ndistinct; +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + estimated | actual +-----------+-------- + 100 | 180 +(1 row) + +-- replace the second statistics by statistics on both attributes and expressions +DROP STATISTICS s12; +CREATE STATISTICS s12 (ndistinct) ON c, d, (c * 10), (d - 1) FROM ndistinct; +ANALYZE ndistinct; +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + estimated | actual +-----------+-------- + 100 | 180 +(1 row) + +-- replace the other statistics by statistics on both attributes and expressions +DROP STATISTICS s11; +CREATE STATISTICS s11 (ndistinct) ON a, b, (a*5), (b+1) FROM ndistinct; +ANALYZE ndistinct; +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + estimated | actual +-----------+-------- + 100 | 180 +(1 row) + +-- replace statistics by somewhat overlapping ones (this expected to get worse estimate +-- because the first statistics shall be applied to 3 columns, and the second one can't +-- be really applied) +DROP STATISTICS s11; +DROP STATISTICS s12; +CREATE STATISTICS s11 (ndistinct) ON a, b, (a*5), (b+1) FROM ndistinct; +CREATE STATISTICS s12 (ndistinct) ON a, (b+1), (c * 10) FROM ndistinct; +ANALYZE ndistinct; +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + estimated | actual +-----------+-------- + 9 | 9 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + estimated | actual +-----------+-------- + 45 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + estimated | actual +-----------+-------- + 100 | 45 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + estimated | actual +-----------+-------- + 100 | 180 +(1 row) + +DROP STATISTICS s11; +DROP STATISTICS s12; +-- functional dependencies tests +CREATE TABLE functional_dependencies ( + filler1 TEXT, + filler2 NUMERIC, + a INT, + b TEXT, + filler3 DATE, + c INT, + d TEXT +) +WITH (autovacuum_enabled = off); +CREATE INDEX fdeps_ab_idx ON functional_dependencies (a, b); +CREATE INDEX fdeps_abc_idx ON functional_dependencies (a, b, c); +-- random data (no functional dependencies) +INSERT INTO functional_dependencies (a, b, c, filler1) + SELECT mod(i, 5), mod(i, 7), mod(i, 11), i FROM generate_series(1,1000) s(i); +ANALYZE functional_dependencies; +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 64 | 29 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 20 | 3 +(1 row) + +-- create statistics +CREATE STATISTICS func_deps_stat (dependencies) ON a, b, c FROM functional_dependencies; +ANALYZE functional_dependencies; +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 64 | 29 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 20 | 3 +(1 row) + +-- a => b, a => c, b => c +TRUNCATE functional_dependencies; +DROP STATISTICS func_deps_stat; +-- now do the same thing, but with expressions +INSERT INTO functional_dependencies (a, b, c, filler1) + SELECT i, i, i, i FROM generate_series(1,5000) s(i); +ANALYZE functional_dependencies; +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE mod(a, 11) = 1 AND mod(b::int, 13) = 1'); + estimated | actual +-----------+-------- + 1 | 35 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE mod(a, 11) = 1 AND mod(b::int, 13) = 1 AND mod(c, 7) = 1'); + estimated | actual +-----------+-------- + 1 | 5 +(1 row) + +-- create statistics +CREATE STATISTICS func_deps_stat (dependencies) ON (mod(a,11)), (mod(b::int, 13)), (mod(c, 7)) FROM functional_dependencies; +ANALYZE functional_dependencies; +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE mod(a, 11) = 1 AND mod(b::int, 13) = 1'); + estimated | actual +-----------+-------- + 116 | 35 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE mod(a, 11) = 1 AND mod(b::int, 13) = 1 AND mod(c, 7) = 1'); + estimated | actual +-----------+-------- + 61 | 5 +(1 row) + +-- a => b, a => c, b => c +TRUNCATE functional_dependencies; +DROP STATISTICS func_deps_stat; +INSERT INTO functional_dependencies (a, b, c, filler1) + SELECT mod(i,100), mod(i,50), mod(i,25), i FROM generate_series(1,5000) s(i); +ANALYZE functional_dependencies; +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 2 | 50 +(1 row) + +-- IN +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ''1'''); + estimated | actual +-----------+-------- + 14 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b IN (''1'', ''2'')'); + estimated | actual +-----------+-------- + 20 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b IN (''1'', ''2'')'); + estimated | actual +-----------+-------- + 40 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ''1'''); + estimated | actual +-----------+-------- + 20 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c = 1'); + estimated | actual +-----------+-------- + 14 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c IN (1)'); + estimated | actual +-----------+-------- + 14 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 26, 27, 51, 52, 76, 77) AND b IN (''1'', ''2'', ''26'', ''27'') AND c IN (1, 2)'); + estimated | actual +-----------+-------- + 49 | 400 +(1 row) + +-- OR clauses referencing the same attribute +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 51) AND b = ''1'''); + estimated | actual +-----------+-------- + 14 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 51) AND (b = ''1'' OR b = ''2'')'); + estimated | actual +-----------+-------- + 20 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 2 OR a = 51 OR a = 52) AND (b = ''1'' OR b = ''2'')'); + estimated | actual +-----------+-------- + 39 | 200 +(1 row) + +-- OR clauses referencing different attributes +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR b = ''1'') AND b = ''1'''); + estimated | actual +-----------+-------- + 17 | 100 +(1 row) + +-- ANY +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ''1'''); + estimated | actual +-----------+-------- + 14 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 20 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 40 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = 1'); + estimated | actual +-----------+-------- + 14 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = ANY (ARRAY[1])'); + estimated | actual +-----------+-------- + 14 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 26, 27, 51, 52, 76, 77]) AND b = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND c = ANY (ARRAY[1, 2])'); + estimated | actual +-----------+-------- + 49 | 400 +(1 row) + +-- ANY with inequalities should not benefit from functional dependencies +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a < ANY (ARRAY[1, 51]) AND b > ''1'''); + estimated | actual +-----------+-------- + 2522 | 2400 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a >= ANY (ARRAY[1, 51]) AND b <= ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 1444 | 1250 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a <= ANY (ARRAY[1, 2, 51, 52]) AND b >= ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 3918 | 2550 +(1 row) + +-- ALL (should not benefit from functional dependencies) +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1''])'); + estimated | actual +-----------+-------- + 14 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 0 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ALL (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 0 | 0 +(1 row) + +-- create statistics +CREATE STATISTICS func_deps_stat (dependencies) ON a, b, c FROM functional_dependencies; +ANALYZE functional_dependencies; +-- print the detected dependencies +SELECT dependencies FROM pg_stats_ext WHERE statistics_name = 'func_deps_stat'; + dependencies +------------------------------------------------------------------------------------------------------------ + {"3 => 4": 1.000000, "3 => 6": 1.000000, "4 => 6": 1.000000, "3, 4 => 6": 1.000000, "3, 6 => 4": 1.000000} +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +-- IN +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ''1'''); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b IN (''1'', ''2'')'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b IN (''1'', ''2'')'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ''1'''); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c = 1'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c IN (1)'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 26, 27, 51, 52, 76, 77) AND b IN (''1'', ''2'', ''26'', ''27'') AND c IN (1, 2)'); + estimated | actual +-----------+-------- + 400 | 400 +(1 row) + +-- OR clauses referencing the same attribute +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 51) AND b = ''1'''); + estimated | actual +-----------+-------- + 99 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 51) AND (b = ''1'' OR b = ''2'')'); + estimated | actual +-----------+-------- + 99 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 2 OR a = 51 OR a = 52) AND (b = ''1'' OR b = ''2'')'); + estimated | actual +-----------+-------- + 197 | 200 +(1 row) + +-- OR clauses referencing different attributes are incompatible +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR b = ''1'') AND b = ''1'''); + estimated | actual +-----------+-------- + 17 | 100 +(1 row) + +-- ANY +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ''1'''); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = 1'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = ANY (ARRAY[1])'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 26, 27, 51, 52, 76, 77]) AND b = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND c = ANY (ARRAY[1, 2])'); + estimated | actual +-----------+-------- + 400 | 400 +(1 row) + +-- ANY with inequalities should not benefit from functional dependencies +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a < ANY (ARRAY[1, 51]) AND b > ''1'''); + estimated | actual +-----------+-------- + 2522 | 2400 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a >= ANY (ARRAY[1, 51]) AND b <= ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 1444 | 1250 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a <= ANY (ARRAY[1, 2, 51, 52]) AND b >= ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 3918 | 2550 +(1 row) + +-- ALL (should not benefit from functional dependencies) +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1''])'); + estimated | actual +-----------+-------- + 14 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 0 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ALL (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 0 | 0 +(1 row) + +-- changing the type of column c causes all its stats to be dropped, reverting +-- to default estimates without any statistics, i.e. 0.5% selectivity for each +-- condition +ALTER TABLE functional_dependencies ALTER COLUMN c TYPE numeric; +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 1 | 50 +(1 row) + +ANALYZE functional_dependencies; +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +DROP STATISTICS func_deps_stat; +-- now try functional dependencies with expressions +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = 2 AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 1 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = 2 AND upper(b) = ''1'' AND (c + 1) = 2'); + estimated | actual +-----------+-------- + 1 | 50 +(1 row) + +-- IN +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) IN (''1'', ''2'')'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) IN (''1'', ''2'')'); + estimated | actual +-----------+-------- + 1 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 52, 102, 152) AND upper(b) IN (''1'', ''26'') AND (c + 1) = 2'); + estimated | actual +-----------+-------- + 1 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 52, 102, 152) AND upper(b) IN (''1'', ''26'') AND (c + 1) IN (2)'); + estimated | actual +-----------+-------- + 1 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 52, 54, 102, 104, 152, 154) AND upper(b) IN (''1'', ''2'', ''26'', ''27'') AND (c + 1) IN (2, 3)'); + estimated | actual +-----------+-------- + 1 | 400 +(1 row) + +-- OR clauses referencing the same attribute +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 102) AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 102) AND (upper(b) = ''1'' OR upper(b) = ''2'')'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 4 OR (a * 2) = 102 OR (a * 2) = 104) AND (upper(b) = ''1'' OR upper(b) = ''2'')'); + estimated | actual +-----------+-------- + 1 | 200 +(1 row) + +-- OR clauses referencing different attributes +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR upper(b) = ''1'') AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +-- ANY +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 102]) AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 102]) AND upper(b) = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 4, 102, 104]) AND upper(b) = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 1 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 52, 102, 152]) AND upper(b) = ANY (ARRAY[''1'', ''26'']) AND (c + 1) = 2'); + estimated | actual +-----------+-------- + 1 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 52, 102, 152]) AND upper(b) = ANY (ARRAY[''1'', ''26'']) AND (c + 1) = ANY (ARRAY[2])'); + estimated | actual +-----------+-------- + 1 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 4, 52, 54, 102, 104, 152, 154]) AND upper(b) = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND (c + 1) = ANY (ARRAY[2, 3])'); + estimated | actual +-----------+-------- + 1 | 400 +(1 row) + +-- ANY with inequalities should not benefit from functional dependencies +-- the estimates however improve thanks to having expression statistics +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) < ANY (ARRAY[2, 102]) AND upper(b) > ''1'''); + estimated | actual +-----------+-------- + 1242 | 2400 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) >= ANY (ARRAY[2, 102]) AND upper(b) <= ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 2070 | 1250 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) <= ANY (ARRAY[2, 4, 102, 104]) AND upper(b) >= ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 2488 | 2550 +(1 row) + +-- ALL (should not benefit from functional dependencies) +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ALL (ARRAY[''1''])'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ALL (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 0 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) = ALL (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 0 | 0 +(1 row) + +-- create statistics on expressions +CREATE STATISTICS func_deps_stat (dependencies) ON (a * 2), upper(b), (c + 1) FROM functional_dependencies; +ANALYZE functional_dependencies; +-- print the detected dependencies +SELECT dependencies FROM pg_stats_ext WHERE statistics_name = 'func_deps_stat'; + dependencies +------------------------------------------------------------------------------------------------------------------------ + {"-1 => -2": 1.000000, "-1 => -3": 1.000000, "-2 => -3": 1.000000, "-1, -2 => -3": 1.000000, "-1, -3 => -2": 1.000000} +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = 2 AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = 2 AND upper(b) = ''1'' AND (c + 1) = 2'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +-- IN +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) IN (''1'', ''2'')'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) IN (''1'', ''2'')'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 52, 102, 152) AND upper(b) IN (''1'', ''26'') AND (c + 1) = 2'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 52, 102, 152) AND upper(b) IN (''1'', ''26'') AND (c + 1) IN (2)'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 52, 54, 102, 104, 152, 154) AND upper(b) IN (''1'', ''2'', ''26'', ''27'') AND (c + 1) IN (2, 3)'); + estimated | actual +-----------+-------- + 400 | 400 +(1 row) + +-- OR clauses referencing the same attribute +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 102) AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 99 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 102) AND (upper(b) = ''1'' OR upper(b) = ''2'')'); + estimated | actual +-----------+-------- + 99 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 4 OR (a * 2) = 102 OR (a * 2) = 104) AND (upper(b) = ''1'' OR upper(b) = ''2'')'); + estimated | actual +-----------+-------- + 197 | 200 +(1 row) + +-- OR clauses referencing different attributes +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR upper(b) = ''1'') AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 17 | 100 +(1 row) + +-- ANY +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 102]) AND upper(b) = ''1'''); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 102]) AND upper(b) = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 4, 102, 104]) AND upper(b) = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 52, 102, 152]) AND upper(b) = ANY (ARRAY[''1'', ''26'']) AND (c + 1) = 2'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 52, 102, 152]) AND upper(b) = ANY (ARRAY[''1'', ''26'']) AND (c + 1) = ANY (ARRAY[2])'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 4, 52, 54, 102, 104, 152, 154]) AND upper(b) = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND (c + 1) = ANY (ARRAY[2, 3])'); + estimated | actual +-----------+-------- + 400 | 400 +(1 row) + +-- ANY with inequalities should not benefit from functional dependencies +-- the estimates however improve thanks to having expression statistics +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) < ANY (ARRAY[2, 102]) AND upper(b) > ''1'''); + estimated | actual +-----------+-------- + 2522 | 2400 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) >= ANY (ARRAY[2, 102]) AND upper(b) <= ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 1444 | 1250 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) <= ANY (ARRAY[2, 4, 102, 104]) AND upper(b) >= ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 3918 | 2550 +(1 row) + +-- ALL (should not benefit from functional dependencies) +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ALL (ARRAY[''1''])'); + estimated | actual +-----------+-------- + 14 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ALL (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 0 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) = ALL (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 0 | 0 +(1 row) + +-- check the ability to use multiple functional dependencies +CREATE TABLE functional_dependencies_multi ( + a INTEGER, + b INTEGER, + c INTEGER, + d INTEGER +) +WITH (autovacuum_enabled = off); +INSERT INTO functional_dependencies_multi (a, b, c, d) + SELECT + mod(i,7), + mod(i,7), + mod(i,11), + mod(i,11) + FROM generate_series(1,5000) s(i); +ANALYZE functional_dependencies_multi; +-- estimates without any functional dependencies +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE a = 0 AND b = 0'); + estimated | actual +-----------+-------- + 270 | 714 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE 0 = a AND 0 = b'); + estimated | actual +-----------+-------- + 270 | 714 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE c = 0 AND d = 0'); + estimated | actual +-----------+-------- + 137 | 454 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE a = 0 AND b = 0 AND c = 0 AND d = 0'); + estimated | actual +-----------+-------- + 44 | 64 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE 0 = a AND b = 0 AND 0 = c AND d = 0'); + estimated | actual +-----------+-------- + 44 | 64 +(1 row) + +-- create separate functional dependencies +CREATE STATISTICS functional_dependencies_multi_1 (dependencies) ON a, b FROM functional_dependencies_multi; +CREATE STATISTICS functional_dependencies_multi_2 (dependencies) ON c, d FROM functional_dependencies_multi; +ANALYZE functional_dependencies_multi; +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE a = 0 AND b = 0'); + estimated | actual +-----------+-------- + 714 | 714 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE 0 = a AND 0 = b'); + estimated | actual +-----------+-------- + 714 | 714 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE c = 0 AND d = 0'); + estimated | actual +-----------+-------- + 454 | 454 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE a = 0 AND b = 0 AND c = 0 AND d = 0'); + estimated | actual +-----------+-------- + 65 | 64 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE 0 = a AND b = 0 AND 0 = c AND d = 0'); + estimated | actual +-----------+-------- + 65 | 64 +(1 row) + +DROP TABLE functional_dependencies_multi; +-- MCV lists +CREATE TABLE mcv_lists ( + filler1 TEXT, + filler2 NUMERIC, + a INT, + b VARCHAR, + filler3 DATE, + c INT, + d TEXT +) +WITH (autovacuum_enabled = off); +-- random data (no MCV list) +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT mod(i,37), mod(i,41), mod(i,43), mod(i,47) FROM generate_series(1,5000) s(i); +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 20 | 4 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 5 | 1 +(1 row) + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON a, b, c FROM mcv_lists; +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 3 | 4 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 1 | 1 +(1 row) + +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; +-- random data (no MCV list), but with expression +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT i, i, i, i FROM generate_series(1,1000) s(i); +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,7) = 1 AND mod(b::int,11) = 1'); + estimated | actual +-----------+-------- + 1 | 13 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,7) = 1 AND mod(b::int,11) = 1 AND mod(c,13) = 1'); + estimated | actual +-----------+-------- + 1 | 1 +(1 row) + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON (mod(a,7)), (mod(b::int,11)), (mod(c,13)) FROM mcv_lists; +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,7) = 1 AND mod(b::int,11) = 1'); + estimated | actual +-----------+-------- + 13 | 13 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,7) = 1 AND mod(b::int,11) = 1 AND mod(c,13) = 1'); + estimated | actual +-----------+-------- + 1 | 1 +(1 row) + +-- 100 distinct combinations, all in the MCV list +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT mod(i,100), mod(i,50), mod(i,25), i FROM generate_series(1,5000) s(i); +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = a AND ''1'' = b'); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 1 AND b < ''1'''); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > a AND ''1'' > b'); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= 0 AND b <= ''0'''); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 0 >= a AND ''0'' >= b'); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 2 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 5 AND b < ''1'' AND c < 5'); + estimated | actual +-----------+-------- + 13 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 5 AND ''1'' > b AND 5 > c'); + estimated | actual +-----------+-------- + 13 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= 4 AND b <= ''0'' AND c <= 4'); + estimated | actual +-----------+-------- + 13 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 4 >= a AND ''0'' >= b AND 4 >= c'); + estimated | actual +-----------+-------- + 13 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1'); + estimated | actual +-----------+-------- + 343 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1 OR d IS NOT NULL'); + estimated | actual +-----------+-------- + 343 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (1, 2, 51, 52) AND b IN ( ''1'', ''2'')'); + estimated | actual +-----------+-------- + 40 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (1, 2, 51, 52, NULL) AND b IN ( ''1'', ''2'', NULL)'); + estimated | actual +-----------+-------- + 40 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 40 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = ANY (ARRAY[NULL, 1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2'', NULL])'); + estimated | actual +-----------+-------- + 40 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= ANY (ARRAY[1, 2, 3]) AND b IN (''1'', ''2'', ''3'')'); + estimated | actual +-----------+-------- + 89 | 150 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= ANY (ARRAY[1, NULL, 2, 3]) AND b IN (''1'', ''2'', NULL, ''3'')'); + estimated | actual +-----------+-------- + 89 | 150 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND c > ANY (ARRAY[1, 2, 3])'); + estimated | actual +-----------+-------- + 10 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND c > ANY (ARRAY[1, 2, 3, NULL])'); + estimated | actual +-----------+-------- + 10 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND b IN (''1'', ''2'', ''3'') AND c > ANY (ARRAY[1, 2, 3])'); + estimated | actual +-----------+-------- + 2 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND b IN (''1'', ''2'', NULL, ''3'') AND c > ANY (ARRAY[1, 2, NULL, 3])'); + estimated | actual +-----------+-------- + 2 | 100 +(1 row) + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON a, b, c FROM mcv_lists; +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = a AND ''1'' = b'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 1 AND b < ''1'''); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > a AND ''1'' > b'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= 0 AND b <= ''0'''); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 0 >= a AND ''0'' >= b'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'' AND c = 1'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 5 AND b < ''1'' AND c < 5'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 5 AND ''1'' > b AND 5 > c'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= 4 AND b <= ''0'' AND c <= 4'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 4 >= a AND ''0'' >= b AND 4 >= c'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1 OR d IS NOT NULL'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1 OR d IS NOT NULL'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (1, 2, 51, 52) AND b IN ( ''1'', ''2'')'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (1, 2, 51, 52, NULL) AND b IN ( ''1'', ''2'', NULL)'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = ANY (ARRAY[NULL, 1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2'', NULL])'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= ANY (ARRAY[1, 2, 3]) AND b IN (''1'', ''2'', ''3'')'); + estimated | actual +-----------+-------- + 150 | 150 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= ANY (ARRAY[1, NULL, 2, 3]) AND b IN (''1'', ''2'', NULL, ''3'')'); + estimated | actual +-----------+-------- + 150 | 150 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND c > ANY (ARRAY[1, 2, 3])'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND c > ANY (ARRAY[1, 2, 3, NULL])'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND b IN (''1'', ''2'', ''3'') AND c > ANY (ARRAY[1, 2, 3])'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND b IN (''1'', ''2'', NULL, ''3'') AND c > ANY (ARRAY[1, 2, NULL, 3])'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +-- check change of unrelated column type does not reset the MCV statistics +ALTER TABLE mcv_lists ALTER COLUMN d TYPE VARCHAR(64); +SELECT d.stxdmcv IS NOT NULL + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxname = 'mcv_lists_stats' + AND d.stxoid = s.oid; + ?column? +---------- + t +(1 row) + +-- check change of column type resets the MCV statistics +ALTER TABLE mcv_lists ALTER COLUMN c TYPE numeric; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +-- 100 distinct combinations, all in the MCV list, but with expressions +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT i, i, i, i FROM generate_series(1,1000) s(i); +ANALYZE mcv_lists; +-- without any stats on the expressions, we have to use default selectivities, which +-- is why the estimates here are different from the pre-computed case above +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1'); + estimated | actual +-----------+-------- + 1 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = mod(a,20) AND 1 = mod(b::int,10)'); + estimated | actual +-----------+-------- + 1 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < 1 AND mod(b::int,10) < 1'); + estimated | actual +-----------+-------- + 192 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > mod(a,20) AND 1 > mod(b::int,10)'); + estimated | actual +-----------+-------- + 192 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1 AND mod(c,5) = 1'); + estimated | actual +-----------+-------- + 1 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 OR mod(b::int,10) = 1 OR mod(c,25) = 1 OR d IS NOT NULL'); + estimated | actual +-----------+-------- + 3 | 120 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) IN (1, 2, 51, 52, NULL) AND mod(b::int,10) IN ( 1, 2, NULL)'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = ANY (ARRAY[1, 2, 51, 52]) AND mod(b::int,10) = ANY (ARRAY[1, 2])'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) <= ANY (ARRAY[1, NULL, 2, 3]) AND mod(b::int,10) IN (1, 2, NULL, 3)'); + estimated | actual +-----------+-------- + 3 | 150 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < ALL (ARRAY[4, 5]) AND mod(b::int,10) IN (1, 2, 3) AND mod(c,5) > ANY (ARRAY[1, 2, 3])'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +-- create statistics with expressions only (we create three separate stats, in order not to build more complex extended stats) +CREATE STATISTICS mcv_lists_stats_1 ON (mod(a,20)) FROM mcv_lists; +CREATE STATISTICS mcv_lists_stats_2 ON (mod(b::int,10)) FROM mcv_lists; +CREATE STATISTICS mcv_lists_stats_3 ON (mod(c,5)) FROM mcv_lists; +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1'); + estimated | actual +-----------+-------- + 16 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = mod(a,20) AND 1 = mod(b::int,10)'); + estimated | actual +-----------+-------- + 16 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < 1 AND mod(b::int,10) < 1'); + estimated | actual +-----------+-------- + 16 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > mod(a,20) AND 1 > mod(b::int,10)'); + estimated | actual +-----------+-------- + 16 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1 AND mod(c,5) = 1'); + estimated | actual +-----------+-------- + 9 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 OR mod(b::int,10) = 1 OR mod(c,25) = 1 OR d IS NOT NULL'); + estimated | actual +-----------+-------- + 146 | 120 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) IN (1, 2, 51, 52, NULL) AND mod(b::int,10) IN ( 1, 2, NULL)'); + estimated | actual +-----------+-------- + 45 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = ANY (ARRAY[1, 2, 51, 52]) AND mod(b::int,10) = ANY (ARRAY[1, 2])'); + estimated | actual +-----------+-------- + 45 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) <= ANY (ARRAY[1, NULL, 2, 3]) AND mod(b::int,10) IN (1, 2, NULL, 3)'); + estimated | actual +-----------+-------- + 187 | 150 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < ALL (ARRAY[4, 5]) AND mod(b::int,10) IN (1, 2, 3) AND mod(c,5) > ANY (ARRAY[1, 2, 3])'); + estimated | actual +-----------+-------- + 26 | 100 +(1 row) + +DROP STATISTICS mcv_lists_stats_1; +DROP STATISTICS mcv_lists_stats_2; +DROP STATISTICS mcv_lists_stats_3; +-- create statistics with both MCV and expressions +CREATE STATISTICS mcv_lists_stats (mcv) ON (mod(a,20)), (mod(b::int,10)), (mod(c,5)) FROM mcv_lists; +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = mod(a,20) AND 1 = mod(b::int,10)'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < 1 AND mod(b::int,10) < 1'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > mod(a,20) AND 1 > mod(b::int,10)'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1 AND mod(c,5) = 1'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 OR mod(b::int,10) = 1 OR mod(c,25) = 1 OR d IS NOT NULL'); + estimated | actual +-----------+-------- + 101 | 120 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) IN (1, 2, 51, 52, NULL) AND mod(b::int,10) IN ( 1, 2, NULL)'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = ANY (ARRAY[1, 2, 51, 52]) AND mod(b::int,10) = ANY (ARRAY[1, 2])'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) <= ANY (ARRAY[1, NULL, 2, 3]) AND mod(b::int,10) IN (1, 2, NULL, 3)'); + estimated | actual +-----------+-------- + 150 | 150 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < ALL (ARRAY[4, 5]) AND mod(b::int,10) IN (1, 2, 3) AND mod(c,5) > ANY (ARRAY[1, 2, 3])'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +-- we can't use the statistic for OR clauses that are not fully covered (missing 'd' attribute) +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 OR mod(b::int,10) = 1 OR mod(c,5) = 1 OR d IS NOT NULL'); + estimated | actual +-----------+-------- + 200 | 200 +(1 row) + +-- 100 distinct combinations with NULL values, all in the MCV list +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT + (CASE WHEN mod(i,100) = 1 THEN NULL ELSE mod(i,100) END), + (CASE WHEN mod(i,50) = 1 THEN NULL ELSE mod(i,50) END), + (CASE WHEN mod(i,25) = 1 THEN NULL ELSE mod(i,25) END), + i + FROM generate_series(1,5000) s(i); +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL'); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL AND c IS NULL'); + estimated | actual +-----------+-------- + 2 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NOT NULL'); + estimated | actual +-----------+-------- + 49 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NOT NULL AND b IS NULL AND c IS NOT NULL'); + estimated | actual +-----------+-------- + 98 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (0, 1) AND b IN (''0'', ''1'')'); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON a, b, c FROM mcv_lists; +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL AND c IS NULL'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NOT NULL'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NOT NULL AND b IS NULL AND c IS NOT NULL'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (0, 1) AND b IN (''0'', ''1'')'); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +-- test pg_mcv_list_items with a very simple (single item) MCV list +TRUNCATE mcv_lists; +INSERT INTO mcv_lists (a, b, c) SELECT 1, 2, 3 FROM generate_series(1,1000) s(i); +ANALYZE mcv_lists; +SELECT m.* + FROM pg_statistic_ext s, pg_statistic_ext_data d, + pg_mcv_list_items(d.stxdmcv) m + WHERE s.stxname = 'mcv_lists_stats' + AND d.stxoid = s.oid; + index | values | nulls | frequency | base_frequency +-------+---------+---------+-----------+---------------- + 0 | {1,2,3} | {f,f,f} | 1 | 1 +(1 row) + +-- 2 distinct combinations with NULL values, all in the MCV list +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; +INSERT INTO mcv_lists (a, b, c, d) + SELECT + NULL, -- always NULL + (CASE WHEN mod(i,2) = 0 THEN NULL ELSE 'x' END), + (CASE WHEN mod(i,2) = 0 THEN NULL ELSE 0 END), + (CASE WHEN mod(i,2) = 0 THEN NULL ELSE 'x' END) + FROM generate_series(1,5000) s(i); +ANALYZE mcv_lists; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE b = ''x'' OR d = ''x'''); + estimated | actual +-----------+-------- + 3750 | 2500 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''x'' OR d = ''x'''); + estimated | actual +-----------+-------- + 3750 | 2500 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND (b = ''x'' OR d = ''x'')'); + estimated | actual +-----------+-------- + 3750 | 2500 +(1 row) + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON a, b, d FROM mcv_lists; +ANALYZE mcv_lists; +-- test pg_mcv_list_items with MCV list containing variable-length data and NULLs +SELECT m.* + FROM pg_statistic_ext s, pg_statistic_ext_data d, + pg_mcv_list_items(d.stxdmcv) m + WHERE s.stxname = 'mcv_lists_stats' + AND d.stxoid = s.oid; + index | values | nulls | frequency | base_frequency +-------+------------------+---------+-----------+---------------- + 0 | {NULL,x,x} | {t,f,f} | 0.5 | 0.25 + 1 | {NULL,NULL,NULL} | {t,t,t} | 0.5 | 0.25 +(2 rows) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE b = ''x'' OR d = ''x'''); + estimated | actual +-----------+-------- + 2500 | 2500 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''x'' OR d = ''x'''); + estimated | actual +-----------+-------- + 2500 | 2500 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND (b = ''x'' OR d = ''x'')'); + estimated | actual +-----------+-------- + 2500 | 2500 +(1 row) + +-- mcv with pass-by-ref fixlen types, e.g. uuid +CREATE TABLE mcv_lists_uuid ( + a UUID, + b UUID, + c UUID +) +WITH (autovacuum_enabled = off); +INSERT INTO mcv_lists_uuid (a, b, c) + SELECT + md5(mod(i,100)::text)::uuid, + md5(mod(i,50)::text)::uuid, + md5(mod(i,25)::text)::uuid + FROM generate_series(1,5000) s(i); +ANALYZE mcv_lists_uuid; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_uuid WHERE a = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND b = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'''); + estimated | actual +-----------+-------- + 7 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_uuid WHERE a = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND b = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND c = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'''); + estimated | actual +-----------+-------- + 2 | 50 +(1 row) + +CREATE STATISTICS mcv_lists_uuid_stats (mcv) ON a, b, c + FROM mcv_lists_uuid; +ANALYZE mcv_lists_uuid; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_uuid WHERE a = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND b = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'''); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_uuid WHERE a = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND b = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND c = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'''); + estimated | actual +-----------+-------- + 50 | 50 +(1 row) + +DROP TABLE mcv_lists_uuid; +-- mcv with arrays +CREATE TABLE mcv_lists_arrays ( + a TEXT[], + b NUMERIC[], + c INT[] +) +WITH (autovacuum_enabled = off); +INSERT INTO mcv_lists_arrays (a, b, c) + SELECT + ARRAY[md5((i/100)::text), md5((i/100-1)::text), md5((i/100+1)::text)], + ARRAY[(i/100-1)::numeric/1000, (i/100)::numeric/1000, (i/100+1)::numeric/1000], + ARRAY[(i/100-1), i/100, (i/100+1)] + FROM generate_series(1,5000) s(i); +CREATE STATISTICS mcv_lists_arrays_stats (mcv) ON a, b, c + FROM mcv_lists_arrays; +ANALYZE mcv_lists_arrays; +-- mcv with bool +CREATE TABLE mcv_lists_bool ( + a BOOL, + b BOOL, + c BOOL +) +WITH (autovacuum_enabled = off); +INSERT INTO mcv_lists_bool (a, b, c) + SELECT + (mod(i,2) = 0), (mod(i,4) = 0), (mod(i,8) = 0) + FROM generate_series(1,10000) s(i); +ANALYZE mcv_lists_bool; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE a AND b AND c'); + estimated | actual +-----------+-------- + 496 | 1250 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND b AND c'); + estimated | actual +-----------+-------- + 496 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND NOT b AND c'); + estimated | actual +-----------+-------- + 803 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND b AND NOT c'); + estimated | actual +-----------+-------- + 1691 | 0 +(1 row) + +CREATE STATISTICS mcv_lists_bool_stats (mcv) ON a, b, c + FROM mcv_lists_bool; +ANALYZE mcv_lists_bool; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE a AND b AND c'); + estimated | actual +-----------+-------- + 1250 | 1250 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND b AND c'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND NOT b AND c'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND b AND NOT c'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +-- mcv covering just a small fraction of data +CREATE TABLE mcv_lists_partial ( + a INT, + b INT, + c INT +); +-- 10 frequent groups, each with 100 elements +INSERT INTO mcv_lists_partial (a, b, c) + SELECT + mod(i,10), + mod(i,10), + mod(i,10) + FROM generate_series(0,999) s(i); +-- 100 groups that will make it to the MCV list (includes the 10 frequent ones) +INSERT INTO mcv_lists_partial (a, b, c) + SELECT + i, + i, + i + FROM generate_series(0,99) s(i); +-- 4000 groups in total, most of which won't make it (just a single item) +INSERT INTO mcv_lists_partial (a, b, c) + SELECT + i, + i, + i + FROM generate_series(0,3999) s(i); +ANALYZE mcv_lists_partial; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 AND b = 0 AND c = 0'); + estimated | actual +-----------+-------- + 4 | 102 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 OR b = 0 OR c = 0'); + estimated | actual +-----------+-------- + 300 | 102 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 10 AND b = 10 AND c = 10'); + estimated | actual +-----------+-------- + 1 | 2 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 10 OR b = 10 OR c = 10'); + estimated | actual +-----------+-------- + 6 | 2 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 AND b = 0 AND c = 10'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 OR b = 0 OR c = 10'); + estimated | actual +-----------+-------- + 204 | 104 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE (a = 0 AND b = 0 AND c = 0) OR (a = 1 AND b = 1 AND c = 1) OR (a = 2 AND b = 2 AND c = 2)'); + estimated | actual +-----------+-------- + 12 | 306 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE (a = 0 AND b = 0) OR (a = 0 AND c = 0) OR (b = 0 AND c = 0)'); + estimated | actual +-----------+-------- + 43 | 102 +(1 row) + +CREATE STATISTICS mcv_lists_partial_stats (mcv) ON a, b, c + FROM mcv_lists_partial; +ANALYZE mcv_lists_partial; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 AND b = 0 AND c = 0'); + estimated | actual +-----------+-------- + 102 | 102 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 OR b = 0 OR c = 0'); + estimated | actual +-----------+-------- + 96 | 102 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 10 AND b = 10 AND c = 10'); + estimated | actual +-----------+-------- + 2 | 2 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 10 OR b = 10 OR c = 10'); + estimated | actual +-----------+-------- + 2 | 2 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 AND b = 0 AND c = 10'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 OR b = 0 OR c = 10'); + estimated | actual +-----------+-------- + 102 | 104 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE (a = 0 AND b = 0 AND c = 0) OR (a = 1 AND b = 1 AND c = 1) OR (a = 2 AND b = 2 AND c = 2)'); + estimated | actual +-----------+-------- + 306 | 306 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE (a = 0 AND b = 0) OR (a = 0 AND c = 0) OR (b = 0 AND c = 0)'); + estimated | actual +-----------+-------- + 108 | 102 +(1 row) + +DROP TABLE mcv_lists_partial; +-- check the ability to use multiple MCV lists +CREATE TABLE mcv_lists_multi ( + a INTEGER, + b INTEGER, + c INTEGER, + d INTEGER +) +WITH (autovacuum_enabled = off); +INSERT INTO mcv_lists_multi (a, b, c, d) + SELECT + mod(i,5), + mod(i,5), + mod(i,7), + mod(i,7) + FROM generate_series(1,5000) s(i); +ANALYZE mcv_lists_multi; +-- estimates without any mcv statistics +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 AND b = 0'); + estimated | actual +-----------+-------- + 447 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE c = 0 AND d = 0'); + estimated | actual +-----------+-------- + 270 | 714 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE b = 0 AND c = 0'); + estimated | actual +-----------+-------- + 319 | 142 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE b = 0 OR c = 0'); + estimated | actual +-----------+-------- + 1571 | 1572 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 AND b = 0 AND c = 0 AND d = 0'); + estimated | actual +-----------+-------- + 106 | 142 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE (a = 0 AND b = 0) OR (c = 0 AND d = 0)'); + estimated | actual +-----------+-------- + 693 | 1572 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 OR b = 0 OR c = 0 OR d = 0'); + estimated | actual +-----------+-------- + 2649 | 1572 +(1 row) + +-- create separate MCV statistics +CREATE STATISTICS mcv_lists_multi_1 (mcv) ON a, b FROM mcv_lists_multi; +CREATE STATISTICS mcv_lists_multi_2 (mcv) ON c, d FROM mcv_lists_multi; +ANALYZE mcv_lists_multi; +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 AND b = 0'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE c = 0 AND d = 0'); + estimated | actual +-----------+-------- + 714 | 714 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE b = 0 AND c = 0'); + estimated | actual +-----------+-------- + 319 | 142 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE b = 0 OR c = 0'); + estimated | actual +-----------+-------- + 1571 | 1572 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 AND b = 0 AND c = 0 AND d = 0'); + estimated | actual +-----------+-------- + 143 | 142 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE (a = 0 AND b = 0) OR (c = 0 AND d = 0)'); + estimated | actual +-----------+-------- + 1571 | 1572 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 OR b = 0 OR c = 0 OR d = 0'); + estimated | actual +-----------+-------- + 1571 | 1572 +(1 row) + +DROP TABLE mcv_lists_multi; +-- statistics on integer expressions +CREATE TABLE expr_stats (a int, b int, c int); +INSERT INTO expr_stats SELECT mod(i,10), mod(i,10), mod(i,10) FROM generate_series(1,1000) s(i); +ANALYZE expr_stats; +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE (2*a) = 0 AND (3*b) = 0'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE (a+b) = 0 AND (a-b) = 0'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +CREATE STATISTICS expr_stats_1 (mcv) ON (a+b), (a-b), (2*a), (3*b) FROM expr_stats; +ANALYZE expr_stats; +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE (2*a) = 0 AND (3*b) = 0'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE (a+b) = 0 AND (a-b) = 0'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +DROP STATISTICS expr_stats_1; +DROP TABLE expr_stats; +-- statistics on a mix columns and expressions +CREATE TABLE expr_stats (a int, b int, c int); +INSERT INTO expr_stats SELECT mod(i,10), mod(i,10), mod(i,10) FROM generate_series(1,1000) s(i); +ANALYZE expr_stats; +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND (2*a) = 0 AND (3*b) = 0'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 3 AND b = 3 AND (a-b) = 0'); + estimated | actual +-----------+-------- + 1 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND b = 1 AND (a-b) = 0'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +CREATE STATISTICS expr_stats_1 (mcv) ON a, b, (2*a), (3*b), (a+b), (a-b) FROM expr_stats; +ANALYZE expr_stats; +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND (2*a) = 0 AND (3*b) = 0'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 3 AND b = 3 AND (a-b) = 0'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND b = 1 AND (a-b) = 0'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + +DROP TABLE expr_stats; +-- statistics on expressions with different data types +CREATE TABLE expr_stats (a int, b name, c text); +INSERT INTO expr_stats SELECT mod(i,10), md5(mod(i,10)::text), md5(mod(i,10)::text) FROM generate_series(1,1000) s(i); +ANALYZE expr_stats; +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND (b || c) <= ''z'' AND (c || b) >= ''0'''); + estimated | actual +-----------+-------- + 40 | 100 +(1 row) + +CREATE STATISTICS expr_stats_1 (mcv) ON a, b, (b || c), (c || b) FROM expr_stats; +ANALYZE expr_stats; +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND (b || c) <= ''z'' AND (c || b) >= ''0'''); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +DROP TABLE expr_stats; +-- test handling of a mix of compatible and incompatible expressions +CREATE TABLE expr_stats_incompatible_test ( + c0 double precision, + c1 boolean NOT NULL +); +CREATE STATISTICS expr_stat_comp_1 ON c0, c1 FROM expr_stats_incompatible_test; +INSERT INTO expr_stats_incompatible_test VALUES (1234,false), (5678,true); +ANALYZE expr_stats_incompatible_test; +SELECT c0 FROM ONLY expr_stats_incompatible_test WHERE +( + upper('x') LIKE ('x'||('[0,1]'::int4range)) + AND + (c0 IN (0, 1) OR c1) +); + c0 +---- +(0 rows) + +DROP TABLE expr_stats_incompatible_test; +-- Permission tests. Users should not be able to see specific data values in +-- the extended statistics, if they lack permission to see those values in +-- the underlying table. +-- +-- Currently this is only relevant for MCV stats. +CREATE SCHEMA tststats; +CREATE TABLE tststats.priv_test_tbl ( + a int, + b int +); +INSERT INTO tststats.priv_test_tbl + SELECT mod(i,5), mod(i,10) FROM generate_series(1,100) s(i); +CREATE STATISTICS tststats.priv_test_stats (mcv) ON a, b + FROM tststats.priv_test_tbl; +ANALYZE tststats.priv_test_tbl; +-- Check printing info about extended statistics by \dX +create table stts_t1 (a int, b int); +create statistics stts_1 (ndistinct) on a, b from stts_t1; +create statistics stts_2 (ndistinct, dependencies) on a, b from stts_t1; +create statistics stts_3 (ndistinct, dependencies, mcv) on a, b from stts_t1; +create table stts_t2 (a int, b int, c int); +create statistics stts_4 on b, c from stts_t2; +create table stts_t3 (col1 int, col2 int, col3 int); +create statistics stts_hoge on col1, col2, col3 from stts_t3; +create schema stts_s1; +create schema stts_s2; +create statistics stts_s1.stts_foo on col1, col2 from stts_t3; +create statistics stts_s2.stts_yama (dependencies, mcv) on col1, col3 from stts_t3; +insert into stts_t1 select i,i from generate_series(1,100) i; +analyze stts_t1; +set search_path to public, stts_s1, stts_s2, tststats; +\dX + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +----------+------------------------+------------------------------------------------------------------+-----------+--------------+--------- + public | func_deps_stat | (a * 2), upper(b), (c + 1::numeric) FROM functional_dependencies | | defined | + public | mcv_lists_arrays_stats | a, b, c FROM mcv_lists_arrays | | | defined + public | mcv_lists_bool_stats | a, b, c FROM mcv_lists_bool | | | defined + public | mcv_lists_stats | a, b, d FROM mcv_lists | | | defined + public | stts_1 | a, b FROM stts_t1 | defined | | + public | stts_2 | a, b FROM stts_t1 | defined | defined | + public | stts_3 | a, b FROM stts_t1 | defined | defined | defined + public | stts_4 | b, c FROM stts_t2 | defined | defined | defined + public | stts_hoge | col1, col2, col3 FROM stts_t3 | defined | defined | defined + stts_s1 | stts_foo | col1, col2 FROM stts_t3 | defined | defined | defined + stts_s2 | stts_yama | col1, col3 FROM stts_t3 | | defined | defined + tststats | priv_test_stats | a, b FROM priv_test_tbl | | | defined +(12 rows) + +\dX stts_? + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+--------+-------------------+-----------+--------------+--------- + public | stts_1 | a, b FROM stts_t1 | defined | | + public | stts_2 | a, b FROM stts_t1 | defined | defined | + public | stts_3 | a, b FROM stts_t1 | defined | defined | defined + public | stts_4 | b, c FROM stts_t2 | defined | defined | defined +(4 rows) + +\dX *stts_hoge + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+-----------+-------------------------------+-----------+--------------+--------- + public | stts_hoge | col1, col2, col3 FROM stts_t3 | defined | defined | defined +(1 row) + +\dX+ + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +----------+------------------------+------------------------------------------------------------------+-----------+--------------+--------- + public | func_deps_stat | (a * 2), upper(b), (c + 1::numeric) FROM functional_dependencies | | defined | + public | mcv_lists_arrays_stats | a, b, c FROM mcv_lists_arrays | | | defined + public | mcv_lists_bool_stats | a, b, c FROM mcv_lists_bool | | | defined + public | mcv_lists_stats | a, b, d FROM mcv_lists | | | defined + public | stts_1 | a, b FROM stts_t1 | defined | | + public | stts_2 | a, b FROM stts_t1 | defined | defined | + public | stts_3 | a, b FROM stts_t1 | defined | defined | defined + public | stts_4 | b, c FROM stts_t2 | defined | defined | defined + public | stts_hoge | col1, col2, col3 FROM stts_t3 | defined | defined | defined + stts_s1 | stts_foo | col1, col2 FROM stts_t3 | defined | defined | defined + stts_s2 | stts_yama | col1, col3 FROM stts_t3 | | defined | defined + tststats | priv_test_stats | a, b FROM priv_test_tbl | | | defined +(12 rows) + +\dX+ stts_? + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+--------+-------------------+-----------+--------------+--------- + public | stts_1 | a, b FROM stts_t1 | defined | | + public | stts_2 | a, b FROM stts_t1 | defined | defined | + public | stts_3 | a, b FROM stts_t1 | defined | defined | defined + public | stts_4 | b, c FROM stts_t2 | defined | defined | defined +(4 rows) + +\dX+ *stts_hoge + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+-----------+-------------------------------+-----------+--------------+--------- + public | stts_hoge | col1, col2, col3 FROM stts_t3 | defined | defined | defined +(1 row) + +\dX+ stts_s2.stts_yama + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +---------+-----------+-------------------------+-----------+--------------+--------- + stts_s2 | stts_yama | col1, col3 FROM stts_t3 | | defined | defined +(1 row) + +set search_path to public, stts_s1; +\dX + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +---------+------------------------+------------------------------------------------------------------+-----------+--------------+--------- + public | func_deps_stat | (a * 2), upper(b), (c + 1::numeric) FROM functional_dependencies | | defined | + public | mcv_lists_arrays_stats | a, b, c FROM mcv_lists_arrays | | | defined + public | mcv_lists_bool_stats | a, b, c FROM mcv_lists_bool | | | defined + public | mcv_lists_stats | a, b, d FROM mcv_lists | | | defined + public | stts_1 | a, b FROM stts_t1 | defined | | + public | stts_2 | a, b FROM stts_t1 | defined | defined | + public | stts_3 | a, b FROM stts_t1 | defined | defined | defined + public | stts_4 | b, c FROM stts_t2 | defined | defined | defined + public | stts_hoge | col1, col2, col3 FROM stts_t3 | defined | defined | defined + stts_s1 | stts_foo | col1, col2 FROM stts_t3 | defined | defined | defined +(10 rows) + +create role regress_stats_ext nosuperuser; +set role regress_stats_ext; +\dX + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+------------------------+------------------------------------------------------------------+-----------+--------------+--------- + public | func_deps_stat | (a * 2), upper(b), (c + 1::numeric) FROM functional_dependencies | | defined | + public | mcv_lists_arrays_stats | a, b, c FROM mcv_lists_arrays | | | defined + public | mcv_lists_bool_stats | a, b, c FROM mcv_lists_bool | | | defined + public | mcv_lists_stats | a, b, d FROM mcv_lists | | | defined + public | stts_1 | a, b FROM stts_t1 | defined | | + public | stts_2 | a, b FROM stts_t1 | defined | defined | + public | stts_3 | a, b FROM stts_t1 | defined | defined | defined + public | stts_4 | b, c FROM stts_t2 | defined | defined | defined + public | stts_hoge | col1, col2, col3 FROM stts_t3 | defined | defined | defined +(9 rows) + +reset role; +drop table stts_t1, stts_t2, stts_t3; +drop schema stts_s1, stts_s2 cascade; +drop user regress_stats_ext; +reset search_path; +-- User with no access +CREATE USER regress_stats_user1; +GRANT USAGE ON SCHEMA tststats TO regress_stats_user1; +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_tbl; -- Permission denied +ERROR: permission denied for table priv_test_tbl +-- Attempt to gain access using a leaky operator +CREATE FUNCTION op_leak(int, int) RETURNS bool + AS 'BEGIN RAISE NOTICE ''op_leak => %, %'', $1, $2; RETURN $1 < $2; END' + LANGUAGE plpgsql; +CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, + restrict = scalarltsel); +SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +ERROR: permission denied for table priv_test_tbl +DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +ERROR: permission denied for table priv_test_tbl +-- Grant access via a security barrier view, but hide all data +RESET SESSION AUTHORIZATION; +CREATE VIEW tststats.priv_test_view WITH (security_barrier=true) + AS SELECT * FROM tststats.priv_test_tbl WHERE false; +GRANT SELECT, DELETE ON tststats.priv_test_view TO regress_stats_user1; +-- Should now have access via the view, but see nothing and leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak + a | b +---+--- +(0 rows) + +DELETE FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak +-- Grant table access, but hide all data with RLS +RESET SESSION AUTHORIZATION; +ALTER TABLE tststats.priv_test_tbl ENABLE ROW LEVEL SECURITY; +GRANT SELECT, DELETE ON tststats.priv_test_tbl TO regress_stats_user1; +-- Should now have direct table access, but see nothing and leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak + a | b +---+--- +(0 rows) + +DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +-- Tidy up +DROP OPERATOR <<< (int, int); +DROP FUNCTION op_leak(int, int); +RESET SESSION AUTHORIZATION; +DROP SCHEMA tststats CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table tststats.priv_test_tbl +drop cascades to view tststats.priv_test_view +DROP USER regress_stats_user1; diff --git a/src/test/singlenode_regress/expected/strings.out b/src/test/singlenode_regress/expected/strings.out new file mode 100644 index 00000000000..1745ca9ca68 --- /dev/null +++ b/src/test/singlenode_regress/expected/strings.out @@ -0,0 +1,2416 @@ +-- +-- STRINGS +-- Test various data entry syntaxes. +-- +-- create required tables +CREATE TABLE CHAR_STRINGS_TBL(f1 char(4)); +INSERT INTO CHAR_STRINGS_TBL (f1) VALUES ('a'), +('ab'), +('abcd'), +('abcd '); +CREATE TABLE VARCHAR_STRINGS_TBL(f1 varchar(4)); +INSERT INTO VARCHAR_STRINGS_TBL (f1) VALUES ('a'), +('ab'), +('abcd'), +('abcd '); +CREATE TABLE TEXT_STRINGS_TBL (f1 text); +INSERT INTO TEXT_STRINGS_TBL VALUES ('doh!'), +('hi de ho neighbor'); +-- SQL string continuation syntax +-- E021-03 character string literals +SELECT 'first line' +' - next line' + ' - third line' + AS "Three lines to one"; + Three lines to one +------------------------------------- + first line - next line - third line +(1 row) + +-- illegal string continuation syntax +SELECT 'first line' +' - next line' /* this comment is not allowed here */ +' - third line' + AS "Illegal comment within continuation"; +ERROR: syntax error at or near "' - third line'" +LINE 3: ' - third line' + ^ +-- bytea +SET bytea_output TO hex; +SELECT E'\\xDeAdBeEf'::bytea; + bytea +------------ + \xdeadbeef +(1 row) + +SELECT E'\\x De Ad Be Ef '::bytea; + bytea +------------ + \xdeadbeef +(1 row) + +SELECT E'\\xDeAdBeE'::bytea; +ERROR: invalid hexadecimal data: odd number of digits +LINE 1: SELECT E'\\xDeAdBeE'::bytea; + ^ +SELECT E'\\xDeAdBeEx'::bytea; +ERROR: invalid hexadecimal digit: "x" +LINE 1: SELECT E'\\xDeAdBeEx'::bytea; + ^ +SELECT E'\\xDe00BeEf'::bytea; + bytea +------------ + \xde00beef +(1 row) + +SELECT E'DeAdBeEf'::bytea; + bytea +-------------------- + \x4465416442654566 +(1 row) + +SELECT E'De\\000dBeEf'::bytea; + bytea +-------------------- + \x4465006442654566 +(1 row) + +SELECT E'De\123dBeEf'::bytea; + bytea +-------------------- + \x4465536442654566 +(1 row) + +SELECT E'De\\123dBeEf'::bytea; + bytea +-------------------- + \x4465536442654566 +(1 row) + +SELECT E'De\\678dBeEf'::bytea; +ERROR: invalid input syntax for type bytea +LINE 1: SELECT E'De\\678dBeEf'::bytea; + ^ +SET bytea_output TO escape; +SELECT E'\\xDeAdBeEf'::bytea; + bytea +------------------ + \336\255\276\357 +(1 row) + +SELECT E'\\x De Ad Be Ef '::bytea; + bytea +------------------ + \336\255\276\357 +(1 row) + +SELECT E'\\xDe00BeEf'::bytea; + bytea +------------------ + \336\000\276\357 +(1 row) + +SELECT E'DeAdBeEf'::bytea; + bytea +---------- + DeAdBeEf +(1 row) + +SELECT E'De\\000dBeEf'::bytea; + bytea +------------- + De\000dBeEf +(1 row) + +SELECT E'De\\123dBeEf'::bytea; + bytea +---------- + DeSdBeEf +(1 row) + +-- Unicode escapes +SET standard_conforming_strings TO on; +SELECT U&'d\0061t\+000061' AS U&"d\0061t\+000061"; + data +------ + data +(1 row) + +SELECT U&'d!0061t\+000061' UESCAPE '!' AS U&"d*0061t\+000061" UESCAPE '*'; + dat\+000061 +------------- + dat\+000061 +(1 row) + +SELECT U&'a\\b' AS "a\b"; + a\b +----- + a\b +(1 row) + +SELECT U&' \' UESCAPE '!' AS "tricky"; + tricky +-------- + \ +(1 row) + +SELECT 'tricky' AS U&"\" UESCAPE '!'; + \ +-------- + tricky +(1 row) + +SELECT U&'wrong: \061'; +ERROR: invalid Unicode escape +LINE 1: SELECT U&'wrong: \061'; + ^ +HINT: Unicode escapes must be \XXXX or \+XXXXXX. +SELECT U&'wrong: \+0061'; +ERROR: invalid Unicode escape +LINE 1: SELECT U&'wrong: \+0061'; + ^ +HINT: Unicode escapes must be \XXXX or \+XXXXXX. +SELECT U&'wrong: +0061' UESCAPE +; +ERROR: UESCAPE must be followed by a simple string literal at or near "+" +LINE 1: SELECT U&'wrong: +0061' UESCAPE +; + ^ +SELECT U&'wrong: +0061' UESCAPE '+'; +ERROR: invalid Unicode escape character at or near "'+'" +LINE 1: SELECT U&'wrong: +0061' UESCAPE '+'; + ^ +SELECT U&'wrong: \db99'; +ERROR: invalid Unicode surrogate pair +LINE 1: SELECT U&'wrong: \db99'; + ^ +SELECT U&'wrong: \db99xy'; +ERROR: invalid Unicode surrogate pair +LINE 1: SELECT U&'wrong: \db99xy'; + ^ +SELECT U&'wrong: \db99\\'; +ERROR: invalid Unicode surrogate pair +LINE 1: SELECT U&'wrong: \db99\\'; + ^ +SELECT U&'wrong: \db99\0061'; +ERROR: invalid Unicode surrogate pair +LINE 1: SELECT U&'wrong: \db99\0061'; + ^ +SELECT U&'wrong: \+00db99\+000061'; +ERROR: invalid Unicode surrogate pair +LINE 1: SELECT U&'wrong: \+00db99\+000061'; + ^ +SELECT U&'wrong: \+2FFFFF'; +ERROR: invalid Unicode escape value +LINE 1: SELECT U&'wrong: \+2FFFFF'; + ^ +-- while we're here, check the same cases in E-style literals +SELECT E'd\u0061t\U00000061' AS "data"; + data +------ + data +(1 row) + +SELECT E'a\\b' AS "a\b"; + a\b +----- + a\b +(1 row) + +SELECT E'wrong: \u061'; +ERROR: invalid Unicode escape +LINE 1: SELECT E'wrong: \u061'; + ^ +HINT: Unicode escapes must be \uXXXX or \UXXXXXXXX. +SELECT E'wrong: \U0061'; +ERROR: invalid Unicode escape +LINE 1: SELECT E'wrong: \U0061'; + ^ +HINT: Unicode escapes must be \uXXXX or \UXXXXXXXX. +SELECT E'wrong: \udb99'; +ERROR: invalid Unicode surrogate pair at or near "'" +LINE 1: SELECT E'wrong: \udb99'; + ^ +SELECT E'wrong: \udb99xy'; +ERROR: invalid Unicode surrogate pair at or near "x" +LINE 1: SELECT E'wrong: \udb99xy'; + ^ +SELECT E'wrong: \udb99\\'; +ERROR: invalid Unicode surrogate pair at or near "\" +LINE 1: SELECT E'wrong: \udb99\\'; + ^ +SELECT E'wrong: \udb99\u0061'; +ERROR: invalid Unicode surrogate pair at or near "\u0061" +LINE 1: SELECT E'wrong: \udb99\u0061'; + ^ +SELECT E'wrong: \U0000db99\U00000061'; +ERROR: invalid Unicode surrogate pair at or near "\U00000061" +LINE 1: SELECT E'wrong: \U0000db99\U00000061'; + ^ +SELECT E'wrong: \U002FFFFF'; +ERROR: invalid Unicode escape value at or near "\U002FFFFF" +LINE 1: SELECT E'wrong: \U002FFFFF'; + ^ +SET standard_conforming_strings TO off; +SELECT U&'d\0061t\+000061' AS U&"d\0061t\+000061"; +ERROR: unsafe use of string constant with Unicode escapes +LINE 1: SELECT U&'d\0061t\+000061' AS U&"d\0061t\+000061"; + ^ +DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +SELECT U&'d!0061t\+000061' UESCAPE '!' AS U&"d*0061t\+000061" UESCAPE '*'; +ERROR: unsafe use of string constant with Unicode escapes +LINE 1: SELECT U&'d!0061t\+000061' UESCAPE '!' AS U&"d*0061t\+000061... + ^ +DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +SELECT U&' \' UESCAPE '!' AS "tricky"; +ERROR: unsafe use of string constant with Unicode escapes +LINE 1: SELECT U&' \' UESCAPE '!' AS "tricky"; + ^ +DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +SELECT 'tricky' AS U&"\" UESCAPE '!'; + \ +-------- + tricky +(1 row) + +SELECT U&'wrong: \061'; +ERROR: unsafe use of string constant with Unicode escapes +LINE 1: SELECT U&'wrong: \061'; + ^ +DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +SELECT U&'wrong: \+0061'; +ERROR: unsafe use of string constant with Unicode escapes +LINE 1: SELECT U&'wrong: \+0061'; + ^ +DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +SELECT U&'wrong: +0061' UESCAPE '+'; +ERROR: unsafe use of string constant with Unicode escapes +LINE 1: SELECT U&'wrong: +0061' UESCAPE '+'; + ^ +DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +RESET standard_conforming_strings; +-- bytea +SET bytea_output TO hex; +SELECT E'\\xDeAdBeEf'::bytea; + bytea +------------ + \xdeadbeef +(1 row) + +SELECT E'\\x De Ad Be Ef '::bytea; + bytea +------------ + \xdeadbeef +(1 row) + +SELECT E'\\xDeAdBeE'::bytea; +ERROR: invalid hexadecimal data: odd number of digits +LINE 1: SELECT E'\\xDeAdBeE'::bytea; + ^ +SELECT E'\\xDeAdBeEx'::bytea; +ERROR: invalid hexadecimal digit: "x" +LINE 1: SELECT E'\\xDeAdBeEx'::bytea; + ^ +SELECT E'\\xDe00BeEf'::bytea; + bytea +------------ + \xde00beef +(1 row) + +SELECT E'DeAdBeEf'::bytea; + bytea +-------------------- + \x4465416442654566 +(1 row) + +SELECT E'De\\000dBeEf'::bytea; + bytea +-------------------- + \x4465006442654566 +(1 row) + +SELECT E'De\123dBeEf'::bytea; + bytea +-------------------- + \x4465536442654566 +(1 row) + +SELECT E'De\\123dBeEf'::bytea; + bytea +-------------------- + \x4465536442654566 +(1 row) + +SELECT E'De\\678dBeEf'::bytea; +ERROR: invalid input syntax for type bytea +LINE 1: SELECT E'De\\678dBeEf'::bytea; + ^ +SET bytea_output TO escape; +SELECT E'\\xDeAdBeEf'::bytea; + bytea +------------------ + \336\255\276\357 +(1 row) + +SELECT E'\\x De Ad Be Ef '::bytea; + bytea +------------------ + \336\255\276\357 +(1 row) + +SELECT E'\\xDe00BeEf'::bytea; + bytea +------------------ + \336\000\276\357 +(1 row) + +SELECT E'DeAdBeEf'::bytea; + bytea +---------- + DeAdBeEf +(1 row) + +SELECT E'De\\000dBeEf'::bytea; + bytea +------------- + De\000dBeEf +(1 row) + +SELECT E'De\\123dBeEf'::bytea; + bytea +---------- + DeSdBeEf +(1 row) + +-- +-- test conversions between various string types +-- E021-10 implicit casting among the character data types +-- +SELECT CAST(f1 AS text) AS "text(char)" FROM CHAR_STRINGS_TBL; + text(char) +------------ + a + ab + abcd + abcd +(4 rows) + +SELECT CAST(f1 AS text) AS "text(varchar)" FROM VARCHAR_STRINGS_TBL; + text(varchar) +--------------- + a + ab + abcd + abcd +(4 rows) + +SELECT CAST(name 'namefield' AS text) AS "text(name)"; + text(name) +------------ + namefield +(1 row) + +-- since this is an explicit cast, it should truncate w/o error: +SELECT CAST(f1 AS char(10)) AS "char(text)" FROM TEXT_STRINGS_TBL; + char(text) +------------ + doh! + hi de ho n +(2 rows) + +-- note: implicit-cast case is tested in char.sql +SELECT CAST(f1 AS char(20)) AS "char(text)" FROM TEXT_STRINGS_TBL; + char(text) +---------------------- + doh! + hi de ho neighbor +(2 rows) + +SELECT CAST(f1 AS char(10)) AS "char(varchar)" FROM VARCHAR_STRINGS_TBL; + char(varchar) +--------------- + a + ab + abcd + abcd +(4 rows) + +SELECT CAST(name 'namefield' AS char(10)) AS "char(name)"; + char(name) +------------ + namefield +(1 row) + +SELECT CAST(f1 AS varchar) AS "varchar(text)" FROM TEXT_STRINGS_TBL; + varchar(text) +------------------- + doh! + hi de ho neighbor +(2 rows) + +SELECT CAST(f1 AS varchar) AS "varchar(char)" FROM CHAR_STRINGS_TBL; + varchar(char) +--------------- + a + ab + abcd + abcd +(4 rows) + +SELECT CAST(name 'namefield' AS varchar) AS "varchar(name)"; + varchar(name) +--------------- + namefield +(1 row) + +-- +-- test SQL string functions +-- E### and T### are feature reference numbers from SQL99 +-- +-- E021-09 trim function +SELECT TRIM(BOTH FROM ' bunch o blanks ') = 'bunch o blanks' AS "bunch o blanks"; + bunch o blanks +---------------- + t +(1 row) + +SELECT TRIM(LEADING FROM ' bunch o blanks ') = 'bunch o blanks ' AS "bunch o blanks "; + bunch o blanks +------------------ + t +(1 row) + +SELECT TRIM(TRAILING FROM ' bunch o blanks ') = ' bunch o blanks' AS " bunch o blanks"; + bunch o blanks +------------------ + t +(1 row) + +SELECT TRIM(BOTH 'x' FROM 'xxxxxsome Xsxxxxx') = 'some Xs' AS "some Xs"; + some Xs +--------- + t +(1 row) + +-- E021-06 substring expression +SELECT SUBSTRING('1234567890' FROM 3) = '34567890' AS "34567890"; + 34567890 +---------- + t +(1 row) + +SELECT SUBSTRING('1234567890' FROM 4 FOR 3) = '456' AS "456"; + 456 +----- + t +(1 row) + +-- test overflow cases +SELECT SUBSTRING('string' FROM 2 FOR 2147483646) AS "tring"; + tring +------- + tring +(1 row) + +SELECT SUBSTRING('string' FROM -10 FOR 2147483646) AS "string"; + string +-------- + string +(1 row) + +SELECT SUBSTRING('string' FROM -10 FOR -2147483646) AS "error"; +ERROR: negative substring length not allowed +-- T581 regular expression substring (with SQL's bizarre regexp syntax) +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"(b_d)#"%' ESCAPE '#') AS "bcd"; + bcd +----- + bcd +(1 row) + +-- obsolete SQL99 syntax +SELECT SUBSTRING('abcdefg' FROM 'a#"(b_d)#"%' FOR '#') AS "bcd"; + bcd +----- + bcd +(1 row) + +-- No match should return NULL +SELECT SUBSTRING('abcdefg' SIMILAR '#"(b_d)#"%' ESCAPE '#') IS NULL AS "True"; + True +------ + t +(1 row) + +-- Null inputs should return NULL +SELECT SUBSTRING('abcdefg' SIMILAR '%' ESCAPE NULL) IS NULL AS "True"; + True +------ + t +(1 row) + +SELECT SUBSTRING(NULL SIMILAR '%' ESCAPE '#') IS NULL AS "True"; + True +------ + t +(1 row) + +SELECT SUBSTRING('abcdefg' SIMILAR NULL ESCAPE '#') IS NULL AS "True"; + True +------ + t +(1 row) + +-- The first and last parts should act non-greedy +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%#"g' ESCAPE '#') AS "bcdef"; + bcdef +------- + bcdef +(1 row) + +SELECT SUBSTRING('abcdefg' SIMILAR 'a*#"%#"g*' ESCAPE '#') AS "abcdefg"; + abcdefg +--------- + abcdefg +(1 row) + +-- Vertical bar in any part affects only that part +SELECT SUBSTRING('abcdefg' SIMILAR 'a|b#"%#"g' ESCAPE '#') AS "bcdef"; + bcdef +------- + bcdef +(1 row) + +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%#"x|g' ESCAPE '#') AS "bcdef"; + bcdef +------- + bcdef +(1 row) + +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%|ab#"g' ESCAPE '#') AS "bcdef"; + bcdef +------- + bcdef +(1 row) + +-- Can't have more than two part separators +SELECT SUBSTRING('abcdefg' SIMILAR 'a*#"%#"g*#"x' ESCAPE '#') AS "error"; +ERROR: SQL regular expression may not contain more than two escape-double-quote separators +CONTEXT: SQL function "substring" statement 1 +-- Postgres extension: with 0 or 1 separator, assume parts 1 and 3 are empty +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%g' ESCAPE '#') AS "bcdefg"; + bcdefg +-------- + bcdefg +(1 row) + +SELECT SUBSTRING('abcdefg' SIMILAR 'a%g' ESCAPE '#') AS "abcdefg"; + abcdefg +--------- + abcdefg +(1 row) + +-- substring() with just two arguments is not allowed by SQL spec; +-- we accept it, but we interpret the pattern as a POSIX regexp not SQL +SELECT SUBSTRING('abcdefg' FROM 'c.e') AS "cde"; + cde +----- + cde +(1 row) + +-- With a parenthesized subexpression, return only what matches the subexpr +SELECT SUBSTRING('abcdefg' FROM 'b(.*)f') AS "cde"; + cde +----- + cde +(1 row) + +-- Check behavior of SIMILAR TO, which uses largely the same regexp variant +SELECT 'abcdefg' SIMILAR TO '_bcd%' AS true; + true +------ + t +(1 row) + +SELECT 'abcdefg' SIMILAR TO 'bcd%' AS false; + false +------- + f +(1 row) + +SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '#' AS false; + false +------- + f +(1 row) + +SELECT 'abcd%' SIMILAR TO '_bcd#%' ESCAPE '#' AS true; + true +------ + t +(1 row) + +-- Postgres uses '\' as the default escape character, which is not per spec +SELECT 'abcdefg' SIMILAR TO '_bcd\%' AS false; + false +------- + f +(1 row) + +-- and an empty string to mean "no escape", which is also not per spec +SELECT 'abcd\efg' SIMILAR TO '_bcd\%' ESCAPE '' AS true; + true +------ + t +(1 row) + +-- these behaviors are per spec, though: +SELECT 'abcdefg' SIMILAR TO '_bcd%' ESCAPE NULL AS null; + null +------ + +(1 row) + +SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '##' AS error; +ERROR: invalid escape string +HINT: Escape string must be empty or one character. +-- Test back reference in regexp_replace +SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); + regexp_replace +---------------- + (111) 222-3333 +(1 row) + +SELECT regexp_replace('AAA BBB CCC ', E'\\s+', ' ', 'g'); + regexp_replace +---------------- + AAA BBB CCC +(1 row) + +SELECT regexp_replace('AAA', '^|$', 'Z', 'g'); + regexp_replace +---------------- + ZAAAZ +(1 row) + +SELECT regexp_replace('AAA aaa', 'A+', 'Z', 'gi'); + regexp_replace +---------------- + Z Z +(1 row) + +-- invalid regexp option +SELECT regexp_replace('AAA aaa', 'A+', 'Z', 'z'); +ERROR: invalid regular expression option: "z" +-- set so we can tell NULL from empty string +\pset null '\\N' +-- return all matches from regexp +SELECT regexp_matches('foobarbequebaz', $re$(bar)(beque)$re$); + regexp_matches +---------------- + {bar,beque} +(1 row) + +-- test case insensitive +SELECT regexp_matches('foObARbEqUEbAz', $re$(bar)(beque)$re$, 'i'); + regexp_matches +---------------- + {bAR,bEqUE} +(1 row) + +-- global option - more than one match +SELECT regexp_matches('foobarbequebazilbarfbonk', $re$(b[^b]+)(b[^b]+)$re$, 'g'); + regexp_matches +---------------- + {bar,beque} + {bazil,barf} +(2 rows) + +-- empty capture group (matched empty string) +SELECT regexp_matches('foobarbequebaz', $re$(bar)(.*)(beque)$re$); + regexp_matches +---------------- + {bar,"",beque} +(1 row) + +-- no match +SELECT regexp_matches('foobarbequebaz', $re$(bar)(.+)(beque)$re$); + regexp_matches +---------------- +(0 rows) + +-- optional capture group did not match, null entry in array +SELECT regexp_matches('foobarbequebaz', $re$(bar)(.+)?(beque)$re$); + regexp_matches +------------------ + {bar,NULL,beque} +(1 row) + +-- no capture groups +SELECT regexp_matches('foobarbequebaz', $re$barbeque$re$); + regexp_matches +---------------- + {barbeque} +(1 row) + +-- start/end-of-line matches are of zero length +SELECT regexp_matches('foo' || chr(10) || 'bar' || chr(10) || 'bequq' || chr(10) || 'baz', '^', 'mg'); + regexp_matches +---------------- + {""} + {""} + {""} + {""} +(4 rows) + +SELECT regexp_matches('foo' || chr(10) || 'bar' || chr(10) || 'bequq' || chr(10) || 'baz', '$', 'mg'); + regexp_matches +---------------- + {""} + {""} + {""} + {""} +(4 rows) + +SELECT regexp_matches('1' || chr(10) || '2' || chr(10) || '3' || chr(10) || '4' || chr(10), '^.?', 'mg'); + regexp_matches +---------------- + {1} + {2} + {3} + {4} + {""} +(5 rows) + +SELECT regexp_matches(chr(10) || '1' || chr(10) || '2' || chr(10) || '3' || chr(10) || '4' || chr(10), '.?$', 'mg'); + regexp_matches +---------------- + {""} + {1} + {""} + {2} + {""} + {3} + {""} + {4} + {""} + {""} +(10 rows) + +SELECT regexp_matches(chr(10) || '1' || chr(10) || '2' || chr(10) || '3' || chr(10) || '4', '.?$', 'mg'); + regexp_matches +---------------- + {""} + {1} + {""} + {2} + {""} + {3} + {""} + {4} + {""} +(9 rows) + +-- give me errors +SELECT regexp_matches('foobarbequebaz', $re$(bar)(beque)$re$, 'gz'); +ERROR: invalid regular expression option: "z" +SELECT regexp_matches('foobarbequebaz', $re$(barbeque$re$); +ERROR: invalid regular expression: parentheses () not balanced +SELECT regexp_matches('foobarbequebaz', $re$(bar)(beque){2,1}$re$); +ERROR: invalid regular expression: invalid repetition count(s) +-- split string on regexp +SELECT foo, length(foo) FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', $re$\s+$re$) AS foo; + foo | length +-------+-------- + the | 3 + quick | 5 + brown | 5 + fox | 3 + jumps | 5 + over | 4 + the | 3 + lazy | 4 + dog | 3 +(9 rows) + +SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', $re$\s+$re$); + regexp_split_to_array +----------------------------------------------- + {the,quick,brown,fox,jumps,over,the,lazy,dog} +(1 row) + +SELECT foo, length(foo) FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', $re$\s*$re$) AS foo; + foo | length +-----+-------- + t | 1 + h | 1 + e | 1 + q | 1 + u | 1 + i | 1 + c | 1 + k | 1 + b | 1 + r | 1 + o | 1 + w | 1 + n | 1 + f | 1 + o | 1 + x | 1 + j | 1 + u | 1 + m | 1 + p | 1 + s | 1 + o | 1 + v | 1 + e | 1 + r | 1 + t | 1 + h | 1 + e | 1 + l | 1 + a | 1 + z | 1 + y | 1 + d | 1 + o | 1 + g | 1 +(35 rows) + +SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', $re$\s*$re$); + regexp_split_to_array +------------------------------------------------------------------------- + {t,h,e,q,u,i,c,k,b,r,o,w,n,f,o,x,j,u,m,p,s,o,v,e,r,t,h,e,l,a,z,y,d,o,g} +(1 row) + +SELECT foo, length(foo) FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', '') AS foo; + foo | length +-----+-------- + t | 1 + h | 1 + e | 1 + | 1 + q | 1 + u | 1 + i | 1 + c | 1 + k | 1 + | 1 + b | 1 + r | 1 + o | 1 + w | 1 + n | 1 + | 1 + f | 1 + o | 1 + x | 1 + | 1 + j | 1 + u | 1 + m | 1 + p | 1 + s | 1 + | 1 + o | 1 + v | 1 + e | 1 + r | 1 + | 1 + t | 1 + h | 1 + e | 1 + | 1 + l | 1 + a | 1 + z | 1 + y | 1 + | 1 + d | 1 + o | 1 + g | 1 +(43 rows) + +SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', ''); + regexp_split_to_array +--------------------------------------------------------------------------------------------------------- + {t,h,e," ",q,u,i,c,k," ",b,r,o,w,n," ",f,o,x," ",j,u,m,p,s," ",o,v,e,r," ",t,h,e," ",l,a,z,y," ",d,o,g} +(1 row) + +-- case insensitive +SELECT foo, length(foo) FROM regexp_split_to_table('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'i') AS foo; + foo | length +---------------------------+-------- + th | 2 + QUick bROWn FOx jUMPs ov | 25 + r Th | 4 + lazy dOG | 9 +(4 rows) + +SELECT regexp_split_to_array('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'i'); + regexp_split_to_array +----------------------------------------------------- + {th," QUick bROWn FOx jUMPs ov","r Th"," lazy dOG"} +(1 row) + +-- no match of pattern +SELECT foo, length(foo) FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', 'nomatch') AS foo; + foo | length +---------------------------------------------+-------- + the quick brown fox jumps over the lazy dog | 43 +(1 row) + +SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', 'nomatch'); + regexp_split_to_array +------------------------------------------------- + {"the quick brown fox jumps over the lazy dog"} +(1 row) + +-- some corner cases +SELECT regexp_split_to_array('123456','1'); + regexp_split_to_array +----------------------- + {"",23456} +(1 row) + +SELECT regexp_split_to_array('123456','6'); + regexp_split_to_array +----------------------- + {12345,""} +(1 row) + +SELECT regexp_split_to_array('123456','.'); + regexp_split_to_array +------------------------ + {"","","","","","",""} +(1 row) + +SELECT regexp_split_to_array('123456',''); + regexp_split_to_array +----------------------- + {1,2,3,4,5,6} +(1 row) + +SELECT regexp_split_to_array('123456','(?:)'); + regexp_split_to_array +----------------------- + {1,2,3,4,5,6} +(1 row) + +SELECT regexp_split_to_array('1',''); + regexp_split_to_array +----------------------- + {1} +(1 row) + +-- errors +SELECT foo, length(foo) FROM regexp_split_to_table('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'zippy') AS foo; +ERROR: invalid regular expression option: "z" +SELECT regexp_split_to_array('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'iz'); +ERROR: invalid regular expression option: "z" +-- global option meaningless for regexp_split +SELECT foo, length(foo) FROM regexp_split_to_table('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'g') AS foo; +ERROR: regexp_split_to_table() does not support the "global" option +SELECT regexp_split_to_array('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'g'); +ERROR: regexp_split_to_array() does not support the "global" option +-- change NULL-display back +\pset null '' +-- E021-11 position expression +SELECT POSITION('4' IN '1234567890') = '4' AS "4"; + 4 +--- + t +(1 row) + +SELECT POSITION('5' IN '1234567890') = '5' AS "5"; + 5 +--- + t +(1 row) + +-- T312 character overlay function +SELECT OVERLAY('abcdef' PLACING '45' FROM 4) AS "abc45f"; + abc45f +-------- + abc45f +(1 row) + +SELECT OVERLAY('yabadoo' PLACING 'daba' FROM 5) AS "yabadaba"; + yabadaba +---------- + yabadaba +(1 row) + +SELECT OVERLAY('yabadoo' PLACING 'daba' FROM 5 FOR 0) AS "yabadabadoo"; + yabadabadoo +------------- + yabadabadoo +(1 row) + +SELECT OVERLAY('babosa' PLACING 'ubb' FROM 2 FOR 4) AS "bubba"; + bubba +------- + bubba +(1 row) + +-- +-- test LIKE +-- Be sure to form every test as a LIKE/NOT LIKE pair. +-- +-- simplest examples +-- E061-04 like predicate +SELECT 'hawkeye' LIKE 'h%' AS "true"; + true +------ + t +(1 row) + +SELECT 'hawkeye' NOT LIKE 'h%' AS "false"; + false +------- + f +(1 row) + +SELECT 'hawkeye' LIKE 'H%' AS "false"; + false +------- + f +(1 row) + +SELECT 'hawkeye' NOT LIKE 'H%' AS "true"; + true +------ + t +(1 row) + +SELECT 'hawkeye' LIKE 'indio%' AS "false"; + false +------- + f +(1 row) + +SELECT 'hawkeye' NOT LIKE 'indio%' AS "true"; + true +------ + t +(1 row) + +SELECT 'hawkeye' LIKE 'h%eye' AS "true"; + true +------ + t +(1 row) + +SELECT 'hawkeye' NOT LIKE 'h%eye' AS "false"; + false +------- + f +(1 row) + +SELECT 'indio' LIKE '_ndio' AS "true"; + true +------ + t +(1 row) + +SELECT 'indio' NOT LIKE '_ndio' AS "false"; + false +------- + f +(1 row) + +SELECT 'indio' LIKE 'in__o' AS "true"; + true +------ + t +(1 row) + +SELECT 'indio' NOT LIKE 'in__o' AS "false"; + false +------- + f +(1 row) + +SELECT 'indio' LIKE 'in_o' AS "false"; + false +------- + f +(1 row) + +SELECT 'indio' NOT LIKE 'in_o' AS "true"; + true +------ + t +(1 row) + +SELECT 'abc'::name LIKE '_b_' AS "true"; + true +------ + t +(1 row) + +SELECT 'abc'::name NOT LIKE '_b_' AS "false"; + false +------- + f +(1 row) + +SELECT 'abc'::bytea LIKE '_b_'::bytea AS "true"; + true +------ + t +(1 row) + +SELECT 'abc'::bytea NOT LIKE '_b_'::bytea AS "false"; + false +------- + f +(1 row) + +-- unused escape character +SELECT 'hawkeye' LIKE 'h%' ESCAPE '#' AS "true"; + true +------ + t +(1 row) + +SELECT 'hawkeye' NOT LIKE 'h%' ESCAPE '#' AS "false"; + false +------- + f +(1 row) + +SELECT 'indio' LIKE 'ind_o' ESCAPE '$' AS "true"; + true +------ + t +(1 row) + +SELECT 'indio' NOT LIKE 'ind_o' ESCAPE '$' AS "false"; + false +------- + f +(1 row) + +-- escape character +-- E061-05 like predicate with escape clause +SELECT 'h%' LIKE 'h#%' ESCAPE '#' AS "true"; + true +------ + t +(1 row) + +SELECT 'h%' NOT LIKE 'h#%' ESCAPE '#' AS "false"; + false +------- + f +(1 row) + +SELECT 'h%wkeye' LIKE 'h#%' ESCAPE '#' AS "false"; + false +------- + f +(1 row) + +SELECT 'h%wkeye' NOT LIKE 'h#%' ESCAPE '#' AS "true"; + true +------ + t +(1 row) + +SELECT 'h%wkeye' LIKE 'h#%%' ESCAPE '#' AS "true"; + true +------ + t +(1 row) + +SELECT 'h%wkeye' NOT LIKE 'h#%%' ESCAPE '#' AS "false"; + false +------- + f +(1 row) + +SELECT 'h%awkeye' LIKE 'h#%a%k%e' ESCAPE '#' AS "true"; + true +------ + t +(1 row) + +SELECT 'h%awkeye' NOT LIKE 'h#%a%k%e' ESCAPE '#' AS "false"; + false +------- + f +(1 row) + +SELECT 'indio' LIKE '_ndio' ESCAPE '$' AS "true"; + true +------ + t +(1 row) + +SELECT 'indio' NOT LIKE '_ndio' ESCAPE '$' AS "false"; + false +------- + f +(1 row) + +SELECT 'i_dio' LIKE 'i$_d_o' ESCAPE '$' AS "true"; + true +------ + t +(1 row) + +SELECT 'i_dio' NOT LIKE 'i$_d_o' ESCAPE '$' AS "false"; + false +------- + f +(1 row) + +SELECT 'i_dio' LIKE 'i$_nd_o' ESCAPE '$' AS "false"; + false +------- + f +(1 row) + +SELECT 'i_dio' NOT LIKE 'i$_nd_o' ESCAPE '$' AS "true"; + true +------ + t +(1 row) + +SELECT 'i_dio' LIKE 'i$_d%o' ESCAPE '$' AS "true"; + true +------ + t +(1 row) + +SELECT 'i_dio' NOT LIKE 'i$_d%o' ESCAPE '$' AS "false"; + false +------- + f +(1 row) + +SELECT 'a_c'::bytea LIKE 'a$__'::bytea ESCAPE '$'::bytea AS "true"; + true +------ + t +(1 row) + +SELECT 'a_c'::bytea NOT LIKE 'a$__'::bytea ESCAPE '$'::bytea AS "false"; + false +------- + f +(1 row) + +-- escape character same as pattern character +SELECT 'maca' LIKE 'm%aca' ESCAPE '%' AS "true"; + true +------ + t +(1 row) + +SELECT 'maca' NOT LIKE 'm%aca' ESCAPE '%' AS "false"; + false +------- + f +(1 row) + +SELECT 'ma%a' LIKE 'm%a%%a' ESCAPE '%' AS "true"; + true +------ + t +(1 row) + +SELECT 'ma%a' NOT LIKE 'm%a%%a' ESCAPE '%' AS "false"; + false +------- + f +(1 row) + +SELECT 'bear' LIKE 'b_ear' ESCAPE '_' AS "true"; + true +------ + t +(1 row) + +SELECT 'bear' NOT LIKE 'b_ear' ESCAPE '_' AS "false"; + false +------- + f +(1 row) + +SELECT 'be_r' LIKE 'b_e__r' ESCAPE '_' AS "true"; + true +------ + t +(1 row) + +SELECT 'be_r' NOT LIKE 'b_e__r' ESCAPE '_' AS "false"; + false +------- + f +(1 row) + +SELECT 'be_r' LIKE '__e__r' ESCAPE '_' AS "false"; + false +------- + f +(1 row) + +SELECT 'be_r' NOT LIKE '__e__r' ESCAPE '_' AS "true"; + true +------ + t +(1 row) + +-- +-- test ILIKE (case-insensitive LIKE) +-- Be sure to form every test as an ILIKE/NOT ILIKE pair. +-- +SELECT 'hawkeye' ILIKE 'h%' AS "true"; + true +------ + t +(1 row) + +SELECT 'hawkeye' NOT ILIKE 'h%' AS "false"; + false +------- + f +(1 row) + +SELECT 'hawkeye' ILIKE 'H%' AS "true"; + true +------ + t +(1 row) + +SELECT 'hawkeye' NOT ILIKE 'H%' AS "false"; + false +------- + f +(1 row) + +SELECT 'hawkeye' ILIKE 'H%Eye' AS "true"; + true +------ + t +(1 row) + +SELECT 'hawkeye' NOT ILIKE 'H%Eye' AS "false"; + false +------- + f +(1 row) + +SELECT 'Hawkeye' ILIKE 'h%' AS "true"; + true +------ + t +(1 row) + +SELECT 'Hawkeye' NOT ILIKE 'h%' AS "false"; + false +------- + f +(1 row) + +SELECT 'ABC'::name ILIKE '_b_' AS "true"; + true +------ + t +(1 row) + +SELECT 'ABC'::name NOT ILIKE '_b_' AS "false"; + false +------- + f +(1 row) + +-- +-- test %/_ combination cases, cf bugs #4821 and #5478 +-- +SELECT 'foo' LIKE '_%' as t, 'f' LIKE '_%' as t, '' LIKE '_%' as f; + t | t | f +---+---+--- + t | t | f +(1 row) + +SELECT 'foo' LIKE '%_' as t, 'f' LIKE '%_' as t, '' LIKE '%_' as f; + t | t | f +---+---+--- + t | t | f +(1 row) + +SELECT 'foo' LIKE '__%' as t, 'foo' LIKE '___%' as t, 'foo' LIKE '____%' as f; + t | t | f +---+---+--- + t | t | f +(1 row) + +SELECT 'foo' LIKE '%__' as t, 'foo' LIKE '%___' as t, 'foo' LIKE '%____' as f; + t | t | f +---+---+--- + t | t | f +(1 row) + +SELECT 'jack' LIKE '%____%' AS t; + t +--- + t +(1 row) + +-- +-- basic tests of LIKE with indexes +-- +CREATE TABLE texttest (a text PRIMARY KEY, b int); +SELECT * FROM texttest WHERE a LIKE '%1%'; + a | b +---+--- +(0 rows) + +CREATE TABLE byteatest (a bytea PRIMARY KEY, b int); +SELECT * FROM byteatest WHERE a LIKE '%1%'; + a | b +---+--- +(0 rows) + +DROP TABLE texttest, byteatest; +-- +-- test implicit type conversion +-- +-- E021-07 character concatenation +SELECT 'unknown' || ' and unknown' AS "Concat unknown types"; + Concat unknown types +---------------------- + unknown and unknown +(1 row) + +SELECT text 'text' || ' and unknown' AS "Concat text to unknown type"; + Concat text to unknown type +----------------------------- + text and unknown +(1 row) + +SELECT char(20) 'characters' || ' and text' AS "Concat char to unknown type"; + Concat char to unknown type +----------------------------- + characters and text +(1 row) + +SELECT text 'text' || char(20) ' and characters' AS "Concat text to char"; + Concat text to char +--------------------- + text and characters +(1 row) + +SELECT text 'text' || varchar ' and varchar' AS "Concat text to varchar"; + Concat text to varchar +------------------------ + text and varchar +(1 row) + +-- +-- test substr with toasted text values +-- +CREATE TABLE toasttest(f1 text); +insert into toasttest values(repeat('1234567890',10000)); +insert into toasttest values(repeat('1234567890',10000)); +-- +-- Ensure that some values are uncompressed, to test the faster substring +-- operation used in that case +-- +alter table toasttest alter column f1 set storage external; +insert into toasttest values(repeat('1234567890',10000)); +insert into toasttest values(repeat('1234567890',10000)); +-- If the starting position is zero or less, then return from the start of the string +-- adjusting the length to be consistent with the "negative start" per SQL. +SELECT substr(f1, -1, 5) from toasttest; + substr +-------- + 123 + 123 + 123 + 123 +(4 rows) + +-- If the length is less than zero, an ERROR is thrown. +SELECT substr(f1, 5, -1) from toasttest; +ERROR: negative substring length not allowed +-- If no third argument (length) is provided, the length to the end of the +-- string is assumed. +SELECT substr(f1, 99995) from toasttest; + substr +-------- + 567890 + 567890 + 567890 + 567890 +(4 rows) + +-- If start plus length is > string length, the result is truncated to +-- string length +SELECT substr(f1, 99995, 10) from toasttest; + substr +-------- + 567890 + 567890 + 567890 + 567890 +(4 rows) + +-- GPDB: These tests are sensitive to block size. In GPDB, the block +-- size is 32 kB, whereas in PostgreSQL it's 8kB. Therefore make +-- the data 4x larger here. +TRUNCATE TABLE toasttest; +INSERT INTO toasttest values (repeat('1234567890',300*4)); +INSERT INTO toasttest values (repeat('1234567890',300*4)); +INSERT INTO toasttest values (repeat('1234567890',300*4)); +INSERT INTO toasttest values (repeat('1234567890',300*4)); +-- expect >0 blocks +SELECT pg_relation_size(reltoastrelid) = 0 AS is_empty + FROM pg_class where relname = 'toasttest'; + is_empty +---------- + f +(1 row) + +TRUNCATE TABLE toasttest; +ALTER TABLE toasttest set (toast_tuple_target = 4080); +INSERT INTO toasttest values (repeat('1234567890',300)); +INSERT INTO toasttest values (repeat('1234567890',300)); +INSERT INTO toasttest values (repeat('1234567890',300)); +INSERT INTO toasttest values (repeat('1234567890',300)); +-- expect 0 blocks +SELECT pg_relation_size(reltoastrelid) = 0 AS is_empty + FROM pg_class where relname = 'toasttest'; + is_empty +---------- + t +(1 row) + +DROP TABLE toasttest; +-- +-- test substr with toasted bytea values +-- +CREATE TABLE toasttest(f1 bytea); +insert into toasttest values("decode"(repeat('1234567890',10000),'escape')); +insert into toasttest values(pg_catalog.decode(repeat('1234567890',10000),'escape')); +-- +-- Ensure that some values are uncompressed, to test the faster substring +-- operation used in that case +-- +alter table toasttest alter column f1 set storage external; +insert into toasttest values("decode"(repeat('1234567890',10000),'escape')); +insert into toasttest values(pg_catalog.decode(repeat('1234567890',10000),'escape')); +-- If the starting position is zero or less, then return from the start of the string +-- adjusting the length to be consistent with the "negative start" per SQL. +SELECT substr(f1, -1, 5) from toasttest; + substr +-------- + 123 + 123 + 123 + 123 +(4 rows) + +-- If the length is less than zero, an ERROR is thrown. +SELECT substr(f1, 5, -1) from toasttest; +ERROR: negative substring length not allowed +-- If no third argument (length) is provided, the length to the end of the +-- string is assumed. +SELECT substr(f1, 99995) from toasttest; + substr +-------- + 567890 + 567890 + 567890 + 567890 +(4 rows) + +-- If start plus length is > string length, the result is truncated to +-- string length +SELECT substr(f1, 99995, 10) from toasttest; + substr +-------- + 567890 + 567890 + 567890 + 567890 +(4 rows) + +DROP TABLE toasttest; +-- test internally compressing datums +-- this tests compressing a datum to a very small size which exercises a +-- corner case in packed-varlena handling: even though small, the compressed +-- datum must be given a 4-byte header because there are no bits to indicate +-- compression in a 1-byte header +CREATE TABLE toasttest (c char(4096)); +INSERT INTO toasttest VALUES('x'); +SELECT length(c), c::text FROM toasttest; + length | c +--------+--- + 1 | x +(1 row) + +SELECT c FROM toasttest; + c +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + x +(1 row) + +DROP TABLE toasttest; +-- +-- test length +-- +SELECT length('abcdef') AS "length_6"; + length_6 +---------- + 6 +(1 row) + +-- +-- test strpos +-- +SELECT strpos('abcdef', 'cd') AS "pos_3"; + pos_3 +------- + 3 +(1 row) + +SELECT strpos('abcdef', 'xy') AS "pos_0"; + pos_0 +------- + 0 +(1 row) + +SELECT strpos('abcdef', '') AS "pos_1"; + pos_1 +------- + 1 +(1 row) + +SELECT strpos('', 'xy') AS "pos_0"; + pos_0 +------- + 0 +(1 row) + +SELECT strpos('', '') AS "pos_1"; + pos_1 +------- + 1 +(1 row) + +-- +-- test replace +-- +SELECT replace('abcdef', 'de', '45') AS "abc45f"; + abc45f +-------- + abc45f +(1 row) + +SELECT replace('yabadabadoo', 'ba', '123') AS "ya123da123doo"; + ya123da123doo +--------------- + ya123da123doo +(1 row) + +SELECT replace('yabadoo', 'bad', '') AS "yaoo"; + yaoo +------ + yaoo +(1 row) + +-- +-- test split_part +-- +select split_part('','@',1) AS "empty string"; + empty string +-------------- + +(1 row) + +select split_part('','@',-1) AS "empty string"; + empty string +-------------- + +(1 row) + +select split_part('joeuser@mydatabase','',1) AS "joeuser@mydatabase"; + joeuser@mydatabase +-------------------- + joeuser@mydatabase +(1 row) + +select split_part('joeuser@mydatabase','',2) AS "empty string"; + empty string +-------------- + +(1 row) + +select split_part('joeuser@mydatabase','',-1) AS "joeuser@mydatabase"; + joeuser@mydatabase +-------------------- + joeuser@mydatabase +(1 row) + +select split_part('joeuser@mydatabase','',-2) AS "empty string"; + empty string +-------------- + +(1 row) + +select split_part('joeuser@mydatabase','@',0) AS "an error"; +ERROR: field position must not be zero +select split_part('joeuser@mydatabase','@@',1) AS "joeuser@mydatabase"; + joeuser@mydatabase +-------------------- + joeuser@mydatabase +(1 row) + +select split_part('joeuser@mydatabase','@@',2) AS "empty string"; + empty string +-------------- + +(1 row) + +select split_part('joeuser@mydatabase','@',1) AS "joeuser"; + joeuser +--------- + joeuser +(1 row) + +select split_part('joeuser@mydatabase','@',2) AS "mydatabase"; + mydatabase +------------ + mydatabase +(1 row) + +select split_part('joeuser@mydatabase','@',3) AS "empty string"; + empty string +-------------- + +(1 row) + +select split_part('@joeuser@mydatabase@','@',2) AS "joeuser"; + joeuser +--------- + joeuser +(1 row) + +select split_part('joeuser@mydatabase','@',-1) AS "mydatabase"; + mydatabase +------------ + mydatabase +(1 row) + +select split_part('joeuser@mydatabase','@',-2) AS "joeuser"; + joeuser +--------- + joeuser +(1 row) + +select split_part('joeuser@mydatabase','@',-3) AS "empty string"; + empty string +-------------- + +(1 row) + +select split_part('@joeuser@mydatabase@','@',-2) AS "mydatabase"; + mydatabase +------------ + mydatabase +(1 row) + +-- +-- test to_hex +-- +select to_hex(256*256*256 - 1) AS "ffffff"; + ffffff +-------- + ffffff +(1 row) + +select to_hex(256::bigint*256::bigint*256::bigint*256::bigint - 1) AS "ffffffff"; + ffffffff +---------- + ffffffff +(1 row) + +-- +-- MD5 test suite - from IETF RFC 1321 +-- (see: ftp://ftp.rfc-editor.org/in-notes/rfc1321.txt) +-- +select md5('') = 'd41d8cd98f00b204e9800998ecf8427e' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('a') = '0cc175b9c0f1b6a831c399e269772661' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('abc') = '900150983cd24fb0d6963f7d28e17f72' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('message digest') = 'f96b697d7cb7938d525a2f31aaf161d0' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('abcdefghijklmnopqrstuvwxyz') = 'c3fcd3d76192e4007dfb496cca67e13b' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') = 'd174ab98d277d9f5a5611c2c9f419d9f' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890') = '57edf4a22be3c955ac49da2e2107b67a' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5(''::bytea) = 'd41d8cd98f00b204e9800998ecf8427e' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('a'::bytea) = '0cc175b9c0f1b6a831c399e269772661' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('abc'::bytea) = '900150983cd24fb0d6963f7d28e17f72' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('message digest'::bytea) = 'f96b697d7cb7938d525a2f31aaf161d0' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('abcdefghijklmnopqrstuvwxyz'::bytea) = 'c3fcd3d76192e4007dfb496cca67e13b' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'::bytea) = 'd174ab98d277d9f5a5611c2c9f419d9f' AS "TRUE"; + TRUE +------ + t +(1 row) + +select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890'::bytea) = '57edf4a22be3c955ac49da2e2107b67a' AS "TRUE"; + TRUE +------ + t +(1 row) + +-- +-- SHA-2 +-- +SET bytea_output TO hex; +SELECT sha224(''); + sha224 +------------------------------------------------------------ + \xd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f +(1 row) + +SELECT sha224('The quick brown fox jumps over the lazy dog.'); + sha224 +------------------------------------------------------------ + \x619cba8e8e05826e9b8c519c0a5c68f4fb653e8a3d8aa04bb2c8cd4c +(1 row) + +SELECT sha256(''); + sha256 +-------------------------------------------------------------------- + \xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +(1 row) + +SELECT sha256('The quick brown fox jumps over the lazy dog.'); + sha256 +-------------------------------------------------------------------- + \xef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c +(1 row) + +SELECT sha384(''); + sha384 +---------------------------------------------------------------------------------------------------- + \x38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b +(1 row) + +SELECT sha384('The quick brown fox jumps over the lazy dog.'); + sha384 +---------------------------------------------------------------------------------------------------- + \xed892481d8272ca6df370bf706e4d7bc1b5739fa2177aae6c50e946678718fc67a7af2819a021c2fc34e91bdb63409d7 +(1 row) + +SELECT sha512(''); + sha512 +------------------------------------------------------------------------------------------------------------------------------------ + \xcf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e +(1 row) + +SELECT sha512('The quick brown fox jumps over the lazy dog.'); + sha512 +------------------------------------------------------------------------------------------------------------------------------------ + \x91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bbc6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed +(1 row) + +-- +-- encode/decode +-- +SELECT encode('\x1234567890abcdef00', 'hex'); + encode +-------------------- + 1234567890abcdef00 +(1 row) + +SELECT decode('1234567890abcdef00', 'hex'); + decode +---------------------- + \x1234567890abcdef00 +(1 row) + +SELECT encode(('\x' || repeat('1234567890abcdef0001', 7))::bytea, 'base64'); + encode +------------------------------------------------------------------------------ + EjRWeJCrze8AARI0VniQq83vAAESNFZ4kKvN7wABEjRWeJCrze8AARI0VniQq83vAAESNFZ4kKvN+ + 7wABEjRWeJCrze8AAQ== +(1 row) + +SELECT decode(encode(('\x' || repeat('1234567890abcdef0001', 7))::bytea, + 'base64'), 'base64'); + decode +------------------------------------------------------------------------------------------------------------------------------------------------ + \x1234567890abcdef00011234567890abcdef00011234567890abcdef00011234567890abcdef00011234567890abcdef00011234567890abcdef00011234567890abcdef0001 +(1 row) + +SELECT encode('\x1234567890abcdef00', 'escape'); + encode +----------------------------- + \x124Vx\220\253\315\357\000 +(1 row) + +SELECT decode(encode('\x1234567890abcdef00', 'escape'), 'escape'); + decode +---------------------- + \x1234567890abcdef00 +(1 row) + +-- +-- get_bit/set_bit etc +-- +SELECT get_bit('\x1234567890abcdef00'::bytea, 43); + get_bit +--------- + 1 +(1 row) + +SELECT get_bit('\x1234567890abcdef00'::bytea, 99); -- error +ERROR: index 99 out of valid range, 0..71 +SELECT set_bit('\x1234567890abcdef00'::bytea, 43, 0); + set_bit +---------------------- + \x1234567890a3cdef00 +(1 row) + +SELECT set_bit('\x1234567890abcdef00'::bytea, 99, 0); -- error +ERROR: index 99 out of valid range, 0..71 +SELECT get_byte('\x1234567890abcdef00'::bytea, 3); + get_byte +---------- + 120 +(1 row) + +SELECT get_byte('\x1234567890abcdef00'::bytea, 99); -- error +ERROR: index 99 out of valid range, 0..8 +SELECT set_byte('\x1234567890abcdef00'::bytea, 7, 11); + set_byte +---------------------- + \x1234567890abcd0b00 +(1 row) + +SELECT set_byte('\x1234567890abcdef00'::bytea, 99, 11); -- error +ERROR: index 99 out of valid range, 0..8 +-- +-- test behavior of escape_string_warning and standard_conforming_strings options +-- +set escape_string_warning = off; +set standard_conforming_strings = off; +show escape_string_warning; + escape_string_warning +----------------------- + off +(1 row) + +show standard_conforming_strings; + standard_conforming_strings +----------------------------- + off +(1 row) + +set escape_string_warning = on; +set standard_conforming_strings = on; +show escape_string_warning; + escape_string_warning +----------------------- + on +(1 row) + +show standard_conforming_strings; + standard_conforming_strings +----------------------------- + on +(1 row) + +select 'a\bcd' as f1, 'a\b''cd' as f2, 'a\b''''cd' as f3, 'abcd\' as f4, 'ab\''cd' as f5, '\\' as f6; + f1 | f2 | f3 | f4 | f5 | f6 +-------+--------+---------+-------+--------+---- + a\bcd | a\b'cd | a\b''cd | abcd\ | ab\'cd | \\ +(1 row) + +set standard_conforming_strings = off; +select 'a\\bcd' as f1, 'a\\b\'cd' as f2, 'a\\b\'''cd' as f3, 'abcd\\' as f4, 'ab\\\'cd' as f5, '\\\\' as f6; +WARNING: nonstandard use of \\ in a string literal +LINE 1: select 'a\\bcd' as f1, 'a\\b\'cd' as f2, 'a\\b\'''cd' as f3,... + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +WARNING: nonstandard use of \\ in a string literal +LINE 1: select 'a\\bcd' as f1, 'a\\b\'cd' as f2, 'a\\b\'''cd' as f3,... + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +WARNING: nonstandard use of \\ in a string literal +LINE 1: select 'a\\bcd' as f1, 'a\\b\'cd' as f2, 'a\\b\'''cd' as f3,... + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +WARNING: nonstandard use of \\ in a string literal +LINE 1: ...bcd' as f1, 'a\\b\'cd' as f2, 'a\\b\'''cd' as f3, 'abcd\\' ... + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +WARNING: nonstandard use of \\ in a string literal +LINE 1: ...'cd' as f2, 'a\\b\'''cd' as f3, 'abcd\\' as f4, 'ab\\\'cd'... + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. +WARNING: nonstandard use of \\ in a string literal +LINE 1: ...'''cd' as f3, 'abcd\\' as f4, 'ab\\\'cd' as f5, '\\\\' as ... + ^ +HINT: Use the escape string syntax for backslashes, e.g., E'\\'. + f1 | f2 | f3 | f4 | f5 | f6 +-------+--------+---------+-------+--------+---- + a\bcd | a\b'cd | a\b''cd | abcd\ | ab\'cd | \\ +(1 row) + +set escape_string_warning = off; +set standard_conforming_strings = on; +select 'a\bcd' as f1, 'a\b''cd' as f2, 'a\b''''cd' as f3, 'abcd\' as f4, 'ab\''cd' as f5, '\\' as f6; + f1 | f2 | f3 | f4 | f5 | f6 +-------+--------+---------+-------+--------+---- + a\bcd | a\b'cd | a\b''cd | abcd\ | ab\'cd | \\ +(1 row) + +set standard_conforming_strings = off; +select 'a\\bcd' as f1, 'a\\b\'cd' as f2, 'a\\b\'''cd' as f3, 'abcd\\' as f4, 'ab\\\'cd' as f5, '\\\\' as f6; + f1 | f2 | f3 | f4 | f5 | f6 +-------+--------+---------+-------+--------+---- + a\bcd | a\b'cd | a\b''cd | abcd\ | ab\'cd | \\ +(1 row) + +-- +-- test unicode escape +-- +select E'A\u0041' as f1, E'\u0127' as f2; + f1 | f2 +----+---- + AA | ħ +(1 row) + +select E'\u0000'; +ERROR: invalid Unicode escape value at or near "\u0000" +LINE 1: select E'\u0000'; + ^ +select E'\udsfs'; +ERROR: invalid Unicode escape +LINE 1: select E'\udsfs'; + ^ +HINT: Unicode escapes must be \uXXXX or \UXXXXXXXX. +select E'\uD843\uE001'; +ERROR: invalid Unicode surrogate pair at or near "\uE001" +LINE 1: select E'\uD843\uE001'; + ^ +select E'\uDC01'; +ERROR: invalid Unicode surrogate pair at or near "\uDC01" +LINE 1: select E'\uDC01'; + ^ +select E'\uD834'; +ERROR: invalid Unicode surrogate pair at or near "'" +LINE 1: select E'\uD834'; + ^ +reset standard_conforming_strings; +-- +-- Additional string functions +-- +SET bytea_output TO escape; +SELECT initcap('hi THOMAS'); + initcap +----------- + Hi Thomas +(1 row) + +SELECT lpad('hi', 5, 'xy'); + lpad +------- + xyxhi +(1 row) + +SELECT lpad('hi', 5); + lpad +------- + hi +(1 row) + +SELECT lpad('hi', -5, 'xy'); + lpad +------ + +(1 row) + +SELECT lpad('hello', 2); + lpad +------ + he +(1 row) + +SELECT lpad('hi', 5, ''); + lpad +------ + hi +(1 row) + +SELECT rpad('hi', 5, 'xy'); + rpad +------- + hixyx +(1 row) + +SELECT rpad('hi', 5); + rpad +------- + hi +(1 row) + +SELECT rpad('hi', -5, 'xy'); + rpad +------ + +(1 row) + +SELECT rpad('hello', 2); + rpad +------ + he +(1 row) + +SELECT rpad('hi', 5, ''); + rpad +------ + hi +(1 row) + +SELECT ltrim('zzzytrim', 'xyz'); + ltrim +------- + trim +(1 row) + +SELECT translate('', '14', 'ax'); + translate +----------- + +(1 row) + +SELECT translate('12345', '14', 'ax'); + translate +----------- + a23x5 +(1 row) + +SELECT ascii('x'); + ascii +------- + 120 +(1 row) + +SELECT ascii(''); + ascii +------- + 0 +(1 row) + +SELECT chr(65); + chr +----- + A +(1 row) + +SELECT chr(0); +ERROR: null character not permitted +SELECT repeat('Pg', 4); + repeat +---------- + PgPgPgPg +(1 row) + +SELECT repeat('Pg', -4); + repeat +-------- + +(1 row) + +SELECT SUBSTRING('1234567890'::bytea FROM 3) "34567890"; + 34567890 +---------- + 34567890 +(1 row) + +SELECT SUBSTRING('1234567890'::bytea FROM 4 FOR 3) AS "456"; + 456 +----- + 456 +(1 row) + +SELECT SUBSTRING('string'::bytea FROM 2 FOR 2147483646) AS "tring"; + tring +------- + tring +(1 row) + +SELECT SUBSTRING('string'::bytea FROM -10 FOR 2147483646) AS "string"; + string +-------- + string +(1 row) + +SELECT SUBSTRING('string'::bytea FROM -10 FOR -2147483646) AS "error"; +ERROR: negative substring length not allowed +SELECT trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea); + btrim +------- + Tom +(1 row) + +SELECT trim(leading E'\\000'::bytea from E'\\000Tom\\000'::bytea); + ltrim +--------- + Tom\000 +(1 row) + +SELECT trim(trailing E'\\000'::bytea from E'\\000Tom\\000'::bytea); + rtrim +--------- + \000Tom +(1 row) + +SELECT btrim(E'\\000trim\\000'::bytea, E'\\000'::bytea); + btrim +------- + trim +(1 row) + +SELECT btrim(''::bytea, E'\\000'::bytea); + btrim +------- + +(1 row) + +SELECT btrim(E'\\000trim\\000'::bytea, ''::bytea); + btrim +-------------- + \000trim\000 +(1 row) + +SELECT encode(overlay(E'Th\\000omas'::bytea placing E'Th\\001omas'::bytea from 2),'escape'); + encode +------------- + TTh\x01omas +(1 row) + +SELECT encode(overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 8),'escape'); + encode +-------------------- + Th\000omas\x02\x03 +(1 row) + +SELECT encode(overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 5 for 3),'escape'); + encode +----------------- + Th\000o\x02\x03 +(1 row) + +SELECT bit_count('\x1234567890'::bytea); + bit_count +----------- + 15 +(1 row) + +SELECT unistr('\0064at\+0000610'); + unistr +-------- + data0 +(1 row) + +SELECT unistr('d\u0061t\U000000610'); + unistr +-------- + data0 +(1 row) + +SELECT unistr('a\\b'); + unistr +-------- + a\b +(1 row) + +-- errors: +SELECT unistr('wrong: \db99'); +ERROR: invalid Unicode surrogate pair +SELECT unistr('wrong: \db99\0061'); +ERROR: invalid Unicode surrogate pair +SELECT unistr('wrong: \+00db99\+000061'); +ERROR: invalid Unicode surrogate pair +SELECT unistr('wrong: \+2FFFFF'); +ERROR: invalid Unicode code point: 2FFFFF +SELECT unistr('wrong: \udb99\u0061'); +ERROR: invalid Unicode surrogate pair +SELECT unistr('wrong: \U0000db99\U00000061'); +ERROR: invalid Unicode surrogate pair +SELECT unistr('wrong: \U002FFFFF'); +ERROR: invalid Unicode code point: 2FFFFF +SELECT unistr('wrong: \xyz'); +ERROR: invalid Unicode escape +HINT: Unicode escapes must be \XXXX, \+XXXXXX, \uXXXX, or \UXXXXXXXX. +-- Clean up GPDB-added tables +DROP TABLE char_strings_tbl; +DROP TABLE varchar_strings_tbl; +DROP TABLE text_strings_tbl; diff --git a/src/test/singlenode_regress/expected/subscription.out b/src/test/singlenode_regress/expected/subscription.out new file mode 100644 index 00000000000..e1bac50dfe4 --- /dev/null +++ b/src/test/singlenode_regress/expected/subscription.out @@ -0,0 +1,267 @@ +-- +-- SUBSCRIPTION +-- +CREATE ROLE regress_subscription_user LOGIN SUPERUSER; +CREATE ROLE regress_subscription_user2; +CREATE ROLE regress_subscription_user_dummy LOGIN NOSUPERUSER; +SET SESSION AUTHORIZATION 'regress_subscription_user'; +-- fail - no publications +CREATE SUBSCRIPTION regress_testsub CONNECTION 'foo'; +ERROR: syntax error at or near ";" +LINE 1: CREATE SUBSCRIPTION regress_testsub CONNECTION 'foo'; + ^ +-- fail - no connection +CREATE SUBSCRIPTION regress_testsub PUBLICATION foo; +ERROR: syntax error at or near "PUBLICATION" +LINE 1: CREATE SUBSCRIPTION regress_testsub PUBLICATION foo; + ^ +-- fail - cannot do CREATE SUBSCRIPTION CREATE SLOT inside transaction block +BEGIN; +CREATE SUBSCRIPTION regress_testsub CONNECTION 'testconn' PUBLICATION testpub WITH (create_slot); +ERROR: CREATE SUBSCRIPTION ... WITH (create_slot = true) cannot run inside a transaction block +COMMIT; +-- fail - invalid connection string +CREATE SUBSCRIPTION regress_testsub CONNECTION 'testconn' PUBLICATION testpub; +ERROR: invalid connection string syntax: missing "=" after "testconn" in connection info string +-- fail - duplicate publications +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION foo, testpub, foo WITH (connect = false); +ERROR: publication name "foo" used more than once +-- ok +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false); +WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables +COMMENT ON SUBSCRIPTION regress_testsub IS 'test subscription'; +SELECT obj_description(s.oid, 'pg_subscription') FROM pg_subscription s; + obj_description +------------------- + test subscription +(1 row) + +-- fail - name already exists +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false); +ERROR: subscription "regress_testsub" already exists +-- fail - must be superuser +SET SESSION AUTHORIZATION 'regress_subscription_user2'; +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION foo WITH (connect = false); +ERROR: must be superuser to create subscriptions +SET SESSION AUTHORIZATION 'regress_subscription_user'; +-- fail - invalid option combinations +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, copy_data = true); +ERROR: connect = false and copy_data = true are mutually exclusive options +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, enabled = true); +ERROR: connect = false and enabled = true are mutually exclusive options +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, create_slot = true); +ERROR: connect = false and create_slot = true are mutually exclusive options +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = true); +ERROR: slot_name = NONE and enabled = true are mutually exclusive options +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, create_slot = true); +ERROR: slot_name = NONE and create_slot = true are mutually exclusive options +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE); +ERROR: subscription with slot_name = NONE must also set enabled = false +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = false); +ERROR: subscription with slot_name = NONE must also set create_slot = false +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, create_slot = false); +ERROR: subscription with slot_name = NONE must also set enabled = false +-- ok - with slot_name = NONE +CREATE SUBSCRIPTION regress_testsub3 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, connect = false); +WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables +-- fail +ALTER SUBSCRIPTION regress_testsub3 ENABLE; +ERROR: cannot enable subscription that does not have a slot name +ALTER SUBSCRIPTION regress_testsub3 REFRESH PUBLICATION; +ERROR: ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions +DROP SUBSCRIPTION regress_testsub3; +-- fail - invalid connection string +ALTER SUBSCRIPTION regress_testsub CONNECTION 'foobar'; +ERROR: invalid connection string syntax: missing "=" after "foobar" in connection info string +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | off | dbname=regress_doesnotexist +(1 row) + +ALTER SUBSCRIPTION regress_testsub SET PUBLICATION testpub2, testpub3 WITH (refresh = false); +ALTER SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist2'; +ALTER SUBSCRIPTION regress_testsub SET (slot_name = 'newname'); +-- fail +ALTER SUBSCRIPTION regress_testsub SET (slot_name = ''); +ERROR: replication slot name "" is too short +-- fail +ALTER SUBSCRIPTION regress_doesnotexist CONNECTION 'dbname=regress_doesnotexist2'; +ERROR: subscription "regress_doesnotexist" does not exist +ALTER SUBSCRIPTION regress_testsub SET (create_slot = false); +ERROR: unrecognized subscription parameter: "create_slot" +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +-----------------+---------------------------+---------+---------------------+--------+-----------+--------------------+------------------------------ + regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | f | off | dbname=regress_doesnotexist2 +(1 row) + +BEGIN; +ALTER SUBSCRIPTION regress_testsub ENABLE; +\dRs + List of subscriptions + Name | Owner | Enabled | Publication +-----------------+---------------------------+---------+--------------------- + regress_testsub | regress_subscription_user | t | {testpub2,testpub3} +(1 row) + +ALTER SUBSCRIPTION regress_testsub DISABLE; +\dRs + List of subscriptions + Name | Owner | Enabled | Publication +-----------------+---------------------------+---------+--------------------- + regress_testsub | regress_subscription_user | f | {testpub2,testpub3} +(1 row) + +COMMIT; +-- fail - must be owner of subscription +SET ROLE regress_subscription_user_dummy; +ALTER SUBSCRIPTION regress_testsub RENAME TO regress_testsub_dummy; +ERROR: must be owner of subscription regress_testsub +RESET ROLE; +ALTER SUBSCRIPTION regress_testsub RENAME TO regress_testsub_foo; +ALTER SUBSCRIPTION regress_testsub_foo SET (synchronous_commit = local); +ALTER SUBSCRIPTION regress_testsub_foo SET (synchronous_commit = foobar); +ERROR: invalid value for parameter "synchronous_commit": "foobar" +HINT: Available values: local, remote_write, remote_apply, on, off. +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +---------------------+---------------------------+---------+---------------------+--------+-----------+--------------------+------------------------------ + regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | f | local | dbname=regress_doesnotexist2 +(1 row) + +-- rename back to keep the rest simple +ALTER SUBSCRIPTION regress_testsub_foo RENAME TO regress_testsub; +-- fail - new owner must be superuser +ALTER SUBSCRIPTION regress_testsub OWNER TO regress_subscription_user2; +ERROR: permission denied to change owner of subscription "regress_testsub" +HINT: The owner of a subscription must be a superuser. +ALTER ROLE regress_subscription_user2 SUPERUSER; +-- now it works +ALTER SUBSCRIPTION regress_testsub OWNER TO regress_subscription_user2; +-- fail - cannot do DROP SUBSCRIPTION inside transaction block with slot name +BEGIN; +DROP SUBSCRIPTION regress_testsub; +ERROR: DROP SUBSCRIPTION cannot run inside a transaction block +COMMIT; +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); +-- now it works +BEGIN; +DROP SUBSCRIPTION regress_testsub; +COMMIT; +DROP SUBSCRIPTION IF EXISTS regress_testsub; +NOTICE: subscription "regress_testsub" does not exist, skipping +DROP SUBSCRIPTION regress_testsub; -- fail +ERROR: subscription "regress_testsub" does not exist +-- fail - binary must be boolean +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, binary = foo); +ERROR: binary requires a Boolean value +-- now it works +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, binary = true); +WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | t | f | off | dbname=regress_doesnotexist +(1 row) + +ALTER SUBSCRIPTION regress_testsub SET (binary = false); +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | off | dbname=regress_doesnotexist +(1 row) + +DROP SUBSCRIPTION regress_testsub; +-- fail - streaming must be boolean +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = foo); +ERROR: streaming requires a Boolean value +-- now it works +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true); +WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | t | off | dbname=regress_doesnotexist +(1 row) + +ALTER SUBSCRIPTION regress_testsub SET (streaming = false); +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | off | dbname=regress_doesnotexist +(1 row) + +-- fail - publication already exists +ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub WITH (refresh = false); +ERROR: publication "testpub" is already in subscription "regress_testsub" +-- fail - publication used more than once +ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub1 WITH (refresh = false); +ERROR: publication name "testpub1" used more than once +-- ok - add two publications into subscription +ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false); +-- fail - publications already exist +ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false); +ERROR: publication "testpub1" is already in subscription "regress_testsub" +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-----------------------------+--------+-----------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | f | off | dbname=regress_doesnotexist +(1 row) + +-- fail - publication used more then once +ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub1 WITH (refresh = false); +ERROR: publication name "testpub1" used more than once +-- fail - all publications are deleted +ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub, testpub1, testpub2 WITH (refresh = false); +ERROR: cannot drop all the publications from a subscription +-- fail - publication does not exist in subscription +ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub3 WITH (refresh = false); +ERROR: publication "testpub3" is not in subscription "regress_testsub" +-- ok - delete publications +ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub2 WITH (refresh = false); +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | off | dbname=regress_doesnotexist +(1 row) + +DROP SUBSCRIPTION regress_testsub; +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION mypub + WITH (connect = false, create_slot = false, copy_data = false); +WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables +ALTER SUBSCRIPTION regress_testsub ENABLE; +-- fail - ALTER SUBSCRIPTION with refresh is not allowed in a transaction +-- block or function +BEGIN; +ALTER SUBSCRIPTION regress_testsub SET PUBLICATION mypub WITH (refresh = true); +ERROR: ALTER SUBSCRIPTION with refresh cannot run inside a transaction block +END; +BEGIN; +ALTER SUBSCRIPTION regress_testsub REFRESH PUBLICATION; +ERROR: ALTER SUBSCRIPTION ... REFRESH cannot run inside a transaction block +END; +CREATE FUNCTION func() RETURNS VOID AS +$$ ALTER SUBSCRIPTION regress_testsub SET PUBLICATION mypub WITH (refresh = true) $$ LANGUAGE SQL; +SELECT func(); +ERROR: ALTER SUBSCRIPTION with refresh cannot be executed from a function +CONTEXT: SQL function "func" statement 1 +ALTER SUBSCRIPTION regress_testsub DISABLE; +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); +DROP SUBSCRIPTION regress_testsub; +DROP FUNCTION func; +RESET SESSION AUTHORIZATION; +DROP ROLE regress_subscription_user; +DROP ROLE regress_subscription_user2; +DROP ROLE regress_subscription_user_dummy; diff --git a/src/test/singlenode_regress/expected/subselect.out b/src/test/singlenode_regress/expected/subselect.out new file mode 100644 index 00000000000..54a2ba10ace --- /dev/null +++ b/src/test/singlenode_regress/expected/subselect.out @@ -0,0 +1,1907 @@ +-- +-- SUBSELECT +-- +SELECT 1 AS one WHERE 1 IN (SELECT 1); + one +----- + 1 +(1 row) + +SELECT 1 AS zero WHERE 1 NOT IN (SELECT 1); + zero +------ +(0 rows) + +SELECT 1 AS zero WHERE 1 IN (SELECT 2); + zero +------ +(0 rows) + +-- Check grammar's handling of extra parens in assorted contexts +SELECT * FROM (SELECT 1 AS x) ss; + x +--- + 1 +(1 row) + +SELECT * FROM ((SELECT 1 AS x)) ss; + x +--- + 1 +(1 row) + +(SELECT 2) UNION SELECT 2; + ?column? +---------- + 2 +(1 row) + +((SELECT 2)) UNION SELECT 2; + ?column? +---------- + 2 +(1 row) + +SELECT ((SELECT 2) UNION SELECT 2); + ?column? +---------- + 2 +(1 row) + +SELECT (((SELECT 2)) UNION SELECT 2); + ?column? +---------- + 2 +(1 row) + +SELECT (SELECT ARRAY[1,2,3])[1]; + array +------- + 1 +(1 row) + +SELECT ((SELECT ARRAY[1,2,3]))[2]; + array +------- + 2 +(1 row) + +SELECT (((SELECT ARRAY[1,2,3])))[3]; + array +------- + 3 +(1 row) + +-- Set up some simple test tables +CREATE TABLE SUBSELECT_TBL ( + f1 integer, + f2 integer, + f3 float +); +INSERT INTO SUBSELECT_TBL VALUES (1, 2, 3); +INSERT INTO SUBSELECT_TBL VALUES (2, 3, 4); +INSERT INTO SUBSELECT_TBL VALUES (3, 4, 5); +INSERT INTO SUBSELECT_TBL VALUES (1, 1, 1); +INSERT INTO SUBSELECT_TBL VALUES (2, 2, 2); +INSERT INTO SUBSELECT_TBL VALUES (3, 3, 3); +INSERT INTO SUBSELECT_TBL VALUES (6, 7, 8); +INSERT INTO SUBSELECT_TBL VALUES (8, 9, NULL); +SELECT * FROM SUBSELECT_TBL; + f1 | f2 | f3 +----+----+---- + 1 | 2 | 3 + 2 | 3 | 4 + 3 | 4 | 5 + 1 | 1 | 1 + 2 | 2 | 2 + 3 | 3 | 3 + 6 | 7 | 8 + 8 | 9 | +(8 rows) + +-- Uncorrelated subselects +SELECT f1 AS "Constant Select" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT 1); + Constant Select +----------------- + 1 + 1 +(2 rows) + +SELECT f1 AS "Uncorrelated Field" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL); + Uncorrelated Field +-------------------- + 1 + 2 + 3 + 1 + 2 + 3 +(6 rows) + +SELECT f1 AS "Uncorrelated Field" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL WHERE + f2 IN (SELECT f1 FROM SUBSELECT_TBL)); + Uncorrelated Field +-------------------- + 1 + 2 + 3 + 1 + 2 + 3 +(6 rows) + +SELECT f1, f2 + FROM SUBSELECT_TBL + WHERE (f1, f2) NOT IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL + WHERE f3 IS NOT NULL); + f1 | f2 +----+---- + 1 | 2 + 6 | 7 + 8 | 9 +(3 rows) + +-- Correlated subselects +SELECT f1 AS "Correlated Field", f2 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL WHERE f1 = upper.f1); + Correlated Field | Second Field +------------------+-------------- + 1 | 2 + 2 | 3 + 3 | 4 + 1 | 1 + 2 | 2 + 3 | 3 +(6 rows) + +SELECT f1 AS "Correlated Field", f3 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f1 IN + (SELECT f2 FROM SUBSELECT_TBL WHERE CAST(upper.f2 AS float) = f3); + Correlated Field | Second Field +------------------+-------------- + 2 | 4 + 3 | 5 + 1 | 1 + 2 | 2 + 3 | 3 +(5 rows) + +SELECT f1 AS "Correlated Field", f3 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f3 IN (SELECT upper.f1 + f2 FROM SUBSELECT_TBL + WHERE f2 = CAST(f3 AS integer)); + Correlated Field | Second Field +------------------+-------------- + 1 | 3 + 2 | 4 + 3 | 5 + 6 | 8 +(4 rows) + +SELECT f1 AS "Correlated Field" + FROM SUBSELECT_TBL + WHERE (f1, f2) IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL + WHERE f3 IS NOT NULL); + Correlated Field +------------------ + 2 + 3 + 1 + 2 + 3 +(5 rows) + +-- +-- Use some existing tables in the regression test +-- +SELECT ss.f1 AS "Correlated Field", ss.f3 AS "Second Field" + FROM SUBSELECT_TBL ss + WHERE f1 NOT IN (SELECT f1+1 FROM INT4_TBL + WHERE f1 != ss.f1 AND f1 < 2147483647); + Correlated Field | Second Field +------------------+-------------- + 2 | 4 + 3 | 5 + 2 | 2 + 3 | 3 + 6 | 8 + 8 | +(6 rows) + +select q1, float8(count(*)) / (select count(*) from int8_tbl) +from int8_tbl group by q1 order by q1; + q1 | ?column? +------------------+---------- + 123 | 0.4 + 4567890123456789 | 0.6 +(2 rows) + +-- Unspecified-type literals in output columns should resolve as text +SELECT *, pg_typeof(f1) FROM + (SELECT 'foo' AS f1 FROM generate_series(1,3)) ss ORDER BY 1; + f1 | pg_typeof +-----+----------- + foo | text + foo | text + foo | text +(3 rows) + +-- ... unless there's context to suggest differently +explain (verbose, costs off) select '42' union all select '43'; + QUERY PLAN +------------------------------------- + Append + -> Result + Output: '42'::text + -> Result + Output: '43'::text + Optimizer: Postgres query optimizer +(6 rows) + +explain (verbose, costs off) select '42' union all select 43; + QUERY PLAN +------------------------------------- + Append + -> Result + Output: 42 + -> Result + Output: 43 + Optimizer: Postgres query optimizer +(6 rows) + +-- check materialization of an initplan reference (bug #14524) +explain (verbose, costs off) +select 1 = all (select (select 1)); + QUERY PLAN +------------------------------------- + Result + Output: (SubPlan 2) + SubPlan 2 + -> Materialize + Output: ($0) + InitPlan 1 (returns $0) + -> Result + Output: 1 + -> Result + Output: $0 + Optimizer: Postgres query optimizer +(11 rows) + +select 1 = all (select (select 1)); + ?column? +---------- + t +(1 row) + +-- +-- Check EXISTS simplification with LIMIT +-- +explain (costs off) +select * from int4_tbl o where exists + (select 1 from int4_tbl i where i.f1=o.f1 limit null); + QUERY PLAN +------------------------------------- + Hash Semi Join + Hash Cond: (o.f1 = i.f1) + -> Seq Scan on int4_tbl o + -> Hash + -> Seq Scan on int4_tbl i + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) +select * from int4_tbl o where not exists + (select 1 from int4_tbl i where i.f1=o.f1 limit 1); + QUERY PLAN +------------------------------------- + Hash Anti Join + Hash Cond: (o.f1 = i.f1) + -> Seq Scan on int4_tbl o + -> Hash + -> Seq Scan on int4_tbl i + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) +select * from int4_tbl o where exists + (select 1 from int4_tbl i where i.f1=o.f1 limit 0); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +-- +-- Test cases to catch unpleasant interactions between IN-join processing +-- and subquery pullup. +-- +select count(*) from + (select 1 from tenk1 a + where unique1 IN (select hundred from tenk1 b)) ss; + count +------- + 100 +(1 row) + +select count(distinct ss.ten) from + (select ten from tenk1 a + where unique1 IN (select hundred from tenk1 b)) ss; + count +------- + 10 +(1 row) + +select count(*) from + (select 1 from tenk1 a + where unique1 IN (select distinct hundred from tenk1 b)) ss; + count +------- + 100 +(1 row) + +select count(distinct ss.ten) from + (select ten from tenk1 a + where unique1 IN (select distinct hundred from tenk1 b)) ss; + count +------- + 10 +(1 row) + +-- +-- Test cases to check for overenthusiastic optimization of +-- "IN (SELECT DISTINCT ...)" and related cases. Per example from +-- Luca Pireddu and Michael Fuhr. +-- +CREATE TEMP TABLE foo (id integer); +CREATE TEMP TABLE bar (id1 integer, id2 integer); +INSERT INTO foo VALUES (1); +INSERT INTO bar VALUES (1, 1); +INSERT INTO bar VALUES (2, 2); +INSERT INTO bar VALUES (3, 1); +-- These cases require an extra level of distinct-ing above subquery s +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT DISTINCT id1, id2 FROM bar) AS s); + id +---- + 1 +(1 row) + +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT id1,id2 FROM bar GROUP BY id1,id2) AS s); + id +---- + 1 +(1 row) + +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT id1, id2 FROM bar UNION + SELECT id1, id2 FROM bar) AS s); + id +---- + 1 +(1 row) + +-- These cases do not +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT DISTINCT ON (id2) id1, id2 FROM bar) AS s); + id +---- + 1 +(1 row) + +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT id2 FROM bar GROUP BY id2) AS s); + id +---- + 1 +(1 row) + +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT id2 FROM bar UNION + SELECT id2 FROM bar) AS s); + id +---- + 1 +(1 row) + +-- +-- Test case to catch problems with multiply nested sub-SELECTs not getting +-- recalculated properly. Per bug report from Didier Moens. +-- +CREATE TABLE orderstest ( + approver_ref integer, + po_ref integer, + ordercanceled boolean +); +INSERT INTO orderstest VALUES (1, 1, false); +INSERT INTO orderstest VALUES (66, 5, false); +INSERT INTO orderstest VALUES (66, 6, false); +INSERT INTO orderstest VALUES (66, 7, false); +INSERT INTO orderstest VALUES (66, 1, true); +INSERT INTO orderstest VALUES (66, 8, false); +INSERT INTO orderstest VALUES (66, 1, false); +INSERT INTO orderstest VALUES (77, 1, false); +INSERT INTO orderstest VALUES (1, 1, false); +INSERT INTO orderstest VALUES (66, 1, false); +INSERT INTO orderstest VALUES (1, 1, false); +CREATE VIEW orders_view AS +SELECT *, +(SELECT CASE + WHEN ord.approver_ref=1 THEN '---' ELSE 'Approved' + END) AS "Approved", +(SELECT CASE + WHEN ord.ordercanceled + THEN 'Canceled' + ELSE + (SELECT CASE + WHEN ord.po_ref=1 + THEN + (SELECT CASE + WHEN ord.approver_ref=1 + THEN '---' + ELSE 'Approved' + END) + ELSE 'PO' + END) +END) AS "Status", +(CASE + WHEN ord.ordercanceled + THEN 'Canceled' + ELSE + (CASE + WHEN ord.po_ref=1 + THEN + (CASE + WHEN ord.approver_ref=1 + THEN '---' + ELSE 'Approved' + END) + ELSE 'PO' + END) +END) AS "Status_OK" +FROM orderstest ord; +SELECT * FROM orders_view; + approver_ref | po_ref | ordercanceled | Approved | Status | Status_OK +--------------+--------+---------------+----------+----------+----------- + 1 | 1 | f | --- | --- | --- + 66 | 5 | f | Approved | PO | PO + 66 | 6 | f | Approved | PO | PO + 66 | 7 | f | Approved | PO | PO + 66 | 1 | t | Approved | Canceled | Canceled + 66 | 8 | f | Approved | PO | PO + 66 | 1 | f | Approved | Approved | Approved + 77 | 1 | f | Approved | Approved | Approved + 1 | 1 | f | --- | --- | --- + 66 | 1 | f | Approved | Approved | Approved + 1 | 1 | f | --- | --- | --- +(11 rows) + +DROP TABLE orderstest cascade; +NOTICE: drop cascades to view orders_view +-- +-- Test cases to catch situations where rule rewriter fails to propagate +-- hasSubLinks flag correctly. Per example from Kyle Bateman. +-- +create temp table parts ( + partnum text, + cost float8 +); +create temp table shipped ( + ttype char(2), + ordnum int4, + partnum text, + value float8 +); +create temp view shipped_view as + select * from shipped where ttype = 'wt'; +create rule shipped_view_insert as on insert to shipped_view do instead + insert into shipped values('wt', new.ordnum, new.partnum, new.value); +insert into parts (partnum, cost) values (1, 1234.56); +insert into shipped_view (ordnum, partnum, value) + values (0, 1, (select cost from parts where partnum = '1')); +select * from shipped_view; + ttype | ordnum | partnum | value +-------+--------+---------+--------- + wt | 0 | 1 | 1234.56 +(1 row) + +create rule shipped_view_update as on update to shipped_view do instead + update shipped set partnum = new.partnum, value = new.value + where ttype = new.ttype and ordnum = new.ordnum; +update shipped_view set value = 11 + from int4_tbl a join int4_tbl b + on (a.f1 = (select f1 from int4_tbl c where c.f1=b.f1)) + where ordnum = a.f1; +select * from shipped_view; + ttype | ordnum | partnum | value +-------+--------+---------+------- + wt | 0 | 1 | 11 +(1 row) + +select f1, ss1 as relabel from + (select *, (select sum(f1) from int4_tbl b where f1 >= a.f1) as ss1 + from int4_tbl a) ss; + f1 | relabel +-------------+------------ + 0 | 2147607103 + 123456 | 2147607103 + -123456 | 2147483647 + 2147483647 | 2147483647 + -2147483647 | 0 +(5 rows) + +-- +-- Test cases involving PARAM_EXEC parameters and min/max index optimizations. +-- Per bug report from David Sanchez i Gregori. +-- +select * from ( + select max(unique1) from tenk1 as a + where exists (select 1 from tenk1 as b where b.thousand = a.unique2) +) ss; + max +------ + 9997 +(1 row) + +select * from ( + select min(unique1) from tenk1 as a + where not exists (select 1 from tenk1 as b where b.unique2 = 10000) +) ss; + min +----- + 0 +(1 row) + +-- +-- Test that an IN implemented using a UniquePath does unique-ification +-- with the right semantics, as per bug #4113. (Unfortunately we have +-- no simple way to ensure that this test case actually chooses that type +-- of plan, but it does in releases 7.4-8.3. Note that an ordering difference +-- here might mean that some other plan type is being used, rendering the test +-- pointless.) +-- +create temp table numeric_table (num_col numeric); +insert into numeric_table values (1), (1.000000000000000000001), (2), (3); +create temp table float_table (float_col float8); +insert into float_table values (1), (2), (3); +select * from float_table + where float_col in (select num_col from numeric_table); + float_col +----------- + 1 + 2 + 3 +(3 rows) + +select * from numeric_table + where num_col in (select float_col from float_table); + num_col +------------------------- + 1 + 1.000000000000000000001 + 2 + 3 +(4 rows) + +-- +-- Test case for bug #4290: bogus calculation of subplan param sets +-- +create temp table ta (id int primary key, val int); +insert into ta values(1,1); +insert into ta values(2,2); +create temp table tb (id int primary key, aval int); +insert into tb values(1,1); +insert into tb values(2,1); +insert into tb values(3,2); +insert into tb values(4,2); +create temp table tc (id int primary key, aid int); +insert into tc values(1,1); +insert into tc values(2,2); +select + ( select min(tb.id) from tb + where tb.aval = (select ta.val from ta where ta.id = tc.aid) ) as min_tb_id +from tc; + min_tb_id +----------- + 1 + 3 +(2 rows) + +-- +-- Test case for 8.3 "failed to locate grouping columns" bug +-- +create temp table t1 (f1 numeric(14,0), f2 varchar(30)); +select * from + (select distinct f1, f2, (select f2 from t1 x where x.f1 = up.f1) as fs + from t1 up) ss +group by f1,f2,fs; + f1 | f2 | fs +----+----+---- +(0 rows) + +-- +-- Test case for bug #5514 (mishandling of whole-row Vars in subselects) +-- +create temp table table_a(id integer); +insert into table_a values (42); +create temp view view_a as select * from table_a; +select view_a from view_a; + view_a +-------- + (42) +(1 row) + +select (select view_a) from view_a; + view_a +-------- + (42) +(1 row) + +select (select (select view_a)) from view_a; + view_a +-------- + (42) +(1 row) + +select (select (a.*)::text) from view_a a; + a +------ + (42) +(1 row) + +-- +-- Check that whole-row Vars reading the result of a subselect don't include +-- any junk columns therein +-- +-- In GPDB, the ORDER BY in the subquery or CTE doesn't force an ordering +-- for the whole query. Mark these with the "order none" gpdiff directive, +-- so that differences in result order are ignored. +select q from (select max(f1) from int4_tbl group by f1 order by f1) q; -- order none + q +--------------- + (-2147483647) + (-123456) + (0) + (123456) + (2147483647) +(5 rows) + +with q as (select max(f1) from int4_tbl group by f1 order by f1) + select q from q; -- order none + q +--------------- + (-2147483647) + (-123456) + (0) + (123456) + (2147483647) +(5 rows) + +-- +-- Test case for sublinks pulled up into joinaliasvars lists in an +-- inherited update/delete query +-- +begin; -- this shouldn't delete anything, but be safe +delete from road +where exists ( + select 1 + from + int4_tbl cross join + ( select f1, array(select q1 from int8_tbl) as arr + from text_tbl ) ss + where road.name = ss.f1 ); +rollback; +-- +-- Test case for sublinks pushed down into subselects via join alias expansion +-- +-- Cloudberry note: This query will only work with ORCA. This type of query +-- was not supported in postgres versions prior to 8.4, and thus was never +-- supported in the planner. After 8.4 versions, the planner works, but +-- the plan it creates is not currently parallel safe. +select + (select sq1) as qq1 +from + (select exists(select 1 from int4_tbl where f1 = q2) as sq1, 42 as dummy + from int8_tbl) sq0 + join + int4_tbl i4 on dummy = i4.f1; + qq1 +----- +(0 rows) + +-- +-- Test case for subselect within UPDATE of INSERT...ON CONFLICT DO UPDATE +-- +create temp table upsert(key int4 primary key, val text); +insert into upsert values(1, 'val') on conflict (key) do update set val = 'not seen'; +insert into upsert values(1, 'val') on conflict (key) do update set val = 'seen with subselect ' || (select f1 from int4_tbl where f1 != 0 order by f1 limit 1)::text; +select * from upsert; + key | val +-----+--------------------------------- + 1 | seen with subselect -2147483647 +(1 row) + +with aa as (select 'int4_tbl' u from int4_tbl limit 1) +insert into upsert values (1, 'x'), (999, 'y') +on conflict (key) do update set val = (select u from aa) +returning *; + key | val +-----+---------- + 1 | int4_tbl + 999 | y +(2 rows) + +-- +-- Test case for cross-type partial matching in hashed subplan (bug #7597) +-- +create temp table outer_7597 (f1 int4, f2 int4); +insert into outer_7597 values (0, 0); +insert into outer_7597 values (1, 0); +insert into outer_7597 values (0, null); +insert into outer_7597 values (1, null); +create temp table inner_7597(c1 int8, c2 int8); +insert into inner_7597 values(0, null); +select * from outer_7597 where (f1, f2) not in (select * from inner_7597); + f1 | f2 +----+---- + 1 | 0 + 1 | +(2 rows) + +-- +-- Similar test case using text that verifies that collation +-- information is passed through by execTuplesEqual() in nodeSubplan.c +-- (otherwise it would error in texteq()) +-- +create temp table outer_text (f1 text, f2 text); +insert into outer_text values ('a', 'a'); +insert into outer_text values ('b', 'a'); +insert into outer_text values ('a', null); +insert into outer_text values ('b', null); +create temp table inner_text (c1 text, c2 text); +insert into inner_text values ('a', null); +insert into inner_text values ('123', '456'); +select * from outer_text where (f1, f2) not in (select * from inner_text); + f1 | f2 +----+---- + b | a + b | +(2 rows) + +-- +-- Another test case for cross-type hashed subplans: comparison of +-- inner-side values must be done with appropriate operator +-- +explain (verbose, costs off) +select 'foo'::text in (select 'bar'::name union all select 'bar'::name); + QUERY PLAN +------------------------------------- + Result + Output: (hashed SubPlan 1) + SubPlan 1 + -> Append + -> Result + Output: 'bar'::name + -> Result + Output: 'bar'::name + Optimizer: Postgres query optimizer +(9 rows) + +select 'foo'::text in (select 'bar'::name union all select 'bar'::name); + ?column? +---------- + f +(1 row) + +-- +-- Test that we don't try to hash nested records (bug #17363) +-- (Hashing could be supported, but for now we don't) +-- +explain (verbose, costs off) +select row(row(row(1))) = any (select row(row(1))); + QUERY PLAN +------------------------------------- + Result + Output: (SubPlan 1) + SubPlan 1 + -> Materialize + Output: (ROW(ROW(1))) + -> Result + Output: ROW(ROW(1)) + Optimizer: Postgres query optimizer +(8 rows) + +select row(row(row(1))) = any (select row(row(1))); + ?column? +---------- + t +(1 row) + +-- +-- Test case for premature memory release during hashing of subplan output +-- +select '1'::text in (select '1'::name union all select '1'::name); + ?column? +---------- + t +(1 row) + +-- +-- Test that we don't try to use a hashed subplan if the simplified +-- testexpr isn't of the right shape +-- +-- this fails by default, of course +select * from int8_tbl where q1 in (select c1 from inner_text); +ERROR: operator does not exist: bigint = text +LINE 1: select * from int8_tbl where q1 in (select c1 from inner_tex... + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +begin; +-- make an operator to allow it to succeed +create function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $1::text = $2'; +create operator = (procedure=bogus_int8_text_eq, leftarg=int8, rightarg=text); +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); + QUERY PLAN +------------------------------------- + Seq Scan on int8_tbl + Filter: (hashed SubPlan 1) + SubPlan 1 + -> Seq Scan on inner_text + Optimizer: Postgres query optimizer +(5 rows) + +select * from int8_tbl where q1 in (select c1 from inner_text); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +-- inlining of this function results in unusual number of hash clauses, +-- which we can still cope with +create or replace function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $1::text = $2 and $1::text = $2'; +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); + QUERY PLAN +------------------------------------- + Seq Scan on int8_tbl + Filter: (hashed SubPlan 1) + SubPlan 1 + -> Seq Scan on inner_text + Optimizer: Postgres query optimizer +(5 rows) + +select * from int8_tbl where q1 in (select c1 from inner_text); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +-- inlining of this function causes LHS and RHS to be switched, +-- which we can't cope with, so hashing should be abandoned +create or replace function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $2 = $1::text'; +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); + QUERY PLAN +-------------------------------------- + Seq Scan on int8_tbl + Filter: (SubPlan 1) + SubPlan 1 + -> Materialize + -> Seq Scan on inner_text + Optimizer: Postgres query optimizer +(6 rows) + +select * from int8_tbl where q1 in (select c1 from inner_text); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +rollback; -- to get rid of the bogus operator +-- +-- Test resolution of hashed vs non-hashed implementation of EXISTS subplan +-- +explain (costs off) +select count(*) from tenk1 t +where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0); + QUERY PLAN +--------------------------------------------------- + Aggregate + -> Seq Scan on tenk1 t + Filter: ((hashed SubPlan 2) OR (ten < 0)) + SubPlan 2 + -> Seq Scan on tenk1 k + Optimizer: Postgres query optimizer +(6 rows) + +select count(*) from tenk1 t +where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0); + count +------- + 10000 +(1 row) + +explain (costs off) +select count(*) from tenk1 t +where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0) + and thousand = 1; + QUERY PLAN +-------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on tenk1 t + Recheck Cond: (thousand = 1) + Filter: ((SubPlan 1) OR (ten < 0)) + -> Bitmap Index Scan on tenk1_thous_tenthous + Index Cond: (thousand = 1) + SubPlan 1 + -> Index Only Scan using tenk1_unique1 on tenk1 k + Index Cond: (unique1 = t.unique2) + Optimizer: Postgres query optimizer +(10 rows) + +select count(*) from tenk1 t +where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0) + and thousand = 1; + count +------- + 10 +(1 row) + +-- It's possible for the same EXISTS to get resolved both ways +create temp table exists_tbl (c1 int, c2 int, c3 int) partition by list (c1); +create temp table exists_tbl_null partition of exists_tbl for values in (null); +create temp table exists_tbl_def partition of exists_tbl default; +insert into exists_tbl select x, x/2, x+1 from generate_series(0,10) x; +analyze exists_tbl; +explain (costs off) +select * from exists_tbl t1 + where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0); + QUERY PLAN +----------------------------------------------------------- + Append + -> Seq Scan on exists_tbl_null t1_1 + Filter: ((SubPlan 1 (copy 3)) OR (c3 < 0)) + SubPlan 1 (copy 3) + -> Append + -> Seq Scan on exists_tbl_null t2_1 + Filter: (t1_1.c1 = c2) + -> Seq Scan on exists_tbl_def t2_2 + Filter: (t1_1.c1 = c2) + -> Seq Scan on exists_tbl_def t1_2 + Filter: ((hashed SubPlan 2 (copy 6)) OR (c3 < 0)) + SubPlan 2 (copy 6) + -> Append + -> Seq Scan on exists_tbl_null t2_4 + -> Seq Scan on exists_tbl_def t2_5 + Optimizer: Postgres query optimizer +(16 rows) + +select * from exists_tbl t1 + where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0); + c1 | c2 | c3 +----+----+---- + 0 | 0 | 1 + 1 | 0 | 2 + 2 | 1 | 3 + 3 | 1 | 4 + 4 | 2 | 5 + 5 | 2 | 6 +(6 rows) + +-- +-- Test case for planner bug with nested EXISTS handling +-- +-- GPDB_92_MERGE_FIXME: ORCA cannot decorrelate this query, and generates +-- correct-but-slow plan that takes 45 minutes. Revisit this when ORCA can +-- reorder anti-joins +set optimizer to off; +select a.thousand from tenk1 a, tenk1 b +where a.thousand = b.thousand + and exists ( select 1 from tenk1 c where b.hundred = c.hundred + and not exists ( select 1 from tenk1 d + where a.thousand = d.thousand ) ); + thousand +---------- +(0 rows) + +reset optimizer; +-- +-- Check that nested sub-selects are not pulled up if they contain volatiles +-- +explain (verbose, costs off) + select x, x from + (select (select current_database()) as x from (values(1),(2)) v(y)) ss; + QUERY PLAN +-------------------------------------- + Values Scan on "*VALUES*" + Output: $0, $1 + InitPlan 1 (returns $0) + -> Result + Output: 'regression'::name + InitPlan 2 (returns $1) + -> Result + Output: 'regression'::name + Optimizer: Postgres query optimizer +(9 rows) + +explain (verbose, costs off) + select x, x from + (select (select random()) as x from (values(1),(2)) v(y)) ss; + QUERY PLAN +------------------------------------- + Subquery Scan on ss + Output: ss.x, ss.x + -> Values Scan on "*VALUES*" + Output: $0 + InitPlan 1 (returns $0) + -> Result + Output: random() + Optimizer: Postgres query optimizer +(8 rows) + +explain (verbose, costs off) + select x, x from + (select (select current_database() where y=y) as x from (values(1),(2)) v(y)) ss; + QUERY PLAN +---------------------------------------------------------------------- + Values Scan on "*VALUES*" + Output: (SubPlan 1), (SubPlan 2) + SubPlan 1 + -> Result + Output: 'regression'::name + One-Time Filter: ("*VALUES*".column1 = "*VALUES*".column1) + SubPlan 2 + -> Result + Output: 'regression'::name + One-Time Filter: ("*VALUES*".column1 = "*VALUES*".column1) + Optimizer: Postgres query optimizer +(11 rows) + +explain (verbose, costs off) + select x, x from + (select (select random() where y=y) as x from (values(1),(2)) v(y)) ss; + QUERY PLAN +---------------------------------------------------------------------------- + Subquery Scan on ss + Output: ss.x, ss.x + -> Values Scan on "*VALUES*" + Output: (SubPlan 1) + SubPlan 1 + -> Result + Output: random() + One-Time Filter: ("*VALUES*".column1 = "*VALUES*".column1) + Optimizer: Postgres query optimizer +(9 rows) + +-- +-- Test rescan of a hashed subplan (the use of random() is to prevent the +-- sub-select from being pulled up, which would result in not hashing) +-- +explain (verbose, costs off) +select sum(ss.tst::int) from + onek o cross join lateral ( + select i.ten in (select f1 from int4_tbl where f1 <= o.hundred) as tst, + random() as r + from onek i where i.unique1 = o.unique1 ) ss +where o.ten = 0; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + Output: sum((((hashed SubPlan 1)))::integer) + -> Nested Loop + Output: ((hashed SubPlan 1)) + -> Seq Scan on public.onek o + Output: o.unique1, o.unique2, o.two, o.four, o.ten, o.twenty, o.hundred, o.thousand, o.twothousand, o.fivethous, o.tenthous, o.odd, o.even, o.stringu1, o.stringu2, o.string4 + Filter: (o.ten = 0) + -> Materialize + Output: ((hashed SubPlan 1)), (random()) + -> Index Scan using onek_unique1 on public.onek i + Output: (hashed SubPlan 1), random() + Index Cond: (i.unique1 = o.unique1) + SubPlan 1 + -> Seq Scan on public.int4_tbl + Output: int4_tbl.f1 + Filter: (int4_tbl.f1 <= $0) + Optimizer: Postgres query optimizer +(17 rows) + +select sum(ss.tst::int) from + onek o cross join lateral ( + select i.ten in (select f1 from int4_tbl where f1 <= o.hundred) as tst, + random() as r + from onek i where i.unique1 = o.unique1 ) ss +where o.ten = 0; + sum +----- + 100 +(1 row) + +-- +-- Test rescan of a SetOp node +-- +explain (costs off) +select count(*) from + onek o cross join lateral ( + select * from onek i1 where i1.unique1 = o.unique1 + except + select * from onek i2 where i2.unique1 = o.unique2 + ) ss +where o.ten = 1; + QUERY PLAN +------------------------------------------------------------------------------------ + Aggregate + -> Nested Loop + -> Seq Scan on onek o + Filter: (ten = 1) + -> Materialize + -> Subquery Scan on ss + -> HashSetOp Except + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Index Scan using onek_unique1 on onek i1 + Index Cond: (unique1 = o.unique1) + -> Subquery Scan on "*SELECT* 2" + -> Index Scan using onek_unique1 on onek i2 + Index Cond: (unique1 = o.unique2) + Optimizer: Postgres query optimizer +(15 rows) + +select count(*) from + onek o cross join lateral ( + select * from onek i1 where i1.unique1 = o.unique1 + except + select * from onek i2 where i2.unique1 = o.unique2 + ) ss +where o.ten = 1; + count +------- + 100 +(1 row) + +-- +-- Test rescan of a RecursiveUnion node +-- +explain (costs off) +select sum(o.four), sum(ss.a) from + onek o cross join lateral ( + with recursive x(a) as + (select o.four as a + union + select a + 1 from x + where a < 10) + select * from x + ) ss +where o.ten = 1; + QUERY PLAN +--------------------------------------------------- + Aggregate + -> Nested Loop + -> Seq Scan on onek o + Filter: (ten = 1) + -> Materialize + -> Memoize + Cache Key: o.four + Cache Mode: binary + -> Recursive Union + -> Result + -> WorkTable Scan on x + Filter: (a < 10) + Optimizer: Postgres query optimizer +(13 rows) + +select sum(o.four), sum(ss.a) from + onek o cross join lateral ( + with recursive x(a) as + (select o.four as a + union + select a + 1 from x + where a < 10) + select * from x + ) ss +where o.ten = 1; + sum | sum +------+------ + 1700 | 5350 +(1 row) + +-- +-- Check we don't misoptimize a NOT IN where the subquery returns no rows. +-- +create temp table notinouter (a int); +create temp table notininner (b int not null); +insert into notinouter values (null), (1); +select * from notinouter where a not in (select b from notininner); + a +--- + + 1 +(2 rows) + +-- +-- Check we behave sanely in corner case of empty SELECT list (bug #8648) +-- +create temp table nocolumns(); +select exists(select * from nocolumns); + exists +-------- + f +(1 row) + +-- +-- Check behavior with a SubPlan in VALUES (bug #14924) +-- +select val.x + from generate_series(1,10) as s(i), + lateral ( + values ((select s.i + 1)), (s.i + 101) + ) as val(x) +where s.i < 10 and (select val.x) < 110; + x +----- + 2 + 102 + 3 + 103 + 4 + 104 + 5 + 105 + 6 + 106 + 7 + 107 + 8 + 108 + 9 + 109 + 10 +(17 rows) + +-- another variant of that (bug #16213) +explain (verbose, costs off) +select * from +(values + (3 not in (select * from (values (1), (2)) ss1)), + (false) +) ss; + QUERY PLAN +---------------------------------------- + Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + SubPlan 1 + -> Values Scan on "*VALUES*_1" + Output: "*VALUES*_1".column1 + Optimizer: Postgres query optimizer +(6 rows) + +select * from +(values + (3 not in (select * from (values (1), (2)) ss1)), + (false) +) ss; + column1 +--------- + t + f +(2 rows) + +-- +-- Check sane behavior with nested IN SubLinks +-- GPDB_94_MERGE_FIXME: ORCA plan is correct but very pricy. Should we fallback to planner? +-- +explain (verbose, costs off) +select * from int4_tbl where + (case when f1 in (select unique1 from tenk1 a) then f1 else null end) in + (select ten from tenk1 b); + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Hash Join + Output: int4_tbl.f1 + Hash Cond: (b.ten = CASE WHEN ((hashed SubPlan 1)) THEN int4_tbl.f1 ELSE NULL::integer END) + -> HashAggregate + Output: b.ten + Group Key: b.ten + -> Seq Scan on public.tenk1 b + Output: b.unique1, b.unique2, b.two, b.four, b.ten, b.twenty, b.hundred, b.thousand, b.twothousand, b.fivethous, b.tenthous, b.odd, b.even, b.stringu1, b.stringu2, b.string4 + -> Hash + Output: int4_tbl.f1, ((hashed SubPlan 1)) + -> Seq Scan on public.int4_tbl + Output: int4_tbl.f1, (hashed SubPlan 1) + SubPlan 1 + -> Seq Scan on public.tenk1 a + Output: a.unique1 + Optimizer: Postgres query optimizer +(16 rows) + +select * from int4_tbl where + (case when f1 in (select unique1 from tenk1 a) then f1 else null end) in + (select ten from tenk1 b); + f1 +---- + 0 +(1 row) + +-- +-- Check for incorrect optimization when IN subquery contains a SRF +-- +explain (verbose, costs off) +select * from int4_tbl o where (f1, f1) in + (select f1, generate_series(1,50) / 10 g from int4_tbl i group by f1); + QUERY PLAN +------------------------------------------------------------------- + Hash Semi Join + Output: o.f1 + Hash Cond: (o.f1 = "ANY_subquery".f1) + -> Seq Scan on public.int4_tbl o + Output: o.f1 + -> Hash + Output: "ANY_subquery".f1, "ANY_subquery".g + -> Subquery Scan on "ANY_subquery" + Output: "ANY_subquery".f1, "ANY_subquery".g + Filter: ("ANY_subquery".f1 = "ANY_subquery".g) + -> Result + Output: i.f1, ((generate_series(1, 50)) / 10) + -> ProjectSet + Output: generate_series(1, 50), i.f1 + -> HashAggregate + Output: i.f1 + Group Key: i.f1 + -> Seq Scan on public.int4_tbl i + Output: i.f1 + Optimizer: Postgres query optimizer +(20 rows) + +select * from int4_tbl o where (f1, f1) in + (select f1, generate_series(1,50) / 10 g from int4_tbl i group by f1); + f1 +---- + 0 +(1 row) + +-- +-- check for over-optimization of whole-row Var referencing an Append plan +-- +select (select q from + (select 1,2,3 where f1 > 0 + union all + select 4,5,6.0 where f1 <= 0 + ) q ) +from int4_tbl; + q +----------- + (4,5,6.0) + (1,2,3) + (4,5,6.0) + (1,2,3) + (4,5,6.0) +(5 rows) + +-- +-- Check for sane handling of a lateral reference in a subquery's quals +-- (most of the complication here is to prevent the test case from being +-- flattened too much) +-- +explain (verbose, costs off) +select * from + int4_tbl i4, + lateral ( + select i4.f1 > 1 as b, 1 as id + from (select random() order by 1) as t1 + union all + select true as b, 2 as id + ) as t2 +where b and f1 >= 0; + QUERY PLAN +---------------------------------------------------- + Nested Loop + Output: i4.f1, ((i4.f1 > 1)), (1) + -> Seq Scan on public.int4_tbl i4 + Output: i4.f1 + Filter: (i4.f1 >= 0) + -> Materialize + Output: ((i4.f1 > 1)), (1) + -> Append + -> Subquery Scan on t1 + Output: (i4.f1 > 1), 1 + Filter: (i4.f1 > 1) + -> Result + Output: $0 + InitPlan 1 (returns $0) + -> Result + Output: random() + -> Result + Output: true, 2 + Optimizer: Postgres query optimizer +(19 rows) + +select * from + int4_tbl i4, + lateral ( + select i4.f1 > 1 as b, 1 as id + from (select random() order by 1) as t1 + union all + select true as b, 2 as id + ) as t2 +where b and f1 >= 0; + f1 | b | id +------------+---+---- + 0 | t | 2 + 123456 | t | 1 + 123456 | t | 2 + 2147483647 | t | 1 + 2147483647 | t | 2 +(5 rows) + +-- +-- Check that volatile quals aren't pushed down past a DISTINCT: +-- nextval() should not be called more than the nominal number of times +-- +create temp sequence ts1 cache 1; +select * from + (select distinct ten from tenk1) ss + where ten < 10 + nextval('ts1') + order by 1; + ten +----- + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +(10 rows) + +select nextval('ts1'); + nextval +--------- + 11 +(1 row) + +-- +-- Check that volatile quals aren't pushed down past a set-returning function; +-- while a nonvolatile qual can be, if it doesn't reference the SRF. +-- +create function tattle(x int, y int) returns bool +volatile language plpgsql as $$ +begin + raise notice 'x = %, y = %', x, y; + return x > y; +end$$; +explain (verbose, costs off) +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, 8); + QUERY PLAN +---------------------------------------------------------- + Subquery Scan on ss + Output: ss.x, ss.u + Filter: tattle(ss.x, 8) + -> ProjectSet + Output: 9, unnest('{1,2,3,11,12,13}'::integer[]) + -> Result + Optimizer: Postgres query optimizer +(7 rows) + +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, 8); +NOTICE: x = 9, y = 8 +NOTICE: x = 9, y = 8 +NOTICE: x = 9, y = 8 +NOTICE: x = 9, y = 8 +NOTICE: x = 9, y = 8 +NOTICE: x = 9, y = 8 + x | u +---+---- + 9 | 1 + 9 | 2 + 9 | 3 + 9 | 11 + 9 | 12 + 9 | 13 +(6 rows) + +-- if we pretend it's stable, we get different results: +alter function tattle(x int, y int) stable; +explain (verbose, costs off) +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, 8); +NOTICE: x = 9, y = 8 + QUERY PLAN +---------------------------------------------------- + ProjectSet + Output: 9, unnest('{1,2,3,11,12,13}'::integer[]) + -> Result + Optimizer: Postgres query optimizer +(4 rows) + +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, 8); +NOTICE: x = 9, y = 8 + x | u +---+---- + 9 | 1 + 9 | 2 + 9 | 3 + 9 | 11 + 9 | 12 + 9 | 13 +(6 rows) + +-- although even a stable qual should not be pushed down if it references SRF +explain (verbose, costs off) +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, u); + QUERY PLAN +---------------------------------------------------------- + Subquery Scan on ss + Output: ss.x, ss.u + Filter: tattle(ss.x, ss.u) + -> ProjectSet + Output: 9, unnest('{1,2,3,11,12,13}'::integer[]) + -> Result + Optimizer: Postgres query optimizer +(7 rows) + +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, u); +NOTICE: x = 9, y = 1 +NOTICE: x = 9, y = 2 +NOTICE: x = 9, y = 3 +NOTICE: x = 9, y = 11 +NOTICE: x = 9, y = 12 +NOTICE: x = 9, y = 13 + x | u +---+--- + 9 | 1 + 9 | 2 + 9 | 3 +(3 rows) + +drop function tattle(x int, y int); +set optimizer to off; +-- +-- Test that LIMIT can be pushed to SORT through a subquery that just projects +-- columns. We check for that having happened by looking to see if EXPLAIN +-- ANALYZE shows that a top-N sort was used. We must suppress or filter away +-- all the non-invariant parts of the EXPLAIN ANALYZE output. +-- +-- GPDB_12_MERGE_FIXME: we need to revisit the following test because it is not +-- testing what it advertized in the above comment. Specificly, we don't +-- execute top-N sort for the planner plan. Orca on the other hand never honors +-- ORDER BY in a subquery, as permitted by the SQL spec. Consider rewriting +-- the test using a replicated table so that we get the plan stucture like +-- this: Limit -> Subquery -> Sort +-- +create table sq_limit (pk int primary key, c1 int, c2 int); +insert into sq_limit values + (1, 1, 1), + (2, 2, 2), + (3, 3, 3), + (4, 4, 4), + (5, 1, 1), + (6, 2, 2), + (7, 3, 3), + (8, 4, 4); +create function explain_sq_limit() returns setof text language plpgsql as +$$ +declare ln text; +begin + for ln in + explain (analyze, summary off, timing off, costs off) + select * from (select pk,c2 from sq_limit order by c1,pk) as x limit 3 + loop + ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); + return next ln; + end loop; +end; +$$; +select * from explain_sq_limit(); + explain_sq_limit +---------------------------------------------------------------- + Limit (actual rows=3 loops=1) + -> Subquery Scan on x (actual rows=3 loops=1) + -> Sort (actual rows=3 loops=1) + Sort Key: sq_limit.c1, sq_limit.pk + Sort Method: top-N heapsort Memory: xxx + -> Seq Scan on sq_limit (actual rows=8 loops=1) + Optimizer: Postgres query optimizer +(7 rows) + +-- a subpath is sorted under a subqueryscan. however, the subqueryscan is not. +-- whether the order of subpath can applied to the subqueryscan is up-to-implement. +-- now we do not guarantee the order of subpath can apply to the subqueryscan. +-- so the results of bellow is not stable, so we ignore the results +--start_ignore +select * from (select pk,c2 from sq_limit order by c1,pk) as x limit 3; + pk | c2 +----+---- + 1 | 1 + 5 | 1 + 2 | 2 +(3 rows) + +--end_ignore +reset optimizer; +drop function explain_sq_limit(); +drop table sq_limit; +-- +-- Ensure that backward scan direction isn't propagated into +-- expression subqueries (bug #15336) +-- +--start_ignore +begin; +declare c1 scroll cursor for + select * from generate_series(1,4) i + where i <> all (values (2),(3)); +move forward all in c1; +fetch backward all in c1; +ERROR: backward scan is not supported in this version of Cloudberry Database +commit; +--end_ignore +-- +-- Tests for CTE inlining behavior +-- +set gp_cte_sharing to on; +-- Basic subquery that can be inlined +explain (verbose, costs off) +with x as (select * from (select f1 from subselect_tbl) ss) +select * from x where f1 = 1; + QUERY PLAN +------------------------------------- + Seq Scan on public.subselect_tbl + Output: subselect_tbl.f1 + Filter: (subselect_tbl.f1 = 1) + Optimizer: Postgres query optimizer +(4 rows) + +-- Explicitly request materialization +explain (verbose, costs off) +with x as materialized (select * from (select f1 from subselect_tbl) ss) +select * from x where f1 = 1; + QUERY PLAN +---------------------------------------------- + Subquery Scan on x + Output: x.f1 + Filter: (x.f1 = 1) + -> Shared Scan (share slice:id -1:0) + Output: share0_ref1.f1 + -> Seq Scan on public.subselect_tbl + Output: subselect_tbl.f1 + Optimizer: Postgres query optimizer +(8 rows) + +-- Stable functions are safe to inline +explain (verbose, costs off) +with x as (select * from (select f1, current_database() from subselect_tbl) ss) +select * from x where f1 = 1; + QUERY PLAN +------------------------------------------------ + Seq Scan on public.subselect_tbl + Output: subselect_tbl.f1, 'regression'::name + Filter: (subselect_tbl.f1 = 1) + Optimizer: Postgres query optimizer +(4 rows) + +-- Volatile functions prevent inlining +-- GPDB_12_MERGE_FIXME: inlining happens on GPDB: But the plan seems OK +-- nevertheless. Is the GPDB planner smart, and notices that this is +-- ok to inline, or is it doing something that would be unsafe in more +-- complicated queries? Investigte +explain (verbose, costs off) +with x as (select * from (select f1, random() from subselect_tbl) ss) +select * from x where f1 = 1; + QUERY PLAN +-------------------------------------- + Seq Scan on public.subselect_tbl + Output: subselect_tbl.f1, random() + Filter: (subselect_tbl.f1 = 1) + Optimizer: Postgres query optimizer +(4 rows) + +-- SELECT FOR UPDATE cannot be inlined +-- GPDB: select statement with locking clause is not easy to fully supported +-- in greenplum. The following case even with GDD enabled greenplum will still +-- lock the table in Exclusive Lock and not generate LockRows plan node. +-- For detail, please refer to checkCanOptSelectLockingClause. +explain (verbose, costs off) +with x as (select * from (select f1 from subselect_tbl for update) ss) +select * from x where f1 = 1; + QUERY PLAN +------------------------------------------------------ + Subquery Scan on ss + Output: ss.f1 + -> Seq Scan on public.subselect_tbl + Output: subselect_tbl.f1, subselect_tbl.ctid + Filter: (subselect_tbl.f1 = 1) + Optimizer: Postgres query optimizer +(6 rows) + +-- Multiply-referenced CTEs are inlined only when requested +explain (verbose, costs off) +with x as (select * from (select f1, current_database() as n from subselect_tbl) ss) +select * from x, x x2 where x.n = x2.n; + QUERY PLAN +------------------------------------------------------------------------ + Hash Join + Output: share0_ref2.f1, share0_ref2.n, share0_ref1.f1, share0_ref1.n + Hash Cond: (share0_ref2.n = share0_ref1.n) + -> Shared Scan (share slice:id -1:0) + Output: share0_ref2.f1, share0_ref2.n + -> Hash + Output: share0_ref1.f1, share0_ref1.n + -> Shared Scan (share slice:id -1:0) + Output: share0_ref1.f1, share0_ref1.n + -> Seq Scan on public.subselect_tbl + Output: subselect_tbl.f1, 'regression'::name + Optimizer: Postgres query optimizer +(12 rows) + +explain (verbose, costs off) +with x as not materialized (select * from (select f1, current_database() as n from subselect_tbl) ss) +select * from x, x x2 where x.n = x2.n; + QUERY PLAN +-------------------------------------------------------------------------------------------- + Hash Join + Output: subselect_tbl.f1, ('regression'::name), subselect_tbl_1.f1, ('regression'::name) + Hash Cond: (('regression'::name) = ('regression'::name)) + -> Seq Scan on public.subselect_tbl + Output: subselect_tbl.f1, 'regression'::name + -> Hash + Output: subselect_tbl_1.f1, ('regression'::name) + -> Seq Scan on public.subselect_tbl subselect_tbl_1 + Output: subselect_tbl_1.f1, 'regression'::name + Optimizer: Postgres query optimizer +(10 rows) + +-- Multiply-referenced CTEs can't be inlined if they contain outer self-refs +-- start_ignore +-- GPDB_12_MERGE_FIXME: This currenty produces incorrect results on GPDB. +-- It's not a new issue, but it was exposed by this new upstream test case +-- with the PostgreSQL v12 merge. +-- See https://github.com/greenplum-db/gpdb/issues/10014 +explain (verbose, costs off) +with recursive x(a) as + ((values ('a'), ('b')) + union all + (with z as not materialized (select * from x) + select z.a || z1.a as a from z cross join z as z1 + where length(z.a || z1.a) < 5)) +select * from x; + QUERY PLAN +--------------------------------------------------- + Recursive Union + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + -> Nested Loop + Output: (x.a || x_1.a) + Join Filter: (length((x.a || x_1.a)) < 5) + -> WorkTable Scan on x + Output: x.a + -> Materialize + Output: x_1.a + -> WorkTable Scan on x x_1 + Output: x_1.a + Optimizer: Postgres query optimizer +(13 rows) + +with recursive x(a) as + ((values ('a'), ('b')) + union all + (with z as not materialized (select * from x) + select z.a || z1.a as a from z cross join z as z1 + where length(z.a || z1.a) < 5)) +select * from x; + a +--- + a + b +(2 rows) + +-- end_ignore +explain (verbose, costs off) +with recursive x(a) as + ((values ('a'), ('b')) + union all + (with z as not materialized (select * from x) + select z.a || z.a as a from z + where length(z.a || z.a) < 5)) +select * from x; + QUERY PLAN +-------------------------------------------------- + Recursive Union + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + -> Subquery Scan on z + Output: (z.a || z.a) + -> WorkTable Scan on x + Output: x.a + Filter: (length((x.a || x.a)) < 5) + Optimizer: Postgres query optimizer +(9 rows) + +with recursive x(a) as + ((values ('a'), ('b')) + union all + (with z as not materialized (select * from x) + select z.a || z.a as a from z + where length(z.a || z.a) < 5)) +select * from x; + a +------ + a + b + aa + bb + aaaa + bbbb +(6 rows) + +-- Check handling of outer references +explain (verbose, costs off) +with x as (select * from int4_tbl) +select * from (with y as (select * from x) select * from y) ss; + QUERY PLAN +------------------------------------- + Seq Scan on public.int4_tbl + Output: int4_tbl.f1 + Optimizer: Postgres query optimizer +(3 rows) + +explain (verbose, costs off) +with x as materialized (select * from int4_tbl) +select * from (with y as (select * from x) select * from y) ss; + QUERY PLAN +------------------------------------- + Shared Scan (share slice:id -1:0) + Output: share0_ref1.f1 + -> Seq Scan on public.int4_tbl + Output: int4_tbl.f1 + Optimizer: Postgres query optimizer +(5 rows) + +-- Ensure that we inline the currect CTE when there are +-- multiple CTEs with the same name +explain (verbose, costs off) +with x as (select 1 as y) +select * from (with x as (select 2 as y) select * from x) ss; + QUERY PLAN +------------------------------------- + Result + Output: 2 + Optimizer: Postgres query optimizer +(3 rows) + +-- Row marks are not pushed into CTEs +explain (verbose, costs off) +with x as (select * from subselect_tbl) +select * from x for update; + QUERY PLAN +---------------------------------------------------------------- + Seq Scan on public.subselect_tbl + Output: subselect_tbl.f1, subselect_tbl.f2, subselect_tbl.f3 + Optimizer: Postgres query optimizer +(3 rows) + +set gp_cte_sharing to off; diff --git a/src/test/singlenode_regress/expected/subselect_gp.out b/src/test/singlenode_regress/expected/subselect_gp.out new file mode 100644 index 00000000000..83cbeb2f5eb --- /dev/null +++ b/src/test/singlenode_regress/expected/subselect_gp.out @@ -0,0 +1,2628 @@ +set optimizer_enable_master_only_queries = on; +set optimizer_segments = 3; +set optimizer_nestloop_factor = 1.0; +-- +-- Base tables for CSQ tests +-- +drop table if exists csq_t1_base; +NOTICE: table "csq_t1_base" does not exist, skipping +create table csq_t1_base(x int, y int); +insert into csq_t1_base values(1,2); +insert into csq_t1_base values(2,1); +insert into csq_t1_base values(4,2); +drop table if exists csq_t2_base; +NOTICE: table "csq_t2_base" does not exist, skipping +create table csq_t2_base(x int, y int); +insert into csq_t2_base values(3,2); +insert into csq_t2_base values(3,2); +insert into csq_t2_base values(3,2); +insert into csq_t2_base values(3,2); +insert into csq_t2_base values(3,1); +-- +-- Correlated subqueries +-- +drop table if exists csq_t1; +NOTICE: table "csq_t1" does not exist, skipping +drop table if exists csq_t2; +NOTICE: table "csq_t2" does not exist, skipping +create table csq_t1(x int, y int); +create table csq_t2(x int, y int); +insert into csq_t1 select * from csq_t1_base; +insert into csq_t2 select * from csq_t2_base; +select * from csq_t1 where csq_t1.x >ALL (select csq_t2.x from csq_t2 where csq_t2.y=csq_t1.y) order by 1; -- expected (4,2) + x | y +---+--- + 4 | 2 +(1 row) + +-- +-- correlations in the targetlist +-- +select csq_t1.x, (select sum(bar.x) from csq_t1 bar where bar.x >= csq_t1.x) as sum from csq_t1 order by csq_t1.x; + x | sum +---+----- + 1 | 7 + 2 | 6 + 4 | 4 +(3 rows) + +select csq_t1.x, (select sum(bar.x) from csq_t1 bar where bar.x = csq_t1.x) as sum from csq_t1 order by csq_t1.x; + x | sum +---+----- + 1 | 1 + 2 | 2 + 4 | 4 +(3 rows) + +select csq_t1.x, (select bar.x from csq_t1 bar where bar.x = csq_t1.x) as sum from csq_t1 order by csq_t1.x; + x | sum +---+----- + 1 | 1 + 2 | 2 + 4 | 4 +(3 rows) + +-- +-- CSQs with partitioned tables +-- +drop table if exists csq_t1; +drop table if exists csq_t2; +create table csq_t1(x int, y int) +partition by range (y) ( start (0) end (4) every (1)) +; +create table csq_t2(x int, y int) +partition by range (y) ( start (0) end (4) every (1)) +; +insert into csq_t1 select * from csq_t1_base; +insert into csq_t2 select * from csq_t2_base; +explain select * from csq_t1 where csq_t1.x >ALL (select csq_t2.x from csq_t2 where csq_t2.y=csq_t1.y) order by 1; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Sort (cost=1780.74..1826.19 rows=18180 width=8) + Sort Key: csq_t1.x + -> Append (cost=0.00..494.50 rows=18180 width=8) + -> Seq Scan on csq_t1_1_prt_1 csq_t1_1 (cost=0.00..100.90 rows=4545 width=8) + Filter: (SubPlan 1 (copy 2)) + SubPlan 1 (copy 2) + -> Append (cost=0.00..494.68 rows=36 width=4) + -> Seq Scan on csq_t2_1_prt_1 csq_t2_1 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_1.y) + -> Seq Scan on csq_t2_1_prt_2 csq_t2_2 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_1.y) + -> Seq Scan on csq_t2_1_prt_3 csq_t2_3 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_1.y) + -> Seq Scan on csq_t2_1_prt_4 csq_t2_4 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_1.y) + -> Seq Scan on csq_t1_1_prt_2 csq_t1_2 (cost=0.00..100.90 rows=4545 width=8) + Filter: (SubPlan 1 (copy 3)) + SubPlan 1 (copy 3) + -> Append (cost=0.00..494.68 rows=36 width=4) + -> Seq Scan on csq_t2_1_prt_1 csq_t2_6 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_2.y) + -> Seq Scan on csq_t2_1_prt_2 csq_t2_7 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_2.y) + -> Seq Scan on csq_t2_1_prt_3 csq_t2_8 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_2.y) + -> Seq Scan on csq_t2_1_prt_4 csq_t2_9 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_2.y) + -> Seq Scan on csq_t1_1_prt_3 csq_t1_3 (cost=0.00..100.90 rows=4545 width=8) + Filter: (SubPlan 1 (copy 4)) + SubPlan 1 (copy 4) + -> Append (cost=0.00..494.68 rows=36 width=4) + -> Seq Scan on csq_t2_1_prt_1 csq_t2_11 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_3.y) + -> Seq Scan on csq_t2_1_prt_2 csq_t2_12 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_3.y) + -> Seq Scan on csq_t2_1_prt_3 csq_t2_13 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_3.y) + -> Seq Scan on csq_t2_1_prt_4 csq_t2_14 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_3.y) + -> Seq Scan on csq_t1_1_prt_4 csq_t1_4 (cost=0.00..100.90 rows=4545 width=8) + Filter: (SubPlan 1 (copy 5)) + SubPlan 1 (copy 5) + -> Append (cost=0.00..494.68 rows=36 width=4) + -> Seq Scan on csq_t2_1_prt_1 csq_t2_16 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_4.y) + -> Seq Scan on csq_t2_1_prt_2 csq_t2_17 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_4.y) + -> Seq Scan on csq_t2_1_prt_3 csq_t2_18 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_4.y) + -> Seq Scan on csq_t2_1_prt_4 csq_t2_19 (cost=0.00..123.62 rows=9 width=4) + Filter: (y = csq_t1_4.y) + Optimizer: Postgres query optimizer +(52 rows) + +select * from csq_t1 where csq_t1.x >ALL (select csq_t2.x from csq_t2 where csq_t2.y=csq_t1.y) order by 1; -- expected (4,2) + x | y +---+--- + 4 | 2 +(1 row) + +drop table if exists csq_t1; +drop table if exists csq_t2; +drop table if exists csq_t1_base; +drop table if exists csq_t2_base; +-- +-- Multi-row subqueries +-- +drop table if exists mrs_t1; +NOTICE: table "mrs_t1" does not exist, skipping +create table mrs_t1(x int); +insert into mrs_t1 select generate_series(1,20); +analyze mrs_t1; +explain select * from mrs_t1 where exists (select x from mrs_t1 where x < -1); + QUERY PLAN +----------------------------------------------------------------------- + Result (cost=1.25..2.45 rows=20 width=4) + One-Time Filter: $0 + InitPlan 1 (returns $0) + -> Seq Scan on mrs_t1 mrs_t1_1 (cost=0.00..1.25 rows=1 width=4) + Filter: (x < '-1'::integer) + -> Seq Scan on mrs_t1 (cost=1.25..2.45 rows=20 width=4) + Optimizer: Postgres query optimizer +(7 rows) + +select * from mrs_t1 where exists (select x from mrs_t1 where x < -1) order by 1; + x +--- +(0 rows) + +explain select * from mrs_t1 where exists (select x from mrs_t1 where x = 1); + QUERY PLAN +----------------------------------------------------------------------- + Result (cost=1.25..2.45 rows=20 width=4) + One-Time Filter: $0 + InitPlan 1 (returns $0) + -> Seq Scan on mrs_t1 mrs_t1_1 (cost=0.00..1.25 rows=1 width=4) + Filter: (x = 1) + -> Seq Scan on mrs_t1 (cost=1.25..2.45 rows=20 width=4) + Optimizer: Postgres query optimizer +(7 rows) + +select * from mrs_t1 where exists (select x from mrs_t1 where x = 1) order by 1; + x +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(20 rows) + +explain select * from mrs_t1 where x in (select x-95 from mrs_t1) or x < 5; + QUERY PLAN +------------------------------------------------------------------------ + Seq Scan on mrs_t1 (cost=0.00..1.25 rows=12 width=4) + Filter: ((hashed SubPlan 1) OR (x < 5)) + SubPlan 1 + -> Seq Scan on mrs_t1 mrs_t1_1 (cost=0.00..1.25 rows=20 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +select * from mrs_t1 where x in (select x-95 from mrs_t1) or x < 5 order by 1; + x +--- + 1 + 2 + 3 + 4 +(4 rows) + +drop table if exists mrs_t1; +-- +-- Multi-row subquery from MSTR +-- +drop table if exists mrs_u1; +NOTICE: table "mrs_u1" does not exist, skipping +drop table if exists mrs_u2; +NOTICE: table "mrs_u2" does not exist, skipping +create TABLE mrs_u1 (a int, b int); +create TABLE mrs_u2 (a int, b int); +insert into mrs_u1 values (1,2),(11,22); +insert into mrs_u2 values (1,2),(11,22),(33,44); +select * from mrs_u1 join mrs_u2 on mrs_u1.a=mrs_u2.a where mrs_u1.a in (1,11) or mrs_u2.a in (select a from mrs_u1 where a=1) order by 1; + a | b | a | b +----+----+----+---- + 1 | 2 | 1 | 2 + 11 | 22 | 11 | 22 +(2 rows) + +drop table if exists mrs_u1; +drop table if exists mrs_u2; +-- +-- MPP-13758 +-- +drop table if exists csq_m1; +NOTICE: table "csq_m1" does not exist, skipping +create table csq_m1(); +set allow_system_table_mods=true; +delete from gp_distribution_policy where localoid='csq_m1'::regclass; +reset allow_system_table_mods; +alter table csq_m1 add column x int; +insert into csq_m1 values(1); +analyze csq_m1; +drop table if exists csq_d1; +NOTICE: table "csq_d1" does not exist, skipping +create table csq_d1(x int); +insert into csq_d1 select * from csq_m1; +analyze csq_d1; +explain select array(select x from csq_m1); -- no initplan + QUERY PLAN +-------------------------------------------------------------- + Result (cost=1.01..1.02 rows=1 width=32) + InitPlan 1 (returns $0) + -> Seq Scan on csq_m1 (cost=0.00..1.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(4 rows) + +select array(select x from csq_m1); -- {1} + array +------- + {1} +(1 row) + +explain select array(select x from csq_d1); -- initplan + QUERY PLAN +-------------------------------------------------------------- + Result (cost=1.01..1.02 rows=1 width=32) + InitPlan 1 (returns $0) + -> Seq Scan on csq_d1 (cost=0.00..1.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(4 rows) + +select array(select x from csq_d1); -- {1} + array +------- + {1} +(1 row) + +-- +-- CSQs involving master-only and distributed tables +-- +drop table if exists t3cozlib; +NOTICE: table "t3cozlib" does not exist, skipping +create table t3cozlib (c1 int , c2 varchar) with (appendonly=true, compresstype=zlib, orientation=column); +drop table if exists pg_attribute_storage; +NOTICE: table "pg_attribute_storage" does not exist, skipping +create table pg_attribute_storage (attrelid int, attnum int, attoptions text[]); +insert into pg_attribute_storage values ('t3cozlib'::regclass, 1, E'{\'something\'}'); +insert into pg_attribute_storage values ('t3cozlib'::regclass, 2, E'{\'something2\'}'); +SELECT a.attname +, pg_catalog.format_type(a.atttypid, a.atttypmod) +, ( SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) + FROM pg_catalog.pg_attrdef d +WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef +) +, a.attnotnull +, a.attnum +, a.attstorage +, pg_catalog.col_description(a.attrelid, a.attnum) +, ( SELECT s.attoptions +FROM pg_attribute_storage s +WHERE s.attrelid = a.attrelid AND s.attnum = a.attnum +) newcolumn +FROM pg_catalog.pg_attribute a +WHERE a.attrelid = 't3cozlib'::regclass AND a.attnum > 0 AND NOT a.attisdropped +ORDER BY a.attnum +; -- expect to see 2 rows + attname | format_type | substring | attnotnull | attnum | attstorage | col_description | newcolumn +---------+-------------------+-----------+------------+--------+------------+-----------------+---------------- + c1 | integer | | f | 1 | p | | {'something'} + c2 | character varying | | f | 2 | x | | {'something2'} +(2 rows) + +-- +-- More CSQs involving master-only and distributed relations +-- +drop table if exists csq_m1; +create table csq_m1(); +set allow_system_table_mods=true; +delete from gp_distribution_policy where localoid='csq_m1'::regclass; +reset allow_system_table_mods; +alter table csq_m1 add column x int; +insert into csq_m1 values(1),(2),(3); +analyze csq_m1; +drop table if exists csq_d1; +create table csq_d1(x int); +insert into csq_d1 select * from csq_m1 where x < 3; +insert into csq_d1 values(4); +analyze csq_d1; +select * from csq_m1; + x +--- + 1 + 2 + 3 +(3 rows) + +select * from csq_d1; + x +--- + 1 + 2 + 4 +(3 rows) + +-- +-- outer plan node is master-only and CSQ has distributed relation +-- +explain select * from csq_m1 where x not in (select x from csq_d1) or x < -100; -- gather motion + QUERY PLAN +--------------------------------------------------------------- + Seq Scan on csq_m1 (cost=0.00..1.04 rows=2 width=4) + Filter: ((NOT (hashed SubPlan 1)) OR (x < '-100'::integer)) + SubPlan 1 + -> Seq Scan on csq_d1 (cost=0.00..1.03 rows=3 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +select * from csq_m1 where x not in (select x from csq_d1) or x < -100; -- (3) + x +--- + 3 +(1 row) + +-- +-- outer plan node is master-only and CSQ has distributed relation +-- +explain select * from csq_d1 where x not in (select x from csq_m1) or x < -100; -- broadcast motion + QUERY PLAN +--------------------------------------------------------------- + Seq Scan on csq_d1 (cost=0.00..1.04 rows=2 width=4) + Filter: ((NOT (hashed SubPlan 1)) OR (x < '-100'::integer)) + SubPlan 1 + -> Seq Scan on csq_m1 (cost=0.00..1.03 rows=3 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +select * from csq_d1 where x not in (select x from csq_m1) or x < -100; -- (4) + x +--- + 4 +(1 row) + +-- drop csq_m1 since we deleted its gp_distribution_policy entry +drop table csq_m1; +-- +-- MPP-14441 Don't lose track of initplans +-- +drop table if exists csq_t1; +NOTICE: table "csq_t1" does not exist, skipping +CREATE TABLE csq_t1 (a int, b int, c int, d int, e text); +INSERT INTO csq_t1 SELECT i, i/3, i%2, 100-i, 'text'||i FROM generate_series(1,100) i; +select count(*) from csq_t1 t1 where a > (SELECT x.b FROM ( select avg(a)::int as b,'haha'::text from csq_t1 t2 where t2.a=t1.d) x ) ; + count +------- + 49 +(1 row) + +select count(*) from csq_t1 t1 where a > ( select avg(a)::int from csq_t1 t2 where t2.a=t1.d) ; + count +------- + 49 +(1 row) + +-- +-- correlation in a func expr +-- +CREATE OR REPLACE FUNCTION csq_f(a int) RETURNS int AS $$ select $1 $$ LANGUAGE SQL CONTAINS SQL; +DROP TABLE IF EXISTS csq_r; +NOTICE: table "csq_r" does not exist, skipping +CREATE TABLE csq_r(a int); +INSERT INTO csq_r VALUES (1); +-- subqueries shouldn't be pulled into a join if the from clause has a function call +-- with a correlated argument +-- force_explain +explain SELECT * FROM csq_r WHERE a IN (SELECT * FROM csq_f(csq_r.a)); + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on csq_r (cost=0.00..112.30 rows=5115 width=4) + Filter: (SubPlan 1) + SubPlan 1 + -> Function Scan on csq_f (cost=0.00..0.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT * FROM csq_r WHERE a IN (SELECT * FROM csq_f(csq_r.a)); + a +--- + 1 +(1 row) + +-- force_explain +explain SELECT * FROM csq_r WHERE a not IN (SELECT * FROM csq_f(csq_r.a)); + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on csq_r (cost=0.00..112.30 rows=5115 width=4) + Filter: (SubPlan 1) + SubPlan 1 + -> Function Scan on csq_f (cost=0.00..0.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT * FROM csq_r WHERE a not IN (SELECT * FROM csq_f(csq_r.a)); + a +--- +(0 rows) + +-- force_explain +explain SELECT * FROM csq_r WHERE exists (SELECT * FROM csq_f(csq_r.a)); + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on csq_r (cost=0.00..112.30 rows=5115 width=4) + Filter: (SubPlan 1) + SubPlan 1 + -> Function Scan on csq_f (cost=0.00..0.01 rows=1 width=0) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT * FROM csq_r WHERE exists (SELECT * FROM csq_f(csq_r.a)); + a +--- + 1 +(1 row) + +-- force_explain +explain SELECT * FROM csq_r WHERE not exists (SELECT * FROM csq_f(csq_r.a)); + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on csq_r (cost=0.00..112.30 rows=5115 width=4) + Filter: (NOT (SubPlan 1)) + SubPlan 1 + -> Function Scan on csq_f (cost=0.00..0.01 rows=1 width=0) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT * FROM csq_r WHERE not exists (SELECT * FROM csq_f(csq_r.a)); + a +--- +(0 rows) + +-- force_explain +explain SELECT * FROM csq_r WHERE a > (SELECT csq_f FROM csq_f(csq_r.a) limit 1); + QUERY PLAN +------------------------------------------------------------------------ + Seq Scan on csq_r (cost=0.00..137.88 rows=3410 width=4) + Filter: (a > (SubPlan 1)) + SubPlan 1 + -> Limit (cost=0.00..0.01 rows=1 width=4) + -> Function Scan on csq_f (cost=0.00..0.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT * FROM csq_r WHERE a > (SELECT csq_f FROM csq_f(csq_r.a) limit 1); + a +--- +(0 rows) + +-- force_explain +explain SELECT * FROM csq_r WHERE a < ANY (SELECT csq_f FROM csq_f(csq_r.a)); + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on csq_r (cost=0.00..112.30 rows=5115 width=4) + Filter: (SubPlan 1) + SubPlan 1 + -> Function Scan on csq_f (cost=0.00..0.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT * FROM csq_r WHERE a < ANY (SELECT csq_f FROM csq_f(csq_r.a)); + a +--- +(0 rows) + +-- force_explain +explain SELECT * FROM csq_r WHERE a <= ALL (SELECT csq_f FROM csq_f(csq_r.a)); + QUERY PLAN +------------------------------------------------------------------ + Seq Scan on csq_r (cost=0.00..112.30 rows=5115 width=4) + Filter: (SubPlan 1) + SubPlan 1 + -> Function Scan on csq_f (cost=0.00..0.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT * FROM csq_r WHERE a <= ALL (SELECT csq_f FROM csq_f(csq_r.a)); + a +--- + 1 +(1 row) + +-- force_explain +explain SELECT * FROM csq_r WHERE a IN (SELECT csq_f FROM csq_f(csq_r.a),csq_r); + QUERY PLAN +--------------------------------------------------------------------------------- + Seq Scan on csq_r (cost=0.00..112.30 rows=5115 width=4) + Filter: (SubPlan 1) + SubPlan 1 + -> Nested Loop (cost=10000000000.00..10000000214.61 rows=10230 width=4) + -> Function Scan on csq_f (cost=0.00..0.01 rows=1 width=4) + -> Seq Scan on csq_r csq_r_1 (cost=0.00..112.30 rows=10230 width=0) + Optimizer: Postgres query optimizer +(7 rows) + +SELECT * FROM csq_r WHERE a IN (SELECT csq_f FROM csq_f(csq_r.a),csq_r); + a +--- + 1 +(1 row) + +-- +-- Test pullup of expr CSQs to joins +-- +-- +-- Test data +-- +drop table if exists csq_pullup; +NOTICE: table "csq_pullup" does not exist, skipping +create table csq_pullup(t text, n numeric, i int, v varchar(10)); +insert into csq_pullup values ('abc',1, 2, 'xyz'); +analyze csq_pullup; +insert into csq_pullup values ('xyz',2, 3, 'def'); +insert into csq_pullup values ('def',3, 1, 'abc'); +-- +-- Expr CSQs to joins +-- +-- +-- text, text +-- +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t); + QUERY PLAN +------------------------------------------------------------------------------------- + Hash Join (cost=1.05..2.10 rows=3 width=17) + Hash Cond: (t0.t = "Expr_SUBQUERY".csq_c0) + -> Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + -> Hash (cost=1.04..1.04 rows=1 width=4) + -> Subquery Scan on "Expr_SUBQUERY" (cost=1.01..1.04 rows=1 width=4) + -> HashAggregate (cost=1.01..1.03 rows=1 width=12) + Group Key: t1.t + Filter: (1 = count(*)) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(10 rows) + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t); + t | n | i | v +-----+---+---+----- + abc | 1 | 2 | xyz + xyz | 2 | 3 | def + def | 3 | 1 | abc +(3 rows) + +-- +-- text, varchar +-- +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.v); + QUERY PLAN +-------------------------------------------------------------------------------------- + Hash Join (cost=1.05..2.10 rows=3 width=17) + Hash Cond: (t0.t = "Expr_SUBQUERY".csq_c0) + -> Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + -> Hash (cost=1.04..1.04 rows=1 width=32) + -> Subquery Scan on "Expr_SUBQUERY" (cost=1.01..1.04 rows=1 width=32) + -> HashAggregate (cost=1.01..1.03 rows=1 width=40) + Group Key: (t1.v)::text + Filter: (1 = count(*)) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=32) + Optimizer: Postgres query optimizer +(10 rows) + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.v); + t | n | i | v +-----+---+---+----- + abc | 1 | 2 | xyz + xyz | 2 | 3 | def + def | 3 | 1 | abc +(3 rows) + +-- +-- numeric, numeric +-- +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n=t1.n); + QUERY PLAN +------------------------------------------------------------------------------------- + Hash Join (cost=1.05..2.10 rows=3 width=17) + Hash Cond: (t0.n = "Expr_SUBQUERY".csq_c0) + -> Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + -> Hash (cost=1.04..1.04 rows=1 width=5) + -> Subquery Scan on "Expr_SUBQUERY" (cost=1.01..1.04 rows=1 width=5) + -> HashAggregate (cost=1.01..1.03 rows=1 width=13) + Group Key: t1.n + Filter: (1 = count(*)) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=5) + Optimizer: Postgres query optimizer +(10 rows) + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n=t1.n); + t | n | i | v +-----+---+---+----- + abc | 1 | 2 | xyz + xyz | 2 | 3 | def + def | 3 | 1 | abc +(3 rows) + +-- +-- function(numeric), function(numeric) +-- +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + 1=t1.n + 1); + QUERY PLAN +-------------------------------------------------------------------------------------- + Hash Join (cost=1.05..2.10 rows=3 width=17) + Hash Cond: ((t0.n + '1'::numeric) = "Expr_SUBQUERY".csq_c0) + -> Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + -> Hash (cost=1.04..1.04 rows=1 width=32) + -> Subquery Scan on "Expr_SUBQUERY" (cost=1.02..1.04 rows=1 width=32) + -> HashAggregate (cost=1.02..1.03 rows=1 width=40) + Group Key: (t1.n + '1'::numeric) + Filter: (1 = count(*)) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=32) + Optimizer: Postgres query optimizer +(10 rows) + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + 1=t1.n + 1); + t | n | i | v +-----+---+---+----- + abc | 1 | 2 | xyz + xyz | 2 | 3 | def + def | 3 | 1 | abc +(3 rows) + +-- +-- function(numeric), function(int) +-- +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + 1=t1.i + 1); + QUERY PLAN +-------------------------------------------------------------------------------------- + Hash Join (cost=1.06..2.11 rows=3 width=17) + Hash Cond: ((t0.n + '1'::numeric) = "Expr_SUBQUERY".csq_c0) + -> Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + -> Hash (cost=1.05..1.05 rows=1 width=32) + -> Subquery Scan on "Expr_SUBQUERY" (cost=1.02..1.05 rows=1 width=32) + -> HashAggregate (cost=1.02..1.04 rows=1 width=40) + Group Key: ((t1.i + 1))::numeric + Filter: (1 = count(*)) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=32) + Optimizer: Postgres query optimizer +(10 rows) + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + 1=t1.i + 1); + t | n | i | v +-----+---+---+----- + abc | 1 | 2 | xyz + xyz | 2 | 3 | def + def | 3 | 1 | abc +(3 rows) + +-- +-- Test a few cases where pulling up an aggregate subquery is not possible +-- +-- subquery contains a LIMIT +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t LIMIT 1); + QUERY PLAN +--------------------------------------------------------------------------------- + Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + Filter: (1 = (SubPlan 1)) + SubPlan 1 + -> Limit (cost=1.01..1.02 rows=1 width=8) + -> Aggregate (cost=1.01..1.02 rows=1 width=8) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=0) + Filter: (t0.t = t) + Optimizer: Postgres query optimizer +(8 rows) + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t LIMIT 1); + t | n | i | v +-----+---+---+----- + abc | 1 | 2 | xyz + xyz | 2 | 3 | def + def | 3 | 1 | abc +(3 rows) + +-- subquery contains a HAVING clause +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t HAVING count(*) < 10); + QUERY PLAN +--------------------------------------------------------------------------- + Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + Filter: (1 = (SubPlan 1)) + SubPlan 1 + -> Aggregate (cost=1.01..1.03 rows=1 width=8) + Filter: (count(*) < 10) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=0) + Filter: (t0.t = t) + Optimizer: Postgres query optimizer +(8 rows) + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t HAVING count(*) < 10); + t | n | i | v +-----+---+---+----- + abc | 1 | 2 | xyz + xyz | 2 | 3 | def + def | 3 | 1 | abc +(3 rows) + +-- subquery contains quals of form 'function(outervar, innervar1) = innvervar2' +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + t1.n =t1.i); + QUERY PLAN +--------------------------------------------------------------------------- + Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + Filter: (1 = (SubPlan 1)) + SubPlan 1 + -> Aggregate (cost=1.02..1.03 rows=1 width=8) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.02 rows=1 width=0) + Filter: ((t0.n + n) = (i)::numeric) + Optimizer: Postgres query optimizer +(7 rows) + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + t1.n =t1.i); + t | n | i | v +---+---+---+--- +(0 rows) + +-- +-- NOT EXISTS CSQs to joins +-- +-- +-- text, text +-- +explain select * from csq_pullup t0 where not exists (select 1 from csq_pullup t1 where t0.t=t1.t and t1.i = 1); + QUERY PLAN +------------------------------------------------------------------------- + Hash Anti Join (cost=1.02..2.07 rows=3 width=17) + Hash Cond: (t0.t = t1.t) + -> Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + -> Hash (cost=1.01..1.01 rows=1 width=4) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=4) + Filter: (i = 1) + Optimizer: Postgres query optimizer +(7 rows) + +select * from csq_pullup t0 where not exists (select 1 from csq_pullup t1 where t0.t=t1.t and t1.i = 1); + t | n | i | v +-----+---+---+----- + abc | 1 | 2 | xyz + xyz | 2 | 3 | def +(2 rows) + +-- +-- int, function(int) +-- +explain select * from csq_pullup t0 where not exists (select 1 from csq_pullup t1 where t0.i=t1.i + 1); + QUERY PLAN +------------------------------------------------------------------------- + Hash Anti Join (cost=1.02..2.07 rows=3 width=17) + Hash Cond: (t0.i = (t1.i + 1)) + -> Seq Scan on csq_pullup t0 (cost=0.00..1.01 rows=1 width=17) + -> Hash (cost=1.01..1.01 rows=1 width=4) + -> Seq Scan on csq_pullup t1 (cost=0.00..1.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(6 rows) + +select * from csq_pullup t0 where not exists (select 1 from csq_pullup t1 where t0.i=t1.i + 1); + t | n | i | v +-----+---+---+----- + def | 3 | 1 | abc +(1 row) + +-- +-- wrong results bug MPP-16477 +-- +drop table if exists subselect_t1; +drop table if exists subselect_t2; +create table subselect_t1(x int); +insert into subselect_t1 values(1),(2); +create table subselect_t2(y int); +insert into subselect_t2 values(1),(2),(2); +analyze subselect_t1; +analyze subselect_t2; +explain select * from subselect_t1 where x in (select y from subselect_t2); + QUERY PLAN +------------------------------------------------------------------------ + Hash Semi Join (cost=1.07..2.13 rows=3 width=4) + Hash Cond: (subselect_t1.x = subselect_t2.y) + -> Seq Scan on subselect_t1 (cost=0.00..1.02 rows=2 width=4) + -> Hash (cost=1.03..1.03 rows=3 width=4) + -> Seq Scan on subselect_t2 (cost=0.00..1.03 rows=3 width=4) + Optimizer: Postgres query optimizer +(6 rows) + +select * from subselect_t1 where x in (select y from subselect_t2); + x +--- + 1 + 2 +(2 rows) + +-- start_ignore +-- Known_opt_diff: MPP-21351 +-- end_ignore +explain select * from subselect_t1 where x in (select y from subselect_t2 union all select y from subselect_t2); + QUERY PLAN +--------------------------------------------------------------------------------------------- + Hash Semi Join (cost=2.17..3.23 rows=3 width=4) + Hash Cond: (subselect_t1.x = subselect_t2.y) + -> Seq Scan on subselect_t1 (cost=0.00..1.02 rows=2 width=4) + -> Hash (cost=2.09..2.09 rows=6 width=4) + -> Append (cost=0.00..2.09 rows=6 width=4) + -> Seq Scan on subselect_t2 (cost=0.00..1.03 rows=3 width=4) + -> Seq Scan on subselect_t2 subselect_t2_1 (cost=0.00..1.03 rows=3 width=4) + Optimizer: Postgres query optimizer +(8 rows) + +select * from subselect_t1 where x in (select y from subselect_t2 union all select y from subselect_t2); + x +--- + 1 + 2 +(2 rows) + +explain select count(*) from subselect_t1 where x in (select y from subselect_t2); + QUERY PLAN +------------------------------------------------------------------------------ + Aggregate (cost=2.14..2.15 rows=1 width=8) + -> Hash Semi Join (cost=1.07..2.13 rows=3 width=0) + Hash Cond: (subselect_t1.x = subselect_t2.y) + -> Seq Scan on subselect_t1 (cost=0.00..1.02 rows=2 width=4) + -> Hash (cost=1.03..1.03 rows=3 width=4) + -> Seq Scan on subselect_t2 (cost=0.00..1.03 rows=3 width=4) + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from subselect_t1 where x in (select y from subselect_t2); + count +------- + 2 +(1 row) + +-- start_ignore +-- Known_opt_diff: MPP-21351 +-- end_ignore +explain select count(*) from subselect_t1 where x in (select y from subselect_t2 union all select y from subselect_t2); + QUERY PLAN +--------------------------------------------------------------------------------------------------- + Aggregate (cost=3.23..3.24 rows=1 width=8) + -> Hash Semi Join (cost=2.17..3.23 rows=3 width=0) + Hash Cond: (subselect_t1.x = subselect_t2.y) + -> Seq Scan on subselect_t1 (cost=0.00..1.02 rows=2 width=4) + -> Hash (cost=2.09..2.09 rows=6 width=4) + -> Append (cost=0.00..2.09 rows=6 width=4) + -> Seq Scan on subselect_t2 (cost=0.00..1.03 rows=3 width=4) + -> Seq Scan on subselect_t2 subselect_t2_1 (cost=0.00..1.03 rows=3 width=4) + Optimizer: Postgres query optimizer +(9 rows) + +select count(*) from subselect_t1 where x in (select y from subselect_t2 union all select y from subselect_t2); + count +------- + 2 +(1 row) + +select count(*) from + ( select 1 as FIELD_1 union all select 2 as FIELD_1 ) TABLE_1 + where FIELD_1 in ( select 1 as FIELD_1 union all select 1 as FIELD_1 union all select 1 as FIELD_1 ); + count +------- + 1 +(1 row) + + +-- +-- Query was deadlocking because of not squelching subplans (MPP-18936) +-- +drop table if exists t1; +drop table if exists t2; +drop table if exists t3; +drop table if exists t4; +CREATE TABLE t1 AS (SELECT generate_series(1, 5000) AS i, generate_series(5001, 10000) AS j); +CREATE TABLE t2 AS (SELECT * FROM t1 WHERE gp_segment_id = 0); +CREATE TABLE t3 AS (SELECT * FROM t1 WHERE gp_segment_id = 1); +CREATE TABLE t4 (i1 int, i2 int); +set gp_interconnect_queue_depth=1; +-- This query was deadlocking on a 2P system +INSERT INTO t4 +( +SELECT t1.i, (SELECT t3.i FROM t3 WHERE t3.i + 1 = t1.i + 1) +FROM t1, t3 +WHERE t1.i = t3.i +) +UNION +( +SELECT t1.i, (SELECT t2.i FROM t2 WHERE t2.i + 1 = t1.i + 1) +FROM t1, t2 +WHERE t1.i = t2.i +); +drop table if exists t1; +drop table if exists t2; +drop table if exists t3; +drop table if exists t4; +-- +-- Initplans with no corresponding params should be removed MPP-20600 +-- +drop table if exists t1; +NOTICE: table "t1" does not exist, skipping +drop table if exists t2; +NOTICE: table "t2" does not exist, skipping +create table t1(a int); +create table t2(b int); +select * from t1 where a=1 and a=2 and a > (select t2.b from t2); + a +--- +(0 rows) + +explain select * from t1 where a=1 and a=2 and a > (select t2.b from t2); + QUERY PLAN +---------------------------------------------------------------- + Result (cost=112.30..112.30 rows=0 width=0) + One-Time Filter: false + InitPlan 1 (returns $0) + -> Seq Scan on t2 (cost=0.00..112.30 rows=10230 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +explain select * from t1 where a=1 and a=2 and a > (select t2.b from t2) +union all +select * from t1 where a=1 and a=2 and a > (select t2.b from t2); + QUERY PLAN +------------------------------------------ + Result (cost=0.00..0.00 rows=0 width=0) + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select * from t1 where a=1 and a=2 and a > (select t2.b from t2) +union all +select * from t1 where a=1 and a=2 and a > (select t2.b from t2); + a +--- +(0 rows) + +explain select * from t1, +(select * from t1 where a=1 and a=2 and a > (select t2.b from t2)) foo +where t1.a = foo.a; + QUERY PLAN +---------------------------------------------------------------- + Result (cost=112.30..112.30 rows=0 width=8) + One-Time Filter: false + InitPlan 1 (returns $0) + -> Seq Scan on t2 (cost=0.00..112.30 rows=10230 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +select * from t1, +(select * from t1 where a=1 and a=2 and a > (select t2.b from t2)) foo +where t1.a = foo.a; + a | a +---+--- +(0 rows) + +-- +-- Correlated subqueries with limit/offset clause must not be pulled up as join +-- +insert into t1 values (1); +insert into t2 values (1); +explain select 1 from t1 where a in (select b from t2 where a = 1 limit 1); + QUERY PLAN +---------------------------------------------------------------------------- + Seq Scan on t1 (cost=0.00..112.30 rows=5115 width=4) + Filter: (SubPlan 1) + SubPlan 1 + -> Limit (cost=0.00..0.01 rows=1 width=4) + -> Result (cost=0.00..112.30 rows=10230 width=4) + One-Time Filter: (t1.a = 1) + -> Seq Scan on t2 (cost=0.00..112.30 rows=10230 width=4) + Optimizer: Postgres query optimizer +(8 rows) + +explain select 1 from t1 where a in (select b from t2 where a = 1 offset 1); + QUERY PLAN +---------------------------------------------------------------------------- + Seq Scan on t1 (cost=0.00..112.30 rows=5115 width=4) + Filter: (SubPlan 1) + SubPlan 1 + -> Limit (cost=0.01..112.30 rows=10229 width=4) + -> Result (cost=0.00..112.30 rows=10230 width=4) + One-Time Filter: (t1.a = 1) + -> Seq Scan on t2 (cost=0.00..112.30 rows=10230 width=4) + Optimizer: Postgres query optimizer +(8 rows) + +select 1 from t1 where a in (select b from t2 where a = 1 limit 1); + ?column? +---------- + 1 +(1 row) + +select 1 from t1 where a in (select b from t2 where a = 1 offset 1); + ?column? +---------- +(0 rows) + +drop table if exists t1; +drop table if exists t2; +-- +-- Test for a bug we used to have with eliminating InitPlans. The subplan, +-- (select max(content) from y), was eliminated when it shouldn't have been. +-- The query is supposed to return 0 rows, but returned > 0 when the bug was +-- present. +-- +CREATE TABLE initplan_x (i int4, t text); +insert into initplan_x values + (1, 'foobar1'), + (2, 'foobar2'), + (3, 'foobar3'), + (4, 'foobar4'), + (5, 'foobar5'); +CREATE TABLE initplan_y (content int4); +insert into initplan_y values (5); +select i, t from initplan_x +except +select g, t from initplan_x, + generate_series(0, (select max(content) from initplan_y)) g +order by 1; + i | t +---+--- +(0 rows) + +drop table if exists initplan_x; +drop table if exists initplan_y; +-- +-- Test Initplans that return multiple params. +-- +create table initplan_test(i int, j int, m int); +insert into initplan_test values (1,1,1); +select * from initplan_test where row(j, m) = (select j, m from initplan_test where i = 1); + i | j | m +---+---+--- + 1 | 1 | 1 +(1 row) + +drop table initplan_test; +-- +-- apply parallelization for subplan MPP-24563 +-- +create table t1_mpp_24563 (id int, value int); +insert into t1_mpp_24563 values (1, 3); +create table t2_mpp_24563 (id int, value int, seq int); +insert into t2_mpp_24563 values (1, 7, 5); +explain select row_number() over (order by seq asc) as id, foo.cnt +from +(select seq, (select count(*) from t1_mpp_24563 t1 where t1.id = t2.id) cnt from + t2_mpp_24563 t2 where value = 7) foo; + QUERY PLAN +------------------------------------------------------------------------------- + WindowAgg (cost=112.37..1124.04 rows=8 width=20) + Order By: t2.seq + -> Sort (cost=112.37..112.39 rows=8 width=8) + Sort Key: t2.seq + -> Seq Scan on t2_mpp_24563 t2 (cost=0.00..112.25 rows=8 width=8) + Filter: (value = 7) + SubPlan 1 + -> Aggregate (cost=123.65..123.66 rows=1 width=8) + -> Seq Scan on t1_mpp_24563 t1 (cost=0.00..123.62 rows=9 width=0) + Filter: (id = t2.id) + Optimizer: Postgres query optimizer +(11 rows) + +drop table t1_mpp_24563; +drop table t2_mpp_24563; +-- +-- MPP-20470 update the flow of node after parallelizing subplan. +-- +CREATE TABLE t_mpp_20470 ( + col_date timestamp without time zone, + col_name character varying(6), + col_expiry date +) PARTITION BY RANGE(col_date) +( +START ('2013-05-10 00:00:00'::timestamp without time zone) END ('2013-05-11 + 00:00:00'::timestamp without time zone) WITH (tablename='t_mpp_20470_ptr1', appendonly=false ), +START ('2013-05-24 00:00:00'::timestamp without time zone) END ('2013-05-25 + 00:00:00'::timestamp without time zone) WITH (tablename='t_mpp_20470_ptr2', appendonly=false ) +); +COPY t_mpp_20470 from STDIN delimiter '|' null ''; +create view v1_mpp_20470 as +SELECT +CASE + WHEN b.col_name::text = 'FUTCUR'::text + THEN ( SELECT count(a.col_expiry) AS count FROM t_mpp_20470 a WHERE + a.col_name::text = b.col_name::text)::text + ELSE 'Q2'::text END AS cc, 1 AS nn +FROM t_mpp_20470 b; +explain SELECT cc, sum(nn) over() FROM v1_mpp_20470; + QUERY PLAN +----------------------------------------------------------------------------------------- + WindowAgg (cost=0.00..1350351.98 rows=9620 width=40) + -> Append (cost=0.00..164.30 rows=9620 width=28) + -> Seq Scan on t_mpp_20470_ptr1 b_1 (cost=0.00..58.10 rows=4810 width=28) + -> Seq Scan on t_mpp_20470_ptr2 b_2 (cost=0.00..58.10 rows=4810 width=28) + SubPlan 1 + -> Aggregate (cost=140.32..140.33 rows=1 width=8) + -> Append (cost=0.00..140.30 rows=10 width=4) + -> Seq Scan on t_mpp_20470_ptr1 a_1 (cost=0.00..70.12 rows=5 width=4) + Filter: ((col_name)::text = (b.col_name)::text) + -> Seq Scan on t_mpp_20470_ptr2 a_2 (cost=0.00..70.12 rows=5 width=4) + Filter: ((col_name)::text = (b.col_name)::text) + Optimizer: Postgres query optimizer +(12 rows) + +drop view v1_mpp_20470; +drop table t_mpp_20470; +create table tbl_25484(id int, num int); +insert into tbl_25484 values(1, 1), (2, 2), (3, 3); +select id from tbl_25484 where 3 = (select 3 where 3 = (select num)); + id +---- + 3 +(1 row) + +drop table tbl_25484; +reset optimizer_segments; +reset optimizer_nestloop_factor; +-- +-- Test case that once triggered a bug in the IN-clause pull-up code. +-- +SELECT p.id + FROM (SELECT * FROM generate_series(1,10) id + WHERE id IN ( + SELECT 1 + UNION ALL + SELECT 0)) p; + id +---- + 1 +(1 row) + +-- +-- Verify another bug in the IN-clause pull-up code. This returned some +-- rows from xsupplier twice, because of a bug in detecting whether a +-- Redistribute node was needed. +-- +CREATE TABLE xlineitem (l_orderkey int4, l_suppkey int4); +insert into xlineitem select g+3, g from generate_series(10,100) g; +insert into xlineitem select g+1, g from generate_series(10,100) g; +insert into xlineitem select g, g from generate_series(10,100) g; +CREATE TABLE xsupplier (s_suppkey int4, s_name text); +insert into xsupplier select g, 'foo' || g from generate_series(1,10) g; +select s_name from xsupplier +where s_suppkey in ( + select g.l_suppkey from xlineitem g +) ; + s_name +-------- + foo10 +(1 row) + +-- +-- Another case that failed at one point. (A planner bug in pulling up a +-- subquery with constant distribution key, 1, in the outer queries.) +-- +create table nested_in_tbl(tc1 int, tc2 int); +select * from nested_in_tbl t1 where tc1 in + (select 1 from nested_in_tbl t2 where tc1 in + (select 1 from nested_in_tbl t3 where t3.tc2 = t2.tc2)); + tc1 | tc2 +-----+----- +(0 rows) + +drop table nested_in_tbl; +-- +-- Window query with a function scan that has non-correlated subquery. +-- +SELECT rank() over (partition by min(c) order by min(c)) AS p_rank FROM (SELECT d AS c FROM (values(1)) d1, generate_series(0,(SELECT 2)) AS d) tt GROUP BY c; + p_rank +-------- + 1 + 1 + 1 +(3 rows) + +-- +-- Remove unused subplans +-- +create table foo(a int, b int) partition by range(b) (start(1) end(3) every(1)); +create table bar(a int, b int); +with CT as (select a from foo except select a from bar) +select * from foo +where exists (select 1 from CT where CT.a = foo.a); + a | b +---+--- +(0 rows) + +drop table foo; +drop table bar; +-- +-- Multiple SUBPLAN nodes referring to the same plan_id +-- +CREATE TABLE bar_s (c integer, d character varying(10)); +INSERT INTO bar_s VALUES (9,9); +ANALYZE bar_s; +SELECT * FROM bar_s T1 WHERE c = (SELECT max(c) FROM bar_s T2 WHERE T2.d = T1.d GROUP BY c) AND c < 10; + c | d +---+--- + 9 | 9 +(1 row) + +CREATE TABLE foo_s (a integer, b integer) PARTITION BY RANGE(b) + (PARTITION sub_one START (1) END (10), + PARTITION sub_two START (11) END (22)); +INSERT INTO foo_s VALUES (9,9); +INSERT INTO foo_s VALUES (2,9); +SELECT bar_s.c from bar_s, foo_s WHERE foo_s.a=2 AND foo_s.b = (SELECT max(b) FROM foo_s WHERE bar_s.c = 9); + c +--- + 9 +(1 row) + +CREATE TABLE baz_s (i int4); +INSERT INTO baz_s VALUES (9); +ANALYZE baz_s; +-- In this query, the planner avoids using SubPlan 1 in the qual in the join, +-- because it avoids picking SubPlans from an equivalence class, when it has +-- other choices. +SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz_s WHERE bar_s.c = 9) AND foo_s.b = bar_s.d::int4; + c +--- + 9 + 9 +(2 rows) + +-- Same as above, but with another subquery, so it must use a SubPlan. There +-- are two references to the same SubPlan in the plan, on different slices. +-- GPDB_96_MERGE_FIXME: this EXPLAIN output should become nicer-looking once we +-- merge upstream commit 4d042999f9, to suppress the SubPlans from being +-- printed twice. +explain SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz_s WHERE bar_s.c = 9) AND foo_s.b = (select bar_s.d::int4); + QUERY PLAN +-------------------------------------------------------------------------------------------- + Hash Join (cost=2.06..340.42 rows=18 width=4) + Hash Cond: (foo_s.b = ((SubPlan 1))) + -> Append (cost=0.00..292.70 rows=18180 width=4) + -> Seq Scan on foo_s_1_prt_sub_one foo_s_1 (cost=0.00..100.90 rows=9090 width=4) + -> Seq Scan on foo_s_1_prt_sub_two foo_s_2 (cost=0.00..100.90 rows=9090 width=4) + -> Hash (cost=2.05..2.05 rows=1 width=12) + -> Seq Scan on bar_s (cost=0.00..2.05 rows=1 width=12) + Filter: ((SubPlan 1) = (SubPlan 2)) + SubPlan 1 + -> Aggregate (cost=1.01..1.02 rows=1 width=4) + -> Result (cost=0.00..1.01 rows=1 width=4) + One-Time Filter: (bar_s.c = 9) + -> Seq Scan on baz_s (cost=0.00..1.01 rows=1 width=4) + SubPlan 2 + -> Result (cost=0.00..0.01 rows=1 width=4) + Optimizer: Postgres query optimizer +(16 rows) + +SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz_s WHERE bar_s.c = 9) AND foo_s.b = (select bar_s.d::int4); + c +--- + 9 + 9 +(2 rows) + +DROP TABLE bar_s; +DROP TABLE foo_s; +DROP TABLE baz_s; +-- +-- EXPLAIN tests for queries in subselect.sql to significant plan changes +-- +-- Set up some simple test tables +CREATE TABLE SUBSELECT_TBL ( + f1 integer, + f2 integer, + f3 float +); +INSERT INTO SUBSELECT_TBL VALUES (1, 2, 3); +INSERT INTO SUBSELECT_TBL VALUES (2, 3, 4); +INSERT INTO SUBSELECT_TBL VALUES (3, 4, 5); +INSERT INTO SUBSELECT_TBL VALUES (1, 1, 1); +INSERT INTO SUBSELECT_TBL VALUES (2, 2, 2); +INSERT INTO SUBSELECT_TBL VALUES (3, 3, 3); +INSERT INTO SUBSELECT_TBL VALUES (6, 7, 8); +INSERT INTO SUBSELECT_TBL VALUES (8, 9, NULL); +ANALYZE SUBSELECT_TBL; +-- Uncorrelated subselects +EXPLAIN SELECT '' AS six, f1 AS "Uncorrelated Field" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL) ORDER BY 2; + QUERY PLAN +----------------------------------------------------------------------------------------------- + Sort (cost=2.50..2.52 rows=8 width=36) + Sort Key: subselect_tbl.f1 + -> Hash Semi Join (cost=1.18..2.38 rows=8 width=36) + Hash Cond: (subselect_tbl.f1 = subselect_tbl_1.f2) + -> Seq Scan on subselect_tbl (cost=0.00..1.08 rows=8 width=4) + -> Hash (cost=1.08..1.08 rows=8 width=4) + -> Seq Scan on subselect_tbl subselect_tbl_1 (cost=0.00..1.08 rows=8 width=4) + Optimizer: Postgres query optimizer +(8 rows) + +EXPLAIN SELECT '' AS six, f1 AS "Uncorrelated Field" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL WHERE + f2 IN (SELECT f1 FROM SUBSELECT_TBL)) ORDER BY 2; + QUERY PLAN +----------------------------------------------------------------------------------------------------------- + Sort (cost=3.77..3.79 rows=8 width=36) + Sort Key: subselect_tbl.f1 + -> Hash Semi Join (cost=2.45..3.65 rows=8 width=36) + Hash Cond: (subselect_tbl.f1 = subselect_tbl_1.f2) + -> Seq Scan on subselect_tbl (cost=0.00..1.08 rows=8 width=4) + -> Hash (cost=2.36..2.36 rows=7 width=8) + -> Hash Semi Join (cost=1.18..2.36 rows=7 width=8) + Hash Cond: (subselect_tbl_1.f2 = subselect_tbl_2.f1) + -> Seq Scan on subselect_tbl subselect_tbl_1 (cost=0.00..1.08 rows=8 width=4) + -> Hash (cost=1.08..1.08 rows=8 width=4) + -> Seq Scan on subselect_tbl subselect_tbl_2 (cost=0.00..1.08 rows=8 width=4) + Optimizer: Postgres query optimizer +(12 rows) + +EXPLAIN SELECT '' AS three, f1, f2 + FROM SUBSELECT_TBL + WHERE (f1, f2) NOT IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL + WHERE f3 IS NOT NULL) ORDER BY 2,3; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------- + Sort (cost=10000000003.33..10000000003.33 rows=3 width=40) + Sort Key: subselect_tbl.f1, subselect_tbl.f2 + -> Nested Loop Left Anti Semi (Not-In) Join (cost=10000000000.00..10000000003.30 rows=3 width=40) + Join Filter: ((subselect_tbl.f1 = subselect_tbl_1.f2) AND (subselect_tbl.f2 = (subselect_tbl_1.f3)::integer)) + -> Seq Scan on subselect_tbl (cost=0.00..1.08 rows=8 width=8) + -> Materialize (cost=0.00..1.11 rows=7 width=12) + -> Seq Scan on subselect_tbl subselect_tbl_1 (cost=0.00..1.08 rows=7 width=12) + Filter: (f3 IS NOT NULL) + Optimizer: Postgres query optimizer +(9 rows) + +ANALYZE tenk1; +EXPLAIN SELECT * FROM tenk1 a, tenk1 b +WHERE (a.unique1,b.unique2) IN (SELECT unique1,unique2 FROM tenk1 c); + QUERY PLAN +------------------------------------------------------------------------------------- + Hash Join (cost=770.00..1230.00 rows=10000 width=488) + Hash Cond: (c.unique2 = b.unique2) + -> Hash Join (cost=460.00..782.50 rows=10000 width=248) + Hash Cond: (a.unique1 = c.unique1) + -> Seq Scan on tenk1 a (cost=0.00..185.00 rows=10000 width=244) + -> Hash (cost=335.00..335.00 rows=10000 width=8) + -> HashAggregate (cost=235.00..335.00 rows=10000 width=8) + Group Key: c.unique1, c.unique2 + -> Seq Scan on tenk1 c (cost=0.00..185.00 rows=10000 width=8) + -> Hash (cost=185.00..185.00 rows=10000 width=244) + -> Seq Scan on tenk1 b (cost=0.00..185.00 rows=10000 width=244) + Optimizer: Postgres query optimizer +(12 rows) + +-- Correlated subselects +EXPLAIN SELECT '' AS six, f1 AS "Correlated Field", f2 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL WHERE f1 = upper.f1) ORDER BY 2,3; + QUERY PLAN +------------------------------------------------------------------------------- + Sort (cost=2.28..2.28 rows=3 width=40) + Sort Key: upper.f1, upper.f2 + -> Hash Semi Join (cost=1.11..2.25 rows=3 width=40) + Hash Cond: (upper.f1 = subselect_tbl.f1) + -> Seq Scan on subselect_tbl upper (cost=0.00..1.08 rows=8 width=8) + -> Hash (cost=1.10..1.10 rows=1 width=8) + -> Seq Scan on subselect_tbl (cost=0.00..1.10 rows=1 width=8) + Filter: (f1 = f2) + Optimizer: Postgres query optimizer +(9 rows) + +EXPLAIN SELECT '' AS six, f1 AS "Correlated Field", f3 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f1 IN + (SELECT f2 FROM SUBSELECT_TBL WHERE CAST(upper.f2 AS float) = f3) ORDER BY 2,3; + QUERY PLAN +---------------------------------------------------------------------------------------------------------- + Sort (cost=2.50..2.52 rows=6 width=44) + Sort Key: upper.f1, upper.f3 + -> Hash Semi Join (cost=1.20..2.43 rows=6 width=44) + Hash Cond: (((upper.f2)::double precision = subselect_tbl.f3) AND (upper.f1 = subselect_tbl.f2)) + -> Seq Scan on subselect_tbl upper (cost=0.00..1.08 rows=8 width=16) + -> Hash (cost=1.08..1.08 rows=8 width=12) + -> Seq Scan on subselect_tbl (cost=0.00..1.08 rows=8 width=12) + Optimizer: Postgres query optimizer +(8 rows) + +EXPLAIN SELECT '' AS six, f1 AS "Correlated Field", f3 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f3 IN (SELECT upper.f1 + f2 FROM SUBSELECT_TBL + WHERE f2 = CAST(f3 AS integer)) ORDER BY 2,3; + QUERY PLAN +------------------------------------------------------------------------------------- + Sort (cost=10000000002.39..10000000002.40 rows=3 width=44) + Sort Key: upper.f1, upper.f3 + -> Nested Loop Semi Join (cost=10000000000.00..10000000002.36 rows=3 width=44) + Join Filter: (((upper.f1 + subselect_tbl.f2))::double precision = upper.f3) + -> Seq Scan on subselect_tbl upper (cost=0.00..1.08 rows=8 width=12) + -> Materialize (cost=0.00..1.12 rows=1 width=4) + -> Seq Scan on subselect_tbl (cost=0.00..1.12 rows=1 width=4) + Filter: (f2 = (f3)::integer) + Optimizer: Postgres query optimizer +(9 rows) + +EXPLAIN SELECT '' AS five, f1 AS "Correlated Field" + FROM SUBSELECT_TBL + WHERE (f1, f2) IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL + WHERE f3 IS NOT NULL) ORDER BY 2; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------- + Sort (cost=2.50..2.52 rows=7 width=36) + Sort Key: subselect_tbl.f1 + -> Hash Semi Join (cost=1.19..2.40 rows=7 width=36) + Hash Cond: ((subselect_tbl.f1 = subselect_tbl_1.f2) AND (subselect_tbl.f2 = (subselect_tbl_1.f3)::integer)) + -> Seq Scan on subselect_tbl (cost=0.00..1.08 rows=8 width=8) + -> Hash (cost=1.08..1.08 rows=7 width=12) + -> Seq Scan on subselect_tbl subselect_tbl_1 (cost=0.00..1.08 rows=7 width=12) + Filter: (f3 IS NOT NULL) + Optimizer: Postgres query optimizer +(9 rows) + +-- +-- Test cases to catch unpleasant interactions between IN-join processing +-- and subquery pullup. +-- +EXPLAIN select count(*) from + (select 1 from tenk1 a + where unique1 IN (select hundred from tenk1 b)) ss; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Aggregate (cost=410.15..410.16 rows=1 width=8) + -> Hash Join (cost=197.53..409.90 rows=100 width=0) + Hash Cond: (a.unique1 = b.hundred) + -> Seq Scan on tenk1 a (cost=0.00..185.00 rows=10000 width=4) + -> Hash (cost=196.28..196.28 rows=100 width=4) + -> HashAggregate (cost=195.28..196.28 rows=100 width=4) + Group Key: b.hundred + -> Index Only Scan using tenk1_hundred on tenk1 b (cost=0.29..170.28 rows=10000 width=4) + Optimizer: Postgres query optimizer +(9 rows) + +EXPLAIN select count(distinct ss.ten) from + (select ten from tenk1 a + where unique1 IN (select hundred from tenk1 b)) ss; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Aggregate (cost=410.15..410.16 rows=1 width=8) + -> Hash Join (cost=197.53..409.90 rows=100 width=4) + Hash Cond: (a.unique1 = b.hundred) + -> Seq Scan on tenk1 a (cost=0.00..185.00 rows=10000 width=8) + -> Hash (cost=196.28..196.28 rows=100 width=4) + -> HashAggregate (cost=195.28..196.28 rows=100 width=4) + Group Key: b.hundred + -> Index Only Scan using tenk1_hundred on tenk1 b (cost=0.29..170.28 rows=10000 width=4) + Optimizer: Postgres query optimizer +(9 rows) + +EXPLAIN select count(*) from + (select 1 from tenk1 a + where unique1 IN (select distinct hundred from tenk1 b)) ss; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Aggregate (cost=410.03..410.04 rows=1 width=8) + -> Hash Join (cost=197.53..409.78 rows=100 width=0) + Hash Cond: (a.unique1 = b.hundred) + -> Seq Scan on tenk1 a (cost=0.00..185.00 rows=10000 width=4) + -> Hash (cost=196.28..196.28 rows=100 width=4) + -> Unique (cost=0.29..195.28 rows=100 width=4) + Group Key: b.hundred + -> Index Only Scan using tenk1_hundred on tenk1 b (cost=0.29..170.28 rows=10000 width=4) + Optimizer: Postgres query optimizer +(9 rows) + +EXPLAIN select count(distinct ss.ten) from + (select ten from tenk1 a + where unique1 IN (select distinct hundred from tenk1 b)) ss; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Aggregate (cost=410.03..410.04 rows=1 width=8) + -> Hash Join (cost=197.53..409.78 rows=100 width=4) + Hash Cond: (a.unique1 = b.hundred) + -> Seq Scan on tenk1 a (cost=0.00..185.00 rows=10000 width=8) + -> Hash (cost=196.28..196.28 rows=100 width=4) + -> Unique (cost=0.29..195.28 rows=100 width=4) + Group Key: b.hundred + -> Index Only Scan using tenk1_hundred on tenk1 b (cost=0.29..170.28 rows=10000 width=4) + Optimizer: Postgres query optimizer +(9 rows) + +-- +-- In case of simple exists query, planner can generate alternative +-- subplans and choose one of them during execution based on the cost. +-- The below test check that we are generating alternative subplans, +-- we should see 2 subplans in the explain +-- +EXPLAIN SELECT EXISTS(SELECT * FROM tenk1 WHERE tenk1.unique1 = tenk2.unique1) FROM tenk2 LIMIT 1; + QUERY PLAN +------------------------------------------------------------------------- + Limit (cost=0.00..4.32 rows=1 width=1) + -> Seq Scan on tenk2 (cost=0.00..43210.00 rows=10000 width=1) + SubPlan 2 + -> Seq Scan on tenk1 (cost=0.00..185.00 rows=10000 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +SELECT EXISTS(SELECT * FROM tenk1 WHERE tenk1.unique1 = tenk2.unique1) FROM tenk2 LIMIT 1; + exists +-------- + t +(1 row) + +-- +-- Ensure that NOT is not lost during subquery pull-up +-- +SELECT 1 AS col1 WHERE NOT (SELECT 1 = 1); + col1 +------ +(0 rows) + +-- +-- Test sane behavior in case of semi join semantics +-- +-- start_ignore +DROP TABLE IF EXISTS dedup_test1; +NOTICE: table "dedup_test1" does not exist, skipping +DROP TABLE IF EXISTS dedup_test2; +NOTICE: table "dedup_test2" does not exist, skipping +DROP TABLE IF EXISTS dedup_test3; +NOTICE: table "dedup_test3" does not exist, skipping +-- end_ignore +CREATE TABLE dedup_test1 ( a int, b int ); +CREATE TABLE dedup_test2 ( e int, f int ); +CREATE TABLE dedup_test3 ( a int, b int, c int) PARTITION BY RANGE(c) (START(1) END(2) EVERY(1)); +INSERT INTO dedup_test1 select i, i from generate_series(1,4)i; +INSERT INTO dedup_test2 select i, i from generate_series(1,4)i; +INSERT INTO dedup_test3 select 1, 1, 1 from generate_series(1,10); +ANALYZE dedup_test1; +ANALYZE dedup_test2; +ANALYZE dedup_test3; +EXPLAIN SELECT * FROM dedup_test1 INNER JOIN dedup_test2 ON dedup_test1.a= dedup_test2.e WHERE (a) IN (SELECT a FROM dedup_test3); + QUERY PLAN +-------------------------------------------------------------------------------------------------------- + Hash Join (cost=2.24..3.37 rows=3 width=16) + Hash Cond: (dedup_test1.a = dedup_test2.e) + -> Hash Join (cost=1.15..2.23 rows=3 width=12) + Hash Cond: (dedup_test1.a = dedup_test3.a) + -> Seq Scan on dedup_test1 (cost=0.00..1.04 rows=4 width=8) + -> Hash (cost=1.14..1.14 rows=1 width=4) + -> HashAggregate (cost=1.12..1.14 rows=1 width=4) + Group Key: dedup_test3.a + -> Seq Scan on dedup_test3_1_prt_1 dedup_test3 (cost=0.00..1.10 rows=10 width=4) + -> Hash (cost=1.04..1.04 rows=4 width=8) + -> Seq Scan on dedup_test2 (cost=0.00..1.04 rows=4 width=8) + Optimizer: Postgres query optimizer +(12 rows) + +SELECT * FROM dedup_test1 INNER JOIN dedup_test2 ON dedup_test1.a= dedup_test2.e WHERE (a) IN (SELECT a FROM dedup_test3); + a | b | e | f +---+---+---+--- + 1 | 1 | 1 | 1 +(1 row) + +-- Test planner to check if it optimizes the join and marks it as a dummy join +EXPLAIN SELECT * FROM dedup_test3, dedup_test1 WHERE c = 7 AND dedup_test3.b IN (SELECT b FROM dedup_test1); + QUERY PLAN +------------------------------------------ + Result (cost=0.00..0.00 rows=0 width=8) + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN SELECT * FROM dedup_test3, dedup_test1 WHERE c = 7 AND dedup_test3.b IN (SELECT a FROM dedup_test1); + QUERY PLAN +------------------------------------------ + Result (cost=0.00..0.00 rows=0 width=8) + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN SELECT * FROM dedup_test3, dedup_test1 WHERE c = 7 AND EXISTS (SELECT b FROM dedup_test1) AND dedup_test3.b IN (SELECT b FROM dedup_test1); + QUERY PLAN +------------------------------------------------------------------- + Result (cost=0.26..0.26 rows=0 width=8) + One-Time Filter: false + InitPlan 1 (returns $0) + -> Seq Scan on dedup_test1 (cost=0.00..1.04 rows=4 width=4) + Optimizer: Postgres query optimizer +(5 rows) + +-- More dedup semi-join tests. +create table dedup_tab (a int4) ; +insert into dedup_tab select g from generate_series(1,100) g; +analyze dedup_tab; +create table dedup_reptab (a int4) ; +insert into dedup_reptab select generate_series(1,1); +analyze dedup_reptab; +-- Replicated table on the inner side of the join. The replicated table needs +-- be broadcast from a single node to the others, with a unique RowIdExpr +-- tacked on, because even though all the rows are available in all the +-- segments, you cannot distinguish join rows generated by the same "logical" +-- row otherwise. +explain (costs off) +select * from dedup_reptab r where r.a in (select t.a/10 from dedup_tab t); + QUERY PLAN +------------------------------------- + Hash Semi Join + Hash Cond: (r.a = (t.a / 10)) + -> Seq Scan on dedup_reptab r + -> Hash + -> Seq Scan on dedup_tab t + Optimizer: Postgres query optimizer +(6 rows) + +select * from dedup_reptab r where r.a in (select t.a/10 from dedup_tab t); + a +--- + 1 +(1 row) + +-- Try the same with a General-locus function. In GPDB 6 and below, this +-- generated a plan that did create the same logical row ID on each segment, +-- on the assumption that an immutable function generates the result rows +-- in the same order on all segments. We no longer assume that, and generate +-- the same plan with a broadcast as the case with a replicated table. +-- +-- We have to create a custom function for this, instead of using +-- generate_series() directly, because the rows-estimate for generate_series() +-- is so high that we don't get the plan we want. (After PostgreSQL v12 we +-- could though, because the cost estimation of functions was improved.) +create function dedup_srf() RETURNS SETOF int AS $$ + begin + return query select generate_series(1, 3); + end; +$$ LANGUAGE plpgsql IMMUTABLE ROWS 3; +create function dedup_srf_stable() RETURNS SETOF int AS $$ + begin + return query select generate_series(1, 3); + end; +$$ LANGUAGE plpgsql STABLE ROWS 3; +create function dedup_srf_volatile() RETURNS SETOF int AS $$ + begin + return query select generate_series(1, 3); + end; +$$ LANGUAGE plpgsql VOLATILE ROWS 3; +explain (costs off) +select * from dedup_srf() r(a) where r.a in (select t.a/10 from dedup_tab t); + QUERY PLAN +------------------------------------- + Hash Semi Join + Hash Cond: (r.a = (t.a / 10)) + -> Function Scan on dedup_srf r + -> Hash + -> Seq Scan on dedup_tab t + Optimizer: Postgres query optimizer +(6 rows) + +select * from dedup_srf() r(a) where r.a in (select t.a/10 from dedup_tab t); + a +--- + 1 + 2 + 3 +(3 rows) + +explain (costs off) +select * from dedup_srf_stable() r(a) where r.a in (select t.a/10 from dedup_tab t); + QUERY PLAN +------------------------------------------- + Hash Semi Join + Hash Cond: (r.a = (t.a / 10)) + -> Function Scan on dedup_srf_stable r + -> Hash + -> Seq Scan on dedup_tab t + Optimizer: Postgres query optimizer +(6 rows) + +select * from dedup_srf_stable() r(a) where r.a in (select t.a/10 from dedup_tab t); + a +--- + 1 + 2 + 3 +(3 rows) + +explain (costs off) +select * from dedup_srf_volatile() r(a) where r.a in (select t.a/10 from dedup_tab t); + QUERY PLAN +--------------------------------------------- + Hash Semi Join + Hash Cond: (r.a = (t.a / 10)) + -> Function Scan on dedup_srf_volatile r + -> Hash + -> Seq Scan on dedup_tab t + Optimizer: Postgres query optimizer +(6 rows) + +select * from dedup_srf_volatile() r(a) where r.a in (select t.a/10 from dedup_tab t); + a +--- + 1 + 2 + 3 +(3 rows) + +-- Also test it with non-SRFs. In principle, since the function returns exactly +-- one row, no deduplication would be needed in these cases. But the planner +-- doesn't recognize that currently, so you get the same kind of plan as with +-- set-returning functions. +create function dedup_func() RETURNS int AS $$ + select 5; +$$ LANGUAGE SQL IMMUTABLE; +create function dedup_func_stable() RETURNS int AS $$ + select 5; +$$ LANGUAGE SQL STABLE; +create function dedup_func_volatile() RETURNS int AS $$ + select 5; +$$ LANGUAGE SQL VOLATILE; +explain (costs off) +select * from dedup_func() r(a) where r.a in (select t.a/10 from dedup_tab t); + QUERY PLAN +------------------------------------- + Nested Loop Semi Join + -> Result + -> Seq Scan on dedup_tab t + Filter: (5 = (a / 10)) + Optimizer: Postgres query optimizer +(5 rows) + +select * from dedup_func() r(a) where r.a in (select t.a/10 from dedup_tab t); + a +--- + 5 +(1 row) + +explain (costs off) +select * from dedup_func_stable() r(a) where r.a in (select t.a/10 from dedup_tab t); + QUERY PLAN +------------------------------------- + Nested Loop Semi Join + -> Result + -> Seq Scan on dedup_tab t + Filter: (5 = (a / 10)) + Optimizer: Postgres query optimizer +(5 rows) + +select * from dedup_func_stable() r(a) where r.a in (select t.a/10 from dedup_tab t); + a +--- + 5 +(1 row) + +explain (costs off) +select * from dedup_func_volatile() r(a) where r.a in (select t.a/10 from dedup_tab t); + QUERY PLAN +------------------------------------- + Hash Semi Join + Hash Cond: (($0) = (t.a / 10)) + -> Result + InitPlan 1 (returns $0) + -> Result + -> Hash + -> Seq Scan on dedup_tab t + Optimizer: Postgres query optimizer +(8 rows) + +select * from dedup_func_volatile() r(a) where r.a in (select t.a/10 from dedup_tab t); + a +--- + 5 +(1 row) + +-- +-- Test init/main plan are not both parallel +-- +create table init_main_plan_parallel (c1 int, c2 int); +-- case 1: init plan is parallel, main plan is not. +select relname from pg_class where exists(select * from init_main_plan_parallel); + relname +--------- +(0 rows) + +-- case2: init plan is not parallel, main plan is parallel +select * from init_main_plan_parallel where exists (select * from pg_class); + c1 | c2 +----+---- +(0 rows) + +-- A subplan whose targetlist might be expanded to make sure all entries of its +-- hashExpr are in its targetlist, test the motion node above it also updated +-- its targetlist, otherwise, a wrong answer or a crash happens. +DROP TABLE IF EXISTS TEST_IN; +NOTICE: table "test_in" does not exist, skipping +CREATE TABLE TEST_IN( + C01 FLOAT, + C02 NUMERIC(10,0) +); +--insert repeatable records: +INSERT INTO TEST_IN +SELECT + ROUND(RANDOM()*1E1),ROUND(RANDOM()*1E1) +FROM GENERATE_SERIES(1,1E4::BIGINT) I; +ANALYZE TEST_IN; +SELECT COUNT(*) FROM +TEST_IN A +WHERE A.C01 IN(SELECT C02 FROM TEST_IN); + count +------- + 10000 +(1 row) + +-- +-- Variant of the test in upstream 'subselect' test, for PostgreSQL bug #14924 +-- At one point, this produced wrong results on GPDB for different reasons than +-- the original bug: we forgot to handle the VALUES list in the function to +-- mutate a plan tree (plan_tree_mutator()). +-- +create temp table onerowtmp as select 1; +select val.x + from generate_series(1,10) as s(i), + lateral ( + values ((select s.i + 1 from onerowtmp)), (s.i + 101) + ) as val(x) +where s.i < 10 and val.x < 110; + x +----- + 2 + 102 + 3 + 103 + 4 + 104 + 5 + 105 + 6 + 106 + 7 + 107 + 8 + 108 + 9 + 109 + 10 +(17 rows) + +-- EXISTS sublink simplication +drop table if exists simplify_sub; +NOTICE: table "simplify_sub" does not exist, skipping +create table simplify_sub (i int); +insert into simplify_sub values (1); +insert into simplify_sub values (2); +analyze simplify_sub; +-- limit n +explain (costs off) +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 1); + QUERY PLAN +----------------------------------------- + Hash Semi Join + Hash Cond: (t1.i = t2.i) + -> Seq Scan on simplify_sub t1 + -> Hash + -> Seq Scan on simplify_sub t2 + Optimizer: Postgres query optimizer +(6 rows) + +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 1); + i +--- + 1 + 2 +(2 rows) + +explain (costs off) +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 1); + QUERY PLAN +----------------------------------------- + Hash Anti Join + Hash Cond: (t1.i = t2.i) + -> Seq Scan on simplify_sub t1 + -> Hash + -> Seq Scan on simplify_sub t2 + Optimizer: Postgres query optimizer +(6 rows) + +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 1); + i +--- +(0 rows) + +explain (costs off) +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 0); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 0); + i +--- +(0 rows) + +explain (costs off) +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 0); + QUERY PLAN +------------------------------------- + Seq Scan on simplify_sub t1 + Optimizer: Postgres query optimizer +(2 rows) + +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 0); + i +--- + 1 + 2 +(2 rows) + +explain (costs off) +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit all); + QUERY PLAN +----------------------------------------- + Hash Semi Join + Hash Cond: (t1.i = t2.i) + -> Seq Scan on simplify_sub t1 + -> Hash + -> Seq Scan on simplify_sub t2 + Optimizer: Postgres query optimizer +(6 rows) + +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit all); + i +--- + 1 + 2 +(2 rows) + +explain (costs off) +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit all); + QUERY PLAN +----------------------------------------- + Hash Anti Join + Hash Cond: (t1.i = t2.i) + -> Seq Scan on simplify_sub t1 + -> Hash + -> Seq Scan on simplify_sub t2 + Optimizer: Postgres query optimizer +(6 rows) + +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit all); + i +--- +(0 rows) + +explain (costs off) +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit NULL); + QUERY PLAN +----------------------------------------- + Hash Semi Join + Hash Cond: (t1.i = t2.i) + -> Seq Scan on simplify_sub t1 + -> Hash + -> Seq Scan on simplify_sub t2 + Optimizer: Postgres query optimizer +(6 rows) + +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit NULL); + i +--- + 1 + 2 +(2 rows) + +explain (costs off) +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit NULL); + QUERY PLAN +----------------------------------------- + Hash Anti Join + Hash Cond: (t1.i = t2.i) + -> Seq Scan on simplify_sub t1 + -> Hash + -> Seq Scan on simplify_sub t2 + Optimizer: Postgres query optimizer +(6 rows) + +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit NULL); + i +--- +(0 rows) + +-- aggregates without GROUP BY or HAVING +explain (costs off) +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i); + QUERY PLAN +------------------------------------- + Seq Scan on simplify_sub t1 + Optimizer: Postgres query optimizer +(2 rows) + +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i); + i +--- + 1 + 2 +(2 rows) + +explain (costs off) +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i); + i +--- +(0 rows) + +explain (costs off) +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 0); + QUERY PLAN +------------------------------------- + Seq Scan on simplify_sub t1 + Optimizer: Postgres query optimizer +(2 rows) + +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 0); + i +--- + 1 + 2 +(2 rows) + +explain (costs off) +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 0); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 0); + i +--- +(0 rows) + +explain (costs off) +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 1); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 1); + i +--- +(0 rows) + +explain (costs off) +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 1); + QUERY PLAN +------------------------------------- + Seq Scan on simplify_sub t1 + Optimizer: Postgres query optimizer +(2 rows) + +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 1); + i +--- + 1 + 2 +(2 rows) + +explain (costs off) +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset NULL); + QUERY PLAN +------------------------------------- + Seq Scan on simplify_sub t1 + Optimizer: Postgres query optimizer +(2 rows) + +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset NULL); + i +--- + 1 + 2 +(2 rows) + +explain (costs off) +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset NULL); + QUERY PLAN +------------------------------------- + Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(3 rows) + +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset NULL); + i +--- +(0 rows) + +drop table if exists simplify_sub; +-- +-- Test a couple of cases where a SubPlan is used in a Motion's hash key. +-- +create table foo (i int4, j int4); +create table bar (i int4, j int4); +create table baz (i int4, j int4); +insert into foo select g, g from generate_series(1, 10) g; +insert into bar values (1, 1); +insert into baz select g, g from generate_series(5, 100) g; +analyze foo; +analyze bar; +analyze baz; +explain (verbose, costs off) +select * from foo left outer join baz on (select bar.i from bar where bar.i = foo.i) + 1 = baz.j; + QUERY PLAN +-------------------------------------------------- + Hash Right Join + Output: foo.i, foo.j, baz.i, baz.j + Hash Cond: (baz.j = (((SubPlan 1)) + 1)) + -> Seq Scan on subselect_gp.baz + Output: baz.i, baz.j + -> Hash + Output: foo.i, foo.j, ((SubPlan 1)) + -> Seq Scan on subselect_gp.foo + Output: foo.i, foo.j, (SubPlan 1) + SubPlan 1 + -> Seq Scan on subselect_gp.bar + Output: bar.i + Filter: (bar.i = foo.i) + Optimizer: Postgres query optimizer +(15 rows) + +select * from foo left outer join baz on (select bar.i from bar where bar.i = foo.i) + 1 = baz.j; + i | j | i | j +----+----+---+--- + 10 | 10 | | + 9 | 9 | | + 8 | 8 | | + 7 | 7 | | + 6 | 6 | | + 5 | 5 | | + 4 | 4 | | + 3 | 3 | | + 2 | 2 | | + 1 | 1 | | +(10 rows) + +-- This is a variant of a query in the upstream 'subselect' test, with the +-- twist that baz.i is the distribution key for the table. In the plan, the +-- CASE WHEN construct with SubPlan is used as Hash Key in the Redistribute +-- Motion. It is a planned as a hashed SubPlan. (We had a bug at one point, +-- where the hashed SubPlan was added to the target list twice, which +-- caused an error at runtime when the executor tried to build the hash +-- table twice, because the Motion in the SubPlan couldn't be rescanned.) +explain (verbose, costs off) +select * from foo where + (case when foo.i in (select a.i from baz a) then foo.i else null end) in + (select b.i from baz b); + QUERY PLAN +--------------------------------------------------------------------------------------- + Hash Semi Join + Output: foo.i, foo.j + Hash Cond: (CASE WHEN ((hashed SubPlan 1)) THEN foo.i ELSE NULL::integer END = b.i) + -> Seq Scan on subselect_gp.foo + Output: foo.i, foo.j, (hashed SubPlan 1) + SubPlan 1 + -> Seq Scan on subselect_gp.baz a + Output: a.i + -> Hash + Output: b.i + -> Seq Scan on subselect_gp.baz b + Output: b.i + Optimizer: Postgres query optimizer +(14 rows) + +select * from foo where + (case when foo.i in (select a.i from baz a) then foo.i else null end) in + (select b.i from baz b); + i | j +----+---- + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 +(6 rows) + +-- When creating plan with subquery and CTE, it sets the useless flow for the plan. +-- But we only need flow for the topmost plan and child of the motion. See commit +-- https://github.com/greenplum-db/gpdb/commit/93abe741cd67f04958e2951edff02b45ab6e280f for detail +-- The extra flow will cause subplan set wrong motionType and cause an ERROR +-- unexpected gang size: XX +-- This related to issue: https://github.com/greenplum-db/gpdb/issues/12371 +create table extra_flow_dist(a int, b int, c date); +create table extra_flow_dist1(a int, b int); +insert into extra_flow_dist select i, i, '1949-10-01'::date from generate_series(1, 10)i; +insert into extra_flow_dist1 select i, i from generate_series(20, 22)i; +-- case 1 subplan with outer general locus (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below general locus path + ) dt + from (select ( max(1) ) x) a -- general locus +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + QUERY PLAN +-------------------------------------------------------------- + Nested Loop + Output: run_dt.dt, extra_flow_dist1.a, extra_flow_dist1.b + -> Subquery Scan on run_dt + Output: run_dt.dt + Filter: (run_dt.dt < '01-01-2010'::date) + -> Subquery Scan on a + Output: (SubPlan 1) + -> Aggregate + Output: max(1) + -> Result + SubPlan 1 + -> Seq Scan on subselect_gp.extra_flow_dist + Output: extra_flow_dist.c + Filter: (extra_flow_dist.b = a.x) + -> Seq Scan on subselect_gp.extra_flow_dist1 + Output: extra_flow_dist1.a, extra_flow_dist1.b + Optimizer: Postgres query optimizer +(18 rows) + +with run_dt as ( + select + ( + select c from extra_flow_dist where b = x + ) dt + from (select ( max(1) ) x) a +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + dt | a | b +------------+----+---- + 10-01-1949 | 20 | 20 + 10-01-1949 | 21 | 21 + 10-01-1949 | 22 | 22 +(3 rows) + +create table extra_flow_rand(a int) ; +insert into extra_flow_rand values (1); +-- case 2 for subplan with outer segment general locus (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below segment general locus path + ) dt + from (select a x from extra_flow_rand) a -- segment general locus +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + QUERY PLAN +----------------------------------------------------------------------- + Nested Loop + Output: run_dt.dt, extra_flow_dist1.a, extra_flow_dist1.b + -> Subquery Scan on run_dt + Output: run_dt.dt + Filter: (run_dt.dt < '01-01-2010'::date) + -> Seq Scan on subselect_gp.extra_flow_rand + Output: (SubPlan 1) + SubPlan 1 + -> Seq Scan on subselect_gp.extra_flow_dist + Output: extra_flow_dist.c + Filter: (extra_flow_dist.b = extra_flow_rand.a) + -> Materialize + Output: extra_flow_dist1.a, extra_flow_dist1.b + -> Seq Scan on subselect_gp.extra_flow_dist1 + Output: extra_flow_dist1.a, extra_flow_dist1.b + Optimizer: Postgres query optimizer +(17 rows) + +with run_dt as ( + select + ( + select c from extra_flow_dist where b = x + ) dt + from (select a x from extra_flow_rand) a +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + dt | a | b +------------+----+---- + 10-01-1949 | 20 | 20 + 10-01-1949 | 21 | 21 + 10-01-1949 | 22 | 22 +(3 rows) + +-- case 3 for subplan with outer entry locus (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below entry locus path + ) dt + from (select 1 x from pg_class limit 1) a -- entry locus +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + QUERY PLAN +-------------------------------------------------------------- + Nested Loop + Output: run_dt.dt, extra_flow_dist1.a, extra_flow_dist1.b + -> Subquery Scan on run_dt + Output: run_dt.dt + Filter: (run_dt.dt < '01-01-2010'::date) + -> Subquery Scan on a + Output: (SubPlan 1) + -> Limit + Output: 1 + -> Seq Scan on pg_catalog.pg_class + Output: 1 + SubPlan 1 + -> Seq Scan on subselect_gp.extra_flow_dist + Output: extra_flow_dist.c + Filter: (extra_flow_dist.b = a.x) + -> Seq Scan on subselect_gp.extra_flow_dist1 + Output: extra_flow_dist1.a, extra_flow_dist1.b + Optimizer: Postgres query optimizer +(19 rows) + +with run_dt as ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below entry locus path + ) dt + from (select 1 x from pg_class limit 1) a -- entry locus +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + dt | a | b +------------+----+---- + 10-01-1949 | 20 | 20 + 10-01-1949 | 21 | 21 + 10-01-1949 | 22 | 22 +(3 rows) + +-- case 4 subplan with outer segment general locus without param in subplan (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select x, y dt + from (select a x from extra_flow_rand ) a -- segment general locus + left join (select max(1) y) aaa + on a.x > any (select random() from extra_flow_dist) -- subplan's outer is the above segment general locus path +) +select * from run_dt, extra_flow_dist1 +where dt < extra_flow_dist1.a; + QUERY PLAN +------------------------------------------------------------------------------- + Nested Loop + Output: extra_flow_rand.a, (max(1)), extra_flow_dist1.a, extra_flow_dist1.b + Join Filter: ((max(1)) < extra_flow_dist1.a) + -> Nested Loop Left Join + Output: extra_flow_rand.a, (max(1)) + Inner Unique: true + Join Filter: ((SubPlan 1)) + -> Seq Scan on subselect_gp.extra_flow_rand + Output: extra_flow_rand.a, (SubPlan 1) + SubPlan 1 + -> Materialize + Output: (random()) + -> Seq Scan on subselect_gp.extra_flow_dist + Output: random() + -> Materialize + Output: (max(1)) + -> Aggregate + Output: max(1) + -> Result + -> Materialize + Output: extra_flow_dist1.a, extra_flow_dist1.b + -> Seq Scan on subselect_gp.extra_flow_dist1 + Output: extra_flow_dist1.a, extra_flow_dist1.b + Optimizer: Postgres query optimizer +(25 rows) + +-- case 5 for subplan with outer entry locus without param in subplan (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select x, y dt + from (select relnatts x from pg_class ) a -- entry locus + left join (select max(1) y) aaa + on a.x > any (select random() from extra_flow_dist) -- subplan's outer is the above entry loucs +) +select * from run_dt, extra_flow_dist1 +where dt < extra_flow_dist1.a; + QUERY PLAN +------------------------------------------------------------------------------- + Nested Loop + Output: pg_class.relnatts, (max(1)), extra_flow_dist1.a, extra_flow_dist1.b + Join Filter: ((max(1)) < extra_flow_dist1.a) + -> Nested Loop Left Join + Output: pg_class.relnatts, (max(1)) + Inner Unique: true + Join Filter: ((SubPlan 1)) + -> Seq Scan on pg_catalog.pg_class + Output: pg_class.relnatts, (SubPlan 1) + SubPlan 1 + -> Materialize + Output: (random()) + -> Seq Scan on subselect_gp.extra_flow_dist + Output: random() + -> Materialize + Output: (max(1)) + -> Aggregate + Output: max(1) + -> Result + -> Materialize + Output: extra_flow_dist1.a, extra_flow_dist1.b + -> Seq Scan on subselect_gp.extra_flow_dist1 + Output: extra_flow_dist1.a, extra_flow_dist1.b + Optimizer: Postgres query optimizer +(25 rows) + +-- case 6 without CTE, nested subquery should not add extral flow +explain (verbose, costs off) select * from ( + select dt from ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below general locus path + ) dt + from (select ( max(1) ) x) a -- general locus + union + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below general locus path + ) dt + from (select ( max(1) ) x) aa -- general locus + ) tbl +) run_dt, +extra_flow_dist1 +where dt < '2010-01-01'::date; + QUERY PLAN +-------------------------------------------------------------------------------------------------- + Nested Loop + Output: tbl.dt, extra_flow_dist1.a, extra_flow_dist1.b + -> Subquery Scan on tbl + Output: tbl.dt + Filter: (tbl.dt < '01-01-2010'::date) + -> Unique + Output: ((SubPlan 1)) + Group Key: ((SubPlan 1)) + -> Sort + Output: ((SubPlan 1)) + Sort Key: ((SubPlan 1)) + -> Append + -> Subquery Scan on a + Output: (SubPlan 1) + -> Aggregate + Output: max(1) + -> Result + SubPlan 1 + -> Seq Scan on subselect_gp.extra_flow_dist + Output: extra_flow_dist.c + Filter: (extra_flow_dist.b = a.x) + -> Subquery Scan on aa + Output: (SubPlan 2) + -> Aggregate + Output: max(1) + -> Result + SubPlan 2 + -> Seq Scan on subselect_gp.extra_flow_dist extra_flow_dist_1 + Output: extra_flow_dist_1.c + Filter: (extra_flow_dist_1.b = aa.x) + -> Seq Scan on subselect_gp.extra_flow_dist1 + Output: extra_flow_dist1.a, extra_flow_dist1.b + Optimizer: Postgres query optimizer +(34 rows) + +-- Check DISTINCT ON clause and ORDER BY clause in SubLink, See https://github.com/greenplum-db/gpdb/issues/12656. +-- For EXISTS SubLink, we don’t need to care about the data deduplication problem, we can delete DISTINCT ON clause and +-- ORDER BY clause with confidence, because we only care about whether the data exists. +-- But for ANY SubLink, wo can't do this, because we not only care about the existence of data, but also the content of +-- the data. +create table issue_12656 ( + i int, + j int +); +insert into issue_12656 values (1, 10001), (1, 10002); +-- case 1, check basic DISTINCT ON +explain (costs off, verbose) +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656); + QUERY PLAN +---------------------------------------------------------------------------------------- + Hash Join + Output: issue_12656.i, issue_12656.j + Inner Unique: true + Hash Cond: ((issue_12656.i = issue_12656_1.i) AND (issue_12656.j = issue_12656_1.j)) + -> Seq Scan on subselect_gp.issue_12656 + Output: issue_12656.i, issue_12656.j + -> Hash + Output: issue_12656_1.i, issue_12656_1.j + -> Unique + Output: issue_12656_1.i, issue_12656_1.j + Group Key: issue_12656_1.i + -> Sort + Output: issue_12656_1.i, issue_12656_1.j + Sort Key: issue_12656_1.i + -> Seq Scan on subselect_gp.issue_12656 issue_12656_1 + Output: issue_12656_1.i, issue_12656_1.j + Optimizer: Postgres query optimizer +(18 rows) + +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656); + i | j +---+------- + 1 | 10001 +(1 row) + +-- case 2, check DISTINCT ON and ORDER BY +explain (costs off, verbose) +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656 order by i, j asc); + QUERY PLAN +---------------------------------------------------------------------------------------- + Hash Join + Output: issue_12656.i, issue_12656.j + Inner Unique: true + Hash Cond: ((issue_12656.i = issue_12656_1.i) AND (issue_12656.j = issue_12656_1.j)) + -> Seq Scan on subselect_gp.issue_12656 + Output: issue_12656.i, issue_12656.j + -> Hash + Output: issue_12656_1.i, issue_12656_1.j + -> Unique + Output: issue_12656_1.i, issue_12656_1.j + Group Key: issue_12656_1.i + -> Sort + Output: issue_12656_1.i, issue_12656_1.j + Sort Key: issue_12656_1.i, issue_12656_1.j + -> Seq Scan on subselect_gp.issue_12656 issue_12656_1 + Output: issue_12656_1.i, issue_12656_1.j + Optimizer: Postgres query optimizer +(18 rows) + +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656 order by i, j asc); + i | j +---+------- + 1 | 10001 +(1 row) + +explain (costs off, verbose) +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656 order by i, j desc); + QUERY PLAN +---------------------------------------------------------------------------------------- + Hash Join + Output: issue_12656.i, issue_12656.j + Inner Unique: true + Hash Cond: ((issue_12656.i = issue_12656_1.i) AND (issue_12656.j = issue_12656_1.j)) + -> Seq Scan on subselect_gp.issue_12656 + Output: issue_12656.i, issue_12656.j + -> Hash + Output: issue_12656_1.i, issue_12656_1.j + -> Unique + Output: issue_12656_1.i, issue_12656_1.j + Group Key: issue_12656_1.i + -> Sort + Output: issue_12656_1.i, issue_12656_1.j + Sort Key: issue_12656_1.i, issue_12656_1.j DESC + -> Seq Scan on subselect_gp.issue_12656 issue_12656_1 + Output: issue_12656_1.i, issue_12656_1.j + Optimizer: Postgres query optimizer +(18 rows) + +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656 order by i, j desc); + i | j +---+------- + 1 | 10002 +(1 row) + diff --git a/src/test/singlenode_regress/expected/subselect_gp2.out b/src/test/singlenode_regress/expected/subselect_gp2.out new file mode 100644 index 00000000000..1c58325696c --- /dev/null +++ b/src/test/singlenode_regress/expected/subselect_gp2.out @@ -0,0 +1,110 @@ +-- Test using an external table in a subquery. +-- +-- We used to have a bug where the scan on the external table was not +-- broadcast to all nodes, so each segment scanned only its own portion +-- of the external table, when the scan was in a subquery. In that case, +-- the count(*) calculated for each value below was 1, but it should be +-- equal to the number of segments, because this external table produces +-- the same rows on every segment. +CREATE EXTERNAL WEB TABLE echotable (c1 int, c2 int, c3 int) EXECUTE +'echo "1,2,3"; echo "4,5,6";' FORMAT 'TEXT' (DELIMITER ','); +create table test_ext_foo (c1 int, c2 int4); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'c1' as the Cloudberry Database 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. +insert into test_ext_foo select g, g from generate_series(1, 20) g; +-- This should return 2 and 5, as the two rows are duplicated in +-- every segment (assuming you have at least two segments in your +-- cluster). +-- We need to change the count since we only have it executed on master. +select c2 from echotable group by c2 having count(*) >= 1; + c2 +---- + 2 + 5 +(2 rows) + +select * from test_ext_foo as o +where (select count(*) from echotable as i where i.c2 = o.c2) >= 1; + c1 | c2 +----+---- + 5 | 5 + 2 | 2 +(2 rows) + +-- Planner test to make sure the initplan is not removed for function scan +explain select * from generate_series(1,2) s1 join pg_class on true where s1=(select pg_backend_pid()); + QUERY PLAN +------------------------------------------------------------------------------ + Nested Loop (cost=10000000000.01..10000000027.63 rows=456 width=206) + InitPlan 1 (returns $0) + -> Result (cost=0.00..0.01 rows=1 width=0) + -> Function Scan on generate_series s1 (cost=0.00..12.50 rows=1 width=4) + Filter: (s1 = $0) + -> Seq Scan on pg_class (cost=0.00..10.56 rows=456 width=202) + Optimizer: Postgres query optimizer +(7 rows) + +-- Planner test: constant folding in subplan testexpr produces no error +create table subselect_t1 (a int, b int, c int); +create table subselect_t2 (a int, b int, c int); +insert into subselect_t1 values (1,1,1); +insert into subselect_t2 values (1,1,1); +select * from subselect_t1 where NULL in (select c from subselect_t2); + a | b | c +---+---+--- +(0 rows) + +select * from subselect_t1 where NULL in (select c from subselect_t2) and exists (select generate_series(1,2)); + a | b | c +---+---+--- +(0 rows) + +-- Planner test to make sure initplan is removed when no param is used +select * from subselect_t2 where false and exists (select generate_series(1,2)); + a | b | c +---+---+--- +(0 rows) + +-- +-- Test running Init Plans in a query that runs in a function in a QE. +-- Init Plans get special treatment in the QD, for queries that are +-- dispatched. The point of this test is to make sure the Init Plans work +-- correctly when they *don't* need the special treatment, in local queries +-- in QEs. +-- +create temp table datetab (start timestamp, stop timestamp); +HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'start' as the Cloudberry Database data distribution key for this table. +insert into datetab values ('2019-01-01', '2019-01-10'); +-- A function, that contains a query with a subquery that can be turned into +-- an Init Plan. +create or replace function number_of_days(start timestamp, stop timestamp) returns text +as $$ +declare + result text; +begin + result := 'full days: ' || (select count(g) from generate_series(start, stop, '1 day') g)::text; + + return result; +end; +$$ language plpgsql; +-- Run the function in QEs. +select number_of_days(start, stop) from datetab; + number_of_days +---------------- + full days: 10 +(1 row) + +-- Check delay eager free in squelch functions +CREATE TABLE subselect2_foo (a int, b int); +CREATE TABLE subselect2_bar (c int, d int); +CREATE TABLE subselect2_baz (x int, y int); +INSERT INTO subselect2_foo VALUES (1,1), (1,2); +INSERT INTO subselect2_bar VALUES (1,1); +SELECT *, (SELECT x FROM subselect2_baz EXCEPT SELECT c FROM subselect2_bar WHERE d = a) FROM subselect2_foo; + a | b | x +---+---+--- + 1 | 1 | + 1 | 2 | +(2 rows) + diff --git a/src/test/singlenode_regress/expected/sysviews.out b/src/test/singlenode_regress/expected/sysviews.out new file mode 100644 index 00000000000..e981a4e8e5f --- /dev/null +++ b/src/test/singlenode_regress/expected/sysviews.out @@ -0,0 +1,161 @@ +-- +-- Test assorted system views +-- +-- This test is mainly meant to provide some code coverage for the +-- set-returning functions that underlie certain system views. +-- The output of most of these functions is very environment-dependent, +-- so our ability to test with fixed expected output is pretty limited; +-- but even a trivial check of count(*) will exercise the normal code path +-- through the SRF. +select count(*) >= 0 as ok from pg_available_extension_versions; + ok +---- + t +(1 row) + +select count(*) >= 0 as ok from pg_available_extensions; + ok +---- + t +(1 row) + +-- The entire output of pg_backend_memory_contexts is not stable, +-- we test only the existance and basic condition of TopMemoryContext. +select name, ident, parent, level, total_bytes >= free_bytes + from pg_backend_memory_contexts where level = 0; + name | ident | parent | level | ?column? +------------------+-------+--------+-------+---------- + TopMemoryContext | | | 0 | t +(1 row) + +-- At introduction, pg_config had 23 entries; it may grow +select count(*) > 20 as ok from pg_config; + ok +---- + t +(1 row) + +-- We expect no cursors in this test; see also portals.sql +select count(*) = 0 as ok from pg_cursors; + ok +---- + t +(1 row) + +select count(*) >= 0 as ok from pg_file_settings; + ok +---- + t +(1 row) + +-- There will surely be at least one rule +select count(*) > 0 as ok from pg_hba_file_rules; + ok +---- + t +(1 row) + +-- There will surely be at least one active lock +select count(*) > 0 as ok from pg_locks; + ok +---- + t +(1 row) + +-- We expect no prepared statements in this test; see also prepare.sql +select count(*) = 0 as ok from pg_prepared_statements; + ok +---- + t +(1 row) + +-- See also prepared_xacts.sql +select count(*) >= 0 as ok from pg_prepared_xacts; + ok +---- + t +(1 row) + +-- There will surely be at least one SLRU cache +select count(*) > 0 as ok from pg_stat_slru; + ok +---- + t +(1 row) + +-- There must be only one record +select count(*) = 1 as ok from pg_stat_wal; + ok +---- + t +(1 row) + +-- We expect no walreceiver running in this test +select count(*) = 0 as ok from pg_stat_wal_receiver; + ok +---- + t +(1 row) + +-- This is to record the prevailing planner enable_foo settings during +-- a regression test run. +select name, setting from pg_settings where name like 'enable%' and name != 'enable_parallel'; + name | setting +--------------------------------+--------- + enable_async_append | on + enable_bitmapscan | on + enable_gathermerge | on + enable_groupagg | on + enable_hashagg | on + enable_hashjoin | on + enable_incremental_sort | on + enable_indexonlyscan | on + enable_indexscan | on + enable_material | on + enable_memoize | on + enable_mergejoin | off + enable_nestloop | off + enable_parallel_append | on + enable_parallel_hash | on + enable_partition_pruning | on + enable_partitionwise_aggregate | off + enable_partitionwise_join | off + enable_password_profile | on + enable_seqscan | on + enable_sort | on + enable_tidscan | on +(22 rows) + +-- Test that the pg_timezone_names and pg_timezone_abbrevs views are +-- more-or-less working. We can't test their contents in any great detail +-- without the outputs changing anytime IANA updates the underlying data, +-- but it seems reasonable to expect at least one entry per major meridian. +-- (At the time of writing, the actual counts are around 38 because of +-- zones using fractional GMT offsets, so this is a pretty loose test.) +select count(distinct utc_offset) >= 24 as ok from pg_timezone_names; + ok +---- + t +(1 row) + +select count(distinct utc_offset) >= 24 as ok from pg_timezone_abbrevs; + ok +---- + t +(1 row) + +-- Let's check the non-default timezone abbreviation sets, too +set timezone_abbreviations = 'Australia'; +select count(distinct utc_offset) >= 24 as ok from pg_timezone_abbrevs; + ok +---- + t +(1 row) + +set timezone_abbreviations = 'India'; +select count(distinct utc_offset) >= 24 as ok from pg_timezone_abbrevs; + ok +---- + t +(1 row) + diff --git a/src/test/singlenode_regress/expected/tablesample.out b/src/test/singlenode_regress/expected/tablesample.out new file mode 100644 index 00000000000..db3acb95d37 --- /dev/null +++ b/src/test/singlenode_regress/expected/tablesample.out @@ -0,0 +1,494 @@ +CREATE TABLE test_tablesample (dist int, id int, name text) WITH (fillfactor=10); +-- use fillfactor so we don't have to load too much data to get multiple pages +-- Changed the column length in order to match the expected results based on relation's blocksz +INSERT INTO test_tablesample SELECT 0, i, repeat(i::text, 875) FROM generate_series(0, 9) s(i) ORDER BY i; +INSERT INTO test_tablesample SELECT 3, i, repeat(i::text, 875) FROM generate_series(10, 19) s(i) ORDER BY i; +INSERT INTO test_tablesample SELECT 5, i, repeat(i::text, 875) FROM generate_series(20, 29) s(i) ORDER BY i; +-- Verify that each segment has the same amount of rows; +SELECT gp_segment_id, count(dist) FROM test_tablesample GROUP BY 1 ORDER BY 1; + gp_segment_id | count +---------------+------- + -1 | 30 +(1 row) + +SELECT t.id FROM test_tablesample AS t TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 3 + 4 + 5 + 6 + 7 + 8 + 11 + 15 + 16 + 17 + 18 + 19 + 20 + 24 + 26 + 27 + 29 +(17 rows) + +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (100.0/11) REPEATABLE (0); + id +---- + 20 + 24 +(2 rows) + +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 3 + 4 + 5 + 6 + 7 + 8 + 11 + 15 + 16 + 17 + 18 + 19 + 20 + 24 + 26 + 27 + 29 +(17 rows) + +SELECT id FROM test_tablesample TABLESAMPLE BERNOULLI (50) REPEATABLE (0); + id +---- + 4 + 5 + 6 + 7 + 8 + 10 + 13 + 14 + 15 + 16 + 18 + 25 + 26 + 27 + 28 + 29 +(16 rows) + +SELECT id FROM test_tablesample TABLESAMPLE BERNOULLI (5.5) REPEATABLE (0); + id +---- + 7 + 15 + 25 +(3 rows) + +-- 100% should give repeatable count results (ie, all rows) in any case +SELECT count(*) FROM test_tablesample TABLESAMPLE SYSTEM (100); + count +------- + 30 +(1 row) + +SELECT count(*) FROM test_tablesample TABLESAMPLE SYSTEM (100) REPEATABLE (1+2); + count +------- + 30 +(1 row) + +SELECT count(*) FROM test_tablesample TABLESAMPLE SYSTEM (100) REPEATABLE (0.4); + count +------- + 30 +(1 row) + +CREATE VIEW test_tablesample_v1 AS + SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (10*2) REPEATABLE (2); +CREATE VIEW test_tablesample_v2 AS + SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (99); +\d+ test_tablesample_v1 + View "public.test_tablesample_v1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + id | integer | | | | plain | +View definition: + SELECT test_tablesample.id + FROM test_tablesample TABLESAMPLE system ((10 * 2)) REPEATABLE (2); + +\d+ test_tablesample_v2 + View "public.test_tablesample_v2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + id | integer | | | | plain | +View definition: + SELECT test_tablesample.id + FROM test_tablesample TABLESAMPLE system (99); + +-- check a sampled query doesn't affect cursor in progress +BEGIN; +DECLARE tablesample_cur CURSOR FOR + SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; + id +---- + 3 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 4 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 5 +(1 row) + +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0); + id +---- + 3 + 4 + 5 + 6 + 7 + 8 + 11 + 15 + 16 + 17 + 18 + 19 + 20 + 24 + 26 + 27 + 29 +(17 rows) + +FETCH NEXT FROM tablesample_cur; + id +---- + 6 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 7 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 8 +(1 row) + +-- Cloudberry: Going backwards on cursors is not supported. By closing the +-- cursor and starting again we pass the tests and keep the file closer to +-- upstream. We do test the rescan methods of tablesample afterwards. +CLOSE tablesample_cur; +DECLARE tablesample_cur CURSOR FOR SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; + id +---- + 3 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 4 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 5 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 6 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 7 +(1 row) + +FETCH NEXT FROM tablesample_cur; + id +---- + 8 +(1 row) + +CLOSE tablesample_cur; +END; +EXPLAIN (COSTS OFF) + SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (2); + QUERY PLAN +-------------------------------------------------------------------- + Sample Scan on test_tablesample + Sampling: system ('50'::real) REPEATABLE ('2'::double precision) + Optimizer: Postgres query optimizer +(3 rows) + +EXPLAIN (COSTS OFF) + SELECT * FROM test_tablesample_v1; + QUERY PLAN +-------------------------------------------------------------------- + Sample Scan on test_tablesample + Sampling: system ('20'::real) REPEATABLE ('2'::double precision) + Optimizer: Postgres query optimizer +(3 rows) + +-- check inheritance behavior +explain (costs off) + select count(*) from person tablesample bernoulli (100); + QUERY PLAN +------------------------------------------------- + Aggregate + -> Append + -> Sample Scan on person person_1 + Sampling: bernoulli ('100'::real) + -> Sample Scan on emp person_2 + Sampling: bernoulli ('100'::real) + -> Sample Scan on student person_3 + Sampling: bernoulli ('100'::real) + -> Sample Scan on stud_emp person_4 + Sampling: bernoulli ('100'::real) + Optimizer: Postgres query optimizer +(11 rows) + +select count(*) from person tablesample bernoulli (100); + count +------- + 58 +(1 row) + +select count(*) from person; + count +------- + 58 +(1 row) + +-- check that collations get assigned within the tablesample arguments +SELECT count(*) FROM test_tablesample TABLESAMPLE bernoulli (('1'::text < '0'::text)::int); + count +------- + 0 +(1 row) + +-- Cloudberry: Test rescan paths by forcing a nested loop +CREATE TABLE ttr1 (a int, b int); +CREATE TABLE ttr2 (a int, b int); +INSERT INTO ttr1 VALUES (1, 1), (12, 1), (31, 1), (NULL, NULL); +INSERT INTO ttr2 VALUES (1, 2), (12, 2), (31, 2), (NULL, 6); +ANALYZE ttr1; +ANALYZE ttr2; +SET enable_hashjoin TO OFF; +SET enable_mergejoin TO OFF; +SET enable_nestloop TO ON; +EXPLAIN (COSTS OFF) SELECT * FROM ttr1 TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2 TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1.a = ttr2.a; + QUERY PLAN +----------------------------------------------------------------------------------- + Nested Loop + Join Filter: (ttr1.a = ttr2.a) + -> Sample Scan on ttr1 + Sampling: bernoulli ('50'::real) REPEATABLE ('1'::double precision) + -> Materialize + -> Sample Scan on ttr2 + Sampling: bernoulli ('50'::real) REPEATABLE ('1'::double precision) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM ttr1 TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2 TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1.a = ttr2.a; + a | b | a | b +----+---+----+--- + 12 | 1 | 12 | 2 + 31 | 1 | 31 | 2 +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM ttr1 TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2 TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1.a = ttr2.a; + QUERY PLAN +-------------------------------------------------------------------------------- + Nested Loop + Join Filter: (ttr1.a = ttr2.a) + -> Sample Scan on ttr1 + Sampling: system ('50'::real) REPEATABLE ('1'::double precision) + -> Materialize + -> Sample Scan on ttr2 + Sampling: system ('50'::real) REPEATABLE ('1'::double precision) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT * FROM ttr1 TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2 TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1.a = ttr2.a; + a | b | a | b +----+---+----+--- + 1 | 1 | 1 | 2 + 12 | 1 | 12 | 2 + 31 | 1 | 31 | 2 +(3 rows) + +RESET enable_hashjoin; +RESET enable_mergejoin; +RESET enable_nestloop; +-- check behavior during rescans, as well as correct handling of min/max pct +-- Cloudberry: does not support laterals completely, rescan specific tests above +-- start_ignore +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample bernoulli (pct)) ss; + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample system (pct)) ss; + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +explain (costs off) +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; + QUERY PLAN +-------------------------------------------------------------- + GroupAggregate + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Nested Loop + -> Values Scan on "*VALUES*" + -> Sample Scan on tenk1 + Sampling: bernoulli ("*VALUES*".column1) + Optimizer: Postgres query optimizer +(9 rows) + +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; + pct | count +-----+------- + 100 | 10000 +(1 row) + +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample system (pct)) ss + group by pct; + pct | count +-----+------- + 100 | 10000 +(1 row) + +-- end_ignore +-- Cloudberry: we do have to test min/max pct tests though +select 0 as pct, count(*) from tenk1 tablesample bernoulli (0) +union all +select 100 as pct, count(*) from tenk1 tablesample bernoulli (100); + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +select 0 as pct, count(*) from tenk1 tablesample system (0) +union all +select 100 as pct, count(*) from tenk1 tablesample system (100); + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +select 0 as pct, count(unique1) from tenk1 tablesample bernoulli (0) +union all +select 100 as pct, count(unique1) from tenk1 tablesample bernoulli (100); + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +select 0 as pct, count(unique1) from tenk1 tablesample system (0) +union all +select 100 as pct, count(unique1) from tenk1 tablesample system (100); + pct | count +-----+------- + 0 | 0 + 100 | 10000 +(2 rows) + +-- errors +SELECT id FROM test_tablesample TABLESAMPLE FOOBAR (1); +ERROR: tablesample method foobar does not exist +LINE 1: SELECT id FROM test_tablesample TABLESAMPLE FOOBAR (1); + ^ +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (NULL); +ERROR: TABLESAMPLE parameter cannot be null +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (NULL); +ERROR: TABLESAMPLE REPEATABLE parameter cannot be null +SELECT id FROM test_tablesample TABLESAMPLE BERNOULLI (-1); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_tablesample TABLESAMPLE BERNOULLI (200); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (-1); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (200); +ERROR: sample percentage must be between 0 and 100 +SELECT id FROM test_tablesample_v1 TABLESAMPLE BERNOULLI (1); +ERROR: TABLESAMPLE clause can only be applied to tables and materialized views +LINE 1: SELECT id FROM test_tablesample_v1 TABLESAMPLE BERNOULLI (1)... + ^ +INSERT INTO test_tablesample_v1 VALUES(1); +ERROR: cannot insert into view "test_tablesample_v1" +DETAIL: Views containing TABLESAMPLE are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +WITH query_select AS (SELECT * FROM test_tablesample) +SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEATABLE (1); +ERROR: TABLESAMPLE clause can only be applied to tables and materialized views +LINE 2: SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEA... + ^ +SELECT q.* FROM (SELECT * FROM test_tablesample) as q TABLESAMPLE BERNOULLI (5); +ERROR: syntax error at or near "TABLESAMPLE" +LINE 1: ...CT q.* FROM (SELECT * FROM test_tablesample) as q TABLESAMPL... + ^ +-- check partitioned tables support tablesample +create table parted_sample (a int) partition by list (a); +create table parted_sample_1 partition of parted_sample for values in (1); +create table parted_sample_2 partition of parted_sample for values in (2); +explain (costs off) + select * from parted_sample tablesample bernoulli (100); + QUERY PLAN +------------------------------------------- + Append + -> Sample Scan on parted_sample_1 + Sampling: bernoulli ('100'::real) + -> Sample Scan on parted_sample_2 + Sampling: bernoulli ('100'::real) + Optimizer: Postgres query optimizer +(6 rows) + +drop table parted_sample, parted_sample_1, parted_sample_2; diff --git a/src/test/singlenode_regress/expected/temp.out b/src/test/singlenode_regress/expected/temp.out new file mode 100644 index 00000000000..af76a4564d1 --- /dev/null +++ b/src/test/singlenode_regress/expected/temp.out @@ -0,0 +1,402 @@ +-- +-- TEMP +-- Test temp relations and indexes +-- +-- test temp table/index masking +CREATE TABLE temptest(col int); +CREATE INDEX i_temptest ON temptest(col); +CREATE TEMP TABLE temptest(tcol int); +CREATE INDEX i_temptest ON temptest(tcol); +SELECT * FROM temptest; + tcol +------ +(0 rows) + +DROP INDEX i_temptest; +DROP TABLE temptest; +SELECT * FROM temptest; + col +----- +(0 rows) + +DROP INDEX i_temptest; +DROP TABLE temptest; +-- test temp table selects +CREATE TABLE temptest(col int); +INSERT INTO temptest VALUES (1); +CREATE TEMP TABLE temptest(tcol float); +INSERT INTO temptest VALUES (2.1); +SELECT * FROM temptest; + tcol +------ + 2.1 +(1 row) + +DROP TABLE temptest; +SELECT * FROM temptest; + col +----- + 1 +(1 row) + +DROP TABLE temptest; +-- test temp table deletion +CREATE TEMP TABLE temptest(col int); +\c +SELECT * FROM temptest; +ERROR: relation "temptest" does not exist +LINE 1: SELECT * FROM temptest; + ^ +-- Test ON COMMIT DELETE ROWS +CREATE TEMP TABLE temptest(col int) ON COMMIT DELETE ROWS; +-- while we're here, verify successful truncation of index with SQL function +CREATE INDEX ON temptest(bit_length('')); +BEGIN; +INSERT INTO temptest VALUES (1); +INSERT INTO temptest VALUES (2); +SELECT * FROM temptest; + col +----- + 1 + 2 +(2 rows) + +COMMIT; +SELECT * FROM temptest; + col +----- +(0 rows) + +DROP TABLE temptest; +BEGIN; +CREATE TEMP TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1; +SELECT * FROM temptest; + col +----- + 1 +(1 row) + +COMMIT; +SELECT * FROM temptest; + col +----- +(0 rows) + +DROP TABLE temptest; +-- Test ON COMMIT DROP +BEGIN; +CREATE TEMP TABLE temptest(col int) ON COMMIT DROP; +INSERT INTO temptest VALUES (1); +INSERT INTO temptest VALUES (2); +SELECT * FROM temptest; + col +----- + 1 + 2 +(2 rows) + +COMMIT; +SELECT * FROM temptest; +ERROR: relation "temptest" does not exist +LINE 1: SELECT * FROM temptest; + ^ +BEGIN; +CREATE TEMP TABLE temptest(col) ON COMMIT DROP AS SELECT 1; +SELECT * FROM temptest; + col +----- + 1 +(1 row) + +COMMIT; +SELECT * FROM temptest; +ERROR: relation "temptest" does not exist +LINE 1: SELECT * FROM temptest; + ^ +-- ON COMMIT is only allowed for TEMP +CREATE TABLE temptest(col int) ON COMMIT DELETE ROWS; +ERROR: ON COMMIT can only be used on temporary tables +CREATE TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1; +ERROR: ON COMMIT can only be used on temporary tables +-- Test foreign keys +BEGIN; +CREATE TEMP TABLE temptest1(col int PRIMARY KEY); +CREATE TEMP TABLE temptest2(col int REFERENCES temptest1) + ON COMMIT DELETE ROWS; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO temptest1 VALUES (1); +INSERT INTO temptest2 VALUES (1); +COMMIT; +SELECT * FROM temptest1; + col +----- + 1 +(1 row) + +SELECT * FROM temptest2; + col +----- +(0 rows) + +BEGIN; +CREATE TEMP TABLE temptest3(col int PRIMARY KEY) ON COMMIT DELETE ROWS; +CREATE TEMP TABLE temptest4(col int REFERENCES temptest3); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +COMMIT; +-- Test manipulation of temp schema's placement in search path +create table public.whereami (f1 text); +insert into public.whereami values ('public'); +create temp table whereami (f1 text); +insert into whereami values ('temp'); +create function public.whoami() returns text + as $$select 'public'::text$$ language sql; +create function pg_temp.whoami() returns text + as $$select 'temp'::text$$ language sql; +-- default should have pg_temp implicitly first, but only for tables +select * from whereami; + f1 +------ + temp +(1 row) + +select whoami(); + whoami +-------- + public +(1 row) + +-- can list temp first explicitly, but it still doesn't affect functions +set search_path = pg_temp, public; +select * from whereami; + f1 +------ + temp +(1 row) + +select whoami(); + whoami +-------- + public +(1 row) + +-- or put it last for security +set search_path = public, pg_temp; +select * from whereami; + f1 +-------- + public +(1 row) + +select whoami(); + whoami +-------- + public +(1 row) + +-- you can invoke a temp function explicitly, though +select pg_temp.whoami(); + whoami +-------- + temp +(1 row) + +drop table public.whereami; +-- types in temp schema +set search_path = pg_temp, public; +create domain pg_temp.nonempty as text check (value <> ''); +-- function-syntax invocation of types matches rules for functions +select nonempty(''); +ERROR: function nonempty(unknown) does not exist +LINE 1: select nonempty(''); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +select pg_temp.nonempty(''); +ERROR: value for domain nonempty violates check constraint "nonempty_check" +-- other syntax matches rules for tables +select ''::nonempty; +ERROR: value for domain nonempty violates check constraint "nonempty_check" +reset search_path; +-- For partitioned temp tables, ON COMMIT actions ignore storage-less +-- partitioned tables. +begin; +create temp table temp_parted_oncommit (a int) + partition by list (a) on commit delete rows; +create temp table temp_parted_oncommit_1 + partition of temp_parted_oncommit + for values in (1) on commit delete rows; +insert into temp_parted_oncommit values (1); +commit; +-- partitions are emptied by the previous commit +select * from temp_parted_oncommit; + a +--- +(0 rows) + +drop table temp_parted_oncommit; +-- Check dependencies between ON COMMIT actions with a partitioned +-- table and its partitions. Using ON COMMIT DROP on a parent removes +-- the whole set. +begin; +create temp table temp_parted_oncommit_test (a int) + partition by list (a) on commit drop; +create temp table temp_parted_oncommit_test1 + partition of temp_parted_oncommit_test + for values in (1) on commit delete rows; +create temp table temp_parted_oncommit_test2 + partition of temp_parted_oncommit_test + for values in (2) on commit drop; +insert into temp_parted_oncommit_test values (1), (2); +commit; +-- no relations remain in this case. +select relname from pg_class where relname ~ '^temp_parted_oncommit_test'; + relname +--------- +(0 rows) + +-- Using ON COMMIT DELETE on a partitioned table does not remove +-- all rows if partitions preserve their data. +begin; +create temp table temp_parted_oncommit_test (a int) + partition by list (a) on commit delete rows; +create temp table temp_parted_oncommit_test1 + partition of temp_parted_oncommit_test + for values in (1) on commit preserve rows; +create temp table temp_parted_oncommit_test2 + partition of temp_parted_oncommit_test + for values in (2) on commit drop; +insert into temp_parted_oncommit_test values (1), (2); +commit; +-- Data from the remaining partition is still here as its rows are +-- preserved. +select * from temp_parted_oncommit_test; + a +--- + 1 +(1 row) + +-- two relations remain in this case. +select relname from pg_class where relname ~ '^temp_parted_oncommit_test' + order by relname; + relname +---------------------------- + temp_parted_oncommit_test + temp_parted_oncommit_test1 +(2 rows) + +drop table temp_parted_oncommit_test; +-- Check dependencies between ON COMMIT actions with inheritance trees. +-- Using ON COMMIT DROP on a parent removes the whole set. +begin; +create temp table temp_inh_oncommit_test (a int) on commit drop; +create temp table temp_inh_oncommit_test1 () + inherits(temp_inh_oncommit_test) on commit delete rows; +insert into temp_inh_oncommit_test1 values (1); +commit; +-- no relations remain in this case +select relname from pg_class where relname ~ '^temp_inh_oncommit_test'; + relname +--------- +(0 rows) + +-- Data on the parent is removed, and the child goes away. +begin; +create temp table temp_inh_oncommit_test (a int) on commit delete rows; +create temp table temp_inh_oncommit_test1 () + inherits(temp_inh_oncommit_test) on commit drop; +insert into temp_inh_oncommit_test1 values (1); +insert into temp_inh_oncommit_test values (1); +commit; +select * from temp_inh_oncommit_test; + a +--- +(0 rows) + +-- one relation remains +select relname from pg_class where relname ~ '^temp_inh_oncommit_test'; + relname +------------------------ + temp_inh_oncommit_test +(1 row) + +drop table temp_inh_oncommit_test; +-- Tests with two-phase commit +-- Transactions creating objects in a temporary namespace cannot be used +-- with two-phase commit. +-- These cases generate errors about temporary namespace. +-- Function creation +begin; +create function pg_temp.twophase_func() returns void as + $$ select '2pc_func'::text $$ language sql; +prepare transaction 'twophase_func'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +-- Function drop +create function pg_temp.twophase_func() returns void as + $$ select '2pc_func'::text $$ language sql; +begin; +drop function pg_temp.twophase_func(); +prepare transaction 'twophase_func'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +-- Operator creation +begin; +create operator pg_temp.@@ (leftarg = int4, rightarg = int4, procedure = int4mi); +prepare transaction 'twophase_operator'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +-- These generate errors about temporary tables. +begin; +create type pg_temp.twophase_type as (a int); +prepare transaction 'twophase_type'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +create view pg_temp.twophase_view as select 1; +prepare transaction 'twophase_view'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +create sequence pg_temp.twophase_seq; +prepare transaction 'twophase_sequence'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +-- Temporary tables cannot be used with two-phase commit. +create temp table twophase_tab (a int); +begin; +select a from twophase_tab; + a +--- +(0 rows) + +prepare transaction 'twophase_tab'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +insert into twophase_tab values (1); +prepare transaction 'twophase_tab'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +lock twophase_tab in access exclusive mode; +prepare transaction 'twophase_tab'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +drop table twophase_tab; +prepare transaction 'twophase_tab'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database +rollback; -- PREPARE TRANACTION is not supported in GPDB +-- Corner case: current_schema may create a temporary schema if namespace +-- creation is pending, so check after that. First reset the connection +-- to remove the temporary namespace. +\c - +SET search_path TO 'pg_temp'; +BEGIN; +SELECT current_schema() ~ 'pg_temp' AS is_temp_schema; + is_temp_schema +---------------- + t +(1 row) + +PREPARE TRANSACTION 'twophase_search'; +ERROR: PREPARE TRANSACTION is not yet supported in Cloudberry Database diff --git a/src/test/singlenode_regress/expected/text.out b/src/test/singlenode_regress/expected/text.out new file mode 100644 index 00000000000..b625b09f32d --- /dev/null +++ b/src/test/singlenode_regress/expected/text.out @@ -0,0 +1,440 @@ +-- +-- TEXT +-- +SELECT text 'this is a text string' = text 'this is a text string' AS true; + true +------ + t +(1 row) + +SELECT text 'this is a text string' = text 'this is a text strin' AS false; + false +------- + f +(1 row) + +CREATE TABLE TEXT_TBL (f1 text); +INSERT INTO TEXT_TBL VALUES ('doh!'); +INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor'); +SELECT * FROM TEXT_TBL; + f1 +------------------- + doh! + hi de ho neighbor +(2 rows) + +-- As of 8.3 we have removed most implicit casts to text, so that for example +-- this no longer works: +select length(42); +ERROR: function length(integer) does not exist +LINE 1: select length(42); + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +-- But as a special exception for usability's sake, we still allow implicit +-- casting to text in concatenations, so long as the other input is text or +-- an unknown literal. So these work: +select 'four: '::text || 2+2; + ?column? +---------- + four: 4 +(1 row) + +select 'four: ' || 2+2; + ?column? +---------- + four: 4 +(1 row) + +-- but not this: +select 3 || 4.0; +ERROR: operator does not exist: integer || numeric +LINE 1: select 3 || 4.0; + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +/* + * various string functions + */ +select concat('one'); + concat +-------- + one +(1 row) + +select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); + concat +---------------------- + 123hellotf03-09-2010 +(1 row) + +select concat_ws('#','one'); + concat_ws +----------- + one +(1 row) + +select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); + concat_ws +---------------------------- + 1#2#3#hello#t#f#03-09-2010 +(1 row) + +select concat_ws(',',10,20,null,30); + concat_ws +----------- + 10,20,30 +(1 row) + +select concat_ws('',10,20,null,30); + concat_ws +----------- + 102030 +(1 row) + +select concat_ws(NULL,10,20,null,30) is null; + ?column? +---------- + t +(1 row) + +select reverse('abcde'); + reverse +--------- + edcba +(1 row) + +select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i; + i | left | right +----+------+------- + -5 | | + -4 | | + -3 | a | j + -2 | ah | oj + -1 | aho | hoj + 0 | | + 1 | a | j + 2 | ah | oj + 3 | aho | hoj + 4 | ahoj | ahoj + 5 | ahoj | ahoj +(11 rows) + +select quote_literal(''); + quote_literal +--------------- + '' +(1 row) + +select quote_literal('abc'''); + quote_literal +--------------- + 'abc''' +(1 row) + +select quote_literal(e'\\'); + quote_literal +--------------- + E'\\' +(1 row) + +-- check variadic labeled argument +select concat(variadic array[1,2,3]); + concat +-------- + 123 +(1 row) + +select concat_ws(',', variadic array[1,2,3]); + concat_ws +----------- + 1,2,3 +(1 row) + +select concat_ws(',', variadic NULL::int[]); + concat_ws +----------- + +(1 row) + +select concat(variadic NULL::int[]) is NULL; + ?column? +---------- + t +(1 row) + +select concat(variadic '{}'::int[]) = ''; + ?column? +---------- + t +(1 row) + +--should fail +select concat_ws(',', variadic 10); +ERROR: VARIADIC argument must be an array +LINE 1: select concat_ws(',', variadic 10); + ^ +/* + * format + */ +select format(NULL); + format +-------- + +(1 row) + +select format('Hello'); + format +-------- + Hello +(1 row) + +select format('Hello %s', 'World'); + format +------------- + Hello World +(1 row) + +select format('Hello %%'); + format +--------- + Hello % +(1 row) + +select format('Hello %%%%'); + format +---------- + Hello %% +(1 row) + +-- should fail +select format('Hello %s %s', 'World'); +ERROR: too few arguments for format() +select format('Hello %s'); +ERROR: too few arguments for format() +select format('Hello %x', 20); +ERROR: unrecognized format() type specifier "x" +HINT: For a single "%" use "%%". +-- check literal and sql identifiers +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello'); + format +---------------------------------------- + INSERT INTO mytab VALUES('10','Hello') +(1 row) + +select format('%s%s%s','Hello', NULL,'World'); + format +------------ + HelloWorld +(1 row) + +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL); + format +------------------------------------- + INSERT INTO mytab VALUES('10',NULL) +(1 row) + +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello'); + format +---------------------------------------- + INSERT INTO mytab VALUES(NULL,'Hello') +(1 row) + +-- should fail, sql identifier cannot be NULL +select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello'); +ERROR: null values cannot be formatted as an SQL identifier +-- check positional placeholders +select format('%1$s %3$s', 1, 2, 3); + format +-------- + 1 3 +(1 row) + +select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + format +-------- + 1 12 +(1 row) + +-- should fail +select format('%1$s %4$s', 1, 2, 3); +ERROR: too few arguments for format() +select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); +ERROR: too few arguments for format() +select format('%0$s', 'Hello'); +ERROR: format specifies argument 0, but arguments are numbered from 1 +select format('%*0$s', 'Hello'); +ERROR: format specifies argument 0, but arguments are numbered from 1 +select format('%1$', 1); +ERROR: unterminated format() type specifier +HINT: For a single "%" use "%%". +select format('%1$1', 1); +ERROR: unterminated format() type specifier +HINT: For a single "%" use "%%". +-- check mix of positional and ordered placeholders +select format('Hello %s %1$s %s', 'World', 'Hello again'); + format +------------------------------- + Hello World World Hello again +(1 row) + +select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); + format +-------------------------------------------------- + Hello World Hello again, Hello again Hello again +(1 row) + +-- check variadic labeled arguments +select format('%s, %s', variadic array['Hello','World']); + format +-------------- + Hello, World +(1 row) + +select format('%s, %s', variadic array[1, 2]); + format +-------- + 1, 2 +(1 row) + +select format('%s, %s', variadic array[true, false]); + format +-------- + t, f +(1 row) + +select format('%s, %s', variadic array[true, false]::text[]); + format +------------- + true, false +(1 row) + +-- check variadic with positional placeholders +select format('%2$s, %1$s', variadic array['first', 'second']); + format +--------------- + second, first +(1 row) + +select format('%2$s, %1$s', variadic array[1, 2]); + format +-------- + 2, 1 +(1 row) + +-- variadic argument can be array type NULL, but should not be referenced +select format('Hello', variadic NULL::int[]); + format +-------- + Hello +(1 row) + +-- variadic argument allows simulating more than FUNC_MAX_ARGS parameters +select format(string_agg('%s',','), variadic array_agg(i)) +from generate_series(1,200) g(i); + format +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200 +(1 row) + +-- check field widths and left, right alignment +select format('>>%10s<<', 'Hello'); + format +---------------- + >> Hello<< +(1 row) + +select format('>>%10s<<', NULL); + format +---------------- + >> << +(1 row) + +select format('>>%10s<<', ''); + format +---------------- + >> << +(1 row) + +select format('>>%-10s<<', ''); + format +---------------- + >> << +(1 row) + +select format('>>%-10s<<', 'Hello'); + format +---------------- + >>Hello << +(1 row) + +select format('>>%-10s<<', NULL); + format +---------------- + >> << +(1 row) + +select format('>>%1$10s<<', 'Hello'); + format +---------------- + >> Hello<< +(1 row) + +select format('>>%1$-10I<<', 'Hello'); + format +---------------- + >>"Hello" << +(1 row) + +select format('>>%2$*1$L<<', 10, 'Hello'); + format +---------------- + >> 'Hello'<< +(1 row) + +select format('>>%2$*1$L<<', 10, NULL); + format +---------------- + >> NULL<< +(1 row) + +select format('>>%2$*1$L<<', -10, NULL); + format +---------------- + >>NULL << +(1 row) + +select format('>>%*s<<', 10, 'Hello'); + format +---------------- + >> Hello<< +(1 row) + +select format('>>%*1$s<<', 10, 'Hello'); + format +---------------- + >> Hello<< +(1 row) + +select format('>>%-s<<', 'Hello'); + format +----------- + >>Hello<< +(1 row) + +select format('>>%10L<<', NULL); + format +---------------- + >> NULL<< +(1 row) + +select format('>>%2$*1$L<<', NULL, 'Hello'); + format +------------- + >>'Hello'<< +(1 row) + +select format('>>%2$*1$L<<', 0, 'Hello'); + format +------------- + >>'Hello'<< +(1 row) + diff --git a/src/test/singlenode_regress/expected/tid.out b/src/test/singlenode_regress/expected/tid.out new file mode 100644 index 00000000000..698cf022691 --- /dev/null +++ b/src/test/singlenode_regress/expected/tid.out @@ -0,0 +1,65 @@ +-- tests for functions related to TID handling +CREATE TABLE tid_tab (a int); +-- min() and max() for TIDs +INSERT INTO tid_tab VALUES (1), (2); +SELECT min(ctid) FROM tid_tab; + min +------- + (0,1) +(1 row) + +SELECT max(ctid) FROM tid_tab; + max +------- + (0,2) +(1 row) + +TRUNCATE tid_tab; +-- currtid2 is not supported in GPDB +-- Tests for currtid2() with various relation kinds +-- Materialized view +CREATE MATERIALIZED VIEW tid_matview AS SELECT a FROM tid_tab; +SELECT currtid2('tid_matview'::text, '(0,1)'::tid); -- fails +ERROR: function currtid2 is not supported by GPDB +INSERT INTO tid_tab VALUES (1); +REFRESH MATERIALIZED VIEW tid_matview; +SELECT currtid2('tid_matview'::text, '(0,1)'::tid); -- ok +ERROR: function currtid2 is not supported by GPDB +DROP MATERIALIZED VIEW tid_matview; +TRUNCATE tid_tab; +-- Sequence +CREATE SEQUENCE tid_seq; +SELECT currtid2('tid_seq'::text, '(0,1)'::tid); -- ok +ERROR: function currtid2 is not supported by GPDB +DROP SEQUENCE tid_seq; +-- Index, fails with incorrect relation type +CREATE INDEX tid_ind ON tid_tab(a); +SELECT currtid2('tid_ind'::text, '(0,1)'::tid); -- fails +ERROR: function currtid2 is not supported by GPDB +DROP INDEX tid_ind; +-- Partitioned table, no storage +CREATE TABLE tid_part (a int) PARTITION BY RANGE (a); +SELECT currtid2('tid_part'::text, '(0,1)'::tid); -- fails +ERROR: function currtid2 is not supported by GPDB +DROP TABLE tid_part; +-- Views +-- ctid not defined in the view +CREATE VIEW tid_view_no_ctid AS SELECT a FROM tid_tab; +SELECT currtid2('tid_view_no_ctid'::text, '(0,1)'::tid); -- fails +ERROR: function currtid2 is not supported by GPDB +DROP VIEW tid_view_no_ctid; +-- ctid fetched directly from the source table. +CREATE VIEW tid_view_with_ctid AS SELECT ctid, a FROM tid_tab; +SELECT currtid2('tid_view_with_ctid'::text, '(0,1)'::tid); -- fails +ERROR: function currtid2 is not supported by GPDB +INSERT INTO tid_tab VALUES (1); +SELECT currtid2('tid_view_with_ctid'::text, '(0,1)'::tid); -- ok +ERROR: function currtid2 is not supported by GPDB +DROP VIEW tid_view_with_ctid; +TRUNCATE tid_tab; +-- ctid attribute with incorrect data type +CREATE VIEW tid_view_fake_ctid AS SELECT 1 AS ctid, 2 AS a; +SELECT currtid2('tid_view_fake_ctid'::text, '(0,1)'::tid); -- fails +ERROR: function currtid2 is not supported by GPDB +DROP VIEW tid_view_fake_ctid; +DROP TABLE tid_tab CASCADE; diff --git a/src/test/singlenode_regress/expected/tidrangescan.out b/src/test/singlenode_regress/expected/tidrangescan.out new file mode 100644 index 00000000000..6db411f869d --- /dev/null +++ b/src/test/singlenode_regress/expected/tidrangescan.out @@ -0,0 +1,315 @@ +-- tests for tidrangescans +SET enable_seqscan TO off; +CREATE TABLE tidrangescan(id integer, data text); +-- empty table +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid < '(1, 0)'; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid < '(1,0)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid < '(1, 0)'; + ctid +------ +(0 rows) + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid > '(9, 0)'; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid > '(9,0)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid > '(9, 0)'; + ctid +------ +(0 rows) + +-- insert enough tuples to fill at least two pages +INSERT INTO tidrangescan SELECT i,repeat('x', 100) FROM generate_series(1,2400) AS s(i); +-- remove all tuples after the 10th tuple on each page. Trying to ensure +-- we get the same layout with all CPU architectures and smaller than standard +-- page sizes. +DELETE FROM tidrangescan +WHERE substring(ctid::text FROM ',(\d+)\)')::integer > 10 OR substring(ctid::text FROM '\((\d+),')::integer > 2; +VACUUM tidrangescan; +-- range scans with upper bound +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid < '(1,0)'; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid < '(1,0)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid < '(1,0)'; + ctid +-------- + (0,1) + (0,2) + (0,3) + (0,4) + (0,5) + (0,6) + (0,7) + (0,8) + (0,9) + (0,10) +(10 rows) + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid <= '(1,5)'; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid <= '(1,5)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid <= '(1,5)'; + ctid +-------- + (0,1) + (0,2) + (0,3) + (0,4) + (0,5) + (0,6) + (0,7) + (0,8) + (0,9) + (0,10) + (1,1) + (1,2) + (1,3) + (1,4) + (1,5) +(15 rows) + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid < '(0,0)'; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid < '(0,0)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid < '(0,0)'; + ctid +------ +(0 rows) + +-- range scans with lower bound +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid > '(2,8)'; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid > '(2,8)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid > '(2,8)'; + ctid +-------- + (2,9) + (2,10) +(2 rows) + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE '(2,8)' < ctid; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: ('(2,8)'::tid < ctid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE '(2,8)' < ctid; + ctid +-------- + (2,9) + (2,10) +(2 rows) + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid >= '(2,8)'; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid >= '(2,8)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid >= '(2,8)'; + ctid +-------- + (2,8) + (2,9) + (2,10) +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid >= '(100,0)'; + QUERY PLAN +-------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid >= '(100,0)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid >= '(100,0)'; + ctid +------ +(0 rows) + +-- range scans with both bounds +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid > '(1,4)' AND '(1,7)' >= ctid; + QUERY PLAN +---------------------------------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: ((ctid > '(1,4)'::tid) AND ('(1,7)'::tid >= ctid)) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE ctid > '(1,4)' AND '(1,7)' >= ctid; + ctid +------- + (1,5) + (1,6) + (1,7) +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE '(1,7)' >= ctid AND ctid > '(1,4)'; + QUERY PLAN +---------------------------------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (('(1,7)'::tid >= ctid) AND (ctid > '(1,4)'::tid)) + Optimizer: Postgres query optimizer +(3 rows) + +SELECT ctid FROM tidrangescan WHERE '(1,7)' >= ctid AND ctid > '(1,4)'; + ctid +------- + (1,5) + (1,6) + (1,7) +(3 rows) + +-- extreme offsets +SELECT ctid FROM tidrangescan WHERE ctid > '(0,65535)' AND ctid < '(1,0)' LIMIT 1; + ctid +------ +(0 rows) + +SELECT ctid FROM tidrangescan WHERE ctid < '(0,0)' LIMIT 1; + ctid +------ +(0 rows) + +SELECT ctid FROM tidrangescan WHERE ctid > '(4294967295,65535)'; + ctid +------ +(0 rows) + +SELECT ctid FROM tidrangescan WHERE ctid < '(0,0)'; + ctid +------ +(0 rows) + +-- NULLs in the range cannot return tuples +SELECT ctid FROM tidrangescan WHERE ctid >= (SELECT NULL::tid); + ctid +------ +(0 rows) + +-- rescans +EXPLAIN (COSTS OFF) +SELECT t.ctid,t2.c FROM tidrangescan t, +LATERAL (SELECT count(*) c FROM tidrangescan t2 WHERE t2.ctid <= t.ctid) t2 +WHERE t.ctid < '(1,0)'; + QUERY PLAN +----------------------------------------------------- + Nested Loop + -> Tid Range Scan on tidrangescan t + TID Cond: (ctid < '(1,0)'::tid) + -> Materialize + -> Aggregate + -> Tid Range Scan on tidrangescan t2 + TID Cond: (ctid <= t.ctid) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT t.ctid,t2.c FROM tidrangescan t, +LATERAL (SELECT count(*) c FROM tidrangescan t2 WHERE t2.ctid <= t.ctid) t2 +WHERE t.ctid < '(1,0)'; + ctid | c +--------+---- + (0,1) | 1 + (0,2) | 2 + (0,3) | 3 + (0,4) | 4 + (0,5) | 5 + (0,6) | 6 + (0,7) | 7 + (0,8) | 8 + (0,9) | 9 + (0,10) | 10 +(10 rows) + +-- cursors +-- Ensure we get a TID Range scan without a Materialize node. +EXPLAIN (COSTS OFF) +DECLARE c SCROLL CURSOR FOR SELECT ctid FROM tidrangescan WHERE ctid < '(1,0)'; + QUERY PLAN +------------------------------------- + Tid Range Scan on tidrangescan + TID Cond: (ctid < '(1,0)'::tid) + Optimizer: Postgres query optimizer +(3 rows) + +BEGIN; +DECLARE c SCROLL CURSOR FOR SELECT ctid FROM tidrangescan WHERE ctid < '(1,0)'; +FETCH NEXT c; + ctid +------- + (0,1) +(1 row) + +FETCH NEXT c; + ctid +------- + (0,2) +(1 row) + +--start_ignore +FETCH PRIOR c; + ctid +------- + (0,1) +(1 row) + +FETCH FIRST c; + ctid +------- + (0,1) +(1 row) + +FETCH LAST c; + ctid +-------- + (0,10) +(1 row) +--end_ignore +COMMIT; +DROP TABLE tidrangescan; +RESET enable_seqscan; diff --git a/src/test/singlenode_regress/expected/tidscan.out b/src/test/singlenode_regress/expected/tidscan.out new file mode 100644 index 00000000000..938003f5aea --- /dev/null +++ b/src/test/singlenode_regress/expected/tidscan.out @@ -0,0 +1,279 @@ +-- tests for tidscans +CREATE TABLE tidscan(id integer); +-- only insert a few rows, we don't want to spill onto a second table page +INSERT INTO tidscan VALUES (1), (2), (3); +-- show ctids +SELECT ctid, * FROM tidscan; + ctid | id +-------+---- + (0,1) | 1 + (0,2) | 2 + (0,3) | 3 +(3 rows) + +-- ctid equality - implemented as tidscan +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE ctid = '(0,1)'; + QUERY PLAN +----------------------------------- + Tid Scan on tidscan + TID Cond: (ctid = '(0,1)'::tid) +(2 rows) + +SELECT ctid, * FROM tidscan WHERE ctid = '(0,1)'; + ctid | id +-------+---- + (0,1) | 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE '(0,1)' = ctid; + QUERY PLAN +----------------------------------- + Tid Scan on tidscan + TID Cond: ('(0,1)'::tid = ctid) +(2 rows) + +SELECT ctid, * FROM tidscan WHERE '(0,1)' = ctid; + ctid | id +-------+---- + (0,1) | 1 +(1 row) + +-- OR'd clauses +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE ctid = '(0,2)' OR '(0,1)' = ctid; + QUERY PLAN +-------------------------------------------------------------- + Tid Scan on tidscan + TID Cond: ((ctid = '(0,2)'::tid) OR ('(0,1)'::tid = ctid)) +(2 rows) + +SELECT ctid, * FROM tidscan WHERE ctid = '(0,2)' OR '(0,1)' = ctid; + ctid | id +-------+---- + (0,1) | 1 + (0,2) | 2 +(2 rows) + +-- ctid = ScalarArrayOp - implemented as tidscan +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE ctid = ANY(ARRAY['(0,1)', '(0,2)']::tid[]); + QUERY PLAN +------------------------------------------------------- + Tid Scan on tidscan + TID Cond: (ctid = ANY ('{"(0,1)","(0,2)"}'::tid[])) +(2 rows) + +SELECT ctid, * FROM tidscan WHERE ctid = ANY(ARRAY['(0,1)', '(0,2)']::tid[]); + ctid | id +-------+---- + (0,1) | 1 + (0,2) | 2 +(2 rows) + +-- ctid != ScalarArrayOp - can't be implemented as tidscan +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE ctid != ANY(ARRAY['(0,1)', '(0,2)']::tid[]); + QUERY PLAN +------------------------------------------------------ + Seq Scan on tidscan + Filter: (ctid <> ANY ('{"(0,1)","(0,2)"}'::tid[])) +(2 rows) + +SELECT ctid, * FROM tidscan WHERE ctid != ANY(ARRAY['(0,1)', '(0,2)']::tid[]); + ctid | id +-------+---- + (0,1) | 1 + (0,2) | 2 + (0,3) | 3 +(3 rows) + +-- tid equality extracted from sub-AND clauses +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan +WHERE (id = 3 AND ctid IN ('(0,2)', '(0,3)')) OR (ctid = '(0,1)' AND id = 1); + QUERY PLAN +-------------------------------------------------------------------------------------------------------------- + Tid Scan on tidscan + TID Cond: ((ctid = ANY ('{"(0,2)","(0,3)"}'::tid[])) OR (ctid = '(0,1)'::tid)) + Filter: (((id = 3) AND (ctid = ANY ('{"(0,2)","(0,3)"}'::tid[]))) OR ((ctid = '(0,1)'::tid) AND (id = 1))) +(3 rows) + +SELECT ctid, * FROM tidscan +WHERE (id = 3 AND ctid IN ('(0,2)', '(0,3)')) OR (ctid = '(0,1)' AND id = 1); + ctid | id +-------+---- + (0,1) | 1 + (0,3) | 3 +(2 rows) + +-- nestloop-with-inner-tidscan joins on tid +SET enable_hashjoin TO off; -- otherwise hash join might win +EXPLAIN (COSTS OFF) +SELECT t1.ctid, t1.*, t2.ctid, t2.* +FROM tidscan t1 JOIN tidscan t2 ON t1.ctid = t2.ctid WHERE t1.id = 1; + QUERY PLAN +------------------------------------ + Nested Loop + -> Seq Scan on tidscan t1 + Filter: (id = 1) + -> Tid Scan on tidscan t2 + TID Cond: (ctid = t1.ctid) +(5 rows) + +SELECT t1.ctid, t1.*, t2.ctid, t2.* +FROM tidscan t1 JOIN tidscan t2 ON t1.ctid = t2.ctid WHERE t1.id = 1; + ctid | id | ctid | id +-------+----+-------+---- + (0,1) | 1 | (0,1) | 1 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT t1.ctid, t1.*, t2.ctid, t2.* +FROM tidscan t1 LEFT JOIN tidscan t2 ON t1.ctid = t2.ctid WHERE t1.id = 1; + QUERY PLAN +------------------------------------ + Nested Loop Left Join + -> Seq Scan on tidscan t1 + Filter: (id = 1) + -> Tid Scan on tidscan t2 + TID Cond: (t1.ctid = ctid) +(5 rows) + +SELECT t1.ctid, t1.*, t2.ctid, t2.* +FROM tidscan t1 LEFT JOIN tidscan t2 ON t1.ctid = t2.ctid WHERE t1.id = 1; + ctid | id | ctid | id +-------+----+-------+---- + (0,1) | 1 | (0,1) | 1 +(1 row) + +RESET enable_hashjoin; +-- exercise backward scan and rewind +BEGIN; +DECLARE c CURSOR FOR +SELECT ctid, * FROM tidscan WHERE ctid = ANY(ARRAY['(0,1)', '(0,2)']::tid[]); +FETCH ALL FROM c; + ctid | id +-------+---- + (0,1) | 1 + (0,2) | 2 +(2 rows) + +FETCH BACKWARD 1 FROM c; +ERROR: backward scan is not supported in this version of Cloudberry Database +FETCH FIRST FROM c; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- tidscan via CURRENT OF +BEGIN; +DECLARE c CURSOR FOR SELECT ctid, * FROM tidscan; +FETCH NEXT FROM c; -- skip one row + ctid | id +-------+---- + (0,1) | 1 +(1 row) + +FETCH NEXT FROM c; + ctid | id +-------+---- + (0,2) | 2 +(1 row) + +-- perform update +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) +UPDATE tidscan SET id = -id WHERE CURRENT OF c RETURNING *; + QUERY PLAN +--------------------------------------------------- + Update on tidscan (actual rows=1 loops=1) + -> Tid Scan on tidscan (actual rows=1 loops=1) + TID Cond: CURRENT OF c +(3 rows) + +FETCH NEXT FROM c; + ctid | id +-------+---- + (0,3) | 3 +(1 row) + +-- perform update +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) +UPDATE tidscan SET id = -id WHERE CURRENT OF c RETURNING *; + QUERY PLAN +--------------------------------------------------- + Update on tidscan (actual rows=1 loops=1) + -> Tid Scan on tidscan (actual rows=1 loops=1) + TID Cond: CURRENT OF c +(3 rows) + +SELECT * FROM tidscan; + id +---- + 1 + -2 + -3 +(3 rows) + +-- position cursor past any rows +FETCH NEXT FROM c; + ctid | id +------+---- +(0 rows) + +-- should error out +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) +UPDATE tidscan SET id = -id WHERE CURRENT OF c RETURNING *; +ERROR: cursor "c" is not positioned on a row +ROLLBACK; +-- bulk joins on CTID +-- (these plans don't use TID scans, but this still seems like an +-- appropriate place for these tests) +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 t1 JOIN tenk1 t2 ON t1.ctid = t2.ctid; + QUERY PLAN +---------------------------------------- + Aggregate + -> Hash Join + Hash Cond: (t1.ctid = t2.ctid) + -> Seq Scan on tenk1 t1 + -> Hash + -> Seq Scan on tenk1 t2 +(6 rows) + +SELECT count(*) FROM tenk1 t1 JOIN tenk1 t2 ON t1.ctid = t2.ctid; + count +------- + 10000 +(1 row) + +SET enable_hashjoin TO off; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 t1 JOIN tenk1 t2 ON t1.ctid = t2.ctid; + QUERY PLAN +----------------------------------------- + Aggregate + -> Merge Join + Merge Cond: (t1.ctid = t2.ctid) + -> Sort + Sort Key: t1.ctid + -> Seq Scan on tenk1 t1 + -> Sort + Sort Key: t2.ctid + -> Seq Scan on tenk1 t2 +(9 rows) + +SELECT count(*) FROM tenk1 t1 JOIN tenk1 t2 ON t1.ctid = t2.ctid; + count +------- + 10000 +(1 row) + +RESET enable_hashjoin; +-- GPDB_13_MERGE_FIXME +-- --check predicate lock on CTID +-- BEGIN ISOLATION LEVEL SERIALIZABLE; +-- SELECT * FROM tidscan WHERE ctid = '(0,1)'; +-- -- locktype should be 'tuple' +-- SELECT locktype, mode FROM pg_locks WHERE pid = pg_backend_pid() AND mode = 'SIReadLock'; +-- ROLLBACK; +DROP TABLE tidscan; diff --git a/src/test/singlenode_regress/expected/tidscan_gp.out b/src/test/singlenode_regress/expected/tidscan_gp.out new file mode 100644 index 00000000000..966e0745f07 --- /dev/null +++ b/src/test/singlenode_regress/expected/tidscan_gp.out @@ -0,0 +1,38 @@ +drop table if exists test; +NOTICE: table "test" does not exist, skipping +create table test (a integer); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +insert into test select a from generate_series(1,100) a; +\echo -- start_ignore +-- start_ignore +select * from test where ctid='(0,10)' and gp_segment_id=1; + a +---- + 22 +(1 row) + +\echo -- end_ignore +-- end_ignore +drop table if exists test; +create table test (a integer); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +insert into test select a from generate_series(1,100) a; +\echo -- start_ignore +-- start_ignore +select * from test where ctid in ('(0,10)', '(0,20)'); +NOTICE: SELECT uses system-defined column "test.ctid" without the necessary companion column "test.gp_segment_id" +HINT: To uniquely identify a row within a distributed table, use the "gp_segment_id" column together with the "ctid" column. + a +---- + 30 + 51 + 22 + 57 + 27 + 61 +(6 rows) + +\echo -- end_ignore +-- end_ignore diff --git a/src/test/singlenode_regress/expected/time.out b/src/test/singlenode_regress/expected/time.out new file mode 100644 index 00000000000..39b409feca9 --- /dev/null +++ b/src/test/singlenode_regress/expected/time.out @@ -0,0 +1,200 @@ +-- +-- TIME +-- +CREATE TABLE TIME_TBL (f1 time(2)); +INSERT INTO TIME_TBL VALUES ('00:00'); +INSERT INTO TIME_TBL VALUES ('01:00'); +-- as of 7.4, timezone spec should be accepted and ignored +INSERT INTO TIME_TBL VALUES ('02:03 PST'); +INSERT INTO TIME_TBL VALUES ('11:59 EDT'); +INSERT INTO TIME_TBL VALUES ('12:00'); +INSERT INTO TIME_TBL VALUES ('12:01'); +INSERT INTO TIME_TBL VALUES ('23:59'); +INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM'); +INSERT INTO TIME_TBL VALUES ('2003-03-07 15:36:39 America/New_York'); +INSERT INTO TIME_TBL VALUES ('2003-07-07 15:36:39 America/New_York'); +-- this should fail (the timezone offset is not known) +INSERT INTO TIME_TBL VALUES ('15:36:39 America/New_York'); +ERROR: invalid input syntax for type time: "15:36:39 America/New_York" +LINE 1: INSERT INTO TIME_TBL VALUES ('15:36:39 America/New_York'); + ^ +SELECT f1 AS "Time" FROM TIME_TBL; + Time +------------- + 00:00:00 + 01:00:00 + 02:03:00 + 11:59:00 + 12:00:00 + 12:01:00 + 23:59:00 + 23:59:59.99 + 15:36:39 + 15:36:39 +(10 rows) + +SELECT f1 AS "Three" FROM TIME_TBL WHERE f1 < '05:06:07'; + Three +---------- + 00:00:00 + 01:00:00 + 02:03:00 +(3 rows) + +SELECT f1 AS "Five" FROM TIME_TBL WHERE f1 > '05:06:07'; + Five +------------- + 11:59:00 + 12:00:00 + 12:01:00 + 23:59:00 + 23:59:59.99 + 15:36:39 + 15:36:39 +(7 rows) + +SELECT f1 AS "None" FROM TIME_TBL WHERE f1 < '00:00'; + None +------ +(0 rows) + +SELECT f1 AS "Eight" FROM TIME_TBL WHERE f1 >= '00:00'; + Eight +------------- + 00:00:00 + 01:00:00 + 02:03:00 + 11:59:00 + 12:00:00 + 12:01:00 + 23:59:00 + 23:59:59.99 + 15:36:39 + 15:36:39 +(10 rows) + +-- Check edge cases +SELECT '23:59:59.999999'::time; + time +----------------- + 23:59:59.999999 +(1 row) + +SELECT '23:59:59.9999999'::time; -- rounds up + time +---------- + 24:00:00 +(1 row) + +SELECT '23:59:60'::time; -- rounds up + time +---------- + 24:00:00 +(1 row) + +SELECT '24:00:00'::time; -- allowed + time +---------- + 24:00:00 +(1 row) + +SELECT '24:00:00.01'::time; -- not allowed +ERROR: date/time field value out of range: "24:00:00.01" +LINE 1: SELECT '24:00:00.01'::time; + ^ +SELECT '23:59:60.01'::time; -- not allowed +ERROR: date/time field value out of range: "23:59:60.01" +LINE 1: SELECT '23:59:60.01'::time; + ^ +SELECT '24:01:00'::time; -- not allowed +ERROR: date/time field value out of range: "24:01:00" +LINE 1: SELECT '24:01:00'::time; + ^ +SELECT '25:00:00'::time; -- not allowed +ERROR: date/time field value out of range: "25:00:00" +LINE 1: SELECT '25:00:00'::time; + ^ +-- +-- TIME simple math +-- +-- We now make a distinction between time and intervals, +-- and adding two times together makes no sense at all. +-- Leave in one query to show that it is rejected, +-- and do the rest of the testing in horology.sql +-- where we do mixed-type arithmetic. - thomas 2000-12-02 +SELECT f1 + time '00:01' AS "Illegal" FROM TIME_TBL; +ERROR: operator is not unique: time without time zone + time without time zone +LINE 1: SELECT f1 + time '00:01' AS "Illegal" FROM TIME_TBL; + ^ +HINT: Could not choose a best candidate operator. You might need to add explicit type casts. +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME '2020-05-26 13:30:25.575401'); + extract +---------- + 25575401 +(1 row) + +SELECT EXTRACT(MILLISECOND FROM TIME '2020-05-26 13:30:25.575401'); + extract +----------- + 25575.401 +(1 row) + +SELECT EXTRACT(SECOND FROM TIME '2020-05-26 13:30:25.575401'); + extract +----------- + 25.575401 +(1 row) + +SELECT EXTRACT(MINUTE FROM TIME '2020-05-26 13:30:25.575401'); + extract +--------- + 30 +(1 row) + +SELECT EXTRACT(HOUR FROM TIME '2020-05-26 13:30:25.575401'); + extract +--------- + 13 +(1 row) + +SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error +ERROR: "time" units "day" not recognized +SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error +ERROR: "time" units "fortnight" not recognized +SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error +ERROR: "time" units "timezone" not recognized +SELECT EXTRACT(EPOCH FROM TIME '2020-05-26 13:30:25.575401'); + extract +-------------- + 48625.575401 +(1 row) + +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME '2020-05-26 13:30:25.575401'); + date_part +----------- + 25575401 +(1 row) + +SELECT date_part('millisecond', TIME '2020-05-26 13:30:25.575401'); + date_part +----------- + 25575.401 +(1 row) + +SELECT date_part('second', TIME '2020-05-26 13:30:25.575401'); + date_part +----------- + 25.575401 +(1 row) + +SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401'); + date_part +-------------- + 48625.575401 +(1 row) + diff --git a/src/test/singlenode_regress/expected/timestamp.out b/src/test/singlenode_regress/expected/timestamp.out new file mode 100644 index 00000000000..79f81809558 --- /dev/null +++ b/src/test/singlenode_regress/expected/timestamp.out @@ -0,0 +1,2081 @@ +-- +-- TIMESTAMP +-- +CREATE TABLE TIMESTAMP_TBL (d1 timestamp(2) without time zone); +-- Test shorthand input values +-- We can't just "select" the results since they aren't constants; test for +-- equality instead. We can do that by running the test inside a transaction +-- block, within which the value of 'now' shouldn't change, and so these +-- related values shouldn't either. +BEGIN; +INSERT INTO TIMESTAMP_TBL VALUES ('today'); +INSERT INTO TIMESTAMP_TBL VALUES ('yesterday'); +INSERT INTO TIMESTAMP_TBL VALUES ('tomorrow'); +-- time zone should be ignored by this data type +INSERT INTO TIMESTAMP_TBL VALUES ('tomorrow EST'); +INSERT INTO TIMESTAMP_TBL VALUES ('tomorrow zulu'); +SELECT count(*) AS One FROM TIMESTAMP_TBL WHERE d1 = timestamp without time zone 'today'; + one +----- + 1 +(1 row) + +SELECT count(*) AS Three FROM TIMESTAMP_TBL WHERE d1 = timestamp without time zone 'tomorrow'; + three +------- + 3 +(1 row) + +SELECT count(*) AS One FROM TIMESTAMP_TBL WHERE d1 = timestamp without time zone 'yesterday'; + one +----- + 1 +(1 row) + +COMMIT; +DELETE FROM TIMESTAMP_TBL; +-- Verify that 'now' *does* change over a reasonable interval such as 100 msec, +-- and that it doesn't change over the same interval within a transaction block +INSERT INTO TIMESTAMP_TBL VALUES ('now'); +SELECT pg_sleep(0.1); + pg_sleep +---------- + +(1 row) + +BEGIN; +INSERT INTO TIMESTAMP_TBL VALUES ('now'); +SELECT pg_sleep(0.1); + pg_sleep +---------- + +(1 row) + +INSERT INTO TIMESTAMP_TBL VALUES ('now'); +SELECT pg_sleep(0.1); + pg_sleep +---------- + +(1 row) + +SELECT count(*) AS two FROM TIMESTAMP_TBL WHERE d1 = timestamp(2) without time zone 'now'; + two +----- + 2 +(1 row) + +SELECT count(d1) AS three, count(DISTINCT d1) AS two FROM TIMESTAMP_TBL; + three | two +-------+----- + 3 | 2 +(1 row) + +COMMIT; +TRUNCATE TIMESTAMP_TBL; +-- Special values +INSERT INTO TIMESTAMP_TBL VALUES ('-infinity'); +INSERT INTO TIMESTAMP_TBL VALUES ('infinity'); +INSERT INTO TIMESTAMP_TBL VALUES ('epoch'); +-- Postgres v6.0 standard output format +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST'); +-- Variations on Postgres v6.1 standard output format +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.000001 1997 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.999999 1997 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.4 1997 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.5 1997 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.6 1997 PST'); +-- ISO 8601 format +INSERT INTO TIMESTAMP_TBL VALUES ('1997-01-02'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-01-02 03:04:05'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-02-10 17:32:01-08'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-02-10 17:32:01-0800'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-02-10 17:32:01 -08:00'); +INSERT INTO TIMESTAMP_TBL VALUES ('19970210 173201 -0800'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-06-10 17:32:01 -07:00'); +INSERT INTO TIMESTAMP_TBL VALUES ('2001-09-22T18:19:20'); +-- POSIX format (note that the timezone abbrev is just decoration here) +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 08:14:01 GMT+8'); +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 13:14:02 GMT-1'); +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 12:14:03 GMT-2'); +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 03:14:04 PST+8'); +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 02:14:05 MST+7:00'); +-- Variations for acceptable input formats +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 17:32:01 1997 -0800'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 5:32PM 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997/02/10 17:32:01-0800'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-02-10 17:32:01 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb-10-1997 17:32:01 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('02-10-1997 17:32:01 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('19970210 173201 PST'); +set datestyle to ymd; +INSERT INTO TIMESTAMP_TBL VALUES ('97FEB10 5:32:01PM UTC'); +INSERT INTO TIMESTAMP_TBL VALUES ('97/02/10 17:32:01 UTC'); +reset datestyle; +INSERT INTO TIMESTAMP_TBL VALUES ('1997.041 17:32:01 UTC'); +INSERT INTO TIMESTAMP_TBL VALUES ('19970210 173201 America/New_York'); +-- this fails (even though TZ is a no-op, we still look it up) +INSERT INTO TIMESTAMP_TBL VALUES ('19970710 173201 America/Does_not_exist'); +ERROR: time zone "america/does_not_exist" not recognized +LINE 1: INSERT INTO TIMESTAMP_TBL VALUES ('19970710 173201 America/D... + ^ +-- Check date conversion and date arithmetic +INSERT INTO TIMESTAMP_TBL VALUES ('1997-06-10 18:32:01 PDT'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 11 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 12 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 13 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 14 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 15 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 0097 BC'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 0097'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 0597'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1097'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1697'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1797'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1897'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 2097'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 28 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 29 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mar 01 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 30 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 28 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 29 17:32:01 1997'); +ERROR: date/time field value out of range: "Feb 29 17:32:01 1997" +LINE 1: INSERT INTO TIMESTAMP_TBL VALUES ('Feb 29 17:32:01 1997'); + ^ +INSERT INTO TIMESTAMP_TBL VALUES ('Mar 01 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 30 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 1999'); +INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2000'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 2000'); +INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2001'); +-- Currently unsupported syntax and ranges +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 -0097'); +ERROR: time zone displacement out of range: "Feb 16 17:32:01 -0097" +LINE 1: INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 -0097'); + ^ +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 5097 BC'); +ERROR: timestamp out of range: "Feb 16 17:32:01 5097 BC" +LINE 1: INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 5097 BC')... + ^ +SELECT d1 FROM TIMESTAMP_TBL; + d1 +----------------------------- + -infinity + infinity + Thu Jan 01 00:00:00 1970 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:02 1997 + Mon Feb 10 17:32:01.4 1997 + Mon Feb 10 17:32:01.5 1997 + Mon Feb 10 17:32:01.6 1997 + Thu Jan 02 00:00:00 1997 + Thu Jan 02 03:04:05 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 17:32:01 1997 + Sat Sep 22 18:19:20 2001 + Wed Mar 15 08:14:01 2000 + Wed Mar 15 13:14:02 2000 + Wed Mar 15 12:14:03 2000 + Wed Mar 15 03:14:04 2000 + Wed Mar 15 02:14:05 2000 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:00 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 18:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Feb 11 17:32:01 1997 + Wed Feb 12 17:32:01 1997 + Thu Feb 13 17:32:01 1997 + Fri Feb 14 17:32:01 1997 + Sat Feb 15 17:32:01 1997 + Sun Feb 16 17:32:01 1997 + Tue Feb 16 17:32:01 0097 BC + Sat Feb 16 17:32:01 0097 + Thu Feb 16 17:32:01 0597 + Tue Feb 16 17:32:01 1097 + Sat Feb 16 17:32:01 1697 + Thu Feb 16 17:32:01 1797 + Tue Feb 16 17:32:01 1897 + Sun Feb 16 17:32:01 1997 + Sat Feb 16 17:32:01 2097 + Wed Feb 28 17:32:01 1996 + Thu Feb 29 17:32:01 1996 + Fri Mar 01 17:32:01 1996 + Mon Dec 30 17:32:01 1996 + Tue Dec 31 17:32:01 1996 + Wed Jan 01 17:32:01 1997 + Fri Feb 28 17:32:01 1997 + Sat Mar 01 17:32:01 1997 + Tue Dec 30 17:32:01 1997 + Wed Dec 31 17:32:01 1997 + Fri Dec 31 17:32:01 1999 + Sat Jan 01 17:32:01 2000 + Sun Dec 31 17:32:01 2000 + Mon Jan 01 17:32:01 2001 +(65 rows) + +-- Check behavior at the boundaries of the timestamp range +SELECT '4714-11-24 00:00:00 BC'::timestamp; + timestamp +----------------------------- + Mon Nov 24 00:00:00 4714 BC +(1 row) + +SELECT '4714-11-23 23:59:59 BC'::timestamp; -- out of range +ERROR: timestamp out of range: "4714-11-23 23:59:59 BC" +LINE 1: SELECT '4714-11-23 23:59:59 BC'::timestamp; + ^ +SELECT '294276-12-31 23:59:59'::timestamp; + timestamp +---------------------------- + Sun Dec 31 23:59:59 294276 +(1 row) + +SELECT '294277-01-01 00:00:00'::timestamp; -- out of range +ERROR: timestamp out of range: "294277-01-01 00:00:00" +LINE 1: SELECT '294277-01-01 00:00:00'::timestamp; + ^ +-- Demonstrate functions and operators +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 > timestamp without time zone '1997-01-02'; + d1 +---------------------------- + infinity + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:02 1997 + Mon Feb 10 17:32:01.4 1997 + Mon Feb 10 17:32:01.5 1997 + Mon Feb 10 17:32:01.6 1997 + Thu Jan 02 03:04:05 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 17:32:01 1997 + Sat Sep 22 18:19:20 2001 + Wed Mar 15 08:14:01 2000 + Wed Mar 15 13:14:02 2000 + Wed Mar 15 12:14:03 2000 + Wed Mar 15 03:14:04 2000 + Wed Mar 15 02:14:05 2000 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:00 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 18:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Feb 11 17:32:01 1997 + Wed Feb 12 17:32:01 1997 + Thu Feb 13 17:32:01 1997 + Fri Feb 14 17:32:01 1997 + Sat Feb 15 17:32:01 1997 + Sun Feb 16 17:32:01 1997 + Sun Feb 16 17:32:01 1997 + Sat Feb 16 17:32:01 2097 + Fri Feb 28 17:32:01 1997 + Sat Mar 01 17:32:01 1997 + Tue Dec 30 17:32:01 1997 + Wed Dec 31 17:32:01 1997 + Fri Dec 31 17:32:01 1999 + Sat Jan 01 17:32:01 2000 + Sun Dec 31 17:32:01 2000 + Mon Jan 01 17:32:01 2001 +(49 rows) + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 < timestamp without time zone '1997-01-02'; + d1 +----------------------------- + -infinity + Thu Jan 01 00:00:00 1970 + Tue Feb 16 17:32:01 0097 BC + Sat Feb 16 17:32:01 0097 + Thu Feb 16 17:32:01 0597 + Tue Feb 16 17:32:01 1097 + Sat Feb 16 17:32:01 1697 + Thu Feb 16 17:32:01 1797 + Tue Feb 16 17:32:01 1897 + Wed Feb 28 17:32:01 1996 + Thu Feb 29 17:32:01 1996 + Fri Mar 01 17:32:01 1996 + Mon Dec 30 17:32:01 1996 + Tue Dec 31 17:32:01 1996 + Wed Jan 01 17:32:01 1997 +(15 rows) + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 = timestamp without time zone '1997-01-02'; + d1 +-------------------------- + Thu Jan 02 00:00:00 1997 +(1 row) + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 != timestamp without time zone '1997-01-02'; + d1 +----------------------------- + -infinity + infinity + Thu Jan 01 00:00:00 1970 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:02 1997 + Mon Feb 10 17:32:01.4 1997 + Mon Feb 10 17:32:01.5 1997 + Mon Feb 10 17:32:01.6 1997 + Thu Jan 02 03:04:05 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 17:32:01 1997 + Sat Sep 22 18:19:20 2001 + Wed Mar 15 08:14:01 2000 + Wed Mar 15 13:14:02 2000 + Wed Mar 15 12:14:03 2000 + Wed Mar 15 03:14:04 2000 + Wed Mar 15 02:14:05 2000 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:00 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 18:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Feb 11 17:32:01 1997 + Wed Feb 12 17:32:01 1997 + Thu Feb 13 17:32:01 1997 + Fri Feb 14 17:32:01 1997 + Sat Feb 15 17:32:01 1997 + Sun Feb 16 17:32:01 1997 + Tue Feb 16 17:32:01 0097 BC + Sat Feb 16 17:32:01 0097 + Thu Feb 16 17:32:01 0597 + Tue Feb 16 17:32:01 1097 + Sat Feb 16 17:32:01 1697 + Thu Feb 16 17:32:01 1797 + Tue Feb 16 17:32:01 1897 + Sun Feb 16 17:32:01 1997 + Sat Feb 16 17:32:01 2097 + Wed Feb 28 17:32:01 1996 + Thu Feb 29 17:32:01 1996 + Fri Mar 01 17:32:01 1996 + Mon Dec 30 17:32:01 1996 + Tue Dec 31 17:32:01 1996 + Wed Jan 01 17:32:01 1997 + Fri Feb 28 17:32:01 1997 + Sat Mar 01 17:32:01 1997 + Tue Dec 30 17:32:01 1997 + Wed Dec 31 17:32:01 1997 + Fri Dec 31 17:32:01 1999 + Sat Jan 01 17:32:01 2000 + Sun Dec 31 17:32:01 2000 + Mon Jan 01 17:32:01 2001 +(64 rows) + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 <= timestamp without time zone '1997-01-02'; + d1 +----------------------------- + -infinity + Thu Jan 01 00:00:00 1970 + Thu Jan 02 00:00:00 1997 + Tue Feb 16 17:32:01 0097 BC + Sat Feb 16 17:32:01 0097 + Thu Feb 16 17:32:01 0597 + Tue Feb 16 17:32:01 1097 + Sat Feb 16 17:32:01 1697 + Thu Feb 16 17:32:01 1797 + Tue Feb 16 17:32:01 1897 + Wed Feb 28 17:32:01 1996 + Thu Feb 29 17:32:01 1996 + Fri Mar 01 17:32:01 1996 + Mon Dec 30 17:32:01 1996 + Tue Dec 31 17:32:01 1996 + Wed Jan 01 17:32:01 1997 +(16 rows) + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 >= timestamp without time zone '1997-01-02'; + d1 +---------------------------- + infinity + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:02 1997 + Mon Feb 10 17:32:01.4 1997 + Mon Feb 10 17:32:01.5 1997 + Mon Feb 10 17:32:01.6 1997 + Thu Jan 02 00:00:00 1997 + Thu Jan 02 03:04:05 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 17:32:01 1997 + Sat Sep 22 18:19:20 2001 + Wed Mar 15 08:14:01 2000 + Wed Mar 15 13:14:02 2000 + Wed Mar 15 12:14:03 2000 + Wed Mar 15 03:14:04 2000 + Wed Mar 15 02:14:05 2000 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:00 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Jun 10 18:32:01 1997 + Mon Feb 10 17:32:01 1997 + Tue Feb 11 17:32:01 1997 + Wed Feb 12 17:32:01 1997 + Thu Feb 13 17:32:01 1997 + Fri Feb 14 17:32:01 1997 + Sat Feb 15 17:32:01 1997 + Sun Feb 16 17:32:01 1997 + Sun Feb 16 17:32:01 1997 + Sat Feb 16 17:32:01 2097 + Fri Feb 28 17:32:01 1997 + Sat Mar 01 17:32:01 1997 + Tue Dec 30 17:32:01 1997 + Wed Dec 31 17:32:01 1997 + Fri Dec 31 17:32:01 1999 + Sat Jan 01 17:32:01 2000 + Sun Dec 31 17:32:01 2000 + Mon Jan 01 17:32:01 2001 +(50 rows) + +SELECT d1 - timestamp without time zone '1997-01-02' AS diff + FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; + diff +---------------------------------------- + @ 9863 days ago + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 2 secs + @ 39 days 17 hours 32 mins 1.4 secs + @ 39 days 17 hours 32 mins 1.5 secs + @ 39 days 17 hours 32 mins 1.6 secs + @ 0 + @ 3 hours 4 mins 5 secs + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 159 days 17 hours 32 mins 1 sec + @ 1724 days 18 hours 19 mins 20 secs + @ 1168 days 8 hours 14 mins 1 sec + @ 1168 days 13 hours 14 mins 2 secs + @ 1168 days 12 hours 14 mins 3 secs + @ 1168 days 3 hours 14 mins 4 secs + @ 1168 days 2 hours 14 mins 5 secs + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 159 days 18 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 40 days 17 hours 32 mins 1 sec + @ 41 days 17 hours 32 mins 1 sec + @ 42 days 17 hours 32 mins 1 sec + @ 43 days 17 hours 32 mins 1 sec + @ 44 days 17 hours 32 mins 1 sec + @ 45 days 17 hours 32 mins 1 sec + @ 45 days 17 hours 32 mins 1 sec + @ 308 days 6 hours 27 mins 59 secs ago + @ 307 days 6 hours 27 mins 59 secs ago + @ 306 days 6 hours 27 mins 59 secs ago + @ 2 days 6 hours 27 mins 59 secs ago + @ 1 day 6 hours 27 mins 59 secs ago + @ 6 hours 27 mins 59 secs ago + @ 57 days 17 hours 32 mins 1 sec + @ 58 days 17 hours 32 mins 1 sec + @ 362 days 17 hours 32 mins 1 sec + @ 363 days 17 hours 32 mins 1 sec + @ 1093 days 17 hours 32 mins 1 sec + @ 1094 days 17 hours 32 mins 1 sec + @ 1459 days 17 hours 32 mins 1 sec + @ 1460 days 17 hours 32 mins 1 sec +(55 rows) + +SELECT date_trunc( 'week', timestamp '2004-02-29 15:44:17.71393' ) AS week_trunc; + week_trunc +-------------------------- + Mon Feb 23 00:00:00 2004 +(1 row) + +-- verify date_bin behaves the same as date_trunc for relevant intervals +-- case 1: AD dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2001-01-01') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); + str | interval | equal +-------------+----------+------- + week | 7 d | t + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(7 rows) + +-- case 2: BC dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2000-01-01 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); + str | interval | equal +-------------+----------+------- + week | 7 d | t + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(7 rows) + +-- case 3: AD dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2020-03-02') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); + str | interval | equal +-------------+----------+------- + week | 7 d | t + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(7 rows) + +-- case 4: BC dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '0055-06-17 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); + str | interval | equal +-------------+----------+------- + week | 7 d | t + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(7 rows) + +-- bin timestamps into arbitrary intervals +SELECT + interval, + ts, + origin, + date_bin(interval::interval, ts, origin) +FROM ( + VALUES + ('15 days'), + ('2 hours'), + ('1 hour 30 minutes'), + ('15 minutes'), + ('10 seconds'), + ('100 milliseconds'), + ('250 microseconds') +) intervals (interval), +(VALUES (timestamp '2020-02-11 15:44:17.71393')) ts (ts), +(VALUES (timestamp '2001-01-01')) origin (origin); + interval | ts | origin | date_bin +-------------------+--------------------------------+--------------------------+-------------------------------- + 15 days | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Thu Feb 06 00:00:00 2020 + 2 hours | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 14:00:00 2020 + 1 hour 30 minutes | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:00:00 2020 + 15 minutes | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:30:00 2020 + 10 seconds | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:44:10 2020 + 100 milliseconds | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:44:17.7 2020 + 250 microseconds | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:44:17.71375 2020 +(7 rows) + +-- shift bins using the origin parameter: +SELECT date_bin('5 min'::interval, timestamp '2020-02-01 01:01:01', timestamp '2020-02-01 00:02:30'); + date_bin +-------------------------- + Sat Feb 01 00:57:30 2020 +(1 row) + +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +ERROR: timestamps cannot be binned into intervals containing months or years +SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +ERROR: timestamps cannot be binned into intervals containing months or years +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +ERROR: stride must be greater than zero +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +ERROR: stride must be greater than zero +-- Test casting within a BETWEEN qualifier +SELECT d1 - timestamp without time zone '1997-01-02' AS diff + FROM TIMESTAMP_TBL + WHERE d1 BETWEEN timestamp without time zone '1902-01-01' + AND timestamp without time zone '2038-01-01'; + diff +---------------------------------------- + @ 9863 days ago + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 2 secs + @ 39 days 17 hours 32 mins 1.4 secs + @ 39 days 17 hours 32 mins 1.5 secs + @ 39 days 17 hours 32 mins 1.6 secs + @ 0 + @ 3 hours 4 mins 5 secs + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 159 days 17 hours 32 mins 1 sec + @ 1724 days 18 hours 19 mins 20 secs + @ 1168 days 8 hours 14 mins 1 sec + @ 1168 days 13 hours 14 mins 2 secs + @ 1168 days 12 hours 14 mins 3 secs + @ 1168 days 3 hours 14 mins 4 secs + @ 1168 days 2 hours 14 mins 5 secs + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 159 days 18 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 40 days 17 hours 32 mins 1 sec + @ 41 days 17 hours 32 mins 1 sec + @ 42 days 17 hours 32 mins 1 sec + @ 43 days 17 hours 32 mins 1 sec + @ 44 days 17 hours 32 mins 1 sec + @ 45 days 17 hours 32 mins 1 sec + @ 45 days 17 hours 32 mins 1 sec + @ 308 days 6 hours 27 mins 59 secs ago + @ 307 days 6 hours 27 mins 59 secs ago + @ 306 days 6 hours 27 mins 59 secs ago + @ 2 days 6 hours 27 mins 59 secs ago + @ 1 day 6 hours 27 mins 59 secs ago + @ 6 hours 27 mins 59 secs ago + @ 57 days 17 hours 32 mins 1 sec + @ 58 days 17 hours 32 mins 1 sec + @ 362 days 17 hours 32 mins 1 sec + @ 363 days 17 hours 32 mins 1 sec + @ 1093 days 17 hours 32 mins 1 sec + @ 1094 days 17 hours 32 mins 1 sec + @ 1459 days 17 hours 32 mins 1 sec + @ 1460 days 17 hours 32 mins 1 sec +(55 rows) + +-- DATE_PART (timestamp_part) +SELECT d1 as "timestamp", + date_part( 'year', d1) AS year, date_part( 'month', d1) AS month, + date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, + date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second + FROM TIMESTAMP_TBL; + timestamp | year | month | day | hour | minute | second +-----------------------------+-----------+-------+-----+------+--------+-------- + -infinity | -Infinity | | | | | + infinity | Infinity | | | | | + Thu Jan 01 00:00:00 1970 | 1970 | 1 | 1 | 0 | 0 | 0 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:02 1997 | 1997 | 2 | 10 | 17 | 32 | 2 + Mon Feb 10 17:32:01.4 1997 | 1997 | 2 | 10 | 17 | 32 | 1.4 + Mon Feb 10 17:32:01.5 1997 | 1997 | 2 | 10 | 17 | 32 | 1.5 + Mon Feb 10 17:32:01.6 1997 | 1997 | 2 | 10 | 17 | 32 | 1.6 + Thu Jan 02 00:00:00 1997 | 1997 | 1 | 2 | 0 | 0 | 0 + Thu Jan 02 03:04:05 1997 | 1997 | 1 | 2 | 3 | 4 | 5 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Tue Jun 10 17:32:01 1997 | 1997 | 6 | 10 | 17 | 32 | 1 + Sat Sep 22 18:19:20 2001 | 2001 | 9 | 22 | 18 | 19 | 20 + Wed Mar 15 08:14:01 2000 | 2000 | 3 | 15 | 8 | 14 | 1 + Wed Mar 15 13:14:02 2000 | 2000 | 3 | 15 | 13 | 14 | 2 + Wed Mar 15 12:14:03 2000 | 2000 | 3 | 15 | 12 | 14 | 3 + Wed Mar 15 03:14:04 2000 | 2000 | 3 | 15 | 3 | 14 | 4 + Wed Mar 15 02:14:05 2000 | 2000 | 3 | 15 | 2 | 14 | 5 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:00 1997 | 1997 | 2 | 10 | 17 | 32 | 0 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Tue Jun 10 18:32:01 1997 | 1997 | 6 | 10 | 18 | 32 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 + Tue Feb 11 17:32:01 1997 | 1997 | 2 | 11 | 17 | 32 | 1 + Wed Feb 12 17:32:01 1997 | 1997 | 2 | 12 | 17 | 32 | 1 + Thu Feb 13 17:32:01 1997 | 1997 | 2 | 13 | 17 | 32 | 1 + Fri Feb 14 17:32:01 1997 | 1997 | 2 | 14 | 17 | 32 | 1 + Sat Feb 15 17:32:01 1997 | 1997 | 2 | 15 | 17 | 32 | 1 + Sun Feb 16 17:32:01 1997 | 1997 | 2 | 16 | 17 | 32 | 1 + Tue Feb 16 17:32:01 0097 BC | -97 | 2 | 16 | 17 | 32 | 1 + Sat Feb 16 17:32:01 0097 | 97 | 2 | 16 | 17 | 32 | 1 + Thu Feb 16 17:32:01 0597 | 597 | 2 | 16 | 17 | 32 | 1 + Tue Feb 16 17:32:01 1097 | 1097 | 2 | 16 | 17 | 32 | 1 + Sat Feb 16 17:32:01 1697 | 1697 | 2 | 16 | 17 | 32 | 1 + Thu Feb 16 17:32:01 1797 | 1797 | 2 | 16 | 17 | 32 | 1 + Tue Feb 16 17:32:01 1897 | 1897 | 2 | 16 | 17 | 32 | 1 + Sun Feb 16 17:32:01 1997 | 1997 | 2 | 16 | 17 | 32 | 1 + Sat Feb 16 17:32:01 2097 | 2097 | 2 | 16 | 17 | 32 | 1 + Wed Feb 28 17:32:01 1996 | 1996 | 2 | 28 | 17 | 32 | 1 + Thu Feb 29 17:32:01 1996 | 1996 | 2 | 29 | 17 | 32 | 1 + Fri Mar 01 17:32:01 1996 | 1996 | 3 | 1 | 17 | 32 | 1 + Mon Dec 30 17:32:01 1996 | 1996 | 12 | 30 | 17 | 32 | 1 + Tue Dec 31 17:32:01 1996 | 1996 | 12 | 31 | 17 | 32 | 1 + Wed Jan 01 17:32:01 1997 | 1997 | 1 | 1 | 17 | 32 | 1 + Fri Feb 28 17:32:01 1997 | 1997 | 2 | 28 | 17 | 32 | 1 + Sat Mar 01 17:32:01 1997 | 1997 | 3 | 1 | 17 | 32 | 1 + Tue Dec 30 17:32:01 1997 | 1997 | 12 | 30 | 17 | 32 | 1 + Wed Dec 31 17:32:01 1997 | 1997 | 12 | 31 | 17 | 32 | 1 + Fri Dec 31 17:32:01 1999 | 1999 | 12 | 31 | 17 | 32 | 1 + Sat Jan 01 17:32:01 2000 | 2000 | 1 | 1 | 17 | 32 | 1 + Sun Dec 31 17:32:01 2000 | 2000 | 12 | 31 | 17 | 32 | 1 + Mon Jan 01 17:32:01 2001 | 2001 | 1 | 1 | 17 | 32 | 1 +(65 rows) + +SELECT d1 as "timestamp", + date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, + date_part( 'usec', d1) AS usec + FROM TIMESTAMP_TBL; + timestamp | quarter | msec | usec +-----------------------------+---------+-------+---------- + -infinity | | | + infinity | | | + Thu Jan 01 00:00:00 1970 | 1 | 0 | 0 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:02 1997 | 1 | 2000 | 2000000 + Mon Feb 10 17:32:01.4 1997 | 1 | 1400 | 1400000 + Mon Feb 10 17:32:01.5 1997 | 1 | 1500 | 1500000 + Mon Feb 10 17:32:01.6 1997 | 1 | 1600 | 1600000 + Thu Jan 02 00:00:00 1997 | 1 | 0 | 0 + Thu Jan 02 03:04:05 1997 | 1 | 5000 | 5000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Tue Jun 10 17:32:01 1997 | 2 | 1000 | 1000000 + Sat Sep 22 18:19:20 2001 | 3 | 20000 | 20000000 + Wed Mar 15 08:14:01 2000 | 1 | 1000 | 1000000 + Wed Mar 15 13:14:02 2000 | 1 | 2000 | 2000000 + Wed Mar 15 12:14:03 2000 | 1 | 3000 | 3000000 + Wed Mar 15 03:14:04 2000 | 1 | 4000 | 4000000 + Wed Mar 15 02:14:05 2000 | 1 | 5000 | 5000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:00 1997 | 1 | 0 | 0 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Tue Jun 10 18:32:01 1997 | 2 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 + Tue Feb 11 17:32:01 1997 | 1 | 1000 | 1000000 + Wed Feb 12 17:32:01 1997 | 1 | 1000 | 1000000 + Thu Feb 13 17:32:01 1997 | 1 | 1000 | 1000000 + Fri Feb 14 17:32:01 1997 | 1 | 1000 | 1000000 + Sat Feb 15 17:32:01 1997 | 1 | 1000 | 1000000 + Sun Feb 16 17:32:01 1997 | 1 | 1000 | 1000000 + Tue Feb 16 17:32:01 0097 BC | 1 | 1000 | 1000000 + Sat Feb 16 17:32:01 0097 | 1 | 1000 | 1000000 + Thu Feb 16 17:32:01 0597 | 1 | 1000 | 1000000 + Tue Feb 16 17:32:01 1097 | 1 | 1000 | 1000000 + Sat Feb 16 17:32:01 1697 | 1 | 1000 | 1000000 + Thu Feb 16 17:32:01 1797 | 1 | 1000 | 1000000 + Tue Feb 16 17:32:01 1897 | 1 | 1000 | 1000000 + Sun Feb 16 17:32:01 1997 | 1 | 1000 | 1000000 + Sat Feb 16 17:32:01 2097 | 1 | 1000 | 1000000 + Wed Feb 28 17:32:01 1996 | 1 | 1000 | 1000000 + Thu Feb 29 17:32:01 1996 | 1 | 1000 | 1000000 + Fri Mar 01 17:32:01 1996 | 1 | 1000 | 1000000 + Mon Dec 30 17:32:01 1996 | 4 | 1000 | 1000000 + Tue Dec 31 17:32:01 1996 | 4 | 1000 | 1000000 + Wed Jan 01 17:32:01 1997 | 1 | 1000 | 1000000 + Fri Feb 28 17:32:01 1997 | 1 | 1000 | 1000000 + Sat Mar 01 17:32:01 1997 | 1 | 1000 | 1000000 + Tue Dec 30 17:32:01 1997 | 4 | 1000 | 1000000 + Wed Dec 31 17:32:01 1997 | 4 | 1000 | 1000000 + Fri Dec 31 17:32:01 1999 | 4 | 1000 | 1000000 + Sat Jan 01 17:32:01 2000 | 1 | 1000 | 1000000 + Sun Dec 31 17:32:01 2000 | 4 | 1000 | 1000000 + Mon Jan 01 17:32:01 2001 | 1 | 1000 | 1000000 +(65 rows) + +SELECT d1 as "timestamp", + date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, + date_part( 'isodow', d1) AS isodow, date_part( 'dow', d1) AS dow, + date_part( 'doy', d1) AS doy + FROM TIMESTAMP_TBL; + timestamp | isoyear | week | isodow | dow | doy +-----------------------------+-----------+------+--------+-----+----- + -infinity | -Infinity | | | | + infinity | Infinity | | | | + Thu Jan 01 00:00:00 1970 | 1970 | 1 | 4 | 4 | 1 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:02 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01.4 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01.5 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01.6 1997 | 1997 | 7 | 1 | 1 | 41 + Thu Jan 02 00:00:00 1997 | 1997 | 1 | 4 | 4 | 2 + Thu Jan 02 03:04:05 1997 | 1997 | 1 | 4 | 4 | 2 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Tue Jun 10 17:32:01 1997 | 1997 | 24 | 2 | 2 | 161 + Sat Sep 22 18:19:20 2001 | 2001 | 38 | 6 | 6 | 265 + Wed Mar 15 08:14:01 2000 | 2000 | 11 | 3 | 3 | 75 + Wed Mar 15 13:14:02 2000 | 2000 | 11 | 3 | 3 | 75 + Wed Mar 15 12:14:03 2000 | 2000 | 11 | 3 | 3 | 75 + Wed Mar 15 03:14:04 2000 | 2000 | 11 | 3 | 3 | 75 + Wed Mar 15 02:14:05 2000 | 2000 | 11 | 3 | 3 | 75 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:00 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Tue Jun 10 18:32:01 1997 | 1997 | 24 | 2 | 2 | 161 + Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | 1 | 41 + Tue Feb 11 17:32:01 1997 | 1997 | 7 | 2 | 2 | 42 + Wed Feb 12 17:32:01 1997 | 1997 | 7 | 3 | 3 | 43 + Thu Feb 13 17:32:01 1997 | 1997 | 7 | 4 | 4 | 44 + Fri Feb 14 17:32:01 1997 | 1997 | 7 | 5 | 5 | 45 + Sat Feb 15 17:32:01 1997 | 1997 | 7 | 6 | 6 | 46 + Sun Feb 16 17:32:01 1997 | 1997 | 7 | 7 | 0 | 47 + Tue Feb 16 17:32:01 0097 BC | -97 | 7 | 2 | 2 | 47 + Sat Feb 16 17:32:01 0097 | 97 | 7 | 6 | 6 | 47 + Thu Feb 16 17:32:01 0597 | 597 | 7 | 4 | 4 | 47 + Tue Feb 16 17:32:01 1097 | 1097 | 7 | 2 | 2 | 47 + Sat Feb 16 17:32:01 1697 | 1697 | 7 | 6 | 6 | 47 + Thu Feb 16 17:32:01 1797 | 1797 | 7 | 4 | 4 | 47 + Tue Feb 16 17:32:01 1897 | 1897 | 7 | 2 | 2 | 47 + Sun Feb 16 17:32:01 1997 | 1997 | 7 | 7 | 0 | 47 + Sat Feb 16 17:32:01 2097 | 2097 | 7 | 6 | 6 | 47 + Wed Feb 28 17:32:01 1996 | 1996 | 9 | 3 | 3 | 59 + Thu Feb 29 17:32:01 1996 | 1996 | 9 | 4 | 4 | 60 + Fri Mar 01 17:32:01 1996 | 1996 | 9 | 5 | 5 | 61 + Mon Dec 30 17:32:01 1996 | 1997 | 1 | 1 | 1 | 365 + Tue Dec 31 17:32:01 1996 | 1997 | 1 | 2 | 2 | 366 + Wed Jan 01 17:32:01 1997 | 1997 | 1 | 3 | 3 | 1 + Fri Feb 28 17:32:01 1997 | 1997 | 9 | 5 | 5 | 59 + Sat Mar 01 17:32:01 1997 | 1997 | 9 | 6 | 6 | 60 + Tue Dec 30 17:32:01 1997 | 1998 | 1 | 2 | 2 | 364 + Wed Dec 31 17:32:01 1997 | 1998 | 1 | 3 | 3 | 365 + Fri Dec 31 17:32:01 1999 | 1999 | 52 | 5 | 5 | 365 + Sat Jan 01 17:32:01 2000 | 1999 | 52 | 6 | 6 | 1 + Sun Dec 31 17:32:01 2000 | 2000 | 52 | 7 | 0 | 366 + Mon Jan 01 17:32:01 2001 | 2001 | 1 | 1 | 1 | 1 +(65 rows) + +SELECT d1 as "timestamp", + date_part( 'decade', d1) AS decade, + date_part( 'century', d1) AS century, + date_part( 'millennium', d1) AS millennium, + round(date_part( 'julian', d1)) AS julian, + date_part( 'epoch', d1) AS epoch + FROM TIMESTAMP_TBL; + timestamp | decade | century | millennium | julian | epoch +-----------------------------+-----------+-----------+------------+-----------+-------------- + -infinity | -Infinity | -Infinity | -Infinity | -Infinity | -Infinity + infinity | Infinity | Infinity | Infinity | Infinity | Infinity + Thu Jan 01 00:00:00 1970 | 197 | 20 | 2 | 2440588 | 0 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:02 1997 | 199 | 20 | 2 | 2450491 | 855595922 + Mon Feb 10 17:32:01.4 1997 | 199 | 20 | 2 | 2450491 | 855595921.4 + Mon Feb 10 17:32:01.5 1997 | 199 | 20 | 2 | 2450491 | 855595921.5 + Mon Feb 10 17:32:01.6 1997 | 199 | 20 | 2 | 2450491 | 855595921.6 + Thu Jan 02 00:00:00 1997 | 199 | 20 | 2 | 2450451 | 852163200 + Thu Jan 02 03:04:05 1997 | 199 | 20 | 2 | 2450451 | 852174245 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Tue Jun 10 17:32:01 1997 | 199 | 20 | 2 | 2450611 | 865963921 + Sat Sep 22 18:19:20 2001 | 200 | 21 | 3 | 2452176 | 1001182760 + Wed Mar 15 08:14:01 2000 | 200 | 20 | 2 | 2451619 | 953108041 + Wed Mar 15 13:14:02 2000 | 200 | 20 | 2 | 2451620 | 953126042 + Wed Mar 15 12:14:03 2000 | 200 | 20 | 2 | 2451620 | 953122443 + Wed Mar 15 03:14:04 2000 | 200 | 20 | 2 | 2451619 | 953090044 + Wed Mar 15 02:14:05 2000 | 200 | 20 | 2 | 2451619 | 953086445 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:00 1997 | 199 | 20 | 2 | 2450491 | 855595920 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Tue Jun 10 18:32:01 1997 | 199 | 20 | 2 | 2450611 | 865967521 + Mon Feb 10 17:32:01 1997 | 199 | 20 | 2 | 2450491 | 855595921 + Tue Feb 11 17:32:01 1997 | 199 | 20 | 2 | 2450492 | 855682321 + Wed Feb 12 17:32:01 1997 | 199 | 20 | 2 | 2450493 | 855768721 + Thu Feb 13 17:32:01 1997 | 199 | 20 | 2 | 2450494 | 855855121 + Fri Feb 14 17:32:01 1997 | 199 | 20 | 2 | 2450495 | 855941521 + Sat Feb 15 17:32:01 1997 | 199 | 20 | 2 | 2450496 | 856027921 + Sun Feb 16 17:32:01 1997 | 199 | 20 | 2 | 2450497 | 856114321 + Tue Feb 16 17:32:01 0097 BC | -10 | -1 | -1 | 1686043 | -65192711279 + Sat Feb 16 17:32:01 0097 | 9 | 1 | 1 | 1756537 | -59102029679 + Thu Feb 16 17:32:01 0597 | 59 | 6 | 1 | 1939158 | -43323575279 + Tue Feb 16 17:32:01 1097 | 109 | 11 | 2 | 2121779 | -27545120879 + Sat Feb 16 17:32:01 1697 | 169 | 17 | 2 | 2340925 | -8610906479 + Thu Feb 16 17:32:01 1797 | 179 | 18 | 2 | 2377449 | -5455232879 + Tue Feb 16 17:32:01 1897 | 189 | 19 | 2 | 2413973 | -2299559279 + Sun Feb 16 17:32:01 1997 | 199 | 20 | 2 | 2450497 | 856114321 + Sat Feb 16 17:32:01 2097 | 209 | 21 | 3 | 2487022 | 4011874321 + Wed Feb 28 17:32:01 1996 | 199 | 20 | 2 | 2450143 | 825528721 + Thu Feb 29 17:32:01 1996 | 199 | 20 | 2 | 2450144 | 825615121 + Fri Mar 01 17:32:01 1996 | 199 | 20 | 2 | 2450145 | 825701521 + Mon Dec 30 17:32:01 1996 | 199 | 20 | 2 | 2450449 | 851967121 + Tue Dec 31 17:32:01 1996 | 199 | 20 | 2 | 2450450 | 852053521 + Wed Jan 01 17:32:01 1997 | 199 | 20 | 2 | 2450451 | 852139921 + Fri Feb 28 17:32:01 1997 | 199 | 20 | 2 | 2450509 | 857151121 + Sat Mar 01 17:32:01 1997 | 199 | 20 | 2 | 2450510 | 857237521 + Tue Dec 30 17:32:01 1997 | 199 | 20 | 2 | 2450814 | 883503121 + Wed Dec 31 17:32:01 1997 | 199 | 20 | 2 | 2450815 | 883589521 + Fri Dec 31 17:32:01 1999 | 199 | 20 | 2 | 2451545 | 946661521 + Sat Jan 01 17:32:01 2000 | 200 | 20 | 2 | 2451546 | 946747921 + Sun Dec 31 17:32:01 2000 | 200 | 20 | 2 | 2451911 | 978283921 + Mon Jan 01 17:32:01 2001 | 200 | 21 | 3 | 2451912 | 978370321 +(65 rows) + +-- extract implementation is mostly the same as date_part, so only +-- test a few cases for additional coverage. +SELECT d1 as "timestamp", + extract(microseconds from d1) AS microseconds, + extract(milliseconds from d1) AS milliseconds, + extract(seconds from d1) AS seconds, + round(extract(julian from d1)) AS julian, + extract(epoch from d1) AS epoch + FROM TIMESTAMP_TBL; + timestamp | microseconds | milliseconds | seconds | julian | epoch +-----------------------------+--------------+--------------+-----------+-----------+--------------------- + -infinity | | | | -Infinity | -Infinity + infinity | | | | Infinity | Infinity + Thu Jan 01 00:00:00 1970 | 0 | 0.000 | 0.000000 | 2440588 | 0.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:02 1997 | 2000000 | 2000.000 | 2.000000 | 2450491 | 855595922.000000 + Mon Feb 10 17:32:01.4 1997 | 1400000 | 1400.000 | 1.400000 | 2450491 | 855595921.400000 + Mon Feb 10 17:32:01.5 1997 | 1500000 | 1500.000 | 1.500000 | 2450491 | 855595921.500000 + Mon Feb 10 17:32:01.6 1997 | 1600000 | 1600.000 | 1.600000 | 2450491 | 855595921.600000 + Thu Jan 02 00:00:00 1997 | 0 | 0.000 | 0.000000 | 2450451 | 852163200.000000 + Thu Jan 02 03:04:05 1997 | 5000000 | 5000.000 | 5.000000 | 2450451 | 852174245.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Tue Jun 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450611 | 865963921.000000 + Sat Sep 22 18:19:20 2001 | 20000000 | 20000.000 | 20.000000 | 2452176 | 1001182760.000000 + Wed Mar 15 08:14:01 2000 | 1000000 | 1000.000 | 1.000000 | 2451619 | 953108041.000000 + Wed Mar 15 13:14:02 2000 | 2000000 | 2000.000 | 2.000000 | 2451620 | 953126042.000000 + Wed Mar 15 12:14:03 2000 | 3000000 | 3000.000 | 3.000000 | 2451620 | 953122443.000000 + Wed Mar 15 03:14:04 2000 | 4000000 | 4000.000 | 4.000000 | 2451619 | 953090044.000000 + Wed Mar 15 02:14:05 2000 | 5000000 | 5000.000 | 5.000000 | 2451619 | 953086445.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:00 1997 | 0 | 0.000 | 0.000000 | 2450491 | 855595920.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Tue Jun 10 18:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450611 | 865967521.000000 + Mon Feb 10 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450491 | 855595921.000000 + Tue Feb 11 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450492 | 855682321.000000 + Wed Feb 12 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450493 | 855768721.000000 + Thu Feb 13 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450494 | 855855121.000000 + Fri Feb 14 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450495 | 855941521.000000 + Sat Feb 15 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450496 | 856027921.000000 + Sun Feb 16 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450497 | 856114321.000000 + Tue Feb 16 17:32:01 0097 BC | 1000000 | 1000.000 | 1.000000 | 1686043 | -65192711279.000000 + Sat Feb 16 17:32:01 0097 | 1000000 | 1000.000 | 1.000000 | 1756537 | -59102029679.000000 + Thu Feb 16 17:32:01 0597 | 1000000 | 1000.000 | 1.000000 | 1939158 | -43323575279.000000 + Tue Feb 16 17:32:01 1097 | 1000000 | 1000.000 | 1.000000 | 2121779 | -27545120879.000000 + Sat Feb 16 17:32:01 1697 | 1000000 | 1000.000 | 1.000000 | 2340925 | -8610906479.000000 + Thu Feb 16 17:32:01 1797 | 1000000 | 1000.000 | 1.000000 | 2377449 | -5455232879.000000 + Tue Feb 16 17:32:01 1897 | 1000000 | 1000.000 | 1.000000 | 2413973 | -2299559279.000000 + Sun Feb 16 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450497 | 856114321.000000 + Sat Feb 16 17:32:01 2097 | 1000000 | 1000.000 | 1.000000 | 2487022 | 4011874321.000000 + Wed Feb 28 17:32:01 1996 | 1000000 | 1000.000 | 1.000000 | 2450143 | 825528721.000000 + Thu Feb 29 17:32:01 1996 | 1000000 | 1000.000 | 1.000000 | 2450144 | 825615121.000000 + Fri Mar 01 17:32:01 1996 | 1000000 | 1000.000 | 1.000000 | 2450145 | 825701521.000000 + Mon Dec 30 17:32:01 1996 | 1000000 | 1000.000 | 1.000000 | 2450449 | 851967121.000000 + Tue Dec 31 17:32:01 1996 | 1000000 | 1000.000 | 1.000000 | 2450450 | 852053521.000000 + Wed Jan 01 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450451 | 852139921.000000 + Fri Feb 28 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450509 | 857151121.000000 + Sat Mar 01 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450510 | 857237521.000000 + Tue Dec 30 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450814 | 883503121.000000 + Wed Dec 31 17:32:01 1997 | 1000000 | 1000.000 | 1.000000 | 2450815 | 883589521.000000 + Fri Dec 31 17:32:01 1999 | 1000000 | 1000.000 | 1.000000 | 2451545 | 946661521.000000 + Sat Jan 01 17:32:01 2000 | 1000000 | 1000.000 | 1.000000 | 2451546 | 946747921.000000 + Sun Dec 31 17:32:01 2000 | 1000000 | 1000.000 | 1.000000 | 2451911 | 978283921.000000 + Mon Jan 01 17:32:01 2001 | 1000000 | 1000.000 | 1.000000 | 2451912 | 978370321.000000 +(65 rows) + +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00'::timestamp); + date_part +--------------- + 9224097091200 +(1 row) + +SELECT extract(epoch from '294270-01-01 00:00:00'::timestamp); + extract +---------------------- + 9224097091200.000000 +(1 row) + +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00'::timestamp); + extract +-------------------- + 95617584000.000000 +(1 row) + +-- TO_CHAR() +SELECT to_char(d1, 'DAY Day day DY Dy dy MONTH Month month RM MON Mon mon') + FROM TIMESTAMP_TBL; + to_char +------------------------------------------------------------------------------------------ + + + THURSDAY Thursday thursday THU Thu thu JANUARY January january I JAN Jan jan + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu JANUARY January january I JAN Jan jan + THURSDAY Thursday thursday THU Thu thu JANUARY January january I JAN Jan jan + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue JUNE June june VI JUN Jun jun + SATURDAY Saturday saturday SAT Sat sat SEPTEMBER September september IX SEP Sep sep + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue JUNE June june VI JUN Jun jun + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue FEBRUARY February february II FEB Feb feb + WEDNESDAY Wednesday wednesday WED Wed wed FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu FEBRUARY February february II FEB Feb feb + FRIDAY Friday friday FRI Fri fri FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat FEBRUARY February february II FEB Feb feb + SUNDAY Sunday sunday SUN Sun sun FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue FEBRUARY February february II FEB Feb feb + SUNDAY Sunday sunday SUN Sun sun FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat FEBRUARY February february II FEB Feb feb + WEDNESDAY Wednesday wednesday WED Wed wed FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu FEBRUARY February february II FEB Feb feb + FRIDAY Friday friday FRI Fri fri MARCH March march III MAR Mar mar + MONDAY Monday monday MON Mon mon DECEMBER December december XII DEC Dec dec + TUESDAY Tuesday tuesday TUE Tue tue DECEMBER December december XII DEC Dec dec + WEDNESDAY Wednesday wednesday WED Wed wed JANUARY January january I JAN Jan jan + FRIDAY Friday friday FRI Fri fri FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat MARCH March march III MAR Mar mar + TUESDAY Tuesday tuesday TUE Tue tue DECEMBER December december XII DEC Dec dec + WEDNESDAY Wednesday wednesday WED Wed wed DECEMBER December december XII DEC Dec dec + FRIDAY Friday friday FRI Fri fri DECEMBER December december XII DEC Dec dec + SATURDAY Saturday saturday SAT Sat sat JANUARY January january I JAN Jan jan + SUNDAY Sunday sunday SUN Sun sun DECEMBER December december XII DEC Dec dec + MONDAY Monday monday MON Mon mon JANUARY January january I JAN Jan jan +(65 rows) + +SELECT to_char(d1, 'FMDAY FMDay FMday FMMONTH FMMonth FMmonth FMRM') + FROM TIMESTAMP_TBL; + to_char +-------------------------------------------------------------- + + + THURSDAY Thursday thursday JANUARY January january I + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + THURSDAY Thursday thursday JANUARY January january I + THURSDAY Thursday thursday JANUARY January january I + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + TUESDAY Tuesday tuesday JUNE June june VI + SATURDAY Saturday saturday SEPTEMBER September september IX + WEDNESDAY Wednesday wednesday MARCH March march III + WEDNESDAY Wednesday wednesday MARCH March march III + WEDNESDAY Wednesday wednesday MARCH March march III + WEDNESDAY Wednesday wednesday MARCH March march III + WEDNESDAY Wednesday wednesday MARCH March march III + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + TUESDAY Tuesday tuesday JUNE June june VI + MONDAY Monday monday FEBRUARY February february II + TUESDAY Tuesday tuesday FEBRUARY February february II + WEDNESDAY Wednesday wednesday FEBRUARY February february II + THURSDAY Thursday thursday FEBRUARY February february II + FRIDAY Friday friday FEBRUARY February february II + SATURDAY Saturday saturday FEBRUARY February february II + SUNDAY Sunday sunday FEBRUARY February february II + TUESDAY Tuesday tuesday FEBRUARY February february II + SATURDAY Saturday saturday FEBRUARY February february II + THURSDAY Thursday thursday FEBRUARY February february II + TUESDAY Tuesday tuesday FEBRUARY February february II + SATURDAY Saturday saturday FEBRUARY February february II + THURSDAY Thursday thursday FEBRUARY February february II + TUESDAY Tuesday tuesday FEBRUARY February february II + SUNDAY Sunday sunday FEBRUARY February february II + SATURDAY Saturday saturday FEBRUARY February february II + WEDNESDAY Wednesday wednesday FEBRUARY February february II + THURSDAY Thursday thursday FEBRUARY February february II + FRIDAY Friday friday MARCH March march III + MONDAY Monday monday DECEMBER December december XII + TUESDAY Tuesday tuesday DECEMBER December december XII + WEDNESDAY Wednesday wednesday JANUARY January january I + FRIDAY Friday friday FEBRUARY February february II + SATURDAY Saturday saturday MARCH March march III + TUESDAY Tuesday tuesday DECEMBER December december XII + WEDNESDAY Wednesday wednesday DECEMBER December december XII + FRIDAY Friday friday DECEMBER December december XII + SATURDAY Saturday saturday JANUARY January january I + SUNDAY Sunday sunday DECEMBER December december XII + MONDAY Monday monday JANUARY January january I +(65 rows) + +SELECT to_char(d1, 'Y,YYY YYYY YYY YY Y CC Q MM WW DDD DD D J') + FROM TIMESTAMP_TBL; + to_char +-------------------------------------------------- + + + 1,970 1970 970 70 0 20 1 01 01 001 01 5 2440588 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 01 01 002 02 5 2450451 + 1,997 1997 997 97 7 20 1 01 01 002 02 5 2450451 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 2 06 23 161 10 3 2450610 + 2,001 2001 001 01 1 21 3 09 38 265 22 7 2452175 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 2 06 23 161 10 3 2450610 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 042 11 3 2450491 + 1,997 1997 997 97 7 20 1 02 07 043 12 4 2450492 + 1,997 1997 997 97 7 20 1 02 07 044 13 5 2450493 + 1,997 1997 997 97 7 20 1 02 07 045 14 6 2450494 + 1,997 1997 997 97 7 20 1 02 07 046 15 7 2450495 + 1,997 1997 997 97 7 20 1 02 07 047 16 1 2450496 + 0,097 0097 097 97 7 -01 1 02 07 047 16 3 1686042 + 0,097 0097 097 97 7 01 1 02 07 047 16 7 1756536 + 0,597 0597 597 97 7 06 1 02 07 047 16 5 1939157 + 1,097 1097 097 97 7 11 1 02 07 047 16 3 2121778 + 1,697 1697 697 97 7 17 1 02 07 047 16 7 2340924 + 1,797 1797 797 97 7 18 1 02 07 047 16 5 2377448 + 1,897 1897 897 97 7 19 1 02 07 047 16 3 2413972 + 1,997 1997 997 97 7 20 1 02 07 047 16 1 2450496 + 2,097 2097 097 97 7 21 1 02 07 047 16 7 2487021 + 1,996 1996 996 96 6 20 1 02 09 059 28 4 2450142 + 1,996 1996 996 96 6 20 1 02 09 060 29 5 2450143 + 1,996 1996 996 96 6 20 1 03 09 061 01 6 2450144 + 1,996 1996 996 96 6 20 4 12 53 365 30 2 2450448 + 1,996 1996 996 96 6 20 4 12 53 366 31 3 2450449 + 1,997 1997 997 97 7 20 1 01 01 001 01 4 2450450 + 1,997 1997 997 97 7 20 1 02 09 059 28 6 2450508 + 1,997 1997 997 97 7 20 1 03 09 060 01 7 2450509 + 1,997 1997 997 97 7 20 4 12 52 364 30 3 2450813 + 1,997 1997 997 97 7 20 4 12 53 365 31 4 2450814 + 1,999 1999 999 99 9 20 4 12 53 365 31 6 2451544 + 2,000 2000 000 00 0 20 1 01 01 001 01 7 2451545 + 2,000 2000 000 00 0 20 4 12 53 366 31 1 2451910 + 2,001 2001 001 01 1 21 1 01 01 001 01 2 2451911 +(65 rows) + +SELECT to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ') + FROM TIMESTAMP_TBL; + to_char +------------------------------------------------- + + + 1,970 1970 970 70 0 20 1 1 1 1 1 5 2440588 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 1 1 2 2 5 2450451 + 1,997 1997 997 97 7 20 1 1 1 2 2 5 2450451 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 2 6 23 161 10 3 2450610 + 2,001 2001 1 1 1 21 3 9 38 265 22 7 2452175 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 2 6 23 161 10 3 2450610 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 42 11 3 2450491 + 1,997 1997 997 97 7 20 1 2 7 43 12 4 2450492 + 1,997 1997 997 97 7 20 1 2 7 44 13 5 2450493 + 1,997 1997 997 97 7 20 1 2 7 45 14 6 2450494 + 1,997 1997 997 97 7 20 1 2 7 46 15 7 2450495 + 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496 + 0,097 97 97 97 7 -1 1 2 7 47 16 3 1686042 + 0,097 97 97 97 7 1 1 2 7 47 16 7 1756536 + 0,597 597 597 97 7 6 1 2 7 47 16 5 1939157 + 1,097 1097 97 97 7 11 1 2 7 47 16 3 2121778 + 1,697 1697 697 97 7 17 1 2 7 47 16 7 2340924 + 1,797 1797 797 97 7 18 1 2 7 47 16 5 2377448 + 1,897 1897 897 97 7 19 1 2 7 47 16 3 2413972 + 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496 + 2,097 2097 97 97 7 21 1 2 7 47 16 7 2487021 + 1,996 1996 996 96 6 20 1 2 9 59 28 4 2450142 + 1,996 1996 996 96 6 20 1 2 9 60 29 5 2450143 + 1,996 1996 996 96 6 20 1 3 9 61 1 6 2450144 + 1,996 1996 996 96 6 20 4 12 53 365 30 2 2450448 + 1,996 1996 996 96 6 20 4 12 53 366 31 3 2450449 + 1,997 1997 997 97 7 20 1 1 1 1 1 4 2450450 + 1,997 1997 997 97 7 20 1 2 9 59 28 6 2450508 + 1,997 1997 997 97 7 20 1 3 9 60 1 7 2450509 + 1,997 1997 997 97 7 20 4 12 52 364 30 3 2450813 + 1,997 1997 997 97 7 20 4 12 53 365 31 4 2450814 + 1,999 1999 999 99 9 20 4 12 53 365 31 6 2451544 + 2,000 2000 0 0 0 20 1 1 1 1 1 7 2451545 + 2,000 2000 0 0 0 20 4 12 53 366 31 1 2451910 + 2,001 2001 1 1 1 21 1 1 1 1 1 2 2451911 +(65 rows) + +SELECT to_char(d1, 'HH HH12 HH24 MI SS SSSS') + FROM TIMESTAMP_TBL; + to_char +---------------------- + + + 12 12 00 00 00 0 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 02 63122 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 12 12 00 00 00 0 + 03 03 03 04 05 11045 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 06 06 18 19 20 65960 + 08 08 08 14 01 29641 + 01 01 13 14 02 47642 + 12 12 12 14 03 44043 + 03 03 03 14 04 11644 + 02 02 02 14 05 8045 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 00 63120 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 06 06 18 32 01 66721 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 +(65 rows) + +SELECT to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') + FROM TIMESTAMP_TBL; + to_char +------------------------------------------------- + + + HH:MI:SS is 12:00:00 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:02 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 12:00:00 "text between quote marks" + HH:MI:SS is 03:04:05 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 06:19:20 "text between quote marks" + HH:MI:SS is 08:14:01 "text between quote marks" + HH:MI:SS is 01:14:02 "text between quote marks" + HH:MI:SS is 12:14:03 "text between quote marks" + HH:MI:SS is 03:14:04 "text between quote marks" + HH:MI:SS is 02:14:05 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:00 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 06:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" +(65 rows) + +SELECT to_char(d1, 'HH24--text--MI--text--SS') + FROM TIMESTAMP_TBL; + to_char +------------------------ + + + 00--text--00--text--00 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--02 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 00--text--00--text--00 + 03--text--04--text--05 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 18--text--19--text--20 + 08--text--14--text--01 + 13--text--14--text--02 + 12--text--14--text--03 + 03--text--14--text--04 + 02--text--14--text--05 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--00 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 18--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 +(65 rows) + +SELECT to_char(d1, 'YYYYTH YYYYth Jth') + FROM TIMESTAMP_TBL; + to_char +------------------------- + + + 1970TH 1970th 2440588th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450451st + 1997TH 1997th 2450451st + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450610th + 2001ST 2001st 2452175th + 2000TH 2000th 2451619th + 2000TH 2000th 2451619th + 2000TH 2000th 2451619th + 2000TH 2000th 2451619th + 2000TH 2000th 2451619th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450610th + 1997TH 1997th 2450490th + 1997TH 1997th 2450491st + 1997TH 1997th 2450492nd + 1997TH 1997th 2450493rd + 1997TH 1997th 2450494th + 1997TH 1997th 2450495th + 1997TH 1997th 2450496th + 0097TH 0097th 1686042nd + 0097TH 0097th 1756536th + 0597TH 0597th 1939157th + 1097TH 1097th 2121778th + 1697TH 1697th 2340924th + 1797TH 1797th 2377448th + 1897TH 1897th 2413972nd + 1997TH 1997th 2450496th + 2097TH 2097th 2487021st + 1996TH 1996th 2450142nd + 1996TH 1996th 2450143rd + 1996TH 1996th 2450144th + 1996TH 1996th 2450448th + 1996TH 1996th 2450449th + 1997TH 1997th 2450450th + 1997TH 1997th 2450508th + 1997TH 1997th 2450509th + 1997TH 1997th 2450813th + 1997TH 1997th 2450814th + 1999TH 1999th 2451544th + 2000TH 2000th 2451545th + 2000TH 2000th 2451910th + 2001ST 2001st 2451911th +(65 rows) + +SELECT to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. HH:MI:SS p.m. HH:MI:SS pm') + FROM TIMESTAMP_TBL; + to_char +--------------------------------------------------------------------- + + + 1970 A.D. 1970 a.d. 1970 ad 12:00:00 A.M. 12:00:00 a.m. 12:00:00 am + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:02 P.M. 05:32:02 p.m. 05:32:02 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 12:00:00 A.M. 12:00:00 a.m. 12:00:00 am + 1997 A.D. 1997 a.d. 1997 ad 03:04:05 A.M. 03:04:05 a.m. 03:04:05 am + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2001 A.D. 2001 a.d. 2001 ad 06:19:20 P.M. 06:19:20 p.m. 06:19:20 pm + 2000 A.D. 2000 a.d. 2000 ad 08:14:01 A.M. 08:14:01 a.m. 08:14:01 am + 2000 A.D. 2000 a.d. 2000 ad 01:14:02 P.M. 01:14:02 p.m. 01:14:02 pm + 2000 A.D. 2000 a.d. 2000 ad 12:14:03 P.M. 12:14:03 p.m. 12:14:03 pm + 2000 A.D. 2000 a.d. 2000 ad 03:14:04 A.M. 03:14:04 a.m. 03:14:04 am + 2000 A.D. 2000 a.d. 2000 ad 02:14:05 A.M. 02:14:05 a.m. 02:14:05 am + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:00 P.M. 05:32:00 p.m. 05:32:00 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 06:32:01 P.M. 06:32:01 p.m. 06:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 0097 B.C. 0097 b.c. 0097 bc 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 0097 A.D. 0097 a.d. 0097 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 0597 A.D. 0597 a.d. 0597 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1097 A.D. 1097 a.d. 1097 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1697 A.D. 1697 a.d. 1697 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1797 A.D. 1797 a.d. 1797 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1897 A.D. 1897 a.d. 1897 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2097 A.D. 2097 a.d. 2097 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1999 A.D. 1999 a.d. 1999 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2000 A.D. 2000 a.d. 2000 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2000 A.D. 2000 a.d. 2000 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2001 A.D. 2001 a.d. 2001 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm +(65 rows) + +SELECT to_char(d1, 'IYYY IYY IY I IW IDDD ID') + FROM TIMESTAMP_TBL; + to_char +------------------------ + + + 1970 970 70 0 01 004 4 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 01 004 4 + 1997 997 97 7 01 004 4 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 24 163 2 + 2001 001 01 1 38 265 6 + 2000 000 00 0 11 073 3 + 2000 000 00 0 11 073 3 + 2000 000 00 0 11 073 3 + 2000 000 00 0 11 073 3 + 2000 000 00 0 11 073 3 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 24 163 2 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 044 2 + 1997 997 97 7 07 045 3 + 1997 997 97 7 07 046 4 + 1997 997 97 7 07 047 5 + 1997 997 97 7 07 048 6 + 1997 997 97 7 07 049 7 + 0097 097 97 7 07 044 2 + 0097 097 97 7 07 048 6 + 0597 597 97 7 07 046 4 + 1097 097 97 7 07 044 2 + 1697 697 97 7 07 048 6 + 1797 797 97 7 07 046 4 + 1897 897 97 7 07 044 2 + 1997 997 97 7 07 049 7 + 2097 097 97 7 07 048 6 + 1996 996 96 6 09 059 3 + 1996 996 96 6 09 060 4 + 1996 996 96 6 09 061 5 + 1997 997 97 7 01 001 1 + 1997 997 97 7 01 002 2 + 1997 997 97 7 01 003 3 + 1997 997 97 7 09 061 5 + 1997 997 97 7 09 062 6 + 1998 998 98 8 01 002 2 + 1998 998 98 8 01 003 3 + 1999 999 99 9 52 362 5 + 1999 999 99 9 52 363 6 + 2000 000 00 0 52 364 7 + 2001 001 01 1 01 001 1 +(65 rows) + +SELECT to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID') + FROM TIMESTAMP_TBL; + to_char +------------------------ + + + 1970 970 70 0 1 4 4 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 1 4 4 + 1997 997 97 7 1 4 4 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 24 163 2 + 2001 1 1 1 38 265 6 + 2000 0 0 0 11 73 3 + 2000 0 0 0 11 73 3 + 2000 0 0 0 11 73 3 + 2000 0 0 0 11 73 3 + 2000 0 0 0 11 73 3 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 24 163 2 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 44 2 + 1997 997 97 7 7 45 3 + 1997 997 97 7 7 46 4 + 1997 997 97 7 7 47 5 + 1997 997 97 7 7 48 6 + 1997 997 97 7 7 49 7 + 97 97 97 7 7 44 2 + 97 97 97 7 7 48 6 + 597 597 97 7 7 46 4 + 1097 97 97 7 7 44 2 + 1697 697 97 7 7 48 6 + 1797 797 97 7 7 46 4 + 1897 897 97 7 7 44 2 + 1997 997 97 7 7 49 7 + 2097 97 97 7 7 48 6 + 1996 996 96 6 9 59 3 + 1996 996 96 6 9 60 4 + 1996 996 96 6 9 61 5 + 1997 997 97 7 1 1 1 + 1997 997 97 7 1 2 2 + 1997 997 97 7 1 3 3 + 1997 997 97 7 9 61 5 + 1997 997 97 7 9 62 6 + 1998 998 98 8 1 2 2 + 1998 998 98 8 1 3 3 + 1999 999 99 9 52 362 5 + 1999 999 99 9 52 363 6 + 2000 0 0 0 52 364 7 + 2001 1 1 1 1 1 1 +(65 rows) + +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamp), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); + to_char +-------------------------------------------------------------------- + 0 00 000 0000 00000 000000 0 00 000 0000 00000 000000 000 000000 + 7 78 780 7800 78000 780000 7 78 780 7800 78000 780000 780 780000 + 7 78 789 7890 78901 789010 7 78 789 7890 78901 789010 789 789010 + 7 78 789 7890 78901 789012 7 78 789 7890 78901 789012 789 789012 +(4 rows) + +-- Roman months, with upper and lower case. +SELECT i, + to_char(i * interval '1mon', 'rm'), + to_char(i * interval '1mon', 'RM') + FROM generate_series(-13, 13) i; + i | to_char | to_char +-----+---------+--------- + -13 | xii | XII + -12 | i | I + -11 | ii | II + -10 | iii | III + -9 | iv | IV + -8 | v | V + -7 | vi | VI + -6 | vii | VII + -5 | viii | VIII + -4 | ix | IX + -3 | x | X + -2 | xi | XI + -1 | xii | XII + 0 | | + 1 | i | I + 2 | ii | II + 3 | iii | III + 4 | iv | IV + 5 | v | V + 6 | vi | VI + 7 | vii | VII + 8 | viii | VIII + 9 | ix | IX + 10 | x | X + 11 | xi | XI + 12 | xii | XII + 13 | i | I +(27 rows) + +-- timestamp numeric fields constructor +SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887); + make_timestamp +------------------------------ + Sun Dec 28 06:30:45.887 2014 +(1 row) + +SELECT make_timestamp(-44, 3, 15, 12, 30, 15); + make_timestamp +----------------------------- + Fri Mar 15 12:30:15 0044 BC +(1 row) + +-- should fail +select make_timestamp(0, 7, 15, 12, 30, 15); +ERROR: date field value out of range: 0-07-15 +-- generate_series for timestamp +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '1 hour'::interval); + generate_series +-------------------------- + Wed Jan 01 00:00:00 2020 + Wed Jan 01 01:00:00 2020 + Wed Jan 01 02:00:00 2020 + Wed Jan 01 03:00:00 2020 + Wed Jan 01 04:00:00 2020 + Wed Jan 01 05:00:00 2020 + Wed Jan 01 06:00:00 2020 + Wed Jan 01 07:00:00 2020 + Wed Jan 01 08:00:00 2020 + Wed Jan 01 09:00:00 2020 + Wed Jan 01 10:00:00 2020 + Wed Jan 01 11:00:00 2020 + Wed Jan 01 12:00:00 2020 + Wed Jan 01 13:00:00 2020 + Wed Jan 01 14:00:00 2020 + Wed Jan 01 15:00:00 2020 + Wed Jan 01 16:00:00 2020 + Wed Jan 01 17:00:00 2020 + Wed Jan 01 18:00:00 2020 + Wed Jan 01 19:00:00 2020 + Wed Jan 01 20:00:00 2020 + Wed Jan 01 21:00:00 2020 + Wed Jan 01 22:00:00 2020 + Wed Jan 01 23:00:00 2020 + Thu Jan 02 00:00:00 2020 + Thu Jan 02 01:00:00 2020 + Thu Jan 02 02:00:00 2020 + Thu Jan 02 03:00:00 2020 +(28 rows) + +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamp, + 'infinity'::timestamp, + '1 month'::interval) limit 10; + generate_series +-------------------------- + Sat Jan 01 00:00:00 2022 + Tue Feb 01 00:00:00 2022 + Tue Mar 01 00:00:00 2022 + Fri Apr 01 00:00:00 2022 + Sun May 01 00:00:00 2022 + Wed Jun 01 00:00:00 2022 + Fri Jul 01 00:00:00 2022 + Mon Aug 01 00:00:00 2022 + Thu Sep 01 00:00:00 2022 + Sat Oct 01 00:00:00 2022 +(10 rows) + +-- errors +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '0 hour'::interval); +ERROR: step size cannot equal zero diff --git a/src/test/singlenode_regress/expected/timestamptz.out b/src/test/singlenode_regress/expected/timestamptz.out new file mode 100644 index 00000000000..a0df947e271 --- /dev/null +++ b/src/test/singlenode_regress/expected/timestamptz.out @@ -0,0 +1,2991 @@ +-- +-- TIMESTAMPTZ +-- +CREATE TABLE TIMESTAMPTZ_TBL (d1 timestamp(2) with time zone); +-- Test shorthand input values +-- We can't just "select" the results since they aren't constants; test for +-- equality instead. We can do that by running the test inside a transaction +-- block, within which the value of 'now' shouldn't change, and so these +-- related values shouldn't either. +BEGIN; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('today'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('yesterday'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow EST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow zulu'); +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'today'; + one +----- + 1 +(1 row) + +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow'; + one +----- + 1 +(1 row) + +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'yesterday'; + one +----- + 1 +(1 row) + +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow EST'; + one +----- + 1 +(1 row) + +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow zulu'; + one +----- + 1 +(1 row) + +COMMIT; +DELETE FROM TIMESTAMPTZ_TBL; +-- Verify that 'now' *does* change over a reasonable interval such as 100 msec, +-- and that it doesn't change over the same interval within a transaction block +INSERT INTO TIMESTAMPTZ_TBL VALUES ('now'); +SELECT pg_sleep(0.1); + pg_sleep +---------- + +(1 row) + +BEGIN; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('now'); +SELECT pg_sleep(0.1); + pg_sleep +---------- + +(1 row) + +INSERT INTO TIMESTAMPTZ_TBL VALUES ('now'); +SELECT pg_sleep(0.1); + pg_sleep +---------- + +(1 row) + +SELECT count(*) AS two FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp(2) with time zone 'now'; + two +----- + 2 +(1 row) + +SELECT count(d1) AS three, count(DISTINCT d1) AS two FROM TIMESTAMPTZ_TBL; + three | two +-------+----- + 3 | 2 +(1 row) + +COMMIT; +TRUNCATE TIMESTAMPTZ_TBL; +-- Special values +INSERT INTO TIMESTAMPTZ_TBL VALUES ('-infinity'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('infinity'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('epoch'); +-- Postgres v6.0 standard output format +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST'); +-- Variations on Postgres v6.1 standard output format +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.000001 1997 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.999999 1997 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.4 1997 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.5 1997 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.6 1997 PST'); +-- ISO 8601 format +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-01-02'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-01-02 03:04:05'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01-08'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01-0800'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01 -08:00'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 -0800'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-06-10 17:32:01 -07:00'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2001-09-22T18:19:20'); +-- POSIX format (note that the timezone abbrev is just decoration here) +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 08:14:01 GMT+8'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 13:14:02 GMT-1'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 12:14:03 GMT-2'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 03:14:04 PST+8'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 02:14:05 MST+7:00'); +-- Variations for acceptable input formats +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997 -0800'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 5:32PM 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997/02/10 17:32:01-0800'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb-10-1997 17:32:01 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('02-10-1997 17:32:01 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 PST'); +set datestyle to ymd; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('97FEB10 5:32:01PM UTC'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('97/02/10 17:32:01 UTC'); +reset datestyle; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997.041 17:32:01 UTC'); +-- timestamps at different timezones +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 America/New_York'); +SELECT '19970210 173201' AT TIME ZONE 'America/New_York'; + timezone +-------------------------- + Mon Feb 10 20:32:01 1997 +(1 row) + +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970710 173201 America/New_York'); +SELECT '19970710 173201' AT TIME ZONE 'America/New_York'; + timezone +-------------------------- + Thu Jul 10 20:32:01 1997 +(1 row) + +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970710 173201 America/Does_not_exist'); +ERROR: time zone "america/does_not_exist" not recognized +LINE 1: INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970710 173201 America... + ^ +SELECT '19970710 173201' AT TIME ZONE 'America/Does_not_exist'; +ERROR: time zone "America/Does_not_exist" not recognized +-- Daylight saving time for timestamps beyond 32-bit time_t range. +SELECT '20500710 173201 Europe/Helsinki'::timestamptz; -- DST + timestamptz +------------------------------ + Sun Jul 10 07:32:01 2050 PDT +(1 row) + +SELECT '20500110 173201 Europe/Helsinki'::timestamptz; -- non-DST + timestamptz +------------------------------ + Mon Jan 10 07:32:01 2050 PST +(1 row) + +SELECT '205000-07-10 17:32:01 Europe/Helsinki'::timestamptz; -- DST + timestamptz +-------------------------------- + Thu Jul 10 07:32:01 205000 PDT +(1 row) + +SELECT '205000-01-10 17:32:01 Europe/Helsinki'::timestamptz; -- non-DST + timestamptz +-------------------------------- + Fri Jan 10 07:32:01 205000 PST +(1 row) + +-- Check date conversion and date arithmetic +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-06-10 18:32:01 PDT'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 11 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 12 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 13 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 14 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 15 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0097 BC'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0097'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0597'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1097'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1697'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1797'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1897'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 2097'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 28 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 29 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mar 01 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 30 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 28 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 29 17:32:01 1997'); +ERROR: date/time field value out of range: "Feb 29 17:32:01 1997" +LINE 1: INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 29 17:32:01 1997'); + ^ +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mar 01 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 30 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1999'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2000'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 2000'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2001'); +-- Currently unsupported syntax and ranges +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 -0097'); +ERROR: time zone displacement out of range: "Feb 16 17:32:01 -0097" +LINE 1: INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 -0097')... + ^ +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 5097 BC'); +ERROR: timestamp out of range: "Feb 16 17:32:01 5097 BC" +LINE 1: INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 5097 BC... + ^ +-- Alternative field order that we've historically supported (sort of) +-- with regular and POSIXy timezone specs +SELECT 'Wed Jul 11 10:51:14 America/New_York 2001'::timestamptz; + timestamptz +------------------------------ + Wed Jul 11 07:51:14 2001 PDT +(1 row) + +SELECT 'Wed Jul 11 10:51:14 GMT-4 2001'::timestamptz; + timestamptz +------------------------------ + Tue Jul 10 23:51:14 2001 PDT +(1 row) + +SELECT 'Wed Jul 11 10:51:14 GMT+4 2001'::timestamptz; + timestamptz +------------------------------ + Wed Jul 11 07:51:14 2001 PDT +(1 row) + +SELECT 'Wed Jul 11 10:51:14 PST-03:00 2001'::timestamptz; + timestamptz +------------------------------ + Wed Jul 11 00:51:14 2001 PDT +(1 row) + +SELECT 'Wed Jul 11 10:51:14 PST+03:00 2001'::timestamptz; + timestamptz +------------------------------ + Wed Jul 11 06:51:14 2001 PDT +(1 row) + +SELECT d1 FROM TIMESTAMPTZ_TBL; + d1 +--------------------------------- + -infinity + infinity + Wed Dec 31 16:00:00 1969 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:02 1997 PST + Mon Feb 10 17:32:01.4 1997 PST + Mon Feb 10 17:32:01.5 1997 PST + Mon Feb 10 17:32:01.6 1997 PST + Thu Jan 02 00:00:00 1997 PST + Thu Jan 02 03:04:05 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Tue Jun 10 17:32:01 1997 PDT + Sat Sep 22 18:19:20 2001 PDT + Wed Mar 15 08:14:01 2000 PST + Wed Mar 15 04:14:02 2000 PST + Wed Mar 15 02:14:03 2000 PST + Wed Mar 15 03:14:04 2000 PST + Wed Mar 15 01:14:05 2000 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:00 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 14:32:01 1997 PST + Thu Jul 10 14:32:01 1997 PDT + Tue Jun 10 18:32:01 1997 PDT + Mon Feb 10 17:32:01 1997 PST + Tue Feb 11 17:32:01 1997 PST + Wed Feb 12 17:32:01 1997 PST + Thu Feb 13 17:32:01 1997 PST + Fri Feb 14 17:32:01 1997 PST + Sat Feb 15 17:32:01 1997 PST + Sun Feb 16 17:32:01 1997 PST + Tue Feb 16 17:32:01 0097 PST BC + Sat Feb 16 17:32:01 0097 PST + Thu Feb 16 17:32:01 0597 PST + Tue Feb 16 17:32:01 1097 PST + Sat Feb 16 17:32:01 1697 PST + Thu Feb 16 17:32:01 1797 PST + Tue Feb 16 17:32:01 1897 PST + Sun Feb 16 17:32:01 1997 PST + Sat Feb 16 17:32:01 2097 PST + Wed Feb 28 17:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST + Mon Dec 30 17:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST + Wed Jan 01 17:32:01 1997 PST + Fri Feb 28 17:32:01 1997 PST + Sat Mar 01 17:32:01 1997 PST + Tue Dec 30 17:32:01 1997 PST + Wed Dec 31 17:32:01 1997 PST + Fri Dec 31 17:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST + Sun Dec 31 17:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST +(66 rows) + +-- Check behavior at the boundaries of the timestamp range +SELECT '4714-11-24 00:00:00+00 BC'::timestamptz; + timestamptz +--------------------------------- + Sun Nov 23 16:00:00 4714 PST BC +(1 row) + +SELECT '4714-11-23 16:00:00-08 BC'::timestamptz; + timestamptz +--------------------------------- + Sun Nov 23 16:00:00 4714 PST BC +(1 row) + +SELECT 'Sun Nov 23 16:00:00 4714 PST BC'::timestamptz; + timestamptz +--------------------------------- + Sun Nov 23 16:00:00 4714 PST BC +(1 row) + +SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range +ERROR: timestamp out of range: "4714-11-23 23:59:59+00 BC" +LINE 1: SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; + ^ +SELECT '294276-12-31 23:59:59+00'::timestamptz; + timestamptz +-------------------------------- + Sun Dec 31 15:59:59 294276 PST +(1 row) + +SELECT '294276-12-31 15:59:59-08'::timestamptz; + timestamptz +-------------------------------- + Sun Dec 31 15:59:59 294276 PST +(1 row) + +SELECT '294277-01-01 00:00:00+00'::timestamptz; -- out of range +ERROR: timestamp out of range: "294277-01-01 00:00:00+00" +LINE 1: SELECT '294277-01-01 00:00:00+00'::timestamptz; + ^ +SELECT '294277-12-31 16:00:00-08'::timestamptz; -- out of range +ERROR: timestamp out of range: "294277-12-31 16:00:00-08" +LINE 1: SELECT '294277-12-31 16:00:00-08'::timestamptz; + ^ +-- Demonstrate functions and operators +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 > timestamp with time zone '1997-01-02'; + d1 +-------------------------------- + infinity + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:02 1997 PST + Mon Feb 10 17:32:01.4 1997 PST + Mon Feb 10 17:32:01.5 1997 PST + Mon Feb 10 17:32:01.6 1997 PST + Thu Jan 02 03:04:05 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Tue Jun 10 17:32:01 1997 PDT + Sat Sep 22 18:19:20 2001 PDT + Wed Mar 15 08:14:01 2000 PST + Wed Mar 15 04:14:02 2000 PST + Wed Mar 15 02:14:03 2000 PST + Wed Mar 15 03:14:04 2000 PST + Wed Mar 15 01:14:05 2000 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:00 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 14:32:01 1997 PST + Thu Jul 10 14:32:01 1997 PDT + Tue Jun 10 18:32:01 1997 PDT + Mon Feb 10 17:32:01 1997 PST + Tue Feb 11 17:32:01 1997 PST + Wed Feb 12 17:32:01 1997 PST + Thu Feb 13 17:32:01 1997 PST + Fri Feb 14 17:32:01 1997 PST + Sat Feb 15 17:32:01 1997 PST + Sun Feb 16 17:32:01 1997 PST + Sun Feb 16 17:32:01 1997 PST + Sat Feb 16 17:32:01 2097 PST + Fri Feb 28 17:32:01 1997 PST + Sat Mar 01 17:32:01 1997 PST + Tue Dec 30 17:32:01 1997 PST + Wed Dec 31 17:32:01 1997 PST + Fri Dec 31 17:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST + Sun Dec 31 17:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST +(50 rows) + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 < timestamp with time zone '1997-01-02'; + d1 +--------------------------------- + -infinity + Wed Dec 31 16:00:00 1969 PST + Tue Feb 16 17:32:01 0097 PST BC + Sat Feb 16 17:32:01 0097 PST + Thu Feb 16 17:32:01 0597 PST + Tue Feb 16 17:32:01 1097 PST + Sat Feb 16 17:32:01 1697 PST + Thu Feb 16 17:32:01 1797 PST + Tue Feb 16 17:32:01 1897 PST + Wed Feb 28 17:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST + Mon Dec 30 17:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST + Wed Jan 01 17:32:01 1997 PST +(15 rows) + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 = timestamp with time zone '1997-01-02'; + d1 +------------------------------ + Thu Jan 02 00:00:00 1997 PST +(1 row) + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 != timestamp with time zone '1997-01-02'; + d1 +--------------------------------- + -infinity + infinity + Wed Dec 31 16:00:00 1969 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:02 1997 PST + Mon Feb 10 17:32:01.4 1997 PST + Mon Feb 10 17:32:01.5 1997 PST + Mon Feb 10 17:32:01.6 1997 PST + Thu Jan 02 03:04:05 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Tue Jun 10 17:32:01 1997 PDT + Sat Sep 22 18:19:20 2001 PDT + Wed Mar 15 08:14:01 2000 PST + Wed Mar 15 04:14:02 2000 PST + Wed Mar 15 02:14:03 2000 PST + Wed Mar 15 03:14:04 2000 PST + Wed Mar 15 01:14:05 2000 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:00 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 14:32:01 1997 PST + Thu Jul 10 14:32:01 1997 PDT + Tue Jun 10 18:32:01 1997 PDT + Mon Feb 10 17:32:01 1997 PST + Tue Feb 11 17:32:01 1997 PST + Wed Feb 12 17:32:01 1997 PST + Thu Feb 13 17:32:01 1997 PST + Fri Feb 14 17:32:01 1997 PST + Sat Feb 15 17:32:01 1997 PST + Sun Feb 16 17:32:01 1997 PST + Tue Feb 16 17:32:01 0097 PST BC + Sat Feb 16 17:32:01 0097 PST + Thu Feb 16 17:32:01 0597 PST + Tue Feb 16 17:32:01 1097 PST + Sat Feb 16 17:32:01 1697 PST + Thu Feb 16 17:32:01 1797 PST + Tue Feb 16 17:32:01 1897 PST + Sun Feb 16 17:32:01 1997 PST + Sat Feb 16 17:32:01 2097 PST + Wed Feb 28 17:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST + Mon Dec 30 17:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST + Wed Jan 01 17:32:01 1997 PST + Fri Feb 28 17:32:01 1997 PST + Sat Mar 01 17:32:01 1997 PST + Tue Dec 30 17:32:01 1997 PST + Wed Dec 31 17:32:01 1997 PST + Fri Dec 31 17:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST + Sun Dec 31 17:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST +(65 rows) + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 <= timestamp with time zone '1997-01-02'; + d1 +--------------------------------- + -infinity + Wed Dec 31 16:00:00 1969 PST + Thu Jan 02 00:00:00 1997 PST + Tue Feb 16 17:32:01 0097 PST BC + Sat Feb 16 17:32:01 0097 PST + Thu Feb 16 17:32:01 0597 PST + Tue Feb 16 17:32:01 1097 PST + Sat Feb 16 17:32:01 1697 PST + Thu Feb 16 17:32:01 1797 PST + Tue Feb 16 17:32:01 1897 PST + Wed Feb 28 17:32:01 1996 PST + Thu Feb 29 17:32:01 1996 PST + Fri Mar 01 17:32:01 1996 PST + Mon Dec 30 17:32:01 1996 PST + Tue Dec 31 17:32:01 1996 PST + Wed Jan 01 17:32:01 1997 PST +(16 rows) + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 >= timestamp with time zone '1997-01-02'; + d1 +-------------------------------- + infinity + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:02 1997 PST + Mon Feb 10 17:32:01.4 1997 PST + Mon Feb 10 17:32:01.5 1997 PST + Mon Feb 10 17:32:01.6 1997 PST + Thu Jan 02 00:00:00 1997 PST + Thu Jan 02 03:04:05 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Tue Jun 10 17:32:01 1997 PDT + Sat Sep 22 18:19:20 2001 PDT + Wed Mar 15 08:14:01 2000 PST + Wed Mar 15 04:14:02 2000 PST + Wed Mar 15 02:14:03 2000 PST + Wed Mar 15 03:14:04 2000 PST + Wed Mar 15 01:14:05 2000 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:00 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 17:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 09:32:01 1997 PST + Mon Feb 10 14:32:01 1997 PST + Thu Jul 10 14:32:01 1997 PDT + Tue Jun 10 18:32:01 1997 PDT + Mon Feb 10 17:32:01 1997 PST + Tue Feb 11 17:32:01 1997 PST + Wed Feb 12 17:32:01 1997 PST + Thu Feb 13 17:32:01 1997 PST + Fri Feb 14 17:32:01 1997 PST + Sat Feb 15 17:32:01 1997 PST + Sun Feb 16 17:32:01 1997 PST + Sun Feb 16 17:32:01 1997 PST + Sat Feb 16 17:32:01 2097 PST + Fri Feb 28 17:32:01 1997 PST + Sat Mar 01 17:32:01 1997 PST + Tue Dec 30 17:32:01 1997 PST + Wed Dec 31 17:32:01 1997 PST + Fri Dec 31 17:32:01 1999 PST + Sat Jan 01 17:32:01 2000 PST + Sun Dec 31 17:32:01 2000 PST + Mon Jan 01 17:32:01 2001 PST +(51 rows) + +SELECT d1 - timestamp with time zone '1997-01-02' AS diff + FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; + diff +---------------------------------------- + @ 9863 days 8 hours ago + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 2 secs + @ 39 days 17 hours 32 mins 1.4 secs + @ 39 days 17 hours 32 mins 1.5 secs + @ 39 days 17 hours 32 mins 1.6 secs + @ 0 + @ 3 hours 4 mins 5 secs + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 159 days 16 hours 32 mins 1 sec + @ 1724 days 17 hours 19 mins 20 secs + @ 1168 days 8 hours 14 mins 1 sec + @ 1168 days 4 hours 14 mins 2 secs + @ 1168 days 2 hours 14 mins 3 secs + @ 1168 days 3 hours 14 mins 4 secs + @ 1168 days 1 hour 14 mins 5 secs + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 9 hours 32 mins 1 sec + @ 39 days 9 hours 32 mins 1 sec + @ 39 days 9 hours 32 mins 1 sec + @ 39 days 14 hours 32 mins 1 sec + @ 189 days 13 hours 32 mins 1 sec + @ 159 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 40 days 17 hours 32 mins 1 sec + @ 41 days 17 hours 32 mins 1 sec + @ 42 days 17 hours 32 mins 1 sec + @ 43 days 17 hours 32 mins 1 sec + @ 44 days 17 hours 32 mins 1 sec + @ 45 days 17 hours 32 mins 1 sec + @ 45 days 17 hours 32 mins 1 sec + @ 308 days 6 hours 27 mins 59 secs ago + @ 307 days 6 hours 27 mins 59 secs ago + @ 306 days 6 hours 27 mins 59 secs ago + @ 2 days 6 hours 27 mins 59 secs ago + @ 1 day 6 hours 27 mins 59 secs ago + @ 6 hours 27 mins 59 secs ago + @ 57 days 17 hours 32 mins 1 sec + @ 58 days 17 hours 32 mins 1 sec + @ 362 days 17 hours 32 mins 1 sec + @ 363 days 17 hours 32 mins 1 sec + @ 1093 days 17 hours 32 mins 1 sec + @ 1094 days 17 hours 32 mins 1 sec + @ 1459 days 17 hours 32 mins 1 sec + @ 1460 days 17 hours 32 mins 1 sec +(56 rows) + +SELECT date_trunc( 'week', timestamp with time zone '2004-02-29 15:44:17.71393' ) AS week_trunc; + week_trunc +------------------------------ + Mon Feb 23 00:00:00 2004 PST +(1 row) + +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'Australia/Sydney') as sydney_trunc; -- zone name + sydney_trunc +------------------------------ + Fri Feb 16 05:00:00 2001 PST +(1 row) + +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'GMT') as gmt_trunc; -- fixed-offset abbreviation + gmt_trunc +------------------------------ + Thu Feb 15 16:00:00 2001 PST +(1 row) + +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'VET') as vet_trunc; -- variable-offset abbreviation + vet_trunc +------------------------------ + Thu Feb 15 20:00:00 2001 PST +(1 row) + +-- verify date_bin behaves the same as date_trunc for relevant intervals +SELECT + str, + interval, + date_trunc(str, ts, 'Australia/Sydney') = date_bin(interval::interval, ts, timestamp with time zone '2001-01-01+11') AS equal +FROM ( + VALUES + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamptz '2020-02-29 15:44:17.71393+00')) ts (ts); + str | interval | equal +-------------+----------+------- + day | 1 d | t + hour | 1 h | t + minute | 1 m | t + second | 1 s | t + millisecond | 1 ms | t + microsecond | 1 us | t +(6 rows) + +-- bin timestamps into arbitrary intervals +SELECT + interval, + ts, + origin, + date_bin(interval::interval, ts, origin) +FROM ( + VALUES + ('15 days'), + ('2 hours'), + ('1 hour 30 minutes'), + ('15 minutes'), + ('10 seconds'), + ('100 milliseconds'), + ('250 microseconds') +) intervals (interval), +(VALUES (timestamptz '2020-02-11 15:44:17.71393')) ts (ts), +(VALUES (timestamptz '2001-01-01')) origin (origin); + interval | ts | origin | date_bin +-------------------+------------------------------------+------------------------------+------------------------------------ + 15 days | Tue Feb 11 15:44:17.71393 2020 PST | Mon Jan 01 00:00:00 2001 PST | Thu Feb 06 00:00:00 2020 PST + 2 hours | Tue Feb 11 15:44:17.71393 2020 PST | Mon Jan 01 00:00:00 2001 PST | Tue Feb 11 14:00:00 2020 PST + 1 hour 30 minutes | Tue Feb 11 15:44:17.71393 2020 PST | Mon Jan 01 00:00:00 2001 PST | Tue Feb 11 15:00:00 2020 PST + 15 minutes | Tue Feb 11 15:44:17.71393 2020 PST | Mon Jan 01 00:00:00 2001 PST | Tue Feb 11 15:30:00 2020 PST + 10 seconds | Tue Feb 11 15:44:17.71393 2020 PST | Mon Jan 01 00:00:00 2001 PST | Tue Feb 11 15:44:10 2020 PST + 100 milliseconds | Tue Feb 11 15:44:17.71393 2020 PST | Mon Jan 01 00:00:00 2001 PST | Tue Feb 11 15:44:17.7 2020 PST + 250 microseconds | Tue Feb 11 15:44:17.71393 2020 PST | Mon Jan 01 00:00:00 2001 PST | Tue Feb 11 15:44:17.71375 2020 PST +(7 rows) + +-- shift bins using the origin parameter: +SELECT date_bin('5 min'::interval, timestamptz '2020-02-01 01:01:01+00', timestamptz '2020-02-01 00:02:30+00'); + date_bin +------------------------------ + Fri Jan 31 16:57:30 2020 PST +(1 row) + +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +ERROR: timestamps cannot be binned into intervals containing months or years +SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +ERROR: timestamps cannot be binned into intervals containing months or years +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +ERROR: stride must be greater than zero +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +ERROR: stride must be greater than zero +-- Test casting within a BETWEEN qualifier +SELECT d1 - timestamp with time zone '1997-01-02' AS diff + FROM TIMESTAMPTZ_TBL + WHERE d1 BETWEEN timestamp with time zone '1902-01-01' AND timestamp with time zone '2038-01-01'; + diff +---------------------------------------- + @ 9863 days 8 hours ago + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 2 secs + @ 39 days 17 hours 32 mins 1.4 secs + @ 39 days 17 hours 32 mins 1.5 secs + @ 39 days 17 hours 32 mins 1.6 secs + @ 0 + @ 3 hours 4 mins 5 secs + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 159 days 16 hours 32 mins 1 sec + @ 1724 days 17 hours 19 mins 20 secs + @ 1168 days 8 hours 14 mins 1 sec + @ 1168 days 4 hours 14 mins 2 secs + @ 1168 days 2 hours 14 mins 3 secs + @ 1168 days 3 hours 14 mins 4 secs + @ 1168 days 1 hour 14 mins 5 secs + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 39 days 9 hours 32 mins 1 sec + @ 39 days 9 hours 32 mins 1 sec + @ 39 days 9 hours 32 mins 1 sec + @ 39 days 14 hours 32 mins 1 sec + @ 189 days 13 hours 32 mins 1 sec + @ 159 days 17 hours 32 mins 1 sec + @ 39 days 17 hours 32 mins 1 sec + @ 40 days 17 hours 32 mins 1 sec + @ 41 days 17 hours 32 mins 1 sec + @ 42 days 17 hours 32 mins 1 sec + @ 43 days 17 hours 32 mins 1 sec + @ 44 days 17 hours 32 mins 1 sec + @ 45 days 17 hours 32 mins 1 sec + @ 45 days 17 hours 32 mins 1 sec + @ 308 days 6 hours 27 mins 59 secs ago + @ 307 days 6 hours 27 mins 59 secs ago + @ 306 days 6 hours 27 mins 59 secs ago + @ 2 days 6 hours 27 mins 59 secs ago + @ 1 day 6 hours 27 mins 59 secs ago + @ 6 hours 27 mins 59 secs ago + @ 57 days 17 hours 32 mins 1 sec + @ 58 days 17 hours 32 mins 1 sec + @ 362 days 17 hours 32 mins 1 sec + @ 363 days 17 hours 32 mins 1 sec + @ 1093 days 17 hours 32 mins 1 sec + @ 1094 days 17 hours 32 mins 1 sec + @ 1459 days 17 hours 32 mins 1 sec + @ 1460 days 17 hours 32 mins 1 sec +(56 rows) + +-- DATE_PART (timestamptz_part) +SELECT d1 as timestamptz, + date_part( 'year', d1) AS year, date_part( 'month', d1) AS month, + date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, + date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second + FROM TIMESTAMPTZ_TBL; + timestamptz | year | month | day | hour | minute | second +---------------------------------+-----------+-------+-----+------+--------+-------- + -infinity | -Infinity | | | | | + infinity | Infinity | | | | | + Wed Dec 31 16:00:00 1969 PST | 1969 | 12 | 31 | 16 | 0 | 0 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:02 1997 PST | 1997 | 2 | 10 | 17 | 32 | 2 + Mon Feb 10 17:32:01.4 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.4 + Mon Feb 10 17:32:01.5 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.5 + Mon Feb 10 17:32:01.6 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.6 + Thu Jan 02 00:00:00 1997 PST | 1997 | 1 | 2 | 0 | 0 | 0 + Thu Jan 02 03:04:05 1997 PST | 1997 | 1 | 2 | 3 | 4 | 5 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Tue Jun 10 17:32:01 1997 PDT | 1997 | 6 | 10 | 17 | 32 | 1 + Sat Sep 22 18:19:20 2001 PDT | 2001 | 9 | 22 | 18 | 19 | 20 + Wed Mar 15 08:14:01 2000 PST | 2000 | 3 | 15 | 8 | 14 | 1 + Wed Mar 15 04:14:02 2000 PST | 2000 | 3 | 15 | 4 | 14 | 2 + Wed Mar 15 02:14:03 2000 PST | 2000 | 3 | 15 | 2 | 14 | 3 + Wed Mar 15 03:14:04 2000 PST | 2000 | 3 | 15 | 3 | 14 | 4 + Wed Mar 15 01:14:05 2000 PST | 2000 | 3 | 15 | 1 | 14 | 5 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:00 1997 PST | 1997 | 2 | 10 | 17 | 32 | 0 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1 + Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1 + Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1 + Mon Feb 10 14:32:01 1997 PST | 1997 | 2 | 10 | 14 | 32 | 1 + Thu Jul 10 14:32:01 1997 PDT | 1997 | 7 | 10 | 14 | 32 | 1 + Tue Jun 10 18:32:01 1997 PDT | 1997 | 6 | 10 | 18 | 32 | 1 + Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 + Tue Feb 11 17:32:01 1997 PST | 1997 | 2 | 11 | 17 | 32 | 1 + Wed Feb 12 17:32:01 1997 PST | 1997 | 2 | 12 | 17 | 32 | 1 + Thu Feb 13 17:32:01 1997 PST | 1997 | 2 | 13 | 17 | 32 | 1 + Fri Feb 14 17:32:01 1997 PST | 1997 | 2 | 14 | 17 | 32 | 1 + Sat Feb 15 17:32:01 1997 PST | 1997 | 2 | 15 | 17 | 32 | 1 + Sun Feb 16 17:32:01 1997 PST | 1997 | 2 | 16 | 17 | 32 | 1 + Tue Feb 16 17:32:01 0097 PST BC | -97 | 2 | 16 | 17 | 32 | 1 + Sat Feb 16 17:32:01 0097 PST | 97 | 2 | 16 | 17 | 32 | 1 + Thu Feb 16 17:32:01 0597 PST | 597 | 2 | 16 | 17 | 32 | 1 + Tue Feb 16 17:32:01 1097 PST | 1097 | 2 | 16 | 17 | 32 | 1 + Sat Feb 16 17:32:01 1697 PST | 1697 | 2 | 16 | 17 | 32 | 1 + Thu Feb 16 17:32:01 1797 PST | 1797 | 2 | 16 | 17 | 32 | 1 + Tue Feb 16 17:32:01 1897 PST | 1897 | 2 | 16 | 17 | 32 | 1 + Sun Feb 16 17:32:01 1997 PST | 1997 | 2 | 16 | 17 | 32 | 1 + Sat Feb 16 17:32:01 2097 PST | 2097 | 2 | 16 | 17 | 32 | 1 + Wed Feb 28 17:32:01 1996 PST | 1996 | 2 | 28 | 17 | 32 | 1 + Thu Feb 29 17:32:01 1996 PST | 1996 | 2 | 29 | 17 | 32 | 1 + Fri Mar 01 17:32:01 1996 PST | 1996 | 3 | 1 | 17 | 32 | 1 + Mon Dec 30 17:32:01 1996 PST | 1996 | 12 | 30 | 17 | 32 | 1 + Tue Dec 31 17:32:01 1996 PST | 1996 | 12 | 31 | 17 | 32 | 1 + Wed Jan 01 17:32:01 1997 PST | 1997 | 1 | 1 | 17 | 32 | 1 + Fri Feb 28 17:32:01 1997 PST | 1997 | 2 | 28 | 17 | 32 | 1 + Sat Mar 01 17:32:01 1997 PST | 1997 | 3 | 1 | 17 | 32 | 1 + Tue Dec 30 17:32:01 1997 PST | 1997 | 12 | 30 | 17 | 32 | 1 + Wed Dec 31 17:32:01 1997 PST | 1997 | 12 | 31 | 17 | 32 | 1 + Fri Dec 31 17:32:01 1999 PST | 1999 | 12 | 31 | 17 | 32 | 1 + Sat Jan 01 17:32:01 2000 PST | 2000 | 1 | 1 | 17 | 32 | 1 + Sun Dec 31 17:32:01 2000 PST | 2000 | 12 | 31 | 17 | 32 | 1 + Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1 | 17 | 32 | 1 +(66 rows) + +SELECT d1 as timestamptz, + date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, + date_part( 'usec', d1) AS usec + FROM TIMESTAMPTZ_TBL; + timestamptz | quarter | msec | usec +---------------------------------+---------+-------+---------- + -infinity | | | + infinity | | | + Wed Dec 31 16:00:00 1969 PST | 4 | 0 | 0 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:02 1997 PST | 1 | 2000 | 2000000 + Mon Feb 10 17:32:01.4 1997 PST | 1 | 1400 | 1400000 + Mon Feb 10 17:32:01.5 1997 PST | 1 | 1500 | 1500000 + Mon Feb 10 17:32:01.6 1997 PST | 1 | 1600 | 1600000 + Thu Jan 02 00:00:00 1997 PST | 1 | 0 | 0 + Thu Jan 02 03:04:05 1997 PST | 1 | 5000 | 5000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Tue Jun 10 17:32:01 1997 PDT | 2 | 1000 | 1000000 + Sat Sep 22 18:19:20 2001 PDT | 3 | 20000 | 20000000 + Wed Mar 15 08:14:01 2000 PST | 1 | 1000 | 1000000 + Wed Mar 15 04:14:02 2000 PST | 1 | 2000 | 2000000 + Wed Mar 15 02:14:03 2000 PST | 1 | 3000 | 3000000 + Wed Mar 15 03:14:04 2000 PST | 1 | 4000 | 4000000 + Wed Mar 15 01:14:05 2000 PST | 1 | 5000 | 5000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:00 1997 PST | 1 | 0 | 0 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000 + Mon Feb 10 14:32:01 1997 PST | 1 | 1000 | 1000000 + Thu Jul 10 14:32:01 1997 PDT | 3 | 1000 | 1000000 + Tue Jun 10 18:32:01 1997 PDT | 2 | 1000 | 1000000 + Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 + Tue Feb 11 17:32:01 1997 PST | 1 | 1000 | 1000000 + Wed Feb 12 17:32:01 1997 PST | 1 | 1000 | 1000000 + Thu Feb 13 17:32:01 1997 PST | 1 | 1000 | 1000000 + Fri Feb 14 17:32:01 1997 PST | 1 | 1000 | 1000000 + Sat Feb 15 17:32:01 1997 PST | 1 | 1000 | 1000000 + Sun Feb 16 17:32:01 1997 PST | 1 | 1000 | 1000000 + Tue Feb 16 17:32:01 0097 PST BC | 1 | 1000 | 1000000 + Sat Feb 16 17:32:01 0097 PST | 1 | 1000 | 1000000 + Thu Feb 16 17:32:01 0597 PST | 1 | 1000 | 1000000 + Tue Feb 16 17:32:01 1097 PST | 1 | 1000 | 1000000 + Sat Feb 16 17:32:01 1697 PST | 1 | 1000 | 1000000 + Thu Feb 16 17:32:01 1797 PST | 1 | 1000 | 1000000 + Tue Feb 16 17:32:01 1897 PST | 1 | 1000 | 1000000 + Sun Feb 16 17:32:01 1997 PST | 1 | 1000 | 1000000 + Sat Feb 16 17:32:01 2097 PST | 1 | 1000 | 1000000 + Wed Feb 28 17:32:01 1996 PST | 1 | 1000 | 1000000 + Thu Feb 29 17:32:01 1996 PST | 1 | 1000 | 1000000 + Fri Mar 01 17:32:01 1996 PST | 1 | 1000 | 1000000 + Mon Dec 30 17:32:01 1996 PST | 4 | 1000 | 1000000 + Tue Dec 31 17:32:01 1996 PST | 4 | 1000 | 1000000 + Wed Jan 01 17:32:01 1997 PST | 1 | 1000 | 1000000 + Fri Feb 28 17:32:01 1997 PST | 1 | 1000 | 1000000 + Sat Mar 01 17:32:01 1997 PST | 1 | 1000 | 1000000 + Tue Dec 30 17:32:01 1997 PST | 4 | 1000 | 1000000 + Wed Dec 31 17:32:01 1997 PST | 4 | 1000 | 1000000 + Fri Dec 31 17:32:01 1999 PST | 4 | 1000 | 1000000 + Sat Jan 01 17:32:01 2000 PST | 1 | 1000 | 1000000 + Sun Dec 31 17:32:01 2000 PST | 4 | 1000 | 1000000 + Mon Jan 01 17:32:01 2001 PST | 1 | 1000 | 1000000 +(66 rows) + +SELECT d1 as timestamptz, + date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, + date_part( 'isodow', d1) AS isodow, date_part( 'dow', d1) AS dow, + date_part( 'doy', d1) AS doy + FROM TIMESTAMPTZ_TBL; + timestamptz | isoyear | week | isodow | dow | doy +---------------------------------+-----------+------+--------+-----+----- + -infinity | -Infinity | | | | + infinity | Infinity | | | | + Wed Dec 31 16:00:00 1969 PST | 1970 | 1 | 3 | 3 | 365 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:02 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01.4 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01.5 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01.6 1997 PST | 1997 | 7 | 1 | 1 | 41 + Thu Jan 02 00:00:00 1997 PST | 1997 | 1 | 4 | 4 | 2 + Thu Jan 02 03:04:05 1997 PST | 1997 | 1 | 4 | 4 | 2 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Tue Jun 10 17:32:01 1997 PDT | 1997 | 24 | 2 | 2 | 161 + Sat Sep 22 18:19:20 2001 PDT | 2001 | 38 | 6 | 6 | 265 + Wed Mar 15 08:14:01 2000 PST | 2000 | 11 | 3 | 3 | 75 + Wed Mar 15 04:14:02 2000 PST | 2000 | 11 | 3 | 3 | 75 + Wed Mar 15 02:14:03 2000 PST | 2000 | 11 | 3 | 3 | 75 + Wed Mar 15 03:14:04 2000 PST | 2000 | 11 | 3 | 3 | 75 + Wed Mar 15 01:14:05 2000 PST | 2000 | 11 | 3 | 3 | 75 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:00 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Mon Feb 10 14:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Thu Jul 10 14:32:01 1997 PDT | 1997 | 28 | 4 | 4 | 191 + Tue Jun 10 18:32:01 1997 PDT | 1997 | 24 | 2 | 2 | 161 + Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | 1 | 41 + Tue Feb 11 17:32:01 1997 PST | 1997 | 7 | 2 | 2 | 42 + Wed Feb 12 17:32:01 1997 PST | 1997 | 7 | 3 | 3 | 43 + Thu Feb 13 17:32:01 1997 PST | 1997 | 7 | 4 | 4 | 44 + Fri Feb 14 17:32:01 1997 PST | 1997 | 7 | 5 | 5 | 45 + Sat Feb 15 17:32:01 1997 PST | 1997 | 7 | 6 | 6 | 46 + Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 7 | 0 | 47 + Tue Feb 16 17:32:01 0097 PST BC | -97 | 7 | 2 | 2 | 47 + Sat Feb 16 17:32:01 0097 PST | 97 | 7 | 6 | 6 | 47 + Thu Feb 16 17:32:01 0597 PST | 597 | 7 | 4 | 4 | 47 + Tue Feb 16 17:32:01 1097 PST | 1097 | 7 | 2 | 2 | 47 + Sat Feb 16 17:32:01 1697 PST | 1697 | 7 | 6 | 6 | 47 + Thu Feb 16 17:32:01 1797 PST | 1797 | 7 | 4 | 4 | 47 + Tue Feb 16 17:32:01 1897 PST | 1897 | 7 | 2 | 2 | 47 + Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 7 | 0 | 47 + Sat Feb 16 17:32:01 2097 PST | 2097 | 7 | 6 | 6 | 47 + Wed Feb 28 17:32:01 1996 PST | 1996 | 9 | 3 | 3 | 59 + Thu Feb 29 17:32:01 1996 PST | 1996 | 9 | 4 | 4 | 60 + Fri Mar 01 17:32:01 1996 PST | 1996 | 9 | 5 | 5 | 61 + Mon Dec 30 17:32:01 1996 PST | 1997 | 1 | 1 | 1 | 365 + Tue Dec 31 17:32:01 1996 PST | 1997 | 1 | 2 | 2 | 366 + Wed Jan 01 17:32:01 1997 PST | 1997 | 1 | 3 | 3 | 1 + Fri Feb 28 17:32:01 1997 PST | 1997 | 9 | 5 | 5 | 59 + Sat Mar 01 17:32:01 1997 PST | 1997 | 9 | 6 | 6 | 60 + Tue Dec 30 17:32:01 1997 PST | 1998 | 1 | 2 | 2 | 364 + Wed Dec 31 17:32:01 1997 PST | 1998 | 1 | 3 | 3 | 365 + Fri Dec 31 17:32:01 1999 PST | 1999 | 52 | 5 | 5 | 365 + Sat Jan 01 17:32:01 2000 PST | 1999 | 52 | 6 | 6 | 1 + Sun Dec 31 17:32:01 2000 PST | 2000 | 52 | 7 | 0 | 366 + Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1 | 1 | 1 +(66 rows) + +SELECT d1 as timestamptz, + date_part( 'decade', d1) AS decade, + date_part( 'century', d1) AS century, + date_part( 'millennium', d1) AS millennium, + round(date_part( 'julian', d1)) AS julian, + date_part( 'epoch', d1) AS epoch + FROM TIMESTAMPTZ_TBL; + timestamptz | decade | century | millennium | julian | epoch +---------------------------------+-----------+-----------+------------+-----------+-------------- + -infinity | -Infinity | -Infinity | -Infinity | -Infinity | -Infinity + infinity | Infinity | Infinity | Infinity | Infinity | Infinity + Wed Dec 31 16:00:00 1969 PST | 196 | 20 | 2 | 2440588 | 0 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:02 1997 PST | 199 | 20 | 2 | 2450491 | 855624722 + Mon Feb 10 17:32:01.4 1997 PST | 199 | 20 | 2 | 2450491 | 855624721.4 + Mon Feb 10 17:32:01.5 1997 PST | 199 | 20 | 2 | 2450491 | 855624721.5 + Mon Feb 10 17:32:01.6 1997 PST | 199 | 20 | 2 | 2450491 | 855624721.6 + Thu Jan 02 00:00:00 1997 PST | 199 | 20 | 2 | 2450451 | 852192000 + Thu Jan 02 03:04:05 1997 PST | 199 | 20 | 2 | 2450451 | 852203045 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Tue Jun 10 17:32:01 1997 PDT | 199 | 20 | 2 | 2450611 | 865989121 + Sat Sep 22 18:19:20 2001 PDT | 200 | 21 | 3 | 2452176 | 1001207960 + Wed Mar 15 08:14:01 2000 PST | 200 | 20 | 2 | 2451619 | 953136841 + Wed Mar 15 04:14:02 2000 PST | 200 | 20 | 2 | 2451619 | 953122442 + Wed Mar 15 02:14:03 2000 PST | 200 | 20 | 2 | 2451619 | 953115243 + Wed Mar 15 03:14:04 2000 PST | 200 | 20 | 2 | 2451619 | 953118844 + Wed Mar 15 01:14:05 2000 PST | 200 | 20 | 2 | 2451619 | 953111645 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:00 1997 PST | 199 | 20 | 2 | 2450491 | 855624720 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Mon Feb 10 09:32:01 1997 PST | 199 | 20 | 2 | 2450490 | 855595921 + Mon Feb 10 09:32:01 1997 PST | 199 | 20 | 2 | 2450490 | 855595921 + Mon Feb 10 09:32:01 1997 PST | 199 | 20 | 2 | 2450490 | 855595921 + Mon Feb 10 14:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855613921 + Thu Jul 10 14:32:01 1997 PDT | 199 | 20 | 2 | 2450641 | 868570321 + Tue Jun 10 18:32:01 1997 PDT | 199 | 20 | 2 | 2450611 | 865992721 + Mon Feb 10 17:32:01 1997 PST | 199 | 20 | 2 | 2450491 | 855624721 + Tue Feb 11 17:32:01 1997 PST | 199 | 20 | 2 | 2450492 | 855711121 + Wed Feb 12 17:32:01 1997 PST | 199 | 20 | 2 | 2450493 | 855797521 + Thu Feb 13 17:32:01 1997 PST | 199 | 20 | 2 | 2450494 | 855883921 + Fri Feb 14 17:32:01 1997 PST | 199 | 20 | 2 | 2450495 | 855970321 + Sat Feb 15 17:32:01 1997 PST | 199 | 20 | 2 | 2450496 | 856056721 + Sun Feb 16 17:32:01 1997 PST | 199 | 20 | 2 | 2450497 | 856143121 + Tue Feb 16 17:32:01 0097 PST BC | -10 | -1 | -1 | 1686043 | -65192682479 + Sat Feb 16 17:32:01 0097 PST | 9 | 1 | 1 | 1756537 | -59102000879 + Thu Feb 16 17:32:01 0597 PST | 59 | 6 | 1 | 1939158 | -43323546479 + Tue Feb 16 17:32:01 1097 PST | 109 | 11 | 2 | 2121779 | -27545092079 + Sat Feb 16 17:32:01 1697 PST | 169 | 17 | 2 | 2340925 | -8610877679 + Thu Feb 16 17:32:01 1797 PST | 179 | 18 | 2 | 2377449 | -5455204079 + Tue Feb 16 17:32:01 1897 PST | 189 | 19 | 2 | 2413973 | -2299530479 + Sun Feb 16 17:32:01 1997 PST | 199 | 20 | 2 | 2450497 | 856143121 + Sat Feb 16 17:32:01 2097 PST | 209 | 21 | 3 | 2487022 | 4011903121 + Wed Feb 28 17:32:01 1996 PST | 199 | 20 | 2 | 2450143 | 825557521 + Thu Feb 29 17:32:01 1996 PST | 199 | 20 | 2 | 2450144 | 825643921 + Fri Mar 01 17:32:01 1996 PST | 199 | 20 | 2 | 2450145 | 825730321 + Mon Dec 30 17:32:01 1996 PST | 199 | 20 | 2 | 2450449 | 851995921 + Tue Dec 31 17:32:01 1996 PST | 199 | 20 | 2 | 2450450 | 852082321 + Wed Jan 01 17:32:01 1997 PST | 199 | 20 | 2 | 2450451 | 852168721 + Fri Feb 28 17:32:01 1997 PST | 199 | 20 | 2 | 2450509 | 857179921 + Sat Mar 01 17:32:01 1997 PST | 199 | 20 | 2 | 2450510 | 857266321 + Tue Dec 30 17:32:01 1997 PST | 199 | 20 | 2 | 2450814 | 883531921 + Wed Dec 31 17:32:01 1997 PST | 199 | 20 | 2 | 2450815 | 883618321 + Fri Dec 31 17:32:01 1999 PST | 199 | 20 | 2 | 2451545 | 946690321 + Sat Jan 01 17:32:01 2000 PST | 200 | 20 | 2 | 2451546 | 946776721 + Sun Dec 31 17:32:01 2000 PST | 200 | 20 | 2 | 2451911 | 978312721 + Mon Jan 01 17:32:01 2001 PST | 200 | 21 | 3 | 2451912 | 978399121 +(66 rows) + +SELECT d1 as timestamptz, + date_part( 'timezone', d1) AS timezone, + date_part( 'timezone_hour', d1) AS timezone_hour, + date_part( 'timezone_minute', d1) AS timezone_minute + FROM TIMESTAMPTZ_TBL; + timestamptz | timezone | timezone_hour | timezone_minute +---------------------------------+----------+---------------+----------------- + -infinity | | | + infinity | | | + Wed Dec 31 16:00:00 1969 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:02 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01.4 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01.5 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01.6 1997 PST | -28800 | -8 | 0 + Thu Jan 02 00:00:00 1997 PST | -28800 | -8 | 0 + Thu Jan 02 03:04:05 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Tue Jun 10 17:32:01 1997 PDT | -25200 | -7 | 0 + Sat Sep 22 18:19:20 2001 PDT | -25200 | -7 | 0 + Wed Mar 15 08:14:01 2000 PST | -28800 | -8 | 0 + Wed Mar 15 04:14:02 2000 PST | -28800 | -8 | 0 + Wed Mar 15 02:14:03 2000 PST | -28800 | -8 | 0 + Wed Mar 15 03:14:04 2000 PST | -28800 | -8 | 0 + Wed Mar 15 01:14:05 2000 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:00 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 09:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 09:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 09:32:01 1997 PST | -28800 | -8 | 0 + Mon Feb 10 14:32:01 1997 PST | -28800 | -8 | 0 + Thu Jul 10 14:32:01 1997 PDT | -25200 | -7 | 0 + Tue Jun 10 18:32:01 1997 PDT | -25200 | -7 | 0 + Mon Feb 10 17:32:01 1997 PST | -28800 | -8 | 0 + Tue Feb 11 17:32:01 1997 PST | -28800 | -8 | 0 + Wed Feb 12 17:32:01 1997 PST | -28800 | -8 | 0 + Thu Feb 13 17:32:01 1997 PST | -28800 | -8 | 0 + Fri Feb 14 17:32:01 1997 PST | -28800 | -8 | 0 + Sat Feb 15 17:32:01 1997 PST | -28800 | -8 | 0 + Sun Feb 16 17:32:01 1997 PST | -28800 | -8 | 0 + Tue Feb 16 17:32:01 0097 PST BC | -28800 | -8 | 0 + Sat Feb 16 17:32:01 0097 PST | -28800 | -8 | 0 + Thu Feb 16 17:32:01 0597 PST | -28800 | -8 | 0 + Tue Feb 16 17:32:01 1097 PST | -28800 | -8 | 0 + Sat Feb 16 17:32:01 1697 PST | -28800 | -8 | 0 + Thu Feb 16 17:32:01 1797 PST | -28800 | -8 | 0 + Tue Feb 16 17:32:01 1897 PST | -28800 | -8 | 0 + Sun Feb 16 17:32:01 1997 PST | -28800 | -8 | 0 + Sat Feb 16 17:32:01 2097 PST | -28800 | -8 | 0 + Wed Feb 28 17:32:01 1996 PST | -28800 | -8 | 0 + Thu Feb 29 17:32:01 1996 PST | -28800 | -8 | 0 + Fri Mar 01 17:32:01 1996 PST | -28800 | -8 | 0 + Mon Dec 30 17:32:01 1996 PST | -28800 | -8 | 0 + Tue Dec 31 17:32:01 1996 PST | -28800 | -8 | 0 + Wed Jan 01 17:32:01 1997 PST | -28800 | -8 | 0 + Fri Feb 28 17:32:01 1997 PST | -28800 | -8 | 0 + Sat Mar 01 17:32:01 1997 PST | -28800 | -8 | 0 + Tue Dec 30 17:32:01 1997 PST | -28800 | -8 | 0 + Wed Dec 31 17:32:01 1997 PST | -28800 | -8 | 0 + Fri Dec 31 17:32:01 1999 PST | -28800 | -8 | 0 + Sat Jan 01 17:32:01 2000 PST | -28800 | -8 | 0 + Sun Dec 31 17:32:01 2000 PST | -28800 | -8 | 0 + Mon Jan 01 17:32:01 2001 PST | -28800 | -8 | 0 +(66 rows) + +-- extract implementation is mostly the same as date_part, so only +-- test a few cases for additional coverage. +SELECT d1 as "timestamp", + extract(microseconds from d1) AS microseconds, + extract(milliseconds from d1) AS milliseconds, + extract(seconds from d1) AS seconds, + round(extract(julian from d1)) AS julian, + extract(epoch from d1) AS epoch + FROM TIMESTAMPTZ_TBL; + timestamp | microseconds | milliseconds | seconds | julian | epoch +---------------------------------+--------------+--------------+-----------+-----------+--------------------- + -infinity | | | | -Infinity | -Infinity + infinity | | | | Infinity | Infinity + Wed Dec 31 16:00:00 1969 PST | 0 | 0.000 | 0.000000 | 2440588 | 0.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:02 1997 PST | 2000000 | 2000.000 | 2.000000 | 2450491 | 855624722.000000 + Mon Feb 10 17:32:01.4 1997 PST | 1400000 | 1400.000 | 1.400000 | 2450491 | 855624721.400000 + Mon Feb 10 17:32:01.5 1997 PST | 1500000 | 1500.000 | 1.500000 | 2450491 | 855624721.500000 + Mon Feb 10 17:32:01.6 1997 PST | 1600000 | 1600.000 | 1.600000 | 2450491 | 855624721.600000 + Thu Jan 02 00:00:00 1997 PST | 0 | 0.000 | 0.000000 | 2450451 | 852192000.000000 + Thu Jan 02 03:04:05 1997 PST | 5000000 | 5000.000 | 5.000000 | 2450451 | 852203045.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Tue Jun 10 17:32:01 1997 PDT | 1000000 | 1000.000 | 1.000000 | 2450611 | 865989121.000000 + Sat Sep 22 18:19:20 2001 PDT | 20000000 | 20000.000 | 20.000000 | 2452176 | 1001207960.000000 + Wed Mar 15 08:14:01 2000 PST | 1000000 | 1000.000 | 1.000000 | 2451619 | 953136841.000000 + Wed Mar 15 04:14:02 2000 PST | 2000000 | 2000.000 | 2.000000 | 2451619 | 953122442.000000 + Wed Mar 15 02:14:03 2000 PST | 3000000 | 3000.000 | 3.000000 | 2451619 | 953115243.000000 + Wed Mar 15 03:14:04 2000 PST | 4000000 | 4000.000 | 4.000000 | 2451619 | 953118844.000000 + Wed Mar 15 01:14:05 2000 PST | 5000000 | 5000.000 | 5.000000 | 2451619 | 953111645.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:00 1997 PST | 0 | 0.000 | 0.000000 | 2450491 | 855624720.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Mon Feb 10 09:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450490 | 855595921.000000 + Mon Feb 10 09:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450490 | 855595921.000000 + Mon Feb 10 09:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450490 | 855595921.000000 + Mon Feb 10 14:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855613921.000000 + Thu Jul 10 14:32:01 1997 PDT | 1000000 | 1000.000 | 1.000000 | 2450641 | 868570321.000000 + Tue Jun 10 18:32:01 1997 PDT | 1000000 | 1000.000 | 1.000000 | 2450611 | 865992721.000000 + Mon Feb 10 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450491 | 855624721.000000 + Tue Feb 11 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450492 | 855711121.000000 + Wed Feb 12 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450493 | 855797521.000000 + Thu Feb 13 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450494 | 855883921.000000 + Fri Feb 14 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450495 | 855970321.000000 + Sat Feb 15 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450496 | 856056721.000000 + Sun Feb 16 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450497 | 856143121.000000 + Tue Feb 16 17:32:01 0097 PST BC | 1000000 | 1000.000 | 1.000000 | 1686043 | -65192682479.000000 + Sat Feb 16 17:32:01 0097 PST | 1000000 | 1000.000 | 1.000000 | 1756537 | -59102000879.000000 + Thu Feb 16 17:32:01 0597 PST | 1000000 | 1000.000 | 1.000000 | 1939158 | -43323546479.000000 + Tue Feb 16 17:32:01 1097 PST | 1000000 | 1000.000 | 1.000000 | 2121779 | -27545092079.000000 + Sat Feb 16 17:32:01 1697 PST | 1000000 | 1000.000 | 1.000000 | 2340925 | -8610877679.000000 + Thu Feb 16 17:32:01 1797 PST | 1000000 | 1000.000 | 1.000000 | 2377449 | -5455204079.000000 + Tue Feb 16 17:32:01 1897 PST | 1000000 | 1000.000 | 1.000000 | 2413973 | -2299530479.000000 + Sun Feb 16 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450497 | 856143121.000000 + Sat Feb 16 17:32:01 2097 PST | 1000000 | 1000.000 | 1.000000 | 2487022 | 4011903121.000000 + Wed Feb 28 17:32:01 1996 PST | 1000000 | 1000.000 | 1.000000 | 2450143 | 825557521.000000 + Thu Feb 29 17:32:01 1996 PST | 1000000 | 1000.000 | 1.000000 | 2450144 | 825643921.000000 + Fri Mar 01 17:32:01 1996 PST | 1000000 | 1000.000 | 1.000000 | 2450145 | 825730321.000000 + Mon Dec 30 17:32:01 1996 PST | 1000000 | 1000.000 | 1.000000 | 2450449 | 851995921.000000 + Tue Dec 31 17:32:01 1996 PST | 1000000 | 1000.000 | 1.000000 | 2450450 | 852082321.000000 + Wed Jan 01 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450451 | 852168721.000000 + Fri Feb 28 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450509 | 857179921.000000 + Sat Mar 01 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450510 | 857266321.000000 + Tue Dec 30 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450814 | 883531921.000000 + Wed Dec 31 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450815 | 883618321.000000 + Fri Dec 31 17:32:01 1999 PST | 1000000 | 1000.000 | 1.000000 | 2451545 | 946690321.000000 + Sat Jan 01 17:32:01 2000 PST | 1000000 | 1000.000 | 1.000000 | 2451546 | 946776721.000000 + Sun Dec 31 17:32:01 2000 PST | 1000000 | 1000.000 | 1.000000 | 2451911 | 978312721.000000 + Mon Jan 01 17:32:01 2001 PST | 1000000 | 1000.000 | 1.000000 | 2451912 | 978399121.000000 +(66 rows) + +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00+00'::timestamptz); + date_part +--------------- + 9224097091200 +(1 row) + +SELECT extract(epoch from '294270-01-01 00:00:00+00'::timestamptz); + extract +---------------------- + 9224097091200.000000 +(1 row) + +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00+00'::timestamptz); + extract +-------------------- + 95617584000.000000 +(1 row) + +-- TO_CHAR() +SELECT to_char(d1, 'DAY Day day DY Dy dy MONTH Month month RM MON Mon mon') + FROM TIMESTAMPTZ_TBL; + to_char +------------------------------------------------------------------------------------------ + + + WEDNESDAY Wednesday wednesday WED Wed wed DECEMBER December december XII DEC Dec dec + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu JANUARY January january I JAN Jan jan + THURSDAY Thursday thursday THU Thu thu JANUARY January january I JAN Jan jan + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue JUNE June june VI JUN Jun jun + SATURDAY Saturday saturday SAT Sat sat SEPTEMBER September september IX SEP Sep sep + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + WEDNESDAY Wednesday wednesday WED Wed wed MARCH March march III MAR Mar mar + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu JULY July july VII JUL Jul jul + TUESDAY Tuesday tuesday TUE Tue tue JUNE June june VI JUN Jun jun + MONDAY Monday monday MON Mon mon FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue FEBRUARY February february II FEB Feb feb + WEDNESDAY Wednesday wednesday WED Wed wed FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu FEBRUARY February february II FEB Feb feb + FRIDAY Friday friday FRI Fri fri FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat FEBRUARY February february II FEB Feb feb + SUNDAY Sunday sunday SUN Sun sun FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu FEBRUARY February february II FEB Feb feb + TUESDAY Tuesday tuesday TUE Tue tue FEBRUARY February february II FEB Feb feb + SUNDAY Sunday sunday SUN Sun sun FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat FEBRUARY February february II FEB Feb feb + WEDNESDAY Wednesday wednesday WED Wed wed FEBRUARY February february II FEB Feb feb + THURSDAY Thursday thursday THU Thu thu FEBRUARY February february II FEB Feb feb + FRIDAY Friday friday FRI Fri fri MARCH March march III MAR Mar mar + MONDAY Monday monday MON Mon mon DECEMBER December december XII DEC Dec dec + TUESDAY Tuesday tuesday TUE Tue tue DECEMBER December december XII DEC Dec dec + WEDNESDAY Wednesday wednesday WED Wed wed JANUARY January january I JAN Jan jan + FRIDAY Friday friday FRI Fri fri FEBRUARY February february II FEB Feb feb + SATURDAY Saturday saturday SAT Sat sat MARCH March march III MAR Mar mar + TUESDAY Tuesday tuesday TUE Tue tue DECEMBER December december XII DEC Dec dec + WEDNESDAY Wednesday wednesday WED Wed wed DECEMBER December december XII DEC Dec dec + FRIDAY Friday friday FRI Fri fri DECEMBER December december XII DEC Dec dec + SATURDAY Saturday saturday SAT Sat sat JANUARY January january I JAN Jan jan + SUNDAY Sunday sunday SUN Sun sun DECEMBER December december XII DEC Dec dec + MONDAY Monday monday MON Mon mon JANUARY January january I JAN Jan jan +(66 rows) + +SELECT to_char(d1, 'FMDAY FMDay FMday FMMONTH FMMonth FMmonth FMRM') + FROM TIMESTAMPTZ_TBL; + to_char +-------------------------------------------------------------- + + + WEDNESDAY Wednesday wednesday DECEMBER December december XII + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + THURSDAY Thursday thursday JANUARY January january I + THURSDAY Thursday thursday JANUARY January january I + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + TUESDAY Tuesday tuesday JUNE June june VI + SATURDAY Saturday saturday SEPTEMBER September september IX + WEDNESDAY Wednesday wednesday MARCH March march III + WEDNESDAY Wednesday wednesday MARCH March march III + WEDNESDAY Wednesday wednesday MARCH March march III + WEDNESDAY Wednesday wednesday MARCH March march III + WEDNESDAY Wednesday wednesday MARCH March march III + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + MONDAY Monday monday FEBRUARY February february II + THURSDAY Thursday thursday JULY July july VII + TUESDAY Tuesday tuesday JUNE June june VI + MONDAY Monday monday FEBRUARY February february II + TUESDAY Tuesday tuesday FEBRUARY February february II + WEDNESDAY Wednesday wednesday FEBRUARY February february II + THURSDAY Thursday thursday FEBRUARY February february II + FRIDAY Friday friday FEBRUARY February february II + SATURDAY Saturday saturday FEBRUARY February february II + SUNDAY Sunday sunday FEBRUARY February february II + TUESDAY Tuesday tuesday FEBRUARY February february II + SATURDAY Saturday saturday FEBRUARY February february II + THURSDAY Thursday thursday FEBRUARY February february II + TUESDAY Tuesday tuesday FEBRUARY February february II + SATURDAY Saturday saturday FEBRUARY February february II + THURSDAY Thursday thursday FEBRUARY February february II + TUESDAY Tuesday tuesday FEBRUARY February february II + SUNDAY Sunday sunday FEBRUARY February february II + SATURDAY Saturday saturday FEBRUARY February february II + WEDNESDAY Wednesday wednesday FEBRUARY February february II + THURSDAY Thursday thursday FEBRUARY February february II + FRIDAY Friday friday MARCH March march III + MONDAY Monday monday DECEMBER December december XII + TUESDAY Tuesday tuesday DECEMBER December december XII + WEDNESDAY Wednesday wednesday JANUARY January january I + FRIDAY Friday friday FEBRUARY February february II + SATURDAY Saturday saturday MARCH March march III + TUESDAY Tuesday tuesday DECEMBER December december XII + WEDNESDAY Wednesday wednesday DECEMBER December december XII + FRIDAY Friday friday DECEMBER December december XII + SATURDAY Saturday saturday JANUARY January january I + SUNDAY Sunday sunday DECEMBER December december XII + MONDAY Monday monday JANUARY January january I +(66 rows) + +SELECT to_char(d1, 'Y,YYY YYYY YYY YY Y CC Q MM WW DDD DD D J') + FROM TIMESTAMPTZ_TBL; + to_char +-------------------------------------------------- + + + 1,969 1969 969 69 9 20 4 12 53 365 31 4 2440587 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 01 01 002 02 5 2450451 + 1,997 1997 997 97 7 20 1 01 01 002 02 5 2450451 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 2 06 23 161 10 3 2450610 + 2,001 2001 001 01 1 21 3 09 38 265 22 7 2452175 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 2,000 2000 000 00 0 20 1 03 11 075 15 4 2451619 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 3 07 28 191 10 5 2450640 + 1,997 1997 997 97 7 20 2 06 23 161 10 3 2450610 + 1,997 1997 997 97 7 20 1 02 06 041 10 2 2450490 + 1,997 1997 997 97 7 20 1 02 06 042 11 3 2450491 + 1,997 1997 997 97 7 20 1 02 07 043 12 4 2450492 + 1,997 1997 997 97 7 20 1 02 07 044 13 5 2450493 + 1,997 1997 997 97 7 20 1 02 07 045 14 6 2450494 + 1,997 1997 997 97 7 20 1 02 07 046 15 7 2450495 + 1,997 1997 997 97 7 20 1 02 07 047 16 1 2450496 + 0,097 0097 097 97 7 -01 1 02 07 047 16 3 1686042 + 0,097 0097 097 97 7 01 1 02 07 047 16 7 1756536 + 0,597 0597 597 97 7 06 1 02 07 047 16 5 1939157 + 1,097 1097 097 97 7 11 1 02 07 047 16 3 2121778 + 1,697 1697 697 97 7 17 1 02 07 047 16 7 2340924 + 1,797 1797 797 97 7 18 1 02 07 047 16 5 2377448 + 1,897 1897 897 97 7 19 1 02 07 047 16 3 2413972 + 1,997 1997 997 97 7 20 1 02 07 047 16 1 2450496 + 2,097 2097 097 97 7 21 1 02 07 047 16 7 2487021 + 1,996 1996 996 96 6 20 1 02 09 059 28 4 2450142 + 1,996 1996 996 96 6 20 1 02 09 060 29 5 2450143 + 1,996 1996 996 96 6 20 1 03 09 061 01 6 2450144 + 1,996 1996 996 96 6 20 4 12 53 365 30 2 2450448 + 1,996 1996 996 96 6 20 4 12 53 366 31 3 2450449 + 1,997 1997 997 97 7 20 1 01 01 001 01 4 2450450 + 1,997 1997 997 97 7 20 1 02 09 059 28 6 2450508 + 1,997 1997 997 97 7 20 1 03 09 060 01 7 2450509 + 1,997 1997 997 97 7 20 4 12 52 364 30 3 2450813 + 1,997 1997 997 97 7 20 4 12 53 365 31 4 2450814 + 1,999 1999 999 99 9 20 4 12 53 365 31 6 2451544 + 2,000 2000 000 00 0 20 1 01 01 001 01 7 2451545 + 2,000 2000 000 00 0 20 4 12 53 366 31 1 2451910 + 2,001 2001 001 01 1 21 1 01 01 001 01 2 2451911 +(66 rows) + +SELECT to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ') + FROM TIMESTAMPTZ_TBL; + to_char +------------------------------------------------- + + + 1,969 1969 969 69 9 20 4 12 53 365 31 4 2440587 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 1 1 2 2 5 2450451 + 1,997 1997 997 97 7 20 1 1 1 2 2 5 2450451 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 2 6 23 161 10 3 2450610 + 2,001 2001 1 1 1 21 3 9 38 265 22 7 2452175 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 3 7 28 191 10 5 2450640 + 1,997 1997 997 97 7 20 2 6 23 161 10 3 2450610 + 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490 + 1,997 1997 997 97 7 20 1 2 6 42 11 3 2450491 + 1,997 1997 997 97 7 20 1 2 7 43 12 4 2450492 + 1,997 1997 997 97 7 20 1 2 7 44 13 5 2450493 + 1,997 1997 997 97 7 20 1 2 7 45 14 6 2450494 + 1,997 1997 997 97 7 20 1 2 7 46 15 7 2450495 + 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496 + 0,097 97 97 97 7 -1 1 2 7 47 16 3 1686042 + 0,097 97 97 97 7 1 1 2 7 47 16 7 1756536 + 0,597 597 597 97 7 6 1 2 7 47 16 5 1939157 + 1,097 1097 97 97 7 11 1 2 7 47 16 3 2121778 + 1,697 1697 697 97 7 17 1 2 7 47 16 7 2340924 + 1,797 1797 797 97 7 18 1 2 7 47 16 5 2377448 + 1,897 1897 897 97 7 19 1 2 7 47 16 3 2413972 + 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496 + 2,097 2097 97 97 7 21 1 2 7 47 16 7 2487021 + 1,996 1996 996 96 6 20 1 2 9 59 28 4 2450142 + 1,996 1996 996 96 6 20 1 2 9 60 29 5 2450143 + 1,996 1996 996 96 6 20 1 3 9 61 1 6 2450144 + 1,996 1996 996 96 6 20 4 12 53 365 30 2 2450448 + 1,996 1996 996 96 6 20 4 12 53 366 31 3 2450449 + 1,997 1997 997 97 7 20 1 1 1 1 1 4 2450450 + 1,997 1997 997 97 7 20 1 2 9 59 28 6 2450508 + 1,997 1997 997 97 7 20 1 3 9 60 1 7 2450509 + 1,997 1997 997 97 7 20 4 12 52 364 30 3 2450813 + 1,997 1997 997 97 7 20 4 12 53 365 31 4 2450814 + 1,999 1999 999 99 9 20 4 12 53 365 31 6 2451544 + 2,000 2000 0 0 0 20 1 1 1 1 1 7 2451545 + 2,000 2000 0 0 0 20 4 12 53 366 31 1 2451910 + 2,001 2001 1 1 1 21 1 1 1 1 1 2 2451911 +(66 rows) + +SELECT to_char(d1, 'HH HH12 HH24 MI SS SSSS') + FROM TIMESTAMPTZ_TBL; + to_char +---------------------- + + + 04 04 16 00 00 57600 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 02 63122 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 12 12 00 00 00 0 + 03 03 03 04 05 11045 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 06 06 18 19 20 65960 + 08 08 08 14 01 29641 + 04 04 04 14 02 15242 + 02 02 02 14 03 8043 + 03 03 03 14 04 11644 + 01 01 01 14 05 4445 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 00 63120 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 09 09 09 32 01 34321 + 09 09 09 32 01 34321 + 09 09 09 32 01 34321 + 02 02 14 32 01 52321 + 02 02 14 32 01 52321 + 06 06 18 32 01 66721 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 + 05 05 17 32 01 63121 +(66 rows) + +SELECT to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') + FROM TIMESTAMPTZ_TBL; + to_char +------------------------------------------------- + + + HH:MI:SS is 04:00:00 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:02 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 12:00:00 "text between quote marks" + HH:MI:SS is 03:04:05 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 06:19:20 "text between quote marks" + HH:MI:SS is 08:14:01 "text between quote marks" + HH:MI:SS is 04:14:02 "text between quote marks" + HH:MI:SS is 02:14:03 "text between quote marks" + HH:MI:SS is 03:14:04 "text between quote marks" + HH:MI:SS is 01:14:05 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:00 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 09:32:01 "text between quote marks" + HH:MI:SS is 09:32:01 "text between quote marks" + HH:MI:SS is 09:32:01 "text between quote marks" + HH:MI:SS is 02:32:01 "text between quote marks" + HH:MI:SS is 02:32:01 "text between quote marks" + HH:MI:SS is 06:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" + HH:MI:SS is 05:32:01 "text between quote marks" +(66 rows) + +SELECT to_char(d1, 'HH24--text--MI--text--SS') + FROM TIMESTAMPTZ_TBL; + to_char +------------------------ + + + 16--text--00--text--00 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--02 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 00--text--00--text--00 + 03--text--04--text--05 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 18--text--19--text--20 + 08--text--14--text--01 + 04--text--14--text--02 + 02--text--14--text--03 + 03--text--14--text--04 + 01--text--14--text--05 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--00 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 09--text--32--text--01 + 09--text--32--text--01 + 09--text--32--text--01 + 14--text--32--text--01 + 14--text--32--text--01 + 18--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 + 17--text--32--text--01 +(66 rows) + +SELECT to_char(d1, 'YYYYTH YYYYth Jth') + FROM TIMESTAMPTZ_TBL; + to_char +------------------------- + + + 1969TH 1969th 2440587th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450451st + 1997TH 1997th 2450451st + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450610th + 2001ST 2001st 2452175th + 2000TH 2000th 2451619th + 2000TH 2000th 2451619th + 2000TH 2000th 2451619th + 2000TH 2000th 2451619th + 2000TH 2000th 2451619th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450490th + 1997TH 1997th 2450640th + 1997TH 1997th 2450610th + 1997TH 1997th 2450490th + 1997TH 1997th 2450491st + 1997TH 1997th 2450492nd + 1997TH 1997th 2450493rd + 1997TH 1997th 2450494th + 1997TH 1997th 2450495th + 1997TH 1997th 2450496th + 0097TH 0097th 1686042nd + 0097TH 0097th 1756536th + 0597TH 0597th 1939157th + 1097TH 1097th 2121778th + 1697TH 1697th 2340924th + 1797TH 1797th 2377448th + 1897TH 1897th 2413972nd + 1997TH 1997th 2450496th + 2097TH 2097th 2487021st + 1996TH 1996th 2450142nd + 1996TH 1996th 2450143rd + 1996TH 1996th 2450144th + 1996TH 1996th 2450448th + 1996TH 1996th 2450449th + 1997TH 1997th 2450450th + 1997TH 1997th 2450508th + 1997TH 1997th 2450509th + 1997TH 1997th 2450813th + 1997TH 1997th 2450814th + 1999TH 1999th 2451544th + 2000TH 2000th 2451545th + 2000TH 2000th 2451910th + 2001ST 2001st 2451911th +(66 rows) + +SELECT to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. HH:MI:SS p.m. HH:MI:SS pm') + FROM TIMESTAMPTZ_TBL; + to_char +--------------------------------------------------------------------- + + + 1969 A.D. 1969 a.d. 1969 ad 04:00:00 P.M. 04:00:00 p.m. 04:00:00 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:02 P.M. 05:32:02 p.m. 05:32:02 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 12:00:00 A.M. 12:00:00 a.m. 12:00:00 am + 1997 A.D. 1997 a.d. 1997 ad 03:04:05 A.M. 03:04:05 a.m. 03:04:05 am + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2001 A.D. 2001 a.d. 2001 ad 06:19:20 P.M. 06:19:20 p.m. 06:19:20 pm + 2000 A.D. 2000 a.d. 2000 ad 08:14:01 A.M. 08:14:01 a.m. 08:14:01 am + 2000 A.D. 2000 a.d. 2000 ad 04:14:02 A.M. 04:14:02 a.m. 04:14:02 am + 2000 A.D. 2000 a.d. 2000 ad 02:14:03 A.M. 02:14:03 a.m. 02:14:03 am + 2000 A.D. 2000 a.d. 2000 ad 03:14:04 A.M. 03:14:04 a.m. 03:14:04 am + 2000 A.D. 2000 a.d. 2000 ad 01:14:05 A.M. 01:14:05 a.m. 01:14:05 am + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:00 P.M. 05:32:00 p.m. 05:32:00 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 09:32:01 A.M. 09:32:01 a.m. 09:32:01 am + 1997 A.D. 1997 a.d. 1997 ad 09:32:01 A.M. 09:32:01 a.m. 09:32:01 am + 1997 A.D. 1997 a.d. 1997 ad 09:32:01 A.M. 09:32:01 a.m. 09:32:01 am + 1997 A.D. 1997 a.d. 1997 ad 02:32:01 P.M. 02:32:01 p.m. 02:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 02:32:01 P.M. 02:32:01 p.m. 02:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 06:32:01 P.M. 06:32:01 p.m. 06:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 0097 B.C. 0097 b.c. 0097 bc 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 0097 A.D. 0097 a.d. 0097 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 0597 A.D. 0597 a.d. 0597 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1097 A.D. 1097 a.d. 1097 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1697 A.D. 1697 a.d. 1697 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1797 A.D. 1797 a.d. 1797 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1897 A.D. 1897 a.d. 1897 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2097 A.D. 2097 a.d. 2097 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1996 A.D. 1996 a.d. 1996 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1997 A.D. 1997 a.d. 1997 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 1999 A.D. 1999 a.d. 1999 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2000 A.D. 2000 a.d. 2000 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2000 A.D. 2000 a.d. 2000 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm + 2001 A.D. 2001 a.d. 2001 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm +(66 rows) + +SELECT to_char(d1, 'IYYY IYY IY I IW IDDD ID') + FROM TIMESTAMPTZ_TBL; + to_char +------------------------ + + + 1970 970 70 0 01 003 3 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 01 004 4 + 1997 997 97 7 01 004 4 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 24 163 2 + 2001 001 01 1 38 265 6 + 2000 000 00 0 11 073 3 + 2000 000 00 0 11 073 3 + 2000 000 00 0 11 073 3 + 2000 000 00 0 11 073 3 + 2000 000 00 0 11 073 3 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 043 1 + 1997 997 97 7 28 193 4 + 1997 997 97 7 24 163 2 + 1997 997 97 7 07 043 1 + 1997 997 97 7 07 044 2 + 1997 997 97 7 07 045 3 + 1997 997 97 7 07 046 4 + 1997 997 97 7 07 047 5 + 1997 997 97 7 07 048 6 + 1997 997 97 7 07 049 7 + 0097 097 97 7 07 044 2 + 0097 097 97 7 07 048 6 + 0597 597 97 7 07 046 4 + 1097 097 97 7 07 044 2 + 1697 697 97 7 07 048 6 + 1797 797 97 7 07 046 4 + 1897 897 97 7 07 044 2 + 1997 997 97 7 07 049 7 + 2097 097 97 7 07 048 6 + 1996 996 96 6 09 059 3 + 1996 996 96 6 09 060 4 + 1996 996 96 6 09 061 5 + 1997 997 97 7 01 001 1 + 1997 997 97 7 01 002 2 + 1997 997 97 7 01 003 3 + 1997 997 97 7 09 061 5 + 1997 997 97 7 09 062 6 + 1998 998 98 8 01 002 2 + 1998 998 98 8 01 003 3 + 1999 999 99 9 52 362 5 + 1999 999 99 9 52 363 6 + 2000 000 00 0 52 364 7 + 2001 001 01 1 01 001 1 +(66 rows) + +SELECT to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID') + FROM TIMESTAMPTZ_TBL; + to_char +------------------------ + + + 1970 970 70 0 1 3 3 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 1 4 4 + 1997 997 97 7 1 4 4 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 24 163 2 + 2001 1 1 1 38 265 6 + 2000 0 0 0 11 73 3 + 2000 0 0 0 11 73 3 + 2000 0 0 0 11 73 3 + 2000 0 0 0 11 73 3 + 2000 0 0 0 11 73 3 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 43 1 + 1997 997 97 7 28 193 4 + 1997 997 97 7 24 163 2 + 1997 997 97 7 7 43 1 + 1997 997 97 7 7 44 2 + 1997 997 97 7 7 45 3 + 1997 997 97 7 7 46 4 + 1997 997 97 7 7 47 5 + 1997 997 97 7 7 48 6 + 1997 997 97 7 7 49 7 + 97 97 97 7 7 44 2 + 97 97 97 7 7 48 6 + 597 597 97 7 7 46 4 + 1097 97 97 7 7 44 2 + 1697 697 97 7 7 48 6 + 1797 797 97 7 7 46 4 + 1897 897 97 7 7 44 2 + 1997 997 97 7 7 49 7 + 2097 97 97 7 7 48 6 + 1996 996 96 6 9 59 3 + 1996 996 96 6 9 60 4 + 1996 996 96 6 9 61 5 + 1997 997 97 7 1 1 1 + 1997 997 97 7 1 2 2 + 1997 997 97 7 1 3 3 + 1997 997 97 7 9 61 5 + 1997 997 97 7 9 62 6 + 1998 998 98 8 1 2 2 + 1998 998 98 8 1 3 3 + 1999 999 99 9 52 362 5 + 1999 999 99 9 52 363 6 + 2000 0 0 0 52 364 7 + 2001 1 1 1 1 1 1 +(66 rows) + +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamptz), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); + to_char +-------------------------------------------------------------------- + 0 00 000 0000 00000 000000 0 00 000 0000 00000 000000 000 000000 + 7 78 780 7800 78000 780000 7 78 780 7800 78000 780000 780 780000 + 7 78 789 7890 78901 789010 7 78 789 7890 78901 789010 789 789010 + 7 78 789 7890 78901 789012 7 78 789 7890 78901 789012 789 789012 +(4 rows) + +-- Check OF, TZH, TZM with various zone offsets, particularly fractional hours +SET timezone = '00:00'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +-----+--------- + +00 | +00:00 +(1 row) + +SET timezone = '+02:00'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +-----+--------- + -02 | -02:00 +(1 row) + +SET timezone = '-13:00'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +-----+--------- + +13 | +13:00 +(1 row) + +SET timezone = '-00:30'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +--------+--------- + +00:30 | +00:30 +(1 row) + +SET timezone = '00:30'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +--------+--------- + -00:30 | -00:30 +(1 row) + +SET timezone = '-04:30'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +--------+--------- + +04:30 | +04:30 +(1 row) + +SET timezone = '04:30'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +--------+--------- + -04:30 | -04:30 +(1 row) + +SET timezone = '-04:15'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +--------+--------- + +04:15 | +04:15 +(1 row) + +SET timezone = '04:15'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; + OF | TZH:TZM +--------+--------- + -04:15 | -04:15 +(1 row) + +RESET timezone; +CREATE TABLE TIMESTAMPTZ_TST (a int , b timestamptz); +-- Test year field value with len > 4 +INSERT INTO TIMESTAMPTZ_TST VALUES(1, 'Sat Mar 12 23:58:48 1000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(2, 'Sat Mar 12 23:58:48 10000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(3, 'Sat Mar 12 23:58:48 100000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(3, '10000 Mar 12 23:58:48 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '100000312 23:58:48 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '1000000312 23:58:48 IST'); +--Verify data +SELECT * FROM TIMESTAMPTZ_TST ORDER BY a; + a | b +---+-------------------------------- + 1 | Wed Mar 12 13:58:48 1000 PST + 2 | Sun Mar 12 14:58:48 10000 PDT + 3 | Sun Mar 12 14:58:48 100000 PDT + 3 | Sun Mar 12 14:58:48 10000 PDT + 4 | Sun Mar 12 14:58:48 10000 PDT + 4 | Sun Mar 12 14:58:48 100000 PDT +(6 rows) + +--Cleanup +DROP TABLE TIMESTAMPTZ_TST; +-- test timestamptz constructors +set TimeZone to 'America/New_York'; +-- numeric timezone +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33); + make_timestamptz +--------------------------------- + Sun Jul 15 08:15:55.33 1973 EDT +(1 row) + +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2'); + make_timestamptz +--------------------------------- + Sun Jul 15 02:15:55.33 1973 EDT +(1 row) + +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '-2'); + make_timestamptz +--------------------------------- + Sun Jul 15 06:15:55.33 1973 EDT +(1 row) + +WITH tzs (tz) AS (VALUES + ('+1'), ('+1:'), ('+1:0'), ('+100'), ('+1:00'), ('+01:00'), + ('+10'), ('+1000'), ('+10:'), ('+10:0'), ('+10:00'), ('+10:00:'), + ('+10:00:1'), ('+10:00:01'), + ('+10:00:10')) + SELECT make_timestamptz(2010, 2, 27, 3, 45, 00, tz), tz FROM tzs; + make_timestamptz | tz +------------------------------+----------- + Fri Feb 26 21:45:00 2010 EST | +1 + Fri Feb 26 21:45:00 2010 EST | +1: + Fri Feb 26 21:45:00 2010 EST | +1:0 + Fri Feb 26 21:45:00 2010 EST | +100 + Fri Feb 26 21:45:00 2010 EST | +1:00 + Fri Feb 26 21:45:00 2010 EST | +01:00 + Fri Feb 26 12:45:00 2010 EST | +10 + Fri Feb 26 12:45:00 2010 EST | +1000 + Fri Feb 26 12:45:00 2010 EST | +10: + Fri Feb 26 12:45:00 2010 EST | +10:0 + Fri Feb 26 12:45:00 2010 EST | +10:00 + Fri Feb 26 12:45:00 2010 EST | +10:00: + Fri Feb 26 12:44:59 2010 EST | +10:00:1 + Fri Feb 26 12:44:59 2010 EST | +10:00:01 + Fri Feb 26 12:44:50 2010 EST | +10:00:10 +(15 rows) + +-- these should fail +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '2'); +ERROR: invalid input syntax for type numeric time zone: "2" +HINT: Numeric time zones must have "-" or "+" as first character. +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '+16'); +ERROR: numeric time zone "+16" out of range +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '-16'); +ERROR: numeric time zone "-16" out of range +-- should be true +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2') = '1973-07-15 08:15:55.33+02'::timestamptz; + ?column? +---------- + t +(1 row) + +-- full timezone names +SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') = timestamptz '2014-12-10 00:00:00 Europe/Prague'; + ?column? +---------- + t +(1 row) + +SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UTC'; + timezone +-------------------------- + Tue Dec 09 23:00:00 2014 +(1 row) + +SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; + timezone +-------------------------- + Wed Dec 09 15:56:00 1846 +(1 row) + +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; + timezone +-------------------------- + Fri Dec 09 23:50:39 1881 +(1 row) + +SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); +ERROR: time zone "Nehwon/Lankhmar" not recognized +-- abbreviations +SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EST'); + make_timestamptz +------------------------------ + Wed Dec 10 10:10:10 2008 EST +(1 row) + +SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EDT'); + make_timestamptz +------------------------------ + Wed Dec 10 09:10:10 2008 EST +(1 row) + +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT'); + make_timestamptz +------------------------------ + Wed Dec 10 13:10:10 2014 EST +(1 row) + +RESET TimeZone; +-- generate_series for timestamptz +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '1 hour'::interval); + generate_series +------------------------------ + Wed Jan 01 00:00:00 2020 PST + Wed Jan 01 01:00:00 2020 PST + Wed Jan 01 02:00:00 2020 PST + Wed Jan 01 03:00:00 2020 PST + Wed Jan 01 04:00:00 2020 PST + Wed Jan 01 05:00:00 2020 PST + Wed Jan 01 06:00:00 2020 PST + Wed Jan 01 07:00:00 2020 PST + Wed Jan 01 08:00:00 2020 PST + Wed Jan 01 09:00:00 2020 PST + Wed Jan 01 10:00:00 2020 PST + Wed Jan 01 11:00:00 2020 PST + Wed Jan 01 12:00:00 2020 PST + Wed Jan 01 13:00:00 2020 PST + Wed Jan 01 14:00:00 2020 PST + Wed Jan 01 15:00:00 2020 PST + Wed Jan 01 16:00:00 2020 PST + Wed Jan 01 17:00:00 2020 PST + Wed Jan 01 18:00:00 2020 PST + Wed Jan 01 19:00:00 2020 PST + Wed Jan 01 20:00:00 2020 PST + Wed Jan 01 21:00:00 2020 PST + Wed Jan 01 22:00:00 2020 PST + Wed Jan 01 23:00:00 2020 PST + Thu Jan 02 00:00:00 2020 PST + Thu Jan 02 01:00:00 2020 PST + Thu Jan 02 02:00:00 2020 PST + Thu Jan 02 03:00:00 2020 PST +(28 rows) + +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamptz, + 'infinity'::timestamptz, + '1 month'::interval) limit 10; + generate_series +------------------------------ + Sat Jan 01 00:00:00 2022 PST + Tue Feb 01 00:00:00 2022 PST + Tue Mar 01 00:00:00 2022 PST + Fri Apr 01 00:00:00 2022 PDT + Sun May 01 00:00:00 2022 PDT + Wed Jun 01 00:00:00 2022 PDT + Fri Jul 01 00:00:00 2022 PDT + Mon Aug 01 00:00:00 2022 PDT + Thu Sep 01 00:00:00 2022 PDT + Sat Oct 01 00:00:00 2022 PDT +(10 rows) + +-- errors +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '0 hour'::interval); +ERROR: step size cannot equal zero +-- +-- Test behavior with a dynamic (time-varying) timezone abbreviation. +-- These tests rely on the knowledge that MSK (Europe/Moscow standard time) +-- moved forwards in Mar 2011 and backwards again in Oct 2014. +-- +SET TimeZone to 'UTC'; +SELECT '2011-03-27 00:00:00 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 21:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 01:00:00 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 22:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 01:59:59 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 22:59:59 2011 UTC +(1 row) + +SELECT '2011-03-27 02:00:00 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 23:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 02:00:01 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 23:00:01 2011 UTC +(1 row) + +SELECT '2011-03-27 02:59:59 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 23:59:59 2011 UTC +(1 row) + +SELECT '2011-03-27 03:00:00 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 23:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 03:00:01 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 23:00:01 2011 UTC +(1 row) + +SELECT '2011-03-27 04:00:00 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 00:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 00:00:00 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 21:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 01:00:00 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 22:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 01:59:59 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 22:59:59 2011 UTC +(1 row) + +SELECT '2011-03-27 02:00:00 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 22:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 02:00:01 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 22:00:01 2011 UTC +(1 row) + +SELECT '2011-03-27 02:59:59 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 22:59:59 2011 UTC +(1 row) + +SELECT '2011-03-27 03:00:00 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 23:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 03:00:01 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Mar 26 23:00:01 2011 UTC +(1 row) + +SELECT '2011-03-27 04:00:00 MSK'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 00:00:00 2011 UTC +(1 row) + +SELECT '2014-10-26 00:00:00 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 20:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 00:59:59 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 20:59:59 2014 UTC +(1 row) + +SELECT '2014-10-26 01:00:00 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 22:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 01:00:01 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 22:00:01 2014 UTC +(1 row) + +SELECT '2014-10-26 02:00:00 Europe/Moscow'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 23:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 00:00:00 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 20:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 00:59:59 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 20:59:59 2014 UTC +(1 row) + +SELECT '2014-10-26 01:00:00 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 22:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 01:00:01 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 22:00:01 2014 UTC +(1 row) + +SELECT '2014-10-26 02:00:00 MSK'::timestamptz; + timestamptz +------------------------------ + Sat Oct 25 23:00:00 2014 UTC +(1 row) + +SELECT '2011-03-27 00:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Mar 26 21:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 01:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Mar 26 22:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 01:59:59'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Mar 26 22:59:59 2011 UTC +(1 row) + +SELECT '2011-03-27 02:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Mar 26 23:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 02:00:01'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Mar 26 23:00:01 2011 UTC +(1 row) + +SELECT '2011-03-27 02:59:59'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Mar 26 23:59:59 2011 UTC +(1 row) + +SELECT '2011-03-27 03:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Mar 26 23:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 03:00:01'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Mar 26 23:00:01 2011 UTC +(1 row) + +SELECT '2011-03-27 04:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sun Mar 27 00:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 00:00:00'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Mar 26 21:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 01:00:00'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Mar 26 22:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 01:59:59'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Mar 26 22:59:59 2011 UTC +(1 row) + +SELECT '2011-03-27 02:00:00'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Mar 26 22:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 02:00:01'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Mar 26 22:00:01 2011 UTC +(1 row) + +SELECT '2011-03-27 02:59:59'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Mar 26 22:59:59 2011 UTC +(1 row) + +SELECT '2011-03-27 03:00:00'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Mar 26 23:00:00 2011 UTC +(1 row) + +SELECT '2011-03-27 03:00:01'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Mar 26 23:00:01 2011 UTC +(1 row) + +SELECT '2011-03-27 04:00:00'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sun Mar 27 00:00:00 2011 UTC +(1 row) + +SELECT '2014-10-26 00:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Oct 25 20:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 00:59:59'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Oct 25 20:59:59 2014 UTC +(1 row) + +SELECT '2014-10-26 01:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Oct 25 22:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 01:00:01'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Oct 25 22:00:01 2014 UTC +(1 row) + +SELECT '2014-10-26 02:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + timezone +------------------------------ + Sat Oct 25 23:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 00:00:00'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Oct 25 20:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 00:59:59'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Oct 25 20:59:59 2014 UTC +(1 row) + +SELECT '2014-10-26 01:00:00'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Oct 25 22:00:00 2014 UTC +(1 row) + +SELECT '2014-10-26 01:00:01'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Oct 25 22:00:01 2014 UTC +(1 row) + +SELECT '2014-10-26 02:00:00'::timestamp AT TIME ZONE 'MSK'; + timezone +------------------------------ + Sat Oct 25 23:00:00 2014 UTC +(1 row) + +SELECT make_timestamptz(2014, 10, 26, 0, 0, 0, 'MSK'); + make_timestamptz +------------------------------ + Sat Oct 25 20:00:00 2014 UTC +(1 row) + +SELECT make_timestamptz(2014, 10, 26, 1, 0, 0, 'MSK'); + make_timestamptz +------------------------------ + Sat Oct 25 22:00:00 2014 UTC +(1 row) + +SELECT to_timestamp( 0); -- 1970-01-01 00:00:00+00 + to_timestamp +------------------------------ + Thu Jan 01 00:00:00 1970 UTC +(1 row) + +SELECT to_timestamp( 946684800); -- 2000-01-01 00:00:00+00 + to_timestamp +------------------------------ + Sat Jan 01 00:00:00 2000 UTC +(1 row) + +SELECT to_timestamp(1262349296.7890123); -- 2010-01-01 12:34:56.789012+00 + to_timestamp +------------------------------------- + Fri Jan 01 12:34:56.789012 2010 UTC +(1 row) + +-- edge cases +SELECT to_timestamp(-210866803200); -- 4714-11-24 00:00:00+00 BC + to_timestamp +--------------------------------- + Mon Nov 24 00:00:00 4714 UTC BC +(1 row) + +-- upper limit varies between integer and float timestamps, so hard to test +-- nonfinite values +SELECT to_timestamp(' Infinity'::float); + to_timestamp +-------------- + infinity +(1 row) + +SELECT to_timestamp('-Infinity'::float); + to_timestamp +-------------- + -infinity +(1 row) + +SELECT to_timestamp('NaN'::float); +ERROR: timestamp cannot be NaN +SET TimeZone to 'Europe/Moscow'; +SELECT '2011-03-26 21:00:00 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 00:00:00 2011 MSK +(1 row) + +SELECT '2011-03-26 22:00:00 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 01:00:00 2011 MSK +(1 row) + +SELECT '2011-03-26 22:59:59 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 01:59:59 2011 MSK +(1 row) + +SELECT '2011-03-26 23:00:00 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 03:00:00 2011 MSK +(1 row) + +SELECT '2011-03-26 23:00:01 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 03:00:01 2011 MSK +(1 row) + +SELECT '2011-03-26 23:59:59 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 03:59:59 2011 MSK +(1 row) + +SELECT '2011-03-27 00:00:00 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Mar 27 04:00:00 2011 MSK +(1 row) + +SELECT '2014-10-25 21:00:00 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Oct 26 01:00:00 2014 MSK +(1 row) + +SELECT '2014-10-25 21:59:59 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Oct 26 01:59:59 2014 MSK +(1 row) + +SELECT '2014-10-25 22:00:00 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Oct 26 01:00:00 2014 MSK +(1 row) + +SELECT '2014-10-25 22:00:01 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Oct 26 01:00:01 2014 MSK +(1 row) + +SELECT '2014-10-25 23:00:00 UTC'::timestamptz; + timestamptz +------------------------------ + Sun Oct 26 02:00:00 2014 MSK +(1 row) + +RESET TimeZone; +SELECT '2011-03-26 21:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Mar 27 00:00:00 2011 +(1 row) + +SELECT '2011-03-26 22:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Mar 27 01:00:00 2011 +(1 row) + +SELECT '2011-03-26 22:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Mar 27 01:59:59 2011 +(1 row) + +SELECT '2011-03-26 23:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Mar 27 03:00:00 2011 +(1 row) + +SELECT '2011-03-26 23:00:01 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Mar 27 03:00:01 2011 +(1 row) + +SELECT '2011-03-26 23:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Mar 27 03:59:59 2011 +(1 row) + +SELECT '2011-03-27 00:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Mar 27 04:00:00 2011 +(1 row) + +SELECT '2014-10-25 21:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Oct 26 01:00:00 2014 +(1 row) + +SELECT '2014-10-25 21:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Oct 26 01:59:59 2014 +(1 row) + +SELECT '2014-10-25 22:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Oct 26 01:00:00 2014 +(1 row) + +SELECT '2014-10-25 22:00:01 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Oct 26 01:00:01 2014 +(1 row) + +SELECT '2014-10-25 23:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + timezone +-------------------------- + Sun Oct 26 02:00:00 2014 +(1 row) + +SELECT '2011-03-26 21:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Mar 27 00:00:00 2011 +(1 row) + +SELECT '2011-03-26 22:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Mar 27 01:00:00 2011 +(1 row) + +SELECT '2011-03-26 22:59:59 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Mar 27 01:59:59 2011 +(1 row) + +SELECT '2011-03-26 23:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Mar 27 03:00:00 2011 +(1 row) + +SELECT '2011-03-26 23:00:01 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Mar 27 03:00:01 2011 +(1 row) + +SELECT '2011-03-26 23:59:59 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Mar 27 03:59:59 2011 +(1 row) + +SELECT '2011-03-27 00:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Mar 27 04:00:00 2011 +(1 row) + +SELECT '2014-10-25 21:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Oct 26 01:00:00 2014 +(1 row) + +SELECT '2014-10-25 21:59:59 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Oct 26 01:59:59 2014 +(1 row) + +SELECT '2014-10-25 22:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Oct 26 01:00:00 2014 +(1 row) + +SELECT '2014-10-25 22:00:01 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Oct 26 01:00:01 2014 +(1 row) + +SELECT '2014-10-25 23:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + timezone +-------------------------- + Sun Oct 26 02:00:00 2014 +(1 row) + +-- +-- Test that AT TIME ZONE isn't misoptimized when using an index (bug #14504) +-- +create temp table tmptz (f1 timestamptz primary key); +insert into tmptz values ('2017-01-18 00:00+00'); +explain (costs off) +select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00'; + QUERY PLAN +----------------------------------------------------------------------------------------------------- + Seq Scan on tmptz + Filter: ((f1 AT TIME ZONE 'utc'::text) = 'Wed Jan 18 00:00:00 2017'::timestamp without time zone) +(2 rows) + +select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00'; + f1 +------------------------------ + Tue Jan 17 16:00:00 2017 PST +(1 row) + diff --git a/src/test/singlenode_regress/expected/timetz.out b/src/test/singlenode_regress/expected/timetz.out new file mode 100644 index 00000000000..f4960c0166d --- /dev/null +++ b/src/test/singlenode_regress/expected/timetz.out @@ -0,0 +1,233 @@ +-- +-- TIMETZ +-- +CREATE TABLE TIMETZ_TBL (f1 time(2) with time zone); +INSERT INTO TIMETZ_TBL VALUES ('00:01 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('01:00 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('02:03 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('07:07 PST'); +INSERT INTO TIMETZ_TBL VALUES ('08:08 EDT'); +INSERT INTO TIMETZ_TBL VALUES ('11:59 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('12:00 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('12:01 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('23:59 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('11:59:59.99 PM PDT'); +INSERT INTO TIMETZ_TBL VALUES ('2003-03-07 15:36:39 America/New_York'); +INSERT INTO TIMETZ_TBL VALUES ('2003-07-07 15:36:39 America/New_York'); +-- this should fail (the timezone offset is not known) +INSERT INTO TIMETZ_TBL VALUES ('15:36:39 America/New_York'); +ERROR: invalid input syntax for type time with time zone: "15:36:39 America/New_York" +LINE 1: INSERT INTO TIMETZ_TBL VALUES ('15:36:39 America/New_York'); + ^ +-- this should fail (timezone not specified without a date) +INSERT INTO TIMETZ_TBL VALUES ('15:36:39 m2'); +ERROR: invalid input syntax for type time with time zone: "15:36:39 m2" +LINE 1: INSERT INTO TIMETZ_TBL VALUES ('15:36:39 m2'); + ^ +-- this should fail (dynamic timezone abbreviation without a date) +INSERT INTO TIMETZ_TBL VALUES ('15:36:39 MSK m2'); +ERROR: invalid input syntax for type time with time zone: "15:36:39 MSK m2" +LINE 1: INSERT INTO TIMETZ_TBL VALUES ('15:36:39 MSK m2'); + ^ +SELECT f1 AS "Time TZ" FROM TIMETZ_TBL; + Time TZ +---------------- + 00:01:00-07 + 01:00:00-07 + 02:03:00-07 + 07:07:00-08 + 08:08:00-04 + 11:59:00-07 + 12:00:00-07 + 12:01:00-07 + 23:59:00-07 + 23:59:59.99-07 + 15:36:39-05 + 15:36:39-04 +(12 rows) + +SELECT f1 AS "Three" FROM TIMETZ_TBL WHERE f1 < '05:06:07-07'; + Three +------------- + 00:01:00-07 + 01:00:00-07 + 02:03:00-07 +(3 rows) + +SELECT f1 AS "Seven" FROM TIMETZ_TBL WHERE f1 > '05:06:07-07'; + Seven +---------------- + 07:07:00-08 + 08:08:00-04 + 11:59:00-07 + 12:00:00-07 + 12:01:00-07 + 23:59:00-07 + 23:59:59.99-07 + 15:36:39-05 + 15:36:39-04 +(9 rows) + +SELECT f1 AS "None" FROM TIMETZ_TBL WHERE f1 < '00:00-07'; + None +------ +(0 rows) + +SELECT f1 AS "Ten" FROM TIMETZ_TBL WHERE f1 >= '00:00-07'; + Ten +---------------- + 00:01:00-07 + 01:00:00-07 + 02:03:00-07 + 07:07:00-08 + 08:08:00-04 + 11:59:00-07 + 12:00:00-07 + 12:01:00-07 + 23:59:00-07 + 23:59:59.99-07 + 15:36:39-05 + 15:36:39-04 +(12 rows) + +-- Check edge cases +SELECT '23:59:59.999999 PDT'::timetz; + timetz +-------------------- + 23:59:59.999999-07 +(1 row) + +SELECT '23:59:59.9999999 PDT'::timetz; -- rounds up + timetz +------------- + 24:00:00-07 +(1 row) + +SELECT '23:59:60 PDT'::timetz; -- rounds up + timetz +------------- + 24:00:00-07 +(1 row) + +SELECT '24:00:00 PDT'::timetz; -- allowed + timetz +------------- + 24:00:00-07 +(1 row) + +SELECT '24:00:00.01 PDT'::timetz; -- not allowed +ERROR: date/time field value out of range: "24:00:00.01 PDT" +LINE 1: SELECT '24:00:00.01 PDT'::timetz; + ^ +SELECT '23:59:60.01 PDT'::timetz; -- not allowed +ERROR: date/time field value out of range: "23:59:60.01 PDT" +LINE 1: SELECT '23:59:60.01 PDT'::timetz; + ^ +SELECT '24:01:00 PDT'::timetz; -- not allowed +ERROR: date/time field value out of range: "24:01:00 PDT" +LINE 1: SELECT '24:01:00 PDT'::timetz; + ^ +SELECT '25:00:00 PDT'::timetz; -- not allowed +ERROR: date/time field value out of range: "25:00:00 PDT" +LINE 1: SELECT '25:00:00 PDT'::timetz; + ^ +-- +-- TIME simple math +-- +-- We now make a distinction between time and intervals, +-- and adding two times together makes no sense at all. +-- Leave in one query to show that it is rejected, +-- and do the rest of the testing in horology.sql +-- where we do mixed-type arithmetic. - thomas 2000-12-02 +SELECT f1 + time with time zone '00:01' AS "Illegal" FROM TIMETZ_TBL; +ERROR: operator does not exist: time with time zone + time with time zone +LINE 1: SELECT f1 + time with time zone '00:01' AS "Illegal" FROM TI... + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +---------- + 25575401 +(1 row) + +SELECT EXTRACT(MILLISECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +----------- + 25575.401 +(1 row) + +SELECT EXTRACT(SECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +----------- + 25.575401 +(1 row) + +SELECT EXTRACT(MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +--------- + 30 +(1 row) + +SELECT EXTRACT(HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +--------- + 13 +(1 row) + +SELECT EXTRACT(DAY FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +ERROR: "time with time zone" units "day" not recognized +SELECT EXTRACT(FORTNIGHT FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +ERROR: "time with time zone" units "fortnight" not recognized +SELECT EXTRACT(TIMEZONE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); + extract +--------- + -16200 +(1 row) + +SELECT EXTRACT(TIMEZONE_HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); + extract +--------- + -4 +(1 row) + +SELECT EXTRACT(TIMEZONE_MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); + extract +--------- + -30 +(1 row) + +SELECT EXTRACT(EPOCH FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + extract +-------------- + 63025.575401 +(1 row) + +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + date_part +----------- + 25575401 +(1 row) + +SELECT date_part('millisecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + date_part +----------- + 25575.401 +(1 row) + +SELECT date_part('second', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + date_part +----------- + 25.575401 +(1 row) + +SELECT date_part('epoch', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + date_part +-------------- + 63025.575401 +(1 row) + diff --git a/src/test/singlenode_regress/expected/transactions.out b/src/test/singlenode_regress/expected/transactions.out new file mode 100644 index 00000000000..3675f8fb6be --- /dev/null +++ b/src/test/singlenode_regress/expected/transactions.out @@ -0,0 +1,1064 @@ +-- +-- TRANSACTIONS +-- +BEGIN; +SELECT * + INTO TABLE xacttest + FROM aggtest; +INSERT INTO xacttest (a, b) VALUES (777, 777.777); +END; +-- should retrieve one value-- +SELECT a FROM xacttest WHERE a > 100; + a +----- + 777 +(1 row) + +BEGIN; +CREATE TABLE disappear (a int4); +DELETE FROM aggtest; +-- should be empty +SELECT * FROM aggtest; + a | b +---+--- +(0 rows) + +ABORT; +-- should not exist +SELECT oid FROM pg_class WHERE relname = 'disappear'; + oid +----- +(0 rows) + +-- should have members again +SELECT * FROM aggtest; + a | b +-----+--------- + 56 | 7.8 + 100 | 99.097 + 0 | 0.09561 + 42 | 324.78 +(4 rows) + +-- Read-only tests +CREATE TABLE writetest (a int); +CREATE TEMPORARY TABLE temptest (a int); +BEGIN; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ ONLY, DEFERRABLE; -- ok +SELECT * FROM writetest; -- ok + a +--- +(0 rows) + +SET TRANSACTION READ WRITE; --fail +ERROR: transaction read-write mode must be set before any query +COMMIT; +BEGIN; +SET TRANSACTION READ ONLY; -- ok +SET TRANSACTION READ WRITE; -- ok +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok + a +--- +(0 rows) + +SAVEPOINT x; +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok + a +--- +(0 rows) + +SET TRANSACTION READ ONLY; -- ok +SET TRANSACTION READ WRITE; --fail +ERROR: cannot set transaction read-write mode inside a read-only transaction +COMMIT; +BEGIN; +SET TRANSACTION READ WRITE; -- ok +SAVEPOINT x; +SET TRANSACTION READ WRITE; -- ok +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok + a +--- +(0 rows) + +SET TRANSACTION READ ONLY; -- ok +SET TRANSACTION READ WRITE; --fail +ERROR: cannot set transaction read-write mode inside a read-only transaction +COMMIT; +BEGIN; +SET TRANSACTION READ WRITE; -- ok +SAVEPOINT x; +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok + a +--- +(0 rows) + +ROLLBACK TO SAVEPOINT x; +SHOW transaction_read_only; -- off + transaction_read_only +----------------------- + off +(1 row) + +SAVEPOINT y; +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok + a +--- +(0 rows) + +RELEASE SAVEPOINT y; +SHOW transaction_read_only; -- off + transaction_read_only +----------------------- + off +(1 row) + +COMMIT; +SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY; +DROP TABLE writetest; -- fail +ERROR: cannot execute DROP TABLE in a read-only transaction +INSERT INTO writetest VALUES (1); -- fail +ERROR: cannot execute INSERT in a read-only transaction +SELECT * FROM writetest; -- ok + a +--- +(0 rows) + +DELETE FROM temptest; -- ok +UPDATE temptest SET a = 0 FROM writetest WHERE temptest.a = 1 AND writetest.a = temptest.a; -- ok +PREPARE test AS UPDATE writetest SET a = 0; -- ok +EXECUTE test; -- fail +ERROR: cannot execute UPDATE in a read-only transaction +SELECT * FROM writetest, temptest; -- ok + a | a +---+--- +(0 rows) + +CREATE TABLE test AS SELECT * FROM writetest; -- fail +ERROR: cannot execute CREATE TABLE AS in a read-only transaction +START TRANSACTION READ WRITE; +DROP TABLE writetest; -- ok +COMMIT; +-- Subtransactions, basic tests +-- create & drop tables +SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE; +CREATE TABLE trans_foobar (a int); +BEGIN; + CREATE TABLE trans_foo (a int); + SAVEPOINT one; + DROP TABLE trans_foo; + CREATE TABLE trans_bar (a int); + ROLLBACK TO SAVEPOINT one; + RELEASE SAVEPOINT one; + SAVEPOINT two; + CREATE TABLE trans_baz (a int); + RELEASE SAVEPOINT two; + drop TABLE trans_foobar; + CREATE TABLE trans_barbaz (a int); +COMMIT; +-- should exist: trans_barbaz, trans_baz, trans_foo +SELECT * FROM trans_foo; -- should be empty + a +--- +(0 rows) + +SELECT * FROM trans_bar; -- shouldn't exist +ERROR: relation "trans_bar" does not exist +LINE 1: SELECT * FROM trans_bar; + ^ +SELECT * FROM trans_barbaz; -- should be empty + a +--- +(0 rows) + +SELECT * FROM trans_baz; -- should be empty + a +--- +(0 rows) + +-- inserts +BEGIN; + INSERT INTO trans_foo VALUES (1); + SAVEPOINT one; + INSERT into trans_bar VALUES (1); +ERROR: relation "trans_bar" does not exist +LINE 1: INSERT into trans_bar VALUES (1); + ^ + ROLLBACK TO one; + RELEASE SAVEPOINT one; + SAVEPOINT two; + INSERT into trans_barbaz VALUES (1); + RELEASE two; + SAVEPOINT three; + SAVEPOINT four; + INSERT INTO trans_foo VALUES (2); + RELEASE SAVEPOINT four; + ROLLBACK TO SAVEPOINT three; + RELEASE SAVEPOINT three; + INSERT INTO trans_foo VALUES (3); +COMMIT; +SELECT * FROM trans_foo; -- should have 1 and 3 + a +--- + 1 + 3 +(2 rows) + +SELECT * FROM trans_barbaz; -- should have 1 + a +--- + 1 +(1 row) + +-- test whole-tree commit +BEGIN; + SAVEPOINT one; + SELECT trans_foo; +ERROR: column "trans_foo" does not exist +LINE 1: SELECT trans_foo; + ^ + ROLLBACK TO SAVEPOINT one; + RELEASE SAVEPOINT one; + SAVEPOINT two; + CREATE TABLE savepoints (a int); + SAVEPOINT three; + INSERT INTO savepoints VALUES (1); + SAVEPOINT four; + INSERT INTO savepoints VALUES (2); + SAVEPOINT five; + INSERT INTO savepoints VALUES (3); + ROLLBACK TO SAVEPOINT five; +COMMIT; +COMMIT; -- should not be in a transaction block +WARNING: there is no transaction in progress +SELECT * FROM savepoints; + a +--- + 1 + 2 +(2 rows) + +-- test whole-tree rollback +BEGIN; + SAVEPOINT one; + DELETE FROM savepoints WHERE a=1; + RELEASE SAVEPOINT one; + SAVEPOINT two; + DELETE FROM savepoints WHERE a=1; + SAVEPOINT three; + DELETE FROM savepoints WHERE a=2; +ROLLBACK; +COMMIT; -- should not be in a transaction block +WARNING: there is no transaction in progress +SELECT * FROM savepoints; + a +--- + 1 + 2 +(2 rows) + +-- test whole-tree commit on an aborted subtransaction +BEGIN; + INSERT INTO savepoints VALUES (4); + SAVEPOINT one; + INSERT INTO savepoints VALUES (5); + SELECT trans_foo; +ERROR: column "trans_foo" does not exist +LINE 1: SELECT trans_foo; + ^ +COMMIT; +SELECT * FROM savepoints; + a +--- + 1 + 2 +(2 rows) + +BEGIN; + INSERT INTO savepoints VALUES (6); + SAVEPOINT one; + INSERT INTO savepoints VALUES (7); + RELEASE SAVEPOINT one; + INSERT INTO savepoints VALUES (8); +COMMIT; +-- rows 6 and 8 should have been created by the same xact +SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=6 AND b.a=8; + ?column? +---------- + t +(1 row) + +-- rows 6 and 7 should have been created by different xacts +SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=6 AND b.a=7; + ?column? +---------- + f +(1 row) + +BEGIN; + INSERT INTO savepoints VALUES (9); + SAVEPOINT one; + INSERT INTO savepoints VALUES (10); + ROLLBACK TO SAVEPOINT one; + INSERT INTO savepoints VALUES (11); +COMMIT; +SELECT a FROM savepoints WHERE a in (9, 10, 11); + a +---- + 9 + 11 +(2 rows) + +-- rows 9 and 11 should have been created by different xacts +SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=9 AND b.a=11; + ?column? +---------- + f +(1 row) + +BEGIN; + INSERT INTO savepoints VALUES (12); + SAVEPOINT one; + INSERT INTO savepoints VALUES (13); + SAVEPOINT two; + INSERT INTO savepoints VALUES (14); + ROLLBACK TO SAVEPOINT one; + INSERT INTO savepoints VALUES (15); + SAVEPOINT two; + INSERT INTO savepoints VALUES (16); + SAVEPOINT three; + INSERT INTO savepoints VALUES (17); +COMMIT; +SELECT a FROM savepoints WHERE a BETWEEN 12 AND 17; + a +---- + 12 + 15 + 16 + 17 +(4 rows) + +BEGIN; + INSERT INTO savepoints VALUES (18); + SAVEPOINT one; + INSERT INTO savepoints VALUES (19); + SAVEPOINT two; + INSERT INTO savepoints VALUES (20); + ROLLBACK TO SAVEPOINT one; + INSERT INTO savepoints VALUES (21); + ROLLBACK TO SAVEPOINT one; + INSERT INTO savepoints VALUES (22); +COMMIT; +SELECT a FROM savepoints WHERE a BETWEEN 18 AND 22; + a +---- + 18 + 22 +(2 rows) + +DROP TABLE savepoints; +-- only in a transaction block: +SAVEPOINT one; +ERROR: SAVEPOINT can only be used in transaction blocks +ROLLBACK TO SAVEPOINT one; +ERROR: ROLLBACK TO SAVEPOINT can only be used in transaction blocks +RELEASE SAVEPOINT one; +ERROR: RELEASE SAVEPOINT can only be used in transaction blocks +-- Only "rollback to" allowed in aborted state +BEGIN; + SAVEPOINT one; + SELECT 0/0; +ERROR: division by zero + SAVEPOINT two; -- ignored till the end of ... +ERROR: current transaction is aborted, commands ignored until end of transaction block + RELEASE SAVEPOINT one; -- ignored till the end of ... +ERROR: current transaction is aborted, commands ignored until end of transaction block + ROLLBACK TO SAVEPOINT one; + SELECT 1; + ?column? +---------- + 1 +(1 row) + +COMMIT; +SELECT 1; -- this should work + ?column? +---------- + 1 +(1 row) + +-- check non-transactional behavior of cursors +BEGIN; + DECLARE c CURSOR FOR SELECT unique2 FROM tenk1 ORDER BY unique2; + SAVEPOINT one; + FETCH 10 FROM c; + unique2 +--------- + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +(10 rows) + + ROLLBACK TO SAVEPOINT one; + FETCH 10 FROM c; + unique2 +--------- + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 +(10 rows) + + RELEASE SAVEPOINT one; + FETCH 10 FROM c; + unique2 +--------- + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 +(10 rows) + + CLOSE c; + DECLARE c CURSOR FOR SELECT unique2/0 FROM tenk1 ORDER BY unique2; + SAVEPOINT two; + FETCH 10 FROM c; +ERROR: division by zero + ROLLBACK TO SAVEPOINT two; + -- c is now dead to the world ... + FETCH 10 FROM c; +ERROR: portal "c" cannot be run + ROLLBACK TO SAVEPOINT two; + RELEASE SAVEPOINT two; + FETCH 10 FROM c; +ERROR: portal "c" cannot be run +COMMIT; +-- +-- Check that "stable" functions are really stable. They should not be +-- able to see the partial results of the calling query. (Ideally we would +-- also check that they don't see commits of concurrent transactions, but +-- that's a mite hard to do within the limitations of pg_regress.) +-- +select * from xacttest; + a | b +-----+--------- + 56 | 7.8 + 100 | 99.097 + 0 | 0.09561 + 42 | 324.78 + 777 | 777.777 +(5 rows) + +create or replace function max_xacttest() returns smallint language sql as +'select max(a) from xacttest' stable; +begin; +update xacttest set a = max_xacttest() + 10 where a > 0; +select * from xacttest; + a | b +-----+--------- + 0 | 0.09561 + 787 | 7.8 + 787 | 99.097 + 787 | 324.78 + 787 | 777.777 +(5 rows) + +rollback; +-- But a volatile function can see the partial results of the calling query +create or replace function max_xacttest() returns smallint language sql as +'select max(a) from xacttest' volatile; +begin; +update xacttest set a = max_xacttest() + 10 where a > 0; +select * from xacttest; + a | b +-----+--------- + 0 | 0.09561 + 787 | 7.8 + 797 | 99.097 + 807 | 324.78 + 817 | 777.777 +(5 rows) + +rollback; +-- Now the same test with plpgsql (since it depends on SPI which is different) +create or replace function max_xacttest() returns smallint language plpgsql as +'begin return max(a) from xacttest; end' stable; +begin; +update xacttest set a = max_xacttest() + 10 where a > 0; +select * from xacttest; + a | b +-----+--------- + 0 | 0.09561 + 787 | 7.8 + 787 | 99.097 + 787 | 324.78 + 787 | 777.777 +(5 rows) + +rollback; +create or replace function max_xacttest() returns smallint language plpgsql as +'begin return max(a) from xacttest; end' volatile; +begin; +update xacttest set a = max_xacttest() + 10 where a > 0; +select * from xacttest; + a | b +-----+--------- + 0 | 0.09561 + 787 | 7.8 + 797 | 99.097 + 807 | 324.78 + 817 | 777.777 +(5 rows) + +rollback; +-- test case for problems with dropping an open relation during abort +BEGIN; + savepoint x; + CREATE TABLE koju (a INT UNIQUE); + INSERT INTO koju VALUES (1); + INSERT INTO koju VALUES (1); +ERROR: duplicate key value violates unique constraint "koju_a_key" +DETAIL: Key (a)=(1) already exists. + rollback to x; + CREATE TABLE koju (a INT UNIQUE); + INSERT INTO koju VALUES (1); + INSERT INTO koju VALUES (1); +ERROR: duplicate key value violates unique constraint "koju_a_key" +DETAIL: Key (a)=(1) already exists. +ROLLBACK; +DROP TABLE trans_foo; +DROP TABLE trans_baz; +DROP TABLE trans_barbaz; +-- test case for problems with revalidating an open relation during abort +create function inverse(int) returns float8 as +$$ +begin + analyze revalidate_bug; + return 1::float8/$1; +exception + when division_by_zero then return 0; +end$$ language plpgsql volatile; +create table revalidate_bug (c float8 unique); +insert into revalidate_bug values (1); +insert into revalidate_bug values (inverse(0)); +drop table revalidate_bug; +drop function inverse(int); +-- verify that cursors created during an aborted subtransaction are +-- closed, but that we do not rollback the effect of any FETCHs +-- performed in the aborted subtransaction +begin; +savepoint x; +create table abc (a int); +insert into abc values (5); +insert into abc values (10); +declare foo cursor for select * from abc; +fetch from foo; + a +--- + 5 +(1 row) + +rollback to x; +-- should fail +fetch from foo; +ERROR: cursor "foo" does not exist +commit; +begin; +create table abc (a int); +insert into abc values (5); +insert into abc values (10); +insert into abc values (15); +declare foo cursor for select * from abc; +fetch from foo; + a +--- + 5 +(1 row) + +savepoint x; +fetch from foo; + a +---- + 10 +(1 row) + +rollback to x; +fetch from foo; + a +---- + 15 +(1 row) + +abort; +-- Test for proper cleanup after a failure in a cursor portal +-- that was created in an outer subtransaction +CREATE FUNCTION invert(x float8) RETURNS float8 LANGUAGE plpgsql AS +$$ begin return 1/x; end $$; +CREATE FUNCTION create_temp_tab() RETURNS text +LANGUAGE plpgsql AS $$ +BEGIN + CREATE TEMP TABLE new_table (f1 float8); + -- case of interest is that we fail while holding an open + -- relcache reference to new_table + INSERT INTO new_table SELECT invert(0.0); + RETURN 'foo'; +END $$; +BEGIN; +DECLARE ok CURSOR FOR SELECT * FROM int8_tbl; +DECLARE ctt CURSOR FOR SELECT create_temp_tab(); +FETCH ok; + q1 | q2 +-----+----- + 123 | 456 +(1 row) + +SAVEPOINT s1; +FETCH ok; -- should work + q1 | q2 +-----+------------------ + 123 | 4567890123456789 +(1 row) + +FETCH ctt; -- error occurs here +ERROR: division by zero +CONTEXT: PL/pgSQL function invert(double precision) line 1 at RETURN +SQL statement "INSERT INTO new_table SELECT invert(0.0)" +PL/pgSQL function create_temp_tab() line 6 at SQL statement +ROLLBACK TO s1; +FETCH ok; -- should work + q1 | q2 +------------------+----- + 4567890123456789 | 123 +(1 row) + +FETCH ctt; -- must be rejected +ERROR: portal "ctt" cannot be run +COMMIT; +DROP FUNCTION create_temp_tab(); +DROP FUNCTION invert(x float8); +-- Tests for AND CHAIN +CREATE TABLE abc (a int); +-- set nondefault value so we have something to override below +SET default_transaction_read_only = on; +START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE; +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + +INSERT INTO abc VALUES (1); +INSERT INTO abc VALUES (2); +COMMIT AND CHAIN; -- TBLOCK_END +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + +INSERT INTO abc VALUES ('error'); +ERROR: invalid input syntax for type integer: "error" +LINE 1: INSERT INTO abc VALUES ('error'); + ^ +INSERT INTO abc VALUES (3); -- check it's really aborted +ERROR: current transaction is aborted, commands ignored until end of transaction block +COMMIT AND CHAIN; -- TBLOCK_ABORT_END +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + +INSERT INTO abc VALUES (4); +COMMIT; +START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE; +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + +SAVEPOINT x; +INSERT INTO abc VALUES ('error'); +ERROR: invalid input syntax for type integer: "error" +LINE 1: INSERT INTO abc VALUES ('error'); + ^ +COMMIT AND CHAIN; -- TBLOCK_ABORT_PENDING +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + +INSERT INTO abc VALUES (5); +COMMIT; +START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE; +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + +SAVEPOINT x; +COMMIT AND CHAIN; -- TBLOCK_SUBCOMMIT +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + +COMMIT; +-- different mix of options just for fun +START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE, NOT DEFERRABLE; +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + off +(1 row) + +INSERT INTO abc VALUES (6); +ROLLBACK AND CHAIN; -- TBLOCK_ABORT_PENDING +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + off +(1 row) + +INSERT INTO abc VALUES ('error'); +ERROR: invalid input syntax for type integer: "error" +LINE 1: INSERT INTO abc VALUES ('error'); + ^ +ROLLBACK AND CHAIN; -- TBLOCK_ABORT_END +SHOW transaction_isolation; + transaction_isolation +----------------------- + repeatable read +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + off +(1 row) + +ROLLBACK; +-- not allowed outside a transaction block +COMMIT AND CHAIN; -- error +ERROR: COMMIT AND CHAIN can only be used in transaction blocks +ROLLBACK AND CHAIN; -- error +ERROR: ROLLBACK AND CHAIN can only be used in transaction blocks +SELECT * FROM abc ORDER BY 1; + a +--- + 1 + 2 + 4 + 5 +(4 rows) + +RESET default_transaction_read_only; +DROP TABLE abc; +-- Test assorted behaviors around the implicit transaction block created +-- when multiple SQL commands are sent in a single Query message. These +-- tests rely on the fact that psql will not break SQL commands apart at a +-- backslash-quoted semicolon, but will send them as one Query. +create temp table i_table (f1 int); +-- psql will show only the last result in a multi-statement Query +SELECT 1\; SELECT 2\; SELECT 3; + ?column? +---------- + 3 +(1 row) + +-- this implicitly commits: +insert into i_table values(1)\; select * from i_table; + f1 +---- + 1 +(1 row) + +-- 1/0 error will cause rolling back the whole implicit transaction +insert into i_table values(2)\; select * from i_table\; select 1/0; +ERROR: division by zero +select * from i_table; + f1 +---- + 1 +(1 row) + +rollback; -- we are not in a transaction at this point +WARNING: there is no transaction in progress +-- can use regular begin/commit/rollback within a single Query +begin\; insert into i_table values(3)\; commit; +rollback; -- we are not in a transaction at this point +WARNING: there is no transaction in progress +begin\; insert into i_table values(4)\; rollback; +rollback; -- we are not in a transaction at this point +WARNING: there is no transaction in progress +-- begin converts implicit transaction into a regular one that +-- can extend past the end of the Query +select 1\; begin\; insert into i_table values(5); +commit; +select 1\; begin\; insert into i_table values(6); +rollback; +-- commit in implicit-transaction state commits but issues a warning. +insert into i_table values(7)\; commit\; insert into i_table values(8)\; select 1/0; +WARNING: there is no transaction in progress +ERROR: division by zero +-- similarly, rollback aborts but issues a warning. +insert into i_table values(9)\; rollback\; select 2; +WARNING: there is no transaction in progress + ?column? +---------- + 2 +(1 row) + +select * from i_table; + f1 +---- + 1 + 3 + 5 + 7 +(4 rows) + +rollback; -- we are not in a transaction at this point +WARNING: there is no transaction in progress +-- implicit transaction block is still a transaction block, for e.g. VACUUM +SELECT 1\; VACUUM; +ERROR: VACUUM cannot run inside a transaction block +SELECT 1\; COMMIT\; VACUUM; +WARNING: there is no transaction in progress +ERROR: VACUUM cannot run inside a transaction block +-- we disallow savepoint-related commands in implicit-transaction state +SELECT 1\; SAVEPOINT sp; +ERROR: SAVEPOINT can only be used in transaction blocks +SELECT 1\; COMMIT\; SAVEPOINT sp; +WARNING: there is no transaction in progress +ERROR: SAVEPOINT can only be used in transaction blocks +ROLLBACK TO SAVEPOINT sp\; SELECT 2; +ERROR: ROLLBACK TO SAVEPOINT can only be used in transaction blocks +SELECT 2\; RELEASE SAVEPOINT sp\; SELECT 3; +ERROR: RELEASE SAVEPOINT can only be used in transaction blocks +-- but this is OK, because the BEGIN converts it to a regular xact +SELECT 1\; BEGIN\; SAVEPOINT sp\; ROLLBACK TO SAVEPOINT sp\; COMMIT; +-- Tests for AND CHAIN in implicit transaction blocks +SET TRANSACTION READ ONLY\; COMMIT AND CHAIN; -- error +ERROR: COMMIT AND CHAIN can only be used in transaction blocks +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SET TRANSACTION READ ONLY\; ROLLBACK AND CHAIN; -- error +ERROR: ROLLBACK AND CHAIN can only be used in transaction blocks +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +CREATE TABLE abc (a int); +-- COMMIT/ROLLBACK + COMMIT/ROLLBACK AND CHAIN +INSERT INTO abc VALUES (7)\; COMMIT\; INSERT INTO abc VALUES (8)\; COMMIT AND CHAIN; -- 7 commit, 8 error +WARNING: there is no transaction in progress +ERROR: COMMIT AND CHAIN can only be used in transaction blocks +INSERT INTO abc VALUES (9)\; ROLLBACK\; INSERT INTO abc VALUES (10)\; ROLLBACK AND CHAIN; -- 9 rollback, 10 error +WARNING: there is no transaction in progress +ERROR: ROLLBACK AND CHAIN can only be used in transaction blocks +-- COMMIT/ROLLBACK AND CHAIN + COMMIT/ROLLBACK +INSERT INTO abc VALUES (11)\; COMMIT AND CHAIN\; INSERT INTO abc VALUES (12)\; COMMIT; -- 11 error, 12 not reached +ERROR: COMMIT AND CHAIN can only be used in transaction blocks +INSERT INTO abc VALUES (13)\; ROLLBACK AND CHAIN\; INSERT INTO abc VALUES (14)\; ROLLBACK; -- 13 error, 14 not reached +ERROR: ROLLBACK AND CHAIN can only be used in transaction blocks +-- START TRANSACTION + COMMIT/ROLLBACK AND CHAIN +START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERT INTO abc VALUES (15)\; COMMIT AND CHAIN; -- 15 ok +SHOW transaction_isolation; -- transaction is active at this point + transaction_isolation +----------------------- + repeatable read +(1 row) + +COMMIT; +START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERT INTO abc VALUES (16)\; ROLLBACK AND CHAIN; -- 16 ok +SHOW transaction_isolation; -- transaction is active at this point + transaction_isolation +----------------------- + repeatable read +(1 row) + +ROLLBACK; +SET default_transaction_isolation = 'read committed'; +-- START TRANSACTION + COMMIT/ROLLBACK + COMMIT/ROLLBACK AND CHAIN +START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERT INTO abc VALUES (17)\; COMMIT\; INSERT INTO abc VALUES (18)\; COMMIT AND CHAIN; -- 17 commit, 18 error +ERROR: COMMIT AND CHAIN can only be used in transaction blocks +SHOW transaction_isolation; -- out of transaction block + transaction_isolation +----------------------- + read committed +(1 row) + +START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERT INTO abc VALUES (19)\; ROLLBACK\; INSERT INTO abc VALUES (20)\; ROLLBACK AND CHAIN; -- 19 rollback, 20 error +ERROR: ROLLBACK AND CHAIN can only be used in transaction blocks +SHOW transaction_isolation; -- out of transaction block + transaction_isolation +----------------------- + read committed +(1 row) + +RESET default_transaction_isolation; +SELECT * FROM abc ORDER BY 1; + a +---- + 7 + 15 + 17 +(3 rows) + +DROP TABLE abc; +-- Test for successful cleanup of an aborted transaction at session exit. +-- THIS MUST BE THE LAST TEST IN THIS FILE. +begin; +select 1/0; +ERROR: division by zero +rollback to X; +ERROR: savepoint "x" does not exist +-- DO NOT ADD ANYTHING HERE. diff --git a/src/test/singlenode_regress/expected/triggers.out b/src/test/singlenode_regress/expected/triggers.out new file mode 100644 index 00000000000..877e7e9d510 --- /dev/null +++ b/src/test/singlenode_regress/expected/triggers.out @@ -0,0 +1,3300 @@ +-- +-- TRIGGERS +-- +create table pkeys (pkey1 int4 not null, pkey2 text not null); +create table fkeys (fkey1 int4, fkey2 text, fkey3 int); +create table fkeys2 (fkey21 int4, fkey22 text, pkey23 int not null); +create index fkeys_i on fkeys (fkey1, fkey2); +create index fkeys2_i on fkeys2 (fkey21, fkey22); +create index fkeys2p_i on fkeys2 (pkey23); +insert into pkeys values (10, '1'); +insert into pkeys values (20, '2'); +insert into pkeys values (30, '3'); +insert into pkeys values (40, '4'); +insert into pkeys values (50, '5'); +insert into pkeys values (60, '6'); +create unique index pkeys_i on pkeys (pkey1, pkey2); +-- +-- For fkeys: +-- (fkey1, fkey2) --> pkeys (pkey1, pkey2) +-- (fkey3) --> fkeys2 (pkey23) +-- +create trigger check_fkeys_pkey_exist + before insert or update on fkeys + for each row + execute function + check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2'); +create trigger check_fkeys_pkey2_exist + before insert or update on fkeys + for each row + execute function check_primary_key ('fkey3', 'fkeys2', 'pkey23'); +-- +-- For fkeys2: +-- (fkey21, fkey22) --> pkeys (pkey1, pkey2) +-- +create trigger check_fkeys2_pkey_exist + before insert or update on fkeys2 + for each row + execute procedure + check_primary_key ('fkey21', 'fkey22', 'pkeys', 'pkey1', 'pkey2'); +-- Test comments +COMMENT ON TRIGGER check_fkeys2_pkey_bad ON fkeys2 IS 'wrong'; +ERROR: trigger "check_fkeys2_pkey_bad" for table "fkeys2" does not exist +COMMENT ON TRIGGER check_fkeys2_pkey_exist ON fkeys2 IS 'right'; +COMMENT ON TRIGGER check_fkeys2_pkey_exist ON fkeys2 IS NULL; +-- +-- For pkeys: +-- ON DELETE/UPDATE (pkey1, pkey2) CASCADE: +-- fkeys (fkey1, fkey2) and fkeys2 (fkey21, fkey22) +-- +create trigger check_pkeys_fkey_cascade + before delete or update on pkeys + for each row + execute procedure + check_foreign_key (2, 'cascade', 'pkey1', 'pkey2', + 'fkeys', 'fkey1', 'fkey2', 'fkeys2', 'fkey21', 'fkey22'); +-- +-- For fkeys2: +-- ON DELETE/UPDATE (pkey23) RESTRICT: +-- fkeys (fkey3) +-- +create trigger check_fkeys2_fkey_restrict + before delete or update on fkeys2 + for each row + execute procedure check_foreign_key (1, 'restrict', 'pkey23', 'fkeys', 'fkey3'); +insert into fkeys2 values (10, '1', 1); +insert into fkeys2 values (30, '3', 2); +insert into fkeys2 values (40, '4', 5); +insert into fkeys2 values (50, '5', 3); +-- no key in pkeys +insert into fkeys2 values (70, '5', 3); +ERROR: tuple references non-existent key +DETAIL: Trigger "check_fkeys2_pkey_exist" found tuple referencing non-existent key in "pkeys". +insert into fkeys values (10, '1', 2); +insert into fkeys values (30, '3', 3); +insert into fkeys values (40, '4', 2); +insert into fkeys values (50, '5', 2); +-- no key in pkeys +insert into fkeys values (70, '5', 1); +ERROR: tuple references non-existent key +DETAIL: Trigger "check_fkeys_pkey_exist" found tuple referencing non-existent key in "pkeys". +-- no key in fkeys2 +insert into fkeys values (60, '6', 4); +ERROR: tuple references non-existent key +DETAIL: Trigger "check_fkeys_pkey2_exist" found tuple referencing non-existent key in "fkeys2". +delete from pkeys where pkey1 = 30 and pkey2 = '3'; +NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted +ERROR: "check_fkeys2_fkey_restrict": tuple is referenced in "fkeys" +CONTEXT: SQL statement "delete from fkeys2 where fkey21 = $1 and fkey22 = $2 " +delete from pkeys where pkey1 = 40 and pkey2 = '4'; +NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted +NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys2 are deleted +update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 50 and pkey2 = '5'; +NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted +ERROR: "check_fkeys2_fkey_restrict": tuple is referenced in "fkeys" +CONTEXT: SQL statement "delete from fkeys2 where fkey21 = $1 and fkey22 = $2 " +update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 10 and pkey2 = '1'; +NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted +NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys2 are deleted +SELECT trigger_name, event_manipulation, event_object_schema, event_object_table, + action_order, action_condition, action_orientation, action_timing, + action_reference_old_table, action_reference_new_table + FROM information_schema.triggers + WHERE event_object_table in ('pkeys', 'fkeys', 'fkeys2') + ORDER BY trigger_name COLLATE "C", 2; + trigger_name | event_manipulation | event_object_schema | event_object_table | action_order | action_condition | action_orientation | action_timing | action_reference_old_table | action_reference_new_table +----------------------------+--------------------+---------------------+--------------------+--------------+------------------+--------------------+---------------+----------------------------+---------------------------- + check_fkeys2_fkey_restrict | DELETE | public | fkeys2 | 1 | | ROW | BEFORE | | + check_fkeys2_fkey_restrict | UPDATE | public | fkeys2 | 1 | | ROW | BEFORE | | + check_fkeys2_pkey_exist | INSERT | public | fkeys2 | 1 | | ROW | BEFORE | | + check_fkeys2_pkey_exist | UPDATE | public | fkeys2 | 2 | | ROW | BEFORE | | + check_fkeys_pkey2_exist | INSERT | public | fkeys | 1 | | ROW | BEFORE | | + check_fkeys_pkey2_exist | UPDATE | public | fkeys | 1 | | ROW | BEFORE | | + check_fkeys_pkey_exist | INSERT | public | fkeys | 2 | | ROW | BEFORE | | + check_fkeys_pkey_exist | UPDATE | public | fkeys | 2 | | ROW | BEFORE | | + check_pkeys_fkey_cascade | DELETE | public | pkeys | 1 | | ROW | BEFORE | | + check_pkeys_fkey_cascade | UPDATE | public | pkeys | 1 | | ROW | BEFORE | | +(10 rows) + +DROP TABLE pkeys; +DROP TABLE fkeys; +DROP TABLE fkeys2; +-- Check behavior when trigger returns unmodified trigtuple +create table trigtest (f1 int, f2 text); +create trigger trigger_return_old + before insert or delete or update on trigtest + for each row execute procedure trigger_return_old(); +insert into trigtest values(1, 'foo'); +select * from trigtest; + f1 | f2 +----+----- + 1 | foo +(1 row) + +update trigtest set f2 = f2 || 'bar'; +select * from trigtest; + f1 | f2 +----+----- + 1 | foo +(1 row) + +delete from trigtest; +select * from trigtest; + f1 | f2 +----+---- +(0 rows) + +-- Also check what happens when such a trigger runs before or after others +create function f1_times_10() returns trigger as +$$ begin new.f1 := new.f1 * 10; return new; end $$ language plpgsql; +create trigger trigger_alpha + before insert or update on trigtest + for each row execute procedure f1_times_10(); +insert into trigtest values(1, 'foo'); +select * from trigtest; + f1 | f2 +----+----- + 10 | foo +(1 row) + +update trigtest set f2 = f2 || 'bar'; +select * from trigtest; + f1 | f2 +----+----- + 10 | foo +(1 row) + +delete from trigtest; +select * from trigtest; + f1 | f2 +----+---- +(0 rows) + +create trigger trigger_zed + before insert or update on trigtest + for each row execute procedure f1_times_10(); +insert into trigtest values(1, 'foo'); +select * from trigtest; + f1 | f2 +-----+----- + 100 | foo +(1 row) + +update trigtest set f2 = f2 || 'bar'; +select * from trigtest; + f1 | f2 +------+----- + 1000 | foo +(1 row) + +delete from trigtest; +select * from trigtest; + f1 | f2 +----+---- +(0 rows) + +drop trigger trigger_alpha on trigtest; +insert into trigtest values(1, 'foo'); +select * from trigtest; + f1 | f2 +----+----- + 10 | foo +(1 row) + +update trigtest set f2 = f2 || 'bar'; +select * from trigtest; + f1 | f2 +-----+----- + 100 | foo +(1 row) + +delete from trigtest; +select * from trigtest; + f1 | f2 +----+---- +(0 rows) + +drop table trigtest; +-- Check behavior with an implicit column default, too (bug #16644) +create table trigtest ( + a integer, + b bool default true not null, + c text default 'xyzzy' not null); +create trigger trigger_return_old + before insert or delete or update on trigtest + for each row execute procedure trigger_return_old(); +insert into trigtest values(1); +select * from trigtest; + a | b | c +---+---+------- + 1 | t | xyzzy +(1 row) + +alter table trigtest add column d integer default 42 not null; +select * from trigtest; + a | b | c | d +---+---+-------+---- + 1 | t | xyzzy | 42 +(1 row) + +update trigtest set a = 2 where a = 1 returning *; + a | b | c | d +---+---+-------+---- + 1 | t | xyzzy | 42 +(1 row) + +select * from trigtest; + a | b | c | d +---+---+-------+---- + 1 | t | xyzzy | 42 +(1 row) + +alter table trigtest drop column b; +select * from trigtest; + a | c | d +---+-------+---- + 1 | xyzzy | 42 +(1 row) + +update trigtest set a = 2 where a = 1 returning *; + a | c | d +---+-------+---- + 1 | xyzzy | 42 +(1 row) + +select * from trigtest; + a | c | d +---+-------+---- + 1 | xyzzy | 42 +(1 row) + +drop table trigtest; +create sequence ttdummy_seq increment 10 start 0 minvalue 0 cache 1; +create table tttest ( + price_id int4, + price_val int4, + price_on int4, + price_off int4 default 999999 +); +create trigger ttdummy + before delete or update on tttest + for each row + execute procedure + ttdummy (price_on, price_off); +create trigger ttserial + before insert or update on tttest + for each row + execute procedure + autoinc (price_on, ttdummy_seq); +insert into tttest values (1, 1, null); +insert into tttest values (2, 2, null); +insert into tttest values (3, 3, 0); +select * from tttest; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 1 | 1 | 10 | 999999 + 2 | 2 | 20 | 999999 + 3 | 3 | 30 | 999999 +(3 rows) + +delete from tttest where price_id = 2; +select * from tttest; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 1 | 1 | 10 | 999999 + 3 | 3 | 30 | 999999 + 2 | 2 | 20 | 40 +(3 rows) + +-- what do we see ? +-- get current prices +select * from tttest where price_off = 999999; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 1 | 1 | 10 | 999999 + 3 | 3 | 30 | 999999 +(2 rows) + +-- change price for price_id == 3 +update tttest set price_val = 30 where price_id = 3; +select * from tttest; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 1 | 1 | 10 | 999999 + 2 | 2 | 20 | 40 + 3 | 30 | 50 | 999999 + 3 | 3 | 30 | 50 +(4 rows) + +-- now we want to change pric_id in ALL tuples +-- this gets us not what we need +update tttest set price_id = 5 where price_id = 3; +select * from tttest; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 1 | 1 | 10 | 999999 + 2 | 2 | 20 | 40 + 3 | 3 | 30 | 50 + 5 | 30 | 60 | 999999 + 3 | 30 | 50 | 60 +(5 rows) + +-- restore data as before last update: +select set_ttdummy(0); + set_ttdummy +------------- + 1 +(1 row) + +delete from tttest where price_id = 5; +update tttest set price_off = 999999 where price_val = 30; +select * from tttest; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 1 | 1 | 10 | 999999 + 2 | 2 | 20 | 40 + 3 | 3 | 30 | 50 + 3 | 30 | 50 | 999999 +(4 rows) + +-- and try change price_id now! +update tttest set price_id = 5 where price_id = 3; +select * from tttest; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 1 | 1 | 10 | 999999 + 2 | 2 | 20 | 40 + 5 | 3 | 30 | 50 + 5 | 30 | 50 | 999999 +(4 rows) + +-- isn't it what we need ? +select set_ttdummy(1); + set_ttdummy +------------- + 0 +(1 row) + +-- we want to correct some "date" +update tttest set price_on = -1 where price_id = 1; +ERROR: ttdummy (tttest): you cannot change price_on and/or price_off columns (use set_ttdummy) +-- but this doesn't work +-- try in this way +select set_ttdummy(0); + set_ttdummy +------------- + 1 +(1 row) + +update tttest set price_on = -1 where price_id = 1; +select * from tttest; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 2 | 2 | 20 | 40 + 5 | 3 | 30 | 50 + 5 | 30 | 50 | 999999 + 1 | 1 | -1 | 999999 +(4 rows) + +-- isn't it what we need ? +-- get price for price_id == 5 as it was @ "date" 35 +select * from tttest where price_on <= 35 and price_off > 35 and price_id = 5; + price_id | price_val | price_on | price_off +----------+-----------+----------+----------- + 5 | 3 | 30 | 50 +(1 row) + +drop table tttest; +drop sequence ttdummy_seq; +-- +-- tests for per-statement triggers +-- +CREATE TABLE log_table (tstamp timestamp default timeofday()::timestamp); +CREATE TABLE main_table (a int unique, b int); +COPY main_table (a,b) FROM stdin; +CREATE FUNCTION trigger_func() RETURNS trigger LANGUAGE plpgsql AS ' +BEGIN + RAISE NOTICE ''trigger_func(%) called: action = %, when = %, level = %'', TG_ARGV[0], TG_OP, TG_WHEN, TG_LEVEL; + RETURN NULL; +END;'; +CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON main_table +FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('before_ins_stmt'); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER after_ins_stmt_trig AFTER INSERT ON main_table +FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('after_ins_stmt'); +ERROR: Triggers for statements are not yet supported +-- +-- if neither 'FOR EACH ROW' nor 'FOR EACH STATEMENT' was specified, +-- CREATE TRIGGER should default to 'FOR EACH STATEMENT' +-- +CREATE TRIGGER after_upd_stmt_trig AFTER UPDATE ON main_table +EXECUTE PROCEDURE trigger_func('after_upd_stmt'); +ERROR: Triggers for statements are not yet supported +-- Both insert and update statement level triggers (before and after) should +-- fire. Doesn't fire UPDATE before trigger, but only because one isn't +-- defined. +INSERT INTO main_table (a, b) VALUES (5, 10) ON CONFLICT (a) + DO UPDATE SET b = EXCLUDED.b; +CREATE TRIGGER after_upd_row_trig AFTER UPDATE ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('after_upd_row'); +INSERT INTO main_table DEFAULT VALUES; +UPDATE main_table SET a = a + 1 WHERE b < 30; +NOTICE: trigger_func(after_upd_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_row) called: action = UPDATE, when = AFTER, level = ROW +-- UPDATE that effects zero rows should still call per-statement trigger +UPDATE main_table SET a = a + 2 WHERE b > 100; +-- constraint now unneeded +ALTER TABLE main_table DROP CONSTRAINT main_table_a_key; +-- COPY should fire per-row and per-statement INSERT triggers +COPY main_table (a, b) FROM stdin; +SELECT * FROM main_table ORDER BY a, b; + a | b +----+---- + 6 | 10 + 21 | 20 + 30 | 40 + 31 | 10 + 50 | 35 + 50 | 60 + 81 | 15 + | +(8 rows) + +-- +-- test triggers with WHEN clause +-- +CREATE TRIGGER modified_a BEFORE UPDATE OF a ON main_table +FOR EACH ROW WHEN (OLD.a <> NEW.a) EXECUTE PROCEDURE trigger_func('modified_a'); +CREATE TRIGGER modified_any BEFORE UPDATE OF a ON main_table +FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) EXECUTE PROCEDURE trigger_func('modified_any'); +CREATE TRIGGER insert_a AFTER INSERT ON main_table +FOR EACH ROW WHEN (NEW.a = 123) EXECUTE PROCEDURE trigger_func('insert_a'); +CREATE TRIGGER delete_a AFTER DELETE ON main_table +FOR EACH ROW WHEN (OLD.a = 123) EXECUTE PROCEDURE trigger_func('delete_a'); +CREATE TRIGGER insert_when BEFORE INSERT ON main_table +FOR EACH STATEMENT WHEN (true) EXECUTE PROCEDURE trigger_func('insert_when'); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER delete_when AFTER DELETE ON main_table +FOR EACH STATEMENT WHEN (true) EXECUTE PROCEDURE trigger_func('delete_when'); +ERROR: Triggers for statements are not yet supported +SELECT trigger_name, event_manipulation, event_object_schema, event_object_table, + action_order, action_condition, action_orientation, action_timing, + action_reference_old_table, action_reference_new_table + FROM information_schema.triggers + WHERE event_object_table IN ('main_table') + ORDER BY trigger_name COLLATE "C", 2; + trigger_name | event_manipulation | event_object_schema | event_object_table | action_order | action_condition | action_orientation | action_timing | action_reference_old_table | action_reference_new_table +--------------------+--------------------+---------------------+--------------------+--------------+--------------------------------+--------------------+---------------+----------------------------+---------------------------- + after_upd_row_trig | UPDATE | public | main_table | 1 | | ROW | AFTER | | + delete_a | DELETE | public | main_table | 1 | (old.a = 123) | ROW | AFTER | | + insert_a | INSERT | public | main_table | 1 | (new.a = 123) | ROW | AFTER | | + modified_a | UPDATE | public | main_table | 1 | (old.a <> new.a) | ROW | BEFORE | | + modified_any | UPDATE | public | main_table | 2 | (old.* IS DISTINCT FROM new.*) | ROW | BEFORE | | +(5 rows) + +INSERT INTO main_table (a) VALUES (123), (456); +NOTICE: trigger_func(insert_a) called: action = INSERT, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +COPY main_table FROM stdin; +NOTICE: trigger_func(insert_a) called: action = INSERT, when = AFTER, level = ROW +DELETE FROM main_table WHERE a IN (123, 456); +NOTICE: trigger_func(delete_a) called: action = DELETE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(delete_a) called: action = DELETE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +UPDATE main_table SET a = 50, b = 60; +NOTICE: trigger_func(modified_any) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(modified_any) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(modified_a) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(modified_a) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(modified_a) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(modified_a) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(modified_a) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(after_upd_row) called: action = UPDATE, when = AFTER, level = ROW +SELECT * FROM main_table ORDER BY a, b; + a | b +----+---- + 6 | 10 + 21 | 20 + 30 | 40 + 31 | 10 + 50 | 35 + 50 | 60 + 81 | 15 + | +(8 rows) + +SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; + pg_get_triggerdef +------------------------------------------------------------------------------------------------------------------------------------------- + CREATE TRIGGER modified_a BEFORE UPDATE OF a ON main_table FOR EACH ROW WHEN (old.a <> new.a) EXECUTE FUNCTION trigger_func('modified_a') +(1 row) + +SELECT pg_get_triggerdef(oid, false) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; + pg_get_triggerdef +---------------------------------------------------------------------------------------------------------------------------------------------------- + CREATE TRIGGER modified_a BEFORE UPDATE OF a ON public.main_table FOR EACH ROW WHEN ((old.a <> new.a)) EXECUTE FUNCTION trigger_func('modified_a') +(1 row) + +SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_any'; + pg_get_triggerdef +------------------------------------------------------------------------------------------------------------------------------------------------------------- + CREATE TRIGGER modified_any BEFORE UPDATE OF a ON main_table FOR EACH ROW WHEN (old.* IS DISTINCT FROM new.*) EXECUTE FUNCTION trigger_func('modified_any') +(1 row) + +-- Test RENAME TRIGGER +ALTER TRIGGER modified_a ON main_table RENAME TO modified_modified_a; +SELECT count(*) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_modified_a'; + count +------- + 1 +(1 row) + +DROP TRIGGER modified_modified_a ON main_table; +DROP TRIGGER modified_any ON main_table; +DROP TRIGGER insert_a ON main_table; +DROP TRIGGER delete_a ON main_table; +DROP TRIGGER insert_when ON main_table; +ERROR: trigger "insert_when" for table "main_table" does not exist +DROP TRIGGER delete_when ON main_table; +ERROR: trigger "delete_when" for table "main_table" does not exist +-- Test WHEN condition accessing system columns. +create table table_with_oids(a int); +insert into table_with_oids values (1); +create trigger oid_unchanged_trig after update on table_with_oids + for each row + when (new.tableoid = old.tableoid AND new.tableoid <> 0) + execute procedure trigger_func('after_upd_oid_unchanged'); +update table_with_oids set a = a + 1; +NOTICE: trigger_func(after_upd_oid_unchanged) called: action = UPDATE, when = AFTER, level = ROW +-- try again +update table_with_oids set a = a + 1; +NOTICE: trigger_func(after_upd_oid_unchanged) called: action = UPDATE, when = AFTER, level = ROW +drop table table_with_oids; +-- Test column-level triggers +DROP TRIGGER after_upd_row_trig ON main_table; +CREATE TRIGGER before_upd_a_row_trig BEFORE UPDATE OF a ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_upd_a_row'); +CREATE TRIGGER after_upd_b_row_trig AFTER UPDATE OF b ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('after_upd_b_row'); +CREATE TRIGGER after_upd_a_b_row_trig AFTER UPDATE OF a, b ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('after_upd_a_b_row'); +CREATE TRIGGER before_upd_a_stmt_trig BEFORE UPDATE OF a ON main_table +FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('before_upd_a_stmt'); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER after_upd_b_stmt_trig AFTER UPDATE OF b ON main_table +FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('after_upd_b_stmt'); +ERROR: Triggers for statements are not yet supported +SELECT pg_get_triggerdef(oid) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'after_upd_a_b_row_trig'; + pg_get_triggerdef +------------------------------------------------------------------------------------------------------------------------------------------------- + CREATE TRIGGER after_upd_a_b_row_trig AFTER UPDATE OF a, b ON public.main_table FOR EACH ROW EXECUTE FUNCTION trigger_func('after_upd_a_b_row') +(1 row) + +UPDATE main_table SET a = 50; +NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW +NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW +UPDATE main_table SET b = 10; +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg1 172.17.0.2:25433 pid=113597) +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg0 172.17.0.2:25432 pid=113596) +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg2 172.17.0.2:25434 pid=113598) +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg0 172.17.0.2:25432 pid=113596) +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg2 172.17.0.2:25434 pid=113598) +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg0 172.17.0.2:25432 pid=113596) +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg2 172.17.0.2:25434 pid=113598) +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg0 172.17.0.2:25432 pid=113596) +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW (seg2 172.17.0.2:25434 pid=113598) +-- +-- Test case for bug with BEFORE trigger followed by AFTER trigger with WHEN +-- +CREATE TABLE some_t (some_col boolean NOT NULL); +CREATE FUNCTION dummy_update_func() RETURNS trigger AS $$ +BEGIN + RAISE NOTICE 'dummy_update_func(%) called: action = %, old = %, new = %', + TG_ARGV[0], TG_OP, OLD, NEW; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER some_trig_before BEFORE UPDATE ON some_t FOR EACH ROW + EXECUTE PROCEDURE dummy_update_func('before'); +CREATE TRIGGER some_trig_aftera AFTER UPDATE ON some_t FOR EACH ROW + WHEN (NOT OLD.some_col AND NEW.some_col) + EXECUTE PROCEDURE dummy_update_func('aftera'); +CREATE TRIGGER some_trig_afterb AFTER UPDATE ON some_t FOR EACH ROW + WHEN (NOT NEW.some_col) + EXECUTE PROCEDURE dummy_update_func('afterb'); +INSERT INTO some_t VALUES (TRUE); +UPDATE some_t SET some_col = TRUE; +NOTICE: dummy_update_func(before) called: action = UPDATE, old = (t), new = (t) +UPDATE some_t SET some_col = FALSE; +NOTICE: dummy_update_func(before) called: action = UPDATE, old = (t), new = (f) +NOTICE: dummy_update_func(afterb) called: action = UPDATE, old = (t), new = (f) +UPDATE some_t SET some_col = TRUE; +NOTICE: dummy_update_func(before) called: action = UPDATE, old = (f), new = (t) +NOTICE: dummy_update_func(aftera) called: action = UPDATE, old = (f), new = (t) +DROP TABLE some_t; +-- bogus cases +CREATE TRIGGER error_upd_and_col BEFORE UPDATE OR UPDATE OF a ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('error_upd_and_col'); +ERROR: duplicate trigger events specified at or near "ON" +LINE 1: ...ER error_upd_and_col BEFORE UPDATE OR UPDATE OF a ON main_ta... + ^ +CREATE TRIGGER error_upd_a_a BEFORE UPDATE OF a, a ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('error_upd_a_a'); +ERROR: column "a" specified more than once +CREATE TRIGGER error_ins_a BEFORE INSERT OF a ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('error_ins_a'); +ERROR: syntax error at or near "OF" +LINE 1: CREATE TRIGGER error_ins_a BEFORE INSERT OF a ON main_table + ^ +CREATE TRIGGER error_ins_when BEFORE INSERT OR UPDATE ON main_table +FOR EACH ROW WHEN (OLD.a <> NEW.a) +EXECUTE PROCEDURE trigger_func('error_ins_old'); +ERROR: INSERT trigger's WHEN condition cannot reference OLD values +LINE 2: FOR EACH ROW WHEN (OLD.a <> NEW.a) + ^ +CREATE TRIGGER error_del_when BEFORE DELETE OR UPDATE ON main_table +FOR EACH ROW WHEN (OLD.a <> NEW.a) +EXECUTE PROCEDURE trigger_func('error_del_new'); +ERROR: DELETE trigger's WHEN condition cannot reference NEW values +LINE 2: FOR EACH ROW WHEN (OLD.a <> NEW.a) + ^ +CREATE TRIGGER error_del_when BEFORE INSERT OR UPDATE ON main_table +FOR EACH ROW WHEN (NEW.tableoid <> 0) +EXECUTE PROCEDURE trigger_func('error_when_sys_column'); +ERROR: BEFORE trigger's WHEN condition cannot reference NEW system columns +LINE 2: FOR EACH ROW WHEN (NEW.tableoid <> 0) + ^ +CREATE TRIGGER error_stmt_when BEFORE UPDATE OF a ON main_table +FOR EACH STATEMENT WHEN (OLD.* IS DISTINCT FROM NEW.*) +EXECUTE PROCEDURE trigger_func('error_stmt_when'); +ERROR: Triggers for statements are not yet supported +-- check dependency restrictions +ALTER TABLE main_table DROP COLUMN b; +ERROR: cannot drop column b of table main_table because other objects depend on it +DETAIL: trigger after_upd_b_row_trig on table main_table depends on column b of table main_table +trigger after_upd_a_b_row_trig on table main_table depends on column b of table main_table +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- this should succeed, but we'll roll it back to keep the triggers around +begin; +DROP TRIGGER after_upd_a_b_row_trig ON main_table; +DROP TRIGGER after_upd_b_row_trig ON main_table; +-- DROP TRIGGER after_upd_b_stmt_trig ON main_table; +ALTER TABLE main_table DROP COLUMN b; +rollback; +-- Test enable/disable triggers +create table trigtest (i serial primary key); +-- test that disabling RI triggers works +create table trigtest2 (i int references trigtest(i) on delete cascade); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i' as the Cloudberry Database 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: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +create function trigtest() returns trigger as $$ +begin + raise notice '% % % %', TG_TABLE_NAME, TG_OP, TG_WHEN, TG_LEVEL; + return new; +end;$$ language plpgsql; +create trigger trigtest_b_row_tg before insert or update or delete on trigtest +for each row execute procedure trigtest(); +create trigger trigtest_a_row_tg after insert or update or delete on trigtest +for each row execute procedure trigtest(); +create trigger trigtest_b_stmt_tg before insert or update or delete on trigtest +for each statement execute procedure trigtest(); +ERROR: Triggers for statements are not yet supported +create trigger trigtest_a_stmt_tg after insert or update or delete on trigtest +for each statement execute procedure trigtest(); +ERROR: Triggers for statements are not yet supported +insert into trigtest default values; +NOTICE: trigtest INSERT BEFORE ROW (seg2 172.17.0.2:25434 pid=113598) +NOTICE: trigtest INSERT AFTER ROW (seg2 172.17.0.2:25434 pid=113598) +alter table trigtest disable trigger trigtest_b_row_tg; +insert into trigtest default values; +NOTICE: trigtest INSERT AFTER ROW (seg1 172.17.0.2:25433 pid=113597) +alter table trigtest disable trigger user; +insert into trigtest default values; +alter table trigtest enable trigger trigtest_a_stmt_tg; +ERROR: trigger "trigtest_a_stmt_tg" for table "trigtest" does not exist +insert into trigtest default values; +set session_replication_role = replica; +insert into trigtest default values; -- does not trigger +alter table trigtest enable always trigger trigtest_a_stmt_tg; +ERROR: trigger "trigtest_a_stmt_tg" for table "trigtest" does not exist +insert into trigtest default values; -- now it does +reset session_replication_role; +insert into trigtest2 values(1); +insert into trigtest2 values(2); +delete from trigtest where i=2; +select * from trigtest2; + i +--- + 2 + 1 +(2 rows) + +alter table trigtest disable trigger all; +delete from trigtest where i=1; +select * from trigtest2; + i +--- + 2 + 1 +(2 rows) + +-- ensure we still insert, even when all triggers are disabled +insert into trigtest default values; +select * from trigtest; + i +--- + 3 + 4 + 5 + 6 + 7 +(5 rows) + +drop table trigtest2; +drop table trigtest; +-- dump trigger data +CREATE TABLE trigger_test ( + i int, + v varchar +); +CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger +LANGUAGE plpgsql AS $$ + +declare + + argstr text; + relid text; + +begin + + relid := TG_relid::regclass; + + -- plpgsql can't discover its trigger data in a hash like perl and python + -- can, or by a sort of reflection like tcl can, + -- so we have to hard code the names. + raise NOTICE 'TG_NAME: %', TG_name; + raise NOTICE 'TG_WHEN: %', TG_when; + raise NOTICE 'TG_LEVEL: %', TG_level; + raise NOTICE 'TG_OP: %', TG_op; + raise NOTICE 'TG_RELID::regclass: %', relid; + raise NOTICE 'TG_RELNAME: %', TG_relname; + raise NOTICE 'TG_TABLE_NAME: %', TG_table_name; + raise NOTICE 'TG_TABLE_SCHEMA: %', TG_table_schema; + raise NOTICE 'TG_NARGS: %', TG_nargs; + + argstr := '['; + for i in 0 .. TG_nargs - 1 loop + if i > 0 then + argstr := argstr || ', '; + end if; + argstr := argstr || TG_argv[i]; + end loop; + argstr := argstr || ']'; + raise NOTICE 'TG_ARGV: %', argstr; + + if TG_OP != 'INSERT' then + raise NOTICE 'OLD: %', OLD; + end if; + + if TG_OP != 'DELETE' then + raise NOTICE 'NEW: %', NEW; + end if; + + if TG_OP = 'DELETE' then + return OLD; + else + return NEW; + end if; + +end; +$$; +CREATE TRIGGER show_trigger_data_trig +BEFORE INSERT OR UPDATE OR DELETE ON trigger_test +FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo'); +insert into trigger_test values(1,'insert'); +NOTICE: TG_NAME: show_trigger_data_trig +NOTICE: TG_WHEN: BEFORE +NOTICE: TG_LEVEL: ROW +NOTICE: TG_OP: INSERT +NOTICE: TG_RELID::regclass: trigger_test +NOTICE: TG_RELNAME: trigger_test +NOTICE: TG_TABLE_NAME: trigger_test +NOTICE: TG_TABLE_SCHEMA: public +NOTICE: TG_NARGS: 2 +NOTICE: TG_ARGV: [23, skidoo] +NOTICE: NEW: (1,insert) +update trigger_test set v = 'update' where i = 1; +NOTICE: TG_NAME: show_trigger_data_trig +NOTICE: TG_WHEN: BEFORE +NOTICE: TG_LEVEL: ROW +NOTICE: TG_OP: UPDATE +NOTICE: TG_RELID::regclass: trigger_test +NOTICE: TG_RELNAME: trigger_test +NOTICE: TG_TABLE_NAME: trigger_test +NOTICE: TG_TABLE_SCHEMA: public +NOTICE: TG_NARGS: 2 +NOTICE: TG_ARGV: [23, skidoo] +NOTICE: OLD: (1,insert) +NOTICE: NEW: (1,update) +delete from trigger_test; +NOTICE: TG_NAME: show_trigger_data_trig +NOTICE: TG_WHEN: BEFORE +NOTICE: TG_LEVEL: ROW +NOTICE: TG_OP: DELETE +NOTICE: TG_RELID::regclass: trigger_test +NOTICE: TG_RELNAME: trigger_test +NOTICE: TG_TABLE_NAME: trigger_test +NOTICE: TG_TABLE_SCHEMA: public +NOTICE: TG_NARGS: 2 +NOTICE: TG_ARGV: [23, skidoo] +NOTICE: OLD: (1,update) +DROP TRIGGER show_trigger_data_trig on trigger_test; +DROP FUNCTION trigger_data(); +DROP TABLE trigger_test; +-- +-- Test use of row comparisons on OLD/NEW +-- +CREATE TABLE trigger_test (dkey int, f1 int, f2 text, f3 text); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'dkey' as the Cloudberry Database 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. +-- this is the obvious (and wrong...) way to compare rows +CREATE FUNCTION mytrigger() RETURNS trigger LANGUAGE plpgsql as $$ +begin + if row(old.*) = row(new.*) then + raise notice 'row % not changed', new.f1; + else + raise notice 'row % changed', new.f1; + end if; + return new; +end$$; +CREATE TRIGGER t +BEFORE UPDATE ON trigger_test +FOR EACH ROW EXECUTE PROCEDURE mytrigger(); +INSERT INTO trigger_test VALUES(0, 1, 'foo', 'bar'); +INSERT INTO trigger_test VALUES(0, 2, 'baz', 'quux'); +UPDATE trigger_test SET f3 = 'bar'; +NOTICE: row 1 not changed +NOTICE: row 2 changed +UPDATE trigger_test SET f3 = NULL; +NOTICE: row 1 changed +NOTICE: row 2 changed +-- this demonstrates that the above isn't really working as desired: +UPDATE trigger_test SET f3 = NULL; +NOTICE: row 1 changed +NOTICE: row 2 changed +-- the right way when considering nulls is +CREATE OR REPLACE FUNCTION mytrigger() RETURNS trigger LANGUAGE plpgsql as $$ +begin + if row(old.*) is distinct from row(new.*) then + raise notice 'row % changed', new.f1; + else + raise notice 'row % not changed', new.f1; + end if; + return new; +end$$; +UPDATE trigger_test SET f3 = 'bar'; +NOTICE: row 1 changed +NOTICE: row 2 changed +UPDATE trigger_test SET f3 = NULL; +NOTICE: row 1 changed +NOTICE: row 2 changed +UPDATE trigger_test SET f3 = NULL; +NOTICE: row 1 not changed +NOTICE: row 2 not changed +DROP TABLE trigger_test; +DROP FUNCTION mytrigger(); +-- Test snapshot management in serializable transactions involving triggers +-- per bug report in 6bc73d4c0910042358k3d1adff3qa36f8df75198ecea@mail.gmail.com +CREATE FUNCTION serializable_update_trig() RETURNS trigger LANGUAGE plpgsql AS +$$ +declare + rec record; +begin + new.description = 'updated in trigger'; + return new; +end; +$$; +CREATE TABLE serializable_update_tab ( + id int, + filler text, + description text +); +CREATE TRIGGER serializable_update_trig BEFORE UPDATE ON serializable_update_tab + FOR EACH ROW EXECUTE PROCEDURE serializable_update_trig(); +INSERT INTO serializable_update_tab SELECT a, repeat('xyzxz', 100), 'new' + FROM generate_series(1, 50) a; +BEGIN; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE serializable_update_tab SET description = 'no no', id = 1 WHERE id = 1; +COMMIT; +SELECT description FROM serializable_update_tab WHERE id = 1; + description +-------------------- + updated in trigger +(1 row) + +DROP TABLE serializable_update_tab; +-- minimal update trigger +CREATE TABLE min_updates_test ( + f1 text, + f2 int, + f3 int); +INSERT INTO min_updates_test VALUES ('a',1,2),('b','2',null); +CREATE TRIGGER z_min_update +BEFORE UPDATE ON min_updates_test +FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); +\set QUIET false +UPDATE min_updates_test SET f1 = f1; +UPDATE 0 +UPDATE min_updates_test SET f2 = f2 + 1; +UPDATE 2 +UPDATE min_updates_test SET f3 = 2 WHERE f3 is null; +UPDATE 1 +\set QUIET true +SELECT * FROM min_updates_test; + f1 | f2 | f3 +----+----+---- + a | 2 | 2 + b | 3 | 2 +(2 rows) + +DROP TABLE min_updates_test; +-- +-- Test triggers on views +-- +CREATE VIEW main_view AS SELECT a, b FROM main_table; +-- VIEW trigger function +CREATE OR REPLACE FUNCTION view_trigger() RETURNS trigger +LANGUAGE plpgsql AS $$ +declare + argstr text := ''; +begin + for i in 0 .. TG_nargs - 1 loop + if i > 0 then + argstr := argstr || ', '; + end if; + argstr := argstr || TG_argv[i]; + end loop; + + raise notice '% % % % (%)', TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL, argstr; + + if TG_LEVEL = 'ROW' then + if TG_OP = 'INSERT' then + raise NOTICE 'NEW: %', NEW; + INSERT INTO main_table VALUES (NEW.a, NEW.b); + RETURN NEW; + end if; + + if TG_OP = 'UPDATE' then + raise NOTICE 'OLD: %, NEW: %', OLD, NEW; + UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b; + if NOT FOUND then RETURN NULL; end if; + RETURN NEW; + end if; + + if TG_OP = 'DELETE' then + raise NOTICE 'OLD: %', OLD; + DELETE FROM main_table WHERE a = OLD.a AND b = OLD.b; + if NOT FOUND then RETURN NULL; end if; + RETURN OLD; + end if; + end if; + + RETURN NULL; +end; +$$; +-- Before row triggers aren't allowed on views +CREATE TRIGGER invalid_trig BEFORE INSERT ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_ins_row'); +ERROR: "main_view" is a view +DETAIL: Views cannot have row-level BEFORE or AFTER triggers. +CREATE TRIGGER invalid_trig BEFORE UPDATE ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_upd_row'); +ERROR: "main_view" is a view +DETAIL: Views cannot have row-level BEFORE or AFTER triggers. +CREATE TRIGGER invalid_trig BEFORE DELETE ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_del_row'); +ERROR: "main_view" is a view +DETAIL: Views cannot have row-level BEFORE or AFTER triggers. +-- After row triggers aren't allowed on views +CREATE TRIGGER invalid_trig AFTER INSERT ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_ins_row'); +ERROR: "main_view" is a view +DETAIL: Views cannot have row-level BEFORE or AFTER triggers. +CREATE TRIGGER invalid_trig AFTER UPDATE ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_upd_row'); +ERROR: "main_view" is a view +DETAIL: Views cannot have row-level BEFORE or AFTER triggers. +CREATE TRIGGER invalid_trig AFTER DELETE ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_del_row'); +ERROR: "main_view" is a view +DETAIL: Views cannot have row-level BEFORE or AFTER triggers. +-- Truncate triggers aren't allowed on views +CREATE TRIGGER invalid_trig BEFORE TRUNCATE ON main_view +EXECUTE PROCEDURE trigger_func('before_tru_row'); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER invalid_trig AFTER TRUNCATE ON main_view +EXECUTE PROCEDURE trigger_func('before_tru_row'); +ERROR: Triggers for statements are not yet supported +-- INSTEAD OF triggers aren't allowed on tables +CREATE TRIGGER invalid_trig INSTEAD OF INSERT ON main_table +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_ins'); +ERROR: "main_table" is a table +DETAIL: Tables cannot have INSTEAD OF triggers. +CREATE TRIGGER invalid_trig INSTEAD OF UPDATE ON main_table +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_upd'); +ERROR: "main_table" is a table +DETAIL: Tables cannot have INSTEAD OF triggers. +CREATE TRIGGER invalid_trig INSTEAD OF DELETE ON main_table +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_del'); +ERROR: "main_table" is a table +DETAIL: Tables cannot have INSTEAD OF triggers. +-- Don't support WHEN clauses with INSTEAD OF triggers +CREATE TRIGGER invalid_trig INSTEAD OF UPDATE ON main_view +FOR EACH ROW WHEN (OLD.a <> NEW.a) EXECUTE PROCEDURE view_trigger('instead_of_upd'); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +-- Don't support column-level INSTEAD OF triggers +CREATE TRIGGER invalid_trig INSTEAD OF UPDATE OF a ON main_view +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_upd'); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +-- Don't support statement-level INSTEAD OF triggers +CREATE TRIGGER invalid_trig INSTEAD OF UPDATE ON main_view +EXECUTE PROCEDURE view_trigger('instead_of_upd'); +ERROR: Triggers for statements are not yet supported +-- Valid INSTEAD OF triggers +CREATE TRIGGER instead_of_insert_trig INSTEAD OF INSERT ON main_view +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_ins'); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +CREATE TRIGGER instead_of_update_trig INSTEAD OF UPDATE ON main_view +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_upd'); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +CREATE TRIGGER instead_of_delete_trig INSTEAD OF DELETE ON main_view +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_del'); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +-- Valid BEFORE statement VIEW triggers +CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('before_view_ins_stmt'); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER before_upd_stmt_trig BEFORE UPDATE ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('before_view_upd_stmt'); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER before_del_stmt_trig BEFORE DELETE ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('before_view_del_stmt'); +ERROR: Triggers for statements are not yet supported +-- Valid AFTER statement VIEW triggers +CREATE TRIGGER after_ins_stmt_trig AFTER INSERT ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('after_view_ins_stmt'); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER after_upd_stmt_trig AFTER UPDATE ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('after_view_upd_stmt'); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER after_del_stmt_trig AFTER DELETE ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('after_view_del_stmt'); +ERROR: Triggers for statements are not yet supported +\set QUIET false +-- Insert into view using trigger +INSERT INTO main_view VALUES (20, 30); +INSERT 0 1 +INSERT INTO main_view VALUES (21, 31) RETURNING a, b; + a | b +----+---- + 21 | 31 +(1 row) + +INSERT 0 1 +-- Table trigger will prevent updates +UPDATE main_view SET b = 31 WHERE a = 20; +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW +UPDATE 1 +UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW + a | b +----+---- + 21 | 32 +(1 row) + +UPDATE 1 +-- Remove table trigger to allow updates +DROP TRIGGER before_upd_a_row_trig ON main_table; +DROP TRIGGER +UPDATE main_view SET b = 31 WHERE a = 20; +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW +NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW +UPDATE 1 +UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; + a | b +---+--- +(0 rows) + +UPDATE 0 +-- Before and after stmt triggers should fire even when no rows are affected +UPDATE main_view SET b = 0 WHERE false; +UPDATE 0 +-- Delete from view using trigger +DELETE FROM main_view WHERE a IN (20,21); +DELETE 3 +DELETE FROM main_view WHERE a = 31 RETURNING a, b; + a | b +----+---- + 31 | 10 +(1 row) + +DELETE 1 +\set QUIET true +-- Describe view should list triggers +\d main_view + View "public.main_view" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + +-- Test dropping view triggers +DROP TRIGGER instead_of_insert_trig ON main_view; +ERROR: trigger "instead_of_insert_trig" for table "main_view" does not exist +DROP TRIGGER instead_of_delete_trig ON main_view; +ERROR: trigger "instead_of_delete_trig" for table "main_view" does not exist +\d+ main_view + View "public.main_view" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + a | integer | | | | plain | + b | integer | | | | plain | +View definition: + SELECT main_table.a, + main_table.b + FROM main_table; + +DROP VIEW main_view; +-- +-- Test triggers on a join view +-- GPDB ignore this test: don't support modifications on views. +-- +CREATE TABLE country_table ( + country_id serial primary key, + country_name text not null, + continent text not null +); +INSERT INTO country_table (country_name, continent) + VALUES ('Japan', 'Asia'), + ('UK', 'Europe'), + ('USA', 'North America') + RETURNING *; + country_id | country_name | continent +------------+--------------+--------------- + 1 | Japan | Asia + 2 | UK | Europe + 3 | USA | North America +(3 rows) + +CREATE TABLE city_table ( + city_id serial primary key, + city_name text not null, + population bigint, + country_id int references country_table +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +CREATE VIEW city_view AS + SELECT city_id, city_name, population, country_name, continent + FROM city_table ci + LEFT JOIN country_table co ON co.country_id = ci.country_id; +CREATE FUNCTION city_insert() RETURNS trigger LANGUAGE plpgsql AS $$ +declare + ctry_id int; +begin + if NEW.country_name IS NOT NULL then + SELECT country_id, continent INTO ctry_id, NEW.continent + FROM country_table WHERE country_name = NEW.country_name; + if NOT FOUND then + raise exception 'No such country: "%"', NEW.country_name; + end if; + else + NEW.continent := NULL; + end if; + + if NEW.city_id IS NOT NULL then + INSERT INTO city_table + VALUES(NEW.city_id, NEW.city_name, NEW.population, ctry_id); + else + INSERT INTO city_table(city_name, population, country_id) + VALUES(NEW.city_name, NEW.population, ctry_id) + RETURNING city_id INTO NEW.city_id; + end if; + + RETURN NEW; +end; +$$; +CREATE TRIGGER city_insert_trig INSTEAD OF INSERT ON city_view +FOR EACH ROW EXECUTE PROCEDURE city_insert(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +CREATE FUNCTION city_delete() RETURNS trigger LANGUAGE plpgsql AS $$ +begin + DELETE FROM city_table WHERE city_id = OLD.city_id; + if NOT FOUND then RETURN NULL; end if; + RETURN OLD; +end; +$$; +CREATE TRIGGER city_delete_trig INSTEAD OF DELETE ON city_view +FOR EACH ROW EXECUTE PROCEDURE city_delete(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +CREATE FUNCTION city_update() RETURNS trigger LANGUAGE plpgsql AS $$ +declare + ctry_id int; +begin + if NEW.country_name IS DISTINCT FROM OLD.country_name then + SELECT country_id, continent INTO ctry_id, NEW.continent + FROM country_table WHERE country_name = NEW.country_name; + if NOT FOUND then + raise exception 'No such country: "%"', NEW.country_name; + end if; + + UPDATE city_table SET city_name = NEW.city_name, + population = NEW.population, + country_id = ctry_id + WHERE city_id = OLD.city_id; + else + UPDATE city_table SET city_name = NEW.city_name, + population = NEW.population + WHERE city_id = OLD.city_id; + NEW.continent := OLD.continent; + end if; + + if NOT FOUND then RETURN NULL; end if; + RETURN NEW; +end; +$$; +CREATE TRIGGER city_update_trig INSTEAD OF UPDATE ON city_view +FOR EACH ROW EXECUTE PROCEDURE city_update(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +\set QUIET false +-- INSERT .. RETURNING +INSERT INTO city_view(city_name) VALUES('Tokyo') RETURNING *; +ERROR: cannot insert into view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +INSERT INTO city_view(city_name, population) VALUES('London', 7556900) RETURNING *; +ERROR: cannot insert into view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +INSERT INTO city_view(city_name, country_name) VALUES('Washington DC', 'USA') RETURNING *; +ERROR: cannot insert into view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +INSERT INTO city_view(city_id, city_name) VALUES(123456, 'New York') RETURNING *; +ERROR: cannot insert into view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +INSERT INTO city_view VALUES(234567, 'Birmingham', 1016800, 'UK', 'EU') RETURNING *; +ERROR: cannot insert into view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +-- UPDATE .. RETURNING +UPDATE city_view SET country_name = 'Japon' WHERE city_name = 'Tokyo'; -- error +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE city_view SET country_name = 'Japan' WHERE city_name = 'Takyo'; -- no match +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE city_view SET country_name = 'Japan' WHERE city_name = 'Tokyo' RETURNING *; -- OK +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE city_view SET population = 13010279 WHERE city_name = 'Tokyo' RETURNING *; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE city_view SET country_name = 'UK' WHERE city_name = 'New York' RETURNING *; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE city_view SET country_name = 'USA', population = 8391881 WHERE city_name = 'New York' RETURNING *; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE city_view SET continent = 'EU' WHERE continent = 'Europe' RETURNING *; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE city_view v1 SET country_name = v2.country_name FROM city_view v2 + WHERE v2.city_name = 'Birmingham' AND v1.city_name = 'London' RETURNING *; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +-- DELETE .. RETURNING +DELETE FROM city_view WHERE city_name = 'Birmingham' RETURNING *; +ERROR: cannot delete from view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +\set QUIET true +-- read-only view with WHERE clause +CREATE VIEW european_city_view AS + SELECT * FROM city_view WHERE continent = 'Europe'; +SELECT count(*) FROM european_city_view; + count +------- + 0 +(1 row) + +CREATE FUNCTION no_op_trig_fn() RETURNS trigger LANGUAGE plpgsql +AS 'begin RETURN NULL; end'; +CREATE TRIGGER no_op_trig INSTEAD OF INSERT OR UPDATE OR DELETE +ON european_city_view FOR EACH ROW EXECUTE PROCEDURE no_op_trig_fn(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +\set QUIET false +INSERT INTO european_city_view VALUES (0, 'x', 10000, 'y', 'z'); +ERROR: cannot insert into view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +UPDATE european_city_view SET population = 10000; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +DELETE FROM european_city_view; +ERROR: cannot delete from view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +\set QUIET true +-- rules bypassing no-op triggers +CREATE RULE european_city_insert_rule AS ON INSERT TO european_city_view +DO INSTEAD INSERT INTO city_view +VALUES (NEW.city_id, NEW.city_name, NEW.population, NEW.country_name, NEW.continent) +RETURNING *; +CREATE RULE european_city_update_rule AS ON UPDATE TO european_city_view +DO INSTEAD UPDATE city_view SET + city_name = NEW.city_name, + population = NEW.population, + country_name = NEW.country_name +WHERE city_id = OLD.city_id +RETURNING NEW.*; +CREATE RULE european_city_delete_rule AS ON DELETE TO european_city_view +DO INSTEAD DELETE FROM city_view WHERE city_id = OLD.city_id RETURNING *; +\set QUIET false +-- INSERT not limited by view's WHERE clause, but UPDATE AND DELETE are +INSERT INTO european_city_view(city_name, country_name) + VALUES ('Cambridge', 'USA') RETURNING *; +ERROR: cannot insert into view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +UPDATE european_city_view SET country_name = 'UK' + WHERE city_name = 'Cambridge'; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +DELETE FROM european_city_view WHERE city_name = 'Cambridge'; +ERROR: cannot delete from view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +-- UPDATE and DELETE via rule and trigger +UPDATE city_view SET country_name = 'UK' + WHERE city_name = 'Cambridge' RETURNING *; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE european_city_view SET population = 122800 + WHERE city_name = 'Cambridge' RETURNING *; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +DELETE FROM european_city_view WHERE city_name = 'Cambridge' RETURNING *; +ERROR: cannot delete from view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +-- join UPDATE test +UPDATE city_view v SET population = 599657 + FROM city_table ci, country_table co + WHERE ci.city_name = 'Washington DC' and co.country_name = 'USA' + AND v.city_id = ci.city_id AND v.country_name = co.country_name + RETURNING co.country_id, v.country_name, + v.city_id, v.city_name, v.population; +ERROR: cannot update view "city_view" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +\set QUIET true +SELECT * FROM city_view; + city_id | city_name | population | country_name | continent +---------+-----------+------------+--------------+----------- +(0 rows) + +DROP TABLE city_table CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view city_view +drop cascades to view european_city_view +DROP TABLE country_table; +-- Test pg_trigger_depth() +-- GPDB ignore this test: execute insert in trigger function +create table depth_a (id int not null primary key); +create table depth_b (id int not null primary key); +create table depth_c (id int not null primary key); +create function depth_a_tf() returns trigger + language plpgsql as $$ +begin + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + insert into depth_b values (new.id); + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + return new; +end; +$$; +create trigger depth_a_tr before insert on depth_a + for each row execute procedure depth_a_tf(); +create function depth_b_tf() returns trigger + language plpgsql as $$ +begin + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + begin + execute 'insert into depth_c values (' || new.id::text || ')'; + exception + when sqlstate 'U9999' then + raise notice 'SQLSTATE = U9999: depth = %', pg_trigger_depth(); + end; + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + if new.id = 1 then + execute 'insert into depth_c values (' || new.id::text || ')'; + end if; + return new; +end; +$$; +create trigger depth_b_tr before insert on depth_b + for each row execute procedure depth_b_tf(); +create function depth_c_tf() returns trigger + language plpgsql as $$ +begin + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + if new.id = 1 then + raise exception sqlstate 'U9999'; + end if; + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + return new; +end; +$$; +create trigger depth_c_tr before insert on depth_c + for each row execute procedure depth_c_tf(); +select pg_trigger_depth(); + pg_trigger_depth +------------------ + 0 +(1 row) + +insert into depth_a values (1); +NOTICE: depth_a_tr: depth = 1 +NOTICE: depth_b_tr: depth = 2 +NOTICE: depth_c_tr: depth = 3 +NOTICE: SQLSTATE = U9999: depth = 2 +NOTICE: depth_b_tr: depth = 2 +NOTICE: depth_c_tr: depth = 3 +ERROR: U9999 +CONTEXT: PL/pgSQL function depth_c_tf() line 5 at RAISE +SQL statement "insert into depth_c values (1)" +PL/pgSQL function depth_b_tf() line 12 at EXECUTE +SQL statement "insert into depth_b values (new.id)" +PL/pgSQL function depth_a_tf() line 4 at SQL statement +select pg_trigger_depth(); + pg_trigger_depth +------------------ + 0 +(1 row) + +insert into depth_a values (2); +NOTICE: depth_a_tr: depth = 1 +NOTICE: depth_b_tr: depth = 2 +NOTICE: depth_c_tr: depth = 3 +NOTICE: depth_c_tr: depth = 3 +NOTICE: depth_b_tr: depth = 2 +NOTICE: depth_a_tr: depth = 1 +select pg_trigger_depth(); + pg_trigger_depth +------------------ + 0 +(1 row) + +drop table depth_a, depth_b, depth_c; +drop function depth_a_tf(); +drop function depth_b_tf(); +drop function depth_c_tf(); +-- +-- Test updates to rows during firing of BEFORE ROW triggers. +-- As of 9.2, such cases should be rejected (see bug #6123). +-- +create temp table parent ( + aid int not null primary key, + val1 text, + val2 text, + val3 text, + val4 text, + bcnt int not null default 0); +create temp table child ( + bid int not null primary key, + aid int not null, + val1 text); +create function parent_upd_func() + returns trigger language plpgsql as +$$ +begin + if old.val1 <> new.val1 then + new.val2 = new.val1; + delete from child where child.aid = new.aid and child.val1 = new.val1; + end if; + return new; +end; +$$; +create trigger parent_upd_trig before update on parent + for each row execute procedure parent_upd_func(); +create function parent_del_func() + returns trigger language plpgsql as +$$ +begin + delete from child where aid = old.aid; + return old; +end; +$$; +create trigger parent_del_trig before delete on parent + for each row execute procedure parent_del_func(); +create function child_ins_func() + returns trigger language plpgsql as +$$ +begin + update parent set bcnt = bcnt + 1 where aid = new.aid; + return new; +end; +$$; +create trigger child_ins_trig after insert on child + for each row execute procedure child_ins_func(); +create function child_del_func() + returns trigger language plpgsql as +$$ +begin + update parent set bcnt = bcnt - 1 where aid = old.aid; + return old; +end; +$$; +create trigger child_del_trig after delete on child + for each row execute procedure child_del_func(); +insert into parent values (1, 'a', 'a', 'a', 'a', 0); +insert into child values (10, 1, 'b'); +select * from parent; select * from child; + aid | val1 | val2 | val3 | val4 | bcnt +-----+------+------+------+------+------ + 1 | a | a | a | a | 1 +(1 row) + + bid | aid | val1 +-----+-----+------ + 10 | 1 | b +(1 row) + +update parent set val1 = 'b' where aid = 1; -- should fail +ERROR: tuple to be updated was already modified by an operation triggered by the current command +HINT: Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows. +select * from parent; select * from child; + aid | val1 | val2 | val3 | val4 | bcnt +-----+------+------+------+------+------ + 1 | a | a | a | a | 1 +(1 row) + + bid | aid | val1 +-----+-----+------ + 10 | 1 | b +(1 row) + +delete from parent where aid = 1; -- should fail +ERROR: tuple to be deleted was already modified by an operation triggered by the current command +HINT: Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows. +select * from parent; select * from child; + aid | val1 | val2 | val3 | val4 | bcnt +-----+------+------+------+------+------ + 1 | a | a | a | a | 1 +(1 row) + + bid | aid | val1 +-----+-----+------ + 10 | 1 | b +(1 row) + +-- replace the trigger function with one that restarts the deletion after +-- having modified a child +create or replace function parent_del_func() + returns trigger language plpgsql as +$$ +begin + delete from child where aid = old.aid; + if found then + delete from parent where aid = old.aid; + return null; -- cancel outer deletion + end if; + return old; +end; +$$; +delete from parent where aid = 1; +select * from parent; select * from child; + aid | val1 | val2 | val3 | val4 | bcnt +-----+------+------+------+------+------ +(0 rows) + + bid | aid | val1 +-----+-----+------ +(0 rows) + +drop table parent, child; +drop function parent_upd_func(); +drop function parent_del_func(); +drop function child_ins_func(); +drop function child_del_func(); +-- similar case, but with a self-referencing FK so that parent and child +-- rows can be affected by a single operation +create temp table self_ref_trigger ( + id int primary key, + parent int references self_ref_trigger, + data text, + nchildren int not null default 0 +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +create function self_ref_trigger_ins_func() + returns trigger language plpgsql as +$$ +begin + if new.parent is not null then + update self_ref_trigger set nchildren = nchildren + 1 + where id = new.parent; + end if; + return new; +end; +$$; +create trigger self_ref_trigger_ins_trig before insert on self_ref_trigger + for each row execute procedure self_ref_trigger_ins_func(); +create function self_ref_trigger_del_func() + returns trigger language plpgsql as +$$ +begin + if old.parent is not null then + update self_ref_trigger set nchildren = nchildren - 1 + where id = old.parent; + end if; + return old; +end; +$$; +create trigger self_ref_trigger_del_trig before delete on self_ref_trigger + for each row execute procedure self_ref_trigger_del_func(); +insert into self_ref_trigger values (1, null, 'root'); +insert into self_ref_trigger values (2, 1, 'root child A'); +insert into self_ref_trigger values (3, 1, 'root child B'); +insert into self_ref_trigger values (4, 2, 'grandchild 1'); +insert into self_ref_trigger values (5, 3, 'grandchild 2'); +update self_ref_trigger set data = 'root!' where id = 1; +select * from self_ref_trigger; + id | parent | data | nchildren +----+--------+--------------+----------- + 2 | 1 | root child A | 1 + 4 | 2 | grandchild 1 | 0 + 3 | 1 | root child B | 1 + 5 | 3 | grandchild 2 | 0 + 1 | | root! | 2 +(5 rows) + +delete from self_ref_trigger; +ERROR: tuple to be updated was already modified by an operation triggered by the current command +HINT: Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows. +select * from self_ref_trigger; + id | parent | data | nchildren +----+--------+--------------+----------- + 2 | 1 | root child A | 1 + 4 | 2 | grandchild 1 | 0 + 3 | 1 | root child B | 1 + 5 | 3 | grandchild 2 | 0 + 1 | | root! | 2 +(5 rows) + +drop table self_ref_trigger; +drop function self_ref_trigger_ins_func(); +drop function self_ref_trigger_del_func(); +-- +-- Check that statement triggers work correctly even with all children excluded +-- +create table stmt_trig_on_empty_upd (a int); +create table stmt_trig_on_empty_upd1 () inherits (stmt_trig_on_empty_upd); +create function update_stmt_notice() returns trigger as $$ +begin + raise notice 'updating %', TG_TABLE_NAME; + return null; +end; +$$ language plpgsql; +create trigger before_stmt_trigger + before update on stmt_trig_on_empty_upd + execute procedure update_stmt_notice(); +ERROR: Triggers for statements are not yet supported +create trigger before_stmt_trigger + before update on stmt_trig_on_empty_upd1 + execute procedure update_stmt_notice(); +ERROR: Triggers for statements are not yet supported +-- inherited no-op update +update stmt_trig_on_empty_upd set a = a where false returning a+1 as aa; + aa +---- +(0 rows) + +-- simple no-op update +update stmt_trig_on_empty_upd1 set a = a where false returning a+1 as aa; + aa +---- +(0 rows) + +drop table stmt_trig_on_empty_upd cascade; +NOTICE: drop cascades to table stmt_trig_on_empty_upd1 +drop function update_stmt_notice(); +-- +-- Check that index creation (or DDL in general) is prohibited in a trigger +-- +create table trigger_ddl_table ( + col1 integer, + col2 integer +); +create function trigger_ddl_func() returns trigger as $$ +begin + alter table trigger_ddl_table add primary key (col1); + return new; +end$$ language plpgsql; +create trigger trigger_ddl_func before insert on trigger_ddl_table for each row + execute procedure trigger_ddl_func(); +insert into trigger_ddl_table values (1, 42); -- fail +ERROR: cannot ALTER TABLE "trigger_ddl_table" because it is being used by active queries in this session +CONTEXT: SQL statement "alter table trigger_ddl_table add primary key (col1)" +PL/pgSQL function trigger_ddl_func() line 3 at SQL statement +create or replace function trigger_ddl_func() returns trigger as $$ +begin + create index on trigger_ddl_table (col2); + return new; +end$$ language plpgsql; +insert into trigger_ddl_table values (1, 42); -- fail +ERROR: cannot CREATE INDEX "trigger_ddl_table" because it is being used by active queries in this session +CONTEXT: SQL statement "create index on trigger_ddl_table (col2)" +PL/pgSQL function trigger_ddl_func() line 3 at SQL statement +drop table trigger_ddl_table; +drop function trigger_ddl_func(); +-- +-- Verify behavior of before and after triggers with INSERT...ON CONFLICT +-- DO UPDATE +-- +create table upsert (key int4 primary key, color text); +create function upsert_before_func() + returns trigger language plpgsql as +$$ +begin + if (TG_OP = 'UPDATE') then + raise warning 'before update (old): %', old.*::text; + raise warning 'before update (new): %', new.*::text; + elsif (TG_OP = 'INSERT') then + raise warning 'before insert (new): %', new.*::text; + if new.key % 2 = 0 then + new.key := new.key + 1; + new.color := new.color || ' trig modified'; + raise warning 'before insert (new, modified): %', new.*::text; + end if; + end if; + return new; +end; +$$; +create trigger upsert_before_trig before insert or update on upsert + for each row execute procedure upsert_before_func(); +create function upsert_after_func() + returns trigger language plpgsql as +$$ +begin + if (TG_OP = 'UPDATE') then + raise warning 'after update (old): %', old.*::text; + raise warning 'after update (new): %', new.*::text; + elsif (TG_OP = 'INSERT') then + raise warning 'after insert (new): %', new.*::text; + end if; + return null; +end; +$$; +create trigger upsert_after_trig after insert or update on upsert + for each row execute procedure upsert_after_func(); +insert into upsert values(1, 'black') on conflict (key) do update set color = 'updated ' || upsert.color; +WARNING: before insert (new): (1,black) +WARNING: after insert (new): (1,black) +insert into upsert values(2, 'red') on conflict (key) do update set color = 'updated ' || upsert.color; +WARNING: before insert (new): (2,red) +WARNING: before insert (new, modified): (3,"red trig modified") +WARNING: after insert (new): (3,"red trig modified") +insert into upsert values(3, 'orange') on conflict (key) do update set color = 'updated ' || upsert.color; +WARNING: before insert (new): (3,orange) +WARNING: before update (old): (3,"red trig modified") +WARNING: before update (new): (3,"updated red trig modified") +WARNING: after update (old): (3,"red trig modified") +WARNING: after update (new): (3,"updated red trig modified") +insert into upsert values(4, 'green') on conflict (key) do update set color = 'updated ' || upsert.color; +WARNING: before insert (new): (4,green) +WARNING: before insert (new, modified): (5,"green trig modified") +WARNING: after insert (new): (5,"green trig modified") +insert into upsert values(5, 'purple') on conflict (key) do update set color = 'updated ' || upsert.color; +WARNING: before insert (new): (5,purple) +WARNING: before update (old): (5,"green trig modified") +WARNING: before update (new): (5,"updated green trig modified") +WARNING: after update (old): (5,"green trig modified") +WARNING: after update (new): (5,"updated green trig modified") +insert into upsert values(6, 'white') on conflict (key) do update set color = 'updated ' || upsert.color; +WARNING: before insert (new): (6,white) +WARNING: before insert (new, modified): (7,"white trig modified") +WARNING: after insert (new): (7,"white trig modified") +insert into upsert values(7, 'pink') on conflict (key) do update set color = 'updated ' || upsert.color; +WARNING: before insert (new): (7,pink) +WARNING: before update (old): (7,"white trig modified") +WARNING: before update (new): (7,"updated white trig modified") +WARNING: after update (old): (7,"white trig modified") +WARNING: after update (new): (7,"updated white trig modified") +insert into upsert values(8, 'yellow') on conflict (key) do update set color = 'updated ' || upsert.color; +WARNING: before insert (new): (8,yellow) +WARNING: before insert (new, modified): (9,"yellow trig modified") +WARNING: after insert (new): (9,"yellow trig modified") +select * from upsert; + key | color +-----+----------------------------- + 1 | black + 3 | updated red trig modified + 5 | updated green trig modified + 7 | updated white trig modified + 9 | yellow trig modified +(5 rows) + +drop table upsert; +drop function upsert_before_func(); +drop function upsert_after_func(); +-- +-- Verify that triggers with transition tables are not allowed on +-- views +-- +create table my_table (i int); +create view my_view as select * from my_table; +create function my_trigger_function() returns trigger as $$ begin end; $$ language plpgsql; +create trigger my_trigger after update on my_view referencing old table as old_table + for each statement execute procedure my_trigger_function(); +ERROR: Triggers for statements are not yet supported +drop function my_trigger_function(); +drop view my_view; +drop table my_table; +-- +-- Verify cases that are unsupported with partitioned tables +-- +create table parted_trig (a int) partition by list (a); +create function trigger_nothing() returns trigger + language plpgsql as $$ begin end; $$; +create trigger failed instead of update on parted_trig + for each row execute procedure trigger_nothing(); +ERROR: "parted_trig" is a table +DETAIL: Tables cannot have INSTEAD OF triggers. +create trigger failed after update on parted_trig + referencing old table as old_table + for each row execute procedure trigger_nothing(); +ERROR: "parted_trig" is a partitioned table +DETAIL: Triggers on partitioned tables cannot have transition tables. +drop table parted_trig; +-- +-- Verify trigger creation for partitioned tables, and drop behavior +-- +create table trigpart (a int, b int) partition by range (a); +create table trigpart1 partition of trigpart for values from (0) to (1000); +create trigger trg1 after insert on trigpart for each row execute procedure trigger_nothing(); +create table trigpart2 partition of trigpart for values from (1000) to (2000); +create table trigpart3 (like trigpart); +alter table trigpart attach partition trigpart3 for values from (2000) to (3000); +create table trigpart4 partition of trigpart for values from (3000) to (4000) partition by range (a); +create table trigpart41 partition of trigpart4 for values from (3000) to (3500); +create table trigpart42 (like trigpart); +alter table trigpart4 attach partition trigpart42 for values from (3500) to (4000); +select tgrelid::regclass, tgname, tgfoid::regproc from pg_trigger + where tgrelid::regclass::text like 'trigpart%' order by tgrelid::regclass::text; + tgrelid | tgname | tgfoid +------------+--------+----------------- + trigpart | trg1 | trigger_nothing + trigpart1 | trg1 | trigger_nothing + trigpart2 | trg1 | trigger_nothing + trigpart3 | trg1 | trigger_nothing + trigpart4 | trg1 | trigger_nothing + trigpart41 | trg1 | trigger_nothing + trigpart42 | trg1 | trigger_nothing +(7 rows) + +drop trigger trg1 on trigpart1; -- fail +ERROR: cannot drop trigger trg1 on table trigpart1 because trigger trg1 on table trigpart requires it +HINT: You can drop trigger trg1 on table trigpart instead. +drop trigger trg1 on trigpart2; -- fail +ERROR: cannot drop trigger trg1 on table trigpart2 because trigger trg1 on table trigpart requires it +HINT: You can drop trigger trg1 on table trigpart instead. +drop trigger trg1 on trigpart3; -- fail +ERROR: cannot drop trigger trg1 on table trigpart3 because trigger trg1 on table trigpart requires it +HINT: You can drop trigger trg1 on table trigpart instead. +drop table trigpart2; -- ok, trigger should be gone in that partition +select tgrelid::regclass, tgname, tgfoid::regproc from pg_trigger + where tgrelid::regclass::text like 'trigpart%' order by tgrelid::regclass::text; + tgrelid | tgname | tgfoid +------------+--------+----------------- + trigpart | trg1 | trigger_nothing + trigpart1 | trg1 | trigger_nothing + trigpart3 | trg1 | trigger_nothing + trigpart4 | trg1 | trigger_nothing + trigpart41 | trg1 | trigger_nothing + trigpart42 | trg1 | trigger_nothing +(6 rows) + +drop trigger trg1 on trigpart; -- ok, all gone +select tgrelid::regclass, tgname, tgfoid::regproc from pg_trigger + where tgrelid::regclass::text like 'trigpart%' order by tgrelid::regclass::text; + tgrelid | tgname | tgfoid +---------+--------+-------- +(0 rows) + +-- check detach behavior +create trigger trg1 after insert on trigpart for each row execute procedure trigger_nothing(); +\d trigpart3 + Table "public.trigpart3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: trigpart FOR VALUES FROM (2000) TO (3000) +Triggers: + trg1 AFTER INSERT ON trigpart3 FOR EACH ROW EXECUTE FUNCTION trigger_nothing(), ON TABLE trigpart + +alter table trigpart detach partition trigpart3; +drop trigger trg1 on trigpart3; -- fail due to "does not exist" +ERROR: trigger "trg1" for table "trigpart3" does not exist +alter table trigpart detach partition trigpart4; +drop trigger trg1 on trigpart41; -- fail due to "does not exist" +ERROR: trigger "trg1" for table "trigpart41" does not exist +drop table trigpart4; +alter table trigpart attach partition trigpart3 for values from (2000) to (3000); +alter table trigpart detach partition trigpart3; +alter table trigpart attach partition trigpart3 for values from (2000) to (3000); +drop table trigpart3; +select tgrelid::regclass::text, tgname, tgfoid::regproc, tgenabled, tgisinternal from pg_trigger + where tgname ~ '^trg1' order by 1; + tgrelid | tgname | tgfoid | tgenabled | tgisinternal +-----------+--------+-----------------+-----------+-------------- + trigpart | trg1 | trigger_nothing | O | f + trigpart1 | trg1 | trigger_nothing | O | t +(2 rows) + +create table trigpart3 (like trigpart); +create trigger trg1 after insert on trigpart3 for each row execute procedure trigger_nothing(); +\d trigpart3 + Table "public.trigpart3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Triggers: + trg1 AFTER INSERT ON trigpart3 FOR EACH ROW EXECUTE FUNCTION trigger_nothing() + +alter table trigpart attach partition trigpart3 FOR VALUES FROM (2000) to (3000); -- fail +ERROR: trigger "trg1" for relation "trigpart3" already exists +drop table trigpart3; +-- check display of unrelated triggers +create trigger samename after delete on trigpart execute function trigger_nothing(); +ERROR: Triggers for statements are not yet supported +create trigger samename after delete on trigpart1 execute function trigger_nothing(); +ERROR: Triggers for statements are not yet supported +\d trigpart1 + Table "public.trigpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Partition of: trigpart FOR VALUES FROM (0) TO (1000) +Triggers: + trg1 AFTER INSERT ON trigpart1 FOR EACH ROW EXECUTE FUNCTION trigger_nothing(), ON TABLE trigpart + +drop table trigpart; +drop function trigger_nothing(); +-- +-- Verify that triggers are fired for partitioned tables +-- +create table parted_stmt_trig (a int) partition by list (a); +create table parted_stmt_trig1 partition of parted_stmt_trig for values in (1); +create table parted_stmt_trig2 partition of parted_stmt_trig for values in (2); +create table parted2_stmt_trig (a int) partition by list (a); +create table parted2_stmt_trig1 partition of parted2_stmt_trig for values in (1); +create table parted2_stmt_trig2 partition of parted2_stmt_trig for values in (2); +create or replace function trigger_notice() returns trigger as $$ + begin + raise notice 'trigger % on % % % for %', TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL; + if TG_LEVEL = 'ROW' then + return NEW; + end if; + return null; + end; + $$ language plpgsql; +-- insert/update/delete statement-level triggers on the parent +create trigger trig_ins_before before insert on parted_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_ins_after after insert on parted_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_upd_before before update on parted_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_upd_after after update on parted_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_del_before before delete on parted_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_del_after after delete on parted_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +-- insert/update/delete row-level triggers on the parent +create trigger trig_ins_after_parent after insert on parted_stmt_trig + for each row execute procedure trigger_notice(); +create trigger trig_upd_after_parent after update on parted_stmt_trig + for each row execute procedure trigger_notice(); +create trigger trig_del_after_parent after delete on parted_stmt_trig + for each row execute procedure trigger_notice(); +-- insert/update/delete row-level triggers on the first partition +create trigger trig_ins_before_child before insert on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_ins_after_child after insert on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_upd_before_child before update on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_upd_after_child after update on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_del_before_child before delete on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_del_after_child after delete on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +-- insert/update/delete statement-level triggers on the parent +create trigger trig_ins_before_3 before insert on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_ins_after_3 after insert on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_upd_before_3 before update on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_upd_after_3 after update on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_del_before_3 before delete on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +create trigger trig_del_after_3 after delete on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +ERROR: Triggers for statements are not yet supported +with ins (a) as ( + insert into parted2_stmt_trig values (1), (2) returning a +) insert into parted_stmt_trig select a from ins returning tableoid::regclass, a; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +with upd as ( + update parted2_stmt_trig set a = a +) update parted_stmt_trig set a = a; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +delete from parted_stmt_trig; +-- insert via copy on the parent +copy parted_stmt_trig(a) from stdin; +NOTICE: trigger trig_ins_before_child on parted_stmt_trig1 BEFORE INSERT for ROW +NOTICE: trigger trig_ins_after_child on parted_stmt_trig1 AFTER INSERT for ROW +NOTICE: trigger trig_ins_after_parent on parted_stmt_trig1 AFTER INSERT for ROW +NOTICE: trigger trig_ins_after_parent on parted_stmt_trig2 AFTER INSERT for ROW +-- insert via copy on the first partition +copy parted_stmt_trig1(a) from stdin; +NOTICE: trigger trig_ins_before_child on parted_stmt_trig1 BEFORE INSERT for ROW +NOTICE: trigger trig_ins_after_child on parted_stmt_trig1 AFTER INSERT for ROW +NOTICE: trigger trig_ins_after_parent on parted_stmt_trig1 AFTER INSERT for ROW +-- Disabling a trigger in the parent table should disable children triggers too +alter table parted_stmt_trig disable trigger trig_ins_after_parent; +insert into parted_stmt_trig values (1); +NOTICE: trigger trig_ins_before_child on parted_stmt_trig1 BEFORE INSERT for ROW +NOTICE: trigger trig_ins_after_child on parted_stmt_trig1 AFTER INSERT for ROW +alter table parted_stmt_trig enable trigger trig_ins_after_parent; +insert into parted_stmt_trig values (1); +NOTICE: trigger trig_ins_before_child on parted_stmt_trig1 BEFORE INSERT for ROW +NOTICE: trigger trig_ins_after_child on parted_stmt_trig1 AFTER INSERT for ROW +NOTICE: trigger trig_ins_after_parent on parted_stmt_trig1 AFTER INSERT for ROW +drop table parted_stmt_trig, parted2_stmt_trig; +-- Verify that triggers fire in alphabetical order +create table parted_trig (a int) partition by range (a); +create table parted_trig_1 partition of parted_trig for values from (0) to (1000) + partition by range (a); +create table parted_trig_1_1 partition of parted_trig_1 for values from (0) to (100); +create table parted_trig_2 partition of parted_trig for values from (1000) to (2000); +create trigger zzz after insert on parted_trig for each row execute procedure trigger_notice(); +create trigger mmm after insert on parted_trig_1_1 for each row execute procedure trigger_notice(); +create trigger aaa after insert on parted_trig_1 for each row execute procedure trigger_notice(); +create trigger bbb after insert on parted_trig for each row execute procedure trigger_notice(); +create trigger qqq after insert on parted_trig_1_1 for each row execute procedure trigger_notice(); +insert into parted_trig values (50), (1500); +NOTICE: trigger aaa on parted_trig_1_1 AFTER INSERT for ROW +NOTICE: trigger bbb on parted_trig_1_1 AFTER INSERT for ROW +NOTICE: trigger mmm on parted_trig_1_1 AFTER INSERT for ROW +NOTICE: trigger qqq on parted_trig_1_1 AFTER INSERT for ROW +NOTICE: trigger zzz on parted_trig_1_1 AFTER INSERT for ROW +NOTICE: trigger bbb on parted_trig_2 AFTER INSERT for ROW +NOTICE: trigger zzz on parted_trig_2 AFTER INSERT for ROW +drop table parted_trig; +-- Verify propagation of trigger arguments to partitions +create table parted_trig (a int) partition by list (a); +create table parted_trig1 partition of parted_trig for values in (1); +create or replace function trigger_notice() returns trigger as $$ + declare + arg1 text = TG_ARGV[0]; + arg2 integer = TG_ARGV[1]; + begin + raise notice 'trigger % on % % % for % args % %', + TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL, arg1, arg2; + return null; + end; + $$ language plpgsql; +create trigger aaa after insert on parted_trig + for each row execute procedure trigger_notice('quirky', 1); +-- Verify propagation of trigger arguments to partitions attached after creating trigger +create table parted_trig2 partition of parted_trig for values in (2); +create table parted_trig3 (like parted_trig); +alter table parted_trig attach partition parted_trig3 for values in (3); +insert into parted_trig values (1), (2), (3); +NOTICE: trigger aaa on parted_trig1 AFTER INSERT for ROW args quirky 1 +NOTICE: trigger aaa on parted_trig2 AFTER INSERT for ROW args quirky 1 +NOTICE: trigger aaa on parted_trig3 AFTER INSERT for ROW args quirky 1 +drop table parted_trig; +-- test irregular partitions (i.e., different column definitions), +-- including that the WHEN clause works +create function bark(text) returns bool language plpgsql immutable + as $$ begin raise notice '% <- woof!', $1; return true; end; $$; +create or replace function trigger_notice_ab() returns trigger as $$ + begin + raise notice 'trigger % on % % % for %: (a,b)=(%,%)', + TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL, + NEW.a, NEW.b; + if TG_LEVEL = 'ROW' then + return NEW; + end if; + return null; + end; + $$ language plpgsql; +create table parted_irreg_ancestor (fd text, b text, fd2 int, fd3 int, a int) + partition by range (b); +alter table parted_irreg_ancestor drop column fd, + drop column fd2, drop column fd3; +create table parted_irreg (fd int, a int, fd2 int, b text) + partition by range (b); +alter table parted_irreg drop column fd, drop column fd2; +alter table parted_irreg_ancestor attach partition parted_irreg + for values from ('aaaa') to ('zzzz'); +create table parted1_irreg (b text, fd int, a int); +alter table parted1_irreg drop column fd; +alter table parted_irreg attach partition parted1_irreg + for values from ('aaaa') to ('bbbb'); +create trigger parted_trig after insert on parted_irreg + for each row execute procedure trigger_notice_ab(); +create trigger parted_trig_odd after insert on parted_irreg for each row + when (bark(new.b) AND new.a % 2 = 1) execute procedure trigger_notice_ab(); +-- we should hear barking for every insert, but parted_trig_odd only emits +-- noise for odd values of a. parted_trig does it for all inserts. +insert into parted_irreg values (1, 'aardvark'), (2, 'aanimals'); +NOTICE: aardvark <- woof! +NOTICE: aanimals <- woof! +NOTICE: trigger parted_trig on parted1_irreg AFTER INSERT for ROW: (a,b)=(1,aardvark) +NOTICE: trigger parted_trig_odd on parted1_irreg AFTER INSERT for ROW: (a,b)=(1,aardvark) +NOTICE: trigger parted_trig on parted1_irreg AFTER INSERT for ROW: (a,b)=(2,aanimals) +insert into parted1_irreg values ('aardwolf', 2); +NOTICE: aardwolf <- woof! +NOTICE: trigger parted_trig on parted1_irreg AFTER INSERT for ROW: (a,b)=(2,aardwolf) +insert into parted_irreg_ancestor values ('aasvogel', 3); +NOTICE: aasvogel <- woof! +NOTICE: trigger parted_trig on parted1_irreg AFTER INSERT for ROW: (a,b)=(3,aasvogel) +NOTICE: trigger parted_trig_odd on parted1_irreg AFTER INSERT for ROW: (a,b)=(3,aasvogel) +drop table parted_irreg_ancestor; +-- Before triggers and partitions +create table parted (a int, b int, c text) partition by list (a); +create table parted_1 partition of parted for values in (1) + partition by list (b); +create table parted_1_1 partition of parted_1 for values in (1); +create function parted_trigfunc() returns trigger language plpgsql as $$ +begin + new.a = new.a + 1; + return new; +end; +$$; +insert into parted values (1, 1, 'uno uno v1'); -- works +create trigger t before insert or update or delete on parted + for each row execute function parted_trigfunc(); +insert into parted values (1, 1, 'uno uno v2'); -- fail +ERROR: moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported +DETAIL: Before executing trigger "t", the row was to be in partition "public.parted_1_1". +update parted set c = c || 'v3'; -- fail +ERROR: no partition of relation "parted" found for row +DETAIL: Partition key of the failing row contains (a) = (2). +create or replace function parted_trigfunc() returns trigger language plpgsql as $$ +begin + new.b = new.b + 1; + return new; +end; +$$; +insert into parted values (1, 1, 'uno uno v4'); -- fail +ERROR: moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported +DETAIL: Before executing trigger "t", the row was to be in partition "public.parted_1_1". +update parted set c = c || 'v5'; -- fail +ERROR: no partition of relation "parted_1" found for row +DETAIL: Partition key of the failing row contains (b) = (2). +create or replace function parted_trigfunc() returns trigger language plpgsql as $$ +begin + new.c = new.c || ' did '|| TG_OP; + return new; +end; +$$; +insert into parted values (1, 1, 'uno uno'); -- works +update parted set c = c || ' v6'; -- works +select tableoid::regclass, * from parted; + tableoid | a | b | c +------------+---+---+---------------------------------- + parted_1_1 | 1 | 1 | uno uno v1 v6 did UPDATE + parted_1_1 | 1 | 1 | uno uno did INSERT v6 did UPDATE +(2 rows) + +-- update itself moves tuple to new partition; trigger still works +truncate table parted; +create table parted_2 partition of parted for values in (2); +insert into parted values (1, 1, 'uno uno v5'); +update parted set a = 2; +select tableoid::regclass, * from parted; + tableoid | a | b | c +----------+---+---+--------------------------------------------- + parted_2 | 2 | 1 | uno uno v5 did INSERT did UPDATE did INSERT +(1 row) + +-- both trigger and update change the partition +create or replace function parted_trigfunc2() returns trigger language plpgsql as $$ +begin + new.a = new.a + 1; + return new; +end; +$$; +create trigger t2 before update on parted + for each row execute function parted_trigfunc2(); +truncate table parted; +insert into parted values (1, 1, 'uno uno v6'); +create table parted_3 partition of parted for values in (3); +update parted set a = a + 1; +select tableoid::regclass, * from parted; + tableoid | a | b | c +----------+---+---+--------------------------------------------- + parted_3 | 3 | 1 | uno uno v6 did INSERT did UPDATE did INSERT +(1 row) + +-- there's no partition for a=0, but this update works anyway because +-- the trigger causes the tuple to be routed to another partition +update parted set a = 0; +select tableoid::regclass, * from parted; + tableoid | a | b | c +------------+---+---+------------------------------------------------------------------- + parted_1_1 | 1 | 1 | uno uno v6 did INSERT did UPDATE did INSERT did UPDATE did INSERT +(1 row) + +drop table parted; +create table parted (a int, b int, c text) partition by list ((a + b)); +create or replace function parted_trigfunc() returns trigger language plpgsql as $$ +begin + new.a = new.a + new.b; + return new; +end; +$$; +create table parted_1 partition of parted for values in (1, 2); +create table parted_2 partition of parted for values in (3, 4); +create trigger t before insert or update on parted + for each row execute function parted_trigfunc(); +insert into parted values (0, 1, 'zero win'); +insert into parted values (1, 1, 'one fail'); +ERROR: moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported +DETAIL: Before executing trigger "t", the row was to be in partition "public.parted_1". +insert into parted values (1, 2, 'two fail'); +ERROR: moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported +DETAIL: Before executing trigger "t", the row was to be in partition "public.parted_2". +select * from parted; + a | b | c +---+---+---------- + 1 | 1 | zero win +(1 row) + +drop table parted; +drop function parted_trigfunc(); +-- +-- Constraint triggers and partitioned tables +create table parted_constr_ancestor (a int, b text) + partition by range (b); +create table parted_constr (a int, b text) + partition by range (b); +alter table parted_constr_ancestor attach partition parted_constr + for values from ('aaaa') to ('zzzz'); +create table parted1_constr (a int, b text); +alter table parted_constr attach partition parted1_constr + for values from ('aaaa') to ('bbbb'); +create constraint trigger parted_trig after insert on parted_constr_ancestor + deferrable + for each row execute procedure trigger_notice_ab(); +create constraint trigger parted_trig_two after insert on parted_constr + deferrable initially deferred + for each row when (bark(new.b) AND new.a % 2 = 1) + execute procedure trigger_notice_ab(); +-- The immediate constraint is fired immediately; the WHEN clause of the +-- deferred constraint is also called immediately. The deferred constraint +-- is fired at commit time. +begin; +insert into parted_constr values (1, 'aardvark'); +NOTICE: aardvark <- woof! +NOTICE: trigger parted_trig on parted1_constr AFTER INSERT for ROW: (a,b)=(1,aardvark) +insert into parted1_constr values (2, 'aardwolf'); +NOTICE: aardwolf <- woof! +NOTICE: trigger parted_trig on parted1_constr AFTER INSERT for ROW: (a,b)=(2,aardwolf) +insert into parted_constr_ancestor values (3, 'aasvogel'); +NOTICE: aasvogel <- woof! +NOTICE: trigger parted_trig on parted1_constr AFTER INSERT for ROW: (a,b)=(3,aasvogel) +commit; +NOTICE: trigger parted_trig_two on parted1_constr AFTER INSERT for ROW: (a,b)=(1,aardvark) +NOTICE: trigger parted_trig_two on parted1_constr AFTER INSERT for ROW: (a,b)=(3,aasvogel) +-- The WHEN clause is immediate, and both constraint triggers are fired at +-- commit time. +begin; +set constraints parted_trig deferred; +insert into parted_constr values (1, 'aardvark'); +NOTICE: aardvark <- woof! +insert into parted1_constr values (2, 'aardwolf'), (3, 'aasvogel'); +NOTICE: aardwolf <- woof! +NOTICE: aasvogel <- woof! +commit; +NOTICE: trigger parted_trig on parted1_constr AFTER INSERT for ROW: (a,b)=(1,aardvark) +NOTICE: trigger parted_trig_two on parted1_constr AFTER INSERT for ROW: (a,b)=(1,aardvark) +NOTICE: trigger parted_trig on parted1_constr AFTER INSERT for ROW: (a,b)=(2,aardwolf) +NOTICE: trigger parted_trig on parted1_constr AFTER INSERT for ROW: (a,b)=(3,aasvogel) +NOTICE: trigger parted_trig_two on parted1_constr AFTER INSERT for ROW: (a,b)=(3,aasvogel) +drop table parted_constr_ancestor; +drop function bark(text); +-- Test that the WHEN clause is set properly to partitions +create table parted_trigger (a int, b text) partition by range (a); +create table parted_trigger_1 partition of parted_trigger for values from (0) to (1000); +create table parted_trigger_2 (drp int, a int, b text); +alter table parted_trigger_2 drop column drp; +alter table parted_trigger attach partition parted_trigger_2 for values from (1000) to (2000); +create trigger parted_trigger after update on parted_trigger + for each row when (new.a % 2 = 1 and length(old.b) >= 2) execute procedure trigger_notice_ab(); +create table parted_trigger_3 (b text, a int) partition by range (length(b)); +create table parted_trigger_3_1 partition of parted_trigger_3 for values from (1) to (3); +create table parted_trigger_3_2 partition of parted_trigger_3 for values from (3) to (5); +alter table parted_trigger attach partition parted_trigger_3 for values from (2000) to (3000); +insert into parted_trigger values + (0, 'a'), (1, 'bbb'), (2, 'bcd'), (3, 'c'), + (1000, 'c'), (1001, 'ddd'), (1002, 'efg'), (1003, 'f'), + (2000, 'e'), (2001, 'fff'), (2002, 'ghi'), (2003, 'h'); +update parted_trigger set a = a + 2; -- notice for odd 'a' values, long 'b' values +NOTICE: trigger parted_trigger on parted_trigger_1 AFTER UPDATE for ROW: (a,b)=(3,bbb) +NOTICE: trigger parted_trigger on parted_trigger_2 AFTER UPDATE for ROW: (a,b)=(1003,ddd) +NOTICE: trigger parted_trigger on parted_trigger_3_2 AFTER UPDATE for ROW: (a,b)=(2003,fff) +drop table parted_trigger; +-- try a constraint trigger, also +create table parted_referenced (a int); +create table unparted_trigger (a int, b text); -- for comparison purposes +create table parted_trigger (a int, b text) partition by range (a); +create table parted_trigger_1 partition of parted_trigger for values from (0) to (1000); +create table parted_trigger_2 (drp int, a int, b text); +alter table parted_trigger_2 drop column drp; +alter table parted_trigger attach partition parted_trigger_2 for values from (1000) to (2000); +create constraint trigger parted_trigger after update on parted_trigger + from parted_referenced + for each row execute procedure trigger_notice_ab(); +create constraint trigger parted_trigger after update on unparted_trigger + from parted_referenced + for each row execute procedure trigger_notice_ab(); +create table parted_trigger_3 (b text, a int) partition by range (length(b)); +create table parted_trigger_3_1 partition of parted_trigger_3 for values from (1) to (3); +create table parted_trigger_3_2 partition of parted_trigger_3 for values from (3) to (5); +alter table parted_trigger attach partition parted_trigger_3 for values from (2000) to (3000); +select tgname, conname, t.tgrelid::regclass, t.tgconstrrelid::regclass, + c.conrelid::regclass, c.confrelid::regclass + from pg_trigger t join pg_constraint c on (t.tgconstraint = c.oid) + where tgname = 'parted_trigger' + order by t.tgrelid::regclass::text; + tgname | conname | tgrelid | tgconstrrelid | conrelid | confrelid +----------------+----------------+--------------------+-------------------+--------------------+----------- + parted_trigger | parted_trigger | parted_trigger | parted_referenced | parted_trigger | - + parted_trigger | parted_trigger | parted_trigger_1 | parted_referenced | parted_trigger_1 | - + parted_trigger | parted_trigger | parted_trigger_2 | parted_referenced | parted_trigger_2 | - + parted_trigger | parted_trigger | parted_trigger_3 | parted_referenced | parted_trigger_3 | - + parted_trigger | parted_trigger | parted_trigger_3_1 | parted_referenced | parted_trigger_3_1 | - + parted_trigger | parted_trigger | parted_trigger_3_2 | parted_referenced | parted_trigger_3_2 | - + parted_trigger | parted_trigger | unparted_trigger | parted_referenced | unparted_trigger | - +(7 rows) + +drop table parted_referenced, parted_trigger, unparted_trigger; +-- verify that the "AFTER UPDATE OF columns" event is propagated correctly +create table parted_trigger (a int, b text) partition by range (a); +create table parted_trigger_1 partition of parted_trigger for values from (0) to (1000); +create table parted_trigger_2 (drp int, a int, b text); +alter table parted_trigger_2 drop column drp; +alter table parted_trigger attach partition parted_trigger_2 for values from (1000) to (2000); +create trigger parted_trigger after update of b on parted_trigger + for each row execute procedure trigger_notice_ab(); +create table parted_trigger_3 (b text, a int) partition by range (length(b)); +create table parted_trigger_3_1 partition of parted_trigger_3 for values from (1) to (4); +create table parted_trigger_3_2 partition of parted_trigger_3 for values from (4) to (8); +alter table parted_trigger attach partition parted_trigger_3 for values from (2000) to (3000); +insert into parted_trigger values (0, 'a'), (1000, 'c'), (2000, 'e'), (2001, 'eeee'); +update parted_trigger set a = a + 2; -- no notices here +update parted_trigger set b = b || 'b'; -- all triggers should fire +NOTICE: trigger parted_trigger on parted_trigger_1 AFTER UPDATE for ROW: (a,b)=(2,ab) +NOTICE: trigger parted_trigger on parted_trigger_2 AFTER UPDATE for ROW: (a,b)=(1002,cb) +NOTICE: trigger parted_trigger on parted_trigger_3_1 AFTER UPDATE for ROW: (a,b)=(2002,eb) +NOTICE: trigger parted_trigger on parted_trigger_3_2 AFTER UPDATE for ROW: (a,b)=(2003,eeeeb) +drop table parted_trigger; +drop function trigger_notice_ab(); +-- Make sure we don't end up with unnecessary copies of triggers, when +-- cloning them. +create table trg_clone (a int) partition by range (a); +create table trg_clone1 partition of trg_clone for values from (0) to (1000); +alter table trg_clone add constraint uniq unique (a) deferrable; +create table trg_clone2 partition of trg_clone for values from (1000) to (2000); +create table trg_clone3 partition of trg_clone for values from (2000) to (3000) + partition by range (a); +create table trg_clone_3_3 partition of trg_clone3 for values from (2000) to (2100); +select tgrelid::regclass, count(*) from pg_trigger + where tgrelid::regclass in ('trg_clone', 'trg_clone1', 'trg_clone2', + 'trg_clone3', 'trg_clone_3_3') + group by tgrelid::regclass order by tgrelid::regclass; + tgrelid | count +---------------+------- + trg_clone | 1 + trg_clone1 | 1 + trg_clone2 | 1 + trg_clone3 | 1 + trg_clone_3_3 | 1 +(5 rows) + +drop table trg_clone; +-- Test the interaction between ALTER TABLE .. DISABLE TRIGGER and +-- both kinds of inheritance. Historically, legacy inheritance has +-- not recursed to children, so that behavior is preserved. +create table parent (a int); +create table child1 () inherits (parent); +create function trig_nothing() returns trigger language plpgsql + as $$ begin return null; end $$; +create trigger tg after insert on parent + for each row execute function trig_nothing(); +create trigger tg after insert on child1 + for each row execute function trig_nothing(); +alter table parent disable trigger tg; +select tgrelid::regclass, tgname, tgenabled from pg_trigger + where tgrelid in ('parent'::regclass, 'child1'::regclass) + order by tgrelid::regclass::text; + tgrelid | tgname | tgenabled +---------+--------+----------- + child1 | tg | O + parent | tg | D +(2 rows) + +alter table only parent enable always trigger tg; +select tgrelid::regclass, tgname, tgenabled from pg_trigger + where tgrelid in ('parent'::regclass, 'child1'::regclass) + order by tgrelid::regclass::text; + tgrelid | tgname | tgenabled +---------+--------+----------- + child1 | tg | O + parent | tg | A +(2 rows) + +drop table parent, child1; +create table parent (a int) partition by list (a); +create table child1 partition of parent for values in (1); +create trigger tg after insert on parent + for each row execute procedure trig_nothing(); +select tgrelid::regclass, tgname, tgenabled from pg_trigger + where tgrelid in ('parent'::regclass, 'child1'::regclass) + order by tgrelid::regclass::text; + tgrelid | tgname | tgenabled +---------+--------+----------- + child1 | tg | O + parent | tg | O +(2 rows) + +alter table only parent enable always trigger tg; +select tgrelid::regclass, tgname, tgenabled from pg_trigger + where tgrelid in ('parent'::regclass, 'child1'::regclass) + order by tgrelid::regclass::text; + tgrelid | tgname | tgenabled +---------+--------+----------- + child1 | tg | O + parent | tg | A +(2 rows) + +drop table parent, child1; +-- Verify that firing state propagates correctly on creation, too +CREATE TABLE trgfire (i int) PARTITION BY RANGE (i); +CREATE TABLE trgfire1 PARTITION OF trgfire FOR VALUES FROM (1) TO (10); +CREATE OR REPLACE FUNCTION tgf() RETURNS trigger LANGUAGE plpgsql + AS $$ begin raise exception 'except'; end $$; +CREATE TRIGGER tg AFTER INSERT ON trgfire FOR EACH ROW EXECUTE FUNCTION tgf(); +INSERT INTO trgfire VALUES (1); +ERROR: except +CONTEXT: PL/pgSQL function tgf() line 1 at RAISE +ALTER TABLE trgfire DISABLE TRIGGER tg; +INSERT INTO trgfire VALUES (1); +CREATE TABLE trgfire2 PARTITION OF trgfire FOR VALUES FROM (10) TO (20); +INSERT INTO trgfire VALUES (11); +CREATE TABLE trgfire3 (LIKE trgfire); +ALTER TABLE trgfire ATTACH PARTITION trgfire3 FOR VALUES FROM (20) TO (30); +INSERT INTO trgfire VALUES (21); +CREATE TABLE trgfire4 PARTITION OF trgfire FOR VALUES FROM (30) TO (40) PARTITION BY LIST (i); +CREATE TABLE trgfire4_30 PARTITION OF trgfire4 FOR VALUES IN (30); +INSERT INTO trgfire VALUES (30); +CREATE TABLE trgfire5 (LIKE trgfire) PARTITION BY LIST (i); +CREATE TABLE trgfire5_40 PARTITION OF trgfire5 FOR VALUES IN (40); +ALTER TABLE trgfire ATTACH PARTITION trgfire5 FOR VALUES FROM (40) TO (50); +INSERT INTO trgfire VALUES (40); +SELECT tgrelid::regclass, tgenabled FROM pg_trigger + WHERE tgrelid::regclass IN (SELECT oid from pg_class where relname LIKE 'trgfire%') + ORDER BY tgrelid::regclass::text; + tgrelid | tgenabled +-------------+----------- + trgfire | D + trgfire1 | D + trgfire2 | D + trgfire3 | D + trgfire4 | D + trgfire4_30 | D + trgfire5 | D + trgfire5_40 | D +(8 rows) + +ALTER TABLE trgfire ENABLE TRIGGER tg; +INSERT INTO trgfire VALUES (1); +ERROR: except +CONTEXT: PL/pgSQL function tgf() line 1 at RAISE +INSERT INTO trgfire VALUES (11); +ERROR: except +CONTEXT: PL/pgSQL function tgf() line 1 at RAISE +INSERT INTO trgfire VALUES (21); +ERROR: except +CONTEXT: PL/pgSQL function tgf() line 1 at RAISE +INSERT INTO trgfire VALUES (30); +ERROR: except +CONTEXT: PL/pgSQL function tgf() line 1 at RAISE +INSERT INTO trgfire VALUES (40); +ERROR: except +CONTEXT: PL/pgSQL function tgf() line 1 at RAISE +DROP TABLE trgfire; +DROP FUNCTION tgf(); +-- +-- Test the interaction between transition tables and both kinds of +-- inheritance. We'll dump the contents of the transition tables in a +-- format that shows the attribute order, so that we can distinguish +-- tuple formats (though not dropped attributes). +-- +create or replace function dump_insert() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, new table = %', + TG_NAME, + (select string_agg(new_table::text, ', ' order by a) from new_table); + return null; + end; +$$; +create or replace function dump_update() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, old table = %, new table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' order by a) from old_table), + (select string_agg(new_table::text, ', ' order by a) from new_table); + return null; + end; +$$; +create or replace function dump_delete() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, old table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' order by a) from old_table); + return null; + end; +$$; +-- +-- Verify behavior of statement triggers on partition hierarchy with +-- transition tables. Tuples should appear to each trigger in the +-- format of the relation the trigger is attached to. +-- +-- set up a partition hierarchy with some different TupleDescriptors +create table parent (a text, b int) partition by list (a); +-- a child matching parent +create table child1 partition of parent for values in ('AAA'); +-- a child with a dropped column +create table child2 (x int, a text, b int); +alter table child2 drop column x; +alter table parent attach partition child2 for values in ('BBB'); +-- a child with a different column order +create table child3 (b int, a text); +alter table parent attach partition child3 for values in ('CCC'); +create trigger parent_insert_trig + after insert on parent referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger parent_update_trig + after update on parent referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger parent_delete_trig + after delete on parent referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +create trigger child1_insert_trig + after insert on child1 referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger child1_update_trig + after update on child1 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger child1_delete_trig + after delete on child1 referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +create trigger child2_insert_trig + after insert on child2 referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger child2_update_trig + after update on child2 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger child2_delete_trig + after delete on child2 referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +create trigger child3_insert_trig + after insert on child3 referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger child3_update_trig + after update on child3 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger child3_delete_trig + after delete on child3 referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +SELECT trigger_name, event_manipulation, event_object_schema, event_object_table, + action_order, action_condition, action_orientation, action_timing, + action_reference_old_table, action_reference_new_table + FROM information_schema.triggers + WHERE event_object_table IN ('parent', 'child1', 'child2', 'child3') + ORDER BY trigger_name COLLATE "C", 2; + trigger_name | event_manipulation | event_object_schema | event_object_table | action_order | action_condition | action_orientation | action_timing | action_reference_old_table | action_reference_new_table +--------------+--------------------+---------------------+--------------------+--------------+------------------+--------------------+---------------+----------------------------+---------------------------- +(0 rows) + +-- insert directly into children sees respective child-format tuples +insert into child1 values ('AAA', 42); +insert into child2 values ('BBB', 42); +insert into child3 values (42, 'CCC'); +-- update via parent sees parent-format tuples +update parent set b = b + 1; +-- delete via parent sees parent-format tuples +delete from parent; +-- insert into parent sees parent-format tuples +insert into parent values ('AAA', 42); +insert into parent values ('BBB', 42); +insert into parent values ('CCC', 42); +-- delete from children sees respective child-format tuples +delete from child1; +delete from child2; +delete from child3; +-- copy into parent sees parent-format tuples +copy parent (a, b) from stdin; +-- DML affecting parent sees tuples collected from children even if +-- there is no transition table trigger on the children +drop trigger child1_insert_trig on child1; +ERROR: trigger "child1_insert_trig" for table "child1" does not exist +drop trigger child1_update_trig on child1; +ERROR: trigger "child1_update_trig" for table "child1" does not exist +drop trigger child1_delete_trig on child1; +ERROR: trigger "child1_delete_trig" for table "child1" does not exist +drop trigger child2_insert_trig on child2; +ERROR: trigger "child2_insert_trig" for table "child2" does not exist +drop trigger child2_update_trig on child2; +ERROR: trigger "child2_update_trig" for table "child2" does not exist +drop trigger child2_delete_trig on child2; +ERROR: trigger "child2_delete_trig" for table "child2" does not exist +drop trigger child3_insert_trig on child3; +ERROR: trigger "child3_insert_trig" for table "child3" does not exist +drop trigger child3_update_trig on child3; +ERROR: trigger "child3_update_trig" for table "child3" does not exist +drop trigger child3_delete_trig on child3; +ERROR: trigger "child3_delete_trig" for table "child3" does not exist +delete from parent; +-- copy into parent sees tuples collected from children even if there +-- is no transition-table trigger on the children +copy parent (a, b) from stdin; +-- insert into parent with a before trigger on a child tuple before +-- insertion, and we capture the newly modified row in parent format +create or replace function intercept_insert() returns trigger language plpgsql as +$$ + begin + new.b = new.b + 1000; + return new; + end; +$$; +create trigger intercept_insert_child3 + before insert on child3 + for each row execute procedure intercept_insert(); +-- insert, parent trigger sees post-modification parent-format tuple +insert into parent values ('AAA', 42), ('BBB', 42), ('CCC', 66); +-- copy, parent trigger sees post-modification parent-format tuple +copy parent (a, b) from stdin; +drop table child1, child2, child3, parent; +drop function intercept_insert(); +-- +-- Verify prohibition of row triggers with transition triggers on +-- partitions +-- +create table parent (a text, b int) partition by list (a); +create table child partition of parent for values in ('AAA'); +-- adding row trigger with transition table fails +create trigger child_row_trig + after insert on child referencing new table as new_table + for each row execute procedure dump_insert(); +ERROR: ROW triggers with transition tables are not supported on partitions +-- detaching it first works +alter table parent detach partition child; +create trigger child_row_trig + after insert on child referencing new table as new_table + for each row execute procedure dump_insert(); +-- but now we're not allowed to reattach it +alter table parent attach partition child for values in ('AAA'); +ERROR: trigger "child_row_trig" prevents table "child" from becoming a partition +DETAIL: ROW triggers with transition tables are not supported on partitions +-- drop the trigger, and now we're allowed to attach it again +drop trigger child_row_trig on child; +alter table parent attach partition child for values in ('AAA'); +drop table child, parent; +-- +-- Verify behavior of statement triggers on (non-partition) +-- inheritance hierarchy with transition tables; similar to the +-- partition case, except there is no rerouting on insertion and child +-- tables can have extra columns +-- +-- set up inheritance hierarchy with different TupleDescriptors +create table parent (a text, b int); +-- a child matching parent +create table child1 () inherits (parent); +-- a child with a different column order +create table child2 (b int, a text); +alter table child2 inherit parent; +-- a child with an extra column +create table child3 (c text) inherits (parent); +create trigger parent_insert_trig + after insert on parent referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger parent_update_trig + after update on parent referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger parent_delete_trig + after delete on parent referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +create trigger child1_insert_trig + after insert on child1 referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger child1_update_trig + after update on child1 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger child1_delete_trig + after delete on child1 referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +create trigger child2_insert_trig + after insert on child2 referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger child2_update_trig + after update on child2 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger child2_delete_trig + after delete on child2 referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +create trigger child3_insert_trig + after insert on child3 referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger child3_update_trig + after update on child3 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger child3_delete_trig + after delete on child3 referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +-- insert directly into children sees respective child-format tuples +insert into child1 values ('AAA', 42); +insert into child2 values (42, 'BBB'); +insert into child3 values ('CCC', 42, 'foo'); +-- update via parent sees parent-format tuples +update parent set b = b + 1; +-- delete via parent sees parent-format tuples +delete from parent; +-- reinsert values into children for next test... +insert into child1 values ('AAA', 42); +insert into child2 values (42, 'BBB'); +insert into child3 values ('CCC', 42, 'foo'); +-- delete from children sees respective child-format tuples +delete from child1; +delete from child2; +delete from child3; +-- copy into parent sees parent-format tuples (no rerouting, so these +-- are really inserted into the parent) +copy parent (a, b) from stdin; +-- same behavior for copy if there is an index (interesting because rows are +-- captured by a different code path in copyfrom.c if there are indexes) +create index on parent(b); +copy parent (a, b) from stdin; +-- DML affecting parent sees tuples collected from children even if +-- there is no transition table trigger on the children +drop trigger child1_insert_trig on child1; +ERROR: trigger "child1_insert_trig" for table "child1" does not exist +drop trigger child1_update_trig on child1; +ERROR: trigger "child1_update_trig" for table "child1" does not exist +drop trigger child1_delete_trig on child1; +ERROR: trigger "child1_delete_trig" for table "child1" does not exist +drop trigger child2_insert_trig on child2; +ERROR: trigger "child2_insert_trig" for table "child2" does not exist +drop trigger child2_update_trig on child2; +ERROR: trigger "child2_update_trig" for table "child2" does not exist +drop trigger child2_delete_trig on child2; +ERROR: trigger "child2_delete_trig" for table "child2" does not exist +drop trigger child3_insert_trig on child3; +ERROR: trigger "child3_insert_trig" for table "child3" does not exist +drop trigger child3_update_trig on child3; +ERROR: trigger "child3_update_trig" for table "child3" does not exist +drop trigger child3_delete_trig on child3; +ERROR: trigger "child3_delete_trig" for table "child3" does not exist +delete from parent; +drop table child1, child2, child3, parent; +-- +-- Verify prohibition of row triggers with transition triggers on +-- inheritance children +-- +create table parent (a text, b int); +create table child () inherits (parent); +-- adding row trigger with transition table fails +create trigger child_row_trig + after insert on child referencing new table as new_table + for each row execute procedure dump_insert(); +ERROR: ROW triggers with transition tables are not supported on inheritance children +-- disinheriting it first works +alter table child no inherit parent; +create trigger child_row_trig + after insert on child referencing new table as new_table + for each row execute procedure dump_insert(); +-- but now we're not allowed to make it inherit anymore +alter table child inherit parent; +ERROR: trigger "child_row_trig" prevents table "child" from becoming an inheritance child +DETAIL: ROW triggers with transition tables are not supported in inheritance hierarchies. +-- drop the trigger, and now we're allowed to make it inherit again +drop trigger child_row_trig on child; +alter table child inherit parent; +drop table child, parent; +-- +-- Verify behavior of queries with wCTEs, where multiple transition +-- tuplestores can be active at the same time because there are +-- multiple DML statements that might fire triggers with transition +-- tables +-- +create table table1 (a int); +create table table2 (a text); +create trigger table1_trig + after insert on table1 referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger table2_trig + after insert on table2 referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +with wcte as (insert into table1 values (42)) + insert into table2 values ('hello world'); +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +with wcte as (insert into table1 values (43)) + insert into table1 values (44); +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +select * from table1; + a +--- +(0 rows) + +select * from table2; + a +--- +(0 rows) + +drop table table1; +drop table table2; +-- +-- Verify behavior of INSERT ... ON CONFLICT DO UPDATE ... with +-- transition tables. +-- +create table my_table (a int primary key, b text); +create trigger my_table_insert_trig + after insert on my_table referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger my_table_update_trig + after update on my_table referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +-- inserts only +insert into my_table values (1, 'AAA'), (2, 'BBB') + on conflict (a) do + update set b = my_table.b || ':' || excluded.b; +-- mixture of inserts and updates +insert into my_table values (1, 'AAA'), (2, 'BBB'), (3, 'CCC'), (4, 'DDD') + on conflict (a) do + update set b = my_table.b || ':' || excluded.b; +-- updates only +insert into my_table values (3, 'CCC'), (4, 'DDD') + on conflict (a) do + update set b = my_table.b || ':' || excluded.b; +-- +-- now using a partitioned table +-- +create table iocdu_tt_parted (a int primary key, b text) partition by list (a); +create table iocdu_tt_parted1 partition of iocdu_tt_parted for values in (1); +NOTICE: table has parent, setting distribution columns to match parent table +create table iocdu_tt_parted2 partition of iocdu_tt_parted for values in (2); +NOTICE: table has parent, setting distribution columns to match parent table +create table iocdu_tt_parted3 partition of iocdu_tt_parted for values in (3); +NOTICE: table has parent, setting distribution columns to match parent table +create table iocdu_tt_parted4 partition of iocdu_tt_parted for values in (4); +NOTICE: table has parent, setting distribution columns to match parent table +create trigger iocdu_tt_parted_insert_trig + after insert on iocdu_tt_parted referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger iocdu_tt_parted_update_trig + after update on iocdu_tt_parted referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +-- inserts only +insert into iocdu_tt_parted values (1, 'AAA'), (2, 'BBB') + on conflict (a) do + update set b = iocdu_tt_parted.b || ':' || excluded.b; +-- mixture of inserts and updates +insert into iocdu_tt_parted values (1, 'AAA'), (2, 'BBB'), (3, 'CCC'), (4, 'DDD') + on conflict (a) do + update set b = iocdu_tt_parted.b || ':' || excluded.b; +-- updates only +insert into iocdu_tt_parted values (3, 'CCC'), (4, 'DDD') + on conflict (a) do + update set b = iocdu_tt_parted.b || ':' || excluded.b; +drop table iocdu_tt_parted; +-- +-- Verify that you can't create a trigger with transition tables for +-- more than one event. +-- +create trigger my_table_multievent_trig + after insert or update on my_table referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +-- +-- Verify that you can't create a trigger with transition tables with +-- a column list. +-- +create trigger my_table_col_update_trig + after update of b on my_table referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +drop table my_table; +-- +-- Test firing of triggers with transition tables by foreign key cascades +-- +create table refd_table (a int primary key, b text); +create table trig_table (a int, b text, + foreign key (a) references refd_table on update cascade on delete cascade +); +create trigger trig_table_before_trig + before insert or update or delete on trig_table + for each statement execute procedure trigger_func('trig_table'); +ERROR: Triggers for statements are not yet supported +create trigger trig_table_insert_trig + after insert on trig_table referencing new table as new_table + for each statement execute procedure dump_insert(); +ERROR: Triggers for statements are not yet supported +create trigger trig_table_update_trig + after update on trig_table referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +ERROR: Triggers for statements are not yet supported +create trigger trig_table_delete_trig + after delete on trig_table referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +insert into refd_table values + (1, 'one'), + (2, 'two'), + (3, 'three'); +insert into trig_table values + (1, 'one a'), + (1, 'one b'), + (2, 'two a'), + (2, 'two b'), + (3, 'three a'), + (3, 'three b'); +update refd_table set a = 11 where b = 'one'; +select * from trig_table; + a | b +---+--------- + 2 | two a + 2 | two b + 3 | three a + 3 | three b + 1 | one a + 1 | one b +(6 rows) + +delete from refd_table where length(b) = 3; +select * from trig_table; + a | b +---+--------- + 2 | two a + 2 | two b + 3 | three a + 3 | three b + 1 | one a + 1 | one b +(6 rows) + +drop table refd_table, trig_table; +-- +-- self-referential FKs are even more fun +-- +create table self_ref (a int primary key, + b int references self_ref(a) on delete cascade); +create trigger self_ref_before_trig + before delete on self_ref + for each statement execute procedure trigger_func('self_ref'); +ERROR: Triggers for statements are not yet supported +create trigger self_ref_r_trig + after delete on self_ref referencing old table as old_table + for each row execute procedure dump_delete(); +create trigger self_ref_s_trig + after delete on self_ref referencing old table as old_table + for each statement execute procedure dump_delete(); +ERROR: Triggers for statements are not yet supported +insert into self_ref values (1, null), (2, 1), (3, 2); +delete from self_ref where a = 1; +NOTICE: trigger = self_ref_r_trig, old table = (1,) +-- without AR trigger, cascaded deletes all end up in one transition table +drop trigger self_ref_r_trig on self_ref; +insert into self_ref values (1, null), (2, 1), (3, 2), (4, 3); +ERROR: duplicate key value violates unique constraint "self_ref_pkey" +DETAIL: Key (a)=(2) already exists. +delete from self_ref where a = 1; +drop table self_ref; +-- cleanup +drop function dump_insert(); +drop function dump_update(); +drop function dump_delete(); +-- +-- Tests for CREATE OR REPLACE TRIGGER +-- +create table my_table (id integer); +create function funcA() returns trigger as $$ +begin + raise notice 'hello from funcA'; + return null; +end; $$ language plpgsql; +create function funcB() returns trigger as $$ +begin + raise notice 'hello from funcB'; + return null; +end; $$ language plpgsql; +create trigger my_trig + after insert on my_table + for each row execute procedure funcA(); +create trigger my_trig + before insert on my_table + for each row execute procedure funcB(); -- should fail +ERROR: trigger "my_trig" for relation "my_table" already exists +insert into my_table values (1); +NOTICE: hello from funcA +create or replace trigger my_trig + before insert on my_table + for each row execute procedure funcB(); -- OK +insert into my_table values (2); -- this insert should become a no-op +NOTICE: hello from funcB +table my_table; + id +---- + 1 +(1 row) + +drop table my_table; +-- test CREATE OR REPLACE TRIGGER on partition table +create table parted_trig (a int) partition by range (a); +create table parted_trig_1 partition of parted_trig + for values from (0) to (1000) partition by range (a); +create table parted_trig_1_1 partition of parted_trig_1 for values from (0) to (100); +create table parted_trig_2 partition of parted_trig for values from (1000) to (2000); +create table default_parted_trig partition of parted_trig default; +-- test that trigger can be replaced by another one +-- at the same level of partition table +create or replace trigger my_trig + after insert on parted_trig + for each row execute procedure funcA(); +insert into parted_trig (a) values (50); +NOTICE: hello from funcA +create or replace trigger my_trig + after insert on parted_trig + for each row execute procedure funcB(); +insert into parted_trig (a) values (50); +NOTICE: hello from funcB +-- test that child trigger cannot be replaced directly +create or replace trigger my_trig + after insert on parted_trig + for each row execute procedure funcA(); +insert into parted_trig (a) values (50); +NOTICE: hello from funcA +create or replace trigger my_trig + after insert on parted_trig_1 + for each row execute procedure funcB(); -- should fail +ERROR: trigger "my_trig" for relation "parted_trig_1" is an internal trigger +insert into parted_trig (a) values (50); +NOTICE: hello from funcA +drop trigger my_trig on parted_trig; +insert into parted_trig (a) values (50); +-- test that user trigger can be overwritten by one defined at upper level +create trigger my_trig + after insert on parted_trig_1 + for each row execute procedure funcA(); +insert into parted_trig (a) values (50); +NOTICE: hello from funcA +create trigger my_trig + after insert on parted_trig + for each row execute procedure funcB(); -- should fail +ERROR: trigger "my_trig" for relation "parted_trig_1" already exists +insert into parted_trig (a) values (50); +NOTICE: hello from funcA +create or replace trigger my_trig + after insert on parted_trig + for each row execute procedure funcB(); +insert into parted_trig (a) values (50); +NOTICE: hello from funcB +-- cleanup +drop table parted_trig; +drop function funcA(); +drop function funcB(); +-- Leave around some objects for other tests +create table trigger_parted (a int primary key) partition by list (a); +create function trigger_parted_trigfunc() returns trigger language plpgsql as + $$ begin end; $$; +create trigger aft_row after insert or update on trigger_parted + for each row execute function trigger_parted_trigfunc(); +create table trigger_parted_p1 partition of trigger_parted for values in (1) + partition by list (a); +create table trigger_parted_p1_1 partition of trigger_parted_p1 for values in (1); +create table trigger_parted_p2 partition of trigger_parted for values in (2) + partition by list (a); +create table trigger_parted_p2_2 partition of trigger_parted_p2 for values in (2); +alter table only trigger_parted_p2 disable trigger aft_row; +alter table trigger_parted_p2_2 enable always trigger aft_row; +-- verify transition table conversion slot's lifetime +-- https://postgr.es/m/39a71864-b120-5a5c-8cc5-c632b6f16761@amazon.com +create table convslot_test_parent (col1 text primary key); +create table convslot_test_child (col1 text primary key, + foreign key (col1) references convslot_test_parent(col1) on delete cascade on update cascade +); +alter table convslot_test_child add column col2 text not null default 'tutu'; +insert into convslot_test_parent(col1) values ('1'); +insert into convslot_test_child(col1) values ('1'); +insert into convslot_test_parent(col1) values ('3'); +insert into convslot_test_child(col1) values ('3'); +create or replace function trigger_function1() +returns trigger +language plpgsql +AS $$ +begin +raise notice 'trigger = %, old_table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' order by col1) from old_table); +return null; +end; $$; +create or replace function trigger_function2() +returns trigger +language plpgsql +AS $$ +begin +raise notice 'trigger = %, new table = %', + TG_NAME, + (select string_agg(new_table::text, ', ' order by col1) from new_table); +return null; +end; $$; +create trigger but_trigger after update on convslot_test_child +referencing new table as new_table +for each statement execute function trigger_function2(); +ERROR: Triggers for statements are not yet supported +update convslot_test_parent set col1 = col1 || '1'; +create or replace function trigger_function3() +returns trigger +language plpgsql +AS $$ +begin +raise notice 'trigger = %, old_table = %, new table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' order by col1) from old_table), + (select string_agg(new_table::text, ', ' order by col1) from new_table); +return null; +end; $$; +create trigger but_trigger2 after update on convslot_test_child +referencing old table as old_table new table as new_table +for each statement execute function trigger_function3(); +ERROR: Triggers for statements are not yet supported +update convslot_test_parent set col1 = col1 || '1'; +create trigger bdt_trigger after delete on convslot_test_child +referencing old table as old_table +for each statement execute function trigger_function1(); +ERROR: Triggers for statements are not yet supported +delete from convslot_test_parent; +drop table convslot_test_child, convslot_test_parent; diff --git a/src/test/singlenode_regress/expected/truncate.out b/src/test/singlenode_regress/expected/truncate.out new file mode 100644 index 00000000000..538bc2144b4 --- /dev/null +++ b/src/test/singlenode_regress/expected/truncate.out @@ -0,0 +1,561 @@ +-- Test basic TRUNCATE functionality. +CREATE TABLE truncate_a (col1 integer primary key); +INSERT INTO truncate_a VALUES (1); +INSERT INTO truncate_a VALUES (2); +SELECT * FROM truncate_a; + col1 +------ + 1 + 2 +(2 rows) + +-- Roll truncate back +BEGIN; +TRUNCATE truncate_a; +ROLLBACK; +SELECT * FROM truncate_a; + col1 +------ + 1 + 2 +(2 rows) + +-- Commit the truncate this time +BEGIN; +TRUNCATE truncate_a; +COMMIT; +SELECT * FROM truncate_a; + col1 +------ +(0 rows) + +-- Test foreign-key checks +CREATE TABLE trunc_b (a int REFERENCES truncate_a); +CREATE TABLE trunc_c (a serial PRIMARY KEY); +CREATE TABLE trunc_d (a int REFERENCES trunc_c); +CREATE TABLE trunc_e (a int REFERENCES truncate_a, b int REFERENCES trunc_c); +TRUNCATE TABLE truncate_a; -- fail +TRUNCATE TABLE truncate_a,trunc_b; -- fail +TRUNCATE TABLE truncate_a,trunc_b,trunc_e; -- ok +TRUNCATE TABLE truncate_a,trunc_e; -- fail +TRUNCATE TABLE trunc_c; -- fail +TRUNCATE TABLE trunc_c,trunc_d; -- fail +TRUNCATE TABLE trunc_c,trunc_d,trunc_e; -- ok +TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a; -- fail +TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a,trunc_b; -- ok +TRUNCATE TABLE truncate_a RESTRICT; -- fail +TRUNCATE TABLE truncate_a CASCADE; -- ok +NOTICE: truncate cascades to table "trunc_b" +NOTICE: truncate cascades to table "trunc_e" +-- circular references +ALTER TABLE truncate_a ADD FOREIGN KEY (col1) REFERENCES trunc_c; +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +-- Add some data to verify that truncating actually works ... +INSERT INTO trunc_c VALUES (1); +INSERT INTO truncate_a VALUES (1); +INSERT INTO trunc_b VALUES (1); +INSERT INTO trunc_d VALUES (1); +INSERT INTO trunc_e VALUES (1,1); +TRUNCATE TABLE trunc_c; +TRUNCATE TABLE trunc_c,truncate_a; +TRUNCATE TABLE trunc_c,truncate_a,trunc_d; +TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e; +TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e,trunc_b; +-- Verify that truncating did actually work +SELECT * FROM truncate_a + UNION ALL + SELECT * FROM trunc_c + UNION ALL + SELECT * FROM trunc_b + UNION ALL + SELECT * FROM trunc_d; + col1 +------ +(0 rows) + +SELECT * FROM trunc_e; + a | b +---+--- +(0 rows) + +-- Add data again to test TRUNCATE ... CASCADE +INSERT INTO trunc_c VALUES (1); +INSERT INTO truncate_a VALUES (1); +INSERT INTO trunc_b VALUES (1); +INSERT INTO trunc_d VALUES (1); +INSERT INTO trunc_e VALUES (1,1); +TRUNCATE TABLE trunc_c CASCADE; -- ok +NOTICE: truncate cascades to table "truncate_a" +NOTICE: truncate cascades to table "trunc_d" +NOTICE: truncate cascades to table "trunc_e" +NOTICE: truncate cascades to table "trunc_b" +SELECT * FROM truncate_a + UNION ALL + SELECT * FROM trunc_c + UNION ALL + SELECT * FROM trunc_b + UNION ALL + SELECT * FROM trunc_d; + col1 +------ +(0 rows) + +SELECT * FROM trunc_e; + a | b +---+--- +(0 rows) + +DROP TABLE truncate_a,trunc_c,trunc_b,trunc_d,trunc_e CASCADE; +-- Test TRUNCATE with inheritance +CREATE TABLE trunc_f (col1 integer primary key); +INSERT INTO trunc_f VALUES (1); +INSERT INTO trunc_f VALUES (2); +CREATE TABLE trunc_fa (col2a text) INHERITS (trunc_f); +INSERT INTO trunc_fa VALUES (3, 'three'); +CREATE TABLE trunc_fb (col2b int) INHERITS (trunc_f); +INSERT INTO trunc_fb VALUES (4, 444); +CREATE TABLE trunc_faa (col3 text) INHERITS (trunc_fa); +INSERT INTO trunc_faa VALUES (5, 'five', 'FIVE'); +BEGIN; +SELECT * FROM trunc_f; + col1 +------ + 1 + 2 + 3 + 4 + 5 +(5 rows) + +TRUNCATE trunc_f; +SELECT * FROM trunc_f; + col1 +------ +(0 rows) + +ROLLBACK; +BEGIN; +SELECT * FROM trunc_f; + col1 +------ + 1 + 2 + 3 + 4 + 5 +(5 rows) + +TRUNCATE ONLY trunc_f; +SELECT * FROM trunc_f; + col1 +------ + 3 + 4 + 5 +(3 rows) + +ROLLBACK; +BEGIN; +SELECT * FROM trunc_f; + col1 +------ + 1 + 2 + 3 + 4 + 5 +(5 rows) + +SELECT * FROM trunc_fa; + col1 | col2a +------+------- + 3 | three + 5 | five +(2 rows) + +SELECT * FROM trunc_faa; + col1 | col2a | col3 +------+-------+------ + 5 | five | FIVE +(1 row) + +TRUNCATE ONLY trunc_fb, ONLY trunc_fa; +SELECT * FROM trunc_f; + col1 +------ + 1 + 2 + 5 +(3 rows) + +SELECT * FROM trunc_fa; + col1 | col2a +------+------- + 5 | five +(1 row) + +SELECT * FROM trunc_faa; + col1 | col2a | col3 +------+-------+------ + 5 | five | FIVE +(1 row) + +ROLLBACK; +BEGIN; +SELECT * FROM trunc_f; + col1 +------ + 1 + 2 + 3 + 4 + 5 +(5 rows) + +SELECT * FROM trunc_fa; + col1 | col2a +------+------- + 3 | three + 5 | five +(2 rows) + +SELECT * FROM trunc_faa; + col1 | col2a | col3 +------+-------+------ + 5 | five | FIVE +(1 row) + +TRUNCATE ONLY trunc_fb, trunc_fa; +SELECT * FROM trunc_f; + col1 +------ + 1 + 2 +(2 rows) + +SELECT * FROM trunc_fa; + col1 | col2a +------+------- +(0 rows) + +SELECT * FROM trunc_faa; + col1 | col2a | col3 +------+-------+------ +(0 rows) + +ROLLBACK; +DROP TABLE trunc_f CASCADE; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table trunc_fa +drop cascades to table trunc_faa +drop cascades to table trunc_fb +-- Test ON TRUNCATE triggers +CREATE TABLE trunc_trigger_test (f1 int, f2 text, f3 text); +CREATE TABLE trunc_trigger_log (tgop text, tglevel text, tgwhen text, + tgargv text, tgtable name, rowcount bigint); +CREATE FUNCTION trunctrigger() RETURNS trigger as $$ +declare c bigint; +begin + execute 'select count(*) from ' || quote_ident(tg_table_name) into c; + insert into trunc_trigger_log values + (TG_OP, TG_LEVEL, TG_WHEN, TG_ARGV[0], tg_table_name, c); + return null; +end; +$$ LANGUAGE plpgsql; +-- basic before trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); +CREATE TRIGGER t +BEFORE TRUNCATE ON trunc_trigger_test +FOR EACH STATEMENT +EXECUTE PROCEDURE trunctrigger('before trigger truncate'); +ERROR: Triggers for statements are not yet supported +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; + Row count in test table +------------------------- + 2 +(1 row) + +SELECT * FROM trunc_trigger_log; + tgop | tglevel | tgwhen | tgargv | tgtable | rowcount +------+---------+--------+--------+---------+---------- +(0 rows) + +TRUNCATE trunc_trigger_test; +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; + Row count in test table +------------------------- + 0 +(1 row) + +SELECT * FROM trunc_trigger_log; + tgop | tglevel | tgwhen | tgargv | tgtable | rowcount +------+---------+--------+--------+---------+---------- +(0 rows) + +DROP TRIGGER t ON trunc_trigger_test; +ERROR: trigger "t" for table "trunc_trigger_test" does not exist +truncate trunc_trigger_log; +-- same test with an after trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); +CREATE TRIGGER tt +AFTER TRUNCATE ON trunc_trigger_test +FOR EACH STATEMENT +EXECUTE PROCEDURE trunctrigger('after trigger truncate'); +ERROR: Triggers for statements are not yet supported +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; + Row count in test table +------------------------- + 2 +(1 row) + +SELECT * FROM trunc_trigger_log; + tgop | tglevel | tgwhen | tgargv | tgtable | rowcount +------+---------+--------+--------+---------+---------- +(0 rows) + +TRUNCATE trunc_trigger_test; +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; + Row count in test table +------------------------- + 0 +(1 row) + +SELECT * FROM trunc_trigger_log; + tgop | tglevel | tgwhen | tgargv | tgtable | rowcount +------+---------+--------+--------+---------+---------- +(0 rows) + +DROP TABLE trunc_trigger_test; +DROP TABLE trunc_trigger_log; +DROP FUNCTION trunctrigger(); +-- test TRUNCATE ... RESTART IDENTITY +CREATE SEQUENCE truncate_a_id1 START WITH 33 CACHE 1; +CREATE TABLE truncate_a (id serial, + id1 integer default nextval('truncate_a_id1')); +ALTER SEQUENCE truncate_a_id1 OWNED BY truncate_a.id1; +INSERT INTO truncate_a DEFAULT VALUES; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; + id | id1 +----+----- + 1 | 33 + 2 | 34 +(2 rows) + +TRUNCATE truncate_a; +INSERT INTO truncate_a DEFAULT VALUES; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; + id | id1 +----+----- + 3 | 35 + 4 | 36 +(2 rows) + +TRUNCATE truncate_a RESTART IDENTITY; +INSERT INTO truncate_a DEFAULT VALUES; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; + id | id1 +----+----- + 1 | 33 + 2 | 34 +(2 rows) + +CREATE TABLE truncate_b (id int GENERATED ALWAYS AS IDENTITY (START WITH 44)); +INSERT INTO truncate_b DEFAULT VALUES; +INSERT INTO truncate_b DEFAULT VALUES; +SELECT * FROM truncate_b; + id +---- + 44 + 45 +(2 rows) + +TRUNCATE truncate_b; +INSERT INTO truncate_b DEFAULT VALUES; +INSERT INTO truncate_b DEFAULT VALUES; +SELECT * FROM truncate_b; + id +---- + 46 + 47 +(2 rows) + +TRUNCATE truncate_b RESTART IDENTITY; +INSERT INTO truncate_b DEFAULT VALUES; +INSERT INTO truncate_b DEFAULT VALUES; +SELECT * FROM truncate_b; + id +---- + 44 + 45 +(2 rows) + +-- check rollback of a RESTART IDENTITY operation +BEGIN; +TRUNCATE truncate_a RESTART IDENTITY; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; + id | id1 +----+----- + 1 | 33 +(1 row) + +ROLLBACK; +INSERT INTO truncate_a DEFAULT VALUES; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; + id | id1 +----+----- + 1 | 33 + 2 | 34 + 3 | 35 + 4 | 36 +(4 rows) + +DROP TABLE truncate_a; +SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped +ERROR: relation "truncate_a_id1" does not exist +LINE 1: SELECT nextval('truncate_a_id1'); + ^ +-- partitioned table +CREATE TABLE truncparted (a int, b char) PARTITION BY LIST (a); +-- error, can't truncate a partitioned table +TRUNCATE ONLY truncparted; +ERROR: cannot truncate only a partitioned table +HINT: Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly. +CREATE TABLE truncparted1 PARTITION OF truncparted FOR VALUES IN (1); +INSERT INTO truncparted VALUES (1, 'a'); +-- error, must truncate partitions +TRUNCATE ONLY truncparted; +ERROR: cannot truncate only a partitioned table +HINT: Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly. +TRUNCATE truncparted; +DROP TABLE truncparted; +-- foreign key on partitioned table: partition key is referencing column. +-- Make sure truncate did execute on all tables +CREATE FUNCTION tp_ins_data() RETURNS void LANGUAGE plpgsql AS $$ + BEGIN + INSERT INTO truncprim VALUES (1), (100), (150); + INSERT INTO truncpart VALUES (1), (100), (150); + END +$$; +CREATE FUNCTION tp_chk_data(OUT pktb regclass, OUT pkval int, OUT fktb regclass, OUT fkval int) + RETURNS SETOF record LANGUAGE plpgsql AS $$ + BEGIN + RETURN QUERY SELECT + pk.tableoid::regclass, pk.a, fk.tableoid::regclass, fk.a + FROM truncprim pk FULL JOIN truncpart fk USING (a) + ORDER BY 2, 4; + END +$$; +CREATE TABLE truncprim (a int PRIMARY KEY); +CREATE TABLE truncpart (a int REFERENCES truncprim) + PARTITION BY RANGE (a); +CREATE TABLE truncpart_1 PARTITION OF truncpart FOR VALUES FROM (0) TO (100); +CREATE TABLE truncpart_2 PARTITION OF truncpart FOR VALUES FROM (100) TO (200) + PARTITION BY RANGE (a); +CREATE TABLE truncpart_2_1 PARTITION OF truncpart_2 FOR VALUES FROM (100) TO (150); +CREATE TABLE truncpart_2_d PARTITION OF truncpart_2 DEFAULT; +-- GPDB: this doesn't fail in GPDB, because GPDB doesn't enforce primary keys. +TRUNCATE TABLE truncprim; -- should fail +select tp_ins_data(); + tp_ins_data +------------- + +(1 row) + +-- should truncate everything +TRUNCATE TABLE truncprim, truncpart; +select * from tp_chk_data(); + pktb | pkval | fktb | fkval +------+-------+------+------- +(0 rows) + +select tp_ins_data(); + tp_ins_data +------------- + +(1 row) + +-- should truncate everything +TRUNCATE TABLE truncprim CASCADE; +NOTICE: truncate cascades to table "truncpart" +NOTICE: truncate cascades to table "truncpart_1" +NOTICE: truncate cascades to table "truncpart_2" +NOTICE: truncate cascades to table "truncpart_2_1" +NOTICE: truncate cascades to table "truncpart_2_d" +SELECT * FROM tp_chk_data(); + pktb | pkval | fktb | fkval +------+-------+------+------- +(0 rows) + +SELECT tp_ins_data(); + tp_ins_data +------------- + +(1 row) + +-- should truncate all partitions +TRUNCATE TABLE truncpart; +SELECT * FROM tp_chk_data(); + pktb | pkval | fktb | fkval +-----------+-------+------+------- + truncprim | 1 | | + truncprim | 100 | | + truncprim | 150 | | +(3 rows) + +DROP TABLE truncprim, truncpart; +DROP FUNCTION tp_ins_data(), tp_chk_data(); +-- test cascade when referencing a partitioned table +CREATE TABLE trunc_a (a INT PRIMARY KEY) PARTITION BY RANGE (a); +CREATE TABLE trunc_a1 PARTITION OF trunc_a FOR VALUES FROM (0) TO (10); +CREATE TABLE trunc_a2 PARTITION OF trunc_a FOR VALUES FROM (10) TO (20) + PARTITION BY RANGE (a); +CREATE TABLE trunc_a21 PARTITION OF trunc_a2 FOR VALUES FROM (10) TO (12); +CREATE TABLE trunc_a22 PARTITION OF trunc_a2 FOR VALUES FROM (12) TO (16); +CREATE TABLE trunc_a2d PARTITION OF trunc_a2 DEFAULT; +CREATE TABLE trunc_a3 PARTITION OF trunc_a FOR VALUES FROM (20) TO (30); +INSERT INTO trunc_a VALUES (0), (5), (10), (15), (20), (25); +-- truncate a partition cascading to a table +CREATE TABLE ref_b ( + b INT PRIMARY KEY, + a INT REFERENCES trunc_a(a) ON DELETE CASCADE +); +INSERT INTO ref_b VALUES (10, 0), (50, 5), (100, 10), (150, 15); +TRUNCATE TABLE trunc_a1 CASCADE; +NOTICE: truncate cascades to table "ref_b" +SELECT a FROM ref_b; + a +--- +(0 rows) + +DROP TABLE ref_b; +-- truncate a partition cascading to a partitioned table +CREATE TABLE ref_c ( + c INT PRIMARY KEY, + a INT REFERENCES trunc_a(a) ON DELETE CASCADE +) PARTITION BY RANGE (c); +CREATE TABLE ref_c1 PARTITION OF ref_c FOR VALUES FROM (100) TO (200); +CREATE TABLE ref_c2 PARTITION OF ref_c FOR VALUES FROM (200) TO (300); +INSERT INTO ref_c VALUES (100, 10), (150, 15), (200, 20), (250, 25); +TRUNCATE TABLE trunc_a21 CASCADE; +NOTICE: truncate cascades to table "ref_c" +NOTICE: truncate cascades to table "ref_c1" +NOTICE: truncate cascades to table "ref_c2" +SELECT a as "from table ref_c" FROM ref_c; + from table ref_c +------------------ +(0 rows) + +SELECT a as "from table trunc_a" FROM trunc_a ORDER BY a; + from table trunc_a +-------------------- + 15 + 20 + 25 +(3 rows) + +DROP TABLE trunc_a, ref_c; diff --git a/src/test/singlenode_regress/expected/tsdicts.out b/src/test/singlenode_regress/expected/tsdicts.out new file mode 100644 index 00000000000..c8042931429 --- /dev/null +++ b/src/test/singlenode_regress/expected/tsdicts.out @@ -0,0 +1,689 @@ +--Test text search dictionaries and configurations +-- Test ISpell dictionary with ispell affix file +CREATE TEXT SEARCH DICTIONARY ispell ( + Template=ispell, + DictFile=ispell_sample, + AffFile=ispell_sample +); +SELECT ts_lexize('ispell', 'skies'); + ts_lexize +----------- + {sky} +(1 row) + +SELECT ts_lexize('ispell', 'bookings'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('ispell', 'booking'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('ispell', 'foot'); + ts_lexize +----------- + {foot} +(1 row) + +SELECT ts_lexize('ispell', 'foots'); + ts_lexize +----------- + {foot} +(1 row) + +SELECT ts_lexize('ispell', 'rebookings'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('ispell', 'rebooking'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('ispell', 'rebook'); + ts_lexize +----------- + +(1 row) + +SELECT ts_lexize('ispell', 'unbookings'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('ispell', 'unbooking'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('ispell', 'unbook'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('ispell', 'footklubber'); + ts_lexize +---------------- + {foot,klubber} +(1 row) + +SELECT ts_lexize('ispell', 'footballklubber'); + ts_lexize +------------------------------------------------------ + {footballklubber,foot,ball,klubber,football,klubber} +(1 row) + +SELECT ts_lexize('ispell', 'ballyklubber'); + ts_lexize +---------------- + {ball,klubber} +(1 row) + +SELECT ts_lexize('ispell', 'footballyklubber'); + ts_lexize +--------------------- + {foot,ball,klubber} +(1 row) + +-- Test ISpell dictionary with hunspell affix file +CREATE TEXT SEARCH DICTIONARY hunspell ( + Template=ispell, + DictFile=ispell_sample, + AffFile=hunspell_sample +); +SELECT ts_lexize('hunspell', 'skies'); + ts_lexize +----------- + {sky} +(1 row) + +SELECT ts_lexize('hunspell', 'bookings'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell', 'booking'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell', 'foot'); + ts_lexize +----------- + {foot} +(1 row) + +SELECT ts_lexize('hunspell', 'foots'); + ts_lexize +----------- + {foot} +(1 row) + +SELECT ts_lexize('hunspell', 'rebookings'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell', 'rebooking'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell', 'rebook'); + ts_lexize +----------- + +(1 row) + +SELECT ts_lexize('hunspell', 'unbookings'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell', 'unbooking'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell', 'unbook'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell', 'footklubber'); + ts_lexize +---------------- + {foot,klubber} +(1 row) + +SELECT ts_lexize('hunspell', 'footballklubber'); + ts_lexize +------------------------------------------------------ + {footballklubber,foot,ball,klubber,football,klubber} +(1 row) + +SELECT ts_lexize('hunspell', 'ballyklubber'); + ts_lexize +---------------- + {ball,klubber} +(1 row) + +SELECT ts_lexize('hunspell', 'footballyklubber'); + ts_lexize +--------------------- + {foot,ball,klubber} +(1 row) + +-- Test ISpell dictionary with hunspell affix file with FLAG long parameter +CREATE TEXT SEARCH DICTIONARY hunspell_long ( + Template=ispell, + DictFile=hunspell_sample_long, + AffFile=hunspell_sample_long +); +SELECT ts_lexize('hunspell_long', 'skies'); + ts_lexize +----------- + {sky} +(1 row) + +SELECT ts_lexize('hunspell_long', 'bookings'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell_long', 'booking'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell_long', 'foot'); + ts_lexize +----------- + {foot} +(1 row) + +SELECT ts_lexize('hunspell_long', 'foots'); + ts_lexize +----------- + {foot} +(1 row) + +SELECT ts_lexize('hunspell_long', 'rebookings'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell_long', 'rebooking'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell_long', 'rebook'); + ts_lexize +----------- + +(1 row) + +SELECT ts_lexize('hunspell_long', 'unbookings'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell_long', 'unbooking'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell_long', 'unbook'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell_long', 'booked'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell_long', 'footklubber'); + ts_lexize +---------------- + {foot,klubber} +(1 row) + +SELECT ts_lexize('hunspell_long', 'footballklubber'); + ts_lexize +------------------------------------------------------ + {footballklubber,foot,ball,klubber,football,klubber} +(1 row) + +SELECT ts_lexize('hunspell_long', 'ballyklubber'); + ts_lexize +---------------- + {ball,klubber} +(1 row) + +SELECT ts_lexize('hunspell_long', 'ballsklubber'); + ts_lexize +---------------- + {ball,klubber} +(1 row) + +SELECT ts_lexize('hunspell_long', 'footballyklubber'); + ts_lexize +--------------------- + {foot,ball,klubber} +(1 row) + +SELECT ts_lexize('hunspell_long', 'ex-machina'); + ts_lexize +--------------- + {ex-,machina} +(1 row) + +-- Test ISpell dictionary with hunspell affix file with FLAG num parameter +CREATE TEXT SEARCH DICTIONARY hunspell_num ( + Template=ispell, + DictFile=hunspell_sample_num, + AffFile=hunspell_sample_num +); +SELECT ts_lexize('hunspell_num', 'skies'); + ts_lexize +----------- + {sky} +(1 row) + +SELECT ts_lexize('hunspell_num', 'sk'); + ts_lexize +----------- + {sky} +(1 row) + +SELECT ts_lexize('hunspell_num', 'bookings'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell_num', 'booking'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell_num', 'foot'); + ts_lexize +----------- + {foot} +(1 row) + +SELECT ts_lexize('hunspell_num', 'foots'); + ts_lexize +----------- + {foot} +(1 row) + +SELECT ts_lexize('hunspell_num', 'rebookings'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell_num', 'rebooking'); + ts_lexize +---------------- + {booking,book} +(1 row) + +SELECT ts_lexize('hunspell_num', 'rebook'); + ts_lexize +----------- + +(1 row) + +SELECT ts_lexize('hunspell_num', 'unbookings'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell_num', 'unbooking'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell_num', 'unbook'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell_num', 'booked'); + ts_lexize +----------- + {book} +(1 row) + +SELECT ts_lexize('hunspell_num', 'footklubber'); + ts_lexize +---------------- + {foot,klubber} +(1 row) + +SELECT ts_lexize('hunspell_num', 'footballklubber'); + ts_lexize +------------------------------------------------------ + {footballklubber,foot,ball,klubber,football,klubber} +(1 row) + +SELECT ts_lexize('hunspell_num', 'ballyklubber'); + ts_lexize +---------------- + {ball,klubber} +(1 row) + +SELECT ts_lexize('hunspell_num', 'footballyklubber'); + ts_lexize +--------------------- + {foot,ball,klubber} +(1 row) + +-- Test suitability of affix and dict files +CREATE TEXT SEARCH DICTIONARY hunspell_err ( + Template=ispell, + DictFile=ispell_sample, + AffFile=hunspell_sample_long +); +ERROR: invalid affix alias "GJUS" +CREATE TEXT SEARCH DICTIONARY hunspell_err ( + Template=ispell, + DictFile=ispell_sample, + AffFile=hunspell_sample_num +); +ERROR: invalid affix flag "SZ\" +CREATE TEXT SEARCH DICTIONARY hunspell_invalid_1 ( + Template=ispell, + DictFile=hunspell_sample_long, + AffFile=ispell_sample +); +CREATE TEXT SEARCH DICTIONARY hunspell_invalid_2 ( + Template=ispell, + DictFile=hunspell_sample_long, + AffFile=hunspell_sample_num +); +CREATE TEXT SEARCH DICTIONARY hunspell_invalid_3 ( + Template=ispell, + DictFile=hunspell_sample_num, + AffFile=ispell_sample +); +CREATE TEXT SEARCH DICTIONARY hunspell_err ( + Template=ispell, + DictFile=hunspell_sample_num, + AffFile=hunspell_sample_long +); +ERROR: invalid affix alias "302,301,202,303" +-- Synonym dictionary +CREATE TEXT SEARCH DICTIONARY synonym ( + Template=synonym, + Synonyms=synonym_sample +); +SELECT ts_lexize('synonym', 'PoStGrEs'); + ts_lexize +----------- + {pgsql} +(1 row) + +SELECT ts_lexize('synonym', 'Gogle'); + ts_lexize +----------- + {googl} +(1 row) + +SELECT ts_lexize('synonym', 'indices'); + ts_lexize +----------- + {index} +(1 row) + +-- test altering boolean parameters +SELECT dictinitoption FROM pg_ts_dict WHERE dictname = 'synonym'; + dictinitoption +----------------------------- + synonyms = 'synonym_sample' +(1 row) + +ALTER TEXT SEARCH DICTIONARY synonym (CaseSensitive = 1); +SELECT ts_lexize('synonym', 'PoStGrEs'); + ts_lexize +----------- + +(1 row) + +SELECT dictinitoption FROM pg_ts_dict WHERE dictname = 'synonym'; + dictinitoption +------------------------------------------------ + synonyms = 'synonym_sample', casesensitive = 1 +(1 row) + +ALTER TEXT SEARCH DICTIONARY synonym (CaseSensitive = 2); -- fail +ERROR: casesensitive requires a Boolean value +ALTER TEXT SEARCH DICTIONARY synonym (CaseSensitive = off); +SELECT ts_lexize('synonym', 'PoStGrEs'); + ts_lexize +----------- + {pgsql} +(1 row) + +SELECT dictinitoption FROM pg_ts_dict WHERE dictname = 'synonym'; + dictinitoption +---------------------------------------------------- + synonyms = 'synonym_sample', casesensitive = 'off' +(1 row) + +-- Create and simple test thesaurus dictionary +-- More tests in configuration checks because ts_lexize() +-- cannot pass more than one word to thesaurus. +CREATE TEXT SEARCH DICTIONARY thesaurus ( + Template=thesaurus, + DictFile=thesaurus_sample, + Dictionary=english_stem +); +SELECT ts_lexize('thesaurus', 'one'); + ts_lexize +----------- + {1} +(1 row) + +-- Test ispell dictionary in configuration +CREATE TEXT SEARCH CONFIGURATION ispell_tst ( + COPY=english +); +ALTER TEXT SEARCH CONFIGURATION ispell_tst ALTER MAPPING FOR + word, numword, asciiword, hword, numhword, asciihword, hword_part, hword_numpart, hword_asciipart + WITH ispell, english_stem; +SELECT to_tsvector('ispell_tst', 'Booking the skies after rebookings for footballklubber from a foot'); + to_tsvector +---------------------------------------------------------------------------------------------------- + 'ball':7 'book':1,5 'booking':1,5 'foot':7,10 'football':7 'footballklubber':7 'klubber':7 'sky':3 +(1 row) + +SELECT to_tsquery('ispell_tst', 'footballklubber'); + to_tsquery +-------------------------------------------------------------------------- + 'footballklubber' | 'foot' & 'ball' & 'klubber' | 'football' & 'klubber' +(1 row) + +SELECT to_tsquery('ispell_tst', 'footballyklubber:b & rebookings:A & sky'); + to_tsquery +------------------------------------------------------------------------ + 'foot':B & 'ball':B & 'klubber':B & ( 'booking':A | 'book':A ) & 'sky' +(1 row) + +-- Test ispell dictionary with hunspell affix in configuration +CREATE TEXT SEARCH CONFIGURATION hunspell_tst ( + COPY=ispell_tst +); +ALTER TEXT SEARCH CONFIGURATION hunspell_tst ALTER MAPPING + REPLACE ispell WITH hunspell; +SELECT to_tsvector('hunspell_tst', 'Booking the skies after rebookings for footballklubber from a foot'); + to_tsvector +---------------------------------------------------------------------------------------------------- + 'ball':7 'book':1,5 'booking':1,5 'foot':7,10 'football':7 'footballklubber':7 'klubber':7 'sky':3 +(1 row) + +SELECT to_tsquery('hunspell_tst', 'footballklubber'); + to_tsquery +-------------------------------------------------------------------------- + 'footballklubber' | 'foot' & 'ball' & 'klubber' | 'football' & 'klubber' +(1 row) + +SELECT to_tsquery('hunspell_tst', 'footballyklubber:b & rebookings:A & sky'); + to_tsquery +------------------------------------------------------------------------ + 'foot':B & 'ball':B & 'klubber':B & ( 'booking':A | 'book':A ) & 'sky' +(1 row) + +SELECT to_tsquery('hunspell_tst', 'footballyklubber:b <-> sky'); + to_tsquery +------------------------------------------------- + ( 'foot':B & 'ball':B & 'klubber':B ) <-> 'sky' +(1 row) + +SELECT phraseto_tsquery('hunspell_tst', 'footballyklubber sky'); + phraseto_tsquery +------------------------------------------- + ( 'foot' & 'ball' & 'klubber' ) <-> 'sky' +(1 row) + +-- Test ispell dictionary with hunspell affix with FLAG long in configuration +ALTER TEXT SEARCH CONFIGURATION hunspell_tst ALTER MAPPING + REPLACE hunspell WITH hunspell_long; +SELECT to_tsvector('hunspell_tst', 'Booking the skies after rebookings for footballklubber from a foot'); + to_tsvector +---------------------------------------------------------------------------------------------------- + 'ball':7 'book':1,5 'booking':1,5 'foot':7,10 'football':7 'footballklubber':7 'klubber':7 'sky':3 +(1 row) + +SELECT to_tsquery('hunspell_tst', 'footballklubber'); + to_tsquery +-------------------------------------------------------------------------- + 'footballklubber' | 'foot' & 'ball' & 'klubber' | 'football' & 'klubber' +(1 row) + +SELECT to_tsquery('hunspell_tst', 'footballyklubber:b & rebookings:A & sky'); + to_tsquery +------------------------------------------------------------------------ + 'foot':B & 'ball':B & 'klubber':B & ( 'booking':A | 'book':A ) & 'sky' +(1 row) + +-- Test ispell dictionary with hunspell affix with FLAG num in configuration +ALTER TEXT SEARCH CONFIGURATION hunspell_tst ALTER MAPPING + REPLACE hunspell_long WITH hunspell_num; +SELECT to_tsvector('hunspell_tst', 'Booking the skies after rebookings for footballklubber from a foot'); + to_tsvector +---------------------------------------------------------------------------------------------------- + 'ball':7 'book':1,5 'booking':1,5 'foot':7,10 'football':7 'footballklubber':7 'klubber':7 'sky':3 +(1 row) + +SELECT to_tsquery('hunspell_tst', 'footballklubber'); + to_tsquery +-------------------------------------------------------------------------- + 'footballklubber' | 'foot' & 'ball' & 'klubber' | 'football' & 'klubber' +(1 row) + +SELECT to_tsquery('hunspell_tst', 'footballyklubber:b & rebookings:A & sky'); + to_tsquery +------------------------------------------------------------------------ + 'foot':B & 'ball':B & 'klubber':B & ( 'booking':A | 'book':A ) & 'sky' +(1 row) + +-- Test synonym dictionary in configuration +CREATE TEXT SEARCH CONFIGURATION synonym_tst ( + COPY=english +); +ALTER TEXT SEARCH CONFIGURATION synonym_tst ALTER MAPPING FOR + asciiword, hword_asciipart, asciihword + WITH synonym, english_stem; +SELECT to_tsvector('synonym_tst', 'Postgresql is often called as postgres or pgsql and pronounced as postgre'); + to_tsvector +--------------------------------------------------- + 'call':4 'often':3 'pgsql':1,6,8,12 'pronounc':10 +(1 row) + +SELECT to_tsvector('synonym_tst', 'Most common mistake is to write Gogle instead of Google'); + to_tsvector +---------------------------------------------------------- + 'common':2 'googl':7,10 'instead':8 'mistak':3 'write':6 +(1 row) + +SELECT to_tsvector('synonym_tst', 'Indexes or indices - Which is right plural form of index?'); + to_tsvector +---------------------------------------------- + 'form':8 'index':1,3,10 'plural':7 'right':6 +(1 row) + +SELECT to_tsquery('synonym_tst', 'Index & indices'); + to_tsquery +--------------------- + 'index' & 'index':* +(1 row) + +-- test thesaurus in configuration +-- see thesaurus_sample.ths to understand 'odd' resulting tsvector +CREATE TEXT SEARCH CONFIGURATION thesaurus_tst ( + COPY=synonym_tst +); +ALTER TEXT SEARCH CONFIGURATION thesaurus_tst ALTER MAPPING FOR + asciiword, hword_asciipart, asciihword + WITH synonym, thesaurus, english_stem; +SELECT to_tsvector('thesaurus_tst', 'one postgres one two one two three one'); + to_tsvector +---------------------------------- + '1':1,5 '12':3 '123':4 'pgsql':2 +(1 row) + +SELECT to_tsvector('thesaurus_tst', 'Supernovae star is very new star and usually called supernovae (abbreviation SN)'); + to_tsvector +-------------------------------------------------------------- + 'abbrevi':10 'call':8 'new':4 'sn':1,9,11 'star':5 'usual':7 +(1 row) + +SELECT to_tsvector('thesaurus_tst', 'Booking tickets is looking like a booking a tickets'); + to_tsvector +------------------------------------------------------- + 'card':3,10 'invit':2,9 'like':6 'look':5 'order':1,8 +(1 row) + +-- invalid: non-lowercase quoted identifiers +CREATE TEXT SEARCH DICTIONARY tsdict_case +( + Template = ispell, + "DictFile" = ispell_sample, + "AffFile" = ispell_sample +); +ERROR: unrecognized Ispell parameter: "DictFile" diff --git a/src/test/singlenode_regress/expected/tsearch.out b/src/test/singlenode_regress/expected/tsearch.out new file mode 100644 index 00000000000..4f8f22d9eca --- /dev/null +++ b/src/test/singlenode_regress/expected/tsearch.out @@ -0,0 +1,2863 @@ +set optimizer_print_missing_stats = off; +-- +-- Sanity checks for text search catalogs +-- +-- NB: we assume the oidjoins test will have caught any dangling links, +-- that is OID or REGPROC fields that are not zero and do not match some +-- row in the linked-to table. However, if we want to enforce that a link +-- field can't be 0, we have to check it here. +-- Find unexpected zero link entries +SELECT oid, prsname +FROM pg_ts_parser +WHERE prsnamespace = 0 OR prsstart = 0 OR prstoken = 0 OR prsend = 0 OR + -- prsheadline is optional + prslextype = 0; + oid | prsname +-----+--------- +(0 rows) + +SELECT oid, dictname +FROM pg_ts_dict +WHERE dictnamespace = 0 OR dictowner = 0 OR dicttemplate = 0; + oid | dictname +-----+---------- +(0 rows) + +SELECT oid, tmplname +FROM pg_ts_template +WHERE tmplnamespace = 0 OR tmpllexize = 0; -- tmplinit is optional + oid | tmplname +-----+---------- +(0 rows) + +SELECT oid, cfgname +FROM pg_ts_config +WHERE cfgnamespace = 0 OR cfgowner = 0 OR cfgparser = 0; + oid | cfgname +-----+--------- +(0 rows) + +SELECT mapcfg, maptokentype, mapseqno +FROM pg_ts_config_map +WHERE mapcfg = 0 OR mapdict = 0; + mapcfg | maptokentype | mapseqno +--------+--------------+---------- +(0 rows) + +-- Look for pg_ts_config_map entries that aren't one of parser's token types +SELECT * FROM + ( SELECT oid AS cfgid, (ts_token_type(cfgparser)).tokid AS tokid + FROM pg_ts_config ) AS tt +RIGHT JOIN pg_ts_config_map AS m + ON (tt.cfgid=m.mapcfg AND tt.tokid=m.maptokentype) +WHERE + tt.cfgid IS NULL OR tt.tokid IS NULL; + cfgid | tokid | mapcfg | maptokentype | mapseqno | mapdict +-------+-------+--------+--------------+----------+--------- +(0 rows) + +-- test basic text search behavior without indexes, then with +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; + count +------- + 17 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; + count +------- + 98 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; + count +------- + 23 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; + count +------- + 39 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; + count +------- + 494 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; + count +------- + 432 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; + count +------- + 56 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; + count +------- + 58 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; + count +------- + 452 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + count +------- + 450 +(1 row) + +create index wowidx on test_tsvector using gist (a); +SET enable_seqscan=OFF; +SET enable_indexscan=ON; +SET enable_bitmapscan=OFF; +explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + QUERY PLAN +------------------------------------------------------- + Aggregate + -> Index Scan using wowidx on test_tsvector + Index Cond: (a @@ '''wr'' | ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(4 rows) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; + count +------- + 17 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; + count +------- + 98 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; + count +------- + 23 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; + count +------- + 39 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; + count +------- + 494 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; + count +------- + 432 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; + count +------- + 56 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; + count +------- + 58 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; + count +------- + 452 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + count +------- + 450 +(1 row) + +SET enable_indexscan=OFF; +SET enable_bitmapscan=ON; +explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + QUERY PLAN +------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on test_tsvector + Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery) + -> Bitmap Index Scan on wowidx + Index Cond: (a @@ '''wr'' | ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; + count +------- + 17 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; + count +------- + 98 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; + count +------- + 23 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; + count +------- + 39 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; + count +------- + 494 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; + count +------- + 432 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; + count +------- + 56 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; + count +------- + 58 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; + count +------- + 452 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + count +------- + 450 +(1 row) + +-- Test siglen parameter of GiST tsvector_ops +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(foo=1)); +ERROR: unrecognized parameter "foo" +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=0)); +ERROR: value 0 out of bounds for option "siglen" +DETAIL: Valid values are between "1" and "8168". +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=8192)); +ERROR: value 8192 out of bounds for option "siglen" +DETAIL: Valid values are between "1" and "8168". +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=100,foo='bar')); +ERROR: unrecognized parameter "foo" +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=100, siglen = 200)); +ERROR: parameter "siglen" specified more than once +CREATE INDEX wowidx2 ON test_tsvector USING gist (a tsvector_ops(siglen=1)); +\d test_tsvector + Table "public.test_tsvector" + Column | Type | Collation | Nullable | Default +--------+----------+-----------+----------+--------- + t | text | | | + a | tsvector | | | +Indexes: + "wowidx" gist (a) + "wowidx2" gist (a tsvector_ops (siglen='1')) + +DROP INDEX wowidx; +EXPLAIN (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + QUERY PLAN +------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on test_tsvector + Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery) + -> Bitmap Index Scan on wowidx2 + Index Cond: (a @@ '''wr'' | ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; + count +------- + 17 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; + count +------- + 98 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; + count +------- + 23 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; + count +------- + 39 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; + count +------- + 494 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; + count +------- + 432 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; + count +------- + 56 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; + count +------- + 58 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; + count +------- + 452 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + count +------- + 450 +(1 row) + +DROP INDEX wowidx2; +CREATE INDEX wowidx ON test_tsvector USING gist (a tsvector_ops(siglen=484)); +\d test_tsvector + Table "public.test_tsvector" + Column | Type | Collation | Nullable | Default +--------+----------+-----------+----------+--------- + t | text | | | + a | tsvector | | | +Indexes: + "wowidx" gist (a tsvector_ops (siglen='484')) + +EXPLAIN (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + QUERY PLAN +------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on test_tsvector + Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery) + -> Bitmap Index Scan on wowidx + Index Cond: (a @@ '''wr'' | ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; + count +------- + 17 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; + count +------- + 98 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; + count +------- + 23 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; + count +------- + 39 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; + count +------- + 494 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; + count +------- + 432 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; + count +------- + 56 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; + count +------- + 58 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; + count +------- + 452 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + count +------- + 450 +(1 row) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; +DROP INDEX wowidx; +CREATE INDEX wowidx ON test_tsvector USING gin (a); +SET enable_seqscan=OFF; +-- GIN only supports bitmapscan, so no need to test plain indexscan +explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + QUERY PLAN +------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on test_tsvector + Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery) + -> Bitmap Index Scan on wowidx + Index Cond: (a @@ '''wr'' | ''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; + count +------- + 17 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; + count +------- + 98 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; + count +------- + 23 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; + count +------- + 39 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; + count +------- + 494 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); + count +------- + 158 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; + count +------- + 0 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; + count +------- + 3 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; + count +------- + 432 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; + count +------- + 1 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; + count +------- + 6 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; + count +------- + 508 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; + count +------- + 507 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; + count +------- + 56 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; + count +------- + 58 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; + count +------- + 452 +(1 row) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + count +------- + 450 +(1 row) + +-- Test optimization of non-empty GIN_SEARCH_MODE_ALL queries +EXPLAIN (COSTS OFF) +SELECT count(*) FROM test_tsvector WHERE a @@ '!qh'; + QUERY PLAN +----------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on test_tsvector + Recheck Cond: (a @@ '!''qh'''::tsquery) + -> Bitmap Index Scan on wowidx + Index Cond: (a @@ '!''qh'''::tsquery) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM test_tsvector WHERE a @@ '!qh'; + count +------- + 410 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr' AND a @@ '!qh'; + QUERY PLAN +------------------------------------------------------------------------------------ + Aggregate + -> Bitmap Heap Scan on test_tsvector + Recheck Cond: ((a @@ '''wr'''::tsquery) AND (a @@ '!''qh'''::tsquery)) + -> Bitmap Index Scan on wowidx + Index Cond: ((a @@ '''wr'''::tsquery) AND (a @@ '!''qh'''::tsquery)) + Optimizer: Postgres query optimizer +(6 rows) + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr' AND a @@ '!qh'; + count +------- + 60 +(1 row) + +RESET enable_seqscan; +INSERT INTO test_tsvector VALUES ('???', 'DFG:1A,2B,6C,10 FGH'); +SELECT * FROM ts_stat('SELECT a FROM test_tsvector') ORDER BY ndoc DESC, nentry DESC, word LIMIT 10; + word | ndoc | nentry +------+------+-------- + qq | 108 | 108 + qt | 102 | 102 + qe | 100 | 101 + qh | 98 | 99 + qw | 98 | 98 + qa | 97 | 97 + ql | 94 | 94 + qs | 94 | 94 + qr | 92 | 93 + qi | 92 | 92 +(10 rows) + +SELECT * FROM ts_stat('SELECT a FROM test_tsvector', 'AB') ORDER BY ndoc DESC, nentry DESC, word; + word | ndoc | nentry +------+------+-------- + DFG | 1 | 2 +(1 row) + +--dictionaries and to_tsvector +SELECT ts_lexize('english_stem', 'skies'); + ts_lexize +----------- + {sky} +(1 row) + +SELECT ts_lexize('english_stem', 'identity'); + ts_lexize +----------- + {ident} +(1 row) + +SELECT * FROM ts_token_type('default'); + tokid | alias | description +-------+-----------------+------------------------------------------ + 1 | asciiword | Word, all ASCII + 2 | word | Word, all letters + 3 | numword | Word, letters and digits + 4 | email | Email address + 5 | url | URL + 6 | host | Host + 7 | sfloat | Scientific notation + 8 | version | Version number + 9 | hword_numpart | Hyphenated word part, letters and digits + 10 | hword_part | Hyphenated word part, all letters + 11 | hword_asciipart | Hyphenated word part, all ASCII + 12 | blank | Space symbols + 13 | tag | XML tag + 14 | protocol | Protocol head + 15 | numhword | Hyphenated word, letters and digits + 16 | asciihword | Hyphenated word, all ASCII + 17 | hword | Hyphenated word, all letters + 18 | url_path | URL path + 19 | file | File or path name + 20 | float | Decimal notation + 21 | int | Signed integer + 22 | uint | Unsigned integer + 23 | entity | XML entity +(23 rows) + +SELECT * FROM ts_parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf qwer jf sdjk ewr1> ewri2 +/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234 + wow < jqw <> qwerty'); + tokid | token +-------+-------------------------------------- + 22 | 345 + 12 | + 1 | qwe + 12 | @ + 19 | efd.r + 12 | ' + 14 | http:// + 6 | www.com + 12 | / + 14 | http:// + 5 | aew.werc.ewr/?ad=qwe&dw + 6 | aew.werc.ewr + 18 | /?ad=qwe&dw + 12 | + 5 | 1aew.werc.ewr/?ad=qwe&dw + 6 | 1aew.werc.ewr + 18 | /?ad=qwe&dw + 12 | + 6 | 2aew.werc.ewr + 12 | + 14 | http:// + 5 | 3aew.werc.ewr/?ad=qwe&dw + 6 | 3aew.werc.ewr + 18 | /?ad=qwe&dw + 12 | + 14 | http:// + 6 | 4aew.werc.ewr + 12 | + 14 | http:// + 5 | 5aew.werc.ewr:8100/? + 6 | 5aew.werc.ewr:8100 + 18 | /? + 12 | + 1 | ad + 12 | = + 1 | qwe + 12 | & + 1 | dw + 12 | + 5 | 6aew.werc.ewr:8100/?ad=qwe&dw + 6 | 6aew.werc.ewr:8100 + 18 | /?ad=qwe&dw + 12 | + 5 | 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 + 6 | 7aew.werc.ewr:8100 + 18 | /?ad=qwe&dw=%20%32 + 12 | + 7 | +4.0e-10 + 12 | + 1 | qwe + 12 | + 1 | qwe + 12 | + 1 | qwqwe + 12 | + 20 | 234.435 + 12 | + 22 | 455 + 12 | + 20 | 5.005 + 12 | + 4 | teodor@stack.net + 12 | + 4 | teodor@123-stack.net + 12 | + 4 | 123_teodor@stack.net + 12 | + 4 | 123-teodor@stack.net + 12 | + 16 | qwe-wer + 11 | qwe + 12 | - + 11 | wer + 12 | + 1 | asdf + 12 | + 13 | + 1 | qwer + 12 | + 1 | jf + 12 | + 1 | sdjk + 12 | < + 1 | we + 12 | + 1 | hjwer + 12 | + 13 | + 12 | + 3 | ewr1 + 12 | > + 3 | ewri2 + 12 | + 13 | + 12 | + + | + 19 | /usr/local/fff + 12 | + 19 | /awdf/dwqe/4325 + 12 | + 19 | rewt/ewr + 12 | + 1 | wefjn + 12 | + 19 | /wqe-324/ewr + 12 | + 19 | gist.h + 12 | + 19 | gist.h.c + 12 | + 19 | gist.c + 12 | . + 1 | readline + 12 | + 20 | 4.2 + 12 | + 20 | 4.2 + 12 | . + 20 | 4.2 + 12 | , + 1 | readline + 20 | -4.2 + 12 | + 1 | readline + 20 | -4.2 + 12 | . + 22 | 234 + 12 | + + | + 12 | < + 1 | i + 12 | + 13 | + 12 | + 1 | wow + 12 | + 12 | < + 1 | jqw + 12 | + 12 | <> + 1 | qwerty +(139 rows) + +SELECT to_tsvector('english', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf qwer jf sdjk ewr1> ewri2 +/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234 + wow < jqw <> qwerty'); + to_tsvector +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + '+4.0e-10':28 '-4.2':63,65 '/?':18 '/?ad=qwe&dw':7,10,14,24 '/?ad=qwe&dw=%20%32':27 '/awdf/dwqe/4325':51 '/usr/local/fff':50 '/wqe-324/ewr':54 '123-teodor@stack.net':38 '123_teodor@stack.net':37 '1aew.werc.ewr':9 '1aew.werc.ewr/?ad=qwe&dw':8 '234':66 '234.435':32 '2aew.werc.ewr':11 '345':1 '3aew.werc.ewr':13 '3aew.werc.ewr/?ad=qwe&dw':12 '4.2':59,60,61 '455':33 '4aew.werc.ewr':15 '5.005':34 '5aew.werc.ewr:8100':17 '5aew.werc.ewr:8100/?':16 '6aew.werc.ewr:8100':23 '6aew.werc.ewr:8100/?ad=qwe&dw':22 '7aew.werc.ewr:8100':26 '7aew.werc.ewr:8100/?ad=qwe&dw=%20%32':25 'ad':19 'aew.werc.ewr':6 'aew.werc.ewr/?ad=qwe&dw':5 'asdf':42 'dw':21 'efd.r':3 'ewr1':48 'ewri2':49 'gist.c':57 'gist.h':55 'gist.h.c':56 'hjwer':47 'jf':44 'jqw':69 'qwe':2,20,29,30,40 'qwe-wer':39 'qwer':43 'qwerti':70 'qwqwe':31 'readlin':58,62,64 'rewt/ewr':52 'sdjk':45 'teodor@123-stack.net':36 'teodor@stack.net':35 'wefjn':53 'wer':41 'wow':68 'www.com':4 +(1 row) + +SELECT length(to_tsvector('english', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf qwer jf sdjk ewr1> ewri2 +/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234 + wow < jqw <> qwerty')); + length +-------- + 56 +(1 row) + +-- ts_debug +SELECT * from ts_debug('english', 'abc&nm1;def©ghiõjkl'); + alias | description | token | dictionaries | dictionary | lexemes +-----------+-----------------+----------------------------+----------------+--------------+--------- + tag | XML tag | | {} | | + asciiword | Word, all ASCII | abc | {english_stem} | english_stem | {abc} + entity | XML entity | &nm1; | {} | | + asciiword | Word, all ASCII | def | {english_stem} | english_stem | {def} + entity | XML entity | © | {} | | + asciiword | Word, all ASCII | ghi | {english_stem} | english_stem | {ghi} + entity | XML entity | õ | {} | | + asciiword | Word, all ASCII | jkl | {english_stem} | english_stem | {jkl} + tag | XML tag | | {} | | +(9 rows) + +-- check parsing of URLs +SELECT * from ts_debug('english', 'http://www.harewoodsolutions.co.uk/press.aspx'); + alias | description | token | dictionaries | dictionary | lexemes +----------+---------------+----------------------------------------+--------------+------------+------------------------------------------ + protocol | Protocol head | http:// | {} | | + url | URL | www.harewoodsolutions.co.uk/press.aspx | {simple} | simple | {www.harewoodsolutions.co.uk/press.aspx} + host | Host | www.harewoodsolutions.co.uk | {simple} | simple | {www.harewoodsolutions.co.uk} + url_path | URL path | /press.aspx | {simple} | simple | {/press.aspx} + tag | XML tag | | {} | | +(5 rows) + +SELECT * from ts_debug('english', 'http://aew.wer0c.ewr/id?ad=qwe&dw'); + alias | description | token | dictionaries | dictionary | lexemes +----------+---------------+----------------------------+--------------+------------+------------------------------ + protocol | Protocol head | http:// | {} | | + url | URL | aew.wer0c.ewr/id?ad=qwe&dw | {simple} | simple | {aew.wer0c.ewr/id?ad=qwe&dw} + host | Host | aew.wer0c.ewr | {simple} | simple | {aew.wer0c.ewr} + url_path | URL path | /id?ad=qwe&dw | {simple} | simple | {/id?ad=qwe&dw} + tag | XML tag | | {} | | +(5 rows) + +SELECT * from ts_debug('english', 'http://5aew.werc.ewr:8100/?'); + alias | description | token | dictionaries | dictionary | lexemes +----------+---------------+----------------------+--------------+------------+------------------------ + protocol | Protocol head | http:// | {} | | + url | URL | 5aew.werc.ewr:8100/? | {simple} | simple | {5aew.werc.ewr:8100/?} + host | Host | 5aew.werc.ewr:8100 | {simple} | simple | {5aew.werc.ewr:8100} + url_path | URL path | /? | {simple} | simple | {/?} +(4 rows) + +SELECT * from ts_debug('english', '5aew.werc.ewr:8100/?xx'); + alias | description | token | dictionaries | dictionary | lexemes +----------+-------------+------------------------+--------------+------------+-------------------------- + url | URL | 5aew.werc.ewr:8100/?xx | {simple} | simple | {5aew.werc.ewr:8100/?xx} + host | Host | 5aew.werc.ewr:8100 | {simple} | simple | {5aew.werc.ewr:8100} + url_path | URL path | /?xx | {simple} | simple | {/?xx} +(3 rows) + +SELECT token, alias, + dictionaries, dictionaries is null as dnull, array_dims(dictionaries) as ddims, + lexemes, lexemes is null as lnull, array_dims(lexemes) as ldims +from ts_debug('english', 'a title'); + token | alias | dictionaries | dnull | ddims | lexemes | lnull | ldims +-------+-----------+----------------+-------+-------+---------+-------+------- + a | asciiword | {english_stem} | f | [1:1] | {} | f | + | blank | {} | f | | | t | + title | asciiword | {english_stem} | f | [1:1] | {titl} | f | [1:1] +(3 rows) + +-- to_tsquery +SELECT to_tsquery('english', 'qwe & sKies '); + to_tsquery +--------------- + 'qwe' & 'sky' +(1 row) + +SELECT to_tsquery('simple', 'qwe & sKies '); + to_tsquery +----------------- + 'qwe' & 'skies' +(1 row) + +SELECT to_tsquery('english', '''the wether'':dc & '' sKies '':BC '); + to_tsquery +------------------------ + 'wether':CD & 'sky':BC +(1 row) + +SELECT to_tsquery('english', 'asd&(and|fghj)'); + to_tsquery +---------------- + 'asd' & 'fghj' +(1 row) + +SELECT to_tsquery('english', '(asd&and)|fghj'); + to_tsquery +---------------- + 'asd' | 'fghj' +(1 row) + +SELECT to_tsquery('english', '(asd&!and)|fghj'); + to_tsquery +---------------- + 'asd' | 'fghj' +(1 row) + +SELECT to_tsquery('english', '(the|and&(i&1))&fghj'); + to_tsquery +-------------- + '1' & 'fghj' +(1 row) + +SELECT plainto_tsquery('english', 'the and z 1))& fghj'); + plainto_tsquery +-------------------- + 'z' & '1' & 'fghj' +(1 row) + +SELECT plainto_tsquery('english', 'foo bar') && plainto_tsquery('english', 'asd'); + ?column? +----------------------- + 'foo' & 'bar' & 'asd' +(1 row) + +SELECT plainto_tsquery('english', 'foo bar') || plainto_tsquery('english', 'asd fg'); + ?column? +------------------------------ + 'foo' & 'bar' | 'asd' & 'fg' +(1 row) + +SELECT plainto_tsquery('english', 'foo bar') || !!plainto_tsquery('english', 'asd fg'); + ?column? +----------------------------------- + 'foo' & 'bar' | !( 'asd' & 'fg' ) +(1 row) + +SELECT plainto_tsquery('english', 'foo bar') && 'asd | fg'; + ?column? +---------------------------------- + 'foo' & 'bar' & ( 'asd' | 'fg' ) +(1 row) + +-- Check stop word deletion, a and s are stop-words +SELECT to_tsquery('english', '!(a & !b) & c'); + to_tsquery +------------- + !!'b' & 'c' +(1 row) + +SELECT to_tsquery('english', '!(a & !b)'); + to_tsquery +------------ + !!'b' +(1 row) + +SELECT to_tsquery('english', '(1 <-> 2) <-> a'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', '(1 <-> a) <-> 2'); + to_tsquery +------------- + '1' <2> '2' +(1 row) + +SELECT to_tsquery('english', '(a <-> 1) <-> 2'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', 'a <-> (1 <-> 2)'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', '1 <-> (a <-> 2)'); + to_tsquery +------------- + '1' <2> '2' +(1 row) + +SELECT to_tsquery('english', '1 <-> (2 <-> a)'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', '(1 <-> 2) <3> a'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', '(1 <-> a) <3> 2'); + to_tsquery +------------- + '1' <4> '2' +(1 row) + +SELECT to_tsquery('english', '(a <-> 1) <3> 2'); + to_tsquery +------------- + '1' <3> '2' +(1 row) + +SELECT to_tsquery('english', 'a <3> (1 <-> 2)'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', '1 <3> (a <-> 2)'); + to_tsquery +------------- + '1' <4> '2' +(1 row) + +SELECT to_tsquery('english', '1 <3> (2 <-> a)'); + to_tsquery +------------- + '1' <3> '2' +(1 row) + +SELECT to_tsquery('english', '(1 <3> 2) <-> a'); + to_tsquery +------------- + '1' <3> '2' +(1 row) + +SELECT to_tsquery('english', '(1 <3> a) <-> 2'); + to_tsquery +------------- + '1' <4> '2' +(1 row) + +SELECT to_tsquery('english', '(a <3> 1) <-> 2'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', 'a <-> (1 <3> 2)'); + to_tsquery +------------- + '1' <3> '2' +(1 row) + +SELECT to_tsquery('english', '1 <-> (a <3> 2)'); + to_tsquery +------------- + '1' <4> '2' +(1 row) + +SELECT to_tsquery('english', '1 <-> (2 <3> a)'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', '((a <-> 1) <-> 2) <-> s'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', '(2 <-> (a <-> 1)) <-> s'); + to_tsquery +------------- + '2' <2> '1' +(1 row) + +SELECT to_tsquery('english', '((1 <-> a) <-> 2) <-> s'); + to_tsquery +------------- + '1' <2> '2' +(1 row) + +SELECT to_tsquery('english', '(2 <-> (1 <-> a)) <-> s'); + to_tsquery +------------- + '2' <-> '1' +(1 row) + +SELECT to_tsquery('english', 's <-> ((a <-> 1) <-> 2)'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', 's <-> (2 <-> (a <-> 1))'); + to_tsquery +------------- + '2' <2> '1' +(1 row) + +SELECT to_tsquery('english', 's <-> ((1 <-> a) <-> 2)'); + to_tsquery +------------- + '1' <2> '2' +(1 row) + +SELECT to_tsquery('english', 's <-> (2 <-> (1 <-> a))'); + to_tsquery +------------- + '2' <-> '1' +(1 row) + +SELECT to_tsquery('english', '((a <-> 1) <-> s) <-> 2'); + to_tsquery +------------- + '1' <2> '2' +(1 row) + +SELECT to_tsquery('english', '(s <-> (a <-> 1)) <-> 2'); + to_tsquery +------------- + '1' <-> '2' +(1 row) + +SELECT to_tsquery('english', '((1 <-> a) <-> s) <-> 2'); + to_tsquery +------------- + '1' <3> '2' +(1 row) + +SELECT to_tsquery('english', '(s <-> (1 <-> a)) <-> 2'); + to_tsquery +------------- + '1' <2> '2' +(1 row) + +SELECT to_tsquery('english', '2 <-> ((a <-> 1) <-> s)'); + to_tsquery +------------- + '2' <2> '1' +(1 row) + +SELECT to_tsquery('english', '2 <-> (s <-> (a <-> 1))'); + to_tsquery +------------- + '2' <3> '1' +(1 row) + +SELECT to_tsquery('english', '2 <-> ((1 <-> a) <-> s)'); + to_tsquery +------------- + '2' <-> '1' +(1 row) + +SELECT to_tsquery('english', '2 <-> (s <-> (1 <-> a))'); + to_tsquery +------------- + '2' <2> '1' +(1 row) + +SELECT to_tsquery('english', 'foo <-> (a <-> (the <-> bar))'); + to_tsquery +----------------- + 'foo' <3> 'bar' +(1 row) + +SELECT to_tsquery('english', '((foo <-> a) <-> the) <-> bar'); + to_tsquery +----------------- + 'foo' <3> 'bar' +(1 row) + +SELECT to_tsquery('english', 'foo <-> a <-> the <-> bar'); + to_tsquery +----------------- + 'foo' <3> 'bar' +(1 row) + +SELECT phraseto_tsquery('english', 'PostgreSQL can be extended by the user in many ways'); + phraseto_tsquery +----------------------------------------------------------- + 'postgresql' <3> 'extend' <3> 'user' <2> 'mani' <-> 'way' +(1 row) + +SELECT ts_rank_cd(to_tsvector('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +'), to_tsquery('english', 'paint&water')); + ts_rank_cd +------------ + 0.05 +(1 row) + +SELECT ts_rank_cd(to_tsvector('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +'), to_tsquery('english', 'breath&motion&water')); + ts_rank_cd +------------- + 0.008333334 +(1 row) + +SELECT ts_rank_cd(to_tsvector('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +'), to_tsquery('english', 'ocean')); + ts_rank_cd +------------ + 0.1 +(1 row) + +SELECT ts_rank_cd(to_tsvector('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +'), to_tsquery('english', 'painted <-> Ship')); + ts_rank_cd +------------ + 0.1 +(1 row) + +SELECT ts_rank_cd(strip(to_tsvector('both stripped')), + to_tsquery('both & stripped')); + ts_rank_cd +------------ + 0 +(1 row) + +SELECT ts_rank_cd(to_tsvector('unstripped') || strip(to_tsvector('stripped')), + to_tsquery('unstripped & stripped')); + ts_rank_cd +------------ + 0 +(1 row) + +--headline tests +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'paint&water')); + ts_headline +----------------------------------------- + painted Ocean. + + Water, water, every where+ + And all the boards did shrink; + + Water, water, every +(1 row) + +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'breath&motion&water')); + ts_headline +---------------------------------- + breath nor motion,+ + As idle as a painted Ship + + Upon a painted Ocean. + + Water, water +(1 row) + +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'ocean')); + ts_headline +---------------------------------- + Ocean. + + Water, water, every where + + And all the boards did shrink;+ + Water, water, every where +(1 row) + +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', phraseto_tsquery('english', 'painted Ocean')); + ts_headline +--------------------------------------- + painted Ship + + Upon a painted Ocean.+ + Water, water, every where + + And all the boards did shrink +(1 row) + +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', phraseto_tsquery('english', 'idle as a painted Ship')); + ts_headline +--------------------------------------------- + idle as a painted Ship+ + Upon a painted Ocean. + + Water, water, every where + + And all the boards +(1 row) + +SELECT ts_headline('english', +'Lorem ipsum urna. Nullam nullam ullamcorper urna.', +to_tsquery('english','Lorem') && phraseto_tsquery('english','ullamcorper urna'), +'MaxWords=100, MinWords=1'); + ts_headline +------------------------------------------------------------------------------- + Lorem ipsum urna. Nullam nullam ullamcorper urna +(1 row) + +SELECT ts_headline('english', ' + + + +Sea view wow foo bar qq +YES   +ff-bg + + +', +to_tsquery('english', 'sea&foo'), 'HighlightAll=true'); + ts_headline +----------------------------------------------------------------------------- + + + + + + + + + Sea view wow foo bar qq + + YES  + + ff-bg + + + + + + +(1 row) + +SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 <-> 3', 'MaxWords=2, MinWords=1'); + ts_headline +------------------- + 1 3 +(1 row) + +SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 & 3', 'MaxWords=4, MinWords=1'); + ts_headline +--------------------- + 1 2 3 +(1 row) + +SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 <-> 3', 'MaxWords=4, MinWords=1'); + ts_headline +---------------------------- + 3 1 3 +(1 row) + +--Check if headline fragments work +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'ocean'), 'MaxFragments=1'); + ts_headline +------------------------------------ + after day, + + We stuck, nor breath nor motion,+ + As idle as a painted Ship + + Upon a painted Ocean. + + Water, water, every where + + And all the boards did shrink; + + Water, water, every where, + + Nor any drop +(1 row) + +--Check if more than one fragments are displayed +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2'); + ts_headline +---------------------------------------------- + after day, day after day, + + We stuck, nor breath nor motion, + + As idle as a painted Ship + + Upon a painted Ocean. + + Water, water, every where + + And all the boards did shrink; + + Water, water, every where ... drop to drink.+ + S. T. Coleridge +(1 row) + +--Fragments when there all query words are not in the document +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'ocean & seahorse'), 'MaxFragments=1'); + ts_headline +------------------------------------ + + + Day after day, day after day, + + We stuck, nor breath nor motion,+ + As idle as +(1 row) + +--FragmentDelimiter option +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2,FragmentDelimiter=***'); + ts_headline +-------------------------------------------- + after day, day after day, + + We stuck, nor breath nor motion, + + As idle as a painted Ship + + Upon a painted Ocean. + + Water, water, every where + + And all the boards did shrink; + + Water, water, every where***drop to drink.+ + S. T. Coleridge +(1 row) + +--Fragments with phrase search +SELECT ts_headline('english', +'Lorem ipsum urna. Nullam nullam ullamcorper urna.', +to_tsquery('english','Lorem') && phraseto_tsquery('english','ullamcorper urna'), +'MaxFragments=100, MaxWords=100, MinWords=1'); + ts_headline +------------------------------------------------------------------------------- + Lorem ipsum urna. Nullam nullam ullamcorper urna +(1 row) + +--Rewrite sub system +CREATE TABLE test_tsquery (txtkeyword TEXT, txtsample TEXT); +\set ECHO none +ALTER TABLE test_tsquery ADD COLUMN keyword tsquery; +UPDATE test_tsquery SET keyword = to_tsquery('english', txtkeyword); +ALTER TABLE test_tsquery ADD COLUMN sample tsquery; +UPDATE test_tsquery SET sample = to_tsquery('english', txtsample::text); +SELECT COUNT(*) FROM test_tsquery WHERE keyword < 'new <-> york'; + count +------- + 2 +(1 row) + +SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new <-> york'; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new <-> york'; + count +------- + 1 +(1 row) + +SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new <-> york'; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM test_tsquery WHERE keyword > 'new <-> york'; + count +------- + 3 +(1 row) + +CREATE INDEX bt_tsq ON test_tsquery (keyword); +SET enable_seqscan=OFF; +SELECT COUNT(*) FROM test_tsquery WHERE keyword < 'new <-> york'; + count +------- + 2 +(1 row) + +SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new <-> york'; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new <-> york'; + count +------- + 1 +(1 row) + +SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new <-> york'; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM test_tsquery WHERE keyword > 'new <-> york'; + count +------- + 3 +(1 row) + +RESET enable_seqscan; +SELECT ts_rewrite('foo & bar & qq & new & york', 'new & york'::tsquery, 'big & apple | nyc | new & york & city'); + ts_rewrite +------------------------------------------------------------------------------ + 'foo' & 'bar' & 'qq' & ( 'city' & 'new' & 'york' | 'nyc' | 'big' & 'apple' ) +(1 row) + +SELECT ts_rewrite(ts_rewrite('new & !york ', 'york', '!jersey'), + 'jersey', 'mexico'); + ts_rewrite +-------------------- + 'new' & !!'mexico' +(1 row) + +SELECT ts_rewrite('moscow', 'SELECT keyword, sample FROM test_tsquery'::text ); + ts_rewrite +--------------------- + 'moskva' | 'moscow' +(1 row) + +SELECT ts_rewrite('moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'::text ); + ts_rewrite +----------------------------------- + 'hotel' & ( 'moskva' | 'moscow' ) +(1 row) + +SELECT ts_rewrite('bar & qq & foo & (new <-> york)', 'SELECT keyword, sample FROM test_tsquery'::text ); + ts_rewrite +------------------------------------------------------------------------------------- + 'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' ) +(1 row) + +SELECT ts_rewrite( 'moscow', 'SELECT keyword, sample FROM test_tsquery'); + ts_rewrite +--------------------- + 'moskva' | 'moscow' +(1 row) + +SELECT ts_rewrite( 'moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'); + ts_rewrite +----------------------------------- + 'hotel' & ( 'moskva' | 'moscow' ) +(1 row) + +SELECT ts_rewrite( 'bar & qq & foo & (new <-> york)', 'SELECT keyword, sample FROM test_tsquery'); + ts_rewrite +------------------------------------------------------------------------------------- + 'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' ) +(1 row) + +SELECT ts_rewrite('1 & (2 <-> 3)', 'SELECT keyword, sample FROM test_tsquery'::text ); + ts_rewrite +------------- + '2' <-> '4' +(1 row) + +SELECT ts_rewrite('1 & (2 <2> 3)', 'SELECT keyword, sample FROM test_tsquery'::text ); + ts_rewrite +------------------- + '1' & '2' <2> '3' +(1 row) + +SELECT ts_rewrite('5 <-> (1 & (2 <-> 3))', 'SELECT keyword, sample FROM test_tsquery'::text ); + ts_rewrite +------------------------- + '5' <-> ( '2' <-> '4' ) +(1 row) + +SELECT ts_rewrite('5 <-> (6 | 8)', 'SELECT keyword, sample FROM test_tsquery'::text ); + ts_rewrite +----------------------- + '5' <-> ( '6' | '8' ) +(1 row) + +-- Check empty substitution +SELECT ts_rewrite(to_tsquery('5 & (6 | 5)'), to_tsquery('5'), to_tsquery('')); +NOTICE: text-search query doesn't contain lexemes: "" + ts_rewrite +------------ + '6' +(1 row) + +SELECT ts_rewrite(to_tsquery('!5'), to_tsquery('5'), to_tsquery('')); +NOTICE: text-search query doesn't contain lexemes: "" + ts_rewrite +------------ + +(1 row) + +SELECT keyword FROM test_tsquery WHERE keyword @> 'new'; + keyword +------------------ + 'new' <-> 'york' +(1 row) + +SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow'; + keyword +---------- + 'moscow' +(1 row) + +SELECT keyword FROM test_tsquery WHERE keyword <@ 'new'; + keyword +--------- +(0 rows) + +SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow'; + keyword +---------- + 'moscow' +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; + ts_rewrite +--------------------- + 'moskva' | 'moscow' +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; + ts_rewrite +----------------------------------- + 'hotel' & ( 'moskva' | 'moscow' ) +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; + ts_rewrite +------------------------------------------------------------------------------------- + 'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' ) +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; + ts_rewrite +--------------------- + 'moskva' | 'moscow' +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; + ts_rewrite +----------------------------------- + 'hotel' & ( 'moskva' | 'moscow' ) +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; + ts_rewrite +------------------------------------------------------------------------------------- + 'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' ) +(1 row) + +CREATE INDEX qq ON test_tsquery USING gist (keyword tsquery_ops); +SET enable_seqscan=OFF; +SELECT keyword FROM test_tsquery WHERE keyword @> 'new'; + keyword +------------------ + 'new' <-> 'york' +(1 row) + +SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow'; + keyword +---------- + 'moscow' +(1 row) + +SELECT keyword FROM test_tsquery WHERE keyword <@ 'new'; + keyword +--------- +(0 rows) + +SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow'; + keyword +---------- + 'moscow' +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; + ts_rewrite +--------------------- + 'moskva' | 'moscow' +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; + ts_rewrite +----------------------------------- + 'hotel' & ( 'moskva' | 'moscow' ) +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; + ts_rewrite +------------------------------------------------------------------------------------- + 'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' ) +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; + ts_rewrite +--------------------- + 'moskva' | 'moscow' +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; + ts_rewrite +----------------------------------- + 'hotel' & ( 'moskva' | 'moscow' ) +(1 row) + +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; + ts_rewrite +------------------------------------------------------------------------------------- + 'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' ) +(1 row) + +SELECT ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz'); + ts_rewrite +----------------------------------------- + ( 'bar' | 'baz' ) <-> ( 'bar' | 'baz' ) +(1 row) + +SELECT to_tsvector('foo bar') @@ + ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz'); + ?column? +---------- + f +(1 row) + +SELECT to_tsvector('bar baz') @@ + ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz'); + ?column? +---------- + t +(1 row) + +RESET enable_seqscan; +--test GUC +SET default_text_search_config=simple; +SELECT to_tsvector('SKIES My booKs'); + to_tsvector +---------------------------- + 'books':3 'my':2 'skies':1 +(1 row) + +SELECT plainto_tsquery('SKIES My booKs'); + plainto_tsquery +-------------------------- + 'skies' & 'my' & 'books' +(1 row) + +SELECT to_tsquery('SKIES & My | booKs'); + to_tsquery +-------------------------- + 'skies' & 'my' | 'books' +(1 row) + +SET default_text_search_config=english; +SELECT to_tsvector('SKIES My booKs'); + to_tsvector +------------------ + 'book':3 'sky':1 +(1 row) + +SELECT plainto_tsquery('SKIES My booKs'); + plainto_tsquery +----------------- + 'sky' & 'book' +(1 row) + +SELECT to_tsquery('SKIES & My | booKs'); + to_tsquery +---------------- + 'sky' | 'book' +(1 row) + +--trigger +CREATE TRIGGER tsvectorupdate +BEFORE UPDATE OR INSERT ON test_tsvector +FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(a, 'pg_catalog.english', t); +SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); + count +------- + 0 +(1 row) + +INSERT INTO test_tsvector (t) VALUES ('345 qwerty'); +SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); + count +------- + 1 +(1 row) + +UPDATE test_tsvector SET t = null WHERE t = '345 qwerty'; +SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); + count +------- + 0 +(1 row) + +INSERT INTO test_tsvector (t) VALUES ('345 qwerty'); +SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); + count +------- + 1 +(1 row) + +-- Test inlining of immutable constant functions +-- to_tsquery(text) is not immutable, so it won't be inlined +explain (costs off) +select * from test_tsquery, to_tsquery('new') q where txtsample @@ q; + QUERY PLAN +--------------------------------------------- + Seq Scan on test_tsquery + Filter: (txtsample @@ '''new'''::tsquery) + Optimizer: Postgres query optimizer +(3 rows) + +-- to_tsquery(regconfig, text) is an immutable function. +-- That allows us to get rid of using function scan and join at all. +explain (costs off) +select * from test_tsquery, to_tsquery('english', 'new') q where txtsample @@ q; + QUERY PLAN +--------------------------------------------- + Seq Scan on test_tsquery + Filter: (txtsample @@ '''new'''::tsquery) + Optimizer: Postgres query optimizer +(3 rows) + +-- test finding items in GIN's pending list +create temp table pendtest (ts tsvector); +create index pendtest_idx on pendtest using gin(ts); +insert into pendtest values (to_tsvector('Lore ipsam')); +insert into pendtest values (to_tsvector('Lore ipsum')); +select * from pendtest where 'ipsu:*'::tsquery @@ ts; + ts +-------------------- + 'ipsum':2 'lore':1 +(1 row) + +select * from pendtest where 'ipsa:*'::tsquery @@ ts; + ts +-------------------- + 'ipsam':2 'lore':1 +(1 row) + +select * from pendtest where 'ips:*'::tsquery @@ ts; + ts +-------------------- + 'ipsam':2 'lore':1 + 'ipsum':2 'lore':1 +(2 rows) + +select * from pendtest where 'ipt:*'::tsquery @@ ts; + ts +---- +(0 rows) + +select * from pendtest where 'ipi:*'::tsquery @@ ts; + ts +---- +(0 rows) + +--check OP_PHRASE on index +create temp table phrase_index_test(fts tsvector); +insert into phrase_index_test values ('A fat cat has just eaten a rat.'); +insert into phrase_index_test values (to_tsvector('english', 'A fat cat has just eaten a rat.')); +create index phrase_index_test_idx on phrase_index_test using gin(fts); +set enable_seqscan = off; +select * from phrase_index_test where fts @@ phraseto_tsquery('english', 'fat cat'); + fts +----------------------------------- + 'cat':3 'eaten':6 'fat':2 'rat':8 +(1 row) + +set enable_seqscan = on; +-- test websearch_to_tsquery function +select websearch_to_tsquery('simple', 'I have a fat:*ABCD cat'); + websearch_to_tsquery +--------------------------------------------- + 'i' & 'have' & 'a' & 'fat' & 'abcd' & 'cat' +(1 row) + +select websearch_to_tsquery('simple', 'orange:**AABBCCDD'); + websearch_to_tsquery +----------------------- + 'orange' & 'aabbccdd' +(1 row) + +select websearch_to_tsquery('simple', 'fat:A!cat:B|rat:C<'); + websearch_to_tsquery +----------------------------------------- + 'fat' & 'a' & 'cat' & 'b' & 'rat' & 'c' +(1 row) + +select websearch_to_tsquery('simple', 'fat:A : cat:B'); + websearch_to_tsquery +--------------------------- + 'fat' & 'a' & 'cat' & 'b' +(1 row) + +select websearch_to_tsquery('simple', 'fat*rat'); + websearch_to_tsquery +---------------------- + 'fat' <-> 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat-rat'); + websearch_to_tsquery +------------------------------- + 'fat-rat' <-> 'fat' <-> 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat_rat'); + websearch_to_tsquery +---------------------- + 'fat' <-> 'rat' +(1 row) + +-- weights are completely ignored +select websearch_to_tsquery('simple', 'abc : def'); + websearch_to_tsquery +---------------------- + 'abc' & 'def' +(1 row) + +select websearch_to_tsquery('simple', 'abc:def'); + websearch_to_tsquery +---------------------- + 'abc' & 'def' +(1 row) + +select websearch_to_tsquery('simple', 'a:::b'); + websearch_to_tsquery +---------------------- + 'a' & 'b' +(1 row) + +select websearch_to_tsquery('simple', 'abc:d'); + websearch_to_tsquery +---------------------- + 'abc' & 'd' +(1 row) + +select websearch_to_tsquery('simple', ':'); +NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored + websearch_to_tsquery +---------------------- + +(1 row) + +-- these operators are ignored +select websearch_to_tsquery('simple', 'abc & def'); + websearch_to_tsquery +---------------------- + 'abc' & 'def' +(1 row) + +select websearch_to_tsquery('simple', 'abc | def'); + websearch_to_tsquery +---------------------- + 'abc' & 'def' +(1 row) + +select websearch_to_tsquery('simple', 'abc <-> def'); + websearch_to_tsquery +---------------------- + 'abc' & 'def' +(1 row) + +select websearch_to_tsquery('simple', 'abc (pg or class)'); + websearch_to_tsquery +------------------------ + 'abc' & 'pg' | 'class' +(1 row) + +-- NOT is ignored in quotes +select websearch_to_tsquery('english', 'My brand new smartphone'); + websearch_to_tsquery +------------------------------- + 'brand' & 'new' & 'smartphon' +(1 row) + +select websearch_to_tsquery('english', 'My brand "new smartphone"'); + websearch_to_tsquery +--------------------------------- + 'brand' & 'new' <-> 'smartphon' +(1 row) + +select websearch_to_tsquery('english', 'My brand "new -smartphone"'); + websearch_to_tsquery +--------------------------------- + 'brand' & 'new' <-> 'smartphon' +(1 row) + +-- test OR operator +select websearch_to_tsquery('simple', 'cat or rat'); + websearch_to_tsquery +---------------------- + 'cat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'cat OR rat'); + websearch_to_tsquery +---------------------- + 'cat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'cat "OR" rat'); + websearch_to_tsquery +---------------------- + 'cat' & 'or' & 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'cat OR'); + websearch_to_tsquery +---------------------- + 'cat' & 'or' +(1 row) + +select websearch_to_tsquery('simple', 'OR rat'); + websearch_to_tsquery +---------------------- + 'or' & 'rat' +(1 row) + +select websearch_to_tsquery('simple', '"fat cat OR rat"'); + websearch_to_tsquery +------------------------------------ + 'fat' <-> 'cat' <-> 'or' <-> 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat (cat OR rat'); + websearch_to_tsquery +----------------------- + 'fat' & 'cat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'or OR or'); + websearch_to_tsquery +---------------------- + 'or' | 'or' +(1 row) + +-- OR is an operator here ... +select websearch_to_tsquery('simple', '"fat cat"or"fat rat"'); + websearch_to_tsquery +----------------------------------- + 'fat' <-> 'cat' | 'fat' <-> 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat or(rat'); + websearch_to_tsquery +---------------------- + 'fat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat or)rat'); + websearch_to_tsquery +---------------------- + 'fat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat or&rat'); + websearch_to_tsquery +---------------------- + 'fat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat or|rat'); + websearch_to_tsquery +---------------------- + 'fat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat or!rat'); + websearch_to_tsquery +---------------------- + 'fat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat orrat'); + websearch_to_tsquery +---------------------- + 'fat' | 'rat' +(1 row) + +select websearch_to_tsquery('simple', 'fat or '); + websearch_to_tsquery +---------------------- + 'fat' & 'or' +(1 row) + +-- ... but not here +select websearch_to_tsquery('simple', 'abc orange'); + websearch_to_tsquery +---------------------- + 'abc' & 'orange' +(1 row) + +select websearch_to_tsquery('simple', 'abc OR1234'); + websearch_to_tsquery +---------------------- + 'abc' & 'or1234' +(1 row) + +select websearch_to_tsquery('simple', 'abc or-abc'); + websearch_to_tsquery +------------------------------------- + 'abc' & 'or-abc' <-> 'or' <-> 'abc' +(1 row) + +select websearch_to_tsquery('simple', 'abc OR_abc'); + websearch_to_tsquery +------------------------ + 'abc' & 'or' <-> 'abc' +(1 row) + +-- test quotes +select websearch_to_tsquery('english', '"pg_class pg'); + websearch_to_tsquery +--------------------------- + 'pg' <-> 'class' <-> 'pg' +(1 row) + +select websearch_to_tsquery('english', 'pg_class pg"'); + websearch_to_tsquery +------------------------- + 'pg' <-> 'class' & 'pg' +(1 row) + +select websearch_to_tsquery('english', '"pg_class pg"'); + websearch_to_tsquery +--------------------------- + 'pg' <-> 'class' <-> 'pg' +(1 row) + +select websearch_to_tsquery('english', '"pg_class : pg"'); + websearch_to_tsquery +--------------------------- + 'pg' <-> 'class' <-> 'pg' +(1 row) + +select websearch_to_tsquery('english', 'abc "pg_class pg"'); + websearch_to_tsquery +----------------------------------- + 'abc' & 'pg' <-> 'class' <-> 'pg' +(1 row) + +select websearch_to_tsquery('english', '"pg_class pg" def'); + websearch_to_tsquery +----------------------------------- + 'pg' <-> 'class' <-> 'pg' & 'def' +(1 row) + +select websearch_to_tsquery('english', 'abc "pg pg_class pg" def'); + websearch_to_tsquery +---------------------------------------------------- + 'abc' & 'pg' <-> 'pg' <-> 'class' <-> 'pg' & 'def' +(1 row) + +select websearch_to_tsquery('english', ' or "pg pg_class pg" or '); + websearch_to_tsquery +------------------------------------ + 'pg' <-> 'pg' <-> 'class' <-> 'pg' +(1 row) + +select websearch_to_tsquery('english', '""pg pg_class pg""'); + websearch_to_tsquery +-------------------------------- + 'pg' & 'pg' <-> 'class' & 'pg' +(1 row) + +select websearch_to_tsquery('english', 'abc """"" def'); + websearch_to_tsquery +---------------------- + 'abc' & 'def' +(1 row) + +select websearch_to_tsquery('english', 'cat -"fat rat"'); + websearch_to_tsquery +------------------------------ + 'cat' & !( 'fat' <-> 'rat' ) +(1 row) + +select websearch_to_tsquery('english', 'cat -"fat rat" cheese'); + websearch_to_tsquery +---------------------------------------- + 'cat' & !( 'fat' <-> 'rat' ) & 'chees' +(1 row) + +select websearch_to_tsquery('english', 'abc "def -"'); + websearch_to_tsquery +---------------------- + 'abc' & 'def' +(1 row) + +select websearch_to_tsquery('english', 'abc "def :"'); + websearch_to_tsquery +---------------------- + 'abc' & 'def' +(1 row) + +select websearch_to_tsquery('english', '"A fat cat" has just eaten a -rat.'); + websearch_to_tsquery +------------------------------------ + 'fat' <-> 'cat' & 'eaten' & !'rat' +(1 row) + +select websearch_to_tsquery('english', '"A fat cat" has just eaten OR !rat.'); + websearch_to_tsquery +----------------------------------- + 'fat' <-> 'cat' & 'eaten' | 'rat' +(1 row) + +select websearch_to_tsquery('english', '"A fat cat" has just (+eaten OR -rat)'); + websearch_to_tsquery +------------------------------------ + 'fat' <-> 'cat' & 'eaten' | !'rat' +(1 row) + +select websearch_to_tsquery('english', 'this is ----fine'); + websearch_to_tsquery +---------------------- + !!!!'fine' +(1 row) + +select websearch_to_tsquery('english', '(()) )))) this ||| is && -fine, "dear friend" OR good'); + websearch_to_tsquery +---------------------------------------- + !'fine' & 'dear' <-> 'friend' | 'good' +(1 row) + +select websearch_to_tsquery('english', 'an old <-> cat " is fine &&& too'); + websearch_to_tsquery +------------------------ + 'old' & 'cat' & 'fine' +(1 row) + +select websearch_to_tsquery('english', '"A the" OR just on'); +NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored + websearch_to_tsquery +---------------------- + +(1 row) + +select websearch_to_tsquery('english', '"a fat cat" ate a rat'); + websearch_to_tsquery +--------------------------------- + 'fat' <-> 'cat' & 'ate' & 'rat' +(1 row) + +select to_tsvector('english', 'A fat cat ate a rat') @@ + websearch_to_tsquery('english', '"a fat cat" ate a rat'); + ?column? +---------- + t +(1 row) + +select to_tsvector('english', 'A fat grey cat ate a rat') @@ + websearch_to_tsquery('english', '"a fat cat" ate a rat'); + ?column? +---------- + f +(1 row) + +-- cases handled by gettoken_tsvector() +select websearch_to_tsquery(''''); +NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored + websearch_to_tsquery +---------------------- + +(1 row) + +select websearch_to_tsquery('''abc''''def'''); + websearch_to_tsquery +---------------------- + 'abc' <-> 'def' +(1 row) + +select websearch_to_tsquery('\abc'); + websearch_to_tsquery +---------------------- + 'abc' +(1 row) + +select websearch_to_tsquery('\'); +NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored + websearch_to_tsquery +---------------------- + +(1 row) + +COPY test_tsvector TO '/tmp/test_tsvector.txt'; +COPY test_tsvector FROM '/tmp/test_tsvector.txt'; diff --git a/src/test/singlenode_regress/expected/tsrf.out b/src/test/singlenode_regress/expected/tsrf.out new file mode 100644 index 00000000000..d47b5f6ec57 --- /dev/null +++ b/src/test/singlenode_regress/expected/tsrf.out @@ -0,0 +1,712 @@ +-- +-- tsrf - targetlist set returning function tests +-- +-- simple srf +SELECT generate_series(1, 3); + generate_series +----------------- + 1 + 2 + 3 +(3 rows) + +-- parallel iteration +SELECT generate_series(1, 3), generate_series(3,5); + generate_series | generate_series +-----------------+----------------- + 1 | 3 + 2 | 4 + 3 | 5 +(3 rows) + +-- parallel iteration, different number of rows +SELECT generate_series(1, 2), generate_series(1,4); + generate_series | generate_series +-----------------+----------------- + 1 | 1 + 2 | 2 + | 3 + | 4 +(4 rows) + +-- srf, with SRF argument +SELECT generate_series(1, generate_series(1, 3)); + generate_series +----------------- + 1 + 1 + 2 + 1 + 2 + 3 +(6 rows) + +-- but we've traditionally rejected the same in FROM +SELECT * FROM generate_series(1, generate_series(1, 3)); +ERROR: set-returning functions must appear at top level of FROM +LINE 1: SELECT * FROM generate_series(1, generate_series(1, 3)); + ^ +-- srf, with two SRF arguments +SELECT generate_series(generate_series(1,3), generate_series(2, 4)); + generate_series +----------------- + 1 + 2 + 2 + 3 + 3 + 4 +(6 rows) + +-- check proper nesting of SRFs in different expressions +explain (verbose, costs off) +SELECT generate_series(1, generate_series(1, 3)), generate_series(2, 4); + QUERY PLAN +-------------------------------------------------------------------------------- + ProjectSet + Output: generate_series(1, (generate_series(1, 3))), (generate_series(2, 4)) + -> ProjectSet + Output: generate_series(1, 3), generate_series(2, 4) + -> Result +(5 rows) + +SELECT generate_series(1, generate_series(1, 3)), generate_series(2, 4); + generate_series | generate_series +-----------------+----------------- + 1 | 2 + 1 | 3 + 2 | 3 + 1 | 4 + 2 | 4 + 3 | 4 +(6 rows) + +CREATE TABLE few(id int, dataa text, datab text); +INSERT INTO few VALUES(1, 'a', 'foo'),(2, 'a', 'bar'),(3, 'b', 'bar'); +-- SRF with a provably-dummy relation +explain (verbose, costs off) +SELECT unnest(ARRAY[1, 2]) FROM few WHERE false; + QUERY PLAN +-------------------------------------- + ProjectSet + Output: unnest('{1,2}'::integer[]) + -> Result + One-Time Filter: false +(4 rows) + +SELECT unnest(ARRAY[1, 2]) FROM few WHERE false; + unnest +-------- +(0 rows) + +-- SRF shouldn't prevent upper query from recognizing lower as dummy +explain (verbose, costs off) +SELECT * FROM few f1, + (SELECT unnest(ARRAY[1,2]) FROM few f2 WHERE false OFFSET 0) ss; + QUERY PLAN +------------------------------------------------ + Result + Output: f1.id, f1.dataa, f1.datab, ss.unnest + One-Time Filter: false +(3 rows) + +SELECT * FROM few f1, + (SELECT unnest(ARRAY[1,2]) FROM few f2 WHERE false OFFSET 0) ss; + id | dataa | datab | unnest +----+-------+-------+-------- +(0 rows) + +-- SRF output order of sorting is maintained, if SRF is not referenced +SELECT few.id, generate_series(1,3) g FROM few ORDER BY id DESC; + id | g +----+--- + 3 | 1 + 3 | 2 + 3 | 3 + 2 | 1 + 2 | 2 + 2 | 3 + 1 | 1 + 1 | 2 + 1 | 3 +(9 rows) + +-- but SRFs can be referenced in sort +SELECT few.id, generate_series(1,3) g FROM few ORDER BY id, g DESC; + id | g +----+--- + 1 | 3 + 1 | 2 + 1 | 1 + 2 | 3 + 2 | 2 + 2 | 1 + 3 | 3 + 3 | 2 + 3 | 1 +(9 rows) + +SELECT few.id, generate_series(1,3) g FROM few ORDER BY id, generate_series(1,3) DESC; + id | g +----+--- + 1 | 3 + 1 | 2 + 1 | 1 + 2 | 3 + 2 | 2 + 2 | 1 + 3 | 3 + 3 | 2 + 3 | 1 +(9 rows) + +-- it's weird to have ORDER BYs that increase the number of results +SELECT few.id FROM few ORDER BY id, generate_series(1,3) DESC; + id +---- + 1 + 1 + 1 + 2 + 2 + 2 + 3 + 3 + 3 +(9 rows) + +-- SRFs are computed after aggregation +SET enable_hashagg TO 0; -- stable output order +SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1 GROUP BY few.dataa; + dataa | count | min | max | unnest +-------+-------+-----+-----+-------- + a | 1 | 1 | 1 | 1 + a | 1 | 1 | 1 | 1 + a | 1 | 1 | 1 | 3 +(3 rows) + +-- unless referenced in GROUP BY clause +SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1 GROUP BY few.dataa, unnest('{1,1,3}'::int[]); + dataa | count | min | max | unnest +-------+-------+-----+-----+-------- + a | 2 | 1 | 1 | 1 + a | 1 | 1 | 1 | 3 +(2 rows) + +SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1 GROUP BY few.dataa, 5; + dataa | count | min | max | unnest +-------+-------+-----+-----+-------- + a | 2 | 1 | 1 | 1 + a | 1 | 1 | 1 | 3 +(2 rows) + +RESET enable_hashagg; +-- check HAVING works when GROUP BY does [not] reference SRF output +SELECT dataa, generate_series(1,1), count(*) FROM few GROUP BY 1 HAVING count(*) > 1; + dataa | generate_series | count +-------+-----------------+------- + a | 1 | 2 +(1 row) + +SELECT dataa, generate_series(1,1), count(*) FROM few GROUP BY 1, 2 HAVING count(*) > 1; + dataa | generate_series | count +-------+-----------------+------- + a | 1 | 2 +(1 row) + +-- it's weird to have GROUP BYs that increase the number of results +SELECT few.dataa, count(*) FROM few WHERE dataa = 'a' GROUP BY few.dataa ORDER BY 2; + dataa | count +-------+------- + a | 2 +(1 row) + +SELECT few.dataa, count(*) FROM few WHERE dataa = 'a' GROUP BY few.dataa, unnest('{1,1,3}'::int[]) ORDER BY 2; + dataa | count +-------+------- + a | 2 + a | 4 +(2 rows) + +-- SRFs are not allowed if they'd need to be conditionally executed +SELECT q1, case when q1 > 0 then generate_series(1,3) else 0 end FROM int8_tbl; +ERROR: set-returning functions are not allowed in CASE +LINE 1: SELECT q1, case when q1 > 0 then generate_series(1,3) else 0... + ^ +HINT: You might be able to move the set-returning function into a LATERAL FROM item. +SELECT q1, coalesce(generate_series(1,3), 0) FROM int8_tbl; +ERROR: set-returning functions are not allowed in COALESCE +LINE 1: SELECT q1, coalesce(generate_series(1,3), 0) FROM int8_tbl; + ^ +HINT: You might be able to move the set-returning function into a LATERAL FROM item. +-- SRFs are not allowed in aggregate arguments +SELECT min(generate_series(1, 3)) FROM few; +ERROR: aggregate function calls cannot contain set-returning function calls +LINE 1: SELECT min(generate_series(1, 3)) FROM few; + ^ +HINT: You might be able to move the set-returning function into a LATERAL FROM item. +-- ... unless they're within a sub-select +SELECT sum((3 = ANY(SELECT generate_series(1,4)))::int); + sum +----- + 1 +(1 row) + +SELECT sum((3 = ANY(SELECT lag(x) over(order by x) + FROM generate_series(1,4) x))::int); + sum +----- + 1 +(1 row) + +-- SRFs are not allowed in window function arguments, either +SELECT min(generate_series(1, 3)) OVER() FROM few; +ERROR: window function calls cannot contain set-returning function calls +LINE 1: SELECT min(generate_series(1, 3)) OVER() FROM few; + ^ +HINT: You might be able to move the set-returning function into a LATERAL FROM item. +-- SRFs are normally computed after window functions +SELECT id,lag(id) OVER(), count(*) OVER(), generate_series(1,3) FROM few; + id | lag | count | generate_series +----+-----+-------+----------------- + 1 | | 3 | 1 + 1 | | 3 | 2 + 1 | | 3 | 3 + 2 | 1 | 3 | 1 + 2 | 1 | 3 | 2 + 2 | 1 | 3 | 3 + 3 | 2 | 3 | 1 + 3 | 2 | 3 | 2 + 3 | 2 | 3 | 3 +(9 rows) + +-- unless referencing SRFs +SELECT SUM(count(*)) OVER(PARTITION BY generate_series(1,3) ORDER BY generate_series(1,3)), generate_series(1,3) g FROM few GROUP BY g; + sum | g +-----+--- + 3 | 1 + 3 | 2 + 3 | 3 +(3 rows) + +-- sorting + grouping +SELECT few.dataa, count(*), min(id), max(id), generate_series(1,3) FROM few GROUP BY few.dataa ORDER BY 5, 1; + dataa | count | min | max | generate_series +-------+-------+-----+-----+----------------- + a | 2 | 1 | 2 | 1 + b | 1 | 3 | 3 | 1 + a | 2 | 1 | 2 | 2 + b | 1 | 3 | 3 | 2 + a | 2 | 1 | 2 | 3 + b | 1 | 3 | 3 | 3 +(6 rows) + +-- grouping sets are a bit special, they produce NULLs in columns not actually NULL +set enable_hashagg = false; +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab); + dataa | b | g | count +-------+-----+---+------- + a | bar | 1 | 1 + a | bar | 2 | 1 + a | foo | 1 | 1 + a | foo | 2 | 1 + a | | 1 | 2 + a | | 2 | 2 + b | bar | 1 | 1 + b | bar | 2 | 1 + b | | 1 | 1 + b | | 2 | 1 + | | 1 | 3 + | | 2 | 3 + | bar | 1 | 2 + | bar | 2 | 2 + | foo | 1 | 1 + | foo | 2 | 1 +(16 rows) + +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab) ORDER BY dataa; + dataa | b | g | count +-------+-----+---+------- + a | bar | 1 | 1 + a | bar | 2 | 1 + a | foo | 1 | 1 + a | foo | 2 | 1 + a | | 1 | 2 + a | | 2 | 2 + b | bar | 1 | 1 + b | bar | 2 | 1 + b | | 1 | 1 + b | | 2 | 1 + | | 1 | 3 + | | 2 | 3 + | bar | 1 | 2 + | bar | 2 | 2 + | foo | 1 | 1 + | foo | 2 | 1 +(16 rows) + +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab) ORDER BY g; + dataa | b | g | count +-------+-----+---+------- + a | bar | 1 | 1 + a | foo | 1 | 1 + a | | 1 | 2 + b | bar | 1 | 1 + b | | 1 | 1 + | | 1 | 3 + | bar | 1 | 2 + | foo | 1 | 1 + | foo | 2 | 1 + a | bar | 2 | 1 + b | | 2 | 1 + a | foo | 2 | 1 + | bar | 2 | 2 + a | | 2 | 2 + | | 2 | 3 + b | bar | 2 | 1 +(16 rows) + +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g); + dataa | b | g | count +-------+-----+---+------- + a | bar | 1 | 1 + a | bar | 2 | 1 + a | bar | | 2 + a | foo | 1 | 1 + a | foo | 2 | 1 + a | foo | | 2 + a | | | 4 + b | bar | 1 | 1 + b | bar | 2 | 1 + b | bar | | 2 + b | | | 2 + | | | 6 + | bar | 1 | 2 + | bar | 2 | 2 + | bar | | 4 + | foo | 1 | 1 + | foo | 2 | 1 + | foo | | 2 + a | | 1 | 2 + b | | 1 | 1 + | | 1 | 3 + a | | 2 | 2 + b | | 2 | 1 + | | 2 | 3 +(24 rows) + +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g) ORDER BY dataa; + dataa | b | g | count +-------+-----+---+------- + a | foo | | 2 + a | | | 4 + a | | 2 | 2 + a | bar | 1 | 1 + a | bar | 2 | 1 + a | bar | | 2 + a | foo | 1 | 1 + a | foo | 2 | 1 + a | | 1 | 2 + b | bar | 1 | 1 + b | | | 2 + b | | 1 | 1 + b | bar | 2 | 1 + b | bar | | 2 + b | | 2 | 1 + | | 2 | 3 + | | | 6 + | bar | 1 | 2 + | bar | 2 | 2 + | bar | | 4 + | foo | 1 | 1 + | foo | 2 | 1 + | foo | | 2 + | | 1 | 3 +(24 rows) + +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g) ORDER BY g; + dataa | b | g | count +-------+-----+---+------- + a | bar | 1 | 1 + a | foo | 1 | 1 + b | bar | 1 | 1 + | bar | 1 | 2 + | foo | 1 | 1 + a | | 1 | 2 + b | | 1 | 1 + | | 1 | 3 + a | | 2 | 2 + b | | 2 | 1 + | bar | 2 | 2 + | | 2 | 3 + | foo | 2 | 1 + a | bar | 2 | 1 + a | foo | 2 | 1 + b | bar | 2 | 1 + a | | | 4 + b | bar | | 2 + b | | | 2 + | | | 6 + a | foo | | 2 + a | bar | | 2 + | bar | | 4 + | foo | | 2 +(24 rows) + +reset enable_hashagg; +-- case with degenerate ORDER BY +explain (verbose, costs off) +select 'foo' as f, generate_series(1,2) as g from few order by 1; + QUERY PLAN +---------------------------------------------- + ProjectSet + Output: 'foo'::text, generate_series(1, 2) + -> Seq Scan on public.few + Output: id, dataa, datab +(4 rows) + +select 'foo' as f, generate_series(1,2) as g from few order by 1; + f | g +-----+--- + foo | 1 + foo | 2 + foo | 1 + foo | 2 + foo | 1 + foo | 2 +(6 rows) + +-- data modification +CREATE TABLE fewmore AS SELECT generate_series(1,3) AS data; +INSERT INTO fewmore VALUES(generate_series(4,5)); +SELECT * FROM fewmore; + data +------ + 1 + 2 + 3 + 4 + 5 +(5 rows) + +-- SRFs are not allowed in UPDATE (they once were, but it was nonsense) +UPDATE fewmore SET data = generate_series(4,9); +ERROR: set-returning functions are not allowed in UPDATE +LINE 1: UPDATE fewmore SET data = generate_series(4,9); + ^ +-- SRFs are not allowed in RETURNING +INSERT INTO fewmore VALUES(1) RETURNING generate_series(1,3); +ERROR: set-returning functions are not allowed in RETURNING +LINE 1: INSERT INTO fewmore VALUES(1) RETURNING generate_series(1,3)... + ^ +-- nor standalone VALUES (but surely this is a bug?) +VALUES(1, generate_series(1,2)); +ERROR: set-returning functions are not allowed in VALUES +LINE 1: VALUES(1, generate_series(1,2)); + ^ +-- We allow tSRFs that are not at top level +SELECT int4mul(generate_series(1,2), 10); + int4mul +--------- + 10 + 20 +(2 rows) + +SELECT generate_series(1,3) IS DISTINCT FROM 2; + ?column? +---------- + t + f + t +(3 rows) + +-- but SRFs in function RTEs must be at top level (annoying restriction) +SELECT * FROM int4mul(generate_series(1,2), 10); +ERROR: set-returning functions must appear at top level of FROM +LINE 1: SELECT * FROM int4mul(generate_series(1,2), 10); + ^ +-- DISTINCT ON is evaluated before tSRF evaluation if SRF is not +-- referenced either in ORDER BY or in the DISTINCT ON list. The ORDER +-- BY reference can be implicitly generated, if there's no other ORDER BY. +-- implicit reference (via implicit ORDER) to all columns +SELECT DISTINCT ON (a) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b); + a | b | g +---+---+--- + 1 | 1 | 1 + 3 | 2 | 1 + 5 | 3 | 1 +(3 rows) + +-- unreferenced in DISTINCT ON or ORDER BY +SELECT DISTINCT ON (a) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) +ORDER BY a, b DESC; + a | b | g +---+---+--- + 1 | 4 | 1 + 1 | 4 | 2 + 1 | 4 | 3 + 3 | 2 | 1 + 3 | 2 | 2 + 3 | 2 | 3 + 5 | 3 | 1 + 5 | 3 | 2 + 5 | 3 | 3 +(9 rows) + +-- referenced in ORDER BY +SELECT DISTINCT ON (a) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) +ORDER BY a, b DESC, g DESC; + a | b | g +---+---+--- + 1 | 4 | 3 + 3 | 2 | 3 + 5 | 3 | 3 +(3 rows) + +-- referenced in ORDER BY and DISTINCT ON +SELECT DISTINCT ON (a, b, g) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) +ORDER BY a, b DESC, g DESC; + a | b | g +---+---+--- + 1 | 4 | 3 + 1 | 4 | 2 + 1 | 4 | 1 + 1 | 1 | 3 + 1 | 1 | 2 + 1 | 1 | 1 + 3 | 2 | 3 + 3 | 2 | 2 + 3 | 2 | 1 + 3 | 1 | 3 + 3 | 1 | 2 + 3 | 1 | 1 + 5 | 3 | 3 + 5 | 3 | 2 + 5 | 3 | 1 + 5 | 1 | 3 + 5 | 1 | 2 + 5 | 1 | 1 +(18 rows) + +-- only SRF mentioned in DISTINCT ON +SELECT DISTINCT ON (g) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b); + a | b | g +---+---+--- + 3 | 2 | 1 + 5 | 1 | 2 + 3 | 1 | 3 +(3 rows) + +-- LIMIT / OFFSET is evaluated after SRF evaluation +SELECT a, generate_series(1,2) FROM (VALUES(1),(2),(3)) r(a) LIMIT 2 OFFSET 2; + a | generate_series +---+----------------- + 2 | 1 + 2 | 2 +(2 rows) + +-- SRFs are not allowed in LIMIT. +SELECT 1 LIMIT generate_series(1,3); +ERROR: set-returning functions are not allowed in LIMIT +LINE 1: SELECT 1 LIMIT generate_series(1,3); + ^ +-- tSRF in correlated subquery, referencing table outside +SELECT (SELECT generate_series(1,3) LIMIT 1 OFFSET few.id) FROM few; + generate_series +----------------- + 2 + 3 + +(3 rows) + +-- tSRF in correlated subquery, referencing SRF outside +SELECT (SELECT generate_series(1,3) LIMIT 1 OFFSET g.i) FROM generate_series(0,3) g(i); + generate_series +----------------- + 1 + 2 + 3 + +(4 rows) + +-- Operators can return sets too +CREATE OPERATOR |@| (PROCEDURE = unnest, RIGHTARG = ANYARRAY); +SELECT |@|ARRAY[1,2,3]; + ?column? +---------- + 1 + 2 + 3 +(3 rows) + +-- Some fun cases involving duplicate SRF calls +explain (verbose, costs off) +select generate_series(1,3) as x, generate_series(1,3) + 1 as xp1; + QUERY PLAN +------------------------------------------------------------------ + Result + Output: (generate_series(1, 3)), ((generate_series(1, 3)) + 1) + -> ProjectSet + Output: generate_series(1, 3) + -> Result +(5 rows) + +select generate_series(1,3) as x, generate_series(1,3) + 1 as xp1; + x | xp1 +---+----- + 1 | 2 + 2 | 3 + 3 | 4 +(3 rows) + +explain (verbose, costs off) +select generate_series(1,3)+1 order by generate_series(1,3); + QUERY PLAN +------------------------------------------------------------------------ + Sort + Output: (((generate_series(1, 3)) + 1)), (generate_series(1, 3)) + Sort Key: (generate_series(1, 3)) + -> Result + Output: ((generate_series(1, 3)) + 1), (generate_series(1, 3)) + -> ProjectSet + Output: generate_series(1, 3) + -> Result +(8 rows) + +select generate_series(1,3)+1 order by generate_series(1,3); + ?column? +---------- + 2 + 3 + 4 +(3 rows) + +-- Check that SRFs of same nesting level run in lockstep +explain (verbose, costs off) +select generate_series(1,3) as x, generate_series(3,6) + 1 as y; + QUERY PLAN +------------------------------------------------------------------ + Result + Output: (generate_series(1, 3)), ((generate_series(3, 6)) + 1) + -> ProjectSet + Output: generate_series(1, 3), generate_series(3, 6) + -> Result +(5 rows) + +select generate_series(1,3) as x, generate_series(3,6) + 1 as y; + x | y +---+--- + 1 | 4 + 2 | 5 + 3 | 6 + | 7 +(4 rows) + +-- Clean up +DROP TABLE few; +DROP TABLE fewmore; diff --git a/src/test/singlenode_regress/expected/tstypes.out b/src/test/singlenode_regress/expected/tstypes.out new file mode 100644 index 00000000000..2601e312df4 --- /dev/null +++ b/src/test/singlenode_regress/expected/tstypes.out @@ -0,0 +1,1391 @@ +-- deal with numeric instability of ts_rank +SET extra_float_digits = 0; +--Base tsvector test +SELECT '1'::tsvector; + tsvector +---------- + '1' +(1 row) + +SELECT '1 '::tsvector; + tsvector +---------- + '1' +(1 row) + +SELECT ' 1'::tsvector; + tsvector +---------- + '1' +(1 row) + +SELECT ' 1 '::tsvector; + tsvector +---------- + '1' +(1 row) + +SELECT '1 2'::tsvector; + tsvector +---------- + '1' '2' +(1 row) + +SELECT '''1 2'''::tsvector; + tsvector +---------- + '1 2' +(1 row) + +SELECT E'''1 \\''2'''::tsvector; + tsvector +---------- + '1 ''2' +(1 row) + +SELECT E'''1 \\''2''3'::tsvector; + tsvector +------------- + '1 ''2' '3' +(1 row) + +SELECT E'''1 \\''2'' 3'::tsvector; + tsvector +------------- + '1 ''2' '3' +(1 row) + +SELECT E'''1 \\''2'' '' 3'' 4 '::tsvector; + tsvector +------------------ + ' 3' '1 ''2' '4' +(1 row) + +SELECT $$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector; + tsvector +---------------------------------------- + 'AB\\c' '\\as' 'ab\\\\c' 'ab\\c' 'abc' +(1 row) + +SELECT tsvectorin(tsvectorout($$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector)); + tsvectorin +---------------------------------------- + 'AB\\c' '\\as' 'ab\\\\c' 'ab\\c' 'abc' +(1 row) + +SELECT '''w'':4A,3B,2C,1D,5 a:8'; + ?column? +----------------------- + 'w':4A,3B,2C,1D,5 a:8 +(1 row) + +SELECT 'a:3A b:2a'::tsvector || 'ba:1234 a:1B'; + ?column? +---------------------------- + 'a':3A,4B 'b':2A 'ba':1237 +(1 row) + +--Base tsquery test +SELECT '1'::tsquery; + tsquery +--------- + '1' +(1 row) + +SELECT '1 '::tsquery; + tsquery +--------- + '1' +(1 row) + +SELECT ' 1'::tsquery; + tsquery +--------- + '1' +(1 row) + +SELECT ' 1 '::tsquery; + tsquery +--------- + '1' +(1 row) + +SELECT '''1 2'''::tsquery; + tsquery +--------- + '1 2' +(1 row) + +SELECT E'''1 \\''2'''::tsquery; + tsquery +--------- + '1 ''2' +(1 row) + +SELECT '!1'::tsquery; + tsquery +--------- + !'1' +(1 row) + +SELECT '1|2'::tsquery; + tsquery +----------- + '1' | '2' +(1 row) + +SELECT '1|!2'::tsquery; + tsquery +------------ + '1' | !'2' +(1 row) + +SELECT '!1|2'::tsquery; + tsquery +------------ + !'1' | '2' +(1 row) + +SELECT '!1|!2'::tsquery; + tsquery +------------- + !'1' | !'2' +(1 row) + +SELECT '!(!1|!2)'::tsquery; + tsquery +------------------ + !( !'1' | !'2' ) +(1 row) + +SELECT '!(!1|2)'::tsquery; + tsquery +----------------- + !( !'1' | '2' ) +(1 row) + +SELECT '!(1|!2)'::tsquery; + tsquery +----------------- + !( '1' | !'2' ) +(1 row) + +SELECT '!(1|2)'::tsquery; + tsquery +---------------- + !( '1' | '2' ) +(1 row) + +SELECT '1&2'::tsquery; + tsquery +----------- + '1' & '2' +(1 row) + +SELECT '!1&2'::tsquery; + tsquery +------------ + !'1' & '2' +(1 row) + +SELECT '1&!2'::tsquery; + tsquery +------------ + '1' & !'2' +(1 row) + +SELECT '!1&!2'::tsquery; + tsquery +------------- + !'1' & !'2' +(1 row) + +SELECT '(1&2)'::tsquery; + tsquery +----------- + '1' & '2' +(1 row) + +SELECT '1&(2)'::tsquery; + tsquery +----------- + '1' & '2' +(1 row) + +SELECT '!(1)&2'::tsquery; + tsquery +------------ + !'1' & '2' +(1 row) + +SELECT '!(1&2)'::tsquery; + tsquery +---------------- + !( '1' & '2' ) +(1 row) + +SELECT '1|2&3'::tsquery; + tsquery +----------------- + '1' | '2' & '3' +(1 row) + +SELECT '1|(2&3)'::tsquery; + tsquery +----------------- + '1' | '2' & '3' +(1 row) + +SELECT '(1|2)&3'::tsquery; + tsquery +--------------------- + ( '1' | '2' ) & '3' +(1 row) + +SELECT '1|2&!3'::tsquery; + tsquery +------------------ + '1' | '2' & !'3' +(1 row) + +SELECT '1|!2&3'::tsquery; + tsquery +------------------ + '1' | !'2' & '3' +(1 row) + +SELECT '!1|2&3'::tsquery; + tsquery +------------------ + !'1' | '2' & '3' +(1 row) + +SELECT '!1|(2&3)'::tsquery; + tsquery +------------------ + !'1' | '2' & '3' +(1 row) + +SELECT '!(1|2)&3'::tsquery; + tsquery +---------------------- + !( '1' | '2' ) & '3' +(1 row) + +SELECT '(!1|2)&3'::tsquery; + tsquery +---------------------- + ( !'1' | '2' ) & '3' +(1 row) + +SELECT '1|(2|(4|(5|6)))'::tsquery; + tsquery +----------------------------- + '1' | '2' | '4' | '5' | '6' +(1 row) + +SELECT '1|2|4|5|6'::tsquery; + tsquery +----------------------------- + '1' | '2' | '4' | '5' | '6' +(1 row) + +SELECT '1&(2&(4&(5&6)))'::tsquery; + tsquery +----------------------------- + '1' & '2' & '4' & '5' & '6' +(1 row) + +SELECT '1&2&4&5&6'::tsquery; + tsquery +----------------------------- + '1' & '2' & '4' & '5' & '6' +(1 row) + +SELECT '1&(2&(4&(5|6)))'::tsquery; + tsquery +--------------------------------- + '1' & '2' & '4' & ( '5' | '6' ) +(1 row) + +SELECT '1&(2&(4&(5|!6)))'::tsquery; + tsquery +---------------------------------- + '1' & '2' & '4' & ( '5' | !'6' ) +(1 row) + +SELECT E'1&(''2''&('' 4''&(\\|5 | ''6 \\'' !|&'')))'::tsquery; + tsquery +------------------------------------------ + '1' & '2' & ' 4' & ( '|5' | '6 '' !|&' ) +(1 row) + +SELECT $$'\\as'$$::tsquery; + tsquery +--------- + '\\as' +(1 row) + +SELECT 'a:* & nbb:*ac | doo:a* | goo'::tsquery; + tsquery +-------------------------------------- + 'a':* & 'nbb':*AC | 'doo':*A | 'goo' +(1 row) + +SELECT '!!b'::tsquery; + tsquery +--------- + !!'b' +(1 row) + +SELECT '!!!b'::tsquery; + tsquery +--------- + !!!'b' +(1 row) + +SELECT '!(!b)'::tsquery; + tsquery +--------- + !!'b' +(1 row) + +SELECT 'a & !!b'::tsquery; + tsquery +------------- + 'a' & !!'b' +(1 row) + +SELECT '!!a & b'::tsquery; + tsquery +------------- + !!'a' & 'b' +(1 row) + +SELECT '!!a & !!b'::tsquery; + tsquery +--------------- + !!'a' & !!'b' +(1 row) + +--comparisons +SELECT 'a' < 'b & c'::tsquery as "true"; + true +------ + t +(1 row) + +SELECT 'a' > 'b & c'::tsquery as "false"; + false +------- + f +(1 row) + +SELECT 'a | f' < 'b & c'::tsquery as "false"; + false +------- + t +(1 row) + +SELECT 'a | ff' < 'b & c'::tsquery as "false"; + false +------- + f +(1 row) + +SELECT 'a | f | g' < 'b & c'::tsquery as "false"; + false +------- + f +(1 row) + +--concatenation +SELECT numnode( 'new'::tsquery ); + numnode +--------- + 1 +(1 row) + +SELECT numnode( 'new & york'::tsquery ); + numnode +--------- + 3 +(1 row) + +SELECT numnode( 'new & york | qwery'::tsquery ); + numnode +--------- + 5 +(1 row) + +SELECT 'foo & bar'::tsquery && 'asd'; + ?column? +----------------------- + 'foo' & 'bar' & 'asd' +(1 row) + +SELECT 'foo & bar'::tsquery || 'asd & fg'; + ?column? +------------------------------ + 'foo' & 'bar' | 'asd' & 'fg' +(1 row) + +SELECT 'foo & bar'::tsquery || !!'asd & fg'::tsquery; + ?column? +----------------------------------- + 'foo' & 'bar' | !( 'asd' & 'fg' ) +(1 row) + +SELECT 'foo & bar'::tsquery && 'asd | fg'; + ?column? +---------------------------------- + 'foo' & 'bar' & ( 'asd' | 'fg' ) +(1 row) + +SELECT 'a' <-> 'b & d'::tsquery; + ?column? +----------------------- + 'a' <-> ( 'b' & 'd' ) +(1 row) + +SELECT 'a & g' <-> 'b & d'::tsquery; + ?column? +--------------------------------- + ( 'a' & 'g' ) <-> ( 'b' & 'd' ) +(1 row) + +SELECT 'a & g' <-> 'b | d'::tsquery; + ?column? +--------------------------------- + ( 'a' & 'g' ) <-> ( 'b' | 'd' ) +(1 row) + +SELECT 'a & g' <-> 'b <-> d'::tsquery; + ?column? +----------------------------------- + ( 'a' & 'g' ) <-> ( 'b' <-> 'd' ) +(1 row) + +SELECT tsquery_phrase('a <3> g', 'b & d', 10); + tsquery_phrase +-------------------------------- + 'a' <3> 'g' <10> ( 'b' & 'd' ) +(1 row) + +-- tsvector-tsquery operations +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca' as "true"; + true +------ + t +(1 row) + +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:B' as "true"; + true +------ + t +(1 row) + +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:A' as "true"; + true +------ + t +(1 row) + +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:C' as "false"; + false +------- + f +(1 row) + +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:CB' as "true"; + true +------ + t +(1 row) + +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & c:*C' as "false"; + false +------- + f +(1 row) + +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & c:*CB' as "true"; + true +------ + t +(1 row) + +SELECT 'a b:89 ca:23A,64b cb:80c d:34c'::tsvector @@ 'd:AC & c:*C' as "true"; + true +------ + t +(1 row) + +SELECT 'a b:89 ca:23A,64c cb:80b d:34c'::tsvector @@ 'd:AC & c:*C' as "true"; + true +------ + t +(1 row) + +SELECT 'a b:89 ca:23A,64c cb:80b d:34c'::tsvector @@ 'd:AC & c:*B' as "true"; + true +------ + t +(1 row) + +SELECT 'wa:1D wb:2A'::tsvector @@ 'w:*D & w:*A'::tsquery as "true"; + true +------ + t +(1 row) + +SELECT 'wa:1D wb:2A'::tsvector @@ 'w:*D <-> w:*A'::tsquery as "true"; + true +------ + t +(1 row) + +SELECT 'wa:1A wb:2D'::tsvector @@ 'w:*D <-> w:*A'::tsquery as "false"; + false +------- + f +(1 row) + +SELECT 'wa:1A'::tsvector @@ 'w:*A'::tsquery as "true"; + true +------ + t +(1 row) + +SELECT 'wa:1A'::tsvector @@ 'w:*D'::tsquery as "false"; + false +------- + f +(1 row) + +SELECT 'wa:1A'::tsvector @@ '!w:*A'::tsquery as "false"; + false +------- + f +(1 row) + +SELECT 'wa:1A'::tsvector @@ '!w:*D'::tsquery as "true"; + true +------ + t +(1 row) + +-- historically, a stripped tsvector matches queries ignoring weights: +SELECT strip('wa:1A'::tsvector) @@ 'w:*A'::tsquery as "true"; + true +------ + t +(1 row) + +SELECT strip('wa:1A'::tsvector) @@ 'w:*D'::tsquery as "true"; + true +------ + t +(1 row) + +SELECT strip('wa:1A'::tsvector) @@ '!w:*A'::tsquery as "false"; + false +------- + f +(1 row) + +SELECT strip('wa:1A'::tsvector) @@ '!w:*D'::tsquery as "false"; + false +------- + f +(1 row) + +SELECT 'supernova'::tsvector @@ 'super'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'supeanova supernova'::tsvector @@ 'super'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'supeznova supernova'::tsvector @@ 'super'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'supernova'::tsvector @@ 'super:*'::tsquery AS "true"; + true +------ + t +(1 row) + +SELECT 'supeanova supernova'::tsvector @@ 'super:*'::tsquery AS "true"; + true +------ + t +(1 row) + +SELECT 'supeznova supernova'::tsvector @@ 'super:*'::tsquery AS "true"; + true +------ + t +(1 row) + +--phrase search +SELECT to_tsvector('simple', '1 2 3 1') @@ '1 <-> 2' AS "true"; + true +------ + t +(1 row) + +SELECT to_tsvector('simple', '1 2 3 1') @@ '1 <2> 2' AS "false"; + false +------- + f +(1 row) + +SELECT to_tsvector('simple', '1 2 3 1') @@ '1 <-> 3' AS "false"; + false +------- + f +(1 row) + +SELECT to_tsvector('simple', '1 2 3 1') @@ '1 <2> 3' AS "true"; + true +------ + t +(1 row) + +SELECT to_tsvector('simple', '1 2 1 2') @@ '1 <3> 2' AS "true"; + true +------ + t +(1 row) + +SELECT to_tsvector('simple', '1 2 11 3') @@ '1 <-> 3' AS "false"; + false +------- + f +(1 row) + +SELECT to_tsvector('simple', '1 2 11 3') @@ '1:* <-> 3' AS "true"; + true +------ + t +(1 row) + +SELECT to_tsvector('simple', '1 2 3 4') @@ '1 <-> 2 <-> 3' AS "true"; + true +------ + t +(1 row) + +SELECT to_tsvector('simple', '1 2 3 4') @@ '(1 <-> 2) <-> 3' AS "true"; + true +------ + t +(1 row) + +SELECT to_tsvector('simple', '1 2 3 4') @@ '1 <-> (2 <-> 3)' AS "true"; + true +------ + t +(1 row) + +SELECT to_tsvector('simple', '1 2 3 4') @@ '1 <2> (2 <-> 3)' AS "false"; + false +------- + f +(1 row) + +SELECT to_tsvector('simple', '1 2 1 2 3 4') @@ '(1 <-> 2) <-> 3' AS "true"; + true +------ + t +(1 row) + +SELECT to_tsvector('simple', '1 2 1 2 3 4') @@ '1 <-> 2 <-> 3' AS "true"; + true +------ + t +(1 row) + +-- without position data, phrase search does not match +SELECT strip(to_tsvector('simple', '1 2 3 4')) @@ '1 <-> 2 <-> 3' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'q x q y') @@ 'q <-> (x & y)' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'q x') @@ 'q <-> (x | y <-> z)' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'q y') @@ 'q <-> (x | y <-> z)' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'q y z') @@ 'q <-> (x | y <-> z)' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'q y x') @@ 'q <-> (x | y <-> z)' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'q x y') @@ 'q <-> (x | y <-> z)' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'q x') @@ '(x | y <-> z) <-> q' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'x q') @@ '(x | y <-> z) <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q') @@ '(x | y <-> z) <-> q' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'x y z') @@ '(x | y <-> z) <-> q' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'x y z q') @@ '(x | y <-> z) <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'y z q') @@ '(x | y <-> z) <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'y y q') @@ '(x | y <-> z) <-> q' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'y y q') @@ '(!x | y <-> z) <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q') @@ '(!x | y <-> z) <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'y y q') @@ '(x | y <-> !z) <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x q') @@ '(x | y <-> !z) <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x q') @@ '(!x | y <-> z) <-> q' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'z q') @@ '(!x | y <-> z) <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q') @@ '(!x | y) <-> y <-> q' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'x y q') @@ '(!x | !y) <-> y <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q') @@ '(x | !y) <-> y <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q') @@ '(x | !!z) <-> y <-> q' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q y') @@ '!x <-> y' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q y') @@ '!x <-> !y' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q y') @@ '!x <-> !!y' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q y') @@ '!(x <-> y)' AS "false"; + false +------- + f +(1 row) + +select to_tsvector('simple', 'x y q y') @@ '!(x <2> y)' AS "true"; + true +------ + t +(1 row) + +select strip(to_tsvector('simple', 'x y q y')) @@ '!x <-> y' AS "false"; + false +------- + f +(1 row) + +select strip(to_tsvector('simple', 'x y q y')) @@ '!x <-> !y' AS "false"; + false +------- + f +(1 row) + +select strip(to_tsvector('simple', 'x y q y')) @@ '!x <-> !!y' AS "false"; + false +------- + f +(1 row) + +select strip(to_tsvector('simple', 'x y q y')) @@ '!(x <-> y)' AS "true"; + true +------ + t +(1 row) + +select strip(to_tsvector('simple', 'x y q y')) @@ '!(x <2> y)' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', 'x y q y') @@ '!foo' AS "true"; + true +------ + t +(1 row) + +select to_tsvector('simple', '') @@ '!foo' AS "true"; + true +------ + t +(1 row) + +--ranking +SELECT ts_rank(' a:1 s:2C d g'::tsvector, 'a | s'); + ts_rank +----------- + 0.0911891 +(1 row) + +SELECT ts_rank(' a:1 sa:2C d g'::tsvector, 'a | s'); + ts_rank +----------- + 0.0303964 +(1 row) + +SELECT ts_rank(' a:1 sa:2C d g'::tsvector, 'a | s:*'); + ts_rank +----------- + 0.0911891 +(1 row) + +SELECT ts_rank(' a:1 sa:2C d g'::tsvector, 'a | sa:*'); + ts_rank +----------- + 0.0911891 +(1 row) + +SELECT ts_rank(' a:1 s:2B d g'::tsvector, 'a | s'); + ts_rank +---------- + 0.151982 +(1 row) + +SELECT ts_rank(' a:1 s:2 d g'::tsvector, 'a | s'); + ts_rank +----------- + 0.0607927 +(1 row) + +SELECT ts_rank(' a:1 s:2C d g'::tsvector, 'a & s'); + ts_rank +---------- + 0.140153 +(1 row) + +SELECT ts_rank(' a:1 s:2B d g'::tsvector, 'a & s'); + ts_rank +---------- + 0.198206 +(1 row) + +SELECT ts_rank(' a:1 s:2 d g'::tsvector, 'a & s'); + ts_rank +----------- + 0.0991032 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2C d g'::tsvector, 'a | s'); + ts_rank_cd +------------ + 0.3 +(1 row) + +SELECT ts_rank_cd(' a:1 sa:2C d g'::tsvector, 'a | s'); + ts_rank_cd +------------ + 0.1 +(1 row) + +SELECT ts_rank_cd(' a:1 sa:2C d g'::tsvector, 'a | s:*'); + ts_rank_cd +------------ + 0.3 +(1 row) + +SELECT ts_rank_cd(' a:1 sa:2C d g'::tsvector, 'a | sa:*'); + ts_rank_cd +------------ + 0.3 +(1 row) + +SELECT ts_rank_cd(' a:1 sa:3C sab:2c d g'::tsvector, 'a | sa:*'); + ts_rank_cd +------------ + 0.5 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2B d g'::tsvector, 'a | s'); + ts_rank_cd +------------ + 0.5 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2 d g'::tsvector, 'a | s'); + ts_rank_cd +------------ + 0.2 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2C d g'::tsvector, 'a & s'); + ts_rank_cd +------------ + 0.133333 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2B d g'::tsvector, 'a & s'); + ts_rank_cd +------------ + 0.16 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2 d g'::tsvector, 'a & s'); + ts_rank_cd +------------ + 0.1 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2A d g'::tsvector, 'a <-> s'); + ts_rank_cd +------------ + 0.181818 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2C d g'::tsvector, 'a <-> s'); + ts_rank_cd +------------ + 0.133333 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2 d g'::tsvector, 'a <-> s'); + ts_rank_cd +------------ + 0.1 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2 d:2A g'::tsvector, 'a <-> s'); + ts_rank_cd +------------ + 0.1 +(1 row) + +SELECT ts_rank_cd(' a:1 s:2,3A d:2A g'::tsvector, 'a <2> s:A'); + ts_rank_cd +------------ + 0.0909091 +(1 row) + +SELECT ts_rank_cd(' a:1 b:2 s:3A d:2A g'::tsvector, 'a <2> s:A'); + ts_rank_cd +------------ + 0.0909091 +(1 row) + +SELECT ts_rank_cd(' a:1 sa:2D sb:2A g'::tsvector, 'a <-> s:*'); + ts_rank_cd +------------ + 0.1 +(1 row) + +SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a <-> s:*'); + ts_rank_cd +------------ + 0.1 +(1 row) + +SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a <-> s:* <-> sa:A'); + ts_rank_cd +------------ + 0 +(1 row) + +SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a <-> s:* <-> sa:B'); + ts_rank_cd +------------ + 0 +(1 row) + +SELECT 'a:1 b:2'::tsvector @@ 'a <-> b'::tsquery AS "true"; + true +------ + t +(1 row) + +SELECT 'a:1 b:2'::tsvector @@ 'a <0> b'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'a:1 b:2'::tsvector @@ 'a <1> b'::tsquery AS "true"; + true +------ + t +(1 row) + +SELECT 'a:1 b:2'::tsvector @@ 'a <2> b'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'a:1 b:3'::tsvector @@ 'a <-> b'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'a:1 b:3'::tsvector @@ 'a <0> b'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'a:1 b:3'::tsvector @@ 'a <1> b'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'a:1 b:3'::tsvector @@ 'a <2> b'::tsquery AS "true"; + true +------ + t +(1 row) + +SELECT 'a:1 b:3'::tsvector @@ 'a <3> b'::tsquery AS "false"; + false +------- + f +(1 row) + +SELECT 'a:1 b:3'::tsvector @@ 'a <0> a:*'::tsquery AS "true"; + true +------ + t +(1 row) + +-- tsvector editing operations +SELECT strip('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd'::tsvector); + strip +--------------- + 'a' 'asd' 'w' +(1 row) + +SELECT strip('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); + strip +---------------------------------------------- + 'base' 'hidden' 'rebel' 'spaceship' 'strike' +(1 row) + +SELECT strip('base hidden rebel spaceship strike'::tsvector); + strip +---------------------------------------------- + 'base' 'hidden' 'rebel' 'spaceship' 'strike' +(1 row) + +SELECT ts_delete(to_tsvector('english', 'Rebel spaceships, striking from a hidden base'), 'spaceship'); + ts_delete +------------------------------------------ + 'base':7 'hidden':6 'rebel':1 'strike':3 +(1 row) + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'base'); + ts_delete +-------------------------------------------------------------- + 'hidden':6 'rebel':1 'spaceship':2,33A,34B,35C,36 'strike':3 +(1 row) + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bas'); + ts_delete +----------------------------------------------------------------------- + 'base':7 'hidden':6 'rebel':1 'spaceship':2,33A,34B,35C,36 'strike':3 +(1 row) + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bases'); + ts_delete +----------------------------------------------------------------------- + 'base':7 'hidden':6 'rebel':1 'spaceship':2,33A,34B,35C,36 'strike':3 +(1 row) + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'spaceship'); + ts_delete +------------------------------------------ + 'base':7 'hidden':6 'rebel':1 'strike':3 +(1 row) + +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, 'spaceship'); + ts_delete +---------------------------------- + 'base' 'hidden' 'rebel' 'strike' +(1 row) + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','rebel']); + ts_delete +-------------------------------- + 'base':7 'hidden':6 'strike':3 +(1 row) + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceships','rebel']); + ts_delete +------------------------------------------------------------- + 'base':7 'hidden':6 'spaceship':2,33A,34B,35C,36 'strike':3 +(1 row) + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceshi','rebel']); + ts_delete +------------------------------------------------------------- + 'base':7 'hidden':6 'spaceship':2,33A,34B,35C,36 'strike':3 +(1 row) + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','leya','rebel']); + ts_delete +-------------------------------- + 'base':7 'hidden':6 'strike':3 +(1 row) + +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel']); + ts_delete +-------------------------- + 'base' 'hidden' 'strike' +(1 row) + +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel','rebel']); + ts_delete +-------------------------- + 'base' 'hidden' 'strike' +(1 row) + +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', NULL]); +ERROR: lexeme array may not contain nulls +SELECT unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); + unnest +--------------------------------------------- + (base,{7},{D}) + (hidden,{6},{D}) + (rebel,{1},{D}) + (spaceship,"{2,33,34,35,36}","{D,A,B,C,D}") + (strike,{3},{D}) +(5 rows) + +SELECT unnest('base hidden rebel spaceship strike'::tsvector); + unnest +--------------- + (base,,) + (hidden,,) + (rebel,,) + (spaceship,,) + (strike,,) +(5 rows) + +SELECT * FROM unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); + lexeme | positions | weights +-----------+-----------------+------------- + base | {7} | {D} + hidden | {6} | {D} + rebel | {1} | {D} + spaceship | {2,33,34,35,36} | {D,A,B,C,D} + strike | {3} | {D} +(5 rows) + +SELECT * FROM unnest('base hidden rebel spaceship strike'::tsvector); + lexeme | positions | weights +-----------+-----------+--------- + base | | + hidden | | + rebel | | + spaceship | | + strike | | +(5 rows) + +SELECT lexeme, positions[1] from unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); + lexeme | positions +-----------+----------- + base | 7 + hidden | 6 + rebel | 1 + spaceship | 2 + strike | 3 +(5 rows) + +SELECT tsvector_to_array('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); + tsvector_to_array +-------------------------------------- + {base,hidden,rebel,spaceship,strike} +(1 row) + +SELECT tsvector_to_array('base hidden rebel spaceship strike'::tsvector); + tsvector_to_array +-------------------------------------- + {base,hidden,rebel,spaceship,strike} +(1 row) + +SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship','strike']); + array_to_tsvector +---------------------------------------------- + 'base' 'hidden' 'rebel' 'spaceship' 'strike' +(1 row) + +SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship', NULL]); +ERROR: lexeme array may not contain nulls +-- array_to_tsvector must sort and de-dup +SELECT array_to_tsvector(ARRAY['foo','bar','baz','bar']); + array_to_tsvector +------------------- + 'bar' 'baz' 'foo' +(1 row) + +SELECT setweight('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd zxc:81,567,222A'::tsvector, 'c'); + setweight +---------------------------------------------------------- + 'a':1C,3C 'asd':1C 'w':5C,6C,12C,13C 'zxc':81C,222C,567C +(1 row) + +SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c'); + setweight +---------------------------------------------------------- + 'a':1C,3C 'asd':1C 'w':5C,6C,12C,13C 'zxc':81C,222C,567C +(1 row) + +SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a}'); + setweight +------------------------------------------------------ + 'a':1C,3C 'asd':1C 'w':5,6,12B,13A 'zxc':81,222A,567 +(1 row) + +SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a}'); + setweight +------------------------------------------------------ + 'a':1C,3C 'asd':1C 'w':5,6,12B,13A 'zxc':81,222A,567 +(1 row) + +SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a,zxc}'); + setweight +-------------------------------------------------------- + 'a':1C,3C 'asd':1C 'w':5,6,12B,13A 'zxc':81C,222C,567C +(1 row) + +SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', '{a,zxc}'); + setweight +--------------------------------- + 'a' 'asd' 'w':5,6,12B,13A 'zxc' +(1 row) + +SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', ARRAY['a', 'zxc', NULL]); +ERROR: lexeme array may not contain nulls +SELECT ts_filter('base:7A empir:17 evil:15 first:11 galact:16 hidden:6A rebel:1A spaceship:2A strike:3A victori:12 won:9'::tsvector, '{a}'); + ts_filter +------------------------------------------------------------- + 'base':7A 'hidden':6A 'rebel':1A 'spaceship':2A 'strike':3A +(1 row) + +SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a}'); + ts_filter +----------- + +(1 row) + +SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a,b,NULL}'); +ERROR: weight array may not contain nulls diff --git a/src/test/singlenode_regress/expected/tuplesort.out b/src/test/singlenode_regress/expected/tuplesort.out new file mode 100644 index 00000000000..959fd505724 --- /dev/null +++ b/src/test/singlenode_regress/expected/tuplesort.out @@ -0,0 +1,592 @@ +-- only use parallelism when explicitly intending to do so +SET max_parallel_maintenance_workers = 0; +SET max_parallel_workers = 0; +-- A table with contents that, when sorted, triggers abbreviated +-- key aborts. One easy way to achieve that is to use uuids that all +-- have the same prefix, as abbreviated keys for uuids just use the +-- first sizeof(Datum) bytes. +CREATE TEMP TABLE abbrev_abort_uuids ( + id serial not null, + abort_increasing uuid, + abort_decreasing uuid, + noabort_increasing uuid, + noabort_decreasing uuid); +INSERT INTO abbrev_abort_uuids (abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing) + SELECT + ('00000000-0000-0000-0000-'||to_char(g.i, '000000000000FM'))::uuid abort_increasing, + ('00000000-0000-0000-0000-'||to_char(20000 - g.i, '000000000000FM'))::uuid abort_decreasing, + (to_char(g.i % 10009, '00000000FM')||'-0000-0000-0000-'||to_char(g.i, '000000000000FM'))::uuid noabort_increasing, + (to_char(((20000 - g.i) % 10009), '00000000FM')||'-0000-0000-0000-'||to_char(20000 - g.i, '000000000000FM'))::uuid noabort_decreasing + FROM generate_series(0, 20000, 1) g(i); +-- and a few NULLs +INSERT INTO abbrev_abort_uuids(id) VALUES(0); +INSERT INTO abbrev_abort_uuids DEFAULT VALUES; +INSERT INTO abbrev_abort_uuids DEFAULT VALUES; +-- add just a few duplicates +INSERT INTO abbrev_abort_uuids (abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing) + SELECT abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing + FROM abbrev_abort_uuids + WHERE (id < 10 OR id > 19990) AND id % 3 = 0 AND abort_increasing is not null; +---- +-- Check sort node uses of tuplesort wrt. abbreviated keys +---- +-- plain sort triggering abbreviated abort +SELECT abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_increasing OFFSET 20000 - 4; + abort_increasing | abort_decreasing +--------------------------------------+-------------------------------------- + 00000000-0000-0000-0000-000000019992 | 00000000-0000-0000-0000-000000000008 + 00000000-0000-0000-0000-000000019993 | 00000000-0000-0000-0000-000000000007 + 00000000-0000-0000-0000-000000019994 | 00000000-0000-0000-0000-000000000006 + 00000000-0000-0000-0000-000000019994 | 00000000-0000-0000-0000-000000000006 + 00000000-0000-0000-0000-000000019995 | 00000000-0000-0000-0000-000000000005 + 00000000-0000-0000-0000-000000019996 | 00000000-0000-0000-0000-000000000004 + 00000000-0000-0000-0000-000000019997 | 00000000-0000-0000-0000-000000000003 + 00000000-0000-0000-0000-000000019997 | 00000000-0000-0000-0000-000000000003 + 00000000-0000-0000-0000-000000019998 | 00000000-0000-0000-0000-000000000002 + 00000000-0000-0000-0000-000000019999 | 00000000-0000-0000-0000-000000000001 + 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + | + | + | +(15 rows) + +SELECT abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_decreasing NULLS FIRST OFFSET 20000 - 4; + abort_increasing | abort_decreasing +--------------------------------------+-------------------------------------- + 00000000-0000-0000-0000-000000000011 | 00000000-0000-0000-0000-000000019989 + 00000000-0000-0000-0000-000000000010 | 00000000-0000-0000-0000-000000019990 + 00000000-0000-0000-0000-000000000009 | 00000000-0000-0000-0000-000000019991 + 00000000-0000-0000-0000-000000000008 | 00000000-0000-0000-0000-000000019992 + 00000000-0000-0000-0000-000000000008 | 00000000-0000-0000-0000-000000019992 + 00000000-0000-0000-0000-000000000007 | 00000000-0000-0000-0000-000000019993 + 00000000-0000-0000-0000-000000000006 | 00000000-0000-0000-0000-000000019994 + 00000000-0000-0000-0000-000000000005 | 00000000-0000-0000-0000-000000019995 + 00000000-0000-0000-0000-000000000005 | 00000000-0000-0000-0000-000000019995 + 00000000-0000-0000-0000-000000000004 | 00000000-0000-0000-0000-000000019996 + 00000000-0000-0000-0000-000000000003 | 00000000-0000-0000-0000-000000019997 + 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000019998 + 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000019998 + 00000000-0000-0000-0000-000000000001 | 00000000-0000-0000-0000-000000019999 + 00000000-0000-0000-0000-000000000000 | 00000000-0000-0000-0000-000000020000 +(15 rows) + +-- plain sort not triggering abbreviated abort +SELECT noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_increasing OFFSET 20000 - 4; + noabort_increasing | noabort_decreasing +--------------------------------------+-------------------------------------- + 00009997-0000-0000-0000-000000009997 | 00010003-0000-0000-0000-000000010003 + 00009998-0000-0000-0000-000000009998 | 00010002-0000-0000-0000-000000010002 + 00009999-0000-0000-0000-000000009999 | 00010001-0000-0000-0000-000000010001 + 00010000-0000-0000-0000-000000010000 | 00010000-0000-0000-0000-000000010000 + 00010001-0000-0000-0000-000000010001 | 00009999-0000-0000-0000-000000009999 + 00010002-0000-0000-0000-000000010002 | 00009998-0000-0000-0000-000000009998 + 00010003-0000-0000-0000-000000010003 | 00009997-0000-0000-0000-000000009997 + 00010004-0000-0000-0000-000000010004 | 00009996-0000-0000-0000-000000009996 + 00010005-0000-0000-0000-000000010005 | 00009995-0000-0000-0000-000000009995 + 00010006-0000-0000-0000-000000010006 | 00009994-0000-0000-0000-000000009994 + 00010007-0000-0000-0000-000000010007 | 00009993-0000-0000-0000-000000009993 + 00010008-0000-0000-0000-000000010008 | 00009992-0000-0000-0000-000000009992 + | + | + | +(15 rows) + +SELECT noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing NULLS FIRST OFFSET 20000 - 4; + noabort_increasing | noabort_decreasing +--------------------------------------+-------------------------------------- + 00010006-0000-0000-0000-000000010006 | 00009994-0000-0000-0000-000000009994 + 00010005-0000-0000-0000-000000010005 | 00009995-0000-0000-0000-000000009995 + 00010004-0000-0000-0000-000000010004 | 00009996-0000-0000-0000-000000009996 + 00010003-0000-0000-0000-000000010003 | 00009997-0000-0000-0000-000000009997 + 00010002-0000-0000-0000-000000010002 | 00009998-0000-0000-0000-000000009998 + 00010001-0000-0000-0000-000000010001 | 00009999-0000-0000-0000-000000009999 + 00010000-0000-0000-0000-000000010000 | 00010000-0000-0000-0000-000000010000 + 00009999-0000-0000-0000-000000009999 | 00010001-0000-0000-0000-000000010001 + 00009998-0000-0000-0000-000000009998 | 00010002-0000-0000-0000-000000010002 + 00009997-0000-0000-0000-000000009997 | 00010003-0000-0000-0000-000000010003 + 00009996-0000-0000-0000-000000009996 | 00010004-0000-0000-0000-000000010004 + 00009995-0000-0000-0000-000000009995 | 00010005-0000-0000-0000-000000010005 + 00009994-0000-0000-0000-000000009994 | 00010006-0000-0000-0000-000000010006 + 00009993-0000-0000-0000-000000009993 | 00010007-0000-0000-0000-000000010007 + 00009992-0000-0000-0000-000000009992 | 00010008-0000-0000-0000-000000010008 +(15 rows) + +-- bounded sort (disables abbreviated keys) +SELECT abort_increasing, noabort_increasing FROM abbrev_abort_uuids ORDER BY abort_increasing LIMIT 5; + abort_increasing | noabort_increasing +--------------------------------------+-------------------------------------- + 00000000-0000-0000-0000-000000000000 | 00000000-0000-0000-0000-000000000000 + 00000000-0000-0000-0000-000000000001 | 00000001-0000-0000-0000-000000000001 + 00000000-0000-0000-0000-000000000002 | 00000002-0000-0000-0000-000000000002 + 00000000-0000-0000-0000-000000000002 | 00000002-0000-0000-0000-000000000002 + 00000000-0000-0000-0000-000000000003 | 00000003-0000-0000-0000-000000000003 +(5 rows) + +SELECT abort_increasing, noabort_increasing FROM abbrev_abort_uuids ORDER BY noabort_increasing NULLS FIRST LIMIT 5; + abort_increasing | noabort_increasing +--------------------------------------+-------------------------------------- + | + | + | + 00000000-0000-0000-0000-000000000000 | 00000000-0000-0000-0000-000000000000 + 00000000-0000-0000-0000-000000010009 | 00000000-0000-0000-0000-000000010009 +(5 rows) + +---- +-- Check index creation uses of tuplesort wrt. abbreviated keys +---- +-- index creation using abbreviated keys successfully +CREATE INDEX abbrev_abort_uuids__noabort_increasing_idx ON abbrev_abort_uuids (noabort_increasing); +CREATE INDEX abbrev_abort_uuids__noabort_decreasing_idx ON abbrev_abort_uuids (noabort_decreasing); +-- verify +EXPLAIN (COSTS OFF) +SELECT id, noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_increasing LIMIT 5; + QUERY PLAN +----------------------------------------------------------------------------------------- + Limit + -> Index Scan using abbrev_abort_uuids__noabort_increasing_idx on abbrev_abort_uuids +(2 rows) + +SELECT id, noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_increasing LIMIT 5; + id | noabort_increasing | noabort_decreasing +-------+--------------------------------------+-------------------------------------- + 1 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 + 10010 | 00000000-0000-0000-0000-000000010009 | 00009991-0000-0000-0000-000000009991 + 2 | 00000001-0000-0000-0000-000000000001 | 00009990-0000-0000-0000-000000019999 + 10011 | 00000001-0000-0000-0000-000000010010 | 00009990-0000-0000-0000-000000009990 + 3 | 00000002-0000-0000-0000-000000000002 | 00009989-0000-0000-0000-000000019998 +(5 rows) + +EXPLAIN (COSTS OFF) +SELECT id, noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing LIMIT 5; + QUERY PLAN +----------------------------------------------------------------------------------------- + Limit + -> Index Scan using abbrev_abort_uuids__noabort_decreasing_idx on abbrev_abort_uuids +(2 rows) + +SELECT id, noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing LIMIT 5; + id | noabort_increasing | noabort_decreasing +-------+--------------------------------------+-------------------------------------- + 20001 | 00009991-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 20010 | 00009991-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 9992 | 00009991-0000-0000-0000-000000009991 | 00000000-0000-0000-0000-000000010009 + 20000 | 00009990-0000-0000-0000-000000019999 | 00000001-0000-0000-0000-000000000001 + 9991 | 00009990-0000-0000-0000-000000009990 | 00000001-0000-0000-0000-000000010010 +(5 rows) + +-- index creation using abbreviated keys, hitting abort +CREATE INDEX abbrev_abort_uuids__abort_increasing_idx ON abbrev_abort_uuids (abort_increasing); +CREATE INDEX abbrev_abort_uuids__abort_decreasing_idx ON abbrev_abort_uuids (abort_decreasing); +-- verify +EXPLAIN (COSTS OFF) +SELECT id, abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_increasing LIMIT 5; + QUERY PLAN +--------------------------------------------------------------------------------------- + Limit + -> Index Scan using abbrev_abort_uuids__abort_increasing_idx on abbrev_abort_uuids +(2 rows) + +SELECT id, abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_increasing LIMIT 5; + id | abort_increasing | abort_decreasing +-------+--------------------------------------+-------------------------------------- + 1 | 00000000-0000-0000-0000-000000000000 | 00000000-0000-0000-0000-000000020000 + 2 | 00000000-0000-0000-0000-000000000001 | 00000000-0000-0000-0000-000000019999 + 3 | 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000019998 + 20004 | 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000019998 + 4 | 00000000-0000-0000-0000-000000000003 | 00000000-0000-0000-0000-000000019997 +(5 rows) + +EXPLAIN (COSTS OFF) +SELECT id, abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_decreasing LIMIT 5; + QUERY PLAN +--------------------------------------------------------------------------------------- + Limit + -> Index Scan using abbrev_abort_uuids__abort_decreasing_idx on abbrev_abort_uuids +(2 rows) + +SELECT id, abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_decreasing LIMIT 5; + id | abort_increasing | abort_decreasing +-------+--------------------------------------+-------------------------------------- + 20001 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 20010 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 20000 | 00000000-0000-0000-0000-000000019999 | 00000000-0000-0000-0000-000000000001 + 19999 | 00000000-0000-0000-0000-000000019998 | 00000000-0000-0000-0000-000000000002 + 19998 | 00000000-0000-0000-0000-000000019997 | 00000000-0000-0000-0000-000000000003 +(5 rows) + +---- +-- Check CLUSTER uses of tuplesort wrt. abbreviated keys +---- +-- when aborting, increasing order +BEGIN; +SET LOCAL enable_indexscan = false; +CLUSTER abbrev_abort_uuids USING abbrev_abort_uuids__abort_increasing_idx; +-- head +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid LIMIT 5; + id | abort_increasing | abort_decreasing | noabort_increasing | noabort_decreasing +-------+--------------------------------------+--------------------------------------+--------------------------------------+-------------------------------------- + 1 | 00000000-0000-0000-0000-000000000000 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 + 2 | 00000000-0000-0000-0000-000000000001 | 00000000-0000-0000-0000-000000019999 | 00000001-0000-0000-0000-000000000001 | 00009990-0000-0000-0000-000000019999 + 3 | 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000019998 | 00000002-0000-0000-0000-000000000002 | 00009989-0000-0000-0000-000000019998 + 20004 | 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000019998 | 00000002-0000-0000-0000-000000000002 | 00009989-0000-0000-0000-000000019998 + 4 | 00000000-0000-0000-0000-000000000003 | 00000000-0000-0000-0000-000000019997 | 00000003-0000-0000-0000-000000000003 | 00009988-0000-0000-0000-000000019997 +(5 rows) + +-- tail +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid DESC LIMIT 5; + id | abort_increasing | abort_decreasing | noabort_increasing | noabort_decreasing +-------+--------------------------------------+--------------------------------------+--------------------------------------+-------------------------------------- + 0 | | | | + 20002 | | | | + 20003 | | | | + 20001 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 20010 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 +(5 rows) + +ROLLBACK; +-- when aborting, decreasing order +BEGIN; +SET LOCAL enable_indexscan = false; +CLUSTER abbrev_abort_uuids USING abbrev_abort_uuids__abort_decreasing_idx; +-- head +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid LIMIT 5; + id | abort_increasing | abort_decreasing | noabort_increasing | noabort_decreasing +-------+--------------------------------------+--------------------------------------+--------------------------------------+-------------------------------------- + 20010 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 20001 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 20000 | 00000000-0000-0000-0000-000000019999 | 00000000-0000-0000-0000-000000000001 | 00009990-0000-0000-0000-000000019999 | 00000001-0000-0000-0000-000000000001 + 19999 | 00000000-0000-0000-0000-000000019998 | 00000000-0000-0000-0000-000000000002 | 00009989-0000-0000-0000-000000019998 | 00000002-0000-0000-0000-000000000002 + 20009 | 00000000-0000-0000-0000-000000019997 | 00000000-0000-0000-0000-000000000003 | 00009988-0000-0000-0000-000000019997 | 00000003-0000-0000-0000-000000000003 +(5 rows) + +-- tail +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid DESC LIMIT 5; + id | abort_increasing | abort_decreasing | noabort_increasing | noabort_decreasing +-------+--------------------------------------+--------------------------------------+--------------------------------------+-------------------------------------- + 0 | | | | + 20002 | | | | + 20003 | | | | + 1 | 00000000-0000-0000-0000-000000000000 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 + 2 | 00000000-0000-0000-0000-000000000001 | 00000000-0000-0000-0000-000000019999 | 00000001-0000-0000-0000-000000000001 | 00009990-0000-0000-0000-000000019999 +(5 rows) + +ROLLBACK; +-- when not aborting, increasing order +BEGIN; +SET LOCAL enable_indexscan = false; +CLUSTER abbrev_abort_uuids USING abbrev_abort_uuids__noabort_increasing_idx; +-- head +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid LIMIT 5; + id | abort_increasing | abort_decreasing | noabort_increasing | noabort_decreasing +-------+--------------------------------------+--------------------------------------+--------------------------------------+-------------------------------------- + 1 | 00000000-0000-0000-0000-000000000000 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 + 10010 | 00000000-0000-0000-0000-000000010009 | 00000000-0000-0000-0000-000000009991 | 00000000-0000-0000-0000-000000010009 | 00009991-0000-0000-0000-000000009991 + 2 | 00000000-0000-0000-0000-000000000001 | 00000000-0000-0000-0000-000000019999 | 00000001-0000-0000-0000-000000000001 | 00009990-0000-0000-0000-000000019999 + 10011 | 00000000-0000-0000-0000-000000010010 | 00000000-0000-0000-0000-000000009990 | 00000001-0000-0000-0000-000000010010 | 00009990-0000-0000-0000-000000009990 + 20004 | 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000019998 | 00000002-0000-0000-0000-000000000002 | 00009989-0000-0000-0000-000000019998 +(5 rows) + +-- tail +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid DESC LIMIT 5; + id | abort_increasing | abort_decreasing | noabort_increasing | noabort_decreasing +-------+--------------------------------------+--------------------------------------+--------------------------------------+-------------------------------------- + 0 | | | | + 20002 | | | | + 20003 | | | | + 10009 | 00000000-0000-0000-0000-000000010008 | 00000000-0000-0000-0000-000000009992 | 00010008-0000-0000-0000-000000010008 | 00009992-0000-0000-0000-000000009992 + 10008 | 00000000-0000-0000-0000-000000010007 | 00000000-0000-0000-0000-000000009993 | 00010007-0000-0000-0000-000000010007 | 00009993-0000-0000-0000-000000009993 +(5 rows) + +ROLLBACK; +-- when no aborting, decreasing order +BEGIN; +SET LOCAL enable_indexscan = false; +CLUSTER abbrev_abort_uuids USING abbrev_abort_uuids__noabort_decreasing_idx; +-- head +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid LIMIT 5; + id | abort_increasing | abort_decreasing | noabort_increasing | noabort_decreasing +-------+--------------------------------------+--------------------------------------+--------------------------------------+-------------------------------------- + 20010 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 20001 | 00000000-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 | 00009991-0000-0000-0000-000000020000 | 00000000-0000-0000-0000-000000000000 + 9992 | 00000000-0000-0000-0000-000000009991 | 00000000-0000-0000-0000-000000010009 | 00009991-0000-0000-0000-000000009991 | 00000000-0000-0000-0000-000000010009 + 20000 | 00000000-0000-0000-0000-000000019999 | 00000000-0000-0000-0000-000000000001 | 00009990-0000-0000-0000-000000019999 | 00000001-0000-0000-0000-000000000001 + 9991 | 00000000-0000-0000-0000-000000009990 | 00000000-0000-0000-0000-000000010010 | 00009990-0000-0000-0000-000000009990 | 00000001-0000-0000-0000-000000010010 +(5 rows) + +-- tail +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid DESC LIMIT 5; + id | abort_increasing | abort_decreasing | noabort_increasing | noabort_decreasing +-------+--------------------------------------+--------------------------------------+--------------------------------------+-------------------------------------- + 0 | | | | + 20003 | | | | + 20002 | | | | + 9993 | 00000000-0000-0000-0000-000000009992 | 00000000-0000-0000-0000-000000010008 | 00009992-0000-0000-0000-000000009992 | 00010008-0000-0000-0000-000000010008 + 9994 | 00000000-0000-0000-0000-000000009993 | 00000000-0000-0000-0000-000000010007 | 00009993-0000-0000-0000-000000009993 | 00010007-0000-0000-0000-000000010007 +(5 rows) + +ROLLBACK; +---- +-- test forward and backward scans for in-memory and disk based tuplesort +---- +-- in-memory +BEGIN; +SET LOCAL enable_indexscan = false; +-- unfortunately can't show analyze output confirming sort method, +-- the memory used output wouldn't be stable +EXPLAIN (COSTS OFF) DECLARE c SCROLL CURSOR FOR SELECT noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing; + QUERY PLAN +-------------------------------------- + Sort + Sort Key: noabort_decreasing + -> Seq Scan on abbrev_abort_uuids +(3 rows) + +DECLARE c SCROLL CURSOR FOR SELECT noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing; +-- first and second +FETCH NEXT FROM c; + noabort_decreasing +-------------------------------------- + 00000000-0000-0000-0000-000000000000 +(1 row) + +FETCH NEXT FROM c; + noabort_decreasing +-------------------------------------- + 00000000-0000-0000-0000-000000000000 +(1 row) + +--start_ignore +--GDPB doesn't support backward fetch. +/* + * scroll beyond beginning + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + * + * -- scroll beyond end end + * FETCH LAST FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + * FETCH NEXT FROM c; + * FETCH NEXT FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + */ +--end_ignore +COMMIT; +-- disk based +BEGIN; +SET LOCAL enable_indexscan = false; +SET LOCAL work_mem = '100kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +-- unfortunately can't show analyze output confirming sort method, +-- the memory used output wouldn't be stable +EXPLAIN (COSTS OFF) DECLARE c SCROLL CURSOR FOR SELECT noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing; + QUERY PLAN +-------------------------------------- + Sort + Sort Key: noabort_decreasing + -> Seq Scan on abbrev_abort_uuids +(3 rows) + +DECLARE c SCROLL CURSOR FOR SELECT noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing; +-- first and second +FETCH NEXT FROM c; + noabort_decreasing +-------------------------------------- + 00000000-0000-0000-0000-000000000000 +(1 row) + +FETCH NEXT FROM c; + noabort_decreasing +-------------------------------------- + 00000000-0000-0000-0000-000000000000 +(1 row) + +--start_ignore +-- scroll beyond beginning +/* + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + * + * -- scroll beyond end end + * FETCH LAST FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + * FETCH NEXT FROM c; + * FETCH NEXT FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + */ +--end_ignore +COMMIT; +---- +-- test tuplesort using both in-memory and disk sort +--- +-- memory based +SELECT + -- fixed-width by-value datum + (array_agg(id ORDER BY id DESC NULLS FIRST))[0:5], + -- fixed-width by-ref datum + (array_agg(abort_increasing ORDER BY abort_increasing DESC NULLS LAST))[0:5], + -- variable-width datum + (array_agg(id::text ORDER BY id::text DESC NULLS LAST))[0:5], + -- fixed width by-value datum tuplesort + percentile_disc(0.99) WITHIN GROUP (ORDER BY id), + -- ensure state is shared + percentile_disc(0.01) WITHIN GROUP (ORDER BY id), + -- fixed width by-ref datum tuplesort + percentile_disc(0.8) WITHIN GROUP (ORDER BY abort_increasing), + -- variable width by-ref datum tuplesort + percentile_disc(0.2) WITHIN GROUP (ORDER BY id::text), + -- multi-column tuplesort + rank('00000000-0000-0000-0000-000000000000', '2', '2') WITHIN GROUP (ORDER BY noabort_increasing, id, id::text) +FROM ( + SELECT * FROM abbrev_abort_uuids + UNION ALL + SELECT NULL, NULL, NULL, NULL, NULL) s; + array_agg | array_agg | array_agg | percentile_disc | percentile_disc | percentile_disc | percentile_disc | rank +--------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+-----------------+-----------------+--------------------------------------+-----------------+------ + {NULL,20010,20009,20008,20007} | {00000000-0000-0000-0000-000000020000,00000000-0000-0000-0000-000000020000,00000000-0000-0000-0000-000000019999,00000000-0000-0000-0000-000000019998,00000000-0000-0000-0000-000000019997} | {9999,9998,9997,9996,9995} | 19810 | 200 | 00000000-0000-0000-0000-000000016003 | 136 | 2 +(1 row) + +-- disk based (see also above) +BEGIN; +SET LOCAL work_mem = '100kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +SELECT + (array_agg(id ORDER BY id DESC NULLS FIRST))[0:5], + (array_agg(abort_increasing ORDER BY abort_increasing DESC NULLS LAST))[0:5], + (array_agg(id::text ORDER BY id::text DESC NULLS LAST))[0:5], + percentile_disc(0.99) WITHIN GROUP (ORDER BY id), + percentile_disc(0.01) WITHIN GROUP (ORDER BY id), + percentile_disc(0.8) WITHIN GROUP (ORDER BY abort_increasing), + percentile_disc(0.2) WITHIN GROUP (ORDER BY id::text), + rank('00000000-0000-0000-0000-000000000000', '2', '2') WITHIN GROUP (ORDER BY noabort_increasing, id, id::text) +FROM ( + SELECT * FROM abbrev_abort_uuids + UNION ALL + SELECT NULL, NULL, NULL, NULL, NULL) s; + array_agg | array_agg | array_agg | percentile_disc | percentile_disc | percentile_disc | percentile_disc | rank +--------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+-----------------+-----------------+--------------------------------------+-----------------+------ + {NULL,20010,20009,20008,20007} | {00000000-0000-0000-0000-000000020000,00000000-0000-0000-0000-000000020000,00000000-0000-0000-0000-000000019999,00000000-0000-0000-0000-000000019998,00000000-0000-0000-0000-000000019997} | {9999,9998,9997,9996,9995} | 19810 | 200 | 00000000-0000-0000-0000-000000016003 | 136 | 2 +(1 row) + +ROLLBACK; +---- +-- test tuplesort mark/restore +--- +CREATE TEMP TABLE test_mark_restore(col1 int, col2 int, col12 int); +-- need a few duplicates for mark/restore to matter +INSERT INTO test_mark_restore(col1, col2, col12) + SELECT a.i, b.i, a.i * b.i FROM generate_series(1, 500) a(i), generate_series(1, 5) b(i); +BEGIN; +SET LOCAL enable_nestloop = off; +SET LOCAL enable_hashjoin = off; +SET LOCAL enable_material = off; +-- set query into variable once, to avoid repetition of the fairly long query +SELECT $$ + SELECT col12, count(distinct a.col1), count(distinct a.col2), count(distinct b.col1), count(distinct b.col2), count(*) + FROM test_mark_restore a + JOIN test_mark_restore b USING(col12) + GROUP BY 1 + HAVING count(*) > 1 + ORDER BY 2 DESC, 1 DESC, 3 DESC, 4 DESC, 5 DESC, 6 DESC + LIMIT 10 +$$ AS qry \gset +-- test mark/restore with in-memory sorts +EXPLAIN (COSTS OFF) :qry; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Limit + -> Sort + Sort Key: (count(DISTINCT a.col1)) DESC, a.col12 DESC, (count(DISTINCT a.col2)) DESC, (count(DISTINCT b.col1)) DESC, (count(DISTINCT b.col2)) DESC, (count(*)) DESC + -> GroupAggregate + Group Key: a.col12 + Filter: (count(*) > 1) + -> Merge Join + Merge Cond: (a.col12 = b.col12) + -> Sort + Sort Key: a.col12 DESC + -> Seq Scan on test_mark_restore a + -> Sort + Sort Key: b.col12 DESC + -> Seq Scan on test_mark_restore b +(14 rows) + +:qry; + col12 | count | count | count | count | count +-------+-------+-------+-------+-------+------- + 480 | 5 | 5 | 5 | 5 | 25 + 420 | 5 | 5 | 5 | 5 | 25 + 360 | 5 | 5 | 5 | 5 | 25 + 300 | 5 | 5 | 5 | 5 | 25 + 240 | 5 | 5 | 5 | 5 | 25 + 180 | 5 | 5 | 5 | 5 | 25 + 120 | 5 | 5 | 5 | 5 | 25 + 60 | 5 | 5 | 5 | 5 | 25 + 960 | 4 | 4 | 4 | 4 | 16 + 900 | 4 | 4 | 4 | 4 | 16 +(10 rows) + +-- test mark/restore with on-disk sorts +SET LOCAL work_mem = '100kB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +EXPLAIN (COSTS OFF) :qry; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Limit + -> Sort + Sort Key: (count(DISTINCT a.col1)) DESC, a.col12 DESC, (count(DISTINCT a.col2)) DESC, (count(DISTINCT b.col1)) DESC, (count(DISTINCT b.col2)) DESC, (count(*)) DESC + -> GroupAggregate + Group Key: a.col12 + Filter: (count(*) > 1) + -> Merge Join + Merge Cond: (a.col12 = b.col12) + -> Sort + Sort Key: a.col12 DESC + -> Seq Scan on test_mark_restore a + -> Sort + Sort Key: b.col12 DESC + -> Seq Scan on test_mark_restore b +(14 rows) + +:qry; + col12 | count | count | count | count | count +-------+-------+-------+-------+-------+------- + 480 | 5 | 5 | 5 | 5 | 25 + 420 | 5 | 5 | 5 | 5 | 25 + 360 | 5 | 5 | 5 | 5 | 25 + 300 | 5 | 5 | 5 | 5 | 25 + 240 | 5 | 5 | 5 | 5 | 25 + 180 | 5 | 5 | 5 | 5 | 25 + 120 | 5 | 5 | 5 | 5 | 25 + 60 | 5 | 5 | 5 | 5 | 25 + 960 | 4 | 4 | 4 | 4 | 16 + 900 | 4 | 4 | 4 | 4 | 16 +(10 rows) + +COMMIT; diff --git a/src/test/singlenode_regress/expected/txid.out b/src/test/singlenode_regress/expected/txid.out new file mode 100644 index 00000000000..95ba66e95ee --- /dev/null +++ b/src/test/singlenode_regress/expected/txid.out @@ -0,0 +1,327 @@ +-- txid_snapshot data type and related functions +-- Note: these are backward-compatibility functions and types, and have been +-- replaced by new xid8-based variants. See xid.sql. The txid variants will +-- be removed in a future release. +-- i/o +select '12:13:'::txid_snapshot; + txid_snapshot +--------------- + 12:13: +(1 row) + +select '12:18:14,16'::txid_snapshot; + txid_snapshot +--------------- + 12:18:14,16 +(1 row) + +select '12:16:14,14'::txid_snapshot; + txid_snapshot +--------------- + 12:16:14 +(1 row) + +-- errors +select '31:12:'::txid_snapshot; +ERROR: invalid input syntax for type pg_snapshot: "31:12:" +LINE 1: select '31:12:'::txid_snapshot; + ^ +select '0:1:'::txid_snapshot; +ERROR: invalid input syntax for type pg_snapshot: "0:1:" +LINE 1: select '0:1:'::txid_snapshot; + ^ +select '12:13:0'::txid_snapshot; +ERROR: invalid input syntax for type pg_snapshot: "12:13:0" +LINE 1: select '12:13:0'::txid_snapshot; + ^ +select '12:16:14,13'::txid_snapshot; +ERROR: invalid input syntax for type pg_snapshot: "12:16:14,13" +LINE 1: select '12:16:14,13'::txid_snapshot; + ^ +create temp table snapshot_test ( + nr integer, + snap txid_snapshot +); +insert into snapshot_test values (1, '12:13:'); +insert into snapshot_test values (2, '12:20:13,15,18'); +insert into snapshot_test values (3, '100001:100009:100005,100007,100008'); +insert into snapshot_test values (4, '100:150:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131'); +select snap from snapshot_test order by nr; + snap +------------------------------------------------------------------------------------------------------------------------------------- + 12:13: + 12:20:13,15,18 + 100001:100009:100005,100007,100008 + 100:150:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131 +(4 rows) + +select txid_snapshot_xmin(snap), + txid_snapshot_xmax(snap), + txid_snapshot_xip(snap) +from snapshot_test order by nr; + txid_snapshot_xmin | txid_snapshot_xmax | txid_snapshot_xip +--------------------+--------------------+------------------- + 12 | 20 | 13 + 12 | 20 | 15 + 12 | 20 | 18 + 100001 | 100009 | 100005 + 100001 | 100009 | 100007 + 100001 | 100009 | 100008 + 100 | 150 | 101 + 100 | 150 | 102 + 100 | 150 | 103 + 100 | 150 | 104 + 100 | 150 | 105 + 100 | 150 | 106 + 100 | 150 | 107 + 100 | 150 | 108 + 100 | 150 | 109 + 100 | 150 | 110 + 100 | 150 | 111 + 100 | 150 | 112 + 100 | 150 | 113 + 100 | 150 | 114 + 100 | 150 | 115 + 100 | 150 | 116 + 100 | 150 | 117 + 100 | 150 | 118 + 100 | 150 | 119 + 100 | 150 | 120 + 100 | 150 | 121 + 100 | 150 | 122 + 100 | 150 | 123 + 100 | 150 | 124 + 100 | 150 | 125 + 100 | 150 | 126 + 100 | 150 | 127 + 100 | 150 | 128 + 100 | 150 | 129 + 100 | 150 | 130 + 100 | 150 | 131 +(37 rows) + +select id, txid_visible_in_snapshot(id, snap) +from snapshot_test, generate_series(11, 21) id +where nr = 2; + id | txid_visible_in_snapshot +----+-------------------------- + 11 | t + 12 | t + 13 | f + 14 | t + 15 | f + 16 | t + 17 | t + 18 | f + 19 | t + 20 | f + 21 | f +(11 rows) + +-- test bsearch +select id, txid_visible_in_snapshot(id, snap) +from snapshot_test, generate_series(90, 160) id +where nr = 4; + id | txid_visible_in_snapshot +-----+-------------------------- + 90 | t + 91 | t + 92 | t + 93 | t + 94 | t + 95 | t + 96 | t + 97 | t + 98 | t + 99 | t + 100 | t + 101 | f + 102 | f + 103 | f + 104 | f + 105 | f + 106 | f + 107 | f + 108 | f + 109 | f + 110 | f + 111 | f + 112 | f + 113 | f + 114 | f + 115 | f + 116 | f + 117 | f + 118 | f + 119 | f + 120 | f + 121 | f + 122 | f + 123 | f + 124 | f + 125 | f + 126 | f + 127 | f + 128 | f + 129 | f + 130 | f + 131 | f + 132 | t + 133 | t + 134 | t + 135 | t + 136 | t + 137 | t + 138 | t + 139 | t + 140 | t + 141 | t + 142 | t + 143 | t + 144 | t + 145 | t + 146 | t + 147 | t + 148 | t + 149 | t + 150 | f + 151 | f + 152 | f + 153 | f + 154 | f + 155 | f + 156 | f + 157 | f + 158 | f + 159 | f + 160 | f +(71 rows) + +-- test current values also +select txid_current() >= txid_snapshot_xmin(txid_current_snapshot()); + ?column? +---------- + t +(1 row) + +-- we can't assume current is always less than xmax, however +select txid_visible_in_snapshot(txid_current(), txid_current_snapshot()); + txid_visible_in_snapshot +-------------------------- + f +(1 row) + +-- test 64bitness +select txid_snapshot '1000100010001000:1000100010001100:1000100010001012,1000100010001013'; + txid_snapshot +--------------------------------------------------------------------- + 1000100010001000:1000100010001100:1000100010001012,1000100010001013 +(1 row) + +select txid_visible_in_snapshot('1000100010001012', '1000100010001000:1000100010001100:1000100010001012,1000100010001013'); + txid_visible_in_snapshot +-------------------------- + f +(1 row) + +select txid_visible_in_snapshot('1000100010001015', '1000100010001000:1000100010001100:1000100010001012,1000100010001013'); + txid_visible_in_snapshot +-------------------------- + t +(1 row) + +-- test 64bit overflow +SELECT txid_snapshot '1:9223372036854775807:3'; + txid_snapshot +------------------------- + 1:9223372036854775807:3 +(1 row) + +SELECT txid_snapshot '1:9223372036854775808:3'; +ERROR: invalid input syntax for type pg_snapshot: "1:9223372036854775808:3" +LINE 1: SELECT txid_snapshot '1:9223372036854775808:3'; + ^ +-- test txid_current_if_assigned +BEGIN; +SELECT txid_current_if_assigned() IS NULL; + ?column? +---------- + t +(1 row) + +SELECT txid_current() \gset +SELECT txid_current_if_assigned() IS NOT DISTINCT FROM BIGINT :'txid_current'; + ?column? +---------- + t +(1 row) + +COMMIT; +-- test xid status functions +BEGIN; +SELECT txid_current() AS committed \gset +COMMIT; +BEGIN; +SELECT txid_current() AS rolledback \gset +ROLLBACK; +BEGIN; +SELECT txid_current() AS inprogress \gset +SELECT txid_status(:committed) AS committed; + committed +----------- + committed +(1 row) + +SELECT txid_status(:rolledback) AS rolledback; + rolledback +------------ + aborted +(1 row) + +SELECT txid_status(:inprogress) AS inprogress; + inprogress +------------- + in progress +(1 row) + +SELECT txid_status(1); -- BootstrapTransactionId is always committed + txid_status +------------- + committed +(1 row) + +SELECT txid_status(2); -- FrozenTransactionId is always committed + txid_status +------------- + committed +(1 row) + +SELECT txid_status(3); -- in regress testing FirstNormalTransactionId will always be behind oldestXmin + txid_status +------------- + +(1 row) + +COMMIT; +BEGIN; +CREATE FUNCTION test_future_xid_status(bigint) +RETURNS void +LANGUAGE plpgsql +AS +$$ +BEGIN + PERFORM txid_status($1); + RAISE EXCEPTION 'didn''t ERROR at xid in the future as expected'; +EXCEPTION + WHEN invalid_parameter_value THEN + RAISE NOTICE 'Got expected error for xid in the future'; +END; +$$; +SELECT test_future_xid_status(:inprogress + 10000); +NOTICE: Got expected error for xid in the future + test_future_xid_status +------------------------ + +(1 row) + +ROLLBACK; diff --git a/src/test/singlenode_regress/expected/type_sanity.out b/src/test/singlenode_regress/expected/type_sanity.out new file mode 100644 index 00000000000..c4857834c6e --- /dev/null +++ b/src/test/singlenode_regress/expected/type_sanity.out @@ -0,0 +1,808 @@ +-- +-- TYPE_SANITY +-- Sanity checks for common errors in making type-related system tables: +-- pg_type, pg_class, pg_attribute, pg_range. +-- +-- None of the SELECTs here should ever find any matching entries, +-- so the expected output is easy to maintain ;-). +-- A test failure indicates someone messed up an entry in the system tables. +-- +-- NB: we assume the oidjoins test will have caught any dangling links, +-- that is OID or REGPROC fields that are not zero and do not match some +-- row in the linked-to table. However, if we want to enforce that a link +-- field can't be 0, we have to check it here. +-- **************** pg_type **************** +-- Look for illegal values in pg_type fields. +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typnamespace = 0 OR + (p1.typlen <= 0 AND p1.typlen != -1 AND p1.typlen != -2) OR + (p1.typtype not in ('b', 'c', 'd', 'e', 'p', 'r', 'm')) OR + NOT p1.typisdefined OR + (p1.typalign not in ('c', 's', 'i', 'd')) OR + (p1.typstorage not in ('p', 'x', 'e', 'm')); + oid | typname +-----+--------- +(0 rows) + +-- Look for "pass by value" types that can't be passed by value. +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typbyval AND + (p1.typlen != 1 OR p1.typalign != 'c') AND + (p1.typlen != 2 OR p1.typalign != 's') AND + (p1.typlen != 4 OR p1.typalign != 'i') AND + (p1.typlen != 8 OR p1.typalign != 'd'); + oid | typname +-----+--------- +(0 rows) + +-- Look for "toastable" types that aren't varlena. +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typstorage != 'p' AND + (p1.typbyval OR p1.typlen != -1); + oid | typname +-----+--------- +(0 rows) + +-- Look for complex types that do not have a typrelid entry, +-- or basic types that do. +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR + (p1.typtype != 'c' AND p1.typrelid != 0); + oid | typname +-----+--------- +(0 rows) + +-- Look for types that should have an array type but don't. +-- Generally anything that's not a pseudotype should have an array type. +-- However, we do have a small number of exceptions. +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typtype not in ('c','d','p') AND p1.typname NOT LIKE E'\\_%' + AND NOT EXISTS + (SELECT 1 FROM pg_type as p2 + WHERE p2.typname = ('_' || p1.typname)::name AND + p2.typelem = p1.oid and p1.typarray = p2.oid) +ORDER BY p1.oid; + oid | typname +------+------------------------------ + 194 | pg_node_tree + 3361 | pg_ndistinct + 3402 | pg_dependencies + 4600 | pg_brin_bloom_summary + 4601 | pg_brin_minmax_multi_summary + 5017 | pg_mcv_list +(6 rows) + +-- Make sure typarray points to a "true" array type of our own base +SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, + p2.typsubscript +FROM pg_type p1 LEFT JOIN pg_type p2 ON (p1.typarray = p2.oid) +WHERE p1.typarray <> 0 AND + (p2.oid IS NULL OR + p2.typsubscript <> 'array_subscript_handler'::regproc); + oid | basetype | arraytype | typsubscript +-----+----------+-----------+-------------- +(0 rows) + +-- Look for range types that do not have a pg_range entry +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typtype = 'r' AND + NOT EXISTS(SELECT 1 FROM pg_range r WHERE rngtypid = p1.oid); + oid | typname +-----+--------- +(0 rows) + +-- Look for range types whose typalign isn't sufficient +SELECT p1.oid, p1.typname, p1.typalign, p2.typname, p2.typalign +FROM pg_type as p1 + LEFT JOIN pg_range as r ON rngtypid = p1.oid + LEFT JOIN pg_type as p2 ON rngsubtype = p2.oid +WHERE p1.typtype = 'r' AND + (p1.typalign != (CASE WHEN p2.typalign = 'd' THEN 'd'::"char" + ELSE 'i'::"char" END) + OR p2.oid IS NULL); + oid | typname | typalign | typname | typalign +-----+---------+----------+---------+---------- +(0 rows) + +-- Text conversion routines must be provided. +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE (p1.typinput = 0 OR p1.typoutput = 0); + oid | typname +-----+--------- +(0 rows) + +-- Check for bogus typinput routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typinput = p2.oid AND NOT + ((p2.pronargs = 1 AND p2.proargtypes[0] = 'cstring'::regtype) OR + (p2.pronargs = 2 AND p2.proargtypes[0] = 'cstring'::regtype AND + p2.proargtypes[1] = 'oid'::regtype) OR + (p2.pronargs = 3 AND p2.proargtypes[0] = 'cstring'::regtype AND + p2.proargtypes[1] = 'oid'::regtype AND + p2.proargtypes[2] = 'int4'::regtype)); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Check for type of the variadic array parameter's elements. +-- provariadic should be ANYOID if the type of the last element is ANYOID, +-- ANYELEMENTOID if the type of the last element is ANYARRAYOID, +-- ANYCOMPATIBLEOID if the type of the last element is ANYCOMPATIBLEARRAYOID, +-- and otherwise the element type corresponding to the array type. +SELECT oid::regprocedure, provariadic::regtype, proargtypes::regtype[] +FROM pg_proc +WHERE provariadic != 0 +AND case proargtypes[array_length(proargtypes, 1)-1] + WHEN '"any"'::regtype THEN '"any"'::regtype + WHEN 'anyarray'::regtype THEN 'anyelement'::regtype + WHEN 'anycompatiblearray'::regtype THEN 'anycompatible'::regtype + ELSE (SELECT t.oid + FROM pg_type t + WHERE t.typarray = proargtypes[array_length(proargtypes, 1)-1]) + END != provariadic; + oid | provariadic | proargtypes +-----+-------------+------------- +(0 rows) + +-- Check that all and only those functions with a variadic type have +-- a variadic argument. +SELECT oid::regprocedure, proargmodes, provariadic +FROM pg_proc +WHERE (proargmodes IS NOT NULL AND 'v' = any(proargmodes)) + IS DISTINCT FROM + (provariadic != 0); + oid | proargmodes | provariadic +-----+-------------+------------- +(0 rows) + +-- As of 8.0, this check finds refcursor, which is borrowing +-- other types' I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typinput = p2.oid AND p1.typtype in ('b', 'p') AND NOT + (p1.typelem != 0 AND p1.typlen < 0) AND NOT + (p2.prorettype = p1.oid AND NOT p2.proretset) +ORDER BY 1; + oid | typname | oid | proname +------+-----------+-----+--------- + 1790 | refcursor | 46 | textin +(1 row) + +-- Varlena array types will point to array_in +-- Exception as of 8.1: int2vector and oidvector have their own I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typinput = p2.oid AND + (p1.typelem != 0 AND p1.typlen < 0) AND NOT + (p2.oid = 'array_in'::regproc) +ORDER BY 1; + oid | typname | oid | proname +-----+------------+-----+-------------- + 22 | int2vector | 40 | int2vectorin + 30 | oidvector | 54 | oidvectorin +(2 rows) + +-- Make sure typarray points to a varlena array type of our own base +SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, + p2.typelem, p2.typlen +FROM pg_type p1 LEFT JOIN pg_type p2 ON (p1.typarray = p2.oid) +WHERE p1.typarray <> 0 AND + (p2.oid IS NULL OR p2.typelem <> p1.oid OR p2.typlen <> -1); + oid | basetype | arraytype | typelem | typlen +-----+----------+-----------+---------+-------- +(0 rows) + +-- typinput routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typinput = p2.oid AND p2.provolatile NOT IN ('i', 's'); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Composites, domains, enums, multiranges, ranges should all use the same input routines +SELECT DISTINCT typtype, typinput +FROM pg_type AS p1 +WHERE p1.typtype not in ('b', 'p') +ORDER BY 1; + typtype | typinput +---------+--------------- + c | record_in + d | domain_in + e | enum_in + m | multirange_in + r | range_in +(5 rows) + +-- Check for bogus typoutput routines +-- As of 8.0, this check finds refcursor, which is borrowing +-- other types' I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typoutput = p2.oid AND p1.typtype in ('b', 'p') AND NOT + (p2.pronargs = 1 AND + (p2.proargtypes[0] = p1.oid OR + (p2.oid = 'array_out'::regproc AND + p1.typelem != 0 AND p1.typlen = -1))) +ORDER BY 1; + oid | typname | oid | proname +------+-----------+-----+--------- + 1790 | refcursor | 47 | textout +(1 row) + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typoutput = p2.oid AND NOT + (p2.prorettype = 'cstring'::regtype AND NOT p2.proretset); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- typoutput routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typoutput = p2.oid AND p2.provolatile NOT IN ('i', 's'); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Composites, enums, multiranges, ranges should all use the same output routines +SELECT DISTINCT typtype, typoutput +FROM pg_type AS p1 +WHERE p1.typtype not in ('b', 'd', 'p') +ORDER BY 1; + typtype | typoutput +---------+---------------- + c | record_out + e | enum_out + m | multirange_out + r | range_out +(4 rows) + +-- Domains should have same typoutput as their base types +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type AS p1 LEFT JOIN pg_type AS p2 ON p1.typbasetype = p2.oid +WHERE p1.typtype = 'd' AND p1.typoutput IS DISTINCT FROM p2.typoutput; + oid | typname | oid | typname +-----+---------+-----+--------- +(0 rows) + +-- Check for bogus typreceive routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typreceive = p2.oid AND NOT + ((p2.pronargs = 1 AND p2.proargtypes[0] = 'internal'::regtype) OR + (p2.pronargs = 2 AND p2.proargtypes[0] = 'internal'::regtype AND + p2.proargtypes[1] = 'oid'::regtype) OR + (p2.pronargs = 3 AND p2.proargtypes[0] = 'internal'::regtype AND + p2.proargtypes[1] = 'oid'::regtype AND + p2.proargtypes[2] = 'int4'::regtype)); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- As of 7.4, this check finds refcursor, which is borrowing +-- other types' I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typreceive = p2.oid AND p1.typtype in ('b', 'p') AND NOT + (p1.typelem != 0 AND p1.typlen < 0) AND NOT + (p2.prorettype = p1.oid AND NOT p2.proretset) +ORDER BY 1; + oid | typname | oid | proname +------+-----------+------+---------- + 1790 | refcursor | 2414 | textrecv +(1 row) + +-- Varlena array types will point to array_recv +-- Exception as of 8.1: int2vector and oidvector have their own I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typreceive = p2.oid AND + (p1.typelem != 0 AND p1.typlen < 0) AND NOT + (p2.oid = 'array_recv'::regproc) +ORDER BY 1; + oid | typname | oid | proname +-----+------------+------+---------------- + 22 | int2vector | 2410 | int2vectorrecv + 30 | oidvector | 2420 | oidvectorrecv +(2 rows) + +-- Array types should have same typdelim as their element types +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type p1, pg_type p2 +WHERE p1.typelem = p2.oid and p1.typdelim != p2.typdelim + AND p1.typname like E'\\_%'; + oid | typname | oid | typname +-----+---------+-----+--------- +(0 rows) + +-- Suspicious if typreceive doesn't take same number of args as typinput +SELECT p1.oid, p1.typname, p2.oid, p2.proname, p3.oid, p3.proname +FROM pg_type AS p1, pg_proc AS p2, pg_proc AS p3 +WHERE p1.typinput = p2.oid AND p1.typreceive = p3.oid AND + p2.pronargs != p3.pronargs; + oid | typname | oid | proname | oid | proname +-----+---------+-----+---------+-----+--------- +(0 rows) + +-- typreceive routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typreceive = p2.oid AND p2.provolatile NOT IN ('i', 's'); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Composites, domains, enums, multiranges, ranges should all use the same receive routines +SELECT DISTINCT typtype, typreceive +FROM pg_type AS p1 +WHERE p1.typtype not in ('b', 'p') +ORDER BY 1; + typtype | typreceive +---------+----------------- + c | record_recv + d | domain_recv + e | enum_recv + m | multirange_recv + r | range_recv +(5 rows) + +-- Check for bogus typsend routines +-- As of 7.4, this check finds refcursor, which is borrowing +-- other types' I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typsend = p2.oid AND p1.typtype in ('b', 'p') AND NOT + (p2.pronargs = 1 AND + (p2.proargtypes[0] = p1.oid OR + (p2.oid = 'array_send'::regproc AND + p1.typelem != 0 AND p1.typlen = -1))) +ORDER BY 1; + oid | typname | oid | proname +------+-----------+------+---------- + 1790 | refcursor | 2415 | textsend +(1 row) + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typsend = p2.oid AND NOT + (p2.prorettype = 'bytea'::regtype AND NOT p2.proretset); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- typsend routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typsend = p2.oid AND p2.provolatile NOT IN ('i', 's'); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Composites, enums, multiranges, ranges should all use the same send routines +SELECT DISTINCT typtype, typsend +FROM pg_type AS p1 +WHERE p1.typtype not in ('b', 'd', 'p') +ORDER BY 1; + typtype | typsend +---------+----------------- + c | record_send + e | enum_send + m | multirange_send + r | range_send +(4 rows) + +-- Domains should have same typsend as their base types +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type AS p1 LEFT JOIN pg_type AS p2 ON p1.typbasetype = p2.oid +WHERE p1.typtype = 'd' AND p1.typsend IS DISTINCT FROM p2.typsend; + oid | typname | oid | typname +-----+---------+-----+--------- +(0 rows) + +-- Check for bogus typmodin routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typmodin = p2.oid AND NOT + (p2.pronargs = 1 AND + p2.proargtypes[0] = 'cstring[]'::regtype AND + p2.prorettype = 'int4'::regtype AND NOT p2.proretset); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- typmodin routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typmodin = p2.oid AND p2.provolatile NOT IN ('i', 's'); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Check for bogus typmodout routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typmodout = p2.oid AND NOT + (p2.pronargs = 1 AND + p2.proargtypes[0] = 'int4'::regtype AND + p2.prorettype = 'cstring'::regtype AND NOT p2.proretset); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- typmodout routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typmodout = p2.oid AND p2.provolatile NOT IN ('i', 's'); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- Array types should have same typmodin/out as their element types +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type AS p1, pg_type AS p2 +WHERE p1.typelem = p2.oid AND NOT + (p1.typmodin = p2.typmodin AND p1.typmodout = p2.typmodout); + oid | typname | oid | typname +-----+---------+-----+--------- +(0 rows) + +-- Array types should have same typdelim as their element types +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type AS p1, pg_type AS p2 +WHERE p1.typarray = p2.oid AND NOT (p1.typdelim = p2.typdelim); + oid | typname | oid | typname +-----+---------+-----+--------- +(0 rows) + +-- Look for array types whose typalign isn't sufficient +SELECT p1.oid, p1.typname, p1.typalign, p2.typname, p2.typalign +FROM pg_type AS p1, pg_type AS p2 +WHERE p1.typarray = p2.oid AND + p2.typalign != (CASE WHEN p1.typalign = 'd' THEN 'd'::"char" + ELSE 'i'::"char" END); + oid | typname | typalign | typname | typalign +-----+---------+----------+---------+---------- +(0 rows) + +-- Check for typelem set without a handler +SELECT p1.oid, p1.typname, p1.typelem +FROM pg_type AS p1 +WHERE p1.typelem != 0 AND p1.typsubscript = 0; + oid | typname | typelem +-----+---------+--------- +(0 rows) + +-- Check for misuse of standard subscript handlers +SELECT p1.oid, p1.typname, + p1.typelem, p1.typlen, p1.typbyval +FROM pg_type AS p1 +WHERE p1.typsubscript = 'array_subscript_handler'::regproc AND NOT + (p1.typelem != 0 AND p1.typlen = -1 AND NOT p1.typbyval); + oid | typname | typelem | typlen | typbyval +-----+---------+---------+--------+---------- +(0 rows) + +SELECT p1.oid, p1.typname, + p1.typelem, p1.typlen, p1.typbyval +FROM pg_type AS p1 +WHERE p1.typsubscript = 'raw_array_subscript_handler'::regproc AND NOT + (p1.typelem != 0 AND p1.typlen > 0 AND NOT p1.typbyval); + oid | typname | typelem | typlen | typbyval +-----+---------+---------+--------+---------- +(0 rows) + +-- Check for bogus typanalyze routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typanalyze = p2.oid AND NOT + (p2.pronargs = 1 AND + p2.proargtypes[0] = 'internal'::regtype AND + p2.prorettype = 'bool'::regtype AND NOT p2.proretset); + oid | typname | oid | proname +-----+---------+-----+--------- +(0 rows) + +-- there does not seem to be a reason to care about volatility of typanalyze +-- domains inherit their base type's typanalyze +SELECT d.oid, d.typname, d.typanalyze, t.oid, t.typname, t.typanalyze +FROM pg_type d JOIN pg_type t ON d.typbasetype = t.oid +WHERE d.typanalyze != t.typanalyze; + oid | typname | typanalyze | oid | typname | typanalyze +-----+---------+------------+-----+---------+------------ +(0 rows) + +-- range_typanalyze should be used for all and only range types +-- (but exclude domains, which we checked above) +SELECT t.oid, t.typname, t.typanalyze +FROM pg_type t LEFT JOIN pg_range r on t.oid = r.rngtypid +WHERE t.typbasetype = 0 AND + (t.typanalyze = 'range_typanalyze'::regproc) != (r.rngtypid IS NOT NULL); + oid | typname | typanalyze +-----+---------+------------ +(0 rows) + +-- array_typanalyze should be used for all and only array types +-- (but exclude domains, which we checked above) +-- As of 9.2 this finds int2vector and oidvector, which are weird anyway +SELECT t.oid, t.typname, t.typanalyze +FROM pg_type t +WHERE t.typbasetype = 0 AND + (t.typanalyze = 'array_typanalyze'::regproc) != + (t.typsubscript = 'array_subscript_handler'::regproc) +ORDER BY 1; + oid | typname | typanalyze +-----+------------+------------ + 22 | int2vector | - + 30 | oidvector | - +(2 rows) + +-- **************** pg_class **************** +-- Look for illegal values in pg_class fields +SELECT p1.oid, p1.relname +FROM pg_class as p1 +WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR + relpersistence NOT IN ('p', 'u', 't') OR + relreplident NOT IN ('d', 'n', 'f', 'i'); + oid | relname +-----+--------- +(0 rows) + +-- All tables and indexes should have an access method. +SELECT p1.oid, p1.relname +FROM pg_class as p1 +WHERE p1.relkind NOT IN ('S', 'v', 'f', 'c') and + p1.relam = 0; + oid | relname +-----+--------- +(0 rows) + +-- Conversely, sequences, views, types shouldn't have them +SELECT p1.oid, p1.relname +FROM pg_class as p1 +WHERE p1.relkind IN ('S', 'v', 'f', 'c') and + p1.relam != 0; + oid | relname +-----+--------- +(0 rows) + +-- Indexes should have AMs of type 'i' +SELECT pc.oid, pc.relname, pa.amname, pa.amtype +FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) +WHERE pc.relkind IN ('i') and + pa.amtype != 'i'; + oid | relname | amname | amtype +-----+---------+--------+-------- +(0 rows) + +-- Tables, matviews etc should have AMs of type 't' +SELECT pc.oid, pc.relname, pa.amname, pa.amtype +FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) +WHERE pc.relkind IN ('r', 't', 'm') and + pa.amtype != 't'; + oid | relname | amname | amtype +-----+---------+--------+-------- +(0 rows) + +-- **************** pg_attribute **************** +-- Look for illegal values in pg_attribute fields +SELECT p1.attrelid, p1.attname +FROM pg_attribute as p1 +WHERE p1.attrelid = 0 OR p1.atttypid = 0 OR p1.attnum = 0 OR + p1.attcacheoff != -1 OR p1.attinhcount < 0 OR + (p1.attinhcount = 0 AND NOT p1.attislocal); + attrelid | attname +----------+--------- +(0 rows) + +-- Cross-check attnum against parent relation +SELECT p1.attrelid, p1.attname, p2.oid, p2.relname +FROM pg_attribute AS p1, pg_class AS p2 +WHERE p1.attrelid = p2.oid AND p1.attnum > p2.relnatts; + attrelid | attname | oid | relname +----------+---------+-----+--------- +(0 rows) + +-- Detect missing pg_attribute entries: should have as many non-system +-- attributes as parent relation expects +SELECT p1.oid, p1.relname +FROM pg_class AS p1 +WHERE p1.relnatts != (SELECT count(*) FROM pg_attribute AS p2 + WHERE p2.attrelid = p1.oid AND p2.attnum > 0); + oid | relname +-----+--------- +(0 rows) + +-- Cross-check against pg_type entry +-- NOTE: we allow attstorage to be 'plain' even when typstorage is not; +-- this is mainly for toast tables. +-- UNDONE: Turn this off until we can figure out why the new system columns cause a bunch of rows to be generated here??? +-- SELECT p1.attrelid, p1.attname, p2.oid, p2.typname +-- FROM pg_attribute AS p1, pg_type AS p2 +-- WHERE p1.atttypid = p2.oid AND +-- (p1.attlen != p2.typlen OR +-- p1.attalign != p2.typalign OR +-- p1.attbyval != p2.typbyval OR +-- (p1.attstorage != p2.typstorage AND p1.attstorage != 'p')); +SELECT p1.attrelid, p1.attname, p2.oid, p2.typname +FROM pg_attribute AS p1, pg_type AS p2 +WHERE p1.atttypid = p2.oid AND + (p1.attlen != p2.typlen OR + p1.attalign != p2.typalign OR + p1.attbyval != p2.typbyval OR + (p1.attstorage != p2.typstorage AND p1.attstorage != 'p')); + attrelid | attname | oid | typname +----------+---------+-----+--------- +(0 rows) + +-- **************** pg_range **************** +-- Look for illegal values in pg_range fields. +SELECT p1.rngtypid, p1.rngsubtype +FROM pg_range as p1 +WHERE p1.rngtypid = 0 OR p1.rngsubtype = 0 OR p1.rngsubopc = 0; + rngtypid | rngsubtype +----------+------------ +(0 rows) + +-- rngcollation should be specified iff subtype is collatable +SELECT p1.rngtypid, p1.rngsubtype, p1.rngcollation, t.typcollation +FROM pg_range p1 JOIN pg_type t ON t.oid = p1.rngsubtype +WHERE (rngcollation = 0) != (typcollation = 0); + rngtypid | rngsubtype | rngcollation | typcollation +----------+------------+--------------+-------------- +(0 rows) + +-- opclass had better be a btree opclass accepting the subtype. +-- We must allow anyarray matches, cf IsBinaryCoercible() +SELECT p1.rngtypid, p1.rngsubtype, o.opcmethod, o.opcname +FROM pg_range p1 JOIN pg_opclass o ON o.oid = p1.rngsubopc +WHERE o.opcmethod != 403 OR + ((o.opcintype != p1.rngsubtype) AND NOT + (o.opcintype = 'pg_catalog.anyarray'::regtype AND + EXISTS(select 1 from pg_catalog.pg_type where + oid = p1.rngsubtype and typelem != 0 and + typsubscript = 'array_subscript_handler'::regproc))); + rngtypid | rngsubtype | opcmethod | opcname +----------+------------+-----------+--------- +(0 rows) + +-- canonical function, if any, had better match the range type +SELECT p1.rngtypid, p1.rngsubtype, p.proname +FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngcanonical +WHERE pronargs != 1 OR proargtypes[0] != rngtypid OR prorettype != rngtypid; + rngtypid | rngsubtype | proname +----------+------------+--------- +(0 rows) + +-- subdiff function, if any, had better match the subtype +SELECT p1.rngtypid, p1.rngsubtype, p.proname +FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngsubdiff +WHERE pronargs != 2 + OR proargtypes[0] != rngsubtype OR proargtypes[1] != rngsubtype + OR prorettype != 'pg_catalog.float8'::regtype; + rngtypid | rngsubtype | proname +----------+------------+--------- +(0 rows) + +-- every range should have a valid multirange +SELECT p1.rngtypid, p1.rngsubtype, p1.rngmultitypid +FROM pg_range p1 +WHERE p1.rngmultitypid IS NULL OR p1.rngmultitypid = 0; + rngtypid | rngsubtype | rngmultitypid +----------+------------+--------------- +(0 rows) + +-- Create a table that holds all the known in-core data types and leave it +-- around so as pg_upgrade is able to test their binary compatibility. +CREATE TABLE tab_core_types AS SELECT + '1 + 2i'::complex, + '(11,12)'::point, + '(1,1),(2,2)'::line, + '((11,11),(12,12))'::lseg, + '((11,11),(13,13))'::box, + '((11,12),(13,13),(14,14))'::path AS openedpath, + '[(11,12),(13,13),(14,14)]'::path AS closedpath, + '((11,12),(13,13),(14,14))'::polygon, + '1,1,1'::circle, + 'today'::date, + 'now'::time, + 'now'::timestamp, + 'now'::timetz, + 'now'::timestamptz, + '12 seconds'::interval, + '{"reason":"because"}'::json, + '{"when":"now"}'::jsonb, + '$.a[*] ? (@ > 2)'::jsonpath, + '127.0.0.1'::inet, + '127.0.0.0/8'::cidr, + '00:01:03:86:1c:ba'::macaddr8, + '00:01:03:86:1c:ba'::macaddr, + 2::int2, 4::int4, 8::int8, + 4::float4, '8'::float8, pi()::numeric, + 'foo'::"char", + 'c'::bpchar, + 'abc'::varchar, + 'name'::name, + 'txt'::text, + true::bool, + E'\\xDEADBEEF'::bytea, + B'10001'::bit, + B'10001'::varbit AS varbit, + '12.34'::money, + 'abc'::refcursor, + '1 2'::int2vector, + '1 2'::oidvector, + format('%I=UC/%I', USER, USER)::aclitem AS aclitem, + 'a fat cat sat on a mat and ate a fat rat'::tsvector, + 'fat & rat'::tsquery, + 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'::uuid, + '11'::xid8, + 'pg_class'::regclass, + 'regtype'::regtype type, + 'pg_monitor'::regrole, + 'pg_class'::regclass::oid, + '(1,1)'::tid, '2'::xid, '3'::cid, + '10:20:10,14,15'::txid_snapshot, + '10:20:10,14,15'::pg_snapshot, + '16/B374D848'::pg_lsn, + 1::information_schema.cardinal_number, + 'l'::information_schema.character_data, + 'n'::information_schema.sql_identifier, + 'now'::information_schema.time_stamp, + 'YES'::information_schema.yes_or_no, + 'venus'::planets, + 'i16'::insenum, + '(1,2)'::int4range, '{(1,2)}'::int4multirange, + '(3,4)'::int8range, '{(3,4)}'::int8multirange, + '(1,2)'::float8range, '{(1,2)}'::float8multirange, + '(3,4)'::numrange, '{(3,4)}'::nummultirange, + '(a,b)'::textrange, '{(a,b)}'::textmultirange, + '(12.34, 56.78)'::cashrange, '{(12.34, 56.78)}'::cashmultirange, + '(2020-01-02, 2021-02-03)'::daterange, + '{(2020-01-02, 2021-02-03)}'::datemultirange, + '(2020-01-02 03:04:05, 2021-02-03 06:07:08)'::tsrange, + '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tsmultirange, + '(2020-01-02 03:04:05, 2021-02-03 06:07:08)'::tstzrange, + '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tstzmultirange, + arrayrange(ARRAY[1,2], ARRAY[2,1]), + arraymultirange(arrayrange(ARRAY[1,2], ARRAY[2,1])); +-- Sanity check on the previous table, checking that all core types are +-- included in this table. +SELECT oid, typname, typtype, typelem, typarray, typarray + FROM pg_type t + WHERE typtype NOT IN ('p', 'c') AND + -- reg* types cannot be pg_upgraded, so discard them. + oid != ALL(ARRAY['regproc', 'regprocedure', 'regoper', + 'regoperator', 'regconfig', 'regdictionary', + 'regnamespace', 'regcollation']::regtype[]) AND + -- Discard types that do not accept input values as these cannot be + -- tested easily. + -- Note: XML might be disabled at compile-time. + oid != ALL(ARRAY['gtsvector', 'pg_node_tree', + 'pg_ndistinct', 'pg_dependencies', 'pg_mcv_list', + 'pg_brin_bloom_summary', + 'pg_brin_minmax_multi_summary', 'xml']::regtype[]) AND + -- GPDB_14_MERGE_FIXME: Discard the GP-specific type gp_hyperloglog_estimator? + oid != 'gp_hyperloglog_estimator'::regtype AND + -- Discard arrays. + NOT EXISTS (SELECT 1 FROM pg_type u WHERE u.typarray = t.oid) + -- Exclude everything from the table created above. This checks + -- that no in-core types are missing in tab_core_types. + AND NOT EXISTS (SELECT 1 + FROM pg_attribute a + WHERE a.atttypid=t.oid AND + a.attnum > 0 AND + a.attrelid='tab_core_types'::regclass); + oid | typname | typtype | typelem | typarray | typarray +-----+---------+---------+---------+----------+---------- +(0 rows) + diff --git a/src/test/singlenode_regress/expected/typed_table.out b/src/test/singlenode_regress/expected/typed_table.out new file mode 100644 index 00000000000..2e47ecbcf50 --- /dev/null +++ b/src/test/singlenode_regress/expected/typed_table.out @@ -0,0 +1,133 @@ +CREATE TABLE ttable1 OF nothing; +ERROR: type "nothing" does not exist +CREATE TYPE person_type AS (id int, name text); +CREATE TABLE persons OF person_type; +CREATE TABLE IF NOT EXISTS persons OF person_type; +NOTICE: relation "persons" already exists, skipping +SELECT * FROM persons; + id | name +----+------ +(0 rows) + +\d persons + Table "public.persons" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | | + name | text | | | +Typed table of type: person_type + +CREATE FUNCTION get_all_persons() RETURNS SETOF person_type +LANGUAGE SQL +AS $$ + SELECT * FROM persons; +$$; +SELECT * FROM get_all_persons(); + id | name +----+------ +(0 rows) + +-- certain ALTER TABLE operations on typed tables are not allowed +ALTER TABLE persons ADD COLUMN comment text; +ERROR: cannot add column to typed table +ALTER TABLE persons DROP COLUMN name; +ERROR: cannot drop column from typed table +ALTER TABLE persons RENAME COLUMN id TO num; +ERROR: cannot rename column of typed table +ALTER TABLE persons ALTER COLUMN name TYPE varchar; +ERROR: cannot alter column type of typed table +CREATE TABLE stuff (id int); +ALTER TABLE persons INHERIT stuff; +ERROR: cannot change inheritance of typed table +CREATE TABLE personsx OF person_type (myname WITH OPTIONS NOT NULL); -- error +ERROR: column "myname" does not exist +CREATE TABLE persons2 OF person_type ( + id WITH OPTIONS PRIMARY KEY, + UNIQUE (name) +); +\d persons2 + Table "public.persons2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | + name | text | | | +Indexes: + "persons2_pkey" PRIMARY KEY, btree (id) + "persons2_name_key" UNIQUE CONSTRAINT, btree (name) +Typed table of type: person_type + +CREATE TABLE persons3 OF person_type ( + PRIMARY KEY (id), + name WITH OPTIONS DEFAULT '' +); +\d persons3 + Table "public.persons3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+---------- + id | integer | | not null | + name | text | | | ''::text +Indexes: + "persons3_pkey" PRIMARY KEY, btree (id) +Typed table of type: person_type + +CREATE TABLE persons4 OF person_type ( + name WITH OPTIONS NOT NULL, + name WITH OPTIONS DEFAULT '' -- error, specified more than once +); +ERROR: column "name" specified more than once +DROP TYPE person_type RESTRICT; +ERROR: cannot drop type person_type because other objects depend on it +DETAIL: table persons depends on type person_type +function get_all_persons() depends on type person_type +table persons2 depends on type person_type +table persons3 depends on type person_type +HINT: Use DROP ... CASCADE to drop the dependent objects too. +DROP TYPE person_type CASCADE; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to table persons +drop cascades to function get_all_persons() +drop cascades to table persons2 +drop cascades to table persons3 +CREATE TABLE persons5 OF stuff; -- only CREATE TYPE AS types may be used +ERROR: type stuff is not a composite type +DROP TABLE stuff; +-- implicit casting +CREATE TYPE person_type AS (id int, name text); +CREATE TABLE persons OF person_type; +INSERT INTO persons VALUES (1, 'test'); +CREATE FUNCTION namelen(person_type) RETURNS int LANGUAGE SQL AS $$ SELECT length($1.name) $$; +SELECT id, namelen(persons) FROM persons; + id | namelen +----+--------- + 1 | 4 +(1 row) + +CREATE TABLE persons2 OF person_type ( + id WITH OPTIONS PRIMARY KEY, + UNIQUE (name) +); +\d persons2 + Table "public.persons2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | + name | text | | | +Indexes: + "persons2_pkey" PRIMARY KEY, btree (id) + "persons2_name_key" UNIQUE CONSTRAINT, btree (name) +Typed table of type: person_type + +CREATE TABLE persons3 OF person_type ( + PRIMARY KEY (id), + name NOT NULL DEFAULT '' +); +\d persons3 + Table "public.persons3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+---------- + id | integer | | not null | + name | text | | not null | ''::text +Indexes: + "persons3_pkey" PRIMARY KEY, btree (id) +Typed table of type: person_type + diff --git a/src/test/singlenode_regress/expected/uao_compaction/alter_table_analyze.out b/src/test/singlenode_regress/expected/uao_compaction/alter_table_analyze.out new file mode 100644 index 00000000000..ecb99bd9ce1 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/alter_table_analyze.out @@ -0,0 +1,98 @@ +-- @Description Checks analyze and drop column interaction +CREATE TABLE ck_ct_ao_analyze1( +text_col text, +bigint_col bigint, +char_vary_col character varying(30), +numeric_col numeric, +int_col int4, +float_col float4, +int_array_col int[], +drop_col numeric, +before_rename_col int4, +change_datatype_col numeric, +a_ts_without timestamp without time zone, +b_ts_with timestamp with time zone, +date_column date) with (appendonly=true); +INSERT INTO ck_ct_ao_analyze1 values ('0_zero', 0, '0_zero', 0, 0, 0, '{0}', 0, 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000'); +INSERT INTO ck_ct_ao_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001'); +INSERT INTO ck_ct_ao_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002'); +select count(*) AS only_visi_tups_ins from ck_ct_ao_analyze1; + only_visi_tups_ins +-------------------- + 3 +(1 row) + +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_ins from ck_ct_ao_analyze1; + invisi_and_visi_tups_ins +-------------------------- + 3 +(1 row) + +set gp_select_invisible = false; +update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '0_zero'; +select count(*) AS only_visi_tups_upd from ck_ct_ao_analyze1; + only_visi_tups_upd +-------------------- + 3 +(1 row) + +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_upd from ck_ct_ao_analyze1; + invisi_and_visi_tups_upd +-------------------------- + 4 +(1 row) + +set gp_select_invisible = false; +delete from ck_ct_ao_analyze1 where int_col = 2; +select count(*) AS only_visi_tups_del from ck_ct_ao_analyze1; + only_visi_tups_del +-------------------- + 2 +(1 row) + +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_del from ck_ct_ao_analyze1; + invisi_and_visi_tups_del +-------------------------- + 4 +(1 row) + +set gp_select_invisible = false; +-- +ALTER TABLE ck_ct_ao_analyze1 ADD COLUMN added_col character varying(30) default 'test_value'; +ALTER TABLE ck_ct_ao_analyze1 DROP COLUMN drop_col ; +ALTER TABLE ck_ct_ao_analyze1 RENAME COLUMN before_rename_col TO after_rename_col; +ALTER TABLE ck_ct_ao_analyze1 ALTER COLUMN change_datatype_col TYPE int4; +-- start_ignore +ALTER TABLE ck_ct_ao_analyze1 set with ( reorganize='true'); +-- end_ignore +-- +-- +INSERT INTO ck_ct_ao_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001'); +INSERT INTO ck_ct_ao_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002'); +INSERT INTO ck_ct_ao_analyze1 values ('3_zero', 3, '3_zero', 0, 0, 0, '{0}', 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000'); +update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '1_zero'; +ANALYZE ck_ct_ao_analyze1; +-- +-- +ALTER TABLE ck_ct_ao_analyze1 ADD COLUMN added_col_one_more character varying(30) default 'test_value'; +ALTER TABLE ck_ct_ao_analyze1 DROP COLUMN added_col ; +ALTER TABLE ck_ct_ao_analyze1 RENAME COLUMN after_rename_col TO after_rename_col_one_more_time; +ALTER TABLE ck_ct_ao_analyze1 ALTER COLUMN change_datatype_col TYPE int8; +-- start_ignore +ALTER TABLE ck_ct_ao_analyze1 set with ( reorganize='true'); +-- end_ignore +update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '1_zero'; +ANALYZE ck_ct_ao_analyze1; +select * from ck_ct_ao_analyze1; + text_col | bigint_col | char_vary_col | numeric_col | int_col | float_col | int_array_col | after_rename_col_one_more_time | change_datatype_col | a_ts_without | b_ts_with | date_column | added_col_one_more +----------+------------+---------------+-------------+---------+-----------+---------------+--------------------------------+---------------------+--------------------------+------------------------------+-------------+-------------------- + 1_zero | 3 | 1_zero | 1 | 1 | 1 | {1} | 1 | 1 | Wed Oct 19 10:23:54 2005 | Wed Oct 19 01:23:54 2005 PDT | 01-01-2001 | test_value + 1_zero | 3 | 1_zero | 1 | 1 | 1 | {1} | 1 | 1 | Wed Oct 19 10:23:54 2005 | Wed Oct 19 01:23:54 2005 PDT | 01-01-2001 | test_value + 0_zero | 1 | 0_zero | 0 | 0 | 0 | {0} | 0 | 0 | Tue Oct 19 10:23:54 2004 | Tue Oct 19 01:23:54 2004 PDT | 01-01-2000 | test_value + 2_zero | 2 | 2_zero | 2 | 2 | 2 | {2} | 2 | 2 | Thu Oct 19 10:23:54 2006 | Thu Oct 19 01:23:54 2006 PDT | 01-01-2002 | test_value + 3_zero | 3 | 3_zero | 0 | 0 | 0 | {0} | 0 | 0 | Tue Oct 19 10:23:54 2004 | Tue Oct 19 01:23:54 2004 PDT | 01-01-2000 | test_value +(5 rows) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/basic.out b/src/test/singlenode_regress/expected/uao_compaction/basic.out new file mode 100644 index 00000000000..2cae958faa7 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/basic.out @@ -0,0 +1,30 @@ +-- @Description Basic lazy vacuum +CREATE TABLE uao_basic (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO uao_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i; +INSERT INTO uao_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i; +ANALYZE uao_basic; +DELETE FROM uao_basic WHERE a < 4; +SELECT COUNT(*) FROM uao_basic; + count +------- + 14 +(1 row) + +VACUUM uao_basic; +-- check if we get the same result afterwards +SELECT COUNT(*) FROM uao_basic; + count +------- + 14 +(1 row) + +-- check if we can still insert into the relation +INSERT INTO uao_basic VALUES (11, 11); +SELECT COUNT(*) FROM uao_basic; + count +------- + 15 +(1 row) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/delete_toast.out b/src/test/singlenode_regress/expected/uao_compaction/delete_toast.out new file mode 100644 index 00000000000..762476bea57 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/delete_toast.out @@ -0,0 +1,7 @@ +-- @Description Checkes the deletion and vacuuming of toast values +-- Create a table with toasted values. +CREATE TABLE uao_delete_toast (a INT, b INT, c VARCHAR) WITH (appendonly=true); +CREATE INDEX uao_delete_toast_index ON uao_delete_toast(b); +INSERT INTO uao_delete_toast SELECT i as a, 1 as b, i::text || '0W0bTHVHn2es6Ga9YumoV/cat/CW8jglG+DjaLT7ewvMj5IWaiGz2/3eP5fLTxyzrm6Bv8kxiYGSt5hqM38XLKXRgYwvFnnKfIW/ZMJbkjlOeXQdse+sCQAobQX0+wrCBycwsMjVn6kgm9QLCxrQ96Cjx8l2nx/xr1+ekc9o2i24+faKAgiQE9DQKEAbAt3wMB/1SuiG9cZaJH6ASsLhSMq63KyjNse1c67o+sbJg6pxX5cftM0iV6DciVHU5rhALosKT4boil5+tfVmU+7r2aTWC1XK+nneNfVrmiQe3AU7iQgb/YU+7R+kgrirPv6Y1MF9BoXxih2jJ085E/EE7NQ8RwHm1UsTYUSyFpwdSg2Y8F06UPyEnPkuZhbqWIiSDMES4L7tz8YaGkYr5b69bUuKh5GkPDxU4mj0wbEA5jZDGT+a1Qgb9Tjx0/bRqI1Gd2RDmmLd3ZktSDsQ+APk8bgwZ5epE694KdsNBS5UsThRVwsOG9yNIEVjsTk3Moy59NIJcO1PZS48Q1GEdZTTdUYVWqqCpvJdSUtYg2kEuC/QfV9DTEuDqQqIdKchPdmLw//FoFSna77goKFIK2k1DkFPs3DDQDHPXtfXNQ9zgKMWOzKWxQrkDP4VA5NBsAM3IRpSiY4h1muXpejWt/2NiLo8PP7ZYgFXnSQYGzZsJepRdX0hCV6LWedzIf8fWYnCglKY0Ah4Cb13d0Jvviz4wQMATi4HcFEPewrhSsjWGA0cJZcn/AhCX4MgZIkMqXJvvnAjaXxkIfFE86YtRdP9S8L3sPZLO9VaNONsQrS4v5Md1SAY24d3GenGHEsuH3Tu1QJHYYQLe7juYnZyP71gX56bOAiECcaN9kerb+VQVX8gTvEI4LOIlF9dwrc3FuDaApO/XjKjffu5TXtEAgeRvp8O3iad4/aUo0MeWsD/dFFOQYGZpAGw5wA8bJMr46rSi6LJf3fVWwi3/sGvqDeiBCotisDsyfr5VrZpzQAkrggkB+L1eFm6bvRxH6w5lc8tX3ppjsrsEwt6qSro6qdZ1ho5mtT0CV/mKh+YaVsRaVOXxbRTSBQOqxtfWhjCWvncPcYqJBylRlzy98aWR871suYXPWLW2bxXSxC9PqEiz7HMXpNhjboLKOmMPeMcPZTE6Tgp/wRlyTdemhocEZEZWDpm3XQamOQ9kiwg1mqHwSjGpipFjHun0PQC+J2k+InGj3gODOGU4f7AD87wuM875GsbSYk+NDonfgkBkUPfHNLONF8ft3iZ42YsZghvzSqDIMepTJs9w8ITZ0aCfsQ9swHLK1larLLkQ/9m/wgBUXMNDBrZUZkiQQVGu67Tnmg8vZkv9NNVbHL03HLZsCMi2oI0auUdzCBd4+wyQ+97ukgLso3hAQLschExEQJcphaRy9n3T1WRiRETGd+Z7Yd90Ii8ePeyPp67itRHzKw4eAli/nCBiOVTSkWbtvLaEXN7/s+auJ/JzFKbXzwlDbIHmxLflxlSo03Gijb7aUnjIvyctyHenbTZGFTy2pw1YNJaKanEiPtK7CkDP/3eTlORS2sA9WyJATswpdqDQIhLBIrmxhTtSEvwwKYRFr35ZKMQ1P4STrjblkw+i2ZEh1XfOxhSH7sfEToNqOUCPO0Tdh4emPNoSaow8vha/YxpSZk7VaqyUr8ig5s9nmVa1Zw/w3kdalyfJQem+ETWfNB+3eBCjXSQhvL+J/0uQ973Na2G8+9+R2kh2ZIWlnjW2YNGoyu6z4xXvsxfo6V+Czz+UYFKYJjZfoapfl3On3zGmRXBjy6KJIIOZ948WIxc8q0dnJYjKLluR0u8ikz03qlDb9Fce2tzRh9TW48BnjGCfSp8o8+SJc8MHBnef6OgYLCtjnBNXklJpLBBEzQJujLV87Z+Gz5p56ZiIsd52sEU2x9Ro9roDtkpKgGQeUN0z/ap4ZKC7k4PxmUyXPTe0gi+sBM1yf13HvDN3c69bBg8RnaC8mML7qGStBtSv294OwxZ1Ap0/JgmuiwX5u8CnQ1q0TPFV7MzVvDCLYMlsiY+du2yFYLTrcZPmy6MLLT5NtlCovkaD+Am3vdw7xqOVEUGaatr60Dm3ynL49BbGBH930LcUz4PMOEaoH8OyYXryR7hObeRR5EaQC7ekZd9iZIllZxdL0HoJYWl95AgPnS5vPjYYZFsW80zmxEorByolcNxOtf2sR8Ffz0T+iyvMXx2CksvBZzy/yAhXQZ0ZkUGgqENH0IltJq4HALvX9AkQow46hhZ8kjB7kCrhXTVM4+iUrYfoAqzbXVSsNhXTcoun8The7RTZUWwKOLQ3tehCAtCd6rJ0oRnsopRjUGDEmaboq+GVLk7StgZ44WHVvr+bp1qVK3pNmyk7h5xbO28ECJETrZ2hLMGEn6xO4e0hI3EAXo9nsWDB8Hoqfz70wyTGa5L3L04JnVJoCPNnaf2CsP+DILSJ9AZD0HKRT8vBKtwm7uqdhtb1OYhgsOBReOmn1dQZdC2CnnvID7jlAx8Ot27wlysG66uIyDXbyuMiRltdLEzVn/j3JqwDog62euSakCucJMuH27Rp0BXwwlM8+CBW1xpEMIBOGKh0/6UA1VMgU4z0di5gVUfeuIavCpVGW2lg9aqC0/PkfPFNq9KWdiVxwqwo5dblW79UTRASnEjVerqlnea4jsvMU6virCQeIjRzeTuIBYbSM2OAxYqCBUBz5WsZ4u/Ldd7Qr7RbuyS+MUeByScEWd6LGWzOVRHd3PHYrajkynJc0e5I7zUFDkLHljlLvzgdgiTYVdEOodefR9zH8dNYZldQ1rTnUJvZjrv/XRdLsWFhUp4ypY+TVMM9Tfzu0mB3G1woplKLnBvsWNDhq2mUijg072gjPNteOq8gKaNuuRLppRVdUtokiFer1AWW8+O8yej/W0WXD0gV/Cgk4wZIdlF5LAQHqOWTGub1EiSkOvJHex1tIgEqbRWSvUJP1WzN3HwNq+zTxhGraUMqhvY318bk5b3rdBOxKxAi+TGrbOJOFj3XQrhVPS/vttK6UlX2pkyK654r4QYwV5YM9YQaLotxJvIZIgIg1injlA6dfflj7E/lKxYQWWl0PnznXYhduoOWg4EiAS+z1l7xLfQlxwNzriIc2vkgjxW58eyE6j25Cxj70oO4JIrC/tyPWssruKtMvjKPqPhOT2XxbviQ/aZkWAy2OErr7Wb/Ia7a+rouGnYoIhDClxmhCkuqabr6d05EXbE/JHCdn2lhKFNa14tJtbB/j842xwyxSP/zRZAWRgOirBgk1QDORgiUpWQrrKggqkx3YSJu3SVDSsrnV9739KZ0hOhEvz72o3DAnUmuZJuPrfD4C6z+qI6pdytPZY5UbM1MqZQG8WDy0mKeDn3htgKjcOVd68vT32tGhhvAPt6bnjlupc4S9YWcg0q1LEsxB4puaOoIkl7c4NpM6iSs8waaqJXwOxKoj/ccEb12lCUTczwXpZB96BHMGKxp0OhKRLC39jsYXBc3CCCXnSbaji47SWX9bgJMiLYxUDWbro13zwWG67P6INE5AO6eB596lOyF0Zet6n/1BhD4beQdAd4lof0y7yPql2OoDEsK1dKEO7w5HkPG5uuk7fvq4ufbf1zCDgukDzjW+7380PQbMF4acSQZFbevWVN9GkhCKYuKTPHhud/elahgLfp2EPCziC1eX77ArCh9ouKFFo4rQRAIdVFREpL3KszOiDil+oBOG+NB7RkrESoPs5WZxc5QtfQCG3K+z1MTHS5LrSNfBy9quxBujPujdDx+9430sQsSKqu2CIUV8TiNzgub3etmxm3THMN26SNxDMMN4VNTo8wNu9gndqTeD38gCoNxoNPBBYNUJWvw4OTMt8iqEPAfAunm9dviZhua72qCxx1f+oNr7DNlO4YL0TdXctJH2QPR1Z7T3QXdVITYOPDWvgRiW2ZEFmDP8NI0WpMxEIpP0EyxMcuX5u5jebG1I+Czn5FuajoTpJYXRSunx2fGQeYXBl+E/u9GQgcgiFBXNyOq/lf3ivpSqrMiVp5JA4DdolaHVNnxcx+b45rD4YoMHQW5OPlErOdSzri2KPq5k3NdmRvX+29a65eY6uchsKqmOSmyPE8gInPxMhePc/PkN0eP31UMcXSWEk2klEOpBDY2FqMZK8zGtSm5OMecMKqqrMyEdWl+QEXkQCX6+kMfr/yvWBkqd0drO1Ve9hDlJYcrp1+pCP0T53M2g9HxEyk5EqVCwRw6CLBvgZPpT14yqPMF/qEBFzbJ7m5Ks39kUJvJl8uio6I2Xd02fiwdWOXQDW51mjWYCADfEFuILMCy+M3i8p0dLBCLpnn9SthU5is/BtulZq04ht0TKZdhj8oainbDPI6v1PjapMm+9+aFKSjSgIVsH8bCWWzLD9pD+gKM8BsMvN4HR0Vx0kGA+Qi4yV+Yd0pG3mN3Et1fcKQyIrE60aKDw8BNkhQo41/v/Zp24bMS2fTn9ST6WzTDQ5t/09YG7WCPaCDy3cl0DxQn51r2QPOOTkq0v5dvAG1+5IqfoXvO/xfRfk/5/6sEz3jy/P8Vk30y9erl9GC870SJtNxsaB4duqB+SgPL/V40eTnppOJxWcDRFAZjVlPwNq5nopJ/JNoAE3DhEUcIB+/uepmf4n69ojrTBrlu0k7YQXGFZtXZvcWAS/3ensZgUF3aLP388+G+iQikR8ucHSh/mynCLMlqOfg9yUL2W15DCYfthtpzl3MKl4uU8N6ACmBsPfip9SjRTx2xGkqWi3clpjqEcefpCVX6caNCAH9WbIym3So3K4QEQ81+Heo2+9GF+nHT/VkXMzmT1UMU09Q+dyHoB+H2LIKc6TToyQh2DhbmaXWXfjq0TiqtX9CNTW4XWgS90rFACRiXl+HBelY0x0DrtTqC33Xo7cGEOB6Bzp9YWpmxw2nFxHZmw6zqJFIe2zyC9xk7qzGBjJg6LT2qeVKgHiJA9W0iWtNMGpvu83Gps+oZ5OXWpNVPVrIuKyvpgMW3p+lgHU5v6VbusW4KFdYNQR/4R1jYw7FIZyX6B8VKrIaigts8n32kdsCZ/lLieTps1l7R4R8CVG5xQnasdCXo6sqIZWNwDNkb9HXkmk6c4L+TADX8PQTyjXY8Xj8TQcztpwh/wGaPErN1S50W2/4PfDZnI1sqdsRMqT8nz4GCUhq0r6cF+2a/05V+Zz1YOPljDWqxQcONU5GGl1dKoLbDxxQtY/Ms6kFytzJIwck3JBrKpi1MhpaDa5JfvxCXNERhoUC3kcINSC0h5G2dlyK9E9XYM0jf777xBRaVUhvwb0UlzuhMx3uBfRSPMvR0v5cvyO1nwNRY27qNs/ldXbILnJHESjy8jhcexY34lGTLZgUoQi1YN1svUl/in5A041cKUc0gaxUENQpsrpT/ZljpqAANUX5UPdBADBjh7WT9LCH9RXO4Cs+yjCyseLmI1Gx+kJXshlDcWiYXbbhNK1o+/J8fL+SBalIpJTHZbme76B4k1c3HogZ87gZAQcpIOAweo5DE0zZIiLMf+tqDRovk1yro2DRGn5vrpS5GHgkL4bg7mnGVS3+QwJW2J/VDlWQHCvj4M4Dq5AVYAAfUzzZf59TqW1zTfNyO2isAfvUim2huqfBD/SAoiGufsxi23vCvPohXX1ytGpjtJoziY5wd8Z+eJqTHDOUcYOvTJ2BUs7uKHdMcZ7zEBYecItSdlTmUBTWYrtYX8bWXKFoxxUsIiAPwFSDQrOCdmV3zWEwdywNP6mTAbm4dkqwFiW+zn/a8cxYouq9qWuc4UsOCOGizgTft0A2OgglUZ8EJH/hgDyjuvq8uqf15RHiFHaY/Nne5/Vtij9tKwOFamay1dVo0TCNjSg+8vX6YoIUXe4EInQtyg+uQypDIdxp16TT4wEOMAkJca+vxh1a4g44j3TlhzuTS6SeqvVrUWrrvrIhaJgcP5yQnG7+gtkfvNdY1PZoCN1JXgfkd0EqKr2w9Me+4U22mbdiI9m6pGiO8/GFJ0KVbewNAXyJNrZBvw5pDEOyrOesGJcHaiRdwX9YMtuFjRkEKZHgtlvTg6FdLtwb6AfzJL9zL37MBuiVd7WCkKb1fpE79POFS0CtBHc1h8JUEE2bzYzvuoKD4wx2VmOeKrztlEfyF9aNhf6vgslzDezFOguu7gavDOmk5pjxBx3SJt+if01fcz+3uLVBKeu0g4bp9ULjSQYXZMW97rTwJJjmRHVt29BxHHbDRbudL2Q/OSO7HNbc0pMrbJX32U9DZjC0mSlF/r4RD3rXfAvQ4sXutg3HOO9KjRrujBHNBKbgteZ6sOoDJFIF/im/X6J2sgyBT06uMC7OSfDHDEyJNZKfm1sWyCLiGGmIXEsP2MKVg8qJGB9uMioKvMgKi+kjgwuxd94nh2bfqP9QRd/aZ4Sha+YNf5JAQMi7ZPimhCrEu5LNKGtfq9t3BJ2vsgq9cO1S/Uu6Br4uqMIKqi2gvtRd/TtGdyyCKxvbanZowr+vFxRBNEQjA7HbWYSPVvFlYvlhTe4N50rLaqt22/wBqkCjdyXrrAHqX36duA6DqkW1dFKzo1NJUo0ulYq1bSocnp7KJLWS4U5i3Wv4n5ge4okTD2nSwd9OO4NjBg3va/49ElKifTAbH4B+C4FmUPL9XeF2/nFzAy279bXFAzbBNXzuxUPbhLfRFGQDXb/wLwO73HvG64lyuMrjKqiXgfjzF3QqxxnIq+jdaWDU78HK1elGjDGmgVcyC5THkZ1hQ1yRVK+Dr3S4ZoAsE1vwxpSR7WIW4fpKqexQ77HmMQJpiZmham79WqNLRWG7HueS6+MpWrO8GuDO8gpZ+LgOCjtQzcEmbUy3d2CiMpLU/qLAg2LcYm8tr2waJBvzL29zld82ZyfB/qv8XNkD5nQGthkWUU5Vu+yiB2G8Luqx6q5YPcH3RpqWnVAmXCr9iyFsupEMYkPW+bchqJf9D8+Pa4Y/8IFpfsdgmA/lCu4BFNT9Ar+TdLiVd7t8JTRlukFOSNp3yQlO7E8tvlgPOMDNHqcItuK5M3JnXCcRiK6/kfIgJXkw5T4jo9vLUF3BLNeTzCvpXv/RkV5o/Q0qyrSEd0OrT1TIZNR+eoJc2FQqgEEI5E7JISkdC9LAgawnSgzStzJ0MzIvghU9v224ANa8I890EUwytN1cWUF6F70iD34zAuHhCw4SMm2syyQBkNCCVDqHQ4hX7KWE6IMe6rYn8q6rb3UfoyAlNlowRLk0yMMiQxBjO9ee6f+7q32F45xIfzbwdmzy3Tp452eqJA07w4FI+IVYn8VQM5R3k4qPCWW6dxkPXCE6N/q84O6Ed2vxwPNQ7VaSc5BU4UKwfKz3SRTSUUEJWX7Q3Hlp2Er0Hv/2fwXeWTkdbw9ALm87kgv0xWSRXEe7ZDUppJ0+m6gmlkhEm4g01sTS7ORgraHrwT/zp9sWTYBl5ABAhYYg28oX4gB45ZVPTJ0Dr37FmpBgMzQDGTjQDIe/lAIvOes4JbRESDJb5vVcSQB7Uw7o+6ccBmmeb8xEQS9LZ8XRyuhZ5JynB0Hx+z/tqZ6dFonNmaXRt05wDvKPy9rwmhXD58/F9eAgIN4XEkRJkI1s+h94qr0WYiRSKbRuRvNJWRnAevCqoNrpDnz1qpC3XY0oxbHglsq/gqc7z3Yit8uKVHpSdGSfJat7gVtf/qh9lRrI67hVjr4f76UqztVMszz5oMqWrxEWXI93U/p2OxdtuwLVYSNLsN3CujYn15ijB9mqx0x+d55vBRcpBm4e69urDnXpnyELspphOuc8+xFniW7m5ZVvtYfPzyaGsShjp7geiXgyTC+mP8EOlreAtiJRfzkMZQ/Wu+sfGO9n8qH6wMUklh8Y8FjO8Br7ql74BKUyxHvtxIEL2hd0Wu8qUu6XvK0bUNaDlndhVzpYmJb1itwz3O2D4zw1RJRVf1h4J1c3hcWL87kb4AhodKCGczXDPQMyVyCJxnSBgP4k4cUiNRHXx9RpcQDOTtQ1gzT9VrGP9iO7k8a75oZDf2FuLUt9Gqy68/IYNzXS+9z6GbftWLND4ZtQ7ObLzXIH6c/Y/dDdv/aXUJFuh1ymGIQCH3cDGQHPADay3o0c/0y8WKPBmIv9f4gyWwH0mr+cq70PmjAwqMcjh5MPIEzrOUfssHVlGJixFuasPohD0oFH4u2cXx/0kEsAbPWUilLosEeDoVeOAvzNr7wFZ/T0ICWiqD1HDZzHkqwBr0h4MtKE0D1VH51rSRrTw4NZVObceffGJAW/57D+8s6Xj0ULkIXLpYoGBISjvN3U/qNhax5eXoKSjXJ1LDZZnwxU+v/u4rgwq4O/GdacWtCHCp8j0jtwdM4xbQthNsBQo4qDVXySylN+eK5d2keYNsN0kLoVS1i5kuzK9WOYSPrKYpyyqwbhzo5b/VjapYSR43x8WpD2zFh7Cd47fiBRmb8srme5gPOL6pjVgMCf4I2FoG98Mdy+OOmeiPu2tToJgetPL4tGp0eHmmmxjhhxnpPK3buZ/eslF0kxErf3a/zsFCVSYf6DIOxl9aDGwCjf8wPDolj1tl1+L0zj2c5lwziRPH+53xCT9NsCLV3wDlp2J91SqpK3w7LQ6N1o9xiRvwryVPiMO16Vz8oRbvOnCl1+niv5cYPxRuNhP+oh9xeAB6u7TLdKDe268tfPkP2HsL/T/z7djVDVc18XTW1zjQi1vdZJRrlAKiXJ8zqmxFHXfAq0/BGADAQsIx/hAHShbbV6iTt3QVj3MtiYV6x5cq2I7n3e3q4xYyXEiMtqD235i6xjtpNsoGAETXZ0L3l1RdOINjagc7B3zb33RsKpj1yo9bkF2nVNDUT+s5QtbuQCnf4nRpj/AlUrUt5C8lAD+DiQtdlcM21/qZ2gvU5iGah1t1oNnV0+wnG6az6aza4iP1JbscaVB/8W/h31gdCQ+AmaQGLcy28wGM/AKhAOuhQbDnYBm1mgJHTWOg28wBYspsO/hx4l+/yYAbZpDsQ8HnVdIPDkj0/kEygJrj6SenOo5n90MZE7X0xGddlLzhlOeIGKqzf0kxpPXzyXwtZ5UxSzBg3t30A60lRtMmF8JwgU1dDCx/W17w7EdHK81/XjeDqfXoj7avzhmskc5pDMXhkB18/llFX3+qlDs/IrmhnNHgBc5CKtgSOBqCXRfODzBTz4GQeGcR57XHICMfrvI/agDH4SYHwMw2Pgac1vCyde2DY0AvVlr4X6ESRkKmlCIhr39xpEkgZ54sGm32FxBO82hr16vclOGj5pa9V3DpbDBup3wqvgSPt5r85AOOwGcpuJeyvQIAldjLxDlWDN2TqVr3fWfQ6mELb6gwo0+2nEr5xbYKfH0anseBnCIhQyVs0B1yUz7H0/oC4DnooYL9vPTJVrJBrXzc6h3npKJSpZ2RNLmfKTHI42kVNnW6GS0XD0vhBfTUO9mLSqtex6DDChfKJCbrA9BrrcA74Dxc5eefFTIeO8sAhHcO/l7nCyyjDvrERUlLztXqmlymgwL9B6LHSUYL+tbmMQVagNSQbQxZsdgPu5npTK7NAFz4cdX+1lwBclkCKiaisYr0V2AgUDs5F0oPMzge4EUAB+eEwjsGpq/A/QBOBEcOuZOXx1DxE/PvehndVacIZH8k1xEU0wgs4RTXFDcI3chD+qDvHIHU8j5J05hjc+3fHuZnQijYDbYpIuJuPpGxallP94KmjPGxj4CI7wAnOhnEg1P1AZ3Td64TVeqdAdBAAOpWJRz2j3Z8iaH45ZvJW5S5HM7KuSsAyUnNlV83SwBphhe1VjDg6CG7mXVVuod4MNEbiN2nkFt8P375tjHfq3jbwYb6zeBvGM5G16G5INBT0X81bR0hd8fW3LngQZpKmjizYoxo8i26Ag1aKtf6LhpLF2PBpddPu03lhACNw3rbpTaLYgwDAvHb7K/NB7bpZEDIw9x7uy+fgBBhdvjMTvEO5SL7FFT6upxhPvA6fTUegkcHDaiPXzbQyPgpLOLlLDK5Gfn1+Xlam5F/GVyvb2cQh0zKwFYyBtBfoKV51OBBl2EqezfQsVvGHkVInlKwNoycI0CNCQsJfLuOfZs4epk6dgVJr48veAWJKz0cC/+rV5TAZgpehv93tFBnhmx/efnJtF3P2HhIn8qN2j/jysMij+t/VR1j67OotsCyXq9Sxo90a11cWRHZUXjxALNhiNZdtowR5REbst/Ij3Ki73VovC/DehXCQy8Kb+OALgZNxF0rDvr2onuh4uJKWY8/CZl1ltz5vj/WqXiOBm1XywkhGSCFGjHoDntZT+ThOgtBSzlyeyRTs+uSEpGakX96XQIYTnQh6Bqu9aWjL/RmIKqDomLtmnQM5hWG6bC9jq0mNkwkRemaiRXDO+3azMPOwgo2LPRO90bo0TchJID/aASyeGlrY+r+kRBeU9TXjizWd6CUaljYM9Zaf+vMuz3ySlkkbHxeDBvju3kwenbSVWgbA58bDA+RfpHDUtcxTndrtnvd3XxOazfX040jNcFKdCAsy/93LS0byKcABsSa3mC9UXQoxe3PALneqQZMdO6ACKIiKYgCHn4YfLd9WDVO5laL6yLx1WkNiVz68s/dQWNQtZ5MIs1e6xl3GLtsHy7D9rBdoZp0B+evionoq75EuHDO4Qk2y8kw/w+9KXYcwP6I5IQv06vvH95xqTyG+FOFbVNgD7naSttmsXyL3dQyTdEa5dAC/cngWkAhv0z4onU+dXt2dW/hWhbTWxjMePcahEKqItKZxh2ge/yb+WeqEI+oRdwfkm9dSflURx8CRi1CcpgvNVKgM+7+zwebKuAOuCZEBNJ/rRcJP3DSA106ODXqaAGaV1xkD9ho2DSl/3Yvf75gQomfgXtN9tShu+16+UDaVl5/7nTpW9OCeVQ57PONvsF9mMnS39u8QaigI6SesopjmISEI18phMK9dSUjXDZ1JjhnrncCjWQpq8ft0fY5/qqlglihbJSjwYT1RXp52qVkp1kqbdGNaZweH6lKF9SguyheSlInCr85H8QoNraOXRn0meZ9V1SkKx0I/PffXhWMy/88fsp00uEWtibqSNky3sjFsPQtplwOK3DMRKCrsJN2YWERYqe4LU0c4h+hHzx+AbzoeF3C2vAVBW4xtC9ECnuObtH6vFi8GPYk/XHskQRydxEhqwfLeVmqat8nvP9OKcSbx08Fb3f0yhOIWsa5pxRdidjRD3VGOpa75Y9f63zWQmFjXEPCLASCvNNctGcL/L+9aNd+oZxpX9Cs4tMDx0idXASGtlUb8L/zm8J4P7/zD+pqpxb6PENdfFAgiZqK4bLmH/DnKbhVhEQbt2FiU2509o9da2MGljCFqQoGN+EgYHOVtXGOgaqnCDsqzlcNHmpj6BgzWLcsnNomwpDuoYuLlH1Qwqar1Hge5aaSA+W5KPVwLmh5hkI+vNpJfN+cff2Fsjhf772mxIZ5+OddNwk40Phv0FQjzy9AJarAMNNStexGYr5tJrPhtytO7WbROXr3PR3jfJUEcCWpwdFu2TdP3gTojKtvrdjdbUhAtYC3dEk9NbIcbeLl6J/LqqxnH6+vrsRAXOHIPrFQGtKeVL/uSIW7aLS/XJRtxQIPHL0xeCAGtvu4NBH3Qq2IrpZYmd8vdjtJmrYWYLjSe8M/1Y8OSU3ZcGerV6IIAAnuDRdTMCUKmMOxaUePMi3tb5TOoD6S0XOli+Ze6ND+7UJ/nE+D4IiAXRcDDyvPcXMTNuwrStW7PRNi+DM7AfQQKfzitFqU0acIAzuYwV/SwfZJ0zNoQIt832XIfs2IECmu9+eZwfBFkm90YbSBHm/HM7z8mUMdemv3hIFpN2g18+OnhVR4H89sDVatXx9NiB/BuZOvbSYRjtFRKwrp6F0hi5vypMQB9Tf61e+rou3gRokQYBjLvqalRdKS3nrfykQAd/+amjtPBFHC/QNFhZjEmQxuHIFJi2VoWPn+NzFkug69UXjy19ulGwFL95qvZb3Gbs+qSELCg6fWUtg5D6OZiVa034PqJikLrpwkv5Fx0pHX2CpE1W3ArYsd0rG4Oxou7iVTxQyILbKi2zxhvhf/0WHlaUaRoH9gFuz+kNyAqAnARznu+WRzMeTJs3gxe59CxbpORwsgliWjNgXzHNQXV0bFdG6zIzv3KOZMpX15lycvxyNihaXpIYM5qpzVwxLef+wncFn5xu/5rgA6HiyXagf62qPMd9yJwfi0jqgd/ugdvBIpheRZxeMNHv3CS9hzVNXsti7UtsN4mUh6LLqP5GMb0nv0t+FyRnUymtoTO2ZrJgJilhMOr/bkbb8MZFDGg3exU4xXoHgKGhBTlDVMeg26PU1nX/TU5blK7jmZbvMozRaqG4xIBloovC0aoNYJsfIadEg5oD7jRzYpLpObeG+ZzYza4z0q6VGQvT1TQenn7zXXZmGV6L+KXVaKwmw1MaqyIz90wDkOgBpTxIrxUCsAoIxemG0naLsPSfz7vtCYSIKliHpDFutci/Q+AmZ1jXjXnuM4HKj+usiPg2c7aS7M3SdPWLnMP7NF226k1eFIzaUt8rQ2P/x9WrL5KNn30Ug65vNvpwVgoXAphFlJKYMK5a7ry88P730/cpmYLau4X9xQMMXzcaauCbtKPz3BDdZtYSu1zJjQPRZa4PyCXnRqAd/wFC/s1maSanruNXJPjH5PjI3nyi46u4dYKfb8gwfLSMol93tJ0ifjSLq48mJclNxH11rdXPbb9eLqjChwxEsD9mynNRp6D5E+gebemCELfnUf6Qo2K1bRYHRjzYkPXGRye/ArN69G1LRzWB40GE1g9czSRBtBj7HBQQ5oAfGivf9iPowVdm6dBtdNcShc7vlqIplGOUbIxRRplf5hMM8X5P+VU17sD9Eoryh2SABGc3WPpcJ/DNOLI7vIUGLxHCjFz8/Bq+KoXNLVCnZ5OYrvzF3uBqg16IFVZVfL9mIsRiXR1DXovtbCP2sAYdi3pKtSxS0A+jWISmEzT8SetdMhTLRTT0VNcUx/XzQa+IWJFKqEuLaSRCyXCvORe0VZfB8NMVE1Hwmfj8uqytNMZex47URcH/jQKidduNznoNCrMgUmxW63Qeb5OGC9s9dUPTx/ClCKt/vTJ4jnbJmJ5/oMruvPq0pyUz28i8nJ1KW7xGlpC3jKEdj+Axr2B53mCbRpHYkDsuY8p76LHxZLzG/VzsI9IaZPUDFg89Y9fZda5g36EIBFHIdWbz0UekAZ5JJ5pqq+WsRiD4jegIhM04ovxLP49X6orMAs2jlxdbbBu3h3ilvDUG2/ejvBCgr0OD+eWYkXnBcF4qdQLytLNLPjTuYa9pFDHmDNx1wGaI5cLVj/O7lA==' as c FROM generate_series(1, 10) AS i; +DELETE FROM uao_delete_toast; +VACUUM uao_delete_toast; diff --git a/src/test/singlenode_regress/expected/uao_compaction/drop_column_update.out b/src/test/singlenode_regress/expected/uao_compaction/drop_column_update.out new file mode 100644 index 00000000000..784ca4aa09a --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/drop_column_update.out @@ -0,0 +1,24 @@ +-- @Description Tests dropping a column after a compaction with update +CREATE TABLE ck_ct_ao_analyze3( +text_col text, +bigint_col bigint, +char_vary_col character varying(30), +int_array_col int[], +drop_col numeric) with (appendonly=true); +INSERT INTO ck_ct_ao_analyze3 values ('1_zero', 1, '1_zero', '{1}', 1); +ALTER TABLE ck_ct_ao_analyze3 DROP COLUMN drop_col; +Select char_vary_col, int_array_col from ck_ct_ao_analyze3; + char_vary_col | int_array_col +---------------+--------------- + 1_zero | {1} +(1 row) + +INSERT INTO ck_ct_ao_analyze3 values ('2_zero', 2, '2_zero', '{2}'); +update ck_ct_ao_analyze3 set bigint_col = bigint_col + 1 where text_col = '1_zero'; +Select char_vary_col, int_array_col from ck_ct_ao_analyze3; + char_vary_col | int_array_col +---------------+--------------- + 2_zero | {2} + 1_zero | {1} +(2 rows) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/eof_truncate.out b/src/test/singlenode_regress/expected/uao_compaction/eof_truncate.out new file mode 100644 index 00000000000..475b4f9912b --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/eof_truncate.out @@ -0,0 +1,32 @@ +-- @Description Tests the behavior while compacting is disabled +CREATE TABLE uao_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_eof_truncate_index ON uao_eof_truncate(b); +BEGIN; +INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i; +ANALYZE uao_eof_truncate; +COMMIT; +BEGIN; +INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i; +ROLLBACK; +SET gp_appendonly_compaction=false; +SELECT COUNT(*) FROM uao_eof_truncate; + count +------- + 1000 +(1 row) + +VACUUM uao_eof_truncate; +SELECT COUNT(*) FROM uao_eof_truncate; + count +------- + 1000 +(1 row) + +-- Insert afterwards +INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +SELECT COUNT(*) FROM uao_eof_truncate; + count +------- + 1010 +(1 row) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/full.out b/src/test/singlenode_regress/expected/uao_compaction/full.out new file mode 100644 index 00000000000..fff1586e6bd --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/full.out @@ -0,0 +1,29 @@ +-- @Description Test the basic bahavior of vacuum full +CREATE TABLE uao_full (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_full_index ON uao_full(b); +INSERT INTO uao_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +INSERT INTO uao_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +ANALYZE uao_full; +DELETE FROM uao_full WHERE a < 4; +SELECT COUNT(*) FROM uao_full; + count +------- + 14 +(1 row) + +VACUUM FULL uao_full; +-- check if we get the same result afterwards +SELECT COUNT(*) FROM uao_full; + count +------- + 14 +(1 row) + +-- check if we can still insert into the relation +INSERT INTO uao_full VALUES (11, 11); +SELECT COUNT(*) FROM uao_full; + count +------- + 15 +(1 row) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/full_eof_truncate.out b/src/test/singlenode_regress/expected/uao_compaction/full_eof_truncate.out new file mode 100644 index 00000000000..7772fc11a1a --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/full_eof_truncate.out @@ -0,0 +1,32 @@ +-- @Description Tests the behavior while compacting is disabled +CREATE TABLE full_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX full_eof_truncate_index ON full_eof_truncate(b); +BEGIN; +INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i; +ANALYZE full_eof_truncate; +COMMIT; +BEGIN; +INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i; +ROLLBACK; +SET gp_appendonly_compaction=false; +SELECT COUNT(*) FROM full_eof_truncate; + count +------- + 1000 +(1 row) + +VACUUM FULL full_eof_truncate; +SELECT COUNT(*) FROM full_eof_truncate; + count +------- + 1000 +(1 row) + +-- Insert afterwards +INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +SELECT COUNT(*) FROM full_eof_truncate; + count +------- + 1010 +(1 row) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/full_threshold.out b/src/test/singlenode_regress/expected/uao_compaction/full_threshold.out new file mode 100644 index 00000000000..92cea989725 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/full_threshold.out @@ -0,0 +1,9 @@ +-- @Description Tests that that full vacuum is ignoring the threshold guc value. +CREATE TABLE uao_full_threshold (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_full_threshold_index ON uao_full_threshold(b); +INSERT INTO uao_full_threshold SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; +ANALYZE uao_full_threshold; +VACUUM FULL uao_full_threshold; +DELETE FROM uao_full_threshold WHERE a < 4; +SET gp_appendonly_compaction_threshold=100; +VACUUM FULL uao_full_threshold; diff --git a/src/test/singlenode_regress/expected/uao_compaction/outdated_partialindex.out b/src/test/singlenode_regress/expected/uao_compaction/outdated_partialindex.out new file mode 100644 index 00000000000..8e9fa07f7ea --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/outdated_partialindex.out @@ -0,0 +1,34 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned (e.g. because of a crash) in combination +-- with a partial index. +CREATE TABLE uao_outdated_partial (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_outdated_partial_index ON uao_outdated_partial(b) WHERE b < 20; +INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uao_outdated_partial; +SET enable_seqscan=false; +DELETE FROM uao_outdated_partial WHERE a < 16; +VACUUM uao_outdated_partial; +SELECT * FROM uao_outdated_partial WHERE b = 20; + a | b | c +----+----+---------------------------------------------------------------------------------------------------------------------------------- + 20 | 20 | hello world +(1 row) + +SELECT * FROM uao_outdated_partial WHERE b = 10; + a | b | c +---+---+--- +(0 rows) + +INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'Good morning' as c FROM generate_series(101, 110) AS i; +SELECT * FROM uao_outdated_partial WHERE b = 10; + a | b | c +---+---+--- +(0 rows) + +SELECT * FROM uao_outdated_partial WHERE b = 102; + a | b | c +-----+-----+---------------------------------------------------------------------------------------------------------------------------------- + 102 | 102 | Good morning +(1 row) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/outdatedindex.out b/src/test/singlenode_regress/expected/uao_compaction/outdatedindex.out new file mode 100644 index 00000000000..a9c92f8c8b5 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/outdatedindex.out @@ -0,0 +1,28 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned (e.g. because of a crash). +CREATE TABLE uao_outdated (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_outdated_index ON uao_outdated(b); +INSERT INTO uao_outdated SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uao_outdated SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uao_outdated; +SET enable_seqscan=false; +DELETE FROM uao_outdated WHERE a < 16; +VACUUM uao_outdated; +SELECT * FROM uao_outdated WHERE b = 20; + a | b | c +----+----+---------------------------------------------------------------------------------------------------------------------------------- + 20 | 20 | hello world +(1 row) + +SELECT * FROM uao_outdated WHERE b = 10; + a | b | c +---+---+--- +(0 rows) + +INSERT INTO uao_outdated SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 10) AS i; +SELECT * FROM uao_outdated WHERE b = 10; + a | b | c +----+----+---------------------------------------------------------------------------------------------------------------------------------- + 10 | 10 | Good morning +(1 row) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/outdatedindex_abort.out b/src/test/singlenode_regress/expected/uao_compaction/outdatedindex_abort.out new file mode 100644 index 00000000000..962f7725211 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/outdatedindex_abort.out @@ -0,0 +1,36 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned (e.g. because of a crash) in combination +-- with aborted inserts. +CREATE TABLE uao_index_abort_test (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_index_abort_test_index ON uao_index_abort_test(b); +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uao_index_abort_test; +SET enable_seqscan=false; +DELETE FROM uao_index_abort_test WHERE a < 16; +VACUUM uao_index_abort_test; +SELECT * FROM uao_index_abort_test WHERE b = 20; + a | b | c +----+----+---------------------------------------------------------------------------------------------------------------------------------- + 20 | 20 | hello world +(1 row) + +SELECT * FROM uao_index_abort_test WHERE b = 10; + a | b | c +---+---+--- +(0 rows) + +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 4) AS i; +BEGIN; +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(5, 8) AS i; +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(9, 12) AS i; +ROLLBACK; +SELECT * FROM uao_index_abort_test WHERE b < 16; + a | b | c +---+---+---------------------------------------------------------------------------------------------------------------------------------- + 1 | 1 | Good morning + 2 | 2 | Good morning + 3 | 3 | Good morning + 4 | 4 | Good morning +(4 rows) + diff --git a/src/test/singlenode_regress/expected/uao_compaction/update_toast.out b/src/test/singlenode_regress/expected/uao_compaction/update_toast.out new file mode 100644 index 00000000000..1069dfdbcd4 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_compaction/update_toast.out @@ -0,0 +1,51 @@ +-- @Description Check updating toast values +-- Create a table with toasted values +CREATE TABLE uao_update_toast (a INT, b INT, c VARCHAR) WITH (appendonly=true); +CREATE INDEX uao_update_toast_index ON uao_update_toast(b); +INSERT INTO uao_update_toast SELECT i as a, 1 as b, i::text || '0W0bTHVHn2es6Ga9YumoV/cat/CW8jglG+DjaLT7ewvMj5IWaiGz2/3eP5fLTxyzrm6Bv8kxiYGSt5hqM38XLKXRgYwvFnnKfIW/ZMJbkjlOeXQdse+sCQAobQX0+wrCBycwsMjVn6kgm9QLCxrQ96Cjx8l2nx/xr1+ekc9o2i24+faKAgiQE9DQKEAbAt3wMB/1SuiG9cZaJH6ASsLhSMq63KyjNse1c67o+sbJg6pxX5cftM0iV6DciVHU5rhALosKT4boil5+tfVmU+7r2aTWC1XK+nneNfVrmiQe3AU7iQgb/YU+7R+kgrirPv6Y1MF9BoXxih2jJ085E/EE7NQ8RwHm1UsTYUSyFpwdSg2Y8F06UPyEnPkuZhbqWIiSDMES4L7tz8YaGkYr5b69bUuKh5GkPDxU4mj0wbEA5jZDGT+a1Qgb9Tjx0/bRqI1Gd2RDmmLd3ZktSDsQ+APk8bgwZ5epE694KdsNBS5UsThRVwsOG9yNIEVjsTk3Moy59NIJcO1PZS48Q1GEdZTTdUYVWqqCpvJdSUtYg2kEuC/QfV9DTEuDqQqIdKchPdmLw//FoFSna77goKFIK2k1DkFPs3DDQDHPXtfXNQ9zgKMWOzKWxQrkDP4VA5NBsAM3IRpSiY4h1muXpejWt/2NiLo8PP7ZYgFXnSQYGzZsJepRdX0hCV6LWedzIf8fWYnCglKY0Ah4Cb13d0Jvviz4wQMATi4HcFEPewrhSsjWGA0cJZcn/AhCX4MgZIkMqXJvvnAjaXxkIfFE86YtRdP9S8L3sPZLO9VaNONsQrS4v5Md1SAY24d3GenGHEsuH3Tu1QJHYYQLe7juYnZyP71gX56bOAiECcaN9kerb+VQVX8gTvEI4LOIlF9dwrc3FuDaApO/XjKjffu5TXtEAgeRvp8O3iad4/aUo0MeWsD/dFFOQYGZpAGw5wA8bJMr46rSi6LJf3fVWwi3/sGvqDeiBCotisDsyfr5VrZpzQAkrggkB+L1eFm6bvRxH6w5lc8tX3ppjsrsEwt6qSro6qdZ1ho5mtT0CV/mKh+YaVsRaVOXxbRTSBQOqxtfWhjCWvncPcYqJBylRlzy98aWR871suYXPWLW2bxXSxC9PqEiz7HMXpNhjboLKOmMPeMcPZTE6Tgp/wRlyTdemhocEZEZWDpm3XQamOQ9kiwg1mqHwSjGpipFjHun0PQC+J2k+InGj3gODOGU4f7AD87wuM875GsbSYk+NDonfgkBkUPfHNLONF8ft3iZ42YsZghvzSqDIMepTJs9w8ITZ0aCfsQ9swHLK1larLLkQ/9m/wgBUXMNDBrZUZkiQQVGu67Tnmg8vZkv9NNVbHL03HLZsCMi2oI0auUdzCBd4+wyQ+97ukgLso3hAQLschExEQJcphaRy9n3T1WRiRETGd+Z7Yd90Ii8ePeyPp67itRHzKw4eAli/nCBiOVTSkWbtvLaEXN7/s+auJ/JzFKbXzwlDbIHmxLflxlSo03Gijb7aUnjIvyctyHenbTZGFTy2pw1YNJaKanEiPtK7CkDP/3eTlORS2sA9WyJATswpdqDQIhLBIrmxhTtSEvwwKYRFr35ZKMQ1P4STrjblkw+i2ZEh1XfOxhSH7sfEToNqOUCPO0Tdh4emPNoSaow8vha/YxpSZk7VaqyUr8ig5s9nmVa1Zw/w3kdalyfJQem+ETWfNB+3eBCjXSQhvL+J/0uQ973Na2G8+9+R2kh2ZIWlnjW2YNGoyu6z4xXvsxfo6V+Czz+UYFKYJjZfoapfl3On3zGmRXBjy6KJIIOZ948WIxc8q0dnJYjKLluR0u8ikz03qlDb9Fce2tzRh9TW48BnjGCfSp8o8+SJc8MHBnef6OgYLCtjnBNXklJpLBBEzQJujLV87Z+Gz5p56ZiIsd52sEU2x9Ro9roDtkpKgGQeUN0z/ap4ZKC7k4PxmUyXPTe0gi+sBM1yf13HvDN3c69bBg8RnaC8mML7qGStBtSv294OwxZ1Ap0/JgmuiwX5u8CnQ1q0TPFV7MzVvDCLYMlsiY+du2yFYLTrcZPmy6MLLT5NtlCovkaD+Am3vdw7xqOVEUGaatr60Dm3ynL49BbGBH930LcUz4PMOEaoH8OyYXryR7hObeRR5EaQC7ekZd9iZIllZxdL0HoJYWl95AgPnS5vPjYYZFsW80zmxEorByolcNxOtf2sR8Ffz0T+iyvMXx2CksvBZzy/yAhXQZ0ZkUGgqENH0IltJq4HALvX9AkQow46hhZ8kjB7kCrhXTVM4+iUrYfoAqzbXVSsNhXTcoun8The7RTZUWwKOLQ3tehCAtCd6rJ0oRnsopRjUGDEmaboq+GVLk7StgZ44WHVvr+bp1qVK3pNmyk7h5xbO28ECJETrZ2hLMGEn6xO4e0hI3EAXo9nsWDB8Hoqfz70wyTGa5L3L04JnVJoCPNnaf2CsP+DILSJ9AZD0HKRT8vBKtwm7uqdhtb1OYhgsOBReOmn1dQZdC2CnnvID7jlAx8Ot27wlysG66uIyDXbyuMiRltdLEzVn/j3JqwDog62euSakCucJMuH27Rp0BXwwlM8+CBW1xpEMIBOGKh0/6UA1VMgU4z0di5gVUfeuIavCpVGW2lg9aqC0/PkfPFNq9KWdiVxwqwo5dblW79UTRASnEjVerqlnea4jsvMU6virCQeIjRzeTuIBYbSM2OAxYqCBUBz5WsZ4u/Ldd7Qr7RbuyS+MUeByScEWd6LGWzOVRHd3PHYrajkynJc0e5I7zUFDkLHljlLvzgdgiTYVdEOodefR9zH8dNYZldQ1rTnUJvZjrv/XRdLsWFhUp4ypY+TVMM9Tfzu0mB3G1woplKLnBvsWNDhq2mUijg072gjPNteOq8gKaNuuRLppRVdUtokiFer1AWW8+O8yej/W0WXD0gV/Cgk4wZIdlF5LAQHqOWTGub1EiSkOvJHex1tIgEqbRWSvUJP1WzN3HwNq+zTxhGraUMqhvY318bk5b3rdBOxKxAi+TGrbOJOFj3XQrhVPS/vttK6UlX2pkyK654r4QYwV5YM9YQaLotxJvIZIgIg1injlA6dfflj7E/lKxYQWWl0PnznXYhduoOWg4EiAS+z1l7xLfQlxwNzriIc2vkgjxW58eyE6j25Cxj70oO4JIrC/tyPWssruKtMvjKPqPhOT2XxbviQ/aZkWAy2OErr7Wb/Ia7a+rouGnYoIhDClxmhCkuqabr6d05EXbE/JHCdn2lhKFNa14tJtbB/j842xwyxSP/zRZAWRgOirBgk1QDORgiUpWQrrKggqkx3YSJu3SVDSsrnV9739KZ0hOhEvz72o3DAnUmuZJuPrfD4C6z+qI6pdytPZY5UbM1MqZQG8WDy0mKeDn3htgKjcOVd68vT32tGhhvAPt6bnjlupc4S9YWcg0q1LEsxB4puaOoIkl7c4NpM6iSs8waaqJXwOxKoj/ccEb12lCUTczwXpZB96BHMGKxp0OhKRLC39jsYXBc3CCCXnSbaji47SWX9bgJMiLYxUDWbro13zwWG67P6INE5AO6eB596lOyF0Zet6n/1BhD4beQdAd4lof0y7yPql2OoDEsK1dKEO7w5HkPG5uuk7fvq4ufbf1zCDgukDzjW+7380PQbMF4acSQZFbevWVN9GkhCKYuKTPHhud/elahgLfp2EPCziC1eX77ArCh9ouKFFo4rQRAIdVFREpL3KszOiDil+oBOG+NB7RkrESoPs5WZxc5QtfQCG3K+z1MTHS5LrSNfBy9quxBujPujdDx+9430sQsSKqu2CIUV8TiNzgub3etmxm3THMN26SNxDMMN4VNTo8wNu9gndqTeD38gCoNxoNPBBYNUJWvw4OTMt8iqEPAfAunm9dviZhua72qCxx1f+oNr7DNlO4YL0TdXctJH2QPR1Z7T3QXdVITYOPDWvgRiW2ZEFmDP8NI0WpMxEIpP0EyxMcuX5u5jebG1I+Czn5FuajoTpJYXRSunx2fGQeYXBl+E/u9GQgcgiFBXNyOq/lf3ivpSqrMiVp5JA4DdolaHVNnxcx+b45rD4YoMHQW5OPlErOdSzri2KPq5k3NdmRvX+29a65eY6uchsKqmOSmyPE8gInPxMhePc/PkN0eP31UMcXSWEk2klEOpBDY2FqMZK8zGtSm5OMecMKqqrMyEdWl+QEXkQCX6+kMfr/yvWBkqd0drO1Ve9hDlJYcrp1+pCP0T53M2g9HxEyk5EqVCwRw6CLBvgZPpT14yqPMF/qEBFzbJ7m5Ks39kUJvJl8uio6I2Xd02fiwdWOXQDW51mjWYCADfEFuILMCy+M3i8p0dLBCLpnn9SthU5is/BtulZq04ht0TKZdhj8oainbDPI6v1PjapMm+9+aFKSjSgIVsH8bCWWzLD9pD+gKM8BsMvN4HR0Vx0kGA+Qi4yV+Yd0pG3mN3Et1fcKQyIrE60aKDw8BNkhQo41/v/Zp24bMS2fTn9ST6WzTDQ5t/09YG7WCPaCDy3cl0DxQn51r2QPOOTkq0v5dvAG1+5IqfoXvO/xfRfk/5/6sEz3jy/P8Vk30y9erl9GC870SJtNxsaB4duqB+SgPL/V40eTnppOJxWcDRFAZjVlPwNq5nopJ/JNoAE3DhEUcIB+/uepmf4n69ojrTBrlu0k7YQXGFZtXZvcWAS/3ensZgUF3aLP388+G+iQikR8ucHSh/mynCLMlqOfg9yUL2W15DCYfthtpzl3MKl4uU8N6ACmBsPfip9SjRTx2xGkqWi3clpjqEcefpCVX6caNCAH9WbIym3So3K4QEQ81+Heo2+9GF+nHT/VkXMzmT1UMU09Q+dyHoB+H2LIKc6TToyQh2DhbmaXWXfjq0TiqtX9CNTW4XWgS90rFACRiXl+HBelY0x0DrtTqC33Xo7cGEOB6Bzp9YWpmxw2nFxHZmw6zqJFIe2zyC9xk7qzGBjJg6LT2qeVKgHiJA9W0iWtNMGpvu83Gps+oZ5OXWpNVPVrIuKyvpgMW3p+lgHU5v6VbusW4KFdYNQR/4R1jYw7FIZyX6B8VKrIaigts8n32kdsCZ/lLieTps1l7R4R8CVG5xQnasdCXo6sqIZWNwDNkb9HXkmk6c4L+TADX8PQTyjXY8Xj8TQcztpwh/wGaPErN1S50W2/4PfDZnI1sqdsRMqT8nz4GCUhq0r6cF+2a/05V+Zz1YOPljDWqxQcONU5GGl1dKoLbDxxQtY/Ms6kFytzJIwck3JBrKpi1MhpaDa5JfvxCXNERhoUC3kcINSC0h5G2dlyK9E9XYM0jf777xBRaVUhvwb0UlzuhMx3uBfRSPMvR0v5cvyO1nwNRY27qNs/ldXbILnJHESjy8jhcexY34lGTLZgUoQi1YN1svUl/in5A041cKUc0gaxUENQpsrpT/ZljpqAANUX5UPdBADBjh7WT9LCH9RXO4Cs+yjCyseLmI1Gx+kJXshlDcWiYXbbhNK1o+/J8fL+SBalIpJTHZbme76B4k1c3HogZ87gZAQcpIOAweo5DE0zZIiLMf+tqDRovk1yro2DRGn5vrpS5GHgkL4bg7mnGVS3+QwJW2J/VDlWQHCvj4M4Dq5AVYAAfUzzZf59TqW1zTfNyO2isAfvUim2huqfBD/SAoiGufsxi23vCvPohXX1ytGpjtJoziY5wd8Z+eJqTHDOUcYOvTJ2BUs7uKHdMcZ7zEBYecItSdlTmUBTWYrtYX8bWXKFoxxUsIiAPwFSDQrOCdmV3zWEwdywNP6mTAbm4dkqwFiW+zn/a8cxYouq9qWuc4UsOCOGizgTft0A2OgglUZ8EJH/hgDyjuvq8uqf15RHiFHaY/Nne5/Vtij9tKwOFamay1dVo0TCNjSg+8vX6YoIUXe4EInQtyg+uQypDIdxp16TT4wEOMAkJca+vxh1a4g44j3TlhzuTS6SeqvVrUWrrvrIhaJgcP5yQnG7+gtkfvNdY1PZoCN1JXgfkd0EqKr2w9Me+4U22mbdiI9m6pGiO8/GFJ0KVbewNAXyJNrZBvw5pDEOyrOesGJcHaiRdwX9YMtuFjRkEKZHgtlvTg6FdLtwb6AfzJL9zL37MBuiVd7WCkKb1fpE79POFS0CtBHc1h8JUEE2bzYzvuoKD4wx2VmOeKrztlEfyF9aNhf6vgslzDezFOguu7gavDOmk5pjxBx3SJt+if01fcz+3uLVBKeu0g4bp9ULjSQYXZMW97rTwJJjmRHVt29BxHHbDRbudL2Q/OSO7HNbc0pMrbJX32U9DZjC0mSlF/r4RD3rXfAvQ4sXutg3HOO9KjRrujBHNBKbgteZ6sOoDJFIF/im/X6J2sgyBT06uMC7OSfDHDEyJNZKfm1sWyCLiGGmIXEsP2MKVg8qJGB9uMioKvMgKi+kjgwuxd94nh2bfqP9QRd/aZ4Sha+YNf5JAQMi7ZPimhCrEu5LNKGtfq9t3BJ2vsgq9cO1S/Uu6Br4uqMIKqi2gvtRd/TtGdyyCKxvbanZowr+vFxRBNEQjA7HbWYSPVvFlYvlhTe4N50rLaqt22/wBqkCjdyXrrAHqX36duA6DqkW1dFKzo1NJUo0ulYq1bSocnp7KJLWS4U5i3Wv4n5ge4okTD2nSwd9OO4NjBg3va/49ElKifTAbH4B+C4FmUPL9XeF2/nFzAy279bXFAzbBNXzuxUPbhLfRFGQDXb/wLwO73HvG64lyuMrjKqiXgfjzF3QqxxnIq+jdaWDU78HK1elGjDGmgVcyC5THkZ1hQ1yRVK+Dr3S4ZoAsE1vwxpSR7WIW4fpKqexQ77HmMQJpiZmham79WqNLRWG7HueS6+MpWrO8GuDO8gpZ+LgOCjtQzcEmbUy3d2CiMpLU/qLAg2LcYm8tr2waJBvzL29zld82ZyfB/qv8XNkD5nQGthkWUU5Vu+yiB2G8Luqx6q5YPcH3RpqWnVAmXCr9iyFsupEMYkPW+bchqJf9D8+Pa4Y/8IFpfsdgmA/lCu4BFNT9Ar+TdLiVd7t8JTRlukFOSNp3yQlO7E8tvlgPOMDNHqcItuK5M3JnXCcRiK6/kfIgJXkw5T4jo9vLUF3BLNeTzCvpXv/RkV5o/Q0qyrSEd0OrT1TIZNR+eoJc2FQqgEEI5E7JISkdC9LAgawnSgzStzJ0MzIvghU9v224ANa8I890EUwytN1cWUF6F70iD34zAuHhCw4SMm2syyQBkNCCVDqHQ4hX7KWE6IMe6rYn8q6rb3UfoyAlNlowRLk0yMMiQxBjO9ee6f+7q32F45xIfzbwdmzy3Tp452eqJA07w4FI+IVYn8VQM5R3k4qPCWW6dxkPXCE6N/q84O6Ed2vxwPNQ7VaSc5BU4UKwfKz3SRTSUUEJWX7Q3Hlp2Er0Hv/2fwXeWTkdbw9ALm87kgv0xWSRXEe7ZDUppJ0+m6gmlkhEm4g01sTS7ORgraHrwT/zp9sWTYBl5ABAhYYg28oX4gB45ZVPTJ0Dr37FmpBgMzQDGTjQDIe/lAIvOes4JbRESDJb5vVcSQB7Uw7o+6ccBmmeb8xEQS9LZ8XRyuhZ5JynB0Hx+z/tqZ6dFonNmaXRt05wDvKPy9rwmhXD58/F9eAgIN4XEkRJkI1s+h94qr0WYiRSKbRuRvNJWRnAevCqoNrpDnz1qpC3XY0oxbHglsq/gqc7z3Yit8uKVHpSdGSfJat7gVtf/qh9lRrI67hVjr4f76UqztVMszz5oMqWrxEWXI93U/p2OxdtuwLVYSNLsN3CujYn15ijB9mqx0x+d55vBRcpBm4e69urDnXpnyELspphOuc8+xFniW7m5ZVvtYfPzyaGsShjp7geiXgyTC+mP8EOlreAtiJRfzkMZQ/Wu+sfGO9n8qH6wMUklh8Y8FjO8Br7ql74BKUyxHvtxIEL2hd0Wu8qUu6XvK0bUNaDlndhVzpYmJb1itwz3O2D4zw1RJRVf1h4J1c3hcWL87kb4AhodKCGczXDPQMyVyCJxnSBgP4k4cUiNRHXx9RpcQDOTtQ1gzT9VrGP9iO7k8a75oZDf2FuLUt9Gqy68/IYNzXS+9z6GbftWLND4ZtQ7ObLzXIH6c/Y/dDdv/aXUJFuh1ymGIQCH3cDGQHPADay3o0c/0y8WKPBmIv9f4gyWwH0mr+cq70PmjAwqMcjh5MPIEzrOUfssHVlGJixFuasPohD0oFH4u2cXx/0kEsAbPWUilLosEeDoVeOAvzNr7wFZ/T0ICWiqD1HDZzHkqwBr0h4MtKE0D1VH51rSRrTw4NZVObceffGJAW/57D+8s6Xj0ULkIXLpYoGBISjvN3U/qNhax5eXoKSjXJ1LDZZnwxU+v/u4rgwq4O/GdacWtCHCp8j0jtwdM4xbQthNsBQo4qDVXySylN+eK5d2keYNsN0kLoVS1i5kuzK9WOYSPrKYpyyqwbhzo5b/VjapYSR43x8WpD2zFh7Cd47fiBRmb8srme5gPOL6pjVgMCf4I2FoG98Mdy+OOmeiPu2tToJgetPL4tGp0eHmmmxjhhxnpPK3buZ/eslF0kxErf3a/zsFCVSYf6DIOxl9aDGwCjf8wPDolj1tl1+L0zj2c5lwziRPH+53xCT9NsCLV3wDlp2J91SqpK3w7LQ6N1o9xiRvwryVPiMO16Vz8oRbvOnCl1+niv5cYPxRuNhP+oh9xeAB6u7TLdKDe268tfPkP2HsL/T/z7djVDVc18XTW1zjQi1vdZJRrlAKiXJ8zqmxFHXfAq0/BGADAQsIx/hAHShbbV6iTt3QVj3MtiYV6x5cq2I7n3e3q4xYyXEiMtqD235i6xjtpNsoGAETXZ0L3l1RdOINjagc7B3zb33RsKpj1yo9bkF2nVNDUT+s5QtbuQCnf4nRpj/AlUrUt5C8lAD+DiQtdlcM21/qZ2gvU5iGah1t1oNnV0+wnG6az6aza4iP1JbscaVB/8W/h31gdCQ+AmaQGLcy28wGM/AKhAOuhQbDnYBm1mgJHTWOg28wBYspsO/hx4l+/yYAbZpDsQ8HnVdIPDkj0/kEygJrj6SenOo5n90MZE7X0xGddlLzhlOeIGKqzf0kxpPXzyXwtZ5UxSzBg3t30A60lRtMmF8JwgU1dDCx/W17w7EdHK81/XjeDqfXoj7avzhmskc5pDMXhkB18/llFX3+qlDs/IrmhnNHgBc5CKtgSOBqCXRfODzBTz4GQeGcR57XHICMfrvI/agDH4SYHwMw2Pgac1vCyde2DY0AvVlr4X6ESRkKmlCIhr39xpEkgZ54sGm32FxBO82hr16vclOGj5pa9V3DpbDBup3wqvgSPt5r85AOOwGcpuJeyvQIAldjLxDlWDN2TqVr3fWfQ6mELb6gwo0+2nEr5xbYKfH0anseBnCIhQyVs0B1yUz7H0/oC4DnooYL9vPTJVrJBrXzc6h3npKJSpZ2RNLmfKTHI42kVNnW6GS0XD0vhBfTUO9mLSqtex6DDChfKJCbrA9BrrcA74Dxc5eefFTIeO8sAhHcO/l7nCyyjDvrERUlLztXqmlymgwL9B6LHSUYL+tbmMQVagNSQbQxZsdgPu5npTK7NAFz4cdX+1lwBclkCKiaisYr0V2AgUDs5F0oPMzge4EUAB+eEwjsGpq/A/QBOBEcOuZOXx1DxE/PvehndVacIZH8k1xEU0wgs4RTXFDcI3chD+qDvHIHU8j5J05hjc+3fHuZnQijYDbYpIuJuPpGxallP94KmjPGxj4CI7wAnOhnEg1P1AZ3Td64TVeqdAdBAAOpWJRz2j3Z8iaH45ZvJW5S5HM7KuSsAyUnNlV83SwBphhe1VjDg6CG7mXVVuod4MNEbiN2nkFt8P375tjHfq3jbwYb6zeBvGM5G16G5INBT0X81bR0hd8fW3LngQZpKmjizYoxo8i26Ag1aKtf6LhpLF2PBpddPu03lhACNw3rbpTaLYgwDAvHb7K/NB7bpZEDIw9x7uy+fgBBhdvjMTvEO5SL7FFT6upxhPvA6fTUegkcHDaiPXzbQyPgpLOLlLDK5Gfn1+Xlam5F/GVyvb2cQh0zKwFYyBtBfoKV51OBBl2EqezfQsVvGHkVInlKwNoycI0CNCQsJfLuOfZs4epk6dgVJr48veAWJKz0cC/+rV5TAZgpehv93tFBnhmx/efnJtF3P2HhIn8qN2j/jysMij+t/VR1j67OotsCyXq9Sxo90a11cWRHZUXjxALNhiNZdtowR5REbst/Ij3Ki73VovC/DehXCQy8Kb+OALgZNxF0rDvr2onuh4uJKWY8/CZl1ltz5vj/WqXiOBm1XywkhGSCFGjHoDntZT+ThOgtBSzlyeyRTs+uSEpGakX96XQIYTnQh6Bqu9aWjL/RmIKqDomLtmnQM5hWG6bC9jq0mNkwkRemaiRXDO+3azMPOwgo2LPRO90bo0TchJID/aASyeGlrY+r+kRBeU9TXjizWd6CUaljYM9Zaf+vMuz3ySlkkbHxeDBvju3kwenbSVWgbA58bDA+RfpHDUtcxTndrtnvd3XxOazfX040jNcFKdCAsy/93LS0byKcABsSa3mC9UXQoxe3PALneqQZMdO6ACKIiKYgCHn4YfLd9WDVO5laL6yLx1WkNiVz68s/dQWNQtZ5MIs1e6xl3GLtsHy7D9rBdoZp0B+evionoq75EuHDO4Qk2y8kw/w+9KXYcwP6I5IQv06vvH95xqTyG+FOFbVNgD7naSttmsXyL3dQyTdEa5dAC/cngWkAhv0z4onU+dXt2dW/hWhbTWxjMePcahEKqItKZxh2ge/yb+WeqEI+oRdwfkm9dSflURx8CRi1CcpgvNVKgM+7+zwebKuAOuCZEBNJ/rRcJP3DSA106ODXqaAGaV1xkD9ho2DSl/3Yvf75gQomfgXtN9tShu+16+UDaVl5/7nTpW9OCeVQ57PONvsF9mMnS39u8QaigI6SesopjmISEI18phMK9dSUjXDZ1JjhnrncCjWQpq8ft0fY5/qqlglihbJSjwYT1RXp52qVkp1kqbdGNaZweH6lKF9SguyheSlInCr85H8QoNraOXRn0meZ9V1SkKx0I/PffXhWMy/88fsp00uEWtibqSNky3sjFsPQtplwOK3DMRKCrsJN2YWERYqe4LU0c4h+hHzx+AbzoeF3C2vAVBW4xtC9ECnuObtH6vFi8GPYk/XHskQRydxEhqwfLeVmqat8nvP9OKcSbx08Fb3f0yhOIWsa5pxRdidjRD3VGOpa75Y9f63zWQmFjXEPCLASCvNNctGcL/L+9aNd+oZxpX9Cs4tMDx0idXASGtlUb8L/zm8J4P7/zD+pqpxb6PENdfFAgiZqK4bLmH/DnKbhVhEQbt2FiU2509o9da2MGljCFqQoGN+EgYHOVtXGOgaqnCDsqzlcNHmpj6BgzWLcsnNomwpDuoYuLlH1Qwqar1Hge5aaSA+W5KPVwLmh5hkI+vNpJfN+cff2Fsjhf772mxIZ5+OddNwk40Phv0FQjzy9AJarAMNNStexGYr5tJrPhtytO7WbROXr3PR3jfJUEcCWpwdFu2TdP3gTojKtvrdjdbUhAtYC3dEk9NbIcbeLl6J/LqqxnH6+vrsRAXOHIPrFQGtKeVL/uSIW7aLS/XJRtxQIPHL0xeCAGtvu4NBH3Qq2IrpZYmd8vdjtJmrYWYLjSe8M/1Y8OSU3ZcGerV6IIAAnuDRdTMCUKmMOxaUePMi3tb5TOoD6S0XOli+Ze6ND+7UJ/nE+D4IiAXRcDDyvPcXMTNuwrStW7PRNi+DM7AfQQKfzitFqU0acIAzuYwV/SwfZJ0zNoQIt832XIfs2IECmu9+eZwfBFkm90YbSBHm/HM7z8mUMdemv3hIFpN2g18+OnhVR4H89sDVatXx9NiB/BuZOvbSYRjtFRKwrp6F0hi5vypMQB9Tf61e+rou3gRokQYBjLvqalRdKS3nrfykQAd/+amjtPBFHC/QNFhZjEmQxuHIFJi2VoWPn+NzFkug69UXjy19ulGwFL95qvZb3Gbs+qSELCg6fWUtg5D6OZiVa034PqJikLrpwkv5Fx0pHX2CpE1W3ArYsd0rG4Oxou7iVTxQyILbKi2zxhvhf/0WHlaUaRoH9gFuz+kNyAqAnARznu+WRzMeTJs3gxe59CxbpORwsgliWjNgXzHNQXV0bFdG6zIzv3KOZMpX15lycvxyNihaXpIYM5qpzVwxLef+wncFn5xu/5rgA6HiyXagf62qPMd9yJwfi0jqgd/ugdvBIpheRZxeMNHv3CS9hzVNXsti7UtsN4mUh6LLqP5GMb0nv0t+FyRnUymtoTO2ZrJgJilhMOr/bkbb8MZFDGg3exU4xXoHgKGhBTlDVMeg26PU1nX/TU5blK7jmZbvMozRaqG4xIBloovC0aoNYJsfIadEg5oD7jRzYpLpObeG+ZzYza4z0q6VGQvT1TQenn7zXXZmGV6L+KXVaKwmw1MaqyIz90wDkOgBpTxIrxUCsAoIxemG0naLsPSfz7vtCYSIKliHpDFutci/Q+AmZ1jXjXnuM4HKj+usiPg2c7aS7M3SdPWLnMP7NF226k1eFIzaUt8rQ2P/x9WrL5KNn30Ug65vNvpwVgoXAphFlJKYMK5a7ry88P730/cpmYLau4X9xQMMXzcaauCbtKPz3BDdZtYSu1zJjQPRZa4PyCXnRqAd/wFC/s1maSanruNXJPjH5PjI3nyi46u4dYKfb8gwfLSMol93tJ0ifjSLq48mJclNxH11rdXPbb9eLqjChwxEsD9mynNRp6D5E+gebemCELfnUf6Qo2K1bRYHRjzYkPXGRye/ArN69G1LRzWB40GE1g9czSRBtBj7HBQQ5oAfGivf9iPowVdm6dBtdNcShc7vlqIplGOUbIxRRplf5hMM8X5P+VU17sD9Eoryh2SABGc3WPpcJ/DNOLI7vIUGLxHCjFz8/Bq+KoXNLVCnZ5OYrvzF3uBqg16IFVZVfL9mIsRiXR1DXovtbCP2sAYdi3pKtSxS0A+jWISmEzT8SetdMhTLRTT0VNcUx/XzQa+IWJFKqEuLaSRCyXCvORe0VZfB8NMVE1Hwmfj8uqytNMZex47URcH/jQKidduNznoNCrMgUmxW63Qeb5OGC9s9dUPTx/ClCKt/vTJ4jnbJmJ5/oMruvPq0pyUz28i8nJ1KW7xGlpC3jKEdj+Axr2B53mCbRpHYkDsuY8p76LHxZLzG/VzsI9IaZPUDFg89Y9fZda5g36EIBFHIdWbz0UekAZ5JJ5pqq+WsRiD4jegIhM04ovxLP49X6orMAs2jlxdbbBu3h3ilvDUG2/ejvBCgr0OD+eWYkXnBcF4qdQLytLNLPjTuYa9pFDHmDNx1wGaI5cLVj/O7lA==' as c FROM generate_series(1, 30) AS i; +ANALYZE uao_update_toast; +-- Now perform updates +\set QUIET off +UPDATE uao_update_toast SET c = '' WHERE a <= 10; +UPDATE 10 +UPDATE uao_update_toast SET c = 'sIyI/Ynw/BliTF5FTltp/BQgVpo2aSxT6qXI0+xJc8VnFJ4XPFyFV9V2b1qHhfmLpbEHOW2APhtuJYwk5z2JbXltD1yOY1mgHJ9NH4rwxHMvOwMBOQkqx/WH7wH+QY6DckUhbdzooSgGnaPZNc5J/KsxPhVb2AsiQDB4O2Kwb0dIe6DHVRtRDHxSfueTBgVNANGO1AG5hp/UTuiWF2TJRFQEAKeU9BfNTIwUl/gEgTmZT8WP4OyH0jMi6sNj42D19t7oNx6P46OY0VndlpDB8X0Ilg1n3TAJ8iRJQCCEVCjgc2jzaSKJrsZ+VYcoOBFYgXhARevfvLLJcPbPmVZVitkCcq4JHF0JplwATsyJopGpppnsE68XNe/T5sj3UgMfUYzjkmTsM1ty5BpwAx/8quwSe0BoI/Kqi3ZqWjS1mTtHyZB5DeP0xxrKn7mNgbrRgdcpP+52c5lQMxXLcl+IvPJWH+SnzeDQrCHS0Ylu2M24q25FCJlSBcjcEKMig+PE0ct6w2QcXB3cMruMJsueJQg6xZxkhYeMzysbAzo0mj9whGzoeWWFlz6KwXbW6GSvH/AsNMR5JprnkSFzuzUNJBGh/0AmYAJ1K8N1FSVhwYH2UCm6mQMEydD9U/YMvGWa2S2yH2ShMtW/+Pw0N4TrA1yVFnAMAUBe0tGX6QO3Tm3DKjFv3T9GhJ8DDrxEOftUq2i0cOVDa8Ul5ZdIZ3V8sa3l4mtBrRNGiVbNl3LD/9Juf3s6AAE5MgvTtSNYS1uVOzYeuse/669ZNgo1xc0TQ5qpozHvdCAQPTM5uEOKuK18vs5eEh+KgfKa1IGxg5nU/t5Jmwwcoc9FYcA4vqZDb+dPBnNW/Bd4oql9Xe5S5kNFC5xhTyuEttCWPPAGWdYTzio1nnFFnTyn3uuwtNCggoSI2iP1dlfjmNhGHYOjlSerEElpz6obY2oIz5j0LXVPX04BJjXUP+0OXRe+HaGwVPShVbSBZgcFu07aXuFLMA5ZQBrsgsZMbLYi7PtFCQYpiYaLJ2vp44FAAS5zx6/sLjVdQLY22aVCmN/YmktcS4dMOtQ/bZUbichftUnG9sve5hM0ePsbbkCgILHbpw2hL8aK0I1a8PoAHVhnLrAbATd4qvlCGCcI6QFWTeFu+EWVVWQBDitKCF/j1O4/Alu6xXFjto4bnDXYSsSELK3a+bPJWpx+9lIWlziWThyeRCIq6AbwD4+71OVJaK/USJMBfyQV0O+3AyKz1I0UcvU+yqUXq3j86R1FcPvMCgGP0ANAkFpf8S55Ra17df3OIgP6GSbF8g3Mk46oZnkF+IyTIZ9x4Yab2aer9lMb+qqvlAcoxXftrHl8pfMXAf5yqAN5tXBb+4Sq/9kMChrkLSuNeeYjmzFNbO2+smu9yvba9YFyjhmxdePQltxyt8eDYEvGbnUgXIsn3Gngkh7hzPW2Ao7m8uWPZ37HV5Jfm0rukubMD149IocSwnX1UYzAigBSZUc9vl91AHOc/1Q1ePDzR4egM1fJPoDeKAsDOr37UhF3DLeEbusSetvlkrvY6eV2ER1fiZI9IMdmjqUbRabp8F814eyvx54HMKpA/QhEXXdFsEJvwkVcH5ApFU1FXh7le7mSHHN8HaUsG5R93W0w7gCtxCAxVIu01ChXqni7EyVDTM7Qq+7y4+0P6jjrOQhy0CcImO4hPWy7kt3DUQ1SIWTOE1TPnCwiup1aWztJBGI8cogOVZMrEnIfdvnJXKtPeNSnct9UdlO/GnSJ1qGuuGuR6WP62XUn1Ax4GO61gFoR14RG1IzA6SXN0yE6b6AZFrDkE7QgnetvDXOF47uA4kQYUrrkrJptHPaU2iOzDK4hVNziHvBAozPEqrG+dD7q4qYpk/R0LV5HGNEpn33WAJwn5FOXanIgQJsKqMdzD2ELMY4S6utGmxx1waDi8dX642to9q0yaemblI6jbY1j7fCave6QkFRaKnmbk7IPB6BDwgu1dwTjxFDov5jtki2NCmLZb9WlVS/NWNoSx7kK4GcsOEhWszVSRjM0GpmEmLMJgQNrcoUb8aANCKy0UFqRZyflC9Gu30jc8Tx0Cb0+PJt6Z/l15n5zOhpsBJD2CCHBfKddor2DwPbutjthLGwFx9bigkAnP9bRPy72AgP/SNLOCyilKGjybhYMo2FSsH6Mh+5f9AsZse0mmY3i+cUiwk+gKfbJ/SJWlG6An9zauNyYFbGt3SmG/QCw7sxjrc9G+dVVBNZASkNGDQz8xg4OpRi4ZyVBTr1kd/b6KR2P44KqN1kGpQRT5mhfT1CefAvqy36YsTrjFYwgjc4O/DioVi25o1a5qt3oqtH8TgqpWFnPIVChm1vblUV8xKbdJ6dQXe5CaksigAQo2ynpDbCpNwWEGm3VmyGCgWnh6PNuxU779YptR8HSwfN6KGL1iRihPq38ohxA/TGGpXhzKPAcKXRZ+d1q/3vCx8xZBwweDA5J4LDb4AppGh/sYzeHmLod42g6XAz4CdIDgJUg35ZTyamUMr60d9CPeVi95CaiGheGCXAyvrHVTxXYlhVw8QI3ZOCimQVbdSQDYHDnWhK6wzjD77vR92qMOzoSd5w09mnfw2ZNqtHXUUlZeW9JVn9PW7W+vbjIhjHDxz398pPsAqzHjQFqegZo3+tSH3BAnNxLHDiI5hKm2Y2/6nV1O//A8U2KQ9rv635QWokuTeGdV4ItMwNPhhKQHB6WqDIv3dMkKkIlBtt9uWMFZOG89biuSJJjydgzeW4EfFLqyQMQ5L5d2RyCzCjMe0XbvTEaA/rASs2tan1eMSrexpiq+eAc3w4HP5zw7YW1IJFpBVbyYt4UQNYYO7sKUK7GfGkzTKE0rHm5MHECn8QXl00YC/jz58xSThQdYvxmEmwyqDMkPTH8WHWtpHJ1Zvkn3n4Z/v3KVU8ijLfX9QuMb4aIsx4KPvf6TSuiOeYNemrB+FF5ExLlC/pazJj6pELOlGIuS5YjNDWxfLT4hZNpOXxwagbdtNBdkpPjw+SW3JUDHOizXSaiYbYyuCHsfi9m0yRerDHEUmUwIXJtWrusr7t9i2S29AValDiNVH8BLxi7KjW5pRuY+u/3hTHXmB8U/YcUFNwZzTokzYBxVW2aDJ1boXrtpEvKpwGKp73aCGkoVAVrLyvXtdMhkTuvyJG3v0Hq6ePelH3ie/9SuQ5UP+K3yqyz9et60ArZXM8dPaaHOYINUheiA/YqysepCy24S3xW8MlH5LT51FadfcLlQq/kz+MF79v7papxJXphgI8VfU7oM1v+tZv1y1ajeZ2FmfTGGP/hjLAcoPmStDqFo1nfhIKvdXmTH7IY6xQna8Uh/UKtrcXXIzvevgKYBa/CDW72gWK9vR5r0STnwTCct1aeCOjsh64bZkTM3tktU4owR+nenSuJ3FfXKan0wCQLrCo/Ywd8583DaOrIjc3H7RYkOvZoPkqO3F6LmXuxsCqU1FvPSnSfWOs+z/TWTsRmMDQk0DIAYyPs/SjMO2ISO3VbuD61XHenQ9PCUz6xtI+ivSGEeREp7EvDdKgZ4Bj0qB03Fodx7N7vt6vDh9JtcSZEe+1dqiDOtzbfy+OuoZD1wOuPTW0NW3aeAamd70NcBBCcN9Vm9gwkiVlVzw/jKIiv3YJcWz5rAUDefKv98tkbwQw6iZRwsu/OQPKQY8i7fbbB+RimDMxBhAzjTsF0XzHFAR5EcdUoKMRsOrOQXU4NcWx8S9cYqtI1o8RMv8ICaxB+bHnXzuF5LzRmtcuC0dJZlj3V9imzJeT1+mx70dzBXwHqDweYVYTTRCRzmaHgq9uRAcUqTeFhMSnCmmlwukl3MVBTxdnsASBeDlp/A5PxUZaFBll9W8aNTXUrrIt2j8vuznYID3buiAn/Bcvo7YfKO7tgtJVpDrXqNJKQvA4NWBxXDyZqo8xQF73EnwEOsJc+D7/RTf+Y9D5zXbZ+ufvMGkKaMFd4n+17PyMJ3nxFRw0+EieGJX0AIvA/69KBxcJ7U5RJ4prHKOiyUbH36hZka8qBd4dTUdEUjGzcf3iR21bIHdf0eeXjpcykbrxkQ62YDDWl1buTrYGvypBtC+bGzkKCXoHSKigod0i4nmV5h7qSZe3OtG69o7i9khd7stoglQEHQegVeHZkq/T3dIXhX8Z2tFvVLJr/40h18g2JHUpZQsp1ejjJ7/woTXCtEER1LQi0kUT/5XPmRqzAR6kEAQvsDSjH2wizytBYb5IEddAf9dkCBEAOfwK3I6AVXijz5FScxSMislBaA6MDf4HAXzmJhgePdgdPoxYIoF9w/xrnBQW9BocBNBP+e6uYRrx4B1gI35rfXhIF0R4iIYBULFUYT9gnOw6swlsiGmqtfLsLzyw0WABD4Za1dT+WhsMFHAf8oo8RjW1RgbeGkbZk9Sr10GfL9aqianmOOOg7s7LYuvN/ppLtmA29YKUKKQktB7AMmkN2SOT54W8ykc+8bt0kgOhmjz5UPxqC/n4dHv0apCG5ORElv9fXAPxaTSLxs6ngmTchuGJmVS7liH+pxtstDysf6fMPA4E6sfX7/+0rKYXdIH1JQIxUePzvuV1wXcUKfW8YWdBT6KyVDRyOFjSlwbuo3QRMLf+dgz7SujqD7Ba550K/Zt/ALNouF2+q13jNYQ5EJsgHcc+uT0b6kkHuOI7SuqMZA/kRYufl3/ZzLWpGjuVKPztT7YY3MsgyBNfkQehXBvnjRfl51mrppQXoVejKkMJR+b/bcLZ1hPnf7ss4NNSdyu9yMsCX0bneqpwe2tZsa3kgsFNNZuTlLE4YwneaRwZC/OkYgHXyM8SWVa87fSQfyrx5ZAQ4v9vc3R4UAaezT2bYk9JKM+AJg96CUp7+VGGk3U6Ij7LbahTCG/4OxhX484PZ7VksEV5+kK36b6pZK8ec6WM2CJUO0KychYE0t3mdCmvRCfGzaYOQpm23+go6NmutxKx7WnrV2fSENlgHUVnYAIqKy17nXg2MLtOfNKSdk1UOqr2P+THhESYfm/Zd9owJJ4bqzvbRV3ZNo888rq3F1MqQrN9PpNK5LcxugOpTgtBbXzzL1RzhBOO3LSDClv307IFbNSL9bOloZGYHT8IMV0S9HLlssj0PymgWY2gis4co5DG3y2QHv3SC1FAyCj4QnCQAz1m/ZqyaO/avT535SLBq71j3ImkGSum7pHCKZUm87CgC+33mj8LJKj9NQ1DmozICtJ6XiR/BGPG5sOT9+p0VYHat9iGqAEM1NDDF7iOuIBd0aj1eP636UOvWX3Y5qMDZ9UXwfPLPmMp48B8gx09bAqarEooVtClmRw8R9u1BiaBy5449iAyqeDGF/NmQJ8Rqbg9jFSFUcdvi75LKlVT+8Eu83aaeWuUjILlqksEw+7s8/jnbaMWam1j3HTdk3iV+RaUlsKDpUV980QgOYQkCo0rd4+0Cr5xZ2aKAo2ttisebF4ypo7pru7n2X1L6nbIpGqEcHFH3s+O3RpndMnYk6H+kK3HyxqC5/7dENRsAq5Np5IrnmVnaP8HvUVzv2YAtkk2vDhGS/LBsmzdPGiJjCEncgiq5DRQFLbW9GfHkYb5Wj4di3unDzXfP+yHeyJQY6IUr7zJ/FEf7x9l23EPUEssv3nwjK492bmG+s4POZTHKTblcIjHb/WT+wvwoI4zlNXRxPwwybLKMRMyJRJfAFQEZqhWLO2J/NsRgYiOrIVfO4xqWISQakLBoU0WYbcWH256k4hO5l702BjMdxSV9DdKEgoBbXvdo59pXp72/EaRi0l7W7HMB4Z5VmKWhWhn/PEloWL76Te4DlsPhfckcQQdCkCU9w83rkNtZuY0PfL6aRxxbFn1lKw8/Hb4d5c9pSXKheMx4hXTJgz5AdfDflDG+0NY78yVzEQlxglrqx10twz9QHCdoZGLWVGD5rCHTTxnQ7X2iQalehYuB9nKXzL/XNXZYKKHTPDFHaCNqPy7NR81cv/vWPhQF5W2qefWPHGbB5Tamr3rFCSxgFP19nBHIxeGcJbQUepS8hmk0+q3x7JNdiMo6yqLAKoV8D9oYNvr2tXX/txStIN8YNt52iq+DVJ0E5kuLHbptTa1G5Gf5B5FKthyLrGrXfQ6wfwizrOjyrHUTZzEx5VVjbngT8dXM7bMtpUh8I940wMPXA78g1ovm9VjoSmeF3NgFOxID1W77lHwck8dZmwOnxFVnqw8koKODRWmENnOmUPnZCkAPBDomVoUwhETUmjnMw5E67Trnei4s6Vv+CHhQOZXYqj3loqyM2fqYClROFSfnSRSxRvOzye9yVEYexnV429tRs4TfkHnzjKLPlA9dSARDsOwc3hwfU4C7BtT9UZCNcoozC2AYCXKM4Hq3bOUomyJWHlm+ig6icAGMS4TQjAjf6jTy4bMHKePEb5raNiu8b2F/NDICIv+YwnaAX9KX5xtuKV0XbrUWQgDwkRhPPFzvPtCxwtgsHx5xNU31XAToQWt7k9acWmJ0DGurIFFpUKO5t7tEYWGaB9p0Xnrz3GjaCpjUZ9C9VKRuxAi2eDf9a0ER8+KYjEL+z25S07P5+YTOgvRFz8cBHtQbpuU5rVr6H3rS3XdOK6yc2MCTWUDlGGMfNdxjW3a7afxgsHPadH0HR+CEhVOjHH6nA7/SX9A4J2D/3eVzwKseHtecmKmUvumDgpxq0a33ji6042lLHx2+DSQb0zUxShQbXxkCqGsERMVKvsKaPJB0QXB0scWXJDGudxKJrKpRvIOsrSeiMPlTR5s4ELObvGYaUGHZ1cLytr7qoRYOewV6iLRsh9mTrqquFXXa1TUS04oNn6+oGWX1aFDSyQogdLkmOMKhkbSOoEuIruUWCAlHb+KV4VmeU1DBw2xBjfhUZo9SjTAuEeDD9uihPXtx7zIAkXhwrc0/fy8Lp05Zz4rMWyUkXxdQbikTTFk2a6PuH+OS2yW1iDRRgki/5/vVVHXDXI5EW0EuvhdV0jsodf6b4b0lVM6MaEFzuqCj01TxA0XX8mbGDUUUV9gEyzXB0hdGl5id5YO3saz2rK9PmGVcFqMpBmz4mEcRIQ7RZPunUXlIt+g8ZINCNYfAsPr5IuVqZIIKOtRlYVPWVAQDmegwjhumzZ4tgvqhKUlPjzsgnR1MtP8QwP1bMDrzt/xuiIotnjmZA+hgrGOqdbqhnSRUCejE3b+uVTvdjHvl0eGm5JIXRJcFqfcFplyn7N1RYQ8uV9uGh8ymP66NsXwxJ9k9OwW8I5Fq3q3Xcpl23UdOeaSdG9nUR6BhhkCuOb5PwVWcO/LJLZSLWuPul2/F6l5FZFVrmNutfgDgwejJpqMVYugrpIurh/LVrBqFCUWKg8iix+xeWgGIhCqzusD7o2n2Ci0m3WIgOCJE5MQo9Wvo61LCiqDCYom0nxcM3fZsdondSmEOhz3lSs/5k8UQ3tJZYsB/2e6+iAOuTWgRj5ys/dGyaDhKCsDtgFZdiKttJ2LmcT4t1I6dMt0oOn7LLoQt/R6uKRP5pkzTg5fV5VVpnpuXmWTlMfy9v27mPpxHiN2rIR+dcy1khKrjhKeEIfAjAxWpcLT8BqIPjQ7IEEotn7977/bLOmEl5eFAuXEanyGQtNlp6jlvzRoIiCm8Y1gKtnF/dmmh2aeEkrAyDkHmlvpAFnDojM56db7YfmHYC1i1+BHZVFJWEu8wDFNslL6Y8hZpvb52/rckx0qN5SIMoFpqUy7h7nGN/XV/PJ+K1ev6wr+lTqNPuYJm3qVbUlPkBKUbQ/5rRy9Nh9VFD4St0LTlIfgZWS5uV/i7haWT6i5PWjmWSW3yN4tLmmgr3F8KGvOp4lScf1cV01RVsihhqFngQz7CPGwmNCIuHwR04XBvS0S61THQMM26UU2PukdHNZK9yurlYCDAJ85rWzFbTfwMi/n3VhSpwkiiRxrvaKmBFRLophrYD7XvqpmfbVWDlV5+pfR6RaujCWbv5+V17YioO1MDJSbGK1JLGEOJrmBgqhDZRJNFkWpKhPTTc95x8QqyuGWgkNnRK9IS+xXy+61nqNB8u03pq7m+CwjasQ7Ozm+TRovm+9a4MHGjMbUmzlsrB2P7swY5ZZ7uriy77Xea0YivRWT709DS+bJZKUMuzFz3O2CDM+3oVeh2zP5Wn3Qan674qqYR1zoP+ttHWNLKN8lVAbUu7p55J0dU/oa4kk4SDia6MX2owUwNKqTb7b8XKjuGab/A7CxDRXSMpD/RP8YVQIr5XZBxebpZmg4LMC0DqmTf4MfLaux3WKblWb9JRkS951H6S/GLIkT3gB0pmDSg5pzOEK/Jylyd2gHYBPkVTWE2G72JrRCOw9Ta01F4gnRGRV/+QqClVmcAnh+Ru9g6PtToJjpd0dWoNV/uQypkybazU2hpcwkDv0ryKDUavBINGSvXpIbZoCHvZ5rYJshdrt2PgaGAv9aoirRNgydu0HhmdaBr4Et1tXimmnE/BYX370daMKnszlyjjvOm1w7ggJFDHWy6gImNNoUNgmh/KYJtsXyUdDzC+Epn8TlnJgJE0wjbrY+Nl/ZpqzFudeW3+cwxjvzjOHm3XLoziZd8pINMdWqgJyA7WJ8fneZW+Giy/qYYmFntFGAcM6JFCarL1dl6+x4i5Nh1AfFQSSDvozUxdG/RlyzYCtRP51QS1axIrvhmG1JQFqSdk527z3or0zhfLx60H/MOuzbyGaucqCAxVfRWEobsdT7Al3kud9JuB3u82i+r8V/M1AlHYALkESoCh33o1dvHyQjnqoQWWSy1G7QY5zmbXMJa24JOh3ih2HBWS6s6v9mrHmQB/pLOBFS0rLeNofUJ8Im8cuU4lrW+1I8HBExfAYvxCW6ILtt4o53OB2m5tH1fb9DDxbov9wZmbfX5a/xWIFNeH9BRAWKHSiUGo4mf8l3Nafm/aN0ZfcnzI0t1xl0fXFFeRUMiV6eBWFy9dEdn1mLiCOXgVZMZVFEPDWG1yP1GvM1ZD0yaKmSQVjQHN3KETm1zQxwN4eYIh6fvchtXs9ySzYpKizbGdpet5QJvkz2/xH/hRvYmK0DyNqdKm7+PthevEaz6nLGQd7qAPAkpjpe3JzDu4MnmKFN1Weis8VeaUygXtAFLIlBvYlQagk9SnThfnUu5orX5jBzq6OruZqEwg7W3rk2g7IMo33S7vqlDpe338oB1JmEGIf+AC9qIJ12rup8AOiWCV0v3L4OFc7nBf//VJf391XVHFyPcCVDsA8Vc75NEw1mNC8CWsjc0Fb0apRhips3v6mKF1fmF5utHz0V+nzWvAfEiaXFsf/fHqsqluLvkOo24JimsZB3MwevrKPmVsLSCcui4uIMKXHxKp5AQy+L7hIes6JdXcGNyhD6N3VyII9wCHv8v8BDyQVVvKgxlzcixmWbuc5zZPqUk7iQozLgiyGgbhecqXU+RnCFax08dEK3/JGDRaUjxppIK72/b1xYtGMPBIbs7mPvbhwc+L3wGsd6TU03gxmj5dEBaQrfe3VFkJsFEmcjVrKY1hBtu+FZEWGWkSPn/kzpdKFHYt8TtSjTeGBgOn3x6lYV62l83qdXzWWqYCwy9zMYe7YIbtB6uJiLG6S5PbGXmj5beM9mse/w6TR1E7Ajr/6lFI6HmMpvqLbgViKGF+L4hlR73j3Z3yzIik83uyLVb9S5+0HM+uh3gY/Kd6mpXnCNwfxTvlv78yWh1XkQASqDUAGWndblurkFa5FDucUxULtH0x9+jMl3D1xFGIaLkPx/qYz9HXzbriGIz/0u8rXw7WR9YbXK5bitjATg7rdu1rq4gl9eMeRG+AhzsFzwUHmkUSahZ62uhagK+b6bZeZHW+L/3/lKgcwqfW6oKmvj0M2cb95IoSwjA17ua3qDp1wmGnTVUzsutpfNERMM/82FHEsFinIbE5nq/3PFB1Yl6Bxp48LL5WTbbInO2HA0l/yOgI7EGTDD1vR/Ch9tEjv0t9U84Ljm9nHHIkb79Tn6bWcdyOwXAXleSkAqyxf4sFKsXEwEBwiPJkXJB/wYlfEl0n9GAAn5rTuSNGg8781pU3FpshzpcxpqgenDEBFKQqJW2uyfGTKY85FOolWS6dxs0Fr224pHjFEC2j6ssU90+CiexAnb0nIMgkxbF/HdBVl9zIxQwo5UTEvbzFC7d3L2kJIkX0rTI2mU131kWwDVvskvG0s9dfzfqEOal1NAMIHgnYeYAROrr8xfLmEmjAavtp6EdBrULHGFobd1hQxtlj99F8btMBdGf4cyqmzQbOhkjCOm0VGPS2JzlGoWVSiM8aNssRQoHroXPGOy3ypgVI8xTbTYeDniqjEd9Ysp67j2kJsh+FC1EovS79QeyqaQNTmFmdATPcjG7APrpYtU+QOt2tbI9Lkw6KJvUMnFg/PkaHSo/4+ylaXuwEGLImFKS4n2coLbz25xFGuN9imHEoEIVM+KYPB/i3d1gb6pyHN6mXxZVidtXVkHb3qwHsm0XGpIkU0/5Tlpwwfw9K9mNzJBb813GNsTA5GnGkNBQeCb0488OyFRRo6tysecdc2a5nBDomtovLwQ/7LXzW7v1itWU7yy54VJwn34Q1UtzGaGUMRfjRuDTXsKvrYa1Ui2VmiZKqMZ3H2wUIBoNmfARZUxxnJodS8nPHaUio9aB6SRD9M/QQcYojuN4PCOQ6YqMUuAgScnj+3OUs+mQfSkQegkapL/oLCTdpL8p4LFCY62ujXZyJCTMTb0lodhjvRM6rIPd9UExzoP83dKRaM/xSg85Sn/2baVaonWCZNePA/tT0oENqqr2epZYA74fV5d+pwDOVaQo4T1b1UuitUkom/RpEvVZFmfYBY+gkBNSdjsBExY4JWv5dU0KZfUB02yiVFPZzpaWe/8f1SvaEGYe8yCDLR2F6DTxXTx7YN7dKBU9SwZxm1mnJfkMYzcBr1EeexPLac/Ih6f8RhfmNPF3SkNFS472HzOzwDYfyyOmDTAy7rPq1d052LyYPEWnyC6T52yZUgnB25dy/MXwYBydJZaPa5pdZ9sNZRQWw9qOwDZIPAoxS2mdgD2LPy3tU4DJN2YYq+bwwSRFAjN1E7PTOIP6LaV00X9yt0uiCOMyWthpB7Wy0+ctFlSNmRssjW6d8yTgKivYRcmq3jeUIdV7me2zMz1+OHYA3iJIMguGKOPh4yECwQFZ1bQBEtCaPmTNPed7s0rc1RRKmXjSSIpU2tsv2iCj2x6mGdltZhFYZ5J1uVRVxyx0PcYO8d4hrNbRHHcVaKLeQgodUe+vghj/i2hK7jxLO1LupEBua9kztk0YJiWWtrMkQR6O49mUssQMWgIGY4r7UqEoD7sM6fC8eihUa/3AAFor/ydO4nn1PT+WWkkmYa2jMIp+kSNTtJxssT2oFv1TY7exHm8YhqR0lXMTJqsZ4vOeND4aAq14uuaOs9Ejn1+3oeD178hAQcji/Q7vwB2DRHClag/EVVZFPrTwjpeR9sGerQSbuhkvVNjcnfYegG00k4Hmjxgk6rrO2IV/Dd7j0iBcz1ZLSRNe6EuPawXo3Tpq9lbqmIBNZpKEg/xf8BmKYRSwgQPZrq4Xl96YIKasgM5RQs8mnSJy+mqM7omkm0U1FfrNiyAb64Z/ZbEJg6CuFIeW/Gv3pi/MLCbNejRQzmcxeJML6XbyRjl7S5dqD7b1WJkRaLLW7S+kEw7WTR1jN/8wNvfQT2omZhYBWJnsihpVxlLX5oCF7ieVzdjqEL+4hHYAFpm8nhG4qTh8/Y+v0p31jb77oJKxEaWmFR8DlwzJ71NdhyeL62Xq+VvnzYtl6rOgVr1m/+TkJkOFzkPyC6gtne6SjXCO9h3p2sCdYbA4RGEZ8UdVkmkB53Obg54C7+yws2UOWgsfm3Ft4+3hnh/ZTigxXl10qjKFzNMeFCduS+TTqjWjYUZethkcJxZKsu9xXMxicOKKZOL8rYvalyZmcNWUOx+EEfgiCW2Qr4RGvNJzVO+v78kxMkxlHPDb50cWHQUsaN8f2/M9GdQTwlxkBwzF2iDh0SA3Kihe5Jpe4+XByTNfOVFNUSAx+bGshn4mu6zZbeichw6/4m034R/RPKxTH92WsdbdoYmMoKknWbLMs1gNUueFWuOLX/Ck1m1GQtpyThEBNNhpgZJXB0kOcfRYD9uzF8Kgs6QGIhWQsfEvj7IG/XWH9hidIxjsQOaTXlR1PcTOROVMlxCyrXtvq0gJdwal4l9r0SQ5ecdPYcKJ+mnU2IGMMJhGvQQ14Hi/dB+vlIToTDSwkdL3kwmJXBd4LDoQLk88NGzoVeU320MvE7mXW+SQxknSLUMqLedAVwxQIvx3TnK8o2/hvktwTSCW5ie56/kmVQ9Ttx28kzMQiqAPACm5odIVagF9qfyjnGQGxgCrnaPaDTsxRXO9XJcH1yyA0Sy3WY03kBzAqhtNfyUJWJm0/zSePPCmzbjMNOPYcE+zVzsxAks41dhg+XEzbQ5IqUT2KmnySKomumUpx8jDdaQSCx/RA9mo/MjACK1KrSJFeoh74k8y0YaPrJdnwkzNW+nHqs0V9HT/vCZTsNCpN/oeLhL639IcQKO7jjt5jLf0CrHsy/u+0yhqO6W1SBub2DfeD3AZDTMz3cqL8Wbg8/2nBmZ3/3gRjXE6cFIVNM2ctXmDXJndhDzADHFTxlkmcdGmkIYrmIb6X6kicnx0qjbwEL6o6ZnjVutlGPCa4dXPXS2kfiHZbd9imHjBXv6Wm6Q1LAuknIY1d4llGM0qF2FTylchzmvl5gi9K4GPzE+fcitcQ4vfZj1Q1j6bDyhsXwLIEyoE8zQ8hHiBlumOmbvyHZsmR+WEQfV0gGsXVB/Ek8gRrChaqJgbu7AYhpvtjI/hslv/E8Amj2tW5ytEishtf6Hoad3A9KK7Uyhcz+QhFpgWvLANwldAqtFS1bBAE7ZKl3bm1Tdtw1pVisUBjmFel59ZqKm92+Sqm32T4xsVFx2GNwyyxdFfKCTVvpzKuNrlgyxxV7Yl56Q4zz3WhREgjGSoEs8lNMTM7J/ya02NdxRx/dP/Lnrqcm+W+T58F4u6SR/ZExPkP8r70GIaKzIifuZzG9Hju2aE45YgoI2+K/9wq+pVMfma7uBo5ZahDh8m6UWXbnorjlivDVyD+9ragVtg4rmydpgyEqHlo5+uPlOMhjXpkLnppEc/Kc8BIC1GbVd2SfFjKbgRovDMKzAvSQXJmA0ffT/B24/0rbhbXHUK1wccRlkVHGRcgXj0RI3ete45zcQ9ifxOTvAWR/PrY0ZaFuUp0SSkcerOWXwJNZvlbjlOnYfVcWGuIGJDfhuwiMV+eDZoFhdHbQH0EAsp5l/A3cwMUkrOJdc6Gy8euwBIVzGVaMW6RQ==' WHERE a > 10 AND a <= 20; +UPDATE 10 +UPDATE uao_update_toast SET b = 50 WHERE a > 20 AND a <= 30; +UPDATE 10 +VACUUM uao_update_toast; +VACUUM +SELECT a, b, md5(c::text) FROM uao_update_toast; + a | b | md5 +----+----+---------------------------------- + 1 | 1 | d41d8cd98f00b204e9800998ecf8427e + 2 | 1 | d41d8cd98f00b204e9800998ecf8427e + 3 | 1 | d41d8cd98f00b204e9800998ecf8427e + 4 | 1 | d41d8cd98f00b204e9800998ecf8427e + 5 | 1 | d41d8cd98f00b204e9800998ecf8427e + 6 | 1 | d41d8cd98f00b204e9800998ecf8427e + 7 | 1 | d41d8cd98f00b204e9800998ecf8427e + 8 | 1 | d41d8cd98f00b204e9800998ecf8427e + 9 | 1 | d41d8cd98f00b204e9800998ecf8427e + 10 | 1 | d41d8cd98f00b204e9800998ecf8427e + 11 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 12 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 13 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 14 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 15 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 16 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 17 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 18 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 19 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 20 | 1 | bb2fe6c35888be959312c51c398e1ab3 + 21 | 50 | e4ee815f9133f7754c258622c6c50b4b + 22 | 50 | 2b8c53792716ba8783ef9893499d89a1 + 23 | 50 | ab8e449e69ac56927a11e787bcb97e3c + 24 | 50 | 9914be844e81b8d9a00bdae16dd2a4a2 + 25 | 50 | e2b84087952a14d67b9b4c738ee8e8fb + 26 | 50 | 31b7c34cbebbddc2f58e8ceff409f6a7 + 27 | 50 | eedda1277d366bbd8509f4aa2fa6d6aa + 28 | 50 | 09889ea600ec6ab4325baf6c8fed13e0 + 29 | 50 | 3f7bdfb0f49065b44ec805577607fb12 + 30 | 50 | 4830ad05263d544d83fe4b5ad2dcb84e +(30 rows) + diff --git a/src/test/singlenode_regress/expected/uao_dml/.gitignore b/src/test/singlenode_regress/expected/uao_dml/.gitignore new file mode 100644 index 00000000000..f47cb2045f1 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_dml/.gitignore @@ -0,0 +1 @@ +*.out diff --git a/src/test/singlenode_regress/expected/uao_dml/README b/src/test/singlenode_regress/expected/uao_dml/README new file mode 100644 index 00000000000..6d2cade1965 --- /dev/null +++ b/src/test/singlenode_regress/expected/uao_dml/README @@ -0,0 +1,2 @@ +This directory only contains generated files. +All files in this directory are ignored by .gitignore. diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/alter_table_analyze.out b/src/test/singlenode_regress/expected/uaocs_compaction/alter_table_analyze.out new file mode 100644 index 00000000000..67302fde60e --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/alter_table_analyze.out @@ -0,0 +1,70 @@ +-- @Description Checks analyze and drop column interaction +CREATE TABLE ck_ct_co_analyze1( +text_col text, +bigint_col bigint, +char_vary_col character varying(30), +numeric_col numeric, +int_col int4, +float_col float4, +int_array_col int[], +drop_col numeric, +before_rename_col int4, +change_datatype_col numeric, +a_ts_without timestamp without time zone, +b_ts_with timestamp with time zone, +date_column date) with (appendonly=true, orientation=column); +INSERT INTO ck_ct_co_analyze1 values ('0_zero', 0, '0_zero', 0, 0, 0, '{0}', 0, 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000'); +INSERT INTO ck_ct_co_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001'); +INSERT INTO ck_ct_co_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002'); +select count(*) AS only_visi_tups_ins from ck_ct_co_analyze1; + only_visi_tups_ins +-------------------- + 3 +(1 row) + +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_ins from ck_ct_co_analyze1; + invisi_and_visi_tups_ins +-------------------------- + 3 +(1 row) + +set gp_select_invisible = false; +update ck_ct_co_analyze1 set bigint_col = bigint_col + 1 where text_col = '0_zero'; +select count(*) AS only_visi_tups_upd from ck_ct_co_analyze1; + only_visi_tups_upd +-------------------- + 3 +(1 row) + +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_upd from ck_ct_co_analyze1; + invisi_and_visi_tups_upd +-------------------------- + 4 +(1 row) + +set gp_select_invisible = false; +delete from ck_ct_co_analyze1 where int_col = 2; +select count(*) AS only_visi_tups_del from ck_ct_co_analyze1; + only_visi_tups_del +-------------------- + 2 +(1 row) + +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_del from ck_ct_co_analyze1; + invisi_and_visi_tups_del +-------------------------- + 4 +(1 row) + +set gp_select_invisible = false; +-- +ALTER TABLE ck_ct_co_analyze1 ADD COLUMN added_col character varying(30) default 'test_value'; +ALTER TABLE ck_ct_co_analyze1 DROP COLUMN drop_col ; +ALTER TABLE ck_ct_co_analyze1 RENAME COLUMN before_rename_col TO after_rename_col; +ALTER TABLE ck_ct_co_analyze1 ALTER COLUMN change_datatype_col TYPE int4; +-- start_ignore +ALTER TABLE ck_ct_co_analyze1 set with ( reorganize='true') distributed by (int_col); +-- end_ignore \ No newline at end of file diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/basic.out b/src/test/singlenode_regress/expected/uaocs_compaction/basic.out new file mode 100644 index 00000000000..7eb1d1011ba --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/basic.out @@ -0,0 +1,30 @@ +-- @Description Basic lazy vacuum +CREATE TABLE uaocs_basic (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO uaocs_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i; +INSERT INTO uaocs_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i; +ANALYZE uaocs_basic; +DELETE FROM uaocs_basic WHERE a < 4; +SELECT COUNT(*) FROM uaocs_basic; + count +------- + 14 +(1 row) + +VACUUM uaocs_basic; +-- check if we get the same result afterwards +SELECT COUNT(*) FROM uaocs_basic; + count +------- + 14 +(1 row) + +-- check if we can still insert into the relation +INSERT INTO uaocs_basic VALUES (11, 11); +SELECT COUNT(*) FROM uaocs_basic; + count +------- + 15 +(1 row) + diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/drop_column_update.out b/src/test/singlenode_regress/expected/uaocs_compaction/drop_column_update.out new file mode 100644 index 00000000000..25956b6bf34 --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/drop_column_update.out @@ -0,0 +1,26 @@ +-- @Description Tests dropping a column after a compaction with update +CREATE TABLE uaocs_drop_column_update( +text_col text, +bigint_col bigint, +char_vary_col character varying(30), +int_array_col int[], +drop_col numeric) with (appendonly=true, orientation=column); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'text_col' as the Cloudberry Database 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. +INSERT INTO uaocs_drop_column_update values ('1_zero', 1, '1_zero', '{1}', 1); +ALTER TABLE uaocs_drop_column_update DROP COLUMN drop_col; +Select char_vary_col, int_array_col from uaocs_drop_column_update; + char_vary_col | int_array_col +---------------+--------------- + 1_zero | {1} +(1 row) + +INSERT INTO uaocs_drop_column_update values ('2_zero', 2, '2_zero', '{2}'); +update uaocs_drop_column_update set bigint_col = bigint_col + 1 where text_col = '1_zero'; +Select char_vary_col, int_array_col from uaocs_drop_column_update; + char_vary_col | int_array_col +---------------+--------------- + 1_zero | {1} + 2_zero | {2} +(2 rows) + diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/eof_truncate.out b/src/test/singlenode_regress/expected/uaocs_compaction/eof_truncate.out new file mode 100644 index 00000000000..85565273fe1 --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/eof_truncate.out @@ -0,0 +1,34 @@ +-- @Description Tests the behavior while compacting is disabled +CREATE TABLE uaocs_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +CREATE INDEX uaocs_eof_truncate_index ON uaocs_eof_truncate(b); +BEGIN; +INSERT INTO uaocs_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i; +ANALYZE uaocs_eof_truncate; +COMMIT; +BEGIN; +INSERT INTO uaocs_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i; +ROLLBACK; +SET gp_appendonly_compaction=false; +SELECT COUNT(*) FROM uaocs_eof_truncate; + count +------- + 1000 +(1 row) + +VACUUM uaocs_eof_truncate; +SELECT COUNT(*) FROM uaocs_eof_truncate; + count +------- + 1000 +(1 row) + +-- Insert afterwards +INSERT INTO uaocs_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +SELECT COUNT(*) FROM uaocs_eof_truncate; + count +------- + 1010 +(1 row) + diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/full.out b/src/test/singlenode_regress/expected/uaocs_compaction/full.out new file mode 100644 index 00000000000..dc712c933cc --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/full.out @@ -0,0 +1,31 @@ +-- @Description Test the basic bahavior of vacuum full +CREATE TABLE uaocs_full (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +CREATE INDEX uaocs_full_index ON uaocs_full(b); +INSERT INTO uaocs_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +INSERT INTO uaocs_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +ANALYZE uaocs_full; +DELETE FROM uaocs_full WHERE a < 4; +SELECT COUNT(*) FROM uaocs_full; + count +------- + 14 +(1 row) + +VACUUM FULL uaocs_full; +-- check if we get the same result afterwards +SELECT COUNT(*) FROM uaocs_full; + count +------- + 14 +(1 row) + +-- check if we can still insert into the relation +INSERT INTO uaocs_full VALUES (11, 11); +SELECT COUNT(*) FROM uaocs_full; + count +------- + 15 +(1 row) + diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/full_eof_truncate.out b/src/test/singlenode_regress/expected/uaocs_compaction/full_eof_truncate.out new file mode 100644 index 00000000000..ed7edb6103d --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/full_eof_truncate.out @@ -0,0 +1,34 @@ +-- @Description Tests the behavior while compacting is disabled +CREATE TABLE uaocs_full_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +CREATE INDEX uaocs_full_eof_truncate_index ON uaocs_full_eof_truncate(b); +BEGIN; +INSERT INTO uaocs_full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i; +ANALYZE uaocs_full_eof_truncate; +COMMIT; +BEGIN; +INSERT INTO uaocs_full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i; +ROLLBACK; +SET gp_appendonly_compaction=false; +SELECT COUNT(*) FROM uaocs_full_eof_truncate; + count +------- + 1000 +(1 row) + +VACUUM FULL uaocs_full_eof_truncate; +SELECT COUNT(*) FROM uaocs_full_eof_truncate; + count +------- + 1000 +(1 row) + +-- Insert afterwards +INSERT INTO uaocs_full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +SELECT COUNT(*) FROM uaocs_full_eof_truncate; + count +------- + 1010 +(1 row) + diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/full_threshold.out b/src/test/singlenode_regress/expected/uaocs_compaction/full_threshold.out new file mode 100644 index 00000000000..47d0575c334 --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/full_threshold.out @@ -0,0 +1,14 @@ +-- @Description Tests that that full vacuum is ignoring the threshold guc value. +CREATE TABLE uaocs_full_threshold (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_full_threshold_index ON uaocs_full_threshold(b); +INSERT INTO uaocs_full_threshold SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; +ANALYZE uaocs_full_threshold; +\set QUIET off +VACUUM FULL uaocs_full_threshold; +VACUUM +DELETE FROM uaocs_full_threshold WHERE a < 4; +DELETE 3 +SET gp_appendonly_compaction_threshold=100; +SET +VACUUM FULL uaocs_full_threshold; +VACUUM diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/outdated_partialindex.out b/src/test/singlenode_regress/expected/uaocs_compaction/outdated_partialindex.out new file mode 100644 index 00000000000..e57290f4c5f --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/outdated_partialindex.out @@ -0,0 +1,33 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned in combination with a partial index. +CREATE TABLE uaocs_outdated_partialindex (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_outdated_partialindex_index ON uaocs_outdated_partialindex(b) WHERE b < 20; +INSERT INTO uaocs_outdated_partialindex SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uaocs_outdated_partialindex SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uaocs_outdated_partialindex; +SET enable_seqscan=false; +DELETE FROM uaocs_outdated_partialindex WHERE a < 16; +VACUUM uaocs_outdated_partialindex; +SELECT * FROM uaocs_outdated_partialindex WHERE b = 20; + a | b | c +----+----+---------------------------------------------------------------------------------------------------------------------------------- + 20 | 20 | hello world +(1 row) + +SELECT * FROM uaocs_outdated_partialindex WHERE b = 10; + a | b | c +---+---+--- +(0 rows) + +INSERT INTO uaocs_outdated_partialindex SELECT i as a, i as b, 'Good morning' as c FROM generate_series(101, 110) AS i; +SELECT * FROM uaocs_outdated_partialindex WHERE b = 10; + a | b | c +---+---+--- +(0 rows) + +SELECT * FROM uaocs_outdated_partialindex WHERE b = 102; + a | b | c +-----+-----+---------------------------------------------------------------------------------------------------------------------------------- + 102 | 102 | Good morning +(1 row) + diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/outdatedindex.out b/src/test/singlenode_regress/expected/uaocs_compaction/outdatedindex.out new file mode 100644 index 00000000000..6ba1f9d60e4 --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/outdatedindex.out @@ -0,0 +1,28 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned. +CREATE TABLE uaocs_outdatedindex (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_outdatedindex_index ON uaocs_outdatedindex(b); +INSERT INTO uaocs_outdatedindex SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uaocs_outdatedindex SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uaocs_outdatedindex; +SET enable_seqscan=false; +DELETE FROM uaocs_outdatedindex WHERE a < 16; +VACUUM uaocs_outdatedindex; +SELECT * FROM uaocs_outdatedindex WHERE b = 20; + a | b | c +----+----+---------------------------------------------------------------------------------------------------------------------------------- + 20 | 20 | hello world +(1 row) + +SELECT * FROM uaocs_outdatedindex WHERE b = 10; + a | b | c +---+---+--- +(0 rows) + +INSERT INTO uaocs_outdatedindex SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 10) AS i; +SELECT * FROM uaocs_outdatedindex WHERE b = 10; + a | b | c +----+----+---------------------------------------------------------------------------------------------------------------------------------- + 10 | 10 | Good morning +(1 row) + diff --git a/src/test/singlenode_regress/expected/uaocs_compaction/outdatedindex_abort.out b/src/test/singlenode_regress/expected/uaocs_compaction/outdatedindex_abort.out new file mode 100644 index 00000000000..b1103d6681f --- /dev/null +++ b/src/test/singlenode_regress/expected/uaocs_compaction/outdatedindex_abort.out @@ -0,0 +1,35 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned in combination with aborted inserts. +CREATE TABLE uaocs_outdatedindex_abort (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_outdatedindex_abort_index ON uaocs_outdatedindex_abort(b); +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uaocs_outdatedindex_abort; +SET enable_seqscan=false; +DELETE FROM uaocs_outdatedindex_abort WHERE a < 16; +VACUUM uaocs_outdatedindex_abort; +SELECT * FROM uaocs_outdatedindex_abort WHERE b = 20; + a | b | c +----+----+---------------------------------------------------------------------------------------------------------------------------------- + 20 | 20 | hello world +(1 row) + +SELECT * FROM uaocs_outdatedindex_abort WHERE b = 10; + a | b | c +---+---+--- +(0 rows) + +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 4) AS i; +BEGIN; +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'Good morning' as c FROM generate_series(5, 8) AS i; +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'Good morning' as c FROM generate_series(9, 12) AS i; +ROLLBACK; +SELECT * FROM uaocs_outdatedindex_abort WHERE b < 16; + a | b | c +---+---+---------------------------------------------------------------------------------------------------------------------------------- + 2 | 2 | Good morning + 4 | 4 | Good morning + 1 | 1 | Good morning + 3 | 3 | Good morning +(4 rows) + diff --git a/src/test/singlenode_regress/expected/unicode.out b/src/test/singlenode_regress/expected/unicode.out new file mode 100644 index 00000000000..f2713a23268 --- /dev/null +++ b/src/test/singlenode_regress/expected/unicode.out @@ -0,0 +1,89 @@ +SELECT getdatabaseencoding() <> 'UTF8' AS skip_test \gset +\if :skip_test +\quit +\endif +SELECT U&'\0061\0308bc' <> U&'\00E4bc' COLLATE "C" AS sanity_check; + sanity_check +-------------- + t +(1 row) + +SELECT normalize(''); + normalize +----------- + +(1 row) + +SELECT normalize(U&'\0061\0308\24D1c') = U&'\00E4\24D1c' COLLATE "C" AS test_default; + test_default +-------------- + t +(1 row) + +SELECT normalize(U&'\0061\0308\24D1c', NFC) = U&'\00E4\24D1c' COLLATE "C" AS test_nfc; + test_nfc +---------- + t +(1 row) + +SELECT normalize(U&'\00E4bc', NFC) = U&'\00E4bc' COLLATE "C" AS test_nfc_idem; + test_nfc_idem +--------------- + t +(1 row) + +SELECT normalize(U&'\00E4\24D1c', NFD) = U&'\0061\0308\24D1c' COLLATE "C" AS test_nfd; + test_nfd +---------- + t +(1 row) + +SELECT normalize(U&'\0061\0308\24D1c', NFKC) = U&'\00E4bc' COLLATE "C" AS test_nfkc; + test_nfkc +----------- + t +(1 row) + +SELECT normalize(U&'\00E4\24D1c', NFKD) = U&'\0061\0308bc' COLLATE "C" AS test_nfkd; + test_nfkd +----------- + t +(1 row) + +SELECT "normalize"('abc', 'def'); -- run-time error +ERROR: invalid normalization form: def +SELECT U&'\00E4\24D1c' IS NORMALIZED AS test_default; + test_default +-------------- + t +(1 row) + +SELECT U&'\00E4\24D1c' IS NFC NORMALIZED AS test_nfc; + test_nfc +---------- + t +(1 row) + +SELECT num, val, + val IS NFC NORMALIZED AS NFC, + val IS NFD NORMALIZED AS NFD, + val IS NFKC NORMALIZED AS NFKC, + val IS NFKD NORMALIZED AS NFKD +FROM + (VALUES (1, U&'\00E4bc'), + (2, U&'\0061\0308bc'), + (3, U&'\00E4\24D1c'), + (4, U&'\0061\0308\24D1c'), + (5, '')) vals (num, val) +ORDER BY num; + num | val | nfc | nfd | nfkc | nfkd +-----+-----+-----+-----+------+------ + 1 | äbc | t | f | t | f + 2 | äbc | f | t | f | t + 3 | äⓑc | t | f | f | f + 4 | äⓑc | f | t | f | f + 5 | | t | t | t | t +(5 rows) + +SELECT is_normalized('abc', 'def'); -- run-time error +ERROR: invalid normalization form: def diff --git a/src/test/singlenode_regress/expected/unicode_1.out b/src/test/singlenode_regress/expected/unicode_1.out new file mode 100644 index 00000000000..8505c4fa552 --- /dev/null +++ b/src/test/singlenode_regress/expected/unicode_1.out @@ -0,0 +1,3 @@ +SELECT getdatabaseencoding() <> 'UTF8' AS skip_test \gset +\if :skip_test +\quit diff --git a/src/test/singlenode_regress/expected/union.out b/src/test/singlenode_regress/expected/union.out new file mode 100644 index 00000000000..73158320abd --- /dev/null +++ b/src/test/singlenode_regress/expected/union.out @@ -0,0 +1,1492 @@ +-- +-- UNION (also INTERSECT, EXCEPT) +-- +-- Simple UNION constructs +SELECT 1 AS two UNION SELECT 2 ORDER BY 1; + two +----- + 1 + 2 +(2 rows) + +SELECT 1 AS one UNION SELECT 1 ORDER BY 1; + one +----- + 1 +(1 row) + +SELECT 1 AS two UNION ALL SELECT 2; + two +----- + 1 + 2 +(2 rows) + +SELECT 1 AS two UNION ALL SELECT 1; + two +----- + 1 + 1 +(2 rows) + +SELECT 1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1; + three +------- + 1 + 2 + 3 +(3 rows) + +SELECT 1 AS two UNION SELECT 2 UNION SELECT 2 ORDER BY 1; + two +----- + 1 + 2 +(2 rows) + +SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1; + three +------- + 1 + 2 + 2 +(3 rows) + +SELECT 1.1 AS two UNION SELECT 2.2 ORDER BY 1; + two +----- + 1.1 + 2.2 +(2 rows) + +-- Mixed types +SELECT 1.1 AS two UNION SELECT 2 ORDER BY 1; + two +----- + 1.1 + 2 +(2 rows) + +SELECT 1 AS two UNION SELECT 2.2 ORDER BY 1; + two +----- + 1 + 2.2 +(2 rows) + +SELECT 1 AS one UNION SELECT 1.0::float8 ORDER BY 1; + one +----- + 1 +(1 row) + +SELECT 1.1 AS two UNION ALL SELECT 2 ORDER BY 1; + two +----- + 1.1 + 2 +(2 rows) + +SELECT 1.0::float8 AS two UNION ALL SELECT 1 ORDER BY 1; + two +----- + 1 + 1 +(2 rows) + +SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1; + three +------- + 1.1 + 2 + 3 +(3 rows) + +SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8 ORDER BY 1; + two +----- + 1.1 + 2 +(2 rows) + +SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1; + three +------- + 1.1 + 2 + 2 +(3 rows) + +SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2) ORDER BY 1; + two +----- + 1.1 + 2 +(2 rows) + +-- +-- Try testing from tables... +-- +SELECT f1 AS five FROM FLOAT8_TBL +UNION +SELECT f1 FROM FLOAT8_TBL +ORDER BY 1; + five +----------------------- + -1.2345678901234e+200 + -1004.3 + -34.84 + -1.2345678901234e-200 + 0 +(5 rows) + +SELECT f1 AS ten FROM FLOAT8_TBL +UNION ALL +SELECT f1 FROM FLOAT8_TBL; + ten +----------------------- + 0 + -34.84 + -1004.3 + -1.2345678901234e+200 + -1.2345678901234e-200 + 0 + -34.84 + -1004.3 + -1.2345678901234e+200 + -1.2345678901234e-200 +(10 rows) + +SELECT f1 AS nine FROM FLOAT8_TBL +UNION +SELECT f1 FROM INT4_TBL +ORDER BY 1; + nine +----------------------- + -1.2345678901234e+200 + -2147483647 + -123456 + -1004.3 + -34.84 + -1.2345678901234e-200 + 0 + 123456 + 2147483647 +(9 rows) + +SELECT f1 AS ten FROM FLOAT8_TBL +UNION ALL +SELECT f1 FROM INT4_TBL; + ten +----------------------- + 0 + -34.84 + -1004.3 + -1.2345678901234e+200 + -1.2345678901234e-200 + 0 + 123456 + -123456 + 2147483647 + -2147483647 +(10 rows) + +SELECT f1 AS five FROM FLOAT8_TBL + WHERE f1 BETWEEN -1e6 AND 1e6 +UNION +SELECT f1 FROM INT4_TBL + WHERE f1 BETWEEN 0 AND 1000000 +ORDER BY 1; + five +----------------------- + -1004.3 + -34.84 + -1.2345678901234e-200 + 0 + 123456 +(5 rows) + +SELECT CAST(f1 AS char(4)) AS three FROM VARCHAR_TBL +UNION +SELECT f1 FROM CHAR_TBL +ORDER BY 1; + three +------- + a + ab + abcd +(3 rows) + +SELECT f1 AS three FROM VARCHAR_TBL +UNION +SELECT CAST(f1 AS varchar) FROM CHAR_TBL +ORDER BY 1; + three +------- + a + ab + abcd +(3 rows) + +SELECT f1 AS eight FROM VARCHAR_TBL +UNION ALL +SELECT f1 FROM CHAR_TBL; + eight +------- + a + ab + abcd + abcd + a + ab + abcd + abcd +(8 rows) + +SELECT f1 AS five FROM TEXT_TBL +UNION +SELECT f1 FROM VARCHAR_TBL +UNION +SELECT TRIM(TRAILING FROM f1) FROM CHAR_TBL +ORDER BY 1; + five +------------------- + a + ab + abcd + doh! + hi de ho neighbor +(5 rows) + +-- +-- INTERSECT and EXCEPT +-- +SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl ORDER BY 1; + q2 +------------------ + 123 + 4567890123456789 +(2 rows) + +SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl ORDER BY 1; + q2 +------------------ + 123 + 4567890123456789 + 4567890123456789 +(3 rows) + +SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; + q2 +------------------- + -4567890123456789 + 456 +(2 rows) + +SELECT q2 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl ORDER BY 1; + q2 +------------------- + -4567890123456789 + 456 +(2 rows) + +SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl ORDER BY 1; + q2 +------------------- + -4567890123456789 + 456 + 4567890123456789 +(3 rows) + +SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY 1; + q1 +---- +(0 rows) + +SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl ORDER BY 1; + q1 +------------------ + 123 + 4567890123456789 +(2 rows) + +SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl ORDER BY 1; + q1 +------------------ + 123 + 4567890123456789 + 4567890123456789 +(3 rows) + +SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE; +ERROR: FOR NO KEY UPDATE is not allowed with UNION/INTERSECT/EXCEPT +-- nested cases +(SELECT 1,2,3 UNION SELECT 4,5,6) INTERSECT SELECT 4,5,6; + ?column? | ?column? | ?column? +----------+----------+---------- + 4 | 5 | 6 +(1 row) + +(SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) INTERSECT SELECT 4,5,6; + ?column? | ?column? | ?column? +----------+----------+---------- + 4 | 5 | 6 +(1 row) + +(SELECT 1,2,3 UNION SELECT 4,5,6) EXCEPT SELECT 4,5,6; + ?column? | ?column? | ?column? +----------+----------+---------- + 1 | 2 | 3 +(1 row) + +(SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) EXCEPT SELECT 4,5,6; + ?column? | ?column? | ?column? +----------+----------+---------- + 1 | 2 | 3 +(1 row) + +-- exercise both hashed and sorted implementations of UNION/INTERSECT/EXCEPT +set enable_hashagg to on; +explain (costs off) +select count(*) from + ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; + QUERY PLAN +--------------------------------------------- + Aggregate + -> HashAggregate + Group Key: tenk1.unique1 + -> Append + -> Seq Scan on tenk1 + -> Seq Scan on tenk1 tenk1_1 + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from + ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; + count +------- + 10000 +(1 row) + +explain (costs off) +select count(*) from + ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; + QUERY PLAN +--------------------------------------------------------- + Aggregate + -> Subquery Scan on ss + -> HashSetOp Intersect + -> Append + -> Subquery Scan on "*SELECT* 2" + -> Seq Scan on tenk1 + -> Subquery Scan on "*SELECT* 1" + -> Seq Scan on tenk1 tenk1_1 + Optimizer: Postgres query optimizer +(9 rows) + +select count(*) from + ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; + count +------- + 5000 +(1 row) + +explain (costs off) +select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; + QUERY PLAN +--------------------------------------------- + HashSetOp Except + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Seq Scan on tenk1 + -> Subquery Scan on "*SELECT* 2" + -> Seq Scan on tenk1 tenk1_1 + Filter: (unique2 <> 10) + Optimizer: Postgres query optimizer +(8 rows) + +select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; + unique1 +--------- + 10 +(1 row) + +set enable_hashagg to off; +explain (costs off) +select count(*) from + ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; + QUERY PLAN +--------------------------------------------------- + Aggregate + -> Unique + Group Key: tenk1.unique1 + -> Sort + Sort Key: tenk1.unique1 + -> Append + -> Seq Scan on tenk1 + -> Seq Scan on tenk1 tenk1_1 + Optimizer: Postgres query optimizer +(9 rows) + +select count(*) from + ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; + count +------- + 10000 +(1 row) + +explain (costs off) +select count(*) from + ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; + QUERY PLAN +--------------------------------------------------------------- + Aggregate + -> Subquery Scan on ss + -> SetOp Intersect + -> Sort + Sort Key: "*SELECT* 2".fivethous + -> Append + -> Subquery Scan on "*SELECT* 2" + -> Seq Scan on tenk1 + -> Subquery Scan on "*SELECT* 1" + -> Seq Scan on tenk1 tenk1_1 + Optimizer: Postgres query optimizer +(11 rows) + +select count(*) from + ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; + count +------- + 5000 +(1 row) + +explain (costs off) +select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; + QUERY PLAN +--------------------------------------------------- + SetOp Except + -> Sort + Sort Key: "*SELECT* 1".unique1 + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Seq Scan on tenk1 + -> Subquery Scan on "*SELECT* 2" + -> Seq Scan on tenk1 tenk1_1 + Filter: (unique2 <> 10) + Optimizer: Postgres query optimizer +(10 rows) + +select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; + unique1 +--------- + 10 +(1 row) + +reset enable_hashagg; +-- non-hashable type +set enable_hashagg to on; +explain (costs off) +select x from (values (100::money), (200::money)) _(x) union select x from (values (100::money), (300::money)) _(x); + QUERY PLAN +----------------------------------------------- + Unique + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(8 rows) + +set enable_hashagg to off; +explain (costs off) +select x from (values (100::money), (200::money)) _(x) union select x from (values (100::money), (300::money)) _(x); + QUERY PLAN +----------------------------------------------- + Unique + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(8 rows) + +reset enable_hashagg; +-- arrays +set enable_hashagg to on; +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) union select x from (values (array[1, 2]), (array[1, 4])) _(x); + QUERY PLAN +----------------------------------------- + HashAggregate + Group Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(6 rows) + +select x from (values (array[1, 2]), (array[1, 3])) _(x) union select x from (values (array[1, 2]), (array[1, 4])) _(x); + x +------- + {1,4} + {1,2} + {1,3} +(3 rows) + +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); + QUERY PLAN +----------------------------------------------- + HashSetOp Intersect + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Values Scan on "*VALUES*" + -> Subquery Scan on "*SELECT* 2" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(7 rows) + +select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); + x +------- + {1,2} +(1 row) + +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); + QUERY PLAN +----------------------------------------------- + HashSetOp Except + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Values Scan on "*VALUES*" + -> Subquery Scan on "*SELECT* 2" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(7 rows) + +select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); + x +------- + {1,3} +(1 row) + +-- non-hashable type +explain (costs off) +select x from (values (array[100::money]), (array[200::money])) _(x) union select x from (values (array[100::money]), (array[300::money])) _(x); + QUERY PLAN +----------------------------------------------- + Unique + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(8 rows) + +select x from (values (array[100::money]), (array[200::money])) _(x) union select x from (values (array[100::money]), (array[300::money])) _(x); + x +----------- + {$100.00} + {$200.00} + {$300.00} +(3 rows) + +set enable_hashagg to off; +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) union select x from (values (array[1, 2]), (array[1, 4])) _(x); + QUERY PLAN +----------------------------------------------- + Unique + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(8 rows) + +select x from (values (array[1, 2]), (array[1, 3])) _(x) union select x from (values (array[1, 2]), (array[1, 4])) _(x); + x +------- + {1,2} + {1,3} + {1,4} +(3 rows) + +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); + QUERY PLAN +----------------------------------------------------- + SetOp Intersect + -> Sort + Sort Key: "*SELECT* 1".x + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Values Scan on "*VALUES*" + -> Subquery Scan on "*SELECT* 2" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(9 rows) + +select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); + x +------- + {1,2} +(1 row) + +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); + QUERY PLAN +----------------------------------------------------- + SetOp Except + -> Sort + Sort Key: "*SELECT* 1".x + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Values Scan on "*VALUES*" + -> Subquery Scan on "*SELECT* 2" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(9 rows) + +select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); + x +------- + {1,3} +(1 row) + +reset enable_hashagg; +-- records +set enable_hashagg to on; +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) union select x from (values (row(1, 2)), (row(1, 4))) _(x); + QUERY PLAN +----------------------------------------------- + Unique + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(8 rows) + +select x from (values (row(1, 2)), (row(1, 3))) _(x) union select x from (values (row(1, 2)), (row(1, 4))) _(x); + x +------- + (1,2) + (1,3) + (1,4) +(3 rows) + +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) intersect select x from (values (row(1, 2)), (row(1, 4))) _(x); + QUERY PLAN +----------------------------------------------------- + SetOp Intersect + -> Sort + Sort Key: "*SELECT* 1".x + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Values Scan on "*VALUES*" + -> Subquery Scan on "*SELECT* 2" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(9 rows) + +select x from (values (row(1, 2)), (row(1, 3))) _(x) intersect select x from (values (row(1, 2)), (row(1, 4))) _(x); + x +------- + (1,2) +(1 row) + +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); + QUERY PLAN +----------------------------------------------------- + SetOp Except + -> Sort + Sort Key: "*SELECT* 1".x + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Values Scan on "*VALUES*" + -> Subquery Scan on "*SELECT* 2" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(9 rows) + +select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); + x +------- + (1,3) +(1 row) + +-- non-hashable type +-- With an anonymous row type, the typcache does not report that the +-- type is hashable. (Otherwise, this would fail at execution time.) +explain (costs off) +select x from (values (row(100::money)), (row(200::money))) _(x) union select x from (values (row(100::money)), (row(300::money))) _(x); + QUERY PLAN +----------------------------------------------- + Unique + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(8 rows) + +select x from (values (row(100::money)), (row(200::money))) _(x) union select x from (values (row(100::money)), (row(300::money))) _(x); + x +----------- + ($100.00) + ($200.00) + ($300.00) +(3 rows) + +-- With a defined row type, the typcache can inspect the type's fields +-- for hashability. +create type ct1 as (f1 money); +explain (costs off) +select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union select x from (values (row(100::money)::ct1), (row(300::money)::ct1)) _(x); + QUERY PLAN +----------------------------------------------- + Unique + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(8 rows) + +select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union select x from (values (row(100::money)::ct1), (row(300::money)::ct1)) _(x); + x +----------- + ($100.00) + ($200.00) + ($300.00) +(3 rows) + +drop type ct1; +set enable_hashagg to off; +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) union select x from (values (row(1, 2)), (row(1, 4))) _(x); + QUERY PLAN +----------------------------------------------- + Unique + Group Key: "*VALUES*".column1 + -> Sort + Sort Key: "*VALUES*".column1 + -> Append + -> Values Scan on "*VALUES*" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(8 rows) + +select x from (values (row(1, 2)), (row(1, 3))) _(x) union select x from (values (row(1, 2)), (row(1, 4))) _(x); + x +------- + (1,2) + (1,3) + (1,4) +(3 rows) + +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) intersect select x from (values (row(1, 2)), (row(1, 4))) _(x); + QUERY PLAN +----------------------------------------------------- + SetOp Intersect + -> Sort + Sort Key: "*SELECT* 1".x + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Values Scan on "*VALUES*" + -> Subquery Scan on "*SELECT* 2" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(9 rows) + +select x from (values (row(1, 2)), (row(1, 3))) _(x) intersect select x from (values (row(1, 2)), (row(1, 4))) _(x); + x +------- + (1,2) +(1 row) + +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); + QUERY PLAN +----------------------------------------------------- + SetOp Except + -> Sort + Sort Key: "*SELECT* 1".x + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Values Scan on "*VALUES*" + -> Subquery Scan on "*SELECT* 2" + -> Values Scan on "*VALUES*_1" + Optimizer: Postgres query optimizer +(9 rows) + +select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); + x +------- + (1,3) +(1 row) + +reset enable_hashagg; +-- +-- Mixed types +-- +SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl ORDER BY 1; + f1 +---- + 0 +(1 row) + +SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl ORDER BY 1; + f1 +----------------------- + -1.2345678901234e+200 + -1004.3 + -34.84 + -1.2345678901234e-200 +(4 rows) + +-- +-- Operator precedence and (((((extra))))) parentheses +-- +SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl ORDER BY 1; + q1 +------------------- + -4567890123456789 + 123 + 123 + 456 + 4567890123456789 + 4567890123456789 + 4567890123456789 +(7 rows) + +SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) ORDER BY 1; + q1 +------------------ + 123 + 4567890123456789 +(2 rows) + +(((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl ORDER BY 1))) UNION ALL SELECT q2 FROM int8_tbl; + q1 +------------------- + 123 + 4567890123456789 + 456 + 4567890123456789 + 123 + 4567890123456789 + -4567890123456789 +(7 rows) + +SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; + q1 +------------------- + -4567890123456789 + 456 +(2 rows) + +SELECT q1 FROM int8_tbl UNION ALL (((SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1))); + q1 +------------------- + 123 + 123 + 4567890123456789 + 4567890123456789 + 4567890123456789 + -4567890123456789 + 456 +(7 rows) + +(((SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; + q1 +------------------- + -4567890123456789 + 456 +(2 rows) + +-- +-- Subqueries with ORDER BY & LIMIT clauses +-- +-- In this syntax, ORDER BY/LIMIT apply to the result of the EXCEPT +SELECT q1,q2 FROM int8_tbl EXCEPT SELECT q2,q1 FROM int8_tbl +ORDER BY q2,q1; + q1 | q2 +------------------+------------------- + 4567890123456789 | -4567890123456789 + 123 | 456 +(2 rows) + +-- This should fail, because q2 isn't a name of an EXCEPT output column +SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1; +ERROR: column "q2" does not exist +LINE 1: ... int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1... + ^ +HINT: There is a column named "q2" in table "*SELECT* 2", but it cannot be referenced from this part of the query. +-- But this should work: +SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1))) ORDER BY 1; + q1 +------------------ + 123 + 4567890123456789 +(2 rows) + +-- +-- New syntaxes (7.1) permit new tests +-- +(((((select * from int8_tbl))))); + q1 | q2 +------------------+------------------- + 123 | 456 + 123 | 4567890123456789 + 4567890123456789 | 123 + 4567890123456789 | 4567890123456789 + 4567890123456789 | -4567890123456789 +(5 rows) + +-- +-- Check behavior with empty select list (allowed since 9.4) +-- +select union select; +-- +(1 row) + +select intersect select; +-- +(1 row) + +select except select; +-- +(0 rows) + +-- check hashed implementation +set enable_hashagg = true; +set enable_sort = false; +explain (costs off) +select from generate_series(1,5) union select from generate_series(1,3); + QUERY PLAN +---------------------------------------------------------------- + HashAggregate + -> Append + -> Function Scan on generate_series + -> Function Scan on generate_series generate_series_1 + Optimizer: Postgres query optimizer +(5 rows) + +explain (costs off) +select from generate_series(1,5) intersect select from generate_series(1,3); + QUERY PLAN +---------------------------------------------------------------------- + HashSetOp Intersect + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Function Scan on generate_series + -> Subquery Scan on "*SELECT* 2" + -> Function Scan on generate_series generate_series_1 + Optimizer: Postgres query optimizer +(7 rows) + +select from generate_series(1,5) union select from generate_series(1,3); +-- +(1 row) + +select from generate_series(1,5) union all select from generate_series(1,3); +-- +(8 rows) + +select from generate_series(1,5) intersect select from generate_series(1,3); +-- +(1 row) + +select from generate_series(1,5) intersect all select from generate_series(1,3); +-- +(3 rows) + +select from generate_series(1,5) except select from generate_series(1,3); +-- +(0 rows) + +select from generate_series(1,5) except all select from generate_series(1,3); +-- +(2 rows) + +-- check sorted implementation +set enable_hashagg = false; +set enable_sort = true; +explain (costs off) +select from generate_series(1,5) union select from generate_series(1,3); + QUERY PLAN +---------------------------------------------------------------- + Unique + -> Append + -> Function Scan on generate_series + -> Function Scan on generate_series generate_series_1 + Optimizer: Postgres query optimizer +(5 rows) + +explain (costs off) +select from generate_series(1,5) intersect select from generate_series(1,3); + QUERY PLAN +---------------------------------------------------------------------- + SetOp Intersect + -> Append + -> Subquery Scan on "*SELECT* 1" + -> Function Scan on generate_series + -> Subquery Scan on "*SELECT* 2" + -> Function Scan on generate_series generate_series_1 + Optimizer: Postgres query optimizer +(7 rows) + +select from generate_series(1,5) union select from generate_series(1,3); +-- +(1 row) + +select from generate_series(1,5) union all select from generate_series(1,3); +-- +(8 rows) + +select from generate_series(1,5) intersect select from generate_series(1,3); +-- +(1 row) + +select from generate_series(1,5) intersect all select from generate_series(1,3); +-- +(3 rows) + +select from generate_series(1,5) except select from generate_series(1,3); +-- +(0 rows) + +select from generate_series(1,5) except all select from generate_series(1,3); +-- +(2 rows) + +reset enable_hashagg; +reset enable_sort; +-- +-- Check handling of a case with unknown constants. We don't guarantee +-- an undecorated constant will work in all cases, but historically this +-- usage has worked, so test we don't break it. +-- +SELECT a.f1 FROM (SELECT 'test' AS f1 FROM varchar_tbl) a +UNION +SELECT b.f1 FROM (SELECT f1 FROM varchar_tbl) b +ORDER BY 1; + f1 +------ + a + ab + abcd + test +(4 rows) + +-- This should fail, but it should produce an error cursor +SELECT '3.4'::numeric UNION SELECT 'foo'; +ERROR: invalid input syntax for type numeric: "foo" +LINE 1: SELECT '3.4'::numeric UNION SELECT 'foo'; + ^ +-- +-- Test that expression-index constraints can be pushed down through +-- UNION or UNION ALL +-- +CREATE TEMP TABLE t1 (a text, b text); +CREATE INDEX t1_ab_idx on t1 ((a || b)); +CREATE TEMP TABLE t2 (ab text primary key); +INSERT INTO t1 VALUES ('a', 'b'), ('x', 'y'); +INSERT INTO t2 VALUES ('ab'), ('xy'); +set enable_seqscan = off; +set enable_indexscan = on; +set enable_bitmapscan = off; +explain (costs off) + SELECT * FROM + (SELECT a || b AS ab FROM t1 + UNION ALL + SELECT * FROM t2) t + WHERE ab = 'ab'; + QUERY PLAN +--------------------------------------------- + Append + -> Index Scan using t1_ab_idx on t1 + Index Cond: ((a || b) = 'ab'::text) + -> Index Only Scan using t2_pkey on t2 + Index Cond: (ab = 'ab'::text) + Optimizer: Postgres query optimizer +(6 rows) + +explain (costs off) + SELECT * FROM + (SELECT a || b AS ab FROM t1 + UNION + SELECT * FROM t2) t + WHERE ab = 'ab'; + QUERY PLAN +--------------------------------------------------- + HashAggregate + Group Key: ((t1.a || t1.b)) + -> Append + -> Index Scan using t1_ab_idx on t1 + Index Cond: ((a || b) = 'ab'::text) + -> Index Only Scan using t2_pkey on t2 + Index Cond: (ab = 'ab'::text) + Optimizer: Postgres query optimizer +(8 rows) + +-- +-- Test that ORDER BY for UNION ALL can be pushed down to inheritance +-- children. +-- +CREATE TEMP TABLE t1c (b text, a text); +ALTER TABLE t1c INHERIT t1; +CREATE TEMP TABLE t2c (primary key (ab)) INHERITS (t2); +INSERT INTO t1c VALUES ('v', 'w'), ('c', 'd'), ('m', 'n'), ('e', 'f'); +INSERT INTO t2c VALUES ('vw'), ('cd'), ('mn'), ('ef'); +CREATE INDEX t1c_ab_idx on t1c ((a || b)); +set enable_seqscan = on; +set enable_indexonlyscan = off; +explain (costs off) + SELECT * FROM + (SELECT a || b AS ab FROM t1 + UNION ALL + SELECT ab FROM t2) t + ORDER BY 1 LIMIT 8; + QUERY PLAN +----------------------------------------------------- + Limit + -> Merge Append + Sort Key: ((t1.a || t1.b)) + -> Index Scan using t1_ab_idx on t1 + -> Index Scan using t1c_ab_idx on t1c t1_1 + -> Index Scan using t2_pkey on t2 + -> Index Scan using t2c_pkey on t2c t2_1 + Optimizer: Postgres query optimizer +(8 rows) + + SELECT * FROM + (SELECT a || b AS ab FROM t1 + UNION ALL + SELECT ab FROM t2) t + ORDER BY 1 LIMIT 8; + ab +---- + ab + ab + cd + dc + ef + fe + mn + nm +(8 rows) + +reset enable_seqscan; +reset enable_indexscan; +reset enable_bitmapscan; +-- This simpler variant of the above test has been observed to fail differently +create table events (event_id int primary key); +create table other_events (event_id int primary key); +create table events_child () inherits (events); +explain (costs off) +select event_id + from (select event_id from events + union all + select event_id from other_events) ss + order by event_id; + QUERY PLAN +---------------------------------------------------------- + Merge Append + Sort Key: events.event_id + -> Index Scan using events_pkey on events + -> Sort + Sort Key: events_1.event_id + -> Seq Scan on events_child events_1 + -> Index Scan using other_events_pkey on other_events + Optimizer: Postgres query optimizer +(8 rows) + +drop table events_child, events, other_events; +reset enable_indexonlyscan; +-- Test constraint exclusion of UNION ALL subqueries +explain (costs off) + SELECT * FROM + (SELECT 1 AS t, * FROM tenk1 a + UNION ALL + SELECT 2 AS t, * FROM tenk1 b) c + WHERE t = 2; + QUERY PLAN +------------------------------------- + Seq Scan on tenk1 b + Optimizer: Postgres query optimizer +(2 rows) + +-- Test that we push quals into UNION sub-selects only when it's safe +explain (costs off) +SELECT * FROM + (SELECT 1 AS t, 2 AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x < 4 +ORDER BY x; + QUERY PLAN +-------------------------------------------------- + Sort + Sort Key: (2) + -> Unique + Group Key: (1), (2) + -> Sort + Sort Key: (1), (2) + -> Append + -> Result + -> Result + One-Time Filter: false + Optimizer: Postgres query optimizer +(11 rows) + +SELECT * FROM + (SELECT 1 AS t, 2 AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x < 4 +ORDER BY x; + t | x +---+--- + 1 | 2 +(1 row) + +explain (costs off) +SELECT * FROM + (SELECT 1 AS t, generate_series(1,10) AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x < 4 +ORDER BY x; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: ss.x + -> Subquery Scan on ss + Filter: (ss.x < 4) + -> HashAggregate + Group Key: (1), (generate_series(1, 10)) + -> Append + -> ProjectSet + -> Result + -> Result + Optimizer: Postgres query optimizer +(11 rows) + +SELECT * FROM + (SELECT 1 AS t, generate_series(1,10) AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x < 4 +ORDER BY x; + t | x +---+--- + 1 | 1 + 1 | 2 + 1 | 3 +(3 rows) + +explain (costs off) +SELECT * FROM + (SELECT 1 AS t, (random()*3)::int AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x > 3 +ORDER BY x; + QUERY PLAN +------------------------------------------------------------------------------ + Sort + Sort Key: ss.x + -> Subquery Scan on ss + Filter: (ss.x > 3) + -> Unique + Group Key: (1), ((($0 * '3'::double precision))::integer) + -> Sort + Sort Key: (1), ((($0 * '3'::double precision))::integer) + -> Append + -> Result + InitPlan 1 (returns $0) + -> Result + -> Result + Optimizer: Postgres query optimizer +(14 rows) + +SELECT * FROM + (SELECT 1 AS t, (random()*3)::int AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x > 3 +ORDER BY x; + t | x +---+--- + 2 | 4 +(1 row) + +-- Test cases where the native ordering of a sub-select has more pathkeys +-- than the outer query cares about +explain (costs off) +select distinct q1 from + (select distinct * from int8_tbl i81 + union all + select distinct * from int8_tbl i82) ss +where q2 = q2; + QUERY PLAN +---------------------------------------------------------- + Unique + Group Key: "*SELECT* 1".q1 + -> Merge Append + Sort Key: "*SELECT* 1".q1 + -> Subquery Scan on "*SELECT* 1" + -> Unique + Group Key: i81.q1, i81.q2 + -> Sort + Sort Key: i81.q1, i81.q2 + -> Seq Scan on int8_tbl i81 + Filter: (q2 IS NOT NULL) + -> Subquery Scan on "*SELECT* 2" + -> Unique + Group Key: i82.q1, i82.q2 + -> Sort + Sort Key: i82.q1, i82.q2 + -> Seq Scan on int8_tbl i82 + Filter: (q2 IS NOT NULL) + Optimizer: Postgres query optimizer +(19 rows) + +select distinct q1 from + (select distinct * from int8_tbl i81 + union all + select distinct * from int8_tbl i82) ss +where q2 = q2; + q1 +------------------ + 123 + 4567890123456789 +(2 rows) + +explain (costs off) +select distinct q1 from + (select distinct * from int8_tbl i81 + union all + select distinct * from int8_tbl i82) ss +where -q1 = q2; + QUERY PLAN +-------------------------------------------------------- + Unique + Group Key: "*SELECT* 1".q1 + -> Merge Append + Sort Key: "*SELECT* 1".q1 + -> Subquery Scan on "*SELECT* 1" + -> Unique + Group Key: i81.q1, i81.q2 + -> Sort + Sort Key: i81.q1, i81.q2 + -> Seq Scan on int8_tbl i81 + Filter: ((- q1) = q2) + -> Subquery Scan on "*SELECT* 2" + -> Unique + Group Key: i82.q1, i82.q2 + -> Sort + Sort Key: i82.q1, i82.q2 + -> Seq Scan on int8_tbl i82 + Filter: ((- q1) = q2) + Optimizer: Postgres query optimizer +(19 rows) + +select distinct q1 from + (select distinct * from int8_tbl i81 + union all + select distinct * from int8_tbl i82) ss +where -q1 = q2; + q1 +------------------ + 4567890123456789 +(1 row) + +-- Test proper handling of parameterized appendrel paths when the +-- potential join qual is expensive +create function expensivefunc(int) returns int +language plpgsql immutable strict cost 10000 +as $$begin return $1; end$$; +create temp table t3 as select generate_series(-1000,1000) as x; +create index t3i on t3 (expensivefunc(x)); +analyze t3; +explain (costs off) +select * from + (select * from t3 a union all select * from t3 b) ss + join int4_tbl on f1 = expensivefunc(x); + QUERY PLAN +------------------------------------------------- + Hash Join + Hash Cond: (expensivefunc(a.x) = int4_tbl.f1) + -> Append + -> Seq Scan on t3 a + -> Seq Scan on t3 b + -> Hash + -> Seq Scan on int4_tbl + Optimizer: Postgres query optimizer +(8 rows) + +select * from + (select * from t3 a union all select * from t3 b) ss + join int4_tbl on f1 = expensivefunc(x); + x | f1 +---+---- + 0 | 0 + 0 | 0 +(2 rows) + +drop table t3; +drop function expensivefunc(int); +-- Test handling of appendrel quals that const-simplify into an AND +explain (costs off) +select * from + (select *, 0 as x from int8_tbl a + union all + select *, 1 as x from int8_tbl b) ss +where (x = 0) or (q1 >= q2 and q1 <= q2); + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on int8_tbl a + -> Seq Scan on int8_tbl b + Filter: ((q1 >= q2) AND (q1 <= q2)) + Optimizer: Postgres query optimizer +(5 rows) + +select * from + (select *, 0 as x from int8_tbl a + union all + select *, 1 as x from int8_tbl b) ss +where (x = 0) or (q1 >= q2 and q1 <= q2); + q1 | q2 | x +------------------+-------------------+--- + 123 | 456 | 0 + 123 | 4567890123456789 | 0 + 4567890123456789 | 123 | 0 + 4567890123456789 | 4567890123456789 | 0 + 4567890123456789 | -4567890123456789 | 0 + 4567890123456789 | 4567890123456789 | 1 +(6 rows) + diff --git a/src/test/singlenode_regress/expected/union_gp.out b/src/test/singlenode_regress/expected/union_gp.out new file mode 100644 index 00000000000..d1d276c9a31 --- /dev/null +++ b/src/test/singlenode_regress/expected/union_gp.out @@ -0,0 +1,2193 @@ +-- Additional GPDB-added tests for UNION +create temp table t_union1 (a int, b int); +select distinct a, null::integer as c from t_union1 union select a, b from t_union1; + a | c +---+--- +(0 rows) + +drop table t_union1; +select null union select distinct null; + ?column? +---------- + +(1 row) + +select 1 union select distinct null::integer; + ?column? +---------- + 1 + +(2 rows) + +select 1 a, NULL b, NULL c UNION SELECT 2, 3, NULL UNION SELECT 3, NULL, 4; + a | b | c +---+---+--- + 1 | | + 2 | 3 | + 3 | | 4 +(3 rows) + +select ARRAY[1, 2, 3] union select distinct null::integer[]; + array +--------- + {1,2,3} + +(2 rows) + +select 1 intersect (select 1, 2 union all select 3, 4); +ERROR: each INTERSECT query must have the same number of columns +LINE 1: select 1 intersect (select 1, 2 union all select 3, 4); + ^ +select 1 a, row_number() over (partition by 'a') union all (select 1 a , 2 b); + a | row_number +---+------------ + 1 | 2 + 1 | 1 +(2 rows) + +-- This should preserve domain types +select pg_typeof(a) from (select 'a'::information_schema.sql_identifier a union all +select 'b'::information_schema.sql_identifier)a; + pg_typeof +----------------------------------- + information_schema.sql_identifier + information_schema.sql_identifier +(2 rows) + +(select * from ( + (select '1' as a union select null) + union + (select 1 union select distinct null::integer) + )s) + union + (select * from ( + (select '1' union select null) + union + (select 1 union select distinct null::integer) + )s2); + a +--- + 1 + +(2 rows) + +-- Yet, we keep behaviors on text-like columns +select pg_typeof(a) from(select 'foo' a union select 'foo'::name)s; + pg_typeof +----------- + name +(1 row) + +select pg_typeof(a) from(select 1 x, 'foo' a union + select 1, 'foo' union select 1, 'foo'::name)s; + pg_typeof +----------- + text +(1 row) + +select pg_typeof(a) from(select 1 x, 'foo' a union + (select 1, 'foo' union select 1, 'foo'::name))s; + pg_typeof +----------- + name +(1 row) + +CREATE TABLE union_ctas (a, b) AS SELECT 1, 2 UNION SELECT 1, 1 UNION SELECT 1, 1; +SELECT * FROM union_ctas; + a | b +---+--- + 1 | 1 + 1 | 2 +(2 rows) + +DROP TABLE union_ctas; +-- MPP-21075: push quals below union +CREATE TABLE union_quals1 (a, b) AS SELECT i, i%2 from generate_series(1,10) i; +CREATE TABLE union_quals2 (a, b) AS SELECT i%2, i from generate_series(1,10) i; +SELECT * FROM (SELECT a, b from union_quals1 UNION SELECT b, a from union_quals2) as foo(a,b) where a > b order by a; + a | b +----+--- + 2 | 0 + 3 | 1 + 4 | 0 + 5 | 1 + 6 | 0 + 7 | 1 + 8 | 0 + 9 | 1 + 10 | 0 +(9 rows) + +SELECT * FROM (SELECT a, max(b) over() from union_quals1 UNION SELECT * from union_quals2) as foo(a,b) where b > 6 order by a,b; + a | b +---+---- + 0 | 8 + 0 | 10 + 1 | 7 + 1 | 9 +(4 rows) + +-- MPP-22266: different combinations of set operations and distinct +select * from ((select 1, 'A' from (select distinct 'B') as foo) union (select 1, 'C')) as bar; + ?column? | ?column? +----------+---------- + 1 | A + 1 | C +(2 rows) + +select 1 union (select distinct null::integer union select '10'); + ?column? +---------- + 1 + 10 + +(3 rows) + +select 1 union (select 2 from (select distinct null::integer union select 1) as x); + ?column? +---------- + 1 + 2 +(2 rows) + +select 1 union (select distinct 10 from (select 1, 3.0 union select distinct 2, null::integer) as foo); + ?column? +---------- + 1 + 10 +(2 rows) + +select 1 union (select distinct '10' from (select 1, 3.0 union select distinct 2, null::integer) as foo); +ERROR: UNION types integer and text cannot be matched +LINE 1: select 1 union (select distinct '10' from (select 1, 3.0 uni... + ^ +select distinct a from (select 'A' union select 'B') as foo(a); + a +--- + A + B +(2 rows) + +select distinct a from (select distinct 'A' union select 'B') as foo(a); + a +--- + A + B +(2 rows) + +select distinct a from (select distinct 'A' union select distinct 'B') as foo(a); + a +--- + A + B +(2 rows) + +select distinct a from (select 'A' from (select distinct 'C' ) as bar union select distinct 'B') as foo(a); + a +--- + A + B +(2 rows) + +select distinct a from (select distinct 'A' from (select distinct 'C' ) as bar union select distinct 'B') as foo(a); + a +--- + A + B +(2 rows) + +select distinct a from (select distinct 'A' from (select 'C' from (select distinct 'D') as bar1 ) as bar union select distinct 'B') as foo(a); + a +--- + A + B +(2 rows) + +-- Test case where input to one branch of UNION resides on a single segment, and another on the QE. +-- The external table resides on QD, and the LIMIT on the test1 table forces the plan to be focused +-- on a single QE. +-- +CREATE TABLE test1 (id int); +insert into test1 values (1); +CREATE EXTERNAL WEB TABLE test2 (id int) EXECUTE 'echo 2' ON COORDINATOR FORMAT 'csv'; +(SELECT 'test1' as branch, id FROM test1 LIMIT 1) +union +(SELECT 'test2' as branch, id FROM test2); + branch | id +--------+---- + test1 | 1 + test2 | 2 +(2 rows) + +explain (SELECT 'test1' as branch, id FROM test1 LIMIT 1) +union +(SELECT 'test2' as branch, id FROM test2); + QUERY PLAN +------------------------------------------------------------------------------------ + Unique (cost=0.06..0.08 rows=2 width=36) + Group Key: ('test1'::text), test1.id + -> Sort (cost=0.06..0.07 rows=2 width=36) + Sort Key: ('test1'::text), test1.id + -> Append (cost=0.00..0.05 rows=2 width=36) + -> Limit (cost=0.00..0.01 rows=1 width=36) + -> Seq Scan on test1 (cost=0.00..112.30 rows=10230 width=36) + -> Foreign Scan on test2 (cost=0.00..0.01 rows=1 width=36) + Optimizer: Postgres query optimizer +(9 rows) + +-- +-- Test pulling up distribution key expression, when the different branches +-- of a UNION ALL have different typmods. +-- +create table pullup_distkey_test( + a character varying, + b character varying(30) +); +insert into pullup_distkey_test values ('foo', 'bar'); +with base as +( + select a, b from pullup_distkey_test + union all + select 'xx' as a, 'bar' as b +) +select a from base +union all +select a from base where a = 'foo'; + a +----- + foo + xx + foo +(3 rows) + +-- +-- Test union all two replicated tables with different numsegments +-- +create table rep2(c1 int, c2 int); +create table rep3(c1 int, c2 int); +set allow_system_table_mods = on; +update gp_distribution_policy set numsegments = 2 + where localoid = 'rep2'::regclass; +-- start_ignore +select localoid::regclass, policytype, numsegments + from gp_distribution_policy + where localoid::regclass in ('rep2', 'rep3'); + localoid | policytype | numsegments +----------+------------+------------- +(0 rows) + +-- end_ignore +explain select * from rep2 union all select * from rep3; + QUERY PLAN +--------------------------------------------------------------- + Append (cost=0.00..292.70 rows=18180 width=8) + -> Seq Scan on rep2 (cost=0.00..100.90 rows=9090 width=8) + -> Seq Scan on rep3 (cost=0.00..100.90 rows=9090 width=8) + Optimizer: Postgres query optimizer +(4 rows) + +select * from rep2 union all select * from rep3; + c1 | c2 +----+---- +(0 rows) + +reset allow_system_table_mods; +drop table rep2; +drop table rep3; +-- +-- Setup +-- +--start_ignore +DROP TABLE IF EXISTS T_a1 CASCADE; +NOTICE: table "t_a1" does not exist, skipping +DROP TABLE IF EXISTS T_b2 CASCADE; +NOTICE: table "t_b2" does not exist, skipping +DROP TABLE IF EXISTS T_random CASCADE; +NOTICE: table "t_random" does not exist, skipping +--end_ignore +CREATE TABLE T_a1 (a1 int, a2 int); +INSERT INTO T_a1 SELECT i, i%5 from generate_series(1,10) i; +CREATE TABLE T_b2 (b1 int, b2 int); +INSERT INTO T_b2 SELECT i, i%5 from generate_series(1,20) i; +CREATE TABLE T_random (c1 int, c2 int); +INSERT INTO T_random SELECT i, i%5 from generate_series(1,30) i; +--start_ignore +create language plpython3u; +--end_ignore +create or replace function count_operator(query text, operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; +-- +-- N-ary UNION ALL results +-- +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +UNION ALL +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1; + a1 +----- + 1 + 1 + 1 + 2 + 2 + 2 + 3 + 3 + 3 + 4 + 4 + 4 + 5 + 5 + 5 + 6 + 6 + 6 + 7 + 7 + 7 + 8 + 8 + 8 + 9 + 9 + 9 + 10 + 10 + 10 + 11 + 11 + 12 + 12 + 13 + 13 + 14 + 14 + 15 + 15 + 16 + 16 + 17 + 17 + 18 + 18 + 19 + 19 + 20 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(63 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select b1 from T_b2) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1; + b1 +----- + 1 + 1 + 1 + 2 + 2 + 2 + 3 + 3 + 3 + 4 + 4 + 4 + 5 + 5 + 5 + 6 + 6 + 6 + 7 + 7 + 7 + 8 + 8 + 8 + 9 + 9 + 9 + 10 + 10 + 10 + 11 + 11 + 12 + 12 + 13 + 13 + 14 + 14 + 15 + 15 + 16 + 16 + 17 + 17 + 18 + 18 + 19 + 19 + 20 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(63 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select c1 from T_random) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +UNION ALL +(select d1 from T_constant) +order by 1; + c1 +----- + 1 + 1 + 1 + 2 + 2 + 2 + 3 + 3 + 3 + 4 + 4 + 4 + 5 + 5 + 5 + 6 + 6 + 6 + 7 + 7 + 7 + 8 + 8 + 8 + 9 + 9 + 9 + 10 + 10 + 10 + 11 + 11 + 12 + 12 + 13 + 13 + 14 + 14 + 15 + 15 + 16 + 16 + 17 + 17 + 18 + 18 + 19 + 19 + 20 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(63 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) +UNION ALL +(select c1 from T_random) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +order by 1; + d1 +----- + 1 + 1 + 1 + 2 + 2 + 2 + 3 + 3 + 3 + 4 + 4 + 4 + 5 + 5 + 5 + 6 + 6 + 6 + 7 + 7 + 7 + 8 + 8 + 8 + 9 + 9 + 9 + 10 + 10 + 10 + 11 + 11 + 12 + 12 + 13 + 13 + 14 + 14 + 15 + 15 + 16 + 16 + 17 + 17 + 18 + 18 + 19 + 19 + 20 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(63 rows) + +-- +-- N-ary UNION ALL explain +-- +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +UNION ALL +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select b1 from T_b2) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select c1 from T_random) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +UNION ALL +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) +UNION ALL +(select c1 from T_random) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +order by 1;' +, 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +-- +-- N-ary UNION results +-- +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select a1 from T_a1) +UNION +(select b1 from T_b2) +UNION +(select c1 from T_random) +UNION +(select d1 from T_constant) +order by 1; + a1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(33 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select b1 from T_b2) +UNION +(select a1 from T_a1) +UNION +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1; + b1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(33 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select c1 from T_random) +UNION +(select a1 from T_a1) +UNION +(select b1 from T_b2) +UNION ALL +(select d1 from T_constant) +order by 1; + c1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(33 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) +UNION ALL +(select c1 from T_random) +UNION +(select a1 from T_a1) +UNION +(select b1 from T_b2) +order by 1; + d1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(33 rows) + +-- +-- N-ary UNION explain +-- +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select a1 from T_a1) +UNION +(select b1 from T_b2) +UNION +(select c1 from T_random) +UNION +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select b1 from T_b2) +UNION +(select a1 from T_a1) +UNION +(select c1 from T_random) +UNION +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select c1 from T_random) +UNION +(select a1 from T_a1) +UNION +(select b1 from T_b2) +UNION +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) +UNION +(select c1 from T_random) +UNION +(select a1 from T_a1) +UNION +(select b1 from T_b2) +order by 1;' +, 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +-- +-- Binary UNION ALL results +-- +(select a1 from T_a1) UNION ALL (select b1 from T_b2) order by 1; + a1 +---- + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 + 6 + 6 + 7 + 7 + 8 + 8 + 9 + 9 + 10 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(30 rows) + +(select b1 from T_b2) UNION ALL (select a1 from T_a1) order by 1; + b1 +---- + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 + 6 + 6 + 7 + 7 + 8 + 8 + 9 + 9 + 10 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(30 rows) + +(select a1 from T_a1) UNION ALL (select c1 from T_random) order by 1; + a1 +---- + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 + 6 + 6 + 7 + 7 + 8 + 8 + 9 + 9 + 10 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 +(40 rows) + +(select c1 from T_random) UNION ALL (select a1 from T_a1) order by 1; + c1 +---- + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 + 6 + 6 + 7 + 7 + 8 + 8 + 9 + 9 + 10 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 +(40 rows) + +(select * from T_a1) UNION ALL (select * from T_b2) order by 1; + a1 | a2 +----+---- + 1 | 1 + 1 | 1 + 2 | 2 + 2 | 2 + 3 | 3 + 3 | 3 + 4 | 4 + 4 | 4 + 5 | 0 + 5 | 0 + 6 | 1 + 6 | 1 + 7 | 2 + 7 | 2 + 8 | 3 + 8 | 3 + 9 | 4 + 9 | 4 + 10 | 0 + 10 | 0 + 11 | 1 + 12 | 2 + 13 | 3 + 14 | 4 + 15 | 0 + 16 | 1 + 17 | 2 + 18 | 3 + 19 | 4 + 20 | 0 +(30 rows) + +(select * from T_a1) UNION ALL (select * from T_random) order by 1; + a1 | a2 +----+---- + 1 | 1 + 1 | 1 + 2 | 2 + 2 | 2 + 3 | 3 + 3 | 3 + 4 | 4 + 4 | 4 + 5 | 0 + 5 | 0 + 6 | 1 + 6 | 1 + 7 | 2 + 7 | 2 + 8 | 3 + 8 | 3 + 9 | 4 + 9 | 4 + 10 | 0 + 10 | 0 + 11 | 1 + 12 | 2 + 13 | 3 + 14 | 4 + 15 | 0 + 16 | 1 + 17 | 2 + 18 | 3 + 19 | 4 + 20 | 0 + 21 | 1 + 22 | 2 + 23 | 3 + 24 | 4 + 25 | 0 + 26 | 1 + 27 | 2 + 28 | 3 + 29 | 4 + 30 | 0 +(40 rows) + +(select * from T_b2) UNION ALL (select * from T_random) order by 1; + b1 | b2 +----+---- + 1 | 1 + 1 | 1 + 2 | 2 + 2 | 2 + 3 | 3 + 3 | 3 + 4 | 4 + 4 | 4 + 5 | 0 + 5 | 0 + 6 | 1 + 6 | 1 + 7 | 2 + 7 | 2 + 8 | 3 + 8 | 3 + 9 | 4 + 9 | 4 + 10 | 0 + 10 | 0 + 11 | 1 + 11 | 1 + 12 | 2 + 12 | 2 + 13 | 3 + 13 | 3 + 14 | 4 + 14 | 4 + 15 | 0 + 15 | 0 + 16 | 1 + 16 | 1 + 17 | 2 + 17 | 2 + 18 | 3 + 18 | 3 + 19 | 4 + 19 | 4 + 20 | 0 + 20 | 0 + 21 | 1 + 22 | 2 + 23 | 3 + 24 | 4 + 25 | 0 + 26 | 1 + 27 | 2 + 28 | 3 + 29 | 4 + 30 | 0 +(50 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select a1 from T_a1) UNION ALL (select d1 from T_constant) order by 1; + a1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 100 + 200 + 300 +(13 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) UNION ALL (select a1 from T_a1) order by 1; + d1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 100 + 200 + 300 +(13 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select c1 from T_random) UNION ALL (select d1 from T_constant) order by 1; + c1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(33 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) UNION ALL (select c1 from T_random) order by 1; + d1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(33 rows) + +-- +-- Binary UNION ALL explain +-- +select count_operator('(select a1 from T_a1) UNION ALL (select b1 from T_b2) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select b1 from T_b2) UNION ALL (select a1 from T_a1) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select a1 from T_a1) UNION ALL (select c1 from T_random) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select c1 from T_random) UNION ALL (select a1 from T_a1) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select * from T_a1) UNION ALL (select * from T_b2) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select * from T_a1) UNION ALL (select * from T_random) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select * from T_b2) UNION ALL (select * from T_random) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select a1 from T_a1) UNION ALL (select d1 from T_constant) order by 1;', 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) UNION ALL (select a1 from T_a1) order by 1;', 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select c1 from T_random) UNION ALL (select d1 from T_constant) order by 1;', 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator('with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) UNION ALL (select c1 from T_random) order by 1;', 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +-- +-- Binary UNION results +-- +(select a1 from T_a1) UNION (select b1 from T_b2) order by 1; + a1 +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(20 rows) + +(select b1 from T_b2) UNION (select a1 from T_a1) order by 1; + b1 +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(20 rows) + +(select a1 from T_a1) UNION (select c1 from T_random) order by 1; + a1 +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 +(30 rows) + +(select c1 from T_random) UNION (select a1 from T_a1) order by 1; + c1 +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 +(30 rows) + +(select * from T_a1) UNION (select * from T_b2) order by 1; + a1 | a2 +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 0 + 6 | 1 + 7 | 2 + 8 | 3 + 9 | 4 + 10 | 0 + 11 | 1 + 12 | 2 + 13 | 3 + 14 | 4 + 15 | 0 + 16 | 1 + 17 | 2 + 18 | 3 + 19 | 4 + 20 | 0 +(20 rows) + +(select * from T_a1) UNION (select * from T_random) order by 1; + a1 | a2 +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 0 + 6 | 1 + 7 | 2 + 8 | 3 + 9 | 4 + 10 | 0 + 11 | 1 + 12 | 2 + 13 | 3 + 14 | 4 + 15 | 0 + 16 | 1 + 17 | 2 + 18 | 3 + 19 | 4 + 20 | 0 + 21 | 1 + 22 | 2 + 23 | 3 + 24 | 4 + 25 | 0 + 26 | 1 + 27 | 2 + 28 | 3 + 29 | 4 + 30 | 0 +(30 rows) + +(select * from T_b2) UNION (select * from T_random) order by 1; + b1 | b2 +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 0 + 6 | 1 + 7 | 2 + 8 | 3 + 9 | 4 + 10 | 0 + 11 | 1 + 12 | 2 + 13 | 3 + 14 | 4 + 15 | 0 + 16 | 1 + 17 | 2 + 18 | 3 + 19 | 4 + 20 | 0 + 21 | 1 + 22 | 2 + 23 | 3 + 24 | 4 + 25 | 0 + 26 | 1 + 27 | 2 + 28 | 3 + 29 | 4 + 30 | 0 +(30 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select a1 from T_a1) UNION (select d1 from T_constant) order by 1; + a1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 100 + 200 + 300 +(13 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) UNION (select a1 from T_a1) order by 1; + d1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 100 + 200 + 300 +(13 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select c1 from T_random) UNION (select d1 from T_constant) order by 1; + c1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(33 rows) + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) UNION (select c1 from T_random) order by 1; + d1 +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 100 + 200 + 300 +(33 rows) + +-- +-- Binary UNION explain +-- +select count_operator('(select a1 from T_a1) UNION (select b1 from T_b2) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select b1 from T_b2) UNION (select a1 from T_a1) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select a1 from T_a1) UNION (select c1 from T_random) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select c1 from T_random) UNION (select a1 from T_a1) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select * from T_a1) UNION (select * from T_b2) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select * from T_a1) UNION (select * from T_random) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator('(select * from T_b2) UNION (select * from T_random) order by 1;', 'APPEND'); + count_operator +---------------- + 1 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select a1 from T_a1) UNION (select d1 from T_constant) order by 1;', 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) UNION (select a1 from T_a1) order by 1;', 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select c1 from T_random) UNION (select d1 from T_constant) order by 1;', 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +select count_operator('with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) UNION (select c1 from T_random) order by 1;', 'APPEND'); + count_operator +---------------- + 2 +(1 row) + +CREATE TABLE t1_setop(a int); +CREATE TABLE t2_setop(a int); +INSERT INTO t1_setop VALUES (1), (2), (3); +INSERT INTO t2_setop VALUES (3), (4), (5); +(SELECT a FROM t1_setop EXCEPT SELECT a FROM t2_setop ORDER BY a) +UNION +(SELECT a FROM t2_setop EXCEPT SELECT a FROM t1_setop ORDER BY a) +ORDER BY a; + a +--- + 1 + 2 + 4 + 5 +(4 rows) + +create table t1_ncols(a int, b int, c text, d date); +create table t2_ncols(a smallint, b bigint, c varchar(20), d date) + partition by range (a) (start (0) end (8) every (4)); +create view v1_ncols(id, a, b, c, d) as select 1,* from t1_ncols union all select 2,* from t2_ncols; +insert into t1_ncols values (1, 11, 'one', '2001-01-01'); +insert into t2_ncols values (2, 22, 'two', '2002-02-02'); +insert into t2_ncols values (4, 44, 'four','2004-04-04'); +select b from t1_ncols union all select a from t2_ncols; + b +---- + 4 + 2 + 11 +(3 rows) + +select a+100, b, d from t1_ncols union select b, a+200, d from t2_ncols order by 1; + ?column? | b | d +----------+-----+------------ + 22 | 202 | 02-02-2002 + 44 | 204 | 04-04-2004 + 101 | 11 | 01-01-2001 +(3 rows) + +select c, a from v1_ncols; + c | a +------+--- + one | 1 + four | 4 + two | 2 +(3 rows) + +with cte1(aa, b, c, d) as (select a*100, b, c, d from t1_ncols union select * from t2_ncols) +select x.aa/100 aaa, x.c, y.c from cte1 x join cte1 y on x.aa=y.aa; + aaa | c | c +-----+------+------ + 0 | two | two + 0 | four | four + 1 | one | one +(3 rows) + +select from t2_ncols union select * from t2_ncols; +ERROR: each UNION query must have the same number of columns +LINE 1: select from t2_ncols union select * from t2_ncols; + ^ +-- Test the result of union of 2 tables distributed on different number of segments +-- start_ignore +drop schema if exists union_schema CASCADE; +NOTICE: schema "union_schema" does not exist, skipping +-- end_ignore +create schema union_schema; +create table union_schema.t1(a int, b int); +create table union_schema.t2(a int, b int); +create table union_schema.t3(a int, b int); +set allow_system_table_mods = on; +update gp_distribution_policy set numsegments = 1 + where localoid = 'union_schema.t1'::regclass::oid; +update gp_distribution_policy set numsegments = 2 + where localoid = 'union_schema.t2'::regclass::oid; +-- start_ignore +select relname, policytype, numsegments, distkey + from pg_class, gp_distribution_policy, pg_namespace ns + where pg_class.oid = localoid and relnamespace = ns.oid + and nspname = 'union_schema' + and relname in ('t1', 't2', 't3') + order by relname; + relname | policytype | numsegments | distkey +---------+------------+-------------+--------- + t1 | p | 1 | 1 + t2 | p | 2 | 1 + t3 | p | 3 | 1 +(3 rows) + +-- end_ignore +insert into union_schema.t1 select i, i from generate_series(1,10)i; +insert into union_schema.t2 select i, i from generate_series(1,20)i; +analyze union_schema.t1; +analyze union_schema.t2; +explain select * from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b; + QUERY PLAN +--------------------------------------------------------------- + Hash Join (cost=1.23..2.60 rows=10 width=16) + Hash Cond: (t2.b = t1.a) + -> Seq Scan on t2 (cost=0.00..1.20 rows=20 width=8) + -> Hash (cost=1.10..1.10 rows=10 width=8) + -> Seq Scan on t1 (cost=0.00..1.10 rows=10 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +explain select union_schema.t1.a, union_schema.t2.b + from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b + union all + select * from union_schema.t3; + QUERY PLAN +--------------------------------------------------------------------- + Append (cost=1.23..149.10 rows=9100 width=8) + -> Hash Join (cost=1.23..2.60 rows=10 width=8) + Hash Cond: (t2.b = t1.a) + -> Seq Scan on t2 (cost=0.00..1.20 rows=20 width=4) + -> Hash (cost=1.10..1.10 rows=10 width=4) + -> Seq Scan on t1 (cost=0.00..1.10 rows=10 width=4) + -> Seq Scan on t3 (cost=0.00..100.90 rows=9090 width=8) + Optimizer: Postgres query optimizer +(8 rows) + +select * from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b; + a | b | a | b +----+----+----+---- + 2 | 2 | 2 | 2 + 3 | 3 | 3 | 3 + 4 | 4 | 4 | 4 + 6 | 6 | 6 | 6 + 7 | 7 | 7 | 7 + 8 | 8 | 8 | 8 + 9 | 9 | 9 | 9 + 10 | 10 | 10 | 10 + 1 | 1 | 1 | 1 + 5 | 5 | 5 | 5 +(10 rows) + +select union_schema.t1.a, union_schema.t2.b + from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b +union all +select * from union_schema.t3; + a | b +----+---- + 2 | 2 + 3 | 3 + 4 | 4 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 + 1 | 1 + 5 | 5 +(10 rows) + +truncate union_schema.t1, union_schema.t2; +insert into union_schema.t1 select i, i from generate_series(1,20)i; +insert into union_schema.t2 select i, i from generate_series(1,10)i; +analyze union_schema.t1; +analyze union_schema.t2; +explain select * from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b; + QUERY PLAN +--------------------------------------------------------------- + Hash Join (cost=1.23..2.60 rows=10 width=16) + Hash Cond: (t1.a = t2.b) + -> Seq Scan on t1 (cost=0.00..1.20 rows=20 width=8) + -> Hash (cost=1.10..1.10 rows=10 width=8) + -> Seq Scan on t2 (cost=0.00..1.10 rows=10 width=8) + Optimizer: Postgres query optimizer +(6 rows) + +explain select union_schema.t1.a, union_schema.t2.b + from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b + union all + select * from union_schema.t3; + QUERY PLAN +--------------------------------------------------------------------- + Append (cost=1.23..149.10 rows=9100 width=8) + -> Hash Join (cost=1.23..2.60 rows=10 width=8) + Hash Cond: (t1.a = t2.b) + -> Seq Scan on t1 (cost=0.00..1.20 rows=20 width=4) + -> Hash (cost=1.10..1.10 rows=10 width=4) + -> Seq Scan on t2 (cost=0.00..1.10 rows=10 width=4) + -> Seq Scan on t3 (cost=0.00..100.90 rows=9090 width=8) + Optimizer: Postgres query optimizer +(8 rows) + +select * from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b; + a | b | a | b +----+----+----+---- + 1 | 1 | 1 | 1 + 2 | 2 | 2 | 2 + 3 | 3 | 3 | 3 + 4 | 4 | 4 | 4 + 5 | 5 | 5 | 5 + 6 | 6 | 6 | 6 + 7 | 7 | 7 | 7 + 8 | 8 | 8 | 8 + 9 | 9 | 9 | 9 + 10 | 10 | 10 | 10 +(10 rows) + +select union_schema.t1.a, union_schema.t2.b + from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b +union all +select * from union_schema.t3; + a | b +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 + 10 | 10 +(10 rows) + +reset allow_system_table_mods; +-- +-- Clean up +-- +DROP TABLE IF EXISTS T_a1 CASCADE; +DROP TABLE IF EXISTS T_b2 CASCADE; +DROP TABLE IF EXISTS T_random CASCADE; +DROP VIEW IF EXISTS v1_ncols CASCADE; +DROP TABLE IF EXISTS t1_ncols CASCADE; +DROP TABLE IF EXISTS t2_ncols CASCADE; +DROP SCHEMA IF EXISTS union_schema CASCADE; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table union_schema.t1 +drop cascades to table union_schema.t2 +drop cascades to table union_schema.t3 diff --git a/src/test/singlenode_regress/expected/updatable_views.out b/src/test/singlenode_regress/expected/updatable_views.out new file mode 100644 index 00000000000..4b21f087df2 --- /dev/null +++ b/src/test/singlenode_regress/expected/updatable_views.out @@ -0,0 +1,3148 @@ +-- +-- UPDATABLE VIEWS +-- +-- avoid bit-exact output here because operations may not be bit-exact. +SET extra_float_digits = 0; +-- GPDB: to get similar plans as upstream. +set enable_mergejoin=on; +set enable_nestloop=on; +-- check that non-updatable views and columns are rejected with useful error +-- messages +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; +CREATE VIEW ro_view1 AS SELECT DISTINCT a, b FROM base_tbl; -- DISTINCT not supported +CREATE VIEW ro_view2 AS SELECT a, b FROM base_tbl GROUP BY a, b; -- GROUP BY not supported +CREATE VIEW ro_view3 AS SELECT 1 FROM base_tbl HAVING max(a) > 0; -- HAVING not supported +CREATE VIEW ro_view4 AS SELECT count(*) FROM base_tbl; -- Aggregate functions not supported +CREATE VIEW ro_view5 AS SELECT a, rank() OVER() FROM base_tbl; -- Window functions not supported +CREATE VIEW ro_view6 AS SELECT a, b FROM base_tbl UNION SELECT -a, b FROM base_tbl; -- Set ops not supported +CREATE VIEW ro_view7 AS WITH t AS (SELECT a, b FROM base_tbl) SELECT * FROM t; -- WITH not supported +CREATE VIEW ro_view8 AS SELECT a, b FROM base_tbl ORDER BY a OFFSET 1; -- OFFSET not supported +CREATE VIEW ro_view9 AS SELECT a, b FROM base_tbl ORDER BY a LIMIT 1; -- LIMIT not supported +CREATE VIEW ro_view10 AS SELECT 1 AS a; -- No base relations +CREATE VIEW ro_view11 AS SELECT b1.a, b2.b FROM base_tbl b1, base_tbl b2; -- Multiple base relations +CREATE VIEW ro_view12 AS SELECT * FROM generate_series(1, 10) AS g(a); -- SRF in rangetable +CREATE VIEW ro_view13 AS SELECT a, b FROM (SELECT * FROM base_tbl) AS t; -- Subselect in rangetable +CREATE VIEW rw_view14 AS SELECT ctid, a, b FROM base_tbl; -- System columns may be part of an updatable view +CREATE VIEW rw_view15 AS SELECT a, upper(b) FROM base_tbl; -- Expression/function may be part of an updatable view +CREATE VIEW rw_view16 AS SELECT a, b, a AS aa FROM base_tbl; -- Repeated column may be part of an updatable view +CREATE VIEW ro_view17 AS SELECT * FROM ro_view1; -- Base relation not updatable +CREATE VIEW ro_view18 AS SELECT * FROM (VALUES(1)) AS tmp(a); -- VALUES in rangetable +CREATE SEQUENCE uv_seq CACHE 1; +CREATE VIEW ro_view19 AS SELECT * FROM uv_seq; -- View based on a sequence +CREATE VIEW ro_view20 AS SELECT a, b, generate_series(1, a) g FROM base_tbl; -- SRF in targetlist not supported +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + ro_view1 | NO + ro_view10 | NO + ro_view11 | NO + ro_view12 | NO + ro_view13 | NO + ro_view17 | NO + ro_view18 | NO + ro_view19 | NO + ro_view2 | NO + ro_view20 | NO + ro_view3 | NO + ro_view4 | NO + ro_view5 | NO + ro_view6 | NO + ro_view7 | NO + ro_view8 | NO + ro_view9 | NO + rw_view14 | YES + rw_view15 | YES + rw_view16 | YES +(20 rows) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + ro_view1 | NO | NO + ro_view10 | NO | NO + ro_view11 | NO | NO + ro_view12 | NO | NO + ro_view13 | NO | NO + ro_view17 | NO | NO + ro_view18 | NO | NO + ro_view19 | NO | NO + ro_view2 | NO | NO + ro_view20 | NO | NO + ro_view3 | NO | NO + ro_view4 | NO | NO + ro_view5 | NO | NO + ro_view6 | NO | NO + ro_view7 | NO | NO + ro_view8 | NO | NO + ro_view9 | NO | NO + rw_view14 | YES | YES + rw_view15 | YES | YES + rw_view16 | YES | YES +(20 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + ro_view1 | a | NO + ro_view1 | b | NO + ro_view10 | a | NO + ro_view11 | a | NO + ro_view11 | b | NO + ro_view12 | a | NO + ro_view13 | a | NO + ro_view13 | b | NO + ro_view17 | a | NO + ro_view17 | b | NO + ro_view18 | a | NO + ro_view19 | last_value | NO + ro_view19 | log_cnt | NO + ro_view19 | is_called | NO + ro_view2 | a | NO + ro_view2 | b | NO + ro_view20 | a | NO + ro_view20 | b | NO + ro_view20 | g | NO + ro_view3 | ?column? | NO + ro_view4 | count | NO + ro_view5 | a | NO + ro_view5 | rank | NO + ro_view6 | a | NO + ro_view6 | b | NO + ro_view7 | a | NO + ro_view7 | b | NO + ro_view8 | a | NO + ro_view8 | b | NO + ro_view9 | a | NO + ro_view9 | b | NO + rw_view14 | ctid | NO + rw_view14 | a | YES + rw_view14 | b | YES + rw_view15 | a | YES + rw_view15 | upper | NO + rw_view16 | a | YES + rw_view16 | b | YES + rw_view16 | aa | YES +(39 rows) + +-- Read-only views +DELETE FROM ro_view1; +ERROR: cannot delete from view "ro_view1" +DETAIL: Views containing DISTINCT are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +DELETE FROM ro_view2; +ERROR: cannot delete from view "ro_view2" +DETAIL: Views containing GROUP BY are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +DELETE FROM ro_view3; +ERROR: cannot delete from view "ro_view3" +DETAIL: Views containing HAVING are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +DELETE FROM ro_view4; +ERROR: cannot delete from view "ro_view4" +DETAIL: Views that return aggregate functions are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +DELETE FROM ro_view5; +ERROR: cannot delete from view "ro_view5" +DETAIL: Views that return window functions are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +DELETE FROM ro_view6; +ERROR: cannot delete from view "ro_view6" +DETAIL: Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +UPDATE ro_view7 SET a=a+1; +ERROR: cannot update view "ro_view7" +DETAIL: Views containing WITH are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE ro_view8 SET a=a+1; +ERROR: cannot update view "ro_view8" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE ro_view9 SET a=a+1; +ERROR: cannot update view "ro_view9" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE ro_view10 SET a=a+1; +ERROR: cannot update view "ro_view10" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE ro_view11 SET a=a+1; +ERROR: cannot update view "ro_view11" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE ro_view12 SET a=a+1; +ERROR: cannot update view "ro_view12" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +INSERT INTO ro_view13 VALUES (3, 'Row 3'); +ERROR: cannot insert into view "ro_view13" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +-- Partially updatable view +INSERT INTO rw_view14 VALUES (null, 3, 'Row 3'); -- should fail +ERROR: cannot insert into column "ctid" of view "rw_view14" +DETAIL: View columns that refer to system columns are not updatable. +INSERT INTO rw_view14 (a, b) VALUES (3, 'Row 3'); -- should be OK +UPDATE rw_view14 SET ctid=null WHERE a=3; -- should fail +ERROR: cannot update column "ctid" of view "rw_view14" +DETAIL: View columns that refer to system columns are not updatable. +UPDATE rw_view14 SET b='ROW 3' WHERE a=3; -- should be OK +SELECT * FROM base_tbl; + a | b +----+-------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | Row 1 + 2 | Row 2 + 3 | ROW 3 +(6 rows) + +DELETE FROM rw_view14 WHERE a=3; -- should be OK +-- Partially updatable view +INSERT INTO rw_view15 VALUES (3, 'ROW 3'); -- should fail +ERROR: cannot insert into column "upper" of view "rw_view15" +DETAIL: View columns that are not columns of their base relation are not updatable. +INSERT INTO rw_view15 (a) VALUES (3); -- should be OK +INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT DO NOTHING; -- succeeds +SELECT * FROM rw_view15; + a | upper +----+------------- + -2 | ROW -2 + -1 | ROW -1 + 0 | ROW 0 + 1 | ROW 1 + 2 | ROW 2 + 3 | UNSPECIFIED +(6 rows) + +INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT (a) DO NOTHING; -- succeeds +SELECT * FROM rw_view15; + a | upper +----+------------- + -2 | ROW -2 + -1 | ROW -1 + 0 | ROW 0 + 1 | ROW 1 + 2 | ROW 2 + 3 | UNSPECIFIED +(6 rows) + +INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT (a) DO UPDATE set a = excluded.a; -- succeeds +SELECT * FROM rw_view15; + a | upper +----+------------- + -2 | ROW -2 + -1 | ROW -1 + 0 | ROW 0 + 1 | ROW 1 + 2 | ROW 2 + 3 | UNSPECIFIED +(6 rows) + +INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT (a) DO UPDATE set upper = 'blarg'; -- fails +ERROR: cannot insert into column "upper" of view "rw_view15" +DETAIL: View columns that are not columns of their base relation are not updatable. +SELECT * FROM rw_view15; + a | upper +----+------------- + -2 | ROW -2 + -1 | ROW -1 + 0 | ROW 0 + 1 | ROW 1 + 2 | ROW 2 + 3 | UNSPECIFIED +(6 rows) + +SELECT * FROM rw_view15; + a | upper +----+------------- + -2 | ROW -2 + -1 | ROW -1 + 0 | ROW 0 + 1 | ROW 1 + 2 | ROW 2 + 3 | UNSPECIFIED +(6 rows) + +ALTER VIEW rw_view15 ALTER COLUMN upper SET DEFAULT 'NOT SET'; +INSERT INTO rw_view15 (a) VALUES (4); -- should fail +ERROR: cannot insert into column "upper" of view "rw_view15" +DETAIL: View columns that are not columns of their base relation are not updatable. +UPDATE rw_view15 SET upper='ROW 3' WHERE a=3; -- should fail +ERROR: cannot update column "upper" of view "rw_view15" +DETAIL: View columns that are not columns of their base relation are not updatable. +UPDATE rw_view15 SET upper=DEFAULT WHERE a=3; -- should fail +ERROR: cannot update column "upper" of view "rw_view15" +DETAIL: View columns that are not columns of their base relation are not updatable. +UPDATE rw_view15 SET a=4 WHERE a=3; -- should be OK +SELECT * FROM base_tbl; + a | b +----+------------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | Row 1 + 2 | Row 2 + 4 | Unspecified +(6 rows) + +DELETE FROM rw_view15 WHERE a=4; -- should be OK +-- Partially updatable view +INSERT INTO rw_view16 VALUES (3, 'Row 3', 3); -- should fail +ERROR: multiple assignments to same column "a" +INSERT INTO rw_view16 (a, b) VALUES (3, 'Row 3'); -- should be OK +UPDATE rw_view16 SET a=3, aa=-3 WHERE a=3; -- should fail +ERROR: multiple assignments to same column "a" +UPDATE rw_view16 SET aa=-3 WHERE a=3; -- should be OK +SELECT * FROM base_tbl; + a | b +----+-------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | Row 1 + 2 | Row 2 + -3 | Row 3 +(6 rows) + +DELETE FROM rw_view16 WHERE a=-3; -- should be OK +-- Read-only views +INSERT INTO ro_view17 VALUES (3, 'ROW 3'); +ERROR: cannot insert into view "ro_view1" +DETAIL: Views containing DISTINCT are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +DELETE FROM ro_view18; +ERROR: cannot delete from view "ro_view18" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +UPDATE ro_view19 SET last_value=1000; +ERROR: cannot update view "ro_view19" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +UPDATE ro_view20 SET b=upper(b); +ERROR: cannot update view "ro_view20" +DETAIL: Views that return set-returning functions are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +-- A view with a conditional INSTEAD rule but no unconditional INSTEAD rules +-- or INSTEAD OF triggers should be non-updatable and generate useful error +-- messages with appropriate detail +CREATE RULE rw_view16_ins_rule AS ON INSERT TO rw_view16 + WHERE NEW.a > 0 DO INSTEAD INSERT INTO base_tbl VALUES (NEW.a, NEW.b); +CREATE RULE rw_view16_upd_rule AS ON UPDATE TO rw_view16 + WHERE OLD.a > 0 DO INSTEAD UPDATE base_tbl SET b=NEW.b WHERE a=OLD.a; +CREATE RULE rw_view16_del_rule AS ON DELETE TO rw_view16 + WHERE OLD.a > 0 DO INSTEAD DELETE FROM base_tbl WHERE a=OLD.a; +INSERT INTO rw_view16 (a, b) VALUES (3, 'Row 3'); -- should fail +ERROR: cannot insert into view "rw_view16" +DETAIL: Views with conditional DO INSTEAD rules are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +UPDATE rw_view16 SET b='ROW 2' WHERE a=2; -- should fail +ERROR: cannot update view "rw_view16" +DETAIL: Views with conditional DO INSTEAD rules are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +DELETE FROM rw_view16 WHERE a=2; -- should fail +ERROR: cannot delete from view "rw_view16" +DETAIL: Views with conditional DO INSTEAD rules are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 16 other objects +DETAIL: drop cascades to view ro_view1 +drop cascades to view ro_view17 +drop cascades to view ro_view2 +drop cascades to view ro_view3 +drop cascades to view ro_view4 +drop cascades to view ro_view5 +drop cascades to view ro_view6 +drop cascades to view ro_view7 +drop cascades to view ro_view8 +drop cascades to view ro_view9 +drop cascades to view ro_view11 +drop cascades to view ro_view13 +drop cascades to view rw_view14 +drop cascades to view rw_view15 +drop cascades to view rw_view16 +drop cascades to view ro_view20 +DROP VIEW ro_view10, ro_view12, ro_view18; +DROP SEQUENCE uv_seq CASCADE; +NOTICE: drop cascades to view ro_view19 +-- simple updatable view +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a>0; +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name = 'rw_view1'; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | YES +(1 row) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name = 'rw_view1'; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view1 | YES | YES +(1 row) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name = 'rw_view1' + ORDER BY ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | YES + rw_view1 | b | YES +(2 rows) + +INSERT INTO rw_view1 VALUES (3, 'Row 3'); +INSERT INTO rw_view1 (a) VALUES (4); +UPDATE rw_view1 SET a=5 WHERE a=4; +DELETE FROM rw_view1 WHERE b='Row 2'; +SELECT * FROM base_tbl; + a | b +----+------------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | Row 1 + 3 | Row 3 + 5 | Unspecified +(6 rows) + +EXPLAIN (costs off) UPDATE rw_view1 SET a=6 WHERE a=5; + QUERY PLAN +--------------------------------------- + Update on base_tbl + -> Seq Scan on base_tbl + Filter: ((a > 0) AND (a = 5)) + Optimizer: Postgres query optimizer +(4 rows) + +EXPLAIN (costs off) DELETE FROM rw_view1 WHERE a=5; + QUERY PLAN +--------------------------------------- + Delete on base_tbl + -> Seq Scan on base_tbl + Filter: ((a > 0) AND (a = 5)) + Optimizer: Postgres query optimizer +(4 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- view on top of view +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; +CREATE VIEW rw_view1 AS SELECT b AS bb, a AS aa FROM base_tbl WHERE a>0; +CREATE VIEW rw_view2 AS SELECT aa AS aaa, bb AS bbb FROM rw_view1 WHERE aa<10; +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name = 'rw_view2'; + table_name | is_insertable_into +------------+-------------------- + rw_view2 | YES +(1 row) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name = 'rw_view2'; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view2 | YES | YES +(1 row) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name = 'rw_view2' + ORDER BY ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view2 | aaa | YES + rw_view2 | bbb | YES +(2 rows) + +INSERT INTO rw_view2 VALUES (3, 'Row 3'); +INSERT INTO rw_view2 (aaa) VALUES (4); +SELECT * FROM rw_view2; + aaa | bbb +-----+------------- + 1 | Row 1 + 2 | Row 2 + 3 | Row 3 + 4 | Unspecified +(4 rows) + +UPDATE rw_view2 SET bbb='Row 4' WHERE aaa=4; +DELETE FROM rw_view2 WHERE aaa=2; +SELECT * FROM rw_view2; + aaa | bbb +-----+------- + 1 | Row 1 + 3 | Row 3 + 4 | Row 4 +(3 rows) + +EXPLAIN (costs off) UPDATE rw_view2 SET aaa=5 WHERE aaa=4; + QUERY PLAN +---------------------------------------------------- + Update on base_tbl + -> Seq Scan on base_tbl + Filter: ((a < 10) AND (a > 0) AND (a = 4)) + Optimizer: Postgres query optimizer +(4 rows) + +EXPLAIN (costs off) DELETE FROM rw_view2 WHERE aaa=4; + QUERY PLAN +---------------------------------------------------- + Delete on base_tbl + -> Seq Scan on base_tbl + Filter: ((a < 10) AND (a > 0) AND (a = 4)) + Optimizer: Postgres query optimizer +(4 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +-- view on top of view with rules +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a>0 OFFSET 0; -- not updatable without rules/triggers +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a<10; +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | NO + rw_view2 | NO +(2 rows) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view1 | NO | NO + rw_view2 | NO | NO +(2 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | NO + rw_view1 | b | NO + rw_view2 | a | NO + rw_view2 | b | NO +(4 rows) + +CREATE RULE rw_view1_ins_rule AS ON INSERT TO rw_view1 + DO INSTEAD INSERT INTO base_tbl VALUES (NEW.a, NEW.b) RETURNING *; +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | YES + rw_view2 | YES +(2 rows) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view1 | NO | YES + rw_view2 | NO | YES +(2 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | NO + rw_view1 | b | NO + rw_view2 | a | NO + rw_view2 | b | NO +(4 rows) + +CREATE RULE rw_view1_upd_rule AS ON UPDATE TO rw_view1 + DO INSTEAD UPDATE base_tbl SET b=NEW.b WHERE a=OLD.a RETURNING NEW.*; +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | YES + rw_view2 | YES +(2 rows) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view1 | NO | YES + rw_view2 | NO | YES +(2 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | NO + rw_view1 | b | NO + rw_view2 | a | NO + rw_view2 | b | NO +(4 rows) + +CREATE RULE rw_view1_del_rule AS ON DELETE TO rw_view1 + DO INSTEAD DELETE FROM base_tbl WHERE a=OLD.a RETURNING OLD.*; +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | YES + rw_view2 | YES +(2 rows) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view1 | YES | YES + rw_view2 | YES | YES +(2 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | YES + rw_view1 | b | YES + rw_view2 | a | YES + rw_view2 | b | YES +(4 rows) + +INSERT INTO rw_view2 VALUES (3, 'Row 3') RETURNING *; + a | b +---+------- + 3 | Row 3 +(1 row) + +UPDATE rw_view2 SET b='Row three' WHERE a=3 RETURNING *; + a | b +---+----------- + 3 | Row three +(1 row) + +SELECT * FROM rw_view2; + a | b +---+----------- + 1 | Row 1 + 2 | Row 2 + 3 | Row three +(3 rows) + +DELETE FROM rw_view2 WHERE a=3 RETURNING *; + a | b +---+----------- + 3 | Row three +(1 row) + +SELECT * FROM rw_view2; + a | b +---+------- + 1 | Row 1 + 2 | Row 2 +(2 rows) + +EXPLAIN (costs off) UPDATE rw_view2 SET a=3 WHERE a=2; + QUERY PLAN +---------------------------------------------------------------------- + Update on base_tbl + -> Nested Loop + -> Seq Scan on base_tbl + Filter: ((a < 10) AND (a = 2)) + -> Materialize + -> Subquery Scan on rw_view1 + Filter: ((rw_view1.a < 10) AND (rw_view1.a = 2)) + -> Seq Scan on base_tbl base_tbl_1 + Filter: (a > 0) + Optimizer: Postgres query optimizer +(10 rows) + +EXPLAIN (costs off) DELETE FROM rw_view2 WHERE a=2; + QUERY PLAN +---------------------------------------------------------------------- + Delete on base_tbl + -> Nested Loop + -> Seq Scan on base_tbl + Filter: ((a < 10) AND (a = 2)) + -> Materialize + -> Subquery Scan on rw_view1 + Filter: ((rw_view1.a < 10) AND (rw_view1.a = 2)) + -> Seq Scan on base_tbl base_tbl_1 + Filter: (a > 0) + Optimizer: Postgres query optimizer +(10 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +-- view on top of view with triggers +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a>0 OFFSET 0; -- not updatable without rules/triggers +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a<10; +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | NO + rw_view2 | NO +(2 rows) + +SELECT table_name, is_updatable, is_insertable_into, + is_trigger_updatable, is_trigger_deletable, + is_trigger_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +------------+--------------+--------------------+----------------------+----------------------+---------------------------- + rw_view1 | NO | NO | NO | NO | NO + rw_view2 | NO | NO | NO | NO | NO +(2 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | NO + rw_view1 | b | NO + rw_view2 | a | NO + rw_view2 | b | NO +(4 rows) + +CREATE FUNCTION rw_view1_trig_fn() +RETURNS trigger AS +$$ +BEGIN + IF TG_OP = 'INSERT' THEN + INSERT INTO base_tbl VALUES (NEW.a, NEW.b); + RETURN NEW; + ELSIF TG_OP = 'UPDATE' THEN + UPDATE base_tbl SET b=NEW.b WHERE a=OLD.a; + RETURN NEW; + ELSIF TG_OP = 'DELETE' THEN + DELETE FROM base_tbl WHERE a=OLD.a; + RETURN OLD; + END IF; +END; +$$ +LANGUAGE plpgsql; +CREATE TRIGGER rw_view1_ins_trig INSTEAD OF INSERT ON rw_view1 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | NO + rw_view2 | NO +(2 rows) + +SELECT table_name, is_updatable, is_insertable_into, + is_trigger_updatable, is_trigger_deletable, + is_trigger_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +------------+--------------+--------------------+----------------------+----------------------+---------------------------- + rw_view1 | NO | NO | NO | NO | NO + rw_view2 | NO | NO | NO | NO | NO +(2 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | NO + rw_view1 | b | NO + rw_view2 | a | NO + rw_view2 | b | NO +(4 rows) + +CREATE TRIGGER rw_view1_upd_trig INSTEAD OF UPDATE ON rw_view1 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | NO + rw_view2 | NO +(2 rows) + +SELECT table_name, is_updatable, is_insertable_into, + is_trigger_updatable, is_trigger_deletable, + is_trigger_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +------------+--------------+--------------------+----------------------+----------------------+---------------------------- + rw_view1 | NO | NO | NO | NO | NO + rw_view2 | NO | NO | NO | NO | NO +(2 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | NO + rw_view1 | b | NO + rw_view2 | a | NO + rw_view2 | b | NO +(4 rows) + +CREATE TRIGGER rw_view1_del_trig INSTEAD OF DELETE ON rw_view1 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | NO + rw_view2 | NO +(2 rows) + +SELECT table_name, is_updatable, is_insertable_into, + is_trigger_updatable, is_trigger_deletable, + is_trigger_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +------------+--------------+--------------------+----------------------+----------------------+---------------------------- + rw_view1 | NO | NO | NO | NO | NO + rw_view2 | NO | NO | NO | NO | NO +(2 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | a | NO + rw_view1 | b | NO + rw_view2 | a | NO + rw_view2 | b | NO +(4 rows) + +INSERT INTO rw_view2 VALUES (3, 'Row 3') RETURNING *; +ERROR: cannot insert into view "rw_view1" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +UPDATE rw_view2 SET b='Row three' WHERE a=3 RETURNING *; +ERROR: cannot update view "rw_view1" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +SELECT * FROM rw_view2; + a | b +---+------- + 1 | Row 1 + 2 | Row 2 +(2 rows) + +DELETE FROM rw_view2 WHERE a=3 RETURNING *; +ERROR: cannot delete from view "rw_view1" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +SELECT * FROM rw_view2; + a | b +---+------- + 1 | Row 1 + 2 | Row 2 +(2 rows) + +EXPLAIN (costs off) UPDATE rw_view2 SET a=3 WHERE a=2; +ERROR: cannot update view "rw_view1" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule. +EXPLAIN (costs off) DELETE FROM rw_view2 WHERE a=2; +ERROR: cannot delete from view "rw_view1" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +DROP FUNCTION rw_view1_trig_fn(); +-- update using whole row from view +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; +CREATE VIEW rw_view1 AS SELECT b AS bb, a AS aa FROM base_tbl; +CREATE FUNCTION rw_view1_aa(x rw_view1) + RETURNS int AS $$ SELECT x.aa $$ LANGUAGE sql; +UPDATE rw_view1 v SET bb='Updated row 2' WHERE rw_view1_aa(v)=2 + RETURNING rw_view1_aa(v), v.bb; + rw_view1_aa | bb +-------------+--------------- + 2 | Updated row 2 +(1 row) + +SELECT * FROM base_tbl; + a | b +----+--------------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | Row 1 + 2 | Updated row 2 +(5 rows) + +EXPLAIN (costs off) +UPDATE rw_view1 v SET bb='Updated row 2' WHERE rw_view1_aa(v)=2 + RETURNING rw_view1_aa(v), v.bb; + QUERY PLAN +------------------------------------- + Update on base_tbl + -> Seq Scan on base_tbl + Filter: (a = 2) + Optimizer: Postgres query optimizer +(4 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to function rw_view1_aa(rw_view1) +-- permissions checks +CREATE USER regress_view_user1; +CREATE USER regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user1; +CREATE TABLE base_tbl(a int, b text, c float); +INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); +CREATE VIEW rw_view1 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; +INSERT INTO rw_view1 VALUES ('Row 2', 2.0, 2); +GRANT SELECT ON base_tbl TO regress_view_user2; +GRANT SELECT ON rw_view1 TO regress_view_user2; +GRANT UPDATE (a,c) ON base_tbl TO regress_view_user2; +GRANT UPDATE (bb,cc) ON rw_view1 TO regress_view_user2; +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_view_user2; +CREATE VIEW rw_view2 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; +SELECT * FROM base_tbl; -- ok + a | b | c +---+-------+--- + 1 | Row 1 | 1 + 2 | Row 2 | 2 +(2 rows) + +SELECT * FROM rw_view1; -- ok + bb | cc | aa +-------+----+---- + Row 1 | 1 | 1 + Row 2 | 2 | 2 +(2 rows) + +SELECT * FROM rw_view2; -- ok + bb | cc | aa +-------+----+---- + Row 1 | 1 | 1 + Row 2 | 2 | 2 +(2 rows) + +INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- not allowed +ERROR: permission denied for table base_tbl +INSERT INTO rw_view1 VALUES ('Row 3', 3.0, 3); -- not allowed +ERROR: permission denied for view rw_view1 +INSERT INTO rw_view2 VALUES ('Row 3', 3.0, 3); -- not allowed +ERROR: permission denied for table base_tbl +UPDATE base_tbl SET a=a, c=c; -- ok +UPDATE base_tbl SET b=b; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view1 SET bb=bb, cc=cc; -- ok +UPDATE rw_view1 SET aa=aa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET aa=aa, cc=cc; -- ok +UPDATE rw_view2 SET bb=bb; -- not allowed +ERROR: permission denied for table base_tbl +DELETE FROM base_tbl; -- not allowed +ERROR: permission denied for table base_tbl +DELETE FROM rw_view1; -- not allowed +ERROR: permission denied for view rw_view1 +DELETE FROM rw_view2; -- not allowed +ERROR: permission denied for table base_tbl +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_view_user1; +GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- ok +INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed +ERROR: permission denied for view rw_view1 +INSERT INTO rw_view2 VALUES ('Row 4', 4.0, 4); -- ok +DELETE FROM base_tbl WHERE a=1; -- ok +DELETE FROM rw_view1 WHERE aa=2; -- not allowed +ERROR: permission denied for view rw_view1 +DELETE FROM rw_view2 WHERE aa=2; -- ok +SELECT * FROM base_tbl; + a | b | c +---+-------+--- + 3 | Row 3 | 3 + 4 | Row 4 | 4 +(2 rows) + +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_view_user1; +REVOKE INSERT, DELETE ON base_tbl FROM regress_view_user2; +GRANT INSERT, DELETE ON rw_view1 TO regress_view_user2; +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO base_tbl VALUES (5, 'Row 5', 5.0); -- not allowed +ERROR: permission denied for table base_tbl +INSERT INTO rw_view1 VALUES ('Row 5', 5.0, 5); -- ok +INSERT INTO rw_view2 VALUES ('Row 6', 6.0, 6); -- not allowed +ERROR: permission denied for table base_tbl +DELETE FROM base_tbl WHERE a=3; -- not allowed +ERROR: permission denied for table base_tbl +DELETE FROM rw_view1 WHERE aa=3; -- ok +DELETE FROM rw_view2 WHERE aa=4; -- not allowed +ERROR: permission denied for table base_tbl +SELECT * FROM base_tbl; + a | b | c +---+-------+--- + 4 | Row 4 | 4 + 5 | Row 5 | 5 +(2 rows) + +RESET SESSION AUTHORIZATION; +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +-- nested-view permissions +CREATE TABLE base_tbl(a int, b text, c float); +INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); +SET SESSION AUTHORIZATION regress_view_user1; +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl; +SELECT * FROM rw_view1; -- not allowed +ERROR: permission denied for table base_tbl +SELECT * FROM rw_view1 FOR UPDATE; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user2; +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for view rw_view1 +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +ERROR: permission denied for view rw_view1 +RESET SESSION AUTHORIZATION; +GRANT SELECT ON base_tbl TO regress_view_user1; +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; + a | b | c +---+-------+--- + 1 | Row 1 | 1 +(1 row) + +SELECT * FROM rw_view1 FOR UPDATE; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for view rw_view1 +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +ERROR: permission denied for view rw_view1 +SET SESSION AUTHORIZATION regress_view_user1; +GRANT SELECT ON rw_view1 TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; + a | b | c +---+-------+--- + 1 | Row 1 | 1 +(1 row) + +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +ERROR: permission denied for view rw_view1 +RESET SESSION AUTHORIZATION; +GRANT UPDATE ON base_tbl TO regress_view_user1; +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; + a | b | c +---+-------+--- + 1 | Row 1 | 1 +(1 row) + +SELECT * FROM rw_view1 FOR UPDATE; + a | b | c +---+-------+--- + 1 | Row 1 | 1 +(1 row) + +UPDATE rw_view1 SET b = 'foo' WHERE a = 1; +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; + a | b | c +---+-----+--- + 1 | foo | 1 +(1 row) + +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +ERROR: permission denied for view rw_view1 +SET SESSION AUTHORIZATION regress_view_user1; +GRANT UPDATE ON rw_view1 TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; + a | b | c +---+-----+--- + 1 | foo | 1 +(1 row) + +SELECT * FROM rw_view2 FOR UPDATE; + a | b | c +---+-----+--- + 1 | foo | 1 +(1 row) + +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; +RESET SESSION AUTHORIZATION; +REVOKE UPDATE ON base_tbl FROM regress_view_user1; +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; + a | b | c +---+-----+--- + 1 | bar | 1 +(1 row) + +SELECT * FROM rw_view1 FOR UPDATE; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; + a | b | c +---+-----+--- + 1 | bar | 1 +(1 row) + +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +ERROR: permission denied for table base_tbl +RESET SESSION AUTHORIZATION; +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +DROP USER regress_view_user1; +DROP USER regress_view_user2; +-- column defaults +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified', c serial); +INSERT INTO base_tbl VALUES (1, 'Row 1'); +INSERT INTO base_tbl VALUES (2, 'Row 2'); +INSERT INTO base_tbl VALUES (3); +CREATE VIEW rw_view1 AS SELECT a AS aa, b AS bb FROM base_tbl; +ALTER VIEW rw_view1 ALTER COLUMN bb SET DEFAULT 'View default'; +INSERT INTO rw_view1 VALUES (4, 'Row 4'); +INSERT INTO rw_view1 (aa) VALUES (5); +SELECT * FROM base_tbl; + a | b | c +---+--------------+--- + 1 | Row 1 | 1 + 2 | Row 2 | 2 + 3 | Unspecified | 3 + 4 | Row 4 | 4 + 5 | View default | 5 +(5 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- Table having triggers +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl VALUES (1, 'Row 1'); +INSERT INTO base_tbl VALUES (2, 'Row 2'); +CREATE FUNCTION rw_view1_trig_fn() +RETURNS trigger AS +$$ +BEGIN + IF TG_OP = 'INSERT' THEN + UPDATE base_tbl SET b=NEW.b WHERE a=1; + RETURN NULL; + END IF; + RETURN NULL; +END; +$$ +LANGUAGE plpgsql; +CREATE TRIGGER rw_view1_ins_trig AFTER INSERT ON base_tbl + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); +CREATE VIEW rw_view1 AS SELECT a AS aa, b AS bb FROM base_tbl; +INSERT INTO rw_view1 VALUES (3, 'Row 3'); +select * from base_tbl; + a | b +---+------- + 2 | Row 2 + 3 | Row 3 + 1 | Row 3 +(3 rows) + +DROP VIEW rw_view1; +DROP TRIGGER rw_view1_ins_trig on base_tbl; +DROP FUNCTION rw_view1_trig_fn(); +DROP TABLE base_tbl; +-- view with ORDER BY +CREATE TABLE base_tbl (a int, b int); +INSERT INTO base_tbl VALUES (1,2), (4,5), (3,-3); +ANALYZE base_tbl; +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl ORDER BY a+b; +SELECT * FROM rw_view1; + a | b +---+---- + 3 | -3 + 1 | 2 + 4 | 5 +(3 rows) + +INSERT INTO rw_view1 VALUES (7,-8); +SELECT * FROM rw_view1; + a | b +---+---- + 7 | -8 + 3 | -3 + 1 | 2 + 4 | 5 +(4 rows) + +EXPLAIN (verbose, costs off) UPDATE rw_view1 SET b = b + 1 RETURNING *; + QUERY PLAN +------------------------------------------------------------------------- + Update on public.base_tbl + Output: base_tbl.a, base_tbl.b + -> Seq Scan on public.base_tbl + Output: (base_tbl.b + 1), base_tbl.ctid, base_tbl.gp_segment_id + Settings: enable_mergejoin = 'on', enable_nestloop = 'on' + Optimizer: Postgres query optimizer +(6 rows) + +UPDATE rw_view1 SET b = b + 1 RETURNING *; + a | b +---+---- + 1 | 3 + 4 | 6 + 3 | -2 + 7 | -7 +(4 rows) + +SELECT * FROM rw_view1; + a | b +---+---- + 7 | -7 + 3 | -2 + 1 | 3 + 4 | 6 +(4 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- multiple array-column updates +CREATE TABLE base_tbl (a int, arr int[]); +INSERT INTO base_tbl VALUES (1,ARRAY[2]), (3,ARRAY[4]); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl; +UPDATE rw_view1 SET arr[1] = 42, arr[2] = 77 WHERE a = 3; +SELECT * FROM rw_view1; + a | arr +---+--------- + 1 | {2} + 3 | {42,77} +(2 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- views with updatable and non-updatable columns +CREATE TABLE base_tbl(a float); +INSERT INTO base_tbl SELECT i/10.0 FROM generate_series(1,10) g(i); +CREATE VIEW rw_view1 AS + SELECT ctid, sin(a) s, a, cos(a) c + FROM base_tbl + WHERE a != 0 + ORDER BY abs(a); +INSERT INTO rw_view1 VALUES (null, null, 1.1, null); -- should fail +ERROR: cannot insert into column "ctid" of view "rw_view1" +DETAIL: View columns that refer to system columns are not updatable. +INSERT INTO rw_view1 (s, c, a) VALUES (null, null, 1.1); -- should fail +ERROR: cannot insert into column "s" of view "rw_view1" +DETAIL: View columns that are not columns of their base relation are not updatable. +INSERT INTO rw_view1 (a) VALUES (1.1) RETURNING a, s, c; -- OK + a | s | c +-----+-------------------+------------------- + 1.1 | 0.891207360061435 | 0.453596121425577 +(1 row) + +UPDATE rw_view1 SET s = s WHERE a = 1.1; -- should fail +ERROR: cannot update column "s" of view "rw_view1" +DETAIL: View columns that are not columns of their base relation are not updatable. +UPDATE rw_view1 SET a = 1.05 WHERE a = 1.1 RETURNING s; -- OK + s +------------------- + 0.867423225594017 +(1 row) + +DELETE FROM rw_view1 WHERE a = 1.05; -- OK +CREATE VIEW rw_view2 AS + SELECT s, c, s/c t, a base_a, ctid + FROM rw_view1; +INSERT INTO rw_view2 VALUES (null, null, null, 1.1, null); -- should fail +ERROR: cannot insert into column "t" of view "rw_view2" +DETAIL: View columns that are not columns of their base relation are not updatable. +INSERT INTO rw_view2(s, c, base_a) VALUES (null, null, 1.1); -- should fail +ERROR: cannot insert into column "s" of view "rw_view1" +DETAIL: View columns that are not columns of their base relation are not updatable. +INSERT INTO rw_view2(base_a) VALUES (1.1) RETURNING t; -- OK + t +------------------ + 1.96475965724865 +(1 row) + +UPDATE rw_view2 SET s = s WHERE base_a = 1.1; -- should fail +ERROR: cannot update column "s" of view "rw_view1" +DETAIL: View columns that are not columns of their base relation are not updatable. +UPDATE rw_view2 SET t = t WHERE base_a = 1.1; -- should fail +ERROR: cannot update column "t" of view "rw_view2" +DETAIL: View columns that are not columns of their base relation are not updatable. +UPDATE rw_view2 SET base_a = 1.05 WHERE base_a = 1.1; -- OK +DELETE FROM rw_view2 WHERE base_a = 1.05 RETURNING base_a, s, c, t; -- OK + base_a | s | c | t +--------+-------------------+-------------------+------------------ + 1.05 | 0.867423225594017 | 0.497571047891727 | 1.74331530998317 +(1 row) + +CREATE VIEW rw_view3 AS + SELECT s, c, s/c t, ctid + FROM rw_view1; +INSERT INTO rw_view3 VALUES (null, null, null, null); -- should fail +ERROR: cannot insert into column "t" of view "rw_view3" +DETAIL: View columns that are not columns of their base relation are not updatable. +INSERT INTO rw_view3(s) VALUES (null); -- should fail +ERROR: cannot insert into column "s" of view "rw_view1" +DETAIL: View columns that are not columns of their base relation are not updatable. +UPDATE rw_view3 SET s = s; -- should fail +ERROR: cannot update column "s" of view "rw_view1" +DETAIL: View columns that are not columns of their base relation are not updatable. +DELETE FROM rw_view3 WHERE s = sin(0.1); -- should be OK +SELECT * FROM base_tbl ORDER BY a; + a +----- + 0.2 + 0.3 + 0.4 + 0.5 + 0.6 + 0.7 + 0.8 + 0.9 + 1 +(9 rows) + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | YES + rw_view2 | YES + rw_view3 | NO +(3 rows) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view1 | YES | YES + rw_view2 | YES | YES + rw_view3 | NO | NO +(3 rows) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name, ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | ctid | NO + rw_view1 | s | NO + rw_view1 | a | YES + rw_view1 | c | NO + rw_view2 | s | NO + rw_view2 | c | NO + rw_view2 | t | NO + rw_view2 | base_a | YES + rw_view2 | ctid | NO + rw_view3 | s | NO + rw_view3 | c | NO + rw_view3 | t | NO + rw_view3 | ctid | NO +(13 rows) + +SELECT events & 4 != 0 AS upd, + events & 8 != 0 AS ins, + events & 16 != 0 AS del + FROM pg_catalog.pg_relation_is_updatable('rw_view3'::regclass, false) t(events); + upd | ins | del +-----+-----+----- + f | f | t +(1 row) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +drop cascades to view rw_view3 +-- view on table with GENERATED columns +CREATE TABLE base_tbl (id int, idplus1 int GENERATED ALWAYS AS (id + 1) STORED); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl; +INSERT INTO base_tbl (id) VALUES (1); +INSERT INTO rw_view1 (id) VALUES (2); +INSERT INTO base_tbl (id, idplus1) VALUES (3, DEFAULT); +INSERT INTO rw_view1 (id, idplus1) VALUES (4, DEFAULT); +INSERT INTO base_tbl (id, idplus1) VALUES (5, 6); -- error +ERROR: cannot insert a non-DEFAULT value into column "idplus1" +DETAIL: Column "idplus1" is a generated column. +INSERT INTO rw_view1 (id, idplus1) VALUES (6, 7); -- error +ERROR: cannot insert a non-DEFAULT value into column "idplus1" +DETAIL: Column "idplus1" is a generated column. +SELECT * FROM base_tbl; + id | idplus1 +----+--------- + 1 | 2 + 2 | 3 + 3 | 4 + 4 | 5 +(4 rows) + +UPDATE base_tbl SET id = 2000 WHERE id = 2; +UPDATE rw_view1 SET id = 3000 WHERE id = 3; +SELECT * FROM base_tbl; + id | idplus1 +------+--------- + 1 | 2 + 4 | 5 + 2000 | 2001 + 3000 | 3001 +(4 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- inheritance tests +CREATE TABLE base_tbl_parent (a int); +CREATE TABLE base_tbl_child (CHECK (a > 0)) INHERITS (base_tbl_parent); +INSERT INTO base_tbl_parent SELECT * FROM generate_series(-8, -1); +INSERT INTO base_tbl_child SELECT * FROM generate_series(1, 8); +ANALYZE base_tbl_parent; +ANALYZE base_tbl_child; +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl_parent; +CREATE VIEW rw_view2 AS SELECT * FROM ONLY base_tbl_parent; +SELECT * FROM rw_view1 ORDER BY a; + a +---- + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(16 rows) + +SELECT * FROM ONLY rw_view1 ORDER BY a; + a +---- + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +(16 rows) + +SELECT * FROM rw_view2 ORDER BY a; + a +---- + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 +(8 rows) + +INSERT INTO rw_view1 VALUES (-100), (100); +INSERT INTO rw_view2 VALUES (-200), (200); +UPDATE rw_view1 SET a = a*10 WHERE a IN (-1, 1); -- Should produce -10 and 10 +UPDATE ONLY rw_view1 SET a = a*10 WHERE a IN (-2, 2); -- Should produce -20 and 20 +UPDATE rw_view2 SET a = a*10 WHERE a IN (-3, 3); -- Should produce -30 only +UPDATE ONLY rw_view2 SET a = a*10 WHERE a IN (-4, 4); -- Should produce -40 only +DELETE FROM rw_view1 WHERE a IN (-5, 5); -- Should delete -5 and 5 +DELETE FROM ONLY rw_view1 WHERE a IN (-6, 6); -- Should delete -6 and 6 +DELETE FROM rw_view2 WHERE a IN (-7, 7); -- Should delete -7 only +DELETE FROM ONLY rw_view2 WHERE a IN (-8, 8); -- Should delete -8 only +SELECT * FROM ONLY base_tbl_parent ORDER BY a; + a +------ + -200 + -100 + -40 + -30 + -20 + -10 + 100 + 200 +(8 rows) + +SELECT * FROM base_tbl_child ORDER BY a; + a +---- + 3 + 4 + 7 + 8 + 10 + 20 +(6 rows) + +CREATE TABLE other_tbl_parent (id int); +CREATE TABLE other_tbl_child () INHERITS (other_tbl_parent); +INSERT INTO other_tbl_parent VALUES (7),(200); +INSERT INTO other_tbl_child VALUES (8),(100); +ANALYZE other_tbl_parent; +ANALYZE other_tbl_child; +EXPLAIN (costs off) +UPDATE rw_view1 SET a = a + 1000 FROM other_tbl_parent WHERE a = id; + QUERY PLAN +------------------------------------------------------------------------- + Update on base_tbl_parent + Update on base_tbl_parent base_tbl_parent_1 + Update on base_tbl_child base_tbl_parent_2 + -> Hash Join + Hash Cond: (base_tbl_parent.a = other_tbl_parent.id) + -> Append + -> Seq Scan on base_tbl_parent base_tbl_parent_1 + -> Seq Scan on base_tbl_child base_tbl_parent_2 + -> Hash + -> Append + -> Seq Scan on other_tbl_parent other_tbl_parent_1 + -> Seq Scan on other_tbl_child other_tbl_parent_2 + Optimizer: Postgres query optimizer +(13 rows) + +UPDATE rw_view1 SET a = a + 1000 FROM other_tbl_parent WHERE a = id; +SELECT * FROM ONLY base_tbl_parent ORDER BY a; + a +------ + -200 + -100 + -40 + -30 + -20 + -10 + 1100 + 1200 +(8 rows) + +SELECT * FROM base_tbl_child ORDER BY a; + a +------ + 3 + 4 + 10 + 20 + 1007 + 1008 +(6 rows) + +DROP TABLE base_tbl_parent, base_tbl_child CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +DROP TABLE other_tbl_parent CASCADE; +NOTICE: drop cascades to table other_tbl_child +-- simple WITH CHECK OPTION +CREATE TABLE base_tbl (a int, b int DEFAULT 10); +INSERT INTO base_tbl VALUES (1,2), (2,3), (1,-1); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a < b + WITH LOCAL CHECK OPTION; +\d+ rw_view1 + View "public.rw_view1" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + a | integer | | | | plain | + b | integer | | | | plain | +View definition: + SELECT base_tbl.a, + base_tbl.b + FROM base_tbl + WHERE base_tbl.a < base_tbl.b; +Options: check_option=local + +SELECT * FROM information_schema.views WHERE table_name = 'rw_view1'; + table_catalog | table_schema | table_name | view_definition | check_option | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +---------------+--------------+------------+------------------------------------+--------------+--------------+--------------------+----------------------+----------------------+---------------------------- + regression | public | rw_view1 | SELECT base_tbl.a, +| LOCAL | YES | YES | NO | NO | NO + | | | base_tbl.b +| | | | | | + | | | FROM base_tbl +| | | | | | + | | | WHERE (base_tbl.a < base_tbl.b); | | | | | | +(1 row) + +INSERT INTO rw_view1 VALUES(3,4); -- ok +INSERT INTO rw_view1 VALUES(4,3); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (4, 3). +INSERT INTO rw_view1 VALUES(5,null); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (5, null). +UPDATE rw_view1 SET b = 5 WHERE a = 3; -- ok +UPDATE rw_view1 SET b = -5 WHERE a = 3; -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (3, -5). +INSERT INTO rw_view1(a) VALUES (9); -- ok +INSERT INTO rw_view1(a) VALUES (10); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (10, 10). +SELECT * FROM base_tbl; + a | b +---+---- + 1 | 2 + 2 | 3 + 1 | -1 + 3 | 5 + 9 | 10 +(5 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- WITH LOCAL/CASCADED CHECK OPTION +CREATE TABLE base_tbl (a int); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a > 0; +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a < 10 + WITH CHECK OPTION; -- implicitly cascaded +\d+ rw_view2 + View "public.rw_view2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + a | integer | | | | plain | +View definition: + SELECT rw_view1.a + FROM rw_view1 + WHERE rw_view1.a < 10; +Options: check_option=cascaded + +SELECT * FROM information_schema.views WHERE table_name = 'rw_view2'; + table_catalog | table_schema | table_name | view_definition | check_option | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +---------------+--------------+------------+----------------------------+--------------+--------------+--------------------+----------------------+----------------------+---------------------------- + regression | public | rw_view2 | SELECT rw_view1.a +| CASCADED | YES | YES | NO | NO | NO + | | | FROM rw_view1 +| | | | | | + | | | WHERE (rw_view1.a < 10); | | | | | | +(1 row) + +INSERT INTO rw_view2 VALUES (-5); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (-5). +INSERT INTO rw_view2 VALUES (5); -- ok +INSERT INTO rw_view2 VALUES (15); -- should fail +ERROR: new row violates check option for view "rw_view2" +DETAIL: Failing row contains (15). +SELECT * FROM base_tbl; + a +--- + 5 +(1 row) + +UPDATE rw_view2 SET a = a - 10; -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (-5). +UPDATE rw_view2 SET a = a + 10; -- should fail +ERROR: new row violates check option for view "rw_view2" +DETAIL: Failing row contains (15). +CREATE OR REPLACE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a < 10 + WITH LOCAL CHECK OPTION; +\d+ rw_view2 + View "public.rw_view2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + a | integer | | | | plain | +View definition: + SELECT rw_view1.a + FROM rw_view1 + WHERE rw_view1.a < 10; +Options: check_option=local + +SELECT * FROM information_schema.views WHERE table_name = 'rw_view2'; + table_catalog | table_schema | table_name | view_definition | check_option | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +---------------+--------------+------------+----------------------------+--------------+--------------+--------------------+----------------------+----------------------+---------------------------- + regression | public | rw_view2 | SELECT rw_view1.a +| LOCAL | YES | YES | NO | NO | NO + | | | FROM rw_view1 +| | | | | | + | | | WHERE (rw_view1.a < 10); | | | | | | +(1 row) + +INSERT INTO rw_view2 VALUES (-10); -- ok, but not in view +INSERT INTO rw_view2 VALUES (20); -- should fail +ERROR: new row violates check option for view "rw_view2" +DETAIL: Failing row contains (20). +SELECT * FROM base_tbl; + a +----- + 5 + -10 +(2 rows) + +ALTER VIEW rw_view1 SET (check_option=here); -- invalid +ERROR: invalid value for enum option "check_option": here +DETAIL: Valid values are "local" and "cascaded". +ALTER VIEW rw_view1 SET (check_option=local); +INSERT INTO rw_view2 VALUES (-20); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (-20). +INSERT INTO rw_view2 VALUES (30); -- should fail +ERROR: new row violates check option for view "rw_view2" +DETAIL: Failing row contains (30). +ALTER VIEW rw_view2 RESET (check_option); +\d+ rw_view2 + View "public.rw_view2" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+---------+------------- + a | integer | | | | plain | +View definition: + SELECT rw_view1.a + FROM rw_view1 + WHERE rw_view1.a < 10; + +SELECT * FROM information_schema.views WHERE table_name = 'rw_view2'; + table_catalog | table_schema | table_name | view_definition | check_option | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +---------------+--------------+------------+----------------------------+--------------+--------------+--------------------+----------------------+----------------------+---------------------------- + regression | public | rw_view2 | SELECT rw_view1.a +| NONE | YES | YES | NO | NO | NO + | | | FROM rw_view1 +| | | | | | + | | | WHERE (rw_view1.a < 10); | | | | | | +(1 row) + +INSERT INTO rw_view2 VALUES (30); -- ok, but not in view +SELECT * FROM base_tbl; + a +----- + 5 + -10 + 30 +(3 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +-- WITH CHECK OPTION with no local view qual +CREATE TABLE base_tbl (a int); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WITH CHECK OPTION; +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a > 0; +CREATE VIEW rw_view3 AS SELECT * FROM rw_view2 WITH CHECK OPTION; +SELECT * FROM information_schema.views WHERE table_name LIKE E'rw\\_view_' ORDER BY table_name; + table_catalog | table_schema | table_name | view_definition | check_option | is_updatable | is_insertable_into | is_trigger_updatable | is_trigger_deletable | is_trigger_insertable_into +---------------+--------------+------------+---------------------------+--------------+--------------+--------------------+----------------------+----------------------+---------------------------- + regression | public | rw_view1 | SELECT base_tbl.a +| CASCADED | YES | YES | NO | NO | NO + | | | FROM base_tbl; | | | | | | + regression | public | rw_view2 | SELECT rw_view1.a +| NONE | YES | YES | NO | NO | NO + | | | FROM rw_view1 +| | | | | | + | | | WHERE (rw_view1.a > 0); | | | | | | + regression | public | rw_view3 | SELECT rw_view2.a +| CASCADED | YES | YES | NO | NO | NO + | | | FROM rw_view2; | | | | | | +(3 rows) + +INSERT INTO rw_view1 VALUES (-1); -- ok +INSERT INTO rw_view1 VALUES (1); -- ok +INSERT INTO rw_view2 VALUES (-2); -- ok, but not in view +INSERT INTO rw_view2 VALUES (2); -- ok +INSERT INTO rw_view3 VALUES (-3); -- should fail +ERROR: new row violates check option for view "rw_view2" +DETAIL: Failing row contains (-3). +INSERT INTO rw_view3 VALUES (3); -- ok +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +drop cascades to view rw_view3 +-- WITH CHECK OPTION with scalar array ops +CREATE TABLE base_tbl (a int, b int[]); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a = ANY (b) + WITH CHECK OPTION; +INSERT INTO rw_view1 VALUES (1, ARRAY[1,2,3]); -- ok +INSERT INTO rw_view1 VALUES (10, ARRAY[4,5]); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (10, {4,5}). +UPDATE rw_view1 SET b[2] = -b[2] WHERE a = 1; -- ok +UPDATE rw_view1 SET b[1] = -b[1] WHERE a = 1; -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (1, {-1,-2,3}). +PREPARE ins(int, int[]) AS INSERT INTO rw_view1 VALUES($1, $2); +EXECUTE ins(2, ARRAY[1,2,3]); -- ok +EXECUTE ins(10, ARRAY[4,5]); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (10, {4,5}). +DEALLOCATE PREPARE ins; +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- WITH CHECK OPTION with subquery +CREATE TABLE base_tbl (a int); +CREATE TABLE ref_tbl (a int PRIMARY KEY); +INSERT INTO ref_tbl SELECT * FROM generate_series(1,10); +ANALYZE ref_tbl; +CREATE VIEW rw_view1 AS + SELECT * FROM base_tbl b + WHERE EXISTS(SELECT 1 FROM ref_tbl r WHERE r.a = b.a) + WITH CHECK OPTION; +INSERT INTO rw_view1 VALUES (5); -- ok +INSERT INTO rw_view1 VALUES (15); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (15). +UPDATE rw_view1 SET a = a + 5; -- ok +UPDATE rw_view1 SET a = a + 5; -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (15). +EXPLAIN (costs off) INSERT INTO rw_view1 VALUES (5); + QUERY PLAN +------------------------------------- + Insert on base_tbl b + -> Result + SubPlan 1 + -> Seq Scan on ref_tbl r + Filter: (a = b.a) + Optimizer: Postgres query optimizer +(6 rows) + +ANALYZE base_tbl; +EXPLAIN (costs off) UPDATE rw_view1 SET a = a + 5; + QUERY PLAN +------------------------------------------ + Update on base_tbl b + -> Hash Join + Hash Cond: (r.a = b.a) + -> Seq Scan on ref_tbl r + -> Hash + -> Seq Scan on base_tbl b + SubPlan 1 + -> Seq Scan on ref_tbl r_1 + Filter: (a = b.a) + Optimizer: Postgres query optimizer +(10 rows) + +DROP TABLE base_tbl, ref_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- WITH CHECK OPTION with BEFORE trigger on base table +CREATE TABLE base_tbl (a int, b int); +CREATE FUNCTION base_tbl_trig_fn() +RETURNS trigger AS +$$ +BEGIN + NEW.b := 10; + RETURN NEW; +END; +$$ +LANGUAGE plpgsql; +CREATE TRIGGER base_tbl_trig BEFORE INSERT OR UPDATE ON base_tbl + FOR EACH ROW EXECUTE PROCEDURE base_tbl_trig_fn(); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a < b WITH CHECK OPTION; +INSERT INTO rw_view1 VALUES (5,0); -- ok +INSERT INTO rw_view1 VALUES (15, 20); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (15, 10). +UPDATE rw_view1 SET a = 20, b = 30; -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (20, 10). +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +DROP FUNCTION base_tbl_trig_fn(); +-- WITH LOCAL CHECK OPTION with INSTEAD OF trigger on base view +CREATE TABLE base_tbl (a int, b int); +CREATE VIEW rw_view1 AS SELECT a FROM base_tbl WHERE a < b; +CREATE FUNCTION rw_view1_trig_fn() +RETURNS trigger AS +$$ +BEGIN + IF TG_OP = 'INSERT' THEN + INSERT INTO base_tbl VALUES (NEW.a, 10); + RETURN NEW; + ELSIF TG_OP = 'UPDATE' THEN + UPDATE base_tbl SET a=NEW.a WHERE a=OLD.a; + RETURN NEW; + ELSIF TG_OP = 'DELETE' THEN + DELETE FROM base_tbl WHERE a=OLD.a; + RETURN OLD; + END IF; +END; +$$ +LANGUAGE plpgsql; +CREATE TRIGGER rw_view1_trig + INSTEAD OF INSERT OR UPDATE OR DELETE ON rw_view1 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +CREATE VIEW rw_view2 AS + SELECT * FROM rw_view1 WHERE a > 0 WITH LOCAL CHECK OPTION; +INSERT INTO rw_view2 VALUES (-5); -- should fail +ERROR: new row violates check option for view "rw_view2" +DETAIL: Failing row contains (-5, null). +INSERT INTO rw_view2 VALUES (5); -- ok +INSERT INTO rw_view2 VALUES (50); -- ok, but not in view +UPDATE rw_view2 SET a = a - 10; -- should fail +-- Cloudberry doesn't fail because nothing was inserted into view, which is +-- because Cloudberry doesn't support INSTEAD OF triggers. +SELECT * FROM base_tbl; + a | b +----+--- + 5 | + 50 | +(2 rows) + +-- Check option won't cascade down to base view with INSTEAD OF triggers +ALTER VIEW rw_view2 SET (check_option=cascaded); +INSERT INTO rw_view2 VALUES (100); -- ok, but not in view (doesn't fail rw_view1's check) +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (100, null). +UPDATE rw_view2 SET a = 200 WHERE a = 5; -- ok, but not in view (doesn't fail rw_view1's check) +SELECT * FROM base_tbl; + a | b +----+--- + 5 | + 50 | +(2 rows) + +-- Neither local nor cascaded check options work with INSTEAD rules +DROP TRIGGER rw_view1_trig ON rw_view1; +ERROR: trigger "rw_view1_trig" for table "rw_view1" does not exist +-- GPDB: The previous tests don't work the same as in upstream. Reset the +-- contents of the table to be the same as in upstream after this test, so +-- that the tests that follow return the same results. +delete from base_tbl; +insert into base_tbl values (50, 10), (100, 10), (200, 10); +CREATE RULE rw_view1_ins_rule AS ON INSERT TO rw_view1 + DO INSTEAD INSERT INTO base_tbl VALUES (NEW.a, 10); +CREATE RULE rw_view1_upd_rule AS ON UPDATE TO rw_view1 + DO INSTEAD UPDATE base_tbl SET a=NEW.a WHERE a=OLD.a; +INSERT INTO rw_view2 VALUES (-10); -- ok, but not in view (doesn't fail rw_view2's check) +INSERT INTO rw_view2 VALUES (5); -- ok +INSERT INTO rw_view2 VALUES (20); -- ok, but not in view (doesn't fail rw_view1's check) +UPDATE rw_view2 SET a = 30 WHERE a = 5; -- ok, but not in view (doesn't fail rw_view1's check) +INSERT INTO rw_view2 VALUES (5); -- ok +UPDATE rw_view2 SET a = -5 WHERE a = 5; -- ok, but not in view (doesn't fail rw_view2's check) +SELECT * FROM base_tbl; + a | b +-----+---- + 50 | 10 + 100 | 10 + 200 | 10 + -10 | 10 + 20 | 10 + 30 | 10 + -5 | 10 +(7 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +DROP FUNCTION rw_view1_trig_fn(); +CREATE TABLE base_tbl (a int); +CREATE VIEW rw_view1 AS SELECT a,10 AS b FROM base_tbl; +CREATE RULE rw_view1_ins_rule AS ON INSERT TO rw_view1 + DO INSTEAD INSERT INTO base_tbl VALUES (NEW.a); +CREATE VIEW rw_view2 AS + SELECT * FROM rw_view1 WHERE a > b WITH LOCAL CHECK OPTION; +INSERT INTO rw_view2 VALUES (2,3); -- ok, but not in view (doesn't fail rw_view2's check) +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +-- security barrier view +CREATE TABLE base_tbl (person text, visibility text); +-- GPDB: The tests below which throw NOTICEs, throw them in indeterminate +-- order, if the rows are hashed to different segments. Force all the rows +-- to the same segment, by adding a dummy column and using it as the +-- distribution key. +alter table base_tbl add column distkey int; +INSERT INTO base_tbl VALUES ('Tom', 'public'), + ('Dick', 'private'), + ('Harry', 'public'); +CREATE VIEW rw_view1 AS + SELECT person FROM base_tbl WHERE visibility = 'public'; +CREATE FUNCTION snoop(anyelement) +RETURNS boolean AS +$$ +BEGIN + RAISE NOTICE 'snooped value: %', $1; + RETURN true; +END; +$$ +LANGUAGE plpgsql COST 0.000001; +CREATE OR REPLACE FUNCTION leakproof(anyelement) +RETURNS boolean AS +$$ +BEGIN + RETURN true; +END; +$$ +LANGUAGE plpgsql STRICT IMMUTABLE LEAKPROOF; +SELECT * FROM rw_view1 WHERE snoop(person); +NOTICE: snooped value: Tom +NOTICE: snooped value: Dick +NOTICE: snooped value: Harry + person +-------- + Tom + Harry +(2 rows) + +UPDATE rw_view1 SET person=person WHERE snoop(person); +NOTICE: snooped value: Tom +NOTICE: snooped value: Dick +NOTICE: snooped value: Harry +DELETE FROM rw_view1 WHERE NOT snoop(person); +NOTICE: snooped value: Dick +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry +ALTER VIEW rw_view1 SET (security_barrier = true); +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name = 'rw_view1'; + table_name | is_insertable_into +------------+-------------------- + rw_view1 | YES +(1 row) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name = 'rw_view1'; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view1 | YES | YES +(1 row) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name = 'rw_view1' + ORDER BY ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view1 | person | YES +(1 row) + +SELECT * FROM rw_view1 WHERE snoop(person); +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry + person +-------- + Tom + Harry +(2 rows) + +UPDATE rw_view1 SET person=person WHERE snoop(person); +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry +DELETE FROM rw_view1 WHERE NOT snoop(person); +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry +EXPLAIN (costs off) SELECT * FROM rw_view1 WHERE snoop(person); + QUERY PLAN +----------------------------------------------- + Subquery Scan on rw_view1 + Filter: snoop(rw_view1.person) + -> Seq Scan on base_tbl + Filter: (visibility = 'public'::text) + Optimizer: Postgres query optimizer +(5 rows) + +EXPLAIN (costs off) UPDATE rw_view1 SET person=person WHERE snoop(person); + QUERY PLAN +------------------------------------------------------------------- + Update on base_tbl + -> Seq Scan on base_tbl + Filter: ((visibility = 'public'::text) AND snoop(person)) + Optimizer: Postgres query optimizer +(4 rows) + +EXPLAIN (costs off) DELETE FROM rw_view1 WHERE NOT snoop(person); + QUERY PLAN +------------------------------------------------------------------------- + Delete on base_tbl + -> Seq Scan on base_tbl + Filter: ((visibility = 'public'::text) AND (NOT snoop(person))) + Optimizer: Postgres query optimizer +(4 rows) + +-- security barrier view on top of security barrier view +CREATE VIEW rw_view2 WITH (security_barrier = true) AS + SELECT * FROM rw_view1 WHERE snoop(person); +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name = 'rw_view2'; + table_name | is_insertable_into +------------+-------------------- + rw_view2 | YES +(1 row) + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name = 'rw_view2'; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + rw_view2 | YES | YES +(1 row) + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name = 'rw_view2' + ORDER BY ordinal_position; + table_name | column_name | is_updatable +------------+-------------+-------------- + rw_view2 | person | YES +(1 row) + +SELECT * FROM rw_view2 WHERE snoop(person); +NOTICE: snooped value: Tom +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry +NOTICE: snooped value: Harry + person +-------- + Tom + Harry +(2 rows) + +UPDATE rw_view2 SET person=person WHERE snoop(person); +NOTICE: snooped value: Tom +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry +NOTICE: snooped value: Harry +DELETE FROM rw_view2 WHERE NOT snoop(person); +NOTICE: snooped value: Tom +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry +NOTICE: snooped value: Harry +EXPLAIN (costs off) SELECT * FROM rw_view2 WHERE snoop(person); + QUERY PLAN +----------------------------------------------------- + Subquery Scan on rw_view2 + Filter: snoop(rw_view2.person) + -> Subquery Scan on rw_view1 + Filter: snoop(rw_view1.person) + -> Seq Scan on base_tbl + Filter: (visibility = 'public'::text) + Optimizer: Postgres query optimizer +(7 rows) + +EXPLAIN (costs off) UPDATE rw_view2 SET person=person WHERE snoop(person); + QUERY PLAN +------------------------------------------------------------------------------------- + Update on base_tbl + -> Seq Scan on base_tbl + Filter: ((visibility = 'public'::text) AND snoop(person) AND snoop(person)) + Optimizer: Postgres query optimizer +(4 rows) + +EXPLAIN (costs off) DELETE FROM rw_view2 WHERE NOT snoop(person); + QUERY PLAN +------------------------------------------------------------------------------------------- + Delete on base_tbl + -> Seq Scan on base_tbl + Filter: ((visibility = 'public'::text) AND snoop(person) AND (NOT snoop(person))) + Optimizer: Postgres query optimizer +(4 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 +-- security barrier view on top of table with rules +CREATE TABLE base_tbl(id int PRIMARY KEY, data text, deleted boolean); +INSERT INTO base_tbl VALUES (1, 'Row 1', false), (2, 'Row 2', true); +ANALYZE base_tbl; +CREATE RULE base_tbl_ins_rule AS ON INSERT TO base_tbl + WHERE EXISTS (SELECT 1 FROM base_tbl t WHERE t.id = new.id) + DO INSTEAD + UPDATE base_tbl SET data = new.data, deleted = false WHERE id = new.id; +CREATE RULE base_tbl_del_rule AS ON DELETE TO base_tbl + DO INSTEAD + UPDATE base_tbl SET deleted = true WHERE id = old.id; +CREATE VIEW rw_view1 WITH (security_barrier=true) AS + SELECT id, data FROM base_tbl WHERE NOT deleted; +SELECT * FROM rw_view1; + id | data +----+------- + 1 | Row 1 +(1 row) + +set enable_seqscan=off; -- To get the same plan in GPDB as in upstream +EXPLAIN (costs off) DELETE FROM rw_view1 WHERE id = 1 AND snoop(data); + QUERY PLAN +------------------------------------------------------------------- + Update on base_tbl base_tbl_1 + -> Nested Loop + -> Index Scan using base_tbl_pkey on base_tbl base_tbl_1 + Index Cond: (id = 1) + -> Index Scan using base_tbl_pkey on base_tbl + Index Cond: (id = 1) + Filter: ((NOT deleted) AND snoop(data)) + Optimizer: Postgres query optimizer +(8 rows) + +DELETE FROM rw_view1 WHERE id = 1 AND snoop(data); +NOTICE: snooped value: Row 1 +reset enable_seqscan; +EXPLAIN (costs off) INSERT INTO rw_view1 VALUES (2, 'New row 2'); + QUERY PLAN +------------------------------------------- + Insert on base_tbl + InitPlan 1 (returns $0) + -> Seq Scan on base_tbl t + Filter: (id = 2) + -> Result + One-Time Filter: ($0 IS NOT TRUE) + Optimizer: Postgres query optimizer + + Update on base_tbl + InitPlan 1 (returns $0) + -> Seq Scan on base_tbl t + Filter: (id = 2) + -> Result + One-Time Filter: $0 + -> Seq Scan on base_tbl + Filter: (id = 2) + Optimizer: Postgres query optimizer +(17 rows) + +INSERT INTO rw_view1 VALUES (2, 'New row 2'); +SELECT * FROM base_tbl; + id | data | deleted +----+-----------+--------- + 1 | Row 1 | t + 2 | New row 2 | f +(2 rows) + +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- security barrier view based on inheritance set +CREATE TABLE t1 (a int, b float, c text); +CREATE INDEX t1_a_idx ON t1(a); +INSERT INTO t1 +SELECT i,i,'t1' FROM generate_series(1,10) g(i); +ANALYZE t1; +CREATE TABLE t11 (d text) INHERITS (t1); +CREATE INDEX t11_a_idx ON t11(a); +INSERT INTO t11 +SELECT i,i,'t11','t11d' FROM generate_series(1,10) g(i); +ANALYZE t11; +CREATE TABLE t12 (e int[]) INHERITS (t1); +CREATE INDEX t12_a_idx ON t12(a); +INSERT INTO t12 +SELECT i,i,'t12','{1,2}'::int[] FROM generate_series(1,10) g(i); +ANALYZE t12; +CREATE TABLE t111 () INHERITS (t11, t12); +NOTICE: merging multiple inherited definitions of column "a" +NOTICE: merging multiple inherited definitions of column "b" +NOTICE: merging multiple inherited definitions of column "c" +CREATE INDEX t111_a_idx ON t111(a); +INSERT INTO t111 +SELECT i,i,'t111','t111d','{1,1,1}'::int[] FROM generate_series(1,10) g(i); +ANALYZE t111; +CREATE VIEW v1 WITH (security_barrier=true) AS +SELECT *, (SELECT d FROM t11 WHERE t11.a = t1.a LIMIT 1) AS d +FROM t1 +WHERE a > 5 AND EXISTS(SELECT 1 FROM t12 WHERE t12.a = t1.a); +SELECT * FROM v1 WHERE a=3; -- should not see anything + a | b | c | d +---+---+---+--- +(0 rows) + +SELECT * FROM v1 WHERE a=8; + a | b | c | d +---+---+------+------ + 8 | 8 | t1 | t11d + 8 | 8 | t11 | t11d + 8 | 8 | t12 | t11d + 8 | 8 | t111 | t11d +(4 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE v1 SET a=100 WHERE snoop(a) AND leakproof(a) AND a < 7 AND a != 6; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------- + Update on public.t1 + Update on public.t1 t1_1 + Update on public.t11 t1_2 + Update on public.t12 t1_3 + Update on public.t111 t1_4 + -> Result + Output: 100, t1.tableoid, t1.ctid, t1.gp_segment_id + -> Append + -> Index Scan using t1_a_idx on public.t1 t1_1 + Output: t1_1.tableoid, t1_1.ctid, t1_1.gp_segment_id + Index Cond: ((t1_1.a > 5) AND (t1_1.a < 7)) + Filter: ((t1_1.a <> 6) AND (SubPlan 1 (copy 3)) AND snoop(t1_1.a) AND leakproof(t1_1.a)) + SubPlan 1 (copy 3) + -> Append + -> Seq Scan on public.t12 t12_1 + Filter: (t12_1.a = t1_1.a) + -> Seq Scan on public.t111 t12_2 + Filter: (t12_2.a = t1_1.a) + -> Index Scan using t11_a_idx on public.t11 t1_2 + Output: t1_2.tableoid, t1_2.ctid, t1_2.gp_segment_id + Index Cond: ((t1_2.a > 5) AND (t1_2.a < 7)) + Filter: ((t1_2.a <> 6) AND (SubPlan 1 (copy 5)) AND snoop(t1_2.a) AND leakproof(t1_2.a)) + SubPlan 1 (copy 5) + -> Append + -> Seq Scan on public.t12 t12_4 + Filter: (t12_4.a = t1_2.a) + -> Seq Scan on public.t111 t12_5 + Filter: (t12_5.a = t1_2.a) + -> Index Scan using t12_a_idx on public.t12 t1_3 + Output: t1_3.tableoid, t1_3.ctid, t1_3.gp_segment_id + Index Cond: ((t1_3.a > 5) AND (t1_3.a < 7)) + Filter: ((t1_3.a <> 6) AND (SubPlan 1 (copy 7)) AND snoop(t1_3.a) AND leakproof(t1_3.a)) + SubPlan 1 (copy 7) + -> Append + -> Seq Scan on public.t12 t12_7 + Filter: (t12_7.a = t1_3.a) + -> Seq Scan on public.t111 t12_8 + Filter: (t12_8.a = t1_3.a) + -> Index Scan using t111_a_idx on public.t111 t1_4 + Output: t1_4.tableoid, t1_4.ctid, t1_4.gp_segment_id + Index Cond: ((t1_4.a > 5) AND (t1_4.a < 7)) + Filter: ((t1_4.a <> 6) AND (SubPlan 1 (copy 9)) AND snoop(t1_4.a) AND leakproof(t1_4.a)) + SubPlan 1 (copy 9) + -> Append + -> Seq Scan on public.t12 t12_10 + Filter: (t12_10.a = t1_4.a) + -> Seq Scan on public.t111 t12_11 + Filter: (t12_11.a = t1_4.a) + Settings: enable_mergejoin = 'on', enable_nestloop = 'on' + Optimizer: Postgres query optimizer +(50 rows) + +UPDATE v1 SET a=100 WHERE snoop(a) AND leakproof(a) AND a < 7 AND a != 6; +SELECT * FROM v1 WHERE a=100; -- Nothing should have been changed to 100 + a | b | c | d +---+---+---+--- +(0 rows) + +SELECT * FROM t1 WHERE a=100; -- Nothing should have been changed to 100 + a | b | c +---+---+--- +(0 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE v1 SET a=a+1 WHERE snoop(a) AND leakproof(a) AND a = 8; + QUERY PLAN +-------------------------------------------------------------------------------------------- + Update on public.t1 + Update on public.t1 t1_1 + Update on public.t11 t1_2 + Update on public.t12 t1_3 + Update on public.t111 t1_4 + -> Result + Output: (t1.a + 1), t1.tableoid, t1.ctid, t1.gp_segment_id + -> Append + -> Index Scan using t1_a_idx on public.t1 t1_1 + Output: t1_1.a, t1_1.tableoid, t1_1.ctid, t1_1.gp_segment_id + Index Cond: ((t1_1.a > 5) AND (t1_1.a = 8)) + Filter: ((SubPlan 1 (copy 3)) AND snoop(t1_1.a) AND leakproof(t1_1.a)) + SubPlan 1 (copy 3) + -> Append + -> Seq Scan on public.t12 t12_1 + Filter: (t12_1.a = t1_1.a) + -> Seq Scan on public.t111 t12_2 + Filter: (t12_2.a = t1_1.a) + -> Index Scan using t11_a_idx on public.t11 t1_2 + Output: t1_2.a, t1_2.tableoid, t1_2.ctid, t1_2.gp_segment_id + Index Cond: ((t1_2.a > 5) AND (t1_2.a = 8)) + Filter: ((SubPlan 1 (copy 5)) AND snoop(t1_2.a) AND leakproof(t1_2.a)) + SubPlan 1 (copy 5) + -> Append + -> Seq Scan on public.t12 t12_4 + Filter: (t12_4.a = t1_2.a) + -> Seq Scan on public.t111 t12_5 + Filter: (t12_5.a = t1_2.a) + -> Index Scan using t12_a_idx on public.t12 t1_3 + Output: t1_3.a, t1_3.tableoid, t1_3.ctid, t1_3.gp_segment_id + Index Cond: ((t1_3.a > 5) AND (t1_3.a = 8)) + Filter: ((SubPlan 1 (copy 7)) AND snoop(t1_3.a) AND leakproof(t1_3.a)) + SubPlan 1 (copy 7) + -> Append + -> Seq Scan on public.t12 t12_7 + Filter: (t12_7.a = t1_3.a) + -> Seq Scan on public.t111 t12_8 + Filter: (t12_8.a = t1_3.a) + -> Index Scan using t111_a_idx on public.t111 t1_4 + Output: t1_4.a, t1_4.tableoid, t1_4.ctid, t1_4.gp_segment_id + Index Cond: ((t1_4.a > 5) AND (t1_4.a = 8)) + Filter: ((SubPlan 1 (copy 9)) AND snoop(t1_4.a) AND leakproof(t1_4.a)) + SubPlan 1 (copy 9) + -> Append + -> Seq Scan on public.t12 t12_10 + Filter: (t12_10.a = t1_4.a) + -> Seq Scan on public.t111 t12_11 + Filter: (t12_11.a = t1_4.a) + Settings: enable_mergejoin = 'on', enable_nestloop = 'on' + Optimizer: Postgres query optimizer +(50 rows) + +UPDATE v1 SET a=a+1 WHERE snoop(a) AND leakproof(a) AND a = 8; +NOTICE: snooped value: 8 +NOTICE: snooped value: 8 +NOTICE: snooped value: 8 +NOTICE: snooped value: 8 +SELECT * FROM v1 WHERE b=8; + a | b | c | d +---+---+------+------ + 9 | 8 | t1 | t11d + 9 | 8 | t11 | t11d + 9 | 8 | t12 | t11d + 9 | 8 | t111 | t11d +(4 rows) + +-- Like snoop() function, but doesn't print the actual value, as long +-- as it's >= 5. This is used in GPDB in lieu of the snoop() function, +-- because the order the NOTICEs for different rows arrive from the +-- segments is not deterministic in GPDB. By omitting the value, we +-- make the output the same regardless of the row order, as long as +-- all the values are > 5, as they should if the security barrier view +-- works correctly. +CREATE FUNCTION snoop_five(int4) +RETURNS boolean AS +$$ +BEGIN + IF $1 <= 5 THEN + RAISE NOTICE 'snooped value: %', $1; + ELSE + RAISE NOTICE 'snooped a value that''s above 5'; + END IF; + RETURN true; +END; +$$ +LANGUAGE plpgsql COST 0.000001; +DELETE FROM v1 WHERE snoop_five(a) AND leakproof(a); -- should not delete everything, just where a>5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +NOTICE: snooped a value that's above 5 +TABLE t1; -- verify all a<=5 are intact + a | b | c +---+---+------ + 1 | 1 | t1 + 2 | 2 | t1 + 3 | 3 | t1 + 4 | 4 | t1 + 5 | 5 | t1 + 1 | 1 | t11 + 2 | 2 | t11 + 3 | 3 | t11 + 4 | 4 | t11 + 5 | 5 | t11 + 1 | 1 | t12 + 2 | 2 | t12 + 3 | 3 | t12 + 4 | 4 | t12 + 5 | 5 | t12 + 1 | 1 | t111 + 2 | 2 | t111 + 3 | 3 | t111 + 4 | 4 | t111 + 5 | 5 | t111 +(20 rows) + +DROP TABLE t1, t11, t12, t111 CASCADE; +NOTICE: drop cascades to view v1 +DROP FUNCTION snoop(anyelement); +DROP FUNCTION leakproof(anyelement); +CREATE TABLE tx1 (a integer); +CREATE TABLE tx2 (b integer); +CREATE TABLE tx3 (c integer); +CREATE VIEW vx1 AS SELECT a FROM tx1 WHERE EXISTS(SELECT 1 FROM tx2 JOIN tx3 ON b=c); +INSERT INTO vx1 values (1); +SELECT * FROM tx1; + a +--- + 1 +(1 row) + +SELECT * FROM vx1; + a +--- +(0 rows) + +DROP VIEW vx1; +DROP TABLE tx1; +DROP TABLE tx2; +DROP TABLE tx3; +CREATE TABLE tx1 (a integer); +CREATE TABLE tx2 (b integer); +CREATE TABLE tx3 (c integer); +CREATE VIEW vx1 AS SELECT a FROM tx1 WHERE EXISTS(SELECT 1 FROM tx2 JOIN tx3 ON b=c); +INSERT INTO vx1 VALUES (1); +INSERT INTO vx1 VALUES (1); +SELECT * FROM tx1; + a +--- + 1 + 1 +(2 rows) + +SELECT * FROM vx1; + a +--- +(0 rows) + +DROP VIEW vx1; +DROP TABLE tx1; +DROP TABLE tx2; +DROP TABLE tx3; +CREATE TABLE tx1 (a integer, b integer); +CREATE TABLE tx2 (b integer, c integer); +CREATE TABLE tx3 (c integer, d integer); +ALTER TABLE tx1 DROP COLUMN b; +ALTER TABLE tx2 DROP COLUMN c; +ALTER TABLE tx3 DROP COLUMN d; +CREATE VIEW vx1 AS SELECT a FROM tx1 WHERE EXISTS(SELECT 1 FROM tx2 JOIN tx3 ON b=c); +INSERT INTO vx1 VALUES (1); +INSERT INTO vx1 VALUES (1); +SELECT * FROM tx1; + a +--- + 1 + 1 +(2 rows) + +SELECT * FROM vx1; + a +--- +(0 rows) + +DROP VIEW vx1; +DROP TABLE tx1; +DROP TABLE tx2; +DROP TABLE tx3; +-- +-- Test handling of vars from correlated subqueries in quals from outer +-- security barrier views, per bug #13988 +-- +CREATE TABLE t1 (a int, b text, c int); +INSERT INTO t1 VALUES (1, 'one', 10); +CREATE TABLE t2 (cc int); +INSERT INTO t2 VALUES (10), (20); +CREATE VIEW v1 WITH (security_barrier = true) AS + SELECT * FROM t1 WHERE (a > 0) + WITH CHECK OPTION; +CREATE VIEW v2 WITH (security_barrier = true) AS + SELECT * FROM v1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.cc = v1.c) + WITH CHECK OPTION; +INSERT INTO v2 VALUES (2, 'two', 20); -- ok +INSERT INTO v2 VALUES (-2, 'minus two', 20); -- not allowed +ERROR: new row violates check option for view "v1" +DETAIL: Failing row contains (-2, minus two, 20). +INSERT INTO v2 VALUES (3, 'three', 30); -- not allowed +ERROR: new row violates check option for view "v2" +DETAIL: Failing row contains (3, three, 30). +UPDATE v2 SET b = 'ONE' WHERE a = 1; -- ok +UPDATE v2 SET a = -1 WHERE a = 1; -- not allowed +ERROR: new row violates check option for view "v1" +DETAIL: Failing row contains (-1, ONE, 10). +UPDATE v2 SET c = 30 WHERE a = 1; -- not allowed +ERROR: new row violates check option for view "v2" +DETAIL: Failing row contains (1, ONE, 30). +DELETE FROM v2 WHERE a = 2; -- ok +SELECT * FROM v2; + a | b | c +---+-----+---- + 1 | ONE | 10 +(1 row) + +DROP VIEW v2; +DROP VIEW v1; +DROP TABLE t2; +DROP TABLE t1; +-- +-- Test CREATE OR REPLACE VIEW turning a non-updatable view into an +-- auto-updatable view and adding check options in a single step +-- +CREATE TABLE t1 (a int, b text); +CREATE VIEW v1 AS SELECT null::int AS a; +CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 WHERE a > 0 WITH CHECK OPTION; +INSERT INTO v1 VALUES (1, 'ok'); -- ok +INSERT INTO v1 VALUES (-1, 'invalid'); -- should fail +ERROR: new row violates check option for view "v1" +DETAIL: Failing row contains (-1, invalid). +DROP VIEW v1; +DROP TABLE t1; +-- check that an auto-updatable view on a partitioned table works correctly +create table uv_pt (a int, b int, v varchar) partition by range (a, b); +create table uv_pt1 (b int not null, v varchar, a int not null) partition by range (b); +create table uv_pt11 (like uv_pt1); +alter table uv_pt11 drop a; +alter table uv_pt11 add a int; +alter table uv_pt11 drop a; +alter table uv_pt11 add a int not null; +alter table uv_pt1 attach partition uv_pt11 for values from (2) to (5); +alter table uv_pt attach partition uv_pt1 for values from (1, 2) to (1, 10); +create view uv_ptv as select * from uv_pt; +select events & 4 != 0 AS upd, + events & 8 != 0 AS ins, + events & 16 != 0 AS del + from pg_catalog.pg_relation_is_updatable('uv_pt'::regclass, false) t(events); + upd | ins | del +-----+-----+----- + t | t | t +(1 row) + +select pg_catalog.pg_column_is_updatable('uv_pt'::regclass, 1::smallint, false); + pg_column_is_updatable +------------------------ + t +(1 row) + +select pg_catalog.pg_column_is_updatable('uv_pt'::regclass, 2::smallint, false); + pg_column_is_updatable +------------------------ + t +(1 row) + +select table_name, is_updatable, is_insertable_into + from information_schema.views where table_name = 'uv_ptv'; + table_name | is_updatable | is_insertable_into +------------+--------------+-------------------- + uv_ptv | YES | YES +(1 row) + +select table_name, column_name, is_updatable + from information_schema.columns where table_name = 'uv_ptv' order by column_name; + table_name | column_name | is_updatable +------------+-------------+-------------- + uv_ptv | a | YES + uv_ptv | b | YES + uv_ptv | v | YES +(3 rows) + +insert into uv_ptv values (1, 2); +select tableoid::regclass, * from uv_pt; + tableoid | a | b | v +----------+---+---+--- + uv_pt11 | 1 | 2 | +(1 row) + +create view uv_ptv_wco as select * from uv_pt where a = 0 with check option; +insert into uv_ptv_wco values (1, 2); +ERROR: new row violates check option for view "uv_ptv_wco" +DETAIL: Failing row contains (1, 2, null). +drop view uv_ptv, uv_ptv_wco; +drop table uv_pt, uv_pt1, uv_pt11; +-- check that wholerow vars appearing in WITH CHECK OPTION constraint expressions +-- work fine with partitioned tables +create table wcowrtest (a int) partition by list (a); +create table wcowrtest1 partition of wcowrtest for values in (1); +create view wcowrtest_v as select * from wcowrtest where wcowrtest = '(2)'::wcowrtest with check option; +insert into wcowrtest_v values (1); +ERROR: new row violates check option for view "wcowrtest_v" +DETAIL: Failing row contains (1). +alter table wcowrtest add b text; +create table wcowrtest2 (b text, c int, a int); +alter table wcowrtest2 drop c; +alter table wcowrtest attach partition wcowrtest2 for values in (2); +create table sometable (a int, b text); +insert into sometable values (1, 'a'), (2, 'b'); +create view wcowrtest_v2 as + select * + from wcowrtest r + where r in (select s from sometable s where r.a = s.a) +with check option; +-- WITH CHECK qual will be processed with wcowrtest2's +-- rowtype after tuple-routing +insert into wcowrtest_v2 values (2, 'no such row in sometable'); +ERROR: new row violates check option for view "wcowrtest_v2" +DETAIL: Failing row contains (2, no such row in sometable). +drop view wcowrtest_v, wcowrtest_v2; +drop table wcowrtest, sometable; +-- Check INSERT .. ON CONFLICT DO UPDATE works correctly when the view's +-- columns are named and ordered differently than the underlying table's. +create table uv_iocu_tab (a text unique, b float); +insert into uv_iocu_tab values ('xyxyxy', 0); +create view uv_iocu_view as + select b, b+1 as c, a, '2.0'::text as two from uv_iocu_tab; +insert into uv_iocu_view (a, b) values ('xyxyxy', 1) + on conflict (a) do update set b = uv_iocu_view.b; +select * from uv_iocu_tab; + a | b +--------+--- + xyxyxy | 0 +(1 row) + +insert into uv_iocu_view (a, b) values ('xyxyxy', 1) + on conflict (a) do update set b = excluded.b; +select * from uv_iocu_tab; + a | b +--------+--- + xyxyxy | 1 +(1 row) + +-- OK to access view columns that are not present in underlying base +-- relation in the ON CONFLICT portion of the query +insert into uv_iocu_view (a, b) values ('xyxyxy', 3) + on conflict (a) do update set b = cast(excluded.two as float); +select * from uv_iocu_tab; + a | b +--------+--- + xyxyxy | 2 +(1 row) + +explain (costs off) +insert into uv_iocu_view (a, b) values ('xyxyxy', 3) + on conflict (a) do update set b = excluded.b where excluded.c > 0; + QUERY PLAN +----------------------------------------------------------------------------------- + Insert on uv_iocu_tab + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: uv_iocu_tab_a_key + Conflict Filter: ((excluded.b + '1'::double precision) > '0'::double precision) + -> Result + Optimizer: Postgres query optimizer +(6 rows) + +insert into uv_iocu_view (a, b) values ('xyxyxy', 3) + on conflict (a) do update set b = excluded.b where excluded.c > 0; +select * from uv_iocu_tab; + a | b +--------+--- + xyxyxy | 3 +(1 row) + +drop view uv_iocu_view; +drop table uv_iocu_tab; +-- Test whole-row references to the view +create table uv_iocu_tab (a int unique, b text); +create view uv_iocu_view as + select b as bb, a as aa, uv_iocu_tab::text as cc from uv_iocu_tab; +insert into uv_iocu_view (aa,bb) values (1,'x'); +explain (costs off) +insert into uv_iocu_view (aa,bb) values (1,'y') + on conflict (aa) do update set bb = 'Rejected: '||excluded.* + where excluded.aa > 0 + and excluded.bb != '' + and excluded.cc is not null; + QUERY PLAN +--------------------------------------------------------------------------------------------------------- + Insert on uv_iocu_tab + Conflict Resolution: UPDATE + Conflict Arbiter Indexes: uv_iocu_tab_a_key + Conflict Filter: ((excluded.a > 0) AND (excluded.b <> ''::text) AND ((excluded.*)::text IS NOT NULL)) + -> Result + Optimizer: Postgres query optimizer +(6 rows) + +insert into uv_iocu_view (aa,bb) values (1,'y') + on conflict (aa) do update set bb = 'Rejected: '||excluded.* + where excluded.aa > 0 + and excluded.bb != '' + and excluded.cc is not null; +select * from uv_iocu_view; + bb | aa | cc +-------------------------+----+--------------------------------- + Rejected: (y,1,"(1,y)") | 1 | (1,"Rejected: (y,1,""(1,y)"")") +(1 row) + +-- Test omitting a column of the base relation +delete from uv_iocu_view; +insert into uv_iocu_view (aa,bb) values (1,'x'); +insert into uv_iocu_view (aa) values (1) + on conflict (aa) do update set bb = 'Rejected: '||excluded.*; +select * from uv_iocu_view; + bb | aa | cc +-----------------------+----+------------------------------- + Rejected: (,1,"(1,)") | 1 | (1,"Rejected: (,1,""(1,)"")") +(1 row) + +alter table uv_iocu_tab alter column b set default 'table default'; +insert into uv_iocu_view (aa) values (1) + on conflict (aa) do update set bb = 'Rejected: '||excluded.*; +select * from uv_iocu_view; + bb | aa | cc +-------------------------------------------------------+----+--------------------------------------------------------------------- + Rejected: ("table default",1,"(1,""table default"")") | 1 | (1,"Rejected: (""table default"",1,""(1,""""table default"""")"")") +(1 row) + +alter view uv_iocu_view alter column bb set default 'view default'; +insert into uv_iocu_view (aa) values (1) + on conflict (aa) do update set bb = 'Rejected: '||excluded.*; +select * from uv_iocu_view; + bb | aa | cc +-----------------------------------------------------+----+------------------------------------------------------------------- + Rejected: ("view default",1,"(1,""view default"")") | 1 | (1,"Rejected: (""view default"",1,""(1,""""view default"""")"")") +(1 row) + +-- Should fail to update non-updatable columns +insert into uv_iocu_view (aa) values (1) + on conflict (aa) do update set cc = 'XXX'; +ERROR: cannot insert into column "cc" of view "uv_iocu_view" +DETAIL: View columns that are not columns of their base relation are not updatable. +drop view uv_iocu_view; +drop table uv_iocu_tab; +-- ON CONFLICT DO UPDATE permissions checks +create user regress_view_user1; +create user regress_view_user2; +set session authorization regress_view_user1; +create table base_tbl(a int unique, b text, c float); +insert into base_tbl values (1,'xxx',1.0); +create view rw_view1 as select b as bb, c as cc, a as aa from base_tbl; +grant select (aa,bb) on rw_view1 to regress_view_user2; +grant insert on rw_view1 to regress_view_user2; +grant update (bb) on rw_view1 to regress_view_user2; +set session authorization regress_view_user2; +insert into rw_view1 values ('yyy',2.0,1) + on conflict (aa) do update set bb = excluded.cc; -- Not allowed +ERROR: permission denied for view rw_view1 +insert into rw_view1 values ('yyy',2.0,1) + on conflict (aa) do update set bb = rw_view1.cc; -- Not allowed +ERROR: permission denied for view rw_view1 +insert into rw_view1 values ('yyy',2.0,1) + on conflict (aa) do update set bb = excluded.bb; -- OK +insert into rw_view1 values ('zzz',2.0,1) + on conflict (aa) do update set bb = rw_view1.bb||'xxx'; -- OK +insert into rw_view1 values ('zzz',2.0,1) + on conflict (aa) do update set cc = 3.0; -- Not allowed +ERROR: permission denied for view rw_view1 +reset session authorization; +select * from base_tbl; + a | b | c +---+--------+--- + 1 | yyyxxx | 1 +(1 row) + +set session authorization regress_view_user1; +grant select (a,b) on base_tbl to regress_view_user2; +grant insert (a,b) on base_tbl to regress_view_user2; +grant update (a,b) on base_tbl to regress_view_user2; +set session authorization regress_view_user2; +create view rw_view2 as select b as bb, c as cc, a as aa from base_tbl; +insert into rw_view2 (aa,bb) values (1,'xxx') + on conflict (aa) do update set bb = excluded.bb; -- Not allowed +ERROR: permission denied for table base_tbl +create view rw_view3 as select b as bb, a as aa from base_tbl; +insert into rw_view3 (aa,bb) values (1,'xxx') + on conflict (aa) do update set bb = excluded.bb; -- OK +reset session authorization; +select * from base_tbl; + a | b | c +---+-----+--- + 1 | xxx | 1 +(1 row) + +set session authorization regress_view_user2; +create view rw_view4 as select aa, bb, cc FROM rw_view1; +insert into rw_view4 (aa,bb) values (1,'yyy') + on conflict (aa) do update set bb = excluded.bb; -- Not allowed +ERROR: permission denied for view rw_view1 +create view rw_view5 as select aa, bb FROM rw_view1; +insert into rw_view5 (aa,bb) values (1,'yyy') + on conflict (aa) do update set bb = excluded.bb; -- OK +reset session authorization; +select * from base_tbl; + a | b | c +---+-----+--- + 1 | yyy | 1 +(1 row) + +drop view rw_view5; +drop view rw_view4; +drop view rw_view3; +drop view rw_view2; +drop view rw_view1; +drop table base_tbl; +drop user regress_view_user1; +drop user regress_view_user2; +-- Test single- and multi-row inserts with table and view defaults. +-- Table defaults should be used, unless overridden by view defaults. +create table base_tab_def (a int, b text default 'Table default', + c text default 'Table default', d text, e text); +create view base_tab_def_view as select * from base_tab_def; +alter view base_tab_def_view alter b set default 'View default'; +alter view base_tab_def_view alter d set default 'View default'; +insert into base_tab_def values (1); +insert into base_tab_def values (2), (3); +insert into base_tab_def values (4, default, default, default, default); +insert into base_tab_def values (5, default, default, default, default), + (6, default, default, default, default); +insert into base_tab_def_view values (11); +insert into base_tab_def_view values (12), (13); +insert into base_tab_def_view values (14, default, default, default, default); +insert into base_tab_def_view values (15, default, default, default, default), + (16, default, default, default, default); +insert into base_tab_def_view values (17), (default); +select * from base_tab_def order by a; + a | b | c | d | e +----+---------------+---------------+--------------+--- + 1 | Table default | Table default | | + 2 | Table default | Table default | | + 3 | Table default | Table default | | + 4 | Table default | Table default | | + 5 | Table default | Table default | | + 6 | Table default | Table default | | + 11 | View default | Table default | View default | + 12 | View default | Table default | View default | + 13 | View default | Table default | View default | + 14 | View default | Table default | View default | + 15 | View default | Table default | View default | + 16 | View default | Table default | View default | + 17 | View default | Table default | View default | + | View default | Table default | View default | +(14 rows) + +-- Adding an INSTEAD OF trigger should cause NULLs to be inserted instead of +-- table defaults, where there are no view defaults. +create function base_tab_def_view_instrig_func() returns trigger +as +$$ +begin + insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e); + return new; +end; +$$ +language plpgsql; +create trigger base_tab_def_view_instrig instead of insert on base_tab_def_view + for each row execute function base_tab_def_view_instrig_func(); +ERROR: INSTEAD OF triggers are not supported in Cloudberry +truncate base_tab_def; +insert into base_tab_def values (1); +insert into base_tab_def values (2), (3); +insert into base_tab_def values (4, default, default, default, default); +insert into base_tab_def values (5, default, default, default, default), + (6, default, default, default, default); +insert into base_tab_def_view values (11); +insert into base_tab_def_view values (12), (13); +insert into base_tab_def_view values (14, default, default, default, default); +insert into base_tab_def_view values (15, default, default, default, default), + (16, default, default, default, default); +insert into base_tab_def_view values (17), (default); +select * from base_tab_def order by a; + a | b | c | d | e +----+---------------+---------------+--------------+--- + 1 | Table default | Table default | | + 2 | Table default | Table default | | + 3 | Table default | Table default | | + 4 | Table default | Table default | | + 5 | Table default | Table default | | + 6 | Table default | Table default | | + 11 | View default | Table default | View default | + 12 | View default | Table default | View default | + 13 | View default | Table default | View default | + 14 | View default | Table default | View default | + 15 | View default | Table default | View default | + 16 | View default | Table default | View default | + 17 | View default | Table default | View default | + | View default | Table default | View default | +(14 rows) + +-- Using an unconditional DO INSTEAD rule should also cause NULLs to be +-- inserted where there are no view defaults. +drop trigger base_tab_def_view_instrig on base_tab_def_view; +ERROR: trigger "base_tab_def_view_instrig" for table "base_tab_def_view" does not exist +drop function base_tab_def_view_instrig_func; +create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view + do instead insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e); +truncate base_tab_def; +insert into base_tab_def values (1); +insert into base_tab_def values (2), (3); +insert into base_tab_def values (4, default, default, default, default); +insert into base_tab_def values (5, default, default, default, default), + (6, default, default, default, default); +insert into base_tab_def_view values (11); +insert into base_tab_def_view values (12), (13); +insert into base_tab_def_view values (14, default, default, default, default); +insert into base_tab_def_view values (15, default, default, default, default), + (16, default, default, default, default); +insert into base_tab_def_view values (17), (default); +select * from base_tab_def order by a; + a | b | c | d | e +----+---------------+---------------+--------------+--- + 1 | Table default | Table default | | + 2 | Table default | Table default | | + 3 | Table default | Table default | | + 4 | Table default | Table default | | + 5 | Table default | Table default | | + 6 | Table default | Table default | | + 11 | View default | | View default | + 12 | View default | | View default | + 13 | View default | | View default | + 14 | View default | | View default | + 15 | View default | | View default | + 16 | View default | | View default | + 17 | View default | | View default | + | View default | | View default | +(14 rows) + +-- A DO ALSO rule should cause each row to be inserted twice. The first +-- insert should behave the same as an auto-updatable view (using table +-- defaults, unless overridden by view defaults). The second insert should +-- behave the same as a rule-updatable view (inserting NULLs where there are +-- no view defaults). +drop rule base_tab_def_view_ins_rule on base_tab_def_view; +create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view + do also insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e); +truncate base_tab_def; +insert into base_tab_def values (1); +insert into base_tab_def values (2), (3); +insert into base_tab_def values (4, default, default, default, default); +insert into base_tab_def values (5, default, default, default, default), + (6, default, default, default, default); +insert into base_tab_def_view values (11); +insert into base_tab_def_view values (12), (13); +insert into base_tab_def_view values (14, default, default, default, default); +insert into base_tab_def_view values (15, default, default, default, default), + (16, default, default, default, default); +insert into base_tab_def_view values (17), (default); +select * from base_tab_def order by a, c NULLS LAST; + a | b | c | d | e +----+---------------+---------------+--------------+--- + 1 | Table default | Table default | | + 2 | Table default | Table default | | + 3 | Table default | Table default | | + 4 | Table default | Table default | | + 5 | Table default | Table default | | + 6 | Table default | Table default | | + 11 | View default | Table default | View default | + 11 | View default | | View default | + 12 | View default | Table default | View default | + 12 | View default | | View default | + 13 | View default | Table default | View default | + 13 | View default | | View default | + 14 | View default | Table default | View default | + 14 | View default | | View default | + 15 | View default | Table default | View default | + 15 | View default | | View default | + 16 | View default | Table default | View default | + 16 | View default | | View default | + 17 | View default | Table default | View default | + 17 | View default | | View default | + | View default | Table default | View default | + | View default | | View default | +(22 rows) + +drop view base_tab_def_view; +drop table base_tab_def; +-- Test defaults with array assignments +create table base_tab (a serial, b int[], c text, d text default 'Table default'); +create view base_tab_view as select c, a, b from base_tab; +alter view base_tab_view alter column c set default 'View default'; +insert into base_tab_view (b[1], b[2], c, b[5], b[4], a, b[3]) +values (1, 2, default, 5, 4, default, 3), (10, 11, 'C value', 14, 13, 100, 12); +select * from base_tab order by a; + a | b | c | d +-----+------------------+--------------+--------------- + 1 | {1,2,3,4,5} | View default | Table default + 100 | {10,11,12,13,14} | C value | Table default +(2 rows) + +drop view base_tab_view; +drop table base_tab; diff --git a/src/test/singlenode_regress/expected/update.out b/src/test/singlenode_regress/expected/update.out new file mode 100644 index 00000000000..34f0bfafe65 --- /dev/null +++ b/src/test/singlenode_regress/expected/update.out @@ -0,0 +1,1051 @@ +-- +-- UPDATE syntax tests +-- +CREATE TABLE update_test ( + a INT DEFAULT 10, + b INT, + c TEXT +); +CREATE TABLE upsert_test ( + a INT PRIMARY KEY, + b TEXT +); +INSERT INTO update_test VALUES (5, 10, 'foo'); +INSERT INTO update_test(b, a) VALUES (15, 10); +SELECT * FROM update_test; + a | b | c +----+----+----- + 5 | 10 | foo + 10 | 15 | +(2 rows) + +UPDATE update_test SET a = DEFAULT, b = DEFAULT; +SELECT * FROM update_test; + a | b | c +----+---+----- + 10 | | foo + 10 | | +(2 rows) + +-- aliases for the UPDATE target table +UPDATE update_test AS t SET b = 10 WHERE t.a = 10; +SELECT * FROM update_test; + a | b | c +----+----+----- + 10 | 10 | foo + 10 | 10 | +(2 rows) + +UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10; +SELECT * FROM update_test; + a | b | c +----+----+----- + 10 | 20 | foo + 10 | 20 | +(2 rows) + +-- +-- Test VALUES in FROM +-- +UPDATE update_test SET a=v.i FROM (VALUES(100, 20)) AS v(i, j) + WHERE update_test.b = v.j; +SELECT * FROM update_test; + a | b | c +-----+----+----- + 100 | 20 | foo + 100 | 20 | +(2 rows) + +-- fail, wrong data type: +UPDATE update_test SET a = v.* FROM (VALUES(100, 20)) AS v(i, j) + WHERE update_test.b = v.j; +ERROR: column "a" is of type integer but expression is of type record +LINE 1: UPDATE update_test SET a = v.* FROM (VALUES(100, 20)) AS v(i... + ^ +HINT: You will need to rewrite or cast the expression. +-- +-- Test multiple-set-clause syntax +-- +INSERT INTO update_test SELECT a,b+1,c FROM update_test; +SELECT * FROM update_test; + a | b | c +-----+----+----- + 100 | 20 | foo + 100 | 20 | + 100 | 21 | foo + 100 | 21 | +(4 rows) + +UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo'; +SELECT * FROM update_test; + a | b | c +-----+----+------- + 100 | 20 | + 100 | 21 | + 10 | 31 | bugle + 10 | 32 | bugle +(4 rows) + +UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10; +SELECT * FROM update_test; + a | b | c +-----+----+----- + 100 | 20 | + 100 | 21 | + 11 | 41 | car + 11 | 42 | car +(4 rows) + +-- fail, multi assignment to same column: +UPDATE update_test SET (c,b) = ('car', a+b), b = a + 1 WHERE a = 10; +ERROR: multiple assignments to same column "b" +-- uncorrelated sub-select: +UPDATE update_test + SET (b,a) = (select a,b from update_test where b = 41 and c = 'car') + WHERE a = 100 AND b = 20; +SELECT * FROM update_test; + a | b | c +-----+----+----- + 100 | 21 | + 11 | 41 | car + 11 | 42 | car + 41 | 11 | +(4 rows) + +-- correlated sub-select: +UPDATE update_test o + SET (b,a) = (select a+1,b from update_test i + where i.a=o.a and i.b=o.b and i.c is not distinct from o.c); +SELECT * FROM update_test; + a | b | c +----+-----+----- + 21 | 101 | + 41 | 12 | car + 42 | 12 | car + 11 | 42 | +(4 rows) + +-- fail, multiple rows supplied: +UPDATE update_test SET (b,a) = (select a+1,b from update_test); +ERROR: more than one row returned by a subquery used as an expression +-- set to null if no rows supplied: +UPDATE update_test SET (b,a) = (select a+1,b from update_test where a = 1000) + WHERE a = 11; +SELECT * FROM update_test; + a | b | c +----+-----+----- + 21 | 101 | + 41 | 12 | car + 42 | 12 | car + | | +(4 rows) + +-- *-expansion should work in this context: +UPDATE update_test SET (a,b) = ROW(v.*) FROM (VALUES(21, 100)) AS v(i, j) + WHERE update_test.a = v.i; +-- you might expect this to work, but syntactically it's not a RowExpr: +UPDATE update_test SET (a,b) = (v.*) FROM (VALUES(21, 101)) AS v(i, j) + WHERE update_test.a = v.i; +ERROR: source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression +LINE 1: UPDATE update_test SET (a,b) = (v.*) FROM (VALUES(21, 101)) ... + ^ +-- if an alias for the target table is specified, don't allow references +-- to the original table name +UPDATE update_test AS t SET b = update_test.b + 10 WHERE t.a = 10; +ERROR: invalid reference to FROM-clause entry for table "update_test" +LINE 1: UPDATE update_test AS t SET b = update_test.b + 10 WHERE t.a... + ^ +HINT: Perhaps you meant to reference the table alias "t". +-- Make sure that we can update to a TOASTed value. +UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car'; +SELECT a, b, char_length(c) FROM update_test; + a | b | char_length +----+-----+------------- + | | + 21 | 100 | + 41 | 12 | 10000 + 42 | 12 | 10000 +(4 rows) + +-- Check multi-assignment with a Result node to handle a one-time filter. +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE update_test t + SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a) + WHERE CURRENT_USER = SESSION_USER; + QUERY PLAN +------------------------------------------------------------------------------ + Update on public.update_test t + -> Seq Scan on public.update_test t + Output: $1, $2, (SubPlan 1 (returns $1,$2)), t.ctid, t.gp_segment_id + SubPlan 1 (returns $1,$2) + -> Seq Scan on public.update_test s + Output: s.b, s.a + Filter: (s.a = t.a) + Optimizer: Postgres query optimizer +(8 rows) + +UPDATE update_test t + SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a) + WHERE CURRENT_USER = SESSION_USER; +SELECT a, b, char_length(c) FROM update_test; + a | b | char_length +-----+----+------------- + | | + 100 | 21 | + 12 | 41 | 10000 + 12 | 42 | 10000 +(4 rows) + +-- Test ON CONFLICT DO UPDATE +INSERT INTO upsert_test VALUES(1, 'Boo'), (3, 'Zoo'); +-- uncorrelated sub-select: +WITH aaa AS (SELECT 1 AS a, 'Foo' AS b) INSERT INTO upsert_test + VALUES (1, 'Bar') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b, a FROM aaa) RETURNING *; + a | b +---+----- + 1 | Foo +(1 row) + +-- correlated sub-select: +INSERT INTO upsert_test VALUES (1, 'Baz'), (3, 'Zaz') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Correlated', a from upsert_test i WHERE i.a = upsert_test.a) + RETURNING *; + a | b +---+----------------- + 1 | Foo, Correlated + 3 | Zoo, Correlated +(2 rows) + +-- correlated sub-select (EXCLUDED.* alias): +INSERT INTO upsert_test VALUES (1, 'Bat'), (3, 'Zot') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING *; + a | b +---+--------------------------- + 1 | Foo, Correlated, Excluded + 3 | Zoo, Correlated, Excluded +(2 rows) + +-- ON CONFLICT using system attributes in RETURNING, testing both the +-- inserting and updating paths. See bug report at: +-- https://www.postgresql.org/message-id/73436355-6432-49B1-92ED-1FE4F7E7E100%40finefun.com.au +INSERT INTO upsert_test VALUES (2, 'Beeble') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING tableoid::regclass, xmin = pg_current_xact_id()::xid AS xmin_correct, xmax = 0 AS xmax_correct; + tableoid | xmin_correct | xmax_correct +-------------+--------------+-------------- + upsert_test | t | t +(1 row) + +-- currently xmax is set after a conflict - that's probably not good, +-- but it seems worthwhile to have to be explicit if that changes. +INSERT INTO upsert_test VALUES (2, 'Brox') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING tableoid::regclass, xmin = pg_current_xact_id()::xid AS xmin_correct, xmax = pg_current_xact_id()::xid AS xmax_correct; + tableoid | xmin_correct | xmax_correct +-------------+--------------+-------------- + upsert_test | t | t +(1 row) + +DROP TABLE update_test; +DROP TABLE upsert_test; +-- Test ON CONFLICT DO UPDATE with partitioned table and non-identical children +CREATE TABLE upsert_test ( + a INT PRIMARY KEY, + b TEXT +) PARTITION BY LIST (a); +CREATE TABLE upsert_test_1 PARTITION OF upsert_test FOR VALUES IN (1); +CREATE TABLE upsert_test_2 (b TEXT, a INT PRIMARY KEY); +ALTER TABLE upsert_test ATTACH PARTITION upsert_test_2 FOR VALUES IN (2); +INSERT INTO upsert_test VALUES(1, 'Boo'), (2, 'Zoo'); +-- uncorrelated sub-select: +WITH aaa AS (SELECT 1 AS a, 'Foo' AS b) INSERT INTO upsert_test + VALUES (1, 'Bar') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b, a FROM aaa) RETURNING *; + a | b +---+----- + 1 | Foo +(1 row) + +-- correlated sub-select: +WITH aaa AS (SELECT 1 AS ctea, ' Foo' AS cteb) INSERT INTO upsert_test + VALUES (1, 'Bar'), (2, 'Baz') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT upsert_test.b||cteb, upsert_test.a FROM aaa) RETURNING *; + a | b +---+--------- + 1 | Foo Foo + 2 | Zoo Foo +(2 rows) + +DROP TABLE upsert_test; +--------------------------- +-- UPDATE with row movement +--------------------------- +-- When a partitioned table receives an UPDATE to the partitioned key and the +-- new values no longer meet the partition's bound, the row must be moved to +-- the correct partition for the new partition key (if one exists). We must +-- also ensure that updatable views on partitioned tables properly enforce any +-- WITH CHECK OPTION that is defined. The situation with triggers in this case +-- also requires thorough testing as partition key updates causing row +-- movement convert UPDATEs into DELETE+INSERT. +CREATE TABLE range_parted ( + a text, + b bigint, + c numeric, + d int, + e varchar +) PARTITION BY RANGE (a, b); +-- Create partitions intentionally in descending bound order, so as to test +-- that update-row-movement works with the leaf partitions not in bound order. +CREATE TABLE part_b_20_b_30 (e varchar, c numeric, a text, b bigint, d int); +ALTER TABLE range_parted ATTACH PARTITION part_b_20_b_30 FOR VALUES FROM ('b', 20) TO ('b', 30); +CREATE TABLE part_b_10_b_20 (e varchar, c numeric, a text, b bigint, d int) PARTITION BY RANGE (c); +CREATE TABLE part_b_1_b_10 PARTITION OF range_parted FOR VALUES FROM ('b', 1) TO ('b', 10); +ALTER TABLE range_parted ATTACH PARTITION part_b_10_b_20 FOR VALUES FROM ('b', 10) TO ('b', 20); +CREATE TABLE part_a_10_a_20 PARTITION OF range_parted FOR VALUES FROM ('a', 10) TO ('a', 20); +CREATE TABLE part_a_1_a_10 PARTITION OF range_parted FOR VALUES FROM ('a', 1) TO ('a', 10); +-- Check that partition-key UPDATE works sanely on a partitioned table that +-- does not have any child partitions. +UPDATE part_b_10_b_20 set b = b - 6; +-- Create some more partitions following the above pattern of descending bound +-- order, but let's make the situation a bit more complex by having the +-- attribute numbers of the columns vary from their parent partition. +CREATE TABLE part_c_100_200 (e varchar, c numeric, a text, b bigint, d int) PARTITION BY range (abs(d)); +ALTER TABLE part_c_100_200 DROP COLUMN e, DROP COLUMN c, DROP COLUMN a; +ALTER TABLE part_c_100_200 ADD COLUMN c numeric, ADD COLUMN e varchar, ADD COLUMN a text; +ALTER TABLE part_c_100_200 DROP COLUMN b; +ALTER TABLE part_c_100_200 ADD COLUMN b bigint; +CREATE TABLE part_d_1_15 PARTITION OF part_c_100_200 FOR VALUES FROM (1) TO (15); +CREATE TABLE part_d_15_20 PARTITION OF part_c_100_200 FOR VALUES FROM (15) TO (20); +ALTER TABLE part_b_10_b_20 ATTACH PARTITION part_c_100_200 FOR VALUES FROM (100) TO (200); +CREATE TABLE part_c_1_100 (e varchar, d int, c numeric, b bigint, a text); +ALTER TABLE part_b_10_b_20 ATTACH PARTITION part_c_1_100 FOR VALUES FROM (1) TO (100); +\set init_range_parted 'truncate range_parted; insert into range_parted VALUES (''a'', 1, 1, 1), (''a'', 10, 200, 1), (''b'', 12, 96, 1), (''b'', 13, 97, 2), (''b'', 15, 105, 16), (''b'', 17, 105, 19)' +\set show_data 'select tableoid::regclass::text COLLATE "C" partname, * from range_parted ORDER BY 1, 2, 3, 4, 5, 6' +:init_range_parted; +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_c_1_100 | b | 12 | 96 | 1 | + part_c_1_100 | b | 13 | 97 | 2 | + part_d_15_20 | b | 15 | 105 | 16 | + part_d_15_20 | b | 17 | 105 | 19 | +(6 rows) + +-- The order of subplans should be in bound order +EXPLAIN (costs off) UPDATE range_parted set c = c - 50 WHERE c > 97; + QUERY PLAN +------------------------------------------------------- + Update on range_parted + Update on part_a_1_a_10 range_parted_1 + Update on part_a_10_a_20 range_parted_2 + Update on part_b_1_b_10 range_parted_3 + Update on part_c_1_100 range_parted_4 + Update on part_d_1_15 range_parted_5 + Update on part_d_15_20 range_parted_6 + Update on part_b_20_b_30 range_parted_7 + -> Append + -> Seq Scan on part_a_1_a_10 range_parted_1 + Filter: (c > '97'::numeric) + -> Seq Scan on part_a_10_a_20 range_parted_2 + Filter: (c > '97'::numeric) + -> Seq Scan on part_b_1_b_10 range_parted_3 + Filter: (c > '97'::numeric) + -> Seq Scan on part_c_1_100 range_parted_4 + Filter: (c > '97'::numeric) + -> Seq Scan on part_d_1_15 range_parted_5 + Filter: (c > '97'::numeric) + -> Seq Scan on part_d_15_20 range_parted_6 + Filter: (c > '97'::numeric) + -> Seq Scan on part_b_20_b_30 range_parted_7 + Filter: (c > '97'::numeric) +(23 rows) + +-- fail, row movement happens only within the partition subtree. +UPDATE part_c_100_200 set c = c - 20, d = c WHERE c = 105; +ERROR: new row for relation "part_c_100_200" violates partition constraint +DETAIL: Failing row contains (105, 85, null, b, 15). +-- fail, no partition key update, so no attempt to move tuple, +-- but "a = 'a'" violates partition constraint enforced by root partition) +UPDATE part_b_10_b_20 set a = 'a'; +ERROR: new row for relation "part_b_10_b_20" violates partition constraint +DETAIL: Failing row contains (null, 96, a, 12, 1). +-- ok, partition key update, no constraint violation +UPDATE range_parted set d = d - 10 WHERE d > 10; +-- ok, no partition key update, no constraint violation +UPDATE range_parted set e = d; +-- No row found +UPDATE part_c_1_100 set c = c + 20 WHERE c = 98; +-- ok, row movement +UPDATE part_b_10_b_20 set c = c + 20 returning c, b, a; + c | b | a +-----+----+--- + 116 | 12 | b + 117 | 13 | b + 125 | 15 | b + 125 | 17 | b +(4 rows) + +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+---+--- + part_a_10_a_20 | a | 10 | 200 | 1 | 1 + part_a_1_a_10 | a | 1 | 1 | 1 | 1 + part_d_1_15 | b | 12 | 116 | 1 | 1 + part_d_1_15 | b | 13 | 117 | 2 | 2 + part_d_1_15 | b | 15 | 125 | 6 | 6 + part_d_1_15 | b | 17 | 125 | 9 | 9 +(6 rows) + +-- fail, row movement happens only within the partition subtree. +UPDATE part_b_10_b_20 set b = b - 6 WHERE c > 116 returning *; +ERROR: new row for relation "part_b_10_b_20" violates partition constraint +DETAIL: Failing row contains (2, 117, b, 7, 2). +-- ok, row movement, with subset of rows moved into different partition. +UPDATE range_parted set b = b - 6 WHERE c > 116 returning a, b + c; + a | ?column? +---+---------- + a | 204 + b | 124 + b | 134 + b | 136 +(4 rows) + +:show_data; + partname | a | b | c | d | e +---------------+---+----+-----+---+--- + part_a_1_a_10 | a | 1 | 1 | 1 | 1 + part_a_1_a_10 | a | 4 | 200 | 1 | 1 + part_b_1_b_10 | b | 7 | 117 | 2 | 2 + part_b_1_b_10 | b | 9 | 125 | 6 | 6 + part_d_1_15 | b | 11 | 125 | 9 | 9 + part_d_1_15 | b | 12 | 116 | 1 | 1 +(6 rows) + +-- Common table needed for multiple test scenarios. +CREATE TABLE mintab(c1 int); +INSERT into mintab VALUES (120); +-- update partition key using updatable view. +CREATE VIEW upview AS SELECT * FROM range_parted WHERE (select c > c1 FROM mintab) WITH CHECK OPTION; +-- ok +UPDATE upview set c = 199 WHERE b = 4; +-- fail, check option violation +UPDATE upview set c = 120 WHERE b = 4; +ERROR: new row violates check option for view "upview" +DETAIL: Failing row contains (a, 4, 120, 1, 1). +-- fail, row movement with check option violation +UPDATE upview set a = 'b', b = 15, c = 120 WHERE b = 4; +ERROR: new row violates check option for view "upview" +DETAIL: Failing row contains (b, 15, 120, 1, 1). +-- ok, row movement, check option passes +UPDATE upview set a = 'b', b = 15 WHERE b = 4; +:show_data; + partname | a | b | c | d | e +---------------+---+----+-----+---+--- + part_a_1_a_10 | a | 1 | 1 | 1 | 1 + part_b_1_b_10 | b | 7 | 117 | 2 | 2 + part_b_1_b_10 | b | 9 | 125 | 6 | 6 + part_d_1_15 | b | 11 | 125 | 9 | 9 + part_d_1_15 | b | 12 | 116 | 1 | 1 + part_d_1_15 | b | 15 | 199 | 1 | 1 +(6 rows) + +-- cleanup +DROP VIEW upview; +-- RETURNING having whole-row vars. +:init_range_parted; +UPDATE range_parted set c = 95 WHERE a = 'b' and b > 10 and c > 100 returning (range_parted), *; + range_parted | a | b | c | d | e +---------------+---+----+----+----+--- + (b,15,95,16,) | b | 15 | 95 | 16 | + (b,17,95,19,) | b | 17 | 95 | 19 | +(2 rows) + +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_c_1_100 | b | 12 | 96 | 1 | + part_c_1_100 | b | 13 | 97 | 2 | + part_c_1_100 | b | 15 | 95 | 16 | + part_c_1_100 | b | 17 | 95 | 19 | +(6 rows) + +-- Transition tables with update row movement +:init_range_parted; +CREATE FUNCTION trans_updatetrigfunc() RETURNS trigger LANGUAGE plpgsql AS +$$ + begin + raise notice 'trigger = %, old table = %, new table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' ORDER BY a) FROM old_table), + (select string_agg(new_table::text, ', ' ORDER BY a) FROM new_table); + return null; + end; +$$; +CREATE TRIGGER trans_updatetrig + AFTER UPDATE ON range_parted REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); +ERROR: Triggers for statements are not yet supported +UPDATE range_parted set c = (case when c = 96 then 110 else c + 1 end ) WHERE a = 'b' and b > 10 and c >= 96; +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_c_1_100 | b | 13 | 98 | 2 | + part_d_15_20 | b | 15 | 106 | 16 | + part_d_15_20 | b | 17 | 106 | 19 | + part_d_1_15 | b | 12 | 110 | 1 | +(6 rows) + +:init_range_parted; +-- Enabling OLD TABLE capture for both DELETE as well as UPDATE stmt triggers +-- should not cause DELETEd rows to be captured twice. Similar thing for +-- INSERT triggers and inserted rows. +CREATE TRIGGER trans_deletetrig + AFTER DELETE ON range_parted REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER trans_inserttrig + AFTER INSERT ON range_parted REFERENCING NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); +ERROR: Triggers for statements are not yet supported +UPDATE range_parted set c = c + 50 WHERE a = 'b' and b > 10 and c >= 96; +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_d_15_20 | b | 15 | 155 | 16 | + part_d_15_20 | b | 17 | 155 | 19 | + part_d_1_15 | b | 12 | 146 | 1 | + part_d_1_15 | b | 13 | 147 | 2 | +(6 rows) + +DROP TRIGGER trans_deletetrig ON range_parted; +ERROR: trigger "trans_deletetrig" for table "range_parted" does not exist +DROP TRIGGER trans_inserttrig ON range_parted; +ERROR: trigger "trans_inserttrig" for table "range_parted" does not exist +-- Don't drop trans_updatetrig yet. It is required below. +-- Test with transition tuple conversion happening for rows moved into the +-- new partition. This requires a trigger that references transition table +-- (we already have trans_updatetrig). For inserted rows, the conversion +-- is not usually needed, because the original tuple is already compatible with +-- the desired transition tuple format. But conversion happens when there is a +-- BR trigger because the trigger can change the inserted row. So install a +-- BR triggers on those child partitions where the rows will be moved. +CREATE FUNCTION func_parted_mod_b() RETURNS trigger AS $$ +BEGIN + NEW.b = NEW.b + 1; + return NEW; +END $$ language plpgsql; +CREATE TRIGGER trig_c1_100 BEFORE UPDATE OR INSERT ON part_c_1_100 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +CREATE TRIGGER trig_d1_15 BEFORE UPDATE OR INSERT ON part_d_1_15 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +CREATE TRIGGER trig_d15_20 BEFORE UPDATE OR INSERT ON part_d_15_20 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +:init_range_parted; +UPDATE range_parted set c = (case when c = 96 then 110 else c + 1 end) WHERE a = 'b' and b > 10 and c >= 96; +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_c_1_100 | b | 15 | 98 | 2 | + part_d_15_20 | b | 17 | 106 | 16 | + part_d_15_20 | b | 19 | 106 | 19 | + part_d_1_15 | b | 15 | 110 | 1 | +(6 rows) + +:init_range_parted; +UPDATE range_parted set c = c + 50 WHERE a = 'b' and b > 10 and c >= 96; +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_d_15_20 | b | 17 | 155 | 16 | + part_d_15_20 | b | 19 | 155 | 19 | + part_d_1_15 | b | 15 | 146 | 1 | + part_d_1_15 | b | 16 | 147 | 2 | +(6 rows) + +-- Case where per-partition tuple conversion map array is allocated, but the +-- map is not required for the particular tuple that is routed, thanks to +-- matching table attributes of the partition and the target table. +:init_range_parted; +UPDATE range_parted set b = 15 WHERE b = 1; +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_10_a_20 | a | 15 | 1 | 1 | + part_c_1_100 | b | 13 | 96 | 1 | + part_c_1_100 | b | 14 | 97 | 2 | + part_d_15_20 | b | 16 | 105 | 16 | + part_d_15_20 | b | 18 | 105 | 19 | +(6 rows) + +DROP TRIGGER trans_updatetrig ON range_parted; +ERROR: trigger "trans_updatetrig" for table "range_parted" does not exist +DROP TRIGGER trig_c1_100 ON part_c_1_100; +DROP TRIGGER trig_d1_15 ON part_d_1_15; +DROP TRIGGER trig_d15_20 ON part_d_15_20; +DROP FUNCTION func_parted_mod_b(); +-- RLS policies with update-row-movement +----------------------------------------- +ALTER TABLE range_parted ENABLE ROW LEVEL SECURITY; +CREATE USER regress_range_parted_user; +NOTICE: resource queue required -- using default resource queue "pg_default" +GRANT ALL ON range_parted, mintab TO regress_range_parted_user; +CREATE POLICY seeall ON range_parted AS PERMISSIVE FOR SELECT USING (true); +CREATE POLICY policy_range_parted ON range_parted for UPDATE USING (true) WITH CHECK (c % 2 = 0); +:init_range_parted; +SET SESSION AUTHORIZATION regress_range_parted_user; +-- This should fail with RLS violation error while moving row from +-- part_a_10_a_20 to part_d_1_15, because we are setting 'c' to an odd number. +UPDATE range_parted set a = 'b', c = 151 WHERE a = 'a' and c = 200; +ERROR: new row violates row-level security policy for table "range_parted" +RESET SESSION AUTHORIZATION; +-- Create a trigger on part_d_1_15 +CREATE FUNCTION func_d_1_15() RETURNS trigger AS $$ +BEGIN + NEW.c = NEW.c + 1; -- Make even numbers odd, or vice versa + return NEW; +END $$ LANGUAGE plpgsql; +CREATE TRIGGER trig_d_1_15 BEFORE INSERT ON part_d_1_15 + FOR EACH ROW EXECUTE PROCEDURE func_d_1_15(); +:init_range_parted; +SET SESSION AUTHORIZATION regress_range_parted_user; +-- Here, RLS checks should succeed while moving row from part_a_10_a_20 to +-- part_d_1_15. Even though the UPDATE is setting 'c' to an odd number, the +-- trigger at the destination partition again makes it an even number. +UPDATE range_parted set a = 'b', c = 151 WHERE a = 'a' and c = 200; +RESET SESSION AUTHORIZATION; +:init_range_parted; +SET SESSION AUTHORIZATION regress_range_parted_user; +-- This should fail with RLS violation error. Even though the UPDATE is setting +-- 'c' to an even number, the trigger at the destination partition again makes +-- it an odd number. +UPDATE range_parted set a = 'b', c = 150 WHERE a = 'a' and c = 200; +ERROR: new row violates row-level security policy for table "range_parted" +-- Cleanup +RESET SESSION AUTHORIZATION; +DROP TRIGGER trig_d_1_15 ON part_d_1_15; +DROP FUNCTION func_d_1_15(); +-- Policy expression contains SubPlan +RESET SESSION AUTHORIZATION; +:init_range_parted; +CREATE POLICY policy_range_parted_subplan on range_parted + AS RESTRICTIVE for UPDATE USING (true) + WITH CHECK ((SELECT range_parted.c <= c1 FROM mintab)); +SET SESSION AUTHORIZATION regress_range_parted_user; +-- fail, mintab has row with c1 = 120 +UPDATE range_parted set a = 'b', c = 122 WHERE a = 'a' and c = 200; +ERROR: new row violates row-level security policy "policy_range_parted_subplan" for table "range_parted" +-- ok +UPDATE range_parted set a = 'b', c = 120 WHERE a = 'a' and c = 200; +-- RLS policy expression contains whole row. +RESET SESSION AUTHORIZATION; +:init_range_parted; +CREATE POLICY policy_range_parted_wholerow on range_parted AS RESTRICTIVE for UPDATE USING (true) + WITH CHECK (range_parted = row('b', 10, 112, 1, NULL)::range_parted); +SET SESSION AUTHORIZATION regress_range_parted_user; +-- ok, should pass the RLS check +UPDATE range_parted set a = 'b', c = 112 WHERE a = 'a' and c = 200; +RESET SESSION AUTHORIZATION; +:init_range_parted; +SET SESSION AUTHORIZATION regress_range_parted_user; +-- fail, the whole row RLS check should fail +UPDATE range_parted set a = 'b', c = 116 WHERE a = 'a' and c = 200; +ERROR: new row violates row-level security policy "policy_range_parted_wholerow" for table "range_parted" +-- Cleanup +RESET SESSION AUTHORIZATION; +DROP POLICY policy_range_parted ON range_parted; +DROP POLICY policy_range_parted_subplan ON range_parted; +DROP POLICY policy_range_parted_wholerow ON range_parted; +REVOKE ALL ON range_parted, mintab FROM regress_range_parted_user; +DROP USER regress_range_parted_user; +DROP TABLE mintab; +-- statement triggers with update row movement +--------------------------------------------------- +:init_range_parted; +CREATE FUNCTION trigfunc() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = % fired on table % during %', + TG_NAME, TG_TABLE_NAME, TG_OP; + return null; + end; +$$; +-- Triggers on root partition +CREATE TRIGGER parent_delete_trig + AFTER DELETE ON range_parted for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER parent_update_trig + AFTER UPDATE ON range_parted for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER parent_insert_trig + AFTER INSERT ON range_parted for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +-- Triggers on leaf partition part_c_1_100 +CREATE TRIGGER c1_delete_trig + AFTER DELETE ON part_c_1_100 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER c1_update_trig + AFTER UPDATE ON part_c_1_100 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER c1_insert_trig + AFTER INSERT ON part_c_1_100 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +-- Triggers on leaf partition part_d_1_15 +CREATE TRIGGER d1_delete_trig + AFTER DELETE ON part_d_1_15 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER d1_update_trig + AFTER UPDATE ON part_d_1_15 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER d1_insert_trig + AFTER INSERT ON part_d_1_15 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +-- Triggers on leaf partition part_d_15_20 +CREATE TRIGGER d15_delete_trig + AFTER DELETE ON part_d_15_20 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER d15_update_trig + AFTER UPDATE ON part_d_15_20 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +CREATE TRIGGER d15_insert_trig + AFTER INSERT ON part_d_15_20 for each statement execute procedure trigfunc(); +ERROR: Triggers for statements are not yet supported +-- Move all rows from part_c_100_200 to part_c_1_100. None of the delete or +-- insert statement triggers should be fired. +UPDATE range_parted set c = c - 50 WHERE c > 97; +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 150 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_c_1_100 | b | 12 | 96 | 1 | + part_c_1_100 | b | 13 | 97 | 2 | + part_c_1_100 | b | 15 | 55 | 16 | + part_c_1_100 | b | 17 | 55 | 19 | +(6 rows) + +DROP TRIGGER parent_delete_trig ON range_parted; +ERROR: trigger "parent_delete_trig" for table "range_parted" does not exist +DROP TRIGGER parent_update_trig ON range_parted; +ERROR: trigger "parent_update_trig" for table "range_parted" does not exist +DROP TRIGGER parent_insert_trig ON range_parted; +ERROR: trigger "parent_insert_trig" for table "range_parted" does not exist +DROP TRIGGER c1_delete_trig ON part_c_1_100; +ERROR: trigger "c1_delete_trig" for table "part_c_1_100" does not exist +DROP TRIGGER c1_update_trig ON part_c_1_100; +ERROR: trigger "c1_update_trig" for table "part_c_1_100" does not exist +DROP TRIGGER c1_insert_trig ON part_c_1_100; +ERROR: trigger "c1_insert_trig" for table "part_c_1_100" does not exist +DROP TRIGGER d1_delete_trig ON part_d_1_15; +ERROR: trigger "d1_delete_trig" for table "part_d_1_15" does not exist +DROP TRIGGER d1_update_trig ON part_d_1_15; +ERROR: trigger "d1_update_trig" for table "part_d_1_15" does not exist +DROP TRIGGER d1_insert_trig ON part_d_1_15; +ERROR: trigger "d1_insert_trig" for table "part_d_1_15" does not exist +DROP TRIGGER d15_delete_trig ON part_d_15_20; +ERROR: trigger "d15_delete_trig" for table "part_d_15_20" does not exist +DROP TRIGGER d15_update_trig ON part_d_15_20; +ERROR: trigger "d15_update_trig" for table "part_d_15_20" does not exist +DROP TRIGGER d15_insert_trig ON part_d_15_20; +ERROR: trigger "d15_insert_trig" for table "part_d_15_20" does not exist +-- Creating default partition for range +:init_range_parted; +create table part_def partition of range_parted default; +\d+ part_def + Table "public.part_def" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+-------------------+-----------+----------+---------+----------+--------------+------------- + a | text | | | | extended | | + b | bigint | | | | plain | | + c | numeric | | | | main | | + d | integer | | | | plain | | + e | character varying | | | | extended | | +Partition of: range_parted DEFAULT +Partition constraint: (NOT ((a IS NOT NULL) AND (b IS NOT NULL) AND (((a = 'a'::text) AND (b >= '1'::bigint) AND (b < '10'::bigint)) OR ((a = 'a'::text) AND (b >= '10'::bigint) AND (b < '20'::bigint)) OR ((a = 'b'::text) AND (b >= '1'::bigint) AND (b < '10'::bigint)) OR ((a = 'b'::text) AND (b >= '10'::bigint) AND (b < '20'::bigint)) OR ((a = 'b'::text) AND (b >= '20'::bigint) AND (b < '30'::bigint))))) + +insert into range_parted values ('c', 9); +-- ok +update part_def set a = 'd' where a = 'c'; +-- fail +update part_def set a = 'a' where a = 'd'; +ERROR: new row for relation "part_def" violates partition constraint +DETAIL: Failing row contains (a, 9, null, null, null). +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_c_1_100 | b | 12 | 96 | 1 | + part_c_1_100 | b | 13 | 97 | 2 | + part_d_15_20 | b | 15 | 105 | 16 | + part_d_15_20 | b | 17 | 105 | 19 | + part_def | d | 9 | | | +(7 rows) + +-- Update row movement from non-default to default partition. +-- fail, default partition is not under part_a_10_a_20; +UPDATE part_a_10_a_20 set a = 'ad' WHERE a = 'a'; +ERROR: new row for relation "part_a_10_a_20" violates partition constraint +DETAIL: Failing row contains (ad, 10, 200, 1, null). +-- ok +UPDATE range_parted set a = 'ad' WHERE a = 'a'; +UPDATE range_parted set a = 'bd' WHERE a = 'b'; +:show_data; + partname | a | b | c | d | e +----------+----+----+-----+----+--- + part_def | ad | 1 | 1 | 1 | + part_def | ad | 10 | 200 | 1 | + part_def | bd | 12 | 96 | 1 | + part_def | bd | 13 | 97 | 2 | + part_def | bd | 15 | 105 | 16 | + part_def | bd | 17 | 105 | 19 | + part_def | d | 9 | | | +(7 rows) + +-- Update row movement from default to non-default partitions. +-- ok +UPDATE range_parted set a = 'a' WHERE a = 'ad'; +UPDATE range_parted set a = 'b' WHERE a = 'bd'; +:show_data; + partname | a | b | c | d | e +----------------+---+----+-----+----+--- + part_a_10_a_20 | a | 10 | 200 | 1 | + part_a_1_a_10 | a | 1 | 1 | 1 | + part_c_1_100 | b | 12 | 96 | 1 | + part_c_1_100 | b | 13 | 97 | 2 | + part_d_15_20 | b | 15 | 105 | 16 | + part_d_15_20 | b | 17 | 105 | 19 | + part_def | d | 9 | | | +(7 rows) + +-- Cleanup: range_parted no longer needed. +DROP TABLE range_parted; +CREATE TABLE list_parted ( + a text, + b int +) PARTITION BY list (a); +CREATE TABLE list_part1 PARTITION OF list_parted for VALUES in ('a', 'b'); +CREATE TABLE list_default PARTITION OF list_parted default; +INSERT into list_part1 VALUES ('a', 1); +INSERT into list_default VALUES ('d', 10); +-- fail +UPDATE list_default set a = 'a' WHERE a = 'd'; +ERROR: new row for relation "list_default" violates partition constraint +DETAIL: Failing row contains (a, 10). +-- ok +UPDATE list_default set a = 'x' WHERE a = 'd'; +DROP TABLE list_parted; +-- Test retrieval of system columns with non-consistent partition row types. +-- This is only partially supported, as seen in the results. +create table utrtest (a int, b text) partition by list (a); +create table utr1 (a int check (a in (1)), q text, b text); +create table utr2 (a int check (a in (2)), b text); +alter table utr1 drop column q; +alter table utrtest attach partition utr1 for values in (1); +alter table utrtest attach partition utr2 for values in (2); +insert into utrtest values (1, 'foo') + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; + a | b | tableoid | xmin_ok +---+-----+----------+--------- + 1 | foo | utr1 | t +(1 row) + +insert into utrtest values (2, 'bar') + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; -- fails +ERROR: virtual tuple table slot does not have system attributes (execTuples.c:156) +insert into utrtest values (2, 'bar') + returning *, tableoid::regclass; + a | b | tableoid +---+-----+---------- + 2 | bar | utr2 +(1 row) + +update utrtest set b = b || b from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; + a | b | x | tableoid | xmin_ok +---+--------+---+----------+--------- + 1 | foofoo | 1 | utr1 | t + 2 | barbar | 2 | utr2 | t +(2 rows) + +update utrtest set a = 3 - a from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; -- fails +ERROR: virtual tuple table slot does not have system attributes (execTuples.c:156) +update utrtest set a = 3 - a from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass; + a | b | x | tableoid +---+--------+---+---------- + 2 | foofoo | 1 | utr2 + 1 | barbar | 2 | utr1 +(2 rows) + +delete from utrtest + returning *, tableoid::regclass, xmax = pg_current_xact_id()::xid as xmax_ok; + a | b | tableoid | xmax_ok +---+--------+----------+--------- + 1 | barbar | utr1 | t + 2 | foofoo | utr2 | t +(2 rows) + +drop table utrtest; +-------------- +-- Some more update-partition-key test scenarios below. This time use list +-- partitions. +-------------- +-- Setup for list partitions +CREATE TABLE list_parted (a numeric, b int, c int8) PARTITION BY list (a); +CREATE TABLE sub_parted PARTITION OF list_parted for VALUES in (1) PARTITION BY list (b); +CREATE TABLE sub_part1(b int, c int8, a numeric); +ALTER TABLE sub_parted ATTACH PARTITION sub_part1 for VALUES in (1); +CREATE TABLE sub_part2(b int, c int8, a numeric); +ALTER TABLE sub_parted ATTACH PARTITION sub_part2 for VALUES in (2); +CREATE TABLE list_part1(a numeric, b int, c int8); +ALTER TABLE list_parted ATTACH PARTITION list_part1 for VALUES in (2,3); +INSERT into list_parted VALUES (2,5,50); +INSERT into list_parted VALUES (3,6,60); +INSERT into sub_parted VALUES (1,1,60); +INSERT into sub_parted VALUES (1,2,10); +-- Test partition constraint violation when intermediate ancestor is used and +-- constraint is inherited from upper root. +UPDATE sub_parted set a = 2 WHERE c = 10; +ERROR: new row for relation "sub_parted" violates partition constraint +DETAIL: Failing row contains (2, 2, 10). +-- Test update-partition-key, where the unpruned partitions do not have their +-- partition keys updated. +SELECT tableoid::regclass::text, * FROM list_parted WHERE a = 2 ORDER BY 1; + tableoid | a | b | c +------------+---+---+---- + list_part1 | 2 | 5 | 50 +(1 row) + +UPDATE list_parted set b = c + a WHERE a = 2; +SELECT tableoid::regclass::text, * FROM list_parted WHERE a = 2 ORDER BY 1; + tableoid | a | b | c +------------+---+----+---- + list_part1 | 2 | 52 | 50 +(1 row) + +-- Test the case where BR UPDATE triggers change the partition key. +CREATE FUNCTION func_parted_mod_b() returns trigger as $$ +BEGIN + NEW.b = 2; -- This is changing partition key column. + return NEW; +END $$ LANGUAGE plpgsql; +CREATE TRIGGER parted_mod_b before update on sub_part1 + for each row execute procedure func_parted_mod_b(); +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; + tableoid | a | b | c +------------+---+----+---- + list_part1 | 2 | 52 | 50 + list_part1 | 3 | 6 | 60 + sub_part1 | 1 | 1 | 60 + sub_part2 | 1 | 2 | 10 +(4 rows) + +-- This should do the tuple routing even though there is no explicit +-- partition-key update, because there is a trigger on sub_part1. +UPDATE list_parted set c = 70 WHERE b = 1; +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; + tableoid | a | b | c +------------+---+----+---- + list_part1 | 2 | 52 | 50 + list_part1 | 3 | 6 | 60 + sub_part2 | 1 | 2 | 10 + sub_part2 | 1 | 2 | 70 +(4 rows) + +DROP TRIGGER parted_mod_b ON sub_part1; +-- If BR DELETE trigger prevented DELETE from happening, we should also skip +-- the INSERT if that delete is part of UPDATE=>DELETE+INSERT. +CREATE OR REPLACE FUNCTION func_parted_mod_b() returns trigger as $$ +BEGIN + raise notice 'Trigger: Got OLD row %, but returning NULL', OLD; + return NULL; +END $$ LANGUAGE plpgsql; +CREATE TRIGGER trig_skip_delete before delete on sub_part2 + for each row execute procedure func_parted_mod_b(); +UPDATE list_parted set b = 1 WHERE c = 70; +NOTICE: Trigger: Got OLD row (2,70,1), but returning NULL +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; + tableoid | a | b | c +------------+---+----+---- + list_part1 | 2 | 52 | 50 + list_part1 | 3 | 6 | 60 + sub_part2 | 1 | 2 | 10 + sub_part2 | 1 | 2 | 70 +(4 rows) + +-- Drop the trigger. Now the row should be moved. +DROP TRIGGER trig_skip_delete ON sub_part2; +UPDATE list_parted set b = 1 WHERE c = 70; +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; + tableoid | a | b | c +------------+---+----+---- + list_part1 | 2 | 52 | 50 + list_part1 | 3 | 6 | 60 + sub_part1 | 1 | 1 | 70 + sub_part2 | 1 | 2 | 10 +(4 rows) + +DROP FUNCTION func_parted_mod_b(); +-- UPDATE partition-key with FROM clause. If join produces multiple output +-- rows for the same row to be modified, we should tuple-route the row only +-- once. There should not be any rows inserted. +CREATE TABLE non_parted (id int); +INSERT into non_parted VALUES (1), (1), (1), (2), (2), (2), (3), (3), (3); +UPDATE list_parted t1 set a = 2 FROM non_parted t2 WHERE t1.a = t2.id and a = 1; +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; + tableoid | a | b | c +------------+---+----+---- + list_part1 | 2 | 1 | 70 + list_part1 | 2 | 2 | 10 + list_part1 | 2 | 52 | 50 + list_part1 | 3 | 6 | 60 +(4 rows) + +DROP TABLE non_parted; +-- Cleanup: list_parted no longer needed. +DROP TABLE list_parted; +-- create custom operator class and hash function, for the same reason +-- explained in alter_table.sql +create or replace function dummy_hashint4(a int4, seed int8) returns int8 as +$$ begin return (a + seed); end; $$ language 'plpgsql' immutable; +create operator class custom_opclass for type int4 using hash as +operator 1 = , function 2 dummy_hashint4(int4, int8); +create table hash_parted ( + a int, + b int +) partition by hash (a custom_opclass, b custom_opclass); +create table hpart1 partition of hash_parted for values with (modulus 2, remainder 1); +create table hpart2 partition of hash_parted for values with (modulus 4, remainder 2); +create table hpart3 partition of hash_parted for values with (modulus 8, remainder 0); +create table hpart4 partition of hash_parted for values with (modulus 8, remainder 4); +insert into hpart1 values (1, 1); +insert into hpart2 values (2, 5); +insert into hpart4 values (3, 4); +-- fail +update hpart1 set a = 3, b=4 where a = 1; +ERROR: new row for relation "hpart1" violates partition constraint +DETAIL: Failing row contains (3, 4). +-- ok, row movement +update hash_parted set b = b - 1 where b = 1; +-- ok +update hash_parted set b = b + 8 where b = 1; +-- cleanup +drop table hash_parted; +drop operator class custom_opclass using hash; +drop function dummy_hashint4(a int4, seed int8); diff --git a/src/test/singlenode_regress/expected/update_gp.out b/src/test/singlenode_regress/expected/update_gp.out new file mode 100644 index 00000000000..edc15ade2b2 --- /dev/null +++ b/src/test/singlenode_regress/expected/update_gp.out @@ -0,0 +1,788 @@ +-- Test DELETE and UPDATE on an inherited table. +-- The special aspect of this table is that the inherited table has +-- a different distribution key. 'p' table's distribution key matches +-- that of 'r', but 'p2's doesn't. Test that the planner adds a Motion +-- node correctly for p2. +create table todelete (a int); +create table parent (a int, b int, c int); +create table child (a int, b int, c int) inherits (parent); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +NOTICE: merging column "c" with inherited definition +insert into parent select g, g, g from generate_series(1,5) g; +insert into child select g, g, g from generate_series(6,10) g; +insert into todelete select generate_series(3,4); +delete from parent using todelete where parent.a = todelete.a; +insert into todelete select generate_series(5,7); +update parent set c=c+100 from todelete where parent.a = todelete.a; +select * from parent; + a | b | c +----+----+----- + 1 | 1 | 1 + 2 | 2 | 2 + 5 | 5 | 105 + 8 | 8 | 8 + 9 | 9 | 9 + 10 | 10 | 10 + 6 | 6 | 106 + 7 | 7 | 107 +(8 rows) + +drop table todelete; +drop table child; +drop table parent; +-- This is similar to the above, but with a partitioned table (which is +-- implemented by inheritance) rather than an explicitly inherited table. +-- The scans on some of the partitions degenerate into Result nodes with +-- False one-time filter, which don't need a Motion node. +create table todelete (a int, b int); +create table target (a int, b int, c int) + partition by range (c) (start(1) end(5) every(1), default partition extra); +insert into todelete select g, g % 4 from generate_series(1, 10) g; +insert into target select g, 0, 3 from generate_series(1, 5) g; +insert into target select g, 0, 1 from generate_series(1, 5) g; +delete from target where c = 3 and a in (select b from todelete); +insert into todelete values (1, 5); +update target set b=target.b+100 where c = 3 and a in (select b from todelete); +select * from target; + a | b | c +---+-----+--- + 1 | 0 | 1 + 2 | 0 | 1 + 3 | 0 | 1 + 4 | 0 | 1 + 5 | 0 | 1 + 4 | 0 | 3 + 5 | 100 | 3 +(7 rows) + +-- Also test an update with a qual that doesn't match any partition. The +-- Append degenerates into a dummy Result with false One-Time Filter. +alter table target drop default partition; +update target set b = 10 where c = 10; +drop table todelete; +drop table target; +-- +-- Test updated on inheritance parent table, where some child tables need a +-- Split Update, but not all. +-- +create table base_tbl (a int4, b int4); +create table child_a (a int4, b int4) inherits (base_tbl); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +create table child_b (a int4, b int4) inherits (base_tbl); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +insert into base_tbl select g, g from generate_series(1, 5) g; +explain (costs off) update base_tbl set a=a+1; + QUERY PLAN +--------------------------------------------------- + Update on base_tbl + Update on base_tbl base_tbl_1 + Update on child_a base_tbl_2 + Update on child_b base_tbl_3 + -> Result + -> Append + -> Seq Scan on base_tbl base_tbl_1 + -> Seq Scan on child_a base_tbl_2 + -> Seq Scan on child_b base_tbl_3 + Optimizer: Postgres query optimizer +(10 rows) + +update base_tbl set a = 5; +-- +-- Explicit Distribution motion must be added if any of the child nodes +-- contains any motion excluding the motions in initplans. +-- These test cases and expectation are applicable for GPDB planner not for ORCA. +-- +SET gp_autostats_mode = NONE; +CREATE TABLE keo1 ( user_vie_project_code_pk character varying(24), user_vie_fiscal_year_period_sk character varying(24), user_vie_act_cntr_marg_cum character varying(24)); +INSERT INTO keo1 VALUES ('1', '1', '1'); +CREATE TABLE keo2 ( projects_pk character varying(24)); +INSERT INTO keo2 VALUES ('1'); +CREATE TABLE keo3 ( sky_per character varying(24), bky_per character varying(24)); +INSERT INTO keo3 VALUES ('1', '1'); +CREATE TABLE keo4 ( keo_para_required_period character varying(6), keo_para_budget_date character varying(24)); +INSERT INTO keo4 VALUES ('1', '1'); +ANALYZE keo1, keo2, keo3, keo4; +-- Explicit Redistribution motion should be added in case of GPDB Planner (test case not applicable for ORCA) +EXPLAIN (COSTS OFF) UPDATE keo1 SET user_vie_act_cntr_marg_cum = 234.682 FROM + ( SELECT a.user_vie_project_code_pk FROM keo1 a INNER JOIN keo2 b + ON b.projects_pk=a.user_vie_project_code_pk + WHERE a.user_vie_fiscal_year_period_sk = + (SELECT MAX (sky_per) FROM keo3 WHERE bky_per = + (SELECT keo4.keo_para_required_period FROM keo4 WHERE keo_para_budget_date = + (SELECT min (keo4.keo_para_budget_date) FROM keo4))) + ) t1 +WHERE t1.user_vie_project_code_pk = keo1.user_vie_project_code_pk; + QUERY PLAN +------------------------------------------------------------------------------------------------------- + Update on keo1 + InitPlan 3 (returns $2) + -> Aggregate + InitPlan 2 (returns $1) + -> Seq Scan on keo4 keo4_1 + Filter: ((keo_para_budget_date)::text = $0) + InitPlan 1 (returns $0) + -> Aggregate + -> Seq Scan on keo4 + -> Seq Scan on keo3 + Filter: ((bky_per)::text = ($1)::text) + -> Hash Join + Hash Cond: ((a.user_vie_project_code_pk)::text = (b.projects_pk)::text) + -> Hash Join + Hash Cond: ((a.user_vie_project_code_pk)::text = (keo1.user_vie_project_code_pk)::text) + -> Seq Scan on keo1 a + Filter: ((user_vie_fiscal_year_period_sk)::text = $2) + -> Hash + -> Seq Scan on keo1 + -> Hash + -> Seq Scan on keo2 b + Optimizer: Postgres query optimizer +(22 rows) + +UPDATE keo1 SET user_vie_act_cntr_marg_cum = 234.682 FROM + ( SELECT a.user_vie_project_code_pk FROM keo1 a INNER JOIN keo2 b + ON b.projects_pk=a.user_vie_project_code_pk + WHERE a.user_vie_fiscal_year_period_sk = + (SELECT MAX (sky_per) FROM keo3 WHERE bky_per = + (SELECT keo4.keo_para_required_period FROM keo4 WHERE keo_para_budget_date = + (SELECT min (keo4.keo_para_budget_date) FROM keo4))) + ) t1 +WHERE t1.user_vie_project_code_pk = keo1.user_vie_project_code_pk; +SELECT user_vie_act_cntr_marg_cum FROM keo1; + user_vie_act_cntr_marg_cum +---------------------------- + 234.682 +(1 row) + +-- Explicit Redistribution motion should not be added in case of GPDB Planner (test case not applicable to ORCA) +CREATE TABLE keo5 (x int, y int); +INSERT INTO keo5 VALUES (1,1); +EXPLAIN (COSTS OFF) DELETE FROM keo5 WHERE x IN (SELECT x FROM keo5 WHERE EXISTS (SELECT x FROM keo5 WHERE x < 2)); + QUERY PLAN +------------------------------------------------------- + Delete on keo5 + InitPlan 1 (returns $0) + -> Seq Scan on keo5 keo5_2 + Filter: (x < 2) + -> Result + One-Time Filter: $0 + -> Hash Join + Hash Cond: (keo5.x = keo5_1.x) + -> Seq Scan on keo5 + -> Hash + -> HashAggregate + Group Key: keo5_1.x + -> Seq Scan on keo5 keo5_1 + Optimizer: Postgres query optimizer +(14 rows) + +DELETE FROM keo5 WHERE x IN (SELECT x FROM keo5 WHERE EXISTS (SELECT x FROM keo5 WHERE x < 2)); +SELECT x FROM keo5; + x +--- +(0 rows) + +RESET gp_autostats_mode; +DROP TABLE keo1; +DROP TABLE keo2; +DROP TABLE keo3; +DROP TABLE keo4; +DROP TABLE keo5; +-- +-- text types. We should support the following updates. +-- +CREATE TEMP TABLE ttab1 (a varchar(15), b integer); +CREATE TEMP TABLE ttab2 (a varchar(15), b integer); +UPDATE ttab1 SET b = ttab2.b FROM ttab2 WHERE ttab1.a = ttab2.a; +DROP TABLE ttab1; +DROP TABLE ttab2; +CREATE TEMP TABLE ttab1 (a text, b integer); +CREATE TEMP TABLE ttab2 (a text, b integer); +UPDATE ttab1 SET b = ttab2.b FROM ttab2 WHERE ttab1.a = ttab2.a; +DROP TABLE ttab1; +DROP TABLE ttab2; +CREATE TEMP TABLE ttab1 (a varchar, b integer); +CREATE TEMP TABLE ttab2 (a varchar, b integer); +UPDATE ttab1 SET b = ttab2.b FROM ttab2 WHERE ttab1.a = ttab2.a; +DROP TABLE ttab1; +DROP TABLE ttab2; +CREATE TEMP TABLE ttab1 (a char(15), b integer); +CREATE TEMP TABLE ttab2 (a char(15), b integer); +UPDATE ttab1 SET b = ttab2.b FROM ttab2 WHERE ttab1.a = ttab2.a; +DROP TABLE IF EXISTS update_distr_key; +NOTICE: table "update_distr_key" does not exist, skipping +CREATE TEMP TABLE update_distr_key (a int, b int); +INSERT INTO update_distr_key select i, i* 10 from generate_series(0, 9) i; +UPDATE update_distr_key SET a = 5 WHERE b = 10; +SELECT * from update_distr_key; + a | b +---+---- + 0 | 0 + 2 | 20 + 3 | 30 + 4 | 40 + 5 | 50 + 6 | 60 + 7 | 70 + 8 | 80 + 9 | 90 + 5 | 10 +(10 rows) + +DROP TABLE update_distr_key; +-- below cases is to test multi-hash-cols +CREATE TABLE tab3(c1 int, c2 int, c3 int, c4 int, c5 int); +CREATE TABLE tab5(c1 int, c2 int, c3 int, c4 int, c5 int); +INSERT INTO tab3 SELECT i, i, i, i, i FROM generate_series(1, 10)i; +INSERT INTO tab5 SELECT i, i, i, i, i FROM generate_series(1, 10)i; +-- test tab3 +SELECT gp_segment_id, * FROM tab3; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 1 | 1 | 1 | 1 | 1 + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 +(10 rows) + +UPDATE tab3 set c1 = 9 where c4 = 1; +SELECT gp_segment_id, * FROM tab3; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 9 | 1 | 1 | 1 | 1 +(10 rows) + +UPDATE tab3 set (c1,c2) = (5,6) where c4 = 1; +SELECT gp_segment_id, * FROM tab3; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 5 | 6 | 1 | 1 | 1 +(10 rows) + +UPDATE tab3 set (c1,c2,c3) = (3,2,1) where c4 = 1; +SELECT gp_segment_id, * FROM tab3; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 3 | 2 | 1 | 1 | 1 +(10 rows) + +UPDATE tab3 set c1 = 11 where c2 = 10 and c2 < 1; +SELECT gp_segment_id, * FROM tab3; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 3 | 2 | 1 | 1 | 1 +(10 rows) + +-- test tab5 +SELECT gp_segment_id, * FROM tab5; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 1 | 1 | 1 | 1 | 1 + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 +(10 rows) + +UPDATE tab5 set c1 = 1000 where c4 = 1; +SELECT gp_segment_id, * FROM tab5; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+------+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 1000 | 1 | 1 | 1 | 1 +(10 rows) + +UPDATE tab5 set (c1,c2) = (9,10) where c4 = 1; +SELECT gp_segment_id, * FROM tab5; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 9 | 10 | 1 | 1 | 1 +(10 rows) + +UPDATE tab5 set (c1,c2,c4) = (5,8,6) where c4 = 1; +SELECT gp_segment_id, * FROM tab5; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 5 | 8 | 1 | 6 | 1 +(10 rows) + +UPDATE tab5 set (c1,c2,c3,c4,c5) = (1,2,3,0,6) where c5 = 1; +SELECT gp_segment_id, * FROM tab5; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 1 | 2 | 3 | 0 | 6 +(10 rows) + +UPDATE tab5 set c1 = 11 where c3 = 10 and c3 < 1; +SELECT gp_segment_id, * FROM tab5; + gp_segment_id | c1 | c2 | c3 | c4 | c5 +---------------+----+----+----+----+---- + -1 | 2 | 2 | 2 | 2 | 2 + -1 | 3 | 3 | 3 | 3 | 3 + -1 | 4 | 4 | 4 | 4 | 4 + -1 | 5 | 5 | 5 | 5 | 5 + -1 | 6 | 6 | 6 | 6 | 6 + -1 | 7 | 7 | 7 | 7 | 7 + -1 | 8 | 8 | 8 | 8 | 8 + -1 | 9 | 9 | 9 | 9 | 9 + -1 | 10 | 10 | 10 | 10 | 10 + -1 | 1 | 2 | 3 | 0 | 6 +(10 rows) + +EXPLAIN (COSTS OFF ) UPDATE tab3 SET C1 = C1 + 1, C5 = C5+1; + QUERY PLAN +------------------------------------- + Update on tab3 + -> Seq Scan on tab3 + Optimizer: Postgres query optimizer +(3 rows) + +-- clean up +drop table tab3; +drop table tab5; +-- Update distribution key +-- start_ignore +drop table if exists r; +NOTICE: table "r" does not exist, skipping +drop table if exists s; +NOTICE: table "s" does not exist, skipping +drop table if exists update_dist; +NOTICE: table "update_dist" does not exist, skipping +drop table if exists update_ao_table; +NOTICE: table "update_ao_table" does not exist, skipping +drop table if exists update_aoco_table; +NOTICE: table "update_aoco_table" does not exist, skipping +-- end_ignore +-- Update normal table distribution key +create table update_dist(a int); +insert into update_dist values(1); +update update_dist set a=0 where a=1; +select * from update_dist; + a +--- + 0 +(1 row) + +-- Update distribution key with join +create table r (a int, b int); +create table s (a int, b int); +insert into r select generate_series(1, 5), generate_series(1, 5) * 2; +insert into s select generate_series(1, 5), generate_series(1, 5) * 2; +select * from r; + a | b +---+---- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 +(5 rows) + +select * from s; + a | b +---+---- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 +(5 rows) + +update r set a = r.a + 1 from s where r.a = s.a; +select * from r; + a | b +---+---- + 2 | 2 + 3 | 4 + 4 | 6 + 5 | 8 + 6 | 10 +(5 rows) + +update r set a = r.a + 1 where a in (select a from s); +select * from r; + a | b +---+---- + 6 | 10 + 3 | 2 + 4 | 4 + 5 | 6 + 6 | 8 +(5 rows) + +-- Update redistribution +delete from r; +delete from s; +insert into r select generate_series(1, 5), generate_series(1, 5); +insert into s select generate_series(1, 5), generate_series(1, 5) * 2; +select * from r; + a | b +---+--- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 +(5 rows) + +select * from s; + a | b +---+---- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 +(5 rows) + +update r set a = r.a + 1 from s where r.b = s.b; +select * from r; + a | b +---+--- + 1 | 1 + 3 | 3 + 5 | 5 + 3 | 2 + 5 | 4 +(5 rows) + +update r set a = r.a + 1 where b in (select b from s); +select * from r; + a | b +---+--- + 1 | 1 + 3 | 3 + 5 | 5 + 4 | 2 + 6 | 4 +(5 rows) + +-- Update hash aggreate group by +delete from r; +delete from s; +insert into r select generate_series(1, 5), generate_series(1, 5) * 2; +insert into s select generate_series(1, 5), generate_series(1, 5); +select * from r; + a | b +---+---- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 +(5 rows) + +select * from s; + a | b +---+--- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 +(5 rows) + +update s set a = s.a + 1 where exists (select 1 from r where s.a = r.b); +select * from s; + a | b +---+--- + 1 | 1 + 3 | 3 + 5 | 5 + 3 | 2 + 5 | 4 +(5 rows) + +-- Update ao table distribution key +create table update_ao_table (a int, b int) WITH (appendonly=true); +insert into update_ao_table select g, g from generate_series(1, 5) g; +select * from update_ao_table; + a | b +---+--- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 +(5 rows) + +update update_ao_table set a = a + 1 where b = 3; +select * from update_ao_table; + a | b +---+--- + 1 | 1 + 2 | 2 + 4 | 4 + 5 | 5 + 4 | 3 +(5 rows) + +-- Update aoco table distribution key +create table update_aoco_table (a int, b int) WITH (appendonly=true, orientation=column); +insert into update_aoco_table select g,g from generate_series(1, 5) g; +select * from update_aoco_table; + a | b +---+--- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 +(5 rows) + +update update_aoco_table set a = a + 1 where b = 3; +select * from update_aoco_table; + a | b +---+--- + 1 | 1 + 2 | 2 + 4 | 4 + 5 | 5 + 4 | 3 +(5 rows) + +-- Update prepare +delete from s; +insert into s select generate_series(1, 5), generate_series(1, 5); +select * from r; + a | b +---+---- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 +(5 rows) + +select * from s; + a | b +---+--- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 +(5 rows) + +prepare update_s(int) as update s set a = s.a + $1 where exists (select 1 from r where s.a = r.b); +execute update_s(10); +select * from s; + a | b +----+--- + 1 | 1 + 3 | 3 + 5 | 5 + 12 | 2 + 14 | 4 +(5 rows) + +-- Confirm that a split update is not created for a table excluded by +-- constraints in the planner. +create table nosplitupdate (a int); +explain update nosplitupdate set a=0 where a=1 and a<1; + QUERY PLAN +----------------------------------------------------------- + Update on nosplitupdate (cost=0.00..0.00 rows=0 width=0) + -> Result (cost=0.00..0.00 rows=0 width=14) + One-Time Filter: false + Optimizer: Postgres query optimizer +(4 rows) + +-- test split-update when split-node's flow is entry +create table tsplit_entry (c int); +insert into tsplit_entry values (1), (2); +analyze tsplit_entry; +-- start_ignore +-- gp_segment_configuration scan is different when using different FTS +explain update tsplit_entry set c = s.a from (select count(*) as a from gp_segment_configuration) s; + QUERY PLAN +------------------------------------------------------------------------------------------------------ + Update on tsplit_entry (cost=10000000001.01..10000000002.09 rows=0 width=0) + -> Nested Loop (cost=10000000001.01..10000000002.09 rows=3 width=46) + -> Seq Scan on tsplit_entry (cost=0.00..1.02 rows=2 width=10) + -> Materialize (cost=1.01..1.04 rows=1 width=40) + -> Subquery Scan on s (cost=1.01..1.03 rows=1 width=40) + -> Aggregate (cost=1.01..1.02 rows=1 width=8) + -> Seq Scan on gp_segment_configuration (cost=0.00..1.01 rows=1 width=0) + Optimizer: Postgres query optimizer +(8 rows) + +-- end_ignore +update tsplit_entry set c = s.a from (select count(*) as a from gp_segment_configuration) s; +CREATE TABLE update_gp_foo ( + a_dist int, + b int, + c_part int, + d int +) +WITH (appendonly=false) PARTITION BY RANGE(c_part) + ( + PARTITION p20190305 START (1) END (2) WITH (tablename='update_gp_foo_1_prt_p20190305', appendonly=false) + ); +CREATE TABLE update_gp_foo1 ( + a_dist int, + b int, + c_part int, + d int +) +WITH (appendonly=false) PARTITION BY RANGE(c_part) + ( + PARTITION p20190305 START (1) END (2) WITH (tablename='update_gp_foo1_1_prt_p20190305', appendonly=false) + ); +INSERT INTO update_gp_foo VALUES (12, 40, 1, 50); +INSERT INTO update_gp_foo1 VALUES (12, 3, 1, 50); +UPDATE update_gp_foo +SET b = update_gp_foo.c_part, + d = update_gp_foo1.a_dist +FROM update_gp_foo1; +SELECT * from update_gp_foo; + a_dist | b | c_part | d +--------+---+--------+---- + 12 | 1 | 1 | 12 +(1 row) + +-- Test insert on conflict do update +-- Insert on conflict do update is an insert statement but might +-- invoke ExecUpdate on segments, but updating distkeys of a table +-- may lead to wrong data distribution. We will check this before +-- planning, if a `insert on conflict do update` statement set the +-- dist keys of the table, it will raise an error. +-- See github issue: https://github.com/greenplum-db/gpdb/issues/9444 +create table t_insert_on_conflict_update_distkey(a int, b int); +create unique index uidx_t_insert_on_conflict_update_distkey on t_insert_on_conflict_update_distkey(a, b); +-- the following statement should error out because the on conflict update want to +-- modify the tuple's distkey which might lead to wrong data distribution +insert into t_insert_on_conflict_update_distkey values (1, 1) on conflict(a, b) do update set a = 1; +drop index uidx_t_insert_on_conflict_update_distkey; +drop table t_insert_on_conflict_update_distkey; +-- randomly distributed table cannot add unique constrain, so next we test replicated table +create table t_insert_on_conflict_update_distkey(a int, b int); +create unique index uidx_t_insert_on_conflict_update_distkey on t_insert_on_conflict_update_distkey(a, b); +-- the following statement should succeed because replicated table does not contain distkey +insert into t_insert_on_conflict_update_distkey values (1, 1) on conflict(a, b) do update set a = 1; +-- Some tests on a partitioned table. +CREATE TABLE update_gp_rangep (a int, b int, orig_a int) PARTITION BY RANGE (a); +CREATE TABLE update_gp_rangep_1_to_10 PARTITION OF update_gp_rangep FOR VALUES FROM (1) TO (10); +CREATE TABLE update_gp_rangep_10_to_20 PARTITION OF update_gp_rangep FOR VALUES FROM (10) TO (20); +INSERT INTO update_gp_rangep SELECT g, g, g FROM generate_series(1, 4) g; +-- Simple case: Same partition, same node. +UPDATE update_gp_rangep SET a = 9 WHERE a = 1; +-- Distribution key update, same partition. +UPDATE update_gp_rangep SET b = 1 WHERE a = 2; +-- Move row to different partition, but no change in distribution key +UPDATE update_gp_rangep SET a = 10 WHERE a = 3; +-- Move row to different partition and also change distribution key +UPDATE update_gp_rangep SET a = 11, b = 1 WHERE a = 4; +SELECT tableoid::regclass, * FROM update_gp_rangep ORDER BY orig_a; + tableoid | a | b | orig_a +---------------------------+----+---+-------- + update_gp_rangep_1_to_10 | 9 | 1 | 1 + update_gp_rangep_1_to_10 | 2 | 1 | 2 + update_gp_rangep_10_to_20 | 10 | 3 | 3 + update_gp_rangep_10_to_20 | 11 | 1 | 4 +(4 rows) + +-- Also do a lookup with specific distribution key. If the rows were not +-- correctly moved across segments, this would fail to find them, assuming +-- that direct dispatch is effective. +SELECT tableoid::regclass, * FROM update_gp_rangep WHERE b = 1; + tableoid | a | b | orig_a +---------------------------+----+---+-------- + update_gp_rangep_1_to_10 | 9 | 1 | 1 + update_gp_rangep_1_to_10 | 2 | 1 | 2 + update_gp_rangep_10_to_20 | 11 | 1 | 4 +(3 rows) + +-- start_ignore +drop table r; +drop table s; +drop table update_dist; +drop table update_ao_table; +drop table update_aoco_table; +drop table nosplitupdate; +drop table tsplit_entry; +-- end_ignore diff --git a/src/test/singlenode_regress/expected/uuid.out b/src/test/singlenode_regress/expected/uuid.out new file mode 100644 index 00000000000..090103df48a --- /dev/null +++ b/src/test/singlenode_regress/expected/uuid.out @@ -0,0 +1,159 @@ +-- regression test for the uuid datatype +-- creating test tables +CREATE TABLE guid1 +( + guid_field UUID, + text_field TEXT DEFAULT(now()) +); +CREATE TABLE guid2 +( + guid_field UUID, + text_field TEXT DEFAULT(now()) +); +-- inserting invalid data tests +-- too long +INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111F'); +ERROR: invalid input syntax for type uuid: "11111111-1111-1111-1111-111111111111F" +LINE 1: INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-111... + ^ +-- too short +INSERT INTO guid1(guid_field) VALUES('{11111111-1111-1111-1111-11111111111}'); +ERROR: invalid input syntax for type uuid: "{11111111-1111-1111-1111-11111111111}" +LINE 1: INSERT INTO guid1(guid_field) VALUES('{11111111-1111-1111-11... + ^ +-- valid data but invalid format +INSERT INTO guid1(guid_field) VALUES('111-11111-1111-1111-1111-111111111111'); +ERROR: invalid input syntax for type uuid: "111-11111-1111-1111-1111-111111111111" +LINE 1: INSERT INTO guid1(guid_field) VALUES('111-11111-1111-1111-11... + ^ +INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222 '); +ERROR: invalid input syntax for type uuid: "{22222222-2222-2222-2222-222222222222 " +LINE 1: INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-22... + ^ +-- invalid data +INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-G111-111111111111'); +ERROR: invalid input syntax for type uuid: "11111111-1111-1111-G111-111111111111" +LINE 1: INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-G11... + ^ +INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-1111-111111111111'); +ERROR: invalid input syntax for type uuid: "11+11111-1111-1111-1111-111111111111" +LINE 1: INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-111... + ^ +--inserting three input formats +INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111'); +INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}'); +INSERT INTO guid1(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e'); +-- retrieving the inserted data +SELECT guid_field FROM guid1; + guid_field +-------------------------------------- + 11111111-1111-1111-1111-111111111111 + 22222222-2222-2222-2222-222222222222 + 3f3e3c3b-3a30-3938-3736-353433a2313e +(3 rows) + +-- ordering test +SELECT guid_field FROM guid1 ORDER BY guid_field ASC; + guid_field +-------------------------------------- + 11111111-1111-1111-1111-111111111111 + 22222222-2222-2222-2222-222222222222 + 3f3e3c3b-3a30-3938-3736-353433a2313e +(3 rows) + +SELECT guid_field FROM guid1 ORDER BY guid_field DESC; + guid_field +-------------------------------------- + 3f3e3c3b-3a30-3938-3736-353433a2313e + 22222222-2222-2222-2222-222222222222 + 11111111-1111-1111-1111-111111111111 +(3 rows) + +-- = operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field = '3f3e3c3b-3a30-3938-3736-353433a2313e'; + count +------- + 1 +(1 row) + +-- <> operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field <> '11111111111111111111111111111111'; + count +------- + 2 +(1 row) + +-- < operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field < '22222222-2222-2222-2222-222222222222'; + count +------- + 1 +(1 row) + +-- <= operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field <= '22222222-2222-2222-2222-222222222222'; + count +------- + 2 +(1 row) + +-- > operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field > '22222222-2222-2222-2222-222222222222'; + count +------- + 1 +(1 row) + +-- >= operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field >= '22222222-2222-2222-2222-222222222222'; + count +------- + 2 +(1 row) + +-- btree and hash index creation test +CREATE INDEX guid1_btree ON guid1 USING BTREE (guid_field); +CREATE INDEX guid1_hash ON guid1 USING HASH (guid_field); +-- unique index test +CREATE UNIQUE INDEX guid1_unique_BTREE ON guid1 USING BTREE (guid_field); +-- should fail +INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111'); +ERROR: duplicate key value violates unique constraint "guid1_unique_btree" +DETAIL: Key (guid_field)=(11111111-1111-1111-1111-111111111111) already exists. +-- check to see whether the new indexes are actually there +SELECT count(*) FROM pg_class WHERE relkind='i' AND relname LIKE 'guid%'; + count +------- + 3 +(1 row) + +-- populating the test tables with additional records +INSERT INTO guid1(guid_field) VALUES('44444444-4444-4444-4444-444444444444'); +INSERT INTO guid2(guid_field) VALUES('11111111-1111-1111-1111-111111111111'); +INSERT INTO guid2(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}'); +INSERT INTO guid2(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e'); +-- join test +SELECT COUNT(*) FROM guid1 g1 INNER JOIN guid2 g2 ON g1.guid_field = g2.guid_field; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM guid1 g1 LEFT JOIN guid2 g2 ON g1.guid_field = g2.guid_field WHERE g2.guid_field IS NULL; + count +------- + 1 +(1 row) + +-- generation test +TRUNCATE guid1; +INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid()); +INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid()); +SELECT count(DISTINCT guid_field) FROM guid1; + count +------- + 2 +(1 row) + +-- clean up +DROP TABLE guid1, guid2 CASCADE; diff --git a/src/test/singlenode_regress/expected/vacuum.out b/src/test/singlenode_regress/expected/vacuum.out new file mode 100644 index 00000000000..112fb548078 --- /dev/null +++ b/src/test/singlenode_regress/expected/vacuum.out @@ -0,0 +1,417 @@ +-- +-- VACUUM +-- +CREATE TABLE vactst (i INT); +INSERT INTO vactst VALUES (1); +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst VALUES (0); +SELECT count(*) FROM vactst; + count +------- + 2049 +(1 row) + +DELETE FROM vactst WHERE i != 0; +SELECT * FROM vactst; + i +--- + 0 +(1 row) + +VACUUM FULL vactst; +UPDATE vactst SET i = i + 1; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst VALUES (0); +SELECT count(*) FROM vactst; + count +------- + 2049 +(1 row) + +DELETE FROM vactst WHERE i != 0; +VACUUM (FULL) vactst; +DELETE FROM vactst; +SELECT * FROM vactst; + i +--- +(0 rows) + +VACUUM (FULL, FREEZE) vactst; +VACUUM (ANALYZE, FULL) vactst; +CREATE TABLE vaccluster (i INT PRIMARY KEY); +ALTER TABLE vaccluster CLUSTER ON vaccluster_pkey; +CLUSTER vaccluster; +CREATE FUNCTION do_analyze() RETURNS VOID VOLATILE LANGUAGE SQL + AS 'ANALYZE pg_am'; +CREATE FUNCTION wrap_do_analyze(c INT) RETURNS INT IMMUTABLE LANGUAGE SQL + AS 'SELECT $1 FROM do_analyze()'; +CREATE INDEX ON vaccluster(wrap_do_analyze(i)); +INSERT INTO vaccluster VALUES (1), (2); +ANALYZE vaccluster; +ERROR: ANALYZE cannot be executed from VACUUM or ANALYZE +CONTEXT: SQL function "do_analyze" statement 1 +SQL function "wrap_do_analyze" statement 1 +-- Test ANALYZE in transaction, where the transaction surrounding +-- analyze performed modifications. This tests for the bug at +-- https://postgr.es/m/c7988239-d42c-ddc4-41db-171b23b35e4f%40ssinger.info +-- (which hopefully is unlikely to be reintroduced), but also seems +-- independently worthwhile to cover. +INSERT INTO vactst SELECT generate_series(1, 300); +DELETE FROM vactst WHERE i % 7 = 0; -- delete a few rows outside +BEGIN; +INSERT INTO vactst SELECT generate_series(301, 400); +DELETE FROM vactst WHERE i % 5 <> 0; -- delete a few rows inside +ANALYZE vactst; +COMMIT; +VACUUM FULL pg_am; +VACUUM FULL pg_class; +VACUUM FULL pg_database; +VACUUM FULL vaccluster; +ERROR: ANALYZE cannot be executed from VACUUM or ANALYZE +CONTEXT: SQL function "do_analyze" statement 1 +SQL function "wrap_do_analyze" statement 1 +VACUUM FULL vactst; +VACUUM (DISABLE_PAGE_SKIPPING) vaccluster; +-- PARALLEL option +CREATE TABLE pvactst (i INT, a INT[], p POINT) with (autovacuum_enabled = off); +INSERT INTO pvactst SELECT i, array[1,2,3], point(i, i+1) FROM generate_series(1,1000) i; +CREATE INDEX btree_pvactst ON pvactst USING btree (i); +CREATE INDEX hash_pvactst ON pvactst USING hash (i); +CREATE INDEX brin_pvactst ON pvactst USING brin (i); +CREATE INDEX gin_pvactst ON pvactst USING gin (a); +CREATE INDEX gist_pvactst ON pvactst USING gist (p); +CREATE INDEX spgist_pvactst ON pvactst USING spgist (p); +-- VACUUM invokes parallel index cleanup +SET min_parallel_index_scan_size to 0; +VACUUM (PARALLEL 2) pvactst; +WARNING: disabling parallel option of vacuum on "pvactst" --- cannot vacuum tables in parallel +-- VACUUM invokes parallel bulk-deletion +UPDATE pvactst SET i = i WHERE i < 1000; +VACUUM (PARALLEL 2) pvactst; +WARNING: disabling parallel option of vacuum on "pvactst" --- cannot vacuum tables in parallel +UPDATE pvactst SET i = i WHERE i < 1000; +VACUUM (PARALLEL 0) pvactst; -- disable parallel vacuum +VACUUM (PARALLEL -1) pvactst; -- error +ERROR: parallel workers for vacuum must be between 0 and 1024 +LINE 1: VACUUM (PARALLEL -1) pvactst; + ^ +VACUUM (PARALLEL 2, INDEX_CLEANUP FALSE) pvactst; +VACUUM (PARALLEL 2, FULL TRUE) pvactst; -- error, cannot use both PARALLEL and FULL +ERROR: VACUUM FULL cannot be performed in parallel +VACUUM (PARALLEL) pvactst; -- error, cannot use PARALLEL option without parallel degree +ERROR: parallel option requires a value between 0 and 1024 +LINE 1: VACUUM (PARALLEL) pvactst; + ^ +-- Test different combinations of parallel and full options for temporary tables +CREATE TEMPORARY TABLE tmp (a int PRIMARY KEY); +CREATE INDEX tmp_idx1 ON tmp (a); +VACUUM (PARALLEL 1, FULL FALSE) tmp; -- parallel vacuum disabled for temp tables +WARNING: disabling parallel option of vacuum on "tmp" --- cannot vacuum tables in parallel +VACUUM (PARALLEL 0, FULL TRUE) tmp; -- can specify parallel disabled (even though that's implied by FULL) +RESET min_parallel_index_scan_size; +DROP TABLE pvactst; +-- INDEX_CLEANUP option +CREATE TABLE no_index_cleanup (i INT PRIMARY KEY, t TEXT); +-- Use uncompressed data stored in toast. +CREATE INDEX no_index_cleanup_idx ON no_index_cleanup(t); +ALTER TABLE no_index_cleanup ALTER COLUMN t SET STORAGE EXTERNAL; +INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(1,30), + repeat('1234567890',269)); +-- index cleanup option is ignored if VACUUM FULL +VACUUM (INDEX_CLEANUP TRUE, FULL TRUE) no_index_cleanup; +VACUUM (FULL TRUE) no_index_cleanup; +-- Toast inherits the value from its parent table. +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = false); +DELETE FROM no_index_cleanup WHERE i < 15; +-- Nothing is cleaned up. +VACUUM no_index_cleanup; +-- Both parent relation and toast are cleaned up. +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = true); +VACUUM no_index_cleanup; +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = auto); +VACUUM no_index_cleanup; +-- Parameter is set for both the parent table and its toast relation. +INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(31,60), + repeat('1234567890',269)); +DELETE FROM no_index_cleanup WHERE i < 45; +-- Only toast index is cleaned up. +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = off, + toast.vacuum_index_cleanup = yes); +VACUUM no_index_cleanup; +-- Only parent is cleaned up. +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = true, + toast.vacuum_index_cleanup = false); +VACUUM no_index_cleanup; +-- Test some extra relations. +VACUUM (INDEX_CLEANUP FALSE) vaccluster; +VACUUM (INDEX_CLEANUP AUTO) vactst; -- index cleanup option is ignored if no indexes +VACUUM (INDEX_CLEANUP FALSE, FREEZE TRUE) vaccluster; +-- TRUNCATE option +CREATE TEMP TABLE vac_truncate_test(i INT NOT NULL, j text) + WITH (vacuum_truncate=true, autovacuum_enabled=false); +INSERT INTO vac_truncate_test VALUES (1, NULL), (NULL, NULL); +ERROR: null value in column "i" of relation "vac_truncate_test" violates not-null constraint +DETAIL: Failing row contains (null, null). +VACUUM (TRUNCATE FALSE, DISABLE_PAGE_SKIPPING) vac_truncate_test; +SELECT pg_relation_size('vac_truncate_test') > 0; + ?column? +---------- + t +(1 row) + +VACUUM (DISABLE_PAGE_SKIPPING) vac_truncate_test; +SELECT pg_relation_size('vac_truncate_test') = 0; + ?column? +---------- + t +(1 row) + +VACUUM (TRUNCATE FALSE, FULL TRUE) vac_truncate_test; +DROP TABLE vac_truncate_test; +-- partitioned table +CREATE TABLE vacparted (a int, b char) PARTITION BY LIST (a); +CREATE TABLE vacparted1 PARTITION OF vacparted FOR VALUES IN (1); +INSERT INTO vacparted VALUES (1, 'a'); +UPDATE vacparted SET b = 'b'; +VACUUM (ANALYZE) vacparted; +VACUUM (FULL) vacparted; +VACUUM (FREEZE) vacparted; +-- check behavior with duplicate column mentions +VACUUM ANALYZE vacparted(a,b,a); +ERROR: column "a" of relation "vacparted1" appears more than once +ANALYZE vacparted(a,b,b); +ERROR: column "b" of relation "vacparted1" appears more than once +-- partitioned table with index +CREATE TABLE vacparted_i (a int primary key, b varchar(100)) + PARTITION BY HASH (a); +CREATE TABLE vacparted_i1 PARTITION OF vacparted_i + FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE vacparted_i2 PARTITION OF vacparted_i + FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO vacparted_i SELECT i, 'test_'|| i from generate_series(1,10) i; +VACUUM (ANALYZE) vacparted_i; +VACUUM (FULL) vacparted_i; +VACUUM (FREEZE) vacparted_i; +SELECT relname, relhasindex FROM pg_class + WHERE relname LIKE 'vacparted_i%' AND relkind IN ('p','r') + ORDER BY relname; + relname | relhasindex +--------------+------------- + vacparted_i | t + vacparted_i1 | t + vacparted_i2 | t +(3 rows) + +DROP TABLE vacparted_i; +-- multiple tables specified +VACUUM vaccluster, vactst; +VACUUM vacparted, does_not_exist; +ERROR: relation "does_not_exist" does not exist +VACUUM (FREEZE) vacparted, vaccluster, vactst; +VACUUM (FREEZE) does_not_exist, vaccluster; +ERROR: relation "does_not_exist" does not exist +VACUUM ANALYZE vactst, vacparted (a); +VACUUM ANALYZE vactst (does_not_exist), vacparted (b); +ERROR: column "does_not_exist" of relation "vactst" does not exist +VACUUM FULL vacparted, vactst; +VACUUM FULL vactst, vacparted (a, b), vaccluster (i); +ERROR: ANALYZE option must be specified when a column list is provided +ANALYZE vactst, vacparted; +ANALYZE vacparted (b), vactst; +ANALYZE vactst, does_not_exist, vacparted; +ERROR: relation "does_not_exist" does not exist +ANALYZE vactst (i), vacparted (does_not_exist); +ERROR: column "does_not_exist" of relation "vacparted1" does not exist +ANALYZE vactst, vactst; +BEGIN; -- ANALYZE behaves differently inside a transaction block +ANALYZE vactst, vactst; +COMMIT; +-- parenthesized syntax for ANALYZE +ANALYZE (VERBOSE) does_not_exist; +ERROR: relation "does_not_exist" does not exist +ANALYZE (nonexistent-arg) does_not_exist; +ERROR: syntax error at or near "arg" +LINE 1: ANALYZE (nonexistent-arg) does_not_exist; + ^ +ANALYZE (nonexistentarg) does_not_exit; +ERROR: unrecognized ANALYZE option "nonexistentarg" +LINE 1: ANALYZE (nonexistentarg) does_not_exit; + ^ +-- ensure argument order independence, and that SKIP_LOCKED on non-existing +-- relation still errors out. Suppress WARNING messages caused by concurrent +-- autovacuums. +SET client_min_messages TO 'ERROR'; +ANALYZE (SKIP_LOCKED, VERBOSE) does_not_exist; +ERROR: relation "does_not_exist" does not exist +ANALYZE (VERBOSE, SKIP_LOCKED) does_not_exist; +ERROR: relation "does_not_exist" does not exist +-- SKIP_LOCKED option +VACUUM (SKIP_LOCKED) vactst; +VACUUM (SKIP_LOCKED, FULL) vactst; +ANALYZE (SKIP_LOCKED) vactst; +RESET client_min_messages; +-- ensure VACUUM and ANALYZE don't have a problem with serializable +SET default_transaction_isolation = serializable; +VACUUM vactst; +ANALYZE vactst; +RESET default_transaction_isolation; +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +ANALYZE vactst; +COMMIT; +-- PROCESS_TOAST option +ALTER TABLE vactst ADD COLUMN t TEXT; +ALTER TABLE vactst ALTER COLUMN t SET STORAGE EXTERNAL; +VACUUM (PROCESS_TOAST FALSE) vactst; +VACUUM (PROCESS_TOAST FALSE, FULL) vactst; +ERROR: PROCESS_TOAST required with VACUUM FULL +DROP TABLE vaccluster; +DROP TABLE vactst; +DROP TABLE vacparted; +DROP TABLE no_index_cleanup; +-- relation ownership, WARNING logs generated as all are skipped. +CREATE TABLE vacowned (a int); +CREATE TABLE vacowned_parted (a int) PARTITION BY LIST (a); +CREATE TABLE vacowned_part1 PARTITION OF vacowned_parted FOR VALUES IN (1); +CREATE TABLE vacowned_part2 PARTITION OF vacowned_parted FOR VALUES IN (2); +CREATE ROLE regress_vacuum; +SET ROLE regress_vacuum; +-- Simple table +VACUUM vacowned; +WARNING: skipping "vacowned" --- only table or database owner can vacuum it +ANALYZE vacowned; +WARNING: skipping "vacowned" --- only table or database owner can analyze it +VACUUM (ANALYZE) vacowned; +WARNING: skipping "vacowned" --- only table or database owner can vacuum it +-- Catalog +VACUUM pg_catalog.pg_class; +WARNING: skipping "pg_class" --- only superuser or database owner can vacuum it +ANALYZE pg_catalog.pg_class; +WARNING: skipping "pg_class" --- only superuser or database owner can analyze it +VACUUM (ANALYZE) pg_catalog.pg_class; +WARNING: skipping "pg_class" --- only superuser or database owner can vacuum it +-- Shared catalog +VACUUM pg_catalog.pg_authid; +WARNING: skipping "pg_authid" --- only superuser can vacuum it +ANALYZE pg_catalog.pg_authid; +WARNING: skipping "pg_authid" --- only superuser can analyze it +VACUUM (ANALYZE) pg_catalog.pg_authid; +WARNING: skipping "pg_authid" --- only superuser can vacuum it +-- Partitioned table and its partitions, nothing owned by other user. +-- Relations are not listed in a single command to test ownership +-- independently. +VACUUM vacowned_parted; +WARNING: skipping "vacowned_parted" --- only table or database owner can vacuum it +WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +VACUUM vacowned_part1; +WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it +VACUUM vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +ANALYZE vacowned_parted; +WARNING: skipping "vacowned_parted" --- only table or database owner can analyze it +WARNING: skipping "vacowned_part1" --- only table or database owner can analyze it +WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it +ANALYZE vacowned_part1; +WARNING: skipping "vacowned_part1" --- only table or database owner can analyze it +ANALYZE vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it +VACUUM (ANALYZE) vacowned_parted; +WARNING: skipping "vacowned_parted" --- only table or database owner can vacuum it +WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +VACUUM (ANALYZE) vacowned_part1; +WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it +VACUUM (ANALYZE) vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +RESET ROLE; +-- Partitioned table and one partition owned by other user. +ALTER TABLE vacowned_parted OWNER TO regress_vacuum; +ALTER TABLE vacowned_part1 OWNER TO regress_vacuum; +SET ROLE regress_vacuum; +VACUUM vacowned_parted; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +VACUUM vacowned_part1; +VACUUM vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +ANALYZE vacowned_parted; +WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it +ANALYZE vacowned_part1; +ANALYZE vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it +VACUUM (ANALYZE) vacowned_parted; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +VACUUM (ANALYZE) vacowned_part1; +VACUUM (ANALYZE) vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +RESET ROLE; +-- Only one partition owned by other user. +ALTER TABLE vacowned_parted OWNER TO CURRENT_USER; +SET ROLE regress_vacuum; +VACUUM vacowned_parted; +WARNING: skipping "vacowned_parted" --- only table or database owner can vacuum it +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +VACUUM vacowned_part1; +VACUUM vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +ANALYZE vacowned_parted; +WARNING: skipping "vacowned_parted" --- only table or database owner can analyze it +WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it +ANALYZE vacowned_part1; +ANALYZE vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it +VACUUM (ANALYZE) vacowned_parted; +WARNING: skipping "vacowned_parted" --- only table or database owner can vacuum it +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +VACUUM (ANALYZE) vacowned_part1; +VACUUM (ANALYZE) vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +RESET ROLE; +-- Only partitioned table owned by other user. +ALTER TABLE vacowned_parted OWNER TO regress_vacuum; +ALTER TABLE vacowned_part1 OWNER TO CURRENT_USER; +SET ROLE regress_vacuum; +VACUUM vacowned_parted; +WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +VACUUM vacowned_part1; +WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it +VACUUM vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +ANALYZE vacowned_parted; +WARNING: skipping "vacowned_part1" --- only table or database owner can analyze it +WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it +ANALYZE vacowned_part1; +WARNING: skipping "vacowned_part1" --- only table or database owner can analyze it +ANALYZE vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it +VACUUM (ANALYZE) vacowned_parted; +WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +VACUUM (ANALYZE) vacowned_part1; +WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it +VACUUM (ANALYZE) vacowned_part2; +WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it +RESET ROLE; +DROP TABLE vacowned; +DROP TABLE vacowned_parted; +DROP ROLE regress_vacuum; diff --git a/src/test/singlenode_regress/expected/vacuum_parallel.out b/src/test/singlenode_regress/expected/vacuum_parallel.out new file mode 100644 index 00000000000..2f5c4117cc3 --- /dev/null +++ b/src/test/singlenode_regress/expected/vacuum_parallel.out @@ -0,0 +1,50 @@ +SET max_parallel_maintenance_workers TO 4; +SET min_parallel_index_scan_size TO '128kB'; +-- Bug #17245: Make sure that we don't totally fail to VACUUM individual indexes that +-- happen to be below min_parallel_index_scan_size during parallel VACUUM: +CREATE TABLE parallel_vacuum_table (a int) WITH (autovacuum_enabled = off); +INSERT INTO parallel_vacuum_table SELECT i from generate_series(1, 10000) i; +-- Parallel VACUUM will never be used unless there are at least two indexes +-- that exceed min_parallel_index_scan_size. Create two such indexes, and +-- a third index that is smaller than min_parallel_index_scan_size. +CREATE INDEX regular_sized_index ON parallel_vacuum_table(a); +CREATE INDEX typically_sized_index ON parallel_vacuum_table(a); +-- Note: vacuum_in_leader_small_index can apply deduplication, making it ~3x +-- smaller than the other indexes +CREATE INDEX vacuum_in_leader_small_index ON parallel_vacuum_table((1)); +-- Verify (as best we can) that the cost model for parallel VACUUM +-- will make our VACUUM run in parallel, while always leaving it up to the +-- parallel leader to handle the vacuum_in_leader_small_index index: +SELECT EXISTS ( +SELECT 1 +FROM pg_class +WHERE oid = 'vacuum_in_leader_small_index'::regclass AND + pg_relation_size(oid) < + pg_size_bytes(current_setting('min_parallel_index_scan_size')) +) as leader_will_handle_small_index; + leader_will_handle_small_index +-------------------------------- + f +(1 row) + +SELECT count(*) as trigger_parallel_vacuum_nindexes +FROM pg_class +WHERE oid in ('regular_sized_index'::regclass, 'typically_sized_index'::regclass) AND + pg_relation_size(oid) >= + pg_size_bytes(current_setting('min_parallel_index_scan_size')); + trigger_parallel_vacuum_nindexes +---------------------------------- + 2 +(1 row) + +-- Parallel VACUUM with B-Tree page deletions, ambulkdelete calls: +DELETE FROM parallel_vacuum_table; +VACUUM (PARALLEL 4, INDEX_CLEANUP ON) parallel_vacuum_table; +WARNING: disabling parallel option of vacuum on "parallel_vacuum_table" --- cannot vacuum tables in parallel +-- Since vacuum_in_leader_small_index uses deduplication, we expect an +-- assertion failure with bug #17245 (in the absence of bugfix): +INSERT INTO parallel_vacuum_table SELECT i FROM generate_series(1, 10000) i; +RESET max_parallel_maintenance_workers; +RESET min_parallel_index_scan_size; +-- Deliberately don't drop table, to get further coverage from tools like +-- pg_amcheck in some testing scenarios diff --git a/src/test/singlenode_regress/expected/vacuum_stats.out b/src/test/singlenode_regress/expected/vacuum_stats.out new file mode 100644 index 00000000000..d46065eeba6 --- /dev/null +++ b/src/test/singlenode_regress/expected/vacuum_stats.out @@ -0,0 +1,31 @@ +CREATE TABLE vacstat_test (a int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +INSERT INTO vacstat_test SELECT i FROM generate_series(1,10) i ; +VACUUM vacstat_test; +-- Confirm that VACUUM has updated stats from all nodes +SELECT true FROM pg_class WHERE oid='vacstat_test'::regclass +AND relpages > 0 +AND reltuples > 0 +AND relallvisible > 0; + bool +------ + t +(1 row) + +SELECT true FROM pg_class WHERE oid='vacstat_test'::regclass +AND relpages = + (SELECT SUM(relpages) FROM gp_dist_random('pg_class') + WHERE oid='vacstat_test'::regclass) +AND reltuples = + (SELECT SUM(reltuples) FROM gp_dist_random('pg_class') + WHERE oid='vacstat_test'::regclass) +AND relallvisible = + (SELECT SUM(relallvisible) FROM gp_dist_random('pg_class') + WHERE oid='vacstat_test'::regclass); + bool +------ + t +(1 row) + +DROP TABLE vacstat_test diff --git a/src/test/singlenode_regress/expected/varchar.out b/src/test/singlenode_regress/expected/varchar.out new file mode 100644 index 00000000000..da23ae810bf --- /dev/null +++ b/src/test/singlenode_regress/expected/varchar.out @@ -0,0 +1,111 @@ +-- +-- VARCHAR +-- +CREATE TABLE VARCHAR_TBL(f1 varchar(1)); +INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('A'); +-- any of the following three input formats are acceptable +INSERT INTO VARCHAR_TBL (f1) VALUES ('1'); +INSERT INTO VARCHAR_TBL (f1) VALUES (2); +INSERT INTO VARCHAR_TBL (f1) VALUES ('3'); +-- zero-length char +INSERT INTO VARCHAR_TBL (f1) VALUES (''); +-- try varchar's of greater than 1 length +INSERT INTO VARCHAR_TBL (f1) VALUES ('cd'); +ERROR: value too long for type character varying(1) +INSERT INTO VARCHAR_TBL (f1) VALUES ('c '); +SELECT * FROM VARCHAR_TBL; + f1 +---- + a + A + 1 + 2 + 3 + + c +(7 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 <> 'a'; + f1 +---- + A + 1 + 2 + 3 + + c +(6 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 = 'a'; + f1 +---- + a +(1 row) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 < 'a'; + f1 +---- + A + 1 + 2 + 3 + +(5 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 <= 'a'; + f1 +---- + a + A + 1 + 2 + 3 + +(6 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 > 'a'; + f1 +---- + c +(1 row) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 >= 'a'; + f1 +---- + a + c +(2 rows) + +DROP TABLE VARCHAR_TBL; +-- +-- Now test longer arrays of char +-- +CREATE TABLE VARCHAR_TBL(f1 varchar(4)); +INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('ab'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); +ERROR: value too long for type character varying(4) +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); +SELECT * FROM VARCHAR_TBL; + f1 +------ + a + ab + abcd + abcd +(4 rows) + diff --git a/src/test/singlenode_regress/expected/varchar_1.out b/src/test/singlenode_regress/expected/varchar_1.out new file mode 100644 index 00000000000..958f9c07e0a --- /dev/null +++ b/src/test/singlenode_regress/expected/varchar_1.out @@ -0,0 +1,111 @@ +-- +-- VARCHAR +-- +CREATE TABLE VARCHAR_TBL(f1 varchar(1)); +INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('A'); +-- any of the following three input formats are acceptable +INSERT INTO VARCHAR_TBL (f1) VALUES ('1'); +INSERT INTO VARCHAR_TBL (f1) VALUES (2); +INSERT INTO VARCHAR_TBL (f1) VALUES ('3'); +-- zero-length char +INSERT INTO VARCHAR_TBL (f1) VALUES (''); +-- try varchar's of greater than 1 length +INSERT INTO VARCHAR_TBL (f1) VALUES ('cd'); +ERROR: value too long for type character varying(1) +INSERT INTO VARCHAR_TBL (f1) VALUES ('c '); +SELECT * FROM VARCHAR_TBL; + f1 +---- + a + A + 1 + 2 + 3 + + c +(7 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 <> 'a'; + f1 +---- + A + 1 + 2 + 3 + + c +(6 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 = 'a'; + f1 +---- + a +(1 row) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 < 'a'; + f1 +---- + 1 + 2 + 3 + +(4 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 <= 'a'; + f1 +---- + a + 1 + 2 + 3 + +(5 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 > 'a'; + f1 +---- + A + c +(2 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 >= 'a'; + f1 +---- + a + A + c +(3 rows) + +DROP TABLE VARCHAR_TBL; +-- +-- Now test longer arrays of char +-- +CREATE TABLE VARCHAR_TBL(f1 varchar(4)); +INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('ab'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); +ERROR: value too long for type character varying(4) +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); +SELECT * FROM VARCHAR_TBL; + f1 +------ + a + ab + abcd + abcd +(4 rows) + diff --git a/src/test/singlenode_regress/expected/varchar_2.out b/src/test/singlenode_regress/expected/varchar_2.out new file mode 100644 index 00000000000..b1d412ca008 --- /dev/null +++ b/src/test/singlenode_regress/expected/varchar_2.out @@ -0,0 +1,111 @@ +-- +-- VARCHAR +-- +CREATE TABLE VARCHAR_TBL(f1 varchar(1)); +INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('A'); +-- any of the following three input formats are acceptable +INSERT INTO VARCHAR_TBL (f1) VALUES ('1'); +INSERT INTO VARCHAR_TBL (f1) VALUES (2); +INSERT INTO VARCHAR_TBL (f1) VALUES ('3'); +-- zero-length char +INSERT INTO VARCHAR_TBL (f1) VALUES (''); +-- try varchar's of greater than 1 length +INSERT INTO VARCHAR_TBL (f1) VALUES ('cd'); +ERROR: value too long for type character varying(1) +INSERT INTO VARCHAR_TBL (f1) VALUES ('c '); +SELECT * FROM VARCHAR_TBL; + f1 +---- + a + A + 1 + 2 + 3 + + c +(7 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 <> 'a'; + f1 +---- + A + 1 + 2 + 3 + + c +(6 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 = 'a'; + f1 +---- + a +(1 row) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 < 'a'; + f1 +---- + +(1 row) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 <= 'a'; + f1 +---- + a + +(2 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 > 'a'; + f1 +---- + A + 1 + 2 + 3 + c +(5 rows) + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 >= 'a'; + f1 +---- + a + A + 1 + 2 + 3 + c +(6 rows) + +DROP TABLE VARCHAR_TBL; +-- +-- Now test longer arrays of char +-- +CREATE TABLE VARCHAR_TBL(f1 varchar(4)); +INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('ab'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); +ERROR: value too long for type character varying(4) +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); +SELECT * FROM VARCHAR_TBL; + f1 +------ + a + ab + abcd + abcd +(4 rows) + diff --git a/src/test/singlenode_regress/expected/window.out b/src/test/singlenode_regress/expected/window.out new file mode 100644 index 00000000000..683b5e0e7f4 --- /dev/null +++ b/src/test/singlenode_regress/expected/window.out @@ -0,0 +1,4210 @@ +-- +-- WINDOW FUNCTIONS +-- +CREATE TEMPORARY TABLE empsalary ( + depname varchar, + empno bigint, + salary int, + enroll_date date +); +INSERT INTO empsalary VALUES +('develop', 10, 5200, '2007-08-01'), +('sales', 1, 5000, '2006-10-01'), +('personnel', 5, 3500, '2007-12-10'), +('sales', 4, 4800, '2007-08-08'), +('personnel', 2, 3900, '2006-12-23'), +('develop', 7, 4200, '2008-01-01'), +('develop', 9, 4500, '2008-01-01'), +('sales', 3, 4800, '2007-08-01'), +('develop', 8, 6000, '2006-10-01'), +('develop', 11, 5200, '2007-08-15'); +SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary ORDER BY depname, salary; + depname | empno | salary | sum +-----------+-------+--------+------- + develop | 7 | 4200 | 25100 + develop | 9 | 4500 | 25100 + develop | 11 | 5200 | 25100 + develop | 10 | 5200 | 25100 + develop | 8 | 6000 | 25100 + personnel | 5 | 3500 | 7400 + personnel | 2 | 3900 | 7400 + sales | 3 | 4800 | 14600 + sales | 4 | 4800 | 14600 + sales | 1 | 5000 | 14600 +(10 rows) + +SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary) FROM empsalary; + depname | empno | salary | rank +-----------+-------+--------+------ + develop | 7 | 4200 | 1 + develop | 9 | 4500 | 2 + develop | 11 | 5200 | 3 + develop | 10 | 5200 | 3 + develop | 8 | 6000 | 5 + personnel | 5 | 3500 | 1 + personnel | 2 | 3900 | 2 + sales | 3 | 4800 | 1 + sales | 4 | 4800 | 1 + sales | 1 | 5000 | 3 +(10 rows) + +-- with GROUP BY +SELECT four, ten, SUM(SUM(four)) OVER (PARTITION BY four), AVG(ten) FROM tenk1 +GROUP BY four, ten ORDER BY four, ten; + four | ten | sum | avg +------+-----+------+------------------------ + 0 | 0 | 0 | 0.00000000000000000000 + 0 | 2 | 0 | 2.0000000000000000 + 0 | 4 | 0 | 4.0000000000000000 + 0 | 6 | 0 | 6.0000000000000000 + 0 | 8 | 0 | 8.0000000000000000 + 1 | 1 | 2500 | 1.00000000000000000000 + 1 | 3 | 2500 | 3.0000000000000000 + 1 | 5 | 2500 | 5.0000000000000000 + 1 | 7 | 2500 | 7.0000000000000000 + 1 | 9 | 2500 | 9.0000000000000000 + 2 | 0 | 5000 | 0.00000000000000000000 + 2 | 2 | 5000 | 2.0000000000000000 + 2 | 4 | 5000 | 4.0000000000000000 + 2 | 6 | 5000 | 6.0000000000000000 + 2 | 8 | 5000 | 8.0000000000000000 + 3 | 1 | 7500 | 1.00000000000000000000 + 3 | 3 | 7500 | 3.0000000000000000 + 3 | 5 | 7500 | 5.0000000000000000 + 3 | 7 | 7500 | 7.0000000000000000 + 3 | 9 | 7500 | 9.0000000000000000 +(20 rows) + +SELECT depname, empno, salary, sum(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname); + depname | empno | salary | sum +-----------+-------+--------+------- + develop | 11 | 5200 | 25100 + develop | 7 | 4200 | 25100 + develop | 9 | 4500 | 25100 + develop | 8 | 6000 | 25100 + develop | 10 | 5200 | 25100 + personnel | 5 | 3500 | 7400 + personnel | 2 | 3900 | 7400 + sales | 3 | 4800 | 14600 + sales | 1 | 5000 | 14600 + sales | 4 | 4800 | 14600 +(10 rows) + +SELECT depname, empno, salary, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary) ORDER BY rank() OVER w; + depname | empno | salary | rank +-----------+-------+--------+------ + develop | 7 | 4200 | 1 + personnel | 5 | 3500 | 1 + sales | 3 | 4800 | 1 + sales | 4 | 4800 | 1 + personnel | 2 | 3900 | 2 + develop | 9 | 4500 | 2 + sales | 1 | 5000 | 3 + develop | 11 | 5200 | 3 + develop | 10 | 5200 | 3 + develop | 8 | 6000 | 5 +(10 rows) + +-- empty window specification +SELECT COUNT(*) OVER () FROM tenk1 WHERE unique2 < 10; + count +------- + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 +(10 rows) + +SELECT COUNT(*) OVER w FROM tenk1 WHERE unique2 < 10 WINDOW w AS (); + count +------- + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 +(10 rows) + +-- no window operation +SELECT four FROM tenk1 WHERE FALSE WINDOW w AS (PARTITION BY ten); + four +------ +(0 rows) + +-- cumulative aggregate +SELECT sum(four) OVER (PARTITION BY ten ORDER BY unique2) AS sum_1, ten, four FROM tenk1 WHERE unique2 < 10; + sum_1 | ten | four +-------+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 2 | 0 | 2 + 3 | 1 | 3 + 4 | 1 | 1 + 5 | 1 | 1 + 3 | 3 | 3 + 0 | 4 | 0 + 1 | 7 | 1 + 1 | 9 | 1 +(10 rows) + +SELECT row_number() OVER (ORDER BY unique2) FROM tenk1 WHERE unique2 < 10; + row_number +------------ + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +SELECT rank() OVER (PARTITION BY four ORDER BY ten) AS rank_1, ten, four FROM tenk1 WHERE unique2 < 10; + rank_1 | ten | four +--------+-----+------ + 1 | 0 | 0 + 1 | 0 | 0 + 3 | 4 | 0 + 1 | 1 | 1 + 1 | 1 | 1 + 3 | 7 | 1 + 4 | 9 | 1 + 1 | 0 | 2 + 1 | 1 | 3 + 2 | 3 | 3 +(10 rows) + +SELECT dense_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + dense_rank | ten | four +------------+-----+------ + 1 | 0 | 0 + 1 | 0 | 0 + 2 | 4 | 0 + 1 | 1 | 1 + 1 | 1 | 1 + 2 | 7 | 1 + 3 | 9 | 1 + 1 | 0 | 2 + 1 | 1 | 3 + 2 | 3 | 3 +(10 rows) + +SELECT percent_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + percent_rank | ten | four +--------------------+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 1 | 4 | 0 + 0 | 1 | 1 + 0 | 1 | 1 + 0.6666666666666666 | 7 | 1 + 1 | 9 | 1 + 0 | 0 | 2 + 0 | 1 | 3 + 1 | 3 | 3 +(10 rows) + +SELECT cume_dist() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + cume_dist | ten | four +--------------------+-----+------ + 0.6666666666666666 | 0 | 0 + 0.6666666666666666 | 0 | 0 + 1 | 4 | 0 + 0.5 | 1 | 1 + 0.5 | 1 | 1 + 0.75 | 7 | 1 + 1 | 9 | 1 + 1 | 0 | 2 + 0.5 | 1 | 3 + 1 | 3 | 3 +(10 rows) + +SELECT ntile(3) OVER (ORDER BY ten, four), ten, four FROM tenk1 WHERE unique2 < 10; + ntile | ten | four +-------+-----+------ + 1 | 0 | 0 + 1 | 0 | 0 + 1 | 0 | 2 + 1 | 1 | 1 + 2 | 1 | 1 + 2 | 1 | 3 + 2 | 3 | 3 + 3 | 4 | 0 + 3 | 7 | 1 + 3 | 9 | 1 +(10 rows) + +SELECT ntile(NULL) OVER (ORDER BY ten, four), ten, four FROM tenk1 LIMIT 2; + ntile | ten | four +-------+-----+------ + | 0 | 0 + | 0 | 0 +(2 rows) + +SELECT lag(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + lag | ten | four +-----+-----+------ + | 0 | 0 + 0 | 0 | 0 + 0 | 4 | 0 + | 1 | 1 + 1 | 1 | 1 + 1 | 7 | 1 + 7 | 9 | 1 + | 0 | 2 + | 1 | 3 + 1 | 3 | 3 +(10 rows) + +SELECT lag(ten, four) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + lag | ten | four +-----+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 4 | 4 | 0 + | 1 | 1 + 1 | 1 | 1 + 1 | 7 | 1 + 7 | 9 | 1 + | 0 | 2 + | 1 | 3 + | 3 | 3 +(10 rows) + +SELECT lag(ten, four, 0) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + lag | ten | four +-----+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 4 | 4 | 0 + 0 | 1 | 1 + 1 | 1 | 1 + 1 | 7 | 1 + 7 | 9 | 1 + 0 | 0 | 2 + 0 | 1 | 3 + 0 | 3 | 3 +(10 rows) + +SELECT lag(ten, four, 0.7) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten; + lag | ten | four +-----+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 4 | 4 | 0 + 0.7 | 1 | 1 + 1 | 1 | 1 + 1 | 7 | 1 + 7 | 9 | 1 + 0.7 | 0 | 2 + 0.7 | 1 | 3 + 0.7 | 3 | 3 +(10 rows) + +SELECT lead(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + lead | ten | four +------+-----+------ + 0 | 0 | 0 + 4 | 0 | 0 + | 4 | 0 + 1 | 1 | 1 + 7 | 1 | 1 + 9 | 7 | 1 + | 9 | 1 + | 0 | 2 + 3 | 1 | 3 + | 3 | 3 +(10 rows) + +SELECT lead(ten * 2, 1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + lead | ten | four +------+-----+------ + 0 | 0 | 0 + 8 | 0 | 0 + | 4 | 0 + 2 | 1 | 1 + 14 | 1 | 1 + 18 | 7 | 1 + | 9 | 1 + | 0 | 2 + 6 | 1 | 3 + | 3 | 3 +(10 rows) + +SELECT lead(ten * 2, 1, -1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + lead | ten | four +------+-----+------ + 0 | 0 | 0 + 8 | 0 | 0 + -1 | 4 | 0 + 2 | 1 | 1 + 14 | 1 | 1 + 18 | 7 | 1 + -1 | 9 | 1 + -1 | 0 | 2 + 6 | 1 | 3 + -1 | 3 | 3 +(10 rows) + +SELECT lead(ten * 2, 1, -1.4) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten; + lead | ten | four +------+-----+------ + 0 | 0 | 0 + 8 | 0 | 0 + -1.4 | 4 | 0 + 2 | 1 | 1 + 14 | 1 | 1 + 18 | 7 | 1 + -1.4 | 9 | 1 + -1.4 | 0 | 2 + 6 | 1 | 3 + -1.4 | 3 | 3 +(10 rows) + +SELECT first_value(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + first_value | ten | four +-------------+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 0 | 4 | 0 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 7 | 1 + 1 | 9 | 1 + 0 | 0 | 2 + 1 | 1 | 3 + 1 | 3 | 3 +(10 rows) + +-- last_value returns the last row of the frame, which is CURRENT ROW in ORDER BY window. +SELECT last_value(four) OVER (ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + last_value | ten | four +------------+-----+------ + 0 | 0 | 0 + 0 | 0 | 2 + 0 | 0 | 0 + 1 | 1 | 1 + 1 | 1 | 3 + 1 | 1 | 1 + 3 | 3 | 3 + 0 | 4 | 0 + 1 | 7 | 1 + 1 | 9 | 1 +(10 rows) + +SELECT last_value(ten) OVER (PARTITION BY four), ten, four FROM + (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s + ORDER BY four, ten; + last_value | ten | four +------------+-----+------ + 4 | 0 | 0 + 4 | 0 | 0 + 4 | 4 | 0 + 9 | 1 | 1 + 9 | 1 | 1 + 9 | 7 | 1 + 9 | 9 | 1 + 0 | 0 | 2 + 3 | 1 | 3 + 3 | 3 | 3 +(10 rows) + +SELECT nth_value(ten, four + 1) OVER (PARTITION BY four), ten, four + FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s; + nth_value | ten | four +-----------+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 0 | 4 | 0 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 7 | 1 + 1 | 9 | 1 + | 0 | 2 + | 1 | 3 + | 3 | 3 +(10 rows) + +SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER (PARTITION BY two ORDER BY ten) AS wsum +FROM tenk1 GROUP BY ten, two; + ten | two | gsum | wsum +-----+-----+-------+-------- + 0 | 0 | 45000 | 45000 + 2 | 0 | 47000 | 92000 + 4 | 0 | 49000 | 141000 + 6 | 0 | 51000 | 192000 + 8 | 0 | 53000 | 245000 + 1 | 1 | 46000 | 46000 + 3 | 1 | 48000 | 94000 + 5 | 1 | 50000 | 144000 + 7 | 1 | 52000 | 196000 + 9 | 1 | 54000 | 250000 +(10 rows) + +SELECT count(*) OVER (PARTITION BY four), four FROM (SELECT * FROM tenk1 WHERE two = 1)s WHERE unique2 < 10; + count | four +-------+------ + 4 | 1 + 4 | 1 + 4 | 1 + 4 | 1 + 2 | 3 + 2 | 3 +(6 rows) + +SELECT (count(*) OVER (PARTITION BY four ORDER BY ten) + + sum(hundred) OVER (PARTITION BY four ORDER BY ten))::varchar AS cntsum + FROM tenk1 WHERE unique2 < 10; + cntsum +-------- + 22 + 22 + 87 + 24 + 24 + 82 + 92 + 51 + 92 + 136 +(10 rows) + +-- opexpr with different windows evaluation. +SELECT * FROM( + SELECT count(*) OVER (PARTITION BY four ORDER BY ten) + + sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS total, + count(*) OVER (PARTITION BY four ORDER BY ten) AS fourcount, + sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS twosum + FROM tenk1 +)sub +WHERE total <> fourcount + twosum; + total | fourcount | twosum +-------+-----------+-------- +(0 rows) + +SELECT avg(four) OVER (PARTITION BY four ORDER BY thousand / 100) FROM tenk1 WHERE unique2 < 10; + avg +------------------------ + 0.00000000000000000000 + 0.00000000000000000000 + 0.00000000000000000000 + 1.00000000000000000000 + 1.00000000000000000000 + 1.00000000000000000000 + 1.00000000000000000000 + 2.0000000000000000 + 3.0000000000000000 + 3.0000000000000000 +(10 rows) + +SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER win AS wsum +FROM tenk1 GROUP BY ten, two WINDOW win AS (PARTITION BY two ORDER BY ten); + ten | two | gsum | wsum +-----+-----+-------+-------- + 0 | 0 | 45000 | 45000 + 2 | 0 | 47000 | 92000 + 4 | 0 | 49000 | 141000 + 6 | 0 | 51000 | 192000 + 8 | 0 | 53000 | 245000 + 1 | 1 | 46000 | 46000 + 3 | 1 | 48000 | 94000 + 5 | 1 | 50000 | 144000 + 7 | 1 | 52000 | 196000 + 9 | 1 | 54000 | 250000 +(10 rows) + +-- more than one window with GROUP BY +SELECT sum(salary), + row_number() OVER (ORDER BY depname), + sum(sum(salary)) OVER (ORDER BY depname DESC) +FROM empsalary GROUP BY depname; + sum | row_number | sum +-------+------------+------- + 25100 | 1 | 47100 + 7400 | 2 | 22000 + 14600 | 3 | 14600 +(3 rows) + +-- identical windows with different names +SELECT sum(salary) OVER w1, count(*) OVER w2 +FROM empsalary WINDOW w1 AS (ORDER BY salary), w2 AS (ORDER BY salary); + sum | count +-------+------- + 3500 | 1 + 7400 | 2 + 11600 | 3 + 16100 | 4 + 25700 | 6 + 25700 | 6 + 30700 | 7 + 41100 | 9 + 41100 | 9 + 47100 | 10 +(10 rows) + +-- subplan +SELECT lead(ten, (SELECT two FROM tenk1 WHERE s.unique2 = unique2)) OVER (PARTITION BY four ORDER BY ten) +FROM tenk1 s WHERE unique2 < 10; + lead +------ + 0 + 0 + 4 + 1 + 7 + 9 + + 0 + 3 + +(10 rows) + +-- empty table +SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 WHERE FALSE)s; + count +------- +(0 rows) + +-- mixture of agg/wfunc in the same window +SELECT sum(salary) OVER w, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); + sum | rank +-------+------ + 6000 | 1 + 16400 | 2 + 16400 | 2 + 20900 | 4 + 25100 | 5 + 3900 | 1 + 7400 | 2 + 5000 | 1 + 14600 | 2 + 14600 | 2 +(10 rows) + +-- strict aggs +SELECT empno, depname, salary, bonus, depadj, MIN(bonus) OVER (ORDER BY empno), MAX(depadj) OVER () FROM( + SELECT *, + CASE WHEN enroll_date < '2008-01-01' THEN 2008 - extract(YEAR FROM enroll_date) END * 500 AS bonus, + CASE WHEN + AVG(salary) OVER (PARTITION BY depname) < salary + THEN 200 END AS depadj FROM empsalary +)s; + empno | depname | salary | bonus | depadj | min | max +-------+-----------+--------+-------+--------+------+----- + 1 | sales | 5000 | 1000 | 200 | 1000 | 200 + 2 | personnel | 3900 | 1000 | 200 | 1000 | 200 + 3 | sales | 4800 | 500 | | 500 | 200 + 4 | sales | 4800 | 500 | | 500 | 200 + 5 | personnel | 3500 | 500 | | 500 | 200 + 7 | develop | 4200 | | | 500 | 200 + 8 | develop | 6000 | 1000 | 200 | 500 | 200 + 9 | develop | 4500 | | | 500 | 200 + 10 | develop | 5200 | 500 | 200 | 500 | 200 + 11 | develop | 5200 | 500 | 200 | 500 | 200 +(10 rows) + +-- window function over ungrouped agg over empty row set (bug before 9.1) +SELECT SUM(COUNT(f1)) OVER () FROM int4_tbl WHERE f1=42; + sum +----- + 0 +(1 row) + +-- window function with ORDER BY an expression involving aggregates (9.1 bug) +select ten, + sum(unique1) + sum(unique2) as res, + rank() over (order by sum(unique1) + sum(unique2)) as rank +from tenk1 +group by ten order by ten; + ten | res | rank +-----+----------+------ + 0 | 9976146 | 4 + 1 | 10114187 | 9 + 2 | 10059554 | 8 + 3 | 9878541 | 1 + 4 | 9881005 | 2 + 5 | 9981670 | 5 + 6 | 9947099 | 3 + 7 | 10120309 | 10 + 8 | 9991305 | 6 + 9 | 10040184 | 7 +(10 rows) + +-- window and aggregate with GROUP BY expression (9.2 bug) +explain (costs off) +select first_value(max(x)) over (), y + from (select unique1 as x, ten+four as y from tenk1) ss + group by y; + QUERY PLAN +--------------------------------------------- + WindowAgg + -> HashAggregate + Group Key: (tenk1.ten + tenk1.four) + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(5 rows) + +-- test non-default frame specifications +SELECT four, ten, + sum(ten) over (partition by four order by ten), + last_value(ten) over (partition by four order by ten) +FROM (select distinct ten, four from tenk1) ss; + four | ten | sum | last_value +------+-----+-----+------------ + 0 | 0 | 0 | 0 + 0 | 2 | 2 | 2 + 0 | 4 | 6 | 4 + 0 | 6 | 12 | 6 + 0 | 8 | 20 | 8 + 1 | 1 | 1 | 1 + 1 | 3 | 4 | 3 + 1 | 5 | 9 | 5 + 1 | 7 | 16 | 7 + 1 | 9 | 25 | 9 + 2 | 0 | 0 | 0 + 2 | 2 | 2 | 2 + 2 | 4 | 6 | 4 + 2 | 6 | 12 | 6 + 2 | 8 | 20 | 8 + 3 | 1 | 1 | 1 + 3 | 3 | 4 | 3 + 3 | 5 | 9 | 5 + 3 | 7 | 16 | 7 + 3 | 9 | 25 | 9 +(20 rows) + +SELECT four, ten, + sum(ten) over (partition by four order by ten range between unbounded preceding and current row), + last_value(ten) over (partition by four order by ten range between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; + four | ten | sum | last_value +------+-----+-----+------------ + 0 | 0 | 0 | 0 + 0 | 2 | 2 | 2 + 0 | 4 | 6 | 4 + 0 | 6 | 12 | 6 + 0 | 8 | 20 | 8 + 1 | 1 | 1 | 1 + 1 | 3 | 4 | 3 + 1 | 5 | 9 | 5 + 1 | 7 | 16 | 7 + 1 | 9 | 25 | 9 + 2 | 0 | 0 | 0 + 2 | 2 | 2 | 2 + 2 | 4 | 6 | 4 + 2 | 6 | 12 | 6 + 2 | 8 | 20 | 8 + 3 | 1 | 1 | 1 + 3 | 3 | 4 | 3 + 3 | 5 | 9 | 5 + 3 | 7 | 16 | 7 + 3 | 9 | 25 | 9 +(20 rows) + +SELECT four, ten, + sum(ten) over (partition by four order by ten range between unbounded preceding and unbounded following), + last_value(ten) over (partition by four order by ten range between unbounded preceding and unbounded following) +FROM (select distinct ten, four from tenk1) ss; + four | ten | sum | last_value +------+-----+-----+------------ + 0 | 0 | 20 | 8 + 0 | 2 | 20 | 8 + 0 | 4 | 20 | 8 + 0 | 6 | 20 | 8 + 0 | 8 | 20 | 8 + 1 | 1 | 25 | 9 + 1 | 3 | 25 | 9 + 1 | 5 | 25 | 9 + 1 | 7 | 25 | 9 + 1 | 9 | 25 | 9 + 2 | 0 | 20 | 8 + 2 | 2 | 20 | 8 + 2 | 4 | 20 | 8 + 2 | 6 | 20 | 8 + 2 | 8 | 20 | 8 + 3 | 1 | 25 | 9 + 3 | 3 | 25 | 9 + 3 | 5 | 25 | 9 + 3 | 7 | 25 | 9 + 3 | 9 | 25 | 9 +(20 rows) + +SELECT four, ten/4 as two, + sum(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row), + last_value(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; + four | two | sum | last_value +------+-----+-----+------------ + 0 | 0 | 0 | 0 + 0 | 0 | 0 | 0 + 0 | 1 | 2 | 1 + 0 | 1 | 2 | 1 + 0 | 2 | 4 | 2 + 1 | 0 | 0 | 0 + 1 | 0 | 0 | 0 + 1 | 1 | 2 | 1 + 1 | 1 | 2 | 1 + 1 | 2 | 4 | 2 + 2 | 0 | 0 | 0 + 2 | 0 | 0 | 0 + 2 | 1 | 2 | 1 + 2 | 1 | 2 | 1 + 2 | 2 | 4 | 2 + 3 | 0 | 0 | 0 + 3 | 0 | 0 | 0 + 3 | 1 | 2 | 1 + 3 | 1 | 2 | 1 + 3 | 2 | 4 | 2 +(20 rows) + +SELECT four, ten/4 as two, + sum(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row), + last_value(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; + four | two | sum | last_value +------+-----+-----+------------ + 0 | 0 | 0 | 0 + 0 | 0 | 0 | 0 + 0 | 1 | 1 | 1 + 0 | 1 | 2 | 1 + 0 | 2 | 4 | 2 + 1 | 0 | 0 | 0 + 1 | 0 | 0 | 0 + 1 | 1 | 1 | 1 + 1 | 1 | 2 | 1 + 1 | 2 | 4 | 2 + 2 | 0 | 0 | 0 + 2 | 0 | 0 | 0 + 2 | 1 | 1 | 1 + 2 | 1 | 2 | 1 + 2 | 2 | 4 | 2 + 3 | 0 | 0 | 0 + 3 | 0 | 0 | 0 + 3 | 1 | 1 | 1 + 3 | 1 | 2 | 1 + 3 | 2 | 4 | 2 +(20 rows) + +SELECT sum(unique1) over (order by four range between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 45 | 0 | 0 + 45 | 8 | 0 + 45 | 4 | 0 + 33 | 5 | 1 + 33 | 9 | 1 + 33 | 1 | 1 + 18 | 6 | 2 + 18 | 2 | 2 + 10 | 3 | 3 + 10 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (rows between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 45 | 4 | 0 + 41 | 2 | 2 + 39 | 1 | 1 + 38 | 6 | 2 + 32 | 9 | 1 + 23 | 8 | 0 + 15 | 5 | 1 + 10 | 3 | 3 + 7 | 7 | 3 + 0 | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between 2 preceding and 2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 7 | 4 | 0 + 13 | 2 | 2 + 22 | 1 | 1 + 26 | 6 | 2 + 29 | 9 | 1 + 31 | 8 | 0 + 32 | 5 | 1 + 23 | 3 | 3 + 15 | 7 | 3 + 10 | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude no others), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 7 | 4 | 0 + 13 | 2 | 2 + 22 | 1 | 1 + 26 | 6 | 2 + 29 | 9 | 1 + 31 | 8 | 0 + 32 | 5 | 1 + 23 | 3 | 3 + 15 | 7 | 3 + 10 | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 3 | 4 | 0 + 11 | 2 | 2 + 21 | 1 | 1 + 20 | 6 | 2 + 20 | 9 | 1 + 23 | 8 | 0 + 27 | 5 | 1 + 20 | 3 | 3 + 8 | 7 | 3 + 10 | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 4 | 0 + | 2 | 2 + | 1 | 1 + | 6 | 2 + | 9 | 1 + | 8 | 0 + | 5 | 1 + | 3 | 3 + | 7 | 3 + | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 4 | 4 | 0 + 2 | 2 | 2 + 1 | 1 | 1 + 6 | 6 | 2 + 9 | 9 | 1 + 8 | 8 | 0 + 5 | 5 | 1 + 3 | 3 | 3 + 7 | 7 | 3 + 0 | 0 | 0 +(10 rows) + +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + first_value | unique1 | four +-------------+---------+------ + 8 | 0 | 0 + 4 | 8 | 0 + 5 | 4 | 0 + 9 | 5 | 1 + 1 | 9 | 1 + 6 | 1 | 1 + 2 | 6 | 2 + 3 | 2 | 2 + 7 | 3 | 3 + | 7 | 3 +(10 rows) + +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + first_value | unique1 | four +-------------+---------+------ + | 0 | 0 + 5 | 8 | 0 + 5 | 4 | 0 + | 5 | 1 + 6 | 9 | 1 + 6 | 1 | 1 + 3 | 6 | 2 + 3 | 2 | 2 + | 3 | 3 + | 7 | 3 +(10 rows) + +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + first_value | unique1 | four +-------------+---------+------ + 0 | 0 | 0 + 8 | 8 | 0 + 4 | 4 | 0 + 5 | 5 | 1 + 9 | 9 | 1 + 1 | 1 | 1 + 6 | 6 | 2 + 2 | 2 | 2 + 3 | 3 | 3 + 7 | 7 | 3 +(10 rows) + +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + last_value | unique1 | four +------------+---------+------ + 4 | 0 | 0 + 5 | 8 | 0 + 9 | 4 | 0 + 1 | 5 | 1 + 6 | 9 | 1 + 2 | 1 | 1 + 3 | 6 | 2 + 7 | 2 | 2 + 7 | 3 | 3 + | 7 | 3 +(10 rows) + +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + last_value | unique1 | four +------------+---------+------ + | 0 | 0 + 5 | 8 | 0 + 9 | 4 | 0 + | 5 | 1 + 6 | 9 | 1 + 2 | 1 | 1 + 3 | 6 | 2 + 7 | 2 | 2 + | 3 | 3 + | 7 | 3 +(10 rows) + +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + last_value | unique1 | four +------------+---------+------ + 0 | 0 | 0 + 5 | 8 | 0 + 9 | 4 | 0 + 5 | 5 | 1 + 6 | 9 | 1 + 2 | 1 | 1 + 3 | 6 | 2 + 7 | 2 | 2 + 3 | 3 | 3 + 7 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (rows between 2 preceding and 1 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 4 | 0 + 4 | 2 | 2 + 6 | 1 | 1 + 3 | 6 | 2 + 7 | 9 | 1 + 15 | 8 | 0 + 17 | 5 | 1 + 13 | 3 | 3 + 8 | 7 | 3 + 10 | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between 1 following and 3 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 9 | 4 | 0 + 16 | 2 | 2 + 23 | 1 | 1 + 22 | 6 | 2 + 16 | 9 | 1 + 15 | 8 | 0 + 10 | 5 | 1 + 7 | 3 | 3 + 0 | 7 | 3 + | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between unbounded preceding and 1 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 6 | 4 | 0 + 7 | 2 | 2 + 13 | 1 | 1 + 22 | 6 | 2 + 30 | 9 | 1 + 35 | 8 | 0 + 38 | 5 | 1 + 45 | 3 | 3 + 45 | 7 | 3 + 45 | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (w range between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); + sum | unique1 | four +-----+---------+------ + 45 | 0 | 0 + 45 | 8 | 0 + 45 | 4 | 0 + 33 | 5 | 1 + 33 | 9 | 1 + 33 | 1 | 1 + 18 | 6 | 2 + 18 | 2 | 2 + 10 | 3 | 3 + 10 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); + sum | unique1 | four +-----+---------+------ + 12 | 0 | 0 + 4 | 8 | 0 + 8 | 4 | 0 + 22 | 5 | 1 + 18 | 9 | 1 + 26 | 1 | 1 + 29 | 6 | 2 + 33 | 2 | 2 + 42 | 3 | 3 + 38 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); + sum | unique1 | four +-----+---------+------ + | 0 | 0 + | 8 | 0 + | 4 | 0 + 12 | 5 | 1 + 12 | 9 | 1 + 12 | 1 | 1 + 27 | 6 | 2 + 27 | 2 | 2 + 35 | 3 | 3 + 35 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); + sum | unique1 | four +-----+---------+------ + 0 | 0 | 0 + 8 | 8 | 0 + 4 | 4 | 0 + 17 | 5 | 1 + 21 | 9 | 1 + 13 | 1 | 1 + 33 | 6 | 2 + 29 | 2 | 2 + 38 | 3 | 3 + 42 | 7 | 3 +(10 rows) + +SELECT first_value(unique1) over w, + nth_value(unique1, 2) over w AS nth_2, + last_value(unique1) over w, unique1, four +FROM tenk1 WHERE unique1 < 10 +WINDOW w AS (order by four range between current row and unbounded following); + first_value | nth_2 | last_value | unique1 | four +-------------+-------+------------+---------+------ + 0 | 8 | 7 | 0 | 0 + 0 | 8 | 7 | 8 | 0 + 0 | 8 | 7 | 4 | 0 + 5 | 9 | 7 | 5 | 1 + 5 | 9 | 7 | 9 | 1 + 5 | 9 | 7 | 1 | 1 + 6 | 2 | 7 | 6 | 2 + 6 | 2 | 7 | 2 | 2 + 3 | 7 | 7 | 3 | 3 + 3 | 7 | 7 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over + (order by unique1 + rows (SELECT unique1 FROM tenk1 ORDER BY unique1 LIMIT 1) + 1 PRECEDING), + unique1 +FROM tenk1 WHERE unique1 < 10; + sum | unique1 +-----+--------- + 0 | 0 + 1 | 1 + 3 | 2 + 5 | 3 + 7 | 4 + 9 | 5 + 11 | 6 + 13 | 7 + 15 | 8 + 17 | 9 +(10 rows) + +CREATE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following) as sum_rows + FROM generate_series(1, 10) i; +SELECT * FROM v_window; + i | sum_rows +----+---------- + 1 | 3 + 2 | 6 + 3 | 9 + 4 | 12 + 5 | 15 + 6 | 18 + 7 | 21 + 8 | 24 + 9 | 27 + 10 | 19 +(10 rows) + +SELECT pg_get_viewdef('v_window'); + pg_get_viewdef +--------------------------------------------------------------------------------------- + SELECT i.i, + + sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_rows+ + FROM generate_series(1, 10) i(i); +(1 row) + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude current row) as sum_rows FROM generate_series(1, 10) i; +SELECT * FROM v_window; + i | sum_rows +----+---------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 + 6 | 12 + 7 | 14 + 8 | 16 + 9 | 18 + 10 | 9 +(10 rows) + +SELECT pg_get_viewdef('v_window'); + pg_get_viewdef +----------------------------------------------------------------------------------------------------------- + SELECT i.i, + + sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW) AS sum_rows+ + FROM generate_series(1, 10) i(i); +(1 row) + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude group) as sum_rows FROM generate_series(1, 10) i; +SELECT * FROM v_window; + i | sum_rows +----+---------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 + 6 | 12 + 7 | 14 + 8 | 16 + 9 | 18 + 10 | 9 +(10 rows) + +SELECT pg_get_viewdef('v_window'); + pg_get_viewdef +----------------------------------------------------------------------------------------------------- + SELECT i.i, + + sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE GROUP) AS sum_rows+ + FROM generate_series(1, 10) i(i); +(1 row) + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude ties) as sum_rows FROM generate_series(1, 10) i; +SELECT * FROM v_window; + i | sum_rows +----+---------- + 1 | 3 + 2 | 6 + 3 | 9 + 4 | 12 + 5 | 15 + 6 | 18 + 7 | 21 + 8 | 24 + 9 | 27 + 10 | 19 +(10 rows) + +SELECT pg_get_viewdef('v_window'); + pg_get_viewdef +---------------------------------------------------------------------------------------------------- + SELECT i.i, + + sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE TIES) AS sum_rows+ + FROM generate_series(1, 10) i(i); +(1 row) + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude no others) as sum_rows FROM generate_series(1, 10) i; +SELECT * FROM v_window; + i | sum_rows +----+---------- + 1 | 3 + 2 | 6 + 3 | 9 + 4 | 12 + 5 | 15 + 6 | 18 + 7 | 21 + 8 | 24 + 9 | 27 + 10 | 19 +(10 rows) + +SELECT pg_get_viewdef('v_window'); + pg_get_viewdef +--------------------------------------------------------------------------------------- + SELECT i.i, + + sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_rows+ + FROM generate_series(1, 10) i(i); +(1 row) + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i groups between 1 preceding and 1 following) as sum_rows FROM generate_series(1, 10) i; +SELECT * FROM v_window; + i | sum_rows +----+---------- + 1 | 3 + 2 | 6 + 3 | 9 + 4 | 12 + 5 | 15 + 6 | 18 + 7 | 21 + 8 | 24 + 9 | 27 + 10 | 19 +(10 rows) + +SELECT pg_get_viewdef('v_window'); + pg_get_viewdef +----------------------------------------------------------------------------------------- + SELECT i.i, + + sum(i.i) OVER (ORDER BY i.i GROUPS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_rows+ + FROM generate_series(1, 10) i(i); +(1 row) + +DROP VIEW v_window; +CREATE TEMP VIEW v_window AS + SELECT i, min(i) over (order by i range between '1 day' preceding and '10 days' following) as min_i + FROM generate_series(now(), now()+'100 days'::interval, '1 hour') i; +SELECT pg_get_viewdef('v_window'); + pg_get_viewdef +--------------------------------------------------------------------------------------------------------------------------- + SELECT i.i, + + min(i.i) OVER (ORDER BY i.i RANGE BETWEEN '@ 1 day'::interval PRECEDING AND '@ 10 days'::interval FOLLOWING) AS min_i+ + FROM generate_series(now(), (now() + '@ 100 days'::interval), '@ 1 hour'::interval) i(i); +(1 row) + +-- RANGE offset PRECEDING/FOLLOWING tests +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 0 | 0 + | 8 | 0 + | 4 | 0 + 12 | 5 | 1 + 12 | 9 | 1 + 12 | 1 | 1 + 27 | 6 | 2 + 27 | 2 | 2 + 23 | 3 | 3 + 23 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four desc range between 2::int8 preceding and 1::int2 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 3 | 3 + | 7 | 3 + 10 | 6 | 2 + 10 | 2 | 2 + 18 | 9 | 1 + 18 | 5 | 1 + 18 | 1 | 1 + 23 | 0 | 0 + 23 | 8 | 0 + 23 | 4 | 0 +(10 rows) + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude no others), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 0 | 0 + | 8 | 0 + | 4 | 0 + 12 | 5 | 1 + 12 | 9 | 1 + 12 | 1 | 1 + 27 | 6 | 2 + 27 | 2 | 2 + 23 | 3 | 3 + 23 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 0 | 0 + | 8 | 0 + | 4 | 0 + 12 | 5 | 1 + 12 | 9 | 1 + 12 | 1 | 1 + 27 | 6 | 2 + 27 | 2 | 2 + 23 | 3 | 3 + 23 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 0 | 0 + | 8 | 0 + | 4 | 0 + 12 | 5 | 1 + 12 | 9 | 1 + 12 | 1 | 1 + 27 | 6 | 2 + 27 | 2 | 2 + 23 | 3 | 3 + 23 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 0 | 0 + | 8 | 0 + | 4 | 0 + 12 | 5 | 1 + 12 | 9 | 1 + 12 | 1 | 1 + 27 | 6 | 2 + 27 | 2 | 2 + 23 | 3 | 3 + 23 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 33 | 0 | 0 + 41 | 8 | 0 + 37 | 4 | 0 + 35 | 5 | 1 + 39 | 9 | 1 + 31 | 1 | 1 + 43 | 6 | 2 + 39 | 2 | 2 + 26 | 3 | 3 + 30 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 33 | 0 | 0 + 33 | 8 | 0 + 33 | 4 | 0 + 30 | 5 | 1 + 30 | 9 | 1 + 30 | 1 | 1 + 37 | 6 | 2 + 37 | 2 | 2 + 23 | 3 | 3 + 23 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 4 | 0 | 0 + 12 | 4 | 0 + 12 | 8 | 0 + 6 | 1 | 1 + 15 | 5 | 1 + 14 | 9 | 1 + 8 | 2 | 2 + 8 | 6 | 2 + 10 | 3 | 3 + 10 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following + exclude current row),unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 4 | 0 | 0 + 8 | 4 | 0 + 4 | 8 | 0 + 5 | 1 | 1 + 10 | 5 | 1 + 5 | 9 | 1 + 6 | 2 | 2 + 2 | 6 | 2 + 7 | 3 | 3 + 3 | 7 | 3 +(10 rows) + +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following), + salary, enroll_date from empsalary; + sum | salary | enroll_date +-------+--------+------------- + 34900 | 5000 | 10-01-2006 + 34900 | 6000 | 10-01-2006 + 38400 | 3900 | 12-23-2006 + 47100 | 4800 | 08-01-2007 + 47100 | 5200 | 08-01-2007 + 47100 | 4800 | 08-08-2007 + 47100 | 5200 | 08-15-2007 + 36100 | 3500 | 12-10-2007 + 32200 | 4500 | 01-01-2008 + 32200 | 4200 | 01-01-2008 +(10 rows) + +select sum(salary) over (order by enroll_date desc range between '1 year'::interval preceding and '1 year'::interval following), + salary, enroll_date from empsalary; + sum | salary | enroll_date +-------+--------+------------- + 32200 | 4200 | 01-01-2008 + 32200 | 4500 | 01-01-2008 + 36100 | 3500 | 12-10-2007 + 47100 | 5200 | 08-15-2007 + 47100 | 4800 | 08-08-2007 + 47100 | 4800 | 08-01-2007 + 47100 | 5200 | 08-01-2007 + 38400 | 3900 | 12-23-2006 + 34900 | 5000 | 10-01-2006 + 34900 | 6000 | 10-01-2006 +(10 rows) + +select sum(salary) over (order by enroll_date desc range between '1 year'::interval following and '1 year'::interval following), + salary, enroll_date from empsalary; + sum | salary | enroll_date +-----+--------+------------- + | 4200 | 01-01-2008 + | 4500 | 01-01-2008 + | 3500 | 12-10-2007 + | 5200 | 08-15-2007 + | 4800 | 08-08-2007 + | 4800 | 08-01-2007 + | 5200 | 08-01-2007 + | 3900 | 12-23-2006 + | 5000 | 10-01-2006 + | 6000 | 10-01-2006 +(10 rows) + +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude current row), salary, enroll_date from empsalary; + sum | salary | enroll_date +-------+--------+------------- + 29900 | 5000 | 10-01-2006 + 28900 | 6000 | 10-01-2006 + 34500 | 3900 | 12-23-2006 + 42300 | 4800 | 08-01-2007 + 41900 | 5200 | 08-01-2007 + 42300 | 4800 | 08-08-2007 + 41900 | 5200 | 08-15-2007 + 32600 | 3500 | 12-10-2007 + 27700 | 4500 | 01-01-2008 + 28000 | 4200 | 01-01-2008 +(10 rows) + +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude group), salary, enroll_date from empsalary; + sum | salary | enroll_date +-------+--------+------------- + 23900 | 5000 | 10-01-2006 + 23900 | 6000 | 10-01-2006 + 34500 | 3900 | 12-23-2006 + 37100 | 4800 | 08-01-2007 + 37100 | 5200 | 08-01-2007 + 42300 | 4800 | 08-08-2007 + 41900 | 5200 | 08-15-2007 + 32600 | 3500 | 12-10-2007 + 23500 | 4500 | 01-01-2008 + 23500 | 4200 | 01-01-2008 +(10 rows) + +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude ties), salary, enroll_date from empsalary; + sum | salary | enroll_date +-------+--------+------------- + 28900 | 5000 | 10-01-2006 + 29900 | 6000 | 10-01-2006 + 38400 | 3900 | 12-23-2006 + 41900 | 4800 | 08-01-2007 + 42300 | 5200 | 08-01-2007 + 47100 | 4800 | 08-08-2007 + 47100 | 5200 | 08-15-2007 + 36100 | 3500 | 12-10-2007 + 28000 | 4500 | 01-01-2008 + 27700 | 4200 | 01-01-2008 +(10 rows) + +select first_value(salary) over(order by salary range between 1000 preceding and 1000 following), + lead(salary) over(order by salary range between 1000 preceding and 1000 following), + nth_value(salary, 1) over(order by salary range between 1000 preceding and 1000 following), + salary from empsalary; + first_value | lead | nth_value | salary +-------------+------+-----------+-------- + 3500 | 3900 | 3500 | 3500 + 3500 | 4200 | 3500 | 3900 + 3500 | 4500 | 3500 | 4200 + 3500 | 4800 | 3500 | 4500 + 3900 | 4800 | 3900 | 4800 + 3900 | 5000 | 3900 | 4800 + 4200 | 5200 | 4200 | 5000 + 4200 | 5200 | 4200 | 5200 + 4200 | 6000 | 4200 | 5200 + 5000 | | 5000 | 6000 +(10 rows) + +select last_value(salary) over(order by salary range between 1000 preceding and 1000 following), + lag(salary) over(order by salary range between 1000 preceding and 1000 following), + salary from empsalary; + last_value | lag | salary +------------+------+-------- + 4500 | | 3500 + 4800 | 3500 | 3900 + 5200 | 3900 | 4200 + 5200 | 4200 | 4500 + 5200 | 4500 | 4800 + 5200 | 4800 | 4800 + 6000 | 4800 | 5000 + 6000 | 5000 | 5200 + 6000 | 5200 | 5200 + 6000 | 5200 | 6000 +(10 rows) + +select first_value(salary) over(order by salary range between 1000 following and 3000 following + exclude current row), + lead(salary) over(order by salary range between 1000 following and 3000 following exclude ties), + nth_value(salary, 1) over(order by salary range between 1000 following and 3000 following + exclude ties), + salary from empsalary; + first_value | lead | nth_value | salary +-------------+------+-----------+-------- + 4500 | 3900 | 4500 | 3500 + 5000 | 4200 | 5000 | 3900 + 5200 | 4500 | 5200 | 4200 + 6000 | 4800 | 6000 | 4500 + 6000 | 4800 | 6000 | 4800 + 6000 | 5000 | 6000 | 4800 + 6000 | 5200 | 6000 | 5000 + | 5200 | | 5200 + | 6000 | | 5200 + | | | 6000 +(10 rows) + +select last_value(salary) over(order by salary range between 1000 following and 3000 following + exclude group), + lag(salary) over(order by salary range between 1000 following and 3000 following exclude group), + salary from empsalary; + last_value | lag | salary +------------+------+-------- + 6000 | | 3500 + 6000 | 3500 | 3900 + 6000 | 3900 | 4200 + 6000 | 4200 | 4500 + 6000 | 4500 | 4800 + 6000 | 4800 | 4800 + 6000 | 4800 | 5000 + | 5000 | 5200 + | 5200 | 5200 + | 5200 | 6000 +(10 rows) + +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following), + salary, enroll_date from empsalary; + first_value | last_value | salary | enroll_date +-------------+------------+--------+------------- + 5000 | 5200 | 5000 | 10-01-2006 + 6000 | 5200 | 6000 | 10-01-2006 + 5000 | 3500 | 3900 | 12-23-2006 + 5000 | 4200 | 4800 | 08-01-2007 + 5000 | 4200 | 5200 | 08-01-2007 + 5000 | 4200 | 4800 | 08-08-2007 + 5000 | 4200 | 5200 | 08-15-2007 + 5000 | 4200 | 3500 | 12-10-2007 + 5000 | 4200 | 4500 | 01-01-2008 + 5000 | 4200 | 4200 | 01-01-2008 +(10 rows) + +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + salary, enroll_date from empsalary; + first_value | last_value | salary | enroll_date +-------------+------------+--------+------------- + 5000 | 5200 | 5000 | 10-01-2006 + 6000 | 5200 | 6000 | 10-01-2006 + 5000 | 3500 | 3900 | 12-23-2006 + 5000 | 4200 | 4800 | 08-01-2007 + 5000 | 4200 | 5200 | 08-01-2007 + 5000 | 4200 | 4800 | 08-08-2007 + 5000 | 4200 | 5200 | 08-15-2007 + 5000 | 4200 | 3500 | 12-10-2007 + 5000 | 4500 | 4500 | 01-01-2008 + 5000 | 4200 | 4200 | 01-01-2008 +(10 rows) + +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude group), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude group), + salary, enroll_date from empsalary; + first_value | last_value | salary | enroll_date +-------------+------------+--------+------------- + 3900 | 5200 | 5000 | 10-01-2006 + 3900 | 5200 | 6000 | 10-01-2006 + 5000 | 3500 | 3900 | 12-23-2006 + 5000 | 4200 | 4800 | 08-01-2007 + 5000 | 4200 | 5200 | 08-01-2007 + 5000 | 4200 | 4800 | 08-08-2007 + 5000 | 4200 | 5200 | 08-15-2007 + 5000 | 4200 | 3500 | 12-10-2007 + 5000 | 3500 | 4500 | 01-01-2008 + 5000 | 3500 | 4200 | 01-01-2008 +(10 rows) + +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude current row), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude current row), + salary, enroll_date from empsalary; + first_value | last_value | salary | enroll_date +-------------+------------+--------+------------- + 6000 | 5200 | 5000 | 10-01-2006 + 5000 | 5200 | 6000 | 10-01-2006 + 5000 | 3500 | 3900 | 12-23-2006 + 5000 | 4200 | 4800 | 08-01-2007 + 5000 | 4200 | 5200 | 08-01-2007 + 5000 | 4200 | 4800 | 08-08-2007 + 5000 | 4200 | 5200 | 08-15-2007 + 5000 | 4200 | 3500 | 12-10-2007 + 5000 | 4200 | 4500 | 01-01-2008 + 5000 | 4500 | 4200 | 01-01-2008 +(10 rows) + +-- RANGE offset PRECEDING/FOLLOWING with null values +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x asc nulls first range between 2 preceding and 2 following); + x | y | first_value | last_value +---+----+-------------+------------ + | 42 | 42 | 43 + | 43 | 42 | 43 + 1 | 1 | 1 | 3 + 2 | 2 | 1 | 4 + 3 | 3 | 1 | 5 + 4 | 4 | 2 | 5 + 5 | 5 | 3 | 5 +(7 rows) + +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x asc nulls last range between 2 preceding and 2 following); + x | y | first_value | last_value +---+----+-------------+------------ + 1 | 1 | 1 | 3 + 2 | 2 | 1 | 4 + 3 | 3 | 1 | 5 + 4 | 4 | 2 | 5 + 5 | 5 | 3 | 5 + | 42 | 42 | 43 + | 43 | 42 | 43 +(7 rows) + +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x desc nulls first range between 2 preceding and 2 following); + x | y | first_value | last_value +---+----+-------------+------------ + | 43 | 43 | 42 + | 42 | 43 | 42 + 5 | 5 | 5 | 3 + 4 | 4 | 5 | 2 + 3 | 3 | 5 | 1 + 2 | 2 | 4 | 1 + 1 | 1 | 3 | 1 +(7 rows) + +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x desc nulls last range between 2 preceding and 2 following); + x | y | first_value | last_value +---+----+-------------+------------ + 5 | 5 | 5 | 3 + 4 | 4 | 5 | 2 + 3 | 3 | 5 | 1 + 2 | 2 | 4 | 1 + 1 | 1 | 3 | 1 + | 42 | 42 | 43 + | 43 | 42 | 43 +(7 rows) + +-- Check overflow behavior for various integer sizes +select x, last_value(x) over (order by x::smallint range between current row and 2147450884 following) +from generate_series(32764, 32766) x; + x | last_value +-------+------------ + 32764 | 32766 + 32765 | 32766 + 32766 | 32766 +(3 rows) + +select x, last_value(x) over (order by x::smallint desc range between current row and 2147450885 following) +from generate_series(-32766, -32764) x; + x | last_value +--------+------------ + -32764 | -32766 + -32765 | -32766 + -32766 | -32766 +(3 rows) + +select x, last_value(x) over (order by x range between current row and 4 following) +from generate_series(2147483644, 2147483646) x; + x | last_value +------------+------------ + 2147483644 | 2147483646 + 2147483645 | 2147483646 + 2147483646 | 2147483646 +(3 rows) + +select x, last_value(x) over (order by x desc range between current row and 5 following) +from generate_series(-2147483646, -2147483644) x; + x | last_value +-------------+------------- + -2147483644 | -2147483646 + -2147483645 | -2147483646 + -2147483646 | -2147483646 +(3 rows) + +select x, last_value(x) over (order by x range between current row and 4 following) +from generate_series(9223372036854775804, 9223372036854775806) x; + x | last_value +---------------------+--------------------- + 9223372036854775804 | 9223372036854775806 + 9223372036854775805 | 9223372036854775806 + 9223372036854775806 | 9223372036854775806 +(3 rows) + +select x, last_value(x) over (order by x desc range between current row and 5 following) +from generate_series(-9223372036854775806, -9223372036854775804) x; + x | last_value +----------------------+---------------------- + -9223372036854775804 | -9223372036854775806 + -9223372036854775805 | -9223372036854775806 + -9223372036854775806 | -9223372036854775806 +(3 rows) + +-- Test in_range for other numeric datatypes +create temp table numerics( + id int, + f_float4 float4, + f_float8 float8, + f_numeric numeric +); +insert into numerics values +(0, '-infinity', '-infinity', '-infinity'), +(1, -3, -3, -3), +(2, -1, -1, -1), +(3, 0, 0, 0), +(4, 1.1, 1.1, 1.1), +(5, 1.12, 1.12, 1.12), +(6, 2, 2, 2), +(7, 100, 100, 100), +(8, 'infinity', 'infinity', 'infinity'), +(9, 'NaN', 'NaN', 'NaN'); +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1 preceding and 1 following); + id | f_float4 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 1 | 1 + 2 | -1 | 2 | 3 + 3 | 0 | 2 | 3 + 4 | 1.1 | 4 | 6 + 5 | 1.12 | 4 | 6 + 6 | 2 | 4 | 6 + 7 | 100 | 7 | 7 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1 preceding and 1.1::float4 following); + id | f_float4 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 1 | 1 + 2 | -1 | 2 | 3 + 3 | 0 | 2 | 4 + 4 | 1.1 | 4 | 6 + 5 | 1.12 | 4 | 6 + 6 | 2 | 4 | 6 + 7 | 100 | 7 | 7 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' preceding and 'inf' following); + id | f_float4 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 8 + 1 | -3 | 0 | 8 + 2 | -1 | 0 | 8 + 3 | 0 | 0 | 8 + 4 | 1.1 | 0 | 8 + 5 | 1.12 | 0 | 8 + 6 | 2 | 0 | 8 + 7 | 100 | 0 | 8 + 8 | Infinity | 0 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' preceding and 'inf' preceding); + id | f_float4 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 0 | 0 + 2 | -1 | 0 | 0 + 3 | 0 | 0 | 0 + 4 | 1.1 | 0 | 0 + 5 | 1.12 | 0 | 0 + 6 | 2 | 0 | 0 + 7 | 100 | 0 | 0 + 8 | Infinity | 0 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' following and 'inf' following); + id | f_float4 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 8 + 1 | -3 | 8 | 8 + 2 | -1 | 8 | 8 + 3 | 0 | 8 | 8 + 4 | 1.1 | 8 | 8 + 5 | 1.12 | 8 | 8 + 6 | 2 | 8 | 8 + 7 | 100 | 8 | 8 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed +ERROR: invalid preceding or following size in window function +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1 preceding and 1 following); + id | f_float8 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 1 | 1 + 2 | -1 | 2 | 3 + 3 | 0 | 2 | 3 + 4 | 1.1 | 4 | 6 + 5 | 1.12 | 4 | 6 + 6 | 2 | 4 | 6 + 7 | 100 | 7 | 7 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1 preceding and 1.1::float8 following); + id | f_float8 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 1 | 1 + 2 | -1 | 2 | 3 + 3 | 0 | 2 | 4 + 4 | 1.1 | 4 | 6 + 5 | 1.12 | 4 | 6 + 6 | 2 | 4 | 6 + 7 | 100 | 7 | 7 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' preceding and 'inf' following); + id | f_float8 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 8 + 1 | -3 | 0 | 8 + 2 | -1 | 0 | 8 + 3 | 0 | 0 | 8 + 4 | 1.1 | 0 | 8 + 5 | 1.12 | 0 | 8 + 6 | 2 | 0 | 8 + 7 | 100 | 0 | 8 + 8 | Infinity | 0 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' preceding and 'inf' preceding); + id | f_float8 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 0 | 0 + 2 | -1 | 0 | 0 + 3 | 0 | 0 | 0 + 4 | 1.1 | 0 | 0 + 5 | 1.12 | 0 | 0 + 6 | 2 | 0 | 0 + 7 | 100 | 0 | 0 + 8 | Infinity | 0 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' following and 'inf' following); + id | f_float8 | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 8 + 1 | -3 | 8 | 8 + 2 | -1 | 8 | 8 + 3 | 0 | 8 | 8 + 4 | 1.1 | 8 | 8 + 5 | 1.12 | 8 | 8 + 6 | 2 | 8 | 8 + 7 | 100 | 8 | 8 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed +ERROR: invalid preceding or following size in window function +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1 following); + id | f_numeric | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 1 | 1 + 2 | -1 | 2 | 3 + 3 | 0 | 2 | 3 + 4 | 1.1 | 4 | 6 + 5 | 1.12 | 4 | 6 + 6 | 2 | 4 | 6 + 7 | 100 | 7 | 7 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1.1::numeric following); + id | f_numeric | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 1 | 1 + 2 | -1 | 2 | 3 + 3 | 0 | 2 | 4 + 4 | 1.1 | 4 | 6 + 5 | 1.12 | 4 | 6 + 6 | 2 | 4 | 6 + 7 | 100 | 7 | 7 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1.1::float8 following); -- currently unsupported +ERROR: RANGE with offset PRECEDING/FOLLOWING is not supported for column type numeric and offset type double precision +LINE 4: 1 preceding and 1.1::float8 following); + ^ +HINT: Cast the offset value to an appropriate type. +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' preceding and 'inf' following); + id | f_numeric | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 8 + 1 | -3 | 0 | 8 + 2 | -1 | 0 | 8 + 3 | 0 | 0 | 8 + 4 | 1.1 | 0 | 8 + 5 | 1.12 | 0 | 8 + 6 | 2 | 0 | 8 + 7 | 100 | 0 | 8 + 8 | Infinity | 0 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' preceding and 'inf' preceding); + id | f_numeric | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 0 + 1 | -3 | 0 | 0 + 2 | -1 | 0 | 0 + 3 | 0 | 0 | 0 + 4 | 1.1 | 0 | 0 + 5 | 1.12 | 0 | 0 + 6 | 2 | 0 | 0 + 7 | 100 | 0 | 0 + 8 | Infinity | 0 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' following and 'inf' following); + id | f_numeric | first_value | last_value +----+-----------+-------------+------------ + 0 | -Infinity | 0 | 8 + 1 | -3 | 8 | 8 + 2 | -1 | 8 | 8 + 3 | 0 | 8 | 8 + 4 | 1.1 | 8 | 8 + 5 | 1.12 | 8 | 8 + 6 | 2 | 8 | 8 + 7 | 100 | 8 | 8 + 8 | Infinity | 8 | 8 + 9 | NaN | 9 | 9 +(10 rows) + +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed +ERROR: invalid preceding or following size in window function +-- Test in_range for other datetime datatypes +create temp table datetimes( + id int, + f_time time, + f_timetz timetz, + f_interval interval, + f_timestamptz timestamptz, + f_timestamp timestamp +); +insert into datetimes values +(1, '11:00', '11:00 BST', '1 year', '2000-10-19 10:23:54+01', '2000-10-19 10:23:54'), +(2, '12:00', '12:00 BST', '2 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(3, '13:00', '13:00 BST', '3 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(4, '14:00', '14:00 BST', '4 years', '2002-10-19 10:23:54+01', '2002-10-19 10:23:54'), +(5, '15:00', '15:00 BST', '5 years', '2003-10-19 10:23:54+01', '2003-10-19 10:23:54'), +(6, '15:00', '15:00 BST', '5 years', '2004-10-19 10:23:54+01', '2004-10-19 10:23:54'), +(7, '17:00', '17:00 BST', '7 years', '2005-10-19 10:23:54+01', '2005-10-19 10:23:54'), +(8, '18:00', '18:00 BST', '8 years', '2006-10-19 10:23:54+01', '2006-10-19 10:23:54'), +(9, '19:00', '19:00 BST', '9 years', '2007-10-19 10:23:54+01', '2007-10-19 10:23:54'), +(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'); +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + '70 min'::interval preceding and '2 hours'::interval following); + id | f_time | first_value | last_value +----+----------+-------------+------------ + 1 | 11:00:00 | 1 | 3 + 2 | 12:00:00 | 1 | 4 + 3 | 13:00:00 | 2 | 6 + 4 | 14:00:00 | 3 | 6 + 5 | 15:00:00 | 4 | 7 + 6 | 15:00:00 | 4 | 7 + 7 | 17:00:00 | 7 | 9 + 8 | 18:00:00 | 7 | 10 + 9 | 19:00:00 | 8 | 10 + 10 | 20:00:00 | 9 | 10 +(10 rows) + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time desc range between + '70 min' preceding and '2 hours' following); + id | f_time | first_value | last_value +----+----------+-------------+------------ + 10 | 20:00:00 | 10 | 8 + 9 | 19:00:00 | 10 | 7 + 8 | 18:00:00 | 9 | 7 + 7 | 17:00:00 | 8 | 5 + 6 | 15:00:00 | 6 | 3 + 5 | 15:00:00 | 6 | 3 + 4 | 14:00:00 | 6 | 2 + 3 | 13:00:00 | 4 | 1 + 2 | 12:00:00 | 3 | 1 + 1 | 11:00:00 | 2 | 1 +(10 rows) + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + '70 min'::interval preceding and '2 hours'::interval following); + id | f_timetz | first_value | last_value +----+-------------+-------------+------------ + 1 | 11:00:00+01 | 1 | 3 + 2 | 12:00:00+01 | 1 | 4 + 3 | 13:00:00+01 | 2 | 6 + 4 | 14:00:00+01 | 3 | 6 + 5 | 15:00:00+01 | 4 | 7 + 6 | 15:00:00+01 | 4 | 7 + 7 | 17:00:00+01 | 7 | 9 + 8 | 18:00:00+01 | 7 | 10 + 9 | 19:00:00+01 | 8 | 10 + 10 | 20:00:00+01 | 9 | 10 +(10 rows) + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz desc range between + '70 min' preceding and '2 hours' following); + id | f_timetz | first_value | last_value +----+-------------+-------------+------------ + 10 | 20:00:00+01 | 10 | 8 + 9 | 19:00:00+01 | 10 | 7 + 8 | 18:00:00+01 | 9 | 7 + 7 | 17:00:00+01 | 8 | 5 + 6 | 15:00:00+01 | 6 | 3 + 5 | 15:00:00+01 | 6 | 3 + 4 | 14:00:00+01 | 6 | 2 + 3 | 13:00:00+01 | 4 | 1 + 2 | 12:00:00+01 | 3 | 1 + 1 | 11:00:00+01 | 2 | 1 +(10 rows) + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + '1 year'::interval preceding and '1 year'::interval following); + id | f_interval | first_value | last_value +----+------------+-------------+------------ + 1 | @ 1 year | 1 | 2 + 2 | @ 2 years | 1 | 3 + 3 | @ 3 years | 2 | 4 + 4 | @ 4 years | 3 | 6 + 5 | @ 5 years | 4 | 6 + 6 | @ 5 years | 4 | 6 + 7 | @ 7 years | 7 | 8 + 8 | @ 8 years | 7 | 9 + 9 | @ 9 years | 8 | 10 + 10 | @ 10 years | 9 | 10 +(10 rows) + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval desc range between + '1 year' preceding and '1 year' following); + id | f_interval | first_value | last_value +----+------------+-------------+------------ + 10 | @ 10 years | 10 | 9 + 9 | @ 9 years | 10 | 8 + 8 | @ 8 years | 9 | 7 + 7 | @ 7 years | 8 | 7 + 6 | @ 5 years | 6 | 4 + 5 | @ 5 years | 6 | 4 + 4 | @ 4 years | 6 | 3 + 3 | @ 3 years | 4 | 2 + 2 | @ 2 years | 3 | 1 + 1 | @ 1 year | 2 | 1 +(10 rows) + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + '1 year'::interval preceding and '1 year'::interval following); + id | f_timestamptz | first_value | last_value +----+------------------------------+-------------+------------ + 1 | Thu Oct 19 02:23:54 2000 PDT | 1 | 3 + 2 | Fri Oct 19 02:23:54 2001 PDT | 1 | 4 + 3 | Fri Oct 19 02:23:54 2001 PDT | 1 | 4 + 4 | Sat Oct 19 02:23:54 2002 PDT | 2 | 5 + 5 | Sun Oct 19 02:23:54 2003 PDT | 4 | 6 + 6 | Tue Oct 19 02:23:54 2004 PDT | 5 | 7 + 7 | Wed Oct 19 02:23:54 2005 PDT | 6 | 8 + 8 | Thu Oct 19 02:23:54 2006 PDT | 7 | 9 + 9 | Fri Oct 19 02:23:54 2007 PDT | 8 | 10 + 10 | Sun Oct 19 02:23:54 2008 PDT | 9 | 10 +(10 rows) + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz desc range between + '1 year' preceding and '1 year' following); + id | f_timestamptz | first_value | last_value +----+------------------------------+-------------+------------ + 10 | Sun Oct 19 02:23:54 2008 PDT | 10 | 9 + 9 | Fri Oct 19 02:23:54 2007 PDT | 10 | 8 + 8 | Thu Oct 19 02:23:54 2006 PDT | 9 | 7 + 7 | Wed Oct 19 02:23:54 2005 PDT | 8 | 6 + 6 | Tue Oct 19 02:23:54 2004 PDT | 7 | 5 + 5 | Sun Oct 19 02:23:54 2003 PDT | 6 | 4 + 4 | Sat Oct 19 02:23:54 2002 PDT | 5 | 2 + 3 | Fri Oct 19 02:23:54 2001 PDT | 4 | 1 + 2 | Fri Oct 19 02:23:54 2001 PDT | 4 | 1 + 1 | Thu Oct 19 02:23:54 2000 PDT | 3 | 1 +(10 rows) + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + '1 year'::interval preceding and '1 year'::interval following); + id | f_timestamp | first_value | last_value +----+--------------------------+-------------+------------ + 1 | Thu Oct 19 10:23:54 2000 | 1 | 3 + 2 | Fri Oct 19 10:23:54 2001 | 1 | 4 + 3 | Fri Oct 19 10:23:54 2001 | 1 | 4 + 4 | Sat Oct 19 10:23:54 2002 | 2 | 5 + 5 | Sun Oct 19 10:23:54 2003 | 4 | 6 + 6 | Tue Oct 19 10:23:54 2004 | 5 | 7 + 7 | Wed Oct 19 10:23:54 2005 | 6 | 8 + 8 | Thu Oct 19 10:23:54 2006 | 7 | 9 + 9 | Fri Oct 19 10:23:54 2007 | 8 | 10 + 10 | Sun Oct 19 10:23:54 2008 | 9 | 10 +(10 rows) + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp desc range between + '1 year' preceding and '1 year' following); + id | f_timestamp | first_value | last_value +----+--------------------------+-------------+------------ + 10 | Sun Oct 19 10:23:54 2008 | 10 | 9 + 9 | Fri Oct 19 10:23:54 2007 | 10 | 8 + 8 | Thu Oct 19 10:23:54 2006 | 9 | 7 + 7 | Wed Oct 19 10:23:54 2005 | 8 | 6 + 6 | Tue Oct 19 10:23:54 2004 | 7 | 5 + 5 | Sun Oct 19 10:23:54 2003 | 6 | 4 + 4 | Sat Oct 19 10:23:54 2002 | 5 | 2 + 3 | Fri Oct 19 10:23:54 2001 | 4 | 1 + 2 | Fri Oct 19 10:23:54 2001 | 4 | 1 + 1 | Thu Oct 19 10:23:54 2000 | 3 | 1 +(10 rows) + +-- RANGE offset PRECEDING/FOLLOWING error cases +select sum(salary) over (order by enroll_date, salary range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +ERROR: RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column +LINE 1: select sum(salary) over (order by enroll_date, salary range ... + ^ +select sum(salary) over (range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +ERROR: RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column +LINE 1: select sum(salary) over (range between '1 year'::interval pr... + ^ +select sum(salary) over (order by depname range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +ERROR: RANGE with offset PRECEDING/FOLLOWING is not supported for column type text +LINE 1: ... sum(salary) over (order by depname range between '1 year'::... + ^ +select max(enroll_date) over (order by enroll_date range between 1 preceding and 2 following + exclude ties), salary, enroll_date from empsalary; +ERROR: RANGE with offset PRECEDING/FOLLOWING is not supported for column type date and offset type integer +LINE 1: ...ll_date) over (order by enroll_date range between 1 precedin... + ^ +HINT: Cast the offset value to an appropriate type. +select max(enroll_date) over (order by salary range between -1 preceding and 2 following + exclude ties), salary, enroll_date from empsalary; +ERROR: invalid preceding or following size in window function +select max(enroll_date) over (order by salary range between 1 preceding and -2 following + exclude ties), salary, enroll_date from empsalary; +ERROR: invalid preceding or following size in window function +select max(enroll_date) over (order by salary range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +ERROR: RANGE with offset PRECEDING/FOLLOWING is not supported for column type integer and offset type interval +LINE 1: ...(enroll_date) over (order by salary range between '1 year'::... + ^ +HINT: Cast the offset value to an appropriate type. +select max(enroll_date) over (order by enroll_date range between '1 year'::interval preceding and '-2 years'::interval following + exclude ties), salary, enroll_date from empsalary; +ERROR: invalid preceding or following size in window function +-- GROUPS tests +SELECT sum(unique1) over (order by four groups between unbounded preceding and current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 12 | 0 | 0 + 12 | 8 | 0 + 12 | 4 | 0 + 27 | 5 | 1 + 27 | 9 | 1 + 27 | 1 | 1 + 35 | 6 | 2 + 35 | 2 | 2 + 45 | 3 | 3 + 45 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between unbounded preceding and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 45 | 0 | 0 + 45 | 8 | 0 + 45 | 4 | 0 + 45 | 5 | 1 + 45 | 9 | 1 + 45 | 1 | 1 + 45 | 6 | 2 + 45 | 2 | 2 + 45 | 3 | 3 + 45 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 45 | 0 | 0 + 45 | 8 | 0 + 45 | 4 | 0 + 33 | 5 | 1 + 33 | 9 | 1 + 33 | 1 | 1 + 18 | 6 | 2 + 18 | 2 | 2 + 10 | 3 | 3 + 10 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between 1 preceding and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 45 | 0 | 0 + 45 | 8 | 0 + 45 | 4 | 0 + 45 | 5 | 1 + 45 | 9 | 1 + 45 | 1 | 1 + 33 | 6 | 2 + 33 | 2 | 2 + 18 | 3 | 3 + 18 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between 1 following and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 33 | 0 | 0 + 33 | 8 | 0 + 33 | 4 | 0 + 18 | 5 | 1 + 18 | 9 | 1 + 18 | 1 | 1 + 10 | 6 | 2 + 10 | 2 | 2 + | 3 | 3 + | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between unbounded preceding and 2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 35 | 0 | 0 + 35 | 8 | 0 + 35 | 4 | 0 + 45 | 5 | 1 + 45 | 9 | 1 + 45 | 1 | 1 + 45 | 6 | 2 + 45 | 2 | 2 + 45 | 3 | 3 + 45 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + | 0 | 0 + | 8 | 0 + | 4 | 0 + 12 | 5 | 1 + 12 | 9 | 1 + 12 | 1 | 1 + 27 | 6 | 2 + 27 | 2 | 2 + 23 | 3 | 3 + 23 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 27 | 0 | 0 + 27 | 8 | 0 + 27 | 4 | 0 + 35 | 5 | 1 + 35 | 9 | 1 + 35 | 1 | 1 + 45 | 6 | 2 + 45 | 2 | 2 + 33 | 3 | 3 + 33 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between 0 preceding and 0 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 12 | 0 | 0 + 12 | 8 | 0 + 12 | 4 | 0 + 15 | 5 | 1 + 15 | 9 | 1 + 15 | 1 | 1 + 8 | 6 | 2 + 8 | 2 | 2 + 10 | 3 | 3 + 10 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude current row), unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 27 | 0 | 0 + 19 | 8 | 0 + 23 | 4 | 0 + 30 | 5 | 1 + 26 | 9 | 1 + 34 | 1 | 1 + 39 | 6 | 2 + 43 | 2 | 2 + 30 | 3 | 3 + 26 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude group), unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 15 | 0 | 0 + 15 | 8 | 0 + 15 | 4 | 0 + 20 | 5 | 1 + 20 | 9 | 1 + 20 | 1 | 1 + 37 | 6 | 2 + 37 | 2 | 2 + 23 | 3 | 3 + 23 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude ties), unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 15 | 0 | 0 + 23 | 8 | 0 + 19 | 4 | 0 + 25 | 5 | 1 + 29 | 9 | 1 + 21 | 1 | 1 + 43 | 6 | 2 + 39 | 2 | 2 + 26 | 3 | 3 + 30 | 7 | 3 +(10 rows) + +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following),unique1, four, ten +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four | ten +-----+---------+------+----- + 0 | 0 | 0 | 0 + 1 | 1 | 1 | 1 + 2 | 2 | 2 | 2 + 3 | 3 | 3 | 3 + 4 | 4 | 0 | 4 + 5 | 5 | 1 | 5 + 6 | 6 | 2 | 6 + 7 | 7 | 3 | 7 + 8 | 8 | 0 | 8 + 9 | 9 | 1 | 9 +(10 rows) + +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude current row), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four | ten +-----+---------+------+----- + | 0 | 0 | 0 + | 1 | 1 | 1 + | 2 | 2 | 2 + | 3 | 3 | 3 + | 4 | 0 | 4 + | 5 | 1 | 5 + | 6 | 2 | 6 + | 7 | 3 | 7 + | 8 | 0 | 8 + | 9 | 1 | 9 +(10 rows) + +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude group), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four | ten +-----+---------+------+----- + | 0 | 0 | 0 + | 1 | 1 | 1 + | 2 | 2 | 2 + | 3 | 3 | 3 + | 4 | 0 | 4 + | 5 | 1 | 5 + | 6 | 2 | 6 + | 7 | 3 | 7 + | 8 | 0 | 8 + | 9 | 1 | 9 +(10 rows) + +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude ties), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four | ten +-----+---------+------+----- + 0 | 0 | 0 | 0 + 1 | 1 | 1 | 1 + 2 | 2 | 2 | 2 + 3 | 3 | 3 | 3 + 4 | 4 | 0 | 4 + 5 | 5 | 1 | 5 + 6 | 6 | 2 | 6 + 7 | 7 | 3 | 7 + 8 | 8 | 0 | 8 + 9 | 9 | 1 | 9 +(10 rows) + +select first_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + lead(salary) over(order by enroll_date groups between 1 preceding and 1 following), + nth_value(salary, 1) over(order by enroll_date groups between 1 preceding and 1 following), + salary, enroll_date from empsalary; + first_value | lead | nth_value | salary | enroll_date +-------------+------+-----------+--------+------------- + 5000 | 6000 | 5000 | 5000 | 10-01-2006 + 5000 | 3900 | 5000 | 6000 | 10-01-2006 + 5000 | 4800 | 5000 | 3900 | 12-23-2006 + 3900 | 5200 | 3900 | 4800 | 08-01-2007 + 3900 | 4800 | 3900 | 5200 | 08-01-2007 + 4800 | 5200 | 4800 | 4800 | 08-08-2007 + 4800 | 3500 | 4800 | 5200 | 08-15-2007 + 5200 | 4500 | 5200 | 3500 | 12-10-2007 + 3500 | 4200 | 3500 | 4500 | 01-01-2008 + 3500 | | 3500 | 4200 | 01-01-2008 +(10 rows) + +select last_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + lag(salary) over(order by enroll_date groups between 1 preceding and 1 following), + salary, enroll_date from empsalary; + last_value | lag | salary | enroll_date +------------+------+--------+------------- + 3900 | | 5000 | 10-01-2006 + 3900 | 5000 | 6000 | 10-01-2006 + 5200 | 6000 | 3900 | 12-23-2006 + 4800 | 3900 | 4800 | 08-01-2007 + 4800 | 4800 | 5200 | 08-01-2007 + 5200 | 5200 | 4800 | 08-08-2007 + 3500 | 4800 | 5200 | 08-15-2007 + 4200 | 5200 | 3500 | 12-10-2007 + 4200 | 3500 | 4500 | 01-01-2008 + 4200 | 4500 | 4200 | 01-01-2008 +(10 rows) + +select first_value(salary) over(order by enroll_date groups between 1 following and 3 following + exclude current row), + lead(salary) over(order by enroll_date groups between 1 following and 3 following exclude ties), + nth_value(salary, 1) over(order by enroll_date groups between 1 following and 3 following + exclude ties), + salary, enroll_date from empsalary; + first_value | lead | nth_value | salary | enroll_date +-------------+------+-----------+--------+------------- + 3900 | 6000 | 3900 | 5000 | 10-01-2006 + 3900 | 3900 | 3900 | 6000 | 10-01-2006 + 4800 | 4800 | 4800 | 3900 | 12-23-2006 + 4800 | 5200 | 4800 | 4800 | 08-01-2007 + 4800 | 4800 | 4800 | 5200 | 08-01-2007 + 5200 | 5200 | 5200 | 4800 | 08-08-2007 + 3500 | 3500 | 3500 | 5200 | 08-15-2007 + 4500 | 4500 | 4500 | 3500 | 12-10-2007 + | 4200 | | 4500 | 01-01-2008 + | | | 4200 | 01-01-2008 +(10 rows) + +select last_value(salary) over(order by enroll_date groups between 1 following and 3 following + exclude group), + lag(salary) over(order by enroll_date groups between 1 following and 3 following exclude group), + salary, enroll_date from empsalary; + last_value | lag | salary | enroll_date +------------+------+--------+------------- + 4800 | | 5000 | 10-01-2006 + 4800 | 5000 | 6000 | 10-01-2006 + 5200 | 6000 | 3900 | 12-23-2006 + 3500 | 3900 | 4800 | 08-01-2007 + 3500 | 4800 | 5200 | 08-01-2007 + 4200 | 5200 | 4800 | 08-08-2007 + 4200 | 4800 | 5200 | 08-15-2007 + 4200 | 5200 | 3500 | 12-10-2007 + | 3500 | 4500 | 01-01-2008 + | 4500 | 4200 | 01-01-2008 +(10 rows) + +-- Show differences in offset interpretation between ROWS, RANGE, and GROUPS +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x rows between 1 preceding and 1 following); + x | sum +----+----- + 1 | 4 + 3 | 9 + 5 | 15 + 7 | 21 + 9 | 27 + 11 | 33 + 13 | 39 + 15 | 45 + 17 | 51 + 19 | 57 + 21 | 63 + 23 | 69 + 25 | 75 + 27 | 81 + 29 | 87 + 31 | 93 + 33 | 99 + 35 | 68 +(18 rows) + +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x range between 1 preceding and 1 following); + x | sum +----+----- + 1 | 1 + 3 | 3 + 5 | 5 + 7 | 7 + 9 | 9 + 11 | 11 + 13 | 13 + 15 | 15 + 17 | 17 + 19 | 19 + 21 | 21 + 23 | 23 + 25 | 25 + 27 | 27 + 29 | 29 + 31 | 31 + 33 | 33 + 35 | 35 +(18 rows) + +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x groups between 1 preceding and 1 following); + x | sum +----+----- + 1 | 4 + 3 | 9 + 5 | 15 + 7 | 21 + 9 | 27 + 11 | 33 + 13 | 39 + 15 | 45 + 17 | 51 + 19 | 57 + 21 | 63 + 23 | 69 + 25 | 75 + 27 | 81 + 29 | 87 + 31 | 93 + 33 | 99 + 35 | 68 +(18 rows) + +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x rows between 1 preceding and 1 following); + x | sum +----+----- + 1 | 2 + 1 | 3 + 1 | 7 + 5 | 13 + 7 | 21 + 9 | 27 + 11 | 33 + 13 | 39 + 15 | 45 + 17 | 51 + 19 | 57 + 21 | 63 + 23 | 69 + 25 | 75 + 27 | 81 + 29 | 87 + 31 | 93 + 33 | 99 + 35 | 105 + 37 | 111 + 39 | 117 + 41 | 123 + 43 | 129 + 45 | 135 + 47 | 141 + 49 | 96 +(26 rows) + +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x range between 1 preceding and 1 following); + x | sum +----+----- + 1 | 3 + 1 | 3 + 1 | 3 + 5 | 5 + 7 | 7 + 9 | 9 + 11 | 11 + 13 | 13 + 15 | 15 + 17 | 17 + 19 | 19 + 21 | 21 + 23 | 23 + 25 | 25 + 27 | 27 + 29 | 29 + 31 | 31 + 33 | 33 + 35 | 35 + 37 | 37 + 39 | 39 + 41 | 41 + 43 | 43 + 45 | 45 + 47 | 47 + 49 | 49 +(26 rows) + +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x groups between 1 preceding and 1 following); + x | sum +----+----- + 1 | 8 + 1 | 8 + 1 | 8 + 5 | 15 + 7 | 21 + 9 | 27 + 11 | 33 + 13 | 39 + 15 | 45 + 17 | 51 + 19 | 57 + 21 | 63 + 23 | 69 + 25 | 75 + 27 | 81 + 29 | 87 + 31 | 93 + 33 | 99 + 35 | 105 + 37 | 111 + 39 | 117 + 41 | 123 + 43 | 129 + 45 | 135 + 47 | 141 + 49 | 96 +(26 rows) + +-- with UNION +SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 UNION ALL SELECT * FROM tenk2)s LIMIT 0; + count +------- +(0 rows) + +-- check some degenerate cases +create temp table t1 (f1 int, f2 int8); +insert into t1 values (1,1),(1,2),(2,2); +select f1, sum(f1) over (partition by f1 + range between 1 preceding and 1 following) +from t1 where f1 = f2; -- error, must have order by +ERROR: RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column +LINE 1: select f1, sum(f1) over (partition by f1 + ^ +explain (costs off) +select f1, sum(f1) over (partition by f1 order by f2 + range between 1 preceding and 1 following) +from t1 where f1 = f2; + QUERY PLAN +------------------------------------- + WindowAgg + Partition By: f1 + Order By: f2 + -> Sort + Sort Key: f1 + -> Seq Scan on t1 + Filter: (f1 = f2) + Optimizer: Postgres query optimizer +(8 rows) + +select f1, sum(f1) over (partition by f1 order by f2 + range between 1 preceding and 1 following) +from t1 where f1 = f2; + f1 | sum +----+----- + 1 | 1 + 2 | 2 +(2 rows) + +select f1, sum(f1) over (partition by f1, f1 order by f2 + range between 2 preceding and 1 preceding) +from t1 where f1 = f2; + f1 | sum +----+----- + 1 | + 2 | +(2 rows) + +select f1, sum(f1) over (partition by f1, f2 order by f2 + range between 1 following and 2 following) +from t1 where f1 = f2; + f1 | sum +----+----- + 1 | + 2 | +(2 rows) + +select f1, sum(f1) over (partition by f1 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; -- error, must have order by +ERROR: GROUPS mode requires an ORDER BY clause +LINE 1: select f1, sum(f1) over (partition by f1 + ^ +explain (costs off) +select f1, sum(f1) over (partition by f1 order by f2 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; + QUERY PLAN +------------------------------------- + WindowAgg + Partition By: f1 + Order By: f2 + -> Sort + Sort Key: f1 + -> Seq Scan on t1 + Filter: (f1 = f2) + Optimizer: Postgres query optimizer +(8 rows) + +select f1, sum(f1) over (partition by f1 order by f2 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; + f1 | sum +----+----- + 1 | 1 + 2 | 2 +(2 rows) + +select f1, sum(f1) over (partition by f1, f1 order by f2 + groups between 2 preceding and 1 preceding) +from t1 where f1 = f2; + f1 | sum +----+----- + 1 | + 2 | +(2 rows) + +select f1, sum(f1) over (partition by f1, f2 order by f2 + groups between 1 following and 2 following) +from t1 where f1 = f2; + f1 | sum +----+----- + 1 | + 2 | +(2 rows) + +-- ordering by a non-integer constant is allowed +SELECT rank() OVER (ORDER BY length('abc')); + rank +------ + 1 +(1 row) + +-- can't order by another window function +SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random())); +ERROR: window functions are not allowed in window definitions +LINE 1: SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random())... + ^ +-- some other errors +SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY salary) < 10; +ERROR: window functions are not allowed in WHERE +LINE 1: SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY sa... + ^ +SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVER (ORDER BY salary) < 10; +ERROR: window functions are not allowed in JOIN conditions +LINE 1: SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVE... + ^ +SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GROUP BY 1; +ERROR: window functions are not allowed in GROUP BY +LINE 1: SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GRO... + ^ +SELECT * FROM rank() OVER (ORDER BY random()); +ERROR: syntax error at or near "ORDER" +LINE 1: SELECT * FROM rank() OVER (ORDER BY random()); + ^ +DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10; +ERROR: window functions are not allowed in WHERE +LINE 1: DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())... + ^ +DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random()); +ERROR: window functions are not allowed in RETURNING +LINE 1: DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random... + ^ +SELECT count(*) OVER w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY unique1); +ERROR: window "w" is already defined +LINE 1: ...w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY ... + ^ +SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM tenk1; +ERROR: syntax error at or near "ORDER" +LINE 1: SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM te... + ^ +-- Not allowed in PostgreSQL, but is allowed in GPDB for backwards-compatibility. +-- Added LIMIT to reduce the size of the output. +SELECT count() OVER () FROM tenk1 limit 5; + count +------- + 10000 + 10000 + 10000 + 10000 + 10000 +(5 rows) + +SELECT generate_series(1, 100) OVER () FROM empsalary; +ERROR: OVER specified, but generate_series is not a window function nor an aggregate function +LINE 1: SELECT generate_series(1, 100) OVER () FROM empsalary; + ^ +SELECT ntile(0) OVER (ORDER BY ten), ten, four FROM tenk1; +ERROR: argument of ntile must be greater than zero +SELECT nth_value(four, 0) OVER (ORDER BY ten), ten, four FROM tenk1; +ERROR: argument of nth_value must be greater than zero +-- filter +SELECT sum(salary), row_number() OVER (ORDER BY depname), sum( + sum(salary) FILTER (WHERE enroll_date > '2007-01-01') +) FILTER (WHERE depname <> 'sales') OVER (ORDER BY depname DESC) AS "filtered_sum", + depname +FROM empsalary GROUP BY depname; + sum | row_number | filtered_sum | depname +-------+------------+--------------+----------- + 25100 | 1 | 22600 | develop + 7400 | 2 | 3500 | personnel + 14600 | 3 | | sales +(3 rows) + +-- Test pushdown of quals into a subquery containing window functions +-- pushdown is safe because all PARTITION BY clauses include depname: +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY depname) depsalary, + min(salary) OVER (PARTITION BY depname || 'A', depname) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; + QUERY PLAN +------------------------------------------------------------------------------------------- + Subquery Scan on emp + -> WindowAgg + Partition By: empsalary.depname + -> WindowAgg + Partition By: (((empsalary.depname)::text || 'A'::text)), empsalary.depname + -> Sort + Sort Key: (((empsalary.depname)::text || 'A'::text)) + -> Seq Scan on empsalary + Filter: ((depname)::text = 'sales'::text) + Optimizer: Postgres query optimizer +(10 rows) + +-- pushdown is unsafe because there's a PARTITION BY clause without depname: +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY enroll_date) enroll_salary, + min(salary) OVER (PARTITION BY depname) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; + QUERY PLAN +------------------------------------------------------- + Subquery Scan on emp + Filter: ((emp.depname)::text = 'sales'::text) + -> WindowAgg + Partition By: empsalary.enroll_date + -> Sort + Sort Key: empsalary.enroll_date + -> WindowAgg + Partition By: empsalary.depname + -> Sort + Sort Key: empsalary.depname + -> Seq Scan on empsalary + Optimizer: Postgres query optimizer +(12 rows) + +-- Test Sort node collapsing +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY depname order by empno) depsalary, + min(salary) OVER (PARTITION BY depname, empno order by enroll_date) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; + QUERY PLAN +---------------------------------------------------------------------- + Subquery Scan on emp + -> WindowAgg + Partition By: empsalary.depname + Order By: empsalary.empno + -> WindowAgg + Partition By: empsalary.depname, empsalary.empno + Order By: empsalary.enroll_date + -> Sort + Sort Key: empsalary.empno, empsalary.enroll_date + -> Seq Scan on empsalary + Filter: ((depname)::text = 'sales'::text) + Optimizer: Postgres query optimizer +(12 rows) + +-- Test Sort node reordering +EXPLAIN (COSTS OFF) +SELECT + lead(1) OVER (PARTITION BY depname ORDER BY salary, enroll_date), + lag(1) OVER (PARTITION BY depname ORDER BY salary,enroll_date,empno) +FROM empsalary; + QUERY PLAN +------------------------------------------------------------- + WindowAgg + Partition By: depname + Order By: salary, enroll_date + -> WindowAgg + Partition By: depname + Order By: salary, enroll_date, empno + -> Sort + Sort Key: depname, salary, enroll_date, empno + -> Seq Scan on empsalary + Optimizer: Postgres query optimizer +(10 rows) + +-- Test incremental sorting +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + empno, + salary, + enroll_date, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date) AS first_emp, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date DESC) AS last_emp + FROM empsalary) emp +WHERE first_emp = 1 OR last_emp = 1; + QUERY PLAN +----------------------------------------------------------------------------------- + Subquery Scan on emp + Filter: ((emp.first_emp = 1) OR (emp.last_emp = 1)) + -> WindowAgg + Partition By: empsalary.depname + Order By: empsalary.enroll_date + -> Incremental Sort + Sort Key: empsalary.depname, empsalary.enroll_date + Presorted Key: empsalary.depname + -> WindowAgg + Partition By: empsalary.depname + Order By: empsalary.enroll_date + -> Sort + Sort Key: empsalary.depname, empsalary.enroll_date DESC + -> Seq Scan on empsalary + Optimizer: Postgres query optimizer +(15 rows) + +SELECT * FROM + (SELECT depname, + empno, + salary, + enroll_date, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date) AS first_emp, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date DESC) AS last_emp + FROM empsalary) emp +WHERE first_emp = 1 OR last_emp = 1; + depname | empno | salary | enroll_date | first_emp | last_emp +-----------+-------+--------+-------------+-----------+---------- + develop | 8 | 6000 | 10-01-2006 | 1 | 5 + develop | 7 | 4200 | 01-01-2008 | 5 | 1 + personnel | 2 | 3900 | 12-23-2006 | 1 | 2 + personnel | 5 | 3500 | 12-10-2007 | 2 | 1 + sales | 1 | 5000 | 10-01-2006 | 1 | 3 + sales | 4 | 4800 | 08-08-2007 | 3 | 1 +(6 rows) + +-- cleanup +DROP TABLE empsalary; +-- test user-defined window function with named args and default args +CREATE FUNCTION nth_value_def(val anyelement, n integer = 1) RETURNS anyelement + LANGUAGE internal WINDOW IMMUTABLE STRICT AS 'window_nth_value'; +SELECT nth_value_def(n := 2, val := ten) OVER (PARTITION BY four), ten, four + FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s; + nth_value_def | ten | four +---------------+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 0 | 4 | 0 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 7 | 1 + 1 | 9 | 1 + | 0 | 2 + 3 | 1 | 3 + 3 | 3 | 3 +(10 rows) + +SELECT nth_value_def(ten) OVER (PARTITION BY four), ten, four + FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s; + nth_value_def | ten | four +---------------+-----+------ + 0 | 0 | 0 + 0 | 0 | 0 + 0 | 4 | 0 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 7 | 1 + 1 | 9 | 1 + 0 | 0 | 2 + 1 | 1 | 3 + 1 | 3 | 3 +(10 rows) + +-- +-- Test the basic moving-aggregate machinery +-- +-- create aggregates that record the series of transform calls (these are +-- intentionally not true inverses) +CREATE FUNCTION logging_sfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT COALESCE($1, '') || '*' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; +CREATE FUNCTION logging_msfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT COALESCE($1, '') || '+' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; +CREATE FUNCTION logging_minvfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '-' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; +CREATE AGGREGATE logging_agg_nonstrict (anyelement) +( + stype = text, + sfunc = logging_sfunc_nonstrict, + mstype = text, + msfunc = logging_msfunc_nonstrict, + minvfunc = logging_minvfunc_nonstrict +); +CREATE AGGREGATE logging_agg_nonstrict_initcond (anyelement) +( + stype = text, + sfunc = logging_sfunc_nonstrict, + mstype = text, + msfunc = logging_msfunc_nonstrict, + minvfunc = logging_minvfunc_nonstrict, + initcond = 'I', + minitcond = 'MI' +); +CREATE FUNCTION logging_sfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '*' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; +CREATE FUNCTION logging_msfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '+' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; +CREATE FUNCTION logging_minvfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '-' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; +CREATE AGGREGATE logging_agg_strict (text) +( + stype = text, + sfunc = logging_sfunc_strict, + mstype = text, + msfunc = logging_msfunc_strict, + minvfunc = logging_minvfunc_strict +); +CREATE AGGREGATE logging_agg_strict_initcond (anyelement) +( + stype = text, + sfunc = logging_sfunc_strict, + mstype = text, + msfunc = logging_msfunc_strict, + minvfunc = logging_minvfunc_strict, + initcond = 'I', + minitcond = 'MI' +); +-- test strict and non-strict cases +SELECT + p::text || ',' || i::text || ':' || COALESCE(v::text, 'NULL') AS row, + logging_agg_nonstrict(v) over wnd as nstrict, + logging_agg_nonstrict_initcond(v) over wnd as nstrict_init, + logging_agg_strict(v::text) over wnd as strict, + logging_agg_strict_initcond(v) over wnd as strict_init +FROM (VALUES + (1, 1, NULL), + (1, 2, 'a'), + (1, 3, 'b'), + (1, 4, NULL), + (1, 5, NULL), + (1, 6, 'c'), + (2, 1, NULL), + (2, 2, 'x'), + (3, 1, 'z') +) AS t(p, i, v) +WINDOW wnd AS (PARTITION BY P ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY p, i; + row | nstrict | nstrict_init | strict | strict_init +----------+-----------------------------------------------+-------------------------------------------------+-----------+---------------- + 1,1:NULL | +NULL | MI+NULL | | MI + 1,2:a | +NULL+'a' | MI+NULL+'a' | a | MI+'a' + 1,3:b | +NULL+'a'-NULL+'b' | MI+NULL+'a'-NULL+'b' | a+'b' | MI+'a'+'b' + 1,4:NULL | +NULL+'a'-NULL+'b'-'a'+NULL | MI+NULL+'a'-NULL+'b'-'a'+NULL | a+'b'-'a' | MI+'a'+'b'-'a' + 1,5:NULL | +NULL+'a'-NULL+'b'-'a'+NULL-'b'+NULL | MI+NULL+'a'-NULL+'b'-'a'+NULL-'b'+NULL | | MI + 1,6:c | +NULL+'a'-NULL+'b'-'a'+NULL-'b'+NULL-NULL+'c' | MI+NULL+'a'-NULL+'b'-'a'+NULL-'b'+NULL-NULL+'c' | c | MI+'c' + 2,1:NULL | +NULL | MI+NULL | | MI + 2,2:x | +NULL+'x' | MI+NULL+'x' | x | MI+'x' + 3,1:z | +'z' | MI+'z' | z | MI+'z' +(9 rows) + +-- and again, but with filter +SELECT + p::text || ',' || i::text || ':' || + CASE WHEN f THEN COALESCE(v::text, 'NULL') ELSE '-' END as row, + logging_agg_nonstrict(v) filter(where f) over wnd as nstrict_filt, + logging_agg_nonstrict_initcond(v) filter(where f) over wnd as nstrict_init_filt, + logging_agg_strict(v::text) filter(where f) over wnd as strict_filt, + logging_agg_strict_initcond(v) filter(where f) over wnd as strict_init_filt +FROM (VALUES + (1, 1, true, NULL), + (1, 2, false, 'a'), + (1, 3, true, 'b'), + (1, 4, false, NULL), + (1, 5, false, NULL), + (1, 6, false, 'c'), + (2, 1, false, NULL), + (2, 2, true, 'x'), + (3, 1, true, 'z') +) AS t(p, i, f, v) +WINDOW wnd AS (PARTITION BY p ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY p, i; + row | nstrict_filt | nstrict_init_filt | strict_filt | strict_init_filt +----------+--------------+-------------------+-------------+------------------ + 1,1:NULL | +NULL | MI+NULL | | MI + 1,2:- | +NULL | MI+NULL | | MI + 1,3:b | +'b' | MI+'b' | b | MI+'b' + 1,4:- | +'b' | MI+'b' | b | MI+'b' + 1,5:- | | MI | | MI + 1,6:- | | MI | | MI + 2,1:- | | MI | | MI + 2,2:x | +'x' | MI+'x' | x | MI+'x' + 3,1:z | +'z' | MI+'z' | z | MI+'z' +(9 rows) + +-- test that volatile arguments disable moving-aggregate mode +SELECT + i::text || ':' || COALESCE(v::text, 'NULL') as row, + logging_agg_strict(v::text) + over wnd as inverse, + logging_agg_strict(v::text || CASE WHEN random() < 0 then '?' ELSE '' END) + over wnd as noinverse +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY i; + row | inverse | noinverse +-----+---------------+----------- + 1:a | a | a + 2:b | a+'b' | a*'b' + 3:c | a+'b'-'a'+'c' | b*'c' +(3 rows) + +SELECT + i::text || ':' || COALESCE(v::text, 'NULL') as row, + logging_agg_strict(v::text) filter(where true) + over wnd as inverse, + logging_agg_strict(v::text) filter(where random() >= 0) + over wnd as noinverse +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY i; + row | inverse | noinverse +-----+---------------+----------- + 1:a | a | a + 2:b | a+'b' | a*'b' + 3:c | a+'b'-'a'+'c' | b*'c' +(3 rows) + +-- test that non-overlapping windows don't use inverse transitions +SELECT + logging_agg_strict(v::text) OVER wnd +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN CURRENT ROW AND CURRENT ROW) +ORDER BY i; + logging_agg_strict +-------------------- + a + b + c +(3 rows) + +-- test that returning NULL from the inverse transition functions +-- restarts the aggregation from scratch. The second aggregate is supposed +-- to test cases where only some aggregates restart, the third one checks +-- that one aggregate restarting doesn't cause others to restart. +CREATE FUNCTION sum_int_randrestart_minvfunc(int4, int4) RETURNS int4 AS +$$ SELECT CASE WHEN random() < 0.2 THEN NULL ELSE $1 - $2 END $$ +LANGUAGE SQL STRICT; +CREATE AGGREGATE sum_int_randomrestart (int4) +( + stype = int4, + sfunc = int4pl, + mstype = int4, + msfunc = int4pl, + minvfunc = sum_int_randrestart_minvfunc +); +-- In PostgreSQL, the 'vs' CTE is constructed using random() and +-- generate_series(), but GPDB inlines CTEs even when they contain volatile +-- expressions, causing incorrect results. That's a bug in GPDB, of course, +-- but for the purposes of this test, we work around that by using a +-- non-volatile WITH clause. The list of values below was created by running +-- the original subquery using random() once, and copying the result here. +-- +-- See https://github.com/greenplum-db/gpdb/issues/1349 +WITH +vs (i, v) AS ( +VALUES + ( 1, 18), + ( 2, 91), + ( 3, 62), + ( 4, 34), + ( 5, 12), + ( 6, 99), + ( 7, 4), + ( 8, 32), + ( 9, 75), + (10, 38), + (11, 0), + (12, 43), + (13, 95), + (14, 83), + (15, 99), + (16, 44), + (17, 27), + (18, 11), + (19, 27), + (20, 19), + (21, 71), + (22, 52), + (23, 49), + (24, 58), + (25, 35), + (26, 66), + (27, 12), + (28, 49), + (29, 9), + (30, 89), + (31, 7), + (32, 27), + (33, 80), + (34, 69), + (35, 61), + (36, 92), + (37, 68), + (38, 65), + (39, 23), + (40, 43), + (41, 3), + (42, 24), + (43, 86), + (44, 98), + (45, 6), + (46, 85), + (47, 42), + (48, 33), + (49, 96), + (50, 68), + (51, 52), + (52, 67), + (53, 20), + (54, 1), + (55, 25), + (56, 55), + (57, 67), + (58, 37), + (59, 4), + (60, 76), + (61, 26), + (62, 11), + (63, 3), + (64, 6), + (65, 80), + (66, 64), + (67, 98), + (68, 48), + (69, 29), + (70, 21), + (71, 91), + (72, 31), + (73, 45), + (74, 77), + (75, 29), + (76, 51), + (77, 63), + (78, 71), + (79, 84), + (80, 59), + (81, 39), + (82, 36), + (83, 26), + (84, 60), + (85, 37), + (86, 51), + (87, 15), + (88, 4), + (89, 88), + (90, 19), + (91, 80), + (92, 14), + (93, 30), + (94, 83), + (95, 20), + (96, 10), + (97, 47), + (98, 18), + (99, 58), +(100, 75) +), +sum_following AS ( + SELECT i, SUM(v) OVER + (ORDER BY i DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS s + FROM vs +) +SELECT DISTINCT + sum_following.s = sum_int_randomrestart(v) OVER fwd AS eq1, + -sum_following.s = sum_int_randomrestart(-v) OVER fwd AS eq2, + 100*3+(vs.i-1)*3 = length(logging_agg_nonstrict(''::text) OVER fwd) AS eq3 +FROM vs +JOIN sum_following ON sum_following.i = vs.i +WINDOW fwd AS ( + ORDER BY vs.i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING +); + eq1 | eq2 | eq3 +-----+-----+----- + t | t | t +(1 row) + +-- +-- Test various built-in aggregates that have moving-aggregate support +-- +-- test inverse transition functions handle NULLs properly +SELECT i,AVG(v::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | avg +---+-------------------- + 1 | 1.5000000000000000 + 2 | 2.0000000000000000 + 3 | + 4 | +(4 rows) + +SELECT i,AVG(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | avg +---+-------------------- + 1 | 1.5000000000000000 + 2 | 2.0000000000000000 + 3 | + 4 | +(4 rows) + +SELECT i,AVG(v::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | avg +---+-------------------- + 1 | 1.5000000000000000 + 2 | 2.0000000000000000 + 3 | + 4 | +(4 rows) + +SELECT i,AVG(v::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1.5),(2,2.5),(3,NULL),(4,NULL)) t(i,v); + i | avg +---+-------------------- + 1 | 2.0000000000000000 + 2 | 2.5000000000000000 + 3 | + 4 | +(4 rows) + +SELECT i,AVG(v::interval) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,'1 sec'),(2,'2 sec'),(3,NULL),(4,NULL)) t(i,v); + i | avg +---+------------ + 1 | @ 1.5 secs + 2 | @ 2 secs + 3 | + 4 | +(4 rows) + +SELECT i,SUM(v::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | sum +---+----- + 1 | 3 + 2 | 2 + 3 | + 4 | +(4 rows) + +SELECT i,SUM(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | sum +---+----- + 1 | 3 + 2 | 2 + 3 | + 4 | +(4 rows) + +SELECT i,SUM(v::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | sum +---+----- + 1 | 3 + 2 | 2 + 3 | + 4 | +(4 rows) + +SELECT i,SUM(v::money) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,'1.10'),(2,'2.20'),(3,NULL),(4,NULL)) t(i,v); + i | sum +---+------- + 1 | $3.30 + 2 | $2.20 + 3 | + 4 | +(4 rows) + +SELECT i,SUM(v::interval) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,'1 sec'),(2,'2 sec'),(3,NULL),(4,NULL)) t(i,v); + i | sum +---+---------- + 1 | @ 3 secs + 2 | @ 2 secs + 3 | + 4 | +(4 rows) + +SELECT i,SUM(v::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1.1),(2,2.2),(3,NULL),(4,NULL)) t(i,v); + i | sum +---+----- + 1 | 3.3 + 2 | 2.2 + 3 | + 4 | +(4 rows) + +SELECT SUM(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1.01),(2,2),(3,3)) v(i,n); + sum +------ + 6.01 + 5 + 3 +(3 rows) + +SELECT i,COUNT(v) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | count +---+------- + 1 | 2 + 2 | 1 + 3 | 0 + 4 | 0 +(4 rows) + +SELECT i,COUNT(*) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | count +---+------- + 1 | 4 + 2 | 3 + 3 | 2 + 4 | 1 +(4 rows) + +SELECT VAR_POP(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + var_pop +----------------------- + 21704.000000000000 + 13868.750000000000 + 11266.666666666667 + 4225.0000000000000000 + 0 +(5 rows) + +SELECT VAR_POP(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + var_pop +----------------------- + 21704.000000000000 + 13868.750000000000 + 11266.666666666667 + 4225.0000000000000000 + 0 +(5 rows) + +SELECT VAR_POP(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + var_pop +----------------------- + 21704.000000000000 + 13868.750000000000 + 11266.666666666667 + 4225.0000000000000000 + 0 +(5 rows) + +SELECT VAR_POP(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + var_pop +----------------------- + 21704.000000000000 + 13868.750000000000 + 11266.666666666667 + 4225.0000000000000000 + 0 +(5 rows) + +SELECT VAR_SAMP(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + var_samp +----------------------- + 27130.000000000000 + 18491.666666666667 + 16900.000000000000 + 8450.0000000000000000 + +(5 rows) + +SELECT VAR_SAMP(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + var_samp +----------------------- + 27130.000000000000 + 18491.666666666667 + 16900.000000000000 + 8450.0000000000000000 + +(5 rows) + +SELECT VAR_SAMP(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + var_samp +----------------------- + 27130.000000000000 + 18491.666666666667 + 16900.000000000000 + 8450.0000000000000000 + +(5 rows) + +SELECT VAR_SAMP(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + var_samp +----------------------- + 27130.000000000000 + 18491.666666666667 + 16900.000000000000 + 8450.0000000000000000 + +(5 rows) + +SELECT VARIANCE(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + variance +----------------------- + 27130.000000000000 + 18491.666666666667 + 16900.000000000000 + 8450.0000000000000000 + +(5 rows) + +SELECT VARIANCE(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + variance +----------------------- + 27130.000000000000 + 18491.666666666667 + 16900.000000000000 + 8450.0000000000000000 + +(5 rows) + +SELECT VARIANCE(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + variance +----------------------- + 27130.000000000000 + 18491.666666666667 + 16900.000000000000 + 8450.0000000000000000 + +(5 rows) + +SELECT VARIANCE(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + variance +----------------------- + 27130.000000000000 + 18491.666666666667 + 16900.000000000000 + 8450.0000000000000000 + +(5 rows) + +SELECT STDDEV_POP(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + stddev_pop +--------------------- + 147.322774885623 + 147.322774885623 + 117.765657133139 + 106.144555520604 + 65.0000000000000000 + 0 +(6 rows) + +SELECT STDDEV_POP(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + stddev_pop +--------------------- + 147.322774885623 + 147.322774885623 + 117.765657133139 + 106.144555520604 + 65.0000000000000000 + 0 +(6 rows) + +SELECT STDDEV_POP(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + stddev_pop +--------------------- + 147.322774885623 + 147.322774885623 + 117.765657133139 + 106.144555520604 + 65.0000000000000000 + 0 +(6 rows) + +SELECT STDDEV_POP(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + stddev_pop +--------------------- + 147.322774885623 + 147.322774885623 + 117.765657133139 + 106.144555520604 + 65.0000000000000000 + 0 +(6 rows) + +SELECT STDDEV_SAMP(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + stddev_samp +--------------------- + 164.711869639076 + 164.711869639076 + 135.984067694222 + 130.000000000000 + 91.9238815542511782 + +(6 rows) + +SELECT STDDEV_SAMP(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + stddev_samp +--------------------- + 164.711869639076 + 164.711869639076 + 135.984067694222 + 130.000000000000 + 91.9238815542511782 + +(6 rows) + +SELECT STDDEV_SAMP(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + stddev_samp +--------------------- + 164.711869639076 + 164.711869639076 + 135.984067694222 + 130.000000000000 + 91.9238815542511782 + +(6 rows) + +SELECT STDDEV_SAMP(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + stddev_samp +--------------------- + 164.711869639076 + 164.711869639076 + 135.984067694222 + 130.000000000000 + 91.9238815542511782 + +(6 rows) + +SELECT STDDEV(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(0,NULL),(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + stddev +--------------------- + 164.711869639076 + 164.711869639076 + 135.984067694222 + 130.000000000000 + 91.9238815542511782 + +(6 rows) + +SELECT STDDEV(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(0,NULL),(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + stddev +--------------------- + 164.711869639076 + 164.711869639076 + 135.984067694222 + 130.000000000000 + 91.9238815542511782 + +(6 rows) + +SELECT STDDEV(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(0,NULL),(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + stddev +--------------------- + 164.711869639076 + 164.711869639076 + 135.984067694222 + 130.000000000000 + 91.9238815542511782 + +(6 rows) + +SELECT STDDEV(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(0,NULL),(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + stddev +--------------------- + 164.711869639076 + 164.711869639076 + 135.984067694222 + 130.000000000000 + 91.9238815542511782 + +(6 rows) + +-- test that inverse transition functions work with various frame options +SELECT i,SUM(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND CURRENT ROW) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | sum +---+----- + 1 | 1 + 2 | 2 + 3 | + 4 | +(4 rows) + +SELECT i,SUM(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + i | sum +---+----- + 1 | 3 + 2 | 2 + 3 | + 4 | +(4 rows) + +SELECT i,SUM(v::int) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,3),(4,4)) t(i,v); + i | sum +---+----- + 1 | 3 + 2 | 6 + 3 | 9 + 4 | 7 +(4 rows) + +-- ensure aggregate over numeric properly recovers from NaN values +SELECT a, b, + SUM(b) OVER(ORDER BY A ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +FROM (VALUES(1,1::numeric),(2,2),(3,'NaN'),(4,3),(5,4)) t(a,b); + a | b | sum +---+-----+----- + 1 | 1 | 1 + 2 | 2 | 3 + 3 | NaN | NaN + 4 | 3 | NaN + 5 | 4 | 7 +(5 rows) + +-- It might be tempting for someone to add an inverse trans function for +-- float and double precision. This should not be done as it can give incorrect +-- results. This test should fail if anyone ever does this without thinking too +-- hard about it. +SELECT to_char(SUM(n::float8) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING),'999999999999999999999D9') + FROM (VALUES(1,1e20),(2,1)) n(i,n); + to_char +-------------------------- + 100000000000000000000 + 1.0 +(2 rows) + +SELECT i, b, bool_and(b) OVER w, bool_or(b) OVER w + FROM (VALUES (1,true), (2,true), (3,false), (4,false), (5,true)) v(i,b) + WINDOW w AS (ORDER BY i ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING); + i | b | bool_and | bool_or +---+---+----------+--------- + 1 | t | t | t + 2 | t | f | t + 3 | f | f | f + 4 | f | f | t + 5 | t | t | t +(5 rows) + +-- Tests for problems with failure to walk or mutate expressions +-- within window frame clauses. +-- test walker (fails with collation error if expressions are not walked) +SELECT array_agg(i) OVER w + FROM generate_series(1,5) i +WINDOW w AS (ORDER BY i ROWS BETWEEN (('foo' < 'foobar')::integer) PRECEDING AND CURRENT ROW); + array_agg +----------- + {1} + {1,2} + {2,3} + {3,4} + {4,5} +(5 rows) + +-- test mutator (fails when inlined if expressions are not mutated) +CREATE FUNCTION pg_temp.f(group_size BIGINT) RETURNS SETOF integer[] +AS $$ + SELECT array_agg(s) OVER w + FROM generate_series(1,5) s + WINDOW w AS (ORDER BY s ROWS BETWEEN CURRENT ROW AND GROUP_SIZE FOLLOWING) +$$ LANGUAGE SQL STABLE; +EXPLAIN (costs off) SELECT * FROM pg_temp.f(2); + QUERY PLAN +------------------------------------------------------ + Subquery Scan on f + -> WindowAgg + Order By: s.s + -> Sort + Sort Key: s.s + -> Function Scan on generate_series s + Optimizer: Postgres query optimizer +(7 rows) + +SELECT * FROM pg_temp.f(2); + f +--------- + {1,2,3} + {2,3,4} + {3,4,5} + {4,5} + {5} +(5 rows) + diff --git a/src/test/singlenode_regress/expected/with.out b/src/test/singlenode_regress/expected/with.out new file mode 100644 index 00000000000..da0602e6557 --- /dev/null +++ b/src/test/singlenode_regress/expected/with.out @@ -0,0 +1,3232 @@ +-- +-- Tests for common table expressions (WITH query, ... SELECT ...) +-- +--start_ignore +set gp_cte_sharing to on; +--end_ignore +-- Basic WITH +WITH q1(x,y) AS (SELECT 1,2) +SELECT * FROM q1, q1 AS q2; + x | y | x | y +---+---+---+--- + 1 | 2 | 1 | 2 +(1 row) + +-- Multiple uses are evaluated only once +SELECT count(*) FROM ( + WITH q1(x) AS (SELECT random() FROM generate_series(1, 5)) + SELECT * FROM q1 + UNION + SELECT * FROM q1 +) ss; + count +------- + 5 +(1 row) + +-- WITH RECURSIVE +-- sum of 1..100 +WITH RECURSIVE t(n) AS ( + VALUES (1) +UNION ALL + SELECT n+1 FROM t WHERE n < 100 +) +SELECT sum(n) FROM t; + sum +------ + 5050 +(1 row) + +WITH RECURSIVE t(n) AS ( + SELECT (VALUES(1)) +UNION ALL + SELECT n+1 FROM t WHERE n < 5 +) +SELECT * FROM t; + n +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) + +-- UNION DISTINCT requires hashable type +WITH RECURSIVE t(n) AS ( + VALUES (1::money) +UNION + SELECT n+1::money FROM t WHERE n < 100::money +) +SELECT sum(n) FROM t; +ERROR: could not implement recursive UNION +DETAIL: All column datatypes must be hashable. +-- recursive view +CREATE RECURSIVE VIEW nums (n) AS + VALUES (1) +UNION ALL + SELECT n+1 FROM nums WHERE n < 5; +SELECT * FROM nums; + n +--- + 1 + 2 + 3 + 4 + 5 +(5 rows) + +CREATE OR REPLACE RECURSIVE VIEW nums (n) AS + VALUES (1) +UNION ALL + SELECT n+1 FROM nums WHERE n < 6; +SELECT * FROM nums; + n +--- + 1 + 2 + 3 + 4 + 5 + 6 +(6 rows) + +-- This is an infinite loop with UNION ALL, but not with UNION +WITH RECURSIVE t(n) AS ( + SELECT 1 +UNION + SELECT 10-n FROM t) +SELECT * FROM t; + n +--- + 1 + 9 +(2 rows) + +-- This'd be an infinite loop, but outside query reads only as much as needed +WITH RECURSIVE t(n) AS ( + VALUES (1) +UNION ALL + SELECT n+1 FROM t) +SELECT * FROM t LIMIT 10; + n +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +-- UNION case should have same property +WITH RECURSIVE t(n) AS ( + SELECT 1 +UNION + SELECT n+1 FROM t) +SELECT * FROM t LIMIT 10; + n +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +-- Test behavior with an unknown-type literal in the WITH +WITH q AS (SELECT 'foo' AS x) +SELECT x, pg_typeof(x) FROM q; + x | pg_typeof +-----+----------- + foo | text +(1 row) + +WITH RECURSIVE t(n) AS ( + SELECT 'foo' +UNION ALL + SELECT n || ' bar' FROM t WHERE length(n) < 20 +) +SELECT n, pg_typeof(n) FROM t; + n | pg_typeof +-------------------------+----------- + foo | text + foo bar | text + foo bar bar | text + foo bar bar bar | text + foo bar bar bar bar | text + foo bar bar bar bar bar | text +(6 rows) + +-- In a perfect world, this would work and resolve the literal as int ... +-- but for now, we have to be content with resolving to text too soon. +WITH RECURSIVE t(n) AS ( + SELECT '7' +UNION ALL + SELECT n+1 FROM t WHERE n < 10 +) +SELECT n, pg_typeof(n) FROM t; +ERROR: operator does not exist: text + integer +LINE 4: SELECT n+1 FROM t WHERE n < 10 + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- Deeply nested WITH caused a list-munging problem in v13 +-- Detection of cross-references and self-references +WITH RECURSIVE w1(c1) AS + (WITH w2(c2) AS + (WITH w3(c3) AS + (WITH w4(c4) AS + (WITH w5(c5) AS + (WITH RECURSIVE w6(c6) AS + (WITH w6(c6) AS + (WITH w8(c8) AS + (SELECT 1) + SELECT * FROM w8) + SELECT * FROM w6) + SELECT * FROM w6) + SELECT * FROM w5) + SELECT * FROM w4) + SELECT * FROM w3) + SELECT * FROM w2) +SELECT * FROM w1; + c1 +---- + 1 +(1 row) + +-- Detection of invalid self-references +WITH RECURSIVE outermost(x) AS ( + SELECT 1 + UNION (WITH innermost1 AS ( + SELECT 2 + UNION (WITH innermost2 AS ( + SELECT 3 + UNION (WITH innermost3 AS ( + SELECT 4 + UNION (WITH innermost4 AS ( + SELECT 5 + UNION (WITH innermost5 AS ( + SELECT 6 + UNION (WITH innermost6 AS + (SELECT 7) + SELECT * FROM innermost6)) + SELECT * FROM innermost5)) + SELECT * FROM innermost4)) + SELECT * FROM innermost3)) + SELECT * FROM innermost2)) + SELECT * FROM outermost + UNION SELECT * FROM innermost1) + ) + SELECT * FROM outermost ORDER BY 1; + x +--- + 1 + 2 + 3 + 4 + 5 + 6 + 7 +(7 rows) + +-- +-- Some examples with a tree +-- +-- department structure represented here is as follows: +-- +-- ROOT-+->A-+->B-+->C +-- | | +-- | +->D-+->F +-- +->E-+->G +CREATE TEMP TABLE department ( + id INTEGER PRIMARY KEY, -- department ID + parent_department INTEGER REFERENCES department, -- upper department ID + name TEXT -- department name +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO department VALUES (0, NULL, 'ROOT'); +INSERT INTO department VALUES (1, 0, 'A'); +INSERT INTO department VALUES (2, 1, 'B'); +INSERT INTO department VALUES (3, 2, 'C'); +INSERT INTO department VALUES (4, 2, 'D'); +INSERT INTO department VALUES (5, 0, 'E'); +INSERT INTO department VALUES (6, 4, 'F'); +INSERT INTO department VALUES (7, 5, 'G'); +-- GPDB: Some of the queries below will return non-deterministic results +-- because of moving rows across segments. This table is the same, except that +-- all the rows reside on a single segment, so that you get consistent results. +CREATE TEMP TABLE department_oneseg AS SELECT 1 AS distkey, * FROM department; +-- extract all departments under 'A'. Result should be A, B, C, D and F +WITH RECURSIVE subdepartment AS +( + -- non recursive term + SELECT name as root_name, * FROM department WHERE name = 'A' + UNION ALL + -- recursive term + SELECT sd.root_name, d.* FROM department AS d, subdepartment AS sd + WHERE d.parent_department = sd.id +) +SELECT * FROM subdepartment ORDER BY name; + root_name | id | parent_department | name +-----------+----+-------------------+------ + A | 1 | 0 | A + A | 2 | 1 | B + A | 3 | 2 | C + A | 4 | 2 | D + A | 6 | 4 | F +(5 rows) + +-- extract all departments under 'A' with "level" number +WITH RECURSIVE subdepartment(level, id, parent_department, name) AS +( + -- non recursive term + SELECT 1, * FROM department WHERE name = 'A' + UNION ALL + -- recursive term + SELECT sd.level + 1, d.* FROM department AS d, subdepartment AS sd + WHERE d.parent_department = sd.id +) +SELECT * FROM subdepartment ORDER BY name; + level | id | parent_department | name +-------+----+-------------------+------ + 1 | 1 | 0 | A + 2 | 2 | 1 | B + 3 | 3 | 2 | C + 3 | 4 | 2 | D + 4 | 6 | 4 | F +(5 rows) + +-- extract all departments under 'A' with "level" number. +-- Only shows level 2 or more +WITH RECURSIVE subdepartment(level, id, parent_department, name) AS +( + -- non recursive term + SELECT 1, * FROM department WHERE name = 'A' + UNION ALL + -- recursive term + SELECT sd.level + 1, d.* FROM department AS d, subdepartment AS sd + WHERE d.parent_department = sd.id +) +SELECT * FROM subdepartment WHERE level >= 2 ORDER BY name; + level | id | parent_department | name +-------+----+-------------------+------ + 2 | 2 | 1 | B + 3 | 3 | 2 | C + 3 | 4 | 2 | D + 4 | 6 | 4 | F +(4 rows) + +-- "RECURSIVE" is ignored if the query has no self-reference +WITH RECURSIVE subdepartment AS +( + -- note lack of recursive UNION structure + SELECT * FROM department WHERE name = 'A' +) +SELECT * FROM subdepartment ORDER BY name; + id | parent_department | name +----+-------------------+------ + 1 | 0 | A +(1 row) + +-- inside subqueries +SELECT count(*) FROM ( + WITH RECURSIVE t(n) AS ( + SELECT 1 UNION ALL SELECT n + 1 FROM t WHERE n < 500 + ) + SELECT * FROM t) AS t WHERE n < ( + SELECT count(*) FROM ( + WITH RECURSIVE t(n) AS ( + SELECT 1 UNION ALL SELECT n + 1 FROM t WHERE n < 100 + ) + SELECT * FROM t WHERE n < 50000 + ) AS t WHERE n < 100); + count +------- + 98 +(1 row) + +-- use same CTE twice at different subquery levels +WITH q1(x,y) AS ( + SELECT hundred, sum(ten) FROM tenk1 GROUP BY hundred + ) +SELECT count(*) FROM q1 WHERE y > (SELECT sum(y)/100 FROM q1 qsub); + count +------- + 50 +(1 row) + +-- via a VIEW +CREATE TEMPORARY VIEW vsubdepartment AS + WITH RECURSIVE subdepartment AS + ( + -- non recursive term + SELECT * FROM department WHERE name = 'A' + UNION ALL + -- recursive term + SELECT d.* FROM department AS d, subdepartment AS sd + WHERE d.parent_department = sd.id + ) + SELECT * FROM subdepartment; +SELECT * FROM vsubdepartment ORDER BY name; + id | parent_department | name +----+-------------------+------ + 1 | 0 | A + 2 | 1 | B + 3 | 2 | C + 4 | 2 | D + 6 | 4 | F +(5 rows) + +-- Check reverse listing +SELECT pg_get_viewdef('vsubdepartment'::regclass); + pg_get_viewdef +----------------------------------------------- + WITH RECURSIVE subdepartment AS ( + + SELECT department.id, + + department.parent_department, + + department.name + + FROM department + + WHERE (department.name = 'A'::text)+ + UNION ALL + + SELECT d.id, + + d.parent_department, + + d.name + + FROM department d, + + subdepartment sd + + WHERE (d.parent_department = sd.id)+ + ) + + SELECT subdepartment.id, + + subdepartment.parent_department, + + subdepartment.name + + FROM subdepartment; +(1 row) + +SELECT pg_get_viewdef('vsubdepartment'::regclass, true); + pg_get_viewdef +--------------------------------------------- + WITH RECURSIVE subdepartment AS ( + + SELECT department.id, + + department.parent_department, + + department.name + + FROM department + + WHERE department.name = 'A'::text+ + UNION ALL + + SELECT d.id, + + d.parent_department, + + d.name + + FROM department d, + + subdepartment sd + + WHERE d.parent_department = sd.id+ + ) + + SELECT subdepartment.id, + + subdepartment.parent_department, + + subdepartment.name + + FROM subdepartment; +(1 row) + +-- Another reverse-listing example +CREATE VIEW sums_1_100 AS +WITH RECURSIVE t(n) AS ( + VALUES (1) +UNION ALL + SELECT n+1 FROM t WHERE n < 100 +) +SELECT sum(n) FROM t; +\d+ sums_1_100 + View "public.sums_1_100" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+--------+-----------+----------+---------+---------+------------- + sum | bigint | | | | plain | +View definition: + WITH RECURSIVE t(n) AS ( + VALUES (1) + UNION ALL + SELECT t_1.n + 1 + FROM t t_1 + WHERE t_1.n < 100 + ) + SELECT sum(t.n) AS sum + FROM t; + +-- corner case in which sub-WITH gets initialized first +with recursive q as ( + select * from department_oneseg + union all + (with x as (select * from q) + select * from x) + ) +select id, parent_department, name from q limit 24; + id | parent_department | name +----+-------------------+------ + 0 | | ROOT + 1 | 0 | A + 2 | 1 | B + 3 | 2 | C + 4 | 2 | D + 5 | 0 | E + 6 | 4 | F + 7 | 5 | G + 0 | | ROOT + 1 | 0 | A + 2 | 1 | B + 3 | 2 | C + 4 | 2 | D + 5 | 0 | E + 6 | 4 | F + 7 | 5 | G + 0 | | ROOT + 1 | 0 | A + 2 | 1 | B + 3 | 2 | C + 4 | 2 | D + 5 | 0 | E + 6 | 4 | F + 7 | 5 | G +(24 rows) + +with recursive q as ( + select * from department_oneseg + union all + (with recursive x as ( + select * from department_oneseg + union all + (select * from q union all select * from x) + ) + select * from x) + ) +select id, parent_department, name from q limit 32; + id | parent_department | name +----+-------------------+------ + 0 | | ROOT + 1 | 0 | A + 2 | 1 | B + 3 | 2 | C + 4 | 2 | D + 5 | 0 | E + 6 | 4 | F + 7 | 5 | G + 0 | | ROOT + 1 | 0 | A + 2 | 1 | B + 3 | 2 | C + 4 | 2 | D + 5 | 0 | E + 6 | 4 | F + 7 | 5 | G + 0 | | ROOT + 1 | 0 | A + 2 | 1 | B + 3 | 2 | C + 4 | 2 | D + 5 | 0 | E + 6 | 4 | F + 7 | 5 | G + 0 | | ROOT + 1 | 0 | A + 2 | 1 | B + 3 | 2 | C + 4 | 2 | D + 5 | 0 | E + 6 | 4 | F + 7 | 5 | G +(32 rows) + +-- recursive term has sub-UNION +WITH RECURSIVE t(i,j) AS ( + VALUES (1,2) + UNION ALL + SELECT t2.i, t.j+1 FROM + (SELECT 2 AS i UNION ALL SELECT 3 AS i) AS t2 + JOIN t ON (t2.i = t.i+1)) + SELECT * FROM t; + i | j +---+--- + 1 | 2 + 2 | 3 + 3 | 4 +(3 rows) + +-- +-- different tree example +-- +CREATE TEMPORARY TABLE tree( + id INTEGER PRIMARY KEY, + parent_id INTEGER REFERENCES tree(id) +); +WARNING: referential integrity (FOREIGN KEY) constraints are not supported in Cloudberry Database, will not be enforced +INSERT INTO tree +VALUES (1, NULL), (2, 1), (3,1), (4,2), (5,2), (6,2), (7,3), (8,3), + (9,4), (10,4), (11,7), (12,7), (13,7), (14, 9), (15,11), (16,11); +-- +-- get all paths from "second level" nodes to leaf nodes +-- +WITH RECURSIVE t(id, path) AS ( + VALUES(1,ARRAY[]::integer[]) +UNION ALL + SELECT tree.id, t.path || tree.id + FROM tree JOIN t ON (tree.parent_id = t.id) +) +SELECT t1.*, t2.* FROM t AS t1 JOIN t AS t2 ON + (t1.path[1] = t2.path[1] AND + array_upper(t1.path,1) = 1 AND + array_upper(t2.path,1) > 1) + ORDER BY t1.id, t2.id; + id | path | id | path +----+------+----+------------- + 2 | {2} | 4 | {2,4} + 2 | {2} | 5 | {2,5} + 2 | {2} | 6 | {2,6} + 2 | {2} | 9 | {2,4,9} + 2 | {2} | 10 | {2,4,10} + 2 | {2} | 14 | {2,4,9,14} + 3 | {3} | 7 | {3,7} + 3 | {3} | 8 | {3,8} + 3 | {3} | 11 | {3,7,11} + 3 | {3} | 12 | {3,7,12} + 3 | {3} | 13 | {3,7,13} + 3 | {3} | 15 | {3,7,11,15} + 3 | {3} | 16 | {3,7,11,16} +(13 rows) + +-- just count 'em +WITH RECURSIVE t(id, path) AS ( + VALUES(1,ARRAY[]::integer[]) +UNION ALL + SELECT tree.id, t.path || tree.id + FROM tree JOIN t ON (tree.parent_id = t.id) +) +SELECT t1.id, count(t2.*) FROM t AS t1 JOIN t AS t2 ON + (t1.path[1] = t2.path[1] AND + array_upper(t1.path,1) = 1 AND + array_upper(t2.path,1) > 1) + GROUP BY t1.id + ORDER BY t1.id; + id | count +----+------- + 2 | 6 + 3 | 7 +(2 rows) + +-- this variant tickled a whole-row-variable bug in 8.4devel +WITH RECURSIVE t(id, path) AS ( + VALUES(1,ARRAY[]::integer[]) +UNION ALL + SELECT tree.id, t.path || tree.id + FROM tree JOIN t ON (tree.parent_id = t.id) +) +SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON +(t1.id=t2.id); + id | path | t2 +----+-------------+-------------------- + 1 | {} | (1,{}) + 2 | {2} | (2,{2}) + 3 | {3} | (3,{3}) + 4 | {2,4} | (4,"{2,4}") + 5 | {2,5} | (5,"{2,5}") + 6 | {2,6} | (6,"{2,6}") + 7 | {3,7} | (7,"{3,7}") + 8 | {3,8} | (8,"{3,8}") + 9 | {2,4,9} | (9,"{2,4,9}") + 10 | {2,4,10} | (10,"{2,4,10}") + 11 | {3,7,11} | (11,"{3,7,11}") + 12 | {3,7,12} | (12,"{3,7,12}") + 13 | {3,7,13} | (13,"{3,7,13}") + 14 | {2,4,9,14} | (14,"{2,4,9,14}") + 15 | {3,7,11,15} | (15,"{3,7,11,15}") + 16 | {3,7,11,16} | (16,"{3,7,11,16}") +(16 rows) + +-- SEARCH clause +create table graph0( f int, t int, label text ); +insert into graph0 values + (1, 2, 'arc 1 -> 2'), + (1, 3, 'arc 1 -> 3'), + (2, 3, 'arc 2 -> 3'), + (1, 4, 'arc 1 -> 4'), + (4, 5, 'arc 4 -> 5'); +explain (verbose, costs off) +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select * from search_graph order by seq; + QUERY PLAN +-------------------------------------------------------------------------------------------- + Sort + Output: g.f, g.t, g.label, (ARRAY[ROW(g.f, g.t)]) + Sort Key: (ARRAY[ROW(g.f, g.t)]) + -> Recursive Union + -> Seq Scan on public.graph0 g + Output: g.f, g.t, g.label, ARRAY[ROW(g.f, g.t)] + -> Hash Join + Output: g_1.f, g_1.t, g_1.label, array_cat(sg.seq, ARRAY[ROW(g_1.f, g_1.t)]) + Hash Cond: (sg.t = g_1.f) + -> WorkTable Scan on search_graph sg + Output: sg.f, sg.t, sg.label, sg.seq + -> Hash + Output: g_1.f, g_1.t, g_1.label + -> Seq Scan on public.graph0 g_1 + Output: g_1.f, g_1.t, g_1.label + Optimizer: Postgres query optimizer +(16 rows) + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select * from search_graph order by seq; + f | t | label | seq +---+---+------------+------------------- + 1 | 2 | arc 1 -> 2 | {"(1,2)"} + 2 | 3 | arc 2 -> 3 | {"(1,2)","(2,3)"} + 1 | 3 | arc 1 -> 3 | {"(1,3)"} + 1 | 4 | arc 1 -> 4 | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | {"(1,4)","(4,5)"} + 2 | 3 | arc 2 -> 3 | {"(2,3)"} + 4 | 5 | arc 4 -> 5 | {"(4,5)"} +(7 rows) + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union distinct + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select * from search_graph order by seq; + f | t | label | seq +---+---+------------+------------------- + 1 | 2 | arc 1 -> 2 | {"(1,2)"} + 2 | 3 | arc 2 -> 3 | {"(1,2)","(2,3)"} + 1 | 3 | arc 1 -> 3 | {"(1,3)"} + 1 | 4 | arc 1 -> 4 | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | {"(1,4)","(4,5)"} + 2 | 3 | arc 2 -> 3 | {"(2,3)"} + 4 | 5 | arc 4 -> 5 | {"(4,5)"} +(7 rows) + +explain (verbose, costs off) +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search breadth first by f, t set seq +select * from search_graph order by seq; + QUERY PLAN +----------------------------------------------------------------------------------------------- + Sort + Output: g.f, g.t, g.label, (ROW('0'::bigint, g.f, g.t)) + Sort Key: (ROW('0'::bigint, g.f, g.t)) + -> Recursive Union + -> Seq Scan on public.graph0 g + Output: g.f, g.t, g.label, ROW('0'::bigint, g.f, g.t) + -> Hash Join + Output: g_1.f, g_1.t, g_1.label, ROW(int8inc((sg.seq)."*DEPTH*"), g_1.f, g_1.t) + Hash Cond: (sg.t = g_1.f) + -> WorkTable Scan on search_graph sg + Output: sg.f, sg.t, sg.label, sg.seq + -> Hash + Output: g_1.f, g_1.t, g_1.label + -> Seq Scan on public.graph0 g_1 + Output: g_1.f, g_1.t, g_1.label + Optimizer: Postgres query optimizer +(16 rows) + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search breadth first by f, t set seq +select * from search_graph order by seq; + f | t | label | seq +---+---+------------+--------- + 1 | 2 | arc 1 -> 2 | (0,1,2) + 1 | 3 | arc 1 -> 3 | (0,1,3) + 1 | 4 | arc 1 -> 4 | (0,1,4) + 2 | 3 | arc 2 -> 3 | (0,2,3) + 4 | 5 | arc 4 -> 5 | (0,4,5) + 2 | 3 | arc 2 -> 3 | (1,2,3) + 4 | 5 | arc 4 -> 5 | (1,4,5) +(7 rows) + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union distinct + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search breadth first by f, t set seq +select * from search_graph order by seq; + f | t | label | seq +---+---+------------+--------- + 1 | 2 | arc 1 -> 2 | (0,1,2) + 1 | 3 | arc 1 -> 3 | (0,1,3) + 1 | 4 | arc 1 -> 4 | (0,1,4) + 2 | 3 | arc 2 -> 3 | (0,2,3) + 4 | 5 | arc 4 -> 5 | (0,4,5) + 2 | 3 | arc 2 -> 3 | (1,2,3) + 4 | 5 | arc 4 -> 5 | (1,4,5) +(7 rows) + +-- various syntax errors +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by foo, tar set seq +select * from search_graph; +ERROR: search column "foo" not in WITH query column list +LINE 7: ) search depth first by foo, tar set seq + ^ +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set label +select * from search_graph; +ERROR: search sequence column name "label" already used in WITH query column list +LINE 7: ) search depth first by f, t set label + ^ +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t, f set seq +select * from search_graph; +ERROR: search column "f" specified more than once +LINE 7: ) search depth first by f, t, f set seq + ^ +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select * from search_graph order by seq; +ERROR: with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + (select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t) +) search depth first by f, t set seq +select * from search_graph order by seq; +ERROR: with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT +-- check that we distinguish same CTE name used at different levels +-- (this case could be supported, perhaps, but it isn't today) +with recursive x(col) as ( + select 1 + union + (with x as (select * from x) + select * from x) +) search depth first by col set seq +select * from x; +ERROR: with a SEARCH or CYCLE clause, the recursive reference to WITH query "x" must be at the top level of its right-hand SELECT +-- test ruleutils and view expansion +create temp view v_search as +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select f, t, label from search_graph; +select pg_get_viewdef('v_search'); + pg_get_viewdef +------------------------------------------------ + WITH RECURSIVE search_graph(f, t, label) AS (+ + SELECT g.f, + + g.t, + + g.label + + FROM graph0 g + + UNION ALL + + SELECT g.f, + + g.t, + + g.label + + FROM graph0 g, + + search_graph sg + + WHERE (g.f = sg.t) + + ) SEARCH DEPTH FIRST BY f, t SET seq + + SELECT search_graph.f, + + search_graph.t, + + search_graph.label + + FROM search_graph; +(1 row) + +select * from v_search; + f | t | label +---+---+------------ + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 2 | 3 | arc 2 -> 3 + 1 | 4 | arc 1 -> 4 + 4 | 5 | arc 4 -> 5 + 2 | 3 | arc 2 -> 3 + 4 | 5 | arc 4 -> 5 +(7 rows) + +drop table graph0 cascade; +NOTICE: drop cascades to view v_search +-- +-- test cycle detection +-- +create temp table graph( f int, t int, label text ); +insert into graph values + (1, 2, 'arc 1 -> 2'), + (1, 3, 'arc 1 -> 3'), + (2, 3, 'arc 2 -> 3'), + (1, 4, 'arc 1 -> 4'), + (4, 5, 'arc 4 -> 5'), + (5, 1, 'arc 5 -> 1'); +with recursive search_graph(f, t, label, is_cycle, path) as ( + select *, false, array[row(g.f, g.t)] from graph g + union all + select g.*, row(g.f, g.t) = any(path), path || row(g.f, g.t) + from graph g, search_graph sg + where g.f = sg.t and not is_cycle +) +select * from search_graph; + f | t | label | is_cycle | path +---+---+------------+----------+------------------------------------------- + 1 | 2 | arc 1 -> 2 | f | {"(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(1,3)"} + 2 | 3 | arc 2 -> 3 | f | {"(2,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | f | {"(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | f | {"(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | f | {"(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(1,4)","(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(1,4)","(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | t | {"(1,4)","(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(4,5)","(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | t | {"(4,5)","(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | t | {"(5,1)","(1,4)","(4,5)","(5,1)"} + 2 | 3 | arc 2 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} +(25 rows) + +-- UNION DISTINCT exercises row type hashing support +with recursive search_graph(f, t, label, is_cycle, path) as ( + select *, false, array[row(g.f, g.t)] from graph g + union distinct + select g.*, row(g.f, g.t) = any(path), path || row(g.f, g.t) + from graph g, search_graph sg + where g.f = sg.t and not is_cycle +) +select * from search_graph; + f | t | label | is_cycle | path +---+---+------------+----------+------------------------------------------- + 1 | 2 | arc 1 -> 2 | f | {"(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(1,3)"} + 2 | 3 | arc 2 -> 3 | f | {"(2,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | f | {"(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | f | {"(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | f | {"(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(1,4)","(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(1,4)","(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | t | {"(1,4)","(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(4,5)","(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | t | {"(4,5)","(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | t | {"(5,1)","(1,4)","(4,5)","(5,1)"} + 2 | 3 | arc 2 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} +(25 rows) + +-- ordering by the path column has same effect as SEARCH DEPTH FIRST +with recursive search_graph(f, t, label, is_cycle, path) as ( + select *, false, array[row(g.f, g.t)] from graph g + union all + select g.*, row(g.f, g.t) = any(path), path || row(g.f, g.t) + from graph g, search_graph sg + where g.f = sg.t and not is_cycle +) +select * from search_graph order by path; + f | t | label | is_cycle | path +---+---+------------+----------+------------------------------------------- + 1 | 2 | arc 1 -> 2 | f | {"(1,2)"} + 2 | 3 | arc 2 -> 3 | f | {"(1,2)","(2,3)"} + 1 | 3 | arc 1 -> 3 | f | {"(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | f | {"(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(1,4)","(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(1,4)","(4,5)","(5,1)","(1,2)"} + 2 | 3 | arc 2 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} + 1 | 3 | arc 1 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | t | {"(1,4)","(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(2,3)"} + 4 | 5 | arc 4 -> 5 | f | {"(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(4,5)","(5,1)","(1,2)"} + 2 | 3 | arc 2 -> 3 | f | {"(4,5)","(5,1)","(1,2)","(2,3)"} + 1 | 3 | arc 1 -> 3 | f | {"(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(4,5)","(5,1)","(1,4)"} + 4 | 5 | arc 4 -> 5 | t | {"(4,5)","(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(5,1)","(1,2)"} + 2 | 3 | arc 2 -> 3 | f | {"(5,1)","(1,2)","(2,3)"} + 1 | 3 | arc 1 -> 3 | f | {"(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(5,1)","(1,4)"} + 4 | 5 | arc 4 -> 5 | f | {"(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | t | {"(5,1)","(1,4)","(4,5)","(5,1)"} +(25 rows) + +-- CYCLE clause +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle using path +select * from search_graph; + f | t | label | is_cycle | path +---+---+------------+----------+------------------------------------------- + 1 | 2 | arc 1 -> 2 | f | {"(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(1,3)"} + 2 | 3 | arc 2 -> 3 | f | {"(2,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | f | {"(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | f | {"(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | f | {"(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | f | {"(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | f | {"(1,4)","(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | f | {"(1,4)","(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | t | {"(1,4)","(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | f | {"(4,5)","(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | t | {"(4,5)","(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | t | {"(5,1)","(1,4)","(4,5)","(5,1)"} + 2 | 3 | arc 2 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} +(25 rows) + +with recursive search_graph(f, t, label) as ( + select * from graph g + union distinct + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to 'Y' default 'N' using path +select * from search_graph; + f | t | label | is_cycle | path +---+---+------------+----------+------------------------------------------- + 1 | 2 | arc 1 -> 2 | N | {"(1,2)"} + 1 | 3 | arc 1 -> 3 | N | {"(1,3)"} + 2 | 3 | arc 2 -> 3 | N | {"(2,3)"} + 1 | 4 | arc 1 -> 4 | N | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | N | {"(4,5)"} + 5 | 1 | arc 5 -> 1 | N | {"(5,1)"} + 1 | 2 | arc 1 -> 2 | N | {"(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | N | {"(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | N | {"(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | N | {"(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | N | {"(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | N | {"(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | N | {"(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | N | {"(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | N | {"(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | N | {"(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | N | {"(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | N | {"(1,4)","(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | N | {"(1,4)","(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | N | {"(1,4)","(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | Y | {"(1,4)","(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | N | {"(4,5)","(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | Y | {"(4,5)","(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | Y | {"(5,1)","(1,4)","(4,5)","(5,1)"} + 2 | 3 | arc 2 -> 3 | N | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} +(25 rows) + +-- multiple CTEs +with recursive +graph(f, t, label) as ( + values (1, 2, 'arc 1 -> 2'), + (1, 3, 'arc 1 -> 3'), + (2, 3, 'arc 2 -> 3'), + (1, 4, 'arc 1 -> 4'), + (4, 5, 'arc 4 -> 5'), + (5, 1, 'arc 5 -> 1') +), +search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to true default false using path +select f, t, label from search_graph; + f | t | label +---+---+------------ + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 2 | 3 | arc 2 -> 3 + 1 | 4 | arc 1 -> 4 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 2 | 3 | arc 2 -> 3 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 1 | 4 | arc 1 -> 4 + 1 | 3 | arc 1 -> 3 + 1 | 2 | arc 1 -> 2 + 5 | 1 | arc 5 -> 1 + 1 | 4 | arc 1 -> 4 + 1 | 3 | arc 1 -> 3 + 1 | 2 | arc 1 -> 2 + 4 | 5 | arc 4 -> 5 + 2 | 3 | arc 2 -> 3 + 1 | 4 | arc 1 -> 4 + 1 | 3 | arc 1 -> 3 + 1 | 2 | arc 1 -> 2 + 4 | 5 | arc 4 -> 5 + 2 | 3 | arc 2 -> 3 + 5 | 1 | arc 5 -> 1 + 2 | 3 | arc 2 -> 3 +(25 rows) + +-- star expansion +with recursive a as ( + select 1 as b + union all + select * from a +) cycle b set c using p +select * from a; + b | c | p +---+---+----------- + 1 | f | {(1)} + 1 | t | {(1),(1)} +(2 rows) + +-- search+cycle +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq + cycle f, t set is_cycle using path +select * from search_graph; + f | t | label | seq | is_cycle | path +---+---+------------+-------------------------------------------+----------+------------------------------------------- + 1 | 2 | arc 1 -> 2 | {"(1,2)"} | f | {"(1,2)"} + 1 | 3 | arc 1 -> 3 | {"(1,3)"} | f | {"(1,3)"} + 2 | 3 | arc 2 -> 3 | {"(2,3)"} | f | {"(2,3)"} + 1 | 4 | arc 1 -> 4 | {"(1,4)"} | f | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | {"(4,5)"} | f | {"(4,5)"} + 5 | 1 | arc 5 -> 1 | {"(5,1)"} | f | {"(5,1)"} + 1 | 2 | arc 1 -> 2 | {"(5,1)","(1,2)"} | f | {"(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | {"(5,1)","(1,3)"} | f | {"(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | {"(5,1)","(1,4)"} | f | {"(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | {"(1,2)","(2,3)"} | f | {"(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | {"(1,4)","(4,5)"} | f | {"(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | {"(4,5)","(5,1)"} | f | {"(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | {"(4,5)","(5,1)","(1,2)"} | f | {"(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | {"(4,5)","(5,1)","(1,3)"} | f | {"(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | {"(4,5)","(5,1)","(1,4)"} | f | {"(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | {"(5,1)","(1,2)","(2,3)"} | f | {"(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | {"(5,1)","(1,4)","(4,5)"} | f | {"(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | {"(1,4)","(4,5)","(5,1)"} | f | {"(1,4)","(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | {"(1,4)","(4,5)","(5,1)","(1,2)"} | f | {"(1,4)","(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | {"(1,4)","(4,5)","(5,1)","(1,3)"} | f | {"(1,4)","(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | {"(1,4)","(4,5)","(5,1)","(1,4)"} | t | {"(1,4)","(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | {"(4,5)","(5,1)","(1,2)","(2,3)"} | f | {"(4,5)","(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | {"(4,5)","(5,1)","(1,4)","(4,5)"} | t | {"(4,5)","(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | {"(5,1)","(1,4)","(4,5)","(5,1)"} | t | {"(5,1)","(1,4)","(4,5)","(5,1)"} + 2 | 3 | arc 2 -> 3 | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} | f | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} +(25 rows) + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) search breadth first by f, t set seq + cycle f, t set is_cycle using path +select * from search_graph; + f | t | label | seq | is_cycle | path +---+---+------------+---------+----------+------------------------------------------- + 1 | 2 | arc 1 -> 2 | (0,1,2) | f | {"(1,2)"} + 1 | 3 | arc 1 -> 3 | (0,1,3) | f | {"(1,3)"} + 2 | 3 | arc 2 -> 3 | (0,2,3) | f | {"(2,3)"} + 1 | 4 | arc 1 -> 4 | (0,1,4) | f | {"(1,4)"} + 4 | 5 | arc 4 -> 5 | (0,4,5) | f | {"(4,5)"} + 5 | 1 | arc 5 -> 1 | (0,5,1) | f | {"(5,1)"} + 1 | 2 | arc 1 -> 2 | (1,1,2) | f | {"(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | (1,1,3) | f | {"(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | (1,1,4) | f | {"(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | (1,2,3) | f | {"(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | (1,4,5) | f | {"(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | (1,5,1) | f | {"(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | (2,1,2) | f | {"(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | (2,1,3) | f | {"(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | (2,1,4) | f | {"(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | (2,2,3) | f | {"(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | (2,4,5) | f | {"(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | (2,5,1) | f | {"(1,4)","(4,5)","(5,1)"} + 1 | 2 | arc 1 -> 2 | (3,1,2) | f | {"(1,4)","(4,5)","(5,1)","(1,2)"} + 1 | 3 | arc 1 -> 3 | (3,1,3) | f | {"(1,4)","(4,5)","(5,1)","(1,3)"} + 1 | 4 | arc 1 -> 4 | (3,1,4) | t | {"(1,4)","(4,5)","(5,1)","(1,4)"} + 2 | 3 | arc 2 -> 3 | (3,2,3) | f | {"(4,5)","(5,1)","(1,2)","(2,3)"} + 4 | 5 | arc 4 -> 5 | (3,4,5) | t | {"(4,5)","(5,1)","(1,4)","(4,5)"} + 5 | 1 | arc 5 -> 1 | (3,5,1) | t | {"(5,1)","(1,4)","(4,5)","(5,1)"} + 2 | 3 | arc 2 -> 3 | (4,2,3) | f | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} +(25 rows) + +-- various syntax errors +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle foo, tar set is_cycle using path +select * from search_graph; +ERROR: cycle column "foo" not in WITH query column list +LINE 7: ) cycle foo, tar set is_cycle using path + ^ +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to true default 55 using path +select * from search_graph; +ERROR: CYCLE types boolean and integer cannot be matched +LINE 7: ) cycle f, t set is_cycle to true default 55 using path + ^ +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to point '(1,1)' default point '(0,0)' using path +select * from search_graph; +ERROR: could not identify an equality operator for type point +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set label to true default false using path +select * from search_graph; +ERROR: cycle mark column name "label" already used in WITH query column list +LINE 7: ) cycle f, t set label to true default false using path + ^ +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to true default false using label +select * from search_graph; +ERROR: cycle path column name "label" already used in WITH query column list +LINE 7: ) cycle f, t set is_cycle to true default false using label + ^ +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set foo to true default false using foo +select * from search_graph; +ERROR: cycle mark column name and cycle path column name are the same +LINE 7: ) cycle f, t set foo to true default false using foo + ^ +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t, f set is_cycle to true default false using path +select * from search_graph; +ERROR: cycle column "f" specified more than once +LINE 7: ) cycle f, t, f set is_cycle to true default false using pat... + ^ +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) search depth first by f, t set foo + cycle f, t set foo to true default false using path +select * from search_graph; +ERROR: search sequence column name and cycle mark column name are the same +LINE 7: ) search depth first by f, t set foo + ^ +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) search depth first by f, t set foo + cycle f, t set is_cycle to true default false using foo +select * from search_graph; +ERROR: search sequence column name and cycle path column name are the same +LINE 7: ) search depth first by f, t set foo + ^ +-- test ruleutils and view expansion +create temp view v_cycle1 as +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle using path +select f, t, label from search_graph; +create temp view v_cycle2 as +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to 'Y' default 'N' using path +select f, t, label from search_graph; +select pg_get_viewdef('v_cycle1'); + pg_get_viewdef +------------------------------------------------ + WITH RECURSIVE search_graph(f, t, label) AS (+ + SELECT g.f, + + g.t, + + g.label + + FROM graph g + + UNION ALL + + SELECT g.f, + + g.t, + + g.label + + FROM graph g, + + search_graph sg + + WHERE (g.f = sg.t) + + ) CYCLE f, t SET is_cycle USING path + + SELECT search_graph.f, + + search_graph.t, + + search_graph.label + + FROM search_graph; +(1 row) + +select pg_get_viewdef('v_cycle2'); + pg_get_viewdef +----------------------------------------------------------------------------- + WITH RECURSIVE search_graph(f, t, label) AS ( + + SELECT g.f, + + g.t, + + g.label + + FROM graph g + + UNION ALL + + SELECT g.f, + + g.t, + + g.label + + FROM graph g, + + search_graph sg + + WHERE (g.f = sg.t) + + ) CYCLE f, t SET is_cycle TO 'Y'::text DEFAULT 'N'::text USING path+ + SELECT search_graph.f, + + search_graph.t, + + search_graph.label + + FROM search_graph; +(1 row) + +select * from v_cycle1; + f | t | label +---+---+------------ + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 2 | 3 | arc 2 -> 3 + 1 | 4 | arc 1 -> 4 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 1 | 4 | arc 1 -> 4 + 2 | 3 | arc 2 -> 3 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 1 | 4 | arc 1 -> 4 + 2 | 3 | arc 2 -> 3 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 1 | 4 | arc 1 -> 4 + 2 | 3 | arc 2 -> 3 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 2 | 3 | arc 2 -> 3 +(25 rows) + +select * from v_cycle2; + f | t | label +---+---+------------ + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 2 | 3 | arc 2 -> 3 + 1 | 4 | arc 1 -> 4 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 1 | 4 | arc 1 -> 4 + 2 | 3 | arc 2 -> 3 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 1 | 4 | arc 1 -> 4 + 2 | 3 | arc 2 -> 3 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 1 | 2 | arc 1 -> 2 + 1 | 3 | arc 1 -> 3 + 1 | 4 | arc 1 -> 4 + 2 | 3 | arc 2 -> 3 + 4 | 5 | arc 4 -> 5 + 5 | 1 | arc 5 -> 1 + 2 | 3 | arc 2 -> 3 +(25 rows) + +-- +-- test multiple WITH queries +-- +WITH RECURSIVE + y (id) AS (VALUES (1)), + x (id) AS (SELECT * FROM y UNION ALL SELECT id+1 FROM x WHERE id < 5) +SELECT * FROM x; + id +---- + 1 + 2 + 3 + 4 + 5 +(5 rows) + +-- forward reference OK +WITH RECURSIVE + x(id) AS (SELECT * FROM y UNION ALL SELECT id+1 FROM x WHERE id < 5), + y(id) AS (values (1)) + SELECT * FROM x; + id +---- + 1 + 2 + 3 + 4 + 5 +(5 rows) + +WITH RECURSIVE + x(id) AS + (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 5), + y(id) AS + (VALUES (1) UNION ALL SELECT id+1 FROM y WHERE id < 10) + SELECT y.*, x.* FROM y LEFT JOIN x USING (id); + id | id +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | + 7 | + 8 | + 9 | + 10 | +(10 rows) + +WITH RECURSIVE + x(id) AS + (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 5), + y(id) AS + (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 10) + SELECT y.*, x.* FROM y LEFT JOIN x USING (id); + id | id +----+---- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | +(6 rows) + +WITH RECURSIVE + x(id) AS + (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 3 ), + y(id) AS + (SELECT * FROM x UNION ALL SELECT * FROM x), + z(id) AS + (SELECT * FROM x UNION ALL SELECT id+1 FROM z WHERE id < 10) + SELECT * FROM z; + id +---- + 1 + 2 + 3 + 2 + 3 + 4 + 3 + 4 + 5 + 4 + 5 + 6 + 5 + 6 + 7 + 6 + 7 + 8 + 7 + 8 + 9 + 8 + 9 + 10 + 9 + 10 + 10 +(27 rows) + +WITH RECURSIVE + x(id) AS + (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 3 ), + y(id) AS + (SELECT * FROM x UNION ALL SELECT * FROM x), + z(id) AS + (SELECT * FROM y UNION ALL SELECT id+1 FROM z WHERE id < 10) + SELECT * FROM z; + id +---- + 1 + 2 + 3 + 1 + 2 + 3 + 2 + 3 + 4 + 2 + 3 + 4 + 3 + 4 + 5 + 3 + 4 + 5 + 4 + 5 + 6 + 4 + 5 + 6 + 5 + 6 + 7 + 5 + 6 + 7 + 6 + 7 + 8 + 6 + 7 + 8 + 7 + 8 + 9 + 7 + 8 + 9 + 8 + 9 + 10 + 8 + 9 + 10 + 9 + 10 + 9 + 10 + 10 + 10 +(54 rows) + +-- +-- Test WITH attached to a data-modifying statement +-- +CREATE TEMPORARY TABLE y (a INTEGER); +INSERT INTO y SELECT generate_series(1, 10); +WITH t AS ( + SELECT a FROM y +) +INSERT INTO y +SELECT a+20 FROM t RETURNING *; + a +---- + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 +(10 rows) + +SELECT * FROM y; + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 +(20 rows) + +WITH t AS ( + SELECT a FROM y +) +UPDATE y SET a = y.a-10 FROM t WHERE y.a > 20 AND t.a = y.a RETURNING y.a; + a +---- + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(10 rows) + +SELECT * FROM y; + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(20 rows) + +WITH RECURSIVE t(a) AS ( + SELECT 11 + UNION ALL + SELECT a+1 FROM t WHERE a < 50 +) +DELETE FROM y USING t WHERE t.a = y.a RETURNING y.a; + a +---- + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(10 rows) + +SELECT * FROM y; + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +DROP TABLE y; +-- +-- error cases +-- +WITH x(n, b) AS (SELECT 1) +SELECT * FROM x; +ERROR: WITH query "x" has 1 columns available but 2 columns specified +LINE 1: WITH x(n, b) AS (SELECT 1) + ^ +-- INTERSECT +WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT SELECT n+1 FROM x) + SELECT * FROM x; +ERROR: recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term +LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT SELECT n+1 FROM x... + ^ +WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT ALL SELECT n+1 FROM x) + SELECT * FROM x; +ERROR: recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term +LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT ALL SELECT n+1 FR... + ^ +-- EXCEPT +WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT SELECT n+1 FROM x) + SELECT * FROM x; +ERROR: recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term +LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT SELECT n+1 FROM x) + ^ +WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT ALL SELECT n+1 FROM x) + SELECT * FROM x; +ERROR: recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term +LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT ALL SELECT n+1 FROM ... + ^ +-- GPDB Specific Error Cases +-- Set operations within the recursive term with a self-reference. +-- Currently set operations in the recursive term involving the cte itself must +-- be prevented. The reason for this is that such a query may lead to a plan +-- where there is a motion between the RecursiveUnion node and the +-- WorkTableScan node. +CREATE TEMPORARY TABLE z(x int primary key); +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM (SELECT * FROM x UNION SELECT * FROM z)foo) + SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within a subquery +LINE 1: ...SELECT 1 UNION ALL SELECT n+1 FROM (SELECT * FROM x UNION SE... + ^ +-- Set operation in recursive term that does not have a self-reference +-- This is supported +CREATE TEMPORARY TABLE u(x int primary key); +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM (SELECT * from z UNION SELECT * FROM u)foo, x where foo.x = x.n) + SELECT * FROM x; + n +--- + 1 +(1 row) + +DROP TABLE z; +-- no non-recursive term +WITH RECURSIVE x(n) AS (SELECT n FROM x) + SELECT * FROM x; +ERROR: recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term +LINE 1: WITH RECURSIVE x(n) AS (SELECT n FROM x) + ^ +-- recursive term in the left hand side (strictly speaking, should allow this) +WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1) + SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within its non-recursive term +LINE 1: WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1) + ^ +-- recursive term with a self-reference within a subquery is not allowed +WITH RECURSIVE cte(level, id) as ( + SELECT 1, 2 + UNION ALL + SELECT level+1, c FROM (SELECT * FROM cte OFFSET 0) foo, bar) +SELECT * FROM cte LIMIT 10; +ERROR: recursive reference to query "cte" must not appear within a subquery +LINE 4: SELECT level+1, c FROM (SELECT * FROM cte OFFSET 0) foo, ba... + ^ +-- recursive term with a distinct operation is not allowed +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT distinct(n+1) FROM x) + SELECT * FROM x; +ERROR: DISTINCT in a recursive query is not implemented +-- recursive term with a group by operation is not allowed +CREATE TEMPORARY TABLE bar(c int); +WITH RECURSIVE x(n) AS ( + SELECT 1,2 + UNION ALL + SELECT level+1, c FROM x, bar GROUP BY 1,2) + SELECT * FROM x LIMIT 10; +ERROR: GROUP BY in a recursive query is not implemented +LINE 4: SELECT level+1, c FROM x, bar GROUP BY 1,2) + ^ +WITH RECURSIVE x(n) AS ( + SELECT 1,2 + UNION ALL + SELECT level+1, row_number() over() FROM x, bar) + SELECT * FROM x LIMIT 10; +ERROR: window functions in a recursive query is not implemented +LINE 4: SELECT level+1, row_number() over() FROM x, bar) + ^ +CREATE TEMPORARY TABLE y (a INTEGER); +INSERT INTO y SELECT generate_series(1, 10); +-- LEFT JOIN +WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1 + UNION ALL + SELECT x.n+1 FROM y LEFT JOIN x ON x.n = y.a WHERE n < 10) +SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within an outer join +LINE 3: SELECT x.n+1 FROM y LEFT JOIN x ON x.n = y.a WHERE n < 10) + ^ +-- RIGHT JOIN +WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1 + UNION ALL + SELECT x.n+1 FROM x RIGHT JOIN y ON x.n = y.a WHERE n < 10) +SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within an outer join +LINE 3: SELECT x.n+1 FROM x RIGHT JOIN y ON x.n = y.a WHERE n < 10) + ^ +-- FULL JOIN +WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1 + UNION ALL + SELECT x.n+1 FROM x FULL JOIN y ON x.n = y.a WHERE n < 10) +SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within an outer join +LINE 3: SELECT x.n+1 FROM x FULL JOIN y ON x.n = y.a WHERE n < 10) + ^ +-- subquery +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x + WHERE n IN (SELECT * FROM x)) + SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within a subquery +LINE 2: WHERE n IN (SELECT * FROM x)) + ^ +-- aggregate functions +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT count(*) FROM x) + SELECT * FROM x; +ERROR: aggregate functions are not allowed in a recursive query's recursive term +LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT count(*) F... + ^ +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT sum(n) FROM x) + SELECT * FROM x; +ERROR: aggregate functions are not allowed in a recursive query's recursive term +LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT sum(n) FRO... + ^ +-- ORDER BY +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x ORDER BY 1) + SELECT * FROM x; +ERROR: ORDER BY in a recursive query is not implemented +LINE 1: ...VE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x ORDER BY 1) + ^ +-- LIMIT/OFFSET +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x LIMIT 10 OFFSET 1) + SELECT * FROM x; +ERROR: OFFSET in a recursive query is not implemented +LINE 1: ... AS (SELECT 1 UNION ALL SELECT n+1 FROM x LIMIT 10 OFFSET 1) + ^ +-- FOR UPDATE +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x FOR UPDATE) + SELECT * FROM x; +ERROR: FOR UPDATE/SHARE in a recursive query is not implemented +-- target list has a recursive query name +WITH RECURSIVE x(id) AS (values (1) + UNION ALL + SELECT (SELECT * FROM x) FROM x WHERE id < 5 +) SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within a subquery +LINE 3: SELECT (SELECT * FROM x) FROM x WHERE id < 5 + ^ +-- mutual recursive query (not implemented) +WITH RECURSIVE + x (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM y WHERE id < 5), + y (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 5) +SELECT * FROM x; +ERROR: mutual recursion between WITH items is not implemented +LINE 2: x (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM y WHERE id ... + ^ +-- non-linear recursion is not allowed +WITH RECURSIVE foo(i) AS + (values (1) + UNION ALL + (SELECT i+1 FROM foo WHERE i < 10 + UNION ALL + SELECT i+1 FROM foo WHERE i < 5) +) SELECT * FROM foo; +ERROR: recursive reference to query "foo" must not appear more than once +LINE 6: SELECT i+1 FROM foo WHERE i < 5) + ^ +WITH RECURSIVE foo(i) AS + (values (1) + UNION ALL + SELECT * FROM + (SELECT i+1 FROM foo WHERE i < 10 + UNION ALL + SELECT i+1 FROM foo WHERE i < 5) AS t +) SELECT * FROM foo; +ERROR: recursive reference to query "foo" must not appear within a subquery +LINE 5: (SELECT i+1 FROM foo WHERE i < 10 + ^ +WITH RECURSIVE foo(i) AS + (values (1) + UNION ALL + (SELECT i+1 FROM foo WHERE i < 10 + EXCEPT + SELECT i+1 FROM foo WHERE i < 5) +) SELECT * FROM foo; +ERROR: recursive reference to query "foo" must not appear within EXCEPT +LINE 6: SELECT i+1 FROM foo WHERE i < 5) + ^ +WITH RECURSIVE foo(i) AS + (values (1) + UNION ALL + (SELECT i+1 FROM foo WHERE i < 10 + INTERSECT + SELECT i+1 FROM foo WHERE i < 5) +) SELECT * FROM foo; +ERROR: recursive reference to query "foo" must not appear more than once +LINE 6: SELECT i+1 FROM foo WHERE i < 5) + ^ +-- Wrong type induced from non-recursive term +WITH RECURSIVE foo(i) AS + (SELECT i FROM (VALUES(1),(2)) t(i) + UNION ALL + SELECT (i+1)::numeric(10,0) FROM foo WHERE i < 10) +SELECT * FROM foo; +ERROR: recursive query "foo" column 1 has type integer in non-recursive term but type numeric overall +LINE 2: (SELECT i FROM (VALUES(1),(2)) t(i) + ^ +HINT: Cast the output of the non-recursive term to the correct type. +-- rejects different typmod, too (should we allow this?) +WITH RECURSIVE foo(i) AS + (SELECT i::numeric(3,0) FROM (VALUES(1),(2)) t(i) + UNION ALL + SELECT (i+1)::numeric(10,0) FROM foo WHERE i < 10) +SELECT * FROM foo; +ERROR: recursive query "foo" column 1 has type numeric(3,0) in non-recursive term but type numeric overall +LINE 2: (SELECT i::numeric(3,0) FROM (VALUES(1),(2)) t(i) + ^ +HINT: Cast the output of the non-recursive term to the correct type. +-- disallow OLD/NEW reference in CTE +CREATE TEMPORARY TABLE x (n integer); +CREATE RULE r2 AS ON UPDATE TO x DO INSTEAD + WITH t AS (SELECT OLD.*) UPDATE y SET a = t.n FROM t; +ERROR: cannot refer to OLD within WITH query +-- +-- test for bug #4902 +-- +with cte(foo) as ( values(42) ) values((select foo from cte)); + column1 +--------- + 42 +(1 row) + +with cte(foo) as ( select 42 ) select * from ((select foo from cte)) q; + foo +----- + 42 +(1 row) + +-- test CTE referencing an outer-level variable (to see that changed-parameter +-- signaling still works properly after fixing this bug) +select ( with cte(foo) as ( values(f1) ) + select (select foo from cte) ) +from int4_tbl; + foo +------------- + 0 + 123456 + -123456 + 2147483647 + -2147483647 +(5 rows) + +select ( with cte(foo) as ( values(f1) ) + values((select foo from cte)) ) +from int4_tbl; + column1 +------------- + 0 + 123456 + -123456 + 2147483647 + -2147483647 +(5 rows) + +-- +-- test Nested CTE +-- +WITH outermost(x) AS ( + SELECT 1 + UNION (WITH innermost as (SELECT 2) + SELECT * FROM innermost + UNION SELECT 3) +) +SELECT * FROM outermost; + x +--- + 1 + 2 + 3 +(3 rows) + +-- +-- test for nested-recursive-WITH bug +-- +WITH RECURSIVE t(j) AS ( + WITH RECURSIVE s(i) AS ( + VALUES (1) + UNION ALL + SELECT i+1 FROM s WHERE i < 10 + ) + SELECT i FROM s + UNION ALL + SELECT j+1 FROM t WHERE j < 10 +) +SELECT * FROM t; + j +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 5 + 6 + 7 + 8 + 9 + 10 + 6 + 7 + 8 + 9 + 10 + 7 + 8 + 9 + 10 + 8 + 9 + 10 + 9 + 10 + 10 +(55 rows) + +-- +-- test WITH attached to intermediate-level set operation +-- +WITH outermost(x) AS ( + SELECT 1 + UNION (WITH innermost as (SELECT 2) + SELECT * FROM innermost + UNION SELECT 3) +) +SELECT * FROM outermost ORDER BY 1; + x +--- + 1 + 2 + 3 +(3 rows) + +WITH outermost(x) AS ( + SELECT 1 + UNION (WITH innermost as (SELECT 2) + SELECT * FROM outermost -- fail + UNION SELECT * FROM innermost) +) +SELECT * FROM outermost ORDER BY 1; +ERROR: relation "outermost" does not exist +LINE 4: SELECT * FROM outermost + ^ +DETAIL: There is a WITH item named "outermost", but it cannot be referenced from this part of the query. +HINT: Use WITH RECURSIVE, or re-order the WITH items to remove forward references. +WITH RECURSIVE outermost(x) AS ( + SELECT 1 + UNION (WITH innermost as (SELECT 2) + SELECT * FROM outermost + UNION SELECT * FROM innermost) +) +SELECT * FROM outermost ORDER BY 1; + x +--- + 1 + 2 +(2 rows) + +WITH RECURSIVE outermost(x) AS ( + WITH innermost as (SELECT 2 FROM outermost) -- fail + SELECT * FROM innermost + UNION SELECT * from outermost +) +SELECT * FROM outermost ORDER BY 1; +ERROR: recursive reference to query "outermost" must not appear within a subquery +LINE 2: WITH innermost as (SELECT 2 FROM outermost) + ^ +-- +-- This test will fail with the old implementation of PARAM_EXEC parameter +-- assignment, because the "q1" Var passed down to A's targetlist subselect +-- looks exactly like the "A.id" Var passed down to C's subselect, causing +-- the old code to give them the same runtime PARAM_EXEC slot. But the +-- lifespans of the two parameters overlap, thanks to B also reading A. +-- +with +A as ( select q2 as id, (select q1) as x from int8_tbl ), +B as ( select id, row_number() over (partition by id) as r from A ), +C as ( select A.id, array(select B.id from B where B.id = A.id) from A ) +select * from C; + id | array +-------------------+------------------------------------- + 456 | {456} + 4567890123456789 | {4567890123456789,4567890123456789} + 123 | {123} + 4567890123456789 | {4567890123456789,4567890123456789} + -4567890123456789 | {-4567890123456789} +(5 rows) + +-- +-- Test CTEs read in non-initialization orders +-- gpdb +-- Remove window funtions from Recursive CTE's test case. +-- Currently Recursive CTE's do not support the Window Functions, +-- So we remove it from the test cases. +-- +WITH RECURSIVE + tab(id_key,link) AS (VALUES (1,17), (2,17), (3,17), (4,17), (6,17), (5,17)), + iter (id_key, row_type, link) AS ( + SELECT 0, 'base', 17 + UNION ALL ( + WITH remaining(id_key, row_type, link, min) AS ( + SELECT tab.id_key, 'true'::text, iter.link, tab.id_key + FROM tab INNER JOIN iter USING (link) + WHERE tab.id_key > iter.id_key + ), + first_remaining AS ( + SELECT id_key, row_type, link + FROM remaining + WHERE id_key=min + ), + effect AS ( + SELECT tab.id_key, 'new'::text, tab.link + FROM first_remaining e INNER JOIN tab ON e.id_key=tab.id_key + WHERE e.row_type = 'false' + ) + SELECT * FROM first_remaining + UNION ALL SELECT * FROM effect + ) + ) +SELECT * FROM iter; + id_key | row_type | link +--------+----------+------ + 0 | base | 17 + 5 | true | 17 + 6 | true | 17 + 4 | true | 17 + 3 | true | 17 + 2 | true | 17 + 1 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 4 | true | 17 + 5 | true | 17 + 6 | true | 17 + 4 | true | 17 + 3 | true | 17 + 5 | true | 17 + 6 | true | 17 + 4 | true | 17 + 3 | true | 17 + 2 | true | 17 + 6 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 4 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 4 | true | 17 + 5 | true | 17 + 6 | true | 17 + 4 | true | 17 + 3 | true | 17 + 6 | true | 17 + 6 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 6 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 4 | true | 17 + 6 | true | 17 + 6 | true | 17 + 6 | true | 17 + 6 | true | 17 + 5 | true | 17 + 6 | true | 17 + 6 | true | 17 +(64 rows) + +WITH RECURSIVE + tab(id_key,link) AS (VALUES (1,17), (2,17), (3,17), (4,17), (6,17), (5,17)), + iter (id_key, row_type, link) AS ( + SELECT 0, 'base', 17 + UNION ( + WITH remaining(id_key, row_type, link, min) AS ( + SELECT tab.id_key, 'true'::text, iter.link, tab.id_key + FROM tab INNER JOIN iter USING (link) + WHERE tab.id_key > iter.id_key + ), + first_remaining AS ( + SELECT id_key, row_type, link + FROM remaining + WHERE id_key=min + ), + effect AS ( + SELECT tab.id_key, 'new'::text, tab.link + FROM first_remaining e INNER JOIN tab ON e.id_key=tab.id_key + WHERE e.row_type = 'false' + ) + SELECT * FROM first_remaining + UNION ALL SELECT * FROM effect + ) + ) +SELECT * FROM iter; + id_key | row_type | link +--------+----------+------ + 0 | base | 17 + 1 | true | 17 + 2 | true | 17 + 3 | true | 17 + 4 | true | 17 + 5 | true | 17 + 6 | true | 17 +(7 rows) + +-- +-- Data-modifying statements in WITH +-- +-- INSERT ... RETURNING +WITH t AS ( + INSERT INTO y + VALUES + (11), + (12), + (13), + (14), + (15), + (16), + (17), + (18), + (19), + (20) + RETURNING * +) +SELECT * FROM t; + a +---- + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(10 rows) + +SELECT * FROM y; + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 +(20 rows) + +-- UPDATE ... RETURNING +WITH t AS ( + UPDATE y + SET a=a+1 + RETURNING * +) +SELECT * FROM t; + a +---- + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 +(20 rows) + +SELECT * FROM y; + a +---- + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 +(20 rows) + +-- DELETE ... RETURNING +WITH t AS ( + DELETE FROM y + WHERE a <= 10 + RETURNING * +) +SELECT * FROM t; + a +---- + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(9 rows) + +SELECT * FROM y; + a +---- + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 +(11 rows) + +-- forward reference +WITH RECURSIVE t AS ( + INSERT INTO y + SELECT a+5 FROM t2 WHERE a > 5 + RETURNING * +), t2 AS ( + UPDATE y SET a=a-11 RETURNING * +) +SELECT * FROM t +UNION ALL +SELECT * FROM t2; +ERROR: only one modifying WITH clause allowed per query +DETAIL: Cloudberry Database currently only support CTEs with one writable clause. +HINT: Rewrite the query to only include one writable CTE clause. +SELECT * FROM y; + a +---- + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 +(11 rows) + +-- unconditional DO INSTEAD rule +CREATE RULE y_rule AS ON DELETE TO y DO INSTEAD + INSERT INTO y VALUES(42) RETURNING *; +WITH t AS ( + DELETE FROM y RETURNING * +) +SELECT * FROM t; + a +---- + 42 +(1 row) + +SELECT * FROM y; + a +---- + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 42 +(12 rows) + +DROP RULE y_rule ON y; +-- check merging of outer CTE with CTE in a rule action +CREATE TEMP TABLE bug6051 AS + select i from generate_series(1,3) as t(i); +SELECT * FROM bug6051; + i +--- + 1 + 2 + 3 +(3 rows) + +WITH t1 AS ( DELETE FROM bug6051 RETURNING * ) +INSERT INTO bug6051 SELECT * FROM t1; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +SELECT * FROM bug6051; + i +--- + 1 + 2 + 3 +(3 rows) + +CREATE TEMP TABLE bug6051_2 (i int); +CREATE RULE bug6051_ins AS ON INSERT TO bug6051 DO INSTEAD + INSERT INTO bug6051_2 + VALUES(NEW.i); +WITH t1 AS ( DELETE FROM bug6051 RETURNING * ) +INSERT INTO bug6051 SELECT * FROM t1; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +SELECT * FROM bug6051; + i +--- + 1 + 2 + 3 +(3 rows) + +SELECT * FROM bug6051_2; + i +--- +(0 rows) + +-- check INSERT...SELECT rule actions are disallowed on commands +-- that have modifyingCTEs +CREATE OR REPLACE RULE bug6051_ins AS ON INSERT TO bug6051 DO INSTEAD + INSERT INTO bug6051_2 + SELECT NEW.i; +WITH t1 AS ( DELETE FROM bug6051 RETURNING * ) +INSERT INTO bug6051 SELECT * FROM t1; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +-- silly example to verify that hasModifyingCTE flag is propagated +CREATE TEMP TABLE bug6051_3 AS + SELECT a FROM generate_series(11,13) AS a; +CREATE RULE bug6051_3_ins AS ON INSERT TO bug6051_3 DO INSTEAD + SELECT i FROM bug6051_2; +BEGIN; SET LOCAL force_parallel_mode = on; +WITH t1 AS ( DELETE FROM bug6051_3 RETURNING * ) + INSERT INTO bug6051_3 SELECT * FROM t1; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +COMMIT; +SELECT * FROM bug6051_3; + a +---- + 11 + 12 + 13 +(3 rows) + +-- check case where CTE reference is removed due to optimization +EXPLAIN (VERBOSE, COSTS OFF) +SELECT q1 FROM +( + WITH t_cte AS (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + QUERY PLAN +-------------------------------------- + Subquery Scan on ss + Output: ss.q1 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, NULL::bigint + Optimizer: Postgres query optimizer +(5 rows) + +SELECT q1 FROM +( + WITH t_cte AS (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + q1 +------------------ + 123 + 123 + 4567890123456789 + 4567890123456789 + 4567890123456789 +(5 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT q1 FROM +( + WITH t_cte AS MATERIALIZED (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + QUERY PLAN +-------------------------------------- + Subquery Scan on ss + Output: ss.q1 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, NULL::bigint + Optimizer: Postgres query optimizer +(5 rows) + +SELECT q1 FROM +( + WITH t_cte AS MATERIALIZED (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + q1 +------------------ + 123 + 123 + 4567890123456789 + 4567890123456789 + 4567890123456789 +(5 rows) + +-- a truly recursive CTE in the same list +ANALYZE y; -- There is a bug, the below case will fail for generating plan which execute ModifyTable on reader gang. +WITH RECURSIVE t(a) AS ( + SELECT 0 + UNION ALL + SELECT a+1 FROM t WHERE a+1 < 5 +), t2 as ( + INSERT INTO y + SELECT * FROM t RETURNING * +) +SELECT * FROM t2 JOIN y USING (a) ORDER BY a; + a +--- +(0 rows) + +SELECT * FROM y; + a +---- + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 42 + 0 + 1 + 2 + 3 + 4 +(17 rows) + +-- data-modifying WITH in a modifying statement +WITH t AS ( + DELETE FROM y + WHERE a <= 10 + RETURNING * +) +INSERT INTO y SELECT -a FROM t RETURNING *; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +SELECT * FROM y; + a +---- + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 42 + 0 + 1 + 2 + 3 + 4 +(17 rows) + +-- check that WITH query is run to completion even if outer query isn't +WITH t AS ( + UPDATE y SET a = a * 100 RETURNING * +) +SELECT a BETWEEN 0 AND 4200 FROM t LIMIT 10; + ?column? +---------- + t + t + t + t + t + t + t + t + t + t +(10 rows) + +SELECT * FROM y; + a +------ + 1100 + 1200 + 1300 + 1400 + 1500 + 1600 + 1700 + 1800 + 1900 + 2000 + 2100 + 4200 + 0 + 100 + 200 + 300 + 400 +(17 rows) + +-- data-modifying WITH containing INSERT...ON CONFLICT DO UPDATE +CREATE TABLE withz AS SELECT i AS k, (i || ' v')::text v FROM generate_series(1, 16, 3) i; +ALTER TABLE withz ADD UNIQUE (k); +WITH t AS ( + INSERT INTO withz SELECT i, 'insert' + FROM generate_series(0, 16) i + ON CONFLICT (k) DO UPDATE SET v = withz.v || ', now update' + RETURNING * +) +SELECT * FROM t JOIN y ON t.k = y.a ORDER BY a, k; + k | v | a +---+--------+--- + 0 | insert | 0 +(1 row) + +-- Test EXCLUDED.* reference within CTE +WITH aa AS ( + INSERT INTO withz VALUES(1, 5) ON CONFLICT (k) DO UPDATE SET v = EXCLUDED.v + WHERE withz.k != EXCLUDED.k + RETURNING * +) +SELECT * FROM aa; + k | v +---+--- +(0 rows) + +-- New query/snapshot demonstrates side-effects of previous query. +SELECT * FROM withz ORDER BY k; + k | v +----+------------------ + 0 | insert + 1 | 1 v, now update + 2 | insert + 3 | insert + 4 | 4 v, now update + 5 | insert + 6 | insert + 7 | 7 v, now update + 8 | insert + 9 | insert + 10 | 10 v, now update + 11 | insert + 12 | insert + 13 | 13 v, now update + 14 | insert + 15 | insert + 16 | 16 v, now update +(17 rows) + +-- +-- Ensure subqueries within the update clause work, even if they +-- reference outside values +-- +WITH aa AS (SELECT 1 a, 2 b) +INSERT INTO withz VALUES(1, 'insert') +ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1); +WITH aa AS (SELECT 1 a, 2 b) +INSERT INTO withz VALUES(1, 'insert') +ON CONFLICT (k) DO UPDATE SET v = ' update' WHERE withz.k = (SELECT a FROM aa); +WITH aa AS (SELECT 1 a, 2 b) +INSERT INTO withz VALUES(1, 'insert') +ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1); +WITH aa AS (SELECT 'a' a, 'b' b UNION ALL SELECT 'a' a, 'b' b) +INSERT INTO withz VALUES(1, 'insert') +ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 'a' LIMIT 1); +WITH aa AS (SELECT 1 a, 2 b) +INSERT INTO withz VALUES(1, (SELECT b || ' insert' FROM aa WHERE a = 1 )) +ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1); +-- Update a row more than once, in different parts of a wCTE. That is +-- an allowed, presumably very rare, edge case, but since it was +-- broken in the past, having a test seems worthwhile. +WITH simpletup AS ( + SELECT 2 k, 'Green' v), +upsert_cte AS ( + INSERT INTO withz VALUES(2, 'Blue') ON CONFLICT (k) DO + UPDATE SET (k, v) = (SELECT k, v FROM simpletup WHERE simpletup.k = withz.k) + RETURNING k, v) +INSERT INTO withz VALUES(2, 'Red') ON CONFLICT (k) DO +UPDATE SET (k, v) = (SELECT k, v FROM upsert_cte WHERE upsert_cte.k = withz.k) +RETURNING k, v; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +DROP TABLE withz; +-- check that run to completion happens in proper ordering +TRUNCATE TABLE y; +INSERT INTO y SELECT generate_series(1, 3); +CREATE TEMPORARY TABLE yy (a INTEGER); +WITH RECURSIVE t1 AS ( + INSERT INTO y SELECT * FROM y RETURNING * +), t2 AS ( + INSERT INTO yy SELECT * FROM t1 RETURNING * +) +SELECT 1; +ERROR: only one modifying WITH clause allowed per query +DETAIL: Cloudberry Database currently only support CTEs with one writable clause. +HINT: Rewrite the query to only include one writable CTE clause. +SELECT * FROM y; + a +--- + 1 + 2 + 3 +(3 rows) + +SELECT * FROM yy; + a +--- +(0 rows) + +WITH RECURSIVE t1 AS ( + INSERT INTO yy SELECT * FROM t2 RETURNING * +), t2 AS ( + INSERT INTO y SELECT * FROM y RETURNING * +) +SELECT 1; +ERROR: only one modifying WITH clause allowed per query +DETAIL: Cloudberry Database currently only support CTEs with one writable clause. +HINT: Rewrite the query to only include one writable CTE clause. +SELECT * FROM y; + a +--- + 1 + 2 + 3 +(3 rows) + +SELECT * FROM yy; + a +--- +(0 rows) + +-- start_ignore +-- These tests actually seem to work, but they have unstable return order +-- in an MPP environment so they are ignored until atmsort can handle this +-- triggers +TRUNCATE TABLE y; +INSERT INTO y SELECT generate_series(1, 10); +CREATE FUNCTION y_trigger() RETURNS trigger AS $$ +begin + raise notice 'y_trigger: a = %', new.a; + return new; +end; +$$ LANGUAGE plpgsql; +CREATE TRIGGER y_trig BEFORE INSERT ON y FOR EACH ROW + EXECUTE PROCEDURE y_trigger(); +WITH t AS ( + INSERT INTO y + VALUES + (21), + (22), + (23) + RETURNING * +) +SELECT * FROM t; +NOTICE: y_trigger: a = 21 +NOTICE: y_trigger: a = 22 +NOTICE: y_trigger: a = 23 + a +---- + 21 + 22 + 23 +(3 rows) + +SELECT * FROM y; + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 21 + 22 + 23 +(13 rows) + +DROP TRIGGER y_trig ON y; +CREATE TRIGGER y_trig AFTER INSERT ON y FOR EACH ROW + EXECUTE PROCEDURE y_trigger(); +WITH t AS ( + INSERT INTO y + VALUES + (31), + (32), + (33) + RETURNING * +) +SELECT * FROM t LIMIT 1; +NOTICE: y_trigger: a = 31 +NOTICE: y_trigger: a = 32 +NOTICE: y_trigger: a = 33 + a +---- + 31 +(1 row) + +SELECT * FROM y; + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 21 + 22 + 23 + 31 + 32 + 33 +(16 rows) + +DROP TRIGGER y_trig ON y; +CREATE OR REPLACE FUNCTION y_trigger() RETURNS trigger AS $$ +begin + raise notice 'y_trigger'; + return null; +end; +$$ LANGUAGE plpgsql; +CREATE TRIGGER y_trig AFTER INSERT ON y FOR EACH STATEMENT + EXECUTE PROCEDURE y_trigger(); +ERROR: Triggers for statements are not yet supported +WITH t AS ( + INSERT INTO y + VALUES + (41), + (42), + (43) + RETURNING * +) +SELECT * FROM t; + a +---- + 41 + 42 + 43 +(3 rows) + +SELECT * FROM y; + a +---- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 21 + 22 + 23 + 31 + 32 + 33 + 41 + 42 + 43 +(19 rows) + +DROP TRIGGER y_trig ON y; +ERROR: trigger "y_trig" for table "y" does not exist +DROP FUNCTION y_trigger(); +-- end_ignore +-- WITH attached to inherited UPDATE or DELETE +CREATE TEMP TABLE parent ( id int, val text ); +CREATE TEMP TABLE child1 ( ) INHERITS ( parent ); +CREATE TEMP TABLE child2 ( ) INHERITS ( parent ); +INSERT INTO parent VALUES ( 1, 'p1' ); +INSERT INTO child1 VALUES ( 11, 'c11' ),( 12, 'c12' ); +INSERT INTO child2 VALUES ( 23, 'c21' ),( 24, 'c22' ); +WITH rcte AS ( SELECT sum(id) AS totalid FROM parent ) +UPDATE parent SET id = id + totalid FROM rcte; +SELECT * FROM parent; + id | val +----+----- + 72 | p1 + 82 | c11 + 83 | c12 + 94 | c21 + 95 | c22 +(5 rows) + +WITH wcte AS ( INSERT INTO child1 VALUES ( 42, 'new' ) RETURNING id AS newid ) +UPDATE parent SET id = id + newid FROM wcte; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +SELECT * FROM parent; + id | val +----+----- + 72 | p1 + 82 | c11 + 83 | c12 + 94 | c21 + 95 | c22 +(5 rows) + +WITH rcte AS ( SELECT max(id) AS maxid FROM parent ) +DELETE FROM parent USING rcte WHERE id = maxid; +SELECT * FROM parent; + id | val +----+----- + 72 | p1 + 82 | c11 + 83 | c12 + 94 | c21 +(4 rows) + +WITH wcte AS ( INSERT INTO child2 VALUES ( 42, 'new2' ) RETURNING id AS newid ) +DELETE FROM parent USING wcte WHERE id = newid; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +SELECT * FROM parent; + id | val +----+----- + 72 | p1 + 82 | c11 + 83 | c12 + 94 | c21 +(4 rows) + +-- check EXPLAIN VERBOSE for a wCTE with RETURNING +EXPLAIN (VERBOSE, COSTS OFF) +WITH wcte AS ( INSERT INTO int8_tbl VALUES ( 42, 47 ) RETURNING q2 ) +DELETE FROM a USING wcte WHERE aa = q2; +ERROR: writable CTE queries cannot be themselves writable +DETAIL: Cloudberry Database currently only support CTEs with one writable clause, called in a non-writable context. +HINT: Rewrite the query to only include one writable clause. +-- error cases +-- data-modifying WITH tries to use its own output +WITH RECURSIVE t AS ( + INSERT INTO y + SELECT * FROM t +) +VALUES(FALSE); +ERROR: recursive query "t" must not contain data-modifying statements +LINE 1: WITH RECURSIVE t AS ( + ^ +-- no RETURNING in a referenced data-modifying WITH +WITH t AS ( + INSERT INTO y VALUES(0) +) +SELECT * FROM t; +ERROR: WITH query "t" does not have a RETURNING clause +LINE 4: SELECT * FROM t; + ^ +-- data-modifying WITH allowed only at the top level +SELECT * FROM ( + WITH t AS (UPDATE y SET a=a+1 RETURNING *) + SELECT * FROM t +) ss; +ERROR: WITH clause containing a data-modifying statement must be at the top level +LINE 2: WITH t AS (UPDATE y SET a=a+1 RETURNING *) + ^ +-- most variants of rules aren't allowed +CREATE RULE y_rule AS ON INSERT TO y WHERE a=0 DO INSTEAD DELETE FROM y; +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +ERROR: conditional DO INSTEAD rules are not supported for data-modifying statements in WITH +CREATE OR REPLACE RULE y_rule AS ON INSERT TO y DO INSTEAD NOTHING; +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +ERROR: DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH +CREATE OR REPLACE RULE y_rule AS ON INSERT TO y DO INSTEAD NOTIFY foo; +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +ERROR: DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH +CREATE OR REPLACE RULE y_rule AS ON INSERT TO y DO ALSO NOTIFY foo; +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +ERROR: DO ALSO rules are not supported for data-modifying statements in WITH +CREATE OR REPLACE RULE y_rule AS ON INSERT TO y + DO INSTEAD (NOTIFY foo; NOTIFY bar); +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +ERROR: multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH +DROP RULE y_rule ON y; +-- check that parser lookahead for WITH doesn't cause any odd behavior +create table foo (with baz); -- fail, WITH is a reserved word +ERROR: syntax error at or near "with" +LINE 1: create table foo (with baz); + ^ +create table foo (with ordinality); -- fail, WITH is a reserved word +ERROR: syntax error at or near "with" +LINE 1: create table foo (with ordinality); + ^ +with ordinality as (select 1 as x) select * from ordinality; + x +--- + 1 +(1 row) + +-- check sane response to attempt to modify CTE relation +WITH with_test AS (SELECT 42) INSERT INTO with_test VALUES (1); +ERROR: relation "with_test" does not exist +LINE 1: WITH with_test AS (SELECT 42) INSERT INTO with_test VALUES (... + ^ +-- check response to attempt to modify table with same name as a CTE (perhaps +-- surprisingly it works, because CTEs don't hide tables from data-modifying +-- statements) +create temp table with_test (i int); +with with_test as (select 42) insert into with_test select * from with_test; +select * from with_test; + i +---- + 42 +(1 row) + +drop table with_test; diff --git a/src/test/singlenode_regress/expected/workfile/hashagg_spill.out b/src/test/singlenode_regress/expected/workfile/hashagg_spill.out new file mode 100644 index 00000000000..62a5f57369a --- /dev/null +++ b/src/test/singlenode_regress/expected/workfile/hashagg_spill.out @@ -0,0 +1,146 @@ +-- Ignore "workfile compresssion is not supported by this build" (see +-- 'zlib' test): +-- +-- start_matchignore +-- m/ERROR: workfile compresssion is not supported by this build/ +-- end_matchignore +create schema hashagg_spill; +set search_path to hashagg_spill; +-- start_ignore +create language plpython3u; +-- end_ignore +-- force multistage to increase likelihood of spilling +set optimizer_force_multistage_agg = on; +-- set workfile is created to true if all segment did it. +create or replace function hashagg_spill.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content = -1;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'spilling' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((segment -*\d+).+ Workfile: \((\d+) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; +create table testhagg (i1 int, i2 int, i3 int, i4 int); +insert into testhagg select i,i,i,i from + (select generate_series(1, nsegments * 30000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content = -1) foo) bar; +analyze testhagg; +set statement_mem="1800"; +set work_mem='1800'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set gp_resqueue_print_operator_memory_limits=on; +-- the number of rows returned by the query varies depending on the number of segments, so +-- only print the first 10 +select * from (select max(i1) from testhagg group by i2) foo order by 1 limit 10; + max +----- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +(10 rows) + +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) select max(i1) from testhagg group by i2;'); + is_workfile_created +--------------------- + 1 +(1 row) + +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) select max(i1) from testhagg group by i2 limit 90000;'); + is_workfile_created +--------------------- + 1 +(1 row) + +reset all; +set search_path to hashagg_spill; +-- Test agg spilling scenarios +create table aggspill (i int, j int, t text); +insert into aggspill select i, i*2, i::text from generate_series(1, 10000) i; +analyze aggspill; +insert into aggspill select i, i*2, i::text from generate_series(1, 100000) i; +insert into aggspill select i, i*2, i::text from generate_series(1, 1000000) i; +-- No spill with large statement memory +set statement_mem = '125MB'; +set work_mem='125MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 1) g; + count +-------- + 900000 +(1 row) + +-- Reduce the statement memory to induce spilling +set statement_mem = '10MB'; +set work_mem='10MB'; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 2) g'); + is_workfile_created +--------------------- + 1 +(1 row) + +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 2) g; + count +------- + 90000 +(1 row) + +reset optimizer_force_multistage_agg; +-- Test the spilling of aggstates +-- with and without serial/deserial functions +-- with and without workfile compression +-- The transition type of numeric is internal, and hence it uses the serial/deserial functions when spilling +-- The transition type value of integer is by Ref, and it does not have any serial/deserial function when spilling +CREATE TABLE hashagg_spill(col1 numeric, col2 int); +INSERT INTO hashagg_spill SELECT id, 1 FROM generate_series(1,20000) id; +ANALYZE hashagg_spill; +SET statement_mem='1000kB'; +SET gp_workfile_compression = OFF; +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) SELECT avg(col2) col2 FROM hashagg_spill GROUP BY col1 HAVING(sum(col1)) < 0;'); + is_workfile_created +--------------------- + 1 +(1 row) + +SET gp_workfile_compression = ON; +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) SELECT avg(col2) col2 FROM hashagg_spill GROUP BY col1 HAVING(sum(col1)) < 0;'); + is_workfile_created +--------------------- + 1 +(1 row) + +-- check spilling to a temp tablespace +CREATE TABLE spill_temptblspace (a numeric); +SET temp_tablespaces=pg_default; +INSERT INTO spill_temptblspace SELECT avg(col2) col2 FROM hashagg_spill GROUP BY col1 HAVING(sum(col1)) < 0; +RESET temp_tablespaces; +RESET statement_mem; +RESET gp_workfile_compression; +drop schema hashagg_spill cascade; +NOTICE: drop cascades to 5 other objects +DETAIL: drop cascades to function is_workfile_created(text) +drop cascades to table testhagg +drop cascades to table aggspill +drop cascades to table hashagg_spill +drop cascades to table spill_temptblspace diff --git a/src/test/singlenode_regress/expected/workfile/hashjoin_spill.out b/src/test/singlenode_regress/expected/workfile/hashjoin_spill.out new file mode 100644 index 00000000000..7ae6395d23f --- /dev/null +++ b/src/test/singlenode_regress/expected/workfile/hashjoin_spill.out @@ -0,0 +1,101 @@ +-- Ignore "workfile compresssion is not supported by this build" (see +-- 'zlib' test): +-- +-- start_matchignore +-- m/ERROR: workfile compresssion is not supported by this build/ +-- end_matchignore +create schema hashjoin_spill; +set search_path to hashjoin_spill; +-- start_ignore +create language plpython3u; +-- end_ignore +-- set workfile is created to true if all segment did it. +create or replace function hashjoin_spill.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content = -1;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'spilling' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((segment -*\d+).+ Workfile: \((\d+) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; +CREATE TABLE test_hj_spill (i1 int, i2 int, i3 int, i4 int, i5 int, i6 int, i7 int, i8 int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i1' as the Cloudberry Database 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. +insert into test_hj_spill SELECT i,i,i%1000,i,i,i,i,i from + (select generate_series(1, nsegments * 45000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content = -1) foo) bar; +SET statement_mem=1024; +set work_mem=1024; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +set gp_resqueue_print_operator_memory_limits=on; +set gp_workfile_compression = on; +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; + avg +---------------------- + 499.5000000000000000 +(1 row) + +select * from hashjoin_spill.is_workfile_created('explain (analyze, verbose) SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2'); + is_workfile_created +--------------------- + 1 +(1 row) + +select * from hashjoin_spill.is_workfile_created('explain (analyze, verbose) SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 45000;'); + is_workfile_created +--------------------- + 1 +(1 row) + +set gp_workfile_compression = off; +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; + avg +---------------------- + 499.5000000000000000 +(1 row) + +select * from hashjoin_spill.is_workfile_created('explain (analyze, verbose) SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2'); + is_workfile_created +--------------------- + 1 +(1 row) + +select * from hashjoin_spill.is_workfile_created('explain (analyze, verbose) SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 45000;'); + is_workfile_created +--------------------- + 1 +(1 row) + +-- Test with a larger data set, so that all the operations don't fit in a +-- single compression buffer. +set gp_workfile_compression = on; +select count(1) from generate_series(1, 1000000) t1 left join generate_series(1, 50000) t2 on t1 = t2; + count +--------- + 1000000 +(1 row) + +set gp_workfile_compression = off; +select count(1) from generate_series(1, 1000000) t1 left join generate_series(1, 50000) t2 on t1 = t2; + count +--------- + 1000000 +(1 row) + +drop schema hashjoin_spill cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function is_workfile_created(text) +drop cascades to table test_hj_spill diff --git a/src/test/singlenode_regress/expected/write_parallel.out b/src/test/singlenode_regress/expected/write_parallel.out new file mode 100644 index 00000000000..0b17ae6f52e --- /dev/null +++ b/src/test/singlenode_regress/expected/write_parallel.out @@ -0,0 +1,68 @@ +-- +-- PARALLEL +-- +begin; +-- encourage use of parallel plans +set parallel_setup_cost=0; +set parallel_tuple_cost=0; +set min_parallel_table_scan_size=0; +set max_parallel_workers_per_gather=4; +-- +-- Test write operations that has an underlying query that is eligible +-- for parallel plans +-- +explain (costs off) create table parallel_write as + select length(stringu1) from tenk1 group by length(stringu1); + QUERY PLAN +--------------------------------------- + HashAggregate + Group Key: length((stringu1)::text) + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(4 rows) + +create table parallel_write as + select length(stringu1) from tenk1 group by length(stringu1); +drop table parallel_write; +explain (costs off) select length(stringu1) into parallel_write + from tenk1 group by length(stringu1); + QUERY PLAN +--------------------------------------- + HashAggregate + Group Key: length((stringu1)::text) + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(4 rows) + +select length(stringu1) into parallel_write + from tenk1 group by length(stringu1); +drop table parallel_write; +explain (costs off) create materialized view parallel_mat_view as + select length(stringu1) from tenk1 group by length(stringu1); + QUERY PLAN +--------------------------------------- + HashAggregate + Group Key: length((stringu1)::text) + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(4 rows) + +create materialized view parallel_mat_view as + select length(stringu1) from tenk1 group by length(stringu1); +create unique index on parallel_mat_view(length); +refresh materialized view parallel_mat_view; +refresh materialized view concurrently parallel_mat_view; +drop materialized view parallel_mat_view; +prepare prep_stmt as select length(stringu1) from tenk1 group by length(stringu1); +explain (costs off) create table parallel_write as execute prep_stmt; + QUERY PLAN +--------------------------------------- + HashAggregate + Group Key: length((stringu1)::text) + -> Seq Scan on tenk1 + Optimizer: Postgres query optimizer +(4 rows) + +create table parallel_write as execute prep_stmt; +drop table parallel_write; +rollback; diff --git a/src/test/singlenode_regress/expected/xid.out b/src/test/singlenode_regress/expected/xid.out new file mode 100644 index 00000000000..b7a1ed0f9ee --- /dev/null +++ b/src/test/singlenode_regress/expected/xid.out @@ -0,0 +1,462 @@ +-- xid and xid8 +-- values in range, in octal, decimal, hex +select '010'::xid, + '42'::xid, + '0xffffffff'::xid, + '-1'::xid, + '010'::xid8, + '42'::xid8, + '0xffffffffffffffff'::xid8, + '-1'::xid8; + xid | xid | xid | xid | xid8 | xid8 | xid8 | xid8 +-----+-----+------------+------------+------+------+----------------------+---------------------- + 8 | 42 | 4294967295 | 4294967295 | 8 | 42 | 18446744073709551615 | 18446744073709551615 +(1 row) + +-- garbage values are not yet rejected (perhaps they should be) +select ''::xid; + xid +----- + 0 +(1 row) + +select 'asdf'::xid; + xid +----- + 0 +(1 row) + +select ''::xid8; + xid8 +------ + 0 +(1 row) + +select 'asdf'::xid8; + xid8 +------ + 0 +(1 row) + +-- equality +select '1'::xid = '1'::xid; + ?column? +---------- + t +(1 row) + +select '1'::xid != '1'::xid; + ?column? +---------- + f +(1 row) + +select '1'::xid8 = '1'::xid8; + ?column? +---------- + t +(1 row) + +select '1'::xid8 != '1'::xid8; + ?column? +---------- + f +(1 row) + +-- conversion +select '1'::xid = '1'::xid8::xid; + ?column? +---------- + t +(1 row) + +select '1'::xid != '1'::xid8::xid; + ?column? +---------- + f +(1 row) + +-- we don't want relational operators for xid, due to use of modular arithmetic +select '1'::xid < '2'::xid; +ERROR: operator does not exist: xid < xid +LINE 1: select '1'::xid < '2'::xid; + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +select '1'::xid <= '2'::xid; +ERROR: operator does not exist: xid <= xid +LINE 1: select '1'::xid <= '2'::xid; + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +select '1'::xid > '2'::xid; +ERROR: operator does not exist: xid > xid +LINE 1: select '1'::xid > '2'::xid; + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +select '1'::xid >= '2'::xid; +ERROR: operator does not exist: xid >= xid +LINE 1: select '1'::xid >= '2'::xid; + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- we want them for xid8 though +select '1'::xid8 < '2'::xid8, '2'::xid8 < '2'::xid8, '2'::xid8 < '1'::xid8; + ?column? | ?column? | ?column? +----------+----------+---------- + t | f | f +(1 row) + +select '1'::xid8 <= '2'::xid8, '2'::xid8 <= '2'::xid8, '2'::xid8 <= '1'::xid8; + ?column? | ?column? | ?column? +----------+----------+---------- + t | t | f +(1 row) + +select '1'::xid8 > '2'::xid8, '2'::xid8 > '2'::xid8, '2'::xid8 > '1'::xid8; + ?column? | ?column? | ?column? +----------+----------+---------- + f | f | t +(1 row) + +select '1'::xid8 >= '2'::xid8, '2'::xid8 >= '2'::xid8, '2'::xid8 >= '1'::xid8; + ?column? | ?column? | ?column? +----------+----------+---------- + f | t | t +(1 row) + +-- we also have a 3way compare for btrees +select xid8cmp('1', '2'), xid8cmp('2', '2'), xid8cmp('2', '1'); + xid8cmp | xid8cmp | xid8cmp +---------+---------+--------- + -1 | 0 | 1 +(1 row) + +-- xid8 has btree and hash opclasses +create table xid8_t1 (x xid8); +create index on xid8_t1 using btree(x); +create index on xid8_t1 using hash(x); +drop table xid8_t1; +-- pg_snapshot data type and related functions +-- Note: another set of tests similar to this exists in txid.sql, for a limited +-- time (the relevant functions share C code) +-- i/o +select '12:13:'::pg_snapshot; + pg_snapshot +------------- + 12:13: +(1 row) + +select '12:18:14,16'::pg_snapshot; + pg_snapshot +------------- + 12:18:14,16 +(1 row) + +select '12:16:14,14'::pg_snapshot; + pg_snapshot +------------- + 12:16:14 +(1 row) + +-- errors +select '31:12:'::pg_snapshot; +ERROR: invalid input syntax for type pg_snapshot: "31:12:" +LINE 1: select '31:12:'::pg_snapshot; + ^ +select '0:1:'::pg_snapshot; +ERROR: invalid input syntax for type pg_snapshot: "0:1:" +LINE 1: select '0:1:'::pg_snapshot; + ^ +select '12:13:0'::pg_snapshot; +ERROR: invalid input syntax for type pg_snapshot: "12:13:0" +LINE 1: select '12:13:0'::pg_snapshot; + ^ +select '12:16:14,13'::pg_snapshot; +ERROR: invalid input syntax for type pg_snapshot: "12:16:14,13" +LINE 1: select '12:16:14,13'::pg_snapshot; + ^ +create temp table snapshot_test ( + nr integer, + snap pg_snapshot +); +insert into snapshot_test values (1, '12:13:'); +insert into snapshot_test values (2, '12:20:13,15,18'); +insert into snapshot_test values (3, '100001:100009:100005,100007,100008'); +insert into snapshot_test values (4, '100:150:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131'); +select snap from snapshot_test order by nr; + snap +------------------------------------------------------------------------------------------------------------------------------------- + 12:13: + 12:20:13,15,18 + 100001:100009:100005,100007,100008 + 100:150:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131 +(4 rows) + +select pg_snapshot_xmin(snap), + pg_snapshot_xmax(snap), + pg_snapshot_xip(snap) +from snapshot_test order by nr; + pg_snapshot_xmin | pg_snapshot_xmax | pg_snapshot_xip +------------------+------------------+----------------- + 12 | 20 | 13 + 12 | 20 | 15 + 12 | 20 | 18 + 100001 | 100009 | 100005 + 100001 | 100009 | 100007 + 100001 | 100009 | 100008 + 100 | 150 | 101 + 100 | 150 | 102 + 100 | 150 | 103 + 100 | 150 | 104 + 100 | 150 | 105 + 100 | 150 | 106 + 100 | 150 | 107 + 100 | 150 | 108 + 100 | 150 | 109 + 100 | 150 | 110 + 100 | 150 | 111 + 100 | 150 | 112 + 100 | 150 | 113 + 100 | 150 | 114 + 100 | 150 | 115 + 100 | 150 | 116 + 100 | 150 | 117 + 100 | 150 | 118 + 100 | 150 | 119 + 100 | 150 | 120 + 100 | 150 | 121 + 100 | 150 | 122 + 100 | 150 | 123 + 100 | 150 | 124 + 100 | 150 | 125 + 100 | 150 | 126 + 100 | 150 | 127 + 100 | 150 | 128 + 100 | 150 | 129 + 100 | 150 | 130 + 100 | 150 | 131 +(37 rows) + +select id, pg_visible_in_snapshot(id::text::xid8, snap) +from snapshot_test, generate_series(11, 21) id +where nr = 2; + id | pg_visible_in_snapshot +----+------------------------ + 11 | t + 12 | t + 13 | f + 14 | t + 15 | f + 16 | t + 17 | t + 18 | f + 19 | t + 20 | f + 21 | f +(11 rows) + +-- test bsearch +select id, pg_visible_in_snapshot(id::text::xid8, snap) +from snapshot_test, generate_series(90, 160) id +where nr = 4; + id | pg_visible_in_snapshot +-----+------------------------ + 90 | t + 91 | t + 92 | t + 93 | t + 94 | t + 95 | t + 96 | t + 97 | t + 98 | t + 99 | t + 100 | t + 101 | f + 102 | f + 103 | f + 104 | f + 105 | f + 106 | f + 107 | f + 108 | f + 109 | f + 110 | f + 111 | f + 112 | f + 113 | f + 114 | f + 115 | f + 116 | f + 117 | f + 118 | f + 119 | f + 120 | f + 121 | f + 122 | f + 123 | f + 124 | f + 125 | f + 126 | f + 127 | f + 128 | f + 129 | f + 130 | f + 131 | f + 132 | t + 133 | t + 134 | t + 135 | t + 136 | t + 137 | t + 138 | t + 139 | t + 140 | t + 141 | t + 142 | t + 143 | t + 144 | t + 145 | t + 146 | t + 147 | t + 148 | t + 149 | t + 150 | f + 151 | f + 152 | f + 153 | f + 154 | f + 155 | f + 156 | f + 157 | f + 158 | f + 159 | f + 160 | f +(71 rows) + +-- test current values also +select pg_current_xact_id() >= pg_snapshot_xmin(pg_current_snapshot()); + ?column? +---------- + t +(1 row) + +-- we can't assume current is always less than xmax, however +select pg_visible_in_snapshot(pg_current_xact_id(), pg_current_snapshot()); + pg_visible_in_snapshot +------------------------ + f +(1 row) + +-- test 64bitness +select pg_snapshot '1000100010001000:1000100010001100:1000100010001012,1000100010001013'; + pg_snapshot +--------------------------------------------------------------------- + 1000100010001000:1000100010001100:1000100010001012,1000100010001013 +(1 row) + +select pg_visible_in_snapshot('1000100010001012', '1000100010001000:1000100010001100:1000100010001012,1000100010001013'); + pg_visible_in_snapshot +------------------------ + f +(1 row) + +select pg_visible_in_snapshot('1000100010001015', '1000100010001000:1000100010001100:1000100010001012,1000100010001013'); + pg_visible_in_snapshot +------------------------ + t +(1 row) + +-- test 64bit overflow +SELECT pg_snapshot '1:9223372036854775807:3'; + pg_snapshot +------------------------- + 1:9223372036854775807:3 +(1 row) + +SELECT pg_snapshot '1:9223372036854775808:3'; +ERROR: invalid input syntax for type pg_snapshot: "1:9223372036854775808:3" +LINE 1: SELECT pg_snapshot '1:9223372036854775808:3'; + ^ +-- test pg_current_xact_id_if_assigned +BEGIN; +SELECT pg_current_xact_id_if_assigned() IS NULL; + ?column? +---------- + t +(1 row) + +SELECT pg_current_xact_id() \gset +SELECT pg_current_xact_id_if_assigned() IS NOT DISTINCT FROM xid8 :'pg_current_xact_id'; + ?column? +---------- + t +(1 row) + +COMMIT; +-- test xid status functions +BEGIN; +SELECT pg_current_xact_id() AS committed \gset +COMMIT; +BEGIN; +SELECT pg_current_xact_id() AS rolledback \gset +ROLLBACK; +BEGIN; +SELECT pg_current_xact_id() AS inprogress \gset +SELECT pg_xact_status(:committed::text::xid8) AS committed; + committed +----------- + committed +(1 row) + +SELECT pg_xact_status(:rolledback::text::xid8) AS rolledback; + rolledback +------------ + aborted +(1 row) + +SELECT pg_xact_status(:inprogress::text::xid8) AS inprogress; + inprogress +------------- + in progress +(1 row) + +SELECT pg_xact_status('1'::xid8); -- BootstrapTransactionId is always committed + pg_xact_status +---------------- + committed +(1 row) + +SELECT pg_xact_status('2'::xid8); -- FrozenTransactionId is always committed + pg_xact_status +---------------- + committed +(1 row) + +SELECT pg_xact_status('3'::xid8); -- in regress testing FirstNormalTransactionId will always be behind oldestXmin + pg_xact_status +---------------- + +(1 row) + +COMMIT; +BEGIN; +CREATE FUNCTION test_future_xid_status(xid8) +RETURNS void +LANGUAGE plpgsql +AS +$$ +BEGIN + PERFORM pg_xact_status($1); + RAISE EXCEPTION 'didn''t ERROR at xid in the future as expected'; +EXCEPTION + WHEN invalid_parameter_value THEN + RAISE NOTICE 'Got expected error for xid in the future'; +END; +$$; +SELECT test_future_xid_status((:inprogress + 10000)::text::xid8); +NOTICE: Got expected error for xid in the future + test_future_xid_status +------------------------ + +(1 row) + +ROLLBACK; diff --git a/src/test/singlenode_regress/expected/xml.out b/src/test/singlenode_regress/expected/xml.out new file mode 100644 index 00000000000..43ab9a514a2 --- /dev/null +++ b/src/test/singlenode_regress/expected/xml.out @@ -0,0 +1,1584 @@ +CREATE TABLE xmltest ( + id int, + data xml +); +INSERT INTO xmltest VALUES (1, 'one'); +INSERT INTO xmltest VALUES (2, 'two'); +INSERT INTO xmltest VALUES (3, 'one + 2 | two +(2 rows) + +SELECT xmlcomment('test'); + xmlcomment +------------- + +(1 row) + +SELECT xmlcomment('-test'); + xmlcomment +-------------- + +(1 row) + +SELECT xmlcomment('test-'); +ERROR: invalid XML comment +SELECT xmlcomment('--test'); +ERROR: invalid XML comment +SELECT xmlcomment('te st'); + xmlcomment +-------------- + +(1 row) + +SELECT xmlconcat(xmlcomment('hello'), + xmlelement(NAME qux, 'foo'), + xmlcomment('world')); + xmlconcat +---------------------------------------- + foo +(1 row) + +SELECT xmlconcat('hello', 'you'); + xmlconcat +----------- + helloyou +(1 row) + +SELECT xmlconcat(1, 2); +ERROR: argument of XMLCONCAT must be type xml, not type integer +LINE 1: SELECT xmlconcat(1, 2); + ^ +SELECT xmlconcat('bad', '', NULL, ''); + xmlconcat +-------------- + +(1 row) + +SELECT xmlconcat('', NULL, ''); + xmlconcat +----------------------------------- + +(1 row) + +SELECT xmlconcat(NULL); + xmlconcat +----------- + +(1 row) + +SELECT xmlconcat(NULL, NULL); + xmlconcat +----------- + +(1 row) + +SELECT xmlelement(name element, + xmlattributes (1 as one, 'deuce' as two), + 'content'); + xmlelement +------------------------------------------------ + content +(1 row) + +SELECT xmlelement(name element, + xmlattributes ('unnamed and wrong')); +ERROR: unnamed XML attribute value must be a column reference +LINE 2: xmlattributes ('unnamed and wrong')); + ^ +SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); + xmlelement +------------------------------------------- + stuff +(1 row) + +SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + xmlelement +---------------------------------------------------------------------- + sharon251000 + sam302000 + bill201000 + jeff23600 + cim30400 + linda19100 +(6 rows) + +SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); +ERROR: XML attribute name "a" appears more than once +LINE 1: ...ment(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); + ^ +SELECT xmlelement(name num, 37); + xmlelement +--------------- + 37 +(1 row) + +SELECT xmlelement(name foo, text 'bar'); + xmlelement +---------------- + bar +(1 row) + +SELECT xmlelement(name foo, xml 'bar'); + xmlelement +---------------- + bar +(1 row) + +SELECT xmlelement(name foo, text 'br'); + xmlelement +------------------------- + b<a/>r +(1 row) + +SELECT xmlelement(name foo, xml 'br'); + xmlelement +------------------- + br +(1 row) + +SELECT xmlelement(name foo, array[1, 2, 3]); + xmlelement +------------------------------------------------------------------------- + 123 +(1 row) + +SET xmlbinary TO base64; +SELECT xmlelement(name foo, bytea 'bar'); + xmlelement +----------------- + YmFy +(1 row) + +SET xmlbinary TO hex; +SELECT xmlelement(name foo, bytea 'bar'); + xmlelement +------------------- + 626172 +(1 row) + +SELECT xmlelement(name foo, xmlattributes(true as bar)); + xmlelement +------------------- + +(1 row) + +SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); + xmlelement +---------------------------------- + +(1 row) + +SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); +ERROR: timestamp out of range +DETAIL: XML does not support infinite timestamp values. +SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'br' as funnier)); + xmlelement +------------------------------------------------------------ + +(1 row) + +SELECT xmlparse(content ''); + xmlparse +---------- + +(1 row) + +SELECT xmlparse(content ' '); + xmlparse +---------- + +(1 row) + +SELECT xmlparse(content 'abc'); + xmlparse +---------- + abc +(1 row) + +SELECT xmlparse(content 'x'); + xmlparse +-------------- + x +(1 row) + +SELECT xmlparse(content '&'); +ERROR: invalid XML content +DETAIL: line 1: xmlParseEntityRef: no name +& + ^ +line 1: chunk is not well balanced +& + ^ +SELECT xmlparse(content '&idontexist;'); +ERROR: invalid XML content +DETAIL: line 1: Entity 'idontexist' not defined +&idontexist; + ^ +line 1: chunk is not well balanced +&idontexist; + ^ +SELECT xmlparse(content ''); + xmlparse +--------------------------- + +(1 row) + +SELECT xmlparse(content ''); + xmlparse +-------------------------------- + +(1 row) + +SELECT xmlparse(content '&idontexist;'); +ERROR: invalid XML content +DETAIL: line 1: Entity 'idontexist' not defined +&idontexist; + ^ +line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced +&idontexist; + ^ +line 1: chunk is not well balanced +&idontexist; + ^ +SELECT xmlparse(content ''); + xmlparse +--------------------- + +(1 row) + +SELECT xmlparse(document ' '); +ERROR: invalid XML document +DETAIL: line 1: Start tag expected, '<' not found + + ^ +SELECT xmlparse(document 'abc'); +ERROR: invalid XML document +DETAIL: line 1: Start tag expected, '<' not found +abc +^ +SELECT xmlparse(document 'x'); + xmlparse +-------------- + x +(1 row) + +SELECT xmlparse(document '&'); +ERROR: invalid XML document +DETAIL: line 1: xmlParseEntityRef: no name +& + ^ +line 1: Opening and ending tag mismatch: invalidentity line 1 and abc +& + ^ +SELECT xmlparse(document '&idontexist;'); +ERROR: invalid XML document +DETAIL: line 1: Entity 'idontexist' not defined +&idontexist; + ^ +line 1: Opening and ending tag mismatch: undefinedentity line 1 and abc +&idontexist; + ^ +SELECT xmlparse(document ''); + xmlparse +--------------------------- + +(1 row) + +SELECT xmlparse(document ''); + xmlparse +-------------------------------- + +(1 row) + +SELECT xmlparse(document '&idontexist;'); +ERROR: invalid XML document +DETAIL: line 1: Entity 'idontexist' not defined +&idontexist; + ^ +line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced +&idontexist; + ^ +SELECT xmlparse(document ''); + xmlparse +--------------------- + +(1 row) + +SELECT xmlpi(name foo); + xmlpi +--------- + +(1 row) + +SELECT xmlpi(name xml); +ERROR: invalid XML processing instruction +DETAIL: XML processing instruction target name cannot be "xml". +SELECT xmlpi(name xmlstuff); + xmlpi +-------------- + +(1 row) + +SELECT xmlpi(name foo, 'bar'); + xmlpi +------------- + +(1 row) + +SELECT xmlpi(name foo, 'in?>valid'); +ERROR: invalid XML processing instruction +DETAIL: XML processing instruction cannot contain "?>". +SELECT xmlpi(name foo, null); + xmlpi +------- + +(1 row) + +SELECT xmlpi(name xml, null); +ERROR: invalid XML processing instruction +DETAIL: XML processing instruction target name cannot be "xml". +SELECT xmlpi(name xmlstuff, null); + xmlpi +------- + +(1 row) + +SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); + xmlpi +------------------------------------------------------- + +(1 row) + +SELECT xmlpi(name foo, ' bar'); + xmlpi +------------- + +(1 row) + +SELECT xmlroot(xml '', version no value, standalone no value); + xmlroot +--------- + +(1 row) + +SELECT xmlroot(xml '', version '2.0'); + xmlroot +----------------------------- + +(1 row) + +SELECT xmlroot(xml '', version no value, standalone yes); + xmlroot +---------------------------------------------- + +(1 row) + +SELECT xmlroot(xml '', version no value, standalone yes); + xmlroot +---------------------------------------------- + +(1 row) + +SELECT xmlroot(xmlroot(xml '', version '1.0'), version '1.1', standalone no); + xmlroot +--------------------------------------------- + +(1 row) + +SELECT xmlroot('', version no value, standalone no); + xmlroot +--------------------------------------------- + +(1 row) + +SELECT xmlroot('', version no value, standalone no value); + xmlroot +--------- + +(1 row) + +SELECT xmlroot('', version no value); + xmlroot +---------------------------------------------- + +(1 row) + +SELECT xmlroot ( + xmlelement ( + name gazonk, + xmlattributes ( + 'val' AS name, + 1 + 1 AS num + ), + xmlelement ( + NAME qux, + 'foo' + ) + ), + version '1.0', + standalone yes +); + xmlroot +------------------------------------------------------------------------------------------ + foo +(1 row) + +SELECT xmlserialize(content data as character varying(20)) FROM xmltest; + xmlserialize +-------------------- + one + two +(2 rows) + +SELECT xmlserialize(content 'good' as char(10)); + xmlserialize +-------------- + good +(1 row) + +SELECT xmlserialize(document 'bad' as text); +ERROR: not an XML document +SELECT xml 'bar' IS DOCUMENT; + ?column? +---------- + t +(1 row) + +SELECT xml 'barfoo' IS DOCUMENT; + ?column? +---------- + f +(1 row) + +SELECT xml '' IS NOT DOCUMENT; + ?column? +---------- + f +(1 row) + +SELECT xml 'abc' IS NOT DOCUMENT; + ?column? +---------- + t +(1 row) + +SELECT '<>' IS NOT DOCUMENT; +ERROR: invalid XML content +LINE 1: SELECT '<>' IS NOT DOCUMENT; + ^ +DETAIL: line 1: StartTag: invalid element name +<> + ^ +SELECT xmlagg(data order by id) FROM xmltest; + xmlagg +-------------------------------------- + onetwo +(1 row) + +SELECT xmlagg(data) FROM xmltest WHERE id > 10; + xmlagg +-------- + +(1 row) + +SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name) order by name)) FROM emp; + xmlelement +-------------------------------------------------------------------------------------------------------------------------------- + billcimjefflindasamsharon +(1 row) + +-- Check mapping SQL identifier to XML name +SELECT xmlpi(name ":::_xml_abc135.%-&_"); + xmlpi +------------------------------------------------- + +(1 row) + +SELECT xmlpi(name "123"); + xmlpi +--------------- + +(1 row) + +PREPARE foo (xml) AS SELECT xmlconcat('', $1); +SET XML OPTION DOCUMENT; +EXECUTE foo (''); + xmlconcat +-------------- + +(1 row) + +EXECUTE foo ('bad'); +ERROR: invalid XML document +LINE 1: EXECUTE foo ('bad'); + ^ +DETAIL: line 1: Start tag expected, '<' not found +bad +^ +SELECT xml ''; +ERROR: invalid XML document +LINE 1: SELECT xml ''; + ^ +DETAIL: line 1: Extra content at the end of the document + + ^ +SET XML OPTION CONTENT; +EXECUTE foo (''); + xmlconcat +-------------- + +(1 row) + +EXECUTE foo ('good'); + xmlconcat +------------ + good +(1 row) + +SELECT xml ' '; + xml +-------------------------------------------------------------------- + +(1 row) + +SELECT xml ' '; + xml +------------------------------ + +(1 row) + +SELECT xml ''; + xml +------------------ + +(1 row) + +SELECT xml ' oops '; +ERROR: invalid XML content +LINE 1: SELECT xml ' oops '; + ^ +DETAIL: line 1: StartTag: invalid element name + oops + ^ +SELECT xml ' '; +ERROR: invalid XML content +LINE 1: SELECT xml ' '; + ^ +DETAIL: line 1: StartTag: invalid element name + + ^ +SELECT xml ''; +ERROR: invalid XML content +LINE 1: SELECT xml ''; + ^ +DETAIL: line 1: Extra content at the end of the document + + ^ +-- Test backwards parsing +CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); +CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); +CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); +CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +CREATE VIEW xmlview5 AS SELECT xmlparse(content 'x'); +CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); +CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); +CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); +CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'xmlview%' ORDER BY 1; + table_name | view_definition +------------+------------------------------------------------------------------------------------------------------------------- + xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; + xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat"; + xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement"; + xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(emp.name AS name, emp.age AS age, emp.salary AS pay)) AS "xmlelement"+ + | FROM emp; + xmlview5 | SELECT XMLPARSE(CONTENT 'x'::text STRIP WHITESPACE) AS "xmlparse"; + xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi"; + xmlview7 | SELECT XMLROOT(''::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot"; + xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10)))::character(10) AS "xmlserialize"; + xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text) AS "xmlserialize"; +(9 rows) + +-- Text XPath expressions evaluation +SELECT xpath('/value', data) FROM xmltest; + xpath +---------------------- + {one} + {two} +(2 rows) + +SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ?column? +---------- + t + t +(2 rows) + +SELECT xpath('', ''); +ERROR: empty XPath expression +CONTEXT: SQL function "xpath" statement 1 +SELECT xpath('//text()', 'number one'); + xpath +---------------- + {"number one"} +(1 row) + +SELECT xpath('//loc:piece/@id', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); + xpath +------- + {1,2} +(1 row) + +SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); + xpath +------------------------------------------------------------------------------------------------------------------------------------------------ + {"number one",""} +(1 row) + +SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); + xpath +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"number one",""} +(1 row) + +SELECT xpath('//b', 'one two three etc'); + xpath +------------------------- + {two,etc} +(1 row) + +SELECT xpath('//text()', '<'); + xpath +-------- + {<} +(1 row) + +SELECT xpath('//@value', ''); + xpath +-------- + {<} +(1 row) + +SELECT xpath('''<>''', ''); + xpath +--------------------------- + {<<invalid>>} +(1 row) + +SELECT xpath('count(//*)', ''); + xpath +------- + {3} +(1 row) + +SELECT xpath('count(//*)=0', ''); + xpath +--------- + {false} +(1 row) + +SELECT xpath('count(//*)=3', ''); + xpath +-------- + {true} +(1 row) + +SELECT xpath('name(/*)', ''); + xpath +-------- + {root} +(1 row) + +SELECT xpath('/nosuchtag', ''); + xpath +------- + {} +(1 row) + +SELECT xpath('root', ''); + xpath +----------- + {} +(1 row) + +-- Round-trip non-ASCII data through xpath(). +DO $$ +DECLARE + xml_declaration text := ''; + degree_symbol text; + res xml[]; +BEGIN + -- Per the documentation, except when the server encoding is UTF8, xpath() + -- may not work on non-ASCII data. The untranslatable_character and + -- undefined_function traps below, currently dead code, will become relevant + -- if we remove this limitation. + IF current_setting('server_encoding') <> 'UTF8' THEN + RAISE LOG 'skip: encoding % unsupported for xpath', + current_setting('server_encoding'); + RETURN; + END IF; + + degree_symbol := convert_from('\xc2b0', 'UTF8'); + res := xpath('text()', (xml_declaration || + '' || degree_symbol || '')::xml); + IF degree_symbol <> res[1]::text THEN + RAISE 'expected % (%), got % (%)', + degree_symbol, convert_to(degree_symbol, 'UTF8'), + res[1], convert_to(res[1]::text, 'UTF8'); + END IF; +EXCEPTION + -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" + WHEN untranslatable_character + -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist + OR undefined_function + -- unsupported XML feature + OR feature_not_supported THEN + RAISE LOG 'skip: %', SQLERRM; +END +$$; +-- Test xmlexists and xpath_exists +SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); + xmlexists +----------- + f +(1 row) + +SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); + xmlexists +----------- + t +(1 row) + +SELECT xmlexists('count(/nosuchtag)' PASSING BY REF ''); + xmlexists +----------- + t +(1 row) + +SELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); + xpath_exists +-------------- + f +(1 row) + +SELECT xpath_exists('//town[text() = ''Cwmbran'']','Bidford-on-AvonCwmbranBristol'::xml); + xpath_exists +-------------- + t +(1 row) + +SELECT xpath_exists('count(/nosuchtag)', ''::xml); + xpath_exists +-------------- + t +(1 row) + +INSERT INTO xmltest VALUES (4, 'BudvarfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (5, 'MolsonfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (6, 'BudvarfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (7, 'MolsonfreeCarlinglots'::xml); +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data); + count +------- + 0 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING BY REF data BY REF); + count +------- + 0 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data); + count +------- + 2 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data); + count +------- + 1 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + count +------- + 0 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + count +------- + 2 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + count +------- + 1 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]); + count +------- + 0 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]); + count +------- + 2 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]); + count +------- + 1 +(1 row) + +CREATE TABLE query ( expr TEXT ); +INSERT INTO query VALUES ('/menu/beers/cost[text() = ''lots'']'); +SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data); + count +------- + 2 +(1 row) + +-- Test xml_is_well_formed and variants +SELECT xml_is_well_formed_document('bar'); + xml_is_well_formed_document +----------------------------- + t +(1 row) + +SELECT xml_is_well_formed_document('abc'); + xml_is_well_formed_document +----------------------------- + f +(1 row) + +SELECT xml_is_well_formed_content('bar'); + xml_is_well_formed_content +---------------------------- + t +(1 row) + +SELECT xml_is_well_formed_content('abc'); + xml_is_well_formed_content +---------------------------- + t +(1 row) + +SET xmloption TO DOCUMENT; +SELECT xml_is_well_formed('abc'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed('<>'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed(''); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('bar'); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('barbaz'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed('number one'); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('bar'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed('bar'); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('&'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed('&idontexist;'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed(''); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed(''); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('&idontexist;'); + xml_is_well_formed +-------------------- + f +(1 row) + +SET xmloption TO CONTENT; +SELECT xml_is_well_formed('abc'); + xml_is_well_formed +-------------------- + t +(1 row) + +-- Since xpath() deals with namespaces, it's a bit stricter about +-- what's well-formed and what's not. If we don't obey these rules +-- (i.e. ignore namespace-related errors from libxml), xpath() +-- fails in subtle ways. The following would for example produce +-- the xml value +-- +-- which is invalid because '<' may not appear un-escaped in +-- attribute values. +-- Since different libxml versions emit slightly different +-- error messages, we suppress the DETAIL in this test. +\set VERBOSITY terse +SELECT xpath('/*', ''); +ERROR: could not parse XML document +\set VERBOSITY default +-- Again, the XML isn't well-formed for namespace purposes +SELECT xpath('/*', ''); +ERROR: could not parse XML document +DETAIL: line 1: Namespace prefix nosuchprefix on tag is not defined + + ^ +CONTEXT: SQL function "xpath" statement 1 +-- XPath deprecates relative namespaces, but they're not supposed to +-- throw an error, only a warning. +SELECT xpath('/*', ''); +WARNING: line 1: xmlns: URI relative is not absolute + + ^ + xpath +-------------------------------------- + {""} +(1 row) + +-- External entity references should not leak filesystem information. +SELECT XMLPARSE(DOCUMENT ']>&c;'); + xmlparse +----------------------------------------------------------------- + ]>&c; +(1 row) + +SELECT XMLPARSE(DOCUMENT ']>&c;'); + xmlparse +----------------------------------------------------------------------- + ]>&c; +(1 row) + +-- This might or might not load the requested DTD, but it mustn't throw error. +SELECT XMLPARSE(DOCUMENT ' '); + xmlparse +------------------------------------------------------------------------------------------------------------------------------------------------------ +   +(1 row) + +-- XMLPATH tests +CREATE TABLE xmldata(data xml); +INSERT INTO xmldata VALUES(' + + AU + Australia + 3 + + + CN + China + 3 + + + HK + HongKong + 3 + + + IN + India + 3 + + + JP + Japan + 3Sinzo Abe + + + SG + Singapore + 3791 + +'); +-- XMLTABLE with columns +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+--------------- + 1 | 1 | Australia | AU | 3 | | | not specified + 2 | 2 | China | CN | 3 | | | not specified + 3 | 3 | HongKong | HK | 3 | | | not specified + 4 | 4 | India | IN | 3 | | | not specified + 5 | 5 | Japan | JP | 3 | | | Sinzo Abe + 6 | 6 | Singapore | SG | 3 | 791 | km | not specified +(6 rows) + +CREATE VIEW xmltableview1 AS SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +SELECT * FROM xmltableview1; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+--------------- + 1 | 1 | Australia | AU | 3 | | | not specified + 2 | 2 | China | CN | 3 | | | not specified + 3 | 3 | HongKong | HK | 3 | | | not specified + 4 | 4 | India | IN | 3 | | | not specified + 5 | 5 | Japan | JP | 3 | | | Sinzo Abe + 6 | 6 | Singapore | SG | 3 | 791 | km | not specified +(6 rows) + +\sv xmltableview1 +CREATE OR REPLACE VIEW public.xmltableview1 AS + SELECT "xmltable".id, + "xmltable"._id, + "xmltable".country_name, + "xmltable".country_id, + "xmltable".region_id, + "xmltable".size, + "xmltable".unit, + "xmltable".premier_name + FROM ( SELECT xmldata.data + FROM xmldata) x, + LATERAL XMLTABLE(('/ROWS/ROW'::text) PASSING (x.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) +EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; + QUERY PLAN +----------------------------------------------- + Nested Loop + -> Seq Scan on xmldata + -> Materialize + -> Table Function Scan on "xmltable" + Optimizer: Postgres query optimizer +(5 rows) + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Nested Loop + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +ERROR: XMLTABLE function has 1 columns available but 2 columns specified +-- XMLNAMESPACES tests +SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '10' + COLUMNS a int PATH 'zz:a'); + a +---- + 10 +(1 row) + +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '10' + COLUMNS a int PATH 'zz:a'); +SELECT * FROM xmltableview2; + a +---- + 10 +(1 row) + +SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), + '/rows/row' + PASSING '10' + COLUMNS a int PATH 'a'); +ERROR: DEFAULT namespace is not supported +SELECT * FROM XMLTABLE('.' + PASSING '' + COLUMNS a text PATH 'foo/namespace::node()'); + a +-------------------------------------- + http://www.w3.org/XML/1998/namespace +(1 row) + +-- used in prepare statements +PREPARE pp AS +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +EXECUTE pp; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+--------------- + 1 | 1 | Australia | AU | 3 | | | not specified + 2 | 2 | China | CN | 3 | | | not specified + 3 | 3 | HongKong | HK | 3 | | | not specified + 4 | 4 | India | IN | 3 | | | not specified + 5 | 5 | Japan | JP | 3 | | | Sinzo Abe + 6 | 6 | Singapore | SG | 3 | 791 | km | not specified +(6 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); + COUNTRY_NAME | REGION_ID +--------------+----------- + India | 3 + Japan | 3 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); + id | COUNTRY_NAME | REGION_ID +----+--------------+----------- + 1 | India | 3 + 2 | Japan | 3 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); + id | COUNTRY_NAME | REGION_ID +----+--------------+----------- + 4 | India | 3 + 5 | Japan | 3 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); + id +---- + 4 + 5 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); + id +---- + 1 + 2 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); + id | COUNTRY_NAME | REGION_ID | rawdata +----+--------------+-----------+------------------------------------------------------------------ + 4 | India | 3 | + + | | | IN + + | | | India + + | | | 3 + + | | | + 5 | Japan | 3 | + + | | | JP + + | | | Japan + + | | | 3Sinzo Abe+ + | | | +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); + id | COUNTRY_NAME | REGION_ID | rawdata +----+--------------+-----------+----------------------------------------------------------------------------------------------------------------------------- + 4 | India | 3 | INIndia3 + 5 | Japan | 3 | JPJapan3Sinzo Abe +(2 rows) + +SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text); + element +---------------------- + a1aa2a bbbbxxxcccc +(1 row) + +SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text PATH 'element/text()'); -- should fail +ERROR: more than one value returned by column XPath expression +-- CDATA test +select * from xmltable('d/r' passing ' &"<>!foo]]>2' columns c text); + c +------------------------- + &"<>!foo + 2 +(2 rows) + +-- XML builtin entities +SELECT * FROM xmltable('/x/a' PASSING ''"&<>' COLUMNS ent text); + ent +----- + ' + " + & + < + > +(5 rows) + +SELECT * FROM xmltable('/x/a' PASSING ''"&<>' COLUMNS ent xml); + ent +------------------ + ' + " + & + < + > +(5 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +-- test qual +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; + COUNTRY_NAME | REGION_ID +--------------+----------- + Japan | 3 +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Table Function Scan on "xmltable" + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + Table Function Call: XMLTABLE(('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]'::text) PASSING (xmldata.data) COLUMNS "COUNTRY_NAME" text, "REGION_ID" integer) + Filter: ("xmltable"."COUNTRY_NAME" = 'Japan'::text) + Optimizer: Postgres query optimizer +(11 rows) + +-- should to work with more data +INSERT INTO xmldata VALUES(' + + CZ + Czech Republic + 2Milos Zeman + + + DE + Germany + 2 + + + FR + France + 2 + +'); +INSERT INTO xmldata VALUES(' + + EG + Egypt + 1 + + + SD + Sudan + 1 + +'); +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+----------------+------------+-----------+------+------+--------------- + 1 | 1 | Australia | AU | 3 | | | not specified + 2 | 2 | China | CN | 3 | | | not specified + 3 | 3 | HongKong | HK | 3 | | | not specified + 4 | 4 | India | IN | 3 | | | not specified + 5 | 5 | Japan | JP | 3 | | | Sinzo Abe + 6 | 6 | Singapore | SG | 3 | 791 | km | not specified + 10 | 1 | Czech Republic | CZ | 2 | | | Milos Zeman + 11 | 2 | Germany | DE | 2 | | | not specified + 12 | 3 | France | FR | 2 | | | not specified + 20 | 1 | Egypt | EG | 1 | | | not specified + 21 | 2 | Sudan | SD | 1 | | | not specified +(11 rows) + +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+----------------+------------+-----------+------+------+--------------- + 10 | 1 | Czech Republic | CZ | 2 | | | Milos Zeman + 11 | 2 | Germany | DE | 2 | | | not specified + 12 | 3 | France | FR | 2 | | | not specified +(3 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Filter: ("xmltable".region_id = 2) + Optimizer: Postgres query optimizer +(11 rows) + +-- should fail, NULL value +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE' NOT NULL, + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +ERROR: null is not allowed in column "size" +-- if all is ok, then result is empty +-- one line xml test +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc WHERE proname = 'f_leak'), + y AS (SELECT xmlelement(name proc, + xmlforest(proname, proowner, + procost, pronargs, + proargnames, proargtypes)) as proc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/proc' PASSING proc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; + proname | proowner | procost | pronargs | proargnames | proargtypes +---------+----------+---------+----------+-------------+------------- +(0 rows) + +-- multi line xml test, result should be empty too +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc), + y AS (SELECT xmlelement(name data, + xmlagg(xmlelement(name proc, + xmlforest(proname, proowner, procost, + pronargs, proargnames, proargtypes)))) as doc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/data/proc' PASSING doc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; + proname | proowner | procost | pronargs | proargnames | proargtypes +---------+----------+---------+----------+-------------+------------- +(0 rows) + +CREATE TABLE xmltest2(x xml, _path text); +INSERT INTO xmltest2 VALUES('1', 'A'); +INSERT INTO xmltest2 VALUES('2', 'B'); +INSERT INTO xmltest2 VALUES('3', 'C'); +INSERT INTO xmltest2 VALUES('2', 'D'); +SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); + a +--- + 1 + 2 + 3 + 2 +(4 rows) + +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); + a +--- + 1 + 2 + 3 + 2 +(4 rows) + +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); + a +---- + 11 + 12 + 13 + 14 +(4 rows) + +-- XPath result can be boolean or number too +SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); + a | b | c | d | e +----------+---+----+---+--- + a | a | hi | t | 1 +(1 row) + +\x +SELECT * FROM XMLTABLE('*' PASSING 'pre&deeppost' COLUMNS x xml PATH 'node()', y xml PATH '/'); +-[ RECORD 1 ]----------------------------------------------------------- +x | pre&deeppost +y | pre&deeppost+ + | + +\x +SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '""', b xml PATH '""'); + a | b +--------+-------------- + | <foo/> +(1 row) + diff --git a/src/test/singlenode_regress/expected/xml_1.out b/src/test/singlenode_regress/expected/xml_1.out new file mode 100644 index 00000000000..6d266b6cf15 --- /dev/null +++ b/src/test/singlenode_regress/expected/xml_1.out @@ -0,0 +1,1431 @@ +CREATE TABLE xmltest ( + id int, + data xml +); +INSERT INTO xmltest VALUES (1, 'one'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest VALUES (1, 'one'); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +INSERT INTO xmltest VALUES (2, 'two'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest VALUES (2, 'two'); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +INSERT INTO xmltest VALUES (3, '', NULL, ''); +ERROR: unsupported XML feature +LINE 1: SELECT xmlconcat('', NULL, '', NULL, ''); +ERROR: unsupported XML feature +LINE 1: SELECT xmlconcat('', NULL, 'r'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlelement(name foo, xml 'br'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlelement(name foo, array[1, 2, 3]); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SET xmlbinary TO base64; +SELECT xmlelement(name foo, bytea 'bar'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SET xmlbinary TO hex; +SELECT xmlelement(name foo, bytea 'bar'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlelement(name foo, xmlattributes(true as bar)); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'br' as funnier)); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content ' '); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content 'abc'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content 'x'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content '&'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content '&idontexist;'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content '&idontexist;'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(content ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document ' '); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document 'abc'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document 'x'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document '&'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document '&idontexist;'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document '&idontexist;'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlparse(document ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name foo); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name xml); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name xmlstuff); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name foo, 'bar'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name foo, 'in?>valid'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name foo, null); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name xml, null); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name xmlstuff, null); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name foo, ' bar'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot(xml '', version no value, standalone no value); +ERROR: unsupported XML feature +LINE 1: SELECT xmlroot(xml '', version no value, standalone no... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot(xml '', version '2.0'); +ERROR: unsupported XML feature +LINE 1: SELECT xmlroot(xml '', version '2.0'); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot(xml '', version no value, standalone yes); +ERROR: unsupported XML feature +LINE 1: SELECT xmlroot(xml '', version no value, standalone ye... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot(xml '', version no value, standalone yes); +ERROR: unsupported XML feature +LINE 1: SELECT xmlroot(xml '', version no... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot(xmlroot(xml '', version '1.0'), version '1.1', standalone no); +ERROR: unsupported XML feature +LINE 1: SELECT xmlroot(xmlroot(xml '', version '1.0'), version... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot('', version no value, standalone no); +ERROR: unsupported XML feature +LINE 1: SELECT xmlroot('... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot('', version no value, standalone no value); +ERROR: unsupported XML feature +LINE 1: SELECT xmlroot('... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot('', version no value); +ERROR: unsupported XML feature +LINE 1: SELECT xmlroot('... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlroot ( + xmlelement ( + name gazonk, + xmlattributes ( + 'val' AS name, + 1 + 1 AS num + ), + xmlelement ( + NAME qux, + 'foo' + ) + ), + version '1.0', + standalone yes +); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlserialize(content data as character varying(20)) FROM xmltest; + xmlserialize +-------------- +(0 rows) + +SELECT xmlserialize(content 'good' as char(10)); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(content 'good' as char(10)); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlserialize(document 'bad' as text); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(document 'bad' as text); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml 'bar' IS DOCUMENT; +ERROR: unsupported XML feature +LINE 1: SELECT xml 'bar' IS DOCUMENT; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml 'barfoo' IS DOCUMENT; +ERROR: unsupported XML feature +LINE 1: SELECT xml 'barfoo' IS DOCUMENT; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml '' IS NOT DOCUMENT; +ERROR: unsupported XML feature +LINE 1: SELECT xml '' IS NOT DOCUMENT; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml 'abc' IS NOT DOCUMENT; +ERROR: unsupported XML feature +LINE 1: SELECT xml 'abc' IS NOT DOCUMENT; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT '<>' IS NOT DOCUMENT; +ERROR: unsupported XML feature +LINE 1: SELECT '<>' IS NOT DOCUMENT; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlagg(data order by id) FROM xmltest; + xmlagg +-------- + +(1 row) + +SELECT xmlagg(data) FROM xmltest WHERE id > 10; + xmlagg +-------- + +(1 row) + +SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name) order by name)) FROM emp; +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- Check mapping SQL identifier to XML name +SELECT xmlpi(name ":::_xml_abc135.%-&_"); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmlpi(name "123"); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +PREPARE foo (xml) AS SELECT xmlconcat('', $1); +ERROR: unsupported XML feature +LINE 1: PREPARE foo (xml) AS SELECT xmlconcat('', $1); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SET XML OPTION DOCUMENT; +EXECUTE foo (''); +ERROR: prepared statement "foo" does not exist +EXECUTE foo ('bad'); +ERROR: prepared statement "foo" does not exist +SELECT xml ''; +ERROR: unsupported XML feature +LINE 1: SELECT xml ''; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SET XML OPTION CONTENT; +EXECUTE foo (''); +ERROR: prepared statement "foo" does not exist +EXECUTE foo ('good'); +ERROR: prepared statement "foo" does not exist +SELECT xml ' '; +ERROR: unsupported XML feature +LINE 1: SELECT xml ' '; +ERROR: unsupported XML feature +LINE 1: SELECT xml ' '; +ERROR: unsupported XML feature +LINE 1: SELECT xml ''; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml ' oops '; +ERROR: unsupported XML feature +LINE 1: SELECT xml ' oops '; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml ' '; +ERROR: unsupported XML feature +LINE 1: SELECT xml ' '; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml ''; +ERROR: unsupported XML feature +LINE 1: SELECT xml ''; + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- Test backwards parsing +CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); +CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); +ERROR: unsupported XML feature +LINE 1: CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +CREATE VIEW xmlview5 AS SELECT xmlparse(content 'x'); +CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); +ERROR: unsupported XML feature +LINE 1: CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); +ERROR: unsupported XML feature +LINE 1: ...EATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as ... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +ERROR: unsupported XML feature +LINE 1: ...EATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as ... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'xmlview%' ORDER BY 1; + table_name | view_definition +------------+-------------------------------------------------------------------------------- + xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; + xmlview5 | SELECT XMLPARSE(CONTENT 'x'::text STRIP WHITESPACE) AS "xmlparse"; +(2 rows) + +-- Text XPath expressions evaluation +SELECT xpath('/value', data) FROM xmltest; + xpath +------- +(0 rows) + +SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ?column? +---------- +(0 rows) + +SELECT xpath('', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath('//text()', 'number one'); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('//text()', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('//loc:piece/@id', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('//loc:piece', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('//@value', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath('''<>''', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('''<>''', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath('count(//*)', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('count(//*)', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath('count(//*)=0', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('count(//*)=0', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath('count(//*)=3', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('count(//*)=3', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath('name(/*)', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('name(/*)', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath('/nosuchtag', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('/nosuchtag', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath('root', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('root', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- Round-trip non-ASCII data through xpath(). +DO $$ +DECLARE + xml_declaration text := ''; + degree_symbol text; + res xml[]; +BEGIN + -- Per the documentation, except when the server encoding is UTF8, xpath() + -- may not work on non-ASCII data. The untranslatable_character and + -- undefined_function traps below, currently dead code, will become relevant + -- if we remove this limitation. + IF current_setting('server_encoding') <> 'UTF8' THEN + RAISE LOG 'skip: encoding % unsupported for xpath', + current_setting('server_encoding'); + RETURN; + END IF; + + degree_symbol := convert_from('\xc2b0', 'UTF8'); + res := xpath('text()', (xml_declaration || + '' || degree_symbol || '')::xml); + IF degree_symbol <> res[1]::text THEN + RAISE 'expected % (%), got % (%)', + degree_symbol, convert_to(degree_symbol, 'UTF8'), + res[1], convert_to(res[1]::text, 'UTF8'); + END IF; +EXCEPTION + -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" + WHEN untranslatable_character + -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist + OR undefined_function + -- unsupported XML feature + OR feature_not_supported THEN + RAISE LOG 'skip: %', SQLERRM; +END +$$; +-- Test xmlexists and xpath_exists +SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); +ERROR: unsupported XML feature +LINE 1: ...sts('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); +ERROR: unsupported XML feature +LINE 1: ...sts('//town[text() = ''Cwmbran'']' PASSING BY REF ''); +ERROR: unsupported XML feature +LINE 1: ...LECT xmlexists('count(/nosuchtag)' PASSING BY REF '')... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); +ERROR: unsupported XML feature +LINE 1: ...ELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); +ERROR: unsupported XML feature +LINE 1: ...ELECT xpath_exists('//town[text() = ''Cwmbran'']',''::xml); +ERROR: unsupported XML feature +LINE 1: SELECT xpath_exists('count(/nosuchtag)', ''::xml); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +INSERT INTO xmltest VALUES (4, 'BudvarfreeCarlinglots'::xml); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest VALUES (4, 'BudvarMolsonfreeCarlinglots'::xml); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest VALUES (5, 'MolsonBudvarfreeCarlinglots'::xml); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest VALUES (6, 'MolsonfreeCarlinglots'::xml); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest VALUES (7, 'number one'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml_is_well_formed('bar'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml_is_well_formed('bar'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml_is_well_formed('&'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml_is_well_formed('&idontexist;'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml_is_well_formed(''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml_is_well_formed(''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xml_is_well_formed('&idontexist;'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SET xmloption TO CONTENT; +SELECT xml_is_well_formed('abc'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- Since xpath() deals with namespaces, it's a bit stricter about +-- what's well-formed and what's not. If we don't obey these rules +-- (i.e. ignore namespace-related errors from libxml), xpath() +-- fails in subtle ways. The following would for example produce +-- the xml value +-- +-- which is invalid because '<' may not appear un-escaped in +-- attribute values. +-- Since different libxml versions emit slightly different +-- error messages, we suppress the DETAIL in this test. +\set VERBOSITY terse +SELECT xpath('/*', ''); +ERROR: unsupported XML feature at character 20 +\set VERBOSITY default +-- Again, the XML isn't well-formed for namespace purposes +SELECT xpath('/*', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('/*', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- XPath deprecates relative namespaces, but they're not supposed to +-- throw an error, only a warning. +SELECT xpath('/*', ''); +ERROR: unsupported XML feature +LINE 1: SELECT xpath('/*', ''); + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- External entity references should not leak filesystem information. +SELECT XMLPARSE(DOCUMENT ']>&c;'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT XMLPARSE(DOCUMENT ']>&c;'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- This might or might not load the requested DTD, but it mustn't throw error. +SELECT XMLPARSE(DOCUMENT ' '); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- XMLPATH tests +CREATE TABLE xmldata(data xml); +INSERT INTO xmldata VALUES(' + + AU + Australia + 3 + + + CN + China + 3 + + + HK + HongKong + 3 + + + IN + India + 3 + + + JP + Japan + 3Sinzo Abe + + + SG + Singapore + 3791 + +'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmldata VALUES(' + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- XMLTABLE with columns +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+-------------- +(0 rows) + +CREATE VIEW xmltableview1 AS SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +SELECT * FROM xmltableview1; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+-------------- +(0 rows) + +\sv xmltableview1 +CREATE OR REPLACE VIEW public.xmltableview1 AS + SELECT "xmltable".id, + "xmltable"._id, + "xmltable".country_name, + "xmltable".country_id, + "xmltable".region_id, + "xmltable".size, + "xmltable".unit, + "xmltable".premier_name + FROM ( SELECT xmldata.data + FROM xmldata) x, + LATERAL XMLTABLE(('/ROWS/ROW'::text) PASSING (x.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) +EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; + QUERY PLAN +----------------------------------------------- + Nested Loop + -> Seq Scan on xmldata + -> Materialize + -> Table Function Scan on "xmltable" + Optimizer: Postgres query optimizer +(5 rows) + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Nested Loop + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +ERROR: XMLTABLE function has 1 columns available but 2 columns specified +-- XMLNAMESPACES tests +SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '10' + COLUMNS a int PATH 'zz:a'); +ERROR: unsupported XML feature +LINE 3: PASSING '10' + COLUMNS a int PATH 'zz:a'); +ERROR: unsupported XML feature +LINE 3: PASSING '10' + COLUMNS a int PATH 'a'); +ERROR: unsupported XML feature +LINE 3: PASSING '' + COLUMNS a text PATH 'foo/namespace::node()'); +ERROR: unsupported XML feature +LINE 2: PASSING '' + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- used in prepare statements +PREPARE pp AS +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +EXECUTE pp; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+-------------- +(0 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); + COUNTRY_NAME | REGION_ID +--------------+----------- +(0 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); + id | COUNTRY_NAME | REGION_ID +----+--------------+----------- +(0 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); + id | COUNTRY_NAME | REGION_ID +----+--------------+----------- +(0 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); + id +---- +(0 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); + id +---- +(0 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); + id | COUNTRY_NAME | REGION_ID | rawdata +----+--------------+-----------+--------- +(0 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); + id | COUNTRY_NAME | REGION_ID | rawdata +----+--------------+-----------+--------- +(0 rows) + +SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text); +ERROR: unsupported XML feature +LINE 1: SELECT * FROM xmltable('/root' passing 'a1aa1aa2a bbbbxxxcccc' COLUMNS element text PATH 'element/text()'); -- should fail +ERROR: unsupported XML feature +LINE 1: SELECT * FROM xmltable('/root' passing 'a1a &"<>!foo]]>2' columns c text); +ERROR: unsupported XML feature +LINE 1: select * from xmltable('d/r' passing ''"&<>' COLUMNS ent text); +ERROR: unsupported XML feature +LINE 1: SELECT * FROM xmltable('/x/a' PASSING '''"&<>' COLUMNS ent xml); +ERROR: unsupported XML feature +LINE 1: SELECT * FROM xmltable('/x/a' PASSING '' Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +-- test qual +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; + COUNTRY_NAME | REGION_ID +--------------+----------- +(0 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Table Function Scan on "xmltable" + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + Table Function Call: XMLTABLE(('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]'::text) PASSING (xmldata.data) COLUMNS "COUNTRY_NAME" text, "REGION_ID" integer) + Filter: ("xmltable"."COUNTRY_NAME" = 'Japan'::text) + Optimizer: Postgres query optimizer +(11 rows) + +-- should to work with more data +INSERT INTO xmldata VALUES(' + + CZ + Czech Republic + 2Milos Zeman + + + DE + Germany + 2 + + + FR + France + 2 + +'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmldata VALUES(' + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +INSERT INTO xmldata VALUES(' + + EG + Egypt + 1 + + + SD + Sudan + 1 + +'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmldata VALUES(' + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+-------------- +(0 rows) + +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+-------------- +(0 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Filter: ("xmltable".region_id = 2) + Optimizer: Postgres query optimizer +(11 rows) + +-- should fail, NULL value +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE' NOT NULL, + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+-------------- +(0 rows) + +-- if all is ok, then result is empty +-- one line xml test +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc WHERE proname = 'f_leak'), + y AS (SELECT xmlelement(name proc, + xmlforest(proname, proowner, + procost, pronargs, + proargnames, proargtypes)) as proc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/proc' PASSING proc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- multi line xml test, result should be empty too +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc), + y AS (SELECT xmlelement(name data, + xmlagg(xmlelement(name proc, + xmlforest(proname, proowner, procost, + pronargs, proargnames, proargtypes)))) as doc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/data/proc' PASSING doc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +CREATE TABLE xmltest2(x xml, _path text); +INSERT INTO xmltest2 VALUES('1', 'A'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest2 VALUES('1', 'A')... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +INSERT INTO xmltest2 VALUES('2', 'B'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest2 VALUES('2', 'B')... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +INSERT INTO xmltest2 VALUES('3', 'C'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest2 VALUES('3', 'C')... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +INSERT INTO xmltest2 VALUES('2', 'D'); +ERROR: unsupported XML feature +LINE 1: INSERT INTO xmltest2 VALUES('2', 'D')... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); + a +--- +(0 rows) + +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); + a +--- +(0 rows) + +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); + a +--- +(0 rows) + +-- XPath result can be boolean or number too +SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); +ERROR: unsupported XML feature +LINE 1: SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml ... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +\x +SELECT * FROM XMLTABLE('*' PASSING 'pre&deeppost' COLUMNS x xml PATH 'node()', y xml PATH '/'); +ERROR: unsupported XML feature +LINE 1: SELECT * FROM XMLTABLE('*' PASSING 'pre"', b xml PATH '""'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. diff --git a/src/test/singlenode_regress/expected/xml_2.out b/src/test/singlenode_regress/expected/xml_2.out new file mode 100644 index 00000000000..edfe1b2e577 --- /dev/null +++ b/src/test/singlenode_regress/expected/xml_2.out @@ -0,0 +1,1564 @@ +CREATE TABLE xmltest ( + id int, + data xml +); +INSERT INTO xmltest VALUES (1, 'one'); +INSERT INTO xmltest VALUES (2, 'two'); +INSERT INTO xmltest VALUES (3, 'one + 2 | two +(2 rows) + +SELECT xmlcomment('test'); + xmlcomment +------------- + +(1 row) + +SELECT xmlcomment('-test'); + xmlcomment +-------------- + +(1 row) + +SELECT xmlcomment('test-'); +ERROR: invalid XML comment +SELECT xmlcomment('--test'); +ERROR: invalid XML comment +SELECT xmlcomment('te st'); + xmlcomment +-------------- + +(1 row) + +SELECT xmlconcat(xmlcomment('hello'), + xmlelement(NAME qux, 'foo'), + xmlcomment('world')); + xmlconcat +---------------------------------------- + foo +(1 row) + +SELECT xmlconcat('hello', 'you'); + xmlconcat +----------- + helloyou +(1 row) + +SELECT xmlconcat(1, 2); +ERROR: argument of XMLCONCAT must be type xml, not type integer +LINE 1: SELECT xmlconcat(1, 2); + ^ +SELECT xmlconcat('bad', '', NULL, ''); + xmlconcat +-------------- + +(1 row) + +SELECT xmlconcat('', NULL, ''); + xmlconcat +----------------------------------- + +(1 row) + +SELECT xmlconcat(NULL); + xmlconcat +----------- + +(1 row) + +SELECT xmlconcat(NULL, NULL); + xmlconcat +----------- + +(1 row) + +SELECT xmlelement(name element, + xmlattributes (1 as one, 'deuce' as two), + 'content'); + xmlelement +------------------------------------------------ + content +(1 row) + +SELECT xmlelement(name element, + xmlattributes ('unnamed and wrong')); +ERROR: unnamed XML attribute value must be a column reference +LINE 2: xmlattributes ('unnamed and wrong')); + ^ +SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); + xmlelement +------------------------------------------- + stuff +(1 row) + +SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + xmlelement +---------------------------------------------------------------------- + sharon251000 + sam302000 + bill201000 + jeff23600 + cim30400 + linda19100 +(6 rows) + +SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); +ERROR: XML attribute name "a" appears more than once +LINE 1: ...ment(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); + ^ +SELECT xmlelement(name num, 37); + xmlelement +--------------- + 37 +(1 row) + +SELECT xmlelement(name foo, text 'bar'); + xmlelement +---------------- + bar +(1 row) + +SELECT xmlelement(name foo, xml 'bar'); + xmlelement +---------------- + bar +(1 row) + +SELECT xmlelement(name foo, text 'br'); + xmlelement +------------------------- + b<a/>r +(1 row) + +SELECT xmlelement(name foo, xml 'br'); + xmlelement +------------------- + br +(1 row) + +SELECT xmlelement(name foo, array[1, 2, 3]); + xmlelement +------------------------------------------------------------------------- + 123 +(1 row) + +SET xmlbinary TO base64; +SELECT xmlelement(name foo, bytea 'bar'); + xmlelement +----------------- + YmFy +(1 row) + +SET xmlbinary TO hex; +SELECT xmlelement(name foo, bytea 'bar'); + xmlelement +------------------- + 626172 +(1 row) + +SELECT xmlelement(name foo, xmlattributes(true as bar)); + xmlelement +------------------- + +(1 row) + +SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); + xmlelement +---------------------------------- + +(1 row) + +SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); +ERROR: timestamp out of range +DETAIL: XML does not support infinite timestamp values. +SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'br' as funnier)); + xmlelement +------------------------------------------------------------ + +(1 row) + +SELECT xmlparse(content ''); + xmlparse +---------- + +(1 row) + +SELECT xmlparse(content ' '); + xmlparse +---------- + +(1 row) + +SELECT xmlparse(content 'abc'); + xmlparse +---------- + abc +(1 row) + +SELECT xmlparse(content 'x'); + xmlparse +-------------- + x +(1 row) + +SELECT xmlparse(content '&'); +ERROR: invalid XML content +DETAIL: line 1: xmlParseEntityRef: no name +& + ^ +line 1: chunk is not well balanced +SELECT xmlparse(content '&idontexist;'); +ERROR: invalid XML content +DETAIL: line 1: Entity 'idontexist' not defined +&idontexist; + ^ +line 1: chunk is not well balanced +SELECT xmlparse(content ''); + xmlparse +--------------------------- + +(1 row) + +SELECT xmlparse(content ''); + xmlparse +-------------------------------- + +(1 row) + +SELECT xmlparse(content '&idontexist;'); +ERROR: invalid XML content +DETAIL: line 1: Entity 'idontexist' not defined +&idontexist; + ^ +line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced +line 1: chunk is not well balanced +SELECT xmlparse(content ''); + xmlparse +--------------------- + +(1 row) + +SELECT xmlparse(document ' '); +ERROR: invalid XML document +DETAIL: line 1: Start tag expected, '<' not found +SELECT xmlparse(document 'abc'); +ERROR: invalid XML document +DETAIL: line 1: Start tag expected, '<' not found +abc +^ +SELECT xmlparse(document 'x'); + xmlparse +-------------- + x +(1 row) + +SELECT xmlparse(document '&'); +ERROR: invalid XML document +DETAIL: line 1: xmlParseEntityRef: no name +& + ^ +line 1: Opening and ending tag mismatch: invalidentity line 1 and abc +SELECT xmlparse(document '&idontexist;'); +ERROR: invalid XML document +DETAIL: line 1: Entity 'idontexist' not defined +&idontexist; + ^ +line 1: Opening and ending tag mismatch: undefinedentity line 1 and abc +SELECT xmlparse(document ''); + xmlparse +--------------------------- + +(1 row) + +SELECT xmlparse(document ''); + xmlparse +-------------------------------- + +(1 row) + +SELECT xmlparse(document '&idontexist;'); +ERROR: invalid XML document +DETAIL: line 1: Entity 'idontexist' not defined +&idontexist; + ^ +line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced +SELECT xmlparse(document ''); + xmlparse +--------------------- + +(1 row) + +SELECT xmlpi(name foo); + xmlpi +--------- + +(1 row) + +SELECT xmlpi(name xml); +ERROR: invalid XML processing instruction +DETAIL: XML processing instruction target name cannot be "xml". +SELECT xmlpi(name xmlstuff); + xmlpi +-------------- + +(1 row) + +SELECT xmlpi(name foo, 'bar'); + xmlpi +------------- + +(1 row) + +SELECT xmlpi(name foo, 'in?>valid'); +ERROR: invalid XML processing instruction +DETAIL: XML processing instruction cannot contain "?>". +SELECT xmlpi(name foo, null); + xmlpi +------- + +(1 row) + +SELECT xmlpi(name xml, null); +ERROR: invalid XML processing instruction +DETAIL: XML processing instruction target name cannot be "xml". +SELECT xmlpi(name xmlstuff, null); + xmlpi +------- + +(1 row) + +SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); + xmlpi +------------------------------------------------------- + +(1 row) + +SELECT xmlpi(name foo, ' bar'); + xmlpi +------------- + +(1 row) + +SELECT xmlroot(xml '', version no value, standalone no value); + xmlroot +--------- + +(1 row) + +SELECT xmlroot(xml '', version '2.0'); + xmlroot +----------------------------- + +(1 row) + +SELECT xmlroot(xml '', version no value, standalone yes); + xmlroot +---------------------------------------------- + +(1 row) + +SELECT xmlroot(xml '', version no value, standalone yes); + xmlroot +---------------------------------------------- + +(1 row) + +SELECT xmlroot(xmlroot(xml '', version '1.0'), version '1.1', standalone no); + xmlroot +--------------------------------------------- + +(1 row) + +SELECT xmlroot('', version no value, standalone no); + xmlroot +--------------------------------------------- + +(1 row) + +SELECT xmlroot('', version no value, standalone no value); + xmlroot +--------- + +(1 row) + +SELECT xmlroot('', version no value); + xmlroot +---------------------------------------------- + +(1 row) + +SELECT xmlroot ( + xmlelement ( + name gazonk, + xmlattributes ( + 'val' AS name, + 1 + 1 AS num + ), + xmlelement ( + NAME qux, + 'foo' + ) + ), + version '1.0', + standalone yes +); + xmlroot +------------------------------------------------------------------------------------------ + foo +(1 row) + +SELECT xmlserialize(content data as character varying(20)) FROM xmltest; + xmlserialize +-------------------- + one + two +(2 rows) + +SELECT xmlserialize(content 'good' as char(10)); + xmlserialize +-------------- + good +(1 row) + +SELECT xmlserialize(document 'bad' as text); +ERROR: not an XML document +SELECT xml 'bar' IS DOCUMENT; + ?column? +---------- + t +(1 row) + +SELECT xml 'barfoo' IS DOCUMENT; + ?column? +---------- + f +(1 row) + +SELECT xml '' IS NOT DOCUMENT; + ?column? +---------- + f +(1 row) + +SELECT xml 'abc' IS NOT DOCUMENT; + ?column? +---------- + t +(1 row) + +SELECT '<>' IS NOT DOCUMENT; +ERROR: invalid XML content +LINE 1: SELECT '<>' IS NOT DOCUMENT; + ^ +DETAIL: line 1: StartTag: invalid element name +<> + ^ +SELECT xmlagg(data order by id) FROM xmltest; + xmlagg +-------------------------------------- + onetwo +(1 row) + +SELECT xmlagg(data) FROM xmltest WHERE id > 10; + xmlagg +-------- + +(1 row) + +SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name) order by name)) FROM emp; + xmlelement +-------------------------------------------------------------------------------------------------------------------------------- + billcimjefflindasamsharon +(1 row) + +-- Check mapping SQL identifier to XML name +SELECT xmlpi(name ":::_xml_abc135.%-&_"); + xmlpi +------------------------------------------------- + +(1 row) + +SELECT xmlpi(name "123"); + xmlpi +--------------- + +(1 row) + +PREPARE foo (xml) AS SELECT xmlconcat('', $1); +SET XML OPTION DOCUMENT; +EXECUTE foo (''); + xmlconcat +-------------- + +(1 row) + +EXECUTE foo ('bad'); +ERROR: invalid XML document +LINE 1: EXECUTE foo ('bad'); + ^ +DETAIL: line 1: Start tag expected, '<' not found +bad +^ +SELECT xml ''; +ERROR: invalid XML document +LINE 1: SELECT xml ''; + ^ +DETAIL: line 1: Extra content at the end of the document + + ^ +SET XML OPTION CONTENT; +EXECUTE foo (''); + xmlconcat +-------------- + +(1 row) + +EXECUTE foo ('good'); + xmlconcat +------------ + good +(1 row) + +SELECT xml ' '; + xml +-------------------------------------------------------------------- + +(1 row) + +SELECT xml ' '; + xml +------------------------------ + +(1 row) + +SELECT xml ''; + xml +------------------ + +(1 row) + +SELECT xml ' oops '; +ERROR: invalid XML content +LINE 1: SELECT xml ' oops '; + ^ +DETAIL: line 1: StartTag: invalid element name + oops + ^ +SELECT xml ' '; +ERROR: invalid XML content +LINE 1: SELECT xml ' '; + ^ +DETAIL: line 1: StartTag: invalid element name + + ^ +SELECT xml ''; +ERROR: invalid XML content +LINE 1: SELECT xml ''; + ^ +DETAIL: line 1: Extra content at the end of the document + + ^ +-- Test backwards parsing +CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); +CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); +CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); +CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +CREATE VIEW xmlview5 AS SELECT xmlparse(content 'x'); +CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); +CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); +CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); +CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'xmlview%' ORDER BY 1; + table_name | view_definition +------------+------------------------------------------------------------------------------------------------------------------- + xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; + xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat"; + xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement"; + xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(emp.name AS name, emp.age AS age, emp.salary AS pay)) AS "xmlelement"+ + | FROM emp; + xmlview5 | SELECT XMLPARSE(CONTENT 'x'::text STRIP WHITESPACE) AS "xmlparse"; + xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi"; + xmlview7 | SELECT XMLROOT(''::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot"; + xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10)))::character(10) AS "xmlserialize"; + xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text) AS "xmlserialize"; +(9 rows) + +-- Text XPath expressions evaluation +SELECT xpath('/value', data) FROM xmltest; + xpath +---------------------- + {one} + {two} +(2 rows) + +SELECT xpath(NULL, NULL) IS NULL FROM xmltest; + ?column? +---------- + t + t +(2 rows) + +SELECT xpath('', ''); +ERROR: empty XPath expression +CONTEXT: SQL function "xpath" statement 1 +SELECT xpath('//text()', 'number one'); + xpath +---------------- + {"number one"} +(1 row) + +SELECT xpath('//loc:piece/@id', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); + xpath +------- + {1,2} +(1 row) + +SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); + xpath +------------------------------------------------------------------------------------------------------------------------------------------------ + {"number one",""} +(1 row) + +SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); + xpath +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {"number one",""} +(1 row) + +SELECT xpath('//b', 'one two three etc'); + xpath +------------------------- + {two,etc} +(1 row) + +SELECT xpath('//text()', '<'); + xpath +-------- + {<} +(1 row) + +SELECT xpath('//@value', ''); + xpath +-------- + {<} +(1 row) + +SELECT xpath('''<>''', ''); + xpath +--------------------------- + {<<invalid>>} +(1 row) + +SELECT xpath('count(//*)', ''); + xpath +------- + {3} +(1 row) + +SELECT xpath('count(//*)=0', ''); + xpath +--------- + {false} +(1 row) + +SELECT xpath('count(//*)=3', ''); + xpath +-------- + {true} +(1 row) + +SELECT xpath('name(/*)', ''); + xpath +-------- + {root} +(1 row) + +SELECT xpath('/nosuchtag', ''); + xpath +------- + {} +(1 row) + +SELECT xpath('root', ''); + xpath +----------- + {} +(1 row) + +-- Round-trip non-ASCII data through xpath(). +DO $$ +DECLARE + xml_declaration text := ''; + degree_symbol text; + res xml[]; +BEGIN + -- Per the documentation, except when the server encoding is UTF8, xpath() + -- may not work on non-ASCII data. The untranslatable_character and + -- undefined_function traps below, currently dead code, will become relevant + -- if we remove this limitation. + IF current_setting('server_encoding') <> 'UTF8' THEN + RAISE LOG 'skip: encoding % unsupported for xpath', + current_setting('server_encoding'); + RETURN; + END IF; + + degree_symbol := convert_from('\xc2b0', 'UTF8'); + res := xpath('text()', (xml_declaration || + '' || degree_symbol || '')::xml); + IF degree_symbol <> res[1]::text THEN + RAISE 'expected % (%), got % (%)', + degree_symbol, convert_to(degree_symbol, 'UTF8'), + res[1], convert_to(res[1]::text, 'UTF8'); + END IF; +EXCEPTION + -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" + WHEN untranslatable_character + -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist + OR undefined_function + -- unsupported XML feature + OR feature_not_supported THEN + RAISE LOG 'skip: %', SQLERRM; +END +$$; +-- Test xmlexists and xpath_exists +SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); + xmlexists +----------- + f +(1 row) + +SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); + xmlexists +----------- + t +(1 row) + +SELECT xmlexists('count(/nosuchtag)' PASSING BY REF ''); + xmlexists +----------- + t +(1 row) + +SELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); + xpath_exists +-------------- + f +(1 row) + +SELECT xpath_exists('//town[text() = ''Cwmbran'']','Bidford-on-AvonCwmbranBristol'::xml); + xpath_exists +-------------- + t +(1 row) + +SELECT xpath_exists('count(/nosuchtag)', ''::xml); + xpath_exists +-------------- + t +(1 row) + +INSERT INTO xmltest VALUES (4, 'BudvarfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (5, 'MolsonfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (6, 'BudvarfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (7, 'MolsonfreeCarlinglots'::xml); +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data); + count +------- + 0 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING BY REF data BY REF); + count +------- + 0 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data); + count +------- + 2 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data); + count +------- + 1 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); + count +------- + 0 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); + count +------- + 2 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); + count +------- + 1 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]); + count +------- + 0 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]); + count +------- + 2 +(1 row) + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]); + count +------- + 1 +(1 row) + +CREATE TABLE query ( expr TEXT ); +INSERT INTO query VALUES ('/menu/beers/cost[text() = ''lots'']'); +SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data); + count +------- + 2 +(1 row) + +-- Test xml_is_well_formed and variants +SELECT xml_is_well_formed_document('bar'); + xml_is_well_formed_document +----------------------------- + t +(1 row) + +SELECT xml_is_well_formed_document('abc'); + xml_is_well_formed_document +----------------------------- + f +(1 row) + +SELECT xml_is_well_formed_content('bar'); + xml_is_well_formed_content +---------------------------- + t +(1 row) + +SELECT xml_is_well_formed_content('abc'); + xml_is_well_formed_content +---------------------------- + t +(1 row) + +SET xmloption TO DOCUMENT; +SELECT xml_is_well_formed('abc'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed('<>'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed(''); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('bar'); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('barbaz'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed('number one'); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('bar'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed('bar'); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('&'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed('&idontexist;'); + xml_is_well_formed +-------------------- + f +(1 row) + +SELECT xml_is_well_formed(''); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed(''); + xml_is_well_formed +-------------------- + t +(1 row) + +SELECT xml_is_well_formed('&idontexist;'); + xml_is_well_formed +-------------------- + f +(1 row) + +SET xmloption TO CONTENT; +SELECT xml_is_well_formed('abc'); + xml_is_well_formed +-------------------- + t +(1 row) + +-- Since xpath() deals with namespaces, it's a bit stricter about +-- what's well-formed and what's not. If we don't obey these rules +-- (i.e. ignore namespace-related errors from libxml), xpath() +-- fails in subtle ways. The following would for example produce +-- the xml value +-- +-- which is invalid because '<' may not appear un-escaped in +-- attribute values. +-- Since different libxml versions emit slightly different +-- error messages, we suppress the DETAIL in this test. +\set VERBOSITY terse +SELECT xpath('/*', ''); +ERROR: could not parse XML document +\set VERBOSITY default +-- Again, the XML isn't well-formed for namespace purposes +SELECT xpath('/*', ''); +ERROR: could not parse XML document +DETAIL: line 1: Namespace prefix nosuchprefix on tag is not defined + + ^ +CONTEXT: SQL function "xpath" statement 1 +-- XPath deprecates relative namespaces, but they're not supposed to +-- throw an error, only a warning. +SELECT xpath('/*', ''); +WARNING: line 1: xmlns: URI relative is not absolute + + ^ + xpath +-------------------------------------- + {""} +(1 row) + +-- External entity references should not leak filesystem information. +SELECT XMLPARSE(DOCUMENT ']>&c;'); + xmlparse +----------------------------------------------------------------- + ]>&c; +(1 row) + +SELECT XMLPARSE(DOCUMENT ']>&c;'); + xmlparse +----------------------------------------------------------------------- + ]>&c; +(1 row) + +-- This might or might not load the requested DTD, but it mustn't throw error. +SELECT XMLPARSE(DOCUMENT ' '); + xmlparse +------------------------------------------------------------------------------------------------------------------------------------------------------ +   +(1 row) + +-- XMLPATH tests +CREATE TABLE xmldata(data xml); +INSERT INTO xmldata VALUES(' + + AU + Australia + 3 + + + CN + China + 3 + + + HK + HongKong + 3 + + + IN + India + 3 + + + JP + Japan + 3Sinzo Abe + + + SG + Singapore + 3791 + +'); +-- XMLTABLE with columns +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+--------------- + 1 | 1 | Australia | AU | 3 | | | not specified + 2 | 2 | China | CN | 3 | | | not specified + 3 | 3 | HongKong | HK | 3 | | | not specified + 4 | 4 | India | IN | 3 | | | not specified + 5 | 5 | Japan | JP | 3 | | | Sinzo Abe + 6 | 6 | Singapore | SG | 3 | 791 | km | not specified +(6 rows) + +CREATE VIEW xmltableview1 AS SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +SELECT * FROM xmltableview1; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+--------------- + 1 | 1 | Australia | AU | 3 | | | not specified + 2 | 2 | China | CN | 3 | | | not specified + 3 | 3 | HongKong | HK | 3 | | | not specified + 4 | 4 | India | IN | 3 | | | not specified + 5 | 5 | Japan | JP | 3 | | | Sinzo Abe + 6 | 6 | Singapore | SG | 3 | 791 | km | not specified +(6 rows) + +\sv xmltableview1 +CREATE OR REPLACE VIEW public.xmltableview1 AS + SELECT "xmltable".id, + "xmltable"._id, + "xmltable".country_name, + "xmltable".country_id, + "xmltable".region_id, + "xmltable".size, + "xmltable".unit, + "xmltable".premier_name + FROM ( SELECT xmldata.data + FROM xmldata) x, + LATERAL XMLTABLE(('/ROWS/ROW'::text) PASSING (x.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) +EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; + QUERY PLAN +----------------------------------------------- + Nested Loop + -> Seq Scan on xmldata + -> Materialize + -> Table Function Scan on "xmltable" + Optimizer: Postgres query optimizer +(5 rows) + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Nested Loop + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +ERROR: XMLTABLE function has 1 columns available but 2 columns specified +-- XMLNAMESPACES tests +SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '10' + COLUMNS a int PATH 'zz:a'); + a +---- + 10 +(1 row) + +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '10' + COLUMNS a int PATH 'zz:a'); +SELECT * FROM xmltableview2; + a +---- + 10 +(1 row) + +SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), + '/rows/row' + PASSING '10' + COLUMNS a int PATH 'a'); +ERROR: DEFAULT namespace is not supported +SELECT * FROM XMLTABLE('.' + PASSING '' + COLUMNS a text PATH 'foo/namespace::node()'); + a +-------------------------------------- + http://www.w3.org/XML/1998/namespace +(1 row) + +-- used in prepare statements +PREPARE pp AS +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +EXECUTE pp; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+--------------+------------+-----------+------+------+--------------- + 1 | 1 | Australia | AU | 3 | | | not specified + 2 | 2 | China | CN | 3 | | | not specified + 3 | 3 | HongKong | HK | 3 | | | not specified + 4 | 4 | India | IN | 3 | | | not specified + 5 | 5 | Japan | JP | 3 | | | Sinzo Abe + 6 | 6 | Singapore | SG | 3 | 791 | km | not specified +(6 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); + COUNTRY_NAME | REGION_ID +--------------+----------- + India | 3 + Japan | 3 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); + id | COUNTRY_NAME | REGION_ID +----+--------------+----------- + 1 | India | 3 + 2 | Japan | 3 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); + id | COUNTRY_NAME | REGION_ID +----+--------------+----------- + 4 | India | 3 + 5 | Japan | 3 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); + id +---- + 4 + 5 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); + id +---- + 1 + 2 +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); + id | COUNTRY_NAME | REGION_ID | rawdata +----+--------------+-----------+------------------------------------------------------------------ + 4 | India | 3 | + + | | | IN + + | | | India + + | | | 3 + + | | | + 5 | Japan | 3 | + + | | | JP + + | | | Japan + + | | | 3Sinzo Abe+ + | | | +(2 rows) + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); + id | COUNTRY_NAME | REGION_ID | rawdata +----+--------------+-----------+----------------------------------------------------------------------------------------------------------------------------- + 4 | India | 3 | INIndia3 + 5 | Japan | 3 | JPJapan3Sinzo Abe +(2 rows) + +SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text); + element +---------------------- + a1aa2a bbbbxxxcccc +(1 row) + +SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text PATH 'element/text()'); -- should fail +ERROR: more than one value returned by column XPath expression +-- CDATA test +select * from xmltable('d/r' passing ' &"<>!foo]]>2' columns c text); + c +------------------------- + &"<>!foo + 2 +(2 rows) + +-- XML builtin entities +SELECT * FROM xmltable('/x/a' PASSING ''"&<>' COLUMNS ent text); + ent +----- + ' + " + & + < + > +(5 rows) + +SELECT * FROM xmltable('/x/a' PASSING ''"&<>' COLUMNS ent xml); + ent +------------------ + ' + " + & + < + > +(5 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Optimizer: Postgres query optimizer +(10 rows) + +-- test qual +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; + COUNTRY_NAME | REGION_ID +--------------+----------- + Japan | 3 +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Table Function Scan on "xmltable" + Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + Table Function Call: XMLTABLE(('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]'::text) PASSING (xmldata.data) COLUMNS "COUNTRY_NAME" text, "REGION_ID" integer) + Filter: ("xmltable"."COUNTRY_NAME" = 'Japan'::text) + Optimizer: Postgres query optimizer +(11 rows) + +-- should to work with more data +INSERT INTO xmldata VALUES(' + + CZ + Czech Republic + 2Milos Zeman + + + DE + Germany + 2 + + + FR + France + 2 + +'); +INSERT INTO xmldata VALUES(' + + EG + Egypt + 1 + + + SD + Sudan + 1 + +'); +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+----------------+------------+-----------+------+------+--------------- + 1 | 1 | Australia | AU | 3 | | | not specified + 2 | 2 | China | CN | 3 | | | not specified + 3 | 3 | HongKong | HK | 3 | | | not specified + 4 | 4 | India | IN | 3 | | | not specified + 5 | 5 | Japan | JP | 3 | | | Sinzo Abe + 6 | 6 | Singapore | SG | 3 | 791 | km | not specified + 10 | 1 | Czech Republic | CZ | 2 | | | Milos Zeman + 11 | 2 | Germany | DE | 2 | | | not specified + 12 | 3 | France | FR | 2 | | | not specified + 20 | 1 | Egypt | EG | 1 | | | not specified + 21 | 2 | Sudan | SD | 1 | | | not specified +(11 rows) + +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; + id | _id | country_name | country_id | region_id | size | unit | premier_name +----+-----+----------------+------------+-----------+------+------+--------------- + 10 | 1 | Czech Republic | CZ | 2 | | | Milos Zeman + 11 | 2 | Germany | DE | 2 | | | not specified + 12 | 3 | France | FR | 2 | | | not specified +(3 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Seq Scan on public.xmldata + Output: xmldata.data + -> Materialize + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + -> Table Function Scan on "xmltable" + Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name + Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) + Filter: ("xmltable".region_id = 2) + Optimizer: Postgres query optimizer +(11 rows) + +-- should fail, NULL value +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE' NOT NULL, + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); +ERROR: null is not allowed in column "size" +-- if all is ok, then result is empty +-- one line xml test +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc WHERE proname = 'f_leak'), + y AS (SELECT xmlelement(name proc, + xmlforest(proname, proowner, + procost, pronargs, + proargnames, proargtypes)) as proc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/proc' PASSING proc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; + proname | proowner | procost | pronargs | proargnames | proargtypes +---------+----------+---------+----------+-------------+------------- +(0 rows) + +-- multi line xml test, result should be empty too +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc), + y AS (SELECT xmlelement(name data, + xmlagg(xmlelement(name proc, + xmlforest(proname, proowner, procost, + pronargs, proargnames, proargtypes)))) as doc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/data/proc' PASSING doc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; + proname | proowner | procost | pronargs | proargnames | proargtypes +---------+----------+---------+----------+-------------+------------- +(0 rows) + +CREATE TABLE xmltest2(x xml, _path text); +INSERT INTO xmltest2 VALUES('1', 'A'); +INSERT INTO xmltest2 VALUES('2', 'B'); +INSERT INTO xmltest2 VALUES('3', 'C'); +INSERT INTO xmltest2 VALUES('2', 'D'); +SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); + a +--- + 1 + 2 + 3 + 2 +(4 rows) + +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); + a +--- + 1 + 2 + 3 + 2 +(4 rows) + +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); + a +---- + 11 + 12 + 13 + 14 +(4 rows) + +-- XPath result can be boolean or number too +SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); + a | b | c | d | e +----------+---+----+---+--- + a | a | hi | t | 1 +(1 row) + +\x +SELECT * FROM XMLTABLE('*' PASSING 'pre&deeppost' COLUMNS x xml PATH 'node()', y xml PATH '/'); +-[ RECORD 1 ]----------------------------------------------------------- +x | pre&deeppost +y | pre&deeppost+ + | + +\x +SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '""', b xml PATH '""'); + a | b +--------+-------------- + | <foo/> +(1 row) + diff --git a/src/test/singlenode_regress/expected/xmlmap.out b/src/test/singlenode_regress/expected/xmlmap.out new file mode 100644 index 00000000000..2c086f9feb7 --- /dev/null +++ b/src/test/singlenode_regress/expected/xmlmap.out @@ -0,0 +1,1284 @@ +CREATE SCHEMA testxmlschema; +CREATE TABLE testxmlschema.test1 (a int, b text); +INSERT INTO testxmlschema.test1 VALUES (1, 'one'), (2, 'two'), (-1, null); +CREATE DOMAIN testxmldomain AS varchar; +CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), + w numeric(9,2), v smallint, u bigint, t real, + s time, stz timetz, r timestamp, rtz timestamptz, q date, + p xml, o testxmldomain, n bool, m bytea, aaa text); +ALTER TABLE testxmlschema.test2 DROP COLUMN aaa; +INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', + 98.6, 2, 999, 0, + '21:07', '21:11 +05', '2009-06-08 21:07:30', '2009-06-08 21:07:30 -07', '2009-06-08', + NULL, 'ABC', true, 'XYZ'); +SELECT table_to_xml('testxmlschema.test1', false, false, ''); + table_to_xml +--------------------------------------------------------------- + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + +(1 row) + +SELECT table_to_xml('testxmlschema.test1', true, false, 'foo'); + table_to_xml +--------------------------------------------------------------------------- + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + + + +(1 row) + +SELECT table_to_xml('testxmlschema.test1', false, true, ''); + table_to_xml +--------------------------------------------------------------- + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + +(1 row) + +SELECT table_to_xml('testxmlschema.test1', true, true, ''); + table_to_xml +--------------------------------------------------------------- + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + +(1 row) + +SELECT table_to_xml('testxmlschema.test2', false, false, ''); + table_to_xml +--------------------------------------------------------------- + + + + + + + 55 + + abc + + def + + 98.60 + + 2 + + 999 + + 0 + + 21:07:00 + + 21:11:00+05 + + 2009-06-08T21:07:30 + + 2009-06-08T21:07:30-07:00 + + 2009-06-08 + + ABC + + true + + WFla + + + + + + + + +(1 row) + +SELECT table_to_xmlschema('testxmlschema.test1', false, false, ''); + table_to_xmlschema +----------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT table_to_xmlschema('testxmlschema.test1', true, false, ''); + table_to_xmlschema +----------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT table_to_xmlschema('testxmlschema.test1', false, true, 'foo'); + table_to_xmlschema +---------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT table_to_xmlschema('testxmlschema.test1', true, true, ''); + table_to_xmlschema +------------------------------------------------------------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT table_to_xmlschema('testxmlschema.test2', false, false, ''); + table_to_xmlschema +---------------------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', false, false, ''); + table_to_xml_and_xmlschema +----------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + +(1 row) + +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', true, false, ''); + table_to_xml_and_xmlschema +----------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + + + +(1 row) + +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', false, true, ''); + table_to_xml_and_xmlschema +---------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + +(1 row) + +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', true, true, 'foo'); + table_to_xml_and_xmlschema +------------------------------------------------------------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + +(1 row) + +SELECT query_to_xml('SELECT * FROM testxmlschema.test1', false, false, ''); + query_to_xml +--------------------------------------------------------------- + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + +
+ + +(1 row) + +SELECT query_to_xmlschema('SELECT * FROM testxmlschema.test1', false, false, ''); + query_to_xmlschema +---------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT query_to_xml_and_xmlschema('SELECT * FROM testxmlschema.test1', true, true, ''); + query_to_xml_and_xmlschema +------------------------------------------------------------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + +(1 row) + +DECLARE xc CURSOR WITH HOLD FOR SELECT * FROM testxmlschema.test1 ORDER BY 1, 2; +SELECT cursor_to_xml('xc'::refcursor, 5, false, true, ''); + cursor_to_xml +------------------------------------------------------------- + + + -1 + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + +(1 row) + +SELECT cursor_to_xmlschema('xc'::refcursor, false, true, ''); + cursor_to_xmlschema +---------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +MOVE BACKWARD ALL IN xc; +ERROR: backward scan is not supported in this version of Cloudberry Database +SELECT cursor_to_xml('xc'::refcursor, 5, true, false, ''); +ERROR: portal "xc" cannot be run +SELECT cursor_to_xmlschema('xc'::refcursor, true, false, ''); + cursor_to_xmlschema +------------------------------------------------------------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT schema_to_xml('testxmlschema', false, true, ''); + schema_to_xml +----------------------------------------------------------------------- + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + + + 55 + + abc + + def + + 98.60 + + 2 + + 999 + + 0 + + 21:07:00 + + 21:11:00+05 + + 2009-06-08T21:07:30 + + 2009-06-08T21:07:30-07:00 + + 2009-06-08 + + ABC + + true + + WFla + + + + + + + + + + +(1 row) + +SELECT schema_to_xml('testxmlschema', true, false, ''); + schema_to_xml +----------------------------------------------------------------------- + + + + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + + + + + + + + + + + 55 + + abc + + def + + 98.60 + + 2 + + 999 + + 0 + + 21:07:00 + + 21:11:00+05 + + 2009-06-08T21:07:30 + + 2009-06-08T21:07:30-07:00 + + 2009-06-08 + +

+ + ABC + + true + + WFla + + + + + + + + + + + + +(1 row) + +SELECT schema_to_xmlschema('testxmlschema', false, true, ''); + schema_to_xmlschema +---------------------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT schema_to_xmlschema('testxmlschema', true, false, ''); + schema_to_xmlschema +---------------------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(1 row) + +SELECT schema_to_xml_and_xmlschema('testxmlschema', true, true, 'foo'); + schema_to_xml_and_xmlschema +---------------------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + + + + + 55 + + abc + + def + + 98.60 + + 2 + + 999 + + 0 + + 21:07:00 + + 21:11:00+05 + + 2009-06-08T21:07:30 + + 2009-06-08T21:07:30-07:00 + + 2009-06-08 + +

+ + ABC + + true + + WFla + + + + + + + + + + +(1 row) + +-- test that domains are transformed like their base types +CREATE DOMAIN testboolxmldomain AS bool; +CREATE DOMAIN testdatexmldomain AS date; +CREATE TABLE testxmlschema.test3 + AS SELECT true c1, + true::testboolxmldomain c2, + '2013-02-21'::date c3, + '2013-02-21'::testdatexmldomain c4; +SELECT xmlforest(c1, c2, c3, c4) FROM testxmlschema.test3; + xmlforest +------------------------------------------------------------------ + truetrue2013-02-212013-02-21 +(1 row) + +SELECT table_to_xml('testxmlschema.test3', true, true, ''); + table_to_xml +--------------------------------------------------------------- + + + true + + true + + 2013-02-21 + + 2013-02-21 + + + + + + +(1 row) + diff --git a/src/test/singlenode_regress/expected/xmlmap_1.out b/src/test/singlenode_regress/expected/xmlmap_1.out new file mode 100644 index 00000000000..319ac7d9876 --- /dev/null +++ b/src/test/singlenode_regress/expected/xmlmap_1.out @@ -0,0 +1,134 @@ +CREATE SCHEMA testxmlschema; +CREATE TABLE testxmlschema.test1 (a int, b text); +INSERT INTO testxmlschema.test1 VALUES (1, 'one'), (2, 'two'), (-1, null); +CREATE DOMAIN testxmldomain AS varchar; +CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), + w numeric(9,2), v smallint, u bigint, t real, + s time, stz timetz, r timestamp, rtz timestamptz, q date, + p xml, o testxmldomain, n bool, m bytea, aaa text); +ALTER TABLE testxmlschema.test2 DROP COLUMN aaa; +INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', + 98.6, 2, 999, 0, + '21:07', '21:11 +05', '2009-06-08 21:07:30', '2009-06-08 21:07:30 -07', '2009-06-08', + NULL, 'ABC', true, 'XYZ'); +SELECT table_to_xml('testxmlschema.test1', false, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml('testxmlschema.test1', true, false, 'foo'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml('testxmlschema.test1', false, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml('testxmlschema.test1', true, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml('testxmlschema.test2', false, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xmlschema('testxmlschema.test1', false, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xmlschema('testxmlschema.test1', true, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xmlschema('testxmlschema.test1', false, true, 'foo'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xmlschema('testxmlschema.test1', true, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xmlschema('testxmlschema.test2', false, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', false, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', true, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', false, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', true, true, 'foo'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT query_to_xml('SELECT * FROM testxmlschema.test1', false, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT query_to_xmlschema('SELECT * FROM testxmlschema.test1', false, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT query_to_xml_and_xmlschema('SELECT * FROM testxmlschema.test1', true, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +DECLARE xc CURSOR WITH HOLD FOR SELECT * FROM testxmlschema.test1 ORDER BY 1, 2; +SELECT cursor_to_xml('xc'::refcursor, 5, false, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT cursor_to_xmlschema('xc'::refcursor, false, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +MOVE BACKWARD ALL IN xc; +ERROR: backward scan is not supported in this version of Cloudberry Database +SELECT cursor_to_xml('xc'::refcursor, 5, true, false, ''); +ERROR: portal "xc" cannot be run +SELECT cursor_to_xmlschema('xc'::refcursor, true, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT schema_to_xml('testxmlschema', false, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT schema_to_xml('testxmlschema', true, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT schema_to_xmlschema('testxmlschema', false, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT schema_to_xmlschema('testxmlschema', true, false, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT schema_to_xml_and_xmlschema('testxmlschema', true, true, 'foo'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +-- test that domains are transformed like their base types +CREATE DOMAIN testboolxmldomain AS bool; +CREATE DOMAIN testdatexmldomain AS date; +CREATE TABLE testxmlschema.test3 + AS SELECT true c1, + true::testboolxmldomain c2, + '2013-02-21'::date c3, + '2013-02-21'::testdatexmldomain c4; +SELECT xmlforest(c1, c2, c3, c4) FROM testxmlschema.test3; +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +SELECT table_to_xml('testxmlschema.test3', true, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. diff --git a/src/test/singlenode_regress/greenplum_schedule b/src/test/singlenode_regress/greenplum_schedule new file mode 100755 index 00000000000..b682d230aa1 --- /dev/null +++ b/src/test/singlenode_regress/greenplum_schedule @@ -0,0 +1,315 @@ +# Cloudberry-specific tests +# +# The order of the tests is fairly random, but there are a couple of things +# to consider when placing a new test: +# +# * Keep long-running tests in the same group with other tests with a similar +# runtime. That way, on a multi-processor system, the tests will finish +# roughly at the same time, which maximizes parallelism. +# * Keep tests together with other tests for similar functionality. +# * There are some dependencies between tests, and some tests cannot run +# in parallel with other tests. +# * The maximum size of a group is about 20, like in the Postgres +# parallel_schedule. However, some queries can dispatch a lot of workers +# to the segments, and therefore has to run in smaller groups to avoid +# hitting max_connections limit on segments. +# + +# test: gp_dispatch_keepalives + +# copy command +# copy form a file with different EOL +# test: copy_eol + +# gp_toolkit performs a vacuum and checks that it truncated the relation. That +# might not happen if other backends are holding transactions open, preventing +# vacuum from removing dead tuples. And run gp_toolkit early to make some log +# file related tests (like gp_log_system, etc) faster. +# test: disable_autovacuum +# test: gp_toolkit +# test: python_processed64bit +# test: enable_autovacuum + +# test: log_guc +# enable query metrics cluster GUC +# test: instr_in_shmem_setup +# run separately - because slot counter may influenced by other parallel queries +# test: instr_in_shmem + +test: createdb +test: update_gp returning_gp cluster_gp +# test: gp_aggregates gp_aggregates_costs gp_metadata variadic_parameters default_parameters function_extensions spi gp_xml shared_scan update_gp triggers_gp returning_gp resource_queue_with_rule gp_types gp_index cluster_gp combocid_gp gp_sort +# test: spi_processed64bit +# test: gp_tablespace_with_faults +# below test(s) inject faults so each of them need to be in a separate group +# test: gp_tablespace + +# test: temp_tablespaces +# test: default_tablespace + +test: case_gp limit_gp join_gp union_gp create_table_like_gp matview_ao +# test: leastsquares opr_sanity_gp decode_expr bitmapscan bitmapscan_ao case_gp limit_gp notin percentile join_gp union_gp gpcopy_encoding gp_create_table gp_create_view window_views replication_slots create_table_like_gp gp_constraints matview_ao gpcopy_dispatch +# below test(s) inject faults so each of them need to be in a separate group +test: gpcopy + +# test: orca_static_pruning orca_groupingsets_fallbacks +# test: filter gpctas gpdist gpdist_opclasses gpdist_legacy_opclasses matrix sublink table_functions olap_setup complex opclass_ddl information_schema guc_env_var gp_explain distributed_transactions explain_format olap_plans misc_jiras gp_copy_dtx +# below test(s) inject faults so each of them need to be in a separate group +# test: guc_gp +# test: toast + +# namespace_gp test will show diff if concurrent tests use temporary tables. +# So run it separately. +# test: namespace_gp + +# test gpdb internal and segment connections +# test: gp_connections + +# bitmap_index triggers recovery, run it seperately +# test: bitmap_index +test: incremental_analyze +# test: gp_dump_query_oids analyze gp_owner_permission incremental_analyze truncate_gp +test: indexjoin +# test: indexjoin as_alias regex_gp gpparams with_clause transient_types gp_rules dispatch_encoding motion_gp + +# interconnect tests +# test: icudp/gp_interconnect_queue_depth icudp/gp_interconnect_queue_depth_longtime icudp/gp_interconnect_snd_queue_depth icudp/gp_interconnect_snd_queue_depth_longtime icudp/gp_interconnect_min_retries_before_timeout icudp/gp_interconnect_transmit_timeout icudp/gp_interconnect_cache_future_packets icudp/gp_interconnect_default_rtt icudp/gp_interconnect_fc_method icudp/gp_interconnect_min_rto icudp/gp_interconnect_timer_checking_period icudp/gp_interconnect_timer_period icudp/queue_depth_combination_loss icudp/queue_depth_combination_capacity + +# event triggers cannot run concurrently with any test that runs DDL +# test: event_trigger_gp + +# deadlock tests run separately - because we don't know which one gets stuck. +# test: deadlock +# test: deadlock2 + +# test workfiles +test: workfile/hashagg_spill workfile/hashjoin_spill +# test: workfile/hashagg_spill workfile/hashjoin_spill workfile/materialize_spill workfile/sisc_mat_sort workfile/sisc_sort_spill workfile/sort_spill workfile/spilltodisk +# test workfiles compressed using zlib +# 'zlib' utilizes fault injectors so it needs to be in a group by itself +# test: zlib + +# test: workfile_limits +# It will also use faultinjector - so it needs to be in a group by itself. +# test: segspace + +# test: cursor + +# 'query_finish_pending' sets QueryFinishPending flag to true during query execution using fault injectors +# so it needs to be in a group by itself +test: query_finish_pending + +test: sequence_gp tidscan_gp agg_pushdown +# test: gpdiffcheck gptokencheck gp_hashagg sequence_gp tidscan_gp co_nestloop_idxscan dml_in_udf gpdtm_plpgsql agg_pushdown + +# The test must be run by itself as it injects a fault on QE to fail +# at the 2nd phase of 2PC. +# test: dtm_retry + +# The appendonly test cannot be run concurrently with tests that have +# serializable transactions (may conflict with AO vacuum operations). +test: subselect_gp subselect_gp2 +# test: rangefuncs_cdb gp_dqa subselect_gp subselect_gp2 gp_transactions olap_group olap_window_seq sirv_functions appendonly create_table_distpol alter_distpol_dropped query_finish partial_table subselect_gp_indexes + +# 'partition' runs for a long time, so try to keep it together with other +# long-running tests. +test: partition partition1 partition_indexing partition_storage partition_ddl partition_with_user_defined_function partition_unlogged partition_subquery partition_with_user_defined_function_that_truncates + +# test: index_constraint_naming index_constraint_naming_partition index_constraint_naming_upgrade + +test: brin_ao brin_aocs + +# test: sreh + +# test: rle rle_delta dsp not_out_of_shmem_exit_slots create_am_gp + +# Cloudberry-specific tests +# test: cbdb_optimizer_test +# test: gp_runtime_filter + +# Disabled tests. XXX: Why are these disabled? +#test: olap_window +#test: tpch500GB + +# test: db_size_functions + +# FIXME: These tests no longer work, because they try to set +# gp_interconnect_type, which doesn't work: +# ERROR: parameter "gp_interconnect_type" cannot be set after connection start + +# ignore: gp_portal_error +test: aoco_privileges +# test: external_table external_table_union_all external_table_create_privs external_table_persistent_error_log column_compression eagerfree alter_table_aocs alter_table_aocs2 alter_distribution_policy aoco_privileges +# test: alter_table_set alter_table_gp alter_table_ao subtransaction_visibility oid_consistency udf_exception_blocks +# below test(s) inject faults so each of them need to be in a separate group +test: aocs +# test: ic + +test: resource_queue +test: resource_queue_function +# test: disable_autovacuum +# Check for shmem leak for instrumentation slots before gpdb restart +# test: instr_in_shmem_verify +# 'partition_locking' gets confused if other backends run concurrently and +# hold locks. +# test: partition_locking +# test: vacuum_gp +# test: resource_queue_stat +# background analyze may affect pgstat +# test: pg_stat +# test: bfv_partition qp_misc_rio +# test: pgstat_qd_tabstat +# dispatch should always run seperately from other cases. +# test: dispatch +# test: enable_autovacuum +# test: resource_group +# test: resource_group_cpuset +# test: resource_group_gucs +# test: wrkloadadmin + +# expand_table tests may affect the result of 'gp_explain', keep them below that +# test: gp_toolkit_ao_funcs trig auth_constraint role portals_updatable plpgsql_cache timeseries pg_stat_last_operation pg_stat_last_shoperation gp_numeric_agg partindex_test partition_pruning runtime_stats expand_table expand_table_ao expand_table_aoco expand_table_regression + +# direct dispatch tests +test: bfv_dd bfv_dd_multicolumn bfv_dd_types +# test: direct_dispatch bfv_dd bfv_dd_multicolumn bfv_dd_types + +test: bfv_catalog bfv_index bfv_olap bfv_aggregate bfv_partition_plans +# test: bfv_catalog bfv_index bfv_olap bfv_aggregate bfv_partition_plans DML_over_joins bfv_statistic nested_case_null sort bb_mpph aggregate_with_groupingsets gporca gpsd +# Run minirepro separately to avoid concurrent deletes erroring out the internal pg_dump call +# test: minirepro + +# NOTE: gporca_faults uses gp_fault_injector - so do not add to a parallel group +# test: gporca_faults + +# test: bb_memory_quota + +# Tests for replicated table +# test: rpt rpt_joins rpt_tpch rpt_returning + +# NOTE: The bfv_temp test assumes that there are no temporary tables in +# other sessions. Therefore the other tests in this group mustn't create +# temp tables +# test: bfv_cte bfv_joins bfv_subquery bfv_planner bfv_legacy bfv_temp bfv_dml + +test: gp_recursive_cte +# test: qp_olap_mdqa qp_misc gp_recursive_cte qp_dml_joins + +test: qp_with_clause +# test: qp_misc_jiras qp_with_clause qp_executor qp_olap_windowerr qp_olap_window qp_derived_table qp_bitmapscan qp_dropped_cols +# test: qp_with_functional_inlining qp_with_functional_noinlining +# test: qp_functions_in_contexts_setup +test: qp_query_execution +# test: qp_misc_rio_join_small qp_misc_rio qp_correlated_query qp_targeted_dispatch qp_gist_indexes2 qp_gist_indexes3 qp_gist_indexes4 qp_query_execution qp_functions_in_from qp_functions_in_select qp_functions_in_subquery qp_functions_in_subquery_column qp_functions_in_subquery_constant qp_functions_in_with +# test: qp_misc_rio_join_small qp_correlated_query qp_targeted_dispatch qp_gist_indexes2 qp_gist_indexes3 qp_gist_indexes4 qp_query_execution qp_functions_in_from qp_functions_in_select qp_functions_in_subquery qp_functions_in_subquery_column qp_functions_in_with + +test: qp_left_anti_semi_join qp_union_intersect +# test: dpe qp_dpe qp_subquery qp_left_anti_semi_join qp_union_intersect qp_functions qp_functions_idf qp_regexp qp_resource_queue qp_orca_fallback + +# test: olap_setup +# test: qp_olap_group qp_olap_group2 + +# test: hooktest tuple_serialization + +# Test query_info_collect_hook are called in expected sequence on normal query, query error/abort +# test: query_info_hook_test + +# ignore: tpch500GB_orca + +# Tests for "compaction", i.e. VACUUM, of updatable append-only tables +test: uao_compaction/full uao_compaction/outdated_partialindex uao_compaction/drop_column_update uao_compaction/eof_truncate uao_compaction/basic uao_compaction/outdatedindex uao_compaction/update_toast uao_compaction/outdatedindex_abort uao_compaction/delete_toast uao_compaction/alter_table_analyze uao_compaction/full_eof_truncate uao_compaction/full_threshold +# TODO find why these tests fail in parallel, for now keeping them sequential +# test: uao_compaction/full_stats +# test: uao_compaction/stats +# test: uao_compaction/index_stats +# test: uao_compaction/index +# test: uao_compaction/drop_column +# test: uao_compaction/index2 + + +# Tests for "compaction", i.e. VACUUM, of updatable append-only column oriented tables +test: uaocs_compaction/alter_table_analyze uaocs_compaction/basic uaocs_compaction/drop_column_update uaocs_compaction/eof_truncate uaocs_compaction/full uaocs_compaction/full_eof_truncate uaocs_compaction/full_threshold uaocs_compaction/outdated_partialindex uaocs_compaction/outdatedindex uaocs_compaction/outdatedindex_abort +# TODO find why these tests fail in parallel, for now keeping them sequential +# test: uaocs_compaction/full_stats +# test: uaocs_compaction/stats +# test: uaocs_compaction/index_stats +# test: uaocs_compaction/index +# test: uaocs_compaction/drop_column + +# test: uao_ddl/cursor_row uao_ddl/cursor_column uao_ddl/alter_ao_table_statistics_row uao_ddl/alter_ao_table_statistics_column uao_ddl/alter_ao_table_setdefault_row uao_ddl/alter_ao_table_index_row uao_ddl/alter_ao_table_owner_column uao_ddl/spgist_over_ao_table_row +# test: uao_ddl/alter_ao_table_owner_row uao_ddl/alter_ao_table_setstorage_row uao_ddl/alter_ao_table_constraint_row uao_ddl/alter_ao_table_constraint_column uao_ddl/alter_ao_table_index_column uao_ddl/blocksize_row uao_ddl/compresstype_column uao_ddl/alter_ao_table_setdefault_column uao_ddl/blocksize_column uao_ddl/temp_on_commit_delete_rows_row uao_ddl/temp_on_commit_delete_rows_column uao_ddl/spgist_over_ao_table_column +# test: uao_ddl/alter_ao_table_setstorage_column uao_ddl/alter_ao_table_col_ddl_row uao_ddl/compresstype_row uao_ddl/alter_ao_table_col_ddl_column uao_ddl/alter_ao_part_tables_splitpartition_row uao_ddl/alter_ao_part_tables_splitpartition_column uao_ddl/create_ao_tables_row uao_ddl/create_ao_table_500cols_row uao_ddl/create_ao_tables_column uao_ddl/alter_ao_part_exch_row +# test: uao_ddl/alter_ao_part_exch_column uao_ddl/alter_ao_part_tables_row uao_ddl/create_ao_table_500cols_column uao_ddl/alter_ao_part_tables_column + +# test: uao_ddl/alter_drop_allcol_row uao_ddl/alter_drop_allcol_column uao_ddl/alter_rollback_row uao_ddl/alter_rollback_column uao_ddl/uao_allalter_row uao_ddl/uao_allalter_column + +# These tests use gp_select_invisible and VACUUM, and will get confused if there are +# concurrent transactions holding back the global xmin. + +test: uao_dml/uao_dml_cursor_row uao_dml/uao_dml_select_row uao_dml/uao_dml_cursor_column uao_dml/uao_dml_select_column + + +# disable autovacuum for the test +# test: disable_autovacuum +# Run uao[cs]_catalog_tables separately. They run VACUUM FULL on +# append-optimized tables and assume that no AWAITING_DROP segfiles exist at +# the end of VACUUM FULL. +# test: uao_catalog_tables +# test: uaocs_catalog_tables +# test: uao_compaction/threshold +# test: uaocs_compaction/threshold +# test: uao_ddl/analyze_ao_table_every_dml_row uao_ddl/analyze_ao_table_every_dml_column +# test: uao_dml/uao_dml_row +# test: uao_dml/uao_dml_column +# test: ao_locks +# test: freeze_aux_tables + +# These cannot run in parallel, because they check that VACUUM FULL shrinks table size. +# A concurrent session could hold back the xid horizon and prevent old tuples from being +# removed. +# test: vacuum_full_ao +# test: vacuum_full_freeze_heap +# test: vacuum_full_heap +# test: vacuum_full_heap_bitmapindex +# Check for shmem leak for instrumentation slots +# test: instr_in_shmem_verify +# check autostats +# test: autostats +# test: enable_autovacuum + +test: AOCO_Compression AORO_Compression +# test: ao_checksum_corruption AOCO_Compression AORO_Compression table_statistics +# test: session_reset +# below test(s) inject faults so each of them need to be in a separate group +# test: fts_error + +# test: psql_gp_commands pg_resetwal dropdb_check_shared_buffer_cache gp_upgrade_cornercases + +# test: temp_relation +# test: alter_db_set_tablespace + +# This cannot run in parallel because other tests could increment the Oid +# counters and make the Oid counter observations hardcoded in the answer file +# incorrect. +# test: oid_wraparound + +# fts_recovery_in_progresss uses fault injectors to simulate FTS fault states, +# hence it should be run in isolation. +# test: fts_recovery_in_progress +# test: mirror_replay +# test: autovacuum +# test: autovacuum-segment +# test: autovacuum-template0-segment + +# gpexpand introduce the partial tables, check them if they can run correctly +# test: gangsize gang_reuse + +# some utilities do not work while doing gpexpand, check them can print correct message +# test: run_utility_gpexpand_phase1 + +# check correct error message when create extension error on segment +# test: create_extension_fail + +# CBDB specific tests +test: singlenode_compatibility_cbdb +# end of tests diff --git a/src/test/singlenode_regress/init_file b/src/test/singlenode_regress/init_file new file mode 100644 index 00000000000..8d889b384fe --- /dev/null +++ b/src/test/singlenode_regress/init_file @@ -0,0 +1,144 @@ +-- This file contains global patterns of messages that should be ignored or +-- masked out, when comparing test results with the expected output. +-- Individual tests can contain additional patterns specific to the test. + +-- start_matchignore + +# Some tests use the gp_inject_fault extension, and create it at the beginning +# of the test. Ignore the NOTICE if it exists already. +m/^NOTICE: extension "gp_inject_fault" already exists, skipping/ + +# Some tests use the gp_debug_numsegments extension, and create it at the beginning +# of the test. Ignore the NOTICE if it exists already. +m/NOTICE: extension "gp_debug_numsegments" already exists, skipping/ + +m/^ Optimizer status:.*/ +m/^ Optimizer: Pivotal Optimizer \(GPORCA\).*/ +m/^ Optimizer: Postgres query optimizer/ +m/^ Settings:.*/ + +# There are a number of NOTICE and HINT messages around table distribution, +# for example to inform the user that the database will pick a particular +# column in order to distribute the data. Merging tests from postgres will +# cause the tests to output these messages and we would need to manually +# modify the corresponding expected output. Hence we want to ignore these. +# Some of the messages include: +# +# NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named '' as the Cloudberry Database data distribution key for this table. +# NOTICE: Table doesn't have 'DISTRIBUTED BY' clause, defaulting to distribution columns from LIKE 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. +# +# The following regex is intended to cover all permutations of the above set +# of messages. +m/^(?:HINT|NOTICE):\s+.+\'DISTRIBUTED BY\' clause.*/ + +# The following NOTICE is generated when a partitioned table is created. For +# each child partition that gets created, it will generate a NOTICE saying that +# it is creating that particular partition. Certain tests add anonymous +# partitions and the names of these anonymous partitions will change across test +# runs. +# E.g CREATE TABLE will create partition "hhh_1_prt_r1987544232" for table "hhh" +# CREATE TABLE will create partition "hhh_1_prt_r1987553186" for table "hhh" +m/^NOTICE:.*CREATE TABLE will create partition ".*" for table ".*"/ + +# The following NOTICE is generated when creating a role. It is to inform the +# user that the database will assign the default resource queue to the role if +# the user has not explicitly specified one. Merging tests from postgres will +# cause the tests to output these messages and we would need to manually modify +# the corresponding expected output. Hence we want to ignore these. +m/^NOTICE:.*resource queue required -- using default resource queue ".*"/ + +# The following NOTICE is generated when a user creates an index on the parent +# partition table. For each child partition, it informs the user that the +# database will create an index for that partition. The messages might appear in +# different order for the child partitions. +m/^NOTICE:.*building index for child partition ".*"/ + +# The following NOTICE is generated when a user tries to split a partition or +# exchange a partition with the default partition. +# In case of split partitions we end up creating temp tables to exchange the partitions +# E.g exchanged partition "p1" of relation "parttest_t" with relation "pg_temp_4062621" +m/^NOTICE:.*exchanged partition ".*" with relation ".*"/ + +m/^WARNING: could not close temporary file .*: No such file or directory/ + +# Messages when resource group is enabled: +# WARNING: resource queue is disabled +# HINT: To enable set gp_resource_manager=queue +# NOTICE: resource group required -- using default resource group "default_group" +m/^WARNING: resource queue is disabled$/ +m/^HINT: To enable set gp_resource_manager=queue$/ +m/^NOTICE: resource group required -- using .* resource group ".*"$/ + +# The following WARNING is generated by ANALYZE when some sample tuples are +# from segments outside the [0, numsegments-1] range, however this does not +# indicate the data distribution is wrong. Take inherited tables for example, +# when inherited tables has greater numsegments than parent this WARNING will +# be raised, and it is expected. This could happen normally on the +# random_numsegments pipeline job, so ignore this WARNING. +m/^WARNING: table ".*" contains rows in segment .*, which is outside the # of segments for the table's policy \(\d+ segments\)$/ + +# The following output is generated by \d on foreign tables, so ignore it. +m/Distributed by: \(.*\)/ +m/Distributed randomly/ +-- end_matchignore + +-- start_matchsubs +# entry db matches +m/\s+\(entry db(.*)+\spid=\d+\)/ +s/\s+\(entry db(.*)+\spid=\d+\)// + +# Mask out some numbers (parts of partition names) that vary from run to run. +m/overlaps existing partition "r\d+"/ +s/overlaps existing partition "r\d+"/partition "r##########"/ + +# Mask out some numbers (part of temp table schema) that vary from run to run. +m/Table "pg_temp_\d+.temp/ +s/\s*Table "pg_temp_\d+.temp\s*/Table "pg_temp_#####/ + +# Mask out some numbers (part of temp table schema) that vary from run to run. +m/Hash Cond: \(pg_temp_\d+/ +s/Hash Cond: \(pg_temp_\d+/Hash Cond: \(pg_temp_#####/ + +# Mask out oid in error concurrent drop message +m/\d+ was concurrently dropped/ +s/\d+ was concurrently dropped/##### was concurrently dropped/ + +# Mask out linenumber of the erroring file +m/ERROR: ANALYZE cannot merge since not all non-empty leaf partitions have consistent hyperloglog statistics for merge.*/ +s/ERROR: ANALYZE cannot merge since not all non-empty leaf partitions have consistent hyperloglog statistics for merge.*/ERROR: ANALYZE cannot merge since not all non-empty leaf partitions have consistent hyperloglog statistics for merge (analyze.c:XXX)/ + +# Mask out gp_execution_segment() +m/One-Time Filter: \(gp_execution_segment\(\) = \d+/ +s/One-Time Filter: \(gp_execution_segment\(\) = \d+/One-Time Filter: \(gp_execution_segment\(\) = ###/ + +m/ERROR: infinite recursion detected.*/ +s/ERROR: infinite recursion detected.*/ERROR: infinite recursion detected/ + +m/ERROR: could not find hash function for hash operator.*/ +s/ERROR: could not find hash function for hash operator.*/ERROR: could not find hash function for hash operator/ + +m/nodename nor servname provided, or not known/ +s/nodename nor servname provided, or not known/Name or service not known/ + +m/Temporary failure in name resolution/ +s/Temporary failure in name resolution/Name or service not known/ + +m/ERROR: could not devise a query plan for the given query \(.*\)/ +s/ERROR: could not devise a query plan for the given query \(.*\)/ERROR: could not devise a query plan for the given query/ + +m/^DETAIL:.*gid=.*/ +s/gid=\d+/gid DUMMY/ + +m/NOTICE: One or more columns in the following table\(s\) do not have statistics: / +s/.//gs +m/HINT: For non-partitioned tables, run analyze .+\. For partitioned tables, run analyze rootpartition .+\. See log for columns missing statistics\./ +s/.//gs + +m/connection to server at "localhost" (.*), port .* failed: / +s/.//gs + +m/ERROR: can't split update for inherit table: .*/ +s/ERROR: can't split update for inherit table: .*/ERROR: can't split update for inherit table:/ + +-- end_matchsubs diff --git a/src/test/singlenode_regress/input/aocs.source b/src/test/singlenode_regress/input/aocs.source new file mode 100644 index 00000000000..d5738ba15c6 --- /dev/null +++ b/src/test/singlenode_regress/input/aocs.source @@ -0,0 +1,701 @@ +set client_min_messages='ERROR'; + +-- test ao seg totals +create or replace function aototal(relname text) returns float8 as $$ +declare + aosegname text; + tupcount float8 := 0; + rc int := 0; +begin + + execute 'select relname from pg_class where oid=(select segrelid from pg_class, pg_appendonly where relname=''' || relname || ''' and relid = pg_class.oid)' into aosegname; + if aosegname is not null then + execute 'select sum(tupcount) from gp_dist_random(''pg_aoseg.' || aosegname || ''')' into tupcount; + end if; + return tupcount; +end; $$ language plpgsql volatile READS SQL DATA; + + +CREATE TABLE tenk_heap_for_aocs ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) with (appendonly=false); + +-- +-- create few AO tables. test various reloptions combinations. use a sample +-- of them (the first 4) for later testing. +-- +-- valid combinations +CREATE TABLE tenk_aocs1 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, checksum=true); +CREATE TABLE tenk_aocs2 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=0, blocksize=262144); +CREATE TABLE tenk_aocs3 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=6, blocksize=1048576, checksum=true); +CREATE TABLE tenk_aocs4 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=1, compresstype=zlib); +CREATE TABLE tenk_aocs5 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=6, compresstype=zlib); +CREATE TABLE tenk_aocs6 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=6, compresstype=zlib, blocksize=1048576, checksum=true); +-- invalid combinations +-- col instead of column +CREATE TABLE tenk_aocs7 (like tenk_heap_for_aocs) with (appendonly=true, orientation=col); +-- no parentheses surrounding storage options +CREATE TABLE tenk_aocs8 (like tenk_heap_for_aocs) with appendonly=true, orientation=column; +-- no comma separating storage options +CREATE TABLE tenk_aocs9 (like tenk_heap_for_aocs) with (appendonly=true orientation=column); +-- appendonly=false with orientation=column should not work +CREATE TABLE tenk_aocs10 (like tenk_heap_for_aocs) with (appendonly=false, orientation=column, compresslevel=6, checksum=true); +-- block size must be between 8KB and 2MB w/ 8KB multiple +CREATE TABLE tenk_aocs11 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, blocksize=100); +-- cannot have compresslevel 0 +CREATE TABLE tenk_aocs12 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=0, compresstype=zlib); +-- orientation=column must be combined with appendonly=true +CREATE TABLE tenk_aocs13 (like tenk_heap_for_aocs) with (orientation=column); + + +-------------------- +-- catalog checks +-------------------- + +-- check pg_appendonly +SELECT c.relname, a.blocksize, a.compresstype, a.compresslevel, a.checksum FROM pg_class c, pg_appendonly a WHERE c.relname LIKE 'tenk_aocs%' AND c.oid=a.relid ORDER BY c.relname; + +-------------------- +-- supported sql +-------------------- + +-- COPY +COPY tenk_heap_for_aocs FROM '@abs_srcdir@/data/tenk.data'; +COPY tenk_aocs1 FROM '@abs_srcdir@/data/tenk.data'; +COPY tenk_aocs2 FROM '@abs_srcdir@/data/tenk.data'; +COPY tenk_aocs3 FROM '@abs_srcdir@/data/tenk.data'; +COPY tenk_aocs4 FROM '@abs_srcdir@/data/tenk.data'; + +-- SELECT +SELECT count(*) FROM tenk_heap_for_aocs; +SELECT count(*) FROM tenk_aocs1; +SELECT count(*) FROM tenk_aocs2; +SELECT count(*) FROM tenk_aocs3; +SELECT count(*) FROM tenk_aocs4; +SELECT aototal('tenk_aocs1'), aototal('tenk_aocs2'), aototal('tenk_aocs3'), aototal('tenk_aocs4'); + +-- INSERT SELECT +INSERT INTO tenk_aocs1 SELECT * FROM tenk_heap_for_aocs; +INSERT INTO tenk_aocs2 SELECT * FROM tenk_heap_for_aocs; +INSERT INTO tenk_aocs3 SELECT * FROM tenk_heap_for_aocs; +INSERT INTO tenk_aocs4 SELECT * FROM tenk_heap_for_aocs; +INSERT INTO tenk_aocs5 SELECT * FROM tenk_heap_for_aocs; + +-- mix and match some +INSERT INTO tenk_aocs1 SELECT * FROM tenk_aocs1; +INSERT INTO tenk_aocs2 SELECT * FROM tenk_aocs3; +INSERT INTO tenk_aocs3 SELECT * FROM tenk_aocs2; +INSERT INTO tenk_aocs4 SELECT * FROM tenk_aocs3; +SELECT aototal('tenk_aocs1'), aototal('tenk_aocs2'), aototal('tenk_aocs3'), aototal('tenk_aocs4'); + +-- SELECT +SELECT count(*) FROM tenk_heap_for_aocs; +SELECT count(*) FROM tenk_aocs1; +SELECT count(*) FROM tenk_aocs2; +SELECT count(*) FROM tenk_aocs3; +SELECT count(*) FROM tenk_aocs4; + +-- +-- Test that the catalog eof entry doesn't change even if the file gets +-- larger due to bad data that isn't cleaned up until the next VACUUM. +-- make sure the SELECT stops at eof (count is the same). +-- The first row is good (so it grows the file), the second is bad. +-- +COPY tenk_aocs1 FROM STDIN; +88888800 0 0 0 0 0 0 800 800 3800 8800 0 1 MAAAAA AAAAAA AAAAxx +bad data row +\. +COPY tenk_aocs2 FROM STDIN; +88888800 0 0 0 0 0 0 800 800 3800 8800 0 1 MAAAAA AAAAAA AAAAxx +bad data row +\. +COPY tenk_aocs3 FROM STDIN; +88888800 0 0 0 0 0 0 800 800 3800 8800 0 1 MAAAAA AAAAAA AAAAxx +bad data row +\. +COPY tenk_aocs4 FROM STDIN; +88888800 0 0 0 0 0 0 800 800 3800 8800 0 1 MAAAAA AAAAAA AAAAxx +bad data row +\. +SELECT count(*) FROM tenk_aocs1; +SELECT count(*) FROM tenk_aocs2; +SELECT count(*) FROM tenk_aocs3; +SELECT count(*) FROM tenk_aocs4; +SELECT aototal('tenk_aocs1'), aototal('tenk_aocs2'), aototal('tenk_aocs3'), aototal('tenk_aocs4'); + +-------------------- +-- transactionality +-------------------- + +-- rollback +BEGIN; +INSERT INTO tenk_aocs1 SELECT * FROM tenk_heap_for_aocs; +SELECT count(*) FROM tenk_aocs1; -- should show new count +ROLLBACK; +SELECT count(*) FROM tenk_aocs1; -- should show previous count +SELECT aototal('tenk_aocs1'); + +-- commit +BEGIN; +INSERT INTO tenk_aocs1 SELECT * FROM tenk_heap_for_aocs; +SELECT count(*) FROM tenk_aocs1; -- should show new count +COMMIT; +SELECT count(*) FROM tenk_aocs1; -- should show new count +SELECT aototal('tenk_aocs1'); + +-- same txn inserts +BEGIN; +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +ROLLBACK; +BEGIN; +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +COMMIT; +SELECT count(*) FROM tenk_aocs1 WHERE unique1 = 12345678; -- should be 0 +SELECT count(*) FROM tenk_aocs1 WHERE unique1 = 87654321; -- should be 5 + +-------------------- +-- cursors (basic) +-------------------- +BEGIN; + +DECLARE foo1 CURSOR FOR SELECT * FROM tenk_aocs1 ORDER BY 1,2,3,4; +DECLARE foo2 CURSOR FOR SELECT * FROM tenk_aocs2 ORDER BY 1,2,3,4; +FETCH 1 in foo1; +FETCH 2 in foo2; +FETCH 1 in foo1; +FETCH 2 in foo2; +CLOSE foo1; +CLOSE foo2; +END; + +BEGIN; +DECLARE foo3 NO SCROLL CURSOR FOR SELECT * FROM tenk_aocs1 ORDER BY 1,2,3,4; +FETCH 1 FROM foo3; +FETCH BACKWARD 1 FROM foo3; -- should fail +END; + +-- Cursors outside transaction blocks +BEGIN; +DECLARE foo4 CURSOR WITH HOLD FOR SELECT * FROM tenk_aocs1 ORDER BY 1,2,3,4; +FETCH FROM foo4; +FETCH FROM foo4; +COMMIT; +FETCH FROM foo4; +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; +CLOSE foo4; + +-- DROP +DROP TABLE tenk_aocs1; +DROP TABLE tenk_aocs2; +DROP TABLE tenk_aocs3; +DROP TABLE tenk_aocs4; + +-- CTAS +CREATE TABLE tenk_aocs1 with(appendonly=true, orientation=column, checksum=true) AS SELECT * FROM tenk_heap_for_aocs; +CREATE TABLE tenk_aocs2 with(appendonly=true, orientation=column, compresslevel=0, blocksize=262144) AS SELECT * FROM tenk_heap_for_aocs; +CREATE TABLE tenk_aocs3 with(appendonly=true, orientation=column, compresslevel=6, blocksize=1048576, checksum=true) AS SELECT * FROM tenk_heap_for_aocs; +CREATE TABLE tenk_aocs4 with(appendonly=true, orientation=column, compresslevel=1, compresstype=zlib) AS SELECT * FROM tenk_heap_for_aocs; +SELECT c.relname, a.blocksize, a.compresstype, a.compresslevel, a.checksum FROM pg_class c, pg_appendonly a WHERE c.relname LIKE 'tenk_aocs%' AND c.oid=a.relid ORDER BY c.relname; +SELECT count(*) FROM tenk_aocs1; +SELECT count(*) FROM tenk_aocs2; +SELECT count(*) FROM tenk_aocs3; +SELECT count(*) FROM tenk_aocs4; + +-- INHERITS +-- This used to be forbidden, but we allow it now. +CREATE TABLE aocs_inh_parent (parent_t text, + parent_t_8k text encoding (blocksize=8192)) +WITH (appendonly=true, orientation=column); + +-- The storage options are not inherited, but you can specify them explicitly. +CREATE TABLE aocs_inh_child1 () +INHERITS (aocs_parent) +WITH (appendonly=true, orientation=column); +CREATE TABLE aocs_inh_child2 (parent_t text ENCODING (compresstype=zlib)) +INHERITS (aocs_inh_parent) +WITH (appendonly=true, orientation=column); + +-- This syntax works even without explicitly listing the column. +CREATE TABLE aocs_inh_child3 (COLUMN parent_t ENCODING (compresstype=zlib)) +INHERITS (aocs_inh_parent) +WITH (appendonly=true, orientation=column); + +SELECT c.relname, ae.attnum, ae.attoptions FROM pg_class c, pg_attribute_encoding ae WHERE c.relname LIKE 'aocs_inh%' AND c.oid=ae.attrelid ORDER BY 1,2; + +-- Multiple inheritance +-- The ENCODING of parent_t_8k column doesn't match that of the other parent table. +-- That's OK, because we don't try to copy the compression options from the parents. +CREATE TABLE aocs_inh_parent2 (parent_t text, + parent_t_8k text encoding (blocksize=16384), + otherparent_t_8k text encoding (blocksize=8192)) +WITH (appendonly=true, orientation=column); +CREATE TABLE aocs_inh_multichild () +INHERITS (aocs_inh_parent, aocs_inh_parent2) +WITH (appendonly=true, orientation=column); + +SELECT c.relname, ae.attnum, ae.attoptions FROM pg_class c, pg_attribute_encoding ae WHERE c.relname LIKE 'aocs_inh_multi%' AND c.oid=ae.attrelid ORDER BY 1,2; + +-- AOCO table inherits a heap table. +CREATE TABLE aocs_inh2_parent_heap (parent_t text, parent_t2 text); +CREATE TABLE aocs_inh2_child1 () INHERITS (aocs_inh2_parent_heap) +WITH (appendonly=true, orientation=column); +CREATE TABLE aocs_inh2_child2 (COLUMN parent_t ENCODING (compresstype=zlib)) INHERITS (aocs_inh2_parent_heap) +WITH (appendonly=true, orientation=column); + +SELECT c.relname, ae.attnum, ae.attoptions FROM pg_class c, pg_attribute_encoding ae WHERE c.relname LIKE 'aocs_inh2_%' AND c.oid=ae.attrelid ORDER BY 1,2; + +-- don't drop the tables, to also test pg_dump & restore of them. + + +-- NYI +-- test get_ao_compression_ratio. use uncompressed table, so result is always 1. +-- SELECT get_ao_compression_ratio('tenk_aocs2'); + +-- VACUUM +VACUUM tenk_aocs1; +VACUUM tenk_aocs2; +VACUUM tenk_aocs3; +VACUUM tenk_aocs4; +VACUUM FULL tenk_aocs1; +ANALYZE tenk_aocs2; +ANALYZE tenk_aocs4; +VACUUM ANALYZE tenk_aocs3; + +SELECT count(*) FROM tenk_aocs1; +SELECT count(*) FROM tenk_aocs2; +SELECT count(*) FROM tenk_aocs3; +SELECT count(*) FROM tenk_aocs4; + +-- LIKE +-- Should not copy storage options if not specified +CREATE TABLE tenk_like_nocopy_storage (LIKE tenk_aocs1); +SELECT count(*) FROM pg_class WHERE reloptions is not null AND relname = 'tenk_like_nocopy_storage'; +-- Check tables are truly decoupled +CREATE TABLE tenk_truly_decoupled (LIKE tenk_aocs4); +ALTER TABLE tenk_aocs4 DROP COLUMN two; +SELECT count(two) FROM tenk_truly_decoupled; + +-- DOMAIN +CREATE DOMAIN aocs_domain_constraint AS VARCHAR + DEFAULT 'Default value for varchar.' + CONSTRAINT constr1 + NOT NULL + CHECK (length(VALUE) > 16 AND length(VALUE) < 50); +CREATE TABLE aocs_with_domain_constraint (id integer, vc1 aocs_domain_constraint) + WITH (appendonly=true, orientation=column); +-- The following should succeed +INSERT INTO aocs_with_domain_constraint (id, vc1) VALUES (1, 'Long enough, but not too long.;'); +INSERT INTO aocs_with_domain_constraint (id, vc1) VALUES (2, 'This is purrfect.'); +-- The following should fail +INSERT INTO aocs_with_domain_constraint (id, vc1) VALUES (3, 'Not long enough.'); +INSERT INTO aocs_with_domain_constraint (id, vc1) VALUES (4, NULL); + +-- JOIN +SELECT count(*) FROM tenk_aocs1 t1, tenk_aocs2 t2 where t1.unique1 = t2.unique2; +SELECT count(*) FROM tenk_aocs1 t1, tenk_heap_for_aocs t2 where t1.unique1 = t2.unique2; +SELECT count(*) FROM tenk_aocs1 t1 INNER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2); +SELECT count(*) FROM tenk_aocs1 t1 LEFT OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2); +SELECT count(*) FROM tenk_aocs1 t1 RIGHT OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2); +SELECT count(*) FROM tenk_aocs1 t1 FULL OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2); +SELECT count(*) FROM tenk_aocs1 t1 INNER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2) where t1.unique1 = 8095; +SELECT count(*) FROM tenk_aocs1 t1 LEFT OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2) where t1.unique1 = 8095; +SELECT count(*) FROM tenk_aocs1 t1 RIGHT OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2) where t1.unique1 = 8095; +SELECT count(*) FROM tenk_aocs1 t1 FULL OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2) where t1.unique1 = 8095; + +CREATE TABLE empty_aocs_table_for_join (like tenk_heap_for_aocs) with (appendonly=true, orientation=column); +SELECT count(*) FROM tenk_aocs1 t1 INNER JOIN empty_aocs_table_for_join t2 ON (t1.unique1 = t2.unique2); +SELECT count(*) FROM tenk_aocs1 t1 LEFT OUTER JOIN empty_aocs_table_for_join t2 ON (t1.unique1 = t2.unique2); + +-- EXCEPT +SELECT unique1 FROM tenk_aocs1 EXCEPT SELECT unique1 FROM tenk_aocs1; +SELECT unique1 FROM tenk_heap_for_aocs EXCEPT SELECT unique1 FROM tenk_aocs3; + +-- TRUNCATE +TRUNCATE tenk_aocs2; +SELECT count(*) FROM tenk_aocs2; + +-- INDEX +CREATE INDEX tenk_aocs1_unique1 ON tenk_aocs1 USING btree(unique1 int4_ops); + +-- Verify that the visimap and block-directory indexes have unique and +-- primary key constraints on them +select indisunique, indisprimary from pg_index + where indexrelid = (select oid from pg_class where relname = 'pg_aovisimap_' || (select oid from pg_class where relname = 'tenk_aocs1') || '_index'); +select indisunique, indisprimary from pg_index + where indexrelid = (select oid from pg_class where relname = 'pg_aoblkdir_' || (select oid from pg_class where relname = 'tenk_aocs1') || '_index'); + +drop table if exists co; +create table co (i int, j int, k varchar) with(appendonly=true, orientation=column); +insert into co values (1,1,'a'), (2,2,'aa'), (3,3,'aaa'), (4,4,'aaaa'), + (5,5,'aaaaa'), (6,6,'aaaaaa'), (7,7,'aaaaaaa'), (8,8,'aaaaaaaa'); +analyze co; +create index co_j on co using btree(j); +create index co_k on co using btree(k); +create index co_jk on co using btree((j + length(k))); +set enable_seqscan=off; +select * from co where j = 2; +insert into co values (9,1,'b'), (10,2,'bb'), (11,3,'bbb'), (12,4,'bbbb'), + (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); +select * from co where j = 2; +insert into co values (9,2,'b'), (10,2,'bb'), (11,2,'bbb'), (12,2,'bbbb'), + (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); +select * from co where j = 2; + +create index co_ij on co (i, j) with (fillfactor=10); +alter index co_ij set (fillfactor=20); +reindex index co_ij; +select indexname from pg_indexes where tablename = 'co' order by indexname; +alter table co alter j type bigint; +alter table co rename j to j_renamed; +alter table co drop column j_renamed; +select tablename, attname, avg_width, n_distinct from pg_stats where tablename = 'co' order by attname, tablename; +create index co_i on co (i) where i = 9; +analyze co; +select tablename, attname, avg_width, n_distinct from pg_stats where tablename = 'co' order by attname, tablename; +select indexname from pg_indexes where tablename = 'co' order by indexname; +select * from co where i = 9; +alter index co_i rename to co_i_renamed; +select indexname from pg_indexes where tablename = 'co' order by indexname; +drop index if exists co_i_renamed; + +drop table if exists co; +create table co (i int, j int, k varchar) with(appendonly=true, orientation=column); +insert into co values (1,1,'a'), (2,2,'aa'), (3,3,'aaa'), (4,4,'aaaa'), + (5,5,'aaaaa'), (6,6,'aaaaaa'), (7,7,'aaaaaaa'), (8,8,'aaaaaaaa'); +create index co_j on co using bitmap(j); +create index co_k on co using bitmap(k); +create index co_jk on co using bitmap((j + length(k))); +set enable_seqscan=off; +select * from co where j = 2; +insert into co values (9,1,'b'), (10,2,'bb'), (11,3,'bbb'), (12,4,'bbbb'), + (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); +select * from co where j = 2; +insert into co values (9,2,'b'), (10,2,'bb'), (11,2,'bbb'), (12,2,'bbbb'), + (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); +select * from co where j = 2; +-- Select specific columns. This covers the case when block directory +-- entries for only specific columns need to be loaded during index +-- scan. +select i from co where j = 2; +select j,i from co where k = 'aaa' or k = 'bbb'; + +-- small test on a performance bug in bitmap indexes due to large tid gaps +insert into co select i, 0, 'aaaaaaa' from generate_series(1, 20) i; +insert into co select i, 1, 'aaa' from generate_series(1, 20) i; +insert into co select i, 2, 'a' from generate_series(1, 20) i; +select distinct j from co where j > -1 and j < 3 order by j; + +-- TEMP TABLES w/ INDEXES +create temp table temp_tenk_aocs5 with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + as select * from tenk_aocs5; +create index temp_even_index on temp_tenk_aocs5 (even); +select count(*) from temp_tenk_aocs5; +select i.tablename, i.indexname, pg_get_indexdef(c.oid, 0, TRUE) from pg_indexes i join pg_class c on i.indexname=c.relname and i.tablename='temp_tenk_aocs5'; +insert into temp_tenk_aocs5(unique1, unique2) values (99998888, 99998888); +update temp_tenk_aocs5 set unique2 = 99998889 where unique2 = 99998888; +delete from temp_tenk_aocs5 where unique2 = 99998889; +select count(*) from temp_tenk_aocs5; +vacuum analyze temp_tenk_aocs5; +truncate table temp_tenk_aocs5; +\d temp_tenk_aocs5 +insert into temp_tenk_aocs5(unique1, unique2) values (99998888, 99998888); +select unique1 from temp_tenk_aocs5; + +-- TEMP TABLES w/ COMMIT DROP AND USING PREPARE +begin; +prepare tenk_aocs5_prep(int4) as select * from tenk_aocs5 where unique1 > 8000; +create temp table tenk_aocs5_temp_drop with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + on commit drop as execute tenk_aocs5_prep(8095); +select count(*) from tenk_aocs5_temp_drop; +commit; +select count(*) from tenk_aocs5_temp_drop; + +-- TEMP TABLES w/ COMMIT DELETE ROWS +begin; +create temp table tenk_aocs5_temp_delete_rows with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + on commit delete rows as select * from tenk_aocs5 where unique1 > 8000; +select count(*) from tenk_aocs5_temp_delete_rows; +commit; +select count(*) from tenk_aocs5_temp_delete_rows; + +-- TEMP TABLES w/ COMMIT PRESERVE ROWS +begin; +create temp table tenk_aocs5_temp_pres_rows with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + on commit preserve rows as select * from tenk_aocs5 where unique1 > 8000; +select count(*) from tenk_aocs5_temp_pres_rows; +commit; +select count(*) from tenk_aocs5_temp_pres_rows; + +-- RULES +insert into tenk_aocs5(unique1, unique2) values (1, 99998889); +create rule ao_rule_update as on insert to tenk_aocs5 do instead update tenk_aocs5 set two=2; +insert into tenk_aocs5(unique1, unique2) values (2, 99998889); +select distinct two from tenk_aocs5; +create rule ao_rule_delete as on update to tenk_aocs5 do instead delete from tenk_aocs5 where unique1=1; +insert into tenk_aocs5(unique1, unique2) values (3, 99998889); -- should go through both rules +select * from tenk_aocs5 where unique1=1; + +--------------------- +-- UAO +--------------------- + +-- ------------------ +-- functions for snapshotting the current mod counts, and checking the diff +-- vs last snapshot +-- ------------------ +create temp table modcounts_aocs_snapshot (segment_id int, aosegno int, column_num int2, modcount bigint); + +create or replace function snapshot_aocs_modcounts(relname regclass) returns void as $$ +begin + delete from modcounts_aocs_snapshot; + + insert into modcounts_aocs_snapshot select segment_id, segno, column_num, modcount from gp_toolkit.__gp_aocsseg(relname); +end; +$$ language plpgsql volatile; + +create or replace function diff_aocs_modcounts(relname regclass, segment_id out int, aosegno out int, column_num out int2, modcount_diff out bigint) returns setof record as $$ + select a.segment_id, a.segno, a.column_num, a.modcount - coalesce(b.modcount, 0) mod_diff from gp_toolkit.__gp_aocsseg($1) a left outer join modcounts_aocs_snapshot b on a.segment_id = b.segment_id and a.segno = b.aosegno and a.column_num = b.column_num; +$$ language sql; + +select snapshot_aocs_modcounts('tenk_aocs1'); + +-- DELETE +select count(*) from diff_aocs_modcounts('tenk_aocs1') where modcount_diff > 0; --sanity check our test function +DELETE FROM tenk_aocs1 WHERE unique1 = 1; +-- modcount after DELETE must increment to flag table should be included in +-- incremental backup +select count(*) from diff_aocs_modcounts('tenk_aocs1') where modcount_diff > 0; +-- UPDATE +select snapshot_aocs_modcounts('tenk_aocs1'); +UPDATE tenk_aocs1 SET unique2 = 1 WHERE unique2 = 2; +UPDATE tenk_aocs1 SET two = 2; +-- modcount after UPDATE must increment to flag table should be included in +-- incremental backup +select count(*) from diff_aocs_modcounts('tenk_aocs1') where modcount_diff > 0; + +-------------------- +-- system columns +-------------------- +CREATE TABLE syscoltest(a int) WITH (appendonly=true, orientation=column); +INSERT INTO syscoltest VALUES(1); +SELECT ctid FROM syscoltest; +DROP TABLE syscoltest; + +-------------------- +-- supported sql +-------------------- +DROP TABLE tenk_heap_for_aocs; +DROP TABLE tenk_aocs1 CASCADE; +DROP TABLE tenk_aocs2; +DROP TABLE tenk_aocs3; +DROP TABLE tenk_aocs4; +DROP TABLE tenk_aocs5; + +set client_min_messages='WARNING'; + + +-- Test case for MPP-10086, make sure that we handle "else" clauses properly. + +DROP TABLE IF EXISTS aocs_new; + +CREATE TABLE aocs_new ( + a integer NOT NULL, + b character(3), + c character(4), + d character varying(250), + e character varying(100) NOT NULL, + f character(1) +) +WITH (appendonly=true, orientation=column); + +COPY aocs_new (a,b,c,d,e,f) FROM stdin; +27 13 1350 something to be replaced DOB M +84 69 6900 something to keep DOT M +\. + +select (case when b='13' then 'replacement' else d end) as d from aocs_new order by 1; +select distinct (case when b='13' then 'replacement' else d end) as d from aocs_new where f='M' order by 1; + +-- Check compression and distribution +create table aocs_compress_table (id int, v varchar) + with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); +create table aocs_compress_results(table_size int, aocs_compress_id_index_size int, aocs_compress_v_index_size int); +create index aocs_compress_id_index on aocs_compress_table (id); +create index aocs_compress_v_index on aocs_compress_table (v); +insert into aocs_compress_results values (pg_relation_size('aocs_compress_table'), pg_relation_size('aocs_compress_id_index'), pg_relation_size('aocs_compress_v_index')); + +insert into aocs_compress_table (id, v) values (1, 'ifyouwantto99knowwhatist8329histhenkeepreadingit;;untilyou]findoutyoureyeshurtandyoustil0ldontknow103kwhatitisdoyouunderstandmeyetandifyoustillwanttoknowthenyoupleasekeepreading'); +insert into aocs_compress_results values (pg_relation_size('aocs_compress_table'), pg_relation_size('aocs_compress_id_index'), pg_relation_size('aocs_compress_v_index')); + +select get_ao_compression_ratio('aocs_compress_table'); +-- start_ignore +select get_ao_distribution('aocs_compress_table'); +-- end_ignore +truncate table aocs_compress_table; -- after truncate, reclaim space from the table and index +insert into aocs_compress_results values (pg_relation_size('aocs_compress_table'), pg_relation_size('aocs_compress_id_index'), pg_relation_size('aocs_compress_v_index')); + +select count(*) from (select distinct * from aocs_compress_results) temp; -- should give 2 after reclaiming space + +-- Same transaction truncate multiple times. This performs unsafe truncate means +-- direct file truncate and not flipping the relfilenode. + +create table aocs_truncate_multiple_times(a int, b int) with (appendonly=true, orientation=column); +insert into aocs_truncate_multiple_times select i,i from generate_series(0, 9)i; +begin; +select * from aocs_truncate_multiple_times; +truncate table aocs_truncate_multiple_times; +select * from aocs_truncate_multiple_times; +insert into aocs_truncate_multiple_times select i from generate_series(10, 19)i; +select * from aocs_truncate_multiple_times; +truncate table aocs_truncate_multiple_times; +select * from aocs_truncate_multiple_times; +insert into aocs_truncate_multiple_times select i,i from generate_series(20, 29)i; +select * from aocs_truncate_multiple_times; +abort; +select * from aocs_truncate_multiple_times; + +-- test case for append optimized columnar bitmap scan when row level bitmap is promoted to page level + +drop table if exists bms_ao_bug; +create table bms_ao_bug +(c1 int not null, +c2 int not null, +c3 char(100) not null) +with (appendonly=true, orientation=column, compresstype=zlib) + +; + +insert into bms_ao_bug select 1, 1, a.c1::char(100) from generate_series(1, 2000000) a(c1); + +create index bms_ao_bug_ix1 on bms_ao_bug (c2); + +set enable_seqscan=off; +set work_mem=256; + +select +a.c1, +count(*) row_cnt +from bms_ao_bug a +where a.c2 = 1 +group by +a.c1 +; + +drop table bms_ao_bug; + + +-- When an index is created on an AOCO table, test that we correctly scan +-- all the columns that are needed to build the index. +create table aocs_index_cols (id int4, a text, b text) with (appendonly=true, orientation=column); +insert into aocs_index_cols values (1, 'foo', 'bar'); + +-- Create an index on the table. This is the first index on the table, so it +-- creates the ao block directory, and scans all columns. +create index on aocs_index_cols (id); + +-- Create a partial index. This index needs to scan two columns; one is used +-- as the index column, and the other in the WHERE clause. +create index on aocs_index_cols (id) WHERE a like 'f%'; + +-- Also try an expression index. +create index on aocs_index_cols (length(b)); + +-- Check that the row is found using all the indexes. +set enable_seqscan=off; +select * from aocs_index_cols where id = 1; +select * from aocs_index_cols where a like 'f%'; +select * from aocs_index_cols where length(b) = 3; +reset enable_seqscan; + + +-- Small content as well as bulk dense content headers need to be used +-- appropriately if compression is found to be not useful. This test +-- cover a bug where only small content headers were generated in such +-- a case. +create table aocs_small_and_dense_content (a int, b int) with +(appendonly =true, orientation=column, blocksize=409600, + compresstype=rle_type, compresslevel=4); + +insert into aocs_small_and_dense_content select i,i from +generate_series(1,800000)i; + +-- start_ignore +-- Inject fault on one primary segment that will cause compression to +-- be considered not useful. +select gp_inject_fault('appendonly_skip_compression', 'skip', '', '', +'aocs_small_and_dense_content', 1, -1, 0, dbid) +from gp_segment_configuration where role = 'p' and content = 0; +-- end_ignore + +insert into aocs_small_and_dense_content select i,i from +generate_series(1,800000)i; + +-- start_ignore +select gp_wait_until_triggered_fault('appendonly_skip_compression', 1, dbid) +from gp_segment_configuration where +role = 'p' and content = 0; +-- end_ignore + +-- This should not fail if small content or bulk dense content headers +-- are used correctly in spite of compression not possible. +select count(*) from aocs_small_and_dense_content; + +-- start_ignore +select gp_inject_fault('appendonly_skip_compression', 'reset', dbid) +from gp_segment_configuration where role = 'p' and content = 0; + +-- end_ignore + +-- test truncate ao table in current transaction and sub-transaction +-- more details can look at https://github.com/greenplum-db/gpdb/issues/13699 + +-- should success, create and truncate ao table in the same transaction; +begin; +create table fix_aoco_truncate_last_sequence(a int, b int) with (appendonly = true, orientation = column); +create index index_fix_aoco_truncate_last_sequence on fix_aoco_truncate_last_sequence(b); +insert into fix_aoco_truncate_last_sequence select i, i from generate_series(1, 5) i; +select count(*) from fix_aoco_truncate_last_sequence; +truncate table fix_aoco_truncate_last_sequence; +select count(*) from fix_aoco_truncate_last_sequence; +abort; + +-- should success, create and truncate ao table in the different transaction, +-- and create index for it. +begin; +create table fix_aoco_truncate_last_sequence(a int, b int) with (appendonly = true, orientation = column); +create index index_fix_aoco_truncate_last_sequence on fix_aoco_truncate_last_sequence(b); +insert into fix_aoco_truncate_last_sequence select i, i from generate_series(1, 5) i; +select count(*) from fix_aoco_truncate_last_sequence; +savepoint s1; +truncate table fix_aoco_truncate_last_sequence; +insert into fix_aoco_truncate_last_sequence select 1, 1 from generate_series(1, 10); +select count(*) from fix_aoco_truncate_last_sequence; +rollback to s1; +select count(*) from fix_aoco_truncate_last_sequence; +truncate table fix_aoco_truncate_last_sequence; +insert into fix_aoco_truncate_last_sequence select 1, 1 from generate_series(1, 5); +select count(*) from fix_aoco_truncate_last_sequence; +abort; diff --git a/src/test/singlenode_regress/input/constraints.source b/src/test/singlenode_regress/input/constraints.source new file mode 100644 index 00000000000..6bb76483218 --- /dev/null +++ b/src/test/singlenode_regress/input/constraints.source @@ -0,0 +1,554 @@ +-- +-- CONSTRAINTS +-- Constraints can be specified with: +-- - DEFAULT clause +-- - CHECK clauses +-- - PRIMARY KEY clauses +-- - UNIQUE clauses +-- - EXCLUDE clauses +-- + +-- +-- DEFAULT syntax +-- + +CREATE TABLE DEFAULT_TBL (i int DEFAULT 100, + x text DEFAULT 'vadim', f float8 DEFAULT 123.456); + +INSERT INTO DEFAULT_TBL VALUES (1, 'thomas', 57.0613); +INSERT INTO DEFAULT_TBL VALUES (1, 'bruce'); +INSERT INTO DEFAULT_TBL (i, f) VALUES (2, 987.654); +INSERT INTO DEFAULT_TBL (x) VALUES ('marc'); +INSERT INTO DEFAULT_TBL VALUES (3, null, 1.0); + +SELECT * FROM DEFAULT_TBL; + +CREATE SEQUENCE DEFAULT_SEQ; + +CREATE TABLE DEFAULTEXPR_TBL (i1 int DEFAULT 100 + (200-199) * 2, + i2 int DEFAULT nextval('default_seq')); + +INSERT INTO DEFAULTEXPR_TBL VALUES (-1, -2); +INSERT INTO DEFAULTEXPR_TBL (i1) VALUES (-3); +INSERT INTO DEFAULTEXPR_TBL (i2) VALUES (-4); +INSERT INTO DEFAULTEXPR_TBL (i2) VALUES (NULL); + +SELECT * FROM DEFAULTEXPR_TBL; + +-- syntax errors +-- test for extraneous comma +CREATE TABLE error_tbl (i int DEFAULT (100, )); +-- this will fail because gram.y uses b_expr not a_expr for defaults, +-- to avoid a shift/reduce conflict that arises from NOT NULL being +-- part of the column definition syntax: +CREATE TABLE error_tbl (b1 bool DEFAULT 1 IN (1, 2)); +-- this should work, however: +CREATE TABLE error_tbl (b1 bool DEFAULT (1 IN (1, 2))); + +DROP TABLE error_tbl; + +-- +-- CHECK syntax +-- + +CREATE TABLE CHECK_TBL (x int, + CONSTRAINT CHECK_CON CHECK (x > 3)); + +INSERT INTO CHECK_TBL VALUES (5); +INSERT INTO CHECK_TBL VALUES (4); +INSERT INTO CHECK_TBL VALUES (3); +INSERT INTO CHECK_TBL VALUES (2); +INSERT INTO CHECK_TBL VALUES (6); +INSERT INTO CHECK_TBL VALUES (1); + +SELECT * FROM CHECK_TBL; + +CREATE SEQUENCE CHECK_SEQ; + +CREATE TABLE CHECK2_TBL (x int, y text, z int, + CONSTRAINT SEQUENCE_CON + CHECK (x > 3 and y <> 'check failed' and z < 8)); + +INSERT INTO CHECK2_TBL VALUES (4, 'check ok', -2); +INSERT INTO CHECK2_TBL VALUES (1, 'x check failed', -2); +INSERT INTO CHECK2_TBL VALUES (5, 'z check failed', 10); +INSERT INTO CHECK2_TBL VALUES (0, 'check failed', -2); +INSERT INTO CHECK2_TBL VALUES (6, 'check failed', 11); +INSERT INTO CHECK2_TBL VALUES (7, 'check ok', 7); + +SELECT * from CHECK2_TBL; + +-- +-- Check constraints on INSERT +-- + +CREATE SEQUENCE INSERT_SEQ; + +CREATE TABLE INSERT_TBL (x INT DEFAULT nextval('insert_seq'), + y TEXT DEFAULT '-NULL-', + z INT DEFAULT -1 * currval('insert_seq'), + CONSTRAINT INSERT_TBL_CON CHECK (x >= 3 AND y <> 'check failed' AND x < 8), + CHECK (x + z = 0)); + +INSERT INTO INSERT_TBL(x,z) VALUES (2, -2); + +SELECT * FROM INSERT_TBL; + +SELECT 'one' AS one, nextval('insert_seq'); + +INSERT INTO INSERT_TBL(y) VALUES ('Y'); +INSERT INTO INSERT_TBL(y) VALUES ('Y'); +INSERT INTO INSERT_TBL(x,z) VALUES (1, -2); +INSERT INTO INSERT_TBL(z,x) VALUES (-7, 7); +INSERT INTO INSERT_TBL VALUES (5, 'check failed', -5); +INSERT INTO INSERT_TBL VALUES (7, '!check failed', -7); +INSERT INTO INSERT_TBL(y) VALUES ('-!NULL-'); + +SELECT * FROM INSERT_TBL; + +INSERT INTO INSERT_TBL(y,z) VALUES ('check failed', 4); +INSERT INTO INSERT_TBL(x,y) VALUES (5, 'check failed'); +INSERT INTO INSERT_TBL(x,y) VALUES (5, '!check failed'); +INSERT INTO INSERT_TBL(y) VALUES ('-!NULL-'); + +SELECT * FROM INSERT_TBL; + +SELECT 'seven' AS one, nextval('insert_seq'); + +INSERT INTO INSERT_TBL(y) VALUES ('Y'); + +SELECT 'eight' AS one, currval('insert_seq'); + +-- According to SQL, it is OK to insert a record that gives rise to NULL +-- constraint-condition results. Postgres used to reject this, but it +-- was wrong: +INSERT INTO INSERT_TBL VALUES (null, null, null); + +SELECT * FROM INSERT_TBL; + +-- +-- Check constraints on system columns +-- + +CREATE TABLE SYS_COL_CHECK_TBL (city text, state text, is_capital bool, + altitude int, + CHECK (NOT (is_capital AND tableoid::regclass::text = 'sys_col_check_tbl'))); + +INSERT INTO SYS_COL_CHECK_TBL VALUES ('Seattle', 'Washington', false, 100); +INSERT INTO SYS_COL_CHECK_TBL VALUES ('Olympia', 'Washington', true, 100); + +SELECT *, tableoid::regclass::text FROM SYS_COL_CHECK_TBL; + +DROP TABLE SYS_COL_CHECK_TBL; + +-- +-- Check constraints on system columns other then TableOid should return error +-- +CREATE TABLE SYS_COL_CHECK_TBL (city text, state text, is_capital bool, + altitude int, + CHECK (NOT (is_capital AND ctid::text = 'sys_col_check_tbl'))); + +-- +-- Check inheritance of defaults and constraints +-- + +CREATE TABLE INSERT_CHILD (cx INT default 42, + cy INT CHECK (cy > x)) + INHERITS (INSERT_TBL); + +INSERT INTO INSERT_CHILD(x,z,cy) VALUES (7,-7,11); +INSERT INTO INSERT_CHILD(x,z,cy) VALUES (7,-7,6); +INSERT INTO INSERT_CHILD(x,z,cy) VALUES (6,-7,7); +INSERT INTO INSERT_CHILD(x,y,z,cy) VALUES (6,'check failed',-6,7); + +SELECT * FROM INSERT_CHILD; + +DROP TABLE INSERT_CHILD; + +-- +-- Check NO INHERIT type of constraints and inheritance +-- + +CREATE TABLE ATACC1 (TEST INT + CHECK (TEST > 0) NO INHERIT); + +CREATE TABLE ATACC2 (TEST2 INT) INHERITS (ATACC1); +-- check constraint is not there on child +INSERT INTO ATACC2 (TEST) VALUES (-3); +-- check constraint is there on parent +INSERT INTO ATACC1 (TEST) VALUES (-3); +DROP TABLE ATACC1 CASCADE; + +CREATE TABLE ATACC1 (TEST INT, TEST2 INT + CHECK (TEST > 0), CHECK (TEST2 > 10) NO INHERIT); + +CREATE TABLE ATACC2 () INHERITS (ATACC1); +-- check constraint is there on child +INSERT INTO ATACC2 (TEST) VALUES (-3); +-- check constraint is there on parent +INSERT INTO ATACC1 (TEST) VALUES (-3); +-- check constraint is not there on child +INSERT INTO ATACC2 (TEST2) VALUES (3); +-- check constraint is there on parent +INSERT INTO ATACC1 (TEST2) VALUES (3); +DROP TABLE ATACC1 CASCADE; + +-- +-- Check constraints on INSERT INTO +-- + +DELETE FROM INSERT_TBL; + +ALTER SEQUENCE INSERT_SEQ RESTART WITH 4; + +CREATE TEMP TABLE tmp (xd INT, yd TEXT, zd INT); + +INSERT INTO tmp VALUES (null, 'Y', null); +INSERT INTO tmp VALUES (5, '!check failed', null); +INSERT INTO tmp VALUES (null, 'try again', null); +INSERT INTO INSERT_TBL(y) select yd from tmp; + +SELECT * FROM INSERT_TBL; + +INSERT INTO INSERT_TBL SELECT * FROM tmp WHERE yd = 'try again'; +INSERT INTO INSERT_TBL(y,z) SELECT yd, -7 FROM tmp WHERE yd = 'try again'; +INSERT INTO INSERT_TBL(y,z) SELECT yd, -8 FROM tmp WHERE yd = 'try again'; + +SELECT * FROM INSERT_TBL; + +DROP TABLE tmp; + +-- +-- Check constraints on UPDATE +-- + +UPDATE INSERT_TBL SET x = NULL WHERE x = 5; +UPDATE INSERT_TBL SET x = 6 WHERE x = 6; +UPDATE INSERT_TBL SET x = -z, z = -x; +UPDATE INSERT_TBL SET x = z, z = x; + +SELECT * FROM INSERT_TBL; + +-- DROP TABLE INSERT_TBL; + +-- +-- Check constraints on COPY FROM +-- + +CREATE TABLE COPY_TBL (x INT, y TEXT, z INT, + CONSTRAINT COPY_CON + CHECK (x > 3 AND y <> 'check failed' AND x < 7 )); + +COPY COPY_TBL FROM '@abs_srcdir@/data/constro.data'; + +SELECT * FROM COPY_TBL; + +COPY COPY_TBL FROM '@abs_srcdir@/data/constrf.data'; + +SELECT * FROM COPY_TBL; + +-- +-- Primary keys +-- + +CREATE TABLE PRIMARY_TBL (i int PRIMARY KEY, t text); + +INSERT INTO PRIMARY_TBL VALUES (1, 'one'); +INSERT INTO PRIMARY_TBL VALUES (2, 'two'); +INSERT INTO PRIMARY_TBL VALUES (1, 'three'); +INSERT INTO PRIMARY_TBL VALUES (4, 'three'); +INSERT INTO PRIMARY_TBL VALUES (5, 'one'); +INSERT INTO PRIMARY_TBL (t) VALUES ('six'); + +SELECT * FROM PRIMARY_TBL; + +DROP TABLE PRIMARY_TBL; + +CREATE TABLE PRIMARY_TBL (i int, t text, + PRIMARY KEY(i,t)); + +INSERT INTO PRIMARY_TBL VALUES (1, 'one'); +INSERT INTO PRIMARY_TBL VALUES (2, 'two'); +INSERT INTO PRIMARY_TBL VALUES (1, 'three'); +INSERT INTO PRIMARY_TBL VALUES (4, 'three'); +INSERT INTO PRIMARY_TBL VALUES (5, 'one'); +INSERT INTO PRIMARY_TBL (t) VALUES ('six'); + +SELECT * FROM PRIMARY_TBL; + +DROP TABLE PRIMARY_TBL; + +-- +-- Unique keys +-- + +CREATE TABLE UNIQUE_TBL (i int UNIQUE, t text); + +INSERT INTO UNIQUE_TBL VALUES (1, 'one'); +INSERT INTO UNIQUE_TBL VALUES (2, 'two'); +INSERT INTO UNIQUE_TBL VALUES (1, 'three'); +INSERT INTO UNIQUE_TBL VALUES (4, 'four'); +INSERT INTO UNIQUE_TBL VALUES (5, 'one'); +INSERT INTO UNIQUE_TBL (t) VALUES ('six'); +INSERT INTO UNIQUE_TBL (t) VALUES ('seven'); + +INSERT INTO UNIQUE_TBL VALUES (5, 'five-upsert-insert') ON CONFLICT (i) DO UPDATE SET t = 'five-upsert-update'; +INSERT INTO UNIQUE_TBL VALUES (6, 'six-upsert-insert') ON CONFLICT (i) DO UPDATE SET t = 'six-upsert-update'; +-- should fail +INSERT INTO UNIQUE_TBL VALUES (1, 'a'), (2, 'b'), (2, 'b') ON CONFLICT (i) DO UPDATE SET t = 'fails'; + +SELECT * FROM UNIQUE_TBL; + +DROP TABLE UNIQUE_TBL; + +CREATE TABLE UNIQUE_TBL (i int, t text, + UNIQUE(i,t)); + +INSERT INTO UNIQUE_TBL VALUES (1, 'one'); +INSERT INTO UNIQUE_TBL VALUES (2, 'two'); +INSERT INTO UNIQUE_TBL VALUES (1, 'three'); +INSERT INTO UNIQUE_TBL VALUES (1, 'one'); +INSERT INTO UNIQUE_TBL VALUES (5, 'one'); +INSERT INTO UNIQUE_TBL (t) VALUES ('six'); + +SELECT * FROM UNIQUE_TBL; + +DROP TABLE UNIQUE_TBL; + +-- +-- Deferrable unique constraints +-- + +CREATE TABLE unique_tbl (i int UNIQUE DEFERRABLE, t text); + +INSERT INTO unique_tbl VALUES (0, 'one'); +INSERT INTO unique_tbl VALUES (1, 'two'); +INSERT INTO unique_tbl VALUES (2, 'tree'); +INSERT INTO unique_tbl VALUES (3, 'four'); +INSERT INTO unique_tbl VALUES (4, 'five'); + +BEGIN; + +-- default is immediate so this should fail right away +UPDATE unique_tbl SET i = 1 WHERE i = 0; + +ROLLBACK; + +-- check is done at end of statement, so this should succeed +UPDATE unique_tbl SET i = i+1; + +SELECT * FROM unique_tbl; + +-- explicitly defer the constraint +BEGIN; + +SET CONSTRAINTS unique_tbl_i_key DEFERRED; + +INSERT INTO unique_tbl VALUES (3, 'three'); +DELETE FROM unique_tbl WHERE t = 'tree'; -- makes constraint valid again + +COMMIT; -- should succeed + +SELECT * FROM unique_tbl; + +-- try adding an initially deferred constraint +ALTER TABLE unique_tbl DROP CONSTRAINT unique_tbl_i_key; +ALTER TABLE unique_tbl ADD CONSTRAINT unique_tbl_i_key + UNIQUE (i) DEFERRABLE INITIALLY DEFERRED; + +BEGIN; + +INSERT INTO unique_tbl VALUES (1, 'five'); +INSERT INTO unique_tbl VALUES (5, 'one'); +UPDATE unique_tbl SET i = 4 WHERE i = 2; +UPDATE unique_tbl SET i = 2 WHERE i = 4 AND t = 'four'; +DELETE FROM unique_tbl WHERE i = 1 AND t = 'one'; +DELETE FROM unique_tbl WHERE i = 5 AND t = 'five'; + +COMMIT; + +SELECT * FROM unique_tbl; + +-- should fail at commit-time +BEGIN; +INSERT INTO unique_tbl VALUES (3, 'Three'); -- should succeed for now +COMMIT; -- should fail + +-- make constraint check immediate +BEGIN; + +SET CONSTRAINTS ALL IMMEDIATE; + +INSERT INTO unique_tbl VALUES (3, 'Three'); -- should fail + +COMMIT; + +-- forced check when SET CONSTRAINTS is called +BEGIN; + +SET CONSTRAINTS ALL DEFERRED; + +INSERT INTO unique_tbl VALUES (3, 'Three'); -- should succeed for now + +SET CONSTRAINTS ALL IMMEDIATE; -- should fail + +COMMIT; + +-- test deferrable UNIQUE with a partitioned table +CREATE TABLE parted_uniq_tbl (i int UNIQUE DEFERRABLE) partition by range (i); +CREATE TABLE parted_uniq_tbl_1 PARTITION OF parted_uniq_tbl FOR VALUES FROM (0) TO (10); +CREATE TABLE parted_uniq_tbl_2 PARTITION OF parted_uniq_tbl FOR VALUES FROM (20) TO (30); +SELECT conname, conrelid::regclass FROM pg_constraint + WHERE conname LIKE 'parted_uniq%' ORDER BY conname; +BEGIN; +INSERT INTO parted_uniq_tbl VALUES (1); +SAVEPOINT f; +INSERT INTO parted_uniq_tbl VALUES (1); -- unique violation +ROLLBACK TO f; +SET CONSTRAINTS parted_uniq_tbl_i_key DEFERRED; +INSERT INTO parted_uniq_tbl VALUES (1); -- OK now, fail at commit +COMMIT; +DROP TABLE parted_uniq_tbl; + +-- test a HOT update that invalidates the conflicting tuple. +-- the trigger should still fire and catch the violation + +BEGIN; + +INSERT INTO unique_tbl VALUES (3, 'Three'); -- should succeed for now +UPDATE unique_tbl SET t = 'THREE' WHERE i = 3 AND t = 'Three'; + +COMMIT; -- should fail + +SELECT * FROM unique_tbl; + +-- test a HOT update that modifies the newly inserted tuple, +-- but should succeed because we then remove the other conflicting tuple. + +BEGIN; + +INSERT INTO unique_tbl VALUES(3, 'tree'); -- should succeed for now +UPDATE unique_tbl SET t = 'threex' WHERE t = 'tree'; +DELETE FROM unique_tbl WHERE t = 'three'; + +SELECT * FROM unique_tbl; + +COMMIT; + +SELECT * FROM unique_tbl; + +DROP TABLE unique_tbl; + +-- +-- EXCLUDE constraints +-- + +CREATE TABLE circles ( + c1 CIRCLE, + c2 TEXT, + EXCLUDE USING gist + (c1 WITH &&, (c2::circle) WITH &&) + WHERE (circle_center(c1) <> '(0,0)') +); + +-- these should succeed because they don't match the index predicate +INSERT INTO circles VALUES('<(0,0), 5>', '<(0,0), 5>'); +INSERT INTO circles VALUES('<(0,0), 5>', '<(0,0), 4>'); + +-- succeed +INSERT INTO circles VALUES('<(10,10), 10>', '<(0,0), 5>'); +-- fail, overlaps +INSERT INTO circles VALUES('<(20,20), 10>', '<(0,0), 4>'); +-- succeed, because violation is ignored +INSERT INTO circles VALUES('<(20,20), 10>', '<(0,0), 4>') + ON CONFLICT ON CONSTRAINT circles_c1_c2_excl DO NOTHING; +-- fail, because DO UPDATE variant requires unique index +INSERT INTO circles VALUES('<(20,20), 10>', '<(0,0), 4>') + ON CONFLICT ON CONSTRAINT circles_c1_c2_excl DO UPDATE SET c2 = EXCLUDED.c2; +-- succeed because c1 doesn't overlap +INSERT INTO circles VALUES('<(20,20), 1>', '<(0,0), 5>'); +-- succeed because c2 doesn't overlap +INSERT INTO circles VALUES('<(20,20), 10>', '<(10,10), 5>'); + +-- should fail on existing data without the WHERE clause +ALTER TABLE circles ADD EXCLUDE USING gist + (c1 WITH &&, (c2::circle) WITH &&); + +-- try reindexing an existing constraint +REINDEX INDEX circles_c1_c2_excl; + +DROP TABLE circles; + +-- Check deferred exclusion constraint + +CREATE TABLE deferred_excl ( + f1 int, + f2 int, + CONSTRAINT deferred_excl_con EXCLUDE (f1 WITH =) INITIALLY DEFERRED +); + +INSERT INTO deferred_excl VALUES(1); +INSERT INTO deferred_excl VALUES(2); +INSERT INTO deferred_excl VALUES(1); -- fail +INSERT INTO deferred_excl VALUES(1) ON CONFLICT ON CONSTRAINT deferred_excl_con DO NOTHING; -- fail +BEGIN; +INSERT INTO deferred_excl VALUES(2); -- no fail here +COMMIT; -- should fail here +BEGIN; +INSERT INTO deferred_excl VALUES(3); +INSERT INTO deferred_excl VALUES(3); -- no fail here +COMMIT; -- should fail here + +-- bug #13148: deferred constraint versus HOT update +BEGIN; +INSERT INTO deferred_excl VALUES(2, 1); -- no fail here +DELETE FROM deferred_excl WHERE f1 = 2 AND f2 IS NULL; -- remove old row +UPDATE deferred_excl SET f2 = 2 WHERE f1 = 2; +COMMIT; -- should not fail + +SELECT * FROM deferred_excl; + +ALTER TABLE deferred_excl DROP CONSTRAINT deferred_excl_con; + +-- This should fail, but worth testing because of HOT updates +UPDATE deferred_excl SET f1 = 3; + +ALTER TABLE deferred_excl ADD EXCLUDE (f1 WITH =); + +DROP TABLE deferred_excl; + +-- Comments +-- Setup a low-level role to enforce non-superuser checks. +CREATE ROLE regress_constraint_comments; +SET SESSION AUTHORIZATION regress_constraint_comments; + +CREATE TABLE constraint_comments_tbl (a int CONSTRAINT the_constraint CHECK (a > 0)); +CREATE DOMAIN constraint_comments_dom AS int CONSTRAINT the_constraint CHECK (value > 0); + +COMMENT ON CONSTRAINT the_constraint ON constraint_comments_tbl IS 'yes, the comment'; +COMMENT ON CONSTRAINT the_constraint ON DOMAIN constraint_comments_dom IS 'yes, another comment'; + +-- no such constraint +COMMENT ON CONSTRAINT no_constraint ON constraint_comments_tbl IS 'yes, the comment'; +COMMENT ON CONSTRAINT no_constraint ON DOMAIN constraint_comments_dom IS 'yes, another comment'; + +-- no such table/domain +COMMENT ON CONSTRAINT the_constraint ON no_comments_tbl IS 'bad comment'; +COMMENT ON CONSTRAINT the_constraint ON DOMAIN no_comments_dom IS 'another bad comment'; + +COMMENT ON CONSTRAINT the_constraint ON constraint_comments_tbl IS NULL; +COMMENT ON CONSTRAINT the_constraint ON DOMAIN constraint_comments_dom IS NULL; + +-- unauthorized user +RESET SESSION AUTHORIZATION; +CREATE ROLE regress_constraint_comments_noaccess; +SET SESSION AUTHORIZATION regress_constraint_comments_noaccess; +COMMENT ON CONSTRAINT the_constraint ON constraint_comments_tbl IS 'no, the comment'; +COMMENT ON CONSTRAINT the_constraint ON DOMAIN constraint_comments_dom IS 'no, another comment'; +RESET SESSION AUTHORIZATION; + +DROP TABLE constraint_comments_tbl; +DROP DOMAIN constraint_comments_dom; + +DROP ROLE regress_constraint_comments; +DROP ROLE regress_constraint_comments_noaccess; diff --git a/src/test/singlenode_regress/input/copy.source b/src/test/singlenode_regress/input/copy.source new file mode 100644 index 00000000000..8acb5168015 --- /dev/null +++ b/src/test/singlenode_regress/input/copy.source @@ -0,0 +1,265 @@ +-- +-- COPY +-- + +-- CLASS POPULATION +-- (any resemblance to real life is purely coincidental) +-- +COPY aggtest FROM '@abs_srcdir@/data/agg.data'; + +COPY onek FROM '@abs_srcdir@/data/onek.data'; + +COPY onek TO '@abs_builddir@/results/onek.data'; + +DELETE FROM onek; + +COPY onek FROM '@abs_builddir@/results/onek.data'; + +COPY tenk1 FROM '@abs_srcdir@/data/tenk.data'; + +COPY slow_emp4000 FROM '@abs_srcdir@/data/rect.data'; + +COPY person FROM '@abs_srcdir@/data/person.data'; + +COPY emp FROM '@abs_srcdir@/data/emp.data'; + +COPY student FROM '@abs_srcdir@/data/student.data'; + +COPY stud_emp FROM '@abs_srcdir@/data/stud_emp.data'; + +COPY road FROM '@abs_srcdir@/data/streets.data'; + +COPY real_city FROM '@abs_srcdir@/data/real_city.data'; + +COPY hash_i4_heap FROM '@abs_srcdir@/data/hash.data'; + +COPY hash_name_heap FROM '@abs_srcdir@/data/hash.data'; + +COPY hash_txt_heap FROM '@abs_srcdir@/data/hash.data'; + +COPY hash_f8_heap FROM '@abs_srcdir@/data/hash.data'; + +COPY test_tsvector FROM '@abs_srcdir@/data/tsearch.data'; + +COPY testjsonb FROM '@abs_srcdir@/data/jsonb.data'; + +-- the data in this file has a lot of duplicates in the index key +-- fields, leading to long bucket chains and lots of table expansion. +-- this is therefore a stress test of the bucket overflow code (unlike +-- the data in hash.data, which has unique index keys). +-- +-- COPY hash_ovfl_heap FROM '@abs_srcdir@/data/hashovfl.data'; + +COPY bt_i4_heap FROM '@abs_srcdir@/data/desc.data'; + +COPY bt_name_heap FROM '@abs_srcdir@/data/hash.data'; + +COPY bt_txt_heap FROM '@abs_srcdir@/data/desc.data'; + +COPY bt_f8_heap FROM '@abs_srcdir@/data/hash.data'; + +COPY array_op_test FROM '@abs_srcdir@/data/array.data'; + +COPY array_index_op_test FROM '@abs_srcdir@/data/array.data'; + +-- analyze all the data we just loaded, to ensure plan consistency +-- in later tests + +ANALYZE aggtest; +ANALYZE onek; +ANALYZE tenk1; +ANALYZE slow_emp4000; +ANALYZE person; +ANALYZE emp; +ANALYZE student; +ANALYZE stud_emp; +ANALYZE road; +ANALYZE real_city; +ANALYZE hash_i4_heap; +ANALYZE hash_name_heap; +ANALYZE hash_txt_heap; +ANALYZE hash_f8_heap; +ANALYZE test_tsvector; +ANALYZE bt_i4_heap; +ANALYZE bt_name_heap; +ANALYZE bt_txt_heap; +ANALYZE bt_f8_heap; +ANALYZE array_op_test; +ANALYZE array_index_op_test; + +--- test copying in CSV mode with various styles +--- of embedded line ending characters + +create temp table copytest ( + style text, + test text, + filler int); + +insert into copytest values('DOS',E'abc\r\ndef',1); +insert into copytest values('Unix',E'abc\ndef',2); +insert into copytest values('Mac',E'abc\rdef',3); +insert into copytest values(E'esc\\ape',E'a\\r\\\r\\\n\\nb',4); + +copy copytest to '@abs_builddir@/results/copytest.csv' csv; + +create temp table copytest2 (like copytest); + +copy copytest2 from '@abs_builddir@/results/copytest.csv' csv; + +select * from copytest except select * from copytest2; + +truncate copytest2; + +--- same test but with an escape char different from quote char + +copy copytest to '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; + +copy copytest2 from '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; + +select * from copytest except select * from copytest2; + + +-- test header line feature + +create temp table copytest3 ( + c1 int, + "col with , comma" text, + "col with "" quote" int); + +copy copytest3 from stdin csv header; +this is just a line full of junk that would error out if parsed +1,a,1 +2,b,2 +\. + +copy copytest3 to stdout csv header; + +-- test copy from with a partitioned table +create table parted_copytest ( + a int, + b int, + c text +) partition by list (b); + +create table parted_copytest_a1 (c text, b int, a int); +create table parted_copytest_a2 (a int, c text, b int); + +alter table parted_copytest attach partition parted_copytest_a1 for values in(1); +alter table parted_copytest attach partition parted_copytest_a2 for values in(2); + +-- We must insert enough rows to trigger multi-inserts. These are only +-- enabled adaptively when there are few enough partition changes. +insert into parted_copytest select x,1,'One' from generate_series(1,1000) x; +insert into parted_copytest select x,2,'Two' from generate_series(1001,1010) x; +insert into parted_copytest select x,1,'One' from generate_series(1011,1020) x; + +copy (select * from parted_copytest order by a) to '@abs_builddir@/results/parted_copytest.csv'; + +truncate parted_copytest; + +copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv'; + +-- Ensure COPY FREEZE errors for partitioned tables. +begin; +truncate parted_copytest; +copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv' (freeze); +rollback; + +select tableoid::regclass,count(*),sum(a) from parted_copytest +group by tableoid order by tableoid::regclass::name; + +truncate parted_copytest; + +-- create before insert row trigger on parted_copytest_a2 +create function part_ins_func() returns trigger language plpgsql as $$ +begin + return new; +end; +$$; + +create trigger part_ins_trig + before insert on parted_copytest_a2 + for each row + execute procedure part_ins_func(); + +copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv'; + +select tableoid::regclass,count(*),sum(a) from parted_copytest +group by tableoid order by tableoid::regclass::name; + +truncate table parted_copytest; +create index on parted_copytest (b); +drop trigger part_ins_trig on parted_copytest_a2; + +copy parted_copytest from stdin; +1 1 str1 +2 2 str2 +\. + +-- Ensure index entries were properly added during the copy. +select * from parted_copytest where b = 1; +select * from parted_copytest where b = 2; + +drop table parted_copytest; + +-- +-- Progress reporting for COPY +-- +create table tab_progress_reporting ( + name text, + age int4, + location point, + salary int4, + manager name +); + +-- Add a trigger to catch and print the contents of the catalog view +-- pg_stat_progress_copy during data insertion. This allows to test +-- the validation of some progress reports for COPY FROM where the trigger +-- would fire. +create function notice_after_tab_progress_reporting() returns trigger AS +$$ +declare report record; +begin + -- The fields ignored here are the ones that may not remain + -- consistent across multiple runs. The sizes reported may differ + -- across platforms, so just check if these are strictly positive. + with progress_data as ( + select + relid::regclass::text as relname, + command, + type, + bytes_processed > 0 as has_bytes_processed, + bytes_total > 0 as has_bytes_total, + tuples_processed, + tuples_excluded + from pg_stat_progress_copy + where pid = pg_backend_pid()) + select into report (to_jsonb(r)) as value + from progress_data r; + + raise info 'progress: %', report.value::text; + return new; +end; +$$ language plpgsql; + +create trigger check_after_tab_progress_reporting + after insert on tab_progress_reporting + for each statement + execute function notice_after_tab_progress_reporting(); + +-- Generate COPY FROM report with PIPE. +copy tab_progress_reporting from stdin; +sharon 25 (15,12) 1000 sam +sam 30 (10,5) 2000 bill +bill 20 (11,10) 1000 sharon +\. + +-- Generate COPY FROM report with FILE, with some excluded tuples. +truncate tab_progress_reporting; +copy tab_progress_reporting from '@abs_srcdir@/data/emp.data' + where (salary < 2000); + +drop trigger check_after_tab_progress_reporting on tab_progress_reporting; +drop function notice_after_tab_progress_reporting(); +drop table tab_progress_reporting; diff --git a/src/test/singlenode_regress/input/create_function_0.source b/src/test/singlenode_regress/input/create_function_0.source new file mode 100644 index 00000000000..f47f635789a --- /dev/null +++ b/src/test/singlenode_regress/input/create_function_0.source @@ -0,0 +1,95 @@ +-- +-- CREATE_FUNCTION_0 +-- + +-- Create a bunch of C functions that will be used by later tests: + +CREATE FUNCTION check_primary_key () + RETURNS trigger + AS '@libdir@/refint@DLSUFFIX@' + LANGUAGE C; + +CREATE FUNCTION check_foreign_key () + RETURNS trigger + AS '@libdir@/refint@DLSUFFIX@' + LANGUAGE C; + +CREATE FUNCTION autoinc () + RETURNS trigger + AS '@libdir@/autoinc@DLSUFFIX@' + LANGUAGE C; + +CREATE FUNCTION trigger_return_old () + RETURNS trigger + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C; + +CREATE FUNCTION ttdummy () + RETURNS trigger + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C; + +CREATE FUNCTION set_ttdummy (int4) + RETURNS int4 + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; + +CREATE FUNCTION make_tuple_indirect (record) + RETURNS record + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; + +CREATE FUNCTION test_atomic_ops() + RETURNS bool + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C; + +CREATE FUNCTION test_fdw_handler() + RETURNS fdw_handler + AS '@libdir@/regress@DLSUFFIX@', 'test_fdw_handler' + LANGUAGE C; + +CREATE FUNCTION test_support_func(internal) + RETURNS internal + AS '@libdir@/regress@DLSUFFIX@', 'test_support_func' + LANGUAGE C STRICT; + +CREATE FUNCTION test_opclass_options_func(internal) + RETURNS void + AS '@libdir@/regress@DLSUFFIX@', 'test_opclass_options_func' + LANGUAGE C; + +CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) + AS '@libdir@/regress@DLSUFFIX@', 'test_enc_conversion' + LANGUAGE C STRICT; + +CREATE FUNCTION binary_coercible(oid, oid) + RETURNS bool + AS '@libdir@/regress@DLSUFFIX@', 'binary_coercible' + LANGUAGE C STRICT STABLE PARALLEL SAFE; + +-- Things that shouldn't work: + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT ''not an integer'';'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'not even SQL'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT 1, 2, 3;'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT $2;'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'a', 'b'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C + AS 'nosuchfile'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C + AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal + AS 'nosuch'; diff --git a/src/test/singlenode_regress/input/create_function_1.source b/src/test/singlenode_regress/input/create_function_1.source new file mode 100644 index 00000000000..79a41562bb0 --- /dev/null +++ b/src/test/singlenode_regress/input/create_function_1.source @@ -0,0 +1,25 @@ +-- +-- CREATE_FUNCTION_1 +-- + +-- Create C functions needed by create_type.sql + +CREATE FUNCTION widget_in(cstring) + RETURNS widget + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION widget_out(widget) + RETURNS cstring + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION int44in(cstring) + RETURNS city_budget + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION int44out(city_budget) + RETURNS cstring + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT IMMUTABLE; diff --git a/src/test/singlenode_regress/input/create_function_2.source b/src/test/singlenode_regress/input/create_function_2.source new file mode 100644 index 00000000000..9e6d2942ec7 --- /dev/null +++ b/src/test/singlenode_regress/input/create_function_2.source @@ -0,0 +1,88 @@ +-- +-- CREATE_FUNCTION_2 +-- +CREATE FUNCTION hobbies(person) + RETURNS setof hobbies_r + AS 'select * from hobbies_r where person = $1.name' + LANGUAGE SQL; + + +CREATE FUNCTION hobby_construct(text, text) + RETURNS hobbies_r + AS 'select $1 as name, $2 as hobby' + LANGUAGE SQL; + + +CREATE FUNCTION hobby_construct_named(name text, hobby text) + RETURNS hobbies_r + AS 'select name, hobby' + LANGUAGE SQL; + + +CREATE FUNCTION hobbies_by_name(hobbies_r.name%TYPE) + RETURNS hobbies_r.person%TYPE + AS 'select person from hobbies_r where name = $1' + LANGUAGE SQL; + + +CREATE FUNCTION equipment(hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = $1.name' + LANGUAGE SQL; + + +CREATE FUNCTION equipment_named(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = equipment_named.hobby.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_1a(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = equipment_named_ambiguous_1a.hobby.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_1b(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = hobby.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_1c(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = hobby.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_2a(hobby text) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = equipment_named_ambiguous_2a.hobby' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_2b(hobby text) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = hobby' + LANGUAGE SQL; + + +CREATE FUNCTION pt_in_widget(point, widget) + RETURNS bool + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; + +CREATE FUNCTION overpaid(emp) + RETURNS bool + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; + +CREATE FUNCTION interpt_pp(path, path) + RETURNS point + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; + +CREATE FUNCTION reverse_name(name) + RETURNS name + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; + +-- +-- Function dynamic loading +-- +LOAD '@libdir@/regress@DLSUFFIX@'; diff --git a/src/test/singlenode_regress/input/createdb.source b/src/test/singlenode_regress/input/createdb.source new file mode 100644 index 00000000000..8f43d67f6b7 --- /dev/null +++ b/src/test/singlenode_regress/input/createdb.source @@ -0,0 +1,52 @@ +-- start_ignore +create language plpython3u; +-- end_ignore + +--list all database oid relevant directories in all node(master, segments, mirrors, etc.) +CREATE OR REPLACE FUNCTION db_dirs(dboid oid) RETURNS setof text + STRICT STABLE LANGUAGE plpython3u +as $$ +import os +bash_cmd = "find " + os.getcwd() + "/../../ " + "-name %d -type d" +p = os.popen(bash_cmd % dboid) +return p.readlines() +$$; + + + +-- +--CASE 0: createdb do well +-- +create database dowell; +select force_mirrors_to_catch_up(); +select count(*)=0 as result from + (select db_dirs(oid) from pg_database where datname = 'dowell') as foo; + +\! psql -d dowell -c "create table test1(a int, b text)" +\! psql -d dowell -c "insert into test1 values (1, '111'), (2, '222'), (3, '333')" +\! psql -d dowell -c "select * from test1" + +drop database dowell; + +-- +--CASE 2: error after XLOG_DBASE_CREATE on master +-- +select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration; +select gp_inject_fault('after_xlog_create_database', 'error', dbid) +from gp_segment_configuration where content=-1 and role='p'; +-- should fail +create database db2; + +select force_mirrors_to_catch_up(); + +-- since this is a failed case, db oid is invisible, however we need it to search +-- our tablespace to check if has db files left over. +set gp_select_invisible=on; +select db_dirs(oid) from pg_database where datname = 'db2'; + +set gp_select_invisible=off; + +-- start_ignore +select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration; +select force_mirrors_to_catch_up(); +-- end_ignore diff --git a/src/test/singlenode_regress/input/gpcopy.source b/src/test/singlenode_regress/input/gpcopy.source new file mode 100644 index 00000000000..acd178ffad9 --- /dev/null +++ b/src/test/singlenode_regress/input/gpcopy.source @@ -0,0 +1,718 @@ +-- +-- This test suite tests COPY code that is unique to greenplum db. +-- + +-- ###################################################### +-- different distribution columns and distribution types +-- ###################################################### + +CREATE TABLE copy_regression_hash1(a text, b text, c text); +CREATE TABLE copy_regression_hash2(a text, b text, c text); +CREATE TABLE copy_regression_hash3(a varchar, b int, c int, d text); +CREATE TABLE copy_regression_hash4(a int[], b text); +CREATE TABLE copy_regression_hash5(a text[][]); +CREATE TABLE copy_regression_hash6(a int[], b text[]); +CREATE TABLE copy_regression_hash7(a text,b text); + +-- single key, not first + +COPY copy_regression_hash1 from stdin; +a data b data c data +\. +COPY copy_regression_hash1(b,c,a) from stdin; +b data c data a data +\. +SELECT * FROM copy_regression_hash1; + +-- two keys + +COPY copy_regression_hash2 from stdin; +a data b data c data +\. +COPY copy_regression_hash2(b,c,a) from stdin; +b data c data a data +\. +SELECT * FROM copy_regression_hash2; + +-- three keys + +COPY copy_regression_hash3 from stdin; +a data 2 3 d data +\. +COPY copy_regression_hash3(c,d,b,a) from stdin; +3 d data 2 a data +\. +COPY copy_regression_hash3(a,c) from stdin; +a data 3 +\. +COPY copy_regression_hash3(d) from stdin; +d data +\. +SELECT * FROM copy_regression_hash3; + +-- hash on int array + +COPY copy_regression_hash4 from stdin; +{1,2,3,4,5} hashed on an integer array +{10,20,30,40,50} hashed on an integer array +\. +SELECT * FROM copy_regression_hash4 ORDER BY a; + +-- hash on 2 dim varchar array + +COPY copy_regression_hash5 from stdin; +{{hashing,on},{two dimentional,text array}} +\. +SELECT * FROM copy_regression_hash5 ORDER BY a; + +-- hash on int array and varchar array + +COPY copy_regression_hash6 from stdin; +{1,2,3,4,5} {hashing,on,intarray,and,varchararray} +\. +SELECT * FROM copy_regression_hash6 ORDER BY a; + +-- hash randomly + +COPY copy_regression_hash7 from stdin; +a data b data +a data b data +\. +SELECT * FROM copy_regression_hash7; + +DROP TABLE copy_regression_hash1; +DROP TABLE copy_regression_hash2; +DROP TABLE copy_regression_hash3; +DROP TABLE copy_regression_hash4; +DROP TABLE copy_regression_hash5; +DROP TABLE copy_regression_hash6; +DROP TABLE copy_regression_hash7; + +-- ###################################################### +-- default values and default functions +-- ###################################################### + +CREATE TABLE copy_regression_default1(a text not null default 'a default data', b text not null default 'b default data') ; +CREATE TABLE copy_regression_default2(a text, b serial, c text) ; +CREATE TABLE copy_regression_default3(a serial, b text, c text) ; + +-- constant defaults on key and non key attributes + +COPY copy_regression_default1(a) from stdin; +a data +\. +COPY copy_regression_default1(b) from stdin; +b data +\. +SELECT * FROM copy_regression_default1; + +-- non constant default on non hash key in both text and csv + +COPY copy_regression_default2(a,c) from stdin; +a data c data +a data c data +a data c data +\. +COPY copy_regression_default2(a,c) from stdin csv; +a data,c data +a data,c data +a data,c data +\. +SELECT * FROM copy_regression_default2; + +-- non constant default on hash key in both text and csv + +COPY copy_regression_default3(b,c) from stdin; +b data c data +b data c data +b data c data +\. +COPY copy_regression_default3(b,c) from stdin csv; +b data,c data +b data,c data +b data,c data +\. +SELECT * FROM copy_regression_default2; + +DROP TABLE copy_regression_default1; +DROP TABLE copy_regression_default2; +DROP TABLE copy_regression_default3; + +-- ###################################################### +-- COPY OUT +-- ###################################################### + +CREATE TABLE copy_regression_out1(a text, b varchar, c int[], d bool) ; + +-- populating table with data for copy out tests. NOTE: since we can't control the order +-- of rows COPY OUT produces from the segdb, we must have only one row for each test table. + +COPY copy_regression_out1 from stdin null 'nullval'; +a copyout data line 2 nullval {2,2,2} true +\. + +-- copy out default parameters text format.. +COPY copy_regression_out1 to stdout; + +-- copy out '|' delimiter 'mynull' null.. +COPY copy_regression_out1 to stdout with delimiter '|' null 'mynull'; + +-- copy out '|' delimiter "i'm null" null.. +COPY copy_regression_out1 to stdout with delimiter '|' null 'i''m null'; + +-- copy out default parameters csv format.. +COPY copy_regression_out1 to stdout with csv; + +-- copy out default parameters csv format with header.. +COPY copy_regression_out1 to stdout with csv header; + +-- copy out partial and mixed column list (c,a,b).. +COPY copy_regression_out1(c,a,b) to stdout; + +-- copy out csv default quotes and escapes and special cases.. +COPY copy_regression_out1 to stdout with csv quote ''''; -- escape should be the same as quote +COPY copy_regression_out1 to stdout with csv escape ''''; +COPY copy_regression_out1 to stdout with csv quote '''' escape E'\\'; -- make sure E'' is accepted + +DROP TABLE copy_regression_out1; + + +-- ###################################################### +-- Zero column table +-- ###################################################### + +CREATE TABLE copy_regression_nocol(); + +-- copy in and out of zero column table.. +COPY copy_regression_nocol from stdin; +\. +COPY copy_regression_nocol from stdin; +we should get an "extra data" error here +\. +COPY copy_regression_nocol from stdin with csv; +\. +COPY copy_regression_nocol from stdin with csv; -- should fail +we should get an "extra data" error here +\. +COPY copy_regression_nocol to stdout; +COPY copy_regression_nocol to stdout with csv; + +DROP TABLE copy_regression_nocol; + + +-- ###################################################### +-- Various text format escape and default format tests +-- ###################################################### + +-- for text format +CREATE TABLE copy_regression_text1(a varchar ,b varchar, c text, d text, e text) ; +CREATE TABLE copy_regression_text2(a varchar ,b varchar, c text, d text, e text) ; +CREATE TABLE copy_regression_text3(a varchar ,b varchar, c text, d text, e text) ; + +-- column order tests + +COPY copy_regression_text1 from stdin; +a text data b text data c text data d text data e text data +\. +COPY copy_regression_text1(a,b,c,d,e) from stdin; +a text data b text data c text data d text data e text data +\. +COPY copy_regression_text1(e,d,c,b,a) from stdin; +e text data d text data c text data b text data a text data +\. +COPY copy_regression_text1(c,a,b,e,d) from stdin; +c text data a text data b text data e text data d text data +\. +COPY copy_regression_text1(a,c) from stdin; +a text data c text data +\. +SELECT * FROM copy_regression_text1; + +-- null print tests + +COPY copy_regression_text2 from stdin; +a text data \N c text data \N e text data +\. +COPY copy_regression_text2 from stdin with null 'nullvalue'; +a text data nullvalue c text data nullvalue nullvalue +\. +COPY copy_regression_text2 from stdin with delimiter '|' null ''; +a text data||c text data||e text data +|b text data|c text data||e text data +\. +COPY copy_regression_text2 from stdin with delimiter '|' null 'i''m null'; +a text data|b text data|i'm null|i'm null|e text data +\. +SELECT * FROM copy_regression_text2; + +-- escape tests + +COPY copy_regression_text3 from stdin with delimiter '|' escape '#'; +the at sign: #100 |1|c text data|d text data|e text data +an embedded delimiter #| character |2|c text data|d text data|e text data +a single backslash \ in col a|3|c text data|d text data|e text data +\. +COPY copy_regression_text3 from stdin with delimiter '|' escape 'off'; +a single backslash \ in col a|4|c text data|d text data|e text data +c:\\file\data\neew\path|5|c text data|d text data|e text data +\. +COPY copy_regression_text3 from stdin with delimiter '|'; +the at sign: \100|6|c text data|d text data|e text data +a single backslash \\ in col a|8|c text data|d text data|e text data +\. +COPY copy_regression_text3 from stdin with delimiter '|'; +an embedded linefeed \ +and another one\ + in column a|7|c text data|d text data|e text data +\. +COPY copy_regression_text3 from stdin with delimiter '|'; +an embedded linefeed sequence\nin column a|7|c text data|d text data|e text data +\. + +SELECT * FROM copy_regression_text3 ORDER BY b,a; + +DROP TABLE copy_regression_text1; +DROP TABLE copy_regression_text2; +DROP TABLE copy_regression_text3; + + + +-- ###################################################### +-- Various text format escape and default format tests +-- ###################################################### + +-- for csv format +CREATE TABLE copy_regression_csv1(a varchar ,b varchar, c text, d text, e text) ; +CREATE TABLE copy_regression_csv2(a varchar ,b varchar, c text, d text, e text) ; +CREATE TABLE copy_regression_csv3(a varchar ,b varchar, c text, d text, e text) ; + +-- column order tests + +COPY copy_regression_csv1 from stdin with csv; +a csv data,b csv data,c csv data,d csv data,e csv data +\. +COPY copy_regression_csv1(a,b,c,d,e) from stdin with csv; +a csv data,b csv data,c csv data,d csv data,e csv data +\. +COPY copy_regression_csv1(e,d,c,b,a) from stdin with csv; +e csv data,d csv data,c csv data,b csv data,a csv data +\. +COPY copy_regression_csv1(c,a,b,e,d) from stdin with csv; +c csv data,a csv data,b csv data,e csv data,d csv data +\. +COPY copy_regression_csv1(a,c) from stdin with csv; +a csv data,c csv data +\. +SELECT * FROM copy_regression_csv1; + +-- null print tests + +COPY copy_regression_csv2 from stdin with null E'\\N' csv ; +a csv data,\N,c csv data,\N,e csv data +\. +COPY copy_regression_csv2 from stdin with null 'nullvalue' csv; +a csv data,nullvalue,c csv data,nullvalue,nullvalue +\. +COPY copy_regression_csv2 from stdin with delimiter '|' null '' csv; +a csv data||c csv data||e csv data +|b csv data|c csv data||e csv data +\. +SELECT * FROM copy_regression_csv2; + +-- escape tests + +COPY copy_regression_csv3 from stdin with csv escape E'\\'; +"an embedded delimiter (comma), is printed",01,c csv data,d csv data,e csv data +"an embedded quote (doubleq)\" is printed",02,c csv data,d csv data,e csv data +"an embedded escape \\ is printed",03,c csv data,d csv data,e csv data +"an embedded line feed +is printed",04,c csv data,d csv data,e csv data +\. +COPY copy_regression_csv3 from stdin with delimiter E'\t' csv; --default quote and escape - " +"an embedded delimiter (tab) is printed" 05 c csv data d csv data e csv data +"an embedded quote or escape (doubleq)"" is printed" 06 c csv data d csv data e csv data +"an embedded line feed +is printed" 07 c csv data d csv data e csv data +\. +COPY copy_regression_csv3 from stdin with delimiter '|' csv quote ';' escape '*'; +;an embedded delimiter (pipe)| is printed;|08|c csv data|d csv data|e csv data +;an embedded quote (semicolon)*; is printed;|09|c csv data|d csv data|e csv data +;an embedded escape (asterisk)** is printed;|10|c csv data|d csv data|e csv data +;an embedded line feed +is printed;|11|c csv data|d csv data|e csv data +\. + +-- check defaults +COPY copy_regression_csv3 from stdin with csv quote ''''; -- escape should be the same as quote +'an embedded single quote '' here',12,c csv data,d csv data,e csv data +\. +COPY copy_regression_csv3 from stdin with csv escape ''''; +"an embedded single quote '' here",13,c csv data,d csv data,e csv data +\. +COPY copy_regression_csv3 from stdin with csv quote '''' escape E'\\'; -- make sure E'' is accepted +'an embedded backslash \\ here',14,c csv data,d csv data,e csv data +\. +SELECT * FROM copy_regression_csv3 ORDER BY b; + +DROP TABLE copy_regression_csv1; +DROP TABLE copy_regression_csv2; +DROP TABLE copy_regression_csv3; + +-- ###################################################### +-- FILL MISSING FIELDS +-- ###################################################### + +CREATE TABLE copy_regression_fill1(a int, b int, c text) ; +CREATE TABLE copy_regression_fill2(a int, b int, c text) ; + +-- text +COPY copy_regression_fill1 from stdin with delimiter '|' fill missing fields; +1|1|one +2|2 +3 +\. +COPY copy_regression_fill1(c,b) from stdin with delimiter '|' fill missing fields; +one|1 +two +three +\. +COPY copy_regression_fill2(a,c) from stdin with delimiter '|' fill missing fields; +1|one +2 +3|three +\. +SELECT * FROM copy_regression_fill1 ORDER BY a,b,c; +SELECT * FROM copy_regression_fill2 ORDER BY a,b,c; +TRUNCATE copy_regression_fill1; +TRUNCATE copy_regression_fill2; + +-- csv +COPY copy_regression_fill1 from stdin with csv delimiter '|' fill missing fields; +1|1|one +2|2 +3 +\. +COPY copy_regression_fill1(c,b) from stdin with csv delimiter '|' fill missing fields; +one|1 +two +three +\. +COPY copy_regression_fill2(a,c) from stdin with csv delimiter '|' fill missing fields; +1|one +2 +3|three +\. +SELECT * FROM copy_regression_fill1 ORDER BY a,b,c; +SELECT * FROM copy_regression_fill2 ORDER BY a,b,c; + +-- empty row should fail +COPY copy_regression_fill1 from stdin with delimiter '|' fill missing fields; + +\. +COPY copy_regression_fill2 from stdin with delimiter '|' fill missing fields; + +\. +COPY copy_regression_fill1 from stdin with csv delimiter '|' fill missing fields; + +\. +COPY copy_regression_fill2 from stdin with csv delimiter '|' fill missing fields; + +\. +DROP TABLE copy_regression_fill1; +DROP TABLE copy_regression_fill2; + +-- ###################################################### +-- FORCE NOT NULL +-- ###################################################### + +CREATE TABLE copy_regression_fnn(a text, b text, c text) ; + +COPY copy_regression_fnn from stdin with csv; +one,,one +two,, +\. +SELECT * FROM copy_regression_fnn WHERE b is null order by a; +SELECT * FROM copy_regression_fnn WHERE c is null order by a; +TRUNCATE copy_regression_fnn; + +COPY copy_regression_fnn from stdin with csv force not null b; +one,,one +two,, +\. +SELECT * FROM copy_regression_fnn WHERE b is null order by a; +SELECT * FROM copy_regression_fnn WHERE c is null order by a; +TRUNCATE copy_regression_fnn; + +COPY copy_regression_fnn from stdin with csv force not null b,c; +one,,one +two,, +\. +SELECT * FROM copy_regression_fnn WHERE b is null order by a; +SELECT * FROM copy_regression_fnn WHERE c is null order by a; +TRUNCATE copy_regression_fnn; + +-- now combine with fill missing fields +COPY copy_regression_fnn from stdin with csv fill missing fields force not null b; +one,,one +two, +\. +SELECT * FROM copy_regression_fnn WHERE b is null order by a; +SELECT * FROM copy_regression_fnn WHERE c is null order by a; + +DROP TABLE copy_regression_fnn; + +-- ########################################################### +-- distributed data error consolidation + original row numbers +-- ########################################################### + +CREATE TABLE copy_regression_error1(a int, b int) ; + +-- parse error on QE (extra column on line 6) + +COPY copy_regression_error1 from stdin; +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 6 +7 7 +\. + +-- parse error on QD (missing column on line 3) +COPY copy_regression_error1 from stdin; +1 1 +2 2 +3 +4 4 +\. + +-- convert error on QD (invalid type line 2) + +COPY copy_regression_error1 from stdin; +1 1 +two 2 +3 3 +\. + +-- convert error on QE (invalid type line 5) +COPY copy_regression_error1 from stdin; +1 1 +2 2 +3 3 +4 4 +5 five +6 6 +7 7 +\. + +DROP TABLE copy_regression_error1; + +-- ###################################################### +-- NEWLINE +-- ###################################################### + +CREATE TABLE copy_regression_newline(a text, b text) ; + +-- positive: text +COPY copy_regression_newline from stdin with delimiter '|' newline 'lf'; +1|1 +2|2 +\. + +-- positive: csv +COPY copy_regression_newline from stdin with delimiter '|' newline 'lf' csv; +1|1 +2|2 +\. + +-- negative: text +COPY copy_regression_newline from stdin with delimiter '|' newline 'cr'; +1|1 +2|2 +\. + +-- negative: csv +COPY copy_regression_newline from stdin with delimiter '|' newline 'cr' csv; +1|1 +2|2 +\. + +-- negative: invalid newline +COPY copy_regression_newline from stdin with delimiter '|' newline 'blah'; +-- negative: newline not yet supported for COPY TO +COPY copy_regression_newline to stdout with delimiter '|' newline 'blah'; + +DROP TABLE copy_regression_newline; + +-- Test that FORCE QUOTE option works with the fastpath for integers and +-- numerics +COPY ( + SELECT 123::integer as intcol, 456::numeric as numcol, 'foo' as textcol +) TO stdout CSV FORCE QUOTE intcol, numcol, textcol; + +-- Do the same with a real table, to test that the option also works when +-- doing a "dispatched" COPY, i.e. when the COPY output is produced in +-- segments +CREATE TABLE force_quotes_tbl(intcol integer, numcol numeric, textcol text); +INSERT INTO force_quotes_tbl VALUES (123, 456, 'foo'); + +COPY force_quotes_tbl TO stdout CSV FORCE QUOTE intcol, numcol, textcol; +DROP TABLE force_quotes_tbl; + +-- Tests for error log +DROP TABLE IF EXISTS errcopy, errcopy_err, errcopy_temp; + +CREATE TABLE errcopy(a int, b int, c text); +INSERT INTO errcopy select i, i, case when i <> 5 then i end || '_text' from generate_series(1, 10)i; +COPY errcopy to '/tmp/errcopy.csv' csv null ''; + +-- check if not null constraint not affect error log. +TRUNCATE errcopy; +ALTER table errcopy ALTER c SET NOT null; + +COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; + +SELECT * FROM errcopy; + +-- reject rows with invalid format for int +ALTER table errcopy ALTER c DROP NOT null; +ALTER table errcopy DROP COLUMN c; +ALTER table errcopy ADD COLUMN c int; + +COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; +SELECT * FROM errcopy; +SELECT relname, errmsg, rawdata FROM gp_read_error_log('errcopy'); + +-- reject one row with extra column, one row with fewer columns +TRUNCATE errcopy; +SELECT gp_truncate_error_log('errcopy'); + +COPY (select i::text || ',' || i::text || case when i = 4 then '' else ',' || i::text || case when i = 5 then ',5' else '' end end from generate_series(1, 10)i) to '/tmp/errcopy.csv'; +COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; + +SELECT * FROM errcopy ORDER BY a; +SELECT relname, errmsg, rawdata FROM gp_read_error_log('errcopy'); + +-- metacharacter +TRUNCATE errcopy; +COPY errcopy from stdin csv newline 'LF' log errors segment reject limit 3 rows; +1,2,0 +1,3,4^M +1,3,3 +\. + +SELECT * FROM errcopy; + +-- exceed reject limit +TRUNCATE errcopy; +SELECT gp_truncate_error_log('errcopy'); + +COPY errcopy from stdin delimiter E'\t' log errors segment reject limit 3 rows; +1 2 0 +1 3 4 +1 4 +1 2 +1 +1 3 0 +1 30 999 +\. +SELECT * FROM errcopy; +SELECT relname, filename, bytenum, errmsg FROM gp_read_error_log('errcopy'); + +-- abort and keep +TRUNCATE errcopy; +SELECT gp_truncate_error_log('errcopy'); + +COPY errcopy from stdin delimiter '/' log errors segment reject limit 3 rows; +1/2/3 +1/5 +7/8/9 +1/11/12/ +1 +1/17/18 +\. +SELECT relname, filename, bytenum, errmsg FROM gp_read_error_log('errcopy'); + +-- +-- Test error handling during COPY TO +-- +-- To trigger an error, we use an output function that throws an +-- error on a particular value. The trigger value is 1234. +-- +CREATE TYPE broken_int4; +CREATE FUNCTION broken_int4in(cstring) + RETURNS broken_int4 + AS 'int4in' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE FUNCTION broken_int4out(broken_int4) + RETURNS cstring + AS '@abs_builddir@/regress@DLSUFFIX@', 'broken_int4out' + LANGUAGE C IMMUTABLE STRICT; + +CREATE TYPE broken_int4 ( + internallength = 4, + input = broken_int4in, + output = broken_int4out, + alignment = int4, + passedbyvalue +); + +-- avoid hitting the error when analyzing the table. +set gp_autostats_mode = 'None'; + +-- Create a table, using the funny datatype, and load it with integers +-- 1-10000. The input function works normally, so this works, but if you +-- try to select the row with value 1234 from it, the output function will +-- throw an error. +CREATE TABLE broken_type_test (b broken_int4); +insert into broken_type_test select g::text::broken_int4 from generate_series(1, 10000) g; + +-- Should work, since we don't hit the trigger value 1234. (In principle, +-- that's not guaranteed; there's no ORDER BY, so the system could return +-- any 10 rows. In practice, this seems pretty safe.) +copy (select * from broken_type_test limit 10) to '/tmp/g'; + +-- Should fail, because we try to output everything, including 1234 +copy (select * from broken_type_test) to '/tmp/g'; +copy broken_type_test to '/tmp/g'; + +-- Don't leave behind a table that you can't dump. +drop table broken_type_test; +drop type broken_int4 cascade; -- drops the I/O functions, too. + +-- Test COPY FROM and TO work for catalog tables in dispatch +-- connection +BEGIN; +SET allow_system_table_mods=on; +COPY gp_configuration_history from stdin with delimiter '|'; +1900-01-01 00:00:00.000000-07|12345|Just testing COPY +\. + +COPY (select dbid from gp_configuration_history where dbid=12345) to stdin; +RESET allow_system_table_mods; + +-- cannot copy to a catalog table with allow_system_table_mods=off; +COPY gp_configuration_history from stdin with delimiter '|'; +ABORT; + +-- GPDB makes the database name, and many other things, available +-- as environment variables to the program. Test those. +-- +-- Perform these tests in a funnily named database, to test +-- escaping +set client_min_messages='warning'; +DROP DATABASE IF EXISTS "funny copy""db'with\\quotes"; +reset client_min_messages; +CREATE DATABASE "funny copy""db'with\\quotes"; + +\c "funny copy""db'with\\quotes" +-- echo will behave differently on different platforms, force to use bash with -E option +COPY (SELECT 'data1') TO PROGRAM 'cat > /tmp/gpcopyenvtest; /usr/bin/env bash -c ''echo -E database in COPY TO: $GP_DATABASE >> /tmp/gpcopyenvtest '' ' ESCAPE 'OFF'; + +CREATE TABLE foo (t text); +COPY foo FROM PROGRAM 'cat /tmp/gpcopyenvtest' ESCAPE 'OFF'; +COPY foo FROM PROGRAM '/usr/bin/env bash -c ''echo -E database in COPY FROM: $GP_DATABASE''' ESCAPE 'OFF'; + +select * from foo; diff --git a/src/test/singlenode_regress/input/largeobject.source b/src/test/singlenode_regress/input/largeobject.source new file mode 100644 index 00000000000..b1e7ae99096 --- /dev/null +++ b/src/test/singlenode_regress/input/largeobject.source @@ -0,0 +1,274 @@ +-- +-- Test large object support +-- + +-- ensure consistent test output regardless of the default bytea format +SET bytea_output TO escape; + +-- Load a file +CREATE TABLE lotest_stash_values (loid oid, fd integer); +-- lo_creat(mode integer) returns oid +-- The mode arg to lo_creat is unused, some vestigal holdover from ancient times +-- returns the large object id +INSERT INTO lotest_stash_values (loid) SELECT lo_creat(42); + +-- Test ALTER LARGE OBJECT +CREATE ROLE regress_lo_user; +DO $$ + BEGIN + EXECUTE 'ALTER LARGE OBJECT ' || (select loid from lotest_stash_values) + || ' OWNER TO regress_lo_user'; + END +$$; +SELECT + rol.rolname +FROM + lotest_stash_values s + JOIN pg_largeobject_metadata lo ON s.loid = lo.oid + JOIN pg_authid rol ON lo.lomowner = rol.oid; + +-- NOTE: large objects require transactions +BEGIN; + +-- lo_open(lobjId oid, mode integer) returns integer +-- The mode parameter to lo_open uses two constants: +-- INV_READ = 0x20000 +-- INV_WRITE = 0x40000 +-- The return value is a file descriptor-like value which remains valid for the +-- transaction. +UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); + +-- loread/lowrite names are wonky, different from other functions which are lo_* +-- lowrite(fd integer, data bytea) returns integer +-- the integer is the number of bytes written +SELECT lowrite(fd, ' +I wandered lonely as a cloud +That floats on high o''er vales and hills, +When all at once I saw a crowd, +A host, of golden daffodils; +Beside the lake, beneath the trees, +Fluttering and dancing in the breeze. + +Continuous as the stars that shine +And twinkle on the milky way, +They stretched in never-ending line +Along the margin of a bay: +Ten thousand saw I at a glance, +Tossing their heads in sprightly dance. + +The waves beside them danced; but they +Out-did the sparkling waves in glee: +A poet could not but be gay, +In such a jocund company: +I gazed--and gazed--but little thought +What wealth the show to me had brought: + +For oft, when on my couch I lie +In vacant or in pensive mood, +They flash upon that inward eye +Which is the bliss of solitude; +And then my heart with pleasure fills, +And dances with the daffodils. + + -- William Wordsworth +') FROM lotest_stash_values; + +-- lo_close(fd integer) returns integer +-- return value is 0 for success, or <0 for error (actually only -1, but...) +SELECT lo_close(fd) FROM lotest_stash_values; + +END; + +-- Copy to another large object. +-- Note: we intentionally don't remove the object created here; +-- it's left behind to help test pg_dump. + +SELECT lo_from_bytea(0, lo_get(loid)) AS newloid FROM lotest_stash_values +\gset + +-- Add a comment to it, as well, for pg_dump/pg_upgrade testing. +COMMENT ON LARGE OBJECT :newloid IS 'I Wandered Lonely as a Cloud'; + +-- Read out a portion +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); + +-- lo_lseek(fd integer, offset integer, whence integer) returns integer +-- offset is in bytes, whence is one of three values: +-- SEEK_SET (= 0) meaning relative to beginning +-- SEEK_CUR (= 1) meaning relative to current position +-- SEEK_END (= 2) meaning relative to end (offset better be negative) +-- returns current position in file +SELECT lo_lseek(fd, 104, 0) FROM lotest_stash_values; + +-- loread/lowrite names are wonky, different from other functions which are lo_* +-- loread(fd integer, len integer) returns bytea +SELECT loread(fd, 28) FROM lotest_stash_values; + +SELECT lo_lseek(fd, -19, 1) FROM lotest_stash_values; + +SELECT lowrite(fd, 'n') FROM lotest_stash_values; + +SELECT lo_tell(fd) FROM lotest_stash_values; + +SELECT lo_lseek(fd, -744, 2) FROM lotest_stash_values; + +SELECT loread(fd, 28) FROM lotest_stash_values; + +SELECT lo_close(fd) FROM lotest_stash_values; + +END; + +-- Test resource management +BEGIN; +SELECT lo_open(loid, x'40000'::int) from lotest_stash_values; +ABORT; + +DO $$ +DECLARE + loid oid; +BEGIN + SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; + PERFORM lo_export(loid, '@abs_builddir@/results/invalid/path'); +EXCEPTION + WHEN UNDEFINED_FILE THEN RAISE NOTICE 'could not open file, as expected'; +END; +$$; + +-- Test truncation. +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); + +SELECT lo_truncate(fd, 11) FROM lotest_stash_values; +SELECT loread(fd, 15) FROM lotest_stash_values; + +SELECT lo_truncate(fd, 10000) FROM lotest_stash_values; +SELECT loread(fd, 10) FROM lotest_stash_values; +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; +SELECT lo_tell(fd) FROM lotest_stash_values; + +SELECT lo_truncate(fd, 5000) FROM lotest_stash_values; +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; +SELECT lo_tell(fd) FROM lotest_stash_values; + +SELECT lo_close(fd) FROM lotest_stash_values; +END; + +-- Test 64-bit large object functions. +BEGIN; +UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); + +SELECT lo_lseek64(fd, 4294967296, 0) FROM lotest_stash_values; +SELECT lowrite(fd, 'offset:4GB') FROM lotest_stash_values; +SELECT lo_tell64(fd) FROM lotest_stash_values; + +SELECT lo_lseek64(fd, -10, 1) FROM lotest_stash_values; +SELECT lo_tell64(fd) FROM lotest_stash_values; +SELECT loread(fd, 10) FROM lotest_stash_values; + +SELECT lo_truncate64(fd, 5000000000) FROM lotest_stash_values; +SELECT lo_lseek64(fd, 0, 2) FROM lotest_stash_values; +SELECT lo_tell64(fd) FROM lotest_stash_values; + +SELECT lo_truncate64(fd, 3000000000) FROM lotest_stash_values; +SELECT lo_lseek64(fd, 0, 2) FROM lotest_stash_values; +SELECT lo_tell64(fd) FROM lotest_stash_values; + +SELECT lo_close(fd) FROM lotest_stash_values; +END; + +-- lo_unlink(lobjId oid) returns integer +-- return value appears to always be 1 +SELECT lo_unlink(loid) from lotest_stash_values; + +TRUNCATE lotest_stash_values; + +INSERT INTO lotest_stash_values (loid) SELECT lo_import('@abs_srcdir@/data/tenk.data'); + +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); + +-- verify length of large object +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; + +-- with the default BLCKSZ, LOBLKSIZE = 2048, so this positions us for a block +-- edge case +SELECT lo_lseek(fd, 2030, 0) FROM lotest_stash_values; + +-- this should get half of the value from page 0 and half from page 1 of the +-- large object +SELECT loread(fd, 36) FROM lotest_stash_values; + +SELECT lo_tell(fd) FROM lotest_stash_values; + +SELECT lo_lseek(fd, -26, 1) FROM lotest_stash_values; + +SELECT lowrite(fd, 'abcdefghijklmnop') FROM lotest_stash_values; + +SELECT lo_lseek(fd, 2030, 0) FROM lotest_stash_values; + +SELECT loread(fd, 36) FROM lotest_stash_values; + +SELECT lo_close(fd) FROM lotest_stash_values; +END; + +SELECT lo_export(loid, '@abs_builddir@/results/lotest.txt') FROM lotest_stash_values; + +\lo_import '@abs_builddir@/results/lotest.txt' + +\set newloid :LASTOID + +-- just make sure \lo_export does not barf +\lo_export :newloid '@abs_builddir@/results/lotest2.txt' + +-- This is a hack to test that export/import are reversible +-- This uses knowledge about the inner workings of large object mechanism +-- which should not be used outside it. This makes it a HACK +SELECT pageno, data FROM pg_largeobject WHERE loid = (SELECT loid from lotest_stash_values) +EXCEPT +SELECT pageno, data FROM pg_largeobject WHERE loid = :newloid; + +SELECT lo_unlink(loid) FROM lotest_stash_values; + +TRUNCATE lotest_stash_values; + +\lo_unlink :newloid + +\lo_import '@abs_builddir@/results/lotest.txt' + +\set newloid_1 :LASTOID + +SELECT lo_from_bytea(0, lo_get(:newloid_1)) AS newloid_2 +\gset + +SELECT md5(lo_get(:newloid_1)) = md5(lo_get(:newloid_2)); + +SELECT lo_get(:newloid_1, 0, 20); +SELECT lo_get(:newloid_1, 10, 20); +SELECT lo_put(:newloid_1, 5, decode('afafafaf', 'hex')); +SELECT lo_get(:newloid_1, 0, 20); + +SELECT lo_put(:newloid_1, 4294967310, 'foo'); +SELECT lo_get(:newloid_1); +SELECT lo_get(:newloid_1, 4294967294, 100); + +\lo_unlink :newloid_1 +\lo_unlink :newloid_2 + +-- This object is left in the database for pg_dump test purposes +SELECT lo_from_bytea(0, E'\\xdeadbeef') AS newloid +\gset + +SET bytea_output TO hex; +SELECT lo_get(:newloid); + +-- Create one more object that we leave behind for testing pg_dump/pg_upgrade; +-- this one intentionally has an OID in the system range +SELECT lo_create(2121); + +COMMENT ON LARGE OBJECT 2121 IS 'testing comments'; + +-- Clean up +DROP TABLE lotest_stash_values; + +DROP ROLE regress_lo_user; diff --git a/src/test/singlenode_regress/input/misc.source b/src/test/singlenode_regress/input/misc.source new file mode 100644 index 00000000000..b1dbc573c9b --- /dev/null +++ b/src/test/singlenode_regress/input/misc.source @@ -0,0 +1,262 @@ +-- +-- MISC +-- + +-- +-- BTREE +-- +UPDATE onek + SET unique1 = onek.unique1 + 1; + +UPDATE onek + SET unique1 = onek.unique1 - 1; + +-- +-- BTREE partial +-- +-- UPDATE onek2 +-- SET unique1 = onek2.unique1 + 1; + +--UPDATE onek2 +-- SET unique1 = onek2.unique1 - 1; + +-- +-- BTREE shutting out non-functional updates +-- +-- the following two tests seem to take a long time on some +-- systems. This non-func update stuff needs to be examined +-- more closely. - jolly (2/22/96) +-- +UPDATE tmp + SET stringu1 = reverse_name(onek.stringu1) + FROM onek + WHERE onek.stringu1 = 'JBAAAA' and + onek.stringu1 = tmp.stringu1; + +UPDATE tmp + SET stringu1 = reverse_name(onek2.stringu1) + FROM onek2 + WHERE onek2.stringu1 = 'JCAAAA' and + onek2.stringu1 = tmp.stringu1; + +DROP TABLE tmp; + +--UPDATE person* +-- SET age = age + 1; + +--UPDATE person* +-- SET age = age + 3 +-- WHERE name = 'linda'; + +-- +-- copy +-- +COPY onek TO '@abs_builddir@/results/onek.data'; + +DELETE FROM onek; + +COPY onek FROM '@abs_builddir@/results/onek.data'; + +SELECT unique1 FROM onek WHERE unique1 < 2 ORDER BY unique1; + +DELETE FROM onek2; + +COPY onek2 FROM '@abs_builddir@/results/onek.data'; + +SELECT unique1 FROM onek2 WHERE unique1 < 2 ORDER BY unique1; + +COPY BINARY stud_emp TO '@abs_builddir@/results/stud_emp.data'; + +DELETE FROM stud_emp; + +COPY BINARY stud_emp FROM '@abs_builddir@/results/stud_emp.data'; + +SELECT * FROM stud_emp; + +-- COPY aggtest FROM stdin; +-- 56 7.8 +-- 100 99.097 +-- 0 0.09561 +-- 42 324.78 +-- . +-- COPY aggtest TO stdout; + + +-- +-- inheritance stress test +-- +SELECT * FROM a_star*; + +SELECT * + FROM b_star* x + WHERE x.b = text 'bumble' or x.a < 3; + +SELECT class, a + FROM c_star* x + WHERE x.c ~ text 'hi'; + +SELECT class, b, c + FROM d_star* x + WHERE x.a < 100; + +SELECT class, c FROM e_star* x WHERE x.c NOTNULL; + +SELECT * FROM f_star* x WHERE x.c ISNULL; + +-- grouping and aggregation on inherited sets have been busted in the past... + +SELECT sum(a) FROM a_star*; + +SELECT class, sum(a) FROM a_star* GROUP BY class ORDER BY class; + + +ALTER TABLE f_star RENAME COLUMN f TO ff; + +ALTER TABLE e_star* RENAME COLUMN e TO ee; + +ALTER TABLE d_star* RENAME COLUMN d TO dd; + +ALTER TABLE c_star* RENAME COLUMN c TO cc; + +ALTER TABLE b_star* RENAME COLUMN b TO bb; + +ALTER TABLE a_star* RENAME COLUMN a TO aa; + +SELECT class, aa + FROM a_star* x + WHERE aa ISNULL; + +-- As of Postgres 7.1, ALTER implicitly recurses, +-- so this should be same as ALTER a_star* + +ALTER TABLE a_star RENAME COLUMN aa TO foo; + +SELECT class, foo + FROM a_star* x + WHERE x.foo >= 2; + +ALTER TABLE a_star RENAME COLUMN foo TO aa; + +SELECT * + from a_star* + WHERE aa < 1000; + +ALTER TABLE f_star ADD COLUMN f int4; + +UPDATE f_star SET f = 10; + +ALTER TABLE e_star* ADD COLUMN e int4; + +--UPDATE e_star* SET e = 42; + +SELECT * FROM e_star*; + +ALTER TABLE a_star* ADD COLUMN a text; + +-- That ALTER TABLE should have added TOAST tables. +SELECT relname, reltoastrelid <> 0 AS has_toast_table + FROM pg_class + WHERE oid::regclass IN ('a_star', 'c_star') + ORDER BY 1; + +--UPDATE b_star* +-- SET a = text 'gazpacho' +-- WHERE aa > 4; + +SELECT class, aa, a FROM a_star*; + + +-- +-- versions +-- + +-- +-- postquel functions +-- +-- +-- mike does post_hacking, +-- joe and sally play basketball, and +-- everyone else does nothing. +-- +SELECT p.name, name(p.hobbies) FROM ONLY person p; + +-- +-- as above, but jeff also does post_hacking. +-- +SELECT p.name, name(p.hobbies) FROM person* p; + +-- +-- the next two queries demonstrate how functions generate bogus duplicates. +-- this is a "feature" .. +-- +SELECT DISTINCT hobbies_r.name, name(hobbies_r.equipment) FROM hobbies_r + ORDER BY 1,2; + +SELECT hobbies_r.name, (hobbies_r.equipment).name FROM hobbies_r; + +-- +-- mike needs advil and peet's coffee, +-- joe and sally need hightops, and +-- everyone else is fine. +-- +SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM ONLY person p; + +-- +-- as above, but jeff needs advil and peet's coffee as well. +-- +SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM person* p; + +-- +-- just like the last two, but make sure that the target list fixup and +-- unflattening is being done correctly. +-- +SELECT name(equipment(p.hobbies)), p.name, name(p.hobbies) FROM ONLY person p; + +SELECT (p.hobbies).equipment.name, p.name, name(p.hobbies) FROM person* p; + +SELECT (p.hobbies).equipment.name, name(p.hobbies), p.name FROM ONLY person p; + +SELECT name(equipment(p.hobbies)), name(p.hobbies), p.name FROM person* p; + +SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer'))); + +SELECT name(equipment(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named_ambiguous_1a(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named_ambiguous_1b(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named_ambiguous_1c(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named_ambiguous_2a(text 'skywalking')); + +SELECT name(equipment_named_ambiguous_2b(text 'skywalking')); + +SELECT hobbies_by_name('basketball'); + +SELECT name, overpaid(emp.*) FROM emp; + +-- +-- Try a few cases with SQL-spec row constructor expressions +-- +SELECT * FROM equipment(ROW('skywalking', 'mer')); + +SELECT name(equipment(ROW('skywalking', 'mer'))); + +SELECT *, name(equipment(h.*)) FROM hobbies_r h; + +SELECT *, (equipment(CAST((h.*) AS hobbies_r))).name FROM hobbies_r h; + +-- +-- functional joins +-- + +-- +-- instance rules +-- + +-- +-- rewrite rules +-- diff --git a/src/test/singlenode_regress/input/partition_ddl.source b/src/test/singlenode_regress/input/partition_ddl.source new file mode 100644 index 00000000000..6aa3506a9b9 --- /dev/null +++ b/src/test/singlenode_regress/input/partition_ddl.source @@ -0,0 +1,972 @@ +set client_min_messages = WARNING; +set timezone to '+07:00'; +DROP SCHEMA IF EXISTS partition_ddl2 CASCADE; +CREATE SCHEMA partition_ddl2; +set search_path to partition_ddl2; + +CREATE TABLE rank ( + id int, + rank int, + year smallint, + gender char(1), + count int ); + + +create table rank2 (LIKE rank) +PARTITION BY LIST (gender) +SUBPARTITION BY RANGE (year) +SUBPARTITION TEMPLATE (start ('2000') end ('2006') every (interval '1')) +(PARTITION girls VALUES ('F'), PARTITION boys VALUES ('M')); + +drop table rank; + +create table ggg (a char(1), b char(2), d char(3)) + +partition by LIST (b) +( partition aa values ('a', 'b', 'c', 'd'), +partition bb values ('e', 'f', NULL) ); + +insert into ggg values ('a','e','111'); +insert into ggg values ('b',NULL,'111'); + +-- order 1,2 +select * from ggg order by 1,2; + +-- order 1,2 +select * from ggg_1_prt_bb order by 1,2; + +drop table ggg; +-- QA-877 +-- Johnny Soedomo +-- Updated test case to use default tablespace. We now support partition and tablespace +create table ggg (a char(1), b char(2), d char(3)) + +partition by LIST (b) +( partition aa values ('a', 'b', 'c', 'd') tablespace pg_default); +drop table ggg; +create table mpp3137_region +( + R_REGIONKEY INTEGER, + R_NAME CHAR(25), + R_COMMENT VARCHAR(152), + primary key (r_regionkey, r_name, r_comment) + ) +partition by list (r_regionkey) +subpartition by list (r_name) +subpartition by list (r_comment) subpartition template ( + values('ges. thinly even pinto beans ca'), + values('uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl','lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to','hs use ironic, even requests. s'), + values('ly final courts cajole furiously final excuse'), + values(null) +) +( +partition p1 values('4','1','3','0','2')(subpartition sp1 values('MIDDLE EAST','AMERICA'),subpartition sp2 values('AFRICA','EUROPE','ASIA')) +); + +select * from pg_partition_tree('mpp3137_region'); + +COPY mpp3137_region from STDIN delimiter '|'; +0|AFRICA|lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to +1|AMERICA|hs use ironic, even requests. s +2|ASIA|ges. thinly even pinto beans ca +3|EUROPE|ly final courts cajole furiously final excuse +4|MIDDLE EAST|uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +\. + +select count(*) from mpp3137_region; +select * from mpp3137_region order by r_regionkey; + +drop table mpp3137_region; +drop table if exists mpp3285_lineitem; +CREATE TABLE mpp3285_LINEITEM ( + L_ORDERKEY INT8, + L_PARTKEY INTEGER, + L_SUPPKEY INTEGER, + L_LINENUMBER integer, + L_QUANTITY decimal, + L_EXTENDEDPRICE decimal, + L_DISCOUNT decimal, + L_TAX decimal, + L_RETURNFLAG CHAR(1), + L_LINESTATUS CHAR(1), + L_SHIPDATE date, + L_COMMITDATE date, + L_RECEIPTDATE date, + L_SHIPINSTRUCT CHAR(25), + L_SHIPMODE CHAR(10), + L_COMMENT VARCHAR(44) + ) +partition by range (l_commitdate) +( +partition p1 start('1992-01-31') end('1998-11-01') every(interval '20 months') +); +insert into mpp3285_lineitem values (18182,5794,3295,4,9,15298.11,0.04,0.01,'N','O','1995-07-04'::date,'1995-05-30'::date,'1995-08-03'::date,'DELIVER IN PERSON','RAIL','y special platelets.'); +select * from mpp3285_lineitem; +drop table mpp3285_lineitem; +CREATE TABLE mpp3282_PARTSUPP ( +PS_PARTKEY INTEGER, +PS_SUPPKEY INTEGER, +PS_AVAILQTY integer, +PS_SUPPLYCOST decimal, +PS_COMMENT VARCHAR(199) +) +partition by range (ps_suppkey) +subpartition by range (ps_partkey) +subpartition by range (ps_supplycost) subpartition template (start('1') end('1001') every(500)) +( +partition p1 start('1') end('10001') every(5000) +(subpartition sp1 start('1') end('200001') every(66666) +) +); +copy mpp3282_partsupp from stdin delimiter '|'; +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 +\. +select * from mpp3282_partsupp; +CREATE TABLE mpp3238_supplier( + S_SUPPKEY INTEGER, + S_NAME CHAR(25), + S_ADDRESS VARCHAR(40), + S_NATIONKEY INTEGER, + S_PHONE CHAR(15), + S_ACCTBAL decimal, + S_COMMENT VARCHAR(101) + ) +partition by range (s_nationkey) +( +partition p1 start(0) , +partition p2 start(12) end(13), +partition p3 end(20) inclusive, +partition p4 start(21), +partition p5 start(22) end(25) +); +insert into mpp3238_supplier values(1,'Supplier#000000001',' N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ',17,'27-918-335-1736',5755.94,'each slyly above the careful'); +select * from mpp3238_supplier; +CREATE TABLE mpp3219_CUSTOMER ( +C_CUSTKEY INTEGER, +C_NAME VARCHAR(25), +C_ADDRESS VARCHAR(40), +C_NATIONKEY INTEGER, +C_PHONE CHAR(15), +C_ACCTBAL decimal, +C_MKTSEGMENT CHAR(10), +C_COMMENT VARCHAR(117) +) +partition by range (c_acctbal) +( +partition sp1 start('-999.99') end('9833.01'), +partition sp2 end('9905.01'), +partition sp3 end('9978.01')); +drop table mpp3219_customer; +drop table mpp3190_partsupp; +-- This should fail +CREATE TABLE mpp3190_PARTSUPP ( +PS_PARTKEY INTEGER, +PS_SUPPKEY INTEGER, + PS_AVAILQTY integer, +PS_SUPPLYCOST decimal, +PS_COMMENT VARCHAR(199) ) +partition by range (ps_supplycost) + subpartition by range (ps_suppkey) subpartition template (start(1) end(10000) every(2499)) +(partition p1, partition p2, partition p3 ); +drop table if exists mpp3304_customer; +create table mpp3304_CUSTOMER ( + C_CUSTKEY INTEGER, + C_NAME VARCHAR(25), + C_ADDRESS VARCHAR(40), + C_NATIONKEY INTEGER, + C_PHONE CHAR(15), + C_ACCTBAL decimal, + C_MKTSEGMENT CHAR(10), + C_COMMENT VARCHAR(117) + ) +partition by range (c_custkey) +subpartition by range (c_acctbal) +subpartition template (start('-999.99') end('10000.99') every(11000) +) +subpartition by range (c_nationkey) +subpartition template (start('0') end('25') every(5)) +( +partition p1 start('1') end('150001') every(50000) +); +Alter table mpp3304_customer alter partition for (6) rename partition for ('-999.99') to newname; +select * from pg_partition_tree('mpp3304_customer'); +create table mpp3045_hhh (a char(1), b date, d char(3)) with (appendonly=true) +partition by range (b) + (partition aa start (date '2007-01-01') end (date '2008-01-01'), + partition bb start (date '2008-01-01') end (date '2009-01-01')); +alter table mpp3045_hhh add partition aa; -- missing range +alter table mpp3045_hhh add partition aa start(date '2012-01-01') end (date '2013-01-01'); -- duplicate partition name + +drop table if exists mpp3287_nation; +CREATE TABLE mpp3287_NATION ( + N_NATIONKEY INTEGER, + N_NAME CHAR(25), + N_REGIONKEY INTEGER, + N_COMMENT VARCHAR(152) + ) +partition by range (n_nationkey) +( +partition p1 start('0') WITH (appendonly=true,checksum=true,blocksize=1998848,compresslevel=4), +partition p2 start('11') end('15') inclusive WITH (checksum=false,appendonly=true,blocksize=655360,compresslevel=4), +partition p3 start('16') end('19'), partition p4 start('19') WITH (compresslevel=8,appendonly=true,checksum=false,blocksize=884736), +partition p5 start('20') +); +delete from mpp3287_nation; + +INSERT INTO mpp3287_nation VALUES (1, 'ARGENTINA ', 1, 'al foxes promise slyly according to the regular accounts. bold requests alon'); +INSERT INTO mpp3287_nation VALUES (3, 'CANADA ', 1, 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold'); +INSERT INTO mpp3287_nation VALUES (5, 'ETHIOPIA ', 0, 'ven packages wake quickly. regu'); +INSERT INTO mpp3287_nation VALUES (7, 'GERMANY ', 3, 'l platelets. regular accounts x-ray: unusual, regular acco'); +INSERT INTO mpp3287_nation VALUES (9, 'INDONESIA ', 2, ' slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull'); +INSERT INTO mpp3287_nation VALUES (11, 'IRAQ ', 4, 'nic deposits boost atop the quickly final requests? quickly regula'); +INSERT INTO mpp3287_nation VALUES (13, 'JORDAN ', 4, 'ic deposits are blithely about the carefully regular pa'); +INSERT INTO mpp3287_nation VALUES (15, 'MOROCCO ', 0, 'rns. blithely bold courts among the closely regular packages use furiously bold platelets?'); +INSERT INTO mpp3287_nation VALUES (17, 'PERU ', 1, 'platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun'); +INSERT INTO mpp3287_nation VALUES (19, 'ROMANIA ', 3, 'ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account'); +INSERT INTO mpp3287_nation VALUES (21, 'VIETNAM ', 2, 'hely enticingly express accounts. even, final '); +INSERT INTO mpp3287_nation VALUES (23, 'UNITED KINGDOM ', 3, 'eans boost carefully special requests. accounts are. carefull'); +INSERT INTO mpp3287_nation VALUES (0, 'ALGERIA ', 0, ' haggle. carefully final deposits detect slyly agai'); +INSERT INTO mpp3287_nation VALUES (2, 'BRAZIL ', 1, 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special '); +INSERT INTO mpp3287_nation VALUES (4, 'EGYPT ', 4, 'y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d'); +INSERT INTO mpp3287_nation VALUES (6, 'FRANCE ', 3, 'refully final requests. regular, ironi'); +INSERT INTO mpp3287_nation VALUES (8, 'INDIA ', 2, 'ss excuses cajole slyly across the packages. deposits print aroun'); +INSERT INTO mpp3287_nation VALUES (10, 'IRAN ', 4, 'efully alongside of the slyly final dependencies. '); +INSERT INTO mpp3287_nation VALUES (12, 'JAPAN ', 2, 'ously. final, express gifts cajole a'); +INSERT INTO mpp3287_nation VALUES (14, 'KENYA ', 0, ' pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t'); +INSERT INTO mpp3287_nation VALUES (16, 'MOZAMBIQUE ', 0, 's. ironic, unusual asymptotes wake blithely r'); +INSERT INTO mpp3287_nation VALUES (18, 'CHINA ', 2, 'c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos'); +INSERT INTO mpp3287_nation VALUES (20, 'SAUDI ARABIA ', 4, 'ts. silent requests haggle. closely express packages sleep across the blithely'); +INSERT INTO mpp3287_nation VALUES (22, 'RUSSIA ', 3, ' requests against the platelets use never according to the quickly regular pint'); +INSERT INTO mpp3287_nation VALUES (24, 'UNITED STATES ', 1, 'y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be'); +delete from mpp3287_nation; +drop table mpp3287_nation; +drop table if exists mpp3283_nation; +CREATE TABLE mpp3283_NATION ( + N_NATIONKEY INTEGER, + N_NAME CHAR(25), + N_REGIONKEY INTEGER, + N_COMMENT VARCHAR(152) + ) +partition by range (n_regionkey) +( +partition p1 start('0') end('5') exclusive +); + +-- Data for Name: nation; Type: TABLE DATA; Schema: public; Owner: bmaryada +INSERT INTO mpp3283_nation VALUES (1, 'ARGENTINA ', 1, 'al foxes promise slyly according to the regular accounts. bold requests alon'); +INSERT INTO mpp3283_nation VALUES (3, 'CANADA ', 1, 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold'); +INSERT INTO mpp3283_nation VALUES (5, 'ETHIOPIA ', 0, 'ven packages wake quickly. regu'); +INSERT INTO mpp3283_nation VALUES (7, 'GERMANY ', 3, 'l platelets. regular accounts x-ray: unusual, regular acco'); +INSERT INTO mpp3283_nation VALUES (9, 'INDONESIA ', 2, ' slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull'); +INSERT INTO mpp3283_nation VALUES (11, 'IRAQ ', 4, 'nic deposits boost atop the quickly final requests? quickly regula'); +INSERT INTO mpp3283_nation VALUES (13, 'JORDAN ', 4, 'ic deposits are blithely about the carefully regular pa'); +INSERT INTO mpp3283_nation VALUES (15, 'MOROCCO ', 0, 'rns. blithely bold courts among the closely regular packages use furiously bold platelets?'); +INSERT INTO mpp3283_nation VALUES (17, 'PERU ', 1, 'platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun'); +INSERT INTO mpp3283_nation VALUES (19, 'ROMANIA ', 3, 'ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account'); +INSERT INTO mpp3283_nation VALUES (21, 'VIETNAM ', 2, 'hely enticingly express accounts. even, final '); +INSERT INTO mpp3283_nation VALUES (23, 'UNITED KINGDOM ', 3, 'eans boost carefully special requests. accounts are. carefull'); +INSERT INTO mpp3283_nation VALUES (0, 'ALGERIA ', 0, ' haggle. carefully final deposits detect slyly agai'); +INSERT INTO mpp3283_nation VALUES (2, 'BRAZIL ', 1, 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special '); +INSERT INTO mpp3283_nation VALUES (4, 'EGYPT ', 4, 'y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d'); +INSERT INTO mpp3283_nation VALUES (6, 'FRANCE ', 3, 'refully final requests. regular, ironi'); +INSERT INTO mpp3283_nation VALUES (8, 'INDIA ', 2, 'ss excuses cajole slyly across the packages. deposits print aroun'); +INSERT INTO mpp3283_nation VALUES (10, 'IRAN ', 4, 'efully alongside of the slyly final dependencies. '); +INSERT INTO mpp3283_nation VALUES (12, 'JAPAN ', 2, 'ously. final, express gifts cajole a'); +INSERT INTO mpp3283_nation VALUES (14, 'KENYA ', 0, ' pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t'); +INSERT INTO mpp3283_nation VALUES (16, 'MOZAMBIQUE ', 0, 's. ironic, unusual asymptotes wake blithely r'); +INSERT INTO mpp3283_nation VALUES (18, 'CHINA ', 2, 'c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos'); +INSERT INTO mpp3283_nation VALUES (20, 'SAUDI ARABIA ', 4, 'ts. silent requests haggle. closely express packages sleep across the blithely'); +INSERT INTO mpp3283_nation VALUES (22, 'RUSSIA ', 3, ' requests against the platelets use never according to the quickly regular pint'); +INSERT INTO mpp3283_nation VALUES (24, 'UNITED STATES ', 1, 'y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be'); +select count(*) from mpp3283_nation; +copy mpp3283_nation to '/dev/null' delimiter '|'; +drop table mpp3283_nation; + +-- Check that DROP TABLE still works, after adding a default partition. +CREATE TABLE mpp3240(a int, b int, c int) +partition by range (a) +( partition aa start (1) end (5) every (1) ); +alter table mpp3240 add default partition default_part; +drop table mpp3240; + +-- Check that after dropping a partition, you can create a new partition with +-- the same name. +CREATE TABLE mpp3259 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +( partition aa start (0) end (500) every (100), default partition default_part ); + +alter table mpp3259 drop partition default_part; +alter table mpp3259 add default partition default_part; + +insert into mpp3259 (unique1) values (100001); +select * from mpp3259; +select * from mpp3259_1_prt_default_part; + +drop table mpp3259; + +-- Check that DROP PARTITION for (n) gives sensible error if there is no matching partition. +CREATE TABLE mpp3265 ( + unique1 int4, + unique2 int4 +) partition by range (unique1) +( partition aa start (0) end (500), + partition bb start (500) end (1000), + partition cc start (1000) end (1500), + partition dd start (1500) end (2000), + default partition default_part ); + +alter table mpp3265 drop partition for (100); +alter table mpp3265 drop partition for (-5); +alter table mpp3265 drop partition for (0); + +drop table mpp3265; + +-- Test very deeply nested subpartitioning +CREATE TABLE MULTI_PART2(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) + +partition by range (a) +subpartition by range (b) subpartition template ( start (1) end (2) every (1)) +subpartition by range (c) subpartition template ( start (1) end (2) every (1)) +subpartition by range (d) subpartition template ( start (1) end (2) every (1)) +subpartition by range (e) subpartition template ( start (1) end (2) every (1)) +subpartition by range (f) subpartition template ( start (1) end (2) every (1)) +subpartition by range (g) subpartition template ( start (1) end (2) every (1)) +subpartition by range (h) subpartition template ( start (1) end (2) every (1)) +subpartition by range (i) subpartition template ( start (1) end (2) every (1)) +subpartition by range (j) subpartition template ( start (1) end (2) every (1)) +subpartition by range (k) subpartition template ( start (1) end (2) every (1)) +subpartition by range (l) subpartition template ( start (1) end (2) every (1)) +subpartition by range (m) subpartition template ( start (1) end (2) every (1)) +subpartition by range (n) subpartition template ( start (1) end (2) every (1)) +subpartition by range (o) subpartition template ( start (1) end (2) every (1)) +subpartition by range (p) subpartition template ( start (1) end (2) every (1)) +subpartition by range (q) subpartition template ( start (1) end (2) every (1)) +subpartition by range (r) subpartition template ( start (1) end (2) every (1)) +subpartition by range (s) subpartition template ( start (1) end (2) every (1)) +subpartition by range (t) subpartition template ( start (1) end (2) every (1)) +subpartition by range (u) subpartition template ( start (1) end (2) every (1)) +subpartition by range (v) subpartition template ( start (1) end (2) every (1)) +subpartition by range (w) subpartition template ( start (1) end (2) every (1)) +subpartition by range (x) subpartition template ( start (1) end (2) every (1)) +subpartition by range (y) subpartition template ( start (1) end (2) every (1)) +subpartition by range (z) subpartition template ( start (1) end (2) every (1)) +( start (1) end (2) every (1)); +alter table multi_part2 rename to m_0000000; +select relid,parentrelid,isleaf,level, pg_catalog.pg_get_expr(relpartbound, oid) from pg_partition_tree('m_0000000'), pg_class where relid = oid; +alter table m_0000000 rename to multi_part2_0000000; +select relid,parentrelid,isleaf,level, pg_catalog.pg_get_expr(relpartbound, oid) from pg_partition_tree('multi_part2_0000000'), pg_class where relid = oid; +alter table multi_part2_0000000 rename partition for (1) to a123456789a123456789a123456789a123456789a123456789a123456789; +drop table multi_part2_0000000; + +drop TABLE IF EXISTS INT_P1A CASCADE; +CREATE TABLE INT_P1A ( num1 INTEGER NOT NULL, + num2 INTEGER NOT NULL, + average DECIMAL(15,2) NOT NULL, + date1 DATE NOT NULL, + date2 DATE NOT NULL, + message VARCHAR(44) NOT NULL ) +PARTITION BY RANGE(date1) +( + PARTITION y1992 END('1992-12-31'), + PARTITION y1993 END('1993-12-31'), + PARTITION y1994 END('1994-12-31'), + PARTITION y1995 END('1995-12-31'), + PARTITION y1996 START('1996-01-01'), + PARTITION y1997 START('1997-01-01') END('1997-12-31') + ); + + +drop TABLE IF EXISTS INT_P1B CASCADE; + +CREATE TABLE INT_P1B ( num1 INTEGER NOT NULL, + num2 INTEGER NOT NULL, + average DECIMAL(15,2) NOT NULL, + date1 DATE NOT NULL, + date2 DATE NOT NULL, + message VARCHAR(44) NOT NULL ) +PARTITION BY RANGE(date1) +( + PARTITION y1992 END('1992-12-31'), + PARTITION y1993 END('1993-12-31'), + PARTITION y1994 END('1994-12-31'), + PARTITION y1995, + PARTITION y1996 START('1996-01-01'), + PARTITION y1997 start('1997-01-01') END('1997-12-31') + ); + +DROP TABLE INT_P1A; +DROP TABLE INT_P1B; +CREATE TABLE mpp2564_transactions (obligation_trans_date date, cust_no integer, company_no character(3), obligation_trans_no character varying(25), item_no integer, orig_oblig_trans_no character varying(25), split_ind character(1), qty_sold integer, net_wgt_lbs numeric(10,5), unit_price numeric(10,2), ext_price numeric(10,2), catch_wgt_ind character(1), qty_sold_case_equivalent numeric(10,5), marketing_assoc_id character varying(10), cost_of_goods_sold numeric(10,2), adj_cost_good_sold numeric(10,2), trade_sales_ind character(1), create_date timestamp without time zone) +PARTITION BY RANGE (obligation_trans_date) +SUBPARTITION BY LIST (company_no) subpartition template +( subpartition p1 values ('047'), + subpartition p2 values ('002'), + subpartition p3 values ('056'), + subpartition p4 values ('022') +) +( start ('2005-06-01') end ('2006-05-01') every (INTERVAL '1 month') ); + +\d mpp2564_transactions* + +-- Check that DEFAULT can be used as partition's name with ALTER TABLE ADD PARTITION. (MPP-3363) +CREATE TABLE mpp3363(a int, b int, c int) +partition by range (a) +( partition aa start (1) end (3) every (1) ); + +alter table mpp3363 add default partition default; + +drop table mpp3363; +-- start_matchsubs +-- #Daylight savings for Pacific Time +-- m/00:00-0\d/ +-- s/00:00-0\d/00:00-0x/g +-- end_matchsubs +-- 1 level partition +CREATE TABLE mpp3059(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +( partition aa start (1) end (5) every (1) ); +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059') as t, pg_class as c where relid = oid; + +alter table mpp3059 rename to mpp3059_rename; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059_rename') as t, pg_class as c where relid = oid; + +alter table mpp3059_rename rename to mpp3059; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059') as t, pg_class as c where relid = oid; + +-- 2 level partition +CREATE TABLE mpp3059a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (500) every (100) ) +( start (0) end (500) every (100)); +alter table mpp3059a rename to mpp3059a_rename; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059a_rename') as t, pg_class as c where relid = oid; + +create table mpp3216a (id int, rank int, year int, gender char(1), count int); +create table mpp3216 (like mpp3216a) partition by range (year) ( start (2001) end (2006) every (1)); +alter table mpp3216 rename to mpp3216_rename; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3216_rename') as t, pg_class as c where relid = oid; + +CREATE TABLE mpp3059b (f1 time(2) with time zone, f2 char(4)) +partition by list (f2) +( partition pst values ('PST'), + partition est values ('EST') +); +alter table mpp3059b rename partition pst to "pacific time"; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059b') as t, pg_class as c where relid = oid; + +CREATE TABLE mpp3059c (f1 time(2) with time zone, f2 char(4)) +partition by list (f2) +subpartition by range (f1) +subpartition template ( +start (time '00:00'), +start (time '01:00') +) +( partition pst values ('PST'), + partition est values ('EST') +); +alter table mpp3059c rename partition pst to pacific; +alter table mpp3059c rename partition est to "Eastern Time"; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059c') as t, pg_class as c where relid = oid; + +CREATE TABLE mpp3059d (f1 time(2) with time zone, f2 char(4), f3 varchar(10)) +partition by list (f2) +subpartition by list (f3) +subpartition template ( + subpartition male values ('Male','M'), + subpartition female values ('Female','F') +) +( partition pst values ('PST'), + partition est values ('EST') +); +alter table mpp3059d rename partition pst to pacific; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059d') as t, pg_class as c where relid = oid; + +create table test_khush (a integer, b date, c varchar(30)) +partition by range(b) +( start ('2008-01-01') end ('2008-04-01') ); + +Insert into test_khush values (1, '01-Jan-2008', 'abc'); +Insert into test_khush values (2, '01-Feb-2008', 'jhg'); +Insert into test_khush values (3, '01-Mar-2008', 'xyz'); + +alter table test_khush add column d varchar(20); + +insert into test_khush values (5,'05-Feb-2008','hgjhg','Test'); + +drop table test_khush; + +CREATE TABLE mpp3244(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +subpartition by range (b) subpartition template ( start (1) end (10) every (1))( partition aa start (1) end (10) every (1) ); + +CREATE TABLE mpp3244a(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +subpartition by range (b) subpartition template ( start (1) end (10) every (1))( partition aa start (1) end (11) every (1) ); + +insert into mpp3244 (a,b) values (10,1); +insert into mpp3244a (a,b) values (10,1); +alter table mpp3244 add partition bb end (11); +insert into mpp3244 (a,b) values (10,1); + +select count(*) from mpp3244; +select count(*) from mpp3244a; + +CREATE TABLE mpp3256 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (100) ) +( start (0) end (1000) every (100)); +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; + +-- Examples from Documentation +CREATE TABLE mpp3377_sales (trans_id int, date date, amount decimal(9,2), region text) +PARTITION BY RANGE (date) +SUBPARTITION BY LIST (region) +SUBPARTITION TEMPLATE +( SUBPARTITION usa VALUES ('usa'), +SUBPARTITION asia VALUES ('asia'), +SUBPARTITION europe VALUES ('europe') ) +( START (date '2008-01-01') INCLUSIVE +END (date '2009-01-01') EXCLUSIVE +EVERY (INTERVAL '1 month') ); + +-- Note from Jeff: MPP-3377 +-- since you already defined a template for your subpartition, you cannot specify it again in ADD (this now matches the behavior of CREATE TABLE). +ALTER TABLE mpp3377_sales ADD PARTITION +START (date '2009-02-01') INCLUSIVE +END (date '2009-03-01') EXCLUSIVE +( SUBPARTITION usa VALUES ('usa'), +SUBPARTITION asia VALUES ('asia'), +SUBPARTITION europe VALUES ('europe') ); + +-- This is the new way +ALTER TABLE mpp3377_sales ADD PARTITION START (date '2009-02-01') INCLUSIVE END (date '2009-03-01') EXCLUSIVE; + +CREATE TABLE mpp3250 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (100) ) +( start (0) end (1000) every (100)); +alter table mpp3250 add default partition default_part; + +copy mpp3250 from '@abs_srcdir@/data/onek.data'; + +CREATE TABLE mpp3375 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); + +copy mpp3375 from '@abs_srcdir@/data/onek.data'; + +CREATE TABLE mpp3375a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (100) ) +( start (0) end (1000) every (100)); + +insert into mpp3375a select * from mpp3375; + +alter table mpp3375a add default partition default_part; +alter table mpp3375a drop partition for (0); +alter table mpp3375a drop partition default_part; + +-- Check that a negative number can be used in START, without quotes. +CREATE TABLE mpp3241(a int, b int, c int) +partition by range (a) +( partition aa start (1) end (5) every (1) ); +alter table mpp3241 add partition zz start (-1) end (0); +DROP TABLE mpp3241; + + +CREATE TABLE mpp3438 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by list (unique1) +subpartition by list (unique2) +( +partition aa values (1,2,3,4,5,6,7,8,9,10) (subpartition cc values (1,2,3), subpartition dd values (4,5,6) ), +partition bb values (11,12,13,14,15,16,17,18,19,20) (subpartition cc values (1,2,3), subpartition dd values (4,5,6) ) +); +-- This should fail +alter table mpp3438 add default partition default_part; + +-- This should be the correct way +alter table mpp3438 add default partition default_part (default subpartition def2); +alter table mpp3438 alter partition aa add default partition def3; +\d mpp3438* + +drop table mpp3438; + +CREATE TABLE mpp3261 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); + +copy mpp3261 from '@abs_srcdir@/data/onek.data'; + + +CREATE TABLE mpp3261_part ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +( partition aa start (0) end (1000) every (100), default partition default_part ); + +alter table mpp3261_part drop partition for (0); +alter table mpp3261_part drop partition for (100); +alter table mpp3261_part drop partition for (200); +alter table mpp3261_part drop partition for (300); +alter table mpp3261_part drop partition for (400); +alter table mpp3261_part drop partition for (500); +alter table mpp3261_part drop partition for (600); +alter table mpp3261_part drop partition for (700); +alter table mpp3261_part drop partition for (800); +alter table mpp3261_part drop partition for (900); + +-- Shouldn't take a long time to insert +insert into mpp3261_part select * from mpp3261; + +drop table mpp3261; +drop table mpp3261_part; +CREATE TABLE mpp3079(q1 int8, q2 int8) +partition by range (q1) +(start (1) end (10) every (1)); + +CREATE TABLE mpp3079a(q1 int2, q2 int2) +partition by range (q1) +(start (1) end (10) every (1)); +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3079') as t, pg_class as c where relid = oid; + +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3079a') as t, pg_class as c where relid = oid; + +drop table mpp3079; +drop table mpp3079a; +CREATE TABLE mpp3242(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +( partition aa start (1) end (10) every (1) ); +alter table mpp3242 add default partition default_part; +insert into mpp3242 values(-1); +-- Needs to use ALTER SPLIT instead of ADD as value exists in default +-- partition corresponding to new partition. It's not +-- automatic. +alter table mpp3242 add partition zz start ('-1') end (0); + +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3242') as t, pg_class as c where relid = oid; + +drop table mpp3242; + +CREATE TABLE mpp3523 (f1 time(2) with time zone) +partition by range (f1) +( + partition "Los Angeles" start (time with time zone '00:00 PST') end (time with time zone '23:00 PST') EVERY (INTERVAL '1 hour'), + partition "New York" start (time with time zone '00:00 EST') end (time with time zone '23:00 EST') EVERY (INTERVAL '1 hour') +); + +-- Tries to truncate first, but the partition name is still too long, so ERROR +alter table mpp3523 rename partition "Los Angeles_1" to "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; + +-- Truncates the table name to mpp3523_0000000000111111111122222222223333333333444444444455555 +CREATE TABLE mpp3523_000000000011111111112222222222333333333344444444445555555555556666666666777777777788888888889999999999 (f1 time(2) with time zone) +partition by range (f1) +( + partition "Los Angeles" start (time with time zone '00:00 PST') end (time with time zone '23:00 PST') EVERY (INTERVAL '1 hour'), + partition "New York" start (time with time zone '00:00 EST') end (time with time zone '23:00 EST') EVERY (INTERVAL '1 hour') +); + +-- Truncates the table name to mpp3523_0000000000111111111122222222223333333333444444444455555, but partition name is too long, so ERROR +alter table mpp3523_000000000011111111112222222222333333333344444444445555555555556666666666777777777788888888889999999999 rename partition "Los Angeles_1" to "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; +-- Truncates the table name to mpp3523_0000000000111111111122222222223333333333444444444455555, and partition name is safe, so renamed +alter table mpp3523_000000000011111111112222222222333333333344444444445555555555556666666666777777777788888888889999999999 rename partition "Los Angeles_1" to "LA1"; +-- Use the actual table name +alter table mpp3523_0000000000111111111122222222223333333333444444444455555 rename partition "Los Angeles_2" to "LA2"; + +drop table mpp3523; +-- Truncates the table name to mpp3523_0000000000111111111122222222223333333333444444444455555 +drop table mpp3523_000000000011111111112222222222333333333344444444445555555555556666666666777777777788888888889999999999; +CREATE TABLE mpp3260 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +( partition aa start (0) end (1000) every (100), default partition default_part ); + +alter table mpp3260 drop partition for (0); +alter table mpp3260 drop partition for (100); +alter table mpp3260 drop partition for (200); +alter table mpp3260 drop partition for (300); +alter table mpp3260 drop partition for (400); +alter table mpp3260 drop partition for (500); +alter table mpp3260 drop partition for (600); +alter table mpp3260 drop partition for (700); +alter table mpp3260 drop partition for (800); +alter table mpp3260 drop partition for (900); +insert into mpp3260 (unique1) values (1); + +CREATE TABLE mpp3260a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (100) ) +( start (0) end (1000) every (100)); +alter table mpp3260a drop partition for (0); +alter table mpp3260a drop partition for (100); +alter table mpp3260a drop partition for (200); +alter table mpp3260a drop partition for (300); +alter table mpp3260a drop partition for (400); +alter table mpp3260a drop partition for (500); +alter table mpp3260a drop partition for (600); +alter table mpp3260a drop partition for (700); +alter table mpp3260a drop partition for (800); +-- Last subpartition, cannot be dropped +alter table mpp3260a drop partition for (900); +drop table mpp3260a_1_prt_10; + +drop table mpp3260; +drop table mpp3260a; +CREATE TABLE mpp3080_int8(q1 int8, q2 int8) +partition by range (q1) +(start (1) end (5) every (1)); + +CREATE TABLE mpp3080_float4 (f1 float4) +partition by range (f1) +(start (1) end (5) every (1)); + +CREATE TABLE mpp3080_float8(i INT DEFAULT 1, f1 float8) +partition by range (f1) +(start (1) end (5) every (1)); + +CREATE TABLE mpp3080_floatreal(i INT DEFAULT 1, f1 float(24)) +partition by range (f1) +(start (1) end (5) every (1)); + +CREATE TABLE mpp3080_floatdouble(i INT DEFAULT 1, f1 float(53)) +partition by range (f1) +(start (1) end (5) every (1)); +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3080_floatdouble') as t, pg_class as c where relid = oid; + +CREATE TABLE mpp3080_numeric (id int4, val numeric(210,10)) +partition by range (val) +(start (1) end (5) every (1)); +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3080_numeric') as t, pg_class as c where relid = oid; + +CREATE TABLE mpp3080_numericbig (id int4, val numeric(1000,800)) +partition by range (val) +(start (1) end (5) every (1)); +-- order 1,5 +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3080_numericbig') as t, pg_class as c where relid = oid order by 1,5; + +create temp TABLE temp_hour_range (f1 time(2)) +partition by range (f1) +( + start (time '09:00') end (time '17:00') EVERY (INTERVAL '1 hour'), + default partition default_part +); + +-- MPP-26829 +-- negative test for when SUBPARTITION TEMPLATE shows up before any SUBPARTITION BY +CREATE TABLE MPP_26829 +(a integer, b integer NOT NULL, c integer) + +PARTITION BY RANGE (b) +SUBPARTITION TEMPLATE (START (1) END (12) EVERY (1), DEFAULT SUBPARTITION other_months ) +SUBPARTITION BY LIST (c) +SUBPARTITION TEMPLATE ( +SUBPARTITION p027 VALUES ('027'), +SUBPARTITION p141 VALUES ('141'), +SUBPARTITION p037 VALUES ('037')); +-- MPP-26829 + +-- Add check test on partition exchange +create table parttab (a int4, b int4) partition by range (a) (start (1) end (5) every (2)); +create table parttab_x (a int4, b int4); +alter table parttab exchange partition for (1) with table parttab_x; + +-- This used to work on GPDB 6 and below, but it is now rejected. ALTER +-- PARTITION is used to address subpartitions, it is not needed otherwise. +create table parttab_y (a int4, b int4); +alter table parttab alter partition for (1) exchange partition for (1) with table parttab_y; + +-- add constraint using index is forbidden on root and interior partitioned tables +create table root_part(a int, b int) + partition by range(b) + subpartition by list(b) + subpartition template (subpartition leaf values (1)) + (partition interior start(1) end(2) every(1)); +-- disallowed on root partitions +create unique index on root_part(a, b); +alter table root_part add primary key using index root_part_a_b_idx ; +-- disallowed on interior partitions +create unique index on root_part_1_prt_interior_1(a, b); +alter table root_part_1_prt_interior_1 add primary key using index root_part_1_prt_interior_1_a_b_idx1 ; +-- allowed on leaf partitions +create unique index on root_part_1_prt_interior_1_2_prt_leaf(a, b); +alter table root_part_1_prt_interior_1_2_prt_leaf add primary key using index root_part_1_prt_interior_1_2_prt_leaf_a_b_idx2; +drop table root_part; diff --git a/src/test/singlenode_regress/input/resource_queue_function.source b/src/test/singlenode_regress/input/resource_queue_function.source new file mode 100644 index 00000000000..936dc16a565 --- /dev/null +++ b/src/test/singlenode_regress/input/resource_queue_function.source @@ -0,0 +1,74 @@ + +CREATE FUNCTION checkResourceQueueMemoryLimits(cstring) RETURNS boolean +AS '@abs_builddir@/regress@DLSUFFIX@', 'checkResourceQueueMemoryLimits' LANGUAGE C READS SQL DATA; + +CREATE TABLE test_table(c1 int, c2 int); +INSERT INTO test_table values(1, 2); + +-- MPP-17240 +CREATE RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS = 1, MEMORY_LIMIT='10MB'); +CREATE ROLE test_role WITH RESOURCE QUEUE test_q; +GRANT SELECT ON test_table TO test_role; + +SET STATEMENT_MEM = '125MB'; + +-- should return true +select checkResourceQueueMemoryLimits('test_q'); + +SET ROLE test_role; + +-- should deadlock as there aren't enough resources to run the query. +-- query should be assigned 125MB, but queue only allows 10MB +SELECT count(*) FROM test_table; + +RESET ROLE; + +-- should return true +select checkResourceQueueMemoryLimits('test_q'); + +RESET STATEMENT_MEM; + +REVOKE SELECT ON test_table FROM test_role; +DROP ROLE test_role; +DROP RESOURCE QUEUE test_q; + +-- MPP-15992 +CREATE RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS = 1, MEMORY_LIMIT='8GB'); +CREATE ROLE test_role WITH RESOURCE QUEUE test_q; +GRANT SELECT ON test_table TO test_role; + +SET ROLE test_role; + +-- should return result +SELECT count(*) FROM test_table; + +RESET ROLE; + +ALTER RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS = 1, MEMORY_LIMIT='10GB'); + +SET ROLE test_role; + +-- should return result +SELECT count(*) FROM test_table; + +RESET ROLE; +-- should return true +select checkResourceQueueMemoryLimits('test_q'); + +ALTER RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS = 1, MEMORY_LIMIT='7GB'); + +SET ROLE test_role; + +-- should return result +SELECT count(*) FROM test_table; + +RESET ROLE; + +-- should return true +select checkResourceQueueMemoryLimits('test_q'); + +REVOKE SELECT ON test_table FROM test_role; +DROP TABLE test_table; +DROP ROLE test_role; +DROP RESOURCE QUEUE test_q; +DROP FUNCTION checkResourceQueueMemoryLimits(cstring); diff --git a/src/test/singlenode_regress/input/singlenode_compatibility_cbdb.source b/src/test/singlenode_regress/input/singlenode_compatibility_cbdb.source new file mode 100644 index 00000000000..dab1e8d92c8 --- /dev/null +++ b/src/test/singlenode_regress/input/singlenode_compatibility_cbdb.source @@ -0,0 +1,63 @@ +-- +-- Test compatibility in CBDB singlenode mode. +-- +-- In singlenode mode, certain clauses such as scatter by and +-- distributed by become meaningless, but for the sake of +-- compatibility, we retain the grammar and treat them as ignored. +-- This file aims to verify the correct functionality of all these +-- SQL statements. + +-- test ignorance of `distributed by` +create table l (i int, j int) distributed by (i); +create table r (i int, j int) distributed by (j); +insert into l select i % 7, i % 13 from generate_series(1, 1000) i; +insert into r select i % 13, i % 7 from generate_series(1, 1000) i; + +explain select count(*) from l; +select count(*) from l; +explain select count(*) from l, r where l.i = r.i; +select count(*) from l, r where l.i = r.i; + +alter table l set distributed by (j); + +create table ao1(x int, y int) with(appendonly=true) distributed by (x); +create table aocs1(x int, y int) with(appendonly=true, orientation=column) distributed by (x); + +insert into ao1 select i, i from generate_series(1, 1200000) g(i); +analyze ao1; +insert into aocs1 select i, i from generate_series(1, 1200000) g(i); +analyze aocs1; + +explain(costs off) select count(*) from ao1; +select count(*) from ao1; + +explain(costs off) select count(*) from aocs1; +select count(*) from aocs1; + +-- test ignorance of `scatter by` +CREATE TABLE example(a int, b text) DISTRIBUTED by (a); +COPY example FROM stdin; +1 value1.1/4 +2 value2.1/3 +3 value3.1/2 +4 value4.1/1 +1 value1.2/4 +2 value2.2/3 +3 value3.2/2 +1 value1.3/4 +2 value2.3/3 +1 value1.4/4 +\. + +CREATE FUNCTION multiset_func(a anytable) RETURNS SETOF example + AS '@abs_builddir@/regress@DLSUFFIX@', 'multiset_example' LANGUAGE C READS SQL DATA; + +explain SELECT * FROM multiset_func( TABLE( SELECT * FROM example ORDER BY a, b SCATTER by a) ) order by a, b; +SELECT * FROM multiset_func( TABLE( SELECT * FROM example ORDER BY a, b SCATTER by a) ) order by a, b; + +drop table l; +drop table r; +drop table ao1; +drop table aocs1; +drop function multiset_func; +drop table example; \ No newline at end of file diff --git a/src/test/singlenode_regress/input/tablespace.source b/src/test/singlenode_regress/input/tablespace.source new file mode 100644 index 00000000000..e3c702645e8 --- /dev/null +++ b/src/test/singlenode_regress/input/tablespace.source @@ -0,0 +1,425 @@ +-- start_matchignore +-- m/WARNING: tablespace symlink path is too long for TAR/ +-- m/DETAIL: The symlinked path \".*\" will be truncated to 100 characters when sending a TAR to the utilities \(e.g. pg_basebackup\)/ +-- end_matchignore +-- create a tablespace using WITH clause +CREATE TABLESPACE regress_tblspacewith LOCATION '@testtablespace@' WITH (some_nonexistent_parameter = true); -- fail +CREATE TABLESPACE regress_tblspacewith LOCATION '@testtablespace@' WITH (random_page_cost = 3.0); -- ok + +-- check to see the parameter was used +SELECT spcoptions FROM pg_tablespace WHERE spcname = 'regress_tblspacewith'; + +-- drop the tablespace so we can re-use the location +DROP TABLESPACE regress_tblspacewith; + +-- create a tablespace we can use +CREATE TABLESPACE regress_tblspace LOCATION '@testtablespace@'; + +-- try setting and resetting some properties for the new tablespace +ALTER TABLESPACE regress_tblspace SET (random_page_cost = 1.0, seq_page_cost = 1.1); +ALTER TABLESPACE regress_tblspace SET (some_nonexistent_parameter = true); -- fail +ALTER TABLESPACE regress_tblspace RESET (random_page_cost = 2.0); -- fail +ALTER TABLESPACE regress_tblspace RESET (random_page_cost, effective_io_concurrency); -- ok + +-- REINDEX (TABLESPACE) +-- catalogs and system tablespaces +-- system catalog, fail +REINDEX (TABLESPACE regress_tblspace) TABLE pg_am; +REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_am; +-- shared catalog, fail +REINDEX (TABLESPACE regress_tblspace) TABLE pg_authid; +REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_authid; +-- toast relations, fail +REINDEX (TABLESPACE regress_tblspace) INDEX pg_toast.pg_toast_1260_index; +REINDEX (TABLESPACE regress_tblspace) INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; +REINDEX (TABLESPACE regress_tblspace) TABLE pg_toast.pg_toast_1260; +REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_toast.pg_toast_1260; +-- system catalog, fail +REINDEX (TABLESPACE pg_global) TABLE pg_authid; +REINDEX (TABLESPACE pg_global) TABLE CONCURRENTLY pg_authid; + +-- table with toast relation +CREATE TABLE regress_tblspace_test_tbl (num1 bigint, num2 double precision, t text); +INSERT INTO regress_tblspace_test_tbl (num1, num2, t) + SELECT round(random()*100), random(), 'text' + FROM generate_series(1, 10) s(i); +CREATE INDEX regress_tblspace_test_tbl_idx ON regress_tblspace_test_tbl (num1); +-- move to global tablespace, fail +REINDEX (TABLESPACE pg_global) INDEX regress_tblspace_test_tbl_idx; +REINDEX (TABLESPACE pg_global) INDEX CONCURRENTLY regress_tblspace_test_tbl_idx; + +-- check transactional behavior of REINDEX (TABLESPACE) +BEGIN; +REINDEX (TABLESPACE regress_tblspace) INDEX regress_tblspace_test_tbl_idx; +REINDEX (TABLESPACE regress_tblspace) TABLE regress_tblspace_test_tbl; +ROLLBACK; +-- no relation moved to the new tablespace +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace'; + +-- check that all indexes are moved to a new tablespace with different +-- relfilenode. +-- Save first the existing relfilenode for the toast and main relations. +SELECT relfilenode as main_filenode FROM pg_class + WHERE relname = 'regress_tblspace_test_tbl_idx' \gset +SELECT relfilenode as toast_filenode FROM pg_class + WHERE oid = + (SELECT i.indexrelid + FROM pg_class c, + pg_index i + WHERE i.indrelid = c.reltoastrelid AND + c.relname = 'regress_tblspace_test_tbl') \gset +REINDEX (TABLESPACE regress_tblspace) TABLE regress_tblspace_test_tbl; +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace' + ORDER BY c.relname; +ALTER TABLE regress_tblspace_test_tbl SET TABLESPACE regress_tblspace; +ALTER TABLE regress_tblspace_test_tbl SET TABLESPACE pg_default; +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace' + ORDER BY c.relname; +-- Move back to the default tablespace. +ALTER INDEX regress_tblspace_test_tbl_idx SET TABLESPACE pg_default; +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace' + ORDER BY c.relname; +REINDEX (TABLESPACE regress_tblspace) TABLE regress_tblspace_test_tbl; +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace' + ORDER BY c.relname; +SELECT relfilenode = :main_filenode AS main_same FROM pg_class + WHERE relname = 'regress_tblspace_test_tbl_idx'; +SELECT relfilenode = :toast_filenode as toast_same FROM pg_class + WHERE oid = + (SELECT i.indexrelid + FROM pg_class c, + pg_index i + WHERE i.indrelid = c.reltoastrelid AND + c.relname = 'regress_tblspace_test_tbl'); +DROP TABLE regress_tblspace_test_tbl; + +-- REINDEX (TABLESPACE) with partitions +-- Create a partition tree and check the set of relations reindexed +-- with their new tablespace. +CREATE TABLE tbspace_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1); +CREATE TABLE tbspace_reindex_part_0 PARTITION OF tbspace_reindex_part + FOR VALUES FROM (0) TO (10) PARTITION BY list (c2); +CREATE TABLE tbspace_reindex_part_0_1 PARTITION OF tbspace_reindex_part_0 + FOR VALUES IN (1); +CREATE TABLE tbspace_reindex_part_0_2 PARTITION OF tbspace_reindex_part_0 + FOR VALUES IN (2); +-- This partitioned table will have no partitions. +CREATE TABLE tbspace_reindex_part_10 PARTITION OF tbspace_reindex_part + FOR VALUES FROM (10) TO (20) PARTITION BY list (c2); +-- Create some partitioned indexes +CREATE INDEX tbspace_reindex_part_index ON ONLY tbspace_reindex_part (c1); +CREATE INDEX tbspace_reindex_part_index_0 ON ONLY tbspace_reindex_part_0 (c1); +ALTER INDEX tbspace_reindex_part_index ATTACH PARTITION tbspace_reindex_part_index_0; +-- This partitioned index will have no partitions. +CREATE INDEX tbspace_reindex_part_index_10 ON ONLY tbspace_reindex_part_10 (c1); +ALTER INDEX tbspace_reindex_part_index ATTACH PARTITION tbspace_reindex_part_index_10; +CREATE INDEX tbspace_reindex_part_index_0_1 ON ONLY tbspace_reindex_part_0_1 (c1); +ALTER INDEX tbspace_reindex_part_index_0 ATTACH PARTITION tbspace_reindex_part_index_0_1; +CREATE INDEX tbspace_reindex_part_index_0_2 ON ONLY tbspace_reindex_part_0_2 (c1); +ALTER INDEX tbspace_reindex_part_index_0 ATTACH PARTITION tbspace_reindex_part_index_0_2; +SELECT relid, parentrelid, level FROM pg_partition_tree('tbspace_reindex_part_index') + ORDER BY relid, level; +-- Track the original tablespace, relfilenode and OID of each index +-- in the tree. +CREATE TEMP TABLE reindex_temp_before AS + SELECT oid, relname, relfilenode, reltablespace + FROM pg_class + WHERE relname ~ 'tbspace_reindex_part_index'; +REINDEX (TABLESPACE regress_tblspace) TABLE tbspace_reindex_part; +-- REINDEX CONCURRENTLY changes the OID of the old relation, hence a check +-- based on the relation name below. +SELECT b.relname, + CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' + ELSE 'relfilenode has changed' END AS filenode, + CASE WHEN a.reltablespace = b.reltablespace THEN 'reltablespace is unchanged' + ELSE 'reltablespace has changed' END AS tbspace + FROM reindex_temp_before b JOIN pg_class a ON b.relname = a.relname + ORDER BY 1; +DROP TABLE tbspace_reindex_part; + +-- create a schema we can use +CREATE SCHEMA testschema; + +-- try a table +CREATE TABLE testschema.foo (i int) TABLESPACE regress_tblspace; +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname = 'foo'; + +INSERT INTO testschema.foo VALUES(1); +INSERT INTO testschema.foo VALUES(2); + +-- tables from dynamic sources +CREATE TABLE testschema.asselect TABLESPACE regress_tblspace AS SELECT 1; +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname = 'asselect'; + +PREPARE selectsource(int) AS SELECT $1; +CREATE TABLE testschema.asexecute TABLESPACE regress_tblspace + AS EXECUTE selectsource(2); +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname = 'asexecute'; + +-- index +CREATE INDEX foo_idx on testschema.foo(i) TABLESPACE regress_tblspace; +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname = 'foo_idx'; + +-- check \d output +\d testschema.foo +\d testschema.foo_idx + +-- +-- partitioned table +-- +CREATE TABLE testschema.part (a int) PARTITION BY LIST (a); +SET default_tablespace TO pg_global; +CREATE TABLE testschema.part_1 PARTITION OF testschema.part FOR VALUES IN (1); +RESET default_tablespace; +CREATE TABLE testschema.part_1 PARTITION OF testschema.part FOR VALUES IN (1); +SET default_tablespace TO regress_tblspace; +CREATE TABLE testschema.part_2 PARTITION OF testschema.part FOR VALUES IN (2); +SET default_tablespace TO pg_global; +CREATE TABLE testschema.part_3 PARTITION OF testschema.part FOR VALUES IN (3); +-- GPDB: Cloudberry's ALTER TABLE .. SET TABLESPACE command recurses by +-- default, hence add ONLY to achieve the same results for SELECT. +ALTER TABLE ONLY testschema.part SET TABLESPACE regress_tblspace; +CREATE TABLE testschema.part_3 PARTITION OF testschema.part FOR VALUES IN (3); +CREATE TABLE testschema.part_4 PARTITION OF testschema.part FOR VALUES IN (4) + TABLESPACE pg_default; +CREATE TABLE testschema.part_56 PARTITION OF testschema.part FOR VALUES IN (5, 6) + PARTITION BY LIST (a); +-- GPDB: Cloudberry's ALTER TABLE .. SET TABLESPACE command recurses by +-- default, hence add ONLY to achieve the same results for SELECT. +ALTER TABLE ONLY testschema.part SET TABLESPACE pg_default; +CREATE TABLE testschema.part_78 PARTITION OF testschema.part FOR VALUES IN (7, 8) + PARTITION BY LIST (a); +CREATE TABLE testschema.part_910 PARTITION OF testschema.part FOR VALUES IN (9, 10) + PARTITION BY LIST (a) TABLESPACE regress_tblspace; +RESET default_tablespace; +CREATE TABLE testschema.part_78 PARTITION OF testschema.part FOR VALUES IN (7, 8) + PARTITION BY LIST (a); + +SELECT relname, spcname FROM pg_catalog.pg_class c + JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid) + LEFT JOIN pg_catalog.pg_tablespace t ON c.reltablespace = t.oid + where c.relname LIKE 'part%' AND n.nspname = 'testschema' order by relname; +RESET default_tablespace; +DROP TABLE testschema.part; + +-- partitioned index +CREATE TABLE testschema.part (a int) PARTITION BY LIST (a); +CREATE TABLE testschema.part1 PARTITION OF testschema.part FOR VALUES IN (1); +CREATE INDEX part_a_idx ON testschema.part (a) TABLESPACE regress_tblspace; +CREATE TABLE testschema.part2 PARTITION OF testschema.part FOR VALUES IN (2); +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname LIKE 'part%_idx'; +\d testschema.part +\d+ testschema.part +\d testschema.part1 +\d+ testschema.part1 +\d testschema.part_a_idx +\d+ testschema.part_a_idx + +-- partitioned rels cannot specify the default tablespace. These fail: +CREATE TABLE testschema.dflt (a int PRIMARY KEY) PARTITION BY LIST (a) TABLESPACE pg_default; +CREATE TABLE testschema.dflt (a int PRIMARY KEY USING INDEX TABLESPACE pg_default) PARTITION BY LIST (a); +SET default_tablespace TO 'pg_default'; +CREATE TABLE testschema.dflt (a int PRIMARY KEY) PARTITION BY LIST (a) TABLESPACE regress_tblspace; +CREATE TABLE testschema.dflt (a int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace) PARTITION BY LIST (a); +-- but these work: +CREATE TABLE testschema.dflt (a int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace) PARTITION BY LIST (a) TABLESPACE regress_tblspace; +SET default_tablespace TO ''; +CREATE TABLE testschema.dflt2 (a int PRIMARY KEY) PARTITION BY LIST (a); +DROP TABLE testschema.dflt, testschema.dflt2; + +-- check that default_tablespace doesn't affect ALTER TABLE index rebuilds +CREATE TABLE testschema.test_default_tab(id bigint) TABLESPACE regress_tblspace; +INSERT INTO testschema.test_default_tab VALUES (1); +CREATE INDEX test_index1 on testschema.test_default_tab (id); +CREATE INDEX test_index2 on testschema.test_default_tab (id) TABLESPACE regress_tblspace; +ALTER TABLE testschema.test_default_tab ADD CONSTRAINT test_index3 PRIMARY KEY (id); +ALTER TABLE testschema.test_default_tab ADD CONSTRAINT test_index4 UNIQUE (id) USING INDEX TABLESPACE regress_tblspace; + +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +-- use a custom tablespace for default_tablespace +SET default_tablespace TO regress_tblspace; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE bigint; +-- start_ignore +ANALYZE testschema.test_default_tab; +-- end_ignore +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +SELECT * FROM testschema.test_default_tab; +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE int; +-- start_ignore +ANALYZE testschema.test_default_tab; +-- end_ignore +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +SELECT * FROM testschema.test_default_tab; +-- now use the default tablespace for default_tablespace +SET default_tablespace TO ''; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE int; +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE bigint; +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +DROP TABLE testschema.test_default_tab; + +-- check that default_tablespace doesn't affect ALTER TABLE index rebuilds +-- (this time with a partitioned table) +CREATE TABLE testschema.test_default_tab_p(id bigint, val bigint) + PARTITION BY LIST (id) TABLESPACE regress_tblspace; +CREATE TABLE testschema.test_default_tab_p1 PARTITION OF testschema.test_default_tab_p + FOR VALUES IN (1); +INSERT INTO testschema.test_default_tab_p VALUES (1); +CREATE INDEX test_index1 on testschema.test_default_tab_p (val); +CREATE INDEX test_index2 on testschema.test_default_tab_p (val) TABLESPACE regress_tblspace; +ALTER TABLE testschema.test_default_tab_p ADD CONSTRAINT test_index3 PRIMARY KEY (id); +ALTER TABLE testschema.test_default_tab_p ADD CONSTRAINT test_index4 UNIQUE (id) USING INDEX TABLESPACE regress_tblspace; + +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +-- use a custom tablespace for default_tablespace +SET default_tablespace TO regress_tblspace; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab_p ALTER val TYPE bigint; +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +SELECT * FROM testschema.test_default_tab_p; +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab_p ALTER val TYPE int; +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +SELECT * FROM testschema.test_default_tab_p; +-- now use the default tablespace for default_tablespace +SET default_tablespace TO ''; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab_p ALTER val TYPE int; +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab_p ALTER val TYPE bigint; +\d testschema.test_index1 +\d testschema.test_index2 +\d testschema.test_index3 +\d testschema.test_index4 +DROP TABLE testschema.test_default_tab_p; + +-- check that default_tablespace affects index additions in ALTER TABLE +CREATE TABLE testschema.test_tab(id int) TABLESPACE regress_tblspace; +INSERT INTO testschema.test_tab VALUES (1); +SET default_tablespace TO regress_tblspace; +ALTER TABLE testschema.test_tab ADD CONSTRAINT test_tab_unique UNIQUE (id); +SET default_tablespace TO ''; +ALTER TABLE testschema.test_tab ADD CONSTRAINT test_tab_pkey PRIMARY KEY (id); +\d testschema.test_tab_unique +\d testschema.test_tab_pkey +SELECT * FROM testschema.test_tab; +DROP TABLE testschema.test_tab; + +-- check that default_tablespace is handled correctly by multi-command +-- ALTER TABLE that includes a tablespace-preserving rewrite +CREATE TABLE testschema.test_tab(a int, b int, c int); +SET default_tablespace TO regress_tblspace; +ALTER TABLE testschema.test_tab ADD CONSTRAINT test_tab_unique UNIQUE (a); +CREATE INDEX test_tab_a_idx ON testschema.test_tab (a); +SET default_tablespace TO ''; +CREATE INDEX test_tab_b_idx ON testschema.test_tab (b); +\d testschema.test_tab_unique +\d testschema.test_tab_a_idx +\d testschema.test_tab_b_idx +ALTER TABLE testschema.test_tab ALTER b TYPE bigint, ADD UNIQUE (c); +\d testschema.test_tab_unique +\d testschema.test_tab_a_idx +\d testschema.test_tab_b_idx +DROP TABLE testschema.test_tab; + +-- let's try moving a table from one place to another +CREATE TABLE testschema.atable AS VALUES (1), (2); +CREATE UNIQUE INDEX anindex ON testschema.atable(column1); + +ALTER TABLE testschema.atable SET TABLESPACE regress_tblspace; +ALTER INDEX testschema.anindex SET TABLESPACE regress_tblspace; +ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_global; +ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_default; +ALTER INDEX testschema.part_a_idx SET TABLESPACE regress_tblspace; + +INSERT INTO testschema.atable VALUES(3); -- ok +INSERT INTO testschema.atable VALUES(1); -- fail (checks index) +SELECT COUNT(*) FROM testschema.atable; -- checks heap + +-- Will fail with bad path +CREATE TABLESPACE regress_badspace LOCATION '/no/such/location'; + +-- No such tablespace +CREATE TABLE bar (i int) TABLESPACE regress_nosuchspace; + +-- Fail, in use for some partitioned object +DROP TABLESPACE regress_tblspace; +ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_default; +-- Fail, not empty +DROP TABLESPACE regress_tblspace; + +CREATE ROLE regress_tablespace_user1 login; +CREATE ROLE regress_tablespace_user2 login; +GRANT USAGE ON SCHEMA testschema TO regress_tablespace_user2; + +ALTER TABLESPACE regress_tblspace OWNER TO regress_tablespace_user1; + +CREATE TABLE testschema.tablespace_acl (c int); +-- new owner lacks permission to create this index from scratch +CREATE INDEX k ON testschema.tablespace_acl (c) TABLESPACE regress_tblspace; +ALTER TABLE testschema.tablespace_acl OWNER TO regress_tablespace_user2; + +SET SESSION ROLE regress_tablespace_user2; +CREATE TABLE tablespace_table (i int) TABLESPACE regress_tblspace; -- fail +ALTER TABLE testschema.tablespace_acl ALTER c TYPE bigint; +REINDEX (TABLESPACE regress_tblspace) TABLE tablespace_table; -- fail +REINDEX (TABLESPACE regress_tblspace, CONCURRENTLY) TABLE tablespace_table; -- fail +RESET ROLE; + +ALTER TABLESPACE regress_tblspace RENAME TO regress_tblspace_renamed; + +ALTER TABLE ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; +ALTER INDEX ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; + +-- Should show notice that nothing was done +ALTER TABLE ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; + +-- Should succeed +DROP TABLESPACE regress_tblspace_renamed; + +DROP SCHEMA testschema CASCADE; + +DROP ROLE regress_tablespace_user1; +DROP ROLE regress_tablespace_user2; diff --git a/src/test/singlenode_regress/input/uao_dml/GENERATE_ROW_AND_COLUMN_FILES b/src/test/singlenode_regress/input/uao_dml/GENERATE_ROW_AND_COLUMN_FILES new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_regress/input/uao_dml/uao_dml_cursor.source b/src/test/singlenode_regress/input/uao_dml/uao_dml_cursor.source new file mode 100644 index 00000000000..87b5935a389 --- /dev/null +++ b/src/test/singlenode_regress/input/uao_dml/uao_dml_cursor.source @@ -0,0 +1,248 @@ +create schema uao_dml_cursor_@amname@; +set search_path=uao_dml_cursor_@amname@; +SET default_table_access_method=@amname@; + +-- @Description BINARY CURSOR. +-- +DROP TABLE IF EXISTS sto_uao_emp_forcursor cascade; +CREATE TABLE sto_uao_emp_forcursor ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_forcursor values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_forcursor cascade; +CREATE TABLE sto_uao_dept_forcursor ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(15)); + +insert into sto_uao_dept_forcursor values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(4, 'OPERATIONS','SEATTLE'); + +BEGIN; +DECLARE + all_emp_upd_rollback BINARY CURSOR FOR SELECT ename, loc FROM sto_uao_emp_forcursor JOIN sto_uao_dept_forcursor + on dept = deptno order by ename ; + FETCH FIRST from all_emp_upd_rollback; + update sto_uao_dept_forcursor set loc = 'NEW YORK CITY' where loc = 'NEW YORK'; + MOVE 5 FROM all_emp_upd_rollback; + FETCH 1 from all_emp_upd_rollback ; + CLOSE all_emp_upd_rollback; +ROLLBACK; + +BEGIN; +DECLARE all_dept BINARY CURSOR FOR SELECT dname,loc from sto_uao_dept_forcursor order by 1; +fetch all from all_dept; +close all_dept; +commit; + +BEGIN; +DECLARE all_dept_del_rollback BINARY CURSOR FOR SELECT dname,loc from sto_uao_dept_forcursor order by 1; +delete from sto_uao_dept_forcursor where loc = 'NEW YORK'; +fetch all from all_dept_del_rollback; +close all_dept_del_rollback; +ROLLBACK; + +BEGIN; +DECLARE all_dept_aft_del BINARY CURSOR FOR SELECT dname,loc from sto_uao_dept_forcursor order by 1; +fetch all from all_dept_aft_del; +close all_dept_aft_del; +commit; + +BEGIN; +DECLARE + all_emp_del_commit BINARY CURSOR FOR SELECT ename FROM sto_uao_emp_forcursor order by ename desc ; + FETCH FIRST from all_emp_del_commit; + delete FROM sto_uao_emp_forcursor where empno > 10; + FETCH 2 from all_emp_del_commit; + MOVE 5 FROM all_emp_del_commit; + FETCH 1 from all_emp_del_commit ; + FETCH NEXT from all_emp_del_commit; + FETCH all from all_emp_del_commit; + CLOSE all_emp_del_commit; +COMMIT; + +BEGIN; +DECLARE + all_emp_aft_del CURSOR FOR SELECT ename FROM sto_uao_emp_forcursor order by ename desc ; + FETCH all from all_emp_aft_del; + CLOSE all_emp_aft_del; + +COMMIT; +BEGIN; +DECLARE + all_emp_upd_commit BINARY CURSOR FOR SELECT ename, loc FROM sto_uao_emp_forcursor JOIN sto_uao_dept_forcursor + on dept = deptno order by ename ; + FETCH FIRST from all_emp_upd_commit; + FETCH 2 from all_emp_upd_commit; + update sto_uao_dept_forcursor set loc = 'NEW YORK CITY' where loc = 'NEW YORK'; + MOVE 5 FROM all_emp_upd_commit; + FETCH 1 from all_emp_upd_commit ; + FETCH NEXT from all_emp_upd_commit; + FETCH all from all_emp_upd_commit; + CLOSE all_emp_upd_commit; +COMMIT; +BEGIN; +DECLARE all_dept2 BINARY CURSOR FOR SELECT dname,loc from sto_uao_dept_forcursor order by 1; +fetch all from all_dept2; +close all_dept2; +commit; +BEGIN; +DECLARE + all_emp_aft_upd BINARY CURSOR FOR SELECT ename, loc FROM sto_uao_emp_forcursor JOIN sto_uao_dept_forcursor + on dept = deptno order by ename ; + FETCH FIRST from all_emp_aft_upd; + FETCH 2 from all_emp_aft_upd; + MOVE 5 FROM all_emp_aft_upd; + FETCH 1 from all_emp_aft_upd ; + FETCH NEXT from all_emp_aft_upd; + FETCH all from all_emp_aft_upd; + CLOSE all_emp_aft_upd; +COMMIT; + + +-- @Description WITH HOLD cursor. +-- +DROP TABLE IF EXISTS sto_uao_emp_forcursor cascade; +CREATE TABLE sto_uao_emp_forcursor ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT) +; + +insert into sto_uao_emp_forcursor values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); + +BEGIN; +DECLARE + all_emp_withhold BINARY CURSOR WITH HOLD FOR SELECT ename FROM sto_uao_emp_forcursor order by ename asc ; + FETCH ABSOLUTE 1 from all_emp_withhold; + FETCH 3 from all_emp_withhold; + +COMMIT; +-- fetch after commit +ve testcase +FETCH next from all_emp_withhold; +close all_emp_withhold; + +BEGIN; +DECLARE + all_emp_withouthold BINARY CURSOR FOR SELECT ename FROM sto_uao_emp_forcursor order by ename asc ; + FETCH ABSOLUTE 1 from all_emp_withouthold; + FETCH 3 from all_emp_withouthold; + +COMMIT; +-- fetch after commit -ve testcase +FETCH next from all_emp_withouthold; +close all_emp_withouthold; + + +-- @Description UPDATEABLE BINARY cursor. +-- +DROP TABLE IF EXISTS sto_uao_emp_forcursor cascade; +CREATE TABLE sto_uao_emp_forcursor ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_forcursor values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_forcursor cascade; +CREATE TABLE sto_uao_dept_forcursor ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(15)); + +insert into sto_uao_dept_forcursor values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(4, 'OPERATIONS','SEATTLE'); + +BEGIN; +DECLARE + all_emp_uao_upd_commit BINARY CURSOR FOR SELECT ename FROM sto_uao_emp_forcursor order by ename ; + FETCH forward 3 from all_emp_uao_upd_commit; + FETCH NEXT in all_emp_uao_upd_commit; + update sto_uao_emp_forcursor set ename = ename || '_NEW' where current of all_emp_uao_upd_commit; + FETCH NEXT from all_emp_uao_upd_commit; + FETCH all from all_emp_uao_upd_commit; + CLOSE all_emp_uao_upd_commit; +COMMIT; + +BEGIN; +DECLARE + all_emp_uao_aft_upd BINARY CURSOR FOR SELECT ename, loc FROM sto_uao_emp_forcursor JOIN sto_uao_dept_forcursor + on dept = deptno order by ename ; + FETCH all from all_emp_uao_aft_upd; + CLOSE all_emp_uao_aft_upd; +COMMIT; + + diff --git a/src/test/singlenode_regress/input/uao_dml/uao_dml_select.source b/src/test/singlenode_regress/input/uao_dml/uao_dml_select.source new file mode 100644 index 00000000000..504c63cacd7 --- /dev/null +++ b/src/test/singlenode_regress/input/uao_dml/uao_dml_select.source @@ -0,0 +1,2477 @@ +create schema uao_dml_select_@amname@; +set search_path=uao_dml_select_@amname@; +SET default_table_access_method=@amname@; + +-- @Description select with aggregate function +-- + +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; + +BEGIN; + +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); + +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city_uao (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; + +COMMIT; + +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; + +--query with aggregate functions + +select +(select max(city_uao.population) from city_uao ) as WORLD_MAX_POP, +(select avg(city_uao.population) from city_uao) AS WORLD_AVG_POP, + city_uao.name as populationwise_top_five_cities,city_uao.population + from + city_uao order by city_uao.population desc LIMIT 5; + +select +(select min(city_uao.population) from city_uao ) as WORLD_MIN_POP, +(select SUM(city_uao.population) from city_uao) AS WORLD_SUM_POP, + city_uao.name as populationwise_top_five_cities,city_uao.population + from + city_uao order by city_uao.population desc LIMIT 5; + + +-- @Description select with between +-- + +-- Reuse the country_uao table from previous test. + +-- Using the BETWEEN clause + +--query +select * +from +country_uao +where indepyear between 1800 and 1900 +and lifeexpectancy between 70 and 80 +and gnp between 80000 and 100000; + + +-- @Description select with CASE WHEN.. ELSE +-- +DROP TABLE IF EXISTS sto_uao_emp_limit_offset; +CREATE TABLE sto_uao_emp_limit_offset ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_limit_offset values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); + + +select ename , hiredate, +CASE when hiredate < '01-01-1991' then 'Founders' +when hiredate < '01-01-1996' then 'old timer' +else 'new employee' +end as tag +from sto_uao_emp_limit_offset order by 1; + + +-- @Description select inner/right join +-- +DROP TABLE IF EXISTS sto_uao_emp_crossjoin cascade; +CREATE TABLE sto_uao_emp_crossjoin ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_crossjoin values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); + + +DROP TABLE IF EXISTS sto_uao_dept_crossjoin cascade; +CREATE TABLE sto_uao_dept_crossjoin ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); + +insert into sto_uao_dept_crossjoin values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(5,'LOGISTICS','BOSTON') +,(4, 'OPERATIONS','SEATTLE'); + +select ename,loc from sto_uao_emp_crossjoin cross join sto_uao_dept_crossjoin +order by 1 asc, 2 asc LIMIT 10; + + +-- @Description select distinct +-- +DROP TABLE IF EXISTS sto_uao_emp_seldistinct cascade; +CREATE TABLE sto_uao_emp_seldistinct ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_seldistinct values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); + + +SELECT distinct(dept) FROM sto_uao_emp_seldistinct order by dept; + + +-- @description : Create Data and execute select statements on UAO tables EXCEPT +-- +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; + +BEGIN; + +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); + +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city_uao (id, name, countrycode, district, population) FROM stdin; +3793 New York USA New York 8008278 +3794 Los Angeles USA California 3694820 +3795 Chicago USA Illinois 2896016 +3796 Houston USA Texas 1953631 +3797 Philadelphia USA Pennsylvania 1517550 +3798 Phoenix USA Arizona 1321045 +3799 San Diego USA California 1223400 +3800 Dallas USA Texas 1188580 +3801 San Antonio USA Texas 1144646 +3802 Detroit USA Michigan 951270 +3803 San Jose USA California 894943 +3804 Indianapolis USA Indiana 791926 +3805 San Francisco USA California 776733 +3806 Jacksonville USA Florida 735167 +3807 Columbus USA Ohio 711470 +3808 Austin USA Texas 656562 +3809 Baltimore USA Maryland 651154 +3810 Memphis USA Tennessee 650100 +3811 Milwaukee USA Wisconsin 596974 +3812 Boston USA Massachusetts 589141 +3813 Washington USA District of Columbia 572059 +3814 Nashville-Davidson USA Tennessee 569891 +3815 El Paso USA Texas 563662 +3816 Seattle USA Washington 563374 +3817 Denver USA Colorado 554636 +3818 Charlotte USA North Carolina 540828 +3819 Fort Worth USA Texas 534694 +3820 Portland USA Oregon 529121 +3821 Oklahoma City USA Oklahoma 506132 +3822 Tucson USA Arizona 486699 +3823 New Orleans USA Louisiana 484674 +3824 Las Vegas USA Nevada 478434 +3825 Cleveland USA Ohio 478403 +3826 Long Beach USA California 461522 +3827 Albuquerque USA New Mexico 448607 +3828 Kansas City USA Missouri 441545 +3829 Fresno USA California 427652 +3830 Virginia Beach USA Virginia 425257 +3831 Atlanta USA Georgia 416474 +3832 Sacramento USA California 407018 +3833 Oakland USA California 399484 +3834 Mesa USA Arizona 396375 +3835 Tulsa USA Oklahoma 393049 +3836 Omaha USA Nebraska 390007 +3837 Minneapolis USA Minnesota 382618 +3838 Honolulu USA Hawaii 371657 +3839 Miami USA Florida 362470 +3840 Colorado Springs USA Colorado 360890 +3841 Saint Louis USA Missouri 348189 +3842 Wichita USA Kansas 344284 +3843 Santa Ana USA California 337977 +3844 Pittsburgh USA Pennsylvania 334563 +3845 Arlington USA Texas 332969 +3846 Cincinnati USA Ohio 331285 +3847 Anaheim USA California 328014 +3848 Toledo USA Ohio 313619 +3849 Tampa USA Florida 303447 +3850 Buffalo USA New York 292648 +3851 Saint Paul USA Minnesota 287151 +3852 Corpus Christi USA Texas 277454 +3853 Aurora USA Colorado 276393 +3854 Raleigh USA North Carolina 276093 +3855 Newark USA New Jersey 273546 +3856 Lexington-Fayette USA Kentucky 260512 +3857 Anchorage USA Alaska 260283 +3858 Louisville USA Kentucky 256231 +3859 Riverside USA California 255166 +3860 Saint Petersburg USA Florida 248232 +3861 Bakersfield USA California 247057 +3862 Stockton USA California 243771 +3863 Birmingham USA Alabama 242820 +3864 Jersey City USA New Jersey 240055 +3865 Norfolk USA Virginia 234403 +3866 Baton Rouge USA Louisiana 227818 +3867 Hialeah USA Florida 226419 +3868 Lincoln USA Nebraska 225581 +3869 Greensboro USA North Carolina 223891 +3870 Plano USA Texas 222030 +3871 Rochester USA New York 219773 +3872 Glendale USA Arizona 218812 +3873 Akron USA Ohio 217074 +3874 Garland USA Texas 215768 +3875 Madison USA Wisconsin 208054 +3876 Fort Wayne USA Indiana 205727 +3877 Fremont USA California 203413 +3878 Scottsdale USA Arizona 202705 +3879 Montgomery USA Alabama 201568 +3880 Shreveport USA Louisiana 200145 +3881 Augusta-Richmond County USA Georgia 199775 +3882 Lubbock USA Texas 199564 +3883 Chesapeake USA Virginia 199184 +3884 Mobile USA Alabama 198915 +3885 Des Moines USA Iowa 198682 +3886 Grand Rapids USA Michigan 197800 +3887 Richmond USA Virginia 197790 +3888 Yonkers USA New York 196086 +3889 Spokane USA Washington 195629 +3890 Glendale USA California 194973 +3891 Tacoma USA Washington 193556 +3892 Irving USA Texas 191615 +3893 Huntington Beach USA California 189594 +3894 Modesto USA California 188856 +3895 Durham USA North Carolina 187035 +3896 Columbus USA Georgia 186291 +3897 Orlando USA Florida 185951 +3898 Boise City USA Idaho 185787 +3899 Winston-Salem USA North Carolina 185776 +3900 San Bernardino USA California 185401 +3901 Jackson USA Mississippi 184256 +3902 Little Rock USA Arkansas 183133 +3903 Salt Lake City USA Utah 181743 +3904 Reno USA Nevada 180480 +3905 Newport News USA Virginia 180150 +3906 Chandler USA Arizona 176581 +3907 Laredo USA Texas 176576 +3908 Henderson USA Nevada 175381 +3909 Arlington USA Virginia 174838 +3910 Knoxville USA Tennessee 173890 +3911 Amarillo USA Texas 173627 +3912 Providence USA Rhode Island 173618 +3913 Chula Vista USA California 173556 +3914 Worcester USA Massachusetts 172648 +3915 Oxnard USA California 170358 +3916 Dayton USA Ohio 166179 +3917 Garden Grove USA California 165196 +3918 Oceanside USA California 161029 +3919 Tempe USA Arizona 158625 +3920 Huntsville USA Alabama 158216 +3921 Ontario USA California 158007 +3922 Chattanooga USA Tennessee 155554 +3923 Fort Lauderdale USA Florida 152397 +3924 Springfield USA Massachusetts 152082 +3925 Springfield USA Missouri 151580 +3926 Santa Clarita USA California 151088 +3927 Salinas USA California 151060 +3928 Tallahassee USA Florida 150624 +3929 Rockford USA Illinois 150115 +3930 Pomona USA California 149473 +3931 Metairie USA Louisiana 149428 +3932 Paterson USA New Jersey 149222 +3933 Overland Park USA Kansas 149080 +3934 Santa Rosa USA California 147595 +3935 Syracuse USA New York 147306 +3936 Kansas City USA Kansas 146866 +3937 Hampton USA Virginia 146437 +3938 Lakewood USA Colorado 144126 +3939 Vancouver USA Washington 143560 +3940 Irvine USA California 143072 +3941 Aurora USA Illinois 142990 +3942 Moreno Valley USA California 142381 +3943 Pasadena USA California 141674 +3944 Hayward USA California 140030 +3945 Brownsville USA Texas 139722 +3946 Bridgeport USA Connecticut 139529 +3947 Hollywood USA Florida 139357 +3948 Warren USA Michigan 138247 +3949 Torrance USA California 137946 +3950 Eugene USA Oregon 137893 +3951 Pembroke Pines USA Florida 137427 +3952 Salem USA Oregon 136924 +3953 Pasadena USA Texas 133936 +3954 Escondido USA California 133559 +3955 Sunnyvale USA California 131760 +3956 Savannah USA Georgia 131510 +3957 Fontana USA California 128929 +3958 Orange USA California 128821 +3959 Naperville USA Illinois 128358 +3960 Alexandria USA Virginia 128283 +3961 Rancho Cucamonga USA California 127743 +3962 Grand Prairie USA Texas 127427 +3963 East Los Angeles USA California 126379 +3964 Fullerton USA California 126003 +3965 Corona USA California 124966 +3966 Flint USA Michigan 124943 +3967 Paradise USA Nevada 124682 +3968 Mesquite USA Texas 124523 +3969 Sterling Heights USA Michigan 124471 +3970 Sioux Falls USA South Dakota 123975 +3971 New Haven USA Connecticut 123626 +3972 Topeka USA Kansas 122377 +3973 Concord USA California 121780 +3974 Evansville USA Indiana 121582 +3975 Hartford USA Connecticut 121578 +3976 Fayetteville USA North Carolina 121015 +3977 Cedar Rapids USA Iowa 120758 +3978 Elizabeth USA New Jersey 120568 +3979 Lansing USA Michigan 119128 +3980 Lancaster USA California 118718 +3981 Fort Collins USA Colorado 118652 +3982 Coral Springs USA Florida 117549 +3983 Stamford USA Connecticut 117083 +3984 Thousand Oaks USA California 117005 +3985 Vallejo USA California 116760 +3986 Palmdale USA California 116670 +3987 Columbia USA South Carolina 116278 +3988 El Monte USA California 115965 +3989 Abilene USA Texas 115930 +3990 North Las Vegas USA Nevada 115488 +3991 Ann Arbor USA Michigan 114024 +3992 Beaumont USA Texas 113866 +3993 Waco USA Texas 113726 +3994 Macon USA Georgia 113336 +3995 Independence USA Missouri 113288 +3996 Peoria USA Illinois 112936 +3997 Inglewood USA California 112580 +3998 Springfield USA Illinois 111454 +3999 Simi Valley USA California 111351 +4000 Lafayette USA Louisiana 110257 +4001 Gilbert USA Arizona 109697 +4002 Carrollton USA Texas 109576 +4003 Bellevue USA Washington 109569 +4004 West Valley City USA Utah 108896 +4005 Clarksville USA Tennessee 108787 +4006 Costa Mesa USA California 108724 +4007 Peoria USA Arizona 108364 +4008 South Bend USA Indiana 107789 +4009 Downey USA California 107323 +4010 Waterbury USA Connecticut 107271 +4011 Manchester USA New Hampshire 107006 +4012 Allentown USA Pennsylvania 106632 +4013 McAllen USA Texas 106414 +4014 Joliet USA Illinois 106221 +4015 Lowell USA Massachusetts 105167 +4016 Provo USA Utah 105166 +4017 West Covina USA California 105080 +4018 Wichita Falls USA Texas 104197 +4019 Erie USA Pennsylvania 103717 +4020 Daly City USA California 103621 +4021 Citrus Heights USA California 103455 +4022 Norwalk USA California 103298 +4023 Gary USA Indiana 102746 +4024 Berkeley USA California 102743 +4025 Santa Clara USA California 102361 +4026 Green Bay USA Wisconsin 102313 +4027 Cape Coral USA Florida 102286 +4028 Arvada USA Colorado 102153 +4029 Pueblo USA Colorado 102121 +4030 Sandy USA Utah 101853 +4031 Athens-Clarke County USA Georgia 101489 +4032 Cambridge USA Massachusetts 101355 +4033 Westminster USA Colorado 100940 +4034 San Buenaventura USA California 100916 +4035 Portsmouth USA Virginia 100565 +4036 Livonia USA Michigan 100545 +4037 Burbank USA California 100316 +4038 Clearwater USA Florida 99936 +4039 Midland USA Texas 98293 +4040 Davenport USA Iowa 98256 +4041 Mission Viejo USA California 98049 +4042 Miami Beach USA Florida 97855 +4043 Sunrise Manor USA Nevada 95362 +4044 New Bedford USA Massachusetts 94780 +4045 El Cajon USA California 94578 +4046 Norman USA Oklahoma 94193 +4047 Richmond USA California 94100 +4048 Albany USA New York 93994 +4049 Brockton USA Massachusetts 93653 +4050 Roanoke USA Virginia 93357 +4051 Billings USA Montana 92988 +4052 Compton USA California 92864 +4053 Gainesville USA Florida 92291 +4054 Fairfield USA California 92256 +4055 Arden-Arcade USA California 92040 +4056 San Mateo USA California 91799 +4057 Visalia USA California 91762 +4058 Boulder USA Colorado 91238 +4059 Cary USA North Carolina 91213 +4060 Santa Monica USA California 91084 +4061 Fall River USA Massachusetts 90555 +4062 Kenosha USA Wisconsin 89447 +4063 Elgin USA Illinois 89408 +4064 Odessa USA Texas 89293 +4065 Carson USA California 89089 +4066 Charleston USA South Carolina 89063 +2515 Ciudad de Mexico MEX Distrito Federal 8591309 +2516 Guadalajara MEX Jalisco 1647720 +2517 Ecatepec de Morelos MEX Mexico 1620303 +2518 Puebla MEX Puebla 1346176 +2519 Nezahualcoyotl MEX Mexico 1224924 +2520 Juarez MEX Chihuahua 1217818 +2521 Tijuana MEX Baja California 1212232 +2522 Leon MEX Guanajuato 1133576 +2523 Monterrey MEX Nuevo Leon 1108499 +2524 Zapopan MEX Jalisco 1002239 +2525 Naucalpan de Juarez MEX Mexico 857511 +2526 Mexicali MEX Baja California 764902 +2527 Culiacan MEX Sinaloa 744859 +2528 Acapulco de Juarez MEX Guerrero 721011 +2529 Tlalnepantla de Baz MEX Mexico 720755 +2530 Merida MEX Yucatan 703324 +2531 Chihuahua MEX Chihuahua 670208 +2532 San Luis Potosi MEX San Luis Potosi 669353 +2533 Guadalupe MEX Nuevo Leon 668780 +2534 Toluca MEX Mexico 665617 +2535 Aguascalientes MEX Aguascalientes 643360 +2536 Queretaro MEX Queretaro de Arteaga 639839 +2537 Morelia MEX Michoacan de Ocampo 619958 +2538 Hermosillo MEX Sonora 608697 +2539 Saltillo MEX Coahuila de Zaragoza 577352 +2540 Torreon MEX Coahuila de Zaragoza 529093 +2541 Centro (Villahermosa) MEX Tabasco 519873 +2542 San Nicolas de los Garza MEX Nuevo Leon 495540 +2543 Durango MEX Durango 490524 +2544 Chimalhuacan MEX Mexico 490245 +2545 Tlaquepaque MEX Jalisco 475472 +2546 Atizapan de Zaragoza MEX Mexico 467262 +2547 Veracruz MEX Veracruz 457119 +2548 Cuautitlan Izcalli MEX Mexico 452976 +2549 Irapuato MEX Guanajuato 440039 +2550 Tuxtla Gutierrez MEX Chiapas 433544 +2551 Tultitlan MEX Mexico 432411 +2552 Reynosa MEX Tamaulipas 419776 +2553 Benito Juarez MEX Quintana Roo 419276 +2554 Matamoros MEX Tamaulipas 416428 +2555 Xalapa MEX Veracruz 390058 +2556 Celaya MEX Guanajuato 382140 +2557 Mazatlan MEX Sinaloa 380265 +2558 Ensenada MEX Baja California 369573 +2559 Ahome MEX Sinaloa 358663 +2560 Cajeme MEX Sonora 355679 +2561 Cuernavaca MEX Morelos 337966 +2562 Tonala MEX Jalisco 336109 +2563 Valle de Chalco Solidaridad MEX Mexico 323113 +2564 Nuevo Laredo MEX Tamaulipas 310277 +2565 Tepic MEX Nayarit 305025 +2566 Tampico MEX Tamaulipas 294789 +2567 Ixtapaluca MEX Mexico 293160 +2568 Apodaca MEX Nuevo Leon 282941 +2569 Guasave MEX Sinaloa 277201 +2570 Gomez Palacio MEX Durango 272806 +2571 Tapachula MEX Chiapas 271141 +2572 Nicolas Romero MEX Mexico 269393 +2573 Coatzacoalcos MEX Veracruz 267037 +2574 Uruapan MEX Michoacan de Ocampo 265211 +2575 Victoria MEX Tamaulipas 262686 +2576 Oaxaca de Juarez MEX Oaxaca 256848 +2577 Coacalco de Berriozabal MEX Mexico 252270 +2578 Pachuca de Soto MEX Hidalgo 244688 +2579 General Escobedo MEX Nuevo Leon 232961 +2580 Salamanca MEX Guanajuato 226864 +2581 Santa Catarina MEX Nuevo Leon 226573 +2582 Tehuacan MEX Puebla 225943 +2583 Chalco MEX Mexico 222201 +2584 Cardenas MEX Tabasco 216903 +2585 Campeche MEX Campeche 216735 +2586 La Paz MEX Mexico 213045 +2587 Othon P. Blanco (Chetumal) MEX Quintana Roo 208014 +2588 Texcoco MEX Mexico 203681 +2589 La Paz MEX Baja California Sur 196708 +2590 Metepec MEX Mexico 194265 +2591 Monclova MEX Coahuila de Zaragoza 193657 +2592 Huixquilucan MEX Mexico 193156 +2593 Chilpancingo de los Bravo MEX Guerrero 192509 +2594 Puerto Vallarta MEX Jalisco 183741 +2595 Fresnillo MEX Zacatecas 182744 +2596 Ciudad Madero MEX Tamaulipas 182012 +2597 Soledad de Graciano Sanchez MEX San Luis Potosi 179956 +2598 San Juan del Rio MEX Queretaro 179300 +2599 San Felipe del Progreso MEX Mexico 177330 +2600 Cordoba MEX Veracruz 176952 +2601 Tecamac MEX Mexico 172410 +2602 Ocosingo MEX Chiapas 171495 +2603 Carmen MEX Campeche 171367 +2604 Lazaro Cardenas MEX Michoacan de Ocampo 170878 +2605 Jiutepec MEX Morelos 170428 +2606 Papantla MEX Veracruz 170123 +2607 Comalcalco MEX Tabasco 164640 +2608 Zamora MEX Michoacan de Ocampo 161191 +2609 Nogales MEX Sonora 159103 +2610 Huimanguillo MEX Tabasco 158335 +2611 Cuautla MEX Morelos 153132 +2612 Minatitlan MEX Veracruz 152983 +2613 Poza Rica de Hidalgo MEX Veracruz 152678 +2614 Ciudad Valles MEX San Luis Potosi 146411 +2615 Navolato MEX Sinaloa 145396 +2616 San Luis Rio Colorado MEX Sonora 145276 +2617 Penjamo MEX Guanajuato 143927 +2618 San Andres Tuxtla MEX Veracruz 142251 +2619 Guanajuato MEX Guanajuato 141215 +2620 Navojoa MEX Sonora 140495 +2621 Zitacuaro MEX Michoacan de Ocampo 137970 +2622 Boca del Rio MEX Veracruz-Llave 135721 +2623 Allende MEX Guanajuato 134645 +2624 Silao MEX Guanajuato 134037 +2625 Macuspana MEX Tabasco 133795 +2626 San Juan Bautista Tuxtepec MEX Oaxaca 133675 +2627 San Cristobal de las Casas MEX Chiapas 132317 +2628 Valle de Santiago MEX Guanajuato 130557 +2629 Guaymas MEX Sonora 130108 +2630 Colima MEX Colima 129454 +2631 Dolores Hidalgo MEX Guanajuato 128675 +2632 Lagos de Moreno MEX Jalisco 127949 +2633 Piedras Negras MEX Coahuila de Zaragoza 127898 +2634 Altamira MEX Tamaulipas 127490 +2635 Tuxpam MEX Veracruz 126475 +2636 San Pedro Garza Garcia MEX Nuevo Leon 126147 +2637 Cuauhtemoc MEX Chihuahua 124279 +2638 Manzanillo MEX Colima 124014 +2639 Iguala de la Independencia MEX Guerrero 123883 +2640 Zacatecas MEX Zacatecas 123700 +2641 Tlajomulco de Zuaiga MEX Jalisco 123220 +2642 Tulancingo de Bravo MEX Hidalgo 121946 +2643 Zinacantepec MEX Mexico 121715 +2644 San Martin Texmelucan MEX Puebla 121093 +2645 Tepatitlan de Morelos MEX Jalisco 118948 +2646 Martinez de la Torre MEX Veracruz 118815 +2647 Orizaba MEX Veracruz 118488 +2648 Apatzingan MEX Michoacan de Ocampo 117849 +2649 Atlixco MEX Puebla 117019 +2650 Delicias MEX Chihuahua 116132 +2651 Ixtlahuaca MEX Mexico 115548 +2652 El Mante MEX Tamaulipas 112453 +2653 Lerdo MEX Durango 112272 +2654 Almoloya de Juarez MEX Mexico 110550 +2655 Acambaro MEX Guanajuato 110487 +2656 Acuaa MEX Coahuila de Zaragoza 110388 +2657 Guadalupe MEX Zacatecas 108881 +2658 Huejutla de Reyes MEX Hidalgo 108017 +2659 Hidalgo MEX Michoacan de Ocampo 106198 +2660 Los Cabos MEX Baja California Sur 105199 +2661 Comitan de Dominguez MEX Chiapas 104986 +2662 Cunduacan MEX Tabasco 104164 +2663 Rio Bravo MEX Tamaulipas 103901 +2664 Temapache MEX Veracruz 102824 +2665 Chilapa de Alvarez MEX Guerrero 102716 +2666 Hidalgo del Parral MEX Chihuahua 100881 +2667 San Francisco del Rincon MEX Guanajuato 100149 +2668 Taxco de Alarcon MEX Guerrero 99907 +2669 Zumpango MEX Mexico 99781 +2670 San Pedro Cholula MEX Puebla 99734 +2671 Lerma MEX Mexico 99714 +2672 Tecoman MEX Colima 99296 +2673 Las Margaritas MEX Chiapas 97389 +2674 Cosoleacaque MEX Veracruz 97199 +2675 San Luis de la Paz MEX Guanajuato 96763 +2676 Jose Azueta MEX Guerrero 95448 +2677 Santiago Ixcuintla MEX Nayarit 95311 +2678 San Felipe MEX Guanajuato 95305 +2679 Tejupilco MEX Mexico 94934 +2680 Tantoyuca MEX Veracruz 94709 +2681 Salvatierra MEX Guanajuato 94322 +2682 Tultepec MEX Mexico 93364 +2683 Temixco MEX Morelos 92686 +2684 Matamoros MEX Coahuila de Zaragoza 91858 +2685 Panuco MEX Veracruz 90551 +2686 El Fuerte MEX Sinaloa 89556 +2687 Tierra Blanca MEX Veracruz 89143 +1810 Montreal CAN Quebec 1016376 +1811 Calgary CAN Alberta 768082 +1812 Toronto CAN Ontario 688275 +1813 North York CAN Ontario 622632 +1814 Winnipeg CAN Manitoba 618477 +1815 Edmonton CAN Alberta 616306 +1816 Mississauga CAN Ontario 608072 +1817 Scarborough CAN Ontario 594501 +1818 Vancouver CAN British Colombia 514008 +1819 Etobicoke CAN Ontario 348845 +1820 London CAN Ontario 339917 +1821 Hamilton CAN Ontario 335614 +1822 Ottawa CAN Ontario 335277 +1823 Laval CAN Quebec 330393 +1824 Surrey CAN British Colombia 304477 +1825 Brampton CAN Ontario 296711 +1826 Windsor CAN Ontario 207588 +1827 Saskatoon CAN Saskatchewan 193647 +1828 Kitchener CAN Ontario 189959 +1829 Markham CAN Ontario 189098 +1830 Regina CAN Saskatchewan 180400 +1831 Burnaby CAN British Colombia 179209 +1832 Quebec CAN Quebec 167264 +1833 York CAN Ontario 154980 +1834 Richmond CAN British Colombia 148867 +1835 Vaughan CAN Ontario 147889 +1836 Burlington CAN Ontario 145150 +1837 Oshawa CAN Ontario 140173 +1838 Oakville CAN Ontario 139192 +1839 Saint Catharines CAN Ontario 136216 +1840 Longueuil CAN Quebec 127977 +1841 Richmond Hill CAN Ontario 116428 +1842 Thunder Bay CAN Ontario 115913 +1843 Nepean CAN Ontario 115100 +1844 Cape Breton CAN Nova Scotia 114733 +1845 East York CAN Ontario 114034 +1846 Halifax CAN Nova Scotia 113910 +1847 Cambridge CAN Ontario 109186 +1848 Gloucester CAN Ontario 107314 +1849 Abbotsford CAN British Colombia 105403 +1850 Guelph CAN Ontario 103593 +1851 Saint Johns CAN Newfoundland 101936 +1852 Coquitlam CAN British Colombia 101820 +1853 Saanich CAN British Colombia 101388 +1854 Gatineau CAN Quebec 100702 +1855 Delta CAN British Colombia 95411 +1856 Sudbury CAN Ontario 92686 +1857 Kelowna CAN British Colombia 89442 +1858 Barrie CAN Ontario 89269 +2413 La Habana CUB La Habana 2256000 +2414 Santiago de Cuba CUB Santiago de Cuba 433180 +2415 Camaguey CUB Camaguey 298726 +2416 Holguin CUB Holguin 249492 +2417 Santa Clara CUB Villa Clara 207350 +2418 Guantanamo CUB Guantanamo 205078 +2419 Pinar del Rio CUB Pinar del Rio 142100 +2420 Bayamo CUB Granma 141000 +2421 Cienfuegos CUB Cienfuegos 132770 +2422 Victoria de las Tunas CUB Las Tunas 132350 +2423 Matanzas CUB Matanzas 123273 +2424 Manzanillo CUB Granma 109350 +2425 Sancti-Spiritus CUB Sancti-Spiritus 100751 +2426 Ciego de Avila CUB Ciego de Avila 98505 +922 Ciudad de Guatemala GTM Guatemala 823301 +923 Mixco GTM Guatemala 209791 +924 Villa Nueva GTM Guatemala 101295 +925 Quetzaltenango GTM Quetzaltenango 90801 +2882 Ciudad de Panama PAN Panama 471373 +2883 San Miguelito PAN San Miguelito 315382 +190 Saint George BMU Saint Georges 1800 +191 Hamilton BMU Hamilton 1200 +184 Belize City BLZ Belize City 55810 +185 Belmopan BLZ Cayo 7105 +\. + +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM stdin WITH NULL AS ''; +CAN Canada North America North America 9970610 1867 31147000 79.400002 598862.00 625626.00 Canada Constitutional Monarchy, Federation Elisabeth II 1822 CA +MEX Mexico North America Central America 1958201 1810 98881000 71.5 414972.00 401461.00 Mexico Federal Republic Vicente Fox Quesada 2515 MX +CUB Cuba North America Caribbean 110861 1902 11201000 76.199997 17843.00 18862.00 Cuba Socialistic Republic Fidel Castro Ruz 2413 CU +GTM Guatemala North America Central America 108889 1821 11385000 66.199997 19008.00 17797.00 Guatemala Republic Alfonso Portillo Cabrera 922 GT +PAN Panama North America Central America 75517 1903 2856000 75.5 9131.00 8700.00 Panama Republic Mireya Elisa Moscoso Rodriguez 2882 PA +USA United States North America North America 9363520 1776 278357000 77.099998 8510700.00 8110900.00 United States Federal Republic George W. Bush 3813 US +BMU Bermuda North America North America 53 65000 76.900002 2328.00 2190.00 Bermuda Dependent Territory of the UK Elisabeth II 191 BM +BLZ Belize North America Central America 22696 1981 241000 70.900002 630.00 616.00 Belize Constitutional Monarchy Elisabeth II 185 BZ +\. + +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM stdin; +CAN English t 60.400002 +CAN French t 23.4 +CAN Chinese f 2.5 +CAN Italian f 1.7 +CAN German f 1.6 +CAN Polish f 0.69999999 +CAN Spanish f 0.69999999 +CAN Portuguese f 0.69999999 +CAN Punjabi f 0.69999999 +CAN Ukrainian f 0.60000002 +CAN Dutch f 0.5 +CAN Eskimo Languages f 0.1 +USA English t 86.199997 +USA Spanish f 7.5 +USA French f 0.69999999 +USA German f 0.69999999 +USA Italian f 0.60000002 +USA Chinese f 0.60000002 +USA Tagalog f 0.40000001 +USA Polish f 0.30000001 +USA Korean f 0.30000001 +USA Vietnamese f 0.2 +USA Japanese f 0.2 +USA Portuguese f 0.2 +MEX Spanish t 92.099998 +MEX Nahuatl f 1.8 +MEX Yucatec f 1.1 +MEX Zapotec f 0.60000002 +MEX Mixtec f 0.60000002 +MEX Otomi f 0.40000001 +CUB Spanish t 100 +GTM Spanish t 64.699997 +GTM Quiche f 10.1 +GTM Cakchiquel f 8.8999996 +GTM Kekchi f 4.9000001 +GTM Mam f 2.7 +PAN Spanish t 76.800003 +PAN Creole English f 14 +PAN Guaymi f 5.3000002 +PAN Cuna f 2 +PAN Embera f 0.60000002 +PAN Arabic f 0.60000002 +BMU English t 100 +BLZ English t 50.799999 +BLZ Spanish f 31.6 +BLZ Maya Languages f 9.6000004 +BLZ Garifuna f 6.8000002 +\. + +COMMIT; + +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; + +-- Using EXCEPT clause + +select * from city_uao where population > 770000 +UNION +select * from city_uao where population < 100000 +EXCEPT +select * from city_uao where countrycode in ('MEX','USA'); + + +-- @description : Create Data and execute select statements on UAO tables GROUP BY +-- +DROP TABLE IF EXISTS sto_uao_emp_groupby; +CREATE TABLE sto_uao_emp_groupby ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_groupby values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_groupby; +CREATE TABLE sto_uao_dept_groupby ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); + +insert into sto_uao_dept_groupby values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(4, 'OPERATIONS','SEATTLE'); + + +-- Simple Group by +select count(*) as num_of_emp, loc from sto_uao_dept_groupby, sto_uao_emp_groupby where sto_uao_dept_groupby.deptno = sto_uao_emp_groupby.dept group by loc order by 1 asc; +select loc ,job, sum(sal) as sum_of_salary, count(*) as num_emp from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +group by loc,job order by loc,job; + +-- Rollup + +select loc ,job,comm,sum(sal), count(*) as cnt from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +and loc in ('NEW YORK', 'ATLANTA') +group by rollup (loc,job,comm) order by loc,job,comm; + +-- Cube +select loc ,job,comm,sum(sal), count(*) as cnt from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +and loc != 'SEATTLE' +group by cube (loc,job,comm) order by loc,job,comm; + +-- grouping sets +select loc ,job,comm,sum(sal) as sum from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +group by grouping sets ((loc,job), (loc,comm)) +order by loc,job,comm; + +-- grouping set , rollup +select loc ,job, sum(sal) from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +group by grouping sets (loc, rollup (loc,job) ) +order by loc,job ; + +-- @description : Create Data and execute select statements on UAO tables HAVING +-- +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; + +BEGIN; + +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); + +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city_uao (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; + +COMMIT; + +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; + +--queries with HAVING clause + +with notdiversecountries_uao as +(select country_uao.code,country_uao.name,country_uao.capital,d.CNT + from country_uao, + (select countrylanguage_uao.countrycode,count(*) as CNT from countrylanguage_uao group by countrycode + HAVING count(*) < 3) d + where d.countrycode = country_uao.code and country_uao.gnp > 100000) + +select country_uao.name COUNTRY,city_uao.name CAPITAL,count(*) LANGCNT from +country_uao,city_uao,countrylanguage_uao +where country_uao.code = countrylanguage_uao.countrycode and country_uao.capital = city_uao.id +group by country_uao.name,city_uao.name +HAVING count(*) NOT IN (select CNT from notdiversecountries_uao where notdiversecountries_uao.name = country_uao.name) +order by country_uao.name +LIMIT 10; + + +-- @Description select inner/right join +-- +DROP TABLE IF EXISTS sto_uao_emp_rightjoin cascade; +CREATE TABLE sto_uao_emp_rightjoin ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_rightjoin values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); + +DROP TABLE IF EXISTS sto_uao_dept_rightjoin cascade; +CREATE TABLE sto_uao_dept_rightjoin ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); + +insert into sto_uao_dept_rightjoin values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(5,'LOGISTICS','BOSTON') +,(4, 'OPERATIONS','SEATTLE'); + +select ename, loc from sto_uao_emp_rightjoin left inner join sto_uao_dept_rightjoin on sto_uao_dept_rightjoin.deptno = sto_uao_emp_rightjoin.dept order by 1 asc, 2 asc; + +-- @description : Create Data and execute select statements on UAO tables INTERSECT +-- +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; + +BEGIN; + +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); + +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city_uao (id, name, countrycode, district, population) FROM stdin; +3793 New York USA New York 8008278 +3794 Los Angeles USA California 3694820 +3795 Chicago USA Illinois 2896016 +3796 Houston USA Texas 1953631 +3797 Philadelphia USA Pennsylvania 1517550 +3798 Phoenix USA Arizona 1321045 +3799 San Diego USA California 1223400 +3800 Dallas USA Texas 1188580 +3801 San Antonio USA Texas 1144646 +3802 Detroit USA Michigan 951270 +3803 San Jose USA California 894943 +3804 Indianapolis USA Indiana 791926 +3805 San Francisco USA California 776733 +3806 Jacksonville USA Florida 735167 +3807 Columbus USA Ohio 711470 +3808 Austin USA Texas 656562 +3809 Baltimore USA Maryland 651154 +3810 Memphis USA Tennessee 650100 +3811 Milwaukee USA Wisconsin 596974 +3812 Boston USA Massachusetts 589141 +3813 Washington USA District of Columbia 572059 +3814 Nashville-Davidson USA Tennessee 569891 +3815 El Paso USA Texas 563662 +3816 Seattle USA Washington 563374 +3817 Denver USA Colorado 554636 +3818 Charlotte USA North Carolina 540828 +3819 Fort Worth USA Texas 534694 +3820 Portland USA Oregon 529121 +3821 Oklahoma City USA Oklahoma 506132 +3822 Tucson USA Arizona 486699 +3823 New Orleans USA Louisiana 484674 +3824 Las Vegas USA Nevada 478434 +3825 Cleveland USA Ohio 478403 +3826 Long Beach USA California 461522 +3827 Albuquerque USA New Mexico 448607 +3828 Kansas City USA Missouri 441545 +3829 Fresno USA California 427652 +3830 Virginia Beach USA Virginia 425257 +3831 Atlanta USA Georgia 416474 +3832 Sacramento USA California 407018 +3833 Oakland USA California 399484 +3834 Mesa USA Arizona 396375 +3835 Tulsa USA Oklahoma 393049 +3836 Omaha USA Nebraska 390007 +3837 Minneapolis USA Minnesota 382618 +3838 Honolulu USA Hawaii 371657 +3839 Miami USA Florida 362470 +3840 Colorado Springs USA Colorado 360890 +3841 Saint Louis USA Missouri 348189 +3842 Wichita USA Kansas 344284 +3843 Santa Ana USA California 337977 +3844 Pittsburgh USA Pennsylvania 334563 +3845 Arlington USA Texas 332969 +3846 Cincinnati USA Ohio 331285 +3847 Anaheim USA California 328014 +3848 Toledo USA Ohio 313619 +3849 Tampa USA Florida 303447 +3850 Buffalo USA New York 292648 +3851 Saint Paul USA Minnesota 287151 +3852 Corpus Christi USA Texas 277454 +3853 Aurora USA Colorado 276393 +3854 Raleigh USA North Carolina 276093 +3855 Newark USA New Jersey 273546 +3856 Lexington-Fayette USA Kentucky 260512 +3857 Anchorage USA Alaska 260283 +3858 Louisville USA Kentucky 256231 +3859 Riverside USA California 255166 +3860 Saint Petersburg USA Florida 248232 +3861 Bakersfield USA California 247057 +3862 Stockton USA California 243771 +3863 Birmingham USA Alabama 242820 +3864 Jersey City USA New Jersey 240055 +3865 Norfolk USA Virginia 234403 +3866 Baton Rouge USA Louisiana 227818 +3867 Hialeah USA Florida 226419 +3868 Lincoln USA Nebraska 225581 +3869 Greensboro USA North Carolina 223891 +3870 Plano USA Texas 222030 +3871 Rochester USA New York 219773 +3872 Glendale USA Arizona 218812 +3873 Akron USA Ohio 217074 +3874 Garland USA Texas 215768 +3875 Madison USA Wisconsin 208054 +3876 Fort Wayne USA Indiana 205727 +3877 Fremont USA California 203413 +3878 Scottsdale USA Arizona 202705 +3879 Montgomery USA Alabama 201568 +3880 Shreveport USA Louisiana 200145 +3881 Augusta-Richmond County USA Georgia 199775 +3882 Lubbock USA Texas 199564 +3883 Chesapeake USA Virginia 199184 +3884 Mobile USA Alabama 198915 +3885 Des Moines USA Iowa 198682 +3886 Grand Rapids USA Michigan 197800 +3887 Richmond USA Virginia 197790 +3888 Yonkers USA New York 196086 +3889 Spokane USA Washington 195629 +3890 Glendale USA California 194973 +3891 Tacoma USA Washington 193556 +3892 Irving USA Texas 191615 +3893 Huntington Beach USA California 189594 +3894 Modesto USA California 188856 +3895 Durham USA North Carolina 187035 +3896 Columbus USA Georgia 186291 +3897 Orlando USA Florida 185951 +3898 Boise City USA Idaho 185787 +3899 Winston-Salem USA North Carolina 185776 +3900 San Bernardino USA California 185401 +3901 Jackson USA Mississippi 184256 +3902 Little Rock USA Arkansas 183133 +3903 Salt Lake City USA Utah 181743 +3904 Reno USA Nevada 180480 +3905 Newport News USA Virginia 180150 +3906 Chandler USA Arizona 176581 +3907 Laredo USA Texas 176576 +3908 Henderson USA Nevada 175381 +3909 Arlington USA Virginia 174838 +3910 Knoxville USA Tennessee 173890 +3911 Amarillo USA Texas 173627 +3912 Providence USA Rhode Island 173618 +3913 Chula Vista USA California 173556 +3914 Worcester USA Massachusetts 172648 +3915 Oxnard USA California 170358 +3916 Dayton USA Ohio 166179 +3917 Garden Grove USA California 165196 +3918 Oceanside USA California 161029 +3919 Tempe USA Arizona 158625 +3920 Huntsville USA Alabama 158216 +3921 Ontario USA California 158007 +3922 Chattanooga USA Tennessee 155554 +3923 Fort Lauderdale USA Florida 152397 +3924 Springfield USA Massachusetts 152082 +3925 Springfield USA Missouri 151580 +3926 Santa Clarita USA California 151088 +3927 Salinas USA California 151060 +3928 Tallahassee USA Florida 150624 +3929 Rockford USA Illinois 150115 +3930 Pomona USA California 149473 +3931 Metairie USA Louisiana 149428 +3932 Paterson USA New Jersey 149222 +3933 Overland Park USA Kansas 149080 +3934 Santa Rosa USA California 147595 +3935 Syracuse USA New York 147306 +3936 Kansas City USA Kansas 146866 +3937 Hampton USA Virginia 146437 +3938 Lakewood USA Colorado 144126 +3939 Vancouver USA Washington 143560 +3940 Irvine USA California 143072 +3941 Aurora USA Illinois 142990 +3942 Moreno Valley USA California 142381 +3943 Pasadena USA California 141674 +3944 Hayward USA California 140030 +3945 Brownsville USA Texas 139722 +3946 Bridgeport USA Connecticut 139529 +3947 Hollywood USA Florida 139357 +3948 Warren USA Michigan 138247 +3949 Torrance USA California 137946 +3950 Eugene USA Oregon 137893 +3951 Pembroke Pines USA Florida 137427 +3952 Salem USA Oregon 136924 +3953 Pasadena USA Texas 133936 +3954 Escondido USA California 133559 +3955 Sunnyvale USA California 131760 +3956 Savannah USA Georgia 131510 +3957 Fontana USA California 128929 +3958 Orange USA California 128821 +3959 Naperville USA Illinois 128358 +3960 Alexandria USA Virginia 128283 +3961 Rancho Cucamonga USA California 127743 +3962 Grand Prairie USA Texas 127427 +3963 East Los Angeles USA California 126379 +3964 Fullerton USA California 126003 +3965 Corona USA California 124966 +3966 Flint USA Michigan 124943 +3967 Paradise USA Nevada 124682 +3968 Mesquite USA Texas 124523 +3969 Sterling Heights USA Michigan 124471 +3970 Sioux Falls USA South Dakota 123975 +3971 New Haven USA Connecticut 123626 +3972 Topeka USA Kansas 122377 +3973 Concord USA California 121780 +3974 Evansville USA Indiana 121582 +3975 Hartford USA Connecticut 121578 +3976 Fayetteville USA North Carolina 121015 +3977 Cedar Rapids USA Iowa 120758 +3978 Elizabeth USA New Jersey 120568 +3979 Lansing USA Michigan 119128 +3980 Lancaster USA California 118718 +3981 Fort Collins USA Colorado 118652 +3982 Coral Springs USA Florida 117549 +3983 Stamford USA Connecticut 117083 +3984 Thousand Oaks USA California 117005 +3985 Vallejo USA California 116760 +3986 Palmdale USA California 116670 +3987 Columbia USA South Carolina 116278 +3988 El Monte USA California 115965 +3989 Abilene USA Texas 115930 +3990 North Las Vegas USA Nevada 115488 +3991 Ann Arbor USA Michigan 114024 +3992 Beaumont USA Texas 113866 +3993 Waco USA Texas 113726 +3994 Macon USA Georgia 113336 +3995 Independence USA Missouri 113288 +3996 Peoria USA Illinois 112936 +3997 Inglewood USA California 112580 +3998 Springfield USA Illinois 111454 +3999 Simi Valley USA California 111351 +4000 Lafayette USA Louisiana 110257 +4001 Gilbert USA Arizona 109697 +4002 Carrollton USA Texas 109576 +4003 Bellevue USA Washington 109569 +4004 West Valley City USA Utah 108896 +4005 Clarksville USA Tennessee 108787 +4006 Costa Mesa USA California 108724 +4007 Peoria USA Arizona 108364 +4008 South Bend USA Indiana 107789 +4009 Downey USA California 107323 +4010 Waterbury USA Connecticut 107271 +4011 Manchester USA New Hampshire 107006 +4012 Allentown USA Pennsylvania 106632 +4013 McAllen USA Texas 106414 +4014 Joliet USA Illinois 106221 +4015 Lowell USA Massachusetts 105167 +4016 Provo USA Utah 105166 +4017 West Covina USA California 105080 +4018 Wichita Falls USA Texas 104197 +4019 Erie USA Pennsylvania 103717 +4020 Daly City USA California 103621 +4021 Citrus Heights USA California 103455 +4022 Norwalk USA California 103298 +4023 Gary USA Indiana 102746 +4024 Berkeley USA California 102743 +4025 Santa Clara USA California 102361 +4026 Green Bay USA Wisconsin 102313 +4027 Cape Coral USA Florida 102286 +4028 Arvada USA Colorado 102153 +4029 Pueblo USA Colorado 102121 +4030 Sandy USA Utah 101853 +4031 Athens-Clarke County USA Georgia 101489 +4032 Cambridge USA Massachusetts 101355 +4033 Westminster USA Colorado 100940 +4034 San Buenaventura USA California 100916 +4035 Portsmouth USA Virginia 100565 +4036 Livonia USA Michigan 100545 +4037 Burbank USA California 100316 +4038 Clearwater USA Florida 99936 +4039 Midland USA Texas 98293 +4040 Davenport USA Iowa 98256 +4041 Mission Viejo USA California 98049 +4042 Miami Beach USA Florida 97855 +4043 Sunrise Manor USA Nevada 95362 +4044 New Bedford USA Massachusetts 94780 +4045 El Cajon USA California 94578 +4046 Norman USA Oklahoma 94193 +4047 Richmond USA California 94100 +4048 Albany USA New York 93994 +4049 Brockton USA Massachusetts 93653 +4050 Roanoke USA Virginia 93357 +4051 Billings USA Montana 92988 +4052 Compton USA California 92864 +4053 Gainesville USA Florida 92291 +4054 Fairfield USA California 92256 +4055 Arden-Arcade USA California 92040 +4056 San Mateo USA California 91799 +4057 Visalia USA California 91762 +4058 Boulder USA Colorado 91238 +4059 Cary USA North Carolina 91213 +4060 Santa Monica USA California 91084 +4061 Fall River USA Massachusetts 90555 +4062 Kenosha USA Wisconsin 89447 +4063 Elgin USA Illinois 89408 +4064 Odessa USA Texas 89293 +4065 Carson USA California 89089 +4066 Charleston USA South Carolina 89063 +2515 Ciudad de Mexico MEX Distrito Federal 8591309 +2516 Guadalajara MEX Jalisco 1647720 +2517 Ecatepec de Morelos MEX Mexico 1620303 +2518 Puebla MEX Puebla 1346176 +2519 Nezahualcoyotl MEX Mexico 1224924 +2520 Juarez MEX Chihuahua 1217818 +2521 Tijuana MEX Baja California 1212232 +2522 Leon MEX Guanajuato 1133576 +2523 Monterrey MEX Nuevo Leon 1108499 +2524 Zapopan MEX Jalisco 1002239 +2525 Naucalpan de Juarez MEX Mexico 857511 +2526 Mexicali MEX Baja California 764902 +2527 Culiacan MEX Sinaloa 744859 +2528 Acapulco de Juarez MEX Guerrero 721011 +2529 Tlalnepantla de Baz MEX Mexico 720755 +2530 Merida MEX Yucatan 703324 +2531 Chihuahua MEX Chihuahua 670208 +2532 San Luis Potosi MEX San Luis Potosi 669353 +2533 Guadalupe MEX Nuevo Leon 668780 +2534 Toluca MEX Mexico 665617 +2535 Aguascalientes MEX Aguascalientes 643360 +2536 Queretaro MEX Queretaro de Arteaga 639839 +2537 Morelia MEX Michoacan de Ocampo 619958 +2538 Hermosillo MEX Sonora 608697 +2539 Saltillo MEX Coahuila de Zaragoza 577352 +2540 Torreon MEX Coahuila de Zaragoza 529093 +2541 Centro (Villahermosa) MEX Tabasco 519873 +2542 San Nicolas de los Garza MEX Nuevo Leon 495540 +2543 Durango MEX Durango 490524 +2544 Chimalhuacan MEX Mexico 490245 +2545 Tlaquepaque MEX Jalisco 475472 +2546 Atizapan de Zaragoza MEX Mexico 467262 +2547 Veracruz MEX Veracruz 457119 +2548 Cuautitlan Izcalli MEX Mexico 452976 +2549 Irapuato MEX Guanajuato 440039 +2550 Tuxtla Gutierrez MEX Chiapas 433544 +2551 Tultitlan MEX Mexico 432411 +2552 Reynosa MEX Tamaulipas 419776 +2553 Benito Juarez MEX Quintana Roo 419276 +2554 Matamoros MEX Tamaulipas 416428 +2555 Xalapa MEX Veracruz 390058 +2556 Celaya MEX Guanajuato 382140 +2557 Mazatlan MEX Sinaloa 380265 +2558 Ensenada MEX Baja California 369573 +2559 Ahome MEX Sinaloa 358663 +2560 Cajeme MEX Sonora 355679 +2561 Cuernavaca MEX Morelos 337966 +2562 Tonala MEX Jalisco 336109 +2563 Valle de Chalco Solidaridad MEX Mexico 323113 +2564 Nuevo Laredo MEX Tamaulipas 310277 +2565 Tepic MEX Nayarit 305025 +2566 Tampico MEX Tamaulipas 294789 +2567 Ixtapaluca MEX Mexico 293160 +2568 Apodaca MEX Nuevo Leon 282941 +2569 Guasave MEX Sinaloa 277201 +2570 Gomez Palacio MEX Durango 272806 +2571 Tapachula MEX Chiapas 271141 +2572 Nicolas Romero MEX Mexico 269393 +2573 Coatzacoalcos MEX Veracruz 267037 +2574 Uruapan MEX Michoacan de Ocampo 265211 +2575 Victoria MEX Tamaulipas 262686 +2576 Oaxaca de Juarez MEX Oaxaca 256848 +2577 Coacalco de Berriozabal MEX Mexico 252270 +2578 Pachuca de Soto MEX Hidalgo 244688 +2579 General Escobedo MEX Nuevo Leon 232961 +2580 Salamanca MEX Guanajuato 226864 +2581 Santa Catarina MEX Nuevo Leon 226573 +2582 Tehuacan MEX Puebla 225943 +2583 Chalco MEX Mexico 222201 +2584 Cardenas MEX Tabasco 216903 +2585 Campeche MEX Campeche 216735 +2586 La Paz MEX Mexico 213045 +2587 Othon P. Blanco (Chetumal) MEX Quintana Roo 208014 +2588 Texcoco MEX Mexico 203681 +2589 La Paz MEX Baja California Sur 196708 +2590 Metepec MEX Mexico 194265 +2591 Monclova MEX Coahuila de Zaragoza 193657 +2592 Huixquilucan MEX Mexico 193156 +2593 Chilpancingo de los Bravo MEX Guerrero 192509 +2594 Puerto Vallarta MEX Jalisco 183741 +2595 Fresnillo MEX Zacatecas 182744 +2596 Ciudad Madero MEX Tamaulipas 182012 +2597 Soledad de Graciano Sanchez MEX San Luis Potosi 179956 +2598 San Juan del Rio MEX Queretaro 179300 +2599 San Felipe del Progreso MEX Mexico 177330 +2600 Cordoba MEX Veracruz 176952 +2601 Tecamac MEX Mexico 172410 +2602 Ocosingo MEX Chiapas 171495 +2603 Carmen MEX Campeche 171367 +2604 Lazaro Cardenas MEX Michoacan de Ocampo 170878 +2605 Jiutepec MEX Morelos 170428 +2606 Papantla MEX Veracruz 170123 +2607 Comalcalco MEX Tabasco 164640 +2608 Zamora MEX Michoacan de Ocampo 161191 +2609 Nogales MEX Sonora 159103 +2610 Huimanguillo MEX Tabasco 158335 +2611 Cuautla MEX Morelos 153132 +2612 Minatitlan MEX Veracruz 152983 +2613 Poza Rica de Hidalgo MEX Veracruz 152678 +2614 Ciudad Valles MEX San Luis Potosi 146411 +2615 Navolato MEX Sinaloa 145396 +2616 San Luis Rio Colorado MEX Sonora 145276 +2617 Penjamo MEX Guanajuato 143927 +2618 San Andres Tuxtla MEX Veracruz 142251 +2619 Guanajuato MEX Guanajuato 141215 +2620 Navojoa MEX Sonora 140495 +2621 Zitacuaro MEX Michoacan de Ocampo 137970 +2622 Boca del Rio MEX Veracruz-Llave 135721 +2623 Allende MEX Guanajuato 134645 +2624 Silao MEX Guanajuato 134037 +2625 Macuspana MEX Tabasco 133795 +2626 San Juan Bautista Tuxtepec MEX Oaxaca 133675 +2627 San Cristobal de las Casas MEX Chiapas 132317 +2628 Valle de Santiago MEX Guanajuato 130557 +2629 Guaymas MEX Sonora 130108 +2630 Colima MEX Colima 129454 +2631 Dolores Hidalgo MEX Guanajuato 128675 +2632 Lagos de Moreno MEX Jalisco 127949 +2633 Piedras Negras MEX Coahuila de Zaragoza 127898 +2634 Altamira MEX Tamaulipas 127490 +2635 Tuxpam MEX Veracruz 126475 +2636 San Pedro Garza Garcia MEX Nuevo Leon 126147 +2637 Cuauhtemoc MEX Chihuahua 124279 +2638 Manzanillo MEX Colima 124014 +2639 Iguala de la Independencia MEX Guerrero 123883 +2640 Zacatecas MEX Zacatecas 123700 +2641 Tlajomulco de Zuaiga MEX Jalisco 123220 +2642 Tulancingo de Bravo MEX Hidalgo 121946 +2643 Zinacantepec MEX Mexico 121715 +2644 San Martin Texmelucan MEX Puebla 121093 +2645 Tepatitlan de Morelos MEX Jalisco 118948 +2646 Martinez de la Torre MEX Veracruz 118815 +2647 Orizaba MEX Veracruz 118488 +2648 Apatzingan MEX Michoacan de Ocampo 117849 +2649 Atlixco MEX Puebla 117019 +2650 Delicias MEX Chihuahua 116132 +2651 Ixtlahuaca MEX Mexico 115548 +2652 El Mante MEX Tamaulipas 112453 +2653 Lerdo MEX Durango 112272 +2654 Almoloya de Juarez MEX Mexico 110550 +2655 Acambaro MEX Guanajuato 110487 +2656 Acuaa MEX Coahuila de Zaragoza 110388 +2657 Guadalupe MEX Zacatecas 108881 +2658 Huejutla de Reyes MEX Hidalgo 108017 +2659 Hidalgo MEX Michoacan de Ocampo 106198 +2660 Los Cabos MEX Baja California Sur 105199 +2661 Comitan de Dominguez MEX Chiapas 104986 +2662 Cunduacan MEX Tabasco 104164 +2663 Rio Bravo MEX Tamaulipas 103901 +2664 Temapache MEX Veracruz 102824 +2665 Chilapa de Alvarez MEX Guerrero 102716 +2666 Hidalgo del Parral MEX Chihuahua 100881 +2667 San Francisco del Rincon MEX Guanajuato 100149 +2668 Taxco de Alarcon MEX Guerrero 99907 +2669 Zumpango MEX Mexico 99781 +2670 San Pedro Cholula MEX Puebla 99734 +2671 Lerma MEX Mexico 99714 +2672 Tecoman MEX Colima 99296 +2673 Las Margaritas MEX Chiapas 97389 +2674 Cosoleacaque MEX Veracruz 97199 +2675 San Luis de la Paz MEX Guanajuato 96763 +2676 Jose Azueta MEX Guerrero 95448 +2677 Santiago Ixcuintla MEX Nayarit 95311 +2678 San Felipe MEX Guanajuato 95305 +2679 Tejupilco MEX Mexico 94934 +2680 Tantoyuca MEX Veracruz 94709 +2681 Salvatierra MEX Guanajuato 94322 +2682 Tultepec MEX Mexico 93364 +2683 Temixco MEX Morelos 92686 +2684 Matamoros MEX Coahuila de Zaragoza 91858 +2685 Panuco MEX Veracruz 90551 +2686 El Fuerte MEX Sinaloa 89556 +2687 Tierra Blanca MEX Veracruz 89143 +1810 Montreal CAN Quebec 1016376 +1811 Calgary CAN Alberta 768082 +1812 Toronto CAN Ontario 688275 +1813 North York CAN Ontario 622632 +1814 Winnipeg CAN Manitoba 618477 +1815 Edmonton CAN Alberta 616306 +1816 Mississauga CAN Ontario 608072 +1817 Scarborough CAN Ontario 594501 +1818 Vancouver CAN British Colombia 514008 +1819 Etobicoke CAN Ontario 348845 +1820 London CAN Ontario 339917 +1821 Hamilton CAN Ontario 335614 +1822 Ottawa CAN Ontario 335277 +1823 Laval CAN Quebec 330393 +1824 Surrey CAN British Colombia 304477 +1825 Brampton CAN Ontario 296711 +1826 Windsor CAN Ontario 207588 +1827 Saskatoon CAN Saskatchewan 193647 +1828 Kitchener CAN Ontario 189959 +1829 Markham CAN Ontario 189098 +1830 Regina CAN Saskatchewan 180400 +1831 Burnaby CAN British Colombia 179209 +1832 Quebec CAN Quebec 167264 +1833 York CAN Ontario 154980 +1834 Richmond CAN British Colombia 148867 +1835 Vaughan CAN Ontario 147889 +1836 Burlington CAN Ontario 145150 +1837 Oshawa CAN Ontario 140173 +1838 Oakville CAN Ontario 139192 +1839 Saint Catharines CAN Ontario 136216 +1840 Longueuil CAN Quebec 127977 +1841 Richmond Hill CAN Ontario 116428 +1842 Thunder Bay CAN Ontario 115913 +1843 Nepean CAN Ontario 115100 +1844 Cape Breton CAN Nova Scotia 114733 +1845 East York CAN Ontario 114034 +1846 Halifax CAN Nova Scotia 113910 +1847 Cambridge CAN Ontario 109186 +1848 Gloucester CAN Ontario 107314 +1849 Abbotsford CAN British Colombia 105403 +1850 Guelph CAN Ontario 103593 +1851 Saint Johns CAN Newfoundland 101936 +1852 Coquitlam CAN British Colombia 101820 +1853 Saanich CAN British Colombia 101388 +1854 Gatineau CAN Quebec 100702 +1855 Delta CAN British Colombia 95411 +1856 Sudbury CAN Ontario 92686 +1857 Kelowna CAN British Colombia 89442 +1858 Barrie CAN Ontario 89269 +2413 La Habana CUB La Habana 2256000 +2414 Santiago de Cuba CUB Santiago de Cuba 433180 +2415 Camaguey CUB Camaguey 298726 +2416 Holguin CUB Holguin 249492 +2417 Santa Clara CUB Villa Clara 207350 +2418 Guantanamo CUB Guantanamo 205078 +2419 Pinar del Rio CUB Pinar del Rio 142100 +2420 Bayamo CUB Granma 141000 +2421 Cienfuegos CUB Cienfuegos 132770 +2422 Victoria de las Tunas CUB Las Tunas 132350 +2423 Matanzas CUB Matanzas 123273 +2424 Manzanillo CUB Granma 109350 +2425 Sancti-Spiritus CUB Sancti-Spiritus 100751 +2426 Ciego de Avila CUB Ciego de Avila 98505 +922 Ciudad de Guatemala GTM Guatemala 823301 +923 Mixco GTM Guatemala 209791 +924 Villa Nueva GTM Guatemala 101295 +925 Quetzaltenango GTM Quetzaltenango 90801 +2882 Ciudad de Panama PAN Panama 471373 +2883 San Miguelito PAN San Miguelito 315382 +190 Saint George BMU Saint Georges 1800 +191 Hamilton BMU Hamilton 1200 +184 Belize City BLZ Belize City 55810 +185 Belmopan BLZ Cayo 7105 +\. + +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM stdin WITH NULL AS ''; +CAN Canada North America North America 9970610 1867 31147000 79.400002 598862.00 625626.00 Canada Constitutional Monarchy, Federation Elisabeth II 1822 CA +MEX Mexico North America Central America 1958201 1810 98881000 71.5 414972.00 401461.00 Mexico Federal Republic Vicente Fox Quesada 2515 MX +CUB Cuba North America Caribbean 110861 1902 11201000 76.199997 17843.00 18862.00 Cuba Socialistic Republic Fidel Castro Ruz 2413 CU +GTM Guatemala North America Central America 108889 1821 11385000 66.199997 19008.00 17797.00 Guatemala Republic Alfonso Portillo Cabrera 922 GT +PAN Panama North America Central America 75517 1903 2856000 75.5 9131.00 8700.00 Panama Republic Mireya Elisa Moscoso Rodriguez 2882 PA +USA United States North America North America 9363520 1776 278357000 77.099998 8510700.00 8110900.00 United States Federal Republic George W. Bush 3813 US +BMU Bermuda North America North America 53 65000 76.900002 2328.00 2190.00 Bermuda Dependent Territory of the UK Elisabeth II 191 BM +BLZ Belize North America Central America 22696 1981 241000 70.900002 630.00 616.00 Belize Constitutional Monarchy Elisabeth II 185 BZ +\. + +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM stdin; +CAN English t 60.400002 +CAN French t 23.4 +CAN Chinese f 2.5 +CAN Italian f 1.7 +CAN German f 1.6 +CAN Polish f 0.69999999 +CAN Spanish f 0.69999999 +CAN Portuguese f 0.69999999 +CAN Punjabi f 0.69999999 +CAN Ukrainian f 0.60000002 +CAN Dutch f 0.5 +CAN Eskimo Languages f 0.1 +USA English t 86.199997 +USA Spanish f 7.5 +USA French f 0.69999999 +USA German f 0.69999999 +USA Italian f 0.60000002 +USA Chinese f 0.60000002 +USA Tagalog f 0.40000001 +USA Polish f 0.30000001 +USA Korean f 0.30000001 +USA Vietnamese f 0.2 +USA Japanese f 0.2 +USA Portuguese f 0.2 +MEX Spanish t 92.099998 +MEX Nahuatl f 1.8 +MEX Yucatec f 1.1 +MEX Zapotec f 0.60000002 +MEX Mixtec f 0.60000002 +MEX Otomi f 0.40000001 +CUB Spanish t 100 +GTM Spanish t 64.699997 +GTM Quiche f 10.1 +GTM Cakchiquel f 8.8999996 +GTM Kekchi f 4.9000001 +GTM Mam f 2.7 +PAN Spanish t 76.800003 +PAN Creole English f 14 +PAN Guaymi f 5.3000002 +PAN Cuna f 2 +PAN Embera f 0.60000002 +PAN Arabic f 0.60000002 +BMU English t 100 +BLZ English t 50.799999 +BLZ Spanish f 31.6 +BLZ Maya Languages f 9.6000004 +BLZ Garifuna f 6.8000002 +\. + +COMMIT; + +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; + +-- Using EXCEPT clause + +select population from city_uao where countrycode = 'CAN' +INTERSECT +select population from city_uao where countrycode = 'MEX'; + + +-- @description : Create Data and execute select statements on UAO tables LIMIT OFFSET +-- +DROP TABLE IF EXISTS sto_uao_emp_limit_offset; +CREATE TABLE sto_uao_emp_limit_offset ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_limit_offset values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); + +select * from sto_uao_emp_limit_offset order by empno LIMIT 7 ; +select * from sto_uao_emp_limit_offset order by empno LIMIT 7 OFFSET 5; + + +-- @description : Create Data and execute select statements on UAO tables ORDER BY ASC DESC USING +-- +-- +DROP TABLE IF EXISTS city_uao_using cascade; +DROP TABLE IF EXISTS country_uao_using cascade; +DROP TABLE IF EXISTS countrylanguage_uao_using cascade; + +BEGIN; + +CREATE TABLE city_uao_using ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); + +CREATE TABLE country_uao_using ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +CREATE TABLE countrylanguage_uao_using ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city_uao_using (id, name, countrycode, district, population) FROM stdin; +1 Kabul AFG Kabol 1780000 +2 Qandahar AFG Qandahar 237500 +3 Herat AFG Herat 186800 +4 Mazar-e-Sharif AFG Balkh 127800 +5 Amsterdam NLD Noord-Holland 731200 +6 Rotterdam NLD Zuid-Holland 593321 +7 Haag NLD Zuid-Holland 440900 +8 Utrecht NLD Utrecht 234323 +9 Eindhoven NLD Noord-Brabant 201843 +10 Tilburg NLD Noord-Brabant 193238 +11 Groningen NLD Groningen 172701 +12 Breda NLD Noord-Brabant 160398 +13 Apeldoorn NLD Gelderland 153491 +14 Nijmegen NLD Gelderland 152463 +15 Enschede NLD Overijssel 149544 +16 Haarlem NLD Noord-Holland 148772 +17 Almere NLD Flevoland 142465 +18 Arnhem NLD Gelderland 138020 +19 Zaanstad NLD Noord-Holland 135621 +20 s-Hertogenbosch NLD Noord-Brabant 129170 +21 Amersfoort NLD Utrecht 126270 +22 Maastricht NLD Limburg 122087 +23 Dordrecht NLD Zuid-Holland 119811 +24 Leiden NLD Zuid-Holland 117196 +25 Haarlemmermeer NLD Noord-Holland 110722 +26 Zoetermeer NLD Zuid-Holland 110214 +27 Emmen NLD Drenthe 105853 +28 Zwolle NLD Overijssel 105819 +29 Ede NLD Gelderland 101574 +30 Delft NLD Zuid-Holland 95268 +31 Heerlen NLD Limburg 95052 +32 Alkmaar NLD Noord-Holland 92713 +33 Willemstad ANT Curacao 2345 +34 Tirana ALB Tirana 270000 +35 Alger DZA Alger 2168000 +36 Oran DZA Oran 609823 +37 Constantine DZA Constantine 443727 +38 Annaba DZA Annaba 222518 +39 Batna DZA Batna 183377 +40 Setif DZA Setif 179055 +41 Sidi Bel Abbes DZA Sidi Bel Abbes 153106 +42 Skikda DZA Skikda 128747 +43 Biskra DZA Biskra 128281 +44 Blida (el-Boulaida) DZA Blida 127284 +45 Bejaia DZA Bejaia 117162 +46 Mostaganem DZA Mostaganem 115212 +47 Tebessa DZA Tebessa 112007 +48 Tlemcen (Tilimsen) DZA Tlemcen 110242 +49 Bechar DZA Bechar 107311 +50 Tiaret DZA Tiaret 100118 +51 Ech-Chleff (el-Asnam) DZA Chlef 96794 +52 Ghardaia DZA Ghardaia 89415 +53 Tafuna ASM Tutuila 5200 +54 Fagatogo ASM Tutuila 2323 +55 Andorra la Vella AND Andorra la Vella 21189 +56 Luanda AGO Luanda 2022000 +57 Huambo AGO Huambo 163100 +58 Lobito AGO Benguela 130000 +59 Benguela AGO Benguela 128300 +60 Namibe AGO Namibe 118200 +61 South Hill AIA A 961 +62 The Valley AIA A 595 +63 Saint Johns ATG St John 24000 +64 Dubai ARE Dubai 669181 +65 Abu Dhabi ARE Abu Dhabi 398695 +66 Sharja ARE Sharja 320095 +67 al-Ayn ARE Abu Dhabi 225970 +68 Ajman ARE Ajman 114395 +69 Buenos Aires ARG Distrito Federal 2982146 +70 La Matanza ARG Buenos Aires 1266461 +71 Cordoba ARG Cordoba 1157507 +72 Rosario ARG Santa Fe 907718 +73 Lomas de Zamora ARG Buenos Aires 622013 +74 Quilmes ARG Buenos Aires 559249 +75 Almirante Brown ARG Buenos Aires 538918 +76 La Plata ARG Buenos Aires 521936 +77 Mar del Plata ARG Buenos Aires 512880 +78 San Miguel de Tucuman ARG Tucuman 470809 +79 Lanus ARG Buenos Aires 469735 +80 Merlo ARG Buenos Aires 463846 +81 General San Martin ARG Buenos Aires 422542 +82 Salta ARG Salta 367550 +83 Moreno ARG Buenos Aires 356993 +84 Santa Fe ARG Santa Fe 353063 +85 Avellaneda ARG Buenos Aires 353046 +86 Tres de Febrero ARG Buenos Aires 352311 +87 Moron ARG Buenos Aires 349246 +88 Florencio Varela ARG Buenos Aires 315432 +89 San Isidro ARG Buenos Aires 306341 +90 Tigre ARG Buenos Aires 296226 +91 Malvinas Argentinas ARG Buenos Aires 290335 +92 Vicente Lopez ARG Buenos Aires 288341 +93 Berazategui ARG Buenos Aires 276916 +94 Corrientes ARG Corrientes 258103 +95 San Miguel ARG Buenos Aires 248700 +96 Bahia Blanca ARG Buenos Aires 239810 +97 Esteban Echeverria ARG Buenos Aires 235760 +98 Resistencia ARG Chaco 229212 +99 Jose C. Paz ARG Buenos Aires 221754 +\. + +COPY country_uao_using (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; + +COPY countrylanguage_uao_using (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; + +COMMIT; + +ANALYZE city_uao_using; +ANALYZE country_uao_using; +ANALYZE countrylanguage_uao_using; + + +--query1 +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code asc,countrylanguage_uao_using.language asc LIMIT 10; + +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code desc, 2 desc LIMIT 10; + +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code asc,countrylanguage_uao_using.language desc LIMIT 10; + +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code using > , 2 using > LIMIT 10; + +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code USING < , 2 using < LIMIT 10; + + +-- @Description select outer/left join +-- + +DROP TABLE IF EXISTS sto_uao_emp_leftjoin cascade; +CREATE TABLE sto_uao_emp_leftjoin ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_leftjoin values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); + +DROP TABLE IF EXISTS sto_uao_dept_leftjoin cascade; +CREATE TABLE sto_uao_dept_leftjoin ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); + +insert into sto_uao_dept_leftjoin values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(5,'LOGISTICS','BOSTON') +,(4, 'OPERATIONS','SEATTLE'); + +select ename, loc from sto_uao_emp_leftjoin left join sto_uao_dept_leftjoin on sto_uao_dept_leftjoin.deptno = sto_uao_emp_leftjoin.dept order by 1 asc, 2 asc; + + +-- @Description select with subquery +-- +DROP TABLE IF EXISTS country_uao_subq cascade; + +BEGIN; + +CREATE TABLE country_uao_subq ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +COPY country_uao_subq (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; + +COMMIT; + +ANALYZE country_uao_subq; + +-- Using subquery + +select * +from +country_uao_subq +where code in (select code from country_uao_subq where gnp between 80000 and 100000) +and code in (select code from country_uao_subq where lifeexpectancy between 70 and 80) +and code in (select code from country_uao_subq where indepyear between 1800 and 1900); + + +-- @Description select with with UNION , UNION ALL +-- +DROP TABLE IF EXISTS city_uao_union cascade; +DROP TABLE IF EXISTS country_uao_union cascade; +DROP TABLE IF EXISTS countrylanguage_uao_union cascade; + +BEGIN; + +CREATE TABLE city_uao_union ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); + +CREATE TABLE country_uao_union ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +CREATE TABLE countrylanguage_uao_union ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city_uao_union (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; + +COPY country_uao_union (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; + +COPY countrylanguage_uao_union (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; + +COMMIT; + +ANALYZE city_uao_union; +ANALYZE country_uao_union; +ANALYZE countrylanguage_uao_union; + + +--queries Using Union All and except + +with somecheapasiandiversecountries_uao as +( + select FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,count(*) ASIAN_COUNT from + ( + select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate + from country_uao_union,city_uao_union + where country_uao_union.capital = city_uao_union.id + and country_uao_union.gnp < 10000 + and country_uao_union.region = 'Southeast Asia' + and country_uao_union.continent = 'Asia' + + UNION ALL + + select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate + from country_uao_union,city_uao_union + where country_uao_union.capital = city_uao_union.id + and country_uao_union.gnp < 10000 + and country_uao_union.region = 'Eastern Asia' + and country_uao_union.continent = 'Asia' + + UNION ALL + + select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate + from country_uao_union,city_uao_union + where country_uao_union.capital = city_uao_union.id + and country_uao_union.gnp < 10000 + and country_uao_union.region = 'Middle East' + and country_uao_union.continent = 'Asia' + ) FOO_uao, countrylanguage_uao_union + where FOO_uao.code = countrylanguage_uao_union.countrycode + group by FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,countrylanguage_uao_union.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country_uao_union.code from countrylanguage_uao_union,country_uao_union + where countrylanguage_uao_union.countrycode=country_uao_union.code + and country_uao_union.continent = 'Asia' + and country_uao_union.region = 'Southern and Central Asia' + group by country_uao_union.code + ) FOO1_uao + ) +) + +select FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,count(*) compared_with_cheap_asian_cnt +from +( +select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate +from country_uao_union,city_uao_union +where country_uao_union.capital = city_uao_union.id +and country_uao_union.continent = 'North America' + + +UNION ALL + +select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate +from country_uao_union,city_uao_union +where country_uao_union.capital = city_uao_union.id +and country_uao_union.continent = 'South America' + +EXCEPT +select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate +from country_uao_union,city_uao_union +where +country_uao_union.capital = city_uao_union.id +and country_uao_union.code='GTM' +) FOO_uao,countrylanguage_uao_union + +where FOO_uao.code = countrylanguage_uao_union.countrycode +group by FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries_uao,country_uao_union + where somecheapasiandiversecountries_uao.code = country_uao_union.code + and country_uao_union.gnp >= country_uao_union.gnpold + ) ASIANCOUNT + ) +order by compared_with_cheap_asian_cnt desc, 1 asc +LIMIT 10; + + +-- @Description PostgreSQL port of the MySQL "World" database. +-- +-- The sample data used in the world database is Copyright Statistics +-- Finland, http://www.stat.fi/worldinfigures. +-- + + +-- Modified to use it with GPDB + +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; + +BEGIN; + +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); + +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city_uao (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; + +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; + +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; + +COMMIT; + +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; + +-- queries with one CTE that is referenced once + +-- Using CTE in the FROM clause + + +--queries Using a CTE in the HAVING clause and Union All + + +with somecheapasiandiversecountries_uao as +( + select FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,count(*) ASIAN_COUNT from + ( + select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate + from country_uao,city_uao + where country_uao.capital = city_uao.id + and country_uao.gnp < 10000 + and country_uao.region = 'Southeast Asia' + and country_uao.continent = 'Asia' + UNION ALL + select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate + from country_uao,city_uao + where country_uao.capital = city_uao.id + and country_uao.gnp < 10000 + and country_uao.region = 'Eastern Asia' + and country_uao.continent = 'Asia' + UNION ALL + select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate + from country_uao,city_uao + where country_uao.capital = city_uao.id + and country_uao.gnp < 10000 + and country_uao.region = 'Middle East' + and country_uao.continent = 'Asia' + ) FOO_uao, countrylanguage_uao + where FOO_uao.code = countrylanguage_uao.countrycode + group by FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,countrylanguage_uao.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country_uao.code from countrylanguage_uao,country_uao + where countrylanguage_uao.countrycode=country_uao.code + and country_uao.continent = 'Asia' + and country_uao.region = 'Southern and Central Asia' + group by country_uao.code + ) FOO1_uao + ) +) +select FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,count(*) compared_with_cheap_asian_cnt +from +( +select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate +from country_uao,city_uao +where country_uao.capital = city_uao.id +and country_uao.continent = 'North America' + + +UNION ALL + +select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate +from country_uao,city_uao +where country_uao.capital = city_uao.id +and country_uao.continent = 'South America' +) FOO_uao,countrylanguage_uao + +where FOO_uao.code = countrylanguage_uao.countrycode +group by FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries_uao,country_uao + where somecheapasiandiversecountries_uao.code = country_uao.code + and country_uao.gnp >= country_uao.gnpold + ) ASIANCOUNT + ) +order by compared_with_cheap_asian_cnt desc , 1 desc +LIMIT 10; + + +-- @description : Create view and execute select from view +-- +DROP TABLE IF EXISTS sto_uao_emp_forview cascade; +CREATE TABLE sto_uao_emp_forview ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_forview values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_forview cascade; +CREATE TABLE sto_uao_dept_forview ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); + +insert into sto_uao_dept_forview values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(4, 'OPERATIONS','SEATTLE'); + + +-- Create view +create or replace view sto_uao_emp_view as +select empno,ename,job,mgr,hiredate,sal,comm,dname,loc from sto_uao_dept_forview, sto_uao_emp_forview where sto_uao_dept_forview.deptno = sto_uao_emp_forview.dept; + +select * from sto_uao_emp_view where mgr is not NULL order by 1; + +-- @Description select with where clause +-- +DROP TABLE IF EXISTS city_uao_where cascade; +DROP TABLE IF EXISTS country_uao_where cascade; +DROP TABLE IF EXISTS countrylanguage_uao_where cascade; + +BEGIN; + +CREATE TABLE city_uao_where ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); + +CREATE TABLE country_uao_where ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + +CREATE TABLE countrylanguage_uao_where ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city_uao_where (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; +COPY country_uao_where (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao_where (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; + +COMMIT; + +ANALYZE city_uao_where; +ANALYZE country_uao_where; +ANALYZE countrylanguage_uao_where; + + +-- Using WHERE clause + +with lang_total_uao as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country_uao_where.code,countrylanguage_uao_where.countrycode + from country_uao_where join countrylanguage_uao_where on (country_uao_where.code=countrylanguage_uao_where.countrycode and governmentform='Federal Republic') + group by country_uao_where.code,countrylanguage_uao_where.countrycode order by country_uao_where.code) + + UNION ALL + + ( + select count(*) as lang_count,country_uao_where.code,countrylanguage_uao_where.countrycode + from country_uao_where join countrylanguage_uao_where on (country_uao_where.code=countrylanguage_uao_where.countrycode and governmentform='Monarchy') + group by country_uao_where.code,countrylanguage_uao_where.countrycode order by country_uao_where.code) + + ) FOO1_uao +) +select * from +( +select count(*) as cnt,country_uao_where.code,country_uao_where.name +from +country_uao_where,countrylanguage_uao_where +where country_uao_where.code=countrylanguage_uao_where.countrycode group by country_uao_where.code,country_uao_where.name) AS FOO_uao +where foo_uao.cnt = (select max(lang_count) from lang_total_uao) order by foo_uao.code; + +-- @Description select wildcard +-- + +DROP TABLE IF EXISTS sto_uao_emp_wildcard cascade; +CREATE TABLE sto_uao_emp_wildcard ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); + +insert into sto_uao_emp_wildcard values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); + + +DROP TABLE IF EXISTS sto_uao_dept_wildcard cascade; +CREATE TABLE sto_uao_dept_wildcard ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); + +insert into sto_uao_dept_wildcard values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(5,'LOGISTICS','BOSTON') +,(4, 'OPERATIONS','SEATTLE'); + +select ename from sto_uao_emp_wildcard where dept in ( select deptno from sto_uao_dept_wildcard where dname like '%S') +AND ename like 'H%' order by 1 asc LIMIT 15; + +-- @Description select with window +-- + +DROP TABLE IF EXISTS uao_orders; +CREATE TABLE uao_orders(order_id serial , customer_id integer, + order_datetime timestamp, order_total numeric(10,2)); + +INSERT INTO uao_orders(customer_id, order_datetime, order_total) +VALUES (1,'2009-05-01 10:00 AM', 500), + (1,'2009-05-15 11:00 AM', 650), + (2,'2009-05-11 11:00 PM', 100), + (2,'2009-05-12 11:00 PM', 5), + (3,'2009-04-11 11:00 PM', 100), + (1,'2009-05-20 11:00 AM', 3); + +select * from uao_orders order by order_id; +SELECT row_number() OVER(window_custtime) As rtime_d, +n.customer_id, lead(order_id) OVER(window_custtime) As cr_num, n.order_id, n.order_total +FROM uao_orders AS n +WINDOW window_custtime AS (PARTITION BY n.customer_id + ORDER BY n.customer_id, n.order_id, n.order_total) +ORDER BY 1, 2; + + diff --git a/src/test/singlenode_regress/output/aocs.source b/src/test/singlenode_regress/output/aocs.source new file mode 100644 index 00000000000..9c4e5df87a6 --- /dev/null +++ b/src/test/singlenode_regress/output/aocs.source @@ -0,0 +1,1336 @@ +set client_min_messages='ERROR'; +-- test ao seg totals +create or replace function aototal(relname text) returns float8 as $$ +declare + aosegname text; + tupcount float8 := 0; + rc int := 0; +begin + + execute 'select relname from pg_class where oid=(select segrelid from pg_class, pg_appendonly where relname=''' || relname || ''' and relid = pg_class.oid)' into aosegname; + if aosegname is not null then + execute 'select sum(tupcount) from gp_dist_random(''pg_aoseg.' || aosegname || ''')' into tupcount; + end if; + return tupcount; +end; $$ language plpgsql volatile READS SQL DATA; +CREATE TABLE tenk_heap_for_aocs ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) with (appendonly=false); +-- +-- create few AO tables. test various reloptions combinations. use a sample +-- of them (the first 4) for later testing. +-- +-- valid combinations +CREATE TABLE tenk_aocs1 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, checksum=true); +CREATE TABLE tenk_aocs2 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=0, blocksize=262144); +CREATE TABLE tenk_aocs3 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=6, blocksize=1048576, checksum=true); +CREATE TABLE tenk_aocs4 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=1, compresstype=zlib); +CREATE TABLE tenk_aocs5 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=6, compresstype=zlib); +CREATE TABLE tenk_aocs6 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=6, compresstype=zlib, blocksize=1048576, checksum=true); +-- invalid combinations +-- col instead of column +CREATE TABLE tenk_aocs7 (like tenk_heap_for_aocs) with (appendonly=true, orientation=col); +ERROR: invalid parameter value for "orientation": "col" +-- no parentheses surrounding storage options +CREATE TABLE tenk_aocs8 (like tenk_heap_for_aocs) with appendonly=true, orientation=column; +ERROR: syntax error at or near "appendonly" +LINE 1: ...E TABLE tenk_aocs8 (like tenk_heap_for_aocs) with appendonly... + ^ +-- no comma separating storage options +CREATE TABLE tenk_aocs9 (like tenk_heap_for_aocs) with (appendonly=true orientation=column); +ERROR: syntax error at or near "orientation" +LINE 1: ...9 (like tenk_heap_for_aocs) with (appendonly=true orientatio... + ^ +-- appendonly=false with orientation=column should not work +CREATE TABLE tenk_aocs10 (like tenk_heap_for_aocs) with (appendonly=false, orientation=column, compresslevel=6, checksum=true); +ERROR: invalid option "orientation" for base relation +HINT: Table orientation only valid for Append Only relations, create an AO relation to use table orientation. +-- block size must be between 8KB and 2MB w/ 8KB multiple +CREATE TABLE tenk_aocs11 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, blocksize=100); +ERROR: value 100 out of bounds for option "blocksize" +DETAIL: Valid values are between "8192" and "2097152". +-- cannot have compresslevel 0 +CREATE TABLE tenk_aocs12 (like tenk_heap_for_aocs) with (appendonly=true, orientation=column, compresslevel=0, compresstype=zlib); +ERROR: compresstype "zlib" can't be used with compresslevel 0 +-- orientation=column must be combined with appendonly=true +CREATE TABLE tenk_aocs13 (like tenk_heap_for_aocs) with (orientation=column); +ERROR: invalid option "orientation" for base relation +HINT: Table orientation only valid for Append Only relations, create an AO relation to use table orientation. +-------------------- +-- catalog checks +-------------------- +-- check pg_appendonly +SELECT c.relname, a.blocksize, a.compresstype, a.compresslevel, a.checksum FROM pg_class c, pg_appendonly a WHERE c.relname LIKE 'tenk_aocs%' AND c.oid=a.relid ORDER BY c.relname; + relname | blocksize | compresstype | compresslevel | checksum +------------+-----------+--------------+---------------+---------- + tenk_aocs1 | 32768 | | 0 | t + tenk_aocs2 | 262144 | | 0 | t + tenk_aocs3 | 1048576 | zlib | 6 | t + tenk_aocs4 | 32768 | zlib | 1 | t + tenk_aocs5 | 32768 | zlib | 6 | t + tenk_aocs6 | 1048576 | zlib | 6 | t +(6 rows) + +-------------------- +-- supported sql +-------------------- +-- COPY +COPY tenk_heap_for_aocs FROM '@abs_srcdir@/data/tenk.data'; +COPY tenk_aocs1 FROM '@abs_srcdir@/data/tenk.data'; +COPY tenk_aocs2 FROM '@abs_srcdir@/data/tenk.data'; +COPY tenk_aocs3 FROM '@abs_srcdir@/data/tenk.data'; +COPY tenk_aocs4 FROM '@abs_srcdir@/data/tenk.data'; +-- SELECT +SELECT count(*) FROM tenk_heap_for_aocs; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs1; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs2; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs3; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs4; + count +------- + 10000 +(1 row) + +SELECT aototal('tenk_aocs1'), aototal('tenk_aocs2'), aototal('tenk_aocs3'), aototal('tenk_aocs4'); + aototal | aototal | aototal | aototal +---------+---------+---------+--------- + 10000 | 10000 | 10000 | 10000 +(1 row) + +-- INSERT SELECT +INSERT INTO tenk_aocs1 SELECT * FROM tenk_heap_for_aocs; +INSERT INTO tenk_aocs2 SELECT * FROM tenk_heap_for_aocs; +INSERT INTO tenk_aocs3 SELECT * FROM tenk_heap_for_aocs; +INSERT INTO tenk_aocs4 SELECT * FROM tenk_heap_for_aocs; +INSERT INTO tenk_aocs5 SELECT * FROM tenk_heap_for_aocs; +-- mix and match some +INSERT INTO tenk_aocs1 SELECT * FROM tenk_aocs1; +INSERT INTO tenk_aocs2 SELECT * FROM tenk_aocs3; +INSERT INTO tenk_aocs3 SELECT * FROM tenk_aocs2; +INSERT INTO tenk_aocs4 SELECT * FROM tenk_aocs3; +SELECT aototal('tenk_aocs1'), aototal('tenk_aocs2'), aototal('tenk_aocs3'), aototal('tenk_aocs4'); + aototal | aototal | aototal | aototal +---------+---------+---------+--------- + 40000 | 40000 | 60000 | 80000 +(1 row) + +-- SELECT +SELECT count(*) FROM tenk_heap_for_aocs; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs1; + count +------- + 40000 +(1 row) + +SELECT count(*) FROM tenk_aocs2; + count +------- + 40000 +(1 row) + +SELECT count(*) FROM tenk_aocs3; + count +------- + 60000 +(1 row) + +SELECT count(*) FROM tenk_aocs4; + count +------- + 80000 +(1 row) + +-- +-- Test that the catalog eof entry doesn't change even if the file gets +-- larger due to bad data that isn't cleaned up until the next VACUUM. +-- make sure the SELECT stops at eof (count is the same). +-- The first row is good (so it grows the file), the second is bad. +-- +COPY tenk_aocs1 FROM STDIN; +ERROR: invalid input syntax for type integer: "bad data row" +CONTEXT: COPY tenk_aocs1, line 2, column unique1: "bad data row" +COPY tenk_aocs2 FROM STDIN; +ERROR: invalid input syntax for type integer: "bad data row" +CONTEXT: COPY tenk_aocs2, line 2, column unique1: "bad data row" +COPY tenk_aocs3 FROM STDIN; +ERROR: invalid input syntax for type integer: "bad data row" +CONTEXT: COPY tenk_aocs3, line 2, column unique1: "bad data row" +COPY tenk_aocs4 FROM STDIN; +ERROR: invalid input syntax for type integer: "bad data row" +CONTEXT: COPY tenk_aocs4, line 2, column unique1: "bad data row" +SELECT count(*) FROM tenk_aocs1; + count +------- + 40000 +(1 row) + +SELECT count(*) FROM tenk_aocs2; + count +------- + 40000 +(1 row) + +SELECT count(*) FROM tenk_aocs3; + count +------- + 60000 +(1 row) + +SELECT count(*) FROM tenk_aocs4; + count +------- + 80000 +(1 row) + +SELECT aototal('tenk_aocs1'), aototal('tenk_aocs2'), aototal('tenk_aocs3'), aototal('tenk_aocs4'); + aototal | aototal | aototal | aototal +---------+---------+---------+--------- + 40000 | 40000 | 60000 | 80000 +(1 row) + +-------------------- +-- transactionality +-------------------- +-- rollback +BEGIN; +INSERT INTO tenk_aocs1 SELECT * FROM tenk_heap_for_aocs; +SELECT count(*) FROM tenk_aocs1; -- should show new count + count +------- + 50000 +(1 row) + +ROLLBACK; +SELECT count(*) FROM tenk_aocs1; -- should show previous count + count +------- + 40000 +(1 row) + +SELECT aototal('tenk_aocs1'); + aototal +--------- + 40000 +(1 row) + +-- commit +BEGIN; +INSERT INTO tenk_aocs1 SELECT * FROM tenk_heap_for_aocs; +SELECT count(*) FROM tenk_aocs1; -- should show new count + count +------- + 50000 +(1 row) + +COMMIT; +SELECT count(*) FROM tenk_aocs1; -- should show new count + count +------- + 50000 +(1 row) + +SELECT aototal('tenk_aocs1'); + aototal +--------- + 50000 +(1 row) + +-- same txn inserts +BEGIN; +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +INSERT INTO tenk_aocs1(unique1) VALUES(12345678); +ROLLBACK; +BEGIN; +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +INSERT INTO tenk_aocs1(unique1) VALUES(87654321); +COMMIT; +SELECT count(*) FROM tenk_aocs1 WHERE unique1 = 12345678; -- should be 0 + count +------- + 0 +(1 row) + +SELECT count(*) FROM tenk_aocs1 WHERE unique1 = 87654321; -- should be 5 + count +------- + 5 +(1 row) + +-------------------- +-- cursors (basic) +-------------------- +BEGIN; +DECLARE foo1 CURSOR FOR SELECT * FROM tenk_aocs1 ORDER BY 1,2,3,4; +DECLARE foo2 CURSOR FOR SELECT * FROM tenk_aocs2 ORDER BY 1,2,3,4; +FETCH 1 in foo1; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(1 row) + +FETCH 2 in foo2; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(2 rows) + +FETCH 1 in foo1; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(1 row) + +FETCH 2 in foo2; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(2 rows) + +CLOSE foo1; +CLOSE foo2; +END; +BEGIN; +DECLARE foo3 NO SCROLL CURSOR FOR SELECT * FROM tenk_aocs1 ORDER BY 1,2,3,4; +FETCH 1 FROM foo3; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(1 row) + +FETCH BACKWARD 1 FROM foo3; -- should fail +ERROR: backward scan is not supported in this version of Cloudberry Database +END; +-- Cursors outside transaction blocks +BEGIN; +DECLARE foo4 CURSOR WITH HOLD FOR SELECT * FROM tenk_aocs1 ORDER BY 1,2,3,4; +FETCH FROM foo4; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(1 row) + +FETCH FROM foo4; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(1 row) + +COMMIT; +FETCH FROM foo4; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 0 | 9998 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | AAAAAA | OUOAAA | OOOOxx +(1 row) + +SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; + name | statement | is_holdable | is_binary | is_scrollable +------+------------------------------------------------------------------------------+-------------+-----------+--------------- + foo4 | DECLARE foo4 CURSOR WITH HOLD FOR SELECT * FROM tenk_aocs1 ORDER BY 1,2,3,4; | t | f | f +(1 row) + +CLOSE foo4; +-- DROP +DROP TABLE tenk_aocs1; +DROP TABLE tenk_aocs2; +DROP TABLE tenk_aocs3; +DROP TABLE tenk_aocs4; +-- CTAS +CREATE TABLE tenk_aocs1 with(appendonly=true, orientation=column, checksum=true) AS SELECT * FROM tenk_heap_for_aocs; +CREATE TABLE tenk_aocs2 with(appendonly=true, orientation=column, compresslevel=0, blocksize=262144) AS SELECT * FROM tenk_heap_for_aocs; +CREATE TABLE tenk_aocs3 with(appendonly=true, orientation=column, compresslevel=6, blocksize=1048576, checksum=true) AS SELECT * FROM tenk_heap_for_aocs; +CREATE TABLE tenk_aocs4 with(appendonly=true, orientation=column, compresslevel=1, compresstype=zlib) AS SELECT * FROM tenk_heap_for_aocs; +SELECT c.relname, a.blocksize, a.compresstype, a.compresslevel, a.checksum FROM pg_class c, pg_appendonly a WHERE c.relname LIKE 'tenk_aocs%' AND c.oid=a.relid ORDER BY c.relname; + relname | blocksize | compresstype | compresslevel | checksum +------------+-----------+--------------+---------------+---------- + tenk_aocs1 | 32768 | | 0 | t + tenk_aocs2 | 262144 | | 0 | t + tenk_aocs3 | 1048576 | zlib | 6 | t + tenk_aocs4 | 32768 | zlib | 1 | t + tenk_aocs5 | 32768 | zlib | 6 | t + tenk_aocs6 | 1048576 | zlib | 6 | t +(6 rows) + +SELECT count(*) FROM tenk_aocs1; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs2; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs3; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs4; + count +------- + 10000 +(1 row) + +-- INHERITS +-- This used to be forbidden, but we allow it now. +CREATE TABLE aocs_inh_parent (parent_t text, + parent_t_8k text encoding (blocksize=8192)) +WITH (appendonly=true, orientation=column); +-- The storage options are not inherited, but you can specify them explicitly. +CREATE TABLE aocs_inh_child1 () +INHERITS (aocs_parent) +WITH (appendonly=true, orientation=column); +ERROR: relation "aocs_parent" does not exist +CREATE TABLE aocs_inh_child2 (parent_t text ENCODING (compresstype=zlib)) +INHERITS (aocs_inh_parent) +WITH (appendonly=true, orientation=column); +-- This syntax works even without explicitly listing the column. +CREATE TABLE aocs_inh_child3 (COLUMN parent_t ENCODING (compresstype=zlib)) +INHERITS (aocs_inh_parent) +WITH (appendonly=true, orientation=column); +SELECT c.relname, ae.attnum, ae.attoptions FROM pg_class c, pg_attribute_encoding ae WHERE c.relname LIKE 'aocs_inh%' AND c.oid=ae.attrelid ORDER BY 1,2; + relname | attnum | attoptions +-----------------+--------+----------------------------------------------------- + aocs_inh_child2 | 1 | {compresstype=none,blocksize=32768,compresslevel=0} + aocs_inh_child2 | 2 | {compresstype=none,blocksize=32768,compresslevel=0} + aocs_inh_child3 | 1 | {compresstype=zlib,compresslevel=1,blocksize=32768} + aocs_inh_child3 | 2 | {compresstype=none,blocksize=32768,compresslevel=0} + aocs_inh_parent | 1 | {compresstype=none,blocksize=32768,compresslevel=0} + aocs_inh_parent | 2 | {blocksize=8192,compresstype=none,compresslevel=0} +(6 rows) + +-- Multiple inheritance +-- The ENCODING of parent_t_8k column doesn't match that of the other parent table. +-- That's OK, because we don't try to copy the compression options from the parents. +CREATE TABLE aocs_inh_parent2 (parent_t text, + parent_t_8k text encoding (blocksize=16384), + otherparent_t_8k text encoding (blocksize=8192)) +WITH (appendonly=true, orientation=column); +CREATE TABLE aocs_inh_multichild () +INHERITS (aocs_inh_parent, aocs_inh_parent2) +WITH (appendonly=true, orientation=column); +SELECT c.relname, ae.attnum, ae.attoptions FROM pg_class c, pg_attribute_encoding ae WHERE c.relname LIKE 'aocs_inh_multi%' AND c.oid=ae.attrelid ORDER BY 1,2; + relname | attnum | attoptions +---------------------+--------+----------------------------------------------------- + aocs_inh_multichild | 1 | {compresstype=none,blocksize=32768,compresslevel=0} + aocs_inh_multichild | 2 | {compresstype=none,blocksize=32768,compresslevel=0} + aocs_inh_multichild | 3 | {compresstype=none,blocksize=32768,compresslevel=0} +(3 rows) + +-- AOCO table inherits a heap table. +CREATE TABLE aocs_inh2_parent_heap (parent_t text, parent_t2 text); +CREATE TABLE aocs_inh2_child1 () INHERITS (aocs_inh2_parent_heap) +WITH (appendonly=true, orientation=column); +CREATE TABLE aocs_inh2_child2 (COLUMN parent_t ENCODING (compresstype=zlib)) INHERITS (aocs_inh2_parent_heap) +WITH (appendonly=true, orientation=column); +SELECT c.relname, ae.attnum, ae.attoptions FROM pg_class c, pg_attribute_encoding ae WHERE c.relname LIKE 'aocs_inh2_%' AND c.oid=ae.attrelid ORDER BY 1,2; + relname | attnum | attoptions +------------------+--------+----------------------------------------------------- + aocs_inh2_child1 | 1 | {compresstype=none,blocksize=32768,compresslevel=0} + aocs_inh2_child1 | 2 | {compresstype=none,blocksize=32768,compresslevel=0} + aocs_inh2_child2 | 1 | {compresstype=zlib,compresslevel=1,blocksize=32768} + aocs_inh2_child2 | 2 | {compresstype=none,blocksize=32768,compresslevel=0} +(4 rows) + +-- don't drop the tables, to also test pg_dump & restore of them. +-- NYI +-- test get_ao_compression_ratio. use uncompressed table, so result is always 1. +-- SELECT get_ao_compression_ratio('tenk_aocs2'); +-- VACUUM +VACUUM tenk_aocs1; +VACUUM tenk_aocs2; +VACUUM tenk_aocs3; +VACUUM tenk_aocs4; +VACUUM FULL tenk_aocs1; +ANALYZE tenk_aocs2; +ANALYZE tenk_aocs4; +VACUUM ANALYZE tenk_aocs3; +SELECT count(*) FROM tenk_aocs1; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs2; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs3; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs4; + count +------- + 10000 +(1 row) + +-- LIKE +-- Should not copy storage options if not specified +CREATE TABLE tenk_like_nocopy_storage (LIKE tenk_aocs1); +SELECT count(*) FROM pg_class WHERE reloptions is not null AND relname = 'tenk_like_nocopy_storage'; + count +------- + 0 +(1 row) + +-- Check tables are truly decoupled +CREATE TABLE tenk_truly_decoupled (LIKE tenk_aocs4); +ALTER TABLE tenk_aocs4 DROP COLUMN two; +SELECT count(two) FROM tenk_truly_decoupled; + count +------- + 0 +(1 row) + +-- DOMAIN +CREATE DOMAIN aocs_domain_constraint AS VARCHAR + DEFAULT 'Default value for varchar.' + CONSTRAINT constr1 + NOT NULL + CHECK (length(VALUE) > 16 AND length(VALUE) < 50); +CREATE TABLE aocs_with_domain_constraint (id integer, vc1 aocs_domain_constraint) + WITH (appendonly=true, orientation=column); +-- The following should succeed +INSERT INTO aocs_with_domain_constraint (id, vc1) VALUES (1, 'Long enough, but not too long.;'); +INSERT INTO aocs_with_domain_constraint (id, vc1) VALUES (2, 'This is purrfect.'); +-- The following should fail +INSERT INTO aocs_with_domain_constraint (id, vc1) VALUES (3, 'Not long enough.'); +ERROR: value for domain aocs_domain_constraint violates check constraint "aocs_domain_constraint_check" +INSERT INTO aocs_with_domain_constraint (id, vc1) VALUES (4, NULL); +ERROR: domain aocs_domain_constraint does not allow null values +-- JOIN +SELECT count(*) FROM tenk_aocs1 t1, tenk_aocs2 t2 where t1.unique1 = t2.unique2; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1, tenk_heap_for_aocs t2 where t1.unique1 = t2.unique2; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 INNER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2); + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 LEFT OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2); + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 RIGHT OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2); + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 FULL OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2); + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 INNER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2) where t1.unique1 = 8095; + count +------- + 1 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 LEFT OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2) where t1.unique1 = 8095; + count +------- + 1 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 RIGHT OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2) where t1.unique1 = 8095; + count +------- + 1 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 FULL OUTER JOIN tenk_aocs2 t2 ON (t1.unique1 = t2.unique2) where t1.unique1 = 8095; + count +------- + 1 +(1 row) + +CREATE TABLE empty_aocs_table_for_join (like tenk_heap_for_aocs) with (appendonly=true, orientation=column); +SELECT count(*) FROM tenk_aocs1 t1 INNER JOIN empty_aocs_table_for_join t2 ON (t1.unique1 = t2.unique2); + count +------- + 0 +(1 row) + +SELECT count(*) FROM tenk_aocs1 t1 LEFT OUTER JOIN empty_aocs_table_for_join t2 ON (t1.unique1 = t2.unique2); + count +------- + 10000 +(1 row) + +-- EXCEPT +SELECT unique1 FROM tenk_aocs1 EXCEPT SELECT unique1 FROM tenk_aocs1; + unique1 +--------- +(0 rows) + +SELECT unique1 FROM tenk_heap_for_aocs EXCEPT SELECT unique1 FROM tenk_aocs3; + unique1 +--------- +(0 rows) + +-- TRUNCATE +TRUNCATE tenk_aocs2; +SELECT count(*) FROM tenk_aocs2; + count +------- + 0 +(1 row) + +-- INDEX +CREATE INDEX tenk_aocs1_unique1 ON tenk_aocs1 USING btree(unique1 int4_ops); +-- Verify that the visimap and block-directory indexes have unique and +-- primary key constraints on them +select indisunique, indisprimary from pg_index + where indexrelid = (select oid from pg_class where relname = 'pg_aovisimap_' || (select oid from pg_class where relname = 'tenk_aocs1') || '_index'); + indisunique | indisprimary +-------------+-------------- + t | t +(1 row) + +select indisunique, indisprimary from pg_index + where indexrelid = (select oid from pg_class where relname = 'pg_aoblkdir_' || (select oid from pg_class where relname = 'tenk_aocs1') || '_index'); + indisunique | indisprimary +-------------+-------------- + t | t +(1 row) + +drop table if exists co; +create table co (i int, j int, k varchar) with(appendonly=true, orientation=column); +insert into co values (1,1,'a'), (2,2,'aa'), (3,3,'aaa'), (4,4,'aaaa'), + (5,5,'aaaaa'), (6,6,'aaaaaa'), (7,7,'aaaaaaa'), (8,8,'aaaaaaaa'); +analyze co; +create index co_j on co using btree(j); +create index co_k on co using btree(k); +create index co_jk on co using btree((j + length(k))); +set enable_seqscan=off; +select * from co where j = 2; + i | j | k +---+---+---- + 2 | 2 | aa +(1 row) + +insert into co values (9,1,'b'), (10,2,'bb'), (11,3,'bbb'), (12,4,'bbbb'), + (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); +select * from co where j = 2; + i | j | k +----+---+---- + 2 | 2 | aa + 10 | 2 | bb +(2 rows) + +insert into co values (9,2,'b'), (10,2,'bb'), (11,2,'bbb'), (12,2,'bbbb'), + (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); +select * from co where j = 2; + i | j | k +----+---+------ + 9 | 2 | b + 11 | 2 | bbb + 2 | 2 | aa + 10 | 2 | bb + 10 | 2 | bb + 12 | 2 | bbbb +(6 rows) + +create index co_ij on co (i, j) with (fillfactor=10); +alter index co_ij set (fillfactor=20); +reindex index co_ij; +select indexname from pg_indexes where tablename = 'co' order by indexname; + indexname +----------- + co_ij + co_j + co_jk + co_k +(4 rows) + +alter table co alter j type bigint; +alter table co rename j to j_renamed; +alter table co drop column j_renamed; +select tablename, attname, avg_width, n_distinct from pg_stats where tablename = 'co' order by attname, tablename; + tablename | attname | avg_width | n_distinct +-----------+---------+-----------+------------ + co | i | 4 | -1 + co | k | 5 | -1 +(2 rows) + +create index co_i on co (i) where i = 9; +analyze co; +select tablename, attname, avg_width, n_distinct from pg_stats where tablename = 'co' order by attname, tablename; + tablename | attname | avg_width | n_distinct +-----------+---------+-----------+------------ + co | i | 4 | -0.6666667 + co | k | 5 | -0.5 +(2 rows) + +select indexname from pg_indexes where tablename = 'co' order by indexname; + indexname +----------- + co_i + co_k +(2 rows) + +select * from co where i = 9; + i | k +---+--- + 9 | b + 9 | b +(2 rows) + +alter index co_i rename to co_i_renamed; +select indexname from pg_indexes where tablename = 'co' order by indexname; + indexname +-------------- + co_i_renamed + co_k +(2 rows) + +drop index if exists co_i_renamed; +drop table if exists co; +create table co (i int, j int, k varchar) with(appendonly=true, orientation=column); +insert into co values (1,1,'a'), (2,2,'aa'), (3,3,'aaa'), (4,4,'aaaa'), + (5,5,'aaaaa'), (6,6,'aaaaaa'), (7,7,'aaaaaaa'), (8,8,'aaaaaaaa'); +create index co_j on co using bitmap(j); +create index co_k on co using bitmap(k); +create index co_jk on co using bitmap((j + length(k))); +set enable_seqscan=off; +select * from co where j = 2; + i | j | k +---+---+---- + 2 | 2 | aa +(1 row) + +insert into co values (9,1,'b'), (10,2,'bb'), (11,3,'bbb'), (12,4,'bbbb'), + (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); +select * from co where j = 2; + i | j | k +----+---+---- + 2 | 2 | aa + 10 | 2 | bb +(2 rows) + +insert into co values (9,2,'b'), (10,2,'bb'), (11,2,'bbb'), (12,2,'bbbb'), + (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa'); +select * from co where j = 2; + i | j | k +----+---+------ + 2 | 2 | aa + 10 | 2 | bb + 10 | 2 | bb + 12 | 2 | bbbb + 9 | 2 | b + 11 | 2 | bbb +(6 rows) + +-- Select specific columns. This covers the case when block directory +-- entries for only specific columns need to be loaded during index +-- scan. +select i from co where j = 2; + i +---- + 9 + 11 + 2 + 10 + 10 + 12 +(6 rows) + +select j,i from co where k = 'aaa' or k = 'bbb'; + j | i +---+---- + 3 | 3 + 3 | 11 + 2 | 11 +(3 rows) + +-- small test on a performance bug in bitmap indexes due to large tid gaps +insert into co select i, 0, 'aaaaaaa' from generate_series(1, 20) i; +insert into co select i, 1, 'aaa' from generate_series(1, 20) i; +insert into co select i, 2, 'a' from generate_series(1, 20) i; +select distinct j from co where j > -1 and j < 3 order by j; + j +--- + 0 + 1 + 2 +(3 rows) + +-- TEMP TABLES w/ INDEXES +create temp table temp_tenk_aocs5 with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + as select * from tenk_aocs5; +create index temp_even_index on temp_tenk_aocs5 (even); +select count(*) from temp_tenk_aocs5; + count +------- + 10000 +(1 row) + +select i.tablename, i.indexname, pg_get_indexdef(c.oid, 0, TRUE) from pg_indexes i join pg_class c on i.indexname=c.relname and i.tablename='temp_tenk_aocs5'; + tablename | indexname | pg_get_indexdef +-----------------+-----------------+-------------------------------------------------------------------- + temp_tenk_aocs5 | temp_even_index | CREATE INDEX temp_even_index ON temp_tenk_aocs5 USING btree (even) +(1 row) + +insert into temp_tenk_aocs5(unique1, unique2) values (99998888, 99998888); +update temp_tenk_aocs5 set unique2 = 99998889 where unique2 = 99998888; +delete from temp_tenk_aocs5 where unique2 = 99998889; +select count(*) from temp_tenk_aocs5; + count +------- + 10000 +(1 row) + +vacuum analyze temp_tenk_aocs5; +truncate table temp_tenk_aocs5; +\d temp_tenk_aocs5 + Table "pg_temp_273.temp_tenk_aocs5" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Checksum: t +Indexes: + "temp_even_index" btree (even) +Distributed by: (unique1) + +insert into temp_tenk_aocs5(unique1, unique2) values (99998888, 99998888); +select unique1 from temp_tenk_aocs5; + unique1 +---------- + 99998888 +(1 row) + +-- TEMP TABLES w/ COMMIT DROP AND USING PREPARE +begin; +prepare tenk_aocs5_prep(int4) as select * from tenk_aocs5 where unique1 > 8000; +create temp table tenk_aocs5_temp_drop with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + on commit drop as execute tenk_aocs5_prep(8095); +select count(*) from tenk_aocs5_temp_drop; + count +------- + 1999 +(1 row) + +commit; +select count(*) from tenk_aocs5_temp_drop; +ERROR: relation "tenk_aocs5_temp_drop" does not exist +LINE 1: select count(*) from tenk_aocs5_temp_drop; + ^ +-- TEMP TABLES w/ COMMIT DELETE ROWS +begin; +create temp table tenk_aocs5_temp_delete_rows with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + on commit delete rows as select * from tenk_aocs5 where unique1 > 8000; +select count(*) from tenk_aocs5_temp_delete_rows; + count +------- + 1999 +(1 row) + +commit; +select count(*) from tenk_aocs5_temp_delete_rows; + count +------- + 0 +(1 row) + +-- TEMP TABLES w/ COMMIT PRESERVE ROWS +begin; +create temp table tenk_aocs5_temp_pres_rows with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + on commit preserve rows as select * from tenk_aocs5 where unique1 > 8000; +select count(*) from tenk_aocs5_temp_pres_rows; + count +------- + 1999 +(1 row) + +commit; +select count(*) from tenk_aocs5_temp_pres_rows; + count +------- + 1999 +(1 row) + +-- RULES +insert into tenk_aocs5(unique1, unique2) values (1, 99998889); +create rule ao_rule_update as on insert to tenk_aocs5 do instead update tenk_aocs5 set two=2; +insert into tenk_aocs5(unique1, unique2) values (2, 99998889); +select distinct two from tenk_aocs5; + two +----- + 2 +(1 row) + +create rule ao_rule_delete as on update to tenk_aocs5 do instead delete from tenk_aocs5 where unique1=1; +insert into tenk_aocs5(unique1, unique2) values (3, 99998889); -- should go through both rules +select * from tenk_aocs5 where unique1=1; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- +(0 rows) + +--------------------- +-- UAO +--------------------- +-- ------------------ +-- functions for snapshotting the current mod counts, and checking the diff +-- vs last snapshot +-- ------------------ +create temp table modcounts_aocs_snapshot (segment_id int, aosegno int, column_num int2, modcount bigint); +create or replace function snapshot_aocs_modcounts(relname regclass) returns void as $$ +begin + delete from modcounts_aocs_snapshot; + + insert into modcounts_aocs_snapshot select segment_id, segno, column_num, modcount from gp_toolkit.__gp_aocsseg(relname); +end; +$$ language plpgsql volatile; +create or replace function diff_aocs_modcounts(relname regclass, segment_id out int, aosegno out int, column_num out int2, modcount_diff out bigint) returns setof record as $$ + select a.segment_id, a.segno, a.column_num, a.modcount - coalesce(b.modcount, 0) mod_diff from gp_toolkit.__gp_aocsseg($1) a left outer join modcounts_aocs_snapshot b on a.segment_id = b.segment_id and a.segno = b.aosegno and a.column_num = b.column_num; +$$ language sql; +select snapshot_aocs_modcounts('tenk_aocs1'); + snapshot_aocs_modcounts +------------------------- + +(1 row) + +-- DELETE +select count(*) from diff_aocs_modcounts('tenk_aocs1') where modcount_diff > 0; --sanity check our test function + count +------- + 0 +(1 row) + +DELETE FROM tenk_aocs1 WHERE unique1 = 1; +-- modcount after DELETE must increment to flag table should be included in +-- incremental backup +select count(*) from diff_aocs_modcounts('tenk_aocs1') where modcount_diff > 0; + count +------- + 16 +(1 row) + +-- UPDATE +select snapshot_aocs_modcounts('tenk_aocs1'); + snapshot_aocs_modcounts +------------------------- + +(1 row) + +UPDATE tenk_aocs1 SET unique2 = 1 WHERE unique2 = 2; +UPDATE tenk_aocs1 SET two = 2; +-- modcount after UPDATE must increment to flag table should be included in +-- incremental backup +select count(*) from diff_aocs_modcounts('tenk_aocs1') where modcount_diff > 0; + count +------- + 16 +(1 row) + +-------------------- +-- system columns +-------------------- +CREATE TABLE syscoltest(a int) WITH (appendonly=true, orientation=column); +INSERT INTO syscoltest VALUES(1); +SELECT ctid FROM syscoltest; + ctid +------- + (0,2) +(1 row) + +DROP TABLE syscoltest; +-------------------- +-- supported sql +-------------------- +DROP TABLE tenk_heap_for_aocs; +DROP TABLE tenk_aocs1 CASCADE; +DROP TABLE tenk_aocs2; +DROP TABLE tenk_aocs3; +DROP TABLE tenk_aocs4; +DROP TABLE tenk_aocs5; +set client_min_messages='WARNING'; +-- Test case for MPP-10086, make sure that we handle "else" clauses properly. +DROP TABLE IF EXISTS aocs_new; +CREATE TABLE aocs_new ( + a integer NOT NULL, + b character(3), + c character(4), + d character varying(250), + e character varying(100) NOT NULL, + f character(1) +) +WITH (appendonly=true, orientation=column); +COPY aocs_new (a,b,c,d,e,f) FROM stdin; +select (case when b='13' then 'replacement' else d end) as d from aocs_new order by 1; + d +------------------- + replacement + something to keep +(2 rows) + +select distinct (case when b='13' then 'replacement' else d end) as d from aocs_new where f='M' order by 1; + d +------------------- + replacement + something to keep +(2 rows) + +-- Check compression and distribution +create table aocs_compress_table (id int, v varchar) + with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); +create table aocs_compress_results(table_size int, aocs_compress_id_index_size int, aocs_compress_v_index_size int); +create index aocs_compress_id_index on aocs_compress_table (id); +create index aocs_compress_v_index on aocs_compress_table (v); +insert into aocs_compress_results values (pg_relation_size('aocs_compress_table'), pg_relation_size('aocs_compress_id_index'), pg_relation_size('aocs_compress_v_index')); +insert into aocs_compress_table (id, v) values (1, 'ifyouwantto99knowwhatist8329histhenkeepreadingit;;untilyou]findoutyoureyeshurtandyoustil0ldontknow103kwhatitisdoyouunderstandmeyetandifyoustillwanttoknowthenyoupleasekeepreading'); +insert into aocs_compress_results values (pg_relation_size('aocs_compress_table'), pg_relation_size('aocs_compress_id_index'), pg_relation_size('aocs_compress_v_index')); +select get_ao_compression_ratio('aocs_compress_table'); + get_ao_compression_ratio +-------------------------- + 1.26 +(1 row) + +-- start_ignore +select get_ao_distribution('aocs_compress_table'); + get_ao_distribution +--------------------- + (1,1) +(1 row) +-- end_ignore +truncate table aocs_compress_table; -- after truncate, reclaim space from the table and index +insert into aocs_compress_results values (pg_relation_size('aocs_compress_table'), pg_relation_size('aocs_compress_id_index'), pg_relation_size('aocs_compress_v_index')); +select count(*) from (select distinct * from aocs_compress_results) temp; -- should give 2 after reclaiming space + count +------- + 2 +(1 row) + +-- Same transaction truncate multiple times. This performs unsafe truncate means +-- direct file truncate and not flipping the relfilenode. +create table aocs_truncate_multiple_times(a int, b int) with (appendonly=true, orientation=column); +insert into aocs_truncate_multiple_times select i,i from generate_series(0, 9)i; +begin; +select * from aocs_truncate_multiple_times; + a | b +---+--- + 8 | 8 + 9 | 9 + 0 | 0 + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 +(10 rows) + +truncate table aocs_truncate_multiple_times; +select * from aocs_truncate_multiple_times; + a | b +---+--- +(0 rows) + +insert into aocs_truncate_multiple_times select i from generate_series(10, 19)i; +select * from aocs_truncate_multiple_times; + a | b +----+--- + 10 | + 11 | + 12 | + 18 | + 19 | + 13 | + 14 | + 15 | + 16 | + 17 | +(10 rows) + +truncate table aocs_truncate_multiple_times; +select * from aocs_truncate_multiple_times; + a | b +---+--- +(0 rows) + +insert into aocs_truncate_multiple_times select i,i from generate_series(20, 29)i; +select * from aocs_truncate_multiple_times; + a | b +----+---- + 28 | 28 + 29 | 29 + 23 | 23 + 24 | 24 + 25 | 25 + 26 | 26 + 27 | 27 + 20 | 20 + 21 | 21 + 22 | 22 +(10 rows) + +abort; +select * from aocs_truncate_multiple_times; + a | b +---+--- + 0 | 0 + 1 | 1 + 2 | 2 + 8 | 8 + 9 | 9 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 +(10 rows) + +-- test case for append optimized columnar bitmap scan when row level bitmap is promoted to page level +drop table if exists bms_ao_bug; +create table bms_ao_bug +(c1 int not null, +c2 int not null, +c3 char(100) not null) +with (appendonly=true, orientation=column, compresstype=zlib) +; +insert into bms_ao_bug select 1, 1, a.c1::char(100) from generate_series(1, 2000000) a(c1); +create index bms_ao_bug_ix1 on bms_ao_bug (c2); +set enable_seqscan=off; +set work_mem=256; +WARNING: "work_mem": setting is deprecated, and may be removed in a future release. +select +a.c1, +count(*) row_cnt +from bms_ao_bug a +where a.c2 = 1 +group by +a.c1 +; + c1 | row_cnt +----+--------- + 1 | 2000000 +(1 row) + +drop table bms_ao_bug; +-- When an index is created on an AOCO table, test that we correctly scan +-- all the columns that are needed to build the index. +create table aocs_index_cols (id int4, a text, b text) with (appendonly=true, orientation=column); +insert into aocs_index_cols values (1, 'foo', 'bar'); +-- Create an index on the table. This is the first index on the table, so it +-- creates the ao block directory, and scans all columns. +create index on aocs_index_cols (id); +-- Create a partial index. This index needs to scan two columns; one is used +-- as the index column, and the other in the WHERE clause. +create index on aocs_index_cols (id) WHERE a like 'f%'; +-- Also try an expression index. +create index on aocs_index_cols (length(b)); +-- Check that the row is found using all the indexes. +set enable_seqscan=off; +select * from aocs_index_cols where id = 1; + id | a | b +----+-----+----- + 1 | foo | bar +(1 row) + +select * from aocs_index_cols where a like 'f%'; + id | a | b +----+-----+----- + 1 | foo | bar +(1 row) + +select * from aocs_index_cols where length(b) = 3; + id | a | b +----+-----+----- + 1 | foo | bar +(1 row) + +reset enable_seqscan; +-- Small content as well as bulk dense content headers need to be used +-- appropriately if compression is found to be not useful. This test +-- cover a bug where only small content headers were generated in such +-- a case. +create table aocs_small_and_dense_content (a int, b int) with +(appendonly =true, orientation=column, blocksize=409600, + compresstype=rle_type, compresslevel=4); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +insert into aocs_small_and_dense_content select i,i from +generate_series(1,800000)i; +-- start_ignore +-- Inject fault on one primary segment that will cause compression to +-- be considered not useful. +select gp_inject_fault('appendonly_skip_compression', 'skip', '', '', +'aocs_small_and_dense_content', 1, -1, 0, dbid) +from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +-- end_ignore +insert into aocs_small_and_dense_content select i,i from +generate_series(1,800000)i; +-- start_ignore +select gp_wait_until_triggered_fault('appendonly_skip_compression', 1, dbid) +from gp_segment_configuration where +role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +-- end_ignore +-- This should not fail if small content or bulk dense content headers +-- are used correctly in spite of compression not possible. +select count(*) from aocs_small_and_dense_content; + count +--------- + 1600000 +(1 row) + +-- start_ignore +select gp_inject_fault('appendonly_skip_compression', 'reset', dbid) +from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +-- end_ignore +-- test truncate ao table in current transaction and sub-transaction +-- more details can look at https://github.com/greenplum-db/gpdb/issues/13699 +-- should success, create and truncate ao table in the same transaction; +begin; +create table fix_aoco_truncate_last_sequence(a int, b int) with (appendonly = true, orientation = column); +create index index_fix_aoco_truncate_last_sequence on fix_aoco_truncate_last_sequence(b); +insert into fix_aoco_truncate_last_sequence select i, i from generate_series(1, 5) i; +select count(*) from fix_aoco_truncate_last_sequence; + count +------- + 5 +(1 row) + +truncate table fix_aoco_truncate_last_sequence; +select count(*) from fix_aoco_truncate_last_sequence; + count +------- + 0 +(1 row) + +abort; +-- should success, create and truncate ao table in the different transaction, +-- and create index for it. +begin; +create table fix_aoco_truncate_last_sequence(a int, b int) with (appendonly = true, orientation = column); +create index index_fix_aoco_truncate_last_sequence on fix_aoco_truncate_last_sequence(b); +insert into fix_aoco_truncate_last_sequence select i, i from generate_series(1, 5) i; +select count(*) from fix_aoco_truncate_last_sequence; + count +------- + 5 +(1 row) + +savepoint s1; +truncate table fix_aoco_truncate_last_sequence; +insert into fix_aoco_truncate_last_sequence select 1, 1 from generate_series(1, 10); +select count(*) from fix_aoco_truncate_last_sequence; + count +------- + 10 +(1 row) + +rollback to s1; +select count(*) from fix_aoco_truncate_last_sequence; + count +------- + 5 +(1 row) + +truncate table fix_aoco_truncate_last_sequence; +insert into fix_aoco_truncate_last_sequence select 1, 1 from generate_series(1, 5); +select count(*) from fix_aoco_truncate_last_sequence; + count +------- + 5 +(1 row) + +abort; diff --git a/src/test/singlenode_regress/output/constraints.source b/src/test/singlenode_regress/output/constraints.source new file mode 100644 index 00000000000..eff793cc3d3 --- /dev/null +++ b/src/test/singlenode_regress/output/constraints.source @@ -0,0 +1,738 @@ +-- +-- CONSTRAINTS +-- Constraints can be specified with: +-- - DEFAULT clause +-- - CHECK clauses +-- - PRIMARY KEY clauses +-- - UNIQUE clauses +-- - EXCLUDE clauses +-- +-- +-- DEFAULT syntax +-- +CREATE TABLE DEFAULT_TBL (i int DEFAULT 100, + x text DEFAULT 'vadim', f float8 DEFAULT 123.456); +INSERT INTO DEFAULT_TBL VALUES (1, 'thomas', 57.0613); +INSERT INTO DEFAULT_TBL VALUES (1, 'bruce'); +INSERT INTO DEFAULT_TBL (i, f) VALUES (2, 987.654); +INSERT INTO DEFAULT_TBL (x) VALUES ('marc'); +INSERT INTO DEFAULT_TBL VALUES (3, null, 1.0); +SELECT * FROM DEFAULT_TBL; + i | x | f +-----+--------+--------- + 1 | thomas | 57.0613 + 1 | bruce | 123.456 + 2 | vadim | 987.654 + 100 | marc | 123.456 + 3 | | 1 +(5 rows) + +CREATE SEQUENCE DEFAULT_SEQ; +CREATE TABLE DEFAULTEXPR_TBL (i1 int DEFAULT 100 + (200-199) * 2, + i2 int DEFAULT nextval('default_seq')); +INSERT INTO DEFAULTEXPR_TBL VALUES (-1, -2); +INSERT INTO DEFAULTEXPR_TBL (i1) VALUES (-3); +INSERT INTO DEFAULTEXPR_TBL (i2) VALUES (-4); +INSERT INTO DEFAULTEXPR_TBL (i2) VALUES (NULL); +SELECT * FROM DEFAULTEXPR_TBL; + i1 | i2 +-----+---- + -1 | -2 + -3 | 1 + 102 | -4 + 102 | +(4 rows) + +-- syntax errors +-- test for extraneous comma +CREATE TABLE error_tbl (i int DEFAULT (100, )); +ERROR: syntax error at or near ")" +LINE 1: CREATE TABLE error_tbl (i int DEFAULT (100, )); + ^ +-- this will fail because gram.y uses b_expr not a_expr for defaults, +-- to avoid a shift/reduce conflict that arises from NOT NULL being +-- part of the column definition syntax: +CREATE TABLE error_tbl (b1 bool DEFAULT 1 IN (1, 2)); +ERROR: syntax error at or near "IN" +LINE 1: CREATE TABLE error_tbl (b1 bool DEFAULT 1 IN (1, 2)); + ^ +-- this should work, however: +CREATE TABLE error_tbl (b1 bool DEFAULT (1 IN (1, 2))); +DROP TABLE error_tbl; +-- +-- CHECK syntax +-- +CREATE TABLE CHECK_TBL (x int, + CONSTRAINT CHECK_CON CHECK (x > 3)); +INSERT INTO CHECK_TBL VALUES (5); +INSERT INTO CHECK_TBL VALUES (4); +INSERT INTO CHECK_TBL VALUES (3); +ERROR: new row for relation "check_tbl" violates check constraint "check_con" +DETAIL: Failing row contains (3). +INSERT INTO CHECK_TBL VALUES (2); +ERROR: new row for relation "check_tbl" violates check constraint "check_con" +DETAIL: Failing row contains (2). +INSERT INTO CHECK_TBL VALUES (6); +INSERT INTO CHECK_TBL VALUES (1); +ERROR: new row for relation "check_tbl" violates check constraint "check_con" +DETAIL: Failing row contains (1). +SELECT * FROM CHECK_TBL; + x +--- + 5 + 4 + 6 +(3 rows) + +CREATE SEQUENCE CHECK_SEQ; +CREATE TABLE CHECK2_TBL (x int, y text, z int, + CONSTRAINT SEQUENCE_CON + CHECK (x > 3 and y <> 'check failed' and z < 8)); +INSERT INTO CHECK2_TBL VALUES (4, 'check ok', -2); +INSERT INTO CHECK2_TBL VALUES (1, 'x check failed', -2); +ERROR: new row for relation "check2_tbl" violates check constraint "sequence_con" +DETAIL: Failing row contains (1, x check failed, -2). +INSERT INTO CHECK2_TBL VALUES (5, 'z check failed', 10); +ERROR: new row for relation "check2_tbl" violates check constraint "sequence_con" +DETAIL: Failing row contains (5, z check failed, 10). +INSERT INTO CHECK2_TBL VALUES (0, 'check failed', -2); +ERROR: new row for relation "check2_tbl" violates check constraint "sequence_con" +DETAIL: Failing row contains (0, check failed, -2). +INSERT INTO CHECK2_TBL VALUES (6, 'check failed', 11); +ERROR: new row for relation "check2_tbl" violates check constraint "sequence_con" +DETAIL: Failing row contains (6, check failed, 11). +INSERT INTO CHECK2_TBL VALUES (7, 'check ok', 7); +SELECT * from CHECK2_TBL; + x | y | z +---+----------+---- + 4 | check ok | -2 + 7 | check ok | 7 +(2 rows) + +-- +-- Check constraints on INSERT +-- +CREATE SEQUENCE INSERT_SEQ; +CREATE TABLE INSERT_TBL (x INT DEFAULT nextval('insert_seq'), + y TEXT DEFAULT '-NULL-', + z INT DEFAULT -1 * currval('insert_seq'), + CONSTRAINT INSERT_TBL_CON CHECK (x >= 3 AND y <> 'check failed' AND x < 8), + CHECK (x + z = 0)); +INSERT INTO INSERT_TBL(x,z) VALUES (2, -2); +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_con" +DETAIL: Failing row contains (2, -NULL-, -2). +SELECT * FROM INSERT_TBL; + x | y | z +---+---+--- +(0 rows) + +SELECT 'one' AS one, nextval('insert_seq'); + one | nextval +-----+--------- + one | 1 +(1 row) + +INSERT INTO INSERT_TBL(y) VALUES ('Y'); +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_con" +DETAIL: Failing row contains (2, Y, -2). +INSERT INTO INSERT_TBL(y) VALUES ('Y'); +INSERT INTO INSERT_TBL(x,z) VALUES (1, -2); +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_check" +DETAIL: Failing row contains (1, -NULL-, -2). +INSERT INTO INSERT_TBL(z,x) VALUES (-7, 7); +INSERT INTO INSERT_TBL VALUES (5, 'check failed', -5); +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_con" +DETAIL: Failing row contains (5, check failed, -5). +INSERT INTO INSERT_TBL VALUES (7, '!check failed', -7); +INSERT INTO INSERT_TBL(y) VALUES ('-!NULL-'); +SELECT * FROM INSERT_TBL; + x | y | z +---+---------------+---- + 3 | Y | -3 + 7 | -NULL- | -7 + 7 | !check failed | -7 + 4 | -!NULL- | -4 +(4 rows) + +INSERT INTO INSERT_TBL(y,z) VALUES ('check failed', 4); +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_check" +DETAIL: Failing row contains (5, check failed, 4). +INSERT INTO INSERT_TBL(x,y) VALUES (5, 'check failed'); +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_con" +DETAIL: Failing row contains (5, check failed, -5). +INSERT INTO INSERT_TBL(x,y) VALUES (5, '!check failed'); +INSERT INTO INSERT_TBL(y) VALUES ('-!NULL-'); +SELECT * FROM INSERT_TBL; + x | y | z +---+---------------+---- + 3 | Y | -3 + 7 | -NULL- | -7 + 7 | !check failed | -7 + 4 | -!NULL- | -4 + 5 | !check failed | -5 + 6 | -!NULL- | -6 +(6 rows) + +SELECT 'seven' AS one, nextval('insert_seq'); + one | nextval +-------+--------- + seven | 7 +(1 row) + +INSERT INTO INSERT_TBL(y) VALUES ('Y'); +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_con" +DETAIL: Failing row contains (8, Y, -8). +SELECT 'eight' AS one, currval('insert_seq'); + one | currval +-------+--------- + eight | 8 +(1 row) + +-- According to SQL, it is OK to insert a record that gives rise to NULL +-- constraint-condition results. Postgres used to reject this, but it +-- was wrong: +INSERT INTO INSERT_TBL VALUES (null, null, null); +SELECT * FROM INSERT_TBL; + x | y | z +---+---------------+---- + 3 | Y | -3 + 7 | -NULL- | -7 + 7 | !check failed | -7 + 4 | -!NULL- | -4 + 5 | !check failed | -5 + 6 | -!NULL- | -6 + | | +(7 rows) + +-- +-- Check constraints on system columns +-- +CREATE TABLE SYS_COL_CHECK_TBL (city text, state text, is_capital bool, + altitude int, + CHECK (NOT (is_capital AND tableoid::regclass::text = 'sys_col_check_tbl'))); +INSERT INTO SYS_COL_CHECK_TBL VALUES ('Seattle', 'Washington', false, 100); +INSERT INTO SYS_COL_CHECK_TBL VALUES ('Olympia', 'Washington', true, 100); +ERROR: new row for relation "sys_col_check_tbl" violates check constraint "sys_col_check_tbl_check" +DETAIL: Failing row contains (Olympia, Washington, t, 100). +SELECT *, tableoid::regclass::text FROM SYS_COL_CHECK_TBL; + city | state | is_capital | altitude | tableoid +---------+------------+------------+----------+------------------- + Seattle | Washington | f | 100 | sys_col_check_tbl +(1 row) + +DROP TABLE SYS_COL_CHECK_TBL; +-- +-- Check constraints on system columns other then TableOid should return error +-- +CREATE TABLE SYS_COL_CHECK_TBL (city text, state text, is_capital bool, + altitude int, + CHECK (NOT (is_capital AND ctid::text = 'sys_col_check_tbl'))); +ERROR: system column "ctid" reference in check constraint is invalid +LINE 3: CHECK (NOT (is_capital AND ctid::text = 'sys_col_check... + ^ +-- +-- Check inheritance of defaults and constraints +-- +CREATE TABLE INSERT_CHILD (cx INT default 42, + cy INT CHECK (cy > x)) + INHERITS (INSERT_TBL); +INSERT INTO INSERT_CHILD(x,z,cy) VALUES (7,-7,11); +INSERT INTO INSERT_CHILD(x,z,cy) VALUES (7,-7,6); +ERROR: new row for relation "insert_child" violates check constraint "insert_child_check" +DETAIL: Failing row contains (7, -NULL-, -7, 42, 6). +INSERT INTO INSERT_CHILD(x,z,cy) VALUES (6,-7,7); +ERROR: new row for relation "insert_child" violates check constraint "insert_tbl_check" +DETAIL: Failing row contains (6, -NULL-, -7, 42, 7). +INSERT INTO INSERT_CHILD(x,y,z,cy) VALUES (6,'check failed',-6,7); +ERROR: new row for relation "insert_child" violates check constraint "insert_tbl_con" +DETAIL: Failing row contains (6, check failed, -6, 42, 7). +SELECT * FROM INSERT_CHILD; + x | y | z | cx | cy +---+--------+----+----+---- + 7 | -NULL- | -7 | 42 | 11 +(1 row) + +DROP TABLE INSERT_CHILD; +-- +-- Check NO INHERIT type of constraints and inheritance +-- +CREATE TABLE ATACC1 (TEST INT + CHECK (TEST > 0) NO INHERIT); +CREATE TABLE ATACC2 (TEST2 INT) INHERITS (ATACC1); +-- check constraint is not there on child +INSERT INTO ATACC2 (TEST) VALUES (-3); +-- check constraint is there on parent +INSERT INTO ATACC1 (TEST) VALUES (-3); +ERROR: new row for relation "atacc1" violates check constraint "atacc1_test_check" +DETAIL: Failing row contains (-3). +DROP TABLE ATACC1 CASCADE; +NOTICE: drop cascades to table atacc2 +CREATE TABLE ATACC1 (TEST INT, TEST2 INT + CHECK (TEST > 0), CHECK (TEST2 > 10) NO INHERIT); +CREATE TABLE ATACC2 () INHERITS (ATACC1); +-- check constraint is there on child +INSERT INTO ATACC2 (TEST) VALUES (-3); +ERROR: new row for relation "atacc2" violates check constraint "atacc1_test_check" +DETAIL: Failing row contains (-3, null). +-- check constraint is there on parent +INSERT INTO ATACC1 (TEST) VALUES (-3); +ERROR: new row for relation "atacc1" violates check constraint "atacc1_test_check" +DETAIL: Failing row contains (-3, null). +-- check constraint is not there on child +INSERT INTO ATACC2 (TEST2) VALUES (3); +-- check constraint is there on parent +INSERT INTO ATACC1 (TEST2) VALUES (3); +ERROR: new row for relation "atacc1" violates check constraint "atacc1_test2_check" +DETAIL: Failing row contains (null, 3). +DROP TABLE ATACC1 CASCADE; +NOTICE: drop cascades to table atacc2 +-- +-- Check constraints on INSERT INTO +-- +DELETE FROM INSERT_TBL; +ALTER SEQUENCE INSERT_SEQ RESTART WITH 4; +CREATE TEMP TABLE tmp (xd INT, yd TEXT, zd INT); +INSERT INTO tmp VALUES (null, 'Y', null); +INSERT INTO tmp VALUES (5, '!check failed', null); +INSERT INTO tmp VALUES (null, 'try again', null); +INSERT INTO INSERT_TBL(y) select yd from tmp; +SELECT * FROM INSERT_TBL; + x | y | z +---+---------------+---- + 4 | Y | -4 + 5 | !check failed | -5 + 6 | try again | -6 +(3 rows) + +INSERT INTO INSERT_TBL SELECT * FROM tmp WHERE yd = 'try again'; +INSERT INTO INSERT_TBL(y,z) SELECT yd, -7 FROM tmp WHERE yd = 'try again'; +INSERT INTO INSERT_TBL(y,z) SELECT yd, -8 FROM tmp WHERE yd = 'try again'; +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_con" +DETAIL: Failing row contains (8, try again, -8). +SELECT * FROM INSERT_TBL; + x | y | z +---+---------------+---- + 4 | Y | -4 + 5 | !check failed | -5 + 6 | try again | -6 + | try again | + 7 | try again | -7 +(5 rows) + +DROP TABLE tmp; +-- +-- Check constraints on UPDATE +-- +UPDATE INSERT_TBL SET x = NULL WHERE x = 5; +UPDATE INSERT_TBL SET x = 6 WHERE x = 6; +UPDATE INSERT_TBL SET x = -z, z = -x; +UPDATE INSERT_TBL SET x = z, z = x; +ERROR: new row for relation "insert_tbl" violates check constraint "insert_tbl_con" +DETAIL: Failing row contains (-4, Y, 4). +SELECT * FROM INSERT_TBL; + x | y | z +---+---------------+---- + 4 | Y | -4 + | try again | + 7 | try again | -7 + 5 | !check failed | + 6 | try again | -6 +(5 rows) + +-- DROP TABLE INSERT_TBL; +-- +-- Check constraints on COPY FROM +-- +CREATE TABLE COPY_TBL (x INT, y TEXT, z INT, + CONSTRAINT COPY_CON + CHECK (x > 3 AND y <> 'check failed' AND x < 7 )); +COPY COPY_TBL FROM '@abs_srcdir@/data/constro.data'; +SELECT * FROM COPY_TBL; + x | y | z +---+---------------+--- + 4 | !check failed | 5 + 6 | OK | 4 +(2 rows) + +COPY COPY_TBL FROM '@abs_srcdir@/data/constrf.data'; +ERROR: new row for relation "copy_tbl" violates check constraint "copy_con" +DETAIL: Failing row contains (7, check failed, 6). +CONTEXT: COPY copy_tbl, line 2: "7 check failed 6" +SELECT * FROM COPY_TBL; + x | y | z +---+---------------+--- + 4 | !check failed | 5 + 6 | OK | 4 +(2 rows) + +-- +-- Primary keys +-- +CREATE TABLE PRIMARY_TBL (i int PRIMARY KEY, t text); +INSERT INTO PRIMARY_TBL VALUES (1, 'one'); +INSERT INTO PRIMARY_TBL VALUES (2, 'two'); +INSERT INTO PRIMARY_TBL VALUES (1, 'three'); +ERROR: duplicate key value violates unique constraint "primary_tbl_pkey" +DETAIL: Key (i)=(1) already exists. +INSERT INTO PRIMARY_TBL VALUES (4, 'three'); +INSERT INTO PRIMARY_TBL VALUES (5, 'one'); +INSERT INTO PRIMARY_TBL (t) VALUES ('six'); +ERROR: null value in column "i" of relation "primary_tbl" violates not-null constraint +DETAIL: Failing row contains (null, six). +SELECT * FROM PRIMARY_TBL; + i | t +---+------- + 1 | one + 2 | two + 4 | three + 5 | one +(4 rows) + +DROP TABLE PRIMARY_TBL; +CREATE TABLE PRIMARY_TBL (i int, t text, + PRIMARY KEY(i,t)); +INSERT INTO PRIMARY_TBL VALUES (1, 'one'); +INSERT INTO PRIMARY_TBL VALUES (2, 'two'); +INSERT INTO PRIMARY_TBL VALUES (1, 'three'); +INSERT INTO PRIMARY_TBL VALUES (4, 'three'); +INSERT INTO PRIMARY_TBL VALUES (5, 'one'); +INSERT INTO PRIMARY_TBL (t) VALUES ('six'); +ERROR: null value in column "i" of relation "primary_tbl" violates not-null constraint +DETAIL: Failing row contains (null, six). +SELECT * FROM PRIMARY_TBL; + i | t +---+------- + 1 | one + 2 | two + 1 | three + 4 | three + 5 | one +(5 rows) + +DROP TABLE PRIMARY_TBL; +-- +-- Unique keys +-- +CREATE TABLE UNIQUE_TBL (i int UNIQUE, t text); +INSERT INTO UNIQUE_TBL VALUES (1, 'one'); +INSERT INTO UNIQUE_TBL VALUES (2, 'two'); +INSERT INTO UNIQUE_TBL VALUES (1, 'three'); +ERROR: duplicate key value violates unique constraint "unique_tbl_i_key" +DETAIL: Key (i)=(1) already exists. +INSERT INTO UNIQUE_TBL VALUES (4, 'four'); +INSERT INTO UNIQUE_TBL VALUES (5, 'one'); +INSERT INTO UNIQUE_TBL (t) VALUES ('six'); +INSERT INTO UNIQUE_TBL (t) VALUES ('seven'); +INSERT INTO UNIQUE_TBL VALUES (5, 'five-upsert-insert') ON CONFLICT (i) DO UPDATE SET t = 'five-upsert-update'; +INSERT INTO UNIQUE_TBL VALUES (6, 'six-upsert-insert') ON CONFLICT (i) DO UPDATE SET t = 'six-upsert-update'; +-- should fail +INSERT INTO UNIQUE_TBL VALUES (1, 'a'), (2, 'b'), (2, 'b') ON CONFLICT (i) DO UPDATE SET t = 'fails'; +ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time +HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained values. +SELECT * FROM UNIQUE_TBL; + i | t +---+-------------------- + 1 | one + 2 | two + 4 | four + | six + | seven + 5 | five-upsert-update + 6 | six-upsert-insert +(7 rows) + +DROP TABLE UNIQUE_TBL; +CREATE TABLE UNIQUE_TBL (i int, t text, + UNIQUE(i,t)); +INSERT INTO UNIQUE_TBL VALUES (1, 'one'); +INSERT INTO UNIQUE_TBL VALUES (2, 'two'); +INSERT INTO UNIQUE_TBL VALUES (1, 'three'); +INSERT INTO UNIQUE_TBL VALUES (1, 'one'); +ERROR: duplicate key value violates unique constraint "unique_tbl_i_t_key" +DETAIL: Key (i, t)=(1, one) already exists. +INSERT INTO UNIQUE_TBL VALUES (5, 'one'); +INSERT INTO UNIQUE_TBL (t) VALUES ('six'); +SELECT * FROM UNIQUE_TBL; + i | t +---+------- + 1 | one + 2 | two + 1 | three + 5 | one + | six +(5 rows) + +DROP TABLE UNIQUE_TBL; +-- +-- Deferrable unique constraints +-- +CREATE TABLE unique_tbl (i int UNIQUE DEFERRABLE, t text); +INSERT INTO unique_tbl VALUES (0, 'one'); +INSERT INTO unique_tbl VALUES (1, 'two'); +INSERT INTO unique_tbl VALUES (2, 'tree'); +INSERT INTO unique_tbl VALUES (3, 'four'); +INSERT INTO unique_tbl VALUES (4, 'five'); +BEGIN; +-- default is immediate so this should fail right away +UPDATE unique_tbl SET i = 1 WHERE i = 0; +ERROR: duplicate key value violates unique constraint "unique_tbl_i_key" +DETAIL: Key (i)=(1) already exists. +ROLLBACK; +-- check is done at end of statement, so this should succeed +UPDATE unique_tbl SET i = i+1; +SELECT * FROM unique_tbl; + i | t +---+------ + 1 | one + 2 | two + 3 | tree + 4 | four + 5 | five +(5 rows) + +-- explicitly defer the constraint +BEGIN; +SET CONSTRAINTS unique_tbl_i_key DEFERRED; +INSERT INTO unique_tbl VALUES (3, 'three'); +DELETE FROM unique_tbl WHERE t = 'tree'; -- makes constraint valid again +COMMIT; -- should succeed +SELECT * FROM unique_tbl; + i | t +---+------- + 1 | one + 2 | two + 4 | four + 5 | five + 3 | three +(5 rows) + +-- try adding an initially deferred constraint +ALTER TABLE unique_tbl DROP CONSTRAINT unique_tbl_i_key; +ALTER TABLE unique_tbl ADD CONSTRAINT unique_tbl_i_key + UNIQUE (i) DEFERRABLE INITIALLY DEFERRED; +BEGIN; +INSERT INTO unique_tbl VALUES (1, 'five'); +INSERT INTO unique_tbl VALUES (5, 'one'); +UPDATE unique_tbl SET i = 4 WHERE i = 2; +UPDATE unique_tbl SET i = 2 WHERE i = 4 AND t = 'four'; +DELETE FROM unique_tbl WHERE i = 1 AND t = 'one'; +DELETE FROM unique_tbl WHERE i = 5 AND t = 'five'; +COMMIT; +SELECT * FROM unique_tbl; + i | t +---+------- + 3 | three + 1 | five + 5 | one + 4 | two + 2 | four +(5 rows) + +-- should fail at commit-time +BEGIN; +INSERT INTO unique_tbl VALUES (3, 'Three'); -- should succeed for now +COMMIT; -- should fail +ERROR: duplicate key value violates unique constraint "unique_tbl_i_key" +DETAIL: Key (i)=(3) already exists. +-- make constraint check immediate +BEGIN; +SET CONSTRAINTS ALL IMMEDIATE; +INSERT INTO unique_tbl VALUES (3, 'Three'); -- should fail +ERROR: duplicate key value violates unique constraint "unique_tbl_i_key" +DETAIL: Key (i)=(3) already exists. +COMMIT; +-- forced check when SET CONSTRAINTS is called +BEGIN; +SET CONSTRAINTS ALL DEFERRED; +INSERT INTO unique_tbl VALUES (3, 'Three'); -- should succeed for now +SET CONSTRAINTS ALL IMMEDIATE; -- should fail +ERROR: duplicate key value violates unique constraint "unique_tbl_i_key" +DETAIL: Key (i)=(3) already exists. +COMMIT; +-- test deferrable UNIQUE with a partitioned table +CREATE TABLE parted_uniq_tbl (i int UNIQUE DEFERRABLE) partition by range (i); +CREATE TABLE parted_uniq_tbl_1 PARTITION OF parted_uniq_tbl FOR VALUES FROM (0) TO (10); +CREATE TABLE parted_uniq_tbl_2 PARTITION OF parted_uniq_tbl FOR VALUES FROM (20) TO (30); +SELECT conname, conrelid::regclass FROM pg_constraint + WHERE conname LIKE 'parted_uniq%' ORDER BY conname; + conname | conrelid +-------------------------+------------------- + parted_uniq_tbl_1_i_key | parted_uniq_tbl_1 + parted_uniq_tbl_2_i_key | parted_uniq_tbl_2 + parted_uniq_tbl_i_key | parted_uniq_tbl +(3 rows) + +BEGIN; +INSERT INTO parted_uniq_tbl VALUES (1); +SAVEPOINT f; +INSERT INTO parted_uniq_tbl VALUES (1); -- unique violation +ERROR: duplicate key value violates unique constraint "parted_uniq_tbl_1_i_key" +DETAIL: Key (i)=(1) already exists. +ROLLBACK TO f; +SET CONSTRAINTS parted_uniq_tbl_i_key DEFERRED; +INSERT INTO parted_uniq_tbl VALUES (1); -- OK now, fail at commit +COMMIT; +ERROR: duplicate key value violates unique constraint "parted_uniq_tbl_1_i_key" +DETAIL: Key (i)=(1) already exists. +DROP TABLE parted_uniq_tbl; +-- test a HOT update that invalidates the conflicting tuple. +-- the trigger should still fire and catch the violation +BEGIN; +INSERT INTO unique_tbl VALUES (3, 'Three'); -- should succeed for now +UPDATE unique_tbl SET t = 'THREE' WHERE i = 3 AND t = 'Three'; +COMMIT; -- should fail +ERROR: duplicate key value violates unique constraint "unique_tbl_i_key" +DETAIL: Key (i)=(3) already exists. +SELECT * FROM unique_tbl; + i | t +---+------- + 3 | three + 1 | five + 5 | one + 4 | two + 2 | four +(5 rows) + +-- test a HOT update that modifies the newly inserted tuple, +-- but should succeed because we then remove the other conflicting tuple. +BEGIN; +INSERT INTO unique_tbl VALUES(3, 'tree'); -- should succeed for now +UPDATE unique_tbl SET t = 'threex' WHERE t = 'tree'; +DELETE FROM unique_tbl WHERE t = 'three'; +SELECT * FROM unique_tbl; + i | t +---+-------- + 1 | five + 5 | one + 4 | two + 2 | four + 3 | threex +(5 rows) + +COMMIT; +SELECT * FROM unique_tbl; + i | t +---+-------- + 1 | five + 5 | one + 4 | two + 2 | four + 3 | threex +(5 rows) + +DROP TABLE unique_tbl; +-- +-- EXCLUDE constraints +-- +CREATE TABLE circles ( + c1 CIRCLE, + c2 TEXT, + EXCLUDE USING gist + (c1 WITH &&, (c2::circle) WITH &&) + WHERE (circle_center(c1) <> '(0,0)') +); +-- these should succeed because they don't match the index predicate +INSERT INTO circles VALUES('<(0,0), 5>', '<(0,0), 5>'); +INSERT INTO circles VALUES('<(0,0), 5>', '<(0,0), 4>'); +-- succeed +INSERT INTO circles VALUES('<(10,10), 10>', '<(0,0), 5>'); +-- fail, overlaps +INSERT INTO circles VALUES('<(20,20), 10>', '<(0,0), 4>'); +ERROR: conflicting key value violates exclusion constraint "circles_c1_c2_excl" +DETAIL: Key (c1, (c2::circle))=(<(20,20),10>, <(0,0),4>) conflicts with existing key (c1, (c2::circle))=(<(10,10),10>, <(0,0),5>). +-- succeed, because violation is ignored +INSERT INTO circles VALUES('<(20,20), 10>', '<(0,0), 4>') + ON CONFLICT ON CONSTRAINT circles_c1_c2_excl DO NOTHING; +-- fail, because DO UPDATE variant requires unique index +INSERT INTO circles VALUES('<(20,20), 10>', '<(0,0), 4>') + ON CONFLICT ON CONSTRAINT circles_c1_c2_excl DO UPDATE SET c2 = EXCLUDED.c2; +ERROR: ON CONFLICT DO UPDATE not supported with exclusion constraints +-- succeed because c1 doesn't overlap +INSERT INTO circles VALUES('<(20,20), 1>', '<(0,0), 5>'); +-- succeed because c2 doesn't overlap +INSERT INTO circles VALUES('<(20,20), 10>', '<(10,10), 5>'); +-- should fail on existing data without the WHERE clause +ALTER TABLE circles ADD EXCLUDE USING gist + (c1 WITH &&, (c2::circle) WITH &&); +ERROR: could not create exclusion constraint "circles_c1_c2_excl1" +DETAIL: Key (c1, (c2::circle))=(<(0,0),5>, <(0,0),5>) conflicts with key (c1, (c2::circle))=(<(0,0),5>, <(0,0),4>). +-- try reindexing an existing constraint +REINDEX INDEX circles_c1_c2_excl; +DROP TABLE circles; +-- Check deferred exclusion constraint +CREATE TABLE deferred_excl ( + f1 int, + f2 int, + CONSTRAINT deferred_excl_con EXCLUDE (f1 WITH =) INITIALLY DEFERRED +); +INSERT INTO deferred_excl VALUES(1); +INSERT INTO deferred_excl VALUES(2); +INSERT INTO deferred_excl VALUES(1); -- fail +ERROR: conflicting key value violates exclusion constraint "deferred_excl_con" +DETAIL: Key (f1)=(1) conflicts with existing key (f1)=(1). +INSERT INTO deferred_excl VALUES(1) ON CONFLICT ON CONSTRAINT deferred_excl_con DO NOTHING; -- fail +ERROR: ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters +BEGIN; +INSERT INTO deferred_excl VALUES(2); -- no fail here +COMMIT; -- should fail here +ERROR: conflicting key value violates exclusion constraint "deferred_excl_con" +DETAIL: Key (f1)=(2) conflicts with existing key (f1)=(2). +BEGIN; +INSERT INTO deferred_excl VALUES(3); +INSERT INTO deferred_excl VALUES(3); -- no fail here +COMMIT; -- should fail here +ERROR: conflicting key value violates exclusion constraint "deferred_excl_con" +DETAIL: Key (f1)=(3) conflicts with existing key (f1)=(3). +-- bug #13148: deferred constraint versus HOT update +BEGIN; +INSERT INTO deferred_excl VALUES(2, 1); -- no fail here +DELETE FROM deferred_excl WHERE f1 = 2 AND f2 IS NULL; -- remove old row +UPDATE deferred_excl SET f2 = 2 WHERE f1 = 2; +COMMIT; -- should not fail +SELECT * FROM deferred_excl; + f1 | f2 +----+---- + 1 | + 2 | 2 +(2 rows) + +ALTER TABLE deferred_excl DROP CONSTRAINT deferred_excl_con; +-- This should fail, but worth testing because of HOT updates +UPDATE deferred_excl SET f1 = 3; +ALTER TABLE deferred_excl ADD EXCLUDE (f1 WITH =); +ERROR: could not create exclusion constraint "deferred_excl_f1_excl" +DETAIL: Key (f1)=(3) conflicts with key (f1)=(3). +DROP TABLE deferred_excl; +-- Comments +-- Setup a low-level role to enforce non-superuser checks. +CREATE ROLE regress_constraint_comments; +SET SESSION AUTHORIZATION regress_constraint_comments; +CREATE TABLE constraint_comments_tbl (a int CONSTRAINT the_constraint CHECK (a > 0)); +CREATE DOMAIN constraint_comments_dom AS int CONSTRAINT the_constraint CHECK (value > 0); +COMMENT ON CONSTRAINT the_constraint ON constraint_comments_tbl IS 'yes, the comment'; +COMMENT ON CONSTRAINT the_constraint ON DOMAIN constraint_comments_dom IS 'yes, another comment'; +-- no such constraint +COMMENT ON CONSTRAINT no_constraint ON constraint_comments_tbl IS 'yes, the comment'; +ERROR: constraint "no_constraint" for table "constraint_comments_tbl" does not exist +COMMENT ON CONSTRAINT no_constraint ON DOMAIN constraint_comments_dom IS 'yes, another comment'; +ERROR: constraint "no_constraint" for domain constraint_comments_dom does not exist +-- no such table/domain +COMMENT ON CONSTRAINT the_constraint ON no_comments_tbl IS 'bad comment'; +ERROR: relation "no_comments_tbl" does not exist +COMMENT ON CONSTRAINT the_constraint ON DOMAIN no_comments_dom IS 'another bad comment'; +ERROR: type "no_comments_dom" does not exist +COMMENT ON CONSTRAINT the_constraint ON constraint_comments_tbl IS NULL; +COMMENT ON CONSTRAINT the_constraint ON DOMAIN constraint_comments_dom IS NULL; +-- unauthorized user +RESET SESSION AUTHORIZATION; +CREATE ROLE regress_constraint_comments_noaccess; +SET SESSION AUTHORIZATION regress_constraint_comments_noaccess; +COMMENT ON CONSTRAINT the_constraint ON constraint_comments_tbl IS 'no, the comment'; +ERROR: must be owner of relation constraint_comments_tbl +COMMENT ON CONSTRAINT the_constraint ON DOMAIN constraint_comments_dom IS 'no, another comment'; +ERROR: must be owner of type constraint_comments_dom +RESET SESSION AUTHORIZATION; +DROP TABLE constraint_comments_tbl; +DROP DOMAIN constraint_comments_dom; +DROP ROLE regress_constraint_comments; +DROP ROLE regress_constraint_comments_noaccess; diff --git a/src/test/singlenode_regress/output/copy.source b/src/test/singlenode_regress/output/copy.source new file mode 100644 index 00000000000..6c6128ad642 --- /dev/null +++ b/src/test/singlenode_regress/output/copy.source @@ -0,0 +1,221 @@ +-- +-- COPY +-- +-- CLASS POPULATION +-- (any resemblance to real life is purely coincidental) +-- +COPY aggtest FROM '@abs_srcdir@/data/agg.data'; +COPY onek FROM '@abs_srcdir@/data/onek.data'; +COPY onek TO '@abs_builddir@/results/onek.data'; +DELETE FROM onek; +COPY onek FROM '@abs_builddir@/results/onek.data'; +COPY tenk1 FROM '@abs_srcdir@/data/tenk.data'; +COPY slow_emp4000 FROM '@abs_srcdir@/data/rect.data'; +COPY person FROM '@abs_srcdir@/data/person.data'; +COPY emp FROM '@abs_srcdir@/data/emp.data'; +COPY student FROM '@abs_srcdir@/data/student.data'; +COPY stud_emp FROM '@abs_srcdir@/data/stud_emp.data'; +COPY road FROM '@abs_srcdir@/data/streets.data'; +COPY real_city FROM '@abs_srcdir@/data/real_city.data'; +COPY hash_i4_heap FROM '@abs_srcdir@/data/hash.data'; +COPY hash_name_heap FROM '@abs_srcdir@/data/hash.data'; +COPY hash_txt_heap FROM '@abs_srcdir@/data/hash.data'; +COPY hash_f8_heap FROM '@abs_srcdir@/data/hash.data'; +COPY test_tsvector FROM '@abs_srcdir@/data/tsearch.data'; +COPY testjsonb FROM '@abs_srcdir@/data/jsonb.data'; +-- the data in this file has a lot of duplicates in the index key +-- fields, leading to long bucket chains and lots of table expansion. +-- this is therefore a stress test of the bucket overflow code (unlike +-- the data in hash.data, which has unique index keys). +-- +-- COPY hash_ovfl_heap FROM '@abs_srcdir@/data/hashovfl.data'; +COPY bt_i4_heap FROM '@abs_srcdir@/data/desc.data'; +COPY bt_name_heap FROM '@abs_srcdir@/data/hash.data'; +COPY bt_txt_heap FROM '@abs_srcdir@/data/desc.data'; +COPY bt_f8_heap FROM '@abs_srcdir@/data/hash.data'; +COPY array_op_test FROM '@abs_srcdir@/data/array.data'; +COPY array_index_op_test FROM '@abs_srcdir@/data/array.data'; +-- analyze all the data we just loaded, to ensure plan consistency +-- in later tests +ANALYZE aggtest; +ANALYZE onek; +ANALYZE tenk1; +ANALYZE slow_emp4000; +ANALYZE person; +ANALYZE emp; +ANALYZE student; +ANALYZE stud_emp; +ANALYZE road; +ANALYZE real_city; +ANALYZE hash_i4_heap; +ANALYZE hash_name_heap; +ANALYZE hash_txt_heap; +ANALYZE hash_f8_heap; +ANALYZE test_tsvector; +ANALYZE bt_i4_heap; +ANALYZE bt_name_heap; +ANALYZE bt_txt_heap; +ANALYZE bt_f8_heap; +ANALYZE array_op_test; +ANALYZE array_index_op_test; +--- test copying in CSV mode with various styles +--- of embedded line ending characters +create temp table copytest ( + style text, + test text, + filler int); +insert into copytest values('DOS',E'abc\r\ndef',1); +insert into copytest values('Unix',E'abc\ndef',2); +insert into copytest values('Mac',E'abc\rdef',3); +insert into copytest values(E'esc\\ape',E'a\\r\\\r\\\n\\nb',4); +copy copytest to '@abs_builddir@/results/copytest.csv' csv; +create temp table copytest2 (like copytest); +copy copytest2 from '@abs_builddir@/results/copytest.csv' csv; +select * from copytest except select * from copytest2; + style | test | filler +-------+------+-------- +(0 rows) + +truncate copytest2; +--- same test but with an escape char different from quote char +copy copytest to '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; +copy copytest2 from '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; +select * from copytest except select * from copytest2; + style | test | filler +-------+------+-------- +(0 rows) + +-- test header line feature +create temp table copytest3 ( + c1 int, + "col with , comma" text, + "col with "" quote" int); +copy copytest3 from stdin csv header; +copy copytest3 to stdout csv header; +c1,"col with , comma","col with "" quote" +1,a,1 +2,b,2 +-- test copy from with a partitioned table +create table parted_copytest ( + a int, + b int, + c text +) partition by list (b); +create table parted_copytest_a1 (c text, b int, a int); +create table parted_copytest_a2 (a int, c text, b int); +alter table parted_copytest attach partition parted_copytest_a1 for values in(1); +alter table parted_copytest attach partition parted_copytest_a2 for values in(2); +-- We must insert enough rows to trigger multi-inserts. These are only +-- enabled adaptively when there are few enough partition changes. +insert into parted_copytest select x,1,'One' from generate_series(1,1000) x; +insert into parted_copytest select x,2,'Two' from generate_series(1001,1010) x; +insert into parted_copytest select x,1,'One' from generate_series(1011,1020) x; +copy (select * from parted_copytest order by a) to '@abs_builddir@/results/parted_copytest.csv'; +truncate parted_copytest; +copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv'; +-- Ensure COPY FREEZE errors for partitioned tables. +begin; +truncate parted_copytest; +copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv' (freeze); +ERROR: cannot perform COPY FREEZE on a partitioned table +rollback; +select tableoid::regclass,count(*),sum(a) from parted_copytest +group by tableoid order by tableoid::regclass::name; + tableoid | count | sum +--------------------+-------+-------- + parted_copytest_a1 | 1010 | 510655 + parted_copytest_a2 | 10 | 10055 +(2 rows) + +truncate parted_copytest; +-- create before insert row trigger on parted_copytest_a2 +create function part_ins_func() returns trigger language plpgsql as $$ +begin + return new; +end; +$$; +create trigger part_ins_trig + before insert on parted_copytest_a2 + for each row + execute procedure part_ins_func(); +copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv'; +select tableoid::regclass,count(*),sum(a) from parted_copytest +group by tableoid order by tableoid::regclass::name; + tableoid | count | sum +--------------------+-------+-------- + parted_copytest_a1 | 1010 | 510655 + parted_copytest_a2 | 10 | 10055 +(2 rows) + +truncate table parted_copytest; +create index on parted_copytest (b); +drop trigger part_ins_trig on parted_copytest_a2; +copy parted_copytest from stdin; +-- Ensure index entries were properly added during the copy. +select * from parted_copytest where b = 1; + a | b | c +---+---+------ + 1 | 1 | str1 +(1 row) + +select * from parted_copytest where b = 2; + a | b | c +---+---+------ + 2 | 2 | str2 +(1 row) + +drop table parted_copytest; +-- +-- Progress reporting for COPY +-- +create table tab_progress_reporting ( + name text, + age int4, + location point, + salary int4, + manager name +); +-- Add a trigger to catch and print the contents of the catalog view +-- pg_stat_progress_copy during data insertion. This allows to test +-- the validation of some progress reports for COPY FROM where the trigger +-- would fire. +create function notice_after_tab_progress_reporting() returns trigger AS +$$ +declare report record; +begin + -- The fields ignored here are the ones that may not remain + -- consistent across multiple runs. The sizes reported may differ + -- across platforms, so just check if these are strictly positive. + with progress_data as ( + select + relid::regclass::text as relname, + command, + type, + bytes_processed > 0 as has_bytes_processed, + bytes_total > 0 as has_bytes_total, + tuples_processed, + tuples_excluded + from pg_stat_progress_copy + where pid = pg_backend_pid()) + select into report (to_jsonb(r)) as value + from progress_data r; + + raise info 'progress: %', report.value::text; + return new; +end; +$$ language plpgsql; +create trigger check_after_tab_progress_reporting + after insert on tab_progress_reporting + for each statement + execute function notice_after_tab_progress_reporting(); +ERROR: Triggers for statements are not yet supported +-- Generate COPY FROM report with PIPE. +copy tab_progress_reporting from stdin; +-- Generate COPY FROM report with FILE, with some excluded tuples. +truncate tab_progress_reporting; +copy tab_progress_reporting from '@abs_srcdir@/data/emp.data' + where (salary < 2000); +drop trigger check_after_tab_progress_reporting on tab_progress_reporting; +ERROR: trigger "check_after_tab_progress_reporting" for table "tab_progress_reporting" does not exist +drop function notice_after_tab_progress_reporting(); +drop table tab_progress_reporting; diff --git a/src/test/singlenode_regress/output/create_function_0.source b/src/test/singlenode_regress/output/create_function_0.source new file mode 100644 index 00000000000..342bc40e115 --- /dev/null +++ b/src/test/singlenode_regress/output/create_function_0.source @@ -0,0 +1,88 @@ +-- +-- CREATE_FUNCTION_0 +-- +-- Create a bunch of C functions that will be used by later tests: +CREATE FUNCTION check_primary_key () + RETURNS trigger + AS '@libdir@/refint@DLSUFFIX@' + LANGUAGE C; +CREATE FUNCTION check_foreign_key () + RETURNS trigger + AS '@libdir@/refint@DLSUFFIX@' + LANGUAGE C; +CREATE FUNCTION autoinc () + RETURNS trigger + AS '@libdir@/autoinc@DLSUFFIX@' + LANGUAGE C; +CREATE FUNCTION trigger_return_old () + RETURNS trigger + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C; +CREATE FUNCTION ttdummy () + RETURNS trigger + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C; +CREATE FUNCTION set_ttdummy (int4) + RETURNS int4 + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; +CREATE FUNCTION make_tuple_indirect (record) + RETURNS record + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; +CREATE FUNCTION test_atomic_ops() + RETURNS bool + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C; +CREATE FUNCTION test_fdw_handler() + RETURNS fdw_handler + AS '@libdir@/regress@DLSUFFIX@', 'test_fdw_handler' + LANGUAGE C; +CREATE FUNCTION test_support_func(internal) + RETURNS internal + AS '@libdir@/regress@DLSUFFIX@', 'test_support_func' + LANGUAGE C STRICT; +CREATE FUNCTION test_opclass_options_func(internal) + RETURNS void + AS '@libdir@/regress@DLSUFFIX@', 'test_opclass_options_func' + LANGUAGE C; +CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) + AS '@libdir@/regress@DLSUFFIX@', 'test_enc_conversion' + LANGUAGE C STRICT; +CREATE FUNCTION binary_coercible(oid, oid) + RETURNS bool + AS '@libdir@/regress@DLSUFFIX@', 'binary_coercible' + LANGUAGE C STRICT STABLE PARALLEL SAFE; +-- Things that shouldn't work: +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT ''not an integer'';'; +ERROR: return type mismatch in function declared to return integer +DETAIL: Actual return type is text. +CONTEXT: SQL function "test1" +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'not even SQL'; +ERROR: syntax error at or near "not" +LINE 2: AS 'not even SQL'; + ^ +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT 1, 2, 3;'; +ERROR: return type mismatch in function declared to return integer +DETAIL: Final statement must return exactly one column. +CONTEXT: SQL function "test1" +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT $2;'; +ERROR: there is no parameter $2 +LINE 2: AS 'SELECT $2;'; + ^ +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'a', 'b'; +ERROR: only one AS item needed for language "sql" +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C + AS 'nosuchfile'; +ERROR: could not access file "nosuchfile": No such file or directory +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C + AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol'; +ERROR: could not find function "nosuchsymbol" in file "@libdir@/regress@DLSUFFIX@" +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal + AS 'nosuch'; +ERROR: there is no built-in function named "nosuch" diff --git a/src/test/singlenode_regress/output/create_function_1.source b/src/test/singlenode_regress/output/create_function_1.source new file mode 100644 index 00000000000..616b610e862 --- /dev/null +++ b/src/test/singlenode_regress/output/create_function_1.source @@ -0,0 +1,26 @@ +-- +-- CREATE_FUNCTION_1 +-- +-- Create C functions needed by create_type.sql +CREATE FUNCTION widget_in(cstring) + RETURNS widget + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT IMMUTABLE; +NOTICE: type "widget" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION widget_out(widget) + RETURNS cstring + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT IMMUTABLE; +NOTICE: argument type widget is only a shell +CREATE FUNCTION int44in(cstring) + RETURNS city_budget + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT IMMUTABLE; +NOTICE: type "city_budget" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION int44out(city_budget) + RETURNS cstring + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT IMMUTABLE; +NOTICE: argument type city_budget is only a shell diff --git a/src/test/singlenode_regress/output/create_function_2.source b/src/test/singlenode_regress/output/create_function_2.source new file mode 100644 index 00000000000..ac9a7f5cf8d --- /dev/null +++ b/src/test/singlenode_regress/output/create_function_2.source @@ -0,0 +1,69 @@ +-- +-- CREATE_FUNCTION_2 +-- +CREATE FUNCTION hobbies(person) + RETURNS setof hobbies_r + AS 'select * from hobbies_r where person = $1.name' + LANGUAGE SQL; +CREATE FUNCTION hobby_construct(text, text) + RETURNS hobbies_r + AS 'select $1 as name, $2 as hobby' + LANGUAGE SQL; +CREATE FUNCTION hobby_construct_named(name text, hobby text) + RETURNS hobbies_r + AS 'select name, hobby' + LANGUAGE SQL; +CREATE FUNCTION hobbies_by_name(hobbies_r.name%TYPE) + RETURNS hobbies_r.person%TYPE + AS 'select person from hobbies_r where name = $1' + LANGUAGE SQL; +NOTICE: type reference hobbies_r.name%TYPE converted to text +NOTICE: type reference hobbies_r.person%TYPE converted to text +CREATE FUNCTION equipment(hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = $1.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = equipment_named.hobby.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_1a(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = equipment_named_ambiguous_1a.hobby.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_1b(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = hobby.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_1c(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = hobby.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_2a(hobby text) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = equipment_named_ambiguous_2a.hobby' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_2b(hobby text) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = hobby' + LANGUAGE SQL; +CREATE FUNCTION pt_in_widget(point, widget) + RETURNS bool + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; +CREATE FUNCTION overpaid(emp) + RETURNS bool + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; +CREATE FUNCTION interpt_pp(path, path) + RETURNS point + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; +CREATE FUNCTION reverse_name(name) + RETURNS name + AS '@libdir@/regress@DLSUFFIX@' + LANGUAGE C STRICT; +-- +-- Function dynamic loading +-- +LOAD '@libdir@/regress@DLSUFFIX@'; diff --git a/src/test/singlenode_regress/output/createdb.source b/src/test/singlenode_regress/output/createdb.source new file mode 100644 index 00000000000..5d2d708353e --- /dev/null +++ b/src/test/singlenode_regress/output/createdb.source @@ -0,0 +1,107 @@ +-- start_ignore +\! gpstop -u; +20190709:16:49:48:083167 gpstop:Weinan-Pivotal-Mac:wwang-[INFO]:-Starting gpstop with args: -u +20190709:16:49:48:083167 gpstop:Weinan-Pivotal-Mac:wwang-[INFO]:-Gathering information and validating the environment... +20190709:16:49:48:083167 gpstop:Weinan-Pivotal-Mac:wwang-[INFO]:-Obtaining Cloudberry Master catalog information +20190709:16:49:48:083167 gpstop:Weinan-Pivotal-Mac:wwang-[INFO]:-Obtaining Segment details from master... +20190709:16:49:48:083167 gpstop:Weinan-Pivotal-Mac:wwang-[INFO]:-Cloudberry Version: 'postgres (Cloudberry Database) 7.0.0-alpha.0+dev.487.gc712d6d8b0 build dev' +20190709:16:49:48:083167 gpstop:Weinan-Pivotal-Mac:wwang-[INFO]:-Signalling all postmaster processes to reload +create language plpython3u; +-- end_ignore +--list all database oid relevant directories in all node(master, segments, mirrors, etc.) +CREATE OR REPLACE FUNCTION db_dirs(dboid oid) RETURNS setof text + STRICT STABLE LANGUAGE plpython3u +as $$ +import os +bash_cmd = "find " + os.getcwd() + "/../../ " + "-name %d -type d" +p = os.popen(bash_cmd % dboid) +return p.readlines() +$$; +-- +--CASE 0: createdb do well +-- +create database dowell; +select force_mirrors_to_catch_up(); + force_mirrors_to_catch_up +--------------------------- + +(1 row) + +select count(*)=0 as result from + (select db_dirs(oid) from pg_database where datname = 'dowell') as foo; + result +-------- + f +(1 row) + +\! psql -d dowell -c "create table test1(a int, b text)" +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database 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. +CREATE TABLE +\! psql -d dowell -c "insert into test1 values (1, '111'), (2, '222'), (3, '333')" +INSERT 0 3 +\! psql -d dowell -c "select * from test1" + a | b +---+----- + 2 | 222 + 3 | 333 + 1 | 111 +(3 rows) + +drop database dowell; +-- +--CASE 2: error after XLOG_DBASE_CREATE on master +-- +select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration; + gp_inject_fault +----------------- + Success: + Success: +(2 rows) + +select gp_inject_fault('after_xlog_create_database', 'error', dbid) +from gp_segment_configuration where content=-1 and role='p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- should fail +create database db2; +ERROR: fault triggered, fault name:'after_xlog_create_database' fault type:'error' +select force_mirrors_to_catch_up(); + force_mirrors_to_catch_up +--------------------------- + +(1 row) + +-- since this is a failed case, db oid is invisible, however we need it to search +-- our tablespace to check if has db files left over. +set gp_select_invisible=on; +select db_dirs(oid) from pg_database where datname = 'db2'; + db_dirs +--------- +(0 rows) + +set gp_select_invisible=off; +-- start_ignore +select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration; + gp_inject_fault +----------------- + Success: + Success: + Success: + Success: + Success: + Success: + Success: + Success: +(8 rows) + +select force_mirrors_to_catch_up(); + force_mirrors_to_catch_up +--------------------------- + +(1 row) + +-- end_ignore diff --git a/src/test/singlenode_regress/output/gpcopy.source b/src/test/singlenode_regress/output/gpcopy.source new file mode 100755 index 00000000000..3bc98f82588 --- /dev/null +++ b/src/test/singlenode_regress/output/gpcopy.source @@ -0,0 +1,726 @@ +-- +-- This test suite tests COPY code that is unique to greenplum db. +-- +-- ###################################################### +-- different distribution columns and distribution types +-- ###################################################### +CREATE TABLE copy_regression_hash1(a text, b text, c text); +CREATE TABLE copy_regression_hash2(a text, b text, c text); +CREATE TABLE copy_regression_hash3(a varchar, b int, c int, d text); +CREATE TABLE copy_regression_hash4(a int[], b text); +CREATE TABLE copy_regression_hash5(a text[][]); +CREATE TABLE copy_regression_hash6(a int[], b text[]); +CREATE TABLE copy_regression_hash7(a text,b text); +-- single key, not first +COPY copy_regression_hash1 from stdin; +COPY copy_regression_hash1(b,c,a) from stdin; +SELECT * FROM copy_regression_hash1; + a | b | c +--------+--------+-------- + a data | b data | c data + a data | b data | c data +(2 rows) + +-- two keys +COPY copy_regression_hash2 from stdin; +COPY copy_regression_hash2(b,c,a) from stdin; +SELECT * FROM copy_regression_hash2; + a | b | c +--------+--------+-------- + a data | b data | c data + a data | b data | c data +(2 rows) + +-- three keys +COPY copy_regression_hash3 from stdin; +COPY copy_regression_hash3(c,d,b,a) from stdin; +COPY copy_regression_hash3(a,c) from stdin; +COPY copy_regression_hash3(d) from stdin; +SELECT * FROM copy_regression_hash3; + a | b | c | d +--------+---+---+-------- + a data | 2 | 3 | d data + a data | 2 | 3 | d data + a data | | 3 | + | | | d data +(4 rows) + +-- hash on int array +COPY copy_regression_hash4 from stdin; +SELECT * FROM copy_regression_hash4 ORDER BY a; + a | b +------------------+---------------------------- + {1,2,3,4,5} | hashed on an integer array + {10,20,30,40,50} | hashed on an integer array +(2 rows) + +-- hash on 2 dim varchar array +COPY copy_regression_hash5 from stdin; +SELECT * FROM copy_regression_hash5 ORDER BY a; + a +------------------------------------------------- + {{hashing,on},{"two dimentional","text array"}} +(1 row) + +-- hash on int array and varchar array +COPY copy_regression_hash6 from stdin; +SELECT * FROM copy_regression_hash6 ORDER BY a; + a | b +-------------+---------------------------------------- + {1,2,3,4,5} | {hashing,on,intarray,and,varchararray} +(1 row) + +-- hash randomly +COPY copy_regression_hash7 from stdin; +SELECT * FROM copy_regression_hash7; + a | b +--------+-------- + a data | b data + a data | b data +(2 rows) + +DROP TABLE copy_regression_hash1; +DROP TABLE copy_regression_hash2; +DROP TABLE copy_regression_hash3; +DROP TABLE copy_regression_hash4; +DROP TABLE copy_regression_hash5; +DROP TABLE copy_regression_hash6; +DROP TABLE copy_regression_hash7; +-- ###################################################### +-- default values and default functions +-- ###################################################### +CREATE TABLE copy_regression_default1(a text not null default 'a default data', b text not null default 'b default data') ; +CREATE TABLE copy_regression_default2(a text, b serial, c text) ; +CREATE TABLE copy_regression_default3(a serial, b text, c text) ; +-- constant defaults on key and non key attributes +COPY copy_regression_default1(a) from stdin; +COPY copy_regression_default1(b) from stdin; +SELECT * FROM copy_regression_default1; + a | b +----------------+---------------- + a default data | b data + a data | b default data +(2 rows) + +-- non constant default on non hash key in both text and csv +COPY copy_regression_default2(a,c) from stdin; +COPY copy_regression_default2(a,c) from stdin csv; +SELECT * FROM copy_regression_default2; + a | b | c +--------+---+--------- + a data | 1 | c data + a data | 2 | c data + a data | 3 | c data + a data | 4 | c data + a data | 5 | c data + a data | 6 | c data +(6 rows) + +-- non constant default on hash key in both text and csv +COPY copy_regression_default3(b,c) from stdin; +COPY copy_regression_default3(b,c) from stdin csv; +SELECT * FROM copy_regression_default2; + a | b | c +--------+---+--------- + a data | 1 | c data + a data | 2 | c data + a data | 3 | c data + a data | 4 | c data + a data | 5 | c data + a data | 6 | c data +(6 rows) + +DROP TABLE copy_regression_default1; +DROP TABLE copy_regression_default2; +DROP TABLE copy_regression_default3; +-- ###################################################### +-- COPY OUT +-- ###################################################### +CREATE TABLE copy_regression_out1(a text, b varchar, c int[], d bool) ; +-- populating table with data for copy out tests. NOTE: since we can't control the order +-- of rows COPY OUT produces from the segdb, we must have only one row for each test table. +COPY copy_regression_out1 from stdin null 'nullval'; +-- copy out default parameters text format.. +COPY copy_regression_out1 to stdout; +a copyout data line 2 \N {2,2,2} t +-- copy out '|' delimiter 'mynull' null.. +COPY copy_regression_out1 to stdout with delimiter '|' null 'mynull'; +a copyout data line 2|mynull|{2,2,2}|t +-- copy out '|' delimiter "i'm null" null.. +COPY copy_regression_out1 to stdout with delimiter '|' null 'i''m null'; +a copyout data line 2|i'm null|{2,2,2}|t +-- copy out default parameters csv format.. +COPY copy_regression_out1 to stdout with csv; +a copyout data line 2,,"{2,2,2}",t +-- copy out default parameters csv format with header.. +COPY copy_regression_out1 to stdout with csv header; +a,b,c,d +a copyout data line 2,,"{2,2,2}",t +-- copy out partial and mixed column list (c,a,b).. +COPY copy_regression_out1(c,a,b) to stdout; +{2,2,2} a copyout data line 2 \N +-- copy out csv default quotes and escapes and special cases.. +COPY copy_regression_out1 to stdout with csv quote ''''; -- escape should be the same as quote +a copyout data line 2,,'{2,2,2}',t +COPY copy_regression_out1 to stdout with csv escape ''''; +a copyout data line 2,,"{2,2,2}",t +COPY copy_regression_out1 to stdout with csv quote '''' escape E'\\'; -- make sure E'' is accepted +a copyout data line 2,,'{2,2,2}',t +DROP TABLE copy_regression_out1; +-- ###################################################### +-- Zero column table +-- ###################################################### +CREATE TABLE copy_regression_nocol(); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause, and no column type is suitable for a distribution key. Creating a NULL policy entry. +-- copy in and out of zero column table.. +COPY copy_regression_nocol from stdin; +COPY copy_regression_nocol from stdin; +ERROR: extra data after last expected column +CONTEXT: COPY copy_regression_nocol, line 1: "we should get an "extra data" error here" +COPY copy_regression_nocol from stdin with csv; +COPY copy_regression_nocol from stdin with csv; -- should fail +ERROR: extra data after last expected column +CONTEXT: COPY copy_regression_nocol, line 1: "we should get an "extra data" error here" +COPY copy_regression_nocol to stdout; +COPY copy_regression_nocol to stdout with csv; +DROP TABLE copy_regression_nocol; +-- ###################################################### +-- Various text format escape and default format tests +-- ###################################################### +-- for text format +CREATE TABLE copy_regression_text1(a varchar ,b varchar, c text, d text, e text) ; +CREATE TABLE copy_regression_text2(a varchar ,b varchar, c text, d text, e text) ; +CREATE TABLE copy_regression_text3(a varchar ,b varchar, c text, d text, e text) ; +-- column order tests +COPY copy_regression_text1 from stdin; +COPY copy_regression_text1(a,b,c,d,e) from stdin; +COPY copy_regression_text1(e,d,c,b,a) from stdin; +COPY copy_regression_text1(c,a,b,e,d) from stdin; +COPY copy_regression_text1(a,c) from stdin; +SELECT * FROM copy_regression_text1; + a | b | c | d | e +-------------+-------------+-------------+-------------+------------- + a text data | b text data | c text data | d text data | e text data + a text data | b text data | c text data | d text data | e text data + a text data | b text data | c text data | d text data | e text data + a text data | b text data | c text data | d text data | e text data + a text data | | c text data | | +(5 rows) + +-- null print tests +COPY copy_regression_text2 from stdin; +COPY copy_regression_text2 from stdin with null 'nullvalue'; +COPY copy_regression_text2 from stdin with delimiter '|' null ''; +COPY copy_regression_text2 from stdin with delimiter '|' null 'i''m null'; +SELECT * FROM copy_regression_text2; + a | b | c | d | e +-------------+-------------+-------------+---+------------- + a text data | | c text data | | e text data + a text data | | c text data | | + a text data | | c text data | | e text data + | b text data | c text data | | e text data + a text data | b text data | | | e text data +(5 rows) + +-- escape tests +COPY copy_regression_text3 from stdin with delimiter '|' escape '#'; +COPY copy_regression_text3 from stdin with delimiter '|' escape 'off'; +COPY copy_regression_text3 from stdin with delimiter '|'; +COPY copy_regression_text3 from stdin with delimiter '|'; +ERROR: missing data for column "b" +CONTEXT: COPY copy_regression_text3, line 2: "and another one\" +COPY copy_regression_text3 from stdin with delimiter '|'; +SELECT * FROM copy_regression_text3 ORDER BY b,a; + a | b | c | d | e +------------------------------------+---+-------------+-------------+-------------- + the at sign: @ | 1 | c text data | d text data | e text data + an embedded delimiter | character | 2 | c text data | d text data | e text data + a single backslash \ in col a | 3 | c text data | d text data | e text data + a single backslash \ in col a | 4 | c text data | d text data | e text data + c:\\file\data\neew\path | 5 | c text data | d text data | e text data + the at sign: @ | 6 | c text data | d text data | e text data + an embedded linefeed sequence +| 7 | c text data | d text data | e text data + in column a | | | | + a single backslash \ in col a | 8 | c text data | d text data | e text data +(8 rows) + +DROP TABLE copy_regression_text1; +DROP TABLE copy_regression_text2; +DROP TABLE copy_regression_text3; +-- ###################################################### +-- Various text format escape and default format tests +-- ###################################################### +-- for csv format +CREATE TABLE copy_regression_csv1(a varchar ,b varchar, c text, d text, e text) ; +CREATE TABLE copy_regression_csv2(a varchar ,b varchar, c text, d text, e text) ; +CREATE TABLE copy_regression_csv3(a varchar ,b varchar, c text, d text, e text) ; +-- column order tests +COPY copy_regression_csv1 from stdin with csv; +COPY copy_regression_csv1(a,b,c,d,e) from stdin with csv; +COPY copy_regression_csv1(e,d,c,b,a) from stdin with csv; +COPY copy_regression_csv1(c,a,b,e,d) from stdin with csv; +COPY copy_regression_csv1(a,c) from stdin with csv; +SELECT * FROM copy_regression_csv1; + a | b | c | d | e +-------------+-------------+-------------+-------------+------------- + a csv data | b csv data | c csv data | d csv data | e csv data + a csv data | b csv data | c csv data | d csv data | e csv data + a csv data | b csv data | c csv data | d csv data | e csv data + a csv data | b csv data | c csv data | d csv data | e csv data + a csv data | | c csv data | | +(5 rows) + +-- null print tests +COPY copy_regression_csv2 from stdin with null E'\\N' csv ; +COPY copy_regression_csv2 from stdin with null 'nullvalue' csv; +COPY copy_regression_csv2 from stdin with delimiter '|' null '' csv; +SELECT * FROM copy_regression_csv2; + a | b | c | d | e +-------------+-------------+-------------+---+------------- + a csv data | | c csv data | | e csv data + a csv data | | c csv data | | + a csv data | | c csv data | | e csv data + | b csv data | c csv data | | e csv data +(4 rows) + +-- escape tests +COPY copy_regression_csv3 from stdin with csv escape E'\\'; +COPY copy_regression_csv3 from stdin with delimiter E'\t' csv; --default quote and escape - " +COPY copy_regression_csv3 from stdin with delimiter '|' csv quote ';' escape '*'; +-- check defaults +COPY copy_regression_csv3 from stdin with csv quote ''''; -- escape should be the same as quote +COPY copy_regression_csv3 from stdin with csv escape ''''; +COPY copy_regression_csv3 from stdin with csv quote '''' escape E'\\'; -- make sure E'' is accepted +SELECT * FROM copy_regression_csv3 ORDER BY b; + a | b | c | d | e +---------------------------------------------------+----+-------------+-------------+-------------- + an embedded delimiter (comma), is printed | 01 | c csv data | d csv data | e csv data + an embedded quote (doubleq)" is printed | 02 | c csv data | d csv data | e csv data + an embedded escape \ is printed | 03 | c csv data | d csv data | e csv data + an embedded line feed +| 04 | c csv data | d csv data | e csv data + is printed | | | | + an embedded delimiter (tab) is printed | 05 | c csv data | d csv data | e csv data + an embedded quote or escape (doubleq)" is printed | 06 | c csv data | d csv data | e csv data + an embedded line feed +| 07 | c csv data | d csv data | e csv data + is printed | | | | + an embedded delimiter (pipe)| is printed | 08 | c csv data | d csv data | e csv data + an embedded quote (semicolon); is printed | 09 | c csv data | d csv data | e csv data + an embedded escape (asterisk)* is printed | 10 | c csv data | d csv data | e csv data + an embedded line feed +| 11 | c csv data | d csv data | e csv data + is printed | | | | + an embedded single quote ' here | 12 | c csv data | d csv data | e csv data + an embedded single quote ' here | 13 | c csv data | d csv data | e csv data + an embedded backslash \ here | 14 | c csv data | d csv data | e csv data +(14 rows) + +DROP TABLE copy_regression_csv1; +DROP TABLE copy_regression_csv2; +DROP TABLE copy_regression_csv3; +-- ###################################################### +-- FILL MISSING FIELDS +-- ###################################################### +CREATE TABLE copy_regression_fill1(a int, b int, c text) ; +CREATE TABLE copy_regression_fill2(a int, b int, c text) ; +-- text +COPY copy_regression_fill1 from stdin with delimiter '|' fill missing fields; +COPY copy_regression_fill1(c,b) from stdin with delimiter '|' fill missing fields; +COPY copy_regression_fill2(a,c) from stdin with delimiter '|' fill missing fields; +SELECT * FROM copy_regression_fill1 ORDER BY a,b,c; + a | b | c +---+---+------- + 1 | 1 | one + 2 | 2 | + 3 | | + | 1 | one + | | three + | | two +(6 rows) + +SELECT * FROM copy_regression_fill2 ORDER BY a,b,c; + a | b | c +---+---+------- + 1 | | one + 2 | | + 3 | | three +(3 rows) + +TRUNCATE copy_regression_fill1; +TRUNCATE copy_regression_fill2; +-- csv +COPY copy_regression_fill1 from stdin with csv delimiter '|' fill missing fields; +COPY copy_regression_fill1(c,b) from stdin with csv delimiter '|' fill missing fields; +COPY copy_regression_fill2(a,c) from stdin with csv delimiter '|' fill missing fields; +SELECT * FROM copy_regression_fill1 ORDER BY a,b,c; + a | b | c +---+---+------- + 1 | 1 | one + 2 | 2 | + 3 | | + | 1 | one + | | three + | | two +(6 rows) + +SELECT * FROM copy_regression_fill2 ORDER BY a,b,c; + a | b | c +---+---+------- + 1 | | one + 2 | | + 3 | | three +(3 rows) + +-- empty row should fail +COPY copy_regression_fill1 from stdin with delimiter '|' fill missing fields; +ERROR: missing data for column "b", found empty data line +CONTEXT: COPY copy_regression_fill1, line 1: "" +COPY copy_regression_fill2 from stdin with delimiter '|' fill missing fields; +ERROR: missing data for column "b", found empty data line +CONTEXT: COPY copy_regression_fill2, line 1: "" +COPY copy_regression_fill1 from stdin with csv delimiter '|' fill missing fields; +ERROR: missing data for column "b", found empty data line +CONTEXT: COPY copy_regression_fill1, line 1: "" +COPY copy_regression_fill2 from stdin with csv delimiter '|' fill missing fields; +ERROR: missing data for column "b", found empty data line +CONTEXT: COPY copy_regression_fill2, line 1: "" +DROP TABLE copy_regression_fill1; +DROP TABLE copy_regression_fill2; +-- ###################################################### +-- FORCE NOT NULL +-- ###################################################### +CREATE TABLE copy_regression_fnn(a text, b text, c text) ; +COPY copy_regression_fnn from stdin with csv; +SELECT * FROM copy_regression_fnn WHERE b is null order by a; + a | b | c +-----+---+----- + one | | one + two | | +(2 rows) + +SELECT * FROM copy_regression_fnn WHERE c is null order by a; + a | b | c +-----+---+--- + two | | +(1 row) + +TRUNCATE copy_regression_fnn; +COPY copy_regression_fnn from stdin with csv force not null b; +SELECT * FROM copy_regression_fnn WHERE b is null order by a; + a | b | c +---+---+--- +(0 rows) + +SELECT * FROM copy_regression_fnn WHERE c is null order by a; + a | b | c +-----+---+--- + two | | +(1 row) + +TRUNCATE copy_regression_fnn; +COPY copy_regression_fnn from stdin with csv force not null b,c; +SELECT * FROM copy_regression_fnn WHERE b is null order by a; + a | b | c +---+---+--- +(0 rows) + +SELECT * FROM copy_regression_fnn WHERE c is null order by a; + a | b | c +---+---+--- +(0 rows) + +TRUNCATE copy_regression_fnn; +-- now combine with fill missing fields +COPY copy_regression_fnn from stdin with csv fill missing fields force not null b; +SELECT * FROM copy_regression_fnn WHERE b is null order by a; + a | b | c +---+---+--- +(0 rows) + +SELECT * FROM copy_regression_fnn WHERE c is null order by a; + a | b | c +-----+---+--- + two | | +(1 row) + +DROP TABLE copy_regression_fnn; +-- ########################################################### +-- distributed data error consolidation + original row numbers +-- ########################################################### +CREATE TABLE copy_regression_error1(a int, b int) ; +-- parse error on QE (extra column on line 6) +COPY copy_regression_error1 from stdin; +ERROR: extra data after last expected column (seg1 subraa4-mac:40001 pid=80440) +CONTEXT: COPY copy_regression_error1, line 6: "6 6 6" +-- parse error on QD (missing column on line 3) +COPY copy_regression_error1 from stdin; +ERROR: missing data for column "b" +CONTEXT: COPY copy_regression_error1, line 3: "3" +-- convert error on QD (invalid type line 2) +COPY copy_regression_error1 from stdin; +ERROR: invalid input syntax for type integer: "two" +CONTEXT: COPY copy_regression_error1, line 2, column two +-- convert error on QE (invalid type line 5) +COPY copy_regression_error1 from stdin; +ERROR: invalid input syntax for type integer: "five" (seg1 subraa4-mac:40001 pid=80440) +CONTEXT: COPY copy_regression_error1, line 5, column 5 +DROP TABLE copy_regression_error1; +-- ###################################################### +-- NEWLINE +-- ###################################################### +CREATE TABLE copy_regression_newline(a text, b text) ; +-- positive: text +COPY copy_regression_newline from stdin with delimiter '|' newline 'lf'; +-- positive: csv +COPY copy_regression_newline from stdin with delimiter '|' newline 'lf' csv; +-- negative: text +COPY copy_regression_newline from stdin with delimiter '|' newline 'cr'; +ERROR: extra data after last expected column +CONTEXT: COPY xxxxx line x: xxx +2|2 +" +-- negative: csv +COPY copy_regression_newline from stdin with delimiter '|' newline 'cr' csv; +ERROR: extra data after last expected column +CONTEXT: COPY xxxxx line x: xxx +2|2 +" +-- negative: invalid newline +COPY copy_regression_newline from stdin with delimiter '|' newline 'blah'; +ERROR: invalid value for NEWLINE "blah" +HINT: Valid options are: 'LF', 'CRLF' and 'CR'. +-- negative: newline not yet supported for COPY TO +COPY copy_regression_newline to stdout with delimiter '|' newline 'blah'; +ERROR: newline currently available for data loading only, not unloading +DROP TABLE copy_regression_newline; +-- Test that FORCE QUOTE option works with the fastpath for integers and +-- numerics +COPY ( + SELECT 123::integer as intcol, 456::numeric as numcol, 'foo' as textcol +) TO stdout CSV FORCE QUOTE intcol, numcol, textcol; +"123","456","foo" +-- Do the same with a real table, to test that the option also works when +-- doing a "dispatched" COPY, i.e. when the COPY output is produced in +-- segments +CREATE TABLE force_quotes_tbl(intcol integer, numcol numeric, textcol text); +INSERT INTO force_quotes_tbl VALUES (123, 456, 'foo'); +COPY force_quotes_tbl TO stdout CSV FORCE QUOTE intcol, numcol, textcol; +"123","456","foo" +DROP TABLE force_quotes_tbl; +-- Tests for error log +DROP TABLE IF EXISTS errcopy, errcopy_err, errcopy_temp; +NOTICE: table "errcopy" does not exist, skipping +NOTICE: table "errcopy_err" does not exist, skipping +NOTICE: table "errcopy_temp" does not exist, skipping +CREATE TABLE errcopy(a int, b int, c text); +INSERT INTO errcopy select i, i, case when i <> 5 then i end || '_text' from generate_series(1, 10)i; +COPY errcopy to '/tmp/errcopy.csv' csv null ''; +-- check if not null constraint not affect error log. +TRUNCATE errcopy; +ALTER table errcopy ALTER c SET NOT null; +COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; +ERROR: null value in column "c" of relation "errcopy" violates not-null constraint +DETAIL: Failing row contains (5, 5, null). +CONTEXT: COPY errcopy, line 7 +SELECT * FROM errcopy; + a | b | c +---+---+--- +(0 rows) + +-- reject rows with invalid format for int +ALTER table errcopy ALTER c DROP NOT null; +ALTER table errcopy DROP COLUMN c; +ALTER table errcopy ADD COLUMN c int; +COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; +NOTICE: found 9 data formatting errors (9 or more input rows), rejected related input data +SELECT * FROM errcopy; + a | b | c +---+---+--- + 5 | 5 | +(1 row) + +SELECT relname, errmsg, rawdata FROM gp_read_error_log('errcopy'); + relname | errmsg | rawdata +---------+------------------------------------------------------------+--------------- + errcopy | invalid input syntax for type integer: "1_text", column c | 1,1,1_text + errcopy | invalid input syntax for type integer: "2_text", column c | 2,2,2_text + errcopy | invalid input syntax for type integer: "3_text", column c | 3,3,3_text + errcopy | invalid input syntax for type integer: "4_text", column c | 4,4,4_text + errcopy | invalid input syntax for type integer: "6_text", column c | 6,6,6_text + errcopy | invalid input syntax for type integer: "7_text", column c | 7,7,7_text + errcopy | invalid input syntax for type integer: "8_text", column c | 8,8,8_text + errcopy | invalid input syntax for type integer: "9_text", column c | 9,9,9_text + errcopy | invalid input syntax for type integer: "10_text", column c | 10,10,10_text +(9 rows) + +-- reject one row with extra column, one row with fewer columns +TRUNCATE errcopy; +SELECT gp_truncate_error_log('errcopy'); + gp_truncate_error_log +----------------------- + t +(1 row) + +COPY (select i::text || ',' || i::text || case when i = 4 then '' else ',' || i::text || case when i = 5 then ',5' else '' end end from generate_series(1, 10)i) to '/tmp/errcopy.csv'; +COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; +NOTICE: found 2 data formatting errors (2 or more input rows), rejected related input data +SELECT * FROM errcopy ORDER BY a; + a | b | c +----+----+---- + 1 | 1 | 1 + 2 | 2 | 2 + 3 | 3 | 3 + 6 | 6 | 6 + 7 | 7 | 7 + 8 | 8 | 8 + 9 | 9 | 9 + 10 | 10 | 10 +(8 rows) + +SELECT relname, errmsg, rawdata FROM gp_read_error_log('errcopy'); + relname | errmsg | rawdata +---------+---------------------------------------+--------- + errcopy | missing data for column "c" | 4,4 + errcopy | extra data after last expected column | 5,5,5,5 +(2 rows) + +-- metacharacter +TRUNCATE errcopy; +COPY errcopy from stdin csv newline 'LF' log errors segment reject limit 3 rows; +NOTICE: found 1 data formatting errors (1 or more input rows), rejected related input data +SELECT * FROM errcopy; + a | b | c +---+---+--- + 1 | 2 | 0 + 1 | 3 | 3 +(2 rows) + +-- exceed reject limit +TRUNCATE errcopy; +SELECT gp_truncate_error_log('errcopy'); + gp_truncate_error_log +----------------------- + t +(1 row) + +COPY errcopy from stdin delimiter E'\t' log errors segment reject limit 3 rows; +ERROR: segment reject limit reached, aborting operation +DETAIL: Last error was: invalid input syntax for type integer: "1 4", column a +CONTEXT: COPY errcopy, line 3, column a: "1 4" +SELECT * FROM errcopy; + a | b | c +---+---+--- +(0 rows) + +SELECT relname, filename, bytenum, errmsg FROM gp_read_error_log('errcopy'); + relname | filename | bytenum | errmsg +---------+----------+---------+---------------------------------------------------------------------- + errcopy | | | invalid input syntax for type integer: "1 2 0", column a + errcopy | | | invalid input syntax for type integer: "1 3 4", column a + errcopy | | | invalid input syntax for type integer: "1 4", column a +(3 rows) + +-- abort and keep +TRUNCATE errcopy; +SELECT gp_truncate_error_log('errcopy'); + gp_truncate_error_log +----------------------- + t +(1 row) + +COPY errcopy from stdin delimiter '/' log errors segment reject limit 3 rows; +ERROR: segment reject limit reached, aborting operation +DETAIL: Last error was: missing data for column "b" (seg0 subraa4-mac:40000 pid=87505) +CONTEXT: COPY errcopy, line 5: "1" +SELECT relname, filename, bytenum, errmsg FROM gp_read_error_log('errcopy'); + relname | filename | bytenum | errmsg +---------+----------+---------+--------------------------------------- + errcopy | | | extra data after last expected column + errcopy | | | missing data for column "b" + errcopy | | | missing data for column "c" +(3 rows) + +-- +-- Test error handling during COPY TO +-- +-- To trigger an error, we use an output function that throws an +-- error on a particular value. The trigger value is 1234. +-- +CREATE TYPE broken_int4; +CREATE FUNCTION broken_int4in(cstring) + RETURNS broken_int4 + AS 'int4in' + LANGUAGE internal IMMUTABLE STRICT; +NOTICE: return type broken_int4 is only a shell +CREATE FUNCTION broken_int4out(broken_int4) + RETURNS cstring + AS '@abs_builddir@/regress@DLSUFFIX@', 'broken_int4out' + LANGUAGE C IMMUTABLE STRICT; +NOTICE: argument type broken_int4 is only a shell +CREATE TYPE broken_int4 ( + internallength = 4, + input = broken_int4in, + output = broken_int4out, + alignment = int4, + passedbyvalue +); +-- avoid hitting the error when analyzing the table. +set gp_autostats_mode = 'None'; +-- Create a table, using the funny datatype, and load it with integers +-- 1-10000. The input function works normally, so this works, but if you +-- try to select the row with value 1234 from it, the output function will +-- throw an error. +CREATE TABLE broken_type_test (b broken_int4); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause, and no column type is suitable for a distribution key. Creating a NULL policy entry. +insert into broken_type_test select g::text::broken_int4 from generate_series(1, 10000) g; +-- Should work, since we don't hit the trigger value 1234. (In principle, +-- that's not guaranteed; there's no ORDER BY, so the system could return +-- any 10 rows. In practice, this seems pretty safe.) +copy (select * from broken_type_test limit 10) to '/tmp/g'; +-- Should fail, because we try to output everything, including 1234 +copy (select * from broken_type_test) to '/tmp/g'; +ERROR: testing failure in output function +DETAIL: The trigger value was 1234 +copy broken_type_test to '/tmp/g'; +ERROR: testing failure in output function +DETAIL: The trigger value was 1234 +-- Don't leave behind a table that you can't dump. +drop table broken_type_test; +drop type broken_int4 cascade; -- drops the I/O functions, too. +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function broken_int4in(cstring) +drop cascades to function broken_int4out(broken_int4) +-- Test COPY FROM and TO work for catalog tables in dispatch +-- connection +BEGIN; +SET allow_system_table_mods=on; +COPY gp_configuration_history from stdin with delimiter '|'; +COPY (select dbid from gp_configuration_history where dbid=12345) to stdin; +12345 +RESET allow_system_table_mods; +-- cannot copy to a catalog table with allow_system_table_mods=off; +COPY gp_configuration_history from stdin with delimiter '|'; +ERROR: permission denied: "gp_configuration_history" is a system catalog +HINT: Make sure the configuration parameter allow_system_table_mods is set. +ABORT; +-- GPDB makes the database name, and many other things, available +-- as environment variables to the program. Test those. +-- +-- Perform these tests in a funnily named database, to test +-- escaping +set client_min_messages='warning'; +DROP DATABASE IF EXISTS "funny copy""db'with\\quotes"; +reset client_min_messages; +CREATE DATABASE "funny copy""db'with\\quotes"; +\c "funny copy""db'with\\quotes" +-- echo will behave differently on different platforms, force to use bash with -E option +COPY (SELECT 'data1') TO PROGRAM 'cat > /tmp/gpcopyenvtest; /usr/bin/env bash -c ''echo -E database in COPY TO: $GP_DATABASE >> /tmp/gpcopyenvtest '' ' ESCAPE 'OFF'; +CREATE TABLE foo (t text); +COPY foo FROM PROGRAM 'cat /tmp/gpcopyenvtest' ESCAPE 'OFF'; +COPY foo FROM PROGRAM '/usr/bin/env bash -c ''echo -E database in COPY FROM: $GP_DATABASE''' ESCAPE 'OFF'; +select * from foo; + t +--------------------------------------------------- + data1 + database in COPY FROM: funny copy"db'with\\quotes + database in COPY TO: funny copy"db'with\\quotes +(3 rows) + diff --git a/src/test/singlenode_regress/output/largeobject.source b/src/test/singlenode_regress/output/largeobject.source new file mode 100644 index 00000000000..91d33b4d0c7 --- /dev/null +++ b/src/test/singlenode_regress/output/largeobject.source @@ -0,0 +1,492 @@ +-- +-- Test large object support +-- +-- ensure consistent test output regardless of the default bytea format +SET bytea_output TO escape; +-- Load a file +CREATE TABLE lotest_stash_values (loid oid, fd integer); +-- lo_creat(mode integer) returns oid +-- The mode arg to lo_creat is unused, some vestigal holdover from ancient times +-- returns the large object id +INSERT INTO lotest_stash_values (loid) SELECT lo_creat(42); +-- Test ALTER LARGE OBJECT +CREATE ROLE regress_lo_user; +DO $$ + BEGIN + EXECUTE 'ALTER LARGE OBJECT ' || (select loid from lotest_stash_values) + || ' OWNER TO regress_lo_user'; + END +$$; +SELECT + rol.rolname +FROM + lotest_stash_values s + JOIN pg_largeobject_metadata lo ON s.loid = lo.oid + JOIN pg_authid rol ON lo.lomowner = rol.oid; + rolname +----------------- + regress_lo_user +(1 row) + +-- NOTE: large objects require transactions +BEGIN; +-- lo_open(lobjId oid, mode integer) returns integer +-- The mode parameter to lo_open uses two constants: +-- INV_READ = 0x20000 +-- INV_WRITE = 0x40000 +-- The return value is a file descriptor-like value which remains valid for the +-- transaction. +UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +-- loread/lowrite names are wonky, different from other functions which are lo_* +-- lowrite(fd integer, data bytea) returns integer +-- the integer is the number of bytes written +SELECT lowrite(fd, ' +I wandered lonely as a cloud +That floats on high o''er vales and hills, +When all at once I saw a crowd, +A host, of golden daffodils; +Beside the lake, beneath the trees, +Fluttering and dancing in the breeze. + +Continuous as the stars that shine +And twinkle on the milky way, +They stretched in never-ending line +Along the margin of a bay: +Ten thousand saw I at a glance, +Tossing their heads in sprightly dance. + +The waves beside them danced; but they +Out-did the sparkling waves in glee: +A poet could not but be gay, +In such a jocund company: +I gazed--and gazed--but little thought +What wealth the show to me had brought: + +For oft, when on my couch I lie +In vacant or in pensive mood, +They flash upon that inward eye +Which is the bliss of solitude; +And then my heart with pleasure fills, +And dances with the daffodils. + + -- William Wordsworth +') FROM lotest_stash_values; + lowrite +--------- + 848 +(1 row) + +-- lo_close(fd integer) returns integer +-- return value is 0 for success, or <0 for error (actually only -1, but...) +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +-- Copy to another large object. +-- Note: we intentionally don't remove the object created here; +-- it's left behind to help test pg_dump. +SELECT lo_from_bytea(0, lo_get(loid)) AS newloid FROM lotest_stash_values +\gset +-- Add a comment to it, as well, for pg_dump/pg_upgrade testing. +COMMENT ON LARGE OBJECT :newloid IS 'I Wandered Lonely as a Cloud'; +-- Read out a portion +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +-- lo_lseek(fd integer, offset integer, whence integer) returns integer +-- offset is in bytes, whence is one of three values: +-- SEEK_SET (= 0) meaning relative to beginning +-- SEEK_CUR (= 1) meaning relative to current position +-- SEEK_END (= 2) meaning relative to end (offset better be negative) +-- returns current position in file +SELECT lo_lseek(fd, 104, 0) FROM lotest_stash_values; + lo_lseek +---------- + 104 +(1 row) + +-- loread/lowrite names are wonky, different from other functions which are lo_* +-- loread(fd integer, len integer) returns bytea +SELECT loread(fd, 28) FROM lotest_stash_values; + loread +------------------------------ + A host, of golden daffodils; +(1 row) + +SELECT lo_lseek(fd, -19, 1) FROM lotest_stash_values; + lo_lseek +---------- + 113 +(1 row) + +SELECT lowrite(fd, 'n') FROM lotest_stash_values; + lowrite +--------- + 1 +(1 row) + +SELECT lo_tell(fd) FROM lotest_stash_values; + lo_tell +--------- + 114 +(1 row) + +SELECT lo_lseek(fd, -744, 2) FROM lotest_stash_values; + lo_lseek +---------- + 104 +(1 row) + +SELECT loread(fd, 28) FROM lotest_stash_values; + loread +------------------------------ + A host, on golden daffodils; +(1 row) + +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +-- Test resource management +BEGIN; +SELECT lo_open(loid, x'40000'::int) from lotest_stash_values; + lo_open +--------- + 0 +(1 row) + +ABORT; +DO $$ +DECLARE + loid oid; +BEGIN + SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; + PERFORM lo_export(loid, '@abs_builddir@/results/invalid/path'); +EXCEPTION + WHEN UNDEFINED_FILE THEN RAISE NOTICE 'could not open file, as expected'; +END; +$$; +NOTICE: could not open file, as expected +-- Test truncation. +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +SELECT lo_truncate(fd, 11) FROM lotest_stash_values; + lo_truncate +------------- + 0 +(1 row) + +SELECT loread(fd, 15) FROM lotest_stash_values; + loread +---------------- + \012I wandered +(1 row) + +SELECT lo_truncate(fd, 10000) FROM lotest_stash_values; + lo_truncate +------------- + 0 +(1 row) + +SELECT loread(fd, 10) FROM lotest_stash_values; + loread +------------------------------------------ + \000\000\000\000\000\000\000\000\000\000 +(1 row) + +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; + lo_lseek +---------- + 10000 +(1 row) + +SELECT lo_tell(fd) FROM lotest_stash_values; + lo_tell +--------- + 10000 +(1 row) + +SELECT lo_truncate(fd, 5000) FROM lotest_stash_values; + lo_truncate +------------- + 0 +(1 row) + +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; + lo_lseek +---------- + 5000 +(1 row) + +SELECT lo_tell(fd) FROM lotest_stash_values; + lo_tell +--------- + 5000 +(1 row) + +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +-- Test 64-bit large object functions. +BEGIN; +UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +SELECT lo_lseek64(fd, 4294967296, 0) FROM lotest_stash_values; + lo_lseek64 +------------ + 4294967296 +(1 row) + +SELECT lowrite(fd, 'offset:4GB') FROM lotest_stash_values; + lowrite +--------- + 10 +(1 row) + +SELECT lo_tell64(fd) FROM lotest_stash_values; + lo_tell64 +------------ + 4294967306 +(1 row) + +SELECT lo_lseek64(fd, -10, 1) FROM lotest_stash_values; + lo_lseek64 +------------ + 4294967296 +(1 row) + +SELECT lo_tell64(fd) FROM lotest_stash_values; + lo_tell64 +------------ + 4294967296 +(1 row) + +SELECT loread(fd, 10) FROM lotest_stash_values; + loread +------------ + offset:4GB +(1 row) + +SELECT lo_truncate64(fd, 5000000000) FROM lotest_stash_values; + lo_truncate64 +--------------- + 0 +(1 row) + +SELECT lo_lseek64(fd, 0, 2) FROM lotest_stash_values; + lo_lseek64 +------------ + 5000000000 +(1 row) + +SELECT lo_tell64(fd) FROM lotest_stash_values; + lo_tell64 +------------ + 5000000000 +(1 row) + +SELECT lo_truncate64(fd, 3000000000) FROM lotest_stash_values; + lo_truncate64 +--------------- + 0 +(1 row) + +SELECT lo_lseek64(fd, 0, 2) FROM lotest_stash_values; + lo_lseek64 +------------ + 3000000000 +(1 row) + +SELECT lo_tell64(fd) FROM lotest_stash_values; + lo_tell64 +------------ + 3000000000 +(1 row) + +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +-- lo_unlink(lobjId oid) returns integer +-- return value appears to always be 1 +SELECT lo_unlink(loid) from lotest_stash_values; + lo_unlink +----------- + 1 +(1 row) + +TRUNCATE lotest_stash_values; +INSERT INTO lotest_stash_values (loid) SELECT lo_import('@abs_srcdir@/data/tenk.data'); +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +-- verify length of large object +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; + lo_lseek +---------- + 670800 +(1 row) + +-- with the default BLCKSZ, LOBLKSIZE = 2048, so this positions us for a block +-- edge case +SELECT lo_lseek(fd, 2030, 0) FROM lotest_stash_values; + lo_lseek +---------- + 2030 +(1 row) + +-- this should get half of the value from page 0 and half from page 1 of the +-- large object +SELECT loread(fd, 36) FROM lotest_stash_values; + loread +----------------------------------------------------------------- + AAA\011FBAAAA\011VVVVxx\0122513\01132\0111\0111\0113\01113\0111 +(1 row) + +SELECT lo_tell(fd) FROM lotest_stash_values; + lo_tell +--------- + 2066 +(1 row) + +SELECT lo_lseek(fd, -26, 1) FROM lotest_stash_values; + lo_lseek +---------- + 2040 +(1 row) + +SELECT lowrite(fd, 'abcdefghijklmnop') FROM lotest_stash_values; + lowrite +--------- + 16 +(1 row) + +SELECT lo_lseek(fd, 2030, 0) FROM lotest_stash_values; + lo_lseek +---------- + 2030 +(1 row) + +SELECT loread(fd, 36) FROM lotest_stash_values; + loread +----------------------------------------------------- + AAA\011FBAAAAabcdefghijklmnop1\0111\0113\01113\0111 +(1 row) + +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +SELECT lo_export(loid, '@abs_builddir@/results/lotest.txt') FROM lotest_stash_values; + lo_export +----------- + 1 +(1 row) + +\lo_import '@abs_builddir@/results/lotest.txt' +\set newloid :LASTOID +-- just make sure \lo_export does not barf +\lo_export :newloid '@abs_builddir@/results/lotest2.txt' +-- This is a hack to test that export/import are reversible +-- This uses knowledge about the inner workings of large object mechanism +-- which should not be used outside it. This makes it a HACK +SELECT pageno, data FROM pg_largeobject WHERE loid = (SELECT loid from lotest_stash_values) +EXCEPT +SELECT pageno, data FROM pg_largeobject WHERE loid = :newloid; + pageno | data +--------+------ +(0 rows) + +SELECT lo_unlink(loid) FROM lotest_stash_values; + lo_unlink +----------- + 1 +(1 row) + +TRUNCATE lotest_stash_values; +\lo_unlink :newloid +\lo_import '@abs_builddir@/results/lotest.txt' +\set newloid_1 :LASTOID +SELECT lo_from_bytea(0, lo_get(:newloid_1)) AS newloid_2 +\gset +SELECT md5(lo_get(:newloid_1)) = md5(lo_get(:newloid_2)); + ?column? +---------- + t +(1 row) + +SELECT lo_get(:newloid_1, 0, 20); + lo_get +------------------------------------------- + 8800\0110\0110\0110\0110\0110\0110\011800 +(1 row) + +SELECT lo_get(:newloid_1, 10, 20); + lo_get +------------------------------------------- + \0110\0110\0110\011800\011800\0113800\011 +(1 row) + +SELECT lo_put(:newloid_1, 5, decode('afafafaf', 'hex')); + lo_put +-------- + +(1 row) + +SELECT lo_get(:newloid_1, 0, 20); + lo_get +------------------------------------------------- + 8800\011\257\257\257\2570\0110\0110\0110\011800 +(1 row) + +SELECT lo_put(:newloid_1, 4294967310, 'foo'); + lo_put +-------- + +(1 row) + +SELECT lo_get(:newloid_1); +ERROR: large object read request is too large +SELECT lo_get(:newloid_1, 4294967294, 100); + lo_get +--------------------------------------------------------------------- + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000foo +(1 row) + +\lo_unlink :newloid_1 +\lo_unlink :newloid_2 +-- This object is left in the database for pg_dump test purposes +SELECT lo_from_bytea(0, E'\\xdeadbeef') AS newloid +\gset +SET bytea_output TO hex; +SELECT lo_get(:newloid); + lo_get +------------ + \xdeadbeef +(1 row) + +-- Create one more object that we leave behind for testing pg_dump/pg_upgrade; +-- this one intentionally has an OID in the system range +SELECT lo_create(2121); + lo_create +----------- + 2121 +(1 row) + +COMMENT ON LARGE OBJECT 2121 IS 'testing comments'; +-- Clean up +DROP TABLE lotest_stash_values; +DROP ROLE regress_lo_user; diff --git a/src/test/singlenode_regress/output/largeobject_1.source b/src/test/singlenode_regress/output/largeobject_1.source new file mode 100644 index 00000000000..cb910e2eefd --- /dev/null +++ b/src/test/singlenode_regress/output/largeobject_1.source @@ -0,0 +1,492 @@ +-- +-- Test large object support +-- +-- ensure consistent test output regardless of the default bytea format +SET bytea_output TO escape; +-- Load a file +CREATE TABLE lotest_stash_values (loid oid, fd integer); +-- lo_creat(mode integer) returns oid +-- The mode arg to lo_creat is unused, some vestigal holdover from ancient times +-- returns the large object id +INSERT INTO lotest_stash_values (loid) SELECT lo_creat(42); +-- Test ALTER LARGE OBJECT +CREATE ROLE regress_lo_user; +DO $$ + BEGIN + EXECUTE 'ALTER LARGE OBJECT ' || (select loid from lotest_stash_values) + || ' OWNER TO regress_lo_user'; + END +$$; +SELECT + rol.rolname +FROM + lotest_stash_values s + JOIN pg_largeobject_metadata lo ON s.loid = lo.oid + JOIN pg_authid rol ON lo.lomowner = rol.oid; + rolname +----------------- + regress_lo_user +(1 row) + +-- NOTE: large objects require transactions +BEGIN; +-- lo_open(lobjId oid, mode integer) returns integer +-- The mode parameter to lo_open uses two constants: +-- INV_READ = 0x20000 +-- INV_WRITE = 0x40000 +-- The return value is a file descriptor-like value which remains valid for the +-- transaction. +UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +-- loread/lowrite names are wonky, different from other functions which are lo_* +-- lowrite(fd integer, data bytea) returns integer +-- the integer is the number of bytes written +SELECT lowrite(fd, ' +I wandered lonely as a cloud +That floats on high o''er vales and hills, +When all at once I saw a crowd, +A host, of golden daffodils; +Beside the lake, beneath the trees, +Fluttering and dancing in the breeze. + +Continuous as the stars that shine +And twinkle on the milky way, +They stretched in never-ending line +Along the margin of a bay: +Ten thousand saw I at a glance, +Tossing their heads in sprightly dance. + +The waves beside them danced; but they +Out-did the sparkling waves in glee: +A poet could not but be gay, +In such a jocund company: +I gazed--and gazed--but little thought +What wealth the show to me had brought: + +For oft, when on my couch I lie +In vacant or in pensive mood, +They flash upon that inward eye +Which is the bliss of solitude; +And then my heart with pleasure fills, +And dances with the daffodils. + + -- William Wordsworth +') FROM lotest_stash_values; + lowrite +--------- + 848 +(1 row) + +-- lo_close(fd integer) returns integer +-- return value is 0 for success, or <0 for error (actually only -1, but...) +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +-- Copy to another large object. +-- Note: we intentionally don't remove the object created here; +-- it's left behind to help test pg_dump. +SELECT lo_from_bytea(0, lo_get(loid)) AS newloid FROM lotest_stash_values +\gset +-- Add a comment to it, as well, for pg_dump/pg_upgrade testing. +COMMENT ON LARGE OBJECT :newloid IS 'I Wandered Lonely as a Cloud'; +-- Read out a portion +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +-- lo_lseek(fd integer, offset integer, whence integer) returns integer +-- offset is in bytes, whence is one of three values: +-- SEEK_SET (= 0) meaning relative to beginning +-- SEEK_CUR (= 1) meaning relative to current position +-- SEEK_END (= 2) meaning relative to end (offset better be negative) +-- returns current position in file +SELECT lo_lseek(fd, 104, 0) FROM lotest_stash_values; + lo_lseek +---------- + 104 +(1 row) + +-- loread/lowrite names are wonky, different from other functions which are lo_* +-- loread(fd integer, len integer) returns bytea +SELECT loread(fd, 28) FROM lotest_stash_values; + loread +------------------------------ + A host, of golden daffodils; +(1 row) + +SELECT lo_lseek(fd, -19, 1) FROM lotest_stash_values; + lo_lseek +---------- + 113 +(1 row) + +SELECT lowrite(fd, 'n') FROM lotest_stash_values; + lowrite +--------- + 1 +(1 row) + +SELECT lo_tell(fd) FROM lotest_stash_values; + lo_tell +--------- + 114 +(1 row) + +SELECT lo_lseek(fd, -744, 2) FROM lotest_stash_values; + lo_lseek +---------- + 104 +(1 row) + +SELECT loread(fd, 28) FROM lotest_stash_values; + loread +------------------------------ + A host, on golden daffodils; +(1 row) + +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +-- Test resource management +BEGIN; +SELECT lo_open(loid, x'40000'::int) from lotest_stash_values; + lo_open +--------- + 0 +(1 row) + +ABORT; +DO $$ +DECLARE + loid oid; +BEGIN + SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; + PERFORM lo_export(loid, '@abs_builddir@/results/invalid/path'); +EXCEPTION + WHEN UNDEFINED_FILE THEN RAISE NOTICE 'could not open file, as expected'; +END; +$$; +NOTICE: could not open file, as expected +-- Test truncation. +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +SELECT lo_truncate(fd, 11) FROM lotest_stash_values; + lo_truncate +------------- + 0 +(1 row) + +SELECT loread(fd, 15) FROM lotest_stash_values; + loread +---------------- + \012I wandered +(1 row) + +SELECT lo_truncate(fd, 10000) FROM lotest_stash_values; + lo_truncate +------------- + 0 +(1 row) + +SELECT loread(fd, 10) FROM lotest_stash_values; + loread +------------------------------------------ + \000\000\000\000\000\000\000\000\000\000 +(1 row) + +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; + lo_lseek +---------- + 10000 +(1 row) + +SELECT lo_tell(fd) FROM lotest_stash_values; + lo_tell +--------- + 10000 +(1 row) + +SELECT lo_truncate(fd, 5000) FROM lotest_stash_values; + lo_truncate +------------- + 0 +(1 row) + +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; + lo_lseek +---------- + 5000 +(1 row) + +SELECT lo_tell(fd) FROM lotest_stash_values; + lo_tell +--------- + 5000 +(1 row) + +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +-- Test 64-bit large object functions. +BEGIN; +UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +SELECT lo_lseek64(fd, 4294967296, 0) FROM lotest_stash_values; + lo_lseek64 +------------ + 4294967296 +(1 row) + +SELECT lowrite(fd, 'offset:4GB') FROM lotest_stash_values; + lowrite +--------- + 10 +(1 row) + +SELECT lo_tell64(fd) FROM lotest_stash_values; + lo_tell64 +------------ + 4294967306 +(1 row) + +SELECT lo_lseek64(fd, -10, 1) FROM lotest_stash_values; + lo_lseek64 +------------ + 4294967296 +(1 row) + +SELECT lo_tell64(fd) FROM lotest_stash_values; + lo_tell64 +------------ + 4294967296 +(1 row) + +SELECT loread(fd, 10) FROM lotest_stash_values; + loread +------------ + offset:4GB +(1 row) + +SELECT lo_truncate64(fd, 5000000000) FROM lotest_stash_values; + lo_truncate64 +--------------- + 0 +(1 row) + +SELECT lo_lseek64(fd, 0, 2) FROM lotest_stash_values; + lo_lseek64 +------------ + 5000000000 +(1 row) + +SELECT lo_tell64(fd) FROM lotest_stash_values; + lo_tell64 +------------ + 5000000000 +(1 row) + +SELECT lo_truncate64(fd, 3000000000) FROM lotest_stash_values; + lo_truncate64 +--------------- + 0 +(1 row) + +SELECT lo_lseek64(fd, 0, 2) FROM lotest_stash_values; + lo_lseek64 +------------ + 3000000000 +(1 row) + +SELECT lo_tell64(fd) FROM lotest_stash_values; + lo_tell64 +------------ + 3000000000 +(1 row) + +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +-- lo_unlink(lobjId oid) returns integer +-- return value appears to always be 1 +SELECT lo_unlink(loid) from lotest_stash_values; + lo_unlink +----------- + 1 +(1 row) + +TRUNCATE lotest_stash_values; +INSERT INTO lotest_stash_values (loid) SELECT lo_import('@abs_srcdir@/data/tenk.data'); +BEGIN; +UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); +-- verify length of large object +SELECT lo_lseek(fd, 0, 2) FROM lotest_stash_values; + lo_lseek +---------- + 680800 +(1 row) + +-- with the default BLCKSZ, LOBLKSIZE = 2048, so this positions us for a block +-- edge case +SELECT lo_lseek(fd, 2030, 0) FROM lotest_stash_values; + lo_lseek +---------- + 2030 +(1 row) + +-- this should get half of the value from page 0 and half from page 1 of the +-- large object +SELECT loread(fd, 36) FROM lotest_stash_values; + loread +-------------------------------------------------------------- + 44\011144\0111144\0114144\0119144\01188\01189\011SNAAAA\011F +(1 row) + +SELECT lo_tell(fd) FROM lotest_stash_values; + lo_tell +--------- + 2066 +(1 row) + +SELECT lo_lseek(fd, -26, 1) FROM lotest_stash_values; + lo_lseek +---------- + 2040 +(1 row) + +SELECT lowrite(fd, 'abcdefghijklmnop') FROM lotest_stash_values; + lowrite +--------- + 16 +(1 row) + +SELECT lo_lseek(fd, 2030, 0) FROM lotest_stash_values; + lo_lseek +---------- + 2030 +(1 row) + +SELECT loread(fd, 36) FROM lotest_stash_values; + loread +-------------------------------------------------- + 44\011144\011114abcdefghijklmnop9\011SNAAAA\011F +(1 row) + +SELECT lo_close(fd) FROM lotest_stash_values; + lo_close +---------- + 0 +(1 row) + +END; +SELECT lo_export(loid, '@abs_builddir@/results/lotest.txt') FROM lotest_stash_values; + lo_export +----------- + 1 +(1 row) + +\lo_import '@abs_builddir@/results/lotest.txt' +\set newloid :LASTOID +-- just make sure \lo_export does not barf +\lo_export :newloid '@abs_builddir@/results/lotest2.txt' +-- This is a hack to test that export/import are reversible +-- This uses knowledge about the inner workings of large object mechanism +-- which should not be used outside it. This makes it a HACK +SELECT pageno, data FROM pg_largeobject WHERE loid = (SELECT loid from lotest_stash_values) +EXCEPT +SELECT pageno, data FROM pg_largeobject WHERE loid = :newloid; + pageno | data +--------+------ +(0 rows) + +SELECT lo_unlink(loid) FROM lotest_stash_values; + lo_unlink +----------- + 1 +(1 row) + +TRUNCATE lotest_stash_values; +\lo_unlink :newloid +\lo_import '@abs_builddir@/results/lotest.txt' +\set newloid_1 :LASTOID +SELECT lo_from_bytea(0, lo_get(:newloid_1)) AS newloid_2 +\gset +SELECT md5(lo_get(:newloid_1)) = md5(lo_get(:newloid_2)); + ?column? +---------- + t +(1 row) + +SELECT lo_get(:newloid_1, 0, 20); + lo_get +------------------------------------------- + 8800\0110\0110\0110\0110\0110\0110\011800 +(1 row) + +SELECT lo_get(:newloid_1, 10, 20); + lo_get +------------------------------------------- + \0110\0110\0110\011800\011800\0113800\011 +(1 row) + +SELECT lo_put(:newloid_1, 5, decode('afafafaf', 'hex')); + lo_put +-------- + +(1 row) + +SELECT lo_get(:newloid_1, 0, 20); + lo_get +------------------------------------------------- + 8800\011\257\257\257\2570\0110\0110\0110\011800 +(1 row) + +SELECT lo_put(:newloid_1, 4294967310, 'foo'); + lo_put +-------- + +(1 row) + +SELECT lo_get(:newloid_1); +ERROR: large object read request is too large +SELECT lo_get(:newloid_1, 4294967294, 100); + lo_get +--------------------------------------------------------------------- + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000foo +(1 row) + +\lo_unlink :newloid_1 +\lo_unlink :newloid_2 +-- This object is left in the database for pg_dump test purposes +SELECT lo_from_bytea(0, E'\\xdeadbeef') AS newloid +\gset +SET bytea_output TO hex; +SELECT lo_get(:newloid); + lo_get +------------ + \xdeadbeef +(1 row) + +-- Create one more object that we leave behind for testing pg_dump/pg_upgrade; +-- this one intentionally has an OID in the system range +SELECT lo_create(2121); + lo_create +----------- + 2121 +(1 row) + +COMMENT ON LARGE OBJECT 2121 IS 'testing comments'; +-- Clean up +DROP TABLE lotest_stash_values; +DROP ROLE regress_lo_user; diff --git a/src/test/singlenode_regress/output/misc.source b/src/test/singlenode_regress/output/misc.source new file mode 100644 index 00000000000..b9595cc2391 --- /dev/null +++ b/src/test/singlenode_regress/output/misc.source @@ -0,0 +1,692 @@ +-- +-- MISC +-- +-- +-- BTREE +-- +UPDATE onek + SET unique1 = onek.unique1 + 1; +UPDATE onek + SET unique1 = onek.unique1 - 1; +-- +-- BTREE partial +-- +-- UPDATE onek2 +-- SET unique1 = onek2.unique1 + 1; +--UPDATE onek2 +-- SET unique1 = onek2.unique1 - 1; +-- +-- BTREE shutting out non-functional updates +-- +-- the following two tests seem to take a long time on some +-- systems. This non-func update stuff needs to be examined +-- more closely. - jolly (2/22/96) +-- +UPDATE tmp + SET stringu1 = reverse_name(onek.stringu1) + FROM onek + WHERE onek.stringu1 = 'JBAAAA' and + onek.stringu1 = tmp.stringu1; +UPDATE tmp + SET stringu1 = reverse_name(onek2.stringu1) + FROM onek2 + WHERE onek2.stringu1 = 'JCAAAA' and + onek2.stringu1 = tmp.stringu1; +DROP TABLE tmp; +--UPDATE person* +-- SET age = age + 1; +--UPDATE person* +-- SET age = age + 3 +-- WHERE name = 'linda'; +-- +-- copy +-- +COPY onek TO '@abs_builddir@/results/onek.data'; +DELETE FROM onek; +COPY onek FROM '@abs_builddir@/results/onek.data'; +SELECT unique1 FROM onek WHERE unique1 < 2 ORDER BY unique1; + unique1 +--------- + 0 + 1 +(2 rows) + +DELETE FROM onek2; +COPY onek2 FROM '@abs_builddir@/results/onek.data'; +SELECT unique1 FROM onek2 WHERE unique1 < 2 ORDER BY unique1; + unique1 +--------- + 0 + 1 +(2 rows) + +COPY BINARY stud_emp TO '@abs_builddir@/results/stud_emp.data'; +DELETE FROM stud_emp; +COPY BINARY stud_emp FROM '@abs_builddir@/results/stud_emp.data'; +SELECT * FROM stud_emp; + name | age | location | salary | manager | gpa | percent +-------+-----+------------+--------+---------+-----+--------- + jeff | 23 | (8,7.7) | 600 | sharon | 3.5 | + cim | 30 | (10.5,4.7) | 400 | | 3.4 | + linda | 19 | (0.9,6.1) | 100 | | 2.9 | +(3 rows) + +-- COPY aggtest FROM stdin; +-- 56 7.8 +-- 100 99.097 +-- 0 0.09561 +-- 42 324.78 +-- . +-- COPY aggtest TO stdout; +-- +-- inheritance stress test +-- +SELECT * FROM a_star*; + class | a +-------+---- + a | 1 + a | 2 + a | + b | 3 + b | 4 + b | + b | + c | 5 + c | 6 + c | + c | + d | 7 + d | 8 + d | 9 + d | 10 + d | + d | 11 + d | 12 + d | 13 + d | + d | + d | + d | 14 + d | + d | + d | + d | + e | 15 + e | 16 + e | 17 + e | + e | 18 + e | + e | + f | 19 + f | 20 + f | 21 + f | 22 + f | + f | 24 + f | 25 + f | 26 + f | + f | + f | + f | 27 + f | + f | + f | + f | +(50 rows) + +SELECT * + FROM b_star* x + WHERE x.b = text 'bumble' or x.a < 3; + class | a | b +-------+---+-------- + b | | bumble +(1 row) + +SELECT class, a + FROM c_star* x + WHERE x.c ~ text 'hi'; + class | a +-------+---- + c | 5 + c | + d | 7 + d | 8 + d | 10 + d | + d | 12 + d | + d | + d | + e | 15 + e | 16 + e | + e | + f | 19 + f | 20 + f | 21 + f | + f | 24 + f | + f | + f | +(22 rows) + +SELECT class, b, c + FROM d_star* x + WHERE x.a < 100; + class | b | c +-------+---------+------------ + d | grumble | hi sunita + d | stumble | hi koko + d | rumble | + d | | hi kristin + d | fumble | + d | | hi avi + d | | + d | | +(8 rows) + +SELECT class, c FROM e_star* x WHERE x.c NOTNULL; + class | c +-------+------------- + e | hi carol + e | hi bob + e | hi michelle + e | hi elisa + f | hi claire + f | hi mike + f | hi marcel + f | hi keith + f | hi marc + f | hi allison + f | hi jeff + f | hi carl +(12 rows) + +SELECT * FROM f_star* x WHERE x.c ISNULL; + class | a | c | e | f +-------+----+---+-----+------------------------------------------- + f | 22 | | -7 | ((111,555),(222,666),(333,777),(444,888)) + f | 25 | | -9 | + f | 26 | | | ((11111,33333),(22222,44444)) + f | | | -11 | ((1111111,3333333),(2222222,4444444)) + f | 27 | | | + f | | | -12 | + f | | | | ((11111111,33333333),(22222222,44444444)) + f | | | | +(8 rows) + +-- grouping and aggregation on inherited sets have been busted in the past... +SELECT sum(a) FROM a_star*; + sum +----- + 355 +(1 row) + +SELECT class, sum(a) FROM a_star* GROUP BY class ORDER BY class; + class | sum +-------+----- + a | 3 + b | 7 + c | 11 + d | 84 + e | 66 + f | 184 +(6 rows) + +ALTER TABLE f_star RENAME COLUMN f TO ff; +ALTER TABLE e_star* RENAME COLUMN e TO ee; +ALTER TABLE d_star* RENAME COLUMN d TO dd; +ALTER TABLE c_star* RENAME COLUMN c TO cc; +ALTER TABLE b_star* RENAME COLUMN b TO bb; +ALTER TABLE a_star* RENAME COLUMN a TO aa; +SELECT class, aa + FROM a_star* x + WHERE aa ISNULL; + class | aa +-------+---- + a | + b | + b | + c | + c | + d | + d | + d | + d | + d | + d | + d | + d | + e | + e | + e | + f | + f | + f | + f | + f | + f | + f | + f | +(24 rows) + +-- As of Postgres 7.1, ALTER implicitly recurses, +-- so this should be same as ALTER a_star* +ALTER TABLE a_star RENAME COLUMN aa TO foo; +SELECT class, foo + FROM a_star* x + WHERE x.foo >= 2; + class | foo +-------+----- + a | 2 + b | 3 + b | 4 + c | 5 + c | 6 + d | 7 + d | 8 + d | 9 + d | 10 + d | 11 + d | 12 + d | 13 + d | 14 + e | 15 + e | 16 + e | 17 + e | 18 + f | 19 + f | 20 + f | 21 + f | 22 + f | 24 + f | 25 + f | 26 + f | 27 +(25 rows) + +ALTER TABLE a_star RENAME COLUMN foo TO aa; +SELECT * + from a_star* + WHERE aa < 1000; + class | aa +-------+---- + a | 1 + a | 2 + b | 3 + b | 4 + c | 5 + c | 6 + d | 7 + d | 8 + d | 9 + d | 10 + d | 11 + d | 12 + d | 13 + d | 14 + e | 15 + e | 16 + e | 17 + e | 18 + f | 19 + f | 20 + f | 21 + f | 22 + f | 24 + f | 25 + f | 26 + f | 27 +(26 rows) + +ALTER TABLE f_star ADD COLUMN f int4; +UPDATE f_star SET f = 10; +ALTER TABLE e_star* ADD COLUMN e int4; +--UPDATE e_star* SET e = 42; +SELECT * FROM e_star*; + class | aa | cc | ee | e +-------+----+-------------+-----+--- + e | 15 | hi carol | -1 | + e | 16 | hi bob | | + e | 17 | | -2 | + e | | hi michelle | -3 | + e | 18 | | | + e | | hi elisa | | + e | | | -4 | + f | 19 | hi claire | -5 | + f | 20 | hi mike | -6 | + f | 21 | hi marcel | | + f | 22 | | -7 | + f | | hi keith | -8 | + f | 24 | hi marc | | + f | 25 | | -9 | + f | 26 | | | + f | | hi allison | -10 | + f | | hi jeff | | + f | | | -11 | + f | 27 | | | + f | | hi carl | | + f | | | -12 | + f | | | | + f | | | | +(23 rows) + +ALTER TABLE a_star* ADD COLUMN a text; +NOTICE: merging definition of column "a" for child "d_star" +-- That ALTER TABLE should have added TOAST tables. +SELECT relname, reltoastrelid <> 0 AS has_toast_table + FROM pg_class + WHERE oid::regclass IN ('a_star', 'c_star') + ORDER BY 1; + relname | has_toast_table +---------+----------------- + a_star | t + c_star | t +(2 rows) + +--UPDATE b_star* +-- SET a = text 'gazpacho' +-- WHERE aa > 4; +SELECT class, aa, a FROM a_star*; + class | aa | a +-------+----+--- + a | 1 | + a | 2 | + a | | + b | 3 | + b | 4 | + b | | + b | | + c | 5 | + c | 6 | + c | | + c | | + d | 7 | + d | 8 | + d | 9 | + d | 10 | + d | | + d | 11 | + d | 12 | + d | 13 | + d | | + d | | + d | | + d | 14 | + d | | + d | | + d | | + d | | + e | 15 | + e | 16 | + e | 17 | + e | | + e | 18 | + e | | + e | | + f | 19 | + f | 20 | + f | 21 | + f | 22 | + f | | + f | 24 | + f | 25 | + f | 26 | + f | | + f | | + f | | + f | 27 | + f | | + f | | + f | | + f | | +(50 rows) + +-- +-- versions +-- +-- +-- postquel functions +-- +-- +-- mike does post_hacking, +-- joe and sally play basketball, and +-- everyone else does nothing. +-- +SELECT p.name, name(p.hobbies) FROM ONLY person p; + name | name +-------+------------- + mike | posthacking + joe | basketball + sally | basketball +(3 rows) + +-- +-- as above, but jeff also does post_hacking. +-- +SELECT p.name, name(p.hobbies) FROM person* p; + name | name +-------+------------- + mike | posthacking + joe | basketball + sally | basketball + jeff | posthacking +(4 rows) + +-- +-- the next two queries demonstrate how functions generate bogus duplicates. +-- this is a "feature" .. +-- +SELECT DISTINCT hobbies_r.name, name(hobbies_r.equipment) FROM hobbies_r + ORDER BY 1,2; + name | name +-------------+--------------- + basketball | hightops + posthacking | advil + posthacking | peet's coffee + skywalking | guts +(4 rows) + +SELECT hobbies_r.name, (hobbies_r.equipment).name FROM hobbies_r; + name | name +-------------+--------------- + posthacking | advil + posthacking | peet's coffee + posthacking | advil + posthacking | peet's coffee + basketball | hightops + basketball | hightops + skywalking | guts +(7 rows) + +-- +-- mike needs advil and peet's coffee, +-- joe and sally need hightops, and +-- everyone else is fine. +-- +SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM ONLY person p; + name | name | name +-------+-------------+--------------- + mike | posthacking | advil + mike | posthacking | peet's coffee + joe | basketball | hightops + sally | basketball | hightops +(4 rows) + +-- +-- as above, but jeff needs advil and peet's coffee as well. +-- +SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM person* p; + name | name | name +-------+-------------+--------------- + mike | posthacking | advil + mike | posthacking | peet's coffee + joe | basketball | hightops + sally | basketball | hightops + jeff | posthacking | advil + jeff | posthacking | peet's coffee +(6 rows) + +-- +-- just like the last two, but make sure that the target list fixup and +-- unflattening is being done correctly. +-- +SELECT name(equipment(p.hobbies)), p.name, name(p.hobbies) FROM ONLY person p; + name | name | name +---------------+-------+------------- + advil | mike | posthacking + peet's coffee | mike | posthacking + hightops | joe | basketball + hightops | sally | basketball +(4 rows) + +SELECT (p.hobbies).equipment.name, p.name, name(p.hobbies) FROM person* p; + name | name | name +---------------+-------+------------- + advil | mike | posthacking + peet's coffee | mike | posthacking + hightops | joe | basketball + hightops | sally | basketball + advil | jeff | posthacking + peet's coffee | jeff | posthacking +(6 rows) + +SELECT (p.hobbies).equipment.name, name(p.hobbies), p.name FROM ONLY person p; + name | name | name +---------------+-------------+------- + advil | posthacking | mike + peet's coffee | posthacking | mike + hightops | basketball | joe + hightops | basketball | sally +(4 rows) + +SELECT name(equipment(p.hobbies)), name(p.hobbies), p.name FROM person* p; + name | name | name +---------------+-------------+------- + advil | posthacking | mike + peet's coffee | posthacking | mike + hightops | basketball | joe + hightops | basketball | sally + advil | posthacking | jeff + peet's coffee | posthacking | jeff +(6 rows) + +SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_1a(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_1b(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_1c(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_2a(text 'skywalking')); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_2b(text 'skywalking')); + name +--------------- + advil + peet's coffee + hightops + guts +(4 rows) + +SELECT hobbies_by_name('basketball'); + hobbies_by_name +----------------- + joe +(1 row) + +SELECT name, overpaid(emp.*) FROM emp; + name | overpaid +--------+---------- + sharon | t + sam | t + bill | t + jeff | f + cim | f + linda | f +(6 rows) + +-- +-- Try a few cases with SQL-spec row constructor expressions +-- +SELECT * FROM equipment(ROW('skywalking', 'mer')); + name | hobby +------+------------ + guts | skywalking +(1 row) + +SELECT name(equipment(ROW('skywalking', 'mer'))); + name +------ + guts +(1 row) + +SELECT *, name(equipment(h.*)) FROM hobbies_r h; + name | person | name +-------------+--------+--------------- + posthacking | mike | advil + posthacking | mike | peet's coffee + posthacking | jeff | advil + posthacking | jeff | peet's coffee + basketball | joe | hightops + basketball | sally | hightops + skywalking | | guts +(7 rows) + +SELECT *, (equipment(CAST((h.*) AS hobbies_r))).name FROM hobbies_r h; + name | person | name +-------------+--------+--------------- + posthacking | mike | advil + posthacking | mike | peet's coffee + posthacking | jeff | advil + posthacking | jeff | peet's coffee + basketball | joe | hightops + basketball | sally | hightops + skywalking | | guts +(7 rows) + +-- +-- functional joins +-- +-- +-- instance rules +-- +-- +-- rewrite rules +-- diff --git a/src/test/singlenode_regress/output/partition_ddl.source b/src/test/singlenode_regress/output/partition_ddl.source new file mode 100644 index 00000000000..866f3aaac3c --- /dev/null +++ b/src/test/singlenode_regress/output/partition_ddl.source @@ -0,0 +1,2794 @@ +set client_min_messages = WARNING; +set timezone to '+07:00'; +DROP SCHEMA IF EXISTS partition_ddl2 CASCADE; +CREATE SCHEMA partition_ddl2; +set search_path to partition_ddl2; +CREATE TABLE rank ( + id int, + rank int, + year smallint, + gender char(1), + count int ); +create table rank2 (LIKE rank) +PARTITION BY LIST (gender) +SUBPARTITION BY RANGE (year) +SUBPARTITION TEMPLATE (start ('2000') end ('2006') every (interval '1')) +(PARTITION girls VALUES ('F'), PARTITION boys VALUES ('M')); +ERROR: operator does not exist: smallint pg_catalog.+ interval +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +drop table rank; +create table ggg (a char(1), b char(2), d char(3)) +partition by LIST (b) +( partition aa values ('a', 'b', 'c', 'd'), +partition bb values ('e', 'f', NULL) ); +insert into ggg values ('a','e','111'); +insert into ggg values ('b',NULL,'111'); +-- order 1,2 +select * from ggg order by 1,2; + a | b | d +---+----+----- + a | e | 111 + b | | 111 +(2 rows) + +-- order 1,2 +select * from ggg_1_prt_bb order by 1,2; + a | b | d +---+----+----- + a | e | 111 + b | | 111 +(2 rows) + +drop table ggg; +-- QA-877 +-- Johnny Soedomo +-- Updated test case to use default tablespace. We now support partition and tablespace +create table ggg (a char(1), b char(2), d char(3)) +partition by LIST (b) +( partition aa values ('a', 'b', 'c', 'd') tablespace pg_default); +drop table ggg; +create table mpp3137_region +( + R_REGIONKEY INTEGER, + R_NAME CHAR(25), + R_COMMENT VARCHAR(152), + primary key (r_regionkey, r_name, r_comment) + ) +partition by list (r_regionkey) +subpartition by list (r_name) +subpartition by list (r_comment) subpartition template ( + values('ges. thinly even pinto beans ca'), + values('uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl','lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to','hs use ironic, even requests. s'), + values('ly final courts cajole furiously final excuse'), + values(null) +) +( +partition p1 values('4','1','3','0','2')(subpartition sp1 values('MIDDLE EAST','AMERICA'),subpartition sp2 values('AFRICA','EUROPE','ASIA')) +); +select * from pg_partition_tree('mpp3137_region'); + relid | parentrelid | isleaf | level +-------------------------------------------+-----------------------------------+--------+------- + mpp3137_region | | f | 0 + mpp3137_region_1_prt_p1 | mpp3137_region | f | 1 + mpp3137_region_1_prt_p1_2_prt_sp1 | mpp3137_region_1_prt_p1 | f | 2 + mpp3137_region_1_prt_p1_2_prt_sp2 | mpp3137_region_1_prt_p1 | f | 2 + mpp3137_region_1_prt_p1_2_prt_sp1_3_prt_1 | mpp3137_region_1_prt_p1_2_prt_sp1 | t | 3 + mpp3137_region_1_prt_p1_2_prt_sp1_3_prt_2 | mpp3137_region_1_prt_p1_2_prt_sp1 | t | 3 + mpp3137_region_1_prt_p1_2_prt_sp1_3_prt_3 | mpp3137_region_1_prt_p1_2_prt_sp1 | t | 3 + mpp3137_region_1_prt_p1_2_prt_sp1_3_prt_4 | mpp3137_region_1_prt_p1_2_prt_sp1 | t | 3 + mpp3137_region_1_prt_p1_2_prt_sp2_3_prt_1 | mpp3137_region_1_prt_p1_2_prt_sp2 | t | 3 + mpp3137_region_1_prt_p1_2_prt_sp2_3_prt_2 | mpp3137_region_1_prt_p1_2_prt_sp2 | t | 3 + mpp3137_region_1_prt_p1_2_prt_sp2_3_prt_3 | mpp3137_region_1_prt_p1_2_prt_sp2 | t | 3 + mpp3137_region_1_prt_p1_2_prt_sp2_3_prt_4 | mpp3137_region_1_prt_p1_2_prt_sp2 | t | 3 +(12 rows) + +COPY mpp3137_region from STDIN delimiter '|'; +select count(*) from mpp3137_region; + count +------- + 5 +(1 row) + +select * from mpp3137_region order by r_regionkey; + r_regionkey | r_name | r_comment +-------------+---------------------------+-------------------------------------------------------------------------------------------------------------------- + 0 | AFRICA | lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to + 1 | AMERICA | hs use ironic, even requests. s + 2 | ASIA | ges. thinly even pinto beans ca + 3 | EUROPE | ly final courts cajole furiously final excuse + 4 | MIDDLE EAST | uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl +(5 rows) + +drop table mpp3137_region; +drop table if exists mpp3285_lineitem; +CREATE TABLE mpp3285_LINEITEM ( + L_ORDERKEY INT8, + L_PARTKEY INTEGER, + L_SUPPKEY INTEGER, + L_LINENUMBER integer, + L_QUANTITY decimal, + L_EXTENDEDPRICE decimal, + L_DISCOUNT decimal, + L_TAX decimal, + L_RETURNFLAG CHAR(1), + L_LINESTATUS CHAR(1), + L_SHIPDATE date, + L_COMMITDATE date, + L_RECEIPTDATE date, + L_SHIPINSTRUCT CHAR(25), + L_SHIPMODE CHAR(10), + L_COMMENT VARCHAR(44) + ) +partition by range (l_commitdate) +( +partition p1 start('1992-01-31') end('1998-11-01') every(interval '20 months') +); +insert into mpp3285_lineitem values (18182,5794,3295,4,9,15298.11,0.04,0.01,'N','O','1995-07-04'::date,'1995-05-30'::date,'1995-08-03'::date,'DELIVER IN PERSON','RAIL','y special platelets.'); +select * from mpp3285_lineitem; + l_orderkey | l_partkey | l_suppkey | l_linenumber | l_quantity | l_extendedprice | l_discount | l_tax | l_returnflag | l_linestatus | l_shipdate | l_commitdate | l_receiptdate | l_shipinstruct | l_shipmode | l_comment +------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+------------+--------------+---------------+---------------------------+------------+---------------------- + 18182 | 5794 | 3295 | 4 | 9 | 15298.11 | 0.04 | 0.01 | N | O | 07-04-1995 | 05-30-1995 | 08-03-1995 | DELIVER IN PERSON | RAIL | y special platelets. +(1 row) + +drop table mpp3285_lineitem; +CREATE TABLE mpp3282_PARTSUPP ( +PS_PARTKEY INTEGER, +PS_SUPPKEY INTEGER, +PS_AVAILQTY integer, +PS_SUPPLYCOST decimal, +PS_COMMENT VARCHAR(199) +) +partition by range (ps_suppkey) +subpartition by range (ps_partkey) +subpartition by range (ps_supplycost) subpartition template (start('1') end('1001') every(500)) +( +partition p1 start('1') end('10001') every(5000) +(subpartition sp1 start('1') end('200001') every(66666) +) +); +copy mpp3282_partsupp from stdin delimiter '|'; +select * from mpp3282_partsupp; + ps_partkey | ps_suppkey | ps_availqty | ps_supplycost | ps_comment +------------+------------+-------------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 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 +(1 row) + +CREATE TABLE mpp3238_supplier( + S_SUPPKEY INTEGER, + S_NAME CHAR(25), + S_ADDRESS VARCHAR(40), + S_NATIONKEY INTEGER, + S_PHONE CHAR(15), + S_ACCTBAL decimal, + S_COMMENT VARCHAR(101) + ) +partition by range (s_nationkey) +( +partition p1 start(0) , +partition p2 start(12) end(13), +partition p3 end(20) inclusive, +partition p4 start(21), +partition p5 start(22) end(25) +); +insert into mpp3238_supplier values(1,'Supplier#000000001',' N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ',17,'27-918-335-1736',5755.94,'each slyly above the careful'); +select * from mpp3238_supplier; + s_suppkey | s_name | s_address | s_nationkey | s_phone | s_acctbal | s_comment +-----------+---------------------------+-------------------------------------+-------------+-----------------+-----------+------------------------------ + 1 | Supplier#000000001 | N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ | 17 | 27-918-335-1736 | 5755.94 | each slyly above the careful +(1 row) + +CREATE TABLE mpp3219_CUSTOMER ( +C_CUSTKEY INTEGER, +C_NAME VARCHAR(25), +C_ADDRESS VARCHAR(40), +C_NATIONKEY INTEGER, +C_PHONE CHAR(15), +C_ACCTBAL decimal, +C_MKTSEGMENT CHAR(10), +C_COMMENT VARCHAR(117) +) +partition by range (c_acctbal) +( +partition sp1 start('-999.99') end('9833.01'), +partition sp2 end('9905.01'), +partition sp3 end('9978.01')); +drop table mpp3219_customer; +drop table mpp3190_partsupp; +ERROR: table "mpp3190_partsupp" does not exist +-- This should fail +CREATE TABLE mpp3190_PARTSUPP ( +PS_PARTKEY INTEGER, +PS_SUPPKEY INTEGER, + PS_AVAILQTY integer, +PS_SUPPLYCOST decimal, +PS_COMMENT VARCHAR(199) ) +partition by range (ps_supplycost) + subpartition by range (ps_suppkey) subpartition template (start(1) end(10000) every(2499)) +(partition p1, partition p2, partition p3 ); +ERROR: missing boundary specification in partition "p1" of type RANGE +LINE 9: (partition p1, partition p2, partition p3 ); + ^ +drop table if exists mpp3304_customer; +create table mpp3304_CUSTOMER ( + C_CUSTKEY INTEGER, + C_NAME VARCHAR(25), + C_ADDRESS VARCHAR(40), + C_NATIONKEY INTEGER, + C_PHONE CHAR(15), + C_ACCTBAL decimal, + C_MKTSEGMENT CHAR(10), + C_COMMENT VARCHAR(117) + ) +partition by range (c_custkey) +subpartition by range (c_acctbal) +subpartition template (start('-999.99') end('10000.99') every(11000) +) +subpartition by range (c_nationkey) +subpartition template (start('0') end('25') every(5)) +( +partition p1 start('1') end('150001') every(50000) +); +Alter table mpp3304_customer alter partition for (6) rename partition for ('-999.99') to newname; +select * from pg_partition_tree('mpp3304_customer'); + relid | parentrelid | isleaf | level +---------------------------------------------------+-------------------------------------------+--------+------- + mpp3304_customer | | f | 0 + mpp3304_customer_1_prt_p1_1 | mpp3304_customer | f | 1 + mpp3304_customer_1_prt_p1_2 | mpp3304_customer | f | 1 + mpp3304_customer_1_prt_p1_3 | mpp3304_customer | f | 1 + mpp3304_customer_1_prt_p1_1_2_prt_newname | mpp3304_customer_1_prt_p1_1 | f | 2 + mpp3304_customer_1_prt_p1_1_2_prt_2 | mpp3304_customer_1_prt_p1_1 | f | 2 + mpp3304_customer_1_prt_p1_2_2_prt_1 | mpp3304_customer_1_prt_p1_2 | f | 2 + mpp3304_customer_1_prt_p1_2_2_prt_2 | mpp3304_customer_1_prt_p1_2 | f | 2 + mpp3304_customer_1_prt_p1_3_2_prt_1 | mpp3304_customer_1_prt_p1_3 | f | 2 + mpp3304_customer_1_prt_p1_3_2_prt_2 | mpp3304_customer_1_prt_p1_3 | f | 2 + mpp3304_customer_1_prt_p1_1_2_prt_newname_3_prt_1 | mpp3304_customer_1_prt_p1_1_2_prt_newname | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_newname_3_prt_2 | mpp3304_customer_1_prt_p1_1_2_prt_newname | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_newname_3_prt_3 | mpp3304_customer_1_prt_p1_1_2_prt_newname | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_newname_3_prt_4 | mpp3304_customer_1_prt_p1_1_2_prt_newname | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_newname_3_prt_5 | mpp3304_customer_1_prt_p1_1_2_prt_newname | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_2_3_prt_1 | mpp3304_customer_1_prt_p1_1_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_2_3_prt_2 | mpp3304_customer_1_prt_p1_1_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_2_3_prt_3 | mpp3304_customer_1_prt_p1_1_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_2_3_prt_4 | mpp3304_customer_1_prt_p1_1_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_1_2_prt_2_3_prt_5 | mpp3304_customer_1_prt_p1_1_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_1_3_prt_1 | mpp3304_customer_1_prt_p1_2_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_1_3_prt_2 | mpp3304_customer_1_prt_p1_2_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_1_3_prt_3 | mpp3304_customer_1_prt_p1_2_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_1_3_prt_4 | mpp3304_customer_1_prt_p1_2_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_1_3_prt_5 | mpp3304_customer_1_prt_p1_2_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_2_3_prt_1 | mpp3304_customer_1_prt_p1_2_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_2_3_prt_2 | mpp3304_customer_1_prt_p1_2_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_2_3_prt_3 | mpp3304_customer_1_prt_p1_2_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_2_3_prt_4 | mpp3304_customer_1_prt_p1_2_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_2_2_prt_2_3_prt_5 | mpp3304_customer_1_prt_p1_2_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_1_3_prt_1 | mpp3304_customer_1_prt_p1_3_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_1_3_prt_2 | mpp3304_customer_1_prt_p1_3_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_1_3_prt_3 | mpp3304_customer_1_prt_p1_3_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_1_3_prt_4 | mpp3304_customer_1_prt_p1_3_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_1_3_prt_5 | mpp3304_customer_1_prt_p1_3_2_prt_1 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_2_3_prt_1 | mpp3304_customer_1_prt_p1_3_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_2_3_prt_2 | mpp3304_customer_1_prt_p1_3_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_2_3_prt_3 | mpp3304_customer_1_prt_p1_3_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_2_3_prt_4 | mpp3304_customer_1_prt_p1_3_2_prt_2 | t | 3 + mpp3304_customer_1_prt_p1_3_2_prt_2_3_prt_5 | mpp3304_customer_1_prt_p1_3_2_prt_2 | t | 3 +(40 rows) + +create table mpp3045_hhh (a char(1), b date, d char(3)) with (appendonly=true) +partition by range (b) + (partition aa start (date '2007-01-01') end (date '2008-01-01'), + partition bb start (date '2008-01-01') end (date '2009-01-01')); +alter table mpp3045_hhh add partition aa; -- missing range +ERROR: missing boundary specification in partition "aa" of type RANGE +alter table mpp3045_hhh add partition aa start(date '2012-01-01') end (date '2013-01-01'); -- duplicate partition name +ERROR: relation "mpp3045_hhh_1_prt_aa" already exists +drop table if exists mpp3287_nation; +CREATE TABLE mpp3287_NATION ( + N_NATIONKEY INTEGER, + N_NAME CHAR(25), + N_REGIONKEY INTEGER, + N_COMMENT VARCHAR(152) + ) +partition by range (n_nationkey) +( +partition p1 start('0') WITH (appendonly=true,checksum=true,blocksize=1998848,compresslevel=4), +partition p2 start('11') end('15') inclusive WITH (checksum=false,appendonly=true,blocksize=655360,compresslevel=4), +partition p3 start('16') end('19'), partition p4 start('19') WITH (compresslevel=8,appendonly=true,checksum=false,blocksize=884736), +partition p5 start('20') +); +delete from mpp3287_nation; +INSERT INTO mpp3287_nation VALUES (1, 'ARGENTINA ', 1, 'al foxes promise slyly according to the regular accounts. bold requests alon'); +INSERT INTO mpp3287_nation VALUES (3, 'CANADA ', 1, 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold'); +INSERT INTO mpp3287_nation VALUES (5, 'ETHIOPIA ', 0, 'ven packages wake quickly. regu'); +INSERT INTO mpp3287_nation VALUES (7, 'GERMANY ', 3, 'l platelets. regular accounts x-ray: unusual, regular acco'); +INSERT INTO mpp3287_nation VALUES (9, 'INDONESIA ', 2, ' slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull'); +INSERT INTO mpp3287_nation VALUES (11, 'IRAQ ', 4, 'nic deposits boost atop the quickly final requests? quickly regula'); +INSERT INTO mpp3287_nation VALUES (13, 'JORDAN ', 4, 'ic deposits are blithely about the carefully regular pa'); +INSERT INTO mpp3287_nation VALUES (15, 'MOROCCO ', 0, 'rns. blithely bold courts among the closely regular packages use furiously bold platelets?'); +INSERT INTO mpp3287_nation VALUES (17, 'PERU ', 1, 'platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun'); +INSERT INTO mpp3287_nation VALUES (19, 'ROMANIA ', 3, 'ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account'); +INSERT INTO mpp3287_nation VALUES (21, 'VIETNAM ', 2, 'hely enticingly express accounts. even, final '); +INSERT INTO mpp3287_nation VALUES (23, 'UNITED KINGDOM ', 3, 'eans boost carefully special requests. accounts are. carefull'); +INSERT INTO mpp3287_nation VALUES (0, 'ALGERIA ', 0, ' haggle. carefully final deposits detect slyly agai'); +INSERT INTO mpp3287_nation VALUES (2, 'BRAZIL ', 1, 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special '); +INSERT INTO mpp3287_nation VALUES (4, 'EGYPT ', 4, 'y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d'); +INSERT INTO mpp3287_nation VALUES (6, 'FRANCE ', 3, 'refully final requests. regular, ironi'); +INSERT INTO mpp3287_nation VALUES (8, 'INDIA ', 2, 'ss excuses cajole slyly across the packages. deposits print aroun'); +INSERT INTO mpp3287_nation VALUES (10, 'IRAN ', 4, 'efully alongside of the slyly final dependencies. '); +INSERT INTO mpp3287_nation VALUES (12, 'JAPAN ', 2, 'ously. final, express gifts cajole a'); +INSERT INTO mpp3287_nation VALUES (14, 'KENYA ', 0, ' pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t'); +INSERT INTO mpp3287_nation VALUES (16, 'MOZAMBIQUE ', 0, 's. ironic, unusual asymptotes wake blithely r'); +INSERT INTO mpp3287_nation VALUES (18, 'CHINA ', 2, 'c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos'); +INSERT INTO mpp3287_nation VALUES (20, 'SAUDI ARABIA ', 4, 'ts. silent requests haggle. closely express packages sleep across the blithely'); +INSERT INTO mpp3287_nation VALUES (22, 'RUSSIA ', 3, ' requests against the platelets use never according to the quickly regular pint'); +INSERT INTO mpp3287_nation VALUES (24, 'UNITED STATES ', 1, 'y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be'); +delete from mpp3287_nation; +drop table mpp3287_nation; +drop table if exists mpp3283_nation; +CREATE TABLE mpp3283_NATION ( + N_NATIONKEY INTEGER, + N_NAME CHAR(25), + N_REGIONKEY INTEGER, + N_COMMENT VARCHAR(152) + ) +partition by range (n_regionkey) +( +partition p1 start('0') end('5') exclusive +); +-- Data for Name: nation; Type: TABLE DATA; Schema: public; Owner: bmaryada +INSERT INTO mpp3283_nation VALUES (1, 'ARGENTINA ', 1, 'al foxes promise slyly according to the regular accounts. bold requests alon'); +INSERT INTO mpp3283_nation VALUES (3, 'CANADA ', 1, 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold'); +INSERT INTO mpp3283_nation VALUES (5, 'ETHIOPIA ', 0, 'ven packages wake quickly. regu'); +INSERT INTO mpp3283_nation VALUES (7, 'GERMANY ', 3, 'l platelets. regular accounts x-ray: unusual, regular acco'); +INSERT INTO mpp3283_nation VALUES (9, 'INDONESIA ', 2, ' slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull'); +INSERT INTO mpp3283_nation VALUES (11, 'IRAQ ', 4, 'nic deposits boost atop the quickly final requests? quickly regula'); +INSERT INTO mpp3283_nation VALUES (13, 'JORDAN ', 4, 'ic deposits are blithely about the carefully regular pa'); +INSERT INTO mpp3283_nation VALUES (15, 'MOROCCO ', 0, 'rns. blithely bold courts among the closely regular packages use furiously bold platelets?'); +INSERT INTO mpp3283_nation VALUES (17, 'PERU ', 1, 'platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun'); +INSERT INTO mpp3283_nation VALUES (19, 'ROMANIA ', 3, 'ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account'); +INSERT INTO mpp3283_nation VALUES (21, 'VIETNAM ', 2, 'hely enticingly express accounts. even, final '); +INSERT INTO mpp3283_nation VALUES (23, 'UNITED KINGDOM ', 3, 'eans boost carefully special requests. accounts are. carefull'); +INSERT INTO mpp3283_nation VALUES (0, 'ALGERIA ', 0, ' haggle. carefully final deposits detect slyly agai'); +INSERT INTO mpp3283_nation VALUES (2, 'BRAZIL ', 1, 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special '); +INSERT INTO mpp3283_nation VALUES (4, 'EGYPT ', 4, 'y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d'); +INSERT INTO mpp3283_nation VALUES (6, 'FRANCE ', 3, 'refully final requests. regular, ironi'); +INSERT INTO mpp3283_nation VALUES (8, 'INDIA ', 2, 'ss excuses cajole slyly across the packages. deposits print aroun'); +INSERT INTO mpp3283_nation VALUES (10, 'IRAN ', 4, 'efully alongside of the slyly final dependencies. '); +INSERT INTO mpp3283_nation VALUES (12, 'JAPAN ', 2, 'ously. final, express gifts cajole a'); +INSERT INTO mpp3283_nation VALUES (14, 'KENYA ', 0, ' pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t'); +INSERT INTO mpp3283_nation VALUES (16, 'MOZAMBIQUE ', 0, 's. ironic, unusual asymptotes wake blithely r'); +INSERT INTO mpp3283_nation VALUES (18, 'CHINA ', 2, 'c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos'); +INSERT INTO mpp3283_nation VALUES (20, 'SAUDI ARABIA ', 4, 'ts. silent requests haggle. closely express packages sleep across the blithely'); +INSERT INTO mpp3283_nation VALUES (22, 'RUSSIA ', 3, ' requests against the platelets use never according to the quickly regular pint'); +INSERT INTO mpp3283_nation VALUES (24, 'UNITED STATES ', 1, 'y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be'); +select count(*) from mpp3283_nation; + count +------- + 25 +(1 row) + +copy mpp3283_nation to '/dev/null' delimiter '|'; +drop table mpp3283_nation; +-- Check that DROP TABLE still works, after adding a default partition. +CREATE TABLE mpp3240(a int, b int, c int) +partition by range (a) +( partition aa start (1) end (5) every (1) ); +alter table mpp3240 add default partition default_part; +drop table mpp3240; +-- Check that after dropping a partition, you can create a new partition with +-- the same name. +CREATE TABLE mpp3259 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +( partition aa start (0) end (500) every (100), default partition default_part ); +alter table mpp3259 drop partition default_part; +alter table mpp3259 add default partition default_part; +insert into mpp3259 (unique1) values (100001); +select * from mpp3259; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 100001 | | | | | | | | | | | | | | | +(1 row) + +select * from mpp3259_1_prt_default_part; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 100001 | | | | | | | | | | | | | | | +(1 row) + +drop table mpp3259; +-- Check that DROP PARTITION for (n) gives sensible error if there is no matching partition. +CREATE TABLE mpp3265 ( + unique1 int4, + unique2 int4 +) partition by range (unique1) +( partition aa start (0) end (500), + partition bb start (500) end (1000), + partition cc start (1000) end (1500), + partition dd start (1500) end (2000), + default partition default_part ); +alter table mpp3265 drop partition for (100); +alter table mpp3265 drop partition for (-5); +ERROR: FOR expression matches DEFAULT partition for specified value of relation "mpp3265" +HINT: FOR expression may only specify a non-default partition in this context. +alter table mpp3265 drop partition for (0); +ERROR: FOR expression matches DEFAULT partition for specified value of relation "mpp3265" +HINT: FOR expression may only specify a non-default partition in this context. +drop table mpp3265; +-- Test very deeply nested subpartitioning +CREATE TABLE MULTI_PART2(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +subpartition by range (b) subpartition template ( start (1) end (2) every (1)) +subpartition by range (c) subpartition template ( start (1) end (2) every (1)) +subpartition by range (d) subpartition template ( start (1) end (2) every (1)) +subpartition by range (e) subpartition template ( start (1) end (2) every (1)) +subpartition by range (f) subpartition template ( start (1) end (2) every (1)) +subpartition by range (g) subpartition template ( start (1) end (2) every (1)) +subpartition by range (h) subpartition template ( start (1) end (2) every (1)) +subpartition by range (i) subpartition template ( start (1) end (2) every (1)) +subpartition by range (j) subpartition template ( start (1) end (2) every (1)) +subpartition by range (k) subpartition template ( start (1) end (2) every (1)) +subpartition by range (l) subpartition template ( start (1) end (2) every (1)) +subpartition by range (m) subpartition template ( start (1) end (2) every (1)) +subpartition by range (n) subpartition template ( start (1) end (2) every (1)) +subpartition by range (o) subpartition template ( start (1) end (2) every (1)) +subpartition by range (p) subpartition template ( start (1) end (2) every (1)) +subpartition by range (q) subpartition template ( start (1) end (2) every (1)) +subpartition by range (r) subpartition template ( start (1) end (2) every (1)) +subpartition by range (s) subpartition template ( start (1) end (2) every (1)) +subpartition by range (t) subpartition template ( start (1) end (2) every (1)) +subpartition by range (u) subpartition template ( start (1) end (2) every (1)) +subpartition by range (v) subpartition template ( start (1) end (2) every (1)) +subpartition by range (w) subpartition template ( start (1) end (2) every (1)) +subpartition by range (x) subpartition template ( start (1) end (2) every (1)) +subpartition by range (y) subpartition template ( start (1) end (2) every (1)) +subpartition by range (z) subpartition template ( start (1) end (2) every (1)) +( start (1) end (2) every (1)); +alter table multi_part2 rename to m_0000000; +select relid,parentrelid,isleaf,level, pg_catalog.pg_get_expr(relpartbound, oid) from pg_partition_tree('m_0000000'), pg_class where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +---------------------------------------------------------------+---------------------------------------------------------------+--------+-------+---------------------------- + m_0000000 | | f | 0 | + m_0000000_1_prt_1 | m_0000000 | f | 1 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1 | m_0000000_1_prt_1 | f | 2 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1 | m_0000000_1_prt_1_2_prt_1 | f | 3 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1 | f | 4 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1 | f | 5 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1 | f | 6 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_7_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_prt_1 | f | 7 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_8_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_7_prt_1 | f | 8 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_9_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_8_prt_1 | f | 9 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__10_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_9_prt_1 | f | 10 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__11_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__10_prt_1 | f | 11 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__12_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__11_prt_1 | f | 12 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__13_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__12_prt_1 | f | 13 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__14_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__13_prt_1 | f | 14 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__15_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__14_prt_1 | f | 15 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__16_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__15_prt_1 | f | 16 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__17_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__16_prt_1 | f | 17 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__18_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__17_prt_1 | f | 18 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__19_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__18_prt_1 | f | 19 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__20_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__19_prt_1 | f | 20 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__21_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__20_prt_1 | f | 21 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__22_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__21_prt_1 | f | 22 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__23_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__22_prt_1 | f | 23 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__24_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__23_prt_1 | f | 24 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__25_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__24_prt_1 | f | 25 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__26_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__25_prt_1 | t | 26 | FOR VALUES FROM (1) TO (2) +(27 rows) + +alter table m_0000000 rename to multi_part2_0000000; +WARNING: renamed 6 relations, skipped 21 child partitions as old parent name is not part of partition name +select relid,parentrelid,isleaf,level, pg_catalog.pg_get_expr(relpartbound, oid) from pg_partition_tree('multi_part2_0000000'), pg_class where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +---------------------------------------------------------------+---------------------------------------------------------------+--------+-------+---------------------------- + multi_part2_0000000 | | f | 0 | + multi_part2_0000000_1_prt_1 | multi_part2_0000000 | f | 1 | FOR VALUES FROM (1) TO (2) + multi_part2_0000000_1_prt_1_2_prt_1 | multi_part2_0000000_1_prt_1 | f | 2 | FOR VALUES FROM (1) TO (2) + multi_part2_0000000_1_prt_1_2_prt_1_3_prt_1 | multi_part2_0000000_1_prt_1_2_prt_1 | f | 3 | FOR VALUES FROM (1) TO (2) + multi_part2_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1 | multi_part2_0000000_1_prt_1_2_prt_1_3_prt_1 | f | 4 | FOR VALUES FROM (1) TO (2) + multi_part2_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1 | multi_part2_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1 | f | 5 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_prt_1 | multi_part2_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1 | f | 6 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_7_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_prt_1 | f | 7 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_8_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_7_prt_1 | f | 8 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_9_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_8_prt_1 | f | 9 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__10_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6_p_9_prt_1 | f | 10 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__11_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__10_prt_1 | f | 11 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__12_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__11_prt_1 | f | 12 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__13_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__12_prt_1 | f | 13 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__14_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__13_prt_1 | f | 14 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__15_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__14_prt_1 | f | 15 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__16_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__15_prt_1 | f | 16 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__17_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__16_prt_1 | f | 17 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__18_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__17_prt_1 | f | 18 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__19_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__18_prt_1 | f | 19 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__20_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__19_prt_1 | f | 20 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__21_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__20_prt_1 | f | 21 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__22_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__21_prt_1 | f | 22 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__23_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__22_prt_1 | f | 23 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__24_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__23_prt_1 | f | 24 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__25_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__24_prt_1 | f | 25 | FOR VALUES FROM (1) TO (2) + m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__26_prt_1 | m_0000000_1_prt_1_2_prt_1_3_prt_1_4_prt_1_5_prt_1_6__25_prt_1 | t | 26 | FOR VALUES FROM (1) TO (2) +(27 rows) + +alter table multi_part2_0000000 rename partition for (1) to a123456789a123456789a123456789a123456789a123456789a123456789; +ERROR: name "a123456789a123456789a123456789a123456789a123456789a123456789" for child partition is too long +drop table multi_part2_0000000; +drop TABLE IF EXISTS INT_P1A CASCADE; +CREATE TABLE INT_P1A ( num1 INTEGER NOT NULL, + num2 INTEGER NOT NULL, + average DECIMAL(15,2) NOT NULL, + date1 DATE NOT NULL, + date2 DATE NOT NULL, + message VARCHAR(44) NOT NULL ) +PARTITION BY RANGE(date1) +( + PARTITION y1992 END('1992-12-31'), + PARTITION y1993 END('1993-12-31'), + PARTITION y1994 END('1994-12-31'), + PARTITION y1995 END('1995-12-31'), + PARTITION y1996 START('1996-01-01'), + PARTITION y1997 START('1997-01-01') END('1997-12-31') + ); +drop TABLE IF EXISTS INT_P1B CASCADE; +CREATE TABLE INT_P1B ( num1 INTEGER NOT NULL, + num2 INTEGER NOT NULL, + average DECIMAL(15,2) NOT NULL, + date1 DATE NOT NULL, + date2 DATE NOT NULL, + message VARCHAR(44) NOT NULL ) +PARTITION BY RANGE(date1) +( + PARTITION y1992 END('1992-12-31'), + PARTITION y1993 END('1993-12-31'), + PARTITION y1994 END('1994-12-31'), + PARTITION y1995, + PARTITION y1996 START('1996-01-01'), + PARTITION y1997 start('1997-01-01') END('1997-12-31') + ); +ERROR: missing boundary specification in partition "y1995" of type RANGE +LINE 12: PARTITION y1995, + ^ +DROP TABLE INT_P1A; +DROP TABLE INT_P1B; +ERROR: table "int_p1b" does not exist +CREATE TABLE mpp2564_transactions (obligation_trans_date date, cust_no integer, company_no character(3), obligation_trans_no character varying(25), item_no integer, orig_oblig_trans_no character varying(25), split_ind character(1), qty_sold integer, net_wgt_lbs numeric(10,5), unit_price numeric(10,2), ext_price numeric(10,2), catch_wgt_ind character(1), qty_sold_case_equivalent numeric(10,5), marketing_assoc_id character varying(10), cost_of_goods_sold numeric(10,2), adj_cost_good_sold numeric(10,2), trade_sales_ind character(1), create_date timestamp without time zone) +PARTITION BY RANGE (obligation_trans_date) +SUBPARTITION BY LIST (company_no) subpartition template +( subpartition p1 values ('047'), + subpartition p2 values ('002'), + subpartition p3 values ('056'), + subpartition p4 values ('022') +) +( start ('2005-06-01') end ('2006-05-01') every (INTERVAL '1 month') ); +\d mpp2564_transactions* + Partitioned table "partition_ddl2.mpp2564_transactions" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition key: RANGE (obligation_trans_date) +Number of partitions: 11 (Use \d+ to list them.) + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('06-01-2005') TO ('07-01-2005') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_10" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('03-01-2006') TO ('04-01-2006') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_10_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_10 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_10_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_10 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_10_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_10 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_10_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_10 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_11" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('04-01-2006') TO ('05-01-2006') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_11_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_11 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_11_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_11 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_11_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_11 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_11_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_11 FOR VALUES IN ('022') + + Table "partition_ddl2.mpp2564_transactions_1_prt_1_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_1 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_1_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_1 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_1_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_1 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_1_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_1 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('07-01-2005') TO ('08-01-2005') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_2_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_2 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_2_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_2 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_2_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_2 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_2_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_2 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('08-01-2005') TO ('09-01-2005') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_3_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_3 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_3_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_3 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_3_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_3 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_3_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_3 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('09-01-2005') TO ('10-01-2005') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_4_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_4 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_4_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_4 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_4_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_4 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_4_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_4 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_5" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('10-01-2005') TO ('11-01-2005') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_5_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_5 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_5_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_5 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_5_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_5 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_5_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_5 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_6" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('11-01-2005') TO ('12-01-2005') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_6_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_6 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_6_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_6 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_6_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_6 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_6_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_6 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_7" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('12-01-2005') TO ('01-01-2006') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_7_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_7 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_7_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_7 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_7_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_7 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_7_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_7 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_8" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('01-01-2006') TO ('02-01-2006') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_8_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_8 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_8_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_8 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_8_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_8 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_8_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_8 FOR VALUES IN ('022') + + Partitioned table "partition_ddl2.mpp2564_transactions_1_prt_9" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions FOR VALUES FROM ('02-01-2006') TO ('03-01-2006') +Partition key: LIST (company_no) +Number of partitions: 4 (Use \d+ to list them.) + + Table "partition_ddl2.mpp2564_transactions_1_prt_9_2_prt_p1" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_9 FOR VALUES IN ('047') + + Table "partition_ddl2.mpp2564_transactions_1_prt_9_2_prt_p2" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_9 FOR VALUES IN ('002') + + Table "partition_ddl2.mpp2564_transactions_1_prt_9_2_prt_p3" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_9 FOR VALUES IN ('056') + + Table "partition_ddl2.mpp2564_transactions_1_prt_9_2_prt_p4" + Column | Type | Collation | Nullable | Default +--------------------------+-----------------------------+-----------+----------+--------- + obligation_trans_date | date | | | + cust_no | integer | | | + company_no | character(3) | | | + obligation_trans_no | character varying(25) | | | + item_no | integer | | | + orig_oblig_trans_no | character varying(25) | | | + split_ind | character(1) | | | + qty_sold | integer | | | + net_wgt_lbs | numeric(10,5) | | | + unit_price | numeric(10,2) | | | + ext_price | numeric(10,2) | | | + catch_wgt_ind | character(1) | | | + qty_sold_case_equivalent | numeric(10,5) | | | + marketing_assoc_id | character varying(10) | | | + cost_of_goods_sold | numeric(10,2) | | | + adj_cost_good_sold | numeric(10,2) | | | + trade_sales_ind | character(1) | | | + create_date | timestamp without time zone | | | +Partition of: mpp2564_transactions_1_prt_9 FOR VALUES IN ('022') + +-- Check that DEFAULT can be used as partition's name with ALTER TABLE ADD PARTITION. (MPP-3363) +CREATE TABLE mpp3363(a int, b int, c int) +partition by range (a) +( partition aa start (1) end (3) every (1) ); +alter table mpp3363 add default partition default; +ERROR: syntax error at or near "default" +LINE 1: alter table mpp3363 add default partition default; + ^ +drop table mpp3363; +-- start_matchsubs +-- #Daylight savings for Pacific Time +-- m/00:00-0\d/ +-- s/00:00-0\d/00:00-0x/g +-- end_matchsubs +-- 1 level partition +CREATE TABLE mpp3059(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +( partition aa start (1) end (5) every (1) ); +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +--------------------+-------------+--------+-------+---------------------------- + mpp3059 | | f | 0 | + mpp3059_1_prt_aa_1 | mpp3059 | t | 1 | FOR VALUES FROM (1) TO (2) + mpp3059_1_prt_aa_2 | mpp3059 | t | 1 | FOR VALUES FROM (2) TO (3) + mpp3059_1_prt_aa_3 | mpp3059 | t | 1 | FOR VALUES FROM (3) TO (4) + mpp3059_1_prt_aa_4 | mpp3059 | t | 1 | FOR VALUES FROM (4) TO (5) +(5 rows) + +alter table mpp3059 rename to mpp3059_rename; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059_rename') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +---------------------------+----------------+--------+-------+---------------------------- + mpp3059_rename | | f | 0 | + mpp3059_rename_1_prt_aa_1 | mpp3059_rename | t | 1 | FOR VALUES FROM (1) TO (2) + mpp3059_rename_1_prt_aa_2 | mpp3059_rename | t | 1 | FOR VALUES FROM (2) TO (3) + mpp3059_rename_1_prt_aa_3 | mpp3059_rename | t | 1 | FOR VALUES FROM (3) TO (4) + mpp3059_rename_1_prt_aa_4 | mpp3059_rename | t | 1 | FOR VALUES FROM (4) TO (5) +(5 rows) + +alter table mpp3059_rename rename to mpp3059; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +--------------------+-------------+--------+-------+---------------------------- + mpp3059 | | f | 0 | + mpp3059_1_prt_aa_1 | mpp3059 | t | 1 | FOR VALUES FROM (1) TO (2) + mpp3059_1_prt_aa_2 | mpp3059 | t | 1 | FOR VALUES FROM (2) TO (3) + mpp3059_1_prt_aa_3 | mpp3059 | t | 1 | FOR VALUES FROM (3) TO (4) + mpp3059_1_prt_aa_4 | mpp3059 | t | 1 | FOR VALUES FROM (4) TO (5) +(5 rows) + +-- 2 level partition +CREATE TABLE mpp3059a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (500) every (100) ) +( start (0) end (500) every (100)); +alter table mpp3059a rename to mpp3059a_rename; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059a_rename') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +---------------------------------+-------------------------+--------+-------+-------------------------------- + mpp3059a_rename | | f | 0 | + mpp3059a_rename_1_prt_1 | mpp3059a_rename | f | 1 | FOR VALUES FROM (0) TO (100) + mpp3059a_rename_1_prt_2 | mpp3059a_rename | f | 1 | FOR VALUES FROM (100) TO (200) + mpp3059a_rename_1_prt_3 | mpp3059a_rename | f | 1 | FOR VALUES FROM (200) TO (300) + mpp3059a_rename_1_prt_4 | mpp3059a_rename | f | 1 | FOR VALUES FROM (300) TO (400) + mpp3059a_rename_1_prt_5 | mpp3059a_rename | f | 1 | FOR VALUES FROM (400) TO (500) + mpp3059a_rename_1_prt_1_2_prt_1 | mpp3059a_rename_1_prt_1 | t | 2 | FOR VALUES FROM (0) TO (100) + mpp3059a_rename_1_prt_1_2_prt_2 | mpp3059a_rename_1_prt_1 | t | 2 | FOR VALUES FROM (100) TO (200) + mpp3059a_rename_1_prt_1_2_prt_3 | mpp3059a_rename_1_prt_1 | t | 2 | FOR VALUES FROM (200) TO (300) + mpp3059a_rename_1_prt_1_2_prt_4 | mpp3059a_rename_1_prt_1 | t | 2 | FOR VALUES FROM (300) TO (400) + mpp3059a_rename_1_prt_1_2_prt_5 | mpp3059a_rename_1_prt_1 | t | 2 | FOR VALUES FROM (400) TO (500) + mpp3059a_rename_1_prt_2_2_prt_1 | mpp3059a_rename_1_prt_2 | t | 2 | FOR VALUES FROM (0) TO (100) + mpp3059a_rename_1_prt_2_2_prt_2 | mpp3059a_rename_1_prt_2 | t | 2 | FOR VALUES FROM (100) TO (200) + mpp3059a_rename_1_prt_2_2_prt_3 | mpp3059a_rename_1_prt_2 | t | 2 | FOR VALUES FROM (200) TO (300) + mpp3059a_rename_1_prt_2_2_prt_4 | mpp3059a_rename_1_prt_2 | t | 2 | FOR VALUES FROM (300) TO (400) + mpp3059a_rename_1_prt_2_2_prt_5 | mpp3059a_rename_1_prt_2 | t | 2 | FOR VALUES FROM (400) TO (500) + mpp3059a_rename_1_prt_3_2_prt_1 | mpp3059a_rename_1_prt_3 | t | 2 | FOR VALUES FROM (0) TO (100) + mpp3059a_rename_1_prt_3_2_prt_2 | mpp3059a_rename_1_prt_3 | t | 2 | FOR VALUES FROM (100) TO (200) + mpp3059a_rename_1_prt_3_2_prt_3 | mpp3059a_rename_1_prt_3 | t | 2 | FOR VALUES FROM (200) TO (300) + mpp3059a_rename_1_prt_3_2_prt_4 | mpp3059a_rename_1_prt_3 | t | 2 | FOR VALUES FROM (300) TO (400) + mpp3059a_rename_1_prt_3_2_prt_5 | mpp3059a_rename_1_prt_3 | t | 2 | FOR VALUES FROM (400) TO (500) + mpp3059a_rename_1_prt_4_2_prt_1 | mpp3059a_rename_1_prt_4 | t | 2 | FOR VALUES FROM (0) TO (100) + mpp3059a_rename_1_prt_4_2_prt_2 | mpp3059a_rename_1_prt_4 | t | 2 | FOR VALUES FROM (100) TO (200) + mpp3059a_rename_1_prt_4_2_prt_3 | mpp3059a_rename_1_prt_4 | t | 2 | FOR VALUES FROM (200) TO (300) + mpp3059a_rename_1_prt_4_2_prt_4 | mpp3059a_rename_1_prt_4 | t | 2 | FOR VALUES FROM (300) TO (400) + mpp3059a_rename_1_prt_4_2_prt_5 | mpp3059a_rename_1_prt_4 | t | 2 | FOR VALUES FROM (400) TO (500) + mpp3059a_rename_1_prt_5_2_prt_1 | mpp3059a_rename_1_prt_5 | t | 2 | FOR VALUES FROM (0) TO (100) + mpp3059a_rename_1_prt_5_2_prt_2 | mpp3059a_rename_1_prt_5 | t | 2 | FOR VALUES FROM (100) TO (200) + mpp3059a_rename_1_prt_5_2_prt_3 | mpp3059a_rename_1_prt_5 | t | 2 | FOR VALUES FROM (200) TO (300) + mpp3059a_rename_1_prt_5_2_prt_4 | mpp3059a_rename_1_prt_5 | t | 2 | FOR VALUES FROM (300) TO (400) + mpp3059a_rename_1_prt_5_2_prt_5 | mpp3059a_rename_1_prt_5 | t | 2 | FOR VALUES FROM (400) TO (500) +(31 rows) + +create table mpp3216a (id int, rank int, year int, gender char(1), count int); +create table mpp3216 (like mpp3216a) partition by range (year) ( start (2001) end (2006) every (1)); +alter table mpp3216 rename to mpp3216_rename; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3216_rename') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +------------------------+----------------+--------+-------+---------------------------------- + mpp3216_rename | | f | 0 | + mpp3216_rename_1_prt_1 | mpp3216_rename | t | 1 | FOR VALUES FROM (2001) TO (2002) + mpp3216_rename_1_prt_2 | mpp3216_rename | t | 1 | FOR VALUES FROM (2002) TO (2003) + mpp3216_rename_1_prt_3 | mpp3216_rename | t | 1 | FOR VALUES FROM (2003) TO (2004) + mpp3216_rename_1_prt_4 | mpp3216_rename | t | 1 | FOR VALUES FROM (2004) TO (2005) + mpp3216_rename_1_prt_5 | mpp3216_rename | t | 1 | FOR VALUES FROM (2005) TO (2006) +(6 rows) + +CREATE TABLE mpp3059b (f1 time(2) with time zone, f2 char(4)) +partition by list (f2) +( partition pst values ('PST'), + partition est values ('EST') +); +alter table mpp3059b rename partition pst to "pacific time"; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059b') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +-------------------------------+-------------+--------+-------+------------------------ + mpp3059b | | f | 0 | + "mpp3059b_1_prt_pacific time" | mpp3059b | t | 1 | FOR VALUES IN ('PST ') + mpp3059b_1_prt_est | mpp3059b | t | 1 | FOR VALUES IN ('EST ') +(3 rows) + +CREATE TABLE mpp3059c (f1 time(2) with time zone, f2 char(4)) +partition by list (f2) +subpartition by range (f1) +subpartition template ( +start (time '00:00'), +start (time '01:00') +) +( partition pst values ('PST'), + partition est values ('EST') +); +alter table mpp3059c rename partition pst to pacific; +alter table mpp3059c rename partition est to "Eastern Time"; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059c') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +---------------------------------------+-------------------------------+--------+-------+---------------------------------------------------- + mpp3059c | | f | 0 | + mpp3059c_1_prt_pacific | mpp3059c | f | 1 | FOR VALUES IN ('PST ') + "mpp3059c_1_prt_Eastern Time" | mpp3059c | f | 1 | FOR VALUES IN ('EST ') + mpp3059c_1_prt_pacific_2_prt_1 | mpp3059c_1_prt_pacific | t | 2 | FOR VALUES FROM ('00:00:00-07') TO ('01:00:00-07') + mpp3059c_1_prt_pacific_2_prt_2 | mpp3059c_1_prt_pacific | t | 2 | FOR VALUES FROM ('01:00:00-07') TO (MAXVALUE) + "mpp3059c_1_prt_Eastern Time_2_prt_1" | "mpp3059c_1_prt_Eastern Time" | t | 2 | FOR VALUES FROM ('00:00:00-07') TO ('01:00:00-07') + "mpp3059c_1_prt_Eastern Time_2_prt_2" | "mpp3059c_1_prt_Eastern Time" | t | 2 | FOR VALUES FROM ('01:00:00-07') TO (MAXVALUE) +(7 rows) + +CREATE TABLE mpp3059d (f1 time(2) with time zone, f2 char(4), f3 varchar(10)) +partition by list (f2) +subpartition by list (f3) +subpartition template ( + subpartition male values ('Male','M'), + subpartition female values ('Female','F') +) +( partition pst values ('PST'), + partition est values ('EST') +); +alter table mpp3059d rename partition pst to pacific; +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3059d') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +-------------------------------------+------------------------+--------+-------+------------------------------- + mpp3059d | | f | 0 | + mpp3059d_1_prt_pacific | mpp3059d | f | 1 | FOR VALUES IN ('PST ') + mpp3059d_1_prt_est | mpp3059d | f | 1 | FOR VALUES IN ('EST ') + mpp3059d_1_prt_pacific_2_prt_male | mpp3059d_1_prt_pacific | t | 2 | FOR VALUES IN ('Male', 'M') + mpp3059d_1_prt_pacific_2_prt_female | mpp3059d_1_prt_pacific | t | 2 | FOR VALUES IN ('Female', 'F') + mpp3059d_1_prt_est_2_prt_male | mpp3059d_1_prt_est | t | 2 | FOR VALUES IN ('Male', 'M') + mpp3059d_1_prt_est_2_prt_female | mpp3059d_1_prt_est | t | 2 | FOR VALUES IN ('Female', 'F') +(7 rows) + +create table test_khush (a integer, b date, c varchar(30)) +partition by range(b) +( start ('2008-01-01') end ('2008-04-01') ); +Insert into test_khush values (1, '01-Jan-2008', 'abc'); +Insert into test_khush values (2, '01-Feb-2008', 'jhg'); +Insert into test_khush values (3, '01-Mar-2008', 'xyz'); +alter table test_khush add column d varchar(20); +insert into test_khush values (5,'05-Feb-2008','hgjhg','Test'); +drop table test_khush; +CREATE TABLE mpp3244(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +subpartition by range (b) subpartition template ( start (1) end (10) every (1))( partition aa start (1) end (10) every (1) ); +CREATE TABLE mpp3244a(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +subpartition by range (b) subpartition template ( start (1) end (10) every (1))( partition aa start (1) end (11) every (1) ); +insert into mpp3244 (a,b) values (10,1); +ERROR: no partition of relation "mpp3244" found for row +DETAIL: Partition key of the failing row contains (a) = (10). +insert into mpp3244a (a,b) values (10,1); +alter table mpp3244 add partition bb end (11); +insert into mpp3244 (a,b) values (10,1); +select count(*) from mpp3244; + count +------- + 1 +(1 row) + +select count(*) from mpp3244a; + count +------- + 1 +(1 row) + +CREATE TABLE mpp3256 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (100) ) +( start (0) end (1000) every (100)); +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +alter table mpp3256 add default partition default_part; +alter table mpp3256 drop partition default_part; +-- Examples from Documentation +CREATE TABLE mpp3377_sales (trans_id int, date date, amount decimal(9,2), region text) +PARTITION BY RANGE (date) +SUBPARTITION BY LIST (region) +SUBPARTITION TEMPLATE +( SUBPARTITION usa VALUES ('usa'), +SUBPARTITION asia VALUES ('asia'), +SUBPARTITION europe VALUES ('europe') ) +( START (date '2008-01-01') INCLUSIVE +END (date '2009-01-01') EXCLUSIVE +EVERY (INTERVAL '1 month') ); +-- Note from Jeff: MPP-3377 +-- since you already defined a template for your subpartition, you cannot specify it again in ADD (this now matches the behavior of CREATE TABLE). +ALTER TABLE mpp3377_sales ADD PARTITION +START (date '2009-02-01') INCLUSIVE +END (date '2009-03-01') EXCLUSIVE +( SUBPARTITION usa VALUES ('usa'), +SUBPARTITION asia VALUES ('asia'), +SUBPARTITION europe VALUES ('europe') ); +ERROR: subpartition configuration conflicts with subpartition template +LINE 4: ( SUBPARTITION usa VALUES ('usa'), + ^ +-- This is the new way +ALTER TABLE mpp3377_sales ADD PARTITION START (date '2009-02-01') INCLUSIVE END (date '2009-03-01') EXCLUSIVE; +CREATE TABLE mpp3250 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (100) ) +( start (0) end (1000) every (100)); +alter table mpp3250 add default partition default_part; +copy mpp3250 from '@abs_srcdir@/data/onek.data'; +CREATE TABLE mpp3375 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); +copy mpp3375 from '@abs_srcdir@/data/onek.data'; +CREATE TABLE mpp3375a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (100) ) +( start (0) end (1000) every (100)); +insert into mpp3375a select * from mpp3375; +alter table mpp3375a add default partition default_part; +alter table mpp3375a drop partition for (0); +alter table mpp3375a drop partition default_part; +-- Check that a negative number can be used in START, without quotes. +CREATE TABLE mpp3241(a int, b int, c int) +partition by range (a) +( partition aa start (1) end (5) every (1) ); +alter table mpp3241 add partition zz start (-1) end (0); +DROP TABLE mpp3241; +CREATE TABLE mpp3438 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by list (unique1) +subpartition by list (unique2) +( +partition aa values (1,2,3,4,5,6,7,8,9,10) (subpartition cc values (1,2,3), subpartition dd values (4,5,6) ), +partition bb values (11,12,13,14,15,16,17,18,19,20) (subpartition cc values (1,2,3), subpartition dd values (4,5,6) ) +); +-- This should fail +alter table mpp3438 add default partition default_part; +ERROR: no partitions specified at depth 2 +-- This should be the correct way +alter table mpp3438 add default partition default_part (default subpartition def2); +alter table mpp3438 alter partition aa add default partition def3; +\d mpp3438* + Partitioned table "partition_ddl2.mpp3438" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition key: LIST (unique1) +Number of partitions: 3 (Use \d+ to list them.) + + Partitioned table "partition_ddl2.mpp3438_1_prt_aa" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438 FOR VALUES IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) +Partition key: LIST (unique2) +Number of partitions: 3 (Use \d+ to list them.) + + Table "partition_ddl2.mpp3438_1_prt_aa_2_prt_cc" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438_1_prt_aa FOR VALUES IN (1, 2, 3) + + Table "partition_ddl2.mpp3438_1_prt_aa_2_prt_dd" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438_1_prt_aa FOR VALUES IN (4, 5, 6) + + Table "partition_ddl2.mpp3438_1_prt_aa_2_prt_def3" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438_1_prt_aa DEFAULT + + Partitioned table "partition_ddl2.mpp3438_1_prt_bb" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438 FOR VALUES IN (11, 12, 13, 14, 15, 16, 17, 18, 19, 20) +Partition key: LIST (unique2) +Number of partitions: 2 (Use \d+ to list them.) + + Table "partition_ddl2.mpp3438_1_prt_bb_2_prt_cc" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438_1_prt_bb FOR VALUES IN (1, 2, 3) + + Table "partition_ddl2.mpp3438_1_prt_bb_2_prt_dd" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438_1_prt_bb FOR VALUES IN (4, 5, 6) + +Partitioned table "partition_ddl2.mpp3438_1_prt_default_part" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438 DEFAULT +Partition key: LIST (unique2) +Number of partitions: 1 (Use \d+ to list them.) + +Table "partition_ddl2.mpp3438_1_prt_default_part_2_prt_def2" + Column | Type | Collation | Nullable | Default +-------------+---------+-----------+----------+--------- + unique1 | integer | | | + unique2 | integer | | | + two | integer | | | + four | integer | | | + ten | integer | | | + twenty | integer | | | + hundred | integer | | | + thousand | integer | | | + twothousand | integer | | | + fivethous | integer | | | + tenthous | integer | | | + odd | integer | | | + even | integer | | | + stringu1 | name | | | + stringu2 | name | | | + string4 | name | | | +Partition of: mpp3438_1_prt_default_part DEFAULT + +drop table mpp3438; +CREATE TABLE mpp3261 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); +copy mpp3261 from '@abs_srcdir@/data/onek.data'; +CREATE TABLE mpp3261_part ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +( partition aa start (0) end (1000) every (100), default partition default_part ); +alter table mpp3261_part drop partition for (0); +alter table mpp3261_part drop partition for (100); +alter table mpp3261_part drop partition for (200); +alter table mpp3261_part drop partition for (300); +alter table mpp3261_part drop partition for (400); +alter table mpp3261_part drop partition for (500); +alter table mpp3261_part drop partition for (600); +alter table mpp3261_part drop partition for (700); +alter table mpp3261_part drop partition for (800); +alter table mpp3261_part drop partition for (900); +-- Shouldn't take a long time to insert +insert into mpp3261_part select * from mpp3261; +drop table mpp3261; +drop table mpp3261_part; +CREATE TABLE mpp3079(q1 int8, q2 int8) +partition by range (q1) +(start (1) end (10) every (1)); +CREATE TABLE mpp3079a(q1 int2, q2 int2) +partition by range (q1) +(start (1) end (10) every (1)); +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3079') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +-----------------+-------------+--------+-------+--------------------------------- + mpp3079 | | f | 0 | + mpp3079_1_prt_1 | mpp3079 | t | 1 | FOR VALUES FROM ('1') TO ('2') + mpp3079_1_prt_2 | mpp3079 | t | 1 | FOR VALUES FROM ('2') TO ('3') + mpp3079_1_prt_3 | mpp3079 | t | 1 | FOR VALUES FROM ('3') TO ('4') + mpp3079_1_prt_4 | mpp3079 | t | 1 | FOR VALUES FROM ('4') TO ('5') + mpp3079_1_prt_5 | mpp3079 | t | 1 | FOR VALUES FROM ('5') TO ('6') + mpp3079_1_prt_6 | mpp3079 | t | 1 | FOR VALUES FROM ('6') TO ('7') + mpp3079_1_prt_7 | mpp3079 | t | 1 | FOR VALUES FROM ('7') TO ('8') + mpp3079_1_prt_8 | mpp3079 | t | 1 | FOR VALUES FROM ('8') TO ('9') + mpp3079_1_prt_9 | mpp3079 | t | 1 | FOR VALUES FROM ('9') TO ('10') +(10 rows) + +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3079a') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +------------------+-------------+--------+-------+--------------------------------- + mpp3079a | | f | 0 | + mpp3079a_1_prt_1 | mpp3079a | t | 1 | FOR VALUES FROM ('1') TO ('2') + mpp3079a_1_prt_2 | mpp3079a | t | 1 | FOR VALUES FROM ('2') TO ('3') + mpp3079a_1_prt_3 | mpp3079a | t | 1 | FOR VALUES FROM ('3') TO ('4') + mpp3079a_1_prt_4 | mpp3079a | t | 1 | FOR VALUES FROM ('4') TO ('5') + mpp3079a_1_prt_5 | mpp3079a | t | 1 | FOR VALUES FROM ('5') TO ('6') + mpp3079a_1_prt_6 | mpp3079a | t | 1 | FOR VALUES FROM ('6') TO ('7') + mpp3079a_1_prt_7 | mpp3079a | t | 1 | FOR VALUES FROM ('7') TO ('8') + mpp3079a_1_prt_8 | mpp3079a | t | 1 | FOR VALUES FROM ('8') TO ('9') + mpp3079a_1_prt_9 | mpp3079a | t | 1 | FOR VALUES FROM ('9') TO ('10') +(10 rows) + +drop table mpp3079; +drop table mpp3079a; +CREATE TABLE mpp3242(a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int) +partition by range (a) +( partition aa start (1) end (10) every (1) ); +alter table mpp3242 add default partition default_part; +insert into mpp3242 values(-1); +-- Needs to use ALTER SPLIT instead of ADD as value exists in default +-- partition corresponding to new partition. It's not +-- automatic. +alter table mpp3242 add partition zz start ('-1') end (0); +ERROR: updated partition constraint for default partition "mpp3242_1_prt_default_part" would be violated by some row +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3242') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +----------------------------+-------------+--------+-------+----------------------------- + mpp3242 | | f | 0 | + mpp3242_1_prt_aa_1 | mpp3242 | t | 1 | FOR VALUES FROM (1) TO (2) + mpp3242_1_prt_aa_2 | mpp3242 | t | 1 | FOR VALUES FROM (2) TO (3) + mpp3242_1_prt_aa_3 | mpp3242 | t | 1 | FOR VALUES FROM (3) TO (4) + mpp3242_1_prt_aa_4 | mpp3242 | t | 1 | FOR VALUES FROM (4) TO (5) + mpp3242_1_prt_aa_5 | mpp3242 | t | 1 | FOR VALUES FROM (5) TO (6) + mpp3242_1_prt_aa_6 | mpp3242 | t | 1 | FOR VALUES FROM (6) TO (7) + mpp3242_1_prt_aa_7 | mpp3242 | t | 1 | FOR VALUES FROM (7) TO (8) + mpp3242_1_prt_aa_8 | mpp3242 | t | 1 | FOR VALUES FROM (8) TO (9) + mpp3242_1_prt_aa_9 | mpp3242 | t | 1 | FOR VALUES FROM (9) TO (10) + mpp3242_1_prt_default_part | mpp3242 | t | 1 | DEFAULT +(11 rows) + +drop table mpp3242; +CREATE TABLE mpp3523 (f1 time(2) with time zone) +partition by range (f1) +( + partition "Los Angeles" start (time with time zone '00:00 PST') end (time with time zone '23:00 PST') EVERY (INTERVAL '1 hour'), + partition "New York" start (time with time zone '00:00 EST') end (time with time zone '23:00 EST') EVERY (INTERVAL '1 hour') +); +ERROR: partition "mpp3523_1_prt_New York_4" would overlap partition "mpp3523_1_prt_Los Angeles_1" +-- Tries to truncate first, but the partition name is still too long, so ERROR +alter table mpp3523 rename partition "Los Angeles_1" to "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; +ERROR: relation "mpp3523" does not exist +-- Truncates the table name to mpp3523_0000000000111111111122222222223333333333444444444455555 +CREATE TABLE mpp3523_000000000011111111112222222222333333333344444444445555555555556666666666777777777788888888889999999999 (f1 time(2) with time zone) +partition by range (f1) +( + partition "Los Angeles" start (time with time zone '00:00 PST') end (time with time zone '23:00 PST') EVERY (INTERVAL '1 hour'), + partition "New York" start (time with time zone '00:00 EST') end (time with time zone '23:00 EST') EVERY (INTERVAL '1 hour') +); +ERROR: partition "mpp3523_00000000001111111111222222222233333333_1_prt_New York_4" would overlap partition "mpp3523_00000000001111111111222222222233333_1_prt_Los Angeles_1" +-- Truncates the table name to mpp3523_0000000000111111111122222222223333333333444444444455555, but partition name is too long, so ERROR +alter table mpp3523_000000000011111111112222222222333333333344444444445555555555556666666666777777777788888888889999999999 rename partition "Los Angeles_1" to "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; +ERROR: relation "mpp3523_0000000000111111111122222222223333333333444444444455555" does not exist +-- Truncates the table name to mpp3523_0000000000111111111122222222223333333333444444444455555, and partition name is safe, so renamed +alter table mpp3523_000000000011111111112222222222333333333344444444445555555555556666666666777777777788888888889999999999 rename partition "Los Angeles_1" to "LA1"; +ERROR: relation "mpp3523_0000000000111111111122222222223333333333444444444455555" does not exist +-- Use the actual table name +alter table mpp3523_0000000000111111111122222222223333333333444444444455555 rename partition "Los Angeles_2" to "LA2"; +ERROR: relation "mpp3523_0000000000111111111122222222223333333333444444444455555" does not exist +drop table mpp3523; +ERROR: table "mpp3523" does not exist +-- Truncates the table name to mpp3523_0000000000111111111122222222223333333333444444444455555 +drop table mpp3523_000000000011111111112222222222333333333344444444445555555555556666666666777777777788888888889999999999; +ERROR: table "mpp3523_0000000000111111111122222222223333333333444444444455555" does not exist +CREATE TABLE mpp3260 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +( partition aa start (0) end (1000) every (100), default partition default_part ); +alter table mpp3260 drop partition for (0); +alter table mpp3260 drop partition for (100); +alter table mpp3260 drop partition for (200); +alter table mpp3260 drop partition for (300); +alter table mpp3260 drop partition for (400); +alter table mpp3260 drop partition for (500); +alter table mpp3260 drop partition for (600); +alter table mpp3260 drop partition for (700); +alter table mpp3260 drop partition for (800); +alter table mpp3260 drop partition for (900); +insert into mpp3260 (unique1) values (1); +CREATE TABLE mpp3260a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (100) ) +( start (0) end (1000) every (100)); +alter table mpp3260a drop partition for (0); +alter table mpp3260a drop partition for (100); +alter table mpp3260a drop partition for (200); +alter table mpp3260a drop partition for (300); +alter table mpp3260a drop partition for (400); +alter table mpp3260a drop partition for (500); +alter table mpp3260a drop partition for (600); +alter table mpp3260a drop partition for (700); +alter table mpp3260a drop partition for (800); +-- Last subpartition, cannot be dropped +alter table mpp3260a drop partition for (900); +ERROR: cannot drop partition "mpp3260a_1_prt_10" of "mpp3260a" -- only one remains +HINT: Use DROP TABLE "mpp3260a" to remove the table and the final partition +drop table mpp3260a_1_prt_10; +drop table mpp3260; +drop table mpp3260a; +CREATE TABLE mpp3080_int8(q1 int8, q2 int8) +partition by range (q1) +(start (1) end (5) every (1)); +CREATE TABLE mpp3080_float4 (f1 float4) +partition by range (f1) +(start (1) end (5) every (1)); +CREATE TABLE mpp3080_float8(i INT DEFAULT 1, f1 float8) +partition by range (f1) +(start (1) end (5) every (1)); +CREATE TABLE mpp3080_floatreal(i INT DEFAULT 1, f1 float(24)) +partition by range (f1) +(start (1) end (5) every (1)); +CREATE TABLE mpp3080_floatdouble(i INT DEFAULT 1, f1 float(53)) +partition by range (f1) +(start (1) end (5) every (1)); +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3080_floatdouble') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +-----------------------------+---------------------+--------+-------+-------------------------------- + mpp3080_floatdouble | | f | 0 | + mpp3080_floatdouble_1_prt_1 | mpp3080_floatdouble | t | 1 | FOR VALUES FROM ('1') TO ('2') + mpp3080_floatdouble_1_prt_2 | mpp3080_floatdouble | t | 1 | FOR VALUES FROM ('2') TO ('3') + mpp3080_floatdouble_1_prt_3 | mpp3080_floatdouble | t | 1 | FOR VALUES FROM ('3') TO ('4') + mpp3080_floatdouble_1_prt_4 | mpp3080_floatdouble | t | 1 | FOR VALUES FROM ('4') TO ('5') +(5 rows) + +CREATE TABLE mpp3080_numeric (id int4, val numeric(210,10)) +partition by range (val) +(start (1) end (5) every (1)); +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3080_numeric') as t, pg_class as c where relid = oid; + relid | parentrelid | isleaf | level | pg_get_expr +-------------------------+-----------------+--------+-------+-------------------------------------------------- + mpp3080_numeric | | f | 0 | + mpp3080_numeric_1_prt_1 | mpp3080_numeric | t | 1 | FOR VALUES FROM (1.0000000000) TO (2.0000000000) + mpp3080_numeric_1_prt_2 | mpp3080_numeric | t | 1 | FOR VALUES FROM (2.0000000000) TO (3.0000000000) + mpp3080_numeric_1_prt_3 | mpp3080_numeric | t | 1 | FOR VALUES FROM (3.0000000000) TO (4.0000000000) + mpp3080_numeric_1_prt_4 | mpp3080_numeric | t | 1 | FOR VALUES FROM (4.0000000000) TO (5.0000000000) +(5 rows) + +CREATE TABLE mpp3080_numericbig (id int4, val numeric(1000,800)) +partition by range (val) +(start (1) end (5) every (1)); +-- order 1,5 +select t.*, pg_get_expr(relpartbound, oid) from pg_partition_tree('mpp3080_numericbig') as t, pg_class as c where relid = oid order by 1,5; + relid | parentrelid | isleaf | level | pg_get_expr +----------------------------+--------------------+--------+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + mpp3080_numericbig | | f | 0 | + mpp3080_numericbig_1_prt_1 | mpp3080_numericbig | t | 1 | FOR VALUES FROM (1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) TO (2.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) + mpp3080_numericbig_1_prt_2 | mpp3080_numericbig | t | 1 | FOR VALUES FROM (2.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) TO (3.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) + mpp3080_numericbig_1_prt_3 | mpp3080_numericbig | t | 1 | FOR VALUES FROM (3.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) TO (4.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) + mpp3080_numericbig_1_prt_4 | mpp3080_numericbig | t | 1 | FOR VALUES FROM (4.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) TO (5.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) +(5 rows) + +create temp TABLE temp_hour_range (f1 time(2)) +partition by range (f1) +( + start (time '09:00') end (time '17:00') EVERY (INTERVAL '1 hour'), + default partition default_part +); +-- MPP-26829 +-- negative test for when SUBPARTITION TEMPLATE shows up before any SUBPARTITION BY +CREATE TABLE MPP_26829 +(a integer, b integer NOT NULL, c integer) +PARTITION BY RANGE (b) +SUBPARTITION TEMPLATE (START (1) END (12) EVERY (1), DEFAULT SUBPARTITION other_months ) +SUBPARTITION BY LIST (c) +SUBPARTITION TEMPLATE ( +SUBPARTITION p027 VALUES ('027'), +SUBPARTITION p141 VALUES ('141'), +SUBPARTITION p037 VALUES ('037')); +ERROR: syntax error at or near "TEMPLATE" +LINE 4: SUBPARTITION TEMPLATE (START (1) END (12) EVERY (1), DEFAULT... + ^ +-- MPP-26829 +-- Add check test on partition exchange +create table parttab (a int4, b int4) partition by range (a) (start (1) end (5) every (2)); +create table parttab_x (a int4, b int4); +alter table parttab exchange partition for (1) with table parttab_x; +-- This used to work on GPDB 6 and below, but it is now rejected. ALTER +-- PARTITION is used to address subpartitions, it is not needed otherwise. +create table parttab_y (a int4, b int4); +alter table parttab alter partition for (1) exchange partition for (1) with table parttab_y; +ERROR: table "parttab_1_prt_1" is not partitioned +-- add constraint using index is forbidden on root and interior partitioned tables +create table root_part(a int, b int) + partition by range(b) + subpartition by list(b) + subpartition template (subpartition leaf values (1)) + (partition interior start(1) end(2) every(1)); +-- disallowed on root partitions +create unique index on root_part(a, b); +alter table root_part add primary key using index root_part_a_b_idx ; +ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables +-- disallowed on interior partitions +create unique index on root_part_1_prt_interior_1(a, b); +alter table root_part_1_prt_interior_1 add primary key using index root_part_1_prt_interior_1_a_b_idx1 ; +ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables +-- allowed on leaf partitions +create unique index on root_part_1_prt_interior_1_2_prt_leaf(a, b); +alter table root_part_1_prt_interior_1_2_prt_leaf add primary key using index root_part_1_prt_interior_1_2_prt_leaf_a_b_idx2; +drop table root_part; diff --git a/src/test/singlenode_regress/output/resource_queue_function.source b/src/test/singlenode_regress/output/resource_queue_function.source new file mode 100644 index 00000000000..ab31043f30d --- /dev/null +++ b/src/test/singlenode_regress/output/resource_queue_function.source @@ -0,0 +1,88 @@ +CREATE FUNCTION checkResourceQueueMemoryLimits(cstring) RETURNS boolean +AS '@abs_srcdir@/regress.so', 'checkResourceQueueMemoryLimits' LANGUAGE C READS SQL DATA; +CREATE TABLE test_table(c1 int, c2 int); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'c1' as the Cloudberry Database 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. +INSERT INTO test_table values(1, 2); +-- MPP-17240 +CREATE RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS = 1, MEMORY_LIMIT='10MB'); +CREATE ROLE test_role WITH RESOURCE QUEUE test_q; +GRANT SELECT ON test_table TO test_role; +SET STATEMENT_MEM = '125MB'; +-- should return true +select checkResourceQueueMemoryLimits('test_q'); + checkresourcequeuememorylimits +-------------------------------- + t +(1 row) + +SET ROLE test_role; +-- should deadlock as there aren't enough resources to run the query. +-- query should be assigned 125MB, but queue only allows 10MB +SELECT count(*) FROM test_table; +ERROR: deadlock detected, locking against self +HINT: It is likely that a query is waiting on itself for resources. Check resource queue limits. +RESET ROLE; +-- should return true +select checkResourceQueueMemoryLimits('test_q'); + checkresourcequeuememorylimits +-------------------------------- + t +(1 row) + +RESET STATEMENT_MEM; +REVOKE SELECT ON test_table FROM test_role; +DROP ROLE test_role; +DROP RESOURCE QUEUE test_q; +-- MPP-15992 +CREATE RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS = 1, MEMORY_LIMIT='8GB'); +CREATE ROLE test_role WITH RESOURCE QUEUE test_q; +GRANT SELECT ON test_table TO test_role; +SET ROLE test_role; +-- should return result +SELECT count(*) FROM test_table; + count +------- + 1 +(1 row) + +RESET ROLE; +ALTER RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS = 1, MEMORY_LIMIT='10GB'); +SET ROLE test_role; +-- should return result +SELECT count(*) FROM test_table; + count +------- + 1 +(1 row) + +RESET ROLE; +-- should return true +select checkResourceQueueMemoryLimits('test_q'); + checkresourcequeuememorylimits +-------------------------------- + t +(1 row) + +ALTER RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS = 1, MEMORY_LIMIT='7GB'); +SET ROLE test_role; +-- should return result +SELECT count(*) FROM test_table; + count +------- + 1 +(1 row) + +RESET ROLE; +-- should return true +select checkResourceQueueMemoryLimits('test_q'); + checkresourcequeuememorylimits +-------------------------------- + t +(1 row) + +REVOKE SELECT ON test_table FROM test_role; +DROP TABLE test_table; +DROP ROLE test_role; +DROP RESOURCE QUEUE test_q; +DROP FUNCTION checkResourceQueueMemoryLimits(cstring); diff --git a/src/test/singlenode_regress/output/singlenode_compatibility_cbdb.source b/src/test/singlenode_regress/output/singlenode_compatibility_cbdb.source new file mode 100644 index 00000000000..8c67c480b83 --- /dev/null +++ b/src/test/singlenode_regress/output/singlenode_compatibility_cbdb.source @@ -0,0 +1,126 @@ +-- +-- Test compatibility in CBDB singlenode mode. +-- +-- In singlenode mode, certain clauses such as scatter by and +-- distributed by become meaningless, but for the sake of +-- compatibility, we retain the grammar and treat them as ignored. +-- This file aims to verify the correct functionality of all these +-- SQL statements. +-- test ignorance of `distributed by` +create table l (i int, j int) distributed by (i); +WARNING: DISTRIBUTED BY clause has no effect in singlenode mode +create table r (i int, j int) distributed by (j); +WARNING: DISTRIBUTED BY clause has no effect in singlenode mode +insert into l select i % 7, i % 13 from generate_series(1, 1000) i; +insert into r select i % 13, i % 7 from generate_series(1, 1000) i; +explain select count(*) from l; + QUERY PLAN +------------------------------------------------------------ + Aggregate (cost=123.62..123.64 rows=1 width=8) + -> Seq Scan on l (cost=0.00..100.90 rows=9090 width=0) + Optimizer: Postgres query optimizer +(3 rows) + +select count(*) from l; + count +------- + 1000 +(1 row) + +explain select count(*) from l, r where l.i = r.i; + QUERY PLAN +------------------------------------------------------------------------ + Aggregate (cost=11699.51..11699.52 rows=1 width=8) + -> Hash Join (cost=214.53..11492.94 rows=82628 width=0) + Hash Cond: (l.i = r.i) + -> Seq Scan on l (cost=0.00..100.90 rows=9090 width=4) + -> Hash (cost=100.90..100.90 rows=9090 width=4) + -> Seq Scan on r (cost=0.00..100.90 rows=9090 width=4) + Optimizer: Postgres query optimizer +(7 rows) + +select count(*) from l, r where l.i = r.i; + count +------- + 76858 +(1 row) + +alter table l set distributed by (j); +ERROR: SET DISTRIBUTED BY not supported in utility mode +create table ao1(x int, y int) with(appendonly=true) distributed by (x); +WARNING: DISTRIBUTED BY clause has no effect in singlenode mode +create table aocs1(x int, y int) with(appendonly=true, orientation=column) distributed by (x); +WARNING: DISTRIBUTED BY clause has no effect in singlenode mode +insert into ao1 select i, i from generate_series(1, 1200000) g(i); +analyze ao1; +insert into aocs1 select i, i from generate_series(1, 1200000) g(i); +analyze aocs1; +explain(costs off) select count(*) from ao1; + QUERY PLAN +------------------------------------- + Aggregate + -> Seq Scan on ao1 + Optimizer: Postgres query optimizer +(3 rows) + +select count(*) from ao1; + count +--------- + 1200000 +(1 row) + +explain(costs off) select count(*) from aocs1; + QUERY PLAN +------------------------------------- + Aggregate + -> Seq Scan on aocs1 + Optimizer: Postgres query optimizer +(3 rows) + +select count(*) from aocs1; + count +--------- + 1200000 +(1 row) + +-- test ignorance of `scatter by` +CREATE TABLE example(a int, b text) DISTRIBUTED by (a); +WARNING: DISTRIBUTED BY clause has no effect in singlenode mode +COPY example FROM stdin; +CREATE FUNCTION multiset_func(a anytable) RETURNS SETOF example + AS '@abs_srcdir@/regress.so', 'multiset_example' LANGUAGE C READS SQL DATA; +explain SELECT * FROM multiset_func( TABLE( SELECT * FROM example ORDER BY a, b SCATTER by a) ) order by a, b; +WARNING: SCATTER BY clause has no effect in singlenode mode + QUERY PLAN +-------------------------------------------------------------------------------------- + Sort (cost=754.48..767.26 rows=5110 width=36) + Sort Key: a, b + -> Table Function Scan on multiset_func (cost=375.85..439.73 rows=5110 width=36) + -> Sort (cost=375.85..388.63 rows=5110 width=36) + Sort Key: example.a, example.b + -> Seq Scan on example (cost=0.00..61.10 rows=5110 width=36) + Optimizer: Postgres query optimizer +(7 rows) + +SELECT * FROM multiset_func( TABLE( SELECT * FROM example ORDER BY a, b SCATTER by a) ) order by a, b; +WARNING: SCATTER BY clause has no effect in singlenode mode + a | b +---+------------- + 1 | value1.1/4 + 1 | value1.2/4 + 1 | value1.3/4 + 1 | value1.4/4 + 2 | value2.1/3 + 2 | value2.2/3 + 2 | value2.3/3 + 3 | value3.1/2 + 3 | value3.2/2 + 4 | value4.1/1 +(10 rows) + +drop table l; +drop table r; +drop table ao1; +drop table aocs1; +drop function multiset_func; +drop table example; diff --git a/src/test/singlenode_regress/output/tablespace.source b/src/test/singlenode_regress/output/tablespace.source new file mode 100644 index 00000000000..6c7c4a16900 --- /dev/null +++ b/src/test/singlenode_regress/output/tablespace.source @@ -0,0 +1,952 @@ +-- start_matchignore +-- m/WARNING: tablespace symlink path is too long for TAR/ +-- m/DETAIL: The symlinked path \".*\" will be truncated to 100 characters when sending a TAR to the utilities \(e.g. pg_basebackup\)/ +-- end_matchignore +-- create a tablespace using WITH clause +CREATE TABLESPACE regress_tblspacewith LOCATION '@testtablespace@' WITH (some_nonexistent_parameter = true); -- fail +ERROR: unrecognized parameter "some_nonexistent_parameter" +CREATE TABLESPACE regress_tblspacewith LOCATION '@testtablespace@' WITH (random_page_cost = 3.0); -- ok +-- check to see the parameter was used +SELECT spcoptions FROM pg_tablespace WHERE spcname = 'regress_tblspacewith'; + spcoptions +------------------------ + {random_page_cost=3.0} +(1 row) + +-- drop the tablespace so we can re-use the location +DROP TABLESPACE regress_tblspacewith; +-- create a tablespace we can use +CREATE TABLESPACE regress_tblspace LOCATION '@testtablespace@'; +-- try setting and resetting some properties for the new tablespace +ALTER TABLESPACE regress_tblspace SET (random_page_cost = 1.0, seq_page_cost = 1.1); +ALTER TABLESPACE regress_tblspace SET (some_nonexistent_parameter = true); -- fail +ERROR: unrecognized parameter "some_nonexistent_parameter" +ALTER TABLESPACE regress_tblspace RESET (random_page_cost = 2.0); -- fail +ERROR: RESET must not include values for parameters +ALTER TABLESPACE regress_tblspace RESET (random_page_cost, effective_io_concurrency); -- ok +-- REINDEX (TABLESPACE) +-- catalogs and system tablespaces +-- system catalog, fail +REINDEX (TABLESPACE regress_tblspace) TABLE pg_am; +ERROR: cannot move system relation "pg_am_name_index" +REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_am; +ERROR: cannot reindex system catalogs concurrently +-- shared catalog, fail +REINDEX (TABLESPACE regress_tblspace) TABLE pg_authid; +ERROR: cannot move system relation "pg_authid_rolname_index" +REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_authid; +ERROR: cannot reindex system catalogs concurrently +-- toast relations, fail +REINDEX (TABLESPACE regress_tblspace) INDEX pg_toast.pg_toast_1260_index; +ERROR: cannot move system relation "pg_toast_1260_index" +REINDEX (TABLESPACE regress_tblspace) INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; +ERROR: cannot reindex system catalogs concurrently +REINDEX (TABLESPACE regress_tblspace) TABLE pg_toast.pg_toast_1260; +ERROR: cannot move system relation "pg_toast_1260_index" +REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_toast.pg_toast_1260; +ERROR: cannot reindex system catalogs concurrently +-- system catalog, fail +REINDEX (TABLESPACE pg_global) TABLE pg_authid; +ERROR: cannot move system relation "pg_authid_rolname_index" +REINDEX (TABLESPACE pg_global) TABLE CONCURRENTLY pg_authid; +ERROR: cannot reindex system catalogs concurrently +-- table with toast relation +CREATE TABLE regress_tblspace_test_tbl (num1 bigint, num2 double precision, t text); +INSERT INTO regress_tblspace_test_tbl (num1, num2, t) + SELECT round(random()*100), random(), 'text' + FROM generate_series(1, 10) s(i); +CREATE INDEX regress_tblspace_test_tbl_idx ON regress_tblspace_test_tbl (num1); +-- move to global tablespace, fail +REINDEX (TABLESPACE pg_global) INDEX regress_tblspace_test_tbl_idx; +ERROR: only shared relations can be placed in pg_global tablespace +REINDEX (TABLESPACE pg_global) INDEX CONCURRENTLY regress_tblspace_test_tbl_idx; +ERROR: cannot move non-shared relation to tablespace "pg_global" +-- check transactional behavior of REINDEX (TABLESPACE) +BEGIN; +REINDEX (TABLESPACE regress_tblspace) INDEX regress_tblspace_test_tbl_idx; +REINDEX (TABLESPACE regress_tblspace) TABLE regress_tblspace_test_tbl; +ROLLBACK; +-- no relation moved to the new tablespace +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace'; + relname +--------- +(0 rows) + +-- check that all indexes are moved to a new tablespace with different +-- relfilenode. +-- Save first the existing relfilenode for the toast and main relations. +SELECT relfilenode as main_filenode FROM pg_class + WHERE relname = 'regress_tblspace_test_tbl_idx' \gset +SELECT relfilenode as toast_filenode FROM pg_class + WHERE oid = + (SELECT i.indexrelid + FROM pg_class c, + pg_index i + WHERE i.indrelid = c.reltoastrelid AND + c.relname = 'regress_tblspace_test_tbl') \gset +REINDEX (TABLESPACE regress_tblspace) TABLE regress_tblspace_test_tbl; +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace' + ORDER BY c.relname; + relname +------------------------------- + regress_tblspace_test_tbl_idx +(1 row) + +ALTER TABLE regress_tblspace_test_tbl SET TABLESPACE regress_tblspace; +ALTER TABLE regress_tblspace_test_tbl SET TABLESPACE pg_default; +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace' + ORDER BY c.relname; + relname +------------------------------- + regress_tblspace_test_tbl_idx +(1 row) + +-- Move back to the default tablespace. +ALTER INDEX regress_tblspace_test_tbl_idx SET TABLESPACE pg_default; +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace' + ORDER BY c.relname; + relname +--------- +(0 rows) + +REINDEX (TABLESPACE regress_tblspace) TABLE regress_tblspace_test_tbl; +SELECT c.relname FROM pg_class c, pg_tablespace s + WHERE c.reltablespace = s.oid AND s.spcname = 'regress_tblspace' + ORDER BY c.relname; + relname +------------------------------- + regress_tblspace_test_tbl_idx +(1 row) + +SELECT relfilenode = :main_filenode AS main_same FROM pg_class + WHERE relname = 'regress_tblspace_test_tbl_idx'; + main_same +----------- + f +(1 row) + +SELECT relfilenode = :toast_filenode as toast_same FROM pg_class + WHERE oid = + (SELECT i.indexrelid + FROM pg_class c, + pg_index i + WHERE i.indrelid = c.reltoastrelid AND + c.relname = 'regress_tblspace_test_tbl'); + toast_same +------------ + f +(1 row) + +DROP TABLE regress_tblspace_test_tbl; +-- REINDEX (TABLESPACE) with partitions +-- Create a partition tree and check the set of relations reindexed +-- with their new tablespace. +CREATE TABLE tbspace_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1); +CREATE TABLE tbspace_reindex_part_0 PARTITION OF tbspace_reindex_part + FOR VALUES FROM (0) TO (10) PARTITION BY list (c2); +CREATE TABLE tbspace_reindex_part_0_1 PARTITION OF tbspace_reindex_part_0 + FOR VALUES IN (1); +CREATE TABLE tbspace_reindex_part_0_2 PARTITION OF tbspace_reindex_part_0 + FOR VALUES IN (2); +-- This partitioned table will have no partitions. +CREATE TABLE tbspace_reindex_part_10 PARTITION OF tbspace_reindex_part + FOR VALUES FROM (10) TO (20) PARTITION BY list (c2); +-- Create some partitioned indexes +CREATE INDEX tbspace_reindex_part_index ON ONLY tbspace_reindex_part (c1); +CREATE INDEX tbspace_reindex_part_index_0 ON ONLY tbspace_reindex_part_0 (c1); +ALTER INDEX tbspace_reindex_part_index ATTACH PARTITION tbspace_reindex_part_index_0; +-- This partitioned index will have no partitions. +CREATE INDEX tbspace_reindex_part_index_10 ON ONLY tbspace_reindex_part_10 (c1); +ALTER INDEX tbspace_reindex_part_index ATTACH PARTITION tbspace_reindex_part_index_10; +CREATE INDEX tbspace_reindex_part_index_0_1 ON ONLY tbspace_reindex_part_0_1 (c1); +ALTER INDEX tbspace_reindex_part_index_0 ATTACH PARTITION tbspace_reindex_part_index_0_1; +CREATE INDEX tbspace_reindex_part_index_0_2 ON ONLY tbspace_reindex_part_0_2 (c1); +ALTER INDEX tbspace_reindex_part_index_0 ATTACH PARTITION tbspace_reindex_part_index_0_2; +SELECT relid, parentrelid, level FROM pg_partition_tree('tbspace_reindex_part_index') + ORDER BY relid, level; + relid | parentrelid | level +--------------------------------+------------------------------+------- + tbspace_reindex_part_index | | 0 + tbspace_reindex_part_index_0 | tbspace_reindex_part_index | 1 + tbspace_reindex_part_index_10 | tbspace_reindex_part_index | 1 + tbspace_reindex_part_index_0_1 | tbspace_reindex_part_index_0 | 2 + tbspace_reindex_part_index_0_2 | tbspace_reindex_part_index_0 | 2 +(5 rows) + +-- Track the original tablespace, relfilenode and OID of each index +-- in the tree. +CREATE TEMP TABLE reindex_temp_before AS + SELECT oid, relname, relfilenode, reltablespace + FROM pg_class + WHERE relname ~ 'tbspace_reindex_part_index'; +REINDEX (TABLESPACE regress_tblspace) TABLE tbspace_reindex_part; +-- REINDEX CONCURRENTLY changes the OID of the old relation, hence a check +-- based on the relation name below. +SELECT b.relname, + CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' + ELSE 'relfilenode has changed' END AS filenode, + CASE WHEN a.reltablespace = b.reltablespace THEN 'reltablespace is unchanged' + ELSE 'reltablespace has changed' END AS tbspace + FROM reindex_temp_before b JOIN pg_class a ON b.relname = a.relname + ORDER BY 1; + relname | filenode | tbspace +--------------------------------+--------------------------+---------------------------- + tbspace_reindex_part_index | relfilenode is unchanged | reltablespace is unchanged + tbspace_reindex_part_index_0 | relfilenode is unchanged | reltablespace is unchanged + tbspace_reindex_part_index_0_1 | relfilenode has changed | reltablespace has changed + tbspace_reindex_part_index_0_2 | relfilenode has changed | reltablespace has changed + tbspace_reindex_part_index_10 | relfilenode is unchanged | reltablespace is unchanged +(5 rows) + +DROP TABLE tbspace_reindex_part; +-- create a schema we can use +CREATE SCHEMA testschema; +-- try a table +CREATE TABLE testschema.foo (i int) TABLESPACE regress_tblspace; +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname = 'foo'; + relname | spcname +---------+------------------ + foo | regress_tblspace +(1 row) + +INSERT INTO testschema.foo VALUES(1); +INSERT INTO testschema.foo VALUES(2); +-- tables from dynamic sources +CREATE TABLE testschema.asselect TABLESPACE regress_tblspace AS SELECT 1; +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname = 'asselect'; + relname | spcname +----------+------------------ + asselect | regress_tblspace +(1 row) + +PREPARE selectsource(int) AS SELECT $1; +CREATE TABLE testschema.asexecute TABLESPACE regress_tblspace + AS EXECUTE selectsource(2); +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname = 'asexecute'; + relname | spcname +-----------+------------------ + asexecute | regress_tblspace +(1 row) + +-- index +CREATE INDEX foo_idx on testschema.foo(i) TABLESPACE regress_tblspace; +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname = 'foo_idx'; + relname | spcname +---------+------------------ + foo_idx | regress_tblspace +(1 row) + +-- check \d output +\d testschema.foo + Table "testschema.foo" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + i | integer | | | +Indexes: + "foo_idx" btree (i), tablespace "regress_tblspace" +Tablespace: "regress_tblspace" + +\d testschema.foo_idx + Index "testschema.foo_idx" + Column | Type | Key? | Definition +--------+---------+------+------------ + i | integer | yes | i +btree, for table "testschema.foo" +Tablespace: "regress_tblspace" + +-- +-- partitioned table +-- +CREATE TABLE testschema.part (a int) PARTITION BY LIST (a); +SET default_tablespace TO pg_global; +CREATE TABLE testschema.part_1 PARTITION OF testschema.part FOR VALUES IN (1); +ERROR: only shared relations can be placed in pg_global tablespace +RESET default_tablespace; +CREATE TABLE testschema.part_1 PARTITION OF testschema.part FOR VALUES IN (1); +SET default_tablespace TO regress_tblspace; +CREATE TABLE testschema.part_2 PARTITION OF testschema.part FOR VALUES IN (2); +SET default_tablespace TO pg_global; +CREATE TABLE testschema.part_3 PARTITION OF testschema.part FOR VALUES IN (3); +ERROR: only shared relations can be placed in pg_global tablespace +-- GPDB: Cloudberry's ALTER TABLE .. SET TABLESPACE command recurses by +-- default, hence add ONLY to achieve the same results for SELECT. +ALTER TABLE ONLY testschema.part SET TABLESPACE regress_tblspace; +CREATE TABLE testschema.part_3 PARTITION OF testschema.part FOR VALUES IN (3); +CREATE TABLE testschema.part_4 PARTITION OF testschema.part FOR VALUES IN (4) + TABLESPACE pg_default; +CREATE TABLE testschema.part_56 PARTITION OF testschema.part FOR VALUES IN (5, 6) + PARTITION BY LIST (a); +-- GPDB: Cloudberry's ALTER TABLE .. SET TABLESPACE command recurses by +-- default, hence add ONLY to achieve the same results for SELECT. +ALTER TABLE ONLY testschema.part SET TABLESPACE pg_default; +CREATE TABLE testschema.part_78 PARTITION OF testschema.part FOR VALUES IN (7, 8) + PARTITION BY LIST (a); +ERROR: only shared relations can be placed in pg_global tablespace +CREATE TABLE testschema.part_910 PARTITION OF testschema.part FOR VALUES IN (9, 10) + PARTITION BY LIST (a) TABLESPACE regress_tblspace; +RESET default_tablespace; +CREATE TABLE testschema.part_78 PARTITION OF testschema.part FOR VALUES IN (7, 8) + PARTITION BY LIST (a); +SELECT relname, spcname FROM pg_catalog.pg_class c + JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid) + LEFT JOIN pg_catalog.pg_tablespace t ON c.reltablespace = t.oid + where c.relname LIKE 'part%' AND n.nspname = 'testschema' order by relname; + relname | spcname +----------+------------------ + part | + part_1 | + part_2 | regress_tblspace + part_3 | regress_tblspace + part_4 | + part_56 | regress_tblspace + part_78 | + part_910 | regress_tblspace +(8 rows) + +RESET default_tablespace; +DROP TABLE testschema.part; +-- partitioned index +CREATE TABLE testschema.part (a int) PARTITION BY LIST (a); +CREATE TABLE testschema.part1 PARTITION OF testschema.part FOR VALUES IN (1); +CREATE INDEX part_a_idx ON testschema.part (a) TABLESPACE regress_tblspace; +CREATE TABLE testschema.part2 PARTITION OF testschema.part FOR VALUES IN (2); +SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c + where c.reltablespace = t.oid AND c.relname LIKE 'part%_idx'; + relname | spcname +-------------+------------------ + part1_a_idx | regress_tblspace + part2_a_idx | regress_tblspace + part_a_idx | regress_tblspace +(3 rows) + +\d testschema.part + Partitioned table "testschema.part" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition key: LIST (a) +Indexes: + "part_a_idx" btree (a), tablespace "regress_tblspace" +Number of partitions: 2 (Use \d+ to list them.) + +\d+ testschema.part + Partitioned table "testschema.part" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | +Partition key: LIST (a) +Indexes: + "part_a_idx" btree (a), tablespace "regress_tblspace" +Partitions: testschema.part1 FOR VALUES IN (1), + testschema.part2 FOR VALUES IN (2) + +\d testschema.part1 + Table "testschema.part1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition of: testschema.part FOR VALUES IN (1) +Indexes: + "part1_a_idx" btree (a), tablespace "regress_tblspace" + +\d+ testschema.part1 + Table "testschema.part1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | +Partition of: testschema.part FOR VALUES IN (1) +Partition constraint: ((a IS NOT NULL) AND (a = 1)) +Indexes: + "part1_a_idx" btree (a), tablespace "regress_tblspace" + +\d testschema.part_a_idx +Partitioned index "testschema.part_a_idx" + Column | Type | Key? | Definition +--------+---------+------+------------ + a | integer | yes | a +btree, for table "testschema.part" +Number of partitions: 2 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +\d+ testschema.part_a_idx + Partitioned index "testschema.part_a_idx" + Column | Type | Key? | Definition | Storage | Stats target +--------+---------+------+------------+---------+-------------- + a | integer | yes | a | plain | +btree, for table "testschema.part" +Partitions: testschema.part1_a_idx, + testschema.part2_a_idx +Tablespace: "regress_tblspace" + +-- partitioned rels cannot specify the default tablespace. These fail: +CREATE TABLE testschema.dflt (a int PRIMARY KEY) PARTITION BY LIST (a) TABLESPACE pg_default; +ERROR: cannot specify default tablespace for partitioned relations +CREATE TABLE testschema.dflt (a int PRIMARY KEY USING INDEX TABLESPACE pg_default) PARTITION BY LIST (a); +ERROR: cannot specify default tablespace for partitioned relations +SET default_tablespace TO 'pg_default'; +CREATE TABLE testschema.dflt (a int PRIMARY KEY) PARTITION BY LIST (a) TABLESPACE regress_tblspace; +ERROR: cannot specify default tablespace for partitioned relations +CREATE TABLE testschema.dflt (a int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace) PARTITION BY LIST (a); +ERROR: cannot specify default tablespace for partitioned relations +-- but these work: +CREATE TABLE testschema.dflt (a int PRIMARY KEY USING INDEX TABLESPACE regress_tblspace) PARTITION BY LIST (a) TABLESPACE regress_tblspace; +SET default_tablespace TO ''; +CREATE TABLE testschema.dflt2 (a int PRIMARY KEY) PARTITION BY LIST (a); +DROP TABLE testschema.dflt, testschema.dflt2; +-- check that default_tablespace doesn't affect ALTER TABLE index rebuilds +CREATE TABLE testschema.test_default_tab(id bigint) TABLESPACE regress_tblspace; +INSERT INTO testschema.test_default_tab VALUES (1); +CREATE INDEX test_index1 on testschema.test_default_tab (id); +CREATE INDEX test_index2 on testschema.test_default_tab (id) TABLESPACE regress_tblspace; +ALTER TABLE testschema.test_default_tab ADD CONSTRAINT test_index3 PRIMARY KEY (id); +ALTER TABLE testschema.test_default_tab ADD CONSTRAINT test_index4 UNIQUE (id) USING INDEX TABLESPACE regress_tblspace; +\d testschema.test_index1 + Index "testschema.test_index1" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 + Index "testschema.test_index2" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_index3 + Index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab" + +\d testschema.test_index4 + Index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +-- use a custom tablespace for default_tablespace +SET default_tablespace TO regress_tblspace; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +\d testschema.test_index1 + Index "testschema.test_index1" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 + Index "testschema.test_index2" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_index3 + Index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab" + +\d testschema.test_index4 + Index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +SELECT * FROM testschema.test_default_tab; + id +---- + 1 +(1 row) + +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE int; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +\d testschema.test_index1 + Index "testschema.test_index1" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 + Index "testschema.test_index2" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_index3 + Index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab" + +\d testschema.test_index4 + Index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +SELECT * FROM testschema.test_default_tab; + id +---- + 1 +(1 row) + +-- now use the default tablespace for default_tablespace +SET default_tablespace TO ''; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE int; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +\d testschema.test_index1 + Index "testschema.test_index1" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 + Index "testschema.test_index2" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_index3 + Index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab" + +\d testschema.test_index4 + Index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE bigint; +ERROR: cannot alter column with primary key or unique constraint +HINT: DROP the constraint first, and recreate it after the ALTER +\d testschema.test_index1 + Index "testschema.test_index1" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 + Index "testschema.test_index2" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_index3 + Index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab" + +\d testschema.test_index4 + Index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +DROP TABLE testschema.test_default_tab; +-- check that default_tablespace doesn't affect ALTER TABLE index rebuilds +-- (this time with a partitioned table) +CREATE TABLE testschema.test_default_tab_p(id bigint, val bigint) + PARTITION BY LIST (id) TABLESPACE regress_tblspace; +CREATE TABLE testschema.test_default_tab_p1 PARTITION OF testschema.test_default_tab_p + FOR VALUES IN (1); +INSERT INTO testschema.test_default_tab_p VALUES (1); +CREATE INDEX test_index1 on testschema.test_default_tab_p (val); +CREATE INDEX test_index2 on testschema.test_default_tab_p (val) TABLESPACE regress_tblspace; +ALTER TABLE testschema.test_default_tab_p ADD CONSTRAINT test_index3 PRIMARY KEY (id); +ALTER TABLE testschema.test_default_tab_p ADD CONSTRAINT test_index4 UNIQUE (id) USING INDEX TABLESPACE regress_tblspace; +\d testschema.test_index1 +Partitioned index "testschema.test_index1" + Column | Type | Key? | Definition +--------+--------+------+------------ + val | bigint | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index2 +Partitioned index "testschema.test_index2" + Column | Type | Key? | Definition +--------+--------+------+------------ + val | bigint | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +\d testschema.test_index3 +Partitioned index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index4 +Partitioned index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +-- use a custom tablespace for default_tablespace +SET default_tablespace TO regress_tblspace; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab_p ALTER val TYPE bigint; +\d testschema.test_index1 +Partitioned index "testschema.test_index1" + Column | Type | Key? | Definition +--------+--------+------+------------ + val | bigint | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index2 +Partitioned index "testschema.test_index2" + Column | Type | Key? | Definition +--------+--------+------+------------ + val | bigint | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +\d testschema.test_index3 +Partitioned index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index4 +Partitioned index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +SELECT * FROM testschema.test_default_tab_p; + id | val +----+----- + 1 | +(1 row) + +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab_p ALTER val TYPE int; +\d testschema.test_index1 +Partitioned index "testschema.test_index1" + Column | Type | Key? | Definition +--------+---------+------+------------ + val | integer | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index2 +Partitioned index "testschema.test_index2" + Column | Type | Key? | Definition +--------+---------+------+------------ + val | integer | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +\d testschema.test_index3 +Partitioned index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index4 +Partitioned index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +SELECT * FROM testschema.test_default_tab_p; + id | val +----+----- + 1 | +(1 row) + +-- now use the default tablespace for default_tablespace +SET default_tablespace TO ''; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab_p ALTER val TYPE int; +\d testschema.test_index1 +Partitioned index "testschema.test_index1" + Column | Type | Key? | Definition +--------+---------+------+------------ + val | integer | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index2 +Partitioned index "testschema.test_index2" + Column | Type | Key? | Definition +--------+---------+------+------------ + val | integer | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +\d testschema.test_index3 +Partitioned index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index4 +Partitioned index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab_p ALTER val TYPE bigint; +\d testschema.test_index1 +Partitioned index "testschema.test_index1" + Column | Type | Key? | Definition +--------+--------+------+------------ + val | bigint | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index2 +Partitioned index "testschema.test_index2" + Column | Type | Key? | Definition +--------+--------+------+------------ + val | bigint | yes | val +btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +\d testschema.test_index3 +Partitioned index "testschema.test_index3" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +primary key, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) + +\d testschema.test_index4 +Partitioned index "testschema.test_index4" + Column | Type | Key? | Definition +--------+--------+------+------------ + id | bigint | yes | id +unique, btree, for table "testschema.test_default_tab_p" +Number of partitions: 1 (Use \d+ to list them.) +Tablespace: "regress_tblspace" + +DROP TABLE testschema.test_default_tab_p; +-- check that default_tablespace affects index additions in ALTER TABLE +CREATE TABLE testschema.test_tab(id int) TABLESPACE regress_tblspace; +INSERT INTO testschema.test_tab VALUES (1); +SET default_tablespace TO regress_tblspace; +ALTER TABLE testschema.test_tab ADD CONSTRAINT test_tab_unique UNIQUE (id); +SET default_tablespace TO ''; +ALTER TABLE testschema.test_tab ADD CONSTRAINT test_tab_pkey PRIMARY KEY (id); +\d testschema.test_tab_unique + Index "testschema.test_tab_unique" + Column | Type | Key? | Definition +--------+---------+------+------------ + id | integer | yes | id +unique, btree, for table "testschema.test_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_tab_pkey + Index "testschema.test_tab_pkey" + Column | Type | Key? | Definition +--------+---------+------+------------ + id | integer | yes | id +primary key, btree, for table "testschema.test_tab" + +SELECT * FROM testschema.test_tab; + id +---- + 1 +(1 row) + +DROP TABLE testschema.test_tab; +-- check that default_tablespace is handled correctly by multi-command +-- ALTER TABLE that includes a tablespace-preserving rewrite +CREATE TABLE testschema.test_tab(a int, b int, c int); +SET default_tablespace TO regress_tblspace; +ALTER TABLE testschema.test_tab ADD CONSTRAINT test_tab_unique UNIQUE (a); +CREATE INDEX test_tab_a_idx ON testschema.test_tab (a); +SET default_tablespace TO ''; +CREATE INDEX test_tab_b_idx ON testschema.test_tab (b); +\d testschema.test_tab_unique + Index "testschema.test_tab_unique" + Column | Type | Key? | Definition +--------+---------+------+------------ + a | integer | yes | a +unique, btree, for table "testschema.test_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_tab_a_idx + Index "testschema.test_tab_a_idx" + Column | Type | Key? | Definition +--------+---------+------+------------ + a | integer | yes | a +btree, for table "testschema.test_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_tab_b_idx + Index "testschema.test_tab_b_idx" + Column | Type | Key? | Definition +--------+---------+------+------------ + b | integer | yes | b +btree, for table "testschema.test_tab" + +ALTER TABLE testschema.test_tab ALTER b TYPE bigint, ADD UNIQUE (c); +\d testschema.test_tab_unique + Index "testschema.test_tab_unique" + Column | Type | Key? | Definition +--------+---------+------+------------ + a | integer | yes | a +unique, btree, for table "testschema.test_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_tab_a_idx + Index "testschema.test_tab_a_idx" + Column | Type | Key? | Definition +--------+---------+------+------------ + a | integer | yes | a +btree, for table "testschema.test_tab" +Tablespace: "regress_tblspace" + +\d testschema.test_tab_b_idx + Index "testschema.test_tab_b_idx" + Column | Type | Key? | Definition +--------+--------+------+------------ + b | bigint | yes | b +btree, for table "testschema.test_tab" + +DROP TABLE testschema.test_tab; +-- let's try moving a table from one place to another +CREATE TABLE testschema.atable AS VALUES (1), (2); +CREATE UNIQUE INDEX anindex ON testschema.atable(column1); +ALTER TABLE testschema.atable SET TABLESPACE regress_tblspace; +ALTER INDEX testschema.anindex SET TABLESPACE regress_tblspace; +ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_global; +ERROR: only shared relations can be placed in pg_global tablespace +ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_default; +ALTER INDEX testschema.part_a_idx SET TABLESPACE regress_tblspace; +INSERT INTO testschema.atable VALUES(3); -- ok +INSERT INTO testschema.atable VALUES(1); -- fail (checks index) +ERROR: duplicate key value violates unique constraint "anindex" +DETAIL: Key (column1)=(1) already exists. +SELECT COUNT(*) FROM testschema.atable; -- checks heap + count +------- + 3 +(1 row) + +-- Will fail with bad path +CREATE TABLESPACE regress_badspace LOCATION '/no/such/location'; +ERROR: directory "/no/such/location" does not exist +-- No such tablespace +CREATE TABLE bar (i int) TABLESPACE regress_nosuchspace; +ERROR: tablespace "regress_nosuchspace" does not exist +-- Fail, in use for some partitioned object +DROP TABLESPACE regress_tblspace; +ERROR: tablespace "regress_tblspace" cannot be dropped because some objects depend on it +DETAIL: tablespace for index testschema.part_a_idx +ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_default; +-- Fail, not empty +DROP TABLESPACE regress_tblspace; +ERROR: tablespace "regress_tblspace" is not empty +CREATE ROLE regress_tablespace_user1 login; +CREATE ROLE regress_tablespace_user2 login; +GRANT USAGE ON SCHEMA testschema TO regress_tablespace_user2; +ALTER TABLESPACE regress_tblspace OWNER TO regress_tablespace_user1; +CREATE TABLE testschema.tablespace_acl (c int); +-- new owner lacks permission to create this index from scratch +CREATE INDEX k ON testschema.tablespace_acl (c) TABLESPACE regress_tblspace; +ALTER TABLE testschema.tablespace_acl OWNER TO regress_tablespace_user2; +SET SESSION ROLE regress_tablespace_user2; +CREATE TABLE tablespace_table (i int) TABLESPACE regress_tblspace; -- fail +ERROR: permission denied for tablespace regress_tblspace +ALTER TABLE testschema.tablespace_acl ALTER c TYPE bigint; +REINDEX (TABLESPACE regress_tblspace) TABLE tablespace_table; -- fail +ERROR: permission denied for tablespace regress_tblspace +REINDEX (TABLESPACE regress_tblspace, CONCURRENTLY) TABLE tablespace_table; -- fail +ERROR: permission denied for tablespace regress_tblspace +RESET ROLE; +ALTER TABLESPACE regress_tblspace RENAME TO regress_tblspace_renamed; +ALTER TABLE ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; +ALTER INDEX ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; +-- Should show notice that nothing was done +ALTER TABLE ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; +NOTICE: no matching relations in tablespace "regress_tblspace_renamed" found +-- Should succeed +DROP TABLESPACE regress_tblspace_renamed; +DROP SCHEMA testschema CASCADE; +NOTICE: drop cascades to 6 other objects +DETAIL: drop cascades to table testschema.foo +drop cascades to table testschema.asselect +drop cascades to table testschema.asexecute +drop cascades to table testschema.part +drop cascades to table testschema.atable +drop cascades to table testschema.tablespace_acl +DROP ROLE regress_tablespace_user1; +DROP ROLE regress_tablespace_user2; diff --git a/src/test/singlenode_regress/output/uao_dml/GENERATE_ROW_AND_COLUMN_FILES b/src/test/singlenode_regress/output/uao_dml/GENERATE_ROW_AND_COLUMN_FILES new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/singlenode_regress/output/uao_dml/uao_dml_cursor.source b/src/test/singlenode_regress/output/uao_dml/uao_dml_cursor.source new file mode 100644 index 00000000000..5828eda4257 --- /dev/null +++ b/src/test/singlenode_regress/output/uao_dml/uao_dml_cursor.source @@ -0,0 +1,429 @@ +create schema uao_dml_cursor_@amname@; +set search_path=uao_dml_cursor_@amname@; +SET default_table_access_method=@amname@; +-- @Description BINARY CURSOR. +-- +DROP TABLE IF EXISTS sto_uao_emp_forcursor cascade; +CREATE TABLE sto_uao_emp_forcursor ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_forcursor values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_forcursor cascade; +CREATE TABLE sto_uao_dept_forcursor ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(15)); +insert into sto_uao_dept_forcursor values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(4, 'OPERATIONS','SEATTLE'); +BEGIN; +DECLARE + all_emp_upd_rollback BINARY CURSOR FOR SELECT ename, loc FROM sto_uao_emp_forcursor JOIN sto_uao_dept_forcursor + on dept = deptno order by ename ; + FETCH FIRST from all_emp_upd_rollback; + ename | loc +-------+---------- + ADAMS | NEW YORK +(1 row) + + update sto_uao_dept_forcursor set loc = 'NEW YORK CITY' where loc = 'NEW YORK'; + MOVE 5 FROM all_emp_upd_rollback; + FETCH 1 from all_emp_upd_rollback ; + ename | loc +--------+--------- + HOOVER | ATLANTA +(1 row) + + CLOSE all_emp_upd_rollback; +ROLLBACK; +BEGIN; +DECLARE all_dept BINARY CURSOR FOR SELECT dname,loc from sto_uao_dept_forcursor order by 1; +fetch all from all_dept; + dname | loc +------------+---------- + ACCOUNTING | ST LOUIS + OPERATIONS | SEATTLE + RESEARCH | NEW YORK + SALES | ATLANTA +(4 rows) + +close all_dept; +commit; +BEGIN; +DECLARE all_dept_del_rollback BINARY CURSOR FOR SELECT dname,loc from sto_uao_dept_forcursor order by 1; +delete from sto_uao_dept_forcursor where loc = 'NEW YORK'; +fetch all from all_dept_del_rollback; + dname | loc +------------+---------- + ACCOUNTING | ST LOUIS + OPERATIONS | SEATTLE + RESEARCH | NEW YORK + SALES | ATLANTA +(4 rows) + +close all_dept_del_rollback; +ROLLBACK; +BEGIN; +DECLARE all_dept_aft_del BINARY CURSOR FOR SELECT dname,loc from sto_uao_dept_forcursor order by 1; +fetch all from all_dept_aft_del; + dname | loc +------------+---------- + ACCOUNTING | ST LOUIS + OPERATIONS | SEATTLE + RESEARCH | NEW YORK + SALES | ATLANTA +(4 rows) + +close all_dept_aft_del; +commit; +BEGIN; +DECLARE + all_emp_del_commit BINARY CURSOR FOR SELECT ename FROM sto_uao_emp_forcursor order by ename desc ; + FETCH FIRST from all_emp_del_commit; + ename +------------ + WASHINGTON +(1 row) + + delete FROM sto_uao_emp_forcursor where empno > 10; + FETCH 2 from all_emp_del_commit; + ename +------- + TAFT + ROSE +(2 rows) + + MOVE 5 FROM all_emp_del_commit; + FETCH 1 from all_emp_del_commit ; + ename +--------- + JOHNSON +(1 row) + + FETCH NEXT from all_emp_del_commit; + ename +--------- + JACKSON +(1 row) + + FETCH all from all_emp_del_commit; + ename +---------- + HOOVER + HARDING + GRANT + GARFIELD + FILLMORE + CLINT + ADAMS +(7 rows) + + CLOSE all_emp_del_commit; +COMMIT; +BEGIN; +DECLARE + all_emp_aft_del CURSOR FOR SELECT ename FROM sto_uao_emp_forcursor order by ename desc ; + FETCH all from all_emp_aft_del; + ename +---------- + TAFT + POLK + LINCOLN + JOHNSON + JACKSON + HOOVER + HARDING + GRANT + GARFIELD + FILLMORE +(10 rows) + + CLOSE all_emp_aft_del; +COMMIT; +BEGIN; +DECLARE + all_emp_upd_commit BINARY CURSOR FOR SELECT ename, loc FROM sto_uao_emp_forcursor JOIN sto_uao_dept_forcursor + on dept = deptno order by ename ; + FETCH FIRST from all_emp_upd_commit; + ename | loc +----------+---------- + FILLMORE | NEW YORK +(1 row) + + FETCH 2 from all_emp_upd_commit; + ename | loc +----------+---------- + GARFIELD | SEATTLE + GRANT | NEW YORK +(2 rows) + + update sto_uao_dept_forcursor set loc = 'NEW YORK CITY' where loc = 'NEW YORK'; + MOVE 5 FROM all_emp_upd_commit; + FETCH 1 from all_emp_upd_commit ; + ename | loc +-------+--------- + POLK | SEATTLE +(1 row) + + FETCH NEXT from all_emp_upd_commit; + ename | loc +-------+--------- + TAFT | ATLANTA +(1 row) + + FETCH all from all_emp_upd_commit; + ename | loc +-------+----- +(0 rows) + + CLOSE all_emp_upd_commit; +COMMIT; +BEGIN; +DECLARE all_dept2 BINARY CURSOR FOR SELECT dname,loc from sto_uao_dept_forcursor order by 1; +fetch all from all_dept2; + dname | loc +------------+--------------- + ACCOUNTING | ST LOUIS + OPERATIONS | SEATTLE + RESEARCH | NEW YORK CITY + SALES | ATLANTA +(4 rows) + +close all_dept2; +commit; +BEGIN; +DECLARE + all_emp_aft_upd BINARY CURSOR FOR SELECT ename, loc FROM sto_uao_emp_forcursor JOIN sto_uao_dept_forcursor + on dept = deptno order by ename ; + FETCH FIRST from all_emp_aft_upd; + ename | loc +----------+--------------- + FILLMORE | NEW YORK CITY +(1 row) + + FETCH 2 from all_emp_aft_upd; + ename | loc +----------+--------------- + GARFIELD | SEATTLE + GRANT | NEW YORK CITY +(2 rows) + + MOVE 5 FROM all_emp_aft_upd; + FETCH 1 from all_emp_aft_upd ; + ename | loc +-------+--------- + POLK | SEATTLE +(1 row) + + FETCH NEXT from all_emp_aft_upd; + ename | loc +-------+--------- + TAFT | ATLANTA +(1 row) + + FETCH all from all_emp_aft_upd; + ename | loc +-------+----- +(0 rows) + + CLOSE all_emp_aft_upd; +COMMIT; +-- @Description WITH HOLD cursor. +-- +DROP TABLE IF EXISTS sto_uao_emp_forcursor cascade; +CREATE TABLE sto_uao_emp_forcursor ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT) +; +insert into sto_uao_emp_forcursor values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +BEGIN; +DECLARE + all_emp_withhold BINARY CURSOR WITH HOLD FOR SELECT ename FROM sto_uao_emp_forcursor order by ename asc ; + FETCH ABSOLUTE 1 from all_emp_withhold; + ename +------- + ADAMS +(1 row) + + FETCH 3 from all_emp_withhold; + ename +---------- + CLINT + FILLMORE + GARFIELD +(3 rows) + +COMMIT; +-- fetch after commit +ve testcase +FETCH next from all_emp_withhold; + ename +------- + GRANT +(1 row) + +close all_emp_withhold; +BEGIN; +DECLARE + all_emp_withouthold BINARY CURSOR FOR SELECT ename FROM sto_uao_emp_forcursor order by ename asc ; + FETCH ABSOLUTE 1 from all_emp_withouthold; + ename +------- + ADAMS +(1 row) + + FETCH 3 from all_emp_withouthold; + ename +---------- + CLINT + FILLMORE + GARFIELD +(3 rows) + +COMMIT; +-- fetch after commit -ve testcase +FETCH next from all_emp_withouthold; +ERROR: cursor "all_emp_withouthold" does not exist +close all_emp_withouthold; +ERROR: cursor "all_emp_withouthold" does not exist +-- @Description UPDATEABLE BINARY cursor. +-- +DROP TABLE IF EXISTS sto_uao_emp_forcursor cascade; +CREATE TABLE sto_uao_emp_forcursor ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_forcursor values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_forcursor cascade; +CREATE TABLE sto_uao_dept_forcursor ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(15)); +insert into sto_uao_dept_forcursor values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(4, 'OPERATIONS','SEATTLE'); +BEGIN; +DECLARE + all_emp_uao_upd_commit BINARY CURSOR FOR SELECT ename FROM sto_uao_emp_forcursor order by ename ; + FETCH forward 3 from all_emp_uao_upd_commit; + ename +---------- + ADAMS + CLINT + FILLMORE +(3 rows) + + FETCH NEXT in all_emp_uao_upd_commit; + ename +---------- + GARFIELD +(1 row) + + update sto_uao_emp_forcursor set ename = ename || '_NEW' where current of all_emp_uao_upd_commit; +ERROR: "sto_uao_emp_forcursor" is not simply updatable + FETCH NEXT from all_emp_uao_upd_commit; +ERROR: current transaction is aborted, commands ignored until end of transaction block + FETCH all from all_emp_uao_upd_commit; +ERROR: current transaction is aborted, commands ignored until end of transaction block + CLOSE all_emp_uao_upd_commit; +ERROR: current transaction is aborted, commands ignored until end of transaction block +COMMIT; +BEGIN; +DECLARE + all_emp_uao_aft_upd BINARY CURSOR FOR SELECT ename, loc FROM sto_uao_emp_forcursor JOIN sto_uao_dept_forcursor + on dept = deptno order by ename ; + FETCH all from all_emp_uao_aft_upd; + ename | loc +------------+---------- + ADAMS | NEW YORK + CLINT | ST LOUIS + FILLMORE | NEW YORK + GARFIELD | SEATTLE + GRANT | NEW YORK + HARDING | ATLANTA + HOOVER | ATLANTA + JACKSON | SEATTLE + JOHNSON | SEATTLE + LINCOLN | SEATTLE + MONROE | NEW YORK + More | NEW YORK + POLK | SEATTLE + ROOSEVELT | ST LOUIS + ROSE | ATLANTA + TAFT | ATLANTA + WASHINGTON | SEATTLE +(17 rows) + + CLOSE all_emp_uao_aft_upd; +COMMIT; diff --git a/src/test/singlenode_regress/output/uao_dml/uao_dml_select.source b/src/test/singlenode_regress/output/uao_dml/uao_dml_select.source new file mode 100644 index 00000000000..e0ea38ecb81 --- /dev/null +++ b/src/test/singlenode_regress/output/uao_dml/uao_dml_select.source @@ -0,0 +1,1442 @@ +create schema uao_dml_select_@amname@; +set search_path=uao_dml_select_@amname@; +SET default_table_access_method=@amname@; +-- @Description select with aggregate function +-- +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; +BEGIN; +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city_uao (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; +COMMIT; +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; +--query with aggregate functions +select +(select max(city_uao.population) from city_uao ) as WORLD_MAX_POP, +(select avg(city_uao.population) from city_uao) AS WORLD_AVG_POP, + city_uao.name as populationwise_top_five_cities,city_uao.population + from + city_uao order by city_uao.population desc LIMIT 5; + world_max_pop | world_avg_pop | populationwise_top_five_cities | population +---------------+---------------------+--------------------------------+------------ + 10500000 | 350468.223584211817 | Mumbai (Bombay) | 10500000 + 10500000 | 350468.223584211817 | Seoul | 9981619 + 10500000 | 350468.223584211817 | Sao Paulo | 9968485 + 10500000 | 350468.223584211817 | Shanghai | 9696300 + 10500000 | 350468.223584211817 | Jakarta | 9604900 +(5 rows) + +select +(select min(city_uao.population) from city_uao ) as WORLD_MIN_POP, +(select SUM(city_uao.population) from city_uao) AS WORLD_SUM_POP, + city_uao.name as populationwise_top_five_cities,city_uao.population + from + city_uao order by city_uao.population desc LIMIT 5; + world_min_pop | world_sum_pop | populationwise_top_five_cities | population +---------------+---------------+--------------------------------+------------ + 42 | 1429559884 | Mumbai (Bombay) | 10500000 + 42 | 1429559884 | Seoul | 9981619 + 42 | 1429559884 | Sao Paulo | 9968485 + 42 | 1429559884 | Shanghai | 9696300 + 42 | 1429559884 | Jakarta | 9604900 +(5 rows) + +-- @Description select with between +-- +-- Reuse the country_uao table from previous test. +-- Using the BETWEEN clause +--query +select * +from +country_uao +where indepyear between 1800 and 1900 +and lifeexpectancy between 70 and 80 +and gnp between 80000 and 100000; + code | name | continent | region | surfacearea | indepyear | population | lifeexpectancy | gnp | gnpold | localname | governmentform | headofstate | capital | code2 +------+-----------+---------------+---------------+-------------+-----------+------------+----------------+----------+----------+-----------+------------------+-------------------+---------+------- + VEN | Venezuela | South America | South America | 912050 | 1811 | 24170000 | 73.1 | 95023.00 | 88434.00 | Venezuela | Federal Republic | Hugo Chavez Frias | 3539 | VE +(1 row) + +-- @Description select with CASE WHEN.. ELSE +-- +DROP TABLE IF EXISTS sto_uao_emp_limit_offset; +CREATE TABLE sto_uao_emp_limit_offset ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_limit_offset values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +select ename , hiredate, +CASE when hiredate < '01-01-1991' then 'Founders' +when hiredate < '01-01-1996' then 'old timer' +else 'new employee' +end as tag +from sto_uao_emp_limit_offset order by 1; + ename | hiredate | tag +------------+------------+-------------- + ADAMS | 03-15-1996 | new employee + CLINT | 10-12-2001 | new employee + FILLMORE | 08-09-1994 | old timer + GARFIELD | 05-01-1993 | old timer + GRANT | 03-30-1997 | new employee + HARDING | 02-02-1998 | new employee + HOOVER | 04-02-1990 | Founders + JACKSON | 01-01-1990 | Founders + JOHNSON | 12-17-1990 | Founders + LINCOLN | 06-23-1994 | old timer + MONROE | 12-03-2000 | new employee + More | 10-12-1994 | old timer + POLK | 09-22-1997 | new employee + ROOSEVELT | 10-12-1995 | old timer + ROSE | 10-12-1999 | new employee + TAFT | 01-02-1996 | new employee + WASHINGTON | 04-16-1998 | new employee +(17 rows) + +-- @Description select inner/right join +-- +DROP TABLE IF EXISTS sto_uao_emp_crossjoin cascade; +CREATE TABLE sto_uao_emp_crossjoin ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_crossjoin values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_crossjoin cascade; +CREATE TABLE sto_uao_dept_crossjoin ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); +insert into sto_uao_dept_crossjoin values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(5,'LOGISTICS','BOSTON') +,(4, 'OPERATIONS','SEATTLE'); +select ename,loc from sto_uao_emp_crossjoin cross join sto_uao_dept_crossjoin +order by 1 asc, 2 asc LIMIT 10; + ename | loc +-------+---------- + ADAMS | ATLANTA + ADAMS | BOSTON + ADAMS | NEW YORK + ADAMS | SEATTLE + ADAMS | ST LOUIS + CLINT | ATLANTA + CLINT | BOSTON + CLINT | NEW YORK + CLINT | SEATTLE + CLINT | ST LOUIS +(10 rows) + +-- @Description select distinct +-- +DROP TABLE IF EXISTS sto_uao_emp_seldistinct cascade; +CREATE TABLE sto_uao_emp_seldistinct ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_seldistinct values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +SELECT distinct(dept) FROM sto_uao_emp_seldistinct order by dept; + dept +------ + 1 + 2 + 3 + 4 + 7 +(5 rows) + +-- @description : Create Data and execute select statements on UAO tables EXCEPT +-- +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; +BEGIN; +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city_uao (id, name, countrycode, district, population) FROM stdin; +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM stdin WITH NULL AS ''; +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM stdin; +COMMIT; +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; +-- Using EXCEPT clause +select * from city_uao where population > 770000 +UNION +select * from city_uao where population < 100000 +EXCEPT +select * from city_uao where countrycode in ('MEX','USA'); + id | name | countrycode | district | population +------+---------------------+-------------+------------------+------------ + 925 | Quetzaltenango | GTM | Quetzaltenango | 90801 + 191 | Hamilton | BMU | Hamilton | 1200 + 922 | Ciudad de Guatemala | GTM | Guatemala | 823301 + 2426 | Ciego de Avila | CUB | Ciego de Avila | 98505 + 1855 | Delta | CAN | British Colombia | 95411 + 1856 | Sudbury | CAN | Ontario | 92686 + 1858 | Barrie | CAN | Ontario | 89269 + 1810 | Montreal | CAN | Quebec | 1016376 + 190 | Saint George | BMU | Saint Georges | 1800 + 184 | Belize City | BLZ | Belize City | 55810 + 1857 | Kelowna | CAN | British Colombia | 89442 + 2413 | La Habana | CUB | La Habana | 2256000 + 185 | Belmopan | BLZ | Cayo | 7105 +(13 rows) + +-- @description : Create Data and execute select statements on UAO tables GROUP BY +-- +DROP TABLE IF EXISTS sto_uao_emp_groupby; +NOTICE: table "sto_uao_emp_groupby" does not exist, skipping +CREATE TABLE sto_uao_emp_groupby ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_groupby values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_groupby; +NOTICE: table "sto_uao_dept_groupby" does not exist, skipping +CREATE TABLE sto_uao_dept_groupby ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); +insert into sto_uao_dept_groupby values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(4, 'OPERATIONS','SEATTLE'); +-- Simple Group by +select count(*) as num_of_emp, loc from sto_uao_dept_groupby, sto_uao_emp_groupby where sto_uao_dept_groupby.deptno = sto_uao_emp_groupby.dept group by loc order by 1 asc; + num_of_emp | loc +------------+---------- + 2 | ST LOUIS + 4 | ATLANTA + 5 | NEW YORK + 6 | SEATTLE +(4 rows) + +select loc ,job, sum(sal) as sum_of_salary, count(*) as num_emp from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +group by loc,job order by loc,job; + loc | job | sum_of_salary | num_emp +----------+----------+---------------+--------- + ATLANTA | MANAGER | 52000.00 | 1 + ATLANTA | SALES I | 70000.00 | 3 + NEW YORK | ENGINEER | 121000.00 | 4 + NEW YORK | MANAGER | 56000.00 | 1 + SEATTLE | ADMIN | 36000.00 | 2 + SEATTLE | CEO | 75000.00 | 1 + SEATTLE | MANAGER | 54000.00 | 1 + SEATTLE | TECH | 47500.00 | 2 + ST LOUIS | CPA | 59000.00 | 2 +(9 rows) + +-- Rollup +select loc ,job,comm,sum(sal), count(*) as cnt from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +and loc in ('NEW YORK', 'ATLANTA') +group by rollup (loc,job,comm) order by loc,job,comm; + loc | job | comm | sum | cnt +----------+----------+-------+-----------+----- + ATLANTA | MANAGER | 15.00 | 52000.00 | 1 + ATLANTA | MANAGER | | 52000.00 | 1 + ATLANTA | SALES I | 15.00 | 45000.00 | 2 + ATLANTA | SALES I | 20.00 | 25000.00 | 1 + ATLANTA | SALES I | | 70000.00 | 3 + ATLANTA | | | 122000.00 | 4 + NEW YORK | ENGINEER | 20.00 | 121000.00 | 4 + NEW YORK | ENGINEER | | 121000.00 | 4 + NEW YORK | MANAGER | 20.00 | 56000.00 | 1 + NEW YORK | MANAGER | | 56000.00 | 1 + NEW YORK | | | 177000.00 | 5 + | | | 299000.00 | 9 +(12 rows) + +-- Cube +select loc ,job,comm,sum(sal), count(*) as cnt from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +and loc != 'SEATTLE' +group by cube (loc,job,comm) order by loc,job,comm; + loc | job | comm | sum | cnt +----------+----------+-------+-----------+----- + ATLANTA | MANAGER | 15.00 | 52000.00 | 1 + ATLANTA | MANAGER | | 52000.00 | 1 + ATLANTA | SALES I | 15.00 | 45000.00 | 2 + ATLANTA | SALES I | 20.00 | 25000.00 | 1 + ATLANTA | SALES I | | 70000.00 | 3 + ATLANTA | | 15.00 | 97000.00 | 3 + ATLANTA | | 20.00 | 25000.00 | 1 + ATLANTA | | | 122000.00 | 4 + NEW YORK | ENGINEER | 20.00 | 121000.00 | 4 + NEW YORK | ENGINEER | | 121000.00 | 4 + NEW YORK | MANAGER | 20.00 | 56000.00 | 1 + NEW YORK | MANAGER | | 56000.00 | 1 + NEW YORK | | 20.00 | 177000.00 | 5 + NEW YORK | | | 177000.00 | 5 + ST LOUIS | CPA | 30.00 | 59000.00 | 2 + ST LOUIS | CPA | | 59000.00 | 2 + ST LOUIS | | 30.00 | 59000.00 | 2 + ST LOUIS | | | 59000.00 | 2 + | CPA | 30.00 | 59000.00 | 2 + | CPA | | 59000.00 | 2 + | ENGINEER | 20.00 | 121000.00 | 4 + | ENGINEER | | 121000.00 | 4 + | MANAGER | 15.00 | 52000.00 | 1 + | MANAGER | 20.00 | 56000.00 | 1 + | MANAGER | | 108000.00 | 2 + | SALES I | 15.00 | 45000.00 | 2 + | SALES I | 20.00 | 25000.00 | 1 + | SALES I | | 70000.00 | 3 + | | 15.00 | 97000.00 | 3 + | | 20.00 | 202000.00 | 6 + | | 30.00 | 59000.00 | 2 + | | | 358000.00 | 11 +(32 rows) + +-- grouping sets +select loc ,job,comm,sum(sal) as sum from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +group by grouping sets ((loc,job), (loc,comm)) +order by loc,job,comm; + loc | job | comm | sum +----------+----------+-------+----------- + ATLANTA | MANAGER | | 52000.00 + ATLANTA | SALES I | | 70000.00 + ATLANTA | | 15.00 | 97000.00 + ATLANTA | | 20.00 | 25000.00 + NEW YORK | ENGINEER | | 121000.00 + NEW YORK | MANAGER | | 56000.00 + NEW YORK | | 20.00 | 177000.00 + SEATTLE | ADMIN | | 36000.00 + SEATTLE | CEO | | 75000.00 + SEATTLE | MANAGER | | 54000.00 + SEATTLE | TECH | | 47500.00 + SEATTLE | | 10.00 | 18000.00 + SEATTLE | | 15.00 | 65500.00 + SEATTLE | | 20.00 | 54000.00 + SEATTLE | | 30.00 | 75000.00 + ST LOUIS | CPA | | 59000.00 + ST LOUIS | | 30.00 | 59000.00 +(17 rows) + +-- grouping set , rollup +select loc ,job, sum(sal) from sto_uao_emp_groupby,sto_uao_dept_groupby where sto_uao_emp_groupby.dept=sto_uao_dept_groupby.deptno +group by grouping sets (loc, rollup (loc,job) ) +order by loc,job ; + loc | job | sum +----------+----------+----------- + ATLANTA | MANAGER | 52000.00 + ATLANTA | SALES I | 70000.00 + ATLANTA | | 122000.00 + ATLANTA | | 122000.00 + NEW YORK | ENGINEER | 121000.00 + NEW YORK | MANAGER | 56000.00 + NEW YORK | | 177000.00 + NEW YORK | | 177000.00 + SEATTLE | ADMIN | 36000.00 + SEATTLE | CEO | 75000.00 + SEATTLE | MANAGER | 54000.00 + SEATTLE | TECH | 47500.00 + SEATTLE | | 212500.00 + SEATTLE | | 212500.00 + ST LOUIS | CPA | 59000.00 + ST LOUIS | | 59000.00 + ST LOUIS | | 59000.00 + | | 570500.00 +(18 rows) + +-- @description : Create Data and execute select statements on UAO tables HAVING +-- +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; +BEGIN; +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city_uao (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; +COMMIT; +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; +--queries with HAVING clause +with notdiversecountries_uao as +(select country_uao.code,country_uao.name,country_uao.capital,d.CNT + from country_uao, + (select countrylanguage_uao.countrycode,count(*) as CNT from countrylanguage_uao group by countrycode + HAVING count(*) < 3) d + where d.countrycode = country_uao.code and country_uao.gnp > 100000) +select country_uao.name COUNTRY,city_uao.name CAPITAL,count(*) LANGCNT from +country_uao,city_uao,countrylanguage_uao +where country_uao.code = countrylanguage_uao.countrycode and country_uao.capital = city_uao.id +group by country_uao.name,city_uao.name +HAVING count(*) NOT IN (select CNT from notdiversecountries_uao where notdiversecountries_uao.name = country_uao.name) +order by country_uao.name +LIMIT 10; + country | capital | langcnt +---------------------+------------------+--------- + Afghanistan | Kabul | 5 + Albania | Tirana | 3 + Algeria | Alger | 2 + American Samoa | Fagatogo | 3 + Andorra | Andorra la Vella | 4 + Angola | Luanda | 9 + Anguilla | The Valley | 1 + Antigua and Barbuda | Saint Johns | 2 + Argentina | Buenos Aires | 3 + Armenia | Yerevan | 2 +(10 rows) + +-- @Description select inner/right join +-- +DROP TABLE IF EXISTS sto_uao_emp_rightjoin cascade; +CREATE TABLE sto_uao_emp_rightjoin ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_rightjoin values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_rightjoin cascade; +CREATE TABLE sto_uao_dept_rightjoin ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); +insert into sto_uao_dept_rightjoin values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(5,'LOGISTICS','BOSTON') +,(4, 'OPERATIONS','SEATTLE'); +select ename, loc from sto_uao_emp_rightjoin left inner join sto_uao_dept_rightjoin on sto_uao_dept_rightjoin.deptno = sto_uao_emp_rightjoin.dept order by 1 asc, 2 asc; +ERROR: syntax error at or near "inner" +LINE 1: select ename, loc from sto_uao_emp_rightjoin left inner join... + ^ +-- @description : Create Data and execute select statements on UAO tables INTERSECT +-- +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; +BEGIN; +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city_uao (id, name, countrycode, district, population) FROM stdin; +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM stdin WITH NULL AS ''; +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM stdin; +COMMIT; +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; +-- Using EXCEPT clause +select population from city_uao where countrycode = 'CAN' +INTERSECT +select population from city_uao where countrycode = 'MEX'; + population +------------ + 92686 +(1 row) + +-- @description : Create Data and execute select statements on UAO tables LIMIT OFFSET +-- +DROP TABLE IF EXISTS sto_uao_emp_limit_offset; +CREATE TABLE sto_uao_emp_limit_offset ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_limit_offset values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +select * from sto_uao_emp_limit_offset order by empno LIMIT 7 ; + empno | ename | job | mgr | hiredate | sal | comm | dept +-------+----------+---------+-----+------------+----------+-------+------ + 1 | JOHNSON | ADMIN | 6 | 12-17-1990 | 18000.00 | 10.00 | 4 + 2 | HARDING | MANAGER | 9 | 02-02-1998 | 52000.00 | 15.00 | 3 + 3 | TAFT | SALES I | 2 | 01-02-1996 | 25000.00 | 20.00 | 3 + 4 | HOOVER | SALES I | 2 | 04-02-1990 | 27000.00 | 15.00 | 3 + 5 | LINCOLN | TECH | 6 | 06-23-1994 | 22500.00 | 15.00 | 4 + 6 | GARFIELD | MANAGER | 9 | 05-01-1993 | 54000.00 | 20.00 | 4 + 7 | POLK | TECH | 6 | 09-22-1997 | 25000.00 | 15.00 | 4 +(7 rows) + +select * from sto_uao_emp_limit_offset order by empno LIMIT 7 OFFSET 5; + empno | ename | job | mgr | hiredate | sal | comm | dept +-------+------------+----------+-----+------------+----------+-------+------ + 6 | GARFIELD | MANAGER | 9 | 05-01-1993 | 54000.00 | 20.00 | 4 + 7 | POLK | TECH | 6 | 09-22-1997 | 25000.00 | 15.00 | 4 + 8 | GRANT | ENGINEER | 10 | 03-30-1997 | 32000.00 | 20.00 | 2 + 9 | JACKSON | CEO | | 01-01-1990 | 75000.00 | 30.00 | 4 + 10 | FILLMORE | MANAGER | 9 | 08-09-1994 | 56000.00 | 20.00 | 2 + 11 | ADAMS | ENGINEER | 10 | 03-15-1996 | 34000.00 | 20.00 | 2 + 12 | WASHINGTON | ADMIN | 6 | 04-16-1998 | 18000.00 | 15.00 | 4 +(7 rows) + +-- @description : Create Data and execute select statements on UAO tables ORDER BY ASC DESC USING +-- +-- +DROP TABLE IF EXISTS city_uao_using cascade; +DROP TABLE IF EXISTS country_uao_using cascade; +DROP TABLE IF EXISTS countrylanguage_uao_using cascade; +BEGIN; +CREATE TABLE city_uao_using ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); +CREATE TABLE country_uao_using ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage_uao_using ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city_uao_using (id, name, countrycode, district, population) FROM stdin; +COPY country_uao_using (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao_using (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; +COMMIT; +ANALYZE city_uao_using; +ANALYZE country_uao_using; +ANALYZE countrylanguage_uao_using; +--query1 +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code asc,countrylanguage_uao_using.language asc LIMIT 10; + code | language +------+------------ + AFG | Dari + AFG | Pashto + AIA | English + ALB | Albaniana + AND | Catalan + ANT | Dutch + ANT | Papiamento + ARE | Arabic + ARG | Spanish + ASM | English +(10 rows) + +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code desc, 2 desc LIMIT 10; + code | language +------+------------ + NLD | Dutch + DZA | Arabic + ATG | English + ASM | Samoan + ASM | English + ARG | Spanish + ARE | Arabic + ANT | Papiamento + ANT | Dutch + AND | Catalan +(10 rows) + +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code asc,countrylanguage_uao_using.language desc LIMIT 10; + code | language +------+------------ + AFG | Pashto + AFG | Dari + AIA | English + ALB | Albaniana + AND | Catalan + ANT | Papiamento + ANT | Dutch + ARE | Arabic + ARG | Spanish + ASM | Samoan +(10 rows) + +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code using > , 2 using > LIMIT 10; + code | language +------+------------ + NLD | Dutch + DZA | Arabic + ATG | English + ASM | Samoan + ASM | English + ARG | Spanish + ARE | Arabic + ANT | Papiamento + ANT | Dutch + AND | Catalan +(10 rows) + +with capitals_uao as +(select country_uao_using.code,id,city_uao_using.name from city_uao_using,country_uao_using + where city_uao_using.countrycode = country_uao_using.code AND city_uao_using.id = country_uao_using.capital) +select capitals_uao.code,language from +capitals_uao,countrylanguage_uao_using +where capitals_uao.code = countrylanguage_uao_using.countrycode and isofficial='true' +order by capitals_uao.code USING < , 2 using < LIMIT 10; + code | language +------+------------ + AFG | Dari + AFG | Pashto + AIA | English + ALB | Albaniana + AND | Catalan + ANT | Dutch + ANT | Papiamento + ARE | Arabic + ARG | Spanish + ASM | English +(10 rows) + +-- @Description select outer/left join +-- +DROP TABLE IF EXISTS sto_uao_emp_leftjoin cascade; +CREATE TABLE sto_uao_emp_leftjoin ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_leftjoin values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_leftjoin cascade; +CREATE TABLE sto_uao_dept_leftjoin ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); +insert into sto_uao_dept_leftjoin values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(5,'LOGISTICS','BOSTON') +,(4, 'OPERATIONS','SEATTLE'); +select ename, loc from sto_uao_emp_leftjoin left join sto_uao_dept_leftjoin on sto_uao_dept_leftjoin.deptno = sto_uao_emp_leftjoin.dept order by 1 asc, 2 asc; + ename | loc +------------+---------- + ADAMS | NEW YORK + CLINT | ST LOUIS + FILLMORE | NEW YORK + GARFIELD | SEATTLE + GRANT | NEW YORK + HARDING | ATLANTA + HOOVER | ATLANTA + JACKSON | SEATTLE + JOHNSON | SEATTLE + LINCOLN | SEATTLE + MONROE | + More | NEW YORK + POLK | SEATTLE + ROOSEVELT | ST LOUIS + ROSE | ATLANTA + TAFT | ATLANTA + WASHINGTON | SEATTLE +(17 rows) + +-- @Description select with subquery +-- +DROP TABLE IF EXISTS country_uao_subq cascade; +BEGIN; +CREATE TABLE country_uao_subq ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +COPY country_uao_subq (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COMMIT; +ANALYZE country_uao_subq; +-- Using subquery +select * +from +country_uao_subq +where code in (select code from country_uao_subq where gnp between 80000 and 100000) +and code in (select code from country_uao_subq where lifeexpectancy between 70 and 80) +and code in (select code from country_uao_subq where indepyear between 1800 and 1900); + code | name | continent | region | surfacearea | indepyear | population | lifeexpectancy | gnp | gnpold | localname | governmentform | headofstate | capital | code2 +------+-----------+---------------+---------------+-------------+-----------+------------+----------------+----------+----------+-----------+------------------+-------------------+---------+------- + VEN | Venezuela | South America | South America | 912050 | 1811 | 24170000 | 73.1 | 95023.00 | 88434.00 | Venezuela | Federal Republic | Hugo Chavez Frias | 3539 | VE +(1 row) + +-- @Description select with with UNION , UNION ALL +-- +DROP TABLE IF EXISTS city_uao_union cascade; +DROP TABLE IF EXISTS country_uao_union cascade; +DROP TABLE IF EXISTS countrylanguage_uao_union cascade; +BEGIN; +CREATE TABLE city_uao_union ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); +CREATE TABLE country_uao_union ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage_uao_union ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city_uao_union (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; +COPY country_uao_union (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao_union (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; +COMMIT; +ANALYZE city_uao_union; +ANALYZE country_uao_union; +ANALYZE countrylanguage_uao_union; +--queries Using Union All and except +with somecheapasiandiversecountries_uao as +( + select FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,count(*) ASIAN_COUNT from + ( + select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate + from country_uao_union,city_uao_union + where country_uao_union.capital = city_uao_union.id + and country_uao_union.gnp < 10000 + and country_uao_union.region = 'Southeast Asia' + and country_uao_union.continent = 'Asia' + + UNION ALL + select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate + from country_uao_union,city_uao_union + where country_uao_union.capital = city_uao_union.id + and country_uao_union.gnp < 10000 + and country_uao_union.region = 'Eastern Asia' + and country_uao_union.continent = 'Asia' + UNION ALL + select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate + from country_uao_union,city_uao_union + where country_uao_union.capital = city_uao_union.id + and country_uao_union.gnp < 10000 + and country_uao_union.region = 'Middle East' + and country_uao_union.continent = 'Asia' + ) FOO_uao, countrylanguage_uao_union + where FOO_uao.code = countrylanguage_uao_union.countrycode + group by FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,countrylanguage_uao_union.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country_uao_union.code from countrylanguage_uao_union,country_uao_union + where countrylanguage_uao_union.countrycode=country_uao_union.code + and country_uao_union.continent = 'Asia' + and country_uao_union.region = 'Southern and Central Asia' + group by country_uao_union.code + ) FOO1_uao + ) +) +select FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,count(*) compared_with_cheap_asian_cnt +from +( +select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate +from country_uao_union,city_uao_union +where country_uao_union.capital = city_uao_union.id +and country_uao_union.continent = 'North America' +UNION ALL +select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate +from country_uao_union,city_uao_union +where country_uao_union.capital = city_uao_union.id +and country_uao_union.continent = 'South America' +EXCEPT +select country_uao_union.code,country_uao_union.name COUNTRY,city_uao_union.name CAPITAL,country_uao_union.headofstate +from country_uao_union,city_uao_union +where +country_uao_union.capital = city_uao_union.id +and country_uao_union.code='GTM' +) FOO_uao,countrylanguage_uao_union +where FOO_uao.code = countrylanguage_uao_union.countrycode +group by FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries_uao,country_uao_union + where somecheapasiandiversecountries_uao.code = country_uao_union.code + and country_uao_union.gnp >= country_uao_union.gnpold + ) ASIANCOUNT + ) +order by compared_with_cheap_asian_cnt desc, 1 asc +LIMIT 10; + code | country | capital | headofstate | compared_with_cheap_asian_cnt +------+---------------+-------------------+--------------------------------+------------------------------- + CAN | Canada | Ottawa | Elisabeth II | 12 + USA | United States | Washington | George W. Bush | 12 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + ABW | Aruba | Oranjestad | Beatrix | 4 + BLZ | Belize | Belmopan | Elisabeth II | 4 + BOL | Bolivia | La Paz | Hugo Banzer Suarez | 4 + CHL | Chile | Santiago de Chile | Ricardo Lagos Escobar | 4 +(10 rows) + +-- @Description PostgreSQL port of the MySQL "World" database. +-- +-- The sample data used in the world database is Copyright Statistics +-- Finland, http://www.stat.fi/worldinfigures. +-- +-- Modified to use it with GPDB +DROP TABLE IF EXISTS city_uao cascade; +DROP TABLE IF EXISTS country_uao cascade; +DROP TABLE IF EXISTS countrylanguage_uao cascade; +BEGIN; +CREATE TABLE city_uao ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); +CREATE TABLE country_uao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage_uao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city_uao (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; +COPY country_uao (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; +COMMIT; +ANALYZE city_uao; +ANALYZE country_uao; +ANALYZE countrylanguage_uao; +-- queries with one CTE that is referenced once +-- Using CTE in the FROM clause +--queries Using a CTE in the HAVING clause and Union All +with somecheapasiandiversecountries_uao as +( + select FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,count(*) ASIAN_COUNT from + ( + select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate + from country_uao,city_uao + where country_uao.capital = city_uao.id + and country_uao.gnp < 10000 + and country_uao.region = 'Southeast Asia' + and country_uao.continent = 'Asia' + UNION ALL + select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate + from country_uao,city_uao + where country_uao.capital = city_uao.id + and country_uao.gnp < 10000 + and country_uao.region = 'Eastern Asia' + and country_uao.continent = 'Asia' + UNION ALL + select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate + from country_uao,city_uao + where country_uao.capital = city_uao.id + and country_uao.gnp < 10000 + and country_uao.region = 'Middle East' + and country_uao.continent = 'Asia' + ) FOO_uao, countrylanguage_uao + where FOO_uao.code = countrylanguage_uao.countrycode + group by FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,countrylanguage_uao.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country_uao.code from countrylanguage_uao,country_uao + where countrylanguage_uao.countrycode=country_uao.code + and country_uao.continent = 'Asia' + and country_uao.region = 'Southern and Central Asia' + group by country_uao.code + ) FOO1_uao + ) +) +select FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate,count(*) compared_with_cheap_asian_cnt +from +( +select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate +from country_uao,city_uao +where country_uao.capital = city_uao.id +and country_uao.continent = 'North America' +UNION ALL +select country_uao.code,country_uao.name COUNTRY,city_uao.name CAPITAL,country_uao.headofstate +from country_uao,city_uao +where country_uao.capital = city_uao.id +and country_uao.continent = 'South America' +) FOO_uao,countrylanguage_uao +where FOO_uao.code = countrylanguage_uao.countrycode +group by FOO_uao.code,FOO_uao.COUNTRY,FOO_uao.CAPITAL,FOO_uao.headofstate +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries_uao,country_uao + where somecheapasiandiversecountries_uao.code = country_uao.code + and country_uao.gnp >= country_uao.gnpold + ) ASIANCOUNT + ) +order by compared_with_cheap_asian_cnt desc , 1 desc +LIMIT 10; + code | country | capital | headofstate | compared_with_cheap_asian_cnt +------+---------------+---------------------+--------------------------------+------------------------------- + USA | United States | Washington | George W. Bush | 12 + CAN | Canada | Ottawa | Elisabeth II | 12 + PAN | Panama | Ciudad de Panama | Mireya Elisa Moscoso Rodriguez | 6 + MEX | Mexico | Ciudad de Mexico | Vicente Fox Quesada | 6 + GTM | Guatemala | Ciudad de Guatemala | Alfonso Portillo Cabrera | 5 + COL | Colombia | Santafe de Bogota | Andres Pastrana Arango | 5 + BRA | Brazil | Brasilia | Fernando Henrique Cardoso | 5 + PRY | Paraguay | Asuncion | Luis Angel Gonzalez Macchi | 4 + NIC | Nicaragua | Managua | Arnoldo Aleman Lacayo | 4 + HND | Honduras | Tegucigalpa | Carlos Roberto Flores Facusse | 4 +(10 rows) + +-- @description : Create view and execute select from view +-- +DROP TABLE IF EXISTS sto_uao_emp_forview cascade; +CREATE TABLE sto_uao_emp_forview ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_forview values + (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,2) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_forview cascade; +CREATE TABLE sto_uao_dept_forview ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); +insert into sto_uao_dept_forview values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(4, 'OPERATIONS','SEATTLE'); +-- Create view +create or replace view sto_uao_emp_view as +select empno,ename,job,mgr,hiredate,sal,comm,dname,loc from sto_uao_dept_forview, sto_uao_emp_forview where sto_uao_dept_forview.deptno = sto_uao_emp_forview.dept; +select * from sto_uao_emp_view where mgr is not NULL order by 1; + empno | ename | job | mgr | hiredate | sal | comm | dname | loc +-------+------------+----------+-----+------------+----------+-------+------------+---------- + 1 | JOHNSON | ADMIN | 6 | 12-17-1990 | 18000.00 | 10.00 | OPERATIONS | SEATTLE + 2 | HARDING | MANAGER | 9 | 02-02-1998 | 52000.00 | 15.00 | SALES | ATLANTA + 3 | TAFT | SALES I | 2 | 01-02-1996 | 25000.00 | 20.00 | SALES | ATLANTA + 4 | HOOVER | SALES I | 2 | 04-02-1990 | 27000.00 | 15.00 | SALES | ATLANTA + 5 | LINCOLN | TECH | 6 | 06-23-1994 | 22500.00 | 15.00 | OPERATIONS | SEATTLE + 6 | GARFIELD | MANAGER | 9 | 05-01-1993 | 54000.00 | 20.00 | OPERATIONS | SEATTLE + 7 | POLK | TECH | 6 | 09-22-1997 | 25000.00 | 15.00 | OPERATIONS | SEATTLE + 8 | GRANT | ENGINEER | 10 | 03-30-1997 | 32000.00 | 20.00 | RESEARCH | NEW YORK + 10 | FILLMORE | MANAGER | 9 | 08-09-1994 | 56000.00 | 20.00 | RESEARCH | NEW YORK + 11 | ADAMS | ENGINEER | 10 | 03-15-1996 | 34000.00 | 20.00 | RESEARCH | NEW YORK + 12 | WASHINGTON | ADMIN | 6 | 04-16-1998 | 18000.00 | 15.00 | OPERATIONS | SEATTLE + 13 | MONROE | ENGINEER | 10 | 12-03-2000 | 30000.00 | 20.00 | RESEARCH | NEW YORK + 14 | ROOSEVELT | CPA | 9 | 10-12-1995 | 35000.00 | 30.00 | ACCOUNTING | ST LOUIS + 15 | More | ENGINEER | 9 | 10-12-1994 | 25000.00 | 20.00 | RESEARCH | NEW YORK + 16 | ROSE | SALES I | 10 | 10-12-1999 | 18000.00 | 15.00 | SALES | ATLANTA + 17 | CLINT | CPA | 2 | 10-12-2001 | 24000.00 | 30.00 | ACCOUNTING | ST LOUIS +(16 rows) + +-- @Description select with where clause +-- +DROP TABLE IF EXISTS city_uao_where cascade; +DROP TABLE IF EXISTS country_uao_where cascade; +DROP TABLE IF EXISTS countrylanguage_uao_where cascade; +BEGIN; +CREATE TABLE city_uao_where ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +); +CREATE TABLE country_uao_where ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea real NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); +CREATE TABLE countrylanguage_uao_where ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); +COPY city_uao_where (id, name, countrycode, district, population) FROM '@abs_srcdir@/data/city.data'; +COPY country_uao_where (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM '@abs_srcdir@/data/country.data' WITH NULL AS ''; +COPY countrylanguage_uao_where (countrycode, "language", isofficial, percentage) FROM '@abs_srcdir@/data/countrylanguage.data'; +COMMIT; +ANALYZE city_uao_where; +ANALYZE country_uao_where; +ANALYZE countrylanguage_uao_where; +-- Using WHERE clause +with lang_total_uao as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country_uao_where.code,countrylanguage_uao_where.countrycode + from country_uao_where join countrylanguage_uao_where on (country_uao_where.code=countrylanguage_uao_where.countrycode and governmentform='Federal Republic') + group by country_uao_where.code,countrylanguage_uao_where.countrycode order by country_uao_where.code) + + UNION ALL + + ( + select count(*) as lang_count,country_uao_where.code,countrylanguage_uao_where.countrycode + from country_uao_where join countrylanguage_uao_where on (country_uao_where.code=countrylanguage_uao_where.countrycode and governmentform='Monarchy') + group by country_uao_where.code,countrylanguage_uao_where.countrycode order by country_uao_where.code) + + ) FOO1_uao +) +select * from +( +select count(*) as cnt,country_uao_where.code,country_uao_where.name +from +country_uao_where,countrylanguage_uao_where +where country_uao_where.code=countrylanguage_uao_where.countrycode group by country_uao_where.code,country_uao_where.name) AS FOO_uao +where foo_uao.cnt = (select max(lang_count) from lang_total_uao) order by foo_uao.code; + cnt | code | name +-----+------+-------------------- + 12 | CAN | Canada + 12 | CHN | China + 12 | IND | India + 12 | RUS | Russian Federation + 12 | USA | United States +(5 rows) + +-- @Description select wildcard +-- +DROP TABLE IF EXISTS sto_uao_emp_wildcard cascade; +CREATE TABLE sto_uao_emp_wildcard ( + empno INT , + ename VARCHAR(10), + job VARCHAR(9), + mgr INT NULL, + hiredate DATE, + sal NUMERIC(7,2), + comm NUMERIC(7,2) NULL, + dept INT); +insert into sto_uao_emp_wildcard values +(1,'JOHNSON','ADMIN',6,'12-17-1990',18000,10,4) +,(2,'HARDING','MANAGER',9,'02-02-1998',52000,15,3) +,(3,'TAFT','SALES I',2,'01-02-1996',25000,20,3) +,(4,'HOOVER','SALES I',2,'04-02-1990',27000,15,3) +,(5,'LINCOLN','TECH',6,'06-23-1994',22500,15,4) +,(6,'GARFIELD','MANAGER',9,'05-01-1993',54000,20,4) +,(7,'POLK','TECH',6,'09-22-1997',25000,15,4) +,(8,'GRANT','ENGINEER',10,'03-30-1997',32000,20,2) +,(9,'JACKSON','CEO',NULL,'01-01-1990',75000,30,4) +,(10,'FILLMORE','MANAGER',9,'08-09-1994',56000,20,2) +,(11,'ADAMS','ENGINEER',10,'03-15-1996',34000,20,2) +,(12,'WASHINGTON','ADMIN',6,'04-16-1998',18000,15,4) +,(13,'MONROE','ENGINEER',10,'12-03-2000',30000,20,7) +,(14,'ROOSEVELT','CPA',9,'10-12-1995',35000,30,1) +,(15,'More','ENGINEER',9,'10-12-1994',25000,20,2) +,(16,'ROSE','SALES I',10,'10-12-1999',18000,15,3) +,(17,'CLINT','CPA',2,'10-12-2001',24000,30,1); +DROP TABLE IF EXISTS sto_uao_dept_wildcard cascade; +CREATE TABLE sto_uao_dept_wildcard ( + deptno INT NOT NULL, + dname VARCHAR(14), + loc VARCHAR(13)); +insert into sto_uao_dept_wildcard values + (1,'ACCOUNTING','ST LOUIS') +,(2,'RESEARCH','NEW YORK') +,(3,'SALES','ATLANTA') +,(5,'LOGISTICS','BOSTON') +,(4, 'OPERATIONS','SEATTLE'); +select ename from sto_uao_emp_wildcard where dept in ( select deptno from sto_uao_dept_wildcard where dname like '%S') +AND ename like 'H%' order by 1 asc LIMIT 15; + ename +--------- + HARDING + HOOVER +(2 rows) + +-- @Description select with window +-- +DROP TABLE IF EXISTS uao_orders; +CREATE TABLE uao_orders(order_id serial , customer_id integer, + order_datetime timestamp, order_total numeric(10,2)); +INSERT INTO uao_orders(customer_id, order_datetime, order_total) +VALUES (1,'2009-05-01 10:00 AM', 500), + (1,'2009-05-15 11:00 AM', 650), + (2,'2009-05-11 11:00 PM', 100), + (2,'2009-05-12 11:00 PM', 5), + (3,'2009-04-11 11:00 PM', 100), + (1,'2009-05-20 11:00 AM', 3); +select * from uao_orders order by order_id; + order_id | customer_id | order_datetime | order_total +----------+-------------+--------------------------+------------- + 1 | 1 | Fri May 01 10:00:00 2009 | 500.00 + 2 | 1 | Fri May 15 11:00:00 2009 | 650.00 + 3 | 2 | Mon May 11 23:00:00 2009 | 100.00 + 4 | 2 | Tue May 12 23:00:00 2009 | 5.00 + 5 | 3 | Sat Apr 11 23:00:00 2009 | 100.00 + 6 | 1 | Wed May 20 11:00:00 2009 | 3.00 +(6 rows) + +SELECT row_number() OVER(window_custtime) As rtime_d, +n.customer_id, lead(order_id) OVER(window_custtime) As cr_num, n.order_id, n.order_total +FROM uao_orders AS n +WINDOW window_custtime AS (PARTITION BY n.customer_id + ORDER BY n.customer_id, n.order_id, n.order_total) +ORDER BY 1, 2; + rtime_d | customer_id | cr_num | order_id | order_total +---------+-------------+--------+----------+------------- + 1 | 1 | 2 | 1 | 500.00 + 1 | 2 | 4 | 3 | 100.00 + 1 | 3 | | 5 | 100.00 + 2 | 1 | 6 | 2 | 650.00 + 2 | 2 | | 4 | 5.00 + 3 | 1 | | 6 | 3.00 +(6 rows) + diff --git a/src/test/singlenode_regress/parallel_schedule b/src/test/singlenode_regress/parallel_schedule new file mode 100644 index 00000000000..54ccd53cfe0 --- /dev/null +++ b/src/test/singlenode_regress/parallel_schedule @@ -0,0 +1,168 @@ +# ---------- +# src/test/regress/parallel_schedule +# +# By convention, we put no more than twenty tests in any one parallel group; +# this limits the number of connections needed to run the tests. +# ---------- + +# run tablespace by itself, and first, because it forces a checkpoint; +# we'd prefer not to have checkpoints later in the tests because that +# interferes with crash-recovery testing. +test: tablespace +# ---------- +# The first group of parallel tests +# ---------- +test: boolean char name varchar text int2 int4 int8 oid float4 float8 bit numeric txid uuid enum money rangetypes pg_lsn regproc + +# ---------- +# The second group of parallel tests +# strings depends on char, varchar and text +# numerology depends on int2, int4, int8, float4, float8 +# multirangetypes depends on rangetypes +# multirangetypes shouldn't run concurrently with type_sanity +# ---------- +test: strings numerology point lseg line box path polygon circle date time timetz timestamp timestamptz interval inet macaddr macaddr8 multirangetypes create_function_0 + +# ---------- +# Another group of parallel tests +# geometry depends on point, lseg, box, path, polygon and circle +# horology depends on interval, timetz, timestamp, timestamptz +# opr_sanity depends on create_function_0 +# ---------- +test: geometry horology tstypes regex type_sanity opr_sanity misc_sanity comments expressions unicode xid mvcc + +# ---------- +# These four each depend on the previous one +# ---------- +test: create_function_1 +test: create_type +test: create_table +test: create_function_2 + +# ---------- +# Load huge amounts of data +# We should split the data files into single files and then +# execute two copy tests parallel, to check that copy itself +# is concurrent safe. +# ---------- +test: copy copyselect copydml insert insert_conflict + +# ---------- +# More groups of parallel tests +# ---------- +test: create_misc create_operator create_procedure +# These depend on create_misc and create_operator +test: create_index create_index_spgist create_view index_including index_including_gist +# Depends on things setup for create_index +test: gp_gin_index + +# ---------- +# Another group of parallel tests +# ---------- +test: create_aggregate create_function_3 create_cast constraints triggers select inherit typed_table vacuum drop_if_exists updatable_views roleattributes create_am hash_func errors infinite_recurse + +# ---------- +# Because vacuum will detect concurrently running transactions, it is necessary to +# run this test on its own, or it might not detect the pages are 'all visible' +# ---------- +test: disable_autovacuum +test: vacuum_stats +test: enable_autovacuum + +# ---------- +# sanity_check does a vacuum, affecting the sort order of SELECT * +# results. So it should not run parallel to other tests. +test: sanity_check + +# ---------- +# Another group of parallel tests +# Note: the ignore: line does not run random, just mark it as ignorable +# ---------- +ignore: random +test: select_into select_distinct select_distinct_on select_implicit select_having subselect union case join aggregates random portals arrays btree_index hash_index update delete + +# In PostgreSQL, namespace test is run as part of the previous group, but there +# are some GPDB additions in it that will show diff if concurrent tests use +# temporary tables. So run it separately. +test: namespace + +# 2-phase commit is not supported by GPDB. +#test: prepared_xacts + +test: transactions + +# ---------- +# Another group of parallel tests +# ---------- +test: brin gin gist spgist privileges init_privs security_label collate matview lock replica_identity rowsecurity object_address tablesample groupingsets drop_operator password identity generated join_hash appendonly_sample aocs_sample + +# ---------- +# Additional BRIN tests +# ---------- +test: brin_bloom brin_multi + +# ---------- +# Another group of parallel tests +# ---------- +test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort + +# rules cannot run concurrently with any test that creates +# a view or rule in the public schema +# +# 'rules' test is disabled in GPDB. Maintaining the list of views in it is +# too painful, and there are also errors because of cross-segment UPDATEs +# and functions. +# +# GPDB_84_MERGE_FIXME: While disabling this was not really an effect of the 8.4 +# merge, it was done a long time ago, it's time to revisit this so we can re- +# enable it +#test: rules +# collate.*.utf8 tests cannot be run in parallel with each other +test: psql psql_crosstab amutils stats_ext collate.linux.utf8 + +# run by itself so it can run parallel workers +test: select_parallel +test: write_parallel +test: vacuum_parallel + +# no relation related tests can be put in this group +test: publication subscription + +# ---------- +# Another group of parallel tests +# ---------- +test: select_views portals_p2 cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock indirect_toast equivclass + +# 'foreign_key' test is disabled, because it contains several tables with +# multiple UNIQUE constraints, which is not supported in GPDB. +#test: foreign_key + +# ---------- +# Another group of parallel tests (JSON related) +# ---------- +test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath + +# ---------- +# Another group of parallel tests +# NB: temp.sql does a reconnect which transiently uses 2 connections, +# so keep this parallel group to at most 19 tests +# ---------- +test: plancache limit plpgsql copy2 temp domain rangefuncs prepare conversion truncate alter_table sequence polymorphism rowtypes returning with xml +# large objects are not supported by GPDB +# test: largeobject + +test: gp_foreign_data + +# ---------- +# Another group of parallel tests +# ---------- +test: partition_join partition_prune reloptions hash_part indexing partition_aggregate partition_info tuplesort explain compression memoize + +# event triggers cannot run concurrently with any test that runs DDL +# oidjoins is read-only, though, and should run late for best coverage +test: event_trigger oidjoins +# this test also uses event triggers, so likewise run it by itself +test: fast_default + +# run stats by itself because its delay may be insufficient under heavy load +test: stats diff --git a/src/test/singlenode_regress/sql/.gitignore b/src/test/singlenode_regress/sql/.gitignore new file mode 100644 index 00000000000..4d944cf7aa1 --- /dev/null +++ b/src/test/singlenode_regress/sql/.gitignore @@ -0,0 +1,61 @@ +/constraints.sql +/copy.sql +/create_function_0.sql +/create_function_1.sql +/create_function_2.sql +/largeobject.sql +/misc.sql +/security_label.sql +/tablespace.sql + +# GPDB specific ignores +# autogenerated sql files from input dir source files +/alter_db_set_tablespace.sql +/alter_db_set_tablespace_with_fault.sql +/aocs.sql +/appendonly.sql +/auth_constraint.sql +/autovacuum.sql +/autovacuum-segment.sql +/autovacuum-template0-segment.sql +/bb_memory_quota.sql +/bb_mpph.sql +/collect_tabstat.sql +/createdb.sql +/default_tablespace.sql +/dispatch.sql +/dropdb_check_shared_buffer_cache.sql +/external_table.sql +/filespace.sql +/gpcopy.sql +/gp_dispatch_keepalives.sql +/gp_tablespace_path_too_long.sql +/gp_tablespace.sql +/gp_tablespace_with_faults.sql +/gptokencheck.sql +/gp_transactions.sql +/guc_env_var.sql +/hooktest.sql +/oid_wraparound.sql +/partition_ddl.sql +/pgstat_qd_tabstat.sql +/qp_gist_indexes2.sql +/qp_regexp.sql +/query_info_hook_test.sql +/resource_queue_function.sql +/rpt_tpch.sql +/session_reset.sql +/sreh.sql +/table_functions.sql +/temp_relation.sql +/temp_tablespaces.sql +/tpch500GB.sql +/transient_types.sql +/trigger_sets_oid.sql +/upg2.sql +/upgrade.sql +/workfile_mgr_test.sql +/external_table_persistent_error_log.sql + +# CBDB specific ignores +/singlenode_compatibility_cbdb.sql \ No newline at end of file diff --git a/src/test/singlenode_regress/sql/AOCO_Compression.sql b/src/test/singlenode_regress/sql/AOCO_Compression.sql new file mode 100644 index 00000000000..120270886c9 --- /dev/null +++ b/src/test/singlenode_regress/sql/AOCO_Compression.sql @@ -0,0 +1,1773 @@ +-- Two helper functions used to insert data to the test tables we will create. +\set HIDE_TABLEAM off +create function data1( + out a1 int, + out a2 char(5), + out a3 numeric, + out a4 boolean, + out a5 char, + out a6 text, + out a7 timestamp, + out a8 character varying(705), + out a9 bigint, + out a10 date, + out a11 varchar(600), + out a12 text, + out a13 decimal, + out a14 real, + out a15 bigint, + out a16 int4, + out a17 bytea, + out a18 timestamp with time zone, + out a19 timetz, + out a20 path, + out a21 box, + out a22 macaddr, + out a23 interval, + out a24 character varying(800), + out a25 lseg, + out a26 point, + out a27 double precision, + out a28 circle, + out a29 int4, + out a30 numeric(8), + out a31 polygon, + out a32 date, + out a33 real, + out a34 money, + out a35 cidr, + out a36 inet, + out a37 time, + out a38 text, + out a39 bit, + out a40 bit varying(5), + out a41 smallint, + out a42 int +) returns setof record as $$ +select g % 20 + 1 as a1, + 'M' as a2, + 2011::numeric as a3, + 't'::bool as a4, + 'a' as a5, + 'This is news of today: Deadlock between Republicans and Democrats over how best to reduce the U.S. deficit, and over what period, has blocked an agreement to allow the raising of the $14.3 trillion debt ceiling' as a6, + '2001-12-24 02:26:11'::timestamp as a7, + 'U.S. House of Representatives Speaker John Boehner, the top Republican in Congress who has put forward a deficit reduction plan to be voted on later on Thursday said he had no control over whether his bill would avert a credit downgrade.' as a8, + (g % 16 + 2490)::bigint as a9, + '2011-10-11'::date as a10, + 'The Republican-controlled House is tentatively scheduled to vote on Boehner proposal this afternoon at around 6 p.m. EDT (2200 GMT). The main Republican vote counter in the House, Kevin McCarthy, would not say if there were enough votes to pass the bill.' as a11, + 'WASHINGTON:House Speaker John Boehner says his plan mixing spending cuts in exchange for raising the nations $14.3 trillion debt limit is not perfect but is as large a step that a divided government can take that is doable and signable by President Barack Obama.The Ohio Republican says the measure is an honest and sincere attempt at compromise and was negotiated with Democrats last weekend and that passing it would end the ongoing debt crisis. The plan blends $900 billion-plus in spending cuts with a companion increase in the nations borrowing cap.' as a12, + '1234.56'::numeric as a13, + 323453::real as a14, + (g % 11 + 3452)::bigint as a15, + 7845 as a16, + '0011'::bytea as a17, + '2005-07-16 01:51:15+1359'::timestamp with time zone as a18, + '2001-12-13 01:51:15'::timetz as a19, + '((1,2),(0,3),(2,1))'::path as a20, + '((2,3)(4,5))'::box as a21, + '08:00:2b:01:02:03'::macaddr as a22, + '1-2'::interval as a23, + 'Republicans had been working throughout the day Thursday to lock down support for their plan to raise the nations debt ceiling, even as Senate Democrats vowed to swiftly kill it if passed.' as a24, + '((2,3)(4,5))'::lseg as a25, + '(6,7)'::point as a26, + 11.222::float8 as a27, + '((4,5),7)'::circle as a28, + 32 as a29, + 3214::numeric as a30, + '(1,0,2,3)'::polygon as a31, + '2010-02-21'::date as a32, + 43564::real as a33, + '$1,000.00'::money as a34, + '192.168.1'::cidr as a35, + '126.1.3.4'::inet as a36, + '12:30:45'::time as a37, + 'Johnson & Johnsons McNeil Consumer Healthcare announced the voluntary dosage reduction today. Labels will carry new dosing instructions this fall.The company says it will cut the maximum dosage of Regular Strength Tylenol and other acetaminophen-containing products in 2012.Acetaminophen is safe when used as directed, says Edwin Kuffner, MD, McNeil vice president of over-the-counter medical affairs. But, when too much is taken, it can cause liver damage.The action is intended to cut the risk of such accidental overdoses, the company says in a news release.' as a38, + '1'::bit as a39, + '0'::bit varying as a40, + 12::smallint as a41, + 23 as a42 +from generate_series(0,879) as g; +$$ language sql SET LC_monetary='en_US.utf8'; + +create function data2( + out a1 int, + out a2 char(5), + out a3 numeric, + out a4 boolean, + out a5 char, + out a6 text, + out a7 timestamp, + out a8 character varying(705), + out a9 bigint, + out a10 date, + out a11 varchar(600), + out a12 text, + out a13 decimal, + out a14 real, + out a15 bigint, + out a16 int4, + out a17 bytea, + out a18 timestamp with time zone, + out a19 timetz, + out a20 path, + out a21 box, + out a22 macaddr, + out a23 interval, + out a24 character varying(800), + out a25 lseg, + out a26 point, + out a27 double precision, + out a28 circle, + out a29 int4, + out a30 numeric(8), + out a31 polygon, + out a32 date, + out a33 real, + out a34 money, + out a35 cidr, + out a36 inet, + out a37 time, + out a38 text, + out a39 bit, + out a40 bit varying(5), + out a41 smallint, + out a42 int +) returns setof record as $$ +select g % 11 + 500 as a1, + 'F' as a2, + 2010::numeric as a3, + 'f'::bool as a4, + 'b' as a5, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child' as a6, + '2001-12-25 02:22:11'::timestamp as a7, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child' as a8, + (g % 17 + 2500)::bigint as a9, + '2011-10-12'::date as a10, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child' as a11, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child The type integer is the usual choice, as it offers the best balance between range, storage size, and performance The type integer is the usual choice, as it offers the best balance between range, storage size, and performanceThe type integer is the usual choice, as it offers the best balance between range, storage size, and performanceThe type integer is the usual choice, as it offers the best balance between range, storage size, and performanceThe type integer ' as a12, + '1134.26'::numeric as a13, + 311353::real as a14, + (g % 11 + 3982)::bigint as a15, + 7885 as a16, + '0101'::bytea as a17, + '2002-02-12 01:31:14+1344'::timestamp with time zone as a18, + '2003-11-14 01:41:15'::timetz as a19, + '((1,1),(0,1),(1,1))'::path as a20, + '((2,1)(1,5))'::box as a21, + '08:00:2b:01:01:03'::macaddr as a22, + '1-3'::interval as a23, + 'Some students may need time to adjust to school.For most children, the adjustment is quick. Tears will usually disappear after Mommy and Daddy leave the classroom. Do not plead with your child The types smallint, integer, and bigint store whole numbers, that is, numbers without fractional components, of various ranges. The types smallint, integer, and bigint store whole numbers, that is, numbers without fractional components, of various ranges. Attempts to store values outside of the allowed range will result in an errorThe types smallint, integer, and bigint store whole numbers, that is, numbers without fractional components, of various ranges.' as a24, + '((6,5)(4,2))'::lseg as a25, + '(3,6)'::point as a26, + 12.233::float8 as a27, + '((5,4),2)'::circle as a28, + 12 as a29, + 3114::numeric as a30, + '(1,1,0,3)'::polygon as a31, + '2010-03-21'::date as a32, + 43164::real as a33, + '$1,500.00'::money as a34, + '192.167.2'::cidr as a35, + '126.1.1.1'::inet as a36, + '10:30:55'::time as a37, + 'Parents and other family members are always welcome at Stratford. After the first two weeks ofschool' as a38, + '0'::bit as a39, + '1'::bit varying as a40, + 33::smallint as a41, + 44 as a42 +from generate_series(0,186) as g; +$$ language sql SET LC_monetary='en_US.utf8'; + + + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_crtb_with_strg_dir_and_col_ref_1 cascade; + +DROP TABLE if exists co_crtb_with_strg_dir_and_col_ref_1_uncompr cascade; + +-- +-- Create table +-- +CREATE TABLE co_crtb_with_strg_dir_and_col_ref_1 ( + id SERIAL,a1 int ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a2 char(5) ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a3 numeric ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a4 boolean DEFAULT false ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a5 char DEFAULT 'd' ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a6 text ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a7 timestamp ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a8 character varying(705) ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a9 bigint ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a10 date ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a11 varchar(600) ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a12 text ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a13 decimal ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a14 real ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a15 bigint ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a16 int4 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a17 bytea ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a18 timestamp with time zone ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a19 timetz ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a20 path ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a21 box ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a22 macaddr ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a23 interval ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a24 character varying(800) ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a25 lseg ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a26 point ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a27 double precision ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a28 circle ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a29 int4 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a30 numeric(8) ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a31 polygon ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a32 date ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a33 real ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a34 money ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a35 cidr ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a36 inet ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a37 time ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a38 text ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), +a39 bit ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536), +a40 bit varying(5) ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a41 smallint ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576), +a42 int ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), COLUMN a1 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a2 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a3 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a4 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a5 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a6 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a7 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a8 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a9 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a10 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a11 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a12 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a13 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a14 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a15 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a16 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a17 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a18 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a19 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a20 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a21 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a22 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a23 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a24 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a25 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a26 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a27 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a28 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a29 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a30 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a31 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a32 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a33 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a34 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a35 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a36 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a37 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a38 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +, COLUMN a39 ENCODING (compresstype=rle_type,compresslevel=1,blocksize=65536) +, COLUMN a40 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a41 ENCODING (compresstype=zlib,compresslevel=1,blocksize=1048576) +, COLUMN a42 ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768),DEFAULT COLUMN ENCODING (compresstype=zlib,blocksize=8192)) WITH (appendonly=true, orientation=column); + +-- +-- Create Indexes +-- +CREATE INDEX co_crtb_with_strg_dir_and_col_ref_1_idx_bitmap ON co_crtb_with_strg_dir_and_col_ref_1 USING bitmap (a1); + +CREATE INDEX co_crtb_with_strg_dir_and_col_ref_1_idx_btree ON co_crtb_with_strg_dir_and_col_ref_1(a9); + +-- +-- Insert data to the table +-- +INSERT INTO co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +-- More data for bigger block size + + +--Create Uncompressed table of same schema definition + +CREATE TABLE co_crtb_with_strg_dir_and_col_ref_1_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column); + +-- +-- Insert to uncompressed table +-- +INSERT INTO co_crtb_with_strg_dir_and_col_ref_1_uncompr select * from co_crtb_with_strg_dir_and_col_ref_1; + +-- More data for bigger block size + + +-- +-- ********Validation******* +-- +\d+ co_crtb_with_strg_dir_and_col_ref_1 + +--Select from pg_attribute_encoding to see the table entry +select attrelid::regclass as relname, attnum, attoptions from pg_class c, pg_attribute_encoding e where c.relname = 'co_crtb_with_strg_dir_and_col_ref_1' and c.oid=e.attrelid order by relname, attnum limit 3; +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_crtb_with_strg_dir_and_col_ref_1_uncompr ; +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_crtb_with_strg_dir_and_col_ref_1; +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_crtb_with_strg_dir_and_col_ref_1 t1 full outer join co_crtb_with_strg_dir_and_col_ref_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +-- +-- Truncate the table +-- +TRUNCATE table co_crtb_with_strg_dir_and_col_ref_1; +-- +-- Insert data again +-- +insert into co_crtb_with_strg_dir_and_col_ref_1 select * from co_crtb_with_strg_dir_and_col_ref_1_uncompr order by a1; +analyze co_crtb_with_strg_dir_and_col_ref_1; +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_crtb_with_strg_dir_and_col_ref_1 t1 full outer join co_crtb_with_strg_dir_and_col_ref_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +--Alter table alter type of a column +Alter table co_crtb_with_strg_dir_and_col_ref_1 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_crtb_with_strg_dir_and_col_ref_1 where id =10; +Select count(*) from co_crtb_with_strg_dir_and_col_ref_1; + +--Alter table drop a column +Alter table co_crtb_with_strg_dir_and_col_ref_1 Drop column a12; +Insert into co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_crtb_with_strg_dir_and_col_ref_1 where id =10; +Select count(*) from co_crtb_with_strg_dir_and_col_ref_1; + +--Alter table rename a column +Alter table co_crtb_with_strg_dir_and_col_ref_1 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_crtb_with_strg_dir_and_col_ref_1 where id =10; +Select count(*) from co_crtb_with_strg_dir_and_col_ref_1; + +--Alter table add a column +Alter table co_crtb_with_strg_dir_and_col_ref_1 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_crtb_with_strg_dir_and_col_ref_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_crtb_with_strg_dir_and_col_ref_1 where id =10; +Select count(*) from co_crtb_with_strg_dir_and_col_ref_1; + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_cr_sub_partzlib8192_1 cascade; + +DROP TABLE if exists co_cr_sub_partzlib8192_1_uncompr cascade; + +-- +-- Create table +-- +CREATE TABLE co_cr_sub_partzlib8192_1 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) WITH (appendonly=true, orientation=column) + Partition by range(a1) Subpartition by list(a2) subpartition template ( default subpartition df_sp, subpartition sp1 values('M') , subpartition sp2 values('F') , + COLUMN a2 ENCODING (compresstype=zlib,compresslevel=1,blocksize=8192), + COLUMN a1 encoding (compresstype = zlib), + COLUMN a5 ENCODING (compresstype=zlib,compresslevel=1, blocksize=8192), + DEFAULT COLUMN ENCODING (compresstype=zlib,compresslevel=1,blocksize=8192)) (start(1) end(5000) every(1000)); + +-- +-- Create Indexes +-- +CREATE INDEX co_cr_sub_partzlib8192_1_idx_bitmap ON co_cr_sub_partzlib8192_1 USING bitmap (a1); + +CREATE INDEX co_cr_sub_partzlib8192_1_idx_btree ON co_cr_sub_partzlib8192_1(a9); + +-- +-- Insert data to the table +-- +INSERT INTO co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +ANALYZE co_cr_sub_partzlib8192_1; + +--Create Uncompressed table of same schema definition + +CREATE TABLE co_cr_sub_partzlib8192_1_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column) Partition by range(a1) Subpartition by list(a2) subpartition template ( subpartition sp1 values('M') , subpartition sp2 values('F') ) (start(1) end(5000) every(1000)) ; + +-- +-- Insert to uncompressed table +-- +INSERT INTO co_cr_sub_partzlib8192_1_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_cr_sub_partzlib8192_1_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +-- +-- ********Validation******* +-- +\d+ co_cr_sub_partzlib8192_1_1_prt_1_2_prt_sp2 + + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_cr_sub_partzlib8192_1_uncompr ; +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_cr_sub_partzlib8192_1; +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_cr_sub_partzlib8192_1 t1 full outer join co_cr_sub_partzlib8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +-- +-- Truncate the table +-- +TRUNCATE table co_cr_sub_partzlib8192_1; +-- +-- Insert data again +-- +insert into co_cr_sub_partzlib8192_1 select * from co_cr_sub_partzlib8192_1_uncompr order by a1; + +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_cr_sub_partzlib8192_1 t1 full outer join co_cr_sub_partzlib8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + +--Alter table Add Partition +alter table co_cr_sub_partzlib8192_1 add partition new_p start(5050) end (6051) with (appendonly=true, orientation=column); + +--Validation with psql utility + \d+ co_cr_sub_partzlib8192_1_1_prt_new_p_2_prt_sp1 + +alter table co_cr_sub_partzlib8192_1 add default partition df_p with (appendonly=true, orientation=column); + +--Validation with psql utility + \d+ co_cr_sub_partzlib8192_1_1_prt_df_p_2_prt_sp2 + +-- Insert data +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; + + +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists co_cr_sub_partzlib8192_1_exch; + CREATE TABLE co_cr_sub_partzlib8192_1_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Drop Table if exists co_cr_sub_partzlib8192_1_defexch; + CREATE TABLE co_cr_sub_partzlib8192_1_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Insert into co_cr_sub_partzlib8192_1_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where a1=10 and a2!='C'; + +Insert into co_cr_sub_partzlib8192_1_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where a1 =10 and a2!='C'; + +CREATE INDEX ON co_cr_sub_partzlib8192_1_exch USING bitmap (a1); + +CREATE INDEX ON co_cr_sub_partzlib8192_1_exch (a9); + +Alter table co_cr_sub_partzlib8192_1 alter partition FOR (1) exchange partition sp1 with table co_cr_sub_partzlib8192_1_exch; +\d+ co_cr_sub_partzlib8192_1_1_prt_1_2_prt_sp1 + + +Select count(*) from co_cr_sub_partzlib8192_1; + +--Alter table Drop Partition +alter table co_cr_sub_partzlib8192_1 drop partition new_p; + +-- Drop the default partition +alter table co_cr_sub_partzlib8192_1 drop default partition; + +--Alter table alter type of a column +Alter table co_cr_sub_partzlib8192_1 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1; + +--Alter table drop a column +Alter table co_cr_sub_partzlib8192_1 Drop column a12; +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1; + +--Alter table rename a column +Alter table co_cr_sub_partzlib8192_1 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1; + +--Alter table add a column +Alter table co_cr_sub_partzlib8192_1 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1; + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_cr_sub_partzlib8192_1_2 cascade; + +DROP TABLE if exists co_cr_sub_partzlib8192_1_2_uncompr cascade; + +-- +-- Create table +-- +CREATE TABLE co_cr_sub_partzlib8192_1_2 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) WITH (appendonly=true, orientation=column) + Partition by list(a2) Subpartition by range(a1) subpartition template (default subpartition df_sp, start(1) end(5000) every(1000), + COLUMN a2 ENCODING (compresstype=zlib,compresslevel=1,blocksize=8192), + COLUMN a1 encoding (compresstype = zlib), + COLUMN a5 ENCODING (compresstype=zlib,compresslevel=1, blocksize=8192), + DEFAULT COLUMN ENCODING (compresstype=zlib,compresslevel=1,blocksize=8192)) (partition p1 values('F'), partition p2 values ('M')); + +-- +-- Create Indexes +-- +CREATE INDEX co_cr_sub_partzlib8192_1_2_idx_bitmap ON co_cr_sub_partzlib8192_1_2 USING bitmap (a1); + +CREATE INDEX co_cr_sub_partzlib8192_1_2_idx_btree ON co_cr_sub_partzlib8192_1_2(a9); + +-- +-- Insert data to the table +-- +INSERT INTO co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +--Create Uncompressed table of same schema definition + +CREATE TABLE co_cr_sub_partzlib8192_1_2_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column) Partition by list(a2) Subpartition by range(a1) subpartition template (start(1) end(5000) every(1000)) (default partition p1 , partition p2 values ('M') ); + +-- +-- Insert to uncompressed table +-- +INSERT INTO co_cr_sub_partzlib8192_1_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_cr_sub_partzlib8192_1_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + +-- +-- ********Validation******* +-- +\d+ co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_2 + + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_cr_sub_partzlib8192_1_2_uncompr ; +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_cr_sub_partzlib8192_1_2; +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_cr_sub_partzlib8192_1_2 t1 full outer join co_cr_sub_partzlib8192_1_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +-- +-- Truncate the table +-- +TRUNCATE table co_cr_sub_partzlib8192_1_2; +-- +-- Insert data again +-- +insert into co_cr_sub_partzlib8192_1_2 select * from co_cr_sub_partzlib8192_1_2_uncompr order by a1; + +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_cr_sub_partzlib8192_1_2 t1 full outer join co_cr_sub_partzlib8192_1_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + +--Alter table Add Partition +alter table co_cr_sub_partzlib8192_1_2 add partition new_p values('C') with (appendonly=true, orientation=column); + +--Validation with psql utility + \d+ co_cr_sub_partzlib8192_1_2_1_prt_new_p_2_prt_3 + +alter table co_cr_sub_partzlib8192_1_2 add default partition df_p with (appendonly=true, orientation=column); + +--Validation with psql utility + \d+ co_cr_sub_partzlib8192_1_2_1_prt_df_p_2_prt_2 + +-- Insert data +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; + + +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists co_cr_sub_partzlib8192_1_2_exch; + CREATE TABLE co_cr_sub_partzlib8192_1_2_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Drop Table if exists co_cr_sub_partzlib8192_1_2_defexch; + CREATE TABLE co_cr_sub_partzlib8192_1_2_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Insert into co_cr_sub_partzlib8192_1_2_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where a1=10 and a2!='C'; + +Insert into co_cr_sub_partzlib8192_1_2_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where a1 =10 and a2!='C'; + +CREATE INDEX ON co_cr_sub_partzlib8192_1_2_exch USING bitmap (a1); + +CREATE INDEX ON co_cr_sub_partzlib8192_1_2_exch(a9); + +Alter table co_cr_sub_partzlib8192_1_2 alter partition p2 exchange partition FOR (1) with table co_cr_sub_partzlib8192_1_2_exch; +\d+ co_cr_sub_partzlib8192_1_2_1_prt_p2_2_prt_2 + +--Alter table Split Partition + Alter table co_cr_sub_partzlib8192_1_2 alter partition p1 split partition FOR (3001) at(4000) into (partition splita,partition splitb) ; +\d+ co_cr_sub_partzlib8192_1_2_1_prt_p1_2_prt_splita + + +Select count(*) from co_cr_sub_partzlib8192_1_2; + +--Alter table Drop Partition +alter table co_cr_sub_partzlib8192_1_2 drop partition new_p; + +-- Drop the default partition +alter table co_cr_sub_partzlib8192_1_2 drop default partition; + +--Alter table alter type of a column +Alter table co_cr_sub_partzlib8192_1_2 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1_2; + +--Alter table drop a column +Alter table co_cr_sub_partzlib8192_1_2 Drop column a12; +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1_2; + +--Alter table rename a column +Alter table co_cr_sub_partzlib8192_1_2 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1_2; + +--Alter table add a column +Alter table co_cr_sub_partzlib8192_1_2 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_cr_sub_partzlib8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_cr_sub_partzlib8192_1_2 where id =10; +Select count(*) from co_cr_sub_partzlib8192_1_2; + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_wt_sub_partrle_type8192_1 cascade; + +DROP TABLE if exists co_wt_sub_partrle_type8192_1_uncompr cascade; + +-- +-- Create table +-- +CREATE TABLE co_wt_sub_partrle_type8192_1 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=column) Partition by range(a1) Subpartition by list(a2) subpartition template ( default subpartition df_sp, subpartition sp1 values('M') , subpartition sp2 values('F') + WITH (appendonly=true, orientation=column,compresstype=rle_type,compresslevel=1,blocksize=8192)) (start(1) end(5000) every(1000) ); + +-- +-- Create Indexes +-- +CREATE INDEX co_wt_sub_partrle_type8192_1_idx_bitmap ON co_wt_sub_partrle_type8192_1 USING bitmap (a1); + +CREATE INDEX co_wt_sub_partrle_type8192_1_idx_btree ON co_wt_sub_partrle_type8192_1(a9); + +-- +-- Insert data to the table +-- +INSERT INTO co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +ANALYZE co_wt_sub_partrle_type8192_1; + + + +--Create Uncompressed table of same schema definition + +CREATE TABLE co_wt_sub_partrle_type8192_1_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column) Partition by range(a1) Subpartition by list(a2) subpartition template ( subpartition sp1 values('M') , subpartition sp2 values('F') ) (start(1) end(5000) every(1000)) ; + +-- +-- Insert to uncompressed table +-- +INSERT INTO co_wt_sub_partrle_type8192_1_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_wt_sub_partrle_type8192_1_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +-- +-- ********Validation******* +-- +\d+ co_wt_sub_partrle_type8192_1_1_prt_1_2_prt_sp2 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_wt_sub_partrle_type8192_1_uncompr ; +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_wt_sub_partrle_type8192_1; +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_wt_sub_partrle_type8192_1 t1 full outer join co_wt_sub_partrle_type8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +-- +-- Truncate the table +-- +TRUNCATE table co_wt_sub_partrle_type8192_1; +-- +-- Insert data again +-- +insert into co_wt_sub_partrle_type8192_1 select * from co_wt_sub_partrle_type8192_1_uncompr order by a1; + +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_wt_sub_partrle_type8192_1 t1 full outer join co_wt_sub_partrle_type8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + +--Alter table Add Partition +alter table co_wt_sub_partrle_type8192_1 add partition new_p start(5050) end (6051) WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); + +--Validation with psql utility + \d+ co_wt_sub_partrle_type8192_1_1_prt_new_p_2_prt_sp1 + +alter table co_wt_sub_partrle_type8192_1 add default partition df_p ; + +--Validation with psql utility + \d+ co_wt_sub_partrle_type8192_1_1_prt_df_p_2_prt_sp2 + +-- Insert data +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; + + +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists co_wt_sub_partrle_type8192_1_exch; + CREATE TABLE co_wt_sub_partrle_type8192_1_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Drop Table if exists co_wt_sub_partrle_type8192_1_defexch; + CREATE TABLE co_wt_sub_partrle_type8192_1_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Insert into co_wt_sub_partrle_type8192_1_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where a1=10 and a2!='C'; + +Insert into co_wt_sub_partrle_type8192_1_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where a1 =10 and a2!='C'; + +CREATE INDEX ON co_wt_sub_partrle_type8192_1_exch USING bitmap (a1); + +CREATE INDEX ON co_wt_sub_partrle_type8192_1_exch(a9); + +Alter table co_wt_sub_partrle_type8192_1 alter partition FOR (1) exchange partition sp1 with table co_wt_sub_partrle_type8192_1_exch; +\d+ co_wt_sub_partrle_type8192_1_1_prt_1_2_prt_sp1 + + +Select count(*) from co_wt_sub_partrle_type8192_1; + +--Alter table Drop Partition +alter table co_wt_sub_partrle_type8192_1 drop partition new_p; + +-- Drop the default partition +alter table co_wt_sub_partrle_type8192_1 drop default partition; + +--Alter table alter type of a column +Alter table co_wt_sub_partrle_type8192_1 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1; + +--Alter table drop a column +Alter table co_wt_sub_partrle_type8192_1 Drop column a12; +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1; + +--Alter table rename a column +Alter table co_wt_sub_partrle_type8192_1 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1; + +--Alter table add a column +Alter table co_wt_sub_partrle_type8192_1 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1; + +-- +-- Drop table if exists +-- +DROP TABLE if exists co_wt_sub_partrle_type8192_1_2 cascade; + +DROP TABLE if exists co_wt_sub_partrle_type8192_1_2_uncompr cascade; + +-- +-- Create table +-- +CREATE TABLE co_wt_sub_partrle_type8192_1_2 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=column) Partition by list(a2) Subpartition by range(a1) subpartition template (default subpartition df_sp, start(1) end(5000) every(1000) + WITH (appendonly=true, orientation=column,compresstype=rle_type,compresslevel=1,blocksize=8192)) (partition p1 values ('M'), partition p2 values ('F')); + +-- +-- Create Indexes +-- +CREATE INDEX co_wt_sub_partrle_type8192_1_2_idx_bitmap ON co_wt_sub_partrle_type8192_1_2 USING bitmap (a1); + +CREATE INDEX co_wt_sub_partrle_type8192_1_2_idx_btree ON co_wt_sub_partrle_type8192_1_2(a9); + +-- +-- Insert data to the table +-- +INSERT INTO co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + + +--Create Uncompressed table of same schema definition + +CREATE TABLE co_wt_sub_partrle_type8192_1_2_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column) Partition by list(a2) Subpartition by range(a1) subpartition template (start(1) end(5000) every(1000)) (default partition p1 , partition p2 values ('M') ); + +-- +-- Insert to uncompressed table +-- +INSERT INTO co_wt_sub_partrle_type8192_1_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO co_wt_sub_partrle_type8192_1_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +-- +-- ********Validation******* +-- +\d+ co_wt_sub_partrle_type8192_1_2_1_prt_p1_2_prt_2 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from co_wt_sub_partrle_type8192_1_2_uncompr ; +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from co_wt_sub_partrle_type8192_1_2; +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from co_wt_sub_partrle_type8192_1_2 t1 full outer join co_wt_sub_partrle_type8192_1_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +-- +-- Truncate the table +-- +TRUNCATE table co_wt_sub_partrle_type8192_1_2; +-- +-- Insert data again +-- +insert into co_wt_sub_partrle_type8192_1_2 select * from co_wt_sub_partrle_type8192_1_2_uncompr order by a1; + +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from co_wt_sub_partrle_type8192_1_2 t1 full outer join co_wt_sub_partrle_type8192_1_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + +--Alter table Add Partition +alter table co_wt_sub_partrle_type8192_1_2 add partition new_p values('C') WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); + +--Validation with psql utility + \d+ co_wt_sub_partrle_type8192_1_2_1_prt_new_p_2_prt_3 + +alter table co_wt_sub_partrle_type8192_1_2 add default partition df_p ; + +--Validation with psql utility + \d+ co_wt_sub_partrle_type8192_1_2_1_prt_df_p_2_prt_2 + +-- Insert data +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; + + +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists co_wt_sub_partrle_type8192_1_2_exch; + CREATE TABLE co_wt_sub_partrle_type8192_1_2_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Drop Table if exists co_wt_sub_partrle_type8192_1_2_defexch; + CREATE TABLE co_wt_sub_partrle_type8192_1_2_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=column, compresstype=zlib) ; + +Insert into co_wt_sub_partrle_type8192_1_2_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where a1=10 and a2!='C'; + +Insert into co_wt_sub_partrle_type8192_1_2_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where a1 =10 and a2!='C'; + +CREATE INDEX ON co_wt_sub_partrle_type8192_1_2_exch USING bitmap (a1); + +CREATE INDEX ON co_wt_sub_partrle_type8192_1_2_exch (a9); + +Alter table co_wt_sub_partrle_type8192_1_2 alter partition p1 exchange partition FOR (1) with table co_wt_sub_partrle_type8192_1_2_exch; +\d+ co_wt_sub_partrle_type8192_1_2_1_prt_p1_2_prt_2 + + +--Alter table Split Partition + Alter table co_wt_sub_partrle_type8192_1_2 alter partition p2 split partition FOR (3001) at(4000) into (partition splita,partition splitb) ; +\d+ co_wt_sub_partrle_type8192_1_2_1_prt_p2_2_prt_splita + + +Select count(*) from co_wt_sub_partrle_type8192_1_2; + +--Alter table Drop Partition +alter table co_wt_sub_partrle_type8192_1_2 drop partition new_p; + +-- Drop the default partition +alter table co_wt_sub_partrle_type8192_1_2 drop default partition; + +--Alter table alter type of a column +Alter table co_wt_sub_partrle_type8192_1_2 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1_2; + +--Alter table drop a column +Alter table co_wt_sub_partrle_type8192_1_2 Drop column a12; +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1_2; + +--Alter table rename a column +Alter table co_wt_sub_partrle_type8192_1_2 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1_2; + +--Alter table add a column +Alter table co_wt_sub_partrle_type8192_1_2 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into co_wt_sub_partrle_type8192_1_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from co_wt_sub_partrle_type8192_1_2 where id =10; +Select count(*) from co_wt_sub_partrle_type8192_1_2; + +-- +-- Drop table if exists +-- +DROP TABLE if exists ao_wt_sub_partzlib8192_5 cascade; + +DROP TABLE if exists ao_wt_sub_partzlib8192_5_uncompr cascade; + +-- +-- Create table +-- +CREATE TABLE ao_wt_sub_partzlib8192_5 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=row) Partition by range(a1) Subpartition by list(a2) subpartition template ( default subpartition df_sp, subpartition sp1 values('M') , subpartition sp2 values('F') + WITH (appendonly=true, orientation=row,compresstype=zlib,compresslevel=5,blocksize=8192)) (start(1) end(5000) every(1000) ); + +-- +-- Create Indexes +-- +CREATE INDEX ao_wt_sub_partzlib8192_5_idx_bitmap ON ao_wt_sub_partzlib8192_5 USING bitmap (a1); + +CREATE INDEX ao_wt_sub_partzlib8192_5_idx_btree ON ao_wt_sub_partzlib8192_5(a9); + +-- +-- Insert data to the table +-- +INSERT INTO ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); +ANALYZE ao_wt_sub_partzlib8192_5; + + +--Create Uncompressed table of same schema definition + +CREATE TABLE ao_wt_sub_partzlib8192_5_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row) Partition by range(a1) Subpartition by list(a2) subpartition template ( subpartition sp1 values('M') , subpartition sp2 values('F') ) (start(1) end(5000) every(1000)) ; + +-- +-- Insert to uncompressed table +-- +INSERT INTO ao_wt_sub_partzlib8192_5_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO ao_wt_sub_partzlib8192_5_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +-- +-- ********Validation******* +-- +\d+ ao_wt_sub_partzlib8192_5_1_prt_1_2_prt_sp2 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from ao_wt_sub_partzlib8192_5_uncompr ; +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from ao_wt_sub_partzlib8192_5; +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from ao_wt_sub_partzlib8192_5 t1 full outer join ao_wt_sub_partzlib8192_5_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +-- +-- Truncate the table +-- +TRUNCATE table ao_wt_sub_partzlib8192_5; +-- +-- Insert data again +-- +insert into ao_wt_sub_partzlib8192_5 select * from ao_wt_sub_partzlib8192_5_uncompr order by a1; + +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from ao_wt_sub_partzlib8192_5 t1 full outer join ao_wt_sub_partzlib8192_5_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + +--Alter table Add Partition +alter table ao_wt_sub_partzlib8192_5 add partition new_p start(5050) end (6051) WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); + +--Validation with psql utility + \d+ ao_wt_sub_partzlib8192_5_1_prt_new_p_2_prt_sp1 + +alter table ao_wt_sub_partzlib8192_5 add default partition df_p ; + +--Validation with psql utility + \d+ ao_wt_sub_partzlib8192_5_1_prt_df_p_2_prt_sp2 + +-- Insert data +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; + + +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists ao_wt_sub_partzlib8192_5_exch; + CREATE TABLE ao_wt_sub_partzlib8192_5_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row, compresstype=zlib) ; + +Drop Table if exists ao_wt_sub_partzlib8192_5_defexch; + CREATE TABLE ao_wt_sub_partzlib8192_5_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row, compresstype=zlib) ; + +Insert into ao_wt_sub_partzlib8192_5_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where a1=10 and a2!='C'; + +Insert into ao_wt_sub_partzlib8192_5_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where a1 =10 and a2!='C'; + +CREATE INDEX ON ao_wt_sub_partzlib8192_5_exch USING bitmap (a1); + +CREATE INDEX ON ao_wt_sub_partzlib8192_5_exch (a9); + +Alter table ao_wt_sub_partzlib8192_5 alter partition FOR (1) exchange partition sp1 with table ao_wt_sub_partzlib8192_5_exch; +\d+ ao_wt_sub_partzlib8192_5_1_prt_1_2_prt_sp1 + + +Select count(*) from ao_wt_sub_partzlib8192_5; + +--Alter table Drop Partition +alter table ao_wt_sub_partzlib8192_5 drop partition new_p; + +-- Drop the default partition +alter table ao_wt_sub_partzlib8192_5 drop default partition; + +--Alter table alter type of a column +Alter table ao_wt_sub_partzlib8192_5 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5; + +--Alter table drop a column +Alter table ao_wt_sub_partzlib8192_5 Drop column a12; +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5; + +--Alter table rename a column +Alter table ao_wt_sub_partzlib8192_5 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5; + +--Alter table add a column +Alter table ao_wt_sub_partzlib8192_5 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5; + +-- +-- Drop table if exists +-- +DROP TABLE if exists ao_wt_sub_partzlib8192_5_2 cascade; + +DROP TABLE if exists ao_wt_sub_partzlib8192_5_2_uncompr cascade; + +-- +-- Create table +-- +CREATE TABLE ao_wt_sub_partzlib8192_5_2 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=row) Partition by list(a2) Subpartition by range(a1) subpartition template (default subpartition df_sp, start(1) end(5000) every(1000) + WITH (appendonly=true, orientation=row,compresstype=zlib,compresslevel=5,blocksize=8192)) (partition p1 values ('M'), partition p2 values ('F')); + +-- +-- Create Indexes +-- +CREATE INDEX ao_wt_sub_partzlib8192_5_2_idx_bitmap ON ao_wt_sub_partzlib8192_5_2 USING bitmap (a1); + +CREATE INDEX ao_wt_sub_partzlib8192_5_2_idx_btree ON ao_wt_sub_partzlib8192_5_2(a9); + +-- +-- Insert data to the table +-- +INSERT INTO ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + + +--Create Uncompressed table of same schema definition + +CREATE TABLE ao_wt_sub_partzlib8192_5_2_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row) Partition by list(a2) Subpartition by range(a1) subpartition template (start(1) end(5000) every(1000)) (default partition p1 , partition p2 values ('M') ); + +-- +-- Insert to uncompressed table +-- +INSERT INTO ao_wt_sub_partzlib8192_5_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO ao_wt_sub_partzlib8192_5_2_uncompr(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +-- +-- ********Validation******* +-- +\d+ ao_wt_sub_partzlib8192_5_2_1_prt_p1_2_prt_2 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from ao_wt_sub_partzlib8192_5_2_uncompr ; +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from ao_wt_sub_partzlib8192_5_2; +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from ao_wt_sub_partzlib8192_5_2 t1 full outer join ao_wt_sub_partzlib8192_5_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +-- +-- Truncate the table +-- +TRUNCATE table ao_wt_sub_partzlib8192_5_2; +-- +-- Insert data again +-- +insert into ao_wt_sub_partzlib8192_5_2 select * from ao_wt_sub_partzlib8192_5_2_uncompr order by a1; + +-- +-- Compression ratio +-- +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from ao_wt_sub_partzlib8192_5_2 t1 full outer join ao_wt_sub_partzlib8192_5_2_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; + +--Alter table Add Partition +alter table ao_wt_sub_partzlib8192_5_2 add partition new_p values('C') WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); + +--Validation with psql utility + \d+ ao_wt_sub_partzlib8192_5_2_1_prt_new_p_2_prt_3 + +alter table ao_wt_sub_partzlib8192_5_2 add default partition df_p ; + +--Validation with psql utility + \d+ ao_wt_sub_partzlib8192_5_2_1_prt_df_p_2_prt_2 + +-- Insert data +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) values(generate_series(1,5000),'C',2011,'t','a','dfjjjjjj','2001-12-24 02:26:11','hghgh',333,'2011-10-11','Tddd','sss','1234.56',323453,4454,7845,'0011','2005-07-16 01:51:15+1359','2001-12-13 01:51:15','((1,2),(0,3),(2,1))','((2,3)(4,5))','08:00:2b:01:02:03','1-2','dfdf','((2,3)(4,5))','(6,7)',11.222,'((4,5),7)',32,3214,'(1,0,2,3)','2010-02-21',43564,'$1,000.00','192.168.1','126.1.3.4','12:30:45','ggg','1','0',12,23) ; + + +--Alter table Exchange Partition +--Create a table to use in exchange partition +Drop Table if exists ao_wt_sub_partzlib8192_5_2_exch; + CREATE TABLE ao_wt_sub_partzlib8192_5_2_exch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row, compresstype=zlib) ; + +Drop Table if exists ao_wt_sub_partzlib8192_5_2_defexch; + CREATE TABLE ao_wt_sub_partzlib8192_5_2_defexch(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row, compresstype=zlib) ; + +Insert into ao_wt_sub_partzlib8192_5_2_exch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where a1=10 and a2!='C'; + +Insert into ao_wt_sub_partzlib8192_5_2_defexch(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where a1 =10 and a2!='C'; + +CREATE INDEX ON ao_wt_sub_partzlib8192_5_2_exch USING bitmap (a1); + +CREATE INDEX ON ao_wt_sub_partzlib8192_5_2_exch (a9); + +Alter table ao_wt_sub_partzlib8192_5_2 alter partition p1 exchange partition FOR (1) with table ao_wt_sub_partzlib8192_5_2_exch; +\d+ ao_wt_sub_partzlib8192_5_2_1_prt_p1_2_prt_2 + + +--Alter table Split Partition + Alter table ao_wt_sub_partzlib8192_5_2 alter partition p2 split partition FOR (3001) at(4000) into (partition splita,partition splitb) ; +\d+ ao_wt_sub_partzlib8192_5_2_1_prt_p2_2_prt_splita + + +Select count(*) from ao_wt_sub_partzlib8192_5_2; + +--Alter table Drop Partition +alter table ao_wt_sub_partzlib8192_5_2 drop partition new_p; + +-- Drop the default partition +alter table ao_wt_sub_partzlib8192_5_2 drop default partition; + +--Alter table alter type of a column +Alter table ao_wt_sub_partzlib8192_5_2 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5_2; + +--Alter table drop a column +Alter table ao_wt_sub_partzlib8192_5_2 Drop column a12; +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5_2; + +--Alter table rename a column +Alter table ao_wt_sub_partzlib8192_5_2 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5_2; + +--Alter table add a column +Alter table ao_wt_sub_partzlib8192_5_2 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into ao_wt_sub_partzlib8192_5_2(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_wt_sub_partzlib8192_5_2 where id =10; +Select count(*) from ao_wt_sub_partzlib8192_5_2; + +-- +-- Drop table if exists +-- +DROP TABLE if exists ao_crtb_with_row_zlib_8192_1 cascade; + +DROP TABLE if exists ao_crtb_with_row_zlib_8192_1_uncompr cascade; + +-- +-- Create table +-- +CREATE TABLE ao_crtb_with_row_zlib_8192_1 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=row,compresstype=zlib,compresslevel=1,blocksize=8192); + +-- +-- Create Indexes +-- +CREATE INDEX ao_crtb_with_row_zlib_8192_1_idx_bitmap ON ao_crtb_with_row_zlib_8192_1 USING bitmap (a1); + +CREATE INDEX ao_crtb_with_row_zlib_8192_1_idx_btree ON ao_crtb_with_row_zlib_8192_1(a9); + +-- +-- Insert data to the table +-- +INSERT INTO ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +--Create Uncompressed table of same schema definition + +CREATE TABLE ao_crtb_with_row_zlib_8192_1_uncompr(id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int) WITH (appendonly=true, orientation=row); + +-- +-- Insert to uncompressed table +-- +INSERT INTO ao_crtb_with_row_zlib_8192_1_uncompr select * from ao_crtb_with_row_zlib_8192_1; + +-- +-- ********Validation******* +-- +\d+ ao_crtb_with_row_zlib_8192_1 + +-- +-- Compare data with uncompressed table +-- +-- +-- Select number of rows from the uncompressed table +-- +SELECT count(*) as count_uncompressed from ao_crtb_with_row_zlib_8192_1_uncompr ; +-- +-- Select number of rows from the compressed table +-- +SELECT count(*) as count_compressed from ao_crtb_with_row_zlib_8192_1; +-- +-- Select number of rows using a FULL outer join on all the columns of the two tables +-- Count should match with above result if the all the rows uncompressed correctly: +-- +Select count(*) as count_join from ao_crtb_with_row_zlib_8192_1 t1 full outer join ao_crtb_with_row_zlib_8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +-- +-- Truncate the table +-- +TRUNCATE table ao_crtb_with_row_zlib_8192_1; +-- +-- Insert data again +-- +insert into ao_crtb_with_row_zlib_8192_1 select * from ao_crtb_with_row_zlib_8192_1_uncompr order by a1; + + +-- +-- Select the data: Using the JOIN as mentioned above +-- +Select count(*) as count_join from ao_crtb_with_row_zlib_8192_1 t1 full outer join ao_crtb_with_row_zlib_8192_1_uncompr t2 on t1.id=t2.id and t1.a1=t2.a1 and t1.a2=t2.a2 and t1.a3=t2.a3 and t1.a4=t2.a4 and t1.a5=t2.a5 and t1.a6=t2.a6 and t1.a7=t2.a7 and t1.a8=t2.a8 and t1.a9=t2.a9 and t1.a10=t2.a10 and t1.a11=t2.a11 and t1.a12=t2.a12 and t1.a13=t2.a13 and t1.a14=t2.a14 and t1.a15=t2.a15 and t1.a16=t2.a16 and t1.a17=t2.a17 and t1.a18=t2.a18 and t1.a19=t2.a19 and t1.a22=t2.a22 and t1.a23=t2.a23 and t1.a24=t2.a24 and t1.a27=t2.a27 and t1.a29=t2.a29 and t1.a30=t2.a30 and t1.a32=t2.a32 and t1.a33=t2.a33 and t1.a34=t2.a34 and t1.a35=t2.a35 and t1.a36=t2.a36 and t1.a37=t2.a37 and t1.a38=t2.a38 and t1.a39=t2.a39 and t1.a40=t2.a40 and t1.a41=t2.a41 and t1.a42=t2.a42 ; +--Alter table alter type of a column +Alter table ao_crtb_with_row_zlib_8192_1 Alter column a3 TYPE int4; +--Insert data to the table, select count(*) +Insert into ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_crtb_with_row_zlib_8192_1 where id =10; +Select count(*) from ao_crtb_with_row_zlib_8192_1; + +--Alter table drop a column +Alter table ao_crtb_with_row_zlib_8192_1 Drop column a12; +Insert into ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_crtb_with_row_zlib_8192_1 where id =10; +Select count(*) from ao_crtb_with_row_zlib_8192_1; + +--Alter table rename a column +Alter table ao_crtb_with_row_zlib_8192_1 Rename column a13 TO after_rename_a13; +--Insert data to the table, select count(*) +Insert into ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_crtb_with_row_zlib_8192_1 where id =10; +Select count(*) from ao_crtb_with_row_zlib_8192_1; + +--Alter table add a column +Alter table ao_crtb_with_row_zlib_8192_1 Add column a12 text default 'new column'; +--Insert data to the table, select count(*) +Insert into ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,after_rename_a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42 from ao_crtb_with_row_zlib_8192_1 where id =10; +Select count(*) from ao_crtb_with_row_zlib_8192_1; + +--Drop table +DROP table ao_crtb_with_row_zlib_8192_1; + +--Create table again and insert data +CREATE TABLE ao_crtb_with_row_zlib_8192_1 + (id SERIAL,a1 int,a2 char(5),a3 numeric,a4 boolean DEFAULT false ,a5 char DEFAULT 'd',a6 text,a7 timestamp,a8 character varying(705),a9 bigint,a10 date,a11 varchar(600),a12 text,a13 decimal,a14 real,a15 bigint,a16 int4 ,a17 bytea,a18 timestamp with time zone,a19 timetz,a20 path,a21 box,a22 macaddr,a23 interval,a24 character varying(800),a25 lseg,a26 point,a27 double precision,a28 circle,a29 int4,a30 numeric(8),a31 polygon,a32 date,a33 real,a34 money,a35 cidr,a36 inet,a37 time,a38 text,a39 bit,a40 bit varying(5),a41 smallint,a42 int ) + WITH (appendonly=true, orientation=row,compresstype=zlib,compresslevel=1,blocksize=8192); +INSERT INTO ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data1(); + +INSERT INTO ao_crtb_with_row_zlib_8192_1(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) select * from data2(); + + +--Alter table drop a column +Alter table ao_crtb_with_row_zlib_8192_1 Drop column a12; +--Create CTAS table + + Drop table if exists ao_crtb_with_row_zlib_8192_1_ctas ; +--Create a CTAS table +CREATE TABLE ao_crtb_with_row_zlib_8192_1_ctas WITH (appendonly=true, orientation=column) AS Select * from ao_crtb_with_row_zlib_8192_1; + +DROP type if exists int_rle_type cascade ; + +CREATE type int_rle_type; +CREATE FUNCTION int_rle_type_in(cstring) + RETURNS int_rle_type + AS 'int4in' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE FUNCTION int_rle_type_out(int_rle_type) + RETURNS cstring + AS 'int4out' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE TYPE int_rle_type( + input = int_rle_type_in , + output = int_rle_type_out , + internallength = 4, + default =55, + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + +--Drop and recreate the data type + + Drop type if exists int_rle_type cascade; + +CREATE FUNCTION int_rle_type_in(cstring) + RETURNS int_rle_type + AS 'int4in' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE FUNCTION int_rle_type_out(int_rle_type) + RETURNS cstring + AS 'int4out' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE TYPE int_rle_type( + input = int_rle_type_in , + output = int_rle_type_out , + internallength = 4, + default =55, + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + + +select typoptions from pg_type_encoding where typid='int_rle_type '::regtype; + +DROP type if exists char_rle_type cascade ; + +CREATE type char_rle_type; +CREATE FUNCTION char_rle_type_in(cstring) + RETURNS char_rle_type + AS 'charin' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE FUNCTION char_rle_type_out(char_rle_type) + RETURNS cstring + AS 'charout' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE TYPE char_rle_type( + input = char_rle_type_in , + output = char_rle_type_out , + internallength = 4, + default = 'asd' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + +--Drop and recreate the data type + + Drop type if exists char_rle_type cascade; + +CREATE FUNCTION char_rle_type_in(cstring) + RETURNS char_rle_type + AS 'charin' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE FUNCTION char_rle_type_out(char_rle_type) + RETURNS cstring + AS 'charout' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE TYPE char_rle_type( + input = char_rle_type_in , + output = char_rle_type_out , + internallength = 4, + default = 'asd' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + + +select typoptions from pg_type_encoding where typid='char_rle_type '::regtype; + +DROP type if exists text_rle_type cascade ; + +CREATE type text_rle_type; +CREATE FUNCTION text_rle_type_in(cstring) + RETURNS text_rle_type + AS 'textin' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE FUNCTION text_rle_type_out(text_rle_type) + RETURNS cstring + AS 'textout' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE TYPE text_rle_type( + input = text_rle_type_in , + output = text_rle_type_out , + internallength = variable, + default = 'hfkdshfkjsdhflkshadfkhsadflkh' , + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + +--Drop and recreate the data type + + Drop type if exists text_rle_type cascade; + +CREATE FUNCTION text_rle_type_in(cstring) + RETURNS text_rle_type + AS 'textin' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE FUNCTION text_rle_type_out(text_rle_type) + RETURNS cstring + AS 'textout' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE TYPE text_rle_type( + input = text_rle_type_in , + output = text_rle_type_out , + internallength = variable, + default = 'hfkdshfkjsdhflkshadfkhsadflkh' , + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + + +select typoptions from pg_type_encoding where typid='text_rle_type '::regtype; + +DROP type if exists varchar_rle_type cascade ; + +CREATE type varchar_rle_type; +CREATE FUNCTION varchar_rle_type_in(cstring) + RETURNS varchar_rle_type + AS 'varcharin' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE FUNCTION varchar_rle_type_out(varchar_rle_type) + RETURNS cstring + AS 'varcharout' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE TYPE varchar_rle_type( + input = varchar_rle_type_in , + output = varchar_rle_type_out , + internallength = variable, + default = 'ajhgdjagdjasdkjashk' , + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + +--Drop and recreate the data type + + Drop type if exists varchar_rle_type cascade; + +CREATE FUNCTION varchar_rle_type_in(cstring) + RETURNS varchar_rle_type + AS 'varcharin' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE FUNCTION varchar_rle_type_out(varchar_rle_type) + RETURNS cstring + AS 'varcharout' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE TYPE varchar_rle_type( + input = varchar_rle_type_in , + output = varchar_rle_type_out , + internallength = variable, + default = 'ajhgdjagdjasdkjashk' , + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + + +select typoptions from pg_type_encoding where typid='varchar_rle_type '::regtype; + +DROP type if exists date_rle_type cascade ; + +CREATE type date_rle_type; +CREATE FUNCTION date_rle_type_in(cstring) + RETURNS date_rle_type + AS 'date_in' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE FUNCTION date_rle_type_out(date_rle_type) + RETURNS cstring + AS 'date_out' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE TYPE date_rle_type( + input = date_rle_type_in , + output = date_rle_type_out , + internallength = 4, + default = '2001-12-11' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + +--Drop and recreate the data type + + Drop type if exists date_rle_type cascade; + +CREATE FUNCTION date_rle_type_in(cstring) + RETURNS date_rle_type + AS 'date_in' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE FUNCTION date_rle_type_out(date_rle_type) + RETURNS cstring + AS 'date_out' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE TYPE date_rle_type( + input = date_rle_type_in , + output = date_rle_type_out , + internallength = 4, + default = '2001-12-11' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + + +select typoptions from pg_type_encoding where typid='date_rle_type '::regtype; + +DROP type if exists timestamp_rle_type cascade ; + +CREATE type timestamp_rle_type; +CREATE FUNCTION timestamp_rle_type_in(cstring) + RETURNS timestamp_rle_type + AS 'timestamp_in' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE FUNCTION timestamp_rle_type_out(timestamp_rle_type) + RETURNS cstring + AS 'timestamp_out' + LANGUAGE internal IMMUTABLE STRICT; + +CREATE TYPE timestamp_rle_type( + input = timestamp_rle_type_in , + output = timestamp_rle_type_out , + internallength = 4, + default = '2001-12-24 02:26:11' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + +--Drop and recreate the data type + + Drop type if exists timestamp_rle_type cascade; + +CREATE FUNCTION timestamp_rle_type_in(cstring) + RETURNS timestamp_rle_type + AS 'timestamp_in' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE FUNCTION timestamp_rle_type_out(timestamp_rle_type) + RETURNS cstring + AS 'timestamp_out' + LANGUAGE internal IMMUTABLE STRICT; + + +CREATE TYPE timestamp_rle_type( + input = timestamp_rle_type_in , + output = timestamp_rle_type_out , + internallength = 4, + default = '2001-12-24 02:26:11' , + passedbyvalue, + compresstype=rle_type, + blocksize=8192, + compresslevel=4); + + +select typoptions from pg_type_encoding where typid='timestamp_rle_type '::regtype; + +DROP table if exists co_create_type_rle_type_8192_4; +-- Create table +CREATE TABLE co_create_type_rle_type_8192_4 + (id serial, a1 int_rle_type, a2 char_rle_type, a3 text_rle_type, a4 date_rle_type, a5 varchar_rle_type, a6 timestamp_rle_type ) WITH (appendonly=true, orientation=column); + + +\d+ co_create_type_rle_type_8192_4 + +INSERT into co_create_type_rle_type_8192_4 DEFAULT VALUES ; +--Select * from co_create_type_rle_type_8192_4; + +Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +--Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +--Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +--Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; +--Insert into co_create_type_rle_type_8192_4 select * from co_create_type_rle_type_8192_4; + +Select * from co_create_type_rle_type_8192_4; + +--Alter table drop a column +Alter table co_create_type_rle_type_8192_4 Drop column a2; +Insert into co_create_type_rle_type_8192_4(a1,a3,a4,a5,a6) select a1,a3,a4,a5,a6 from co_create_type_rle_type_8192_4 ; +Select count(*) from co_create_type_rle_type_8192_4; + +--Alter table rename a column +Alter table co_create_type_rle_type_8192_4 Rename column a3 TO after_rename_a3; +--Insert data to the table, select count(*) +Insert into co_create_type_rle_type_8192_4(a1,after_rename_a3,a4,a5,a6) select a1,after_rename_a3,a4,a5,a6 from co_create_type_rle_type_8192_4 ; +Select count(*) from co_create_type_rle_type_8192_4; + +Alter type int_rle_type set default encoding (compresstype=zlib,compresslevel=1); + +--Add a column + Alter table co_create_type_rle_type_8192_4 Add column new_cl int_rle_type default '5'; + +\d+ co_create_type_rle_type_8192_4 + +Insert into co_create_type_rle_type_8192_4(a1,after_rename_a3,a4,a5,a6) select a1,after_rename_a3,a4,a5,a6 from co_create_type_rle_type_8192_4 ; +Select count(*) from co_create_type_rle_type_8192_4; + +-- Given an AO/CO with zlib type compression +Drop table if exists mpp17012_compress_test2; +create table mpp17012_compress_test2 ( +col1 character(2), +col2 int, +col3 varchar, +col4 character(44), +DEFAULT COLUMN ENCODING (COMPRESSTYPE=zlib, compresslevel=5) +) +WITH (APPENDONLY=true, ORIENTATION=column, OIDS=FALSE); +select pg_size_pretty(pg_relation_size('mpp17012_compress_test2')), +get_ao_compression_ratio('mpp17012_compress_test2'); +\d+ mpp17012_compress_test2 +-- When I insert data +insert into mpp17012_compress_test2 values('a',generate_series(1,250),'ksjdhfksdhfksdhfksjhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh','bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'); +-- Then the data will be compressed according to a consistent compression ratio +select pg_size_pretty(pg_relation_size('mpp17012_compress_test2')), +get_ao_compression_ratio('mpp17012_compress_test2'); + +-- Test that an AO/CO table with compresstype zlib and invalid compress level will error at create +create table a_aoco_table_with_zlib_and_invalid_compression_level(col text) WITH (APPENDONLY=true, COMPRESSTYPE=zlib, compresslevel=-1, ORIENTATION=column); + +-- Check that callbacks are registered +SELECT * FROM pg_compression WHERE compname='zlib'; + +-- Given an AO/CO with RLE type compression +create table a_aoco_table_with_rle_type_compression(col int) WITH (APPENDONLY=true, COMPRESSTYPE=rle_type, compresslevel=1, ORIENTATION=column); +select pg_size_pretty(pg_relation_size('a_aoco_table_with_rle_type_compression')), + get_ao_compression_ratio('a_aoco_table_with_rle_type_compression'); +-- When I insert data +insert into a_aoco_table_with_rle_type_compression select i from generate_series(1,100)i; +-- Then the data will be compressed according to a consistent compression ratio +select pg_size_pretty(pg_relation_size('a_aoco_table_with_rle_type_compression')), + get_ao_compression_ratio('a_aoco_table_with_rle_type_compression'); + +-- Test that an AO/CO table with compresstype rle and invalid compress level will error at create +create table a_aoco_table_with_rle_type_and_invalid_compression_level(col int) WITH (APPENDONLY=true, COMPRESSTYPE=rle_type, compresslevel=-1, ORIENTATION=column); + +-- Check that callbacks are registered +SELECT * FROM pg_compression WHERE compname='rle_type'; diff --git a/src/test/singlenode_regress/sql/AORO_Compression.sql b/src/test/singlenode_regress/sql/AORO_Compression.sql new file mode 100644 index 00000000000..06d350c6cd2 --- /dev/null +++ b/src/test/singlenode_regress/sql/AORO_Compression.sql @@ -0,0 +1,13 @@ +-- Test basic create table for AO/RO table succeeds for zlib compression +-- Given a row-oriented table with compresstype zlib +CREATE TABLE a_aoro_table_with_zlib_compression(col int) WITH (APPENDONLY=true, COMPRESSTYPE=zlib, COMPRESSLEVEL=1, ORIENTATION=row); +SELECT pg_size_pretty(pg_relation_size('a_aoro_table_with_zlib_compression')), + get_ao_compression_ratio('a_aoro_table_with_zlib_compression'); +-- When I insert data +INSERT INTO a_aoro_table_with_zlib_compression SELECT i from generate_series(1, 100)i; +-- Then the data will be compressed according to a consistent compression ratio +SELECT pg_size_pretty(pg_relation_size('a_aoro_table_with_zlib_compression')), + get_ao_compression_ratio('a_aoro_table_with_zlib_compression'); + +-- Test basic create table for AO/RO table fails for rle compression. rle is only supported for columnar tables. +CREATE TABLE a_aoro_table_with_rle_type_compression(col int) WITH (APPENDONLY=true, COMPRESSTYPE=rle_type, COMPRESSLEVEL=1, ORIENTATION=row); diff --git a/src/test/singlenode_regress/sql/advisory_lock.sql b/src/test/singlenode_regress/sql/advisory_lock.sql new file mode 100644 index 00000000000..57c47c0faca --- /dev/null +++ b/src/test/singlenode_regress/sql/advisory_lock.sql @@ -0,0 +1,146 @@ +-- +-- ADVISORY LOCKS +-- + +BEGIN; + +SELECT + pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), + pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + + +-- pg_advisory_unlock_all() shouldn't release xact locks +SELECT pg_advisory_unlock_all(); + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + + +-- can't unlock xact locks +SELECT + pg_advisory_unlock(1), pg_advisory_unlock_shared(2), + pg_advisory_unlock(1, 1), pg_advisory_unlock_shared(2, 2); + + +-- automatically release xact locks at commit +COMMIT; + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + + +BEGIN; + +-- holding both session and xact locks on the same objects, xact first +SELECT + pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), + pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + +SELECT + pg_advisory_lock(1), pg_advisory_lock_shared(2), + pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2); + +ROLLBACK; + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + + +-- unlocking session locks +SELECT + pg_advisory_unlock(1), pg_advisory_unlock(1), + pg_advisory_unlock_shared(2), pg_advisory_unlock_shared(2), + pg_advisory_unlock(1, 1), pg_advisory_unlock(1, 1), + pg_advisory_unlock_shared(2, 2), pg_advisory_unlock_shared(2, 2); + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + + +BEGIN; + +-- holding both session and xact locks on the same objects, session first +SELECT + pg_advisory_lock(1), pg_advisory_lock_shared(2), + pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2); + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + +SELECT + pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), + pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); + +ROLLBACK; + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + + +-- releasing all session locks +SELECT pg_advisory_unlock_all(); + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + + +BEGIN; + +-- grabbing txn locks multiple times + +SELECT + pg_advisory_xact_lock(1), pg_advisory_xact_lock(1), + pg_advisory_xact_lock_shared(2), pg_advisory_xact_lock_shared(2), + pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock(1, 1), + pg_advisory_xact_lock_shared(2, 2), pg_advisory_xact_lock_shared(2, 2); + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + +COMMIT; + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + +-- grabbing session locks multiple times + +SELECT + pg_advisory_lock(1), pg_advisory_lock(1), + pg_advisory_lock_shared(2), pg_advisory_lock_shared(2), + pg_advisory_lock(1, 1), pg_advisory_lock(1, 1), + pg_advisory_lock_shared(2, 2), pg_advisory_lock_shared(2, 2); + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + +SELECT + pg_advisory_unlock(1), pg_advisory_unlock(1), + pg_advisory_unlock_shared(2), pg_advisory_unlock_shared(2), + pg_advisory_unlock(1, 1), pg_advisory_unlock(1, 1), + pg_advisory_unlock_shared(2, 2), pg_advisory_unlock_shared(2, 2); + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; + +-- .. and releasing them all at once + +SELECT + pg_advisory_lock(1), pg_advisory_lock(1), + pg_advisory_lock_shared(2), pg_advisory_lock_shared(2), + pg_advisory_lock(1, 1), pg_advisory_lock(1, 1), + pg_advisory_lock_shared(2, 2), pg_advisory_lock_shared(2, 2); + +SELECT locktype, classid, objid, objsubid, mode, granted + FROM pg_locks WHERE locktype = 'advisory' + ORDER BY classid, objid, objsubid; + +SELECT pg_advisory_unlock_all(); + +SELECT count(*) FROM pg_locks WHERE locktype = 'advisory'; diff --git a/src/test/singlenode_regress/sql/agg_pushdown.sql b/src/test/singlenode_regress/sql/agg_pushdown.sql new file mode 100644 index 00000000000..3378f8b64e6 --- /dev/null +++ b/src/test/singlenode_regress/sql/agg_pushdown.sql @@ -0,0 +1,353 @@ +-- disable ORCA +SET optimizer TO off; + +-- Test case group 1: basic functions +CREATE TABLE agg_pushdown_parent ( + i int primary key, + x int); + +CREATE TABLE agg_pushdown_child1 ( + j int, + parent int, + v double precision, + PRIMARY KEY (j, parent)); + +CREATE INDEX ON agg_pushdown_child1(parent); + +CREATE TABLE agg_pushdown_child2 ( + k int, + parent int, + v double precision, + PRIMARY KEY (k, parent));; + +INSERT INTO agg_pushdown_parent(i, x) +SELECT n, n +FROM generate_series(0, 7) AS s(n); + +INSERT INTO agg_pushdown_child1(j, parent, v) +SELECT 128 * i + n, i, random() +FROM generate_series(0, 127) AS s(n), agg_pushdown_parent; + +INSERT INTO agg_pushdown_child2(k, parent, v) +SELECT 128 * i + n, i, random() +FROM generate_series(0, 127) AS s(n), agg_pushdown_parent; + +ANALYZE agg_pushdown_parent; +ANALYZE agg_pushdown_child1; +ANALYZE agg_pushdown_child2; + +SET enable_nestloop TO on; +SET enable_hashjoin TO off; +SET enable_mergejoin TO off; + +-- Perform scan of a table, aggregate the result, join it to the other table +-- and finalize the aggregation. +-- +-- In addition, check that functionally dependent column "p.x" can be +-- referenced by SELECT although GROUP BY references "p.i". +SET gp_enable_agg_pushdown TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.x, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + +SET gp_enable_agg_pushdown TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.x, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + +-- The same for hash join. +SET enable_nestloop TO off; +SET enable_hashjoin TO on; + +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + +-- The same for merge join. +SET enable_hashjoin TO off; +SET enable_mergejoin TO on; + +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + +-- Restore the default values. +SET enable_nestloop TO on; +SET enable_hashjoin TO on; + +-- Scan index on agg_pushdown_child1(parent) column and aggregate the result +-- using AGG_SORTED strategy. +SET gp_enable_agg_pushdown TO off; +SET enable_seqscan TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + +SET gp_enable_agg_pushdown TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.i GROUP BY p.i; + +SET enable_seqscan TO on; + +-- Join "c1" to "p.x" column, i.e. one that is not in the GROUP BY clause. The +-- planner should still use "c1.parent" as grouping expression for partial +-- aggregation, although it's not in the same equivalence class as the GROUP +-- BY expression ("p.i"). The reason to use "c1.parent" for partial +-- aggregation is that this is the only way for "c1" to provide the join +-- expression with input data. +SET gp_enable_agg_pushdown TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.x GROUP BY p.i; + +SET gp_enable_agg_pushdown TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v) FROM agg_pushdown_parent AS p JOIN agg_pushdown_child1 +AS c1 ON c1.parent = p.x GROUP BY p.i; + +-- Perform nestloop join between agg_pushdown_child1 and agg_pushdown_child2 +-- and aggregate the result. +SET enable_nestloop TO on; +SET enable_hashjoin TO off; +SET enable_mergejoin TO off; + +SET gp_enable_agg_pushdown TO off; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v + c2.v) FROM agg_pushdown_parent AS p JOIN +agg_pushdown_child1 AS c1 ON c1.parent = p.i JOIN agg_pushdown_child2 AS c2 ON +c2.parent = p.i WHERE c1.j = c2.k GROUP BY p.i; + +SET gp_enable_agg_pushdown TO on; +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v + c2.v) FROM agg_pushdown_parent AS p JOIN +agg_pushdown_child1 AS c1 ON c1.parent = p.i JOIN agg_pushdown_child2 AS c2 ON +c2.parent = p.i WHERE c1.j = c2.k GROUP BY p.i; + +-- The same for hash join. +SET enable_nestloop TO off; +SET enable_hashjoin TO on; + +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v + c2.v) FROM agg_pushdown_parent AS p JOIN +agg_pushdown_child1 AS c1 ON c1.parent = p.i JOIN agg_pushdown_child2 AS c2 ON +c2.parent = p.i WHERE c1.j = c2.k GROUP BY p.i; + +-- The same for merge join. +SET enable_hashjoin TO off; +SET enable_mergejoin TO on; +SET enable_seqscan TO off; + +EXPLAIN (VERBOSE on, COSTS off) +SELECT p.i, avg(c1.v + c2.v) FROM agg_pushdown_parent AS p JOIN +agg_pushdown_child1 AS c1 ON c1.parent = p.i JOIN agg_pushdown_child2 AS c2 ON +c2.parent = p.i WHERE c1.j = c2.k GROUP BY p.i; + +SET enable_seqscan TO on; + +-- Clear tables +DROP TABLE agg_pushdown_child1; +DROP TABLE agg_pushdown_child2; +DROP TABLE agg_pushdown_parent; + +-- Test case group 2: Pushdown with different join keys and group keys. +DROP TABLE IF EXISTS t1, t2; +CREATE TABLE t1 (id int, val int, comment VARCHAR(20)); +CREATE TABLE t2 (id int, val int); + +SET enable_nestloop TO off; +SET enable_hashjoin TO on; +SET enable_mergejoin TO off; + +SET gp_enable_agg_pushdown TO ON; + +-- Join key and group key are the same. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t1.id; + +-- Join key and group key are different. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.val, SUM(t1.id) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t1.val; + +-- Pushdown with equivclass. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t2.id, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t2.id; + +-- Group by column from t2 and aggregate column from t1. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t2.val, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t2.val; + +-- Pushdown with multiply group keys. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, t1.comment, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id GROUP BY t1.id, t1.comment; + +-- Pushdown with multiply join keys. +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, t1.comment, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id and t1.val = t2.val GROUP BY t1.id, t1.comment; + +-- Test above case with different data distributions +INSERT INTO t1 SELECT i, i, 'asd' FROM generate_series(1, 10000) s(i); +ANALYZE t1; +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, t1.comment, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id and t1.val = t2.val GROUP BY t1.id, t1.comment; + +DELETE FROM t1; +INSERT INTO t1 SELECT i % 10, 1, 'asd' FROM generate_series(1, 10000) s(i); +ANALYZE t1; +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.id, t1.comment, SUM(t1.val) FROM t1, t2 WHERE t1.id = t2.id and t1.val = t2.val GROUP BY t1.id, t1.comment; + +-- Clear tables +DROP TABLE t1, t2; + +-- Test case group 3: Pushdown in subquery and group from subquery. +DROP TABLE IF EXISTS part, lineitem; +CREATE TABLE part (p_partkey int, p_size int, p_price int); +CREATE TABLE lineitem (l_orderkey int, l_partkey int, l_amount int); + +SET enable_nestloop TO off; +SET enable_hashjoin TO on; +SET enable_mergejoin TO off; + +SET gp_enable_agg_pushdown TO ON; + +-- Pushdown within subquery. +EXPLAIN (VERBOSE on, COSTS off) +SELECT SUM(slp) FROM + (SELECT l_partkey, SUM(p_price) from lineitem, part + WHERE l_partkey = p_partkey AND p_size < 40 + GROUP BY l_partkey + ORDER BY l_partkey + LIMIT 100) temp(lp, slp) + WHERE slp > 10; + +-- Group base on subquery. +EXPLAIN (VERBOSE on, COSTS off) +SELECT p_partkey, SUM(l_amount) FROM + part, (SELECT l_partkey, l_amount + 10 + FROM lineitem ORDER BY l_partkey LIMIT 10000) li(l_partkey, l_amount) + WHERE l_partkey = p_partkey + GROUP BY p_partkey; + +-- Clear tables +DROP TABLE part, lineitem; + +-- Test case group 4: construct grouped join rel from 2 plain rels +DROP TABLE IF EXISTS vendor_pd, customer_pd, nation_pd; +CREATE TABLE vendor_pd (v_id int, v_name VARCHAR(20)) WITH (APPENDONLY=true, ORIENTATION=column); +CREATE TABLE customer_pd (c_id int primary key, c_v_id int, c_n_id int, c_type int, c_consumption int); +CREATE TABLE nation_pd (n_id int, n_name VARCHAR(20), n_type int, n_population int) WITH (APPENDONLY=true, ORIENTATION=column); + +INSERT INTO nation_pd SELECT i, 'abc', 1, 1 from generate_series(1, 100) s(i); +INSERT INTO customer_pd SELECT i, i % 100, i % 100, 1, 100 from generate_series(1, 10000) s(i); +ANALYZE nation_pd, customer_pd; + +-- For each vendor, calculate the total consumption of qualified customers +EXPLAIN (VERBOSE on, COSTS off) +SELECT v_id, v_name, SUM(c_consumption) + FROM vendor_pd, customer_pd, nation_pd + WHERE v_id = c_v_id AND c_n_id = n_id AND c_id > n_population + GROUP BY v_id, v_name; + +-- For each vendor/c_type/n_type, calculate the total consumption of qualified customers +EXPLAIN (VERBOSE on, COSTS off) +SELECT v_id, c_type, n_type, SUM(c_consumption) + FROM vendor_pd, customer_pd, nation_pd + WHERE v_id = c_v_id AND c_n_id = n_id AND c_id > n_population + GROUP BY v_id, c_type, n_type; + +-- For each vendor/n_type, calculate the total consumption of customers from nation with condition. +EXPLAIN (VERBOSE on, COSTS off) +SELECT v_id, v_name, n_type, SUM(c_consumption) + FROM vendor_pd, customer_pd, nation_pd + WHERE v_id = c_v_id AND c_n_id = n_id AND n_population > 100 + GROUP BY v_id, v_name, n_type; + +-- Clear tables +DROP TABLE vendor_pd, customer_pd, nation_pd; + +-- Test case group 4: OLAP-like cases +DROP TABLE IF EXISTS fact, dim; +CREATE TABLE fact (id int, did int, fact_time int, val int) WITH (APPENDONLY=true, ORIENTATION=column); +CREATE TABLE dim (did int, proj_name varchar(20), brand int, model int); + +INSERT INTO dim SELECT i % 100, 1, 1 FROM generate_series(1, 100) s(i); +INSERT INTO fact SELECT i % 10, i % 100, 30, 1 FROM generate_series(1, 10000) s(i); +ANALYZE dim, fact; + +-- Test sum fact vals group by dim column +EXPLAIN (VERBOSE on, COSTS off) +SELECT dim.did, sum(val) + FROM fact JOIN dim ON fact.did = dim.did + WHERE fact_time > 10 AND fact_time < 2000 + GROUP BY dim.did; + +EXPLAIN (VERBOSE on, COSTS off) +SELECT dim.proj_name, sum(val) + FROM fact JOIN dim ON fact.did = dim.did + WHERE fact_time > 10 AND fact_time < 2000 + GROUP BY dim.proj_name; + +-- Clear tables +DROP TABLE dim, fact; + +-- Test case group 5: partition table and inherit table +SET enable_incremental_sort TO off; + +DROP TABLE IF EXISTS pagg_pd; +CREATE TABLE pagg_pd (a int, b int, c text, d int) PARTITION BY LIST(c); +CREATE TABLE pagg_pd_p1 PARTITION OF pagg_pd FOR VALUES IN ('0000', '0001', '0002', '0003', '0004'); +CREATE TABLE pagg_pd_p2 PARTITION OF pagg_pd FOR VALUES IN ('0005', '0006', '0007', '0008'); +CREATE TABLE pagg_pd_p3 PARTITION OF pagg_pd FOR VALUES IN ('0009', '0010', '0011'); +INSERT INTO pagg_pd SELECT i % 20, i % 30, to_char(i % 12, 'FM0000'), i % 30 FROM generate_series(0, 2999) i; +ANALYZE pagg_pd; + +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.c, sum(t1.a) + FROM pagg_pd t1 JOIN pagg_pd t2 ON t1.c < t2.c + GROUP BY t1.c + ORDER BY 1, 2; + +SELECT t1.c, sum(t1.a) + FROM pagg_pd t1 JOIN pagg_pd t2 ON t1.c < t2.c + GROUP BY t1.c + ORDER BY 1, 2; + +DROP TABLE pagg_pd; + +CREATE TABLE pagg_pd_p (a int, b int); +CREATE TABLE pagg_pd (c text, d int) inherits (pagg_pd_p) PARTITION BY LIST(c); + +DROP TABLE IF EXISTS pagg_pd, pagg_pd_p; +CREATE TABLE pagg_pd_p (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE pagg_pd (d int) inherits (pagg_pd_p); + +DROP TABLE IF EXISTS pagg_pd, pagg_pd_p; +CREATE TABLE pagg_pd_p (a int, b int); +CREATE TABLE pagg_pd (c text, d int) inherits (pagg_pd_p); +INSERT INTO pagg_pd SELECT i % 20, i % 30, to_char(i % 12, 'FM0000'), i % 30 FROM generate_series(0, 2999) i; +ANALYZE pagg_pd; + +EXPLAIN (VERBOSE on, COSTS off) +SELECT t1.c, sum(t1.a) + FROM pagg_pd t1 JOIN pagg_pd t2 ON t1.c < t2.c + GROUP BY t1.c + ORDER BY 1, 2; + +SELECT t1.c, sum(t1.a) + FROM pagg_pd t1 JOIN pagg_pd t2 ON t1.c < t2.c + GROUP BY t1.c + ORDER BY 1, 2; + +DROP TABLE pagg_pd, pagg_pd_p; +RESET enable_incremental_sort; + +-- Clear settings +SET optimizer TO default; + +SET gp_enable_agg_pushdown TO off; + +SET enable_seqscan TO on; +SET enable_nestloop TO on; +SET enable_hashjoin TO on; +SET enable_mergejoin TO on; \ No newline at end of file diff --git a/src/test/singlenode_regress/sql/aggregates.sql b/src/test/singlenode_regress/sql/aggregates.sql new file mode 100644 index 00000000000..b6317538bae --- /dev/null +++ b/src/test/singlenode_regress/sql/aggregates.sql @@ -0,0 +1,1444 @@ +-- +-- AGGREGATES +-- + +-- start_ignore +SET optimizer_trace_fallback to on; +-- end_ignore + +-- avoid bit-exact output here because operations may not be bit-exact. +SET extra_float_digits = 0; + +SELECT avg(four) AS avg_1 FROM onek; + +SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100; + +-- In 7.1, avg(float4) is computed using float8 arithmetic. +-- Round the result to 3 digits to avoid platform-specific results. + +SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest; + +SELECT avg(gpa) AS avg_3_4 FROM ONLY student; + + +SELECT sum(four) AS sum_1500 FROM onek; +SELECT sum(a) AS sum_198 FROM aggtest; +SELECT sum(b) AS avg_431_773 FROM aggtest; +SELECT sum(gpa) AS avg_6_8 FROM ONLY student; + +SELECT max(four) AS max_3 FROM onek; +SELECT max(a) AS max_100 FROM aggtest; +SELECT max(aggtest.b) AS max_324_78 FROM aggtest; +SELECT max(student.gpa) AS max_3_7 FROM student; + +SELECT stddev_pop(b) FROM aggtest; +SELECT stddev_samp(b) FROM aggtest; +SELECT var_pop(b) FROM aggtest; +SELECT var_samp(b) FROM aggtest; + +SELECT stddev_pop(b::numeric) FROM aggtest; +SELECT stddev_samp(b::numeric) FROM aggtest; +SELECT var_pop(b::numeric) FROM aggtest; +SELECT var_samp(b::numeric) FROM aggtest; + +-- population variance is defined for a single tuple, sample variance +-- is not +SELECT var_pop(1.0::float8), var_samp(2.0::float8); +SELECT stddev_pop(3.0::float8), stddev_samp(4.0::float8); +SELECT var_pop('inf'::float8), var_samp('inf'::float8); +SELECT stddev_pop('inf'::float8), stddev_samp('inf'::float8); +SELECT var_pop('nan'::float8), var_samp('nan'::float8); +SELECT stddev_pop('nan'::float8), stddev_samp('nan'::float8); +SELECT var_pop(1.0::float4), var_samp(2.0::float4); +SELECT stddev_pop(3.0::float4), stddev_samp(4.0::float4); +SELECT var_pop('inf'::float4), var_samp('inf'::float4); +SELECT stddev_pop('inf'::float4), stddev_samp('inf'::float4); +SELECT var_pop('nan'::float4), var_samp('nan'::float4); +SELECT stddev_pop('nan'::float4), stddev_samp('nan'::float4); +SELECT var_pop(1.0::numeric), var_samp(2.0::numeric); +SELECT stddev_pop(3.0::numeric), stddev_samp(4.0::numeric); +SELECT var_pop('inf'::numeric), var_samp('inf'::numeric); +SELECT stddev_pop('inf'::numeric), stddev_samp('inf'::numeric); +SELECT var_pop('nan'::numeric), var_samp('nan'::numeric); +SELECT stddev_pop('nan'::numeric), stddev_samp('nan'::numeric); + +-- verify correct results for null and NaN inputs +select sum(null::int4) from generate_series(1,3); +select sum(null::int8) from generate_series(1,3); +select sum(null::numeric) from generate_series(1,3); +select sum(null::float8) from generate_series(1,3); +select avg(null::int4) from generate_series(1,3); +select avg(null::int8) from generate_series(1,3); +select avg(null::numeric) from generate_series(1,3); +select avg(null::float8) from generate_series(1,3); +select sum('NaN'::numeric) from generate_series(1,3); +select avg('NaN'::numeric) from generate_series(1,3); + +-- verify correct results for infinite inputs +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('1'), ('infinity')) v(x); +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('infinity'), ('1')) v(x); +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('infinity'), ('infinity')) v(x); +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('-infinity'), ('infinity')) v(x); +SELECT sum(x::float8), avg(x::float8), var_pop(x::float8) +FROM (VALUES ('-infinity'), ('-infinity')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('1'), ('infinity')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('1')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('infinity'), ('infinity')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('infinity')) v(x); +SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric) +FROM (VALUES ('-infinity'), ('-infinity')) v(x); + +-- test accuracy with a large input offset +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x); +SELECT avg(x::float8), var_pop(x::float8) +FROM (VALUES (7000000000005), (7000000000007)) v(x); + +-- SQL2003 binary aggregates +SELECT regr_count(b, a) FROM aggtest; +SELECT regr_sxx(b, a) FROM aggtest; +SELECT regr_syy(b, a) FROM aggtest; +SELECT regr_sxy(b, a) FROM aggtest; +SELECT regr_avgx(b, a), regr_avgy(b, a) FROM aggtest; +SELECT regr_r2(b, a) FROM aggtest; +SELECT regr_slope(b, a), regr_intercept(b, a) FROM aggtest; +SELECT covar_pop(b, a), covar_samp(b, a) FROM aggtest; +SELECT corr(b, a) FROM aggtest; + +-- check single-tuple behavior +SELECT covar_pop(1::float8,2::float8), covar_samp(3::float8,4::float8); +SELECT covar_pop(1::float8,'inf'::float8), covar_samp(3::float8,'inf'::float8); +SELECT covar_pop(1::float8,'nan'::float8), covar_samp(3::float8,'nan'::float8); + +-- test accum and combine functions directly +CREATE TABLE regr_test (x float8, y float8); +INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200); +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (10,20,30,80); +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test; +SELECT float8_accum('{4,140,2900}'::float8[], 100); +SELECT float8_regr_accum('{4,140,2900,1290,83075,15050}'::float8[], 200, 100); +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (10,20,30); +SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x) +FROM regr_test WHERE x IN (80,100); +SELECT float8_combine('{3,60,200}'::float8[], '{0,0,0}'::float8[]); +SELECT float8_combine('{0,0,0}'::float8[], '{2,180,200}'::float8[]); +SELECT float8_combine('{3,60,200}'::float8[], '{2,180,200}'::float8[]); +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{0,0,0,0,0,0}'::float8[]); +SELECT float8_regr_combine('{0,0,0,0,0,0}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); +SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[], + '{2,180,200,740,57800,-3400}'::float8[]); +DROP TABLE regr_test; + +-- test count, distinct +SELECT count(four) AS cnt_1000 FROM onek; +SELECT count(DISTINCT four) AS cnt_4 FROM onek; + +select ten, count(*), sum(four) from onek +group by ten order by ten; + +select ten, count(four), sum(DISTINCT four) from onek +group by ten order by ten; + +-- user-defined aggregates +SELECT newavg(four) AS avg_1 FROM onek; +SELECT newsum(four) AS sum_1500 FROM onek; +SELECT newcnt(four) AS cnt_1000 FROM onek; +SELECT newcnt(*) AS cnt_1000 FROM onek; +SELECT oldcnt(*) AS cnt_1000 FROM onek; +SELECT sum2(q1,q2) FROM int8_tbl; + +-- test for outer-level aggregates + +-- this should work +select ten, sum(distinct four) from onek a +group by ten +having exists (select 1 from onek b where sum(distinct a.four) = b.four); + +-- this should fail because subquery has an agg of its own in WHERE +select ten, sum(distinct four) from onek a +group by ten +having exists (select 1 from onek b + where sum(distinct a.four + b.four) = b.four); + +-- Test handling of sublinks within outer-level aggregates. +-- Per bug report from Daniel Grace. +select + (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1))) +from tenk1 o; + +-- Test handling of Params within aggregate arguments in hashed aggregation. +-- Per bug report from Jeevan Chalke. +explain (verbose, costs off) +select s1, s2, sm +from generate_series(1, 3) s1, + lateral (select s2, sum(s1 + s2) sm + from generate_series(1, 3) s2 group by s2) ss +order by 1, 2; +select s1, s2, sm +from generate_series(1, 3) s1, + lateral (select s2, sum(s1 + s2) sm + from generate_series(1, 3) s2 group by s2) ss +order by 1, 2; + +explain (verbose, costs off) +select array(select sum(x+y) s + from generate_series(1,3) y group by y order by s) + from generate_series(1,3) x; +select array(select sum(x+y) s + from generate_series(1,3) y group by y order by s) + from generate_series(1,3) x; + +-- +-- test for bitwise integer aggregates +-- +CREATE TEMPORARY TABLE bitwise_test( + i2 INT2, + i4 INT4, + i8 INT8, + i INTEGER, + x INT2, + y BIT(4) +); + +-- empty case +SELECT + BIT_AND(i2) AS "?", + BIT_OR(i4) AS "?", + BIT_XOR(i8) AS "?" +FROM bitwise_test; + +COPY bitwise_test FROM STDIN NULL 'null'; +1 1 1 1 1 B0101 +3 3 3 null 2 B0100 +7 7 7 3 4 B1100 +\. + +SELECT + BIT_AND(i2) AS "1", + BIT_AND(i4) AS "1", + BIT_AND(i8) AS "1", + BIT_AND(i) AS "?", + BIT_AND(x) AS "0", + BIT_AND(y) AS "0100", + + BIT_OR(i2) AS "7", + BIT_OR(i4) AS "7", + BIT_OR(i8) AS "7", + BIT_OR(i) AS "?", + BIT_OR(x) AS "7", + BIT_OR(y) AS "1101", + + BIT_XOR(i2) AS "5", + BIT_XOR(i4) AS "5", + BIT_XOR(i8) AS "5", + BIT_XOR(i) AS "?", + BIT_XOR(x) AS "7", + BIT_XOR(y) AS "1101" +FROM bitwise_test; + +-- +-- test boolean aggregates +-- +-- first test all possible transition and final states + +SELECT + -- boolean and transitions + -- null because strict + booland_statefunc(NULL, NULL) IS NULL AS "t", + booland_statefunc(TRUE, NULL) IS NULL AS "t", + booland_statefunc(FALSE, NULL) IS NULL AS "t", + booland_statefunc(NULL, TRUE) IS NULL AS "t", + booland_statefunc(NULL, FALSE) IS NULL AS "t", + -- and actual computations + booland_statefunc(TRUE, TRUE) AS "t", + NOT booland_statefunc(TRUE, FALSE) AS "t", + NOT booland_statefunc(FALSE, TRUE) AS "t", + NOT booland_statefunc(FALSE, FALSE) AS "t"; + +SELECT + -- boolean or transitions + -- null because strict + boolor_statefunc(NULL, NULL) IS NULL AS "t", + boolor_statefunc(TRUE, NULL) IS NULL AS "t", + boolor_statefunc(FALSE, NULL) IS NULL AS "t", + boolor_statefunc(NULL, TRUE) IS NULL AS "t", + boolor_statefunc(NULL, FALSE) IS NULL AS "t", + -- actual computations + boolor_statefunc(TRUE, TRUE) AS "t", + boolor_statefunc(TRUE, FALSE) AS "t", + boolor_statefunc(FALSE, TRUE) AS "t", + NOT boolor_statefunc(FALSE, FALSE) AS "t"; + +CREATE TEMPORARY TABLE bool_test( + b1 BOOL, + b2 BOOL, + b3 BOOL, + b4 BOOL); + +-- empty case +SELECT + BOOL_AND(b1) AS "n", + BOOL_OR(b3) AS "n" +FROM bool_test; + +COPY bool_test FROM STDIN NULL 'null'; +TRUE null FALSE null +FALSE TRUE null null +null TRUE FALSE null +\. + +SELECT + BOOL_AND(b1) AS "f", + BOOL_AND(b2) AS "t", + BOOL_AND(b3) AS "f", + BOOL_AND(b4) AS "n", + BOOL_AND(NOT b2) AS "f", + BOOL_AND(NOT b3) AS "t" +FROM bool_test; + +SELECT + EVERY(b1) AS "f", + EVERY(b2) AS "t", + EVERY(b3) AS "f", + EVERY(b4) AS "n", + EVERY(NOT b2) AS "f", + EVERY(NOT b3) AS "t" +FROM bool_test; + +SELECT + BOOL_OR(b1) AS "t", + BOOL_OR(b2) AS "t", + BOOL_OR(b3) AS "f", + BOOL_OR(b4) AS "n", + BOOL_OR(NOT b2) AS "f", + BOOL_OR(NOT b3) AS "t" +FROM bool_test; + +-- +-- Test cases that should be optimized into indexscans instead of +-- the generic aggregate implementation. +-- + +-- Basic cases +explain (costs off) + select min(unique1) from tenk1; +select min(unique1) from tenk1; +explain (costs off) + select max(unique1) from tenk1; +select max(unique1) from tenk1; +explain (costs off) + select max(unique1) from tenk1 where unique1 < 42; +select max(unique1) from tenk1 where unique1 < 42; +explain (costs off) + select max(unique1) from tenk1 where unique1 > 42; +select max(unique1) from tenk1 where unique1 > 42; + +-- the planner may choose a generic aggregate here if parallel query is +-- enabled, since that plan will be parallel safe and the "optimized" +-- plan, which has almost identical cost, will not be. we want to test +-- the optimized plan, so temporarily disable parallel query. +begin; +set local max_parallel_workers_per_gather = 0; +-- In GPDB, we also need to disable seqscans and bitmap scans. +set local enable_seqscan=off; +set local enable_bitmapscan=off; +explain (costs off) + select max(unique1) from tenk1 where unique1 > 42000; +select max(unique1) from tenk1 where unique1 > 42000; +rollback; + +-- multi-column index (uses tenk1_thous_tenthous) +explain (costs off) + select max(tenthous) from tenk1 where thousand = 33; +select max(tenthous) from tenk1 where thousand = 33; +explain (costs off) + select min(tenthous) from tenk1 where thousand = 33; +select min(tenthous) from tenk1 where thousand = 33; + +-- check parameter propagation into an indexscan subquery +-- In GPDB, this cannot use the MIN/MAX optimization, because the subplan +-- parameter cannot be pushed through a Motion node. +explain (costs off) + select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt + from int4_tbl; +select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt + from int4_tbl; + +-- check some cases that were handled incorrectly in 8.3.0 +explain (costs off) + select distinct max(unique2) from tenk1; +select distinct max(unique2) from tenk1; +explain (costs off) + select max(unique2) from tenk1 order by 1; +select max(unique2) from tenk1 order by 1; +explain (costs off) + select max(unique2) from tenk1 order by max(unique2); +select max(unique2) from tenk1 order by max(unique2); +explain (costs off) + select max(unique2) from tenk1 order by max(unique2)+1; +select max(unique2) from tenk1 order by max(unique2)+1; +explain (costs off) + select max(unique2), generate_series(1,3) as g from tenk1 order by g desc; +select max(unique2), generate_series(1,3) as g from tenk1 order by g desc; + +-- interesting corner case: constant gets optimized into a seqscan +explain (costs off) + select max(100) from tenk1; +select max(100) from tenk1; + +-- try it on an inheritance tree +create table minmaxtest(f1 int); +create table minmaxtest1() inherits (minmaxtest); +create table minmaxtest2() inherits (minmaxtest); +create table minmaxtest3() inherits (minmaxtest); +create index minmaxtesti on minmaxtest(f1); +create index minmaxtest1i on minmaxtest1(f1); +create index minmaxtest2i on minmaxtest2(f1 desc); +create index minmaxtest3i on minmaxtest3(f1) where f1 is not null; + +insert into minmaxtest values(11), (12); +insert into minmaxtest1 values(13), (14); +insert into minmaxtest2 values(15), (16); +insert into minmaxtest3 values(17), (18); +analyze minmaxtest; +analyze minmaxtest1; +analyze minmaxtest2; +analyze minmaxtest3; + +set enable_seqscan=off; +explain (costs off) + select min(f1), max(f1) from minmaxtest; +select min(f1), max(f1) from minmaxtest; +reset enable_seqscan; + +-- DISTINCT doesn't do anything useful here, but it shouldn't fail +explain (costs off) + select distinct min(f1), max(f1) from minmaxtest; +select distinct min(f1), max(f1) from minmaxtest; + +drop table minmaxtest cascade; + +-- check for correct detection of nested-aggregate errors +select max(min(unique1)) from tenk1; +select (select max(min(unique1)) from int8_tbl) from tenk1; +select avg((select avg(a1.col1 order by (select avg(a2.col2) from tenk1 a3)) + from tenk1 a1(col1))) +from tenk1 a2(col2); + +-- +-- Test removal of redundant GROUP BY columns +-- + +create temp table t1 (a int, b int, c int, d int, primary key (a, b)); +create temp table t2 (x int, y int, z int, primary key (x, y)); +create temp table t3 (a int, b int, c int, primary key(a, b) deferrable); + +-- Non-primary-key columns can be removed from GROUP BY +explain (costs off) select * from t1 group by a,b,c,d; + +-- No removal can happen if the complete PK is not present in GROUP BY +explain (costs off) select a,c from t1 group by a,c,d; + +-- Test removal across multiple relations +explain (costs off) select * +from t1 inner join t2 on t1.a = t2.x and t1.b = t2.y +group by t1.a,t1.b,t1.c,t1.d,t2.x,t2.y,t2.z; + +-- Test case where t1 can be optimized but not t2 +explain (costs off) select t1.*,t2.x,t2.z +from t1 inner join t2 on t1.a = t2.x and t1.b = t2.y +group by t1.a,t1.b,t1.c,t1.d,t2.x,t2.z; + +-- Cannot optimize when PK is deferrable +explain (costs off) select * from t3 group by a,b,c; + +create temp table t1c () inherits (t1); + +-- Ensure we don't remove any columns when t1 has a child table +explain (costs off) select * from t1 group by a,b,c,d; + +-- Okay to remove columns if we're only querying the parent. +explain (costs off) select * from only t1 group by a,b,c,d; + +create temp table p_t1 ( + a int, + b int, + c int, + d int, + primary key(a,b) +) partition by list(a); +create temp table p_t1_1 partition of p_t1 for values in(1); +create temp table p_t1_2 partition of p_t1 for values in(2); + +-- Ensure we can remove non-PK columns for partitioned tables. +explain (costs off) select * from p_t1 group by a,b,c,d; + +drop table t1 cascade; +drop table t2; +drop table t3; +drop table p_t1; + +-- +-- Test GROUP BY matching of join columns that are type-coerced due to USING +-- + +create temp table t1(f1 int, f2 bigint); +create temp table t2(f1 bigint, f22 bigint); + +select f1 from t1 left join t2 using (f1) group by f1; +select f1 from t1 left join t2 using (f1) group by t1.f1; +select t1.f1 from t1 left join t2 using (f1) group by t1.f1; +-- only this one should fail: +select t1.f1 from t1 left join t2 using (f1) group by f1; + +drop table t1, t2; + +-- +-- Test combinations of DISTINCT and/or ORDER BY +-- + +select array_agg(a order by b) + from (values (1,4),(2,3),(3,1),(4,2)) v(a,b); +select array_agg(a order by a) + from (values (1,4),(2,3),(3,1),(4,2)) v(a,b); +select array_agg(a order by a desc) + from (values (1,4),(2,3),(3,1),(4,2)) v(a,b); +select array_agg(b order by a desc) + from (values (1,4),(2,3),(3,1),(4,2)) v(a,b); + +select array_agg(distinct a) + from (values (1),(2),(1),(3),(null),(2)) v(a); +select array_agg(distinct a order by a) + from (values (1),(2),(1),(3),(null),(2)) v(a); +select array_agg(distinct a order by a desc) + from (values (1),(2),(1),(3),(null),(2)) v(a); +select array_agg(distinct a order by a desc nulls last) + from (values (1),(2),(1),(3),(null),(2)) v(a); + +-- multi-arg aggs, strict/nonstrict, distinct/order by + +select aggfstr(a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); +select aggfns(a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); + +select aggfstr(distinct a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; +select aggfns(distinct a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; + +select aggfstr(distinct a,b,c order by b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; +select aggfns(distinct a,b,c order by b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; + +-- test specific code paths + +select aggfns(distinct a,a,c order by c using ~<~,a) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; +select aggfns(distinct a,a,c order by c using ~<~) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; +select aggfns(distinct a,a,c order by a) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; +select aggfns(distinct a,b,c order by a,c using ~<~,b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + +-- check node I/O via view creation and usage, also deparsing logic + +-- start_ignore +-- pg_get_viewdef() runs some internal queries on catalogs, and we don't want +-- fallback notices about those. +reset optimizer_trace_fallback; +-- end_ignore + +create view agg_view1 as + select aggfns(a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); + +select * from agg_view1; +select pg_get_viewdef('agg_view1'::regclass); + +create or replace view agg_view1 as + select aggfns(distinct a,b,c) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; + +select * from agg_view1; +select pg_get_viewdef('agg_view1'::regclass); + +create or replace view agg_view1 as + select aggfns(distinct a,b,c order by b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,3) i; + +select * from agg_view1; +select pg_get_viewdef('agg_view1'::regclass); + +create or replace view agg_view1 as + select aggfns(a,b,c order by b+1) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); + +select * from agg_view1; +select pg_get_viewdef('agg_view1'::regclass); + +create or replace view agg_view1 as + select aggfns(a,a,c order by b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); + +select * from agg_view1; +select pg_get_viewdef('agg_view1'::regclass); + +create or replace view agg_view1 as + select aggfns(a,b,c order by c using ~<~) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c); + +select * from agg_view1; +select pg_get_viewdef('agg_view1'::regclass); + +create or replace view agg_view1 as + select aggfns(distinct a,b,c order by a,c using ~<~,b) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + +select * from agg_view1; +select pg_get_viewdef('agg_view1'::regclass); + +drop view agg_view1; + +-- start_ignore +SET optimizer_trace_fallback to on; +-- end_ignore + +-- incorrect DISTINCT usage errors + +select aggfns(distinct a,b,c order by i) + from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i; +select aggfns(distinct a,b,c order by a,b+1) + from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i; +select aggfns(distinct a,b,c order by a,b,i,c) + from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i; +select aggfns(distinct a,a,c order by a,b) + from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i; + +-- string_agg tests +select string_agg(a,',') from (values('aaaa'),('bbbb'),('cccc')) g(a); +select string_agg(a,',') from (values('aaaa'),(null),('bbbb'),('cccc')) g(a); +select string_agg(a,'AB') from (values(null),(null),('bbbb'),('cccc')) g(a); +select string_agg(a,',') from (values(null),(null)) g(a); + +-- check some implicit casting cases, as per bug #5564 +select string_agg(distinct f1, ',' order by f1) from varchar_tbl; -- ok +select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not ok +select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok +select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok + +-- FILTER tests + +select min(unique1) filter (where unique1 > 100) from tenk1; + +select ten, sum(distinct four) filter (where four::text ~ '123') from onek a +group by ten; + +select ten, sum(distinct four) filter (where four > 10) from onek a +group by ten +having exists (select 1 from onek b where sum(distinct a.four) = b.four); + +select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0') +from (values ('a', 'b')) AS v(foo,bar); + +-- outer reference in FILTER (PostgreSQL extension) +select (select count(*) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- inner query is aggregation query +select (select count(*) filter (where outer_c <> 0) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- outer query is aggregation query +select (select count(inner_c) filter (where outer_c <> 0) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- inner query is aggregation query +select + (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1)) + filter (where o.unique1 < 10)) +from tenk1 o; -- outer query is aggregation query + +-- subquery in FILTER clause (PostgreSQL extension) +select sum(unique1) FILTER (WHERE + unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1; + +-- exercise lots of aggregate parts with FILTER +select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + +-- ordered-set aggregates + +select p, percentile_cont(p) within group (order by x::float8) +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + +select p, percentile_cont(p order by p) within group (order by x) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + +select p, sum() within group (order by x::float8) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + +select p, percentile_cont(p,p) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + +select percentile_cont(0.5) within group (order by b) from aggtest; +select percentile_cont(0.5) within group (order by b), sum(b) from aggtest; +select percentile_cont(0.5) within group (order by thousand) from tenk1; +select percentile_disc(0.5) within group (order by thousand) from tenk1; +select rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); +select cume_dist(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); +select percent_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4),(5)) v(x); +select dense_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + +select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand) +from tenk1; +select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand) +from tenk1; +select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand) +from tenk1; +select percentile_cont(array[0,1,0.25,0.75,0.5,1]) within group (order by x) +from generate_series(1,6) x; + +select ten, mode() within group (order by string4) from tenk1 group by ten order by ten; + +select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) +from unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]) u(x); + +-- check collation propagates up in suitable cases: +select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) + from (values ('fred'),('jim')) v(x); + +-- ordered-set aggs created with CREATE AGGREGATE +select test_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); +select test_percentile_disc(0.5) within group (order by thousand) from tenk1; + +-- ordered-set aggs can't use ungrouped vars in direct args: +select rank(x) within group (order by x) from generate_series(1,5) x; + +-- outer-level agg can't use a grouped arg of a lower level, either: +select array(select percentile_disc(a) within group (order by x) + from (values (0.3),(0.7)) v(a) group by a) + from generate_series(1,5) g(x); + +-- agg in the direct args is a grouping violation, too: +select rank(sum(x)) within group (order by x) from generate_series(1,5) x; + +-- hypothetical-set type unification and argument-count failures: +select rank(3) within group (order by x) from (values ('fred'),('jim')) v(x); +select rank(3) within group (order by stringu1,stringu2) from tenk1; +select rank('fred') within group (order by x) from generate_series(1,5) x; +select rank('adam'::text collate "C") within group (order by x collate "POSIX") + from (values ('fred'),('jim')) v(x); +-- hypothetical-set type unification successes: +select rank('adam'::varchar) within group (order by x) from (values ('fred'),('jim')) v(x); +select rank('3') within group (order by x) from generate_series(1,5) x; + +-- divide by zero check +select percent_rank(0) within group (order by x) from generate_series(1,0) x; + +-- deparse and multiple features: +create view aggordview1 as +select ten, + percentile_disc(0.5) within group (order by thousand) as p50, + percentile_disc(0.5) within group (order by thousand) filter (where hundred=1) as px, + rank(5,'AZZZZ',50) within group (order by hundred, string4 desc, hundred) + from tenk1 + group by ten order by ten; + +-- start_ignore +-- pg_get_viewdef() runs some internal queries on catalogs, and we don't want +-- fallback notices about those. +reset optimizer_trace_fallback; +-- end_ignore + +select pg_get_viewdef('aggordview1'); +-- start_ignore +SET optimizer_trace_fallback to on; +-- end_ignore +select * from aggordview1 order by ten; +drop view aggordview1; + + +-- variadic aggregates +select least_agg(q1,q2) from int8_tbl; +select least_agg(variadic array[q1,q2]) from int8_tbl; + +-- string_agg bytea tests +create table bytea_test_table(gpDistKey int, v bytea); + +select string_agg(v, '') from bytea_test_table; + +insert into bytea_test_table(v) values(decode('ff','hex')); + +select string_agg(v, '') from bytea_test_table; + +insert into bytea_test_table(v) values(decode('aa','hex')); + +select string_agg(v, '') from bytea_test_table; +select string_agg(v, NULL) from bytea_test_table; +select string_agg(v, decode('ee', 'hex')) from bytea_test_table; + +drop table bytea_test_table; + +-- FILTER tests + +select min(unique1) filter (where unique1 > 100) from tenk1; + +select sum(1/ten) filter (where ten > 0) from tenk1; + +select ten, sum(distinct four) filter (where four::text ~ '123') from onek a +group by ten; + +select ten, sum(distinct four) filter (where four > 10) from onek a +group by ten +having exists (select 1 from onek b where sum(distinct a.four) = b.four); + +select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0') +from (values ('a', 'b')) AS v(foo,bar); + +-- outer reference in FILTER (PostgreSQL extension) +select (select count(*) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- inner query is aggregation query +select (select count(*) filter (where outer_c <> 0) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- outer query is aggregation query +select (select count(inner_c) filter (where outer_c <> 0) + from (values (1)) t0(inner_c)) +from (values (2),(3)) t1(outer_c); -- inner query is aggregation query +select + (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1)) + filter (where o.unique1 < 10)) +from tenk1 o; -- outer query is aggregation query + +-- subquery in FILTER clause (PostgreSQL extension) +select sum(unique1) FILTER (WHERE + unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1; + +-- exercise lots of aggregate parts with FILTER +select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) + from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), + generate_series(1,2) i; + +-- check handling of bare boolean Var in FILTER +select max(0) filter (where b1) from bool_test; +select (select max(0) filter (where b1)) from bool_test; + +-- check for correct detection of nested-aggregate errors in FILTER +select max(unique1) filter (where sum(ten) > 0) from tenk1; +select (select max(unique1) filter (where sum(ten) > 0) from int8_tbl) from tenk1; +select max(unique1) filter (where bool_or(ten > 0)) from tenk1; +select (select max(unique1) filter (where bool_or(ten > 0)) from int8_tbl) from tenk1; + + +-- ordered-set aggregates + +select p, percentile_cont(p) within group (order by x::float8) +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + +select p, percentile_cont(p order by p) within group (order by x) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + +select p, sum() within group (order by x::float8) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + +select p, percentile_cont(p,p) -- error +from generate_series(1,5) x, + (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) +group by p order by p; + +select percentile_cont(0.5) within group (order by b) from aggtest; +select percentile_cont(0.5) within group (order by b), sum(b) from aggtest; +select percentile_cont(0.5) within group (order by thousand) from tenk1; +select percentile_disc(0.5) within group (order by thousand) from tenk1; +select rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); +select cume_dist(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); +select percent_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4),(5)) v(x); +select dense_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); + +select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand) +from tenk1; +select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand) +from tenk1; +select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand) +from tenk1; +select percentile_cont(array[0,1,0.25,0.75,0.5,1,0.3,0.32,0.35,0.38,0.4]) within group (order by x) +from generate_series(1,6) x; + +select ten, mode() within group (order by string4) from tenk1 group by ten; + +select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) +from unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]) u(x); + +-- check collation propagates up in suitable cases: +select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) + from (values ('fred'),('jim')) v(x); + +-- ordered-set aggs created with CREATE AGGREGATE +select test_rank(3) within group (order by x) +from (values (1),(1),(2),(2),(3),(3),(4)) v(x); +select test_percentile_disc(0.5) within group (order by thousand) from tenk1; + +-- ordered-set aggs can't use ungrouped vars in direct args: +select rank(x) within group (order by x) from generate_series(1,5) x; + +-- outer-level agg can't use a grouped arg of a lower level, either: +select array(select percentile_disc(a) within group (order by x) + from (values (0.3),(0.7)) v(a) group by a) + from generate_series(1,5) g(x); + +-- agg in the direct args is a grouping violation, too: +select rank(sum(x)) within group (order by x) from generate_series(1,5) x; + +-- hypothetical-set type unification and argument-count failures: +select rank(3) within group (order by x) from (values ('fred'),('jim')) v(x); +select rank(3) within group (order by stringu1,stringu2) from tenk1; +select rank('fred') within group (order by x) from generate_series(1,5) x; +select rank('adam'::text collate "C") within group (order by x collate "POSIX") + from (values ('fred'),('jim')) v(x); +-- hypothetical-set type unification successes: +select rank('adam'::varchar) within group (order by x) from (values ('fred'),('jim')) v(x); +select rank('3') within group (order by x) from generate_series(1,5) x; + +-- divide by zero check +select percent_rank(0) within group (order by x) from generate_series(1,0) x; + +-- deparse and multiple features: +create view aggordview1 as +select ten, + percentile_disc(0.5) within group (order by thousand) as p50, + percentile_disc(0.5) within group (order by thousand) filter (where hundred=1) as px, + rank(5,'AZZZZ',50) within group (order by hundred, string4 desc, hundred) + from tenk1 + group by ten order by ten; + +-- start_ignore +-- pg_get_viewdef() runs some internal queries on catalogs, and we don't want +-- fallback notices about those. +reset optimizer_trace_fallback; +-- end_ignore +select pg_get_viewdef('aggordview1'); +-- start_ignore +SET optimizer_trace_fallback to on; +-- end_ignore +select * from aggordview1 order by ten; +drop view aggordview1; + +-- variadic aggregates +select least_agg(q1,q2) from int8_tbl; +select least_agg(variadic array[q1,q2]) from int8_tbl; + +select cleast_agg(q1,q2) from int8_tbl; +select cleast_agg(4.5,f1) from int4_tbl; +select cleast_agg(variadic array[4.5,f1]) from int4_tbl; +select pg_typeof(cleast_agg(variadic array[4.5,f1])) from int4_tbl; + +-- test aggregates with common transition functions share the same states +begin work; + +create type avg_state as (total bigint, count bigint); + +create or replace function avg_transfn(state avg_state, n int) returns avg_state as +$$ +declare new_state avg_state; +begin + raise notice 'avg_transfn called with %', n; + if state is null then + if n is not null then + new_state.total := n; + new_state.count := 1; + return new_state; + end if; + return null; + elsif n is not null then + state.total := state.total + n; + state.count := state.count + 1; + return state; + end if; + + return null; +end +$$ language plpgsql; + +create function avg_finalfn(state avg_state) returns int4 as +$$ +begin + if state is null then + return NULL; + else + return state.total / state.count; + end if; +end +$$ language plpgsql; + +create function sum_finalfn(state avg_state) returns int4 as +$$ +begin + if state is null then + return NULL; + else + return state.total; + end if; +end +$$ language plpgsql; + +create aggregate my_avg(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = avg_finalfn +); + +create aggregate my_sum(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = sum_finalfn +); + +-- aggregate state should be shared as aggs are the same. +select my_avg(one),my_avg(one) from (values(1),(3)) t(one); + +-- aggregate state should be shared as transfn is the same for both aggs. +select my_avg(one),my_sum(one) from (values(1),(3)) t(one); + +-- same as previous one, but with DISTINCT, which requires sorting the input. +select my_avg(distinct one),my_sum(distinct one) from (values(1),(3),(1)) t(one); + +-- shouldn't share states due to the distinctness not matching. +select my_avg(distinct one),my_sum(one) from (values(1),(3)) t(one); + +-- shouldn't share states due to the filter clause not matching. +select my_avg(one) filter (where one > 1),my_sum(one) from (values(1),(3)) t(one); + +-- this should not share the state due to different input columns. +select my_avg(one),my_sum(two) from (values(1,2),(3,4)) t(one,two); + +-- exercise cases where OSAs share state +select + percentile_cont(0.5) within group (order by a), + percentile_disc(0.5) within group (order by a) +from (values(1::float8),(3),(5),(7)) t(a); + +select + percentile_cont(0.25) within group (order by a), + percentile_disc(0.5) within group (order by a) +from (values(1::float8),(3),(5),(7)) t(a); + +-- these can't share state currently +select + rank(4) within group (order by a), + dense_rank(4) within group (order by a) +from (values(1),(3),(5),(7)) t(a); + +-- test that aggs with the same sfunc and initcond share the same agg state +create aggregate my_sum_init(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = sum_finalfn, + initcond = '(10,0)' +); + +create aggregate my_avg_init(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = avg_finalfn, + initcond = '(10,0)' +); + +create aggregate my_avg_init2(int4) +( + stype = avg_state, + sfunc = avg_transfn, + finalfunc = avg_finalfn, + initcond = '(4,0)' +); + +-- state should be shared if INITCONDs are matching +select my_sum_init(one),my_avg_init(one) from (values(1),(3)) t(one); + +-- Varying INITCONDs should cause the states not to be shared. +select my_sum_init(one),my_avg_init2(one) from (values(1),(3)) t(one); + +rollback; + +-- test aggregate state sharing to ensure it works if one aggregate has a +-- finalfn and the other one has none. +begin work; + +create or replace function sum_transfn(state int4, n int4) returns int4 as +$$ +declare new_state int4; +begin + raise notice 'sum_transfn called with %', n; + if state is null then + if n is not null then + new_state := n; + return new_state; + end if; + return null; + elsif n is not null then + state := state + n; + return state; + end if; + + return null; +end +$$ language plpgsql; + +create function halfsum_finalfn(state int4) returns int4 as +$$ +begin + if state is null then + return NULL; + else + return state / 2; + end if; +end +$$ language plpgsql; + +create aggregate my_sum(int4) +( + stype = int4, + sfunc = sum_transfn +); + +create aggregate my_half_sum(int4) +( + stype = int4, + sfunc = sum_transfn, + finalfunc = halfsum_finalfn +); + +-- Agg state should be shared even though my_sum has no finalfn +select my_sum(one),my_half_sum(one) from (values(1),(2),(3),(4)) t(one); + +rollback; + + +-- test that the aggregate transition logic correctly handles +-- transition / combine functions returning NULL + +-- First test the case of a normal transition function returning NULL +BEGIN; +CREATE FUNCTION balkifnull(int8, int4) +RETURNS int8 +STRICT +LANGUAGE plpgsql AS $$ +BEGIN + IF $1 IS NULL THEN + RAISE 'erroneously called with NULL argument'; + END IF; + RETURN NULL; +END$$; + +CREATE AGGREGATE balk(int4) +( + SFUNC = balkifnull(int8, int4), + STYPE = int8, + PARALLEL = SAFE, + INITCOND = '0' +); + +SELECT balk(hundred) FROM tenk1; + +ROLLBACK; + +-- Secondly test the case of a parallel aggregate combiner function +-- returning NULL. For that use normal transition function, but a +-- combiner function returning NULL. +BEGIN; +CREATE FUNCTION balkifnull(int8, int8) +RETURNS int8 +PARALLEL SAFE +STRICT +LANGUAGE plpgsql AS $$ +BEGIN + IF $1 IS NULL THEN + RAISE 'erroneously called with NULL argument'; + END IF; + RETURN NULL; +END$$; + +CREATE AGGREGATE balk(int4) +( + SFUNC = int4_sum(int8, int4), + STYPE = int8, + COMBINEFUNC = balkifnull(int8, int8), + PARALLEL = SAFE, + INITCOND = '0' +); + +-- force use of parallelism +-- In single-node, we don't have mutliple-stage aggregation. +-- Thus we don't call combine function, and the result it not empty. +ALTER TABLE tenk1 set (parallel_workers = 4); +SET LOCAL parallel_setup_cost=0; +SET LOCAL max_parallel_workers_per_gather=4; + +EXPLAIN (COSTS OFF) SELECT balk(hundred) FROM tenk1; +SELECT balk(hundred) FROM tenk1; + +ROLLBACK; + +-- test coverage for aggregate combine/serial/deserial functions +BEGIN; + +SET parallel_setup_cost = 0; +SET parallel_tuple_cost = 0; +SET min_parallel_table_scan_size = 0; +SET max_parallel_workers_per_gather = 4; +SET parallel_leader_participation = off; +SET enable_indexonlyscan = off; + +-- variance(int4) covers numeric_poly_combine +-- sum(int8) covers int8_avg_combine +-- regr_count(float8, float8) covers int8inc_float8_float8 and aggregates with > 1 arg +EXPLAIN (COSTS OFF, VERBOSE) +SELECT variance(unique1::int4), sum(unique1::int8), regr_count(unique1::float8, unique1::float8) +FROM (SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1) u; + +SELECT variance(unique1::int4), sum(unique1::int8), regr_count(unique1::float8, unique1::float8) +FROM (SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1) u; + +-- variance(int8) covers numeric_combine +-- avg(numeric) covers numeric_avg_combine +EXPLAIN (COSTS OFF, VERBOSE) +SELECT variance(unique1::int8), avg(unique1::numeric) +FROM (SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1) u; + +SELECT variance(unique1::int8), avg(unique1::numeric) +FROM (SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1 + UNION ALL SELECT * FROM tenk1) u; + +ROLLBACK; + +-- test coverage for dense_rank +SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(1),(2),(2),(3),(3)) v(x) GROUP BY (x) ORDER BY 1; + + +-- Ensure that the STRICT checks for aggregates does not take NULLness +-- of ORDER BY columns into account. See bug report around +-- 2a505161-2727-2473-7c46-591ed108ac52@email.cz +SELECT min(x ORDER BY y) FROM (VALUES(1, NULL)) AS d(x,y); +SELECT min(x ORDER BY y) FROM (VALUES(1, 2)) AS d(x,y); + +-- check collation-sensitive matching between grouping expressions +select v||'a', case v||'a' when 'aa' then 1 else 0 end, count(*) + from unnest(array['a','b']) u(v) + group by v||'a' order by 1; +select v||'a', case when v||'a' = 'aa' then 1 else 0 end, count(*) + from unnest(array['a','b']) u(v) + group by v||'a' order by 1; + +-- Make sure that generation of HashAggregate for uniqification purposes +-- does not lead to array overflow due to unexpected duplicate hash keys +-- see CAFeeJoKKu0u+A_A9R9316djW-YW3-+Gtgvy3ju655qRHR3jtdA@mail.gmail.com +set enable_memoize to off; +explain (costs off) + select 1 from tenk1 + where (hundred, thousand) in (select twothousand, twothousand from onek); +reset enable_memoize; + +-- +-- Hash Aggregation Spill tests +-- + +set enable_sort=false; +set work_mem='64kB'; + +select unique1, count(*), sum(twothousand) from tenk1 +group by unique1 +having sum(fivethous) > 4975 +order by sum(twothousand); + +set work_mem to default; +set enable_sort to default; + +-- +-- Compare results between plans using sorting and plans using hash +-- aggregation. Force spilling in both cases by setting work_mem low. +-- + +set work_mem='64kB'; + +create table agg_data_2k as +select g from generate_series(0, 1999) g; +analyze agg_data_2k; + +create table agg_data_20k as +select g from generate_series(0, 19999) g; +analyze agg_data_20k; + +-- Produce results with sorting. + +set enable_hashagg = false; + +set jit_above_cost = 0; + +explain (costs off) +select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3 + from agg_data_20k group by g%10000; + +create table agg_group_1 as +select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3 + from agg_data_20k group by g%10000; + +/* + * create table agg_group_2 as + * select * from + * (values (100), (300), (500)) as r(a), + * lateral ( + * select (g/2)::numeric as c1, + * array_agg(g::numeric) as c2, + * count(*) as c3 + * from generate_series(0, 1999) g + * where g < r.a + * group by g/2) as s; + */ + +set jit_above_cost to default; + +create table agg_group_3 as +select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3 + from agg_data_2k group by g/2; + +create table agg_group_4 as +select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3 + from agg_data_2k group by g/2; + +-- Produce results with hash aggregation + +set enable_hashagg = true; +set enable_sort = false; + +set jit_above_cost = 0; + +explain (costs off) +select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3 + from agg_data_20k group by g%10000; + +create table agg_hash_1 as +select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3 + from agg_data_20k group by g%10000; + +/* + * create table agg_hash_2 as + * select * from + * (values (100), (300), (500)) as r(a), + * lateral ( + * select (g/2)::numeric as c1, + * array_agg(g::numeric) as c2, + * count(*) as c3 + * from generate_series(0, 1999) g + * where g < r.a + * group by g/2) as s; + */ + +set jit_above_cost to default; + +create table agg_hash_3 as +select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3 + from agg_data_2k group by g/2; + +create table agg_hash_4 as +select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3 + from agg_data_2k group by g/2; + +set enable_sort = true; +set work_mem to default; + +-- Compare group aggregation results to hash aggregation results + +(select * from agg_hash_1 except select * from agg_group_1) + union all +(select * from agg_group_1 except select * from agg_hash_1); + +--(select * from agg_hash_2 except select * from agg_group_2) +-- union all +--(select * from agg_group_2 except select * from agg_hash_2); + +(select * from agg_hash_3 except select * from agg_group_3) + union all +(select * from agg_group_3 except select * from agg_hash_3); + +-- CBDB: array_agg() makes the result unstable, so ignore this check +--(select * from agg_hash_4 except select * from agg_group_4) +-- union all +--(select * from agg_group_4 except select * from agg_hash_4); + +drop table agg_group_1; +-- drop table agg_group_2; +drop table agg_group_3; +drop table agg_group_4; +drop table agg_hash_1; +-- drop table agg_hash_2; +drop table agg_hash_3; +drop table agg_hash_4; + +-- fix github issue #12061 numsegments of general locus is not -1 on create_minmaxagg_path +/* + * On the arm platform, `Seq Scan` is executed frequently, resulting in unstable output. + */ +set enable_indexonlyscan = off; +explain analyze select count(*) from pg_class, (select count(*) >0 from (select count(*) from pg_class where relname like 't%')x)y; diff --git a/src/test/singlenode_regress/sql/alter_generic.sql b/src/test/singlenode_regress/sql/alter_generic.sql new file mode 100644 index 00000000000..8c5d0e5e1f8 --- /dev/null +++ b/src/test/singlenode_regress/sql/alter_generic.sql @@ -0,0 +1,605 @@ +-- +-- Test for ALTER some_object {RENAME TO, OWNER TO, SET SCHEMA} +-- + +-- Clean up in case a prior regression run failed +SET client_min_messages TO 'warning'; + +DROP ROLE IF EXISTS regress_alter_generic_user1; +DROP ROLE IF EXISTS regress_alter_generic_user2; +DROP ROLE IF EXISTS regress_alter_generic_user3; + +RESET client_min_messages; + +CREATE USER regress_alter_generic_user3; +CREATE USER regress_alter_generic_user2; +CREATE USER regress_alter_generic_user1 IN ROLE regress_alter_generic_user3; + +CREATE SCHEMA alt_nsp1; +CREATE SCHEMA alt_nsp2; + +GRANT ALL ON SCHEMA alt_nsp1, alt_nsp2 TO public; + +SET search_path = alt_nsp1, public; + +-- +-- Function and Aggregate +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE FUNCTION alt_func1(int) RETURNS int LANGUAGE sql + AS 'SELECT $1 + 1'; +CREATE FUNCTION alt_func2(int) RETURNS int LANGUAGE sql + AS 'SELECT $1 - 1'; +CREATE AGGREGATE alt_agg1 ( + sfunc1 = int4pl, basetype = int4, stype1 = int4, initcond = 0 +); +CREATE AGGREGATE alt_agg2 ( + sfunc1 = int4mi, basetype = int4, stype1 = int4, initcond = 0 +); +ALTER AGGREGATE alt_func1(int) RENAME TO alt_func3; -- failed (not aggregate) +ALTER AGGREGATE alt_func1(int) OWNER TO regress_alter_generic_user3; -- failed (not aggregate) +ALTER AGGREGATE alt_func1(int) SET SCHEMA alt_nsp2; -- failed (not aggregate) + +ALTER FUNCTION alt_func1(int) RENAME TO alt_func2; -- failed (name conflict) +ALTER FUNCTION alt_func1(int) RENAME TO alt_func3; -- OK +ALTER FUNCTION alt_func2(int) OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER FUNCTION alt_func2(int) OWNER TO regress_alter_generic_user3; -- OK +ALTER FUNCTION alt_func2(int) SET SCHEMA alt_nsp1; -- OK, already there +ALTER FUNCTION alt_func2(int) SET SCHEMA alt_nsp2; -- OK + +ALTER AGGREGATE alt_agg1(int) RENAME TO alt_agg2; -- failed (name conflict) +ALTER AGGREGATE alt_agg1(int) RENAME TO alt_agg3; -- OK +ALTER AGGREGATE alt_agg2(int) OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER AGGREGATE alt_agg2(int) OWNER TO regress_alter_generic_user3; -- OK +ALTER AGGREGATE alt_agg2(int) SET SCHEMA alt_nsp2; -- OK + +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE FUNCTION alt_func1(int) RETURNS int LANGUAGE sql + AS 'SELECT $1 + 2'; +CREATE FUNCTION alt_func2(int) RETURNS int LANGUAGE sql + AS 'SELECT $1 - 2'; +CREATE AGGREGATE alt_agg1 ( + sfunc1 = int4pl, basetype = int4, stype1 = int4, initcond = 100 +); +CREATE AGGREGATE alt_agg2 ( + sfunc1 = int4mi, basetype = int4, stype1 = int4, initcond = -100 +); + +ALTER FUNCTION alt_func3(int) RENAME TO alt_func4; -- failed (not owner) +ALTER FUNCTION alt_func1(int) RENAME TO alt_func4; -- OK +ALTER FUNCTION alt_func3(int) OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER FUNCTION alt_func2(int) OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER FUNCTION alt_func3(int) SET SCHEMA alt_nsp2; -- failed (not owner) +ALTER FUNCTION alt_func2(int) SET SCHEMA alt_nsp2; -- failed (name conflicts) + +ALTER AGGREGATE alt_agg3(int) RENAME TO alt_agg4; -- failed (not owner) +ALTER AGGREGATE alt_agg1(int) RENAME TO alt_agg4; -- OK +ALTER AGGREGATE alt_agg3(int) OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER AGGREGATE alt_agg2(int) OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER AGGREGATE alt_agg3(int) SET SCHEMA alt_nsp2; -- failed (not owner) +ALTER AGGREGATE alt_agg2(int) SET SCHEMA alt_nsp2; -- failed (name conflict) + +RESET SESSION AUTHORIZATION; + +SELECT n.nspname, proname, prorettype::regtype, prokind, a.rolname + FROM pg_proc p, pg_namespace n, pg_authid a + WHERE p.pronamespace = n.oid AND p.proowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, proname; + +-- +-- We would test collations here, but it's not possible because the error +-- messages tend to be nonportable. +-- + +-- +-- Conversion +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE CONVERSION alt_conv1 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +CREATE CONVERSION alt_conv2 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; + +ALTER CONVERSION alt_conv1 RENAME TO alt_conv2; -- failed (name conflict) +ALTER CONVERSION alt_conv1 RENAME TO alt_conv3; -- OK +ALTER CONVERSION alt_conv2 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER CONVERSION alt_conv2 OWNER TO regress_alter_generic_user3; -- OK +ALTER CONVERSION alt_conv2 SET SCHEMA alt_nsp2; -- OK + +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE CONVERSION alt_conv1 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +CREATE CONVERSION alt_conv2 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; + +ALTER CONVERSION alt_conv3 RENAME TO alt_conv4; -- failed (not owner) +ALTER CONVERSION alt_conv1 RENAME TO alt_conv4; -- OK +ALTER CONVERSION alt_conv3 OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER CONVERSION alt_conv2 OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER CONVERSION alt_conv3 SET SCHEMA alt_nsp2; -- failed (not owner) +ALTER CONVERSION alt_conv2 SET SCHEMA alt_nsp2; -- failed (name conflict) + +RESET SESSION AUTHORIZATION; + +SELECT n.nspname, c.conname, a.rolname + FROM pg_conversion c, pg_namespace n, pg_authid a + WHERE c.connamespace = n.oid AND c.conowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, conname; + +-- +-- Foreign Data Wrapper and Foreign Server +-- +CREATE FOREIGN DATA WRAPPER alt_fdw1; +CREATE FOREIGN DATA WRAPPER alt_fdw2; + +CREATE SERVER alt_fserv1 FOREIGN DATA WRAPPER alt_fdw1; +CREATE SERVER alt_fserv2 FOREIGN DATA WRAPPER alt_fdw2; + +ALTER FOREIGN DATA WRAPPER alt_fdw1 RENAME TO alt_fdw2; -- failed (name conflict) +ALTER FOREIGN DATA WRAPPER alt_fdw1 RENAME TO alt_fdw3; -- OK + +ALTER SERVER alt_fserv1 RENAME TO alt_fserv2; -- failed (name conflict) +ALTER SERVER alt_fserv1 RENAME TO alt_fserv3; -- OK + +SELECT fdwname FROM pg_foreign_data_wrapper WHERE fdwname like 'alt_fdw%'; +SELECT srvname FROM pg_foreign_server WHERE srvname like 'alt_fserv%'; + +-- +-- Procedural Language +-- +CREATE LANGUAGE alt_lang1 HANDLER plpgsql_call_handler; +CREATE LANGUAGE alt_lang2 HANDLER plpgsql_call_handler; + +ALTER LANGUAGE alt_lang1 OWNER TO regress_alter_generic_user1; -- OK +ALTER LANGUAGE alt_lang2 OWNER TO regress_alter_generic_user2; -- OK + +SET SESSION AUTHORIZATION regress_alter_generic_user1; +ALTER LANGUAGE alt_lang1 RENAME TO alt_lang2; -- failed (name conflict) +ALTER LANGUAGE alt_lang2 RENAME TO alt_lang3; -- failed (not owner) +ALTER LANGUAGE alt_lang1 RENAME TO alt_lang3; -- OK + +ALTER LANGUAGE alt_lang2 OWNER TO regress_alter_generic_user3; -- failed (not owner) +ALTER LANGUAGE alt_lang3 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER LANGUAGE alt_lang3 OWNER TO regress_alter_generic_user3; -- OK + +RESET SESSION AUTHORIZATION; +SELECT lanname, a.rolname + FROM pg_language l, pg_authid a + WHERE l.lanowner = a.oid AND l.lanname like 'alt_lang%' + ORDER BY lanname; + +-- +-- Operator +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; + +CREATE OPERATOR @-@ ( leftarg = int4, rightarg = int4, procedure = int4mi ); +CREATE OPERATOR @+@ ( leftarg = int4, rightarg = int4, procedure = int4pl ); + +ALTER OPERATOR @+@(int4, int4) OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER OPERATOR @+@(int4, int4) OWNER TO regress_alter_generic_user3; -- OK +ALTER OPERATOR @-@(int4, int4) SET SCHEMA alt_nsp2; -- OK + +SET SESSION AUTHORIZATION regress_alter_generic_user2; + +CREATE OPERATOR @-@ ( leftarg = int4, rightarg = int4, procedure = int4mi ); + +ALTER OPERATOR @+@(int4, int4) OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER OPERATOR @-@(int4, int4) OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER OPERATOR @+@(int4, int4) SET SCHEMA alt_nsp2; -- failed (not owner) +-- can't test this: the error message includes the raw oid of namespace +-- ALTER OPERATOR @-@(int4, int4) SET SCHEMA alt_nsp2; -- failed (name conflict) + +RESET SESSION AUTHORIZATION; + +SELECT n.nspname, oprname, a.rolname, + oprleft::regtype, oprright::regtype, oprcode::regproc + FROM pg_operator o, pg_namespace n, pg_authid a + WHERE o.oprnamespace = n.oid AND o.oprowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, oprname; + +-- +-- OpFamily and OpClass +-- +CREATE OPERATOR FAMILY alt_opf1 USING hash; +CREATE OPERATOR FAMILY alt_opf2 USING hash; +ALTER OPERATOR FAMILY alt_opf1 USING hash OWNER TO regress_alter_generic_user1; +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user1; + +CREATE OPERATOR CLASS alt_opc1 FOR TYPE uuid USING hash AS STORAGE uuid; +CREATE OPERATOR CLASS alt_opc2 FOR TYPE uuid USING hash AS STORAGE uuid; +ALTER OPERATOR CLASS alt_opc1 USING hash OWNER TO regress_alter_generic_user1; +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user1; + +SET SESSION AUTHORIZATION regress_alter_generic_user1; + +ALTER OPERATOR FAMILY alt_opf1 USING hash RENAME TO alt_opf2; -- failed (name conflict) +ALTER OPERATOR FAMILY alt_opf1 USING hash RENAME TO alt_opf3; -- OK +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user3; -- OK +ALTER OPERATOR FAMILY alt_opf2 USING hash SET SCHEMA alt_nsp2; -- OK + +ALTER OPERATOR CLASS alt_opc1 USING hash RENAME TO alt_opc2; -- failed (name conflict) +ALTER OPERATOR CLASS alt_opc1 USING hash RENAME TO alt_opc3; -- OK +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user3; -- OK +ALTER OPERATOR CLASS alt_opc2 USING hash SET SCHEMA alt_nsp2; -- OK + +RESET SESSION AUTHORIZATION; + +CREATE OPERATOR FAMILY alt_opf1 USING hash; +CREATE OPERATOR FAMILY alt_opf2 USING hash; +ALTER OPERATOR FAMILY alt_opf1 USING hash OWNER TO regress_alter_generic_user2; +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user2; + +CREATE OPERATOR CLASS alt_opc1 FOR TYPE macaddr USING hash AS STORAGE macaddr; +CREATE OPERATOR CLASS alt_opc2 FOR TYPE macaddr USING hash AS STORAGE macaddr; +ALTER OPERATOR CLASS alt_opc1 USING hash OWNER TO regress_alter_generic_user2; +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user2; + +SET SESSION AUTHORIZATION regress_alter_generic_user2; + +ALTER OPERATOR FAMILY alt_opf3 USING hash RENAME TO alt_opf4; -- failed (not owner) +ALTER OPERATOR FAMILY alt_opf1 USING hash RENAME TO alt_opf4; -- OK +ALTER OPERATOR FAMILY alt_opf3 USING hash OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER OPERATOR FAMILY alt_opf2 USING hash OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER OPERATOR FAMILY alt_opf3 USING hash SET SCHEMA alt_nsp2; -- failed (not owner) +ALTER OPERATOR FAMILY alt_opf2 USING hash SET SCHEMA alt_nsp2; -- failed (name conflict) + +ALTER OPERATOR CLASS alt_opc3 USING hash RENAME TO alt_opc4; -- failed (not owner) +ALTER OPERATOR CLASS alt_opc1 USING hash RENAME TO alt_opc4; -- OK +ALTER OPERATOR CLASS alt_opc3 USING hash OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER OPERATOR CLASS alt_opc2 USING hash OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER OPERATOR CLASS alt_opc3 USING hash SET SCHEMA alt_nsp2; -- failed (not owner) +ALTER OPERATOR CLASS alt_opc2 USING hash SET SCHEMA alt_nsp2; -- failed (name conflict) + +RESET SESSION AUTHORIZATION; + +SELECT nspname, opfname, amname, rolname + FROM pg_opfamily o, pg_am m, pg_namespace n, pg_authid a + WHERE o.opfmethod = m.oid AND o.opfnamespace = n.oid AND o.opfowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + AND NOT opfname LIKE 'alt_opc%' + ORDER BY nspname, opfname; + +SELECT nspname, opcname, amname, rolname + FROM pg_opclass o, pg_am m, pg_namespace n, pg_authid a + WHERE o.opcmethod = m.oid AND o.opcnamespace = n.oid AND o.opcowner = a.oid + AND n.nspname IN ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, opcname; + +-- ALTER OPERATOR FAMILY ... ADD/DROP + +-- Should work. Textbook case of CREATE / ALTER ADD / ALTER DROP / DROP +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf4 USING btree; +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD + -- int4 vs int2 + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); + +ALTER OPERATOR FAMILY alt_opf4 USING btree DROP + -- int4 vs int2 + OPERATOR 1 (int4, int2) , + OPERATOR 2 (int4, int2) , + OPERATOR 3 (int4, int2) , + OPERATOR 4 (int4, int2) , + OPERATOR 5 (int4, int2) , + FUNCTION 1 (int4, int2) ; +DROP OPERATOR FAMILY alt_opf4 USING btree; +ROLLBACK; + +-- Should fail. Invalid values for ALTER OPERATOR FAMILY .. ADD / DROP +CREATE OPERATOR FAMILY alt_opf4 USING btree; +ALTER OPERATOR FAMILY alt_opf4 USING invalid_index_method ADD OPERATOR 1 < (int4, int2); -- invalid indexing_method +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 6 < (int4, int2); -- operator number should be between 1 and 5 +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 0 < (int4, int2); -- operator number should be between 1 and 5 +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD OPERATOR 1 < ; -- operator without argument types +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD FUNCTION 0 btint42cmp(int4, int2); -- invalid options parsing function +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD FUNCTION 6 btint42cmp(int4, int2); -- function number should be between 1 and 5 +ALTER OPERATOR FAMILY alt_opf4 USING btree ADD STORAGE invalid_storage; -- Ensure STORAGE is not a part of ALTER OPERATOR FAMILY +DROP OPERATOR FAMILY alt_opf4 USING btree; + +-- Should fail. Need to be SUPERUSER to do ALTER OPERATOR FAMILY .. ADD / DROP +BEGIN TRANSACTION; +CREATE ROLE regress_alter_generic_user5 NOSUPERUSER; +CREATE OPERATOR FAMILY alt_opf5 USING btree; +SET ROLE regress_alter_generic_user5; +ALTER OPERATOR FAMILY alt_opf5 USING btree ADD OPERATOR 1 < (int4, int2), FUNCTION 1 btint42cmp(int4, int2); +RESET ROLE; +DROP OPERATOR FAMILY alt_opf5 USING btree; +ROLLBACK; + +-- Should fail. Need rights to namespace for ALTER OPERATOR FAMILY .. ADD / DROP +BEGIN TRANSACTION; +CREATE ROLE regress_alter_generic_user6; +CREATE SCHEMA alt_nsp6; +REVOKE ALL ON SCHEMA alt_nsp6 FROM regress_alter_generic_user6; +CREATE OPERATOR FAMILY alt_nsp6.alt_opf6 USING btree; +SET ROLE regress_alter_generic_user6; +ALTER OPERATOR FAMILY alt_nsp6.alt_opf6 USING btree ADD OPERATOR 1 < (int4, int2); +ROLLBACK; + +-- Should fail. Only two arguments required for ALTER OPERATOR FAMILY ... DROP OPERATOR +CREATE OPERATOR FAMILY alt_opf7 USING btree; +ALTER OPERATOR FAMILY alt_opf7 USING btree ADD OPERATOR 1 < (int4, int2); +ALTER OPERATOR FAMILY alt_opf7 USING btree DROP OPERATOR 1 (int4, int2, int8); +DROP OPERATOR FAMILY alt_opf7 USING btree; + +-- Should work. During ALTER OPERATOR FAMILY ... DROP OPERATOR +-- when left type is the same as right type, a DROP with only one argument type should work +CREATE OPERATOR FAMILY alt_opf8 USING btree; +ALTER OPERATOR FAMILY alt_opf8 USING btree ADD OPERATOR 1 < (int4, int4); +DROP OPERATOR FAMILY alt_opf8 USING btree; + +-- Should work. Textbook case of ALTER OPERATOR FAMILY ... ADD OPERATOR with FOR ORDER BY +CREATE OPERATOR FAMILY alt_opf9 USING gist; +ALTER OPERATOR FAMILY alt_opf9 USING gist ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops; +DROP OPERATOR FAMILY alt_opf9 USING gist; + +-- Should fail. Ensure correct ordering methods in ALTER OPERATOR FAMILY ... ADD OPERATOR .. FOR ORDER BY +CREATE OPERATOR FAMILY alt_opf10 USING btree; +ALTER OPERATOR FAMILY alt_opf10 USING btree ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops; +DROP OPERATOR FAMILY alt_opf10 USING btree; + +-- Should work. Textbook case of ALTER OPERATOR FAMILY ... ADD OPERATOR with FOR ORDER BY +CREATE OPERATOR FAMILY alt_opf11 USING gist; +ALTER OPERATOR FAMILY alt_opf11 USING gist ADD OPERATOR 1 < (int4, int4) FOR ORDER BY float_ops; +ALTER OPERATOR FAMILY alt_opf11 USING gist DROP OPERATOR 1 (int4, int4); +DROP OPERATOR FAMILY alt_opf11 USING gist; + +-- Should fail. btree comparison functions should return INTEGER in ALTER OPERATOR FAMILY ... ADD FUNCTION +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf12 USING btree; +CREATE FUNCTION fn_opf12 (int4, int2) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL; +ALTER OPERATOR FAMILY alt_opf12 USING btree ADD FUNCTION 1 fn_opf12(int4, int2); +DROP OPERATOR FAMILY alt_opf12 USING btree; +ROLLBACK; + +-- Should fail. hash comparison functions should return INTEGER in ALTER OPERATOR FAMILY ... ADD FUNCTION +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf13 USING hash; +CREATE FUNCTION fn_opf13 (int4) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL; +ALTER OPERATOR FAMILY alt_opf13 USING hash ADD FUNCTION 1 fn_opf13(int4); +DROP OPERATOR FAMILY alt_opf13 USING hash; +ROLLBACK; + +-- Should fail. btree comparison functions should have two arguments in ALTER OPERATOR FAMILY ... ADD FUNCTION +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf14 USING btree; +CREATE FUNCTION fn_opf14 (int4) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL; +ALTER OPERATOR FAMILY alt_opf14 USING btree ADD FUNCTION 1 fn_opf14(int4); +DROP OPERATOR FAMILY alt_opf14 USING btree; +ROLLBACK; + +-- Should fail. hash comparison functions should have one argument in ALTER OPERATOR FAMILY ... ADD FUNCTION +BEGIN TRANSACTION; +CREATE OPERATOR FAMILY alt_opf15 USING hash; +CREATE FUNCTION fn_opf15 (int4, int2) RETURNS BIGINT AS 'SELECT NULL::BIGINT;' LANGUAGE SQL; +ALTER OPERATOR FAMILY alt_opf15 USING hash ADD FUNCTION 1 fn_opf15(int4, int2); +DROP OPERATOR FAMILY alt_opf15 USING hash; +ROLLBACK; + +-- Should fail. In gist throw an error when giving different data types for function argument +-- without defining left / right type in ALTER OPERATOR FAMILY ... ADD FUNCTION +CREATE OPERATOR FAMILY alt_opf16 USING gist; +ALTER OPERATOR FAMILY alt_opf16 USING gist ADD FUNCTION 1 btint42cmp(int4, int2); +DROP OPERATOR FAMILY alt_opf16 USING gist; + +-- Should fail. duplicate operator number / function number in ALTER OPERATOR FAMILY ... ADD FUNCTION +CREATE OPERATOR FAMILY alt_opf17 USING btree; +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4), OPERATOR 1 < (int4, int4); -- operator # appears twice in same statement +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4); -- operator 1 requested first-time +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD OPERATOR 1 < (int4, int4); -- operator 1 requested again in separate statement +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 appears twice in same statement +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 appears first time +ALTER OPERATOR FAMILY alt_opf17 USING btree ADD + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); -- procedure 1 requested again in separate statement +DROP OPERATOR FAMILY alt_opf17 USING btree; + + +-- Should fail. Ensure that DROP requests for missing OPERATOR / FUNCTIONS +-- return appropriate message in ALTER OPERATOR FAMILY ... DROP OPERATOR / FUNCTION +CREATE OPERATOR FAMILY alt_opf18 USING btree; +ALTER OPERATOR FAMILY alt_opf18 USING btree DROP OPERATOR 1 (int4, int4); +ALTER OPERATOR FAMILY alt_opf18 USING btree ADD + OPERATOR 1 < (int4, int2) , + OPERATOR 2 <= (int4, int2) , + OPERATOR 3 = (int4, int2) , + OPERATOR 4 >= (int4, int2) , + OPERATOR 5 > (int4, int2) , + FUNCTION 1 btint42cmp(int4, int2); +-- Should fail. Not allowed to have cross-type equalimage function. +ALTER OPERATOR FAMILY alt_opf18 USING btree + ADD FUNCTION 4 (int4, int2) btequalimage(oid); +ALTER OPERATOR FAMILY alt_opf18 USING btree DROP FUNCTION 2 (int4, int4); +DROP OPERATOR FAMILY alt_opf18 USING btree; + +-- Should fail. Invalid opclass options function (#5) specifications. +CREATE OPERATOR FAMILY alt_opf19 USING btree; +ALTER OPERATOR FAMILY alt_opf19 USING btree ADD FUNCTION 5 test_opclass_options_func(internal, text[], bool); +ALTER OPERATOR FAMILY alt_opf19 USING btree ADD FUNCTION 5 (int4) btint42cmp(int4, int2); +ALTER OPERATOR FAMILY alt_opf19 USING btree ADD FUNCTION 5 (int4, int2) btint42cmp(int4, int2); +ALTER OPERATOR FAMILY alt_opf19 USING btree ADD FUNCTION 5 (int4) test_opclass_options_func(internal); -- Ok +ALTER OPERATOR FAMILY alt_opf19 USING btree DROP FUNCTION 5 (int4, int4); +DROP OPERATOR FAMILY alt_opf19 USING btree; + +-- +-- Statistics +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE TABLE alt_regress_1 (a INTEGER, b INTEGER); +CREATE STATISTICS alt_stat1 ON a, b FROM alt_regress_1; +CREATE STATISTICS alt_stat2 ON a, b FROM alt_regress_1; + +ALTER STATISTICS alt_stat1 RENAME TO alt_stat2; -- failed (name conflict) +ALTER STATISTICS alt_stat1 RENAME TO alt_stat3; -- OK +ALTER STATISTICS alt_stat2 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER STATISTICS alt_stat2 OWNER TO regress_alter_generic_user3; -- OK +ALTER STATISTICS alt_stat2 SET SCHEMA alt_nsp2; -- OK + +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE TABLE alt_regress_2 (a INTEGER, b INTEGER); +CREATE STATISTICS alt_stat1 ON a, b FROM alt_regress_2; +CREATE STATISTICS alt_stat2 ON a, b FROM alt_regress_2; + +ALTER STATISTICS alt_stat3 RENAME TO alt_stat4; -- failed (not owner) +ALTER STATISTICS alt_stat1 RENAME TO alt_stat4; -- OK +ALTER STATISTICS alt_stat3 OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER STATISTICS alt_stat2 OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER STATISTICS alt_stat3 SET SCHEMA alt_nsp2; -- failed (not owner) +ALTER STATISTICS alt_stat2 SET SCHEMA alt_nsp2; -- failed (name conflict) + +RESET SESSION AUTHORIZATION; +SELECT nspname, stxname, rolname + FROM pg_statistic_ext s, pg_namespace n, pg_authid a + WHERE s.stxnamespace = n.oid AND s.stxowner = a.oid + AND n.nspname in ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, stxname; + +-- +-- Text Search Dictionary +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE TEXT SEARCH DICTIONARY alt_ts_dict1 (template=simple); +CREATE TEXT SEARCH DICTIONARY alt_ts_dict2 (template=simple); + +ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict2; -- failed (name conflict) +ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict3; -- OK +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user3; -- OK +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 SET SCHEMA alt_nsp2; -- OK + +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE TEXT SEARCH DICTIONARY alt_ts_dict1 (template=simple); +CREATE TEXT SEARCH DICTIONARY alt_ts_dict2 (template=simple); + +ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 RENAME TO alt_ts_dict4; -- failed (not owner) +ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict4; -- OK +ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 SET SCHEMA alt_nsp2; -- failed (not owner) +ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 SET SCHEMA alt_nsp2; -- failed (name conflict) + +RESET SESSION AUTHORIZATION; + +SELECT nspname, dictname, rolname + FROM pg_ts_dict t, pg_namespace n, pg_authid a + WHERE t.dictnamespace = n.oid AND t.dictowner = a.oid + AND n.nspname in ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, dictname; + +-- +-- Text Search Configuration +-- +SET SESSION AUTHORIZATION regress_alter_generic_user1; +CREATE TEXT SEARCH CONFIGURATION alt_ts_conf1 (copy=english); +CREATE TEXT SEARCH CONFIGURATION alt_ts_conf2 (copy=english); + +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf2; -- failed (name conflict) +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf3; -- OK +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user2; -- failed (no role membership) +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user3; -- OK +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 SET SCHEMA alt_nsp2; -- OK + +SET SESSION AUTHORIZATION regress_alter_generic_user2; +CREATE TEXT SEARCH CONFIGURATION alt_ts_conf1 (copy=english); +CREATE TEXT SEARCH CONFIGURATION alt_ts_conf2 (copy=english); + +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 RENAME TO alt_ts_conf4; -- failed (not owner) +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf4; -- OK +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 OWNER TO regress_alter_generic_user2; -- failed (not owner) +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user3; -- failed (no role membership) +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 SET SCHEMA alt_nsp2; -- failed (not owner) +ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 SET SCHEMA alt_nsp2; -- failed (name conflict) + +RESET SESSION AUTHORIZATION; + +SELECT nspname, cfgname, rolname + FROM pg_ts_config t, pg_namespace n, pg_authid a + WHERE t.cfgnamespace = n.oid AND t.cfgowner = a.oid + AND n.nspname in ('alt_nsp1', 'alt_nsp2') + ORDER BY nspname, cfgname; + +-- +-- Text Search Template +-- +CREATE TEXT SEARCH TEMPLATE alt_ts_temp1 (lexize=dsimple_lexize); +CREATE TEXT SEARCH TEMPLATE alt_ts_temp2 (lexize=dsimple_lexize); + +ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp2; -- failed (name conflict) +ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp3; -- OK +ALTER TEXT SEARCH TEMPLATE alt_ts_temp2 SET SCHEMA alt_nsp2; -- OK + +CREATE TEXT SEARCH TEMPLATE alt_ts_temp2 (lexize=dsimple_lexize); +ALTER TEXT SEARCH TEMPLATE alt_ts_temp2 SET SCHEMA alt_nsp2; -- failed (name conflict) + +-- invalid: non-lowercase quoted identifiers +CREATE TEXT SEARCH TEMPLATE tstemp_case ("Init" = init_function); + +SELECT nspname, tmplname + FROM pg_ts_template t, pg_namespace n + WHERE t.tmplnamespace = n.oid AND nspname like 'alt_nsp%' + ORDER BY nspname, tmplname; + +-- +-- Text Search Parser +-- + +CREATE TEXT SEARCH PARSER alt_ts_prs1 + (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +CREATE TEXT SEARCH PARSER alt_ts_prs2 + (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); + +ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs2; -- failed (name conflict) +ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs3; -- OK +ALTER TEXT SEARCH PARSER alt_ts_prs2 SET SCHEMA alt_nsp2; -- OK + +CREATE TEXT SEARCH PARSER alt_ts_prs2 + (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +ALTER TEXT SEARCH PARSER alt_ts_prs2 SET SCHEMA alt_nsp2; -- failed (name conflict) + +-- invalid: non-lowercase quoted identifiers +CREATE TEXT SEARCH PARSER tspars_case ("Start" = start_function); + +SELECT nspname, prsname + FROM pg_ts_parser t, pg_namespace n + WHERE t.prsnamespace = n.oid AND nspname like 'alt_nsp%' + ORDER BY nspname, prsname; + +--- +--- Cleanup resources +--- +DROP FOREIGN DATA WRAPPER alt_fdw2 CASCADE; +DROP FOREIGN DATA WRAPPER alt_fdw3 CASCADE; + +DROP LANGUAGE alt_lang2 CASCADE; +DROP LANGUAGE alt_lang3 CASCADE; + +DROP SCHEMA alt_nsp1 CASCADE; +DROP SCHEMA alt_nsp2 CASCADE; + +DROP USER regress_alter_generic_user1; +DROP USER regress_alter_generic_user2; +DROP USER regress_alter_generic_user3; diff --git a/src/test/singlenode_regress/sql/alter_operator.sql b/src/test/singlenode_regress/sql/alter_operator.sql new file mode 100644 index 00000000000..fd403701657 --- /dev/null +++ b/src/test/singlenode_regress/sql/alter_operator.sql @@ -0,0 +1,100 @@ +CREATE FUNCTION alter_op_test_fn(boolean, boolean) +RETURNS boolean AS $$ SELECT NULL::BOOLEAN; $$ LANGUAGE sql IMMUTABLE; + +CREATE FUNCTION customcontsel(internal, oid, internal, integer) +RETURNS float8 AS 'contsel' LANGUAGE internal STABLE STRICT; + +CREATE OPERATOR === ( + LEFTARG = boolean, + RIGHTARG = boolean, + PROCEDURE = alter_op_test_fn, + COMMUTATOR = ===, + NEGATOR = !==, + RESTRICT = customcontsel, + JOIN = contjoinsel, + HASHES, MERGES +); + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + +-- +-- Reset and set params +-- + +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE); +ALTER OPERATOR === (boolean, boolean) SET (JOIN = NONE); + +SELECT oprrest, oprjoin FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'boolean'::regtype; + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = contsel); +ALTER OPERATOR === (boolean, boolean) SET (JOIN = contjoinsel); + +SELECT oprrest, oprjoin FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'boolean'::regtype; + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE, JOIN = NONE); + +SELECT oprrest, oprjoin FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'boolean'::regtype; + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = customcontsel, JOIN = contjoinsel); + +SELECT oprrest, oprjoin FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'boolean'::regtype; + +SELECT pg_describe_object(refclassid,refobjid,refobjsubid) as ref, deptype +FROM pg_depend +WHERE classid = 'pg_operator'::regclass AND + objid = '===(bool,bool)'::regoperator +ORDER BY 1; + +-- +-- Test invalid options. +-- +ALTER OPERATOR === (boolean, boolean) SET (COMMUTATOR = ====); +ALTER OPERATOR === (boolean, boolean) SET (NEGATOR = ====); +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = non_existent_func); +ALTER OPERATOR === (boolean, boolean) SET (JOIN = non_existent_func); +ALTER OPERATOR === (boolean, boolean) SET (COMMUTATOR = !==); +ALTER OPERATOR === (boolean, boolean) SET (NEGATOR = !==); + +-- invalid: non-lowercase quoted identifiers +ALTER OPERATOR & (bit, bit) SET ("Restrict" = _int_contsel, "Join" = _int_contjoinsel); + +-- +-- Test permission check. Must be owner to ALTER OPERATOR. +-- +CREATE USER regress_alter_op_user; +SET SESSION AUTHORIZATION regress_alter_op_user; + +ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE); + +-- Clean up +RESET SESSION AUTHORIZATION; +DROP USER regress_alter_op_user; +DROP OPERATOR === (boolean, boolean); +DROP FUNCTION customcontsel(internal, oid, internal, integer); +DROP FUNCTION alter_op_test_fn(boolean, boolean); diff --git a/src/test/singlenode_regress/sql/alter_table.sql b/src/test/singlenode_regress/sql/alter_table.sql new file mode 100644 index 00000000000..1935b3ac2ab --- /dev/null +++ b/src/test/singlenode_regress/sql/alter_table.sql @@ -0,0 +1,3065 @@ +set optimizer_print_missing_stats = off; +-- +-- ALTER_TABLE +-- + +-- Clean up in case a prior regression run failed +SET client_min_messages TO 'warning'; +DROP ROLE IF EXISTS regress_alter_table_user1; +RESET client_min_messages; + +CREATE USER regress_alter_table_user1; + +-- +-- add attribute +-- + +CREATE TABLE attmp (initial int4); + +COMMENT ON TABLE attmp_wrong IS 'table comment'; +COMMENT ON TABLE attmp IS 'table comment'; +COMMENT ON TABLE attmp IS NULL; + +ALTER TABLE attmp ADD COLUMN xmin integer; -- fails + +ALTER TABLE attmp ADD COLUMN a int4 default 3; + +ALTER TABLE attmp ADD COLUMN b name; + +ALTER TABLE attmp ADD COLUMN c text; + +ALTER TABLE attmp ADD COLUMN d float8; + +ALTER TABLE attmp ADD COLUMN e float4; + +ALTER TABLE attmp ADD COLUMN f int2; + +ALTER TABLE attmp ADD COLUMN g polygon; + +ALTER TABLE attmp ADD COLUMN i char; + +ALTER TABLE attmp ADD COLUMN k int4; + +ALTER TABLE attmp ADD COLUMN l tid; + +ALTER TABLE attmp ADD COLUMN m xid; + +ALTER TABLE attmp ADD COLUMN n oidvector; + +--ALTER TABLE attmp ADD COLUMN o lock; +ALTER TABLE attmp ADD COLUMN p boolean; + +ALTER TABLE attmp ADD COLUMN q point; + +ALTER TABLE attmp ADD COLUMN r lseg; + +ALTER TABLE attmp ADD COLUMN s path; + +ALTER TABLE attmp ADD COLUMN t box; + +ALTER TABLE attmp ADD COLUMN v timestamp; + +ALTER TABLE attmp ADD COLUMN w interval; + +ALTER TABLE attmp ADD COLUMN x float8[]; + +ALTER TABLE attmp ADD COLUMN y float4[]; + +ALTER TABLE attmp ADD COLUMN z int2[]; + +INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, + v, w, x, y, z) + VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)', + 'c', + 314159, '(1,1)', '512', + '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', + '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', + 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); + +SELECT * FROM attmp; + +DROP TABLE attmp; + +-- the wolf bug - schema mods caused inconsistent row descriptors +CREATE TABLE attmp ( + initial int4 +); + +ALTER TABLE attmp ADD COLUMN a int4; + +ALTER TABLE attmp ADD COLUMN b name; + +ALTER TABLE attmp ADD COLUMN c text; + +ALTER TABLE attmp ADD COLUMN d float8; + +ALTER TABLE attmp ADD COLUMN e float4; + +ALTER TABLE attmp ADD COLUMN f int2; + +ALTER TABLE attmp ADD COLUMN g polygon; + +ALTER TABLE attmp ADD COLUMN i char; + +ALTER TABLE attmp ADD COLUMN k int4; + +ALTER TABLE attmp ADD COLUMN l tid; + +ALTER TABLE attmp ADD COLUMN m xid; + +ALTER TABLE attmp ADD COLUMN n oidvector; + +--ALTER TABLE attmp ADD COLUMN o lock; +ALTER TABLE attmp ADD COLUMN p boolean; + +ALTER TABLE attmp ADD COLUMN q point; + +ALTER TABLE attmp ADD COLUMN r lseg; + +ALTER TABLE attmp ADD COLUMN s path; + +ALTER TABLE attmp ADD COLUMN t box; + +ALTER TABLE attmp ADD COLUMN v timestamp; + +ALTER TABLE attmp ADD COLUMN w interval; + +ALTER TABLE attmp ADD COLUMN x float8[]; + +ALTER TABLE attmp ADD COLUMN y float4[]; + +ALTER TABLE attmp ADD COLUMN z int2[]; + +INSERT INTO attmp (a, b, c, d, e, f, g, i, k, l, m, n, p, q, r, s, t, + v, w, x, y, z) + VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)', + 'c', + 314159, '(1,1)', '512', + '1 2 3 4 5 6 7 8', true, '(1.1,1.1)', '(4.1,4.1,3.1,3.1)', + '(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', + 'epoch', '01:00:10', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}'); + +SELECT * FROM attmp; + +CREATE INDEX attmp_idx ON attmp (a, (d + e), b); + +ALTER INDEX attmp_idx ALTER COLUMN 0 SET STATISTICS 1000; + +ALTER INDEX attmp_idx ALTER COLUMN 1 SET STATISTICS 1000; + +ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS 1000; + +\d+ attmp_idx + +ALTER INDEX attmp_idx ALTER COLUMN 3 SET STATISTICS 1000; + +ALTER INDEX attmp_idx ALTER COLUMN 4 SET STATISTICS 1000; + +ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1; + +DROP TABLE attmp; + +-- fails with incorrect object type +CREATE VIEW at_v1 AS SELECT 1 as a; +ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; +DROP VIEW at_v1; + +-- +-- rename - check on both non-temp and temp tables +-- +CREATE TABLE attmp (regtable int); +CREATE TEMP TABLE attmp (attmptable int); + +ALTER TABLE attmp RENAME TO attmp_new; + +SELECT * FROM attmp; +SELECT * FROM attmp_new; + +ALTER TABLE attmp RENAME TO attmp_new2; + +SELECT * FROM attmp; -- should fail +SELECT * FROM attmp_new; +SELECT * FROM attmp_new2; + +DROP TABLE attmp_new; +DROP TABLE attmp_new2; + +-- check rename of partitioned tables and indexes also +CREATE TABLE part_attmp (a int primary key) partition by range (a); +CREATE TABLE part_attmp1 PARTITION OF part_attmp FOR VALUES FROM (0) TO (100); +ALTER INDEX part_attmp_pkey RENAME TO part_attmp_index; +ALTER INDEX part_attmp1_pkey RENAME TO part_attmp1_index; +ALTER TABLE part_attmp RENAME TO part_at2tmp; +-- ALTER TABLE part_attmp1 RENAME TO part_at2tmp1; -- GPDB cascades parent rename to child partition +SET ROLE regress_alter_table_user1; +ALTER INDEX part_attmp_index RENAME TO fail; +ALTER INDEX part_attmp1_index RENAME TO fail; +ALTER TABLE part_at2tmp RENAME TO fail; +-- ALTER TABLE part_at2tmp1 RENAME TO fail; -- GPDB cascades parent rename to child partiti +RESET ROLE; +DROP TABLE part_at2tmp; + +-- +-- check renaming to a table's array type's autogenerated name +-- (the array type's name should get out of the way) +-- +CREATE TABLE attmp_array (id int); +CREATE TABLE attmp_array2 (id int); +SELECT typname FROM pg_type WHERE oid = 'attmp_array[]'::regtype; +SELECT typname FROM pg_type WHERE oid = 'attmp_array2[]'::regtype; +ALTER TABLE attmp_array2 RENAME TO _attmp_array; +SELECT typname FROM pg_type WHERE oid = 'attmp_array[]'::regtype; +SELECT typname FROM pg_type WHERE oid = '_attmp_array[]'::regtype; +DROP TABLE _attmp_array; +DROP TABLE attmp_array; + +-- renaming to table's own array type's name is an interesting corner case +CREATE TABLE attmp_array (id int); +SELECT typname FROM pg_type WHERE oid = 'attmp_array[]'::regtype; +ALTER TABLE attmp_array RENAME TO _attmp_array; +SELECT typname FROM pg_type WHERE oid = '_attmp_array[]'::regtype; +DROP TABLE _attmp_array; + +-- ALTER TABLE ... RENAME on non-table relations +-- renaming indexes (FIXME: this should probably test the index's functionality) +ALTER INDEX IF EXISTS __onek_unique1 RENAME TO attmp_onek_unique1; +ALTER INDEX IF EXISTS __attmp_onek_unique1 RENAME TO onek_unique1; + +ALTER INDEX onek_unique1 RENAME TO attmp_onek_unique1; +ALTER INDEX attmp_onek_unique1 RENAME TO onek_unique1; + +SET ROLE regress_alter_table_user1; +ALTER INDEX onek_unique1 RENAME TO fail; -- permission denied +RESET ROLE; + +-- rename statements with mismatching statement and object types +CREATE TABLE alter_idx_rename_test (a INT); +CREATE INDEX alter_idx_rename_test_idx ON alter_idx_rename_test (a); +CREATE TABLE alter_idx_rename_test_parted (a INT) PARTITION BY LIST (a); +CREATE INDEX alter_idx_rename_test_parted_idx ON alter_idx_rename_test_parted (a); +BEGIN; +ALTER INDEX alter_idx_rename_test RENAME TO alter_idx_rename_test_2; +ALTER INDEX alter_idx_rename_test_parted RENAME TO alter_idx_rename_test_parted_2; +SELECT relation::regclass, mode FROM pg_locks +WHERE pid = pg_backend_pid() AND locktype = 'relation' + AND relation::regclass::text LIKE 'alter\_idx%' +ORDER BY relation::regclass::text COLLATE "C"; +COMMIT; +BEGIN; +ALTER INDEX alter_idx_rename_test_idx RENAME TO alter_idx_rename_test_idx_2; +ALTER INDEX alter_idx_rename_test_parted_idx RENAME TO alter_idx_rename_test_parted_idx_2; +SELECT relation::regclass, mode FROM pg_locks +WHERE pid = pg_backend_pid() AND locktype = 'relation' + AND relation::regclass::text LIKE 'alter\_idx%' +ORDER BY relation::regclass::text COLLATE "C"; +COMMIT; +BEGIN; +ALTER TABLE alter_idx_rename_test_idx_2 RENAME TO alter_idx_rename_test_idx_3; +ALTER TABLE alter_idx_rename_test_parted_idx_2 RENAME TO alter_idx_rename_test_parted_idx_3; +SELECT relation::regclass, mode FROM pg_locks +WHERE pid = pg_backend_pid() AND locktype = 'relation' + AND relation::regclass::text LIKE 'alter\_idx%' +ORDER BY relation::regclass::text COLLATE "C"; +COMMIT; +DROP TABLE alter_idx_rename_test_2; + +-- renaming views +CREATE VIEW attmp_view (unique1) AS SELECT unique1 FROM tenk1; +ALTER TABLE attmp_view RENAME TO attmp_view_new; + +SET ROLE regress_alter_table_user1; +ALTER VIEW attmp_view_new RENAME TO fail; -- permission denied +RESET ROLE; + +-- hack to ensure we get an indexscan here +set enable_seqscan to off; +set enable_bitmapscan to off; +-- 5 values, sorted +SELECT unique1 FROM tenk1 WHERE unique1 < 5 ORDER BY 1; +reset enable_seqscan; +reset enable_bitmapscan; + +DROP VIEW attmp_view_new; +-- toast-like relation name +alter table stud_emp rename to pg_toast_stud_emp; +alter table pg_toast_stud_emp rename to stud_emp; + +-- renaming index should rename constraint as well +ALTER TABLE onek ADD CONSTRAINT onek_unique1_constraint UNIQUE (unique1); +ALTER INDEX onek_unique1_constraint RENAME TO onek_unique1_constraint_foo; +ALTER TABLE onek DROP CONSTRAINT onek_unique1_constraint_foo; + +-- renaming constraint +ALTER TABLE onek ADD CONSTRAINT onek_check_constraint CHECK (unique1 >= 0); +ALTER TABLE onek RENAME CONSTRAINT onek_check_constraint TO onek_check_constraint_foo; +ALTER TABLE onek DROP CONSTRAINT onek_check_constraint_foo; + +-- renaming constraint should rename index as well +ALTER TABLE onek ADD CONSTRAINT onek_unique1_constraint UNIQUE (unique1); +DROP INDEX onek_unique1_constraint; -- to see whether it's there +ALTER TABLE onek RENAME CONSTRAINT onek_unique1_constraint TO onek_unique1_constraint_foo; +DROP INDEX onek_unique1_constraint_foo; -- to see whether it's there +ALTER TABLE onek DROP CONSTRAINT onek_unique1_constraint_foo; + +-- renaming constraints vs. inheritance +CREATE TABLE constraint_rename_test (a int CONSTRAINT con1 CHECK (a > 0), b int, c int); +\d constraint_rename_test +CREATE TABLE constraint_rename_test2 (a int CONSTRAINT con1 CHECK (a > 0), d int) INHERITS (constraint_rename_test); +\d constraint_rename_test2 +ALTER TABLE constraint_rename_test2 RENAME CONSTRAINT con1 TO con1foo; -- fail +ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con1 TO con1foo; -- fail +ALTER TABLE constraint_rename_test RENAME CONSTRAINT con1 TO con1foo; -- ok +\d constraint_rename_test +\d constraint_rename_test2 +ALTER TABLE constraint_rename_test ADD CONSTRAINT con2 CHECK (b > 0) NO INHERIT; +ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con2 TO con2foo; -- ok +ALTER TABLE constraint_rename_test RENAME CONSTRAINT con2foo TO con2bar; -- ok +\d constraint_rename_test +\d constraint_rename_test2 +ALTER TABLE constraint_rename_test ADD CONSTRAINT con3 PRIMARY KEY (a); +ALTER TABLE constraint_rename_test RENAME CONSTRAINT con3 TO con3foo; -- ok +\d constraint_rename_test +\d constraint_rename_test2 +DROP TABLE constraint_rename_test2; +DROP TABLE constraint_rename_test; +ALTER TABLE IF EXISTS constraint_not_exist RENAME CONSTRAINT con3 TO con3foo; -- ok +ALTER TABLE IF EXISTS constraint_rename_test ADD CONSTRAINT con4 UNIQUE (a); + +-- renaming constraints with cache reset of target relation +CREATE TABLE constraint_rename_cache (a int, + CONSTRAINT chk_a CHECK (a > 0), + PRIMARY KEY (a)); +ALTER TABLE constraint_rename_cache + RENAME CONSTRAINT chk_a TO chk_a_new; +ALTER TABLE constraint_rename_cache + RENAME CONSTRAINT constraint_rename_cache_pkey TO constraint_rename_pkey_new; +CREATE TABLE like_constraint_rename_cache + (LIKE constraint_rename_cache INCLUDING ALL); +\d like_constraint_rename_cache +DROP TABLE constraint_rename_cache; +DROP TABLE like_constraint_rename_cache; + +-- FOREIGN KEY CONSTRAINT adding TEST + +CREATE TABLE attmp2 (a int primary key); + +CREATE TABLE attmp3 (a int, b int); + +CREATE TABLE attmp4 (a int, b int, unique(a,b)); + +CREATE TABLE attmp5 (a int, b int); + +-- Insert rows into attmp2 (pktable) +INSERT INTO attmp2 values (1); +INSERT INTO attmp2 values (2); +INSERT INTO attmp2 values (3); +INSERT INTO attmp2 values (4); + +-- Insert rows into attmp3 +INSERT INTO attmp3 values (1,10); +INSERT INTO attmp3 values (1,20); +INSERT INTO attmp3 values (5,50); + +-- Try (and fail) to add constraint due to invalid source columns +ALTER TABLE attmp3 add constraint attmpconstr foreign key(c) references attmp2 match full; + +-- Try (and fail) to add constraint due to invalid destination columns explicitly given +ALTER TABLE attmp3 add constraint attmpconstr foreign key(a) references attmp2(b) match full; + +-- Try (and fail) to add constraint due to invalid data +-- (passes on GPDB, because GPDB doesn't enforce foreign keys) +ALTER TABLE attmp3 add constraint attmpconstr foreign key (a) references attmp2 match full; + +-- Delete failing row +DELETE FROM attmp3 where a=5; + +-- Try (and succeed) +ALTER TABLE attmp3 add constraint attmpconstr foreign key (a) references attmp2 match full; +ALTER TABLE attmp3 drop constraint attmpconstr; + +INSERT INTO attmp3 values (5,50); + +-- Try NOT VALID and then VALIDATE CONSTRAINT, but fails. Delete failure then re-validate +ALTER TABLE attmp3 add constraint attmpconstr foreign key (a) references attmp2 match full NOT VALID; +-- FK constraints are not supported in GPDB +--start_ignore +ALTER TABLE attmp3 validate constraint attmpconstr; +--end_ignore + +-- Delete failing row +DELETE FROM attmp3 where a=5; + +-- Try (and succeed) and repeat to show it works on already valid constraint +--start_ignore +ALTER TABLE attmp3 validate constraint attmpconstr; +ALTER TABLE attmp3 validate constraint attmpconstr; +--end_ignore + +-- Try a non-verified CHECK constraint +ALTER TABLE attmp3 ADD CONSTRAINT b_greater_than_ten CHECK (b > 10); -- fail +ALTER TABLE attmp3 ADD CONSTRAINT b_greater_than_ten CHECK (b > 10) NOT VALID; -- succeeds +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_greater_than_ten; -- fails +DELETE FROM attmp3 WHERE NOT b > 10; +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_greater_than_ten; -- succeeds +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_greater_than_ten; -- succeeds + +-- Test inherited NOT VALID CHECK constraints +select * from attmp3; +CREATE TABLE attmp6 () INHERITS (attmp3); +CREATE TABLE attmp7 () INHERITS (attmp3); + +INSERT INTO attmp6 VALUES (6, 30), (7, 16); +ALTER TABLE attmp3 ADD CONSTRAINT b_le_20 CHECK (b <= 20) NOT VALID; +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_le_20; -- fails +DELETE FROM attmp6 WHERE b > 20; +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_le_20; -- succeeds + +-- An already validated constraint must not be revalidated +CREATE FUNCTION boo(int) RETURNS int IMMUTABLE STRICT LANGUAGE plpgsql AS $$ BEGIN RAISE NOTICE 'boo: %', $1; RETURN $1; END; $$; +INSERT INTO attmp7 VALUES (8, 18); +ALTER TABLE attmp7 ADD CONSTRAINT identity CHECK (b = boo(b)); +ALTER TABLE attmp3 ADD CONSTRAINT IDENTITY check (b = boo(b)) NOT VALID; +ALTER TABLE attmp3 VALIDATE CONSTRAINT identity; + +-- A NO INHERIT constraint should not be looked for in children during VALIDATE CONSTRAINT +create table parent_noinh_convalid (a int); +create table child_noinh_convalid () inherits (parent_noinh_convalid); +insert into parent_noinh_convalid values (1); +insert into child_noinh_convalid values (1); +alter table parent_noinh_convalid add constraint check_a_is_2 check (a = 2) no inherit not valid; +-- fail, because of the row in parent +alter table parent_noinh_convalid validate constraint check_a_is_2; +delete from only parent_noinh_convalid; +-- ok (parent itself contains no violating rows) +alter table parent_noinh_convalid validate constraint check_a_is_2; +select convalidated from pg_constraint where conrelid = 'parent_noinh_convalid'::regclass and conname = 'check_a_is_2'; +-- cleanup +drop table parent_noinh_convalid, child_noinh_convalid; + +-- Try (and fail) to create constraint from attmp5(a) to attmp4(a) - unique constraint on +-- attmp4 is a,b + +ALTER TABLE attmp5 add constraint attmpconstr foreign key(a) references attmp4(a) match full; + +DROP TABLE attmp7; + +DROP TABLE attmp6; + +DROP TABLE attmp5; + +DROP TABLE attmp4; + +DROP TABLE attmp3; + +DROP TABLE attmp2; + +-- NOT VALID with plan invalidation -- ensure we don't use a constraint for +-- exclusion until validated +set constraint_exclusion TO 'partition'; +create table nv_parent (d date, check (false) no inherit not valid); +-- not valid constraint added at creation time should automatically become valid +\d nv_parent + +create table nv_child_2010 () inherits (nv_parent); +create table nv_child_2011 () inherits (nv_parent); +alter table nv_child_2010 add check (d between '2010-01-01'::date and '2010-12-31'::date) not valid; +alter table nv_child_2011 add check (d between '2011-01-01'::date and '2011-12-31'::date) not valid; +explain (costs off) select * from nv_parent where d between '2011-08-01' and '2011-08-31'; +create table nv_child_2009 (check (d between '2009-01-01'::date and '2009-12-31'::date)) inherits (nv_parent); +explain (costs off) select * from nv_parent where d between '2011-08-01'::date and '2011-08-31'::date; +explain (costs off) select * from nv_parent where d between '2009-08-01'::date and '2009-08-31'::date; +-- after validation, the constraint should be used +alter table nv_child_2011 VALIDATE CONSTRAINT nv_child_2011_d_check; +explain (costs off) select * from nv_parent where d between '2009-08-01'::date and '2009-08-31'::date; + +-- add an inherited NOT VALID constraint +alter table nv_parent add check (d between '2001-01-01'::date and '2099-12-31'::date) not valid; +\d nv_child_2009 +-- we leave nv_parent and children around to help test pg_dump logic + +-- Foreign key adding test with mixed types + +-- Note: these tables are TEMP to avoid name conflicts when this test +-- is run in parallel with foreign_key.sql. + +CREATE TEMP TABLE PKTABLE (ptest1 int PRIMARY KEY); +INSERT INTO PKTABLE VALUES(42); +CREATE TEMP TABLE FKTABLE (ftest1 inet); +-- This next should fail, because int=inet does not exist +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; +-- This should also fail for the same reason, but here we +-- give the column name +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable(ptest1); +DROP TABLE FKTABLE; +-- This should succeed, even though they are different types, +-- because int=int8 exists and is a member of the integer opfamily +CREATE TEMP TABLE FKTABLE (ftest1 int8); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; +-- Check it actually works +INSERT INTO FKTABLE VALUES(42); -- should succeed +INSERT INTO FKTABLE VALUES(43); -- should fail +DROP TABLE FKTABLE; +-- This should fail, because we'd have to cast numeric to int which is +-- not an implicit coercion (or use numeric=numeric, but that's not part +-- of the integer opfamily) +CREATE TEMP TABLE FKTABLE (ftest1 numeric); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- On the other hand, this should work because int implicitly promotes to +-- numeric, and we allow promotion on the FK side +CREATE TEMP TABLE PKTABLE (ptest1 numeric PRIMARY KEY); +INSERT INTO PKTABLE VALUES(42); +CREATE TEMP TABLE FKTABLE (ftest1 int); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; +-- Check it actually works +INSERT INTO FKTABLE VALUES(42); -- should succeed +INSERT INTO FKTABLE VALUES(43); -- should fail +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +CREATE TEMP TABLE PKTABLE (ptest1 int, ptest2 inet, + PRIMARY KEY(ptest1, ptest2)); +-- This should fail, because we just chose really odd types +CREATE TEMP TABLE FKTABLE (ftest1 cidr, ftest2 timestamp); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1, ftest2) references pktable; +DROP TABLE FKTABLE; +-- Again, so should this... +CREATE TEMP TABLE FKTABLE (ftest1 cidr, ftest2 timestamp); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1, ftest2) + references pktable(ptest1, ptest2); +DROP TABLE FKTABLE; +-- This fails because we mixed up the column ordering +CREATE TEMP TABLE FKTABLE (ftest1 int, ftest2 inet); +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1, ftest2) + references pktable(ptest2, ptest1); +-- As does this... +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest2, ftest1) + references pktable(ptest1, ptest2); +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- Test that ALTER CONSTRAINT updates trigger deferrability properly + +CREATE TEMP TABLE PKTABLE (ptest1 int primary key); +CREATE TEMP TABLE FKTABLE (ftest1 int); + +ALTER TABLE FKTABLE ADD CONSTRAINT fknd FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION NOT DEFERRABLE; +ALTER TABLE FKTABLE ADD CONSTRAINT fkdd FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE FKTABLE ADD CONSTRAINT fkdi FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY IMMEDIATE; + +ALTER TABLE FKTABLE ADD CONSTRAINT fknd2 FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE FKTABLE ALTER CONSTRAINT fknd2 NOT DEFERRABLE; +ALTER TABLE FKTABLE ADD CONSTRAINT fkdd2 FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION NOT DEFERRABLE; +ALTER TABLE FKTABLE ALTER CONSTRAINT fkdd2 DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE FKTABLE ADD CONSTRAINT fkdi2 FOREIGN KEY(ftest1) REFERENCES pktable + ON DELETE CASCADE ON UPDATE NO ACTION NOT DEFERRABLE; +ALTER TABLE FKTABLE ALTER CONSTRAINT fkdi2 DEFERRABLE INITIALLY IMMEDIATE; + +SELECT conname, tgfoid::regproc, tgtype, tgdeferrable, tginitdeferred +FROM pg_trigger JOIN pg_constraint con ON con.oid = tgconstraint +WHERE tgrelid = 'pktable'::regclass +ORDER BY 1,2,3; +SELECT conname, tgfoid::regproc, tgtype, tgdeferrable, tginitdeferred +FROM pg_trigger JOIN pg_constraint con ON con.oid = tgconstraint +WHERE tgrelid = 'fktable'::regclass +ORDER BY 1,2,3; + +-- temp tables should go away by themselves, need not drop them. + +-- test check constraint adding + +create table atacc1 ( test int ); +-- add a check constraint +alter table atacc1 add constraint atacc_test1 check (test>3); +-- start_ignore +-- Known_opt_diff: MPP-21330 +-- end_ignore +-- should fail +insert into atacc1 (test) values (2); +-- should succeed +insert into atacc1 (test) values (4); +drop table atacc1; + +-- let's do one where the check fails when added +create table atacc1 ( test int ); +-- insert a soon to be failing row +insert into atacc1 (test) values (2); +-- add a check constraint (fails) +alter table atacc1 add constraint atacc_test1 check (test>3); +insert into atacc1 (test) values (4); +drop table atacc1; + +-- let's do one where the check fails because the column doesn't exist +create table atacc1 ( test int ); +-- add a check constraint (fails) +alter table atacc1 add constraint atacc_test1 check (test1>3); +drop table atacc1; + +-- something a little more complicated +create table atacc1 ( test int, test2 int, test3 int); +-- add a check constraint (fails) +alter table atacc1 add constraint atacc_test1 check (test+test23), test2 int); +alter table atacc1 add check (test2>test); +-- should fail for $2 +insert into atacc1 (test2, test) values (3, 4); +drop table atacc1; + +-- inheritance related tests +create table atacc1 (test int); +create table atacc2 (test2 int); +create table atacc3 (test3 int) inherits (atacc1, atacc2); +alter table atacc2 add constraint foo check (test2>0); +-- fail and then succeed on atacc2 +insert into atacc2 (test2) values (-3); +insert into atacc2 (test2) values (3); +-- fail and then succeed on atacc3 +insert into atacc3 (test2) values (-3); +insert into atacc3 (test2) values (3); +drop table atacc3; +drop table atacc2; +drop table atacc1; + +-- same things with one created with INHERIT +create table atacc1 (test int); +create table atacc2 (test2 int); +create table atacc3 (test3 int) inherits (atacc1, atacc2); +alter table atacc3 no inherit atacc2; +-- fail +alter table atacc3 no inherit atacc2; +-- make sure it really isn't a child +insert into atacc3 (test2) values (3); +select test2 from atacc2; +-- fail due to missing constraint +alter table atacc2 add constraint foo check (test2>0); +alter table atacc3 inherit atacc2; +-- fail due to missing column +alter table atacc3 rename test2 to testx; +alter table atacc3 inherit atacc2; +-- fail due to mismatched data type +alter table atacc3 add test2 bool; +alter table atacc3 inherit atacc2; +alter table atacc3 drop test2; +-- succeed +alter table atacc3 add test2 int; +update atacc3 set test2 = 4 where test2 is null; +alter table atacc3 add constraint foo check (test2>0); +alter table atacc3 inherit atacc2; +-- fail due to duplicates and circular inheritance +alter table atacc3 inherit atacc2; +alter table atacc2 inherit atacc3; +alter table atacc2 inherit atacc2; +-- test that we really are a child now (should see 4 not 3 and cascade should go through) +select test2 from atacc2; +drop table atacc2 cascade; +drop table atacc1; + +-- adding only to a parent is allowed as of 9.2 + +create table atacc1 (test int); +create table atacc2 (test2 int) inherits (atacc1); +-- ok: +alter table atacc1 add constraint foo check (test>0) no inherit; +-- check constraint is not there on child +insert into atacc2 (test) values (-3); +-- check constraint is there on parent +insert into atacc1 (test) values (-3); +insert into atacc1 (test) values (3); +-- fail, violating row: +alter table atacc2 add constraint foo check (test>0) no inherit; +drop table atacc2; +drop table atacc1; + +-- test unique constraint adding + +create table atacc1 ( test int ); +-- add a unique constraint +alter table atacc1 add constraint atacc_test1 unique (test); +-- insert first value +insert into atacc1 (test) values (2); +-- should fail +insert into atacc1 (test) values (2); +-- should succeed +insert into atacc1 (test) values (4); +-- try to create duplicates via alter table using - should fail +alter table atacc1 alter column test type integer using 0; +drop table atacc1; + +-- let's do one where the unique constraint fails when added +create table atacc1 ( test int ); +-- insert soon to be failing rows +insert into atacc1 (test) values (2); +insert into atacc1 (test) values (2); +-- add a unique constraint (fails) +alter table atacc1 add constraint atacc_test1 unique (test); +insert into atacc1 (test) values (3); +drop table atacc1; + +-- let's do one where the unique constraint fails +-- because the column doesn't exist +create table atacc1 ( test int ); +-- add a unique constraint (fails) +alter table atacc1 add constraint atacc_test1 unique (test1); +drop table atacc1; + +-- something a little more complicated +create table atacc1 ( test int, test2 int); +-- add a unique constraint +alter table atacc1 add constraint atacc_test1 unique (test, test2); +-- insert initial value +insert into atacc1 (test,test2) values (4,4); +-- should fail +insert into atacc1 (test,test2) values (4,4); +-- should all succeed +insert into atacc1 (test,test2) values (4,5); +insert into atacc1 (test,test2) values (5,4); +insert into atacc1 (test,test2) values (5,5); +drop table atacc1; + +-- lets do some naming tests +create table atacc1 (test int, test2 int, unique(test)); +alter table atacc1 add unique (test2); +-- should fail for @@ second one @@ +insert into atacc1 (test2, test) values (3, 3); +insert into atacc1 (test2, test) values (2, 3); +drop table atacc1; + +-- test primary key constraint adding + +create table atacc1 ( id serial, test int); +-- add a primary key constraint +alter table atacc1 add constraint atacc_test1 primary key (test); +-- insert first value +insert into atacc1 (test) values (2); +-- should fail +insert into atacc1 (test) values (2); +-- should succeed +insert into atacc1 (test) values (4); +-- inserting NULL should fail +insert into atacc1 (test) values(NULL); +-- try adding a second primary key (should fail) +alter table atacc1 add constraint atacc_oid1 primary key(id); +-- drop first primary key constraint +alter table atacc1 drop constraint atacc_test1 restrict; +-- try adding a primary key on oid (should succeed) +alter table atacc1 add constraint atacc_oid1 primary key(id); +drop table atacc1; + +-- let's do one where the primary key constraint fails when added +create table atacc1 ( test int ); +-- insert soon to be failing rows +insert into atacc1 (test) values (2); +insert into atacc1 (test) values (2); +-- add a primary key (fails) +alter table atacc1 add constraint atacc_test1 primary key (test); +insert into atacc1 (test) values (3); +drop table atacc1; + +-- let's do another one where the primary key constraint fails when added +create table atacc1 ( test int ); +-- insert soon to be failing row +insert into atacc1 (test) values (NULL); +-- add a primary key (fails) +alter table atacc1 add constraint atacc_test1 primary key (test); +insert into atacc1 (test) values (3); +drop table atacc1; + +-- let's do one where the primary key constraint fails +-- because the column doesn't exist +create table atacc1 ( test int ); +-- add a primary key constraint (fails) +alter table atacc1 add constraint atacc_test1 primary key (test1); +drop table atacc1; + +-- adding a new column as primary key to a non-empty table. +-- should fail unless the column has a non-null default value. +create table atacc1 ( test int ); +insert into atacc1 (test) values (0); +-- add a primary key column without a default (fails). +alter table atacc1 add column test2 int primary key; +-- now add a primary key column with a default (succeeds). +alter table atacc1 add column test2 int default 0 primary key; +drop table atacc1; + +-- this combination used to have order-of-execution problems (bug #15580) +create table atacc1 (a int); +insert into atacc1 values(1); +alter table atacc1 + add column b float8 not null default random(), + add primary key(a); +drop table atacc1; + +-- additionally, we've seen issues with foreign key validation not being +-- properly delayed until after a table rewrite. Check that works ok. +create table atacc1 (a int primary key); +alter table atacc1 add constraint atacc1_fkey foreign key (a) references atacc1 (a) not valid; +alter table atacc1 validate constraint atacc1_fkey, alter a type bigint; +drop table atacc1; + +-- we've also seen issues with check constraints being validated at the wrong +-- time when there's a pending table rewrite. +create table atacc1 (a bigint, b int); +insert into atacc1 values(1,1); +alter table atacc1 add constraint atacc1_chk check(b = 1) not valid; +alter table atacc1 validate constraint atacc1_chk, alter a type int; +drop table atacc1; + +-- same as above, but ensure the constraint violation is detected +create table atacc1 (a bigint, b int); +insert into atacc1 values(1,2); +alter table atacc1 add constraint atacc1_chk check(b = 1) not valid; +alter table atacc1 validate constraint atacc1_chk, alter a type int; +drop table atacc1; + +-- something a little more complicated +create table atacc1 ( test int, test2 int); +-- add a primary key constraint +alter table atacc1 add constraint atacc_test1 primary key (test, test2); +-- try adding a second primary key - should fail +alter table atacc1 add constraint atacc_test2 primary key (test); +-- insert initial value +insert into atacc1 (test,test2) values (4,4); +-- should fail +insert into atacc1 (test,test2) values (4,4); +insert into atacc1 (test,test2) values (NULL,3); +insert into atacc1 (test,test2) values (3, NULL); +insert into atacc1 (test,test2) values (NULL,NULL); +-- should all succeed +insert into atacc1 (test,test2) values (4,5); +insert into atacc1 (test,test2) values (5,4); +insert into atacc1 (test,test2) values (5,5); +drop table atacc1; + +-- lets do some naming tests +create table atacc1 (test int, test2 int, primary key(test)); +-- only first should succeed +insert into atacc1 (test2, test) values (3, 3); +insert into atacc1 (test2, test) values (2, 3); +insert into atacc1 (test2, test) values (1, NULL); +drop table atacc1; + +-- alter table / alter column [set/drop] not null tests +-- try altering system catalogs, should fail +alter table pg_class alter column relname drop not null; +alter table pg_class alter relname set not null; + +-- try altering non-existent table, should fail +alter table non_existent alter column bar set not null; +alter table non_existent alter column bar drop not null; + +-- test setting columns to null and not null and vice versa +-- test checking for null values and primary key +create table atacc1 (test int not null); +alter table atacc1 add constraint "atacc1_pkey" primary key (test); +alter table atacc1 alter column test drop not null; +alter table atacc1 drop constraint "atacc1_pkey"; +alter table atacc1 alter column test drop not null; +insert into atacc1 values (null); +alter table atacc1 alter test set not null; +delete from atacc1; +alter table atacc1 alter test set not null; + +-- try altering a non-existent column, should fail +alter table atacc1 alter bar set not null; +alter table atacc1 alter bar drop not null; + +-- try creating a view and altering that, should fail +create view myview as select * from atacc1; +alter table myview alter column test drop not null; +alter table myview alter column test set not null; +drop view myview; + +drop table atacc1; + +-- set not null verified by constraints +create table atacc1 (test_a int, test_b int); +insert into atacc1 values (null, 1); +-- constraint not cover all values, should fail +alter table atacc1 add constraint atacc1_constr_or check(test_a is not null or test_b < 10); +alter table atacc1 alter test_a set not null; +alter table atacc1 drop constraint atacc1_constr_or; +-- not valid constraint, should fail +alter table atacc1 add constraint atacc1_constr_invalid check(test_a is not null) not valid; +alter table atacc1 alter test_a set not null; +alter table atacc1 drop constraint atacc1_constr_invalid; +-- with valid constraint +update atacc1 set test_a = 1; +alter table atacc1 add constraint atacc1_constr_a_valid check(test_a is not null); +alter table atacc1 alter test_a set not null; +delete from atacc1; + +insert into atacc1 values (2, null); +alter table atacc1 alter test_a drop not null; +-- test multiple set not null at same time +-- test_a checked by atacc1_constr_a_valid, test_b should fail by table scan +alter table atacc1 alter test_a set not null, alter test_b set not null; +-- commands order has no importance +alter table atacc1 alter test_b set not null, alter test_a set not null; + +-- valid one by table scan, one by check constraints +update atacc1 set test_b = 1; +alter table atacc1 alter test_b set not null, alter test_a set not null; + +alter table atacc1 alter test_a drop not null, alter test_b drop not null; +-- both column has check constraints +alter table atacc1 add constraint atacc1_constr_b_valid check(test_b is not null); +alter table atacc1 alter test_b set not null, alter test_a set not null; +drop table atacc1; + +-- test inheritance +create table parent (a int); +create table child (b varchar(255)) inherits (parent); + +alter table parent alter a set not null; +insert into parent values (NULL); +insert into child (a, b) values (NULL, 'foo'); +alter table parent alter a drop not null; +insert into parent values (NULL); +insert into child (a, b) values (NULL, 'foo'); +alter table only parent alter a set not null; +alter table child alter a set not null; +delete from parent; +alter table only parent alter a set not null; +insert into parent values (NULL); +alter table child alter a set not null; +insert into child (a, b) values (NULL, 'foo'); +delete from child; +alter table child alter a set not null; +insert into child (a, b) values (NULL, 'foo'); +drop table child; +drop table parent; + +-- test setting and removing default values +create table def_test ( + c1 int4 default 5, + c2 text default 'initial_default' +); +insert into def_test default values; +alter table def_test alter column c1 drop default; +insert into def_test default values; +alter table def_test alter column c2 drop default; +insert into def_test default values; +alter table def_test alter column c1 set default 10; +alter table def_test alter column c2 set default 'new_default'; +insert into def_test default values; +select * from def_test; + +-- set defaults to an incorrect type: this should fail +alter table def_test alter column c1 set default 'wrong_datatype'; +alter table def_test alter column c2 set default 20; + +-- set defaults on a non-existent column: this should fail +alter table def_test alter column c3 set default 30; + +-- set defaults on views: we need to create a view, add a rule +-- to allow insertions into it, and then alter the view to add +-- a default +create view def_view_test as select * from def_test; +create rule def_view_test_ins as + on insert to def_view_test + do instead insert into def_test select new.*; +insert into def_view_test default values; +alter table def_view_test alter column c1 set default 45; +insert into def_view_test default values; +alter table def_view_test alter column c2 set default 'view_default'; +insert into def_view_test default values; +select * from def_view_test; + +drop rule def_view_test_ins on def_view_test; +drop view def_view_test; +drop table def_test; + +-- alter table / drop column tests +-- try altering system catalogs, should fail +alter table pg_class drop column relname; + +-- try altering non-existent table, should fail +alter table nosuchtable drop column bar; + +-- test dropping columns +create table atacc1 (a int4 not null, b int4, c int4 not null, d int4); +insert into atacc1 values (1, 2, 3, 4); +alter table atacc1 drop a; +alter table atacc1 drop a; + +-- SELECTs +select * from atacc1; +select * from atacc1 order by a; +select * from atacc1 order by "........pg.dropped.1........"; +select * from atacc1 group by a; +select * from atacc1 group by "........pg.dropped.1........"; +select atacc1.* from atacc1; +select a from atacc1; +select atacc1.a from atacc1; +select b,c,d from atacc1; +select a,b,c,d from atacc1; +select * from atacc1 where a = 1; +select "........pg.dropped.1........" from atacc1; +select atacc1."........pg.dropped.1........" from atacc1; +select "........pg.dropped.1........",b,c,d from atacc1; +select * from atacc1 where "........pg.dropped.1........" = 1; + +-- UPDATEs +update atacc1 set a = 3; +update atacc1 set b = 2 where a = 3; +update atacc1 set "........pg.dropped.1........" = 3; +update atacc1 set b = 2 where "........pg.dropped.1........" = 3; + +-- INSERTs +insert into atacc1 values (10, 11, 12, 13); +insert into atacc1 values (default, 11, 12, 13); +insert into atacc1 values (11, 12, 13); +insert into atacc1 (a) values (10); +insert into atacc1 (a) values (default); +insert into atacc1 (a,b,c,d) values (10,11,12,13); +insert into atacc1 (a,b,c,d) values (default,11,12,13); +insert into atacc1 (b,c,d) values (11,12,13); +insert into atacc1 ("........pg.dropped.1........") values (10); +insert into atacc1 ("........pg.dropped.1........") values (default); +insert into atacc1 ("........pg.dropped.1........",b,c,d) values (10,11,12,13); +insert into atacc1 ("........pg.dropped.1........",b,c,d) values (default,11,12,13); + +-- DELETEs +delete from atacc1 where a = 3; +delete from atacc1 where "........pg.dropped.1........" = 3; +delete from atacc1; + +-- try dropping a non-existent column, should fail +alter table atacc1 drop bar; + +-- try removing an oid column, should succeed (as it's nonexistent) +alter table atacc1 SET WITHOUT OIDS; + +-- try adding an oid column, should fail (not supported) +alter table atacc1 SET WITH OIDS; + +-- try dropping the xmin column, should fail +alter table atacc1 drop xmin; + +-- try creating a view and altering that, should fail +create view myview as select * from atacc1; +select * from myview; +alter table myview drop d; +drop view myview; + +-- test some commands to make sure they fail on the dropped column +analyze atacc1(a); +analyze atacc1("........pg.dropped.1........"); +vacuum analyze atacc1(a); +vacuum analyze atacc1("........pg.dropped.1........"); +comment on column atacc1.a is 'testing'; +comment on column atacc1."........pg.dropped.1........" is 'testing'; +alter table atacc1 alter a set storage plain; +alter table atacc1 alter "........pg.dropped.1........" set storage plain; +alter table atacc1 alter a set statistics 0; +alter table atacc1 alter "........pg.dropped.1........" set statistics 0; +alter table atacc1 alter a set default 3; +alter table atacc1 alter "........pg.dropped.1........" set default 3; +alter table atacc1 alter a drop default; +alter table atacc1 alter "........pg.dropped.1........" drop default; +alter table atacc1 alter a set not null; +alter table atacc1 alter "........pg.dropped.1........" set not null; +alter table atacc1 alter a drop not null; +alter table atacc1 alter "........pg.dropped.1........" drop not null; +alter table atacc1 rename a to x; +alter table atacc1 rename "........pg.dropped.1........" to x; +alter table atacc1 add primary key(a); +alter table atacc1 add primary key("........pg.dropped.1........"); +alter table atacc1 add unique(a); +alter table atacc1 add unique("........pg.dropped.1........"); +alter table atacc1 add check (a > 3); +alter table atacc1 add check ("........pg.dropped.1........" > 3); +create table atacc2 (id int4 unique); +alter table atacc1 add foreign key (a) references atacc2(id); +alter table atacc1 add foreign key ("........pg.dropped.1........") references atacc2(id); +alter table atacc2 add foreign key (id) references atacc1(a); +alter table atacc2 add foreign key (id) references atacc1("........pg.dropped.1........"); +drop table atacc2; +create index "testing_idx" on atacc1(a); +create index "testing_idx" on atacc1("........pg.dropped.1........"); + +-- test create as and select into +insert into atacc1 values (21, 22, 23); +create table attest1 as select * from atacc1; +select * from attest1; +drop table attest1; +select * into attest2 from atacc1; +select * from attest2; +drop table attest2; + +-- try dropping all columns +alter table atacc1 drop c; +alter table atacc1 drop d; +alter table atacc1 drop b; +select * from atacc1; + +drop table atacc1; + +-- test constraint error reporting in presence of dropped columns +create table atacc1 (id serial primary key, value int check (value < 10)); +insert into atacc1(value) values (100); +alter table atacc1 drop column value; +alter table atacc1 add column value int check (value < 10); +insert into atacc1(value) values (100); +insert into atacc1(id, value) values (null, 0); +drop table atacc1; + +-- test inheritance +create table parent (a int, b int, c int); +insert into parent values (1, 2, 3); +alter table parent drop a; +create table child (d varchar(255)) inherits (parent); +insert into child values (12, 13, 'testing'); + +select * from parent; +select * from child; +alter table parent drop c; +select * from parent; +select * from child; + +drop table child; +drop table parent; + +-- check error cases for inheritance column merging +create table parent (a float8, b numeric(10,4), c text collate "C"); + +create table child (a float4) inherits (parent); -- fail +create table child (b decimal(10,7)) inherits (parent); -- fail +create table child (c text collate "POSIX") inherits (parent); -- fail +create table child (a double precision, b decimal(10,4)) inherits (parent); + +drop table child; +drop table parent; + +-- test copy in/out +create table attest (a int4, b int4, c int4); +insert into attest values (1,2,3); +alter table attest drop a; +copy attest to stdout; +copy attest(a) to stdout; +copy attest("........pg.dropped.1........") to stdout; +copy attest from stdin; +10 11 12 +\. +select * from attest; +copy attest from stdin; +21 22 +\. +select * from attest; +copy attest(a) from stdin; +copy attest("........pg.dropped.1........") from stdin; +copy attest(b,c) from stdin; +31 32 +\. +select * from attest; +drop table attest; + +-- test inheritance + +create table dropColumn (a int, b int, e int); +create table dropColumnChild (c int) inherits (dropColumn); +create table dropColumnAnother (d int) inherits (dropColumnChild); + +-- these two should fail +alter table dropColumnchild drop column a; +alter table only dropColumnChild drop column b; + + + +-- these three should work +alter table only dropColumn drop column e; +alter table dropColumnChild drop column c; +alter table dropColumn drop column a; + +create table renameColumn (a int); +create table renameColumnChild (b int) inherits (renameColumn); +create table renameColumnAnother (c int) inherits (renameColumnChild); + +-- these three should fail +alter table renameColumnChild rename column a to d; +alter table only renameColumnChild rename column a to d; +alter table only renameColumn rename column a to d; + +-- these should work +alter table renameColumn rename column a to d; +alter table renameColumnChild rename column b to a; + +-- these should work +alter table if exists doesnt_exist_tab rename column a to d; +alter table if exists doesnt_exist_tab rename column b to a; + +-- this should work +alter table renameColumn add column w int; + +-- this should fail +alter table only renameColumn add column x int; + + +-- Test corner cases in dropping of inherited columns + +create table p1 (f1 int, f2 int); +create table c1 (f1 int not null) inherits(p1); + +-- should be rejected since c1.f1 is inherited +alter table c1 drop column f1; +-- should work +alter table p1 drop column f1; +-- c1.f1 is still there, but no longer inherited +select f1 from c1; +alter table c1 drop column f1; +select f1 from c1; + +drop table p1 cascade; + +create table p1 (f1 int, f2 int); +create table c1 () inherits(p1); + +-- should be rejected since c1.f1 is inherited +alter table c1 drop column f1; +alter table p1 drop column f1; +-- c1.f1 is dropped now, since there is no local definition for it +select f1 from c1; + +drop table p1 cascade; + +create table p1 (f1 int, f2 int); +create table c1 () inherits(p1); + +-- should be rejected since c1.f1 is inherited +alter table c1 drop column f1; +alter table only p1 drop column f1; +-- c1.f1 is NOT dropped, but must now be considered non-inherited +alter table c1 drop column f1; + +drop table p1 cascade; + +create table p1 (f1 int, f2 int); +create table c1 (f1 int not null) inherits(p1); + +-- should be rejected since c1.f1 is inherited +alter table c1 drop column f1; +alter table only p1 drop column f1; +-- c1.f1 is still there, but no longer inherited +alter table c1 drop column f1; + +drop table p1 cascade; + +create table p1(id int, name text); +create table p2(id2 int, name text, height int); +create table c1(age int) inherits(p1,p2); +create table gc1() inherits (c1); + +select relname, attname, attinhcount, attislocal +from pg_class join pg_attribute on (pg_class.oid = pg_attribute.attrelid) +where relname in ('p1','p2','c1','gc1') and attnum > 0 and not attisdropped +order by relname, attnum; + +-- should work +alter table only p1 drop column name; +-- should work. Now c1.name is local and inhcount is 0. +alter table p2 drop column name; +-- should be rejected since its inherited +alter table gc1 drop column name; +-- should work, and drop gc1.name along +alter table c1 drop column name; +-- should fail: column does not exist +alter table gc1 drop column name; +-- should work and drop the attribute in all tables +alter table p2 drop column height; + +-- IF EXISTS test +create table dropColumnExists (); +alter table dropColumnExists drop column non_existing; --fail +alter table dropColumnExists drop column if exists non_existing; --succeed + +select relname, attname, attinhcount, attislocal +from pg_class join pg_attribute on (pg_class.oid = pg_attribute.attrelid) +where relname in ('p1','p2','c1','gc1') and attnum > 0 and not attisdropped +order by relname, attnum; + +drop table p1, p2 cascade; + +-- test attinhcount tracking with merged columns + +create table depth0(); +create table depth1(c text) inherits (depth0); +create table depth2() inherits (depth1); +alter table depth0 add c text; + +select attrelid::regclass, attname, attinhcount, attislocal +from pg_attribute +where attnum > 0 and attrelid::regclass in ('depth0', 'depth1', 'depth2') +order by attrelid::regclass::text, attnum; + +-- test renumbering of child-table columns in inherited operations + +create table p1 (f1 int); +create table c1 (f2 text, f3 int) inherits (p1); + +alter table p1 add column a1 int check (a1 > 0); +alter table p1 add column f2 text; + +insert into p1 values (1,2,'abc'); +insert into c1 values(11,'xyz',33,0); -- should fail +insert into c1 values(11,'xyz',33,22); + +select * from p1; +update p1 set a1 = a1 + 1, f2 = upper(f2); +select * from p1; + +drop table p1 cascade; + +-- test that operations with a dropped column do not try to reference +-- its datatype + +create domain mytype as text; +create temp table foo (f1 text, f2 mytype, f3 text); + +insert into foo values('bb','cc','dd'); +select * from foo; + +drop domain mytype cascade; + +select * from foo; +insert into foo values('qq','rr'); +select * from foo; +update foo set f3 = 'zz'; +select * from foo; +select f3,max(f1) from foo group by f3; + +-- Simple tests for alter table column type +alter table foo alter f1 TYPE integer; -- fails +alter table foo alter f1 TYPE varchar(10); + +create table anothertab (atcol1 serial8, atcol2 boolean, + constraint anothertab_chk check (atcol1 <= 3)); + +insert into anothertab (atcol1, atcol2) values (default, true); +insert into anothertab (atcol1, atcol2) values (default, false); +select * from anothertab; + +alter table anothertab alter column atcol1 type boolean; -- fails +alter table anothertab alter column atcol1 type boolean using atcol1::int; -- fails +alter table anothertab alter column atcol1 type integer; + +select * from anothertab; + +insert into anothertab (atcol1, atcol2) values (45, null); -- fails +insert into anothertab (atcol1, atcol2) values (default, null); + +select * from anothertab; + +alter table anothertab alter column atcol2 type text + using case when atcol2 is true then 'IT WAS TRUE' + when atcol2 is false then 'IT WAS FALSE' + else 'IT WAS NULL!' end; + +select * from anothertab; +alter table anothertab alter column atcol1 type boolean + using case when atcol1 % 2 = 0 then true else false end; -- fails +alter table anothertab alter column atcol1 drop default; +alter table anothertab alter column atcol1 type boolean + using case when atcol1 % 2 = 0 then true else false end; -- fails +alter table anothertab drop constraint anothertab_chk; +alter table anothertab drop constraint anothertab_chk; -- fails +alter table anothertab drop constraint IF EXISTS anothertab_chk; -- succeeds + +alter table anothertab alter column atcol1 type boolean + using case when atcol1 % 2 = 0 then true else false end; + +select * from anothertab; + +drop table anothertab; + +-- Test index handling in alter table column type (cf. bugs #15835, #15865) +create table anothertab(f1 int primary key, f2 int unique, + f3 int, f4 int, f5 int); +alter table anothertab + add exclude using btree (f3 with =); +alter table anothertab + add exclude using btree (f4 with =) where (f4 is not null); +alter table anothertab + add exclude using btree (f4 with =) where (f5 > 0); +alter table anothertab + add unique(f1,f4); +create index on anothertab(f2,f3); +create unique index on anothertab(f4); + +\d anothertab + +-- In GPDB, you cannot change the type of a column that's part of a unique key +alter table anothertab drop constraint anothertab_pkey; +alter table anothertab drop constraint anothertab_f1_f4_key ; +alter table anothertab drop constraint anothertab_f2_key; +drop index anothertab_f4_idx; + +alter table anothertab alter column f1 type bigint; +alter table anothertab + alter column f2 type bigint, + alter column f3 type bigint, + alter column f4 type bigint; +alter table anothertab alter column f5 type bigint; + +-- restore primary and unique keys +alter table anothertab add constraint anothertab_pkey primary key (f1); +alter table anothertab add constraint anothertab_f1_f4_key unique (f1, f4); +create unique index on anothertab(f4); +alter table anothertab add constraint anothertab_f2_key unique (f2); + +\d anothertab + +drop table anothertab; + +-- test that USING expressions are parsed before column alter type / drop steps +create table another (f1 int, f2 text, f3 text); + +insert into another values(1, 'one', 'uno'); +insert into another values(2, 'two', 'due'); +insert into another values(3, 'three', 'tre'); + +select * from another; + +alter table another + alter f1 type text using f2 || ' and ' || f3 || ' more', + alter f2 type bigint using f1 * 10, + drop column f3; + +select * from another; + +drop table another; + +-- Create an index that skips WAL, then perform a SET DATA TYPE that skips +-- rewriting the index. +begin; +create table skip_wal_skip_rewrite_index (c varchar(10) primary key); +alter table skip_wal_skip_rewrite_index alter c type varchar(20); +commit; + +-- We disallow changing table's row type if it's used for storage +create table at_tab1 (a int, b text); +create table at_tab2 (x int, y at_tab1); +alter table at_tab1 alter column b type varchar; -- fails +drop table at_tab2; +-- Use of row type in an expression is defended differently +create table at_tab2 (x int, y text, check((x,y)::at_tab1 = (1,'42')::at_tab1)); +alter table at_tab1 alter column b type varchar; -- allowed, but ... +insert into at_tab2 values(1,'42'); -- ... this will fail +drop table at_tab1, at_tab2; +-- Check it for a partitioned table, too +create table at_tab1 (a int, b text) partition by list(a); +create table at_tab2 (x int, y at_tab1); +alter table at_tab1 alter column b type varchar; -- fails +drop table at_tab1, at_tab2; + +-- Alter column type that's part of a partitioned index +create table at_partitioned (a int, b text) partition by range (a); +create table at_part_1 partition of at_partitioned for values from (0) to (1000); +insert into at_partitioned values (512, '0.123'); +create table at_part_2 (b text, a int); +insert into at_part_2 values ('1.234', 1024); +create index on at_partitioned (b); +create index on at_partitioned (a); +\d at_part_1 +\d at_part_2 +alter table at_partitioned attach partition at_part_2 for values from (1000) to (2000); +\d at_part_2 +alter table at_partitioned alter column b type numeric using b::numeric; +\d at_part_1 +\d at_part_2 +drop table at_partitioned; + +-- Alter column type when no table rewrite is required +-- Also check that comments are preserved +create table at_partitioned(id int, name varchar(64), unique (id, name)) + partition by hash(id); +comment on constraint at_partitioned_id_name_key on at_partitioned is 'parent constraint'; +comment on index at_partitioned_id_name_key is 'parent index'; +create table at_partitioned_0 partition of at_partitioned + for values with (modulus 2, remainder 0); +comment on constraint at_partitioned_0_id_name_key on at_partitioned_0 is 'child 0 constraint'; +comment on index at_partitioned_0_id_name_key is 'child 0 index'; +create table at_partitioned_1 partition of at_partitioned + for values with (modulus 2, remainder 1); +comment on constraint at_partitioned_1_id_name_key on at_partitioned_1 is 'child 1 constraint'; +comment on index at_partitioned_1_id_name_key is 'child 1 index'; +insert into at_partitioned values(1, 'foo'); +insert into at_partitioned values(3, 'bar'); + +create temp table old_oids as + select relname, oid as oldoid, relfilenode as oldfilenode + from pg_class where relname like 'at_partitioned%'; + +-- GPDB: the output for these queries differ from upstream, because GPDB +-- assigns a new relfilenode for every table, it never uses the table's +-- OID as the relfilenode like Postgres does. +select relname, + c.oid = oldoid as orig_oid, + case relfilenode + when 0 then 'none' + when c.oid then 'own' + when oldfilenode then 'orig' + else 'OTHER' + end as storage, + obj_description(c.oid, 'pg_class') as desc + from pg_class c left join old_oids using (relname) + where relname like 'at_partitioned%' + order by relname; + +select conname, obj_description(oid, 'pg_constraint') as desc + from pg_constraint where conname like 'at_partitioned%' + order by conname; + +-- this doesn't work in GPDB, which makes the rest of the test quite pointless. +alter table at_partitioned alter column name type varchar(127); + + +-- Note: these tests currently show the wrong behavior for comments :-( + +select relname, + c.oid = oldoid as orig_oid, + case relfilenode + when 0 then 'none' + when c.oid then 'own' + when oldfilenode then 'orig' + else 'OTHER' + end as storage, + obj_description(c.oid, 'pg_class') as desc + from pg_class c left join old_oids using (relname) + where relname like 'at_partitioned%' + order by relname; + +select conname, obj_description(oid, 'pg_constraint') as desc + from pg_constraint where conname like 'at_partitioned%' + order by conname; + +-- Don't remove this DROP, it exposes bug #15672 +drop table at_partitioned; + +-- disallow recursive containment of row types +create temp table recur1 (f1 int); +alter table recur1 add column f2 recur1; -- fails +alter table recur1 add column f2 recur1[]; -- fails +create domain array_of_recur1 as recur1[]; +alter table recur1 add column f2 array_of_recur1; -- fails +create temp table recur2 (f1 int, f2 recur1); +alter table recur1 add column f2 recur2; -- fails +alter table recur1 add column f2 int; +alter table recur1 alter column f2 type recur2; -- fails + +-- SET STORAGE may need to add a TOAST table +create table test_storage (a text); +alter table test_storage alter a set storage plain; +alter table test_storage add b int default 0; -- rewrite table to remove its TOAST table +alter table test_storage alter a set storage extended; -- re-add TOAST table + +select reltoastrelid <> 0 as has_toast_table +from pg_class +where oid = 'test_storage'::regclass; + +-- test that SET STORAGE propagates to index correctly +create index test_storage_idx on test_storage (b, a); +alter table test_storage alter column a set storage external; +\d+ test_storage +\d+ test_storage_idx + +-- ALTER COLUMN TYPE with a check constraint and a child table (bug #13779) +CREATE TABLE test_inh_check (a float check (a > 10.2), b float); +CREATE TABLE test_inh_check_child() INHERITS(test_inh_check); +\d test_inh_check +\d test_inh_check_child +select relname, conname, coninhcount, conislocal, connoinherit + from pg_constraint c, pg_class r + where relname like 'test_inh_check%' and c.conrelid = r.oid + order by 1, 2; +ALTER TABLE test_inh_check ALTER COLUMN a TYPE numeric; +\d test_inh_check +\d test_inh_check_child +select relname, conname, coninhcount, conislocal, connoinherit + from pg_constraint c, pg_class r + where relname like 'test_inh_check%' and c.conrelid = r.oid + order by 1, 2; +-- also try noinherit, local, and local+inherited cases +ALTER TABLE test_inh_check ADD CONSTRAINT bnoinherit CHECK (b > 100) NO INHERIT; +ALTER TABLE test_inh_check_child ADD CONSTRAINT blocal CHECK (b < 1000); +ALTER TABLE test_inh_check_child ADD CONSTRAINT bmerged CHECK (b > 1); +ALTER TABLE test_inh_check ADD CONSTRAINT bmerged CHECK (b > 1); +\d test_inh_check +\d test_inh_check_child +select relname, conname, coninhcount, conislocal, connoinherit + from pg_constraint c, pg_class r + where relname like 'test_inh_check%' and c.conrelid = r.oid + order by 1, 2; +ALTER TABLE test_inh_check ALTER COLUMN b TYPE numeric; +\d test_inh_check +\d test_inh_check_child +select relname, conname, coninhcount, conislocal, connoinherit + from pg_constraint c, pg_class r + where relname like 'test_inh_check%' and c.conrelid = r.oid + order by 1, 2; + +-- ALTER COLUMN TYPE with different schema in children +-- Bug at https://postgr.es/m/20170102225618.GA10071@telsasoft.com +CREATE TABLE test_type_diff (f1 int); +CREATE TABLE test_type_diff_c (extra smallint) INHERITS (test_type_diff); +ALTER TABLE test_type_diff ADD COLUMN f2 int; +INSERT INTO test_type_diff_c VALUES (1, 2, 3); +ALTER TABLE test_type_diff ALTER COLUMN f2 TYPE bigint USING f2::bigint; + +CREATE TABLE test_type_diff2 (int_two int2, int_four int4, int_eight int8); +CREATE TABLE test_type_diff2_c1 (int_four int4, int_eight int8, int_two int2); +CREATE TABLE test_type_diff2_c2 (int_eight int8, int_two int2, int_four int4); +CREATE TABLE test_type_diff2_c3 (int_two int2, int_four int4, int_eight int8); +ALTER TABLE test_type_diff2_c1 INHERIT test_type_diff2; +ALTER TABLE test_type_diff2_c2 INHERIT test_type_diff2; +ALTER TABLE test_type_diff2_c3 INHERIT test_type_diff2; +INSERT INTO test_type_diff2_c1 VALUES (1, 2, 3); +INSERT INTO test_type_diff2_c2 VALUES (4, 5, 6); +INSERT INTO test_type_diff2_c3 VALUES (7, 8, 9); +ALTER TABLE test_type_diff2 ALTER COLUMN int_four TYPE int8 USING int_four::int8; +-- whole-row references are disallowed +ALTER TABLE test_type_diff2 ALTER COLUMN int_four TYPE int4 USING (pg_column_size(test_type_diff2)); + +-- check for rollback of ANALYZE corrupting table property flags (bug #11638) +CREATE TABLE check_fk_presence_1 (id int PRIMARY KEY, t text); +CREATE TABLE check_fk_presence_2 (id int REFERENCES check_fk_presence_1, t text); +BEGIN; +ALTER TABLE check_fk_presence_2 DROP CONSTRAINT check_fk_presence_2_id_fkey; +ANALYZE check_fk_presence_2; +ROLLBACK; +\d check_fk_presence_2 +DROP TABLE check_fk_presence_1, check_fk_presence_2; + +-- check column addition within a view (bug #14876) +create table at_base_table(id int, stuff text); +insert into at_base_table values (23, 'skidoo'); +create view at_view_1 as select * from at_base_table bt; +create view at_view_2 as select *, to_json(v1) as j from at_view_1 v1; +\d+ at_view_1 +\d+ at_view_2 +explain (verbose, costs off) select * from at_view_2; +select * from at_view_2; + +create or replace view at_view_1 as select *, 2+2 as more from at_base_table bt; +\d+ at_view_1 +\d+ at_view_2 +explain (verbose, costs off) select * from at_view_2; +select * from at_view_2; + +drop view at_view_2; +drop view at_view_1; +drop table at_base_table; + +-- check adding a column not iself requiring a rewrite, together with +-- a column requiring a default (bug #16038) + +-- ensure that rewrites aren't silently optimized away, removing the +-- value of the test +CREATE FUNCTION check_ddl_rewrite(p_tablename regclass, p_ddl text) +RETURNS boolean +LANGUAGE plpgsql AS $$ +DECLARE + v_relfilenode oid; +BEGIN + v_relfilenode := relfilenode FROM pg_class WHERE oid = p_tablename; + + EXECUTE p_ddl; + + RETURN v_relfilenode <> (SELECT relfilenode FROM pg_class WHERE oid = p_tablename); +END; +$$; + +CREATE TABLE rewrite_test(col text); +INSERT INTO rewrite_test VALUES ('something'); +INSERT INTO rewrite_test VALUES (NULL); + +-- empty[12] don't need rewrite, but notempty[12]_rewrite will force one +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN empty1 text, + ADD COLUMN notempty1_rewrite serial; +$$); +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN notempty2_rewrite serial, + ADD COLUMN empty2 text; +$$); +-- also check that fast defaults cause no problem, first without rewrite +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN empty3 text, + ADD COLUMN notempty3_norewrite int default 42; +$$); +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN notempty4_norewrite int default 42, + ADD COLUMN empty4 text; +$$); +-- then with rewrite +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN empty5 text, + ADD COLUMN notempty5_norewrite int default 42, + ADD COLUMN notempty5_rewrite serial; +$$); +SELECT check_ddl_rewrite('rewrite_test', $$ + ALTER TABLE rewrite_test + ADD COLUMN notempty6_rewrite serial, + ADD COLUMN empty6 text, + ADD COLUMN notempty6_norewrite int default 42; +$$); + +-- cleanup +DROP FUNCTION check_ddl_rewrite(regclass, text); +DROP TABLE rewrite_test; + +-- +-- lock levels +-- +drop type lockmodes; +create type lockmodes as enum ( + 'SIReadLock' +,'AccessShareLock' +,'RowShareLock' +,'RowExclusiveLock' +,'ShareUpdateExclusiveLock' +,'ShareLock' +,'ShareRowExclusiveLock' +,'ExclusiveLock' +,'AccessExclusiveLock' +); + +drop view my_locks; +create or replace view my_locks as +select case when c.relname like 'pg_toast%' then 'pg_toast' else c.relname end, max(mode::lockmodes) as max_lockmode +from pg_locks l join pg_class c on l.relation = c.oid +where virtualtransaction = ( + select virtualtransaction + from pg_locks + where transactionid = pg_current_xact_id()::xid) +and locktype = 'relation' +and relnamespace != (select oid from pg_namespace where nspname = 'pg_catalog') +and c.relname != 'my_locks' +group by c.relname; + +create table alterlock (f1 int primary key, f2 text); +insert into alterlock values (1, 'foo'); +create table alterlock2 (f3 int primary key, f1 int); +insert into alterlock2 values (1, 1); + +begin; alter table alterlock alter column f2 set statistics 150; +select * from my_locks order by 1; +rollback; + +begin; alter table alterlock cluster on alterlock_pkey; +select * from my_locks order by 1; +commit; + +begin; alter table alterlock set without cluster; +select * from my_locks order by 1; +commit; + +begin; alter table alterlock set (fillfactor = 100); +select * from my_locks order by 1; +commit; + +begin; alter table alterlock reset (fillfactor); +select * from my_locks order by 1; +commit; + +begin; alter table alterlock set (toast.autovacuum_enabled = off); +select * from my_locks order by 1; +commit; + +begin; alter table alterlock set (autovacuum_enabled = off); +select * from my_locks order by 1; +commit; + +begin; alter table alterlock alter column f2 set (n_distinct = 1); +select * from my_locks order by 1; +rollback; + +-- test that mixing options with different lock levels works as expected +begin; alter table alterlock set (autovacuum_enabled = off, fillfactor = 80); +select * from my_locks order by 1; +commit; + +begin; alter table alterlock alter column f2 set storage extended; +select * from my_locks order by 1; +rollback; + +begin; alter table alterlock alter column f2 set default 'x'; +select * from my_locks order by 1; +rollback; + +begin; +create trigger ttdummy + before delete or update on alterlock + for each row + execute procedure + ttdummy (1, 1); +select * from my_locks order by 1; +rollback; + +begin; +select * from my_locks order by 1; +alter table alterlock2 add foreign key (f1) references alterlock (f1); +select * from my_locks order by 1; +rollback; + +begin; +alter table alterlock2 +add constraint alterlock2nv foreign key (f1) references alterlock (f1) NOT VALID; +select * from my_locks order by 1; +commit; +begin; +alter table alterlock2 validate constraint alterlock2nv; +select * from my_locks order by 1; +rollback; + +create or replace view my_locks as +select case when c.relname like 'pg_toast%' then 'pg_toast' else c.relname end, max(mode::lockmodes) as max_lockmode +from pg_locks l join pg_class c on l.relation = c.oid +where virtualtransaction = ( + select virtualtransaction + from pg_locks + where transactionid = pg_current_xact_id()::xid) +and locktype = 'relation' +and relnamespace != (select oid from pg_namespace where nspname = 'pg_catalog') +and c.relname = 'my_locks' +group by c.relname; + +-- raise exception +alter table my_locks set (autovacuum_enabled = false); +alter view my_locks set (autovacuum_enabled = false); +alter table my_locks reset (autovacuum_enabled); +alter view my_locks reset (autovacuum_enabled); + +begin; +alter view my_locks set (security_barrier=off); +select * from my_locks order by 1; +alter view my_locks reset (security_barrier); +rollback; + +-- this test intentionally applies the ALTER TABLE command against a view, but +-- uses a view option so we expect this to succeed. This form of SQL is +-- accepted for historical reasons, as shown in the docs for ALTER VIEW +begin; +alter table my_locks set (security_barrier=off); +select * from my_locks order by 1; +alter table my_locks reset (security_barrier); +rollback; + +-- cleanup +drop table alterlock2; +drop table alterlock; +drop view my_locks; +drop type lockmodes; + +-- +-- alter function +-- +create function test_strict(text) returns text as + 'select coalesce($1, ''got passed a null'');' + language sql CONTAINS SQL returns null on null input; +select test_strict(NULL); +alter function test_strict(text) called on null input; +select test_strict(NULL); + +create function non_strict(text) returns text as + 'select coalesce($1, ''got passed a null'');' + language sql CONTAINS SQL called on null input; +select non_strict(NULL); +alter function non_strict(text) returns null on null input; +select non_strict(NULL); + +-- +-- alter object set schema +-- + +create schema alter1; +create schema alter2; + +create table alter1.t1(f1 serial primary key, f2 int check (f2 > 0)); + +create view alter1.v1 as select * from alter1.t1; + +create function alter1.plus1(int) returns int as 'select $1+1' language sql CONTAINS SQL; + +create domain alter1.posint integer check (value > 0); + +create type alter1.ctype as (f1 int, f2 text); + +create function alter1.same(alter1.ctype, alter1.ctype) returns boolean language sql +as 'select $1.f1 is not distinct from $2.f1 and $1.f2 is not distinct from $2.f2'; + +create operator alter1.=(procedure = alter1.same, leftarg = alter1.ctype, rightarg = alter1.ctype); + +create operator class alter1.ctype_hash_ops default for type alter1.ctype using hash as + operator 1 alter1.=(alter1.ctype, alter1.ctype); + +create conversion alter1.latin1_to_utf8 for 'latin1' to 'utf8' from iso8859_1_to_utf8; + +create text search parser alter1.prs(start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +create text search configuration alter1.cfg(parser = alter1.prs); +create text search template alter1.tmpl(init = dsimple_init, lexize = dsimple_lexize); +create text search dictionary alter1.dict(template = alter1.tmpl); + +insert into alter1.t1(f2) values(11); +insert into alter1.t1(f2) values(12); + +alter table alter1.t1 set schema alter1; -- no-op, same schema +alter table alter1.t1 set schema alter2; +alter table alter1.v1 set schema alter2; +alter function alter1.plus1(int) set schema alter2; +alter domain alter1.posint set schema alter2; +alter operator class alter1.ctype_hash_ops using hash set schema alter2; +alter operator family alter1.ctype_hash_ops using hash set schema alter2; +alter operator alter1.=(alter1.ctype, alter1.ctype) set schema alter2; +alter function alter1.same(alter1.ctype, alter1.ctype) set schema alter2; +alter type alter1.ctype set schema alter1; -- no-op, same schema +alter type alter1.ctype set schema alter2; +alter conversion alter1.latin1_to_utf8 set schema alter2; +alter text search parser alter1.prs set schema alter2; +alter text search configuration alter1.cfg set schema alter2; +alter text search template alter1.tmpl set schema alter2; +alter text search dictionary alter1.dict set schema alter2; + +-- this should succeed because nothing is left in alter1 +drop schema alter1; + +insert into alter2.t1(f2) values(13); +insert into alter2.t1(f2) values(14); + +select * from alter2.t1; + +select * from alter2.v1; + +select alter2.plus1(41); + +-- clean up +drop schema alter2 cascade; + +-- +-- composite types +-- + +CREATE TYPE test_type AS (a int); +\d test_type + +ALTER TYPE nosuchtype ADD ATTRIBUTE b text; -- fails + +ALTER TYPE test_type ADD ATTRIBUTE b text; +\d test_type + +ALTER TYPE test_type ADD ATTRIBUTE b text; -- fails + +ALTER TYPE test_type ALTER ATTRIBUTE b SET DATA TYPE varchar; +\d test_type + +ALTER TYPE test_type ALTER ATTRIBUTE b SET DATA TYPE integer; +\d test_type + +ALTER TYPE test_type DROP ATTRIBUTE b; +\d test_type + +ALTER TYPE test_type DROP ATTRIBUTE c; -- fails + +ALTER TYPE test_type DROP ATTRIBUTE IF EXISTS c; + +ALTER TYPE test_type DROP ATTRIBUTE a, ADD ATTRIBUTE d boolean; +\d test_type + +ALTER TYPE test_type RENAME ATTRIBUTE a TO aa; +ALTER TYPE test_type RENAME ATTRIBUTE d TO dd; +\d test_type + +DROP TYPE test_type; + +CREATE TYPE test_type1 AS (a int, b text); +CREATE TABLE test_tbl1 (x int, y test_type1); +ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails + +CREATE TYPE test_type2 AS (a int, b text); +CREATE TABLE test_tbl2 OF test_type2; +CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2); +\d test_type2 +\d test_tbl2 + +ALTER TYPE test_type2 ADD ATTRIBUTE c text; -- fails +ALTER TYPE test_type2 ADD ATTRIBUTE c text CASCADE; +\d test_type2 +\d test_tbl2 + +ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar; -- fails +ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar CASCADE; +\d test_type2 +\d test_tbl2 + +ALTER TYPE test_type2 DROP ATTRIBUTE b; -- fails +ALTER TYPE test_type2 DROP ATTRIBUTE b CASCADE; +\d test_type2 +\d test_tbl2 + +ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa; -- fails +ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa CASCADE; +\d test_type2 +\d test_tbl2 +\d test_tbl2_subclass + +DROP TABLE test_tbl2_subclass; + +CREATE TYPE test_typex AS (a int, b text); +CREATE TABLE test_tblx (x int, y test_typex check ((y).a > 0)); +ALTER TYPE test_typex DROP ATTRIBUTE a; -- fails +ALTER TYPE test_typex DROP ATTRIBUTE a CASCADE; +\d test_tblx +DROP TABLE test_tblx; +DROP TYPE test_typex; + +-- This test isn't that interesting on its own, but the purpose is to leave +-- behind a table to test pg_upgrade with. The table has a composite type +-- column in it, and the composite type has a dropped attribute. +CREATE TYPE test_type3 AS (a int); +CREATE TABLE test_tbl3 (c) AS SELECT '(1)'::test_type3; +ALTER TYPE test_type3 DROP ATTRIBUTE a, ADD ATTRIBUTE b int; + +CREATE TYPE test_type_empty AS (); +DROP TYPE test_type_empty; + +-- +-- typed tables: OF / NOT OF +-- + +CREATE TYPE tt_t0 AS (z inet, x int, y numeric(8,2)); +ALTER TYPE tt_t0 DROP ATTRIBUTE z; +CREATE TABLE tt0 (x int NOT NULL, y numeric(8,2)); -- OK +CREATE TABLE tt1 (x int, y bigint); -- wrong base type +CREATE TABLE tt2 (x int, y numeric(9,2)); -- wrong typmod +CREATE TABLE tt3 (y numeric(8,2), x int); -- wrong column order +CREATE TABLE tt4 (x int); -- too few columns +CREATE TABLE tt5 (x int, y numeric(8,2), z int); -- too few columns +CREATE TABLE tt6 () INHERITS (tt0); -- can't have a parent +CREATE TABLE tt7 (x int, q text, y numeric(8,2)); +ALTER TABLE tt7 DROP q; -- OK + +ALTER TABLE tt0 OF tt_t0; +ALTER TABLE tt1 OF tt_t0; +ALTER TABLE tt2 OF tt_t0; +ALTER TABLE tt3 OF tt_t0; +ALTER TABLE tt4 OF tt_t0; +ALTER TABLE tt5 OF tt_t0; +ALTER TABLE tt6 OF tt_t0; +ALTER TABLE tt7 OF tt_t0; + +CREATE TYPE tt_t1 AS (x int, y numeric(8,2)); +ALTER TABLE tt7 OF tt_t1; -- reassign an already-typed table +ALTER TABLE tt7 NOT OF; +\d tt7 + +-- make sure we can drop a constraint on the parent but it remains on the child +CREATE TABLE test_drop_constr_parent (c text CHECK (c IS NOT NULL)); +CREATE TABLE test_drop_constr_child () INHERITS (test_drop_constr_parent); +ALTER TABLE ONLY test_drop_constr_parent DROP CONSTRAINT "test_drop_constr_parent_c_check"; +-- should fail +INSERT INTO test_drop_constr_child (c) VALUES (NULL); +DROP TABLE test_drop_constr_parent CASCADE; + +-- +-- IF EXISTS test +-- +ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; +ALTER TABLE IF EXISTS tt8 ADD CONSTRAINT xxx PRIMARY KEY(f); +ALTER TABLE IF EXISTS tt8 ADD CHECK (f BETWEEN 0 AND 10); +ALTER TABLE IF EXISTS tt8 ALTER COLUMN f SET DEFAULT 0; +ALTER TABLE IF EXISTS tt8 RENAME COLUMN f TO f1; +ALTER TABLE IF EXISTS tt8 SET SCHEMA alter2; + +CREATE TABLE tt8(a int); +CREATE SCHEMA alter2; + +ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; +ALTER TABLE IF EXISTS tt8 ADD CONSTRAINT xxx PRIMARY KEY(f); +ALTER TABLE IF EXISTS tt8 ADD CHECK (f BETWEEN 0 AND 10); +ALTER TABLE IF EXISTS tt8 ALTER COLUMN f SET DEFAULT 0; +ALTER TABLE IF EXISTS tt8 RENAME COLUMN f TO f1; +ALTER TABLE IF EXISTS tt8 SET SCHEMA alter2; + +\d alter2.tt8 + +DROP TABLE alter2.tt8; +DROP SCHEMA alter2; + +-- +-- Check conflicts between index and CHECK constraint names +-- +CREATE TABLE tt9(c integer); +ALTER TABLE tt9 ADD CHECK(c > 1); +ALTER TABLE tt9 ADD CHECK(c > 2); -- picks nonconflicting name +ALTER TABLE tt9 ADD CONSTRAINT foo CHECK(c > 3); +ALTER TABLE tt9 ADD CONSTRAINT foo CHECK(c > 4); -- fail, dup name +ALTER TABLE tt9 ADD UNIQUE(c); +ALTER TABLE tt9 ADD UNIQUE(c); -- picks nonconflicting name +ALTER TABLE tt9 ADD CONSTRAINT tt9_c_key UNIQUE(c); -- fail, dup name +ALTER TABLE tt9 ADD CONSTRAINT foo UNIQUE(c); -- fail, dup name +ALTER TABLE tt9 ADD CONSTRAINT tt9_c_key CHECK(c > 5); -- fail, dup name +ALTER TABLE tt9 ADD CONSTRAINT tt9_c_key2 CHECK(c > 6); +ALTER TABLE tt9 ADD UNIQUE(c); -- picks nonconflicting name +\d tt9 +DROP TABLE tt9; + + +-- Check that comments on constraints and indexes are not lost at ALTER TABLE. +CREATE TABLE comment_test ( + id int, + positive_col int CHECK (positive_col > 0), + indexed_col int, + CONSTRAINT comment_test_pk PRIMARY KEY (id)); +CREATE INDEX comment_test_index ON comment_test(indexed_col); + +COMMENT ON COLUMN comment_test.id IS 'Column ''id'' on comment_test'; +COMMENT ON INDEX comment_test_index IS 'Simple index on comment_test'; +COMMENT ON CONSTRAINT comment_test_positive_col_check ON comment_test IS 'CHECK constraint on comment_test.positive_col'; +COMMENT ON CONSTRAINT comment_test_pk ON comment_test IS 'PRIMARY KEY constraint of comment_test'; +COMMENT ON INDEX comment_test_pk IS 'Index backing the PRIMARY KEY of comment_test'; + +SELECT col_description('comment_test'::regclass, 1) as comment; +SELECT indexrelid::regclass::text as index, obj_description(indexrelid, 'pg_class') as comment FROM pg_index where indrelid = 'comment_test'::regclass ORDER BY 1, 2; +SELECT conname as constraint, obj_description(oid, 'pg_constraint') as comment FROM pg_constraint where conrelid = 'comment_test'::regclass ORDER BY 1, 2; + +-- Change the datatype of all the columns. ALTER TABLE is optimized to not +-- rebuild an index if the new data type is binary compatible with the old +-- one. Check do a dummy ALTER TABLE that doesn't change the datatype +-- first, to test that no-op codepath, and another one that does. +ALTER TABLE comment_test ALTER COLUMN indexed_col SET DATA TYPE int; +ALTER TABLE comment_test ALTER COLUMN indexed_col SET DATA TYPE text; + +-- Changing the data type of an indexed column is not supported in GPDB as of fecd245 +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE int; +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE text; +ALTER TABLE comment_test DROP CONSTRAINT comment_test_pk; +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE text; +ALTER TABLE comment_test ADD CONSTRAINT comment_test_pk PRIMARY KEY (id); + +ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE int; +ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE bigint; + +-- Check that the comments are intact. +SELECT col_description('comment_test'::regclass, 1) as comment; +SELECT indexrelid::regclass::text as index, obj_description(indexrelid, 'pg_class') as comment FROM pg_index where indrelid = 'comment_test'::regclass ORDER BY 1, 2; +SELECT conname as constraint, obj_description(oid, 'pg_constraint') as comment FROM pg_constraint where conrelid = 'comment_test'::regclass ORDER BY 1, 2; + +-- Check compatibility for foreign keys and comments. This is done +-- separately as rebuilding the column type of the parent leads +-- to an error and would reduce the test scope. +CREATE TABLE comment_test_child ( + id text CONSTRAINT comment_test_child_fk REFERENCES comment_test); +CREATE INDEX comment_test_child_fk ON comment_test_child(id); +COMMENT ON COLUMN comment_test_child.id IS 'Column ''id'' on comment_test_child'; +COMMENT ON INDEX comment_test_child_fk IS 'Index backing the FOREIGN KEY of comment_test_child'; +COMMENT ON CONSTRAINT comment_test_child_fk ON comment_test_child IS 'FOREIGN KEY constraint of comment_test_child'; + +-- Change column type of parent +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE text; +ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE int USING id::integer; + +-- Comments should be intact +SELECT col_description('comment_test_child'::regclass, 1) as comment; +SELECT indexrelid::regclass::text as index, obj_description(indexrelid, 'pg_class') as comment FROM pg_index where indrelid = 'comment_test_child'::regclass ORDER BY 1, 2; +SELECT conname as constraint, obj_description(oid, 'pg_constraint') as comment FROM pg_constraint where conrelid = 'comment_test_child'::regclass ORDER BY 1, 2; + +-- Check that we map relation oids to filenodes and back correctly. Only +-- display bad mappings so the test output doesn't change all the time. A +-- filenode function call can return NULL for a relation dropped concurrently +-- with the call's surrounding query, so ignore a NULL mapped_oid for +-- relations that no longer exist after all calls finish. +CREATE TEMP TABLE filenode_mapping AS +SELECT + oid, mapped_oid, reltablespace, relfilenode, relname +FROM pg_class, + pg_filenode_relation(reltablespace, pg_relation_filenode(oid)) AS mapped_oid +WHERE relkind IN ('r', 'i', 'S', 't', 'm') AND mapped_oid IS DISTINCT FROM oid; + +SELECT m.* FROM filenode_mapping m LEFT JOIN pg_class c ON c.oid = m.oid +WHERE c.oid IS NOT NULL OR m.mapped_oid IS NOT NULL; + +-- Checks on creating and manipulation of user defined relations in +-- pg_catalog. + +SHOW allow_system_table_mods; +-- disallowed because of search_path issues with pg_dump +CREATE TABLE pg_catalog.new_system_table(); +-- instead create in public first, move to catalog +CREATE TABLE new_system_table(id serial primary key, othercol text); +ALTER TABLE new_system_table SET SCHEMA pg_catalog; +ALTER TABLE new_system_table SET SCHEMA public; +ALTER TABLE new_system_table SET SCHEMA pg_catalog; +-- will be ignored -- already there: +ALTER TABLE new_system_table SET SCHEMA pg_catalog; +ALTER TABLE new_system_table RENAME TO old_system_table; +CREATE INDEX old_system_table__othercol ON old_system_table (othercol); +INSERT INTO old_system_table(othercol) VALUES ('somedata'), ('otherdata'); +UPDATE old_system_table SET id = -id; +DELETE FROM old_system_table WHERE othercol = 'somedata'; +TRUNCATE old_system_table; +ALTER TABLE old_system_table DROP CONSTRAINT new_system_table_pkey; +ALTER TABLE old_system_table DROP COLUMN othercol; +DROP TABLE old_system_table; + +-- set logged +CREATE UNLOGGED TABLE unlogged1(f1 SERIAL PRIMARY KEY, f2 TEXT); +-- check relpersistence of an unlogged table +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1' +UNION ALL +SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' +UNION ALL +SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' +ORDER BY relname; +CREATE UNLOGGED TABLE unlogged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged1); -- foreign key +CREATE UNLOGGED TABLE unlogged3(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged3); -- self-referencing foreign key +ALTER TABLE unlogged3 SET LOGGED; -- skip self-referencing foreign key +ALTER TABLE unlogged2 SET LOGGED; -- fails because a foreign key to an unlogged table exists +ALTER TABLE unlogged1 SET LOGGED; +-- check relpersistence of an unlogged table after changing to permanent +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1' +UNION ALL +SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' +UNION ALL +SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' +ORDER BY relname; +ALTER TABLE unlogged1 SET LOGGED; -- silently do nothing +DROP TABLE unlogged3; +DROP TABLE unlogged2; +DROP TABLE unlogged1; +-- set unlogged +CREATE TABLE logged1(f1 SERIAL PRIMARY KEY, f2 TEXT); +-- check relpersistence of a permanent table +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1' +UNION ALL +SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' +UNION ALL +SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' +ORDER BY relname; +CREATE TABLE logged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged1); -- foreign key +CREATE TABLE logged3(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged3); -- self-referencing foreign key +ALTER TABLE logged1 SET UNLOGGED; -- fails because a foreign key from a permanent table exists +ALTER TABLE logged3 SET UNLOGGED; -- skip self-referencing foreign key +ALTER TABLE logged2 SET UNLOGGED; +ALTER TABLE logged1 SET UNLOGGED; +-- check relpersistence of a permanent table after changing to unlogged +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1' +UNION ALL +SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' +UNION ALL +SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' +ORDER BY relname; +ALTER TABLE logged1 SET UNLOGGED; -- silently do nothing +DROP TABLE logged3; +DROP TABLE logged2; +DROP TABLE logged1; + +-- test ADD COLUMN IF NOT EXISTS +CREATE TABLE test_add_column(c1 integer); +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN c2 integer; +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN c2 integer; -- fail because c2 already exists +ALTER TABLE ONLY test_add_column + ADD COLUMN c2 integer; -- fail because c2 already exists +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c2 integer; -- skipping because c2 already exists +ALTER TABLE ONLY test_add_column + ADD COLUMN IF NOT EXISTS c2 integer; -- skipping because c2 already exists +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN c2 integer, -- fail because c2 already exists + ADD COLUMN c3 integer primary key; +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c2 integer, -- skipping because c2 already exists + ADD COLUMN c3 integer primary key; +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c2 integer, -- skipping because c2 already exists + ADD COLUMN IF NOT EXISTS c3 integer primary key; -- skipping because c3 already exists +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c2 integer, -- skipping because c2 already exists + ADD COLUMN IF NOT EXISTS c3 integer, -- skipping because c3 already exists + ADD COLUMN c4 integer REFERENCES test_add_column; +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c4 integer REFERENCES test_add_column; +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c5 SERIAL CHECK (c5 > 8); +\d test_add_column +ALTER TABLE test_add_column + ADD COLUMN IF NOT EXISTS c5 SERIAL CHECK (c5 > 10); +\d test_add_column* +DROP TABLE test_add_column; +\d test_add_column* + +-- assorted cases with multiple ALTER TABLE steps +CREATE TABLE ataddindex(f1 INT); +INSERT INTO ataddindex VALUES (42), (43); +CREATE UNIQUE INDEX ataddindexi0 ON ataddindex(f1); +ALTER TABLE ataddindex + ADD PRIMARY KEY USING INDEX ataddindexi0, + ALTER f1 TYPE BIGINT; +\d ataddindex +DROP TABLE ataddindex; + +CREATE TABLE ataddindex(f1 VARCHAR(10)); +INSERT INTO ataddindex(f1) VALUES ('foo'), ('a'); +ALTER TABLE ataddindex + ALTER f1 SET DATA TYPE TEXT, + ADD EXCLUDE ((f1 LIKE 'a') WITH =); +\d ataddindex +DROP TABLE ataddindex; + +CREATE TABLE ataddindex(id int, ref_id int); +ALTER TABLE ataddindex + ADD PRIMARY KEY (id), + ADD FOREIGN KEY (ref_id) REFERENCES ataddindex; +\d ataddindex +DROP TABLE ataddindex; + +CREATE TABLE ataddindex(id int, ref_id int); +ALTER TABLE ataddindex + ADD UNIQUE (id), + ADD FOREIGN KEY (ref_id) REFERENCES ataddindex (id); +\d ataddindex +DROP TABLE ataddindex; + +-- unsupported constraint types for partitioned tables +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (a, (a+b+1)); +ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); + +-- cannot drop column that is part of the partition key +ALTER TABLE partitioned DROP COLUMN a; +ALTER TABLE partitioned ALTER COLUMN a TYPE char(5); +ALTER TABLE partitioned DROP COLUMN b; +ALTER TABLE partitioned ALTER COLUMN b TYPE char(5); + +-- partitioned table cannot participate in regular inheritance +CREATE TABLE nonpartitioned ( + a int, + b int +); +ALTER TABLE partitioned INHERIT nonpartitioned; +ALTER TABLE nonpartitioned INHERIT partitioned; + +-- cannot add NO INHERIT constraint to partitioned tables +ALTER TABLE partitioned ADD CONSTRAINT chk_a CHECK (a > 0) NO INHERIT; + +DROP TABLE partitioned, nonpartitioned; + +-- +-- ATTACH PARTITION +-- + +-- check that target table is partitioned +CREATE TABLE unparted ( + a int +); +CREATE TABLE fail_part (like unparted); +ALTER TABLE unparted ATTACH PARTITION fail_part FOR VALUES IN ('a'); +DROP TABLE unparted, fail_part; + +-- check that partition bound is compatible +CREATE TABLE list_parted ( + a int NOT NULL, + b char(2) COLLATE "C", + CONSTRAINT check_a CHECK (a > 0) +) PARTITION BY LIST (a); +CREATE TABLE fail_part (LIKE list_parted); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES FROM (1) TO (10); +DROP TABLE fail_part; + +-- check that the table being attached exists +ALTER TABLE list_parted ATTACH PARTITION nonexistent FOR VALUES IN (1); + +-- check ownership of the source table +CREATE ROLE regress_test_me; +CREATE ROLE regress_test_not_me; +CREATE TABLE not_owned_by_me (LIKE list_parted); +ALTER TABLE not_owned_by_me OWNER TO regress_test_not_me; +SET SESSION AUTHORIZATION regress_test_me; +CREATE TABLE owned_by_me ( + a int +) PARTITION BY LIST (a); +ALTER TABLE owned_by_me ATTACH PARTITION not_owned_by_me FOR VALUES IN (1); +RESET SESSION AUTHORIZATION; +DROP TABLE owned_by_me, not_owned_by_me; +DROP ROLE regress_test_not_me; +DROP ROLE regress_test_me; + +-- check that the table being attached is not part of regular inheritance +CREATE TABLE parent (LIKE list_parted); +CREATE TABLE child () INHERITS (parent); +ALTER TABLE list_parted ATTACH PARTITION child FOR VALUES IN (1); +ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1); +DROP TABLE parent CASCADE; + +-- check any TEMP-ness +CREATE TEMP TABLE temp_parted (a int) PARTITION BY LIST (a); +CREATE TABLE perm_part (a int); +ALTER TABLE temp_parted ATTACH PARTITION perm_part FOR VALUES IN (1); +DROP TABLE temp_parted, perm_part; + +-- check that the table being attached is not a typed table +CREATE TYPE mytype AS (a int); +CREATE TABLE fail_part OF mytype; +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +DROP TYPE mytype CASCADE; + +-- check that the table being attached has only columns present in the parent +CREATE TABLE fail_part (like list_parted, c int); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +DROP TABLE fail_part; + +-- check that the table being attached has every column of the parent +CREATE TABLE fail_part (a int NOT NULL); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +DROP TABLE fail_part; + +-- check that columns match in type, collation and NOT NULL status +CREATE TABLE fail_part ( + b char(3), + a int NOT NULL +); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +ALTER TABLE fail_part ALTER b TYPE char (2) COLLATE "POSIX"; +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +DROP TABLE fail_part; + +-- check that the table being attached has all constraints of the parent +CREATE TABLE fail_part ( + b char(2) COLLATE "C", + a int NOT NULL +); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); + +-- check that the constraint matches in definition with parent's constraint +ALTER TABLE fail_part ADD CONSTRAINT check_a CHECK (a >= 0); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +DROP TABLE fail_part; + +-- check the attributes and constraints after partition is attached +CREATE TABLE part_1 ( + a int NOT NULL, + b char(2) COLLATE "C", + CONSTRAINT check_a CHECK (a > 0) +); +ALTER TABLE list_parted ATTACH PARTITION part_1 FOR VALUES IN (1); +-- attislocal and conislocal are always false for merged attributes and constraints respectively. +SELECT attislocal, attinhcount FROM pg_attribute WHERE attrelid = 'part_1'::regclass AND attnum > 0; +SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_1'::regclass AND conname = 'check_a'; + +-- check that the new partition won't overlap with an existing partition +CREATE TABLE fail_part (LIKE part_1 INCLUDING CONSTRAINTS); +ALTER TABLE list_parted ATTACH PARTITION fail_part FOR VALUES IN (1); +DROP TABLE fail_part; +-- check that an existing table can be attached as a default partition +CREATE TABLE def_part (LIKE list_parted INCLUDING CONSTRAINTS); +ALTER TABLE list_parted ATTACH PARTITION def_part DEFAULT; +-- check attaching default partition fails if a default partition already +-- exists +CREATE TABLE fail_def_part (LIKE part_1 INCLUDING CONSTRAINTS); +ALTER TABLE list_parted ATTACH PARTITION fail_def_part DEFAULT; + +-- check validation when attaching list partitions +CREATE TABLE list_parted2 ( + a int, + b char +) PARTITION BY LIST (a); + +-- check that violating rows are correctly reported +CREATE TABLE part_2 (LIKE list_parted2); +INSERT INTO part_2 VALUES (3, 'a'); +ALTER TABLE list_parted2 ATTACH PARTITION part_2 FOR VALUES IN (2); + +-- should be ok after deleting the bad row +DELETE FROM part_2; +ALTER TABLE list_parted2 ATTACH PARTITION part_2 FOR VALUES IN (2); + +-- check partition cannot be attached if default has some row for its values +CREATE TABLE list_parted2_def PARTITION OF list_parted2 DEFAULT; +INSERT INTO list_parted2_def VALUES (11, 'z'); +CREATE TABLE part_3 (LIKE list_parted2); +ALTER TABLE list_parted2 ATTACH PARTITION part_3 FOR VALUES IN (11); +-- should be ok after deleting the bad row +DELETE FROM list_parted2_def WHERE a = 11; +ALTER TABLE list_parted2 ATTACH PARTITION part_3 FOR VALUES IN (11); + +-- adding constraints that describe the desired partition constraint +-- (or more restrictive) will help skip the validation scan +CREATE TABLE part_3_4 ( + LIKE list_parted2, + CONSTRAINT check_a CHECK (a IN (3)) +); + +-- however, if a list partition does not accept nulls, there should be +-- an explicit NOT NULL constraint on the partition key column for the +-- validation scan to be skipped; +ALTER TABLE list_parted2 ATTACH PARTITION part_3_4 FOR VALUES IN (3, 4); + +-- adding a NOT NULL constraint will cause the scan to be skipped +ALTER TABLE list_parted2 DETACH PARTITION part_3_4; +ALTER TABLE part_3_4 ALTER a SET NOT NULL; +ALTER TABLE list_parted2 ATTACH PARTITION part_3_4 FOR VALUES IN (3, 4); + +-- check if default partition scan skipped +ALTER TABLE list_parted2_def ADD CONSTRAINT check_a CHECK (a IN (5, 6)); +CREATE TABLE part_55_66 PARTITION OF list_parted2 FOR VALUES IN (55, 66); + +-- check validation when attaching range partitions +CREATE TABLE range_parted ( + a int, + b int +) PARTITION BY RANGE (a, b); + +-- check that violating rows are correctly reported +CREATE TABLE part1 ( + a int NOT NULL CHECK (a = 1), + b int NOT NULL CHECK (b >= 1 AND b <= 10) +); +INSERT INTO part1 VALUES (1, 10); +-- Remember the TO bound is exclusive +ALTER TABLE range_parted ATTACH PARTITION part1 FOR VALUES FROM (1, 1) TO (1, 10); + +-- should be ok after deleting the bad row +DELETE FROM part1; +ALTER TABLE range_parted ATTACH PARTITION part1 FOR VALUES FROM (1, 1) TO (1, 10); + +-- adding constraints that describe the desired partition constraint +-- (or more restrictive) will help skip the validation scan +CREATE TABLE part2 ( + a int NOT NULL CHECK (a = 1), + b int NOT NULL CHECK (b >= 10 AND b < 18) +); +ALTER TABLE range_parted ATTACH PARTITION part2 FOR VALUES FROM (1, 10) TO (1, 20); + +-- Create default partition +CREATE TABLE partr_def1 PARTITION OF range_parted DEFAULT; + +-- Only one default partition is allowed, hence, following should give error +CREATE TABLE partr_def2 (LIKE part1 INCLUDING CONSTRAINTS); +ALTER TABLE range_parted ATTACH PARTITION partr_def2 DEFAULT; + +-- Overlapping partitions cannot be attached, hence, following should give error +INSERT INTO partr_def1 VALUES (2, 10); +CREATE TABLE part3 (LIKE range_parted); +ALTER TABLE range_parted ATTACH partition part3 FOR VALUES FROM (2, 10) TO (2, 20); + +-- Attaching partitions should be successful when there are no overlapping rows +ALTER TABLE range_parted ATTACH partition part3 FOR VALUES FROM (3, 10) TO (3, 20); + +-- check that leaf partitions are scanned when attaching a partitioned +-- table +CREATE TABLE part_5 ( + LIKE list_parted2 +) PARTITION BY LIST (b); + +-- check that violating rows are correctly reported +CREATE TABLE part_5_a PARTITION OF part_5 FOR VALUES IN ('a'); +INSERT INTO part_5_a (a, b) VALUES (6, 'a'); +ALTER TABLE list_parted2 ATTACH PARTITION part_5 FOR VALUES IN (5); + +-- delete the faulting row and also add a constraint to skip the scan +DELETE FROM part_5_a WHERE a NOT IN (3); +ALTER TABLE part_5 ADD CONSTRAINT check_a CHECK (a IS NOT NULL AND a = 5); +ALTER TABLE list_parted2 ATTACH PARTITION part_5 FOR VALUES IN (5); +ALTER TABLE list_parted2 DETACH PARTITION part_5; +ALTER TABLE part_5 DROP CONSTRAINT check_a; + +-- scan should again be skipped, even though NOT NULL is now a column property +ALTER TABLE part_5 ADD CONSTRAINT check_a CHECK (a IN (5)), ALTER a SET NOT NULL; +ALTER TABLE list_parted2 ATTACH PARTITION part_5 FOR VALUES IN (5); + +-- Check the case where attnos of the partitioning columns in the table being +-- attached differs from the parent. It should not affect the constraint- +-- checking logic that allows to skip the scan. +CREATE TABLE part_6 ( + c int, + LIKE list_parted2, + CONSTRAINT check_a CHECK (a IS NOT NULL AND a = 6) +); +ALTER TABLE part_6 DROP c; +ALTER TABLE list_parted2 ATTACH PARTITION part_6 FOR VALUES IN (6); + +-- Similar to above, but the table being attached is a partitioned table +-- whose partition has still different attnos for the root partitioning +-- columns. +CREATE TABLE part_7 ( + LIKE list_parted2, + CONSTRAINT check_a CHECK (a IS NOT NULL AND a = 7) +) PARTITION BY LIST (b); +CREATE TABLE part_7_a_null ( + c int, + d int, + e int, + LIKE list_parted2, -- 'a' will have attnum = 4 + CONSTRAINT check_b CHECK (b IS NULL OR b = 'a'), + CONSTRAINT check_a CHECK (a IS NOT NULL AND a = 7) +); +ALTER TABLE part_7_a_null DROP c, DROP d, DROP e; +ALTER TABLE part_7 ATTACH PARTITION part_7_a_null FOR VALUES IN ('a', null); +ALTER TABLE list_parted2 ATTACH PARTITION part_7 FOR VALUES IN (7); + +-- Same example, but check this time that the constraint correctly detects +-- violating rows +ALTER TABLE list_parted2 DETACH PARTITION part_7; +ALTER TABLE part_7 DROP CONSTRAINT check_a; -- thusly, scan won't be skipped +INSERT INTO part_7 (a, b) VALUES (8, null), (9, 'a'); +SELECT tableoid::regclass, a, b FROM part_7 order by a; +ALTER TABLE list_parted2 ATTACH PARTITION part_7 FOR VALUES IN (7); + +-- check that leaf partitions of default partition are scanned when +-- attaching a partitioned table. +ALTER TABLE part_5 DROP CONSTRAINT check_a; +CREATE TABLE part5_def PARTITION OF part_5 DEFAULT PARTITION BY LIST(a); +CREATE TABLE part5_def_p1 PARTITION OF part5_def FOR VALUES IN (5); +INSERT INTO part5_def_p1 VALUES (5, 'y'); +CREATE TABLE part5_p1 (LIKE part_5); +ALTER TABLE part_5 ATTACH PARTITION part5_p1 FOR VALUES IN ('y'); +-- should be ok after deleting the bad row +DELETE FROM part5_def_p1 WHERE b = 'y'; +ALTER TABLE part_5 ATTACH PARTITION part5_p1 FOR VALUES IN ('y'); + +-- check that the table being attached is not already a partition +ALTER TABLE list_parted2 ATTACH PARTITION part_2 FOR VALUES IN (2); + +-- check that circular inheritance is not allowed +ALTER TABLE part_5 ATTACH PARTITION list_parted2 FOR VALUES IN ('b'); +ALTER TABLE list_parted2 ATTACH PARTITION list_parted2 FOR VALUES IN (0); + +-- If a partitioned table being created or an existing table being attached +-- as a partition does not have a constraint that would allow validation scan +-- to be skipped, but an individual partition does, then the partition's +-- validation scan is skipped. +CREATE TABLE quuux (a int, b text) PARTITION BY LIST (a); +CREATE TABLE quuux_default PARTITION OF quuux DEFAULT PARTITION BY LIST (b); +CREATE TABLE quuux_default1 PARTITION OF quuux_default ( + CONSTRAINT check_1 CHECK (a IS NOT NULL AND a = 1) +) FOR VALUES IN ('b'); +CREATE TABLE quuux1 (a int, b text); +ALTER TABLE quuux ATTACH PARTITION quuux1 FOR VALUES IN (1); -- validate! +CREATE TABLE quuux2 (a int, b text); +ALTER TABLE quuux ATTACH PARTITION quuux2 FOR VALUES IN (2); -- skip validation +DROP TABLE quuux1, quuux2; +-- should validate for quuux1, but not for quuux2 +CREATE TABLE quuux1 PARTITION OF quuux FOR VALUES IN (1); +CREATE TABLE quuux2 PARTITION OF quuux FOR VALUES IN (2); +DROP TABLE quuux; + +-- check validation when attaching hash partitions + +-- Use hand-rolled hash functions and operator class to get predictable result +-- on different machines. part_test_int4_ops is defined in insert.sql. + +-- check that the new partition won't overlap with an existing partition +CREATE TABLE hash_parted ( + a int, + b int +) PARTITION BY HASH (a part_test_int4_ops); +CREATE TABLE hpart_1 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 4, REMAINDER 0); +CREATE TABLE fail_part (LIKE hpart_1); +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 8, REMAINDER 4); +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 8, REMAINDER 0); +DROP TABLE fail_part; + +-- check validation when attaching hash partitions + +-- check that violating rows are correctly reported +CREATE TABLE hpart_2 (LIKE hash_parted); +INSERT INTO hpart_2 VALUES (3, 0); +ALTER TABLE hash_parted ATTACH PARTITION hpart_2 FOR VALUES WITH (MODULUS 4, REMAINDER 1); + +-- should be ok after deleting the bad row +DELETE FROM hpart_2; +ALTER TABLE hash_parted ATTACH PARTITION hpart_2 FOR VALUES WITH (MODULUS 4, REMAINDER 1); + +-- check that leaf partitions are scanned when attaching a partitioned +-- table +CREATE TABLE hpart_5 ( + LIKE hash_parted +) PARTITION BY LIST (b); + +-- check that violating rows are correctly reported +CREATE TABLE hpart_5_a PARTITION OF hpart_5 FOR VALUES IN ('1', '2', '3'); +INSERT INTO hpart_5_a (a, b) VALUES (7, 1); +ALTER TABLE hash_parted ATTACH PARTITION hpart_5 FOR VALUES WITH (MODULUS 4, REMAINDER 2); + +-- should be ok after deleting the bad row +DELETE FROM hpart_5_a; +ALTER TABLE hash_parted ATTACH PARTITION hpart_5 FOR VALUES WITH (MODULUS 4, REMAINDER 2); + +-- check that the table being attach is with valid modulus and remainder value +CREATE TABLE fail_part(LIKE hash_parted); +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 0, REMAINDER 1); +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 8, REMAINDER 8); +ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 3, REMAINDER 2); +DROP TABLE fail_part; + +-- fails with incorrect object type +CREATE VIEW at_v1 AS SELECT 1 as a; +ALTER TABLE at_v1 ATTACH PARTITION dummy default; +DROP VIEW at_v1; + +-- +-- DETACH PARTITION +-- + +-- check that the table is partitioned at all +CREATE TABLE regular_table (a int); +ALTER TABLE regular_table DETACH PARTITION any_name; +DROP TABLE regular_table; + +-- check that the partition being detached exists at all +ALTER TABLE list_parted2 DETACH PARTITION part_4; +ALTER TABLE hash_parted DETACH PARTITION hpart_4; + +-- check that the partition being detached is actually a partition of the parent +CREATE TABLE not_a_part (a int); +ALTER TABLE list_parted2 DETACH PARTITION not_a_part; +ALTER TABLE list_parted2 DETACH PARTITION part_1; + +ALTER TABLE hash_parted DETACH PARTITION not_a_part; +DROP TABLE not_a_part; + +-- check that, after being detached, attinhcount/coninhcount is dropped to 0 and +-- attislocal/conislocal is set to true +ALTER TABLE list_parted2 DETACH PARTITION part_3_4; +SELECT attinhcount, attislocal FROM pg_attribute WHERE attrelid = 'part_3_4'::regclass AND attnum > 0; +SELECT coninhcount, conislocal FROM pg_constraint WHERE conrelid = 'part_3_4'::regclass AND conname = 'check_a'; +DROP TABLE part_3_4; + +-- check that a detached partition is not dropped on dropping a partitioned table +CREATE TABLE range_parted2 ( + a int +) PARTITION BY RANGE(a); +CREATE TABLE part_rp PARTITION OF range_parted2 FOR VALUES FROM (0) to (100); +ALTER TABLE range_parted2 DETACH PARTITION part_rp; +DROP TABLE range_parted2; +SELECT * from part_rp; +DROP TABLE part_rp; + +-- concurrent detach +CREATE TABLE range_parted2 ( + a int +) PARTITION BY RANGE(a); +CREATE TABLE part_rp PARTITION OF range_parted2 FOR VALUES FROM (0) to (100); +BEGIN; +-- doesn't work in a partition block +ALTER TABLE range_parted2 DETACH PARTITION part_rp CONCURRENTLY; +COMMIT; +CREATE TABLE part_rpd PARTITION OF range_parted2 DEFAULT; +-- doesn't work if there's a default partition +ALTER TABLE range_parted2 DETACH PARTITION part_rp CONCURRENTLY; +-- doesn't work for the default partition +ALTER TABLE range_parted2 DETACH PARTITION part_rpd CONCURRENTLY; +DROP TABLE part_rpd; +-- works fine +ALTER TABLE range_parted2 DETACH PARTITION part_rp CONCURRENTLY; +\d+ range_parted2 +-- constraint should be created +\d part_rp +CREATE TABLE part_rp100 PARTITION OF range_parted2 (CHECK (a>=123 AND a<133 AND a IS NOT NULL)) FOR VALUES FROM (100) to (200); +ALTER TABLE range_parted2 DETACH PARTITION part_rp100 CONCURRENTLY; +-- redundant constraint should not be created +\d part_rp100 +DROP TABLE range_parted2; + +-- Check ALTER TABLE commands for partitioned tables and partitions + +-- cannot add/drop column to/from *only* the parent +ALTER TABLE ONLY list_parted2 ADD COLUMN c int; +ALTER TABLE ONLY list_parted2 DROP COLUMN b; + +-- cannot add a column to partition or drop an inherited one +ALTER TABLE part_2 ADD COLUMN c text; +ALTER TABLE part_2 DROP COLUMN b; + +-- Nor rename, alter type +ALTER TABLE part_2 RENAME COLUMN b to c; +ALTER TABLE part_2 ALTER COLUMN b TYPE text; + +-- cannot add/drop NOT NULL or check constraints to *only* the parent, when +-- partitions exist +ALTER TABLE ONLY list_parted2 ALTER b SET NOT NULL; +ALTER TABLE ONLY list_parted2 ADD CONSTRAINT check_b CHECK (b <> 'zz'); + +ALTER TABLE list_parted2 ALTER b SET NOT NULL; +ALTER TABLE ONLY list_parted2 ALTER b DROP NOT NULL; +ALTER TABLE list_parted2 ADD CONSTRAINT check_b CHECK (b <> 'zz'); +ALTER TABLE ONLY list_parted2 DROP CONSTRAINT check_b; + +-- It's alright though, if no partitions are yet created +CREATE TABLE parted_no_parts (a int) PARTITION BY LIST (a); +ALTER TABLE ONLY parted_no_parts ALTER a SET NOT NULL; +ALTER TABLE ONLY parted_no_parts ADD CONSTRAINT check_a CHECK (a > 0); +ALTER TABLE ONLY parted_no_parts ALTER a DROP NOT NULL; +ALTER TABLE ONLY parted_no_parts DROP CONSTRAINT check_a; +DROP TABLE parted_no_parts; + +-- cannot drop inherited NOT NULL or check constraints from partition +ALTER TABLE list_parted2 ALTER b SET NOT NULL, ADD CONSTRAINT check_a2 CHECK (a > 0); +ALTER TABLE part_2 ALTER b DROP NOT NULL; +ALTER TABLE part_2 DROP CONSTRAINT check_a2; + +-- Doesn't make sense to add NO INHERIT constraints on partitioned tables +ALTER TABLE list_parted2 add constraint check_b2 check (b <> 'zz') NO INHERIT; + +-- check that a partition cannot participate in regular inheritance +CREATE TABLE inh_test () INHERITS (part_2); +CREATE TABLE inh_test (LIKE part_2); +ALTER TABLE inh_test INHERIT part_2; +ALTER TABLE part_2 INHERIT inh_test; + +-- cannot drop or alter type of partition key columns of lower level +-- partitioned tables; for example, part_5, which is list_parted2's +-- partition, is partitioned on b; +ALTER TABLE list_parted2 DROP COLUMN b; +ALTER TABLE list_parted2 ALTER COLUMN b TYPE text; + +-- dropping non-partition key columns should be allowed on the parent table. +ALTER TABLE list_parted DROP COLUMN b; +SELECT * FROM list_parted; + +-- cleanup +DROP TABLE list_parted, list_parted2, range_parted; +DROP TABLE fail_def_part; +DROP TABLE hash_parted; + +-- more tests for certain multi-level partitioning scenarios +create table p (a int, b int) partition by range (a, b); +create table p1 (b int, a int not null) partition by range (b); +create table p11 (like p1); +alter table p11 drop a; +alter table p11 add a int; +alter table p11 drop a; +alter table p11 add a int not null; +-- attnum for key attribute 'a' is different in p, p1, and p11 +select attrelid::regclass, attname, attnum +from pg_attribute +where attname = 'a' + and (attrelid = 'p'::regclass + or attrelid = 'p1'::regclass + or attrelid = 'p11'::regclass) +order by attrelid::regclass::text; + +alter table p1 attach partition p11 for values from (2) to (5); + +insert into p1 (a, b) values (2, 3); +-- check that partition validation scan correctly detects violating rows +alter table p attach partition p1 for values from (1, 2) to (1, 10); + +-- cleanup +drop table p; +drop table p1; + +-- validate constraint on partitioned tables should only scan leaf partitions +create table parted_validate_test (a int) partition by list (a); +create table parted_validate_test_1 partition of parted_validate_test for values in (0, 1); +alter table parted_validate_test add constraint parted_validate_test_chka check (a > 0) not valid; +alter table parted_validate_test validate constraint parted_validate_test_chka; +drop table parted_validate_test; +-- test alter column options +CREATE TABLE attmp(i integer); +INSERT INTO attmp VALUES (1); +ALTER TABLE attmp ALTER COLUMN i SET (n_distinct = 1, n_distinct_inherited = 2); +ALTER TABLE attmp ALTER COLUMN i RESET (n_distinct_inherited); +ANALYZE attmp; +DROP TABLE attmp; + +DROP USER regress_alter_table_user1; + +-- check that violating rows are correctly reported when attaching as the +-- default partition +create table defpart_attach_test (a int) partition by list (a); +create table defpart_attach_test1 partition of defpart_attach_test for values in (1); +create table defpart_attach_test_d (b int, a int); +alter table defpart_attach_test_d drop b; +insert into defpart_attach_test_d values (1), (2); + +-- error because its constraint as the default partition would be violated +-- by the row containing 1 +alter table defpart_attach_test attach partition defpart_attach_test_d default; +delete from defpart_attach_test_d where a = 1; +alter table defpart_attach_test_d add check (a > 1); + +-- should be attached successfully and without needing to be scanned +alter table defpart_attach_test attach partition defpart_attach_test_d default; + +-- check that attaching a partition correctly reports any rows in the default +-- partition that should not be there for the new partition to be attached +-- successfully +create table defpart_attach_test_2 (like defpart_attach_test_d); +alter table defpart_attach_test attach partition defpart_attach_test_2 for values in (2); + +drop table defpart_attach_test; + +-- check combinations of temporary and permanent relations when attaching +-- partitions. +create table perm_part_parent (a int) partition by list (a); +create temp table temp_part_parent (a int) partition by list (a); +create table perm_part_child (a int); +create temp table temp_part_child (a int); +alter table temp_part_parent attach partition perm_part_child default; -- error +alter table perm_part_parent attach partition temp_part_child default; -- error +alter table temp_part_parent attach partition temp_part_child default; -- ok +drop table perm_part_parent cascade; +drop table temp_part_parent cascade; + +-- check that attaching partitions to a table while it is being used is +-- prevented +create table tab_part_attach (a int) partition by list (a); +create or replace function func_part_attach() returns trigger + language plpgsql as $$ + begin + execute 'create table tab_part_attach_1 (a int)'; + execute 'alter table tab_part_attach attach partition tab_part_attach_1 for values in (1)'; + return null; + end $$; +create trigger trig_part_attach before insert on tab_part_attach + for each statement execute procedure func_part_attach(); +insert into tab_part_attach values (1); +drop table tab_part_attach; +drop function func_part_attach(); + +-- test case where the partitioning operator is a SQL function whose +-- evaluation results in the table's relcache being rebuilt partway through +-- the execution of an ATTACH PARTITION command +create function at_test_sql_partop (int4, int4) returns int language sql +as $$ select case when $1 = $2 then 0 when $1 > $2 then 1 else -1 end; $$; +create operator class at_test_sql_partop for type int4 using btree as + operator 1 < (int4, int4), operator 2 <= (int4, int4), + operator 3 = (int4, int4), operator 4 >= (int4, int4), + operator 5 > (int4, int4), function 1 at_test_sql_partop(int4, int4); +create table at_test_sql_partop (a int) partition by range (a at_test_sql_partop); +create table at_test_sql_partop_1 (a int); +alter table at_test_sql_partop attach partition at_test_sql_partop_1 for values from (0) to (10); +drop table at_test_sql_partop; +drop operator class at_test_sql_partop using btree; +drop function at_test_sql_partop; + + +/* Test case for bug #16242 */ + +-- We create a parent and child where the child has missing +-- non-null attribute values, and arrange to pass them through +-- tuple conversion from the child to the parent tupdesc +create table bar1 (a integer, b integer not null default 1) + partition by range (a); +create table bar2 (a integer); +insert into bar2 values (1); +alter table bar2 add column b integer not null default 1; +-- (at this point bar2 contains tuple with natts=1) +alter table bar1 attach partition bar2 default; + +-- this works: +select * from bar1; + +-- this exercises tuple conversion: +create function xtrig() + returns trigger language plpgsql +as $$ + declare + r record; + begin + for r in select * from old loop + raise info 'a=%, b=%', r.a, r.b; + end loop; + return NULL; + end; +$$; +create trigger xtrig + after update on bar1 + referencing old table as old + for each statement execute procedure xtrig(); + +update bar1 set a = a + 1; + +/* End test case for bug #16242 */ + +/* Test case for bug #17409 */ + +create table attbl (p1 int constraint pk_attbl primary key); +create table atref (c1 int references attbl(p1)); +cluster attbl using pk_attbl; +alter table attbl alter column p1 set data type bigint; +alter table atref alter column c1 set data type bigint; +drop table attbl, atref; + +create table attbl (p1 int constraint pk_attbl primary key); +alter table attbl replica identity using index pk_attbl; +create table atref (c1 int references attbl(p1)); +alter table attbl alter column p1 set data type bigint; +alter table atref alter column c1 set data type bigint; +drop table attbl, atref; + +/* End test case for bug #17409 */ + +-- Test that ALTER TABLE rewrite preserves a clustered index +-- for normal indexes and indexes on constraints. +create table alttype_cluster (a int); +alter table alttype_cluster add primary key (a); +create index alttype_cluster_ind on alttype_cluster (a); +alter table alttype_cluster cluster on alttype_cluster_ind; +-- Normal index remains clustered. +select indexrelid::regclass, indisclustered from pg_index + where indrelid = 'alttype_cluster'::regclass + order by indexrelid::regclass::text; +alter table alttype_cluster alter a type bigint; +select indexrelid::regclass, indisclustered from pg_index + where indrelid = 'alttype_cluster'::regclass + order by indexrelid::regclass::text; +-- Constraint index remains clustered. +alter table alttype_cluster cluster on alttype_cluster_pkey; +select indexrelid::regclass, indisclustered from pg_index + where indrelid = 'alttype_cluster'::regclass + order by indexrelid::regclass::text; +alter table alttype_cluster alter a type int; +select indexrelid::regclass, indisclustered from pg_index + where indrelid = 'alttype_cluster'::regclass + order by indexrelid::regclass::text; +drop table alttype_cluster; + +-- +-- Check that attaching or detaching a partitioned partition correctly leads +-- to its partitions' constraint being updated to reflect the parent's +-- newly added/removed constraint +create table target_parted (a int, b int) partition by list (a); +create table attach_parted (a int, b int) partition by list (b); +create table attach_parted_part1 partition of attach_parted for values in (1); +-- insert a row directly into the leaf partition so that its partition +-- constraint is built and stored in the relcache +insert into attach_parted_part1 values (1, 1); +-- the following better invalidate the partition constraint of the leaf +-- partition too... +alter table target_parted attach partition attach_parted for values in (1); +-- ...such that the following insert fails +insert into attach_parted_part1 values (2, 1); +-- ...and doesn't when the partition is detached along with its own partition +alter table target_parted detach partition attach_parted; +insert into attach_parted_part1 values (2, 1); diff --git a/src/test/singlenode_regress/sql/amutils.sql b/src/test/singlenode_regress/sql/amutils.sql new file mode 100644 index 00000000000..06e7fa10d95 --- /dev/null +++ b/src/test/singlenode_regress/sql/amutils.sql @@ -0,0 +1,99 @@ +-- +-- Test index AM property-reporting functions +-- + +select prop, + pg_indexam_has_property(a.oid, prop) as "AM", + pg_index_has_property('onek_hundred'::regclass, prop) as "Index", + pg_index_column_has_property('onek_hundred'::regclass, 1, prop) as "Column" + from pg_am a, + unnest(array['asc', 'desc', 'nulls_first', 'nulls_last', + 'orderable', 'distance_orderable', 'returnable', + 'search_array', 'search_nulls', + 'clusterable', 'index_scan', 'bitmap_scan', + 'backward_scan', + 'can_order', 'can_unique', 'can_multi_col', + 'can_exclude', 'can_include', + 'bogus']::text[]) + with ordinality as u(prop,ord) + where a.amname = 'btree' + order by ord; + +select prop, + pg_indexam_has_property(a.oid, prop) as "AM", + pg_index_has_property('gcircleind'::regclass, prop) as "Index", + pg_index_column_has_property('gcircleind'::regclass, 1, prop) as "Column" + from pg_am a, + unnest(array['asc', 'desc', 'nulls_first', 'nulls_last', + 'orderable', 'distance_orderable', 'returnable', + 'search_array', 'search_nulls', + 'clusterable', 'index_scan', 'bitmap_scan', + 'backward_scan', + 'can_order', 'can_unique', 'can_multi_col', + 'can_exclude', 'can_include', + 'bogus']::text[]) + with ordinality as u(prop,ord) + where a.amname = 'gist' + order by ord; + +select prop, + pg_index_column_has_property('onek_hundred'::regclass, 1, prop) as btree, + pg_index_column_has_property('hash_i4_index'::regclass, 1, prop) as hash, + pg_index_column_has_property('gcircleind'::regclass, 1, prop) as gist, + pg_index_column_has_property('sp_radix_ind'::regclass, 1, prop) as spgist_radix, + pg_index_column_has_property('sp_quad_ind'::regclass, 1, prop) as spgist_quad, + pg_index_column_has_property('botharrayidx'::regclass, 1, prop) as gin, + pg_index_column_has_property('brinidx'::regclass, 1, prop) as brin + from unnest(array['asc', 'desc', 'nulls_first', 'nulls_last', + 'orderable', 'distance_orderable', 'returnable', + 'search_array', 'search_nulls', + 'bogus']::text[]) + with ordinality as u(prop,ord) + order by ord; + +select prop, + pg_index_has_property('onek_hundred'::regclass, prop) as btree, + pg_index_has_property('hash_i4_index'::regclass, prop) as hash, + pg_index_has_property('gcircleind'::regclass, prop) as gist, + pg_index_has_property('sp_radix_ind'::regclass, prop) as spgist, + pg_index_has_property('botharrayidx'::regclass, prop) as gin, + pg_index_has_property('brinidx'::regclass, prop) as brin + from unnest(array['clusterable', 'index_scan', 'bitmap_scan', + 'backward_scan', + 'bogus']::text[]) + with ordinality as u(prop,ord) + order by ord; + +select amname, prop, pg_indexam_has_property(a.oid, prop) as p + from pg_am a, + unnest(array['can_order', 'can_unique', 'can_multi_col', + 'can_exclude', 'can_include', 'bogus']::text[]) + with ordinality as u(prop,ord) + where amtype = 'i' + order by amname, ord; + +-- +-- additional checks for pg_index_column_has_property +-- +CREATE TEMP TABLE foo (f1 int, f2 int, f3 int, f4 int); + +CREATE INDEX fooindex ON foo (f1 desc, f2 asc, f3 nulls first, f4 nulls last); + +select col, prop, pg_index_column_has_property(o, col, prop) + from (values ('fooindex'::regclass)) v1(o), + (values (1,'orderable'),(2,'asc'),(3,'desc'), + (4,'nulls_first'),(5,'nulls_last'), + (6, 'bogus')) v2(idx,prop), + generate_series(1,4) col + order by col, idx; + +CREATE INDEX foocover ON foo (f1) INCLUDE (f2,f3); + +select col, prop, pg_index_column_has_property(o, col, prop) + from (values ('foocover'::regclass)) v1(o), + (values (1,'orderable'),(2,'asc'),(3,'desc'), + (4,'nulls_first'),(5,'nulls_last'), + (6,'distance_orderable'),(7,'returnable'), + (8, 'bogus')) v2(idx,prop), + generate_series(1,3) col + order by col, idx; diff --git a/src/test/singlenode_regress/sql/aoco_privileges.sql b/src/test/singlenode_regress/sql/aoco_privileges.sql new file mode 100644 index 00000000000..3cda78e31c7 --- /dev/null +++ b/src/test/singlenode_regress/sql/aoco_privileges.sql @@ -0,0 +1,63 @@ +-- Create roles. -- +CREATE ROLE new_aoco_table_owner; +CREATE ROLE user_with_privileges_from_first_owner; +CREATE ROLE user_with_privileges_from_second_owner; +CREATE ROLE user_with_no_privileges; + +-- Create the table. -- +CREATE TABLE aoco_privileges_table (a int) WITH (appendonly=true, orientation=column); + +-- Grant privileges to only one user +GRANT ALL ON aoco_privileges_table TO user_with_privileges_from_first_owner; +SELECT has_table_privilege('user_with_privileges_from_first_owner', 'aoco_privileges_table', 'SELECT'); + +-- The original owner should have privileges +SELECT has_table_privilege('aoco_privileges_table', 'SELECT'); + +-- The following users should not have privileges +SELECT has_table_privilege('new_aoco_table_owner', 'aoco_privileges_table', 'SELECT'); +SELECT has_table_privilege('user_with_privileges_from_second_owner', 'aoco_privileges_table', 'SELECT'); +SELECT has_table_privilege('user_with_no_privileges', 'aoco_privileges_table', 'SELECT'); +SET ROLE user_with_no_privileges; +SELECT * FROM aoco_privileges_table; +RESET ROLE; + +-- Now change ownership to the new owner +ALTER TABLE aoco_privileges_table OWNER TO new_aoco_table_owner; + +-- The original owner should still have privileges +SELECT has_table_privilege('aoco_privileges_table', 'SELECT'); +SELECT * FROM aoco_privileges_table; + +-- The people to whom the original owner granted privileges should still have privileges +SELECT has_table_privilege('user_with_privileges_from_first_owner', 'aoco_privileges_table', 'SELECT'); +SET ROLE user_with_privileges_from_first_owner; +SELECT * FROM aoco_privileges_table; + +-- The new owner of the table should have privileges +SET ROLE new_aoco_table_owner; +SELECT has_table_privilege('aoco_privileges_table', 'SELECT'); +SELECT * FROM aoco_privileges_table; + +-- The new owner should be able to grant privileges +GRANT ALL ON aoco_privileges_table TO user_with_privileges_from_second_owner; +SELECT has_table_privilege('user_with_privileges_from_second_owner', 'aoco_privileges_table', 'SELECT'); +SET ROLE user_with_privileges_from_second_owner; +SELECT * FROM aoco_privileges_table; + +-- The no privileges user should have no privileges still +SET ROLE user_with_no_privileges; +SELECT has_table_privilege('aoco_privileges_table', 'SELECT'); +SELECT * FROM aoco_privileges_table; + +-- Revoke privileges +RESET ROLE; +REVOKE ALL ON aoco_privileges_table FROM user_with_privileges_from_first_owner; +SELECT has_table_privilege('user_with_privileges_from_first_owner', 'aoco_privileges_table', 'SELECT'); + +-- Clean up +DROP TABLE aoco_privileges_table; +DROP ROLE new_aoco_table_owner; +DROP ROLE user_with_privileges_from_first_owner; +DROP ROLE user_with_privileges_from_second_owner; +DROP ROLE user_with_no_privileges; diff --git a/src/test/singlenode_regress/sql/aocs_sample.sql b/src/test/singlenode_regress/sql/aocs_sample.sql new file mode 100644 index 00000000000..f8e97bc1a80 --- /dev/null +++ b/src/test/singlenode_regress/sql/aocs_sample.sql @@ -0,0 +1,126 @@ +CREATE TABLE test_aocs_tablesample_append (dist int, id int, name text) WITH (appendonly=true, orientation=column); +-- use fillfactor so we don't have to load too much data to get multiple pages + +-- Changed the column length in order to match the expected results based on relation's blocksz +INSERT INTO test_aocs_tablesample_append SELECT 0, i, repeat(i::text, 875) FROM generate_series(0, 9) s(i) ORDER BY i; +INSERT INTO test_aocs_tablesample_append SELECT 3, i, repeat(i::text, 875) FROM generate_series(10, 19) s(i) ORDER BY i; +INSERT INTO test_aocs_tablesample_append SELECT 5, i, repeat(i::text, 875) FROM generate_series(20, 29) s(i) ORDER BY i; + +-- Verify that each segment has the same amount of rows; +SELECT gp_segment_id, count(dist) FROM test_aocs_tablesample_append GROUP BY 1 ORDER BY 1; + +SELECT t.id FROM test_aocs_tablesample_append AS t TABLESAMPLE SYSTEM (50) REPEATABLE (0); +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (100.0/11) REPEATABLE (0); +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0); +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE BERNOULLI (50) REPEATABLE (0); +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE BERNOULLI (5.5) REPEATABLE (0); + +-- 100% should give repeatable count results (ie, all rows) in any case +SELECT count(*) FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (100); +SELECT count(*) FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (100) REPEATABLE (1+2); +SELECT count(*) FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (100) REPEATABLE (0.4); + +CREATE VIEW test_aocs_tablesample_append_v1 AS + SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (10*2) REPEATABLE (2); +CREATE VIEW test_aocs_tablesample_append_v2 AS + SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (99); +\d+ test_aocs_tablesample_append_v1 +\d+ test_aocs_tablesample_append_v2 + +-- check a sampled query doesn't affect cursor in progress +BEGIN; +DECLARE tablesample_cur CURSOR FOR + SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; + +FETCH FIRST FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0); + +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +-- Cloudberry: Going backwards on cursors is not supported. By closing the +-- cursor and starting again we pass the tests and keep the file closer to +-- upstream. We do test the rescan methods of tablesample afterwards. +CLOSE tablesample_cur; +DECLARE tablesample_cur CURSOR FOR SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +CLOSE tablesample_cur; +END; + +EXPLAIN (COSTS OFF) + SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (2); +EXPLAIN (COSTS OFF) + SELECT * FROM test_aocs_tablesample_append_v1; + +-- Cloudberry: Test rescan paths by forcing a nested loop +CREATE TABLE ttr1_aocs_append (a int, b int) with(appendonly=true, orientation=column); +CREATE TABLE ttr2_aocs_append (a int, b int) with(appendonly=true, orientation=column); +INSERT INTO ttr1_aocs_append VALUES (1, 1), (12, 1), (31, 1), (NULL, NULL); +INSERT INTO ttr2_aocs_append VALUES (1, 2), (12, 2), (31, 2), (NULL, 6); +ANALYZE ttr1_aocs_append; +ANALYZE ttr2_aocs_append; +SET enable_hashjoin TO OFF; +SET enable_mergejoin TO OFF; +SET enable_nestloop TO ON; + +EXPLAIN (COSTS OFF) SELECT * FROM ttr1_aocs_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2_aocs_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1_aocs_append.a = ttr2_aocs_append.a; +SELECT * FROM ttr1_aocs_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2_aocs_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1_aocs_append.a = ttr2_aocs_append.a; +EXPLAIN (COSTS OFF) SELECT * FROM ttr1_aocs_append TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2_aocs_append TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1_aocs_append.a = ttr2_aocs_append.a; +SELECT * FROM ttr1_aocs_append TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2_aocs_append TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1_aocs_append.a = ttr2_aocs_append.a; + +RESET enable_hashjoin; +RESET enable_mergejoin; +RESET enable_nestloop; + +-- check behavior during rescans, as well as correct handling of min/max pct +-- Cloudberry: does not support laterals completely, rescan specific tests above +-- start_ignore +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample bernoulli (pct)) ss; +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample system (pct)) ss; +explain (costs off) +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample system (pct)) ss + group by pct; +-- end_ignore + +-- errors +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE FOOBAR (1); + +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (NULL); +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (NULL); + +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE BERNOULLI (-1); +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE BERNOULLI (200); +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (-1); +SELECT id FROM test_aocs_tablesample_append TABLESAMPLE SYSTEM (200); + +SELECT id FROM test_aocs_tablesample_append_v1 TABLESAMPLE BERNOULLI (1); +INSERT INTO test_aocs_tablesample_append_v1 VALUES(1); + +WITH query_select AS (SELECT * FROM test_aocs_tablesample_append) +SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEATABLE (1); + +SELECT q.* FROM (SELECT * FROM test_aocs_tablesample_append) as q TABLESAMPLE BERNOULLI (5); diff --git a/src/test/singlenode_regress/sql/appendonly_sample.sql b/src/test/singlenode_regress/sql/appendonly_sample.sql new file mode 100644 index 00000000000..e2a56c7489c --- /dev/null +++ b/src/test/singlenode_regress/sql/appendonly_sample.sql @@ -0,0 +1,126 @@ +CREATE TABLE test_tablesample_append (dist int, id int, name text) WITH (appendonly=true); +-- use fillfactor so we don't have to load too much data to get multiple pages + +-- Changed the column length in order to match the expected results based on relation's blocksz +INSERT INTO test_tablesample_append SELECT 0, i, repeat(i::text, 875) FROM generate_series(0, 9) s(i) ORDER BY i; +INSERT INTO test_tablesample_append SELECT 3, i, repeat(i::text, 875) FROM generate_series(10, 19) s(i) ORDER BY i; +INSERT INTO test_tablesample_append SELECT 5, i, repeat(i::text, 875) FROM generate_series(20, 29) s(i) ORDER BY i; + +-- Verify that each segment has the same amount of rows; +SELECT gp_segment_id, count(dist) FROM test_tablesample_append GROUP BY 1 ORDER BY 1; + +SELECT t.id FROM test_tablesample_append AS t TABLESAMPLE SYSTEM (50) REPEATABLE (0); +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (100.0/11) REPEATABLE (0); +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0); +SELECT id FROM test_tablesample_append TABLESAMPLE BERNOULLI (50) REPEATABLE (0); +SELECT id FROM test_tablesample_append TABLESAMPLE BERNOULLI (5.5) REPEATABLE (0); + +-- 100% should give repeatable count results (ie, all rows) in any case +SELECT count(*) FROM test_tablesample_append TABLESAMPLE SYSTEM (100); +SELECT count(*) FROM test_tablesample_append TABLESAMPLE SYSTEM (100) REPEATABLE (1+2); +SELECT count(*) FROM test_tablesample_append TABLESAMPLE SYSTEM (100) REPEATABLE (0.4); + +CREATE VIEW test_tablesample_append_v1 AS + SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (10*2) REPEATABLE (2); +CREATE VIEW test_tablesample_append_v2 AS + SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (99); +\d+ test_tablesample_append_v1 +\d+ test_tablesample_append_v2 + +-- check a sampled query doesn't affect cursor in progress +BEGIN; +DECLARE tablesample_cur CURSOR FOR + SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; + +FETCH FIRST FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0); + +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +-- Cloudberry: Going backwards on cursors is not supported. By closing the +-- cursor and starting again we pass the tests and keep the file closer to +-- upstream. We do test the rescan methods of tablesample afterwards. +CLOSE tablesample_cur; +DECLARE tablesample_cur CURSOR FOR SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +CLOSE tablesample_cur; +END; + +EXPLAIN (COSTS OFF) + SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (2); +EXPLAIN (COSTS OFF) + SELECT * FROM test_tablesample_append_v1; + +-- Cloudberry: Test rescan paths by forcing a nested loop +CREATE TABLE ttr1_append (a int, b int) with(appendonly=true); +CREATE TABLE ttr2_append (a int, b int) with(appendonly=true); +INSERT INTO ttr1_append VALUES (1, 1), (12, 1), (31, 1), (NULL, NULL); +INSERT INTO ttr2_append VALUES (1, 2), (12, 2), (31, 2), (NULL, 6); +ANALYZE ttr1_append; +ANALYZE ttr2_append; +SET enable_hashjoin TO OFF; +SET enable_mergejoin TO OFF; +SET enable_nestloop TO ON; + +EXPLAIN (COSTS OFF) SELECT * FROM ttr1_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1_append.a = ttr2_append.a; +SELECT * FROM ttr1_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2_append TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1_append.a = ttr2_append.a; +EXPLAIN (COSTS OFF) SELECT * FROM ttr1_append TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2_append TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1_append.a = ttr2_append.a; +SELECT * FROM ttr1_append TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2_append TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1_append.a = ttr2_append.a; + +RESET enable_hashjoin; +RESET enable_mergejoin; +RESET enable_nestloop; + +-- check behavior during rescans, as well as correct handling of min/max pct +-- Cloudberry: does not support laterals completely, rescan specific tests above +-- start_ignore +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample bernoulli (pct)) ss; +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample system (pct)) ss; +explain (costs off) +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample system (pct)) ss + group by pct; +-- end_ignore + +-- errors +SELECT id FROM test_tablesample_append TABLESAMPLE FOOBAR (1); + +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (NULL); +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (50) REPEATABLE (NULL); + +SELECT id FROM test_tablesample_append TABLESAMPLE BERNOULLI (-1); +SELECT id FROM test_tablesample_append TABLESAMPLE BERNOULLI (200); +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (-1); +SELECT id FROM test_tablesample_append TABLESAMPLE SYSTEM (200); + +SELECT id FROM test_tablesample_append_v1 TABLESAMPLE BERNOULLI (1); +INSERT INTO test_tablesample_append_v1 VALUES(1); + +WITH query_select AS (SELECT * FROM test_tablesample_append) +SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEATABLE (1); + +SELECT q.* FROM (SELECT * FROM test_tablesample_append) as q TABLESAMPLE BERNOULLI (5); diff --git a/src/test/singlenode_regress/sql/arrays.sql b/src/test/singlenode_regress/sql/arrays.sql new file mode 100644 index 00000000000..3ab7f392be4 --- /dev/null +++ b/src/test/singlenode_regress/sql/arrays.sql @@ -0,0 +1,739 @@ +-- +-- ARRAYS +-- + +CREATE TABLE arrtest ( + a int2[], + b int4[][][], + c name[], + d text[][], + e float8[], + f char(5)[], + g varchar(5)[] +); + +-- +-- only the 'e' array is 0-based, the others are 1-based. +-- + +INSERT INTO arrtest (a[1:5], b[1:1][1:2][1:2], c, d, f, g) + VALUES ('{1,2,3,4,5}', '{{{0,0},{1,2}}}', '{}', '{}', '{}', '{}'); + +UPDATE arrtest SET e[0] = '1.1'; + +UPDATE arrtest SET e[1] = '2.2'; + +INSERT INTO arrtest (f) + VALUES ('{"too long"}'); + +INSERT INTO arrtest (a, b[1:2][1:2], c, d, e, f, g) + VALUES ('{11,12,23}', '{{3,4},{4,5}}', '{"foobar"}', + '{{"elt1", "elt2"}}', '{"3.4", "6.7"}', + '{"abc","abcde"}', '{"abc","abcde"}'); + +INSERT INTO arrtest (a, b[1:2], c, d[1:2]) + VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}'); + +INSERT INTO arrtest (b[2]) VALUES(now()); -- error, type mismatch + +INSERT INTO arrtest (b[1:2]) VALUES(now()); -- error, type mismatch + +SELECT * FROM arrtest; + +SELECT arrtest.a[1], + arrtest.b[1][1][1], + arrtest.c[1], + arrtest.d[1][1], + arrtest.e[0] + FROM arrtest; + +SELECT a[1], b[1][1][1], c[1], d[1][1], e[0] + FROM arrtest; + +SELECT a[1:3], + b[1:1][1:2][1:2], + c[1:2], + d[1:1][1:2] + FROM arrtest; + +SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c + FROM arrtest; + +SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c + FROM arrtest; + +-- returns nothing +SELECT * + FROM arrtest + WHERE a[1] < 5 and + c = '{"foobar"}'::_name; + +UPDATE arrtest + SET a[1:2] = '{16,25}' + WHERE NOT a = '{}'::_int2; + +UPDATE arrtest + SET b[1:1][1:1][1:2] = '{113, 117}', + b[1:1][1:2][2:2] = '{142, 147}' + WHERE array_dims(b) = '[1:1][1:2][1:2]'; + +UPDATE arrtest + SET c[2:2] = '{"new_word"}' + WHERE array_dims(c) is not null; + +SELECT a,b,c FROM arrtest; + +SELECT a[1:3], + b[1:1][1:2][1:2], + c[1:2], + d[1:1][2:2] + FROM arrtest; + +SELECT b[1:1][2][2], + d[1:1][2] + FROM arrtest; + +INSERT INTO arrtest(a) VALUES('{1,null,3}'); +SELECT a FROM arrtest; +UPDATE arrtest SET a[4] = NULL WHERE a[2] IS NULL; +SELECT a FROM arrtest WHERE a[2] IS NULL; +DELETE FROM arrtest WHERE a[2] IS NULL AND b IS NULL; +SELECT a,b,c FROM arrtest; + +-- test mixed slice/scalar subscripting +select '{{1,2,3},{4,5,6},{7,8,9}}'::int[]; +select ('{{1,2,3},{4,5,6},{7,8,9}}'::int[])[1:2][2]; +select '[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[]; +select ('[0:2][0:2]={{1,2,3},{4,5,6},{7,8,9}}'::int[])[1:2][2]; + +-- +-- check subscription corner cases +-- +-- More subscripts than MAXDIM (6) +SELECT ('{}'::int[])[1][2][3][4][5][6][7]; +-- NULL index yields NULL when selecting +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL][1]; +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL:1][1]; +SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][1:NULL][1]; +-- NULL index in assignment is an error +UPDATE arrtest + SET c[NULL] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +UPDATE arrtest + SET c[NULL:1] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +UPDATE arrtest + SET c[1:NULL] = '{"can''t assign"}' + WHERE array_dims(c) is not null; +-- Un-subscriptable type +SELECT (now())[1]; + +-- test slices with empty lower and/or upper index +CREATE TEMP TABLE arrtest_s ( + a int2[], + b int2[][] +); +INSERT INTO arrtest_s VALUES ('{1,2,3,4,5}', '{{1,2,3}, {4,5,6}, {7,8,9}}'); +INSERT INTO arrtest_s VALUES ('[0:4]={1,2,3,4,5}', '[0:2][0:2]={{1,2,3}, {4,5,6}, {7,8,9}}'); + +SELECT * FROM arrtest_s; +SELECT a[:3], b[:2][:2] FROM arrtest_s; +SELECT a[2:], b[2:][2:] FROM arrtest_s; +SELECT a[:], b[:] FROM arrtest_s; + +-- updates +UPDATE arrtest_s SET a[:3] = '{11, 12, 13}', b[:2][:2] = '{{11,12}, {14,15}}' + WHERE array_lower(a,1) = 1; +SELECT * FROM arrtest_s; +UPDATE arrtest_s SET a[3:] = '{23, 24, 25}', b[2:][2:] = '{{25,26}, {28,29}}'; +SELECT * FROM arrtest_s; +UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; +SELECT * FROM arrtest_s; +UPDATE arrtest_s SET a[:] = '{23, 24, 25}'; -- fail, too small +INSERT INTO arrtest_s VALUES(NULL, NULL); +UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; -- fail, no good with null + +-- check with fixed-length-array type, such as point +SELECT f1[0:1] FROM POINT_TBL; +SELECT f1[0:] FROM POINT_TBL; +SELECT f1[:1] FROM POINT_TBL; +SELECT f1[:] FROM POINT_TBL; + +-- subscript assignments to fixed-width result in NULL if previous value is NULL +UPDATE point_tbl SET f1[0] = 10 WHERE f1 IS NULL RETURNING *; +INSERT INTO point_tbl(f1[0]) VALUES(0) RETURNING *; +-- NULL assignments get ignored +UPDATE point_tbl SET f1[0] = NULL WHERE f1::text = '(10,10)'::point::text RETURNING *; +-- but non-NULL subscript assignments work +UPDATE point_tbl SET f1[0] = -10, f1[1] = -10 WHERE f1::text = '(10,10)'::point::text RETURNING *; +-- but not to expand the range +UPDATE point_tbl SET f1[3] = 10 WHERE f1::text = '(-10,-10)'::point::text RETURNING *; + +-- +-- test array extension +-- +CREATE TEMP TABLE arrtest1 (i int[], t text[]); +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +select * from arrtest1; +update arrtest1 set i[2] = 22, t[2] = 'twenty-two'; +select * from arrtest1; +update arrtest1 set i[5] = 5, t[5] = 'five'; +select * from arrtest1; +update arrtest1 set i[8] = 8, t[8] = 'eight'; +select * from arrtest1; +update arrtest1 set i[0] = 0, t[0] = 'zero'; +select * from arrtest1; +update arrtest1 set i[-3] = -3, t[-3] = 'minus-three'; +select * from arrtest1; +update arrtest1 set i[0:2] = array[10,11,12], t[0:2] = array['ten','eleven','twelve']; +select * from arrtest1; +update arrtest1 set i[8:10] = array[18,null,20], t[8:10] = array['p18',null,'p20']; +select * from arrtest1; +update arrtest1 set i[11:12] = array[null,22], t[11:12] = array[null,'p22']; +select * from arrtest1; +update arrtest1 set i[15:16] = array[null,26], t[15:16] = array[null,'p26']; +select * from arrtest1; +update arrtest1 set i[-5:-3] = array[-15,-14,-13], t[-5:-3] = array['m15','m14','m13']; +select * from arrtest1; +update arrtest1 set i[-7:-6] = array[-17,null], t[-7:-6] = array['m17',null]; +select * from arrtest1; +update arrtest1 set i[-12:-10] = array[-22,null,-20], t[-12:-10] = array['m22',null,'m20']; +select * from arrtest1; +delete from arrtest1; +insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); +select * from arrtest1; +update arrtest1 set i[0:5] = array[0,1,2,null,4,5], t[0:5] = array['z','p1','p2',null,'p4','p5']; +select * from arrtest1; + +-- +-- array expressions and operators +-- + +-- table creation and INSERTs +CREATE TEMP TABLE arrtest2 (i integer ARRAY[4], f float8[], n numeric[], t text[], d timestamp[]); +INSERT INTO arrtest2 VALUES( + ARRAY[[[113,142],[1,147]]], + ARRAY[1.1,1.2,1.3]::float8[], + ARRAY[1.1,1.2,1.3], + ARRAY[[['aaa','aab'],['aba','abb'],['aca','acb']],[['baa','bab'],['bba','bbb'],['bca','bcb']]], + ARRAY['19620326','19931223','19970117']::timestamp[] +); + +-- some more test data +CREATE TEMP TABLE arrtest_f (f0 int, f1 text, f2 float8); +insert into arrtest_f values(1,'cat1',1.21); +insert into arrtest_f values(2,'cat1',1.24); +insert into arrtest_f values(3,'cat1',1.18); +insert into arrtest_f values(4,'cat1',1.26); +insert into arrtest_f values(5,'cat1',1.15); +insert into arrtest_f values(6,'cat2',1.15); +insert into arrtest_f values(7,'cat2',1.26); +insert into arrtest_f values(8,'cat2',1.32); +insert into arrtest_f values(9,'cat2',1.30); + +CREATE TEMP TABLE arrtest_i (f0 int, f1 text, f2 int); +insert into arrtest_i values(1,'cat1',21); +insert into arrtest_i values(2,'cat1',24); +insert into arrtest_i values(3,'cat1',18); +insert into arrtest_i values(4,'cat1',26); +insert into arrtest_i values(5,'cat1',15); +insert into arrtest_i values(6,'cat2',15); +insert into arrtest_i values(7,'cat2',26); +insert into arrtest_i values(8,'cat2',32); +insert into arrtest_i values(9,'cat2',30); + +-- expressions +SELECT t.f[1][3][1] AS "131", t.f[2][2][1] AS "221" FROM ( + SELECT ARRAY[[[111,112],[121,122],[131,132]],[[211,212],[221,122],[231,232]]] AS f +) AS t; +SELECT ARRAY[[[[[['hello'],['world']]]]]]; +SELECT ARRAY[ARRAY['hello'],ARRAY['world']]; +SELECT ARRAY(select f2 from arrtest_f order by f2) AS "ARRAY"; + +-- with nulls +SELECT '{1,null,3}'::int[]; +SELECT ARRAY[1,NULL,3]; + +-- functions +SELECT array_append(array[42], 6) AS "{42,6}"; +SELECT array_prepend(6, array[42]) AS "{6,42}"; +SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}"; +SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; +SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}"; + +SELECT array_position(ARRAY[1,2,3,4,5], 4); +SELECT array_position(ARRAY[5,3,4,2,1], 4); +SELECT array_position(ARRAY[[1,2],[3,4]], 3); +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon'); +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'sat'); +SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], NULL); +SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], NULL); +SELECT array_position(ARRAY['sun','mon','tue','wed','thu',NULL,'fri','sat'], 'sat'); + +SELECT array_positions(NULL, 10); +SELECT array_positions(NULL, NULL::int); +SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], 4); +SELECT array_positions(ARRAY[[1,2],[3,4]], 4); +SELECT array_positions(ARRAY[1,2,3,4,5,6,1,2,3,4,5,6], NULL); +SELECT array_positions(ARRAY[1,2,3,NULL,5,6,1,2,3,NULL,5,6], NULL); +SELECT array_length(array_positions(ARRAY(SELECT 'AAAAAAAAAAAAAAAAAAAAAAAAA'::text || i % 10 + FROM generate_series(1,100) g(i)), + 'AAAAAAAAAAAAAAAAAAAAAAAAA5'), 1); + +DO $$ +DECLARE + o int; + a int[] := ARRAY[1,2,3,2,3,1,2]; +BEGIN + o := array_position(a, 2); + WHILE o IS NOT NULL + LOOP + RAISE NOTICE '%', o; + o := array_position(a, 2, o + 1); + END LOOP; +END +$$ LANGUAGE plpgsql; + +SELECT array_position('[2:4]={1,2,3}'::int[], 1); +SELECT array_positions('[2:4]={1,2,3}'::int[], 1); + +SELECT + array_position(ids, (1, 1)), + array_positions(ids, (1, 1)) + FROM +(VALUES + (ARRAY[(0, 0), (1, 1)]), + (ARRAY[(1, 1)]) +) AS f (ids); + +-- operators +SELECT a FROM arrtest WHERE b = ARRAY[[[113,142],[1,147]]]; +SELECT NOT ARRAY[1.1,1.2,1.3] = ARRAY[1.1,1.2,1.3] AS "FALSE"; +SELECT ARRAY[1,2] || 3 AS "{1,2,3}"; +SELECT 0 || ARRAY[1,2] AS "{0,1,2}"; +SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}"; +SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; +SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; +SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; +SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; +SELECT ARRAY[1.1] || ARRAY[2,3,4]; +SELECT array_agg(x) || array_agg(x) FROM (VALUES (ROW(1,2)), (ROW(3,4))) v(x); +SELECT ROW(1,2) || array_agg(x) FROM (VALUES (ROW(3,4)), (ROW(5,6))) v(x); + +SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i <@ '{38,34,32,89}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i = '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i @> '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i && '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i <@ '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; + +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t = '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t @> '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t && '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE t <@ '{}' ORDER BY seqno; + +-- array casts +SELECT ARRAY[1,2,3]::text[]::int[]::float8[] AS "{1,2,3}"; +SELECT pg_typeof(ARRAY[1,2,3]::text[]::int[]::float8[]) AS "double precision[]"; +SELECT ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[] AS "{{a,bc},{def,hijk}}"; +SELECT pg_typeof(ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[]) AS "character varying[]"; +SELECT CAST(ARRAY[[[[[['a','bb','ccc']]]]]] as text[]) as "{{{{{{a,bb,ccc}}}}}}"; +SELECT NULL::text[]::int[] AS "NULL"; + +-- scalar op any/all (array) +select 33 = any ('{1,2,3}'); +select 33 = any ('{1,2,33}'); +select 33 = all ('{1,2,33}'); +select 33 >= all ('{1,2,33}'); +-- boundary cases +select null::int >= all ('{1,2,33}'); +select null::int >= all ('{}'); +select null::int >= any ('{}'); +-- cross-datatype +select 33.4 = any (array[1,2,3]); +select 33.4 > all (array[1,2,3]); +-- errors +select 33 * any ('{1,2,3}'); +select 33 * any (44); +-- nulls +select 33 = any (null::int[]); +select null::int = any ('{1,2,3}'); +select 33 = any ('{1,null,3}'); +select 33 = any ('{1,null,33}'); +select 33 = all (null::int[]); +select null::int = all ('{1,2,3}'); +select 33 = all ('{1,null,3}'); +select 33 = all ('{33,null,33}'); +-- nulls later in the bitmap +SELECT -1 != ALL(ARRAY(SELECT NULLIF(g.i, 900) FROM generate_series(1,1000) g(i))); + +-- test indexes on arrays +create temp table arr_tbl (f1 int[] unique); +insert into arr_tbl values ('{1,2,3}'); +insert into arr_tbl values ('{1,2}'); +-- failure expected: +insert into arr_tbl values ('{1,2,3}'); +insert into arr_tbl values ('{2,3,4}'); +insert into arr_tbl values ('{1,5,3}'); +insert into arr_tbl values ('{1,2,10}'); + +set enable_seqscan to off; +set enable_bitmapscan to off; +select * from arr_tbl where f1 > '{1,2,3}' and f1 <= '{1,5,3}'; +select * from arr_tbl where f1 >= '{1,2,3}' and f1 < '{1,5,3}'; + +-- test ON CONFLICT DO UPDATE with arrays +create temp table arr_pk_tbl (pk int4 primary key, f1 int[]); +insert into arr_pk_tbl values (1, '{1,2,3}'); +insert into arr_pk_tbl values (1, '{3,4,5}') on conflict (pk) + do update set f1[1] = excluded.f1[1], f1[3] = excluded.f1[3] + returning pk, f1; +insert into arr_pk_tbl(pk, f1[1:2]) values (1, '{6,7,8}') on conflict (pk) + do update set f1[1] = excluded.f1[1], + f1[2] = excluded.f1[2], + f1[3] = excluded.f1[3] + returning pk, f1; + +-- note: if above selects don't produce the expected tuple order, +-- then you didn't get an indexscan plan, and something is busted. +reset enable_seqscan; +reset enable_bitmapscan; + +-- test [not] (like|ilike) (any|all) (...) +select 'foo' like any (array['%a', '%o']); -- t +select 'foo' like any (array['%a', '%b']); -- f +select 'foo' like all (array['f%', '%o']); -- t +select 'foo' like all (array['f%', '%b']); -- f +select 'foo' not like any (array['%a', '%b']); -- t +select 'foo' not like all (array['%a', '%o']); -- f +select 'foo' ilike any (array['%A', '%O']); -- t +select 'foo' ilike all (array['F%', '%O']); -- t + +-- +-- General array parser tests +-- + +-- none of the following should be accepted +select '{{1,{2}},{2,3}}'::text[]; +select '{{},{}}'::text[]; +select E'{{1,2},\\{2,3}}'::text[]; +select '{{"1 2" x},{3}}'::text[]; +select '{}}'::text[]; +select '{ }}'::text[]; +select array[]; +-- none of the above should be accepted + +-- all of the following should be accepted +select '{}'::text[]; +select '{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[]; +select '{0 second ,0 second}'::interval[]; +select '{ { "," } , { 3 } }'::text[]; +select ' { { " 0 second " , 0 second } }'::text[]; +select '{ + 0 second, + @ 1 hour @ 42 minutes @ 20 seconds + }'::interval[]; +select array[]::text[]; +select '[0:1]={1.1,2.2}'::float8[]; +-- all of the above should be accepted + +-- tests for array aggregates +CREATE TEMP TABLE arraggtest ( f1 INT[], f2 TEXT[][], f3 FLOAT[]); + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{1,2,3,4}','{{grey,red},{blue,blue}}','{1.6, 0.0}'); +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{1,2,3}','{{grey,red},{grey,blue}}','{1.6}'); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{3,3,2,4,5,6}','{{white,yellow},{pink,orange}}','{2.1,3.3,1.8,1.7,1.6}'); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{2}','{{black,red},{green,orange}}','{1.6,2.2,2.6,0.4}'); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{4,2,6,7,8,1}','{{red},{black},{purple},{blue},{blue}}',NULL); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + +INSERT INTO arraggtest (f1, f2, f3) VALUES +('{}','{{pink,white,blue,red,grey,orange}}','{2.1,1.87,1.4,2.2}'); +SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest; + +-- A few simple tests for arrays of composite types + +create type comptype as (f1 int, f2 text); + +create table comptable (c1 comptype, c2 comptype[]); + +-- XXX would like to not have to specify row() construct types here ... +insert into comptable + values (row(1,'foo'), array[row(2,'bar')::comptype, row(3,'baz')::comptype]); + +-- check that implicitly named array type _comptype isn't a problem +create type _comptype as enum('fooey'); + +select * from comptable; +select c2[2].f2 from comptable; + +drop type _comptype; +drop table comptable; +drop type comptype; + +create or replace function unnest1(anyarray) +returns setof anyelement as $$ +select $1[s] from generate_subscripts($1,1) g(s); +$$ language sql immutable; + +create or replace function unnest2(anyarray) +returns setof anyelement as $$ +select $1[s1][s2] from generate_subscripts($1,1) g1(s1), + generate_subscripts($1,2) g2(s2); +$$ language sql immutable; + +select * from unnest1(array[1,2,3]); +select * from unnest2(array[[1,2,3],[4,5,6]]); + +drop function unnest1(anyarray); +drop function unnest2(anyarray); + +select array_fill(null::integer, array[3,3],array[2,2]); +select array_fill(null::integer, array[3,3]); +select array_fill(null::text, array[3,3],array[2,2]); +select array_fill(null::text, array[3,3]); +select array_fill(7, array[3,3],array[2,2]); +select array_fill(7, array[3,3]); +select array_fill('juhu'::text, array[3,3],array[2,2]); +select array_fill('juhu'::text, array[3,3]); +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, array[0]) as a) ss; +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, '{}') as a) ss; +select a, a = '{}' as is_eq, array_dims(a) + from (select array_fill(42, '{}', '{}') as a) ss; +-- raise exception +select array_fill(1, null, array[2,2]); +select array_fill(1, array[2,2], null); +select array_fill(1, array[2,2], '{}'); +select array_fill(1, array[3,3], array[1,1,1]); +select array_fill(1, array[1,2,null]); +select array_fill(1, array[[1,2],[3,4]]); + +select string_to_array('1|2|3', '|'); +select string_to_array('1|2|3|', '|'); +select string_to_array('1||2|3||', '||'); +select string_to_array('1|2|3', ''); +select string_to_array('', '|'); +select string_to_array('1|2|3', NULL); +select string_to_array(NULL, '|') IS NULL; +select string_to_array('abc', ''); +select string_to_array('abc', '', 'abc'); +select string_to_array('abc', ','); +select string_to_array('abc', ',', 'abc'); +select string_to_array('1,2,3,4,,6', ','); +select string_to_array('1,2,3,4,,6', ',', ''); +select string_to_array('1,2,3,4,*,6', ',', '*'); + +select v, v is null as "is null" from string_to_table('1|2|3', '|') g(v); +select v, v is null as "is null" from string_to_table('1|2|3|', '|') g(v); +select v, v is null as "is null" from string_to_table('1||2|3||', '||') g(v); +select v, v is null as "is null" from string_to_table('1|2|3', '') g(v); +select v, v is null as "is null" from string_to_table('', '|') g(v); +select v, v is null as "is null" from string_to_table('1|2|3', NULL) g(v); +select v, v is null as "is null" from string_to_table(NULL, '|') g(v); +select v, v is null as "is null" from string_to_table('abc', '') g(v); +select v, v is null as "is null" from string_to_table('abc', '', 'abc') g(v); +select v, v is null as "is null" from string_to_table('abc', ',') g(v); +select v, v is null as "is null" from string_to_table('abc', ',', 'abc') g(v); +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',') g(v); +select v, v is null as "is null" from string_to_table('1,2,3,4,,6', ',', '') g(v); +select v, v is null as "is null" from string_to_table('1,2,3,4,*,6', ',', '*') g(v); + +select array_to_string(NULL::int4[], ',') IS NULL; +select array_to_string('{}'::int4[], ','); +select array_to_string(array[1,2,3,4,NULL,6], ','); +select array_to_string(array[1,2,3,4,NULL,6], ',', '*'); +select array_to_string(array[1,2,3,4,NULL,6], NULL); +select array_to_string(array[1,2,3,4,NULL,6], ',', NULL); + +select array_to_string(string_to_array('1|2|3', '|'), '|'); + +select array_length(array[1,2,3], 1); +select array_length(array[[1,2,3], [4,5,6]], 0); +select array_length(array[[1,2,3], [4,5,6]], 1); +select array_length(array[[1,2,3], [4,5,6]], 2); +select array_length(array[[1,2,3], [4,5,6]], 3); + +select cardinality(NULL::int[]); +select cardinality('{}'::int[]); +select cardinality(array[1,2,3]); +select cardinality('[2:4]={5,6,7}'::int[]); +select cardinality('{{1,2}}'::int[]); +select cardinality('{{1,2},{3,4},{5,6}}'::int[]); +select cardinality('{{{1,9},{5,6}},{{2,3},{3,4}}}'::int[]); + +-- array_agg(anynonarray) +select array_agg(unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss; +select array_agg(ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss; +select array_agg(nullif(ten, 4)) from (select ten from tenk1 where unique1 < 15 order by unique1) ss; +select array_agg(unique1) from tenk1 where unique1 < -15; + +-- array_agg(anyarray) +select array_agg(ar) + from (values ('{1,2}'::int[]), ('{3,4}'::int[])) v(ar); +select array_agg(distinct ar order by ar desc) + from (select array[i / 2] from generate_series(1,10) a(i)) b(ar); +select array_agg(ar) + from (select array_agg(array[i, i+1, i-1]) + from generate_series(1,2) a(i)) b(ar); +select array_agg(array[i+1.2, i+1.3, i+1.4]) from generate_series(1,3) g(i); +select array_agg(array['Hello', i::text]) from generate_series(9,11) g(i); +select array_agg(array[i, nullif(i, 3), i+1]) from generate_series(1,4) g(i); +-- errors +select array_agg('{}'::int[]) from generate_series(1,2); +select array_agg(null::int[]) from generate_series(1,2); +select array_agg(ar) + from (values ('{1,2}'::int[]), ('{3}'::int[])) v(ar); + +select unnest(array[1,2,3]); +select * from unnest(array[1,2,3]); +select unnest(array[1,2,3,4.5]::float8[]); +select unnest(array[1,2,3,4.5]::numeric[]); +select unnest(array[1,2,3,null,4,null,null,5,6]); +select unnest(array[1,2,3,null,4,null,null,5,6]::text[]); +select abs(unnest(array[1,2,null,-3])); +select array_remove(array[1,2,2,3], 2); +select array_remove(array[1,2,2,3], 5); +select array_remove(array[1,NULL,NULL,3], NULL); +select array_remove(array['A','CC','D','C','RR'], 'RR'); +select array_remove(array[1.0, 2.1, 3.3], 1); +select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed +select array_remove(array['X','X','X'], 'X') = '{}'; +select array_replace(array[1,2,5,4],5,3); +select array_replace(array[1,2,5,4],5,NULL); +select array_replace(array[1,2,NULL,4,NULL],NULL,5); +select array_replace(array['A','B','DD','B'],'B','CC'); +select array_replace(array[1,NULL,3],NULL,NULL); +select array_replace(array['AB',NULL,'CDE'],NULL,'12'); + +-- array(select array-value ...) +select array(select array[i,i/2] from generate_series(1,5) i); +select array(select array['Hello', i::text] from generate_series(9,11) i); + +-- Insert/update on a column that is array of composite + +create temp table t1 (f1 int8_tbl[]); +insert into t1 (f1[5].q1) values(42); +select * from t1; +update t1 set f1[5].q2 = 43; +select * from t1; + +-- Check that arrays of composites are safely detoasted when needed + +create temp table src (f1 text); +insert into src + select string_agg(random()::text,'') from generate_series(1,10000); +create type textandtext as (c1 text, c2 text); +create temp table dest (f1 textandtext[]); +insert into dest select array[row(f1,f1)::textandtext] from src; +select length(md5((f1[1]).c2)) from dest; +delete from src; +select length(md5((f1[1]).c2)) from dest; +truncate table src; +drop table src; +select length(md5((f1[1]).c2)) from dest; +drop table dest; +drop type textandtext; + +-- Tests for polymorphic-array form of width_bucket() + +-- this exercises the varwidth and float8 code paths +SELECT + op, + width_bucket(op::numeric, ARRAY[1, 3, 5, 10.0]::numeric[]) AS wb_n1, + width_bucket(op::numeric, ARRAY[0, 5.5, 9.99]::numeric[]) AS wb_n2, + width_bucket(op::numeric, ARRAY[-6, -5, 2.0]::numeric[]) AS wb_n3, + width_bucket(op::float8, ARRAY[1, 3, 5, 10.0]::float8[]) AS wb_f1, + width_bucket(op::float8, ARRAY[0, 5.5, 9.99]::float8[]) AS wb_f2, + width_bucket(op::float8, ARRAY[-6, -5, 2.0]::float8[]) AS wb_f3 +FROM (VALUES + (-5.2), + (-0.0000000001), + (0.000000000001), + (1), + (1.99999999999999), + (2), + (2.00000000000001), + (3), + (4), + (4.5), + (5), + (5.5), + (6), + (7), + (8), + (9), + (9.99999999999999), + (10), + (10.0000000000001) +) v(op); + +-- ensure float8 path handles NaN properly +SELECT + op, + width_bucket(op, ARRAY[1, 3, 9, 'NaN', 'NaN']::float8[]) AS wb +FROM (VALUES + (-5.2::float8), + (4::float8), + (77::float8), + ('NaN'::float8) +) v(op); + +-- these exercise the generic fixed-width code path +SELECT + op, + width_bucket(op, ARRAY[1, 3, 5, 10]) AS wb_1 +FROM generate_series(0,11) as op; + +SELECT width_bucket(now(), + array['yesterday', 'today', 'tomorrow']::timestamptz[]); + +-- corner cases +SELECT width_bucket(5, ARRAY[3]); +SELECT width_bucket(5, '{}'); + +-- error cases +SELECT width_bucket('5'::text, ARRAY[3, 4]::integer[]); +SELECT width_bucket(5, ARRAY[3, 4, NULL]); +SELECT width_bucket(5, ARRAY[ARRAY[1, 2], ARRAY[3, 4]]); + +-- trim_array + +SELECT arr, trim_array(arr, 2) +FROM +(VALUES ('{1,2,3,4,5,6}'::bigint[]), + ('{1,2}'), + ('[10:16]={1,2,3,4,5,6,7}'), + ('[-15:-10]={1,2,3,4,5,6}'), + ('{{1,10},{2,20},{3,30},{4,40}}')) v(arr); + +SELECT trim_array(ARRAY[1, 2, 3], -1); -- fail +SELECT trim_array(ARRAY[1, 2, 3], 10); -- fail diff --git a/src/test/singlenode_regress/sql/async.sql b/src/test/singlenode_regress/sql/async.sql new file mode 100644 index 00000000000..40f6e015387 --- /dev/null +++ b/src/test/singlenode_regress/sql/async.sql @@ -0,0 +1,23 @@ +-- +-- ASYNC +-- + +--Should work. Send a valid message via a valid channel name +SELECT pg_notify('notify_async1','sample message1'); +SELECT pg_notify('notify_async1',''); +SELECT pg_notify('notify_async1',NULL); + +-- Should fail. Send a valid message via an invalid channel name +SELECT pg_notify('','sample message1'); +SELECT pg_notify(NULL,'sample message1'); +SELECT pg_notify('notify_async_channel_name_too_long______________________________','sample_message1'); + +--Should work. Valid NOTIFY/LISTEN/UNLISTEN commands +NOTIFY notify_async2; +LISTEN notify_async2; +UNLISTEN notify_async2; +UNLISTEN *; + +-- Should return zero while there are no pending notifications. +-- src/test/isolation/specs/async-notify.spec tests for actual usage. +SELECT pg_notification_queue_usage(); diff --git a/src/test/singlenode_regress/sql/bfv_aggregate.sql b/src/test/singlenode_regress/sql/bfv_aggregate.sql new file mode 100644 index 00000000000..dc918a5d0a3 --- /dev/null +++ b/src/test/singlenode_regress/sql/bfv_aggregate.sql @@ -0,0 +1,1474 @@ +create schema bfv_aggregate; +set search_path=bfv_aggregate; + +-- +-- Window function with outer references in PARTITION BY/ORDER BY clause +-- + +-- SETUP +create table x_outer (a int, b int, c int); +create table y_inner (d int, e int); +insert into x_outer select i%3, i, i from generate_series(1,10) i; +insert into y_inner select i%3, i from generate_series(1,10) i; +analyze x_outer; +analyze y_inner; + +-- TEST +select * from x_outer where a in (select row_number() over(partition by a) from y_inner) order by 1, 2; + +select * from x_outer where a in (select rank() over(order by a) from y_inner) order by 1, 2; + +select * from x_outer where a not in (select rank() over(order by a) from y_inner) order by 1, 2; + +select * from x_outer where exists (select rank() over(order by a) from y_inner where d = a) order by 1, 2; + +select * from x_outer where not exists (select rank() over(order by a) from y_inner where d = a) order by 1, 2; + +select * from x_outer where a in (select last_value(d) over(partition by b order by e rows between e preceding and e+1 following) from y_inner) order by 1, 2; + +-- +-- Testing aggregation in a query +-- + +-- SETUP +create table d (col1 timestamp, col2 int); +insert into d select to_date('2014-01-01', 'YYYY-DD-MM'), generate_series(1,100); + +-- TEST +select 1, to_char(col1, 'YYYY'), median(col2) from d group by 1, 2; + +-- +-- Testing if aggregate derived window function produces incorrect results +-- + +-- SETUP +create table toy(id,val) as select i,i from generate_series(1,5) i; +create aggregate mysum1(int4) (sfunc = int4_sum, combinefunc=int8pl, stype=bigint); +create aggregate mysum2(int4) (sfunc = int4_sum, stype=bigint); + +-- TEST +select + id, val, + sum(val) over (w), + mysum1(val) over (w), + mysum2(val) over (w) +from toy +window w as (order by id rows 2 preceding); + +-- +-- Error executing for aggregate with anyarray as return type +-- + +-- SETUP +CREATE OR REPLACE FUNCTION tfp(anyarray,anyelement) RETURNS anyarray AS +'select $1 || $2' LANGUAGE SQL; + +CREATE OR REPLACE FUNCTION ffp(anyarray) RETURNS anyarray AS +'select $1' LANGUAGE SQL; + +CREATE AGGREGATE myaggp20a(BASETYPE = anyelement, SFUNC = tfp, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); + +-- Adding a sql function to sory the array +CREATE OR REPLACE FUNCTION array_sort (ANYARRAY) +RETURNS ANYARRAY LANGUAGE SQL +AS $$ +SELECT ARRAY(SELECT unnest($1) ORDER BY 1) +$$; + +create temp table t(f1 int, f2 int[], f3 text); + +-- TEST +insert into t values(1,array[1],'a'); +insert into t values(1,array[11],'b'); +insert into t values(1,array[111],'c'); +insert into t values(2,array[2],'a'); +insert into t values(2,array[22],'b'); +insert into t values(2,array[222],'c'); +insert into t values(3,array[3],'a'); +insert into t values(3,array[3],'b'); + +select f3, array_sort(myaggp20a(f1)) from t group by f3 order by f3; + +-- start_ignore +create language plpython3u; +-- end_ignore +create or replace function count_operator(query text, operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; + +-- +-- Testing adding a traceflag to favor multi-stage aggregation +-- + +-- SETUP +create table multi_stage_test(a int, b int); +insert into multi_stage_test select i, i%4 from generate_series(1,10) i; +analyze multi_stage_test; + +-- TEST +set optimizer_segments=2; +set optimizer_force_multistage_agg = on; +select count_operator('select count(*) from multi_stage_test group by b;','GroupAggregate'); + +set optimizer_force_multistage_agg = off; +select count_operator('select count(*) from multi_stage_test group by b;','GroupAggregate'); + +--CLEANUP +reset optimizer_segments; +reset optimizer_force_multistage_agg; + +-- Testing not picking HashAgg for aggregates without combine functions + +-- In previous version, a HashAggregate is not chosen when an aggregate misses +-- combine functions in GPDB Hybrid Hash Agg. HashAggregate can spill to disk, +-- and it requires the combine function for that(combine function is used to +-- deserialize the aggregate states loaded from the spill file). But that got +-- reverted in current version. Currently, this does choose a Hash Agg, because +-- we spill the raw tuple rather than transvalue to disk now. + +-- SETUP +set optimizer_print_missing_stats = off; +CREATE TABLE attribute_table (product_id integer, attribute_id integer,attribute text, attribute2 text,attribute_ref_lists text,short_name text,attribute6 text,attribute5 text,measure double precision,unit character varying(60)); +-- create the transition function +CREATE OR REPLACE FUNCTION do_concat(text,text) +RETURNS text +--concatenates 2 strings +AS 'SELECT CASE WHEN $1 IS NULL THEN $2 +WHEN $2 IS NULL THEN $1 +ELSE $1 || $2 END;' + LANGUAGE SQL + IMMUTABLE + RETURNS NULL ON NULL INPUT; +-- UDA definition. No COMBINEFUNC exists +CREATE AGGREGATE concat(text) ( + --text/string concatenation + SFUNC = do_concat, --Function to call for each string that builds the aggregate + STYPE = text,--FINALFUNC=final_func, --Function to call after everything has been aggregated + INITCOND = '' --Initialize as an empty string when starting +); + +-- TEST +-- cook some stats +set allow_system_table_mods=true; +UPDATE pg_class set reltuples=524592::real, relpages=2708::integer where oid = 'attribute_table'::regclass; +select count_operator('select product_id,concat(E''#attribute_''||attribute_id::varchar||E'':''||attribute) as attr FROM attribute_table GROUP BY product_id;','HashAggregate'); + +-- CLEANUP + +-- +-- Testing fallback to planner when the agg used in window does not have +-- a combine function. +-- + +-- SETUP +create table foo(a int, b text); + +-- TEST +insert into foo values (1,'aaa'), (2,'bbb'), (3,'ccc'); +-- should fall back +select string_agg(b, '') over (partition by a) from foo order by 1; +select string_agg(b, '') over (partition by a,b) from foo order by 1; +-- should not fall back +select max(b) over (partition by a) from foo order by 1; +select count_operator('select max(b) over (partition by a) from foo order by 1;', 'Pivotal Optimizer (GPORCA)'); +-- fall back +select string_agg(b, '') over (partition by a+1) from foo order by 1; +select string_agg(b || 'txt', '') over (partition by a) from foo order by 1; +select string_agg(b || 'txt', '') over (partition by a+1) from foo order by 1; +-- fall back +select string_agg(b, '') over (partition by a order by a) from foo order by 1; +select string_agg(b || 'txt', '') over (partition by a,b order by a,b) from foo order by 1; +select '1' || string_agg(b, '') over (partition by a+1 order by a+1) from foo; + + +-- Test for a bug in memtuple compute_null_save() function, where the result value +-- was a 16-bit integer, which overflowed with a tuple with enough NULL attributes. +-- That bug wasn't related to aggregates per se, but this is one way to construct +-- such a memtuple, and seems useful to test a query that has a huge number of +-- aggregates anyway. +create temporary table mtup1( +c0 text, +c1 text, +c3 int, +c4 int +) +with (appendonly = true, compresstype=zlib) +; + +insert into mtup1 values + ('foo', '2015-09-1.1', 1), + ('foo', '2015-09-1.1', 2), + ('foo', '2015-09-1.1', 3), + ('foo', '2015-09-1.1', 4), + ('foo', '2015-09-1.1', 5), + ('foo', '2015-09-1.1', 6), + ('foo', '2015-09-1.1', 7), + ('foo', '2015-09-1.1', 8), + ('foo', '2015-09-1.1', 9); + +-- The number of SUMs is a chosen so that it it's enough to trigger the bug with NULL +-- attributes, but not much more than that. There's some O(n^2) code in ExecInitAgg +-- to detect duplicate AggRefs, so this starts to get really slow as you add more +-- aggregates. + +-- we use MinimalTuples in Motions now, and the support for passing around MemTuples +-- in TupleTableSlots was removed, so it no longer can exercise the original bug. +-- In GPDB6, it generates a multiphase agg plan in default, but it will get an error +-- from exceeding the limit in GPDB7 with that plan(a MinimalTuple has a limit of 1600 +-- columns). So set the parameter to off to prevent error happens. +set gp_enable_multiphase_agg=off; + + +select c0, c1, array_length(ARRAY[ + SUM(c4 % 2), SUM(c4 % 3), SUM(c4 % 4), + SUM(c4 % 5), SUM(c4 % 6), SUM(c4 % 7), SUM(c4 % 8), SUM(c4 % 9), + SUM(c4 % 10), SUM(c4 % 11), SUM(c4 % 12), SUM(c4 % 13), SUM(c4 % 14), + SUM(c4 % 15), SUM(c4 % 16), SUM(c4 % 17), SUM(c4 % 18), SUM(c4 % 19), + SUM(c4 % 20), SUM(c4 % 21), SUM(c4 % 22), SUM(c4 % 23), SUM(c4 % 24), + SUM(c4 % 25), SUM(c4 % 26), SUM(c4 % 27), SUM(c4 % 28), SUM(c4 % 29), + SUM(c4 % 30), SUM(c4 % 31), SUM(c4 % 32), SUM(c4 % 33), SUM(c4 % 34), + SUM(c4 % 35), SUM(c4 % 36), SUM(c4 % 37), SUM(c4 % 38), SUM(c4 % 39), + SUM(c4 % 40), SUM(c4 % 41), SUM(c4 % 42), SUM(c4 % 43), SUM(c4 % 44), + SUM(c4 % 45), SUM(c4 % 46), SUM(c4 % 47), SUM(c4 % 48), SUM(c4 % 49), + SUM(c4 % 50), SUM(c4 % 51), SUM(c4 % 52), SUM(c4 % 53), SUM(c4 % 54), + SUM(c4 % 55), SUM(c4 % 56), SUM(c4 % 57), SUM(c4 % 58), SUM(c4 % 59), + SUM(c4 % 60), SUM(c4 % 61), SUM(c4 % 62), SUM(c4 % 63), SUM(c4 % 64), + SUM(c4 % 65), SUM(c4 % 66), SUM(c4 % 67), SUM(c4 % 68), SUM(c4 % 69), + SUM(c4 % 70), SUM(c4 % 71), SUM(c4 % 72), SUM(c4 % 73), SUM(c4 % 74), + SUM(c4 % 75), SUM(c4 % 76), SUM(c4 % 77), SUM(c4 % 78), SUM(c4 % 79), + SUM(c4 % 80), SUM(c4 % 81), SUM(c4 % 82), SUM(c4 % 83), SUM(c4 % 84), + SUM(c4 % 85), SUM(c4 % 86), SUM(c4 % 87), SUM(c4 % 88), SUM(c4 % 89), + SUM(c4 % 90), SUM(c4 % 91), SUM(c4 % 92), SUM(c4 % 93), SUM(c4 % 94), + SUM(c4 % 95), SUM(c4 % 96), SUM(c4 % 97), SUM(c4 % 98), SUM(c4 % 99), + SUM(c4 % 100), SUM(c4 % 101), SUM(c4 % 102), SUM(c4 % 103), SUM(c4 % 104), + SUM(c4 % 105), SUM(c4 % 106), SUM(c4 % 107), SUM(c4 % 108), SUM(c4 % 109), + SUM(c4 % 110), SUM(c4 % 111), SUM(c4 % 112), SUM(c4 % 113), SUM(c4 % 114), + SUM(c4 % 115), SUM(c4 % 116), SUM(c4 % 117), SUM(c4 % 118), SUM(c4 % 119), + SUM(c4 % 120), SUM(c4 % 121), SUM(c4 % 122), SUM(c4 % 123), SUM(c4 % 124), + SUM(c4 % 125), SUM(c4 % 126), SUM(c4 % 127), SUM(c4 % 128), SUM(c4 % 129), + SUM(c4 % 130), SUM(c4 % 131), SUM(c4 % 132), SUM(c4 % 133), SUM(c4 % 134), + SUM(c4 % 135), SUM(c4 % 136), SUM(c4 % 137), SUM(c4 % 138), SUM(c4 % 139), + SUM(c4 % 140), SUM(c4 % 141), SUM(c4 % 142), SUM(c4 % 143), SUM(c4 % 144), + SUM(c4 % 145), SUM(c4 % 146), SUM(c4 % 147), SUM(c4 % 148), SUM(c4 % 149), + SUM(c4 % 150), SUM(c4 % 151), SUM(c4 % 152), SUM(c4 % 153), SUM(c4 % 154), + SUM(c4 % 155), SUM(c4 % 156), SUM(c4 % 157), SUM(c4 % 158), SUM(c4 % 159), + SUM(c4 % 160), SUM(c4 % 161), SUM(c4 % 162), SUM(c4 % 163), SUM(c4 % 164), + SUM(c4 % 165), SUM(c4 % 166), SUM(c4 % 167), SUM(c4 % 168), SUM(c4 % 169), + SUM(c4 % 170), SUM(c4 % 171), SUM(c4 % 172), SUM(c4 % 173), SUM(c4 % 174), + SUM(c4 % 175), SUM(c4 % 176), SUM(c4 % 177), SUM(c4 % 178), SUM(c4 % 179), + SUM(c4 % 180), SUM(c4 % 181), SUM(c4 % 182), SUM(c4 % 183), SUM(c4 % 184), + SUM(c4 % 185), SUM(c4 % 186), SUM(c4 % 187), SUM(c4 % 188), SUM(c4 % 189), + SUM(c4 % 190), SUM(c4 % 191), SUM(c4 % 192), SUM(c4 % 193), SUM(c4 % 194), + SUM(c4 % 195), SUM(c4 % 196), SUM(c4 % 197), SUM(c4 % 198), SUM(c4 % 199), + SUM(c4 % 200), SUM(c4 % 201), SUM(c4 % 202), SUM(c4 % 203), SUM(c4 % 204), + SUM(c4 % 205), SUM(c4 % 206), SUM(c4 % 207), SUM(c4 % 208), SUM(c4 % 209), + SUM(c4 % 210), SUM(c4 % 211), SUM(c4 % 212), SUM(c4 % 213), SUM(c4 % 214), + SUM(c4 % 215), SUM(c4 % 216), SUM(c4 % 217), SUM(c4 % 218), SUM(c4 % 219), + SUM(c4 % 220), SUM(c4 % 221), SUM(c4 % 222), SUM(c4 % 223), SUM(c4 % 224), + SUM(c4 % 225), SUM(c4 % 226), SUM(c4 % 227), SUM(c4 % 228), SUM(c4 % 229), + SUM(c4 % 230), SUM(c4 % 231), SUM(c4 % 232), SUM(c4 % 233), SUM(c4 % 234), + SUM(c4 % 235), SUM(c4 % 236), SUM(c4 % 237), SUM(c4 % 238), SUM(c4 % 239), + SUM(c4 % 240), SUM(c4 % 241), SUM(c4 % 242), SUM(c4 % 243), SUM(c4 % 244), + SUM(c4 % 245), SUM(c4 % 246), SUM(c4 % 247), SUM(c4 % 248), SUM(c4 % 249), + SUM(c4 % 250), SUM(c4 % 251), SUM(c4 % 252), SUM(c4 % 253), SUM(c4 % 254), + SUM(c4 % 255), SUM(c4 % 256), SUM(c4 % 257), SUM(c4 % 258), SUM(c4 % 259), + SUM(c4 % 260), SUM(c4 % 261), SUM(c4 % 262), SUM(c4 % 263), SUM(c4 % 264), + SUM(c4 % 265), SUM(c4 % 266), SUM(c4 % 267), SUM(c4 % 268), SUM(c4 % 269), + SUM(c4 % 270), SUM(c4 % 271), SUM(c4 % 272), SUM(c4 % 273), SUM(c4 % 274), + SUM(c4 % 275), SUM(c4 % 276), SUM(c4 % 277), SUM(c4 % 278), SUM(c4 % 279), + SUM(c4 % 280), SUM(c4 % 281), SUM(c4 % 282), SUM(c4 % 283), SUM(c4 % 284), + SUM(c4 % 285), SUM(c4 % 286), SUM(c4 % 287), SUM(c4 % 288), SUM(c4 % 289), + SUM(c4 % 290), SUM(c4 % 291), SUM(c4 % 292), SUM(c4 % 293), SUM(c4 % 294), + SUM(c4 % 295), SUM(c4 % 296), SUM(c4 % 297), SUM(c4 % 298), SUM(c4 % 299), + SUM(c4 % 300), SUM(c4 % 301), SUM(c4 % 302), SUM(c4 % 303), SUM(c4 % 304), + SUM(c4 % 305), SUM(c4 % 306), SUM(c4 % 307), SUM(c4 % 308), SUM(c4 % 309), + SUM(c4 % 310), SUM(c4 % 311), SUM(c4 % 312), SUM(c4 % 313), SUM(c4 % 314), + SUM(c4 % 315), SUM(c4 % 316), SUM(c4 % 317), SUM(c4 % 318), SUM(c4 % 319), + SUM(c4 % 320), SUM(c4 % 321), SUM(c4 % 322), SUM(c4 % 323), SUM(c4 % 324), + SUM(c4 % 325), SUM(c4 % 326), SUM(c4 % 327), SUM(c4 % 328), SUM(c4 % 329), + SUM(c4 % 330), SUM(c4 % 331), SUM(c4 % 332), SUM(c4 % 333), SUM(c4 % 334), + SUM(c4 % 335), SUM(c4 % 336), SUM(c4 % 337), SUM(c4 % 338), SUM(c4 % 339), + SUM(c4 % 340), SUM(c4 % 341), SUM(c4 % 342), SUM(c4 % 343), SUM(c4 % 344), + SUM(c4 % 345), SUM(c4 % 346), SUM(c4 % 347), SUM(c4 % 348), SUM(c4 % 349), + SUM(c4 % 350), SUM(c4 % 351), SUM(c4 % 352), SUM(c4 % 353), SUM(c4 % 354), + SUM(c4 % 355), SUM(c4 % 356), SUM(c4 % 357), SUM(c4 % 358), SUM(c4 % 359), + SUM(c4 % 360), SUM(c4 % 361), SUM(c4 % 362), SUM(c4 % 363), SUM(c4 % 364), + SUM(c4 % 365), SUM(c4 % 366), SUM(c4 % 367), SUM(c4 % 368), SUM(c4 % 369), + SUM(c4 % 370), SUM(c4 % 371), SUM(c4 % 372), SUM(c4 % 373), SUM(c4 % 374), + SUM(c4 % 375), SUM(c4 % 376), SUM(c4 % 377), SUM(c4 % 378), SUM(c4 % 379), + SUM(c4 % 380), SUM(c4 % 381), SUM(c4 % 382), SUM(c4 % 383), SUM(c4 % 384), + SUM(c4 % 385), SUM(c4 % 386), SUM(c4 % 387), SUM(c4 % 388), SUM(c4 % 389), + SUM(c4 % 390), SUM(c4 % 391), SUM(c4 % 392), SUM(c4 % 393), SUM(c4 % 394), + SUM(c4 % 395), SUM(c4 % 396), SUM(c4 % 397), SUM(c4 % 398), SUM(c4 % 399), + SUM(c4 % 400), SUM(c4 % 401), SUM(c4 % 402), SUM(c4 % 403), SUM(c4 % 404), + SUM(c4 % 405), SUM(c4 % 406), SUM(c4 % 407), SUM(c4 % 408), SUM(c4 % 409), + SUM(c4 % 410), SUM(c4 % 411), SUM(c4 % 412), SUM(c4 % 413), SUM(c4 % 414), + SUM(c4 % 415), SUM(c4 % 416), SUM(c4 % 417), SUM(c4 % 418), SUM(c4 % 419), + SUM(c4 % 420), SUM(c4 % 421), SUM(c4 % 422), SUM(c4 % 423), SUM(c4 % 424), + SUM(c4 % 425), SUM(c4 % 426), SUM(c4 % 427), SUM(c4 % 428), SUM(c4 % 429), + SUM(c4 % 430), SUM(c4 % 431), SUM(c4 % 432), SUM(c4 % 433), SUM(c4 % 434), + SUM(c4 % 435), SUM(c4 % 436), SUM(c4 % 437), SUM(c4 % 438), SUM(c4 % 439), + SUM(c4 % 440), SUM(c4 % 441), SUM(c4 % 442), SUM(c4 % 443), SUM(c4 % 444), + SUM(c4 % 445), SUM(c4 % 446), SUM(c4 % 447), SUM(c4 % 448), SUM(c4 % 449), + SUM(c4 % 450), SUM(c4 % 451), SUM(c4 % 452), SUM(c4 % 453), SUM(c4 % 454), + SUM(c4 % 455), SUM(c4 % 456), SUM(c4 % 457), SUM(c4 % 458), SUM(c4 % 459), + SUM(c4 % 460), SUM(c4 % 461), SUM(c4 % 462), SUM(c4 % 463), SUM(c4 % 464), + SUM(c4 % 465), SUM(c4 % 466), SUM(c4 % 467), SUM(c4 % 468), SUM(c4 % 469), + SUM(c4 % 470), SUM(c4 % 471), SUM(c4 % 472), SUM(c4 % 473), SUM(c4 % 474), + SUM(c4 % 475), SUM(c4 % 476), SUM(c4 % 477), SUM(c4 % 478), SUM(c4 % 479), + SUM(c4 % 480), SUM(c4 % 481), SUM(c4 % 482), SUM(c4 % 483), SUM(c4 % 484), + SUM(c4 % 485), SUM(c4 % 486), SUM(c4 % 487), SUM(c4 % 488), SUM(c4 % 489), + SUM(c4 % 490), SUM(c4 % 491), SUM(c4 % 492), SUM(c4 % 493), SUM(c4 % 494), + SUM(c4 % 495), SUM(c4 % 496), SUM(c4 % 497), SUM(c4 % 498), SUM(c4 % 499), + SUM(c4 % 500), SUM(c4 % 501), SUM(c4 % 502), SUM(c4 % 503), SUM(c4 % 504), + SUM(c4 % 505), SUM(c4 % 506), SUM(c4 % 507), SUM(c4 % 508), SUM(c4 % 509), + SUM(c4 % 510), SUM(c4 % 511), SUM(c4 % 512), SUM(c4 % 513), SUM(c4 % 514), + SUM(c4 % 515), SUM(c4 % 516), SUM(c4 % 517), SUM(c4 % 518), SUM(c4 % 519), + SUM(c4 % 520), SUM(c4 % 521), SUM(c4 % 522), SUM(c4 % 523), SUM(c4 % 524), + SUM(c4 % 525), SUM(c4 % 526), SUM(c4 % 527), SUM(c4 % 528), SUM(c4 % 529), + SUM(c4 % 530), SUM(c4 % 531), SUM(c4 % 532), SUM(c4 % 533), SUM(c4 % 534), + SUM(c4 % 535), SUM(c4 % 536), SUM(c4 % 537), SUM(c4 % 538), SUM(c4 % 539), + SUM(c4 % 540), SUM(c4 % 541), SUM(c4 % 542), SUM(c4 % 543), SUM(c4 % 544), + SUM(c4 % 545), SUM(c4 % 546), SUM(c4 % 547), SUM(c4 % 548), SUM(c4 % 549), + SUM(c4 % 550), SUM(c4 % 551), SUM(c4 % 552), SUM(c4 % 553), SUM(c4 % 554), + SUM(c4 % 555), SUM(c4 % 556), SUM(c4 % 557), SUM(c4 % 558), SUM(c4 % 559), + SUM(c4 % 560), SUM(c4 % 561), SUM(c4 % 562), SUM(c4 % 563), SUM(c4 % 564), + SUM(c4 % 565), SUM(c4 % 566), SUM(c4 % 567), SUM(c4 % 568), SUM(c4 % 569), + SUM(c4 % 570), SUM(c4 % 571), SUM(c4 % 572), SUM(c4 % 573), SUM(c4 % 574), + SUM(c4 % 575), SUM(c4 % 576), SUM(c4 % 577), SUM(c4 % 578), SUM(c4 % 579), + SUM(c4 % 580), SUM(c4 % 581), SUM(c4 % 582), SUM(c4 % 583), SUM(c4 % 584), + SUM(c4 % 585), SUM(c4 % 586), SUM(c4 % 587), SUM(c4 % 588), SUM(c4 % 589), + SUM(c4 % 590), SUM(c4 % 591), SUM(c4 % 592), SUM(c4 % 593), SUM(c4 % 594), + SUM(c4 % 595), SUM(c4 % 596), SUM(c4 % 597), SUM(c4 % 598), SUM(c4 % 599), + SUM(c4 % 600), SUM(c4 % 601), SUM(c4 % 602), SUM(c4 % 603), SUM(c4 % 604), + SUM(c4 % 605), SUM(c4 % 606), SUM(c4 % 607), SUM(c4 % 608), SUM(c4 % 609), + SUM(c4 % 610), SUM(c4 % 611), SUM(c4 % 612), SUM(c4 % 613), SUM(c4 % 614), + SUM(c4 % 615), SUM(c4 % 616), SUM(c4 % 617), SUM(c4 % 618), SUM(c4 % 619), + SUM(c4 % 620), SUM(c4 % 621), SUM(c4 % 622), SUM(c4 % 623), SUM(c4 % 624), + SUM(c4 % 625), SUM(c4 % 626), SUM(c4 % 627), SUM(c4 % 628), SUM(c4 % 629), + SUM(c4 % 630), SUM(c4 % 631), SUM(c4 % 632), SUM(c4 % 633), SUM(c4 % 634), + SUM(c4 % 635), SUM(c4 % 636), SUM(c4 % 637), SUM(c4 % 638), SUM(c4 % 639), + SUM(c4 % 640), SUM(c4 % 641), SUM(c4 % 642), SUM(c4 % 643), SUM(c4 % 644), + SUM(c4 % 645), SUM(c4 % 646), SUM(c4 % 647), SUM(c4 % 648), SUM(c4 % 649), + SUM(c4 % 650), SUM(c4 % 651), SUM(c4 % 652), SUM(c4 % 653), SUM(c4 % 654), + SUM(c4 % 655), SUM(c4 % 656), SUM(c4 % 657), SUM(c4 % 658), SUM(c4 % 659), + SUM(c4 % 660), SUM(c4 % 661), SUM(c4 % 662), SUM(c4 % 663), SUM(c4 % 664), + SUM(c4 % 665), SUM(c4 % 666), SUM(c4 % 667), SUM(c4 % 668), SUM(c4 % 669), + SUM(c4 % 670), SUM(c4 % 671), SUM(c4 % 672), SUM(c4 % 673), SUM(c4 % 674), + SUM(c4 % 675), SUM(c4 % 676), SUM(c4 % 677), SUM(c4 % 678), SUM(c4 % 679), + SUM(c4 % 680), SUM(c4 % 681), SUM(c4 % 682), SUM(c4 % 683), SUM(c4 % 684), + SUM(c4 % 685), SUM(c4 % 686), SUM(c4 % 687), SUM(c4 % 688), SUM(c4 % 689), + SUM(c4 % 690), SUM(c4 % 691), SUM(c4 % 692), SUM(c4 % 693), SUM(c4 % 694), + SUM(c4 % 695), SUM(c4 % 696), SUM(c4 % 697), SUM(c4 % 698), SUM(c4 % 699), + SUM(c4 % 700), SUM(c4 % 701), SUM(c4 % 702), SUM(c4 % 703), SUM(c4 % 704), + SUM(c4 % 705), SUM(c4 % 706), SUM(c4 % 707), SUM(c4 % 708), SUM(c4 % 709), + SUM(c4 % 710), SUM(c4 % 711), SUM(c4 % 712), SUM(c4 % 713), SUM(c4 % 714), + SUM(c4 % 715), SUM(c4 % 716), SUM(c4 % 717), SUM(c4 % 718), SUM(c4 % 719), + SUM(c4 % 720), SUM(c4 % 721), SUM(c4 % 722), SUM(c4 % 723), SUM(c4 % 724), + SUM(c4 % 725), SUM(c4 % 726), SUM(c4 % 727), SUM(c4 % 728), SUM(c4 % 729), + SUM(c4 % 730), SUM(c4 % 731), SUM(c4 % 732), SUM(c4 % 733), SUM(c4 % 734), + SUM(c4 % 735), SUM(c4 % 736), SUM(c4 % 737), SUM(c4 % 738), SUM(c4 % 739), + SUM(c4 % 740), SUM(c4 % 741), SUM(c4 % 742), SUM(c4 % 743), SUM(c4 % 744), + SUM(c4 % 745), SUM(c4 % 746), SUM(c4 % 747), SUM(c4 % 748), SUM(c4 % 749), + SUM(c4 % 750), SUM(c4 % 751), SUM(c4 % 752), SUM(c4 % 753), SUM(c4 % 754), + SUM(c4 % 755), SUM(c4 % 756), SUM(c4 % 757), SUM(c4 % 758), SUM(c4 % 759), + SUM(c4 % 760), SUM(c4 % 761), SUM(c4 % 762), SUM(c4 % 763), SUM(c4 % 764), + SUM(c4 % 765), SUM(c4 % 766), SUM(c4 % 767), SUM(c4 % 768), SUM(c4 % 769), + SUM(c4 % 770), SUM(c4 % 771), SUM(c4 % 772), SUM(c4 % 773), SUM(c4 % 774), + SUM(c4 % 775), SUM(c4 % 776), SUM(c4 % 777), SUM(c4 % 778), SUM(c4 % 779), + SUM(c4 % 780), SUM(c4 % 781), SUM(c4 % 782), SUM(c4 % 783), SUM(c4 % 784), + SUM(c4 % 785), SUM(c4 % 786), SUM(c4 % 787), SUM(c4 % 788), SUM(c4 % 789), + SUM(c4 % 790), SUM(c4 % 791), SUM(c4 % 792), SUM(c4 % 793), SUM(c4 % 794), + SUM(c4 % 795), SUM(c4 % 796), SUM(c4 % 797), SUM(c4 % 798), SUM(c4 % 799), + SUM(c4 % 800), SUM(c4 % 801), SUM(c4 % 802), SUM(c4 % 803), SUM(c4 % 804), + SUM(c4 % 805), SUM(c4 % 806), SUM(c4 % 807), SUM(c4 % 808), SUM(c4 % 809), + SUM(c4 % 810), SUM(c4 % 811), SUM(c4 % 812), SUM(c4 % 813), SUM(c4 % 814), + SUM(c4 % 815), SUM(c4 % 816), SUM(c4 % 817), SUM(c4 % 818), SUM(c4 % 819), + SUM(c4 % 820), SUM(c4 % 821), SUM(c4 % 822), SUM(c4 % 823), SUM(c4 % 824), + SUM(c4 % 825), SUM(c4 % 826), SUM(c4 % 827), SUM(c4 % 828), SUM(c4 % 829), + SUM(c4 % 830), SUM(c4 % 831), SUM(c4 % 832), SUM(c4 % 833), SUM(c4 % 834), + SUM(c4 % 835), SUM(c4 % 836), SUM(c4 % 837), SUM(c4 % 838), SUM(c4 % 839), + SUM(c4 % 840), SUM(c4 % 841), SUM(c4 % 842), SUM(c4 % 843), SUM(c4 % 844), + SUM(c4 % 845), SUM(c4 % 846), SUM(c4 % 847), SUM(c4 % 848), SUM(c4 % 849), + SUM(c4 % 850), SUM(c4 % 851), SUM(c4 % 852), SUM(c4 % 853), SUM(c4 % 854), + SUM(c4 % 855), SUM(c4 % 856), SUM(c4 % 857), SUM(c4 % 858), SUM(c4 % 859), + SUM(c4 % 860), SUM(c4 % 861), SUM(c4 % 862), SUM(c4 % 863), SUM(c4 % 864), + SUM(c4 % 865), SUM(c4 % 866), SUM(c4 % 867), SUM(c4 % 868), SUM(c4 % 869), + SUM(c4 % 870), SUM(c4 % 871), SUM(c4 % 872), SUM(c4 % 873), SUM(c4 % 874), + SUM(c4 % 875), SUM(c4 % 876), SUM(c4 % 877), SUM(c4 % 878), SUM(c4 % 879), + SUM(c4 % 880), SUM(c4 % 881), SUM(c4 % 882), SUM(c4 % 883), SUM(c4 % 884), + SUM(c4 % 885), SUM(c4 % 886), SUM(c4 % 887), SUM(c4 % 888), SUM(c4 % 889), + SUM(c4 % 890), SUM(c4 % 891), SUM(c4 % 892), SUM(c4 % 893), SUM(c4 % 894), + SUM(c4 % 895), SUM(c4 % 896), SUM(c4 % 897), SUM(c4 % 898), SUM(c4 % 899), + SUM(c4 % 900), SUM(c4 % 901), SUM(c4 % 902), SUM(c4 % 903), SUM(c4 % 904), + SUM(c4 % 905), SUM(c4 % 906), SUM(c4 % 907), SUM(c4 % 908), SUM(c4 % 909), + SUM(c4 % 910), SUM(c4 % 911), SUM(c4 % 912), SUM(c4 % 913), SUM(c4 % 914), + SUM(c4 % 915), SUM(c4 % 916), SUM(c4 % 917), SUM(c4 % 918), SUM(c4 % 919), + SUM(c4 % 920), SUM(c4 % 921), SUM(c4 % 922), SUM(c4 % 923), SUM(c4 % 924), + SUM(c4 % 925), SUM(c4 % 926), SUM(c4 % 927), SUM(c4 % 928), SUM(c4 % 929), + SUM(c4 % 930), SUM(c4 % 931), SUM(c4 % 932), SUM(c4 % 933), SUM(c4 % 934), + SUM(c4 % 935), SUM(c4 % 936), SUM(c4 % 937), SUM(c4 % 938), SUM(c4 % 939), + SUM(c4 % 940), SUM(c4 % 941), SUM(c4 % 942), SUM(c4 % 943), SUM(c4 % 944), + SUM(c4 % 945), SUM(c4 % 946), SUM(c4 % 947), SUM(c4 % 948), SUM(c4 % 949), + SUM(c4 % 950), SUM(c4 % 951), SUM(c4 % 952), SUM(c4 % 953), SUM(c4 % 954), + SUM(c4 % 955), SUM(c4 % 956), SUM(c4 % 957), SUM(c4 % 958), SUM(c4 % 959), + SUM(c4 % 960), SUM(c4 % 961), SUM(c4 % 962), SUM(c4 % 963), SUM(c4 % 964), + SUM(c4 % 965), SUM(c4 % 966), SUM(c4 % 967), SUM(c4 % 968), SUM(c4 % 969), + SUM(c4 % 970), SUM(c4 % 971), SUM(c4 % 972), SUM(c4 % 973), SUM(c4 % 974), + SUM(c4 % 975), SUM(c4 % 976), SUM(c4 % 977), SUM(c4 % 978), SUM(c4 % 979), + SUM(c4 % 980), SUM(c4 % 981), SUM(c4 % 982), SUM(c4 % 983), SUM(c4 % 984), + SUM(c4 % 985), SUM(c4 % 986), SUM(c4 % 987), SUM(c4 % 988), SUM(c4 % 989), + SUM(c4 % 990), SUM(c4 % 991), SUM(c4 % 992), SUM(c4 % 993), SUM(c4 % 994), + SUM(c4 % 995), SUM(c4 % 996), SUM(c4 % 997), SUM(c4 % 998), SUM(c4 % 999), + SUM(c4 % 1000), SUM(c4 % 1001), SUM(c4 % 1002), SUM(c4 % 1003), SUM(c4 % 1004), + SUM(c4 % 1005), SUM(c4 % 1006), SUM(c4 % 1007), SUM(c4 % 1008), SUM(c4 % 1009), + SUM(c4 % 1010), SUM(c4 % 1011), SUM(c4 % 1012), SUM(c4 % 1013), SUM(c4 % 1014), + SUM(c4 % 1015), SUM(c4 % 1016), SUM(c4 % 1017), SUM(c4 % 1018), SUM(c4 % 1019), + SUM(c4 % 1020), SUM(c4 % 1021), SUM(c4 % 1022), SUM(c4 % 1023), SUM(c4 % 1024), + SUM(c4 % 1025), SUM(c4 % 1026), SUM(c4 % 1027), SUM(c4 % 1028), SUM(c4 % 1029), + SUM(c4 % 1030), SUM(c4 % 1031), SUM(c4 % 1032), SUM(c4 % 1033), SUM(c4 % 1034), + SUM(c4 % 1035), SUM(c4 % 1036), SUM(c4 % 1037), SUM(c4 % 1038), SUM(c4 % 1039), + SUM(c4 % 1040), SUM(c4 % 1041), SUM(c4 % 1042), SUM(c4 % 1043), SUM(c4 % 1044), + SUM(c4 % 1045), SUM(c4 % 1046), SUM(c4 % 1047), SUM(c4 % 1048), SUM(c4 % 1049), + SUM(c4 % 1050), SUM(c4 % 1051), SUM(c4 % 1052), SUM(c4 % 1053), SUM(c4 % 1054), + SUM(c4 % 1055), SUM(c4 % 1056), SUM(c4 % 1057), SUM(c4 % 1058), SUM(c4 % 1059), + SUM(c4 % 1060), SUM(c4 % 1061), SUM(c4 % 1062), SUM(c4 % 1063), SUM(c4 % 1064), + SUM(c4 % 1065), SUM(c4 % 1066), SUM(c4 % 1067), SUM(c4 % 1068), SUM(c4 % 1069), + SUM(c4 % 1070), SUM(c4 % 1071), SUM(c4 % 1072), SUM(c4 % 1073), SUM(c4 % 1074), + SUM(c4 % 1075), SUM(c4 % 1076), SUM(c4 % 1077), SUM(c4 % 1078), SUM(c4 % 1079), + SUM(c4 % 1080), SUM(c4 % 1081), SUM(c4 % 1082), SUM(c4 % 1083), SUM(c4 % 1084), + SUM(c4 % 1085), SUM(c4 % 1086), SUM(c4 % 1087), SUM(c4 % 1088), SUM(c4 % 1089), + SUM(c4 % 1090), SUM(c4 % 1091), SUM(c4 % 1092), SUM(c4 % 1093), SUM(c4 % 1094), + SUM(c4 % 1095), SUM(c4 % 1096), SUM(c4 % 1097), SUM(c4 % 1098), SUM(c4 % 1099), + SUM(c4 % 1100), SUM(c4 % 1101), SUM(c4 % 1102), SUM(c4 % 1103), SUM(c4 % 1104), + SUM(c4 % 1105), SUM(c4 % 1106), SUM(c4 % 1107), SUM(c4 % 1108), SUM(c4 % 1109), + SUM(c4 % 1110), SUM(c4 % 1111), SUM(c4 % 1112), SUM(c4 % 1113), SUM(c4 % 1114), + SUM(c4 % 1115), SUM(c4 % 1116), SUM(c4 % 1117), SUM(c4 % 1118), SUM(c4 % 1119), + SUM(c4 % 1120), SUM(c4 % 1121), SUM(c4 % 1122), SUM(c4 % 1123), SUM(c4 % 1124), + SUM(c4 % 1125), SUM(c4 % 1126), SUM(c4 % 1127), SUM(c4 % 1128), SUM(c4 % 1129), + SUM(c4 % 1130), SUM(c4 % 1131), SUM(c4 % 1132), SUM(c4 % 1133), SUM(c4 % 1134), + SUM(c4 % 1135), SUM(c4 % 1136), SUM(c4 % 1137), SUM(c4 % 1138), SUM(c4 % 1139), + SUM(c4 % 1140), SUM(c4 % 1141), SUM(c4 % 1142), SUM(c4 % 1143), SUM(c4 % 1144), + SUM(c4 % 1145), SUM(c4 % 1146), SUM(c4 % 1147), SUM(c4 % 1148), SUM(c4 % 1149), + SUM(c4 % 1150), SUM(c4 % 1151), SUM(c4 % 1152), SUM(c4 % 1153), SUM(c4 % 1154), + SUM(c4 % 1155), SUM(c4 % 1156), SUM(c4 % 1157), SUM(c4 % 1158), SUM(c4 % 1159), + SUM(c4 % 1160), SUM(c4 % 1161), SUM(c4 % 1162), SUM(c4 % 1163), SUM(c4 % 1164), + SUM(c4 % 1165), SUM(c4 % 1166), SUM(c4 % 1167), SUM(c4 % 1168), SUM(c4 % 1169), + SUM(c4 % 1170), SUM(c4 % 1171), SUM(c4 % 1172), SUM(c4 % 1173), SUM(c4 % 1174), + SUM(c4 % 1175), SUM(c4 % 1176), SUM(c4 % 1177), SUM(c4 % 1178), SUM(c4 % 1179), + SUM(c4 % 1180), SUM(c4 % 1181), SUM(c4 % 1182), SUM(c4 % 1183), SUM(c4 % 1184), + SUM(c4 % 1185), SUM(c4 % 1186), SUM(c4 % 1187), SUM(c4 % 1188), SUM(c4 % 1189), + SUM(c4 % 1190), SUM(c4 % 1191), SUM(c4 % 1192), SUM(c4 % 1193), SUM(c4 % 1194), + SUM(c4 % 1195), SUM(c4 % 1196), SUM(c4 % 1197), SUM(c4 % 1198), SUM(c4 % 1199), + SUM(c4 % 1200), SUM(c4 % 1201), SUM(c4 % 1202), SUM(c4 % 1203), SUM(c4 % 1204), + SUM(c4 % 1205), SUM(c4 % 1206), SUM(c4 % 1207), SUM(c4 % 1208), SUM(c4 % 1209), + SUM(c4 % 1210), SUM(c4 % 1211), SUM(c4 % 1212), SUM(c4 % 1213), SUM(c4 % 1214), + SUM(c4 % 1215), SUM(c4 % 1216), SUM(c4 % 1217), SUM(c4 % 1218), SUM(c4 % 1219), + SUM(c4 % 1220), SUM(c4 % 1221), SUM(c4 % 1222), SUM(c4 % 1223), SUM(c4 % 1224), + SUM(c4 % 1225), SUM(c4 % 1226), SUM(c4 % 1227), SUM(c4 % 1228), SUM(c4 % 1229), + SUM(c4 % 1230), SUM(c4 % 1231), SUM(c4 % 1232), SUM(c4 % 1233), SUM(c4 % 1234), + SUM(c4 % 1235), SUM(c4 % 1236), SUM(c4 % 1237), SUM(c4 % 1238), SUM(c4 % 1239), + SUM(c4 % 1240), SUM(c4 % 1241), SUM(c4 % 1242), SUM(c4 % 1243), SUM(c4 % 1244), + SUM(c4 % 1245), SUM(c4 % 1246), SUM(c4 % 1247), SUM(c4 % 1248), SUM(c4 % 1249), + SUM(c4 % 1250), SUM(c4 % 1251), SUM(c4 % 1252), SUM(c4 % 1253), SUM(c4 % 1254), + SUM(c4 % 1255), SUM(c4 % 1256), SUM(c4 % 1257), SUM(c4 % 1258), SUM(c4 % 1259), + SUM(c4 % 1260), SUM(c4 % 1261), SUM(c4 % 1262), SUM(c4 % 1263), SUM(c4 % 1264), + SUM(c4 % 1265), SUM(c4 % 1266), SUM(c4 % 1267), SUM(c4 % 1268), SUM(c4 % 1269), + SUM(c4 % 1270), SUM(c4 % 1271), SUM(c4 % 1272), SUM(c4 % 1273), SUM(c4 % 1274), + SUM(c4 % 1275), SUM(c4 % 1276), SUM(c4 % 1277), SUM(c4 % 1278), SUM(c4 % 1279), + SUM(c4 % 1280), SUM(c4 % 1281), SUM(c4 % 1282), SUM(c4 % 1283), SUM(c4 % 1284), + SUM(c4 % 1285), SUM(c4 % 1286), SUM(c4 % 1287), SUM(c4 % 1288), SUM(c4 % 1289), + SUM(c4 % 1290), SUM(c4 % 1291), SUM(c4 % 1292), SUM(c4 % 1293), SUM(c4 % 1294), + SUM(c4 % 1295), SUM(c4 % 1296), SUM(c4 % 1297), SUM(c4 % 1298), SUM(c4 % 1299), + SUM(c4 % 1300), SUM(c4 % 1301), SUM(c4 % 1302), SUM(c4 % 1303), SUM(c4 % 1304), + SUM(c4 % 1305), SUM(c4 % 1306), SUM(c4 % 1307), SUM(c4 % 1308), SUM(c4 % 1309), + SUM(c4 % 1310), SUM(c4 % 1311), SUM(c4 % 1312), SUM(c4 % 1313), SUM(c4 % 1314), + SUM(c4 % 1315), SUM(c4 % 1316), SUM(c4 % 1317), SUM(c4 % 1318), SUM(c4 % 1319), + SUM(c4 % 1320), SUM(c4 % 1321), SUM(c4 % 1322), SUM(c4 % 1323), SUM(c4 % 1324), + SUM(c4 % 1325), SUM(c4 % 1326), SUM(c4 % 1327), SUM(c4 % 1328), SUM(c4 % 1329), + SUM(c4 % 1330), SUM(c4 % 1331), SUM(c4 % 1332), SUM(c4 % 1333), SUM(c4 % 1334), + SUM(c4 % 1335), SUM(c4 % 1336), SUM(c4 % 1337), SUM(c4 % 1338), SUM(c4 % 1339), + SUM(c4 % 1340), SUM(c4 % 1341), SUM(c4 % 1342), SUM(c4 % 1343), SUM(c4 % 1344), + SUM(c4 % 1345), SUM(c4 % 1346), SUM(c4 % 1347), SUM(c4 % 1348), SUM(c4 % 1349), + SUM(c4 % 1350), SUM(c4 % 1351), SUM(c4 % 1352), SUM(c4 % 1353), SUM(c4 % 1354), + SUM(c4 % 1355), SUM(c4 % 1356), SUM(c4 % 1357), SUM(c4 % 1358), SUM(c4 % 1359), + SUM(c4 % 1360), SUM(c4 % 1361), SUM(c4 % 1362), SUM(c4 % 1363), SUM(c4 % 1364), + SUM(c4 % 1365), SUM(c4 % 1366), SUM(c4 % 1367), SUM(c4 % 1368), SUM(c4 % 1369), + SUM(c4 % 1370), SUM(c4 % 1371), SUM(c4 % 1372), SUM(c4 % 1373), SUM(c4 % 1374), + SUM(c4 % 1375), SUM(c4 % 1376), SUM(c4 % 1377), SUM(c4 % 1378), SUM(c4 % 1379), + SUM(c4 % 1380), SUM(c4 % 1381), SUM(c4 % 1382), SUM(c4 % 1383), SUM(c4 % 1384), + SUM(c4 % 1385), SUM(c4 % 1386), SUM(c4 % 1387), SUM(c4 % 1388), SUM(c4 % 1389), + SUM(c4 % 1390), SUM(c4 % 1391), SUM(c4 % 1392), SUM(c4 % 1393), SUM(c4 % 1394), + SUM(c4 % 1395), SUM(c4 % 1396), SUM(c4 % 1397), SUM(c4 % 1398), SUM(c4 % 1399), + SUM(c4 % 1400), SUM(c4 % 1401), SUM(c4 % 1402), SUM(c4 % 1403), SUM(c4 % 1404), + SUM(c4 % 1405), SUM(c4 % 1406), SUM(c4 % 1407), SUM(c4 % 1408), SUM(c4 % 1409), + SUM(c4 % 1410), SUM(c4 % 1411), SUM(c4 % 1412), SUM(c4 % 1413), SUM(c4 % 1414), + SUM(c4 % 1415), SUM(c4 % 1416), SUM(c4 % 1417), SUM(c4 % 1418), SUM(c4 % 1419), + SUM(c4 % 1420), SUM(c4 % 1421), SUM(c4 % 1422), SUM(c4 % 1423), SUM(c4 % 1424), + SUM(c4 % 1425), SUM(c4 % 1426), SUM(c4 % 1427), SUM(c4 % 1428), SUM(c4 % 1429), + SUM(c4 % 1430), SUM(c4 % 1431), SUM(c4 % 1432), SUM(c4 % 1433), SUM(c4 % 1434), + SUM(c4 % 1435), SUM(c4 % 1436), SUM(c4 % 1437), SUM(c4 % 1438), SUM(c4 % 1439), + SUM(c4 % 1440), SUM(c4 % 1441), SUM(c4 % 1442), SUM(c4 % 1443), SUM(c4 % 1444), + SUM(c4 % 1445), SUM(c4 % 1446), SUM(c4 % 1447), SUM(c4 % 1448), SUM(c4 % 1449), + SUM(c4 % 1450), SUM(c4 % 1451), SUM(c4 % 1452), SUM(c4 % 1453), SUM(c4 % 1454), + SUM(c4 % 1455), SUM(c4 % 1456), SUM(c4 % 1457), SUM(c4 % 1458), SUM(c4 % 1459), + SUM(c4 % 1460), SUM(c4 % 1461), SUM(c4 % 1462), SUM(c4 % 1463), SUM(c4 % 1464), + SUM(c4 % 1465), SUM(c4 % 1466), SUM(c4 % 1467), SUM(c4 % 1468), SUM(c4 % 1469), + SUM(c4 % 1470), SUM(c4 % 1471), SUM(c4 % 1472), SUM(c4 % 1473), SUM(c4 % 1474), + SUM(c4 % 1475), SUM(c4 % 1476), SUM(c4 % 1477), SUM(c4 % 1478), SUM(c4 % 1479), + SUM(c4 % 1480), SUM(c4 % 1481), SUM(c4 % 1482), SUM(c4 % 1483), SUM(c4 % 1484), + SUM(c4 % 1485), SUM(c4 % 1486), SUM(c4 % 1487), SUM(c4 % 1488), SUM(c4 % 1489), + SUM(c4 % 1490), SUM(c4 % 1491), SUM(c4 % 1492), SUM(c4 % 1493), SUM(c4 % 1494), + SUM(c4 % 1495), SUM(c4 % 1496), SUM(c4 % 1497), SUM(c4 % 1498), SUM(c4 % 1499), + SUM(c4 % 1500), SUM(c4 % 1501), SUM(c4 % 1502), SUM(c4 % 1503), SUM(c4 % 1504), + SUM(c4 % 1505), SUM(c4 % 1506), SUM(c4 % 1507), SUM(c4 % 1508), SUM(c4 % 1509), + SUM(c4 % 1510), SUM(c4 % 1511), SUM(c4 % 1512), SUM(c4 % 1513), SUM(c4 % 1514), + SUM(c4 % 1515), SUM(c4 % 1516), SUM(c4 % 1517), SUM(c4 % 1518), SUM(c4 % 1519), + SUM(c4 % 1520), SUM(c4 % 1521), SUM(c4 % 1522), SUM(c4 % 1523), SUM(c4 % 1524), + SUM(c4 % 1525), SUM(c4 % 1526), SUM(c4 % 1527), SUM(c4 % 1528), SUM(c4 % 1529), + SUM(c4 % 1530), SUM(c4 % 1531), SUM(c4 % 1532), SUM(c4 % 1533), SUM(c4 % 1534), + SUM(c4 % 1535), SUM(c4 % 1536), SUM(c4 % 1537), SUM(c4 % 1538), SUM(c4 % 1539), + SUM(c4 % 1540), SUM(c4 % 1541), SUM(c4 % 1542), SUM(c4 % 1543), SUM(c4 % 1544), + SUM(c4 % 1545), SUM(c4 % 1546), SUM(c4 % 1547), SUM(c4 % 1548), SUM(c4 % 1549), + SUM(c4 % 1550), SUM(c4 % 1551), SUM(c4 % 1552), SUM(c4 % 1553), SUM(c4 % 1554), + SUM(c4 % 1555), SUM(c4 % 1556), SUM(c4 % 1557), SUM(c4 % 1558), SUM(c4 % 1559), + SUM(c4 % 1560), SUM(c4 % 1561), SUM(c4 % 1562), SUM(c4 % 1563), SUM(c4 % 1564), + SUM(c4 % 1565), SUM(c4 % 1566), SUM(c4 % 1567), SUM(c4 % 1568), SUM(c4 % 1569), + SUM(c4 % 1570), SUM(c4 % 1571), SUM(c4 % 1572), SUM(c4 % 1573), SUM(c4 % 1574), + SUM(c4 % 1575), SUM(c4 % 1576), SUM(c4 % 1577), SUM(c4 % 1578), SUM(c4 % 1579), + SUM(c4 % 1580), SUM(c4 % 1581), SUM(c4 % 1582), SUM(c4 % 1583), SUM(c4 % 1584), + SUM(c4 % 1585), SUM(c4 % 1586), SUM(c4 % 1587), SUM(c4 % 1588), SUM(c4 % 1589), + SUM(c4 % 1590), SUM(c4 % 1591), SUM(c4 % 1592), SUM(c4 % 1593), SUM(c4 % 1594), + SUM(c4 % 1595), SUM(c4 % 1596), SUM(c4 % 1597), SUM(c4 % 1598), SUM(c4 % 1599), + SUM(c4 % 1600), SUM(c4 % 1601), SUM(c4 % 1602), SUM(c4 % 1603), SUM(c4 % 1604), + SUM(c4 % 1605), SUM(c4 % 1606), SUM(c4 % 1607), SUM(c4 % 1608), SUM(c4 % 1609), + SUM(c4 % 1610), SUM(c4 % 1611), SUM(c4 % 1612), SUM(c4 % 1613), SUM(c4 % 1614), + SUM(c4 % 1615), SUM(c4 % 1616), SUM(c4 % 1617), SUM(c4 % 1618), SUM(c4 % 1619), + SUM(c4 % 1620), SUM(c4 % 1621), SUM(c4 % 1622), SUM(c4 % 1623), SUM(c4 % 1624), + SUM(c4 % 1625), SUM(c4 % 1626), SUM(c4 % 1627), SUM(c4 % 1628), SUM(c4 % 1629), + SUM(c4 % 1630), SUM(c4 % 1631), SUM(c4 % 1632), SUM(c4 % 1633), SUM(c4 % 1634), + SUM(c4 % 1635), SUM(c4 % 1636), SUM(c4 % 1637), SUM(c4 % 1638), SUM(c4 % 1639), + SUM(c4 % 1640), SUM(c4 % 1641), SUM(c4 % 1642), SUM(c4 % 1643), SUM(c4 % 1644), + SUM(c4 % 1645), SUM(c4 % 1646), SUM(c4 % 1647), SUM(c4 % 1648), SUM(c4 % 1649), + SUM(c4 % 1650), SUM(c4 % 1651), SUM(c4 % 1652), SUM(c4 % 1653), SUM(c4 % 1654), + SUM(c4 % 1655), SUM(c4 % 1656), SUM(c4 % 1657), SUM(c4 % 1658), SUM(c4 % 1659), + SUM(c4 % 1660), SUM(c4 % 1661), SUM(c4 % 1662), SUM(c4 % 1663), SUM(c4 % 1664), + SUM(c4 % 1665), SUM(c4 % 1666), SUM(c4 % 1667), SUM(c4 % 1668), SUM(c4 % 1669), + SUM(c4 % 1670), SUM(c4 % 1671), SUM(c4 % 1672), SUM(c4 % 1673), SUM(c4 % 1674), + SUM(c4 % 1675), SUM(c4 % 1676), SUM(c4 % 1677), SUM(c4 % 1678), SUM(c4 % 1679), + SUM(c4 % 1680), SUM(c4 % 1681), SUM(c4 % 1682), SUM(c4 % 1683), SUM(c4 % 1684), + SUM(c4 % 1685), SUM(c4 % 1686), SUM(c4 % 1687), SUM(c4 % 1688), SUM(c4 % 1689), + SUM(c4 % 1690), SUM(c4 % 1691), SUM(c4 % 1692), SUM(c4 % 1693), SUM(c4 % 1694), + SUM(c4 % 1695), SUM(c4 % 1696), SUM(c4 % 1697), SUM(c4 % 1698), SUM(c4 % 1699), + SUM(c4 % 1700), SUM(c4 % 1701), SUM(c4 % 1702), SUM(c4 % 1703), SUM(c4 % 1704), + SUM(c4 % 1705), SUM(c4 % 1706), SUM(c4 % 1707), SUM(c4 % 1708), SUM(c4 % 1709), + SUM(c4 % 1710), SUM(c4 % 1711), SUM(c4 % 1712), SUM(c4 % 1713), SUM(c4 % 1714), + SUM(c4 % 1715), SUM(c4 % 1716), SUM(c4 % 1717), SUM(c4 % 1718), SUM(c4 % 1719), + SUM(c4 % 1720), SUM(c4 % 1721), SUM(c4 % 1722), SUM(c4 % 1723), SUM(c4 % 1724), + SUM(c4 % 1725), SUM(c4 % 1726), SUM(c4 % 1727), SUM(c4 % 1728), SUM(c4 % 1729), + SUM(c4 % 1730), SUM(c4 % 1731), SUM(c4 % 1732), SUM(c4 % 1733), SUM(c4 % 1734), + SUM(c4 % 1735), SUM(c4 % 1736), SUM(c4 % 1737), SUM(c4 % 1738), SUM(c4 % 1739), + SUM(c4 % 1740), SUM(c4 % 1741), SUM(c4 % 1742), SUM(c4 % 1743), SUM(c4 % 1744), + SUM(c4 % 1745), SUM(c4 % 1746), SUM(c4 % 1747), SUM(c4 % 1748), SUM(c4 % 1749), + SUM(c4 % 1750), SUM(c4 % 1751), SUM(c4 % 1752), SUM(c4 % 1753), SUM(c4 % 1754), + SUM(c4 % 1755), SUM(c4 % 1756), SUM(c4 % 1757), SUM(c4 % 1758), SUM(c4 % 1759), + SUM(c4 % 1760), SUM(c4 % 1761), SUM(c4 % 1762), SUM(c4 % 1763), SUM(c4 % 1764), + SUM(c4 % 1765), SUM(c4 % 1766), SUM(c4 % 1767), SUM(c4 % 1768), SUM(c4 % 1769), + SUM(c4 % 1770), SUM(c4 % 1771), SUM(c4 % 1772), SUM(c4 % 1773), SUM(c4 % 1774), + SUM(c4 % 1775), SUM(c4 % 1776), SUM(c4 % 1777), SUM(c4 % 1778), SUM(c4 % 1779), + SUM(c4 % 1780), SUM(c4 % 1781), SUM(c4 % 1782), SUM(c4 % 1783), SUM(c4 % 1784), + SUM(c4 % 1785), SUM(c4 % 1786), SUM(c4 % 1787), SUM(c4 % 1788), SUM(c4 % 1789), + SUM(c4 % 1790), SUM(c4 % 1791), SUM(c4 % 1792), SUM(c4 % 1793), SUM(c4 % 1794), + SUM(c4 % 1795), SUM(c4 % 1796), SUM(c4 % 1797), SUM(c4 % 1798), SUM(c4 % 1799), + SUM(c4 % 1800), SUM(c4 % 1801), SUM(c4 % 1802), SUM(c4 % 1803), SUM(c4 % 1804), + SUM(c4 % 1805), SUM(c4 % 1806), SUM(c4 % 1807), SUM(c4 % 1808), SUM(c4 % 1809), + SUM(c4 % 1810), SUM(c4 % 1811), SUM(c4 % 1812), SUM(c4 % 1813), SUM(c4 % 1814), + SUM(c4 % 1815), SUM(c4 % 1816), SUM(c4 % 1817), SUM(c4 % 1818), SUM(c4 % 1819), + SUM(c4 % 1820), SUM(c4 % 1821), SUM(c4 % 1822), SUM(c4 % 1823), SUM(c4 % 1824), + SUM(c4 % 1825), SUM(c4 % 1826), SUM(c4 % 1827), SUM(c4 % 1828), SUM(c4 % 1829), + SUM(c4 % 1830), SUM(c4 % 1831), SUM(c4 % 1832), SUM(c4 % 1833), SUM(c4 % 1834), + SUM(c4 % 1835), SUM(c4 % 1836), SUM(c4 % 1837), SUM(c4 % 1838), SUM(c4 % 1839), + SUM(c4 % 1840), SUM(c4 % 1841), SUM(c4 % 1842), SUM(c4 % 1843), SUM(c4 % 1844), + SUM(c4 % 1845), SUM(c4 % 1846), SUM(c4 % 1847), SUM(c4 % 1848), SUM(c4 % 1849), + SUM(c4 % 1850), SUM(c4 % 1851), SUM(c4 % 1852), SUM(c4 % 1853), SUM(c4 % 1854), + SUM(c4 % 1855), SUM(c4 % 1856), SUM(c4 % 1857), SUM(c4 % 1858), SUM(c4 % 1859), + SUM(c4 % 1860), SUM(c4 % 1861), SUM(c4 % 1862), SUM(c4 % 1863), SUM(c4 % 1864), + SUM(c4 % 1865), SUM(c4 % 1866), SUM(c4 % 1867), SUM(c4 % 1868), SUM(c4 % 1869), + SUM(c4 % 1870), SUM(c4 % 1871), SUM(c4 % 1872), SUM(c4 % 1873), SUM(c4 % 1874), + SUM(c4 % 1875), SUM(c4 % 1876), SUM(c4 % 1877), SUM(c4 % 1878), SUM(c4 % 1879), + SUM(c4 % 1880), SUM(c4 % 1881), SUM(c4 % 1882), SUM(c4 % 1883), SUM(c4 % 1884), + SUM(c4 % 1885), SUM(c4 % 1886), SUM(c4 % 1887), SUM(c4 % 1888), SUM(c4 % 1889), + SUM(c4 % 1890), SUM(c4 % 1891), SUM(c4 % 1892), SUM(c4 % 1893), SUM(c4 % 1894), + SUM(c4 % 1895), SUM(c4 % 1896), SUM(c4 % 1897), SUM(c4 % 1898), SUM(c4 % 1899), + SUM(c4 % 1900), SUM(c4 % 1901), SUM(c4 % 1902), SUM(c4 % 1903), SUM(c4 % 1904), + SUM(c4 % 1905), SUM(c4 % 1906), SUM(c4 % 1907), SUM(c4 % 1908), SUM(c4 % 1909), + SUM(c4 % 1910), SUM(c4 % 1911), SUM(c4 % 1912), SUM(c4 % 1913), SUM(c4 % 1914), + SUM(c4 % 1915), SUM(c4 % 1916), SUM(c4 % 1917), SUM(c4 % 1918), SUM(c4 % 1919), + SUM(c4 % 1920), SUM(c4 % 1921), SUM(c4 % 1922), SUM(c4 % 1923), SUM(c4 % 1924), + SUM(c4 % 1925), SUM(c4 % 1926), SUM(c4 % 1927), SUM(c4 % 1928), SUM(c4 % 1929), + SUM(c4 % 1930), SUM(c4 % 1931), SUM(c4 % 1932), SUM(c4 % 1933), SUM(c4 % 1934), + SUM(c4 % 1935), SUM(c4 % 1936), SUM(c4 % 1937), SUM(c4 % 1938), SUM(c4 % 1939), + SUM(c4 % 1940), SUM(c4 % 1941), SUM(c4 % 1942), SUM(c4 % 1943), SUM(c4 % 1944), + SUM(c4 % 1945), SUM(c4 % 1946), SUM(c4 % 1947), SUM(c4 % 1948), SUM(c4 % 1949), + SUM(c4 % 1950), SUM(c4 % 1951), SUM(c4 % 1952), SUM(c4 % 1953), SUM(c4 % 1954), + SUM(c4 % 1955), SUM(c4 % 1956), SUM(c4 % 1957), SUM(c4 % 1958), SUM(c4 % 1959), + SUM(c4 % 1960), SUM(c4 % 1961), SUM(c4 % 1962), SUM(c4 % 1963), SUM(c4 % 1964), + SUM(c4 % 1965), SUM(c4 % 1966), SUM(c4 % 1967), SUM(c4 % 1968), SUM(c4 % 1969), + SUM(c4 % 1970), SUM(c4 % 1971), SUM(c4 % 1972), SUM(c4 % 1973), SUM(c4 % 1974), + SUM(c4 % 1975), SUM(c4 % 1976), SUM(c4 % 1977), SUM(c4 % 1978), SUM(c4 % 1979), + SUM(c4 % 1980), SUM(c4 % 1981), SUM(c4 % 1982), SUM(c4 % 1983), SUM(c4 % 1984), + SUM(c4 % 1985), SUM(c4 % 1986), SUM(c4 % 1987), SUM(c4 % 1988), SUM(c4 % 1989), + SUM(c4 % 1990), SUM(c4 % 1991), SUM(c4 % 1992), SUM(c4 % 1993), SUM(c4 % 1994), + SUM(c4 % 1995), SUM(c4 % 1996), SUM(c4 % 1997), SUM(c4 % 1998), SUM(c4 % 1999), + SUM(c4 % 2000), SUM(c4 % 2001), SUM(c4 % 2002), SUM(c4 % 2003), SUM(c4 % 2004), + SUM(c4 % 2005), SUM(c4 % 2006), SUM(c4 % 2007), SUM(c4 % 2008), SUM(c4 % 2009), + SUM(c4 % 2010), SUM(c4 % 2011), SUM(c4 % 2012), SUM(c4 % 2013), SUM(c4 % 2014), + SUM(c4 % 2015), SUM(c4 % 2016), SUM(c4 % 2017), SUM(c4 % 2018), SUM(c4 % 2019), + SUM(c4 % 2020), SUM(c4 % 2021), SUM(c4 % 2022), SUM(c4 % 2023), SUM(c4 % 2024), + SUM(c4 % 2025), SUM(c4 % 2026), SUM(c4 % 2027), SUM(c4 % 2028), SUM(c4 % 2029), + SUM(c4 % 2030), SUM(c4 % 2031), SUM(c4 % 2032), SUM(c4 % 2033), SUM(c4 % 2034), + SUM(c4 % 2035), SUM(c4 % 2036), SUM(c4 % 2037), SUM(c4 % 2038), SUM(c4 % 2039), + SUM(c4 % 2040), SUM(c4 % 2041), SUM(c4 % 2042), SUM(c4 % 2043), SUM(c4 % 2044), + SUM(c4 % 2045), SUM(c4 % 2046), SUM(c4 % 2047), SUM(c4 % 2048), SUM(c4 % 2049), + SUM(c4 % 2050), SUM(c4 % 2051), SUM(c4 % 2052), SUM(c4 % 2053), SUM(c4 % 2054), + SUM(c4 % 2055), SUM(c4 % 2056), SUM(c4 % 2057), SUM(c4 % 2058), SUM(c4 % 2059), + SUM(c4 % 2060), SUM(c4 % 2061), SUM(c4 % 2062), SUM(c4 % 2063), SUM(c4 % 2064), + SUM(c4 % 2065), SUM(c4 % 2066), SUM(c4 % 2067), SUM(c4 % 2068), SUM(c4 % 2069), + SUM(c4 % 2070), SUM(c4 % 2071), SUM(c4 % 2072), SUM(c4 % 2073), SUM(c4 % 2074), + SUM(c4 % 2075), SUM(c4 % 2076), SUM(c4 % 2077), SUM(c4 % 2078), SUM(c4 % 2079), + SUM(c4 % 2080), SUM(c4 % 2081), SUM(c4 % 2082), SUM(c4 % 2083), SUM(c4 % 2084), + SUM(c4 % 2085), SUM(c4 % 2086), SUM(c4 % 2087), SUM(c4 % 2088), SUM(c4 % 2089), + SUM(c4 % 2090), SUM(c4 % 2091), SUM(c4 % 2092), SUM(c4 % 2093), SUM(c4 % 2094), + SUM(c4 % 2095), SUM(c4 % 2096), SUM(c4 % 2097), SUM(c4 % 2098), SUM(c4 % 2099), + SUM(c4 % 2100), SUM(c4 % 2101), SUM(c4 % 2102), SUM(c4 % 2103), SUM(c4 % 2104), + SUM(c4 % 2105), SUM(c4 % 2106), SUM(c4 % 2107), SUM(c4 % 2108), SUM(c4 % 2109), + SUM(c4 % 2110), SUM(c4 % 2111), SUM(c4 % 2112), SUM(c4 % 2113), SUM(c4 % 2114), + SUM(c4 % 2115), SUM(c4 % 2116), SUM(c4 % 2117), SUM(c4 % 2118), SUM(c4 % 2119), + SUM(c4 % 2120), SUM(c4 % 2121), SUM(c4 % 2122), SUM(c4 % 2123), SUM(c4 % 2124), + SUM(c4 % 2125), SUM(c4 % 2126), SUM(c4 % 2127), SUM(c4 % 2128), SUM(c4 % 2129), + SUM(c4 % 2130), SUM(c4 % 2131), SUM(c4 % 2132), SUM(c4 % 2133), SUM(c4 % 2134), + SUM(c4 % 2135), SUM(c4 % 2136), SUM(c4 % 2137), SUM(c4 % 2138), SUM(c4 % 2139), + SUM(c4 % 2140), SUM(c4 % 2141), SUM(c4 % 2142), SUM(c4 % 2143), SUM(c4 % 2144), + SUM(c4 % 2145), SUM(c4 % 2146), SUM(c4 % 2147), SUM(c4 % 2148), SUM(c4 % 2149), + SUM(c4 % 2150), SUM(c4 % 2151), SUM(c4 % 2152), SUM(c4 % 2153), SUM(c4 % 2154), + SUM(c4 % 2155), SUM(c4 % 2156), SUM(c4 % 2157), SUM(c4 % 2158), SUM(c4 % 2159), + SUM(c4 % 2160), SUM(c4 % 2161), SUM(c4 % 2162), SUM(c4 % 2163), SUM(c4 % 2164), + SUM(c4 % 2165), SUM(c4 % 2166), SUM(c4 % 2167), SUM(c4 % 2168), SUM(c4 % 2169), + SUM(c4 % 2170), SUM(c4 % 2171), SUM(c4 % 2172), SUM(c4 % 2173), SUM(c4 % 2174), + SUM(c4 % 2175), SUM(c4 % 2176), SUM(c4 % 2177), SUM(c4 % 2178), SUM(c4 % 2179), + SUM(c4 % 2180), SUM(c4 % 2181), SUM(c4 % 2182), SUM(c4 % 2183), SUM(c4 % 2184), + SUM(c4 % 2185), SUM(c4 % 2186), SUM(c4 % 2187), SUM(c4 % 2188), SUM(c4 % 2189), + SUM(c4 % 2190), SUM(c4 % 2191), SUM(c4 % 2192), SUM(c4 % 2193), SUM(c4 % 2194), + SUM(c4 % 2195), SUM(c4 % 2196), SUM(c4 % 2197), SUM(c4 % 2198), SUM(c4 % 2199), + SUM(c4 % 2200), SUM(c4 % 2201), SUM(c4 % 2202), SUM(c4 % 2203), SUM(c4 % 2204), + SUM(c4 % 2205), SUM(c4 % 2206), SUM(c4 % 2207), SUM(c4 % 2208), SUM(c4 % 2209), + SUM(c4 % 2210), SUM(c4 % 2211), SUM(c4 % 2212), SUM(c4 % 2213), SUM(c4 % 2214), + SUM(c4 % 2215), SUM(c4 % 2216), SUM(c4 % 2217), SUM(c4 % 2218), SUM(c4 % 2219), + SUM(c4 % 2220), SUM(c4 % 2221), SUM(c4 % 2222), SUM(c4 % 2223), SUM(c4 % 2224), + SUM(c4 % 2225), SUM(c4 % 2226), SUM(c4 % 2227), SUM(c4 % 2228), SUM(c4 % 2229), + SUM(c4 % 2230), SUM(c4 % 2231), SUM(c4 % 2232), SUM(c4 % 2233), SUM(c4 % 2234), + SUM(c4 % 2235), SUM(c4 % 2236), SUM(c4 % 2237), SUM(c4 % 2238), SUM(c4 % 2239), + SUM(c4 % 2240), SUM(c4 % 2241), SUM(c4 % 2242), SUM(c4 % 2243), SUM(c4 % 2244), + SUM(c4 % 2245), SUM(c4 % 2246), SUM(c4 % 2247), SUM(c4 % 2248), SUM(c4 % 2249), + SUM(c4 % 2250), SUM(c4 % 2251), SUM(c4 % 2252), SUM(c4 % 2253), SUM(c4 % 2254), + SUM(c4 % 2255), SUM(c4 % 2256), SUM(c4 % 2257), SUM(c4 % 2258), SUM(c4 % 2259), + SUM(c4 % 2260), SUM(c4 % 2261), SUM(c4 % 2262), SUM(c4 % 2263), SUM(c4 % 2264), + SUM(c4 % 2265), SUM(c4 % 2266), SUM(c4 % 2267), SUM(c4 % 2268), SUM(c4 % 2269), + SUM(c4 % 2270), SUM(c4 % 2271), SUM(c4 % 2272), SUM(c4 % 2273), SUM(c4 % 2274), + SUM(c4 % 2275), SUM(c4 % 2276), SUM(c4 % 2277), SUM(c4 % 2278), SUM(c4 % 2279), + SUM(c4 % 2280), SUM(c4 % 2281), SUM(c4 % 2282), SUM(c4 % 2283), SUM(c4 % 2284), + SUM(c4 % 2285), SUM(c4 % 2286), SUM(c4 % 2287), SUM(c4 % 2288), SUM(c4 % 2289), + SUM(c4 % 2290), SUM(c4 % 2291), SUM(c4 % 2292), SUM(c4 % 2293), SUM(c4 % 2294), + SUM(c4 % 2295), SUM(c4 % 2296), SUM(c4 % 2297), SUM(c4 % 2298), SUM(c4 % 2299), + SUM(c4 % 2300), SUM(c4 % 2301), SUM(c4 % 2302), SUM(c4 % 2303), SUM(c4 % 2304), + SUM(c4 % 2305), SUM(c4 % 2306), SUM(c4 % 2307), SUM(c4 % 2308), SUM(c4 % 2309), + SUM(c4 % 2310), SUM(c4 % 2311), SUM(c4 % 2312), SUM(c4 % 2313), SUM(c4 % 2314), + SUM(c4 % 2315), SUM(c4 % 2316), SUM(c4 % 2317), SUM(c4 % 2318), SUM(c4 % 2319), + SUM(c4 % 2320), SUM(c4 % 2321), SUM(c4 % 2322), SUM(c4 % 2323), SUM(c4 % 2324), + SUM(c4 % 2325), SUM(c4 % 2326), SUM(c4 % 2327), SUM(c4 % 2328), SUM(c4 % 2329), + SUM(c4 % 2330), SUM(c4 % 2331), SUM(c4 % 2332), SUM(c4 % 2333), SUM(c4 % 2334), + SUM(c4 % 2335), SUM(c4 % 2336), SUM(c4 % 2337), SUM(c4 % 2338), SUM(c4 % 2339), + SUM(c4 % 2340), SUM(c4 % 2341), SUM(c4 % 2342), SUM(c4 % 2343), SUM(c4 % 2344), + SUM(c4 % 2345), SUM(c4 % 2346), SUM(c4 % 2347), SUM(c4 % 2348), SUM(c4 % 2349), + SUM(c4 % 2350), SUM(c4 % 2351), SUM(c4 % 2352), SUM(c4 % 2353), SUM(c4 % 2354), + SUM(c4 % 2355), SUM(c4 % 2356), SUM(c4 % 2357), SUM(c4 % 2358), SUM(c4 % 2359), + SUM(c4 % 2360), SUM(c4 % 2361), SUM(c4 % 2362), SUM(c4 % 2363), SUM(c4 % 2364), + SUM(c4 % 2365), SUM(c4 % 2366), SUM(c4 % 2367), SUM(c4 % 2368), SUM(c4 % 2369), + SUM(c4 % 2370), SUM(c4 % 2371), SUM(c4 % 2372), SUM(c4 % 2373), SUM(c4 % 2374), + SUM(c4 % 2375), SUM(c4 % 2376), SUM(c4 % 2377), SUM(c4 % 2378), SUM(c4 % 2379), + SUM(c4 % 2380), SUM(c4 % 2381), SUM(c4 % 2382), SUM(c4 % 2383), SUM(c4 % 2384), + SUM(c4 % 2385), SUM(c4 % 2386), SUM(c4 % 2387), SUM(c4 % 2388), SUM(c4 % 2389), + SUM(c4 % 2390), SUM(c4 % 2391), SUM(c4 % 2392), SUM(c4 % 2393), SUM(c4 % 2394), + SUM(c4 % 2395), SUM(c4 % 2396), SUM(c4 % 2397), SUM(c4 % 2398), SUM(c4 % 2399), + SUM(c4 % 2400), SUM(c4 % 2401), SUM(c4 % 2402), SUM(c4 % 2403), SUM(c4 % 2404), + SUM(c4 % 2405), SUM(c4 % 2406), SUM(c4 % 2407), SUM(c4 % 2408), SUM(c4 % 2409), + SUM(c4 % 2410), SUM(c4 % 2411), SUM(c4 % 2412), SUM(c4 % 2413), SUM(c4 % 2414), + SUM(c4 % 2415), SUM(c4 % 2416), SUM(c4 % 2417), SUM(c4 % 2418), SUM(c4 % 2419), + SUM(c4 % 2420), SUM(c4 % 2421), SUM(c4 % 2422), SUM(c4 % 2423), SUM(c4 % 2424), + SUM(c4 % 2425), SUM(c4 % 2426), SUM(c4 % 2427), SUM(c4 % 2428), SUM(c4 % 2429), + SUM(c4 % 2430), SUM(c4 % 2431), SUM(c4 % 2432), SUM(c4 % 2433), SUM(c4 % 2434), + SUM(c4 % 2435), SUM(c4 % 2436), SUM(c4 % 2437), SUM(c4 % 2438), SUM(c4 % 2439), + SUM(c4 % 2440), SUM(c4 % 2441), SUM(c4 % 2442), SUM(c4 % 2443), SUM(c4 % 2444), + SUM(c4 % 2445), SUM(c4 % 2446), SUM(c4 % 2447), SUM(c4 % 2448), SUM(c4 % 2449), + SUM(c4 % 2450), SUM(c4 % 2451), SUM(c4 % 2452), SUM(c4 % 2453), SUM(c4 % 2454), + SUM(c4 % 2455), SUM(c4 % 2456), SUM(c4 % 2457), SUM(c4 % 2458), SUM(c4 % 2459), + SUM(c4 % 2460), SUM(c4 % 2461), SUM(c4 % 2462), SUM(c4 % 2463), SUM(c4 % 2464), + SUM(c4 % 2465), SUM(c4 % 2466), SUM(c4 % 2467), SUM(c4 % 2468), SUM(c4 % 2469), + SUM(c4 % 2470), SUM(c4 % 2471), SUM(c4 % 2472), SUM(c4 % 2473), SUM(c4 % 2474), + SUM(c4 % 2475), SUM(c4 % 2476), SUM(c4 % 2477), SUM(c4 % 2478), SUM(c4 % 2479), + SUM(c4 % 2480), SUM(c4 % 2481), SUM(c4 % 2482), SUM(c4 % 2483), SUM(c4 % 2484), + SUM(c4 % 2485), SUM(c4 % 2486), SUM(c4 % 2487), SUM(c4 % 2488), SUM(c4 % 2489), + SUM(c4 % 2490), SUM(c4 % 2491), SUM(c4 % 2492), SUM(c4 % 2493), SUM(c4 % 2494), + SUM(c4 % 2495), SUM(c4 % 2496), SUM(c4 % 2497), SUM(c4 % 2498), SUM(c4 % 2499), + SUM(c4 % 2500), SUM(c4 % 2501), SUM(c4 % 2502), SUM(c4 % 2503), SUM(c4 % 2504), + SUM(c4 % 2505), SUM(c4 % 2506), SUM(c4 % 2507), SUM(c4 % 2508), SUM(c4 % 2509), + SUM(c4 % 2510), SUM(c4 % 2511), SUM(c4 % 2512), SUM(c4 % 2513), SUM(c4 % 2514), + SUM(c4 % 2515), SUM(c4 % 2516), SUM(c4 % 2517), SUM(c4 % 2518), SUM(c4 % 2519), + SUM(c4 % 2520), SUM(c4 % 2521), SUM(c4 % 2522), SUM(c4 % 2523), SUM(c4 % 2524), + SUM(c4 % 2525), SUM(c4 % 2526), SUM(c4 % 2527), SUM(c4 % 2528), SUM(c4 % 2529), + SUM(c4 % 2530), SUM(c4 % 2531), SUM(c4 % 2532), SUM(c4 % 2533), SUM(c4 % 2534), + SUM(c4 % 2535), SUM(c4 % 2536), SUM(c4 % 2537), SUM(c4 % 2538), SUM(c4 % 2539), + SUM(c4 % 2540), SUM(c4 % 2541), SUM(c4 % 2542), SUM(c4 % 2543), SUM(c4 % 2544), + SUM(c4 % 2545), SUM(c4 % 2546), SUM(c4 % 2547), SUM(c4 % 2548), SUM(c4 % 2549), + SUM(c4 % 2550), SUM(c4 % 2551), SUM(c4 % 2552), SUM(c4 % 2553), SUM(c4 % 2554), + SUM(c4 % 2555), SUM(c4 % 2556), SUM(c4 % 2557), SUM(c4 % 2558), SUM(c4 % 2559), + SUM(c4 % 2560), SUM(c4 % 2561), SUM(c4 % 2562), SUM(c4 % 2563), SUM(c4 % 2564), + SUM(c4 % 2565), SUM(c4 % 2566), SUM(c4 % 2567), SUM(c4 % 2568), SUM(c4 % 2569), + SUM(c4 % 2570), SUM(c4 % 2571), SUM(c4 % 2572), SUM(c4 % 2573), SUM(c4 % 2574), + SUM(c4 % 2575), SUM(c4 % 2576), SUM(c4 % 2577), SUM(c4 % 2578), SUM(c4 % 2579), + SUM(c4 % 2580), SUM(c4 % 2581), SUM(c4 % 2582), SUM(c4 % 2583), SUM(c4 % 2584), + SUM(c4 % 2585), SUM(c4 % 2586), SUM(c4 % 2587), SUM(c4 % 2588), SUM(c4 % 2589), + SUM(c4 % 2590), SUM(c4 % 2591), SUM(c4 % 2592), SUM(c4 % 2593), SUM(c4 % 2594), + SUM(c4 % 2595), SUM(c4 % 2596), SUM(c4 % 2597), SUM(c4 % 2598), SUM(c4 % 2599), + SUM(c4 % 2600), SUM(c4 % 2601), SUM(c4 % 2602), SUM(c4 % 2603), SUM(c4 % 2604), + SUM(c4 % 2605), SUM(c4 % 2606), SUM(c4 % 2607), SUM(c4 % 2608), SUM(c4 % 2609), + SUM(c4 % 2610), SUM(c4 % 2611), SUM(c4 % 2612), SUM(c4 % 2613), SUM(c4 % 2614), + SUM(c4 % 2615), SUM(c4 % 2616), SUM(c4 % 2617), SUM(c4 % 2618), SUM(c4 % 2619), + SUM(c4 % 2620), SUM(c4 % 2621), SUM(c4 % 2622), SUM(c4 % 2623), SUM(c4 % 2624), + SUM(c4 % 2625), SUM(c4 % 2626), SUM(c4 % 2627), SUM(c4 % 2628), SUM(c4 % 2629), + SUM(c4 % 2630), SUM(c4 % 2631), SUM(c4 % 2632), SUM(c4 % 2633), SUM(c4 % 2634), + SUM(c4 % 2635), SUM(c4 % 2636), SUM(c4 % 2637), SUM(c4 % 2638), SUM(c4 % 2639), + SUM(c4 % 2640), SUM(c4 % 2641), SUM(c4 % 2642), SUM(c4 % 2643), SUM(c4 % 2644), + SUM(c4 % 2645), SUM(c4 % 2646), SUM(c4 % 2647), SUM(c4 % 2648), SUM(c4 % 2649), + SUM(c4 % 2650), SUM(c4 % 2651), SUM(c4 % 2652), SUM(c4 % 2653), SUM(c4 % 2654), + SUM(c4 % 2655), SUM(c4 % 2656), SUM(c4 % 2657), SUM(c4 % 2658), SUM(c4 % 2659), + SUM(c4 % 2660), SUM(c4 % 2661), SUM(c4 % 2662), SUM(c4 % 2663), SUM(c4 % 2664), + SUM(c4 % 2665), SUM(c4 % 2666), SUM(c4 % 2667), SUM(c4 % 2668), SUM(c4 % 2669), + SUM(c4 % 2670), SUM(c4 % 2671), SUM(c4 % 2672), SUM(c4 % 2673), SUM(c4 % 2674), + SUM(c4 % 2675), SUM(c4 % 2676), SUM(c4 % 2677), SUM(c4 % 2678), SUM(c4 % 2679), + SUM(c4 % 2680), SUM(c4 % 2681), SUM(c4 % 2682), SUM(c4 % 2683), SUM(c4 % 2684), + SUM(c4 % 2685), SUM(c4 % 2686), SUM(c4 % 2687), SUM(c4 % 2688), SUM(c4 % 2689), + SUM(c4 % 2690), SUM(c4 % 2691), SUM(c4 % 2692), SUM(c4 % 2693), SUM(c4 % 2694), + SUM(c4 % 2695), SUM(c4 % 2696), SUM(c4 % 2697), SUM(c4 % 2698), SUM(c4 % 2699), + SUM(c4 % 2700), SUM(c4 % 2701), SUM(c4 % 2702), SUM(c4 % 2703), SUM(c4 % 2704), + SUM(c4 % 2705), SUM(c4 % 2706), SUM(c4 % 2707), SUM(c4 % 2708), SUM(c4 % 2709), + SUM(c4 % 2710), SUM(c4 % 2711), SUM(c4 % 2712), SUM(c4 % 2713), SUM(c4 % 2714), + SUM(c4 % 2715), SUM(c4 % 2716), SUM(c4 % 2717), SUM(c4 % 2718), SUM(c4 % 2719), + SUM(c4 % 2720), SUM(c4 % 2721), SUM(c4 % 2722), SUM(c4 % 2723), SUM(c4 % 2724), + SUM(c4 % 2725), SUM(c4 % 2726), SUM(c4 % 2727), SUM(c4 % 2728), SUM(c4 % 2729), + SUM(c4 % 2730), SUM(c4 % 2731), SUM(c4 % 2732), SUM(c4 % 2733), SUM(c4 % 2734), + SUM(c4 % 2735), SUM(c4 % 2736), SUM(c4 % 2737), SUM(c4 % 2738), SUM(c4 % 2739), + SUM(c4 % 2740), SUM(c4 % 2741), SUM(c4 % 2742), SUM(c4 % 2743), SUM(c4 % 2744), + SUM(c4 % 2745), SUM(c4 % 2746), SUM(c4 % 2747), SUM(c4 % 2748), SUM(c4 % 2749), + SUM(c4 % 2750), SUM(c4 % 2751), SUM(c4 % 2752), SUM(c4 % 2753), SUM(c4 % 2754), + SUM(c4 % 2755), SUM(c4 % 2756), SUM(c4 % 2757), SUM(c4 % 2758), SUM(c4 % 2759), + SUM(c4 % 2760), SUM(c4 % 2761), SUM(c4 % 2762), SUM(c4 % 2763), SUM(c4 % 2764), + SUM(c4 % 2765), SUM(c4 % 2766), SUM(c4 % 2767), SUM(c4 % 2768), SUM(c4 % 2769), + SUM(c4 % 2770), SUM(c4 % 2771), SUM(c4 % 2772), SUM(c4 % 2773), SUM(c4 % 2774), + SUM(c4 % 2775), SUM(c4 % 2776), SUM(c4 % 2777), SUM(c4 % 2778), SUM(c4 % 2779), + SUM(c4 % 2780), SUM(c4 % 2781), SUM(c4 % 2782), SUM(c4 % 2783), SUM(c4 % 2784), + SUM(c4 % 2785), SUM(c4 % 2786), SUM(c4 % 2787), SUM(c4 % 2788), SUM(c4 % 2789), + SUM(c4 % 2790), SUM(c4 % 2791), SUM(c4 % 2792), SUM(c4 % 2793), SUM(c4 % 2794), + SUM(c4 % 2795), SUM(c4 % 2796), SUM(c4 % 2797), SUM(c4 % 2798), SUM(c4 % 2799), + SUM(c4 % 2800), SUM(c4 % 2801), SUM(c4 % 2802), SUM(c4 % 2803), SUM(c4 % 2804), + SUM(c4 % 2805), SUM(c4 % 2806), SUM(c4 % 2807), SUM(c4 % 2808), SUM(c4 % 2809), + SUM(c4 % 2810), SUM(c4 % 2811), SUM(c4 % 2812), SUM(c4 % 2813), SUM(c4 % 2814), + SUM(c4 % 2815), SUM(c4 % 2816), SUM(c4 % 2817), SUM(c4 % 2818), SUM(c4 % 2819), + SUM(c4 % 2820), SUM(c4 % 2821), SUM(c4 % 2822), SUM(c4 % 2823), SUM(c4 % 2824), + SUM(c4 % 2825), SUM(c4 % 2826), SUM(c4 % 2827), SUM(c4 % 2828), SUM(c4 % 2829), + SUM(c4 % 2830), SUM(c4 % 2831), SUM(c4 % 2832), SUM(c4 % 2833), SUM(c4 % 2834), + SUM(c4 % 2835), SUM(c4 % 2836), SUM(c4 % 2837), SUM(c4 % 2838), SUM(c4 % 2839), + SUM(c4 % 2840), SUM(c4 % 2841), SUM(c4 % 2842), SUM(c4 % 2843), SUM(c4 % 2844), + SUM(c4 % 2845), SUM(c4 % 2846), SUM(c4 % 2847), SUM(c4 % 2848), SUM(c4 % 2849), + SUM(c4 % 2850), SUM(c4 % 2851), SUM(c4 % 2852), SUM(c4 % 2853), SUM(c4 % 2854), + SUM(c4 % 2855), SUM(c4 % 2856), SUM(c4 % 2857), SUM(c4 % 2858), SUM(c4 % 2859), + SUM(c4 % 2860), SUM(c4 % 2861), SUM(c4 % 2862), SUM(c4 % 2863), SUM(c4 % 2864), + SUM(c4 % 2865), SUM(c4 % 2866), SUM(c4 % 2867), SUM(c4 % 2868), SUM(c4 % 2869), + SUM(c4 % 2870), SUM(c4 % 2871), SUM(c4 % 2872), SUM(c4 % 2873), SUM(c4 % 2874), + SUM(c4 % 2875), SUM(c4 % 2876), SUM(c4 % 2877), SUM(c4 % 2878), SUM(c4 % 2879), + SUM(c4 % 2880), SUM(c4 % 2881), SUM(c4 % 2882), SUM(c4 % 2883), SUM(c4 % 2884), + SUM(c4 % 2885), SUM(c4 % 2886), SUM(c4 % 2887), SUM(c4 % 2888), SUM(c4 % 2889), + SUM(c4 % 2890), SUM(c4 % 2891), SUM(c4 % 2892), SUM(c4 % 2893), SUM(c4 % 2894), + SUM(c4 % 2895), SUM(c4 % 2896), SUM(c4 % 2897), SUM(c4 % 2898), SUM(c4 % 2899), + SUM(c4 % 2900), SUM(c4 % 2901), SUM(c4 % 2902), SUM(c4 % 2903), SUM(c4 % 2904), + SUM(c4 % 2905), SUM(c4 % 2906), SUM(c4 % 2907), SUM(c4 % 2908), SUM(c4 % 2909), + SUM(c4 % 2910), SUM(c4 % 2911), SUM(c4 % 2912), SUM(c4 % 2913), SUM(c4 % 2914), + SUM(c4 % 2915), SUM(c4 % 2916), SUM(c4 % 2917), SUM(c4 % 2918), SUM(c4 % 2919), + SUM(c4 % 2920), SUM(c4 % 2921), SUM(c4 % 2922), SUM(c4 % 2923), SUM(c4 % 2924), + SUM(c4 % 2925), SUM(c4 % 2926), SUM(c4 % 2927), SUM(c4 % 2928), SUM(c4 % 2929), + SUM(c4 % 2930), SUM(c4 % 2931), SUM(c4 % 2932), SUM(c4 % 2933), SUM(c4 % 2934), + SUM(c4 % 2935), SUM(c4 % 2936), SUM(c4 % 2937), SUM(c4 % 2938), SUM(c4 % 2939), + SUM(c4 % 2940), SUM(c4 % 2941), SUM(c4 % 2942), SUM(c4 % 2943), SUM(c4 % 2944), + SUM(c4 % 2945), SUM(c4 % 2946), SUM(c4 % 2947), SUM(c4 % 2948), SUM(c4 % 2949), + SUM(c4 % 2950), SUM(c4 % 2951), SUM(c4 % 2952), SUM(c4 % 2953), SUM(c4 % 2954), + SUM(c4 % 2955), SUM(c4 % 2956), SUM(c4 % 2957), SUM(c4 % 2958), SUM(c4 % 2959), + SUM(c4 % 2960), SUM(c4 % 2961), SUM(c4 % 2962), SUM(c4 % 2963), SUM(c4 % 2964), + SUM(c4 % 2965), SUM(c4 % 2966), SUM(c4 % 2967), SUM(c4 % 2968), SUM(c4 % 2969), + SUM(c4 % 2970), SUM(c4 % 2971), SUM(c4 % 2972), SUM(c4 % 2973), SUM(c4 % 2974), + SUM(c4 % 2975), SUM(c4 % 2976), SUM(c4 % 2977), SUM(c4 % 2978), SUM(c4 % 2979), + SUM(c4 % 2980), SUM(c4 % 2981), SUM(c4 % 2982), SUM(c4 % 2983), SUM(c4 % 2984), + SUM(c4 % 2985), SUM(c4 % 2986), SUM(c4 % 2987), SUM(c4 % 2988), SUM(c4 % 2989), + SUM(c4 % 2990), SUM(c4 % 2991), SUM(c4 % 2992), SUM(c4 % 2993), SUM(c4 % 2994), + SUM(c4 % 2995), SUM(c4 % 2996), SUM(c4 % 2997), SUM(c4 % 2998), SUM(c4 % 2999), + SUM(c4 % 3000), SUM(c4 % 3001), SUM(c4 % 3002), SUM(c4 % 3003), SUM(c4 % 3004), + SUM(c4 % 3005), SUM(c4 % 3006), SUM(c4 % 3007), SUM(c4 % 3008), SUM(c4 % 3009), + SUM(c4 % 3010), SUM(c4 % 3011), SUM(c4 % 3012), SUM(c4 % 3013), SUM(c4 % 3014), + SUM(c4 % 3015), SUM(c4 % 3016), SUM(c4 % 3017), SUM(c4 % 3018), SUM(c4 % 3019), + SUM(c4 % 3020), SUM(c4 % 3021), SUM(c4 % 3022), SUM(c4 % 3023), SUM(c4 % 3024), + SUM(c4 % 3025), SUM(c4 % 3026), SUM(c4 % 3027), SUM(c4 % 3028), SUM(c4 % 3029), + SUM(c4 % 3030), SUM(c4 % 3031), SUM(c4 % 3032), SUM(c4 % 3033), SUM(c4 % 3034), + SUM(c4 % 3035), SUM(c4 % 3036), SUM(c4 % 3037), SUM(c4 % 3038), SUM(c4 % 3039), + SUM(c4 % 3040), SUM(c4 % 3041), SUM(c4 % 3042), SUM(c4 % 3043), SUM(c4 % 3044), + SUM(c4 % 3045), SUM(c4 % 3046), SUM(c4 % 3047), SUM(c4 % 3048), SUM(c4 % 3049), + SUM(c4 % 3050), SUM(c4 % 3051), SUM(c4 % 3052), SUM(c4 % 3053), SUM(c4 % 3054), + SUM(c4 % 3055), SUM(c4 % 3056), SUM(c4 % 3057), SUM(c4 % 3058), SUM(c4 % 3059), + SUM(c4 % 3060), SUM(c4 % 3061), SUM(c4 % 3062), SUM(c4 % 3063), SUM(c4 % 3064), + SUM(c4 % 3065), SUM(c4 % 3066), SUM(c4 % 3067), SUM(c4 % 3068), SUM(c4 % 3069), + SUM(c4 % 3070), SUM(c4 % 3071), SUM(c4 % 3072), SUM(c4 % 3073), SUM(c4 % 3074), + SUM(c4 % 3075), SUM(c4 % 3076), SUM(c4 % 3077), SUM(c4 % 3078), SUM(c4 % 3079), + SUM(c4 % 3080), SUM(c4 % 3081), SUM(c4 % 3082), SUM(c4 % 3083), SUM(c4 % 3084), + SUM(c4 % 3085), SUM(c4 % 3086), SUM(c4 % 3087), SUM(c4 % 3088), SUM(c4 % 3089), + SUM(c4 % 3090), SUM(c4 % 3091), SUM(c4 % 3092), SUM(c4 % 3093), SUM(c4 % 3094), + SUM(c4 % 3095), SUM(c4 % 3096), SUM(c4 % 3097), SUM(c4 % 3098), SUM(c4 % 3099), + SUM(c4 % 3100), SUM(c4 % 3101), SUM(c4 % 3102), SUM(c4 % 3103), SUM(c4 % 3104), + SUM(c4 % 3105), SUM(c4 % 3106), SUM(c4 % 3107), SUM(c4 % 3108), SUM(c4 % 3109), + SUM(c4 % 3110), SUM(c4 % 3111), SUM(c4 % 3112), SUM(c4 % 3113), SUM(c4 % 3114), + SUM(c4 % 3115), SUM(c4 % 3116), SUM(c4 % 3117), SUM(c4 % 3118), SUM(c4 % 3119), + SUM(c4 % 3120), SUM(c4 % 3121), SUM(c4 % 3122), SUM(c4 % 3123), SUM(c4 % 3124), + SUM(c4 % 3125), SUM(c4 % 3126), SUM(c4 % 3127), SUM(c4 % 3128), SUM(c4 % 3129), + SUM(c4 % 3130), SUM(c4 % 3131), SUM(c4 % 3132), SUM(c4 % 3133), SUM(c4 % 3134), + SUM(c4 % 3135), SUM(c4 % 3136), SUM(c4 % 3137), SUM(c4 % 3138), SUM(c4 % 3139), + SUM(c4 % 3140), SUM(c4 % 3141), SUM(c4 % 3142), SUM(c4 % 3143), SUM(c4 % 3144), + SUM(c4 % 3145), SUM(c4 % 3146), SUM(c4 % 3147), SUM(c4 % 3148), SUM(c4 % 3149), + SUM(c4 % 3150), SUM(c4 % 3151), SUM(c4 % 3152), SUM(c4 % 3153), SUM(c4 % 3154), + SUM(c4 % 3155), SUM(c4 % 3156), SUM(c4 % 3157), SUM(c4 % 3158), SUM(c4 % 3159), + SUM(c4 % 3160), SUM(c4 % 3161), SUM(c4 % 3162), SUM(c4 % 3163), SUM(c4 % 3164), + SUM(c4 % 3165), SUM(c4 % 3166), SUM(c4 % 3167), SUM(c4 % 3168), SUM(c4 % 3169), + SUM(c4 % 3170), SUM(c4 % 3171), SUM(c4 % 3172), SUM(c4 % 3173), SUM(c4 % 3174), + SUM(c4 % 3175), SUM(c4 % 3176), SUM(c4 % 3177), SUM(c4 % 3178), SUM(c4 % 3179), + SUM(c4 % 3180), SUM(c4 % 3181), SUM(c4 % 3182), SUM(c4 % 3183), SUM(c4 % 3184), + SUM(c4 % 3185), SUM(c4 % 3186), SUM(c4 % 3187), SUM(c4 % 3188), SUM(c4 % 3189), + SUM(c4 % 3190), SUM(c4 % 3191), SUM(c4 % 3192), SUM(c4 % 3193), SUM(c4 % 3194), + SUM(c4 % 3195), SUM(c4 % 3196), SUM(c4 % 3197), SUM(c4 % 3198), SUM(c4 % 3199), + SUM(c4 % 3200), SUM(c4 % 3201), SUM(c4 % 3202), SUM(c4 % 3203), SUM(c4 % 3204), + SUM(c4 % 3205), SUM(c4 % 3206), SUM(c4 % 3207), SUM(c4 % 3208), SUM(c4 % 3209), + SUM(c4 % 3210), SUM(c4 % 3211), SUM(c4 % 3212), SUM(c4 % 3213), SUM(c4 % 3214), + SUM(c4 % 3215), SUM(c4 % 3216), SUM(c4 % 3217), SUM(c4 % 3218), SUM(c4 % 3219), + SUM(c4 % 3220), SUM(c4 % 3221), SUM(c4 % 3222), SUM(c4 % 3223), SUM(c4 % 3224), + SUM(c4 % 3225), SUM(c4 % 3226), SUM(c4 % 3227), SUM(c4 % 3228), SUM(c4 % 3229), + SUM(c4 % 3230), SUM(c4 % 3231), SUM(c4 % 3232), SUM(c4 % 3233), SUM(c4 % 3234), + SUM(c4 % 3235), SUM(c4 % 3236), SUM(c4 % 3237), SUM(c4 % 3238), SUM(c4 % 3239), + SUM(c4 % 3240), SUM(c4 % 3241), SUM(c4 % 3242), SUM(c4 % 3243), SUM(c4 % 3244), + SUM(c4 % 3245), SUM(c4 % 3246), SUM(c4 % 3247), SUM(c4 % 3248), SUM(c4 % 3249), + SUM(c4 % 3250), SUM(c4 % 3251), SUM(c4 % 3252), SUM(c4 % 3253), SUM(c4 % 3254), + SUM(c4 % 3255), SUM(c4 % 3256), SUM(c4 % 3257), SUM(c4 % 3258), SUM(c4 % 3259), + SUM(c4 % 3260), SUM(c4 % 3261), SUM(c4 % 3262), SUM(c4 % 3263), SUM(c4 % 3264), + SUM(c4 % 3265), SUM(c4 % 3266), SUM(c4 % 3267), SUM(c4 % 3268), SUM(c4 % 3269), + SUM(c4 % 3270), SUM(c4 % 3271), SUM(c4 % 3272), SUM(c4 % 3273), SUM(c4 % 3274), + SUM(c4 % 3275), SUM(c4 % 3276), SUM(c4 % 3277), SUM(c4 % 3278), SUM(c4 % 3279), + SUM(c4 % 3280), SUM(c4 % 3281), SUM(c4 % 3282), SUM(c4 % 3283), SUM(c4 % 3284), + SUM(c4 % 3285), SUM(c4 % 3286), SUM(c4 % 3287), SUM(c4 % 3288), SUM(c4 % 3289), + SUM(c4 % 3290), SUM(c4 % 3291), SUM(c4 % 3292), SUM(c4 % 3293), SUM(c4 % 3294), + SUM(c4 % 3295), SUM(c4 % 3296), SUM(c4 % 3297), SUM(c4 % 3298), SUM(c4 % 3299), + SUM(c4 % 3300), SUM(c4 % 3301), SUM(c4 % 3302), SUM(c4 % 3303), SUM(c4 % 3304), + SUM(c4 % 3305), SUM(c4 % 3306), SUM(c4 % 3307), SUM(c4 % 3308), SUM(c4 % 3309), + SUM(c4 % 3310), SUM(c4 % 3311), SUM(c4 % 3312), SUM(c4 % 3313), SUM(c4 % 3314), + SUM(c4 % 3315), SUM(c4 % 3316), SUM(c4 % 3317), SUM(c4 % 3318), SUM(c4 % 3319), + SUM(c4 % 3320), SUM(c4 % 3321), SUM(c4 % 3322), SUM(c4 % 3323), SUM(c4 % 3324), + SUM(c4 % 3325), SUM(c4 % 3326), SUM(c4 % 3327), SUM(c4 % 3328), SUM(c4 % 3329), + SUM(c4 % 3330), SUM(c4 % 3331), SUM(c4 % 3332), SUM(c4 % 3333), SUM(c4 % 3334), + SUM(c4 % 3335), SUM(c4 % 3336), SUM(c4 % 3337), SUM(c4 % 3338), SUM(c4 % 3339), + SUM(c4 % 3340), SUM(c4 % 3341), SUM(c4 % 3342), SUM(c4 % 3343), SUM(c4 % 3344), + SUM(c4 % 3345), SUM(c4 % 3346), SUM(c4 % 3347), SUM(c4 % 3348), SUM(c4 % 3349), + SUM(c4 % 3350), SUM(c4 % 3351), SUM(c4 % 3352), SUM(c4 % 3353), SUM(c4 % 3354), + SUM(c4 % 3355), SUM(c4 % 3356), SUM(c4 % 3357), SUM(c4 % 3358), SUM(c4 % 3359), + SUM(c4 % 3360), SUM(c4 % 3361), SUM(c4 % 3362), SUM(c4 % 3363), SUM(c4 % 3364), + SUM(c4 % 3365), SUM(c4 % 3366), SUM(c4 % 3367), SUM(c4 % 3368), SUM(c4 % 3369), + SUM(c4 % 3370), SUM(c4 % 3371), SUM(c4 % 3372), SUM(c4 % 3373), SUM(c4 % 3374), + SUM(c4 % 3375), SUM(c4 % 3376), SUM(c4 % 3377), SUM(c4 % 3378), SUM(c4 % 3379), + SUM(c4 % 3380), SUM(c4 % 3381), SUM(c4 % 3382), SUM(c4 % 3383), SUM(c4 % 3384), + SUM(c4 % 3385), SUM(c4 % 3386), SUM(c4 % 3387), SUM(c4 % 3388), SUM(c4 % 3389), + SUM(c4 % 3390), SUM(c4 % 3391), SUM(c4 % 3392), SUM(c4 % 3393), SUM(c4 % 3394), + SUM(c4 % 3395), SUM(c4 % 3396), SUM(c4 % 3397), SUM(c4 % 3398), SUM(c4 % 3399), + SUM(c4 % 3400), SUM(c4 % 3401), SUM(c4 % 3402), SUM(c4 % 3403), SUM(c4 % 3404), + SUM(c4 % 3405), SUM(c4 % 3406), SUM(c4 % 3407), SUM(c4 % 3408), SUM(c4 % 3409), + SUM(c4 % 3410), SUM(c4 % 3411), SUM(c4 % 3412), SUM(c4 % 3413), SUM(c4 % 3414), + SUM(c4 % 3415), SUM(c4 % 3416), SUM(c4 % 3417), SUM(c4 % 3418), SUM(c4 % 3419), + SUM(c4 % 3420), SUM(c4 % 3421), SUM(c4 % 3422), SUM(c4 % 3423), SUM(c4 % 3424), + SUM(c4 % 3425), SUM(c4 % 3426), SUM(c4 % 3427), SUM(c4 % 3428), SUM(c4 % 3429), + SUM(c4 % 3430), SUM(c4 % 3431), SUM(c4 % 3432), SUM(c4 % 3433), SUM(c4 % 3434), + SUM(c4 % 3435), SUM(c4 % 3436), SUM(c4 % 3437), SUM(c4 % 3438), SUM(c4 % 3439), + SUM(c4 % 3440), SUM(c4 % 3441), SUM(c4 % 3442), SUM(c4 % 3443), SUM(c4 % 3444), + SUM(c4 % 3445), SUM(c4 % 3446), SUM(c4 % 3447), SUM(c4 % 3448), SUM(c4 % 3449), + SUM(c4 % 3450), SUM(c4 % 3451), SUM(c4 % 3452), SUM(c4 % 3453), SUM(c4 % 3454), + SUM(c4 % 3455), SUM(c4 % 3456), SUM(c4 % 3457), SUM(c4 % 3458), SUM(c4 % 3459), + SUM(c4 % 3460), SUM(c4 % 3461), SUM(c4 % 3462), SUM(c4 % 3463), SUM(c4 % 3464), + SUM(c4 % 3465), SUM(c4 % 3466), SUM(c4 % 3467), SUM(c4 % 3468), SUM(c4 % 3469), + SUM(c4 % 3470), SUM(c4 % 3471), SUM(c4 % 3472), SUM(c4 % 3473), SUM(c4 % 3474), + SUM(c4 % 3475), SUM(c4 % 3476), SUM(c4 % 3477), SUM(c4 % 3478), SUM(c4 % 3479), + SUM(c4 % 3480), SUM(c4 % 3481), SUM(c4 % 3482), SUM(c4 % 3483), SUM(c4 % 3484), + SUM(c4 % 3485), SUM(c4 % 3486), SUM(c4 % 3487), SUM(c4 % 3488), SUM(c4 % 3489), + SUM(c4 % 3490), SUM(c4 % 3491), SUM(c4 % 3492), SUM(c4 % 3493), SUM(c4 % 3494), + SUM(c4 % 3495), SUM(c4 % 3496), SUM(c4 % 3497), SUM(c4 % 3498), SUM(c4 % 3499), + SUM(c4 % 3500), SUM(c4 % 3501), SUM(c4 % 3502), SUM(c4 % 3503), SUM(c4 % 3504), + SUM(c4 % 3505), SUM(c4 % 3506), SUM(c4 % 3507), SUM(c4 % 3508), SUM(c4 % 3509), + SUM(c4 % 3510), SUM(c4 % 3511), SUM(c4 % 3512), SUM(c4 % 3513), SUM(c4 % 3514), + SUM(c4 % 3515), SUM(c4 % 3516), SUM(c4 % 3517), SUM(c4 % 3518), SUM(c4 % 3519), + SUM(c4 % 3520), SUM(c4 % 3521), SUM(c4 % 3522), SUM(c4 % 3523), SUM(c4 % 3524), + SUM(c4 % 3525), SUM(c4 % 3526), SUM(c4 % 3527), SUM(c4 % 3528), SUM(c4 % 3529), + SUM(c4 % 3530), SUM(c4 % 3531), SUM(c4 % 3532), SUM(c4 % 3533), SUM(c4 % 3534), + SUM(c4 % 3535), SUM(c4 % 3536), SUM(c4 % 3537), SUM(c4 % 3538), SUM(c4 % 3539), + SUM(c4 % 3540), SUM(c4 % 3541), SUM(c4 % 3542), SUM(c4 % 3543), SUM(c4 % 3544), + SUM(c4 % 3545), SUM(c4 % 3546), SUM(c4 % 3547), SUM(c4 % 3548), SUM(c4 % 3549), + SUM(c4 % 3550), SUM(c4 % 3551), SUM(c4 % 3552), SUM(c4 % 3553), SUM(c4 % 3554), + SUM(c4 % 3555), SUM(c4 % 3556), SUM(c4 % 3557), SUM(c4 % 3558), SUM(c4 % 3559), + SUM(c4 % 3560), SUM(c4 % 3561), SUM(c4 % 3562), SUM(c4 % 3563), SUM(c4 % 3564), + SUM(c4 % 3565), SUM(c4 % 3566), SUM(c4 % 3567), SUM(c4 % 3568), SUM(c4 % 3569), + SUM(c4 % 3570), SUM(c4 % 3571), SUM(c4 % 3572), SUM(c4 % 3573), SUM(c4 % 3574), + SUM(c4 % 3575), SUM(c4 % 3576), SUM(c4 % 3577), SUM(c4 % 3578), SUM(c4 % 3579), + SUM(c4 % 3580), SUM(c4 % 3581), SUM(c4 % 3582), SUM(c4 % 3583), SUM(c4 % 3584), + SUM(c4 % 3585), SUM(c4 % 3586), SUM(c4 % 3587), SUM(c4 % 3588), SUM(c4 % 3589), + SUM(c4 % 3590), SUM(c4 % 3591), SUM(c4 % 3592), SUM(c4 % 3593), SUM(c4 % 3594), + SUM(c4 % 3595), SUM(c4 % 3596), SUM(c4 % 3597), SUM(c4 % 3598), SUM(c4 % 3599), + SUM(c4 % 3600), SUM(c4 % 3601), SUM(c4 % 3602), SUM(c4 % 3603), SUM(c4 % 3604), + SUM(c4 % 3605), SUM(c4 % 3606), SUM(c4 % 3607), SUM(c4 % 3608), SUM(c4 % 3609), + SUM(c4 % 3610), SUM(c4 % 3611), SUM(c4 % 3612), SUM(c4 % 3613), SUM(c4 % 3614), + SUM(c4 % 3615), SUM(c4 % 3616), SUM(c4 % 3617), SUM(c4 % 3618), SUM(c4 % 3619), + SUM(c4 % 3620), SUM(c4 % 3621), SUM(c4 % 3622), SUM(c4 % 3623), SUM(c4 % 3624), + SUM(c4 % 3625), SUM(c4 % 3626), SUM(c4 % 3627), SUM(c4 % 3628), SUM(c4 % 3629), + SUM(c4 % 3630), SUM(c4 % 3631), SUM(c4 % 3632), SUM(c4 % 3633), SUM(c4 % 3634), + SUM(c4 % 3635), SUM(c4 % 3636), SUM(c4 % 3637), SUM(c4 % 3638), SUM(c4 % 3639), + SUM(c4 % 3640), SUM(c4 % 3641), SUM(c4 % 3642), SUM(c4 % 3643), SUM(c4 % 3644), + SUM(c4 % 3645), SUM(c4 % 3646), SUM(c4 % 3647), SUM(c4 % 3648), SUM(c4 % 3649), + SUM(c4 % 3650), SUM(c4 % 3651), SUM(c4 % 3652), SUM(c4 % 3653), SUM(c4 % 3654), + SUM(c4 % 3655), SUM(c4 % 3656), SUM(c4 % 3657), SUM(c4 % 3658), SUM(c4 % 3659), + SUM(c4 % 3660), SUM(c4 % 3661), SUM(c4 % 3662), SUM(c4 % 3663), SUM(c4 % 3664), + SUM(c4 % 3665), SUM(c4 % 3666), SUM(c4 % 3667), SUM(c4 % 3668), SUM(c4 % 3669), + SUM(c4 % 3670), SUM(c4 % 3671), SUM(c4 % 3672), SUM(c4 % 3673), SUM(c4 % 3674), + SUM(c4 % 3675), SUM(c4 % 3676), SUM(c4 % 3677), SUM(c4 % 3678), SUM(c4 % 3679), + SUM(c4 % 3680), SUM(c4 % 3681), SUM(c4 % 3682), SUM(c4 % 3683), SUM(c4 % 3684), + SUM(c4 % 3685), SUM(c4 % 3686), SUM(c4 % 3687), SUM(c4 % 3688), SUM(c4 % 3689), + SUM(c4 % 3690), SUM(c4 % 3691), SUM(c4 % 3692), SUM(c4 % 3693), SUM(c4 % 3694), + SUM(c4 % 3695), SUM(c4 % 3696), SUM(c4 % 3697), SUM(c4 % 3698), SUM(c4 % 3699), + SUM(c4 % 3700), SUM(c4 % 3701), SUM(c4 % 3702), SUM(c4 % 3703), SUM(c4 % 3704), + SUM(c4 % 3705), SUM(c4 % 3706), SUM(c4 % 3707), SUM(c4 % 3708), SUM(c4 % 3709), + SUM(c4 % 3710), SUM(c4 % 3711), SUM(c4 % 3712), SUM(c4 % 3713), SUM(c4 % 3714), + SUM(c4 % 3715), SUM(c4 % 3716), SUM(c4 % 3717), SUM(c4 % 3718), SUM(c4 % 3719), + SUM(c4 % 3720), SUM(c4 % 3721), SUM(c4 % 3722), SUM(c4 % 3723), SUM(c4 % 3724), + SUM(c4 % 3725), SUM(c4 % 3726), SUM(c4 % 3727), SUM(c4 % 3728), SUM(c4 % 3729), + SUM(c4 % 3730), SUM(c4 % 3731), SUM(c4 % 3732), SUM(c4 % 3733), SUM(c4 % 3734), + SUM(c4 % 3735), SUM(c4 % 3736), SUM(c4 % 3737), SUM(c4 % 3738), SUM(c4 % 3739), + SUM(c4 % 3740), SUM(c4 % 3741), SUM(c4 % 3742), SUM(c4 % 3743), SUM(c4 % 3744), + SUM(c4 % 3745), SUM(c4 % 3746), SUM(c4 % 3747), SUM(c4 % 3748), SUM(c4 % 3749), + SUM(c4 % 3750), SUM(c4 % 3751), SUM(c4 % 3752), SUM(c4 % 3753), SUM(c4 % 3754), + SUM(c4 % 3755), SUM(c4 % 3756), SUM(c4 % 3757), SUM(c4 % 3758), SUM(c4 % 3759), + SUM(c4 % 3760), SUM(c4 % 3761), SUM(c4 % 3762), SUM(c4 % 3763), SUM(c4 % 3764), + SUM(c4 % 3765), SUM(c4 % 3766), SUM(c4 % 3767), SUM(c4 % 3768), SUM(c4 % 3769), + SUM(c4 % 3770), SUM(c4 % 3771), SUM(c4 % 3772), SUM(c4 % 3773), SUM(c4 % 3774), + SUM(c4 % 3775), SUM(c4 % 3776), SUM(c4 % 3777), SUM(c4 % 3778), SUM(c4 % 3779), + SUM(c4 % 3780), SUM(c4 % 3781), SUM(c4 % 3782), SUM(c4 % 3783), SUM(c4 % 3784), + SUM(c4 % 3785), SUM(c4 % 3786), SUM(c4 % 3787), SUM(c4 % 3788), SUM(c4 % 3789), + SUM(c4 % 3790), SUM(c4 % 3791), SUM(c4 % 3792), SUM(c4 % 3793), SUM(c4 % 3794), + SUM(c4 % 3795), SUM(c4 % 3796), SUM(c4 % 3797), SUM(c4 % 3798), SUM(c4 % 3799), + SUM(c4 % 3800), SUM(c4 % 3801), SUM(c4 % 3802), SUM(c4 % 3803), SUM(c4 % 3804), + SUM(c4 % 3805), SUM(c4 % 3806), SUM(c4 % 3807), SUM(c4 % 3808), SUM(c4 % 3809), + SUM(c4 % 3810), SUM(c4 % 3811), SUM(c4 % 3812), SUM(c4 % 3813), SUM(c4 % 3814), + SUM(c4 % 3815), SUM(c4 % 3816), SUM(c4 % 3817), SUM(c4 % 3818), SUM(c4 % 3819), + SUM(c4 % 3820), SUM(c4 % 3821), SUM(c4 % 3822), SUM(c4 % 3823), SUM(c4 % 3824), + SUM(c4 % 3825), SUM(c4 % 3826), SUM(c4 % 3827), SUM(c4 % 3828), SUM(c4 % 3829), + SUM(c4 % 3830), SUM(c4 % 3831), SUM(c4 % 3832), SUM(c4 % 3833), SUM(c4 % 3834), + SUM(c4 % 3835), SUM(c4 % 3836), SUM(c4 % 3837), SUM(c4 % 3838), SUM(c4 % 3839), + SUM(c4 % 3840), SUM(c4 % 3841), SUM(c4 % 3842), SUM(c4 % 3843), SUM(c4 % 3844), + SUM(c4 % 3845), SUM(c4 % 3846), SUM(c4 % 3847), SUM(c4 % 3848), SUM(c4 % 3849), + SUM(c4 % 3850), SUM(c4 % 3851), SUM(c4 % 3852), SUM(c4 % 3853), SUM(c4 % 3854), + SUM(c4 % 3855), SUM(c4 % 3856), SUM(c4 % 3857), SUM(c4 % 3858), SUM(c4 % 3859), + SUM(c4 % 3860), SUM(c4 % 3861), SUM(c4 % 3862), SUM(c4 % 3863), SUM(c4 % 3864), + SUM(c4 % 3865), SUM(c4 % 3866), SUM(c4 % 3867), SUM(c4 % 3868), SUM(c4 % 3869), + SUM(c4 % 3870), SUM(c4 % 3871), SUM(c4 % 3872), SUM(c4 % 3873), SUM(c4 % 3874), + SUM(c4 % 3875), SUM(c4 % 3876), SUM(c4 % 3877), SUM(c4 % 3878), SUM(c4 % 3879), + SUM(c4 % 3880), SUM(c4 % 3881), SUM(c4 % 3882), SUM(c4 % 3883), SUM(c4 % 3884), + SUM(c4 % 3885), SUM(c4 % 3886), SUM(c4 % 3887), SUM(c4 % 3888), SUM(c4 % 3889), + SUM(c4 % 3890), SUM(c4 % 3891), SUM(c4 % 3892), SUM(c4 % 3893), SUM(c4 % 3894), + SUM(c4 % 3895), SUM(c4 % 3896), SUM(c4 % 3897), SUM(c4 % 3898), SUM(c4 % 3899), + SUM(c4 % 3900), SUM(c4 % 3901), SUM(c4 % 3902), SUM(c4 % 3903), SUM(c4 % 3904), + SUM(c4 % 3905), SUM(c4 % 3906), SUM(c4 % 3907), SUM(c4 % 3908), SUM(c4 % 3909), + SUM(c4 % 3910), SUM(c4 % 3911), SUM(c4 % 3912), SUM(c4 % 3913), SUM(c4 % 3914), + SUM(c4 % 3915), SUM(c4 % 3916), SUM(c4 % 3917), SUM(c4 % 3918), SUM(c4 % 3919), + SUM(c4 % 3920), SUM(c4 % 3921), SUM(c4 % 3922), SUM(c4 % 3923), SUM(c4 % 3924), + SUM(c4 % 3925), SUM(c4 % 3926), SUM(c4 % 3927), SUM(c4 % 3928), SUM(c4 % 3929), + SUM(c4 % 3930), SUM(c4 % 3931), SUM(c4 % 3932), SUM(c4 % 3933), SUM(c4 % 3934), + SUM(c4 % 3935), SUM(c4 % 3936), SUM(c4 % 3937), SUM(c4 % 3938), SUM(c4 % 3939), + SUM(c4 % 3940), SUM(c4 % 3941), SUM(c4 % 3942), SUM(c4 % 3943), SUM(c4 % 3944), + SUM(c4 % 3945), SUM(c4 % 3946), SUM(c4 % 3947), SUM(c4 % 3948), SUM(c4 % 3949), + SUM(c4 % 3950), SUM(c4 % 3951), SUM(c4 % 3952), SUM(c4 % 3953), SUM(c4 % 3954), + SUM(c4 % 3955), SUM(c4 % 3956), SUM(c4 % 3957), SUM(c4 % 3958), SUM(c4 % 3959), + SUM(c4 % 3960), SUM(c4 % 3961), SUM(c4 % 3962), SUM(c4 % 3963), SUM(c4 % 3964), + SUM(c4 % 3965), SUM(c4 % 3966), SUM(c4 % 3967), SUM(c4 % 3968), SUM(c4 % 3969), + SUM(c4 % 3970), SUM(c4 % 3971), SUM(c4 % 3972), SUM(c4 % 3973), SUM(c4 % 3974), + SUM(c4 % 3975), SUM(c4 % 3976), SUM(c4 % 3977), SUM(c4 % 3978), SUM(c4 % 3979), + SUM(c4 % 3980), SUM(c4 % 3981), SUM(c4 % 3982), SUM(c4 % 3983), SUM(c4 % 3984), + SUM(c4 % 3985), SUM(c4 % 3986), SUM(c4 % 3987), SUM(c4 % 3988), SUM(c4 % 3989), + SUM(c4 % 3990), SUM(c4 % 3991), SUM(c4 % 3992), SUM(c4 % 3993), SUM(c4 % 3994), + SUM(c4 % 3995), SUM(c4 % 3996), SUM(c4 % 3997), SUM(c4 % 3998), SUM(c4 % 3999), + SUM(c4 % 4000), SUM(c4 % 4001), SUM(c4 % 4002), SUM(c4 % 4003), SUM(c4 % 4004), + SUM(c4 % 4005), SUM(c4 % 4006), SUM(c4 % 4007), SUM(c4 % 4008), SUM(c4 % 4009), + SUM(c4 % 4010), SUM(c4 % 4011), SUM(c4 % 4012), SUM(c4 % 4013), SUM(c4 % 4014), + SUM(c4 % 4015), SUM(c4 % 4016), SUM(c4 % 4017), SUM(c4 % 4018), SUM(c4 % 4019), + SUM(c4 % 4020), SUM(c4 % 4021), SUM(c4 % 4022), SUM(c4 % 4023), SUM(c4 % 4024), + SUM(c4 % 4025), SUM(c4 % 4026), SUM(c4 % 4027), SUM(c4 % 4028), SUM(c4 % 4029), + SUM(c4 % 4030), SUM(c4 % 4031), SUM(c4 % 4032), SUM(c4 % 4033), SUM(c4 % 4034), + SUM(c4 % 4035), SUM(c4 % 4036), SUM(c4 % 4037), SUM(c4 % 4038), SUM(c4 % 4039), + SUM(c4 % 4040), SUM(c4 % 4041), SUM(c4 % 4042), SUM(c4 % 4043), SUM(c4 % 4044), + SUM(c4 % 4045), SUM(c4 % 4046), SUM(c4 % 4047), SUM(c4 % 4048), SUM(c4 % 4049), + SUM(c4 % 4050), SUM(c4 % 4051), SUM(c4 % 4052), SUM(c4 % 4053), SUM(c4 % 4054), + SUM(c4 % 4055), SUM(c4 % 4056), SUM(c4 % 4057), SUM(c4 % 4058), SUM(c4 % 4059), + SUM(c4 % 4060), SUM(c4 % 4061), SUM(c4 % 4062), SUM(c4 % 4063), SUM(c4 % 4064), + SUM(c4 % 4065), SUM(c4 % 4066), SUM(c4 % 4067), SUM(c4 % 4068), SUM(c4 % 4069), + SUM(c4 % 4070), SUM(c4 % 4071), SUM(c4 % 4072), SUM(c4 % 4073), SUM(c4 % 4074), + SUM(c4 % 4075), SUM(c4 % 4076), SUM(c4 % 4077), SUM(c4 % 4078), SUM(c4 % 4079), + SUM(c4 % 4080), SUM(c4 % 4081), SUM(c4 % 4082), SUM(c4 % 4083), SUM(c4 % 4084), + SUM(c4 % 4085), SUM(c4 % 4086), SUM(c4 % 4087), SUM(c4 % 4088), SUM(c4 % 4089), + SUM(c4 % 4090), SUM(c4 % 4091), SUM(c4 % 4092), SUM(c4 % 4093), SUM(c4 % 4094), + SUM(c4 % 4095), SUM(c4 % 4096), SUM(c4 % 4097), SUM(c4 % 4098), SUM(c4 % 4099), + SUM(c4 % 4100), SUM(c4 % 4101), SUM(c4 % 4102), SUM(c4 % 4103), SUM(c4 % 4104), + SUM(c4 % 4105), SUM(c4 % 4106), SUM(c4 % 4107), SUM(c4 % 4108), SUM(c4 % 4109), + SUM(c4 % 4110), SUM(c4 % 4111), SUM(c4 % 4112), SUM(c4 % 4113), SUM(c4 % 4114), + SUM(c4 % 4115), SUM(c4 % 4116), SUM(c4 % 4117), SUM(c4 % 4118), SUM(c4 % 4119), + SUM(c4 % 4120), SUM(c4 % 4121), SUM(c4 % 4122), SUM(c4 % 4123), SUM(c4 % 4124), + SUM(c4 % 4125), SUM(c4 % 4126), SUM(c4 % 4127), SUM(c4 % 4128), SUM(c4 % 4129), + SUM(c4 % 4130), SUM(c4 % 4131), SUM(c4 % 4132), SUM(c4 % 4133), SUM(c4 % 4134), + SUM(c4 % 4135), SUM(c4 % 4136), SUM(c4 % 4137), SUM(c4 % 4138), SUM(c4 % 4139), + SUM(c4 % 4140), SUM(c4 % 4141), SUM(c4 % 4142), SUM(c4 % 4143), SUM(c4 % 4144), + SUM(c4 % 4145), SUM(c4 % 4146), SUM(c4 % 4147), SUM(c4 % 4148), SUM(c4 % 4149), + SUM(c4 % 4150), SUM(c4 % 4151), SUM(c4 % 4152), SUM(c4 % 4153), SUM(c4 % 4154), + SUM(c4 % 4155), SUM(c4 % 4156), SUM(c4 % 4157), SUM(c4 % 4158), SUM(c4 % 4159), + SUM(c4 % 4160), SUM(c4 % 4161), SUM(c4 % 4162), SUM(c4 % 4163), SUM(c4 % 4164), + SUM(c4 % 4165), SUM(c4 % 4166), SUM(c4 % 4167), SUM(c4 % 4168), SUM(c4 % 4169), + SUM(c4 % 4170), SUM(c4 % 4171), SUM(c4 % 4172), SUM(c4 % 4173), SUM(c4 % 4174), + SUM(c4 % 4175), SUM(c4 % 4176), SUM(c4 % 4177), SUM(c4 % 4178), SUM(c4 % 4179), + SUM(c4 % 4180), SUM(c4 % 4181), SUM(c4 % 4182), SUM(c4 % 4183), SUM(c4 % 4184), + SUM(c4 % 4185), SUM(c4 % 4186), SUM(c4 % 4187), SUM(c4 % 4188), SUM(c4 % 4189), + SUM(c4 % 4190), SUM(c4 % 4191), SUM(c4 % 4192), SUM(c4 % 4193), SUM(c4 % 4194), + SUM(c4 % 4195), SUM(c4 % 4196), SUM(c4 % 4197), SUM(c4 % 4198), SUM(c4 % 4199), + SUM(c4 % 4200), SUM(c4 % 4201), SUM(c4 % 4202), SUM(c4 % 4203), SUM(c4 % 4204), + SUM(c4 % 4205), SUM(c4 % 4206), SUM(c4 % 4207), SUM(c4 % 4208), SUM(c4 % 4209), + SUM(c4 % 4210), SUM(c4 % 4211), SUM(c4 % 4212), SUM(c4 % 4213), SUM(c4 % 4214), + SUM(c4 % 4215), SUM(c4 % 4216), SUM(c4 % 4217), SUM(c4 % 4218), SUM(c4 % 4219), + SUM(c4 % 4220), SUM(c4 % 4221), SUM(c4 % 4222), SUM(c4 % 4223), SUM(c4 % 4224), + SUM(c4 % 4225), SUM(c4 % 4226), SUM(c4 % 4227), SUM(c4 % 4228), SUM(c4 % 4229), + SUM(c4 % 4230), SUM(c4 % 4231), SUM(c4 % 4232), SUM(c4 % 4233), SUM(c4 % 4234), + SUM(c4 % 4235), SUM(c4 % 4236), SUM(c4 % 4237), SUM(c4 % 4238), SUM(c4 % 4239), + SUM(c4 % 4240), SUM(c4 % 4241), SUM(c4 % 4242), SUM(c4 % 4243), SUM(c4 % 4244), + SUM(c4 % 4245), SUM(c4 % 4246), SUM(c4 % 4247), SUM(c4 % 4248), SUM(c4 % 4249), + SUM(c4 % 4250), SUM(c4 % 4251), SUM(c4 % 4252), SUM(c4 % 4253), SUM(c4 % 4254), + SUM(c4 % 4255), SUM(c4 % 4256), SUM(c4 % 4257), SUM(c4 % 4258), SUM(c4 % 4259), + SUM(c4 % 4260), SUM(c4 % 4261), SUM(c4 % 4262), SUM(c4 % 4263), SUM(c4 % 4264), + SUM(c4 % 4265), SUM(c4 % 4266), SUM(c4 % 4267), SUM(c4 % 4268), SUM(c4 % 4269), + SUM(c4 % 4270), SUM(c4 % 4271), SUM(c4 % 4272), SUM(c4 % 4273), SUM(c4 % 4274), + SUM(c4 % 4275), SUM(c4 % 4276), SUM(c4 % 4277), SUM(c4 % 4278), SUM(c4 % 4279), + SUM(c4 % 4280), SUM(c4 % 4281), SUM(c4 % 4282), SUM(c4 % 4283), SUM(c4 % 4284), + SUM(c4 % 4285), SUM(c4 % 4286), SUM(c4 % 4287), SUM(c4 % 4288), SUM(c4 % 4289), + SUM(c4 % 4290), SUM(c4 % 4291), SUM(c4 % 4292), SUM(c4 % 4293), SUM(c4 % 4294), + SUM(c4 % 4295), SUM(c4 % 4296), SUM(c4 % 4297), SUM(c4 % 4298), SUM(c4 % 4299), + SUM(c4 % 4300), SUM(c4 % 4301), SUM(c4 % 4302), SUM(c4 % 4303), SUM(c4 % 4304), + SUM(c4 % 4305), SUM(c4 % 4306), SUM(c4 % 4307), SUM(c4 % 4308), SUM(c4 % 4309), + SUM(c4 % 4310), SUM(c4 % 4311), SUM(c4 % 4312), SUM(c4 % 4313), SUM(c4 % 4314), + SUM(c4 % 4315), SUM(c4 % 4316), SUM(c4 % 4317), SUM(c4 % 4318), SUM(c4 % 4319), + SUM(c4 % 4320), SUM(c4 % 4321), SUM(c4 % 4322), SUM(c4 % 4323), SUM(c4 % 4324), + SUM(c4 % 4325), SUM(c4 % 4326), SUM(c4 % 4327), SUM(c4 % 4328), SUM(c4 % 4329), + SUM(c4 % 4330), SUM(c4 % 4331), SUM(c4 % 4332), SUM(c4 % 4333), SUM(c4 % 4334), + SUM(c4 % 4335), SUM(c4 % 4336), SUM(c4 % 4337), SUM(c4 % 4338), SUM(c4 % 4339), + SUM(c4 % 4340), SUM(c4 % 4341), SUM(c4 % 4342), SUM(c4 % 4343), SUM(c4 % 4344), + SUM(c4 % 4345), SUM(c4 % 4346), SUM(c4 % 4347), SUM(c4 % 4348), SUM(c4 % 4349), + SUM(c4 % 4350), SUM(c4 % 4351), SUM(c4 % 4352), SUM(c4 % 4353), SUM(c4 % 4354), + SUM(c4 % 4355), SUM(c4 % 4356), SUM(c4 % 4357), SUM(c4 % 4358), SUM(c4 % 4359), + SUM(c4 % 4360), SUM(c4 % 4361), SUM(c4 % 4362), SUM(c4 % 4363), SUM(c4 % 4364), + SUM(c4 % 4365), SUM(c4 % 4366), SUM(c4 % 4367), SUM(c4 % 4368), SUM(c4 % 4369), + SUM(c4 % 4370), SUM(c4 % 4371), SUM(c4 % 4372), SUM(c4 % 4373), SUM(c4 % 4374), + SUM(c4 % 4375), SUM(c4 % 4376), SUM(c4 % 4377), SUM(c4 % 4378), SUM(c4 % 4379), + SUM(c4 % 4380), SUM(c4 % 4381), SUM(c4 % 4382), SUM(c4 % 4383), SUM(c4 % 4384), + SUM(c4 % 4385), SUM(c4 % 4386), SUM(c4 % 4387), SUM(c4 % 4388), SUM(c4 % 4389), + SUM(c4 % 4390), SUM(c4 % 4391), SUM(c4 % 4392), SUM(c4 % 4393), SUM(c4 % 4394), + SUM(c4 % 4395), SUM(c4 % 4396), SUM(c4 % 4397), SUM(c4 % 4398), SUM(c4 % 4399), + SUM(c4 % 4400), SUM(c4 % 4401), SUM(c4 % 4402), SUM(c4 % 4403), SUM(c4 % 4404), + SUM(c4 % 4405), SUM(c4 % 4406), SUM(c4 % 4407), SUM(c4 % 4408), SUM(c4 % 4409), + SUM(c4 % 4410), SUM(c4 % 4411), SUM(c4 % 4412), SUM(c4 % 4413), SUM(c4 % 4414), + SUM(c4 % 4415), SUM(c4 % 4416), SUM(c4 % 4417), SUM(c4 % 4418), SUM(c4 % 4419), + SUM(c4 % 4420), SUM(c4 % 4421), SUM(c4 % 4422), SUM(c4 % 4423), SUM(c4 % 4424), + SUM(c4 % 4425), SUM(c4 % 4426), SUM(c4 % 4427), SUM(c4 % 4428), SUM(c4 % 4429), + SUM(c4 % 4430), SUM(c4 % 4431), SUM(c4 % 4432), SUM(c4 % 4433), SUM(c4 % 4434), + SUM(c4 % 4435), SUM(c4 % 4436), SUM(c4 % 4437), SUM(c4 % 4438), SUM(c4 % 4439), + SUM(c4 % 4440), SUM(c4 % 4441), SUM(c4 % 4442), SUM(c4 % 4443), SUM(c4 % 4444), + SUM(c4 % 4445), SUM(c4 % 4446), SUM(c4 % 4447), SUM(c4 % 4448), SUM(c4 % 4449), + SUM(c4 % 4450), SUM(c4 % 4451), SUM(c4 % 4452), SUM(c4 % 4453), SUM(c4 % 4454), + SUM(c4 % 4455), SUM(c4 % 4456), SUM(c4 % 4457), SUM(c4 % 4458), SUM(c4 % 4459), + SUM(c4 % 4460), SUM(c4 % 4461), SUM(c4 % 4462), SUM(c4 % 4463), SUM(c4 % 4464), + SUM(c4 % 4465), SUM(c4 % 4466), SUM(c4 % 4467), SUM(c4 % 4468), SUM(c4 % 4469), + SUM(c4 % 4470), SUM(c4 % 4471), SUM(c4 % 4472), SUM(c4 % 4473), SUM(c4 % 4474), + SUM(c4 % 4475), SUM(c4 % 4476), SUM(c4 % 4477), SUM(c4 % 4478), SUM(c4 % 4479), + SUM(c4 % 4480), SUM(c4 % 4481), SUM(c4 % 4482), SUM(c4 % 4483), SUM(c4 % 4484), + SUM(c4 % 4485), SUM(c4 % 4486), SUM(c4 % 4487), SUM(c4 % 4488), SUM(c4 % 4489), + SUM(c4 % 4490), SUM(c4 % 4491), SUM(c4 % 4492), SUM(c4 % 4493), SUM(c4 % 4494), + SUM(c4 % 4495), SUM(c4 % 4496), SUM(c4 % 4497), SUM(c4 % 4498), SUM(c4 % 4499), + SUM(c4 % 4500), SUM(c4 % 4501), SUM(c4 % 4502), SUM(c4 % 4503), SUM(c4 % 4504), + SUM(c4 % 4505), SUM(c4 % 4506), SUM(c4 % 4507), SUM(c4 % 4508), SUM(c4 % 4509), + SUM(c4 % 4510), SUM(c4 % 4511), SUM(c4 % 4512), SUM(c4 % 4513), SUM(c4 % 4514), + SUM(c4 % 4515), SUM(c4 % 4516), SUM(c4 % 4517), SUM(c4 % 4518), SUM(c4 % 4519), + SUM(c4 % 4520), SUM(c4 % 4521), SUM(c4 % 4522), SUM(c4 % 4523), SUM(c4 % 4524), + SUM(c4 % 4525), SUM(c4 % 4526), SUM(c4 % 4527), SUM(c4 % 4528), SUM(c4 % 4529), + SUM(c4 % 4530), SUM(c4 % 4531), SUM(c4 % 4532), SUM(c4 % 4533), SUM(c4 % 4534), + SUM(c4 % 4535), SUM(c4 % 4536), SUM(c4 % 4537), SUM(c4 % 4538), SUM(c4 % 4539), + SUM(c4 % 4540), SUM(c4 % 4541), SUM(c4 % 4542), SUM(c4 % 4543), SUM(c4 % 4544), + SUM(c4 % 4545), SUM(c4 % 4546), SUM(c4 % 4547), SUM(c4 % 4548), SUM(c4 % 4549), + SUM(c4 % 4550), SUM(c4 % 4551), SUM(c4 % 4552), SUM(c4 % 4553), SUM(c4 % 4554), + SUM(c4 % 4555), SUM(c4 % 4556), SUM(c4 % 4557), SUM(c4 % 4558), SUM(c4 % 4559), + SUM(c4 % 4560), SUM(c4 % 4561), SUM(c4 % 4562), SUM(c4 % 4563), SUM(c4 % 4564), + SUM(c4 % 4565), SUM(c4 % 4566), SUM(c4 % 4567), SUM(c4 % 4568), SUM(c4 % 4569), + SUM(c4 % 4570), SUM(c4 % 4571), SUM(c4 % 4572), SUM(c4 % 4573), SUM(c4 % 4574), + SUM(c4 % 4575), SUM(c4 % 4576), SUM(c4 % 4577), SUM(c4 % 4578), SUM(c4 % 4579), + SUM(c4 % 4580), SUM(c4 % 4581), SUM(c4 % 4582), SUM(c4 % 4583), SUM(c4 % 4584), + SUM(c4 % 4585), SUM(c4 % 4586), SUM(c4 % 4587), SUM(c4 % 4588), SUM(c4 % 4589), + SUM(c4 % 4590), SUM(c4 % 4591), SUM(c4 % 4592), SUM(c4 % 4593), SUM(c4 % 4594), + SUM(c4 % 4595), SUM(c4 % 4596), SUM(c4 % 4597), SUM(c4 % 4598), SUM(c4 % 4599), + SUM(c4 % 4600), SUM(c4 % 4601), SUM(c4 % 4602), SUM(c4 % 4603), SUM(c4 % 4604), + SUM(c4 % 4605), SUM(c4 % 4606), SUM(c4 % 4607), SUM(c4 % 4608), SUM(c4 % 4609), + SUM(c4 % 4610), SUM(c4 % 4611), SUM(c4 % 4612), SUM(c4 % 4613), SUM(c4 % 4614), + SUM(c4 % 4615), SUM(c4 % 4616), SUM(c4 % 4617), SUM(c4 % 4618), SUM(c4 % 4619), + SUM(c4 % 4620), SUM(c4 % 4621), SUM(c4 % 4622), SUM(c4 % 4623), SUM(c4 % 4624), + SUM(c4 % 4625), SUM(c4 % 4626), SUM(c4 % 4627), SUM(c4 % 4628), SUM(c4 % 4629), + SUM(c4 % 4630), SUM(c4 % 4631), SUM(c4 % 4632), SUM(c4 % 4633), SUM(c4 % 4634), + SUM(c4 % 4635), SUM(c4 % 4636), SUM(c4 % 4637), SUM(c4 % 4638), SUM(c4 % 4639), + SUM(c4 % 4640), SUM(c4 % 4641), SUM(c4 % 4642), SUM(c4 % 4643), SUM(c4 % 4644), + SUM(c4 % 4645), SUM(c4 % 4646), SUM(c4 % 4647), SUM(c4 % 4648), SUM(c4 % 4649), + SUM(c4 % 4650), SUM(c4 % 4651), SUM(c4 % 4652), SUM(c4 % 4653), SUM(c4 % 4654), + SUM(c4 % 4655), SUM(c4 % 4656), SUM(c4 % 4657), SUM(c4 % 4658), SUM(c4 % 4659), + SUM(c4 % 4660), SUM(c4 % 4661), SUM(c4 % 4662), SUM(c4 % 4663), SUM(c4 % 4664), + SUM(c4 % 4665), SUM(c4 % 4666), SUM(c4 % 4667), SUM(c4 % 4668), SUM(c4 % 4669), + SUM(c4 % 4670), SUM(c4 % 4671), SUM(c4 % 4672), SUM(c4 % 4673), SUM(c4 % 4674), + SUM(c4 % 4675), SUM(c4 % 4676), SUM(c4 % 4677), SUM(c4 % 4678), SUM(c4 % 4679), + SUM(c4 % 4680), SUM(c4 % 4681), SUM(c4 % 4682), SUM(c4 % 4683), SUM(c4 % 4684), + SUM(c4 % 4685), SUM(c4 % 4686), SUM(c4 % 4687), SUM(c4 % 4688), SUM(c4 % 4689), + SUM(c4 % 4690), SUM(c4 % 4691), SUM(c4 % 4692), SUM(c4 % 4693), SUM(c4 % 4694), + SUM(c4 % 4695), SUM(c4 % 4696), SUM(c4 % 4697), SUM(c4 % 4698), SUM(c4 % 4699), + SUM(c4 % 4700), SUM(c4 % 4701), SUM(c4 % 4702), SUM(c4 % 4703), SUM(c4 % 4704), + SUM(c4 % 4705), SUM(c4 % 4706), SUM(c4 % 4707), SUM(c4 % 4708), SUM(c4 % 4709), + SUM(c4 % 4710), SUM(c4 % 4711), SUM(c4 % 4712), SUM(c4 % 4713), SUM(c4 % 4714), + SUM(c4 % 4715), SUM(c4 % 4716), SUM(c4 % 4717), SUM(c4 % 4718), SUM(c4 % 4719), + SUM(c4 % 4720), SUM(c4 % 4721), SUM(c4 % 4722), SUM(c4 % 4723), SUM(c4 % 4724), + SUM(c4 % 4725), SUM(c4 % 4726), SUM(c4 % 4727), SUM(c4 % 4728), SUM(c4 % 4729), + SUM(c4 % 4730), SUM(c4 % 4731), SUM(c4 % 4732), SUM(c4 % 4733), SUM(c4 % 4734), + SUM(c4 % 4735), SUM(c4 % 4736), SUM(c4 % 4737), SUM(c4 % 4738), SUM(c4 % 4739), + SUM(c4 % 4740), SUM(c4 % 4741), SUM(c4 % 4742), SUM(c4 % 4743), SUM(c4 % 4744), + SUM(c4 % 4745), SUM(c4 % 4746), SUM(c4 % 4747), SUM(c4 % 4748), SUM(c4 % 4749), + SUM(c4 % 4750), SUM(c4 % 4751), SUM(c4 % 4752), SUM(c4 % 4753), SUM(c4 % 4754), + SUM(c4 % 4755), SUM(c4 % 4756), SUM(c4 % 4757), SUM(c4 % 4758), SUM(c4 % 4759), + SUM(c4 % 4760), SUM(c4 % 4761), SUM(c4 % 4762), SUM(c4 % 4763), SUM(c4 % 4764), + SUM(c4 % 4765), SUM(c4 % 4766), SUM(c4 % 4767), SUM(c4 % 4768), SUM(c4 % 4769), + SUM(c4 % 4770), SUM(c4 % 4771), SUM(c4 % 4772), SUM(c4 % 4773), SUM(c4 % 4774), + SUM(c4 % 4775), SUM(c4 % 4776), SUM(c4 % 4777), SUM(c4 % 4778), SUM(c4 % 4779), + SUM(c4 % 4780), SUM(c4 % 4781), SUM(c4 % 4782), SUM(c4 % 4783), SUM(c4 % 4784), + SUM(c4 % 4785), SUM(c4 % 4786), SUM(c4 % 4787), SUM(c4 % 4788), SUM(c4 % 4789), + SUM(c4 % 4790), SUM(c4 % 4791), SUM(c4 % 4792), SUM(c4 % 4793), SUM(c4 % 4794), + SUM(c4 % 4795), SUM(c4 % 4796), SUM(c4 % 4797), SUM(c4 % 4798), SUM(c4 % 4799), + SUM(c4 % 4800), SUM(c4 % 4801), SUM(c4 % 4802), SUM(c4 % 4803), SUM(c4 % 4804), + SUM(c4 % 4805), SUM(c4 % 4806), SUM(c4 % 4807), SUM(c4 % 4808), SUM(c4 % 4809), + SUM(c4 % 4810), SUM(c4 % 4811), SUM(c4 % 4812), SUM(c4 % 4813), SUM(c4 % 4814), + SUM(c4 % 4815), SUM(c4 % 4816), SUM(c4 % 4817), SUM(c4 % 4818), SUM(c4 % 4819), + SUM(c4 % 4820), SUM(c4 % 4821), SUM(c4 % 4822), SUM(c4 % 4823), SUM(c4 % 4824), + SUM(c4 % 4825), SUM(c4 % 4826), SUM(c4 % 4827), SUM(c4 % 4828), SUM(c4 % 4829), + SUM(c4 % 4830), SUM(c4 % 4831), SUM(c4 % 4832), SUM(c4 % 4833), SUM(c4 % 4834), + SUM(c4 % 4835), SUM(c4 % 4836), SUM(c4 % 4837), SUM(c4 % 4838), SUM(c4 % 4839), + SUM(c4 % 4840), SUM(c4 % 4841), SUM(c4 % 4842), SUM(c4 % 4843), SUM(c4 % 4844), + SUM(c4 % 4845), SUM(c4 % 4846), SUM(c4 % 4847), SUM(c4 % 4848), SUM(c4 % 4849), + SUM(c4 % 4850), SUM(c4 % 4851), SUM(c4 % 4852), SUM(c4 % 4853), SUM(c4 % 4854), + SUM(c4 % 4855), SUM(c4 % 4856), SUM(c4 % 4857), SUM(c4 % 4858), SUM(c4 % 4859), + SUM(c4 % 4860), SUM(c4 % 4861), SUM(c4 % 4862), SUM(c4 % 4863), SUM(c4 % 4864), + SUM(c4 % 4865), SUM(c4 % 4866), SUM(c4 % 4867), SUM(c4 % 4868), SUM(c4 % 4869), + SUM(c4 % 4870), SUM(c4 % 4871), SUM(c4 % 4872), SUM(c4 % 4873), SUM(c4 % 4874), + SUM(c4 % 4875), SUM(c4 % 4876), SUM(c4 % 4877), SUM(c4 % 4878), SUM(c4 % 4879), + SUM(c4 % 4880), SUM(c4 % 4881), SUM(c4 % 4882), SUM(c4 % 4883), SUM(c4 % 4884), + SUM(c4 % 4885), SUM(c4 % 4886), SUM(c4 % 4887), SUM(c4 % 4888), SUM(c4 % 4889), + SUM(c4 % 4890), SUM(c4 % 4891), SUM(c4 % 4892), SUM(c4 % 4893), SUM(c4 % 4894), + SUM(c4 % 4895), SUM(c4 % 4896), SUM(c4 % 4897), SUM(c4 % 4898), SUM(c4 % 4899), + SUM(c4 % 4900), SUM(c4 % 4901), SUM(c4 % 4902), SUM(c4 % 4903), SUM(c4 % 4904), + SUM(c4 % 4905), SUM(c4 % 4906), SUM(c4 % 4907), SUM(c4 % 4908), SUM(c4 % 4909), + SUM(c4 % 4910), SUM(c4 % 4911), SUM(c4 % 4912), SUM(c4 % 4913), SUM(c4 % 4914), + SUM(c4 % 4915), SUM(c4 % 4916), SUM(c4 % 4917), SUM(c4 % 4918), SUM(c4 % 4919), + SUM(c4 % 4920), SUM(c4 % 4921), SUM(c4 % 4922), SUM(c4 % 4923), SUM(c4 % 4924), + SUM(c4 % 4925), SUM(c4 % 4926), SUM(c4 % 4927), SUM(c4 % 4928), SUM(c4 % 4929), + SUM(c4 % 4930), SUM(c4 % 4931), SUM(c4 % 4932), SUM(c4 % 4933), SUM(c4 % 4934), + SUM(c4 % 4935), SUM(c4 % 4936), SUM(c4 % 4937), SUM(c4 % 4938), SUM(c4 % 4939), + SUM(c4 % 4940), SUM(c4 % 4941), SUM(c4 % 4942), SUM(c4 % 4943), SUM(c4 % 4944), + SUM(c4 % 4945), SUM(c4 % 4946), SUM(c4 % 4947), SUM(c4 % 4948), SUM(c4 % 4949), + SUM(c4 % 4950), SUM(c4 % 4951), SUM(c4 % 4952), SUM(c4 % 4953), SUM(c4 % 4954), + SUM(c4 % 4955), SUM(c4 % 4956), SUM(c4 % 4957), SUM(c4 % 4958), SUM(c4 % 4959), + SUM(c4 % 4960), SUM(c4 % 4961), SUM(c4 % 4962), SUM(c4 % 4963), SUM(c4 % 4964), + SUM(c4 % 4965), SUM(c4 % 4966), SUM(c4 % 4967), SUM(c4 % 4968), SUM(c4 % 4969), + SUM(c4 % 4970), SUM(c4 % 4971), SUM(c4 % 4972), SUM(c4 % 4973), SUM(c4 % 4974), + SUM(c4 % 4975), SUM(c4 % 4976), SUM(c4 % 4977), SUM(c4 % 4978), SUM(c4 % 4979), + SUM(c4 % 4980), SUM(c4 % 4981), SUM(c4 % 4982), SUM(c4 % 4983), SUM(c4 % 4984), + SUM(c4 % 4985), SUM(c4 % 4986), SUM(c4 % 4987), SUM(c4 % 4988), SUM(c4 % 4989), + SUM(c4 % 4990), SUM(c4 % 4991), SUM(c4 % 4992), SUM(c4 % 4993), SUM(c4 % 4994), + SUM(c4 % 4995), SUM(c4 % 4996), SUM(c4 % 4997), SUM(c4 % 4998), SUM(c4 % 4999), + SUM(c4 % 5000), SUM(c4 % 5001), SUM(c4 % 5002), SUM(c4 % 5003), SUM(c4 % 5004), + SUM(c4 % 5005), SUM(c4 % 5006), SUM(c4 % 5007), SUM(c4 % 5008), SUM(c4 % 5009), + SUM(c4 % 5010), SUM(c4 % 5011), SUM(c4 % 5012), SUM(c4 % 5013), SUM(c4 % 5014), + SUM(c4 % 5015), SUM(c4 % 5016), SUM(c4 % 5017), SUM(c4 % 5018), SUM(c4 % 5019), + SUM(c4 % 5020), SUM(c4 % 5021), SUM(c4 % 5022), SUM(c4 % 5023), SUM(c4 % 5024), + SUM(c4 % 5025), SUM(c4 % 5026), SUM(c4 % 5027), SUM(c4 % 5028), SUM(c4 % 5029), + SUM(c4 % 5030), SUM(c4 % 5031), SUM(c4 % 5032), SUM(c4 % 5033), SUM(c4 % 5034), + SUM(c4 % 5035), SUM(c4 % 5036), SUM(c4 % 5037), SUM(c4 % 5038), SUM(c4 % 5039), + SUM(c4 % 5040), SUM(c4 % 5041), SUM(c4 % 5042), SUM(c4 % 5043), SUM(c4 % 5044), + SUM(c4 % 5045), SUM(c4 % 5046), SUM(c4 % 5047), SUM(c4 % 5048), SUM(c4 % 5049), + SUM(c4 % 5050), SUM(c4 % 5051), SUM(c4 % 5052), SUM(c4 % 5053), SUM(c4 % 5054), + SUM(c4 % 5055), SUM(c4 % 5056), SUM(c4 % 5057), SUM(c4 % 5058), SUM(c4 % 5059), + SUM(c4 % 5060), SUM(c4 % 5061), SUM(c4 % 5062), SUM(c4 % 5063), SUM(c4 % 5064), + SUM(c4 % 5065), SUM(c4 % 5066), SUM(c4 % 5067), SUM(c4 % 5068), SUM(c4 % 5069), + SUM(c4 % 5070), SUM(c4 % 5071), SUM(c4 % 5072), SUM(c4 % 5073), SUM(c4 % 5074), + SUM(c4 % 5075), SUM(c4 % 5076), SUM(c4 % 5077), SUM(c4 % 5078), SUM(c4 % 5079), + SUM(c4 % 5080), SUM(c4 % 5081), SUM(c4 % 5082), SUM(c4 % 5083), SUM(c4 % 5084), + SUM(c4 % 5085), SUM(c4 % 5086), SUM(c4 % 5087), SUM(c4 % 5088), SUM(c4 % 5089), + SUM(c4 % 5090), SUM(c4 % 5091), SUM(c4 % 5092), SUM(c4 % 5093), SUM(c4 % 5094), + SUM(c4 % 5095), SUM(c4 % 5096), SUM(c4 % 5097), SUM(c4 % 5098), SUM(c4 % 5099), + SUM(c4 % 5100), SUM(c4 % 5101), SUM(c4 % 5102), SUM(c4 % 5103), SUM(c4 % 5104), + SUM(c4 % 5105), SUM(c4 % 5106), SUM(c4 % 5107), SUM(c4 % 5108), SUM(c4 % 5109), + SUM(c4 % 5110), SUM(c4 % 5111), SUM(c4 % 5112), SUM(c4 % 5113), SUM(c4 % 5114), + SUM(c4 % 5115), SUM(c4 % 5116), SUM(c4 % 5117), SUM(c4 % 5118), SUM(c4 % 5119), + SUM(c4 % 5120), SUM(c4 % 5121), SUM(c4 % 5122), SUM(c4 % 5123), SUM(c4 % 5124), + SUM(c4 % 5125), SUM(c4 % 5126), SUM(c4 % 5127), SUM(c4 % 5128), SUM(c4 % 5129), + SUM(c4 % 5130), SUM(c4 % 5131), SUM(c4 % 5132), SUM(c4 % 5133), SUM(c4 % 5134), + SUM(c4 % 5135), SUM(c4 % 5136), SUM(c4 % 5137), SUM(c4 % 5138), SUM(c4 % 5139), + SUM(c4 % 5140), SUM(c4 % 5141), SUM(c4 % 5142), SUM(c4 % 5143), SUM(c4 % 5144), + SUM(c4 % 5145), SUM(c4 % 5146), SUM(c4 % 5147), SUM(c4 % 5148), SUM(c4 % 5149), + SUM(c4 % 5150), SUM(c4 % 5151), SUM(c4 % 5152), SUM(c4 % 5153), SUM(c4 % 5154), + SUM(c4 % 5155), SUM(c4 % 5156), SUM(c4 % 5157), SUM(c4 % 5158), SUM(c4 % 5159), + SUM(c4 % 5160), SUM(c4 % 5161), SUM(c4 % 5162), SUM(c4 % 5163), SUM(c4 % 5164), + SUM(c4 % 5165), SUM(c4 % 5166), SUM(c4 % 5167), SUM(c4 % 5168), SUM(c4 % 5169), + SUM(c4 % 5170), SUM(c4 % 5171), SUM(c4 % 5172), SUM(c4 % 5173), SUM(c4 % 5174), + SUM(c4 % 5175), SUM(c4 % 5176), SUM(c4 % 5177), SUM(c4 % 5178), SUM(c4 % 5179), + SUM(c4 % 5180), SUM(c4 % 5181), SUM(c4 % 5182), SUM(c4 % 5183), SUM(c4 % 5184), + SUM(c4 % 5185), SUM(c4 % 5186), SUM(c4 % 5187), SUM(c4 % 5188), SUM(c4 % 5189), + SUM(c4 % 5190), SUM(c4 % 5191), SUM(c4 % 5192), SUM(c4 % 5193), SUM(c4 % 5194), + SUM(c4 % 5195), SUM(c4 % 5196), SUM(c4 % 5197), SUM(c4 % 5198), SUM(c4 % 5199), + SUM(c4 % 5200), SUM(c4 % 5201), SUM(c4 % 5202), SUM(c4 % 5203), SUM(c4 % 5204), + SUM(c4 % 5205), SUM(c4 % 5206), SUM(c4 % 5207), SUM(c4 % 5208), SUM(c4 % 5209), + SUM(c4 % 5210), SUM(c4 % 5211), SUM(c4 % 5212), SUM(c4 % 5213), SUM(c4 % 5214), + SUM(c4 % 5215), SUM(c4 % 5216), SUM(c4 % 5217), SUM(c4 % 5218), SUM(c4 % 5219), + SUM(c4 % 5220), SUM(c4 % 5221), SUM(c4 % 5222), SUM(c4 % 5223), SUM(c4 % 5224), + SUM(c4 % 5225), SUM(c4 % 5226), SUM(c4 % 5227), SUM(c4 % 5228), SUM(c4 % 5229), + SUM(c4 % 5230), SUM(c4 % 5231), SUM(c4 % 5232), SUM(c4 % 5233), SUM(c4 % 5234), + SUM(c4 % 5235), SUM(c4 % 5236), SUM(c4 % 5237), SUM(c4 % 5238), SUM(c4 % 5239), + SUM(c4 % 5240), SUM(c4 % 5241), SUM(c4 % 5242), SUM(c4 % 5243), SUM(c4 % 5244), + SUM(c4 % 5245), SUM(c4 % 5246), SUM(c4 % 5247), SUM(c4 % 5248), SUM(c4 % 5249), + SUM(c4 % 5250), SUM(c4 % 5251), SUM(c4 % 5252), SUM(c4 % 5253), SUM(c4 % 5254), + SUM(c4 % 5255), SUM(c4 % 5256), SUM(c4 % 5257), SUM(c4 % 5258), SUM(c4 % 5259), + SUM(c4 % 5260), SUM(c4 % 5261), SUM(c4 % 5262), SUM(c4 % 5263), SUM(c4 % 5264), + SUM(c4 % 5265), SUM(c4 % 5266), SUM(c4 % 5267), SUM(c4 % 5268), SUM(c4 % 5269), + SUM(c4 % 5270), SUM(c4 % 5271), SUM(c4 % 5272), SUM(c4 % 5273), SUM(c4 % 5274), + SUM(c4 % 5275), SUM(c4 % 5276), SUM(c4 % 5277), SUM(c4 % 5278), SUM(c4 % 5279), + SUM(c4 % 5280), SUM(c4 % 5281), SUM(c4 % 5282), SUM(c4 % 5283), SUM(c4 % 5284), + SUM(c4 % 5285), SUM(c4 % 5286), SUM(c4 % 5287), SUM(c4 % 5288), SUM(c4 % 5289), + SUM(c4 % 5290), SUM(c4 % 5291), SUM(c4 % 5292), SUM(c4 % 5293), SUM(c4 % 5294), + SUM(c4 % 5295), SUM(c4 % 5296), SUM(c4 % 5297), SUM(c4 % 5298), SUM(c4 % 5299), + SUM(c4 % 5300), SUM(c4 % 5301), SUM(c4 % 5302), SUM(c4 % 5303), SUM(c4 % 5304), + SUM(c4 % 5305), SUM(c4 % 5306), SUM(c4 % 5307), SUM(c4 % 5308), SUM(c4 % 5309), + SUM(c4 % 5310), SUM(c4 % 5311), SUM(c4 % 5312), SUM(c4 % 5313), SUM(c4 % 5314), + SUM(c4 % 5315), SUM(c4 % 5316), SUM(c4 % 5317), SUM(c4 % 5318), SUM(c4 % 5319), + SUM(c4 % 5320), SUM(c4 % 5321), SUM(c4 % 5322), SUM(c4 % 5323), SUM(c4 % 5324), + SUM(c4 % 5325), SUM(c4 % 5326), SUM(c4 % 5327), SUM(c4 % 5328), SUM(c4 % 5329), + SUM(c4 % 5330), SUM(c4 % 5331), SUM(c4 % 5332), SUM(c4 % 5333), SUM(c4 % 5334), + SUM(c4 % 5335), SUM(c4 % 5336), SUM(c4 % 5337), SUM(c4 % 5338), SUM(c4 % 5339), + SUM(c4 % 5340), SUM(c4 % 5341), SUM(c4 % 5342), SUM(c4 % 5343), SUM(c4 % 5344), + SUM(c4 % 5345), SUM(c4 % 5346), SUM(c4 % 5347), SUM(c4 % 5348), SUM(c4 % 5349), + SUM(c4 % 5350), SUM(c4 % 5351), SUM(c4 % 5352), SUM(c4 % 5353), SUM(c4 % 5354), + SUM(c4 % 5355), SUM(c4 % 5356), SUM(c4 % 5357), SUM(c4 % 5358), SUM(c4 % 5359), + SUM(c4 % 5360), SUM(c4 % 5361), SUM(c4 % 5362), SUM(c4 % 5363), SUM(c4 % 5364), + SUM(c4 % 5365), SUM(c4 % 5366), SUM(c4 % 5367), SUM(c4 % 5368), SUM(c4 % 5369), + SUM(c4 % 5370), SUM(c4 % 5371), SUM(c4 % 5372), SUM(c4 % 5373), SUM(c4 % 5374), + SUM(c4 % 5375), SUM(c4 % 5376), SUM(c4 % 5377), SUM(c4 % 5378), SUM(c4 % 5379), + SUM(c4 % 5380), SUM(c4 % 5381), SUM(c4 % 5382), SUM(c4 % 5383), SUM(c4 % 5384), + SUM(c4 % 5385), SUM(c4 % 5386), SUM(c4 % 5387), SUM(c4 % 5388), SUM(c4 % 5389), + SUM(c4 % 5390), SUM(c4 % 5391), SUM(c4 % 5392), SUM(c4 % 5393), SUM(c4 % 5394), + SUM(c4 % 5395), SUM(c4 % 5396), SUM(c4 % 5397), SUM(c4 % 5398), SUM(c4 % 5399), + SUM(c4 % 5400), SUM(c4 % 5401), SUM(c4 % 5402), SUM(c4 % 5403), SUM(c4 % 5404), + SUM(c4 % 5405), SUM(c4 % 5406), SUM(c4 % 5407), SUM(c4 % 5408), SUM(c4 % 5409), + SUM(c4 % 5410), SUM(c4 % 5411), SUM(c4 % 5412), SUM(c4 % 5413), SUM(c4 % 5414), + SUM(c4 % 5415), SUM(c4 % 5416), SUM(c4 % 5417), SUM(c4 % 5418), SUM(c4 % 5419), + SUM(c4 % 5420), SUM(c4 % 5421), SUM(c4 % 5422), SUM(c4 % 5423), SUM(c4 % 5424), + SUM(c4 % 5425), SUM(c4 % 5426), SUM(c4 % 5427), SUM(c4 % 5428), SUM(c4 % 5429), + SUM(c4 % 5430), SUM(c4 % 5431), SUM(c4 % 5432), SUM(c4 % 5433), SUM(c4 % 5434), + SUM(c4 % 5435), SUM(c4 % 5436), SUM(c4 % 5437), SUM(c4 % 5438), SUM(c4 % 5439), + SUM(c4 % 5440), SUM(c4 % 5441), SUM(c4 % 5442), SUM(c4 % 5443), SUM(c4 % 5444), + SUM(c4 % 5445), SUM(c4 % 5446), SUM(c4 % 5447), SUM(c4 % 5448), SUM(c4 % 5449), + SUM(c4 % 5450), SUM(c4 % 5451), SUM(c4 % 5452), SUM(c4 % 5453), SUM(c4 % 5454), + SUM(c4 % 5455), SUM(c4 % 5456), SUM(c4 % 5457), SUM(c4 % 5458), SUM(c4 % 5459), + SUM(c4 % 5460), SUM(c4 % 5461), SUM(c4 % 5462), SUM(c4 % 5463), SUM(c4 % 5464), + SUM(c4 % 5465), SUM(c4 % 5466), SUM(c4 % 5467), SUM(c4 % 5468), SUM(c4 % 5469), + SUM(c4 % 5470), SUM(c4 % 5471), SUM(c4 % 5472), SUM(c4 % 5473), SUM(c4 % 5474), + SUM(c4 % 5475), SUM(c4 % 5476), SUM(c4 % 5477), SUM(c4 % 5478), SUM(c4 % 5479), + SUM(c4 % 5480), SUM(c4 % 5481), SUM(c4 % 5482), SUM(c4 % 5483), SUM(c4 % 5484), + SUM(c4 % 5485), SUM(c4 % 5486), SUM(c4 % 5487), SUM(c4 % 5488), SUM(c4 % 5489), + SUM(c4 % 5490), SUM(c4 % 5491), SUM(c4 % 5492), SUM(c4 % 5493), SUM(c4 % 5494), + SUM(c4 % 5495), SUM(c4 % 5496), SUM(c4 % 5497), SUM(c4 % 5498), SUM(c4 % 5499), + SUM(c4 % 5500), SUM(c4 % 5501), SUM(c4 % 5502), SUM(c4 % 5503), SUM(c4 % 5504), + SUM(c4 % 5505), SUM(c4 % 5506), SUM(c4 % 5507), SUM(c4 % 5508), SUM(c4 % 5509), + SUM(c4 % 5510), SUM(c4 % 5511), SUM(c4 % 5512), SUM(c4 % 5513), SUM(c4 % 5514), + SUM(c4 % 5515), SUM(c4 % 5516), SUM(c4 % 5517), SUM(c4 % 5518), SUM(c4 % 5519), + SUM(c4 % 5520), SUM(c4 % 5521), SUM(c4 % 5522), SUM(c4 % 5523), SUM(c4 % 5524), + SUM(c4 % 5525), SUM(c4 % 5526), SUM(c4 % 5527), SUM(c4 % 5528), SUM(c4 % 5529), + SUM(c4 % 5530), SUM(c4 % 5531), SUM(c4 % 5532), SUM(c4 % 5533), SUM(c4 % 5534), + SUM(c4 % 5535), SUM(c4 % 5536), SUM(c4 % 5537), SUM(c4 % 5538), SUM(c4 % 5539), + SUM(c4 % 5540), SUM(c4 % 5541), SUM(c4 % 5542), SUM(c4 % 5543), SUM(c4 % 5544), + SUM(c4 % 5545), SUM(c4 % 5546), SUM(c4 % 5547), SUM(c4 % 5548), SUM(c4 % 5549), + SUM(c4 % 5550), SUM(c4 % 5551), SUM(c4 % 5552), SUM(c4 % 5553), SUM(c4 % 5554), + SUM(c4 % 5555), SUM(c4 % 5556), SUM(c4 % 5557), SUM(c4 % 5558), SUM(c4 % 5559), + SUM(c4 % 5560), SUM(c4 % 5561), SUM(c4 % 5562), SUM(c4 % 5563), SUM(c4 % 5564), + SUM(c4 % 5565), SUM(c4 % 5566), SUM(c4 % 5567), SUM(c4 % 5568), SUM(c4 % 5569), + SUM(c4 % 5570), SUM(c4 % 5571), SUM(c4 % 5572), SUM(c4 % 5573), SUM(c4 % 5574), + SUM(c4 % 5575), SUM(c4 % 5576), SUM(c4 % 5577), SUM(c4 % 5578), SUM(c4 % 5579), + SUM(c4 % 5580), SUM(c4 % 5581), SUM(c4 % 5582), SUM(c4 % 5583), SUM(c4 % 5584), + SUM(c4 % 5585), SUM(c4 % 5586), SUM(c4 % 5587), SUM(c4 % 5588), SUM(c4 % 5589), + SUM(c4 % 5590), SUM(c4 % 5591), SUM(c4 % 5592), SUM(c4 % 5593), SUM(c4 % 5594), + SUM(c4 % 5595), SUM(c4 % 5596), SUM(c4 % 5597), SUM(c4 % 5598), SUM(c4 % 5599), + SUM(c4 % 5600), SUM(c4 % 5601), SUM(c4 % 5602), SUM(c4 % 5603), SUM(c4 % 5604), + SUM(c4 % 5605), SUM(c4 % 5606), SUM(c4 % 5607), SUM(c4 % 5608), SUM(c4 % 5609), + SUM(c4 % 5610), SUM(c4 % 5611), SUM(c4 % 5612), SUM(c4 % 5613), SUM(c4 % 5614), + SUM(c4 % 5615), SUM(c4 % 5616), SUM(c4 % 5617), SUM(c4 % 5618), SUM(c4 % 5619), + SUM(c4 % 5620), SUM(c4 % 5621), SUM(c4 % 5622), SUM(c4 % 5623), SUM(c4 % 5624), + SUM(c4 % 5625), SUM(c4 % 5626), SUM(c4 % 5627), SUM(c4 % 5628), SUM(c4 % 5629), + SUM(c4 % 5630), SUM(c4 % 5631), SUM(c4 % 5632), SUM(c4 % 5633), SUM(c4 % 5634), + SUM(c4 % 5635), SUM(c4 % 5636), SUM(c4 % 5637), SUM(c4 % 5638), SUM(c4 % 5639), + SUM(c4 % 5640), SUM(c4 % 5641), SUM(c4 % 5642), SUM(c4 % 5643), SUM(c4 % 5644), + SUM(c4 % 5645), SUM(c4 % 5646), SUM(c4 % 5647), SUM(c4 % 5648), SUM(c4 % 5649), + SUM(c4 % 5650), SUM(c4 % 5651), SUM(c4 % 5652), SUM(c4 % 5653), SUM(c4 % 5654), + SUM(c4 % 5655), SUM(c4 % 5656), SUM(c4 % 5657), SUM(c4 % 5658), SUM(c4 % 5659), + SUM(c4 % 5660), SUM(c4 % 5661), SUM(c4 % 5662), SUM(c4 % 5663), SUM(c4 % 5664), + SUM(c4 % 5665), SUM(c4 % 5666), SUM(c4 % 5667), SUM(c4 % 5668), SUM(c4 % 5669), + SUM(c4 % 5670), SUM(c4 % 5671)], 1) +from mtup1 where c0 = 'foo' group by c0, c1 limit 10; + +reset gp_enable_multiphase_agg; + +-- MPP-29042 Multistage aggregation plans should have consistent targetlists in +-- case of same column aliases and grouping on them. +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a varchar, b character varying); +INSERT INTO t1 VALUES ('aaaaaaa', 'cccccccccc'); +INSERT INTO t1 VALUES ('aaaaaaa', 'ddddd'); +INSERT INTO t1 VALUES ('bbbbbbb', 'eeee'); +INSERT INTO t1 VALUES ('bbbbbbb', 'eeef'); +INSERT INTO t1 VALUES ('bbbbb', 'dfafa'); +SELECT substr(a, 1) as a FROM (SELECT ('-'||a)::varchar as a FROM (SELECT a FROM t1) t2) t3 GROUP BY a ORDER BY a; +SELECT array_agg(f ORDER BY f) FROM (SELECT b::text as f FROM t1 GROUP BY b ORDER BY b) q; + + +-- Check that ORDER BY NULLS FIRST/LAST in an aggregate is respected (these are +-- variants of similar query in PostgreSQL's aggregates test) +create temporary table aggordertest (a int4, b int4); +insert into aggordertest values (1,1), (2,2), (1,3), (3,4), (null,5), (2,null); + +select array_agg(a order by a nulls first) from aggordertest; +select array_agg(a order by a nulls last) from aggordertest; +select array_agg(a order by a desc nulls first) from aggordertest; +select array_agg(a order by a desc nulls last) from aggordertest; +select array_agg(a order by b nulls first) from aggordertest; +select array_agg(a order by b nulls last) from aggordertest; +select array_agg(a order by b desc nulls first) from aggordertest; +select array_agg(a order by b desc nulls last) from aggordertest; + +-- begin MPP-14125: if combine function is missing, do not choose hash agg. +-- Like in the 'attribute_table' and 'concat' test earlier in this file, a +-- Hash Agg is currently OK, since we lost the Hybrid Hash Agg spilling code +-- in the merge. +create temp table mpp14125 as select repeat('a', a) a, a % 10 b from generate_series(1, 100)a; +explain select string_agg(a, '') from mpp14125 group by b; +-- end MPP-14125 + +-- Test that integer AVG() aggregate is accurate with large values. We used to +-- use float8 to hold the running sums, which did not have enough precision +-- for this. +select avg('1000000000000000000'::int8) from generate_series(1, 100000); + +-- Test cases where the planner would like to distribute on a column, to implement +-- grouping or distinct, but can't because the datatype isn't GPDB-hashable. +-- These are all variants of the same issue; all of these used to miss the +-- check on whether the column is GPDB_hashble, producing an assertion failure. +create table int2vectortab (distkey int, t int2vector,t2 int2vector); +insert into int2vectortab values + (1, '1', '1'), + (2, '1 2', '1 2'), + (3, '1 2 3', '1 2 3'), + (22,'22', '1 2 3 4'), + (22,'1 2', '1 2 3 4 5'); + +select distinct t from int2vectortab group by distkey, t; +select t from int2vectortab union select t from int2vectortab; +select count(*) over (partition by t) from int2vectortab; +select count(distinct t) from int2vectortab; +select count(distinct t), count(distinct t2) from int2vectortab; + +-- +-- Testing aggregate above FULL JOIN +-- + +-- SETUP +CREATE TABLE pagg_tab1(x int, y int); +CREATE TABLE pagg_tab2(x int, y int); + +INSERT INTO pagg_tab1 SELECT i % 30, i % 20 FROM generate_series(0, 299, 2) i; +INSERT INTO pagg_tab2 SELECT i % 20, i % 30 FROM generate_series(0, 299, 3) i; + +ANALYZE pagg_tab1; +ANALYZE pagg_tab2; + +-- TEST +-- should have Redistribute Motion above the FULL JOIN +EXPLAIN (COSTS OFF) +SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x ORDER BY 1 NULLS LAST; +SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x ORDER BY 1 NULLS LAST; + + +EXPLAIN (COSTS OFF) +SELECT a.x, b.y, count(*) FROM pagg_tab1 a FULL JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x, b.y; +SELECT a.x, b.y, count(*) FROM pagg_tab1 a FULL JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x, b.y; + +-- +-- Test GROUP BY with a constant +-- +create temp table group_by_const (col1 int, col2 int); +insert into group_by_const select i from generate_series(1, 1000) i; +analyze group_by_const; + +explain (costs off) +select 1, sum(col1) from group_by_const group by 1; +select 1, sum(col1) from group_by_const group by 1; + +-- Same, but using an aggregate that doesn't have a combine function, so +-- that you get a one-phase aggregate plan. +explain (costs off) +select 1, median(col1) from group_by_const group by 1; +select 1, median(col1) from group_by_const group by 1; + +-- CLEANUP +set client_min_messages='warning'; +drop schema bfv_aggregate cascade; diff --git a/src/test/singlenode_regress/sql/bfv_catalog.sql b/src/test/singlenode_regress/sql/bfv_catalog.sql new file mode 100644 index 00000000000..deedf5ed6c5 --- /dev/null +++ b/src/test/singlenode_regress/sql/bfv_catalog.sql @@ -0,0 +1,738 @@ +create schema bfv_catalog; +set search_path=bfv_catalog; + +-- count number of certain operators in a given plan +-- start_ignore +create language plpython3u; +-- end_ignore + +create or replace function count_operator(query text, operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; + +-- +-- Testing queries with subqueries with nested scalar functions +-- + +create table q68t792_temp(u_vtgnr varchar(6), u_zj varchar(2), u_folio varchar(2)); +insert into q68t792_temp select x ||'1' , x || '', x || '' from generate_series(30,99) x; + +SELECT u_vtgnr, u_zj, u_folio +FROM q68t792_temp a +WHERE +u_zj = +(SELECT substr(max(case when cast(u_zj as integer) < 50 then '20' || u_zj else '19' || u_zj end),3,2) + FROM q68t792_temp b WHERE a.u_vtgnr = b.u_vtgnr) +AND u_folio = (SELECT max(u_folio) FROM q68t792_temp c WHERE a.u_vtgnr = c.u_vtgnr and a.u_zj = c.u_zj) +order by u_vtgnr, u_zj, u_folio; + +SELECT u_vtgnr, u_zj, u_folio +FROM q68t792_temp a +WHERE +u_zj = +(SELECT substr(max(case when cast(u_zj as integer) < 50 then '20' || u_zj else '19' || u_zj end),3,2) + FROM q68t792_temp b WHERE a.u_vtgnr <= b.u_vtgnr) +AND u_folio = (SELECT max(u_folio) FROM q68t792_temp c WHERE a.u_vtgnr <= c.u_vtgnr and a.u_zj <= c.u_zj) +order by u_vtgnr, u_zj, u_folio; + +-- Fix bug in Expression to DXL translation for correlated queries when optimizer is turned on. +CREATE TABLE t1 (a int, b int); +CREATE TABLE t2 (a int, b int); +CREATE TABLE x (a int); +select * from x where a= (select sum(t1.a) from t1 inner join (select x.a as outer_ref, * from t2) as foo on (foo.a=t1.a+ outer_ref) group by foo.a); + +SET statement_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = off; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET escape_string_warning = off; + +SET default_with_oids = false; + +CREATE TABLE test_r_rvv_stada_dim_konst ( + dim_bezei character varying(50) NOT NULL, + dim_elem_lvl smallint NOT NULL, + dim_elem_nr character varying(12) NOT NULL, + dim_elem_id character varying(12) NOT NULL, + dim_elem_bezei character varying(50) NOT NULL, + dim_parent_nr smallint, + dim_bed character varying(150) +); + + +CREATE TABLE test_sf_dd_land_vm ( + land_elem_nr smallint NOT NULL, + land_elem_bezei character varying(50) NOT NULL, + land_typ smallint NOT NULL, + land_id character varying(2), + land_nr smallint, + land_bezei character varying(50), + land_bezei_krz character varying(15), + land_abc_kz character varying(1), + land_seg_qis_nr smallint, + land_seg_qis_bezei character varying(50), + land_seg_geo_nr smallint, + land_seg_geo_bezei character varying(50), + region_nr smallint, + region_bezei character varying(50), + sm_region_nr smallint, + sm_region_bezei character varying(50), + land_ges_nr smallint NOT NULL, + land_ges_bezei character varying(50) NOT NULL +); + + +COPY test_r_rvv_stada_dim_konst (dim_bezei, dim_elem_lvl, dim_elem_nr, dim_elem_id, dim_elem_bezei, dim_parent_nr, dim_bed) FROM stdin; +0103b7ea15f866bb11c1759b46f61c7a 1 3 d4cd0dabcf4c d4cd0dabcf4caa22ad92fab40844c786 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 0 100 84809c695116 5e911021574e6ad2ca8ca34ce765daac \N d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 16 832e21f9da1a 832e21f9da1ad55895637d00686fdb42 104 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 64 ea5d2f1c4608 ea5d2f1c4608232e07d3aa3d998e5135 0 d41d8cd98f00b204e9800998ecf8427e +181f050e04dc4d9242f0471fbd5fbfa8 0 0 84809c695116 e46b26a1b91a96f494700f063dff87c7 \N d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 1 19344954f04f 19344954f04f9849eea867f331cddcce 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 18 78b0fb7d034c 78b0fb7d034c46f13890008e6f36806b 103 d41d8cd98f00b204e9800998ecf8427e +0c6bd6bf4cb194fc5fb0c8a8384c94db 0 0 84809c695116 0c6bd6bf4cb194fc5fb0c8a8384c94db \N d41d8cd98f00b204e9800998ecf8427e +cb909cda78049dda3903065fca287799 1 3 517639957570 c80b4612e3467840dd8494788e6c5e38 0 aa9f9adca6b67dcc7e619c1e9df77808 +NatCat-Zone 0 0 84809c695116 326069604c6a5df905ad7524ff6fd845 \N d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 11 6512bd43d9ca bbe248bb0a79ab2d69315a853f1c73d4 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 22 b6d767d2f8ed b6d767d2f8ed5d21a44b0e5886680cb9 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 102 0776809bccf9 0776809bccf9f0ce17bea87f017c1b9f 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 41 3416a75f4cea 3416a75f4cea9109507cacd8e2f2aefc 0 d41d8cd98f00b204e9800998ecf8427e +b61a3e9e5117789228714a7dbece5368 1 2 e1e1d3d40573 414acbafa74626ab848ef393426f1ca7 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 12 c20ad4d76fe9 c20ad4d76fe97759aa27a0c99bff6710 100 d41d8cd98f00b204e9800998ecf8427e +cb909cda78049dda3903065fca287799 1 6 bffaa107d122 d9baa57d66694e09cd367b300941327f 0 c8af20d0259db915e0b1d4c8a9c7c882 +NatCat-Zone 2 19 ec8989f78fab ec8989f78fab481d87f43ecacca55aa1 103 d41d8cd98f00b204e9800998ecf8427e +145b109f5ab16b305c5a59400e8615bb 1 10 57cec4137b61 a6105c0a611b41b08f1209506350279e 0 d41d8cd98f00b204e9800998ecf8427e +cb909cda78049dda3903065fca287799 1 1 b8decd29b0a1 e874610aaffeec5fb65aab5f81befd6d 0 92bc431e364f8523d9ae7cedf181c872 +NatCat-Zone 2 21 f81e986ee4c9 f81e986ee4c9f80d6002bf5302b3ea87 103 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 19 1f0e3dad9990 55276c10d84e1df7713b441e76e141f9 0 d41d8cd98f00b204e9800998ecf8427e +f61d103ff565d935bbf5a2cd4ea0572f 1 3 890a10788493 890a10788493e3d572586e991cd43543 0 d41d8cd98f00b204e9800998ecf8427e +f61d103ff565d935bbf5a2cd4ea0572f 1 1 b86fc6b051f6 b86fc6b051f63d73de262d4c34e3a0a9 0 d41d8cd98f00b204e9800998ecf8427e +16844c1af98e046d58f641eedf0a1ada 1 2 e1e1d3d40573 52c9932e7a5247ab8915e56ebc31a319 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 3 eccbc87e4b5c efa32d1e971e9d0ed2553a66f1548e50 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 51 2838023a778d 2838023a778dfaecdc212708f721b788 0 d41d8cd98f00b204e9800998ecf8427e +4d2ba128186be45047709f751cfb8a92 1 3 d4cd0dabcf4c 316af6c21cc12f37b0f702350a5ee660 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 106 e4541ed56cf3 e4541ed56cf3de37439937a54e5d6f38 0 d41d8cd98f00b204e9800998ecf8427e +181f050e04dc4d9242f0471fbd5fbfa8 1 1 a7bdee32cb21 79afeab88e1ebd59a017476928f83adb 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 8 c9f0f895fb98 c9f0f895fb98ab9159f51fd0297e236d 100 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 8 131d5a3daa39 131d5a3daa39b73050f40a62372ee44e 103 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 7 49b10fbde180 49b10fbde180f30ecd23a4155ecc5a6f 103 d41d8cd98f00b204e9800998ecf8427e +5b7dce2e8e6b158650dd553068b571c0 1 1 cc8ee37afb5c 53aa6eaffd8c87ca8ba676019ca8cc64 0 d41d8cd98f00b204e9800998ecf8427e +cb909cda78049dda3903065fca287799 1 5 aa18c2e4dc3e db5de5565ee5ad2c14507075fed51964 0 186c373830fa2ebdfb3672b1af52b997 +NatCat-Zone 2 5 ffe7470430a7 ffe7470430a737c4ce6dc74bea0155d5 103 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 15 8381363cab61 8381363cab61eb967e4bb45a8d44b7e0 103 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 15 9bf31c7ff062 9bf31c7ff062936a96d3c8bd1f8f2ff3 0 d41d8cd98f00b204e9800998ecf8427e +5b7dce2e8e6b158650dd553068b571c0 1 3 74b8d5453b65 8fe1c21c436612f4844e910bd7fe8c70 0 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 9 be031607d3ae be031607d3ae67c9031f3d900b8683ef 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 13 fc8baa6879e6 fc8baa6879e639926be3916810962e13 101 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 26 4e732ced3463 4e732ced3463d06de0ca9a15b6153677 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 7 8f14e45fceea 8f14e45fceea167a5a36dedd4bea2543 100 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 11 6512bd43d9ca 6512bd43d9caa6e02c990b0a82652dca 100 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 110 dec371fcaec1 dec371fcaec103c77f726ecf6f045d19 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 109 3fbe674f00bd 3fbe674f00bdce9f04865f793d7b555a 0 d41d8cd98f00b204e9800998ecf8427e +482a0f9da73eaef2635fca46019e5dfe 1 1 0d61f8370cad 349e686330723975502e9ef4f939a5ac 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 10 d3d9446802a4 e2beaebbb707494ef8742001c7911e66 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 22 d877c55797fd d877c55797fd430ce8150363cd86058f 103 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 98 d4cd0dabcf4c d4cd0dabcf4caa22ad92fab40844c786 0 d41d8cd98f00b204e9800998ecf8427e +745fcda37ffcd71c95c824972c842b91 0 0 84809c695116 745fcda37ffcd71c95c824972c842b91 \N d41d8cd98f00b204e9800998ecf8427e +4d2ba128186be45047709f751cfb8a92 1 1 19344954f04f 039e333d79779b73c6ac8467aa6c8446 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 61 7f39f8317fbd 7f39f8317fbdb1988ef4c628eba02591 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 2 5034bc3fd2a1 5034bc3fd2a153aad8f903a3df44d08a 101 d41d8cd98f00b204e9800998ecf8427e +482a0f9da73eaef2635fca46019e5dfe 0 0 84809c695116 482a0f9da73eaef2635fca46019e5dfe \N d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 17 70efdf2ec9b0 72f7f8076a8a3d529437e8d725c168a2 0 d41d8cd98f00b204e9800998ecf8427e +745fcda37ffcd71c95c824972c842b91 1 4 4c614360da93 8ba8785bbbdee3d6a0edc7badbbe05ec 0 d41d8cd98f00b204e9800998ecf8427e +4d2ba128186be45047709f751cfb8a92 1 2 4b0086c408cf 2008b7c9b3b4f55b860b535dce51cb42 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 13 d4cd0dabcf4c d4cd0dabcf4caa22ad92fab40844c786 100 d41d8cd98f00b204e9800998ecf8427e +6196483b3dee5dd3297963c3998e1de8 1 1 9d5ed678fe57 11735e1e14db3f61c60f93503504fb2b 0 d41d8cd98f00b204e9800998ecf8427e +4c04c494b0ff8f487ed4966ea0e499c6 0 0 84809c695116 4c04c494b0ff8f487ed4966ea0e499c6 \N d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 10 2c61ebff5a7f 2c61ebff5a7f675451467527df66788d 108 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 52 9a1158154dfa 9a1158154dfa42caddbd0694a4e9bdc8 0 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 4 4d3c52f19f3d e8b69269b48511ef844ad77e5a11c88c 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 101 35b3855dc944 35b3855dc94445aa82615b66f73f5be9 0 d41d8cd98f00b204e9800998ecf8427e +4c04c494b0ff8f487ed4966ea0e499c6 1 1 df22f1712488 e9ad9c2394f7dc7b6a69fb43e52a7382 0 d41d8cd98f00b204e9800998ecf8427e +4c04c494b0ff8f487ed4966ea0e499c6 1 2 627fcdb6cc9a 849c829d658baaeff512d766b0db3cce 0 d41d8cd98f00b204e9800998ecf8427e +42d6b50d69620b5604ea1c1e6d4bb0cb 1 3 69691c7bdcc3 48451f836d09ff61c197967baed4babc 0 d41d8cd98f00b204e9800998ecf8427e +519e8203b65668c4ce5759ceea4da243 0 0 84809c695116 519e8203b65668c4ce5759ceea4da243 \N d41d8cd98f00b204e9800998ecf8427e +0103b7ea15f866bb11c1759b46f61c7a 1 1 8cdb36f48677 8cdb36f48677373dbde5dd7ead8c731e 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 6 1679091c5a88 1679091c5a880faf6fb5e6087eb1b2dc 100 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 11 484c5aa99688 484c5aa99688af4038b3980324f1232c 103 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 11 6512bd43d9ca 9b86666dca5a2ed46d7a8bb78e8a62ad 0 d41d8cd98f00b204e9800998ecf8427e +5b7dce2e8e6b158650dd553068b571c0 1 5 d4cd0dabcf4c 316af6c21cc12f37b0f702350a5ee660 0 d41d8cd98f00b204e9800998ecf8427e +b61a3e9e5117789228714a7dbece5368 0 0 84809c695116 b61a3e9e5117789228714a7dbece5368 \N d41d8cd98f00b204e9800998ecf8427e +482a0f9da73eaef2635fca46019e5dfe 1 2 4c614360da93 5dbbd802974831cd78ec4ecd34757d8e 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 28 33e75ff09dd6 33e75ff09dd601bbe69f351039152189 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 23 37693cfc7480 37693cfc748049e45d87b8c7d8b9aacd 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 31 c16a5320fa47 c16a5320fa475530d9583c34fd356ef5 0 d41d8cd98f00b204e9800998ecf8427e +58816eea1a4809ba16406b0216bb8f85 0 0 84809c695116 58816eea1a4809ba16406b0216bb8f85 \N d41d8cd98f00b204e9800998ecf8427e +58816eea1a4809ba16406b0216bb8f85 1 1 44c29edb103a 723870a71f0e58861924f24b3c21840b 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 107 578ed5a4eecf 578ed5a4eecf5a15803abdc49f6152d6 0 d41d8cd98f00b204e9800998ecf8427e +145b109f5ab16b305c5a59400e8615bb 2 1 7fc56270e7a7 db0213a9873b04498446588ba91dce31 10 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 12 c20ad4d76fe9 c20ad4d76fe97759aa27a0c99bff6710 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 32 6364d3f0f495 6364d3f0f495b6ab9dcf8d3b5c6e0b01 0 d41d8cd98f00b204e9800998ecf8427e +f61d103ff565d935bbf5a2cd4ea0572f 1 2 0a5a4d738606 0a5a4d7386065c6c6ac19c303768c7e1 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 1 57c7d11cd493 57c7d11cd49333e3f722204c63016da9 103 d41d8cd98f00b204e9800998ecf8427e +4c04c494b0ff8f487ed4966ea0e499c6 1 3 3d296788f2a7 b61705f85f6a5787b3797b783d692360 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 13 c51ce410c124 7e062f1dcc551b1467bc92f88b92a0ef 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 92 92cc227532d1 01cb581b2f63ff0cfd654c0149304afc \N d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 9 45c48cce2e2d 45c48cce2e2d7fbdea1afc51c7c6ad26 100 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 112 e7333d76e27e e7333d76e27e6772a960a972a8d6598e 0 d41d8cd98f00b204e9800998ecf8427e +16844c1af98e046d58f641eedf0a1ada 1 3 21c2e59531c8 529e9e0beb5f85d1f132917c1a09860c 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 9 e6d96502596d e6d96502596d7e7887b76646c5f615d9 103 d41d8cd98f00b204e9800998ecf8427e +745fcda37ffcd71c95c824972c842b91 1 3 5dbc98dcc983 b8ddc732d2e6fa4b613a97323be3e8db 0 d41d8cd98f00b204e9800998ecf8427e +6196483b3dee5dd3297963c3998e1de8 1 2 e1e1d3d40573 2424b5fe85d4c50cf04daf345531e28f 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 2 c81e728d9d4c 6ace0f5def42a2d78dd40e3ff384f27a 0 d41d8cd98f00b204e9800998ecf8427e +42c3093bc32d46b62274bfce2cf18745 1 2 651362597a2a 651362597a2a9a351479ea91ca5a18c3 0 d41d8cd98f00b204e9800998ecf8427e +0c6bd6bf4cb194fc5fb0c8a8384c94db 1 2 8cb2010d27e1 41c409697b108c7e798edef4f1533042 0 4c5c2b8f3c2bf42cae73d64c99100224 +0c6bd6bf4cb194fc5fb0c8a8384c94db 1 3 3754385271c4 db5de5565ee5ad2c14507075fed51964 0 584ee0eb67264dc3586ee884872d25b8 +16844c1af98e046d58f641eedf0a1ada 1 1 3a3ea00cfc35 49a2747735077fab5b2b0b96e67ac297 0 d41d8cd98f00b204e9800998ecf8427e +519e8203b65668c4ce5759ceea4da243 1 3 d6734e50b93c 145b109f5ab16b305c5a59400e8615bb 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 10 d3d9446802a4 d3d9446802a44259755d38e6d163e820 100 d41d8cd98f00b204e9800998ecf8427e +5e911021574e6ad2ca8ca34ce765daac 1 0 cfcd208495d5 cfcd208495d565ef66e7dff9f98764da 100 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 14 aab3238922bc aab3238922bcc25a6f606eb525ffdc56 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 24 ba8eaeec35b5 ba8eaeec35b54c67fea9bb1645a489a8 105 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 9 45c48cce2e2d 59155a0c07f1932b45c944636b98e121 0 d41d8cd98f00b204e9800998ecf8427e +83ea8511c73499557778d89213f9e198 1 1 69691c7bdcc3 69691c7bdcc3ce6d5d8a1361f22d04ac 0 d41d8cd98f00b204e9800998ecf8427e +cb909cda78049dda3903065fca287799 1 7 0ec74ac15567 8d7191ccf394448f6cfdc1e4b80d972a 0 fc23dfaadfa7b68a7f094c72b5758a09 +fca8c2bcba518414832516ce6476b40c 1 3 eccbc87e4b5c eccbc87e4b5ce2fe28308fd9f2a7baf3 100 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 62 44f683a84163 44f683a84163b3523afe57c2e008bc8c 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 12 c20ad4d76fe9 4c6ee2bc37257a2a073630221c2d9c4c 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 108 f4864963ac06 f4864963ac0643d1b73ec6580f283042 0 d41d8cd98f00b204e9800998ecf8427e +6196483b3dee5dd3297963c3998e1de8 0 0 84809c695116 6196483b3dee5dd3297963c3998e1de8 \N d41d8cd98f00b204e9800998ecf8427e +5b7dce2e8e6b158650dd553068b571c0 1 4 a7a4ccc5e1a0 d8937cd60e571aa3ad628858dd9708bf 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 0 0 84809c695116 9505a3c7a360cb8a402d4474b4b86f93 \N d41d8cd98f00b204e9800998ecf8427e +181f050e04dc4d9242f0471fbd5fbfa8 1 3 d4cd0dabcf4c 316af6c21cc12f37b0f702350a5ee660 0 d41d8cd98f00b204e9800998ecf8427e +16844c1af98e046d58f641eedf0a1ada 0 0 84809c695116 16844c1af98e046d58f641eedf0a1ada \N d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 10 c65a87a5ac09 c65a87a5ac096ecfc724eff061c323c4 0 d41d8cd98f00b204e9800998ecf8427e +145b109f5ab16b305c5a59400e8615bb 2 3 8d9c307cb7f3 7fa3b767c460b54a2be4d49030b349c7 11 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 14 375dcc1c4dec 375dcc1c4dec844c30d1a9a33d6e04af 103 d41d8cd98f00b204e9800998ecf8427e +cb909cda78049dda3903065fca287799 1 4 e3fd4fef7dd0 b58753386b87aa25b69608613251c246 0 23d72e6a6a8abd3881a0f5f358bcaf04 +cb909cda78049dda3903065fca287799 0 0 84809c695116 cb909cda78049dda3903065fca287799 \N d41d8cd98f00b204e9800998ecf8427e +745fcda37ffcd71c95c824972c842b91 1 1 0d61f8370cad a2cb54446c3a304e0e3d4cd40a22e203 0 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 2 8c876c90f4c6 8c876c90f4c6139a53b8447406319327 0 d41d8cd98f00b204e9800998ecf8427e +0103b7ea15f866bb11c1759b46f61c7a 0 0 84809c695116 0103b7ea15f866bb11c1759b46f61c7a \N d41d8cd98f00b204e9800998ecf8427e +42d6b50d69620b5604ea1c1e6d4bb0cb 1 2 dfcf28d07345 ed9d2919c0128bd443607ebc36dadeef 0 d41d8cd98f00b204e9800998ecf8427e +58816eea1a4809ba16406b0216bb8f85 1 2 8bc2afe7028c 2894803c95e14523f0a402b6ba16d771 0 d41d8cd98f00b204e9800998ecf8427e +b61a3e9e5117789228714a7dbece5368 1 3 0d61f8370cad 55f4b4a94111759e08b3acb1acd12b8c 0 d41d8cd98f00b204e9800998ecf8427e +42d6b50d69620b5604ea1c1e6d4bb0cb 1 1 3a3ea00cfc35 bfc36dc3450c449d943b5134a322f668 0 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 8 ea03e4b16909 ea03e4b16909efe369d688a1636c27bc 0 d41d8cd98f00b204e9800998ecf8427e +4d2ba128186be45047709f751cfb8a92 0 0 84809c695116 4d2ba128186be45047709f751cfb8a92 \N d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 7 8f14e45fceea 904ccc9c77ff01a6d6e5cf55d1be50f8 0 d41d8cd98f00b204e9800998ecf8427e +42d6b50d69620b5604ea1c1e6d4bb0cb 0 0 84809c695116 42d6b50d69620b5604ea1c1e6d4bb0cb \N d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 53 d82c8d1619ad d82c8d1619ad8176d665453cfb2e55f0 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 5 e4da3b7fbbce 6479e0417e03c6981e3e058930cf5441 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 17 365f939403a7 365f939403a7e61514b0f74b6809290f 104 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 4 b6eb281e772f b6eb281e772f7b8fc9404fba1fbbb06a 103 d41d8cd98f00b204e9800998ecf8427e +0c6bd6bf4cb194fc5fb0c8a8384c94db 1 1 af70c800d0e6 54dada75182ee1a6608d7fccf1618eb2 0 a57af889d26fdf589ef6aa49e258814a +745fcda37ffcd71c95c824972c842b91 1 2 69691c7bdcc3 0500ae38db900195ef518b07677330b3 0 d41d8cd98f00b204e9800998ecf8427e +519e8203b65668c4ce5759ceea4da243 1 1 44c29edb103a 723870a71f0e58861924f24b3c21840b 0 d41d8cd98f00b204e9800998ecf8427e +5b7dce2e8e6b158650dd553068b571c0 1 2 9f3bf0c1c225 cc816a50a5381aae77444c6e60aa1c39 0 d41d8cd98f00b204e9800998ecf8427e +83ea8511c73499557778d89213f9e198 1 2 5dbc98dcc983 5dbc98dcc983a70728bd082d1a47546e 0 d41d8cd98f00b204e9800998ecf8427e +145b109f5ab16b305c5a59400e8615bb 1 11 8d9c307cb7f3 7fa3b767c460b54a2be4d49030b349c7 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 15 9bf31c7ff062 c67f11495017fcdaaa97c67b1f8baa89 0 d41d8cd98f00b204e9800998ecf8427e +4c04c494b0ff8f487ed4966ea0e499c6 1 4 925cc8d2953e 559608508b42a01c1068fae4fcdc2aef 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 1 c4ca4238a0b9 c4ca4238a0b923820dcc509a6f75849b 100 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 23 e060bb629c10 e060bb629c10e1b143614cc1e9ccdc67 103 d41d8cd98f00b204e9800998ecf8427e +83ea8511c73499557778d89213f9e198 0 0 84809c695116 83ea8511c73499557778d89213f9e198 \N d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 103 ecab6653cedb ecab6653cedb98ded1c7416c0d114df7 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 1 c4ca4238a0b9 4a4117283d87ddc9cad762448bd0dbb9 0 d41d8cd98f00b204e9800998ecf8427e +cb909cda78049dda3903065fca287799 1 2 52ffc801bb92 5e592eaba2cc166df83420c4f9b96233 0 f31ead525edda3fb6c1b74618dfc009b +f9e42beb02b035dca917ea56313d9070 1 18 6f4922f45568 b980fb232ec66ad7286ae420a2c39df3 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 20 ada53304c5b9 ada53304c5b9e4a839615b6e8f908eb6 112 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 0 0 84809c695116 b0a9df59c9eb73f0a47ca5bda803b36c \N d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 3 93cd19caf9b4 93cd19caf9b411ebed943965a9ca83be 0 d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 4 a87ff679a2f3 a87ff679a2f3e71d9181a67b7542122c 100 d41d8cd98f00b204e9800998ecf8427e +145b109f5ab16b305c5a59400e8615bb 0 0 3af1a2642071 145b109f5ab16b305c5a59400e8615bb \N d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 111 78fe5b689568 78fe5b68956805618673ba3f04999ae8 0 d41d8cd98f00b204e9800998ecf8427e +42c3093bc32d46b62274bfce2cf18745 1 1 9759dd199006 9759dd1990064fc5fc63239a7e61582f 0 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 99 4a49075b1524 4a49075b15242d9e4d400b52a349983a 0 d41d8cd98f00b204e9800998ecf8427e +f61d103ff565d935bbf5a2cd4ea0572f 1 4 8d9c307cb7f3 8d9c307cb7f3c4a32822a51922d1ceaa 0 d41d8cd98f00b204e9800998ecf8427e +b61a3e9e5117789228714a7dbece5368 1 1 3a3ea00cfc35 d0208f7a44e3f71e0c8cc9bad00b8978 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 27 02e74f10e032 36720406ba7a6ed121d79b2c01e5b347 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 6 1679091c5a88 1610307b826a861f0e99a1357ef5dcc2 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 4 a87ff679a2f3 cf70935129ffddee8aa78e03d72d2623 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 100 b0c597f91004 b0c597f91004d4355059ffeee1f30393 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 3 5e4ac03d7827 5e4ac03d7827ca48ed305a0d80cd5aa1 107 d41d8cd98f00b204e9800998ecf8427e +f61d103ff565d935bbf5a2cd4ea0572f 0 0 84809c695116 f61d103ff565d935bbf5a2cd4ea0572f \N d41d8cd98f00b204e9800998ecf8427e +fca8c2bcba518414832516ce6476b40c 1 2 c81e728d9d4c c81e728d9d4c2f636f067f89cc14862c 100 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 7 836cf97caaf2 836cf97caaf24bedd8f3c098073c0c9c 0 d41d8cd98f00b204e9800998ecf8427e +58816eea1a4809ba16406b0216bb8f85 1 3 d4cd0dabcf4c 316af6c21cc12f37b0f702350a5ee660 0 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 6 76acac1a31f3 76acac1a31f3ba26f0ce8adb1b8475e7 0 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 6 06202b87153d 06202b87153d246b5acbf8ed52301f6e 103 d41d8cd98f00b204e9800998ecf8427e +42c3093bc32d46b62274bfce2cf18745 0 0 84809c695116 42c3093bc32d46b62274bfce2cf18745 \N d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 105 f2f72863a847 f2f72863a84704b5c9ba7a8aa051f73d 0 d41d8cd98f00b204e9800998ecf8427e +b0a9df59c9eb73f0a47ca5bda803b36c 1 5 52899a58dee6 52899a58dee627d98edea18d1c701891 0 d41d8cd98f00b204e9800998ecf8427e +181f050e04dc4d9242f0471fbd5fbfa8 1 2 d516cfc947c9 e41fc1331bbd8c67e78253dfad0415a5 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 54 a684eceee76f a684eceee76fc522773286a895bc8436 0 d41d8cd98f00b204e9800998ecf8427e +9505a3c7a360cb8a402d4474b4b86f93 1 13 c51ce410c124 c51ce410c124a10e0db5e4b97fc2af39 0 d41d8cd98f00b204e9800998ecf8427e +0103b7ea15f866bb11c1759b46f61c7a 1 2 0da5a4aed7fb 0da5a4aed7fbf15d6bf9bdf07d978e9c 0 d41d8cd98f00b204e9800998ecf8427e +5b7dce2e8e6b158650dd553068b571c0 0 0 84809c695116 5b7dce2e8e6b158650dd553068b571c0 \N d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 14 aab3238922bc d702ac28e3610c9f7203c8202b218829 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 0 0 84809c695116 927cee1b0cb6553bbd0d4e67794636a3 0 d41d8cd98f00b204e9800998ecf8427e +519e8203b65668c4ce5759ceea4da243 1 2 8bc2afe7028c 2894803c95e14523f0a402b6ba16d771 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 8 c9f0f895fb98 5de01abf8969a7e70937b8bc9e1fbfa0 0 d41d8cd98f00b204e9800998ecf8427e +145b109f5ab16b305c5a59400e8615bb 2 2 5dbc98dcc983 86c70f8ed514ef4787300d0d20faf791 10 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 2 12 2708c3704f3c 2708c3704f3c6a7b3a9e685289b412aa 103 d41d8cd98f00b204e9800998ecf8427e +0c6bd6bf4cb194fc5fb0c8a8384c94db 1 4 5dc4f449b09b 03c66bef1ed91170020569b3a513140a 0 7145ef5b6b8705df3163800ab30d7ccb +fca8c2bcba518414832516ce6476b40c 1 5 e4da3b7fbbce e4da3b7fbbce2345d7772b0674a318d5 100 d41d8cd98f00b204e9800998ecf8427e +NatCat-Zone 1 104 a441cb7c28e1 a441cb7c28e1f94b7d8e7e1be1f07310 0 d41d8cd98f00b204e9800998ecf8427e +f9e42beb02b035dca917ea56313d9070 1 16 c74d97b01eae dcf37d1c46ab2950244d2f4cd4455641 0 d41d8cd98f00b204e9800998ecf8427e +\. + + + +COPY test_sf_dd_land_vm (land_elem_nr, land_elem_bezei, land_typ, land_id, land_nr, land_bezei, land_bezei_krz, land_abc_kz, land_seg_qis_nr, land_seg_qis_bezei, land_seg_geo_nr, land_seg_geo_bezei, region_nr, region_bezei, sm_region_nr, sm_region_bezei, land_ges_nr, land_ges_bezei) FROM stdin; +528 cdcd6cea3c88c6365ace6f2cbb6e0cea 1 02 528 cdcd6cea3c88c6365ace6f2cbb6e0cea cdcd6cea3c88c63 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +10 4f2dc75f7df87f32daaf1a049066dedd 2 e3 \N \N \N N \N \N \N \N 10 4f2dc75f7df87f32daaf1a049066dedd \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +249 3a241561419368883ab837c0275bf3e6 1 91 249 3a241561419368883ab837c0275bf3e6 7b2f841ec255602 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +505 77f9068416363b761f0ddabbc066c4da 1 09 505 77f9068416363b761f0ddabbc066c4da 77f9068416363b7 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +503 08bb2cae0b3b214eaa739b43749f0f4e 1 c5 503 08bb2cae0b3b214eaa739b43749f0f4e 08bb2cae0b3b214 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +309 381758c21c32450659b9b2e41b039f5d 1 b8 309 381758c21c32450659b9b2e41b039f5d 381758c21c32450 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +21 50a367a077edcb55402efbf2aaaaa700 2 0d \N \N \N N \N \N \N \N 21 50a367a077edcb55402efbf2aaaaa700 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +337 018cb35f0b2986978434aef117d03cf5 1 f7 337 018cb35f0b2986978434aef117d03cf5 018cb35f0b29869 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +320 4e005a9168d7fb69836cceb044717e94 1 73 320 4e005a9168d7fb69836cceb044717e94 4e005a9168d7fb6 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +121 44e80c82723dfc7c9a3cd546b5ca662e 1 17 121 44e80c82723dfc7c9a3cd546b5ca662e 44e80c82723dfc7 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +238 4fbdd5b8f184018ee688b77d52622fe1 1 12 238 4fbdd5b8f184018ee688b77d52622fe1 4fbdd5b8f184018 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +131 9f977a220e59d3948ea953674ca0e634 1 b3 131 9f977a220e59d3948ea953674ca0e634 9f977a220e59d39 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +145 85250321967cc45cdbfab460eecce263 1 91 145 85250321967cc45cdbfab460eecce263 85250321967cc45 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +519 21e9696e5d0bdb290c923637d0a6d908 1 63 519 21e9696e5d0bdb290c923637d0a6d908 21e9696e5d0bdb2 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +342 89cacbbb559259549e77c30c075aaae0 1 c5 342 89cacbbb559259549e77c30c075aaae0 c0ef4281908ac9b N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +126 59240330332adfccfbe033ba96e84f20 1 9f 126 59240330332adfccfbe033ba96e84f20 59240330332adfc A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +216 1c64090b21e84e4f95825de3411a9c80 1 77 216 1c64090b21e84e4f95825de3411a9c80 1c64090b21e84e4 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 14 b1f594ffdd6b01719e1208cfc211dda0 10000 512ef7c688a2c8572d5e16f44e17e869 +339 e5c01bfd90fc584b7ce848bde72dd28f 1 fa 339 e5c01bfd90fc584b7ce848bde72dd28f e5c01bfd90fc584 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 2 1610307b826a861f0e99a1357ef5dcc2 10000 512ef7c688a2c8572d5e16f44e17e869 +405 8423048030ed9199cc169cea0c342ed1 1 7c 405 8423048030ed9199cc169cea0c342ed1 8423048030ed919 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +122 6fae36c4608b51bb19bbdf88dc8fcf59 1 7b 122 6fae36c4608b51bb19bbdf88dc8fcf59 6fae36c4608b51b B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +229 07f1ae345d8f693f4ed73dec830fb36e 1 07 229 07f1ae345d8f693f4ed73dec830fb36e 7bf5e34cc0c631a N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +410 c0d9fc493ecdd6e2e73b8bdd7eeed4fb 1 09 410 c0d9fc493ecdd6e2e73b8bdd7eeed4fb c60e9d81c57bef2 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +302 243cc3954c8a3caa5725ab86276190bf 1 ad 302 243cc3954c8a3caa5725ab86276190bf 243cc3954c8a3ca B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +403 00d7d9ab3d750fa998492f715d69f010 1 b2 403 00d7d9ab3d750fa998492f715d69f010 00d7d9ab3d750fa B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +0 512ef7c688a2c8572d5e16f44e17e869 3 \N \N \N \N \N \N \N \N \N \N \N \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +307 7973f8a3e674c89bb1af868180fb808a 1 a2 307 7973f8a3e674c89bb1af868180fb808a 7973f8a3e674c89 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +994 c9815f24891e54458775e6a27322b70a 1 57 994 c9815f24891e54458775e6a27322b70a d965486a148eb61 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 994 c9815f24891e54458775e6a27322b70a 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +522 2dc06730702125f4ae091657856e2368 1 42 522 2dc06730702125f4ae091657856e2368 2dc06730702125f C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +232 e4dd8f0521e7c1fca2466b277185f57f 1 90 232 e4dd8f0521e7c1fca2466b277185f57f e4dd8f0521e7c1f B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +233 d32484f02ae888fc9ca4bf6d3ec30654 1 36 233 d32484f02ae888fc9ca4bf6d3ec30654 fea35cd75b707f5 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +41 d11a2a99c7e255871b8fca6ca916ce5a 2 1d \N \N \N N \N \N \N \N 41 d11a2a99c7e255871b8fca6ca916ce5a \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +104 481a9a6891fdfdbcfb9b537f65da209c 1 ef 104 481a9a6891fdfdbcfb9b537f65da209c 481a9a6891fdfdb A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +231 d0674c07e05a2e48ccade7644623892f 1 2d 231 d0674c07e05a2e48ccade7644623892f 79fe4f23c9a223d B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +245 0272ba3b010fa9a51b9143223f28ed3f 1 27 245 0272ba3b010fa9a51b9143223f28ed3f 0272ba3b010fa9a C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +306 676de5ba893af6bbc683c93306aaf769 1 2e 306 676de5ba893af6bbc683c93306aaf769 676de5ba893af6b A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +114 f424832120571595fe1cb793d4259cd6 1 50 114 f424832120571595fe1cb793d4259cd6 f42483212057159 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +240 961bd6c053f32455098f9203f6f4b0cb 1 8a 240 961bd6c053f32455098f9203f6f4b0cb 1e5f526df8a3293 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +310 df5779b8899e0e8afc5164e6daec4876 1 30 310 df5779b8899e0e8afc5164e6daec4876 df5779b8899e0e8 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +502 84f2a141ab16901cf6233877001ce6b4 1 54 502 84f2a141ab16901cf6233877001ce6b4 84f2a141ab16901 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +317 b91510802bcc0c2c98129dd61f13d62a 1 a1 317 b91510802bcc0c2c98129dd61f13d62a b91510802bcc0c2 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +15 10d17235369e14b7dea6b34527620118 2 0e \N \N \N N \N \N \N \N 15 10d17235369e14b7dea6b34527620118 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +110 b7fd90b0e7ac0861ffdb762da5fc20be 1 7b 110 b7fd90b0e7ac0861ffdb762da5fc20be b7fd90b0e7ac086 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +22 8417532becd96ba9c77be4a2a5afe4f1 2 11 \N \N \N N \N \N \N \N 22 8417532becd96ba9c77be4a2a5afe4f1 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +120 adc77a263ba8c6f516421c4e5982a543 1 84 120 adc77a263ba8c6f516421c4e5982a543 adc77a263ba8c6f B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +406 4f434617687953e66d4945cbcd0f7853 1 7b 406 4f434617687953e66d4945cbcd0f7853 4f434617687953e N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +332 fe10c79c9f1f63fddaba9d4cc57c9785 1 af 332 fe10c79c9f1f63fddaba9d4cc57c9785 fe10c79c9f1f63f B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +1 4b5f1c354f147e74ee9ce53c89645086 2 c1 \N \N \N N \N \N \N \N 1 4b5f1c354f147e74ee9ce53c89645086 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +112 e6165388e7da4de2e7f4067be9757abc 1 10 112 e6165388e7da4de2e7f4067be9757abc e6165388e7da4de A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +32 fa59b93f7634a29292e6ea5e8073fba1 2 f6 \N \N \N N \N \N \N \N 32 fa59b93f7634a29292e6ea5e8073fba1 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +124 ff25664f11040a457d030ac391ddb195 1 c4 124 ff25664f11040a457d030ac391ddb195 ff25664f11040a4 A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +219 92ebb5380c6133152cef40d8d65114d8 1 9b 219 92ebb5380c6133152cef40d8d65114d8 92ebb5380c61331 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +323 9e4fefb090c5e3726c02f82c0c43fc6d 1 e3 323 9e4fefb090c5e3726c02f82c0c43fc6d 9e4fefb090c5e37 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 2 1610307b826a861f0e99a1357ef5dcc2 10000 512ef7c688a2c8572d5e16f44e17e869 +103 ddf9673145c0e7248d1889674452188d 1 19 103 ddf9673145c0e7248d1889674452188d ddf9673145c0e72 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +303 d85fbaa4e9c7bbe32ffd2c002823459a 1 51 303 d85fbaa4e9c7bbe32ffd2c002823459a d85fbaa4e9c7bbe B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +117 be304cc24d32b6e48154e7720daffa9d 1 4b 117 be304cc24d32b6e48154e7720daffa9d be304cc24d32b6e N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +34 35c050ad37a3a2526cfe8025846c86b3 2 a1 \N \N \N N \N \N \N \N 34 35c050ad37a3a2526cfe8025846c86b3 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +316 53851a7a29c6001ec74ce64822c6c432 1 a6 316 53851a7a29c6001ec74ce64822c6c432 53851a7a29c6001 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +341 5069c0b464ec157966315b41f9ab4538 1 59 341 5069c0b464ec157966315b41f9ab4538 5069c0b464ec157 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 2 1610307b826a861f0e99a1357ef5dcc2 10000 512ef7c688a2c8572d5e16f44e17e869 +106 fd0ff296819dc61da4c30a3ed57fcce6 1 dd 106 fd0ff296819dc61da4c30a3ed57fcce6 fd0ff296819dc61 A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +304 0772886437fdf3cc0aaf9cac5293b411 1 d3 304 0772886437fdf3cc0aaf9cac5293b411 0772886437fdf3c B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +116 41fb548634abb0dd1789fa72f515a8a1 1 08 116 41fb548634abb0dd1789fa72f515a8a1 41fb548634abb0d C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +335 79c27dd66581e491fd5a8d94db62ac51 1 91 335 79c27dd66581e491fd5a8d94db62ac51 79c27dd66581e49 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 33 14d07ec9a20b22a869cf51332e066056 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +533 370824caef878edd7874c226bf1fbc7f 1 c3 533 370824caef878edd7874c226bf1fbc7f 370824caef878ed N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +234 680f7261df2d9f68907ed68bb277ad2f 1 33 234 680f7261df2d9f68907ed68bb277ad2f 680f7261df2d9f6 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +401 9d49892430d385facb5990da4be25cfa 1 af 401 9d49892430d385facb5990da4be25cfa 9d49892430d385f N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +308 3c08b05a853446689e038b1d3471cfa5 1 8b 308 3c08b05a853446689e038b1d3471cfa5 3c08b05a8534466 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +136 cffbfdaf4e4ab6709eb96f55bc13541d 1 eb 136 cffbfdaf4e4ab6709eb96f55bc13541d cffbfdaf4e4ab67 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +510 a41dda035671c6c0fc5fa1efe8db2dce 1 57 510 a41dda035671c6c0fc5fa1efe8db2dce a41dda035671c6c B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +507 d4006719da48e72e6bd076c7b6379bd9 1 66 507 d4006719da48e72e6bd076c7b6379bd9 d4006719da48e72 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +248 b8a7aef8dfe15148756174ddb7ba1855 1 1a 248 b8a7aef8dfe15148756174ddb7ba1855 b8a7aef8dfe1514 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +200 0db90872750d507c431cafd0a81a6943 1 fd 200 0db90872750d507c431cafd0a81a6943 f75d91cdd36b85c A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 18 b980fb232ec66ad7286ae420a2c39df3 10000 512ef7c688a2c8572d5e16f44e17e869 +500 57c45407f34346ac9480cbfa41053d4b 1 a6 500 57c45407f34346ac9480cbfa41053d4b 57c45407f34346a C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +223 e758a46e2d846cb7290b5acdab300871 1 b6 223 e758a46e2d846cb7290b5acdab300871 e758a46e2d846cb C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 14 b1f594ffdd6b01719e1208cfc211dda0 10000 512ef7c688a2c8572d5e16f44e17e869 +247 520a3dbdaf8384e06e39074bdb43ecd3 1 36 247 520a3dbdaf8384e06e39074bdb43ecd3 520a3dbdaf8384e B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +33 14d07ec9a20b22a869cf51332e066056 2 c4 \N \N \N N \N \N \N \N 33 14d07ec9a20b22a869cf51332e066056 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +119 182e2082638734efb9ec010d8a247c16 1 f4 119 182e2082638734efb9ec010d8a247c16 182e2082638734e A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +305 2523fd09aa0ae6e6ad3d3d2ed8f8c7a7 1 fb 305 2523fd09aa0ae6e6ad3d3d2ed8f8c7a7 2523fd09aa0ae6e N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +235 36c6c3ad40e4e9101092c14440078af4 1 f0 235 36c6c3ad40e4e9101092c14440078af4 36c6c3ad40e4e91 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 13 7e062f1dcc551b1467bc92f88b92a0ef 10000 512ef7c688a2c8572d5e16f44e17e869 +226 e5a79d2b755220a7e69d7e015e0bab69 1 70 226 e5a79d2b755220a7e69d7e015e0bab69 e5a79d2b755220a B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +50 e0d829a023d4407c9ddd6ebcf2037202 2 56 \N \N \N N \N \N \N \N 50 e0d829a023d4407c9ddd6ebcf2037202 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +246 d02a95f8f75b4c366861d9d37a1ad264 1 b8 246 d02a95f8f75b4c366861d9d37a1ad264 3a41eb240aaeb10 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +111 8655f406c434333976ba81a75c69ea1c 1 16 111 8655f406c434333976ba81a75c69ea1c 8655f406c434333 A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +517 8067774087dc79f4db69e76a367bf94e 1 a8 517 8067774087dc79f4db69e76a367bf94e 8067774087dc79f C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +532 f7eec2e4b72372b40c989c9dbf6cc9f3 1 0d 532 f7eec2e4b72372b40c989c9dbf6cc9f3 f7eec2e4b72372b C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +998 55033a55e595b0adbb40653f9b3560c9 1 3b 998 55033a55e595b0adbb40653f9b3560c9 35e33c2f35c03eb N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 998 55033a55e595b0adbb40653f9b3560c9 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +241 39aa98db50836a6bc4d96d218f8cdf67 1 98 241 39aa98db50836a6bc4d96d218f8cdf67 39aa98db50836a6 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +527 dd9ab79b5973cd3fee04ae195a1e5940 1 08 527 dd9ab79b5973cd3fee04ae195a1e5940 dd9ab79b5973cd3 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +204 a38cbb23017269895ea4921bfe91e1df 1 32 204 a38cbb23017269895ea4921bfe91e1df a38cbb230172698 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 13 7e062f1dcc551b1467bc92f88b92a0ef 10000 512ef7c688a2c8572d5e16f44e17e869 +142 027bd29d069d2fdfaa1abe891fbaae92 1 d8 142 027bd29d069d2fdfaa1abe891fbaae92 027bd29d069d2fd N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +14 d359b50e49d6a21946a5d1f52db7c275 2 ed \N \N \N N \N \N \N \N 14 d359b50e49d6a21946a5d1f52db7c275 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +330 8a035bfda6c16c222a9edbcf7666a6ba 1 03 330 8a035bfda6c16c222a9edbcf7666a6ba 8a035bfda6c16c2 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 2 1610307b826a861f0e99a1357ef5dcc2 10000 512ef7c688a2c8572d5e16f44e17e869 +102 6d3934480b23c0ca3d164cf19fa11946 1 f4 102 6d3934480b23c0ca3d164cf19fa11946 6d3934480b23c0c B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +212 52a9aa2a43c6a8baa7537887d36a6f1a 1 fa 212 52a9aa2a43c6a8baa7537887d36a6f1a 52a9aa2a43c6a8b C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +30 dc06162350dd5c2d97f13dea0264a61a 2 91 \N \N \N N \N \N \N \N 30 dc06162350dd5c2d97f13dea0264a61a \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +408 d30cb5a99f2e96f7a5623caf600f01f5 1 91 408 d30cb5a99f2e96f7a5623caf600f01f5 0d9e4ed17f2c1db A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 41 d11a2a99c7e255871b8fca6ca916ce5a 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +118 d33c571079f20a49e9c6040644319202 1 34 118 d33c571079f20a49e9c6040644319202 d33c571079f20a4 A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +531 f555c6c205efc36daadede3688014ad8 1 3e 531 f555c6c205efc36daadede3688014ad8 f555c6c205efc36 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +133 75e699618865aca0dad11ecff805c1cc 1 62 133 75e699618865aca0dad11ecff805c1cc 75e699618865aca C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +17 f0f2292429f8b5604360a199e43d2eb0 2 30 \N \N \N N \N \N \N \N 17 f0f2292429f8b5604360a199e43d2eb0 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +319 85db767e10d9c1d9b3a2956658420372 1 dd 319 85db767e10d9c1d9b3a2956658420372 85db767e10d9c1d B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +101 4b0b004d87f199727591fac72d3293a2 1 36 101 4b0b004d87f199727591fac72d3293a2 f72674018e843c1 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +336 f5621b859ff7b47aa78f3b6a3e5cce2f 1 fe 336 f5621b859ff7b47aa78f3b6a3e5cce2f f5621b859ff7b47 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +203 a8dbb56e10212ca28720a5c1ca5a6aab 1 5a 203 a8dbb56e10212ca28720a5c1ca5a6aab a8dbb56e10212ca A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +520 53bc5501e639292688fa56780570a1c1 1 d9 520 53bc5501e639292688fa56780570a1c1 53bc5501e639292 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +202 6b65600130f8f8d7b9d2c3a582a89f2e 1 a1 202 6b65600130f8f8d7b9d2c3a582a89f2e 6b65600130f8f8d C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 14 b1f594ffdd6b01719e1208cfc211dda0 10000 512ef7c688a2c8572d5e16f44e17e869 +16 efc6e34e5a21855589e481e1c3f3cfde 2 d1 \N \N \N N \N \N \N \N 16 efc6e34e5a21855589e481e1c3f3cfde \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +220 f762df3c480a157f4fa43e7ea4a10d33 1 3b 220 f762df3c480a157f4fa43e7ea4a10d33 f762df3c480a157 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 14 b1f594ffdd6b01719e1208cfc211dda0 10000 512ef7c688a2c8572d5e16f44e17e869 +340 3d9ad9040c82917854cc797b95bbd4df 1 6f 340 3d9ad9040c82917854cc797b95bbd4df 3d9ad9040c82917 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +328 6fec1099f408109efe107a6333d6981b 1 87 328 6fec1099f408109efe107a6333d6981b 6fec1099f408109 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +12 cd6bc7d54665f4af8dc363a3373c6240 2 fb \N \N \N N \N \N \N \N 12 cd6bc7d54665f4af8dc363a3373c6240 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +253 1ed4fa84603a68bdffb5a8680ee30d74 1 10 253 1ed4fa84603a68bdffb5a8680ee30d74 1ed4fa84603a68b N \N \N \N \N 20 00a58e6bc23b6232d61e077ae2059604 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +409 59a8168364bd0bcba54e3d419ac0675e 1 3b 409 59a8168364bd0bcba54e3d419ac0675e 59a8168364bd0bc N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +20 00a58e6bc23b6232d61e077ae2059604 2 91 \N \N \N N \N \N \N \N 20 00a58e6bc23b6232d61e077ae2059604 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +192 a7231058a893e0e1254bda073366eb2c 1 d9 192 a7231058a893e0e1254bda073366eb2c a7231058a893e0e N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +128 b897436a851d2d9d71907a5b9d18c65e 1 21 128 b897436a851d2d9d71907a5b9d18c65e b897436a851d2d9 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +315 1e72b1dad9aabc8185b5f3f5d8e032b8 1 e2 315 1e72b1dad9aabc8185b5f3f5d8e032b8 1e72b1dad9aabc8 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +31 c31d3cdbcae617e253886b0f2ecfc4bf 2 d8 \N \N \N N \N \N \N \N 31 c31d3cdbcae617e253886b0f2ecfc4bf \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +506 20dd1a74e0da4135babae61203017c34 1 f4 506 20dd1a74e0da4135babae61203017c34 64ee4e599a8810a N \N \N \N \N 50 e0d829a023d4407c9ddd6ebcf2037202 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +321 a85de25532f765f7ff411acf44bd4234 1 1a 321 a85de25532f765f7ff411acf44bd4234 b6ae56d2d40c99f B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +115 f4da7c03a379efbf9c9edbaa2a8d369d 1 0c 115 f4da7c03a379efbf9c9edbaa2a8d369d f4da7c03a379efb B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +239 a8ad431721c19f7ca388f087871b6431 1 17 239 a8ad431721c19f7ca388f087871b6431 f5ede49df3f454b B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +251 2121b053b6886e735add89f8b059afde 1 07 251 2121b053b6886e735add89f8b059afde 2121b053b6886e7 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +208 8c69bcdb2aef53b87ee64ae17f5aa9c0 1 9c 208 8c69bcdb2aef53b87ee64ae17f5aa9c0 8c69bcdb2aef53b B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 13 7e062f1dcc551b1467bc92f88b92a0ef 10000 512ef7c688a2c8572d5e16f44e17e869 +312 114d705b6e339c5f4b5350890ffa0aed 1 ae 312 114d705b6e339c5f4b5350890ffa0aed 114d705b6e339c5 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +109 b027ff3f749fc2495187b8c583c2fa8e 1 a1 109 b027ff3f749fc2495187b8c583c2fa8e b027ff3f749fc24 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +127 b143a1b51c69d39b574910cb5fa84f2a 1 68 127 b143a1b51c69d39b574910cb5fa84f2a b143a1b51c69d39 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +40 ecc919b1c2b77740ffa77cda77176d07 2 8b \N \N \N N \N \N \N \N 40 ecc919b1c2b77740ffa77cda77176d07 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +334 513fe2a22a358c42c7b5f4dd4594ab25 1 b7 334 513fe2a22a358c42c7b5f4dd4594ab25 513fe2a22a358c4 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +244 d6d351a7fcc69a34465ee3618cdef40c 1 1d 244 d6d351a7fcc69a34465ee3618cdef40c 03b34d9efae3d8a B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +108 8b470f864495744fcd8c3dc7b370e889 1 a7 108 8b470f864495744fcd8c3dc7b370e889 8b470f864495744 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +51 17acb80a024000dc594ca93ccf4c4cfd 2 0d \N \N \N N \N \N \N \N 51 17acb80a024000dc594ca93ccf4c4cfd \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +313 bea090929a66e9937267d4a7e3be04c0 1 96 313 bea090929a66e9937267d4a7e3be04c0 bea090929a66e99 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +326 b2364513ce8c12fabce65038b3a6f4d8 1 5a 326 b2364513ce8c12fabce65038b3a6f4d8 b2364513ce8c12f B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +206 a180576f5a44c894bbbd9c97a2ef86e9 1 74 206 a180576f5a44c894bbbd9c97a2ef86e9 a180576f5a44c89 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 14 b1f594ffdd6b01719e1208cfc211dda0 10000 512ef7c688a2c8572d5e16f44e17e869 +400 ecc919b1c2b77740ffa77cda77176d07 1 8b 400 ecc919b1c2b77740ffa77cda77176d07 ecc919b1c2b7774 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +523 83c1c9b5eaf851067e4cd19d00dc45ad 1 03 523 83c1c9b5eaf851067e4cd19d00dc45ad 83c1c9b5eaf8510 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +524 e80285000599357375c348f3f82a6978 1 9b 524 e80285000599357375c348f3f82a6978 e80285000599357 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +222 0bedab9aa28692c8f28a85d01d42b01a 1 a4 222 0bedab9aa28692c8f28a85d01d42b01a 0bedab9aa28692c C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +140 75ecb2a7edaf4e0ae9dcb65946cd5379 1 ee 140 75ecb2a7edaf4e0ae9dcb65946cd5379 75ecb2a7edaf4e0 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +525 508ac993db389e9277350983c5d496fd 1 99 525 508ac993db389e9277350983c5d496fd 508ac993db389e9 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +139 024ef7becd36034707cb17e6c91971ee 1 e7 139 024ef7becd36034707cb17e6c91971ee 024ef7becd36034 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +227 c5043aece9f017d318b9f7f1cf482db8 1 bc 227 c5043aece9f017d318b9f7f1cf482db8 c5043aece9f017d B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +504 8cad1b05c111f5c16ef8167c734068bc 1 da 504 8cad1b05c111f5c16ef8167c734068bc 2d3a542657dff34 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +107 e40dcd8dd2850fbd334941b55c0fac2b 1 10 107 e40dcd8dd2850fbd334941b55c0fac2b fcc6842c20a69b1 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +224 2c921f0a6ef62def001b63b23a29f945 1 1c 224 2c921f0a6ef62def001b63b23a29f945 2c921f0a6ef62de B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +324 4ca1f6c156a91662412792d01bbc44b6 1 81 324 4ca1f6c156a91662412792d01bbc44b6 4ca1f6c156a9166 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 2 1610307b826a861f0e99a1357ef5dcc2 10000 512ef7c688a2c8572d5e16f44e17e869 +322 0cb33ad1b82531916cfa68d9eadaa2a8 1 75 322 0cb33ad1b82531916cfa68d9eadaa2a8 0cb33ad1b825319 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 2 1610307b826a861f0e99a1357ef5dcc2 10000 512ef7c688a2c8572d5e16f44e17e869 +143 fab620957c25aeab4366ad3c71566116 1 e7 143 fab620957c25aeab4366ad3c71566116 fab620957c25aea N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +13 7e67758d01470959aebbf4b2c82f7d7c 2 a1 \N \N \N N \N \N \N \N 13 7e67758d01470959aebbf4b2c82f7d7c \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +516 1ac61e9893798a791cde6ea0447cd170 1 9a 516 1ac61e9893798a791cde6ea0447cd170 1ac61e9893798a7 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +333 83167e6fa26eb5343271db6778f183d8 1 75 333 83167e6fa26eb5343271db6778f183d8 83167e6fa26eb53 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +214 2fd70579e65de7d4af6b23d9fa19519b 1 01 214 2fd70579e65de7d4af6b23d9fa19519b 2fd70579e65de7d B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 13 7e062f1dcc551b1467bc92f88b92a0ef 10000 512ef7c688a2c8572d5e16f44e17e869 +407 d3f8a82f9f0a9ef11da12f044e12d669 1 8f 407 d3f8a82f9f0a9ef11da12f044e12d669 0b47b5e765d62bd C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +243 251d62dd46fa604693ebcd9ea3a60754 1 a3 243 251d62dd46fa604693ebcd9ea3a60754 251d62dd46fa604 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 14 b1f594ffdd6b01719e1208cfc211dda0 10000 512ef7c688a2c8572d5e16f44e17e869 +236 3cfe8f2a84ebc0a5e1707b4e50d2daf6 1 a7 236 3cfe8f2a84ebc0a5e1707b4e50d2daf6 3cfe8f2a84ebc0a B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +123 c2da2aca0b0b9198eaf9d35fe9c83766 1 5f 123 c2da2aca0b0b9198eaf9d35fe9c83766 c2da2aca0b0b919 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +501 1512741c3493826a58c162d5d2bb381d 1 7f 501 1512741c3493826a58c162d5d2bb381d 1512741c3493826 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +318 9df9f1156e86609b2ec294b065be043a 1 c4 318 9df9f1156e86609b2ec294b065be043a 9df9f1156e86609 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +105 2cceb0b5c65e259d2519ea446c87fb8c 1 03 105 2cceb0b5c65e259d2519ea446c87fb8c 2cceb0b5c65e259 A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +190 a08bda53eb33f86e1e4869a2af3232dc 1 8f 190 a08bda53eb33f86e1e4869a2af3232dc a08bda53eb33f86 N \N \N \N \N 10 4f2dc75f7df87f32daaf1a049066dedd \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +250 9f846038cf1e789a0b2adc7afc9e5820 1 15 250 9f846038cf1e789a0b2adc7afc9e5820 db71c09c4473941 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +52 4e7aa7442dc8fccc0997ee5add6de706 2 eb \N \N \N N \N \N \N \N 52 4e7aa7442dc8fccc0997ee5add6de706 \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +113 3349cfa2f06130cdb05c1f14da235e03 1 22 113 3349cfa2f06130cdb05c1f14da235e03 3349cfa2f06130c C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +146 48795f5fee9bedac7e86933442fd3a0f 1 79 146 48795f5fee9bedac7e86933442fd3a0f f7e4a98b7db3861 N \N \N \N \N 10 4f2dc75f7df87f32daaf1a049066dedd \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +211 bfd64a089b03558372aa05ecb073fff4 1 72 211 bfd64a089b03558372aa05ecb073fff4 bfd64a089b03558 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +144 2dc4b1947faf7f856cae0324b1ea82ce 1 3f 144 2dc4b1947faf7f856cae0324b1ea82ce 2dc4b1947faf7f8 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +125 7fd3501b939e155dc3fe071c01b5c08f 1 bf 125 7fd3501b939e155dc3fe071c01b5c08f 7fd3501b939e155 A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +300 57566997ecc042908c284a50714d0b67 1 aa 300 57566997ecc042908c284a50714d0b67 57566997ecc0429 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 2 1610307b826a861f0e99a1357ef5dcc2 10000 512ef7c688a2c8572d5e16f44e17e869 +314 aa794f3c1865ae26111ad7195c50e1f6 1 b9 314 aa794f3c1865ae26111ad7195c50e1f6 aa794f3c1865ae2 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +518 24ddaebbdb4135da03e8055c7b85f34a 1 7d 518 24ddaebbdb4135da03e8055c7b85f34a 24ddaebbdb4135d C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +301 f03b919de2cb8a36e9e404e0ad494627 1 e0 301 f03b919de2cb8a36e9e404e0ad494627 f03b919de2cb8a3 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +521 91924a0b38c5c672cd30086fabec48e2 1 59 521 91924a0b38c5c672cd30086fabec48e2 91924a0b38c5c67 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +11 1d4d18442904c3540ed53527479e8b8b 2 63 \N \N \N N \N \N \N \N 11 1d4d18442904c3540ed53527479e8b8b \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +511 2cdd125ec51d569ee30a1a589feb0954 1 39 511 2cdd125ec51d569ee30a1a589feb0954 2cdd125ec51d569 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +514 5856863c4571429f5b7b11d1fa4ffdb1 1 36 514 5856863c4571429f5b7b11d1fa4ffdb1 5856863c4571429 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +18 08f2292b806aa0ff2f1ab4c9750d9c9d 2 1c \N \N \N N \N \N \N \N 18 08f2292b806aa0ff2f1ab4c9750d9c9d \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +135 752e09164fe8314789a9592228f0d79c 1 84 135 752e09164fe8314789a9592228f0d79c 752e09164fe8314 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +252 e43a56959d58a1af6a4eb574ab9e6528 1 91 252 e43a56959d58a1af6a4eb574ab9e6528 cb3064182409da0 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +526 5c048b595cf128ceb182fc5fb5a5d1a3 1 4a 526 5c048b595cf128ceb182fc5fb5a5d1a3 5c048b595cf128c C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +237 b05fff4940c02ced50fdf99735e098df 1 5a 237 b05fff4940c02ced50fdf99735e098df b05fff4940c02ce C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 13 7e062f1dcc551b1467bc92f88b92a0ef 10000 512ef7c688a2c8572d5e16f44e17e869 +529 810e643a03a88638eb8d4c74b153d96d 1 3f 529 810e643a03a88638eb8d4c74b153d96d 810e643a03a8863 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +191 8aa35343093a481b286617263f234842 1 eb 191 8aa35343093a481b286617263f234842 8aa35343093a481 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +24 d672fae414c2d3f355cd36880c863d6f 2 fe \N \N \N N \N \N \N \N 24 d672fae414c2d3f355cd36880c863d6f \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +129 c8427c7736d60967ecc89afb99ae4b65 1 8c 129 c8427c7736d60967ecc89afb99ae4b65 5eb61fb9bcd17a7 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +2 34b2e1b68f14269bdc2455d1e0cccb2e 2 c1 \N \N \N N \N \N \N \N 2 34b2e1b68f14269bdc2455d1e0cccb2e \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +100 f20348cd8ac5ba4fca2aaa3e22f9c881 1 f3 100 f20348cd8ac5ba4fca2aaa3e22f9c881 f20348cd8ac5ba4 A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +201 cf11da476a9fc9481d298a824f805638 1 11 201 cf11da476a9fc9481d298a824f805638 cf11da476a9fc94 A 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 11 9b86666dca5a2ed46d7a8bb78e8a62ad 10000 512ef7c688a2c8572d5e16f44e17e869 +327 651ee8a0617682f985d20044eeec016c 1 9a 327 651ee8a0617682f985d20044eeec016c 651ee8a0617682f B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +225 5c809e9906b5c545224b1a2f25ddbc96 1 a9 225 5c809e9906b5c545224b1a2f25ddbc96 a7749be146d312b B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +404 913a3127f99130b7df68668bf1e100ee 1 1d 404 913a3127f99130b7df68668bf1e100ee 913a3127f99130b N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 40 ecc919b1c2b77740ffa77cda77176d07 4 5de01abf8969a7e70937b8bc9e1fbfa0 10000 512ef7c688a2c8572d5e16f44e17e869 +130 184959bf87b77479427ed53d6c70ebd4 1 28 130 184959bf87b77479427ed53d6c70ebd4 184959bf87b7747 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 7 efa32d1e971e9d0ed2553a66f1548e50 10000 512ef7c688a2c8572d5e16f44e17e869 +228 cdea6075efa225e2e4e3562bb9ea66c3 1 4e 228 cdea6075efa225e2e4e3562bb9ea66c3 cdea6075efa225e B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +134 30282a93380b4e7ababa727f40662a30 1 63 134 30282a93380b4e7ababa727f40662a30 30282a93380b4e7 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +311 1bece9d5e1aa32a40768f11de099980f 1 27 311 1bece9d5e1aa32a40768f11de099980f 1bece9d5e1aa32a B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +221 ac44917849d74d3c2600db7333d301af 1 3e 221 ac44917849d74d3c2600db7333d301af e7fbe9fc68a6cd7 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +23 15c59d7cfcabf6a8ad3c69dc8537e45c 2 b9 \N \N \N N \N \N \N \N 23 15c59d7cfcabf6a8ad3c69dc8537e45c \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +242 0154761b1c93a51bff3d20a0d53c00ab 1 42 242 0154761b1c93a51bff3d20a0d53c00ab 0154761b1c93a51 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +325 2469d71b0ba143433ca5732d5648b097 1 bc 325 2469d71b0ba143433ca5732d5648b097 2469d71b0ba1434 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +512 cf54e5fbddb1c8d7a65d1e0d3735f72f 1 10 512 cf54e5fbddb1c8d7a65d1e0d3735f72f cf54e5fbddb1c8d C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 5 59155a0c07f1932b45c944636b98e121 10000 512ef7c688a2c8572d5e16f44e17e869 +218 152080f754d9595d261660c937d55553 1 fa 218 152080f754d9595d261660c937d55553 152080f754d9595 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 11 9b86666dca5a2ed46d7a8bb78e8a62ad 10000 512ef7c688a2c8572d5e16f44e17e869 +338 5c9f723cfcbceddb9c55a0d9994d4fa6 1 18 338 5c9f723cfcbceddb9c55a0d9994d4fa6 5c9f723cfcbcedd N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +141 07e9c77ae7a4342a00e7697e32502186 1 72 141 07e9c77ae7a4342a00e7697e32502186 07e9c77ae7a4342 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 1 6479e0417e03c6981e3e058930cf5441 10000 512ef7c688a2c8572d5e16f44e17e869 +329 ca7ba13d1260a4d677eadbe24fc95e4f 1 b1 329 ca7ba13d1260a4d677eadbe24fc95e4f ca7ba13d1260a4d B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 30 dc06162350dd5c2d97f13dea0264a61a 3 904ccc9c77ff01a6d6e5cf55d1be50f8 10000 512ef7c688a2c8572d5e16f44e17e869 +132 9b6739233ac439e57a6003e39c3a9325 1 4d 132 9b6739233ac439e57a6003e39c3a9325 9b6739233ac439e C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 9 cf70935129ffddee8aa78e03d72d2623 10000 512ef7c688a2c8572d5e16f44e17e869 +138 36fcb8a18ad5b78ea74131b230de40ae 1 60 138 36fcb8a18ad5b78ea74131b230de40ae 36fcb8a18ad5b78 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 8 4a4117283d87ddc9cad762448bd0dbb9 10000 512ef7c688a2c8572d5e16f44e17e869 +147 1d8043230615ce2a731efc5c1a34935e 1 0e 147 1d8043230615ce2a731efc5c1a34935e 1d8043230615ce2 N \N \N \N \N 10 4f2dc75f7df87f32daaf1a049066dedd \N \N 10000 512ef7c688a2c8572d5e16f44e17e869 +508 b2c563418b36455f3e620a86ce226387 1 ac 508 b2c563418b36455f3e620a86ce226387 41c4fd7c8e1a187 C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +509 4bc0d60736367d85fd771171ba02692a 1 d5 509 4bc0d60736367d85fd771171ba02692a 4bc0d60736367d8 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 50 e0d829a023d4407c9ddd6ebcf2037202 6 e2beaebbb707494ef8742001c7911e66 10000 512ef7c688a2c8572d5e16f44e17e869 +999 be084b4eb5b3c835cc96991e2f22fbb1 1 3b 999 be084b4eb5b3c835cc96991e2f22fbb1 f5d5ee1aa740d65 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 999 be084b4eb5b3c835cc96991e2f22fbb1 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +217 b93dbc808122ffa937e1c789ff7e71a9 1 83 217 b93dbc808122ffa937e1c789ff7e71a9 b93dbc808122ffa C 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 14 b1f594ffdd6b01719e1208cfc211dda0 10000 512ef7c688a2c8572d5e16f44e17e869 +137 486a4f5303807c02275f28b46a4e79cd 1 bb 137 486a4f5303807c02275f28b46a4e79cd 486a4f5303807c0 N 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 10 4f2dc75f7df87f32daaf1a049066dedd 10 6ace0f5def42a2d78dd40e3ff384f27a 10000 512ef7c688a2c8572d5e16f44e17e869 +205 aefac68184f1b4a7dbc57d35a30665b2 1 da 205 aefac68184f1b4a7dbc57d35a30665b2 b02605efe8ce838 B 0 5982adce3bd1f8a983240b10ef190ab2 0 5982adce3bd1f8a983240b10ef190ab2 20 00a58e6bc23b6232d61e077ae2059604 12 4c6ee2bc37257a2a073630221c2d9c4c 10000 512ef7c688a2c8572d5e16f44e17e869 +\. + +select konst.dim_elem_bezei as natcat_zone_elem_bezei, + konst.dim_elem_bezei as natcat_zone_elem_id, + case when konst.dim_elem_lvl = 2 then (select land.land_nr from test_sf_dd_land_vm land where land.land_id=konst.dim_elem_bezei) end as land_nr +from + test_r_rvv_stada_dim_konst konst ,test_r_rvv_stada_dim_konst gesamt +where + konst.dim_bezei = 'NatCat-Zone' and gesamt.dim_bezei = 'NatCat-Zone' and gesamt.dim_elem_lvl = 0; + +-- test queries that should run on the master +create table mpp_bfv_1(col1 int, col2 text, col3 numeric); + +-- this cannot go to the _setup file, because it is not propagated here +set optimizer_enable_indexscan = off; +set optimizer_enable_master_only_queries = on; + +-- query that mentions no tables should have no motions +select count_operator('select substr(''abc'', 2)', 'Motion'); + +-- queries that mention only master only tables (such as catalog tables) +-- should have no motions +select count_operator('select relname from pg_class where relname = ''pg_class''', 'Motion'); + +select count_operator('select attname from pg_attribute where attname = ''attstorage''', 'Motion'); + +-- queries with master-only TVFs and no distributed trabes have no motions +select count_operator('select * from generate_series(1,10)', 'Motion'); + +-- start_ignore +-- queries over distributed tables should have motions +select count_operator('select col2 from mpp_bfv_1;', 'Motion'); +-- end_ignore + +-- this cannot go to the _teardown file, because it is not propagated here +reset optimizer_enable_indexscan; + +create table mpp_bfv_2(a int, b text, primary key (a)); + +-- stop falling back to planner when catalog functions are encountered + +explain select pg_column_size('mpp_bfv_2'); + +explain select pg_lock_status(); + +select pg_get_constraintdef(pg_constraint.oid) from pg_constraint, pg_class where conrelid=pg_class.oid and pg_class.relname='mpp_bfv_2'; + +-- +-- Test detoasting of a long text field, when it comes directly from the QD +-- node without Motion nodes. +-- + +-- create a function with a very long function body, so that it gets +-- toasted (or compressed). +CREATE FUNCTION function_with_long_body() RETURNS text LANGUAGE sql +AS $function$ +select $embeddedtext$ +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123456789012345 +$embeddedtext$::text; +$function$; + +-- Check that it's detoasted correctly when it's sent to the client, in +-- printtup() +select prosrc from pg_proc where proname = 'function_with_long_body'; + + +-- +-- Check for assertion failure that happened in VACUUM FULL of +-- pg_stat_last_operation. The VACUUM FULL of reindexing its indexes +-- inserted an entry to pg_stat_last_operation, but there's an assertion +-- that you don't try to insert into an index that's currently being +-- reindexed, or pending reindexing. This no longer happens, because +-- pg_stat_last_operation now only has one index, so that there is no +-- pending indexes left for it after indexing the first one. +-- + +-- first, delete all existing entries on pg_stat_last_operation, for the +-- table and its indexes. Otherwise, the update might be a HOT update, +-- and not touch the indexes. +set allow_system_table_mods=on; +delete from pg_stat_last_operation + where classid='pg_class'::regclass and objid::regclass::text like 'pg_stat%last%'; +set allow_system_table_mods=off; + +-- VACUUM FULL should insert an entry, for building the index after rebuilding +-- the heap. +vacuum full pg_stat_last_operation; +select classid::regclass, objid::regclass, staactionname, stasubtype from pg_stat_last_operation + where classid='pg_class'::regclass and objid::regclass::text like 'pg_stat%last%' and stasubtype != 'AUTO'; diff --git a/src/test/singlenode_regress/sql/bfv_dd.sql b/src/test/singlenode_regress/sql/bfv_dd.sql new file mode 100644 index 00000000000..0dbd3eb51cd --- /dev/null +++ b/src/test/singlenode_regress/sql/bfv_dd.sql @@ -0,0 +1,359 @@ +-- +-- Direct Dispatch Test when optimizer is on +-- +-- start_ignore +set optimizer_log=on; +-- end_ignore + +set test_print_direct_dispatch_info=on; + +set gp_autostats_mode = 'None'; + +-- create table with distribution on a single table + +create table dd_singlecol_1(a int, b int); +insert into dd_singlecol_1 select g, g%15 from generate_series(1,100) g; +insert into dd_singlecol_1 values(null, null); + +analyze dd_singlecol_1; + +-- ctas tests +create table dd_ctas_1 as select * from dd_singlecol_1 where a=1; +create table dd_ctas_2 as select * from dd_singlecol_1 where a is NULL; + +select * from dd_ctas_1; +select * from dd_ctas_2; + +drop table dd_ctas_1; +drop table dd_ctas_2; + +-- direct dispatch and queries having with clause + +with cte as (select * from dd_singlecol_1 where a=1) select * from cte; + +with cte as (select * from dd_singlecol_1) select * from cte where a=1; + +with cte1 as (with cte2 as (select * from dd_singlecol_1) select * from cte2 where a=1) select * from cte1; + +-- negative tests: joins not supported + +with cte as (select * from dd_singlecol_1) select * from cte c1, cte c2 where c1.a=1 and c2.a=1 and c1.a=c2.a limit 10; + +-- cte with function scans +with cte as (select generate_series(1,10) g) select * from dd_singlecol_1 t1, cte where t1.a=cte.g and t1.a=1 limit 100; + +-- single column distr key + +select * from dd_singlecol_1 where a in (10,11,12); + +select * from dd_singlecol_1 where a=10 or a=11 or a=12; + +select * from dd_singlecol_1 where a is null or a=1; + +-- projections and disjunction + +select b from dd_singlecol_1 where a=1 or a=2; + +-- single column distr key, values hash to the same segment + +select * from dd_singlecol_1 where a=10 or a=11; + +select * from dd_singlecol_1 where a in (10, 11); + +select * from dd_singlecol_1 where a is null or a=2; + +select * from dd_singlecol_1 where (a,b) in ((10,2),(11,3)); + +select * from dd_singlecol_1 where a between 10 and 11; + +-- partitioned tables + +create table dd_part_singlecol(a int, b int, c int) partition by range (b) +(start(1) end(100) every (20), default partition extra); + +insert into dd_part_singlecol select g, g*2, g*3 from generate_series(1,49) g; +insert into dd_part_singlecol values (NULL, NULL); + +-- disjunction with partitioned tables + +select * from dd_part_singlecol where a in (10,11,12); + +select * from dd_part_singlecol where a=10 or a=11 or a=12; + +select * from dd_part_singlecol where a is null or a=1; + +-- simple predicates +select * from dd_part_singlecol where a=1; + +select * from dd_part_singlecol where a=1 and b=2; + +select * from dd_part_singlecol where a = 1 and b<10; + +select * from dd_part_singlecol where a is null; + +select * from dd_part_singlecol where a is null and b is null; + +-- complex queries +-- projections +select b from dd_part_singlecol where a=1; + +select a+b from dd_part_singlecol where a=1; + +select 'one' from dd_part_singlecol where a=1; + +select a, 'one' from dd_part_singlecol where a=1; + +-- group by and sort +select a, count(*) from dd_part_singlecol where a=1 group by a; + +select a, count(*) from dd_part_singlecol where a=1 group by a order by a; + +-- indexes +create table dd_singlecol_idx(a int, b int, c int); +create index sc_idx_b on dd_singlecol_idx(b); +create index sc_idx_bc on dd_singlecol_idx(b,c); + +insert into dd_singlecol_idx select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_idx values(null, null); + +create table dd_singlecol_idx2(a int, b int, c int); +create index sc_idx_a on dd_singlecol_idx2(a); + +insert into dd_singlecol_idx2 select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_idx2 values(null, null); + +analyze dd_singlecol_idx; +analyze dd_singlecol_idx2; + +-- disjunction with index scans + +select * from dd_singlecol_idx where (a=1 or a=2) and b<2; + +select 'one' from dd_singlecol_idx where (a=1 or a=2) and b=1; + +select a, count(*) from dd_singlecol_idx where (a=1 or a=2) and b=1 group by a; + +select count(*) from dd_singlecol_idx; + +-- create table with bitmap indexes +create table dd_singlecol_bitmap_idx(a int, b int, c int); +create index sc_bitmap_idx_b on dd_singlecol_bitmap_idx using bitmap (b); +create index sc_bitmap_idx_c on dd_singlecol_bitmap_idx using bitmap (c); + +insert into dd_singlecol_bitmap_idx select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_bitmap_idx values(null, null); + +analyze dd_singlecol_bitmap_idx; + +-- disjunction with bitmap index scans +select * from dd_singlecol_bitmap_idx where (a=1 or a=2) and b<2; + +select * from dd_singlecol_bitmap_idx where (a=1 or a=2) and b=2 and c=2; + +select * from dd_singlecol_bitmap_idx where (a=1 or a=2) and (b=2 or c=2); + +select * from dd_singlecol_bitmap_idx where a<5 and b=1; + +-- conjunction with bitmap indexes +select * from dd_singlecol_bitmap_idx where a=1 and b=0; + +select * from dd_singlecol_bitmap_idx where a=1 and b<3; + +select * from dd_singlecol_bitmap_idx where a=1 and b>=1 and c<2; + +select * from dd_singlecol_bitmap_idx where a=1 and b=3 and c=3; + +-- bitmap indexes on part tables +create table dd_singlecol_part_bitmap_idx(a int, b int, c int) + +partition by range (b) +(start(1) end(100) every (20), default partition extra);; +create index sc_part_bitmap_idx_b on dd_singlecol_part_bitmap_idx using bitmap(b); + +insert into dd_singlecol_part_bitmap_idx select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_part_bitmap_idx values(null, null); + +analyze dd_singlecol_part_bitmap_idx; + +-- bitmap indexes on partitioned tables +select * from dd_singlecol_part_bitmap_idx where a=1 and b=0; + +select * from dd_singlecol_part_bitmap_idx where a=1 and b<3; + +select * from dd_singlecol_part_bitmap_idx where a=1 and b>=1 and c=3; + +-- bitmap bool op +select * from dd_singlecol_bitmap_idx +where a=1 and b=3 and c=3; + +-- multi column index +create table dd_multicol_idx(a int, b int, c int); +create index mc_idx_b on dd_multicol_idx(c); +insert into dd_multicol_idx +select g, g%5, g%5 from generate_series(1,100) g; +insert into dd_multicol_idx values(null, null); +analyze dd_multicol_idx; + +select count(*) from dd_multicol_idx; + +-- simple index predicates + +select * from dd_singlecol_idx where a=1 and b=0; + +select * from dd_singlecol_idx where a=1 and b<3; + +select * from dd_singlecol_idx where a<5 and b=1; + +select * from dd_singlecol_idx where a=1 and b>=1 and c<2; + +select * from dd_singlecol_idx2 where a=1; + +select * from dd_singlecol_idx2 where a=1 and b>=1; + +-- projection +select 'one' from dd_singlecol_idx where a=1 and b=1; + +select a+b from dd_singlecol_idx where a=1 and b=1; + +-- group by +select a, count(*) from dd_singlecol_idx where a=1 and b=1 group by a; + +-- multicol +select * from dd_multicol_idx where a=1 and b=1 and c<5; + +select * from dd_multicol_idx where (a=10 or a=11) and (b=1 or b=5) and c=1; + +-- indexes on partitioned tables +create table dd_singlecol_part_idx(a int, b int, c int) + +partition by range (b) +(start(1) end(100) every (20), default partition extra);; +create index sc_part_idx_b on dd_singlecol_part_idx(b); + +insert into dd_singlecol_part_idx select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_part_idx values(null, null); + +create table dd_singlecol_part_idx2(a int, b int, c int) + +partition by range (b) +(start(1) end(100) every (20), default partition extra);; +create index sc_part_idx_a on dd_singlecol_part_idx2(a); + +insert into dd_singlecol_part_idx2 select g, g%5,g%5 from generate_series(1,100) g; +insert into dd_singlecol_part_idx2 values(null, null); + +analyze dd_singlecol_part_idx; +analyze dd_singlecol_part_idx2; + +-- indexes on partitioned tables +select * from dd_singlecol_part_idx where a=1 and b>0; + +select * from dd_singlecol_part_idx2 where a=1; + +select * from dd_singlecol_part_idx2 where a=1 and b>=1; + +create table dd_singlecol_2(a int, b int); +create table dd_singlecol_dropped(a int, b int, c int); +alter table dd_singlecol_dropped drop column a; + +insert into dd_singlecol_2 +select g, g%10 from generate_series(1,100) g; + +insert into dd_singlecol_dropped +select g, g%5 from generate_series(1,100) g; + +-- aggregates +select count(*) from dd_singlecol_1; + +select count(*) from dd_singlecol_2; + +select count(*) from dd_singlecol_dropped; + +-- simple predicates +select * from dd_singlecol_1 where a=1; + +select * from dd_singlecol_2 where b=1; + +select * from dd_singlecol_dropped where b=1; + +select * from dd_singlecol_1 where a = 1 and b=2; + +select * from dd_singlecol_1 where a = 1 and b<10; + +select * from dd_singlecol_1 where a is null; + +-- projections +select b from dd_singlecol_1 where a=1; + +select a+b from dd_singlecol_1 where a=1; + +select 'one' from dd_singlecol_1 where a=1; + +select a, 'one' from dd_singlecol_1 where a=1; + +-- group by and sort +select a, count(*) from dd_singlecol_1 where a=1 group by a; + +select a, count(*) from dd_singlecol_1 where a=1 group by a order by a; + +-- inner joins +select * from dd_singlecol_1 t1, dd_singlecol_2 t2 where t1.a=t2.a and t1.a=1; + +select * from dd_singlecol_1 t1, dd_singlecol_2 t2 where t1.a=t2.b and t1.a=1; + +select * from dd_singlecol_1 t1, dd_singlecol_2 t2 where t1.b>t2.a and t1.a=1; + +-- outer joins +select * from dd_singlecol_1 t1 left outer join dd_singlecol_2 t2 on (t1.a=t2.a) where t1.a=1; + +select * from dd_singlecol_1 t1 left outer join dd_singlecol_2 t2 on (t1.a=t2.b) where t1.a=1 and t2.b=1; + +select * from dd_singlecol_1 t1 left outer join dd_singlecol_2 t2 on (t1.b=t2.b) where t1.a=1; + +select * from dd_singlecol_2 t2 left outer join dd_singlecol_1 t1 on (t1.b=t2.b) where t1.a=1; + +-- subqueries + +select * from dd_singlecol_1 t1 where a=1 and b < (select count(*) from dd_singlecol_2 t2 where t2.a=t1.a); + +select * from dd_singlecol_1 t1 where a=1 and b in (select count(*) from dd_singlecol_2 t2 where t2.a<=t1.a); + +select t1.a, t1.b, (select sum(t2.a+t2.b) from dd_singlecol_2 t2 where t2.b=1) from dd_singlecol_1 t1 where t1.a=1; + +-- joins with function scans + +select * from dd_singlecol_1 t1, generate_series(1,10) g where t1.a=g.g and t1.a=1 limit 10; + +-- negative cases + +-- unsupported predicates +select * from dd_singlecol_1 where a>1 and a<5; + +select * from dd_singlecol_1 where a=1 or b=5; + +-- group by and sort +select b, count(*) from dd_singlecol_1 where a=1 group by b; + +select b, count(*) from dd_singlecol_1 where a=1 group by b order by b; + +-- randomly distributed tables +create table dd_random(a int, b int); +insert into dd_random select g, g%15 from generate_series(1, 100) g; + +-- non hash distributed tables +select * from dd_random where a=1; + +drop table dd_singlecol_1; +drop table dd_ctas_1; +drop table dd_ctas_2; +drop table dd_part_singlecol; +drop table dd_singlecol_idx; +drop table dd_singlecol_idx2; +drop table dd_singlecol_bitmap_idx; +drop table dd_singlecol_part_bitmap_idx; +drop table dd_multicol_idx; +drop table dd_singlecol_part_idx; +drop table dd_singlecol_part_idx2; +drop table dd_singlecol_2; +drop table dd_singlecol_dropped; +drop table dd_random; diff --git a/src/test/singlenode_regress/sql/bfv_dd_multicolumn.sql b/src/test/singlenode_regress/sql/bfv_dd_multicolumn.sql new file mode 100644 index 00000000000..4608d41e85a --- /dev/null +++ b/src/test/singlenode_regress/sql/bfv_dd_multicolumn.sql @@ -0,0 +1,94 @@ +-- +-- Direct Dispatch Test when optimizer is on +-- +-- start_ignore +set optimizer_log=on; +set optimizer_force_multistage_agg=on; +-- end_ignore + +set test_print_direct_dispatch_info=on; + +set gp_autostats_mode = 'None'; + +-- composite keys +create table dd_multicol_1(a int, b int); +create table dd_multicol_2(a int, b int); + +insert into dd_multicol_1 select g, g%2 from generate_series(1, 100) g; +insert into dd_multicol_1 values(null, null); +insert into dd_multicol_1 values(1, null); +insert into dd_multicol_1 values(null, 1); + +analyze dd_multicol_1; + +insert into dd_multicol_2 select g, g%2 from generate_series(1, 100) g; +insert into dd_multicol_2 values(null, null); +insert into dd_multicol_2 values(1, null); +insert into dd_multicol_2 values(null, 1); + +-- composite distr key + +select * from dd_multicol_1 where a in (1,3) and b in (1,2); + +select * from dd_multicol_1 where a = 1 and b in (1,2); + +select * from dd_multicol_1 where (a=1 and b=1) or (a=2 and b=2); + +select * from dd_multicol_1 where (a=1 or a=3) and (b=1 or b=2); + +select * from dd_multicol_1 where a is null or a=1; + +select * from dd_multicol_1 where (a is null or a=1) and b=2; + +select * from dd_multicol_1 where (a,b) in ((1,2),(3,4)); + +-- composite distr key: projections + +select b from dd_multicol_1 where (a=1 or a=3) and (b=1 or b=2); + +select count(*) from dd_multicol_1; +select count(*) from dd_multicol_2; + +-- simple predicates +select * from dd_multicol_1 where a=1 and b=1; + +select * from dd_multicol_1 where a=1 and b=2; + +select * from dd_multicol_1 where b=1 and a=2; + +select * from dd_multicol_1 where a is null and b=1; + +select * from dd_multicol_1 where a is null and b is null; + +select * from dd_multicol_2 where a=1 and b=1; + +select * from dd_multicol_2 where a=1 and b=2; + +select * from dd_multicol_2 where b=1 and a=2; + +select * from dd_multicol_2 where a is null and b=1; + +select * from dd_multicol_2 where a is null and b is null; + +-- projections +select b from dd_multicol_1 where a=1 and b=1; + +select a+b from dd_multicol_1 where a=1 and b=1; + +select 'one' from dd_multicol_1 where a=1 and b=1; + +select a, 'one' from dd_multicol_1 where a=1 and b=1; + +-- group by and sort +select a, count(*) from dd_multicol_1 where a=1 and b=1 group by a,b; + +select a, count(*) from dd_multicol_1 where a=1 and b=1 group by a,b order by a,b; + +-- incomplete specification +select * from dd_multicol_1 where a=1; + +select * from dd_multicol_1 where a>80 and b=1; + +select * from dd_multicol_1 where a<=5 and b>0; + +reset optimizer_force_multistage_agg; diff --git a/src/test/singlenode_regress/sql/bfv_dd_types.sql b/src/test/singlenode_regress/sql/bfv_dd_types.sql new file mode 100644 index 00000000000..7bd089f029a --- /dev/null +++ b/src/test/singlenode_regress/sql/bfv_dd_types.sql @@ -0,0 +1,130 @@ +-- +-- Direct Dispatch Test when optimizer is on +-- +-- start_ignore +set optimizer_log=on; +set optimizer_print_missing_stats = off; +-- end_ignore + +set test_print_direct_dispatch_info=on; + +set gp_autostats_mode = 'None'; + +-- test direct dispatch for different data types + +CREATE TABLE direct_test_type_int2 (id int2); +CREATE TABLE direct_test_type_int4 (id int4); +CREATE TABLE direct_test_type_int8 (id int8); + +create table direct_test_type_real (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_smallint (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_boolean2 (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_double (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_date (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_numeric (real1 real, smallint1 smallint, boolean1 boolean, int1 int, double1 double precision, date1 date, numeric1 numeric); +create table direct_test_type_bit (x bit); +create table direct_test_type_bpchar (x bpchar); +create table direct_test_type_bytea (x bytea); +create table direct_test_type_cidr (x cidr); +create table direct_test_type_inet (x inet); +create table direct_test_type_macaddr (x macaddr); +create table direct_test_type_varbit (x varbit); + +INSERT INTO direct_test_type_int2 VALUES (1); +INSERT INTO direct_test_type_int4 VALUES (1); +INSERT INTO direct_test_type_int8 VALUES (1); + +insert into direct_test_type_real values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_smallint values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_boolean2 values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_double values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_date values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_numeric values (8,8,true,8,8,'2008-08-08',8.8); +insert into direct_test_type_bit values('1'); +insert into direct_test_type_bpchar values('abs'); +insert into direct_test_type_bytea values('greenplum'); +insert into direct_test_type_cidr values('68.44.55.111'); +insert into direct_test_type_inet values('68.44.55.111'); +insert into direct_test_type_macaddr values('12:34:56:78:90:ab'); +insert into direct_test_type_varbit values('0101010'); + + +-- @author antovl +-- @created 2014-11-07 12:00:00 +-- @modified 2014-11-07 12:00:00 +-- @optimizer_mode on +-- @gpopt 1.510 +-- @product_version gpdb: [4.3.3-], [5.0-], hawq: [1.2.2.0-] +-- @tags bfv +-- @gucs optimizer_enable_constant_expression_evaluation=on; + +select * from direct_test_type_real where real1 = 8::real; +select * from direct_test_type_smallint where smallint1 = 8::smallint; +select * from direct_test_type_double where double1 = 8; +select * from direct_test_type_date where date1 = '2008-08-08'; +select * from direct_test_type_numeric where numeric1 = 8.8; +select * from direct_test_type_bit where x = '1'; +select * from direct_test_type_bpchar where x = 'abs'; +select * from direct_test_type_bytea where x = 'greenplum'; + +-- TODO: this currently not directly dispatched (AGL-1246) +select * from direct_test_type_cidr where x = '68.44.55.111'; + +select * from direct_test_type_inet where x = '68.44.55.111'; +select * from direct_test_type_macaddr where x = '12:34:56:78:90:ab'; +select * from direct_test_type_varbit where x = '0101010'; + +SELECT * FROM direct_test_type_int2 WHERE id = 1::int2; +SELECT * FROM direct_test_type_int2 WHERE id = 1::int4; +SELECT * FROM direct_test_type_int2 WHERE id = 1::int8; + +SELECT * FROM direct_test_type_int2 WHERE 1::int2 = id; +SELECT * FROM direct_test_type_int2 WHERE 1::int4 = id; +SELECT * FROM direct_test_type_int2 WHERE 1::int8 = id; + +SELECT * FROM direct_test_type_int4 WHERE id = 1::int2; +SELECT * FROM direct_test_type_int4 WHERE id = 1::int4; +SELECT * FROM direct_test_type_int4 WHERE id = 1::int8; + +SELECT * FROM direct_test_type_int4 WHERE 1::int2 = id; +SELECT * FROM direct_test_type_int4 WHERE 1::int4 = id; +SELECT * FROM direct_test_type_int4 WHERE 1::int8 = id; + +SELECT * FROM direct_test_type_int8 WHERE id = 1::int2; +SELECT * FROM direct_test_type_int8 WHERE id = 1::int4; +SELECT * FROM direct_test_type_int8 WHERE id = 1::int8; +SELECT * FROM direct_test_type_int8 WHERE 1::int2 = id; +SELECT * FROM direct_test_type_int8 WHERE 1::int4 = id; +SELECT * FROM direct_test_type_int8 WHERE 1::int8 = id; + +-- overflow test +SELECT * FROM direct_test_type_int2 WHERE id = 32768::int4; +SELECT * FROM direct_test_type_int2 WHERE id = -32769::int4; + +SELECT * FROM direct_test_type_int2 WHERE 32768::int4 = id; +SELECT * FROM direct_test_type_int2 WHERE -32769::int4 = id; + +SELECT * FROM direct_test_type_int2 WHERE id = 2147483648::int8; +SELECT * FROM direct_test_type_int2 WHERE id = -2147483649::int8; + +SELECT * FROM direct_test_type_int2 WHERE 2147483648::int8 = id; +SELECT * FROM direct_test_type_int2 WHERE -2147483649::int8 = id; + +drop table direct_test_type_real; +drop table direct_test_type_smallint; +drop table direct_test_type_double; +drop table direct_test_type_date; +drop table direct_test_type_numeric; +drop table direct_test_type_int2; +drop table direct_test_type_int4; +drop table direct_test_type_int8; + +drop table direct_test_type_bit; +drop table direct_test_type_bpchar; +drop table direct_test_type_bytea; +drop table direct_test_type_cidr; +drop table direct_test_type_inet; +drop table direct_test_type_macaddr; +drop table direct_test_type_varbit; +drop table direct_test_type_boolean2; +reset test_print_direct_dispatch_info; diff --git a/src/test/singlenode_regress/sql/bfv_index.sql b/src/test/singlenode_regress/sql/bfv_index.sql new file mode 100644 index 00000000000..c9cf6256342 --- /dev/null +++ b/src/test/singlenode_regress/sql/bfv_index.sql @@ -0,0 +1,352 @@ +-- tests index filter with outer refs +drop table if exists bfv_tab1; + +CREATE TABLE bfv_tab1 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); + +create index bfv_tab1_idx1 on bfv_tab1 using btree(unique1); +-- GPDB_12_MERGE_FIXME: Non default collation +explain select * from bfv_tab1, (values(147, 'RFAAAA'), (931, 'VJAAAA')) as v (i, j) + WHERE bfv_tab1.unique1 = v.i and bfv_tab1.stringu1 = v.j; + +set gp_enable_relsize_collection=on; +-- GPDB_12_MERGE_FIXME: Non default collation +explain select * from bfv_tab1, (values(147, 'RFAAAA'), (931, 'VJAAAA')) as v (i, j) + WHERE bfv_tab1.unique1 = v.i and bfv_tab1.stringu1 = v.j; + +-- Test that we do not choose to perform an index scan if indisvalid=false. +create table bfv_tab1_with_invalid_index (like bfv_tab1 including indexes); +set allow_system_table_mods=on; +update pg_index set indisvalid=false where indrelid='bfv_tab1_with_invalid_index'::regclass; +reset allow_system_table_mods; +explain select * from bfv_tab1_with_invalid_index where unique1>42; +-- Cannot currently upgrade table with invalid index +-- (see https://github.com/greenplum-db/gpdb/issues/10805). +drop table bfv_tab1_with_invalid_index; + +reset gp_enable_relsize_collection; + +--start_ignore +DROP TABLE IF EXISTS bfv_tab2_facttable1; +DROP TABLE IF EXISTS bfv_tab2_dimdate; +DROP TABLE IF EXISTS bfv_tab2_dimtabl1; +--end_ignore + +-- Bug-fix verification for MPP-25537: PANIC when bitmap index used in ORCA select +CREATE TABLE bfv_tab2_facttable1 ( +col1 integer, +wk_id smallint, +id integer +) +with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=5) +partition by range (wk_id) ( +start (1::smallint) END (20::smallint) inclusive every (1), +default partition dflt +) +; + +insert into bfv_tab2_facttable1 select col1, col1, col1 from (select generate_series(1,20) col1)a; + +CREATE TABLE bfv_tab2_dimdate ( +wk_id smallint, +col2 date +) +; + +insert into bfv_tab2_dimdate select col1, current_date - col1 from (select generate_series(1,20,2) col1)a; + +CREATE TABLE bfv_tab2_dimtabl1 ( +id integer, +col2 integer +) +; + +insert into bfv_tab2_dimtabl1 select col1, col1 from (select generate_series(1,20,3) col1)a; + +CREATE INDEX idx_bfv_tab2_facttable1 on bfv_tab2_facttable1 (id); + +--start_ignore +set optimizer_analyze_root_partition to on; +--end_ignore + +ANALYZE bfv_tab2_facttable1; +ANALYZE bfv_tab2_dimdate; +ANALYZE bfv_tab2_dimtabl1; + +SELECT count(*) +FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1 +WHERE ft.wk_id = dt.wk_id +AND ft.id = dt1.id; + +explain SELECT count(*) +FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1 +WHERE ft.wk_id = dt.wk_id +AND ft.id = dt1.id; + +explain SELECT count(*) +FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1 +WHERE ft.wk_id = dt.wk_id +AND ft.id = dt1.id; + +-- start_ignore +create language plpython3u; +-- end_ignore + +create or replace function count_index_scans(explain_query text) returns int as +$$ +rv = plpy.execute(explain_query) +search_text = 'Index Scan' +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; + +DROP TABLE bfv_tab1; +DROP TABLE bfv_tab2_facttable1; +DROP TABLE bfv_tab2_dimdate; +DROP TABLE bfv_tab2_dimtabl1; + +-- pick index scan when query has a relabel on the index key: non partitioned tables + +set enable_seqscan = off; + +-- start_ignore +drop table if exists Tab23383; +-- end_ignore + +create table Tab23383(a int, b varchar(20)); +insert into Tab23383 select g,g from generate_series(1,1000) g; +create index Tab23383_b on Tab23383(b); + +-- start_ignore +select disable_xform('CXformGet2TableScan'); +-- end_ignore + +select count_index_scans('explain select * from Tab23383 where b=''1'';'); +select * from Tab23383 where b='1'; + +select count_index_scans('explain select * from Tab23383 where ''1''=b;'); +select * from Tab23383 where '1'=b; + +select count_index_scans('explain select * from Tab23383 where ''2''> b order by a limit 10;'); +select * from Tab23383 where '2'> b order by a limit 10; + +select count_index_scans('explain select * from Tab23383 where b between ''1'' and ''2'' order by a limit 10;'); +select * from Tab23383 where b between '1' and '2' order by a limit 10; + +-- predicates on both index and non-index key +select count_index_scans('explain select * from Tab23383 where b=''1'' and a=''1'';'); +select * from Tab23383 where b='1' and a='1'; + +--negative tests: no index scan plan possible, fall back to planner +select count_index_scans('explain select * from Tab23383 where b::int=''1'';'); + +drop table Tab23383; + +-- pick index scan when query has a relabel on the index key: partitioned tables +-- start_ignore +drop table if exists Tbl23383_partitioned; +-- end_ignore + +create table Tbl23383_partitioned(a int, b varchar(20), c varchar(20), d varchar(20)) +partition by range(a) +(partition p1 start(1) end(500), +partition p2 start(500) end(1001)); +insert into Tbl23383_partitioned select g,g,g,g from generate_series(1,1000) g; +create index idx23383_b on Tbl23383_partitioned(b); + +-- heterogenous indexes +create index idx23383_c on Tbl23383_partitioned_1_prt_p1(c); +create index idx23383_cd on Tbl23383_partitioned_1_prt_p2(c,d); +set optimizer_enable_dynamictablescan = off; +select count_index_scans('explain select * from Tbl23383_partitioned where b=''1'''); +select * from Tbl23383_partitioned where b='1'; + +select count_index_scans('explain select * from Tbl23383_partitioned where ''1''=b'); +select * from Tbl23383_partitioned where '1'=b; + +select count_index_scans('explain select * from Tbl23383_partitioned where ''2''> b order by a limit 10;'); +select * from Tbl23383_partitioned where '2'> b order by a limit 10; + +select count_index_scans('explain select * from Tbl23383_partitioned where b between ''1'' and ''2'' order by a limit 10;'); +select * from Tbl23383_partitioned where b between '1' and '2' order by a limit 10; + +-- predicates on both index and non-index key +select count_index_scans('explain select * from Tbl23383_partitioned where b=''1'' and a=''1'';'); +select * from Tbl23383_partitioned where b='1' and a='1'; + +--negative tests: no index scan plan possible, fall back to planner +select count_index_scans('explain select * from Tbl23383_partitioned where b::int=''1'';'); + +-- heterogenous indexes +select count_index_scans('explain select * from Tbl23383_partitioned where c=''1'';'); +select * from Tbl23383_partitioned where c='1'; + +-- start_ignore +drop table Tbl23383_partitioned; +-- end_ignore + +reset enable_seqscan; + +-- negative test: due to non compatible cast and CXformGet2TableScan disabled no index plan possible, fallback to planner + +-- start_ignore +drop table if exists tbl_ab; +-- end_ignore + +create table tbl_ab(a int, b int); +create index idx_ab_b on tbl_ab(b); + +-- start_ignore +select disable_xform('CXformGet2TableScan'); +-- end_ignore + +explain select * from tbl_ab where b::oid=1; + +drop table tbl_ab; +drop function count_index_scans(text); +-- start_ignore +select enable_xform('CXformGet2TableScan'); +-- end_ignore + +-- +-- Check that ORCA can use an index for joins on quals like: +-- +-- indexkey CMP expr +-- expr CMP indexkey +-- +-- where expr is a scalar expression free of index keys and may have outer +-- references. +-- +create table nestloop_x (i int, j int); +create table nestloop_y (i int, j int); +insert into nestloop_x select g, g from generate_series(1, 20) g; +insert into nestloop_y select g, g from generate_series(1, 7) g; +create index nestloop_y_idx on nestloop_y (j); + +-- Coerce the Postgres planner to produce a similar plan. Nested loop joins +-- are not enabled by default. And to dissuade it from choosing a sequential +-- scan, bump up the cost. enable_seqscan=off won't help, because there is +-- no other way to scan table 'x', and once the planner chooses a seqscan for +-- one table, it will happily use a seqscan for other tables as well, despite +-- enable_seqscan=off. (On PostgreSQL, enable_seqscan works differently, and +-- just bumps up the cost of a seqscan, so it would work there.) +set seq_page_cost=10000000; +set enable_indexscan=on; +set enable_nestloop=on; + +explain select * from nestloop_x as x, nestloop_y as y where x.i + x.j < y.j; +select * from nestloop_x as x, nestloop_y as y where x.i + x.j < y.j; + +explain select * from nestloop_x as x, nestloop_y as y where y.j > x.i + x.j + 2; +select * from nestloop_x as x, nestloop_y as y where y.j > x.i + x.j + 2; + +drop table nestloop_x, nestloop_y; + +SET enable_seqscan = OFF; +SET enable_indexscan = ON; + +DROP TABLE IF EXISTS bpchar_ops; +CREATE TABLE bpchar_ops(id INT8, v char(10)); +CREATE INDEX bpchar_ops_btree_idx ON bpchar_ops USING btree(v bpchar_pattern_ops); +INSERT INTO bpchar_ops VALUES (0, 'row'); +SELECT * FROM bpchar_ops WHERE v = 'row '::char(20); + +DROP TABLE bpchar_ops; + + +-- +-- Test index rechecks with AO and AOCS tables (and heaps as well, for good measure) +-- +create table shape_heap (c circle) with (appendonly=false); +create table shape_ao (c circle) with (appendonly=true, orientation=row); +create table shape_aocs (c circle) with (appendonly=true, orientation=column); + +insert into shape_heap values ('<(0,0), 5>'); +insert into shape_ao values ('<(0,0), 5>'); +insert into shape_aocs values ('<(0,0), 5>'); + +create index shape_heap_bb_idx on shape_heap using gist(c); +create index shape_ao_bb_idx on shape_ao using gist(c); +create index shape_aocs_bb_idx on shape_aocs using gist(c); + +select c && '<(5,5), 1>'::circle, + c && '<(5,5), 2>'::circle, + c && '<(5,5), 3>'::circle +from shape_heap; + +-- Test the same values with (bitmap) index scans +-- +-- The first two values don't overlap with the value in the tables, <(0,0), 5>, +-- but their bounding boxes do. In a GiST index scan that uses the bounding +-- boxes, these will fetch the row from the index, but filtered out by the +-- recheck using the actual overlap operator. The third entry is sanity check +-- that the index returns any rows. +set enable_seqscan=off; +set enable_indexscan=off; +set enable_bitmapscan=on; + +-- Use EXPLAIN to verify that these use a bitmap index scan +explain select * from shape_heap where c && '<(5,5), 1>'::circle; +explain select * from shape_ao where c && '<(5,5), 1>'::circle; +explain select * from shape_aocs where c && '<(5,5), 1>'::circle; + +-- Test that they return correct results. +select * from shape_heap where c && '<(5,5), 1>'::circle; +select * from shape_ao where c && '<(5,5), 1>'::circle; +select * from shape_aocs where c && '<(5,5), 1>'::circle; + +select * from shape_heap where c && '<(5,5), 2>'::circle; +select * from shape_ao where c && '<(5,5), 2>'::circle; +select * from shape_aocs where c && '<(5,5), 2>'::circle; + +select * from shape_heap where c && '<(5,5), 3>'::circle; +select * from shape_ao where c && '<(5,5), 3>'::circle; +select * from shape_aocs where c && '<(5,5), 3>'::circle; + +-- +-- Given a table with different column types +-- +CREATE TABLE table_with_reversed_index(a int, b bool, c text); + +-- +-- And it has an index that is ordered differently than columns on the table. +-- +CREATE INDEX ON table_with_reversed_index(c, a); +INSERT INTO table_with_reversed_index VALUES (10, true, 'ab'); + +-- +-- Then an index only scan should succeed. (i.e. varattno is set up correctly) +-- +SET enable_seqscan=off; +SET enable_bitmapscan=off; +SET optimizer_enable_tablescan=off; +SET optimizer_enable_indexscan=off; +SET optimizer_enable_indexonlyscan=on; +EXPLAIN SELECT c, a FROM table_with_reversed_index WHERE a > 5; +SELECT c, a FROM table_with_reversed_index WHERE a > 5; +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET optimizer_enable_tablescan; +RESET optimizer_enable_indexscan; +RESET optimizer_enable_indexonlyscan; diff --git a/src/test/singlenode_regress/sql/bfv_olap.sql b/src/test/singlenode_regress/sql/bfv_olap.sql new file mode 100644 index 00000000000..a050a587a7e --- /dev/null +++ b/src/test/singlenode_regress/sql/bfv_olap.sql @@ -0,0 +1,460 @@ +-- Tests for old bugs related to OLAP queries. + +-- First create a schema to contain the test tables, and few common test +-- tables that are shared by several test queries. +create schema bfv_olap; +set search_path=bfv_olap; + +create table customer +( + cn int not null, + cname text not null, + cloc text, + + primary key (cn) + +); + +insert into customer values + ( 1, 'Macbeth', 'Inverness'), + ( 2, 'Duncan', 'Forres'), + ( 3, 'Lady Macbeth', 'Inverness'), + ( 4, 'Witches, Inc', 'Lonely Heath'); + +create table vendor +( + vn int not null, + vname text not null, + vloc text, + + primary key (vn) + +); + +insert into vendor values + ( 10, 'Witches, Inc', 'Lonely Heath'), + ( 20, 'Lady Macbeth', 'Inverness'), + ( 30, 'Duncan', 'Forres'), + ( 40, 'Macbeth', 'Inverness'), + ( 50, 'Macduff', 'Fife'); + +create table sale +( + cn int not null, + vn int not null, + pn int not null, + dt date not null, + qty int not null, + prc float not null, + + primary key (cn, vn, pn) + +); + +insert into sale values + ( 2, 40, 100, '1401-1-1', 1100, 2400), + ( 1, 10, 200, '1401-3-1', 1, 0), + ( 3, 40, 200, '1401-4-1', 1, 0), + ( 1, 20, 100, '1401-5-1', 1, 0), + ( 1, 30, 300, '1401-5-2', 1, 0), + ( 1, 50, 400, '1401-6-1', 1, 0), + ( 2, 50, 400, '1401-6-1', 1, 0), + ( 1, 30, 500, '1401-6-1', 12, 5), + ( 3, 30, 500, '1401-6-1', 12, 5), + ( 3, 30, 600, '1401-6-1', 12, 5), + ( 4, 40, 700, '1401-6-1', 1, 1), + ( 4, 40, 800, '1401-6-1', 1, 1); + + +-- +-- Test case errors out when we define aggregates without combine functions +-- and use it as an aggregate derived window function. +-- + +-- SETUP +-- start_ignore +drop table if exists toy; +drop aggregate if exists mysum1(int4); +drop aggregate if exists mysum2(int4); +-- end_ignore +create table toy(id,val) as select i,i from generate_series(1,5) i; +create aggregate mysum1(int4) (sfunc = int4_sum, combinefunc=int8pl, stype=bigint); +create aggregate mysum2(int4) (sfunc = int4_sum, stype=bigint); + +-- TEST +select id, val, sum(val) over (w), mysum1(val) over (w), mysum2(val) over (w) from toy window w as (order by id rows 2 preceding); + +-- CLEANUP +-- start_ignore +drop aggregate if exists mysum1(int4); +drop aggregate if exists mysum2(int4); +drop table if exists toy; +-- end_ignore + +-- +-- Test case errors out when we define aggregates without preliminary functions and use it as an aggregate derived window function. +-- + +-- SETUP +-- start_ignore +drop type if exists ema_type cascade; +drop function if exists ema_adv(t ema_type, v float, x float) cascade; +drop function if exists ema_fin(t ema_type) cascade; +drop aggregate if exists ema(float, float); +drop table if exists ema_test cascade; +-- end_ignore +create type ema_type as (x float, e float); + +create function ema_adv(t ema_type, v float, x float) + returns ema_type + as $$ + begin + if t.e is null then + t.e = v; + t.x = x; + else + if t.x != x then + raise exception 'ema smoothing x may not vary'; + end if; + t.e = t.e + (v - t.e) * t.x; + end if; + return t; + end; + $$ language plpgsql; + +create function ema_fin(t ema_type) + returns float + as $$ + begin + return t.e; + end; + $$ language plpgsql; + +create aggregate ema(float, float) ( + sfunc = ema_adv, + stype = ema_type, + finalfunc = ema_fin, + initcond = '(,)'); + +create table ema_test (k int, v float ); +insert into ema_test select i, 4*(i::float/20) + 10.0*(1+cos(radians(i*5))) from generate_series(0,19) i(i); + +-- TEST +select k, v, ema(v, 0.9) over (order by k) from ema_test order by k; +select k, v, ema(v, 0.9) over (order by k rows between unbounded preceding and current row) from ema_test order by k; + +-- CLEANUP +-- start_ignore +drop table if exists ema_test cascade; +drop aggregate if exists ema(float, float); +drop function if exists ema_fin(t ema_type) cascade; +drop function if exists ema_adv(t ema_type, v float, x float) cascade; +drop type if exists ema_type cascade; +-- end_ignore + + +-- +-- Test with/without group by +-- + +-- SETUP +-- start_ignore +DROP TABLE IF EXISTS r; +-- end_ignore +CREATE TABLE r +( + a INT NOT NULL, + b INT, + c CHARACTER VARYING(200), + d NUMERIC(10,0), + e DATE +); +-- ALTER TABLE r SET DISTRIBUTED BY (b); +ALTER TABLE r ADD CONSTRAINT PKEY PRIMARY KEY (b); + +--TEST +SELECT MAX(a) AS m FROM r GROUP BY b ORDER BY m; +SELECT MAX(a) AS m FROM r GROUP BY a ORDER BY m; +SELECT MAX(a) AS m FROM r GROUP BY b; + +-- ORDER BY clause includes some grouping column or not +SELECT MAX(a) AS m FROM R GROUP BY b ORDER BY m,b; +SELECT MAX(a) AS m FROM R GROUP BY b,e ORDER BY m,b,e; +SELECT MAX(a) AS m FROM R GROUP BY b,e ORDER BY m; + +-- ORDER BY 1 or more columns +SELECT MAX(a),d,e AS m FROM r GROUP BY b,d,e ORDER BY m,e,d; +SELECT MIN(a),d,e AS m FROM r GROUP BY b,e,d ORDER BY e,d; +SELECT MAX(a) AS m FROM r GROUP BY b,c,d,e ORDER BY e,d; +SELECT MAX(a) AS m FROM r GROUP BY b,e ORDER BY e; +SELECT MAX(e) AS m FROM r GROUP BY b ORDER BY m; + +-- CLEANUP +-- start_ignore +DROP TABLE IF EXISTS r; +-- end_ignore + +-- +-- ORDER BY clause includes some grouping column or not +-- + +-- SETUP +-- start_ignore +DROP TABLE IF EXISTS dm_calendar; +-- end_ignore +CREATE TABLE dm_calendar ( + calendar_id bigint NOT NULL, + date_name character varying(200), + date_name_cn character varying(200), + calendar_date date, + current_day numeric(10,0), + month_id numeric(10,0), + month_name character varying(200), + month_name_cn character varying(200), + month_name_short character varying(200), + month_name_short_cn character varying(200), + days_in_month numeric(10,0), + first_of_month numeric(10,0), + last_month_id numeric(10,0), + month_end numeric(10,0), + quarter_id numeric(10,0), + quarter_name character varying(200), + quarter_name_cn character varying(200), + quarter_name_short character varying(200), + quarter_name_short_cn character varying(200), + year_id numeric(10,0), + year_name character varying(200), + year_name_cn character varying(200), + description character varying(500), + create_date timestamp without time zone, + month_week_num character varying(100), + month_week_begin character varying(100), + month_week_end character varying(100), + half_year character varying(100), + weekend_flag character varying(100), + holidays_flag character varying(100), + workday_flag character varying(100), + month_number numeric(10,0) +); +ALTER TABLE ONLY dm_calendar ADD CONSTRAINT dm_calendar_pkey PRIMARY KEY (calendar_id); + +--TEST +SELECT "year_id" as id , min("year_name") as a from (select "year_id" as "year_id" , min("year_name") as "year_name" from "dm_calendar" group by "year_id") "dm_calendar3" group by "year_id" order by a ASC ; + +-- CLEANUP +-- start_ignore +DROP TABLE IF EXISTS dm_calendar; +-- end_ignore + + +-- +-- Test with/without group by with primary key as dist key +-- + +-- SETUP +-- start_ignore +drop table if exists t; +-- end_ignore +create table t +( + a int NOT NULL, + b int, + c character varying(200), + d numeric(10,0), + e date +); +alter table t ADD CONSTRAINT pkey primary key (b); + +-- TEST +SELECT MAX(a) AS m FROM t GROUP BY b ORDER BY m; + +-- CLEANUP +-- start_ignore +drop table if exists t; +-- end_ignore + + + + +-- +-- Passing through distribution matching type in default implementation +-- + +-- TEST +select cname, +rank() over (partition by sale.cn order by vn) +from sale, customer +where sale.cn = customer.cn +order by 1, 2; + + +-- +-- Optimizer query crashing for logical window with no window functions +-- + +-- SETUP +create table mpp23240(a int, b int, c int, d int, e int, f int); + +-- TEST +select a, b, + case 1 + when 10 then + sum(c) over(partition by a) + when 20 then + sum(d) over(partition by a) + else + 5 + end as sum1 +from (select * from mpp23240 where f > 10) x; + +-- CLEANUP +-- start_ignore +drop table mpp23240; +-- end_ignore + + +-- +-- Test for the bug reported at https://github.com/greenplum-db/gpdb/issues/2236 +-- +create table test1 (x int, y int, z double precision); +insert into test1 select a, b, a*10 + b from generate_series(1, 5) a, generate_series(1, 5) b; + +select sum(z) over (partition by x) as sumx, sum(z) over (partition by y) as sumy from test1; + +drop table test1; + + +-- +-- This failed at one point because of an over-zealous syntax check, with +-- "window functions not allowed in WHERE clause" error. +-- +select sum(g) from generate_series(1, 5) g +where g in ( + select rank() over (order by x) from generate_series(1,5) x +); + + +-- +-- This caused a crash in ROLLUP planning at one point. +-- +SELECT sale.vn +FROM sale,vendor +WHERE sale.vn=vendor.vn +GROUP BY ROLLUP( (sale.dt,sale.cn),(sale.pn),(sale.vn)); + +SELECT DISTINCT sale.vn +FROM sale,vendor +WHERE sale.vn=vendor.vn +GROUP BY ROLLUP( (sale.dt,sale.cn),(sale.pn),(sale.vn)); + + +-- +-- Another ROLLUP query, that hit a bug in setting up the planner-generated +-- subquery's targetlist. (https://github.com/greenplum-db/gpdb/issues/6754) +-- +SELECT sale.vn, rank() over (partition by sale.vn) +FROM vendor, sale +WHERE sale.vn=vendor.vn +GROUP BY ROLLUP( sale.vn); + + +-- +-- Test window function with constant PARTITION BY +-- +CREATE TABLE testtab (a int4); +insert into testtab values (1), (2); +SELECT count(*) OVER (PARTITION BY 1) AS count FROM testtab; + +-- Another variant, where the PARTITION BY is not a literal, but the +-- planner can deduce that it's a constant through equivalence classes. +SELECT 1 +FROM ( + SELECT a, count(*) OVER (PARTITION BY a) FROM (VALUES (1,1)) AS foo(a) +) AS sup(c, d) +WHERE c = 87 ; + +-- +-- This used to crash, and/or produce incorrect results. The culprit was that a Hash Agg +-- was used, but the planner put a Gather Merge at the top, without a Sort, even though +-- a Hash Agg doesn't preserve the sort order. +-- +SELECT sale.qty +FROM sale +GROUP BY ROLLUP((qty)) order by 1; + +-- +-- Test two-stage aggregate with grouping sets and a HAVING clause +-- + +-- persuade planner to choose a two-stage plan. +set gp_motion_cost_per_row TO 1000; +select cn, sum(qty) from sale group by rollup(cn,vn) having sum(qty)=1; +-- same, but the HAVING clause matches a rolled up row. +select cn, sum(qty) from sale group by rollup(cn,vn) having sum(qty)=1144; + + +-- +-- Test a query with window function over an aggregate, and a subquery. +-- +-- Github Issue https://github.com/greenplum-db/gpdb/issues/10143 +create table t1_github_issue_10143( + base_ym varchar(6), + code varchar(5), + name varchar(60) +); + +create table t2_github_issue_10143( + base_ym varchar(6), + dong varchar(8), + code varchar(6), + salary numeric(18) +); + +insert into t1_github_issue_10143 values ('a', 'acode', 'aname'); +insert into t2_github_issue_10143 values ('a', 'adong', 'acode', 1000); +insert into t2_github_issue_10143 values ('b', 'bdong', 'bcode', 1100); +analyze t1_github_issue_10143; +analyze t2_github_issue_10143; + +set optimizer_trace_fallback = on; + +explain select (select name from t1_github_issue_10143 where code = a.code limit 1) as dongnm +,sum(sum(a.salary)) over() +from t2_github_issue_10143 a +group by a.code; + +select (select name from t1_github_issue_10143 where code = a.code limit 1) as dongnm +,sum(sum(a.salary)) over() +from t2_github_issue_10143 a +group by a.code; + +select * from (select sum(a.salary) over(), count(*) + from t2_github_issue_10143 a + group by a.salary) T; + +-- this query currently falls back, needs to be fixed +select (select rn from (select row_number() over () as rn, name + from t1_github_issue_10143 + where code = a.code + group by name) T + ) as dongnm +,sum(sum(a.salary)) over() +from t2_github_issue_10143 a +group by a.code; + +with cte as (select row_number() over (order by code) as rn1, code + from t2_github_issue_10143 + group by code) +select row_number() over (order by name) as rn2, name +from t1_github_issue_10143 +group by name +union all +select * from cte; + +reset optimizer_trace_fallback; + +-- CLEANUP +-- start_ignore +drop schema bfv_olap cascade; +-- end_ignore + diff --git a/src/test/singlenode_regress/sql/bfv_partition_plans.sql b/src/test/singlenode_regress/sql/bfv_partition_plans.sql new file mode 100644 index 00000000000..c93f8a01e35 --- /dev/null +++ b/src/test/singlenode_regress/sql/bfv_partition_plans.sql @@ -0,0 +1,593 @@ +-- start_matchsubs +-- m/((Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](.[0-9]+)? (?!0000)[0-9]{4}.*)+(['"])/ +-- s/((Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](.[0-9]+)? (?!0000)[0-9]{4}.*)+(['"])/xxx xx xx xx:xx:xx xxxx"/ +-- end_matchsubs + +create schema bfv_partition_plans; +set search_path=bfv_partition_plans; + +-- +-- Initial setup for all the partitioning test for this suite +-- +-- start_ignore +create language plpython3u; +-- end_ignore + +create or replace function count_operator(query text, operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; + +create or replace function find_operator(query text, operator_name text) returns text as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator_name +result = ['false'] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = ['true'] + break +return result +$$ +language plpython3u; + + +-- Test UPDATE that moves row from one partition to another. The partitioning +-- key is also the distribution key in this case. +create table mpp3061 (i int) partition by range(i) (start(1) end(5) every(1)); +insert into mpp3061 values(1); +update mpp3061 set i = 2 where i = 1; +select tableoid::regclass, * from mpp3061 where i = 2; +drop table mpp3061; + +-- +-- Tests if it produces SIGSEGV from "select from partition_table group by rollup or cube function" +-- + +-- SETUP +create table mpp7980 +( + month_id date, + bill_stmt_id character varying(30), + cust_type character varying(10), + subscription_status character varying(30), + voice_call_min numeric(15,2), + minute_per_call numeric(15,2), + subscription_id character varying(15) +) + + PARTITION BY RANGE(month_id) + ( + start ('2009-02-01'::date) end ('2009-08-01'::date) exclusive EVERY (INTERVAL '1 month') + ); + +-- TEST +select count_operator('select cust_type, subscription_status,count(distinct subscription_id),sum(voice_call_min),sum(minute_per_call) from mpp7980 where month_id =E''2009-04-01'' group by rollup(1,2);','SIGSEGV'); + +insert into mpp7980 values('2009-04-01','xyz','zyz','1',1,1,'1'); +insert into mpp7980 values('2009-04-01','zxyz','zyz','2',2,1,'1'); +insert into mpp7980 values('2009-03-03','xyz','zyz','4',1,3,'1'); +select cust_type, subscription_status,count(distinct subscription_id),sum(voice_call_min),sum(minute_per_call) from mpp7980 where month_id ='2009-04-01' group by rollup(1,2); + +-- CLEANUP +drop table mpp7980; + + +-- ************ORCA ENABLED********** + + +-- +-- MPP-23195 +-- + +-- SETUP +-- start_ignore +set optimizer_enable_bitmapscan=on; +set optimizer_enable_indexjoin=on; +drop table if exists mpp23195_t1; +drop table if exists mpp23195_t2; +-- end_ignore + +create table mpp23195_t1 (i int) partition by range(i) (partition pt1 start(1) end(10), partition pt2 start(10) end(20)); +create index index_mpp23195_t1_i on mpp23195_t1(i); +create table mpp23195_t2(i int); + +insert into mpp23195_t1 values (generate_series(1,19)); +insert into mpp23195_t2 values (1); + +-- TEST +select find_operator('select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;', 'Dynamic Index Scan'); +select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i; + +-- CLEANUP +-- start_ignore +drop table if exists mpp23195_t1; +drop table if exists mpp23195_t2; +set optimizer_enable_bitmapscan=off; +set optimizer_enable_indexjoin=off; +-- end_ignore + + +-- +-- Check we have Dynamic Index Scan operator and check we have Nest loop operator +-- + +-- SETUP +-- start_ignore +drop table if exists mpp21834_t1; +drop table if exists mpp21834_t2; +-- end_ignore + +create table mpp21834_t1 (i int, j int) partition by range(i) (partition pp1 start(1) end(10), partition pp2 start(10) end(20)); + +create index index_1 on mpp21834_t1(i); + +create index index_2 on mpp21834_t1(j); + +create table mpp21834_t2(i int, j int); + +-- TEST +set optimizer_enable_hashjoin = off; +select find_operator('analyze select * from mpp21834_t2,mpp21834_t1 where mpp21834_t2.i < mpp21834_t1.i;','Dynamic Index Scan'); +select find_operator('analyze select * from mpp21834_t2,mpp21834_t1 where mpp21834_t2.i < mpp21834_t1.i;','Nested Loop'); + +-- CLEANUP +drop index index_2; +drop index index_1; +drop table if exists mpp21834_t2; +drop table if exists mpp21834_t1; +reset optimizer_enable_hashjoin; + + +-- +-- A rescanning of DTS with its own partition selector (under sequence node) +-- + +-- SETUP +-- start_ignore +set optimizer_enable_broadcast_nestloop_outer_child=on; +drop table if exists mpp23288; +-- end_ignore + +create table mpp23288(a int, b int) + partition by range (a) + ( + PARTITION pfirst END(5) INCLUSIVE, + PARTITION pinter START(6) END (10) INCLUSIVE, + PARTITION plast START (11) + ); + +insert into mpp23288(a) select generate_series(1,20); + +analyze mpp23288; + +-- TEST +select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and t2.a =10) order by t2.a, t1.a;','Dynamic Seq Scan'); +select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and t2.a =10) order by t2.a, t1.a; + +select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and (t2.a = 10 or t2.a = 5 or t2.a = 12)) order by t2.a, t1.a;','Dynamic Seq Scan'); +select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and (t2.a = 10 or t2.a = 5 or t2.a = 12)) order by t2.a, t1.a; + +select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on t1.a < t2.a and t2.a = 1 or t2.a < 10 order by t2.a, t1.a;','Dynamic Seq Scan'); +select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on t1.a < t2.a and t2.a = 1 or t2.a < 10 order by t2.a, t1.a; + +-- CLEANUP +-- start_ignore +drop table if exists mpp23288; +set optimizer_enable_broadcast_nestloop_outer_child=off; +-- end_ignore + +-- +-- No DPE (Dynamic Partition Elimination) on second child of a union under a join +-- + +-- SETUP +-- start_ignore +drop table if exists t; +drop table if exists p1; +drop table if exists p2; +drop table if exists p3; +drop table if exists p; +-- end_ignore + +create table p1 (a int, b int) partition by range(b) (start (1) end(100) every (20)); +create table p2 (a int, b int) partition by range(b) (start (1) end(100) every (20)); +create table p3 (a int, b int) partition by range(b) (start (1) end(100) every (20)); +create table p (a int, b int); +create table t(a int, b int); + +insert into t select g, g*10 from generate_series(1,100) g; + +insert into p1 select g, g%99 +1 from generate_series(1,10000) g; + +insert into p2 select g, g%99 +1 from generate_series(1,10000) g; + +insert into p3 select g, g%99 +1 from generate_series(1,10000) g; + +insert into p select g, g%99 +1 from generate_series(1,10000) g; + +analyze t; +analyze p1; +analyze p2; +analyze p3; +analyze p; + +-- TEST +-- SINGLE_NODE_FIXME: disable partition selector temporarily. +-- start_ignore +select count_operator('select * from (select * from p1 union all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); +-- end_ignore +select count_operator('select * from (select * from p1 union select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + +select count_operator('select * from (select * from p1 except all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + +select count_operator('select * from (select * from p1 except select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + +select count_operator('select * from (select * from p1 intersect all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + +select count_operator('select * from (select * from p1 union select * from p2 union all select * from p3) as p_all, t where p_all.b=t.b;','Partition Selector'); + +select count_operator('select * from (select * from p1 union select * from p2 union all select * from p) as p_all, t where p_all.b=t.b;','Partition Selector'); + +select count_operator('select * from (select * from p1 union select * from p union all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + +select count_operator('select * from (select * from p1 union select * from p2 intersect all select * from p3) as p_all, t where p_all.b=t.b;','Partition Selector'); + +select count_operator('select * from (select * from p1 union select * from p intersect all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector'); + +-- CLEANUP +-- start_ignore +drop table t; +drop table p1; +drop table p2; +drop table p3; +drop table p; +-- end_ignore + + +-- +-- Gracefully handle NULL partition set from BitmapTableScan, DynamicTableScan and DynamicIndexScan +-- + +-- SETUP +-- start_ignore +drop table if exists dts; +drop table if exists dis; +drop table if exists dbs; +-- end_ignore + +create table dts(c1 int, c2 int) partition by range(c2) (start(1) end(11) every(1)); +create table dis(c1 int, c2 int, c3 int) partition by range(c2) (start(1) end(11) every(1)); +create index dis_index on dis(c3); +CREATE TABLE dbs(c1 int, c2 int, c3 int) partition by range(c2) (start(1) end(11) every(1)); +create index dbs_index on dbs using bitmap(c3); + + +-- TEST +select find_operator('(select * from dts where c2 = 1) union (select * from dts where c2 = 2) union (select * from dts where c2 = 3) union (select * from dts where c2 = 4) union (select * from dts where c2 = 5) union (select * from dts where c2 = 6) union (select * from dts where c2 = 7) union (select * from dts where c2 = 8) union (select * from dts where c2 = 9) union (select * from dts where c2 = 10);', 'Dynamic Seq Scan'); + +(select * from dts where c2 = 1) union +(select * from dts where c2 = 2) union +(select * from dts where c2 = 3) union +(select * from dts where c2 = 4) union +(select * from dts where c2 = 5) union +(select * from dts where c2 = 6) union +(select * from dts where c2 = 7) union +(select * from dts where c2 = 8) union +(select * from dts where c2 = 9) union +(select * from dts where c2 = 10); + +set optimizer_enable_dynamictablescan = off; +select find_operator('(select * from dis where c3 = 1) union (select * from dis where c3 = 2) union (select * from dis where c3 = 3) union (select * from dis where c3 = 4) union (select * from dis where c3 = 5) union (select * from dis where c3 = 6) union (select * from dis where c3 = 7) union (select * from dis where c3 = 8) union (select * from dis where c3 = 9) union (select * from dis where c3 = 10);', 'Dynamic Index Scan'); + +(select * from dis where c3 = 1) union +(select * from dis where c3 = 2) union +(select * from dis where c3 = 3) union +(select * from dis where c3 = 4) union +(select * from dis where c3 = 5) union +(select * from dis where c3 = 6) union +(select * from dis where c3 = 7) union +(select * from dis where c3 = 8) union +(select * from dis where c3 = 9) union +(select * from dis where c3 = 10); + +select find_operator('select * from dbs where c2= 15 and c3 = 5;', 'Bitmap Heap Scan'); + +select * from dbs where c2= 15 and c3 = 5; + +-- CLEANUP +drop index dbs_index; +drop table if exists dbs; +drop index dis_index; +drop table if exists dis; +drop table if exists dts; +reset optimizer_enable_dynamictablescan; + +-- +-- Partition elimination for heterogenous DynamicIndexScans +-- + +-- SETUP +-- start_ignore +drop table if exists pp; +drop index if exists pp_1_prt_1_idx; +drop index if exists pp_rest_1_idx; +drop index if exists pp_rest_2_idx; +set optimizer_segments=2; +set optimizer_partition_selection_log=on; +-- end_ignore +create table pp(a int, b int, c int) partition by range(b) (start(1) end(15) every(5)); +insert into pp values (1,1,2),(2,6,2), (3,11,2); +-- Heterogeneous Index on the partition table +create index pp_1_prt_1_idx on pp_1_prt_1(c); +-- Create other indexes so that we can automate the repro for MPP-21069 by disabling tablescan +create index pp_rest_1_idx on pp_1_prt_2(c,a); +create index pp_rest_2_idx on pp_1_prt_3(c,a); +-- TEST +set optimizer_enable_dynamictablescan = off; +select * from pp where b=2 and c=2; +select count_operator('select * from pp where b=2 and c=2;','Partition Selector'); + +-- CLEANUP +-- start_ignore +drop index if exists pp_rest_2_idx; +drop index if exists pp_rest_1_idx; +drop index if exists pp_1_prt_1_idx; +drop table if exists pp; +reset optimizer_enable_dynamictablescan; +reset optimizer_segments; +set optimizer_partition_selection_log=off; +-- end_ignore + + +-- +-- Partition elimination with implicit CAST on the partitioning key +-- + +-- SETUP +-- start_ignore +set optimizer_segments=2; +set optimizer_partition_selection_log=on; +DROP TABLE IF EXISTS ds_4; +-- end_ignore + +CREATE TABLE ds_4 +( + month_id character varying(6), + cust_group_acc numeric(10), + mobile_no character varying(10) +) + +PARTITION BY LIST(month_id) + ( + PARTITION p200800 VALUES('200800'), + PARTITION p200801 VALUES('200801'), + PARTITION p200802 VALUES('200802'), + PARTITION p200803 VALUES('200803') +); + +-- TEST +select * from ds_4 where month_id = '200800'; +select count_operator('select * from ds_4 where month_id = E''200800'';','Partition Selector'); + +select * from ds_4 where month_id > '200800'; +select count_operator('select * from ds_4 where month_id > E''200800'';','Partition Selector'); + +select * from ds_4 where month_id <= '200800'; +select count_operator('select * from ds_4 where month_id <= E''200800'';','Partition Selector'); + +select * from ds_4 a1,ds_4 a2 where a1.month_id = a2.month_id and a1.month_id > '200800'; +-- SINGLE_NODE_FIXME: disable partition selector temporarily. +-- start_ignore +select count_operator('select * from ds_4 a1,ds_4 a2 where a1.month_id = a2.month_id and a1.month_id > E''200800'';','Partition Selector'); +-- end_ignore +-- CLEANUP +-- start_ignore +DROP TABLE IF EXISTS ds_4; +set optimizer_partition_selection_log=off; +reset optimizer_segments; + +-- end_ignore + +-- +-- Test a hash agg that has a Sequence + Partition Selector below it. +-- + +-- SETUP +-- start_ignore +DROP TABLE IF EXISTS bar; +-- end_ignore +CREATE TABLE bar (b int, c int) +PARTITION BY RANGE (b) +( + START (0) END (10), + START (10) END (20) +); + +INSERT INTO bar SELECT g % 20, g % 20 from generate_series(1, 1000) g; +ANALYZE bar; + +SELECT b FROM bar GROUP BY b; + +EXPLAIN SELECT b FROM bar GROUP BY b; + + +-- CLEANUP +DROP TABLE IF EXISTS foo; +DROP TABLE IF EXISTS bar; + + +-- Test EXPLAIN ANALYZE on a partitioned table. There used to be a bug, where +-- you got an internal error with this, because the EXPLAIN ANALYZE sends the +-- stats from QEs to the QD at the end of query, but because the subnodes are +-- terminated earlier, their stats were already gone. +create table mpp8031 (oid integer, +odate timestamp without time zone, +cid integer) +PARTITION BY RANGE(odate) +( +PARTITION foo START ('2005-05-01 00:00:00'::timestamp +without time zone) END ('2005-07-01 00:00:00'::timestamp +without time zone) EVERY ('2 mons'::interval), + +START ('2005-07-01 00:00:00'::timestamp without time zone) +END ('2006-01-01 00:00:00'::timestamp without time zone) +EVERY ('2 mons'::interval) +); +explain analyze select a.* from mpp8031 a, mpp8031 b where a.oid = b.oid; +drop table mpp8031; + +-- Partitioned tables with default partitions and indexes on all parts, +-- queries on them with a predicate on index column must not consider the scan +-- as partial and should not fallback. +CREATE TABLE part_tbl +( + time_client_key numeric(16,0) NOT NULL, + ngin_service_key numeric NOT NULL, + profile_key numeric NOT NULL +) + +PARTITION BY RANGE(time_client_key) +SUBPARTITION BY LIST (ngin_service_key) +SUBPARTITION TEMPLATE +( + SUBPARTITION Package5 VALUES (479534741), + DEFAULT SUBPARTITION other_services +) +( + PARTITION p20151110 START (2015111000::numeric) +END (2015111100::numeric) WITH (appendonly=false) +); +INSERT INTO part_tbl VALUES (2015111000, 479534741, 99999999); +INSERT INTO part_tbl VALUES (2015111000, 479534742, 99999999); +CREATE INDEX part_tbl_idx +ON part_tbl(profile_key); +-- start_ignore +analyze part_tbl; +-- end_ignore +EXPLAIN SELECT * FROM part_tbl WHERE profile_key = 99999999; +SELECT * FROM part_tbl WHERE profile_key = 99999999; +DROP TABLE part_tbl; + +-- +-- Test partition elimination, MPP-7891 +-- + +-- cleanup +-- start_ignore +drop table if exists r_part; +drop table if exists r_co; + +deallocate f1; +deallocate f2; +deallocate f3; +-- end_ignore + +create table r_part(a int, b int) partition by range(a) (start (1) end(10) every(1)); +create table r_co(a int, b int) with (orientation=column, appendonly=true) partition by range(a) (start (1) end(10) every(1)) ; + +insert into r_part values (1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8); + +-- following tests rely on the data distribution, verify them +select gp_segment_id, * from r_part order by a,b; + +analyze r_part; + +explain select * from r_part r1, r_part r2 where r1.a=1; -- should eliminate partitions in the r1 copy of r_part + +-- the numbers in the filter should be both on segment 0 +explain select * from r_part where a in (7,8); -- should eliminate partitions + +-- Test partition elimination in prepared statements +prepare f1(int) as select * from r_part where a = 1 order by a,b; +prepare f2(int) as select * from r_part where a = $1 order by a,b; + +execute f1(1); +execute f2(1); +execute f2(2); + + +explain select * from r_part where a = 1 order by a,b; -- should eliminate partitions +--force_explain +explain execute f1(1); -- should eliminate partitions +--force_explain +explain execute f2(2); -- should eliminate partitions + + +-- Test partition elimination on CO tables +insert into r_co values (1,1), (2,2), (3,3); +analyze r_co; +explain select * from r_co where a=2; -- should eliminate partitions + +-- test partition elimination in prepared statements on CO tables +prepare f3(int) as select * from r_co where a = $1 order by a,b; +--force_explain +explain execute f3(2); -- should eliminate partitions + +-- start_ignore +drop table r_part; +drop table r_co; +deallocate f1; +deallocate f2; +deallocate f3; +-- end_ignore + +-- +-- Test partition elimination, MPP-7891 +-- + +-- start_ignore +drop table if exists fact; +deallocate f1; + +create table fact(x int, dd date, dt text) partition by range (dd) ( start('2008-01-01') end ('2320-01-01') every(interval '100 years')); +-- end_ignore + +analyze fact; + +select '2009-01-02'::date = to_date('2009-01-02','YYYY-MM-DD'); -- ensure that both are in fact equal + +explain select * from fact where dd < '2009-01-02'::date; -- partitions eliminated + +explain select * from fact where dd < to_date('2009-01-02','YYYY-MM-DD'); -- partitions eliminated + +explain select * from fact where dd < current_date; --partitions eliminated + +-- Test partition elimination in prepared statements + +prepare f1(date) as select * from fact where dd < $1; + +-- force_explain +explain execute f1('2009-01-02'::date); -- should eliminate partitions +-- force_explain +explain execute f1(to_date('2009-01-02', 'YYYY-MM-DD')); -- should eliminate partitions + +-- start_ignore +drop table fact; +deallocate f1; +-- end_ignore + +-- MPP-6247 +-- Delete Using on partitioned table causes repetitive scans on using table +create table mpp6247_foo ( c1 int, dt date ) partition by range (dt) ( start ( date '2009-05-01' ) end ( date '2009-05-11' ) every ( interval '1 day' ) ); +create table mpp6247_bar (like mpp6247_foo); + +-- EXPECT: Single HJ after partition elimination instead of sequence of HJ under Append +select count_operator('delete from mpp6247_foo using mpp6247_bar where mpp6247_foo.c1 = mpp6247_bar.c1 and mpp6247_foo.dt = ''2009-05-03''', 'Hash Join'); + +drop table mpp6247_bar; +drop table mpp6247_foo; + +-- CLEANUP +-- start_ignore +drop schema if exists bfv_partition_plans cascade; +-- end_ignore diff --git a/src/test/singlenode_regress/sql/bit.sql b/src/test/singlenode_regress/sql/bit.sql new file mode 100644 index 00000000000..0a424e796b9 --- /dev/null +++ b/src/test/singlenode_regress/sql/bit.sql @@ -0,0 +1,231 @@ +-- +-- BIT types +-- + +-- +-- Build tables for testing +-- + +CREATE TABLE BIT_TABLE(b BIT(11)); + +INSERT INTO BIT_TABLE VALUES (B'10'); -- too short +INSERT INTO BIT_TABLE VALUES (B'00000000000'); +INSERT INTO BIT_TABLE VALUES (B'11011000000'); +INSERT INTO BIT_TABLE VALUES (B'01010101010'); +INSERT INTO BIT_TABLE VALUES (B'101011111010'); -- too long +--INSERT INTO BIT_TABLE VALUES ('X554'); +--INSERT INTO BIT_TABLE VALUES ('X555'); + +SELECT * FROM BIT_TABLE; + +CREATE TABLE VARBIT_TABLE(v BIT VARYING(11)); + +INSERT INTO VARBIT_TABLE VALUES (B''); +INSERT INTO VARBIT_TABLE VALUES (B'0'); +INSERT INTO VARBIT_TABLE VALUES (B'010101'); +INSERT INTO VARBIT_TABLE VALUES (B'01010101010'); +INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long +--INSERT INTO VARBIT_TABLE VALUES ('X554'); +--INSERT INTO VARBIT_TABLE VALUES ('X555'); +SELECT * FROM VARBIT_TABLE; + + +-- Concatenation +SELECT v, b, (v || b) AS concat + FROM BIT_TABLE, VARBIT_TABLE + ORDER BY 3; + +-- Length +SELECT b, length(b) AS lb + FROM BIT_TABLE; +SELECT v, length(v) AS lv + FROM VARBIT_TABLE; + +-- Substring +SELECT b, + SUBSTRING(b FROM 2 FOR 4) AS sub_2_4, + SUBSTRING(b FROM 7 FOR 13) AS sub_7_13, + SUBSTRING(b FROM 6) AS sub_6 + FROM BIT_TABLE; +SELECT v, + SUBSTRING(v FROM 2 FOR 4) AS sub_2_4, + SUBSTRING(v FROM 7 FOR 13) AS sub_7_13, + SUBSTRING(v FROM 6) AS sub_6 + FROM VARBIT_TABLE; + +-- test overflow cases +SELECT SUBSTRING('01010101'::bit(8) FROM 2 FOR 2147483646) AS "1010101"; +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101"; +SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error"; +SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101"; +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101"; +SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error"; + +--- Bit operations +DROP TABLE varbit_table; +CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16)); +COPY varbit_table FROM stdin; +X0F X10 +X1F X11 +X2F X12 +X3F X13 +X8F X04 +X000F X0010 +X0123 XFFFF +X2468 X2468 +XFA50 X05AF +X1234 XFFF5 +\. + +SELECT a, b, ~a AS "~ a", a & b AS "a & b", + a | b AS "a | b", a # b AS "a # b" FROM varbit_table; +SELECT a,b,a=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM varbit_table; +SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM varbit_table; + +DROP TABLE varbit_table; + +--- Bit operations +DROP TABLE bit_table; +CREATE TABLE bit_table (a BIT(16), b BIT(16)); +COPY bit_table FROM stdin; +X0F00 X1000 +X1F00 X1100 +X2F00 X1200 +X3F00 X1300 +X8F00 X0400 +X000F X0010 +X0123 XFFFF +X2468 X2468 +XFA50 X05AF +X1234 XFFF5 +\. + +SELECT a,b,~a AS "~ a",a & b AS "a & b", + a|b AS "a | b", a # b AS "a # b" FROM bit_table; +SELECT a,b,a=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM bit_table; +SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM bit_table; + +DROP TABLE bit_table; + + +-- The following should fail +select B'001' & B'10'; +select B'0111' | B'011'; +select B'0010' # B'011101'; + +-- More position tests, checking all the boundary cases +SELECT POSITION(B'1010' IN B'0000101'); -- 0 +SELECT POSITION(B'1010' IN B'00001010'); -- 5 +SELECT POSITION(B'1010' IN B'00000101'); -- 0 +SELECT POSITION(B'1010' IN B'000001010'); -- 6 + +SELECT POSITION(B'' IN B'00001010'); -- 1 +SELECT POSITION(B'0' IN B''); -- 0 +SELECT POSITION(B'' IN B''); -- 0 +SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3 +SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3 +SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3 +SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5 + +SELECT POSITION(B'11101011' IN B'11101011'); -- 1 +SELECT POSITION(B'11101011' IN B'011101011'); -- 2 +SELECT POSITION(B'11101011' IN B'00011101011'); -- 4 +SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6 + +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 + +SELECT POSITION(B'111010110' IN B'11101011'); -- 0 +SELECT POSITION(B'111010110' IN B'011101011'); -- 0 +SELECT POSITION(B'111010110' IN B'00011101011'); -- 0 +SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0 + +SELECT POSITION(B'111010110' IN B'111010110'); -- 1 +SELECT POSITION(B'111010110' IN B'0111010110'); -- 2 +SELECT POSITION(B'111010110' IN B'000111010110'); -- 4 +SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6 + +SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0 +SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0 +SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0 +SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0 + +SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14 +SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15 +SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17 +SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19 + +SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1 +SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2 +SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0 + + +-- Shifting + +CREATE TABLE BIT_SHIFT_TABLE(b BIT(16)); +INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000'); +INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE; +INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE; +SELECT POSITION(B'1101' IN b), + POSITION(B'11011' IN b), + b + FROM BIT_SHIFT_TABLE ; +SELECT b, b >> 1 AS bsr, b << 1 AS bsl + FROM BIT_SHIFT_TABLE ; +SELECT b, b >> 8 AS bsr8, b << 8 AS bsl8 + FROM BIT_SHIFT_TABLE ; +SELECT b::bit(15), b::bit(15) >> 1 AS bsr, b::bit(15) << 1 AS bsl + FROM BIT_SHIFT_TABLE ; +SELECT b::bit(15), b::bit(15) >> 8 AS bsr8, b::bit(15) << 8 AS bsl8 + FROM BIT_SHIFT_TABLE ; + + +CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20)); +INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011'); +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE; +INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE; +SELECT POSITION(B'1101' IN v), + POSITION(B'11011' IN v), + v + FROM VARBIT_SHIFT_TABLE ; +SELECT v, v >> 1 AS vsr, v << 1 AS vsl + FROM VARBIT_SHIFT_TABLE ; +SELECT v, v >> 8 AS vsr8, v << 8 AS vsl8 + FROM VARBIT_SHIFT_TABLE ; + +DROP TABLE BIT_SHIFT_TABLE; +DROP TABLE VARBIT_SHIFT_TABLE; + +-- Get/Set bit +SELECT get_bit(B'0101011000100', 10); +SELECT set_bit(B'0101011000100100', 15, 1); +SELECT set_bit(B'0101011000100100', 16, 1); -- fail + +-- Overlay +SELECT overlay(B'0101011100' placing '001' from 2 for 3); +SELECT overlay(B'0101011100' placing '101' from 6); +SELECT overlay(B'0101011100' placing '001' from 11); +SELECT overlay(B'0101011100' placing '001' from 20); + +-- bit_count +SELECT bit_count(B'0101011100'::bit(10)); +SELECT bit_count(B'1111111111'::bit(10)); + +-- This table is intentionally left around to exercise pg_dump/pg_upgrade +CREATE TABLE bit_defaults( + b1 bit(4) DEFAULT '1001', + b2 bit(4) DEFAULT B'0101', + b3 bit varying(5) DEFAULT '1001', + b4 bit varying(5) DEFAULT B'0101' +); +\d bit_defaults +INSERT INTO bit_defaults DEFAULT VALUES; +TABLE bit_defaults; diff --git a/src/test/singlenode_regress/sql/bitmapops.sql b/src/test/singlenode_regress/sql/bitmapops.sql new file mode 100644 index 00000000000..498f4721b51 --- /dev/null +++ b/src/test/singlenode_regress/sql/bitmapops.sql @@ -0,0 +1,41 @@ +-- Test bitmap AND and OR + + +-- Generate enough data that we can test the lossy bitmaps. + +-- There's 55 tuples per page in the table. 53 is just +-- below 55, so that an index scan with qual a = constant +-- will return at least one hit per page. 59 is just above +-- 55, so that an index scan with qual b = constant will return +-- hits on most but not all pages. 53 and 59 are prime, so that +-- there's a maximum number of a,b combinations in the table. +-- That allows us to test all the different combinations of +-- lossy and non-lossy pages with the minimum amount of data + +CREATE TABLE bmscantest (a int, b int, t text); + +INSERT INTO bmscantest + SELECT (r%53), (r%59), 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' + FROM generate_series(1,70000) r; + +CREATE INDEX i_bmtest_a ON bmscantest(a); +CREATE INDEX i_bmtest_b ON bmscantest(b); + +-- We want to use bitmapscans. With default settings, the planner currently +-- chooses a bitmap scan for the queries below anyway, but let's make sure. +set enable_indexscan=false; +set enable_seqscan=false; + +-- Lower work_mem to trigger use of lossy bitmaps +set work_mem = 64; + + +-- Test bitmap-and. +SELECT count(*) FROM bmscantest WHERE a = 1 AND b = 1; + +-- Test bitmap-or. +SELECT count(*) FROM bmscantest WHERE a = 1 OR b = 1; + + +-- clean up +DROP TABLE bmscantest; diff --git a/src/test/singlenode_regress/sql/boolean.sql b/src/test/singlenode_regress/sql/boolean.sql new file mode 100644 index 00000000000..4dd47aaf9d8 --- /dev/null +++ b/src/test/singlenode_regress/sql/boolean.sql @@ -0,0 +1,262 @@ +-- +-- BOOLEAN +-- + +-- +-- sanity check - if this fails go insane! +-- +SELECT 1 AS one; + + +-- ******************testing built-in type bool******************** + +-- check bool input syntax + +SELECT true AS true; + +SELECT false AS false; + +SELECT bool 't' AS true; + +SELECT bool ' f ' AS false; + +SELECT bool 'true' AS true; + +SELECT bool 'test' AS error; + +SELECT bool 'false' AS false; + +SELECT bool 'foo' AS error; + +SELECT bool 'y' AS true; + +SELECT bool 'yes' AS true; + +SELECT bool 'yeah' AS error; + +SELECT bool 'n' AS false; + +SELECT bool 'no' AS false; + +SELECT bool 'nay' AS error; + +SELECT bool 'on' AS true; + +SELECT bool 'off' AS false; + +SELECT bool 'of' AS false; + +SELECT bool 'o' AS error; + +SELECT bool 'on_' AS error; + +SELECT bool 'off_' AS error; + +SELECT bool '1' AS true; + +SELECT bool '11' AS error; + +SELECT bool '0' AS false; + +SELECT bool '000' AS error; + +SELECT bool '' AS error; + +-- and, or, not in qualifications + +SELECT bool 't' or bool 'f' AS true; + +SELECT bool 't' and bool 'f' AS false; + +SELECT not bool 'f' AS true; + +SELECT bool 't' = bool 'f' AS false; + +SELECT bool 't' <> bool 'f' AS true; + +SELECT bool 't' > bool 'f' AS true; + +SELECT bool 't' >= bool 'f' AS true; + +SELECT bool 'f' < bool 't' AS true; + +SELECT bool 'f' <= bool 't' AS true; + +-- explicit casts to/from text +SELECT 'TrUe'::text::boolean AS true, 'fAlse'::text::boolean AS false; +SELECT ' true '::text::boolean AS true, + ' FALSE'::text::boolean AS false; +SELECT true::boolean::text AS true, false::boolean::text AS false; + +SELECT ' tru e '::text::boolean AS invalid; -- error +SELECT ''::text::boolean AS invalid; -- error + +CREATE TABLE BOOLTBL1 (f1 bool); + +INSERT INTO BOOLTBL1 (f1) VALUES (bool 't'); + +INSERT INTO BOOLTBL1 (f1) VALUES (bool 'True'); + +INSERT INTO BOOLTBL1 (f1) VALUES (bool 'true'); + + +-- BOOLTBL1 should be full of true's at this point +SELECT BOOLTBL1.* FROM BOOLTBL1; + + +SELECT BOOLTBL1.* + FROM BOOLTBL1 + WHERE f1 = bool 'true'; + + +SELECT BOOLTBL1.* + FROM BOOLTBL1 + WHERE f1 <> bool 'false'; + +SELECT BOOLTBL1.* + FROM BOOLTBL1 + WHERE booleq(bool 'false', f1); + +INSERT INTO BOOLTBL1 (f1) VALUES (bool 'f'); + +SELECT BOOLTBL1.* + FROM BOOLTBL1 + WHERE f1 = bool 'false'; + + +CREATE TABLE BOOLTBL2 (f1 bool); + +INSERT INTO BOOLTBL2 (f1) VALUES (bool 'f'); + +INSERT INTO BOOLTBL2 (f1) VALUES (bool 'false'); + +INSERT INTO BOOLTBL2 (f1) VALUES (bool 'False'); + +INSERT INTO BOOLTBL2 (f1) VALUES (bool 'FALSE'); + +-- This is now an invalid expression +-- For pre-v6.3 this evaluated to false - thomas 1997-10-23 +INSERT INTO BOOLTBL2 (f1) + VALUES (bool 'XXX'); + +-- BOOLTBL2 should be full of false's at this point +SELECT BOOLTBL2.* FROM BOOLTBL2; + + +SELECT BOOLTBL1.*, BOOLTBL2.* + FROM BOOLTBL1, BOOLTBL2 + WHERE BOOLTBL2.f1 <> BOOLTBL1.f1; + + +SELECT BOOLTBL1.*, BOOLTBL2.* + FROM BOOLTBL1, BOOLTBL2 + WHERE boolne(BOOLTBL2.f1,BOOLTBL1.f1); + + +SELECT BOOLTBL1.*, BOOLTBL2.* + FROM BOOLTBL1, BOOLTBL2 + WHERE BOOLTBL2.f1 = BOOLTBL1.f1 and BOOLTBL1.f1 = bool 'false'; + + +SELECT BOOLTBL1.*, BOOLTBL2.* + FROM BOOLTBL1, BOOLTBL2 + WHERE BOOLTBL2.f1 = BOOLTBL1.f1 or BOOLTBL1.f1 = bool 'true' + ORDER BY BOOLTBL1.f1, BOOLTBL2.f1; + +-- +-- SQL syntax +-- Try all combinations to ensure that we get nothing when we expect nothing +-- - thomas 2000-01-04 +-- + +SELECT f1 + FROM BOOLTBL1 + WHERE f1 IS TRUE; + +SELECT f1 + FROM BOOLTBL1 + WHERE f1 IS NOT FALSE; + +SELECT f1 + FROM BOOLTBL1 + WHERE f1 IS FALSE; + +SELECT f1 + FROM BOOLTBL1 + WHERE f1 IS NOT TRUE; + +SELECT f1 + FROM BOOLTBL2 + WHERE f1 IS TRUE; + +SELECT f1 + FROM BOOLTBL2 + WHERE f1 IS NOT FALSE; + +SELECT f1 + FROM BOOLTBL2 + WHERE f1 IS FALSE; + +SELECT f1 + FROM BOOLTBL2 + WHERE f1 IS NOT TRUE; + +-- +-- Tests for BooleanTest +-- +CREATE TABLE BOOLTBL3 (d text, b bool, o int); +INSERT INTO BOOLTBL3 (d, b, o) VALUES ('true', true, 1); +INSERT INTO BOOLTBL3 (d, b, o) VALUES ('false', false, 2); +INSERT INTO BOOLTBL3 (d, b, o) VALUES ('null', null, 3); + +SELECT + d, + b IS TRUE AS istrue, + b IS NOT TRUE AS isnottrue, + b IS FALSE AS isfalse, + b IS NOT FALSE AS isnotfalse, + b IS UNKNOWN AS isunknown, + b IS NOT UNKNOWN AS isnotunknown +FROM booltbl3 ORDER BY o; + + +-- Test to make sure short-circuiting and NULL handling is +-- correct. Use a table as source to prevent constant simplification +-- to interfer. +CREATE TABLE booltbl4(isfalse bool, istrue bool, isnul bool); +INSERT INTO booltbl4 VALUES (false, true, null); +\pset null '(null)' + +-- AND expression need to return null if there's any nulls and not all +-- of the value are true +SELECT istrue AND isnul AND istrue FROM booltbl4; +SELECT istrue AND istrue AND isnul FROM booltbl4; +SELECT isnul AND istrue AND istrue FROM booltbl4; +SELECT isfalse AND isnul AND istrue FROM booltbl4; +SELECT istrue AND isfalse AND isnul FROM booltbl4; +SELECT isnul AND istrue AND isfalse FROM booltbl4; + +-- OR expression need to return null if there's any nulls and none +-- of the value is true +SELECT isfalse OR isnul OR isfalse FROM booltbl4; +SELECT isfalse OR isfalse OR isnul FROM booltbl4; +SELECT isnul OR isfalse OR isfalse FROM booltbl4; +SELECT isfalse OR isnul OR istrue FROM booltbl4; +SELECT istrue OR isfalse OR isnul FROM booltbl4; +SELECT isnul OR istrue OR isfalse FROM booltbl4; + + +-- +-- Clean up +-- Many tables are retained by the regression test, but these do not seem +-- particularly useful so just get rid of them for now. +-- - thomas 1997-11-30 +-- + +DROP TABLE BOOLTBL1; + +DROP TABLE BOOLTBL2; + +DROP TABLE BOOLTBL3; + +DROP TABLE BOOLTBL4; diff --git a/src/test/singlenode_regress/sql/box.sql b/src/test/singlenode_regress/sql/box.sql new file mode 100644 index 00000000000..ceae58fc02f --- /dev/null +++ b/src/test/singlenode_regress/sql/box.sql @@ -0,0 +1,283 @@ +-- +-- BOX +-- + +-- +-- box logic +-- o +-- 3 o--|X +-- | o| +-- 2 +-+-+ | +-- | | | | +-- 1 | o-+-o +-- | | +-- 0 +---+ +-- +-- 0 1 2 3 +-- + +-- boxes are specified by two points, given by four floats x1,y1,x2,y2 + + +CREATE TABLE BOX_TBL (f1 box); + +INSERT INTO BOX_TBL (f1) VALUES ('(2.0,2.0,0.0,0.0)'); + +INSERT INTO BOX_TBL (f1) VALUES ('(1.0,1.0,3.0,3.0)'); + +INSERT INTO BOX_TBL (f1) VALUES ('((-8, 2), (-2, -10))'); + + +-- degenerate cases where the box is a line or a point +-- note that lines and points boxes all have zero area +INSERT INTO BOX_TBL (f1) VALUES ('(2.5, 2.5, 2.5,3.5)'); + +INSERT INTO BOX_TBL (f1) VALUES ('(3.0, 3.0,3.0,3.0)'); + +-- badly formatted box inputs +INSERT INTO BOX_TBL (f1) VALUES ('(2.3, 4.5)'); + +INSERT INTO BOX_TBL (f1) VALUES ('[1, 2, 3, 4)'); + +INSERT INTO BOX_TBL (f1) VALUES ('(1, 2, 3, 4]'); + +INSERT INTO BOX_TBL (f1) VALUES ('(1, 2, 3, 4) x'); + +INSERT INTO BOX_TBL (f1) VALUES ('asdfasdf(ad'); + + +SELECT * FROM BOX_TBL; + +SELECT b.*, area(b.f1) as barea + FROM BOX_TBL b; + +-- overlap +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 && box '(2.5,2.5,1.0,1.0)'; + +-- left-or-overlap (x only) +SELECT b1.* + FROM BOX_TBL b1 + WHERE b1.f1 &< box '(2.0,2.0,2.5,2.5)'; + +-- right-or-overlap (x only) +SELECT b1.* + FROM BOX_TBL b1 + WHERE b1.f1 &> box '(2.0,2.0,2.5,2.5)'; + +-- left of +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 << box '(3.0,3.0,5.0,5.0)'; + +-- area <= +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 <= box '(3.0,3.0,5.0,5.0)'; + +-- area < +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 < box '(3.0,3.0,5.0,5.0)'; + +-- area = +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 = box '(3.0,3.0,5.0,5.0)'; + +-- area > +SELECT b.f1 + FROM BOX_TBL b -- zero area + WHERE b.f1 > box '(3.5,3.0,4.5,3.0)'; + +-- area >= +SELECT b.f1 + FROM BOX_TBL b -- zero area + WHERE b.f1 >= box '(3.5,3.0,4.5,3.0)'; + +-- right of +SELECT b.f1 + FROM BOX_TBL b + WHERE box '(3.0,3.0,5.0,5.0)' >> b.f1; + +-- contained in +SELECT b.f1 + FROM BOX_TBL b + WHERE b.f1 <@ box '(0,0,3,3)'; + +-- contains +SELECT b.f1 + FROM BOX_TBL b + WHERE box '(0,0,3,3)' @> b.f1; + +-- box equality +SELECT b.f1 + FROM BOX_TBL b + WHERE box '(1,1,3,3)' ~= b.f1; + +-- center of box, left unary operator +SELECT @@(b1.f1) AS p + FROM BOX_TBL b1; + +-- wholly-contained +SELECT b1.*, b2.* + FROM BOX_TBL b1, BOX_TBL b2 + WHERE b1.f1 @> b2.f1 and not b1.f1 ~= b2.f1; + +SELECT height(f1), width(f1) FROM BOX_TBL; + +-- +-- Test the SP-GiST index +-- + +CREATE TEMPORARY TABLE box_temp (f1 box); + +INSERT INTO box_temp + SELECT box(point(i, i), point(i * 2, i * 2)) + FROM generate_series(1, 50) AS i; + +CREATE INDEX box_spgist ON box_temp USING spgist (f1); + +INSERT INTO box_temp + VALUES (NULL), + ('(0,0)(0,100)'), + ('(-3,4.3333333333)(40,1)'), + ('(0,100)(0,infinity)'), + ('(-infinity,0)(0,infinity)'), + ('(-infinity,-infinity)(infinity,infinity)'); + +SET enable_seqscan = false; + +SELECT * FROM box_temp WHERE f1 << '(10,20),(30,40)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 << '(10,20),(30,40)'; + +SELECT * FROM box_temp WHERE f1 &< '(10,4.333334),(5,100)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &< '(10,4.333334),(5,100)'; + +SELECT * FROM box_temp WHERE f1 && '(15,20),(25,30)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 && '(15,20),(25,30)'; + +SELECT * FROM box_temp WHERE f1 &> '(40,30),(45,50)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &> '(40,30),(45,50)'; + +SELECT * FROM box_temp WHERE f1 >> '(30,40),(40,30)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 >> '(30,40),(40,30)'; + +SELECT * FROM box_temp WHERE f1 <<| '(10,4.33334),(5,100)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 <<| '(10,4.33334),(5,100)'; + +SELECT * FROM box_temp WHERE f1 &<| '(10,4.3333334),(5,1)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 &<| '(10,4.3333334),(5,1)'; + +SELECT * FROM box_temp WHERE f1 |&> '(49.99,49.99),(49.99,49.99)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 |&> '(49.99,49.99),(49.99,49.99)'; + +SELECT * FROM box_temp WHERE f1 |>> '(37,38),(39,40)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 |>> '(37,38),(39,40)'; + +SELECT * FROM box_temp WHERE f1 @> '(10,11),(15,16)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 @> '(10,11),(15,15)'; + +SELECT * FROM box_temp WHERE f1 <@ '(10,15),(30,35)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 <@ '(10,15),(30,35)'; + +SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)'; +EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)'; + +RESET enable_seqscan; + +DROP INDEX box_spgist; + +-- +-- Test the SP-GiST index on the larger volume of data +-- +CREATE TABLE quad_box_tbl (id int, b box); + +INSERT INTO quad_box_tbl + SELECT (x - 1) * 100 + y, box(point(x * 10, y * 10), point(x * 10 + 5, y * 10 + 5)) + FROM generate_series(1, 100) x, + generate_series(1, 100) y; + +-- insert repeating data to test allTheSame +INSERT INTO quad_box_tbl + SELECT i, '((200, 300),(210, 310))' + FROM generate_series(10001, 11000) AS i; + +INSERT INTO quad_box_tbl +VALUES + (11001, NULL), + (11002, NULL), + (11003, '((-infinity,-infinity),(infinity,infinity))'), + (11004, '((-infinity,100),(-infinity,500))'), + (11005, '((-infinity,-infinity),(700,infinity))'); + +CREATE INDEX quad_box_tbl_idx ON quad_box_tbl USING spgist(b); + +-- get reference results for ORDER BY distance from seq scan +SET enable_seqscan = ON; +SET enable_indexscan = OFF; +SET enable_bitmapscan = OFF; + +CREATE TABLE quad_box_tbl_ord_seq1 AS +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl; + +CREATE TABLE quad_box_tbl_ord_seq2 AS +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))'; + +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = ON; + +SELECT count(*) FROM quad_box_tbl WHERE b << box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b &< box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b && box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b &> box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b >> box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b >> box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b <<| box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b &<| box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b |&> box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b |>> box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b @> box '((201,301),(202,303))'; +SELECT count(*) FROM quad_box_tbl WHERE b <@ box '((100,200),(300,500))'; +SELECT count(*) FROM quad_box_tbl WHERE b ~= box '((200,300),(205,305))'; + +-- test ORDER BY distance +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; + +EXPLAIN (COSTS OFF) +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl; + +CREATE TEMP TABLE quad_box_tbl_ord_idx1 AS +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl; + +SELECT * +FROM quad_box_tbl_ord_seq1 seq FULL JOIN quad_box_tbl_ord_idx1 idx + ON seq.n = idx.n AND seq.id = idx.id AND + (seq.dist = idx.dist OR seq.dist IS NULL AND idx.dist IS NULL) +WHERE seq.id IS NULL OR idx.id IS NULL; + + +EXPLAIN (COSTS OFF) +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))'; + +CREATE TEMP TABLE quad_box_tbl_ord_idx2 AS +SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id +FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))'; + +SELECT * +FROM quad_box_tbl_ord_seq2 seq FULL JOIN quad_box_tbl_ord_idx2 idx + ON seq.n = idx.n AND seq.id = idx.id AND + (seq.dist = idx.dist OR seq.dist IS NULL AND idx.dist IS NULL) +WHERE seq.id IS NULL OR idx.id IS NULL; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/src/test/singlenode_regress/sql/brin.sql b/src/test/singlenode_regress/sql/brin.sql new file mode 100644 index 00000000000..1116b12a185 --- /dev/null +++ b/src/test/singlenode_regress/sql/brin.sql @@ -0,0 +1,513 @@ +CREATE TABLE brintest (byteacol bytea, + charcol "char", + namecol name, + int8col bigint, + int2col smallint, + int4col integer, + textcol text, + oidcol oid, + tidcol tid, + float4col real, + float8col double precision, + macaddrcol macaddr, + inetcol inet, + cidrcol cidr, + bpcharcol character, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + bitcol bit(10), + varbitcol bit varying(16), + numericcol numeric, + uuidcol uuid, + int4rangecol int4range, + lsncol pg_lsn, + boxcol box +) WITH (fillfactor=10, autovacuum_enabled=off); + +INSERT INTO brintest SELECT + repeat(stringu1, 8)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 8), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 100; + +-- throw in some NULL's and different values +INSERT INTO brintest (inetcol, cidrcol, int4rangecol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous, + 'empty'::int4range +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; + +CREATE INDEX brinidx ON brintest USING brin ( + byteacol, + charcol, + namecol, + int8col, + int2col, + int4col, + textcol, + oidcol, + tidcol, + float4col, + float8col, + macaddrcol, + inetcol inet_inclusion_ops, + inetcol inet_minmax_ops, + cidrcol inet_inclusion_ops, + cidrcol inet_minmax_ops, + bpcharcol, + datecol, + timecol, + timestampcol, + timestamptzcol, + intervalcol, + timetzcol, + bitcol, + varbitcol, + numericcol, + uuidcol, + int4rangecol, + lsncol, + boxcol +) with (pages_per_range = 1); + +CREATE TABLE brinopers (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); + +INSERT INTO brinopers VALUES + ('byteacol', 'bytea', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZZZZZ, ZZZZZZ}', + '{100, 100, 1, 100, 100}'), + ('charcol', '"char"', + '{>, >=, =, <=, <}', + '{A, A, M, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('namecol', 'name', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, MAAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 2, 100, 100}'), + ('int2col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int8col', 'int2', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int4', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 1257141600, 1428427143, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('textcol', 'text', + '{>, >=, =, <=, <}', + '{ABABAB, ABABAB, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 1, 100, 100}'), + ('oidcol', 'oid', + '{>, >=, =, <=, <}', + '{0, 0, 8800, 9999, 9999}', + '{100, 100, 1, 100, 100}'), + ('tidcol', 'tid', + '{>, >=, =, <=, <}', + '{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}', + '{100, 100, 1, 100, 100}'), + ('float4col', 'float4', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float4col', 'float8', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float8col', 'float4', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('float8col', 'float8', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('macaddrcol', 'macaddr', + '{>, >=, =, <=, <}', + '{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}', + '{99, 100, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 1, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('inetcol', 'cidr', + '{&&, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'cidr', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('bpcharcol', 'bpchar', + '{>, >=, =, <=, <}', + '{A, A, W, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('datecol', 'date', + '{>, >=, =, <=, <}', + '{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}', + '{100, 100, 1, 100, 100}'), + ('timecol', 'time', + '{>, >=, =, <=, <}', + '{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamp', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestamptzcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}', + '{100, 100, 1, 100, 100}'), + ('intervalcol', 'interval', + '{>, >=, =, <=, <}', + '{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}', + '{100, 100, 1, 100, 100}'), + ('timetzcol', 'timetz', + '{>, >=, =, <=, <}', + '{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}', + '{99, 100, 2, 100, 100}'), + ('bitcol', 'bit(10)', + '{>, >=, =, <=, <}', + '{0000000010, 0000000010, 0011011110, 1111111000, 1111111000}', + '{100, 100, 1, 100, 100}'), + ('varbitcol', 'varbit(16)', + '{>, >=, =, <=, <}', + '{0000000000000100, 0000000000000100, 0001010001100110, 1111111111111000, 1111111111111000}', + '{100, 100, 1, 100, 100}'), + ('numericcol', 'numeric', + '{>, >=, =, <=, <}', + '{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}', + '{100, 100, 1, 100, 100}'), + ('uuidcol', 'uuid', + '{>, >=, =, <=, <}', + '{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}', + '{100, 100, 1, 100, 100}'), + ('int4rangecol', 'int4range', + '{<<, &<, &&, &>, >>, @>, <@, =, <, <=, >, >=}', + '{"[10000,)","[10000,)","(,]","[3,4)","[36,44)","(1500,1501]","[3,4)","[222,1222)","[36,44)","[43,1043)","[367,4466)","[519,)"}', + '{53, 53, 53, 53, 50, 22, 72, 1, 74, 75, 34, 21}'), + ('int4rangecol', 'int4range', + '{@>, <@, =, <=, >, >=}', + '{empty, empty, empty, empty, empty, empty}', + '{125, 72, 72, 72, 53, 125}'), + ('int4rangecol', 'int4', + '{@>}', + '{1500}', + '{22}'), + ('lsncol', 'pg_lsn', + '{>, >=, =, <=, <, IS, IS NOT}', + '{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}', + '{100, 100, 1, 100, 100, 25, 100}'), + ('boxcol', 'point', + '{@>}', + '{"(500,43)"}', + '{11}'), + ('boxcol', 'box', + '{<<, &<, &&, &>, >>, <<|, &<|, |&>, |>>, @>, <@, ~=}', + '{"((1000,2000),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3,4))","((1000,2000),(3000,4000))","((1,2000),(3,4000))","((1000,2),(3000,4))","((1,2),(3,4))","((1,2),(300,400))","((1,2),(3000,4000))","((222,1222),(44,45))"}', + '{100, 100, 100, 99, 96, 100, 100, 99, 96, 1, 99, 1}'); + +DO $x$ +DECLARE + r record; + r2 record; + cond text; + idx_ctids tid[]; + ss_ctids tid[]; + count int; + plan_ok bool; + plan_line text; +BEGIN + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers, unnest(op) WITH ORDINALITY AS oper LOOP + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest WHERE %s $y$, cond) + INTO idx_ctids; + + -- run the query using a seqscan + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest WHERE %s $y$, cond) + INTO ss_ctids; + + -- make sure both return the same results + count := array_length(idx_ctids, 1); + + IF NOT (count = array_length(ss_ctids, 1) AND + idx_ctids @> ss_ctids AND + idx_ctids <@ ss_ctids) THEN + -- report the results of each scan to make the differences obvious + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + END LOOP; +END; +$x$; + +RESET enable_seqscan; +RESET enable_bitmapscan; + +INSERT INTO brintest SELECT + repeat(stringu1, 42)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 42), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; + +SELECT brin_desummarize_range('brinidx', 0); +VACUUM brintest; -- force a summarization cycle in brinidx + +UPDATE brintest SET int8col = int8col * int4col; +UPDATE brintest SET textcol = '' WHERE textcol IS NOT NULL; + +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest'); -- error, not an index +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +SELECT brin_summarize_new_values('brinidx'); -- ok, no change expected + +-- Tests for brin_desummarize_range +SELECT brin_desummarize_range('brinidx', -1); -- error, invalid range +SELECT brin_desummarize_range('brinidx', 0); +SELECT brin_desummarize_range('brinidx', 0); +SELECT brin_desummarize_range('brinidx', 100000000); + +-- Test brin_summarize_range +CREATE TABLE brin_summarize ( + value int +) WITH (fillfactor=10, autovacuum_enabled=false); +CREATE INDEX brin_summarize_idx ON brin_summarize USING brin (value) WITH (pages_per_range=2); +-- Fill a few pages +DO $$ +DECLARE curtid tid; +BEGIN + LOOP + INSERT INTO brin_summarize VALUES (1) RETURNING ctid INTO curtid; + EXIT WHEN curtid > tid '(2, 0)'; + END LOOP; +END; +$$; + +-- summarize one range +SELECT brin_summarize_range('brin_summarize_idx', 0); +-- nothing: already summarized +SELECT brin_summarize_range('brin_summarize_idx', 1); +-- summarize one range +SELECT brin_summarize_range('brin_summarize_idx', 2); +-- summarize all pages +SELECT brin_summarize_range('brin_summarize_idx', 4294967295); +-- nothing: page doesn't exist in table +SELECT brin_summarize_range('brin_summarize_idx', 4294967295); +-- invalid block number values +SELECT brin_summarize_range('brin_summarize_idx', -1); +SELECT brin_summarize_range('brin_summarize_idx', 4294967296); + +-- test value merging in add_value +CREATE TABLE brintest_2 (n numrange); +CREATE INDEX brinidx_2 ON brintest_2 USING brin (n); +INSERT INTO brintest_2 VALUES ('empty'); +INSERT INTO brintest_2 VALUES (numrange(0, 2^1000::numeric)); +INSERT INTO brintest_2 VALUES ('(-1, 0)'); + +SELECT brin_desummarize_range('brinidx', 0); +SELECT brin_summarize_range('brinidx', 0); +DROP TABLE brintest_2; + +-- test brin cost estimates behave sanely based on correlation of values +CREATE TABLE brin_test (a INT, b INT); +INSERT INTO brin_test SELECT x/100,x%100 FROM generate_series(1,10000) x(x); +CREATE INDEX brin_test_a_idx ON brin_test USING brin (a) WITH (pages_per_range = 2); +CREATE INDEX brin_test_b_idx ON brin_test USING brin (b) WITH (pages_per_range = 2); +VACUUM ANALYZE brin_test; + +-- Ensure brin index is used when columns are perfectly correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test WHERE a = 1; +-- Ensure brin index is not used when values are not correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test WHERE b = 1; + +-- make sure data are properly de-toasted in BRIN index +CREATE TABLE brintest_3 (a text, b text, c text, d text); + +-- long random strings (~2000 chars each, so ~6kB for min/max on two +-- columns) to trigger toasting +WITH rand_value AS (SELECT string_agg(md5(i::text),'') AS val FROM generate_series(1,60) s(i)) +INSERT INTO brintest_3 +SELECT val, val, val, val FROM rand_value; + +CREATE INDEX brin_test_toast_idx ON brintest_3 USING brin (b, c); +DELETE FROM brintest_3; + +-- We need to wait a bit for all transactions to complete, so that the +-- vacuum actually removes the TOAST rows. Creating an index concurrently +-- is a one way to achieve that, because it does exactly such wait. +CREATE INDEX CONCURRENTLY brin_test_temp_idx ON brintest_3(a); +DROP INDEX brin_test_temp_idx; + +-- vacuum the table, to discard TOAST data +VACUUM brintest_3; + +-- retry insert with a different random-looking (but deterministic) value +-- the value is different, and so should replace either min or max in the +-- brin summary +WITH rand_value AS (SELECT string_agg(md5((-i)::text),'') AS val FROM generate_series(1,60) s(i)) +INSERT INTO brintest_3 +SELECT val, val, val, val FROM rand_value; + +-- now try some queries, accessing the brin index +SET enable_seqscan = off; + +EXPLAIN (COSTS OFF) +SELECT * FROM brintest_3 WHERE b < '0'; + +SELECT * FROM brintest_3 WHERE b < '0'; + +DROP TABLE brintest_3; +RESET enable_seqscan; diff --git a/src/test/singlenode_regress/sql/brin_ao.sql b/src/test/singlenode_regress/sql/brin_ao.sql new file mode 100644 index 00000000000..81a4d7b1bb8 --- /dev/null +++ b/src/test/singlenode_regress/sql/brin_ao.sql @@ -0,0 +1,474 @@ +CREATE TABLE brintest_ao (byteacol bytea, + charcol "char", + namecol name, + int8col bigint, + int2col smallint, + int4col integer, + textcol text, + oidcol oid, + tidcol tid, + float4col real, + float8col double precision, + macaddrcol macaddr, + inetcol inet, + cidrcol cidr, + bpcharcol character, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + bitcol bit(10), + varbitcol bit varying(16), + numericcol numeric, + uuidcol uuid, + int4rangecol int4range, + lsncol pg_lsn, + boxcol box +) WITH (appendonly = true); + +INSERT INTO brintest_ao SELECT + repeat(stringu1, 8)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 8), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 100; + +-- throw in some NULL's and different values +INSERT INTO brintest_ao (inetcol, cidrcol, int4rangecol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous, + 'empty'::int4range +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; + +CREATE INDEX brinaoidx ON brintest_ao USING brin ( + byteacol, + charcol, + namecol, + int8col, + int2col, + int4col, + textcol, + oidcol, + tidcol, + float4col, + float8col, + macaddrcol, + inetcol inet_inclusion_ops, + inetcol inet_minmax_ops, + cidrcol inet_inclusion_ops, + cidrcol inet_minmax_ops, + bpcharcol, + datecol, + timecol, + timestampcol, + timestamptzcol, + intervalcol, + timetzcol, + bitcol, + varbitcol, + numericcol, + uuidcol, + int4rangecol, + lsncol, + boxcol +) with (pages_per_range = 1); + +CREATE TABLE brinopers_ao (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); + +INSERT INTO brinopers_ao VALUES + ('byteacol', 'bytea', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZZZZZ, ZZZZZZ}', + '{100, 100, 1, 100, 100}'), + ('charcol', '"char"', + '{>, >=, =, <=, <}', + '{A, A, M, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('namecol', 'name', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, MAAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 2, 100, 100}'), + ('int2col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int8col', 'int2', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int4', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 1257141600, 1428427143, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('textcol', 'text', + '{>, >=, =, <=, <}', + '{ABABAB, ABABAB, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 1, 100, 100}'), + ('oidcol', 'oid', + '{>, >=, =, <=, <}', + '{0, 0, 8800, 9999, 9999}', + '{100, 100, 1, 100, 100}'), + ('tidcol', 'tid', + '{>, >=, =, <=, <}', + '{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}', + '{100, 100, 1, 100, 100}'), + ('float4col', 'float4', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float4col', 'float8', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float8col', 'float4', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('float8col', 'float8', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('macaddrcol', 'macaddr', + '{>, >=, =, <=, <}', + '{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}', + '{99, 100, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 1, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('inetcol', 'cidr', + '{&&, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'cidr', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('bpcharcol', 'bpchar', + '{>, >=, =, <=, <}', + '{A, A, W, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('datecol', 'date', + '{>, >=, =, <=, <}', + '{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}', + '{100, 100, 1, 100, 100}'), + ('timecol', 'time', + '{>, >=, =, <=, <}', + '{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamp', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestamptzcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}', + '{100, 100, 1, 100, 100}'), + ('intervalcol', 'interval', + '{>, >=, =, <=, <}', + '{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}', + '{100, 100, 1, 100, 100}'), + ('timetzcol', 'timetz', + '{>, >=, =, <=, <}', + '{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}', + '{99, 100, 2, 100, 100}'), + ('bitcol', 'bit(10)', + '{>, >=, =, <=, <}', + '{0000000010, 0000000010, 0011011110, 1111111000, 1111111000}', + '{100, 100, 1, 100, 100}'), + ('varbitcol', 'varbit(16)', + '{>, >=, =, <=, <}', + '{0000000000000100, 0000000000000100, 0001010001100110, 1111111111111000, 1111111111111000}', + '{100, 100, 1, 100, 100}'), + ('numericcol', 'numeric', + '{>, >=, =, <=, <}', + '{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}', + '{100, 100, 1, 100, 100}'), + ('uuidcol', 'uuid', + '{>, >=, =, <=, <}', + '{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}', + '{100, 100, 1, 100, 100}'), + ('int4rangecol', 'int4range', + '{<<, &<, &&, &>, >>, @>, <@, =, <, <=, >, >=}', + '{"[10000,)","[10000,)","(,]","[3,4)","[36,44)","(1500,1501]","[3,4)","[222,1222)","[36,44)","[43,1043)","[367,4466)","[519,)"}', + '{53, 53, 53, 53, 50, 22, 72, 1, 74, 75, 34, 21}'), + ('int4rangecol', 'int4range', + '{@>, <@, =, <=, >, >=}', + '{empty, empty, empty, empty, empty, empty}', + '{125, 72, 72, 72, 53, 125}'), + ('int4rangecol', 'int4', + '{@>}', + '{1500}', + '{22}'), + ('lsncol', 'pg_lsn', + '{>, >=, =, <=, <, IS, IS NOT}', + '{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}', + '{100, 100, 1, 100, 100, 25, 100}'), + ('boxcol', 'point', + '{@>}', + '{"(500,43)"}', + '{11}'), + ('boxcol', 'box', + '{<<, &<, &&, &>, >>, <<|, &<|, |&>, |>>, @>, <@, ~=}', + '{"((1000,2000),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3,4))","((1000,2000),(3000,4000))","((1,2000),(3,4000))","((1000,2),(3000,4))","((1,2),(3,4))","((1,2),(300,400))","((1,2),(3000,4000))","((222,1222),(44,45))"}', + '{100, 100, 100, 99, 96, 100, 100, 99, 96, 1, 99, 1}'); + +DO $x$ +DECLARE + r record; + r2 record; + cond text; + count int; + mismatch bool; + is_orca bool; + plan_ok bool; + is_planner_plan bool; + plan_line text; +BEGIN + -- determine whether we are using ORCA or planner + is_orca := false; + FOR r IN EXECUTE 'show optimizer' LOOP + IF r.optimizer = 'on' THEN + is_orca := true; + END IF; + END LOOP; + + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_ao, unnest(op) WITH ORDINALITY AS oper order by colname, typ LOOP + mismatch := false; + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + CREATE TEMP TABLE brin_result (cid tid); + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + SET optimizer_enable_tablescan = 0; + SET optimizer_enable_bitmapscan = 1; + + plan_ok := false; + is_planner_plan := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT ctid FROM brintest_ao WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest_ao%' THEN + plan_ok := true; + END IF; + IF plan_line LIKE '%Postgres query optimizer%' THEN + is_planner_plan := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + -- in single node, orca is not enabled yet + -- IF is_orca AND is_planner_plan THEN + -- RAISE WARNING 'ORCA did not produce a bitmap indexscan plan for %', r; + -- END IF; + + EXECUTE format($y$INSERT INTO brin_result SELECT ctid FROM brintest_ao WHERE %s $y$, cond); + + -- run the query using a seqscan + CREATE TEMP TABLE brin_result_ss (cid tid); + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + SET optimizer_enable_tablescan = 1; + SET optimizer_enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT ctid FROM brintest_ao WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest_ao%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$INSERT INTO brin_result_ss SELECT ctid FROM brintest_ao WHERE %s $y$, cond); + + -- make sure both return the same results + PERFORM * FROM brin_result EXCEPT ALL SELECT * FROM brin_result_ss; + GET DIAGNOSTICS count = ROW_COUNT; + IF count <> 0 THEN + mismatch = true; + END IF; + PERFORM * FROM brin_result_ss EXCEPT ALL SELECT * FROM brin_result; + GET DIAGNOSTICS count = ROW_COUNT; + IF count <> 0 THEN + mismatch = true; + END IF; + + -- report the results of each scan to make the differences obvious + IF mismatch THEN + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + SET optimizer_enable_tablescan = 1; + SET optimizer_enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_ao WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + SET optimizer_enable_tablescan = 0; + SET optimizer_enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_ao WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + SELECT count(*) INTO count FROM brin_result; + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + + -- drop the temporary tables + DROP TABLE brin_result; + DROP TABLE brin_result_ss; + END LOOP; +END; +$x$; +-- Note: ORCA does not support all of the above operators: +-- - standard comparison operators on inet and cidr columns +-- because ORCA does not look at the second occurrence of a column in an index, +-- even if it uses a different operator class +-- - IS NULL and IS NOT NULL operators, because ORCA supports only binary operators +-- - namecol predicates, falls back because of the use of a non-default collation + +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET optimizer_enable_tablescan; +RESET optimizer_enable_bitmapscan; + +INSERT INTO brintest_ao SELECT + repeat(stringu1, 42)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 42), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; + +VACUUM brintest_ao; -- force a summarization cycle in brinaoidx + +UPDATE brintest_ao SET int8col = int8col * int4col; +UPDATE brintest_ao SET textcol = '' WHERE textcol IS NOT NULL; + +-- Vaccum again so that a new segment file is created. +VACUUM brintest_ao; +INSERT INTO brintest_ao SELECT * FROM brintest_ao; +-- We should have two segment files per Cloudberry segment (QE). +-- start_ignore +SELECT segment_id, segno, tupcount, state FROM gp_toolkit.__gp_aoseg('brintest_ao'); +-- end_ignore + +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest_ao'); -- error, not an index +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +-- New strategy of VACUUM AO/CO was introduced by PR #13255 for performance enhancement. +-- Index dead tuples will not always be cleaned up completely after VACUUM, resulting +-- brin_summarize_new_values() will not always be accurate. So ignore the check to +-- coordinate with the new behavior. +-- start_ignore +SELECT brin_summarize_new_values('brinaoidx'); -- ok, no change expected +-- end_ignore diff --git a/src/test/singlenode_regress/sql/brin_aocs.sql b/src/test/singlenode_regress/sql/brin_aocs.sql new file mode 100644 index 00000000000..df5c167f3a3 --- /dev/null +++ b/src/test/singlenode_regress/sql/brin_aocs.sql @@ -0,0 +1,474 @@ +CREATE TABLE brintest_aocs (byteacol bytea, + charcol "char", + namecol name, + int8col bigint, + int2col smallint, + int4col integer, + textcol text, + oidcol oid, + tidcol tid, + float4col real, + float8col double precision, + macaddrcol macaddr, + inetcol inet, + cidrcol cidr, + bpcharcol character, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + bitcol bit(10), + varbitcol bit varying(16), + numericcol numeric, + uuidcol uuid, + int4rangecol int4range, + lsncol pg_lsn, + boxcol box +) WITH (appendonly = true, orientation=column); + +INSERT INTO brintest_aocs SELECT + repeat(stringu1, 8)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 8), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 100; + +-- throw in some NULL's and different values +INSERT INTO brintest_aocs (inetcol, cidrcol, int4rangecol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous, + 'empty'::int4range +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; + +CREATE INDEX brinaocsidx ON brintest_aocs USING brin ( + byteacol, + charcol, + namecol, + int8col, + int2col, + int4col, + textcol, + oidcol, + tidcol, + float4col, + float8col, + macaddrcol, + inetcol inet_inclusion_ops, + inetcol inet_minmax_ops, + cidrcol inet_inclusion_ops, + cidrcol inet_minmax_ops, + bpcharcol, + datecol, + timecol, + timestampcol, + timestamptzcol, + intervalcol, + timetzcol, + bitcol, + varbitcol, + numericcol, + uuidcol, + int4rangecol, + lsncol, + boxcol +) with (pages_per_range = 1); + +CREATE TABLE brinopers_aocs (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); + +INSERT INTO brinopers_aocs VALUES + ('byteacol', 'bytea', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZZZZZ, ZZZZZZ}', + '{100, 100, 1, 100, 100}'), + ('charcol', '"char"', + '{>, >=, =, <=, <}', + '{A, A, M, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('namecol', 'name', + '{>, >=, =, <=, <}', + '{AAAAAA, AAAAAA, MAAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 2, 100, 100}'), + ('int2col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int8col', 'int2', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int4', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 1257141600, 1428427143, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('textcol', 'text', + '{>, >=, =, <=, <}', + '{ABABAB, ABABAB, BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA, ZZAAAA, ZZAAAA}', + '{100, 100, 1, 100, 100}'), + ('oidcol', 'oid', + '{>, >=, =, <=, <}', + '{0, 0, 8800, 9999, 9999}', + '{100, 100, 1, 100, 100}'), + ('tidcol', 'tid', + '{>, >=, =, <=, <}', + '{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}', + '{100, 100, 1, 100, 100}'), + ('float4col', 'float4', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float4col', 'float8', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float8col', 'float4', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('float8col', 'float8', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('macaddrcol', 'macaddr', + '{>, >=, =, <=, <}', + '{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}', + '{99, 100, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 1, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('inetcol', 'cidr', + '{&&, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('inetcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'inet', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14.231/24, 10.2.14.231/25, 10.2.14.231/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'inet', + '{&&, >>=, <<=, =}', + '{fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46, fe80::6e40:8ff:fea9:a673/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('cidrcol', 'cidr', + '{&&, =, <, <=, >, >=, >>=, >>, <<=, <<}', + '{10/8, 10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0, 10.2.14/24, 10.2.14/25, 10/8, 0/0}', + '{100, 2, 100, 100, 125, 125, 2, 2, 100, 100}'), + ('cidrcol', 'cidr', + '{&&, >>=, <<=, =}', + '{fe80::/32, fe80::6e40:8ff:fea9:8c46, fe80::/32, fe80::6e40:8ff:fea9:8c46}', + '{25, 1, 25, 1}'), + ('bpcharcol', 'bpchar', + '{>, >=, =, <=, <}', + '{A, A, W, Z, Z}', + '{97, 100, 6, 100, 98}'), + ('datecol', 'date', + '{>, >=, =, <=, <}', + '{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}', + '{100, 100, 1, 100, 100}'), + ('timecol', 'time', + '{>, >=, =, <=, <}', + '{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamp', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestamptzcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}', + '{100, 100, 1, 100, 100}'), + ('intervalcol', 'interval', + '{>, >=, =, <=, <}', + '{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}', + '{100, 100, 1, 100, 100}'), + ('timetzcol', 'timetz', + '{>, >=, =, <=, <}', + '{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}', + '{99, 100, 2, 100, 100}'), + ('bitcol', 'bit(10)', + '{>, >=, =, <=, <}', + '{0000000010, 0000000010, 0011011110, 1111111000, 1111111000}', + '{100, 100, 1, 100, 100}'), + ('varbitcol', 'varbit(16)', + '{>, >=, =, <=, <}', + '{0000000000000100, 0000000000000100, 0001010001100110, 1111111111111000, 1111111111111000}', + '{100, 100, 1, 100, 100}'), + ('numericcol', 'numeric', + '{>, >=, =, <=, <}', + '{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}', + '{100, 100, 1, 100, 100}'), + ('uuidcol', 'uuid', + '{>, >=, =, <=, <}', + '{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}', + '{100, 100, 1, 100, 100}'), + ('int4rangecol', 'int4range', + '{<<, &<, &&, &>, >>, @>, <@, =, <, <=, >, >=}', + '{"[10000,)","[10000,)","(,]","[3,4)","[36,44)","(1500,1501]","[3,4)","[222,1222)","[36,44)","[43,1043)","[367,4466)","[519,)"}', + '{53, 53, 53, 53, 50, 22, 72, 1, 74, 75, 34, 21}'), + ('int4rangecol', 'int4range', + '{@>, <@, =, <=, >, >=}', + '{empty, empty, empty, empty, empty, empty}', + '{125, 72, 72, 72, 53, 125}'), + ('int4rangecol', 'int4', + '{@>}', + '{1500}', + '{22}'), + ('lsncol', 'pg_lsn', + '{>, >=, =, <=, <, IS, IS NOT}', + '{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}', + '{100, 100, 1, 100, 100, 25, 100}'), + ('boxcol', 'point', + '{@>}', + '{"(500,43)"}', + '{11}'), + ('boxcol', 'box', + '{<<, &<, &&, &>, >>, <<|, &<|, |&>, |>>, @>, <@, ~=}', + '{"((1000,2000),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3000,4000))","((1,2),(3,4))","((1000,2000),(3000,4000))","((1,2000),(3,4000))","((1000,2),(3000,4))","((1,2),(3,4))","((1,2),(300,400))","((1,2),(3000,4000))","((222,1222),(44,45))"}', + '{100, 100, 100, 99, 96, 100, 100, 99, 96, 1, 99, 1}'); + +DO $x$ +DECLARE + r record; + r2 record; + cond text; + count int; + mismatch bool; + is_orca bool; + plan_ok bool; + is_planner_plan bool; + plan_line text; +BEGIN + -- determine whether we are using ORCA or planner + is_orca := false; + FOR r IN EXECUTE 'show optimizer' LOOP + IF r.optimizer = 'on' THEN + is_orca := true; + END IF; + END LOOP; + + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_aocs, unnest(op) WITH ORDINALITY AS oper order by colname, typ LOOP + mismatch := false; + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + CREATE TEMP TABLE brin_result (cid tid); + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + SET optimizer_enable_tablescan = 0; + SET optimizer_enable_bitmapscan = 1; + + plan_ok := false; + is_planner_plan := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT ctid FROM brintest_aocs WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest_aocs%' THEN + plan_ok := true; + END IF; + IF plan_line LIKE '%Postgres query optimizer%' THEN + is_planner_plan := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + -- in single node, orca is not enabled yet + -- IF is_orca AND is_planner_plan THEN + -- RAISE WARNING 'ORCA did not produce a bitmap indexscan plan for %', r; + -- END IF; + + EXECUTE format($y$INSERT INTO brin_result SELECT ctid FROM brintest_aocs WHERE %s $y$, cond); + + -- run the query using a seqscan + CREATE TEMP TABLE brin_result_ss (cid tid); + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + SET optimizer_enable_tablescan = 1; + SET optimizer_enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT ctid FROM brintest_aocs WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest_aocs%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$INSERT INTO brin_result_ss SELECT ctid FROM brintest_aocs WHERE %s $y$, cond); + + -- make sure both return the same results + PERFORM * FROM brin_result EXCEPT ALL SELECT * FROM brin_result_ss; + GET DIAGNOSTICS count = ROW_COUNT; + IF count <> 0 THEN + mismatch = true; + END IF; + PERFORM * FROM brin_result_ss EXCEPT ALL SELECT * FROM brin_result; + GET DIAGNOSTICS count = ROW_COUNT; + IF count <> 0 THEN + mismatch = true; + END IF; + + -- report the results of each scan to make the differences obvious + IF mismatch THEN + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + SET optimizer_enable_tablescan = 1; + SET optimizer_enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_aocs WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + SET optimizer_enable_tablescan = 0; + SET optimizer_enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_aocs WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + SELECT count(*) INTO count FROM brin_result; + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + + -- drop the temporary tables + DROP TABLE brin_result; + DROP TABLE brin_result_ss; + END LOOP; +END; +$x$; +-- Note: ORCA does not support all of the above operators: +-- - standard comparison operators on inet and cidr columns +-- because ORCA does not look at the second occurrence of a column in an index, +-- even if it uses a different operator class +-- - IS NULL and IS NOT NULL operators, because ORCA supports only binary operators +-- - namecol predicates, falls back because of the use of a non-default collation + +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET optimizer_enable_tablescan; +RESET optimizer_enable_bitmapscan; + +INSERT INTO brintest_aocs SELECT + repeat(stringu1, 42)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 42), + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + thousand::bit(10), + tenthous::bit(16)::varbit, + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + int4range(thousand, twothousand), + format('%s/%s%s', odd, even, tenthous)::pg_lsn, + box(point(odd, even), point(thousand, twothousand)) +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; + +VACUUM brintest_aocs; -- force a summarization cycle in brinaocsidx + +UPDATE brintest_aocs SET int8col = int8col * int4col; +UPDATE brintest_aocs SET textcol = '' WHERE textcol IS NOT NULL; + +-- Vaccum again so that a new segment file is created. +VACUUM brintest_aocs; +INSERT INTO brintest_aocs SELECT * FROM brintest_aocs; +-- We should have two segment files per Cloudberry segment (QE). +-- start_ignore +SELECT segment_id, segno, tupcount, state FROM gp_toolkit.__gp_aocsseg('brintest_aocs'); +-- end_ignore + +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest_aocs'); -- error, not an index +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +-- New strategy of VACUUM AO/CO was introduced by PR #13255 for performance enhancement. +-- Index dead tuples will not always be cleaned up completely after VACUUM, resulting +-- brin_summarize_new_values() will not always be accurate. So ignore the check to +-- coordinate with the new behavior. +-- start_ignore +SELECT brin_summarize_new_values('brinaocsidx'); -- ok, no change expected +-- end_ignore diff --git a/src/test/singlenode_regress/sql/brin_bloom.sql b/src/test/singlenode_regress/sql/brin_bloom.sql new file mode 100644 index 00000000000..84572fdc2fb --- /dev/null +++ b/src/test/singlenode_regress/sql/brin_bloom.sql @@ -0,0 +1,376 @@ +CREATE TABLE brintest_bloom (byteacol bytea, + charcol "char", + namecol name, + int8col bigint, + int2col smallint, + int4col integer, + textcol text, + oidcol oid, + float4col real, + float8col double precision, + macaddrcol macaddr, + inetcol inet, + cidrcol cidr, + bpcharcol character, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + numericcol numeric, + uuidcol uuid, + lsncol pg_lsn +) WITH (fillfactor=10); + +INSERT INTO brintest_bloom SELECT + repeat(stringu1, 8)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 8), + unique1::oid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + format('%s/%s%s', odd, even, tenthous)::pg_lsn +FROM tenk1 ORDER BY unique2 LIMIT 100; + +-- throw in some NULL's and different values +INSERT INTO brintest_bloom (inetcol, cidrcol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; + +-- test bloom specific index options +-- ndistinct must be >= -1.0 +CREATE INDEX brinidx_bloom ON brintest_bloom USING brin ( + byteacol bytea_bloom_ops(n_distinct_per_range = -1.1) +); +-- false_positive_rate must be between 0.0001 and 0.25 +CREATE INDEX brinidx_bloom ON brintest_bloom USING brin ( + byteacol bytea_bloom_ops(false_positive_rate = 0.00009) +); +CREATE INDEX brinidx_bloom ON brintest_bloom USING brin ( + byteacol bytea_bloom_ops(false_positive_rate = 0.26) +); + +CREATE INDEX brinidx_bloom ON brintest_bloom USING brin ( + byteacol bytea_bloom_ops, + charcol char_bloom_ops, + namecol name_bloom_ops, + int8col int8_bloom_ops, + int2col int2_bloom_ops, + int4col int4_bloom_ops, + textcol text_bloom_ops, + oidcol oid_bloom_ops, + float4col float4_bloom_ops, + float8col float8_bloom_ops, + macaddrcol macaddr_bloom_ops, + inetcol inet_bloom_ops, + cidrcol inet_bloom_ops, + bpcharcol bpchar_bloom_ops, + datecol date_bloom_ops, + timecol time_bloom_ops, + timestampcol timestamp_bloom_ops, + timestamptzcol timestamptz_bloom_ops, + intervalcol interval_bloom_ops, + timetzcol timetz_bloom_ops, + numericcol numeric_bloom_ops, + uuidcol uuid_bloom_ops, + lsncol pg_lsn_bloom_ops +) with (pages_per_range = 1); + +CREATE TABLE brinopers_bloom (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); + +INSERT INTO brinopers_bloom VALUES + ('byteacol', 'bytea', + '{=}', + '{BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA}', + '{1}'), + ('charcol', '"char"', + '{=}', + '{M}', + '{6}'), + ('namecol', 'name', + '{=}', + '{MAAAAA}', + '{2}'), + ('int2col', 'int2', + '{=}', + '{800}', + '{1}'), + ('int4col', 'int4', + '{=}', + '{800}', + '{1}'), + ('int8col', 'int8', + '{=}', + '{1257141600}', + '{1}'), + ('textcol', 'text', + '{=}', + '{BNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAABNAAAA}', + '{1}'), + ('oidcol', 'oid', + '{=}', + '{8800}', + '{1}'), + ('float4col', 'float4', + '{=}', + '{1}', + '{4}'), + ('float8col', 'float8', + '{=}', + '{0}', + '{1}'), + ('macaddrcol', 'macaddr', + '{=}', + '{2c:00:2d:00:16:00}', + '{2}'), + ('inetcol', 'inet', + '{=}', + '{10.2.14.231/24}', + '{1}'), + ('inetcol', 'cidr', + '{=}', + '{fe80::6e40:8ff:fea9:8c46}', + '{1}'), + ('cidrcol', 'inet', + '{=}', + '{10.2.14/24}', + '{2}'), + ('cidrcol', 'inet', + '{=}', + '{fe80::6e40:8ff:fea9:8c46}', + '{1}'), + ('cidrcol', 'cidr', + '{=}', + '{10.2.14/24}', + '{2}'), + ('cidrcol', 'cidr', + '{=}', + '{fe80::6e40:8ff:fea9:8c46}', + '{1}'), + ('bpcharcol', 'bpchar', + '{=}', + '{W}', + '{6}'), + ('datecol', 'date', + '{=}', + '{2009-12-01}', + '{1}'), + ('timecol', 'time', + '{=}', + '{02:28:57}', + '{1}'), + ('timestampcol', 'timestamp', + '{=}', + '{1964-03-24 19:26:45}', + '{1}'), + ('timestamptzcol', 'timestamptz', + '{=}', + '{1972-10-19 09:00:00-07}', + '{1}'), + ('intervalcol', 'interval', + '{=}', + '{1 mons 13 days 12:24}', + '{1}'), + ('timetzcol', 'timetz', + '{=}', + '{01:35:50+02}', + '{2}'), + ('numericcol', 'numeric', + '{=}', + '{2268164.347826086956521739130434782609}', + '{1}'), + ('uuidcol', 'uuid', + '{=}', + '{52225222-5222-5222-5222-522252225222}', + '{1}'), + ('lsncol', 'pg_lsn', + '{=, IS, IS NOT}', + '{44/455222, NULL, NULL}', + '{1, 25, 100}'); + +DO $x$ +DECLARE + r record; + r2 record; + cond text; + idx_ctids tid[]; + ss_ctids tid[]; + count int; + plan_ok bool; + plan_line text; +BEGIN + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_bloom, unnest(op) WITH ORDINALITY AS oper LOOP + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest_bloom%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) + INTO idx_ctids; + + -- run the query using a seqscan + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest_bloom%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) + INTO ss_ctids; + + -- make sure both return the same results + count := array_length(idx_ctids, 1); + + IF NOT (count = array_length(ss_ctids, 1) AND + idx_ctids @> ss_ctids AND + idx_ctids <@ ss_ctids) THEN + -- report the results of each scan to make the differences obvious + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_bloom WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_bloom WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + END LOOP; +END; +$x$; + +RESET enable_seqscan; +RESET enable_bitmapscan; + +INSERT INTO brintest_bloom SELECT + repeat(stringu1, 42)::bytea, + substr(stringu1, 1, 1)::"char", + stringu1::name, 142857 * tenthous, + thousand, + twothousand, + repeat(stringu1, 42), + unique1::oid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + substr(stringu1, 1, 1)::bpchar, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + format('%s/%s%s', odd, even, tenthous)::pg_lsn +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; + +SELECT brin_desummarize_range('brinidx_bloom', 0); +VACUUM brintest_bloom; -- force a summarization cycle in brinidx + +UPDATE brintest_bloom SET int8col = int8col * int4col; +UPDATE brintest_bloom SET textcol = '' WHERE textcol IS NOT NULL; + +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest_bloom'); -- error, not an index +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +SELECT brin_summarize_new_values('brinidx_bloom'); -- ok, no change expected (except for ORCA, which uses split updates) + +-- Tests for brin_desummarize_range +SELECT brin_desummarize_range('brinidx_bloom', -1); -- error, invalid range +SELECT brin_desummarize_range('brinidx_bloom', 0); +SELECT brin_desummarize_range('brinidx_bloom', 0); +SELECT brin_desummarize_range('brinidx_bloom', 100000000); + +-- Test brin_summarize_range +CREATE TABLE brin_summarize_bloom ( + value int +) WITH (fillfactor=10, autovacuum_enabled=false); +CREATE INDEX brin_summarize_bloom_idx ON brin_summarize_bloom USING brin (value) WITH (pages_per_range=2); +-- Fill a few pages +DO $$ +DECLARE curtid tid; +BEGIN + LOOP + INSERT INTO brin_summarize_bloom VALUES (1) RETURNING ctid INTO curtid; + EXIT WHEN curtid > tid '(2, 0)'; + END LOOP; +END; +$$; + +-- summarize one range +SELECT brin_summarize_range('brin_summarize_bloom_idx', 0); +-- nothing: already summarized +SELECT brin_summarize_range('brin_summarize_bloom_idx', 1); +-- summarize one range +SELECT brin_summarize_range('brin_summarize_bloom_idx', 2); +-- nothing: page doesn't exist in table +SELECT brin_summarize_range('brin_summarize_bloom_idx', 4294967295); +-- invalid block number values +SELECT brin_summarize_range('brin_summarize_bloom_idx', -1); +SELECT brin_summarize_range('brin_summarize_bloom_idx', 4294967296); + + +-- test brin cost estimates behave sanely based on correlation of values +CREATE TABLE brin_test_bloom (a INT, b INT); +INSERT INTO brin_test_bloom SELECT x/100,x%100 FROM generate_series(1,10000) x(x); +CREATE INDEX brin_test_bloom_a_idx ON brin_test_bloom USING brin (a) WITH (pages_per_range = 2); +CREATE INDEX brin_test_bloom_b_idx ON brin_test_bloom USING brin (b) WITH (pages_per_range = 2); +VACUUM ANALYZE brin_test_bloom; + +-- Ensure brin index is used when columns are perfectly correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test_bloom WHERE a = 1; +-- Ensure brin index is not used when values are not correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test_bloom WHERE b = 1; diff --git a/src/test/singlenode_regress/sql/brin_multi.sql b/src/test/singlenode_regress/sql/brin_multi.sql new file mode 100644 index 00000000000..265cb052fd0 --- /dev/null +++ b/src/test/singlenode_regress/sql/brin_multi.sql @@ -0,0 +1,418 @@ +CREATE TABLE brintest_multi ( + int8col bigint, + int2col smallint, + int4col integer, + oidcol oid, + tidcol tid, + float4col real, + float8col double precision, + macaddrcol macaddr, + macaddr8col macaddr8, + inetcol inet, + cidrcol cidr, + datecol date, + timecol time without time zone, + timestampcol timestamp without time zone, + timestamptzcol timestamp with time zone, + intervalcol interval, + timetzcol time with time zone, + numericcol numeric, + uuidcol uuid, + lsncol pg_lsn +) WITH (fillfactor=10); + +INSERT INTO brintest_multi SELECT + 142857 * tenthous, + thousand, + twothousand, + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + substr(md5(unique1::text), 1, 16)::macaddr8, + inet '10.2.3.4/24' + tenthous, + cidr '10.2.3/24' + tenthous, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20+02' + hundred * interval '15 seconds', + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + format('%s/%s%s', odd, even, tenthous)::pg_lsn +FROM tenk1 ORDER BY unique2 LIMIT 100; + +-- throw in some NULL's and different values +INSERT INTO brintest_multi (inetcol, cidrcol) SELECT + inet 'fe80::6e40:8ff:fea9:8c46' + tenthous, + cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous +FROM tenk1 ORDER BY thousand, tenthous LIMIT 25; + +-- test minmax-multi specific index options +-- number of values must be >= 16 +CREATE INDEX brinidx_multi ON brintest_multi USING brin ( + int8col int8_minmax_multi_ops(values_per_range = 7) +); +-- number of values must be <= 256 +CREATE INDEX brinidx_multi ON brintest_multi USING brin ( + int8col int8_minmax_multi_ops(values_per_range = 257) +); + +-- first create an index with a single page range, to force compaction +-- due to exceeding the number of values per summary +CREATE INDEX brinidx_multi ON brintest_multi USING brin ( + int8col int8_minmax_multi_ops, + int2col int2_minmax_multi_ops, + int4col int4_minmax_multi_ops, + oidcol oid_minmax_multi_ops, + tidcol tid_minmax_multi_ops, + float4col float4_minmax_multi_ops, + float8col float8_minmax_multi_ops, + macaddrcol macaddr_minmax_multi_ops, + macaddr8col macaddr8_minmax_multi_ops, + inetcol inet_minmax_multi_ops, + cidrcol inet_minmax_multi_ops, + datecol date_minmax_multi_ops, + timecol time_minmax_multi_ops, + timestampcol timestamp_minmax_multi_ops, + timestamptzcol timestamptz_minmax_multi_ops, + intervalcol interval_minmax_multi_ops, + timetzcol timetz_minmax_multi_ops, + numericcol numeric_minmax_multi_ops, + uuidcol uuid_minmax_multi_ops, + lsncol pg_lsn_minmax_multi_ops +); + +DROP INDEX brinidx_multi; + +CREATE INDEX brinidx_multi ON brintest_multi USING brin ( + int8col int8_minmax_multi_ops, + int2col int2_minmax_multi_ops, + int4col int4_minmax_multi_ops, + oidcol oid_minmax_multi_ops, + tidcol tid_minmax_multi_ops, + float4col float4_minmax_multi_ops, + float8col float8_minmax_multi_ops, + macaddrcol macaddr_minmax_multi_ops, + macaddr8col macaddr8_minmax_multi_ops, + inetcol inet_minmax_multi_ops, + cidrcol inet_minmax_multi_ops, + datecol date_minmax_multi_ops, + timecol time_minmax_multi_ops, + timestampcol timestamp_minmax_multi_ops, + timestamptzcol timestamptz_minmax_multi_ops, + intervalcol interval_minmax_multi_ops, + timetzcol timetz_minmax_multi_ops, + numericcol numeric_minmax_multi_ops, + uuidcol uuid_minmax_multi_ops, + lsncol pg_lsn_minmax_multi_ops +) with (pages_per_range = 1); + +CREATE TABLE brinopers_multi (colname name, typ text, + op text[], value text[], matches int[], + check (cardinality(op) = cardinality(value)), + check (cardinality(op) = cardinality(matches))); + +INSERT INTO brinopers_multi VALUES + ('int2col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int2col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int2', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int4', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1999}', + '{100, 100, 1, 100, 100}'), + ('int4col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 800, 1999, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('int8col', 'int2', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int4', + '{>, >=}', + '{0, 0}', + '{100, 100}'), + ('int8col', 'int8', + '{>, >=, =, <=, <}', + '{0, 0, 1257141600, 1428427143, 1428427143}', + '{100, 100, 1, 100, 100}'), + ('oidcol', 'oid', + '{>, >=, =, <=, <}', + '{0, 0, 8800, 9999, 9999}', + '{100, 100, 1, 100, 100}'), + ('tidcol', 'tid', + '{>, >=, =, <=, <}', + '{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}', + '{100, 100, 1, 100, 100}'), + ('float4col', 'float4', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float4col', 'float8', + '{>, >=, =, <=, <}', + '{0.0103093, 0.0103093, 1, 1, 1}', + '{100, 100, 4, 100, 96}'), + ('float8col', 'float4', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('float8col', 'float8', + '{>, >=, =, <=, <}', + '{0, 0, 0, 1.98, 1.98}', + '{99, 100, 1, 100, 100}'), + ('macaddrcol', 'macaddr', + '{>, >=, =, <=, <}', + '{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}', + '{99, 100, 2, 100, 100}'), + ('macaddr8col', 'macaddr8', + '{>, >=, =, <=, <}', + '{b1:d1:0e:7b:af:a4:42:12, d9:35:91:bd:f7:86:0e:1e, 72:8f:20:6c:2a:01:bf:57, 23:e8:46:63:86:07:ad:cb, 13:16:8e:6a:2e:6c:84:b4}', + '{33, 15, 1, 13, 6}'), + ('inetcol', 'inet', + '{=, <, <=, >, >=}', + '{10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}', + '{1, 100, 100, 125, 125}'), + ('inetcol', 'cidr', + '{<, <=, >, >=}', + '{255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}', + '{100, 100, 125, 125}'), + ('cidrcol', 'inet', + '{=, <, <=, >, >=}', + '{10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}', + '{2, 100, 100, 125, 125}'), + ('cidrcol', 'cidr', + '{=, <, <=, >, >=}', + '{10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}', + '{2, 100, 100, 125, 125}'), + ('datecol', 'date', + '{>, >=, =, <=, <}', + '{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}', + '{100, 100, 1, 100, 100}'), + ('timecol', 'time', + '{>, >=, =, <=, <}', + '{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamp', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestampcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}', + '{100, 100, 1, 100, 100}'), + ('timestamptzcol', 'timestamptz', + '{>, >=, =, <=, <}', + '{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}', + '{100, 100, 1, 100, 100}'), + ('intervalcol', 'interval', + '{>, >=, =, <=, <}', + '{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}', + '{100, 100, 1, 100, 100}'), + ('timetzcol', 'timetz', + '{>, >=, =, <=, <}', + '{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}', + '{99, 100, 2, 100, 100}'), + ('numericcol', 'numeric', + '{>, >=, =, <=, <}', + '{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}', + '{100, 100, 1, 100, 100}'), + ('uuidcol', 'uuid', + '{>, >=, =, <=, <}', + '{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}', + '{100, 100, 1, 100, 100}'), + ('lsncol', 'pg_lsn', + '{>, >=, =, <=, <, IS, IS NOT}', + '{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}', + '{100, 100, 1, 100, 100, 25, 100}'); + +ANALYZE brintest_multi; + +DO $x$ +DECLARE + r record; + r2 record; + cond text; + idx_ctids tid[]; + ss_ctids tid[]; + count int; + plan_ok bool; + plan_line text; +BEGIN + FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_multi, unnest(op) WITH ORDINALITY AS oper LOOP + + -- prepare the condition + IF r.value IS NULL THEN + cond := format('%I %s %L', r.colname, r.oper, r.value); + ELSE + cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ); + END IF; + + -- run the query using the brin index + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Bitmap Heap Scan on brintest_multi%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get bitmap indexscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) + INTO idx_ctids; + + -- run the query using a seqscan + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + + plan_ok := false; + FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) LOOP + IF plan_line LIKE '%Seq Scan on brintest_multi%' THEN + plan_ok := true; + END IF; + END LOOP; + IF NOT plan_ok THEN + RAISE WARNING 'did not get seqscan plan for %', r; + END IF; + + EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) + INTO ss_ctids; + + -- make sure both return the same results + count := array_length(idx_ctids, 1); + + IF NOT (count = array_length(ss_ctids, 1) AND + idx_ctids @> ss_ctids AND + idx_ctids <@ ss_ctids) THEN + -- report the results of each scan to make the differences obvious + RAISE WARNING 'something not right in %: count %', r, count; + SET enable_seqscan = 1; + SET enable_bitmapscan = 0; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_multi WHERE ' || cond LOOP + RAISE NOTICE 'seqscan: %', r2; + END LOOP; + + SET enable_seqscan = 0; + SET enable_bitmapscan = 1; + FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_multi WHERE ' || cond LOOP + RAISE NOTICE 'bitmapscan: %', r2; + END LOOP; + END IF; + + -- make sure we found expected number of matches + IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF; + END LOOP; +END; +$x$; + +RESET enable_seqscan; +RESET enable_bitmapscan; + +INSERT INTO brintest_multi SELECT + 142857 * tenthous, + thousand, + twothousand, + unique1::oid, + format('(%s,%s)', tenthous, twenty)::tid, + (four + 1.0)/(hundred+1), + odd::float8 / (tenthous + 1), + format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr, + substr(md5(unique1::text), 1, 16)::macaddr8, + inet '10.2.3.4' + tenthous, + cidr '10.2.3/24' + tenthous, + date '1995-08-15' + tenthous, + time '01:20:30' + thousand * interval '18.5 second', + timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours', + timestamptz '1972-10-10 03:00' + thousand * interval '1 hour', + justify_days(justify_hours(tenthous * interval '12 minutes')), + timetz '01:30:20' + hundred * interval '15 seconds', + tenthous::numeric(36,30) * fivethous * even / (hundred + 1), + format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid, + format('%s/%s%s', odd, even, tenthous)::pg_lsn +FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5; + +SELECT brin_desummarize_range('brinidx_multi', 0); +VACUUM brintest_multi; -- force a summarization cycle in brinidx + +-- Try inserting a values with NaN, to test distance calculation. +insert into public.brintest_multi (float4col) values (real 'nan'); +insert into public.brintest_multi (float8col) values (real 'nan'); + +UPDATE brintest_multi SET int8col = int8col * int4col; + +-- Tests for brin_summarize_new_values +SELECT brin_summarize_new_values('brintest_multi'); -- error, not an index +SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index +SELECT brin_summarize_new_values('brinidx_multi'); -- ok, no change expected + +-- Tests for brin_desummarize_range +SELECT brin_desummarize_range('brinidx_multi', -1); -- error, invalid range +SELECT brin_desummarize_range('brinidx_multi', 0); +SELECT brin_desummarize_range('brinidx_multi', 0); +SELECT brin_desummarize_range('brinidx_multi', 100000000); + +-- test building an index with many values, to force compaction of the buffer +CREATE TABLE brin_large_range (a int4); +INSERT INTO brin_large_range SELECT i FROM generate_series(1,10000) s(i); +CREATE INDEX brin_large_range_idx ON brin_large_range USING brin (a int4_minmax_multi_ops); +DROP TABLE brin_large_range; + +-- Test brin_summarize_range +CREATE TABLE brin_summarize_multi ( + value int +) WITH (fillfactor=10, autovacuum_enabled=false); +CREATE INDEX brin_summarize_multi_idx ON brin_summarize_multi USING brin (value) WITH (pages_per_range=2); +-- Fill a few pages +DO $$ +DECLARE curtid tid; +BEGIN + LOOP + INSERT INTO brin_summarize_multi VALUES (1) RETURNING ctid INTO curtid; + EXIT WHEN curtid > tid '(2, 0)'; + END LOOP; +END; +$$; + +-- summarize one range +SELECT brin_summarize_range('brin_summarize_multi_idx', 0); +-- nothing: already summarized +SELECT brin_summarize_range('brin_summarize_multi_idx', 1); +-- summarize one range +SELECT brin_summarize_range('brin_summarize_multi_idx', 2); +-- nothing: page doesn't exist in table +SELECT brin_summarize_range('brin_summarize_multi_idx', 4294967295); +-- invalid block number values +SELECT brin_summarize_range('brin_summarize_multi_idx', -1); +SELECT brin_summarize_range('brin_summarize_multi_idx', 4294967296); + + +-- test brin cost estimates behave sanely based on correlation of values +CREATE TABLE brin_test_multi (a INT, b INT); +INSERT INTO brin_test_multi SELECT x/100,x%100 FROM generate_series(1,10000) x(x); +CREATE INDEX brin_test_multi_a_idx ON brin_test_multi USING brin (a) WITH (pages_per_range = 2); +CREATE INDEX brin_test_multi_b_idx ON brin_test_multi USING brin (b) WITH (pages_per_range = 2); +VACUUM ANALYZE brin_test_multi; + +-- Ensure brin index is used when columns are perfectly correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE a = 1; +-- Ensure brin index is not used when values are not correlated +EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE b = 1; diff --git a/src/test/singlenode_regress/sql/btree_index.sql b/src/test/singlenode_regress/sql/btree_index.sql new file mode 100644 index 00000000000..c34502249f3 --- /dev/null +++ b/src/test/singlenode_regress/sql/btree_index.sql @@ -0,0 +1,185 @@ +-- +-- BTREE_INDEX +-- test retrieval of min/max keys for each index +-- + +SELECT b.* + FROM bt_i4_heap b + WHERE b.seqno < 1; + +SELECT b.* + FROM bt_i4_heap b + WHERE b.seqno >= 9999; + +SELECT b.* + FROM bt_i4_heap b + WHERE b.seqno = 4500; + +SELECT b.* + FROM bt_name_heap b + WHERE b.seqno < '1'::name; + +SELECT b.* + FROM bt_name_heap b + WHERE b.seqno >= '9999'::name; + +SELECT b.* + FROM bt_name_heap b + WHERE b.seqno = '4500'::name; + +SELECT b.* + FROM bt_txt_heap b + WHERE b.seqno < '1'::text; + +SELECT b.* + FROM bt_txt_heap b + WHERE b.seqno >= '9999'::text; + +SELECT b.* + FROM bt_txt_heap b + WHERE b.seqno = '4500'::text; + +SELECT b.* + FROM bt_f8_heap b + WHERE b.seqno < '1'::float8; + +SELECT b.* + FROM bt_f8_heap b + WHERE b.seqno >= '9999'::float8; + +SELECT b.* + FROM bt_f8_heap b + WHERE b.seqno = '4500'::float8; + +-- +-- Check correct optimization of LIKE (special index operator support) +-- for both indexscan and bitmapscan cases +-- + +set enable_seqscan to false; +set enable_indexscan to true; +set enable_bitmapscan to false; +explain (costs off) +select proname from pg_proc where proname like E'RI\\_FKey%del' order by 1; +select proname from pg_proc where proname like E'RI\\_FKey%del' order by 1; +explain (costs off) +select proname from pg_proc where proname ilike '00%foo' order by 1; +select proname from pg_proc where proname ilike '00%foo' order by 1; +explain (costs off) +select proname from pg_proc where proname ilike 'ri%foo' order by 1; + +set enable_indexscan to false; +set enable_bitmapscan to true; +explain (costs off) +select proname from pg_proc where proname like E'RI\\_FKey%del' order by 1; +select proname from pg_proc where proname like E'RI\\_FKey%del' order by 1; +explain (costs off) +select proname from pg_proc where proname ilike '00%foo' order by 1; +select proname from pg_proc where proname ilike '00%foo' order by 1; +explain (costs off) +select proname from pg_proc where proname ilike 'ri%foo' order by 1; + +reset enable_seqscan; +reset enable_indexscan; +reset enable_bitmapscan; + +-- Also check LIKE optimization with binary-compatible cases + +create temp table btree_bpchar (f1 text collate "C"); +create index on btree_bpchar(f1 bpchar_ops) WITH (deduplicate_items=on); +insert into btree_bpchar values ('foo'), ('fool'), ('bar'), ('quux'); +-- doesn't match index: +explain (costs off) +select * from btree_bpchar where f1 like 'foo'; +select * from btree_bpchar where f1 like 'foo'; +explain (costs off) +select * from btree_bpchar where f1 like 'foo%'; +select * from btree_bpchar where f1 like 'foo%'; +-- these do match the index: +explain (costs off) +select * from btree_bpchar where f1::bpchar like 'foo'; +select * from btree_bpchar where f1::bpchar like 'foo'; +explain (costs off) +select * from btree_bpchar where f1::bpchar like 'foo%'; +select * from btree_bpchar where f1::bpchar like 'foo%'; + +-- get test coverage for "single value" deduplication strategy: +insert into btree_bpchar select 'foo' from generate_series(1,1500); + +-- +-- Perform unique checking, with and without the use of deduplication +-- +CREATE TABLE dedup_unique_test_table (a int) WITH (autovacuum_enabled=false); +CREATE UNIQUE INDEX dedup_unique ON dedup_unique_test_table (a) WITH (deduplicate_items=on); +CREATE UNIQUE INDEX plain_unique ON dedup_unique_test_table (a) WITH (deduplicate_items=off); +-- Generate enough garbage tuples in index to ensure that even the unique index +-- with deduplication enabled has to check multiple leaf pages during unique +-- checking (at least with a BLCKSZ of 8192 or less) +DO $$ +BEGIN + FOR r IN 1..1350 LOOP + DELETE FROM dedup_unique_test_table; + INSERT INTO dedup_unique_test_table SELECT 1; + END LOOP; +END$$; + +-- Exercise the LP_DEAD-bit-set tuple deletion code with a posting list tuple. +-- The implementation prefers deleting existing items to merging any duplicate +-- tuples into a posting list, so we need an explicit test to make sure we get +-- coverage (note that this test also assumes BLCKSZ is 8192 or less): +DROP INDEX plain_unique; +DELETE FROM dedup_unique_test_table WHERE a = 1; +INSERT INTO dedup_unique_test_table SELECT i FROM generate_series(0,450) i; + +-- +-- Test B-tree fast path (cache rightmost leaf page) optimization. +-- + +-- First create a tree that's at least three levels deep (i.e. has one level +-- between the root and leaf levels). The text inserted is long. It won't be +-- TOAST compressed because we use plain storage in the table. Only a few +-- index tuples fit on each internal page, allowing us to get a tall tree with +-- few pages. (A tall tree is required to trigger caching.) +-- +-- The text column must be the leading column in the index, since suffix +-- truncation would otherwise truncate tuples on internal pages, leaving us +-- with a short tree. +create table btree_tall_tbl(id int4, t text); +alter table btree_tall_tbl alter COLUMN t set storage plain; +create index btree_tall_idx on btree_tall_tbl (t, id) with (fillfactor = 10); +insert into btree_tall_tbl select g, repeat('x', 250) +from generate_series(1, 130) g; + +-- +-- Test for multilevel page deletion +-- +CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint); +INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,80000) i; +ALTER TABLE delete_test_table ADD PRIMARY KEY (a,b,c,d); +-- Delete most entries, and vacuum, deleting internal pages and creating "fast +-- root" +DELETE FROM delete_test_table WHERE a < 79990; +VACUUM delete_test_table; + +-- +-- Test B-tree insertion with a metapage update (XLOG_BTREE_INSERT_META +-- WAL record type). This happens when a "fast root" page is split. This +-- also creates coverage for nbtree FSM page recycling. +-- +-- The vacuum above should've turned the leaf page into a fast root. We just +-- need to insert some rows to cause the fast root page to split. +INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,1000) i; + +-- Test unsupported btree opclass parameters +create index on btree_tall_tbl (id int4_ops(foo=1)); + +-- Test case of ALTER INDEX with abuse of column names for indexes. +-- This grammar is not officially supported, but the parser allows it. +CREATE INDEX btree_tall_idx2 ON btree_tall_tbl (id); +ALTER INDEX btree_tall_idx2 ALTER COLUMN id SET (n_distinct=100); +DROP INDEX btree_tall_idx2; +-- Partitioned index +CREATE TABLE btree_part (id int4) PARTITION BY RANGE (id); +CREATE INDEX btree_part_idx ON btree_part(id); +ALTER INDEX btree_part_idx ALTER COLUMN id SET (n_distinct=100); +DROP TABLE btree_part; diff --git a/src/test/singlenode_regress/sql/case.sql b/src/test/singlenode_regress/sql/case.sql new file mode 100644 index 00000000000..83fe43be6b8 --- /dev/null +++ b/src/test/singlenode_regress/sql/case.sql @@ -0,0 +1,265 @@ +-- +-- CASE +-- Test the case statement +-- + +CREATE TABLE CASE_TBL ( + i integer, + f double precision +); + +CREATE TABLE CASE2_TBL ( + i integer, + j integer +); + +INSERT INTO CASE_TBL VALUES (1, 10.1); +INSERT INTO CASE_TBL VALUES (2, 20.2); +INSERT INTO CASE_TBL VALUES (3, -30.3); +INSERT INTO CASE_TBL VALUES (4, NULL); + +INSERT INTO CASE2_TBL VALUES (1, -1); +INSERT INTO CASE2_TBL VALUES (2, -2); +INSERT INTO CASE2_TBL VALUES (3, -3); +INSERT INTO CASE2_TBL VALUES (2, -4); +INSERT INTO CASE2_TBL VALUES (1, NULL); +INSERT INTO CASE2_TBL VALUES (NULL, -6); + +-- +-- Simplest examples without tables +-- + +SELECT '3' AS "One", + CASE + WHEN 1 < 2 THEN 3 + END AS "Simple WHEN"; + +SELECT '' AS "One", + CASE + WHEN 1 > 2 THEN 3 + END AS "Simple default"; + +SELECT '3' AS "One", + CASE + WHEN 1 < 2 THEN 3 + ELSE 4 + END AS "Simple ELSE"; + +SELECT '4' AS "One", + CASE + WHEN 1 > 2 THEN 3 + ELSE 4 + END AS "ELSE default"; + +SELECT '6' AS "One", + CASE + WHEN 1 > 2 THEN 3 + WHEN 4 < 5 THEN 6 + ELSE 7 + END AS "Two WHEN with default"; + + +SELECT '7' AS "None", + CASE WHEN random() < 0 THEN 1 + END AS "NULL on no matches"; + +-- Constant-expression folding shouldn't evaluate unreachable subexpressions +SELECT CASE WHEN 1=0 THEN 1/0 WHEN 1=1 THEN 1 ELSE 2/0 END; +SELECT CASE 1 WHEN 0 THEN 1/0 WHEN 1 THEN 1 ELSE 2/0 END; + +-- However we do not currently suppress folding of potentially +-- reachable subexpressions +SELECT CASE WHEN i > 100 THEN 1/0 ELSE 0 END FROM case_tbl; + +-- Test for cases involving untyped literals in test expression +SELECT CASE 'a' WHEN 'a' THEN 1 ELSE 2 END; + +-- +-- Examples of targets involving tables +-- + +SELECT + CASE + WHEN i >= 3 THEN i + END AS ">= 3 or Null" + FROM CASE_TBL; + +SELECT + CASE WHEN i >= 3 THEN (i + i) + ELSE i + END AS "Simplest Math" + FROM CASE_TBL; + +SELECT i AS "Value", + CASE WHEN (i < 0) THEN 'small' + WHEN (i = 0) THEN 'zero' + WHEN (i = 1) THEN 'one' + WHEN (i = 2) THEN 'two' + ELSE 'big' + END AS "Category" + FROM CASE_TBL; + +SELECT + CASE WHEN ((i < 0) or (i < 0)) THEN 'small' + WHEN ((i = 0) or (i = 0)) THEN 'zero' + WHEN ((i = 1) or (i = 1)) THEN 'one' + WHEN ((i = 2) or (i = 2)) THEN 'two' + ELSE 'big' + END AS "Category" + FROM CASE_TBL; + +-- +-- Examples of qualifications involving tables +-- + +-- +-- NULLIF() and COALESCE() +-- Shorthand forms for typical CASE constructs +-- defined in the SQL standard. +-- + +SELECT * FROM CASE_TBL WHERE COALESCE(f,i) = 4; + +SELECT * FROM CASE_TBL WHERE NULLIF(f,i) = 2; + +SELECT COALESCE(a.f, b.i, b.j) + FROM CASE_TBL a, CASE2_TBL b; + +SELECT * + FROM CASE_TBL a, CASE2_TBL b + WHERE COALESCE(a.f, b.i, b.j) = 2; + +SELECT NULLIF(a.i,b.i) AS "NULLIF(a.i,b.i)", + NULLIF(b.i, 4) AS "NULLIF(b.i,4)" + FROM CASE_TBL a, CASE2_TBL b; + +SELECT * + FROM CASE_TBL a, CASE2_TBL b + WHERE COALESCE(f,b.i) = 2; + +-- Tests for constant subexpression simplification + +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, 2) = 2; + +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, 1) IS NOT NULL; + +explain (costs off) +SELECT * FROM CASE_TBL WHERE NULLIF(1, null) = 2; + +-- +-- Examples of updates involving tables +-- + +UPDATE CASE_TBL + SET i = CASE WHEN i >= 3 THEN (- i) + ELSE (2 * i) END; + +SELECT * FROM CASE_TBL; + +UPDATE CASE_TBL + SET i = CASE WHEN i >= 2 THEN (2 * i) + ELSE (3 * i) END; + +SELECT * FROM CASE_TBL; + +UPDATE CASE_TBL + SET i = CASE WHEN b.i >= 2 THEN (2 * j) + ELSE (3 * j) END + FROM CASE2_TBL b + WHERE j = -CASE_TBL.i; + +SELECT * FROM CASE_TBL; + +-- +-- Nested CASE expressions +-- + +-- This test exercises a bug caused by aliasing econtext->caseValue_isNull +-- with the isNull argument of the inner CASE's CaseExpr evaluation. After +-- evaluating the vol(null) expression in the inner CASE's second WHEN-clause, +-- the isNull flag for the case test value incorrectly became true, causing +-- the third WHEN-clause not to match. The volatile function calls are needed +-- to prevent constant-folding in the planner, which would hide the bug. + +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; + +CREATE FUNCTION vol(text) returns text as + 'begin return $1; end' language plpgsql volatile; + +SELECT CASE + (CASE vol('bar') + WHEN 'foo' THEN 'it was foo!' + WHEN vol(null) THEN 'null input' + WHEN 'bar' THEN 'it was bar!' END + ) + WHEN 'it was foo!' THEN 'foo recognized' + WHEN 'it was bar!' THEN 'bar recognized' + ELSE 'unrecognized' END; + +-- In this case, we can't inline the SQL function without confusing things. +CREATE DOMAIN foodomain AS text; + +CREATE FUNCTION volfoo(text) returns foodomain as + 'begin return $1::foodomain; end' language plpgsql volatile; + +CREATE FUNCTION inline_eq(foodomain, foodomain) returns boolean as + 'SELECT CASE $2::text WHEN $1::text THEN true ELSE false END' language sql; + +CREATE OPERATOR = (procedure = inline_eq, + leftarg = foodomain, rightarg = foodomain); + +SELECT CASE volfoo('bar') WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo' END; + +ROLLBACK; + +-- Test multiple evaluation of a CASE arg that is a read/write object (#14472) +-- Wrap this in a single transaction so the transient '=' operator doesn't +-- cause problems in concurrent sessions +BEGIN; + +CREATE DOMAIN arrdomain AS int[]; + +CREATE FUNCTION make_ad(int,int) returns arrdomain as + 'declare x arrdomain; + begin + x := array[$1,$2]; + return x; + end' language plpgsql volatile; + +CREATE FUNCTION ad_eq(arrdomain, arrdomain) returns boolean as + 'begin return array_eq($1, $2); end' language plpgsql; + +CREATE OPERATOR = (procedure = ad_eq, + leftarg = arrdomain, rightarg = arrdomain); + +SELECT CASE make_ad(1,2) + WHEN array[2,4]::arrdomain THEN 'wrong' + WHEN array[2,5]::arrdomain THEN 'still wrong' + WHEN array[1,2]::arrdomain THEN 'right' + END; + +ROLLBACK; + +-- Test interaction of CASE with ArrayCoerceExpr (bug #15471) +BEGIN; + +CREATE TYPE casetestenum AS ENUM ('e', 'f', 'g'); + +SELECT + CASE 'foo'::text + WHEN 'foo' THEN ARRAY['a', 'b', 'c', 'd'] || enum_range(NULL::casetestenum)::text[] + ELSE ARRAY['x', 'y'] + END; + +ROLLBACK; + +-- +-- Clean up +-- + +DROP TABLE CASE_TBL; +DROP TABLE CASE2_TBL; diff --git a/src/test/singlenode_regress/sql/case_gp.sql b/src/test/singlenode_regress/sql/case_gp.sql new file mode 100644 index 00000000000..2378a4082b5 --- /dev/null +++ b/src/test/singlenode_regress/sql/case_gp.sql @@ -0,0 +1,596 @@ +-- Additional CASE-WHEN tests + + +-- +-- CASE ... WHEN IS NOT DISTINCT FROM ... +-- +DROP TABLE IF EXISTS mytable CASCADE; +CREATE TABLE mytable (a int, b int, c varchar(1)); +INSERT INTO mytable values (1,2,'t'), + (2,3,'e'), + (3,4,'o'), + (4,5,'o'), + (4,4,'o'), + (5,5,'t'), + (6,6,'t'), + (7,6,'a'), + (8,7,'t'), + (9,8,'a'); + +DROP VIEW IF EXISTS notdisview; +CREATE OR REPLACE VIEW notdisview AS +SELECT + CASE 'a'::text = 'test'::text + WHEN 'test' IS NOT DISTINCT FROM ''::text THEN 'A'::text + ELSE 'B'::text + END AS t; +select pg_get_viewdef('notdisview',true); + +DROP VIEW IF EXISTS notdisview2; +CREATE OR REPLACE VIEW notdisview2 AS +SELECT + CASE + WHEN c::text IS NOT DISTINCT FROM ''::text THEN 'A'::text + ELSE 'B'::text + END AS t + FROM mytable; +select pg_get_viewdef('notdisview2',true); + +CREATE TABLE mytable2 ( + key character varying(20) NOT NULL, + key_value character varying(50) +); + +DROP VIEW IF EXISTS notdisview3; +CREATE OR REPLACE VIEW notdisview3 AS +SELECT + CASE mytable2.key_value + WHEN IS NOT DISTINCT FROM 'NULL'::text THEN 'now'::text::date + ELSE to_date(mytable2.key_value::text, 'YYYYMM'::text) + END AS t + FROM mytable2; +select pg_get_viewdef('notdisview3',false); + +CREATE OR REPLACE FUNCTION negate(int) RETURNS int +AS 'SELECT $1 * (-1)' +LANGUAGE sql CONTAINS SQL +IMMUTABLE +RETURNS null ON null input; + +DROP VIEW IF EXISTS myview; +CREATE VIEW myview AS + SELECT a,b, CASE a WHEN IS NOT DISTINCT FROM b THEN b*10 + WHEN IS NOT DISTINCT FROM b+1 THEN b*100 + WHEN b-1 THEN b*1000 + WHEN b*10 THEN b*10000 + WHEN negate(b) THEN b*(-1.0) + ELSE b END AS newb + FROM mytable; +SELECT * FROM myview ORDER BY a,b; + +-- Test deparse +select pg_get_viewdef('myview',true); + +DROP TABLE IF EXISTS products CASCADE; +CREATE TABLE products (id serial, name text, price numeric); +INSERT INTO products (name, price) values + ('keyboard', 124.99), + ('monitor', 299.99), + ('mouse', 45.59); + +SELECT id,name,price as old_price, + CASE name WHEN IS NOT DISTINCT FROM 'keyboard' THEN products.price*1.5 + WHEN IS NOT DISTINCT FROM 'monitor' THEN price*1.2 + WHEN 'keyboard tray' THEN price*.9 + END AS new_price + FROM products; + +-- testexpr should be evaluated only once +DROP FUNCTION IF EXISTS blip(int); +DROP TABLE IF EXISTS calls_to_blip; + +CREATE TABLE calls_to_blip (n serial, v int); +CREATE OR REPLACE FUNCTION blip(int) RETURNS int +LANGUAGE plpgsql MODIFIES SQL DATA +VOLATILE +AS $$ +DECLARE + x alias for $1; +BEGIN + INSERT INTO calls_to_blip(v) VALUES (x); + RETURN x; +END; +$$; + +SELECT CASE blip(1) + WHEN IS NOT DISTINCT FROM blip(2) THEN blip(20) + WHEN IS NOT DISTINCT FROM blip(3) THEN blip(30) + WHEN IS NOT DISTINCT FROM blip(4) THEN blip(40) + ELSE blip(666) + END AS answer; +SELECT * FROM calls_to_blip ORDER BY 1; + +-- Negative test +-- 1. wrong syntax +-- 2. type mismatches +SELECT a,b,CASE WHEN IS NOT DISTINCT FROM b THEN b*100 ELSE b*1000 END FROM mytable; +SELECT a,b,c,CASE c WHEN IS NOT DISTINCT FROM b THEN a + WHEN IS NOT DISTINCT FROM b+1 THEN a*100 + ELSE c END + FROM mytable; + +-- +-- DECODE(): Oracle compatibility +-- +SELECT decode(null,null,true,false); +SELECT decode(NULL::integer, 1, 100, NULL, 200, 300); +SELECT decode('1'::text, '1', 100, '2', 200); +SELECT decode(2, 1, 'ABC', 2, 'DEF'); +SELECT decode('2009-02-05'::date, '2009-02-05', 'ok'); +SELECT decode('2009-02-05 01:02:03'::timestamp, '2009-02-05 01:02:03', 'ok'); + +SELECT b,c,decode(c,'a',b*10,'e',b*100,'o',b*1000,'u',b*10000,'i',b*100000) as newb from mytable; +SELECT b,c,decode(c,'a',ARRAY[1,2],'e',ARRAY[3,4],'o',ARRAY[5,6],'u',ARRAY[7,8],'i',ARRAY[9,10],ARRAY[0]) as newb from mytable; + +DROP VIEW IF EXISTS myview; +CREATE VIEW myview as + SELECT id, name, price, DECODE(id, 1, 'Southlake', + 2, 'San Francisco', + 3, 'New Jersey', + 4, 'Seattle', + 5, 'Portland', + 6, 'San Francisco', + 7, 'Portland', + 'Non domestic') Location + FROM products + WHERE id < 100; + +SELECT * FROM myview ORDER BY id, location; + +-- Test deparse +select pg_get_viewdef('myview',true); + +-- User-defined DECODE function +CREATE OR REPLACE FUNCTION "decode"(int, int, int) RETURNS int +AS 'select $1 * $2 - $3;' +LANGUAGE sql CONTAINS SQL +IMMUTABLE +RETURNS null ON null input; + +SELECT decode(11,8,11); +SELECT "decode"(11,8,11); +SELECT public.decode(11,8,11); + +-- Test CASE x WHEN IS NOT DISTINCT FROM y with DECODE +SELECT a,b,decode(a,1,1), + CASE decode(a,1,1) WHEN IS NOT DISTINCT FROM 1 THEN b*100 + WHEN IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb + FROM mytable ORDER BY a,b; + +-- Test CASE WHEN x IS NOT DISTINCT FROM y with DECODE +SELECT a,b,decode(a,1,1), + CASE WHEN decode(a,1,1) IS NOT DISTINCT FROM 1 THEN b*100 + WHEN decode(a,1,1) IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb + FROM mytable ORDER BY a,b; + +SELECT a,b,"decode"(a,1,1), + CASE WHEN "decode"(a,1,1) IS NOT DISTINCT FROM 1 THEN b*100 + WHEN "decode"(a,1,1) IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb + FROM mytable ORDER BY a,b; + +-- Negative test: type mismatches +SELECT b,c,decode(c,'a',ARRAY[1,2],'e',ARRAY[3,4],'o',ARRAY[5,6],'u',ARRAY[7,8],'i',ARRAY[9,10],0) as newb from mytable; + +-- +-- Clean up +-- + +DROP TABLE mytable CASCADE; +DROP TABLE products CASCADE; +DROP TABLE calls_to_blip; +DROP FUNCTION negate(int); +DROP FUNCTION "decode"(int, int, int); +DROP FUNCTION blip(int); + +select CASE 'M' + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END; +select CASE 'F' + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END; +select CASE '' + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END; +select CASE null + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END; + +create table case_genders (gid integer, gender char(1)); + +insert into case_genders(gid, gender) values + (1, 'F'), + (2, 'M'), + (3, 'Z'), + (4, ''), + (5, null), + (6, 'G'); + +select gender, CASE gender + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + END +from case_genders +order by gid; + +select CASE 'M' + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + ELSE 'Other' END; + +select CASE null + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + ELSE 'Other' END; + +select gender, CASE gender + WHEN IS NOT DISTINCT FROM 'M' THEN 'Male' + WHEN IS NOT DISTINCT FROM 'F' THEN 'Female' + WHEN IS NOT DISTINCT FROM '' THEN 'Not Specified' + WHEN IS NOT DISTINCT FROM null THEN 'Not Specified' + ELSE 'Other' END +from case_genders +order by gid; +select 'a' as lhs, CASE 'a' + WHEN 'f' THEN 'WHEN: f' + WHEN IS NOT DISTINCT FROM 'f' THEN 'WHEN NEW: f' + WHEN 'e' THEN 'WHEN: e' + WHEN IS NOT DISTINCT FROM 'e' THEN 'WHEN NEW: e' + WHEN 'd' THEN 'WHEN: d' + WHEN IS NOT DISTINCT FROM 'd' THEN 'WHEN NEW: d' + WHEN 'c' THEN 'WHEN: c' + WHEN IS NOT DISTINCT FROM 'c' THEN 'WHEN NEW: c' + WHEN 'b' THEN 'WHEN: b' + WHEN IS NOT DISTINCT FROM 'b' THEN 'WHEN NEW: b' + WHEN 'a' THEN 'WHEN: a' + WHEN IS NOT DISTINCT FROM 'a' THEN 'WHEN NEW: a' + ELSE 'NO MATCH' END as match; + + +select 1 as lhs, CASE 1 + WHEN 4 THEN 'WHEN: 4' + WHEN IS NOT DISTINCT FROM 4 THEN 'WHEN NEW: 4' + WHEN 3 THEN 'WHEN: 3' + WHEN IS NOT DISTINCT FROM 3 THEN 'WHEN NEW: 3' + WHEN 2 THEN 'WHEN: 2' + WHEN IS NOT DISTINCT FROM 2 THEN 'WHEN NEW: 2' + WHEN 11 THEN 'WHEN: 11' + WHEN IS NOT DISTINCT FROM 1 THEN 'WHEN NEW: 1' + ELSE 'NO MATCH' END as match; + +select '2011-05-27'::date as lsh, CASE '2011-05-27'::date + WHEN '2011-07-25'::date THEN 'WHEN: 2011-07-25' + WHEN IS NOT DISTINCT FROM '2011-05-27'::date THEN 'WHEN NEW: 2011-05-27' + END as match; + + +create table nomatch_case +( + sid integer, + gender char(1) default 'F', + name text, + start_dt date +); + +insert into nomatch_case(sid, gender, name, start_dt) values + (1000, 'F', 'Jane Doe', '2011-01-15'::date), + (2000, 'M', 'Ryan Goesling', '2011-02-01'::date), + (3000, 'M', 'Tim Tebow', '2011-01-15'::date), + (4000, 'F', 'Katy Perry', '2011-03-01'::date), + (5000, 'F', 'Michael Scott', '2011-02-01'::date); + +select sid, + name, + gender, + start_dt, + CASE upper(gender) + WHEN 'MALE' THEN 'M' + WHEN IS NOT DISTINCT FROM 'FEMALE' THEN 'F' + WHEN trim('MALE ') THEN 'M' + ELSE 'NO MATCH' END as case_gender +from nomatch_case +order by sid, name; + +select sid, + name, + gender, + start_dt, + CASE start_dt + WHEN IS NOT DISTINCT FROM '2009-01-01'::date THEN 2009 + WHEN '2008-01-01'::date THEN 2008 + WHEN IS NOT DISTINCT FROM '2010-01-01'::date then 2010 + WHEN 2007 THEN 2007 + WHEN IS NOT DISTINCT FROM 2007 THEN 2007 + WHEN '2006-01-01'::date then 2006 + END as case_start_dt +from nomatch_case +order by sid, name; + +select sid, + name, + gender, + start_dt, + CASE sid + WHEN 100 THEN 'Dept 10' + WHEN 200 THEN 'Dept 20' + WHEN IS NOT DISTINCT FROM 300 then 'Dept 30' + WHEN 400 THEN 'Dept 40' + WHEN 500 THEN 'Dept 50' + WHEN IS NOT DISTINCT FROM 600 then 'Dept 60' + WHEN IS NOT DISTINCT FROM 700 then 'Dept 70' + END as case_sid +from nomatch_case +order by sid, name; + +create table combined_when +( + sid integer, + gender varchar(10) default 'F', + name text, + start_dt date +); + +insert into combined_when(sid, gender, name, start_dt) values + (1000, 'F', 'Jane Doe', '2011-01-15'::date), + (2000, 'M', 'Ryan Goesling', '2011-02-01'::date), + (3000, 'm', 'Tim Tebow', '2007-01-15'::date), + (4000, 'F', 'Katy Perry', '2011-03-01'::date), + (5000, 'f', 'Michael Scott', '2011-02-01'::date), + (6000, 'Female ', 'Mila Kunis', '2011-02-01'::date), + (7000, ' Male ', 'Tom Brady', '2011-03-01'::date), + (8000, ' ', 'Lady Gaga', '2008-01-15'::date), + (9000, null, 'George Michael', '2011-01-15'::date), + (10000, 'Male ', 'Michael Jordan', null); + +select case_yr_start_dt, count(sid) +from (select sid, + name, + gender, + start_dt, + CASE extract(year from start_dt) + WHEN IS NOT DISTINCT FROM 2009 THEN 2009 + WHEN abs(2009-1) THEN 2008 + WHEN IS NOT DISTINCT FROM extract(year from '2010-01-01'::date) then 2010 + WHEN round(2007.05, 0) THEN 2007 + WHEN IS NOT DISTINCT FROM 2007 THEN 2007 + WHEN extract(year from '2006-01-01'::date) then 2006 + WHEN extract(year from '2011-01-01'::date) then 2011 + END as case_yr_start_dt +from combined_when +order by sid, name) a +group by case_yr_start_dt +order by 2 desc, 1; + +create table case_expr +( + sid integer, + gender char(1) default 'F', + name text, + start_dt date +); + +insert into case_expr(sid, gender, name, start_dt) values + (1000, 'F', 'Jane Doe', '2011-01-15'::date), + (2000, 'M', 'Ryan Goesling', '2011-02-01'::date), + (3000, 'M', 'Tim Tebow', '2011-01-15'::date), + (4000, 'F', 'Katy Perry', '2011-03-01'::date), + (5000, 'F', 'Michael Scott', '2011-02-01'::date); + +select sid, + name, + gender, + start_dt, + CASE (gender is not null) + WHEN (gender = 'MALE') THEN 'M' + WHEN IS NOT DISTINCT FROM (gender = 'FEMALE') THEN 'F' + WHEN (gender = trim('MALE ')) THEN 'M' + WHEN IS NOT DISTINCT FROM (gender = 'M') THEN 'M' + WHEN (gender = 'F') THEN 'F' + ELSE 'NO MATCH' END as case_gender +from case_expr +order by sid, name; + +select sid, + name, + gender, + start_dt, + CASE (extract(year from start_dt) = 2011) + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 1) THEN 'January' + WHEN (extract(month from start_dt) = 2) THEN 'February' + WHEN (extract(month from start_dt) = 3) THEN 'March' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 4) THEN 'April' + WHEN (extract(month from start_dt) = 5) THEN 'May' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 6) THEN 'June' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 7) THEN 'July' + WHEN (extract(month from start_dt) = 8) THEN 'August' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 9) THEN 'September' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 10) THEN 'October' + WHEN IS NOT DISTINCT FROM (extract(month from start_dt) = 11) THEN 'November' + WHEN (extract(month from start_dt) = 12) THEN 'December' + END as case_start_month +from case_expr +order by sid, name; + +select sid, + name, + gender, + start_dt, + CASE (sid > 100) + WHEN (sid = 1000) THEN 'Dept 10' + WHEN (sid > 1000 and sid <= 2000) THEN 'Dept 20' + WHEN IS NOT DISTINCT FROM (sid = 3000) then 'Dept 30' + WHEN (sid = 4000) THEN 'Dept 40' + WHEN (sid = 5000) THEN 'Dept 50' + WHEN IS NOT DISTINCT FROM (sid > 5000 and sid <= 6000) then 'Dept 60' + WHEN IS NOT DISTINCT FROM (sid = 7000) then 'Dept 70' + END as case_sid +from case_expr +order by sid, name; + +drop table if exists combined_when; + +create table combined_when +( + sid integer, + gender varchar(10) default 'F', + name text, + start_dt date +); + +insert into combined_when(sid, gender, name, start_dt) values + (1000, 'F', 'Jane Doe', '2011-01-15'::date), + (2000, 'M', 'Ryan Goesling', '2011-02-01'::date), + (3000, 'm', 'Tim Tebow', '2007-01-15'::date), + (4000, 'F', 'Katy Perry', '2011-03-01'::date), + (5000, 'f', 'Michael Scott', '2011-02-01'::date), + (6000, 'Female ', 'Mila Kunis', '2011-02-01'::date), + (7000, ' Male ', 'Tom Brady', '2011-03-01'::date), + (8000, ' ', 'Lady Gaga', '2008-01-15'::date), + (9000, null, 'George Michael', '2011-01-15'::date), + (10000, 'Male ', 'Michael Jordan', null); + +select sid, + name, + gender, + start_dt, + CASE upper(trim(gender)) + WHEN 'MALE' THEN 'M' + WHEN IS NOT DISTINCT FROM 'FEMALE' THEN 'F' + WHEN trim('MALE ') THEN 'M' + WHEN trim(' FEMALE ') THEN 'F' + WHEN IS NOT DISTINCT FROM 'M' THEN 'M' + WHEN IS NOT DISTINCT FROM 'F' THEN 'F' + ELSE 'NO MATCH' END as case_gender +from combined_when +order by sid, name; + +select sid, + name, + gender, + start_dt, + CASE extract(year from start_dt) + WHEN IS NOT DISTINCT FROM 2009 THEN 2009 + WHEN abs(2009-1) THEN 2008 + WHEN IS NOT DISTINCT FROM extract(year from '2010-01-01'::date) then 2010 + WHEN round(2007.05, 0) THEN 2007 + WHEN IS NOT DISTINCT FROM 2007 THEN 2007 + WHEN extract(year from '2006-01-01'::date) then 2006 + WHEN extract(year from '2011-01-01'::date) then 2011 + END as case_yr_start_dt +from combined_when +order by sid, name; + +select case_yr_start_dt, count(sid) +from (select sid, + name, + gender, + start_dt, + CASE extract(year from start_dt) + WHEN IS NOT DISTINCT FROM 2009 THEN 2009 + WHEN abs(2009-1) THEN 2008 + WHEN IS NOT DISTINCT FROM extract(year from '2010-01-01'::date) then 2010 + WHEN round(2007.05, 0) THEN 2007 + WHEN IS NOT DISTINCT FROM 2007 THEN 2007 + WHEN extract(year from '2006-01-01'::date) then 2006 + WHEN extract(year from '2011-01-01'::date) then 2011 + END as case_yr_start_dt +from combined_when +order by sid, name) a +group by case_yr_start_dt +order by 2 desc, 1; + +select CASE 'a' + WHEN IS NOT DISTINCT FROM 'b' THEN 'a=b' + WHEN NOT DISTINCT FROM 'a' THEN 'a=a' +END; + +select CASE 'a' + WHEN IS NOT DISTINCT 'b' THEN 'a=b' + WHEN IS NOT DISTINCT FROM 'a' THEN 'a=a' +END; + +select CASE 'a' + WHEN IS NOT DISTINCT FROM 'b' THEN 'a=b' + WHEN IS NOT DISTINCT FROM 'a' IS 'a=a' +END; + +select CASE 'a' + WHEN IS NOT DISTINCT FROM 'b' IS 'a=b' + WHEN IS NOT DISTINCT FROM 'a' THEN 'a=a' +END; + +select CASE 1 + WHEN IS NOT DISTINCT FROM 2 THEN '1=2' + WHEN IS DISTINCT FROM 2 THEN '1<>2' + WHEN IS NOT DISTINCT FROM 1 THEN '1=1' +END; + +-- +-- Case expression in group by +-- +SELECT + CASE t.field1 + WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying + ELSE t.field1 + END AS field1 + FROM ( SELECT 'test value'::text AS field1) t + GROUP BY + CASE t.field1 + WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying + ELSE t.field1 + END; + +-- +-- Variant of case expression in group by +-- +SELECT + CASE t.field1 + WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying + ELSE t.field1 + END AS field1 + FROM ( SELECT 'test value'::text AS field1) t + GROUP BY 1; + +-- +-- decode in group by +-- +SELECT + decode(t.field1, ''::text, 'Undefined'::character varying, t.field1) as field1 + FROM ( SELECT 'test value'::text AS field1) t + GROUP BY + decode(t.field1, ''::text, 'Undefined'::character varying, t.field1); + +-- +-- variant of decode in group by +-- + SELECT + decode(t.field1, ''::text, 'Undefined'::character varying, t.field1) as field1 + FROM ( SELECT 'test value'::text AS field1) t + GROUP BY 1; + diff --git a/src/test/singlenode_regress/sql/char.sql b/src/test/singlenode_regress/sql/char.sql new file mode 100644 index 00000000000..79e6e565ba5 --- /dev/null +++ b/src/test/singlenode_regress/sql/char.sql @@ -0,0 +1,75 @@ +-- +-- CHAR +-- + +-- fixed-length by value +-- internally passed by value if <= 4 bytes in storage + +SELECT char 'c' = char 'c' AS true; + +-- +-- Build a table for testing +-- + +CREATE TABLE CHAR_TBL(f1 char); + +INSERT INTO CHAR_TBL (f1) VALUES ('a'); + +INSERT INTO CHAR_TBL (f1) VALUES ('A'); + +-- any of the following three input formats are acceptable +INSERT INTO CHAR_TBL (f1) VALUES ('1'); + +INSERT INTO CHAR_TBL (f1) VALUES (2); + +INSERT INTO CHAR_TBL (f1) VALUES ('3'); + +-- zero-length char +INSERT INTO CHAR_TBL (f1) VALUES (''); + +-- try char's of greater than 1 length +INSERT INTO CHAR_TBL (f1) VALUES ('cd'); +INSERT INTO CHAR_TBL (f1) VALUES ('c '); + + +SELECT * FROM CHAR_TBL; + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 <> 'a'; + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 = 'a'; + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 < 'a'; + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 <= 'a'; + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 > 'a'; + +SELECT c.* + FROM CHAR_TBL c + WHERE c.f1 >= 'a'; + +DROP TABLE CHAR_TBL; + +-- +-- Now test longer arrays of char +-- + +CREATE TABLE CHAR_TBL(f1 char(4)); + +INSERT INTO CHAR_TBL (f1) VALUES ('a'); +INSERT INTO CHAR_TBL (f1) VALUES ('ab'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcd'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); +INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); + +SELECT * FROM CHAR_TBL; diff --git a/src/test/singlenode_regress/sql/circle.sql b/src/test/singlenode_regress/sql/circle.sql new file mode 100644 index 00000000000..8c8a0f8806c --- /dev/null +++ b/src/test/singlenode_regress/sql/circle.sql @@ -0,0 +1,57 @@ +-- +-- CIRCLE +-- + +-- Back off displayed precision a little bit to reduce platform-to-platform +-- variation in results. +SET extra_float_digits = -1; + +CREATE TABLE CIRCLE_TBL (f1 circle); + +INSERT INTO CIRCLE_TBL VALUES ('<(5,1),3>'); + +INSERT INTO CIRCLE_TBL VALUES ('((1,2),100)'); + +INSERT INTO CIRCLE_TBL VALUES (' 1 , 3 , 5 '); + +INSERT INTO CIRCLE_TBL VALUES (' ( ( 1 , 2 ) , 3 ) '); + +INSERT INTO CIRCLE_TBL VALUES (' ( 100 , 200 ) , 10 '); + +INSERT INTO CIRCLE_TBL VALUES (' < ( 100 , 1 ) , 115 > '); + +INSERT INTO CIRCLE_TBL VALUES ('<(3,5),0>'); -- Zero radius + +INSERT INTO CIRCLE_TBL VALUES ('<(3,5),NaN>'); -- NaN radius + +-- bad values + +INSERT INTO CIRCLE_TBL VALUES ('<(-100,0),-100>'); + +INSERT INTO CIRCLE_TBL VALUES ('<(100,200),10'); + +INSERT INTO CIRCLE_TBL VALUES ('<(100,200),10> x'); + +INSERT INTO CIRCLE_TBL VALUES ('1abc,3,5'); + +INSERT INTO CIRCLE_TBL VALUES ('(3,(1,2),3)'); + +SELECT * FROM CIRCLE_TBL; + +SELECT center(f1) AS center + FROM CIRCLE_TBL; + +SELECT radius(f1) AS radius + FROM CIRCLE_TBL; + +SELECT diameter(f1) AS diameter + FROM CIRCLE_TBL; + +SELECT f1 FROM CIRCLE_TBL WHERE radius(f1) < 5; + +SELECT f1 FROM CIRCLE_TBL WHERE diameter(f1) >= 10; + +SELECT c1.f1 AS one, c2.f1 AS two, (c1.f1 <-> c2.f1) AS distance + FROM CIRCLE_TBL c1, CIRCLE_TBL c2 + WHERE (c1.f1 < c2.f1) AND ((c1.f1 <-> c2.f1) > 0) + ORDER BY distance, area(c1.f1), area(c2.f1); diff --git a/src/test/singlenode_regress/sql/cluster.sql b/src/test/singlenode_regress/sql/cluster.sql new file mode 100644 index 00000000000..99ee533c8d0 --- /dev/null +++ b/src/test/singlenode_regress/sql/cluster.sql @@ -0,0 +1,280 @@ +-- +-- CLUSTER +-- + +CREATE TABLE clstr_tst_s (rf_a SERIAL PRIMARY KEY, + b INT); + +CREATE TABLE clstr_tst (a SERIAL PRIMARY KEY, + b INT, + c TEXT, + d TEXT, + CONSTRAINT clstr_tst_con FOREIGN KEY (b) REFERENCES clstr_tst_s); + +CREATE INDEX clstr_tst_b ON clstr_tst (b); +CREATE INDEX clstr_tst_c ON clstr_tst (c); +CREATE INDEX clstr_tst_c_b ON clstr_tst (c,b); +CREATE INDEX clstr_tst_b_c ON clstr_tst (b,c); + +INSERT INTO clstr_tst_s (b) VALUES (0); +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; +INSERT INTO clstr_tst_s (b) SELECT b FROM clstr_tst_s; + +CREATE TABLE clstr_tst_inh () INHERITS (clstr_tst); + +INSERT INTO clstr_tst (b, c) VALUES (11, 'once'); +INSERT INTO clstr_tst (b, c) VALUES (10, 'diez'); +INSERT INTO clstr_tst (b, c) VALUES (31, 'treinta y uno'); +INSERT INTO clstr_tst (b, c) VALUES (22, 'veintidos'); +INSERT INTO clstr_tst (b, c) VALUES (3, 'tres'); +INSERT INTO clstr_tst (b, c) VALUES (20, 'veinte'); +INSERT INTO clstr_tst (b, c) VALUES (23, 'veintitres'); +INSERT INTO clstr_tst (b, c) VALUES (21, 'veintiuno'); +INSERT INTO clstr_tst (b, c) VALUES (4, 'cuatro'); +INSERT INTO clstr_tst (b, c) VALUES (14, 'catorce'); +INSERT INTO clstr_tst (b, c) VALUES (2, 'dos'); +INSERT INTO clstr_tst (b, c) VALUES (18, 'dieciocho'); +INSERT INTO clstr_tst (b, c) VALUES (27, 'veintisiete'); +INSERT INTO clstr_tst (b, c) VALUES (25, 'veinticinco'); +INSERT INTO clstr_tst (b, c) VALUES (13, 'trece'); +INSERT INTO clstr_tst (b, c) VALUES (28, 'veintiocho'); +INSERT INTO clstr_tst (b, c) VALUES (32, 'treinta y dos'); +INSERT INTO clstr_tst (b, c) VALUES (5, 'cinco'); +INSERT INTO clstr_tst (b, c) VALUES (29, 'veintinueve'); +INSERT INTO clstr_tst (b, c) VALUES (1, 'uno'); +INSERT INTO clstr_tst (b, c) VALUES (24, 'veinticuatro'); +INSERT INTO clstr_tst (b, c) VALUES (30, 'treinta'); +INSERT INTO clstr_tst (b, c) VALUES (12, 'doce'); +INSERT INTO clstr_tst (b, c) VALUES (17, 'diecisiete'); +INSERT INTO clstr_tst (b, c) VALUES (9, 'nueve'); +INSERT INTO clstr_tst (b, c) VALUES (19, 'diecinueve'); +INSERT INTO clstr_tst (b, c) VALUES (26, 'veintiseis'); +INSERT INTO clstr_tst (b, c) VALUES (15, 'quince'); +INSERT INTO clstr_tst (b, c) VALUES (7, 'siete'); +INSERT INTO clstr_tst (b, c) VALUES (16, 'dieciseis'); +INSERT INTO clstr_tst (b, c) VALUES (8, 'ocho'); +-- This entry is needed to test that TOASTED values are copied correctly. +INSERT INTO clstr_tst (b, c, d) VALUES (6, 'seis', repeat('xyzzy', 100000)); + +CLUSTER clstr_tst_c ON clstr_tst; + +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst; +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst ORDER BY a; +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst ORDER BY b; +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst ORDER BY c; + +-- Verify that inheritance link still works +INSERT INTO clstr_tst_inh VALUES (0, 100, 'in child table'); +SELECT a,b,c,substring(d for 30), length(d) from clstr_tst; + +-- Verify that foreign key link still works +INSERT INTO clstr_tst (b, c) VALUES (1111, 'this should fail'); + +SELECT conname FROM pg_constraint WHERE conrelid = 'clstr_tst'::regclass +ORDER BY 1; + + +SELECT relname, relkind, + EXISTS(SELECT 1 FROM pg_class WHERE oid = c.reltoastrelid) AS hastoast +FROM pg_class c WHERE relname LIKE 'clstr_tst%' ORDER BY relname; + +-- Verify that indisclustered is correctly set +SELECT pg_class.relname FROM pg_index, pg_class, pg_class AS pg_class_2 +WHERE pg_class.oid=indexrelid + AND indrelid=pg_class_2.oid + AND pg_class_2.relname = 'clstr_tst' + AND indisclustered; + +-- Try changing indisclustered +ALTER TABLE clstr_tst CLUSTER ON clstr_tst_b_c; +SELECT pg_class.relname FROM pg_index, pg_class, pg_class AS pg_class_2 +WHERE pg_class.oid=indexrelid + AND indrelid=pg_class_2.oid + AND pg_class_2.relname = 'clstr_tst' + AND indisclustered; + +-- Try turning off all clustering +ALTER TABLE clstr_tst SET WITHOUT CLUSTER; +SELECT pg_class.relname FROM pg_index, pg_class, pg_class AS pg_class_2 +WHERE pg_class.oid=indexrelid + AND indrelid=pg_class_2.oid + AND pg_class_2.relname = 'clstr_tst' + AND indisclustered; + +-- Verify that clustering all tables does in fact cluster the right ones +CREATE USER regress_clstr_user; +CREATE TABLE clstr_1 (a INT PRIMARY KEY); +CREATE TABLE clstr_2 (a INT PRIMARY KEY); +CREATE TABLE clstr_3 (a INT PRIMARY KEY); +ALTER TABLE clstr_1 OWNER TO regress_clstr_user; +ALTER TABLE clstr_3 OWNER TO regress_clstr_user; +GRANT SELECT ON clstr_2 TO regress_clstr_user; +INSERT INTO clstr_1 VALUES (2); +INSERT INTO clstr_1 VALUES (1); +INSERT INTO clstr_2 VALUES (2); +INSERT INTO clstr_2 VALUES (1); +INSERT INTO clstr_3 VALUES (2); +INSERT INTO clstr_3 VALUES (1); + +-- "CLUSTER " on a table that hasn't been clustered +CLUSTER clstr_2; + +CLUSTER clstr_1_pkey ON clstr_1; +CLUSTER clstr_2 USING clstr_2_pkey; +SELECT * FROM clstr_1 UNION ALL + SELECT * FROM clstr_2 UNION ALL + SELECT * FROM clstr_3; + +-- revert to the original state +DELETE FROM clstr_1; +DELETE FROM clstr_2; +DELETE FROM clstr_3; +INSERT INTO clstr_1 VALUES (2); +INSERT INTO clstr_1 VALUES (1); +INSERT INTO clstr_2 VALUES (2); +INSERT INTO clstr_2 VALUES (1); +INSERT INTO clstr_3 VALUES (2); +INSERT INTO clstr_3 VALUES (1); + +-- this user can only cluster clstr_1 and clstr_3, but the latter +-- has not been clustered +SET SESSION AUTHORIZATION regress_clstr_user; +CLUSTER; +SELECT * FROM clstr_1 UNION ALL + SELECT * FROM clstr_2 UNION ALL + SELECT * FROM clstr_3; + +-- cluster a single table using the indisclustered bit previously set +DELETE FROM clstr_1; +INSERT INTO clstr_1 VALUES (2); +INSERT INTO clstr_1 VALUES (1); +CLUSTER clstr_1; +SELECT * FROM clstr_1; + +-- Test MVCC-safety of cluster. There isn't much we can do to verify the +-- results with a single backend... + +CREATE TABLE clustertest (key int PRIMARY KEY); + +INSERT INTO clustertest VALUES (10); +INSERT INTO clustertest VALUES (20); +INSERT INTO clustertest VALUES (30); +INSERT INTO clustertest VALUES (40); +INSERT INTO clustertest VALUES (50); + +-- Use a transaction so that updates are not committed when CLUSTER sees 'em +BEGIN; + +-- Test update where the old row version is found first in the scan +UPDATE clustertest SET key = 100 WHERE key = 10; + +-- Test update where the new row version is found first in the scan +UPDATE clustertest SET key = 35 WHERE key = 40; + +-- Test longer update chain +UPDATE clustertest SET key = 60 WHERE key = 50; +UPDATE clustertest SET key = 70 WHERE key = 60; +UPDATE clustertest SET key = 80 WHERE key = 70; + +SELECT * FROM clustertest; +CLUSTER clustertest_pkey ON clustertest; +SELECT * FROM clustertest; + +COMMIT; + +SELECT * FROM clustertest; + +-- check that temp tables can be clustered +create temp table clstr_temp (col1 int primary key, col2 text); +insert into clstr_temp values (2, 'two'), (1, 'one'); +cluster clstr_temp using clstr_temp_pkey; +select * from clstr_temp; +drop table clstr_temp; + +RESET SESSION AUTHORIZATION; + +-- check clustering an empty table +DROP TABLE clustertest; +CREATE TABLE clustertest (f1 int PRIMARY KEY); +CLUSTER clustertest USING clustertest_pkey; +CLUSTER clustertest; + +-- Check that partitioned tables cannot be clustered +CREATE TABLE clstrpart (a int) PARTITION BY RANGE (a); +CREATE INDEX clstrpart_idx ON clstrpart (a); +ALTER TABLE clstrpart CLUSTER ON clstrpart_idx; +CLUSTER clstrpart USING clstrpart_idx; +DROP TABLE clstrpart; + +-- Test CLUSTER with external tuplesorting + +create table clstr_4 as select * from tenk1; +create index cluster_sort on clstr_4 (hundred, thousand, tenthous); +-- ensure we don't use the index in CLUSTER nor the checking SELECTs +set enable_indexscan = off; + +-- Use external sort: +set maintenance_work_mem = '1MB'; +cluster clstr_4 using cluster_sort; +select * from +(select hundred, lag(hundred) over () as lhundred, + thousand, lag(thousand) over () as lthousand, + tenthous, lag(tenthous) over () as ltenthous from clstr_4) ss +where row(hundred, thousand, tenthous) <= row(lhundred, lthousand, ltenthous); + +reset enable_indexscan; +reset maintenance_work_mem; + +-- test CLUSTER on expression index +CREATE TABLE clstr_expression(id serial primary key, a int, b text COLLATE "C"); +INSERT INTO clstr_expression(a, b) SELECT g.i % 42, 'prefix'||g.i FROM generate_series(1, 133) g(i); +CREATE INDEX clstr_expression_minus_a ON clstr_expression ((-a), b); +CREATE INDEX clstr_expression_upper_b ON clstr_expression ((upper(b))); + +-- verify indexes work before cluster +BEGIN; +SET LOCAL enable_seqscan = false; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; +SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; +SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; +COMMIT; + +-- and after clustering on clstr_expression_minus_a +CLUSTER clstr_expression USING clstr_expression_minus_a; +WITH rows AS + (SELECT ctid, lag(a) OVER (ORDER BY ctid) AS la, a FROM clstr_expression) +SELECT * FROM rows WHERE la < a; +BEGIN; +SET LOCAL enable_seqscan = false; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; +SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; +SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; +COMMIT; + +-- and after clustering on clstr_expression_upper_b +CLUSTER clstr_expression USING clstr_expression_upper_b; +WITH rows AS + (SELECT ctid, lag(b) OVER (ORDER BY ctid) AS lb, b FROM clstr_expression) +SELECT * FROM rows WHERE upper(lb) > upper(b); +BEGIN; +SET LOCAL enable_seqscan = false; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; +SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; +EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; +SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; +COMMIT; + +-- clean up +DROP TABLE clustertest; +DROP TABLE clstr_1; +DROP TABLE clstr_2; +DROP TABLE clstr_3; +DROP TABLE clstr_4; +DROP TABLE clstr_expression; + +DROP USER regress_clstr_user; diff --git a/src/test/singlenode_regress/sql/cluster_gp.sql b/src/test/singlenode_regress/sql/cluster_gp.sql new file mode 100644 index 00000000000..3677fa168cb --- /dev/null +++ b/src/test/singlenode_regress/sql/cluster_gp.sql @@ -0,0 +1,65 @@ +-- Test CLUSTER with append optimized storage +CREATE TABLE cluster_ao_table( + id int, + fname text, + lname text, + address1 text, + address2 text, + city text, + state text, + zip text) +WITH (appendonly=true); + +INSERT INTO cluster_ao_table (id, fname, lname, address1, address2, city, state, zip) +SELECT i, 'Jon_' || i, 'Roberts_' || i, i || ' Main Street', 'Apartment ' || i, 'New York', 'NY', i::text +FROM generate_series(1, 10000) AS i; + +CREATE INDEX ON cluster_ao_table (id); + +BEGIN; +CLUSTER cluster_ao_table USING cluster_ao_table_id_idx; +ABORT; +CLUSTER cluster_ao_table USING cluster_ao_table_id_idx; + +SELECT * FROM cluster_ao_table WHERE id = 10; + +DROP TABLE cluster_ao_table; + +-- Test CLUSTER with append optimized columnar storage +CREATE TABLE cluster_ao_table( + id int, + fname text, + lname text, + address1 text, + address2 text, + city text, + state text, + zip text) +WITH (appendonly=true, orientation=column); + +INSERT INTO cluster_ao_table (id, fname, lname, address1, address2, city, state, zip) +SELECT i, 'Jon_' || i, 'Roberts_' || i, i || ' Main Street', 'Apartment ' || i, 'New York', 'NY', i::text +FROM generate_series(1, 10000) AS i; + +CREATE INDEX ON cluster_ao_table (id); + +BEGIN; +CLUSTER cluster_ao_table USING cluster_ao_table_id_idx; +ABORT; +CLUSTER cluster_ao_table USING cluster_ao_table_id_idx; + +SELECT * FROM cluster_ao_table WHERE id = 10; + +DROP TABLE cluster_ao_table; + +-- Test transactional safety of CLUSTER against heap +CREATE TABLE cluster_foo (a int, b varchar, c int); +INSERT INTO cluster_foo SELECT i, 'initial insert' || i, i FROM generate_series(1,10000)i; +CREATE index cluster_ifoo on cluster_foo using btree (b); +-- execute cluster in a transaction but don't commit the transaction +BEGIN; +CLUSTER cluster_foo USING cluster_ifoo; +ABORT; +-- try cluster again +CLUSTER cluster_foo USING cluster_ifoo; +DROP TABLE cluster_foo; diff --git a/src/test/singlenode_regress/sql/collate.icu.utf8.sql b/src/test/singlenode_regress/sql/collate.icu.utf8.sql new file mode 100644 index 00000000000..9cee3d0042b --- /dev/null +++ b/src/test/singlenode_regress/sql/collate.icu.utf8.sql @@ -0,0 +1,758 @@ +/* + * This test is for ICU collations. + */ + +/* skip test if not UTF8 server encoding or no ICU collations installed */ +SELECT getdatabaseencoding() <> 'UTF8' OR + (SELECT count(*) FROM pg_collation WHERE collprovider = 'i') = 0 + AS skip_test \gset +\if :skip_test +\quit +\endif + +SET client_encoding TO UTF8; + +CREATE SCHEMA collate_tests; +SET search_path = collate_tests; + + +CREATE TABLE collate_test1 ( + a int, + b text COLLATE "en-x-icu" NOT NULL +); + +\d collate_test1 + +CREATE TABLE collate_test_fail ( + a int, + b text COLLATE "ja_JP.eucjp-x-icu" +); + +CREATE TABLE collate_test_fail ( + a int, + b text COLLATE "foo-x-icu" +); + +CREATE TABLE collate_test_fail ( + a int COLLATE "en-x-icu", + b text +); + +CREATE TABLE collate_test_like ( + LIKE collate_test1 +); + +\d collate_test_like + +CREATE TABLE collate_test2 ( + a int, + b text COLLATE "sv-x-icu" +); + +CREATE TABLE collate_test3 ( + a int, + b text COLLATE "C" +); + +INSERT INTO collate_test1 VALUES (1, 'abc'), (2, 'äbc'), (3, 'bbc'), (4, 'ABC'); +INSERT INTO collate_test2 SELECT * FROM collate_test1; +INSERT INTO collate_test3 SELECT * FROM collate_test1; + +SELECT * FROM collate_test1 WHERE b >= 'bbc'; +SELECT * FROM collate_test2 WHERE b >= 'bbc'; +SELECT * FROM collate_test3 WHERE b >= 'bbc'; +SELECT * FROM collate_test3 WHERE b >= 'BBC'; + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; +SELECT * FROM collate_test1 WHERE b >= 'bbc' COLLATE "C"; +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "C"; +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "en-x-icu"; + + +CREATE DOMAIN testdomain_sv AS text COLLATE "sv-x-icu"; +CREATE DOMAIN testdomain_i AS int COLLATE "sv-x-icu"; -- fails +CREATE TABLE collate_test4 ( + a int, + b testdomain_sv +); +INSERT INTO collate_test4 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test4 ORDER BY b; + +CREATE TABLE collate_test5 ( + a int, + b testdomain_sv COLLATE "en-x-icu" +); +INSERT INTO collate_test5 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test5 ORDER BY b; + + +SELECT a, b FROM collate_test1 ORDER BY b; +SELECT a, b FROM collate_test2 ORDER BY b; +SELECT a, b FROM collate_test3 ORDER BY b; + +SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; + +-- star expansion +SELECT * FROM collate_test1 ORDER BY b; +SELECT * FROM collate_test2 ORDER BY b; +SELECT * FROM collate_test3 ORDER BY b; + +-- constant expression folding +SELECT 'bbc' COLLATE "en-x-icu" > 'äbc' COLLATE "en-x-icu" AS "true"; +SELECT 'bbc' COLLATE "sv-x-icu" > 'äbc' COLLATE "sv-x-icu" AS "false"; + +-- upper/lower + +CREATE TABLE collate_test10 ( + a int, + x text COLLATE "en-x-icu", + y text COLLATE "tr-x-icu" +); + +INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ'); + +SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10; +SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10; + +SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a; + +-- LIKE/ILIKE + +SELECT * FROM collate_test1 WHERE b LIKE 'abc'; +SELECT * FROM collate_test1 WHERE b LIKE 'abc%'; +SELECT * FROM collate_test1 WHERE b LIKE '%bc%'; +SELECT * FROM collate_test1 WHERE b ILIKE 'abc'; +SELECT * FROM collate_test1 WHERE b ILIKE 'abc%'; +SELECT * FROM collate_test1 WHERE b ILIKE '%bc%'; + +SELECT 'Türkiye' COLLATE "en-x-icu" ILIKE '%KI%' AS "true"; +SELECT 'Türkiye' COLLATE "tr-x-icu" ILIKE '%KI%' AS "false"; + +SELECT 'bıt' ILIKE 'BIT' COLLATE "en-x-icu" AS "false"; +SELECT 'bıt' ILIKE 'BIT' COLLATE "tr-x-icu" AS "true"; + +-- The following actually exercises the selectivity estimation for ILIKE. +SELECT relname FROM pg_class WHERE relname ILIKE 'abc%'; + +-- regular expressions + +SELECT * FROM collate_test1 WHERE b ~ '^abc$'; +SELECT * FROM collate_test1 WHERE b ~ '^abc'; +SELECT * FROM collate_test1 WHERE b ~ 'bc'; +SELECT * FROM collate_test1 WHERE b ~* '^abc$'; +SELECT * FROM collate_test1 WHERE b ~* '^abc'; +SELECT * FROM collate_test1 WHERE b ~* 'bc'; + +CREATE TABLE collate_test6 ( + a int, + b text COLLATE "en-x-icu" +); +INSERT INTO collate_test6 VALUES (1, 'abc'), (2, 'ABC'), (3, '123'), (4, 'ab1'), + (5, 'a1!'), (6, 'a c'), (7, '!.;'), (8, ' '), + (9, 'äbç'), (10, 'ÄBÇ'); +SELECT b, + b ~ '^[[:alpha:]]+$' AS is_alpha, + b ~ '^[[:upper:]]+$' AS is_upper, + b ~ '^[[:lower:]]+$' AS is_lower, + b ~ '^[[:digit:]]+$' AS is_digit, + b ~ '^[[:alnum:]]+$' AS is_alnum, + b ~ '^[[:graph:]]+$' AS is_graph, + b ~ '^[[:print:]]+$' AS is_print, + b ~ '^[[:punct:]]+$' AS is_punct, + b ~ '^[[:space:]]+$' AS is_space +FROM collate_test6; + +SELECT 'Türkiye' COLLATE "en-x-icu" ~* 'KI' AS "true"; +SELECT 'Türkiye' COLLATE "tr-x-icu" ~* 'KI' AS "true"; -- true with ICU + +SELECT 'bıt' ~* 'BIT' COLLATE "en-x-icu" AS "false"; +SELECT 'bıt' ~* 'BIT' COLLATE "tr-x-icu" AS "false"; -- false with ICU + +-- The following actually exercises the selectivity estimation for ~*. +SELECT relname FROM pg_class WHERE relname ~* '^abc'; + + +/* not run by default because it requires tr_TR system locale +-- to_char + +SET lc_time TO 'tr_TR'; +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'); +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr-x-icu"); +*/ + + +-- backwards parsing + +CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; +CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; +CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "C") FROM collate_test10; + +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'collview%' ORDER BY 1; + + +-- collation propagation in various expression types + +SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2; +SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2; +SELECT a, coalesce(b, 'foo') FROM collate_test3 ORDER BY 2; +SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10; + +SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3; +SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3; +SELECT a, b, greatest(b, 'CCC') FROM collate_test3 ORDER BY 3; +SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10; + +SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2; +SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2; +SELECT a, nullif(b, 'abc') FROM collate_test3 ORDER BY 2; +SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10; + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2; +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2; +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test3 ORDER BY 2; + +CREATE DOMAIN testdomain AS text; +SELECT a, b::testdomain FROM collate_test1 ORDER BY 2; +SELECT a, b::testdomain FROM collate_test2 ORDER BY 2; +SELECT a, b::testdomain FROM collate_test3 ORDER BY 2; +SELECT a, b::testdomain_sv FROM collate_test3 ORDER BY 2; +SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10; + +SELECT min(b), max(b) FROM collate_test1; +SELECT min(b), max(b) FROM collate_test2; +SELECT min(b), max(b) FROM collate_test3; + +SELECT array_agg(b ORDER BY b) FROM collate_test1; +SELECT array_agg(b ORDER BY b) FROM collate_test2; +SELECT array_agg(b ORDER BY b) FROM collate_test3; + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2; +SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2; +SELECT a, b FROM collate_test3 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test3 WHERE a > 1 ORDER BY 2; +SELECT a, b FROM collate_test3 EXCEPT SELECT a, b FROM collate_test3 WHERE a < 2 ORDER BY 2; + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- ok +SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- ok +SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail + +CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- fail + +-- ideally this would be a parse-time error, but for now it must be run-time: +select x < y from collate_test10; -- fail +select x || y from collate_test10; -- ok, because || is not collation aware +select x, y from collate_test10 order by x || y; -- not so ok + +-- collation mismatch between recursive and non-recursive term +WITH RECURSIVE foo(x) AS + (SELECT x FROM (VALUES('a' COLLATE "en-x-icu"),('b')) t(x) + UNION ALL + SELECT (x || 'c') COLLATE "de-x-icu" FROM foo WHERE length(x) < 10) +SELECT * FROM foo; + + +-- casting + +SELECT CAST('42' AS text COLLATE "C"); + +SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2; +SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2; +SELECT a, CAST(b AS varchar) FROM collate_test3 ORDER BY 2; + + +-- propagation of collation in SQL functions (inlined and non-inlined cases) +-- and plpgsql functions too + +CREATE FUNCTION mylt (text, text) RETURNS boolean LANGUAGE sql + AS $$ select $1 < $2 $$; + +CREATE FUNCTION mylt_noninline (text, text) RETURNS boolean LANGUAGE sql + AS $$ select $1 < $2 limit 1 $$; + +CREATE FUNCTION mylt_plpgsql (text, text) RETURNS boolean LANGUAGE plpgsql + AS $$ begin return $1 < $2; end $$; + +SELECT a.b AS a, b.b AS b, a.b < b.b AS lt, + mylt(a.b, b.b), mylt_noninline(a.b, b.b), mylt_plpgsql(a.b, b.b) +FROM collate_test1 a, collate_test1 b +ORDER BY a.b, b.b; + +SELECT a.b AS a, b.b AS b, a.b < b.b COLLATE "C" AS lt, + mylt(a.b, b.b COLLATE "C"), mylt_noninline(a.b, b.b COLLATE "C"), + mylt_plpgsql(a.b, b.b COLLATE "C") +FROM collate_test1 a, collate_test1 b +ORDER BY a.b, b.b; + + +-- collation override in plpgsql + +CREATE FUNCTION mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$ +declare + xx text := x; + yy text := y; +begin + return xx < yy; +end +$$; + +SELECT mylt2('a', 'B' collate "en-x-icu") as t, mylt2('a', 'B' collate "C") as f; + +CREATE OR REPLACE FUNCTION + mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$ +declare + xx text COLLATE "POSIX" := x; + yy text := y; +begin + return xx < yy; +end +$$; + +SELECT mylt2('a', 'B') as f; +SELECT mylt2('a', 'B' collate "C") as fail; -- conflicting collations +SELECT mylt2('a', 'B' collate "POSIX") as f; + + +-- polymorphism + +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1; +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1; +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test3)) ORDER BY 1; + +CREATE FUNCTION dup (anyelement) RETURNS anyelement + AS 'select $1' LANGUAGE sql; + +SELECT a, dup(b) FROM collate_test1 ORDER BY 2; +SELECT a, dup(b) FROM collate_test2 ORDER BY 2; +SELECT a, dup(b) FROM collate_test3 ORDER BY 2; + + +-- indexes + +CREATE INDEX collate_test1_idx1 ON collate_test1 (b); +CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "C"); +CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "C")); -- this is different grammatically +CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX")); + +CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "C"); -- fail +CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C")); -- fail + +SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1; + +set enable_seqscan = off; +explain (costs off) +select * from collate_test1 where b ilike 'abc'; +select * from collate_test1 where b ilike 'abc'; +explain (costs off) +select * from collate_test1 where b ilike 'ABC'; +select * from collate_test1 where b ilike 'ABC'; +reset enable_seqscan; + + +-- schema manipulation commands + +CREATE ROLE regress_test_role; +CREATE SCHEMA test_schema; + +-- We need to do this this way to cope with varying names for encodings: +do $$ +BEGIN + EXECUTE 'CREATE COLLATION test0 (provider = icu, locale = ' || + quote_literal(current_setting('lc_collate')) || ');'; +END +$$; +CREATE COLLATION test0 FROM "C"; -- fail, duplicate name +do $$ +BEGIN + EXECUTE 'CREATE COLLATION test1 (provider = icu, lc_collate = ' || + quote_literal(current_setting('lc_collate')) || + ', lc_ctype = ' || + quote_literal(current_setting('lc_ctype')) || ');'; +END +$$; +CREATE COLLATION test3 (provider = icu, lc_collate = 'en_US.utf8'); -- fail, need lc_ctype +CREATE COLLATION testx (provider = icu, locale = 'nonsense'); /* never fails with ICU */ DROP COLLATION testx; + +CREATE COLLATION test4 FROM nonsense; +CREATE COLLATION test5 FROM test0; + +SELECT collname FROM pg_collation WHERE collname LIKE 'test%' ORDER BY 1; + +ALTER COLLATION test1 RENAME TO test11; +ALTER COLLATION test0 RENAME TO test11; -- fail +ALTER COLLATION test1 RENAME TO test22; -- fail + +ALTER COLLATION test11 OWNER TO regress_test_role; +ALTER COLLATION test11 OWNER TO nonsense; +ALTER COLLATION test11 SET SCHEMA test_schema; + +COMMENT ON COLLATION test0 IS 'US English'; + +SELECT collname, nspname, obj_description(pg_collation.oid, 'pg_collation') + FROM pg_collation JOIN pg_namespace ON (collnamespace = pg_namespace.oid) + WHERE collname LIKE 'test%' + ORDER BY 1; + +DROP COLLATION test0, test_schema.test11, test5; +DROP COLLATION test0; -- fail +DROP COLLATION IF EXISTS test0; + +SELECT collname FROM pg_collation WHERE collname LIKE 'test%'; + +DROP SCHEMA test_schema; +DROP ROLE regress_test_role; + + +-- ALTER + +ALTER COLLATION "en-x-icu" REFRESH VERSION; + + +-- dependencies + +CREATE COLLATION test0 FROM "C"; + +CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0); +CREATE DOMAIN collate_dep_dom1 AS text COLLATE test0; +CREATE TYPE collate_dep_test2 AS (x int, y text COLLATE test0); +CREATE VIEW collate_dep_test3 AS SELECT text 'foo' COLLATE test0 AS foo; +CREATE TABLE collate_dep_test4t (a int, b text); +CREATE INDEX collate_dep_test4i ON collate_dep_test4t (b COLLATE test0); + +DROP COLLATION test0 RESTRICT; -- fail +DROP COLLATION test0 CASCADE; + +\d collate_dep_test1 +\d collate_dep_test2 + +DROP TABLE collate_dep_test1, collate_dep_test4t; +DROP TYPE collate_dep_test2; + +-- test range types and collations + +create type textrange_c as range(subtype=text, collation="C"); +create type textrange_en_us as range(subtype=text, collation="en-x-icu"); + +select textrange_c('A','Z') @> 'b'::text; +select textrange_en_us('A','Z') @> 'b'::text; + +drop type textrange_c; +drop type textrange_en_us; + + +-- test ICU collation customization + +-- test the attributes handled by icu_set_collation_attributes() + +CREATE COLLATION testcoll_ignore_accents (provider = icu, locale = '@colStrength=primary;colCaseLevel=yes'); +SELECT 'aaá' > 'AAA' COLLATE "und-x-icu", 'aaá' < 'AAA' COLLATE testcoll_ignore_accents; + +CREATE COLLATION testcoll_backwards (provider = icu, locale = '@colBackwards=yes'); +SELECT 'coté' < 'côte' COLLATE "und-x-icu", 'coté' > 'côte' COLLATE testcoll_backwards; + +CREATE COLLATION testcoll_lower_first (provider = icu, locale = '@colCaseFirst=lower'); +CREATE COLLATION testcoll_upper_first (provider = icu, locale = '@colCaseFirst=upper'); +SELECT 'aaa' < 'AAA' COLLATE testcoll_lower_first, 'aaa' > 'AAA' COLLATE testcoll_upper_first; + +CREATE COLLATION testcoll_shifted (provider = icu, locale = '@colAlternate=shifted'); +SELECT 'de-luge' < 'deanza' COLLATE "und-x-icu", 'de-luge' > 'deanza' COLLATE testcoll_shifted; + +CREATE COLLATION testcoll_numeric (provider = icu, locale = '@colNumeric=yes'); +SELECT 'A-21' > 'A-123' COLLATE "und-x-icu", 'A-21' < 'A-123' COLLATE testcoll_numeric; + +CREATE COLLATION testcoll_error1 (provider = icu, locale = '@colNumeric=lower'); + +-- test that attributes not handled by icu_set_collation_attributes() +-- (handled by ucol_open() directly) also work +CREATE COLLATION testcoll_de_phonebook (provider = icu, locale = 'de@collation=phonebook'); +SELECT 'Goldmann' < 'Götz' COLLATE "de-x-icu", 'Goldmann' > 'Götz' COLLATE testcoll_de_phonebook; + + +-- nondeterministic collations + +CREATE COLLATION ctest_det (provider = icu, locale = '', deterministic = true); +CREATE COLLATION ctest_nondet (provider = icu, locale = '', deterministic = false); + +CREATE TABLE test6 (a int, b text); +-- same string in different normal forms +INSERT INTO test6 VALUES (1, U&'\00E4bc'); +INSERT INTO test6 VALUES (2, U&'\0061\0308bc'); +SELECT * FROM test6; +SELECT * FROM test6 WHERE b = 'äbc' COLLATE ctest_det; +SELECT * FROM test6 WHERE b = 'äbc' COLLATE ctest_nondet; + +-- same with arrays +CREATE TABLE test6a (a int, b text[]); +INSERT INTO test6a VALUES (1, ARRAY[U&'\00E4bc']); +INSERT INTO test6a VALUES (2, ARRAY[U&'\0061\0308bc']); +SELECT * FROM test6a; +SELECT * FROM test6a WHERE b = ARRAY['äbc'] COLLATE ctest_det; +SELECT * FROM test6a WHERE b = ARRAY['äbc'] COLLATE ctest_nondet; + +CREATE COLLATION case_sensitive (provider = icu, locale = ''); +CREATE COLLATION case_insensitive (provider = icu, locale = '@colStrength=secondary', deterministic = false); + +SELECT 'abc' <= 'ABC' COLLATE case_sensitive, 'abc' >= 'ABC' COLLATE case_sensitive; +SELECT 'abc' <= 'ABC' COLLATE case_insensitive, 'abc' >= 'ABC' COLLATE case_insensitive; + +CREATE TABLE test1cs (x text COLLATE case_sensitive); +CREATE TABLE test2cs (x text COLLATE case_sensitive); +CREATE TABLE test3cs (x text COLLATE case_sensitive); +INSERT INTO test1cs VALUES ('abc'), ('def'), ('ghi'); +INSERT INTO test2cs VALUES ('ABC'), ('ghi'); +INSERT INTO test3cs VALUES ('abc'), ('ABC'), ('def'), ('ghi'); + +SELECT x FROM test3cs WHERE x = 'abc'; +SELECT x FROM test3cs WHERE x <> 'abc'; +SELECT x FROM test3cs WHERE x LIKE 'a%'; +SELECT x FROM test3cs WHERE x ILIKE 'a%'; +SELECT x FROM test3cs WHERE x SIMILAR TO 'a%'; +SELECT x FROM test3cs WHERE x ~ 'a'; +SELECT x FROM test1cs UNION SELECT x FROM test2cs ORDER BY x; +SELECT x FROM test2cs UNION SELECT x FROM test1cs ORDER BY x; +SELECT x FROM test1cs INTERSECT SELECT x FROM test2cs; +SELECT x FROM test2cs INTERSECT SELECT x FROM test1cs; +SELECT x FROM test1cs EXCEPT SELECT x FROM test2cs; +SELECT x FROM test2cs EXCEPT SELECT x FROM test1cs; +SELECT DISTINCT x FROM test3cs ORDER BY x; +SELECT count(DISTINCT x) FROM test3cs; +SELECT x, count(*) FROM test3cs GROUP BY x ORDER BY x; +SELECT x, row_number() OVER (ORDER BY x), rank() OVER (ORDER BY x) FROM test3cs ORDER BY x; +CREATE UNIQUE INDEX ON test1cs (x); -- ok +INSERT INTO test1cs VALUES ('ABC'); -- ok +CREATE UNIQUE INDEX ON test3cs (x); -- ok +SELECT string_to_array('ABC,DEF,GHI' COLLATE case_sensitive, ',', 'abc'); +SELECT string_to_array('ABCDEFGHI' COLLATE case_sensitive, NULL, 'b'); + +CREATE TABLE test1ci (x text COLLATE case_insensitive); +CREATE TABLE test2ci (x text COLLATE case_insensitive); +CREATE TABLE test3ci (x text COLLATE case_insensitive); +CREATE INDEX ON test3ci (x text_pattern_ops); -- error +INSERT INTO test1ci VALUES ('abc'), ('def'), ('ghi'); +INSERT INTO test2ci VALUES ('ABC'), ('ghi'); +INSERT INTO test3ci VALUES ('abc'), ('ABC'), ('def'), ('ghi'); + +SELECT x FROM test3ci WHERE x = 'abc'; +SELECT x FROM test3ci WHERE x <> 'abc'; +SELECT x FROM test3ci WHERE x LIKE 'a%'; +SELECT x FROM test3ci WHERE x ILIKE 'a%'; +SELECT x FROM test3ci WHERE x SIMILAR TO 'a%'; +SELECT x FROM test3ci WHERE x ~ 'a'; +SELECT x FROM test1ci UNION SELECT x FROM test2ci ORDER BY x; +SELECT x FROM test2ci UNION SELECT x FROM test1ci ORDER BY x; +SELECT x FROM test1ci INTERSECT SELECT x FROM test2ci ORDER BY x; +SELECT x FROM test2ci INTERSECT SELECT x FROM test1ci ORDER BY x; +SELECT x FROM test1ci EXCEPT SELECT x FROM test2ci; +SELECT x FROM test2ci EXCEPT SELECT x FROM test1ci; +SELECT DISTINCT x FROM test3ci ORDER BY x; +SELECT count(DISTINCT x) FROM test3ci; +SELECT x, count(*) FROM test3ci GROUP BY x ORDER BY x; +SELECT x, row_number() OVER (ORDER BY x), rank() OVER (ORDER BY x) FROM test3ci ORDER BY x; +CREATE UNIQUE INDEX ON test1ci (x); -- ok +INSERT INTO test1ci VALUES ('ABC'); -- error +CREATE UNIQUE INDEX ON test3ci (x); -- error +SELECT string_to_array('ABC,DEF,GHI' COLLATE case_insensitive, ',', 'abc'); +SELECT string_to_array('ABCDEFGHI' COLLATE case_insensitive, NULL, 'b'); + +-- bpchar +CREATE TABLE test1bpci (x char(3) COLLATE case_insensitive); +CREATE TABLE test2bpci (x char(3) COLLATE case_insensitive); +CREATE TABLE test3bpci (x char(3) COLLATE case_insensitive); +CREATE INDEX ON test3bpci (x bpchar_pattern_ops); -- error +INSERT INTO test1bpci VALUES ('abc'), ('def'), ('ghi'); +INSERT INTO test2bpci VALUES ('ABC'), ('ghi'); +INSERT INTO test3bpci VALUES ('abc'), ('ABC'), ('def'), ('ghi'); + +SELECT x FROM test3bpci WHERE x = 'abc'; +SELECT x FROM test3bpci WHERE x <> 'abc'; +SELECT x FROM test3bpci WHERE x LIKE 'a%'; +SELECT x FROM test3bpci WHERE x ILIKE 'a%'; +SELECT x FROM test3bpci WHERE x SIMILAR TO 'a%'; +SELECT x FROM test3bpci WHERE x ~ 'a'; +SELECT x FROM test1bpci UNION SELECT x FROM test2bpci ORDER BY x; +SELECT x FROM test2bpci UNION SELECT x FROM test1bpci ORDER BY x; +SELECT x FROM test1bpci INTERSECT SELECT x FROM test2bpci ORDER BY x; +SELECT x FROM test2bpci INTERSECT SELECT x FROM test1bpci ORDER BY x; +SELECT x FROM test1bpci EXCEPT SELECT x FROM test2bpci; +SELECT x FROM test2bpci EXCEPT SELECT x FROM test1bpci; +SELECT DISTINCT x FROM test3bpci ORDER BY x; +SELECT count(DISTINCT x) FROM test3bpci; +SELECT x, count(*) FROM test3bpci GROUP BY x ORDER BY x; +SELECT x, row_number() OVER (ORDER BY x), rank() OVER (ORDER BY x) FROM test3bpci ORDER BY x; +CREATE UNIQUE INDEX ON test1bpci (x); -- ok +INSERT INTO test1bpci VALUES ('ABC'); -- error +CREATE UNIQUE INDEX ON test3bpci (x); -- error +SELECT string_to_array('ABC,DEF,GHI'::char(11) COLLATE case_insensitive, ',', 'abc'); +SELECT string_to_array('ABCDEFGHI'::char(9) COLLATE case_insensitive, NULL, 'b'); + +-- This tests the issue described in match_pattern_prefix(). In the +-- absence of that check, the case_insensitive tests below would +-- return no rows where they should logically return one. +CREATE TABLE test4c (x text COLLATE "C"); +INSERT INTO test4c VALUES ('abc'); +CREATE INDEX ON test4c (x); +SET enable_seqscan = off; +SELECT x FROM test4c WHERE x LIKE 'ABC' COLLATE case_sensitive; -- ok, no rows +SELECT x FROM test4c WHERE x LIKE 'ABC%' COLLATE case_sensitive; -- ok, no rows +SELECT x FROM test4c WHERE x LIKE 'ABC' COLLATE case_insensitive; -- error +SELECT x FROM test4c WHERE x LIKE 'ABC%' COLLATE case_insensitive; -- error +RESET enable_seqscan; + +-- Unicode special case: different variants of Greek lower case sigma. +-- A naive implementation like citext that just does lower(x) = +-- lower(y) will do the wrong thing here, because lower('Σ') is 'σ' +-- but upper('ς') is 'Σ'. +SELECT 'ὀδυσσεύς' = 'ὈΔΥΣΣΕΎΣ' COLLATE case_sensitive; +SELECT 'ὀδυσσεύς' = 'ὈΔΥΣΣΕΎΣ' COLLATE case_insensitive; + +-- name vs. text comparison operators +SELECT relname FROM pg_class WHERE relname = 'PG_CLASS'::text COLLATE case_insensitive; +SELECT relname FROM pg_class WHERE 'PG_CLASS'::text = relname COLLATE case_insensitive; + +SELECT typname FROM pg_type WHERE typname LIKE 'int_' AND typname <> 'INT2'::text + COLLATE case_insensitive ORDER BY typname; +SELECT typname FROM pg_type WHERE typname LIKE 'int_' AND 'INT2'::text <> typname + COLLATE case_insensitive ORDER BY typname; + +-- test case adapted from subselect.sql +CREATE TEMP TABLE outer_text (f1 text COLLATE case_insensitive, f2 text); +INSERT INTO outer_text VALUES ('a', 'a'); +INSERT INTO outer_text VALUES ('b', 'a'); +INSERT INTO outer_text VALUES ('A', NULL); +INSERT INTO outer_text VALUES ('B', NULL); + +CREATE TEMP TABLE inner_text (c1 text COLLATE case_insensitive, c2 text); +INSERT INTO inner_text VALUES ('a', NULL); + +SELECT * FROM outer_text WHERE (f1, f2) NOT IN (SELECT * FROM inner_text); + +-- accents +CREATE COLLATION ignore_accents (provider = icu, locale = '@colStrength=primary;colCaseLevel=yes', deterministic = false); + +CREATE TABLE test4 (a int, b text); +INSERT INTO test4 VALUES (1, 'cote'), (2, 'côte'), (3, 'coté'), (4, 'côté'); +SELECT * FROM test4 WHERE b = 'cote'; +SELECT * FROM test4 WHERE b = 'cote' COLLATE ignore_accents; +SELECT * FROM test4 WHERE b = 'Cote' COLLATE ignore_accents; -- still case-sensitive +SELECT * FROM test4 WHERE b = 'Cote' COLLATE case_insensitive; + +-- foreign keys (should use collation of primary key) + +-- PK is case-sensitive, FK is case-insensitive +CREATE TABLE test10pk (x text COLLATE case_sensitive PRIMARY KEY); +INSERT INTO test10pk VALUES ('abc'), ('def'), ('ghi'); +CREATE TABLE test10fk (x text COLLATE case_insensitive REFERENCES test10pk (x) ON UPDATE CASCADE ON DELETE CASCADE); +INSERT INTO test10fk VALUES ('abc'); -- ok +INSERT INTO test10fk VALUES ('ABC'); -- error +INSERT INTO test10fk VALUES ('xyz'); -- error +SELECT * FROM test10pk; +SELECT * FROM test10fk; +-- restrict update even though the values are "equal" in the FK table +UPDATE test10fk SET x = 'ABC' WHERE x = 'abc'; -- error +SELECT * FROM test10fk; +DELETE FROM test10pk WHERE x = 'abc'; +SELECT * FROM test10pk; +SELECT * FROM test10fk; + +-- PK is case-insensitive, FK is case-sensitive +CREATE TABLE test11pk (x text COLLATE case_insensitive PRIMARY KEY); +INSERT INTO test11pk VALUES ('abc'), ('def'), ('ghi'); +CREATE TABLE test11fk (x text COLLATE case_sensitive REFERENCES test11pk (x) ON UPDATE CASCADE ON DELETE CASCADE); +INSERT INTO test11fk VALUES ('abc'); -- ok +INSERT INTO test11fk VALUES ('ABC'); -- ok +INSERT INTO test11fk VALUES ('xyz'); -- error +SELECT * FROM test11pk; +SELECT * FROM test11fk; +-- cascade update even though the values are "equal" in the PK table +UPDATE test11pk SET x = 'ABC' WHERE x = 'abc'; +SELECT * FROM test11fk; +DELETE FROM test11pk WHERE x = 'abc'; +SELECT * FROM test11pk; +SELECT * FROM test11fk; + +-- partitioning +CREATE TABLE test20 (a int, b text COLLATE case_insensitive) PARTITION BY LIST (b); +CREATE TABLE test20_1 PARTITION OF test20 FOR VALUES IN ('abc'); +INSERT INTO test20 VALUES (1, 'abc'); +INSERT INTO test20 VALUES (2, 'ABC'); +SELECT * FROM test20_1; + +CREATE TABLE test21 (a int, b text COLLATE case_insensitive) PARTITION BY RANGE (b); +CREATE TABLE test21_1 PARTITION OF test21 FOR VALUES FROM ('ABC') TO ('DEF'); +INSERT INTO test21 VALUES (1, 'abc'); +INSERT INTO test21 VALUES (2, 'ABC'); +SELECT * FROM test21_1; + +CREATE TABLE test22 (a int, b text COLLATE case_sensitive) PARTITION BY HASH (b); +CREATE TABLE test22_0 PARTITION OF test22 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test22_1 PARTITION OF test22 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test22 VALUES (1, 'def'); +INSERT INTO test22 VALUES (2, 'DEF'); +-- they end up in different partitions +SELECT (SELECT count(*) FROM test22_0) = (SELECT count(*) FROM test22_1); + +-- same with arrays +CREATE TABLE test22a (a int, b text[] COLLATE case_sensitive) PARTITION BY HASH (b); +CREATE TABLE test22a_0 PARTITION OF test22a FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test22a_1 PARTITION OF test22a FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test22a VALUES (1, ARRAY['def']); +INSERT INTO test22a VALUES (2, ARRAY['DEF']); +-- they end up in different partitions +SELECT (SELECT count(*) FROM test22a_0) = (SELECT count(*) FROM test22a_1); + +CREATE TABLE test23 (a int, b text COLLATE case_insensitive) PARTITION BY HASH (b); +CREATE TABLE test23_0 PARTITION OF test23 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test23_1 PARTITION OF test23 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test23 VALUES (1, 'def'); +INSERT INTO test23 VALUES (2, 'DEF'); +-- they end up in the same partition (but it's platform-dependent which one) +SELECT (SELECT count(*) FROM test23_0) <> (SELECT count(*) FROM test23_1); + +-- same with arrays +CREATE TABLE test23a (a int, b text[] COLLATE case_insensitive) PARTITION BY HASH (b); +CREATE TABLE test23a_0 PARTITION OF test23a FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test23a_1 PARTITION OF test23a FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test23a VALUES (1, ARRAY['def']); +INSERT INTO test23a VALUES (2, ARRAY['DEF']); +-- they end up in the same partition (but it's platform-dependent which one) +SELECT (SELECT count(*) FROM test23a_0) <> (SELECT count(*) FROM test23a_1); + +CREATE TABLE test30 (a int, b char(3) COLLATE case_insensitive) PARTITION BY LIST (b); +CREATE TABLE test30_1 PARTITION OF test30 FOR VALUES IN ('abc'); +INSERT INTO test30 VALUES (1, 'abc'); +INSERT INTO test30 VALUES (2, 'ABC'); +SELECT * FROM test30_1; + +CREATE TABLE test31 (a int, b char(3) COLLATE case_insensitive) PARTITION BY RANGE (b); +CREATE TABLE test31_1 PARTITION OF test31 FOR VALUES FROM ('ABC') TO ('DEF'); +INSERT INTO test31 VALUES (1, 'abc'); +INSERT INTO test31 VALUES (2, 'ABC'); +SELECT * FROM test31_1; + +CREATE TABLE test32 (a int, b char(3) COLLATE case_sensitive) PARTITION BY HASH (b); +CREATE TABLE test32_0 PARTITION OF test32 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test32_1 PARTITION OF test32 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test32 VALUES (1, 'def'); +INSERT INTO test32 VALUES (2, 'DEF'); +-- they end up in different partitions +SELECT (SELECT count(*) FROM test32_0) = (SELECT count(*) FROM test32_1); + +CREATE TABLE test33 (a int, b char(3) COLLATE case_insensitive) PARTITION BY HASH (b); +CREATE TABLE test33_0 PARTITION OF test33 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE test33_1 PARTITION OF test33 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO test33 VALUES (1, 'def'); +INSERT INTO test33 VALUES (2, 'DEF'); +-- they end up in the same partition (but it's platform-dependent which one) +SELECT (SELECT count(*) FROM test33_0) <> (SELECT count(*) FROM test33_1); + + +-- cleanup +RESET search_path; +SET client_min_messages TO warning; +DROP SCHEMA collate_tests CASCADE; +RESET client_min_messages; + +-- leave a collation for pg_upgrade test +CREATE COLLATION coll_icu_upgrade FROM "und-x-icu"; diff --git a/src/test/singlenode_regress/sql/collate.linux.utf8.sql b/src/test/singlenode_regress/sql/collate.linux.utf8.sql new file mode 100644 index 00000000000..cbbd2203e41 --- /dev/null +++ b/src/test/singlenode_regress/sql/collate.linux.utf8.sql @@ -0,0 +1,455 @@ +/* + * This test is for Linux/glibc systems and assumes that a full set of + * locales is installed. It must be run in a database with UTF-8 encoding, + * because other encodings don't support all the characters used. + */ + +SELECT getdatabaseencoding() <> 'UTF8' OR + (SELECT count(*) FROM pg_collation WHERE collname IN ('de_DE', 'en_US', 'sv_SE', 'tr_TR') AND collencoding = pg_char_to_encoding('UTF8')) <> 4 OR + version() !~ 'linux-gnu' + AS skip_test \gset +\if :skip_test +\quit +\endif + +SET client_encoding TO UTF8; + +CREATE SCHEMA collate_tests; +SET search_path = collate_tests; + + +CREATE TABLE collate_test1 ( + a int, + b text COLLATE "en_US" NOT NULL +); + +\d collate_test1 + +CREATE TABLE collate_test_fail ( + a int, + b text COLLATE "ja_JP.eucjp" +); + +CREATE TABLE collate_test_fail ( + a int, + b text COLLATE "foo" +); + +CREATE TABLE collate_test_fail ( + a int COLLATE "en_US", + b text +); + +CREATE TABLE collate_test_like ( + LIKE collate_test1 +); + +\d collate_test_like + +CREATE TABLE collate_test2 ( + a int, + b text COLLATE "sv_SE" +); + +CREATE TABLE collate_test3 ( + a int, + b text COLLATE "C" +); + +INSERT INTO collate_test1 VALUES (1, 'abc'), (2, 'äbc'), (3, 'bbc'), (4, 'ABC'); +INSERT INTO collate_test2 SELECT * FROM collate_test1; +INSERT INTO collate_test3 SELECT * FROM collate_test1; + +SELECT * FROM collate_test1 WHERE b >= 'bbc'; +SELECT * FROM collate_test2 WHERE b >= 'bbc'; +SELECT * FROM collate_test3 WHERE b >= 'bbc'; +SELECT * FROM collate_test3 WHERE b >= 'BBC'; + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; +SELECT * FROM collate_test1 WHERE b >= 'bbc' COLLATE "C"; +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "C"; +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "en_US"; + + +CREATE DOMAIN testdomain_sv AS text COLLATE "sv_SE"; +CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; -- fails +CREATE TABLE collate_test4 ( + a int, + b testdomain_sv +); +INSERT INTO collate_test4 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test4 ORDER BY b; + +CREATE TABLE collate_test5 ( + a int, + b testdomain_sv COLLATE "en_US" +); +INSERT INTO collate_test5 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test5 ORDER BY b; + + +SELECT a, b FROM collate_test1 ORDER BY b; +SELECT a, b FROM collate_test2 ORDER BY b; +SELECT a, b FROM collate_test3 ORDER BY b; + +SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; + +-- star expansion +SELECT * FROM collate_test1 ORDER BY b; +SELECT * FROM collate_test2 ORDER BY b; +SELECT * FROM collate_test3 ORDER BY b; + +-- constant expression folding +SELECT 'bbc' COLLATE "en_US" > 'äbc' COLLATE "en_US" AS "true"; +SELECT 'bbc' COLLATE "sv_SE" > 'äbc' COLLATE "sv_SE" AS "false"; + +-- upper/lower + +CREATE TABLE collate_test10 ( + a int, + x text COLLATE "en_US", + y text COLLATE "tr_TR" +); + +INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ'); + +SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10; +SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10; + +SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a; + +-- LIKE/ILIKE + +SELECT * FROM collate_test1 WHERE b LIKE 'abc'; +SELECT * FROM collate_test1 WHERE b LIKE 'abc%'; +SELECT * FROM collate_test1 WHERE b LIKE '%bc%'; +SELECT * FROM collate_test1 WHERE b ILIKE 'abc'; +SELECT * FROM collate_test1 WHERE b ILIKE 'abc%'; +SELECT * FROM collate_test1 WHERE b ILIKE '%bc%'; + +SELECT 'Türkiye' COLLATE "en_US" ILIKE '%KI%' AS "true"; +SELECT 'Türkiye' COLLATE "tr_TR" ILIKE '%KI%' AS "false"; + +SELECT 'bıt' ILIKE 'BIT' COLLATE "en_US" AS "false"; +SELECT 'bıt' ILIKE 'BIT' COLLATE "tr_TR" AS "true"; + +-- The following actually exercises the selectivity estimation for ILIKE. +SELECT relname FROM pg_class WHERE relname ILIKE 'abc%'; + +-- regular expressions + +SELECT * FROM collate_test1 WHERE b ~ '^abc$'; +SELECT * FROM collate_test1 WHERE b ~ '^abc'; +SELECT * FROM collate_test1 WHERE b ~ 'bc'; +SELECT * FROM collate_test1 WHERE b ~* '^abc$'; +SELECT * FROM collate_test1 WHERE b ~* '^abc'; +SELECT * FROM collate_test1 WHERE b ~* 'bc'; + +CREATE TABLE collate_test6 ( + a int, + b text COLLATE "en_US" +); +INSERT INTO collate_test6 VALUES (1, 'abc'), (2, 'ABC'), (3, '123'), (4, 'ab1'), + (5, 'a1!'), (6, 'a c'), (7, '!.;'), (8, ' '), + (9, 'äbç'), (10, 'ÄBÇ'); +SELECT b, + b ~ '^[[:alpha:]]+$' AS is_alpha, + b ~ '^[[:upper:]]+$' AS is_upper, + b ~ '^[[:lower:]]+$' AS is_lower, + b ~ '^[[:digit:]]+$' AS is_digit, + b ~ '^[[:alnum:]]+$' AS is_alnum, + b ~ '^[[:graph:]]+$' AS is_graph, + b ~ '^[[:print:]]+$' AS is_print, + b ~ '^[[:punct:]]+$' AS is_punct, + b ~ '^[[:space:]]+$' AS is_space +FROM collate_test6; + +SELECT 'Türkiye' COLLATE "en_US" ~* 'KI' AS "true"; +SELECT 'Türkiye' COLLATE "tr_TR" ~* 'KI' AS "false"; + +SELECT 'bıt' ~* 'BIT' COLLATE "en_US" AS "false"; +SELECT 'bıt' ~* 'BIT' COLLATE "tr_TR" AS "true"; + +-- The following actually exercises the selectivity estimation for ~*. +SELECT relname FROM pg_class WHERE relname ~* '^abc'; + + +-- to_char + +SET lc_time TO 'tr_TR'; +SELECT to_char(date '2010-02-01', 'DD TMMON YYYY'); +SELECT to_char(date '2010-02-01', 'DD TMMON YYYY' COLLATE "tr_TR"); +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'); +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR"); + +-- to_date + +SELECT to_date('01 ŞUB 2010', 'DD TMMON YYYY'); +SELECT to_date('01 Şub 2010', 'DD TMMON YYYY'); +SELECT to_date('1234567890ab 2010', 'TMMONTH YYYY'); -- fail + + +-- backwards parsing + +CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; +CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; +CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "C") FROM collate_test10; + +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'collview%' ORDER BY 1; + + +-- collation propagation in various expression types + +SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2; +SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2; +SELECT a, coalesce(b, 'foo') FROM collate_test3 ORDER BY 2; +SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10; + +SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3; +SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3; +SELECT a, b, greatest(b, 'CCC') FROM collate_test3 ORDER BY 3; +SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10; + +SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2; +SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2; +SELECT a, nullif(b, 'abc') FROM collate_test3 ORDER BY 2; +SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10; + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2; +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2; +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test3 ORDER BY 2; + +CREATE DOMAIN testdomain AS text; +SELECT a, b::testdomain FROM collate_test1 ORDER BY 2; +SELECT a, b::testdomain FROM collate_test2 ORDER BY 2; +SELECT a, b::testdomain FROM collate_test3 ORDER BY 2; +SELECT a, b::testdomain_sv FROM collate_test3 ORDER BY 2; +SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10; + +SELECT min(b), max(b) FROM collate_test1; +SELECT min(b), max(b) FROM collate_test2; +SELECT min(b), max(b) FROM collate_test3; + +SELECT array_agg(b ORDER BY b) FROM collate_test1; +SELECT array_agg(b ORDER BY b) FROM collate_test2; +SELECT array_agg(b ORDER BY b) FROM collate_test3; + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2; +SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2; +SELECT a, b FROM collate_test3 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test3 WHERE a > 1 ORDER BY 2; +SELECT a, b FROM collate_test3 EXCEPT SELECT a, b FROM collate_test3 WHERE a < 2 ORDER BY 2; + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- ok +SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- ok +SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail +SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail + +CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- fail + +-- ideally this would be a parse-time error, but for now it must be run-time: +select x < y from collate_test10; -- fail +select x || y from collate_test10; -- ok, because || is not collation aware +select x, y from collate_test10 order by x || y; -- not so ok + +-- collation mismatch between recursive and non-recursive term +WITH RECURSIVE foo(x) AS + (SELECT x FROM (VALUES('a' COLLATE "en_US"),('b')) t(x) + UNION ALL + SELECT (x || 'c') COLLATE "de_DE" FROM foo WHERE length(x) < 10) +SELECT * FROM foo; + + +-- casting + +SELECT CAST('42' AS text COLLATE "C"); + +SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2; +SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2; +SELECT a, CAST(b AS varchar) FROM collate_test3 ORDER BY 2; + + +-- propagation of collation in SQL functions (inlined and non-inlined cases) +-- and plpgsql functions too + +CREATE FUNCTION mylt (text, text) RETURNS boolean LANGUAGE sql + AS $$ select $1 < $2 $$; + +CREATE FUNCTION mylt_noninline (text, text) RETURNS boolean LANGUAGE sql + AS $$ select $1 < $2 limit 1 $$; + +CREATE FUNCTION mylt_plpgsql (text, text) RETURNS boolean LANGUAGE plpgsql + AS $$ begin return $1 < $2; end $$; + +SELECT a.b AS a, b.b AS b, a.b < b.b AS lt, + mylt(a.b, b.b), mylt_noninline(a.b, b.b), mylt_plpgsql(a.b, b.b) +FROM collate_test1 a, collate_test1 b +ORDER BY a.b, b.b; + +SELECT a.b AS a, b.b AS b, a.b < b.b COLLATE "C" AS lt, + mylt(a.b, b.b COLLATE "C"), mylt_noninline(a.b, b.b COLLATE "C"), + mylt_plpgsql(a.b, b.b COLLATE "C") +FROM collate_test1 a, collate_test1 b +ORDER BY a.b, b.b; + + +-- collation override in plpgsql + +CREATE FUNCTION mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$ +declare + xx text := x; + yy text := y; +begin + return xx < yy; +end +$$; + +SELECT mylt2('a', 'B' collate "en_US") as t, mylt2('a', 'B' collate "C") as f; + +CREATE OR REPLACE FUNCTION + mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$ +declare + xx text COLLATE "POSIX" := x; + yy text := y; +begin + return xx < yy; +end +$$; + +SELECT mylt2('a', 'B') as f; +SELECT mylt2('a', 'B' collate "C") as fail; -- conflicting collations +SELECT mylt2('a', 'B' collate "POSIX") as f; + + +-- polymorphism + +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1; +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1; +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test3)) ORDER BY 1; + +CREATE FUNCTION dup (anyelement) RETURNS anyelement + AS 'select $1' LANGUAGE sql; + +SELECT a, dup(b) FROM collate_test1 ORDER BY 2; +SELECT a, dup(b) FROM collate_test2 ORDER BY 2; +SELECT a, dup(b) FROM collate_test3 ORDER BY 2; + + +-- indexes + +CREATE INDEX collate_test1_idx1 ON collate_test1 (b); +CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "C"); +CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "C")); -- this is different grammatically +CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX")); + +CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "C"); -- fail +CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C")); -- fail + +SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1; + + +-- schema manipulation commands + +CREATE ROLE regress_test_role; +CREATE SCHEMA test_schema; + +-- We need to do this this way to cope with varying names for encodings: +do $$ +BEGIN + EXECUTE 'CREATE COLLATION test0 (locale = ' || + quote_literal(current_setting('lc_collate')) || ');'; +END +$$; +CREATE COLLATION test0 FROM "C"; -- fail, duplicate name +CREATE COLLATION IF NOT EXISTS test0 FROM "C"; -- ok, skipped +CREATE COLLATION IF NOT EXISTS test0 (locale = 'foo'); -- ok, skipped +do $$ +BEGIN + EXECUTE 'CREATE COLLATION test1 (lc_collate = ' || + quote_literal(current_setting('lc_collate')) || + ', lc_ctype = ' || + quote_literal(current_setting('lc_ctype')) || ');'; +END +$$; +CREATE COLLATION test3 (lc_collate = 'en_US.utf8'); -- fail, need lc_ctype +CREATE COLLATION testx (locale = 'nonsense'); -- fail + +CREATE COLLATION test4 FROM nonsense; +CREATE COLLATION test5 FROM test0; + +SELECT collname FROM pg_collation WHERE collname LIKE 'test%' ORDER BY 1; + +ALTER COLLATION test1 RENAME TO test11; +ALTER COLLATION test0 RENAME TO test11; -- fail +ALTER COLLATION test1 RENAME TO test22; -- fail + +ALTER COLLATION test11 OWNER TO regress_test_role; +ALTER COLLATION test11 OWNER TO nonsense; +ALTER COLLATION test11 SET SCHEMA test_schema; + +COMMENT ON COLLATION test0 IS 'US English'; + +SELECT collname, nspname, obj_description(pg_collation.oid, 'pg_collation') + FROM pg_collation JOIN pg_namespace ON (collnamespace = pg_namespace.oid) + WHERE collname LIKE 'test%' + ORDER BY 1; + +DROP COLLATION test0, test_schema.test11, test5; +DROP COLLATION test0; -- fail +DROP COLLATION IF EXISTS test0; + +SELECT collname FROM pg_collation WHERE collname LIKE 'test%'; + +DROP SCHEMA test_schema; +DROP ROLE regress_test_role; + + +-- ALTER + +ALTER COLLATION "en_US" REFRESH VERSION; + + +-- dependencies + +CREATE COLLATION test0 FROM "C"; + +CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0); +CREATE DOMAIN collate_dep_dom1 AS text COLLATE test0; +CREATE TYPE collate_dep_test2 AS (x int, y text COLLATE test0); +CREATE VIEW collate_dep_test3 AS SELECT text 'foo' COLLATE test0 AS foo; +CREATE TABLE collate_dep_test4t (a int, b text); +CREATE INDEX collate_dep_test4i ON collate_dep_test4t (b COLLATE test0); + +DROP COLLATION test0 RESTRICT; -- fail +DROP COLLATION test0 CASCADE; + +\d collate_dep_test1 +\d collate_dep_test2 + +DROP TABLE collate_dep_test1, collate_dep_test4t; +DROP TYPE collate_dep_test2; + +-- test range types and collations + +create type textrange_c as range(subtype=text, collation="C"); +create type textrange_en_us as range(subtype=text, collation="en_US"); + +select textrange_c('A','Z') @> 'b'::text; +select textrange_en_us('A','Z') @> 'b'::text; + +drop type textrange_c; +drop type textrange_en_us; + + +-- nondeterministic collations +-- (not supported with libc provider) + +CREATE COLLATION ctest_det (locale = 'en_US.utf8', deterministic = true); +CREATE COLLATION ctest_nondet (locale = 'en_US.utf8', deterministic = false); + + +-- cleanup +SET client_min_messages TO warning; +DROP SCHEMA collate_tests CASCADE; diff --git a/src/test/singlenode_regress/sql/collate.sql b/src/test/singlenode_regress/sql/collate.sql new file mode 100644 index 00000000000..9c56e037d98 --- /dev/null +++ b/src/test/singlenode_regress/sql/collate.sql @@ -0,0 +1,283 @@ +/* + * This test is intended to pass on all platforms supported by Postgres. + * We can therefore only assume that the default, C, and POSIX collations + * are available --- and since the regression tests are often run in a + * C-locale database, these may well all have the same behavior. But + * fortunately, the system doesn't know that and will treat them as + * incompatible collations. It is therefore at least possible to test + * parser behaviors such as collation conflict resolution. This test will, + * however, be more revealing when run in a database with non-C locale, + * since any departure from C sorting behavior will show as a failure. + */ + +CREATE SCHEMA collate_tests; +SET search_path = collate_tests; + +CREATE TABLE collate_test1 ( + a int, + b text COLLATE "C" NOT NULL +); + +\d collate_test1 + +CREATE TABLE collate_test_fail ( + a int COLLATE "C", + b text +); + +CREATE TABLE collate_test_like ( + LIKE collate_test1 +); + +\d collate_test_like + +CREATE TABLE collate_test2 ( + a int, + b text COLLATE "POSIX" +); + +INSERT INTO collate_test1 VALUES (1, 'abc'), (2, 'Abc'), (3, 'bbc'), (4, 'ABD'); +INSERT INTO collate_test2 SELECT * FROM collate_test1; + +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'abc'; +SELECT * FROM collate_test1 WHERE b >= 'abc' COLLATE "C"; +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'abc' COLLATE "C"; +SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "POSIX"; -- fail + +CREATE DOMAIN testdomain_p AS text COLLATE "POSIX"; +CREATE DOMAIN testdomain_i AS int COLLATE "POSIX"; -- fail +CREATE TABLE collate_test4 ( + a int, + b testdomain_p +); +INSERT INTO collate_test4 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test4 ORDER BY b; + +CREATE TABLE collate_test5 ( + a int, + b testdomain_p COLLATE "C" +); +INSERT INTO collate_test5 SELECT * FROM collate_test1; +SELECT a, b FROM collate_test5 ORDER BY b; + + +SELECT a, b FROM collate_test1 ORDER BY b; +SELECT a, b FROM collate_test2 ORDER BY b; + +SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; + +-- star expansion +SELECT * FROM collate_test1 ORDER BY b; +SELECT * FROM collate_test2 ORDER BY b; + +-- constant expression folding +SELECT 'bbc' COLLATE "C" > 'Abc' COLLATE "C" AS "true"; +SELECT 'bbc' COLLATE "POSIX" < 'Abc' COLLATE "POSIX" AS "false"; + +-- upper/lower + +CREATE TABLE collate_test10 ( + a int, + x text COLLATE "C", + y text COLLATE "POSIX" +); + +INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ'); + +SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10; +SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10; + +SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a; + +-- backwards parsing + +CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; +CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; +CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10; + +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'collview%' ORDER BY 1; + + +-- collation propagation in various expression types + +SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2; +SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2; +SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10; + +SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3; +SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3; +SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10; + +SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2; +SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2; +SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10; + +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2; +SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2; + +CREATE DOMAIN testdomain AS text; +SELECT a, b::testdomain FROM collate_test1 ORDER BY 2; +SELECT a, b::testdomain FROM collate_test2 ORDER BY 2; +SELECT a, b::testdomain_p FROM collate_test2 ORDER BY 2; +SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10; + +SELECT min(b), max(b) FROM collate_test1; +SELECT min(b), max(b) FROM collate_test2; + +SELECT array_agg(b ORDER BY b) FROM collate_test1; +SELECT array_agg(b ORDER BY b) FROM collate_test2; + +-- In aggregates, ORDER BY expressions don't affect aggregate's collation +SELECT string_agg(x COLLATE "C", y COLLATE "POSIX") FROM collate_test10; -- fail +SELECT array_agg(x COLLATE "C" ORDER BY y COLLATE "POSIX") FROM collate_test10; +SELECT array_agg(a ORDER BY x COLLATE "C", y COLLATE "POSIX") FROM collate_test10; +SELECT array_agg(a ORDER BY x||y) FROM collate_test10; -- fail + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2; +SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2; +SELECT a, b FROM collate_test2 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test2 WHERE a > 1 ORDER BY 2; +SELECT a, b FROM collate_test2 EXCEPT SELECT a, b FROM collate_test2 WHERE a < 2 ORDER BY 2; + +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2 ORDER BY 2; -- fail +SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2; -- ok +SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- fail +SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- ok +SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test2 ORDER BY 2; -- fail +SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test2 ORDER BY 2; -- fail + +CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2; -- fail + +-- ideally this would be a parse-time error, but for now it must be run-time: +select x < y from collate_test10; -- fail +select x || y from collate_test10; -- ok, because || is not collation aware +select x, y from collate_test10 order by x || y; -- not so ok + +-- collation mismatch between recursive and non-recursive term +WITH RECURSIVE foo(x) AS + (SELECT x FROM (VALUES('a' COLLATE "C"),('b')) t(x) + UNION ALL + SELECT (x || 'c') COLLATE "POSIX" FROM foo WHERE length(x) < 10) +SELECT * FROM foo; + +SELECT a, b, a < b as lt FROM + (VALUES ('a', 'B'), ('A', 'b' COLLATE "C")) v(a,b); + +-- collation mismatch in subselects +SELECT * FROM collate_test10 WHERE (x, y) NOT IN (SELECT y, x FROM collate_test10); +-- now it works with overrides +SELECT * FROM collate_test10 WHERE (x COLLATE "POSIX", y COLLATE "C") NOT IN (SELECT y, x FROM collate_test10); +SELECT * FROM collate_test10 WHERE (x, y) NOT IN (SELECT y COLLATE "C", x COLLATE "POSIX" FROM collate_test10); + +-- casting + +SELECT CAST('42' AS text COLLATE "C"); + +SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2; +SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2; + + +-- result of a SQL function + +CREATE FUNCTION vc (text) RETURNS text LANGUAGE sql + AS 'select $1::varchar'; + +SELECT a, b FROM collate_test1 ORDER BY a, vc(b); + + +-- polymorphism + +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1; +SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1; + +CREATE FUNCTION dup (anyelement) RETURNS anyelement + AS 'select $1' LANGUAGE sql; + +SELECT a, dup(b) FROM collate_test1 ORDER BY 2; +SELECT a, dup(b) FROM collate_test2 ORDER BY 2; + + +-- indexes + +CREATE INDEX collate_test1_idx1 ON collate_test1 (b); +CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "POSIX"); +CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "POSIX")); -- this is different grammatically +CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX")); + +CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "POSIX"); -- fail +CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "POSIX")); -- fail + +SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1; + + +-- foreign keys + +-- force indexes and mergejoins to be used for FK checking queries, +-- else they might not exercise collation-dependent operators +SET enable_seqscan TO 0; +SET enable_hashjoin TO 0; +SET enable_nestloop TO 0; + +CREATE TABLE collate_test20 (f1 text COLLATE "C" PRIMARY KEY); +INSERT INTO collate_test20 VALUES ('foo'), ('bar'); +CREATE TABLE collate_test21 (f2 text COLLATE "POSIX" REFERENCES collate_test20); +INSERT INTO collate_test21 VALUES ('foo'), ('bar'); +INSERT INTO collate_test21 VALUES ('baz'); -- fail +-- Passes in GPDB, because we don't check foreign keys +CREATE TABLE collate_test22 (f2 text COLLATE "POSIX"); +INSERT INTO collate_test22 VALUES ('foo'), ('bar'), ('baz'); +ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20; -- fail +-- Passes in GPDB, because we don't check foreign keys +DELETE FROM collate_test22 WHERE f2 = 'baz'; +ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20; + +RESET enable_seqscan; +RESET enable_hashjoin; +RESET enable_nestloop; + + +-- EXPLAIN + +EXPLAIN (COSTS OFF) + SELECT * FROM collate_test10 ORDER BY x, y; +EXPLAIN (COSTS OFF) + SELECT * FROM collate_test10 ORDER BY x DESC, y COLLATE "C" ASC NULLS FIRST; + + +-- CREATE/DROP COLLATION + +CREATE COLLATION mycoll1 FROM "C"; +CREATE COLLATION mycoll2 ( LC_COLLATE = "POSIX", LC_CTYPE = "POSIX" ); +CREATE COLLATION mycoll3 FROM "default"; -- intentionally unsupported + +DROP COLLATION mycoll1; +CREATE TABLE collate_test23 (f1 text collate mycoll2); +DROP COLLATION mycoll2; -- fail + +-- invalid: non-lowercase quoted identifiers +CREATE COLLATION case_coll ("Lc_Collate" = "POSIX", "Lc_Ctype" = "POSIX"); + +-- 9.1 bug with useless COLLATE in an expression subject to length coercion + +CREATE TEMP TABLE vctable (f1 varchar(25)); +INSERT INTO vctable VALUES ('foo' COLLATE "C"); + + +SELECT collation for ('foo'); -- unknown type - null +SELECT collation for ('foo'::text); +SELECT collation for ((SELECT a FROM collate_test1 LIMIT 1)); -- non-collatable type - error +SELECT collation for ((SELECT b FROM collate_test1 LIMIT 1)); + +-- old bug with not dropping COLLATE when coercing to non-collatable type +CREATE VIEW collate_on_int AS +SELECT c1+1 AS c1p FROM + (SELECT ('4' COLLATE "C")::INT AS c1) ss; +\d+ collate_on_int + + +-- +-- Clean up. Many of these table names will be re-used if the user is +-- trying to run any platform-specific collation tests later, so we +-- must get rid of them. +-- +DROP SCHEMA collate_tests CASCADE; diff --git a/src/test/singlenode_regress/sql/combocid.sql b/src/test/singlenode_regress/sql/combocid.sql new file mode 100644 index 00000000000..a5cdf6dba29 --- /dev/null +++ b/src/test/singlenode_regress/sql/combocid.sql @@ -0,0 +1,111 @@ +-- +-- Tests for some likely failure cases with combo cmin/cmax mechanism +-- +CREATE TEMP TABLE combocidtest (foobar int); + +BEGIN; + +-- a few dummy ops to push up the CommandId counter +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; + +INSERT INTO combocidtest VALUES (1); +INSERT INTO combocidtest VALUES (2); + +SELECT ctid,cmin,* FROM combocidtest; + +SAVEPOINT s1; + +UPDATE combocidtest SET foobar = foobar + 10; + +-- here we should see only updated tuples +SELECT ctid,cmin,* FROM combocidtest; + +ROLLBACK TO s1; + +-- now we should see old tuples, but with combo CIDs starting at 0 +SELECT ctid,cmin,* FROM combocidtest; + +COMMIT; + +-- combo data is not there anymore, but should still see tuples +SELECT ctid,cmin,* FROM combocidtest; + +-- Test combo CIDs with portals +BEGIN; + +INSERT INTO combocidtest VALUES (333); + +DECLARE c CURSOR FOR SELECT ctid,cmin,* FROM combocidtest; + +DELETE FROM combocidtest; + +FETCH ALL FROM c; + +ROLLBACK; + +SELECT ctid,cmin,* FROM combocidtest; + +-- check behavior with locked tuples +BEGIN; + +-- a few dummy ops to push up the CommandId counter +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; +INSERT INTO combocidtest SELECT 1 LIMIT 0; + +INSERT INTO combocidtest VALUES (444); + +SELECT ctid,cmin,* FROM combocidtest; + +SAVEPOINT s1; + +-- this doesn't affect cmin +SELECT ctid,cmin,* FROM combocidtest FOR UPDATE; +SELECT ctid,cmin,* FROM combocidtest; + +-- but this does +UPDATE combocidtest SET foobar = foobar + 10; + +SELECT ctid,cmin,* FROM combocidtest; + +ROLLBACK TO s1; + +SELECT ctid,cmin,* FROM combocidtest; + +COMMIT; + +SELECT ctid,cmin,* FROM combocidtest; + +-- test for bug reported in +-- CABRT9RC81YUf1=jsmWopcKJEro=VoeG2ou6sPwyOUTx_qteRsg@mail.gmail.com +CREATE TABLE IF NOT EXISTS testcase( + id int PRIMARY KEY, + balance numeric +); +INSERT INTO testcase VALUES (1, 0); +BEGIN; +SELECT * FROM testcase WHERE testcase.id = 1 FOR UPDATE; +UPDATE testcase SET balance = balance + 400 WHERE id=1; +SAVEPOINT subxact; +UPDATE testcase SET balance = balance - 100 WHERE id=1; +ROLLBACK TO SAVEPOINT subxact; +-- should return one tuple +SELECT * FROM testcase WHERE id = 1 FOR UPDATE; +ROLLBACK; +DROP TABLE testcase; diff --git a/src/test/singlenode_regress/sql/comments.sql b/src/test/singlenode_regress/sql/comments.sql new file mode 100644 index 00000000000..e47db1ae598 --- /dev/null +++ b/src/test/singlenode_regress/sql/comments.sql @@ -0,0 +1,42 @@ +-- +-- COMMENTS +-- + +SELECT 'trailing' AS first; -- trailing single line +SELECT /* embedded single line */ 'embedded' AS second; +SELECT /* both embedded and trailing single line */ 'both' AS third; -- trailing single line + +SELECT 'before multi-line' AS fourth; +/* This is an example of SQL which should not execute: + * select 'multi-line'; + */ +SELECT 'after multi-line' AS fifth; + +-- +-- Nested comments +-- + +/* +SELECT 'trailing' as x1; -- inside block comment +*/ + +/* This block comment surrounds a query which itself has a block comment... +SELECT /* embedded single line */ 'embedded' AS x2; +*/ + +SELECT -- continued after the following block comments... +/* Deeply nested comment. + This includes a single apostrophe to make sure we aren't decoding this part as a string. +SELECT 'deep nest' AS n1; +/* Second level of nesting... +SELECT 'deeper nest' as n2; +/* Third level of nesting... +SELECT 'deepest nest' as n3; +*/ +Hoo boy. Still two deep... +*/ +Now just one deep... +*/ +'deeply nested example' AS sixth; + +/* and this is the end of the file */ diff --git a/src/test/singlenode_regress/sql/compression.sql b/src/test/singlenode_regress/sql/compression.sql new file mode 100644 index 00000000000..86332dcc510 --- /dev/null +++ b/src/test/singlenode_regress/sql/compression.sql @@ -0,0 +1,153 @@ +\set HIDE_TOAST_COMPRESSION false + +-- ensure we get stable results regardless of installation's default +SET default_toast_compression = 'pglz'; + +-- test creating table with compression method +CREATE TABLE cmdata(f1 text COMPRESSION pglz); +CREATE INDEX idx ON cmdata(f1); +INSERT INTO cmdata VALUES(repeat('1234567890', 1000)); +\d+ cmdata +CREATE TABLE cmdata1(f1 TEXT COMPRESSION lz4); +INSERT INTO cmdata1 VALUES(repeat('1234567890', 1004)); +\d+ cmdata1 + +-- verify stored compression method in the data +SELECT pg_column_compression(f1) FROM cmdata; +SELECT pg_column_compression(f1) FROM cmdata1; + +-- decompress data slice +SELECT SUBSTR(f1, 200, 5) FROM cmdata; +SELECT SUBSTR(f1, 2000, 50) FROM cmdata1; + +-- copy with table creation +SELECT * INTO cmmove1 FROM cmdata; +\d+ cmmove1 +SELECT pg_column_compression(f1) FROM cmmove1; + +-- copy to existing table +CREATE TABLE cmmove3(f1 text COMPRESSION pglz); +INSERT INTO cmmove3 SELECT * FROM cmdata; +INSERT INTO cmmove3 SELECT * FROM cmdata1; +SELECT pg_column_compression(f1) FROM cmmove3; + +-- test LIKE INCLUDING COMPRESSION +CREATE TABLE cmdata2 (LIKE cmdata1 INCLUDING COMPRESSION); +\d+ cmdata2 +DROP TABLE cmdata2; + +-- try setting compression for incompressible data type +CREATE TABLE cmdata2 (f1 int COMPRESSION pglz); + +-- update using datum from different table +CREATE TABLE cmmove2(f1 text COMPRESSION pglz); +INSERT INTO cmmove2 VALUES (repeat('1234567890', 1004)); +SELECT pg_column_compression(f1) FROM cmmove2; +UPDATE cmmove2 SET f1 = cmdata1.f1 FROM cmdata1; +SELECT pg_column_compression(f1) FROM cmmove2; + +-- test externally stored compressed data +CREATE OR REPLACE FUNCTION large_val() RETURNS TEXT LANGUAGE SQL AS +'select array_agg(md5(g::text))::text from generate_series(1, 256) g'; +CREATE TABLE cmdata2 (f1 text COMPRESSION pglz); +INSERT INTO cmdata2 SELECT large_val() || repeat('a', 4000); +SELECT pg_column_compression(f1) FROM cmdata2; +INSERT INTO cmdata1 SELECT large_val() || repeat('a', 4000); +SELECT pg_column_compression(f1) FROM cmdata1; +SELECT SUBSTR(f1, 200, 5) FROM cmdata1; +SELECT SUBSTR(f1, 200, 5) FROM cmdata2; +DROP TABLE cmdata2; + +--test column type update varlena/non-varlena +CREATE TABLE cmdata2 (f1 int); +\d+ cmdata2 +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE varchar; +\d+ cmdata2 +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE int USING f1::integer; +\d+ cmdata2 + +--changing column storage should not impact the compression method +--but the data should not be compressed +ALTER TABLE cmdata2 ALTER COLUMN f1 TYPE varchar; +ALTER TABLE cmdata2 ALTER COLUMN f1 SET COMPRESSION pglz; +\d+ cmdata2 +ALTER TABLE cmdata2 ALTER COLUMN f1 SET STORAGE plain; +\d+ cmdata2 +INSERT INTO cmdata2 VALUES (repeat('123456789', 800)); +SELECT pg_column_compression(f1) FROM cmdata2; + +-- test compression with materialized view +CREATE MATERIALIZED VIEW compressmv(x) AS SELECT * FROM cmdata1; +\d+ compressmv +SELECT pg_column_compression(f1) FROM cmdata1; +SELECT pg_column_compression(x) FROM compressmv; + +-- test compression with partition +CREATE TABLE cmpart(f1 text COMPRESSION lz4) PARTITION BY HASH(f1); +CREATE TABLE cmpart1 PARTITION OF cmpart FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE cmpart2(f1 text COMPRESSION pglz); + +ALTER TABLE cmpart ATTACH PARTITION cmpart2 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO cmpart VALUES (repeat('123456789', 1004)); +INSERT INTO cmpart VALUES (repeat('123456789', 4004)); +SELECT pg_column_compression(f1) FROM cmpart1; +SELECT pg_column_compression(f1) FROM cmpart2; + +-- test compression with inheritance, error +CREATE TABLE cminh() INHERITS(cmdata, cmdata1); +CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); + +-- test default_toast_compression GUC +SET default_toast_compression = ''; +SET default_toast_compression = 'I do not exist compression'; +SET default_toast_compression = 'lz4'; +SET default_toast_compression = 'pglz'; + +-- test alter compression method +ALTER TABLE cmdata ALTER COLUMN f1 SET COMPRESSION lz4; +INSERT INTO cmdata VALUES (repeat('123456789', 4004)); +\d+ cmdata +SELECT pg_column_compression(f1) FROM cmdata; + +ALTER TABLE cmdata2 ALTER COLUMN f1 SET COMPRESSION default; +\d+ cmdata2 + +-- test alter compression method for materialized views +ALTER MATERIALIZED VIEW compressmv ALTER COLUMN x SET COMPRESSION lz4; +\d+ compressmv + +-- test alter compression method for partitioned tables +ALTER TABLE cmpart1 ALTER COLUMN f1 SET COMPRESSION pglz; +ALTER TABLE cmpart2 ALTER COLUMN f1 SET COMPRESSION lz4; + +-- new data should be compressed with the current compression method +INSERT INTO cmpart VALUES (repeat('123456789', 1004)); +INSERT INTO cmpart VALUES (repeat('123456789', 4004)); +SELECT pg_column_compression(f1) FROM cmpart1; +SELECT pg_column_compression(f1) FROM cmpart2; + +-- VACUUM FULL does not recompress +SELECT pg_column_compression(f1) FROM cmdata; +VACUUM FULL cmdata; +SELECT pg_column_compression(f1) FROM cmdata; + +-- test expression index +DROP TABLE cmdata2; +CREATE TABLE cmdata2 (f1 TEXT COMPRESSION pglz, f2 TEXT COMPRESSION lz4); +CREATE UNIQUE INDEX idx1 ON cmdata2 ((f1 || f2)); +INSERT INTO cmdata2 VALUES((SELECT array_agg(md5(g::TEXT))::TEXT FROM +generate_series(1, 50) g), VERSION()); + +-- check data is ok +SELECT length(f1) FROM cmdata; +SELECT length(f1) FROM cmdata1; +SELECT length(f1) FROM cmmove1; +SELECT length(f1) FROM cmmove2; +SELECT length(f1) FROM cmmove3; + +CREATE TABLE badcompresstbl (a text COMPRESSION I_Do_Not_Exist_Compression); -- fails +CREATE TABLE badcompresstbl (a text); +ALTER TABLE badcompresstbl ALTER a SET COMPRESSION I_Do_Not_Exist_Compression; -- fails +DROP TABLE badcompresstbl; + +\set HIDE_TOAST_COMPRESSION true diff --git a/src/test/singlenode_regress/sql/conversion.sql b/src/test/singlenode_regress/sql/conversion.sql new file mode 100644 index 00000000000..83586824321 --- /dev/null +++ b/src/test/singlenode_regress/sql/conversion.sql @@ -0,0 +1,221 @@ +-- +-- create user defined conversion +-- +CREATE USER regress_conversion_user WITH NOCREATEDB NOCREATEROLE; +SET SESSION AUTHORIZATION regress_conversion_user; +CREATE CONVERSION myconv FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +-- +-- cannot make same name conversion in same schema +-- +CREATE CONVERSION myconv FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +-- +-- create default conversion with qualified name +-- +CREATE DEFAULT CONVERSION public.mydef FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +-- +-- cannot make default conversion with same schema/for_encoding/to_encoding +-- +CREATE DEFAULT CONVERSION public.mydef2 FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +-- test comments +COMMENT ON CONVERSION myconv_bad IS 'foo'; +COMMENT ON CONVERSION myconv IS 'bar'; +COMMENT ON CONVERSION myconv IS NULL; +-- +-- drop user defined conversion +-- +DROP CONVERSION myconv; +DROP CONVERSION mydef; +-- +-- Note: the built-in conversions are exercised in opr_sanity.sql, +-- so there's no need to do that here. +-- +-- +-- return to the super user +-- +RESET SESSION AUTHORIZATION; +DROP USER regress_conversion_user; + +-- +-- Test built-in conversion functions. +-- + +-- Helper function to test a conversion. Uses the test_enc_conversion function +-- that was created in the create_function_0 test. +create or replace function test_conv( + input IN bytea, + src_encoding IN text, + dst_encoding IN text, + + result OUT bytea, + errorat OUT bytea, + error OUT text) +language plpgsql as +$$ +declare + validlen int; +begin + -- First try to perform the conversion with noError = false. If that errors out, + -- capture the error message, and try again with noError = true. The second call + -- should succeed and return the position of the error, return that too. + begin + select * into validlen, result from test_enc_conversion(input, src_encoding, dst_encoding, false); + errorat = NULL; + error := NULL; + exception when others then + error := sqlerrm; + select * into validlen, result from test_enc_conversion(input, src_encoding, dst_encoding, true); + errorat = substr(input, validlen + 1); + end; + return; +end; +$$; + + +-- +-- UTF-8 +-- +CREATE TABLE utf8_inputs (inbytes bytea, description text); +insert into utf8_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\xc3a4c3b6', 'valid, extra latin chars'), + ('\xd184d0bed0be', 'valid, cyrillic'), + ('\x666f6fe8b1a1', 'valid, kanji/Chinese'), + ('\xe382abe3829a', 'valid, two chars that combine to one in EUC_JIS_2004'), + ('\xe382ab', 'only first half of combined char in EUC_JIS_2004'), + ('\xe382abe382', 'incomplete combination when converted EUC_JIS_2004'), + ('\xecbd94eb81bceba6ac', 'valid, Hangul, Korean'), + ('\x666f6fefa8aa', 'valid, needs mapping function to convert to GB18030'), + ('\x66e8b1ff6f6f', 'invalid byte sequence'), + ('\x66006f', 'invalid, NUL byte'), + ('\x666f6fe8b100', 'invalid, NUL byte'), + ('\x666f6fe8b1', 'incomplete character at end'); + +-- Test UTF-8 verification +select description, (test_conv(inbytes, 'utf8', 'utf8')).* from utf8_inputs; +-- Test conversions from UTF-8 +select description, inbytes, (test_conv(inbytes, 'utf8', 'euc_jis_2004')).* from utf8_inputs; +select description, inbytes, (test_conv(inbytes, 'utf8', 'latin1')).* from utf8_inputs; +select description, inbytes, (test_conv(inbytes, 'utf8', 'latin2')).* from utf8_inputs; +select description, inbytes, (test_conv(inbytes, 'utf8', 'latin5')).* from utf8_inputs; +select description, inbytes, (test_conv(inbytes, 'utf8', 'koi8r')).* from utf8_inputs; +select description, inbytes, (test_conv(inbytes, 'utf8', 'gb18030')).* from utf8_inputs; + +-- +-- EUC_JIS_2004 +-- +CREATE TABLE euc_jis_2004_inputs (inbytes bytea, description text); +insert into euc_jis_2004_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x666f6fbedd', 'valid'), + ('\xa5f7', 'valid, translates to two UTF-8 chars '), + ('\xbeddbe', 'incomplete char '), + ('\x666f6f00bedd', 'invalid, NUL byte'), + ('\x666f6fbe00dd', 'invalid, NUL byte'), + ('\x666f6fbedd00', 'invalid, NUL byte'), + ('\xbe04', 'invalid byte sequence'); + +-- Test EUC_JIS_2004 verification +select description, inbytes, (test_conv(inbytes, 'euc_jis_2004', 'euc_jis_2004')).* from euc_jis_2004_inputs; +-- Test conversions from EUC_JIS_2004 +select description, inbytes, (test_conv(inbytes, 'euc_jis_2004', 'utf8')).* from euc_jis_2004_inputs; + +-- +-- SHIFT-JIS-2004 +-- +CREATE TABLE shiftjis2004_inputs (inbytes bytea, description text); +insert into shiftjis2004_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x666f6f8fdb', 'valid'), + ('\x666f6f81c0', 'valid, no translation to UTF-8'), + ('\x666f6f82f5', 'valid, translates to two UTF-8 chars '), + ('\x666f6f8fdb8f', 'incomplete char '), + ('\x666f6f820a', 'incomplete char, followed by newline '), + ('\x666f6f008fdb', 'invalid, NUL byte'), + ('\x666f6f8f00db', 'invalid, NUL byte'), + ('\x666f6f8fdb00', 'invalid, NUL byte'); + +-- Test SHIFT-JIS-2004 verification +select description, inbytes, (test_conv(inbytes, 'shiftjis2004', 'shiftjis2004')).* from shiftjis2004_inputs; +-- Test conversions from SHIFT-JIS-2004 +select description, inbytes, (test_conv(inbytes, 'shiftjis2004', 'utf8')).* from shiftjis2004_inputs; +select description, inbytes, (test_conv(inbytes, 'shiftjis2004', 'euc_jis_2004')).* from shiftjis2004_inputs; + +-- +-- GB18030 +-- +CREATE TABLE gb18030_inputs (inbytes bytea, description text); +insert into gb18030_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x666f6fcff3', 'valid'), + ('\x666f6f8431a530', 'valid, no translation to UTF-8'), + ('\x666f6f84309c38', 'valid, translates to UTF-8 by mapping function'), + ('\x666f6f84309c', 'incomplete char '), + ('\x666f6f84309c0a', 'incomplete char, followed by newline '), + ('\x666f6f84309c3800', 'invalid, NUL byte'), + ('\x666f6f84309c0038', 'invalid, NUL byte'); + +-- Test GB18030 verification +select description, inbytes, (test_conv(inbytes, 'gb18030', 'gb18030')).* from gb18030_inputs; +-- Test conversions from GB18030 +select description, inbytes, (test_conv(inbytes, 'gb18030', 'utf8')).* from gb18030_inputs; + + +-- +-- ISO-8859-5 +-- +CREATE TABLE iso8859_5_inputs (inbytes bytea, description text); +insert into iso8859_5_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\xe4dede', 'valid'), + ('\x00', 'invalid, NUL byte'), + ('\xe400dede', 'invalid, NUL byte'), + ('\xe4dede00', 'invalid, NUL byte'); + +-- Test ISO-8859-5 verification +select description, inbytes, (test_conv(inbytes, 'iso8859-5', 'iso8859-5')).* from iso8859_5_inputs; +-- Test conversions from ISO-8859-5 +select description, inbytes, (test_conv(inbytes, 'iso8859-5', 'utf8')).* from iso8859_5_inputs; +select description, inbytes, (test_conv(inbytes, 'iso8859-5', 'koi8r')).* from iso8859_5_inputs; +select description, inbytes, (test_conv(inbytes, 'iso8859_5', 'mule_internal')).* from iso8859_5_inputs; + +-- +-- Big5 +-- +CREATE TABLE big5_inputs (inbytes bytea, description text); +insert into big5_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x666f6fb648', 'valid'), + ('\x666f6fa27f', 'valid, no translation to UTF-8'), + ('\x666f6fb60048', 'invalid, NUL byte'), + ('\x666f6fb64800', 'invalid, NUL byte'); + +-- Test Big5 verification +select description, inbytes, (test_conv(inbytes, 'big5', 'big5')).* from big5_inputs; +-- Test conversions from Big5 +select description, inbytes, (test_conv(inbytes, 'big5', 'utf8')).* from big5_inputs; +select description, inbytes, (test_conv(inbytes, 'big5', 'mule_internal')).* from big5_inputs; + +-- +-- MULE_INTERNAL +-- +CREATE TABLE mic_inputs (inbytes bytea, description text); +insert into mic_inputs values + ('\x666f6f', 'valid, pure ASCII'), + ('\x8bc68bcf8bcf', 'valid (in KOI8R)'), + ('\x8bc68bcf8b', 'invalid,incomplete char'), + ('\x92bedd', 'valid (in SHIFT_JIS)'), + ('\x92be', 'invalid, incomplete char)'), + ('\x666f6f95a3c1', 'valid (in Big5)'), + ('\x666f6f95a3', 'invalid, incomplete char'), + ('\x9200bedd', 'invalid, NUL byte'), + ('\x92bedd00', 'invalid, NUL byte'), + ('\x8b00c68bcf8bcf', 'invalid, NUL byte'); + +-- Test MULE_INTERNAL verification +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'mule_internal')).* from mic_inputs; +-- Test conversions from MULE_INTERNAL +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'koi8r')).* from mic_inputs; +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'iso8859-5')).* from mic_inputs; +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'sjis')).* from mic_inputs; +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'big5')).* from mic_inputs; +select description, inbytes, (test_conv(inbytes, 'mule_internal', 'euc_jp')).* from mic_inputs; diff --git a/src/test/singlenode_regress/sql/copy2.sql b/src/test/singlenode_regress/sql/copy2.sql new file mode 100644 index 00000000000..d872ccb7ddb --- /dev/null +++ b/src/test/singlenode_regress/sql/copy2.sql @@ -0,0 +1,485 @@ +CREATE TEMP TABLE x ( + a serial, + b int, + c text not null default 'stuff', + d text, + e text +); + +CREATE FUNCTION fn_x_before () RETURNS TRIGGER AS ' + BEGIN + NEW.e := ''before trigger fired''::text; + return NEW; + END; +' LANGUAGE plpgsql; + +CREATE FUNCTION fn_x_after () RETURNS TRIGGER AS ' + BEGIN + UPDATE x set e=''after trigger fired'' where c=''stuff''; + return NULL; + END; +' LANGUAGE plpgsql; + +CREATE TRIGGER trg_x_after AFTER INSERT ON x +FOR EACH ROW EXECUTE PROCEDURE fn_x_after(); + +CREATE TRIGGER trg_x_before BEFORE INSERT ON x +FOR EACH ROW EXECUTE PROCEDURE fn_x_before(); + +COPY x (a, b, c, d, e) from stdin; +9999 \N \\N \NN \N +10000 21 31 41 51 +\. + +COPY x (b, d) from stdin; +1 test_1 +\. + +COPY x (b, d) from stdin; +2 test_2 +3 test_3 +4 test_4 +5 test_5 +\. + +COPY x (a, b, c, d, e) from stdin; +10001 22 32 42 52 +10002 23 33 43 53 +10003 24 34 44 54 +10004 25 35 45 55 +10005 26 36 46 56 +\. + +-- non-existent column in column list: should fail +COPY x (xyz) from stdin; + +-- redundant options +COPY x from stdin (format CSV, FORMAT CSV); +COPY x from stdin (freeze off, freeze on); +COPY x from stdin (delimiter ',', delimiter ','); +COPY x from stdin (null ' ', null ' '); +COPY x from stdin (header off, header on); +COPY x from stdin (quote ':', quote ':'); +COPY x from stdin (escape ':', escape ':'); +COPY x from stdin (force_quote (a), force_quote *); +COPY x from stdin (force_not_null (a), force_not_null (b)); +COPY x from stdin (force_null (a), force_null (b)); +COPY x from stdin (convert_selectively (a), convert_selectively (b)); +COPY x from stdin (encoding 'sql_ascii', encoding 'sql_ascii'); + +-- too many columns in column list: should fail +COPY x (a, b, c, d, e, d, c) from stdin; + +-- missing data: should fail +COPY x from stdin; + +\. +COPY x from stdin; +2000 230 23 23 +\. +COPY x from stdin; +2001 231 \N \N +\. + +-- extra data: should fail +COPY x from stdin; +2002 232 40 50 60 70 80 +\. + +-- various COPY options: delimiters, oids, NULL string, encoding +COPY x (b, c, d, e) from stdin delimiter ',' null 'x'; +x,45,80,90 +x,\x,\\x,\\\x +x,\,,\\\,,\\ +\. + +COPY x from stdin WITH DELIMITER AS ';' NULL AS ''; +3000;;c;; +\. + +COPY x from stdin WITH DELIMITER AS ':' NULL AS E'\\X' ENCODING 'sql_ascii'; +4000:\X:C:\X:\X +4001:1:empty:: +4002:2:null:\X:\X +4003:3:Backslash:\\:\\ +4004:4:BackslashX:\\X:\\X +4005:5:N:\N:\N +4006:6:BackslashN:\\N:\\N +4007:7:XX:\XX:\XX +4008:8:Delimiter:\::\: +\. + +COPY x TO stdout WHERE a = 1; +COPY x from stdin WHERE a = 50004; +50003 24 34 44 54 +50004 25 35 45 55 +50005 26 36 46 56 +\. + +COPY x from stdin WHERE a > 60003; +60001 22 32 42 52 +60002 23 33 43 53 +60003 24 34 44 54 +60004 25 35 45 55 +60005 26 36 46 56 +\. + +COPY x from stdin WHERE f > 60003; + +COPY x from stdin WHERE a = max(x.b); + +COPY x from stdin WHERE a IN (SELECT 1 FROM x); + +COPY x from stdin WHERE a IN (generate_series(1,5)); + +COPY x from stdin WHERE a = row_number() over(b); + + +-- check results of copy in +SELECT * FROM x; + +-- check copy out +COPY x TO stdout; +COPY x (c, e) TO stdout; +COPY x (b, e) TO stdout WITH NULL 'I''m null'; + +CREATE TEMP TABLE y ( + col1 text, + col2 text +); + +INSERT INTO y VALUES ('Jackson, Sam', E'\\h'); +INSERT INTO y VALUES ('It is "perfect".',E'\t'); +INSERT INTO y VALUES ('', NULL); + +COPY y TO stdout WITH CSV; +COPY y TO stdout WITH CSV QUOTE '''' DELIMITER '|'; +COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\' ENCODING 'sql_ascii'; +COPY y TO stdout WITH CSV FORCE QUOTE *; + +-- Repeat above tests with new 9.0 option syntax + +COPY y TO stdout (FORMAT CSV); +COPY y TO stdout (FORMAT CSV, QUOTE '''', DELIMITER '|'); +COPY y TO stdout (FORMAT CSV, FORCE_QUOTE (col2), ESCAPE E'\\'); +COPY y TO stdout (FORMAT CSV, FORCE_QUOTE *); + +\copy y TO stdout (FORMAT CSV) +\copy y TO stdout (FORMAT CSV, QUOTE '''', DELIMITER '|') +\copy y TO stdout (FORMAT CSV, FORCE_QUOTE (col2), ESCAPE E'\\') +\copy y TO stdout (FORMAT CSV, FORCE_QUOTE *) + +--test that we read consecutive LFs properly + +CREATE TEMP TABLE testnl (a int, b text, c int); + +COPY testnl FROM stdin CSV; +1,"a field with two LFs + +inside",2 +\. + +-- test end of copy marker +CREATE TEMP TABLE testeoc (a text); + +COPY testeoc FROM stdin CSV; +a\. +\.b +c\.d +"\." +\. + +COPY testeoc TO stdout CSV; + +-- test handling of nonstandard null marker that violates escaping rules + +CREATE TEMP TABLE testnull(a int, b text); +INSERT INTO testnull VALUES (1, E'\\0'), (NULL, NULL); + +COPY testnull TO stdout WITH NULL AS E'\\0'; + +COPY testnull FROM stdin WITH NULL AS E'\\0'; +42 \\0 +\0 \0 +\. + +SELECT * FROM testnull; + +BEGIN; +CREATE TABLE vistest (LIKE testeoc); +COPY vistest FROM stdin CSV; +a0 +b +\. +COMMIT; +SELECT * FROM vistest; +BEGIN; +TRUNCATE vistest; +COPY vistest FROM stdin CSV; +a1 +b +\. +SELECT * FROM vistest; +SAVEPOINT s1; +TRUNCATE vistest; +COPY vistest FROM stdin CSV; +d1 +e +\. +SELECT * FROM vistest; +COMMIT; +SELECT * FROM vistest; + +BEGIN; +TRUNCATE vistest; +COPY vistest FROM stdin CSV FREEZE; +a2 +b +\. +SELECT * FROM vistest; +SAVEPOINT s1; +TRUNCATE vistest; +COPY vistest FROM stdin CSV FREEZE; +d2 +e +\. +SELECT * FROM vistest; +COMMIT; +SELECT * FROM vistest; + +BEGIN; +TRUNCATE vistest; +COPY vistest FROM stdin CSV FREEZE; +x +y +\. +SELECT * FROM vistest; +COMMIT; +TRUNCATE vistest; +COPY vistest FROM stdin CSV FREEZE; +p +g +\. +BEGIN; +TRUNCATE vistest; +SAVEPOINT s1; +COPY vistest FROM stdin CSV FREEZE; +m +k +\. +COMMIT; +BEGIN; +INSERT INTO vistest VALUES ('z'); +SAVEPOINT s1; +TRUNCATE vistest; +ROLLBACK TO SAVEPOINT s1; +COPY vistest FROM stdin CSV FREEZE; +d3 +e +\. +COMMIT; +CREATE FUNCTION truncate_in_subxact() RETURNS VOID AS +$$ +BEGIN + TRUNCATE vistest; +EXCEPTION + WHEN OTHERS THEN + INSERT INTO vistest VALUES ('subxact failure'); +END; +$$ language plpgsql; +BEGIN; +INSERT INTO vistest VALUES ('z'); +SELECT truncate_in_subxact(); +COPY vistest FROM stdin CSV FREEZE; +d4 +e +\. +SELECT * FROM vistest; +COMMIT; +SELECT * FROM vistest; +-- Test FORCE_NOT_NULL and FORCE_NULL options +CREATE TEMP TABLE forcetest ( + a INT NOT NULL, + b TEXT NOT NULL, + c TEXT, + d TEXT, + e TEXT +); +\pset null NULL +-- should succeed with no effect ("b" remains an empty string, "c" remains NULL) +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b), FORCE_NULL(c)); +1,,"" +\. +COMMIT; +SELECT b, c FROM forcetest WHERE a = 1; +-- should succeed, FORCE_NULL and FORCE_NOT_NULL can be both specified +BEGIN; +COPY forcetest (a, b, c, d) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(c,d), FORCE_NULL(c,d)); +2,'a',,"" +\. +COMMIT; +SELECT c, d FROM forcetest WHERE a = 2; +-- should fail with not-null constraint violation +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b), FORCE_NOT_NULL(c)); +3,,"" +\. +ROLLBACK; +-- should fail with "not referenced by COPY" error +BEGIN; +COPY forcetest (d, e) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b)); +ROLLBACK; +-- should fail with "not referenced by COPY" error +BEGIN; +COPY forcetest (d, e) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b)); +ROLLBACK; +\pset null '' + +-- test case with whole-row Var in a check constraint +create table check_con_tbl (f1 int); +create function check_con_function(check_con_tbl) returns bool as $$ +begin + raise notice 'input = %', row_to_json($1); + return $1.f1 > 0; +end $$ language plpgsql immutable; +alter table check_con_tbl add check (check_con_function(check_con_tbl.*)); +\d+ check_con_tbl +-- GPDB: Change from 1 (value in PG) to 2 for copy to make test deterministic. +-- 2 and null are on seg0 in a 3-seg test environment. +copy check_con_tbl from stdin; +2 +\N +\. +copy check_con_tbl from stdin; +0 +\. +select * from check_con_tbl; + +-- test with RLS enabled. +CREATE ROLE regress_rls_copy_user; +CREATE ROLE regress_rls_copy_user_colperms; +CREATE TABLE rls_t1 (a int, b int, c int); + +-- GPDB: Change from 1 (value in PG) to 3 for copy to make test deterministic. +-- 2, 3 and 4 are on seg0 in a 3-seg test environment. +COPY rls_t1 (a, b, c) from stdin; +3 4 1 +2 3 2 +3 2 3 +4 1 4 +\. + +CREATE POLICY p1 ON rls_t1 FOR SELECT USING (a % 2 = 0); +ALTER TABLE rls_t1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_t1 FORCE ROW LEVEL SECURITY; + +GRANT SELECT ON TABLE rls_t1 TO regress_rls_copy_user; +GRANT SELECT (a, b) ON TABLE rls_t1 TO regress_rls_copy_user_colperms; + +-- all columns +COPY rls_t1 TO stdout; +COPY rls_t1 (a, b, c) TO stdout; + +-- subset of columns +COPY rls_t1 (a) TO stdout; +COPY rls_t1 (a, b) TO stdout; + +-- column reordering +COPY rls_t1 (b, a) TO stdout; + +SET SESSION AUTHORIZATION regress_rls_copy_user; + +-- all columns +COPY rls_t1 TO stdout; +COPY rls_t1 (a, b, c) TO stdout; + +-- subset of columns +COPY rls_t1 (a) TO stdout; +COPY rls_t1 (a, b) TO stdout; + +-- column reordering +COPY rls_t1 (b, a) TO stdout; + +RESET SESSION AUTHORIZATION; + +SET SESSION AUTHORIZATION regress_rls_copy_user_colperms; + +-- attempt all columns (should fail) +COPY rls_t1 TO stdout; +COPY rls_t1 (a, b, c) TO stdout; + +-- try to copy column with no privileges (should fail) +COPY rls_t1 (c) TO stdout; + +-- subset of columns (should succeed) +COPY rls_t1 (a) TO stdout; +COPY rls_t1 (a, b) TO stdout; + +RESET SESSION AUTHORIZATION; + +-- test with INSTEAD OF INSERT trigger on a view +-- INSTEAD OF triggers are not supported in Cloudberry +/* + * CREATE TABLE instead_of_insert_tbl(id serial, name text); + * CREATE VIEW instead_of_insert_tbl_view AS SELECT ''::text AS str; + * + * COPY instead_of_insert_tbl_view FROM stdin; -- fail + * test1 + * \. + * + * CREATE FUNCTION fun_instead_of_insert_tbl() RETURNS trigger AS $$ + * BEGIN + * INSERT INTO instead_of_insert_tbl (name) VALUES (NEW.str); + * RETURN NULL; + * END; + * $$ LANGUAGE plpgsql; + * CREATE TRIGGER trig_instead_of_insert_tbl_view + * INSTEAD OF INSERT ON instead_of_insert_tbl_view + * FOR EACH ROW EXECUTE PROCEDURE fun_instead_of_insert_tbl(); + * + * COPY instead_of_insert_tbl_view FROM stdin; + * test1 + * \. + * + * SELECT * FROM instead_of_insert_tbl; + */ + +-- Test of COPY optimization with view using INSTEAD OF INSERT +-- trigger when relation is created in the same transaction as +-- when COPY is executed. +-- INSTEAD OF triggers are not supported in Cloudberry +/* + * BEGIN; + * CREATE VIEW instead_of_insert_tbl_view_2 as select ''::text as str; + * CREATE TRIGGER trig_instead_of_insert_tbl_view_2 + * INSTEAD OF INSERT ON instead_of_insert_tbl_view_2 + * FOR EACH ROW EXECUTE PROCEDURE fun_instead_of_insert_tbl(); + * + * COPY instead_of_insert_tbl_view_2 FROM stdin; + * test1 + * \. + * + * SELECT * FROM instead_of_insert_tbl; + * COMMIT; + */ + +-- clean up +DROP TABLE forcetest; +DROP TABLE vistest; +DROP FUNCTION truncate_in_subxact(); +DROP TABLE x, y; +DROP TABLE rls_t1 CASCADE; +DROP ROLE regress_rls_copy_user; +DROP ROLE regress_rls_copy_user_colperms; +DROP FUNCTION fn_x_before(); +DROP FUNCTION fn_x_after(); + +-- When error reject limit is set, copy should be able to continue after hit a corrupted end-of-copy marker +CREATE TABLE copy_eoc_marker(a int, b int); +COPY copy_eoc_marker FROM stdin LOG ERRORS SEGMENT REJECT LIMIT 5; +123\. 10 +123 20 +\. +SELECT * FROM copy_eoc_marker; +DROP TABLE copy_eoc_marker; diff --git a/src/test/singlenode_regress/sql/copydml.sql b/src/test/singlenode_regress/sql/copydml.sql new file mode 100644 index 00000000000..4578342253b --- /dev/null +++ b/src/test/singlenode_regress/sql/copydml.sql @@ -0,0 +1,91 @@ +-- +-- Test cases for COPY (INSERT/UPDATE/DELETE) TO +-- +create table copydml_test (id serial, t text); +insert into copydml_test (t) values ('a'); +insert into copydml_test (t) values ('b'); +insert into copydml_test (t) values ('c'); +insert into copydml_test (t) values ('d'); +insert into copydml_test (t) values ('e'); + +-- +-- Test COPY (insert/update/delete ...) +-- +copy (insert into copydml_test (t) values ('f') returning id) to stdout; +copy (update copydml_test set t = 'g' where t = 'f' returning id) to stdout; +copy (delete from copydml_test where t = 'g' returning id) to stdout; + +-- +-- Test \copy (insert/update/delete ...) +-- +\copy (insert into copydml_test (t) values ('f') returning id) to stdout; +\copy (update copydml_test set t = 'g' where t = 'f' returning id) to stdout; +\copy (delete from copydml_test where t = 'g' returning id) to stdout; + +-- Error cases +copy (insert into copydml_test default values) to stdout; +copy (update copydml_test set t = 'g') to stdout; +copy (delete from copydml_test) to stdout; + +create rule qqq as on insert to copydml_test do instead nothing; +copy (insert into copydml_test default values) to stdout; +drop rule qqq on copydml_test; +create rule qqq as on insert to copydml_test do also delete from copydml_test; +copy (insert into copydml_test default values) to stdout; +drop rule qqq on copydml_test; +create rule qqq as on insert to copydml_test do instead (delete from copydml_test; delete from copydml_test); +copy (insert into copydml_test default values) to stdout; +drop rule qqq on copydml_test; +create rule qqq as on insert to copydml_test where new.t <> 'f' do instead delete from copydml_test; +copy (insert into copydml_test default values) to stdout; +drop rule qqq on copydml_test; + +create rule qqq as on update to copydml_test do instead nothing; +copy (update copydml_test set t = 'f') to stdout; +drop rule qqq on copydml_test; +create rule qqq as on update to copydml_test do also delete from copydml_test; +copy (update copydml_test set t = 'f') to stdout; +drop rule qqq on copydml_test; +create rule qqq as on update to copydml_test do instead (delete from copydml_test; delete from copydml_test); +copy (update copydml_test set t = 'f') to stdout; +drop rule qqq on copydml_test; +create rule qqq as on update to copydml_test where new.t <> 'f' do instead delete from copydml_test; +copy (update copydml_test set t = 'f') to stdout; +drop rule qqq on copydml_test; + +create rule qqq as on delete to copydml_test do instead nothing; +copy (delete from copydml_test) to stdout; +drop rule qqq on copydml_test; +create rule qqq as on delete to copydml_test do also insert into copydml_test default values; +copy (delete from copydml_test) to stdout; +drop rule qqq on copydml_test; +create rule qqq as on delete to copydml_test do instead (insert into copydml_test default values; insert into copydml_test default values); +copy (delete from copydml_test) to stdout; +drop rule qqq on copydml_test; +create rule qqq as on delete to copydml_test where old.t <> 'f' do instead insert into copydml_test default values; +copy (delete from copydml_test) to stdout; +drop rule qqq on copydml_test; + +-- triggers +create function qqq_trig() returns trigger as $$ +begin +if tg_op in ('INSERT', 'UPDATE') then + raise notice '% % %', tg_when, tg_op, new.id; + return new; +else + raise notice '% % %', tg_when, tg_op, old.id; + return old; +end if; +end +$$ language plpgsql; +create trigger qqqbef before insert or update or delete on copydml_test + for each row execute procedure qqq_trig(); +create trigger qqqaf after insert or update or delete on copydml_test + for each row execute procedure qqq_trig(); + +copy (insert into copydml_test (t) values ('f') returning id) to stdout; +copy (update copydml_test set t = 'g' where t = 'f' returning id) to stdout; +copy (delete from copydml_test where t = 'g' returning id) to stdout; + +drop table copydml_test; +drop function qqq_trig(); diff --git a/src/test/singlenode_regress/sql/copyselect.sql b/src/test/singlenode_regress/sql/copyselect.sql new file mode 100644 index 00000000000..1d98dad3c8c --- /dev/null +++ b/src/test/singlenode_regress/sql/copyselect.sql @@ -0,0 +1,96 @@ +-- +-- Test cases for COPY (select) TO +-- +create table test1 (id serial, t text); +insert into test1 (t) values ('a'); +insert into test1 (t) values ('b'); +insert into test1 (t) values ('c'); +insert into test1 (t) values ('d'); +insert into test1 (t) values ('e'); + +create table test2 (id serial, t text); +insert into test2 (t) values ('A'); +insert into test2 (t) values ('B'); +insert into test2 (t) values ('C'); +insert into test2 (t) values ('D'); +insert into test2 (t) values ('E'); + +create view v_test1 +as select 'v_'||t from test1; + +-- +-- Test COPY table TO +-- +copy test1 to stdout; +-- +-- This should fail +-- +copy v_test1 to stdout; +-- +-- Test COPY (select) TO +-- +copy (select t from test1 where id=1) to stdout; +-- +-- Test COPY (select for update) TO +-- +copy (select t from test1 where id=3 for update) to stdout; +-- +-- This should fail +-- +copy (select t into temp test3 from test1 where id=3) to stdout; +-- +-- This should fail +-- +copy (select * from test1) from stdin; +-- +-- This should fail +-- +copy (select * from test1) (t,id) to stdout; +-- +-- Test JOIN +-- +copy (select * from test1 join test2 using (id)) to stdout; +-- +-- Test UNION SELECT +-- +copy (select t from test1 where id = 1 UNION select * from v_test1 ORDER BY 1) to stdout; +-- +-- Test subselect +-- +copy (select * from (select t from test1 where id = 1 UNION select * from v_test1 ORDER BY 1) t1) to stdout; +-- +-- Test headers, CSV and quotes +-- +copy (select t from test1 where id = 1) to stdout csv header force quote t; +-- +-- Test psql builtins, plain table +-- +\copy test1 to stdout +-- +-- This should fail +-- +\copy v_test1 to stdout +-- +-- Test \copy (select ...) +-- +\copy (select "id",'id','id""'||t,(id + 1)*id,t,"test1"."t" from test1 where id=3) to stdout +-- +-- Drop everything +-- +drop table test2; +drop view v_test1; +drop table test1; + +-- psql handling of COPY in multi-command strings +copy (select 1) to stdout\; select 1/0; -- row, then error +select 1/0\; copy (select 1) to stdout; -- error only +copy (select 1) to stdout\; copy (select 2) to stdout\; select 0\; select 3; -- 1 2 3 + +create table test3 (c int); +select 0\; copy test3 from stdin\; copy test3 from stdin\; select 1; -- 1 +1 +\. +2 +\. +select * from test3; +drop table test3; diff --git a/src/test/singlenode_regress/sql/create_aggregate.sql b/src/test/singlenode_regress/sql/create_aggregate.sql new file mode 100644 index 00000000000..d4b4036fd7d --- /dev/null +++ b/src/test/singlenode_regress/sql/create_aggregate.sql @@ -0,0 +1,330 @@ +-- +-- CREATE_AGGREGATE +-- + +-- all functions CREATEd +CREATE AGGREGATE newavg ( + sfunc = int4_avg_accum, basetype = int4, stype = _int8, + finalfunc = int8_avg, + initcond1 = '{0,0}' +); + +-- test comments +COMMENT ON AGGREGATE newavg_wrong (int4) IS 'an agg comment'; +COMMENT ON AGGREGATE newavg (int4) IS 'an agg comment'; +COMMENT ON AGGREGATE newavg (int4) IS NULL; + +-- without finalfunc; test obsolete spellings 'sfunc1' etc +CREATE AGGREGATE newsum ( + sfunc1 = int4pl, basetype = int4, stype1 = int4, + initcond1 = '0' +); + +-- zero-argument aggregate +CREATE AGGREGATE newcnt (*) ( + sfunc = int8inc, stype = int8, + initcond = '0', parallel = safe +); + +-- old-style spelling of same (except without parallel-safe; that's too new) +CREATE AGGREGATE oldcnt ( + sfunc = int8inc, basetype = 'ANY', stype = int8, + initcond = '0' +); + +-- aggregate that only cares about null/nonnull input +CREATE AGGREGATE newcnt ("any") ( + sfunc = int8inc_any, stype = int8, + initcond = '0' +); + +COMMENT ON AGGREGATE nosuchagg (*) IS 'should fail'; +COMMENT ON AGGREGATE newcnt (*) IS 'an agg(*) comment'; +COMMENT ON AGGREGATE newcnt ("any") IS 'an agg(any) comment'; + +-- multi-argument aggregate +create function sum3(int8,int8,int8) returns int8 as +'select $1 + $2 + $3' language sql strict immutable; + +create aggregate sum2(int8,int8) ( + sfunc = sum3, stype = int8, + initcond = '0' +); + +-- multi-argument aggregates sensitive to distinct/order, strict/nonstrict +create type aggtype as (a integer, b integer, c text); + +create function aggf_trans(aggtype[],integer,integer,text) returns aggtype[] +as 'select array_append($1,ROW($2,$3,$4)::aggtype)' +language sql strict immutable; + +create function aggfns_trans(aggtype[],integer,integer,text) returns aggtype[] +as 'select array_append($1,ROW($2,$3,$4)::aggtype)' +language sql immutable; + +create aggregate aggfstr(integer,integer,text) ( + sfunc = aggf_trans, stype = aggtype[], + initcond = '{}' +); + +create aggregate aggfns(integer,integer,text) ( + sfunc = aggfns_trans, stype = aggtype[], sspace = 10000, + initcond = '{}' +); + +-- check error cases that would require run-time type coercion +create function least_accum(int8, int8) returns int8 language sql as + 'select least($1, $2)'; + +create aggregate least_agg(int4) ( + stype = int8, sfunc = least_accum +); -- fails + +drop function least_accum(int8, int8); + +create function least_accum(anycompatible, anycompatible) +returns anycompatible language sql as + 'select least($1, $2)'; + +create aggregate least_agg(int4) ( + stype = int8, sfunc = least_accum +); -- fails + +create aggregate least_agg(int8) ( + stype = int8, sfunc = least_accum +); + +drop function least_accum(anycompatible, anycompatible) cascade; + +-- variadic aggregates +create function least_accum(anyelement, variadic anyarray) +returns anyelement language sql as + 'select least($1, min($2[i])) from generate_subscripts($2,1) g(i)'; + +create aggregate least_agg(variadic items anyarray) ( + stype = anyelement, sfunc = least_accum +); + +create function cleast_accum(anycompatible, variadic anycompatiblearray) +returns anycompatible language sql as + 'select least($1, min($2[i])) from generate_subscripts($2,1) g(i)'; + +create aggregate cleast_agg(variadic items anycompatiblearray) ( + stype = anycompatible, sfunc = cleast_accum +); + +-- test ordered-set aggs using built-in support functions +create aggregate my_percentile_disc(float8 ORDER BY anyelement) ( + stype = internal, + sfunc = ordered_set_transition, + finalfunc = percentile_disc_final, + finalfunc_extra = true, + finalfunc_modify = read_write +); + +create aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") ( + stype = internal, + sfunc = ordered_set_transition_multi, + finalfunc = rank_final, + finalfunc_extra = true, + hypothetical +); + +alter aggregate my_percentile_disc(float8 ORDER BY anyelement) + rename to test_percentile_disc; +alter aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") + rename to test_rank; + +\da test_* + +-- moving-aggregate options + +CREATE AGGREGATE sumdouble (float8) +( + stype = float8, + sfunc = float8pl, + mstype = float8, + msfunc = float8pl, + minvfunc = float8mi +); + +-- aggregate combine and serialization functions + +-- can't specify just one of serialfunc and deserialfunc +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + serialfunc = numeric_avg_serialize +); + +-- serialfunc must have correct parameters +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + serialfunc = numeric_avg_deserialize, + deserialfunc = numeric_avg_deserialize +); + +-- deserialfunc must have correct parameters +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + serialfunc = numeric_avg_serialize, + deserialfunc = numeric_avg_serialize +); + +-- ensure combine function parameters are checked +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + serialfunc = numeric_avg_serialize, + deserialfunc = numeric_avg_deserialize, + combinefunc = int4larger +); + +-- ensure create aggregate works. +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + finalfunc = numeric_avg, + serialfunc = numeric_avg_serialize, + deserialfunc = numeric_avg_deserialize, + combinefunc = numeric_avg_combine, + finalfunc_modify = shareable -- just to test a non-default setting +); + +-- Ensure all these functions made it into the catalog +SELECT aggfnoid, aggtransfn, aggcombinefn, aggtranstype::regtype, + aggserialfn, aggdeserialfn, aggfinalmodify +FROM pg_aggregate +WHERE aggfnoid = 'myavg'::REGPROC; + +DROP AGGREGATE myavg (numeric); + +-- create or replace aggregate +CREATE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + finalfunc = numeric_avg +); + +CREATE OR REPLACE AGGREGATE myavg (numeric) +( + stype = internal, + sfunc = numeric_avg_accum, + finalfunc = numeric_avg, + serialfunc = numeric_avg_serialize, + deserialfunc = numeric_avg_deserialize, + combinefunc = numeric_avg_combine, + finalfunc_modify = shareable -- just to test a non-default setting +); + +-- Ensure all these functions made it into the catalog again +SELECT aggfnoid, aggtransfn, aggcombinefn, aggtranstype::regtype, + aggserialfn, aggdeserialfn, aggfinalmodify +FROM pg_aggregate +WHERE aggfnoid = 'myavg'::REGPROC; + +-- can change stype: +CREATE OR REPLACE AGGREGATE myavg (numeric) +( + stype = numeric, + sfunc = numeric_add +); +SELECT aggfnoid, aggtransfn, aggcombinefn, aggtranstype::regtype, + aggserialfn, aggdeserialfn, aggfinalmodify +FROM pg_aggregate +WHERE aggfnoid = 'myavg'::REGPROC; + +-- can't change return type: +CREATE OR REPLACE AGGREGATE myavg (numeric) +( + stype = numeric, + sfunc = numeric_add, + finalfunc = numeric_out +); + +-- can't change to a different kind: +CREATE OR REPLACE AGGREGATE myavg (order by numeric) +( + stype = numeric, + sfunc = numeric_add +); + +-- can't change plain function to aggregate: +create function sum4(int8,int8,int8,int8) returns int8 as +'select $1 + $2 + $3 + $4' language sql strict immutable; + +CREATE OR REPLACE AGGREGATE sum3 (int8,int8,int8) +( + stype = int8, + sfunc = sum4 +); + +drop function sum4(int8,int8,int8,int8); + +DROP AGGREGATE myavg (numeric); + +-- invalid: bad parallel-safety marking +CREATE AGGREGATE mysum (int) +( + stype = int, + sfunc = int4pl, + parallel = pear +); + +-- invalid: nonstrict inverse with strict forward function + +CREATE FUNCTION float8mi_n(float8, float8) RETURNS float8 AS +$$ SELECT $1 - $2; $$ +LANGUAGE SQL; + +CREATE AGGREGATE invalidsumdouble (float8) +( + stype = float8, + sfunc = float8pl, + mstype = float8, + msfunc = float8pl, + minvfunc = float8mi_n +); + +-- invalid: non-matching result types + +CREATE FUNCTION float8mi_int(float8, float8) RETURNS int AS +$$ SELECT CAST($1 - $2 AS INT); $$ +LANGUAGE SQL; + +CREATE AGGREGATE wrongreturntype (float8) +( + stype = float8, + sfunc = float8pl, + mstype = float8, + msfunc = float8pl, + minvfunc = float8mi_int +); + +-- invalid: non-lowercase quoted identifiers + +CREATE AGGREGATE case_agg ( -- old syntax + "Sfunc1" = int4pl, + "Basetype" = int4, + "Stype1" = int4, + "Initcond1" = '0', + "Parallel" = safe +); + +CREATE AGGREGATE case_agg(float8) +( + "Stype" = internal, + "Sfunc" = ordered_set_transition, + "Finalfunc" = percentile_disc_final, + "Finalfunc_extra" = true, + "Finalfunc_modify" = read_write, + "Parallel" = safe +); diff --git a/src/test/singlenode_regress/sql/create_am.sql b/src/test/singlenode_regress/sql/create_am.sql new file mode 100644 index 00000000000..9a359466ce4 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_am.sql @@ -0,0 +1,214 @@ +-- +-- Create access method tests +-- + +-- Make gist2 over gisthandler. In fact, it would be a synonym to gist. +CREATE ACCESS METHOD gist2 TYPE INDEX HANDLER gisthandler; + +-- Verify return type checks for handlers +CREATE ACCESS METHOD bogus TYPE INDEX HANDLER int4in; +CREATE ACCESS METHOD bogus TYPE INDEX HANDLER heap_tableam_handler; + + +-- Try to create gist2 index on fast_emp4000: fail because opclass doesn't exist +CREATE INDEX grect2ind2 ON fast_emp4000 USING gist2 (home_base); + +-- Make operator class for boxes using gist2 +CREATE OPERATOR CLASS box_ops DEFAULT + FOR TYPE box USING gist2 AS + OPERATOR 1 <<, + OPERATOR 2 &<, + OPERATOR 3 &&, + OPERATOR 4 &>, + OPERATOR 5 >>, + OPERATOR 6 ~=, + OPERATOR 7 @>, + OPERATOR 8 <@, + OPERATOR 9 &<|, + OPERATOR 10 <<|, + OPERATOR 11 |>>, + OPERATOR 12 |&>, + FUNCTION 1 gist_box_consistent(internal, box, smallint, oid, internal), + FUNCTION 2 gist_box_union(internal, internal), + -- don't need compress, decompress, or fetch functions + FUNCTION 5 gist_box_penalty(internal, internal, internal), + FUNCTION 6 gist_box_picksplit(internal, internal), + FUNCTION 7 gist_box_same(box, box, internal); + +-- Create gist2 index on fast_emp4000 +CREATE INDEX grect2ind2 ON fast_emp4000 USING gist2 (home_base); + +-- Now check the results from plain indexscan; temporarily drop existing +-- index grect2ind to ensure it doesn't capture the plan +BEGIN; +DROP INDEX grect2ind; +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; + +EXPLAIN (COSTS OFF) +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; + +ROLLBACK; + +-- Try to drop access method: fail because of dependent objects +DROP ACCESS METHOD gist2; + +-- Drop access method cascade +-- To prevent a (rare) deadlock against autovacuum, +-- we must lock the table that owns the index that will be dropped +BEGIN; +LOCK TABLE fast_emp4000; +DROP ACCESS METHOD gist2 CASCADE; +COMMIT; + + +-- +-- Test table access methods +-- + +-- prevent empty values +SET default_table_access_method = ''; + +-- prevent nonexistent values +SET default_table_access_method = 'I do not exist AM'; + +-- prevent setting it to an index AM +SET default_table_access_method = 'btree'; + + +-- Create a heap2 table am handler with heapam handler +CREATE ACCESS METHOD heap2 TYPE TABLE HANDLER heap_tableam_handler; + +-- Verify return type checks for handlers +CREATE ACCESS METHOD bogus TYPE TABLE HANDLER int4in; +CREATE ACCESS METHOD bogus TYPE TABLE HANDLER bthandler; + +SELECT amname, amhandler, amtype FROM pg_am where amtype = 't' ORDER BY 1, 2; + + +-- First create tables employing the new AM using USING + +-- plain CREATE TABLE +CREATE TABLE tableam_tbl_heap2(f1 int) USING heap2; +INSERT INTO tableam_tbl_heap2 VALUES(1); +SELECT f1 FROM tableam_tbl_heap2 ORDER BY f1; + +-- CREATE TABLE AS +CREATE TABLE tableam_tblas_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; +SELECT f1 FROM tableam_tbl_heap2 ORDER BY f1; + +-- SELECT INTO doesn't support USING +SELECT INTO tableam_tblselectinto_heap2 USING heap2 FROM tableam_tbl_heap2; + +-- CREATE VIEW doesn't support USING +CREATE VIEW tableam_view_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; + +-- CREATE SEQUENCE doesn't support USING +CREATE SEQUENCE tableam_seq_heap2 USING heap2; + +-- CREATE MATERIALIZED VIEW does support USING +CREATE MATERIALIZED VIEW tableam_tblmv_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; +SELECT f1 FROM tableam_tblmv_heap2 ORDER BY f1; + +-- CREATE TABLE .. PARTITION BY doesn't not support USING +CREATE TABLE tableam_parted_heap2 (a text, b int) PARTITION BY list (a) USING heap2; + +CREATE TABLE tableam_parted_heap2 (a text, b int) PARTITION BY list (a); +-- new partitions will inherit from the current default, rather the partition root +SET default_table_access_method = 'heap'; +CREATE TABLE tableam_parted_a_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('a'); +SET default_table_access_method = 'heap2'; +CREATE TABLE tableam_parted_b_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('b'); +RESET default_table_access_method; +-- but the method can be explicitly specified +CREATE TABLE tableam_parted_c_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('c') USING heap; +CREATE TABLE tableam_parted_d_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('d') USING heap2; + +-- List all objects in AM +SELECT + pc.relkind, + pa.amname, + CASE WHEN relkind = 't' THEN + (SELECT 'toast for ' || relname::regclass FROM pg_class pcm WHERE pcm.reltoastrelid = pc.oid) + ELSE + relname::regclass::text + END COLLATE "C" AS relname +FROM pg_class AS pc, + pg_am AS pa +WHERE pa.oid = pc.relam + AND pa.amname = 'heap2' +ORDER BY 3, 1, 2; + +-- Show dependencies onto AM - there shouldn't be any for toast +SELECT pg_describe_object(classid,objid,objsubid) AS obj +FROM pg_depend, pg_am +WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_am.amname = 'heap2' +ORDER BY classid, objid, objsubid; + + +-- Second, create objects in the new AM by changing the default AM +BEGIN; +SET LOCAL default_table_access_method = 'heap2'; + +-- following tests should all respect the default AM +CREATE TABLE tableam_tbl_heapx(f1 int); +CREATE TABLE tableam_tblas_heapx AS SELECT * FROM tableam_tbl_heapx; +SELECT INTO tableam_tblselectinto_heapx FROM tableam_tbl_heapx; +CREATE MATERIALIZED VIEW tableam_tblmv_heapx USING heap2 AS SELECT * FROM tableam_tbl_heapx; +CREATE TABLE tableam_parted_heapx (a text, b int) PARTITION BY list (a); +CREATE TABLE tableam_parted_1_heapx PARTITION OF tableam_parted_heapx FOR VALUES IN ('a', 'b'); + +-- but an explicitly set AM overrides it +CREATE TABLE tableam_parted_2_heapx PARTITION OF tableam_parted_heapx FOR VALUES IN ('c', 'd') USING heap; + +-- sequences, views and foreign servers shouldn't have an AM +CREATE VIEW tableam_view_heapx AS SELECT * FROM tableam_tbl_heapx; +CREATE SEQUENCE tableam_seq_heapx; +CREATE FOREIGN DATA WRAPPER fdw_heap2 VALIDATOR postgresql_fdw_validator; +CREATE SERVER fs_heap2 FOREIGN DATA WRAPPER fdw_heap2 ; +CREATE FOREIGN table tableam_fdw_heapx () SERVER fs_heap2; + +-- Verify that new AM was used for tables, matviews, but not for sequences, views and fdws +SELECT + pc.relkind, + pa.amname, + CASE WHEN relkind = 't' THEN + (SELECT 'toast for ' || relname::regclass FROM pg_class pcm WHERE pcm.reltoastrelid = pc.oid) + ELSE + relname::regclass::text + END COLLATE "C" AS relname +FROM pg_class AS pc + LEFT JOIN pg_am AS pa ON (pa.oid = pc.relam) +WHERE pc.relname LIKE 'tableam_%_heapx' +ORDER BY 3, 1, 2; + +-- don't want to keep those tables, nor the default +ROLLBACK; + +-- Third, check that we can neither create a table using a nonexistent +-- AM, nor using an index AM +CREATE TABLE i_am_a_failure() USING ""; +CREATE TABLE i_am_a_failure() USING i_do_not_exist_am; +CREATE TABLE i_am_a_failure() USING "I do not exist AM"; +CREATE TABLE i_am_a_failure() USING "btree"; + +-- Drop table access method, which fails as objects depends on it +DROP ACCESS METHOD heap2; + +-- we intentionally leave the objects created above alive, to verify pg_dump support diff --git a/src/test/singlenode_regress/sql/create_cast.sql b/src/test/singlenode_regress/sql/create_cast.sql new file mode 100644 index 00000000000..b11cf88b064 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_cast.sql @@ -0,0 +1,54 @@ +-- +-- CREATE_CAST +-- + +-- Create some types to test with +CREATE TYPE casttesttype; + +CREATE FUNCTION casttesttype_in(cstring) + RETURNS casttesttype + AS 'textin' + LANGUAGE internal STRICT IMMUTABLE; +CREATE FUNCTION casttesttype_out(casttesttype) + RETURNS cstring + AS 'textout' + LANGUAGE internal STRICT IMMUTABLE; + +CREATE TYPE casttesttype ( + internallength = variable, + input = casttesttype_in, + output = casttesttype_out, + alignment = int4 +); + +-- a dummy function to test with +CREATE FUNCTION casttestfunc(casttesttype) RETURNS int4 LANGUAGE SQL AS +$$ SELECT 1; $$; + +SELECT casttestfunc('foo'::text); -- fails, as there's no cast + +-- Try binary coercion cast +CREATE CAST (text AS casttesttype) WITHOUT FUNCTION; +SELECT casttestfunc('foo'::text); -- doesn't work, as the cast is explicit +SELECT casttestfunc('foo'::text::casttesttype); -- should work +DROP CAST (text AS casttesttype); -- cleanup + +-- Try IMPLICIT binary coercion cast +CREATE CAST (text AS casttesttype) WITHOUT FUNCTION AS IMPLICIT; +SELECT casttestfunc('foo'::text); -- Should work now + +-- Try I/O conversion cast. +SELECT 1234::int4::casttesttype; -- No cast yet, should fail + +CREATE CAST (int4 AS casttesttype) WITH INOUT; +SELECT 1234::int4::casttesttype; -- Should work now + +DROP CAST (int4 AS casttesttype); + +-- Try cast with a function + +CREATE FUNCTION int4_casttesttype(int4) RETURNS casttesttype LANGUAGE SQL AS +$$ SELECT ('foo'::text || $1::text)::casttesttype; $$; + +CREATE CAST (int4 AS casttesttype) WITH FUNCTION int4_casttesttype(int4) AS IMPLICIT; +SELECT 1234::int4::casttesttype; -- Should work now diff --git a/src/test/singlenode_regress/sql/create_function_3.sql b/src/test/singlenode_regress/sql/create_function_3.sql new file mode 100644 index 00000000000..7edd757b8f3 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_function_3.sql @@ -0,0 +1,391 @@ +-- +-- CREATE FUNCTION +-- +-- Assorted tests using SQL-language functions +-- + +-- All objects made in this test are in temp_func_test schema + +CREATE USER regress_unpriv_user; + +CREATE SCHEMA temp_func_test; +GRANT ALL ON SCHEMA temp_func_test TO public; + +SET search_path TO temp_func_test, public; + +-- +-- Make sanity checks on the pg_proc entries created by CREATE FUNCTION +-- + +-- +-- ARGUMENT and RETURN TYPES +-- +CREATE FUNCTION functest_A_1(text, date) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 = ''abcd'' AND $2 > ''2001-01-01'''; +CREATE FUNCTION functest_A_2(text[]) RETURNS int LANGUAGE 'sql' + AS 'SELECT $1[1]::int'; +CREATE FUNCTION functest_A_3() RETURNS bool LANGUAGE 'sql' + AS 'SELECT false'; +SELECT proname, prorettype::regtype, proargtypes::regtype[] FROM pg_proc + WHERE oid in ('functest_A_1'::regproc, + 'functest_A_2'::regproc, + 'functest_A_3'::regproc) ORDER BY proname; + +SELECT functest_A_1('abcd', '2020-01-01'); +SELECT functest_A_2(ARRAY['1', '2', '3']); +SELECT functest_A_3(); + +-- +-- IMMUTABLE | STABLE | VOLATILE +-- +CREATE FUNCTION functest_B_1(int) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 > 0'; +CREATE FUNCTION functest_B_2(int) RETURNS bool LANGUAGE 'sql' + IMMUTABLE AS 'SELECT $1 > 0'; +CREATE FUNCTION functest_B_3(int) RETURNS bool LANGUAGE 'sql' + STABLE AS 'SELECT $1 = 0'; +CREATE FUNCTION functest_B_4(int) RETURNS bool LANGUAGE 'sql' + VOLATILE AS 'SELECT $1 < 0'; +SELECT proname, provolatile FROM pg_proc + WHERE oid in ('functest_B_1'::regproc, + 'functest_B_2'::regproc, + 'functest_B_3'::regproc, + 'functest_B_4'::regproc) ORDER BY proname; + +ALTER FUNCTION functest_B_2(int) VOLATILE; +ALTER FUNCTION functest_B_3(int) COST 100; -- unrelated change, no effect +SELECT proname, provolatile FROM pg_proc + WHERE oid in ('functest_B_1'::regproc, + 'functest_B_2'::regproc, + 'functest_B_3'::regproc, + 'functest_B_4'::regproc) ORDER BY proname; + +-- +-- SECURITY DEFINER | INVOKER +-- +CREATE FUNCTION functest_C_1(int) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 > 0'; +CREATE FUNCTION functest_C_2(int) RETURNS bool LANGUAGE 'sql' + SECURITY DEFINER AS 'SELECT $1 = 0'; +CREATE FUNCTION functest_C_3(int) RETURNS bool LANGUAGE 'sql' + SECURITY INVOKER AS 'SELECT $1 < 0'; +SELECT proname, prosecdef FROM pg_proc + WHERE oid in ('functest_C_1'::regproc, + 'functest_C_2'::regproc, + 'functest_C_3'::regproc) ORDER BY proname; + +ALTER FUNCTION functest_C_1(int) IMMUTABLE; -- unrelated change, no effect +ALTER FUNCTION functest_C_2(int) SECURITY INVOKER; +ALTER FUNCTION functest_C_3(int) SECURITY DEFINER; +SELECT proname, prosecdef FROM pg_proc + WHERE oid in ('functest_C_1'::regproc, + 'functest_C_2'::regproc, + 'functest_C_3'::regproc) ORDER BY proname; + +-- +-- LEAKPROOF +-- +CREATE FUNCTION functest_E_1(int) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 > 100'; +CREATE FUNCTION functest_E_2(int) RETURNS bool LANGUAGE 'sql' + LEAKPROOF AS 'SELECT $1 > 100'; +SELECT proname, proleakproof FROM pg_proc + WHERE oid in ('functest_E_1'::regproc, + 'functest_E_2'::regproc) ORDER BY proname; + +ALTER FUNCTION functest_E_1(int) LEAKPROOF; +ALTER FUNCTION functest_E_2(int) STABLE; -- unrelated change, no effect +SELECT proname, proleakproof FROM pg_proc + WHERE oid in ('functest_E_1'::regproc, + 'functest_E_2'::regproc) ORDER BY proname; + +ALTER FUNCTION functest_E_2(int) NOT LEAKPROOF; -- remove leakproof attribute +SELECT proname, proleakproof FROM pg_proc + WHERE oid in ('functest_E_1'::regproc, + 'functest_E_2'::regproc) ORDER BY proname; + +-- it takes superuser privilege to turn on leakproof, but not to turn off +ALTER FUNCTION functest_E_1(int) OWNER TO regress_unpriv_user; +ALTER FUNCTION functest_E_2(int) OWNER TO regress_unpriv_user; + +SET SESSION AUTHORIZATION regress_unpriv_user; +SET search_path TO temp_func_test, public; +ALTER FUNCTION functest_E_1(int) NOT LEAKPROOF; +ALTER FUNCTION functest_E_2(int) LEAKPROOF; + +CREATE FUNCTION functest_E_3(int) RETURNS bool LANGUAGE 'sql' + LEAKPROOF AS 'SELECT $1 < 200'; -- fail + +RESET SESSION AUTHORIZATION; + +-- +-- CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT +-- +CREATE FUNCTION functest_F_1(int) RETURNS bool LANGUAGE 'sql' + AS 'SELECT $1 > 50'; +CREATE FUNCTION functest_F_2(int) RETURNS bool LANGUAGE 'sql' + CALLED ON NULL INPUT AS 'SELECT $1 = 50'; +CREATE FUNCTION functest_F_3(int) RETURNS bool LANGUAGE 'sql' + RETURNS NULL ON NULL INPUT AS 'SELECT $1 < 50'; +CREATE FUNCTION functest_F_4(int) RETURNS bool LANGUAGE 'sql' + STRICT AS 'SELECT $1 = 50'; +SELECT proname, proisstrict FROM pg_proc + WHERE oid in ('functest_F_1'::regproc, + 'functest_F_2'::regproc, + 'functest_F_3'::regproc, + 'functest_F_4'::regproc) ORDER BY proname; + +ALTER FUNCTION functest_F_1(int) IMMUTABLE; -- unrelated change, no effect +ALTER FUNCTION functest_F_2(int) STRICT; +ALTER FUNCTION functest_F_3(int) CALLED ON NULL INPUT; +SELECT proname, proisstrict FROM pg_proc + WHERE oid in ('functest_F_1'::regproc, + 'functest_F_2'::regproc, + 'functest_F_3'::regproc, + 'functest_F_4'::regproc) ORDER BY proname; + + +-- pg_get_functiondef tests + +SELECT pg_get_functiondef('functest_A_1'::regproc); +SELECT pg_get_functiondef('functest_B_3'::regproc); +SELECT pg_get_functiondef('functest_C_3'::regproc); +SELECT pg_get_functiondef('functest_F_2'::regproc); + + +-- +-- SQL-standard body +-- +CREATE FUNCTION functest_S_1(a text, b date) RETURNS boolean + LANGUAGE SQL + RETURN a = 'abcd' AND b > '2001-01-01'; +CREATE FUNCTION functest_S_2(a text[]) RETURNS int + RETURN a[1]::int; +CREATE FUNCTION functest_S_3() RETURNS boolean + RETURN false; +CREATE FUNCTION functest_S_3a() RETURNS boolean + BEGIN ATOMIC + ;;RETURN false;; + END; + +CREATE FUNCTION functest_S_10(a text, b date) RETURNS boolean + LANGUAGE SQL + BEGIN ATOMIC + SELECT a = 'abcd' AND b > '2001-01-01'; + END; + +CREATE FUNCTION functest_S_13() RETURNS boolean + BEGIN ATOMIC + SELECT 1; + SELECT false; + END; + +-- check display of function argments in sub-SELECT +CREATE TABLE functest1 (i int); +CREATE FUNCTION functest_S_16(a int, b int) RETURNS void + LANGUAGE SQL + BEGIN ATOMIC + INSERT INTO functest1 SELECT a + $2; + END; + +-- error: duplicate function body +CREATE FUNCTION functest_S_xxx(x int) RETURNS int + LANGUAGE SQL + AS $$ SELECT x * 2 $$ + RETURN x * 3; + +-- polymorphic arguments not allowed in this form +CREATE FUNCTION functest_S_xx(x anyarray) RETURNS anyelement + LANGUAGE SQL + RETURN x[1]; + +-- check reporting of parse-analysis errors +CREATE FUNCTION functest_S_xx(x date) RETURNS boolean + LANGUAGE SQL + RETURN x > 1; + +-- tricky parsing +CREATE FUNCTION functest_S_15(x int) RETURNS boolean +LANGUAGE SQL +BEGIN ATOMIC + select case when x % 2 = 0 then true else false end; +END; + +SELECT functest_S_1('abcd', '2020-01-01'); +SELECT functest_S_2(ARRAY['1', '2', '3']); +SELECT functest_S_3(); + +SELECT functest_S_10('abcd', '2020-01-01'); +SELECT functest_S_13(); + +SELECT pg_get_functiondef('functest_S_1'::regproc); +SELECT pg_get_functiondef('functest_S_2'::regproc); +SELECT pg_get_functiondef('functest_S_3'::regproc); +SELECT pg_get_functiondef('functest_S_3a'::regproc); +SELECT pg_get_functiondef('functest_S_10'::regproc); +SELECT pg_get_functiondef('functest_S_13'::regproc); +SELECT pg_get_functiondef('functest_S_15'::regproc); +SELECT pg_get_functiondef('functest_S_16'::regproc); + +DROP TABLE functest1 CASCADE; + +-- test with views +CREATE TABLE functest3 (a int); +INSERT INTO functest3 VALUES (1), (2); +CREATE VIEW functestv3 AS SELECT * FROM functest3; + +CREATE FUNCTION functest_S_14() RETURNS bigint + RETURN (SELECT count(*) FROM functestv3); + +SELECT functest_S_14(); + +DROP TABLE functest3 CASCADE; + + +-- information_schema tests + +CREATE FUNCTION functest_IS_1(a int, b int default 1, c text default 'foo') + RETURNS int + LANGUAGE SQL + AS 'SELECT $1 + $2'; + +CREATE FUNCTION functest_IS_2(out a int, b int default 1) + RETURNS int + LANGUAGE SQL + AS 'SELECT $1'; + +CREATE FUNCTION functest_IS_3(a int default 1, out b int) + RETURNS int + LANGUAGE SQL + AS 'SELECT $1'; + +SELECT routine_name, ordinal_position, parameter_name, parameter_default + FROM information_schema.parameters JOIN information_schema.routines USING (specific_schema, specific_name) + WHERE routine_schema = 'temp_func_test' AND routine_name ~ '^functest_is_' + ORDER BY 1, 2; + +DROP FUNCTION functest_IS_1(int, int, text), functest_IS_2(int), functest_IS_3(int); + +-- routine usage views + +CREATE FUNCTION functest_IS_4a() RETURNS int LANGUAGE SQL AS 'SELECT 1'; +CREATE FUNCTION functest_IS_4b(x int DEFAULT functest_IS_4a()) RETURNS int LANGUAGE SQL AS 'SELECT x'; + +CREATE SEQUENCE functest1; +CREATE FUNCTION functest_IS_5(x int DEFAULT nextval('functest1')) + RETURNS int + LANGUAGE SQL + AS 'SELECT x'; + +CREATE FUNCTION functest_IS_6() + RETURNS int + LANGUAGE SQL + RETURN nextval('functest1'); + +CREATE TABLE functest2 (a int, b int); + +CREATE FUNCTION functest_IS_7() + RETURNS int + LANGUAGE SQL + RETURN (SELECT count(a) FROM functest2); + +SELECT r0.routine_name, r1.routine_name + FROM information_schema.routine_routine_usage rru + JOIN information_schema.routines r0 ON r0.specific_name = rru.specific_name + JOIN information_schema.routines r1 ON r1.specific_name = rru.routine_name + WHERE r0.routine_schema = 'temp_func_test' AND + r1.routine_schema = 'temp_func_test' + ORDER BY 1, 2; +SELECT routine_name, sequence_name FROM information_schema.routine_sequence_usage + WHERE routine_schema = 'temp_func_test' + ORDER BY 1, 2; +SELECT routine_name, table_name, column_name FROM information_schema.routine_column_usage + WHERE routine_schema = 'temp_func_test' + ORDER BY 1, 2; +SELECT routine_name, table_name FROM information_schema.routine_table_usage + WHERE routine_schema = 'temp_func_test' + ORDER BY 1, 2; + +DROP FUNCTION functest_IS_4a CASCADE; +DROP SEQUENCE functest1 CASCADE; +DROP TABLE functest2 CASCADE; + + +-- overload +CREATE FUNCTION functest_B_2(bigint) RETURNS bool LANGUAGE 'sql' + IMMUTABLE AS 'SELECT $1 > 0'; + +DROP FUNCTION functest_b_1; +DROP FUNCTION functest_b_1; -- error, not found +DROP FUNCTION functest_b_2; -- error, ambiguous + + +-- CREATE OR REPLACE tests + +CREATE FUNCTION functest1(a int) RETURNS int LANGUAGE SQL AS 'SELECT $1'; +CREATE OR REPLACE FUNCTION functest1(a int) RETURNS int LANGUAGE SQL WINDOW AS 'SELECT $1'; +CREATE OR REPLACE PROCEDURE functest1(a int) LANGUAGE SQL AS 'SELECT $1'; +DROP FUNCTION functest1(a int); + + +-- inlining of set-returning functions + +CREATE TABLE functest3 (a int); +INSERT INTO functest3 VALUES (1), (2), (3); + +CREATE FUNCTION functest_sri1() RETURNS SETOF int +LANGUAGE SQL +STABLE +AS ' + SELECT * FROM functest3; +'; + +SELECT * FROM functest_sri1(); +EXPLAIN (verbose, costs off) SELECT * FROM functest_sri1(); + +CREATE FUNCTION functest_sri2() RETURNS SETOF int +LANGUAGE SQL +STABLE +BEGIN ATOMIC + SELECT * FROM functest3; +END; + +SELECT * FROM functest_sri2(); +EXPLAIN (verbose, costs off) SELECT * FROM functest_sri2(); + +DROP TABLE functest3 CASCADE; + + +-- Check behavior of VOID-returning SQL functions + +CREATE FUNCTION voidtest1(a int) RETURNS VOID LANGUAGE SQL AS +$$ SELECT a + 1 $$; +SELECT voidtest1(42); + +CREATE FUNCTION voidtest2(a int, b int) RETURNS VOID LANGUAGE SQL AS +$$ SELECT voidtest1(a + b) $$; +SELECT voidtest2(11,22); + +-- currently, we can inline voidtest2 but not voidtest1 +EXPLAIN (verbose, costs off) SELECT voidtest2(11,22); + +CREATE TEMP TABLE sometable(f1 int); + +CREATE FUNCTION voidtest3(a int) RETURNS VOID LANGUAGE SQL AS +$$ INSERT INTO sometable VALUES(a + 1) $$; +SELECT voidtest3(17); + +CREATE FUNCTION voidtest4(a int) RETURNS VOID LANGUAGE SQL AS +$$ INSERT INTO sometable VALUES(a - 1) RETURNING f1 $$; +SELECT voidtest4(39); + +TABLE sometable; + +CREATE FUNCTION voidtest5(a int) RETURNS SETOF VOID LANGUAGE SQL AS +$$ SELECT generate_series(1, a) $$ STABLE; +SELECT * FROM voidtest5(3); + +-- Cleanup +DROP SCHEMA temp_func_test CASCADE; +DROP USER regress_unpriv_user; +RESET search_path; diff --git a/src/test/singlenode_regress/sql/create_index.sql b/src/test/singlenode_regress/sql/create_index.sql new file mode 100644 index 00000000000..7fa250e6906 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_index.sql @@ -0,0 +1,1242 @@ +-- +-- CREATE_INDEX +-- Create ancillary data structures (i.e. indices) +-- + +-- +-- BTREE +-- +CREATE INDEX onek_unique1 ON onek USING btree(unique1 int4_ops); + +CREATE INDEX IF NOT EXISTS onek_unique1 ON onek USING btree(unique1 int4_ops); + +CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_ops); + +CREATE INDEX onek_unique2 ON onek USING btree(unique2 int4_ops); + +CREATE INDEX onek_hundred ON onek USING btree(hundred int4_ops); + +CREATE INDEX onek_stringu1 ON onek USING btree(stringu1 name_ops); + +CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops); + +CREATE INDEX tenk1_unique2 ON tenk1 USING btree(unique2 int4_ops); + +CREATE INDEX tenk1_hundred ON tenk1 USING btree(hundred int4_ops); + +CREATE INDEX tenk1_thous_tenthous ON tenk1 (thousand, tenthous); + +CREATE INDEX tenk2_unique1 ON tenk2 USING btree(unique1 int4_ops); + +CREATE INDEX tenk2_unique2 ON tenk2 USING btree(unique2 int4_ops); + +CREATE INDEX tenk2_hundred ON tenk2 USING btree(hundred int4_ops); + +CREATE INDEX rix ON road USING btree (name text_ops); + +CREATE INDEX iix ON ihighway USING btree (name text_ops); + +CREATE INDEX six ON shighway USING btree (name text_ops); + +-- test comments +COMMENT ON INDEX six_wrong IS 'bad index'; +COMMENT ON INDEX six IS 'good index'; +COMMENT ON INDEX six IS NULL; + +-- +-- BTREE ascending/descending cases +-- +-- we load int4/text from pure descending data (each key is a new +-- low key) and name/f8 from pure ascending data (each key is a new +-- high key). we had a bug where new low keys would sometimes be +-- "lost". +-- +CREATE INDEX bt_i4_index ON bt_i4_heap USING btree (seqno int4_ops); + +CREATE INDEX bt_name_index ON bt_name_heap USING btree (seqno name_ops); + +CREATE INDEX bt_txt_index ON bt_txt_heap USING btree (seqno text_ops); + +CREATE INDEX bt_f8_index ON bt_f8_heap USING btree (seqno float8_ops); + +-- +-- BTREE partial indices +-- +CREATE INDEX onek2_u1_prtl ON onek2 USING btree(unique1 int4_ops) + where unique1 < 20 or unique1 > 980; + +CREATE INDEX onek2_u2_prtl ON onek2 USING btree(unique2 int4_ops) + where stringu1 < 'B'; + +CREATE INDEX onek2_stu1_prtl ON onek2 USING btree(stringu1 name_ops) + where onek2.stringu1 >= 'J' and onek2.stringu1 < 'K'; + +-- +-- GiST (rtree-equivalent opclasses only) +-- +CREATE INDEX grect2ind ON fast_emp4000 USING gist (home_base); + +CREATE INDEX gpolygonind ON polygon_tbl USING gist (f1); + +CREATE INDEX gcircleind ON circle_tbl USING gist (f1); + +INSERT INTO POINT_TBL(f1) VALUES (NULL); + +CREATE INDEX gpointind ON point_tbl USING gist (f1); + +CREATE TEMP TABLE gpolygon_tbl AS + SELECT polygon(home_base) AS f1 FROM slow_emp4000; +INSERT INTO gpolygon_tbl VALUES ( '(1000,0,0,1000)' ); +INSERT INTO gpolygon_tbl VALUES ( '(0,1000,1000,1000)' ); + +CREATE TEMP TABLE gcircle_tbl AS + SELECT circle(home_base) AS f1 FROM slow_emp4000; + +CREATE INDEX ggpolygonind ON gpolygon_tbl USING gist (f1); + +CREATE INDEX ggcircleind ON gcircle_tbl USING gist (f1); + +-- +-- Test GiST indexes +-- + +-- get non-indexed results for comparison purposes + +SET enable_seqscan = ON; +SET enable_indexscan = OFF; +SET enable_bitmapscan = OFF; + +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; + +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; + +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; + +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + +SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; + +SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; + +SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; + +SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; + +SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; + +SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; + +SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; + +SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; + +SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; + +SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; + +SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; + +SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; + +SELECT * FROM point_tbl WHERE f1 IS NULL; + +SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; + +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; + +SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; + +SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; + +-- Now check the results from plain indexscan +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; + +EXPLAIN (COSTS OFF) +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; +SELECT * FROM fast_emp4000 + WHERE home_base <@ '(200,200),(2000,1000)'::box + ORDER BY (home_base[0])[0]; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; +SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; +SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; + +EXPLAIN (COSTS OFF) +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + +EXPLAIN (COSTS OFF) +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; +SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; +SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; +SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; +SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; +SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; +SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; +SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; +SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; +SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; +SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; +SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; +SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl WHERE f1 IS NULL; +SELECT * FROM point_tbl WHERE f1 IS NULL; + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; +SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; + +EXPLAIN (COSTS OFF) +SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; +SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; + +EXPLAIN (COSTS OFF) +SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; +SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; + +EXPLAIN (COSTS OFF) +SELECT point(x,x), (SELECT f1 FROM gpolygon_tbl ORDER BY f1 <-> point(x,x) LIMIT 1) as c FROM generate_series(0,10,1) x; +SELECT point(x,x), (SELECT f1 FROM gpolygon_tbl ORDER BY f1 <-> point(x,x) LIMIT 1) as c FROM generate_series(0,10,1) x; + +-- Now check the results from bitmap indexscan +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_bitmapscan = ON; + +EXPLAIN (COSTS OFF) +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; +SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; + +-- +-- GIN over int[] and text[] +-- +-- Note: GIN currently supports only bitmap scans, not plain indexscans +-- + +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_bitmapscan = ON; + +CREATE INDEX intarrayidx ON array_index_op_test USING gin (i); + +explain (costs off) +SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; + +SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i && '{32}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i @> '{17}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i && '{17}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i @> '{32,17}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i && '{32,17}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i <@ '{38,34,32,89}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i = '{47,77}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i = '{}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i @> '{}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i && '{}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i <@ '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; + +CREATE INDEX textarrayidx ON array_index_op_test USING gin (t); + +explain (costs off) +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; + +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t = '{AAAAAAAAAA646,A87088}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t @> '{}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t && '{}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t <@ '{}' ORDER BY seqno; + +-- And try it with a multicolumn GIN index + +DROP INDEX intarrayidx, textarrayidx; + +CREATE INDEX botharrayidx ON array_index_op_test USING gin (i, t); + +SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i && '{32}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAA80240}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t && '{AAAAAAA80240}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i @> '{32}' AND t && '{AAAAAAA80240}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i && '{32}' AND t @> '{AAAAAAA80240}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; +SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; + +-- +-- Try a GIN index with a lot of items with same key. (GIN creates a posting +-- tree when there are enough duplicates) +-- +CREATE TABLE array_gin_test (a int[]); + +INSERT INTO array_gin_test SELECT ARRAY[1, g%5, g] FROM generate_series(1, 10000) g; + +CREATE INDEX array_gin_test_idx ON array_gin_test USING gin (a); + +SELECT COUNT(*) FROM array_gin_test WHERE a @> '{2}'; + +DROP TABLE array_gin_test; + +-- +-- Test GIN index's reloptions +-- +CREATE INDEX gin_relopts_test ON array_index_op_test USING gin (i) + WITH (FASTUPDATE=on, GIN_PENDING_LIST_LIMIT=128); +\d+ gin_relopts_test + +-- +-- HASH +-- +CREATE INDEX hash_i4_index ON hash_i4_heap USING hash (random int4_ops); + +CREATE INDEX hash_name_index ON hash_name_heap USING hash (random name_ops); + +CREATE INDEX hash_txt_index ON hash_txt_heap USING hash (random text_ops); + +CREATE INDEX hash_f8_index ON hash_f8_heap USING hash (random float8_ops) WITH (fillfactor=60); + +CREATE UNLOGGED TABLE unlogged_hash_table (id int4); +CREATE INDEX unlogged_hash_index ON unlogged_hash_table USING hash (id int4_ops); +DROP TABLE unlogged_hash_table; + +-- CREATE INDEX hash_ovfl_index ON hash_ovfl_heap USING hash (x int4_ops); + +-- Test hash index build tuplesorting. Force hash tuplesort using low +-- maintenance_work_mem setting and fillfactor: +SET maintenance_work_mem = '1MB'; +CREATE INDEX hash_tuplesort_idx ON tenk1 USING hash (stringu1 name_ops) WITH (fillfactor = 10); +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; +SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; +DROP INDEX hash_tuplesort_idx; +RESET maintenance_work_mem; + + +-- +-- Test functional index +-- +CREATE TABLE func_index_heap (f1 text, f2 text); +CREATE UNIQUE INDEX func_index_index on func_index_heap (textcat(f1,f2)); + +INSERT INTO func_index_heap VALUES('ABC','DEF'); +INSERT INTO func_index_heap VALUES('AB','CDEFG'); +INSERT INTO func_index_heap VALUES('QWE','RTY'); +-- this should fail because of unique index: +INSERT INTO func_index_heap VALUES('ABCD', 'EF'); +-- but this shouldn't: +INSERT INTO func_index_heap VALUES('QWERTY'); + +-- while we're here, see that the metadata looks sane +\d func_index_heap +\d func_index_index + + +-- +-- Same test, expressional index +-- +DROP TABLE func_index_heap; +CREATE TABLE func_index_heap (f1 text, f2 text); +CREATE UNIQUE INDEX func_index_index on func_index_heap ((f1 || f2) text_ops); + +INSERT INTO func_index_heap VALUES('ABC','DEF'); +INSERT INTO func_index_heap VALUES('AB','CDEFG'); +INSERT INTO func_index_heap VALUES('QWE','RTY'); +-- this should fail because of unique index: +INSERT INTO func_index_heap VALUES('ABCD', 'EF'); +-- but this shouldn't: +INSERT INTO func_index_heap VALUES('QWERTY'); + +-- while we're here, see that the metadata looks sane +\d func_index_heap +\d func_index_index + +-- this should fail because of unsafe column type (anonymous record) +create index on func_index_heap ((f1 || f2), (row(f1, f2))); + + +-- +-- Test unique index with included columns +-- +CREATE TABLE covering_index_heap (f1 int, f2 int, f3 text); +CREATE UNIQUE INDEX covering_index_index on covering_index_heap (f1,f2) INCLUDE(f3); + +INSERT INTO covering_index_heap VALUES(1,1,'AAA'); +INSERT INTO covering_index_heap VALUES(1,2,'AAA'); +-- this should fail because of unique index on f1,f2: +INSERT INTO covering_index_heap VALUES(1,2,'BBB'); +-- and this shouldn't: +INSERT INTO covering_index_heap VALUES(1,4,'AAA'); +-- Try to build index on table that already contains data +CREATE UNIQUE INDEX covering_pkey on covering_index_heap (f1,f2) INCLUDE(f3); +-- Try to use existing covering index as primary key +ALTER TABLE covering_index_heap ADD CONSTRAINT covering_pkey PRIMARY KEY USING INDEX +covering_pkey; +DROP TABLE covering_index_heap; + + +-- +-- Also try building functional, expressional, and partial indexes on +-- tables that already contain data. +-- +create unique index hash_f8_index_1 on hash_f8_heap(abs(random)); +create unique index hash_f8_index_2 on hash_f8_heap((seqno + 1), random); +create unique index hash_f8_index_3 on hash_f8_heap(random) where seqno > 1000; + +-- +-- Try some concurrent index builds +-- +-- Unfortunately this only tests about half the code paths because there are +-- no concurrent updates happening to the table at the same time. + +CREATE TABLE concur_heap (f1 text, f2 text); +-- empty table +CREATE INDEX CONCURRENTLY concur_index1 ON concur_heap(f2,f1); +CREATE INDEX CONCURRENTLY IF NOT EXISTS concur_index1 ON concur_heap(f2,f1); +INSERT INTO concur_heap VALUES ('a','b'); +INSERT INTO concur_heap VALUES ('b','b'); +-- unique index +CREATE UNIQUE INDEX CONCURRENTLY concur_index2 ON concur_heap(f1); +CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS concur_index2 ON concur_heap(f1); +-- check if constraint is set up properly to be enforced +INSERT INTO concur_heap VALUES ('b','x'); +-- check if constraint is enforced properly at build time +CREATE UNIQUE INDEX CONCURRENTLY concur_index3 ON concur_heap(f2); +-- test that expression indexes and partial indexes work concurrently +CREATE INDEX CONCURRENTLY concur_index4 on concur_heap(f2) WHERE f1='a'; +CREATE INDEX CONCURRENTLY concur_index5 on concur_heap(f2) WHERE f1='x'; +-- here we also check that you can default the index name +CREATE INDEX CONCURRENTLY on concur_heap((f2||f1)); +-- You can't do a concurrent index build in a transaction +BEGIN; +CREATE INDEX CONCURRENTLY concur_index7 ON concur_heap(f1); +COMMIT; +-- test where predicate is able to do a transactional update during +-- a concurrent build before switching pg_index state flags. +CREATE FUNCTION predicate_stable() RETURNS bool IMMUTABLE +LANGUAGE plpgsql AS $$ +BEGIN + EXECUTE 'SELECT txid_current()'; + RETURN true; +END; $$; +CREATE INDEX CONCURRENTLY concur_index8 ON concur_heap (f1) + WHERE predicate_stable(); +DROP INDEX concur_index8; +DROP FUNCTION predicate_stable(); + +-- But you can do a regular index build in a transaction +BEGIN; +CREATE INDEX std_index on concur_heap(f2); +COMMIT; + +-- Failed builds are left invalid by VACUUM FULL, fixed by REINDEX +VACUUM FULL concur_heap; +REINDEX TABLE concur_heap; +DELETE FROM concur_heap WHERE f1 = 'b'; +VACUUM FULL concur_heap; +\d concur_heap +REINDEX TABLE concur_heap; +\d concur_heap + +-- Temporary tables with concurrent builds and on-commit actions +-- CONCURRENTLY used with CREATE INDEX and DROP INDEX is ignored. +-- PRESERVE ROWS, the default. +CREATE TEMP TABLE concur_temp (f1 int, f2 text) + ON COMMIT PRESERVE ROWS; +INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); +CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); +DROP INDEX CONCURRENTLY concur_temp_ind; +DROP TABLE concur_temp; +-- ON COMMIT DROP +BEGIN; +CREATE TEMP TABLE concur_temp (f1 int, f2 text) + ON COMMIT DROP; +INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); +-- Fails when running in a transaction. +CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); +COMMIT; +-- ON COMMIT DELETE ROWS +CREATE TEMP TABLE concur_temp (f1 int, f2 text) + ON COMMIT DELETE ROWS; +INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); +CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); +DROP INDEX CONCURRENTLY concur_temp_ind; +DROP TABLE concur_temp; + +-- +-- Try some concurrent index drops +-- +DROP INDEX CONCURRENTLY "concur_index2"; -- works +DROP INDEX CONCURRENTLY IF EXISTS "concur_index2"; -- notice + +-- failures +DROP INDEX CONCURRENTLY "concur_index2", "concur_index3"; +BEGIN; +DROP INDEX CONCURRENTLY "concur_index5"; +ROLLBACK; + +-- successes +DROP INDEX CONCURRENTLY IF EXISTS "concur_index3"; +DROP INDEX CONCURRENTLY "concur_index4"; +DROP INDEX CONCURRENTLY "concur_index5"; +DROP INDEX CONCURRENTLY "concur_index1"; +DROP INDEX CONCURRENTLY "concur_heap_expr_idx"; + +\d concur_heap + +DROP TABLE concur_heap; + +-- +-- Test ADD CONSTRAINT USING INDEX +-- + +CREATE TABLE cwi_test( a int , b varchar(10), c char); + +-- add some data so that all tests have something to work with. + +INSERT INTO cwi_test VALUES(1, 2), (3, 4), (5, 6); + +CREATE UNIQUE INDEX cwi_uniq_idx ON cwi_test(a , b); +ALTER TABLE cwi_test ADD primary key USING INDEX cwi_uniq_idx; + +\d cwi_test +\d cwi_uniq_idx + +CREATE UNIQUE INDEX cwi_uniq2_idx ON cwi_test(b , a); +ALTER TABLE cwi_test DROP CONSTRAINT cwi_uniq_idx, + ADD CONSTRAINT cwi_replaced_pkey PRIMARY KEY + USING INDEX cwi_uniq2_idx; + +\d cwi_test +\d cwi_replaced_pkey + +DROP INDEX cwi_replaced_pkey; -- Should fail; a constraint depends on it + +-- Check that non-default index options are rejected +CREATE UNIQUE INDEX cwi_uniq3_idx ON cwi_test(a desc); +ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq3_idx; -- fail +CREATE UNIQUE INDEX cwi_uniq4_idx ON cwi_test(b collate "POSIX"); +ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq4_idx; -- fail + +DROP TABLE cwi_test; + +-- ADD CONSTRAINT USING INDEX is forbidden on partitioned tables +CREATE TABLE cwi_test(a int) PARTITION BY hash (a); +create unique index on cwi_test (a); +alter table cwi_test add primary key using index cwi_test_a_idx ; +DROP TABLE cwi_test; + +-- +-- Check handling of indexes on system columns +-- +CREATE TABLE syscol_table (a INT); + +-- System columns cannot be indexed +CREATE INDEX ON syscolcol_table (ctid); + +-- nor used in expressions +CREATE INDEX ON syscol_table ((ctid >= '(1000,0)')); + +-- nor used in predicates +CREATE INDEX ON syscol_table (a) WHERE ctid >= '(1000,0)'; + +DROP TABLE syscol_table; + +-- +-- Tests for IS NULL/IS NOT NULL with b-tree indexes +-- + +CREATE TABLE onek_with_null AS SELECT unique1, unique2 FROM onek; +INSERT INTO onek_with_null (unique1,unique2) VALUES (NULL, -1), (NULL, NULL); +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2,unique1); + +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = ON; + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; + +DROP INDEX onek_nulltest; + +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 desc,unique1); + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; + +DROP INDEX onek_nulltest; + +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 desc nulls last,unique1); + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; + +DROP INDEX onek_nulltest; + +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 nulls first,unique1); + +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; + +DROP INDEX onek_nulltest; + +-- Check initial-positioning logic too + +CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2); + +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; + +SELECT unique1, unique2 FROM onek_with_null + ORDER BY unique2 LIMIT 2; +SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= -1 + ORDER BY unique2 LIMIT 2; +SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= 0 + ORDER BY unique2 LIMIT 2; + +SELECT unique1, unique2 FROM onek_with_null + ORDER BY unique2 DESC LIMIT 2; +SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= -1 + ORDER BY unique2 DESC LIMIT 2; +SELECT unique1, unique2 FROM onek_with_null WHERE unique2 < 999 + ORDER BY unique2 DESC LIMIT 2; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; + +DROP TABLE onek_with_null; + +-- +-- Check bitmap index path planning +-- + +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 + WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3 OR tenthous = 42); +SELECT * FROM tenk1 + WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3 OR tenthous = 42); + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 + WHERE hundred = 42 AND (thousand = 42 OR thousand = 99); +SELECT count(*) FROM tenk1 + WHERE hundred = 42 AND (thousand = 42 OR thousand = 99); + +-- +-- Check behavior with duplicate index column contents +-- + +CREATE TABLE dupindexcols AS + SELECT unique1 as id, stringu2::text as f1 FROM tenk1; +CREATE INDEX dupindexcols_i ON dupindexcols (f1, id, f1 text_pattern_ops); +ANALYZE dupindexcols; + +EXPLAIN (COSTS OFF) + SELECT count(*) FROM dupindexcols + WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; +SELECT count(*) FROM dupindexcols + WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; + +-- +-- Check ordering of =ANY indexqual results (bug in 9.2.0) +-- + +vacuum tenk1; -- ensure we get consistent plans here + +explain (costs off) +SELECT unique1 FROM tenk1 +WHERE unique1 IN (1,42,7) +ORDER BY unique1; + +SELECT unique1 FROM tenk1 +WHERE unique1 IN (1,42,7) +ORDER BY unique1; + +explain (costs off) +SELECT thousand, tenthous FROM tenk1 +WHERE thousand < 2 AND tenthous IN (1001,3000) +ORDER BY thousand; + +SELECT thousand, tenthous FROM tenk1 +WHERE thousand < 2 AND tenthous IN (1001,3000) +ORDER BY thousand; + +SET enable_indexonlyscan = OFF; + +explain (costs off) +SELECT thousand, tenthous FROM tenk1 +WHERE thousand < 2 AND tenthous IN (1001,3000) +ORDER BY thousand; + +SELECT thousand, tenthous FROM tenk1 +WHERE thousand < 2 AND tenthous IN (1001,3000) +ORDER BY thousand; + +RESET enable_indexonlyscan; + +-- +-- Check elimination of constant-NULL subexpressions +-- + +explain (costs off) + select * from tenk1 where (thousand, tenthous) in ((1,1001), (null,null)); + +-- +-- Check matching of boolean index columns to WHERE conditions and sort keys +-- + +create temp table boolindex (b bool, i int, unique(b, i), junk float); + +explain (costs off) + select * from boolindex order by b, i limit 10; +explain (costs off) + select * from boolindex where b order by i limit 10; +explain (costs off) + select * from boolindex where b = true order by i desc limit 10; +explain (costs off) + select * from boolindex where not b order by i limit 10; +explain (costs off) + select * from boolindex where b is true order by i desc limit 10; +explain (costs off) + select * from boolindex where b is false order by i desc limit 10; + +-- +-- REINDEX (VERBOSE) +-- +CREATE TABLE reindex_verbose(id integer primary key); +\set VERBOSITY terse \\ -- suppress machine-dependent details +REINDEX (VERBOSE) TABLE reindex_verbose; +\set VERBOSITY default +DROP TABLE reindex_verbose; + +-- +-- REINDEX CONCURRENTLY +-- +CREATE TABLE concur_reindex_tab (c1 int); +-- REINDEX +REINDEX TABLE concur_reindex_tab; -- notice +REINDEX (CONCURRENTLY) TABLE concur_reindex_tab; -- notice +ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index +-- Normal index with integer column +CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1); +-- Normal index with text column +CREATE INDEX concur_reindex_ind2 ON concur_reindex_tab(c2); +-- UNIQUE index with expression +CREATE UNIQUE INDEX concur_reindex_ind3 ON concur_reindex_tab(abs(c1)); +-- Duplicate column names +CREATE INDEX concur_reindex_ind4 ON concur_reindex_tab(c1, c1, c2); +-- Create table for check on foreign key dependence switch with indexes swapped +ALTER TABLE concur_reindex_tab ADD PRIMARY KEY USING INDEX concur_reindex_ind1; +CREATE TABLE concur_reindex_tab2 (c1 int REFERENCES concur_reindex_tab); +INSERT INTO concur_reindex_tab VALUES (1, 'a'); +INSERT INTO concur_reindex_tab VALUES (2, 'a'); +-- Reindex concurrently of exclusion constraint currently not supported +CREATE TABLE concur_reindex_tab3 (c1 int, c2 int4range, EXCLUDE USING gist (c2 WITH &&)); +INSERT INTO concur_reindex_tab3 VALUES (3, '[1,2]'); +REINDEX INDEX CONCURRENTLY concur_reindex_tab3_c2_excl; -- error +REINDEX TABLE CONCURRENTLY concur_reindex_tab3; -- succeeds with warning +INSERT INTO concur_reindex_tab3 VALUES (4, '[2,4]'); +-- Check materialized views +CREATE MATERIALIZED VIEW concur_reindex_matview AS SELECT * FROM concur_reindex_tab; +-- Dependency lookup before and after the follow-up REINDEX commands. +-- These should remain consistent. +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid,refobjid,refobjsubid) as objref, + deptype +FROM pg_depend +WHERE classid = 'pg_class'::regclass AND + objid in ('concur_reindex_tab'::regclass, + 'concur_reindex_ind1'::regclass, + 'concur_reindex_ind2'::regclass, + 'concur_reindex_ind3'::regclass, + 'concur_reindex_ind4'::regclass, + 'concur_reindex_matview'::regclass) + ORDER BY 1, 2; +REINDEX INDEX CONCURRENTLY concur_reindex_ind1; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +REINDEX TABLE CONCURRENTLY concur_reindex_matview; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid,refobjid,refobjsubid) as objref, + deptype +FROM pg_depend +WHERE classid = 'pg_class'::regclass AND + objid in ('concur_reindex_tab'::regclass, + 'concur_reindex_ind1'::regclass, + 'concur_reindex_ind2'::regclass, + 'concur_reindex_ind3'::regclass, + 'concur_reindex_ind4'::regclass, + 'concur_reindex_matview'::regclass) + ORDER BY 1, 2; +-- Check that comments are preserved +CREATE TABLE testcomment (i int); +CREATE INDEX testcomment_idx1 ON testcomment (i); +COMMENT ON INDEX testcomment_idx1 IS 'test comment'; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); +REINDEX TABLE testcomment; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); +REINDEX TABLE CONCURRENTLY testcomment ; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); +DROP TABLE testcomment; +-- Check that indisclustered updates are preserved +CREATE TABLE concur_clustered(i int); +CREATE INDEX concur_clustered_i_idx ON concur_clustered(i); +ALTER TABLE concur_clustered CLUSTER ON concur_clustered_i_idx; +REINDEX TABLE CONCURRENTLY concur_clustered; +SELECT indexrelid::regclass, indisclustered FROM pg_index + WHERE indrelid = 'concur_clustered'::regclass; +DROP TABLE concur_clustered; +-- Check that indisreplident updates are preserved. +CREATE TABLE concur_replident(i int NOT NULL); +CREATE UNIQUE INDEX concur_replident_i_idx ON concur_replident(i); +ALTER TABLE concur_replident REPLICA IDENTITY + USING INDEX concur_replident_i_idx; +SELECT indexrelid::regclass, indisreplident FROM pg_index + WHERE indrelid = 'concur_replident'::regclass; +REINDEX TABLE CONCURRENTLY concur_replident; +SELECT indexrelid::regclass, indisreplident FROM pg_index + WHERE indrelid = 'concur_replident'::regclass; +DROP TABLE concur_replident; +-- Check that opclass parameters are preserved +CREATE TABLE concur_appclass_tab(i tsvector, j tsvector, k tsvector); +CREATE INDEX concur_appclass_ind on concur_appclass_tab + USING gist (i tsvector_ops (siglen='1000'), j tsvector_ops (siglen='500')); +CREATE INDEX concur_appclass_ind_2 on concur_appclass_tab + USING gist (k tsvector_ops (siglen='300'), j tsvector_ops); +REINDEX TABLE CONCURRENTLY concur_appclass_tab; +\d concur_appclass_tab +DROP TABLE concur_appclass_tab; + +-- Partitions +-- Create some partitioned tables +CREATE TABLE concur_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1); +CREATE TABLE concur_reindex_part_0 PARTITION OF concur_reindex_part + FOR VALUES FROM (0) TO (10) PARTITION BY list (c2); +CREATE TABLE concur_reindex_part_0_1 PARTITION OF concur_reindex_part_0 + FOR VALUES IN (1); +CREATE TABLE concur_reindex_part_0_2 PARTITION OF concur_reindex_part_0 + FOR VALUES IN (2); +-- This partitioned table will have no partitions. +CREATE TABLE concur_reindex_part_10 PARTITION OF concur_reindex_part + FOR VALUES FROM (10) TO (20) PARTITION BY list (c2); +-- Create some partitioned indexes +CREATE INDEX concur_reindex_part_index ON ONLY concur_reindex_part (c1); +CREATE INDEX concur_reindex_part_index_0 ON ONLY concur_reindex_part_0 (c1); +ALTER INDEX concur_reindex_part_index ATTACH PARTITION concur_reindex_part_index_0; +-- This partitioned index will have no partitions. +CREATE INDEX concur_reindex_part_index_10 ON ONLY concur_reindex_part_10 (c1); +ALTER INDEX concur_reindex_part_index ATTACH PARTITION concur_reindex_part_index_10; +CREATE INDEX concur_reindex_part_index_0_1 ON ONLY concur_reindex_part_0_1 (c1); +ALTER INDEX concur_reindex_part_index_0 ATTACH PARTITION concur_reindex_part_index_0_1; +CREATE INDEX concur_reindex_part_index_0_2 ON ONLY concur_reindex_part_0_2 (c1); +ALTER INDEX concur_reindex_part_index_0 ATTACH PARTITION concur_reindex_part_index_0_2; +SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') + ORDER BY relid, level; +SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') + ORDER BY relid, level; +-- REINDEX should preserve dependencies of partition tree. +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid,refobjid,refobjsubid) as objref, + deptype +FROM pg_depend +WHERE classid = 'pg_class'::regclass AND + objid in ('concur_reindex_part'::regclass, + 'concur_reindex_part_0'::regclass, + 'concur_reindex_part_0_1'::regclass, + 'concur_reindex_part_0_2'::regclass, + 'concur_reindex_part_index'::regclass, + 'concur_reindex_part_index_0'::regclass, + 'concur_reindex_part_index_0_1'::regclass, + 'concur_reindex_part_index_0_2'::regclass) + ORDER BY 1, 2; +REINDEX INDEX CONCURRENTLY concur_reindex_part_index_0_1; +REINDEX INDEX CONCURRENTLY concur_reindex_part_index_0_2; +SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') + ORDER BY relid, level; +REINDEX TABLE CONCURRENTLY concur_reindex_part_0_1; +REINDEX TABLE CONCURRENTLY concur_reindex_part_0_2; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid,refobjid,refobjsubid) as objref, + deptype +FROM pg_depend +WHERE classid = 'pg_class'::regclass AND + objid in ('concur_reindex_part'::regclass, + 'concur_reindex_part_0'::regclass, + 'concur_reindex_part_0_1'::regclass, + 'concur_reindex_part_0_2'::regclass, + 'concur_reindex_part_index'::regclass, + 'concur_reindex_part_index_0'::regclass, + 'concur_reindex_part_index_0_1'::regclass, + 'concur_reindex_part_index_0_2'::regclass) + ORDER BY 1, 2; +SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') + ORDER BY relid, level; + +-- REINDEX for partitioned indexes +-- REINDEX TABLE fails for partitioned indexes +-- Top-most parent index +REINDEX TABLE concur_reindex_part_index; -- error +REINDEX TABLE CONCURRENTLY concur_reindex_part_index; -- error +-- Partitioned index with no leaves +REINDEX TABLE concur_reindex_part_index_10; -- error +REINDEX TABLE CONCURRENTLY concur_reindex_part_index_10; -- error +-- Cannot run in a transaction block +BEGIN; +REINDEX INDEX concur_reindex_part_index; +ROLLBACK; +-- Helper functions to track changes of relfilenodes in a partition tree. +-- Create a table tracking the relfilenode state. +CREATE OR REPLACE FUNCTION create_relfilenode_part(relname text, indname text) + RETURNS VOID AS + $func$ + BEGIN + EXECUTE format(' + CREATE TABLE %I AS + SELECT oid, relname, relfilenode, relkind, reltoastrelid + FROM pg_class + WHERE oid IN + (SELECT relid FROM pg_partition_tree(''%I''));', + relname, indname); + END + $func$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION compare_relfilenode_part(tabname text) + RETURNS TABLE (relname name, relkind "char", state text) AS + $func$ + BEGIN + RETURN QUERY EXECUTE + format( + 'SELECT b.relname, + b.relkind, + CASE WHEN a.relfilenode = b.relfilenode THEN ''relfilenode is unchanged'' + ELSE ''relfilenode has changed'' END + -- Do not join with OID here as CONCURRENTLY changes it. + FROM %I b JOIN pg_class a ON b.relname = a.relname + ORDER BY 1;', tabname); + END + $func$ LANGUAGE plpgsql; +-- Check that expected relfilenodes are changed, non-concurrent case. +SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); +REINDEX INDEX concur_reindex_part_index; +SELECT * FROM compare_relfilenode_part('reindex_index_status'); +DROP TABLE reindex_index_status; +-- concurrent case. +SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); +REINDEX INDEX CONCURRENTLY concur_reindex_part_index; +SELECT * FROM compare_relfilenode_part('reindex_index_status'); +DROP TABLE reindex_index_status; + +-- REINDEX for partitioned tables +-- REINDEX INDEX fails for partitioned tables +-- Top-most parent +REINDEX INDEX concur_reindex_part; -- error +REINDEX INDEX CONCURRENTLY concur_reindex_part; -- error +-- Partitioned with no leaves +REINDEX INDEX concur_reindex_part_10; -- error +REINDEX INDEX CONCURRENTLY concur_reindex_part_10; -- error +-- Cannot run in a transaction block +BEGIN; +REINDEX TABLE concur_reindex_part; +ROLLBACK; +-- Check that expected relfilenodes are changed, non-concurrent case. +-- Note that the partition tree changes of the *indexes* need to be checked. +SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); +REINDEX TABLE concur_reindex_part; +SELECT * FROM compare_relfilenode_part('reindex_index_status'); +DROP TABLE reindex_index_status; +-- concurrent case. +SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); +REINDEX TABLE CONCURRENTLY concur_reindex_part; +SELECT * FROM compare_relfilenode_part('reindex_index_status'); +DROP TABLE reindex_index_status; + +DROP FUNCTION create_relfilenode_part; +DROP FUNCTION compare_relfilenode_part; + +-- Cleanup of partition tree used for REINDEX test. +DROP TABLE concur_reindex_part; + +-- Check errors +-- Cannot run inside a transaction block +BEGIN; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +COMMIT; +REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relation +REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index +-- These are the toast table and index of pg_authid. +REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1260; -- no catalog toast table +REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; -- no catalog toast index +REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM +-- Warns about catalog relations +REINDEX SCHEMA CONCURRENTLY pg_catalog; + +-- Check the relation status, there should not be invalid indexes +\d concur_reindex_tab +DROP MATERIALIZED VIEW concur_reindex_matview; +DROP TABLE concur_reindex_tab, concur_reindex_tab2, concur_reindex_tab3; + +-- Check handling of invalid indexes +CREATE TABLE concur_reindex_tab4 (c1 int); +INSERT INTO concur_reindex_tab4 VALUES (1), (1), (2); +-- This trick creates an invalid index. +CREATE UNIQUE INDEX CONCURRENTLY concur_reindex_ind5 ON concur_reindex_tab4 (c1); +-- Reindexing concurrently this index fails with the same failure. +-- The extra index created is itself invalid, and can be dropped. +REINDEX INDEX CONCURRENTLY concur_reindex_ind5; +\d concur_reindex_tab4 +DROP INDEX concur_reindex_ind5_ccnew; +-- This makes the previous failure go away, so the index can become valid. +DELETE FROM concur_reindex_tab4 WHERE c1 = 1; +-- The invalid index is not processed when running REINDEX TABLE. +REINDEX TABLE CONCURRENTLY concur_reindex_tab4; +\d concur_reindex_tab4 +-- But it is fixed with REINDEX INDEX. +REINDEX INDEX CONCURRENTLY concur_reindex_ind5; +\d concur_reindex_tab4 +DROP TABLE concur_reindex_tab4; + +-- Check handling of indexes with expressions and predicates. The +-- definitions of the rebuilt indexes should match the original +-- definitions. +CREATE TABLE concur_exprs_tab (c1 int , c2 boolean); +INSERT INTO concur_exprs_tab (c1, c2) VALUES (1369652450, FALSE), + (414515746, TRUE), + (897778963, FALSE); +CREATE UNIQUE INDEX concur_exprs_index_expr + ON concur_exprs_tab ((c1::text COLLATE "C")); +CREATE UNIQUE INDEX concur_exprs_index_pred ON concur_exprs_tab (c1) + WHERE (c1::text > 500000000::text COLLATE "C"); +CREATE UNIQUE INDEX concur_exprs_index_pred_2 + ON concur_exprs_tab ((1 / c1)) + WHERE ('-H') >= (c2::TEXT) COLLATE "C"; +ALTER INDEX concur_exprs_index_expr ALTER COLUMN 1 SET STATISTICS 100; +ANALYZE concur_exprs_tab; +SELECT starelid::regclass, count(*) FROM pg_statistic WHERE starelid IN ( + 'concur_exprs_index_expr'::regclass, + 'concur_exprs_index_pred'::regclass, + 'concur_exprs_index_pred_2'::regclass) + GROUP BY starelid ORDER BY starelid::regclass::text; +SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); +SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); +SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); +REINDEX TABLE CONCURRENTLY concur_exprs_tab; +SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); +SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); +SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); +-- ALTER TABLE recreates the indexes, which should keep their collations. +ALTER TABLE concur_exprs_tab ALTER c2 TYPE TEXT; +SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); +SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); +SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); +-- Statistics should remain intact. +SELECT starelid::regclass, count(*) FROM pg_statistic WHERE starelid IN ( + 'concur_exprs_index_expr'::regclass, + 'concur_exprs_index_pred'::regclass, + 'concur_exprs_index_pred_2'::regclass) + GROUP BY starelid ORDER BY starelid::regclass::text; +-- attstattarget should remain intact +SELECT attrelid::regclass, attnum, attstattarget + FROM pg_attribute WHERE attrelid IN ( + 'concur_exprs_index_expr'::regclass, + 'concur_exprs_index_pred'::regclass, + 'concur_exprs_index_pred_2'::regclass) + ORDER BY attrelid::regclass::text, attnum; +DROP TABLE concur_exprs_tab; + +-- Temporary tables and on-commit actions, where CONCURRENTLY is ignored. +-- ON COMMIT PRESERVE ROWS, the default. +CREATE TEMP TABLE concur_temp_tab_1 (c1 int, c2 text) + ON COMMIT PRESERVE ROWS; +INSERT INTO concur_temp_tab_1 VALUES (1, 'foo'), (2, 'bar'); +CREATE INDEX concur_temp_ind_1 ON concur_temp_tab_1(c2); +REINDEX TABLE CONCURRENTLY concur_temp_tab_1; +REINDEX INDEX CONCURRENTLY concur_temp_ind_1; +-- Still fails in transaction blocks +BEGIN; +REINDEX INDEX CONCURRENTLY concur_temp_ind_1; +COMMIT; +-- ON COMMIT DELETE ROWS +CREATE TEMP TABLE concur_temp_tab_2 (c1 int, c2 text) + ON COMMIT DELETE ROWS; +CREATE INDEX concur_temp_ind_2 ON concur_temp_tab_2(c2); +REINDEX TABLE CONCURRENTLY concur_temp_tab_2; +REINDEX INDEX CONCURRENTLY concur_temp_ind_2; +-- ON COMMIT DROP +BEGIN; +CREATE TEMP TABLE concur_temp_tab_3 (c1 int, c2 text) + ON COMMIT PRESERVE ROWS; +INSERT INTO concur_temp_tab_3 VALUES (1, 'foo'), (2, 'bar'); +CREATE INDEX concur_temp_ind_3 ON concur_temp_tab_3(c2); +-- Fails when running in a transaction +REINDEX INDEX CONCURRENTLY concur_temp_ind_3; +COMMIT; +-- REINDEX SCHEMA processes all temporary relations +CREATE TABLE reindex_temp_before AS +SELECT oid, relname, relfilenode, relkind, reltoastrelid + FROM pg_class + WHERE relname IN ('concur_temp_ind_1', 'concur_temp_ind_2'); +SELECT pg_my_temp_schema()::regnamespace as temp_schema_name \gset +REINDEX SCHEMA CONCURRENTLY :temp_schema_name; +SELECT b.relname, + b.relkind, + CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' + ELSE 'relfilenode has changed' END + FROM reindex_temp_before b JOIN pg_class a ON b.oid = a.oid + ORDER BY 1; +DROP TABLE concur_temp_tab_1, concur_temp_tab_2, reindex_temp_before; + +-- +-- REINDEX SCHEMA +-- +REINDEX SCHEMA schema_to_reindex; -- failure, schema does not exist +CREATE SCHEMA schema_to_reindex; +SET search_path = 'schema_to_reindex'; +CREATE TABLE table1(col1 SERIAL PRIMARY KEY); +INSERT INTO table1 SELECT generate_series(1,400); +CREATE TABLE table2(col1 SERIAL PRIMARY KEY, col2 TEXT NOT NULL); +INSERT INTO table2 SELECT generate_series(1,400), 'abc'; +CREATE INDEX ON table2(col2); +CREATE MATERIALIZED VIEW matview AS SELECT col1 FROM table2; +CREATE INDEX ON matview(col1); +CREATE VIEW view AS SELECT col2 FROM table2; +CREATE TABLE reindex_before AS +SELECT oid, relname, relfilenode, relkind, reltoastrelid + FROM pg_class + where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex'); +INSERT INTO reindex_before +SELECT oid, 'pg_toast_TABLE', relfilenode, relkind, reltoastrelid +FROM pg_class WHERE oid IN + (SELECT reltoastrelid FROM reindex_before WHERE reltoastrelid > 0); +INSERT INTO reindex_before +SELECT oid, 'pg_toast_TABLE_index', relfilenode, relkind, reltoastrelid +FROM pg_class where oid in + (select indexrelid from pg_index where indrelid in + (select reltoastrelid from reindex_before where reltoastrelid > 0)); +REINDEX SCHEMA schema_to_reindex; +CREATE TABLE reindex_after AS SELECT oid, relname, relfilenode, relkind + FROM pg_class + where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex'); +SELECT b.relname, + b.relkind, + CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' + ELSE 'relfilenode has changed' END + FROM reindex_before b JOIN pg_class a ON b.oid = a.oid + ORDER BY 1; +REINDEX SCHEMA schema_to_reindex; +BEGIN; +REINDEX SCHEMA schema_to_reindex; -- failure, cannot run in a transaction +END; + +-- concurrently +REINDEX SCHEMA CONCURRENTLY schema_to_reindex; + +-- Failure for unauthorized user +CREATE ROLE regress_reindexuser NOLOGIN; +SET SESSION ROLE regress_reindexuser; +REINDEX SCHEMA schema_to_reindex; +-- Permission failures with toast tables and indexes (pg_authid here) +RESET ROLE; +GRANT USAGE ON SCHEMA pg_toast TO regress_reindexuser; +SET SESSION ROLE regress_reindexuser; +REINDEX TABLE pg_toast.pg_toast_1260; +REINDEX INDEX pg_toast.pg_toast_1260_index; + +-- Clean up +RESET ROLE; +REVOKE USAGE ON SCHEMA pg_toast FROM regress_reindexuser; +DROP ROLE regress_reindexuser; +DROP SCHEMA schema_to_reindex CASCADE; diff --git a/src/test/singlenode_regress/sql/create_index_spgist.sql b/src/test/singlenode_regress/sql/create_index_spgist.sql new file mode 100644 index 00000000000..b126dae6299 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_index_spgist.sql @@ -0,0 +1,429 @@ +-- +-- SP-GiST index tests +-- + +CREATE TABLE quad_point_tbl AS + SELECT point(unique1,unique2) AS p FROM tenk1; + +INSERT INTO quad_point_tbl + SELECT '(333.0,400.0)'::point FROM generate_series(1,1000); + +INSERT INTO quad_point_tbl VALUES (NULL), (NULL), (NULL); + +CREATE INDEX sp_quad_ind ON quad_point_tbl USING spgist (p); + +CREATE TABLE kd_point_tbl AS SELECT * FROM quad_point_tbl; + +CREATE INDEX sp_kd_ind ON kd_point_tbl USING spgist (p kd_point_ops); + +CREATE TABLE radix_text_tbl AS + SELECT name AS t FROM road WHERE name !~ '^[0-9]'; + +INSERT INTO radix_text_tbl + SELECT 'P0123456789abcdef' FROM generate_series(1,1000); +INSERT INTO radix_text_tbl VALUES ('P0123456789abcde'); +INSERT INTO radix_text_tbl VALUES ('P0123456789abcdefF'); + +CREATE INDEX sp_radix_ind ON radix_text_tbl USING spgist (t); + +-- get non-indexed results for comparison purposes + +SET enable_seqscan = ON; +SET enable_indexscan = OFF; +SET enable_bitmapscan = OFF; + +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; + +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; + +SELECT count(*) FROM quad_point_tbl; + +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; + +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; + +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; + +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; + +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; + +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; + +CREATE TEMP TABLE quad_point_tbl_ord_seq1 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl; + +CREATE TEMP TABLE quad_point_tbl_ord_seq2 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + +CREATE TEMP TABLE quad_point_tbl_ord_seq3 AS +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM quad_point_tbl WHERE p IS NOT NULL; + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; + +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; + +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; + +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; + +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; + +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; + +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; + +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; + +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; + +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; + +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; + +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; + +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; + +-- Now check the results from plain indexscan +SET enable_seqscan = OFF; +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl; +SELECT count(*) FROM quad_point_tbl; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl; +CREATE TEMP TABLE quad_point_tbl_ord_idx1 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl; +SELECT * FROM quad_point_tbl_ord_seq1 seq FULL JOIN quad_point_tbl_ord_idx1 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +CREATE TEMP TABLE quad_point_tbl_ord_idx2 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +SELECT * FROM quad_point_tbl_ord_seq2 seq FULL JOIN quad_point_tbl_ord_idx2 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM quad_point_tbl WHERE p IS NOT NULL; +CREATE TEMP TABLE quad_point_tbl_ord_idx3 AS +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM quad_point_tbl WHERE p IS NOT NULL; +SELECT * FROM quad_point_tbl_ord_seq3 seq FULL JOIN quad_point_tbl_ord_idx3 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +SELECT count(*) FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE box '(200,200,1000,1000)' @> p; +SELECT count(*) FROM kd_point_tbl WHERE box '(200,200,1000,1000)' @> p; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p << '(5000, 4000)'; +SELECT count(*) FROM kd_point_tbl WHERE p << '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p >> '(5000, 4000)'; +SELECT count(*) FROM kd_point_tbl WHERE p >> '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p <<| '(5000, 4000)'; +SELECT count(*) FROM kd_point_tbl WHERE p <<| '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p |>> '(5000, 4000)'; +SELECT count(*) FROM kd_point_tbl WHERE p |>> '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p ~= '(4585, 365)'; +SELECT count(*) FROM kd_point_tbl WHERE p ~= '(4585, 365)'; + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM kd_point_tbl; +CREATE TEMP TABLE kd_point_tbl_ord_idx1 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM kd_point_tbl; +SELECT * FROM quad_point_tbl_ord_seq1 seq FULL JOIN kd_point_tbl_ord_idx1 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +CREATE TEMP TABLE kd_point_tbl_ord_idx2 AS +SELECT row_number() OVER (ORDER BY p <-> '0,0') n, p <-> '0,0' dist, p +FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +SELECT * FROM quad_point_tbl_ord_seq2 seq FULL JOIN kd_point_tbl_ord_idx2 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + +EXPLAIN (COSTS OFF) +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM kd_point_tbl WHERE p IS NOT NULL; +CREATE TEMP TABLE kd_point_tbl_ord_idx3 AS +SELECT row_number() OVER (ORDER BY p <-> '333,400') n, p <-> '333,400' dist, p +FROM kd_point_tbl WHERE p IS NOT NULL; +SELECT * FROM quad_point_tbl_ord_seq3 seq FULL JOIN kd_point_tbl_ord_idx3 idx +ON seq.n = idx.n +WHERE seq.dist IS DISTINCT FROM idx.dist; + +-- test KNN scan with included columns +-- the distance numbers are not exactly the same across platforms +SET extra_float_digits = 0; +CREATE INDEX ON quad_point_tbl_ord_seq1 USING spgist(p) INCLUDE(dist); +EXPLAIN (COSTS OFF) +SELECT p, dist FROM quad_point_tbl_ord_seq1 ORDER BY p <-> '0,0' LIMIT 10; +SELECT p, dist FROM quad_point_tbl_ord_seq1 ORDER BY p <-> '0,0' LIMIT 10; +RESET extra_float_digits; + +-- check ORDER BY distance to NULL +SELECT (SELECT p FROM kd_point_tbl ORDER BY p <-> pt, p <-> '0,0' LIMIT 1) +FROM (VALUES (point '1,2'), (NULL), ('1234,5678')) pts(pt); + + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; + +-- Now check the results from bitmap indexscan +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_bitmapscan = ON; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; +SELECT count(*) FROM quad_point_tbl WHERE p IS NULL; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; +SELECT count(*) FROM quad_point_tbl WHERE p IS NOT NULL; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl; +SELECT count(*) FROM quad_point_tbl; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +SELECT count(*) FROM quad_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; +SELECT count(*) FROM quad_point_tbl WHERE box '(200,200,1000,1000)' @> p; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; +SELECT count(*) FROM quad_point_tbl WHERE p << '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; +SELECT count(*) FROM quad_point_tbl WHERE p >> '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; +SELECT count(*) FROM quad_point_tbl WHERE p <<| '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; +SELECT count(*) FROM quad_point_tbl WHERE p |>> '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; +SELECT count(*) FROM quad_point_tbl WHERE p ~= '(4585, 365)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; +SELECT count(*) FROM kd_point_tbl WHERE p <@ box '(200,200,1000,1000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE box '(200,200,1000,1000)' @> p; +SELECT count(*) FROM kd_point_tbl WHERE box '(200,200,1000,1000)' @> p; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p << '(5000, 4000)'; +SELECT count(*) FROM kd_point_tbl WHERE p << '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p >> '(5000, 4000)'; +SELECT count(*) FROM kd_point_tbl WHERE p >> '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p <<| '(5000, 4000)'; +SELECT count(*) FROM kd_point_tbl WHERE p <<| '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p |>> '(5000, 4000)'; +SELECT count(*) FROM kd_point_tbl WHERE p |>> '(5000, 4000)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM kd_point_tbl WHERE p ~= '(4585, 365)'; +SELECT count(*) FROM kd_point_tbl WHERE p ~= '(4585, 365)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdef'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcde'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; +SELECT count(*) FROM radix_text_tbl WHERE t = 'P0123456789abcdefF'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t < 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t ~<~ 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t <= 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t ~<=~ 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; +SELECT count(*) FROM radix_text_tbl WHERE t = 'Aztec Ct '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t = 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t >= 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t ~>=~ 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t > 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; +SELECT count(*) FROM radix_text_tbl WHERE t ~>~ 'Worth St '; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; +SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/src/test/singlenode_regress/sql/create_misc.sql b/src/test/singlenode_regress/sql/create_misc.sql new file mode 100644 index 00000000000..c7d0d064c37 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_misc.sql @@ -0,0 +1,217 @@ +-- +-- CREATE_MISC +-- + +-- CLASS POPULATION +-- (any resemblance to real life is purely coincidental) +-- + +INSERT INTO tenk2 SELECT * FROM tenk1; + +CREATE TABLE onek2 AS SELECT * FROM onek; + +INSERT INTO fast_emp4000 SELECT * FROM slow_emp4000; + +SELECT * + INTO TABLE Bprime + FROM tenk1 + WHERE unique2 < 1000; + +INSERT INTO hobbies_r (name, person) + SELECT 'posthacking', p.name + FROM person* p + WHERE p.name = 'mike' or p.name = 'jeff'; + +INSERT INTO hobbies_r (name, person) + SELECT 'basketball', p.name + FROM person p + WHERE p.name = 'joe' or p.name = 'sally'; + +INSERT INTO hobbies_r (name) VALUES ('skywalking'); + +INSERT INTO equipment_r (name, hobby) VALUES ('advil', 'posthacking'); + +INSERT INTO equipment_r (name, hobby) VALUES ('peet''s coffee', 'posthacking'); + +INSERT INTO equipment_r (name, hobby) VALUES ('hightops', 'basketball'); + +INSERT INTO equipment_r (name, hobby) VALUES ('guts', 'skywalking'); + +INSERT INTO city VALUES +('Podunk', '(1,2),(3,4)', '100,127,1000'), +('Gotham', '(1000,34),(1100,334)', '123456,127,-1000,6789'); +TABLE city; + +SELECT * + INTO TABLE ramp + FROM road + WHERE name ~ '.*Ramp'; + +INSERT INTO ihighway + SELECT * + FROM road + WHERE name ~ 'I- .*'; + +INSERT INTO shighway + SELECT * + FROM road + WHERE name ~ 'State Hwy.*'; + +UPDATE shighway + SET surface = 'asphalt'; + +INSERT INTO a_star (class, a) VALUES ('a', 1); + +INSERT INTO a_star (class, a) VALUES ('a', 2); + +INSERT INTO a_star (class) VALUES ('a'); + +INSERT INTO b_star (class, a, b) VALUES ('b', 3, 'mumble'::text); + +INSERT INTO b_star (class, a) VALUES ('b', 4); + +INSERT INTO b_star (class, b) VALUES ('b', 'bumble'::text); + +INSERT INTO b_star (class) VALUES ('b'); + +INSERT INTO c_star (class, a, c) VALUES ('c', 5, 'hi mom'::name); + +INSERT INTO c_star (class, a) VALUES ('c', 6); + +INSERT INTO c_star (class, c) VALUES ('c', 'hi paul'::name); + +INSERT INTO c_star (class) VALUES ('c'); + +INSERT INTO d_star (class, a, b, c, d) + VALUES ('d', 7, 'grumble'::text, 'hi sunita'::name, '0.0'::float8); + +INSERT INTO d_star (class, a, b, c) + VALUES ('d', 8, 'stumble'::text, 'hi koko'::name); + +INSERT INTO d_star (class, a, b, d) + VALUES ('d', 9, 'rumble'::text, '1.1'::float8); + +INSERT INTO d_star (class, a, c, d) + VALUES ('d', 10, 'hi kristin'::name, '10.01'::float8); + +INSERT INTO d_star (class, b, c, d) + VALUES ('d', 'crumble'::text, 'hi boris'::name, '100.001'::float8); + +INSERT INTO d_star (class, a, b) + VALUES ('d', 11, 'fumble'::text); + +INSERT INTO d_star (class, a, c) + VALUES ('d', 12, 'hi avi'::name); + +INSERT INTO d_star (class, a, d) + VALUES ('d', 13, '1000.0001'::float8); + +INSERT INTO d_star (class, b, c) + VALUES ('d', 'tumble'::text, 'hi andrew'::name); + +INSERT INTO d_star (class, b, d) + VALUES ('d', 'humble'::text, '10000.00001'::float8); + +INSERT INTO d_star (class, c, d) + VALUES ('d', 'hi ginger'::name, '100000.000001'::float8); + +INSERT INTO d_star (class, a) VALUES ('d', 14); + +INSERT INTO d_star (class, b) VALUES ('d', 'jumble'::text); + +INSERT INTO d_star (class, c) VALUES ('d', 'hi jolly'::name); + +INSERT INTO d_star (class, d) VALUES ('d', '1000000.0000001'::float8); + +INSERT INTO d_star (class) VALUES ('d'); + +INSERT INTO e_star (class, a, c, e) + VALUES ('e', 15, 'hi carol'::name, '-1'::int2); + +INSERT INTO e_star (class, a, c) + VALUES ('e', 16, 'hi bob'::name); + +INSERT INTO e_star (class, a, e) + VALUES ('e', 17, '-2'::int2); + +INSERT INTO e_star (class, c, e) + VALUES ('e', 'hi michelle'::name, '-3'::int2); + +INSERT INTO e_star (class, a) + VALUES ('e', 18); + +INSERT INTO e_star (class, c) + VALUES ('e', 'hi elisa'::name); + +INSERT INTO e_star (class, e) + VALUES ('e', '-4'::int2); + +INSERT INTO f_star (class, a, c, e, f) + VALUES ('f', 19, 'hi claire'::name, '-5'::int2, '(1,3),(2,4)'::polygon); + +INSERT INTO f_star (class, a, c, e) + VALUES ('f', 20, 'hi mike'::name, '-6'::int2); + +INSERT INTO f_star (class, a, c, f) + VALUES ('f', 21, 'hi marcel'::name, '(11,44),(22,55),(33,66)'::polygon); + +INSERT INTO f_star (class, a, e, f) + VALUES ('f', 22, '-7'::int2, '(111,555),(222,666),(333,777),(444,888)'::polygon); + +INSERT INTO f_star (class, c, e, f) + VALUES ('f', 'hi keith'::name, '-8'::int2, + '(1111,3333),(2222,4444)'::polygon); + +INSERT INTO f_star (class, a, c) + VALUES ('f', 24, 'hi marc'::name); + +INSERT INTO f_star (class, a, e) + VALUES ('f', 25, '-9'::int2); + +INSERT INTO f_star (class, a, f) + VALUES ('f', 26, '(11111,33333),(22222,44444)'::polygon); + +INSERT INTO f_star (class, c, e) + VALUES ('f', 'hi allison'::name, '-10'::int2); + +INSERT INTO f_star (class, c, f) + VALUES ('f', 'hi jeff'::name, + '(111111,333333),(222222,444444)'::polygon); + +INSERT INTO f_star (class, e, f) + VALUES ('f', '-11'::int2, '(1111111,3333333),(2222222,4444444)'::polygon); + +INSERT INTO f_star (class, a) VALUES ('f', 27); + +INSERT INTO f_star (class, c) VALUES ('f', 'hi carl'::name); + +INSERT INTO f_star (class, e) VALUES ('f', '-12'::int2); + +INSERT INTO f_star (class, f) + VALUES ('f', '(11111111,33333333),(22222222,44444444)'::polygon); + +INSERT INTO f_star (class) VALUES ('f'); + +-- Analyze the X_star tables for better plan stability in later tests +ANALYZE a_star; +ANALYZE b_star; +ANALYZE c_star; +ANALYZE d_star; +ANALYZE e_star; +ANALYZE f_star; + + +-- +-- for internal portal (cursor) tests +-- +CREATE TABLE iportaltest ( + i int4, + d float4, + p polygon +); + +INSERT INTO iportaltest (i, d, p) + VALUES (1, 3.567, '(3.0,1.0),(4.0,2.0)'::polygon); + +INSERT INTO iportaltest (i, d, p) + VALUES (2, 89.05, '(4.0,2.0),(3.0,1.0)'::polygon); diff --git a/src/test/singlenode_regress/sql/create_operator.sql b/src/test/singlenode_regress/sql/create_operator.sql new file mode 100644 index 00000000000..4ff2c0ff216 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_operator.sql @@ -0,0 +1,234 @@ +-- +-- CREATE_OPERATOR +-- + +CREATE OPERATOR ## ( + leftarg = path, + rightarg = path, + function = path_inter, + commutator = ## +); + +CREATE OPERATOR <% ( + leftarg = point, + rightarg = widget, + procedure = pt_in_widget, + commutator = >% , + negator = >=% +); + +CREATE OPERATOR @#@ ( + rightarg = int8, -- prefix + procedure = factorial +); + +CREATE OPERATOR #%# ( + leftarg = int8, -- fail, postfix is no longer supported + procedure = factorial +); + +-- Test operator created above +SELECT point '(1,2)' <% widget '(0,0,3)' AS t, + point '(1,2)' <% widget '(0,0,1)' AS f; + +-- Test comments +COMMENT ON OPERATOR ###### (NONE, int4) IS 'bad prefix'; +COMMENT ON OPERATOR ###### (int4, NONE) IS 'bad postfix'; +COMMENT ON OPERATOR ###### (int4, int8) IS 'bad infix'; + +-- Check that DROP on a nonexistent op behaves sanely, too +DROP OPERATOR ###### (NONE, int4); +DROP OPERATOR ###### (int4, NONE); +DROP OPERATOR ###### (int4, int8); + +-- => is disallowed as an operator name now +CREATE OPERATOR => ( + rightarg = int8, + procedure = factorial +); + +-- lexing of <=, >=, <>, != has a number of edge cases +-- (=> is tested elsewhere) + +-- this is legal because ! is not allowed in sql ops +CREATE OPERATOR !=- ( + rightarg = int8, + procedure = factorial +); +SELECT !=- 10; +-- postfix operators don't work anymore +SELECT 10 !=-; +-- make sure lexer returns != as <> even in edge cases +SELECT 2 !=/**/ 1, 2 !=/**/ 2; +SELECT 2 !=-- comment to be removed by psql + 1; +DO $$ -- use DO to protect -- from psql + declare r boolean; + begin + execute $e$ select 2 !=-- comment + 1 $e$ into r; + raise info 'r = %', r; + end; +$$; + +-- check that <= etc. followed by more operator characters are returned +-- as the correct token with correct precedence +SELECT true<>-1 BETWEEN 1 AND 1; -- BETWEEN has prec. above <> but below Op +SELECT false<>/**/1 BETWEEN 1 AND 1; +SELECT false<=-1 BETWEEN 1 AND 1; +SELECT false>=-1 BETWEEN 1 AND 1; +SELECT 2<=/**/3, 3>=/**/2, 2<>/**/3; +SELECT 3<=/**/2, 2>=/**/3, 2<>/**/2; + +-- Should fail. CREATE OPERATOR requires USAGE on SCHEMA +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op1; +CREATE SCHEMA schema_op1; +GRANT USAGE ON SCHEMA schema_op1 TO PUBLIC; +REVOKE USAGE ON SCHEMA schema_op1 FROM regress_rol_op1; +SET ROLE regress_rol_op1; +CREATE OPERATOR schema_op1.#*# ( + rightarg = int8, + procedure = factorial +); +ROLLBACK; + + +-- Should fail. SETOF type functions not allowed as argument (testing leftarg) +BEGIN TRANSACTION; +CREATE OPERATOR #*# ( + leftarg = SETOF int8, + procedure = factorial +); +ROLLBACK; + + +-- Should fail. SETOF type functions not allowed as argument (testing rightarg) +BEGIN TRANSACTION; +CREATE OPERATOR #*# ( + rightarg = SETOF int8, + procedure = factorial +); +ROLLBACK; + + +-- Should work. Sample text-book case +BEGIN TRANSACTION; +CREATE OR REPLACE FUNCTION fn_op2(boolean, boolean) +RETURNS boolean AS $$ + SELECT NULL::BOOLEAN; +$$ LANGUAGE sql IMMUTABLE; +CREATE OPERATOR === ( + LEFTARG = boolean, + RIGHTARG = boolean, + PROCEDURE = fn_op2, + COMMUTATOR = ===, + NEGATOR = !==, + RESTRICT = contsel, + JOIN = contjoinsel, + SORT1, SORT2, LTCMP, GTCMP, HASHES, MERGES +); +ROLLBACK; + +-- Should fail. Invalid attribute +CREATE OPERATOR #@%# ( + rightarg = int8, + procedure = factorial, + invalid_att = int8 +); + +-- Should fail. At least rightarg should be mandatorily specified +CREATE OPERATOR #@%# ( + procedure = factorial +); + +-- Should fail. Procedure should be mandatorily specified +CREATE OPERATOR #@%# ( + rightarg = int8 +); + +-- Should fail. CREATE OPERATOR requires USAGE on TYPE +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op3; +CREATE TYPE type_op3 AS ENUM ('new', 'open', 'closed'); +CREATE FUNCTION fn_op3(type_op3, int8) +RETURNS int8 AS $$ + SELECT NULL::int8; +$$ LANGUAGE sql IMMUTABLE; +REVOKE USAGE ON TYPE type_op3 FROM regress_rol_op3; +REVOKE USAGE ON TYPE type_op3 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC +SET ROLE regress_rol_op3; +CREATE OPERATOR #*# ( + leftarg = type_op3, + rightarg = int8, + procedure = fn_op3 +); +ROLLBACK; + +-- Should fail. CREATE OPERATOR requires USAGE on TYPE (need to check separately for rightarg) +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op4; +CREATE TYPE type_op4 AS ENUM ('new', 'open', 'closed'); +CREATE FUNCTION fn_op4(int8, type_op4) +RETURNS int8 AS $$ + SELECT NULL::int8; +$$ LANGUAGE sql IMMUTABLE; +REVOKE USAGE ON TYPE type_op4 FROM regress_rol_op4; +REVOKE USAGE ON TYPE type_op4 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC +SET ROLE regress_rol_op4; +CREATE OPERATOR #*# ( + leftarg = int8, + rightarg = type_op4, + procedure = fn_op4 +); +ROLLBACK; + +-- Should fail. CREATE OPERATOR requires EXECUTE on function +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op5; +CREATE TYPE type_op5 AS ENUM ('new', 'open', 'closed'); +CREATE FUNCTION fn_op5(int8, int8) +RETURNS int8 AS $$ + SELECT NULL::int8; +$$ LANGUAGE sql IMMUTABLE; +REVOKE EXECUTE ON FUNCTION fn_op5(int8, int8) FROM regress_rol_op5; +REVOKE EXECUTE ON FUNCTION fn_op5(int8, int8) FROM PUBLIC;-- Need to do this so that regress_rol_op3 is not allowed EXECUTE via PUBLIC +SET ROLE regress_rol_op5; +CREATE OPERATOR #*# ( + leftarg = int8, + rightarg = int8, + procedure = fn_op5 +); +ROLLBACK; + +-- Should fail. CREATE OPERATOR requires USAGE on return TYPE +BEGIN TRANSACTION; +CREATE ROLE regress_rol_op6; +CREATE TYPE type_op6 AS ENUM ('new', 'open', 'closed'); +CREATE FUNCTION fn_op6(int8, int8) +RETURNS type_op6 AS $$ + SELECT NULL::type_op6; +$$ LANGUAGE sql IMMUTABLE; +REVOKE USAGE ON TYPE type_op6 FROM regress_rol_op6; +REVOKE USAGE ON TYPE type_op6 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC +SET ROLE regress_rol_op6; +CREATE OPERATOR #*# ( + leftarg = int8, + rightarg = int8, + procedure = fn_op6 +); +ROLLBACK; + +-- invalid: non-lowercase quoted identifiers +CREATE OPERATOR === +( + "Leftarg" = box, + "Rightarg" = box, + "Procedure" = area_equal_function, + "Commutator" = ===, + "Negator" = !==, + "Restrict" = area_restriction_function, + "Join" = area_join_function, + "Hashes", + "Merges" +); diff --git a/src/test/singlenode_regress/sql/create_procedure.sql b/src/test/singlenode_regress/sql/create_procedure.sql new file mode 100644 index 00000000000..75cc0fcf2a6 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_procedure.sql @@ -0,0 +1,253 @@ +CALL nonexistent(); -- error +CALL random(); -- error + +CREATE FUNCTION cp_testfunc1(a int) RETURNS int LANGUAGE SQL AS $$ SELECT a $$; + +CREATE TABLE cp_test (a int, b text); + +CREATE PROCEDURE ptest1(x text) +LANGUAGE SQL +AS $$ +INSERT INTO cp_test VALUES (1, x); +$$; + +\df ptest1 +SELECT pg_get_functiondef('ptest1'::regproc); + +-- show only normal functions +\dfn public.*test*1 + +-- show only procedures +\dfp public.*test*1 + +SELECT ptest1('x'); -- error +CALL ptest1('a'); -- ok +CALL ptest1('xy' || 'zzy'); -- ok, constant-folded arg +CALL ptest1(substring(random()::numeric(20,15)::text, 1, 1)); -- ok, volatile arg + +SELECT * FROM cp_test ORDER BY b COLLATE "C"; + + +-- SQL-standard body +CREATE PROCEDURE ptest1s(x text) +LANGUAGE SQL +BEGIN ATOMIC + INSERT INTO cp_test VALUES (1, x); +END; + +\df ptest1s +SELECT pg_get_functiondef('ptest1s'::regproc); + +CALL ptest1s('b'); + +SELECT * FROM cp_test ORDER BY b COLLATE "C"; + +-- utitlity functions currently not supported here +CREATE PROCEDURE ptestx() +LANGUAGE SQL +BEGIN ATOMIC + CREATE TABLE x (a int); +END; + + +CREATE PROCEDURE ptest2() +LANGUAGE SQL +AS $$ +SELECT 5; +$$; + +CALL ptest2(); + + +-- nested CALL +TRUNCATE cp_test; + +CREATE PROCEDURE ptest3(y text) +LANGUAGE SQL +AS $$ +CALL ptest1(y); +CALL ptest1($1); +$$; + +CALL ptest3('b'); + +SELECT * FROM cp_test; + + +-- output arguments + +CREATE PROCEDURE ptest4a(INOUT a int, INOUT b int) +LANGUAGE SQL +AS $$ +SELECT 1, 2; +$$; + +CALL ptest4a(NULL, NULL); + +CREATE PROCEDURE ptest4b(INOUT b int, INOUT a int) +LANGUAGE SQL +AS $$ +CALL ptest4a(a, b); -- error, not supported +$$; + +DROP PROCEDURE ptest4a; + + +-- named and default parameters + +CREATE OR REPLACE PROCEDURE ptest5(a int, b text, c int default 100) +LANGUAGE SQL +AS $$ +INSERT INTO cp_test VALUES(a, b); +INSERT INTO cp_test VALUES(c, b); +$$; + +TRUNCATE cp_test; + +CALL ptest5(10, 'Hello', 20); +CALL ptest5(10, 'Hello'); +CALL ptest5(10, b => 'Hello'); +CALL ptest5(b => 'Hello', a => 10); + +SELECT * FROM cp_test; + + +-- polymorphic types + +CREATE PROCEDURE ptest6(a int, b anyelement) +LANGUAGE SQL +AS $$ +SELECT NULL::int; +$$; + +CALL ptest6(1, 2); + + +-- collation assignment + +CREATE PROCEDURE ptest7(a text, b text) +LANGUAGE SQL +AS $$ +SELECT a = b; +$$; + +CALL ptest7(least('a', 'b'), 'a'); + + +-- empty body +CREATE PROCEDURE ptest8(x text) +BEGIN ATOMIC +END; + +\df ptest8 +SELECT pg_get_functiondef('ptest8'::regproc); +CALL ptest8(''); + + +-- OUT parameters + +CREATE PROCEDURE ptest9(OUT a int) +LANGUAGE SQL +AS $$ +INSERT INTO cp_test VALUES (1, 'a'); +SELECT 1; +$$; + +-- standard way to do a call: +CALL ptest9(NULL); +-- you can write an expression, but it's not evaluated +CALL ptest9(1/0); -- no error +-- ... and it had better match the type of the parameter +CALL ptest9(1./0.); -- error + +-- check named-parameter matching +CREATE PROCEDURE ptest10(OUT a int, IN b int, IN c int) +LANGUAGE SQL AS $$ SELECT b - c $$; + +CALL ptest10(null, 7, 4); +CALL ptest10(a => null, b => 8, c => 2); +CALL ptest10(null, 7, c => 2); +CALL ptest10(null, c => 4, b => 11); +CALL ptest10(b => 8, c => 2, a => 0); + +CREATE PROCEDURE ptest11(a OUT int, VARIADIC b int[]) LANGUAGE SQL + AS $$ SELECT b[1] + b[2] $$; + +CALL ptest11(null, 11, 12, 13); + +-- check resolution of ambiguous DROP commands + +CREATE PROCEDURE ptest10(IN a int, IN b int, IN c int) +LANGUAGE SQL AS $$ SELECT a + b - c $$; + +\df ptest10 + +drop procedure ptest10; -- fail +drop procedure ptest10(int, int, int); -- fail +begin; +drop procedure ptest10(out int, int, int); +\df ptest10 +drop procedure ptest10(int, int, int); -- now this would work +rollback; +begin; +drop procedure ptest10(in int, int, int); +\df ptest10 +drop procedure ptest10(int, int, int); -- now this would work +rollback; + +-- various error cases + +CALL version(); -- error: not a procedure +CALL sum(1); -- error: not a procedure + +CREATE PROCEDURE ptestx() LANGUAGE SQL WINDOW AS $$ INSERT INTO cp_test VALUES (1, 'a') $$; +CREATE PROCEDURE ptestx() LANGUAGE SQL STRICT AS $$ INSERT INTO cp_test VALUES (1, 'a') $$; +CREATE PROCEDURE ptestx(a VARIADIC int[], b OUT int) LANGUAGE SQL + AS $$ SELECT a[1] $$; +CREATE PROCEDURE ptestx(a int DEFAULT 42, b OUT int) LANGUAGE SQL + AS $$ SELECT a $$; + +ALTER PROCEDURE ptest1(text) STRICT; +ALTER FUNCTION ptest1(text) VOLATILE; -- error: not a function +ALTER PROCEDURE cp_testfunc1(int) VOLATILE; -- error: not a procedure +ALTER PROCEDURE nonexistent() VOLATILE; + +DROP FUNCTION ptest1(text); -- error: not a function +DROP PROCEDURE cp_testfunc1(int); -- error: not a procedure +DROP PROCEDURE nonexistent(); + + +-- privileges + +CREATE USER regress_cp_user1; +GRANT INSERT ON cp_test TO regress_cp_user1; +REVOKE EXECUTE ON PROCEDURE ptest1(text) FROM PUBLIC; +SET ROLE regress_cp_user1; +CALL ptest1('a'); -- error +RESET ROLE; +GRANT EXECUTE ON PROCEDURE ptest1(text) TO regress_cp_user1; +SET ROLE regress_cp_user1; +CALL ptest1('a'); -- ok +RESET ROLE; + + +-- ROUTINE syntax + +ALTER ROUTINE cp_testfunc1(int) RENAME TO cp_testfunc1a; +ALTER ROUTINE cp_testfunc1a RENAME TO cp_testfunc1; + +ALTER ROUTINE ptest1(text) RENAME TO ptest1a; +ALTER ROUTINE ptest1a RENAME TO ptest1; + +DROP ROUTINE cp_testfunc1(int); + + +-- cleanup + +DROP PROCEDURE ptest1; +DROP PROCEDURE ptest1s; +DROP PROCEDURE ptest2; + +DROP TABLE cp_test; + +DROP USER regress_cp_user1; diff --git a/src/test/singlenode_regress/sql/create_table.sql b/src/test/singlenode_regress/sql/create_table.sql new file mode 100644 index 00000000000..fa2e6842d58 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_table.sql @@ -0,0 +1,982 @@ +-- +-- CREATE_TABLE +-- + +-- +-- CLASS DEFINITIONS +-- +CREATE TABLE hobbies_r ( + name text, + person text +); + +CREATE TABLE equipment_r ( + name text, + hobby text +); + +CREATE TABLE onek ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); + +CREATE TABLE tenk1 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); + +CREATE TABLE tenk2 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); + + +CREATE TABLE person ( + name text, + age int4, + location point +); + + +CREATE TABLE emp ( + salary int4, + manager name +) INHERITS (person); + + +CREATE TABLE student ( + gpa float8 +) INHERITS (person); + + +CREATE TABLE stud_emp ( + percent int4 +) INHERITS (emp, student); + + +CREATE TABLE city ( + name name, + location box, + budget city_budget +); + +CREATE TABLE dept ( + dname name, + mgrname text +); + +CREATE TABLE slow_emp4000 ( + home_base box +); + +CREATE TABLE fast_emp4000 ( + home_base box +); + +CREATE TABLE road ( + name text, + thepath path +); + +CREATE TABLE ihighway () INHERITS (road); + +CREATE TABLE shighway ( + surface text +) INHERITS (road); + +CREATE TABLE real_city ( + pop int4, + cname text, + outline path +); + +-- +-- test the "star" operators a bit more thoroughly -- this time, +-- throw in lots of NULL fields... +-- +-- a is the type root +-- b and c inherit from a (one-level single inheritance) +-- d inherits from b and c (two-level multiple inheritance) +-- e inherits from c (two-level single inheritance) +-- f inherits from e (three-level single inheritance) +-- +CREATE TABLE a_star ( + class char, + a int4 +); + +CREATE TABLE b_star ( + b text +) INHERITS (a_star); + +CREATE TABLE c_star ( + c name +) INHERITS (a_star); + +CREATE TABLE d_star ( + d float8 +) INHERITS (b_star, c_star); + +CREATE TABLE e_star ( + e int2 +) INHERITS (c_star); + +CREATE TABLE f_star ( + f polygon +) INHERITS (e_star); + +CREATE TABLE aggtest ( + a int2, + b float4 +); + +CREATE TABLE hash_i4_heap ( + seqno int4, + random int4 +); + +CREATE TABLE hash_name_heap ( + seqno int4, + random name +); + +CREATE TABLE hash_txt_heap ( + seqno int4, + random text +); + +CREATE TABLE hash_f8_heap ( + seqno int4, + random float8 +); + +-- don't include the hash_ovfl_heap stuff in the distribution +-- the data set is too large for what it's worth +-- +-- CREATE TABLE hash_ovfl_heap ( +-- x int4, +-- y int4 +-- ); + +CREATE TABLE bt_i4_heap ( + seqno int4, + random int4 +); + +CREATE TABLE bt_name_heap ( + seqno name, + random int4 +); + +CREATE TABLE bt_txt_heap ( + seqno text, + random int4 +); + +CREATE TABLE bt_f8_heap ( + seqno float8, + random int4 +); + +CREATE TABLE array_op_test ( + seqno int4, + i int4[], + t text[] +); + +CREATE TABLE array_index_op_test ( + seqno int4, + i int4[], + t text[] +); + +CREATE TABLE testjsonb ( + j jsonb +); + +CREATE TABLE unknowntab ( + u unknown -- fail +); + +CREATE TYPE unknown_comptype AS ( + u unknown -- fail +); + +CREATE TABLE IF NOT EXISTS test_tsvector( + t text, + a tsvector +); + +CREATE TABLE IF NOT EXISTS test_tsvector( + t text +); + +-- invalid: non-lowercase quoted reloptions identifiers +CREATE TABLE tas_case WITH ("Fillfactor" = 10) AS SELECT 1 a; + +CREATE UNLOGGED TABLE unlogged1 (a int primary key); -- OK +CREATE TEMPORARY TABLE unlogged2 (a int primary key); -- OK +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged\d' ORDER BY relname; +REINDEX INDEX unlogged1_pkey; +REINDEX INDEX unlogged2_pkey; +SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged\d' ORDER BY relname; +DROP TABLE unlogged2; +INSERT INTO unlogged1 VALUES (42); +CREATE UNLOGGED TABLE public.unlogged2 (a int primary key); -- also OK +CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int primary key); -- not OK +CREATE TABLE pg_temp.implicitly_temp (a int primary key); -- OK +CREATE TEMP TABLE explicitly_temp (a int primary key); -- also OK +CREATE TEMP TABLE pg_temp.doubly_temp (a int primary key); -- also OK +CREATE TEMP TABLE public.temp_to_perm (a int primary key); -- not OK +DROP TABLE unlogged1, public.unlogged2; + +CREATE TABLE as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r'; +CREATE TABLE as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r'; +CREATE TABLE IF NOT EXISTS as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r'; +DROP TABLE as_select1; + +PREPARE select1 AS SELECT 1 as a; +CREATE TABLE as_select1 AS EXECUTE select1; +CREATE TABLE as_select1 AS EXECUTE select1; +SELECT * FROM as_select1; +CREATE TABLE IF NOT EXISTS as_select1 AS EXECUTE select1; +DROP TABLE as_select1; +DEALLOCATE select1; + +-- create an extra wide table to test for issues related to that +-- (temporarily hide query, to avoid the long CREATE TABLE stmt) +\set ECHO none +SELECT 'CREATE TABLE extra_wide_table(firstc text, '|| array_to_string(array_agg('c'||i||' bool'),',')||', lastc text);' +FROM generate_series(1, 1100) g(i) +\gexec +\set ECHO all +INSERT INTO extra_wide_table(firstc, lastc) VALUES('first col', 'last col'); +SELECT firstc, lastc FROM extra_wide_table; + +-- check that tables with oids cannot be created anymore +CREATE TABLE withoid() WITH OIDS; +CREATE TABLE withoid() WITH (oids); +CREATE TABLE withoid() WITH (oids = true); + +-- but explicitly not adding oids is still supported +CREATE TEMP TABLE withoutoid() WITHOUT OIDS; DROP TABLE withoutoid; +CREATE TEMP TABLE withoutoid() WITH (oids = false); DROP TABLE withoutoid; + +-- check restriction with default expressions +-- invalid use of column reference in default expressions +CREATE TABLE default_expr_column (id int DEFAULT (id)); +CREATE TABLE default_expr_column (id int DEFAULT (bar.id)); +CREATE TABLE default_expr_agg_column (id int DEFAULT (avg(id))); +-- invalid column definition +CREATE TABLE default_expr_non_column (a int DEFAULT (avg(non_existent))); +-- invalid use of aggregate +CREATE TABLE default_expr_agg (a int DEFAULT (avg(1))); +-- invalid use of subquery +CREATE TABLE default_expr_agg (a int DEFAULT (select 1)); +-- invalid use of set-returning function +CREATE TABLE default_expr_agg (a int DEFAULT (generate_series(1,3))); + +-- Verify that subtransaction rollback restores rd_createSubid. +BEGIN; +CREATE TABLE remember_create_subid (c int); +SAVEPOINT q; DROP TABLE remember_create_subid; ROLLBACK TO q; +COMMIT; +DROP TABLE remember_create_subid; + +-- Verify that subtransaction rollback restores rd_firstRelfilenodeSubid. +CREATE TABLE remember_node_subid (c int); +BEGIN; +ALTER TABLE remember_node_subid ALTER c TYPE bigint; +SAVEPOINT q; DROP TABLE remember_node_subid; ROLLBACK TO q; +COMMIT; +DROP TABLE remember_node_subid; + +-- +-- Partitioned tables +-- + +-- cannot combine INHERITS and PARTITION BY (although grammar allows) +CREATE TABLE partitioned ( + a int +) INHERITS (some_table) PARTITION BY LIST (a); + +-- cannot use more than 1 column as partition key for list partitioned table +CREATE TABLE partitioned ( + a1 int, + a2 int +) PARTITION BY LIST (a1, a2); -- fail + +-- unsupported constraint type for partitioned tables +CREATE TABLE partitioned ( + a int, + EXCLUDE USING gist (a WITH &&) +) PARTITION BY RANGE (a); + +-- prevent using prohibited expressions in the key +CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (retset(a)); +DROP FUNCTION retset(int); + +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE ((avg(a))); + +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE ((avg(a) OVER (PARTITION BY b))); + +CREATE TABLE partitioned ( + a int +) PARTITION BY LIST ((a LIKE (SELECT 1))); + +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE ((42)); + +CREATE FUNCTION const_func () RETURNS int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (const_func()); +DROP FUNCTION const_func(); + +-- only accept valid partitioning strategy +CREATE TABLE partitioned ( + a int +) PARTITION BY MAGIC (a); + +-- specified column must be present in the table +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (b); + +-- cannot use system columns in partition key +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (xmin); + +-- cannot use pseudotypes +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (((a, b))); +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (a, ('unknown')); + +-- functions in key must be immutable +CREATE FUNCTION immut_func (a int) RETURNS int AS $$ SELECT a + random()::int; $$ LANGUAGE SQL; +CREATE TABLE partitioned ( + a int +) PARTITION BY RANGE (immut_func(a)); +DROP FUNCTION immut_func(int); + +-- prevent using columns of unsupported types in key (type must have a btree operator class) +CREATE TABLE partitioned ( + a point +) PARTITION BY LIST (a); +CREATE TABLE partitioned ( + a point +) PARTITION BY LIST (a point_ops); +CREATE TABLE partitioned ( + a point +) PARTITION BY RANGE (a); +CREATE TABLE partitioned ( + a point +) PARTITION BY RANGE (a point_ops); + +-- cannot add NO INHERIT constraints to partitioned tables +CREATE TABLE partitioned ( + a int, + CONSTRAINT check_a CHECK (a > 0) NO INHERIT +) PARTITION BY RANGE (a); + +-- some checks after successful creation of a partitioned table +CREATE FUNCTION plusone(a int) RETURNS INT AS $$ SELECT a+1; $$ LANGUAGE SQL; + +CREATE TABLE partitioned ( + a int, + b int, + c text, + d text +) PARTITION BY RANGE (a oid_ops, plusone(b), c collate "default", d collate "C"); + +-- check relkind +SELECT relkind FROM pg_class WHERE relname = 'partitioned'; + +-- prevent a function referenced in partition key from being dropped +DROP FUNCTION plusone(int); + +-- partitioned table cannot participate in regular inheritance +CREATE TABLE partitioned2 ( + a int, + b text +) PARTITION BY RANGE ((a+1), substr(b, 1, 5)); +CREATE TABLE fail () INHERITS (partitioned2); + +-- Partition key in describe output +\d partitioned +\d+ partitioned2 + +INSERT INTO partitioned2 VALUES (1, 'hello'); +CREATE TABLE part2_1 PARTITION OF partitioned2 FOR VALUES FROM (-1, 'aaaaa') TO (100, 'ccccc'); +\d+ part2_1 + +DROP TABLE partitioned, partitioned2; + +-- check reference to partitioned table's rowtype in partition descriptor +create table partitioned (a int, b int) + partition by list ((row(a, b)::partitioned)); +create table partitioned1 + partition of partitioned for values in ('(1,2)'::partitioned); +create table partitioned2 + partition of partitioned for values in ('(2,4)'::partitioned); +explain (costs off) +select * from partitioned where row(a,b)::partitioned = '(1,2)'::partitioned; +drop table partitioned; + +-- whole-row Var in partition key works too +create table partitioned (a int, b int) + partition by list ((partitioned)); +create table partitioned1 + partition of partitioned for values in ('(1,2)'); +create table partitioned2 + partition of partitioned for values in ('(2,4)'); +explain (costs off) +select * from partitioned where partitioned = '(1,2)'::partitioned; +\d+ partitioned1 +drop table partitioned; + +-- check that dependencies of partition columns are handled correctly +create domain intdom1 as int; + +create table partitioned ( + a intdom1, + b text +) partition by range (a); + +alter table partitioned drop column a; -- fail + +drop domain intdom1; -- fail, requires cascade + +drop domain intdom1 cascade; + +table partitioned; -- gone + +-- likewise for columns used in partition expressions +create domain intdom1 as int; + +create table partitioned ( + a intdom1, + b text +) partition by range (plusone(a)); + +alter table partitioned drop column a; -- fail + +drop domain intdom1; -- fail, requires cascade + +drop domain intdom1 cascade; + +table partitioned; -- gone + + +-- +-- Partitions +-- + +-- check partition bound syntax + +CREATE TABLE list_parted ( + a int +) PARTITION BY LIST (a); +CREATE TABLE part_p1 PARTITION OF list_parted FOR VALUES IN ('1'); +CREATE TABLE part_p2 PARTITION OF list_parted FOR VALUES IN (2); +CREATE TABLE part_p3 PARTITION OF list_parted FOR VALUES IN ((2+1)); +CREATE TABLE part_null PARTITION OF list_parted FOR VALUES IN (null); +\d+ list_parted + +-- forbidden expressions for partition bound with list partitioned table +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (somename); +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (somename.somename); +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (a); +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (sum(a)); +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (sum(somename)); +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (sum(1)); +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN ((select 1)); +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN (generate_series(4, 6)); +CREATE TABLE part_bogus_expr_fail PARTITION OF list_parted FOR VALUES IN ((1+1) collate "POSIX"); + +-- syntax does not allow empty list of values for list partitions +CREATE TABLE fail_part PARTITION OF list_parted FOR VALUES IN (); +-- trying to specify range for list partitioned table +CREATE TABLE fail_part PARTITION OF list_parted FOR VALUES FROM (1) TO (2); +-- trying to specify modulus and remainder for list partitioned table +CREATE TABLE fail_part PARTITION OF list_parted FOR VALUES WITH (MODULUS 10, REMAINDER 1); + +-- check default partition cannot be created more than once +CREATE TABLE part_default PARTITION OF list_parted DEFAULT; +CREATE TABLE fail_default_part PARTITION OF list_parted DEFAULT; + +-- specified literal can't be cast to the partition column data type +CREATE TABLE bools ( + a bool +) PARTITION BY LIST (a); +CREATE TABLE bools_true PARTITION OF bools FOR VALUES IN (1); +DROP TABLE bools; + +-- specified literal can be cast, and the cast might not be immutable +CREATE TABLE moneyp ( + a money +) PARTITION BY LIST (a); +CREATE TABLE moneyp_10 PARTITION OF moneyp FOR VALUES IN (10); +CREATE TABLE moneyp_11 PARTITION OF moneyp FOR VALUES IN ('11'); +CREATE TABLE moneyp_12 PARTITION OF moneyp FOR VALUES IN (to_char(12, '99')::int); +DROP TABLE moneyp; + +-- cast is immutable +CREATE TABLE bigintp ( + a bigint +) PARTITION BY LIST (a); +CREATE TABLE bigintp_10 PARTITION OF bigintp FOR VALUES IN (10); +-- fails due to overlap: +CREATE TABLE bigintp_10_2 PARTITION OF bigintp FOR VALUES IN ('10'); +DROP TABLE bigintp; + +CREATE TABLE range_parted ( + a date +) PARTITION BY RANGE (a); + +-- forbidden expressions for partition bounds with range partitioned table +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (somename) TO ('2019-01-01'); +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (somename.somename) TO ('2019-01-01'); +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (a) TO ('2019-01-01'); +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (max(a)) TO ('2019-01-01'); +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (max(somename)) TO ('2019-01-01'); +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (max('2019-02-01'::date)) TO ('2019-01-01'); +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM ((select 1)) TO ('2019-01-01'); +CREATE TABLE part_bogus_expr_fail PARTITION OF range_parted + FOR VALUES FROM (generate_series(1, 3)) TO ('2019-01-01'); + +-- trying to specify list for range partitioned table +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES IN ('a'); +-- trying to specify modulus and remainder for range partitioned table +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES WITH (MODULUS 10, REMAINDER 1); +-- each of start and end bounds must have same number of values as the +-- length of the partition key +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES FROM ('a', 1) TO ('z'); +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES FROM ('a') TO ('z', 1); + +-- cannot specify null values in range bounds +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES FROM (null) TO (maxvalue); + +-- trying to specify modulus and remainder for range partitioned table +CREATE TABLE fail_part PARTITION OF range_parted FOR VALUES WITH (MODULUS 10, REMAINDER 1); + +-- check partition bound syntax for the hash partition +CREATE TABLE hash_parted ( + a int +) PARTITION BY HASH (a); +CREATE TABLE hpart_1 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 10, REMAINDER 0); +CREATE TABLE hpart_2 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 50, REMAINDER 1); +CREATE TABLE hpart_3 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 200, REMAINDER 2); +CREATE TABLE hpart_4 PARTITION OF hash_parted FOR VALUES WITH (MODULUS 10, REMAINDER 3); +-- modulus 25 is factor of modulus of 50 but 10 is not a factor of 25. +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES WITH (MODULUS 25, REMAINDER 3); +-- previous modulus 50 is factor of 150 but this modulus is not a factor of next modulus 200. +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES WITH (MODULUS 150, REMAINDER 3); +-- overlapping remainders +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES WITH (MODULUS 100, REMAINDER 3); +-- trying to specify range for the hash partitioned table +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES FROM ('a', 1) TO ('z'); +-- trying to specify list value for the hash partitioned table +CREATE TABLE fail_part PARTITION OF hash_parted FOR VALUES IN (1000); + +-- trying to create default partition for the hash partitioned table +CREATE TABLE fail_default_part PARTITION OF hash_parted DEFAULT; + +-- check if compatible with the specified parent + +-- cannot create as partition of a non-partitioned table +CREATE TABLE unparted ( + a int +); +CREATE TABLE fail_part PARTITION OF unparted FOR VALUES IN ('a'); +CREATE TABLE fail_part PARTITION OF unparted FOR VALUES WITH (MODULUS 2, REMAINDER 1); +DROP TABLE unparted; + +-- cannot create a permanent rel as partition of a temp rel +CREATE TEMP TABLE temp_parted ( + a int +) PARTITION BY LIST (a); +CREATE TABLE fail_part PARTITION OF temp_parted FOR VALUES IN ('a'); +DROP TABLE temp_parted; + +-- check for partition bound overlap and other invalid specifications + +CREATE TABLE list_parted2 ( + a varchar +) PARTITION BY LIST (a); +CREATE TABLE part_null_z PARTITION OF list_parted2 FOR VALUES IN (null, 'z'); +CREATE TABLE part_ab PARTITION OF list_parted2 FOR VALUES IN ('a', 'b'); +CREATE TABLE list_parted2_def PARTITION OF list_parted2 DEFAULT; + +CREATE TABLE fail_part PARTITION OF list_parted2 FOR VALUES IN (null); +CREATE TABLE fail_part PARTITION OF list_parted2 FOR VALUES IN ('b', 'c'); +-- check default partition overlap +INSERT INTO list_parted2 VALUES('X'); +CREATE TABLE fail_part PARTITION OF list_parted2 FOR VALUES IN ('W', 'X', 'Y'); + +CREATE TABLE range_parted2 ( + a int +) PARTITION BY RANGE (a); + +-- trying to create range partition with empty range +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (1) TO (0); +-- note that the range '[1, 1)' has no elements +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (1) TO (1); + +CREATE TABLE part0 PARTITION OF range_parted2 FOR VALUES FROM (minvalue) TO (1); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (minvalue) TO (2); +CREATE TABLE part1 PARTITION OF range_parted2 FOR VALUES FROM (1) TO (10); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (-1) TO (1); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (9) TO (maxvalue); +CREATE TABLE part2 PARTITION OF range_parted2 FOR VALUES FROM (20) TO (30); +CREATE TABLE part3 PARTITION OF range_parted2 FOR VALUES FROM (30) TO (40); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (10) TO (30); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (10) TO (50); + +-- Create a default partition for range partitioned table +CREATE TABLE range2_default PARTITION OF range_parted2 DEFAULT; + +-- More than one default partition is not allowed, so this should give error +CREATE TABLE fail_default_part PARTITION OF range_parted2 DEFAULT; + +-- Check if the range for default partitions overlap +INSERT INTO range_parted2 VALUES (85); +CREATE TABLE fail_part PARTITION OF range_parted2 FOR VALUES FROM (80) TO (90); +CREATE TABLE part4 PARTITION OF range_parted2 FOR VALUES FROM (90) TO (100); + +-- now check for multi-column range partition key +CREATE TABLE range_parted3 ( + a int, + b int +) PARTITION BY RANGE (a, (b+1)); + +CREATE TABLE part00 PARTITION OF range_parted3 FOR VALUES FROM (0, minvalue) TO (0, maxvalue); +CREATE TABLE fail_part PARTITION OF range_parted3 FOR VALUES FROM (0, minvalue) TO (0, 1); + +CREATE TABLE part10 PARTITION OF range_parted3 FOR VALUES FROM (1, minvalue) TO (1, 1); +CREATE TABLE part11 PARTITION OF range_parted3 FOR VALUES FROM (1, 1) TO (1, 10); +CREATE TABLE part12 PARTITION OF range_parted3 FOR VALUES FROM (1, 10) TO (1, maxvalue); +CREATE TABLE fail_part PARTITION OF range_parted3 FOR VALUES FROM (1, 10) TO (1, 20); +CREATE TABLE range3_default PARTITION OF range_parted3 DEFAULT; + +-- cannot create a partition that says column b is allowed to range +-- from -infinity to +infinity, while there exist partitions that have +-- more specific ranges +CREATE TABLE fail_part PARTITION OF range_parted3 FOR VALUES FROM (1, minvalue) TO (1, maxvalue); + +-- check for partition bound overlap and other invalid specifications for the hash partition +CREATE TABLE hash_parted2 ( + a varchar +) PARTITION BY HASH (a); +CREATE TABLE h2part_1 PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 4, REMAINDER 2); +CREATE TABLE h2part_2 PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 8, REMAINDER 0); +CREATE TABLE h2part_3 PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 8, REMAINDER 4); +CREATE TABLE h2part_4 PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 8, REMAINDER 5); +-- overlap with part_4 +CREATE TABLE fail_part PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 2, REMAINDER 1); +-- modulus must be greater than zero +CREATE TABLE fail_part PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 0, REMAINDER 1); +-- remainder must be greater than or equal to zero and less than modulus +CREATE TABLE fail_part PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 8, REMAINDER 8); + +-- check schema propagation from parent + +CREATE TABLE parted ( + a text, + b int NOT NULL DEFAULT 0, + CONSTRAINT check_a CHECK (length(a) > 0) +) PARTITION BY LIST (a); + +CREATE TABLE part_a PARTITION OF parted FOR VALUES IN ('a'); + +-- only inherited attributes (never local ones) +SELECT attname, attislocal, attinhcount FROM pg_attribute + WHERE attrelid = 'part_a'::regclass and attnum > 0 + ORDER BY attnum; + +-- able to specify column default, column constraint, and table constraint + +-- first check the "column specified more than once" error +CREATE TABLE part_b PARTITION OF parted ( + b NOT NULL, + b DEFAULT 1, + b CHECK (b >= 0), + CONSTRAINT check_a CHECK (length(a) > 0) +) FOR VALUES IN ('b'); + +CREATE TABLE part_b PARTITION OF parted ( + b NOT NULL DEFAULT 1, + CONSTRAINT check_a CHECK (length(a) > 0), + CONSTRAINT check_b CHECK (b >= 0) +) FOR VALUES IN ('b'); +-- conislocal should be false for any merged constraints, true otherwise +SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY conislocal, coninhcount; + +-- Once check_b is added to the parent, it should be made non-local for part_b +ALTER TABLE parted ADD CONSTRAINT check_b CHECK (b >= 0); +SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass; + +-- Neither check_a nor check_b are droppable from part_b +ALTER TABLE part_b DROP CONSTRAINT check_a; +ALTER TABLE part_b DROP CONSTRAINT check_b; + +-- And dropping it from parted should leave no trace of them on part_b, unlike +-- traditional inheritance where they will be left behind, because they would +-- be local constraints. +ALTER TABLE parted DROP CONSTRAINT check_a, DROP CONSTRAINT check_b; +SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass; + +-- specify PARTITION BY for a partition +CREATE TABLE fail_part_col_not_found PARTITION OF parted FOR VALUES IN ('c') PARTITION BY RANGE (c); +CREATE TABLE part_c PARTITION OF parted (b WITH OPTIONS NOT NULL DEFAULT 0) FOR VALUES IN ('c') PARTITION BY RANGE ((b)); + +-- create a level-2 partition +CREATE TABLE part_c_1_10 PARTITION OF part_c FOR VALUES FROM (1) TO (10); + +-- check that NOT NULL and default value are inherited correctly +create table parted_notnull_inh_test (a int default 1, b int not null default 0) partition by list (a); +create table parted_notnull_inh_test1 partition of parted_notnull_inh_test (a not null, b default 1) for values in (1); +insert into parted_notnull_inh_test (b) values (null); +-- note that while b's default is overriden, a's default is preserved +\d parted_notnull_inh_test1 +drop table parted_notnull_inh_test; + +-- check that collations are assigned in partition bound expressions +create table parted_boolean_col (a bool, b text) partition by list(a); +create table parted_boolean_less partition of parted_boolean_col + for values in ('foo' < 'bar'); +create table parted_boolean_greater partition of parted_boolean_col + for values in ('foo' > 'bar'); +drop table parted_boolean_col; + +-- check for a conflicting COLLATE clause +create table parted_collate_must_match (a text collate "C", b text collate "C") + partition by range (a); +-- on the partition key +create table parted_collate_must_match1 partition of parted_collate_must_match + (a collate "POSIX") for values from ('a') to ('m'); +-- on another column +create table parted_collate_must_match2 partition of parted_collate_must_match + (b collate "POSIX") for values from ('m') to ('z'); +drop table parted_collate_must_match; + +-- check that non-matching collations for partition bound +-- expressions are coerced to the right collation + +create table test_part_coll_posix (a text) partition by range (a collate "POSIX"); +-- ok, collation is implicitly coerced +create table test_part_coll partition of test_part_coll_posix for values from ('a' collate "C") to ('g'); +-- ok +create table test_part_coll2 partition of test_part_coll_posix for values from ('g') to ('m'); +-- ok, collation is implicitly coerced +create table test_part_coll_cast partition of test_part_coll_posix for values from (name 'm' collate "C") to ('s'); +-- ok; partition collation silently overrides the default collation of type 'name' +create table test_part_coll_cast2 partition of test_part_coll_posix for values from (name 's') to ('z'); + +drop table test_part_coll_posix; + +-- Partition bound in describe output +\d+ part_b + +-- Both partition bound and partition key in describe output +\d+ part_c + +-- a level-2 partition's constraint will include the parent's expressions +\d+ part_c_1_10 + +-- Show partition count in the parent's describe output +-- Tempted to include \d+ output listing partitions with bound info but +-- output could vary depending on the order in which partition oids are +-- returned. +\d parted +\d hash_parted + +-- check that we get the expected partition constraints +CREATE TABLE range_parted4 (a int, b int, c int) PARTITION BY RANGE (abs(a), abs(b), c); +CREATE TABLE unbounded_range_part PARTITION OF range_parted4 FOR VALUES FROM (MINVALUE, MINVALUE, MINVALUE) TO (MAXVALUE, MAXVALUE, MAXVALUE); +\d+ unbounded_range_part +DROP TABLE unbounded_range_part; +CREATE TABLE range_parted4_1 PARTITION OF range_parted4 FOR VALUES FROM (MINVALUE, MINVALUE, MINVALUE) TO (1, MAXVALUE, MAXVALUE); +\d+ range_parted4_1 +CREATE TABLE range_parted4_2 PARTITION OF range_parted4 FOR VALUES FROM (3, 4, 5) TO (6, 7, MAXVALUE); +\d+ range_parted4_2 +CREATE TABLE range_parted4_3 PARTITION OF range_parted4 FOR VALUES FROM (6, 8, MINVALUE) TO (9, MAXVALUE, MAXVALUE); +\d+ range_parted4_3 +DROP TABLE range_parted4; + +-- user-defined operator class in partition key +CREATE FUNCTION my_int4_sort(int4,int4) RETURNS int LANGUAGE sql + AS $$ SELECT CASE WHEN $1 = $2 THEN 0 WHEN $1 > $2 THEN 1 ELSE -1 END; $$; +CREATE OPERATOR CLASS test_int4_ops FOR TYPE int4 USING btree AS + OPERATOR 1 < (int4,int4), OPERATOR 2 <= (int4,int4), + OPERATOR 3 = (int4,int4), OPERATOR 4 >= (int4,int4), + OPERATOR 5 > (int4,int4), FUNCTION 1 my_int4_sort(int4,int4); +CREATE TABLE partkey_t (a int4) PARTITION BY RANGE (a test_int4_ops); +CREATE TABLE partkey_t_1 PARTITION OF partkey_t FOR VALUES FROM (0) TO (1000); +INSERT INTO partkey_t VALUES (100); +INSERT INTO partkey_t VALUES (200); + +-- cleanup +DROP TABLE parted, list_parted, range_parted, list_parted2, range_parted2, range_parted3; +DROP TABLE partkey_t, hash_parted, hash_parted2; +DROP OPERATOR CLASS test_int4_ops USING btree; +DROP FUNCTION my_int4_sort(int4,int4); + +-- comments on partitioned tables columns +CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a); +COMMENT ON TABLE parted_col_comment IS 'Am partitioned table'; +COMMENT ON COLUMN parted_col_comment.a IS 'Partition key'; +SELECT obj_description('parted_col_comment'::regclass); +\d+ parted_col_comment +DROP TABLE parted_col_comment; + +-- list partitioning on array type column +CREATE TABLE arrlp (a int[]) PARTITION BY LIST (a); +CREATE TABLE arrlp12 PARTITION OF arrlp FOR VALUES IN ('{1}', '{2}'); +\d+ arrlp12 +DROP TABLE arrlp; + +-- partition on boolean column +create table boolspart (a bool) partition by list (a); +create table boolspart_t partition of boolspart for values in (true); +create table boolspart_f partition of boolspart for values in (false); +\d+ boolspart +drop table boolspart; + +-- partitions mixing temporary and permanent relations +create table perm_parted (a int) partition by list (a); +create temporary table temp_parted (a int) partition by list (a); +create table perm_part partition of temp_parted default; -- error +create temp table temp_part partition of perm_parted default; -- error +create temp table temp_part partition of temp_parted default; -- ok +drop table perm_parted cascade; +drop table temp_parted cascade; + +-- check that adding partitions to a table while it is being used is prevented +create table tab_part_create (a int) partition by list (a); +create or replace function func_part_create() returns trigger + language plpgsql as $$ + begin + execute 'create table tab_part_create_1 partition of tab_part_create for values in (1)'; + return null; + end $$; +create trigger trig_part_create before insert on tab_part_create + for each statement execute procedure func_part_create(); +insert into tab_part_create values (1); +drop table tab_part_create; +drop function func_part_create(); + +-- test using a volatile expression as partition bound +create table volatile_partbound_test (partkey timestamp) partition by range (partkey); +create table volatile_partbound_test1 partition of volatile_partbound_test for values from (minvalue) to (current_timestamp); +create table volatile_partbound_test2 partition of volatile_partbound_test for values from (current_timestamp) to (maxvalue); +-- this should go into the partition volatile_partbound_test2 +insert into volatile_partbound_test values (current_timestamp); +select tableoid::regclass from volatile_partbound_test; +drop table volatile_partbound_test; + +-- test the case where a check constraint on default partition allows +-- to avoid scanning it when adding a new partition +create table defcheck (a int, b int) partition by list (b); +create table defcheck_def (a int, c int, b int); +alter table defcheck_def drop c; +alter table defcheck attach partition defcheck_def default; +alter table defcheck_def add check (b <= 0 and b is not null); +create table defcheck_1 partition of defcheck for values in (1, null); + +-- test that complex default partition constraints are enforced correctly +insert into defcheck_def values (0, 0); +create table defcheck_0 partition of defcheck for values in (0); +drop table defcheck; + +-- Test github issue #7340. truncating a toast unlogged table fails. +-- Leave the table on purpose for pg_dump and gp_replica_check tests. +CREATE UNLOGGED TABLE unlogged_toast (a text); +TRUNCATE unlogged_toast; + +-- tests of column drop with partition tables and indexes using +-- predicates and expressions. +create table part_column_drop ( + useless_1 int, + id int, + useless_2 int, + d int, + b int, + useless_3 int +) partition by range (id); +alter table part_column_drop drop column useless_1; +alter table part_column_drop drop column useless_2; +alter table part_column_drop drop column useless_3; +create index part_column_drop_b_pred on part_column_drop(b) where b = 1; +create index part_column_drop_b_expr on part_column_drop((b = 1)); +create index part_column_drop_d_pred on part_column_drop(d) where d = 2; +create index part_column_drop_d_expr on part_column_drop((d = 2)); +create table part_column_drop_1_10 partition of + part_column_drop for values from (1) to (10); +\d part_column_drop +\d part_column_drop_1_10 +drop table part_column_drop; diff --git a/src/test/singlenode_regress/sql/create_table_like.sql b/src/test/singlenode_regress/sql/create_table_like.sql new file mode 100644 index 00000000000..4929d373a2f --- /dev/null +++ b/src/test/singlenode_regress/sql/create_table_like.sql @@ -0,0 +1,217 @@ +/* Test inheritance of structure (LIKE) */ +CREATE TABLE inhx (xx text DEFAULT 'text'); + +/* + * Test double inheritance + * + * Ensure that defaults are NOT included unless + * INCLUDING DEFAULTS is specified + */ +CREATE TABLE ctla (aa TEXT); +CREATE TABLE ctlb (bb TEXT) INHERITS (ctla); + +CREATE TABLE foo (LIKE nonexistent); + +CREATE TABLE inhe (ee text, LIKE inhx) inherits (ctlb); +INSERT INTO inhe VALUES ('ee-col1', 'ee-col2', DEFAULT, 'ee-col4'); +SELECT * FROM inhe; /* Columns aa, bb, xx value NULL, ee */ +SELECT * FROM inhx; /* Empty set since LIKE inherits structure only */ +SELECT * FROM ctlb; /* Has ee entry */ +SELECT * FROM ctla; /* Has ee entry */ + +CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */ + +CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS INCLUDING CONSTRAINTS); +INSERT INTO inhf DEFAULT VALUES; +SELECT * FROM inhf; /* Single entry with value 'text' */ + +ALTER TABLE inhx add constraint foo CHECK (xx = 'text'); +ALTER TABLE inhx ADD PRIMARY KEY (xx); +CREATE TABLE inhg (LIKE inhx); /* Doesn't copy constraint */ +INSERT INTO inhg VALUES ('foo'); +DROP TABLE inhg; +CREATE TABLE inhg (x text, LIKE inhx INCLUDING CONSTRAINTS, y text); /* Copies constraints */ +INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds */ +INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds -- Unique constraints not copied */ +INSERT INTO inhg VALUES ('x', 'foo', 'y'); /* fails due to constraint */ +SELECT * FROM inhg; /* Two records with three columns in order x=x, xx=text, y=y */ +DROP TABLE inhg; + +CREATE TABLE test_like_id_1 (a bigint GENERATED ALWAYS AS IDENTITY, b text); +\d test_like_id_1 +INSERT INTO test_like_id_1 (b) VALUES ('b1'); +SELECT * FROM test_like_id_1; +CREATE TABLE test_like_id_2 (LIKE test_like_id_1); +\d test_like_id_2 +INSERT INTO test_like_id_2 (b) VALUES ('b2'); +SELECT * FROM test_like_id_2; -- identity was not copied +CREATE TABLE test_like_id_3 (LIKE test_like_id_1 INCLUDING IDENTITY); +\d test_like_id_3 +INSERT INTO test_like_id_3 (b) VALUES ('b3'); +SELECT * FROM test_like_id_3; -- identity was copied and applied +DROP TABLE test_like_id_1, test_like_id_2, test_like_id_3; + +CREATE TABLE test_like_gen_1 (a int, b int GENERATED ALWAYS AS (a * 2) STORED); +\d test_like_gen_1 +INSERT INTO test_like_gen_1 (a) VALUES (1); +SELECT * FROM test_like_gen_1; +CREATE TABLE test_like_gen_2 (LIKE test_like_gen_1); +\d test_like_gen_2 +INSERT INTO test_like_gen_2 (a) VALUES (1); +SELECT * FROM test_like_gen_2; +CREATE TABLE test_like_gen_3 (LIKE test_like_gen_1 INCLUDING GENERATED); +\d test_like_gen_3 +INSERT INTO test_like_gen_3 (a) VALUES (1); +SELECT * FROM test_like_gen_3; +DROP TABLE test_like_gen_1, test_like_gen_2, test_like_gen_3; + +-- also test generated column with a "forward" reference (bug #16342) +CREATE TABLE test_like_4 (b int DEFAULT 42, + c int GENERATED ALWAYS AS (a * 2) STORED, + a int CHECK (a > 0)); +\d test_like_4 +CREATE TABLE test_like_4a (LIKE test_like_4); +CREATE TABLE test_like_4b (LIKE test_like_4 INCLUDING DEFAULTS); +CREATE TABLE test_like_4c (LIKE test_like_4 INCLUDING GENERATED); +CREATE TABLE test_like_4d (LIKE test_like_4 INCLUDING DEFAULTS INCLUDING GENERATED); +\d test_like_4a +INSERT INTO test_like_4a (a) VALUES(11); +SELECT a, b, c FROM test_like_4a; +\d test_like_4b +INSERT INTO test_like_4b (a) VALUES(11); +SELECT a, b, c FROM test_like_4b; +\d test_like_4c +INSERT INTO test_like_4c (a) VALUES(11); +SELECT a, b, c FROM test_like_4c; +\d test_like_4d +INSERT INTO test_like_4d (a) VALUES(11); +SELECT a, b, c FROM test_like_4d; + +-- Test renumbering of Vars when combining LIKE with inheritance +CREATE TABLE test_like_5 (x point, y point, z point); +CREATE TABLE test_like_5x (p int CHECK (p > 0), + q int GENERATED ALWAYS AS (p * 2) STORED); +CREATE TABLE test_like_5c (LIKE test_like_4 INCLUDING ALL) + INHERITS (test_like_5, test_like_5x); +\d test_like_5c + +DROP TABLE test_like_4, test_like_4a, test_like_4b, test_like_4c, test_like_4d; +DROP TABLE test_like_5, test_like_5x, test_like_5c; + +CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES, y text); /* copies indexes */ +INSERT INTO inhg VALUES (5, 10); +INSERT INTO inhg VALUES (20, 10); -- should fail +DROP TABLE inhg; +/* Multiple primary keys creation should fail */ +CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES, PRIMARY KEY(x)); /* fails */ +CREATE TABLE inhz (xx text DEFAULT 'text', yy int UNIQUE); +CREATE UNIQUE INDEX inhz_xx_idx on inhz (xx) WHERE xx <> 'test'; +/* Ok to create multiple unique indexes */ +CREATE TABLE inhg (x text UNIQUE, LIKE inhz INCLUDING INDEXES); +INSERT INTO inhg (xx, yy, x) VALUES ('test', 5, 10); +INSERT INTO inhg (xx, yy, x) VALUES ('test', 10, 15); +INSERT INTO inhg (xx, yy, x) VALUES ('foo', 10, 15); -- should fail +DROP TABLE inhg; +DROP TABLE inhz; + +/* Use primary key imported by LIKE for self-referential FK constraint */ +CREATE TABLE inhz (x text REFERENCES inhz, LIKE inhx INCLUDING INDEXES); +\d inhz +DROP TABLE inhz; + +-- including storage and comments +CREATE TABLE ctlt1 (a text CHECK (length(a) > 2) PRIMARY KEY, b text); +CREATE INDEX ctlt1_b_key ON ctlt1 (b); +CREATE INDEX ctlt1_fnidx ON ctlt1 ((a || b)); +CREATE STATISTICS ctlt1_a_b_stat ON a,b FROM ctlt1; +CREATE STATISTICS ctlt1_expr_stat ON (a || b) FROM ctlt1; +COMMENT ON STATISTICS ctlt1_a_b_stat IS 'ab stats'; +COMMENT ON STATISTICS ctlt1_expr_stat IS 'ab expr stats'; +COMMENT ON COLUMN ctlt1.a IS 'A'; +COMMENT ON COLUMN ctlt1.b IS 'B'; +COMMENT ON CONSTRAINT ctlt1_a_check ON ctlt1 IS 't1_a_check'; +COMMENT ON INDEX ctlt1_pkey IS 'index pkey'; +COMMENT ON INDEX ctlt1_b_key IS 'index b_key'; +ALTER TABLE ctlt1 ALTER COLUMN a SET STORAGE MAIN; + +CREATE TABLE ctlt2 (c text); +ALTER TABLE ctlt2 ALTER COLUMN c SET STORAGE EXTERNAL; +COMMENT ON COLUMN ctlt2.c IS 'C'; + +CREATE TABLE ctlt3 (a text CHECK (length(a) < 5), c text CHECK (length(c) < 7)); +ALTER TABLE ctlt3 ALTER COLUMN c SET STORAGE EXTERNAL; +ALTER TABLE ctlt3 ALTER COLUMN a SET STORAGE MAIN; +CREATE INDEX ctlt3_fnidx ON ctlt3 ((a || c)); +COMMENT ON COLUMN ctlt3.a IS 'A3'; +COMMENT ON COLUMN ctlt3.c IS 'C'; +COMMENT ON CONSTRAINT ctlt3_a_check ON ctlt3 IS 't3_a_check'; + +CREATE TABLE ctlt4 (a text, c text); +ALTER TABLE ctlt4 ALTER COLUMN c SET STORAGE EXTERNAL; + +CREATE TABLE ctlt12_storage (LIKE ctlt1 INCLUDING STORAGE, LIKE ctlt2 INCLUDING STORAGE); +\d+ ctlt12_storage +CREATE TABLE ctlt12_comments (LIKE ctlt1 INCLUDING COMMENTS, LIKE ctlt2 INCLUDING COMMENTS); +\d+ ctlt12_comments +CREATE TABLE ctlt1_inh (LIKE ctlt1 INCLUDING CONSTRAINTS INCLUDING COMMENTS) INHERITS (ctlt1); +\d+ ctlt1_inh +SELECT description FROM pg_description, pg_constraint c WHERE classoid = 'pg_constraint'::regclass AND objoid = c.oid AND c.conrelid = 'ctlt1_inh'::regclass; +CREATE TABLE ctlt13_inh () INHERITS (ctlt1, ctlt3); +\d+ ctlt13_inh +CREATE TABLE ctlt13_like (LIKE ctlt3 INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING COMMENTS INCLUDING STORAGE) INHERITS (ctlt1); +\d+ ctlt13_like +SELECT description FROM pg_description, pg_constraint c WHERE classoid = 'pg_constraint'::regclass AND objoid = c.oid AND c.conrelid = 'ctlt13_like'::regclass; + +CREATE TABLE ctlt_all (LIKE ctlt1 INCLUDING ALL); +\d+ ctlt_all +SELECT c.relname, objsubid, description FROM pg_description, pg_index i, pg_class c WHERE classoid = 'pg_class'::regclass AND objoid = i.indexrelid AND c.oid = i.indexrelid AND i.indrelid = 'ctlt_all'::regclass ORDER BY c.relname, objsubid; +SELECT s.stxname, objsubid, description FROM pg_description, pg_statistic_ext s WHERE classoid = 'pg_statistic_ext'::regclass AND objoid = s.oid AND s.stxrelid = 'ctlt_all'::regclass ORDER BY s.stxname, objsubid; + +CREATE TABLE inh_error1 () INHERITS (ctlt1, ctlt4); +CREATE TABLE inh_error2 (LIKE ctlt4 INCLUDING STORAGE) INHERITS (ctlt1); + +-- Check that LIKE isn't confused by a system catalog of the same name +CREATE TABLE pg_attrdef (LIKE ctlt1 INCLUDING ALL); +\d+ public.pg_attrdef +DROP TABLE public.pg_attrdef; + +-- Check that LIKE isn't confused when new table masks the old, either +BEGIN; +CREATE SCHEMA ctl_schema; +SET LOCAL search_path = ctl_schema, public; +CREATE TABLE ctlt1 (LIKE ctlt1 INCLUDING ALL); +\d+ ctlt1 +ROLLBACK; + +DROP TABLE ctlt1, ctlt2, ctlt3, ctlt4, ctlt12_storage, ctlt12_comments, ctlt1_inh, ctlt13_inh, ctlt13_like, ctlt_all, ctla, ctlb CASCADE; + +-- LIKE must respect NO INHERIT property of constraints +CREATE TABLE noinh_con_copy (a int CHECK (a > 0) NO INHERIT); +CREATE TABLE noinh_con_copy1 (LIKE noinh_con_copy INCLUDING CONSTRAINTS); +\d noinh_con_copy1 + +-- fail, as partitioned tables don't allow NO INHERIT constraints +CREATE TABLE noinh_con_copy1_parted (LIKE noinh_con_copy INCLUDING ALL) + PARTITION BY LIST (a); + +DROP TABLE noinh_con_copy, noinh_con_copy1; + + +/* LIKE with other relation kinds */ + +CREATE TABLE ctlt4 (a int, b text); + +CREATE SEQUENCE ctlseq1; +CREATE TABLE ctlt10 (LIKE ctlseq1); -- fail + +CREATE VIEW ctlv1 AS SELECT * FROM ctlt4; +CREATE TABLE ctlt11 (LIKE ctlv1); +CREATE TABLE ctlt11a (LIKE ctlv1 INCLUDING ALL); + +CREATE TYPE ctlty1 AS (a int, b text); +CREATE TABLE ctlt12 (LIKE ctlty1); + +DROP SEQUENCE ctlseq1; +DROP TYPE ctlty1; +DROP VIEW ctlv1; +DROP TABLE IF EXISTS ctlt4, ctlt10, ctlt11, ctlt11a, ctlt12; diff --git a/src/test/singlenode_regress/sql/create_table_like_gp.sql b/src/test/singlenode_regress/sql/create_table_like_gp.sql new file mode 100644 index 00000000000..a0960da7b41 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_table_like_gp.sql @@ -0,0 +1,80 @@ +-- AO/AOCS +CREATE TABLE t_ao (a integer, b text) WITH (appendonly=true, orientation=column); +CREATE TABLE t_ao_enc (a integer, b text ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768)) WITH (appendonly=true, orientation=column); + +CREATE TABLE t_ao_a (LIKE t_ao INCLUDING ALL); +CREATE TABLE t_ao_b (LIKE t_ao INCLUDING STORAGE); +CREATE TABLE t_ao_c (LIKE t_ao); -- Should create a heap table + +CREATE TABLE t_ao_enc_a (LIKE t_ao_enc INCLUDING STORAGE); + +-- Verify default_table_access_method GUC doesn't get used +SET default_table_access_method = ao_row; +CREATE TABLE t_ao_d (LIKE t_ao INCLUDING ALL); +RESET gp_default_storage_options; + +-- Verify created tables and attributes +SELECT + c.relname, + am.amname, + a.columnstore, + a.compresstype, + a.compresslevel +FROM + pg_catalog.pg_class c + LEFT OUTER JOIN pg_catalog.pg_am am ON (c.relam = am.oid) + LEFT OUTER JOIN pg_catalog.pg_appendonly a ON (c.oid = a.relid) +WHERE + c.relname LIKE 't_ao%'; + +SELECT + c.relname, + a.attnum, + a.attoptions +FROM + pg_catalog.pg_class c + JOIN pg_catalog.pg_attribute_encoding a ON (a.attrelid = c.oid) +WHERE + c.relname like 't_ao_enc%'; + +-- EXTERNAL TABLE +CREATE EXTERNAL TABLE t_ext (a integer) LOCATION ('file://127.0.0.1/tmp/foo') FORMAT 'text'; +CREATE EXTERNAL TABLE t_ext_a (LIKE t_ext INCLUDING ALL) LOCATION ('file://127.0.0.1/tmp/foo') FORMAT 'text'; +CREATE EXTERNAL TABLE t_ext_b (LIKE t_ext) LOCATION ('file://127.0.0.1/tmp/foo') FORMAT 'text'; + +-- Verify that an external table can be dropped and then recreated in consecutive attempts +CREATE OR REPLACE FUNCTION drop_and_recreate_external_table() + RETURNS void + LANGUAGE plpgsql + VOLATILE +AS $function$ +DECLARE +BEGIN +DROP EXTERNAL TABLE IF EXISTS t_ext_r; +CREATE EXTERNAL TABLE t_ext_r ( + name varchar +) +LOCATION ('GPFDIST://127.0.0.1/tmp/dummy') ON ALL +FORMAT 'CSV' ( delimiter ' ' null '' escape '"' quote '"' ) +ENCODING 'UTF8'; +END; +$function$; + +do $$ +begin + for i in 1..5 loop + PERFORM drop_and_recreate_external_table(); + end loop; +end; +$$; + +-- Verify created tables +SELECT + c.relname, + c.relkind, + f.ftoptions +FROM + pg_catalog.pg_class c + LEFT OUTER JOIN pg_catalog.pg_foreign_table f ON (c.oid = f.ftrelid) +WHERE + c.relname LIKE 't_ext%'; diff --git a/src/test/singlenode_regress/sql/create_type.sql b/src/test/singlenode_regress/sql/create_type.sql new file mode 100644 index 00000000000..a32a9e67957 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_type.sql @@ -0,0 +1,235 @@ +-- +-- CREATE_TYPE +-- + +-- +-- Note: widget_in/out were created in create_function_1, without any +-- prior shell-type creation. These commands therefore complete a test +-- of the "old style" approach of making the functions first. +-- +CREATE TYPE widget ( + internallength = 24, + input = widget_in, + output = widget_out, + typmod_in = numerictypmodin, + typmod_out = numerictypmodout, + alignment = double +); + +CREATE TYPE city_budget ( + internallength = 16, + input = int44in, + output = int44out, + element = int4, + category = 'x', -- just to verify the system will take it + preferred = true -- ditto +); + +-- Test creation and destruction of shell types +CREATE TYPE shell; +CREATE TYPE shell; -- fail, type already present +DROP TYPE shell; +DROP TYPE shell; -- fail, type not exist + +-- also, let's leave one around for purposes of pg_dump testing +CREATE TYPE myshell; + +-- +-- Test type-related default values (broken in releases before PG 7.2) +-- +-- This part of the test also exercises the "new style" approach of making +-- a shell type and then filling it in. +-- +CREATE TYPE int42; +CREATE TYPE text_w_default; + +-- Make dummy I/O routines using the existing internal support for int4, text +CREATE FUNCTION int42_in(cstring) + RETURNS int42 + AS 'int4in' + LANGUAGE internal STRICT IMMUTABLE; +CREATE FUNCTION int42_out(int42) + RETURNS cstring + AS 'int4out' + LANGUAGE internal STRICT IMMUTABLE; +CREATE FUNCTION text_w_default_in(cstring) + RETURNS text_w_default + AS 'textin' + LANGUAGE internal STRICT IMMUTABLE; +CREATE FUNCTION text_w_default_out(text_w_default) + RETURNS cstring + AS 'textout' + LANGUAGE internal STRICT IMMUTABLE; + +CREATE TYPE int42 ( + internallength = 4, + input = int42_in, + output = int42_out, + alignment = int4, + default = 42, + passedbyvalue +); + +CREATE TYPE text_w_default ( + internallength = variable, + input = text_w_default_in, + output = text_w_default_out, + alignment = int4, + default = 'zippo' +); + +CREATE TABLE default_test (f1 text_w_default, f2 int42); + +INSERT INTO default_test DEFAULT VALUES; + +SELECT * FROM default_test; + +-- We need a shell type to test some CREATE TYPE failure cases with +CREATE TYPE bogus_type; + +-- invalid: non-lowercase quoted identifiers +CREATE TYPE bogus_type ( + "Internallength" = 4, + "Input" = int42_in, + "Output" = int42_out, + "Alignment" = int4, + "Default" = 42, + "Passedbyvalue" +); + +-- invalid: input/output function incompatibility +CREATE TYPE bogus_type (INPUT = array_in, + OUTPUT = array_out, + ELEMENT = int, + INTERNALLENGTH = 32); + +DROP TYPE bogus_type; + +-- It no longer is possible to issue CREATE TYPE without making a shell first +CREATE TYPE bogus_type (INPUT = array_in, + OUTPUT = array_out, + ELEMENT = int, + INTERNALLENGTH = 32); + +-- Test stand-alone composite type + +CREATE TYPE default_test_row AS (f1 text_w_default, f2 int42); + +CREATE FUNCTION get_default_test() RETURNS SETOF default_test_row AS ' + SELECT * FROM default_test; +' LANGUAGE SQL; + +SELECT * FROM get_default_test(); + +-- Test comments +COMMENT ON TYPE bad IS 'bad comment'; +COMMENT ON TYPE default_test_row IS 'good comment'; +COMMENT ON TYPE default_test_row IS NULL; +COMMENT ON COLUMN default_test_row.nope IS 'bad comment'; +COMMENT ON COLUMN default_test_row.f1 IS 'good comment'; +COMMENT ON COLUMN default_test_row.f1 IS NULL; + +-- Check shell type create for existing types +CREATE TYPE text_w_default; -- should fail + +DROP TYPE default_test_row CASCADE; + +DROP TABLE default_test; + +-- Check dependencies are established when creating a new type +CREATE TYPE base_type; +CREATE FUNCTION base_fn_in(cstring) RETURNS base_type AS 'boolin' + LANGUAGE internal IMMUTABLE STRICT; +CREATE FUNCTION base_fn_out(base_type) RETURNS cstring AS 'boolout' + LANGUAGE internal IMMUTABLE STRICT; +CREATE TYPE base_type(INPUT = base_fn_in, OUTPUT = base_fn_out); +DROP FUNCTION base_fn_in(cstring); -- error +DROP FUNCTION base_fn_out(base_type); -- error +DROP TYPE base_type; -- error +DROP TYPE base_type CASCADE; + +-- Check usage of typmod with a user-defined type +-- (we have borrowed numeric's typmod functions) + +CREATE TEMP TABLE mytab (foo widget(42,13,7)); -- should fail +CREATE TEMP TABLE mytab (foo widget(42,13)); + +SELECT format_type(atttypid,atttypmod) FROM pg_attribute +WHERE attrelid = 'mytab'::regclass AND attnum > 0; + +-- might as well exercise the widget type while we're here +INSERT INTO mytab VALUES ('(1,2,3)'), ('(-44,5.5,12)'); +TABLE mytab; + +-- and test format_type() a bit more, too +select format_type('varchar'::regtype, 42); +select format_type('bpchar'::regtype, null); +-- this behavior difference is intentional +select format_type('bpchar'::regtype, -1); + +-- +-- Test CREATE/ALTER TYPE using a type that's compatible with varchar, +-- so we can re-use those support functions +-- +CREATE TYPE myvarchar; + +CREATE FUNCTION myvarcharin(cstring, oid, integer) RETURNS myvarchar +LANGUAGE internal IMMUTABLE PARALLEL SAFE STRICT AS 'varcharin'; + +CREATE FUNCTION myvarcharout(myvarchar) RETURNS cstring +LANGUAGE internal IMMUTABLE PARALLEL SAFE STRICT AS 'varcharout'; + +CREATE FUNCTION myvarcharsend(myvarchar) RETURNS bytea +LANGUAGE internal STABLE PARALLEL SAFE STRICT AS 'varcharsend'; + +CREATE FUNCTION myvarcharrecv(internal, oid, integer) RETURNS myvarchar +LANGUAGE internal STABLE PARALLEL SAFE STRICT AS 'varcharrecv'; + +-- fail, it's still a shell: +ALTER TYPE myvarchar SET (storage = extended); + +CREATE TYPE myvarchar ( + input = myvarcharin, + output = myvarcharout, + alignment = integer, + storage = main +); + +-- want to check updating of a domain over the target type, too +CREATE DOMAIN myvarchardom AS myvarchar; + +ALTER TYPE myvarchar SET (storage = plain); -- not allowed + +ALTER TYPE myvarchar SET (storage = extended); + +ALTER TYPE myvarchar SET ( + send = myvarcharsend, + receive = myvarcharrecv, + typmod_in = varchartypmodin, + typmod_out = varchartypmodout, + -- these are bogus, but it's safe as long as we don't use the type: + analyze = ts_typanalyze, + subscript = raw_array_subscript_handler +); + +SELECT typinput, typoutput, typreceive, typsend, typmodin, typmodout, + typanalyze, typsubscript, typstorage +FROM pg_type WHERE typname = 'myvarchar'; + +SELECT typinput, typoutput, typreceive, typsend, typmodin, typmodout, + typanalyze, typsubscript, typstorage +FROM pg_type WHERE typname = '_myvarchar'; + +SELECT typinput, typoutput, typreceive, typsend, typmodin, typmodout, + typanalyze, typsubscript, typstorage +FROM pg_type WHERE typname = 'myvarchardom'; + +SELECT typinput, typoutput, typreceive, typsend, typmodin, typmodout, + typanalyze, typsubscript, typstorage +FROM pg_type WHERE typname = '_myvarchardom'; + +-- ensure dependencies are straight +DROP FUNCTION myvarcharsend(myvarchar); -- fail +DROP TYPE myvarchar; -- fail + +DROP TYPE myvarchar CASCADE; diff --git a/src/test/singlenode_regress/sql/create_view.sql b/src/test/singlenode_regress/sql/create_view.sql new file mode 100644 index 00000000000..e1b013fe7a5 --- /dev/null +++ b/src/test/singlenode_regress/sql/create_view.sql @@ -0,0 +1,695 @@ +-- +-- Exercise outfuncs +-- + +set Debug_print_parse=on; +set Debug_print_plan=on; + +-- +-- CREATE_VIEW +-- Virtual class definitions +-- (this also tests the query rewrite system) +-- + +CREATE VIEW street AS + SELECT r.name, r.thepath, c.cname AS cname + FROM ONLY road r, real_city c + WHERE c.outline ## r.thepath; + +CREATE VIEW iexit AS + SELECT ih.name, ih.thepath, + interpt_pp(ih.thepath, r.thepath) AS exit + FROM ihighway ih, ramp r + WHERE ih.thepath ## r.thepath; + +CREATE VIEW toyemp AS + SELECT name, age, location, 12*salary AS annualsal + FROM emp; + +-- Test comments +COMMENT ON VIEW noview IS 'no view'; +COMMENT ON VIEW toyemp IS 'is a view'; +COMMENT ON VIEW toyemp IS NULL; + +-- These views are left around mainly to exercise special cases in pg_dump. + +CREATE TABLE view_base_table (key int PRIMARY KEY, data varchar(20)); + +CREATE VIEW key_dependent_view AS + SELECT * FROM view_base_table GROUP BY key; + +ALTER TABLE view_base_table DROP CONSTRAINT view_base_table_pkey; -- fails + +CREATE VIEW key_dependent_view_no_cols AS + SELECT FROM view_base_table GROUP BY key HAVING length(data) > 0; + +-- +-- CREATE OR REPLACE VIEW +-- + +CREATE TABLE viewtest_tbl (a int, b int); +COPY viewtest_tbl FROM stdin; +5 10 +10 15 +15 20 +20 25 +\. + +CREATE OR REPLACE VIEW viewtest AS + SELECT * FROM viewtest_tbl; + +CREATE OR REPLACE VIEW viewtest AS + SELECT * FROM viewtest_tbl WHERE a > 10; + +SELECT * FROM viewtest; + +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b FROM viewtest_tbl WHERE a > 5 ORDER BY b DESC; + +SELECT * FROM viewtest; + +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT a FROM viewtest_tbl WHERE a <> 20; + +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT 1, * FROM viewtest_tbl; + +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b::numeric FROM viewtest_tbl; + +-- should work +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b, 0 AS c FROM viewtest_tbl; + +DROP VIEW viewtest; +DROP TABLE viewtest_tbl; + +-- tests for temporary views + +CREATE SCHEMA temp_view_test + CREATE TABLE base_table (a int, id int) + CREATE TABLE base_table2 (a int, id int); + +SET search_path TO temp_view_test, public; + +CREATE TEMPORARY TABLE temp_table (a int, id int); + +-- should be created in temp_view_test schema +CREATE VIEW v1 AS SELECT * FROM base_table; +-- should be created in temp object schema +CREATE VIEW v1_temp AS SELECT * FROM temp_table; +-- should be created in temp object schema +CREATE TEMP VIEW v2_temp AS SELECT * FROM base_table; +-- should be created in temp_views schema +CREATE VIEW temp_view_test.v2 AS SELECT * FROM base_table; +-- should fail +CREATE VIEW temp_view_test.v3_temp AS SELECT * FROM temp_table; +-- should fail +CREATE SCHEMA test_view_schema + CREATE TEMP VIEW testview AS SELECT 1; + +-- joins: if any of the join relations are temporary, the view +-- should also be temporary + +-- should be non-temp +CREATE VIEW v3 AS + SELECT t1.a AS t1_a, t2.a AS t2_a + FROM base_table t1, base_table2 t2 + WHERE t1.id = t2.id; +-- should be temp (one join rel is temp) +CREATE VIEW v4_temp AS + SELECT t1.a AS t1_a, t2.a AS t2_a + FROM base_table t1, temp_table t2 + WHERE t1.id = t2.id; +-- should be temp +CREATE VIEW v5_temp AS + SELECT t1.a AS t1_a, t2.a AS t2_a, t3.a AS t3_a + FROM base_table t1, base_table2 t2, temp_table t3 + WHERE t1.id = t2.id and t2.id = t3.id; + +-- subqueries +CREATE VIEW v4 AS SELECT * FROM base_table WHERE id IN (SELECT id FROM base_table2); +CREATE VIEW v5 AS SELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM base_table2) t2; +CREATE VIEW v6 AS SELECT * FROM base_table WHERE EXISTS (SELECT 1 FROM base_table2); +CREATE VIEW v7 AS SELECT * FROM base_table WHERE NOT EXISTS (SELECT 1 FROM base_table2); +CREATE VIEW v8 AS SELECT * FROM base_table WHERE EXISTS (SELECT 1); + +CREATE VIEW v6_temp AS SELECT * FROM base_table WHERE id IN (SELECT id FROM temp_table); +CREATE VIEW v7_temp AS SELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM temp_table) t2; +CREATE VIEW v8_temp AS SELECT * FROM base_table WHERE EXISTS (SELECT 1 FROM temp_table); +CREATE VIEW v9_temp AS SELECT * FROM base_table WHERE NOT EXISTS (SELECT 1 FROM temp_table); + +-- a view should also be temporary if it references a temporary view +CREATE VIEW v10_temp AS SELECT * FROM v7_temp; +CREATE VIEW v11_temp AS SELECT t1.id, t2.a FROM base_table t1, v10_temp t2; +CREATE VIEW v12_temp AS SELECT true FROM v11_temp; + +-- a view should also be temporary if it references a temporary sequence +CREATE SEQUENCE seq1; +CREATE TEMPORARY SEQUENCE seq1_temp; +CREATE VIEW v9 AS SELECT seq1.is_called FROM seq1; +CREATE VIEW v13_temp AS SELECT seq1_temp.is_called FROM seq1_temp; + +SELECT relname FROM pg_class + WHERE relname LIKE 'v_' + AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'temp_view_test') + ORDER BY relname; +SELECT relname FROM pg_class + WHERE relname LIKE 'v%' + AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE 'pg_temp%') + ORDER BY relname; + +CREATE SCHEMA testviewschm2; +SET search_path TO testviewschm2, public; + +CREATE TABLE t1 (num int, name text); +CREATE TABLE t2 (num2 int, value text); +CREATE TEMP TABLE tt (num2 int, value text); + +CREATE VIEW nontemp1 AS SELECT * FROM t1 CROSS JOIN t2; +CREATE VIEW temporal1 AS SELECT * FROM t1 CROSS JOIN tt; +CREATE VIEW nontemp2 AS SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num2; +CREATE VIEW temporal2 AS SELECT * FROM t1 INNER JOIN tt ON t1.num = tt.num2; +CREATE VIEW nontemp3 AS SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num2; +CREATE VIEW temporal3 AS SELECT * FROM t1 LEFT JOIN tt ON t1.num = tt.num2; +CREATE VIEW nontemp4 AS SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num2 AND t2.value = 'xxx'; +CREATE VIEW temporal4 AS SELECT * FROM t1 LEFT JOIN tt ON t1.num = tt.num2 AND tt.value = 'xxx'; + +SELECT relname FROM pg_class + WHERE relname LIKE 'nontemp%' + AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'testviewschm2') + ORDER BY relname; +SELECT relname FROM pg_class + WHERE relname LIKE 'temporal%' + AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE 'pg_temp%') + ORDER BY relname; + +CREATE TABLE tbl1 ( a int, b int); +CREATE TABLE tbl2 (c int, d int); +CREATE TABLE tbl3 (e int, f int); +CREATE TABLE tbl4 (g int, h int); +CREATE TEMP TABLE tmptbl (i int, j int); + +--Should be in testviewschm2 +CREATE VIEW pubview AS SELECT * FROM tbl1 WHERE tbl1.a +BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2) +AND EXISTS (SELECT g FROM tbl4 LEFT JOIN tbl3 ON tbl4.h = tbl3.f); + +SELECT count(*) FROM pg_class where relname = 'pubview' +AND relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname = 'testviewschm2'); + +--Should be in temp object schema +CREATE VIEW mytempview AS SELECT * FROM tbl1 WHERE tbl1.a +BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2) +AND EXISTS (SELECT g FROM tbl4 LEFT JOIN tbl3 ON tbl4.h = tbl3.f) +AND NOT EXISTS (SELECT g FROM tbl4 LEFT JOIN tmptbl ON tbl4.h = tmptbl.j); + +SELECT count(*) FROM pg_class where relname LIKE 'mytempview' +And relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname LIKE 'pg_temp%'); + +-- +-- CREATE VIEW and WITH(...) clause +-- +CREATE VIEW mysecview1 + AS SELECT * FROM tbl1 WHERE a = 0; +CREATE VIEW mysecview2 WITH (security_barrier=true) + AS SELECT * FROM tbl1 WHERE a > 0; +CREATE VIEW mysecview3 WITH (security_barrier=false) + AS SELECT * FROM tbl1 WHERE a < 0; +CREATE VIEW mysecview4 WITH (security_barrier) + AS SELECT * FROM tbl1 WHERE a <> 0; +CREATE VIEW mysecview5 WITH (security_barrier=100) -- Error + AS SELECT * FROM tbl1 WHERE a > 100; +CREATE VIEW mysecview6 WITH (invalid_option) -- Error + AS SELECT * FROM tbl1 WHERE a < 100; +SELECT relname, relkind, reloptions FROM pg_class + WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, + 'mysecview3'::regclass, 'mysecview4'::regclass) + ORDER BY relname; + +CREATE OR REPLACE VIEW mysecview1 + AS SELECT * FROM tbl1 WHERE a = 256; +CREATE OR REPLACE VIEW mysecview2 + AS SELECT * FROM tbl1 WHERE a > 256; +CREATE OR REPLACE VIEW mysecview3 WITH (security_barrier=true) + AS SELECT * FROM tbl1 WHERE a < 256; +CREATE OR REPLACE VIEW mysecview4 WITH (security_barrier=false) + AS SELECT * FROM tbl1 WHERE a <> 256; +SELECT relname, relkind, reloptions FROM pg_class + WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, + 'mysecview3'::regclass, 'mysecview4'::regclass) + ORDER BY relname; + +-- Check that unknown literals are converted to "text" in CREATE VIEW, +-- so that we don't end up with unknown-type columns. + +CREATE VIEW unspecified_types AS + SELECT 42 as i, 42.5 as num, 'foo' as u, 'foo'::unknown as u2, null as n; +\d+ unspecified_types +SELECT * FROM unspecified_types; + +-- This test checks that proper typmods are assigned in a multi-row VALUES + +CREATE VIEW tt1 AS + SELECT * FROM ( + VALUES + ('abc'::varchar(3), '0123456789', 42, 'abcd'::varchar(4)), + ('0123456789', 'abc'::varchar(3), 42.12, 'abc'::varchar(4)) + ) vv(a,b,c,d); +\d+ tt1 +SELECT * FROM tt1; +SELECT a::varchar(3) FROM tt1; +DROP VIEW tt1; + +-- Test view decompilation in the face of relation renaming conflicts + +CREATE TABLE tt1 (f1 int, f2 int, f3 text); +CREATE TABLE tx1 (x1 int, x2 int, x3 text); +CREATE TABLE temp_view_test.tt1 (y1 int, f2 int, f3 text); + +CREATE VIEW aliased_view_1 AS + select * from tt1 + where exists (select 1 from tx1 where tt1.f1 = tx1.x1); +CREATE VIEW aliased_view_2 AS + select * from tt1 a1 + where exists (select 1 from tx1 where a1.f1 = tx1.x1); +CREATE VIEW aliased_view_3 AS + select * from tt1 + where exists (select 1 from tx1 a2 where tt1.f1 = a2.x1); +CREATE VIEW aliased_view_4 AS + select * from temp_view_test.tt1 + where exists (select 1 from tt1 where temp_view_test.tt1.y1 = tt1.f1); + +\d+ aliased_view_1 +\d+ aliased_view_2 +\d+ aliased_view_3 +\d+ aliased_view_4 + +ALTER TABLE tx1 RENAME TO a1; + +\d+ aliased_view_1 +\d+ aliased_view_2 +\d+ aliased_view_3 +\d+ aliased_view_4 + +ALTER TABLE tt1 RENAME TO a2; + +\d+ aliased_view_1 +\d+ aliased_view_2 +\d+ aliased_view_3 +\d+ aliased_view_4 + +ALTER TABLE a1 RENAME TO tt1; + +\d+ aliased_view_1 +\d+ aliased_view_2 +\d+ aliased_view_3 +\d+ aliased_view_4 + +ALTER TABLE a2 RENAME TO tx1; +ALTER TABLE tx1 SET SCHEMA temp_view_test; + +\d+ aliased_view_1 +\d+ aliased_view_2 +\d+ aliased_view_3 +\d+ aliased_view_4 + +ALTER TABLE temp_view_test.tt1 RENAME TO tmp1; +ALTER TABLE temp_view_test.tmp1 SET SCHEMA testviewschm2; +ALTER TABLE tmp1 RENAME TO tx1; + +\d+ aliased_view_1 +\d+ aliased_view_2 +\d+ aliased_view_3 +\d+ aliased_view_4 + +-- Test aliasing of joins + +create view view_of_joins as +select * from + (select * from (tbl1 cross join tbl2) same) ss, + (tbl3 cross join tbl4) same; + +\d+ view_of_joins + +create table tbl1a (a int, c int); +create view view_of_joins_2a as select * from tbl1 join tbl1a using (a); +create view view_of_joins_2b as select * from tbl1 join tbl1a using (a) as x; +create view view_of_joins_2c as select * from (tbl1 join tbl1a using (a)) as y; +create view view_of_joins_2d as select * from (tbl1 join tbl1a using (a) as x) as y; + +select pg_get_viewdef('view_of_joins_2a', true); +select pg_get_viewdef('view_of_joins_2b', true); +select pg_get_viewdef('view_of_joins_2c', true); +select pg_get_viewdef('view_of_joins_2d', true); + +-- Test view decompilation in the face of column addition/deletion/renaming + +create table tt2 (a int, b int, c int); +create table tt3 (ax int8, b int2, c numeric); +create table tt4 (ay int, b int, q int); + +create view v1 as select * from tt2 natural join tt3; +create view v1a as select * from (tt2 natural join tt3) j; +create view v2 as select * from tt2 join tt3 using (b,c) join tt4 using (b); +create view v2a as select * from (tt2 join tt3 using (b,c) join tt4 using (b)) j; +create view v3 as select * from tt2 join tt3 using (b,c) full join tt4 using (b); + +select pg_get_viewdef('v1', true); +select pg_get_viewdef('v1a', true); +select pg_get_viewdef('v2', true); +select pg_get_viewdef('v2a', true); +select pg_get_viewdef('v3', true); + +alter table tt2 add column d int; +alter table tt2 add column e int; + +select pg_get_viewdef('v1', true); +select pg_get_viewdef('v1a', true); +select pg_get_viewdef('v2', true); +select pg_get_viewdef('v2a', true); +select pg_get_viewdef('v3', true); + +alter table tt3 rename c to d; + +select pg_get_viewdef('v1', true); +select pg_get_viewdef('v1a', true); +select pg_get_viewdef('v2', true); +select pg_get_viewdef('v2a', true); +select pg_get_viewdef('v3', true); + +alter table tt3 add column c int; +alter table tt3 add column e int; + +select pg_get_viewdef('v1', true); +select pg_get_viewdef('v1a', true); +select pg_get_viewdef('v2', true); +select pg_get_viewdef('v2a', true); +select pg_get_viewdef('v3', true); + +alter table tt2 drop column d; + +select pg_get_viewdef('v1', true); +select pg_get_viewdef('v1a', true); +select pg_get_viewdef('v2', true); +select pg_get_viewdef('v2a', true); +select pg_get_viewdef('v3', true); + +create table tt5 (a int, b int); +create table tt6 (c int, d int); +create view vv1 as select * from (tt5 cross join tt6) j(aa,bb,cc,dd); +select pg_get_viewdef('vv1', true); +alter table tt5 add column c int; +select pg_get_viewdef('vv1', true); +alter table tt5 add column cc int; +select pg_get_viewdef('vv1', true); +alter table tt5 drop column c; +select pg_get_viewdef('vv1', true); + +create view v4 as select * from v1; +alter view v1 rename column a to x; +select pg_get_viewdef('v1', true); +select pg_get_viewdef('v4', true); + + +-- Unnamed FULL JOIN USING is lots of fun too + +create table tt7 (x int, xx int, y int); +alter table tt7 drop column xx; +create table tt8 (x int, z int); + +create view vv2 as +select * from (values(1,2,3,4,5)) v(a,b,c,d,e) +union all +select * from tt7 full join tt8 using (x), tt8 tt8x; + +select pg_get_viewdef('vv2', true); + +create view vv3 as +select * from (values(1,2,3,4,5,6)) v(a,b,c,x,e,f) +union all +select * from + tt7 full join tt8 using (x), + tt7 tt7x full join tt8 tt8x using (x); + +select pg_get_viewdef('vv3', true); + +create view vv4 as +select * from (values(1,2,3,4,5,6,7)) v(a,b,c,x,e,f,g) +union all +select * from + tt7 full join tt8 using (x), + tt7 tt7x full join tt8 tt8x using (x) full join tt8 tt8y using (x); + +select pg_get_viewdef('vv4', true); + +alter table tt7 add column zz int; +alter table tt7 add column z int; +alter table tt7 drop column zz; +alter table tt8 add column z2 int; + +select pg_get_viewdef('vv2', true); +select pg_get_viewdef('vv3', true); +select pg_get_viewdef('vv4', true); + +-- Implicit coercions in a JOIN USING create issues similar to FULL JOIN + +create table tt7a (x date, xx int, y int); +alter table tt7a drop column xx; +create table tt8a (x timestamptz, z int); + +create view vv2a as +select * from (values(now(),2,3,now(),5)) v(a,b,c,d,e) +union all +select * from tt7a left join tt8a using (x), tt8a tt8ax; + +select pg_get_viewdef('vv2a', true); + +-- +-- Also check dropping a column that existed when the view was made +-- + +create table tt9 (x int, xx int, y int); +create table tt10 (x int, z int); + +create view vv5 as select x,y,z from tt9 join tt10 using(x); + +select pg_get_viewdef('vv5', true); + +alter table tt9 drop column xx; + +select pg_get_viewdef('vv5', true); + +-- +-- Another corner case is that we might add a column to a table below a +-- JOIN USING, and thereby make the USING column name ambiguous +-- + +create table tt11 (x int, y int); +create table tt12 (x int, z int); +create table tt13 (z int, q int); + +create view vv6 as select x,y,z,q from + (tt11 join tt12 using(x)) join tt13 using(z); + +select pg_get_viewdef('vv6', true); + +alter table tt11 add column z int; + +select pg_get_viewdef('vv6', true); + +-- +-- Check cases involving dropped/altered columns in a function's rowtype result +-- + +create table tt14t (f1 text, f2 text, f3 text, f4 text); +insert into tt14t values('foo', 'bar', 'baz', '42'); + +alter table tt14t drop column f2; + +create function tt14f() returns setof tt14t as +$$ +declare + rec1 record; +begin + for rec1 in select * from tt14t + loop + return next rec1; + end loop; +end; +$$ +language plpgsql; + +create view tt14v as select t.* from tt14f() t; + +select pg_get_viewdef('tt14v', true); +select * from tt14v; + +begin; + +-- this perhaps should be rejected, but it isn't: +alter table tt14t drop column f3; + +-- f3 is still in the view ... +select pg_get_viewdef('tt14v', true); +-- but will fail at execution +select f1, f4 from tt14v; +select * from tt14v; + +rollback; + +begin; + +-- this perhaps should be rejected, but it isn't: +alter table tt14t alter column f4 type integer using f4::integer; + +-- f4 is still in the view ... +select pg_get_viewdef('tt14v', true); +-- but will fail at execution +select f1, f3 from tt14v; +select * from tt14v; + +rollback; + +-- check display of whole-row variables in some corner cases + +create type nestedcomposite as (x int8_tbl); +create view tt15v as select row(i)::nestedcomposite from int8_tbl i; +select * from tt15v; +select pg_get_viewdef('tt15v', true); +select row(i.*::int8_tbl)::nestedcomposite from int8_tbl i; + +create view tt16v as select * from int8_tbl i, lateral(values(i)) ss; +select * from tt16v; +select pg_get_viewdef('tt16v', true); +select * from int8_tbl i, lateral(values(i.*::int8_tbl)) ss; + +create view tt17v as select * from int8_tbl i where i in (values(i)); +select * from tt17v; +select pg_get_viewdef('tt17v', true); +select * from int8_tbl i where i.* in (values(i.*::int8_tbl)); + +create table tt15v_log(o tt15v, n tt15v, incr bool); +create rule updlog as on update to tt15v do also + insert into tt15v_log values(old, new, row(old,old) < row(new,new)); +\d+ tt15v + +-- check unique-ification of overlength names + +create view tt18v as + select * from int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy + union all + select * from int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz; +select pg_get_viewdef('tt18v', true); +explain (costs off) select * from tt18v; + +-- check display of ScalarArrayOp with a sub-select + +select 'foo'::text = any(array['abc','def','foo']::text[]); +select 'foo'::text = any((select array['abc','def','foo']::text[])); -- fail +select 'foo'::text = any((select array['abc','def','foo']::text[])::text[]); + +create view tt19v as +select 'foo'::text = any(array['abc','def','foo']::text[]) c1, + 'foo'::text = any((select array['abc','def','foo']::text[])::text[]) c2; +select pg_get_viewdef('tt19v', true); + +-- check display of assorted RTE_FUNCTION expressions + +create view tt20v as +select * from + coalesce(1,2) as c, + collation for ('x'::text) col, + current_date as d, + localtimestamp(3) as t, + cast(1+2 as int4) as i4, + cast(1+2 as int8) as i8; +select pg_get_viewdef('tt20v', true); + +-- reverse-listing of various special function syntaxes required by SQL + +create view tt201v as +select + extract(day from now()) as extr, + (now(), '1 day'::interval) overlaps + (current_timestamp(2), '1 day'::interval) as o, + 'foo' is normalized isn, + 'foo' is nfkc normalized isnn, + normalize('foo') as n, + normalize('foo', nfkd) as nfkd, + overlay('foo' placing 'bar' from 2) as ovl, + overlay('foo' placing 'bar' from 2 for 3) as ovl2, + position('foo' in 'foobar') as p, + substring('foo' from 2 for 3) as s, + substring('foo' similar 'f' escape '#') as ss, + substring('foo' from 'oo') as ssf, -- historically-permitted abuse + trim(' ' from ' foo ') as bt, + trim(leading ' ' from ' foo ') as lt, + trim(trailing ' foo ') as rt, + trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) as btb, + trim(leading E'\\000'::bytea from E'\\000Tom\\000'::bytea) as ltb, + trim(trailing E'\\000'::bytea from E'\\000Tom\\000'::bytea) as rtb; +select pg_get_viewdef('tt201v', true); + +-- corner cases with empty join conditions + +create view tt21v as +select * from tt5 natural inner join tt6; +select pg_get_viewdef('tt21v', true); + +create view tt22v as +select * from tt5 natural left join tt6; +select pg_get_viewdef('tt22v', true); + +-- check handling of views with immediately-renamed columns + +create view tt23v (col_a, col_b) as +select q1 as other_name1, q2 as other_name2 from int8_tbl +union +select 42, 43; + +select pg_get_viewdef('tt23v', true); +select pg_get_ruledef(oid, true) from pg_rewrite + where ev_class = 'tt23v'::regclass and ev_type = '1'; + +-- test extraction of FieldSelect field names (get_name_for_var_field) + +create view tt24v as +with cte as materialized (select r from (values(1,2),(3,4)) r) +select (r).column2 as col_a, (rr).column2 as col_b from + cte join (select rr from (values(1,7),(3,8)) rr limit 2) ss + on (r).column1 = (rr).column1; +select pg_get_viewdef('tt24v', true); +create view tt25v as +with cte as materialized (select pg_get_keywords() k) +select (k).word from cte; +select pg_get_viewdef('tt25v', true); +-- also check cases seen only in EXPLAIN +explain (verbose, costs off) +select * from tt24v; +explain (verbose, costs off) +select (r).column2 from (select r from (values(1,2),(3,4)) r limit 1) ss; + +-- test pretty-print parenthesization rules, and SubLink deparsing + +create view tt26v as +select x + y + z as c1, + (x * y) + z as c2, + x + (y * z) as c3, + (x + y) * z as c4, + x * (y + z) as c5, + x + (y + z) as c6, + x + (y # z) as c7, + (x > y) AND (y > z OR x > z) as c8, + (x > y) OR (y > z AND NOT (x > z)) as c9, + (x,y) <> ALL (values(1,2),(3,4)) as c10, + (x,y) <= ANY (values(1,2),(3,4)) as c11 +from (values(1,2,3)) v(x,y,z); +select pg_get_viewdef('tt26v', true); + +-- clean up all the random objects we made above +DROP SCHEMA temp_view_test CASCADE; +DROP SCHEMA testviewschm2 CASCADE; diff --git a/src/test/singlenode_regress/sql/date.sql b/src/test/singlenode_regress/sql/date.sql new file mode 100644 index 00000000000..8f7435b767c --- /dev/null +++ b/src/test/singlenode_regress/sql/date.sql @@ -0,0 +1,366 @@ +-- +-- DATE +-- + +CREATE TABLE DATE_TBL (f1 date); + +INSERT INTO DATE_TBL VALUES ('1957-04-09'); +INSERT INTO DATE_TBL VALUES ('1957-06-13'); +INSERT INTO DATE_TBL VALUES ('1996-02-28'); +INSERT INTO DATE_TBL VALUES ('1996-02-29'); +INSERT INTO DATE_TBL VALUES ('1996-03-01'); +INSERT INTO DATE_TBL VALUES ('1996-03-02'); +INSERT INTO DATE_TBL VALUES ('1997-02-28'); +INSERT INTO DATE_TBL VALUES ('1997-02-29'); +INSERT INTO DATE_TBL VALUES ('1997-03-01'); +INSERT INTO DATE_TBL VALUES ('1997-03-02'); +INSERT INTO DATE_TBL VALUES ('2000-04-01'); +INSERT INTO DATE_TBL VALUES ('2000-04-02'); +INSERT INTO DATE_TBL VALUES ('2000-04-03'); +INSERT INTO DATE_TBL VALUES ('2038-04-08'); +INSERT INTO DATE_TBL VALUES ('2039-04-09'); +INSERT INTO DATE_TBL VALUES ('2040-04-10'); +INSERT INTO DATE_TBL VALUES ('2040-04-10 BC'); + +SELECT f1 FROM DATE_TBL; + +SELECT f1 FROM DATE_TBL WHERE f1 < '2000-01-01'; + +SELECT f1 FROM DATE_TBL + WHERE f1 BETWEEN '2000-01-01' AND '2001-01-01'; + +-- +-- Check all the documented input formats +-- +SET datestyle TO iso; -- display results in ISO + +SET datestyle TO ymd; + +SELECT date 'January 8, 1999'; +SELECT date '1999-01-08'; +SELECT date '1999-01-18'; +SELECT date '1/8/1999'; +SELECT date '1/18/1999'; +SELECT date '18/1/1999'; +SELECT date '01/02/03'; +SELECT date '19990108'; +SELECT date '990108'; +SELECT date '1999.008'; +SELECT date 'J2451187'; +SELECT date 'January 8, 99 BC'; + +SELECT date '99-Jan-08'; +SELECT date '1999-Jan-08'; +SELECT date '08-Jan-99'; +SELECT date '08-Jan-1999'; +SELECT date 'Jan-08-99'; +SELECT date 'Jan-08-1999'; +SELECT date '99-08-Jan'; +SELECT date '1999-08-Jan'; + +SELECT date '99 Jan 08'; +SELECT date '1999 Jan 08'; +SELECT date '08 Jan 99'; +SELECT date '08 Jan 1999'; +SELECT date 'Jan 08 99'; +SELECT date 'Jan 08 1999'; +SELECT date '99 08 Jan'; +SELECT date '1999 08 Jan'; + +SELECT date '99-01-08'; +SELECT date '1999-01-08'; +SELECT date '08-01-99'; +SELECT date '08-01-1999'; +SELECT date '01-08-99'; +SELECT date '01-08-1999'; +SELECT date '99-08-01'; +SELECT date '1999-08-01'; + +SELECT date '99 01 08'; +SELECT date '1999 01 08'; +SELECT date '08 01 99'; +SELECT date '08 01 1999'; +SELECT date '01 08 99'; +SELECT date '01 08 1999'; +SELECT date '99 08 01'; +SELECT date '1999 08 01'; + +SET datestyle TO dmy; + +SELECT date 'January 8, 1999'; +SELECT date '1999-01-08'; +SELECT date '1999-01-18'; +SELECT date '1/8/1999'; +SELECT date '1/18/1999'; +SELECT date '18/1/1999'; +SELECT date '01/02/03'; +SELECT date '19990108'; +SELECT date '990108'; +SELECT date '1999.008'; +SELECT date 'J2451187'; +SELECT date 'January 8, 99 BC'; + +SELECT date '99-Jan-08'; +SELECT date '1999-Jan-08'; +SELECT date '08-Jan-99'; +SELECT date '08-Jan-1999'; +SELECT date 'Jan-08-99'; +SELECT date 'Jan-08-1999'; +SELECT date '99-08-Jan'; +SELECT date '1999-08-Jan'; + +SELECT date '99 Jan 08'; +SELECT date '1999 Jan 08'; +SELECT date '08 Jan 99'; +SELECT date '08 Jan 1999'; +SELECT date 'Jan 08 99'; +SELECT date 'Jan 08 1999'; +SELECT date '99 08 Jan'; +SELECT date '1999 08 Jan'; + +SELECT date '99-01-08'; +SELECT date '1999-01-08'; +SELECT date '08-01-99'; +SELECT date '08-01-1999'; +SELECT date '01-08-99'; +SELECT date '01-08-1999'; +SELECT date '99-08-01'; +SELECT date '1999-08-01'; + +SELECT date '99 01 08'; +SELECT date '1999 01 08'; +SELECT date '08 01 99'; +SELECT date '08 01 1999'; +SELECT date '01 08 99'; +SELECT date '01 08 1999'; +SELECT date '99 08 01'; +SELECT date '1999 08 01'; + +SET datestyle TO mdy; + +SELECT date 'January 8, 1999'; +SELECT date '1999-01-08'; +SELECT date '1999-01-18'; +SELECT date '1/8/1999'; +SELECT date '1/18/1999'; +SELECT date '18/1/1999'; +SELECT date '01/02/03'; +SELECT date '19990108'; +SELECT date '990108'; +SELECT date '1999.008'; +SELECT date 'J2451187'; +SELECT date 'January 8, 99 BC'; + +SELECT date '99-Jan-08'; +SELECT date '1999-Jan-08'; +SELECT date '08-Jan-99'; +SELECT date '08-Jan-1999'; +SELECT date 'Jan-08-99'; +SELECT date 'Jan-08-1999'; +SELECT date '99-08-Jan'; +SELECT date '1999-08-Jan'; + +SELECT date '99 Jan 08'; +SELECT date '1999 Jan 08'; +SELECT date '08 Jan 99'; +SELECT date '08 Jan 1999'; +SELECT date 'Jan 08 99'; +SELECT date 'Jan 08 1999'; +SELECT date '99 08 Jan'; +SELECT date '1999 08 Jan'; + +SELECT date '99-01-08'; +SELECT date '1999-01-08'; +SELECT date '08-01-99'; +SELECT date '08-01-1999'; +SELECT date '01-08-99'; +SELECT date '01-08-1999'; +SELECT date '99-08-01'; +SELECT date '1999-08-01'; + +SELECT date '99 01 08'; +SELECT date '1999 01 08'; +SELECT date '08 01 99'; +SELECT date '08 01 1999'; +SELECT date '01 08 99'; +SELECT date '01 08 1999'; +SELECT date '99 08 01'; +SELECT date '1999 08 01'; + +-- Check upper and lower limits of date range +SELECT date '4714-11-24 BC'; +SELECT date '4714-11-23 BC'; -- out of range +SELECT date '5874897-12-31'; +SELECT date '5874898-01-01'; -- out of range + +RESET datestyle; + +-- +-- Simple math +-- Leave most of it for the horology tests +-- + +SELECT f1 - date '2000-01-01' AS "Days From 2K" FROM DATE_TBL; + +SELECT f1 - date 'epoch' AS "Days From Epoch" FROM DATE_TBL; + +SELECT date 'yesterday' - date 'today' AS "One day"; + +SELECT date 'today' - date 'tomorrow' AS "One day"; + +SELECT date 'yesterday' - date 'tomorrow' AS "Two days"; + +SELECT date 'tomorrow' - date 'today' AS "One day"; + +SELECT date 'today' - date 'yesterday' AS "One day"; + +SELECT date 'tomorrow' - date 'yesterday' AS "Two days"; + +-- +-- test extract! +-- +SELECT f1 as "date", + date_part('year', f1) AS year, + date_part('month', f1) AS month, + date_part('day', f1) AS day, + date_part('quarter', f1) AS quarter, + date_part('decade', f1) AS decade, + date_part('century', f1) AS century, + date_part('millennium', f1) AS millennium, + date_part('isoyear', f1) AS isoyear, + date_part('week', f1) AS week, + date_part('dow', f1) AS dow, + date_part('isodow', f1) AS isodow, + date_part('doy', f1) AS doy, + date_part('julian', f1) AS julian, + date_part('epoch', f1) AS epoch + FROM date_tbl; +-- +-- epoch +-- +SELECT EXTRACT(EPOCH FROM DATE '1970-01-01'); -- 0 +-- +-- century +-- +SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2 +SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1 +SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1 +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1 +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); -- 1 +SELECT EXTRACT(CENTURY FROM DATE '1900-12-31'); -- 19 +SELECT EXTRACT(CENTURY FROM DATE '1901-01-01'); -- 20 +SELECT EXTRACT(CENTURY FROM DATE '2000-12-31'); -- 20 +SELECT EXTRACT(CENTURY FROM DATE '2001-01-01'); -- 21 +SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true +-- +-- millennium +-- +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1 +SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1 +SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31'); -- 1 +SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01'); -- 2 +SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31'); -- 2 +SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01'); -- 3 +-- next test to be fixed on the turn of the next millennium;-) +SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3 +-- +-- decade +-- +SELECT EXTRACT(DECADE FROM DATE '1994-12-25'); -- 199 +SELECT EXTRACT(DECADE FROM DATE '0010-01-01'); -- 1 +SELECT EXTRACT(DECADE FROM DATE '0009-12-31'); -- 0 +SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); -- 0 +SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 +SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); -- -1 +SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 +-- +-- all possible fields +-- +SELECT EXTRACT(MICROSECONDS FROM DATE '2020-08-11'); +SELECT EXTRACT(MILLISECONDS FROM DATE '2020-08-11'); +SELECT EXTRACT(SECOND FROM DATE '2020-08-11'); +SELECT EXTRACT(MINUTE FROM DATE '2020-08-11'); +SELECT EXTRACT(HOUR FROM DATE '2020-08-11'); +SELECT EXTRACT(DAY FROM DATE '2020-08-11'); +SELECT EXTRACT(MONTH FROM DATE '2020-08-11'); +SELECT EXTRACT(YEAR FROM DATE '2020-08-11'); +SELECT EXTRACT(YEAR FROM DATE '2020-08-11 BC'); +SELECT EXTRACT(DECADE FROM DATE '2020-08-11'); +SELECT EXTRACT(CENTURY FROM DATE '2020-08-11'); +SELECT EXTRACT(MILLENNIUM FROM DATE '2020-08-11'); +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11'); +SELECT EXTRACT(ISOYEAR FROM DATE '2020-08-11 BC'); +SELECT EXTRACT(QUARTER FROM DATE '2020-08-11'); +SELECT EXTRACT(WEEK FROM DATE '2020-08-11'); +SELECT EXTRACT(DOW FROM DATE '2020-08-11'); +SELECT EXTRACT(DOW FROM DATE '2020-08-16'); +SELECT EXTRACT(ISODOW FROM DATE '2020-08-11'); +SELECT EXTRACT(ISODOW FROM DATE '2020-08-16'); +SELECT EXTRACT(DOY FROM DATE '2020-08-11'); +SELECT EXTRACT(TIMEZONE FROM DATE '2020-08-11'); +SELECT EXTRACT(TIMEZONE_M FROM DATE '2020-08-11'); +SELECT EXTRACT(TIMEZONE_H FROM DATE '2020-08-11'); +SELECT EXTRACT(EPOCH FROM DATE '2020-08-11'); +SELECT EXTRACT(JULIAN FROM DATE '2020-08-11'); +-- +-- test trunc function! +-- +SELECT DATE_TRUNC('MILLENNIUM', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1001 +SELECT DATE_TRUNC('MILLENNIUM', DATE '1970-03-20'); -- 1001-01-01 +SELECT DATE_TRUNC('CENTURY', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1901 +SELECT DATE_TRUNC('CENTURY', DATE '1970-03-20'); -- 1901 +SELECT DATE_TRUNC('CENTURY', DATE '2004-08-10'); -- 2001-01-01 +SELECT DATE_TRUNC('CENTURY', DATE '0002-02-04'); -- 0001-01-01 +SELECT DATE_TRUNC('CENTURY', DATE '0055-08-10 BC'); -- 0100-01-01 BC +SELECT DATE_TRUNC('DECADE', DATE '1993-12-25'); -- 1990-01-01 +SELECT DATE_TRUNC('DECADE', DATE '0004-12-25'); -- 0001-01-01 BC +SELECT DATE_TRUNC('DECADE', DATE '0002-12-31 BC'); -- 0011-01-01 BC +-- +-- test infinity +-- +select 'infinity'::date, '-infinity'::date; +select 'infinity'::date > 'today'::date as t; +select '-infinity'::date < 'today'::date as t; +select isfinite('infinity'::date), isfinite('-infinity'::date), isfinite('today'::date); +-- +-- oscillating fields from non-finite date: +-- +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(DAY FROM DATE '-infinity'); -- NULL +-- all supported fields +SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(MONTH FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(QUARTER FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(WEEK FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(DOW FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(ISODOW FROM DATE 'infinity'); -- NULL +SELECT EXTRACT(DOY FROM DATE 'infinity'); -- NULL +-- +-- monotonic fields from non-finite date: +-- +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(EPOCH FROM DATE '-infinity'); -- -Infinity +-- all supported fields +SELECT EXTRACT(YEAR FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(DECADE FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(CENTURY FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(JULIAN FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(ISOYEAR FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity +-- +-- wrong fields from non-finite date: +-- +SELECT EXTRACT(MICROSEC FROM DATE 'infinity'); -- error + +-- test constructors +select make_date(2013, 7, 15); +select make_date(-44, 3, 15); +select make_time(8, 20, 0.0); +-- should fail +select make_date(0, 7, 15); +select make_date(2013, 2, 30); +select make_date(2013, 13, 1); +select make_date(2013, 11, -1); +select make_time(10, 55, 100.1); +select make_time(24, 0, 2.1); diff --git a/src/test/singlenode_regress/sql/dbsize.sql b/src/test/singlenode_regress/sql/dbsize.sql new file mode 100644 index 00000000000..6a45c5eb1cf --- /dev/null +++ b/src/test/singlenode_regress/sql/dbsize.sql @@ -0,0 +1,67 @@ +SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM + (VALUES (10::bigint), (1000::bigint), (1000000::bigint), + (1000000000::bigint), (1000000000000::bigint), + (1000000000000000::bigint)) x(size); + +SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM + (VALUES (10::numeric), (1000::numeric), (1000000::numeric), + (1000000000::numeric), (1000000000000::numeric), + (1000000000000000::numeric), + (10.5::numeric), (1000.5::numeric), (1000000.5::numeric), + (1000000000.5::numeric), (1000000000000.5::numeric), + (1000000000000000.5::numeric)) x(size); + +-- test where units change up +SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM + (VALUES (10239::bigint), (10240::bigint), + (10485247::bigint), (10485248::bigint), + (10736893951::bigint), (10736893952::bigint), + (10994579406847::bigint), (10994579406848::bigint), + (11258449312612351::bigint), (11258449312612352::bigint)) x(size); + +SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM + (VALUES (10239::numeric), (10240::numeric), + (10485247::numeric), (10485248::numeric), + (10736893951::numeric), (10736893952::numeric), + (10994579406847::numeric), (10994579406848::numeric), + (11258449312612351::numeric), (11258449312612352::numeric)) x(size); + +-- pg_size_bytes() tests +SELECT size, pg_size_bytes(size) FROM + (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), + ('1TB'), ('3000 TB'), ('1e6 MB')) x(size); + +-- case-insensitive units are supported +SELECT size, pg_size_bytes(size) FROM + (VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '), + ('1tb'), ('3000 tb'), ('1e6 mb')) x(size); + +-- negative numbers are supported +SELECT size, pg_size_bytes(size) FROM + (VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '), + ('-1tb'), ('-3000 TB'), ('-10e-1 MB')) x(size); + +-- different cases with allowed points +SELECT size, pg_size_bytes(size) FROM + (VALUES ('-1.'), ('-1.kb'), ('-1. kb'), ('-0. gb'), + ('-.1'), ('-.1kb'), ('-.1 kb'), ('-.0 gb')) x(size); + +-- invalid inputs +SELECT pg_size_bytes('1 AB'); +SELECT pg_size_bytes('1 AB A'); +SELECT pg_size_bytes('1 AB A '); +SELECT pg_size_bytes('9223372036854775807.9'); +SELECT pg_size_bytes('1e100'); +SELECT pg_size_bytes('1e1000000000000000000'); +SELECT pg_size_bytes('1 byte'); -- the singular "byte" is not supported +SELECT pg_size_bytes(''); + +SELECT pg_size_bytes('kb'); +SELECT pg_size_bytes('..'); +SELECT pg_size_bytes('-.'); +SELECT pg_size_bytes('-.kb'); +SELECT pg_size_bytes('-. kb'); + +SELECT pg_size_bytes('.+912'); +SELECT pg_size_bytes('+912+ kB'); +SELECT pg_size_bytes('++123 kB'); diff --git a/src/test/singlenode_regress/sql/delete.sql b/src/test/singlenode_regress/sql/delete.sql new file mode 100644 index 00000000000..d8cb99e93cb --- /dev/null +++ b/src/test/singlenode_regress/sql/delete.sql @@ -0,0 +1,25 @@ +CREATE TABLE delete_test ( + id SERIAL PRIMARY KEY, + a INT, + b text +); + +INSERT INTO delete_test (a) VALUES (10); +INSERT INTO delete_test (a, b) VALUES (50, repeat('x', 10000)); +INSERT INTO delete_test (a) VALUES (100); + +-- allow an alias to be specified for DELETE's target table +DELETE FROM delete_test AS dt WHERE dt.a > 75; + +-- if an alias is specified, don't allow the original table name +-- to be referenced +DELETE FROM delete_test dt WHERE delete_test.a > 25; + +SELECT id, a, char_length(b) FROM delete_test; + +-- delete a row with a TOASTed value +DELETE FROM delete_test WHERE a > 25; + +SELECT id, a, char_length(b) FROM delete_test; + +DROP TABLE delete_test; diff --git a/src/test/singlenode_regress/sql/dependency.sql b/src/test/singlenode_regress/sql/dependency.sql new file mode 100644 index 00000000000..2559c62d0b8 --- /dev/null +++ b/src/test/singlenode_regress/sql/dependency.sql @@ -0,0 +1,116 @@ +-- +-- DEPENDENCIES +-- + +CREATE USER regress_dep_user; +CREATE USER regress_dep_user2; +CREATE USER regress_dep_user3; +CREATE GROUP regress_dep_group; + +CREATE TABLE deptest (f1 serial primary key, f2 text); + +GRANT SELECT ON TABLE deptest TO GROUP regress_dep_group; +GRANT ALL ON TABLE deptest TO regress_dep_user, regress_dep_user2; + +-- can't drop neither because they have privileges somewhere +DROP USER regress_dep_user; +DROP GROUP regress_dep_group; + +-- if we revoke the privileges we can drop the group +REVOKE SELECT ON deptest FROM GROUP regress_dep_group; +DROP GROUP regress_dep_group; + +-- can't drop the user if we revoke the privileges partially +REVOKE SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES ON deptest FROM regress_dep_user; +DROP USER regress_dep_user; + +-- now we are OK to drop him +REVOKE TRIGGER ON deptest FROM regress_dep_user; +DROP USER regress_dep_user; + +-- we are OK too if we drop the privileges all at once +REVOKE ALL ON deptest FROM regress_dep_user2; +DROP USER regress_dep_user2; + +-- can't drop the owner of an object +-- the error message detail here would include a pg_toast_nnn name that +-- is not constant, so suppress it +\set VERBOSITY terse +ALTER TABLE deptest OWNER TO regress_dep_user3; +DROP USER regress_dep_user3; +\set VERBOSITY default + +-- if we drop the object, we can drop the user too +DROP TABLE deptest; +DROP USER regress_dep_user3; + +-- Test DROP OWNED +CREATE USER regress_dep_user0; +CREATE USER regress_dep_user1; +CREATE USER regress_dep_user2; +SET SESSION AUTHORIZATION regress_dep_user0; +-- permission denied +DROP OWNED BY regress_dep_user1; +DROP OWNED BY regress_dep_user0, regress_dep_user2; +REASSIGN OWNED BY regress_dep_user0 TO regress_dep_user1; +REASSIGN OWNED BY regress_dep_user1 TO regress_dep_user0; +-- this one is allowed +DROP OWNED BY regress_dep_user0; + +CREATE TABLE deptest1 (f1 int unique); +GRANT ALL ON deptest1 TO regress_dep_user1 WITH GRANT OPTION; + +SET SESSION AUTHORIZATION regress_dep_user1; +CREATE TABLE deptest (a serial primary key, b text); +GRANT ALL ON deptest1 TO regress_dep_user2; +RESET SESSION AUTHORIZATION; +\z deptest1 + +DROP OWNED BY regress_dep_user1; +-- all grants revoked +\z deptest1 +-- table was dropped +\d deptest + +-- Test REASSIGN OWNED +GRANT ALL ON deptest1 TO regress_dep_user1; +GRANT CREATE ON DATABASE regression TO regress_dep_user1; + +SET SESSION AUTHORIZATION regress_dep_user1; +CREATE SCHEMA deptest; +CREATE TABLE deptest (a serial primary key, b text); +ALTER DEFAULT PRIVILEGES FOR ROLE regress_dep_user1 IN SCHEMA deptest + GRANT ALL ON TABLES TO regress_dep_user2; +CREATE FUNCTION deptest_func() RETURNS void LANGUAGE plpgsql + AS $$ BEGIN END; $$; +CREATE TYPE deptest_enum AS ENUM ('red'); +CREATE TYPE deptest_range AS RANGE (SUBTYPE = int4); + +CREATE TABLE deptest2 (f1 int); +-- make a serial column the hard way +CREATE SEQUENCE ss1; +ALTER TABLE deptest2 ALTER f1 SET DEFAULT nextval('ss1'); +ALTER SEQUENCE ss1 OWNED BY deptest2.f1; + +-- When reassigning ownership of a composite type, its pg_class entry +-- should match +CREATE TYPE deptest_t AS (a int); +SELECT typowner = relowner +FROM pg_type JOIN pg_class c ON typrelid = c.oid WHERE typname = 'deptest_t'; + +RESET SESSION AUTHORIZATION; +REASSIGN OWNED BY regress_dep_user1 TO regress_dep_user2; +\dt deptest + +SELECT typowner = relowner +FROM pg_type JOIN pg_class c ON typrelid = c.oid WHERE typname = 'deptest_t'; + +-- doesn't work: grant still exists +DROP USER regress_dep_user1; +DROP OWNED BY regress_dep_user1; +DROP USER regress_dep_user1; + +DROP USER regress_dep_user2; +DROP OWNED BY regress_dep_user2, regress_dep_user0; +DROP USER regress_dep_user2; +DROP USER regress_dep_user0; diff --git a/src/test/singlenode_regress/sql/disable_autovacuum.sql b/src/test/singlenode_regress/sql/disable_autovacuum.sql new file mode 100644 index 00000000000..7b75d061b46 --- /dev/null +++ b/src/test/singlenode_regress/sql/disable_autovacuum.sql @@ -0,0 +1,2 @@ +alter system set autovacuum = off; +select gp_segment_id, pg_reload_conf() from gp_id union select gp_segment_id, pg_reload_conf() from gp_dist_random('gp_id'); diff --git a/src/test/singlenode_regress/sql/domain.sql b/src/test/singlenode_regress/sql/domain.sql new file mode 100644 index 00000000000..b735d9bfe19 --- /dev/null +++ b/src/test/singlenode_regress/sql/domain.sql @@ -0,0 +1,792 @@ +-- +-- Test domains. +-- + +-- Test Comment / Drop +create domain domaindroptest int4; +comment on domain domaindroptest is 'About to drop this..'; + +create domain dependenttypetest domaindroptest; + +-- fail because of dependent type +drop domain domaindroptest; + +drop domain domaindroptest cascade; + +-- this should fail because already gone +drop domain domaindroptest cascade; + + +-- Test domain input. + +-- Note: the point of checking both INSERT and COPY FROM is that INSERT +-- exercises CoerceToDomain while COPY exercises domain_in. + +create domain domainvarchar varchar(5); +create domain domainnumeric numeric(8,2); +create domain domainint4 int4; +create domain domaintext text; + +-- Test explicit coercions --- these should succeed (and truncate) +SELECT cast('123456' as domainvarchar); +SELECT cast('12345' as domainvarchar); + +-- Test tables using domains +create table basictest + ( testint4 domainint4 + , testtext domaintext + , testvarchar domainvarchar + , testnumeric domainnumeric + ); + +INSERT INTO basictest values ('88', 'haha', 'short', '123.12'); -- Good +INSERT INTO basictest values ('88', 'haha', 'short text', '123.12'); -- Bad varchar +INSERT INTO basictest values ('88', 'haha', 'short', '123.1212'); -- Truncate numeric + +-- Test copy +COPY basictest (testvarchar) FROM stdin; -- fail +notsoshorttext +\. + +COPY basictest (testvarchar) FROM stdin; +short +\. + +select * from basictest; + +-- check that domains inherit operations from base types +select testtext || testvarchar as concat, testnumeric + 42 as sum +from basictest; + +-- check that union/case/coalesce type resolution handles domains properly +select pg_typeof(coalesce(4::domainint4, 7)); +select pg_typeof(coalesce(4::domainint4, 7::domainint4)); + +drop table basictest; +drop domain domainvarchar restrict; +drop domain domainnumeric restrict; +drop domain domainint4 restrict; +drop domain domaintext; + + +-- Test domains over array types + +create domain domainint4arr int4[1]; +create domain domainchar4arr varchar(4)[2][3]; + +create table domarrtest + ( testint4arr domainint4arr + , testchar4arr domainchar4arr + ); +INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"}}'); +INSERT INTO domarrtest values ('{{2,2},{2,2}}', '{{"a","b"}}'); +INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"},{"e","f"}}'); +INSERT INTO domarrtest values ('{2,2}', '{{"a"},{"c"}}'); +INSERT INTO domarrtest values (NULL, '{{"a","b","c"},{"d","e","f"}}'); +INSERT INTO domarrtest values (NULL, '{{"toolong","b","c"},{"d","e","f"}}'); +INSERT INTO domarrtest (testint4arr[1], testint4arr[3]) values (11,22); +select * from domarrtest; +select testint4arr[1], testchar4arr[2:2] from domarrtest; +select array_dims(testint4arr), array_dims(testchar4arr) from domarrtest; + +COPY domarrtest FROM stdin; +{3,4} {q,w,e} +\N \N +\. + +COPY domarrtest FROM stdin; -- fail +{3,4} {qwerty,w,e} +\. + +select * from domarrtest; + +update domarrtest set + testint4arr[1] = testint4arr[1] + 1, + testint4arr[3] = testint4arr[3] - 1 +where testchar4arr is null; + +select * from domarrtest where testchar4arr is null; + +drop table domarrtest; +drop domain domainint4arr restrict; +drop domain domainchar4arr restrict; + +create domain dia as int[]; +select '{1,2,3}'::dia; +select array_dims('{1,2,3}'::dia); +select pg_typeof('{1,2,3}'::dia); +select pg_typeof('{1,2,3}'::dia || 42); -- should be int[] not dia +drop domain dia; + + +-- Test domains over composites + +create type comptype as (r float8, i float8); +create domain dcomptype as comptype; +create table dcomptable (d1 dcomptype unique); + +insert into dcomptable values (row(1,2)::dcomptype); +insert into dcomptable values (row(3,4)::comptype); +insert into dcomptable values (row(1,2)::dcomptype); -- fail on uniqueness +insert into dcomptable (d1.r) values(11); + +select * from dcomptable; +select (d1).r, (d1).i, (d1).* from dcomptable; +update dcomptable set d1.r = (d1).r + 1 where (d1).i > 0; +select * from dcomptable; + +alter domain dcomptype add constraint c1 check ((value).r <= (value).i); +alter domain dcomptype add constraint c2 check ((value).r > (value).i); -- fail + +select row(2,1)::dcomptype; -- fail +insert into dcomptable values (row(1,2)::comptype); +insert into dcomptable values (row(2,1)::comptype); -- fail +insert into dcomptable (d1.r) values(99); +insert into dcomptable (d1.r, d1.i) values(99, 100); +insert into dcomptable (d1.r, d1.i) values(100, 99); -- fail +update dcomptable set d1.r = (d1).r + 1 where (d1).i > 0; -- fail +update dcomptable set d1.r = (d1).r - 1, d1.i = (d1).i + 1 where (d1).i > 0; +select * from dcomptable; + +explain (verbose, costs off) + update dcomptable set d1.r = (d1).r - 1, d1.i = (d1).i + 1 where (d1).i > 0; +create rule silly as on delete to dcomptable do instead + update dcomptable set d1.r = (d1).r - 1, d1.i = (d1).i + 1 where (d1).i > 0; +\d+ dcomptable + +create function makedcomp(r float8, i float8) returns dcomptype +as 'select row(r, i)' language sql; + +select makedcomp(1,2); +select makedcomp(2,1); -- fail +select * from makedcomp(1,2) m; +select m, m is not null from makedcomp(1,2) m; + +drop function makedcomp(float8, float8); +drop table dcomptable; +drop type comptype cascade; + + +-- check altering and dropping columns used by domain constraints +create type comptype as (r float8, i float8); +create domain dcomptype as comptype; +alter domain dcomptype add constraint c1 check ((value).r > 0); +comment on constraint c1 on domain dcomptype is 'random commentary'; + +select row(0,1)::dcomptype; -- fail + +alter type comptype alter attribute r type varchar; -- fail +alter type comptype alter attribute r type bigint; + +alter type comptype drop attribute r; -- fail +alter type comptype drop attribute i; + +select conname, obj_description(oid, 'pg_constraint') from pg_constraint + where contypid = 'dcomptype'::regtype; -- check comment is still there + +drop type comptype cascade; + + +-- Test domains over arrays of composite + +create type comptype as (r float8, i float8); +create domain dcomptypea as comptype[]; +create table dcomptable (d1 dcomptypea unique); + +insert into dcomptable values (array[row(1,2)]::dcomptypea); +insert into dcomptable values (array[row(3,4), row(5,6)]::comptype[]); +insert into dcomptable values (array[row(7,8)::comptype, row(9,10)::comptype]); +insert into dcomptable values (array[row(1,2)]::dcomptypea); -- fail on uniqueness +insert into dcomptable (d1[1]) values(row(9,10)); +insert into dcomptable (d1[1].r) values(11); + +select * from dcomptable; +select d1[2], d1[1].r, d1[1].i from dcomptable; +update dcomptable set d1[2] = row(d1[2].i, d1[2].r); +select * from dcomptable; +update dcomptable set d1[1].r = d1[1].r + 1 where d1[1].i > 0; +select * from dcomptable; + +alter domain dcomptypea add constraint c1 check (value[1].r <= value[1].i); +alter domain dcomptypea add constraint c2 check (value[1].r > value[1].i); -- fail + +select array[row(2,1)]::dcomptypea; -- fail +insert into dcomptable values (array[row(1,2)]::comptype[]); +insert into dcomptable values (array[row(2,1)]::comptype[]); -- fail +insert into dcomptable (d1[1].r) values(99); +insert into dcomptable (d1[1].r, d1[1].i) values(99, 100); +insert into dcomptable (d1[1].r, d1[1].i) values(100, 99); -- fail +update dcomptable set d1[1].r = d1[1].r + 1 where d1[1].i > 0; -- fail +update dcomptable set d1[1].r = d1[1].r - 1, d1[1].i = d1[1].i + 1 + where d1[1].i > 0; +select * from dcomptable; + +explain (verbose, costs off) + update dcomptable set d1[1].r = d1[1].r - 1, d1[1].i = d1[1].i + 1 + where d1[1].i > 0; +create rule silly as on delete to dcomptable do instead + update dcomptable set d1[1].r = d1[1].r - 1, d1[1].i = d1[1].i + 1 + where d1[1].i > 0; +\d+ dcomptable + +drop table dcomptable; +drop type comptype cascade; + + +-- Test arrays over domains + +create domain posint as int check (value > 0); + +create table pitable (f1 posint[]); +insert into pitable values(array[42]); +insert into pitable values(array[-1]); -- fail +insert into pitable values('{0}'); -- fail +update pitable set f1[1] = f1[1] + 1; +update pitable set f1[1] = 0; -- fail +select * from pitable; +drop table pitable; + +create domain vc4 as varchar(4); +create table vc4table (f1 vc4[]); +insert into vc4table values(array['too long']); -- fail +insert into vc4table values(array['too long']::vc4[]); -- cast truncates +select * from vc4table; +drop table vc4table; +drop type vc4; + +-- You can sort of fake arrays-of-arrays by putting a domain in between +create domain dposinta as posint[]; +create table dposintatable (f1 dposinta[]); +insert into dposintatable values(array[array[42]]); -- fail +insert into dposintatable values(array[array[42]::posint[]]); -- still fail +insert into dposintatable values(array[array[42]::dposinta]); -- but this works +select f1, f1[1], (f1[1])[1] from dposintatable; +select pg_typeof(f1) from dposintatable; +select pg_typeof(f1[1]) from dposintatable; +select pg_typeof(f1[1][1]) from dposintatable; +select pg_typeof((f1[1])[1]) from dposintatable; +update dposintatable set f1[2] = array[99]; +select f1, f1[1], (f1[2])[1] from dposintatable; +-- it'd be nice if you could do something like this, but for now you can't: +update dposintatable set f1[2][1] = array[97]; +-- maybe someday we can make this syntax work: +update dposintatable set (f1[2])[1] = array[98]; + +drop table dposintatable; +drop domain posint cascade; + + +-- Test arrays over domains of composite + +create type comptype as (cf1 int, cf2 int); +create domain dcomptype as comptype check ((value).cf1 > 0); + +create table dcomptable (f1 dcomptype[]); +insert into dcomptable values (null); +update dcomptable set f1[1].cf2 = 5; +table dcomptable; +update dcomptable set f1[1].cf1 = -1; -- fail +update dcomptable set f1[1].cf1 = 1; +table dcomptable; +-- if there's no constraints, a different code path is taken: +alter domain dcomptype drop constraint dcomptype_check; +update dcomptable set f1[1].cf1 = -1; -- now ok +table dcomptable; + +drop table dcomptable; +drop type comptype cascade; + + +-- Test not-null restrictions + +create domain dnotnull varchar(15) NOT NULL; +create domain dnull varchar(15); +create domain dcheck varchar(15) NOT NULL CHECK (VALUE = 'a' OR VALUE = 'c' OR VALUE = 'd'); + +create table nulltest + ( col1 dnotnull + , col2 dnotnull NULL -- NOT NULL in the domain cannot be overridden + , col3 dnull NOT NULL + , col4 dnull + , col5 dcheck CHECK (col5 IN ('c', 'd')) + ); +INSERT INTO nulltest DEFAULT VALUES; +INSERT INTO nulltest values ('a', 'b', 'c', 'd', 'c'); -- Good +insert into nulltest values ('a', 'b', 'c', 'd', NULL); +insert into nulltest values ('a', 'b', 'c', 'd', 'a'); +INSERT INTO nulltest values (NULL, 'b', 'c', 'd', 'd'); +INSERT INTO nulltest values ('a', NULL, 'c', 'd', 'c'); +INSERT INTO nulltest values ('a', 'b', NULL, 'd', 'c'); +INSERT INTO nulltest values ('a', 'b', 'c', NULL, 'd'); -- Good + +-- Test copy +COPY nulltest FROM stdin; --fail +a b \N d d +\. + +COPY nulltest FROM stdin; --fail +a b c d \N +\. + +-- Last row is bad +COPY nulltest FROM stdin; +a b c \N c +a b c \N d +a b c \N a +\. + +select * from nulltest; + +-- Test out coerced (casted) constraints +SELECT cast('1' as dnotnull); +SELECT cast(NULL as dnotnull); -- fail +SELECT cast(cast(NULL as dnull) as dnotnull); -- fail +SELECT cast(col4 as dnotnull) from nulltest; -- fail + +-- cleanup +drop table nulltest; +drop domain dnotnull restrict; +drop domain dnull restrict; +drop domain dcheck restrict; + + +create domain ddef1 int4 DEFAULT 3; +create domain ddef2 oid DEFAULT '12'; +-- Type mixing, function returns int8 +create domain ddef3 text DEFAULT 5; +create sequence ddef4_seq; +create domain ddef4 int4 DEFAULT nextval('ddef4_seq'); +create domain ddef5 numeric(8,2) NOT NULL DEFAULT '12.12'; + +create table defaulttest + ( col1 ddef1 + , col2 ddef2 + , col3 ddef3 + , col4 ddef4 PRIMARY KEY + , col5 ddef1 NOT NULL DEFAULT NULL + , col6 ddef2 DEFAULT '88' + , col7 ddef4 DEFAULT 8000 + , col8 ddef5 + ); +insert into defaulttest(col4) values(0); -- fails, col5 defaults to null +alter table defaulttest alter column col5 drop default; +insert into defaulttest default values; -- succeeds, inserts domain default +-- We used to treat SET DEFAULT NULL as equivalent to DROP DEFAULT; wrong +alter table defaulttest alter column col5 set default null; +insert into defaulttest(col4) values(0); -- fails +alter table defaulttest alter column col5 drop default; +insert into defaulttest default values; +insert into defaulttest default values; + +-- Test defaults with copy +COPY defaulttest(col5) FROM stdin; +42 +\. + +select * from defaulttest; + +drop table defaulttest cascade; + +-- Test ALTER DOMAIN .. NOT NULL +create domain dnotnulltest integer; +create table domnotnull +( col1 dnotnulltest +, col2 dnotnulltest +); + +insert into domnotnull default values; +alter domain dnotnulltest set not null; -- fails + +update domnotnull set col1 = 5; +alter domain dnotnulltest set not null; -- fails + +update domnotnull set col2 = 6; + +alter domain dnotnulltest set not null; + +update domnotnull set col1 = null; -- fails + +alter domain dnotnulltest drop not null; + +update domnotnull set col1 = null; + +drop domain dnotnulltest cascade; + +-- Test ALTER DOMAIN .. DEFAULT .. +create table domdeftest (col1 ddef1); + +insert into domdeftest default values; +select * from domdeftest; + +alter domain ddef1 set default '42'; +insert into domdeftest default values; +select * from domdeftest; + +alter domain ddef1 drop default; +insert into domdeftest default values; +select * from domdeftest; + +drop table domdeftest; + +-- Test ALTER DOMAIN .. CONSTRAINT .. +create domain con as integer; +create table domcontest (col1 con); + +insert into domcontest values (1); +insert into domcontest values (2); +alter domain con add constraint t check (VALUE < 1); -- fails + +alter domain con add constraint t check (VALUE < 34); +alter domain con add check (VALUE > 0); + +insert into domcontest values (-5); -- fails +insert into domcontest values (42); -- fails +insert into domcontest values (5); + +alter domain con drop constraint t; +insert into domcontest values (-5); --fails +insert into domcontest values (42); + +alter domain con drop constraint nonexistent; +alter domain con drop constraint if exists nonexistent; + +-- Test ALTER DOMAIN .. CONSTRAINT .. NOT VALID +create domain things AS INT; +CREATE TABLE thethings (stuff things); +INSERT INTO thethings (stuff) VALUES (55); +ALTER DOMAIN things ADD CONSTRAINT meow CHECK (VALUE < 11); +ALTER DOMAIN things ADD CONSTRAINT meow CHECK (VALUE < 11) NOT VALID; +ALTER DOMAIN things VALIDATE CONSTRAINT meow; +UPDATE thethings SET stuff = 10; +ALTER DOMAIN things VALIDATE CONSTRAINT meow; + +-- Confirm ALTER DOMAIN with RULES. +create table domtab (col1 integer); +create domain dom as integer; +create view domview as select cast(col1 as dom) from domtab; +insert into domtab (col1) values (null); +insert into domtab (col1) values (5); +select * from domview; + +alter domain dom set not null; +select * from domview; -- fail + +alter domain dom drop not null; +select * from domview; + +alter domain dom add constraint domchkgt6 check(value > 6); +select * from domview; --fail + +alter domain dom drop constraint domchkgt6 restrict; +select * from domview; + +-- cleanup +drop domain ddef1 restrict; +drop domain ddef2 restrict; +drop domain ddef3 restrict; +drop domain ddef4 restrict; +drop domain ddef5 restrict; +drop sequence ddef4_seq; + +-- Test domains over domains +create domain vchar4 varchar(4); +create domain dinter vchar4 check (substring(VALUE, 1, 1) = 'x'); +create domain dtop dinter check (substring(VALUE, 2, 1) = '1'); + +select 'x123'::dtop; +select 'x1234'::dtop; -- explicit coercion should truncate +select 'y1234'::dtop; -- fail +select 'y123'::dtop; -- fail +select 'yz23'::dtop; -- fail +select 'xz23'::dtop; -- fail + +create temp table dtest(f1 dtop); + +insert into dtest values('x123'); +insert into dtest values('x1234'); -- fail, implicit coercion +insert into dtest values('y1234'); -- fail, implicit coercion +insert into dtest values('y123'); -- fail +insert into dtest values('yz23'); -- fail +insert into dtest values('xz23'); -- fail + +drop table dtest; +drop domain vchar4 cascade; + +-- Make sure that constraints of newly-added domain columns are +-- enforced correctly, even if there's no default value for the new +-- column. Per bug #1433 +create domain str_domain as text not null; + +create table domain_test (a int, b int); + +insert into domain_test values (1, 2); +insert into domain_test values (1, 2); + +-- should fail +alter table domain_test add column c str_domain; + +create domain str_domain2 as text check (value <> 'foo') default 'foo'; + +-- should fail +alter table domain_test add column d str_domain2; + +-- Check that domain constraints on prepared statement parameters of +-- unknown type are enforced correctly. +create domain pos_int as int4 check (value > 0) not null; +prepare s1 as select $1::pos_int = 10 as "is_ten"; + +execute s1(10); +execute s1(0); -- should fail +execute s1(NULL); -- should fail + +-- Check that domain constraints on plpgsql function parameters, results, +-- and local variables are enforced correctly. + +create function doubledecrement(p1 pos_int) returns pos_int as $$ +declare v pos_int; +begin + return p1; +end$$ language plpgsql; + +select doubledecrement(3); -- fail because of implicit null assignment + +create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ +declare v pos_int := 0; +begin + return p1; +end$$ language plpgsql; + +select doubledecrement(3); -- fail at initialization assignment + +create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ +declare v pos_int := 1; +begin + v := p1 - 1; + return v - 1; +end$$ language plpgsql; + +select doubledecrement(null); -- fail before call +select doubledecrement(0); -- fail before call +select doubledecrement(1); -- fail at assignment to v +select doubledecrement(2); -- fail at return +select doubledecrement(3); -- good + +-- Check that ALTER DOMAIN tests columns of derived types + +create domain posint as int4; + +-- Currently, this doesn't work for composite types, but verify it complains +create type ddtest1 as (f1 posint); +create table ddtest2(f1 ddtest1); +insert into ddtest2 values(row(-1)); +alter domain posint add constraint c1 check(value >= 0); +drop table ddtest2; + +-- Likewise for domains within arrays of composite +create table ddtest2(f1 ddtest1[]); +insert into ddtest2 values('{(-1)}'); +alter domain posint add constraint c1 check(value >= 0); +drop table ddtest2; + +-- Likewise for domains within domains over composite +create domain ddtest1d as ddtest1; +create table ddtest2(f1 ddtest1d); +insert into ddtest2 values('(-1)'); +alter domain posint add constraint c1 check(value >= 0); +drop table ddtest2; +drop domain ddtest1d; + +-- Likewise for domains within domains over array of composite +create domain ddtest1d as ddtest1[]; +create table ddtest2(f1 ddtest1d); +insert into ddtest2 values('{(-1)}'); +alter domain posint add constraint c1 check(value >= 0); +drop table ddtest2; +drop domain ddtest1d; + +-- Doesn't work for ranges, either +create type rposint as range (subtype = posint); +create table ddtest2(f1 rposint); +insert into ddtest2 values('(-1,3]'); +alter domain posint add constraint c1 check(value >= 0); +drop table ddtest2; +drop type rposint; + +alter domain posint add constraint c1 check(value >= 0); + +create domain posint2 as posint check (value % 2 = 0); +create table ddtest2(f1 posint2); +insert into ddtest2 values(11); -- fail +insert into ddtest2 values(-2); -- fail +insert into ddtest2 values(2); + +alter domain posint add constraint c2 check(value >= 10); -- fail +alter domain posint add constraint c2 check(value > 0); -- OK + +drop table ddtest2; +drop type ddtest1; +drop domain posint cascade; + +-- +-- Check enforcement of domain-related typmod in plpgsql (bug #5717) +-- + +create or replace function array_elem_check(numeric) returns numeric as $$ +declare + x numeric(4,2)[1]; +begin + x[1] := $1; + return x[1]; +end$$ language plpgsql; + +select array_elem_check(121.00); +select array_elem_check(1.23456); + +create domain mynums as numeric(4,2)[1]; + +create or replace function array_elem_check(numeric) returns numeric as $$ +declare + x mynums; +begin + x[1] := $1; + return x[1]; +end$$ language plpgsql; + +select array_elem_check(121.00); +select array_elem_check(1.23456); + +create domain mynums2 as mynums; + +create or replace function array_elem_check(numeric) returns numeric as $$ +declare + x mynums2; +begin + x[1] := $1; + return x[1]; +end$$ language plpgsql; + +select array_elem_check(121.00); +select array_elem_check(1.23456); + +drop function array_elem_check(numeric); + +-- +-- Check enforcement of array-level domain constraints +-- + +create domain orderedpair as int[2] check (value[1] < value[2]); + +select array[1,2]::orderedpair; +select array[2,1]::orderedpair; -- fail + +create temp table op (f1 orderedpair); +insert into op values (array[1,2]); +insert into op values (array[2,1]); -- fail + +update op set f1[2] = 3; +update op set f1[2] = 0; -- fail +select * from op; + +create or replace function array_elem_check(int) returns int as $$ +declare + x orderedpair := '{1,2}'; +begin + x[2] := $1; + return x[2]; +end$$ language plpgsql; + +select array_elem_check(3); +select array_elem_check(-1); + +drop function array_elem_check(int); + +-- +-- Check enforcement of changing constraints in plpgsql +-- + +create domain di as int; + +create function dom_check(int) returns di as $$ +declare d di; +begin + d := $1::di; + return d; +end +$$ language plpgsql immutable; + +select dom_check(0); + +alter domain di add constraint pos check (value > 0); + +select dom_check(0); -- fail + +alter domain di drop constraint pos; + +select dom_check(0); + +-- implicit cast during assignment is a separate code path, test that too + +create or replace function dom_check(int) returns di as $$ +declare d di; +begin + d := $1; + return d; +end +$$ language plpgsql immutable; + +select dom_check(0); + +alter domain di add constraint pos check (value > 0); + +select dom_check(0); -- fail + +alter domain di drop constraint pos; + +select dom_check(0); + +drop function dom_check(int); + +drop domain di; + +-- +-- Check use of a (non-inline-able) SQL function in a domain constraint; +-- this has caused issues in the past +-- + +create function sql_is_distinct_from(anyelement, anyelement) +returns boolean language sql +as 'select $1 is distinct from $2 limit 1'; + +create domain inotnull int + check (sql_is_distinct_from(value, null)); + +select 1::inotnull; +select null::inotnull; + +create table dom_table (x inotnull); +insert into dom_table values ('1'); +insert into dom_table values (1); +insert into dom_table values (null); + +drop table dom_table; +drop domain inotnull; +drop function sql_is_distinct_from(anyelement, anyelement); + +-- +-- Renaming +-- + +create domain testdomain1 as int; +alter domain testdomain1 rename to testdomain2; +alter type testdomain2 rename to testdomain3; -- alter type also works +drop domain testdomain3; + + +-- +-- Renaming domain constraints +-- + +create domain testdomain1 as int constraint unsigned check (value > 0); +alter domain testdomain1 rename constraint unsigned to unsigned_foo; +alter domain testdomain1 drop constraint unsigned_foo; +drop domain testdomain1; diff --git a/src/test/singlenode_regress/sql/drop_if_exists.sql b/src/test/singlenode_regress/sql/drop_if_exists.sql new file mode 100644 index 00000000000..ac6168b91f8 --- /dev/null +++ b/src/test/singlenode_regress/sql/drop_if_exists.sql @@ -0,0 +1,304 @@ +-- +-- IF EXISTS tests +-- + +-- table (will be really dropped at the end) + +DROP TABLE test_exists; + +DROP TABLE IF EXISTS test_exists; + +CREATE TABLE test_exists (a int, b text); + +-- view + +DROP VIEW test_view_exists; + +DROP VIEW IF EXISTS test_view_exists; + +CREATE VIEW test_view_exists AS select * from test_exists; + +DROP VIEW IF EXISTS test_view_exists; + +DROP VIEW test_view_exists; + +-- index + +DROP INDEX test_index_exists; + +DROP INDEX IF EXISTS test_index_exists; + +CREATE INDEX test_index_exists on test_exists(a); + +DROP INDEX IF EXISTS test_index_exists; + +DROP INDEX test_index_exists; + +-- sequence + +DROP SEQUENCE test_sequence_exists; + +DROP SEQUENCE IF EXISTS test_sequence_exists; + +CREATE SEQUENCE test_sequence_exists; + +DROP SEQUENCE IF EXISTS test_sequence_exists; + +DROP SEQUENCE test_sequence_exists; + +-- schema + +DROP SCHEMA test_schema_exists; + +DROP SCHEMA IF EXISTS test_schema_exists; + +CREATE SCHEMA test_schema_exists; + +DROP SCHEMA IF EXISTS test_schema_exists; + +DROP SCHEMA test_schema_exists; + +-- type + +DROP TYPE test_type_exists; + +DROP TYPE IF EXISTS test_type_exists; + +CREATE type test_type_exists as (a int, b text); + +DROP TYPE IF EXISTS test_type_exists; + +DROP TYPE test_type_exists; + +-- domain + +DROP DOMAIN test_domain_exists; + +DROP DOMAIN IF EXISTS test_domain_exists; + +CREATE domain test_domain_exists as int not null check (value > 0); + +DROP DOMAIN IF EXISTS test_domain_exists; + +DROP DOMAIN test_domain_exists; + +--- +--- role/user/group +--- + +CREATE USER regress_test_u1; +CREATE ROLE regress_test_r1; +CREATE GROUP regress_test_g1; + +DROP USER regress_test_u2; + +DROP USER IF EXISTS regress_test_u1, regress_test_u2; + +DROP USER regress_test_u1; + +DROP ROLE regress_test_r2; + +DROP ROLE IF EXISTS regress_test_r1, regress_test_r2; + +DROP ROLE regress_test_r1; + +DROP GROUP regress_test_g2; + +DROP GROUP IF EXISTS regress_test_g1, regress_test_g2; + +DROP GROUP regress_test_g1; + +-- collation +DROP COLLATION IF EXISTS test_collation_exists; + +-- conversion +DROP CONVERSION test_conversion_exists; +DROP CONVERSION IF EXISTS test_conversion_exists; +CREATE CONVERSION test_conversion_exists + FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; +DROP CONVERSION test_conversion_exists; + +-- text search parser +DROP TEXT SEARCH PARSER test_tsparser_exists; +DROP TEXT SEARCH PARSER IF EXISTS test_tsparser_exists; + +-- text search dictionary +DROP TEXT SEARCH DICTIONARY test_tsdict_exists; +DROP TEXT SEARCH DICTIONARY IF EXISTS test_tsdict_exists; +CREATE TEXT SEARCH DICTIONARY test_tsdict_exists ( + Template=ispell, + DictFile=ispell_sample, + AffFile=ispell_sample +); +DROP TEXT SEARCH DICTIONARY test_tsdict_exists; + +-- test search template +DROP TEXT SEARCH TEMPLATE test_tstemplate_exists; +DROP TEXT SEARCH TEMPLATE IF EXISTS test_tstemplate_exists; + +-- text search configuration +DROP TEXT SEARCH CONFIGURATION test_tsconfig_exists; +DROP TEXT SEARCH CONFIGURATION IF EXISTS test_tsconfig_exists; +CREATE TEXT SEARCH CONFIGURATION test_tsconfig_exists (COPY=english); +DROP TEXT SEARCH CONFIGURATION test_tsconfig_exists; + +-- extension +DROP EXTENSION test_extension_exists; +DROP EXTENSION IF EXISTS test_extension_exists; + +-- functions +DROP FUNCTION test_function_exists(); +DROP FUNCTION IF EXISTS test_function_exists(); + +DROP FUNCTION test_function_exists(int, text, int[]); +DROP FUNCTION IF EXISTS test_function_exists(int, text, int[]); + +-- aggregate +DROP AGGREGATE test_aggregate_exists(*); +DROP AGGREGATE IF EXISTS test_aggregate_exists(*); + +DROP AGGREGATE test_aggregate_exists(int); +DROP AGGREGATE IF EXISTS test_aggregate_exists(int); + +-- operator +DROP OPERATOR @#@ (int, int); +DROP OPERATOR IF EXISTS @#@ (int, int); +CREATE OPERATOR @#@ + (leftarg = int8, rightarg = int8, procedure = int8xor); +DROP OPERATOR @#@ (int8, int8); + +-- language +DROP LANGUAGE test_language_exists; +DROP LANGUAGE IF EXISTS test_language_exists; + +-- cast +DROP CAST (text AS text); +DROP CAST IF EXISTS (text AS text); + +-- trigger +DROP TRIGGER test_trigger_exists ON test_exists; +DROP TRIGGER IF EXISTS test_trigger_exists ON test_exists; + +DROP TRIGGER test_trigger_exists ON no_such_table; +DROP TRIGGER IF EXISTS test_trigger_exists ON no_such_table; + +DROP TRIGGER test_trigger_exists ON no_such_schema.no_such_table; +DROP TRIGGER IF EXISTS test_trigger_exists ON no_such_schema.no_such_table; + +CREATE TRIGGER test_trigger_exists + BEFORE UPDATE ON test_exists + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); +DROP TRIGGER test_trigger_exists ON test_exists; + +-- rule +DROP RULE test_rule_exists ON test_exists; +DROP RULE IF EXISTS test_rule_exists ON test_exists; + +DROP RULE test_rule_exists ON no_such_table; +DROP RULE IF EXISTS test_rule_exists ON no_such_table; + +DROP RULE test_rule_exists ON no_such_schema.no_such_table; +DROP RULE IF EXISTS test_rule_exists ON no_such_schema.no_such_table; + +CREATE RULE test_rule_exists AS ON INSERT TO test_exists + DO INSTEAD + INSERT INTO test_exists VALUES (NEW.a, NEW.b || NEW.a::text); +DROP RULE test_rule_exists ON test_exists; + +-- foreign data wrapper +DROP FOREIGN DATA WRAPPER test_fdw_exists; +DROP FOREIGN DATA WRAPPER IF EXISTS test_fdw_exists; + +-- foreign server +DROP SERVER test_server_exists; +DROP SERVER IF EXISTS test_server_exists; + +-- operator class +DROP OPERATOR CLASS test_operator_class USING btree; +DROP OPERATOR CLASS IF EXISTS test_operator_class USING btree; + +DROP OPERATOR CLASS test_operator_class USING no_such_am; +DROP OPERATOR CLASS IF EXISTS test_operator_class USING no_such_am; + +-- operator family +DROP OPERATOR FAMILY test_operator_family USING btree; +DROP OPERATOR FAMILY IF EXISTS test_operator_family USING btree; + +DROP OPERATOR FAMILY test_operator_family USING no_such_am; +DROP OPERATOR FAMILY IF EXISTS test_operator_family USING no_such_am; + +-- access method +DROP ACCESS METHOD no_such_am; +DROP ACCESS METHOD IF EXISTS no_such_am; + +-- drop the table + +DROP TABLE IF EXISTS test_exists; + +DROP TABLE test_exists; + +-- be tolerant with missing schemas, types, etc + +DROP AGGREGATE IF EXISTS no_such_schema.foo(int); +DROP AGGREGATE IF EXISTS foo(no_such_type); +DROP AGGREGATE IF EXISTS foo(no_such_schema.no_such_type); +DROP CAST IF EXISTS (INTEGER AS no_such_type2); +DROP CAST IF EXISTS (no_such_type1 AS INTEGER); +DROP CAST IF EXISTS (INTEGER AS no_such_schema.bar); +DROP CAST IF EXISTS (no_such_schema.foo AS INTEGER); +DROP COLLATION IF EXISTS no_such_schema.foo; +DROP CONVERSION IF EXISTS no_such_schema.foo; +DROP DOMAIN IF EXISTS no_such_schema.foo; +DROP FOREIGN TABLE IF EXISTS no_such_schema.foo; +DROP FUNCTION IF EXISTS no_such_schema.foo(); +DROP FUNCTION IF EXISTS foo(no_such_type); +DROP FUNCTION IF EXISTS foo(no_such_schema.no_such_type); +DROP INDEX IF EXISTS no_such_schema.foo; +DROP MATERIALIZED VIEW IF EXISTS no_such_schema.foo; +DROP OPERATOR IF EXISTS no_such_schema.+ (int, int); +DROP OPERATOR IF EXISTS + (no_such_type, no_such_type); +DROP OPERATOR IF EXISTS + (no_such_schema.no_such_type, no_such_schema.no_such_type); +DROP OPERATOR IF EXISTS # (NONE, no_such_schema.no_such_type); +DROP OPERATOR CLASS IF EXISTS no_such_schema.widget_ops USING btree; +DROP OPERATOR FAMILY IF EXISTS no_such_schema.float_ops USING btree; +DROP RULE IF EXISTS foo ON no_such_schema.bar; +DROP SEQUENCE IF EXISTS no_such_schema.foo; +DROP TABLE IF EXISTS no_such_schema.foo; +DROP TEXT SEARCH CONFIGURATION IF EXISTS no_such_schema.foo; +DROP TEXT SEARCH DICTIONARY IF EXISTS no_such_schema.foo; +DROP TEXT SEARCH PARSER IF EXISTS no_such_schema.foo; +DROP TEXT SEARCH TEMPLATE IF EXISTS no_such_schema.foo; +DROP TRIGGER IF EXISTS foo ON no_such_schema.bar; +DROP TYPE IF EXISTS no_such_schema.foo; +DROP VIEW IF EXISTS no_such_schema.foo; + +-- Check we receive an ambiguous function error when there are +-- multiple matching functions. +CREATE FUNCTION test_ambiguous_funcname(int) returns int as $$ select $1; $$ language sql; +CREATE FUNCTION test_ambiguous_funcname(text) returns text as $$ select $1; $$ language sql; +DROP FUNCTION test_ambiguous_funcname; +DROP FUNCTION IF EXISTS test_ambiguous_funcname; + +-- cleanup +DROP FUNCTION test_ambiguous_funcname(int); +DROP FUNCTION test_ambiguous_funcname(text); + +-- Likewise for procedures. +CREATE PROCEDURE test_ambiguous_procname(int) as $$ begin end; $$ language plpgsql; +CREATE PROCEDURE test_ambiguous_procname(text) as $$ begin end; $$ language plpgsql; +DROP PROCEDURE test_ambiguous_procname; +DROP PROCEDURE IF EXISTS test_ambiguous_procname; + +-- Check we get a similar error if we use ROUTINE instead of PROCEDURE. +DROP ROUTINE IF EXISTS test_ambiguous_procname; + +-- cleanup +DROP PROCEDURE test_ambiguous_procname(int); +DROP PROCEDURE test_ambiguous_procname(text); + +-- This test checks both the functionality of 'if exists' and the syntax +-- of the drop database command. +drop database test_database_exists (force); +drop database test_database_exists with (force); +drop database if exists test_database_exists (force); +drop database if exists test_database_exists with (force); diff --git a/src/test/singlenode_regress/sql/drop_operator.sql b/src/test/singlenode_regress/sql/drop_operator.sql new file mode 100644 index 00000000000..cc62cfa14e0 --- /dev/null +++ b/src/test/singlenode_regress/sql/drop_operator.sql @@ -0,0 +1,56 @@ +CREATE OPERATOR === ( + PROCEDURE = int8eq, + LEFTARG = bigint, + RIGHTARG = bigint, + COMMUTATOR = === +); + +CREATE OPERATOR !== ( + PROCEDURE = int8ne, + LEFTARG = bigint, + RIGHTARG = bigint, + NEGATOR = ===, + COMMUTATOR = !== +); + +DROP OPERATOR !==(bigint, bigint); + +SELECT ctid, oprcom +FROM pg_catalog.pg_operator fk +WHERE oprcom != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprcom); + +SELECT ctid, oprnegate +FROM pg_catalog.pg_operator fk +WHERE oprnegate != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprnegate); + +DROP OPERATOR ===(bigint, bigint); + +CREATE OPERATOR <| ( + PROCEDURE = int8lt, + LEFTARG = bigint, + RIGHTARG = bigint +); + +CREATE OPERATOR |> ( + PROCEDURE = int8gt, + LEFTARG = bigint, + RIGHTARG = bigint, + NEGATOR = <|, + COMMUTATOR = <| +); + +DROP OPERATOR |>(bigint, bigint); + +SELECT ctid, oprcom +FROM pg_catalog.pg_operator fk +WHERE oprcom != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprcom); + +SELECT ctid, oprnegate +FROM pg_catalog.pg_operator fk +WHERE oprnegate != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprnegate); + +DROP OPERATOR <|(bigint, bigint); diff --git a/src/test/singlenode_regress/sql/enable_autovacuum.sql b/src/test/singlenode_regress/sql/enable_autovacuum.sql new file mode 100644 index 00000000000..a128f5f570c --- /dev/null +++ b/src/test/singlenode_regress/sql/enable_autovacuum.sql @@ -0,0 +1,2 @@ +alter system set autovacuum = on; +select gp_segment_id, pg_reload_conf() from gp_id union select gp_segment_id, pg_reload_conf() from gp_dist_random('gp_id'); diff --git a/src/test/singlenode_regress/sql/enum.sql b/src/test/singlenode_regress/sql/enum.sql new file mode 100644 index 00000000000..fef8f994f40 --- /dev/null +++ b/src/test/singlenode_regress/sql/enum.sql @@ -0,0 +1,341 @@ +-- +-- Enum tests +-- + +CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple'); + +-- +-- Did it create the right number of rows? +-- +SELECT COUNT(*) FROM pg_enum WHERE enumtypid = 'rainbow'::regtype; + +-- +-- I/O functions +-- +SELECT 'red'::rainbow; +SELECT 'mauve'::rainbow; + +-- +-- adding new values +-- + +CREATE TYPE planets AS ENUM ( 'venus', 'earth', 'mars' ); + +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'planets'::regtype +ORDER BY 2; + +ALTER TYPE planets ADD VALUE 'uranus'; + +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'planets'::regtype +ORDER BY 2; + +ALTER TYPE planets ADD VALUE 'mercury' BEFORE 'venus'; +ALTER TYPE planets ADD VALUE 'saturn' BEFORE 'uranus'; +ALTER TYPE planets ADD VALUE 'jupiter' AFTER 'mars'; +ALTER TYPE planets ADD VALUE 'neptune' AFTER 'uranus'; + +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'planets'::regtype +ORDER BY 2; + +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'planets'::regtype +ORDER BY enumlabel::planets; + +-- errors for adding labels +ALTER TYPE planets ADD VALUE + 'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto'; + +ALTER TYPE planets ADD VALUE 'pluto' AFTER 'zeus'; + +-- if not exists tests + +-- existing value gives error +ALTER TYPE planets ADD VALUE 'mercury'; + +-- unless IF NOT EXISTS is specified +ALTER TYPE planets ADD VALUE IF NOT EXISTS 'mercury'; + +-- should be neptune, not mercury +SELECT enum_last(NULL::planets); + +ALTER TYPE planets ADD VALUE IF NOT EXISTS 'pluto'; + +-- should be pluto, i.e. the new value +SELECT enum_last(NULL::planets); + +-- +-- Test inserting so many values that we have to renumber +-- + +create type insenum as enum ('L1', 'L2'); + +alter type insenum add value 'i1' before 'L2'; +alter type insenum add value 'i2' before 'L2'; +alter type insenum add value 'i3' before 'L2'; +alter type insenum add value 'i4' before 'L2'; +alter type insenum add value 'i5' before 'L2'; +alter type insenum add value 'i6' before 'L2'; +alter type insenum add value 'i7' before 'L2'; +alter type insenum add value 'i8' before 'L2'; +alter type insenum add value 'i9' before 'L2'; +alter type insenum add value 'i10' before 'L2'; +alter type insenum add value 'i11' before 'L2'; +alter type insenum add value 'i12' before 'L2'; +alter type insenum add value 'i13' before 'L2'; +alter type insenum add value 'i14' before 'L2'; +alter type insenum add value 'i15' before 'L2'; +alter type insenum add value 'i16' before 'L2'; +alter type insenum add value 'i17' before 'L2'; +alter type insenum add value 'i18' before 'L2'; +alter type insenum add value 'i19' before 'L2'; +alter type insenum add value 'i20' before 'L2'; +alter type insenum add value 'i21' before 'L2'; +alter type insenum add value 'i22' before 'L2'; +alter type insenum add value 'i23' before 'L2'; +alter type insenum add value 'i24' before 'L2'; +alter type insenum add value 'i25' before 'L2'; +alter type insenum add value 'i26' before 'L2'; +alter type insenum add value 'i27' before 'L2'; +alter type insenum add value 'i28' before 'L2'; +alter type insenum add value 'i29' before 'L2'; +alter type insenum add value 'i30' before 'L2'; + +-- The exact values of enumsortorder will now depend on the local properties +-- of float4, but in any reasonable implementation we should get at least +-- 20 splits before having to renumber; so only hide values > 20. + +SELECT enumlabel, + case when enumsortorder > 20 then null else enumsortorder end as so +FROM pg_enum +WHERE enumtypid = 'insenum'::regtype +ORDER BY enumsortorder; + +-- +-- Basic table creation, row selection +-- +CREATE TABLE enumtest (col rainbow); +INSERT INTO enumtest values ('red'), ('orange'), ('yellow'), ('green'); +COPY enumtest FROM stdin; +blue +purple +\. +SELECT * FROM enumtest; + +-- +-- Operators, no index +-- +SELECT * FROM enumtest WHERE col = 'orange'; +SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col; +SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col; +SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col; +SELECT * FROM enumtest WHERE col < 'green' ORDER BY col; +SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col; + +-- +-- Cast to/from text +-- +SELECT 'red'::rainbow::text || 'hithere'; +SELECT 'red'::text::rainbow = 'red'::rainbow; + +-- +-- Aggregates +-- +SELECT min(col) FROM enumtest; +SELECT max(col) FROM enumtest; +SELECT max(col) FROM enumtest WHERE col < 'green'; + +-- +-- Index tests, force use of index +-- +SET enable_seqscan = off; +SET enable_bitmapscan = off; + +-- +-- Btree index / opclass with the various operators +-- +CREATE INDEX enumtest_btree ON enumtest USING btree (col); +SELECT * FROM enumtest WHERE col = 'orange'; +SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col; +SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col; +SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col; +SELECT * FROM enumtest WHERE col < 'green' ORDER BY col; +SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col; +SELECT min(col) FROM enumtest; +SELECT max(col) FROM enumtest; +SELECT max(col) FROM enumtest WHERE col < 'green'; +DROP INDEX enumtest_btree; + +-- +-- Hash index / opclass with the = operator +-- +CREATE INDEX enumtest_hash ON enumtest USING hash (col); +SELECT * FROM enumtest WHERE col = 'orange'; +DROP INDEX enumtest_hash; + +-- +-- End index tests +-- +RESET enable_seqscan; +RESET enable_bitmapscan; + +-- +-- Domains over enums +-- +CREATE DOMAIN rgb AS rainbow CHECK (VALUE IN ('red', 'green', 'blue')); +SELECT 'red'::rgb; +SELECT 'purple'::rgb; +SELECT 'purple'::rainbow::rgb; +DROP DOMAIN rgb; + +-- +-- Arrays +-- +SELECT '{red,green,blue}'::rainbow[]; +SELECT ('{red,green,blue}'::rainbow[])[2]; +SELECT 'red' = ANY ('{red,green,blue}'::rainbow[]); +SELECT 'yellow' = ANY ('{red,green,blue}'::rainbow[]); +SELECT 'red' = ALL ('{red,green,blue}'::rainbow[]); +SELECT 'red' = ALL ('{red,red}'::rainbow[]); + +-- +-- Support functions +-- +SELECT enum_first(NULL::rainbow); +SELECT enum_last('green'::rainbow); +SELECT enum_range(NULL::rainbow); +SELECT enum_range('orange'::rainbow, 'green'::rainbow); +SELECT enum_range(NULL, 'green'::rainbow); +SELECT enum_range('orange'::rainbow, NULL); +SELECT enum_range(NULL::rainbow, NULL); + +-- +-- User functions, can't test perl/python etc here since may not be compiled. +-- +CREATE FUNCTION echo_me(anyenum) RETURNS text AS $$ +BEGIN +RETURN $1::text || 'omg'; +END +$$ LANGUAGE plpgsql; +SELECT echo_me('red'::rainbow); +-- +-- Concrete function should override generic one +-- +CREATE FUNCTION echo_me(rainbow) RETURNS text AS $$ +BEGIN +RETURN $1::text || 'wtf'; +END +$$ LANGUAGE plpgsql; +SELECT echo_me('red'::rainbow); +-- +-- If we drop the original generic one, we don't have to qualify the type +-- anymore, since there's only one match +-- +DROP FUNCTION echo_me(anyenum); +SELECT echo_me('red'); +DROP FUNCTION echo_me(rainbow); + +-- +-- RI triggers on enum types +-- +CREATE TABLE enumtest_parent (id rainbow PRIMARY KEY); +CREATE TABLE enumtest_child (parent rainbow REFERENCES enumtest_parent); +INSERT INTO enumtest_parent VALUES ('red'); +INSERT INTO enumtest_child VALUES ('red'); +INSERT INTO enumtest_child VALUES ('blue'); -- fail +DELETE FROM enumtest_parent; -- fail +-- +-- cross-type RI should fail +-- +CREATE TYPE bogus AS ENUM('good', 'bad', 'ugly'); +CREATE TABLE enumtest_bogus_child(parent bogus REFERENCES enumtest_parent); +DROP TYPE bogus; + +-- check renaming a value +ALTER TYPE rainbow RENAME VALUE 'red' TO 'crimson'; +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'rainbow'::regtype +ORDER BY 2; +-- check that renaming a non-existent value fails +ALTER TYPE rainbow RENAME VALUE 'red' TO 'crimson'; +-- check that renaming to an existent value fails +ALTER TYPE rainbow RENAME VALUE 'blue' TO 'green'; + +-- +-- check transactional behaviour of ALTER TYPE ... ADD VALUE +-- +CREATE TYPE bogus AS ENUM('good'); + +-- check that we can add new values to existing enums in a transaction +-- but we can't use them +BEGIN; +ALTER TYPE bogus ADD VALUE 'new'; +SAVEPOINT x; +SELECT 'new'::bogus; -- unsafe +ROLLBACK TO x; +SELECT enum_first(null::bogus); -- safe +SELECT enum_last(null::bogus); -- unsafe +ROLLBACK TO x; +SELECT enum_range(null::bogus); -- unsafe +ROLLBACK TO x; +COMMIT; +SELECT 'new'::bogus; -- now safe +SELECT enumlabel, enumsortorder +FROM pg_enum +WHERE enumtypid = 'bogus'::regtype +ORDER BY 2; + +-- check that we recognize the case where the enum already existed but was +-- modified in the current txn; this should not be considered safe +BEGIN; +ALTER TYPE bogus RENAME TO bogon; +ALTER TYPE bogon ADD VALUE 'bad'; +SELECT 'bad'::bogon; +ROLLBACK; + +-- but a renamed value is safe to use later in same transaction +BEGIN; +ALTER TYPE bogus RENAME VALUE 'good' to 'bad'; +SELECT 'bad'::bogus; +ROLLBACK; + +DROP TYPE bogus; + +-- check that values created during CREATE TYPE can be used in any case +BEGIN; +CREATE TYPE bogus AS ENUM('good','bad','ugly'); +ALTER TYPE bogus RENAME TO bogon; +select enum_range(null::bogon); +ROLLBACK; + +-- ideally, we'd allow this usage; but it requires keeping track of whether +-- the enum type was created in the current transaction, which is expensive +BEGIN; +CREATE TYPE bogus AS ENUM('good'); +ALTER TYPE bogus RENAME TO bogon; +ALTER TYPE bogon ADD VALUE 'bad'; +ALTER TYPE bogon ADD VALUE 'ugly'; +select enum_range(null::bogon); -- fails +ROLLBACK; + +-- +-- Cleanup +-- +DROP TABLE enumtest_child; +DROP TABLE enumtest_parent; +DROP TABLE enumtest; +DROP TYPE rainbow; + +-- +-- Verify properly cleaned up +-- +SELECT COUNT(*) FROM pg_type WHERE typname = 'rainbow'; +SELECT * FROM pg_enum WHERE NOT EXISTS + (SELECT 1 FROM pg_type WHERE pg_type.oid = enumtypid); diff --git a/src/test/singlenode_regress/sql/equivclass.sql b/src/test/singlenode_regress/sql/equivclass.sql new file mode 100644 index 00000000000..74a5b0d3ef9 --- /dev/null +++ b/src/test/singlenode_regress/sql/equivclass.sql @@ -0,0 +1,271 @@ +-- +-- Tests for the planner's "equivalence class" mechanism +-- + +-- One thing that's not tested well during normal querying is the logic +-- for handling "broken" ECs. This is because an EC can only become broken +-- if its underlying btree operator family doesn't include a complete set +-- of cross-type equality operators. There are not (and should not be) +-- any such families built into Postgres; so we have to hack things up +-- to create one. We do this by making two alias types that are really +-- int8 (so we need no new C code) and adding only some operators for them +-- into the standard integer_ops opfamily. + +create type int8alias1; +create function int8alias1in(cstring) returns int8alias1 + strict immutable language internal as 'int8in'; +create function int8alias1out(int8alias1) returns cstring + strict immutable language internal as 'int8out'; +create type int8alias1 ( + input = int8alias1in, + output = int8alias1out, + like = int8 +); + +create type int8alias2; +create function int8alias2in(cstring) returns int8alias2 + strict immutable language internal as 'int8in'; +create function int8alias2out(int8alias2) returns cstring + strict immutable language internal as 'int8out'; +create type int8alias2 ( + input = int8alias2in, + output = int8alias2out, + like = int8 +); + +create cast (int8 as int8alias1) without function; +create cast (int8 as int8alias2) without function; +create cast (int8alias1 as int8) without function; +create cast (int8alias2 as int8) without function; + +create function int8alias1eq(int8alias1, int8alias1) returns bool + strict immutable language internal as 'int8eq'; +create operator = ( + procedure = int8alias1eq, + leftarg = int8alias1, rightarg = int8alias1, + commutator = =, + restrict = eqsel, join = eqjoinsel, + merges +); +alter operator family integer_ops using btree add + operator 3 = (int8alias1, int8alias1); + +create function int8alias2eq(int8alias2, int8alias2) returns bool + strict immutable language internal as 'int8eq'; +create operator = ( + procedure = int8alias2eq, + leftarg = int8alias2, rightarg = int8alias2, + commutator = =, + restrict = eqsel, join = eqjoinsel, + merges +); +alter operator family integer_ops using btree add + operator 3 = (int8alias2, int8alias2); + +create function int8alias1eq(int8, int8alias1) returns bool + strict immutable language internal as 'int8eq'; +create operator = ( + procedure = int8alias1eq, + leftarg = int8, rightarg = int8alias1, + restrict = eqsel, join = eqjoinsel, + merges +); +alter operator family integer_ops using btree add + operator 3 = (int8, int8alias1); + +create function int8alias1eq(int8alias1, int8alias2) returns bool + strict immutable language internal as 'int8eq'; +create operator = ( + procedure = int8alias1eq, + leftarg = int8alias1, rightarg = int8alias2, + restrict = eqsel, join = eqjoinsel, + merges +); +alter operator family integer_ops using btree add + operator 3 = (int8alias1, int8alias2); + +create function int8alias1lt(int8alias1, int8alias1) returns bool + strict immutable language internal as 'int8lt'; +create operator < ( + procedure = int8alias1lt, + leftarg = int8alias1, rightarg = int8alias1 +); +alter operator family integer_ops using btree add + operator 1 < (int8alias1, int8alias1); + +create function int8alias1cmp(int8, int8alias1) returns int + strict immutable language internal as 'btint8cmp'; +alter operator family integer_ops using btree add + function 1 int8alias1cmp (int8, int8alias1); + +create table ec0 (ff int8 primary key, f1 int8, f2 int8); +create table ec1 (ff int8 primary key, f1 int8alias1, f2 int8alias2); +create table ec2 (xf int8 primary key, x1 int8alias1, x2 int8alias2); + +-- for the moment we only want to look at nestloop plans +set enable_nestloop = on; +set enable_hashjoin = off; +set enable_mergejoin = off; + +-- +-- Note that for cases where there's a missing operator, we don't care so +-- much whether the plan is ideal as that we don't fail or generate an +-- outright incorrect plan. +-- + +explain (costs off) + select * from ec0 where ff = f1 and f1 = '42'::int8; +explain (costs off) + select * from ec0 where ff = f1 and f1 = '42'::int8alias1; +explain (costs off) + select * from ec1 where ff = f1 and f1 = '42'::int8alias1; +explain (costs off) + select * from ec1 where ff = f1 and f1 = '42'::int8alias2; + +explain (costs off) + select * from ec1, ec2 where ff = x1 and ff = '42'::int8; +explain (costs off) + select * from ec1, ec2 where ff = x1 and ff = '42'::int8alias1; +explain (costs off) + select * from ec1, ec2 where ff = x1 and '42'::int8 = x1; +explain (costs off) + select * from ec1, ec2 where ff = x1 and x1 = '42'::int8alias1; +explain (costs off) + select * from ec1, ec2 where ff = x1 and x1 = '42'::int8alias2; + +create index ec1_expr1 on ec1((ff + 1)); +create index ec1_expr2 on ec1((ff + 2 + 1)); +create index ec1_expr3 on ec1((ff + 3 + 1)); +create index ec1_expr4 on ec1((ff + 4)); + +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1 + where ss1.x = ec1.f1 and ec1.ff = 42::int8; + +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1 + where ss1.x = ec1.f1 and ec1.ff = 42::int8 and ec1.ff = ec1.f1; + +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss2 + where ss1.x = ec1.f1 and ss1.x = ss2.x and ec1.ff = 42::int8; + +-- let's try that as a mergejoin +set enable_mergejoin = on; +set enable_nestloop = off; +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss2 + where ss1.x = ec1.f1 and ss1.x = ss2.x and ec1.ff = 42::int8; + +-- check partially indexed scan +set enable_nestloop = on; +set enable_mergejoin = off; + +drop index ec1_expr3; + +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1 + where ss1.x = ec1.f1 and ec1.ff = 42::int8; + +-- let's try that as a mergejoin +set enable_mergejoin = on; +set enable_nestloop = off; + +explain (costs off) + select * from ec1, + (select ff + 1 as x from + (select ff + 2 as ff from ec1 + union all + select ff + 3 as ff from ec1) ss0 + union all + select ff + 4 as x from ec1) as ss1 + where ss1.x = ec1.f1 and ec1.ff = 42::int8; + +-- check effects of row-level security +set enable_nestloop = on; +set enable_mergejoin = off; + +alter table ec1 enable row level security; +create policy p1 on ec1 using (f1 < '5'::int8alias1); + +create user regress_user_ectest; +grant select on ec0 to regress_user_ectest; +grant select on ec1 to regress_user_ectest; + +-- without any RLS, we'll treat {a.ff, b.ff, 43} as an EquivalenceClass +explain (costs off) + select * from ec0 a, ec1 b + where a.ff = b.ff and a.ff = 43::bigint::int8alias1; + +set session authorization regress_user_ectest; + +-- with RLS active, the non-leakproof a.ff = 43 clause is not treated +-- as a suitable source for an EquivalenceClass; currently, this is true +-- even though the RLS clause has nothing to do directly with the EC +explain (costs off) + select * from ec0 a, ec1 b + where a.ff = b.ff and a.ff = 43::bigint::int8alias1; + +reset session authorization; + +revoke select on ec0 from regress_user_ectest; +revoke select on ec1 from regress_user_ectest; + +drop user regress_user_ectest; + +-- check that X=X is converted to X IS NOT NULL when appropriate +explain (costs off) + select * from tenk1 where unique1 = unique1 and unique2 = unique2; + +-- this could be converted, but isn't at present +explain (costs off) + select * from tenk1 where unique1 = unique1 or unique2 = unique2; + +-- check that we recognize equivalence with dummy domains in the way +create temp table undername (f1 name, f2 int); +create temp view overview as + select f1::information_schema.sql_identifier as sqli, f2 from undername; +explain (costs off) -- this should not require a sort + select * from overview where sqli = 'foo' order by sqli; diff --git a/src/test/singlenode_regress/sql/errors.sql b/src/test/singlenode_regress/sql/errors.sql new file mode 100644 index 00000000000..a7fcf72dd45 --- /dev/null +++ b/src/test/singlenode_regress/sql/errors.sql @@ -0,0 +1,370 @@ +-- +-- ERRORS +-- + +-- bad in postquel, but ok in PostgreSQL +select 1; + + +-- +-- UNSUPPORTED STUFF + +-- doesn't work +-- notify pg_class +-- + +-- +-- SELECT + +-- this used to be a syntax error, but now we allow an empty target list +select; + +-- no such relation +select * from nonesuch; + +-- bad name in target list +select nonesuch from pg_database; + +-- empty distinct list isn't OK +select distinct from pg_database; + +-- bad attribute name on lhs of operator +select * from pg_database where nonesuch = pg_database.datname; + +-- bad attribute name on rhs of operator +select * from pg_database where pg_database.datname = nonesuch; + +-- bad attribute name in select distinct on +select distinct on (foobar) * from pg_database; + +-- grouping with FOR UPDATE +select null from pg_database group by datname for update; +select null from pg_database group by grouping sets (()) for update; + + +-- +-- DELETE + +-- missing relation name (this had better not wildcard!) +delete from; + +-- no such relation +delete from nonesuch; + + +-- +-- DROP + +-- missing relation name (this had better not wildcard!) +drop table; + +-- no such relation +drop table nonesuch; + + +-- +-- ALTER TABLE + +-- relation renaming + +-- missing relation name +alter table rename; + +-- no such relation +alter table nonesuch rename to newnonesuch; + +-- no such relation +alter table nonesuch rename to stud_emp; + +-- conflict +alter table stud_emp rename to aggtest; + +-- self-conflict +alter table stud_emp rename to stud_emp; + + +-- attribute renaming + +-- no such relation +alter table nonesuchrel rename column nonesuchatt to newnonesuchatt; + +-- no such attribute +alter table emp rename column nonesuchatt to newnonesuchatt; + +-- conflict +alter table emp rename column salary to manager; + +-- conflict +alter table emp rename column salary to ctid; + + +-- +-- TRANSACTION STUFF + +-- not in a xact +abort; + +-- not in a xact +end; + + +-- +-- CREATE AGGREGATE + +-- sfunc/finalfunc type disagreement +create aggregate newavg2 (sfunc = int4pl, + basetype = int4, + stype = int4, + finalfunc = int2um, + initcond = '0'); + +-- left out basetype +create aggregate newcnt1 (sfunc = int4inc, + stype = int4, + initcond = '0'); + + +-- +-- DROP INDEX + +-- missing index name +drop index; + +-- bad index name +drop index 314159; + +-- no such index +drop index nonesuch; + + +-- +-- DROP AGGREGATE + +-- missing aggregate name +drop aggregate; + +-- missing aggregate type +drop aggregate newcnt1; + +-- bad aggregate name +drop aggregate 314159 (int); + +-- bad aggregate type +drop aggregate newcnt (nonesuch); + +-- no such aggregate +drop aggregate nonesuch (int4); + +-- no such aggregate for type +drop aggregate newcnt (float4); + + +-- +-- DROP FUNCTION + +-- missing function name +drop function (); + +-- bad function name +drop function 314159(); + +-- no such function +drop function nonesuch(); + + +-- +-- DROP TYPE + +-- missing type name +drop type; + +-- bad type name +drop type 314159; + +-- no such type +drop type nonesuch; + + +-- +-- DROP OPERATOR + +-- missing everything +drop operator; + +-- bad operator name +drop operator equals; + +-- missing type list +drop operator ===; + +-- missing parentheses +drop operator int4, int4; + +-- missing operator name +drop operator (int4, int4); + +-- missing type list contents +drop operator === (); + +-- no such operator +drop operator === (int4); + +-- no such operator by that name +drop operator === (int4, int4); + +-- no such type1 +drop operator = (nonesuch); + +-- no such type1 +drop operator = ( , int4); + +-- no such type1 +drop operator = (nonesuch, int4); + +-- no such type2 +drop operator = (int4, nonesuch); + +-- no such type2 +drop operator = (int4, ); + + +-- +-- DROP RULE + +-- missing rule name +drop rule; + +-- bad rule name +drop rule 314159; + +-- no such rule +drop rule nonesuch on noplace; + +-- these postquel variants are no longer supported +drop tuple rule nonesuch; +drop instance rule nonesuch on noplace; +drop rewrite rule nonesuch; + +-- +-- Check that division-by-zero is properly caught. +-- + +select 1/0; + +select 1::int8/0; + +select 1/0::int8; + +select 1::int2/0; + +select 1/0::int2; + +select 1::numeric/0; + +select 1/0::numeric; + +select 1::float8/0; + +select 1/0::float8; + +select 1::float4/0; + +select 1/0::float4; + + +-- +-- Test psql's reporting of syntax error location +-- + +xxx; + +CREATE foo; + +CREATE TABLE ; + +CREATE TABLE +\g + +INSERT INTO foo VALUES(123) foo; + +INSERT INTO 123 +VALUES(123); + +INSERT INTO foo +VALUES(123) 123 +; + +-- with a tab +CREATE TABLE foo + (id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, + id3 INTEGER NOT NUL, + id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL); + +-- long line to be truncated on the left +CREATE TABLE foo(id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, +id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL); + +-- long line to be truncated on the right +CREATE TABLE foo( +id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL, id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY); + +-- long line to be truncated both ways +CREATE TABLE foo(id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL); + +-- long line to be truncated on the left, many lines +CREATE +TEMPORARY +TABLE +foo(id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, +id4 INT4 +UNIQUE +NOT +NULL, +id5 TEXT +UNIQUE +NOT +NULL) +; + +-- long line to be truncated on the right, many lines +CREATE +TEMPORARY +TABLE +foo( +id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL, id INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY) +; + +-- long line to be truncated both ways, many lines +CREATE +TEMPORARY +TABLE +foo +(id +INT4 +UNIQUE NOT NULL, idx INT4 UNIQUE NOT NULL, idy INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL, +idz INT4 UNIQUE NOT NULL, +idv INT4 UNIQUE NOT NULL); + +-- more than 10 lines... +CREATE +TEMPORARY +TABLE +foo +(id +INT4 +UNIQUE +NOT +NULL +, +idm +INT4 +UNIQUE +NOT +NULL, +idx INT4 UNIQUE NOT NULL, idy INT4 UNIQUE NOT NULL, id2 TEXT NOT NULL PRIMARY KEY, id3 INTEGER NOT NUL, id4 INT4 UNIQUE NOT NULL, id5 TEXT UNIQUE NOT NULL, +idz INT4 UNIQUE NOT NULL, +idv +INT4 +UNIQUE +NOT +NULL); diff --git a/src/test/singlenode_regress/sql/event_trigger.sql b/src/test/singlenode_regress/sql/event_trigger.sql new file mode 100644 index 00000000000..5e45e3f190e --- /dev/null +++ b/src/test/singlenode_regress/sql/event_trigger.sql @@ -0,0 +1,468 @@ +-- should fail, return type mismatch +create event trigger regress_event_trigger + on ddl_command_start + execute procedure pg_backend_pid(); + +-- OK +create function test_event_trigger() returns event_trigger as $$ +BEGIN + RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag; +END +$$ language plpgsql; + +-- should fail, can't call it as a plain function +SELECT test_event_trigger(); + +-- should fail, event triggers cannot have declared arguments +create function test_event_trigger_arg(name text) +returns event_trigger as $$ BEGIN RETURN 1; END $$ language plpgsql; + +-- should fail, SQL functions cannot be event triggers +create function test_event_trigger_sql() returns event_trigger as $$ +SELECT 1 $$ language sql; + +-- should fail, no elephant_bootstrap entry point +create event trigger regress_event_trigger on elephant_bootstrap + execute procedure test_event_trigger(); + +-- OK +create event trigger regress_event_trigger on ddl_command_start + execute procedure test_event_trigger(); + +-- OK +create event trigger regress_event_trigger_end on ddl_command_end + execute function test_event_trigger(); + +-- should fail, food is not a valid filter variable +create event trigger regress_event_trigger2 on ddl_command_start + when food in ('sandwich') + execute procedure test_event_trigger(); + +-- should fail, sandwich is not a valid command tag +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('sandwich') + execute procedure test_event_trigger(); + +-- should fail, create skunkcabbage is not a valid command tag +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('create table', 'create skunkcabbage') + execute procedure test_event_trigger(); + +-- should fail, can't have event triggers on event triggers +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('DROP EVENT TRIGGER') + execute procedure test_event_trigger(); + +-- should fail, can't have event triggers on global objects +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('CREATE ROLE') + execute procedure test_event_trigger(); + +-- should fail, can't have event triggers on global objects +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('CREATE DATABASE') + execute procedure test_event_trigger(); + +-- should fail, can't have event triggers on global objects +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('CREATE TABLESPACE') + execute procedure test_event_trigger(); + +-- should fail, can't have same filter variable twice +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('create table') and tag in ('CREATE FUNCTION') + execute procedure test_event_trigger(); + +-- should fail, can't have arguments +create event trigger regress_event_trigger2 on ddl_command_start + execute procedure test_event_trigger('argument not allowed'); + +-- OK +create event trigger regress_event_trigger2 on ddl_command_start + when tag in ('create table', 'CREATE FUNCTION') + execute procedure test_event_trigger(); + +-- OK +comment on event trigger regress_event_trigger is 'test comment'; + +-- drop as non-superuser should fail +create role regress_evt_user; +set role regress_evt_user; +create event trigger regress_event_trigger_noperms on ddl_command_start + execute procedure test_event_trigger(); +reset role; + +-- test enabling and disabling +alter event trigger regress_event_trigger disable; +-- fires _trigger2 and _trigger_end should fire, but not _trigger +create table event_trigger_fire1 (a int); +alter event trigger regress_event_trigger enable; +set session_replication_role = replica; +-- fires nothing +create table event_trigger_fire2 (a int); +alter event trigger regress_event_trigger enable replica; +-- fires only _trigger +create table event_trigger_fire3 (a int); +alter event trigger regress_event_trigger enable always; +-- fires only _trigger +create table event_trigger_fire4 (a int); +reset session_replication_role; +-- fires all three +create table event_trigger_fire5 (a int); +-- non-top-level command +create function f1() returns int +language plpgsql +as $$ +begin + create table event_trigger_fire6 (a int); + return 0; +end $$; +select f1(); +-- non-top-level command +create procedure p1() +language plpgsql +as $$ +begin + create table event_trigger_fire7 (a int); +end $$; +call p1(); + +-- clean up +alter event trigger regress_event_trigger disable; +drop table event_trigger_fire2, event_trigger_fire3, event_trigger_fire4, event_trigger_fire5, event_trigger_fire6, event_trigger_fire7; +drop routine f1(), p1(); + +-- regress_event_trigger_end should fire on these commands +grant all on table event_trigger_fire1 to public; +comment on table event_trigger_fire1 is 'here is a comment'; +revoke all on table event_trigger_fire1 from public; +drop table event_trigger_fire1; +create foreign data wrapper useless; +create server useless_server foreign data wrapper useless; +create user mapping for regress_evt_user server useless_server; +alter default privileges for role regress_evt_user + revoke delete on tables from regress_evt_user; + +-- alter owner to non-superuser should fail +alter event trigger regress_event_trigger owner to regress_evt_user; + +-- alter owner to superuser should work +alter role regress_evt_user superuser; +alter event trigger regress_event_trigger owner to regress_evt_user; + +-- should fail, name collision +alter event trigger regress_event_trigger rename to regress_event_trigger2; + +-- OK +alter event trigger regress_event_trigger rename to regress_event_trigger3; + +-- should fail, doesn't exist any more +drop event trigger regress_event_trigger; + +-- should fail, regress_evt_user owns some objects +drop role regress_evt_user; + +-- cleanup before next test +-- these are all OK; the second one should emit a NOTICE +drop event trigger if exists regress_event_trigger2; +drop event trigger if exists regress_event_trigger2; +drop event trigger regress_event_trigger3; +drop event trigger regress_event_trigger_end; + +-- test support for dropped objects +CREATE SCHEMA schema_one authorization regress_evt_user; +CREATE SCHEMA schema_two authorization regress_evt_user; +CREATE SCHEMA audit_tbls authorization regress_evt_user; +CREATE TEMP TABLE a_temp_tbl (); +SET SESSION AUTHORIZATION regress_evt_user; + +CREATE TABLE schema_one.table_one(a int); +CREATE TABLE schema_one."table two"(a int); +CREATE TABLE schema_one.table_three(a int); +CREATE TABLE audit_tbls.schema_one_table_two(the_value text); + +CREATE TABLE schema_two.table_two(a int); +CREATE TABLE schema_two.table_three(a int, b text); +CREATE TABLE audit_tbls.schema_two_table_three(the_value text); + +CREATE OR REPLACE FUNCTION schema_two.add(int, int) RETURNS int LANGUAGE plpgsql + CALLED ON NULL INPUT + AS $$ BEGIN RETURN coalesce($1,0) + coalesce($2,0); END; $$; +CREATE AGGREGATE schema_two.newton + (BASETYPE = int, SFUNC = schema_two.add, STYPE = int); + +RESET SESSION AUTHORIZATION; + +CREATE TABLE undroppable_objs ( + object_type text, + object_identity text +); +INSERT INTO undroppable_objs VALUES +('table', 'schema_one.table_three'), +('table', 'audit_tbls.schema_two_table_three'); + +CREATE TABLE dropped_objects ( + type text, + schema text, + object text +); + +-- This tests errors raised within event triggers; the one in audit_tbls +-- uses 2nd-level recursive invocation via test_evtrig_dropped_objects(). +CREATE OR REPLACE FUNCTION undroppable() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +DECLARE + obj record; +BEGIN + PERFORM 1 FROM pg_tables WHERE tablename = 'undroppable_objs'; + IF NOT FOUND THEN + RAISE NOTICE 'table undroppable_objs not found, skipping'; + RETURN; + END IF; + FOR obj IN + SELECT * FROM pg_event_trigger_dropped_objects() JOIN + undroppable_objs USING (object_type, object_identity) + LOOP + RAISE EXCEPTION 'object % of type % cannot be dropped', + obj.object_identity, obj.object_type; + END LOOP; +END; +$$; + +CREATE EVENT TRIGGER undroppable ON sql_drop + EXECUTE PROCEDURE undroppable(); + +CREATE OR REPLACE FUNCTION test_evtrig_dropped_objects() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +DECLARE + obj record; +BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() + LOOP + IF obj.object_type = 'table' THEN + EXECUTE format('DROP TABLE IF EXISTS audit_tbls.%I', + format('%s_%s', obj.schema_name, obj.object_name)); + END IF; + + INSERT INTO dropped_objects + (type, schema, object) VALUES + (obj.object_type, obj.schema_name, obj.object_identity); + END LOOP; +END +$$; + +CREATE EVENT TRIGGER regress_event_trigger_drop_objects ON sql_drop + WHEN TAG IN ('drop table', 'drop function', 'drop view', + 'drop owned', 'drop schema', 'alter table') + EXECUTE PROCEDURE test_evtrig_dropped_objects(); + +ALTER TABLE schema_one.table_one DROP COLUMN a; +DROP SCHEMA schema_one, schema_two CASCADE; +DELETE FROM undroppable_objs WHERE object_identity = 'audit_tbls.schema_two_table_three'; +DROP SCHEMA schema_one, schema_two CASCADE; +DELETE FROM undroppable_objs WHERE object_identity = 'schema_one.table_three'; +DROP SCHEMA schema_one, schema_two CASCADE; + +SELECT * FROM dropped_objects WHERE schema IS NULL OR schema <> 'pg_toast'; + +DROP OWNED BY regress_evt_user; +SELECT * FROM dropped_objects WHERE type = 'schema'; + +DROP ROLE regress_evt_user; + +DROP EVENT TRIGGER regress_event_trigger_drop_objects; +DROP EVENT TRIGGER undroppable; + +-- Event triggers on relations. +CREATE OR REPLACE FUNCTION event_trigger_report_dropped() + RETURNS event_trigger + LANGUAGE plpgsql +AS $$ +DECLARE r record; +BEGIN + FOR r IN SELECT * from pg_event_trigger_dropped_objects() + LOOP + IF NOT r.normal AND NOT r.original THEN + CONTINUE; + END IF; + RAISE NOTICE 'NORMAL: orig=% normal=% istemp=% type=% identity=% name=% args=%', + r.original, r.normal, r.is_temporary, r.object_type, + r.object_identity, r.address_names, r.address_args; + END LOOP; +END; $$; +CREATE EVENT TRIGGER regress_event_trigger_report_dropped ON sql_drop + EXECUTE PROCEDURE event_trigger_report_dropped(); +CREATE OR REPLACE FUNCTION event_trigger_report_end() + RETURNS event_trigger + LANGUAGE plpgsql +AS $$ +DECLARE r RECORD; +BEGIN + FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + RAISE NOTICE 'END: command_tag=% type=% identity=%', + r.command_tag, r.object_type, r.object_identity; + END LOOP; +END; $$; +CREATE EVENT TRIGGER regress_event_trigger_report_end ON ddl_command_end + EXECUTE PROCEDURE event_trigger_report_end(); + +CREATE SCHEMA evttrig + CREATE TABLE one (col_a SERIAL PRIMARY KEY, col_b text DEFAULT 'forty two', col_c SERIAL) + CREATE INDEX one_idx ON one (col_b) + CREATE TABLE two (col_c INTEGER CHECK (col_c > 0) REFERENCES one DEFAULT 42) + CREATE TABLE id (col_d int NOT NULL GENERATED ALWAYS AS IDENTITY); + +-- Partitioned tables with a partitioned index +CREATE TABLE evttrig.parted ( + id int PRIMARY KEY) + PARTITION BY RANGE (id); +CREATE TABLE evttrig.part_1_10 PARTITION OF evttrig.parted (id) + FOR VALUES FROM (1) TO (10); +CREATE TABLE evttrig.part_10_20 PARTITION OF evttrig.parted (id) + FOR VALUES FROM (10) TO (20) PARTITION BY RANGE (id); +CREATE TABLE evttrig.part_10_15 PARTITION OF evttrig.part_10_20 (id) + FOR VALUES FROM (10) TO (15); +CREATE TABLE evttrig.part_15_20 PARTITION OF evttrig.part_10_20 (id) + FOR VALUES FROM (15) TO (20); + +ALTER TABLE evttrig.two DROP COLUMN col_c; +ALTER TABLE evttrig.one ALTER COLUMN col_b DROP DEFAULT; +ALTER TABLE evttrig.one DROP CONSTRAINT one_pkey; +ALTER TABLE evttrig.one DROP COLUMN col_c; +ALTER TABLE evttrig.id ALTER COLUMN col_d SET DATA TYPE bigint; +ALTER TABLE evttrig.id ALTER COLUMN col_d DROP IDENTITY, + ALTER COLUMN col_d SET DATA TYPE int; +DROP INDEX evttrig.one_idx; +DROP SCHEMA evttrig CASCADE; +DROP TABLE a_temp_tbl; + +-- CREATE OPERATOR CLASS without FAMILY clause should report +-- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS +CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int; + +DROP EVENT TRIGGER regress_event_trigger_report_dropped; +DROP EVENT TRIGGER regress_event_trigger_report_end; + +-- only allowed from within an event trigger function, should fail +select pg_event_trigger_table_rewrite_oid(); + +-- test Table Rewrite Event Trigger +CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE EXCEPTION 'rewrites not allowed'; +END; +$$; + +create event trigger no_rewrite_allowed on table_rewrite + execute procedure test_evtrig_no_rewrite(); + +create table rewriteme (id serial primary key, foo float, bar timestamptz); +insert into rewriteme + select x * 1.001 from generate_series(1, 500) as t(x); +alter table rewriteme alter column foo type numeric; +alter table rewriteme add column baz int default 0; + +-- test with more than one reason to rewrite a single table +CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE NOTICE 'Table ''%'' is being rewritten (reason = %)', + pg_event_trigger_table_rewrite_oid()::regclass, + pg_event_trigger_table_rewrite_reason(); +END; +$$; + +alter table rewriteme + add column onemore int default 0, + add column another int default -1, + alter column foo type numeric(10,4); + +-- shouldn't trigger a table_rewrite event +alter table rewriteme alter column foo type numeric(12,4); +begin; +set timezone to 'UTC'; +alter table rewriteme alter column bar type timestamp; +set timezone to '0'; +alter table rewriteme alter column bar type timestamptz; +set timezone to 'Europe/London'; +alter table rewriteme alter column bar type timestamp; -- does rewrite +rollback; + +-- typed tables are rewritten when their type changes. Don't emit table +-- name, because firing order is not stable. +CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE NOTICE 'Table is being rewritten (reason = %)', + pg_event_trigger_table_rewrite_reason(); +END; +$$; + +create type rewritetype as (a int); +create table rewritemetoo1 of rewritetype; +create table rewritemetoo2 of rewritetype; +alter type rewritetype alter attribute a type text cascade; + +-- but this doesn't work +create table rewritemetoo3 (a rewritetype); +alter type rewritetype alter attribute a type varchar cascade; + +drop table rewriteme; +drop event trigger no_rewrite_allowed; +drop function test_evtrig_no_rewrite(); + +-- test Row Security Event Trigger +RESET SESSION AUTHORIZATION; +CREATE TABLE event_trigger_test (a integer, b text); + +CREATE OR REPLACE FUNCTION start_command() +RETURNS event_trigger AS $$ +BEGIN +RAISE NOTICE '% - ddl_command_start', tg_tag; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION end_command() +RETURNS event_trigger AS $$ +BEGIN +RAISE NOTICE '% - ddl_command_end', tg_tag; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION drop_sql_command() +RETURNS event_trigger AS $$ +BEGIN +RAISE NOTICE '% - sql_drop', tg_tag; +END; +$$ LANGUAGE plpgsql; + +CREATE EVENT TRIGGER start_rls_command ON ddl_command_start + WHEN TAG IN ('CREATE POLICY', 'ALTER POLICY', 'DROP POLICY') EXECUTE PROCEDURE start_command(); + +CREATE EVENT TRIGGER end_rls_command ON ddl_command_end + WHEN TAG IN ('CREATE POLICY', 'ALTER POLICY', 'DROP POLICY') EXECUTE PROCEDURE end_command(); + +CREATE EVENT TRIGGER sql_drop_command ON sql_drop + WHEN TAG IN ('DROP POLICY') EXECUTE PROCEDURE drop_sql_command(); + +CREATE POLICY p1 ON event_trigger_test USING (FALSE); +ALTER POLICY p1 ON event_trigger_test USING (TRUE); +ALTER POLICY p1 ON event_trigger_test RENAME TO p2; +DROP POLICY p2 ON event_trigger_test; + +-- Check the object addresses of all the event triggers. +SELECT + e.evtname, + pg_describe_object('pg_event_trigger'::regclass, e.oid, 0) as descr, + b.type, b.object_names, b.object_args, + pg_identify_object(a.classid, a.objid, a.objsubid) as ident + FROM pg_event_trigger as e, + LATERAL pg_identify_object_as_address('pg_event_trigger'::regclass, e.oid, 0) as b, + LATERAL pg_get_object_address(b.type, b.object_names, b.object_args) as a + ORDER BY e.evtname; + +DROP EVENT TRIGGER start_rls_command; +DROP EVENT TRIGGER end_rls_command; +DROP EVENT TRIGGER sql_drop_command; diff --git a/src/test/singlenode_regress/sql/explain.sql b/src/test/singlenode_regress/sql/explain.sql new file mode 100644 index 00000000000..3f9ae9843a2 --- /dev/null +++ b/src/test/singlenode_regress/sql/explain.sql @@ -0,0 +1,108 @@ +-- +-- EXPLAIN +-- +-- There are many test cases elsewhere that use EXPLAIN as a vehicle for +-- checking something else (usually planner behavior). This file is +-- concerned with testing EXPLAIN in its own right. +-- + +-- To produce stable regression test output, it's usually necessary to +-- ignore details such as exact costs or row counts. These filter +-- functions replace changeable output details with fixed strings. + +create function explain_filter(text) returns setof text +language plpgsql as +$$ +declare + ln text; +begin + for ln in execute $1 + loop + -- Replace any numeric word with just 'N' + ln := regexp_replace(ln, '-?\m\d+\M', 'N', 'g'); + -- In sort output, the above won't match units-suffixed numbers + ln := regexp_replace(ln, '\m\d+kB', 'NkB', 'g'); + -- Ignore text-mode buffers output because it varies depending + -- on the system state + CONTINUE WHEN (ln ~ ' +Buffers: .*'); + -- Ignore text-mode "Planning:" line because whether it's output + -- varies depending on the system state + CONTINUE WHEN (ln = 'Planning:'); + return next ln; + end loop; +end; +$$; + +-- To produce valid JSON output, replace numbers with "0" or "0.0" not "N" +create function explain_filter_to_json(text) returns jsonb +language plpgsql as +$$ +declare + data text := ''; + ln text; +begin + for ln in execute $1 + loop + -- Replace any numeric word with just '0' + ln := regexp_replace(ln, '\m\d+\M', '0', 'g'); + data := data || ln; + end loop; + return data::jsonb; +end; +$$; + +-- Simple cases + +select explain_filter('explain select * from int8_tbl i8'); +select explain_filter('explain (analyze) select * from int8_tbl i8'); +select explain_filter('explain (analyze, verbose) select * from int8_tbl i8'); +select explain_filter('explain (analyze, buffers, format text) select * from int8_tbl i8'); +select explain_filter('explain (analyze, buffers, format json) select * from int8_tbl i8'); +select explain_filter('explain (analyze, buffers, format xml) select * from int8_tbl i8'); +select explain_filter('explain (analyze, buffers, format yaml) select * from int8_tbl i8'); +select explain_filter('explain (buffers, format text) select * from int8_tbl i8'); +select explain_filter('explain (buffers, format json) select * from int8_tbl i8'); + +-- SETTINGS option +-- We have to ignore other settings that might be imposed by the environment, +-- so printing the whole Settings field unfortunately won't do. + +begin; +set local plan_cache_mode = force_generic_plan; +select true as "OK" + from explain_filter('explain (settings) select * from int8_tbl i8') ln + where ln ~ '^ *Settings: .*plan_cache_mode = ''force_generic_plan'''; +select explain_filter_to_json('explain (settings, format json) select * from int8_tbl i8') #> '{0,Settings,plan_cache_mode}'; +rollback; + +-- +-- Test production of per-worker data +-- +-- Unfortunately, because we don't know how many worker processes we'll +-- actually get (maybe none at all), we can't examine the "Workers" output +-- in any detail. We can check that it parses correctly as JSON, and then +-- remove it from the displayed results. + +begin; +-- encourage use of parallel plans +set parallel_setup_cost=0; +set parallel_tuple_cost=0; +set min_parallel_table_scan_size=0; +set max_parallel_workers_per_gather=4; + +select jsonb_pretty( + explain_filter_to_json('explain (analyze, verbose, buffers, format json) + select * from tenk1 order by tenthous') + -- remove "Workers" node of the Seq Scan plan node + #- '{0,Plan,Plans,0,Plans,0,Workers}' + -- remove "Workers" node of the Sort plan node + #- '{0,Plan,Plans,0,Workers}' + -- Also remove its sort-type fields, as those aren't 100% stable + #- '{0,Plan,Plans,0,Sort Method}' + #- '{0,Plan,Plans,0,Sort Space Type}' +); + +rollback; + +set compute_query_id = on; +select explain_filter('explain (verbose) select * from int8_tbl i8'); diff --git a/src/test/singlenode_regress/sql/expressions.sql b/src/test/singlenode_regress/sql/expressions.sql new file mode 100644 index 00000000000..f9f9f97efa4 --- /dev/null +++ b/src/test/singlenode_regress/sql/expressions.sql @@ -0,0 +1,205 @@ +-- +-- expression evaluation tests that don't fit into a more specific file +-- + +-- +-- Tests for SQLVAlueFunction +-- + + +-- current_date (always matches because of transactional behaviour) +SELECT date(now())::text = current_date::text; + + +-- current_time / localtime +SELECT now()::timetz::text = current_time::text; +SELECT now()::timetz(4)::text = current_time(4)::text; +SELECT now()::time::text = localtime::text; +SELECT now()::time(3)::text = localtime(3)::text; + +-- current_timestamp / localtimestamp (always matches because of transactional behaviour) +SELECT current_timestamp = NOW(); +-- precision +SELECT length(current_timestamp::text) >= length(current_timestamp(0)::text); +-- localtimestamp +SELECT now()::timestamp::text = localtimestamp::text; + +-- current_role/user/user is tested in rolnames.sql + +-- current database / catalog +SELECT current_catalog = current_database(); + +-- current_schema +SELECT current_schema; +SET search_path = 'notme'; +SELECT current_schema; +SET search_path = 'pg_catalog'; +SELECT current_schema; +RESET search_path; + + +-- +-- Tests for BETWEEN +-- + +explain (costs off) +select count(*) from date_tbl + where f1 between '1997-01-01' and '1998-01-01'; +select count(*) from date_tbl + where f1 between '1997-01-01' and '1998-01-01'; + +explain (costs off) +select count(*) from date_tbl + where f1 not between '1997-01-01' and '1998-01-01'; +select count(*) from date_tbl + where f1 not between '1997-01-01' and '1998-01-01'; + +explain (costs off) +select count(*) from date_tbl + where f1 between symmetric '1997-01-01' and '1998-01-01'; +select count(*) from date_tbl + where f1 between symmetric '1997-01-01' and '1998-01-01'; + +explain (costs off) +select count(*) from date_tbl + where f1 not between symmetric '1997-01-01' and '1998-01-01'; +select count(*) from date_tbl + where f1 not between symmetric '1997-01-01' and '1998-01-01'; + + +-- +-- Test parsing of a no-op cast to a type with unspecified typmod +-- +begin; + +create table numeric_tbl (f1 numeric(18,3), f2 numeric); + +create view numeric_view as + select + f1, f1::numeric(16,4) as f1164, f1::numeric as f1n, + f2, f2::numeric(16,4) as f2164, f2::numeric as f2n + from numeric_tbl; + +\d+ numeric_view + +explain (verbose, costs off) select * from numeric_view; + +-- bpchar, lacking planner support for its length coercion function, +-- could behave differently + +create table bpchar_tbl (f1 character(16) unique, f2 bpchar); + +create view bpchar_view as + select + f1, f1::character(14) as f114, f1::bpchar as f1n, + f2, f2::character(14) as f214, f2::bpchar as f2n + from bpchar_tbl; + +\d+ bpchar_view + +explain (verbose, costs off) select * from bpchar_view + where f1::bpchar = 'foo'; + +rollback; + + +-- +-- Ordinarily, IN/NOT IN can be converted to a ScalarArrayOpExpr +-- with a suitably-chosen array type. +-- +explain (verbose, costs off) +select random() IN (1, 4, 8.0); +explain (verbose, costs off) +select random()::int IN (1, 4, 8.0); +-- However, if there's not a common supertype for the IN elements, +-- we should instead try to produce "x = v1 OR x = v2 OR ...". +-- In most cases that'll fail for lack of all the requisite = operators, +-- but it can succeed sometimes. So this should complain about lack of +-- an = operator, not about cast failure. +select '(0,0)'::point in ('(0,0,0,0)'::box, point(0,0)); + + +-- +-- Tests for ScalarArrayOpExpr with a hashfn +-- + +-- create a stable function so that the tests below are not +-- evaluated using the planner's constant folding. +begin; + +create function return_int_input(int) returns int as $$ +begin + return $1; +end; +$$ language plpgsql stable; + +create function return_text_input(text) returns text as $$ +begin + return $1; +end; +$$ language plpgsql stable; + +select return_int_input(1) in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); +select return_int_input(1) in (10, 9, 2, 8, 3, 7, 4, 6, 5, null); +select return_int_input(1) in (null, null, null, null, null, null, null, null, null, null, null); +select return_int_input(1) in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1, null); +select return_int_input(null::int) in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); +select return_int_input(null::int) in (10, 9, 2, 8, 3, 7, 4, 6, 5, null); +select return_text_input('a') in ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'); + +rollback; + +-- Test with non-strict equality function. +-- We need to create our own type for this. + +begin; + +create type myint; +create function myintin(cstring) returns myint strict immutable language + internal as 'int4in'; +create function myintout(myint) returns cstring strict immutable language + internal as 'int4out'; +create function myinthash(myint) returns integer strict immutable language + internal as 'hashint4'; + +create type myint (input = myintin, output = myintout, like = int4); + +create cast (int4 as myint) without function; +create cast (myint as int4) without function; + +create function myinteq(myint, myint) returns bool as $$ +begin + if $1 is null and $2 is null then + return true; + else + return $1::int = $2::int; + end if; +end; +$$ language plpgsql immutable; + +create operator = ( + leftarg = myint, + rightarg = myint, + commutator = =, + negator = <>, + procedure = myinteq, + restrict = eqsel, + join = eqjoinsel, + merges +); + +create operator class myint_ops +default for type myint using hash as + operator 1 = (myint, myint), + function 1 myinthash(myint); + +create table inttest (a myint); +insert into inttest values(1::myint),(null); + +-- try an array with enough elements to cause hashing +select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); +-- ensure the result matched with the non-hashed version. We simply remove +-- some array elements so that we don't reach the hashing threshold. +select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint, null); + +rollback; diff --git a/src/test/singlenode_regress/sql/fast_default.sql b/src/test/singlenode_regress/sql/fast_default.sql new file mode 100644 index 00000000000..16a3b7ca51d --- /dev/null +++ b/src/test/singlenode_regress/sql/fast_default.sql @@ -0,0 +1,562 @@ +-- +-- ALTER TABLE ADD COLUMN DEFAULT test +-- + +SET search_path = fast_default; +CREATE SCHEMA fast_default; +CREATE TABLE m(id OID); +INSERT INTO m VALUES (NULL::OID); + +CREATE FUNCTION set(tabname name) RETURNS VOID +AS $$ +BEGIN + UPDATE m + SET id = (SELECT c.relfilenode + FROM pg_class AS c, pg_namespace AS s + WHERE c.relname = tabname + AND c.relnamespace = s.oid + AND s.nspname = 'fast_default'); +END; +$$ LANGUAGE 'plpgsql'; + +CREATE FUNCTION comp() RETURNS TEXT +AS $$ +BEGIN + RETURN (SELECT CASE + WHEN m.id = c.relfilenode THEN 'Unchanged' + ELSE 'Rewritten' + END + FROM m, pg_class AS c, pg_namespace AS s + WHERE c.relname = 't' + AND c.relnamespace = s.oid + AND s.nspname = 'fast_default'); +END; +$$ LANGUAGE 'plpgsql'; + +CREATE FUNCTION log_rewrite() RETURNS event_trigger +LANGUAGE plpgsql as +$func$ + +declare + this_schema text; +begin + select into this_schema relnamespace::regnamespace::text + from pg_class + where oid = pg_event_trigger_table_rewrite_oid(); + if this_schema = 'fast_default' + then + RAISE NOTICE 'rewriting table % for reason %', + pg_event_trigger_table_rewrite_oid()::regclass, + pg_event_trigger_table_rewrite_reason(); + end if; +end; +$func$; + +CREATE TABLE has_volatile AS +SELECT * FROM generate_series(1,10) id; + + +CREATE EVENT TRIGGER has_volatile_rewrite + ON table_rewrite + EXECUTE PROCEDURE log_rewrite(); + +-- only the last of these should trigger a rewrite +ALTER TABLE has_volatile ADD col1 int; +ALTER TABLE has_volatile ADD col2 int DEFAULT 1; +ALTER TABLE has_volatile ADD col3 timestamptz DEFAULT current_timestamp; +ALTER TABLE has_volatile ADD col4 int DEFAULT (random() * 10000)::int; + + + +-- Test a large sample of different datatypes +CREATE TABLE T(pk INT NOT NULL PRIMARY KEY, c_int INT DEFAULT 1); + +SELECT set('t'); + +INSERT INTO T VALUES (1), (2); + +ALTER TABLE T ADD COLUMN c_bpchar BPCHAR(5) DEFAULT 'hello', + ALTER COLUMN c_int SET DEFAULT 2; + +INSERT INTO T VALUES (3), (4); + + +ALTER TABLE T ADD COLUMN c_text TEXT DEFAULT 'world', + ALTER COLUMN c_bpchar SET DEFAULT 'dog'; + +INSERT INTO T VALUES (5), (6); + +ALTER TABLE T ADD COLUMN c_date DATE DEFAULT '2016-06-02', + ALTER COLUMN c_text SET DEFAULT 'cat'; + +INSERT INTO T VALUES (7), (8); + +ALTER TABLE T ADD COLUMN c_timestamp TIMESTAMP DEFAULT '2016-09-01 12:00:00', + ADD COLUMN c_timestamp_null TIMESTAMP, + ALTER COLUMN c_date SET DEFAULT '2010-01-01'; + +INSERT INTO T VALUES (9), (10); + +ALTER TABLE T ADD COLUMN c_array TEXT[] + DEFAULT '{"This", "is", "the", "real", "world"}', + ALTER COLUMN c_timestamp SET DEFAULT '1970-12-31 11:12:13', + ALTER COLUMN c_timestamp_null SET DEFAULT '2016-09-29 12:00:00'; + +INSERT INTO T VALUES (11), (12); + +ALTER TABLE T ADD COLUMN c_small SMALLINT DEFAULT -5, + ADD COLUMN c_small_null SMALLINT, + ALTER COLUMN c_array + SET DEFAULT '{"This", "is", "no", "fantasy"}'; + +INSERT INTO T VALUES (13), (14); + +ALTER TABLE T ADD COLUMN c_big BIGINT DEFAULT 180000000000018, + ALTER COLUMN c_small SET DEFAULT 9, + ALTER COLUMN c_small_null SET DEFAULT 13; + +INSERT INTO T VALUES (15), (16); + +ALTER TABLE T ADD COLUMN c_num NUMERIC DEFAULT 1.00000000001, + ALTER COLUMN c_big SET DEFAULT -9999999999999999; + +INSERT INTO T VALUES (17), (18); + +ALTER TABLE T ADD COLUMN c_time TIME DEFAULT '12:00:00', + ALTER COLUMN c_num SET DEFAULT 2.000000000000002; + +INSERT INTO T VALUES (19), (20); + +ALTER TABLE T ADD COLUMN c_interval INTERVAL DEFAULT '1 day', + ALTER COLUMN c_time SET DEFAULT '23:59:59'; + +INSERT INTO T VALUES (21), (22); + +ALTER TABLE T ADD COLUMN c_hugetext TEXT DEFAULT repeat('abcdefg',1000), + ALTER COLUMN c_interval SET DEFAULT '3 hours'; + +INSERT INTO T VALUES (23), (24); + +ALTER TABLE T ALTER COLUMN c_interval DROP DEFAULT, + ALTER COLUMN c_hugetext SET DEFAULT repeat('poiuyt', 1000); + +INSERT INTO T VALUES (25), (26); + +ALTER TABLE T ALTER COLUMN c_bpchar DROP DEFAULT, + ALTER COLUMN c_date DROP DEFAULT, + ALTER COLUMN c_text DROP DEFAULT, + ALTER COLUMN c_timestamp DROP DEFAULT, + ALTER COLUMN c_array DROP DEFAULT, + ALTER COLUMN c_small DROP DEFAULT, + ALTER COLUMN c_big DROP DEFAULT, + ALTER COLUMN c_num DROP DEFAULT, + ALTER COLUMN c_time DROP DEFAULT, + ALTER COLUMN c_hugetext DROP DEFAULT; + +INSERT INTO T VALUES (27), (28); + +SELECT pk, c_int, c_bpchar, c_text, c_date, c_timestamp, + c_timestamp_null, c_array, c_small, c_small_null, + c_big, c_num, c_time, c_interval, + c_hugetext = repeat('abcdefg',1000) as c_hugetext_origdef, + c_hugetext = repeat('poiuyt', 1000) as c_hugetext_newdef +FROM T ORDER BY pk; + +SELECT comp(); + +DROP TABLE T; + +-- Test expressions in the defaults +CREATE OR REPLACE FUNCTION foo(a INT) RETURNS TEXT AS $$ +DECLARE res TEXT := ''; + i INT; +BEGIN + i := 0; + WHILE (i < a) LOOP + res := res || chr(ascii('a') + i); + i := i + 1; + END LOOP; + RETURN res; +END; $$ LANGUAGE PLPGSQL STABLE; + +CREATE TABLE T(pk INT NOT NULL PRIMARY KEY, c_int INT DEFAULT LENGTH(foo(6))); + +SELECT set('t'); + +INSERT INTO T VALUES (1), (2); + +ALTER TABLE T ADD COLUMN c_bpchar BPCHAR(5) DEFAULT foo(4), + ALTER COLUMN c_int SET DEFAULT LENGTH(foo(8)); + +INSERT INTO T VALUES (3), (4); + +ALTER TABLE T ADD COLUMN c_text TEXT DEFAULT foo(6), + ALTER COLUMN c_bpchar SET DEFAULT foo(3); + +INSERT INTO T VALUES (5), (6); + +ALTER TABLE T ADD COLUMN c_date DATE + DEFAULT '2016-06-02'::DATE + LENGTH(foo(10)), + ALTER COLUMN c_text SET DEFAULT foo(12); + +INSERT INTO T VALUES (7), (8); + +ALTER TABLE T ADD COLUMN c_timestamp TIMESTAMP + DEFAULT '2016-09-01'::DATE + LENGTH(foo(10)), + ALTER COLUMN c_date + SET DEFAULT '2010-01-01'::DATE - LENGTH(foo(4)); + +INSERT INTO T VALUES (9), (10); + +ALTER TABLE T ADD COLUMN c_array TEXT[] + DEFAULT ('{"This", "is", "' || foo(4) || + '","the", "real", "world"}')::TEXT[], + ALTER COLUMN c_timestamp + SET DEFAULT '1970-12-31'::DATE + LENGTH(foo(30)); + +INSERT INTO T VALUES (11), (12); + +ALTER TABLE T ALTER COLUMN c_int DROP DEFAULT, + ALTER COLUMN c_array + SET DEFAULT ('{"This", "is", "' || foo(1) || + '", "fantasy"}')::text[]; + +INSERT INTO T VALUES (13), (14); + +ALTER TABLE T ALTER COLUMN c_bpchar DROP DEFAULT, + ALTER COLUMN c_date DROP DEFAULT, + ALTER COLUMN c_text DROP DEFAULT, + ALTER COLUMN c_timestamp DROP DEFAULT, + ALTER COLUMN c_array DROP DEFAULT; + +INSERT INTO T VALUES (15), (16); + +SELECT * FROM T; + +SELECT comp(); + +DROP TABLE T; + +DROP FUNCTION foo(INT); + +-- Fall back to full rewrite for volatile expressions +CREATE TABLE T(pk INT NOT NULL PRIMARY KEY); + +INSERT INTO T VALUES (1); + +SELECT set('t'); + +-- now() is stable, because it returns the transaction timestamp +ALTER TABLE T ADD COLUMN c1 TIMESTAMP DEFAULT now(); + +SELECT comp(); + +-- clock_timestamp() is volatile +ALTER TABLE T ADD COLUMN c2 TIMESTAMP DEFAULT clock_timestamp(); + +SELECT comp(); + +DROP TABLE T; + +-- Simple querie +CREATE TABLE T (pk INT NOT NULL PRIMARY KEY); + +SELECT set('t'); + +INSERT INTO T SELECT * FROM generate_series(1, 10) a; + +ALTER TABLE T ADD COLUMN c_bigint BIGINT NOT NULL DEFAULT -1; + +INSERT INTO T SELECT b, b - 10 FROM generate_series(11, 20) a(b); + +ALTER TABLE T ADD COLUMN c_text TEXT DEFAULT 'hello'; + +INSERT INTO T SELECT b, b - 10, (b + 10)::text FROM generate_series(21, 30) a(b); + +-- WHERE clause +SELECT c_bigint, c_text FROM T WHERE c_bigint = -1 LIMIT 1; + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) +SELECT c_bigint, c_text FROM T WHERE c_bigint = -1 LIMIT 1; + +SELECT c_bigint, c_text FROM T WHERE c_text = 'hello' LIMIT 1; + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) SELECT c_bigint, c_text FROM T WHERE c_text = 'hello' LIMIT 1; + + +-- COALESCE +SELECT COALESCE(c_bigint, pk), COALESCE(c_text, pk::text) +FROM T +ORDER BY pk LIMIT 10; + +-- Aggregate function +SELECT SUM(c_bigint), MAX(c_text COLLATE "C" ), MIN(c_text COLLATE "C") FROM T; + +-- ORDER BY +SELECT * FROM T ORDER BY c_bigint, c_text, pk LIMIT 10; + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) +SELECT * FROM T ORDER BY c_bigint, c_text, pk LIMIT 10; + +-- LIMIT +SELECT * FROM T WHERE c_bigint > -1 ORDER BY c_bigint, c_text, pk LIMIT 10; + +EXPLAIN (VERBOSE TRUE, COSTS FALSE) +SELECT * FROM T WHERE c_bigint > -1 ORDER BY c_bigint, c_text, pk LIMIT 10; + +-- DELETE with RETURNING +DELETE FROM T WHERE pk BETWEEN 10 AND 20 RETURNING *; +EXPLAIN (VERBOSE TRUE, COSTS FALSE) +DELETE FROM T WHERE pk BETWEEN 10 AND 20 RETURNING *; + +-- UPDATE +UPDATE T SET c_text = '"' || c_text || '"' WHERE pk < 10; +SELECT * FROM T WHERE c_text LIKE '"%"' ORDER BY PK; + +SELECT comp(); + +DROP TABLE T; + + +-- Combine with other DDL +CREATE TABLE T(pk INT NOT NULL PRIMARY KEY); + +SELECT set('t'); + +INSERT INTO T VALUES (1), (2); + +ALTER TABLE T ADD COLUMN c_int INT NOT NULL DEFAULT -1; + +INSERT INTO T VALUES (3), (4); + +ALTER TABLE T ADD COLUMN c_text TEXT DEFAULT 'Hello'; + +INSERT INTO T VALUES (5), (6); + +ALTER TABLE T ALTER COLUMN c_text SET DEFAULT 'world', + ALTER COLUMN c_int SET DEFAULT 1; + +INSERT INTO T VALUES (7), (8); + +SELECT * FROM T ORDER BY pk; + +-- Add an index +CREATE INDEX i ON T(c_int, c_text); + +SELECT c_text FROM T WHERE c_int = -1; + +SELECT comp(); + +-- query to exercise expand_tuple function +CREATE TABLE t1 AS +SELECT 1::int AS a , 2::int AS b +FROM generate_series(1,20) q; + +ALTER TABLE t1 ADD COLUMN c text; + +SELECT a, + stddev(cast((SELECT sum(1) FROM generate_series(1,20) x) AS float4)) + OVER (PARTITION BY a,b,c ORDER BY b) + AS z +FROM t1; + +DROP TABLE T; + +-- test that we account for missing columns without defaults correctly +-- in expand_tuple, and that rows are correctly expanded for triggers + +CREATE FUNCTION test_trigger() +RETURNS trigger +LANGUAGE plpgsql +AS $$ + +begin + raise notice 'old tuple: %', to_json(OLD)::text; + if TG_OP = 'DELETE' + then + return OLD; + else + return NEW; + end if; +end; + +$$; + +-- 2 new columns, both have defaults +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,3); +ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4; +ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; +UPDATE t SET y = 2; +SELECT * FROM t; +DROP TABLE t; + +-- 2 new columns, first has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,3); +ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4; +ALTER TABLE t ADD COLUMN y int; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; +UPDATE t SET y = 2; +SELECT * FROM t; +DROP TABLE t; + +-- 2 new columns, second has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,3); +ALTER TABLE t ADD COLUMN x int; +ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; +UPDATE t SET y = 2; +SELECT * FROM t; +DROP TABLE t; + +-- 2 new columns, neither has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,3); +ALTER TABLE t ADD COLUMN x int; +ALTER TABLE t ADD COLUMN y int; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; +UPDATE t SET y = 2; +SELECT * FROM t; +DROP TABLE t; + +-- same as last 4 tests but here the last original column has a NULL value +-- 2 new columns, both have defaults +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,NULL); +ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4; +ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; +UPDATE t SET y = 2; +SELECT * FROM t; +DROP TABLE t; + +-- 2 new columns, first has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,NULL); +ALTER TABLE t ADD COLUMN x int NOT NULL DEFAULT 4; +ALTER TABLE t ADD COLUMN y int; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; +UPDATE t SET y = 2; +SELECT * FROM t; +DROP TABLE t; + +-- 2 new columns, second has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,NULL); +ALTER TABLE t ADD COLUMN x int; +ALTER TABLE t ADD COLUMN y int NOT NULL DEFAULT 5; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; +UPDATE t SET y = 2; +SELECT * FROM t; +DROP TABLE t; + +-- 2 new columns, neither has default +CREATE TABLE t (id serial PRIMARY KEY, a int, b int, c int); +INSERT INTO t (a,b,c) VALUES (1,2,NULL); +ALTER TABLE t ADD COLUMN x int; +ALTER TABLE t ADD COLUMN y int; +CREATE TRIGGER a BEFORE UPDATE ON t FOR EACH ROW EXECUTE PROCEDURE test_trigger(); +SELECT * FROM t; +UPDATE t SET y = 2; +SELECT * FROM t; +DROP TABLE t; + +-- make sure expanded tuple has correct self pointer +-- it will be required by the RI trigger doing the cascading delete + +CREATE TABLE leader (a int PRIMARY KEY, b int); +CREATE TABLE follower (a int REFERENCES leader ON DELETE CASCADE, b int); +INSERT INTO leader VALUES (1, 1), (2, 2); +ALTER TABLE leader ADD c int; +ALTER TABLE leader DROP c; +DELETE FROM leader; + +-- check that ALTER TABLE ... ALTER TYPE does the right thing + +CREATE TABLE vtype( a integer); +INSERT INTO vtype VALUES (1); +ALTER TABLE vtype ADD COLUMN b DOUBLE PRECISION DEFAULT 0.2; +ALTER TABLE vtype ADD COLUMN c BOOLEAN DEFAULT true; +SELECT * FROM vtype; +ALTER TABLE vtype + ALTER b TYPE text USING b::text, + ALTER c TYPE text USING c::text; +SELECT * FROM vtype; + +-- also check the case that doesn't rewrite the table + +CREATE TABLE vtype2 (a int); +INSERT INTO vtype2 VALUES (1); +ALTER TABLE vtype2 ADD COLUMN b varchar(10) DEFAULT 'xxx'; +ALTER TABLE vtype2 ALTER COLUMN b SET DEFAULT 'yyy'; +INSERT INTO vtype2 VALUES (2); + +ALTER TABLE vtype2 ALTER COLUMN b TYPE varchar(20) USING b::varchar(20); +SELECT * FROM vtype2; + + +-- Ensure that defaults are checked when evaluating whether HOT update +-- is possible, this was broken for a while: +-- https://postgr.es/m/20190202133521.ylauh3ckqa7colzj%40alap3.anarazel.de +BEGIN; +CREATE TABLE t(); +INSERT INTO t DEFAULT VALUES; +ALTER TABLE t ADD COLUMN a int DEFAULT 1; +CREATE INDEX ON t(a); +-- set column with a default 1 to NULL, due to a bug that wasn't +-- noticed has heap_getattr buggily returned NULL for default columns +UPDATE t SET a = NULL; + +-- verify that index and non-index scans show the same result +SET LOCAL enable_seqscan = true; +SELECT * FROM t WHERE a IS NULL; +SET LOCAL enable_seqscan = false; +SELECT * FROM t WHERE a IS NULL; +ROLLBACK; + +-- verify that a default set on a non-plain table doesn't set a missing +-- value on the attribute +CREATE FOREIGN DATA WRAPPER dummy; +CREATE SERVER s0 FOREIGN DATA WRAPPER dummy; +CREATE FOREIGN TABLE ft1 (c1 integer NOT NULL) SERVER s0; +ALTER FOREIGN TABLE ft1 ADD COLUMN c8 integer DEFAULT 0; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE char(10); +SELECT count(*) + FROM pg_attribute + WHERE attrelid = 'ft1'::regclass AND + (attmissingval IS NOT NULL OR atthasmissing); + +-- cleanup +DROP FOREIGN TABLE ft1; +DROP SERVER s0; +DROP FOREIGN DATA WRAPPER dummy; +DROP TABLE vtype; +DROP TABLE vtype2; +DROP TABLE follower; +DROP TABLE leader; +DROP FUNCTION test_trigger(); +DROP TABLE t1; +DROP FUNCTION set(name); +DROP FUNCTION comp(); +DROP TABLE m; +DROP TABLE has_volatile; +DROP EVENT TRIGGER has_volatile_rewrite; +DROP FUNCTION log_rewrite; +DROP SCHEMA fast_default; + +-- Leave a table with an active fast default in place, for pg_upgrade testing +set search_path = public; +create table has_fast_default(f1 int); +insert into has_fast_default values(1); +alter table has_fast_default add column f2 int default 42; +table has_fast_default; diff --git a/src/test/singlenode_regress/sql/float4.sql b/src/test/singlenode_regress/sql/float4.sql new file mode 100644 index 00000000000..612486ecbd2 --- /dev/null +++ b/src/test/singlenode_regress/sql/float4.sql @@ -0,0 +1,354 @@ +-- +-- FLOAT4 +-- + +CREATE TABLE FLOAT4_TBL (f1 float4); + +INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 '); +INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 '); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20'); + +-- test for over and under flow +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'); + +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8); +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8); +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8); +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8); + +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400'); + +-- bad input +INSERT INTO FLOAT4_TBL(f1) VALUES (''); +INSERT INTO FLOAT4_TBL(f1) VALUES (' '); +INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0'); +INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0'); +INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5'); + +-- special inputs +SELECT 'NaN'::float4; +SELECT 'nan'::float4; +SELECT ' NAN '::float4; +SELECT 'infinity'::float4; +SELECT ' -INFINiTY '::float4; +-- bad special inputs +SELECT 'N A N'::float4; +SELECT 'NaN x'::float4; +SELECT ' INFINITY x'::float4; + +SELECT 'Infinity'::float4 + 100.0; +SELECT 'Infinity'::float4 / 'Infinity'::float4; +SELECT '42'::float4 / 'Infinity'::float4; +SELECT 'nan'::float4 / 'nan'::float4; +SELECT 'nan'::float4 / '0'::float4; +SELECT 'nan'::numeric::float4; + +SELECT * FROM FLOAT4_TBL; + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3'; + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3'; + +SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1; + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3'; + +SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1; + +SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3'; + +SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + +SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + +SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + +SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f + WHERE f.f1 > '0.0'; + +-- test divide by zero +SELECT f.f1 / '0.0' from FLOAT4_TBL f; + +SELECT * FROM FLOAT4_TBL; + +-- test the unary float4abs operator +SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f; + +UPDATE FLOAT4_TBL + SET f1 = FLOAT4_TBL.f1 * '-1' + WHERE FLOAT4_TBL.f1 > '0.0'; + +SELECT * FROM FLOAT4_TBL; + +-- test edge-case coercions to integer +SELECT '32767.4'::float4::int2; +SELECT '32767.6'::float4::int2; +SELECT '-32768.4'::float4::int2; +SELECT '-32768.6'::float4::int2; +SELECT '2147483520'::float4::int4; +SELECT '2147483647'::float4::int4; +SELECT '-2147483648.5'::float4::int4; +SELECT '-2147483900'::float4::int4; +SELECT '9223369837831520256'::float4::int8; +SELECT '9223372036854775807'::float4::int8; +SELECT '-9223372036854775808.5'::float4::int8; +SELECT '-9223380000000000000'::float4::int8; + +-- Test for correct input rounding in edge cases. +-- These lists are from Paxson 1991, excluding subnormals and +-- inputs of over 9 sig. digits. + +SELECT float4send('5e-20'::float4); +SELECT float4send('67e14'::float4); +SELECT float4send('985e15'::float4); +SELECT float4send('55895e-16'::float4); +SELECT float4send('7038531e-32'::float4); +SELECT float4send('702990899e-20'::float4); + +SELECT float4send('3e-23'::float4); +SELECT float4send('57e18'::float4); +SELECT float4send('789e-35'::float4); +SELECT float4send('2539e-18'::float4); +SELECT float4send('76173e28'::float4); +SELECT float4send('887745e-11'::float4); +SELECT float4send('5382571e-37'::float4); +SELECT float4send('82381273e-35'::float4); +SELECT float4send('750486563e-38'::float4); + +-- Test that the smallest possible normalized input value inputs +-- correctly, either in 9-significant-digit or shortest-decimal +-- format. +-- +-- exact val is 1.1754943508... +-- shortest val is 1.1754944000 +-- midpoint to next val is 1.1754944208... + +SELECT float4send('1.17549435e-38'::float4); +SELECT float4send('1.1754944e-38'::float4); + +-- test output (and round-trip safety) of various values. +-- To ensure we're testing what we think we're testing, start with +-- float values specified by bit patterns (as a useful side effect, +-- this means we'll fail on non-IEEE platforms). + +create type xfloat4; +create function xfloat4in(cstring) returns xfloat4 immutable strict + language internal as 'int4in'; +create function xfloat4out(xfloat4) returns cstring immutable strict + language internal as 'int4out'; +create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4); +create cast (xfloat4 as float4) without function; +create cast (float4 as xfloat4) without function; +create cast (xfloat4 as integer) without function; +create cast (integer as xfloat4) without function; + +-- float4: seeeeeee emmmmmmm mmmmmmmm mmmmmmmm + +-- we don't care to assume the platform's strtod() handles subnormals +-- correctly; those are "use at your own risk". However we do test +-- subnormal outputs, since those are under our control. + +with testdata(bits) as (values + -- small subnormals + (x'00000001'), + (x'00000002'), (x'00000003'), + (x'00000010'), (x'00000011'), (x'00000100'), (x'00000101'), + (x'00004000'), (x'00004001'), (x'00080000'), (x'00080001'), + -- stress values + (x'0053c4f4'), -- 7693e-42 + (x'006c85c4'), -- 996622e-44 + (x'0041ca76'), -- 60419369e-46 + (x'004b7678'), -- 6930161142e-48 + -- taken from upstream testsuite + (x'00000007'), + (x'00424fe2'), + -- borderline between subnormal and normal + (x'007ffff0'), (x'007ffff1'), (x'007ffffe'), (x'007fffff')) +select float4send(flt) as ibits, + flt + from (select bits::integer::xfloat4::float4 as flt + from testdata + offset 0) s; + +with testdata(bits) as (values + (x'00000000'), + -- smallest normal values + (x'00800000'), (x'00800001'), (x'00800004'), (x'00800005'), + (x'00800006'), + -- small normal values chosen for short vs. long output + (x'008002f1'), (x'008002f2'), (x'008002f3'), + (x'00800e17'), (x'00800e18'), (x'00800e19'), + -- assorted values (random mantissae) + (x'01000001'), (x'01102843'), (x'01a52c98'), + (x'0219c229'), (x'02e4464d'), (x'037343c1'), (x'03a91b36'), + (x'047ada65'), (x'0496fe87'), (x'0550844f'), (x'05999da3'), + (x'060ea5e2'), (x'06e63c45'), (x'07f1e548'), (x'0fc5282b'), + (x'1f850283'), (x'2874a9d6'), + -- values around 5e-08 + (x'3356bf94'), (x'3356bf95'), (x'3356bf96'), + -- around 1e-07 + (x'33d6bf94'), (x'33d6bf95'), (x'33d6bf96'), + -- around 3e-07 .. 1e-04 + (x'34a10faf'), (x'34a10fb0'), (x'34a10fb1'), + (x'350637bc'), (x'350637bd'), (x'350637be'), + (x'35719786'), (x'35719787'), (x'35719788'), + (x'358637bc'), (x'358637bd'), (x'358637be'), + (x'36a7c5ab'), (x'36a7c5ac'), (x'36a7c5ad'), + (x'3727c5ab'), (x'3727c5ac'), (x'3727c5ad'), + -- format crossover at 1e-04 + (x'38d1b714'), (x'38d1b715'), (x'38d1b716'), + (x'38d1b717'), (x'38d1b718'), (x'38d1b719'), + (x'38d1b71a'), (x'38d1b71b'), (x'38d1b71c'), + (x'38d1b71d'), + -- + (x'38dffffe'), (x'38dfffff'), (x'38e00000'), + (x'38efffff'), (x'38f00000'), (x'38f00001'), + (x'3a83126e'), (x'3a83126f'), (x'3a831270'), + (x'3c23d709'), (x'3c23d70a'), (x'3c23d70b'), + (x'3dcccccc'), (x'3dcccccd'), (x'3dccccce'), + -- chosen to need 9 digits for 3dcccd70 + (x'3dcccd6f'), (x'3dcccd70'), (x'3dcccd71'), + -- + (x'3effffff'), (x'3f000000'), (x'3f000001'), + (x'3f333332'), (x'3f333333'), (x'3f333334'), + -- approach 1.0 with increasing numbers of 9s + (x'3f666665'), (x'3f666666'), (x'3f666667'), + (x'3f7d70a3'), (x'3f7d70a4'), (x'3f7d70a5'), + (x'3f7fbe76'), (x'3f7fbe77'), (x'3f7fbe78'), + (x'3f7ff971'), (x'3f7ff972'), (x'3f7ff973'), + (x'3f7fff57'), (x'3f7fff58'), (x'3f7fff59'), + (x'3f7fffee'), (x'3f7fffef'), + -- values very close to 1 + (x'3f7ffff0'), (x'3f7ffff1'), (x'3f7ffff2'), + (x'3f7ffff3'), (x'3f7ffff4'), (x'3f7ffff5'), + (x'3f7ffff6'), (x'3f7ffff7'), (x'3f7ffff8'), + (x'3f7ffff9'), (x'3f7ffffa'), (x'3f7ffffb'), + (x'3f7ffffc'), (x'3f7ffffd'), (x'3f7ffffe'), + (x'3f7fffff'), + (x'3f800000'), + (x'3f800001'), (x'3f800002'), (x'3f800003'), + (x'3f800004'), (x'3f800005'), (x'3f800006'), + (x'3f800007'), (x'3f800008'), (x'3f800009'), + -- values 1 to 1.1 + (x'3f80000f'), (x'3f800010'), (x'3f800011'), + (x'3f800012'), (x'3f800013'), (x'3f800014'), + (x'3f800017'), (x'3f800018'), (x'3f800019'), + (x'3f80001a'), (x'3f80001b'), (x'3f80001c'), + (x'3f800029'), (x'3f80002a'), (x'3f80002b'), + (x'3f800053'), (x'3f800054'), (x'3f800055'), + (x'3f800346'), (x'3f800347'), (x'3f800348'), + (x'3f8020c4'), (x'3f8020c5'), (x'3f8020c6'), + (x'3f8147ad'), (x'3f8147ae'), (x'3f8147af'), + (x'3f8ccccc'), (x'3f8ccccd'), (x'3f8cccce'), + -- + (x'3fc90fdb'), -- pi/2 + (x'402df854'), -- e + (x'40490fdb'), -- pi + -- + (x'409fffff'), (x'40a00000'), (x'40a00001'), + (x'40afffff'), (x'40b00000'), (x'40b00001'), + (x'411fffff'), (x'41200000'), (x'41200001'), + (x'42c7ffff'), (x'42c80000'), (x'42c80001'), + (x'4479ffff'), (x'447a0000'), (x'447a0001'), + (x'461c3fff'), (x'461c4000'), (x'461c4001'), + (x'47c34fff'), (x'47c35000'), (x'47c35001'), + (x'497423ff'), (x'49742400'), (x'49742401'), + (x'4b18967f'), (x'4b189680'), (x'4b189681'), + (x'4cbebc1f'), (x'4cbebc20'), (x'4cbebc21'), + (x'4e6e6b27'), (x'4e6e6b28'), (x'4e6e6b29'), + (x'501502f8'), (x'501502f9'), (x'501502fa'), + (x'51ba43b6'), (x'51ba43b7'), (x'51ba43b8'), + -- stress values + (x'1f6c1e4a'), -- 5e-20 + (x'59be6cea'), -- 67e14 + (x'5d5ab6c4'), -- 985e15 + (x'2cc4a9bd'), -- 55895e-16 + (x'15ae43fd'), -- 7038531e-32 + (x'2cf757ca'), -- 702990899e-20 + (x'665ba998'), -- 25933168707e13 + (x'743c3324'), -- 596428896559e20 + -- exercise fixed-point memmoves + (x'47f1205a'), + (x'4640e6ae'), + (x'449a5225'), + (x'42f6e9d5'), + (x'414587dd'), + (x'3f9e064b'), + -- these cases come from the upstream's testsuite + -- BoundaryRoundEven + (x'4c000004'), + (x'50061c46'), + (x'510006a8'), + -- ExactValueRoundEven + (x'48951f84'), + (x'45fd1840'), + -- LotsOfTrailingZeros + (x'39800000'), + (x'3b200000'), + (x'3b900000'), + (x'3bd00000'), + -- Regression + (x'63800000'), + (x'4b000000'), + (x'4b800000'), + (x'4c000001'), + (x'4c800b0d'), + (x'00d24584'), + (x'00d90b88'), + (x'45803f34'), + (x'4f9f24f7'), + (x'3a8722c3'), + (x'5c800041'), + (x'15ae43fd'), + (x'5d4cccfb'), + (x'4c800001'), + (x'57800ed8'), + (x'5f000000'), + (x'700000f0'), + (x'5f23e9ac'), + (x'5e9502f9'), + (x'5e8012b1'), + (x'3c000028'), + (x'60cde861'), + (x'03aa2a50'), + (x'43480000'), + (x'4c000000'), + -- LooksLikePow5 + (x'5D1502F9'), + (x'5D9502F9'), + (x'5E1502F9'), + -- OutputLength + (x'3f99999a'), + (x'3f9d70a4'), + (x'3f9df3b6'), + (x'3f9e0419'), + (x'3f9e0610'), + (x'3f9e064b'), + (x'3f9e0651'), + (x'03d20cfe') +) +select float4send(flt) as ibits, + flt, + flt::text::float4 as r_flt, + float4send(flt::text::float4) as obits, + float4send(flt::text::float4) = float4send(flt) as correct + from (select bits::integer::xfloat4::float4 as flt + from testdata + offset 0) s; + +-- clean up, lest opr_sanity complain +drop type xfloat4 cascade; diff --git a/src/test/singlenode_regress/sql/float8.sql b/src/test/singlenode_regress/sql/float8.sql new file mode 100644 index 00000000000..a2641baddc6 --- /dev/null +++ b/src/test/singlenode_regress/sql/float8.sql @@ -0,0 +1,591 @@ +-- +-- FLOAT8 +-- + +CREATE TABLE FLOAT8_TBL(i INT DEFAULT 1, f1 float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 '); +INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 '); +INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200'); + +-- test for underflow and overflow handling +SELECT '10e400'::float8; +SELECT '-10e400'::float8; +SELECT '1e309'::float8; +SELECT '10e-400'::float8; +SELECT '-10e-400'::float8; +SELECT '1e-324'::float8; +SELECT '1e308'::float8; +SELECT '1e-323'::float8; +SELECT '0.0'::float8; + +-- test smallest normalized input +SELECT float8send('2.2250738585072014E-308'::float8); + +-- bad input +INSERT INTO FLOAT8_TBL(f1) VALUES (''); +INSERT INTO FLOAT8_TBL(f1) VALUES (' '); +INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0'); +INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3'); +INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5'); + +-- special inputs +SELECT 'NaN'::float8; +SELECT 'nan'::float8; +SELECT ' NAN '::float8; +SELECT 'infinity'::float8; +SELECT 'inf'::float8; +SELECT ' -INFINiTY '::float8; +SELECT '+Infinity'::float8; +SELECT '+INF'::float8; +SELECT '+inf'::float8; +SELECT '+INFINITY'::float8; + +-- bad special inputs +SELECT 'N A N'::float8; +SELECT 'NaN x'::float8; +SELECT ' INFINITY x'::float8; + +SELECT 'Infinity'::float8 + 100.0; +SELECT 'Infinity'::float8 / 'Infinity'::float8; +SELECT '42'::float8 / 'Infinity'::float8; +SELECT 'nan'::float8 / 'nan'::float8; +SELECT 'nan'::float8 / '0'::float8; +SELECT 'nan'::numeric::float8; + +SELECT f1 FROM FLOAT8_TBL; + +SELECT f.f1 FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3'; + +SELECT f.f1 FROM FLOAT8_TBL f WHERE f.f1 = '1004.3'; + +SELECT f.f1 FROM FLOAT8_TBL f WHERE '1004.3' > f.f1; + +SELECT f.f1 FROM FLOAT8_TBL f WHERE f.f1 < '1004.3'; + +SELECT f.f1 FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1; + +SELECT f.f1 FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3'; + +SELECT f.f1, f.f1 * '-10' AS x + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + +SELECT f.f1, f.f1 + '-10' AS x + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + +SELECT f.f1, f.f1 / '-10' AS x + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + +SELECT f.f1, f.f1 - '-10' AS x + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + +SELECT f.f1 ^ '2.0' AS square_f1 + FROM FLOAT8_TBL f where f.f1 = '1004.3'; + +-- absolute value +SELECT f.f1, @f.f1 AS abs_f1 + FROM FLOAT8_TBL f; + +-- truncate +SELECT f.f1, trunc(f.f1) AS trunc_f1 + FROM FLOAT8_TBL f; + +-- round +SELECT f.f1, round(f.f1) AS round_f1 + FROM FLOAT8_TBL f; + +-- ceil / ceiling +select ceil(f1) as ceil_f1 from float8_tbl f; +select ceiling(f1) as ceiling_f1 from float8_tbl f; + +-- floor +select floor(f1) as floor_f1 from float8_tbl f; + +-- sign +select sign(f1) as sign_f1 from float8_tbl f; + +-- avoid bit-exact output here because operations may not be bit-exact. +SET extra_float_digits = 0; + +-- square root +SELECT sqrt(float8 '64') AS eight; + +SELECT |/ float8 '64' AS eight; + +SELECT f.f1, |/f.f1 AS sqrt_f1 + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + +-- power +SELECT power(float8 '144', float8 '0.5'); +SELECT power(float8 'NaN', float8 '0.5'); +SELECT power(float8 '144', float8 'NaN'); +SELECT power(float8 'NaN', float8 'NaN'); +SELECT power(float8 '-1', float8 'NaN'); +SELECT power(float8 '1', float8 'NaN'); +SELECT power(float8 'NaN', float8 '0'); +SELECT power(float8 'inf', float8 '0'); +SELECT power(float8 '-inf', float8 '0'); +SELECT power(float8 '0', float8 'inf'); +SELECT power(float8 '0', float8 '-inf'); +SELECT power(float8 '1', float8 'inf'); +SELECT power(float8 '1', float8 '-inf'); +SELECT power(float8 '-1', float8 'inf'); +SELECT power(float8 '-1', float8 '-inf'); +SELECT power(float8 '0.1', float8 'inf'); +SELECT power(float8 '-0.1', float8 'inf'); +SELECT power(float8 '1.1', float8 'inf'); +SELECT power(float8 '-1.1', float8 'inf'); +SELECT power(float8 '0.1', float8 '-inf'); +SELECT power(float8 '-0.1', float8 '-inf'); +SELECT power(float8 '1.1', float8 '-inf'); +SELECT power(float8 '-1.1', float8 '-inf'); +SELECT power(float8 'inf', float8 '-2'); +SELECT power(float8 'inf', float8 '2'); +SELECT power(float8 'inf', float8 'inf'); +SELECT power(float8 'inf', float8 '-inf'); +-- Intel's icc misoptimizes the code that controls the sign of this result, +-- even with -mp1. Pending a fix for that, only test for "is it zero". +SELECT power(float8 '-inf', float8 '-2') = '0'; +SELECT power(float8 '-inf', float8 '-3'); +SELECT power(float8 '-inf', float8 '2'); +SELECT power(float8 '-inf', float8 '3'); +SELECT power(float8 '-inf', float8 '3.5'); +SELECT power(float8 '-inf', float8 'inf'); +SELECT power(float8 '-inf', float8 '-inf'); + +-- take exp of ln(f.f1) +SELECT f.f1, exp(ln(f.f1)) AS exp_ln_f1 + FROM FLOAT8_TBL f + WHERE f.f1 > '0.0'; + +-- check edge cases for exp +SELECT exp('inf'::float8), exp('-inf'::float8), exp('nan'::float8); + +-- cube root +SELECT ||/ float8 '27' AS three; + +SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f; + + +SELECT f1 FROM FLOAT8_TBL; + +UPDATE FLOAT8_TBL + SET f1 = FLOAT8_TBL.f1 * '-1' + WHERE FLOAT8_TBL.f1 > '0.0'; + +SELECT f.f1 * '1e200' from FLOAT8_TBL f; + +SELECT f.f1 ^ '1e200' from FLOAT8_TBL f; + +SELECT 0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5; + +SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ; + +SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ; + +SELECT exp(f.f1) from FLOAT8_TBL f; + +SELECT f.f1 / '0.0' from FLOAT8_TBL f; + +SELECT f1 FROM FLOAT8_TBL; + +-- hyperbolic functions +-- we run these with extra_float_digits = 0 too, since different platforms +-- tend to produce results that vary in the last place. +SELECT sinh(float8 '1'); +SELECT cosh(float8 '1'); +SELECT tanh(float8 '1'); +SELECT asinh(float8 '1'); +SELECT acosh(float8 '2'); +SELECT atanh(float8 '0.5'); +-- test Inf/NaN cases for hyperbolic functions +SELECT sinh(float8 'infinity'); +SELECT sinh(float8 '-infinity'); +SELECT sinh(float8 'nan'); +SELECT cosh(float8 'infinity'); +SELECT cosh(float8 '-infinity'); +SELECT cosh(float8 'nan'); +SELECT tanh(float8 'infinity'); +SELECT tanh(float8 '-infinity'); +SELECT tanh(float8 'nan'); +SELECT asinh(float8 'infinity'); +SELECT asinh(float8 '-infinity'); +SELECT asinh(float8 'nan'); +-- acosh(Inf) should be Inf, but some mingw versions produce NaN, so skip test +-- SELECT acosh(float8 'infinity'); +SELECT acosh(float8 '-infinity'); +SELECT acosh(float8 'nan'); +SELECT atanh(float8 'infinity'); +SELECT atanh(float8 '-infinity'); +SELECT atanh(float8 'nan'); + +RESET extra_float_digits; + +-- test for over- and underflow +INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('1e309'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('1e-324'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('1e308'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('1e-323'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('+INFINITY'::float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('+InFiNiTY'::float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('+Inf'::float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-INFINITY'::float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-InFiNiTY'::float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-Inf'::float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('NaN'::float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('+naN'::float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-naN'::float8); + +-- test for over- and underflow with update statement +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e-324'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e309'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e-400'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='1e400'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='0.0'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='+INFINITY'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='+InFiNiTY'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='+Inf'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='-INFINITY'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='-Inf'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='NaN'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='+naN'::float8; + +UPDATE FLOAT8_TBL SET f1='0.0'::float8 WHERE f1='-naN'::float8; + +-- test for over- and underflow with delete statement +DELETE FROM FLOAT8_TBL WHERE f1='1e-324'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='1e309'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='1e400'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='1e-400'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='0.0'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='+INFINITY'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='+InFiNiTY'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='+Inf'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='-INFINITY'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='-Inf'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='-naN'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='+naN'::float8; + +DELETE FROM FLOAT8_TBL WHERE f1='NaN'::float8; + +-- maintain external table consistency across platforms +-- delete all values and reinsert well-behaved ones + +DELETE FROM FLOAT8_TBL; + +INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200'); + +INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200'); + +SELECT f1 FROM FLOAT8_TBL; + +-- test edge-case coercions to integer +SELECT '32767.4'::float8::int2; +SELECT '32767.6'::float8::int2; +SELECT '-32768.4'::float8::int2; +SELECT '-32768.6'::float8::int2; +SELECT '2147483647.4'::float8::int4; +SELECT '2147483647.6'::float8::int4; +SELECT '-2147483648.4'::float8::int4; +SELECT '-2147483648.6'::float8::int4; +SELECT '9223372036854773760'::float8::int8; +SELECT '9223372036854775807'::float8::int8; +SELECT '-9223372036854775808.5'::float8::int8; +SELECT '-9223372036854780000'::float8::int8; + +-- test exact cases for trigonometric functions in degrees + +SELECT x, + sind(x), + sind(x) IN (-1,-0.5,0,0.5,1) AS sind_exact +FROM (VALUES (0), (30), (90), (150), (180), + (210), (270), (330), (360)) AS t(x); + +SELECT x, + cosd(x), + cosd(x) IN (-1,-0.5,0,0.5,1) AS cosd_exact +FROM (VALUES (0), (60), (90), (120), (180), + (240), (270), (300), (360)) AS t(x); + +SELECT x, + tand(x), + tand(x) IN ('-Infinity'::float8,-1,0, + 1,'Infinity'::float8) AS tand_exact, + cotd(x), + cotd(x) IN ('-Infinity'::float8,-1,0, + 1,'Infinity'::float8) AS cotd_exact +FROM (VALUES (0), (45), (90), (135), (180), + (225), (270), (315), (360)) AS t(x); + +SELECT x, + asind(x), + asind(x) IN (-90,-30,0,30,90) AS asind_exact, + acosd(x), + acosd(x) IN (0,60,90,120,180) AS acosd_exact +FROM (VALUES (-1), (-0.5), (0), (0.5), (1)) AS t(x); + +SELECT x, + atand(x), + atand(x) IN (-90,-45,0,45,90) AS atand_exact +FROM (VALUES ('-Infinity'::float8), (-1), (0), (1), + ('Infinity'::float8)) AS t(x); + +SELECT x, y, + atan2d(y, x), + atan2d(y, x) IN (-90,0,90,180) AS atan2d_exact +FROM (SELECT 10*cosd(a), 10*sind(a) + FROM generate_series(0, 360, 90) AS t(a)) AS t(x,y); + +-- +-- test output (and round-trip safety) of various values. +-- To ensure we're testing what we think we're testing, start with +-- float values specified by bit patterns (as a useful side effect, +-- this means we'll fail on non-IEEE platforms). + +create type xfloat8; +create function xfloat8in(cstring) returns xfloat8 immutable strict + language internal as 'int8in'; +create function xfloat8out(xfloat8) returns cstring immutable strict + language internal as 'int8out'; +create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8); +create cast (xfloat8 as float8) without function; +create cast (float8 as xfloat8) without function; +create cast (xfloat8 as bigint) without function; +create cast (bigint as xfloat8) without function; + +-- float8: seeeeeee eeeeeeee eeeeeeee mmmmmmmm mmmmmmmm(x4) + +-- we don't care to assume the platform's strtod() handles subnormals +-- correctly; those are "use at your own risk". However we do test +-- subnormal outputs, since those are under our control. + +with testdata(bits) as (values + -- small subnormals + (x'0000000000000001'), + (x'0000000000000002'), (x'0000000000000003'), + (x'0000000000001000'), (x'0000000100000000'), + (x'0000010000000000'), (x'0000010100000000'), + (x'0000400000000000'), (x'0000400100000000'), + (x'0000800000000000'), (x'0000800000000001'), + -- these values taken from upstream testsuite + (x'00000000000f4240'), + (x'00000000016e3600'), + (x'0000008cdcdea440'), + -- borderline between subnormal and normal + (x'000ffffffffffff0'), (x'000ffffffffffff1'), + (x'000ffffffffffffe'), (x'000fffffffffffff')) +select float8send(flt) as ibits, + flt + from (select bits::bigint::xfloat8::float8 as flt + from testdata + offset 0) s; + +-- round-trip tests + +with testdata(bits) as (values + (x'0000000000000000'), + -- smallest normal values + (x'0010000000000000'), (x'0010000000000001'), + (x'0010000000000002'), (x'0018000000000000'), + -- + (x'3ddb7cdfd9d7bdba'), (x'3ddb7cdfd9d7bdbb'), (x'3ddb7cdfd9d7bdbc'), + (x'3e112e0be826d694'), (x'3e112e0be826d695'), (x'3e112e0be826d696'), + (x'3e45798ee2308c39'), (x'3e45798ee2308c3a'), (x'3e45798ee2308c3b'), + (x'3e7ad7f29abcaf47'), (x'3e7ad7f29abcaf48'), (x'3e7ad7f29abcaf49'), + (x'3eb0c6f7a0b5ed8c'), (x'3eb0c6f7a0b5ed8d'), (x'3eb0c6f7a0b5ed8e'), + (x'3ee4f8b588e368ef'), (x'3ee4f8b588e368f0'), (x'3ee4f8b588e368f1'), + (x'3f1a36e2eb1c432c'), (x'3f1a36e2eb1c432d'), (x'3f1a36e2eb1c432e'), + (x'3f50624dd2f1a9fb'), (x'3f50624dd2f1a9fc'), (x'3f50624dd2f1a9fd'), + (x'3f847ae147ae147a'), (x'3f847ae147ae147b'), (x'3f847ae147ae147c'), + (x'3fb9999999999999'), (x'3fb999999999999a'), (x'3fb999999999999b'), + -- values very close to 1 + (x'3feffffffffffff0'), (x'3feffffffffffff1'), (x'3feffffffffffff2'), + (x'3feffffffffffff3'), (x'3feffffffffffff4'), (x'3feffffffffffff5'), + (x'3feffffffffffff6'), (x'3feffffffffffff7'), (x'3feffffffffffff8'), + (x'3feffffffffffff9'), (x'3feffffffffffffa'), (x'3feffffffffffffb'), + (x'3feffffffffffffc'), (x'3feffffffffffffd'), (x'3feffffffffffffe'), + (x'3fefffffffffffff'), + (x'3ff0000000000000'), + (x'3ff0000000000001'), (x'3ff0000000000002'), (x'3ff0000000000003'), + (x'3ff0000000000004'), (x'3ff0000000000005'), (x'3ff0000000000006'), + (x'3ff0000000000007'), (x'3ff0000000000008'), (x'3ff0000000000009'), + -- + (x'3ff921fb54442d18'), + (x'4005bf0a8b14576a'), + (x'400921fb54442d18'), + -- + (x'4023ffffffffffff'), (x'4024000000000000'), (x'4024000000000001'), + (x'4058ffffffffffff'), (x'4059000000000000'), (x'4059000000000001'), + (x'408f3fffffffffff'), (x'408f400000000000'), (x'408f400000000001'), + (x'40c387ffffffffff'), (x'40c3880000000000'), (x'40c3880000000001'), + (x'40f869ffffffffff'), (x'40f86a0000000000'), (x'40f86a0000000001'), + (x'412e847fffffffff'), (x'412e848000000000'), (x'412e848000000001'), + (x'416312cfffffffff'), (x'416312d000000000'), (x'416312d000000001'), + (x'4197d783ffffffff'), (x'4197d78400000000'), (x'4197d78400000001'), + (x'41cdcd64ffffffff'), (x'41cdcd6500000000'), (x'41cdcd6500000001'), + (x'4202a05f1fffffff'), (x'4202a05f20000000'), (x'4202a05f20000001'), + (x'42374876e7ffffff'), (x'42374876e8000000'), (x'42374876e8000001'), + (x'426d1a94a1ffffff'), (x'426d1a94a2000000'), (x'426d1a94a2000001'), + (x'42a2309ce53fffff'), (x'42a2309ce5400000'), (x'42a2309ce5400001'), + (x'42d6bcc41e8fffff'), (x'42d6bcc41e900000'), (x'42d6bcc41e900001'), + (x'430c6bf52633ffff'), (x'430c6bf526340000'), (x'430c6bf526340001'), + (x'4341c37937e07fff'), (x'4341c37937e08000'), (x'4341c37937e08001'), + (x'4376345785d89fff'), (x'4376345785d8a000'), (x'4376345785d8a001'), + (x'43abc16d674ec7ff'), (x'43abc16d674ec800'), (x'43abc16d674ec801'), + (x'43e158e460913cff'), (x'43e158e460913d00'), (x'43e158e460913d01'), + (x'4415af1d78b58c3f'), (x'4415af1d78b58c40'), (x'4415af1d78b58c41'), + (x'444b1ae4d6e2ef4f'), (x'444b1ae4d6e2ef50'), (x'444b1ae4d6e2ef51'), + (x'4480f0cf064dd591'), (x'4480f0cf064dd592'), (x'4480f0cf064dd593'), + (x'44b52d02c7e14af5'), (x'44b52d02c7e14af6'), (x'44b52d02c7e14af7'), + (x'44ea784379d99db3'), (x'44ea784379d99db4'), (x'44ea784379d99db5'), + (x'45208b2a2c280290'), (x'45208b2a2c280291'), (x'45208b2a2c280292'), + -- + (x'7feffffffffffffe'), (x'7fefffffffffffff'), + -- round to even tests (+ve) + (x'4350000000000002'), + (x'4350000000002e06'), + (x'4352000000000003'), + (x'4352000000000004'), + (x'4358000000000003'), + (x'4358000000000004'), + (x'435f000000000020'), + -- round to even tests (-ve) + (x'c350000000000002'), + (x'c350000000002e06'), + (x'c352000000000003'), + (x'c352000000000004'), + (x'c358000000000003'), + (x'c358000000000004'), + (x'c35f000000000020'), + -- exercise fixed-point memmoves + (x'42dc12218377de66'), + (x'42a674e79c5fe51f'), + (x'4271f71fb04cb74c'), + (x'423cbe991a145879'), + (x'4206fee0e1a9e061'), + (x'41d26580b487e6b4'), + (x'419d6f34540ca453'), + (x'41678c29dcd6e9dc'), + (x'4132d687e3df217d'), + (x'40fe240c9fcb68c8'), + (x'40c81cd6e63c53d3'), + (x'40934a4584fd0fdc'), + (x'405edd3c07fb4c93'), + (x'4028b0fcd32f7076'), + (x'3ff3c0ca428c59f8'), + -- these cases come from the upstream's testsuite + -- LotsOfTrailingZeros) + (x'3e60000000000000'), + -- Regression + (x'c352bd2668e077c4'), + (x'434018601510c000'), + (x'43d055dc36f24000'), + (x'43e052961c6f8000'), + (x'3ff3c0ca2a5b1d5d'), + -- LooksLikePow5 + (x'4830f0cf064dd592'), + (x'4840f0cf064dd592'), + (x'4850f0cf064dd592'), + -- OutputLength + (x'3ff3333333333333'), + (x'3ff3ae147ae147ae'), + (x'3ff3be76c8b43958'), + (x'3ff3c083126e978d'), + (x'3ff3c0c1fc8f3238'), + (x'3ff3c0c9539b8887'), + (x'3ff3c0ca2a5b1d5d'), + (x'3ff3c0ca4283de1b'), + (x'3ff3c0ca43db770a'), + (x'3ff3c0ca428abd53'), + (x'3ff3c0ca428c1d2b'), + (x'3ff3c0ca428c51f2'), + (x'3ff3c0ca428c58fc'), + (x'3ff3c0ca428c59dd'), + (x'3ff3c0ca428c59f8'), + (x'3ff3c0ca428c59fb'), + -- 32-bit chunking + (x'40112e0be8047a7d'), + (x'40112e0be815a889'), + (x'40112e0be826d695'), + (x'40112e0be83804a1'), + (x'40112e0be84932ad'), + -- MinMaxShift + (x'0040000000000000'), + (x'007fffffffffffff'), + (x'0290000000000000'), + (x'029fffffffffffff'), + (x'4350000000000000'), + (x'435fffffffffffff'), + (x'1330000000000000'), + (x'133fffffffffffff'), + (x'3a6fa7161a4d6e0c') +) +select float8send(flt) as ibits, + flt, + flt::text::float8 as r_flt, + float8send(flt::text::float8) as obits, + float8send(flt::text::float8) = float8send(flt) as correct + from (select bits::bigint::xfloat8::float8 as flt + from testdata + offset 0) s; + +-- clean up, lest opr_sanity complain +drop type xfloat8 cascade; diff --git a/src/test/singlenode_regress/sql/foreign_data.sql b/src/test/singlenode_regress/sql/foreign_data.sql new file mode 100644 index 00000000000..d9cb50d3a90 --- /dev/null +++ b/src/test/singlenode_regress/sql/foreign_data.sql @@ -0,0 +1,892 @@ +-- +-- Test foreign-data wrapper and server management. +-- + +-- In GPDB, there are a couple of special built-in objects, to handle +-- backwards-compatibility with external tables. They are the FDW called +-- 'gp_exttable_fdw', foreign server 'gp_exttable_server'. We don't want those +-- to appear in the test output, to keep the expected output unchanged from +-- upstream, as much as possible. The queries on the pg_foreign_* catalog +-- tables, and the \dew and \des commands, have been modified to exclude them. +-- +-- There's no way to match everything that does *not* contain a string in a \d +-- pattern, so we use a pattern that is close enough for our purposes: This +-- pattern includes everything that begins with a letter other than 'p', and +-- also including everything that begins with 'p' followed by any other letter +-- but 'g' (the 2nd rule is needed to include the 'postgresql' FDW used in the +-- test). +\set NO_BUILTINS ([a-fh-z]?*)|(g[a-oq-z]?*) +-- Clean up in case a prior regression run failed + +-- Suppress NOTICE messages when roles don't exist +SET client_min_messages TO 'warning'; + +DROP ROLE IF EXISTS regress_foreign_data_user, regress_test_role, regress_test_role2, regress_test_role_super, regress_test_indirect, regress_unprivileged_role; + +RESET client_min_messages; + +CREATE ROLE regress_foreign_data_user LOGIN SUPERUSER; +SET SESSION AUTHORIZATION 'regress_foreign_data_user'; + +CREATE ROLE regress_test_role; +CREATE ROLE regress_test_role2; +CREATE ROLE regress_test_role_super SUPERUSER; +CREATE ROLE regress_test_indirect; +CREATE ROLE regress_unprivileged_role; + +CREATE FOREIGN DATA WRAPPER dummy; +COMMENT ON FOREIGN DATA WRAPPER dummy IS 'useless'; +CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator; + +-- At this point we should have 2 built-in wrappers and no servers. +SELECT fdwname, fdwhandler::regproc, fdwvalidator::regproc, fdwoptions FROM pg_foreign_data_wrapper WHERE fdwname <> 'gp_exttable_fdw' ORDER BY 1, 2, 3; +SELECT srvname, srvoptions FROM pg_foreign_server WHERE srvname <> 'gp_exttable_server'; +SELECT * FROM pg_user_mapping; + +-- CREATE FOREIGN DATA WRAPPER +CREATE FOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR +CREATE FOREIGN DATA WRAPPER foo; +\dew :NO_BUILTINS + +CREATE FOREIGN DATA WRAPPER foo; -- duplicate +DROP FOREIGN DATA WRAPPER foo; +CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1'); +\dew+ :NO_BUILTINS + +DROP FOREIGN DATA WRAPPER foo; +CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', testing '2'); -- ERROR +CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', another '2'); +\dew+ :NO_BUILTINS + +DROP FOREIGN DATA WRAPPER foo; +SET ROLE regress_test_role; +CREATE FOREIGN DATA WRAPPER foo; -- ERROR +RESET ROLE; +CREATE FOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator; +\dew+ :NO_BUILTINS + +-- HANDLER related checks +CREATE FUNCTION invalid_fdw_handler() RETURNS int LANGUAGE SQL AS 'SELECT 1;'; +CREATE FOREIGN DATA WRAPPER test_fdw HANDLER invalid_fdw_handler; -- ERROR +CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler HANDLER invalid_fdw_handler; -- ERROR +CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler; +DROP FOREIGN DATA WRAPPER test_fdw; + +-- ALTER FOREIGN DATA WRAPPER +ALTER FOREIGN DATA WRAPPER foo; -- ERROR +ALTER FOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR +ALTER FOREIGN DATA WRAPPER foo NO VALIDATOR; +\dew+ :NO_BUILTINS + +ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '1', b '2'); +ALTER FOREIGN DATA WRAPPER foo OPTIONS (SET c '4'); -- ERROR +ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP c); -- ERROR +ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD x '1', DROP x); +\dew+ :NO_BUILTINS + +ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP a, SET b '3', ADD c '4'); +\dew+ :NO_BUILTINS + +ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '2'); +ALTER FOREIGN DATA WRAPPER foo OPTIONS (b '4'); -- ERROR +\dew+ :NO_BUILTINS + +SET ROLE regress_test_role; +ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD d '5'); -- ERROR +SET ROLE regress_test_role_super; +ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD d '5'); +\dew+ :NO_BUILTINS + +ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role; -- ERROR +ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role_super; +ALTER ROLE regress_test_role_super NOSUPERUSER; +SET ROLE regress_test_role_super; +ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD e '6'); -- ERROR +RESET ROLE; +\dew+ :NO_BUILTINS + +ALTER FOREIGN DATA WRAPPER foo RENAME TO foo1; +\dew+ :NO_BUILTINS +ALTER FOREIGN DATA WRAPPER foo1 RENAME TO foo; + +-- HANDLER related checks +ALTER FOREIGN DATA WRAPPER foo HANDLER invalid_fdw_handler; -- ERROR +ALTER FOREIGN DATA WRAPPER foo HANDLER test_fdw_handler HANDLER anything; -- ERROR +ALTER FOREIGN DATA WRAPPER foo HANDLER test_fdw_handler; +DROP FUNCTION invalid_fdw_handler(); + +-- DROP FOREIGN DATA WRAPPER +DROP FOREIGN DATA WRAPPER nonexistent; -- ERROR +DROP FOREIGN DATA WRAPPER IF EXISTS nonexistent; +\dew+ :NO_BUILTINS + +DROP ROLE regress_test_role_super; -- ERROR +SET ROLE regress_test_role_super; +DROP FOREIGN DATA WRAPPER foo; +RESET ROLE; +DROP ROLE regress_test_role_super; +\dew+ :NO_BUILTINS + +CREATE FOREIGN DATA WRAPPER foo; +CREATE SERVER s1 FOREIGN DATA WRAPPER foo; +COMMENT ON SERVER s1 IS 'foreign server'; +CREATE USER MAPPING FOR current_user SERVER s1; +CREATE USER MAPPING FOR current_user SERVER s1; -- ERROR +CREATE USER MAPPING IF NOT EXISTS FOR current_user SERVER s1; -- NOTICE +\dew+ :NO_BUILTINS +\des+ :NO_BUILTINS +\deu+ +DROP FOREIGN DATA WRAPPER foo; -- ERROR +SET ROLE regress_test_role; +DROP FOREIGN DATA WRAPPER foo CASCADE; -- ERROR +RESET ROLE; +DROP FOREIGN DATA WRAPPER foo CASCADE; +\dew+ :NO_BUILTINS +\des+ :NO_BUILTINS +\deu+ + +-- exercise CREATE SERVER +CREATE SERVER s1 FOREIGN DATA WRAPPER foo; -- ERROR +CREATE FOREIGN DATA WRAPPER foo OPTIONS ("test wrapper" 'true'); +CREATE SERVER s1 FOREIGN DATA WRAPPER foo; +CREATE SERVER s1 FOREIGN DATA WRAPPER foo; -- ERROR +CREATE SERVER IF NOT EXISTS s1 FOREIGN DATA WRAPPER foo; -- No ERROR, just NOTICE +CREATE SERVER s2 FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); +CREATE SERVER s3 TYPE 'oracle' FOREIGN DATA WRAPPER foo; +CREATE SERVER s4 TYPE 'oracle' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); +CREATE SERVER s5 VERSION '15.0' FOREIGN DATA WRAPPER foo; +CREATE SERVER s6 VERSION '16.0' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); +CREATE SERVER s7 TYPE 'oracle' VERSION '17.0' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); +CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (foo '1'); -- ERROR +CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (host 'localhost', dbname 's8db'); +\des+ :NO_BUILTINS +SET ROLE regress_test_role; +CREATE SERVER t1 FOREIGN DATA WRAPPER foo; -- ERROR: no usage on FDW +RESET ROLE; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; +SET ROLE regress_test_role; +CREATE SERVER t1 FOREIGN DATA WRAPPER foo; +RESET ROLE; +\des+ :NO_BUILTINS + +REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_test_role; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_indirect; +SET ROLE regress_test_role; +CREATE SERVER t2 FOREIGN DATA WRAPPER foo; -- ERROR +RESET ROLE; +GRANT regress_test_indirect TO regress_test_role; +SET ROLE regress_test_role; +CREATE SERVER t2 FOREIGN DATA WRAPPER foo; +\des+ :NO_BUILTINS +RESET ROLE; +REVOKE regress_test_indirect FROM regress_test_role; + +-- ALTER SERVER +ALTER SERVER s0; -- ERROR +ALTER SERVER s0 OPTIONS (a '1'); -- ERROR +ALTER SERVER s1 VERSION '1.0' OPTIONS (servername 's1'); +ALTER SERVER s2 VERSION '1.1'; +ALTER SERVER s3 OPTIONS ("tns name" 'orcl', port '1521'); +GRANT USAGE ON FOREIGN SERVER s1 TO regress_test_role; +GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION; +\des+ :NO_BUILTINS +SET ROLE regress_test_role; +ALTER SERVER s1 VERSION '1.1'; -- ERROR +ALTER SERVER s1 OWNER TO regress_test_role; -- ERROR +RESET ROLE; +ALTER SERVER s1 OWNER TO regress_test_role; +GRANT regress_test_role2 TO regress_test_role; +SET ROLE regress_test_role; +ALTER SERVER s1 VERSION '1.1'; +ALTER SERVER s1 OWNER TO regress_test_role2; -- ERROR +RESET ROLE; +ALTER SERVER s8 OPTIONS (foo '1'); -- ERROR option validation +ALTER SERVER s8 OPTIONS (connect_timeout '30', SET dbname 'db1', DROP host); +SET ROLE regress_test_role; +ALTER SERVER s1 OWNER TO regress_test_indirect; -- ERROR +RESET ROLE; +GRANT regress_test_indirect TO regress_test_role; +SET ROLE regress_test_role; +ALTER SERVER s1 OWNER TO regress_test_indirect; +RESET ROLE; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_indirect; +SET ROLE regress_test_role; +ALTER SERVER s1 OWNER TO regress_test_indirect; +RESET ROLE; +DROP ROLE regress_test_indirect; -- ERROR +\des+ :NO_BUILTINS + +ALTER SERVER s8 RENAME to s8new; +\des+ :NO_BUILTINS +ALTER SERVER s8new RENAME to s8; + +-- DROP SERVER +DROP SERVER nonexistent; -- ERROR +DROP SERVER IF EXISTS nonexistent; +\des :NO_BUILTINS +SET ROLE regress_test_role; +DROP SERVER s2; -- ERROR +DROP SERVER s1; +RESET ROLE; +\des :NO_BUILTINS +ALTER SERVER s2 OWNER TO regress_test_role; +SET ROLE regress_test_role; +DROP SERVER s2; +RESET ROLE; +\des :NO_BUILTINS +CREATE USER MAPPING FOR current_user SERVER s3; +\deu +DROP SERVER s3; -- ERROR +DROP SERVER s3 CASCADE; +\des :NO_BUILTINS +\deu + +-- CREATE USER MAPPING +CREATE USER MAPPING FOR regress_test_missing_role SERVER s1; -- ERROR +CREATE USER MAPPING FOR current_user SERVER s1; -- ERROR +CREATE USER MAPPING FOR current_user SERVER s4; +CREATE USER MAPPING FOR user SERVER s4; -- ERROR duplicate +CREATE USER MAPPING FOR public SERVER s4 OPTIONS ("this mapping" 'is public'); +CREATE USER MAPPING FOR user SERVER s8 OPTIONS (username 'test', password 'secret'); -- ERROR +CREATE USER MAPPING FOR user SERVER s8 OPTIONS (user 'test', password 'secret'); +ALTER SERVER s5 OWNER TO regress_test_role; +ALTER SERVER s6 OWNER TO regress_test_indirect; +SET ROLE regress_test_role; +CREATE USER MAPPING FOR current_user SERVER s5; +CREATE USER MAPPING FOR current_user SERVER s6 OPTIONS (username 'test'); +CREATE USER MAPPING FOR current_user SERVER s7; -- ERROR +CREATE USER MAPPING FOR public SERVER s8; -- ERROR +RESET ROLE; + +ALTER SERVER t1 OWNER TO regress_test_indirect; +SET ROLE regress_test_role; +CREATE USER MAPPING FOR current_user SERVER t1 OPTIONS (username 'bob', password 'boo'); +CREATE USER MAPPING FOR public SERVER t1; +RESET ROLE; +\deu + +-- ALTER USER MAPPING +ALTER USER MAPPING FOR regress_test_missing_role SERVER s4 OPTIONS (gotcha 'true'); -- ERROR +ALTER USER MAPPING FOR user SERVER ss4 OPTIONS (gotcha 'true'); -- ERROR +ALTER USER MAPPING FOR public SERVER s5 OPTIONS (gotcha 'true'); -- ERROR +ALTER USER MAPPING FOR current_user SERVER s8 OPTIONS (username 'test'); -- ERROR +ALTER USER MAPPING FOR current_user SERVER s8 OPTIONS (DROP user, SET password 'public'); +SET ROLE regress_test_role; +ALTER USER MAPPING FOR current_user SERVER s5 OPTIONS (ADD modified '1'); +ALTER USER MAPPING FOR public SERVER s4 OPTIONS (ADD modified '1'); -- ERROR +ALTER USER MAPPING FOR public SERVER t1 OPTIONS (ADD modified '1'); +RESET ROLE; +\deu+ + +-- DROP USER MAPPING +DROP USER MAPPING FOR regress_test_missing_role SERVER s4; -- ERROR +DROP USER MAPPING FOR user SERVER ss4; +DROP USER MAPPING FOR public SERVER s7; -- ERROR +DROP USER MAPPING IF EXISTS FOR regress_test_missing_role SERVER s4; +DROP USER MAPPING IF EXISTS FOR user SERVER ss4; +DROP USER MAPPING IF EXISTS FOR public SERVER s7; +CREATE USER MAPPING FOR public SERVER s8; +SET ROLE regress_test_role; +DROP USER MAPPING FOR public SERVER s8; -- ERROR +RESET ROLE; +DROP SERVER s7; +\deu + +-- CREATE FOREIGN TABLE +CREATE SCHEMA foreign_schema; +CREATE SERVER s0 FOREIGN DATA WRAPPER dummy; +CREATE FOREIGN TABLE ft1 (); -- ERROR +CREATE FOREIGN TABLE ft1 () SERVER no_server; -- ERROR +CREATE FOREIGN TABLE ft1 ( + c1 integer OPTIONS ("param 1" 'val1') PRIMARY KEY, + c2 text OPTIONS (param2 'val2', param3 'val3'), + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); -- ERROR +CREATE TABLE ref_table (id integer PRIMARY KEY); +CREATE FOREIGN TABLE ft1 ( + c1 integer OPTIONS ("param 1" 'val1') REFERENCES ref_table (id), + c2 text OPTIONS (param2 'val2', param3 'val3'), + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); -- ERROR +DROP TABLE ref_table; +CREATE FOREIGN TABLE ft1 ( + c1 integer OPTIONS ("param 1" 'val1') NOT NULL, + c2 text OPTIONS (param2 'val2', param3 'val3'), + c3 date, + UNIQUE (c3) +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); -- ERROR +CREATE FOREIGN TABLE ft1 ( + c1 integer OPTIONS ("param 1" 'val1') NOT NULL, + c2 text OPTIONS (param2 'val2', param3 'val3') CHECK (c2 <> ''), + c3 date, + CHECK (c3 BETWEEN '1994-01-01'::date AND '1994-01-31'::date) +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +COMMENT ON FOREIGN TABLE ft1 IS 'ft1'; +COMMENT ON COLUMN ft1.c1 IS 'ft1.c1'; +\d+ ft1 +\det+ +CREATE INDEX id_ft1_c2 ON ft1 (c2); -- ERROR +SELECT * FROM ft1; -- ERROR +EXPLAIN SELECT * FROM ft1; -- ERROR + +CREATE TABLE lt1 (a INT) PARTITION BY RANGE (a); +CREATE FOREIGN TABLE ft_part1 + PARTITION OF lt1 FOR VALUES FROM (0) TO (1000) SERVER s0; +CREATE INDEX ON lt1 (a); -- skips partition +CREATE UNIQUE INDEX ON lt1 (a); -- ERROR +ALTER TABLE lt1 ADD PRIMARY KEY (a); -- ERROR +DROP TABLE lt1; + +CREATE TABLE lt1 (a INT) PARTITION BY RANGE (a); +CREATE INDEX ON lt1 (a); +CREATE FOREIGN TABLE ft_part1 + PARTITION OF lt1 FOR VALUES FROM (0) TO (1000) SERVER s0; +CREATE FOREIGN TABLE ft_part2 (a INT) SERVER s0; +ALTER TABLE lt1 ATTACH PARTITION ft_part2 FOR VALUES FROM (1000) TO (2000); +DROP FOREIGN TABLE ft_part1, ft_part2; +CREATE UNIQUE INDEX ON lt1 (a); +ALTER TABLE lt1 ADD PRIMARY KEY (a); +CREATE FOREIGN TABLE ft_part1 + PARTITION OF lt1 FOR VALUES FROM (0) TO (1000) SERVER s0; -- ERROR +CREATE FOREIGN TABLE ft_part2 (a INT NOT NULL) SERVER s0; +ALTER TABLE lt1 ATTACH PARTITION ft_part2 + FOR VALUES FROM (1000) TO (2000); -- ERROR +DROP TABLE lt1; +DROP FOREIGN TABLE ft_part2; + +CREATE TABLE lt1 (a INT) PARTITION BY RANGE (a); +CREATE INDEX ON lt1 (a); +CREATE TABLE lt1_part1 + PARTITION OF lt1 FOR VALUES FROM (0) TO (1000) + PARTITION BY RANGE (a); +CREATE FOREIGN TABLE ft_part_1_1 + PARTITION OF lt1_part1 FOR VALUES FROM (0) TO (100) SERVER s0; +CREATE FOREIGN TABLE ft_part_1_2 (a INT) SERVER s0; +ALTER TABLE lt1_part1 ATTACH PARTITION ft_part_1_2 FOR VALUES FROM (100) TO (200); +CREATE UNIQUE INDEX ON lt1 (a); +ALTER TABLE lt1 ADD PRIMARY KEY (a); +DROP FOREIGN TABLE ft_part_1_1, ft_part_1_2; +CREATE UNIQUE INDEX ON lt1 (a); +ALTER TABLE lt1 ADD PRIMARY KEY (a); +CREATE FOREIGN TABLE ft_part_1_1 + PARTITION OF lt1_part1 FOR VALUES FROM (0) TO (100) SERVER s0; +CREATE FOREIGN TABLE ft_part_1_2 (a INT NOT NULL) SERVER s0; +ALTER TABLE lt1_part1 ATTACH PARTITION ft_part_1_2 FOR VALUES FROM (100) TO (200); +DROP TABLE lt1; +DROP FOREIGN TABLE ft_part_1_2; + +-- ALTER FOREIGN TABLE +COMMENT ON FOREIGN TABLE ft1 IS 'foreign table'; +COMMENT ON FOREIGN TABLE ft1 IS NULL; +COMMENT ON COLUMN ft1.c1 IS 'foreign column'; +COMMENT ON COLUMN ft1.c1 IS NULL; + +ALTER FOREIGN TABLE ft1 ADD COLUMN c4 integer; +ALTER FOREIGN TABLE ft1 ADD COLUMN c5 integer DEFAULT 0; +ALTER FOREIGN TABLE ft1 ADD COLUMN c6 integer; +ALTER FOREIGN TABLE ft1 ADD COLUMN c7 integer NOT NULL; +ALTER FOREIGN TABLE ft1 ADD COLUMN c8 integer; +ALTER FOREIGN TABLE ft1 ADD COLUMN c9 integer; +ALTER FOREIGN TABLE ft1 ADD COLUMN c10 integer OPTIONS (p1 'v1'); + +ALTER FOREIGN TABLE ft1 ALTER COLUMN c4 SET DEFAULT 0; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c5 DROP DEFAULT; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c6 SET NOT NULL; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 DROP NOT NULL; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE char(10) USING '0'; -- ERROR +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE char(10); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET DATA TYPE text; +ALTER FOREIGN TABLE ft1 ALTER COLUMN xmin OPTIONS (ADD p1 'v1'); -- ERROR +ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'), + ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET STATISTICS 10000; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET (n_distinct = 100); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET STATISTICS -1; +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET STORAGE PLAIN; +\d+ ft1 +-- can't change the column type if it's used elsewhere +CREATE TABLE use_ft1_column_type (x ft1); +ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET DATA TYPE integer; -- ERROR +DROP TABLE use_ft1_column_type; +ALTER FOREIGN TABLE ft1 ADD PRIMARY KEY (c7); -- ERROR +ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c9_check CHECK (c9 < 0) NOT VALID; +ALTER FOREIGN TABLE ft1 ALTER CONSTRAINT ft1_c9_check DEFERRABLE; -- ERROR +ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c9_check; +ALTER FOREIGN TABLE ft1 DROP CONSTRAINT no_const; -- ERROR +ALTER FOREIGN TABLE ft1 DROP CONSTRAINT IF EXISTS no_const; +ALTER FOREIGN TABLE ft1 OWNER TO regress_test_role; +ALTER FOREIGN TABLE ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@'); +ALTER FOREIGN TABLE ft1 DROP COLUMN no_column; -- ERROR +ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column; +ALTER FOREIGN TABLE ft1 DROP COLUMN c9; +ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema; +ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR +ALTER FOREIGN TABLE foreign_schema.ft1 SET TABLESPACE ts; -- ERROR +ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; +ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; +\d foreign_schema.foreign_table_1 + +-- alter noexisting table +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c4 integer; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c6 integer; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c7 integer NOT NULL; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c8 integer; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c9 integer; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c10 integer OPTIONS (p1 'v1'); + +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c6 SET NOT NULL; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 DROP NOT NULL; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 TYPE char(10); +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 SET DATA TYPE text; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'), + ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); + +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT IF EXISTS no_const; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT ft1_c1_check; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OWNER TO regress_test_role; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@'); +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN IF EXISTS no_column; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN c9; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 SET SCHEMA foreign_schema; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME c1 TO foreign_column_1; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME TO foreign_table_1; + +-- Information schema + +SELECT * FROM information_schema.foreign_data_wrappers WHERE foreign_data_wrapper_name <> 'gp_exttable_fdw' ORDER BY 1, 2; +SELECT * FROM information_schema.foreign_data_wrapper_options ORDER BY 1, 2, 3; +SELECT * FROM information_schema.foreign_servers WHERE foreign_server_name <> 'gp_exttable_server' ORDER BY 1, 2; +SELECT * FROM information_schema.foreign_server_options ORDER BY 1, 2, 3; +SELECT * FROM information_schema.user_mappings ORDER BY lower(authorization_identifier), 2, 3; +SELECT * FROM information_schema.user_mapping_options ORDER BY lower(authorization_identifier), 2, 3, 4; +SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5; +SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5; +SELECT * FROM information_schema.foreign_tables WHERE foreign_table_schema <> 'gp_toolkit' ORDER BY 1, 2, 3; +SELECT * FROM information_schema.foreign_table_options WHERE foreign_table_schema <> 'gp_toolkit' ORDER BY 1, 2, 3, 4; +SET ROLE regress_test_role; +SELECT * FROM information_schema.user_mapping_options ORDER BY 1, 2, 3, 4; +SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5; +SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5; +DROP USER MAPPING FOR current_user SERVER t1; +SET ROLE regress_test_role2; +SELECT * FROM information_schema.user_mapping_options ORDER BY 1, 2, 3, 4; +RESET ROLE; + + +-- has_foreign_data_wrapper_privilege +SELECT has_foreign_data_wrapper_privilege('regress_test_role', + (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); +SELECT has_foreign_data_wrapper_privilege('regress_test_role', 'foo', 'USAGE'); +SELECT has_foreign_data_wrapper_privilege( + (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), + (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); +SELECT has_foreign_data_wrapper_privilege( + (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); +SELECT has_foreign_data_wrapper_privilege( + (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), 'foo', 'USAGE'); +SELECT has_foreign_data_wrapper_privilege('foo', 'USAGE'); +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; +SELECT has_foreign_data_wrapper_privilege('regress_test_role', 'foo', 'USAGE'); + +-- has_server_privilege +SELECT has_server_privilege('regress_test_role', + (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); +SELECT has_server_privilege('regress_test_role', 's8', 'USAGE'); +SELECT has_server_privilege( + (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), + (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); +SELECT has_server_privilege( + (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); +SELECT has_server_privilege( + (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), 's8', 'USAGE'); +SELECT has_server_privilege('s8', 'USAGE'); +GRANT USAGE ON FOREIGN SERVER s8 TO regress_test_role; +SELECT has_server_privilege('regress_test_role', 's8', 'USAGE'); +REVOKE USAGE ON FOREIGN SERVER s8 FROM regress_test_role; + +GRANT USAGE ON FOREIGN SERVER s4 TO regress_test_role; +DROP USER MAPPING FOR public SERVER s4; +ALTER SERVER s6 OPTIONS (DROP host, DROP dbname); +ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (DROP username); +ALTER FOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator; + +-- Privileges +SET ROLE regress_unprivileged_role; +CREATE FOREIGN DATA WRAPPER foobar; -- ERROR +ALTER FOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true'); -- ERROR +ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_unprivileged_role; -- ERROR +DROP FOREIGN DATA WRAPPER foo; -- ERROR +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; -- ERROR +CREATE SERVER s9 FOREIGN DATA WRAPPER foo; -- ERROR +ALTER SERVER s4 VERSION '0.5'; -- ERROR +ALTER SERVER s4 OWNER TO regress_unprivileged_role; -- ERROR +DROP SERVER s4; -- ERROR +GRANT USAGE ON FOREIGN SERVER s4 TO regress_test_role; -- ERROR +CREATE USER MAPPING FOR public SERVER s4; -- ERROR +ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (gotcha 'true'); -- ERROR +DROP USER MAPPING FOR regress_test_role SERVER s6; -- ERROR +RESET ROLE; + +GRANT USAGE ON FOREIGN DATA WRAPPER postgresql TO regress_unprivileged_role; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_unprivileged_role WITH GRANT OPTION; +SET ROLE regress_unprivileged_role; +CREATE FOREIGN DATA WRAPPER foobar; -- ERROR +ALTER FOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true'); -- ERROR +DROP FOREIGN DATA WRAPPER foo; -- ERROR +GRANT USAGE ON FOREIGN DATA WRAPPER postgresql TO regress_test_role; -- WARNING +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; +CREATE SERVER s9 FOREIGN DATA WRAPPER postgresql; +ALTER SERVER s6 VERSION '0.5'; -- ERROR +DROP SERVER s6; -- ERROR +GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role; -- ERROR +GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role; +CREATE USER MAPPING FOR public SERVER s6; -- ERROR +CREATE USER MAPPING FOR public SERVER s9; +ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (gotcha 'true'); -- ERROR +DROP USER MAPPING FOR regress_test_role SERVER s6; -- ERROR +RESET ROLE; + +REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_unprivileged_role; -- ERROR +REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_unprivileged_role CASCADE; +SET ROLE regress_unprivileged_role; +GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; -- ERROR +CREATE SERVER s10 FOREIGN DATA WRAPPER foo; -- ERROR +ALTER SERVER s9 VERSION '1.1'; +GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role; +CREATE USER MAPPING FOR current_user SERVER s9; +-- We use terse mode to avoid ordering issues in cascade detail output. +\set VERBOSITY terse +DROP SERVER s9 CASCADE; +\set VERBOSITY default +RESET ROLE; +CREATE SERVER s9 FOREIGN DATA WRAPPER foo; +GRANT USAGE ON FOREIGN SERVER s9 TO regress_unprivileged_role; +SET ROLE regress_unprivileged_role; +ALTER SERVER s9 VERSION '1.2'; -- ERROR +GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role; -- WARNING +CREATE USER MAPPING FOR current_user SERVER s9; +DROP SERVER s9 CASCADE; -- ERROR + +-- Check visibility of user mapping data +SET ROLE regress_test_role; +CREATE SERVER s10 FOREIGN DATA WRAPPER foo; +CREATE USER MAPPING FOR public SERVER s10 OPTIONS (user 'secret'); +CREATE USER MAPPING FOR regress_unprivileged_role SERVER s10 OPTIONS (user 'secret'); +-- owner of server can see some option fields +\deu+ +RESET ROLE; +-- superuser can see all option fields +\deu+ +-- unprivileged user cannot see any option field +SET ROLE regress_unprivileged_role; +\deu+ +RESET ROLE; +\set VERBOSITY terse +DROP SERVER s10 CASCADE; +\set VERBOSITY default + +-- Triggers +CREATE FUNCTION dummy_trigger() RETURNS TRIGGER AS $$ + BEGIN + RETURN NULL; + END +$$ language plpgsql; + +CREATE TRIGGER trigtest_before_stmt BEFORE INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH STATEMENT +EXECUTE PROCEDURE dummy_trigger(); + +CREATE TRIGGER trigtest_after_stmt AFTER INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH STATEMENT +EXECUTE PROCEDURE dummy_trigger(); + +CREATE TRIGGER trigtest_after_stmt_tt AFTER INSERT OR UPDATE OR DELETE -- ERROR +ON foreign_schema.foreign_table_1 +REFERENCING NEW TABLE AS new_table +FOR EACH STATEMENT +EXECUTE PROCEDURE dummy_trigger(); + +CREATE TRIGGER trigtest_before_row BEFORE INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH ROW +EXECUTE PROCEDURE dummy_trigger(); + +CREATE TRIGGER trigtest_after_row AFTER INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH ROW +EXECUTE PROCEDURE dummy_trigger(); + +CREATE CONSTRAINT TRIGGER trigtest_constraint AFTER INSERT OR UPDATE OR DELETE +ON foreign_schema.foreign_table_1 +FOR EACH ROW +EXECUTE PROCEDURE dummy_trigger(); + +ALTER FOREIGN TABLE foreign_schema.foreign_table_1 + DISABLE TRIGGER trigtest_before_stmt; +ALTER FOREIGN TABLE foreign_schema.foreign_table_1 + ENABLE TRIGGER trigtest_before_stmt; + +DROP TRIGGER trigtest_before_stmt ON foreign_schema.foreign_table_1; +DROP TRIGGER trigtest_before_row ON foreign_schema.foreign_table_1; +DROP TRIGGER trigtest_after_stmt ON foreign_schema.foreign_table_1; +DROP TRIGGER trigtest_after_row ON foreign_schema.foreign_table_1; + +DROP FUNCTION dummy_trigger(); + +-- Table inheritance +CREATE TABLE fd_pt1 ( + c1 integer NOT NULL, + c2 text, + c3 date +); +CREATE FOREIGN TABLE ft2 () INHERITS (fd_pt1) + SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ fd_pt1 +\d+ ft2 +DROP FOREIGN TABLE ft2; +\d+ fd_pt1 +CREATE FOREIGN TABLE ft2 ( + c1 integer NOT NULL, + c2 text, + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ ft2 +ALTER FOREIGN TABLE ft2 INHERIT fd_pt1; +\d+ fd_pt1 +\d+ ft2 +-- GPDB: Cannot create distributed table from non-distributed foreign table. +-- CBDB: But in single-node mode we can. +-- CREATE TABLE ct3() INHERITS(ft2); +CREATE FOREIGN TABLE ft3 ( + c1 integer NOT NULL, + c2 text, + c3 date +) INHERITS(ft2) + SERVER s0; +\d+ ft2 +-- start_ignore +-- GPDB: ct3 is not created. +\d+ ct3 +-- end_ignore +\d+ ft3 + +-- add attributes recursively +ALTER TABLE fd_pt1 ADD COLUMN c4 integer; +ALTER TABLE fd_pt1 ADD COLUMN c5 integer DEFAULT 0; +ALTER TABLE fd_pt1 ADD COLUMN c6 integer; +ALTER TABLE fd_pt1 ADD COLUMN c7 integer NOT NULL; +ALTER TABLE fd_pt1 ADD COLUMN c8 integer; +\d+ fd_pt1 +\d+ ft2 +-- start_ignore +-- GPDB: ct3 is not created. +\d+ ct3 +-- end_ignore +\d+ ft3 + +-- alter attributes recursively +ALTER TABLE fd_pt1 ALTER COLUMN c4 SET DEFAULT 0; +ALTER TABLE fd_pt1 ALTER COLUMN c5 DROP DEFAULT; +ALTER TABLE fd_pt1 ALTER COLUMN c6 SET NOT NULL; +ALTER TABLE fd_pt1 ALTER COLUMN c7 DROP NOT NULL; +ALTER TABLE fd_pt1 ALTER COLUMN c8 TYPE char(10) USING '0'; -- ERROR +ALTER TABLE fd_pt1 ALTER COLUMN c8 TYPE char(10); +ALTER TABLE fd_pt1 ALTER COLUMN c8 SET DATA TYPE text; +ALTER TABLE fd_pt1 ALTER COLUMN c1 SET STATISTICS 10000; +ALTER TABLE fd_pt1 ALTER COLUMN c1 SET (n_distinct = 100); +ALTER TABLE fd_pt1 ALTER COLUMN c8 SET STATISTICS -1; +ALTER TABLE fd_pt1 ALTER COLUMN c8 SET STORAGE EXTERNAL; +\d+ fd_pt1 +\d+ ft2 + +-- drop attributes recursively +ALTER TABLE fd_pt1 DROP COLUMN c4; +ALTER TABLE fd_pt1 DROP COLUMN c5; +ALTER TABLE fd_pt1 DROP COLUMN c6; +ALTER TABLE fd_pt1 DROP COLUMN c7; +ALTER TABLE fd_pt1 DROP COLUMN c8; +\d+ fd_pt1 +\d+ ft2 + +-- add constraints recursively +ALTER TABLE fd_pt1 ADD CONSTRAINT fd_pt1chk1 CHECK (c1 > 0) NO INHERIT; +ALTER TABLE fd_pt1 ADD CONSTRAINT fd_pt1chk2 CHECK (c2 <> ''); +-- connoinherit should be true for NO INHERIT constraint +SELECT relname, conname, contype, conislocal, coninhcount, connoinherit + FROM pg_class AS pc JOIN pg_constraint AS pgc ON (conrelid = pc.oid) + WHERE pc.relname = 'fd_pt1' + ORDER BY 1,2; +-- child does not inherit NO INHERIT constraints +\d+ fd_pt1 +\d+ ft2 +DROP FOREIGN TABLE ft2; -- ERROR +DROP FOREIGN TABLE ft2 CASCADE; +CREATE FOREIGN TABLE ft2 ( + c1 integer NOT NULL, + c2 text, + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +-- child must have parent's INHERIT constraints +ALTER FOREIGN TABLE ft2 INHERIT fd_pt1; -- ERROR +ALTER FOREIGN TABLE ft2 ADD CONSTRAINT fd_pt1chk2 CHECK (c2 <> ''); +ALTER FOREIGN TABLE ft2 INHERIT fd_pt1; +-- child does not inherit NO INHERIT constraints +\d+ fd_pt1 +\d+ ft2 + +-- drop constraints recursively +ALTER TABLE fd_pt1 DROP CONSTRAINT fd_pt1chk1 CASCADE; +ALTER TABLE fd_pt1 DROP CONSTRAINT fd_pt1chk2 CASCADE; + +-- NOT VALID case +SET gp_autostats_mode=NONE; -- GPDB: don't analyze after insert +INSERT INTO fd_pt1 VALUES (1, 'fd_pt1'::text, '1994-01-01'::date); +ALTER TABLE fd_pt1 ADD CONSTRAINT fd_pt1chk3 CHECK (c2 <> '') NOT VALID; +\d+ fd_pt1 +\d+ ft2 +-- VALIDATE CONSTRAINT need do nothing on foreign tables +ALTER TABLE fd_pt1 VALIDATE CONSTRAINT fd_pt1chk3; +\d+ fd_pt1 +\d+ ft2 + +-- changes name of an attribute recursively +ALTER TABLE fd_pt1 RENAME COLUMN c1 TO f1; +ALTER TABLE fd_pt1 RENAME COLUMN c2 TO f2; +ALTER TABLE fd_pt1 RENAME COLUMN c3 TO f3; +-- changes name of a constraint recursively +ALTER TABLE fd_pt1 RENAME CONSTRAINT fd_pt1chk3 TO f2_check; +\d+ fd_pt1 +\d+ ft2 + +-- TRUNCATE doesn't work on foreign tables, either directly or recursively +TRUNCATE ft2; -- ERROR +TRUNCATE fd_pt1; -- ERROR + +DROP TABLE fd_pt1 CASCADE; + +-- IMPORT FOREIGN SCHEMA +IMPORT FOREIGN SCHEMA s1 FROM SERVER s9 INTO public; -- ERROR +IMPORT FOREIGN SCHEMA s1 LIMIT TO (t1) FROM SERVER s9 INTO public; --ERROR +IMPORT FOREIGN SCHEMA s1 EXCEPT (t1) FROM SERVER s9 INTO public; -- ERROR +IMPORT FOREIGN SCHEMA s1 EXCEPT (t1, t2) FROM SERVER s9 INTO public +OPTIONS (option1 'value1', option2 'value2'); -- ERROR + +-- DROP FOREIGN TABLE +DROP FOREIGN TABLE no_table; -- ERROR +DROP FOREIGN TABLE IF EXISTS no_table; +DROP FOREIGN TABLE foreign_schema.foreign_table_1; + +-- REASSIGN OWNED/DROP OWNED of foreign objects +REASSIGN OWNED BY regress_test_role TO regress_test_role2; +DROP OWNED BY regress_test_role2; +DROP OWNED BY regress_test_role2 CASCADE; + +-- Foreign partition DDL stuff +CREATE TABLE fd_pt2 ( + c1 integer NOT NULL, + c2 text, + c3 date +) PARTITION BY LIST (c1); +CREATE FOREIGN TABLE fd_pt2_1 PARTITION OF fd_pt2 FOR VALUES IN (1) + SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ fd_pt2 +\d+ fd_pt2_1 + +-- partition cannot have additional columns +DROP FOREIGN TABLE fd_pt2_1; +CREATE FOREIGN TABLE fd_pt2_1 ( + c1 integer NOT NULL, + c2 text, + c3 date, + c4 char +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ fd_pt2_1 +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); -- ERROR + +DROP FOREIGN TABLE fd_pt2_1; +\d+ fd_pt2 +CREATE FOREIGN TABLE fd_pt2_1 ( + c1 integer NOT NULL, + c2 text, + c3 date +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value'); +\d+ fd_pt2_1 +-- no attach partition validation occurs for foreign tables +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); +\d+ fd_pt2 +\d+ fd_pt2_1 + +-- cannot add column to a partition +ALTER TABLE fd_pt2_1 ADD c4 char; + +-- ok to have a partition's own constraints though +ALTER TABLE fd_pt2_1 ALTER c3 SET NOT NULL; +ALTER TABLE fd_pt2_1 ADD CONSTRAINT p21chk CHECK (c2 <> ''); +\d+ fd_pt2 +\d+ fd_pt2_1 + +-- cannot drop inherited NOT NULL constraint from a partition +ALTER TABLE fd_pt2_1 ALTER c1 DROP NOT NULL; + +-- partition must have parent's constraints +ALTER TABLE fd_pt2 DETACH PARTITION fd_pt2_1; +ALTER TABLE fd_pt2 ALTER c2 SET NOT NULL; +\d+ fd_pt2 +\d+ fd_pt2_1 +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); -- ERROR +ALTER FOREIGN TABLE fd_pt2_1 ALTER c2 SET NOT NULL; +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); + +ALTER TABLE fd_pt2 DETACH PARTITION fd_pt2_1; +ALTER TABLE fd_pt2 ADD CONSTRAINT fd_pt2chk1 CHECK (c1 > 0); +\d+ fd_pt2 +\d+ fd_pt2_1 +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); -- ERROR +ALTER FOREIGN TABLE fd_pt2_1 ADD CONSTRAINT fd_pt2chk1 CHECK (c1 > 0); +ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); + +-- TRUNCATE doesn't work on foreign tables, either directly or recursively +TRUNCATE fd_pt2_1; -- ERROR +TRUNCATE fd_pt2; -- ERROR + +DROP FOREIGN TABLE fd_pt2_1; +DROP TABLE fd_pt2; + +-- foreign table cannot be part of partition tree made of temporary +-- relations. +CREATE TEMP TABLE temp_parted (a int) PARTITION BY LIST (a); +CREATE FOREIGN TABLE foreign_part PARTITION OF temp_parted DEFAULT + SERVER s0; -- ERROR +CREATE FOREIGN TABLE foreign_part (a int) SERVER s0; +ALTER TABLE temp_parted ATTACH PARTITION foreign_part DEFAULT; -- ERROR +DROP FOREIGN TABLE foreign_part; +DROP TABLE temp_parted; + +-- Cleanup +DROP SCHEMA foreign_schema CASCADE; +DROP ROLE regress_test_role; -- ERROR +DROP SERVER t1 CASCADE; +DROP USER MAPPING FOR regress_test_role SERVER s6; +\set VERBOSITY terse +DROP FOREIGN DATA WRAPPER foo CASCADE; +DROP SERVER s8 CASCADE; +\set VERBOSITY default +DROP ROLE regress_test_indirect; +DROP ROLE regress_test_role; +DROP ROLE regress_unprivileged_role; -- ERROR +REVOKE ALL ON FOREIGN DATA WRAPPER postgresql FROM regress_unprivileged_role; +DROP ROLE regress_unprivileged_role; +DROP ROLE regress_test_role2; +DROP FOREIGN DATA WRAPPER postgresql CASCADE; +DROP FOREIGN DATA WRAPPER dummy CASCADE; +\c +DROP ROLE regress_foreign_data_user; + +-- At this point we should have no wrappers, no servers, and no mappings. +SELECT fdwname, fdwhandler, fdwvalidator, fdwoptions FROM pg_foreign_data_wrapper WHERE fdwname <> 'gp_exttable_fdw'; +SELECT srvname, srvoptions FROM pg_foreign_server WHERE srvname <> 'gp_exttable_server'; +SELECT * FROM pg_user_mapping; diff --git a/src/test/singlenode_regress/sql/foreign_key.sql b/src/test/singlenode_regress/sql/foreign_key.sql new file mode 100644 index 00000000000..de417b62b64 --- /dev/null +++ b/src/test/singlenode_regress/sql/foreign_key.sql @@ -0,0 +1,1831 @@ +-- +-- FOREIGN KEY +-- + +-- MATCH FULL +-- +-- First test, check and cascade +-- +CREATE TABLE PKTABLE ( ptest1 int PRIMARY KEY, ptest2 text ); +CREATE TABLE FKTABLE ( ftest1 int REFERENCES PKTABLE MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, ftest2 int ); + +-- Insert test data into PKTABLE +INSERT INTO PKTABLE VALUES (1, 'Test1'); +INSERT INTO PKTABLE VALUES (2, 'Test2'); +INSERT INTO PKTABLE VALUES (3, 'Test3'); +INSERT INTO PKTABLE VALUES (4, 'Test4'); +INSERT INTO PKTABLE VALUES (5, 'Test5'); + +-- Insert successful rows into FK TABLE +INSERT INTO FKTABLE VALUES (1, 2); +INSERT INTO FKTABLE VALUES (2, 3); +INSERT INTO FKTABLE VALUES (3, 4); +INSERT INTO FKTABLE VALUES (NULL, 1); + +-- Insert a failed row into FK TABLE +INSERT INTO FKTABLE VALUES (100, 2); + +-- Check FKTABLE +SELECT * FROM FKTABLE; + +-- Delete a row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=1; + +-- Check FKTABLE for removal of matched row +SELECT * FROM FKTABLE; + +-- Update a row from PK TABLE +UPDATE PKTABLE SET ptest1=1 WHERE ptest1=2; + +-- Check FKTABLE for update of matched row +SELECT * FROM FKTABLE; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- +-- check set NULL and table constraint on multiple columns +-- +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 text, PRIMARY KEY(ptest1, ptest2) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int, ftest3 int, CONSTRAINT constrname FOREIGN KEY(ftest1, ftest2) + REFERENCES PKTABLE MATCH FULL ON DELETE SET NULL ON UPDATE SET NULL); + +-- Test comments +COMMENT ON CONSTRAINT constrname_wrong ON FKTABLE IS 'fk constraint comment'; +COMMENT ON CONSTRAINT constrname ON FKTABLE IS 'fk constraint comment'; +COMMENT ON CONSTRAINT constrname ON FKTABLE IS NULL; + +-- Insert test data into PKTABLE +INSERT INTO PKTABLE VALUES (1, 2, 'Test1'); +INSERT INTO PKTABLE VALUES (1, 3, 'Test1-2'); +INSERT INTO PKTABLE VALUES (2, 4, 'Test2'); +INSERT INTO PKTABLE VALUES (3, 6, 'Test3'); +INSERT INTO PKTABLE VALUES (4, 8, 'Test4'); +INSERT INTO PKTABLE VALUES (5, 10, 'Test5'); + +-- Insert successful rows into FK TABLE +INSERT INTO FKTABLE VALUES (1, 2, 4); +INSERT INTO FKTABLE VALUES (1, 3, 5); +INSERT INTO FKTABLE VALUES (2, 4, 8); +INSERT INTO FKTABLE VALUES (3, 6, 12); +INSERT INTO FKTABLE VALUES (NULL, NULL, 0); + +-- Insert failed rows into FK TABLE +INSERT INTO FKTABLE VALUES (100, 2, 4); +INSERT INTO FKTABLE VALUES (2, 2, 4); +INSERT INTO FKTABLE VALUES (NULL, 2, 4); +INSERT INTO FKTABLE VALUES (1, NULL, 4); + +-- Check FKTABLE +SELECT * FROM FKTABLE; + +-- Delete a row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=1 and ptest2=2; + +-- Check FKTABLE for removal of matched row +SELECT * FROM FKTABLE; + +-- Delete another row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=5 and ptest2=10; + +-- Check FKTABLE (should be no change) +SELECT * FROM FKTABLE; + +-- Update a row from PK TABLE +UPDATE PKTABLE SET ptest1=1 WHERE ptest1=2; + +-- Check FKTABLE for update of matched row +SELECT * FROM FKTABLE; + +-- Check update with part of key null +UPDATE FKTABLE SET ftest1 = NULL WHERE ftest1 = 1; + +-- Check update with old and new key values equal +UPDATE FKTABLE SET ftest1 = 1 WHERE ftest1 = 1; + +-- Try altering the column type where foreign keys are involved +ALTER TABLE PKTABLE ALTER COLUMN ptest1 TYPE bigint; +ALTER TABLE FKTABLE ALTER COLUMN ftest1 TYPE bigint; +SELECT * FROM PKTABLE; +SELECT * FROM FKTABLE; + +DROP TABLE PKTABLE CASCADE; +DROP TABLE FKTABLE; + +-- +-- check set default and table constraint on multiple columns +-- +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 text, PRIMARY KEY(ptest1, ptest2) ); +CREATE TABLE FKTABLE ( ftest1 int DEFAULT -1, ftest2 int DEFAULT -2, ftest3 int, CONSTRAINT constrname2 FOREIGN KEY(ftest1, ftest2) + REFERENCES PKTABLE MATCH FULL ON DELETE SET DEFAULT ON UPDATE SET DEFAULT); + +-- Insert a value in PKTABLE for default +INSERT INTO PKTABLE VALUES (-1, -2, 'The Default!'); + +-- Insert test data into PKTABLE +INSERT INTO PKTABLE VALUES (1, 2, 'Test1'); +INSERT INTO PKTABLE VALUES (1, 3, 'Test1-2'); +INSERT INTO PKTABLE VALUES (2, 4, 'Test2'); +INSERT INTO PKTABLE VALUES (3, 6, 'Test3'); +INSERT INTO PKTABLE VALUES (4, 8, 'Test4'); +INSERT INTO PKTABLE VALUES (5, 10, 'Test5'); + +-- Insert successful rows into FK TABLE +INSERT INTO FKTABLE VALUES (1, 2, 4); +INSERT INTO FKTABLE VALUES (1, 3, 5); +INSERT INTO FKTABLE VALUES (2, 4, 8); +INSERT INTO FKTABLE VALUES (3, 6, 12); +INSERT INTO FKTABLE VALUES (NULL, NULL, 0); + +-- Insert failed rows into FK TABLE +INSERT INTO FKTABLE VALUES (100, 2, 4); +INSERT INTO FKTABLE VALUES (2, 2, 4); +INSERT INTO FKTABLE VALUES (NULL, 2, 4); +INSERT INTO FKTABLE VALUES (1, NULL, 4); + +-- Check FKTABLE +SELECT * FROM FKTABLE; + +-- Delete a row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=1 and ptest2=2; + +-- Check FKTABLE to check for removal +SELECT * FROM FKTABLE; + +-- Delete another row from PK TABLE +DELETE FROM PKTABLE WHERE ptest1=5 and ptest2=10; + +-- Check FKTABLE (should be no change) +SELECT * FROM FKTABLE; + +-- Update a row from PK TABLE +UPDATE PKTABLE SET ptest1=1 WHERE ptest1=2; + +-- Check FKTABLE for update of matched row +SELECT * FROM FKTABLE; + +-- this should fail for lack of CASCADE +DROP TABLE PKTABLE; +DROP TABLE PKTABLE CASCADE; +DROP TABLE FKTABLE; + + +-- +-- First test, check with no on delete or on update +-- +CREATE TABLE PKTABLE ( ptest1 int PRIMARY KEY, ptest2 text ); +CREATE TABLE FKTABLE ( ftest1 int REFERENCES PKTABLE MATCH FULL, ftest2 int ); + +-- Insert test data into PKTABLE +INSERT INTO PKTABLE VALUES (1, 'Test1'); +INSERT INTO PKTABLE VALUES (2, 'Test2'); +INSERT INTO PKTABLE VALUES (3, 'Test3'); +INSERT INTO PKTABLE VALUES (4, 'Test4'); +INSERT INTO PKTABLE VALUES (5, 'Test5'); + +-- Insert successful rows into FK TABLE +INSERT INTO FKTABLE VALUES (1, 2); +INSERT INTO FKTABLE VALUES (2, 3); +INSERT INTO FKTABLE VALUES (3, 4); +INSERT INTO FKTABLE VALUES (NULL, 1); + +-- Insert a failed row into FK TABLE +INSERT INTO FKTABLE VALUES (100, 2); + +-- Check FKTABLE +SELECT * FROM FKTABLE; + +-- Check PKTABLE +SELECT * FROM PKTABLE; + +-- Delete a row from PK TABLE (should fail) +DELETE FROM PKTABLE WHERE ptest1=1; + +-- Delete a row from PK TABLE (should succeed) +DELETE FROM PKTABLE WHERE ptest1=5; + +-- Check PKTABLE for deletes +SELECT * FROM PKTABLE; + +-- Update a row from PK TABLE (should fail) +UPDATE PKTABLE SET ptest1=0 WHERE ptest1=2; + +-- Update a row from PK TABLE (should succeed) +UPDATE PKTABLE SET ptest1=0 WHERE ptest1=4; + +-- Check PKTABLE for updates +SELECT * FROM PKTABLE; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- +-- Check initial check upon ALTER TABLE +-- +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, PRIMARY KEY(ptest1, ptest2) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int ); + +INSERT INTO PKTABLE VALUES (1, 2); +INSERT INTO FKTABLE VALUES (1, NULL); + +ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1, ftest2) REFERENCES PKTABLE MATCH FULL; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + + +-- MATCH SIMPLE + +-- Base test restricting update/delete +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, PRIMARY KEY(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int, ftest3 int, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE); + +-- Insert Primary Key values +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, 3, 'test2'); +INSERT INTO PKTABLE VALUES (2, 3, 4, 'test3'); +INSERT INTO PKTABLE VALUES (2, 4, 5, 'test4'); + +-- Insert Foreign Key values +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +INSERT INTO FKTABLE VALUES (NULL, 2, 3, 2); +INSERT INTO FKTABLE VALUES (2, NULL, 3, 3); +INSERT INTO FKTABLE VALUES (NULL, 2, 7, 4); +INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5); + +-- Insert a failed values +INSERT INTO FKTABLE VALUES (1, 2, 7, 6); + +-- Show FKTABLE +SELECT * from FKTABLE; + +-- Try to update something that should fail +UPDATE PKTABLE set ptest2=5 where ptest2=2; + +-- Try to update something that should succeed +UPDATE PKTABLE set ptest1=1 WHERE ptest2=3; + +-- Try to delete something that should fail +DELETE FROM PKTABLE where ptest1=1 and ptest2=2 and ptest3=3; + +-- Try to delete something that should work +DELETE FROM PKTABLE where ptest1=2; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; + +SELECT * from FKTABLE; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- restrict with null values +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, UNIQUE(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int, ftest3 int, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE (ptest1, ptest2, ptest3)); + +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, NULL, 'test2'); +INSERT INTO PKTABLE VALUES (2, NULL, 4, 'test3'); + +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); + +DELETE FROM PKTABLE WHERE ptest1 = 2; + +SELECT * FROM PKTABLE; +SELECT * FROM FKTABLE; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- cascade update/delete +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, PRIMARY KEY(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int, ftest2 int, ftest3 int, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE + ON DELETE CASCADE ON UPDATE CASCADE); + +-- Insert Primary Key values +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, 3, 'test2'); +INSERT INTO PKTABLE VALUES (2, 3, 4, 'test3'); +INSERT INTO PKTABLE VALUES (2, 4, 5, 'test4'); + +-- Insert Foreign Key values +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +INSERT INTO FKTABLE VALUES (NULL, 2, 3, 2); +INSERT INTO FKTABLE VALUES (2, NULL, 3, 3); +INSERT INTO FKTABLE VALUES (NULL, 2, 7, 4); +INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5); + +-- Insert a failed values +INSERT INTO FKTABLE VALUES (1, 2, 7, 6); + +-- Show FKTABLE +SELECT * from FKTABLE; + +-- Try to update something that will cascade +UPDATE PKTABLE set ptest2=5 where ptest2=2; + +-- Try to update something that should not cascade +UPDATE PKTABLE set ptest1=1 WHERE ptest2=3; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +-- Try to delete something that should cascade +DELETE FROM PKTABLE where ptest1=1 and ptest2=5 and ptest3=3; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +-- Try to delete something that should not have a cascade +DELETE FROM PKTABLE where ptest1=2; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- set null update / set default delete +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, PRIMARY KEY(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int DEFAULT 0, ftest2 int, ftest3 int, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE + ON DELETE SET DEFAULT ON UPDATE SET NULL); + +-- Insert Primary Key values +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, 3, 'test2'); +INSERT INTO PKTABLE VALUES (2, 3, 4, 'test3'); +INSERT INTO PKTABLE VALUES (2, 4, 5, 'test4'); + +-- Insert Foreign Key values +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +INSERT INTO FKTABLE VALUES (2, 3, 4, 1); +INSERT INTO FKTABLE VALUES (NULL, 2, 3, 2); +INSERT INTO FKTABLE VALUES (2, NULL, 3, 3); +INSERT INTO FKTABLE VALUES (NULL, 2, 7, 4); +INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5); + +-- Insert a failed values +INSERT INTO FKTABLE VALUES (1, 2, 7, 6); + +-- Show FKTABLE +SELECT * from FKTABLE; + +-- Try to update something that will set null +UPDATE PKTABLE set ptest2=5 where ptest2=2; + +-- Try to update something that should not set null +UPDATE PKTABLE set ptest2=2 WHERE ptest2=3 and ptest1=1; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +-- Try to delete something that should set default +DELETE FROM PKTABLE where ptest1=2 and ptest2=3 and ptest3=4; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +-- Try to delete something that should not set default +DELETE FROM PKTABLE where ptest2=5; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- set default update / set null delete +CREATE TABLE PKTABLE ( ptest1 int, ptest2 int, ptest3 int, ptest4 text, PRIMARY KEY(ptest1, ptest2, ptest3) ); +CREATE TABLE FKTABLE ( ftest1 int DEFAULT 0, ftest2 int DEFAULT -1, ftest3 int DEFAULT -2, ftest4 int, CONSTRAINT constrname3 + FOREIGN KEY(ftest1, ftest2, ftest3) REFERENCES PKTABLE + ON DELETE SET NULL ON UPDATE SET DEFAULT); + +-- Insert Primary Key values +INSERT INTO PKTABLE VALUES (1, 2, 3, 'test1'); +INSERT INTO PKTABLE VALUES (1, 3, 3, 'test2'); +INSERT INTO PKTABLE VALUES (2, 3, 4, 'test3'); +INSERT INTO PKTABLE VALUES (2, 4, 5, 'test4'); +INSERT INTO PKTABLE VALUES (2, -1, 5, 'test5'); + +-- Insert Foreign Key values +INSERT INTO FKTABLE VALUES (1, 2, 3, 1); +INSERT INTO FKTABLE VALUES (2, 3, 4, 1); +INSERT INTO FKTABLE VALUES (2, 4, 5, 1); +INSERT INTO FKTABLE VALUES (NULL, 2, 3, 2); +INSERT INTO FKTABLE VALUES (2, NULL, 3, 3); +INSERT INTO FKTABLE VALUES (NULL, 2, 7, 4); +INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5); + +-- Insert a failed values +INSERT INTO FKTABLE VALUES (1, 2, 7, 6); + +-- Show FKTABLE +SELECT * from FKTABLE; + +-- Try to update something that will fail +UPDATE PKTABLE set ptest2=5 where ptest2=2; + +-- Try to update something that will set default +UPDATE PKTABLE set ptest1=0, ptest2=-1, ptest3=-2 where ptest2=2; +UPDATE PKTABLE set ptest2=10 where ptest2=4; + +-- Try to update something that should not set default +UPDATE PKTABLE set ptest2=2 WHERE ptest2=3 and ptest1=1; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +-- Try to delete something that should set null +DELETE FROM PKTABLE where ptest1=2 and ptest2=3 and ptest3=4; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +-- Try to delete something that should not set null +DELETE FROM PKTABLE where ptest2=-1 and ptest3=5; + +-- Show PKTABLE and FKTABLE +SELECT * from PKTABLE; +SELECT * from FKTABLE; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +CREATE TABLE PKTABLE (ptest1 int PRIMARY KEY); +CREATE TABLE FKTABLE_FAIL1 ( ftest1 int, CONSTRAINT fkfail1 FOREIGN KEY (ftest2) REFERENCES PKTABLE); +CREATE TABLE FKTABLE_FAIL2 ( ftest1 int, CONSTRAINT fkfail1 FOREIGN KEY (ftest1) REFERENCES PKTABLE(ptest2)); + +DROP TABLE FKTABLE_FAIL1; +DROP TABLE FKTABLE_FAIL2; +DROP TABLE PKTABLE; + +-- Test for referencing column number smaller than referenced constraint +CREATE TABLE PKTABLE (ptest1 int, ptest2 int, UNIQUE(ptest1, ptest2)); +CREATE TABLE FKTABLE_FAIL1 (ftest1 int REFERENCES pktable(ptest1)); + +DROP TABLE FKTABLE_FAIL1; +DROP TABLE PKTABLE; + +-- +-- Tests for mismatched types +-- +-- Basic one column, two table setup +CREATE TABLE PKTABLE (ptest1 int PRIMARY KEY); +INSERT INTO PKTABLE VALUES(42); +-- This next should fail, because int=inet does not exist +CREATE TABLE FKTABLE (ftest1 inet REFERENCES pktable); +-- This should also fail for the same reason, but here we +-- give the column name +CREATE TABLE FKTABLE (ftest1 inet REFERENCES pktable(ptest1)); +-- This should succeed, even though they are different types, +-- because int=int8 exists and is a member of the integer opfamily +CREATE TABLE FKTABLE (ftest1 int8 REFERENCES pktable); +-- Check it actually works +INSERT INTO FKTABLE VALUES(42); -- should succeed +INSERT INTO FKTABLE VALUES(43); -- should fail +UPDATE FKTABLE SET ftest1 = ftest1; -- should succeed +UPDATE FKTABLE SET ftest1 = ftest1 + 1; -- should fail +DROP TABLE FKTABLE; +-- This should fail, because we'd have to cast numeric to int which is +-- not an implicit coercion (or use numeric=numeric, but that's not part +-- of the integer opfamily) +CREATE TABLE FKTABLE (ftest1 numeric REFERENCES pktable); +DROP TABLE PKTABLE; +-- On the other hand, this should work because int implicitly promotes to +-- numeric, and we allow promotion on the FK side +CREATE TABLE PKTABLE (ptest1 numeric PRIMARY KEY); +INSERT INTO PKTABLE VALUES(42); +CREATE TABLE FKTABLE (ftest1 int REFERENCES pktable); +-- Check it actually works +INSERT INTO FKTABLE VALUES(42); -- should succeed +INSERT INTO FKTABLE VALUES(43); -- should fail +UPDATE FKTABLE SET ftest1 = ftest1; -- should succeed +UPDATE FKTABLE SET ftest1 = ftest1 + 1; -- should fail +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- Two columns, two tables +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, PRIMARY KEY(ptest1, ptest2)); +-- This should fail, because we just chose really odd types +CREATE TABLE FKTABLE (ftest1 cidr, ftest2 timestamp, FOREIGN KEY(ftest1, ftest2) REFERENCES pktable); +-- Again, so should this... +CREATE TABLE FKTABLE (ftest1 cidr, ftest2 timestamp, FOREIGN KEY(ftest1, ftest2) REFERENCES pktable(ptest1, ptest2)); +-- This fails because we mixed up the column ordering +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest2, ftest1) REFERENCES pktable); +-- As does this... +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest2, ftest1) REFERENCES pktable(ptest1, ptest2)); +-- And again.. +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest1, ftest2) REFERENCES pktable(ptest2, ptest1)); +-- This works... +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest2, ftest1) REFERENCES pktable(ptest2, ptest1)); +DROP TABLE FKTABLE; +-- As does this +CREATE TABLE FKTABLE (ftest1 int, ftest2 inet, FOREIGN KEY(ftest1, ftest2) REFERENCES pktable(ptest1, ptest2)); +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + +-- Two columns, same table +-- Make sure this still works... +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest3, +ptest4) REFERENCES pktable(ptest1, ptest2)); +DROP TABLE PKTABLE; +-- And this, +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest3, +ptest4) REFERENCES pktable); +DROP TABLE PKTABLE; +-- This shouldn't (mixed up columns) +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest3, +ptest4) REFERENCES pktable(ptest2, ptest1)); +-- Nor should this... (same reason, we have 4,3 referencing 1,2 which mismatches types +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest4, +ptest3) REFERENCES pktable(ptest1, ptest2)); +-- Not this one either... Same as the last one except we didn't defined the columns being referenced. +CREATE TABLE PKTABLE (ptest1 int, ptest2 inet, ptest3 int, ptest4 inet, PRIMARY KEY(ptest1, ptest2), FOREIGN KEY(ptest4, +ptest3) REFERENCES pktable); + +-- +-- Now some cases with inheritance +-- Basic 2 table case: 1 column of matching types. +create table pktable_base (base1 int not null); +create table pktable (ptest1 int, primary key(base1), unique(base1, ptest1)) inherits (pktable_base); +create table fktable (ftest1 int references pktable(base1)); +-- now some ins, upd, del +insert into pktable(base1) values (1); +insert into pktable(base1) values (2); +-- let's insert a non-existent fktable value +insert into fktable(ftest1) values (3); +-- let's make a valid row for that +insert into pktable(base1) values (3); +insert into fktable(ftest1) values (3); +-- let's try removing a row that should fail from pktable +delete from pktable where base1>2; +-- okay, let's try updating all of the base1 values to *4 +-- which should fail. +update pktable set base1=base1*4; +-- okay, let's try an update that should work. +update pktable set base1=base1*4 where base1<3; +-- and a delete that should work +delete from pktable where base1>3; +-- cleanup +drop table fktable; +delete from pktable; + +-- Now 2 columns 2 tables, matching types +create table fktable (ftest1 int, ftest2 int, foreign key(ftest1, ftest2) references pktable(base1, ptest1)); +-- now some ins, upd, del +insert into pktable(base1, ptest1) values (1, 1); +insert into pktable(base1, ptest1) values (2, 2); +-- let's insert a non-existent fktable value +insert into fktable(ftest1, ftest2) values (3, 1); +-- let's make a valid row for that +insert into pktable(base1,ptest1) values (3, 1); +insert into fktable(ftest1, ftest2) values (3, 1); +-- let's try removing a row that should fail from pktable +delete from pktable where base1>2; +-- okay, let's try updating all of the base1 values to *4 +-- which should fail. +update pktable set base1=base1*4; +-- okay, let's try an update that should work. +update pktable set base1=base1*4 where base1<3; +-- and a delete that should work +delete from pktable where base1>3; +-- cleanup +drop table fktable; +drop table pktable; +drop table pktable_base; + +-- Now we'll do one all in 1 table with 2 columns of matching types +create table pktable_base(base1 int not null, base2 int); +create table pktable(ptest1 int, ptest2 int, primary key(base1, ptest1), foreign key(base2, ptest2) references + pktable(base1, ptest1)) inherits (pktable_base); +insert into pktable (base1, ptest1, base2, ptest2) values (1, 1, 1, 1); +insert into pktable (base1, ptest1, base2, ptest2) values (2, 1, 1, 1); +insert into pktable (base1, ptest1, base2, ptest2) values (2, 2, 2, 1); +insert into pktable (base1, ptest1, base2, ptest2) values (1, 3, 2, 2); +-- fails (3,2) isn't in base1, ptest1 +insert into pktable (base1, ptest1, base2, ptest2) values (2, 3, 3, 2); +-- fails (2,2) is being referenced +delete from pktable where base1=2; +-- fails (1,1) is being referenced (twice) +update pktable set base1=3 where base1=1; +-- this sequence of two deletes will work, since after the first there will be no (2,*) references +delete from pktable where base2=2; +delete from pktable where base1=2; +drop table pktable; +drop table pktable_base; + +-- 2 columns (2 tables), mismatched types +create table pktable_base(base1 int not null); +create table pktable(ptest1 inet, primary key(base1, ptest1)) inherits (pktable_base); +-- just generally bad types (with and without column references on the referenced table) +create table fktable(ftest1 cidr, ftest2 int[], foreign key (ftest1, ftest2) references pktable); +create table fktable(ftest1 cidr, ftest2 int[], foreign key (ftest1, ftest2) references pktable(base1, ptest1)); +-- let's mix up which columns reference which +create table fktable(ftest1 int, ftest2 inet, foreign key(ftest2, ftest1) references pktable); +create table fktable(ftest1 int, ftest2 inet, foreign key(ftest2, ftest1) references pktable(base1, ptest1)); +create table fktable(ftest1 int, ftest2 inet, foreign key(ftest1, ftest2) references pktable(ptest1, base1)); +drop table pktable; +drop table pktable_base; + +-- 2 columns (1 table), mismatched types +create table pktable_base(base1 int not null, base2 int); +create table pktable(ptest1 inet, ptest2 inet[], primary key(base1, ptest1), foreign key(base2, ptest2) references + pktable(base1, ptest1)) inherits (pktable_base); +create table pktable(ptest1 inet, ptest2 inet, primary key(base1, ptest1), foreign key(base2, ptest2) references + pktable(ptest1, base1)) inherits (pktable_base); +create table pktable(ptest1 inet, ptest2 inet, primary key(base1, ptest1), foreign key(ptest2, base2) references + pktable(base1, ptest1)) inherits (pktable_base); +create table pktable(ptest1 inet, ptest2 inet, primary key(base1, ptest1), foreign key(ptest2, base2) references + pktable(base1, ptest1)) inherits (pktable_base); +drop table pktable; +drop table pktable_base; + +-- +-- Deferrable constraints +-- + +-- deferrable, explicitly deferred +CREATE TABLE pktable ( + id INT4 PRIMARY KEY, + other INT4 +); + +CREATE TABLE fktable ( + id INT4 PRIMARY KEY, + fk INT4 REFERENCES pktable DEFERRABLE +); + +-- default to immediate: should fail +INSERT INTO fktable VALUES (5, 10); + +-- explicitly defer the constraint +BEGIN; + +SET CONSTRAINTS ALL DEFERRED; + +INSERT INTO fktable VALUES (10, 15); +INSERT INTO pktable VALUES (15, 0); -- make the FK insert valid + +COMMIT; + +DROP TABLE fktable, pktable; + +-- deferrable, initially deferred +CREATE TABLE pktable ( + id INT4 PRIMARY KEY, + other INT4 +); + +CREATE TABLE fktable ( + id INT4 PRIMARY KEY, + fk INT4 REFERENCES pktable DEFERRABLE INITIALLY DEFERRED +); + +-- default to deferred, should succeed +BEGIN; + +INSERT INTO fktable VALUES (100, 200); +INSERT INTO pktable VALUES (200, 500); -- make the FK insert valid + +COMMIT; + +-- default to deferred, explicitly make immediate +BEGIN; + +SET CONSTRAINTS ALL IMMEDIATE; + +-- should fail +INSERT INTO fktable VALUES (500, 1000); + +COMMIT; + +DROP TABLE fktable, pktable; + +-- tricky behavior: according to SQL99, if a deferred constraint is set +-- to 'immediate' mode, it should be checked for validity *immediately*, +-- not when the current transaction commits (i.e. the mode change applies +-- retroactively) +CREATE TABLE pktable ( + id INT4 PRIMARY KEY, + other INT4 +); + +CREATE TABLE fktable ( + id INT4 PRIMARY KEY, + fk INT4 REFERENCES pktable DEFERRABLE +); + +BEGIN; + +SET CONSTRAINTS ALL DEFERRED; + +-- should succeed, for now +INSERT INTO fktable VALUES (1000, 2000); + +-- should cause transaction abort, due to preceding error +SET CONSTRAINTS ALL IMMEDIATE; + +INSERT INTO pktable VALUES (2000, 3); -- too late + +COMMIT; + +DROP TABLE fktable, pktable; + +-- deferrable, initially deferred +CREATE TABLE pktable ( + id INT4 PRIMARY KEY, + other INT4 +); + +CREATE TABLE fktable ( + id INT4 PRIMARY KEY, + fk INT4 REFERENCES pktable DEFERRABLE INITIALLY DEFERRED +); + +BEGIN; + +-- no error here +INSERT INTO fktable VALUES (100, 200); + +-- error here on commit +COMMIT; + +DROP TABLE pktable, fktable; + +-- test notice about expensive referential integrity checks, +-- where the index cannot be used because of type incompatibilities. + +CREATE TEMP TABLE pktable ( + id1 INT4 PRIMARY KEY, + id2 VARCHAR(4) UNIQUE, + id3 REAL UNIQUE, + UNIQUE(id1, id2, id3) +); + +CREATE TEMP TABLE fktable ( + x1 INT4 REFERENCES pktable(id1), + x2 VARCHAR(4) REFERENCES pktable(id2), + x3 REAL REFERENCES pktable(id3), + x4 TEXT, + x5 INT2 +); + +-- check individual constraints with alter table. + +-- should fail + +-- varchar does not promote to real +ALTER TABLE fktable ADD CONSTRAINT fk_2_3 +FOREIGN KEY (x2) REFERENCES pktable(id3); + +-- nor to int4 +ALTER TABLE fktable ADD CONSTRAINT fk_2_1 +FOREIGN KEY (x2) REFERENCES pktable(id1); + +-- real does not promote to int4 +ALTER TABLE fktable ADD CONSTRAINT fk_3_1 +FOREIGN KEY (x3) REFERENCES pktable(id1); + +-- int4 does not promote to text +ALTER TABLE fktable ADD CONSTRAINT fk_1_2 +FOREIGN KEY (x1) REFERENCES pktable(id2); + +-- should succeed + +-- int4 promotes to real +ALTER TABLE fktable ADD CONSTRAINT fk_1_3 +FOREIGN KEY (x1) REFERENCES pktable(id3); + +-- text is compatible with varchar +ALTER TABLE fktable ADD CONSTRAINT fk_4_2 +FOREIGN KEY (x4) REFERENCES pktable(id2); + +-- int2 is part of integer opfamily as of 8.0 +ALTER TABLE fktable ADD CONSTRAINT fk_5_1 +FOREIGN KEY (x5) REFERENCES pktable(id1); + +-- check multikey cases, especially out-of-order column lists + +-- these should work + +ALTER TABLE fktable ADD CONSTRAINT fk_123_123 +FOREIGN KEY (x1,x2,x3) REFERENCES pktable(id1,id2,id3); + +ALTER TABLE fktable ADD CONSTRAINT fk_213_213 +FOREIGN KEY (x2,x1,x3) REFERENCES pktable(id2,id1,id3); + +ALTER TABLE fktable ADD CONSTRAINT fk_253_213 +FOREIGN KEY (x2,x5,x3) REFERENCES pktable(id2,id1,id3); + +-- these should fail + +ALTER TABLE fktable ADD CONSTRAINT fk_123_231 +FOREIGN KEY (x1,x2,x3) REFERENCES pktable(id2,id3,id1); + +ALTER TABLE fktable ADD CONSTRAINT fk_241_132 +FOREIGN KEY (x2,x4,x1) REFERENCES pktable(id1,id3,id2); + +DROP TABLE pktable, fktable; + +-- test a tricky case: we can elide firing the FK check trigger during +-- an UPDATE if the UPDATE did not change the foreign key +-- field. However, we can't do this if our transaction was the one that +-- created the updated row and the trigger is deferred, since our UPDATE +-- will have invalidated the original newly-inserted tuple, and therefore +-- cause the on-INSERT RI trigger not to be fired. + +CREATE TEMP TABLE pktable ( + id int primary key, + other int +); + +CREATE TEMP TABLE fktable ( + id int primary key, + fk int references pktable deferrable initially deferred +); + +INSERT INTO pktable VALUES (5, 10); + +BEGIN; + +-- doesn't match PK, but no error yet +INSERT INTO fktable VALUES (0, 20); + +-- don't change FK +UPDATE fktable SET id = id + 1; + +-- should catch error from initial INSERT +COMMIT; + +-- check same case when insert is in a different subtransaction than update + +BEGIN; + +-- doesn't match PK, but no error yet +INSERT INTO fktable VALUES (0, 20); + +-- UPDATE will be in a subxact +SAVEPOINT savept1; + +-- don't change FK +UPDATE fktable SET id = id + 1; + +-- should catch error from initial INSERT +COMMIT; + +BEGIN; + +-- INSERT will be in a subxact +SAVEPOINT savept1; + +-- doesn't match PK, but no error yet +INSERT INTO fktable VALUES (0, 20); + +RELEASE SAVEPOINT savept1; + +-- don't change FK +UPDATE fktable SET id = id + 1; + +-- should catch error from initial INSERT +COMMIT; + +BEGIN; + +-- doesn't match PK, but no error yet +INSERT INTO fktable VALUES (0, 20); + +-- UPDATE will be in a subxact +SAVEPOINT savept1; + +-- don't change FK +UPDATE fktable SET id = id + 1; + +-- Roll back the UPDATE +ROLLBACK TO savept1; + +-- should catch error from initial INSERT +COMMIT; + +-- +-- check ALTER CONSTRAINT +-- + +INSERT INTO fktable VALUES (1, 5); + +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey DEFERRABLE INITIALLY IMMEDIATE; + +BEGIN; + +-- doesn't match FK, should throw error now +UPDATE pktable SET id = 10 WHERE id = 5; + +COMMIT; + +BEGIN; + +-- doesn't match PK, should throw error now +INSERT INTO fktable VALUES (0, 20); + +COMMIT; + +-- try additional syntax +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE; +-- illegal option +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY DEFERRED; + +-- test order of firing of FK triggers when several RI-induced changes need to +-- be made to the same row. This was broken by subtransaction-related +-- changes in 8.0. + +CREATE TEMP TABLE users ( + id INT PRIMARY KEY, + name VARCHAR NOT NULL +); + +INSERT INTO users VALUES (1, 'Jozko'); +INSERT INTO users VALUES (2, 'Ferko'); +INSERT INTO users VALUES (3, 'Samko'); + +CREATE TEMP TABLE tasks ( + id INT PRIMARY KEY, + owner INT REFERENCES users ON UPDATE CASCADE ON DELETE SET NULL, + worker INT REFERENCES users ON UPDATE CASCADE ON DELETE SET NULL, + checked_by INT REFERENCES users ON UPDATE CASCADE ON DELETE SET NULL +); + +INSERT INTO tasks VALUES (1,1,NULL,NULL); +INSERT INTO tasks VALUES (2,2,2,NULL); +INSERT INTO tasks VALUES (3,3,3,3); + +SELECT * FROM tasks; + +UPDATE users SET id = 4 WHERE id = 3; + +SELECT * FROM tasks; + +DELETE FROM users WHERE id = 4; + +SELECT * FROM tasks; + +-- could fail with only 2 changes to make, if row was already updated +BEGIN; +UPDATE tasks set id=id WHERE id=2; +SELECT * FROM tasks; +DELETE FROM users WHERE id = 2; +SELECT * FROM tasks; +COMMIT; + +-- +-- Test self-referential FK with CASCADE (bug #6268) +-- +create temp table selfref ( + a int primary key, + b int, + foreign key (b) references selfref (a) + on update cascade on delete cascade +); + +insert into selfref (a, b) +values + (0, 0), + (1, 1); + +begin; + update selfref set a = 123 where a = 0; + select a, b from selfref; + update selfref set a = 456 where a = 123; + select a, b from selfref; +commit; + +-- +-- Test that SET DEFAULT actions recognize updates to default values +-- +create temp table defp (f1 int primary key); +create temp table defc (f1 int default 0 + references defp on delete set default); +insert into defp values (0), (1), (2); +insert into defc values (2); +select * from defc; +delete from defp where f1 = 2; +select * from defc; +delete from defp where f1 = 0; -- fail +alter table defc alter column f1 set default 1; +delete from defp where f1 = 0; +select * from defc; +delete from defp where f1 = 1; -- fail + +-- +-- Test the difference between NO ACTION and RESTRICT +-- +create temp table pp (f1 int primary key); +create temp table cc (f1 int references pp on update no action on delete no action); +insert into pp values(12); +insert into pp values(11); +update pp set f1=f1+1; +insert into cc values(13); +update pp set f1=f1+1; +update pp set f1=f1+1; -- fail +delete from pp where f1 = 13; -- fail +drop table pp, cc; + +create temp table pp (f1 int primary key); +create temp table cc (f1 int references pp on update restrict on delete restrict); +insert into pp values(12); +insert into pp values(11); +update pp set f1=f1+1; +insert into cc values(13); +update pp set f1=f1+1; -- fail +delete from pp where f1 = 13; -- fail +drop table pp, cc; + +-- +-- Test interaction of foreign-key optimization with rules (bug #14219) +-- +create temp table t1 (a integer primary key, b text); +create temp table t2 (a integer primary key, b integer references t1); +create rule r1 as on delete to t1 do delete from t2 where t2.b = old.a; + +explain (costs off) delete from t1 where a = 1; +delete from t1 where a = 1; + +-- Test a primary key with attributes located in later attnum positions +-- compared to the fk attributes. +create table pktable2 (a int, b int, c int, d int, e int, primary key (d, e)); +create table fktable2 (d int, e int, foreign key (d, e) references pktable2); +insert into pktable2 values (1, 2, 3, 4, 5); +insert into fktable2 values (4, 5); +delete from pktable2; +update pktable2 set d = 5; +drop table pktable2, fktable2; + +-- Test truncation of long foreign key names +create table pktable1 (a int primary key); +create table pktable2 (a int, b int, primary key (a, b)); +create table fktable2 ( + a int, + b int, + very_very_long_column_name_to_exceed_63_characters int, + foreign key (very_very_long_column_name_to_exceed_63_characters) references pktable1, + foreign key (a, very_very_long_column_name_to_exceed_63_characters) references pktable2, + foreign key (a, very_very_long_column_name_to_exceed_63_characters) references pktable2 +); +select conname from pg_constraint where conrelid = 'fktable2'::regclass order by conname; +drop table pktable1, pktable2, fktable2; + +-- +-- Test deferred FK check on a tuple deleted by a rolled-back subtransaction +-- +create table pktable2(f1 int primary key); +create table fktable2(f1 int references pktable2 deferrable initially deferred); +insert into pktable2 values(1); + +begin; +insert into fktable2 values(1); +savepoint x; +delete from fktable2; +rollback to x; +commit; + +begin; +insert into fktable2 values(2); +savepoint x; +delete from fktable2; +rollback to x; +commit; -- fail + +-- +-- Test that we prevent dropping FK constraint with pending trigger events +-- +begin; +insert into fktable2 values(2); +alter table fktable2 drop constraint fktable2_f1_fkey; +commit; + +begin; +delete from pktable2 where f1 = 1; +alter table fktable2 drop constraint fktable2_f1_fkey; +commit; + +drop table pktable2, fktable2; + +-- +-- Test keys that "look" different but compare as equal +-- +create table pktable2 (a float8, b float8, primary key (a, b)); +create table fktable2 (x float8, y float8, foreign key (x, y) references pktable2 (a, b) on update cascade); + +insert into pktable2 values ('-0', '-0'); +insert into fktable2 values ('-0', '-0'); + +select * from pktable2; +select * from fktable2; + +update pktable2 set a = '0' where a = '-0'; + +select * from pktable2; +-- should have updated fktable2.x +select * from fktable2; + +drop table pktable2, fktable2; + + +-- +-- Foreign keys and partitioned tables +-- + +-- Creation of a partitioned hierarchy with irregular definitions +CREATE TABLE fk_notpartitioned_pk (fdrop1 int, a int, fdrop2 int, b int, + PRIMARY KEY (a, b)); +ALTER TABLE fk_notpartitioned_pk DROP COLUMN fdrop1, DROP COLUMN fdrop2; +CREATE TABLE fk_partitioned_fk (b int, fdrop1 int, a int) PARTITION BY RANGE (a, b); +ALTER TABLE fk_partitioned_fk DROP COLUMN fdrop1; +CREATE TABLE fk_partitioned_fk_1 (fdrop1 int, fdrop2 int, a int, fdrop3 int, b int); +ALTER TABLE fk_partitioned_fk_1 DROP COLUMN fdrop1, DROP COLUMN fdrop2, DROP COLUMN fdrop3; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_1 FOR VALUES FROM (0,0) TO (1000,1000); +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk; +CREATE TABLE fk_partitioned_fk_2 (b int, fdrop1 int, fdrop2 int, a int); +ALTER TABLE fk_partitioned_fk_2 DROP COLUMN fdrop1, DROP COLUMN fdrop2; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 FOR VALUES FROM (1000,1000) TO (2000,2000); + +CREATE TABLE fk_partitioned_fk_3 (fdrop1 int, fdrop2 int, fdrop3 int, fdrop4 int, b int, a int) + PARTITION BY HASH (a); +ALTER TABLE fk_partitioned_fk_3 DROP COLUMN fdrop1, DROP COLUMN fdrop2, + DROP COLUMN fdrop3, DROP COLUMN fdrop4; +CREATE TABLE fk_partitioned_fk_3_0 PARTITION OF fk_partitioned_fk_3 FOR VALUES WITH (MODULUS 5, REMAINDER 0); +CREATE TABLE fk_partitioned_fk_3_1 PARTITION OF fk_partitioned_fk_3 FOR VALUES WITH (MODULUS 5, REMAINDER 1); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_3 + FOR VALUES FROM (2000,2000) TO (3000,3000); + +-- Creating a foreign key with ONLY on a partitioned table referencing +-- a non-partitioned table fails. +ALTER TABLE ONLY fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk; +-- Adding a NOT VALID foreign key on a partitioned table referencing +-- a non-partitioned table fails. +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk NOT VALID; + +-- these inserts, targeting both the partition directly as well as the +-- partitioned table, should all fail +INSERT INTO fk_partitioned_fk (a,b) VALUES (500, 501); +INSERT INTO fk_partitioned_fk_1 (a,b) VALUES (500, 501); +INSERT INTO fk_partitioned_fk (a,b) VALUES (1500, 1501); +INSERT INTO fk_partitioned_fk_2 (a,b) VALUES (1500, 1501); +INSERT INTO fk_partitioned_fk (a,b) VALUES (2500, 2502); +INSERT INTO fk_partitioned_fk_3 (a,b) VALUES (2500, 2502); +INSERT INTO fk_partitioned_fk (a,b) VALUES (2501, 2503); +INSERT INTO fk_partitioned_fk_3 (a,b) VALUES (2501, 2503); + +-- but if we insert the values that make them valid, then they work +INSERT INTO fk_notpartitioned_pk VALUES (500, 501), (1500, 1501), + (2500, 2502), (2501, 2503); +INSERT INTO fk_partitioned_fk (a,b) VALUES (500, 501); +INSERT INTO fk_partitioned_fk (a,b) VALUES (1500, 1501); +INSERT INTO fk_partitioned_fk (a,b) VALUES (2500, 2502); +INSERT INTO fk_partitioned_fk (a,b) VALUES (2501, 2503); + +-- this update fails because there is no referenced row +UPDATE fk_partitioned_fk SET a = a + 1 WHERE a = 2501; +-- but we can fix it thusly: +INSERT INTO fk_notpartitioned_pk (a,b) VALUES (2502, 2503); +UPDATE fk_partitioned_fk SET a = a + 1 WHERE a = 2501; + +-- these updates would leave lingering rows in the referencing table; disallow +UPDATE fk_notpartitioned_pk SET b = 502 WHERE a = 500; +UPDATE fk_notpartitioned_pk SET b = 1502 WHERE a = 1500; +UPDATE fk_notpartitioned_pk SET b = 2504 WHERE a = 2500; +-- check psql behavior +\d fk_notpartitioned_pk +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +-- done. +DROP TABLE fk_notpartitioned_pk, fk_partitioned_fk; + +-- Altering a type referenced by a foreign key needs to drop/recreate the FK. +-- Ensure that works. +CREATE TABLE fk_notpartitioned_pk (a INT, PRIMARY KEY(a), CHECK (a > 0)); +CREATE TABLE fk_partitioned_fk (a INT REFERENCES fk_notpartitioned_pk(a) PRIMARY KEY) PARTITION BY RANGE(a); +CREATE TABLE fk_partitioned_fk_1 PARTITION OF fk_partitioned_fk FOR VALUES FROM (MINVALUE) TO (MAXVALUE); +INSERT INTO fk_notpartitioned_pk VALUES (1); +INSERT INTO fk_partitioned_fk VALUES (1); +ALTER TABLE fk_notpartitioned_pk ALTER COLUMN a TYPE bigint; +DELETE FROM fk_notpartitioned_pk WHERE a = 1; +DROP TABLE fk_notpartitioned_pk, fk_partitioned_fk; + +-- Test some other exotic foreign key features: MATCH SIMPLE, ON UPDATE/DELETE +-- actions +CREATE TABLE fk_notpartitioned_pk (a int, b int, primary key (a, b)); +CREATE TABLE fk_partitioned_fk (a int default 2501, b int default 142857) PARTITION BY LIST (a); +CREATE TABLE fk_partitioned_fk_1 PARTITION OF fk_partitioned_fk FOR VALUES IN (NULL,500,501,502); +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk MATCH SIMPLE + ON DELETE SET NULL ON UPDATE SET NULL; +CREATE TABLE fk_partitioned_fk_2 PARTITION OF fk_partitioned_fk FOR VALUES IN (1500,1502); +CREATE TABLE fk_partitioned_fk_3 (a int, b int); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_3 FOR VALUES IN (2500,2501,2502,2503); + +-- this insert fails +INSERT INTO fk_partitioned_fk (a, b) VALUES (2502, 2503); +INSERT INTO fk_partitioned_fk_3 (a, b) VALUES (2502, 2503); +-- but since the FK is MATCH SIMPLE, this one doesn't +INSERT INTO fk_partitioned_fk_3 (a, b) VALUES (2502, NULL); +-- now create the referenced row ... +INSERT INTO fk_notpartitioned_pk VALUES (2502, 2503); +--- and now the same insert work +INSERT INTO fk_partitioned_fk_3 (a, b) VALUES (2502, 2503); +-- this always works +INSERT INTO fk_partitioned_fk (a,b) VALUES (NULL, NULL); + +-- MATCH FULL +INSERT INTO fk_notpartitioned_pk VALUES (1, 2); +CREATE TABLE fk_partitioned_fk_full (x int, y int) PARTITION BY RANGE (x); +CREATE TABLE fk_partitioned_fk_full_1 PARTITION OF fk_partitioned_fk_full DEFAULT; +INSERT INTO fk_partitioned_fk_full VALUES (1, NULL); +ALTER TABLE fk_partitioned_fk_full ADD FOREIGN KEY (x, y) REFERENCES fk_notpartitioned_pk MATCH FULL; -- fails +TRUNCATE fk_partitioned_fk_full; +ALTER TABLE fk_partitioned_fk_full ADD FOREIGN KEY (x, y) REFERENCES fk_notpartitioned_pk MATCH FULL; +INSERT INTO fk_partitioned_fk_full VALUES (1, NULL); -- fails +DROP TABLE fk_partitioned_fk_full; + +-- ON UPDATE SET NULL +SELECT tableoid::regclass, a, b FROM fk_partitioned_fk WHERE b IS NULL ORDER BY a; +UPDATE fk_notpartitioned_pk SET a = a + 1 WHERE a = 2502; +SELECT tableoid::regclass, a, b FROM fk_partitioned_fk WHERE b IS NULL ORDER BY a; + +-- ON DELETE SET NULL +INSERT INTO fk_partitioned_fk VALUES (2503, 2503); +SELECT count(*) FROM fk_partitioned_fk WHERE a IS NULL; +DELETE FROM fk_notpartitioned_pk; +SELECT count(*) FROM fk_partitioned_fk WHERE a IS NULL; + +-- ON UPDATE/DELETE SET DEFAULT +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk + ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; +INSERT INTO fk_notpartitioned_pk VALUES (2502, 2503); +INSERT INTO fk_partitioned_fk_3 (a, b) VALUES (2502, 2503); +-- this fails, because the defaults for the referencing table are not present +-- in the referenced table: +UPDATE fk_notpartitioned_pk SET a = 1500 WHERE a = 2502; +-- but inserting the row we can make it work: +INSERT INTO fk_notpartitioned_pk VALUES (2501, 142857); +UPDATE fk_notpartitioned_pk SET a = 1500 WHERE a = 2502; +SELECT * FROM fk_partitioned_fk WHERE b = 142857; + +-- ON UPDATE/DELETE CASCADE +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk + ON DELETE CASCADE ON UPDATE CASCADE; +UPDATE fk_notpartitioned_pk SET a = 2502 WHERE a = 2501; +SELECT * FROM fk_partitioned_fk WHERE b = 142857; + +-- Now you see it ... +SELECT * FROM fk_partitioned_fk WHERE b = 142857; +DELETE FROM fk_notpartitioned_pk WHERE b = 142857; +-- now you don't. +SELECT * FROM fk_partitioned_fk WHERE a = 142857; + +-- verify that DROP works +DROP TABLE fk_partitioned_fk_2; + +-- Test behavior of the constraint together with attaching and detaching +-- partitions. +CREATE TABLE fk_partitioned_fk_2 PARTITION OF fk_partitioned_fk FOR VALUES IN (1500,1502); +ALTER TABLE fk_partitioned_fk DETACH PARTITION fk_partitioned_fk_2; +BEGIN; +DROP TABLE fk_partitioned_fk; +-- constraint should still be there +\d fk_partitioned_fk_2; +ROLLBACK; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 FOR VALUES IN (1500,1502); +DROP TABLE fk_partitioned_fk_2; +CREATE TABLE fk_partitioned_fk_2 (b int, c text, a int, + FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk ON UPDATE CASCADE ON DELETE CASCADE); +ALTER TABLE fk_partitioned_fk_2 DROP COLUMN c; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 FOR VALUES IN (1500,1502); +-- should have only one constraint +\d fk_partitioned_fk_2 +DROP TABLE fk_partitioned_fk_2; + +CREATE TABLE fk_partitioned_fk_4 (a int, b int, FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE) PARTITION BY RANGE (b, a); +CREATE TABLE fk_partitioned_fk_4_1 PARTITION OF fk_partitioned_fk_4 FOR VALUES FROM (1,1) TO (100,100); +CREATE TABLE fk_partitioned_fk_4_2 (a int, b int, FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE SET NULL); +ALTER TABLE fk_partitioned_fk_4 ATTACH PARTITION fk_partitioned_fk_4_2 FOR VALUES FROM (100,100) TO (1000,1000); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_4 FOR VALUES IN (3500,3502); +ALTER TABLE fk_partitioned_fk DETACH PARTITION fk_partitioned_fk_4; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_4 FOR VALUES IN (3500,3502); +-- should only have one constraint +\d fk_partitioned_fk_4 +\d fk_partitioned_fk_4_1 +-- this one has an FK with mismatched properties +\d fk_partitioned_fk_4_2 + +CREATE TABLE fk_partitioned_fk_5 (a int, b int, + FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, + FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk(a, b) MATCH FULL ON UPDATE CASCADE ON DELETE CASCADE) + PARTITION BY RANGE (a); +CREATE TABLE fk_partitioned_fk_5_1 (a int, b int, FOREIGN KEY (a, b) REFERENCES fk_notpartitioned_pk); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_5 FOR VALUES IN (4500); +ALTER TABLE fk_partitioned_fk_5 ATTACH PARTITION fk_partitioned_fk_5_1 FOR VALUES FROM (0) TO (10); +ALTER TABLE fk_partitioned_fk DETACH PARTITION fk_partitioned_fk_5; +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_5 FOR VALUES IN (4500); +-- this one has two constraints, similar but not quite the one in the parent, +-- so it gets a new one +\d fk_partitioned_fk_5 +-- verify that it works to reattaching a child with multiple candidate +-- constraints +ALTER TABLE fk_partitioned_fk_5 DETACH PARTITION fk_partitioned_fk_5_1; +ALTER TABLE fk_partitioned_fk_5 ATTACH PARTITION fk_partitioned_fk_5_1 FOR VALUES FROM (0) TO (10); +\d fk_partitioned_fk_5_1 + +-- verify that attaching a table checks that the existing data satisfies the +-- constraint +CREATE TABLE fk_partitioned_fk_2 (a int, b int) PARTITION BY RANGE (b); +CREATE TABLE fk_partitioned_fk_2_1 PARTITION OF fk_partitioned_fk_2 FOR VALUES FROM (0) TO (1000); +CREATE TABLE fk_partitioned_fk_2_2 PARTITION OF fk_partitioned_fk_2 FOR VALUES FROM (1000) TO (2000); +INSERT INTO fk_partitioned_fk_2 VALUES (1600, 601), (1600, 1601); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 + FOR VALUES IN (1600); +INSERT INTO fk_notpartitioned_pk VALUES (1600, 601), (1600, 1601); +ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 + FOR VALUES IN (1600); + +-- leave these tables around intentionally + +-- test the case when the referenced table is owned by a different user +create role regress_other_partitioned_fk_owner; +grant references on fk_notpartitioned_pk to regress_other_partitioned_fk_owner; +set role regress_other_partitioned_fk_owner; +create table other_partitioned_fk(a int, b int) partition by list (a); +create table other_partitioned_fk_1 partition of other_partitioned_fk + for values in (2048); +insert into other_partitioned_fk + select 2048, x from generate_series(1,10) x; +-- this should fail +alter table other_partitioned_fk add foreign key (a, b) + references fk_notpartitioned_pk(a, b); +-- add the missing keys and retry +reset role; +insert into fk_notpartitioned_pk (a, b) + select 2048, x from generate_series(1,10) x; +set role regress_other_partitioned_fk_owner; +alter table other_partitioned_fk add foreign key (a, b) + references fk_notpartitioned_pk(a, b); +-- clean up +drop table other_partitioned_fk; +reset role; +revoke all on fk_notpartitioned_pk from regress_other_partitioned_fk_owner; +drop role regress_other_partitioned_fk_owner; + +-- Test creating a constraint at the parent that already exists in partitions. +-- There should be no duplicated constraints, and attempts to drop the +-- constraint in partitions should raise appropriate errors. +create schema fkpart0 + create table pkey (a int primary key) + create table fk_part (a int) partition by list (a) + create table fk_part_1 partition of fk_part + (foreign key (a) references fkpart0.pkey) for values in (1) + create table fk_part_23 partition of fk_part + (foreign key (a) references fkpart0.pkey) for values in (2, 3) + partition by list (a) + create table fk_part_23_2 partition of fk_part_23 for values in (2); + +alter table fkpart0.fk_part add foreign key (a) references fkpart0.pkey; +\d fkpart0.fk_part_1 \\ -- should have only one FK +alter table fkpart0.fk_part_1 drop constraint fk_part_1_a_fkey; + +\d fkpart0.fk_part_23 \\ -- should have only one FK +\d fkpart0.fk_part_23_2 \\ -- should have only one FK +alter table fkpart0.fk_part_23 drop constraint fk_part_23_a_fkey; +alter table fkpart0.fk_part_23_2 drop constraint fk_part_23_a_fkey; + +create table fkpart0.fk_part_4 partition of fkpart0.fk_part for values in (4); +\d fkpart0.fk_part_4 +alter table fkpart0.fk_part_4 drop constraint fk_part_a_fkey; + +create table fkpart0.fk_part_56 partition of fkpart0.fk_part + for values in (5,6) partition by list (a); +create table fkpart0.fk_part_56_5 partition of fkpart0.fk_part_56 + for values in (5); +\d fkpart0.fk_part_56 +alter table fkpart0.fk_part_56 drop constraint fk_part_a_fkey; +alter table fkpart0.fk_part_56_5 drop constraint fk_part_a_fkey; + +-- verify that attaching and detaching partitions maintains the right set of +-- triggers +create schema fkpart1 + create table pkey (a int primary key) + create table fk_part (a int) partition by list (a) + create table fk_part_1 partition of fk_part for values in (1) partition by list (a) + create table fk_part_1_1 partition of fk_part_1 for values in (1); +alter table fkpart1.fk_part add foreign key (a) references fkpart1.pkey; +insert into fkpart1.fk_part values (1); -- should fail +insert into fkpart1.pkey values (1); +insert into fkpart1.fk_part values (1); +delete from fkpart1.pkey where a = 1; -- should fail +alter table fkpart1.fk_part detach partition fkpart1.fk_part_1; +create table fkpart1.fk_part_1_2 partition of fkpart1.fk_part_1 for values in (2); +insert into fkpart1.fk_part_1 values (2); -- should fail +delete from fkpart1.pkey where a = 1; + +-- verify that attaching and detaching partitions manipulates the inheritance +-- properties of their FK constraints correctly +create schema fkpart2 + create table pkey (a int primary key) + create table fk_part (a int, constraint fkey foreign key (a) references fkpart2.pkey) partition by list (a) + create table fk_part_1 partition of fkpart2.fk_part for values in (1) partition by list (a) + create table fk_part_1_1 (a int, constraint my_fkey foreign key (a) references fkpart2.pkey); +alter table fkpart2.fk_part_1 attach partition fkpart2.fk_part_1_1 for values in (1); +alter table fkpart2.fk_part_1 drop constraint fkey; -- should fail +alter table fkpart2.fk_part_1_1 drop constraint my_fkey; -- should fail +alter table fkpart2.fk_part detach partition fkpart2.fk_part_1; +alter table fkpart2.fk_part_1 drop constraint fkey; -- ok +alter table fkpart2.fk_part_1_1 drop constraint my_fkey; -- doesn't exist + +-- verify constraint deferrability +create schema fkpart3 + create table pkey (a int primary key) + create table fk_part (a int, constraint fkey foreign key (a) references fkpart3.pkey deferrable initially immediate) partition by list (a) + create table fk_part_1 partition of fkpart3.fk_part for values in (1) partition by list (a) + create table fk_part_1_1 partition of fkpart3.fk_part_1 for values in (1) + create table fk_part_2 partition of fkpart3.fk_part for values in (2); +begin; +set constraints fkpart3.fkey deferred; +insert into fkpart3.fk_part values (1); +insert into fkpart3.pkey values (1); +commit; +begin; +set constraints fkpart3.fkey deferred; +delete from fkpart3.pkey; +delete from fkpart3.fk_part; +commit; + +drop schema fkpart0, fkpart1, fkpart2, fkpart3 cascade; + +-- Test a partitioned table as referenced table. + +-- Verify basic functionality with a regular partition creation and a partition +-- with a different column layout, as well as partitions added (created and +-- attached) after creating the foreign key. +CREATE SCHEMA fkpart3; +SET search_path TO fkpart3; + +CREATE TABLE pk (a int PRIMARY KEY) PARTITION BY RANGE (a); +CREATE TABLE pk1 PARTITION OF pk FOR VALUES FROM (0) TO (1000); +CREATE TABLE pk2 (b int, a int); +ALTER TABLE pk2 DROP COLUMN b; +ALTER TABLE pk2 ALTER a SET NOT NULL; +ALTER TABLE pk ATTACH PARTITION pk2 FOR VALUES FROM (1000) TO (2000); + +CREATE TABLE fk (a int) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (0) TO (750); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk; +CREATE TABLE fk2 (b int, a int) ; +ALTER TABLE fk2 DROP COLUMN b; +ALTER TABLE fk ATTACH PARTITION fk2 FOR VALUES FROM (750) TO (3500); + +CREATE TABLE pk3 PARTITION OF pk FOR VALUES FROM (2000) TO (3000); +CREATE TABLE pk4 (LIKE pk); +ALTER TABLE pk ATTACH PARTITION pk4 FOR VALUES FROM (3000) TO (4000); + +CREATE TABLE pk5 (c int, b int, a int NOT NULL) PARTITION BY RANGE (a); +ALTER TABLE pk5 DROP COLUMN b, DROP COLUMN c; +CREATE TABLE pk51 PARTITION OF pk5 FOR VALUES FROM (4000) TO (4500); +CREATE TABLE pk52 PARTITION OF pk5 FOR VALUES FROM (4500) TO (5000); +ALTER TABLE pk ATTACH PARTITION pk5 FOR VALUES FROM (4000) TO (5000); + +CREATE TABLE fk3 PARTITION OF fk FOR VALUES FROM (3500) TO (5000); + +-- these should fail: referenced value not present +INSERT into fk VALUES (1); +INSERT into fk VALUES (1000); +INSERT into fk VALUES (2000); +INSERT into fk VALUES (3000); +INSERT into fk VALUES (4000); +INSERT into fk VALUES (4500); +-- insert into the referenced table, now they should work +INSERT into pk VALUES (1), (1000), (2000), (3000), (4000), (4500); +INSERT into fk VALUES (1), (1000), (2000), (3000), (4000), (4500); + +-- should fail: referencing value present +DELETE FROM pk WHERE a = 1; +DELETE FROM pk WHERE a = 1000; +DELETE FROM pk WHERE a = 2000; +DELETE FROM pk WHERE a = 3000; +DELETE FROM pk WHERE a = 4000; +DELETE FROM pk WHERE a = 4500; +UPDATE pk SET a = 2 WHERE a = 1; +UPDATE pk SET a = 1002 WHERE a = 1000; +UPDATE pk SET a = 2002 WHERE a = 2000; +UPDATE pk SET a = 3002 WHERE a = 3000; +UPDATE pk SET a = 4002 WHERE a = 4000; +UPDATE pk SET a = 4502 WHERE a = 4500; +-- now they should work +DELETE FROM fk; +UPDATE pk SET a = 2 WHERE a = 1; +DELETE FROM pk WHERE a = 2; +UPDATE pk SET a = 1002 WHERE a = 1000; +DELETE FROM pk WHERE a = 1002; +UPDATE pk SET a = 2002 WHERE a = 2000; +DELETE FROM pk WHERE a = 2002; +UPDATE pk SET a = 3002 WHERE a = 3000; +DELETE FROM pk WHERE a = 3002; +UPDATE pk SET a = 4002 WHERE a = 4000; +DELETE FROM pk WHERE a = 4002; +UPDATE pk SET a = 4502 WHERE a = 4500; +DELETE FROM pk WHERE a = 4502; + +CREATE SCHEMA fkpart4; +SET search_path TO fkpart4; +-- dropping/detaching PARTITIONs is prevented if that would break +-- a foreign key's existing data +CREATE TABLE droppk (a int PRIMARY KEY) PARTITION BY RANGE (a); +CREATE TABLE droppk1 PARTITION OF droppk FOR VALUES FROM (0) TO (1000); +CREATE TABLE droppk_d PARTITION OF droppk DEFAULT; +CREATE TABLE droppk2 PARTITION OF droppk FOR VALUES FROM (1000) TO (2000) + PARTITION BY RANGE (a); +CREATE TABLE droppk21 PARTITION OF droppk2 FOR VALUES FROM (1000) TO (1400); +CREATE TABLE droppk2_d PARTITION OF droppk2 DEFAULT; +INSERT into droppk VALUES (1), (1000), (1500), (2000); +CREATE TABLE dropfk (a int REFERENCES droppk); +INSERT into dropfk VALUES (1), (1000), (1500), (2000); +-- these should all fail +ALTER TABLE droppk DETACH PARTITION droppk_d; +ALTER TABLE droppk2 DETACH PARTITION droppk2_d; +ALTER TABLE droppk DETACH PARTITION droppk1; +ALTER TABLE droppk DETACH PARTITION droppk2; +ALTER TABLE droppk2 DETACH PARTITION droppk21; +-- dropping partitions is disallowed +DROP TABLE droppk_d; +DROP TABLE droppk2_d; +DROP TABLE droppk1; +DROP TABLE droppk2; +DROP TABLE droppk21; +DELETE FROM dropfk; +-- dropping partitions is disallowed, even when no referencing values +DROP TABLE droppk_d; +DROP TABLE droppk2_d; +DROP TABLE droppk1; +-- but DETACH is allowed, and DROP afterwards works +ALTER TABLE droppk2 DETACH PARTITION droppk21; +DROP TABLE droppk2; + +-- Verify that initial constraint creation and cloning behave correctly +CREATE SCHEMA fkpart5; +SET search_path TO fkpart5; +CREATE TABLE pk (a int PRIMARY KEY) PARTITION BY LIST (a); +CREATE TABLE pk1 PARTITION OF pk FOR VALUES IN (1) PARTITION BY LIST (a); +CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES IN (1); +CREATE TABLE fk (a int) PARTITION BY LIST (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES IN (1) PARTITION BY LIST (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES IN (1); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk; +CREATE TABLE pk2 PARTITION OF pk FOR VALUES IN (2); +CREATE TABLE pk3 (a int NOT NULL) PARTITION BY LIST (a); +CREATE TABLE pk31 PARTITION OF pk3 FOR VALUES IN (31); +CREATE TABLE pk32 (b int, a int NOT NULL); +ALTER TABLE pk32 DROP COLUMN b; +ALTER TABLE pk3 ATTACH PARTITION pk32 FOR VALUES IN (32); +ALTER TABLE pk ATTACH PARTITION pk3 FOR VALUES IN (31, 32); +CREATE TABLE fk2 PARTITION OF fk FOR VALUES IN (2); +CREATE TABLE fk3 (b int, a int); +ALTER TABLE fk3 DROP COLUMN b; +ALTER TABLE fk ATTACH PARTITION fk3 FOR VALUES IN (3); +SELECT pg_describe_object('pg_constraint'::regclass, oid, 0), confrelid::regclass, + CASE WHEN conparentid <> 0 THEN pg_describe_object('pg_constraint'::regclass, conparentid, 0) ELSE 'TOP' END +FROM pg_catalog.pg_constraint +WHERE conrelid IN (SELECT relid FROM pg_partition_tree('fk')) +ORDER BY conrelid::regclass::text, conname; +CREATE TABLE fk4 (LIKE fk); +INSERT INTO fk4 VALUES (50); +ALTER TABLE fk ATTACH PARTITION fk4 FOR VALUES IN (50); + +-- Verify constraint deferrability +CREATE SCHEMA fkpart9; +SET search_path TO fkpart9; +CREATE TABLE pk (a int PRIMARY KEY) PARTITION BY LIST (a); +CREATE TABLE pk1 PARTITION OF pk FOR VALUES IN (1, 2) PARTITION BY LIST (a); +CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES IN (1); +CREATE TABLE pk3 PARTITION OF pk FOR VALUES IN (3); +CREATE TABLE fk (a int REFERENCES pk DEFERRABLE INITIALLY IMMEDIATE); +INSERT INTO fk VALUES (1); -- should fail +BEGIN; +SET CONSTRAINTS fk_a_fkey DEFERRED; +INSERT INTO fk VALUES (1); +COMMIT; -- should fail +BEGIN; +SET CONSTRAINTS fk_a_fkey DEFERRED; +INSERT INTO fk VALUES (1); +INSERT INTO pk VALUES (1); +COMMIT; -- OK +BEGIN; +SET CONSTRAINTS fk_a_fkey DEFERRED; +DELETE FROM pk WHERE a = 1; +DELETE FROM fk WHERE a = 1; +COMMIT; -- OK + +-- Verify constraint deferrability when changed by ALTER +-- Partitioned table at referencing end +CREATE TABLE pt(f1 int, f2 int, f3 int, PRIMARY KEY(f1,f2)); +CREATE TABLE ref(f1 int, f2 int, f3 int) + PARTITION BY list(f1); +CREATE TABLE ref1 PARTITION OF ref FOR VALUES IN (1); +CREATE TABLE ref2 PARTITION OF ref FOR VALUES in (2); +ALTER TABLE ref ADD FOREIGN KEY(f1,f2) REFERENCES pt; +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY DEFERRED; +INSERT INTO pt VALUES(1,2,3); +INSERT INTO ref VALUES(1,2,3); +BEGIN; +DELETE FROM pt; +DELETE FROM ref; +ABORT; +DROP TABLE pt, ref; +-- Multi-level partitioning at referencing end +CREATE TABLE pt(f1 int, f2 int, f3 int, PRIMARY KEY(f1,f2)); +CREATE TABLE ref(f1 int, f2 int, f3 int) + PARTITION BY list(f1); +CREATE TABLE ref1_2 PARTITION OF ref FOR VALUES IN (1, 2) PARTITION BY list (f2); +CREATE TABLE ref1 PARTITION OF ref1_2 FOR VALUES IN (1); +CREATE TABLE ref2 PARTITION OF ref1_2 FOR VALUES IN (2) PARTITION BY list (f2); +CREATE TABLE ref22 PARTITION OF ref2 FOR VALUES IN (2); +ALTER TABLE ref ADD FOREIGN KEY(f1,f2) REFERENCES pt; +INSERT INTO pt VALUES(1,2,3); +INSERT INTO ref VALUES(1,2,3); +ALTER TABLE ref22 ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY IMMEDIATE; -- fails +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY DEFERRED; +BEGIN; +DELETE FROM pt; +DELETE FROM ref; +ABORT; +DROP TABLE pt, ref; + +-- Partitioned table at referenced end +CREATE TABLE pt(f1 int, f2 int, f3 int, PRIMARY KEY(f1,f2)) + PARTITION BY LIST(f1); +CREATE TABLE pt1 PARTITION OF pt FOR VALUES IN (1); +CREATE TABLE pt2 PARTITION OF pt FOR VALUES IN (2); +CREATE TABLE ref(f1 int, f2 int, f3 int); +ALTER TABLE ref ADD FOREIGN KEY(f1,f2) REFERENCES pt; +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY DEFERRED; +INSERT INTO pt VALUES(1,2,3); +INSERT INTO ref VALUES(1,2,3); +BEGIN; +DELETE FROM pt; +DELETE FROM ref; +ABORT; +DROP TABLE pt, ref; +-- Multi-level partitioning at at referenced end +CREATE TABLE pt(f1 int, f2 int, f3 int, PRIMARY KEY(f1,f2)) + PARTITION BY LIST(f1); +CREATE TABLE pt1_2 PARTITION OF pt FOR VALUES IN (1, 2) PARTITION BY LIST (f1); +CREATE TABLE pt1 PARTITION OF pt1_2 FOR VALUES IN (1); +CREATE TABLE pt2 PARTITION OF pt1_2 FOR VALUES IN (2); +CREATE TABLE ref(f1 int, f2 int, f3 int); +ALTER TABLE ref ADD FOREIGN KEY(f1,f2) REFERENCES pt; +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey1 + DEFERRABLE INITIALLY DEFERRED; -- fails +ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey + DEFERRABLE INITIALLY DEFERRED; +INSERT INTO pt VALUES(1,2,3); +INSERT INTO ref VALUES(1,2,3); +BEGIN; +DELETE FROM pt; +DELETE FROM ref; +ABORT; +DROP TABLE pt, ref; + +DROP SCHEMA fkpart9 CASCADE; + +-- Verify ON UPDATE/DELETE behavior +CREATE SCHEMA fkpart6; +SET search_path TO fkpart6; +CREATE TABLE pk (a int PRIMARY KEY) PARTITION BY RANGE (a); +CREATE TABLE pk1 PARTITION OF pk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES FROM (1) TO (50); +CREATE TABLE pk12 PARTITION OF pk1 FOR VALUES FROM (50) TO (100); +CREATE TABLE fk (a int) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES FROM (1) TO (10); +CREATE TABLE fk12 PARTITION OF fk1 FOR VALUES FROM (10) TO (100); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk ON UPDATE CASCADE ON DELETE CASCADE; +CREATE TABLE fk_d PARTITION OF fk DEFAULT; +INSERT INTO pk VALUES (1); +INSERT INTO fk VALUES (1); +UPDATE pk SET a = 20; +SELECT tableoid::regclass, * FROM fk; +DELETE FROM pk WHERE a = 20; +SELECT tableoid::regclass, * FROM fk; +DROP TABLE fk; + +TRUNCATE TABLE pk; +INSERT INTO pk VALUES (20), (50); +CREATE TABLE fk (a int) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES FROM (1) TO (10); +CREATE TABLE fk12 PARTITION OF fk1 FOR VALUES FROM (10) TO (100); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk ON UPDATE SET NULL ON DELETE SET NULL; +CREATE TABLE fk_d PARTITION OF fk DEFAULT; +INSERT INTO fk VALUES (20), (50); +UPDATE pk SET a = 21 WHERE a = 20; +DELETE FROM pk WHERE a = 50; +SELECT tableoid::regclass, * FROM fk; +DROP TABLE fk; + +TRUNCATE TABLE pk; +INSERT INTO pk VALUES (20), (30), (50); +CREATE TABLE fk (id int, a int DEFAULT 50) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES FROM (1) TO (10); +CREATE TABLE fk12 PARTITION OF fk1 FOR VALUES FROM (10) TO (100); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk ON UPDATE SET DEFAULT ON DELETE SET DEFAULT; +CREATE TABLE fk_d PARTITION OF fk DEFAULT; +INSERT INTO fk VALUES (1, 20), (2, 30); +DELETE FROM pk WHERE a = 20 RETURNING *; +UPDATE pk SET a = 90 WHERE a = 30 RETURNING *; +SELECT tableoid::regclass, * FROM fk; +DROP TABLE fk; + +TRUNCATE TABLE pk; +INSERT INTO pk VALUES (20), (30); +CREATE TABLE fk (a int DEFAULT 50) PARTITION BY RANGE (a); +CREATE TABLE fk1 PARTITION OF fk FOR VALUES FROM (1) TO (100) PARTITION BY RANGE (a); +CREATE TABLE fk11 PARTITION OF fk1 FOR VALUES FROM (1) TO (10); +CREATE TABLE fk12 PARTITION OF fk1 FOR VALUES FROM (10) TO (100); +ALTER TABLE fk ADD FOREIGN KEY (a) REFERENCES pk ON UPDATE RESTRICT ON DELETE RESTRICT; +CREATE TABLE fk_d PARTITION OF fk DEFAULT; +INSERT INTO fk VALUES (20), (30); +DELETE FROM pk WHERE a = 20; +UPDATE pk SET a = 90 WHERE a = 30; +SELECT tableoid::regclass, * FROM fk; +DROP TABLE fk; + +-- test for reported bug: relispartition not set +-- https://postgr.es/m/CA+HiwqHMsRtRYRWYTWavKJ8x14AFsv7bmAV46mYwnfD3vy8goQ@mail.gmail.com +CREATE SCHEMA fkpart7 + CREATE TABLE pkpart (a int) PARTITION BY LIST (a) + CREATE TABLE pkpart1 PARTITION OF pkpart FOR VALUES IN (1); +ALTER TABLE fkpart7.pkpart1 ADD PRIMARY KEY (a); +ALTER TABLE fkpart7.pkpart ADD PRIMARY KEY (a); +CREATE TABLE fkpart7.fk (a int REFERENCES fkpart7.pkpart); +DROP SCHEMA fkpart7 CASCADE; + +-- ensure we check partitions are "not used" when dropping constraints +CREATE SCHEMA fkpart8 + CREATE TABLE tbl1(f1 int PRIMARY KEY) + CREATE TABLE tbl2(f1 int REFERENCES tbl1 DEFERRABLE INITIALLY DEFERRED) PARTITION BY RANGE(f1) + CREATE TABLE tbl2_p1 PARTITION OF tbl2 FOR VALUES FROM (minvalue) TO (maxvalue); +INSERT INTO fkpart8.tbl1 VALUES(1); +BEGIN; +INSERT INTO fkpart8.tbl2 VALUES(1); +ALTER TABLE fkpart8.tbl2 DROP CONSTRAINT tbl2_f1_fkey; +COMMIT; +DROP SCHEMA fkpart8 CASCADE; + +-- ensure FK referencing a multi-level partitioned table are +-- enforce reference to sub-children. +CREATE SCHEMA fkpart9 + CREATE TABLE pk (a INT PRIMARY KEY) PARTITION BY RANGE (a) + CREATE TABLE fk ( + fk_a INT REFERENCES pk(a) ON DELETE CASCADE + ) + CREATE TABLE pk1 PARTITION OF pk FOR VALUES FROM (30) TO (50) PARTITION BY RANGE (a) + CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES FROM (30) TO (40); +INSERT INTO fkpart9.pk VALUES (35); +INSERT INTO fkpart9.fk VALUES (35); +DELETE FROM fkpart9.pk WHERE a=35; +SELECT * FROM fkpart9.pk; +SELECT * FROM fkpart9.fk; +DROP SCHEMA fkpart9 CASCADE; + +-- test that ri_Check_Pk_Match() scans the correct partition for a deferred +-- ON DELETE/UPDATE NO ACTION constraint +CREATE SCHEMA fkpart10 + CREATE TABLE tbl1(f1 int PRIMARY KEY) PARTITION BY RANGE(f1) + CREATE TABLE tbl1_p1 PARTITION OF tbl1 FOR VALUES FROM (minvalue) TO (1) + CREATE TABLE tbl1_p2 PARTITION OF tbl1 FOR VALUES FROM (1) TO (maxvalue) + CREATE TABLE tbl2(f1 int REFERENCES tbl1 DEFERRABLE INITIALLY DEFERRED); +INSERT INTO fkpart10.tbl1 VALUES (0), (1); +INSERT INTO fkpart10.tbl2 VALUES (0), (1); +BEGIN; +DELETE FROM fkpart10.tbl1 WHERE f1 = 0; +UPDATE fkpart10.tbl1 SET f1 = 2 WHERE f1 = 1; +INSERT INTO fkpart10.tbl1 VALUES (0), (1); +COMMIT; +DROP SCHEMA fkpart10 CASCADE; diff --git a/src/test/singlenode_regress/sql/functional_deps.sql b/src/test/singlenode_regress/sql/functional_deps.sql new file mode 100644 index 00000000000..406490b995c --- /dev/null +++ b/src/test/singlenode_regress/sql/functional_deps.sql @@ -0,0 +1,210 @@ +-- from http://www.depesz.com/index.php/2010/04/19/getting-unique-elements/ + +CREATE TEMP TABLE articles ( + id int CONSTRAINT articles_pkey PRIMARY KEY, + keywords text, + title text UNIQUE NOT NULL, + body text UNIQUE, + created date +); + +CREATE TEMP TABLE articles_in_category ( + article_id int, + category_id int, + changed date, + PRIMARY KEY (article_id, category_id) +); + +-- test functional dependencies based on primary keys/unique constraints + +-- base tables + +-- group by primary key (OK) +SELECT id, keywords, title, body, created +FROM articles +GROUP BY id; + +-- group by unique not null (fail/todo) +SELECT id, keywords, title, body, created +FROM articles +GROUP BY title; + +-- group by unique nullable (fail) +SELECT id, keywords, title, body, created +FROM articles +GROUP BY body; + +-- group by something else (fail) +SELECT id, keywords, title, body, created +FROM articles +GROUP BY keywords; + +-- multiple tables + +-- group by primary key (OK) +SELECT a.id, a.keywords, a.title, a.body, a.created +FROM articles AS a, articles_in_category AS aic +WHERE a.id = aic.article_id AND aic.category_id in (14,62,70,53,138) +GROUP BY a.id; + +-- group by something else (fail) +SELECT a.id, a.keywords, a.title, a.body, a.created +FROM articles AS a, articles_in_category AS aic +WHERE a.id = aic.article_id AND aic.category_id in (14,62,70,53,138) +GROUP BY aic.article_id, aic.category_id; + +-- JOIN syntax + +-- group by left table's primary key (OK) +SELECT a.id, a.keywords, a.title, a.body, a.created +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY a.id; + +-- group by something else (fail) +SELECT a.id, a.keywords, a.title, a.body, a.created +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY aic.article_id, aic.category_id; + +-- group by right table's (composite) primary key (OK) +SELECT aic.changed +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY aic.category_id, aic.article_id; + +-- group by right table's partial primary key (fail) +SELECT aic.changed +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY aic.article_id; + + +-- example from documentation + +CREATE TEMP TABLE products (product_id int, name text, price numeric); +CREATE TEMP TABLE sales (product_id int, units int); + +-- OK +SELECT product_id, p.name, (sum(s.units) * p.price) AS sales + FROM products p LEFT JOIN sales s USING (product_id) + GROUP BY product_id, p.name, p.price; + +-- fail +SELECT product_id, p.name, (sum(s.units) * p.price) AS sales + FROM products p LEFT JOIN sales s USING (product_id) + GROUP BY product_id; + +ALTER TABLE products ADD PRIMARY KEY (product_id); + +-- OK now +SELECT product_id, p.name, (sum(s.units) * p.price) AS sales + FROM products p LEFT JOIN sales s USING (product_id) + GROUP BY product_id; + + +-- Drupal example, http://drupal.org/node/555530 + +CREATE TEMP TABLE node ( + nid SERIAL, + vid integer NOT NULL default '0', + type varchar(32) NOT NULL default '', + title varchar(128) NOT NULL default '', + uid integer NOT NULL default '0', + status integer NOT NULL default '1', + created integer NOT NULL default '0', + -- snip + PRIMARY KEY (nid, vid) +); + +CREATE TEMP TABLE users ( + uid integer NOT NULL default '0', + name varchar(60) NOT NULL default '', + pass varchar(32) NOT NULL default '', + -- snip + PRIMARY KEY (uid), + UNIQUE (name) +); + +-- OK +SELECT u.uid, u.name FROM node n +INNER JOIN users u ON u.uid = n.uid +WHERE n.type = 'blog' AND n.status = 1 +GROUP BY u.uid, u.name; + +-- OK +SELECT u.uid, u.name FROM node n +INNER JOIN users u ON u.uid = n.uid +WHERE n.type = 'blog' AND n.status = 1 +GROUP BY u.uid; + + +-- Check views and dependencies + +-- fail +CREATE TEMP VIEW fdv1 AS +SELECT id, keywords, title, body, created +FROM articles +GROUP BY body; + +-- OK +CREATE TEMP VIEW fdv1 AS +SELECT id, keywords, title, body, created +FROM articles +GROUP BY id; + +-- fail +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; + +DROP VIEW fdv1; + + +-- multiple dependencies +CREATE TEMP VIEW fdv2 AS +SELECT a.id, a.keywords, a.title, aic.category_id, aic.changed +FROM articles AS a JOIN articles_in_category AS aic ON a.id = aic.article_id +WHERE aic.category_id in (14,62,70,53,138) +GROUP BY a.id, aic.category_id, aic.article_id; + +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail +ALTER TABLE articles_in_category DROP CONSTRAINT articles_in_category_pkey RESTRICT; --fail + +DROP VIEW fdv2; + + +-- nested queries + +CREATE TEMP VIEW fdv3 AS +SELECT id, keywords, title, body, created +FROM articles +GROUP BY id +UNION +SELECT id, keywords, title, body, created +FROM articles +GROUP BY id; + +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail + +DROP VIEW fdv3; + + +CREATE TEMP VIEW fdv4 AS +SELECT * FROM articles WHERE title IN (SELECT title FROM articles GROUP BY id); + +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; -- fail + +DROP VIEW fdv4; + + +-- prepared query plans: this results in failure on reuse + +PREPARE foo AS + SELECT id, keywords, title, body, created + FROM articles + GROUP BY id; + +EXECUTE foo; + +ALTER TABLE articles DROP CONSTRAINT articles_pkey RESTRICT; + +EXECUTE foo; -- fail diff --git a/src/test/singlenode_regress/sql/generated.sql b/src/test/singlenode_regress/sql/generated.sql new file mode 100644 index 00000000000..92731db17c8 --- /dev/null +++ b/src/test/singlenode_regress/sql/generated.sql @@ -0,0 +1,601 @@ +-- sanity check of system catalog +SELECT attrelid, attname, attgenerated FROM pg_attribute WHERE attgenerated NOT IN ('', 's'); + + +CREATE TABLE gtest0 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (55) STORED); +CREATE TABLE gtest1 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); + +SELECT table_name, column_name, column_default, is_nullable, is_generated, generation_expression FROM information_schema.columns WHERE table_name LIKE 'gtest_' ORDER BY 1, 2; + +SELECT table_name, column_name, dependent_column FROM information_schema.column_column_usage ORDER BY 1, 2, 3; + +\d gtest1 + +-- duplicate generated +CREATE TABLE gtest_err_1 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED GENERATED ALWAYS AS (a * 3) STORED); + +-- references to other generated columns, including self-references +CREATE TABLE gtest_err_2a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (b * 2) STORED); +CREATE TABLE gtest_err_2b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED, c int GENERATED ALWAYS AS (b * 3) STORED); +-- a whole-row var is a self-reference on steroids, so disallow that too +CREATE TABLE gtest_err_2c (a int PRIMARY KEY, + b int GENERATED ALWAYS AS (num_nulls(gtest_err_2c)) STORED); + +-- invalid reference +CREATE TABLE gtest_err_3 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (c * 2) STORED); + +-- generation expression must be immutable +CREATE TABLE gtest_err_4 (a int PRIMARY KEY, b double precision GENERATED ALWAYS AS (random()) STORED); + +-- cannot have default/identity and generated +CREATE TABLE gtest_err_5a (a int PRIMARY KEY, b int DEFAULT 5 GENERATED ALWAYS AS (a * 2) STORED); +CREATE TABLE gtest_err_5b (a int PRIMARY KEY, b int GENERATED ALWAYS AS identity GENERATED ALWAYS AS (a * 2) STORED); + +-- reference to system column not allowed in generated column +-- (except tableoid, which we test below) +CREATE TABLE gtest_err_6a (a int PRIMARY KEY, b bool GENERATED ALWAYS AS (xmin <> 37) STORED); + +-- various prohibited constructs +CREATE TABLE gtest_err_7a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (avg(a)) STORED); +CREATE TABLE gtest_err_7b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (row_number() OVER (ORDER BY a)) STORED); +CREATE TABLE gtest_err_7c (a int PRIMARY KEY, b int GENERATED ALWAYS AS ((SELECT a)) STORED); +CREATE TABLE gtest_err_7d (a int PRIMARY KEY, b int GENERATED ALWAYS AS (generate_series(1, a)) STORED); + +-- GENERATED BY DEFAULT not allowed +CREATE TABLE gtest_err_8 (a int PRIMARY KEY, b int GENERATED BY DEFAULT AS (a * 2) STORED); + +INSERT INTO gtest1 VALUES (1); +INSERT INTO gtest1 VALUES (2, DEFAULT); -- ok +INSERT INTO gtest1 VALUES (3, 33); -- error +INSERT INTO gtest1 VALUES (3, 33), (4, 44); -- error +INSERT INTO gtest1 VALUES (3, DEFAULT), (4, 44); -- error +INSERT INTO gtest1 VALUES (3, 33), (4, DEFAULT); -- error +INSERT INTO gtest1 VALUES (3, DEFAULT), (4, DEFAULT); -- ok + +SELECT * FROM gtest1 ORDER BY a; +DELETE FROM gtest1 WHERE a >= 3; + +UPDATE gtest1 SET b = DEFAULT WHERE a = 1; +UPDATE gtest1 SET b = 11 WHERE a = 1; -- error + +SELECT * FROM gtest1 ORDER BY a; + +SELECT a, b, b * 2 AS b2 FROM gtest1 ORDER BY a; +SELECT a, b FROM gtest1 WHERE b = 4 ORDER BY a; + +-- test that overflow error happens on write +INSERT INTO gtest1 VALUES (2000000000); +SELECT * FROM gtest1; +DELETE FROM gtest1 WHERE a = 2000000000; + +-- test with joins +CREATE TABLE gtestx (x int, y int); +INSERT INTO gtestx VALUES (11, 1), (22, 2), (33, 3); +SELECT * FROM gtestx, gtest1 WHERE gtestx.y = gtest1.a; +DROP TABLE gtestx; + +-- test UPDATE/DELETE quals +SELECT * FROM gtest1 ORDER BY a; +UPDATE gtest1 SET a = 3 WHERE b = 4; +SELECT * FROM gtest1 ORDER BY a; +DELETE FROM gtest1 WHERE b = 2; +SELECT * FROM gtest1 ORDER BY a; + +-- views +CREATE VIEW gtest1v AS SELECT * FROM gtest1; +SELECT * FROM gtest1v; +INSERT INTO gtest1v VALUES (4, 8); -- error +INSERT INTO gtest1v VALUES (5, DEFAULT); -- ok +INSERT INTO gtest1v VALUES (6, 66), (7, 77); -- error +INSERT INTO gtest1v VALUES (6, DEFAULT), (7, 77); -- error +INSERT INTO gtest1v VALUES (6, 66), (7, DEFAULT); -- error +INSERT INTO gtest1v VALUES (6, DEFAULT), (7, DEFAULT); -- ok + +ALTER VIEW gtest1v ALTER COLUMN b SET DEFAULT 100; +INSERT INTO gtest1v VALUES (8, DEFAULT); -- error +INSERT INTO gtest1v VALUES (8, DEFAULT), (9, DEFAULT); -- error + +SELECT * FROM gtest1v; +DELETE FROM gtest1v WHERE a >= 5; +DROP VIEW gtest1v; + +-- CTEs +WITH foo AS (SELECT * FROM gtest1) SELECT * FROM foo; + +-- inheritance +CREATE TABLE gtest1_1 () INHERITS (gtest1); +SELECT * FROM gtest1_1; +\d gtest1_1 +INSERT INTO gtest1_1 VALUES (4); +SELECT * FROM gtest1_1; +SELECT * FROM gtest1; + +CREATE TABLE gtest_normal (a int, b int); +CREATE TABLE gtest_normal_child (a int, b int GENERATED ALWAYS AS (a * 2) STORED) INHERITS (gtest_normal); +\d gtest_normal_child +INSERT INTO gtest_normal (a) VALUES (1); +INSERT INTO gtest_normal_child (a) VALUES (2); +SELECT * FROM gtest_normal; + +CREATE TABLE gtest_normal_child2 (a int, b int GENERATED ALWAYS AS (a * 3) STORED); +ALTER TABLE gtest_normal_child2 INHERIT gtest_normal; +INSERT INTO gtest_normal_child2 (a) VALUES (3); +SELECT * FROM gtest_normal; + +-- test inheritance mismatches between parent and child +CREATE TABLE gtestx (x int, b int GENERATED ALWAYS AS (a * 22) STORED) INHERITS (gtest1); -- error +CREATE TABLE gtestx (x int, b int DEFAULT 10) INHERITS (gtest1); -- error +CREATE TABLE gtestx (x int, b int GENERATED ALWAYS AS IDENTITY) INHERITS (gtest1); -- error + +CREATE TABLE gtestxx_1 (a int NOT NULL, b int); +ALTER TABLE gtestxx_1 INHERIT gtest1; -- error +CREATE TABLE gtestxx_2 (a int NOT NULL, b int GENERATED ALWAYS AS (a * 22) STORED); +ALTER TABLE gtestxx_2 INHERIT gtest1; -- error +CREATE TABLE gtestxx_3 (a int NOT NULL, b int GENERATED ALWAYS AS (a * 2) STORED); +ALTER TABLE gtestxx_3 INHERIT gtest1; -- ok +CREATE TABLE gtestxx_4 (b int GENERATED ALWAYS AS (a * 2) STORED, a int NOT NULL); +ALTER TABLE gtestxx_4 INHERIT gtest1; -- ok + +-- test multiple inheritance mismatches +CREATE TABLE gtesty (x int, b int); +CREATE TABLE gtest1_2 () INHERITS (gtest1, gtesty); -- error +DROP TABLE gtesty; + +CREATE TABLE gtesty (x int, b int GENERATED ALWAYS AS (x * 22) STORED); +CREATE TABLE gtest1_2 () INHERITS (gtest1, gtesty); -- error +DROP TABLE gtesty; + +CREATE TABLE gtesty (x int, b int DEFAULT 55); +CREATE TABLE gtest1_2 () INHERITS (gtest0, gtesty); -- error +DROP TABLE gtesty; + +-- test stored update +CREATE TABLE gtest3 (a int, b int GENERATED ALWAYS AS (a * 3) STORED); +INSERT INTO gtest3 (a) VALUES (1), (2), (3), (NULL); +SELECT * FROM gtest3 ORDER BY a; +UPDATE gtest3 SET a = 22 WHERE a = 2; +SELECT * FROM gtest3 ORDER BY a; + +CREATE TABLE gtest3a (a text, b text GENERATED ALWAYS AS (a || '+' || a) STORED); +INSERT INTO gtest3a (a) VALUES ('a'), ('b'), ('c'), (NULL); +SELECT * FROM gtest3a ORDER BY a; +UPDATE gtest3a SET a = 'bb' WHERE a = 'b'; +SELECT * FROM gtest3a ORDER BY a; + +-- COPY +TRUNCATE gtest1; +INSERT INTO gtest1 (a) VALUES (1), (2); + +COPY gtest1 TO stdout; + +COPY gtest1 (a, b) TO stdout; + +COPY gtest1 FROM stdin; +3 +4 +\. + +COPY gtest1 (a, b) FROM stdin; + +SELECT * FROM gtest1 ORDER BY a; + +TRUNCATE gtest3; +INSERT INTO gtest3 (a) VALUES (1), (2); + +COPY gtest3 TO stdout; + +COPY gtest3 (a, b) TO stdout; + +COPY gtest3 FROM stdin; +3 +4 +\. + +COPY gtest3 (a, b) FROM stdin; + +SELECT * FROM gtest3 ORDER BY a; + +-- null values +CREATE TABLE gtest2 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (NULL) STORED); +INSERT INTO gtest2 VALUES (1); +SELECT * FROM gtest2; + +-- simple column reference for varlena types +CREATE TABLE gtest_varlena (a varchar, b varchar GENERATED ALWAYS AS (a) STORED); +INSERT INTO gtest_varlena (a) VALUES('01234567890123456789'); +INSERT INTO gtest_varlena (a) VALUES(NULL); +SELECT * FROM gtest_varlena ORDER BY a; +DROP TABLE gtest_varlena; + +-- composite types +CREATE TYPE double_int as (a int, b int); +CREATE TABLE gtest4 ( + a int, + b double_int GENERATED ALWAYS AS ((a * 2, a * 3)) STORED +); +INSERT INTO gtest4 VALUES (1), (6); +SELECT * FROM gtest4; + +DROP TABLE gtest4; +DROP TYPE double_int; + +-- using tableoid is allowed +CREATE TABLE gtest_tableoid ( + a int PRIMARY KEY, + b bool GENERATED ALWAYS AS (tableoid = 'gtest_tableoid'::regclass) STORED +); +INSERT INTO gtest_tableoid VALUES (1), (2); +ALTER TABLE gtest_tableoid ADD COLUMN + c regclass GENERATED ALWAYS AS (tableoid) STORED; +SELECT * FROM gtest_tableoid; + +-- drop column behavior +CREATE TABLE gtest10 (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (b * 2) STORED); +ALTER TABLE gtest10 DROP COLUMN b; + +\d gtest10 + +CREATE TABLE gtest10a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); +ALTER TABLE gtest10a DROP COLUMN b; +INSERT INTO gtest10a (a) VALUES (1); + +-- privileges +CREATE USER regress_user11; + +CREATE TABLE gtest11s (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (b * 2) STORED); +INSERT INTO gtest11s VALUES (1, 10), (2, 20); +GRANT SELECT (a, c) ON gtest11s TO regress_user11; + +CREATE FUNCTION gf1(a int) RETURNS int AS $$ SELECT a * 3 $$ IMMUTABLE LANGUAGE SQL; +REVOKE ALL ON FUNCTION gf1(int) FROM PUBLIC; + +CREATE TABLE gtest12s (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (gf1(b)) STORED); +INSERT INTO gtest12s VALUES (1, 10), (2, 20); +GRANT SELECT (a, c) ON gtest12s TO regress_user11; + +SET ROLE regress_user11; +SELECT a, b FROM gtest11s; -- not allowed +SELECT a, c FROM gtest11s; -- allowed +SELECT gf1(10); -- not allowed +SELECT a, c FROM gtest12s; -- allowed +RESET ROLE; + +DROP TABLE gtest11s, gtest12s; +DROP FUNCTION gf1(int); +DROP USER regress_user11; + +-- check constraints +CREATE TABLE gtest20 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED CHECK (b < 50)); +INSERT INTO gtest20 (a) VALUES (10); -- ok +INSERT INTO gtest20 (a) VALUES (30); -- violates constraint + +CREATE TABLE gtest20a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); +INSERT INTO gtest20a (a) VALUES (10); +INSERT INTO gtest20a (a) VALUES (30); +ALTER TABLE gtest20a ADD CHECK (b < 50); -- fails on existing row + +CREATE TABLE gtest20b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); +INSERT INTO gtest20b (a) VALUES (10); +INSERT INTO gtest20b (a) VALUES (30); +ALTER TABLE gtest20b ADD CONSTRAINT chk CHECK (b < 50) NOT VALID; +ALTER TABLE gtest20b VALIDATE CONSTRAINT chk; -- fails on existing row + +-- not-null constraints +CREATE TABLE gtest21a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (nullif(a, 0)) STORED NOT NULL); +INSERT INTO gtest21a (a) VALUES (1); -- ok +INSERT INTO gtest21a (a) VALUES (0); -- violates constraint + +CREATE TABLE gtest21b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (nullif(a, 0)) STORED); +ALTER TABLE gtest21b ALTER COLUMN b SET NOT NULL; +INSERT INTO gtest21b (a) VALUES (1); -- ok +INSERT INTO gtest21b (a) VALUES (0); -- violates constraint +ALTER TABLE gtest21b ALTER COLUMN b DROP NOT NULL; +INSERT INTO gtest21b (a) VALUES (0); -- ok now + +-- index constraints +CREATE TABLE gtest22a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a / 2) STORED UNIQUE); +INSERT INTO gtest22a VALUES (2); +INSERT INTO gtest22a VALUES (3); +INSERT INTO gtest22a VALUES (4); +CREATE TABLE gtest22b (a int, b int GENERATED ALWAYS AS (a / 2) STORED, PRIMARY KEY (a, b)); +INSERT INTO gtest22b VALUES (2); +INSERT INTO gtest22b VALUES (2); + +-- indexes +CREATE TABLE gtest22c (a int, b int GENERATED ALWAYS AS (a * 2) STORED); +CREATE INDEX gtest22c_b_idx ON gtest22c (b); +CREATE INDEX gtest22c_expr_idx ON gtest22c ((b * 3)); +CREATE INDEX gtest22c_pred_idx ON gtest22c (a) WHERE b > 0; +\d gtest22c + +INSERT INTO gtest22c VALUES (1), (2), (3); +SET enable_seqscan TO off; +SET enable_bitmapscan TO off; +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b = 4; +SELECT * FROM gtest22c WHERE b = 4; +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b * 3 = 6; +SELECT * FROM gtest22c WHERE b * 3 = 6; +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE a = 1 AND b > 0; +SELECT * FROM gtest22c WHERE a = 1 AND b > 0; +RESET enable_seqscan; +RESET enable_bitmapscan; + +-- foreign keys +CREATE TABLE gtest23a (x int PRIMARY KEY, y int); +INSERT INTO gtest23a VALUES (1, 11), (2, 22), (3, 33); + +CREATE TABLE gtest23x (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED REFERENCES gtest23a (x) ON UPDATE CASCADE); -- error +CREATE TABLE gtest23x (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED REFERENCES gtest23a (x) ON DELETE SET NULL); -- error + +CREATE TABLE gtest23b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED REFERENCES gtest23a (x)); +\d gtest23b + +INSERT INTO gtest23b VALUES (1); -- ok +-- GPDB doesn't enforce foreign key constraints, so this doesn't error out. +INSERT INTO gtest23b VALUES (5); -- error + +DROP TABLE gtest23b; +DROP TABLE gtest23a; + +CREATE TABLE gtest23p (x int, y int GENERATED ALWAYS AS (x * 2) STORED, PRIMARY KEY (y)); +INSERT INTO gtest23p VALUES (1), (2), (3); + +CREATE TABLE gtest23q (a int PRIMARY KEY, b int REFERENCES gtest23p (y)); +INSERT INTO gtest23q VALUES (1, 2); -- ok +-- GPDB doesn't enforce foreign key constraints, so this doesn't error out. +INSERT INTO gtest23q VALUES (2, 5); -- error + +-- domains +CREATE DOMAIN gtestdomain1 AS int CHECK (VALUE < 10); +CREATE TABLE gtest24 (a int PRIMARY KEY, b gtestdomain1 GENERATED ALWAYS AS (a * 2) STORED); +INSERT INTO gtest24 (a) VALUES (4); -- ok +INSERT INTO gtest24 (a) VALUES (6); -- error + +-- typed tables (currently not supported) +CREATE TYPE gtest_type AS (f1 integer, f2 text, f3 bigint); +CREATE TABLE gtest28 OF gtest_type (f1 WITH OPTIONS GENERATED ALWAYS AS (f2 *2) STORED); +DROP TYPE gtest_type CASCADE; + +-- table partitions (currently not supported) +CREATE TABLE gtest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1); +CREATE TABLE gtest_child PARTITION OF gtest_parent ( + f3 WITH OPTIONS GENERATED ALWAYS AS (f2 * 2) STORED +) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error +DROP TABLE gtest_parent; + +-- partitioned table +CREATE TABLE gtest_parent (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS (f2 * 2) STORED) PARTITION BY RANGE (f1); +CREATE TABLE gtest_child PARTITION OF gtest_parent FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +INSERT INTO gtest_parent (f1, f2) VALUES ('2016-07-15', 1); +SELECT * FROM gtest_parent; +SELECT * FROM gtest_child; +DROP TABLE gtest_parent; + +-- generated columns in partition key (not allowed) +CREATE TABLE gtest_parent (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS (f2 * 2) STORED) PARTITION BY RANGE (f3); +CREATE TABLE gtest_parent (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS (f2 * 2) STORED) PARTITION BY RANGE ((f3 * 3)); + +-- ALTER TABLE ... ADD COLUMN +CREATE TABLE gtest25 (a int PRIMARY KEY); +INSERT INTO gtest25 VALUES (3), (4); +ALTER TABLE gtest25 ADD COLUMN b int GENERATED ALWAYS AS (a * 3) STORED; +SELECT * FROM gtest25 ORDER BY a; +ALTER TABLE gtest25 ADD COLUMN x int GENERATED ALWAYS AS (b * 4) STORED; -- error +ALTER TABLE gtest25 ADD COLUMN x int GENERATED ALWAYS AS (z * 4) STORED; -- error +ALTER TABLE gtest25 ADD COLUMN c int DEFAULT 42, + ADD COLUMN x int GENERATED ALWAYS AS (c * 4) STORED; +ALTER TABLE gtest25 ADD COLUMN d int DEFAULT 101; +ALTER TABLE gtest25 ALTER COLUMN d SET DATA TYPE float8, + ADD COLUMN y float8 GENERATED ALWAYS AS (d * 4) STORED; +SELECT * FROM gtest25 ORDER BY a; +\d gtest25 + +-- ALTER TABLE ... ALTER COLUMN +CREATE TABLE gtest27 ( + a int, + b int, + x int GENERATED ALWAYS AS ((a + b) * 2) STORED +); +INSERT INTO gtest27 (a, b) VALUES (3, 7), (4, 11); +ALTER TABLE gtest27 ALTER COLUMN a TYPE text; -- error +ALTER TABLE gtest27 ALTER COLUMN x TYPE numeric; +\d gtest27 +SELECT * FROM gtest27; +ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error +ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error +-- It's possible to alter the column types this way: +ALTER TABLE gtest27 + DROP COLUMN x, + ALTER COLUMN a TYPE bigint, + ALTER COLUMN b TYPE bigint, + ADD COLUMN x bigint GENERATED ALWAYS AS ((a + b) * 2) STORED; +\d gtest27 +-- Ideally you could just do this, but not today (and should x change type?): +ALTER TABLE gtest27 + ALTER COLUMN a TYPE float8, + ALTER COLUMN b TYPE float8; -- error +\d gtest27 +SELECT * FROM gtest27; + +-- ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION +CREATE TABLE gtest29 ( + a int, + b int GENERATED ALWAYS AS (a * 2) STORED +); +INSERT INTO gtest29 (a) VALUES (3), (4); +ALTER TABLE gtest29 ALTER COLUMN a DROP EXPRESSION; -- error +ALTER TABLE gtest29 ALTER COLUMN a DROP EXPRESSION IF EXISTS; -- notice +ALTER TABLE gtest29 ALTER COLUMN b DROP EXPRESSION; +INSERT INTO gtest29 (a) VALUES (5); +INSERT INTO gtest29 (a, b) VALUES (6, 66); +SELECT * FROM gtest29; +\d gtest29 + +-- check that dependencies between columns have also been removed +ALTER TABLE gtest29 DROP COLUMN a; -- should not drop b +\d gtest29 + +-- with inheritance +CREATE TABLE gtest30 ( + a int, + b int GENERATED ALWAYS AS (a * 2) STORED +); +CREATE TABLE gtest30_1 () INHERITS (gtest30); +ALTER TABLE gtest30 ALTER COLUMN b DROP EXPRESSION; +\d gtest30 +\d gtest30_1 +DROP TABLE gtest30 CASCADE; +CREATE TABLE gtest30 ( + a int, + b int GENERATED ALWAYS AS (a * 2) STORED +); +CREATE TABLE gtest30_1 () INHERITS (gtest30); +ALTER TABLE ONLY gtest30 ALTER COLUMN b DROP EXPRESSION; -- error +\d gtest30 +\d gtest30_1 +ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error + +-- triggers +CREATE TABLE gtest26 ( + a int PRIMARY KEY, + b int GENERATED ALWAYS AS (a * 2) STORED +); + +CREATE FUNCTION gtest_trigger_func() RETURNS trigger + LANGUAGE plpgsql +AS $$ +BEGIN + IF tg_op IN ('DELETE', 'UPDATE') THEN + RAISE INFO '%: %: old = %', TG_NAME, TG_WHEN, OLD; + END IF; + IF tg_op IN ('INSERT', 'UPDATE') THEN + RAISE INFO '%: %: new = %', TG_NAME, TG_WHEN, NEW; + END IF; + IF tg_op = 'DELETE' THEN + RETURN OLD; + ELSE + RETURN NEW; + END IF; +END +$$; + +CREATE TRIGGER gtest1 BEFORE DELETE OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (OLD.b < 0) -- ok + EXECUTE PROCEDURE gtest_trigger_func(); + +CREATE TRIGGER gtest2a BEFORE INSERT OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (NEW.b < 0) -- error + EXECUTE PROCEDURE gtest_trigger_func(); + +CREATE TRIGGER gtest2b BEFORE INSERT OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (NEW.* IS NOT NULL) -- error + EXECUTE PROCEDURE gtest_trigger_func(); + +CREATE TRIGGER gtest2 BEFORE INSERT ON gtest26 + FOR EACH ROW + WHEN (NEW.a < 0) + EXECUTE PROCEDURE gtest_trigger_func(); + +CREATE TRIGGER gtest3 AFTER DELETE OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (OLD.b < 0) -- ok + EXECUTE PROCEDURE gtest_trigger_func(); + +CREATE TRIGGER gtest4 AFTER INSERT OR UPDATE ON gtest26 + FOR EACH ROW + WHEN (NEW.b < 0) -- ok + EXECUTE PROCEDURE gtest_trigger_func(); + +INSERT INTO gtest26 (a) VALUES (-2), (0), (3); +SELECT * FROM gtest26 ORDER BY a; + +-- GPDB: There are a few issues with the UPDATE and DELETE test. Firstly, +-- the UPDATE of 'a' fails, because you can't update distribution key column +-- when there's an update trigger on it. Secondly, the INFO messages from the +-- triggers that run on different segments arrive in random order. To fix +-- these issues, drop the primary key, and force all the rows to reside on +-- the same segment. Only confirm data in a single segment is not enough for +-- the case to be soild, we have to make sure the tuple's order is the same. +-- However, "set distributed by" cannot gurantee this because the tuple order +-- from interconnect is not always the same. To achieve the goal, we truncate +-- the table and then re-insert it after set the distkey. +alter table gtest26 drop constraint gtest26_pkey; +alter table gtest26 add column distkey integer; +truncate gtest26; +INSERT INTO gtest26 (a) VALUES (-2), (0), (3); +alter table gtest26 drop column distkey; + +UPDATE gtest26 SET a = a * -2; + +SELECT * FROM gtest26 ORDER BY a; +DELETE FROM gtest26 WHERE a = -6; +SELECT * FROM gtest26 ORDER BY a; + +DROP TRIGGER gtest1 ON gtest26; +DROP TRIGGER gtest2 ON gtest26; +DROP TRIGGER gtest3 ON gtest26; + +-- Check that an UPDATE of "a" fires the trigger for UPDATE OF b, per +-- SQL standard. +CREATE FUNCTION gtest_trigger_func3() RETURNS trigger + LANGUAGE plpgsql +AS $$ +BEGIN + RAISE NOTICE 'OK'; + RETURN NEW; +END +$$; + +CREATE TRIGGER gtest11 BEFORE UPDATE OF b ON gtest26 + FOR EACH ROW + EXECUTE PROCEDURE gtest_trigger_func3(); + +UPDATE gtest26 SET a = 1 WHERE a = 0; + +DROP TRIGGER gtest11 ON gtest26; +TRUNCATE gtest26; + +-- check that modifications of stored generated columns in triggers do +-- not get propagated +CREATE FUNCTION gtest_trigger_func4() RETURNS trigger + LANGUAGE plpgsql +AS $$ +BEGIN + NEW.a = 10; + NEW.b = 300; + RETURN NEW; +END; +$$; + +CREATE TRIGGER gtest12_01 BEFORE UPDATE ON gtest26 + FOR EACH ROW + EXECUTE PROCEDURE gtest_trigger_func(); + +CREATE TRIGGER gtest12_02 BEFORE UPDATE ON gtest26 + FOR EACH ROW + EXECUTE PROCEDURE gtest_trigger_func4(); + +CREATE TRIGGER gtest12_03 BEFORE UPDATE ON gtest26 + FOR EACH ROW + EXECUTE PROCEDURE gtest_trigger_func(); + +INSERT INTO gtest26 (a) VALUES (1); +UPDATE gtest26 SET a = 11 WHERE a = 1; +SELECT * FROM gtest26 ORDER BY a; + +-- LIKE INCLUDING GENERATED and dropped column handling +CREATE TABLE gtest28a ( + a int, + b int, + c int, + x int GENERATED ALWAYS AS (b * 2) STORED +); + +ALTER TABLE gtest28a DROP COLUMN a; + +CREATE TABLE gtest28b (LIKE gtest28a INCLUDING GENERATED); + +\d gtest28* diff --git a/src/test/singlenode_regress/sql/geometry.sql b/src/test/singlenode_regress/sql/geometry.sql new file mode 100644 index 00000000000..bbb6acd4555 --- /dev/null +++ b/src/test/singlenode_regress/sql/geometry.sql @@ -0,0 +1,512 @@ +-- +-- GEOMETRY +-- + +-- Back off displayed precision a little bit to reduce platform-to-platform +-- variation in results. +SET extra_float_digits TO -3; + +-- +-- Points +-- + +SELECT center(f1) AS center + FROM BOX_TBL; + +SELECT (@@ f1) AS center + FROM BOX_TBL; + +SELECT point(f1) AS center + FROM CIRCLE_TBL; + +SELECT (@@ f1) AS center + FROM CIRCLE_TBL; + +SELECT (@@ f1) AS center + FROM POLYGON_TBL + WHERE (# f1) > 2; + +-- "is horizontal" function +SELECT p1.f1 + FROM POINT_TBL p1 + WHERE ishorizontal(p1.f1, point '(0,0)'); + +-- "is horizontal" operator +SELECT p1.f1 + FROM POINT_TBL p1 + WHERE p1.f1 ?- point '(0,0)'; + +-- "is vertical" function +SELECT p1.f1 + FROM POINT_TBL p1 + WHERE isvertical(p1.f1, point '(5.1,34.5)'); + +-- "is vertical" operator +SELECT p1.f1 + FROM POINT_TBL p1 + WHERE p1.f1 ?| point '(5.1,34.5)'; + +-- Slope +SELECT p1.f1, p2.f1, slope(p1.f1, p2.f1) FROM POINT_TBL p1, POINT_TBL p2; + +-- Add point +SELECT p1.f1, p2.f1, p1.f1 + p2.f1 FROM POINT_TBL p1, POINT_TBL p2; + +-- Subtract point +SELECT p1.f1, p2.f1, p1.f1 - p2.f1 FROM POINT_TBL p1, POINT_TBL p2; + +-- Multiply with point +SELECT p1.f1, p2.f1, p1.f1 * p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1[0] BETWEEN 1 AND 1000; + +-- Underflow error +SELECT p1.f1, p2.f1, p1.f1 * p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1[0] < 1; + +-- Divide by point +SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1[0] BETWEEN 1 AND 1000; + +-- Overflow error +SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1[0] > 1000; + +-- Division by 0 error +SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1 ~= '(0,0)'::point; + +-- Distance to line +SELECT p.f1, l.s, p.f1 <-> l.s AS dist_pl, l.s <-> p.f1 AS dist_lp FROM POINT_TBL p, LINE_TBL l; + +-- Distance to line segment +SELECT p.f1, l.s, p.f1 <-> l.s AS dist_ps, l.s <-> p.f1 AS dist_sp FROM POINT_TBL p, LSEG_TBL l; + +-- Distance to box +SELECT p.f1, b.f1, p.f1 <-> b.f1 AS dist_pb, b.f1 <-> p.f1 AS dist_bp FROM POINT_TBL p, BOX_TBL b; + +-- Distance to path +SELECT p.f1, p1.f1, p.f1 <-> p1.f1 AS dist_ppath, p1.f1 <-> p.f1 AS dist_pathp FROM POINT_TBL p, PATH_TBL p1; + +-- Distance to polygon +SELECT p.f1, p1.f1, p.f1 <-> p1.f1 AS dist_ppoly, p1.f1 <-> p.f1 AS dist_polyp FROM POINT_TBL p, POLYGON_TBL p1; + +-- Construct line through two points +SELECT p1.f1, p2.f1, line(p1.f1, p2.f1) + FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1 <> p2.f1; + +-- Closest point to line +SELECT p.f1, l.s, p.f1 ## l.s FROM POINT_TBL p, LINE_TBL l; + +-- Closest point to line segment +SELECT p.f1, l.s, p.f1 ## l.s FROM POINT_TBL p, LSEG_TBL l; + +-- Closest point to box +SELECT p.f1, b.f1, p.f1 ## b.f1 FROM POINT_TBL p, BOX_TBL b; + +-- On line +SELECT p.f1, l.s FROM POINT_TBL p, LINE_TBL l WHERE p.f1 <@ l.s; + +-- On line segment +SELECT p.f1, l.s FROM POINT_TBL p, LSEG_TBL l WHERE p.f1 <@ l.s; + +-- On path +SELECT p.f1, p1.f1 FROM POINT_TBL p, PATH_TBL p1 WHERE p.f1 <@ p1.f1; + +-- +-- Lines +-- + +-- Vertical +SELECT s FROM LINE_TBL WHERE ?| s; + +-- Horizontal +SELECT s FROM LINE_TBL WHERE ?- s; + +-- Same as line +SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s = l2.s; + +-- Parallel to line +SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?|| l2.s; + +-- Perpendicular to line +SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?-| l2.s; + +-- Distance to line +SELECT l1.s, l2.s, l1.s <-> l2.s FROM LINE_TBL l1, LINE_TBL l2; + +-- Distance to box +SELECT l.s, b.f1, l.s <-> b.f1 FROM LINE_TBL l, BOX_TBL b; +SELECT l.s, b.f1, b.f1 <-> l.s FROM LINE_TBL l, BOX_TBL b; + +-- Intersect with line +SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?# l2.s; + +-- Intersect with box +SELECT l.s, b.f1 FROM LINE_TBL l, BOX_TBL b WHERE l.s ?# b.f1; + +-- Intersection point with line +SELECT l1.s, l2.s, l1.s # l2.s FROM LINE_TBL l1, LINE_TBL l2; + +-- Closest point to line segment +SELECT l.s, l1.s, l.s ## l1.s FROM LINE_TBL l, LSEG_TBL l1; + +-- Closest point to box +SELECT l.s, b.f1, l.s ## b.f1 FROM LINE_TBL l, BOX_TBL b; + +-- +-- Line segments +-- + +-- intersection +SELECT p.f1, l.s, l.s # p.f1 AS intersection + FROM LSEG_TBL l, POINT_TBL p; + +-- Length +SELECT s, @-@ s FROM LSEG_TBL; + +-- Vertical +SELECT s FROM LSEG_TBL WHERE ?| s; + +-- Horizontal +SELECT s FROM LSEG_TBL WHERE ?- s; + +-- Center +SELECT s, @@ s FROM LSEG_TBL; + +-- To point +SELECT s, s::point FROM LSEG_TBL; + +-- Has points less than line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s < l2.s; + +-- Has points less than or equal to line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s <= l2.s; + +-- Has points equal to line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s = l2.s; + +-- Has points greater than or equal to line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s >= l2.s; + +-- Has points greater than line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s > l2.s; + +-- Has points not equal to line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s != l2.s; + +-- Parallel with line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?|| l2.s; + +-- Perpendicular with line segment +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?-| l2.s; + +-- Distance to line +SELECT l.s, l1.s, l.s <-> l1.s AS dist_sl, l1.s <-> l.s AS dist_ls FROM LSEG_TBL l, LINE_TBL l1; + +-- Distance to line segment +SELECT l1.s, l2.s, l1.s <-> l2.s FROM LSEG_TBL l1, LSEG_TBL l2; + +-- Distance to box +SELECT l.s, b.f1, l.s <-> b.f1 AS dist_sb, b.f1 <-> l.s AS dist_bs FROM LSEG_TBL l, BOX_TBL b; + +-- Intersect with line segment +SELECT l.s, l1.s FROM LSEG_TBL l, LINE_TBL l1 WHERE l.s ?# l1.s; + +-- Intersect with box +SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s ?# b.f1; + +-- Intersection point with line segment +SELECT l1.s, l2.s, l1.s # l2.s FROM LSEG_TBL l1, LSEG_TBL l2; + +-- Closest point to line +SELECT l.s, l1.s, l.s ## l1.s FROM LSEG_TBL l, LINE_TBL l1; + +-- Closest point to line segment +SELECT l1.s, l2.s, l1.s ## l2.s FROM LSEG_TBL l1, LSEG_TBL l2; + +-- Closest point to box +SELECT l.s, b.f1, l.s ## b.f1 FROM LSEG_TBL l, BOX_TBL b; + +-- On line +SELECT l.s, l1.s FROM LSEG_TBL l, LINE_TBL l1 WHERE l.s <@ l1.s; + +-- On box +SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s <@ b.f1; + +-- +-- Boxes +-- + +SELECT box(f1) AS box FROM CIRCLE_TBL; + +-- translation +SELECT b.f1 + p.f1 AS translation + FROM BOX_TBL b, POINT_TBL p; + +SELECT b.f1 - p.f1 AS translation + FROM BOX_TBL b, POINT_TBL p; + +-- Multiply with point +SELECT b.f1, p.f1, b.f1 * p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000; + +-- Overflow error +SELECT b.f1, p.f1, b.f1 * p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] > 1000; + +-- Divide by point +SELECT b.f1, p.f1, b.f1 / p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000; + +-- To box +SELECT f1::box + FROM POINT_TBL; + +SELECT bound_box(a.f1, b.f1) + FROM BOX_TBL a, BOX_TBL b; + +-- Below box +SELECT b1.f1, b2.f1, b1.f1 <^ b2.f1 FROM BOX_TBL b1, BOX_TBL b2; + +-- Above box +SELECT b1.f1, b2.f1, b1.f1 >^ b2.f1 FROM BOX_TBL b1, BOX_TBL b2; + +-- Intersection point with box +SELECT b1.f1, b2.f1, b1.f1 # b2.f1 FROM BOX_TBL b1, BOX_TBL b2; + +-- Diagonal +SELECT f1, diagonal(f1) FROM BOX_TBL; + +-- Distance to box +SELECT b1.f1, b2.f1, b1.f1 <-> b2.f1 FROM BOX_TBL b1, BOX_TBL b2; + +-- +-- Paths +-- + +-- Points +SELECT f1, npoints(f1) FROM PATH_TBL; + +-- Area +SELECT f1, area(f1) FROM PATH_TBL; + +-- Length +SELECT f1, @-@ f1 FROM PATH_TBL; + +-- Center +SELECT f1, @@ f1 FROM PATH_TBL; + +-- To polygon +SELECT f1, f1::polygon FROM PATH_TBL WHERE isclosed(f1); + +-- Open path cannot be converted to polygon error +SELECT f1, f1::polygon FROM PATH_TBL WHERE isopen(f1); + +-- Has points less than path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 < p2.f1; + +-- Has points less than or equal to path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 <= p2.f1; + +-- Has points equal to path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 = p2.f1; + +-- Has points greater than or equal to path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 >= p2.f1; + +-- Has points greater than path +SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 > p2.f1; + +-- Add path +SELECT p1.f1, p2.f1, p1.f1 + p2.f1 FROM PATH_TBL p1, PATH_TBL p2; + +-- Add point +SELECT p.f1, p1.f1, p.f1 + p1.f1 FROM PATH_TBL p, POINT_TBL p1; + +-- Subtract point +SELECT p.f1, p1.f1, p.f1 - p1.f1 FROM PATH_TBL p, POINT_TBL p1; + +-- Multiply with point +SELECT p.f1, p1.f1, p.f1 * p1.f1 FROM PATH_TBL p, POINT_TBL p1; + +-- Divide by point +SELECT p.f1, p1.f1, p.f1 / p1.f1 FROM PATH_TBL p, POINT_TBL p1 WHERE p1.f1[0] BETWEEN 1 AND 1000; + +-- Division by 0 error +SELECT p.f1, p1.f1, p.f1 / p1.f1 FROM PATH_TBL p, POINT_TBL p1 WHERE p1.f1 ~= '(0,0)'::point; + +-- Distance to path +SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM PATH_TBL p1, PATH_TBL p2; + +-- +-- Polygons +-- + +-- containment +SELECT p.f1, poly.f1, poly.f1 @> p.f1 AS contains + FROM POLYGON_TBL poly, POINT_TBL p; + +SELECT p.f1, poly.f1, p.f1 <@ poly.f1 AS contained + FROM POLYGON_TBL poly, POINT_TBL p; + +SELECT npoints(f1) AS npoints, f1 AS polygon + FROM POLYGON_TBL; + +SELECT polygon(f1) + FROM BOX_TBL; + +SELECT polygon(f1) + FROM PATH_TBL WHERE isclosed(f1); + +SELECT f1 AS open_path, polygon( pclose(f1)) AS polygon + FROM PATH_TBL + WHERE isopen(f1); + +-- To box +SELECT f1, f1::box FROM POLYGON_TBL; + +-- To path +SELECT f1, f1::path FROM POLYGON_TBL; + +-- Same as polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 ~= p2.f1; + +-- Contained by polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 <@ p2.f1; + +-- Contains polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 @> p2.f1; + +-- Overlap with polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 && p2.f1; + +-- Left of polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 << p2.f1; + +-- Overlap of left of polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &< p2.f1; + +-- Right of polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 >> p2.f1; + +-- Overlap of right of polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &> p2.f1; + +-- Below polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 <<| p2.f1; + +-- Overlap or below polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &<| p2.f1; + +-- Above polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |>> p2.f1; + +-- Overlap or above polygon +SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |&> p2.f1; + +-- Distance to polygon +SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2; + +-- +-- Circles +-- + +SELECT circle(f1, 50.0) + FROM POINT_TBL; + +SELECT circle(f1) + FROM BOX_TBL; + +SELECT circle(f1) + FROM POLYGON_TBL + WHERE (# f1) >= 3; + +SELECT c1.f1 AS circle, p1.f1 AS point, (p1.f1 <-> c1.f1) AS distance + FROM CIRCLE_TBL c1, POINT_TBL p1 + WHERE (p1.f1 <-> c1.f1) > 0 + ORDER BY distance, area(c1.f1), p1.f1[0]; + +-- To polygon +SELECT f1, f1::polygon FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>'; + +-- To polygon with less points +SELECT f1, polygon(8, f1) FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>'; + +-- Error for insufficient number of points +SELECT f1, polygon(1, f1) FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>'; + +-- Zero radius error +SELECT f1, polygon(10, f1) FROM CIRCLE_TBL WHERE f1 < '<(0,0),1>'; + +-- Same as circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 ~= c2.f1; + +-- Overlap with circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 && c2.f1; + +-- Overlap or left of circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &< c2.f1; + +-- Left of circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 << c2.f1; + +-- Right of circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 >> c2.f1; + +-- Overlap or right of circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &> c2.f1; + +-- Contained by circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <@ c2.f1; + +-- Contain by circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 @> c2.f1; + +-- Below circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <<| c2.f1; + +-- Above circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 |>> c2.f1; + +-- Overlap or below circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &<| c2.f1; + +-- Overlap or above circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 |&> c2.f1; + +-- Area equal with circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 = c2.f1; + +-- Area not equal with circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 != c2.f1; + +-- Area less than circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1; + +-- Area greater than circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 > c2.f1; + +-- Area less than or equal circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <= c2.f1; + +-- Area greater than or equal circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 >= c2.f1; + +-- Area less than circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1; + +-- Area greater than circle +SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1; + +-- Add point +SELECT c.f1, p.f1, c.f1 + p.f1 FROM CIRCLE_TBL c, POINT_TBL p; + +-- Subtract point +SELECT c.f1, p.f1, c.f1 - p.f1 FROM CIRCLE_TBL c, POINT_TBL p; + +-- Multiply with point +SELECT c.f1, p.f1, c.f1 * p.f1 FROM CIRCLE_TBL c, POINT_TBL p; + +-- Divide by point +SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000; + +-- Overflow error +SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1[0] > 1000; + +-- Division by 0 error +SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1 ~= '(0,0)'::point; + +-- Distance to polygon +SELECT c.f1, p.f1, c.f1 <-> p.f1 FROM CIRCLE_TBL c, POLYGON_TBL p; diff --git a/src/test/singlenode_regress/sql/gin.sql b/src/test/singlenode_regress/sql/gin.sql new file mode 100644 index 00000000000..5194afcc1f5 --- /dev/null +++ b/src/test/singlenode_regress/sql/gin.sql @@ -0,0 +1,173 @@ +-- +-- Test GIN indexes. +-- +-- There are other tests to test different GIN opclasses. This is for testing +-- GIN itself. + +-- Create and populate a test table with a GIN index. +create table gin_test_tbl(i int4[]) with (autovacuum_enabled = off); +create index gin_test_idx on gin_test_tbl using gin (i) + with (fastupdate = on, gin_pending_list_limit = 4096); +insert into gin_test_tbl select array[1, 2, g] from generate_series(1, 20000) g; +insert into gin_test_tbl select array[1, 3, g] from generate_series(1, 1000) g; + +select gin_clean_pending_list('gin_test_idx')>10 as many; -- flush the fastupdate buffers + +insert into gin_test_tbl select array[3, 1, g] from generate_series(1, 1000) g; + +vacuum gin_test_tbl; -- flush the fastupdate buffers + +select gin_clean_pending_list('gin_test_idx'); -- nothing to flush + +-- Test vacuuming +delete from gin_test_tbl where i @> array[2]; +vacuum gin_test_tbl; + +-- Disable fastupdate, and do more insertions. With fastupdate enabled, most +-- insertions (by flushing the list pages) cause page splits. Without +-- fastupdate, we get more churn in the GIN data leaf pages, and exercise the +-- recompression codepaths. +alter index gin_test_idx set (fastupdate = off); + +insert into gin_test_tbl select array[1, 2, g] from generate_series(1, 1000) g; +insert into gin_test_tbl select array[1, 3, g] from generate_series(1, 1000) g; + +delete from gin_test_tbl where i @> array[2]; +vacuum gin_test_tbl; + +-- Test for "rare && frequent" searches +explain (costs off) +select count(*) from gin_test_tbl where i @> array[1, 999]; + +select count(*) from gin_test_tbl where i @> array[1, 999]; + +-- Very weak test for gin_fuzzy_search_limit +set gin_fuzzy_search_limit = 1000; + +explain (costs off) +select count(*) > 0 as ok from gin_test_tbl where i @> array[1]; + +select count(*) > 0 as ok from gin_test_tbl where i @> array[1]; + +reset gin_fuzzy_search_limit; + +-- Test optimization of empty queries +create temp table t_gin_test_tbl(i int4[], j int4[]); +create index on t_gin_test_tbl using gin (i, j); +insert into t_gin_test_tbl +values + (null, null), + ('{}', null), + ('{1}', null), + ('{1,2}', null), + (null, '{}'), + (null, '{10}'), + ('{1,2}', '{10}'), + ('{2}', '{10}'), + ('{1,3}', '{}'), + ('{1,1}', '{10}'); + +set enable_seqscan = off; +explain (costs off) +select * from t_gin_test_tbl where array[0] <@ i; +select * from t_gin_test_tbl where array[0] <@ i; +select * from t_gin_test_tbl where array[0] <@ i and '{}'::int4[] <@ j; + +explain (costs off) +select * from t_gin_test_tbl where i @> '{}'; +select * from t_gin_test_tbl where i @> '{}'; + +create function explain_query_json(query_sql text) +returns table (explain_line json) +language plpgsql as +$$ +begin + set enable_seqscan = off; + set enable_bitmapscan = on; + return query execute 'EXPLAIN (ANALYZE, FORMAT json) ' || query_sql; +end; +$$; + +create function execute_text_query_index(query_sql text) +returns setof text +language plpgsql +as +$$ +begin + set enable_seqscan = off; + set enable_bitmapscan = on; + return query execute query_sql; +end; +$$; + +create function execute_text_query_heap(query_sql text) +returns setof text +language plpgsql +as +$$ +begin + set enable_seqscan = on; + set enable_bitmapscan = off; + return query execute query_sql; +end; +$$; + +-- check number of rows returned by index and removed by recheck +select + query, + js->0->'Plan'->'Plans'->0->'Actual Rows' as "return by index", + js->0->'Plan'->'Rows Removed by Index Recheck' as "removed by recheck", + (res_index = res_heap) as "match" +from + (values + ($$ i @> '{}' $$), + ($$ j @> '{}' $$), + ($$ i @> '{}' and j @> '{}' $$), + ($$ i @> '{1}' $$), + ($$ i @> '{1}' and j @> '{}' $$), + ($$ i @> '{1}' and i @> '{}' and j @> '{}' $$), + ($$ j @> '{10}' $$), + ($$ j @> '{10}' and i @> '{}' $$), + ($$ j @> '{10}' and j @> '{}' and i @> '{}' $$), + ($$ i @> '{1}' and j @> '{10}' $$) + ) q(query), + lateral explain_query_json($$select * from t_gin_test_tbl where $$ || query) js, + lateral execute_text_query_index($$select string_agg((i, j)::text, ' ') from t_gin_test_tbl where $$ || query) res_index, + lateral execute_text_query_heap($$select string_agg((i, j)::text, ' ') from t_gin_test_tbl where $$ || query) res_heap; + +reset enable_seqscan; +reset enable_bitmapscan; + +-- re-purpose t_gin_test_tbl to test scans involving posting trees +insert into t_gin_test_tbl select array[1, g, g/10], array[2, g, g/10] + from generate_series(1, 20000) g; + +select gin_clean_pending_list('t_gin_test_tbl_i_j_idx') is not null; + +analyze t_gin_test_tbl; + +set enable_seqscan = off; +set enable_bitmapscan = on; + +explain (costs off) +select count(*) from t_gin_test_tbl where j @> array[50]; +select count(*) from t_gin_test_tbl where j @> array[50]; +explain (costs off) +select count(*) from t_gin_test_tbl where j @> array[2]; +select count(*) from t_gin_test_tbl where j @> array[2]; +explain (costs off) +select count(*) from t_gin_test_tbl where j @> '{}'::int[]; +select count(*) from t_gin_test_tbl where j @> '{}'::int[]; + +-- test vacuuming of posting trees +delete from t_gin_test_tbl where j @> array[2]; +vacuum t_gin_test_tbl; + +select count(*) from t_gin_test_tbl where j @> array[50]; +select count(*) from t_gin_test_tbl where j @> array[2]; +select count(*) from t_gin_test_tbl where j @> '{}'::int[]; + +reset enable_seqscan; +reset enable_bitmapscan; + +drop table t_gin_test_tbl; diff --git a/src/test/singlenode_regress/sql/gist.sql b/src/test/singlenode_regress/sql/gist.sql new file mode 100644 index 00000000000..d94a0bb2f75 --- /dev/null +++ b/src/test/singlenode_regress/sql/gist.sql @@ -0,0 +1,177 @@ +-- +-- Test GiST indexes. +-- +-- There are other tests to test different GiST opclasses. This is for +-- testing GiST code itself. Vacuuming in particular. + +create table gist_point_tbl(id int4, p point); +create index gist_pointidx on gist_point_tbl using gist(p); + +-- Verify the fillfactor and buffering options +create index gist_pointidx2 on gist_point_tbl using gist(p) with (buffering = on, fillfactor=50); +create index gist_pointidx3 on gist_point_tbl using gist(p) with (buffering = off); +create index gist_pointidx4 on gist_point_tbl using gist(p) with (buffering = auto); +drop index gist_pointidx2, gist_pointidx3, gist_pointidx4; + +-- Make sure bad values are refused +create index gist_pointidx5 on gist_point_tbl using gist(p) with (buffering = invalid_value); +create index gist_pointidx5 on gist_point_tbl using gist(p) with (fillfactor=9); +create index gist_pointidx5 on gist_point_tbl using gist(p) with (fillfactor=101); + +-- Insert enough data to create a tree that's a couple of levels deep. +insert into gist_point_tbl (id, p) +select g, point(g*10, g*10) from generate_series(1, 10000) g; + +insert into gist_point_tbl (id, p) +select g+100000, point(g*10+1, g*10+1) from generate_series(1, 10000) g; + +-- To test vacuum, delete some entries from all over the index. +delete from gist_point_tbl where id % 2 = 1; + +-- And also delete some concentration of values. +delete from gist_point_tbl where id > 5000; + +vacuum analyze gist_point_tbl; + +-- rebuild the index with a different fillfactor +alter index gist_pointidx SET (fillfactor = 40); +reindex index gist_pointidx; + +-- +-- Test Index-only plans on GiST indexes +-- + +create table gist_tbl (b box, p point, c circle); + +insert into gist_tbl +select box(point(0.05*i, 0.05*i), point(0.05*i, 0.05*i)), + point(0.05*i, 0.05*i), + circle(point(0.05*i, 0.05*i), 1.0) +from generate_series(0,10000) as i; + +vacuum analyze gist_tbl; + +set enable_seqscan=off; +set enable_bitmapscan=off; +set enable_indexonlyscan=on; + +-- Test index-only scan with point opclass +create index gist_tbl_point_index on gist_tbl using gist (p); + +-- check that the planner chooses an index-only scan +explain (costs off) +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)); + +-- execute the same +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)); + +-- Also test an index-only knn-search +explain (costs off) +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)) +order by p <-> point(0.201, 0.201); + +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)) +order by p <-> point(0.201, 0.201); + +-- Check commuted case as well +explain (costs off) +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)) +order by point(0.101, 0.101) <-> p; + +select p from gist_tbl where p <@ box(point(0,0), point(0.5, 0.5)) +order by point(0.101, 0.101) <-> p; + +-- Check case with multiple rescans (bug #14641) +explain (costs off) +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl where p <@ bb order by p <-> bb[0] limit 2) ss; + +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl where p <@ bb order by p <-> bb[0] limit 2) ss; + +drop index gist_tbl_point_index; + +-- Test index-only scan with box opclass +create index gist_tbl_box_index on gist_tbl using gist (b); + +-- check that the planner chooses an index-only scan +explain (costs off) +select b from gist_tbl where b <@ box(point(5,5), point(6,6)); + +-- execute the same +select b from gist_tbl where b <@ box(point(5,5), point(6,6)); + +-- Also test an index-only knn-search +explain (costs off) +select b from gist_tbl where b <@ box(point(5,5), point(6,6)) +order by b <-> point(5.2, 5.91); + +select b from gist_tbl where b <@ box(point(5,5), point(6,6)) +order by b <-> point(5.2, 5.91); + +-- Check commuted case as well +explain (costs off) +select b from gist_tbl where b <@ box(point(5,5), point(6,6)) +order by point(5.2, 5.91) <-> b; + +select b from gist_tbl where b <@ box(point(5,5), point(6,6)) +order by point(5.2, 5.91) <-> b; + +drop index gist_tbl_box_index; + +-- Test that an index-only scan is not chosen, when the query involves the +-- circle column (the circle opclass does not support index-only scans). +create index gist_tbl_multi_index on gist_tbl using gist (p, c); + +explain (costs off) +select p, c from gist_tbl +where p <@ box(point(5,5), point(6, 6)); + +-- execute the same +select b, p from gist_tbl +where b <@ box(point(4.5, 4.5), point(5.5, 5.5)) +and p <@ box(point(5,5), point(6, 6)); + +drop index gist_tbl_multi_index; + +-- Test that we don't try to return the value of a non-returnable +-- column in an index-only scan. (This isn't GIST-specific, but +-- it only applies to index AMs that can return some columns and not +-- others, so GIST with appropriate opclasses is a convenient test case.) +create index gist_tbl_multi_index on gist_tbl using gist (circle(p,1), p); +explain (verbose, costs off) +select circle(p,1) from gist_tbl +where p <@ box(point(5, 5), point(5.3, 5.3)); +select circle(p,1) from gist_tbl +where p <@ box(point(5, 5), point(5.3, 5.3)); + +-- Similarly, test that index rechecks involving a non-returnable column +-- are done correctly. +explain (verbose, costs off) +select p from gist_tbl where circle(p,1) @> circle(point(0,0),0.95); +select p from gist_tbl where circle(p,1) @> circle(point(0,0),0.95); + +-- Also check that use_physical_tlist doesn't trigger in such cases. +explain (verbose, costs off) +select count(*) from gist_tbl; +select count(*) from gist_tbl; + +-- This case isn't supported, but it should at least EXPLAIN correctly. +explain (verbose, costs off) +select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; +select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; + +-- Clean up +reset enable_seqscan; +reset enable_bitmapscan; +reset enable_indexonlyscan; + +drop table gist_tbl; diff --git a/src/test/singlenode_regress/sql/gp_foreign_data.sql b/src/test/singlenode_regress/sql/gp_foreign_data.sql new file mode 100644 index 00000000000..a26f96f9d50 --- /dev/null +++ b/src/test/singlenode_regress/sql/gp_foreign_data.sql @@ -0,0 +1,33 @@ +-- +-- Test foreign-data wrapper and server management. Cloudberry MPP specific +-- + +CREATE FOREIGN DATA WRAPPER dummy; +COMMENT ON FOREIGN DATA WRAPPER dummy IS 'useless'; + +-- CREATE FOREIGN TABLE +CREATE SERVER s0 FOREIGN DATA WRAPPER dummy; +CREATE FOREIGN TABLE ft2 ( + c1 int +) SERVER s0 OPTIONS (delimiter ',', mpp_execute 'a'); -- ERROR +CREATE FOREIGN TABLE ft2 ( + c1 int +) SERVER s0 OPTIONS (delimiter ',', mpp_execute 'any'); +\d+ ft2 +CREATE FOREIGN TABLE ft3 ( + c1 int +) SERVER s0 OPTIONS (delimiter ',', mpp_execute 'master'); +CREATE FOREIGN TABLE ft4 ( + c1 int +) SERVER s0 OPTIONS (delimiter ',', mpp_execute 'all segments'); + +-- Test num_segments option +CREATE SERVER s1 FOREIGN DATA WRAPPER dummy OPTIONS (num_segments '3'); +CREATE FOREIGN TABLE ft5 ( + c1 int +) SERVER s1 OPTIONS (delimiter ',', mpp_execute 'all segments', num_segments '5'); +\d+ ft5 + +--start_ignore +DROP FOREIGN DATA WRAPPER dummy CASCADE; +--end_ignore diff --git a/src/test/singlenode_regress/sql/gp_gin_index.sql b/src/test/singlenode_regress/sql/gp_gin_index.sql new file mode 100644 index 00000000000..c9fc81867dc --- /dev/null +++ b/src/test/singlenode_regress/sql/gp_gin_index.sql @@ -0,0 +1,128 @@ +CREATE INDEX jidx ON testjsonb USING gin (j); +SET optimizer_enable_tablescan = off; +SET enable_seqscan = off; +set enable_bitmapscan = on; + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}'; + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}'; +-- exercise GIN_SEARCH_MODE_ALL +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j ? 'public'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j ? 'bar'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; + +SELECT count(*) FROM testjsonb WHERE j @> '{}'; +SELECT count(*) FROM testjsonb WHERE j ? 'public'; +SELECT count(*) FROM testjsonb WHERE j ? 'bar'; +SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; +SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; + +-- array exists - array elements should behave as keys (for GIN index scans too) +CREATE INDEX jidx_array ON testjsonb USING gin((j->'array')); +-- gin index on expression not support for orca +EXPLAIN SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; +SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; +-- type sensitive array exists - should return no rows (since "exists" only +-- matches strings that are either object keys or array elements) +-- gin index on expression not support for orca +EXPLAIN SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; +SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; +-- However, a raw scalar is *contained* within the array +EXPLAIN SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; +SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; +DROP INDEX jidx_array; + +--gin path opclass +DROP INDEX jidx; +CREATE INDEX jidx ON testjsonb USING gin (j jsonb_path_ops); + +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +-- exercise GIN_SEARCH_MODE_ALL +EXPLAIN SELECT count(*) FROM testjsonb WHERE j @> '{}'; +SELECT count(*) FROM testjsonb WHERE j @> '{}'; +DROP INDEX jidx; + +-- check some corner cases for indexed nested containment (bug #13756) +create temp table nestjsonb (j jsonb); +insert into nestjsonb (j) values ('{"a":[["b",{"x":1}],["b",{"x":2}]],"c":3}'); +insert into nestjsonb (j) values ('[[14,2,3]]'); +insert into nestjsonb (j) values ('[1,[14,2,3]]'); +create index on nestjsonb using gin(j jsonb_path_ops); + +explain select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; +explain select * from nestjsonb where j @> '{"c":3}'; +explain select * from nestjsonb where j @> '[[14]]'; + +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; +select * from nestjsonb where j @> '{"c":3}'; +select * from nestjsonb where j @> '[[14]]'; + +CREATE INDEX wowidx ON test_tsvector USING gin (a); +-- GIN only supports bitmapscan, so no need to test plain indexscan +explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; +-- For orca, ScalarArrayOpExpr condition on index scan not supported +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; +EXPLAIN SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; +-- For orca, ScalarArrayOpExpr condition on index scan not supported +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; + +DROP INDEX wowidx; + +-- GIN index on complex array +CREATE TABLE complex_array_table (complex_arr complex[]); +CREATE INDEX ON complex_array_table USING gin (complex_arr); + +INSERT INTO complex_array_table VALUES (ARRAY[COMPLEX(1,3), COMPLEX(5,7)]); +INSERT INTO complex_array_table VALUES (ARRAY[COMPLEX(2,4), COMPLEX(6,8)]); + +EXPLAIN SELECT * FROM complex_array_table WHERE complex_arr @> ARRAY[COMPLEX(2,4)]; +SELECT * FROM complex_array_table WHERE complex_arr @> ARRAY[COMPLEX(2,4)]; +-- with orca bitmap table scan off and table scan off, orca should fallback to +-- planner to use bitmap index scan, as btree index plans are not supported with gin +set optimizer_enable_tablescan=off; +EXPLAIN SELECT * FROM complex_array_table WHERE complex_arr @> ARRAY[COMPLEX(2,4)]; +DROP TABLE complex_array_table; +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET optimizer_enable_tablescan; diff --git a/src/test/singlenode_regress/sql/gp_recursive_cte.sql b/src/test/singlenode_regress/sql/gp_recursive_cte.sql new file mode 100644 index 00000000000..d5775fb5d1d --- /dev/null +++ b/src/test/singlenode_regress/sql/gp_recursive_cte.sql @@ -0,0 +1,508 @@ +-- Tests exercising different behaviour of the WITH RECURSIVE implementation in GPDB +-- GPDB's distributed nature requires thorough testing of many use cases in order to ensure correctness + + +-- Setup +create schema recursive_cte; +set search_path=recursive_cte; +create table recursive_table_1(id int); +insert into recursive_table_1 values (1), (2), (100); + +-- Test the featureblocking GUC for recursive CTE +set gp_recursive_cte to off; +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where recursive_table_1.id IN (select * from r limit 10); +set gp_recursive_cte to on; + +-- WITH RECURSIVE ref used with IN without correlation +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where recursive_table_1.id IN (select * from r limit 10); + +-- WITH RECURSIVE ref used with NOT IN without correlation +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where recursive_table_1.id NOT IN (select * from r limit 10); + +-- WITH RECURSIVE ref used with EXISTS without correlation +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where EXISTS (select * from r limit 10); + +-- WITH RECURSIVE ref used with NOT EXISTS without correlation +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where NOT EXISTS (select * from r limit 10); + +create table recursive_table_2(id int); +insert into recursive_table_2 values (11) , (21), (31); + +-- WITH RECURSIVE ref used with IN & correlation +with recursive r(i) as ( + select * from recursive_table_2 + union all + select r.i + 1 from r, recursive_table_2 where r.i = recursive_table_2.id +) +select recursive_table_1.id from recursive_table_1, recursive_table_2 where recursive_table_1.id IN (select * from r where r.i = recursive_table_2.id); + +-- WITH RECURSIVE ref used with NOT IN & correlation +with recursive r(i) as ( + select * from recursive_table_2 + union all + select r.i + 1 from r, recursive_table_2 where r.i = recursive_table_2.id +) +select recursive_table_1.id from recursive_table_1, recursive_table_2 where recursive_table_1.id NOT IN (select * from r where r.i = recursive_table_2.id); + +-- WITH RECURSIVE ref used with EXISTS & correlation +with recursive r(i) as ( + select * from recursive_table_2 + union all + select r.i + 1 from r, recursive_table_2 where r.i = recursive_table_2.id +) +select recursive_table_1.id from recursive_table_1, recursive_table_2 where recursive_table_1.id = recursive_table_2.id and EXISTS (select * from r where r.i = recursive_table_2.id); + +-- WITH RECURSIVE ref used with NOT EXISTS & correlation +with recursive r(i) as ( + select * from recursive_table_2 + union all + select r.i + 1 from r, recursive_table_2 where r.i = recursive_table_2.id +) +select recursive_table_1.id from recursive_table_1, recursive_table_2 where recursive_table_1.id = recursive_table_2.id and NOT EXISTS (select * from r where r.i = recursive_table_2.id); + +-- WITH RECURSIVE ref used within a Expression sublink +with recursive r(i) as ( + select 1 + union all + select i + 1 from r +) +select * from recursive_table_1 where recursive_table_1.id >= (select i from r limit 1) order by recursive_table_1.id; + +-- WITH RECURSIVE ref used within an EXISTS subquery in another recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and EXISTS (select * from r limit 10) +) +select * from y limit 10; + +-- WITH RECURSIVE ref used within a NOT EXISTS subquery in another recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and NOT EXISTS (select * from r limit 10) +) +select * from y limit 10; + +-- WITH RECURSIVE ref used within an IN subquery in a non-recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y as ( + select * from recursive_table_1 where recursive_table_1.id IN (select * from r limit 10) +) +select * from y; + +-- WITH RECURSIVE ref used within a NOT IN subquery in a non-recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y as ( + select * from recursive_table_1 where recursive_table_1.id NOT IN (select * from r limit 10) +) +select * from y; + +-- WITH RECURSIVE ref used within an EXISTS subquery in a non-recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y as ( + select * from recursive_table_1 where EXISTS (select * from r limit 10) +) +select * from y; + +-- WITH RECURSIVE ref used within a NOT EXISTS subquery in a non-recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y as ( + select * from recursive_table_1 where NOT EXISTS (select * from r limit 10) +) +select * from y; + +-- WITH RECURSIVE non-recursive ref used within an EXISTS subquery in a recursive CTE +with recursive +r as ( + select * from recursive_table_2 +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and EXISTS (select * from r) +) +select * from y limit 10; + +-- WITH RECURSIVE non-recursive ref used within a NOT EXISTS subquery in a recursive CTE +with recursive +r as ( + select * from recursive_table_2 +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and NOT EXISTS (select * from r) +) +select * from y limit 10; + +-- WITH ref used within an IN subquery in another CTE +with +r as ( + select * from recursive_table_2 where id < 21 +), +y as ( + select * from recursive_table_1 where id IN (select * from r) +) +select * from y; + +-- WITH ref used within a NOT IN subquery in another CTE +with +r as ( + select * from recursive_table_2 where id < 21 +), +y as ( + select * from recursive_table_1 where id NOT IN (select * from r) +) +select * from y; + +-- WITH ref used within an EXISTS subquery in another CTE +with +r as ( + select * from recursive_table_2 where id < 21 +), +y as ( + select * from recursive_table_1 where EXISTS (select * from r) +) +select * from y; + +-- WITH ref used within a NOT EXISTS subquery in another CTE +with +r as ( + select * from recursive_table_2 where id < 21 +), +y as ( + select * from recursive_table_1 where NOT EXISTS (select * from r) +) +select * from y; + +-- WITH RECURSIVE ref used within a IN subquery in another recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and i IN (select * from r limit 10) +) +select * from y limit 10; + +-- WITH RECURSIVE ref used within a NOT IN subquery in another recursive CTE +with recursive +r(i) as ( + select 1 + union all + select r.i + 1 from r, recursive_table_2 where i = recursive_table_2.id +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and i NOT IN (select * from r limit 10) +) +select * from y limit 10; + +-- WITH RECURSIVE non-recursive ref used within an IN subquery in a recursive CTE +with recursive +r as ( + select * from recursive_table_2 +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and i IN (select * from r) +) +select * from y limit 10; + +-- WITH RECURSIVE non-recursive ref used within a NOT IN subquery in a recursive CTE +with recursive +r as ( + select * from recursive_table_2 +), +y(i) as ( + select 1 + union all + select i + 1 from y, recursive_table_1 where i = recursive_table_1.id and i NOT IN (select * from r) +) +select * from y limit 10; + +create table recursive_table_3(id int, a int); +insert into recursive_table_3 values (1, 2), (2, 3); +-- WITH RECURSIVE ref used within a window function +with recursive r(i, j) as ( + select * from recursive_table_3 + union all + select i + 1, j from r, recursive_table_3 where r.i < recursive_table_3.id +) +select avg(i) over(partition by j) from r limit 100; + +-- WITH RECURSIVE ref used within a UDF +create function sum_to_zero(integer) returns bigint as $$ +with recursive r(i) as ( + select $1 + union all + select i - 1 from r where i > 0 +) +select sum(i) from r; +$$ language sql; +select sum_to_zero(10); + +-- WITH RECURSIVE ref used within a UDF against a distributed table +create table people(name text, parent_of text); +insert into people values ('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e'); +create function get_lineage(text) returns setof text as $$ +with recursive r(person) as ( + select name from people where name = $1 + union all + select name from r, people where people.parent_of = r.person +) +select * from r; +$$ language sql; +select get_lineage('d'); + +-- non-recursive CTE nested in non-recursive enclosing CTE +INSERT INTO recursive_table_1 SELECT i FROM generate_series(0, 100) i; + +SELECT MAX(j) +FROM +( + WITH nr1(i) AS (SELECT id FROM recursive_table_1 WHERE id >= 10) + SELECT * FROM + ( + WITH nr2(j) AS (SELECT i FROM nr1 WHERE i >= 50) + SELECT nr2.j FROM nr2, nr1 + ) sub2 +) sub1; + +-- non-recursive CTE nested in recursive enclosing CTE +WITH RECURSIVE r1(i) AS +( + SELECT 1 + UNION ALL + ( + WITH r2(j) AS + ( + SELECT id FROM recursive_table_1 WHERE id < 5 + ) + SELECT SUM(j) FROM r2 + ) +) +SELECT * FROM r1; + +-- recursive CTE nested in recursive enclosing CTE +WITH RECURSIVE r1(i) AS +( + SELECT 1 + UNION ALL + ( + WITH RECURSIVE r2(j) AS + ( + SELECT 1 + UNION ALL + SELECT j + 1 FROM r2 WHERE j < 5 + ) + SELECT i + 1 FROM r1, r2 WHERE i < 5 + ) +) +SELECT SUM(i) FROM r1; + +-- recursive CTE nested in non-recursive enclosing CTE +WITH nr(i) AS +( + WITH RECURSIVE r(j) AS + ( + SELECT 1 + UNION ALL + SELECT j + 1 FROM r WHERE j < 5 + ) + SELECT SUM(j) FROM r +) +SELECT SUM(i) FROM nr; + +-- WITH RECURSIVE ref within a correlated subquery +create table recursive_table_4(a int, b int); +create table recursive_table_5(c int, d int); +insert into recursive_table_4 select i, i* 2 from generate_series(1, 10) i; +insert into recursive_table_5 select i/2, i from generate_series(1, 10) i; +select * from recursive_table_4 where a > ALL ( + with recursive r(i) as ( + select sum(c) from recursive_table_5 where d < recursive_table_4.b + union all + select i / 2 from r where i > 0 + ) + select * from r +); + +with recursive x(i) as ( + select 1 +), +y(i) as ( + select sum(i) from x + union all + select i + 1 from y +), +z(i) as ( + select avg(i) from x + union all + select i + 1 from z +) +(select * from y limit 5) +union +(select * from z limit 10); + +-- WTIH RECURSIVE and replicated table +create table t_rep_test_rcte(c int) ; +create table t_rand_test_rcte(c int); +insert into t_rep_test_rcte values (1); +insert into t_rand_test_rcte values (1), (2), (3); + +analyze t_rep_test_rcte; +analyze t_rand_test_rcte; + +explain +with recursive the_cte_here(n) as ( + select * from t_rep_test_rcte + union all + select n+1 from the_cte_here join t_rand_test_rcte + on t_rand_test_rcte.c = the_cte_here.n) +select * from the_cte_here; + +with recursive the_cte_here(n) as ( + select * from t_rep_test_rcte + union all + select n+1 from the_cte_here join t_rand_test_rcte + on t_rand_test_rcte.c = the_cte_here.n) +select * from the_cte_here; + +-- WITH RECURSIVE non-recursive shouldn't have hash locus +create table recursive_locus_t1(id int, pid int, name text) ; +insert into recursive_locus_t1 values(0, -1, 'AAA'); +insert into recursive_locus_t1 values(1, 0, 'B1'); +insert into recursive_locus_t1 values(2, 0, 'B2'); +insert into recursive_locus_t1 values(3, 1, 'C1_1'); +insert into recursive_locus_t1 values(4, 1, 'C1_2'); +insert into recursive_locus_t1 values(5, 1, 'C1_3'); +insert into recursive_locus_t1 values(6, 2, 'C2_1'); +insert into recursive_locus_t1 values(7, 2, 'C2_2'); +insert into recursive_locus_t1 values(8, 2, 'C2_3'); + +explain (costs off) with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t1 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t1 k inner join cte c on c.id = k.pid +) +select id,name from cte; +with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t1 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t1 k inner join cte c on c.id = k.pid +) +select id,name from cte; + +create table recursive_locus_t2(id int, pid int, name text) ; +insert into recursive_locus_t2 values(0, -1, 'AAA'); +insert into recursive_locus_t2 values(1, 0, 'B1'); +insert into recursive_locus_t2 values(2, 0, 'B2'); +insert into recursive_locus_t2 values(3, 1, 'C1_1'); +insert into recursive_locus_t2 values(4, 1, 'C1_2'); +insert into recursive_locus_t2 values(5, 1, 'C1_3'); +insert into recursive_locus_t2 values(6, 2, 'C2_1'); +insert into recursive_locus_t2 values(7, 2, 'C2_2'); +insert into recursive_locus_t2 values(8, 2, 'C2_3'); + +explain (costs off) with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t2 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t2 k inner join cte c on c.id = k.pid +) +select id,name from cte; +with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t2 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t2 k inner join cte c on c.id = k.pid +) +select id,name from cte; + +create table recursive_locus_t3(id int, pid int, name text); +insert into recursive_locus_t3 values(0, -1, 'AAA'); +insert into recursive_locus_t3 values(1, 0, 'B1'); +insert into recursive_locus_t3 values(2, 0, 'B2'); +insert into recursive_locus_t3 values(3, 1, 'C1_1'); +insert into recursive_locus_t3 values(4, 1, 'C1_2'); +insert into recursive_locus_t3 values(5, 1, 'C1_3'); +insert into recursive_locus_t3 values(6, 2, 'C2_1'); +insert into recursive_locus_t3 values(7, 2, 'C2_2'); +insert into recursive_locus_t3 values(8, 2, 'C2_3'); + +explain (costs off) with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t3 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t3 k inner join cte c on c.id = k.pid +) +select id,name from cte; +with RECURSIVE cte as ( + select a.id, a.name from recursive_locus_t3 a where id=0 + union all + select k.id, (c.name || '>' || k.name) as name from recursive_locus_t3 k inner join cte c on c.id = k.pid +) +select id,name from cte; + diff --git a/src/test/singlenode_regress/sql/groupingsets.sql b/src/test/singlenode_regress/sql/groupingsets.sql new file mode 100644 index 00000000000..603c2a4a80e --- /dev/null +++ b/src/test/singlenode_regress/sql/groupingsets.sql @@ -0,0 +1,685 @@ +-- +-- grouping sets +-- + +-- GPDB: Some of the tests in this file test the case that some columns are +-- unsortable, and some are unhashable. For the unhashable column, the upstream +-- tests use 'bit' datatype. However, we have added a hash opclass for 'bit' +-- in GPDB, which makes the tests ineffective in testing that. +-- +-- To work around that, create a new datatype that is just like the built-in +-- 'bit' type, but doesn't have the hash opclass. +create type unhashable_bit; +create function unhashable_bit_out (unhashable_bit) returns cstring immutable +language internal as 'bit_out'; +create function unhashable_bit_in (cstring) returns unhashable_bit immutable +language internal as 'bit_in'; +create type unhashable_bit ( + input = unhashable_bit_in, + output = unhashable_bit_out, + typmod_in = bittypmodin, + typmod_out = bittypmodout, + like = bit); + +create function unhashable_biteq(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'biteq'; +create function unhashable_bitne(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitne'; +create function unhashable_bitge(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitge'; +create function unhashable_bitgt(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitgt'; +create function unhashable_bitle(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitle'; +create function unhashable_bitlt(unhashable_bit, unhashable_bit) returns bool +immutable language internal as 'bitlt'; +create function unhashable_bitcmp(unhashable_bit, unhashable_bit) returns int4 +immutable language internal as 'bitcmp'; + +create operator = (function=unhashable_biteq, leftarg=unhashable_bit, rightarg=unhashable_bit, + merges, commutator = "=", negator = "<>", + restrict = 'eqsel', join = 'eqjoinsel'); +create operator <> (function=unhashable_bitne, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = "<>", negator = "=", + restrict = 'neqsel', join = 'neqjoinsel'); +create operator >= (function=unhashable_bitge, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = "<=", negator = "<", + restrict = 'scalargesel', join = 'scalargejoinsel'); +create operator > (function=unhashable_bitgt, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = "<", negator = "<=", + restrict = 'scalargtsel', join = 'scalargtjoinsel'); +create operator <= (function=unhashable_bitle, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = ">=", negator = ">", + restrict = 'scalarlesel', join = 'scalarlejoinsel'); +create operator < (function=unhashable_bitlt, leftarg=unhashable_bit, rightarg=unhashable_bit, + commutator = ">", negator = ">=", + restrict = 'scalarltsel', join = 'scalarltjoinsel'); + +create operator class unhashable_bit_ops + default for type unhashable_bit using btree as + operator 1 < , + operator 2 <= , + operator 3 = , + operator 4 >= , + operator 5 > , + function 1 unhashable_bitcmp(unhashable_bit, unhashable_bit); + +create cast (bit as unhashable_bit) without function as assignment; + + +-- test data sources + +create temp view gstest1(a,b,v) + as values (1,1,10),(1,1,11),(1,2,12),(1,2,13),(1,3,14), + (2,3,15), + (3,3,16),(3,4,17), + (4,1,18),(4,1,19); + +create temp table gstest2 (a integer, b integer, c integer, d integer, + e integer, f integer, g integer, h integer); +copy gstest2 from stdin; +1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 2 +1 1 1 1 1 1 2 2 +1 1 1 1 1 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 2 2 2 2 2 2 +1 2 2 2 2 2 2 2 +2 2 2 2 2 2 2 2 +\. +ANALYZE gstest2; + +create temp table gstest3 (a integer, b integer, c integer, d integer); +copy gstest3 from stdin; +1 1 1 1 +2 2 2 2 +\. +alter table gstest3 add primary key (a); + +create temp table gstest4(id integer, v integer, + unhashable_col unhashable_bit(4), unsortable_col xid); +insert into gstest4 +values (1,1,b'0000','1'), (2,2,b'0001','1'), + (3,4,b'0010','2'), (4,8,b'0011','2'), + (5,16,b'0000','2'), (6,32,b'0001','2'), + (7,64,b'0010','1'), (8,128,b'0011','1'); + +create temp table gstest_empty (a integer, b integer, v integer); + +create function gstest_data(v integer, out a integer, out b integer) + returns setof record + as $f$ + begin + return query select v, i from generate_series(1,3) i; + end; + $f$ language plpgsql; + +-- basic functionality + +set enable_hashagg = false; -- test hashing explicitly later + +-- simple rollup with multiple plain aggregates, with and without ordering +-- (and with ordering differing from grouping) + +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by rollup (a,b); +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by rollup (a,b) order by a,b; +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by rollup (a,b) order by b desc, a; +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by rollup (a,b) order by coalesce(a,0)+coalesce(b,0); + +-- various types of ordered aggs +select a, b, grouping(a,b), + array_agg(v order by v), + string_agg(v::text, ':' order by v desc), + percentile_disc(0.5) within group (order by v), + rank(1,2,12) within group (order by a,b,v) + from gstest1 group by rollup (a,b) order by a,b; + +-- test usage of grouped columns in direct args of aggs +select grouping(a), a, array_agg(b), + rank(a) within group (order by b nulls first), + rank(a) within group (order by b nulls last) + from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) + group by rollup (a) order by a; + +-- nesting with window functions +select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum + from gstest2 group by rollup (a,b) order by rsum, a, b; + +-- nesting with grouping sets +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(()))) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets((), grouping sets((), grouping sets(((a, b))))) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(grouping sets(rollup(c), grouping sets(cube(c)))) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(a, grouping sets(a, cube(b))) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(grouping sets((a, (b)))) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(grouping sets((a, b))) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a), a)) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets(grouping sets(a, grouping sets(a, grouping sets(a), ((a)), a, grouping sets(a), (a)), a)) + order by 1 desc; +select sum(c) from gstest2 + group by grouping sets((a,(a,b)), grouping sets((a,(a,b)),a)) + order by 1 desc; + +-- empty input: first is 0 rows, second 1, third 3 etc. +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),()); +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),(),(),()); +select sum(v), count(*) from gstest_empty group by grouping sets ((),(),()); + +-- empty input with joins tests some important code paths +select t1.a, t2.b, sum(t1.v), count(*) from gstest_empty t1, gstest_empty t2 + group by grouping sets ((t1.a,t2.b),()); + +-- simple joins, var resolution, GROUPING on join vars +select t1.a, t2.b, grouping(t1.a, t2.b), sum(t1.v), max(t2.a) + from gstest1 t1, gstest2 t2 + group by grouping sets ((t1.a, t2.b), ()); + +select t1.a, t2.b, grouping(t1.a, t2.b), sum(t1.v), max(t2.a) + from gstest1 t1 join gstest2 t2 on (t1.a=t2.a) + group by grouping sets ((t1.a, t2.b), ()); + +select a, b, grouping(a, b), sum(t1.v), max(t2.c) + from gstest1 t1 join gstest2 t2 using (a,b) + group by grouping sets ((a, b), ()); + +-- check that functionally dependent cols are not nulled +select a, d, grouping(a,b,c) + from gstest3 + group by grouping sets ((a,b), (a,c)); + +-- check that distinct grouping columns are kept separate +-- even if they are equal() +explain (costs off) +select g as alias1, g as alias2 + from generate_series(1,3) g + group by alias1, rollup(alias2); + +select g as alias1, g as alias2 + from generate_series(1,3) g + group by alias1, rollup(alias2); + +-- check that pulled-up subquery outputs still go to null when appropriate +select four, x + from (select four, ten, 'foo'::text as x from tenk1) as t + group by grouping sets (four, x) + having x = 'foo'; + +select four, x || 'x' + from (select four, ten, 'foo'::text as x from tenk1) as t + group by grouping sets (four, x) + order by four; + +select (x+y)*1, sum(z) + from (select 1 as x, 2 as y, 3 as z) s + group by grouping sets (x+y, x); + +select x, not x as not_x, q2 from + (select *, q1 = 1 as x from int8_tbl i1) as t + group by grouping sets(x, q2) + order by x, q2; + +-- check qual push-down rules for a subquery with grouping sets +explain (verbose, costs off) +select * from ( + select 1 as x, q1, sum(q2) + from int8_tbl i1 + group by grouping sets(1, 2) +) ss +where x = 1 and q1 = 123; + +select * from ( + select 1 as x, q1, sum(q2) + from int8_tbl i1 + group by grouping sets(1, 2) +) ss +where x = 1 and q1 = 123; + +-- check handling of pulled-up SubPlan in GROUPING() argument (bug #17479) +explain (verbose, costs off) +select grouping(ss.x) +from int8_tbl i1 +cross join lateral (select (select i1.q1) as x) ss +group by ss.x; + +select grouping(ss.x) +from int8_tbl i1 +cross join lateral (select (select i1.q1) as x) ss +group by ss.x; + +explain (verbose, costs off) +select (select grouping(ss.x)) +from int8_tbl i1 +cross join lateral (select (select i1.q1) as x) ss +group by ss.x; + +select (select grouping(ss.x)) +from int8_tbl i1 +cross join lateral (select (select i1.q1) as x) ss +group by ss.x; + +-- simple rescan tests + +select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by rollup (a,b); + +select * + from (values (1),(2)) v(x), + lateral (select a, b, sum(v.x) from gstest_data(v.x) group by rollup (a,b)) s; + +-- min max optimization should still work with GROUP BY () +explain (costs off) + select min(unique1) from tenk1 GROUP BY (); + +-- Views with GROUPING SET queries +CREATE VIEW gstest_view AS select a, b, grouping(a,b), sum(c), count(*), max(c) + from gstest2 group by rollup ((a,b,c),(c,d)); + +select pg_get_viewdef('gstest_view'::regclass, true); + +-- Nested queries with 3 or more levels of nesting +select(select (select grouping(a,b) from (values (1)) v2(c)) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); +select(select (select grouping(e,f) from (values (1)) v2(c)) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); +select(select (select grouping(c) from (values (1)) v2(c) GROUP BY c) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); + +-- Combinations of operations +select a, b, c, d from gstest2 group by rollup(a,b),grouping sets(c,d); +select a, b from (values (1,2),(2,3)) v(a,b) group by a,b, grouping sets(a); + +-- Tests for chained aggregates +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a,b),(a+1,b+1),(a+2,b+2)) order by 3,6; +select(select (select grouping(a,b) from (values (1)) v2(c)) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY ROLLUP((e+1),(f+1)); +select(select (select grouping(a,b) from (values (1)) v2(c)) from (values (1,2)) v1(a,b) group by (a,b)) from (values(6,7)) v3(e,f) GROUP BY CUBE((e+1),(f+1)) ORDER BY (e+1),(f+1); +select a, b, sum(c), sum(sum(c)) over (order by a,b) as rsum + from gstest2 group by cube (a,b) order by rsum, a, b; +select a, b, sum(c) from (values (1,1,10),(1,1,11),(1,2,12),(1,2,13),(1,3,14),(2,3,15),(3,3,16),(3,4,17),(4,1,18),(4,1,19)) v(a,b,c) group by rollup (a,b); +select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by cube (a,b) order by a,b; + +-- Test reordering of grouping sets +explain (costs off) +select * from gstest1 group by grouping sets((a,b,v),(v)) order by v,b,a; + +-- Agg level check. This query should error out. +select (select grouping(a,b) from gstest2) from gstest2 group by a,b; + +--Nested queries +select a, b, sum(c), count(*) from gstest2 group by grouping sets (rollup(a,b),a); + +-- HAVING queries +select ten, sum(distinct four) from onek a +group by grouping sets((ten,four),(ten)) +having exists (select 1 from onek b where sum(distinct a.four) = b.four); + +-- Tests around pushdown of HAVING clauses, partially testing against previous bugs +select a,count(*) from gstest2 group by rollup(a) order by a; +select a,count(*) from gstest2 group by rollup(a) having a is distinct from 1 order by a; +explain (costs off) + select a,count(*) from gstest2 group by rollup(a) having a is distinct from 1 order by a; + +select v.c, (select count(*) from gstest2 group by () having v.c) + from (values (false),(true)) v(c) order by v.c; +explain (costs off) + select v.c, (select count(*) from gstest2 group by () having v.c) + from (values (false),(true)) v(c) order by v.c; + +-- HAVING with GROUPING queries +select ten, grouping(ten) from onek +group by grouping sets(ten) having grouping(ten) >= 0 +order by 2,1; +select ten, grouping(ten) from onek +group by grouping sets(ten, four) having grouping(ten) > 0 +order by 2,1; +select ten, grouping(ten) from onek +group by rollup(ten) having grouping(ten) > 0 +order by 2,1; +select ten, grouping(ten) from onek +group by cube(ten) having grouping(ten) > 0 +order by 2,1; +select ten, grouping(ten) from onek +group by (ten) having grouping(ten) >= 0 +order by 2,1; + +-- FILTER queries +select ten, sum(distinct four) filter (where four::text ~ '123') from onek a +group by rollup(ten); + +-- More rescan tests +-- start_ignore +-- GPDB_95_MERGE_FIXME: the lateral query with grouping sets do not make right plans +select * from (values (1),(2)) v(a) left join lateral (select v.a, four, ten, count(*) from onek group by cube(four,ten)) s on true order by v.a,four,ten; +-- end_ignore +select array(select row(v.a,s1.*) from (select two,four, count(*) from onek group by cube(two,four) order by two,four) s1) from (values (1),(2)) v(a); + +-- Grouping on text columns +select sum(ten) from onek group by two, rollup(four::text) order by 1; +select sum(ten) from onek group by rollup(four::text), two order by 1; + +-- hashing support + +set enable_hashagg = true; + +-- failure cases + +select count(*) from gstest4 group by rollup(unhashable_col,unsortable_col); +select array_agg(v order by v) from gstest4 group by grouping sets ((id,unsortable_col),(id)); + +-- simple cases + +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a),(b)) order by 3,1,2; +explain (costs off) select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a),(b)) order by 3,1,2; + +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by cube(a,b) order by 3,1,2; +explain (costs off) select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by cube(a,b) order by 3,1,2; + +-- shouldn't try and hash +explain (costs off) + select a, b, grouping(a,b), array_agg(v order by v) + from gstest1 group by cube(a,b); + +-- unsortable cases +select unsortable_col, count(*) + from gstest4 group by grouping sets ((unsortable_col),(unsortable_col)) + order by unsortable_col::text; + +-- mixed hashable/sortable cases +select unhashable_col, unsortable_col, + grouping(unhashable_col, unsortable_col), + count(*), sum(v) + from gstest4 group by grouping sets ((unhashable_col),(unsortable_col)) + order by 3, 5; +explain (costs off) + select unhashable_col, unsortable_col, + grouping(unhashable_col, unsortable_col), + count(*), sum(v) + from gstest4 group by grouping sets ((unhashable_col),(unsortable_col)) + order by 3,5; + +select unhashable_col, unsortable_col, + grouping(unhashable_col, unsortable_col), + count(*), sum(v) + from gstest4 group by grouping sets ((v,unhashable_col),(v,unsortable_col)) + order by 3,5; +explain (costs off) + select unhashable_col, unsortable_col, + grouping(unhashable_col, unsortable_col), + count(*), sum(v) + from gstest4 group by grouping sets ((v,unhashable_col),(v,unsortable_col)) + order by 3,5; + +-- empty input: first is 0 rows, second 1, third 3 etc. +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); +explain (costs off) + select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),a); +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),()); +select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),(),(),()); +explain (costs off) + select a, b, sum(v), count(*) from gstest_empty group by grouping sets ((a,b),(),(),()); +select sum(v), count(*) from gstest_empty group by grouping sets ((),(),()); +explain (costs off) + select sum(v), count(*) from gstest_empty group by grouping sets ((),(),()); + +-- check that functionally dependent cols are not nulled +select a, d, grouping(a,b,c) + from gstest3 + group by grouping sets ((a,b), (a,c)); +explain (costs off) + select a, d, grouping(a,b,c) + from gstest3 + group by grouping sets ((a,b), (a,c)); + +-- simple rescan tests + +select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by grouping sets (a,b) + order by 1, 2, 3; +explain (costs off) + select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by grouping sets (a,b) + order by 3, 1, 2; +select * + from (values (1),(2)) v(x), + lateral (select a, b, sum(v.x) from gstest_data(v.x) group by grouping sets (a,b)) s; +explain (costs off) + select * + from (values (1),(2)) v(x), + lateral (select a, b, sum(v.x) from gstest_data(v.x) group by grouping sets (a,b)) s; + +-- Tests for chained aggregates +select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a,b),(a+1,b+1),(a+2,b+2)) order by 3,6; +explain (costs off) + select a, b, grouping(a,b), sum(v), count(*), max(v) + from gstest1 group by grouping sets ((a,b),(a+1,b+1),(a+2,b+2)) order by 3,6; +select a, b, sum(c), sum(d), sum(e), sum(sum(c)) over (order by a,b) as rsum + from gstest2 group by cube (a,b) order by rsum, a, b; +explain (costs off) + select a, b, sum(c), sum(d), sum(e), sum(sum(c)) over (order by a,b) as rsum + from gstest2 group by cube (a,b) order by rsum, a, b; +select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by cube (a,b) order by a,b; +explain (costs off) + select a, b, sum(v.x) + from (values (1),(2)) v(x), gstest_data(v.x) + group by cube (a,b) order by a,b; + +-- Verify that we correctly handle the child node returning a +-- non-minimal slot, which happens if the input is pre-sorted, +-- e.g. due to an index scan. +BEGIN; +SET LOCAL enable_hashagg = false; +EXPLAIN (COSTS OFF) SELECT a, b, count(*), max(a), max(b) FROM gstest3 GROUP BY GROUPING SETS(a, b,()) ORDER BY a, b; +SELECT a, b, count(*), max(a), max(b) FROM gstest3 GROUP BY GROUPING SETS(a, b,()) ORDER BY a, b; +SET LOCAL enable_seqscan = false; +EXPLAIN (COSTS OFF) SELECT a, b, count(*), max(a), max(b) FROM gstest3 GROUP BY GROUPING SETS(a, b,()) ORDER BY a, b; +SELECT a, b, count(*), max(a), max(b) FROM gstest3 GROUP BY GROUPING SETS(a, b,()) ORDER BY a, b; +COMMIT; + +-- More rescan tests +-- start_ignore +-- GPDB_95_MERGE_FIXME: the lateral query with grouping sets do not make right plans +select * from (values (1),(2)) v(a) left join lateral (select v.a, four, ten, count(*) from onek group by cube(four,ten)) s on true order by v.a,four,ten; +-- end_ignore +select array(select row(v.a,s1.*) from (select two,four, count(*) from onek group by cube(two,four) order by two,four) s1) from (values (1),(2)) v(a); + +-- Rescan logic changes when there are no empty grouping sets, so test +-- that too: +select * from (values (1),(2)) v(a) left join lateral (select v.a, four, ten, count(*) from onek group by grouping sets(four,ten)) s on true order by v.a,four,ten; +select array(select row(v.a,s1.*) from (select two,four, count(*) from onek group by grouping sets(two,four) order by two,four) s1) from (values (1),(2)) v(a); + +-- test the knapsack + +set enable_indexscan = false; +set work_mem = '64kB'; +explain (costs off) + select unique1, + count(two), count(four), count(ten), + count(hundred), count(thousand), count(twothousand), + count(*) + from tenk1 group by grouping sets (unique1,twothousand,thousand,hundred,ten,four,two); +explain (costs off) + select unique1, + count(two), count(four), count(ten), + count(hundred), count(thousand), count(twothousand), + count(*) + from tenk1 group by grouping sets (unique1,hundred,ten,four,two); + +set work_mem = '384kB'; +explain (costs off) + select unique1, + count(two), count(four), count(ten), + count(hundred), count(thousand), count(twothousand), + count(*) + from tenk1 group by grouping sets (unique1,twothousand,thousand,hundred,ten,four,two); + +-- check collation-sensitive matching between grouping expressions +-- (similar to a check for aggregates, but there are additional code +-- paths for GROUPING, so check again here) + +select v||'a', case grouping(v||'a') when 1 then 1 else 0 end, count(*) + from unnest(array[1,1], array['a','b']) u(i,v) + group by rollup(i, v||'a') order by 1,3; +select v||'a', case when grouping(v||'a') = 1 then 1 else 0 end, count(*) + from unnest(array[1,1], array['a','b']) u(i,v) + group by rollup(i, v||'a') order by 1,3; + +-- Bug #16784 +create table bug_16784(i int, j int); +analyze bug_16784; +alter table bug_16784 set (autovacuum_enabled = 'false'); +update pg_class set reltuples = 10 where relname='bug_16784'; + +insert into bug_16784 select g/10, g from generate_series(1,40) g; + +set work_mem='64kB'; +set enable_sort = false; + +select * from + (values (1),(2)) v(a), + lateral (select a, i, j, count(*) from + bug_16784 group by cube(i,j)) s + order by v.a, i, j; + +-- +-- Compare results between plans using sorting and plans using hash +-- aggregation. Force spilling in both cases by setting work_mem low +-- and altering the statistics. +-- + +create table gs_data_1 as +select g%1000 as g1000, g%100 as g100, g%10 as g10, g + from generate_series(0,1999) g; + +analyze gs_data_1; +alter table gs_data_1 set (autovacuum_enabled = 'false'); +update pg_class set reltuples = 10 where relname='gs_data_1'; + +set work_mem='64kB'; + +-- Produce results with sorting. + +set enable_sort = true; +set enable_hashagg = false; + +set jit_above_cost = 0; + +explain (costs off) +select g100, g10, sum(g::numeric), count(*), max(g::text) +from gs_data_1 group by cube (g1000, g100,g10); + +create table gs_group_1 as +select g100, g10, sum(g::numeric), count(*), max(g::text) +from gs_data_1 group by cube (g1000, g100,g10); + +-- Produce results with hash aggregation. + +set enable_hashagg = true; +set enable_sort = false; + +explain (costs off) +select g100, g10, sum(g::numeric), count(*), max(g::text) +from gs_data_1 group by cube (g1000, g100,g10); + +create table gs_hash_1 as +select g100, g10, sum(g::numeric), count(*), max(g::text) +from gs_data_1 group by cube (g1000, g100,g10); +set enable_sort = true; +set work_mem to default; + +-- GPDB_12_MERGE_FIXME: the following comparison query has an ORCA plan that +-- relies on "IS NOT DISTINCT FROM" Hash Join, a variant that we likely have +-- lost during the merge with upstream Postgres 12. Disable ORCA for this query +SET optimizer TO off; + +-- Compare results + +(select * from gs_hash_1 except select * from gs_group_1) + union all +(select * from gs_group_1 except select * from gs_hash_1); + +RESET optimizer; + +drop table gs_group_1; +drop table gs_hash_1; + +-- GROUP BY DISTINCT + +-- "normal" behavior... +select a, b, c +from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) +group by all rollup(a, b), rollup(a, c) +order by a, b, c; + +-- ...which is also the default +select a, b, c +from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) +group by rollup(a, b), rollup(a, c) +order by a, b, c; + +-- "group by distinct" behavior... +select a, b, c +from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) +group by distinct rollup(a, b), rollup(a, c) +order by a, b, c; + +-- ...which is not the same as "select distinct" +select distinct a, b, c +from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) +group by rollup(a, b), rollup(a, c) +order by a, b, c; + +-- test handling of outer GroupingFunc within subqueries +explain (costs off) +select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); +select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); + +explain (costs off) +select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; +select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; + +select a, rank(a+3) within group (order by b nulls last) +from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) +group by rollup (a) order by a; + +select a, rank((select a+3)) within group (order by b nulls last) +from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) +group by rollup (a) order by a; + +select a, rank((select 1+2)) within group (order by b nulls last) +from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) +group by rollup (a) order by a; + +select a, b, rank(b) within group (order by b nulls last) +from (values (1,1),(1,4),(1,5),(3,1),(3,2)) v(a,b) +group by rollup (a,b) order by a; + +-- end diff --git a/src/test/singlenode_regress/sql/guc.sql b/src/test/singlenode_regress/sql/guc.sql new file mode 100644 index 00000000000..c39c11388d5 --- /dev/null +++ b/src/test/singlenode_regress/sql/guc.sql @@ -0,0 +1,313 @@ +-- pg_regress should ensure that this default value applies; however +-- we can't rely on any specific default value of vacuum_cost_delay +SHOW datestyle; + +-- SET to some nondefault value +SET vacuum_cost_delay TO 40; +SET datestyle = 'ISO, YMD'; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- SET LOCAL has no effect outside of a transaction +SET LOCAL vacuum_cost_delay TO 50; +SHOW vacuum_cost_delay; +SET LOCAL datestyle = 'SQL'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- SET LOCAL within a transaction that commits +BEGIN; +SET LOCAL vacuum_cost_delay TO 50; +SHOW vacuum_cost_delay; +SET LOCAL datestyle = 'SQL'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +COMMIT; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- SET should be reverted after ROLLBACK +BEGIN; +SET vacuum_cost_delay TO 60; +SHOW vacuum_cost_delay; +SET datestyle = 'German'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +ROLLBACK; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- Some tests with subtransactions +BEGIN; +SET vacuum_cost_delay TO 70; +SET datestyle = 'MDY'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +SAVEPOINT first_sp; +SET vacuum_cost_delay TO 80.1; +SHOW vacuum_cost_delay; +SET datestyle = 'German, DMY'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +ROLLBACK TO first_sp; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +SAVEPOINT second_sp; +SET vacuum_cost_delay TO '900us'; +SET datestyle = 'SQL, YMD'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +SAVEPOINT third_sp; +SET vacuum_cost_delay TO 100; +SHOW vacuum_cost_delay; +SET datestyle = 'Postgres, MDY'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +ROLLBACK TO third_sp; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +ROLLBACK TO second_sp; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +ROLLBACK; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- SET LOCAL with Savepoints +BEGIN; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +SAVEPOINT sp; +SET LOCAL vacuum_cost_delay TO 30; +SHOW vacuum_cost_delay; +SET LOCAL datestyle = 'Postgres, MDY'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +ROLLBACK TO sp; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +ROLLBACK; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- SET LOCAL persists through RELEASE (which was not true in 8.0-8.2) +BEGIN; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +SAVEPOINT sp; +SET LOCAL vacuum_cost_delay TO 30; +SHOW vacuum_cost_delay; +SET LOCAL datestyle = 'Postgres, MDY'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +RELEASE SAVEPOINT sp; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +ROLLBACK; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- SET followed by SET LOCAL +BEGIN; +SET vacuum_cost_delay TO 40; +SET LOCAL vacuum_cost_delay TO 50; +SHOW vacuum_cost_delay; +SET datestyle = 'ISO, DMY'; +SET LOCAL datestyle = 'Postgres, MDY'; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +COMMIT; +SHOW vacuum_cost_delay; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- +-- Test RESET. We use datestyle because the reset value is forced by +-- pg_regress, so it doesn't depend on the installation's configuration. +-- +SET datestyle = iso, ymd; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; +RESET datestyle; +SHOW datestyle; +SELECT '2006-08-13 12:34:56'::timestamptz; + +-- Test some simple error cases +SET seq_page_cost TO 'NaN'; +SET vacuum_cost_delay TO '10s'; +SET no_such_variable TO 42; + +-- Test "custom" GUCs created on the fly (which aren't really an +-- intended feature, but many people use them). +SHOW custom.my_guc; -- error, not known yet +SET custom.my_guc = 42; +SHOW custom.my_guc; +RESET custom.my_guc; -- this makes it go to empty, not become unknown again +SHOW custom.my_guc; +SET custom.my.qualified.guc = 'foo'; +SHOW custom.my.qualified.guc; +SET custom."bad-guc" = 42; -- disallowed because -c cannot set this name +SHOW custom."bad-guc"; +SET special."weird name" = 'foo'; -- could be allowed, but we choose not to +SHOW special."weird name"; + +-- +-- Test DISCARD TEMP +-- +CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS; +SELECT relname FROM pg_class WHERE relname = 'reset_test'; +DISCARD TEMP; +SELECT relname FROM pg_class WHERE relname = 'reset_test'; + +-- +-- Test DISCARD ALL +-- + +-- do changes +DECLARE foo CURSOR WITH HOLD FOR SELECT 1; +PREPARE foo AS SELECT 1; +LISTEN foo_event; +SET vacuum_cost_delay = 13; +CREATE TEMP TABLE tmp_foo (data text) ON COMMIT DELETE ROWS; +CREATE ROLE regress_guc_user; +SET SESSION AUTHORIZATION regress_guc_user; +-- look changes +SELECT pg_listening_channels(); +SELECT name FROM pg_prepared_statements; +SELECT name FROM pg_cursors; +SHOW vacuum_cost_delay; +SELECT relname from pg_class where relname = 'tmp_foo'; +SELECT current_user = 'regress_guc_user'; +-- discard everything +DISCARD ALL; +-- look again +SELECT pg_listening_channels(); +SELECT name FROM pg_prepared_statements; +SELECT name FROM pg_cursors; +SHOW vacuum_cost_delay; +SELECT relname from pg_class where relname = 'tmp_foo'; +SELECT current_user = 'regress_guc_user'; +DROP ROLE regress_guc_user; + +-- +-- search_path should react to changes in pg_namespace +-- + +set search_path = foo, public, not_there_initially; +select current_schemas(false); +create schema not_there_initially; +select current_schemas(false); +drop schema not_there_initially; +select current_schemas(false); +reset search_path; + +-- +-- Tests for function-local GUC settings +-- + +set work_mem = '3MB'; + +create function report_guc(text) returns text as +$$ select current_setting($1) $$ language sql +set work_mem = '1MB'; + +select report_guc('work_mem'), current_setting('work_mem'); + +alter function report_guc(text) set work_mem = '2MB'; + +select report_guc('work_mem'), current_setting('work_mem'); + +alter function report_guc(text) reset all; + +select report_guc('work_mem'), current_setting('work_mem'); + +-- SET LOCAL is restricted by a function SET option +create or replace function myfunc(int) returns text as $$ +begin + set local work_mem = '2MB'; + return current_setting('work_mem'); +end $$ +language plpgsql +set work_mem = '1MB'; + +select myfunc(0), current_setting('work_mem'); + +alter function myfunc(int) reset all; + +select myfunc(0), current_setting('work_mem'); + +set work_mem = '3MB'; + +-- but SET isn't +create or replace function myfunc(int) returns text as $$ +begin + set work_mem = '2MB'; + return current_setting('work_mem'); +end $$ +language plpgsql +set work_mem = '1MB'; + +select myfunc(0), current_setting('work_mem'); + +set work_mem = '3MB'; + +-- it should roll back on error, though +create or replace function myfunc(int) returns text as $$ +begin + set work_mem = '2MB'; + perform 1/$1; + return current_setting('work_mem'); +end $$ +language plpgsql +set work_mem = '1MB'; + +select myfunc(0); +select current_setting('work_mem'); +select myfunc(1), current_setting('work_mem'); + +-- check current_setting()'s behavior with invalid setting name + +select current_setting('nosuch.setting'); -- FAIL +select current_setting('nosuch.setting', false); -- FAIL +select current_setting('nosuch.setting', true) is null; + +-- after this, all three cases should yield 'nada' +set nosuch.setting = 'nada'; + +select current_setting('nosuch.setting'); +select current_setting('nosuch.setting', false); +select current_setting('nosuch.setting', true); + +-- Normally, CREATE FUNCTION should complain about invalid values in +-- function SET options; but not if check_function_bodies is off, +-- because that creates ordering hazards for pg_dump + +create function func_with_bad_set() returns int as $$ select 1 $$ +language sql +set default_text_search_config = no_such_config; + +set check_function_bodies = off; + +create function func_with_bad_set() returns int as $$ select 1 $$ +language sql +set default_text_search_config = no_such_config; + +select func_with_bad_set(); + +reset check_function_bodies; + +set default_with_oids to f; +-- Should not allow to set it to true. +set default_with_oids to t; diff --git a/src/test/singlenode_regress/sql/hash_func.sql b/src/test/singlenode_regress/sql/hash_func.sql new file mode 100644 index 00000000000..5ad33c1f9d4 --- /dev/null +++ b/src/test/singlenode_regress/sql/hash_func.sql @@ -0,0 +1,264 @@ +-- +-- Test hash functions +-- +-- When the salt is 0, the extended hash function should produce a result +-- whose low 32 bits match the standard hash function. When the salt is +-- not 0, we should get a different result. +-- + +SELECT v as value, hashint2(v)::bit(32) as standard, + hashint2extended(v, 0)::bit(32) as extended0, + hashint2extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0::int2), (1::int2), (17::int2), (42::int2)) x(v) +WHERE hashint2(v)::bit(32) != hashint2extended(v, 0)::bit(32) + OR hashint2(v)::bit(32) = hashint2extended(v, 1)::bit(32); + +SELECT v as value, hashint4(v)::bit(32) as standard, + hashint4extended(v, 0)::bit(32) as extended0, + hashint4extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashint4(v)::bit(32) != hashint4extended(v, 0)::bit(32) + OR hashint4(v)::bit(32) = hashint4extended(v, 1)::bit(32); + +SELECT v as value, hashint8(v)::bit(32) as standard, + hashint8extended(v, 0)::bit(32) as extended0, + hashint8extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashint8(v)::bit(32) != hashint8extended(v, 0)::bit(32) + OR hashint8(v)::bit(32) = hashint8extended(v, 1)::bit(32); + +SELECT v as value, hashfloat4(v)::bit(32) as standard, + hashfloat4extended(v, 0)::bit(32) as extended0, + hashfloat4extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashfloat4(v)::bit(32) != hashfloat4extended(v, 0)::bit(32) + OR hashfloat4(v)::bit(32) = hashfloat4extended(v, 1)::bit(32); + +SELECT v as value, hashfloat8(v)::bit(32) as standard, + hashfloat8extended(v, 0)::bit(32) as extended0, + hashfloat8extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashfloat8(v)::bit(32) != hashfloat8extended(v, 0)::bit(32) + OR hashfloat8(v)::bit(32) = hashfloat8extended(v, 1)::bit(32); + +SELECT v as value, hashoid(v)::bit(32) as standard, + hashoidextended(v, 0)::bit(32) as extended0, + hashoidextended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1), (17), (42), (550273), (207112489)) x(v) +WHERE hashoid(v)::bit(32) != hashoidextended(v, 0)::bit(32) + OR hashoid(v)::bit(32) = hashoidextended(v, 1)::bit(32); + +SELECT v as value, hashchar(v)::bit(32) as standard, + hashcharextended(v, 0)::bit(32) as extended0, + hashcharextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::"char"), ('1'), ('x'), ('X'), ('p'), ('N')) x(v) +WHERE hashchar(v)::bit(32) != hashcharextended(v, 0)::bit(32) + OR hashchar(v)::bit(32) = hashcharextended(v, 1)::bit(32); + +SELECT v as value, hashname(v)::bit(32) as standard, + hashnameextended(v, 0)::bit(32) as extended0, + hashnameextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL), ('PostgreSQL'), ('eIpUEtqmY89'), ('AXKEJBTK'), + ('muop28x03'), ('yi3nm0d73')) x(v) +WHERE hashname(v)::bit(32) != hashnameextended(v, 0)::bit(32) + OR hashname(v)::bit(32) = hashnameextended(v, 1)::bit(32); + +SELECT v as value, hashtext(v)::bit(32) as standard, + hashtextextended(v, 0)::bit(32) as extended0, + hashtextextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL), ('PostgreSQL'), ('eIpUEtqmY89'), ('AXKEJBTK'), + ('muop28x03'), ('yi3nm0d73')) x(v) +WHERE hashtext(v)::bit(32) != hashtextextended(v, 0)::bit(32) + OR hashtext(v)::bit(32) = hashtextextended(v, 1)::bit(32); + +SELECT v as value, hashoidvector(v)::bit(32) as standard, + hashoidvectorextended(v, 0)::bit(32) as extended0, + hashoidvectorextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::oidvector), ('0 1 2 3 4'), ('17 18 19 20'), + ('42 43 42 45'), ('550273 550273 570274'), + ('207112489 207112499 21512 2155 372325 1363252')) x(v) +WHERE hashoidvector(v)::bit(32) != hashoidvectorextended(v, 0)::bit(32) + OR hashoidvector(v)::bit(32) = hashoidvectorextended(v, 1)::bit(32); + +SELECT v as value, hash_aclitem(v)::bit(32) as standard, + hash_aclitem_extended(v, 0)::bit(32) as extended0, + hash_aclitem_extended(v, 1)::bit(32) as extended1 +FROM (SELECT DISTINCT(relacl[1]) FROM pg_class LIMIT 10) x(v) +WHERE hash_aclitem(v)::bit(32) != hash_aclitem_extended(v, 0)::bit(32) + OR hash_aclitem(v)::bit(32) = hash_aclitem_extended(v, 1)::bit(32); + +SELECT v as value, hashmacaddr(v)::bit(32) as standard, + hashmacaddrextended(v, 0)::bit(32) as extended0, + hashmacaddrextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::macaddr), ('08:00:2b:01:02:04'), ('08:00:2b:01:02:04'), + ('e2:7f:51:3e:70:49'), ('d6:a9:4a:78:1c:d5'), + ('ea:29:b1:5e:1f:a5')) x(v) +WHERE hashmacaddr(v)::bit(32) != hashmacaddrextended(v, 0)::bit(32) + OR hashmacaddr(v)::bit(32) = hashmacaddrextended(v, 1)::bit(32); + +SELECT v as value, hashinet(v)::bit(32) as standard, + hashinetextended(v, 0)::bit(32) as extended0, + hashinetextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::inet), ('192.168.100.128/25'), ('192.168.100.0/8'), + ('172.168.10.126/16'), ('172.18.103.126/24'), ('192.188.13.16/32')) x(v) +WHERE hashinet(v)::bit(32) != hashinetextended(v, 0)::bit(32) + OR hashinet(v)::bit(32) = hashinetextended(v, 1)::bit(32); + +SELECT v as value, hash_numeric(v)::bit(32) as standard, + hash_numeric_extended(v, 0)::bit(32) as extended0, + hash_numeric_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (0), (1.149484958), (17.149484958), (42.149484958), + (149484958.550273), (2071124898672)) x(v) +WHERE hash_numeric(v)::bit(32) != hash_numeric_extended(v, 0)::bit(32) + OR hash_numeric(v)::bit(32) = hash_numeric_extended(v, 1)::bit(32); + +SELECT v as value, hashmacaddr8(v)::bit(32) as standard, + hashmacaddr8extended(v, 0)::bit(32) as extended0, + hashmacaddr8extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::macaddr8), ('08:00:2b:01:02:04:36:49'), + ('08:00:2b:01:02:04:f0:e8'), ('e2:7f:51:3e:70:49:16:29'), + ('d6:a9:4a:78:1c:d5:47:32'), ('ea:29:b1:5e:1f:a5')) x(v) +WHERE hashmacaddr8(v)::bit(32) != hashmacaddr8extended(v, 0)::bit(32) + OR hashmacaddr8(v)::bit(32) = hashmacaddr8extended(v, 1)::bit(32); + +SELECT v as value, hash_array(v)::bit(32) as standard, + hash_array_extended(v, 0)::bit(32) as extended0, + hash_array_extended(v, 1)::bit(32) as extended1 +FROM (VALUES ('{0}'::int4[]), ('{0,1,2,3,4}'), ('{17,18,19,20}'), + ('{42,34,65,98}'), ('{550273,590027, 870273}'), + ('{207112489, 807112489}')) x(v) +WHERE hash_array(v)::bit(32) != hash_array_extended(v, 0)::bit(32) + OR hash_array(v)::bit(32) = hash_array_extended(v, 1)::bit(32); + +-- array hashing with non-hashable element type +SELECT v as value, hash_array(v)::bit(32) as standard +FROM (VALUES ('{0}'::money[])) x(v); +SELECT v as value, hash_array_extended(v, 0)::bit(32) as extended0 +FROM (VALUES ('{0}'::money[])) x(v); + +SELECT v as value, hashbpchar(v)::bit(32) as standard, + hashbpcharextended(v, 0)::bit(32) as extended0, + hashbpcharextended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL), ('PostgreSQL'), ('eIpUEtqmY89'), ('AXKEJBTK'), + ('muop28x03'), ('yi3nm0d73')) x(v) +WHERE hashbpchar(v)::bit(32) != hashbpcharextended(v, 0)::bit(32) + OR hashbpchar(v)::bit(32) = hashbpcharextended(v, 1)::bit(32); + +SELECT v as value, time_hash(v)::bit(32) as standard, + time_hash_extended(v, 0)::bit(32) as extended0, + time_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::time), ('11:09:59'), ('1:09:59'), ('11:59:59'), + ('7:9:59'), ('5:15:59')) x(v) +WHERE time_hash(v)::bit(32) != time_hash_extended(v, 0)::bit(32) + OR time_hash(v)::bit(32) = time_hash_extended(v, 1)::bit(32); + +SELECT v as value, timetz_hash(v)::bit(32) as standard, + timetz_hash_extended(v, 0)::bit(32) as extended0, + timetz_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::timetz), ('00:11:52.518762-07'), ('00:11:52.51762-08'), + ('00:11:52.62-01'), ('00:11:52.62+01'), ('11:59:59+04')) x(v) +WHERE timetz_hash(v)::bit(32) != timetz_hash_extended(v, 0)::bit(32) + OR timetz_hash(v)::bit(32) = timetz_hash_extended(v, 1)::bit(32); + +SELECT v as value, interval_hash(v)::bit(32) as standard, + interval_hash_extended(v, 0)::bit(32) as extended0, + interval_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::interval), + ('5 month 7 day 46 minutes'), ('1 year 7 day 46 minutes'), + ('1 year 7 month 20 day 46 minutes'), ('5 month'), + ('17 year 11 month 7 day 9 hours 46 minutes 5 seconds')) x(v) +WHERE interval_hash(v)::bit(32) != interval_hash_extended(v, 0)::bit(32) + OR interval_hash(v)::bit(32) = interval_hash_extended(v, 1)::bit(32); + +SELECT v as value, timestamp_hash(v)::bit(32) as standard, + timestamp_hash_extended(v, 0)::bit(32) as extended0, + timestamp_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::timestamp), ('2017-08-22 00:09:59.518762'), + ('2015-08-20 00:11:52.51762-08'), + ('2017-05-22 00:11:52.62-01'), + ('2013-08-22 00:11:52.62+01'), ('2013-08-22 11:59:59+04')) x(v) +WHERE timestamp_hash(v)::bit(32) != timestamp_hash_extended(v, 0)::bit(32) + OR timestamp_hash(v)::bit(32) = timestamp_hash_extended(v, 1)::bit(32); + +SELECT v as value, uuid_hash(v)::bit(32) as standard, + uuid_hash_extended(v, 0)::bit(32) as extended0, + uuid_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::uuid), ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'), + ('5a9ba4ac-8d6f-11e7-bb31-be2e44b06b34'), + ('99c6705c-d939-461c-a3c9-1690ad64ed7b'), + ('7deed3ca-8d6f-11e7-bb31-be2e44b06b34'), + ('9ad46d4f-6f2a-4edd-aadb-745993928e1e')) x(v) +WHERE uuid_hash(v)::bit(32) != uuid_hash_extended(v, 0)::bit(32) + OR uuid_hash(v)::bit(32) = uuid_hash_extended(v, 1)::bit(32); + +SELECT v as value, pg_lsn_hash(v)::bit(32) as standard, + pg_lsn_hash_extended(v, 0)::bit(32) as extended0, + pg_lsn_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::pg_lsn), ('16/B374D84'), ('30/B374D84'), + ('255/B374D84'), ('25/B379D90'), ('900/F37FD90')) x(v) +WHERE pg_lsn_hash(v)::bit(32) != pg_lsn_hash_extended(v, 0)::bit(32) + OR pg_lsn_hash(v)::bit(32) = pg_lsn_hash_extended(v, 1)::bit(32); + +CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); +SELECT v as value, hashenum(v)::bit(32) as standard, + hashenumextended(v, 0)::bit(32) as extended0, + hashenumextended(v, 1)::bit(32) as extended1 +FROM (VALUES ('sad'::mood), ('ok'), ('happy')) x(v) +WHERE hashenum(v)::bit(32) != hashenumextended(v, 0)::bit(32) + OR hashenum(v)::bit(32) = hashenumextended(v, 1)::bit(32); +DROP TYPE mood; + +SELECT v as value, jsonb_hash(v)::bit(32) as standard, + jsonb_hash_extended(v, 0)::bit(32) as extended0, + jsonb_hash_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::jsonb), + ('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'), + ('{"foo": [true, "bar"], "tags": {"e": 1, "f": null}}'), + ('{"g": {"h": "value"}}')) x(v) +WHERE jsonb_hash(v)::bit(32) != jsonb_hash_extended(v, 0)::bit(32) + OR jsonb_hash(v)::bit(32) = jsonb_hash_extended(v, 1)::bit(32); + +SELECT v as value, hash_range(v)::bit(32) as standard, + hash_range_extended(v, 0)::bit(32) as extended0, + hash_range_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (int4range(10, 20)), (int4range(23, 43)), + (int4range(5675, 550273)), + (int4range(550274, 1550274)), (int4range(1550275, 208112489))) x(v) +WHERE hash_range(v)::bit(32) != hash_range_extended(v, 0)::bit(32) + OR hash_range(v)::bit(32) = hash_range_extended(v, 1)::bit(32); + +SELECT v as value, hash_multirange(v)::bit(32) as standard, + hash_multirange_extended(v, 0)::bit(32) as extended0, + hash_multirange_extended(v, 1)::bit(32) as extended1 +FROM (VALUES ('{[10,20)}'::int4multirange), ('{[23, 43]}'::int4multirange), + ('{[5675, 550273)}'::int4multirange), + ('{[550274, 1550274)}'::int4multirange), + ('{[1550275, 208112489)}'::int4multirange)) x(v) +WHERE hash_multirange(v)::bit(32) != hash_multirange_extended(v, 0)::bit(32) + OR hash_multirange(v)::bit(32) = hash_multirange_extended(v, 1)::bit(32); + +CREATE TYPE hash_test_t1 AS (a int, b text); +SELECT v as value, hash_record(v)::bit(32) as standard, + hash_record_extended(v, 0)::bit(32) as extended0, + hash_record_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (row(1, 'aaa')::hash_test_t1, row(2, 'bbb'), row(-1, 'ccc'))) x(v) +WHERE hash_record(v)::bit(32) != hash_record_extended(v, 0)::bit(32) + OR hash_record(v)::bit(32) = hash_record_extended(v, 1)::bit(32); +DROP TYPE hash_test_t1; + +-- record hashing with non-hashable field type +CREATE TYPE hash_test_t2 AS (a money, b text); +SELECT v as value, hash_record(v)::bit(32) as standard +FROM (VALUES (row(1, 'aaa')::hash_test_t2)) x(v); +SELECT v as value, hash_record_extended(v, 0)::bit(32) as extended0 +FROM (VALUES (row(1, 'aaa')::hash_test_t2)) x(v); +DROP TYPE hash_test_t2; + +-- +-- Check special cases for specific data types +-- +SELECT hashfloat4('0'::float4) = hashfloat4('-0'::float4) AS t; +SELECT hashfloat4('NaN'::float4) = hashfloat4(-'NaN'::float4) AS t; +SELECT hashfloat8('0'::float8) = hashfloat8('-0'::float8) AS t; +SELECT hashfloat8('NaN'::float8) = hashfloat8(-'NaN'::float8) AS t; +SELECT hashfloat4('NaN'::float4) = hashfloat8('NaN'::float8) AS t; diff --git a/src/test/singlenode_regress/sql/hash_index.sql b/src/test/singlenode_regress/sql/hash_index.sql new file mode 100644 index 00000000000..4d1aa020a96 --- /dev/null +++ b/src/test/singlenode_regress/sql/hash_index.sql @@ -0,0 +1,204 @@ +-- +-- HASH_INDEX +-- grep 843938989 hash.data +-- + +SELECT * FROM hash_i4_heap + WHERE hash_i4_heap.random = 843938989; + +-- +-- hash index +-- grep 66766766 hash.data +-- +SELECT * FROM hash_i4_heap + WHERE hash_i4_heap.random = 66766766; + +-- +-- hash index +-- grep 1505703298 hash.data +-- +SELECT * FROM hash_name_heap + WHERE hash_name_heap.random = '1505703298'::name; + +-- +-- hash index +-- grep 7777777 hash.data +-- +SELECT * FROM hash_name_heap + WHERE hash_name_heap.random = '7777777'::name; + +-- +-- hash index +-- grep 1351610853 hash.data +-- +SELECT * FROM hash_txt_heap + WHERE hash_txt_heap.random = '1351610853'::text; + +-- +-- hash index +-- grep 111111112222222233333333 hash.data +-- +SELECT * FROM hash_txt_heap + WHERE hash_txt_heap.random = '111111112222222233333333'::text; + +-- +-- hash index +-- grep 444705537 hash.data +-- +SELECT * FROM hash_f8_heap + WHERE hash_f8_heap.random = '444705537'::float8; + +-- +-- hash index +-- grep 88888888 hash.data +-- +SELECT * FROM hash_f8_heap + WHERE hash_f8_heap.random = '88888888'::float8; + +-- +-- hash index +-- grep '^90[^0-9]' hashovfl.data +-- +-- SELECT count(*) AS i988 FROM hash_ovfl_heap +-- WHERE x = 90; + +-- +-- hash index +-- grep '^1000[^0-9]' hashovfl.data +-- +-- SELECT count(*) AS i0 FROM hash_ovfl_heap +-- WHERE x = 1000; + +-- +-- HASH +-- +UPDATE hash_i4_heap + SET random = 1 + WHERE hash_i4_heap.seqno = 1492; + +SELECT h.seqno AS i1492, h.random AS i1 + FROM hash_i4_heap h + WHERE h.random = 1; + +UPDATE hash_i4_heap + SET seqno = 20000 + WHERE hash_i4_heap.random = 1492795354; + +SELECT h.seqno AS i20000 + FROM hash_i4_heap h + WHERE h.random = 1492795354; + +UPDATE hash_name_heap + SET random = '0123456789abcdef'::name + WHERE hash_name_heap.seqno = 6543; + +SELECT h.seqno AS i6543, h.random AS c0_to_f + FROM hash_name_heap h + WHERE h.random = '0123456789abcdef'::name; + +UPDATE hash_name_heap + SET seqno = 20000 + WHERE hash_name_heap.random = '76652222'::name; + +-- +-- this is the row we just replaced; index scan should return zero rows +-- +SELECT h.seqno AS emptyset + FROM hash_name_heap h + WHERE h.random = '76652222'::name; + +UPDATE hash_txt_heap + SET random = '0123456789abcdefghijklmnop'::text + WHERE hash_txt_heap.seqno = 4002; + +SELECT h.seqno AS i4002, h.random AS c0_to_p + FROM hash_txt_heap h + WHERE h.random = '0123456789abcdefghijklmnop'::text; + +UPDATE hash_txt_heap + SET seqno = 20000 + WHERE hash_txt_heap.random = '959363399'::text; + +SELECT h.seqno AS t20000 + FROM hash_txt_heap h + WHERE h.random = '959363399'::text; + +UPDATE hash_f8_heap + SET random = '-1234.1234'::float8 + WHERE hash_f8_heap.seqno = 8906; + +SELECT h.seqno AS i8096, h.random AS f1234_1234 + FROM hash_f8_heap h + WHERE h.random = '-1234.1234'::float8; + +UPDATE hash_f8_heap + SET seqno = 20000 + WHERE hash_f8_heap.random = '488912369'::float8; + +SELECT h.seqno AS f20000 + FROM hash_f8_heap h + WHERE h.random = '488912369'::float8; + +-- UPDATE hash_ovfl_heap +-- SET x = 1000 +-- WHERE x = 90; + +-- this vacuums the index as well +-- VACUUM hash_ovfl_heap; + +-- SELECT count(*) AS i0 FROM hash_ovfl_heap +-- WHERE x = 90; + +-- SELECT count(*) AS i988 FROM hash_ovfl_heap +-- WHERE x = 1000; + +-- +-- Cause some overflow insert and splits. +-- +CREATE TABLE hash_split_heap (keycol INT); +INSERT INTO hash_split_heap SELECT 1 FROM generate_series(1, 500) a; +CREATE INDEX hash_split_index on hash_split_heap USING HASH (keycol); +INSERT INTO hash_split_heap SELECT 1 FROM generate_series(1, 5000) a; + +-- Let's do a backward scan. +BEGIN; +SET enable_seqscan = OFF; +SET enable_bitmapscan = OFF; + +DECLARE c CURSOR FOR SELECT * from hash_split_heap WHERE keycol = 1; +MOVE FORWARD ALL FROM c; +MOVE BACKWARD 10000 FROM c; +MOVE BACKWARD ALL FROM c; +CLOSE c; +END; + +-- DELETE, INSERT, VACUUM. +DELETE FROM hash_split_heap WHERE keycol = 1; +INSERT INTO hash_split_heap SELECT a/2 FROM generate_series(1, 25000) a; + +VACUUM hash_split_heap; + +-- Rebuild the index using a different fillfactor +ALTER INDEX hash_split_index SET (fillfactor = 10); +REINDEX INDEX hash_split_index; + +-- Clean up. +DROP TABLE hash_split_heap; + +-- Index on temp table. +CREATE TEMP TABLE hash_temp_heap (x int, y int); +INSERT INTO hash_temp_heap VALUES (1,1); +CREATE INDEX hash_idx ON hash_temp_heap USING hash (x); +DROP TABLE hash_temp_heap CASCADE; + +-- Float4 type. +CREATE TABLE hash_heap_float4 (x float4, y int); +INSERT INTO hash_heap_float4 VALUES (1.1,1); +CREATE INDEX hash_idx ON hash_heap_float4 USING hash (x); +DROP TABLE hash_heap_float4 CASCADE; + +-- Test out-of-range fillfactor values +CREATE INDEX hash_f8_index2 ON hash_f8_heap USING hash (random float8_ops) + WITH (fillfactor=9); +CREATE INDEX hash_f8_index2 ON hash_f8_heap USING hash (random float8_ops) + WITH (fillfactor=101); diff --git a/src/test/singlenode_regress/sql/hash_part.sql b/src/test/singlenode_regress/sql/hash_part.sql new file mode 100644 index 00000000000..e7eb36542cc --- /dev/null +++ b/src/test/singlenode_regress/sql/hash_part.sql @@ -0,0 +1,90 @@ +-- +-- Hash partitioning. +-- + +-- Use hand-rolled hash functions and operator classes to get predictable +-- result on different machines. See the definitions of +-- part_part_test_int4_ops and part_test_text_ops in insert.sql. + +CREATE TABLE mchash (a int, b text, c jsonb) + PARTITION BY HASH (a part_test_int4_ops, b part_test_text_ops); +CREATE TABLE mchash1 + PARTITION OF mchash FOR VALUES WITH (MODULUS 4, REMAINDER 0); + +-- invalid OID, no such table +SELECT satisfies_hash_partition(0, 4, 0, NULL); + +-- not partitioned +SELECT satisfies_hash_partition('tenk1'::regclass, 4, 0, NULL); + +-- partition rather than the parent +SELECT satisfies_hash_partition('mchash1'::regclass, 4, 0, NULL); + +-- invalid modulus +SELECT satisfies_hash_partition('mchash'::regclass, 0, 0, NULL); + +-- remainder too small +SELECT satisfies_hash_partition('mchash'::regclass, 1, -1, NULL); + +-- remainder too large +SELECT satisfies_hash_partition('mchash'::regclass, 1, 1, NULL); + +-- modulus is null +SELECT satisfies_hash_partition('mchash'::regclass, NULL, 0, NULL); + +-- remainder is null +SELECT satisfies_hash_partition('mchash'::regclass, 4, NULL, NULL); + +-- too many arguments +SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, NULL::int, NULL::text, NULL::json); + +-- too few arguments +SELECT satisfies_hash_partition('mchash'::regclass, 3, 1, NULL::int); + +-- wrong argument type +SELECT satisfies_hash_partition('mchash'::regclass, 2, 1, NULL::int, NULL::int); + +-- ok, should be false +SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, 0, ''::text); + +-- ok, should be true +SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, 2, ''::text); + +-- argument via variadic syntax, should fail because not all partitioning +-- columns are of the correct type +SELECT satisfies_hash_partition('mchash'::regclass, 2, 1, + variadic array[1,2]::int[]); + +-- multiple partitioning columns of the same type +CREATE TABLE mcinthash (a int, b int, c jsonb) + PARTITION BY HASH (a part_test_int4_ops, b part_test_int4_ops); + +-- now variadic should work, should be false +SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0, + variadic array[0, 0]); + +-- should be true +SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0, + variadic array[0, 1]); + +-- wrong length +SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0, + variadic array[]::int[]); + +-- wrong type +SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0, + variadic array[now(), now()]); + +-- check satisfies_hash_partition passes correct collation +create table text_hashp (a text) partition by hash (a); +create table text_hashp0 partition of text_hashp for values with (modulus 2, remainder 0); +create table text_hashp1 partition of text_hashp for values with (modulus 2, remainder 1); +-- The result here should always be true, because 'xxx' must belong to +-- one of the two defined partitions +select satisfies_hash_partition('text_hashp'::regclass, 2, 0, 'xxx'::text) OR + satisfies_hash_partition('text_hashp'::regclass, 2, 1, 'xxx'::text) AS satisfies; + +-- cleanup +DROP TABLE mchash; +DROP TABLE mcinthash; +DROP TABLE text_hashp; diff --git a/src/test/singlenode_regress/sql/horology.sql b/src/test/singlenode_regress/sql/horology.sql new file mode 100644 index 00000000000..78091112ca4 --- /dev/null +++ b/src/test/singlenode_regress/sql/horology.sql @@ -0,0 +1,570 @@ +-- +-- HOROLOGY +-- +SET DateStyle = 'Postgres, MDY'; + +SHOW TimeZone; -- Many of these tests depend on the prevailing setting + +-- +-- Test various input formats +-- +SELECT timestamp with time zone '20011227 040506+08'; +SELECT timestamp with time zone '20011227 040506-08'; +SELECT timestamp with time zone '20011227 040506.789+08'; +SELECT timestamp with time zone '20011227 040506.789-08'; +SELECT timestamp with time zone '20011227T040506+08'; +SELECT timestamp with time zone '20011227T040506-08'; +SELECT timestamp with time zone '20011227T040506.789+08'; +SELECT timestamp with time zone '20011227T040506.789-08'; +SELECT timestamp with time zone '2001-12-27 04:05:06.789-08'; +SELECT timestamp with time zone '2001.12.27 04:05:06.789-08'; +SELECT timestamp with time zone '2001/12/27 04:05:06.789-08'; +SELECT timestamp with time zone '12/27/2001 04:05:06.789-08'; +-- should fail in mdy mode: +SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'; +set datestyle to dmy; +SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'; +reset datestyle; +SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789+08'; +SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789-08'; +SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789+08'; +SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789-08'; +SELECT timestamp with time zone 'J2452271+08'; +SELECT timestamp with time zone 'J2452271-08'; +SELECT timestamp with time zone 'J2452271.5+08'; +SELECT timestamp with time zone 'J2452271.5-08'; +SELECT timestamp with time zone 'J2452271 04:05:06+08'; +SELECT timestamp with time zone 'J2452271 04:05:06-08'; +SELECT timestamp with time zone 'J2452271T040506+08'; +SELECT timestamp with time zone 'J2452271T040506-08'; +SELECT timestamp with time zone 'J2452271T040506.789+08'; +SELECT timestamp with time zone 'J2452271T040506.789-08'; +-- German/European-style dates with periods as delimiters +SELECT timestamp with time zone '12.27.2001 04:05:06.789+08'; +SELECT timestamp with time zone '12.27.2001 04:05:06.789-08'; +SET DateStyle = 'German'; +SELECT timestamp with time zone '27.12.2001 04:05:06.789+08'; +SELECT timestamp with time zone '27.12.2001 04:05:06.789-08'; +SET DateStyle = 'ISO'; +-- As of 7.4, allow time without time zone having a time zone specified +SELECT time without time zone '040506.789+08'; +SELECT time without time zone '040506.789-08'; +SELECT time without time zone 'T040506.789+08'; +SELECT time without time zone 'T040506.789-08'; +SELECT time with time zone '040506.789+08'; +SELECT time with time zone '040506.789-08'; +SELECT time with time zone 'T040506.789+08'; +SELECT time with time zone 'T040506.789-08'; +SELECT time with time zone 'T040506.789 +08'; +SELECT time with time zone 'T040506.789 -08'; +SET DateStyle = 'Postgres, MDY'; +-- Check Julian dates BC +SELECT date 'J1520447' AS "Confucius' Birthday"; +SELECT date 'J0' AS "Julian Epoch"; + +-- +-- date, time arithmetic +-- + +SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time"; +SELECT date '1991-02-03' + time with time zone '04:05:06 PST' AS "Date + Time PST"; +SELECT date '2001-02-03' + time with time zone '04:05:06 UTC' AS "Date + Time UTC"; +SELECT date '1991-02-03' + interval '2 years' AS "Add Two Years"; +SELECT date '2001-12-13' - interval '2 years' AS "Subtract Two Years"; +-- subtract time from date should not make sense; use interval instead +SELECT date '1991-02-03' - time '04:05:06' AS "Subtract Time"; +SELECT date '1991-02-03' - time with time zone '04:05:06 UTC' AS "Subtract Time UTC"; + +-- +-- timestamp, interval arithmetic +-- + +SELECT timestamp without time zone '1996-03-01' - interval '1 second' AS "Feb 29"; +SELECT timestamp without time zone '1999-03-01' - interval '1 second' AS "Feb 28"; +SELECT timestamp without time zone '2000-03-01' - interval '1 second' AS "Feb 29"; +SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; +SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506"; +SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244"; +SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276"; +SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days"; + +-- Shorthand values +-- Not directly usable for regression testing since these are not constants. +-- So, just try to test parser and hope for the best - thomas 97/04/26 +SELECT (timestamp without time zone 'today' = (timestamp without time zone 'yesterday' + interval '1 day')) as "True"; +SELECT (timestamp without time zone 'today' = (timestamp without time zone 'tomorrow' - interval '1 day')) as "True"; +SELECT (timestamp without time zone 'today 10:30' = (timestamp without time zone 'yesterday' + interval '1 day 10 hr 30 min')) as "True"; +SELECT (timestamp without time zone '10:30 today' = (timestamp without time zone 'yesterday' + interval '1 day 10 hr 30 min')) as "True"; +SELECT (timestamp without time zone 'tomorrow' = (timestamp without time zone 'yesterday' + interval '2 days')) as "True"; +SELECT (timestamp without time zone 'tomorrow 16:00:00' = (timestamp without time zone 'today' + interval '1 day 16 hours')) as "True"; +SELECT (timestamp without time zone '16:00:00 tomorrow' = (timestamp without time zone 'today' + interval '1 day 16 hours')) as "True"; +SELECT (timestamp without time zone 'yesterday 12:34:56' = (timestamp without time zone 'tomorrow' - interval '2 days - 12:34:56')) as "True"; +SELECT (timestamp without time zone '12:34:56 yesterday' = (timestamp without time zone 'tomorrow' - interval '2 days - 12:34:56')) as "True"; +SELECT (timestamp without time zone 'tomorrow' > 'now') as "True"; + +-- Convert from date and time to timestamp +-- This test used to be timestamp(date,time) but no longer allowed by grammar +-- to enable support for SQL99 timestamp type syntax. +SELECT date '1994-01-01' + time '11:00' AS "Jan_01_1994_11am"; +SELECT date '1994-01-01' + time '10:00' AS "Jan_01_1994_10am"; +SELECT date '1994-01-01' + timetz '11:00-5' AS "Jan_01_1994_8am"; +SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am"; + +SELECT d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL; +SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL; + +SELECT timestamp with time zone '1996-03-01' - interval '1 second' AS "Feb 29"; +SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28"; +SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29"; +SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; + +SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True"; +SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True"; +SELECT (timestamp with time zone 'tomorrow' = (timestamp with time zone 'yesterday' + interval '2 days')) as "True"; +SELECT (timestamp with time zone 'tomorrow' > 'now') as "True"; + +-- timestamp with time zone, interval arithmetic around DST change +-- (just for fun, let's use an intentionally nonstandard POSIX zone spec) +SET TIME ZONE 'CST7CDT,M4.1.0,M10.5.0'; +SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' as "Apr 3, 12:00"; +SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '24 hours' as "Apr 3, 13:00"; +SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '1 day' as "Apr 2, 12:00"; +SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '24 hours' as "Apr 2, 11:00"; +RESET TIME ZONE; + + +SELECT timestamptz(date '1994-01-01', time '11:00') AS "Jan_01_1994_10am"; +SELECT timestamptz(date '1994-01-01', time '10:00') AS "Jan_01_1994_9am"; +SELECT timestamptz(date '1994-01-01', time with time zone '11:00-8') AS "Jan_01_1994_11am"; +SELECT timestamptz(date '1994-01-01', time with time zone '10:00-8') AS "Jan_01_1994_10am"; +SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am"; + +SELECT d1 + interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; +SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; + +-- +-- time, interval arithmetic +-- + +SELECT CAST(time '01:02' AS interval) AS "+01:02"; +SELECT CAST(interval '02:03' AS time) AS "02:03:00"; +SELECT time '01:30' + interval '02:01' AS "03:31:00"; +SELECT time '01:30' - interval '02:01' AS "23:29:00"; +SELECT time '02:30' + interval '36:01' AS "14:31:00"; +SELECT time '03:30' + interval '1 month 04:01' AS "07:31:00"; +SELECT CAST(time with time zone '01:02-08' AS interval) AS "+00:01"; +SELECT CAST(interval '02:03' AS time with time zone) AS "02:03:00-08"; +SELECT time with time zone '01:30-08' - interval '02:01' AS "23:29:00-08"; +SELECT time with time zone '02:30-08' + interval '36:01' AS "14:31:00-08"; + +-- These two tests cannot be used because they default to current timezone, +-- which may be either -08 or -07 depending on the time of year. +-- SELECT time with time zone '01:30' + interval '02:01' AS "03:31:00-08"; +-- SELECT time with time zone '03:30' + interval '1 month 04:01' AS "07:31:00-08"; +-- Try the following two tests instead, as a poor substitute + +SELECT CAST(CAST(date 'today' + time with time zone '05:30' + + interval '02:01' AS time with time zone) AS time) AS "07:31:00"; + +SELECT CAST(cast(date 'today' + time with time zone '03:30' + + interval '1 month 04:01' as timestamp without time zone) AS time) AS "07:31:00"; + +SELECT t.d1 AS t, i.f1 AS i, t.d1 + i.f1 AS "add", t.d1 - i.f1 AS "subtract" + FROM TIMESTAMP_TBL t, INTERVAL_TBL i + WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01' + AND i.f1 BETWEEN '00:00' AND '23:00' + ORDER BY 1,2; + +SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" + FROM TIME_TBL t, INTERVAL_TBL i + ORDER BY 1,2; + +SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" + FROM TIMETZ_TBL t, INTERVAL_TBL i + ORDER BY 1,2; + +-- SQL9x OVERLAPS operator +-- test with time zone +SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "True"; + +SELECT (timestamp with time zone '2000-11-26', timestamp with time zone '2000-11-27') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False"; + +SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '1 day') AS "True"; + +SELECT (timestamp with time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False"; + +SELECT (timestamp with time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp with time zone '2000-11-27', interval '12 hours') AS "True"; + +SELECT (timestamp with time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '12 hours') AS "False"; + +-- test without time zone +SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "True"; + +SELECT (timestamp without time zone '2000-11-26', timestamp without time zone '2000-11-27') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False"; + +SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '1 day') AS "True"; + +SELECT (timestamp without time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False"; + +SELECT (timestamp without time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp without time zone '2000-11-27', interval '12 hours') AS "True"; + +SELECT (timestamp without time zone '2000-11-27', interval '12 hours') + OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '12 hours') AS "False"; + +-- test time and interval +SELECT (time '00:00', time '01:00') + OVERLAPS (time '00:30', time '01:30') AS "True"; + +SELECT (time '00:00', interval '1 hour') + OVERLAPS (time '00:30', interval '1 hour') AS "True"; + +SELECT (time '00:00', interval '1 hour') + OVERLAPS (time '01:30', interval '1 hour') AS "False"; + +-- SQL99 seems to want this to be false (and we conform to the spec). +-- istm that this *should* return true, on the theory that time +-- intervals can wrap around the day boundary - thomas 2001-09-25 +SELECT (time '00:00', interval '1 hour') + OVERLAPS (time '01:30', interval '1 day') AS "False"; + +CREATE TABLE TEMP_TIMESTAMP (f1 timestamp with time zone); + +-- get some candidate input values + +INSERT INTO TEMP_TIMESTAMP (f1) + SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 BETWEEN '13-jun-1957' AND '1-jan-1997' + OR d1 BETWEEN '1-jan-1999' AND '1-jan-2010'; + +SELECT f1 AS "timestamp" + FROM TEMP_TIMESTAMP + ORDER BY "timestamp"; + +SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus + FROM TEMP_TIMESTAMP d, INTERVAL_TBL t + ORDER BY plus, "timestamp", "interval"; + +SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus + FROM TEMP_TIMESTAMP d, INTERVAL_TBL t + WHERE isfinite(d.f1) + ORDER BY minus, "timestamp", "interval"; + +SELECT d.f1 AS "timestamp", + timestamp with time zone '1980-01-06 00:00 GMT' AS gpstime_zero, + d.f1 - timestamp with time zone '1980-01-06 00:00 GMT' AS difference + FROM TEMP_TIMESTAMP d + ORDER BY difference; + +SELECT d1.f1 AS timestamp1, d2.f1 AS timestamp2, d1.f1 - d2.f1 AS difference + FROM TEMP_TIMESTAMP d1, TEMP_TIMESTAMP d2 + ORDER BY timestamp1, timestamp2, difference; + +-- +-- Conversions +-- + +SELECT f1 AS "timestamp", date(f1) AS date + FROM TEMP_TIMESTAMP + WHERE f1 <> timestamp 'now' + ORDER BY date, "timestamp"; + +DROP TABLE TEMP_TIMESTAMP; + +-- +-- Comparisons between datetime types, especially overflow cases +--- + +SELECT '2202020-10-05'::date::timestamp; -- fail +SELECT '2202020-10-05'::date > '2020-10-05'::timestamp as t; +SELECT '2020-10-05'::timestamp > '2202020-10-05'::date as f; + +SELECT '2202020-10-05'::date::timestamptz; -- fail +SELECT '2202020-10-05'::date > '2020-10-05'::timestamptz as t; +SELECT '2020-10-05'::timestamptz > '2202020-10-05'::date as f; + +-- This conversion may work depending on timezone +SELECT '4714-11-24 BC'::date::timestamptz; +SET TimeZone = 'UTC-2'; +SELECT '4714-11-24 BC'::date::timestamptz; -- fail + +SELECT '4714-11-24 BC'::date < '2020-10-05'::timestamptz as t; +SELECT '2020-10-05'::timestamptz >= '4714-11-24 BC'::date as t; + +SELECT '4714-11-24 BC'::timestamp < '2020-10-05'::timestamptz as t; +SELECT '2020-10-05'::timestamptz >= '4714-11-24 BC'::timestamp as t; + +RESET TimeZone; + +-- +-- Formats +-- + +SET DateStyle TO 'US,Postgres'; + +SHOW DateStyle; + +SELECT d1 AS us_postgres FROM TIMESTAMP_TBL; + +SET DateStyle TO 'US,ISO'; + +SELECT d1 AS us_iso FROM TIMESTAMP_TBL; + +SET DateStyle TO 'US,SQL'; + +SHOW DateStyle; + +SELECT d1 AS us_sql FROM TIMESTAMP_TBL; + +SET DateStyle TO 'European,Postgres'; + +SHOW DateStyle; + +INSERT INTO TIMESTAMP_TBL VALUES('13/06/1957'); + +SELECT count(*) as one FROM TIMESTAMP_TBL WHERE d1 = 'Jun 13 1957'; + +SELECT d1 AS european_postgres FROM TIMESTAMP_TBL; + +SET DateStyle TO 'European,ISO'; + +SHOW DateStyle; + +SELECT d1 AS european_iso FROM TIMESTAMP_TBL; + +SET DateStyle TO 'European,SQL'; + +SHOW DateStyle; + +SELECT d1 AS european_sql FROM TIMESTAMP_TBL; + +RESET DateStyle; + +-- +-- to_timestamp() +-- + +SELECT to_timestamp('0097/Feb/16 --> 08:14:30', 'YYYY/Mon/DD --> HH:MI:SS'); + +SELECT to_timestamp('97/2/16 8:14:30', 'FMYYYY/FMMM/FMDD FMHH:FMMI:FMSS'); + +SELECT to_timestamp('2011$03!18 23_38_15', 'YYYY-MM-DD HH24:MI:SS'); + +SELECT to_timestamp('1985 January 12', 'YYYY FMMonth DD'); + +SELECT to_timestamp('1985 FMMonth 12', 'YYYY "FMMonth" DD'); + +SELECT to_timestamp('1985 \ 12', 'YYYY \\ DD'); + +SELECT to_timestamp('My birthday-> Year: 1976, Month: May, Day: 16', + '"My birthday-> Year:" YYYY, "Month:" FMMonth, "Day:" DD'); + +SELECT to_timestamp('1,582nd VIII 21', 'Y,YYYth FMRM DD'); + +SELECT to_timestamp('15 "text between quote marks" 98 54 45', + E'HH24 "\\"text between quote marks\\"" YY MI SS'); + +SELECT to_timestamp('05121445482000', 'MMDDHH24MISSYYYY'); + +SELECT to_timestamp('2000January09Sunday', 'YYYYFMMonthDDFMDay'); + +SELECT to_timestamp('97/Feb/16', 'YYMonDD'); + +SELECT to_timestamp('97/Feb/16', 'YY:Mon:DD'); + +SELECT to_timestamp('97/Feb/16', 'FXYY:Mon:DD'); + +SELECT to_timestamp('97/Feb/16', 'FXYY/Mon/DD'); + +SELECT to_timestamp('19971116', 'YYYYMMDD'); + +SELECT to_timestamp('20000-1116', 'YYYY-MMDD'); + +SELECT to_timestamp('1997 AD 11 16', 'YYYY BC MM DD'); +SELECT to_timestamp('1997 BC 11 16', 'YYYY BC MM DD'); + +SELECT to_timestamp('1997 A.D. 11 16', 'YYYY B.C. MM DD'); +SELECT to_timestamp('1997 B.C. 11 16', 'YYYY B.C. MM DD'); + +SELECT to_timestamp('9-1116', 'Y-MMDD'); + +SELECT to_timestamp('95-1116', 'YY-MMDD'); + +SELECT to_timestamp('995-1116', 'YYY-MMDD'); + +SELECT to_timestamp('2005426', 'YYYYWWD'); + +SELECT to_timestamp('2005300', 'YYYYDDD'); + +SELECT to_timestamp('2005527', 'IYYYIWID'); + +SELECT to_timestamp('005527', 'IYYIWID'); + +SELECT to_timestamp('05527', 'IYIWID'); + +SELECT to_timestamp('5527', 'IIWID'); + +SELECT to_timestamp('2005364', 'IYYYIDDD'); + +SELECT to_timestamp('20050302', 'YYYYMMDD'); + +SELECT to_timestamp('2005 03 02', 'YYYYMMDD'); + +SELECT to_timestamp(' 2005 03 02', 'YYYYMMDD'); + +SELECT to_timestamp(' 20050302', 'YYYYMMDD'); + +SELECT to_timestamp('2011-12-18 11:38 AM', 'YYYY-MM-DD HH12:MI PM'); +SELECT to_timestamp('2011-12-18 11:38 PM', 'YYYY-MM-DD HH12:MI PM'); + +SELECT to_timestamp('2011-12-18 11:38 A.M.', 'YYYY-MM-DD HH12:MI P.M.'); +SELECT to_timestamp('2011-12-18 11:38 P.M.', 'YYYY-MM-DD HH12:MI P.M.'); + +SELECT to_timestamp('2011-12-18 11:38 +05', 'YYYY-MM-DD HH12:MI TZH'); +SELECT to_timestamp('2011-12-18 11:38 -05', 'YYYY-MM-DD HH12:MI TZH'); +SELECT to_timestamp('2011-12-18 11:38 +05:20', 'YYYY-MM-DD HH12:MI TZH:TZM'); +SELECT to_timestamp('2011-12-18 11:38 -05:20', 'YYYY-MM-DD HH12:MI TZH:TZM'); +SELECT to_timestamp('2011-12-18 11:38 20', 'YYYY-MM-DD HH12:MI TZM'); + +SELECT to_timestamp('2011-12-18 11:38 PST', 'YYYY-MM-DD HH12:MI TZ'); -- NYI + +SELECT to_timestamp('2018-11-02 12:34:56.025', 'YYYY-MM-DD HH24:MI:SS.MS'); + +SELECT i, to_timestamp('2018-11-02 12:34:56', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('2018-11-02 12:34:56.1', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('2018-11-02 12:34:56.12', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('2018-11-02 12:34:56.123', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('2018-11-02 12:34:56.1234', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('2018-11-02 12:34:56.12345', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('2018-11-02 12:34:56.123456', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('2018-11-02 12:34:56.123456789', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; + +SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored +SELECT to_date('3 4 21 01', 'W MM CC YY'); +SELECT to_date('2458872', 'J'); + +-- +-- Check handling of BC dates +-- + +SELECT to_date('44-02-01 BC','YYYY-MM-DD BC'); +SELECT to_date('-44-02-01','YYYY-MM-DD'); +SELECT to_date('-44-02-01 BC','YYYY-MM-DD BC'); +SELECT to_timestamp('44-02-01 11:12:13 BC','YYYY-MM-DD HH24:MI:SS BC'); +SELECT to_timestamp('-44-02-01 11:12:13','YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('-44-02-01 11:12:13 BC','YYYY-MM-DD HH24:MI:SS BC'); + +-- +-- Check handling of multiple spaces in format and/or input +-- + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS'); + +SELECT to_timestamp('2000+ JUN', 'YYYY/MON'); +SELECT to_timestamp(' 2000 +JUN', 'YYYY/MON'); +SELECT to_timestamp(' 2000 +JUN', 'YYYY//MON'); +SELECT to_timestamp('2000 +JUN', 'YYYY//MON'); +SELECT to_timestamp('2000 + JUN', 'YYYY MON'); +SELECT to_timestamp('2000 ++ JUN', 'YYYY MON'); +SELECT to_timestamp('2000 + + JUN', 'YYYY MON'); +SELECT to_timestamp('2000 + + JUN', 'YYYY MON'); +SELECT to_timestamp('2000 -10', 'YYYY TZH'); +SELECT to_timestamp('2000 -10', 'YYYY TZH'); + +SELECT to_date('2011 12 18', 'YYYY MM DD'); +SELECT to_date('2011 12 18', 'YYYY MM DD'); +SELECT to_date('2011 12 18', 'YYYY MM DD'); + +SELECT to_date('2011 12 18', 'YYYY MM DD'); +SELECT to_date('2011 12 18', 'YYYY MM DD'); +SELECT to_date('2011 12 18', 'YYYY MM DD'); + +SELECT to_date('2011 12 18', 'YYYYxMMxDD'); +SELECT to_date('2011x 12x 18', 'YYYYxMMxDD'); +SELECT to_date('2011 x12 x18', 'YYYYxMMxDD'); + +-- +-- Check errors for some incorrect usages of to_timestamp() and to_date() +-- + +-- Mixture of date conventions (ISO week and Gregorian): +SELECT to_timestamp('2005527', 'YYYYIWID'); + +-- Insufficient characters in the source string: +SELECT to_timestamp('19971', 'YYYYMMDD'); + +-- Insufficient digit characters for a single node: +SELECT to_timestamp('19971)24', 'YYYYMMDD'); + +-- We don't accept full-length day or month names if short form is specified: +SELECT to_timestamp('Friday 1-January-1999', 'DY DD MON YYYY'); +SELECT to_timestamp('Fri 1-January-1999', 'DY DD MON YYYY'); +SELECT to_timestamp('Fri 1-Jan-1999', 'DY DD MON YYYY'); -- ok + +-- Value clobbering: +SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD'); + +-- Non-numeric input: +SELECT to_timestamp('199711xy', 'YYYYMMDD'); + +-- Input that doesn't fit in an int: +SELECT to_timestamp('10000000000', 'FMYYYY'); + +-- Out-of-range and not-quite-out-of-range fields: +SELECT to_timestamp('2016-06-13 25:00:00', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2016-06-13 15:60:00', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2016-06-13 15:50:60', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2016-06-13 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); -- ok +SELECT to_timestamp('2016-06-13 15:50:55', 'YYYY-MM-DD HH:MI:SS'); +SELECT to_timestamp('2016-13-01 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2016-02-30 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2016-02-29 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); -- ok +SELECT to_timestamp('2015-02-29 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); +SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSS'); -- ok +SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSS'); +SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSSS'); -- ok +SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSSS'); +SELECT to_date('2016-13-10', 'YYYY-MM-DD'); +SELECT to_date('2016-02-30', 'YYYY-MM-DD'); +SELECT to_date('2016-02-29', 'YYYY-MM-DD'); -- ok +SELECT to_date('2015-02-29', 'YYYY-MM-DD'); +SELECT to_date('2015 365', 'YYYY DDD'); -- ok +SELECT to_date('2015 366', 'YYYY DDD'); +SELECT to_date('2016 365', 'YYYY DDD'); -- ok +SELECT to_date('2016 366', 'YYYY DDD'); -- ok +SELECT to_date('2016 367', 'YYYY DDD'); +SELECT to_date('0000-02-01','YYYY-MM-DD'); -- allowed, though it shouldn't be + +-- +-- Check behavior with SQL-style fixed-GMT-offset time zone (cf bug #8572) +-- + +SET TIME ZONE 'America/New_York'; +SET TIME ZONE '-1.5'; + +SHOW TIME ZONE; + +SELECT '2012-12-12 12:00'::timestamptz; +SELECT '2012-12-12 12:00 America/New_York'::timestamptz; + +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ'); +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSS'); +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSSS'); + +RESET TIME ZONE; diff --git a/src/test/singlenode_regress/sql/hs_primary_extremes.sql b/src/test/singlenode_regress/sql/hs_primary_extremes.sql new file mode 100644 index 00000000000..2051e2e5cf2 --- /dev/null +++ b/src/test/singlenode_regress/sql/hs_primary_extremes.sql @@ -0,0 +1,73 @@ +-- +-- Hot Standby tests +-- +-- hs_primary_extremes.sql +-- + +drop table if exists hs_extreme; +create table hs_extreme (col1 integer); + +CREATE OR REPLACE FUNCTION hs_subxids (n integer) +RETURNS void +LANGUAGE plpgsql +AS $$ + BEGIN + IF n <= 0 THEN RETURN; END IF; + INSERT INTO hs_extreme VALUES (n); + PERFORM hs_subxids(n - 1); + RETURN; + EXCEPTION WHEN raise_exception THEN NULL; END; +$$; + +BEGIN; +SELECT hs_subxids(257); +ROLLBACK; +BEGIN; +SELECT hs_subxids(257); +COMMIT; + +set client_min_messages = 'warning'; + +CREATE OR REPLACE FUNCTION hs_locks_create (n integer) +RETURNS void +LANGUAGE plpgsql +AS $$ + BEGIN + IF n <= 0 THEN + CHECKPOINT; + RETURN; + END IF; + EXECUTE 'CREATE TABLE hs_locks_' || n::text || ' ()'; + PERFORM hs_locks_create(n - 1); + RETURN; + EXCEPTION WHEN raise_exception THEN NULL; END; +$$; + +CREATE OR REPLACE FUNCTION hs_locks_drop (n integer) +RETURNS void +LANGUAGE plpgsql +AS $$ + BEGIN + IF n <= 0 THEN + CHECKPOINT; + RETURN; + END IF; + EXECUTE 'DROP TABLE IF EXISTS hs_locks_' || n::text; + PERFORM hs_locks_drop(n - 1); + RETURN; + EXCEPTION WHEN raise_exception THEN NULL; END; +$$; + +BEGIN; +SELECT hs_locks_drop(257); +SELECT hs_locks_create(257); +SELECT count(*) > 257 FROM pg_locks; +ROLLBACK; +BEGIN; +SELECT hs_locks_drop(257); +SELECT hs_locks_create(257); +SELECT count(*) > 257 FROM pg_locks; +COMMIT; +SELECT hs_locks_drop(257); + +SELECT pg_switch_wal(); diff --git a/src/test/singlenode_regress/sql/hs_primary_setup.sql b/src/test/singlenode_regress/sql/hs_primary_setup.sql new file mode 100644 index 00000000000..eeb4421307f --- /dev/null +++ b/src/test/singlenode_regress/sql/hs_primary_setup.sql @@ -0,0 +1,25 @@ +-- +-- Hot Standby tests +-- +-- hs_primary_setup.sql +-- + +drop table if exists hs1; +create table hs1 (col1 integer primary key); +insert into hs1 values (1); + +drop table if exists hs2; +create table hs2 (col1 integer primary key); +insert into hs2 values (12); +insert into hs2 values (13); + +drop table if exists hs3; +create table hs3 (col1 integer primary key); +insert into hs3 values (113); +insert into hs3 values (114); +insert into hs3 values (115); + +DROP sequence if exists hsseq; +create sequence hsseq; + +SELECT pg_switch_wal(); diff --git a/src/test/singlenode_regress/sql/hs_standby_allowed.sql b/src/test/singlenode_regress/sql/hs_standby_allowed.sql new file mode 100644 index 00000000000..6debddc5e99 --- /dev/null +++ b/src/test/singlenode_regress/sql/hs_standby_allowed.sql @@ -0,0 +1,125 @@ +-- +-- Hot Standby tests +-- +-- hs_standby_allowed.sql +-- + +-- SELECT + +select count(*) as should_be_1 from hs1; + +select count(*) as should_be_2 from hs2; + +select count(*) as should_be_3 from hs3; + +COPY hs1 TO '/tmp/copy_test'; +\! cat /tmp/copy_test + +-- Access sequence directly +select is_called from hsseq; + +-- Transactions + +begin; +select count(*) as should_be_1 from hs1; +end; + +begin transaction read only; +select count(*) as should_be_1 from hs1; +end; + +begin transaction isolation level repeatable read; +select count(*) as should_be_1 from hs1; +select count(*) as should_be_1 from hs1; +select count(*) as should_be_1 from hs1; +commit; + +begin; +select count(*) as should_be_1 from hs1; +commit; + +begin; +select count(*) as should_be_1 from hs1; +abort; + +start transaction; +select count(*) as should_be_1 from hs1; +commit; + +begin; +select count(*) as should_be_1 from hs1; +rollback; + +begin; +select count(*) as should_be_1 from hs1; +savepoint s; +select count(*) as should_be_2 from hs2; +commit; + +begin; +select count(*) as should_be_1 from hs1; +savepoint s; +select count(*) as should_be_2 from hs2; +release savepoint s; +select count(*) as should_be_2 from hs2; +savepoint s; +select count(*) as should_be_3 from hs3; +rollback to savepoint s; +select count(*) as should_be_2 from hs2; +commit; + +-- SET parameters + +-- has no effect on read only transactions, but we can still set it +set synchronous_commit = on; +show synchronous_commit; +reset synchronous_commit; + +discard temp; +discard all; + +-- CURSOR commands + +BEGIN; + +DECLARE hsc CURSOR FOR select * from hs3; + +FETCH next from hsc; +fetch first from hsc; +fetch last from hsc; +fetch 1 from hsc; + +CLOSE hsc; + +COMMIT; + +-- Prepared plans + +PREPARE hsp AS select count(*) from hs1; +PREPARE hsp_noexec (integer) AS insert into hs1 values ($1); + +EXECUTE hsp; + +DEALLOCATE hsp; + +-- LOCK + +BEGIN; +LOCK hs1 IN ACCESS SHARE MODE; +LOCK hs1 IN ROW SHARE MODE; +LOCK hs1 IN ROW EXCLUSIVE MODE; +COMMIT; + +-- UNLISTEN +UNLISTEN a; +UNLISTEN *; + +-- LOAD +-- should work, easier if there is no test for that... + + +-- ALLOWED COMMANDS + +CHECKPOINT; + +discard all; diff --git a/src/test/singlenode_regress/sql/hs_standby_check.sql b/src/test/singlenode_regress/sql/hs_standby_check.sql new file mode 100644 index 00000000000..3fe8a02720b --- /dev/null +++ b/src/test/singlenode_regress/sql/hs_standby_check.sql @@ -0,0 +1,16 @@ +-- +-- Hot Standby tests +-- +-- hs_standby_check.sql +-- + +-- +-- If the query below returns false then all other tests will fail after it. +-- +select case pg_is_in_recovery() when false then + 'These tests are intended only for execution on a standby server that is reading ' || + 'WAL from a server upon which the regression database is already created and into ' || + 'which src/test/regress/sql/hs_primary_setup.sql has been run' +else + 'Tests are running on a standby server during recovery' +end; diff --git a/src/test/singlenode_regress/sql/hs_standby_disallowed.sql b/src/test/singlenode_regress/sql/hs_standby_disallowed.sql new file mode 100644 index 00000000000..a470600eec8 --- /dev/null +++ b/src/test/singlenode_regress/sql/hs_standby_disallowed.sql @@ -0,0 +1,103 @@ +-- +-- Hot Standby tests +-- +-- hs_standby_disallowed.sql +-- + +SET transaction_read_only = off; + +begin transaction read write; +commit; + +-- SELECT + +select * from hs1 FOR SHARE; +select * from hs1 FOR UPDATE; + +-- DML +BEGIN; +insert into hs1 values (37); +ROLLBACK; +BEGIN; +delete from hs1 where col1 = 1; +ROLLBACK; +BEGIN; +update hs1 set col1 = NULL where col1 > 0; +ROLLBACK; +BEGIN; +truncate hs3; +ROLLBACK; + +-- DDL + +create temporary table hstemp1 (col1 integer); +BEGIN; +drop table hs2; +ROLLBACK; +BEGIN; +create table hs4 (col1 integer); +ROLLBACK; + +-- Sequences + +SELECT nextval('hsseq'); + +-- Two-phase commit transaction stuff + +BEGIN; +SELECT count(*) FROM hs1; +PREPARE TRANSACTION 'foobar'; +ROLLBACK; +BEGIN; +SELECT count(*) FROM hs1; +COMMIT PREPARED 'foobar'; +ROLLBACK; + +BEGIN; +SELECT count(*) FROM hs1; +PREPARE TRANSACTION 'foobar'; +ROLLBACK PREPARED 'foobar'; +ROLLBACK; + +BEGIN; +SELECT count(*) FROM hs1; +ROLLBACK PREPARED 'foobar'; +ROLLBACK; + + +-- Locks +BEGIN; +LOCK hs1; +COMMIT; +BEGIN; +LOCK hs1 IN SHARE UPDATE EXCLUSIVE MODE; +COMMIT; +BEGIN; +LOCK hs1 IN SHARE MODE; +COMMIT; +BEGIN; +LOCK hs1 IN SHARE ROW EXCLUSIVE MODE; +COMMIT; +BEGIN; +LOCK hs1 IN EXCLUSIVE MODE; +COMMIT; +BEGIN; +LOCK hs1 IN ACCESS EXCLUSIVE MODE; +COMMIT; + +-- Listen +listen a; +notify a; + +-- disallowed commands + +ANALYZE hs1; + +VACUUM hs2; + +CLUSTER hs2 using hs1_pkey; + +REINDEX TABLE hs2; + +REVOKE SELECT ON hs1 FROM PUBLIC; +GRANT SELECT ON hs1 TO PUBLIC; diff --git a/src/test/singlenode_regress/sql/hs_standby_functions.sql b/src/test/singlenode_regress/sql/hs_standby_functions.sql new file mode 100644 index 00000000000..b57f67ff8b5 --- /dev/null +++ b/src/test/singlenode_regress/sql/hs_standby_functions.sql @@ -0,0 +1,24 @@ +-- +-- Hot Standby tests +-- +-- hs_standby_functions.sql +-- + +-- should fail +select pg_current_xact_id(); + +select length(pg_current_snapshot()::text) >= 4; + +select pg_start_backup('should fail'); +select pg_switch_wal(); +select pg_stop_backup(); + +-- should return no rows +select * from pg_prepared_xacts; + +-- just the startup process +select locktype, virtualxid, virtualtransaction, mode, granted +from pg_locks where virtualxid = '1/1'; + +-- suicide is painless +select pg_cancel_backend(pg_backend_pid()); diff --git a/src/test/singlenode_regress/sql/identity.sql b/src/test/singlenode_regress/sql/identity.sql new file mode 100644 index 00000000000..52800f265c2 --- /dev/null +++ b/src/test/singlenode_regress/sql/identity.sql @@ -0,0 +1,357 @@ +-- sanity check of system catalog +SELECT attrelid, attname, attidentity FROM pg_attribute WHERE attidentity NOT IN ('', 'a', 'd'); + + +CREATE TABLE itest1 (a int generated by default as identity, b text); +CREATE TABLE itest2 (a bigint generated always as identity, b text); +CREATE TABLE itest3 (a smallint generated by default as identity (start with 7 increment by 5), b text); +ALTER TABLE itest3 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error + +SELECT table_name, column_name, column_default, is_nullable, is_identity, identity_generation, identity_start, identity_increment, identity_maximum, identity_minimum, identity_cycle FROM information_schema.columns WHERE table_name LIKE 'itest_' ORDER BY 1, 2; + +-- internal sequences should not be shown here +SELECT sequence_name FROM information_schema.sequences WHERE sequence_name LIKE 'itest%'; + +SELECT pg_get_serial_sequence('itest1', 'a'); + +\d itest1_a_seq + +CREATE TABLE itest4 (a int, b text); +ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, requires NOT NULL +ALTER TABLE itest4 ALTER COLUMN a SET NOT NULL; +ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- ok +ALTER TABLE itest4 ALTER COLUMN a DROP NOT NULL; -- error, disallowed +ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, already set +ALTER TABLE itest4 ALTER COLUMN b ADD GENERATED ALWAYS AS IDENTITY; -- error, wrong data type + +-- for later +ALTER TABLE itest4 ALTER COLUMN b SET DEFAULT ''; + +-- invalid column type +CREATE TABLE itest_err_1 (a text generated by default as identity); + +-- duplicate identity +CREATE TABLE itest_err_2 (a int generated always as identity generated by default as identity); + +-- cannot have default and identity +CREATE TABLE itest_err_3 (a int default 5 generated by default as identity); + +-- cannot combine serial and identity +CREATE TABLE itest_err_4 (a serial generated by default as identity); + +INSERT INTO itest1 DEFAULT VALUES; +INSERT INTO itest1 DEFAULT VALUES; +INSERT INTO itest2 DEFAULT VALUES; +INSERT INTO itest2 DEFAULT VALUES; +INSERT INTO itest3 DEFAULT VALUES; +INSERT INTO itest3 DEFAULT VALUES; +INSERT INTO itest4 DEFAULT VALUES; +INSERT INTO itest4 DEFAULT VALUES; + +SELECT * FROM itest1; +SELECT * FROM itest2; +SELECT * FROM itest3; +SELECT * FROM itest4; + + +-- VALUES RTEs + +CREATE TABLE itest5 (a int generated always as identity, b text); +INSERT INTO itest5 VALUES (1, 'a'); -- error +INSERT INTO itest5 VALUES (DEFAULT, 'a'); -- ok +INSERT INTO itest5 VALUES (2, 'b'), (3, 'c'); -- error +INSERT INTO itest5 VALUES (DEFAULT, 'b'), (3, 'c'); -- error +INSERT INTO itest5 VALUES (2, 'b'), (DEFAULT, 'c'); -- error +INSERT INTO itest5 VALUES (DEFAULT, 'b'), (DEFAULT, 'c'); -- ok + +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (-1, 'aa'); +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (-2, 'bb'), (-3, 'cc'); +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (DEFAULT, 'dd'), (-4, 'ee'); +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (-5, 'ff'), (DEFAULT, 'gg'); +INSERT INTO itest5 OVERRIDING SYSTEM VALUE VALUES (DEFAULT, 'hh'), (DEFAULT, 'ii'); + +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (-1, 'aaa'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (-2, 'bbb'), (-3, 'ccc'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (DEFAULT, 'ddd'), (-4, 'eee'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (-5, 'fff'), (DEFAULT, 'ggg'); +INSERT INTO itest5 OVERRIDING USER VALUE VALUES (DEFAULT, 'hhh'), (DEFAULT, 'iii'); + +SELECT * FROM itest5; +DROP TABLE itest5; + +INSERT INTO itest3 VALUES (DEFAULT, 'a'); +INSERT INTO itest3 VALUES (DEFAULT, 'b'), (DEFAULT, 'c'); + +SELECT * FROM itest3; + + +-- OVERRIDING tests + +-- GENERATED BY DEFAULT + +-- This inserts the row as presented: +INSERT INTO itest1 VALUES (10, 'xyz'); +-- With GENERATED BY DEFAULT, OVERRIDING SYSTEM VALUE is not allowed +-- by the standard, but we allow it as a no-op, since it is of use if +-- there are multiple identity columns in a table, which is also an +-- extension. +INSERT INTO itest1 OVERRIDING SYSTEM VALUE VALUES (20, 'xyz'); +-- This ignores the 30 and uses the sequence value instead: +INSERT INTO itest1 OVERRIDING USER VALUE VALUES (30, 'xyz'); + +SELECT * FROM itest1; + +-- GENERATED ALWAYS + +-- This is an error: +INSERT INTO itest2 VALUES (10, 'xyz'); +-- This inserts the row as presented: +INSERT INTO itest2 OVERRIDING SYSTEM VALUE VALUES (20, 'xyz'); +-- This ignores the 30 and uses the sequence value instead: +INSERT INTO itest2 OVERRIDING USER VALUE VALUES (30, 'xyz'); + +SELECT * FROM itest2; + + +-- UPDATE tests + +-- GENERATED BY DEFAULT is not restricted. +UPDATE itest1 SET a = 101 WHERE a = 1; +UPDATE itest1 SET a = DEFAULT WHERE a = 2; +SELECT * FROM itest1; + +-- GENERATED ALWAYS allows only DEFAULT. +UPDATE itest2 SET a = 101 WHERE a = 1; -- error +UPDATE itest2 SET a = DEFAULT WHERE a = 2; -- ok +SELECT * FROM itest2; + + +-- COPY tests + +CREATE TABLE itest9 (a int GENERATED ALWAYS AS IDENTITY, b text, c bigint); + +COPY itest9 FROM stdin; +100 foo 200 +101 bar 201 +\. + +COPY itest9 (b, c) FROM stdin; +foo2 202 +bar2 203 +\. + +SELECT * FROM itest9 ORDER BY c; + + +-- DROP IDENTITY tests + +ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY; +ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY; -- error +ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY IF EXISTS; -- noop + +INSERT INTO itest4 DEFAULT VALUES; -- fails because NOT NULL is not dropped +ALTER TABLE itest4 ALTER COLUMN a DROP NOT NULL; +INSERT INTO itest4 DEFAULT VALUES; +SELECT * FROM itest4; + +-- check that sequence is removed +SELECT sequence_name FROM itest4_a_seq; + + +-- test views + +CREATE TABLE itest10 (a int generated by default as identity, b text); +CREATE TABLE itest11 (a int generated always as identity, b text); + +CREATE VIEW itestv10 AS SELECT * FROM itest10; +CREATE VIEW itestv11 AS SELECT * FROM itest11; + +INSERT INTO itestv10 DEFAULT VALUES; +INSERT INTO itestv10 DEFAULT VALUES; + +INSERT INTO itestv11 DEFAULT VALUES; +INSERT INTO itestv11 DEFAULT VALUES; + +SELECT * FROM itestv10; +SELECT * FROM itestv11; + +INSERT INTO itestv10 VALUES (10, 'xyz'); +INSERT INTO itestv10 OVERRIDING USER VALUE VALUES (11, 'xyz'); + +SELECT * FROM itestv10; + +INSERT INTO itestv11 VALUES (10, 'xyz'); +INSERT INTO itestv11 OVERRIDING SYSTEM VALUE VALUES (11, 'xyz'); + +SELECT * FROM itestv11; + +DROP VIEW itestv10, itestv11; + + +-- ADD COLUMN + +CREATE TABLE itest13 (a int); +-- add column to empty table +ALTER TABLE itest13 ADD COLUMN b int GENERATED BY DEFAULT AS IDENTITY; +INSERT INTO itest13 VALUES (1), (2), (3); +-- add column to populated table +ALTER TABLE itest13 ADD COLUMN c int GENERATED BY DEFAULT AS IDENTITY; +SELECT * FROM itest13; + + +-- various ALTER COLUMN tests + +-- fail, not allowed for identity columns +ALTER TABLE itest1 ALTER COLUMN a SET DEFAULT 1; + +-- fail, not allowed, already has a default +CREATE TABLE itest5 (a serial, b text); +ALTER TABLE itest5 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; + +ALTER TABLE itest3 ALTER COLUMN a TYPE int; +SELECT seqtypid::regtype FROM pg_sequence WHERE seqrelid = 'itest3_a_seq'::regclass; +\d itest3 + +ALTER TABLE itest3 ALTER COLUMN a TYPE text; -- error + +-- kinda silly to change property in the same command, but it should work +ALTER TABLE itest3 + ADD COLUMN c int GENERATED BY DEFAULT AS IDENTITY, + ALTER COLUMN c SET GENERATED ALWAYS; +\d itest3 + + +-- ALTER COLUMN ... SET + +CREATE TABLE itest6 (a int GENERATED ALWAYS AS IDENTITY, b text); +INSERT INTO itest6 DEFAULT VALUES; + +ALTER TABLE itest6 ALTER COLUMN a SET GENERATED BY DEFAULT SET INCREMENT BY 2 SET START WITH 100 RESTART; +INSERT INTO itest6 DEFAULT VALUES; +INSERT INTO itest6 DEFAULT VALUES; +SELECT * FROM itest6; + +SELECT table_name, column_name, is_identity, identity_generation FROM information_schema.columns WHERE table_name = 'itest6' ORDER BY 1, 2; + +ALTER TABLE itest6 ALTER COLUMN b SET INCREMENT BY 2; -- fail, not identity + + +-- prohibited direct modification of sequence + +ALTER SEQUENCE itest6_a_seq OWNED BY NONE; + + +-- inheritance + +CREATE TABLE itest7 (a int GENERATED ALWAYS AS IDENTITY); +INSERT INTO itest7 DEFAULT VALUES; +SELECT * FROM itest7; + +-- identity property is not inherited +CREATE TABLE itest7a (b text) INHERITS (itest7); + +-- make column identity in child table +CREATE TABLE itest7b (a int); +CREATE TABLE itest7c (a int GENERATED ALWAYS AS IDENTITY) INHERITS (itest7b); +INSERT INTO itest7c DEFAULT VALUES; +SELECT * FROM itest7c; + +CREATE TABLE itest7d (a int not null); +CREATE TABLE itest7e () INHERITS (itest7d); +ALTER TABLE itest7d ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE itest7d ADD COLUMN b int GENERATED ALWAYS AS IDENTITY; -- error + +SELECT table_name, column_name, is_nullable, is_identity, identity_generation FROM information_schema.columns WHERE table_name LIKE 'itest7%' ORDER BY 1, 2; + +-- These ALTER TABLE variants will not recurse. +ALTER TABLE itest7 ALTER COLUMN a SET GENERATED BY DEFAULT; +ALTER TABLE itest7 ALTER COLUMN a RESTART; +ALTER TABLE itest7 ALTER COLUMN a DROP IDENTITY; + +-- privileges +CREATE USER regress_identity_user1; +CREATE TABLE itest8 (a int GENERATED ALWAYS AS IDENTITY, b text); +GRANT SELECT, INSERT ON itest8 TO regress_identity_user1; +SET ROLE regress_identity_user1; +INSERT INTO itest8 DEFAULT VALUES; +SELECT * FROM itest8; +RESET ROLE; +DROP TABLE itest8; +DROP USER regress_identity_user1; + +-- multiple steps in ALTER TABLE +CREATE TABLE itest8 (f1 int); + +ALTER TABLE itest8 + ADD COLUMN f2 int NOT NULL, + ALTER COLUMN f2 ADD GENERATED ALWAYS AS IDENTITY; + +ALTER TABLE itest8 + ADD COLUMN f3 int NOT NULL, + ALTER COLUMN f3 ADD GENERATED ALWAYS AS IDENTITY, + ALTER COLUMN f3 SET GENERATED BY DEFAULT SET INCREMENT 10; + +ALTER TABLE itest8 + ADD COLUMN f4 int; + +ALTER TABLE itest8 + ALTER COLUMN f4 SET NOT NULL, + ALTER COLUMN f4 ADD GENERATED ALWAYS AS IDENTITY, + ALTER COLUMN f4 SET DATA TYPE bigint; + +ALTER TABLE itest8 + ADD COLUMN f5 int GENERATED ALWAYS AS IDENTITY; + +ALTER TABLE itest8 + ALTER COLUMN f5 DROP IDENTITY, + ALTER COLUMN f5 DROP NOT NULL, + ALTER COLUMN f5 SET DATA TYPE bigint; + +INSERT INTO itest8 VALUES(0), (1); + +-- This does not work when the table isn't empty. That's intentional, +-- since ADD GENERATED should only affect later insertions: +ALTER TABLE itest8 + ADD COLUMN f22 int NOT NULL, + ALTER COLUMN f22 ADD GENERATED ALWAYS AS IDENTITY; + +TABLE itest8; +\d+ itest8 +\d itest8_f2_seq +\d itest8_f3_seq +\d itest8_f4_seq +\d itest8_f5_seq +DROP TABLE itest8; + + +-- typed tables (currently not supported) + +CREATE TYPE itest_type AS (f1 integer, f2 text, f3 bigint); +CREATE TABLE itest12 OF itest_type (f1 WITH OPTIONS GENERATED ALWAYS AS IDENTITY); -- error +DROP TYPE itest_type CASCADE; + + +-- table partitions (currently not supported) + +CREATE TABLE itest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1); +CREATE TABLE itest_child PARTITION OF itest_parent ( + f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY +) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error +DROP TABLE itest_parent; + + +-- test that sequence of half-dropped serial column is properly ignored + +CREATE TABLE itest14 (id serial); +ALTER TABLE itest14 ALTER id DROP DEFAULT; +ALTER TABLE itest14 ALTER id ADD GENERATED BY DEFAULT AS IDENTITY; +INSERT INTO itest14 (id) VALUES (DEFAULT); + +-- Identity columns must be NOT NULL (cf bug #16913) + +CREATE TABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NULL); -- fail +CREATE TABLE itest15 (id integer NULL GENERATED ALWAYS AS IDENTITY); -- fail +CREATE TABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NOT NULL); +DROP TABLE itest15; +CREATE TABLE itest15 (id integer NOT NULL GENERATED ALWAYS AS IDENTITY); +DROP TABLE itest15; diff --git a/src/test/singlenode_regress/sql/incremental_analyze.sql b/src/test/singlenode_regress/sql/incremental_analyze.sql new file mode 100644 index 00000000000..1bbd2da72c0 --- /dev/null +++ b/src/test/singlenode_regress/sql/incremental_analyze.sql @@ -0,0 +1,883 @@ +-- start_matchsubs +-- m/^LOG.*PartitionSelector/ +-- s/^LOG.*PartitionSelector/PartitionSelector/ +-- m/^LOG.*Feature not supported/ +-- s/^LOG.*Feature not supported/Feature not supported/ +-- end_matchsubs +-- start_matchignore +-- m/^LOG: Missing statistics for column: .*/ +-- end_matchignore +-- start_ignore +DROP DATABASE IF EXISTS incrementalanalyze; +CREATE DATABASE incrementalanalyze; +ALTER DATABASE incrementalanalyze SET lc_monetary TO 'C'; +\c incrementalanalyze +DROP SCHEMA IF EXISTS incremental_analyze; +CREATE SCHEMA incremental_analyze; +-- end_ignore +-- Test ANALYZE for different data types +-- Case 1: Partitions have MCVs but after merge, none of the partition MCVs +-- qualify as a global MCV for the root and they are used to create the +-- root histogram +DROP TABLE IF EXISTS foo; +SET default_statistics_target = 4; +CREATE TYPE inc_analyze_composite AS +( + a numeric, + b numeric +); +CREATE TABLE foo ( + a int, + b int, + c03_bigint bigint, + c04_bigserial bigserial, + c05_bit bit, + c06_bit_varying_10 bit varying(10), + c07_bool bool, + c08_char char, + c09_varchar_10 varchar(10), + c10_cidr cidr, + c11_date date, + c12_numeric_8_2 numeric(8,2), + c13_float8 float8, + c14_inet inet, + c15_int4 int4, + c16_interval interval, + c17_macaddr macaddr, + c18_money money, + c19_float4 float4, + c20_serial4 serial4, + c21_smallint smallint, + c22_text text, + c23_time time, + c24_timetz timetz, + c25_timestamp timestamp, + c26_timestamptz timestamptz, + c27_uuid uuid, + c28_tsquery tsquery, + c29_varchararray character varying(2)[], + c30_intarray int[], + c31_bigintarray bigint[], + c33_bitarray bit(1)[], + c34_bitvaryingarray bit varying(10)[], + c35_boolarray boolean[], + c36_chararray character(1)[], + c37_cidrarray cidr[], + c38_datearray date[], + c39_numericarray numeric[], + c40_float8array double precision[], + c41_inetarray inet[], + c42_int4array integer[], + c43_intervalarray interval[], + c44_macaddrarray macaddr[], + c45_moneyarray money[], + c46_float4array real[], + c47_smallintarrayn smallint[], + c48_textarray text[], + c49_timearray time without time zone[], + c50_timetzarray time with time zone[], + c51_timestamparray timestamp without time zone[], + c52_timestamptzarray timestamp with time zone[], + c53_uuidzarray uuid[], + c54_tsqueryarray tsquery[], + c55_jsonarray json[], + c57_pointarray point[], + c58_linesegarray lseg[], + c59_patharray path[], + c60_boxarray box[], + c61_polygonarray polygon[], + c62_circlearray circle[], + c63_inc_analyze_composite_array inc_analyze_composite[] +) PARTITION BY RANGE (b) (START (0) END(6) EVERY(3)); +CREATE TYPE input_fields AS +( + varchararray character varying(2)[], + intarray int[], + _bigintarray bigint[], + bitarray bit(1)[], + bitvaryingarray bit varying(10)[], + boolarray boolean[], + chararray character(1)[], + cidrarray cidr[], + datearray date[], + numericarray numeric[], + float8array double precision[], + inetarray inet[], + int4array integer[], + intervalarray interval[], + macaddrarray macaddr[], + moneyarray money[], + float4array real[], + smallintarrayn smallint[], + textarray text[], + timearray time without time zone[], + timetzarray time with time zone[], + timestamparray timestamp without time zone[], + timestamptzarray timestamp with time zone[], + uuidzarray uuid[], + tsqueryarray tsquery[], + jsonarray json[], + pointarray point[], + linesegarray lseg[], + patharray path[], + boxarray box[], + polygonarray polygon[], + circlearray circle[], + inc_analyze_composite_array inc_analyze_composite[] +); + +CREATE OR REPLACE FUNCTION get_input_fields(i INT) RETURNS input_fields AS $$ +DECLARE + fields input_fields; +BEGIN + SELECT + ARRAY['a' || (i % 6), 'b' || (i % 6)]::character varying(2)[], + ARRAY[i, i % 6]::int[], + ARRAY[(i % 6), ((i + 1) % 6)]::bigint[], + ARRAY[i, (i + 1)]::bit[], + ARRAY[(i % 6)::bit(10), ((i + 1) % 6)::bit(10)]::bit varying(10)[], + ARRAY[(i % 2), ((i + 1) % 2)]::bool[], + ARRAY['a' || i, 'b' || i]::char[], + ARRAY['192.168.100.' || (i % 6), '192.168.101.' || (i % 6)]::cidr[], + ARRAY['2018-01-' || ((i % 6) + 1), '2018-01-' || ((i % 6) + 1)]::date[], + ARRAY[(i % 6), ((i + 1) % 6)]::numeric[], + ARRAY[(i % 6), ((i + 1) % 6)]::float8[], + ARRAY['192.168.100.' || (i % 6), '192.168.100.' || ((i + 1) % 6)]::inet[], + ARRAY[(i % 6), ((i + 1) % 6)]::int4[], + '{"1 hour", "1 hour"}'::interval[], + ARRAY['08:00:2b:01:02:' || (i % 6), '08:00:2b:01:02:' || (i % 6)]::macaddr[], + ARRAY['123.4', '234.5']::money[], + ARRAY[(i % 6), ((i + 1) % 6)]::float4[], + ARRAY[(i % 6), ((i + 1) % 6)]::smallint[], + ARRAY['abcd' || (i % 6), 'def' || ((i + 1) % 6)]::text[], + ARRAY[(i % 6) || ':00:00', ((i + 1) % 6) || ':00:00']::time[], + ARRAY[(i % 6) || ':00:59 PST', ((i + 1) % 6) || ':00:59 EST']::timetz[], + ARRAY['2018-01-01 ' || (i % 6) || ':59:00', '2018-01-01 ' || ((i + 1) % 6) || ':59:00']::timestamp[], + ARRAY['2018-01-01 ' || (i % 6) || ':59:00 PST', '2018-01-01 ' || ((i + 1) % 6) || ':59:00 EST']::timestamptz[], + ARRAY['11111111-1111-1111-1111-1111111111' || (i % 6) || (i % 6), '11111111-1111-1111-1111-1111111111' || ((i + 1) % 6) || ((i + 1) % 6)]::uuid[], + ARRAY['foo' || (i % 6) || ' & rat', 'rat' || (i % 6) || ' & foo']::tsquery[], + ARRAY['{"a": "b"}', '{"c": "d"}']::json[], + ARRAY[point(i, i + 1), point(i + 2, i + 3)], + ARRAY[lseg(point(i, i + 1), point(i + 2, i + 3)), lseg(point(i + 4, i + 5), point(i + 6, i + 7))], + ARRAY[path(polygon(box(point(i + 1, i + 2), point(i + 3, i + 4)))), path(polygon(box(point(i + 1, i + 2), point(i + 3, i + 4))))], + ARRAY[box(point(i + 1, i + 2), point(i + 3, i + 4)), box(point(i + 1, i + 2), point(i + 3, i + 4))], + ARRAY[polygon(box(point(i + 1, i + 2), point(i + 3, i + 4))), polygon(box(point(i + 1, i + 2), point(i + 3, i + 4)))], + ARRAY[circle(point(i + 1, i + 2), i + 3), circle(point(i + 4, i + 5), i + 6)], + ARRAY[ROW(i % 6, (i + 1) % 6), ROW(i % 6, (i + 1) % 6)]::inc_analyze_composite[] + INTO fields; + + RETURN fields; +END; +$$ LANGUAGE PLPGSQL; +INSERT INTO foo +SELECT +i, +i%6, +i%6::bigint, +i%6, +i::bit, +(i%6)::bit(10)::bit varying(10), +(i%2)::bool, +(i%6)::char, +('a'||(i%6))::varchar(10), +('192.168.100.'||(i%6))::cidr, +('2018-4-'||(i%6)+1)::date, +(i%6)::numeric(8,2), +(i%6)::float8, +inet ('192.168.100.'||(i%6)), +i%6::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%6)::text)::text::macaddr, +(i%6)::text::money, +(i%6)::float4, +i%6, +i%6, +'aa'||(i%6)::text, +((i%6)::text||':59:59')::time, +((i%6)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%6)::text||':59:00')::timestamp, +('2018-01-01 '||(i%6)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%6)::text||(i%6)::text)::uuid, +('foo'||(i%6)::text||' & rat'||(i%6)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' and attname != 'a' ORDER BY attname,tablename; +-- Case 2: Partitions have no MCVs, only histograms, after merge root has to +-- have approximately merged histograms. +TRUNCATE foo; +INSERT INTO foo +SELECT +i, +i%3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i%128))::cidr, +('2018-4-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +((i%12)::text||':59:59')::time, +((i%12)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%12)::text||':59:00')::timestamp, +('2018-01-01 '||(i%12)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5)::text||(i%5)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +INSERT INTO foo +SELECT +i, +i%3, +i+200::bigint, +i+200, +i::bit, +(i+200)::bit(10)::bit varying(10), +(i+200)::bool, +(i+200)::char, +('a'||(i+200))::varchar(10), +('192.168.100.'||(i%128+128))::cidr, +('2018-4-'||(i%15+16))::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128+128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50+50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +((i%12+12)::text||':59:59')::time, +((i%12+12)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%12+12)::text||':59:00')::timestamp, +('2018-01-01 '||(i%12+12)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5+5)::text||(i%5+5)::text)::uuid, +('foo'||(i+200)::text||' & rat'||(i+200)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i%128))::cidr, +('2018-4-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +((i%12)::text||':59:59')::time, +((i%12)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%12)::text||':59:00')::timestamp, +('2018-01-01 '||(i%12)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5)::text||(i%5)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,200) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +-- Case 3: Partitions have MCVs but after merge, MCVs that do not qualify as +-- global MCV for the root will be used to create root histograms +TRUNCATE foo; +INSERT INTO foo +SELECT +i, +i%3, +i%4::bigint, +i%4, +i::bit, +(i%4)::bit(10)::bit varying(10), +(i)::bool, +(i%4)::char, +('a'||(i%4))::varchar(10), +('192.168.100.'||(i%4))::cidr, +('2018-4-'||(i%4)+1)::date, +(i%4)::numeric(8,2), +(i%4)::float8, +inet ('192.168.100.'||(i%4)), +i%4::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%4)::text)::text::macaddr, +(i%4)::text::money, +(i%4)::float4, +i%4, +i%4, +'aa'||(i%4)::text, +('12:'||(i%4)::text||':00')::time, +('12:'||(i%4)::text||':00 EST')::timetz, +('2018-01-01 '||'12:'||(i%4)::text||':00')::timestamp, +('2018-01-01 '||'12:'||(i%4)::text||':00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%4)::text||(i%4)::text)::uuid, +('foo'||(i%4)::text||' & rat'||(i%4)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i))::cidr, +('2018-4-'||(i%26+1))::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +('12:'||(i%60)::text||':00')::time, +('12:'||(i%60)::text||':00 EST')::timetz, +('2018-01-01 '||'12:'||(i%60)::text||':00')::timestamp, +('2018-01-01 '||'12:'||(i%60)::text||':00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%6)::text||(i%6)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,60) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i%4+61::bigint, +i%4+61, +(i%4+61)::bit, +(i%4+61)::bit(10)::bit varying(10), +(i%4+61)::bool, +(i%4+61)::char, +('a'||(i%4+61))::varchar(10), +('192.168.100.'||(i%4+61))::cidr, +('2018-4-'||(i%4)+27)::date, +(i%4+61)::numeric(8,2), +(i%4+61)::float8, +inet ('192.168.100.'||(i%4+61)), +i%4+61::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%4+61)::text)::text::macaddr, +(i%4+61)::text::money, +(i%4+61)::float4, +i%4+61, +i%4+61, +'aa'||(i%4+61)::text, +('12:59:'||(i%4+10)::text)::time, +('12:59:'||(i%4+10)::text||' EST')::timetz, +('2018-01-01 '||'12:59:'||(i%4+10)::text)::timestamp, +('2018-01-01 '||'12:59:'||(i%4+10)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%4+6)::text||(i%4+6)::text)::uuid, +('foo'||(i%4)::text||' & rat'||(i%4)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,40) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +-- Case 4: A partition has MCVs but after merge, those MCVs do not qualify as +-- global MCV for the root will be used to create root histograms +TRUNCATE foo; +INSERT INTO foo +SELECT +i, +i%3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i%128))::cidr, +('2018-4-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +((i%12)::text||':59:59')::time, +((i%12)::text||':59:00 EST')::timetz, +('2018-01-01 '||(i%12)::text||':59:00')::timestamp, +('2018-01-01 '||(i%12)::text||':59:00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5)::text||(i%5)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,100) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i%4+61::bigint, +i%4+61, +(i%4+61)::bit, +(i%4+61)::bit(10)::bit varying(10), +(i%4+61)::bool, +(i%4+61)::char, +('a'||(i%4+61))::varchar(10), +('192.168.100.'||(i%4+61))::cidr, +('2018-4-'||(i%4+26))::date, +(i%4+61)::numeric(8,2), +(i%4+61)::float8, +inet ('192.168.100.'||(i%4+61)), +i%4+61::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%4+61)::text)::text::macaddr, +(i%4+61)::text::money, +(i%4+61)::float4, +i%4+61, +i%4+61, +'aa'||(i%4+61)::text, +('12:'||(i%4+56)::text||':00')::time, +('12:'||(i%4+56)::text||':00 EST')::timetz, +('2018-01-01 '||'12:'||(i%4+56)::text||':00')::timestamp, +('2018-01-01 '||'12:'||(i%4+56)::text||':00 EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%4+6)::text||(i%4+6)::text)::uuid, +('foo'||(i%4+61)::text||' & rat'||(i%4+61)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,8) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i))::cidr, +('2018-4-'||(i%25+1))::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +('12:00:'||(i%60)::text)::time, +('12:00:'||(i%60)::text||' EST')::timetz, +('2018-01-01 '||'12:00'||(i%60)::text)::timestamp, +('2018-01-01 '||'12:00'||(i%60)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%10)::text||(i%10)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,60) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' and attname != 'a' ORDER BY attname,tablename; +-- Case 5: A partition has MCVs but after merge, those MCVs qualify as global +-- MCVs for the root +TRUNCATE foo; +INSERT INTO foo +SELECT +i, +i%3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i%128))::cidr, +('2018-'||(i%12)+1||'-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i%128)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%50)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +('12:'||(i%60)::text||':'||(i%30)::text)::time, +('12:'||(i%60)::text||':'||(i%30)::text||' EST')::timetz, +('2018-01-01 '||'12:'||(i%60)::text||':'||(i%30)::text)::timestamp, +('2018-01-01 '||'12:'||(i%60)::text||':'||(i%30)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%5)::text||(i%5)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,60) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i%4+61::bigint, +i%4+61, +(i%4+61)::bit, +(i%4+61)::bit(10)::bit varying(10), +(i%4+61)::bool, +(i%4+61)::char, +('a'||(i%4+61))::varchar(10), +('192.168.100.'||(i%4+61))::cidr, +('2018-5-'||(i%4)+16)::date, +(i%4+61)::numeric(8,2), +(i%4+61)::float8, +inet ('192.168.100.'||(i%4+61)), +i%4+61::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i%4+61)::text)::text::macaddr, +(i%4+61)::text::money, +(i%4+61)::float4, +i%4+61, +i%4+61, +'aa'||(i%4+61)::text, +('01:00:'||(i%4)::text)::time, +('01:00:'||(i%4)::text||' EST')::timetz, +('2018-01-01 '||'01:00:'||(i%4)::text)::timestamp, +('2018-01-01 '||'01:00:'||(i%4)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%4+6)::text||(i%4+6)::text)::uuid, +('foo'||(i%4+61)::text||' & rat'||(i%4+61)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,8) i; +INSERT INTO foo +SELECT +i, +i%3+3, +i::bigint, +i, +i::bit, +(i)::bit(10)::bit varying(10), +(i)::bool, +(i)::char, +('a'||(i))::varchar(10), +('192.168.100.'||(i))::cidr, +('2018-'||(i%12)+1||'-'||(i%15)+1)::date, +(i)::numeric(8,2), +(i)::float8, +inet ('192.168.100.'||(i)), +i::int4, +interval '24 hours', +macaddr ('12:34:56:78:90:'||(i)::text)::text::macaddr, +(i)::text::money, +(i)::float4, +i, +i, +'aa'||(i)::text, +('12:'||(i%60)::text||':'||(i%30)::text)::time, +('12:'||(i%60)::text||':'||(i%30)::text||' EST')::timetz, +('2018-01-01 '||'12:'||(i%60)::text||':'||(i%30)::text)::timestamp, +('2018-01-01 '||'12:'||(i%60)::text||':'||(i%30)::text||' EST')::timestamptz, +('11111111-1111-1111-1111-1111111111'||(i%10)::text||(i%10)::text)::uuid, +('foo'||(i)::text||' & rat'||(i)::text)::tsquery, +(get_input_fields(i)).* +FROM generate_series(1,10) i; +ANALYZE foo; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' and attname != 'a' ORDER BY attname,tablename; +-- Test merging leaf stats where HLL is empty +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO foo select i, i%6, repeat('aaaa', 100000) FROM generate_series(1, 100)i; +ANALYZE foo; +-- In single node, we don't 'toolarge' bitmap created in acquire_sample_rows_dispatcher. The result is more similar to postgres. +SELECT * FROM pg_stats WHERE tablename like 'foo%' and attname = 'c' ORDER BY attname,tablename; +-- Test ANALYZE full scan HLL +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO foo SELECT i, i%3, 'text_'||i%100 FROM generate_series(1,1000)i; +INSERT INTO foo SELECT i, i%3+3, 'text_'||i%200 FROM generate_series(1,1000)i; +SET default_statistics_target to 3; +ANALYZE FULLSCAN foo; +SELECT tablename, n_distinct FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +-- Test ANALYZE auto merge behavior +-- Do not merge stats from only one partition while other partitions have not been analyzed yet +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO foo SELECT i, i%6, i%6 FROM generate_series(1,100)i; +ANALYZE foo_1_prt_1; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + +-- Merge stats from both partitions +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO foo SELECT i, i%6, i%6 FROM generate_series(1,100)i; +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + +-- No stats after merging +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + +-- Merge stats from only one partition +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO foo SELECT i, i%6, i%6 FROM generate_series(1,100)i; +SET allow_system_table_mods=true; +UPDATE pg_attribute SET attstattarget=0 WHERE attrelid = 'foo_1_prt_1'::regclass and ATTNAME in ('a','b','c'); +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + +-- Merge stats from only one partition one column +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO foo SELECT i, i%6, i%6 FROM generate_series(1,100)i; +ANALYZE foo_1_prt_1(c); +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; + +-- Test merging of leaf stats when one partition has +-- FULL SCAN HLL and the other has HLL from sample +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO FOO SELECT i,i%6 FROM generate_series(1,1000)i; +ANALYZE foo_1_prt_1; +ANALYZE FULLSCAN foo_1_prt_2; +-- Test merging of stats for a newly added partition +-- Do not collect samples while merging stats +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO FOO SELECT i,i%6 FROM generate_series(1,1000)i; +SET default_statistics_target = 4; +ANALYZE foo; +ALTER TABLE foo ADD partition new_part START (6) INCLUSIVE END (9) EXCLUSIVE; +INSERT INTO foo SELECT i, i%3+6 FROM generate_series(1,500)i; +ANALYZE foo_1_prt_new_part; +SET log_statement='none'; +SET client_min_messages = 'log'; +-- Insert a new column that is not analyzed in the leaf partitions. +-- Analyzing root partition will use merging statistics for the first 2 columns, +-- will create a sample for the root to analyze the newly added columns since +-- the leaf partitions does not have any stats for it, yet +ALTER TABLE foo ADD COLUMN c int; +INSERT INTO foo SELECT i, i%9, i%100 FROM generate_series(1,500)i; +-- start_matchsubs +-- m/gp_acquire_sample_rows([^,]+, [^,]+, .+)/ +-- s/gp_acquire_sample_rows([^,]+, [^,]+, .+)/gp_acquire_sample_rows()/ +-- end_matchsubs +ANALYZE VERBOSE rootpartition foo; +-- Testing auto merging root statistics for all columns +-- where column attnums are differents due to dropped columns +-- and split partitions. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text, d int) + PARTITION BY RANGE (a) + (START (0) END (8) EVERY (4), + DEFAULT PARTITION def_part); +INSERT INTO foo SELECT i%13, i, 'something'||i::text, i%121 FROM generate_series(1,1000)i; +ALTER TABLE foo DROP COLUMN b; +ALTER TABLE foo SPLIT DEFAULT PARTITION START (8) END (12) INTO (PARTITION new_part, default PARTITION); +set client_min_messages to 'log'; +ANALYZE foo_1_prt_2; +ANALYZE foo_1_prt_3; +ANALYZE foo_1_prt_new_part; +ANALYZE foo_1_prt_def_part; +reset client_min_messages; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +-- Testing auto merging root statistics for a column whose attnum +-- is aligned and the same in every partition due to dropped columns +-- and split partitions. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text, d int) + PARTITION BY RANGE (a) + (START (0) END (8) EVERY (4), + DEFAULT PARTITION def_part); +INSERT INTO foo SELECT i%13, i, 'something'||i::text, i%121 FROM generate_series(1,1000)i; +ALTER TABLE foo DROP COLUMN b; +ALTER TABLE foo SPLIT DEFAULT PARTITION START (8) END (12) INTO (PARTITION new_part, default PARTITION); +set client_min_messages to 'log'; +ANALYZE foo_1_prt_2(a); +ANALYZE foo_1_prt_3(a); +ANALYZE foo_1_prt_new_part(a); +ANALYZE foo_1_prt_def_part(a); +reset client_min_messages; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +-- Testing auto merging root statistics for a column whose attnum +-- is not aligned and different in partitions due to dropped columns +-- and split partitions. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text, d int) + PARTITION BY RANGE (a) + (START (0) END (8) EVERY (4), + DEFAULT PARTITION def_part); +INSERT INTO foo SELECT i%13, i, 'something'||i::text, i%121 FROM generate_series(1,1000)i; +ALTER TABLE foo DROP COLUMN b; +ALTER TABLE foo SPLIT DEFAULT PARTITION START (8) END (12) INTO (PARTITION new_part, default PARTITION); +set client_min_messages to 'log'; +ANALYZE foo_1_prt_2(d); +ANALYZE foo_1_prt_3(d); +ANALYZE foo_1_prt_new_part(d); +ANALYZE foo_1_prt_def_part(d); +reset client_min_messages; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +-- Testing ANALYZE ROOTPARTITION and when optimizer_analyze_root_partition is off +-- for incremental analyze. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text) + PARTITION BY RANGE (b) + (START (0) END (8) EVERY (4)); +INSERT INTO foo SELECT i%130, i%8, 'something'||i::text FROM generate_series(1,1000)i; +set optimizer_analyze_root_partition=off; +set client_min_messages to 'log'; +-- ANALYZE ROOTPARTITION will sample the table and compute statistics since there +-- is not stats to be merged in the leaf partitions +ANALYZE ROOTPARTITION foo; +reset client_min_messages; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +set client_min_messages to 'log'; +-- ANALYZE ROOT PARTITION will piggyback on the stats collected from the leaf and merge them +ANALYZE ROOTPARTITION foo; +reset client_min_messages; +reset optimizer_analyze_root_partition; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +-- Testing that auto merge will be disabled when optimizer_analyze_root_partition +-- is off for incremental analyze. +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c text) + PARTITION BY RANGE (b) + (START (0) END (8) EVERY (4)); +INSERT INTO foo SELECT i%130, i%8, 'something'||i::text FROM generate_series(1,1000)i; +set optimizer_analyze_root_partition=off; +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +reset optimizer_analyze_root_partition; +-- Test incremental analyze on a partitioned table with different storage type and compression algorithm +DROP TABLE IF EXISTS incr_analyze_test; +CREATE TABLE incr_analyze_test ( + a integer, + b character varying, + c date +) +WITH (appendonly=true, orientation=row) PARTITION BY RANGE(c) + ( + START ('2018-01-01'::date) END ('2018-01-02'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_1', appendonly=true, compresslevel=3, orientation=column, compresstype=ZLIB ), + START ('2018-01-02'::date) END ('2018-01-03'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_2', appendonly=true, compresslevel=1, orientation=column, compresstype=RLE_TYPE ), + START ('2018-01-03'::date) END ('2018-01-04'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_3', appendonly=true, compresslevel=1, orientation=column, compresstype=ZLIB ), + START ('2018-01-04'::date) END ('2018-01-05'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_4', appendonly=true, compresslevel=1, orientation=row, compresstype=ZLIB ), + START ('2018-01-05'::date) END ('2018-01-06'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_5', appendonly=true, compresslevel=1, orientation=row, compresstype=ZLIB ), + START ('2018-01-06'::date) END ('2018-01-07'::date) EVERY ('1 day'::interval) WITH (tablename='incr_analyze_test_1_prt_6', appendonly=false) + ); + +INSERT INTO incr_analyze_test VALUES (1, 'a', '2018-01-01'); +ANALYZE incr_analyze_test; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'incr_analyze_test%' ORDER BY attname,tablename; +INSERT INTO incr_analyze_test SELECT s, md5(s::varchar), '2018-01-02' FROM generate_series(1, 1000) AS s; +ANALYZE incr_analyze_test_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'incr_analyze_test%' ORDER BY attname,tablename; +SELECT relname, relpages, reltuples FROM pg_class WHERE relname LIKE 'incr_analyze_test%' ORDER BY relname; +-- Test merging of stats if an empty partition contains relpages > 0 +-- Do not collect samples while merging stats +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int) PARTITION BY RANGE (b) (START (0) END (6) EVERY (3)); +INSERT INTO foo SELECT i,i%3 FROM generate_series(1,10)i; +ANALYZE foo_1_prt_1; +ANALYZE foo_1_prt_2; +SET allow_system_table_mods = on; +UPDATE pg_class set relpages=3 WHERE relname='foo_1_prt_2'; +RESET allow_system_table_mods; +analyze verbose rootpartition foo; +-- ensure relpages is correctly set after analyzing +analyze foo_1_prt_2; +select reltuples, relpages from pg_class where relname ='foo_1_prt_2'; +-- Test application of column-wise statistics setting to the number of MCVs and histogram bounds on partitioned table +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int) PARTITION BY RANGE (a) (START (0) END (10) EVERY (5)); +-- fill foo with even numbers twice as large than odd ones to avoid fully even distribution of 'a' attribute and hence empty MCV/MCF +INSERT INTO foo SELECT i%10 FROM generate_series(0, 100) i; +INSERT INTO foo SELECT i%10 FROM generate_series(0, 100) i WHERE i%2 = 0; +-- default_statistics_target is 4 +ALTER TABLE foo ALTER COLUMN a SET STATISTICS 5; +ANALYZE foo; +SELECT array_length(most_common_vals, 1), array_length(most_common_freqs, 1), array_length(histogram_bounds, 1) FROM pg_stats WHERE tablename = 'foo' AND attname = 'a'; + +-- Make sure a simple heap table does not store HLL values +CREATE TABLE simple_table_no_hll (a int); +INSERT INTO simple_table_no_hll SELECT generate_series(1,10); +ANALYZE simple_table_no_hll; +SELECT staattnum, stakind1, stakind2, stakind3, stakind4, stakind5, + stavalues1, stavalues2, stavalues3, stavalues4, stavalues5 +FROM pg_statistic WHERE starelid = 'simple_table_no_hll'::regclass; + +-- Make sure analyze rootpartition option works in an option list +set optimizer_analyze_root_partition to off; +DROP TABLE IF EXISTS foo; +CREATE TABLE foo(a int) PARTITION BY RANGE(a) (start (0) INCLUSIVE END (20) EVERY (10)); +INSERT INTO foo values (5),(15); +ANALYZE (verbose, rootpartition off) foo; + +-- root should not have stats +SELECT count(*) from pg_statistic where starelid='foo'::regclass; + +-- root should have stats +ANALYZE (verbose, rootpartition on) foo; +SELECT count(*) from pg_statistic where starelid='foo'::regclass; + +-- Make sure analyze hll fullscan option works in an option list +ANALYZE (verbose, fullscan on) foo; +ANALYZE (verbose, fullscan off) foo; +reset optimizer_analyze_root_partition; + +-- Test merging of stats after the last partition is analyzed. Merging should +-- be done for root without taking a sample from root if one of the column +-- statistics collection is turned off +DROP TABLE IF EXISTS foo; +CREATE TABLE foo (a int, b int, c gp_hyperloglog_estimator) PARTITION BY RANGE (b) (START (1) END (3) EVERY (1)); +SET gp_autostats_mode=none; +ALTER TABLE foo ALTER COLUMN c SET STATISTICS 0; +INSERT INTO foo SELECT i,i%2+1, NULL FROM generate_series(1,100)i; +ANALYZE VERBOSE foo_1_prt_1; +ANALYZE VERBOSE foo_1_prt_2; +SELECT tablename, attname, null_frac, n_distinct, most_common_vals, most_common_freqs, histogram_bounds FROM pg_stats WHERE tablename like 'foo%' ORDER BY attname,tablename; +RESET gp_autostats_mode; + +-- analyze in transaction should merge leaves instead of resampling +drop table if exists foo; +create table foo (a int, b date) partition by range(b) (partition "20210101" start ('20210101'::date) end ('20210201'::date), partition "20210201" start ('20210201'::date) end ('20210301'::date), partition "20210301" start ('20210301'::date) end ('20210401'::date)); +insert into foo select a, '20210101'::date+a from (select generate_series(1,80) a) t1; +analyze verbose foo; + +-- we should see "analyzing "public.foo" inheritance tree" in the output below +begin; +truncate foo_1_prt_20210201; +insert into foo select a, '20210101'::date+a from (select generate_series(31,40) a) t1; +analyze verbose foo_1_prt_20210201; +rollback; diff --git a/src/test/singlenode_regress/sql/incremental_sort.sql b/src/test/singlenode_regress/sql/incremental_sort.sql new file mode 100644 index 00000000000..d8768a6b54d --- /dev/null +++ b/src/test/singlenode_regress/sql/incremental_sort.sql @@ -0,0 +1,285 @@ +-- When we have to sort the entire table, incremental sort will +-- be slower than plain sort, so it should not be used. +explain (costs off) +select * from (select * from tenk1 order by four) t order by four, ten; + +-- When there is a LIMIT clause, incremental sort is beneficial because +-- it only has to sort some of the groups, and not the entire table. +explain (costs off) +select * from (select * from tenk1 order by four) t order by four, ten +limit 1; + +-- When work_mem is not enough to sort the entire table, incremental sort +-- may be faster if individual groups still fit into work_mem. +set work_mem to '2MB'; +explain (costs off) +select * from (select * from tenk1 order by four) t order by four, ten; +reset work_mem; + +create table t(a integer, b integer); + +create or replace function explain_analyze_without_memory(query text) +returns table (out_line text) language plpgsql +as +$$ +declare + line text; +begin + for line in + execute 'explain (analyze, costs off, summary off, timing off) ' || query + loop + out_line := regexp_replace(line, '\d+kB', 'NNkB', 'g'); + return next; + end loop; +end; +$$; + +create or replace function explain_analyze_inc_sort_nodes(query text) +returns jsonb language plpgsql +as +$$ +declare + elements jsonb; + element jsonb; + matching_nodes jsonb := '[]'::jsonb; +begin + execute 'explain (analyze, costs off, summary off, timing off, format ''json'') ' || query into strict elements; + while jsonb_array_length(elements) > 0 loop + element := elements->0; + elements := elements - 0; + case jsonb_typeof(element) + when 'array' then + if jsonb_array_length(element) > 0 then + elements := elements || element; + end if; + when 'object' then + if element ? 'Plan' then + elements := elements || jsonb_build_array(element->'Plan'); + element := element - 'Plan'; + else + if element ? 'Plans' then + elements := elements || jsonb_build_array(element->'Plans'); + element := element - 'Plans'; + end if; + if (element->>'Node Type')::text = 'Incremental Sort' then + matching_nodes := matching_nodes || element; + end if; + end if; + end case; + end loop; + return matching_nodes; +end; +$$; + +create or replace function explain_analyze_inc_sort_nodes_without_memory(query text) +returns jsonb language plpgsql +as +$$ +declare + nodes jsonb := '[]'::jsonb; + node jsonb; + group_key text; + space_key text; +begin + for node in select * from jsonb_array_elements(explain_analyze_inc_sort_nodes(query)) t loop + for group_key in select unnest(array['Full-sort Groups', 'Pre-sorted Groups']::text[]) t loop + for space_key in select unnest(array['Sort Space Memory', 'Sort Space Disk']::text[]) t loop + node := jsonb_set(node, array[group_key, space_key, 'Average Sort Space Used'], '"NN"', false); + node := jsonb_set(node, array[group_key, space_key, 'Peak Sort Space Used'], '"NN"', false); + end loop; + end loop; + nodes := nodes || node; + end loop; + return nodes; +end; +$$; + +create or replace function explain_analyze_inc_sort_nodes_verify_invariants(query text) +returns bool language plpgsql +as +$$ +declare + node jsonb; + group_stats jsonb; + group_key text; + space_key text; +begin + for node in select * from jsonb_array_elements(explain_analyze_inc_sort_nodes(query)) t loop + for group_key in select unnest(array['Full-sort Groups', 'Pre-sorted Groups']::text[]) t loop + group_stats := node->group_key; + for space_key in select unnest(array['Sort Space Memory', 'Sort Space Disk']::text[]) t loop + if (group_stats->space_key->'Peak Sort Space Used')::bigint < (group_stats->space_key->'Peak Sort Space Used')::bigint then + raise exception '% has invalid max space < average space', group_key; + end if; + end loop; + end loop; + end loop; + return true; +end; +$$; + +-- A single large group tested around each mode transition point. +insert into t(a, b) select i/100 + 1, i + 1 from generate_series(0, 999) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 31; +select * from (select * from t order by a) s order by a, b limit 31; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 32; +select * from (select * from t order by a) s order by a, b limit 32; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 33; +select * from (select * from t order by a) s order by a, b limit 33; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 65; +select * from (select * from t order by a) s order by a, b limit 65; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 66; +select * from (select * from t order by a) s order by a, b limit 66; +delete from t; + +-- An initial large group followed by a small group. +insert into t(a, b) select i/50 + 1, i + 1 from generate_series(0, 999) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 55; +select * from (select * from t order by a) s order by a, b limit 55; +-- Test EXPLAIN ANALYZE with only a fullsort group. +select explain_analyze_without_memory('select * from (select * from t order by a) s order by a, b limit 55'); +select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 55')); +select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 55'); +delete from t; + +-- An initial small group followed by a large group. +insert into t(a, b) select (case when i < 5 then i else 9 end), i from generate_series(1, 1000) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 70; +select * from (select * from t order by a) s order by a, b limit 70; +-- Checks case where we hit a group boundary at the last tuple of a batch. +-- Because the full sort state is bounded, we scan 64 tuples (the mode +-- transition point) but only retain 5. Thus when we transition modes, all +-- tuples in the full sort state have different prefix keys. +explain (costs off) select * from (select * from t order by a) s order by a, b limit 5; +select * from (select * from t order by a) s order by a, b limit 5; + +-- Test rescan. +begin; +-- We force the planner to choose a plan with incremental sort on the right side +-- of a nested loop join node. That way we trigger the rescan code path. +set local enable_hashjoin = off; +set local enable_mergejoin = off; +set local enable_material = off; +set local enable_sort = off; +explain (costs off) select * from t left join (select * from (select * from t order by a) v order by a, b) s on s.a = t.a where t.a in (1, 2); +select * from t left join (select * from (select * from t order by a) v order by a, b) s on s.a = t.a where t.a in (1, 2); +rollback; +-- Test EXPLAIN ANALYZE with both fullsort and presorted groups. +select explain_analyze_without_memory('select * from (select * from t order by a) s order by a, b limit 70'); +select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 70')); +select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 70'); +delete from t; + +-- Small groups of 10 tuples each tested around each mode transition point. +insert into t(a, b) select i / 10, i from generate_series(1, 1000) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 31; +select * from (select * from t order by a) s order by a, b limit 31; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 32; +select * from (select * from t order by a) s order by a, b limit 32; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 33; +select * from (select * from t order by a) s order by a, b limit 33; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 65; +select * from (select * from t order by a) s order by a, b limit 65; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 66; +select * from (select * from t order by a) s order by a, b limit 66; +delete from t; + +-- Small groups of only 1 tuple each tested around each mode transition point. +insert into t(a, b) select i, i from generate_series(1, 1000) n(i); +analyze t; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 31; +select * from (select * from t order by a) s order by a, b limit 31; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 32; +select * from (select * from t order by a) s order by a, b limit 32; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 33; +select * from (select * from t order by a) s order by a, b limit 33; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 65; +select * from (select * from t order by a) s order by a, b limit 65; +explain (costs off) select * from (select * from t order by a) s order by a, b limit 66; +select * from (select * from t order by a) s order by a, b limit 66; +delete from t; + +drop table t; + +-- Incremental sort vs. parallel queries +set min_parallel_table_scan_size = '1kB'; +set min_parallel_index_scan_size = '1kB'; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; + +create table t (a int, b int, c int); +insert into t select mod(i,10),mod(i,10),i from generate_series(1,10000) s(i); +create index on t (a); +analyze t; + +set enable_incremental_sort = off; +explain (costs off) select a,b,sum(c) from t group by 1,2 order by 1,2,3 limit 1; + +set enable_incremental_sort = on; +explain (costs off) select a,b,sum(c) from t group by 1,2 order by 1,2,3 limit 1; + +-- Incremental sort vs. set operations with varno 0 +set enable_hashagg to off; +explain (costs off) select * from t union select * from t order by 1,3; + +-- Full sort, not just incremental sort can be pushed below a gather merge path +-- by generate_useful_gather_paths. +explain (costs off) select distinct a,b from t; + +drop table t; + +-- Sort pushdown can't go below where expressions are part of the rel target. +-- In particular this is interesting for volatile expressions which have to +-- go above joins since otherwise we'll incorrectly use expression evaluations +-- across multiple rows. +set enable_hashagg=off; +set enable_seqscan=off; +set enable_incremental_sort = off; +set parallel_tuple_cost=0; +set parallel_setup_cost=0; +set min_parallel_table_scan_size = 0; +set min_parallel_index_scan_size = 0; + +-- Parallel sort below join. +explain (costs off) select distinct sub.unique1, stringu1 +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub; +explain (costs off) select sub.unique1, stringu1 +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub +order by 1, 2; +-- Parallel sort but with expression that can be safely generated at the base rel. +explain (costs off) select distinct sub.unique1, md5(stringu1) +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub; +explain (costs off) select sub.unique1, md5(stringu1) +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub +order by 1, 2; +-- Parallel sort with an aggregate that can be safely generated in parallel, +-- but we can't sort by partial aggregate values. +explain (costs off) select count(*) +from tenk1 t1 +join tenk1 t2 on t1.unique1 = t2.unique2 +join tenk1 t3 on t2.unique1 = t3.unique1 +order by count(*); +-- Parallel sort but with expression (correlated subquery) that +-- is prohibited in parallel plans. +explain (costs off) select distinct + unique1, + (select t.unique1 from tenk1 where tenk1.unique1 = t.unique1) +from tenk1 t, generate_series(1, 1000); +explain (costs off) select + unique1, + (select t.unique1 from tenk1 where tenk1.unique1 = t.unique1) +from tenk1 t, generate_series(1, 1000) +order by 1, 2; +-- Parallel sort but with expression not available until the upper rel. +explain (costs off) select distinct sub.unique1, stringu1 || random()::text +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub; +explain (costs off) select sub.unique1, stringu1 || random()::text +from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub +order by 1, 2; +-- Disallow pushing down sort when pathkey is an SRF. +explain (costs off) select unique1 from tenk1 order by unnest('{1,2}'::int[]); diff --git a/src/test/singlenode_regress/sql/index_including.sql b/src/test/singlenode_regress/sql/index_including.sql new file mode 100644 index 00000000000..44b340053b7 --- /dev/null +++ b/src/test/singlenode_regress/sql/index_including.sql @@ -0,0 +1,219 @@ +/* + * 1.test CREATE INDEX + * + * Deliberately avoid dropping objects in this section, to get some pg_dump + * coverage. + */ + +-- Regular index with included columns +CREATE TABLE tbl_include_reg (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_reg SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE INDEX tbl_include_reg_idx ON tbl_include_reg (c1, c2) INCLUDE (c3, c4); +-- duplicate column is pretty pointless, but we allow it anyway +CREATE INDEX ON tbl_include_reg (c1, c2) INCLUDE (c1, c3); +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_include_reg'::regclass ORDER BY c.relname; +\d tbl_include_reg_idx + +-- Unique index and unique constraint +CREATE TABLE tbl_include_unique1 (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_unique1 SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE UNIQUE INDEX tbl_include_unique1_idx_unique ON tbl_include_unique1 using btree (c1, c2) INCLUDE (c3, c4); +ALTER TABLE tbl_include_unique1 add UNIQUE USING INDEX tbl_include_unique1_idx_unique; +ALTER TABLE tbl_include_unique1 add UNIQUE (c1, c2) INCLUDE (c3, c4); +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_include_unique1'::regclass ORDER BY c.relname; + +-- Unique index and unique constraint. Both must fail. +CREATE TABLE tbl_include_unique2 (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_unique2 SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE UNIQUE INDEX tbl_include_unique2_idx_unique ON tbl_include_unique2 using btree (c1, c2) INCLUDE (c3, c4); +ALTER TABLE tbl_include_unique2 add UNIQUE (c1, c2) INCLUDE (c3, c4); + +-- PK constraint +CREATE TABLE tbl_include_pk (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_pk SELECT 1, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ALTER TABLE tbl_include_pk add PRIMARY KEY (c1, c2) INCLUDE (c3, c4); +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_include_pk'::regclass ORDER BY c.relname; + +CREATE TABLE tbl_include_box (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_box SELECT 1, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE UNIQUE INDEX tbl_include_box_idx_unique ON tbl_include_box using btree (c1, c2) INCLUDE (c3, c4); +ALTER TABLE tbl_include_box add PRIMARY KEY USING INDEX tbl_include_box_idx_unique; +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_include_box'::regclass ORDER BY c.relname; + +-- PK constraint. Must fail. +CREATE TABLE tbl_include_box_pk (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_include_box_pk SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ALTER TABLE tbl_include_box_pk add PRIMARY KEY (c1, c2) INCLUDE (c3, c4); + + +/* + * 2. Test CREATE TABLE with constraint + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + CONSTRAINT covering UNIQUE(c1,c2) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +DROP TABLE tbl; + +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + CONSTRAINT covering PRIMARY KEY(c1,c2) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +INSERT INTO tbl SELECT 1, NULL, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +INSERT INTO tbl SELECT x, 2*x, NULL, NULL FROM generate_series(1,300) AS x; +explain (costs off) +select * from tbl where (c1,c2,c3) < (2,5,1); +select * from tbl where (c1,c2,c3) < (2,5,1); +-- row comparison that compares high key at page boundary +SET enable_seqscan = off; +explain (costs off) +select * from tbl where (c1,c2,c3) < (262,1,1) limit 1; +select * from tbl where (c1,c2,c3) < (262,1,1) limit 1; +DROP TABLE tbl; +RESET enable_seqscan; + +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + UNIQUE(c1,c2) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +DROP TABLE tbl; + +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + PRIMARY KEY(c1,c2) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +INSERT INTO tbl SELECT 1, NULL, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +INSERT INTO tbl SELECT x, 2*x, NULL, NULL FROM generate_series(1,10) AS x; +DROP TABLE tbl; + +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, + EXCLUDE USING btree (c1 WITH =) INCLUDE(c3,c4)); +SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; +SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; +-- ensure that constraint works +INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +INSERT INTO tbl SELECT x, 2*x, NULL, NULL FROM generate_series(1,10) AS x; +DROP TABLE tbl; + +/* + * 3.0 Test ALTER TABLE DROP COLUMN. + * Any column deletion leads to index deletion. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 int); +CREATE UNIQUE INDEX tbl_idx ON tbl using btree(c1, c2, c3, c4); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +ALTER TABLE tbl DROP COLUMN c3; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +DROP TABLE tbl; + +/* + * 3.1 Test ALTER TABLE DROP COLUMN. + * Included column deletion leads to the index deletion, + * AS well AS key columns deletion. It's explained in documentation. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box); +CREATE UNIQUE INDEX tbl_idx ON tbl using btree(c1, c2) INCLUDE(c3,c4); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +ALTER TABLE tbl DROP COLUMN c3; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +DROP TABLE tbl; + +/* + * 3.2 Test ALTER TABLE DROP COLUMN. + * Included column deletion leads to the index deletion. + * AS well AS key columns deletion. It's explained in documentation. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4)); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +ALTER TABLE tbl DROP COLUMN c3; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +ALTER TABLE tbl DROP COLUMN c1; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +DROP TABLE tbl; + +/* + * 3.3 Test ALTER TABLE SET STATISTICS + */ +CREATE TABLE tbl (c1 int, c2 int); +CREATE INDEX tbl_idx ON tbl (c1, (c1+0)) INCLUDE (c2); +ALTER INDEX tbl_idx ALTER COLUMN 1 SET STATISTICS 1000; +ALTER INDEX tbl_idx ALTER COLUMN 2 SET STATISTICS 1000; +ALTER INDEX tbl_idx ALTER COLUMN 3 SET STATISTICS 1000; +ALTER INDEX tbl_idx ALTER COLUMN 4 SET STATISTICS 1000; +DROP TABLE tbl; + +/* + * 4. CREATE INDEX CONCURRENTLY + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4)); +INSERT INTO tbl SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,1000) AS x; +CREATE UNIQUE INDEX CONCURRENTLY on tbl (c1, c2) INCLUDE (c3, c4); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +DROP TABLE tbl; + + +/* + * 5. REINDEX + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4)); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +ALTER TABLE tbl DROP COLUMN c3; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +REINDEX INDEX tbl_c1_c2_c3_c4_key; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +ALTER TABLE tbl DROP COLUMN c1; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl' ORDER BY indexname; +DROP TABLE tbl; + +/* + * 7. Check various AMs. All but btree, gist and spgist must fail. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 box, c4 box); +CREATE INDEX on tbl USING brin(c1, c2) INCLUDE (c3, c4); +CREATE INDEX on tbl USING gist(c3) INCLUDE (c1, c4); +CREATE INDEX on tbl USING spgist(c3) INCLUDE (c4); +CREATE INDEX on tbl USING gin(c1, c2) INCLUDE (c3, c4); +CREATE INDEX on tbl USING hash(c1, c2) INCLUDE (c3, c4); +CREATE INDEX on tbl USING rtree(c3) INCLUDE (c1, c4); +CREATE INDEX on tbl USING btree(c1, c2) INCLUDE (c3, c4); +DROP TABLE tbl; + +/* + * 8. Update, delete values in indexed table. + */ +CREATE TABLE tbl (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +CREATE UNIQUE INDEX tbl_idx_unique ON tbl using btree(c1, c2) INCLUDE (c3,c4); +UPDATE tbl SET c1 = 100 WHERE c1 = 2; +UPDATE tbl SET c1 = 1 WHERE c1 = 3; +-- should fail +UPDATE tbl SET c2 = 2 WHERE c1 = 1; +UPDATE tbl SET c3 = 1; +DELETE FROM tbl WHERE c1 = 5 OR c3 = 12; +DROP TABLE tbl; + +/* + * 9. Alter column type. + */ +CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, UNIQUE(c1, c2) INCLUDE(c3,c4)); +INSERT INTO tbl SELECT x, 2*x, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; +ALTER TABLE tbl ALTER c1 TYPE bigint; +ALTER TABLE tbl ALTER c3 TYPE bigint; +\d tbl +DROP TABLE tbl; diff --git a/src/test/singlenode_regress/sql/index_including_gist.sql b/src/test/singlenode_regress/sql/index_including_gist.sql new file mode 100644 index 00000000000..7d5c99b2e79 --- /dev/null +++ b/src/test/singlenode_regress/sql/index_including_gist.sql @@ -0,0 +1,90 @@ +/* + * 1.1. test CREATE INDEX with buffered build + */ + +-- Regular index with included columns +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +-- size is chosen to exceed page size and trigger actual truncation +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,8000) AS x; +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c2,c3); +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_gist'::regclass ORDER BY c.relname; +SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); +SET enable_bitmapscan TO off; +EXPLAIN (costs off) SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); +SET enable_bitmapscan TO default; +DROP TABLE tbl_gist; + +/* + * 1.2. test CREATE INDEX with inserts + */ + +-- Regular index with included columns +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +-- size is chosen to exceed page size and trigger actual truncation +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c2,c3); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,8000) AS x; +SELECT pg_get_indexdef(i.indexrelid) +FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = 'tbl_gist'::regclass ORDER BY c.relname; +SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); +SET enable_bitmapscan TO off; +EXPLAIN (costs off) SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); +SET enable_bitmapscan TO default; +DROP TABLE tbl_gist; + +/* + * 2. CREATE INDEX CONCURRENTLY + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +CREATE INDEX CONCURRENTLY tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c2,c3); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl_gist' ORDER BY indexname; +DROP TABLE tbl_gist; + + +/* + * 3. REINDEX + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c3); +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl_gist' ORDER BY indexname; +REINDEX INDEX tbl_gist_idx; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl_gist' ORDER BY indexname; +ALTER TABLE tbl_gist DROP COLUMN c1; +SELECT indexdef FROM pg_indexes WHERE tablename = 'tbl_gist' ORDER BY indexname; +DROP TABLE tbl_gist; + +/* + * 4. Update, delete values in indexed table. + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c3); +UPDATE tbl_gist SET c1 = 100 WHERE c1 = 2; +UPDATE tbl_gist SET c1 = 1 WHERE c1 = 3; +DELETE FROM tbl_gist WHERE c1 = 5 OR c3 = 12; +DROP TABLE tbl_gist; + +/* + * 5. Alter column type. + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +CREATE INDEX tbl_gist_idx ON tbl_gist using gist (c4) INCLUDE (c1,c3); +ALTER TABLE tbl_gist ALTER c1 TYPE bigint; +ALTER TABLE tbl_gist ALTER c3 TYPE bigint; +\d tbl_gist +DROP TABLE tbl_gist; + +/* + * 6. EXCLUDE constraint. + */ +CREATE TABLE tbl_gist (c1 int, c2 int, c3 int, c4 box, EXCLUDE USING gist (c4 WITH &&) INCLUDE (c1, c2, c3)); +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(x,x+1),point(2*x,2*x+1)) FROM generate_series(1,10) AS x; +INSERT INTO tbl_gist SELECT x, 2*x, 3*x, box(point(3*x,2*x),point(3*x+1,2*x+1)) FROM generate_series(1,10) AS x; +EXPLAIN (costs off) SELECT * FROM tbl_gist where c4 <@ box(point(1,1),point(10,10)); +\d tbl_gist +DROP TABLE tbl_gist; diff --git a/src/test/singlenode_regress/sql/indexing.sql b/src/test/singlenode_regress/sql/indexing.sql new file mode 100644 index 00000000000..42f398b67c2 --- /dev/null +++ b/src/test/singlenode_regress/sql/indexing.sql @@ -0,0 +1,749 @@ +-- Creating an index on a partitioned table makes the partitions +-- automatically get the index +create table idxpart (a int, b int, c text) partition by range (a); + +-- relhassubclass of a partitioned index is false before creating any partition. +-- It will be set after the first partition is created. +create index idxpart_idx on idxpart (a); +select relhassubclass from pg_class where relname = 'idxpart_idx'; + +-- Check that partitioned indexes are present in pg_indexes. +select indexdef from pg_indexes where indexname like 'idxpart_idx%'; +drop index idxpart_idx; + +create table idxpart1 partition of idxpart for values from (0) to (10); +create table idxpart2 partition of idxpart for values from (10) to (100) + partition by range (b); +create table idxpart21 partition of idxpart2 for values from (0) to (100); + +-- Even with partitions, relhassubclass should not be set if a partitioned +-- index is created only on the parent. +create index idxpart_idx on only idxpart(a); +select relhassubclass from pg_class where relname = 'idxpart_idx'; +drop index idxpart_idx; + +create index on idxpart (a); +select relname, relkind, relhassubclass, inhparent::regclass + from pg_class left join pg_index ix on (indexrelid = oid) + left join pg_inherits on (ix.indexrelid = inhrelid) + where relname like 'idxpart%' order by relname; +drop table idxpart; + +-- Some unsupported features +create table idxpart (a int, b int, c text) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (10); +create index concurrently on idxpart (a); +drop table idxpart; + +-- Verify bugfix with query on indexed partitioned table with no partitions +-- https://postgr.es/m/20180124162006.pmapfiznhgngwtjf@alvherre.pgsql +CREATE TABLE idxpart (col1 INT) PARTITION BY RANGE (col1); +CREATE INDEX ON idxpart (col1); +CREATE TABLE idxpart_two (col2 INT); +SELECT col2 FROM idxpart_two fk LEFT OUTER JOIN idxpart pk ON (col1 = col2); +DROP table idxpart, idxpart_two; + +-- Verify bugfix with index rewrite on ALTER TABLE / SET DATA TYPE +-- https://postgr.es/m/CAKcux6mxNCGsgATwf5CGMF8g4WSupCXicCVMeKUTuWbyxHOMsQ@mail.gmail.com +CREATE TABLE idxpart (a INT, b TEXT, c INT) PARTITION BY RANGE(a); +CREATE TABLE idxpart1 PARTITION OF idxpart FOR VALUES FROM (MINVALUE) TO (MAXVALUE); +CREATE INDEX partidx_abc_idx ON idxpart (a, b, c); +INSERT INTO idxpart (a, b, c) SELECT i, i, i FROM generate_series(1, 50) i; +ALTER TABLE idxpart ALTER COLUMN c TYPE numeric; +DROP TABLE idxpart; + +-- If a table without index is attached as partition to a table with +-- an index, the index is automatically created +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +create table idxpart1 (like idxpart); +\d idxpart1 +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 +\d+ idxpart1_a_idx +\d+ idxpart1_b_c_idx + +-- Forbid ALTER TABLE when attaching or detaching an index to a partition. +create index idxpart_c on only idxpart (c); +create index idxpart1_c on idxpart1 (c); +alter table idxpart_c attach partition idxpart1_c for values from (10) to (20); +alter index idxpart_c attach partition idxpart1_c; +select relname, relpartbound from pg_class + where relname in ('idxpart_c', 'idxpart1_c') + order by relname; +alter table idxpart_c detach partition idxpart1_c; +drop table idxpart; + +-- If a partition already has an index, don't create a duplicative one +create table idxpart (a int, b int) partition by range (a, b); +create table idxpart1 partition of idxpart for values from (0, 0) to (10, 10); +create index on idxpart1 (a, b); +create index on idxpart (a, b); +\d idxpart1 +select relname, relkind, relhassubclass, inhparent::regclass + from pg_class left join pg_index ix on (indexrelid = oid) + left join pg_inherits on (ix.indexrelid = inhrelid) + where relname like 'idxpart%' order by relname; +drop table idxpart; + +-- DROP behavior for partitioned indexes +create table idxpart (a int) partition by range (a); +create index on idxpart (a); +create table idxpart1 partition of idxpart for values from (0) to (10); +drop index idxpart1_a_idx; -- no way +drop index concurrently idxpart_a_idx; -- unsupported +drop index idxpart_a_idx; -- both indexes go away +select relname, relkind from pg_class + where relname like 'idxpart%' order by relname; +create index on idxpart (a); +drop table idxpart1; -- the index on partition goes away too +select relname, relkind from pg_class + where relname like 'idxpart%' order by relname; +drop table idxpart; + +-- DROP behavior with temporary partitioned indexes +create temp table idxpart_temp (a int) partition by range (a); +create index on idxpart_temp(a); +create temp table idxpart1_temp partition of idxpart_temp + for values from (0) to (10); +drop index idxpart1_temp_a_idx; -- error +-- non-concurrent drop is enforced here, so it is a valid case. +drop index concurrently idxpart_temp_a_idx; +select relname, relkind from pg_class + where relname like 'idxpart_temp%' order by relname; +drop table idxpart_temp; + +-- ALTER INDEX .. ATTACH, error cases +create table idxpart (a int, b int) partition by range (a, b); +create table idxpart1 partition of idxpart for values from (0, 0) to (10, 10); +create index idxpart_a_b_idx on only idxpart (a, b); +create index idxpart1_a_b_idx on idxpart1 (a, b); +create index idxpart1_tst1 on idxpart1 (b, a); +create index idxpart1_tst2 on idxpart1 using hash (a); +create index idxpart1_tst3 on idxpart1 (a, b) where a > 10; + +alter index idxpart attach partition idxpart1; +alter index idxpart_a_b_idx attach partition idxpart1; +alter index idxpart_a_b_idx attach partition idxpart_a_b_idx; +alter index idxpart_a_b_idx attach partition idxpart1_b_idx; +alter index idxpart_a_b_idx attach partition idxpart1_tst1; +alter index idxpart_a_b_idx attach partition idxpart1_tst2; +alter index idxpart_a_b_idx attach partition idxpart1_tst3; +-- OK +alter index idxpart_a_b_idx attach partition idxpart1_a_b_idx; +alter index idxpart_a_b_idx attach partition idxpart1_a_b_idx; -- quiet + +-- reject dupe +create index idxpart1_2_a_b on idxpart1 (a, b); +alter index idxpart_a_b_idx attach partition idxpart1_2_a_b; +drop table idxpart; +-- make sure everything's gone +select indexrelid::regclass, indrelid::regclass + from pg_index where indexrelid::regclass::text like 'idxpart%'; + +-- Don't auto-attach incompatible indexes +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 (a int, b int); +create index on idxpart1 using hash (a); +create index on idxpart1 (a) where b > 1; +create index on idxpart1 ((a + 0)); +create index on idxpart1 (a, a); +create index on idxpart (a); +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +\d idxpart1 +drop table idxpart; + +-- If CREATE INDEX ONLY, don't create indexes on partitions; and existing +-- indexes on partitions don't change parent. ALTER INDEX ATTACH can change +-- the parent after the fact. +create table idxpart (a int) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100); +create table idxpart2 partition of idxpart for values from (100) to (1000) + partition by range (a); +create table idxpart21 partition of idxpart2 for values from (100) to (200); +create table idxpart22 partition of idxpart2 for values from (200) to (300); +create index on idxpart22 (a); +create index on only idxpart2 (a); +create index on idxpart (a); +-- Here we expect that idxpart1 and idxpart2 have a new index, but idxpart21 +-- does not; also, idxpart22 is not attached. +\d idxpart1 +\d idxpart2 +\d idxpart21 +select indexrelid::regclass, indrelid::regclass, inhparent::regclass + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) +where indexrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +alter index idxpart2_a_idx attach partition idxpart22_a_idx; +select indexrelid::regclass, indrelid::regclass, inhparent::regclass + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) +where indexrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +-- attaching idxpart22 is not enough to set idxpart22_a_idx valid ... +alter index idxpart2_a_idx attach partition idxpart22_a_idx; +\d idxpart2 +-- ... but this one is. +create index on idxpart21 (a); +alter index idxpart2_a_idx attach partition idxpart21_a_idx; +\d idxpart2 +drop table idxpart; + +-- When a table is attached a partition and it already has an index, a +-- duplicate index should not get created, but rather the index becomes +-- attached to the parent's index. +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +create table idxpart1 (like idxpart including indexes); +\d idxpart1 +select relname, relkind, inhparent::regclass + from pg_class left join pg_index ix on (indexrelid = oid) + left join pg_inherits on (ix.indexrelid = inhrelid) + where relname like 'idxpart%' order by relname; +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 +select relname, relkind, inhparent::regclass + from pg_class left join pg_index ix on (indexrelid = oid) + left join pg_inherits on (ix.indexrelid = inhrelid) + where relname like 'idxpart%' order by relname; +drop table idxpart; + +-- Verify that attaching an invalid index does not mark the parent index valid. +-- On the other hand, attaching a valid index marks not only its direct +-- ancestor valid, but also any indirect ancestor that was only missing the one +-- that was just made valid +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 partition of idxpart for values from (1) to (1000) partition by range (a); +create table idxpart11 partition of idxpart1 for values from (1) to (100); +create index on only idxpart1 (a); +create index on only idxpart (a); +-- this results in two invalid indexes: +select relname, indisvalid from pg_class join pg_index on indexrelid = oid + where relname like 'idxpart%' order by relname; +-- idxpart1_a_idx is not valid, so idxpart_a_idx should not become valid: +alter index idxpart_a_idx attach partition idxpart1_a_idx; +select relname, indisvalid from pg_class join pg_index on indexrelid = oid + where relname like 'idxpart%' order by relname; +-- after creating and attaching this, both idxpart1_a_idx and idxpart_a_idx +-- should become valid +create index on idxpart11 (a); +alter index idxpart1_a_idx attach partition idxpart11_a_idx; +select relname, indisvalid from pg_class join pg_index on indexrelid = oid + where relname like 'idxpart%' order by relname; +drop table idxpart; + +-- verify dependency handling during ALTER TABLE DETACH PARTITION +create table idxpart (a int) partition by range (a); +create table idxpart1 (like idxpart); +create index on idxpart1 (a); +create index on idxpart (a); +create table idxpart2 (like idxpart); +alter table idxpart attach partition idxpart1 for values from (0000) to (1000); +alter table idxpart attach partition idxpart2 for values from (1000) to (2000); +create table idxpart3 partition of idxpart for values from (2000) to (3000); +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; +-- a) after detaching partitions, the indexes can be dropped independently +alter table idxpart detach partition idxpart1; +alter table idxpart detach partition idxpart2; +alter table idxpart detach partition idxpart3; +drop index idxpart1_a_idx; +drop index idxpart2_a_idx; +drop index idxpart3_a_idx; +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; +drop table idxpart, idxpart1, idxpart2, idxpart3; +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; + +create table idxpart (a int) partition by range (a); +create table idxpart1 (like idxpart); +create index on idxpart1 (a); +create index on idxpart (a); +create table idxpart2 (like idxpart); +alter table idxpart attach partition idxpart1 for values from (0000) to (1000); +alter table idxpart attach partition idxpart2 for values from (1000) to (2000); +create table idxpart3 partition of idxpart for values from (2000) to (3000); +-- b) after detaching, dropping the index on parent does not remove the others +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; +alter table idxpart detach partition idxpart1; +alter table idxpart detach partition idxpart2; +alter table idxpart detach partition idxpart3; +drop index idxpart_a_idx; +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; +drop table idxpart, idxpart1, idxpart2, idxpart3; +select relname, relkind from pg_class where relname like 'idxpart%' order by relname; + +create table idxpart (a int, b int, c int) partition by range(a); +create index on idxpart(c); +create table idxpart1 partition of idxpart for values from (0) to (250); +create table idxpart2 partition of idxpart for values from (250) to (500); +alter table idxpart detach partition idxpart2; +\d idxpart2 +alter table idxpart2 drop column c; +\d idxpart2 +drop table idxpart, idxpart2; + +-- Verify that expression indexes inherit correctly +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 (like idxpart); +create index on idxpart1 ((a + b)); +create index on idxpart ((a + b)); +create table idxpart2 (like idxpart); +alter table idxpart attach partition idxpart1 for values from (0000) to (1000); +alter table idxpart attach partition idxpart2 for values from (1000) to (2000); +create table idxpart3 partition of idxpart for values from (2000) to (3000); +select relname as child, inhparent::regclass as parent, pg_get_indexdef as childdef + from pg_class join pg_inherits on inhrelid = oid, + lateral pg_get_indexdef(pg_class.oid) + where relkind in ('i', 'I') and relname like 'idxpart%' order by relname; +drop table idxpart; + +-- Verify behavior for collation (mis)matches +create table idxpart (a text) partition by range (a); +create table idxpart1 (like idxpart); +create table idxpart2 (like idxpart); +create index on idxpart2 (a collate "POSIX"); +create index on idxpart2 (a); +create index on idxpart2 (a collate "C"); +alter table idxpart attach partition idxpart1 for values from ('aaa') to ('bbb'); +alter table idxpart attach partition idxpart2 for values from ('bbb') to ('ccc'); +create table idxpart3 partition of idxpart for values from ('ccc') to ('ddd'); +create index on idxpart (a collate "C"); +create table idxpart4 partition of idxpart for values from ('ddd') to ('eee'); +select relname as child, inhparent::regclass as parent, pg_get_indexdef as childdef + from pg_class left join pg_inherits on inhrelid = oid, + lateral pg_get_indexdef(pg_class.oid) + where relkind in ('i', 'I') and relname like 'idxpart%' order by relname; +drop table idxpart; + +-- Verify behavior for opclass (mis)matches +create table idxpart (a text) partition by range (a); +create table idxpart1 (like idxpart); +create table idxpart2 (like idxpart); +create index on idxpart2 (a); +alter table idxpart attach partition idxpart1 for values from ('aaa') to ('bbb'); +alter table idxpart attach partition idxpart2 for values from ('bbb') to ('ccc'); +create table idxpart3 partition of idxpart for values from ('ccc') to ('ddd'); +create index on idxpart (a text_pattern_ops); +create table idxpart4 partition of idxpart for values from ('ddd') to ('eee'); +-- must *not* have attached the index we created on idxpart2 +select relname as child, inhparent::regclass as parent, pg_get_indexdef as childdef + from pg_class left join pg_inherits on inhrelid = oid, + lateral pg_get_indexdef(pg_class.oid) + where relkind in ('i', 'I') and relname like 'idxpart%' order by relname; +drop index idxpart_a_idx; +create index on only idxpart (a text_pattern_ops); +-- must reject +alter index idxpart_a_idx attach partition idxpart2_a_idx; +drop table idxpart; + +-- Verify that attaching indexes maps attribute numbers correctly +create table idxpart (col1 int, a int, col2 int, b int) partition by range (a); +create table idxpart1 (b int, col1 int, col2 int, col3 int, a int); +alter table idxpart drop column col1, drop column col2; +alter table idxpart1 drop column col1, drop column col2, drop column col3; +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +create index idxpart_1_idx on only idxpart (b, a); +create index idxpart1_1_idx on idxpart1 (b, a); +create index idxpart1_1b_idx on idxpart1 (b); +-- test expressions and partial-index predicate, too +create index idxpart_2_idx on only idxpart ((b + a)) where a > 1; +create index idxpart1_2_idx on idxpart1 ((b + a)) where a > 1; +create index idxpart1_2b_idx on idxpart1 ((a + b)) where a > 1; +create index idxpart1_2c_idx on idxpart1 ((b + a)) where b > 1; +alter index idxpart_1_idx attach partition idxpart1_1b_idx; -- fail +alter index idxpart_1_idx attach partition idxpart1_1_idx; +alter index idxpart_2_idx attach partition idxpart1_2b_idx; -- fail +alter index idxpart_2_idx attach partition idxpart1_2c_idx; -- fail +alter index idxpart_2_idx attach partition idxpart1_2_idx; -- ok +select relname as child, inhparent::regclass as parent, pg_get_indexdef as childdef + from pg_class left join pg_inherits on inhrelid = oid, + lateral pg_get_indexdef(pg_class.oid) + where relkind in ('i', 'I') and relname like 'idxpart%' order by relname; +drop table idxpart; + +-- Make sure the partition columns are mapped correctly +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (c, b); +create table idxpart1 (c text, a int, b int); +alter table idxpart attach partition idxpart1 for values from (0) to (10); +create table idxpart2 (c text, a int, b int); +create index on idxpart2 (a); +create index on idxpart2 (c, b); +alter table idxpart attach partition idxpart2 for values from (10) to (20); +select c.relname, pg_get_indexdef(indexrelid) + from pg_class c join pg_index i on c.oid = i.indexrelid + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +drop table idxpart; + +-- Verify that columns are mapped correctly in expression indexes +create table idxpart (col1 int, col2 int, a int, b int) partition by range (a); +create table idxpart1 (col2 int, b int, col1 int, a int); +create table idxpart2 (col1 int, col2 int, b int, a int); +alter table idxpart drop column col1, drop column col2; +alter table idxpart1 drop column col1, drop column col2; +alter table idxpart2 drop column col1, drop column col2; +create index on idxpart2 (abs(b)); +alter table idxpart attach partition idxpart2 for values from (0) to (1); +create index on idxpart (abs(b)); +create index on idxpart ((b + 1)); +alter table idxpart attach partition idxpart1 for values from (1) to (2); +select c.relname, pg_get_indexdef(indexrelid) + from pg_class c join pg_index i on c.oid = i.indexrelid + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +drop table idxpart; + +-- Verify that columns are mapped correctly for WHERE in a partial index +create table idxpart (col1 int, a int, col3 int, b int) partition by range (a); +alter table idxpart drop column col1, drop column col3; +create table idxpart1 (col1 int, col2 int, col3 int, col4 int, b int, a int); +alter table idxpart1 drop column col1, drop column col2, drop column col3, drop column col4; +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +create table idxpart2 (col1 int, col2 int, b int, a int); +create index on idxpart2 (a) where b > 1000; +alter table idxpart2 drop column col1, drop column col2; +alter table idxpart attach partition idxpart2 for values from (1000) to (2000); +create index on idxpart (a) where b > 1000; +select c.relname, pg_get_indexdef(indexrelid) + from pg_class c join pg_index i on c.oid = i.indexrelid + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +drop table idxpart; + +-- Column number mapping: dropped columns in the partition +create table idxpart1 (drop_1 int, drop_2 int, col_keep int, drop_3 int); +alter table idxpart1 drop column drop_1; +alter table idxpart1 drop column drop_2; +alter table idxpart1 drop column drop_3; +create index on idxpart1 (col_keep); +create table idxpart (col_keep int) partition by range (col_keep); +create index on idxpart (col_keep); +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +\d idxpart +\d idxpart1 +select attrelid::regclass, attname, attnum from pg_attribute + where attrelid::regclass::text like 'idxpart%' and attnum > 0 + order by attrelid::regclass, attnum; +drop table idxpart; + +-- Column number mapping: dropped columns in the parent table +create table idxpart(drop_1 int, drop_2 int, col_keep int, drop_3 int) partition by range (col_keep); +alter table idxpart drop column drop_1; +alter table idxpart drop column drop_2; +alter table idxpart drop column drop_3; +create table idxpart1 (col_keep int); +create index on idxpart1 (col_keep); +create index on idxpart (col_keep); +alter table idxpart attach partition idxpart1 for values from (0) to (1000); +\d idxpart +\d idxpart1 +select attrelid::regclass, attname, attnum from pg_attribute + where attrelid::regclass::text like 'idxpart%' and attnum > 0 + order by attrelid::regclass, attnum; +drop table idxpart; + +-- +-- Constraint-related indexes +-- + +-- Verify that it works to add primary key / unique to partitioned tables +create table idxpart (a int primary key, b int) partition by range (a); +\d idxpart +-- multiple primary key on child should fail +create table failpart partition of idxpart (b primary key) for values from (0) to (100); +drop table idxpart; +-- primary key on child is okay if there's no PK in the parent, though +create table idxpart (a int) partition by range (a); +create table idxpart1pk partition of idxpart (a primary key) for values from (0) to (100); +\d idxpart1pk +drop table idxpart; + +-- Failing to use the full partition key is not allowed +create table idxpart (a int unique, b int) partition by range (a, b); +create table idxpart (a int, b int unique) partition by range (a, b); +create table idxpart (a int primary key, b int) partition by range (b, a); +create table idxpart (a int, b int primary key) partition by range (b, a); + +-- OK if you use them in some other order +create table idxpart (a int, b int, c text, primary key (a, b, c)) partition by range (b, c, a); +drop table idxpart; + +-- not other types of index-based constraints +create table idxpart (a int, exclude (a with = )) partition by range (a); + +-- no expressions in partition key for PK/UNIQUE +create table idxpart (a int primary key, b int) partition by range ((b + a)); +create table idxpart (a int unique, b int) partition by range ((b + a)); + +-- use ALTER TABLE to add a primary key +create table idxpart (a int, b int, c text) partition by range (a, b); +alter table idxpart add primary key (a); -- not an incomplete one though +alter table idxpart add primary key (a, b); -- this works +\d idxpart +create table idxpart1 partition of idxpart for values from (0, 0) to (1000, 1000); +\d idxpart1 +drop table idxpart; + +-- use ALTER TABLE to add a unique constraint +create table idxpart (a int, b int) partition by range (a, b); +alter table idxpart add unique (a); -- not an incomplete one though +alter table idxpart add unique (b, a); -- this works +\d idxpart +drop table idxpart; + +-- Exclusion constraints cannot be added +create table idxpart (a int, b int) partition by range (a); +alter table idxpart add exclude (a with =); +drop table idxpart; + +-- When (sub)partitions are created, they also contain the constraint +create table idxpart (a int, b int, primary key (a, b)) partition by range (a, b); +create table idxpart1 partition of idxpart for values from (1, 1) to (10, 10); +create table idxpart2 partition of idxpart for values from (10, 10) to (20, 20) + partition by range (b); +create table idxpart21 partition of idxpart2 for values from (10) to (15); +create table idxpart22 partition of idxpart2 for values from (15) to (20); +create table idxpart3 (b int not null, a int not null); +alter table idxpart attach partition idxpart3 for values from (20, 20) to (30, 30); +select conname, contype, conrelid::regclass, conindid::regclass, conkey + from pg_constraint where conrelid::regclass::text like 'idxpart%' + order by conname; +drop table idxpart; + +-- Verify that multi-layer partitioning honors the requirement that all +-- columns in the partition key must appear in primary/unique key +create table idxpart (a int, b int, primary key (a)) partition by range (a); +create table idxpart2 partition of idxpart +for values from (0) to (1000) partition by range (b); -- fail +drop table idxpart; + +-- Ditto for the ATTACH PARTITION case +create table idxpart (a int unique, b int) partition by range (a); +create table idxpart1 (a int not null, b int, unique (a, b)) + partition by range (a, b); +alter table idxpart attach partition idxpart1 for values from (1) to (1000); +DROP TABLE idxpart, idxpart1; + +-- Multi-layer partitioning works correctly in this case: +create table idxpart (a int, b int, primary key (a, b)) partition by range (a); +create table idxpart2 partition of idxpart for values from (0) to (1000) partition by range (b); +create table idxpart21 partition of idxpart2 for values from (0) to (1000); +select conname, contype, conrelid::regclass, conindid::regclass, conkey + from pg_constraint where conrelid::regclass::text like 'idxpart%' + order by conname; +drop table idxpart; + +-- If a partitioned table has a unique/PK constraint, then it's not possible +-- to drop the corresponding constraint in the children; nor it's possible +-- to drop the indexes individually. Dropping the constraint in the parent +-- gets rid of the lot. +create table idxpart (i int) partition by hash (i); +create table idxpart0 partition of idxpart (i) for values with (modulus 2, remainder 0); +create table idxpart1 partition of idxpart (i) for values with (modulus 2, remainder 1); +alter table idxpart0 add primary key(i); +alter table idxpart add primary key(i); +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +drop index idxpart0_pkey; -- fail +drop index idxpart1_pkey; -- fail +alter table idxpart0 drop constraint idxpart0_pkey; -- fail +alter table idxpart1 drop constraint idxpart1_pkey; -- fail +alter table idxpart drop constraint idxpart_pkey; -- ok +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +drop table idxpart; + +-- If the partition to be attached already has a primary key, fail if +-- it doesn't match the parent's PK. +CREATE TABLE idxpart (c1 INT PRIMARY KEY, c2 INT, c3 VARCHAR(10)) PARTITION BY RANGE(c1); +CREATE TABLE idxpart1 (LIKE idxpart); +ALTER TABLE idxpart1 ADD PRIMARY KEY (c1, c2); +ALTER TABLE idxpart ATTACH PARTITION idxpart1 FOR VALUES FROM (100) TO (200); +DROP TABLE idxpart, idxpart1; + +-- Ditto if there is some distance between the PKs (subpartitioning) +create table idxpart (a int, b int, primary key (a)) partition by range (a); +create table idxpart1 (a int not null, b int) partition by range (a); +create table idxpart11 (a int not null, b int primary key); +alter table idxpart1 attach partition idxpart11 for values from (0) to (1000); +alter table idxpart attach partition idxpart1 for values from (0) to (10000); +drop table idxpart, idxpart1, idxpart11; + +-- If a partitioned table has a constraint whose index is not valid, +-- attaching a missing partition makes it valid. +create table idxpart (a int) partition by range (a); +create table idxpart0 (like idxpart); +alter table idxpart0 add primary key (a); +alter table idxpart attach partition idxpart0 for values from (0) to (1000); +alter table only idxpart add primary key (a); +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +alter index idxpart_pkey attach partition idxpart0_pkey; +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +drop table idxpart; + +-- Related to the above scenario: ADD PRIMARY KEY on the parent mustn't +-- automatically propagate NOT NULL to child columns. +create table idxpart (a int) partition by range (a); +create table idxpart0 (like idxpart); +alter table idxpart0 add unique (a); +alter table idxpart attach partition idxpart0 default; +alter table only idxpart add primary key (a); -- fail, no NOT NULL constraint +alter table idxpart0 alter column a set not null; +alter table only idxpart add primary key (a); -- now it works +alter table idxpart0 alter column a drop not null; -- fail, pkey needs it +drop table idxpart; + +-- if a partition has a unique index without a constraint, does not attach +-- automatically; creates a new index instead. +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 (a int not null, b int); +create unique index on idxpart1 (a); +alter table idxpart add primary key (a); +alter table idxpart attach partition idxpart1 for values from (1) to (1000); +select indrelid::regclass, indexrelid::regclass, inhparent::regclass, indisvalid, + conname, conislocal, coninhcount, connoinherit, convalidated + from pg_index idx left join pg_inherits inh on (idx.indexrelid = inh.inhrelid) + left join pg_constraint con on (idx.indexrelid = con.conindid) + where indrelid::regclass::text like 'idxpart%' + order by indexrelid::regclass::text collate "C"; +drop table idxpart; + +-- Can't attach an index without a corresponding constraint +create table idxpart (a int, b int) partition by range (a); +create table idxpart1 (a int not null, b int); +create unique index on idxpart1 (a); +alter table idxpart attach partition idxpart1 for values from (1) to (1000); +alter table only idxpart add primary key (a); +alter index idxpart_pkey attach partition idxpart1_a_idx; -- fail +drop table idxpart; + +-- Test that unique constraints are working +create table idxpart (a int, b text, primary key (a, b)) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100000); +create table idxpart2 (c int, like idxpart); +insert into idxpart2 (c, a, b) values (42, 572814, 'inserted first'); +alter table idxpart2 drop column c; +create unique index on idxpart (a); +alter table idxpart attach partition idxpart2 for values from (100000) to (1000000); +insert into idxpart values (0, 'zero'), (42, 'life'), (2^16, 'sixteen'); +insert into idxpart select 2^g, format('two to power of %s', g) from generate_series(15, 17) g; +insert into idxpart values (16, 'sixteen'); +insert into idxpart (b, a) values ('one', 142857), ('two', 285714); +insert into idxpart select a * 2, b || b from idxpart where a between 2^16 and 2^19; +insert into idxpart values (572814, 'five'); +insert into idxpart values (857142, 'six'); +select tableoid::regclass, * from idxpart order by a; +drop table idxpart; + +-- intentionally leave some objects around +create table idxpart (a int) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100); +create table idxpart2 partition of idxpart for values from (100) to (1000) + partition by range (a); +create table idxpart21 partition of idxpart2 for values from (100) to (200); +create table idxpart22 partition of idxpart2 for values from (200) to (300); +create index on idxpart22 (a); +create index on only idxpart2 (a); +alter index idxpart2_a_idx attach partition idxpart22_a_idx; +create index on idxpart (a); +create table idxpart_another (a int, b int, primary key (a, b)) partition by range (a); +create table idxpart_another_1 partition of idxpart_another for values from (0) to (100); +create table idxpart3 (c int, b int, a int) partition by range (a); +alter table idxpart3 drop column b, drop column c; +create table idxpart31 partition of idxpart3 for values from (1000) to (1200); +create table idxpart32 partition of idxpart3 for values from (1200) to (1400); +alter table idxpart attach partition idxpart3 for values from (1000) to (2000); + +-- More objects intentionally left behind, to verify some pg_dump/pg_upgrade +-- behavior; see https://postgr.es/m/20190321204928.GA17535@alvherre.pgsql +create schema regress_indexing; +set search_path to regress_indexing; +create table pk (a int primary key) partition by range (a); +create table pk1 partition of pk for values from (0) to (1000); +create table pk2 (b int, a int); +alter table pk2 drop column b; +alter table pk2 alter a set not null; +alter table pk attach partition pk2 for values from (1000) to (2000); +create table pk3 partition of pk for values from (2000) to (3000); +create table pk4 (like pk); +alter table pk attach partition pk4 for values from (3000) to (4000); +create table pk5 (like pk) partition by range (a); +create table pk51 partition of pk5 for values from (4000) to (4500); +create table pk52 partition of pk5 for values from (4500) to (5000); +alter table pk attach partition pk5 for values from (4000) to (5000); +reset search_path; + +-- Test that covering partitioned indexes work in various cases +create table covidxpart (a int, b int) partition by list (a); +create unique index on covidxpart (a) include (b); +create table covidxpart1 partition of covidxpart for values in (1); +create table covidxpart2 partition of covidxpart for values in (2); +insert into covidxpart values (1, 1); +insert into covidxpart values (1, 1); +create table covidxpart3 (b int, c int, a int); +alter table covidxpart3 drop c; +alter table covidxpart attach partition covidxpart3 for values in (3); +insert into covidxpart values (3, 1); +insert into covidxpart values (3, 1); +create table covidxpart4 (b int, a int); +create unique index on covidxpart4 (a) include (b); +create unique index on covidxpart4 (a); +alter table covidxpart attach partition covidxpart4 for values in (4); +insert into covidxpart values (4, 1); +insert into covidxpart values (4, 1); +create unique index on covidxpart (b) include (a); -- should fail + +-- check that detaching a partition also detaches the primary key constraint +create table parted_pk_detach_test (a int primary key) partition by list (a); +create table parted_pk_detach_test1 partition of parted_pk_detach_test for values in (1); +alter table parted_pk_detach_test1 drop constraint parted_pk_detach_test1_pkey; -- should fail +alter table parted_pk_detach_test detach partition parted_pk_detach_test1; +alter table parted_pk_detach_test1 drop constraint parted_pk_detach_test1_pkey; +drop table parted_pk_detach_test, parted_pk_detach_test1; +create table parted_uniq_detach_test (a int unique) partition by list (a); +create table parted_uniq_detach_test1 partition of parted_uniq_detach_test for values in (1); +alter table parted_uniq_detach_test1 drop constraint parted_uniq_detach_test1_a_key; -- should fail +alter table parted_uniq_detach_test detach partition parted_uniq_detach_test1; +alter table parted_uniq_detach_test1 drop constraint parted_uniq_detach_test1_a_key; +drop table parted_uniq_detach_test, parted_uniq_detach_test1; + +-- check that dropping a column takes with it any partitioned indexes +-- depending on it. +create table parted_index_col_drop(a int, b int, c int) + partition by list (a); +create table parted_index_col_drop1 partition of parted_index_col_drop + for values in (1) partition by list (a); +-- leave this partition without children. +create table parted_index_col_drop2 partition of parted_index_col_drop + for values in (2) partition by list (a); +create table parted_index_col_drop11 partition of parted_index_col_drop1 + for values in (1); +create index on parted_index_col_drop (b); +create index on parted_index_col_drop (c); +create index on parted_index_col_drop (b, c); +alter table parted_index_col_drop drop column c; +\d parted_index_col_drop +\d parted_index_col_drop1 +\d parted_index_col_drop2 +\d parted_index_col_drop11 +drop table parted_index_col_drop; diff --git a/src/test/singlenode_regress/sql/indexjoin.sql b/src/test/singlenode_regress/sql/indexjoin.sql new file mode 100644 index 00000000000..45b51f60a1a --- /dev/null +++ b/src/test/singlenode_regress/sql/indexjoin.sql @@ -0,0 +1,2554 @@ +CREATE TABLE my_tt_agg_small ( + symbol character(16), + event_ts bigint, + trade_price numeric, + trade_volume bigint +); + + +CREATE TABLE my_tq_agg_small ( + ets bigint, + sym character varying(16), + bid_price numeric, + ask_price numeric, + end_ts bigint +); + +COPY my_tt_agg_small (symbol, event_ts, trade_price, trade_volume) FROM stdin; +SFD 20101126141540067 165350 200 +SFD 20101126114903007 162950 900 +SSO 20101126114618004 415700 200 +SFD 20101126135708973 165325 100 +SSO 20101126123243370 414100 200 +SSO 20101126103004068 418900 100 +SSO 20101126143516183 413000 400 +SSO 20101126101605922 417300 100 +SSO 20101126141714316 413900 100 +SSO 20101126105438196 420200 300 +SSO 20101126130551217 415200 1884 +SSO 20101126115347005 416094 200 +SFD 20101126142751018 165525 200 +SFD 20101126104718850 162300 100 +SFD 20101126124225712 163400 100 +SFD 20101126140901866 165400 200 +SFD 20101126132748128 163400 200 +SSO 20101126113409949 417100 100 +SSO 20101126122851098 414500 200 +SSO 20101126130853141 413400 100 +SSO 20101126142501553 413900 100 +SSO 20101126110703554 419000 2000 +SSO 20101126111754263 418900 100 +SSO 20101126131159446 414300 200 +SSO 20101126105503130 420200 600 +SFD 20101126103528703 161500 100 +SSO 20101126130611791 415200 200 +SSO 20101126134523280 415200 100 +SSO 20101126114458196 415801 100 +SFD 20101126111634685 161800 200 +SSO 20101126143028816 413800 100 +SFD 20101126114903027 162900 100 +SSO 20101126102534669 419300 100 +SSO 20101126104934902 420296 100 +SFD 20101126132128793 164200 100 +SSO 20101126110209616 419400 100 +SSO 20101126114622409 415700 100 +SSO 20101126102910429 418900 200 +SSO 20101126130710744 414800 200 +SSO 20101126134050571 415200 100 +SSO 20101126143537087 412600 100 +SSO 20101126130216492 415000 100 +SSO 20101126112330010 418600 100 +SSO 20101126132056731 413000 100 +SSO 20101126101909312 418600 200 +SSO 20101126142747861 413500 100 +SSO 20101126140756477 414400 200 +SFD 20101126141930459 165400 100 +SSO 20101126130722909 414000 100 +SFD 20101126132000905 163900 200 +SSO 20101126143910661 413700 100 +SSO 20101126105105773 420400 200 +SFD 20101126135544046 165300 100 +SSO 20101126140334172 414800 200 +SFD 20101126141143414 165500 500 +SSO 20101126132255964 413400 200 +SSO 20101126102739958 419000 100 +SSO 20101126110149068 419400 100 +SFD 20101126101854502 162200 200 +SSO 20101126140802108 414600 100 +SFD 20101126112501534 162000 500 +SSO 20101126105517786 419900 100 +SFD 20101126142750870 165500 100 +SSO 20101126105826745 419700 100 +SSO 20101126130714449 414500 158 +SSO 20101126130810468 413700 100 +SSO 20101126141140108 414700 100 +SFD 20101126141143418 165500 100 +SSO 20101126132848219 413700 200 +SSO 20101126110440168 419200 123 +SSO 20101126143511788 413000 200 +SFD 20101126135445966 164900 100 +SSO 20101126114950925 415000 200 +SSO 20101126122332088 415300 200 +SSO 20101126140738594 414400 200 +SSO 20101126123418884 414300 600 +SFD 20101126132643539 163700 100 +SSO 20101126130807367 413800 300 +SSO 20101126132030805 413000 300 +SSO 20101126115539875 416200 100 +SSO 20101126133447080 414600 100 +SFD 20101126111417395 161800 1600 +SSO 20101126131038125 414000 100 +SSO 20101126140744197 414400 100 +SSO 20101126113637525 417100 100 +SSO 20101126105754039 419800 100 +SSO 20101126114603380 415900 200 +SSO 20101126114137215 416800 200 +SSO 20101126134027584 415400 100 +SSO 20101126134848481 415000 100 +SFD 20101126135749249 165700 100 +SSO 20101126103544685 419480 1100 +SSO 20101126143609990 413000 100 +SSO 20101126111647886 419000 200 +SSO 20101126122759847 414600 200 +SSO 20101126135616060 415600 100 +SSO 20101126112427413 418100 100 +SSO 20101126115012757 415200 700 +SFD 20101126112716237 162100 100 +SSO 20101126130715131 414200 200 +SFD 20101126130031060 164000 100 +SFD 20101126114522652 163100 100 +SSO 20101126135333236 415000 100 +SSO 20101126143537003 412600 200 +SSO 20101126123321946 414100 300 +SSO 20101126120604250 416400 100 +SSO 20101126113846420 417200 100 +SSO 20101126142451184 413900 100 +SSO 20101126115503201 416300 100 +SFD 20101126125825175 164200 100 +SSO 20101126143245800 413500 100 +SSO 20101126121621949 416400 100 +SSO 20101126114342119 416100 100 +SSO 20101126120618531 416400 246 +SSO 20101126130707222 414700 400 +SFD 20101126103441803 161500 300 +SSO 20101126134036304 415400 146 +SSO 20101126140047856 415500 200 +SFD 20101126103005559 161700 100 +SSO 20101126140616208 415000 100 +SSO 20101126113636765 417300 500 +SSO 20101126113453468 417100 200 +SSO 20101126101605890 417300 200 +SSO 20101126105329812 420000 171 +SSO 20101126120749846 416300 800 +SSO 20101126110853997 419300 200 +SSO 20101126130704392 414800 270 +SSO 20101126115850387 415900 200 +SSO 20101126124939495 414800 200 +SSO 20101126142309251 414600 335 +SSO 20101126114551287 415900 100 +SSO 20101126123802699 414500 500 +SSO 20101126110004924 419900 100 +SSO 20101126113359671 417100 141 +SSO 20101126141929749 414300 100 +SSO 20101126134054343 415200 800 +SSO 20101126131848923 413800 100 +SSO 20101126130224192 415300 200 +SSO 20101126105517786 419900 100 +SSO 20101126104758870 420100 100 +SSO 20101126131619976 414000 123 +SSO 20101126113006036 418300 866 +SSO 20101126111358582 419200 1800 +SSO 20101126122754091 414700 100 +SSO 20101126135333236 415000 100 +SSO 20101126142838242 413500 200 +SSO 20101126113403721 417100 1000 +SSO 20101126113959989 416600 200 +SSO 20101126113011394 418400 300 +SSO 20101126105424710 420300 100 +SSO 20101126123428434 414500 100 +SSO 20101126105325042 420100 100 +SSO 20101126114816778 415000 100 +SSO 20101126110617990 418700 100 +SSO 20101126141925219 414400 100 +SSO 20101126102023826 418500 100 +SSO 20101126103924857 419900 100 +SSO 20101126105849151 419625 100 +SSO 20101126131348047 413900 100 +SSO 20101126113637241 417300 1000 +SFD 20101126111745854 161900 100 +SSO 20101126143838743 413700 100 +SSO 20101126113453458 417100 200 +SSO 20101126142424814 414000 100 +SFD 20101126121722920 162500 100 +SSO 20101126105358112 420300 1000 +SSO 20101126112944097 418000 200 +SSO 20101126134100279 415000 190 +SSO 20101126101709857 418100 165 +SSO 20101126104013964 419763 100 +SSO 20101126113041749 418300 100 +SSO 20101126114618008 415700 106 +SSO 20101126122840398 414400 100 +SSO 20101126132520125 413600 300 +SSO 20101126103758899 419700 600 +SSO 20101126122520605 415175 1000 +SFD 20101126113959990 162900 100 +SSO 20101126141956083 414400 100 +SSO 20101126115245995 415798 1000 +SSO 20101126140053811 415400 100 +SSO 20101126140818182 414399 100 +SFD 20101126101752361 161900 100 +SSO 20101126132056079 413000 200 +SSO 20101126140617828 415000 100 +SFD 20101126104602149 162300 200 +SFD 20101126115409329 162900 100 +SSO 20101126130010638 415500 300 +SSO 20101126114258924 416400 500 +SSO 20101126131209969 414200 100 +SSO 20101126105443658 420100 100 +SFD 20101126103327476 161500 100 +SSO 20101126101443309 417000 100 +SFD 20101126124639145 163400 100 +SSO 20101126130431657 415600 200 +SSO 20101126130431657 415600 400 +SSO 20101126134114387 414900 100 +SSO 20101126115518789 416200 200 +SSO 20101126105625089 419800 100 +SFD 20101126131917942 164000 100 +SSO 20101126105430987 420300 200 +SSO 20101126102438583 419400 100 +SSO 20101126113912443 416900 100 +SSO 20101126132645595 413501 200 +SSO 20101126114456865 415900 100 +SSO 20101126113636889 417100 200 +SSO 20101126114516074 415501 100 +SSO 20101126113538994 417197 200 +SSO 20101126142545339 414100 100 +SSO 20101126140033101 415501 1000 +SFD 20101126111723537 161700 300 +SSO 20101126103140617 418600 200 +SSO 20101126113453530 417200 200 +SSO 20101126104859164 420200 100 +SSO 20101126123628022 414800 100 +SSO 20101126104046425 419500 200 +SSO 20101126130605677 415100 200 +SSO 20101126131917795 413100 200 +SSO 20101126130213540 414700 100 +SSO 20101126113636841 417200 200 +SFD 20101126135756855 165750 100 +SSO 20101126115010525 415100 100 +SSO 20101126132938938 413800 100 +SSO 20101126141554586 414200 100 +SSO 20101126130840845 413700 200 +SSO 20101126114846399 414900 200 +SSO 20101126103107093 418500 100 +SSO 20101126132938474 413800 200 +SSO 20101126121710164 415900 100 +SFD 20101126114903009 162900 200 +SSO 20101126131235625 413900 100 +SFD 20101126134958750 164550 100 +SSO 20101126103537432 419400 100 +SSO 20101126132312872 413400 500 +SFD 20101126114239283 163163 200 +SSO 20101126143537747 412600 200 +SSO 20101126103026298 418800 100 +SSO 20101126115001012 414900 100 +SSO 20101126121621949 416400 300 +SSO 20101126143505542 413000 100 +SSO 20101126130802076 414000 330 +SSO 20101126115747456 415800 500 +SSO 20101126123430908 414500 200 +SSO 20101126143620175 413300 2000 +SSO 20101126105759234 419900 200 +SFD 20101126120930243 163050 100 +SSO 20101126130857288 413400 200 +SFD 20101126140546276 165250 100 +SSO 20101126120953550 416300 900 +SSO 20101126101210755 417500 300 +SSO 20101126103750590 419400 200 +SSO 20101126123605349 414800 100 +SSO 20101126121636735 416300 200 +SSO 20101126101710043 417900 100 +SSO 20101126123102566 414500 200 +SSO 20101126115022903 415300 100 +SSO 20101126115451813 416300 100 +SSO 20101126141925625 414300 100 +SFD 20101126101624106 161900 100 +SSO 20101126140738588 414400 135 +SSO 20101126114803631 415100 100 +SSO 20101126105454327 420200 100 +SSO 20101126121421400 416500 1500 +SFD 20101126120946382 163000 100 +SFD 20101126122600695 162500 100 +SFD 20101126103422112 161400 100 +SSO 20101126140738592 414400 100 +SSO 20101126102502342 419500 100 +SSO 20101126123201437 414200 100 +SFD 20101126131925440 163900 100 +SSO 20101126112955530 418000 100 +SSO 20101126103624657 419400 100 +SSO 20101126105431177 420400 100 +SSO 20101126130216654 415000 200 +SSO 20101126105735960 419800 100 +SFD 20101126113550137 163100 100 +SSO 20101126101851068 418600 600 +SSO 20101126123751700 414675 100 +SSO 20101126122847120 414500 300 +SSO 20101126143326653 413200 100 +SSO 20101126104655754 420192 200 +SFD 20101126135450393 164900 100 +SFD 20101126111758343 161500 200 +SSO 20101126111715845 418900 300 +SSO 20101126132129086 413100 100 +SSO 20101126124348260 414600 200 +SFD 20101126135435803 164600 100 +SSO 20101126130922633 413700 100 +SSO 20101126114908292 415000 1000 +SFD 20101126124846035 163500 100 +SSO 20101126112548492 417400 100 +SFD 20101126141327966 165500 100 +SSO 20101126105742841 419800 100 +SFD 20101126102200948 162100 100 +SSO 20101126113410973 417100 100 +SFD 20101126140059177 165300 200 +SSO 20101126115449867 416300 200 +SSO 20101126142559496 413762 3610 +SSO 20101126132557735 413500 145 +SSO 20101126104818561 420000 100 +SSO 20101126115850223 415900 300 +SSO 20101126105358115 420300 1000 +SSO 20101126113500384 417200 270 +SSO 20101126102558362 419200 100 +SSO 20101126101831833 418500 200 +SFD 20101126104714736 162200 400 +SSO 20101126121724725 415600 1000 +SSO 20101126102124988 418400 200 +SFD 20101126122903952 162600 100 +SSO 20101126130834670 413700 300 +SSO 20101126114251974 416500 200 +SFD 20101126112717807 162100 100 +SFD 20101126112431061 162100 100 +SSO 20101126114251774 416800 100 +SFD 20101126101625944 161900 600 +SFD 20101126103303956 161500 100 +SSO 20101126143628658 413400 100 +SSO 20101126105914477 419700 200 +SSO 20101126113359895 417125 100 +SSO 20101126130704392 414800 700 +SFD 20101126113150816 162400 200 +SFD 20101126105235896 162237 1000 +SSO 20101126132938512 413800 200 +SSO 20101126114816770 415000 100 +SSO 20101126130944630 414000 200 +SFD 20101126101937938 162400 100 +SSO 20101126131742428 413500 200 +SSO 20101126123310836 414100 100 +SSO 20101126130710750 414800 200 +SSO 20101126141454960 414400 100 +SSO 20101126121658563 416100 359 +SSO 20101126113636841 417200 200 +SSO 20101126114419501 416233 600 +SFD 20101126135717744 165400 100 +SSO 20101126103917895 419791 200 +SSO 20101126104347822 419400 463 +SSO 20101126103937248 419800 100 +SSO 20101126140744205 414400 1000 +SSO 20101126142357600 414100 200 +SSO 20101126122647208 414600 418 +SSO 20101126102200911 418600 200 +SSO 20101126115436273 416000 100 +SSO 20101126123200963 414200 300 +SSO 20101126102631986 419190 1300 +SSO 20101126104617052 419800 100 +SSO 20101126115450869 416400 200 +SSO 20101126103539365 419500 300 +SFD 20101126132132690 164200 100 +SSO 20101126121421263 416700 130 +SSO 20101126125618749 415200 4000 +SSO 20101126121653497 416300 200 +SSO 20101126114504490 415500 100 +SFD 20101126135727068 165500 100 +SSO 20101126141213101 414200 100 +SSO 20101126140057949 415200 100 +SSO 20101126130808096 413800 100 +SFD 20101126101319209 161500 100 +SSO 20101126131820010 413500 145 +SFD 20101126101301707 161400 100 +SSO 20101126135333234 415000 200 +SSO 20101126105517786 419900 100 +SSO 20101126133003223 413800 200 +SFD 20101126101926385 162400 100 +SSO 20101126103538701 419400 200 +SSO 20101126113157575 417300 100 +SSO 20101126141557486 413900 300 +SFD 20101126143008195 165300 100 +SSO 20101126113113207 417900 200 +SSO 20101126103059317 418500 200 +SSO 20101126114457007 415900 300 +SSO 20101126103117340 418500 200 +SFD 20101126134246308 164500 100 +SSO 20101126104250518 419400 100 +SSO 20101126105438200 420200 100 +SSO 20101126113259706 417500 100 +SSO 20101126123039599 414501 200 +SFD 20101126121613015 162700 1985 +SSO 20101126101403752 417600 100 +SFD 20101126141908195 165325 100 +SSO 20101126120305353 416600 200 +SSO 20101126103758873 419600 200 +SSO 20101126103652893 419300 300 +SSO 20101126123605355 414800 200 +SSO 20101126130431639 415600 200 +SSO 20101126134710335 415100 100 +SSO 20101126130710748 414800 700 +SFD 20101126131448313 163500 100 +SFD 20101126140713723 165200 100 +SFD 20101126143632686 165600 100 +SSO 20101126122550204 414900 100 +SSO 20101126113206560 417200 100 +SFD 20101126121002145 162900 100 +SSO 20101126114405423 416200 100 +SSO 20101126114656448 415300 200 +SSO 20101126104603642 419700 100 +SSO 20101126120305345 416601 200 +SSO 20101126101506479 417000 100 +SSO 20101126132042749 413000 100 +SSO 20101126105133053 420200 100 +SSO 20101126101552263 417100 100 +SSO 20101126102048888 418700 530 +SSO 20101126114741057 415000 200 +SSO 20101126112944097 418000 100 +SSO 20101126130806733 413700 200 +SSO 20101126115451195 416293 1000 +SSO 20101126140244013 414900 100 +SSO 20101126130835528 413600 200 +SSO 20101126114950929 415000 100 +SSO 20101126130216514 415100 200 +SSO 20101126131923122 413400 200 +SSO 20101126115026566 415200 100 +SSO 20101126113349693 417400 300 +SSO 20101126113804966 417400 200 +SSO 20101126123248949 414100 200 +SFD 20101126143702995 165500 200 +SSO 20101126141653600 413800 200 +SSO 20101126113405657 417100 238 +SFD 20101126135724178 165500 100 +SFD 20101126141237272 165500 100 +SSO 20101126105736136 419800 100 +SSO 20101126104026261 419600 300 +\. + + + +COPY my_tq_agg_small (ets, sym, bid_price, ask_price, end_ts) FROM stdin; +20101126101359577 SFD 177900 178000 20101126101359578 +20101126101154807 SFD 178100 178200 20101126101154808 +20101126101259868 SFD 177900 178000 20101126101259868 +20101126101228812 SFD 178100 178200 20101126101228817 +20101126101435260 SFD 178000 178100 20101126101435261 +20101126101236779 SFD 178100 178200 20101126101236788 +20101126101426112 SFD 178000 178100 20101126101426428 +20101126101705936 SFD 178000 178100 20101126101705937 +20101126101635495 SFD 178000 178100 20101126101635903 +20101126101957322 SFD 177900 178000 20101126101957411 +20101126101431491 SFD 178000 178100 20101126101431492 +20101126101202012 SFD 178200 178300 20101126101202012 +20101126101500530 SFD 177900 178000 20101126101500531 +20101126101259323 SFD 178000 178200 20101126101259325 +20101126101426429 SFD 178000 178100 20101126101426737 +20101126101202054 SFD 178200 178300 20101126101202055 +20101126102019602 SFD 178000 178100 20101126102019603 +20101126101259331 SFD 177900 178100 20101126101259332 +20101126101236790 SFD 178100 178300 20101126101236795 +20101126101426760 SFD 178000 178100 20101126101426761 +20101126101359923 SFD 178000 178100 20101126101359924 +20101126101202813 SFD 178100 178200 20101126101204340 +20101126101215145 SFD 178100 178300 20101126101215165 +20101126101538699 SFD 177900 178000 20101126101539675 +20101126101755863 SFD 177900 178000 20101126101755919 +20101126101914926 SFD 178100 178200 20101126101914928 +20101126101905317 SFD 178100 178200 20101126101905320 +20101126101638422 SFD 178000 178100 20101126101638423 +20101126101448351 SFD 175700 178000 20101126101448351 +20101126102325055 SFD 178100 178200 20101126102332204 +20101126101426737 SFD 178000 178100 20101126101426738 +20101126101755921 SFD 177900 178000 20101126101758413 +20101126102213275 SFD 178200 178300 20101126102213307 +20101126101545973 SFD 177900 178000 20101126101546090 +20101126101448464 SFD 175700 180500 20101126101448472 +20101126101949080 SFD 178100 178200 20101126101949081 +20101126101552149 SFD 177800 177900 20101126101552150 +20101126101601001 SFD 177800 177900 20101126101601004 +20101126101546095 SFD 177800 178000 20101126101546095 +20101126101948331 SFD 178100 178200 20101126101948333 +20101126101832395 SFD 177900 178000 20101126101832401 +20101126101635135 SFD 177900 180600 20101126101635135 +20101126101742772 SFD 177800 178000 20101126101742937 +20101126101549947 SFD 177800 177900 20101126101549948 +20101126101959699 SFD 177900 178000 20101126101959699 +20101126102312165 SFD 178200 178400 20101126102312188 +20101126103909779 SFD 178100 178200 20101126103910300 +20101126101500555 SFD 178000 178100 20101126101500556 +20101126103851414 SFD 178300 178400 20101126103851418 +20101126102213320 SFD 178200 178300 20101126102213352 +20101126102019622 SFD 178000 178100 20101126102019623 +20101126102056754 SFD 178000 178100 20101126102056756 +20101126102408356 SFD 178100 178200 20101126102410126 +20101126102419097 SFD 178100 178200 20101126102443207 +20101126101504439 SFD 177900 178000 20101126101511443 +20101126104453016 SFD 177900 178000 20101126104453026 +20101126101709150 SFD 178000 178100 20101126101719149 +20101126101850878 SFD 178100 178200 20101126101850883 +20101126101841692 SFD 178000 178200 20101126101841694 +20101126103223066 SFD 178200 178300 20101126103225605 +20101126101753590 SFD 177900 178000 20101126101753591 +20101126101635934 SFD 178000 178100 20101126101635934 +20101126101426761 SFD 178000 178100 20101126101428688 +20101126104109128 SFD 177900 178000 20101126104109128 +20101126101946170 SFD 178100 178200 20101126101946171 +20101126101949084 SFD 178000 178100 20101126101949084 +20101126101841696 SFD 178000 178200 20101126101841697 +20101126102022683 SFD 178000 178100 20101126102022684 +20101126102021473 SFD 178000 178100 20101126102021474 +20101126102757279 SFD 178100 178200 20101126102805438 +20101126101637834 SFD 178000 178100 20101126101638257 +20101126102101375 SFD 178100 180500 20101126102101957 +20101126102316017 SFD 178100 178200 20101126102316019 +20101126102259333 SFD 178100 178300 20101126102259333 +20101126102214054 SFD 178200 178300 20101126102221477 +20101126101916462 SFD 178100 178200 20101126101917275 +20101126101837622 SFD 177900 178000 20101126101837623 +20101126101647128 SFD 178000 178100 20101126101652412 +20101126102056749 SFD 178000 178100 20101126102056754 +20101126102222199 SFD 178200 178400 20101126102222585 +20101126102022680 SFD 177900 178100 20101126102022681 +20101126102632227 SFD 178100 178200 20101126102632228 +20101126101635148 SFD 178000 178100 20101126101635154 +20101126101841697 SFD 178000 178200 20101126101841881 +20101126102144355 SFD 178100 178200 20101126102144397 +20101126102302233 SFD 178100 178200 20101126102302235 +20101126103906342 SFD 178200 178300 20101126103906342 +20101126101908643 SFD 178000 178200 20101126101908647 +20101126102213319 SFD 178200 178300 20101126102213320 +20101126101836826 SFD 177800 178000 20101126101836826 +20101126102310460 SFD 178100 178200 20101126102311747 +20101126102313707 SFD 178100 178200 20101126102315820 +20101126101948328 SFD 178100 178200 20101126101948329 +20101126102158266 SFD 178200 178400 20101126102158267 +20101126102056821 SFD 178100 178200 20101126102056821 +20101126103848576 SFD 178300 178400 20101126103848592 +20101126101854058 SFD 178100 178200 20101126101854661 +20101126102312161 SFD 178200 178300 20101126102312163 +20101126102323020 SFD 178100 178300 20101126102323021 +20101126103652592 SFD 178300 178400 20101126103653911 +20101126102141566 SFD 178100 178200 20101126102143182 +20101126101949082 SFD 178000 178200 20101126101949082 +20101126102019700 SFD 178000 178100 20101126102019709 +20101126104320852 SFD 177900 178000 20101126104322882 +20101126102649297 SFD 178100 178200 20101126102649299 +20101126101955425 SFD 177800 178000 20101126101955426 +20101126102149421 SFD 178100 178200 20101126102149461 +20101126103906345 SFD 178200 178300 20101126103906347 +20101126102151294 SFD 178200 178300 20101126102151305 +20101126105026983 SFD 178200 178300 20101126105026983 +20101126104152601 SFD 177900 178000 20101126104153483 +20101126102144774 SFD 178200 178300 20101126102144814 +20101126102019624 SFD 178000 178100 20101126102019697 +20101126103928019 SFD 178100 178200 20101126103928019 +20101126103953755 SFD 178100 178200 20101126103953778 +20101126102019601 SFD 178000 180500 20101126102019601 +20101126103022673 SFD 178200 178300 20101126103023335 +20101126102144398 SFD 178100 178200 20101126102144402 +20101126103517588 SFD 178300 178400 20101126103517589 +20101126101948329 SFD 178100 178200 20101126101948330 +20101126102340171 SFD 178100 178200 20101126102340263 +20101126102149420 SFD 178100 178200 20101126102149421 +20101126103906326 SFD 178300 178400 20101126103906326 +20101126102407580 SFD 178100 178200 20101126102407582 +20101126102818591 SFD 178100 178200 20101126102818593 +20101126104841506 SFD 178100 178200 20101126104843034 +20101126103456800 SFD 178300 178400 20101126103456802 +20101126102259433 SFD 178100 178200 20101126102300313 +20101126104101041 SFD 178000 178100 20101126104101041 +20101126103908451 SFD 178100 178200 20101126103908453 +20101126104458019 SFD 177900 178000 20101126104458021 +20101126102926234 SFD 178100 178200 20101126102926235 +20101126103906352 SFD 178200 178300 20101126103906355 +20101126103747593 SFD 178300 178400 20101126103756234 +20101126102021886 SFD 177900 178000 20101126102021886 +20101126103855975 SFD 178300 178400 20101126103856578 +20101126103016222 SFD 178100 178300 20101126103016540 +20101126105027626 SFD 178300 178400 20101126105027943 +20101126105215369 SFD 178400 178500 20101126105215469 +20101126103908435 SFD 176000 178300 20101126103908436 +20101126102618402 SFD 178100 178200 20101126102622492 +20101126104919037 SFD 178200 178300 20101126104920056 +20101126104743128 SFD 177900 178000 20101126104743221 +20101126103157426 SFD 178200 178300 20101126103157427 +20101126103621025 SFD 178300 178400 20101126103621027 +20101126103246117 SFD 178200 178400 20101126103246118 +20101126103432608 SFD 178300 178400 20101126103432608 +20101126102019603 SFD 174800 178100 20101126102019603 +20101126103800414 SFD 178300 178400 20101126103800414 +20101126102056820 SFD 178100 178200 20101126102056821 +20101126104103455 SFD 178000 179400 20101126104103455 +20101126102233015 SFD 178200 178300 20101126102246655 +20101126104810369 SFD 177900 178000 20101126104810384 +20101126102904908 SFD 178100 178200 20101126102905010 +20101126104740370 SFD 177900 178000 20101126104740372 +20101126104756824 SFD 177800 178000 20101126104758028 +20101126103345692 SFD 178300 178400 20101126103345693 +20101126104238210 SFD 177900 178000 20101126104238331 +20101126103632593 SFD 178300 178400 20101126103637592 +20101126104104052 SFD 178000 178100 20101126104104143 +20101126104304660 SFD 177900 178000 20101126104304673 +20101126104559030 SFD 177900 178000 20101126104559032 +20101126102113499 SFD 174800 178200 20101126102118693 +20101126104801217 SFD 177900 178000 20101126104801218 +20101126102540241 SFD 178100 178200 20101126102541299 +20101126104823748 SFD 177900 178100 20101126104823748 +20101126103024536 SFD 178200 178300 20101126103024537 +20101126105730213 SFD 178400 178500 20101126105730831 +20101126102324700 SFD 175700 178400 20101126102324702 +20101126103906333 SFD 178200 178300 20101126103906333 +20101126105115477 SFD 178300 178500 20101126105115477 +20101126105213553 SFD 178400 178500 20101126105215369 +20101126104717012 SFD 177900 178000 20101126104722707 +20101126104723304 SFD 177900 178000 20101126104725011 +20101126104250905 SFD 177900 178000 20101126104252602 +20101126104729462 SFD 177900 178000 20101126104729466 +20101126105402638 SFD 178300 178500 20101126105402639 +20101126104941117 SFD 178200 178300 20101126104941152 +20101126103456834 SFD 178300 178400 20101126103457211 +20101126102807097 SFD 178100 178200 20101126102807098 +20101126103603039 SFD 178300 178400 20101126103607590 +20101126104530542 SFD 177900 178000 20101126104537612 +20101126104314707 SFD 177900 178000 20101126104315249 +20101126104101108 SFD 178000 178100 20101126104101109 +20101126103914901 SFD 178100 178200 20101126103914901 +20101126103540436 SFD 178300 178400 20101126103541377 +20101126110208158 SFD 178400 178500 20101126110209446 +20101126104822050 SFD 177900 178000 20101126104823734 +20101126105115842 SFD 178300 178400 20101126105116016 +20101126103325423 SFD 178300 178400 20101126103325429 +20101126105113178 SFD 178400 178500 20101126105113178 +20101126104748289 SFD 177900 178000 20101126104748292 +20101126103953779 SFD 178100 178200 20101126103953948 +20101126103325431 SFD 178300 178400 20101126103326153 +20101126105027004 SFD 178200 178400 20101126105027018 +20101126105026995 SFD 178200 178400 20101126105026995 +20101126104103547 SFD 177900 178100 20101126104104052 +20101126103959337 SFD 178100 178200 20101126104001968 +20101126105315389 SFD 178400 178500 20101126105315391 +20101126105222530 SFD 178300 178500 20101126105222558 +20101126104828385 SFD 178100 178200 20101126104828386 +20101126103953949 SFD 178100 178200 20101126103953998 +20101126104807627 SFD 177900 178000 20101126104808029 +20101126105237260 SFD 178300 178500 20101126105238086 +20101126105118025 SFD 178300 178400 20101126105119022 +20101126105008160 SFD 178300 178400 20101126105008171 +20101126104103298 SFD 178000 178100 20101126104103298 +20101126104829023 SFD 178100 178200 20101126104829024 +20101126104828970 SFD 178100 178200 20101126104829023 +20101126104616086 SFD 177900 178000 20101126104616088 +20101126105326972 SFD 178400 178500 20101126105326972 +20101126105707953 SFD 178400 178600 20101126105707955 +20101126103132177 SFD 178200 178300 20101126103138511 +20101126104940369 SFD 178200 178300 20101126104940372 +20101126104109131 SFD 177900 178000 20101126104109133 +20101126105714631 SFD 178400 178500 20101126105714631 +20101126104314707 SFD 177900 178000 20101126104314707 +20101126103801069 SFD 178300 178400 20101126103801071 +20101126105031417 SFD 178300 178400 20101126105032648 +20101126103801069 SFD 178300 178400 20101126103801069 +20101126104804136 SFD 177900 178000 20101126104807626 +20101126111027058 SFD 178700 178800 20101126111027059 +20101126103312815 SFD 178200 178300 20101126103323505 +20101126103042635 SFD 178200 178300 20101126103042637 +20101126105027173 SFD 178200 178300 20101126105027173 +20101126104110881 SFD 177900 178000 20101126104113785 +20101126104631784 SFD 177900 178000 20101126104633983 +20101126104248215 SFD 177900 178000 20101126104248219 +20101126104743221 SFD 177900 178000 20101126104744021 +20101126104904515 SFD 178100 178300 20101126104906134 +20101126103815083 SFD 178300 178400 20101126103828959 +20101126105814618 SFD 178500 178600 20101126105814618 +20101126105259519 SFD 178300 178500 20101126105259527 +20101126104101040 SFD 178000 178200 20101126104101041 +20101126104802258 SFD 177900 178000 20101126104804007 +20101126104729466 SFD 177900 178000 20101126104729468 +20101126104906138 SFD 178200 178300 20101126104906138 +20101126103344231 SFD 178300 178500 20101126103344232 +20101126105930419 SFD 178300 178400 20101126105930423 +20101126105930003 SFD 178300 178500 20101126105930004 +20101126110258899 SFD 178400 178600 20101126110258900 +20101126105835672 SFD 178400 178600 20101126105835673 +20101126105401622 SFD 178300 178500 20101126105401777 +20101126105335672 SFD 178400 178500 20101126105342640 +20101126104101041 SFD 178000 178200 20101126104101041 +20101126105653036 SFD 178400 178600 20101126105653040 +20101126110856685 SFD 178600 178700 20101126110856687 +20101126105517727 SFD 178400 178500 20101126105520673 +20101126105502527 SFD 178400 178500 20101126105502872 +20101126105556712 SFD 178400 178500 20101126105600234 +20101126104828154 SFD 178100 178200 20101126104828173 +20101126105900741 SFD 178200 178500 20101126105900742 +20101126104109127 SFD 175500 178100 20101126104109127 +20101126104101042 SFD 178000 178100 20101126104101043 +20101126105734971 SFD 178400 178500 20101126105736165 +20101126105008937 SFD 178200 178400 20101126105009035 +20101126105114174 SFD 178400 178500 20101126105114327 +20101126105129842 SFD 178300 178500 20101126105129843 +20101126110804788 SFD 178500 178600 20101126110805047 +20101126105714657 SFD 178400 178500 20101126105714817 +20101126104003713 SFD 178100 178200 20101126104012602 +20101126104330096 SFD 177900 178000 20101126104330097 +20101126105627905 SFD 178400 178500 20101126105627976 +20101126105926055 SFD 178200 178400 20101126105926055 +20101126105730108 SFD 178400 178500 20101126105730111 +20101126105642565 SFD 178400 178500 20101126105642566 +20101126103906328 SFD 178300 178400 20101126103906328 +20101126111149010 SFD 178400 178600 20101126111149015 +20101126103848593 SFD 178300 178400 20101126103851414 +20101126110824150 SFD 178500 178700 20101126110828529 +20101126105938043 SFD 178400 178500 20101126105938043 +20101126105535275 SFD 178400 178500 20101126105535922 +20101126105113178 SFD 178400 178500 20101126105113824 +20101126104933016 SFD 178200 178300 20101126104933017 +20101126110435748 SFD 178500 178600 20101126110435749 +20101126110130278 SFD 178400 178500 20101126110130544 +20101126105938039 SFD 178300 178500 20101126105938041 +20101126111542694 SFD 178700 178900 20101126111542695 +20101126105836033 SFD 178400 178600 20101126105836035 +20101126105508437 SFD 178400 178500 20101126105508538 +20101126110507104 SFD 178600 178700 20101126110508808 +20101126105129930 SFD 178100 178800 20101126105129933 +20101126110313852 SFD 178500 178600 20101126110313870 +20101126105401946 SFD 178400 178500 20101126105402044 +20101126104748288 SFD 177900 178000 20101126104748289 +20101126110438464 SFD 178500 178700 20101126110438468 +20101126110438597 SFD 178500 178600 20101126110438605 +20101126110333268 SFD 178500 178600 20101126110341212 +20101126110010369 SFD 178400 178500 20101126110010369 +20101126105625765 SFD 178400 178500 20101126105625766 +20101126105133142 SFD 178400 178500 20101126105134288 +20101126110438936 SFD 178500 178600 20101126110439107 +20101126110258895 SFD 178500 178600 20101126110258896 +20101126104906141 SFD 178200 178300 20101126104906141 +20101126104620639 SFD 177900 178000 20101126104631784 +20101126105113028 SFD 178400 178500 20101126105113033 +20101126104906295 SFD 178200 178300 20101126104906889 +20101126110839987 SFD 178700 178800 20101126110839988 +20101126111141851 SFD 178500 178600 20101126111141859 +20101126105026975 SFD 178300 178400 20101126105026977 +20101126105948683 SFD 178400 178500 20101126105950077 +20101126110840017 SFD 178600 178700 20101126110840017 +20101126111044018 SFD 178700 178800 20101126111044018 +20101126105555496 SFD 178400 178500 20101126105556391 +20101126105627977 SFD 178400 178500 20101126105628037 +20101126105926057 SFD 178200 178300 20101126105926057 +20101126110919022 SFD 178700 178800 20101126110919027 +20101126110551933 SFD 178500 178600 20101126110551934 +20101126104823743 SFD 177900 178000 20101126104823745 +20101126111620678 SFD 178700 178800 20101126111632448 +20101126110446628 SFD 178600 178700 20101126110446629 +20101126104442609 SFD 177900 178000 20101126104447612 +20101126110443946 SFD 178600 178700 20101126110443947 +20101126110811479 SFD 178500 178600 20101126110813230 +20101126105814398 SFD 178400 178600 20101126105814398 +20101126104823772 SFD 177900 178000 20101126104823772 +20101126105653041 SFD 178500 178600 20101126105653134 +20101126105926210 SFD 178300 178400 20101126105926210 +20101126111130254 SFD 178500 178600 20101126111130255 +20101126111416768 SFD 178500 178600 20101126111418022 +20101126110837981 SFD 178700 178800 20101126110837982 +20101126112219995 SFD 178600 178700 20101126112247695 +20101126105936009 SFD 178300 178500 20101126105936061 +20101126110612340 SFD 178500 178600 20101126110612340 +20101126110551934 SFD 178500 178600 20101126110553773 +20101126104922033 SFD 178200 178300 20101126104923028 +20101126111004129 SFD 178700 178800 20101126111004181 +20101126111458159 SFD 178700 178800 20101126111458159 +20101126105702226 SFD 178500 178700 20101126105702302 +20101126110839991 SFD 178700 178800 20101126110840002 +20101126105315391 SFD 178400 178500 20101126105315392 +20101126111833156 SFD 178700 178800 20101126111840150 +20101126110852591 SFD 178600 178700 20101126110852592 +20101126110549319 SFD 178500 178700 20101126110549370 +20101126111203517 SFD 178400 178500 20101126111203520 +20101126111910131 SFD 178800 179000 20101126111910132 +20101126110001922 SFD 178400 178500 20101126110002211 +20101126105942413 SFD 178400 178500 20101126105948683 +20101126111948621 SFD 178700 178900 20101126111948710 +20101126110917216 SFD 178700 178800 20101126110917218 +20101126104617617 SFD 177900 178000 20101126104620327 +20101126110549253 SFD 178500 178700 20101126110549253 +20101126111128053 SFD 178600 178700 20101126111128139 +20101126111548412 SFD 178700 178800 20101126111548412 +20101126113101442 SFD 178700 178800 20101126113101778 +20101126111937691 SFD 178900 179000 20101126111937692 +20101126111044018 SFD 178700 178800 20101126111044316 +20101126111501644 SFD 178600 178800 20101126111502472 +20101126111430371 SFD 178600 178700 20101126111430380 +20101126111458669 SFD 178700 178800 20101126111458669 +20101126112450744 SFD 178600 178800 20101126112450754 +20101126111948620 SFD 178700 178800 20101126111948620 +20101126105109024 SFD 178300 178400 20101126105110294 +20101126111156102 SFD 178500 178600 20101126111156351 +20101126111910397 SFD 178800 178900 20101126111910398 +20101126110600791 SFD 178500 178600 20101126110601433 +20101126112545783 SFD 178700 178800 20101126112546536 +20101126111137343 SFD 178400 178500 20101126111138812 +20101126111458672 SFD 178700 178800 20101126111458672 +20101126110549238 SFD 178600 178700 20101126110549239 +20101126110505672 SFD 178600 178700 20101126110505673 +20101126112004005 SFD 178600 178700 20101126112004531 +20101126110310728 SFD 178500 178600 20101126110313126 +20101126110549309 SFD 178500 178600 20101126110549310 +20101126111149033 SFD 178400 178500 20101126111150079 +20101126110917210 SFD 178700 178800 20101126110917212 +20101126105731168 SFD 178400 180900 20101126105732641 +20101126111056641 SFD 178700 178800 20101126111103698 +20101126111141859 SFD 178500 178600 20101126111141860 +20101126113002726 SFD 178600 178700 20101126113012778 +20101126111524368 SFD 178700 178800 20101126111524369 +20101126105707957 SFD 178400 178600 20101126105714629 +20101126111606266 SFD 178700 178800 20101126111606268 +20101126105326971 SFD 178300 178500 20101126105326972 +20101126105501607 SFD 178400 178500 20101126105502527 +20101126111124242 SFD 178600 178700 20101126111124243 +20101126111502472 SFD 178700 178800 20101126111502473 +20101126111709595 SFD 178700 178800 20101126111715833 +20101126111458549 SFD 178600 178700 20101126111458665 +20101126111124256 SFD 178600 178800 20101126111124274 +20101126111430018 SFD 178500 178700 20101126111430047 +20101126105220803 SFD 178300 178400 20101126105222374 +20101126110916661 SFD 178700 178800 20101126110916662 +20101126112252751 SFD 178700 178900 20101126112252872 +20101126111741443 SFD 178700 178800 20101126111744763 +20101126111130255 SFD 178500 178600 20101126111130256 +20101126110410730 SFD 178500 178600 20101126110410731 +20101126111352044 SFD 178400 178500 20101126111352045 +20101126110840866 SFD 178600 178700 20101126110840867 +20101126110559904 SFD 178500 178600 20101126110559905 +20101126111937658 SFD 178900 179000 20101126111937662 +20101126111957273 SFD 178600 178800 20101126111957617 +20101126111430048 SFD 178600 178700 20101126111430048 +20101126112358526 SFD 178700 178800 20101126112358526 +20101126111947255 SFD 178700 178900 20101126111947256 +20101126110601439 SFD 178400 178600 20101126110601440 +20101126110549252 SFD 178500 178700 20101126110549253 +20101126111450674 SFD 178600 178700 20101126111451847 +20101126113108287 SFD 178700 178800 20101126113108541 +20101126112038139 SFD 178600 178700 20101126112042698 +20101126111709229 SFD 178600 178800 20101126111709230 +20101126111910338 SFD 178900 179000 20101126111910339 +20101126105033082 SFD 178300 178400 20101126105033172 +20101126111416736 SFD 178400 178600 20101126111416736 +20101126105402638 SFD 178300 178500 20101126105402638 +20101126112248558 SFD 178600 178700 20101126112248559 +20101126111130258 SFD 178500 178600 20101126111130261 +20101126112656243 SFD 178700 178800 20101126112656593 +20101126105415672 SFD 178400 178500 20101126105418028 +20101126105836539 SFD 178300 178400 20101126105836599 +20101126111735138 SFD 178700 178800 20101126111735293 +20101126110843623 SFD 178600 178700 20101126110843623 +20101126111521039 SFD 178600 178900 20101126111521039 +20101126110836944 SFD 178600 178800 20101126110837297 +20101126110151094 SFD 178400 178600 20101126110155013 +20101126111947698 SFD 178700 178900 20101126111948611 +20101126113750048 SFD 178200 178300 20101126113750740 +20101126111458163 SFD 178600 178700 20101126111458163 +20101126111130071 SFD 178500 178600 20101126111130077 +20101126113019076 SFD 178700 178800 20101126113019077 +20101126112446849 SFD 178700 178800 20101126112447165 +20101126111957255 SFD 178700 178800 20101126111957256 +20101126110843622 SFD 178600 178700 20101126110843622 +20101126111524061 SFD 178700 178800 20101126111524062 +20101126105736938 SFD 178400 178500 20101126105737632 +20101126111453033 SFD 178600 178700 20101126111453033 +20101126110612339 SFD 178400 178600 20101126110612339 +20101126110919047 SFD 178700 178800 20101126110919320 +20101126110438493 SFD 178600 178700 20101126110438500 +20101126111430370 SFD 178600 178700 20101126111430371 +20101126105814767 SFD 178500 178600 20101126105814777 +20101126111458669 SFD 178700 178800 20101126111458670 +20101126112441562 SFD 178700 178800 20101126112441875 +20101126110508808 SFD 178600 178700 20101126110508809 +20101126111156360 SFD 178400 178600 20101126111156361 +20101126111149004 SFD 178400 178600 20101126111149005 +20101126111124231 SFD 178700 178800 20101126111124231 +20101126111957271 SFD 178600 178700 20101126111957272 +20101126111709594 SFD 178700 178800 20101126111709595 +20101126110830441 SFD 178600 178700 20101126110830450 +20101126114118603 SFD 178200 178300 20101126114118603 +20101126110252758 SFD 178400 178500 20101126110255855 +20101126105926054 SFD 178200 178400 20101126105926055 +20101126112754326 SFD 178600 178700 20101126112754328 +20101126112723684 SFD 178600 178700 20101126112724304 +20101126112417030 SFD 178700 178800 20101126112418060 +20101126111458184 SFD 178600 178700 20101126111458192 +20101126111548433 SFD 178700 178800 20101126111548508 +20101126112342401 SFD 178600 178700 20101126112350446 +20101126112400446 SFD 178700 178800 20101126112402713 +20101126111143239 SFD 178400 178600 20101126111149002 +20101126111430244 SFD 178600 178700 20101126111430247 +20101126110129944 SFD 178400 178500 20101126110130278 +20101126112502155 SFD 178700 178800 20101126112502710 +20101126112154895 SFD 178600 178700 20101126112156204 +20101126113237745 SFD 178600 178700 20101126113237936 +20101126112557790 SFD 178700 178800 20101126112558096 +20101126111520680 SFD 178700 178800 20101126111521026 +20101126113713024 SFD 178300 178400 20101126113713024 +20101126113606375 SFD 178400 178500 20101126113608423 +20101126111700224 SFD 178700 178900 20101126111700225 +20101126112448998 SFD 178600 178800 20101126112449286 +20101126105950660 SFD 178400 178500 20101126105950950 +20101126113433581 SFD 178400 178500 20101126113433583 +20101126112716573 SFD 178600 178700 20101126112718231 +20101126112653378 SFD 178700 178800 20101126112654448 +20101126111633464 SFD 178700 178800 20101126111633466 +20101126111937667 SFD 178900 179000 20101126111937669 +20101126111910371 SFD 178900 179000 20101126111910371 +20101126113704881 SFD 178400 178500 20101126113705059 +20101126113711396 SFD 178400 178500 20101126113712927 +20101126111736101 SFD 178700 178800 20101126111736115 +20101126110840167 SFD 178600 178700 20101126110840168 +20101126112136521 SFD 178600 178700 20101126112136558 +20101126111909920 SFD 178700 178900 20101126111909920 +20101126113238029 SFD 178500 178700 20101126113238030 +20101126111910181 SFD 178900 179000 20101126111910191 +20101126111910154 SFD 178900 179000 20101126111910162 +20101126111130256 SFD 178500 178600 20101126111130258 +20101126112658791 SFD 178700 178900 20101126112658791 +20101126111910397 SFD 178800 178900 20101126111910397 +20101126111542688 SFD 178700 178800 20101126111542689 +20101126112714882 SFD 178700 178800 20101126112714882 +20101126110830324 SFD 178500 178700 20101126110830433 +20101126111654903 SFD 178700 178800 20101126111654905 +20101126113952715 SFD 178300 178400 20101126113952724 +20101126110258891 SFD 178400 178600 20101126110258895 +20101126120325343 SFD 178600 178700 20101126120325468 +20101126111156091 SFD 178400 178500 20101126111156093 +20101126113243422 SFD 178400 178500 20101126113243422 +20101126110940140 SFD 178700 178800 20101126110940281 +20101126113146163 SFD 178600 178700 20101126113146163 +20101126111933122 SFD 178900 179000 20101126111933123 +20101126113326772 SFD 178400 178500 20101126113326774 +20101126111927490 SFD 178900 179000 20101126111927491 +20101126111937695 SFD 178800 178900 20101126111937695 +20101126112027015 SFD 178600 179000 20101126112027701 +20101126111632463 SFD 178700 178800 20101126111632464 +20101126113237732 SFD 178600 178700 20101126113237732 +20101126112400369 SFD 178700 178800 20101126112400370 +20101126111910371 SFD 178900 179000 20101126111910371 +20101126111926993 SFD 178900 179000 20101126111926994 +20101126112723050 SFD 178600 178700 20101126112723377 +20101126113109681 SFD 178700 178800 20101126113109681 +20101126111937676 SFD 178900 179000 20101126111937678 +20101126114959905 SFD 178600 178800 20101126115000877 +20101126112754986 SFD 178600 178700 20101126112755635 +20101126113238033 SFD 178300 178700 20101126113238033 +20101126112638503 SFD 178700 178800 20101126112640595 +20101126113952755 SFD 178200 178400 20101126113952756 +20101126112658750 SFD 178700 178800 20101126112658754 +20101126112353016 SFD 178600 178700 20101126112353027 +20101126113520772 SFD 178400 178500 20101126113522006 +20101126114605682 SFD 178300 178400 20101126114605682 +20101126110440673 SFD 178500 178700 20101126110443867 +20101126113822358 SFD 178200 178300 20101126113822746 +20101126110313960 SFD 178500 178600 20101126110314206 +20101126113109717 SFD 178600 178800 20101126113109719 +20101126114653830 SFD 178300 178400 20101126114653836 +20101126114021115 SFD 178200 178300 20101126114021146 +20101126111521396 SFD 178800 178900 20101126111522472 +20101126114706821 SFD 178400 178500 20101126114711418 +20101126112301744 SFD 178600 178800 20101126112301744 +20101126112447165 SFD 178600 178800 20101126112447186 +20101126111718828 SFD 178700 178800 20101126111718829 +20101126114705304 SFD 178400 178500 20101126114706820 +20101126111154410 SFD 178400 178500 20101126111154410 +20101126114118606 SFD 178200 178400 20101126114118834 +20101126111018558 SFD 178700 178800 20101126111018559 +20101126113605237 SFD 178400 178500 20101126113605273 +20101126113238030 SFD 178500 178600 20101126113238030 +20101126113608423 SFD 178400 178500 20101126113608680 +20101126110917147 SFD 178700 178800 20101126110917210 +20101126112938372 SFD 178600 178700 20101126112938373 +20101126113237405 SFD 178600 178700 20101126113237406 +20101126115250661 SFD 178800 178900 20101126115250664 +20101126114123221 SFD 178300 178400 20101126114123223 +20101126114147760 SFD 178300 178400 20101126114149150 +20101126115810465 SFD 178800 178900 20101126115810466 +20101126113646209 SFD 178400 178500 20101126113646435 +20101126110836943 SFD 178700 178800 20101126110836943 +20101126114825024 SFD 178400 178500 20101126114825026 +20101126111150079 SFD 178400 178600 20101126111150080 +20101126114021184 SFD 178200 178300 20101126114021299 +20101126113715672 SFD 178300 178900 20101126113716037 +20101126112714742 SFD 178800 178900 20101126112714754 +20101126114355409 SFD 178200 178300 20101126114355409 +20101126120148731 SFD 178700 178800 20101126120148732 +20101126113722855 SFD 178200 178400 20101126113722946 +20101126115722873 SFD 178800 178900 20101126115722876 +20101126113146160 SFD 178600 178700 20101126113146160 +20101126112351593 SFD 178600 178700 20101126112351594 +20101126111948611 SFD 178700 178800 20101126111948620 +20101126114825371 SFD 178400 178500 20101126114825371 +20101126111912682 SFD 178800 178900 20101126111913885 +20101126115114022 SFD 178700 178900 20101126115114023 +20101126112654714 SFD 178700 178800 20101126112655756 +20101126113952755 SFD 178200 178300 20101126113952755 +20101126114513195 SFD 178300 178400 20101126114515369 +20101126114834242 SFD 178400 178500 20101126114834243 +20101126111957270 SFD 178600 178700 20101126111957270 +20101126113034203 SFD 178700 178800 20101126113034204 +20101126112420498 SFD 178600 178800 20101126112420498 +20101126113328724 SFD 178400 178500 20101126113328725 +20101126114019129 SFD 178200 178600 20101126114019480 +20101126113019096 SFD 178700 178800 20101126113019096 +20101126112653023 SFD 178700 178800 20101126112653023 +20101126114328043 SFD 178200 178400 20101126114328043 +20101126113324486 SFD 178300 178500 20101126113326025 +20101126112630814 SFD 178700 178800 20101126112632712 +20101126113530822 SFD 178400 178500 20101126113531004 +20101126112730247 SFD 178600 178700 20101126112730537 +20101126112656593 SFD 178700 178800 20101126112656859 +20101126114042360 SFD 178200 178300 20101126114042369 +20101126112659551 SFD 178800 178900 20101126112700124 +20101126114327270 SFD 178300 178400 20101126114327271 +20101126112715647 SFD 178600 178700 20101126112715714 +20101126120148497 SFD 178800 178900 20101126120148497 +20101126112827727 SFD 178600 178700 20101126112839005 +20101126113509682 SFD 178400 178500 20101126113509694 +20101126113127285 SFD 178600 178700 20101126113127587 +20101126120109696 SFD 178800 178900 20101126120115637 +20101126111524209 SFD 178700 178800 20101126111524368 +20101126112715716 SFD 178600 178700 20101126112715720 +20101126110916727 SFD 178700 178800 20101126110916796 +20101126113952065 SFD 178300 178400 20101126113952066 +20101126112026744 SFD 178600 178800 20101126112026745 +20101126122442148 SFD 178900 179000 20101126122442150 +20101126113111126 SFD 178600 178700 20101126113113172 +20101126121210135 SFD 178900 179000 20101126121217226 +20101126112754269 SFD 178600 178700 20101126112754292 +20101126115250348 SFD 178800 179000 20101126115250349 +20101126112351901 SFD 178600 178700 20101126112351902 +20101126120145621 SFD 178800 178900 20101126120145622 +20101126112157029 SFD 178600 178700 20101126112157700 +20101126115130213 SFD 178700 178800 20101126115130935 +20101126112658794 SFD 178800 178900 20101126112658795 +20101126115059130 SFD 178700 178800 20101126115059887 +20101126113247304 SFD 178400 178500 20101126113247306 +20101126114117253 SFD 178200 178300 20101126114117749 +20101126114529085 SFD 178300 178500 20101126114529087 +20101126114605694 SFD 178400 178500 20101126114605695 +20101126112749976 SFD 178600 178700 20101126112750405 +20101126113840899 SFD 178200 178300 20101126113840999 +20101126114028401 SFD 178200 178300 20101126114035074 +20101126113724033 SFD 178200 178300 20101126113724034 +20101126115805160 SFD 178800 179000 20101126115805161 +20101126120615758 SFD 178900 179100 20101126120615759 +20101126112353030 SFD 178600 178700 20101126112353036 +20101126115607018 SFD 178800 178900 20101126115610672 +20101126112038134 SFD 178600 178700 20101126112038135 +20101126120325468 SFD 178600 178700 20101126120325469 +20101126121617822 SFD 178900 179000 20101126121617823 +20101126120428472 SFD 178600 178700 20101126120428523 +20101126113041314 SFD 178700 178800 20101126113041315 +20101126113624139 SFD 178400 178500 20101126113624140 +20101126113127588 SFD 178600 178700 20101126113131253 +20101126114320369 SFD 178200 178400 20101126114320369 +20101126121745939 SFD 178900 179000 20101126121745940 +20101126122123328 SFD 178900 179000 20101126122123330 +20101126112653023 SFD 178700 178800 20101126112653023 +20101126120147814 SFD 178800 178900 20101126120148214 +20101126120148726 SFD 178700 178800 20101126120148726 +20101126114118847 SFD 178200 178400 20101126114118859 +20101126114633984 SFD 178400 178500 20101126114633987 +20101126113328726 SFD 178400 178500 20101126113328727 +20101126112714820 SFD 178600 178800 20101126112714833 +20101126115004148 SFD 178600 178700 20101126115004866 +20101126114605675 SFD 178400 178500 20101126114605675 +20101126120512803 SFD 178800 178900 20101126120512804 +20101126114503588 SFD 178200 178300 20101126114503778 +20101126113903036 SFD 178200 178300 20101126113912745 +20101126115901473 SFD 178900 179000 20101126115942947 +20101126111947256 SFD 178700 178900 20101126111947698 +20101126113921031 SFD 178200 178300 20101126113928024 +20101126113349293 SFD 178400 178500 20101126113349294 +20101126113101147 SFD 178700 178800 20101126113101442 +20101126114641991 SFD 178300 178400 20101126114641993 +20101126114147751 SFD 178300 178400 20101126114147760 +20101126121826389 SFD 178900 179000 20101126121827618 +20101126122349100 SFD 178900 179000 20101126122352834 +20101126124217839 SFD 178700 178800 20101126124217927 +20101126115716373 SFD 178800 179000 20101126115719386 +20101126120105604 SFD 178800 178900 20101126120105606 +20101126120612036 SFD 178900 179000 20101126120612036 +20101126120509751 SFD 178800 178900 20101126120510095 +20101126120318028 SFD 178600 178700 20101126120318029 +20101126122751918 SFD 178900 179000 20101126122752850 +20101126114153417 SFD 178300 178400 20101126114154229 +20101126120950655 SFD 178900 179000 20101126120957000 +20101126112720482 SFD 178600 178700 20101126112720507 +20101126120248556 SFD 178600 178700 20101126120248694 +20101126120612036 SFD 178900 179000 20101126120612039 +20101126114316906 SFD 178300 178400 20101126114317014 +20101126113109676 SFD 178700 178800 20101126113109676 +20101126114201328 SFD 178300 178400 20101126114201328 +20101126113912745 SFD 178200 178300 20101126113913252 +20101126113857767 SFD 178200 178300 20101126113857768 +20101126112759198 SFD 178600 178700 20101126112759464 +20101126120105576 SFD 178800 179000 20101126120105576 +20101126113724034 SFD 178200 178300 20101126113724034 +20101126120508811 SFD 178800 178900 20101126120509149 +20101126115723653 SFD 178800 178900 20101126115726368 +20101126122953015 SFD 178900 179000 20101126122953019 +20101126114825029 SFD 178400 178500 20101126114825029 +20101126113902745 SFD 178200 178300 20101126113903036 +20101126115331973 SFD 178800 178900 20101126115333415 +20101126120148288 SFD 178800 178900 20101126120148300 +20101126114125384 SFD 177900 178400 20101126114125390 +20101126120300625 SFD 178600 178700 20101126120300626 +20101126120944175 SFD 178900 179000 20101126120944176 +20101126113147994 SFD 178600 178700 20101126113147996 +20101126113317989 SFD 178400 178500 20101126113317989 +20101126122953015 SFD 178900 179000 20101126122953015 +20101126112658176 SFD 178700 178800 20101126112658749 +20101126121205466 SFD 178900 179000 20101126121210129 +20101126113619949 SFD 178400 178500 20101126113620511 +20101126113238033 SFD 178500 178600 20101126113238033 +20101126114959143 SFD 178500 178700 20101126114959144 +20101126123020873 SFD 178900 179000 20101126123027856 +20101126120055962 SFD 178900 179000 20101126120056315 +20101126115346109 SFD 178800 178900 20101126115346574 +20101126114328044 SFD 178200 178400 20101126114328044 +20101126114209133 SFD 178300 178400 20101126114209133 +20101126112707718 SFD 178800 178900 20101126112709149 +20101126120433893 SFD 178700 178800 20101126120434092 +20101126120118044 SFD 178800 178900 20101126120118045 +20101126120613105 SFD 178900 179100 20101126120613106 +20101126123731782 SFD 178900 179000 20101126123742878 +20101126123456204 SFD 178900 179000 20101126123502871 +20101126115810622 SFD 178900 179000 20101126115810625 +20101126121217226 SFD 178900 179000 20101126121222267 +20101126114955183 SFD 178500 178700 20101126114955201 +20101126114643667 SFD 178300 178400 20101126114643670 +20101126115428103 SFD 178800 178900 20101126115433226 +20101126122859587 SFD 178900 179000 20101126122859591 +20101126120612044 SFD 178900 179000 20101126120612098 +20101126124630204 SFD 178300 178400 20101126124634351 +20101126120931836 SFD 178900 179000 20101126120931841 +20101126124353588 SFD 178400 178500 20101126124354080 +20101126120428626 SFD 178700 178800 20101126120428714 +20101126120932255 SFD 178900 179000 20101126120937855 +20101126114825234 SFD 178500 178600 20101126114825235 +20101126120248269 SFD 178700 178800 20101126120248317 +20101126122735764 SFD 178900 179000 20101126122735765 +20101126120314152 SFD 178600 178700 20101126120314157 +20101126114830520 SFD 178400 178600 20101126114831915 +20101126121752112 SFD 178900 179000 20101126121759464 +20101126114851256 SFD 178500 178600 20101126114851264 +20101126120253152 SFD 178600 178700 20101126120253155 +20101126120428523 SFD 178700 178800 20101126120428524 +20101126121032415 SFD 178900 179000 20101126121032417 +20101126115036129 SFD 178600 178800 20101126115036130 +20101126120121203 SFD 178800 178900 20101126120122837 +20101126115719386 SFD 178800 179000 20101126115719388 +20101126120931757 SFD 178900 179000 20101126120931757 +20101126120148732 SFD 178700 178800 20101126120148732 +20101126120957000 SFD 178900 179000 20101126120957003 +20101126121439976 SFD 178900 179000 20101126121440885 +20101126120510196 SFD 178800 178900 20101126120510448 +20101126124157767 SFD 178800 178900 20101126124157770 +20101126114201328 SFD 178300 178400 20101126114201614 +20101126122217831 SFD 178900 179000 20101126122225295 +20101126121449137 SFD 178900 179000 20101126121449141 +20101126114959149 SFD 178600 178700 20101126114959149 +20101126120544780 SFD 178800 178900 20101126120544888 +20101126120325077 SFD 178600 178700 20101126120325078 +20101126124228176 SFD 178600 178700 20101126124228176 +20101126114653908 SFD 178400 178500 20101126114653908 +20101126120601013 SFD 178800 178900 20101126120601036 +20101126114711418 SFD 178400 178500 20101126114713830 +20101126115716038 SFD 178800 179000 20101126115716332 +20101126115222770 SFD 178700 178800 20101126115222771 +20101126120325078 SFD 178600 178700 20101126120325102 +20101126120751537 SFD 178900 179000 20101126120753616 +20101126120612344 SFD 178900 179000 20101126120612348 +20101126120727860 SFD 178900 179000 20101126120729199 +20101126113735727 SFD 178200 178300 20101126113736816 +20101126114638073 SFD 178300 178400 20101126114638127 +20101126124212733 SFD 178800 178900 20101126124213166 +20101126122329075 SFD 178900 179000 20101126122329172 +20101126124500281 SFD 178300 178400 20101126124500298 +20101126120944185 SFD 178900 179100 20101126120944185 +20101126115810904 SFD 178900 179000 20101126115810905 +20101126120609701 SFD 178800 178900 20101126120609703 +20101126124040935 SFD 178900 179000 20101126124040939 +20101126120427644 SFD 178600 178700 20101126120427646 +20101126115716028 SFD 178800 178900 20101126115716038 +20101126114118834 SFD 178200 178300 20101126114118839 +20101126122740389 SFD 178900 179000 20101126122742847 +20101126124215935 SFD 178700 178800 20101126124215961 +20101126114118839 SFD 178200 178300 20101126114118846 +20101126124757290 SFD 178200 178300 20101126124757291 +20101126121354563 SFD 178900 179000 20101126121357952 +20101126120304130 SFD 178600 178700 20101126120307520 +20101126123339412 SFD 178900 179000 20101126123339421 +20101126123419656 SFD 178900 179000 20101126123427709 +20101126121925400 SFD 178900 179000 20101126121933952 +20101126114745722 SFD 178400 178500 20101126114748121 +20101126124151078 SFD 178800 178900 20101126124151090 +20101126124151067 SFD 178800 178900 20101126124151067 +20101126120318037 SFD 178600 178700 20101126120318714 +20101126124821295 SFD 178100 178300 20101126124821295 +20101126122425829 SFD 178900 179000 20101126122425831 +20101126124416309 SFD 178300 178400 20101126124417033 +20101126114209316 SFD 178300 178400 20101126114211863 +20101126115622873 SFD 178800 178900 20101126115622873 +20101126124216566 SFD 178700 178800 20101126124217239 +20101126122316123 SFD 178900 179000 20101126122316126 +20101126124358443 SFD 178300 178400 20101126124358444 +20101126123401039 SFD 178900 179000 20101126123401272 +20101126114653913 SFD 178400 178500 20101126114653919 +20101126120206103 SFD 178700 178800 20101126120208776 +20101126115345051 SFD 178800 178900 20101126115345369 +20101126121359909 SFD 178900 179000 20101126121401398 +20101126121521375 SFD 179000 179100 20101126121521813 +20101126120325469 SFD 178600 178700 20101126120331501 +20101126123433014 SFD 178900 179000 20101126123433014 +20101126124251932 SFD 178500 178600 20101126124252949 +20101126123827878 SFD 178900 179000 20101126123834986 +20101126120517857 SFD 178800 178900 20101126120517858 +20101126122425815 SFD 178900 179000 20101126122425816 +20101126120519241 SFD 178800 178900 20101126120519245 +20101126122747435 SFD 178900 179000 20101126122747844 +20101126120428714 SFD 178700 178800 20101126120428715 +20101126120507895 SFD 178700 178800 20101126120508176 +20101126124022715 SFD 178900 179000 20101126124022729 +20101126122752850 SFD 178900 179000 20101126122755258 +20101126114327275 SFD 178300 178400 20101126114327369 +20101126120804117 SFD 178900 179000 20101126120804191 +20101126115808817 SFD 178800 178900 20101126115808819 +20101126124213629 SFD 178700 178900 20101126124213663 +20101126124213680 SFD 178700 178800 20101126124213689 +20101126120307520 SFD 178600 178700 20101126120307522 +20101126120037839 SFD 178900 179000 20101126120042839 +20101126124231792 SFD 178600 178700 20101126124231792 +20101126124843839 SFD 178000 178100 20101126124843839 +20101126123418205 SFD 178900 179000 20101126123418206 +20101126121338085 SFD 178900 179000 20101126121346221 +20101126125247292 SFD 177900 178000 20101126125247293 +20101126120122838 SFD 178800 178900 20101126120125679 +20101126122912852 SFD 178900 179000 20101126122933496 +20101126122239335 SFD 178900 179000 20101126122239832 +20101126124757289 SFD 178200 178300 20101126124757289 +20101126123945991 SFD 178900 179000 20101126123945995 +20101126122817134 SFD 178900 179000 20101126122818603 +20101126120145620 SFD 178800 178900 20101126120145621 +20101126124224459 SFD 178700 178800 20101126124224460 +20101126122329178 SFD 178900 179000 20101126122329182 +20101126115810625 SFD 178900 179000 20101126115810677 +20101126121521016 SFD 178900 179000 20101126121521017 +20101126120428524 SFD 178700 178800 20101126120428524 +20101126121521022 SFD 179000 179100 20101126121521022 +20101126122859591 SFD 178900 179000 20101126122859598 +20101126120325166 SFD 178600 178700 20101126120325343 +20101126124358441 SFD 178300 178400 20101126124358441 +20101126122708461 SFD 178900 179000 20101126122708917 +20101126122955155 SFD 178800 179000 20101126122955568 +20101126124102891 SFD 178900 179000 20101126124102891 +20101126122900006 SFD 178900 179000 20101126122901988 +20101126124243973 SFD 178500 178600 20101126124243973 +20101126122537841 SFD 178900 179000 20101126122539628 +20101126115810517 SFD 178800 178900 20101126115810536 +20101126125025934 SFD 178000 178100 20101126125026877 +20101126124453877 SFD 178300 178400 20101126124455925 +20101126122757982 SFD 178900 179000 20101126122758408 +20101126114605703 SFD 178400 178500 20101126114605705 +20101126122758408 SFD 178900 179000 20101126122758413 +20101126124510088 SFD 178300 178400 20101126124510331 +20101126124136939 SFD 178900 179000 20101126124141124 +20101126124400707 SFD 178300 178400 20101126124400843 +20101126124151074 SFD 178800 178900 20101126124151075 +20101126120318032 SFD 178600 178700 20101126120318037 +20101126124326033 SFD 178500 178600 20101126124328640 +20101126114825039 SFD 178400 178600 20101126114825039 +20101126125112260 SFD 177900 178000 20101126125112704 +20101126120919031 SFD 179000 179100 20101126120919033 +20101126124335633 SFD 178500 178600 20101126124335637 +20101126123405924 SFD 178900 179000 20101126123414018 +20101126122245280 SFD 178900 179000 20101126122245285 +20101126122206093 SFD 178900 179000 20101126122206893 +20101126121311130 SFD 178900 179000 20101126121319137 +20101126124141928 SFD 178900 179000 20101126124141928 +20101126124511844 SFD 178300 178400 20101126124513417 +20101126122953457 SFD 178900 179000 20101126122954764 +20101126124102925 SFD 178900 179000 20101126124102926 +20101126122239315 SFD 178900 179000 20101126122239323 +20101126122217828 SFD 178900 179000 20101126122217831 +20101126124224460 SFD 178700 178800 20101126124227884 +20101126124150979 SFD 178900 179000 20101126124150979 +20101126120919027 SFD 179000 179100 20101126120919028 +20101126121642349 SFD 178900 179000 20101126121643946 +20101126124222203 SFD 178700 178800 20101126124222205 +20101126124243978 SFD 178500 178600 20101126124243978 +20101126124213694 SFD 178700 178800 20101126124213695 +20101126124844520 SFD 178000 178100 20101126124847708 +20101126120949263 SFD 178900 179000 20101126120950654 +20101126124243355 SFD 178600 178700 20101126124243356 +20101126124243973 SFD 178500 178600 20101126124243973 +20101126124724158 SFD 178300 178400 20101126124724160 +20101126120944261 SFD 178900 179000 20101126120944261 +20101126125630023 SFD 178200 178400 20101126125630038 +20101126120437834 SFD 178700 178800 20101126120444127 +20101126125353378 SFD 178000 178100 20101126125353378 +20101126124227884 SFD 178700 178800 20101126124227884 +20101126124546998 SFD 178200 178400 20101126124546998 +20101126124546726 SFD 178300 178400 20101126124546731 +20101126120513953 SFD 178800 178900 20101126120514763 +20101126125109784 SFD 178000 178100 20101126125110045 +20101126120631361 SFD 178900 179000 20101126120631363 +20101126125412429 SFD 178000 178200 20101126125412431 +20101126121521865 SFD 178900 179000 20101126121521885 +20101126124848903 SFD 178000 178100 20101126124849015 +20101126124243293 SFD 178600 178700 20101126124243293 +20101126123453204 SFD 178900 179000 20101126123454634 +20101126122657842 SFD 178900 179000 20101126122657847 +20101126124310626 SFD 178500 178600 20101126124310626 +20101126124724160 SFD 178300 178400 20101126124724160 +20101126124826304 SFD 178100 178200 20101126124839209 +20101126124757495 SFD 178200 178300 20101126124757639 +20101126124150719 SFD 178900 179000 20101126124150978 +20101126125353017 SFD 177900 178100 20101126125353018 +20101126122843991 SFD 178900 179000 20101126122844485 +20101126124546958 SFD 178200 178400 20101126124546960 +20101126122842870 SFD 178900 179000 20101126122843991 +20101126124106890 SFD 178900 179000 20101126124119105 +20101126122137609 SFD 178900 179000 20101126122137610 +20101126124213695 SFD 178700 178800 20101126124213697 +20101126120437139 SFD 178700 178800 20101126120437832 +20101126122911709 SFD 178900 179000 20101126122911747 +20101126120148734 SFD 178700 178800 20101126120148735 +20101126124500218 SFD 178300 178400 20101126124500218 +20101126121222267 SFD 178900 179000 20101126121222274 +20101126125221977 SFD 177900 178000 20101126125223121 +20101126120612193 SFD 178900 179000 20101126120612210 +20101126124243634 SFD 178500 178700 20101126124243969 +20101126124455925 SFD 178300 178400 20101126124500136 +20101126123340575 SFD 178900 179000 20101126123340575 +20101126124839225 SFD 178000 178100 20101126124839252 +20101126120753809 SFD 178900 179000 20101126120753811 +20101126124128857 SFD 178900 179000 20101126124136934 +20101126124607646 SFD 178300 178400 20101126124607647 +20101126122202983 SFD 178900 179000 20101126122206093 +20101126124228039 SFD 178600 178700 20101126124228040 +20101126124500219 SFD 178300 178400 20101126124500220 +20101126125944721 SFD 178200 178400 20101126125944734 +20101126124924421 SFD 178000 178100 20101126124924421 +20101126124839210 SFD 0 178200 20101126124839210 +20101126124246159 SFD 178500 178600 20101126124246161 +20101126120508795 SFD 178800 178900 20101126120508796 +20101126124358207 SFD 178400 178500 20101126124358207 +20101126125553077 SFD 178100 178200 20101126125553077 +20101126124400843 SFD 178300 178400 20101126124402052 +20101126124551458 SFD 178200 178400 20101126124551459 +20101126124150980 SFD 178900 179000 20101126124150982 +20101126121744883 SFD 178900 179000 20101126121744885 +20101126125315141 SFD 177900 178000 20101126125316478 +20101126125640676 SFD 178200 178300 20101126125640705 +20101126124821224 SFD 178200 178300 20101126124821224 +20101126120612210 SFD 178900 179000 20101126120612245 +20101126125638224 SFD 178200 178400 20101126125638294 +20101126124500490 SFD 178300 178400 20101126124500684 +20101126124352368 SFD 178400 178500 20101126124352368 +20101126125516066 SFD 178100 178200 20101126125523500 +20101126124141928 SFD 178900 179000 20101126124141928 +20101126125014305 SFD 178000 178100 20101126125015455 +20101126124148117 SFD 178900 179000 20101126124148191 +20101126122813152 SFD 178900 179000 20101126122817134 +20101126124213311 SFD 178800 178900 20101126124213340 +20101126125749257 SFD 178300 178500 20101126125750328 +20101126124500228 SFD 178300 178400 20101126124500229 +20101126124749332 SFD 178300 178400 20101126124749375 +20101126120919025 SFD 178900 179100 20101126120919026 +20101126122127827 SFD 178900 179000 20101126122129435 +20101126122202230 SFD 178900 179000 20101126122202983 +20101126124358009 SFD 178400 178500 20101126124358012 +20101126101155337 SSO 431500 431600 20101126101155337 +20101126125234996 SFD 177900 178000 20101126125235164 +20101126124228175 SFD 178600 178700 20101126124228176 +20101126122407799 SFD 178900 179000 20101126122421082 +20101126124924421 SFD 178000 178100 20101126124924422 +20101126124821302 SFD 178100 178300 20101126124821302 +20101126124227900 SFD 178700 178800 20101126124227901 +20101126125001888 SFD 178000 178100 20101126125003452 +20101126125850371 SFD 178300 178400 20101126125850372 +20101126124358439 SFD 178300 178400 20101126124358439 +20101126124905380 SFD 178000 178100 20101126124905431 +20101126124929362 SFD 178000 178100 20101126124929646 +20101126124823076 SFD 178100 178200 20101126124823792 +20101126125636488 SFD 178200 178400 20101126125636497 +20101126124150988 SFD 178800 179000 20101126124150988 +20101126125159235 SFD 177900 178000 20101126125159235 +20101126125257777 SFD 177900 178000 20101126125257778 +20101126125337179 SFD 177900 178000 20101126125345117 +20101126125058532 SFD 178000 178100 20101126125104356 +20101126125211179 SFD 177900 178000 20101126125214228 +20101126125408112 SFD 178000 178100 20101126125408203 +20101126124821223 SFD 178200 178300 20101126124821223 +20101126124228054 SFD 178600 178700 20101126124228055 +20101126124358441 SFD 178300 178400 20101126124358442 +20101126125414125 SFD 178100 178200 20101126125417086 +20101126124228045 SFD 178600 178700 20101126124228045 +20101126124320721 SFD 178500 178600 20101126124320721 +20101126125951281 SFD 178400 178500 20101126125952106 +20101126101156288 SSO 431500 431700 20101126101156290 +20101126125950688 SFD 178400 178500 20101126125950690 +20101126124257200 SFD 178500 178600 20101126124257202 +20101126125412406 SFD 178000 178200 20101126125412406 +20101126125353016 SFD 177900 178000 20101126125353016 +20101126125159235 SFD 177900 178000 20101126125159708 +20101126125944035 SFD 178300 178400 20101126125944172 +20101126125610671 SFD 178100 178300 20101126125610672 +20101126124607633 SFD 178300 178400 20101126124607634 +20101126124222895 SFD 178700 178800 20101126124223153 +20101126125110874 SFD 177900 178000 20101126125110874 +20101126122123330 SFD 178900 179000 20101126122124654 +20101126125111203 SFD 177900 178000 20101126125111211 +20101126124358208 SFD 178400 178500 20101126124358209 +20101126125316478 SFD 177900 178000 20101126125317289 +20101126101156327 SSO 431600 431700 20101126101156337 +20101126124352366 SFD 178400 178500 20101126124352366 +20101126122903138 SFD 178900 179000 20101126122903139 +20101126125542326 SFD 178100 178200 20101126125542966 +20101126124231790 SFD 178600 178700 20101126124231792 +20101126125502877 SFD 178100 178300 20101126125502958 +20101126124546998 SFD 178200 178400 20101126124547097 +20101126124839213 SFD 178000 178100 20101126124839213 +20101126125020324 SFD 178000 178100 20101126125025454 +20101126101159346 SSO 431600 431700 20101126101159352 +20101126125412422 SFD 178000 178200 20101126125412422 +20101126125915042 SFD 178300 178400 20101126125915043 +20101126124551462 SFD 178200 178300 20101126124551463 +20101126125930635 SFD 178300 178400 20101126125930716 +20101126125113260 SFD 177900 178000 20101126125114158 +20101126124757286 SFD 178200 178300 20101126124757286 +20101126125305868 SFD 177900 178000 20101126125306203 +20101126130146126 SFD 177500 182000 20101126130146130 +20101126125554455 SFD 178100 178200 20101126125554520 +20101126124905352 SFD 178000 178100 20101126124905366 +20101126124151072 SFD 178800 178900 20101126124151073 +20101126125803326 SFD 178300 178400 20101126125803326 +20101126124607634 SFD 178300 178400 20101126124607634 +20101126125610672 SFD 178200 178300 20101126125610672 +20101126101156337 SSO 431600 431700 20101126101156338 +20101126125639975 SFD 178200 178400 20101126125639995 +20101126125640709 SFD 178300 178400 20101126125640709 +20101126125504630 SFD 178100 178200 20101126125504632 +20101126133210906 SFD 177000 182000 20101126133212917 +20101126124608241 SFD 178300 178400 20101126124612681 +20101126130900339 SFD 161900 178700 20101126130900736 +20101126125826038 SFD 178300 178400 20101126125826042 +20101126125950686 SFD 178300 178500 20101126125950688 +20101126124501203 SFD 178300 178400 20101126124501205 +20101126101156018 SSO 431500 431600 20101126101156238 +20101126101157631 SSO 431600 431700 20101126101157631 +20101126125650369 SFD 178300 178400 20101126125652042 +20101126124708890 SFD 178300 178400 20101126124709935 +20101126124243978 SFD 178500 178600 20101126124243979 +20101126125422805 SFD 178100 178200 20101126125422806 +20101126124243974 SFD 178500 178600 20101126124243974 +20101126124839209 SFD 178100 178200 20101126124839210 +20101126101238096 SSO 431300 431400 20101126101238096 +20101126125945616 SFD 178300 178400 20101126125945616 +20101126125854030 SFD 178300 178400 20101126125855060 +20101126125229644 SFD 177900 178000 20101126125230360 +20101126130732018 SFD 177300 178700 20101126130900339 +20101126125030342 SFD 178000 178100 20101126125038904 +20101126124102933 SFD 178900 179000 20101126124102935 +20101126125750368 SFD 178300 178400 20101126125750372 +20101126101205237 SSO 431600 431700 20101126101205237 +20101126124607633 SFD 178300 178400 20101126124607633 +20101126125914891 SFD 178300 178400 20101126125915042 +20101126101157638 SSO 431600 431700 20101126101157638 +20101126125159233 SFD 177900 178000 20101126125159235 +20101126124920321 SFD 178000 178100 20101126124920735 +20101126125230360 SFD 177900 178000 20101126125230360 +20101126130903663 SFD 177200 182000 20101126130914680 +20101126101157630 SSO 431600 431700 20101126101157631 +20101126125959032 SFD 178200 178400 20101126125959081 +20101126125614928 SFD 178200 178300 20101126125614929 +20101126125104356 SFD 178000 178100 20101126125106202 +20101126125358442 SFD 178000 178100 20101126125358442 +20101126143803521 SFD 157500 178500 20101126143806194 +20101126101204897 SSO 431600 431700 20101126101204899 +20101126101202178 SSO 431600 431700 20101126101202185 +20101126101153681 SSO 431500 431600 20101126101153682 +20101126101201346 SSO 431600 431700 20101126101201346 +20101126125353378 SFD 178000 178100 20101126125353379 +20101126130136779 SFD 170100 182000 20101126130146126 +20101126101156956 SSO 431600 431700 20101126101156994 +20101126125412431 SFD 178000 178200 20101126125412432 +20101126125947098 SFD 178400 178500 20101126125947125 +20101126124243969 SFD 178500 178600 20101126124243969 +20101126101156952 SSO 431600 431700 20101126101156955 +20101126125948605 SFD 178200 178500 20101126125948606 +20101126125248814 SFD 177900 178000 20101126125248856 +20101126101156290 SSO 431500 431700 20101126101156291 +20101126125947908 SFD 178300 178500 20101126125947908 +20101126125412455 SFD 178100 178200 20101126125412456 +20101126125242222 SFD 177900 178000 20101126125242223 +20101126124821501 SFD 178100 178200 20101126124821544 +20101126101203614 SSO 431600 431700 20101126101203614 +20101126101220084 SSO 431400 431500 20101126101220308 +20101126125230653 SFD 177900 178000 20101126125231738 +20101126124531911 SFD 178300 178400 20101126124532536 +20101126101156283 SSO 431500 431700 20101126101156284 +20101126101212748 SSO 431400 431500 20101126101212748 +20101126124521108 SFD 178300 178400 20101126124524822 +20101126101159515 SSO 431600 431700 20101126101159517 +20101126125505619 SFD 178100 178200 20101126125512719 +20101126125934631 SFD 178300 178500 20101126125935633 +20101126101220696 SSO 431400 431500 20101126101220696 +20101126101311179 SSO 431000 431100 20101126101311180 +20101126125110883 SFD 177900 178000 20101126125110883 +20101126125232678 SFD 177900 178000 20101126125234987 +20101126101259584 SSO 431100 431200 20101126101259584 +20101126101236882 SSO 431300 431400 20101126101236901 +20101126101224493 SSO 431400 431500 20101126101224624 +20101126124606934 SFD 178200 178300 20101126124606935 +20101126101206609 SSO 431600 431700 20101126101206611 +20101126101237069 SSO 431400 431500 20101126101237381 +20101126124553313 SFD 178200 178300 20101126124554638 +20101126101209316 SSO 431500 431700 20101126101209316 +20101126101210918 SSO 431400 431500 20101126101210918 +20101126101205337 SSO 431600 431700 20101126101205338 +20101126101156291 SSO 431500 431700 20101126101156293 +20101126130425618 SFD 177400 182000 20101126130427712 +20101126125232562 SFD 177900 178000 20101126125232678 +20101126101200758 SSO 431600 431700 20101126101200758 +20101126101209452 SSO 431500 431600 20101126101209452 +20101126125351008 SFD 177900 178000 20101126125351158 +20101126101209452 SSO 431500 431600 20101126101209452 +20101126124608145 SFD 178300 178400 20101126124608146 +20101126101210133 SSO 431400 431500 20101126101210134 +20101126101206586 SSO 431600 431700 20101126101206588 +20101126125652044 SFD 178300 178400 20101126125652062 +20101126101208323 SSO 431600 431700 20101126101208403 +20101126125838671 SFD 178300 178400 20101126125838673 +20101126101157077 SSO 431600 431700 20101126101157077 +20101126101206673 SSO 431600 431700 20101126101206688 +20101126101209318 SSO 431500 431600 20101126101209318 +20101126101236967 SSO 431300 431400 20101126101236971 +20101126101237009 SSO 431400 431500 20101126101237009 +20101126124757285 SFD 178200 178300 20101126124757285 +20101126101236798 SSO 431300 431500 20101126101236798 +20101126101201440 SSO 431600 431700 20101126101201441 +20101126101233192 SSO 431400 431500 20101126101233210 +20101126101252070 SSO 431200 431300 20101126101252070 +20101126125944790 SFD 178200 178400 20101126125944790 +20101126101204550 SSO 431600 431700 20101126101204550 +20101126101232625 SSO 431400 431500 20101126101232625 +20101126101252107 SSO 431100 431200 20101126101252107 +20101126125623633 SFD 178200 178400 20101126125624224 +20101126125947191 SFD 178400 178500 20101126125947239 +20101126101211033 SSO 431400 431500 20101126101211287 +20101126101236779 SSO 431400 431500 20101126101236786 +20101126101334151 SSO 431000 431100 20101126101334152 +20101126101205509 SSO 431600 431700 20101126101205570 +20101126101239466 SSO 431300 431400 20101126101239508 +20101126101159247 SSO 431600 431700 20101126101159251 +20101126101336262 SSO 431100 431200 20101126101336264 +20101126124920277 SFD 178000 178100 20101126124920278 +20101126101156290 SSO 431500 431700 20101126101156290 +20101126101236803 SSO 431300 431400 20101126101236804 +20101126101159515 SSO 431600 431700 20101126101159515 +20101126101210918 SSO 431400 431500 20101126101210947 +20101126101209318 SSO 431500 431600 20101126101209318 +20101126101215020 SSO 431400 431500 20101126101215021 +20101126101159619 SSO 431600 431800 20101126101159620 +20101126101212588 SSO 431400 431500 20101126101212588 +20101126142617885 SFD 161700 178600 20101126142620865 +20101126125948138 SFD 178300 178500 20101126125948581 +20101126101215021 SSO 431400 431500 20101126101215021 +20101126125641476 SFD 178300 178400 20101126125644596 +20101126101212220 SSO 431400 431500 20101126101212338 +20101126101239264 SSO 431300 431400 20101126101239265 +20101126131506832 SFD 176900 178600 20101126132324323 +20101126101205197 SSO 431600 431700 20101126101205197 +20101126125610759 SFD 178200 178300 20101126125610760 +20101126101153430 SSO 431500 431600 20101126101153433 +20101126101157631 SSO 431600 431700 20101126101157631 +20101126101208763 SSO 431600 431700 20101126101208822 +20101126101307684 SSO 431000 431100 20101126101307734 +20101126101204971 SSO 431600 431700 20101126101204971 +20101126101243120 SSO 431300 431400 20101126101243138 +20101126143130357 SFD 157500 182000 20101126143134051 +20101126101205096 SSO 431600 431700 20101126101205098 +20101126101241632 SSO 431300 431400 20101126101241643 +20101126101241145 SSO 431400 431500 20101126101241148 +20101126101310303 SSO 431000 431100 20101126101310442 +20101126101205014 SSO 431600 431700 20101126101205014 +20101126101212749 SSO 431400 431500 20101126101212749 +20101126101159619 SSO 431600 431800 20101126101159619 +20101126101240738 SSO 431400 431500 20101126101240738 +20101126101153160 SSO 431500 431600 20101126101153177 +20101126125945631 SFD 178400 178500 20101126125945633 +20101126101205654 SSO 431600 431700 20101126101205660 +20101126125827565 SFD 178300 178400 20101126125831395 +20101126101222424 SSO 431400 431500 20101126101222424 +20101126101252109 SSO 431100 431200 20101126101252109 +20101126131505228 SFD 176900 182000 20101126131506832 +20101126101240333 SSO 431300 431400 20101126101240334 +20101126131157414 SFD 161700 178600 20101126131157750 +20101126125941069 SFD 178300 178400 20101126125942292 +20101126125944172 SFD 178300 178400 20101126125944194 +20101126101356691 SSO 431100 431200 20101126101356706 +20101126101244393 SSO 431300 431400 20101126101244397 +20101126101154787 SSO 431500 431600 20101126101154787 +20101126125305371 SFD 177900 178000 20101126125305371 +20101126101239278 SSO 431300 431400 20101126101239278 +20101126101208178 SSO 431600 431700 20101126101208281 +20101126101204630 SSO 431600 431700 20101126101204896 +20101126101155897 SSO 431500 431600 20101126101155897 +20101126101156291 SSO 431500 431700 20101126101156291 +20101126135349067 SFD 161700 182000 20101126135350982 +20101126101213247 SSO 431400 431500 20101126101213325 +20101126101206443 SSO 431600 431700 20101126101206443 +20101126101236959 SSO 431300 431400 20101126101236960 +20101126101217633 SSO 431400 431500 20101126101217694 +20101126101209321 SSO 431500 431600 20101126101209321 +20101126130124586 SFD 177300 9999999900 20101126130124619 +20101126101209454 SSO 431500 431600 20101126101209454 +20101126101223424 SSO 431400 431500 20101126101223425 +20101126101239276 SSO 431300 431400 20101126101239277 +20101126101243141 SSO 431300 431400 20101126101243192 +20101126101224077 SSO 431400 431500 20101126101224141 +20101126101159555 SSO 431600 431700 20101126101159557 +20101126101243117 SSO 431300 431400 20101126101243120 +20101126101156738 SSO 431600 431700 20101126101156739 +20101126101210470 SSO 431400 431500 20101126101210492 +20101126101210764 SSO 431400 431500 20101126101210918 +20101126101238845 SSO 431400 431500 20101126101238846 +20101126101356435 SSO 431100 431200 20101126101356435 +20101126101236845 SSO 431300 431400 20101126101236869 +20101126101257213 SSO 431000 431200 20101126101257441 +20101126101240361 SSO 431300 431400 20101126101240361 +20101126101157079 SSO 431600 431700 20101126101157082 +20101126101336265 SSO 431000 431200 20101126101336265 +20101126101202953 SSO 431600 431700 20101126101202959 +20101126101233667 SSO 431400 431500 20101126101234026 +20101126101250266 SSO 431200 431300 20101126101250758 +20101126101224047 SSO 431400 431500 20101126101224077 +20101126101208722 SSO 431600 431700 20101126101208756 +20101126101253201 SSO 431100 431200 20101126101253201 +20101126101156298 SSO 431600 431700 20101126101156298 +20101126101242409 SSO 431300 431400 20101126101242410 +20101126101229539 SSO 431400 431500 20101126101229539 +20101126101239258 SSO 431300 431400 20101126101239258 +20101126101239285 SSO 431300 431400 20101126101239285 +20101126101215020 SSO 431400 431500 20101126101215020 +20101126101239257 SSO 431300 431400 20101126101239258 +20101126101213207 SSO 431400 431500 20101126101213208 +20101126101208300 SSO 431600 431700 20101126101208301 +20101126101302045 SSO 431000 431100 20101126101302045 +20101126125610672 SFD 178200 178300 20101126125610672 +20101126101249340 SSO 431200 431300 20101126101249499 +20101126125924246 SFD 178300 178400 20101126125924247 +20101126101156669 SSO 431600 431700 20101126101156669 +20101126101315311 SSO 431000 431100 20101126101315922 +20101126101358265 SSO 431100 431200 20101126101358265 +20101126101302046 SSO 431000 431100 20101126101302046 +20101126101347491 SSO 431000 431100 20101126101347521 +20101126101239267 SSO 431300 431400 20101126101239267 +20101126101307462 SSO 431000 431100 20101126101307463 +20101126101236774 SSO 431400 431500 20101126101236774 +20101126101314469 SSO 431000 431100 20101126101314469 +20101126101226206 SSO 431400 431500 20101126101226645 +20101126125812234 SFD 178300 178400 20101126125812628 +20101126101209453 SSO 431500 431600 20101126101209454 +20101126101320286 SSO 431100 431200 20101126101320291 +20101126101209489 SSO 431500 431600 20101126101209490 +20101126101331949 SSO 431100 431200 20101126101333116 +20101126101244379 SSO 431300 431400 20101126101244393 +20101126101304394 SSO 431000 431100 20101126101304465 +20101126101205570 SSO 431600 431700 20101126101205573 +20101126101302047 SSO 431000 431100 20101126101302047 +20101126101328344 SSO 431000 431200 20101126101328344 +20101126101213213 SSO 431400 431500 20101126101213225 +20101126101229576 SSO 431400 431500 20101126101229624 +20101126101215022 SSO 431400 431500 20101126101215026 +20101126101357700 SSO 431100 431200 20101126101357915 +20101126101153177 SSO 431500 431600 20101126101153177 +20101126101243084 SSO 431300 431400 20101126101243084 +20101126101239290 SSO 431300 431400 20101126101239290 +20101126101236798 SSO 431400 431500 20101126101236798 +20101126101313766 SSO 431000 431100 20101126101313766 +20101126101354297 SSO 431000 431100 20101126101354299 +20101126101229627 SSO 431400 431500 20101126101230622 +20101126101220066 SSO 431400 431500 20101126101220077 +20101126101311871 SSO 431000 431100 20101126101311873 +20101126101248526 SSO 431200 431300 20101126101248528 +20101126101239258 SSO 431300 431400 20101126101239258 +20101126101320339 SSO 431100 431200 20101126101320366 +20101126101240238 SSO 431300 431400 20101126101240238 +20101126101156306 SSO 431600 431700 20101126101156306 +20101126101236568 SSO 431400 431500 20101126101236697 +20101126101313767 SSO 431000 431100 20101126101313816 +20101126101239260 SSO 431300 431400 20101126101239264 +20101126101243086 SSO 431300 431400 20101126101243087 +20101126101241292 SSO 431300 431400 20101126101241292 +20101126101302046 SSO 431000 431100 20101126101302046 +20101126101336386 SSO 431000 431100 20101126101336387 +20101126101201095 SSO 431600 431700 20101126101201103 +20101126101248017 SSO 431200 431300 20101126101248271 +20101126101234356 SSO 431400 431500 20101126101234436 +20101126101347782 SSO 431000 431100 20101126101347783 +20101126101406405 SSO 431200 431300 20101126101406406 +20101126101239425 SSO 431300 431400 20101126101239465 +20101126101209828 SSO 431400 431500 20101126101209828 +20101126101236811 SSO 431300 431400 20101126101236833 +20101126125941034 SFD 178300 178400 20101126125941062 +20101126101238845 SSO 431400 431500 20101126101238845 +20101126101239243 SSO 431300 431500 20101126101239243 +20101126101252072 SSO 431200 431300 20101126101252073 +20101126101238846 SSO 431400 431500 20101126101238847 +20101126101307906 SSO 431000 431100 20101126101308115 +20101126101238846 SSO 431400 431500 20101126101238846 +20101126101356526 SSO 431100 431200 20101126101356527 +20101126101406407 SSO 431200 431300 20101126101406407 +20101126101342917 SSO 431000 431100 20101126101342988 +20101126101248012 SSO 431200 431400 20101126101248012 +20101126101315188 SSO 431000 431100 20101126101315311 +20101126101319428 SSO 431000 431100 20101126101319562 +20101126101328345 SSO 431000 431100 20101126101328345 +20101126101239745 SSO 431300 431400 20101126101239745 +20101126101321824 SSO 431100 431200 20101126101321825 +20101126101336573 SSO 431000 431100 20101126101336574 +20101126101209412 SSO 431500 431600 20101126101209412 +20101126101329224 SSO 431000 431100 20101126101329224 +20101126101311660 SSO 431000 431100 20101126101311660 +20101126101333639 SSO 431100 431200 20101126101333689 +20101126101356573 SSO 431100 431200 20101126101356573 +20101126101339142 SSO 431000 431100 20101126101339142 +20101126101419941 SSO 431200 431300 20101126101419942 +20101126101241291 SSO 431300 431500 20101126101241291 +20101126101336259 SSO 431000 431200 20101126101336259 +20101126101252108 SSO 431100 431200 20101126101252108 +20101126101329658 SSO 431000 431100 20101126101329659 +20101126101203021 SSO 431600 431700 20101126101203021 +20101126101348644 SSO 431000 431100 20101126101348644 +20101126101232925 SSO 431400 431500 20101126101233023 +20101126101356488 SSO 431100 431200 20101126101356488 +20101126101409475 SSO 431200 431300 20101126101409504 +20101126101257204 SSO 431000 431200 20101126101257213 +20101126101354847 SSO 431000 431100 20101126101355027 +20101126101242304 SSO 431300 431400 20101126101242305 +20101126101328348 SSO 431000 431100 20101126101328349 +20101126101420427 SSO 431200 431300 20101126101420435 +20101126101333846 SSO 431000 431100 20101126101333846 +20101126101323747 SSO 431100 431200 20101126101323747 +20101126101209495 SSO 431400 431500 20101126101209495 +20101126101435141 SSO 431200 431300 20101126101435228 +20101126101311762 SSO 431000 431100 20101126101311792 +20101126101257524 SSO 431000 431200 20101126101257524 +20101126101351084 SSO 431000 431100 20101126101351401 +20101126101356573 SSO 431100 431200 20101126101356573 +20101126101329212 SSO 431000 431100 20101126101329224 +20101126101248017 SSO 431200 431300 20101126101248017 +20101126101240338 SSO 431300 431400 20101126101240342 +20101126101406954 SSO 431200 431300 20101126101406954 +20101126101252395 SSO 431100 431200 20101126101252395 +20101126101420001 SSO 431200 431300 20101126101420013 +20101126101401057 SSO 431200 431300 20101126101401078 +20101126101302356 SSO 431000 431100 20101126101302410 +20101126101419938 SSO 431200 431300 20101126101419938 +20101126101333847 SSO 431000 431100 20101126101333847 +20101126101240350 SSO 431300 431400 20101126101240361 +20101126101406491 SSO 431200 431300 20101126101406492 +20101126101334677 SSO 431000 431100 20101126101334694 +20101126101315078 SSO 431000 431100 20101126101315106 +20101126101328555 SSO 431000 431100 20101126101328555 +20101126101319643 SSO 431000 431100 20101126101319754 +20101126101239265 SSO 431300 431400 20101126101239266 +20101126101333845 SSO 431000 431200 20101126101333845 +20101126101240408 SSO 431400 431500 20101126101240470 +20101126101433097 SSO 431300 431400 20101126101433097 +20101126101340160 SSO 431000 431100 20101126101340162 +20101126101402256 SSO 431200 431300 20101126101402427 +20101126101304345 SSO 431000 431100 20101126101304346 +20101126101452123 SSO 431400 431500 20101126101452164 +20101126101329786 SSO 431000 431100 20101126101329788 +20101126101336574 SSO 431000 431100 20101126101336601 +20101126101342989 SSO 431000 431100 20101126101342991 +20101126101311738 SSO 431000 431100 20101126101311762 +20101126101311197 SSO 431000 431100 20101126101311261 +20101126101243264 SSO 431300 431400 20101126101243264 +20101126101259579 SSO 431100 431200 20101126101259580 +20101126101252121 SSO 431100 431200 20101126101252121 +20101126101240342 SSO 431300 431500 20101126101240349 +20101126101407258 SSO 431200 431300 20101126101407636 +20101126101252126 SSO 431100 431200 20101126101252127 +20101126101333903 SSO 431000 431100 20101126101333903 +20101126101338866 SSO 431000 431100 20101126101338869 +20101126101240316 SSO 431300 431400 20101126101240316 +20101126101340419 SSO 431000 431100 20101126101340419 +20101126101328347 SSO 431000 431100 20101126101328347 +20101126101357692 SSO 431100 431200 20101126101357694 +20101126101454916 SSO 431400 431700 20101126101454976 +20101126101311735 SSO 431000 431100 20101126101311735 +20101126101453554 SSO 431400 431500 20101126101453555 +20101126101304240 SSO 431000 431100 20101126101304240 +20101126101348644 SSO 431000 431100 20101126101348668 +20101126101248012 SSO 431200 431300 20101126101248013 +20101126101425330 SSO 431200 431300 20101126101425332 +20101126101426054 SSO 431200 431300 20101126101426055 +20101126101432797 SSO 431300 431400 20101126101432797 +20101126101356662 SSO 431100 431200 20101126101356663 +20101126101336291 SSO 431100 431200 20101126101336291 +20101126101346801 SSO 431000 431100 20101126101346801 +20101126101252101 SSO 431100 431300 20101126101252102 +20101126101359816 SSO 431200 431300 20101126101359974 +20101126101406402 SSO 431200 431300 20101126101406402 +20101126101412270 SSO 431200 431300 20101126101412270 +20101126101243087 SSO 431300 431400 20101126101243110 +20101126101331832 SSO 0 0 20101126101331832 +20101126101341162 SSO 431000 431100 20101126101341259 +20101126101359457 SSO 431100 431200 20101126101359458 +20101126101336301 SSO 431100 431200 20101126101336308 +20101126101356554 SSO 431100 431200 20101126101356559 +20101126101420186 SSO 431200 431300 20101126101420288 +20101126101325262 SSO 431100 431200 20101126101325262 +20101126101407772 SSO 431200 431300 20101126101407772 +20101126101438019 SSO 431200 431300 20101126101438023 +20101126101445419 SSO 431400 431500 20101126101445430 +20101126101330127 SSO 431000 431100 20101126101330128 +20101126101348644 SSO 431000 431100 20101126101348644 +20101126101313816 SSO 431000 431100 20101126101313816 +20101126101418192 SSO 431200 431300 20101126101418194 +20101126101344141 SSO 431000 431100 20101126101344173 +20101126101252070 SSO 431200 431300 20101126101252071 +20101126101316183 SSO 431000 431100 20101126101316240 +20101126101448370 SSO 431500 431600 20101126101448372 +20101126101249044 SSO 431200 431300 20101126101249044 +20101126101401590 SSO 431200 431300 20101126101402023 +20101126101314464 SSO 431000 431100 20101126101314467 +20101126101434725 SSO 431200 431300 20101126101434725 +20101126101302046 SSO 431000 431100 20101126101302046 +20101126101422658 SSO 431200 431300 20101126101422658 +20101126101432782 SSO 431300 431400 20101126101432784 +20101126101356466 SSO 431100 431200 20101126101356467 +20101126101415967 SSO 431200 431300 20101126101415967 +20101126101427065 SSO 431200 431300 20101126101427535 +20101126101333846 SSO 431000 431100 20101126101333846 +20101126101416508 SSO 431100 431200 20101126101416508 +20101126101416467 SSO 431100 431200 20101126101416476 +20101126101407776 SSO 431200 431300 20101126101407786 +20101126101409046 SSO 431200 431300 20101126101409047 +20101126101318822 SSO 431000 431100 20101126101318822 +20101126101307461 SSO 431000 431100 20101126101307461 +20101126101429189 SSO 431200 431300 20101126101429206 +20101126101452321 SSO 431400 431500 20101126101452323 +20101126101409067 SSO 431200 431300 20101126101409130 +20101126101336272 SSO 431100 431200 20101126101336279 +20101126101329705 SSO 431000 431100 20101126101329716 +20101126101333689 SSO 431100 431200 20101126101333845 +20101126101406493 SSO 431200 431300 20101126101406494 +20101126101325264 SSO 431100 431200 20101126101325266 +20101126101510414 SSO 431300 431400 20101126101510415 +20101126101420408 SSO 431200 431300 20101126101420408 +20101126101406406 SSO 431200 431300 20101126101406406 +20101126101335087 SSO 431000 431100 20101126101335087 +20101126101448469 SSO 431500 431600 20101126101448476 +20101126101449510 SSO 431500 431600 20101126101449556 +20101126101404135 SSO 431200 431300 20101126101404893 +20101126101428708 SSO 431200 431300 20101126101428708 +20101126101406406 SSO 431200 431300 20101126101406406 +20101126101319793 SSO 431000 431100 20101126101319852 +20101126101416988 SSO 431100 431200 20101126101417011 +20101126101439826 SSO 431200 431300 20101126101439826 +20101126101409472 SSO 431200 431300 20101126101409475 +20101126101343047 SSO 431000 431100 20101126101343057 +20101126101400884 SSO 431200 431300 20101126101400885 +20101126101359459 SSO 431100 431200 20101126101359474 +20101126101453233 SSO 431400 431500 20101126101453233 +20101126101433144 SSO 431300 431400 20101126101433163 +20101126101452065 SSO 431400 431600 20101126101452065 +20101126101431397 SSO 431200 431300 20101126101431401 +20101126101338221 SSO 431000 431100 20101126101338226 +20101126101410272 SSO 431200 431300 20101126101410273 +20101126101406958 SSO 431200 431300 20101126101406959 +20101126101420410 SSO 431200 431300 20101126101420411 +20101126101409504 SSO 431200 431300 20101126101409530 +20101126101444488 SSO 431300 431400 20101126101444488 +20101126101413400 SSO 431200 431300 20101126101413405 +20101126101407670 SSO 431200 431300 20101126101407670 +20101126101458550 SSO 431500 431700 20101126101458553 +20101126101500915 SSO 431500 431600 20101126101500915 +20101126101358183 SSO 431100 431200 20101126101358194 +20101126101336664 SSO 431000 431100 20101126101336669 +20101126101430725 SSO 431200 431300 20101126101430739 +20101126101333846 SSO 431000 431100 20101126101333846 +20101126101444778 SSO 431300 431400 20101126101444779 +20101126101359585 SSO 431200 431300 20101126101359585 +20101126101500878 SSO 431500 431600 20101126101500878 +20101126101441330 SSO 431200 431300 20101126101441330 +20101126101451257 SSO 431500 431600 20101126101451308 +20101126101447018 SSO 431400 431500 20101126101447018 +20101126101502274 SSO 431400 431500 20101126101502301 +20101126101444518 SSO 431300 431400 20101126101444522 +20101126101451372 SSO 431500 431600 20101126101451374 +20101126101501980 SSO 431400 431500 20101126101502161 +20101126101412548 SSO 431200 431300 20101126101412548 +20101126101448086 SSO 431400 431500 20101126101448287 +20101126101417465 SSO 431200 431300 20101126101417487 +20101126101405510 SSO 431200 431300 20101126101405593 +20101126101434723 SSO 431200 431400 20101126101434723 +20101126101432772 SSO 431300 431400 20101126101432772 +20101126101422620 SSO 431200 431300 20101126101422621 +20101126101336292 SSO 431100 431200 20101126101336293 +20101126101506420 SSO 431300 431400 20101126101506421 +20101126101407646 SSO 431200 431300 20101126101407670 +20101126101441349 SSO 431200 431300 20101126101441360 +20101126101458633 SSO 431600 431700 20101126101458635 +20101126101457749 SSO 431500 431600 20101126101457750 +20101126101453435 SSO 431400 431500 20101126101453435 +20101126101424364 SSO 431200 431300 20101126101424530 +20101126101336644 SSO 431000 431100 20101126101336645 +20101126101441730 SSO 431200 431300 20101126101442116 +20101126101459250 SSO 431600 431700 20101126101459308 +20101126101416460 SSO 431100 431300 20101126101416461 +20101126101401156 SSO 431200 431300 20101126101401157 +20101126101415407 SSO 431200 431300 20101126101415457 +20101126101444781 SSO 431300 431400 20101126101444781 +20101126101508821 SSO 431300 431400 20101126101508824 +20101126101436437 SSO 431200 431300 20101126101436437 +20101126101416462 SSO 431100 431200 20101126101416462 +20101126101420030 SSO 431200 431300 20101126101420030 +20101126101359147 SSO 431100 431200 20101126101359149 +20101126101444944 SSO 431300 431400 20101126101444952 +20101126101501244 SSO 431400 431500 20101126101501257 +20101126101412272 SSO 431200 431300 20101126101412272 +20101126101417389 SSO 431100 431300 20101126101417389 +20101126101304365 SSO 431000 431100 20101126101304365 +20101126101356530 SSO 431100 431200 20101126101356532 +20101126101412286 SSO 431200 431300 20101126101412286 +20101126101400984 SSO 431200 431300 20101126101401010 +20101126101315077 SSO 431000 431100 20101126101315078 +20101126101420409 SSO 431200 431300 20101126101420409 +20101126101340421 SSO 431000 431100 20101126101340421 +20101126101500975 SSO 431400 431500 20101126101500975 +20101126101445066 SSO 431300 431400 20101126101445066 +20101126101511739 SSO 431300 431500 20101126101511748 +20101126101412268 SSO 431200 431300 20101126101412268 +20101126101412548 SSO 431200 431300 20101126101412548 +20101126101416461 SSO 431100 431200 20101126101416461 +20101126101500916 SSO 431500 431600 20101126101500916 +20101126101415087 SSO 431200 431300 20101126101415104 +20101126101430101 SSO 431200 431300 20101126101430177 +20101126101424530 SSO 431200 431300 20101126101424592 +20101126101434259 SSO 431300 431400 20101126101434259 +20101126101340162 SSO 431000 431100 20101126101340163 +20101126101453233 SSO 431400 431500 20101126101453233 +20101126101426693 SSO 431200 431300 20101126101426694 +20101126101458835 SSO 431600 431700 20101126101458838 +20101126101452208 SSO 431400 431500 20101126101452208 +20101126101419939 SSO 431200 431300 20101126101419940 +20101126101506395 SSO 431300 431400 20101126101506398 +20101126101514064 SSO 431400 431500 20101126101514065 +20101126101356640 SSO 431100 431200 20101126101356640 +20101126101428830 SSO 431200 431300 20101126101428915 +20101126101415463 SSO 431200 431300 20101126101415625 +20101126101433197 SSO 431300 431400 20101126101433200 +20101126101420288 SSO 431200 431300 20101126101420289 +20101126101431402 SSO 431200 431300 20101126101431402 +20101126101407911 SSO 431200 431300 20101126101407915 +20101126101433352 SSO 431300 431400 20101126101433361 +20101126101415382 SSO 431200 431300 20101126101415385 +20101126101500985 SSO 431400 431500 20101126101500986 +20101126101445173 SSO 431400 431500 20101126101445175 +20101126101406406 SSO 431200 431300 20101126101406406 +20101126101348558 SSO 431000 431100 20101126101348621 +20101126101452410 SSO 431400 431500 20101126101452641 +20101126101406482 SSO 431200 431300 20101126101406482 +20101126101510701 SSO 431300 431400 20101126101510703 +20101126101457659 SSO 431500 431600 20101126101457668 +20101126101508271 SSO 431300 431400 20101126101508729 +20101126101452060 SSO 431500 431600 20101126101452063 +20101126101452083 SSO 431400 431500 20101126101452083 +20101126101404084 SSO 431200 431300 20101126101404130 +20101126101502238 SSO 431400 431500 20101126101502239 +20101126101412549 SSO 431200 431300 20101126101412549 +20101126101448758 SSO 431500 431600 20101126101449070 +20101126101328692 SSO 431000 431100 20101126101328729 +20101126101430177 SSO 431200 431300 20101126101430361 +20101126101536186 SSO 431400 431500 20101126101536190 +20101126101426055 SSO 431200 431300 20101126101426055 +20101126101500915 SSO 431500 431600 20101126101500915 +20101126101554091 SSO 431200 431300 20101126101554091 +20101126101406184 SSO 431200 431300 20101126101406264 +20101126101500975 SSO 431400 431500 20101126101500976 +20101126101421129 SSO 431200 431300 20101126101421131 +20101126101452203 SSO 431400 431500 20101126101452203 +20101126101432782 SSO 431300 431400 20101126101432782 +20101126101444561 SSO 431300 431400 20101126101444561 +20101126101500984 SSO 431400 431500 20101126101500985 +20101126101358076 SSO 431100 431200 20101126101358078 +20101126101449118 SSO 431500 431600 20101126101449119 +20101126101506689 SSO 431300 431400 20101126101506689 +20101126101509011 SSO 431300 431400 20101126101509133 +20101126101419469 SSO 431200 431300 20101126101419470 +20101126101503166 SSO 431400 431500 20101126101503166 +20101126101502687 SSO 431400 431500 20101126101502687 +20101126101425333 SSO 431200 431300 20101126101425334 +20101126101447565 SSO 431400 431500 20101126101447639 +20101126101454915 SSO 431400 431500 20101126101454915 +20101126101436347 SSO 431200 431300 20101126101436348 +20101126101432772 SSO 431300 431400 20101126101432772 +20101126101416462 SSO 431100 431200 20101126101416463 +20101126101514235 SSO 431400 431500 20101126101514256 +20101126101507645 SSO 431300 431400 20101126101507773 +20101126101428082 SSO 431200 431300 20101126101428084 +20101126101447760 SSO 431400 431500 20101126101447760 +20101126101444488 SSO 431300 431400 20101126101444488 +20101126101518065 SSO 431300 431500 20101126101518489 +20101126101456001 SSO 431500 431600 20101126101456031 +20101126101444686 SSO 431300 431400 20101126101444688 +20101126101447070 SSO 431400 431500 20101126101447085 +20101126101452290 SSO 431400 431500 20101126101452291 +20101126101452082 SSO 431400 431500 20101126101452082 +20101126101510932 SSO 431400 431500 20101126101510933 +20101126101417390 SSO 431100 431300 20101126101417406 +20101126101504123 SSO 431400 431500 20101126101504148 +20101126101422087 SSO 431200 431300 20101126101422527 +20101126101537189 SSO 431300 431500 20101126101537189 +20101126101530218 SSO 431300 431400 20101126101530218 +20101126101444489 SSO 431300 431400 20101126101444489 +20101126101504150 SSO 431400 431500 20101126101504193 +20101126101412267 SSO 431200 431300 20101126101412267 +20101126101503843 SSO 431400 431500 20101126101503844 +20101126101444489 SSO 431300 431400 20101126101444489 +20101126101458776 SSO 431600 431700 20101126101458787 +20101126101356870 SSO 431100 431200 20101126101356870 +20101126101434260 SSO 431300 431400 20101126101434262 +20101126101510711 SSO 431400 431500 20101126101510711 +20101126101435284 SSO 431200 431300 20101126101435285 +20101126101400890 SSO 431200 431300 20101126101400892 +20101126101502237 SSO 431400 431500 20101126101502238 +20101126101509863 SSO 431400 431500 20101126101509864 +20101126101503170 SSO 431400 431500 20101126101503255 +20101126101506468 SSO 431300 431400 20101126101506468 +20101126101517669 SSO 431400 431500 20101126101517670 +20101126101522180 SSO 431400 431500 20101126101522184 +20101126101452164 SSO 431400 431500 20101126101452164 +20101126101501734 SSO 431400 431500 20101126101501735 +20101126101526435 SSO 431400 431500 20101126101526435 +20101126101523362 SSO 431400 431500 20101126101523387 +20101126101458563 SSO 431600 431700 20101126101458566 +20101126101445172 SSO 431400 431500 20101126101445172 +20101126101432774 SSO 431300 431400 20101126101432775 +20101126101452287 SSO 431400 431500 20101126101452288 +20101126101500877 SSO 431500 431700 20101126101500877 +20101126101510371 SSO 431300 431400 20101126101510379 +20101126101425036 SSO 431200 431300 20101126101425036 +20101126101445053 SSO 431300 431400 20101126101445066 +20101126101506425 SSO 431300 431400 20101126101506425 +20101126101457646 SSO 431500 431600 20101126101457646 +20101126101434726 SSO 431200 431400 20101126101434728 +20101126101520955 SSO 431400 431500 20101126101520956 +20101126101508208 SSO 431300 431400 20101126101508241 +20101126101510709 SSO 431300 431400 20101126101510709 +20101126101503895 SSO 431400 431500 20101126101503898 +20101126101500989 SSO 431400 431500 20101126101500989 +20101126101510286 SSO 431300 431400 20101126101510286 +20101126101514072 SSO 431400 431500 20101126101514074 +20101126101502325 SSO 431400 431500 20101126101502325 +20101126101453556 SSO 431400 431500 20101126101453570 +20101126101508744 SSO 431300 431400 20101126101508744 +20101126101526063 SSO 431300 431500 20101126101526063 +20101126101503839 SSO 431400 431500 20101126101503839 +20101126101447850 SSO 431400 431500 20101126101447940 +20101126101448407 SSO 431500 431600 20101126101448413 +20101126101543811 SSO 431400 431500 20101126101543812 +20101126101514533 SSO 431400 431500 20101126101514533 +20101126101514112 SSO 431400 431500 20101126101514115 +20101126101451034 SSO 431500 431600 20101126101451034 +20101126101526077 SSO 431300 431400 20101126101526079 +20101126101502686 SSO 431400 431500 20101126101502686 +20101126101506446 SSO 431300 431400 20101126101506447 +20101126101537192 SSO 431300 431400 20101126101537192 +20101126101456707 SSO 431500 431600 20101126101456832 +20101126101514930 SSO 431400 431500 20101126101514932 +20101126101445067 SSO 431300 431400 20101126101445067 +20101126101437802 SSO 431200 431300 20101126101437816 +20101126101527553 SSO 431400 431500 20101126101527662 +20101126101454754 SSO 431400 431600 20101126101454915 +20101126101517565 SSO 431400 431500 20101126101517579 +20101126101501628 SSO 431400 431500 20101126101501732 +20101126101453227 SSO 431400 431500 20101126101453228 +20101126101514798 SSO 431400 431500 20101126101514821 +20101126101517634 SSO 431400 431500 20101126101517634 +20101126101510296 SSO 431300 431400 20101126101510348 +20101126101526063 SSO 431300 431500 20101126101526064 +20101126101541188 SSO 431400 431500 20101126101541188 +20101126101538809 SSO 431300 431400 20101126101538824 +20101126101525584 SSO 431400 431500 20101126101525585 +20101126101530177 SSO 431400 431500 20101126101530178 +20101126101512047 SSO 431300 431400 20101126101512048 +20101126101545963 SSO 431300 431500 20101126101545963 +20101126101515135 SSO 431400 431500 20101126101515190 +20101126101538914 SSO 431300 431400 20101126101538931 +20101126101546005 SSO 431300 431400 20101126101546007 +20101126101534471 SSO 431300 431400 20101126101534473 +20101126101457750 SSO 431500 431600 20101126101457909 +20101126101509827 SSO 431400 431500 20101126101509827 +20101126101526435 SSO 431400 431500 20101126101526435 +20101126101529827 SSO 431400 431500 20101126101529843 +20101126101418310 SSO 431200 431300 20101126101418783 +20101126101527209 SSO 431400 431500 20101126101527210 +20101126101444347 SSO 431200 431300 20101126101444438 +20101126101500878 SSO 431500 431600 20101126101500878 +20101126101510286 SSO 431300 431400 20101126101510287 +20101126101506470 SSO 431300 431400 20101126101506471 +20101126101510200 SSO 431300 431400 20101126101510220 +20101126101614291 SSO 431300 431500 20101126101614291 +20101126101516930 SSO 431400 431500 20101126101516934 +20101126101546377 SSO 431300 431400 20101126101546377 +20101126101516942 SSO 431400 431500 20101126101516947 +20101126101556812 SSO 431200 431300 20101126101556812 +20101126101506855 SSO 431300 431400 20101126101506855 +20101126101526081 SSO 431300 431400 20101126101526081 +20101126101438023 SSO 431200 431300 20101126101438174 +20101126101503840 SSO 431400 431500 20101126101503840 +20101126101452082 SSO 431400 431500 20101126101452082 +20101126101453221 SSO 431400 431500 20101126101453221 +20101126101514790 SSO 431400 431500 20101126101514793 +20101126101527281 SSO 431400 431500 20101126101527281 +20101126101514065 SSO 431300 431500 20101126101514065 +20101126101502328 SSO 431400 431500 20101126101502330 +20101126101503841 SSO 431400 431500 20101126101503842 +20101126101536870 SSO 431400 431500 20101126101536872 +20101126101526070 SSO 431300 431400 20101126101526071 +20101126101514074 SSO 431400 431500 20101126101514078 +20101126101526441 SSO 431400 431500 20101126101526614 +20101126101616410 SSO 431200 431300 20101126101616410 +20101126101529768 SSO 431400 431500 20101126101529784 +20101126101537189 SSO 431300 431500 20101126101537189 +20101126101554090 SSO 431200 431300 20101126101554090 +20101126101502314 SSO 431400 431500 20101126101502323 +20101126101557281 SSO 431200 431300 20101126101557281 +20101126101508745 SSO 431300 431400 20101126101508745 +20101126101611600 SSO 431200 431300 20101126101611621 +20101126101507402 SSO 431300 431400 20101126101507403 +20101126101530216 SSO 431300 431500 20101126101530216 +20101126101507464 SSO 431300 431400 20101126101507471 +20101126101501494 SSO 431400 431500 20101126101501540 +20101126101536651 SSO 431400 431500 20101126101536651 +20101126101526614 SSO 431400 431500 20101126101526657 +20101126101530199 SSO 431400 431500 20101126101530200 +20101126101543196 SSO 431400 431500 20101126101543416 +20101126101511642 SSO 431400 431500 20101126101511642 +20101126101601428 SSO 431200 431300 20101126101601434 +20101126101556812 SSO 431200 431300 20101126101556812 +20101126101613626 SSO 431300 431400 20101126101613627 +20101126101510759 SSO 431300 431500 20101126101510766 +20101126101509862 SSO 431400 431500 20101126101509863 +20101126101504149 SSO 431400 431500 20101126101504150 +20101126101451038 SSO 431500 431600 20101126101451039 +20101126101508884 SSO 431300 431400 20101126101508884 +20101126101506401 SSO 431300 431400 20101126101506402 +20101126101611350 SSO 431200 431300 20101126101611379 +20101126101509921 SSO 431400 431500 20101126101509923 +20101126101501543 SSO 431400 431500 20101126101501543 +20101126101558793 SSO 431100 431200 20101126101559029 +20101126101554091 SSO 431200 431300 20101126101554091 +20101126101537190 SSO 431300 431400 20101126101537190 +20101126101508982 SSO 431300 431400 20101126101508982 +20101126101630813 SSO 431200 431300 20101126101630813 +20101126101606896 SSO 431200 431300 20101126101606896 +20101126101554534 SSO 431200 431300 20101126101554584 +20101126101557442 SSO 431100 431200 20101126101557446 +20101126101510633 SSO 431300 431400 20101126101510642 +20101126101521123 SSO 431400 431500 20101126101521123 +20101126101509822 SSO 431400 431500 20101126101509822 +20101126101502189 SSO 431400 431500 20101126101502206 +20101126101506379 SSO 431300 431400 20101126101506380 +20101126101557284 SSO 431100 431300 20101126101557285 +20101126101509824 SSO 431400 431500 20101126101509825 +20101126101534768 SSO 431300 431400 20101126101534774 +20101126101509822 SSO 431400 431500 20101126101509822 +20101126101504199 SSO 431300 431400 20101126101504201 +20101126101551872 SSO 431200 431400 20101126101552322 +20101126101514060 SSO 431300 431400 20101126101514062 +20101126101500988 SSO 431400 431500 20101126101500988 +20101126101614948 SSO 431300 431400 20101126101614949 +20101126101506441 SSO 431300 431400 20101126101506441 +20101126101451037 SSO 431500 431600 20101126101451037 +20101126101614925 SSO 431300 431400 20101126101614929 +20101126101515638 SSO 431400 431500 20101126101515638 +20101126101632064 SSO 431300 431400 20101126101632065 +20101126101517590 SSO 431400 431500 20101126101517592 +20101126101600834 SSO 431100 431200 20101126101600969 +20101126101633705 SSO 431300 431400 20101126101633705 +20101126101436348 SSO 431200 431300 20101126101436383 +20101126101613665 SSO 431300 431400 20101126101613665 +20101126101511904 SSO 431300 431500 20101126101512046 +20101126101508825 SSO 431300 431400 20101126101508826 +20101126101436437 SSO 431200 431300 20101126101436537 +20101126101506689 SSO 431300 431400 20101126101506689 +20101126101633630 SSO 431300 431400 20101126101633630 +20101126101654848 SSO 431300 431400 20101126101654848 +20101126101539027 SSO 431300 431400 20101126101539033 +20101126101613679 SSO 431300 431400 20101126101613679 +20101126101500877 SSO 431500 431700 20101126101500877 +20101126101656215 SSO 431200 431300 20101126101656215 +20101126101540017 SSO 431400 431500 20101126101540019 +20101126101546353 SSO 431300 431400 20101126101546353 +20101126101604426 SSO 431200 431300 20101126101604535 +20101126101613757 SSO 431400 431500 20101126101613761 +20101126101530246 SSO 431300 431400 20101126101530262 +20101126101637066 SSO 431300 431400 20101126101637067 +20101126101540702 SSO 431400 431500 20101126101540702 +20101126101627107 SSO 431200 431300 20101126101627107 +20101126101517803 SSO 431400 431500 20101126101518063 +20101126101554091 SSO 431200 431300 20101126101554091 +20101126101613559 SSO 431200 431400 20101126101613559 +20101126101713486 SSO 431300 431400 20101126101713507 +20101126101522604 SSO 431400 431500 20101126101522633 +20101126101613627 SSO 431300 431400 20101126101613628 +20101126101538706 SSO 431300 431400 20101126101538779 +20101126101539755 SSO 431400 431500 20101126101539766 +20101126101512416 SSO 431300 431400 20101126101512418 +20101126101602142 SSO 431200 431300 20101126101602143 +20101126101556608 SSO 431200 431300 20101126101556667 +20101126101616410 SSO 431200 431300 20101126101616410 +20101126101645125 SSO 431300 431400 20101126101645130 +20101126101613643 SSO 431300 431400 20101126101613643 +20101126101505281 SSO 431300 431400 20101126101505297 +20101126101517288 SSO 431400 431500 20101126101517554 +20101126101439826 SSO 431200 431300 20101126101439826 +20101126101645664 SSO 431300 431400 20101126101645673 +20101126101605942 SSO 431200 431300 20101126101605942 +20101126101546377 SSO 431300 431400 20101126101546377 +20101126101452068 SSO 431400 431600 20101126101452069 +20101126101514066 SSO 431400 431500 20101126101514066 +20101126101444691 SSO 431300 431400 20101126101444775 +20101126101641465 SSO 431300 431400 20101126101641465 +20101126101530736 SSO 431300 431400 20101126101530741 +20101126101526125 SSO 431300 431400 20101126101526125 +20101126101510710 SSO 431400 431500 20101126101510710 +20101126101616410 SSO 431200 431300 20101126101616410 +20101126101522793 SSO 431400 431500 20101126101522829 +20101126101642104 SSO 431300 431400 20101126101642105 +20101126101509824 SSO 431300 431500 20101126101509824 +20101126101616293 SSO 431300 431400 20101126101616294 +20101126101554056 SSO 431200 431400 20101126101554089 +20101126101613641 SSO 431300 431400 20101126101613641 +20101126101506447 SSO 431300 431400 20101126101506461 +20101126101541408 SSO 431400 431500 20101126101541410 +20101126101449510 SSO 431500 431600 20101126101449510 +20101126101632103 SSO 431300 431400 20101126101632103 +20101126101526062 SSO 431300 431500 20101126101526063 +20101126101530215 SSO 431300 431500 20101126101530216 +20101126101637650 SSO 431200 431300 20101126101637653 +20101126101628147 SSO 431200 431300 20101126101628394 +20101126101535461 SSO 431400 431500 20101126101535461 +20101126101614143 SSO 431400 431500 20101126101614143 +20101126101557287 SSO 431100 431300 20101126101557287 +20101126101530217 SSO 431300 431400 20101126101530218 +20101126101631771 SSO 431200 431300 20101126101631772 +20101126101618498 SSO 431200 431300 20101126101618498 +20101126101559598 SSO 431100 431200 20101126101559600 +20101126101557330 SSO 431100 431200 20101126101557333 +20101126101523616 SSO 431400 431500 20101126101523641 +20101126101617484 SSO 431200 431300 20101126101617484 +20101126101530178 SSO 431400 431500 20101126101530179 +20101126101526065 SSO 431300 431400 20101126101526066 +20101126101557391 SSO 431100 431200 20101126101557434 +20101126101514781 SSO 431400 431500 20101126101514786 +20101126101554090 SSO 431200 431300 20101126101554090 +20101126101543795 SSO 431400 431500 20101126101543811 +20101126101557750 SSO 431100 431200 20101126101557781 +20101126101626352 SSO 431200 431300 20101126101626353 +20101126101616411 SSO 431200 431300 20101126101616411 +20101126101705077 SSO 431300 431400 20101126101705079 +20101126101511131 SSO 431400 431500 20101126101511133 +20101126101632087 SSO 431300 431400 20101126101632087 +20101126101600579 SSO 431100 431200 20101126101600583 +20101126101557099 SSO 431200 431300 20101126101557100 +20101126101557353 SSO 431100 431200 20101126101557353 +20101126101526888 SSO 431400 431500 20101126101526888 +20101126101611100 SSO 431200 431300 20101126101611124 +20101126101536872 SSO 431400 431500 20101126101537188 +20101126101530218 SSO 431300 431400 20101126101530218 +20101126101632059 SSO 431200 431400 20101126101632059 +20101126101605942 SSO 431200 431300 20101126101605942 +20101126101508767 SSO 431300 431400 20101126101508772 +20101126101528425 SSO 431400 431500 20101126101528441 +20101126101505113 SSO 431300 431400 20101126101505114 +20101126101613702 SSO 431400 431500 20101126101613703 +20101126101554312 SSO 431200 431300 20101126101554312 +20101126101613678 SSO 431300 431400 20101126101613679 +20101126101633689 SSO 431300 431400 20101126101633692 +20101126101609871 SSO 431200 431300 20101126101609872 +20101126101618494 SSO 431200 431300 20101126101618494 +20101126101616419 SSO 431200 431300 20101126101616427 +20101126101614143 SSO 431400 431500 20101126101614149 +20101126101536624 SSO 431400 431500 20101126101536624 +20101126101640829 SSO 431300 431400 20101126101640830 +20101126101540724 SSO 431400 431500 20101126101540745 +20101126101633789 SSO 431300 431400 20101126101633789 +20101126101654939 SSO 431300 431400 20101126101654944 +20101126101618805 SSO 431200 431300 20101126101618805 +20101126101601428 SSO 431200 431300 20101126101601428 +20101126101640897 SSO 431300 431400 20101126101640897 +20101126101546940 SSO 431300 431400 20101126101547035 +20101126101537189 SSO 431400 431500 20101126101537189 +20101126101550566 SSO 431200 431400 20101126101550567 +20101126101554091 SSO 431200 431300 20101126101554091 +20101126101557287 SSO 431100 431300 20101126101557288 +20101126101641947 SSO 431300 431400 20101126101641948 +20101126101627624 SSO 431200 431300 20101126101627697 +20101126101546004 SSO 431300 431400 20101126101546005 +20101126101613616 SSO 431300 431400 20101126101613619 +20101126101636030 SSO 431300 431400 20101126101636040 +20101126101522054 SSO 431400 431500 20101126101522055 +20101126101556832 SSO 431200 431300 20101126101556832 +20101126101627719 SSO 431200 431300 20101126101627884 +20101126101617843 SSO 431200 431300 20101126101617857 +20101126101618963 SSO 431200 431300 20101126101618965 +20101126101633631 SSO 431300 431400 20101126101633632 +20101126101527313 SSO 431400 431500 20101126101527327 +20101126101635111 SSO 431300 431400 20101126101635671 +20101126101602139 SSO 431200 431300 20101126101602139 +20101126101633655 SSO 431300 431400 20101126101633656 +20101126101659467 SSO 431200 431300 20101126101659467 +20101126101601001 SSO 431100 431200 20101126101601002 +20101126101633640 SSO 431300 431400 20101126101633640 +20101126101510781 SSO 431400 431500 20101126101510784 +20101126101525913 SSO 431400 431500 20101126101525913 +20101126101631876 SSO 431200 431300 20101126101631876 +20101126101635067 SSO 431300 431400 20101126101635069 +20101126101648009 SSO 431200 431300 20101126101648026 +20101126101633650 SSO 431300 431400 20101126101633650 +20101126101721503 SSO 431400 431500 20101126101721503 +20101126101528421 SSO 431400 431500 20101126101528423 +20101126101642202 SSO 431300 431400 20101126101642203 +20101126101626755 SSO 431200 431300 20101126101626756 +20101126101510701 SSO 431300 431400 20101126101510701 +20101126101539658 SSO 431300 431400 20101126101539674 +20101126101617787 SSO 431200 431300 20101126101617787 +20101126101613732 SSO 431400 431500 20101126101613732 +20101126101510283 SSO 431300 431400 20101126101510283 +20101126101637634 SSO 431300 431400 20101126101637636 +20101126101713136 SSO 431300 431400 20101126101713182 +20101126101740768 SSO 431200 431400 20101126101740768 +20101126101621068 SSO 431200 431300 20101126101621068 +20101126101527054 SSO 431400 431500 20101126101527075 +20101126101624096 SSO 431200 431300 20101126101624096 +20101126101527829 SSO 431400 431500 20101126101527829 +20101126101514062 SSO 431300 431500 20101126101514062 +20101126101527299 SSO 431400 431500 20101126101527300 +20101126101619947 SSO 431200 431300 20101126101619947 +20101126101643416 SSO 431300 431400 20101126101644043 +20101126101627097 SSO 431200 431300 20101126101627098 +20101126101621009 SSO 431200 431300 20101126101621009 +20101126101701870 SSO 431300 431400 20101126101701871 +20101126101641906 SSO 431300 431400 20101126101641906 +20101126101610408 SSO 431200 431300 20101126101610475 +20101126101620143 SSO 431200 431300 20101126101620553 +20101126101647824 SSO 431200 431400 20101126101647826 +20101126101624085 SSO 431200 431300 20101126101624086 +20101126101633789 SSO 431300 431400 20101126101633789 +20101126101624095 SSO 431200 431300 20101126101624095 +20101126101637637 SSO 431200 431400 20101126101637637 +20101126101507642 SSO 431300 431400 20101126101507645 +20101126101754045 SSO 431100 431200 20101126101754045 +20101126101545966 SSO 431300 431400 20101126101545966 +20101126101654848 SSO 431300 431400 20101126101654848 +20101126101637638 SSO 431200 431300 20101126101637639 +20101126101642202 SSO 431300 431400 20101126101642202 +20101126101614913 SSO 431300 431400 20101126101614913 +20101126101645160 SSO 431300 431400 20101126101645163 +20101126101627092 SSO 431200 431300 20101126101627095 +20101126101641465 SSO 431300 431400 20101126101641465 +20101126101642113 SSO 431300 431400 20101126101642113 +20101126101743331 SSO 431100 431200 20101126101743331 +20101126101632104 SSO 431300 431400 20101126101632121 +20101126101557286 SSO 431100 431300 20101126101557286 +20101126101642113 SSO 431300 431400 20101126101642121 +20101126101656213 SSO 431200 431300 20101126101656213 +20101126101627092 SSO 431200 431300 20101126101627092 +20101126101633798 SSO 431300 431400 20101126101633802 +20101126101613732 SSO 431400 431500 20101126101613732 +20101126101642104 SSO 431300 431400 20101126101642104 +20101126101659348 SSO 431200 431300 20101126101659357 +20101126101642391 SSO 431300 431400 20101126101643394 +20101126101630510 SSO 431200 431300 20101126101630511 +20101126101605943 SSO 431200 431300 20101126101605943 +20101126101546400 SSO 431300 431400 20101126101546445 +20101126101719007 SSO 431300 431400 20101126101719008 +20101126101645876 SSO 431300 431400 20101126101645882 +20101126101656317 SSO 431200 431300 20101126101656391 +20101126101627088 SSO 431200 431300 20101126101627089 +20101126101600975 SSO 431100 431200 20101126101600976 +20101126101616413 SSO 431200 431300 20101126101616418 +20101126101637639 SSO 431200 431300 20101126101637639 +20101126101657867 SSO 431200 431300 20101126101657868 +20101126101705964 SSO 431300 431500 20101126101706192 +20101126101645163 SSO 431300 431400 20101126101645173 +20101126101657868 SSO 431200 431300 20101126101657868 +20101126101659870 SSO 431300 431400 20101126101659873 +20101126101637155 SSO 431300 431400 20101126101637272 +20101126101656214 SSO 431200 431300 20101126101656214 +20101126101631770 SSO 431200 431300 20101126101631771 +20101126101611598 SSO 431200 431300 20101126101611600 +20101126101627457 SSO 431200 431300 20101126101627624 +20101126101705074 SSO 431300 431400 20101126101705075 +20101126101613623 SSO 431300 431400 20101126101613625 +20101126101520932 SSO 431400 431500 20101126101520932 +20101126101722493 SSO 431300 431400 20101126101722571 +20101126101643394 SSO 431300 431400 20101126101643395 +20101126101631876 SSO 431200 431300 20101126101631877 +20101126101624085 SSO 431200 431300 20101126101624085 +20101126101659709 SSO 431300 431400 20101126101659711 +20101126101614304 SSO 431300 431400 20101126101614314 +20101126101620584 SSO 431200 431300 20101126101620623 +20101126101700831 SSO 431300 431400 20101126101700832 +20101126101637639 SSO 431200 431300 20101126101637645 +20101126101640824 SSO 431300 431400 20101126101640824 +20101126101613679 SSO 431300 431500 20101126101613680 +20101126101740598 SSO 431300 431400 20101126101740598 +20101126101705059 SSO 431300 431400 20101126101705060 +20101126101742600 SSO 431100 431300 20101126101742600 +20101126101614956 SSO 431300 431400 20101126101614962 +20101126101727413 SSO 431400 431500 20101126101727697 +20101126101644415 SSO 431300 431400 20101126101644638 +20101126101706680 SSO 431400 431500 20101126101706680 +20101126101627081 SSO 431200 431300 20101126101627081 +20101126101639788 SSO 431200 431300 20101126101639788 +20101126101730435 SSO 431400 431500 20101126101730435 +20101126101606745 SSO 431200 431300 20101126101606745 +20101126101637637 SSO 431200 431400 20101126101637637 +20101126101701211 SSO 431300 431400 20101126101701268 +20101126101706681 SSO 431400 431500 20101126101706682 +20101126101710296 SSO 431400 431500 20101126101710550 +20101126101645118 SSO 431300 431400 20101126101645119 +20101126101614925 SSO 431300 431400 20101126101614925 +20101126101656215 SSO 431200 431300 20101126101656215 +20101126101645882 SSO 431300 431400 20101126101646049 +20101126101635964 SSO 431300 431500 20101126101636009 +20101126101648873 SSO 431200 431300 20101126101648873 +20101126101642311 SSO 431300 431400 20101126101642389 +20101126101702349 SSO 431300 431400 20101126101702350 +20101126101659855 SSO 431300 431400 20101126101659856 +20101126101659662 SSO 431300 431400 20101126101659662 +20101126101712546 SSO 431300 431400 20101126101712547 +20101126101645163 SSO 431300 431400 20101126101645163 +20101126101712871 SSO 431300 431400 20101126101712872 +20101126101657875 SSO 431200 431300 20101126101657875 +20101126101704294 SSO 431300 431400 20101126101704306 +20101126101647833 SSO 431200 431300 20101126101647833 +20101126101657872 SSO 431200 431300 20101126101657873 +20101126101647833 SSO 431200 431300 20101126101647833 +20101126101654848 SSO 431300 431400 20101126101654849 +20101126101646191 SSO 431300 431400 20101126101646333 +20101126101632079 SSO 431300 431400 20101126101632080 +20101126101648046 SSO 431200 431300 20101126101648046 +20101126101640966 SSO 431300 431400 20101126101640967 +20101126101642207 SSO 431300 431400 20101126101642216 +20101126101613695 SSO 431400 431500 20101126101613695 +20101126101642111 SSO 431300 431400 20101126101642111 +20101126101659705 SSO 431300 431400 20101126101659708 +20101126101530174 SSO 431400 431500 20101126101530174 +20101126101607223 SSO 431200 431300 20101126101607248 +20101126101722446 SSO 431300 431400 20101126101722446 +20101126101655142 SSO 431300 431400 20101126101655142 +20101126101717733 SSO 431200 431400 20101126101717924 +\. + + + +CREATE INDEX my_tq_agg_small_ets_end_ts_ix ON my_tq_agg_small USING btree (ets, end_ts); + + +analyze my_tq_agg_small; +analyze my_tt_agg_small; +set optimizer_enable_indexjoin=on; +set optimizer_nestloop_factor = 1.0; +-- force_explain +EXPLAIN +SELECT (tt.event_ts / 100000) / 5 * 5 as fivemin, COUNT(*) +FROM my_tt_agg_small tt, my_tq_agg_small tq +WHERE tq.sym = tt.symbol AND + tt.event_ts >= tq.ets AND + tt.event_ts < tq.end_ts +GROUP BY 1 +ORDER BY 1 asc ; + +SELECT (tt.event_ts / 100000) / 5 * 5 as fivemin, COUNT(*) +FROM my_tt_agg_small tt, my_tq_agg_small tq +WHERE tq.sym = tt.symbol AND + tt.event_ts >= tq.ets AND + tt.event_ts < tq.end_ts +GROUP BY 1 +ORDER BY 1 asc ; + +set optimizer_enable_hashjoin = off; +set enable_hashjoin=off; +set enable_seqscan=off; +set enable_mergejoin=off; +set enable_nestloop=on; +set enable_indexscan=on; + +-- start_ignore +-- Known_opt_diff: OPT-929 +-- end_ignore +-- force_explain +set optimizer_segments = 2; +set optimizer_nestloop_factor = 1.0; +EXPLAIN +SELECT (tt.event_ts / 100000) / 5 * 5 as fivemin, COUNT(*) +FROM my_tt_agg_small tt, my_tq_agg_small tq +WHERE tq.sym = tt.symbol AND + tt.event_ts >= tq.ets AND + tt.event_ts < tq.end_ts +GROUP BY 1 +ORDER BY 1 asc ; + +reset optimizer_segments; +reset optimizer_nestloop_factor; +SELECT (tt.event_ts / 100000) / 5 * 5 as fivemin, COUNT(*) +FROM my_tt_agg_small tt, my_tq_agg_small tq +WHERE tq.sym = tt.symbol AND + tt.event_ts >= tq.ets AND + tt.event_ts < tq.end_ts +GROUP BY 1 +ORDER BY 1 asc ; + +-- Test Index Scan on CO table as the right tree of a NestLoop join. +create table no_index_table(fake_col1 int, fake_col2 int, fake_col3 int, a int, b int); +insert into no_index_table values (1,1,1,1,1); +analyze no_index_table; + +create table with_index_table(x int, y int) with (appendonly=true, orientation=column); +create index with_index_table_index on with_index_table (x); +insert into with_index_table select i, 1 from generate_series(1, 20)i; +analyze with_index_table; + +set enable_material to off; +set enable_seqscan to off; +set enable_mergejoin to off; +set enable_hashjoin to off; +set enable_nestloop to on; + +set optimizer_enable_materialize to off; +set optimizer_enable_hashjoin to off; + +explain (costs off) +SELECT * from with_index_table td JOIN no_index_table ro ON td.y = ro.a AND td.x = ro.b; +SELECT * from with_index_table td JOIN no_index_table ro ON td.y = ro.a AND td.x = ro.b; + +reset all; diff --git a/src/test/singlenode_regress/sql/indirect_toast.sql b/src/test/singlenode_regress/sql/indirect_toast.sql new file mode 100644 index 00000000000..9156a44b7d9 --- /dev/null +++ b/src/test/singlenode_regress/sql/indirect_toast.sql @@ -0,0 +1,71 @@ +-- +-- Tests for external toast datums +-- + +-- Other compression algorithms may cause the compressed data to be stored +-- inline. pglz guarantees that the data is externalized, so stick to it. +SET default_toast_compression = 'pglz'; + +CREATE TABLE indtoasttest(descr text, cnt int DEFAULT 0, f1 text, f2 text); + +INSERT INTO indtoasttest(descr, f1, f2) VALUES('two-compressed', repeat('1234567890',1000), repeat('1234567890',1000)); +INSERT INTO indtoasttest(descr, f1, f2) VALUES('two-toasted', repeat('1234567890',30000), repeat('1234567890',50000)); +INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-compressed,one-null', NULL, repeat('1234567890',1000)); +INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-toasted,one-null', NULL, repeat('1234567890',50000)); + +-- check whether indirect tuples works on the most basic level +SELECT descr, substring(make_tuple_indirect(indtoasttest)::text, 1, 200) FROM indtoasttest; + +-- modification without changing varlenas +UPDATE indtoasttest SET cnt = cnt +1 RETURNING substring(indtoasttest::text, 1, 200); + +-- modification without modifying assigned value +UPDATE indtoasttest SET cnt = cnt +1, f1 = f1 RETURNING substring(indtoasttest::text, 1, 200); + +-- modification modifying, but effectively not changing +UPDATE indtoasttest SET cnt = cnt +1, f1 = f1||'' RETURNING substring(indtoasttest::text, 1, 200); + +UPDATE indtoasttest SET cnt = cnt +1, f1 = '-'||f1||'-' RETURNING substring(indtoasttest::text, 1, 200); + +SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest; +-- check we didn't screw with main/toast tuple visibility +VACUUM FREEZE indtoasttest; +SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest; + +-- now create a trigger that forces all Datums to be indirect ones +CREATE FUNCTION update_using_indirect() + RETURNS trigger + LANGUAGE plpgsql AS $$ +BEGIN + NEW := make_tuple_indirect(NEW); + RETURN NEW; +END$$; + +CREATE TRIGGER indtoasttest_update_indirect + BEFORE INSERT OR UPDATE + ON indtoasttest + FOR EACH ROW + EXECUTE PROCEDURE update_using_indirect(); + +-- modification without changing varlenas +UPDATE indtoasttest SET cnt = cnt +1 RETURNING substring(indtoasttest::text, 1, 200); + +-- modification without modifying assigned value +UPDATE indtoasttest SET cnt = cnt +1, f1 = f1 RETURNING substring(indtoasttest::text, 1, 200); + +-- modification modifying, but effectively not changing +UPDATE indtoasttest SET cnt = cnt +1, f1 = f1||'' RETURNING substring(indtoasttest::text, 1, 200); + +UPDATE indtoasttest SET cnt = cnt +1, f1 = '-'||f1||'-' RETURNING substring(indtoasttest::text, 1, 200); + +INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-toasted,one-null, via indirect', repeat('1234567890',30000), NULL); + +SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest; +-- check we didn't screw with main/toast tuple visibility +VACUUM FREEZE indtoasttest; +SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest; + +DROP TABLE indtoasttest; +DROP FUNCTION update_using_indirect(); + +RESET default_toast_compression; diff --git a/src/test/singlenode_regress/sql/inet.sql b/src/test/singlenode_regress/sql/inet.sql new file mode 100644 index 00000000000..d2ac85bb7f0 --- /dev/null +++ b/src/test/singlenode_regress/sql/inet.sql @@ -0,0 +1,254 @@ +-- +-- INET +-- + +-- prepare the table... + +DROP TABLE INET_TBL; +CREATE TABLE INET_TBL (c cidr, i inet); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.226/24'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1.0/26', '192.168.1.226'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.0/24'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.0/25'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.255/24'); +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1', '192.168.1.255/25'); +INSERT INTO INET_TBL (c, i) VALUES ('10', '10.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10.0.0.0', '10.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10.1.2.3', '10.1.2.3/32'); +INSERT INTO INET_TBL (c, i) VALUES ('10.1.2', '10.1.2.3/24'); +INSERT INTO INET_TBL (c, i) VALUES ('10.1', '10.1.2.3/16'); +INSERT INTO INET_TBL (c, i) VALUES ('10', '10.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10', '11.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10', '9.1.2.3/8'); +INSERT INTO INET_TBL (c, i) VALUES ('10:23::f1', '10:23::f1/64'); +INSERT INTO INET_TBL (c, i) VALUES ('10:23::8000/113', '10:23::ffff'); +INSERT INTO INET_TBL (c, i) VALUES ('::ffff:1.2.3.4', '::4.3.2.1/24'); +-- check that CIDR rejects invalid input: +INSERT INTO INET_TBL (c, i) VALUES ('192.168.1.2/30', '192.168.1.226'); +INSERT INTO INET_TBL (c, i) VALUES ('1234::1234::1234', '::1.2.3.4'); +-- check that CIDR rejects invalid input when converting from text: +INSERT INTO INET_TBL (c, i) VALUES (cidr('192.168.1.2/30'), '192.168.1.226'); +INSERT INTO INET_TBL (c, i) VALUES (cidr('ffff:ffff:ffff:ffff::/24'), '::192.168.1.226'); +SELECT c AS cidr, i AS inet FROM INET_TBL; + +-- now test some support functions + +SELECT i AS inet, host(i), text(i), family(i) FROM INET_TBL; +SELECT c AS cidr, abbrev(c) FROM INET_TBL; +SELECT c AS cidr, broadcast(c), + i AS inet, broadcast(i) FROM INET_TBL; +SELECT c AS cidr, network(c) AS "network(cidr)", + i AS inet, network(i) AS "network(inet)" FROM INET_TBL; +SELECT c AS cidr, masklen(c) AS "masklen(cidr)", + i AS inet, masklen(i) AS "masklen(inet)" FROM INET_TBL; + +SELECT c AS cidr, masklen(c) AS "masklen(cidr)", + i AS inet, masklen(i) AS "masklen(inet)" FROM INET_TBL + WHERE masklen(c) <= 8; + +SELECT c AS cidr, i AS inet FROM INET_TBL + WHERE c = i; + +SELECT i, c, + i < c AS lt, i <= c AS le, i = c AS eq, + i >= c AS ge, i > c AS gt, i <> c AS ne, + i << c AS sb, i <<= c AS sbe, + i >> c AS sup, i >>= c AS spe, + i && c AS ovr + FROM INET_TBL; + +SELECT max(i) AS max, min(i) AS min FROM INET_TBL; +SELECT max(c) AS max, min(c) AS min FROM INET_TBL; + +-- check the conversion to/from text and set_netmask +SELECT set_masklen(inet(text(i)), 24) FROM INET_TBL; + +-- check that btree index works correctly +CREATE INDEX inet_idx1 ON inet_tbl(i); +SET enable_seqscan TO off; +EXPLAIN (COSTS OFF) +SELECT * FROM inet_tbl WHERE i<<'192.168.1.0/24'::cidr; +SELECT * FROM inet_tbl WHERE i<<'192.168.1.0/24'::cidr; +EXPLAIN (COSTS OFF) +SELECT * FROM inet_tbl WHERE i<<='192.168.1.0/24'::cidr; +SELECT * FROM inet_tbl WHERE i<<='192.168.1.0/24'::cidr; +EXPLAIN (COSTS OFF) +SELECT * FROM inet_tbl WHERE '192.168.1.0/24'::cidr >>= i; +SELECT * FROM inet_tbl WHERE '192.168.1.0/24'::cidr >>= i; +EXPLAIN (COSTS OFF) +SELECT * FROM inet_tbl WHERE '192.168.1.0/24'::cidr >> i; +SELECT * FROM inet_tbl WHERE '192.168.1.0/24'::cidr >> i; +SET enable_seqscan TO on; +DROP INDEX inet_idx1; + +-- check that gist index works correctly +CREATE INDEX inet_idx2 ON inet_tbl using gist (i inet_ops); +SET enable_seqscan TO off; +SELECT * FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i <<= '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i && '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i >>= '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i >> '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i < '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i <= '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i = '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i >= '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i > '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i <> '192.168.1.0/24'::cidr ORDER BY i; + +-- test index-only scans +EXPLAIN (COSTS OFF) +SELECT i FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; +SELECT i FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; + +SET enable_seqscan TO on; +DROP INDEX inet_idx2; + +-- check that spgist index works correctly +CREATE INDEX inet_idx3 ON inet_tbl using spgist (i); +SET enable_seqscan TO off; +SELECT * FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i <<= '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i && '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i >>= '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i >> '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i < '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i <= '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i = '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i >= '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i > '192.168.1.0/24'::cidr ORDER BY i; +SELECT * FROM inet_tbl WHERE i <> '192.168.1.0/24'::cidr ORDER BY i; + +-- test index-only scans +EXPLAIN (COSTS OFF) +SELECT i FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; +SELECT i FROM inet_tbl WHERE i << '192.168.1.0/24'::cidr ORDER BY i; + +SET enable_seqscan TO on; +DROP INDEX inet_idx3; + +-- simple tests of inet boolean and arithmetic operators +SELECT i, ~i AS "~i" FROM inet_tbl; +SELECT i, c, i & c AS "and" FROM inet_tbl; +SELECT i, c, i | c AS "or" FROM inet_tbl; +SELECT i, i + 500 AS "i+500" FROM inet_tbl; +SELECT i, i - 500 AS "i-500" FROM inet_tbl; +SELECT i, c, i - c AS "minus" FROM inet_tbl; +SELECT '127.0.0.1'::inet + 257; +SELECT ('127.0.0.1'::inet + 257) - 257; +SELECT '127::1'::inet + 257; +SELECT ('127::1'::inet + 257) - 257; +SELECT '127.0.0.2'::inet - ('127.0.0.2'::inet + 500); +SELECT '127.0.0.2'::inet - ('127.0.0.2'::inet - 500); +SELECT '127::2'::inet - ('127::2'::inet + 500); +SELECT '127::2'::inet - ('127::2'::inet - 500); +-- these should give overflow errors: +SELECT '127.0.0.1'::inet + 10000000000; +SELECT '127.0.0.1'::inet - 10000000000; +SELECT '126::1'::inet - '127::2'::inet; +SELECT '127::1'::inet - '126::2'::inet; +-- but not these +SELECT '127::1'::inet + 10000000000; +SELECT '127::1'::inet - '127::2'::inet; + +-- insert one more row with addressed from different families +INSERT INTO INET_TBL (c, i) VALUES ('10', '10::/8'); +-- now, this one should fail +SELECT inet_merge(c, i) FROM INET_TBL; +-- fix it by inet_same_family() condition +SELECT inet_merge(c, i) FROM INET_TBL WHERE inet_same_family(c, i); + +-- Test inet sortsupport with a variety of boundary inputs: +SELECT a FROM (VALUES + ('0.0.0.0/0'::inet), + ('0.0.0.0/1'::inet), + ('0.0.0.0/32'::inet), + ('0.0.0.1/0'::inet), + ('0.0.0.1/1'::inet), + ('127.126.127.127/0'::inet), + ('127.127.127.127/0'::inet), + ('127.128.127.127/0'::inet), + ('192.168.1.0/24'::inet), + ('192.168.1.0/25'::inet), + ('192.168.1.1/23'::inet), + ('192.168.1.1/5'::inet), + ('192.168.1.1/6'::inet), + ('192.168.1.1/25'::inet), + ('192.168.1.2/25'::inet), + ('192.168.1.1/26'::inet), + ('192.168.1.2/26'::inet), + ('192.168.1.2/23'::inet), + ('192.168.1.255/5'::inet), + ('192.168.1.255/6'::inet), + ('192.168.1.3/1'::inet), + ('192.168.1.3/23'::inet), + ('192.168.1.4/0'::inet), + ('192.168.1.5/0'::inet), + ('255.0.0.0/0'::inet), + ('255.1.0.0/0'::inet), + ('255.2.0.0/0'::inet), + ('255.255.000.000/0'::inet), + ('255.255.000.000/0'::inet), + ('255.255.000.000/15'::inet), + ('255.255.000.000/16'::inet), + ('255.255.255.254/32'::inet), + ('255.255.255.000/32'::inet), + ('255.255.255.001/31'::inet), + ('255.255.255.002/31'::inet), + ('255.255.255.003/31'::inet), + ('255.255.255.003/32'::inet), + ('255.255.255.001/32'::inet), + ('255.255.255.255/0'::inet), + ('255.255.255.255/0'::inet), + ('255.255.255.255/0'::inet), + ('255.255.255.255/1'::inet), + ('255.255.255.255/16'::inet), + ('255.255.255.255/16'::inet), + ('255.255.255.255/31'::inet), + ('255.255.255.255/32'::inet), + ('255.255.255.253/32'::inet), + ('255.255.255.252/32'::inet), + ('255.3.0.0/0'::inet), + ('0000:0000:0000:0000:0000:0000:0000:0000/0'::inet), + ('0000:0000:0000:0000:0000:0000:0000:0000/128'::inet), + ('0000:0000:0000:0000:0000:0000:0000:0001/128'::inet), + ('10:23::f1/64'::inet), + ('10:23::f1/65'::inet), + ('10:23::ffff'::inet), + ('127::1'::inet), + ('127::2'::inet), + ('8000:0000:0000:0000:0000:0000:0000:0000/1'::inet), + ('::1:ffff:ffff:ffff:ffff/128'::inet), + ('::2:ffff:ffff:ffff:ffff/128'::inet), + ('::4:3:2:0/24'::inet), + ('::4:3:2:1/24'::inet), + ('::4:3:2:2/24'::inet), + ('ffff:83e7:f118:57dc:6093:6d92:689d:58cf/70'::inet), + ('ffff:84b0:4775:536e:c3ed:7116:a6d6:34f0/44'::inet), + ('ffff:8566:f84:5867:47f1:7867:d2ba:8a1a/69'::inet), + ('ffff:8883:f028:7d2:4d68:d510:7d6b:ac43/73'::inet), + ('ffff:8ae8:7c14:65b3:196:8e4a:89ae:fb30/89'::inet), + ('ffff:8dd0:646:694c:7c16:7e35:6a26:171/104'::inet), + ('ffff:8eef:cbf:700:eda3:ae32:f4b4:318b/121'::inet), + ('ffff:90e7:e744:664:a93:8efe:1f25:7663/122'::inet), + ('ffff:9597:c69c:8b24:57a:8639:ec78:6026/111'::inet), + ('ffff:9e86:79ea:f16e:df31:8e4d:7783:532e/88'::inet), + ('ffff:a0c7:82d3:24de:f762:6e1f:316d:3fb2/23'::inet), + ('ffff:fffa:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:fffb:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:fffc:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:fffd:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:fffe:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffa:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffb:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffc:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffd::/128'::inet), + ('ffff:ffff:ffff:fffd:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:fffe::/128'::inet), + ('ffff:ffff:ffff:fffe:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:ffff:4:3:2:0/24'::inet), + ('ffff:ffff:ffff:ffff:4:3:2:1/24'::inet), + ('ffff:ffff:ffff:ffff:4:3:2:2/24'::inet), + ('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/0'::inet), + ('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::inet) +) AS i(a) ORDER BY a; diff --git a/src/test/singlenode_regress/sql/infinite_recurse.sql b/src/test/singlenode_regress/sql/infinite_recurse.sql new file mode 100644 index 00000000000..151dba4a7ae --- /dev/null +++ b/src/test/singlenode_regress/sql/infinite_recurse.sql @@ -0,0 +1,29 @@ +-- Check that stack depth detection mechanism works and +-- max_stack_depth is not set too high. + +create function infinite_recurse() returns int as +'select infinite_recurse()' language sql; + +-- Unfortunately, up till mid 2020 the Linux kernel had a bug in PPC64 +-- signal handling that would cause this test to crash if it happened +-- to receive an sinval catchup interrupt while the stack is deep: +-- https://bugzilla.kernel.org/show_bug.cgi?id=205183 +-- It is likely to be many years before that bug disappears from all +-- production kernels, so disable this test on such platforms. +-- (We still create the function, so as not to have a cross-platform +-- difference in the end state of the regression database.) + +SELECT version() ~ 'powerpc64[^,]*-linux-gnu' + AS skip_test \gset +\if :skip_test +\quit +\endif + +-- The full error report is not very stable, so we show only SQLSTATE +-- and primary error message. + +\set VERBOSITY sqlstate + +select infinite_recurse(); + +\echo :LAST_ERROR_MESSAGE diff --git a/src/test/singlenode_regress/sql/inherit.sql b/src/test/singlenode_regress/sql/inherit.sql new file mode 100644 index 00000000000..c2ed0c0bd66 --- /dev/null +++ b/src/test/singlenode_regress/sql/inherit.sql @@ -0,0 +1,1019 @@ +-- +-- Test inheritance features +-- +CREATE TABLE a (aa TEXT); +CREATE TABLE b (bb TEXT) INHERITS (a); +CREATE TABLE c (cc TEXT) INHERITS (a); +CREATE TABLE d (dd TEXT) INHERITS (b,c,a); + +INSERT INTO a(aa) VALUES('aaa'); +INSERT INTO a(aa) VALUES('aaaa'); +INSERT INTO a(aa) VALUES('aaaaa'); +INSERT INTO a(aa) VALUES('aaaaaa'); +INSERT INTO a(aa) VALUES('aaaaaaa'); +INSERT INTO a(aa) VALUES('aaaaaaaa'); + +INSERT INTO b(aa) VALUES('bbb'); +INSERT INTO b(aa) VALUES('bbbb'); +INSERT INTO b(aa) VALUES('bbbbb'); +INSERT INTO b(aa) VALUES('bbbbbb'); +INSERT INTO b(aa) VALUES('bbbbbbb'); +INSERT INTO b(aa) VALUES('bbbbbbbb'); + +INSERT INTO c(aa) VALUES('ccc'); +INSERT INTO c(aa) VALUES('cccc'); +INSERT INTO c(aa) VALUES('ccccc'); +INSERT INTO c(aa) VALUES('cccccc'); +INSERT INTO c(aa) VALUES('ccccccc'); +INSERT INTO c(aa) VALUES('cccccccc'); + +INSERT INTO d(aa) VALUES('ddd'); +INSERT INTO d(aa) VALUES('dddd'); +INSERT INTO d(aa) VALUES('ddddd'); +INSERT INTO d(aa) VALUES('dddddd'); +INSERT INTO d(aa) VALUES('ddddddd'); +INSERT INTO d(aa) VALUES('dddddddd'); + +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + +UPDATE a SET aa='zzzz' WHERE aa='aaaa'; +UPDATE ONLY a SET aa='zzzzz' WHERE aa='aaaaa'; +UPDATE b SET aa='zzz' WHERE aa='aaa'; +UPDATE ONLY b SET aa='zzz' WHERE aa='aaa'; +UPDATE a SET aa='zzzzzz' WHERE aa LIKE 'aaa%'; + +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + +UPDATE b SET aa='new'; + +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + +UPDATE a SET aa='new'; + +DELETE FROM ONLY c WHERE aa='new'; + +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + +DELETE FROM a; + +SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid; +SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid; +SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid; +SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid; +SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; + +-- Confirm PRIMARY KEY adds NOT NULL constraint to child table +CREATE TEMP TABLE z (b TEXT, PRIMARY KEY(aa, b)) inherits (a); +INSERT INTO z VALUES (NULL, 'text'); -- should fail + +-- Check inherited UPDATE with all children excluded +create table some_tab (a int, b int); +create table some_tab_child () inherits (some_tab); +insert into some_tab_child values(1,2); + +explain (verbose, costs off) +update some_tab set a = a + 1 where false; +update some_tab set a = a + 1 where false; +explain (verbose, costs off) +update some_tab set a = a + 1 where false returning b, a; +update some_tab set a = a + 1 where false returning b, a; +table some_tab; + +drop table some_tab cascade; + +-- Check UPDATE with inherited target and an inherited source table +create temp table foo(f1 int, f2 int); +create temp table foo2(f3 int) inherits (foo); +create temp table bar(f1 int, f2 int); +create temp table bar2(f3 int) inherits (bar); + +insert into foo values(1,1); +insert into foo values(3,3); +insert into foo2 values(2,2,2); +insert into foo2 values(3,3,3); +insert into bar values(1,1); +insert into bar values(2,2); +insert into bar values(3,3); +insert into bar values(4,4); +insert into bar2 values(1,1,1); +insert into bar2 values(2,2,2); +insert into bar2 values(3,3,3); +insert into bar2 values(4,4,4); + +update bar set f2 = f2 + 100 where f1 in (select f1 from foo); + +select tableoid::regclass::text as relname, bar.* from bar order by 1,2; + +-- Check UPDATE with inherited target and an appendrel subquery +update bar set f2 = f2 + 100 +from + ( select f1 from foo union all select f1+3 from foo ) ss +where bar.f1 = ss.f1; + +select tableoid::regclass::text as relname, bar.* from bar order by 1,2; + +-- Check UPDATE with *partitioned* inherited target and an appendrel subquery +create table some_tab (a int); +insert into some_tab values (0); +create table some_tab_child () inherits (some_tab); +insert into some_tab_child values (1); +create table parted_tab (a int, b char) partition by list (a); +create table parted_tab_part1 partition of parted_tab for values in (1); +create table parted_tab_part2 partition of parted_tab for values in (2); +create table parted_tab_part3 partition of parted_tab for values in (3); +insert into parted_tab values (1, 'a'), (2, 'a'), (3, 'a'); + +update parted_tab set b = 'b' +from + (select a from some_tab union all select a+1 from some_tab) ss (a) +where parted_tab.a = ss.a; +select tableoid::regclass::text as relname, parted_tab.* from parted_tab order by 1,2; + +truncate parted_tab; +insert into parted_tab values (1, 'a'), (2, 'a'), (3, 'a'); +update parted_tab set b = 'b' +from + (select 0 from parted_tab union all select 1 from parted_tab) ss (a) +where parted_tab.a = ss.a; +select tableoid::regclass::text as relname, parted_tab.* from parted_tab order by 1,2; + +-- modifies partition key, but no rows will actually be updated +explain update parted_tab set a = 2 where false; + +drop table parted_tab; + +-- Check UPDATE with multi-level partitioned inherited target +create table mlparted_tab (a int, b char, c text) partition by list (a); +create table mlparted_tab_part1 partition of mlparted_tab for values in (1); +create table mlparted_tab_part2 partition of mlparted_tab for values in (2) partition by list (b); +create table mlparted_tab_part3 partition of mlparted_tab for values in (3); +create table mlparted_tab_part2a partition of mlparted_tab_part2 for values in ('a'); +create table mlparted_tab_part2b partition of mlparted_tab_part2 for values in ('b'); +insert into mlparted_tab values (1, 'a'), (2, 'a'), (2, 'b'), (3, 'a'); + +update mlparted_tab mlp set c = 'xxx' +from + (select a from some_tab union all select a+1 from some_tab) ss (a) +where (mlp.a = ss.a and mlp.b = 'b') or mlp.a = 3; +select tableoid::regclass::text as relname, mlparted_tab.* from mlparted_tab order by 1,2; + +drop table mlparted_tab; +drop table some_tab cascade; + +/* Test multiple inheritance of column defaults */ + +CREATE TABLE firstparent (tomorrow date default now()::date + 1); +CREATE TABLE secondparent (tomorrow date default now() :: date + 1); +CREATE TABLE jointchild () INHERITS (firstparent, secondparent); -- ok +CREATE TABLE thirdparent (tomorrow date default now()::date - 1); +CREATE TABLE otherchild () INHERITS (firstparent, thirdparent); -- not ok +CREATE TABLE otherchild (tomorrow date default now()) + INHERITS (firstparent, thirdparent); -- ok, child resolves ambiguous default + +DROP TABLE firstparent, secondparent, jointchild, thirdparent, otherchild; + +-- Test changing the type of inherited columns +insert into d values('test','one','two','three'); +alter table z drop constraint z_pkey; +alter table a alter column aa type integer using bit_length(aa); +select * from d; + +-- The above verified that we can change the type of a multiply-inherited +-- column; but we should reject that if any definition was inherited from +-- an unrelated parent. +create temp table parent1(f1 int, f2 int); +create temp table parent2(f1 int, f3 bigint); +create temp table childtab(f4 int) inherits(parent1, parent2); +alter table parent1 alter column f1 type bigint; -- fail, conflict w/parent2 +alter table parent1 alter column f2 type bigint; -- ok + +-- Test non-inheritable parent constraints +create table p1(ff1 int); +alter table p1 add constraint p1chk check (ff1 > 0) no inherit; +alter table p1 add constraint p2chk check (ff1 > 10); +-- connoinherit should be true for NO INHERIT constraint +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pgc.connoinherit from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname = 'p1' order by 1,2; + +-- Test that child does not inherit NO INHERIT constraints +create table c1 () inherits (p1); +\d p1 +\d c1 + +-- Test that child does not override inheritable constraints of the parent +create table c2 (constraint p2chk check (ff1 > 10) no inherit) inherits (p1); --fails + +drop table p1 cascade; + +-- Tests for casting between the rowtypes of parent and child +-- tables. See the pgsql-hackers thread beginning Dec. 4/04 +create table base (i integer); +create table derived () inherits (base); +create table more_derived (like derived, b int) inherits (derived); +insert into derived (i) values (0); +select derived::base from derived; +select NULL::derived::base; +-- remove redundant conversions. +explain (verbose on, costs off) select row(i, b)::more_derived::derived::base from more_derived; +explain (verbose on, costs off) select (1, 2)::more_derived::derived::base; +drop table more_derived; +drop table derived; +drop table base; + +create table p1(ff1 int); +create table p2(f1 text); +create function p2text(p2) returns text as 'select $1.f1' language sql; +create table c1(f3 int) inherits(p1,p2); +insert into c1 values(123456789, 'hi', 42); +select p2text(c1.*) from c1; +drop function p2text(p2); +drop table c1; +drop table p2; +drop table p1; + +CREATE TABLE ac (aa TEXT); +alter table ac add constraint ac_check check (aa is not null); +CREATE TABLE bc (bb TEXT) INHERITS (ac); +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + +insert into ac (aa) values (NULL); +insert into bc (aa) values (NULL); + +alter table bc drop constraint ac_check; -- fail, disallowed +alter table ac drop constraint ac_check; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + +-- try the unnamed-constraint case +alter table ac add check (aa is not null); +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + +insert into ac (aa) values (NULL); +insert into bc (aa) values (NULL); + +alter table bc drop constraint ac_aa_check; -- fail, disallowed +alter table ac drop constraint ac_aa_check; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + +alter table ac add constraint ac_check check (aa is not null); +alter table bc no inherit ac; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; +alter table bc drop constraint ac_check; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; +alter table ac drop constraint ac_check; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + +drop table bc; +drop table ac; + +create table ac (a int constraint check_a check (a <> 0)); +create table bc (a int constraint check_a check (a <> 0), b int constraint check_b check (b <> 0)) inherits (ac); +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc') order by 1,2; + +drop table bc; +drop table ac; + +create table ac (a int constraint check_a check (a <> 0)); +create table bc (b int constraint check_b check (b <> 0)); +create table cc (c int constraint check_c check (c <> 0)) inherits (ac, bc); +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc', 'cc') order by 1,2; + +alter table cc no inherit bc; +select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pg_get_expr(pgc.conbin, pc.oid) as consrc from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname in ('ac', 'bc', 'cc') order by 1,2; + +drop table cc; +drop table bc; +drop table ac; + +create table p1(f1 int); +create table p2(f2 int); +create table c1(f3 int) inherits(p1,p2); +insert into c1 values(1,-1,2); +alter table p2 add constraint cc check (f2>0); -- fail +alter table p2 add check (f2>0); -- check it without a name, too +delete from c1; +insert into c1 values(1,1,2); +alter table p2 add check (f2>0); +insert into c1 values(1,-1,2); -- fail +create table c2(f3 int) inherits(p1,p2); +\d c2 +create table c3 (f4 int) inherits(c1,c2); +\d c3 +drop table p1 cascade; +drop table p2 cascade; + +create table pp1 (f1 int); +create table cc1 (f2 text, f3 int) inherits (pp1); +alter table pp1 add column a1 int check (a1 > 0); +\d cc1 +create table cc2(f4 float) inherits(pp1,cc1); +\d cc2 +alter table pp1 add column a2 int check (a2 > 0); +\d cc2 +drop table pp1 cascade; + +-- Test for renaming in simple multiple inheritance +CREATE TABLE inht1 (a int, b int); +CREATE TABLE inhs1 (b int, c int); +CREATE TABLE inhts (d int) INHERITS (inht1, inhs1); + +ALTER TABLE inht1 RENAME a TO aa; +ALTER TABLE inht1 RENAME b TO bb; -- to be failed +ALTER TABLE inhts RENAME aa TO aaa; -- to be failed +ALTER TABLE inhts RENAME d TO dd; +\d+ inhts + +DROP TABLE inhts; + +-- Test for renaming in diamond inheritance +CREATE TABLE inht2 (x int) INHERITS (inht1); +CREATE TABLE inht3 (y int) INHERITS (inht1); +CREATE TABLE inht4 (z int) INHERITS (inht2, inht3); + +ALTER TABLE inht1 RENAME aa TO aaa; +\d+ inht4 + +CREATE TABLE inhts (d int) INHERITS (inht2, inhs1); +ALTER TABLE inht1 RENAME aaa TO aaaa; +ALTER TABLE inht1 RENAME b TO bb; -- to be failed +\d+ inhts + +WITH RECURSIVE r AS ( + SELECT 'inht1'::regclass AS inhrelid +UNION ALL + SELECT c.inhrelid FROM pg_inherits c, r WHERE r.inhrelid = c.inhparent +) +SELECT a.attrelid::regclass, a.attname, a.attinhcount, e.expected + FROM (SELECT inhrelid, count(*) AS expected FROM pg_inherits + WHERE inhparent IN (SELECT inhrelid FROM r) GROUP BY inhrelid) e + JOIN pg_attribute a ON e.inhrelid = a.attrelid WHERE NOT attislocal + ORDER BY a.attrelid::regclass::name, a.attnum; + +DROP TABLE inht1, inhs1 CASCADE; + + +-- Test non-inheritable indices [UNIQUE, EXCLUDE] constraints +CREATE TABLE test_constraints (id int, val1 varchar, val2 int, UNIQUE(val1, val2)); +CREATE TABLE test_constraints_inh () INHERITS (test_constraints); +\d+ test_constraints +ALTER TABLE ONLY test_constraints DROP CONSTRAINT test_constraints_val1_val2_key; +\d+ test_constraints +\d+ test_constraints_inh +DROP TABLE test_constraints_inh; +DROP TABLE test_constraints; + +CREATE TABLE test_ex_constraints ( + c circle, + dkey inet, + EXCLUDE USING gist (dkey inet_ops WITH =, c WITH &&) +); + +CREATE TABLE test_ex_constraints_inh () INHERITS (test_ex_constraints); +\d+ test_ex_constraints +ALTER TABLE test_ex_constraints DROP CONSTRAINT test_ex_constraints_dkey_c_excl; +\d+ test_ex_constraints +\d+ test_ex_constraints_inh +DROP TABLE test_ex_constraints_inh; +DROP TABLE test_ex_constraints; + +-- Test non-inheritable foreign key constraints +CREATE TABLE test_primary_constraints(id int PRIMARY KEY); +CREATE TABLE test_foreign_constraints(id1 int REFERENCES test_primary_constraints(id)); +CREATE TABLE test_foreign_constraints_inh () INHERITS (test_foreign_constraints); +\d+ test_primary_constraints +\d+ test_foreign_constraints +ALTER TABLE test_foreign_constraints DROP CONSTRAINT test_foreign_constraints_id1_fkey; +\d+ test_foreign_constraints +\d+ test_foreign_constraints_inh +DROP TABLE test_foreign_constraints_inh; +DROP TABLE test_foreign_constraints; +DROP TABLE test_primary_constraints; + +-- Test foreign key behavior +create table inh_fk_1 (a int primary key); +insert into inh_fk_1 values (1), (2), (3); +create table inh_fk_2 (x int primary key, y int references inh_fk_1 on delete cascade); +insert into inh_fk_2 values (11, 1), (22, 2), (33, 3); +create table inh_fk_2_child () inherits (inh_fk_2); +insert into inh_fk_2_child values (111, 1), (222, 2); +-- The cascading deletion doesn't work on GPDB, because foreign keys are not +-- enforced in general. So this produces different result than on upstream. +delete from inh_fk_1 where a = 1; +select * from inh_fk_1 order by 1; +select * from inh_fk_2 order by 1, 2; +drop table inh_fk_1, inh_fk_2, inh_fk_2_child; + +-- Test that parent and child CHECK constraints can be created in either order +create table p1(f1 int); +create table p1_c1() inherits(p1); + +alter table p1 add constraint inh_check_constraint1 check (f1 > 0); +alter table p1_c1 add constraint inh_check_constraint1 check (f1 > 0); + +alter table p1_c1 add constraint inh_check_constraint2 check (f1 < 10); +alter table p1 add constraint inh_check_constraint2 check (f1 < 10); + +select conrelid::regclass::text as relname, conname, conislocal, coninhcount +from pg_constraint where conname like 'inh\_check\_constraint%' +order by 1, 2; + +drop table p1 cascade; + +-- Test that a valid child can have not-valid parent, but not vice versa +create table invalid_check_con(f1 int); +create table invalid_check_con_child() inherits(invalid_check_con); + +alter table invalid_check_con_child add constraint inh_check_constraint check(f1 > 0) not valid; +alter table invalid_check_con add constraint inh_check_constraint check(f1 > 0); -- fail +alter table invalid_check_con_child drop constraint inh_check_constraint; + +insert into invalid_check_con values(0); + +alter table invalid_check_con_child add constraint inh_check_constraint check(f1 > 0); +alter table invalid_check_con add constraint inh_check_constraint check(f1 > 0) not valid; + +insert into invalid_check_con values(0); -- fail +insert into invalid_check_con_child values(0); -- fail + +select conrelid::regclass::text as relname, conname, + convalidated, conislocal, coninhcount, connoinherit +from pg_constraint where conname like 'inh\_check\_constraint%' +order by 1, 2; + +-- We don't drop the invalid_check_con* tables, to test dump/reload with + +-- +-- Test parameterized append plans for inheritance trees +-- + +create temp table patest0 (id, x) as + select x, x from generate_series(0,1000) x; +create temp table patest1() inherits (patest0); +insert into patest1 + select x, x from generate_series(0,1000) x; +create temp table patest2() inherits (patest0); +insert into patest2 + select x, x from generate_series(0,1000) x; +create index patest0i on patest0(id); +create index patest1i on patest1(id); +create index patest2i on patest2(id); +analyze patest0; +analyze patest1; +analyze patest2; + +set enable_seqscan=off; +set enable_bitmapscan=off; +explain (costs off) +select * from patest0 join (select f1 from int4_tbl where f1 < 10 and f1 > -10 limit 1) ss on id = f1; +select * from patest0 join (select f1 from int4_tbl where f1 < 10 and f1 > -10 limit 1) ss on id = f1; + +drop index patest2i; + +explain (costs off) +select * from patest0 join (select f1 from int4_tbl where f1 < 10 and f1 > -10 limit 1) ss on id = f1; +select * from patest0 join (select f1 from int4_tbl where f1 < 10 and f1 > -10 limit 1) ss on id = f1; +reset enable_seqscan; +reset enable_bitmapscan; + +drop table patest0 cascade; + +-- +-- Test merge-append plans for inheritance trees +-- + +create table matest0 (id serial primary key, name text); +create table matest1 (id integer primary key) inherits (matest0); +create table matest2 (id integer primary key) inherits (matest0); +create table matest3 (id integer primary key) inherits (matest0); + +create index matest0i on matest0 ((1-id)); +create index matest1i on matest1 ((1-id)); +-- create index matest2i on matest2 ((1-id)); -- intentionally missing +create index matest3i on matest3 ((1-id)); + +insert into matest1 (name) values ('Test 1'); +insert into matest1 (name) values ('Test 2'); +insert into matest2 (name) values ('Test 3'); +insert into matest2 (name) values ('Test 4'); +insert into matest3 (name) values ('Test 5'); +insert into matest3 (name) values ('Test 6'); + +set enable_indexscan = off; -- force use of seqscan/sort, so no merge +explain (verbose, costs off) select * from matest0 order by 1-id; +select * from matest0 order by 1-id; +explain (verbose, costs off) select min(1-id) from matest0; +select min(1-id) from matest0; +reset enable_indexscan; + +set enable_seqscan = off; -- plan with fewest seqscans should be merge +set enable_parallel_append = off; -- Don't let parallel-append interfere +-- GPDB_92_MERGE_FIXME: the cost of bitmap scan is not correct? +-- the cost of merge append with index scan is bigger than the cost +-- of append with bitmapscan + sort +set enable_bitmapscan = off; +explain (verbose, costs off) select * from matest0 order by 1-id; +select * from matest0 order by 1-id; +explain (verbose, costs off) select min(1-id) from matest0; +select min(1-id) from matest0; +reset enable_seqscan; +reset enable_parallel_append; +reset enable_bitmapscan; + +drop table matest0 cascade; + +-- +-- Check that use of an index with an extraneous column doesn't produce +-- a plan with extraneous sorting +-- + +create table matest0 (a int, b int, c int, d int); +create table matest1 () inherits(matest0); +create index matest0i on matest0 (b, c); +create index matest1i on matest1 (b, c); + +set enable_nestloop = off; -- we want a plan with two MergeAppends +set enable_mergejoin=on; + +explain (costs off) +select t1.* from matest0 t1, matest0 t2 +where t1.b = t2.b and t2.c = t2.d +order by t1.b limit 10; + +reset enable_nestloop; + +drop table matest0 cascade; + +-- +-- Test merge-append for UNION ALL append relations +-- + +set enable_seqscan = off; +set enable_indexscan = on; +set enable_bitmapscan = off; + +-- GPDB: coerce the planner to choose Merge Append plans for the below queries. +-- In upstream, the Merge Append is cheaper, but in GPDB the Sort within each +-- segment only has to sort 1 / 3 of the data (with three segments), making +-- Sort + Append cheaper. Compensate by pretending that there are more rows in +-- the table. +begin; +set allow_system_table_mods = on; +update pg_class set reltuples = 100000 where oid = 'tenk1'::regclass; + +-- Check handling of duplicated, constant, or volatile targetlist items +explain (costs off) +SELECT thousand, tenthous FROM tenk1 +UNION ALL +SELECT thousand, thousand FROM tenk1 +ORDER BY thousand, tenthous; + +explain (costs off) +SELECT thousand, tenthous, thousand+tenthous AS x FROM tenk1 +UNION ALL +SELECT 42, 42, hundred FROM tenk1 +ORDER BY thousand, tenthous; + +explain (costs off) +SELECT thousand, tenthous FROM tenk1 +UNION ALL +SELECT thousand, random()::integer FROM tenk1 +ORDER BY thousand, tenthous; + +-- Check min/max aggregate optimization +explain (costs off) +SELECT min(x) FROM + (SELECT unique1 AS x FROM tenk1 a + UNION ALL + SELECT unique2 AS x FROM tenk1 b) s; + +explain (costs off) +SELECT min(y) FROM + (SELECT unique1 AS x, unique1 AS y FROM tenk1 a + UNION ALL + SELECT unique2 AS x, unique2 AS y FROM tenk1 b) s; + +-- XXX planner doesn't recognize that index on unique2 is sufficiently sorted +explain (costs off) +SELECT x, y FROM + (SELECT thousand AS x, tenthous AS y FROM tenk1 a + UNION ALL + SELECT unique2 AS x, unique2 AS y FROM tenk1 b) s +ORDER BY x, y; + +-- exercise rescan code path via a repeatedly-evaluated subquery +explain (costs off) +SELECT + ARRAY(SELECT f.i FROM ( + (SELECT d + g.i FROM generate_series(4, 30, 3) d ORDER BY 1) + UNION ALL + (SELECT d + g.i FROM generate_series(0, 30, 5) d ORDER BY 1) + ) f(i) + ORDER BY f.i LIMIT 10) +FROM generate_series(1, 3) g(i); + +SELECT + ARRAY(SELECT f.i FROM ( + (SELECT d + g.i FROM generate_series(4, 30, 3) d ORDER BY 1) + UNION ALL + (SELECT d + g.i FROM generate_series(0, 30, 5) d ORDER BY 1) + ) f(i) + ORDER BY f.i LIMIT 10) +FROM generate_series(1, 3) g(i); + +reset enable_seqscan; +reset enable_indexscan; +reset enable_bitmapscan; + +rollback; + +-- +-- Check handling of a constant-null CHECK constraint +-- +create table cnullparent (f1 int); +create table cnullchild (check (f1 = 1 or f1 = null)) inherits(cnullparent); +insert into cnullchild values(1); +insert into cnullchild values(2); +insert into cnullchild values(null); +select * from cnullparent; +select * from cnullparent where f1 = 2; +drop table cnullparent cascade; + +-- +-- Check use of temporary tables with inheritance trees +-- +create table inh_perm_parent (a1 int); +create temp table inh_temp_parent (a1 int); +create temp table inh_temp_child () inherits (inh_perm_parent); -- ok +create table inh_perm_child () inherits (inh_temp_parent); -- error +create temp table inh_temp_child_2 () inherits (inh_temp_parent); -- ok +insert into inh_perm_parent values (1); +insert into inh_temp_parent values (2); +insert into inh_temp_child values (3); +insert into inh_temp_child_2 values (4); +select tableoid::regclass, a1 from inh_perm_parent; +select tableoid::regclass, a1 from inh_temp_parent; +drop table inh_perm_parent cascade; +drop table inh_temp_parent cascade; + +-- +-- Check that constraint exclusion works correctly with partitions using +-- implicit constraints generated from the partition bound information. +-- +create table list_parted ( + a varchar +) partition by list (a); +create table part_ab_cd partition of list_parted for values in ('ab', 'cd'); +create table part_ef_gh partition of list_parted for values in ('ef', 'gh'); +create table part_null_xy partition of list_parted for values in (null, 'xy'); + +explain (costs off) select * from list_parted; +explain (costs off) select * from list_parted where a is null; +explain (costs off) select * from list_parted where a is not null; +explain (costs off) select * from list_parted where a in ('ab', 'cd', 'ef'); +explain (costs off) select * from list_parted where a = 'ab' or a in (null, 'cd'); +explain (costs off) select * from list_parted where a = 'ab'; + +create table range_list_parted ( + a int, + b char(2) +) partition by range (a); +create table part_1_10 partition of range_list_parted for values from (1) to (10) partition by list (b); +create table part_1_10_ab partition of part_1_10 for values in ('ab'); +create table part_1_10_cd partition of part_1_10 for values in ('cd'); +create table part_10_20 partition of range_list_parted for values from (10) to (20) partition by list (b); +create table part_10_20_ab partition of part_10_20 for values in ('ab'); +create table part_10_20_cd partition of part_10_20 for values in ('cd'); +create table part_21_30 partition of range_list_parted for values from (21) to (30) partition by list (b); +create table part_21_30_ab partition of part_21_30 for values in ('ab'); +create table part_21_30_cd partition of part_21_30 for values in ('cd'); +create table part_40_inf partition of range_list_parted for values from (40) to (maxvalue) partition by list (b); +create table part_40_inf_ab partition of part_40_inf for values in ('ab'); +create table part_40_inf_cd partition of part_40_inf for values in ('cd'); +create table part_40_inf_null partition of part_40_inf for values in (null); + +explain (costs off) select * from range_list_parted; +explain (costs off) select * from range_list_parted where a = 5; +explain (costs off) select * from range_list_parted where b = 'ab'; +explain (costs off) select * from range_list_parted where a between 3 and 23 and b in ('ab'); + +/* Should select no rows because range partition key cannot be null */ +explain (costs off) select * from range_list_parted where a is null; + +/* Should only select rows from the null-accepting partition */ +explain (costs off) select * from range_list_parted where b is null; +explain (costs off) select * from range_list_parted where a is not null and a < 67; +explain (costs off) select * from range_list_parted where a >= 30; + +drop table list_parted; +drop table range_list_parted; + +-- check that constraint exclusion is able to cope with the partition +-- constraint emitted for multi-column range partitioned tables +create table mcrparted (a int, b int, c int) partition by range (a, abs(b), c); +create table mcrparted_def partition of mcrparted default; +create table mcrparted0 partition of mcrparted for values from (minvalue, minvalue, minvalue) to (1, 1, 1); +create table mcrparted1 partition of mcrparted for values from (1, 1, 1) to (10, 5, 10); +create table mcrparted2 partition of mcrparted for values from (10, 5, 10) to (10, 10, 10); +create table mcrparted3 partition of mcrparted for values from (11, 1, 1) to (20, 10, 10); +create table mcrparted4 partition of mcrparted for values from (20, 10, 10) to (20, 20, 20); +create table mcrparted5 partition of mcrparted for values from (20, 20, 20) to (maxvalue, maxvalue, maxvalue); +explain (costs off) select * from mcrparted where a = 0; -- scans mcrparted0, mcrparted_def +explain (costs off) select * from mcrparted where a = 10 and abs(b) < 5; -- scans mcrparted1, mcrparted_def +explain (costs off) select * from mcrparted where a = 10 and abs(b) = 5; -- scans mcrparted1, mcrparted2, mcrparted_def +explain (costs off) select * from mcrparted where abs(b) = 5; -- scans all partitions +explain (costs off) select * from mcrparted where a > -1; -- scans all partitions +explain (costs off) select * from mcrparted where a = 20 and abs(b) = 10 and c > 10; -- scans mcrparted4 +explain (costs off) select * from mcrparted where a = 20 and c > 20; -- scans mcrparted3, mcrparte4, mcrparte5, mcrparted_def + +-- check that partitioned table Appends cope with being referenced in +-- subplans +create table parted_minmax (a int, b varchar(16)) partition by range (a); +create table parted_minmax1 partition of parted_minmax for values from (1) to (10); +create index parted_minmax1i on parted_minmax1 (a, b); +insert into parted_minmax values (1,'12345'); +explain (costs off) select min(a), max(a) from parted_minmax where b = '12345'; +select min(a), max(a) from parted_minmax where b = '12345'; +drop table parted_minmax; + +-- Test code that uses Append nodes in place of MergeAppend when the +-- partition ordering matches the desired ordering. + +create index mcrparted_a_abs_c_idx on mcrparted (a, abs(b), c); + +-- MergeAppend must be used when a default partition exists +explain (costs off) select * from mcrparted order by a, abs(b), c; + +drop table mcrparted_def; + +-- Append is used for a RANGE partitioned table with no default +-- and no subpartitions +explain (costs off) select * from mcrparted order by a, abs(b), c; + +-- Append is used with subpaths in reverse order with backwards index scans +explain (costs off) select * from mcrparted order by a desc, abs(b) desc, c desc; + +-- check that Append plan is used containing a MergeAppend for sub-partitions +-- that are unordered. +drop table mcrparted5; +create table mcrparted5 partition of mcrparted for values from (20, 20, 20) to (maxvalue, maxvalue, maxvalue) partition by list (a); +create table mcrparted5a partition of mcrparted5 for values in(20); +create table mcrparted5_def partition of mcrparted5 default; + +explain (costs off) select * from mcrparted order by a, abs(b), c; + +drop table mcrparted5_def; + +-- check that an Append plan is used and the sub-partitions are flattened +-- into the main Append when the sub-partition is unordered but contains +-- just a single sub-partition. +explain (costs off) select a, abs(b) from mcrparted order by a, abs(b), c; + +-- check that Append is used when the sub-partitioned tables are pruned +-- during planning. +explain (costs off) select * from mcrparted where a < 20 order by a, abs(b), c; + +create table mclparted (a int) partition by list(a); +create table mclparted1 partition of mclparted for values in(1); +create table mclparted2 partition of mclparted for values in(2); +create index on mclparted (a); + +-- Ensure an Append is used for a list partition with an order by. +explain (costs off) select * from mclparted order by a; + +-- Ensure a MergeAppend is used when a partition exists with interleaved +-- datums in the partition bound. +create table mclparted3_5 partition of mclparted for values in(3,5); +create table mclparted4 partition of mclparted for values in(4); + +explain (costs off) select * from mclparted order by a; + +drop table mclparted; + +-- Ensure subplans which don't have a path with the correct pathkeys get +-- sorted correctly. +drop index mcrparted_a_abs_c_idx; +create index on mcrparted1 (a, abs(b), c); +create index on mcrparted2 (a, abs(b), c); +create index on mcrparted3 (a, abs(b), c); +create index on mcrparted4 (a, abs(b), c); + +explain (costs off) select * from mcrparted where a < 20 order by a, abs(b), c limit 1; + +set enable_bitmapscan = 0; +-- Ensure Append node can be used when the partition is ordered by some +-- pathkeys which were deemed redundant. +explain (costs off) select * from mcrparted where a = 10 order by a, abs(b), c; +reset enable_bitmapscan; + +drop table mcrparted; + +-- Ensure LIST partitions allow an Append to be used instead of a MergeAppend +create table bool_lp (b bool) partition by list(b); +create table bool_lp_true partition of bool_lp for values in(true); +create table bool_lp_false partition of bool_lp for values in(false); +create index on bool_lp (b); + +explain (costs off) select * from bool_lp order by b; + +drop table bool_lp; + +-- Ensure const bool quals can be properly detected as redundant +create table bool_rp (b bool, a int) partition by range(b,a); +create table bool_rp_false_1k partition of bool_rp for values from (false,0) to (false,1000); +create table bool_rp_true_1k partition of bool_rp for values from (true,0) to (true,1000); +create table bool_rp_false_2k partition of bool_rp for values from (false,1000) to (false,2000); +create table bool_rp_true_2k partition of bool_rp for values from (true,1000) to (true,2000); +create index on bool_rp (b,a); +explain (costs off) select * from bool_rp where b = true order by b,a; +explain (costs off) select * from bool_rp where b = false order by b,a; +-- GPDB: force the planner to choose same plan as in upstream +set enable_seqscan=off; +set enable_bitmapscan=off; +explain (costs off) select * from bool_rp where b = true order by a; +explain (costs off) select * from bool_rp where b = false order by a; +reset enable_seqscan; +reset enable_bitmapscan; + +drop table bool_rp; + +-- Ensure an Append scan is chosen when the partition order is a subset of +-- the required order. +create table range_parted (a int, b int, c int) partition by range(a, b); +create table range_parted1 partition of range_parted for values from (0,0) to (10,10); +create table range_parted2 partition of range_parted for values from (10,10) to (20,20); +create index on range_parted (a,b,c); + +explain (costs off) select * from range_parted order by a,b,c; +explain (costs off) select * from range_parted order by a desc,b desc,c desc; + +drop table range_parted; + +-- Check that we allow access to a child table's statistics when the user +-- has permissions only for the parent table. +create table permtest_parent (a int, b text, c text) partition by list (a); +create table permtest_child (b text, c text, a int) partition by list (b); +create table permtest_grandchild (c text, b text, a int); +alter table permtest_child attach partition permtest_grandchild for values in ('a'); +alter table permtest_parent attach partition permtest_child for values in (1); +create index on permtest_parent (left(c, 3)); +insert into permtest_parent + select 1, 'a', left(md5(i::text), 5) from generate_series(0, 100) i; +analyze permtest_parent; +create role regress_no_child_access; +revoke all on permtest_grandchild from regress_no_child_access; +grant select on permtest_parent to regress_no_child_access; +set session authorization regress_no_child_access; +-- without stats access, these queries would produce hash join plans: +explain (costs off) + select * from permtest_parent p1 inner join permtest_parent p2 + on p1.a = p2.a and p1.c ~ 'a1$'; +explain (costs off) + select * from permtest_parent p1 inner join permtest_parent p2 + on p1.a = p2.a and left(p1.c, 3) ~ 'a1$'; +reset session authorization; +revoke all on permtest_parent from regress_no_child_access; +grant select(a,c) on permtest_parent to regress_no_child_access; +set session authorization regress_no_child_access; +explain (costs off) + select p2.a, p1.c from permtest_parent p1 inner join permtest_parent p2 + on p1.a = p2.a and p1.c ~ 'a1$'; +-- we will not have access to the expression index's stats here: +explain (costs off) + select p2.a, p1.c from permtest_parent p1 inner join permtest_parent p2 + on p1.a = p2.a and left(p1.c, 3) ~ 'a1$'; +reset session authorization; +revoke all on permtest_parent from regress_no_child_access; +drop role regress_no_child_access; +drop table permtest_parent; + +-- Verify that constraint errors across partition root / child are +-- handled correctly (Bug #16293) +CREATE TABLE errtst_parent ( + partid int not null, + shdata int not null, + data int NOT NULL DEFAULT 0, + CONSTRAINT shdata_small CHECK(shdata < 3) +) PARTITION BY RANGE (partid); + +-- fast defaults lead to attribute mapping being used in one +-- direction, but not the other +CREATE TABLE errtst_child_fastdef ( + partid int not null, + shdata int not null, + CONSTRAINT shdata_small CHECK(shdata < 3) +); + +-- no remapping in either direction necessary +CREATE TABLE errtst_child_plaindef ( + partid int not null, + shdata int not null, + data int NOT NULL DEFAULT 0, + CONSTRAINT shdata_small CHECK(shdata < 3), + CHECK(data < 10) +); + +-- remapping in both direction +CREATE TABLE errtst_child_reorder ( + data int NOT NULL DEFAULT 0, + shdata int not null, + partid int not null, + CONSTRAINT shdata_small CHECK(shdata < 3), + CHECK(data < 10) +); + +ALTER TABLE errtst_child_fastdef ADD COLUMN data int NOT NULL DEFAULT 0; +ALTER TABLE errtst_child_fastdef ADD CONSTRAINT errtest_child_fastdef_data_check CHECK (data < 10); + +ALTER TABLE errtst_parent ATTACH PARTITION errtst_child_fastdef FOR VALUES FROM (0) TO (10); +ALTER TABLE errtst_parent ATTACH PARTITION errtst_child_plaindef FOR VALUES FROM (10) TO (20); +ALTER TABLE errtst_parent ATTACH PARTITION errtst_child_reorder FOR VALUES FROM (20) TO (30); + +-- insert without child check constraint error +INSERT INTO errtst_parent(partid, shdata, data) VALUES ( '0', '1', '5'); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('10', '1', '5'); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('20', '1', '5'); + +-- insert with child check constraint error +INSERT INTO errtst_parent(partid, shdata, data) VALUES ( '0', '1', '10'); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('10', '1', '10'); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('20', '1', '10'); + +-- insert with child not null constraint error +INSERT INTO errtst_parent(partid, shdata, data) VALUES ( '0', '1', NULL); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('10', '1', NULL); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('20', '1', NULL); + +-- insert with shared check constraint error +INSERT INTO errtst_parent(partid, shdata, data) VALUES ( '0', '5', '5'); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('10', '5', '5'); +INSERT INTO errtst_parent(partid, shdata, data) VALUES ('20', '5', '5'); + +-- within partition update without child check constraint violation +BEGIN; +UPDATE errtst_parent SET data = data + 1 WHERE partid = 0; +UPDATE errtst_parent SET data = data + 1 WHERE partid = 10; +UPDATE errtst_parent SET data = data + 1 WHERE partid = 20; +ROLLBACK; + +-- within partition update with child check constraint violation +UPDATE errtst_parent SET data = data + 10 WHERE partid = 0; +UPDATE errtst_parent SET data = data + 10 WHERE partid = 10; +UPDATE errtst_parent SET data = data + 10 WHERE partid = 20; + +-- direct leaf partition update, without partition id violation +BEGIN; +UPDATE errtst_child_fastdef SET partid = 1 WHERE partid = 0; +UPDATE errtst_child_plaindef SET partid = 11 WHERE partid = 10; +UPDATE errtst_child_reorder SET partid = 21 WHERE partid = 20; +ROLLBACK; + +-- direct leaf partition update, with partition id violation +UPDATE errtst_child_fastdef SET partid = partid + 10 WHERE partid = 0; +UPDATE errtst_child_plaindef SET partid = partid + 10 WHERE partid = 10; +UPDATE errtst_child_reorder SET partid = partid + 10 WHERE partid = 20; + +-- partition move, without child check constraint violation +BEGIN; +UPDATE errtst_parent SET partid = 10, data = data + 1 WHERE partid = 0; +UPDATE errtst_parent SET partid = 20, data = data + 1 WHERE partid = 10; +UPDATE errtst_parent SET partid = 0, data = data + 1 WHERE partid = 20; +ROLLBACK; + +-- partition move, with child check constraint violation +UPDATE errtst_parent SET partid = 10, data = data + 10 WHERE partid = 0; +UPDATE errtst_parent SET partid = 20, data = data + 10 WHERE partid = 10; +UPDATE errtst_parent SET partid = 0, data = data + 10 WHERE partid = 20; + +-- partition move, without target partition +UPDATE errtst_parent SET partid = 30, data = data + 10 WHERE partid = 20; + +DROP TABLE errtst_parent; diff --git a/src/test/singlenode_regress/sql/init_privs.sql b/src/test/singlenode_regress/sql/init_privs.sql new file mode 100644 index 00000000000..4a31af27986 --- /dev/null +++ b/src/test/singlenode_regress/sql/init_privs.sql @@ -0,0 +1,10 @@ +-- Test initial privileges + +-- There should always be some initial privileges, set up by initdb +SELECT count(*) > 0 FROM pg_init_privs; + +-- Intentionally include some non-initial privs for pg_dump to dump out +GRANT SELECT ON pg_proc TO CURRENT_USER; +GRANT SELECT (prosrc) ON pg_proc TO CURRENT_USER; + +GRANT SELECT (rolname, rolsuper) ON pg_authid TO CURRENT_USER; diff --git a/src/test/singlenode_regress/sql/insert.sql b/src/test/singlenode_regress/sql/insert.sql new file mode 100644 index 00000000000..bfaa8a3b277 --- /dev/null +++ b/src/test/singlenode_regress/sql/insert.sql @@ -0,0 +1,626 @@ +-- +-- insert with DEFAULT in the target_list +-- +create table inserttest (col1 int4, col2 int4 NOT NULL, col3 text default 'testing'); +insert into inserttest (col1, col2, col3) values (DEFAULT, DEFAULT, DEFAULT); +insert into inserttest (col2, col3) values (3, DEFAULT); +insert into inserttest (col1, col2, col3) values (DEFAULT, 5, DEFAULT); +insert into inserttest values (DEFAULT, 5, 'test'); +insert into inserttest values (DEFAULT, 7); + +select * from inserttest; + +-- +-- insert with similar expression / target_list values (all fail) +-- +insert into inserttest (col1, col2, col3) values (DEFAULT, DEFAULT); +insert into inserttest (col1, col2, col3) values (1, 2); +insert into inserttest (col1) values (1, 2); +insert into inserttest (col1) values (DEFAULT, DEFAULT); + +select * from inserttest; + +-- +-- VALUES test +-- +insert into inserttest values(10, 20, '40'), (-1, 2, DEFAULT), + ((select 2), (select i from (values(3)) as foo (i)), 'values are fun!'); + +select * from inserttest; + +-- +-- TOASTed value test +-- +insert into inserttest values(30, 50, repeat('x', 10000)); + +select col1, col2, char_length(col3) from inserttest; + +drop table inserttest; + +-- +-- tuple larger than fillfactor +-- +CREATE TABLE large_tuple_test (a int, b text) WITH (fillfactor = 10); +ALTER TABLE large_tuple_test ALTER COLUMN b SET STORAGE plain; + +-- create page w/ free space in range [nearlyEmptyFreeSpace, MaxHeapTupleSize) +INSERT INTO large_tuple_test (select 1, NULL); + +-- should still fit on the page +INSERT INTO large_tuple_test (select 2, repeat('a', 1000)); +SELECT pg_size_pretty(pg_relation_size('large_tuple_test'::regclass, 'main')); + +-- add small record to the second page +INSERT INTO large_tuple_test (select 3, NULL); + +-- now this tuple won't fit on the second page, but the insert should +-- still succeed by extending the relation +INSERT INTO large_tuple_test (select 4, repeat('a', 8126)); + +DROP TABLE large_tuple_test; + +-- +-- check indirection (field/array assignment), cf bug #14265 +-- +-- these tests are aware that transformInsertStmt has 3 separate code paths +-- + +create type insert_test_type as (if1 int, if2 text[]); + +create table inserttest (f1 int, f2 int[], + f3 insert_test_type, f4 insert_test_type[]); + +insert into inserttest (f2[1], f2[2]) values (1,2); +insert into inserttest (f2[1], f2[2]) values (3,4), (5,6); +insert into inserttest (f2[1], f2[2]) select 7,8; +insert into inserttest (f2[1], f2[2]) values (1,default); -- not supported + +insert into inserttest (f3.if1, f3.if2) values (1,array['foo']); +insert into inserttest (f3.if1, f3.if2) values (1,'{foo}'), (2,'{bar}'); +insert into inserttest (f3.if1, f3.if2) select 3, '{baz,quux}'; +insert into inserttest (f3.if1, f3.if2) values (1,default); -- not supported + +insert into inserttest (f3.if2[1], f3.if2[2]) values ('foo', 'bar'); +insert into inserttest (f3.if2[1], f3.if2[2]) values ('foo', 'bar'), ('baz', 'quux'); +insert into inserttest (f3.if2[1], f3.if2[2]) select 'bear', 'beer'; + +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) values ('foo', 'bar'); +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) values ('foo', 'bar'), ('baz', 'quux'); +insert into inserttest (f4[1].if2[1], f4[1].if2[2]) select 'bear', 'beer'; + +select * from inserttest; + +-- also check reverse-listing +create table inserttest2 (f1 bigint, f2 text); +create rule irule1 as on insert to inserttest2 do also + insert into inserttest (f3.if2[1], f3.if2[2]) + values (new.f1,new.f2); +create rule irule2 as on insert to inserttest2 do also + insert into inserttest (f4[1].if1, f4[1].if2[2]) + values (1,'fool'),(new.f1,new.f2); +create rule irule3 as on insert to inserttest2 do also + insert into inserttest (f4[1].if1, f4[1].if2[2]) + select new.f1, new.f2; +\d+ inserttest2 + +drop table inserttest2; +drop table inserttest; +drop type insert_test_type; + +-- direct partition inserts should check partition bound constraint +create table range_parted ( + a text, + b int +) partition by range (a, (b+0)); + +-- no partitions, so fail +insert into range_parted values ('a', 11); + +create table part1 partition of range_parted for values from ('a', 1) to ('a', 10); +create table part2 partition of range_parted for values from ('a', 10) to ('a', 20); +create table part3 partition of range_parted for values from ('b', 1) to ('b', 10); +create table part4 partition of range_parted for values from ('b', 10) to ('b', 20); + +-- fail +insert into part1 values ('a', 11); +insert into part1 values ('b', 1); +-- ok +insert into part1 values ('a', 1); +-- fail +insert into part4 values ('b', 21); +insert into part4 values ('a', 10); +-- ok +insert into part4 values ('b', 10); + +-- fail (partition key a has a NOT NULL constraint) +insert into part1 values (null); +-- fail (expression key (b+0) cannot be null either) +insert into part1 values (1); + +create table list_parted ( + a text, + b int +) partition by list (lower(a)); +create table part_aa_bb partition of list_parted FOR VALUES IN ('aa', 'bb'); +create table part_cc_dd partition of list_parted FOR VALUES IN ('cc', 'dd'); +create table part_null partition of list_parted FOR VALUES IN (null); + +-- fail +insert into part_aa_bb values ('cc', 1); +insert into part_aa_bb values ('AAa', 1); +insert into part_aa_bb values (null); +-- ok +insert into part_cc_dd values ('cC', 1); +insert into part_null values (null, 0); + +-- check in case of multi-level partitioned table +create table part_ee_ff partition of list_parted for values in ('ee', 'ff') partition by range (b); +create table part_ee_ff1 partition of part_ee_ff for values from (1) to (10); +create table part_ee_ff2 partition of part_ee_ff for values from (10) to (20); + +-- test default partition +create table part_default partition of list_parted default; +-- Negative test: a row, which would fit in other partition, does not fit +-- default partition, even when inserted directly +insert into part_default values ('aa', 2); +insert into part_default values (null, 2); +-- ok +insert into part_default values ('Zz', 2); +-- test if default partition works as expected for multi-level partitioned +-- table as well as when default partition itself is further partitioned +drop table part_default; +create table part_xx_yy partition of list_parted for values in ('xx', 'yy') partition by list (a); +create table part_xx_yy_p1 partition of part_xx_yy for values in ('xx'); +create table part_xx_yy_defpart partition of part_xx_yy default; +create table part_default partition of list_parted default partition by range(b); +create table part_default_p1 partition of part_default for values from (20) to (30); +create table part_default_p2 partition of part_default for values from (30) to (40); + +-- fail +insert into part_ee_ff1 values ('EE', 11); +insert into part_default_p2 values ('gg', 43); +-- fail (even the parent's, ie, part_ee_ff's partition constraint applies) +insert into part_ee_ff1 values ('cc', 1); +insert into part_default values ('gg', 43); +-- ok +insert into part_ee_ff1 values ('ff', 1); +insert into part_ee_ff2 values ('ff', 11); +insert into part_default_p1 values ('cd', 25); +insert into part_default_p2 values ('de', 35); +insert into list_parted values ('ab', 21); +insert into list_parted values ('xx', 1); +insert into list_parted values ('yy', 2); +select tableoid::regclass, * from list_parted; + +-- Check tuple routing for partitioned tables + +-- fail +insert into range_parted values ('a', 0); +-- ok +insert into range_parted values ('a', 1); +insert into range_parted values ('a', 10); +-- fail +insert into range_parted values ('a', 20); +-- ok +insert into range_parted values ('b', 1); +insert into range_parted values ('b', 10); +-- fail (partition key (b+0) is null) +insert into range_parted values ('a'); + +-- Check default partition +create table part_def partition of range_parted default; +-- fail +insert into part_def values ('b', 10); +-- ok +insert into part_def values ('c', 10); +insert into range_parted values (null, null); +insert into range_parted values ('a', null); +insert into range_parted values (null, 19); +insert into range_parted values ('b', 20); + +select tableoid::regclass, * from range_parted; +-- ok +insert into list_parted values (null, 1); +insert into list_parted (a) values ('aA'); +-- fail (partition of part_ee_ff not found in both cases) +insert into list_parted values ('EE', 0); +insert into part_ee_ff values ('EE', 0); +-- ok +insert into list_parted values ('EE', 1); +insert into part_ee_ff values ('EE', 10); +select tableoid::regclass, * from list_parted; + +-- some more tests to exercise tuple-routing with multi-level partitioning +create table part_gg partition of list_parted for values in ('gg') partition by range (b); +create table part_gg1 partition of part_gg for values from (minvalue) to (1); +create table part_gg2 partition of part_gg for values from (1) to (10) partition by range (b); +create table part_gg2_1 partition of part_gg2 for values from (1) to (5); +create table part_gg2_2 partition of part_gg2 for values from (5) to (10); + +create table part_ee_ff3 partition of part_ee_ff for values from (20) to (30) partition by range (b); +create table part_ee_ff3_1 partition of part_ee_ff3 for values from (20) to (25); +create table part_ee_ff3_2 partition of part_ee_ff3 for values from (25) to (30); + +truncate list_parted; +insert into list_parted values ('aa'), ('cc'); +insert into list_parted select 'Ff', s.a from generate_series(1, 29) s(a); +insert into list_parted select 'gg', s.a from generate_series(1, 9) s(a); +insert into list_parted (b) values (1); +select tableoid::regclass::text, a, min(b) as min_b, max(b) as max_b from list_parted group by 1, 2 order by 1; + +-- direct partition inserts should check hash partition bound constraint + +-- Use hand-rolled hash functions and operator classes to get predictable +-- result on different machines. The hash function for int4 simply returns +-- the sum of the values passed to it and the one for text returns the length +-- of the non-empty string value passed to it or 0. + +create or replace function part_hashint4_noop(value int4, seed int8) +returns int8 as $$ +select value + seed; +$$ language sql immutable; + +create operator class part_test_int4_ops +for type int4 +using hash as +operator 1 =, +function 2 part_hashint4_noop(int4, int8); + +create or replace function part_hashtext_length(value text, seed int8) +RETURNS int8 AS $$ +select length(coalesce(value, ''))::int8 +$$ language sql immutable; + +create operator class part_test_text_ops +for type text +using hash as +operator 1 =, +function 2 part_hashtext_length(text, int8); + +create table hash_parted ( + a int +) partition by hash (a part_test_int4_ops); +create table hpart0 partition of hash_parted for values with (modulus 4, remainder 0); +create table hpart1 partition of hash_parted for values with (modulus 4, remainder 1); +create table hpart2 partition of hash_parted for values with (modulus 4, remainder 2); +create table hpart3 partition of hash_parted for values with (modulus 4, remainder 3); + +insert into hash_parted values(generate_series(1,10)); + +-- direct insert of values divisible by 4 - ok; +insert into hpart0 values(12),(16); +-- fail; +insert into hpart0 values(11); +-- 11 % 4 -> 3 remainder i.e. valid data for hpart3 partition +insert into hpart3 values(11); + +-- view data +select tableoid::regclass as part, a, a%4 as "remainder = a % 4" +from hash_parted order by part; + +-- test \d+ output on a table which has both partitioned and unpartitioned +-- partitions +\d+ list_parted + +-- cleanup +drop table range_parted, list_parted; +drop table hash_parted; + +-- test that a default partition added as the first partition accepts any value +-- including null +create table list_parted (a int) partition by list (a); +create table part_default partition of list_parted default; +\d+ part_default +insert into part_default values (null); +insert into part_default values (1); +insert into part_default values (-1); +select tableoid::regclass, a from list_parted; +-- cleanup +drop table list_parted; + +-- more tests for certain multi-level partitioning scenarios +create table mlparted (a int, b int) partition by range (a, b); +create table mlparted1 (b int not null, a int not null) partition by range ((b+0)); +create table mlparted11 (like mlparted1); +alter table mlparted11 drop a; +alter table mlparted11 add a int; +alter table mlparted11 drop a; +alter table mlparted11 add a int not null; +-- attnum for key attribute 'a' is different in mlparted, mlparted1, and mlparted11 +select attrelid::regclass, attname, attnum +from pg_attribute +where attname = 'a' + and (attrelid = 'mlparted'::regclass + or attrelid = 'mlparted1'::regclass + or attrelid = 'mlparted11'::regclass) +order by attrelid::regclass::text; + +alter table mlparted1 attach partition mlparted11 for values from (2) to (5); +alter table mlparted attach partition mlparted1 for values from (1, 2) to (1, 10); + +-- check that "(1, 2)" is correctly routed to mlparted11. +insert into mlparted values (1, 2); +select tableoid::regclass, * from mlparted; + +-- check that proper message is shown after failure to route through mlparted1 +insert into mlparted (a, b) values (1, 5); + +truncate mlparted; +alter table mlparted add constraint check_b check (b = 3); + +-- have a BR trigger modify the row such that the check_b is violated +create function mlparted11_trig_fn() +returns trigger AS +$$ +begin + NEW.b := 4; + return NEW; +end; +$$ +language plpgsql; +create trigger mlparted11_trig before insert ON mlparted11 + for each row execute procedure mlparted11_trig_fn(); + +-- check that the correct row is shown when constraint check_b fails after +-- "(1, 2)" is routed to mlparted11 (actually "(1, 4)" would be shown due +-- to the BR trigger mlparted11_trig_fn) +insert into mlparted values (1, 2); +drop trigger mlparted11_trig on mlparted11; +drop function mlparted11_trig_fn(); + +-- check that inserting into an internal partition successfully results in +-- checking its partition constraint before inserting into the leaf partition +-- selected by tuple-routing +insert into mlparted1 (a, b) values (2, 3); + +-- check routing error through a list partitioned table when the key is null +create table lparted_nonullpart (a int, b char) partition by list (b); +create table lparted_nonullpart_a partition of lparted_nonullpart for values in ('a'); +insert into lparted_nonullpart values (1); +drop table lparted_nonullpart; + +-- check that RETURNING works correctly with tuple-routing +alter table mlparted drop constraint check_b; +create table mlparted12 partition of mlparted1 for values from (5) to (10); +create table mlparted2 (b int not null, a int not null); +alter table mlparted attach partition mlparted2 for values from (1, 10) to (1, 20); +create table mlparted3 partition of mlparted for values from (1, 20) to (1, 30); +create table mlparted4 (like mlparted); +alter table mlparted4 drop a; +alter table mlparted4 add a int not null; +alter table mlparted attach partition mlparted4 for values from (1, 30) to (1, 40); +with ins (a, b, c) as + (insert into mlparted (b, a) select s.a, 1 from generate_series(2, 39) s(a) returning tableoid::regclass, *) + select a, b, min(c), max(c) from ins group by a, b order by 1; + +alter table mlparted add c text; +create table mlparted5 (c text, a int not null, b int not null) partition by list (c); +create table mlparted5a (a int not null, c text, b int not null); +alter table mlparted5 attach partition mlparted5a for values in ('a'); +alter table mlparted attach partition mlparted5 for values from (1, 40) to (1, 50); +alter table mlparted add constraint check_b check (a = 1 and b < 45); +insert into mlparted values (1, 45, 'a'); +create function mlparted5abrtrig_func() returns trigger as $$ begin new.c = 'b'; return new; end; $$ language plpgsql; +create trigger mlparted5abrtrig before insert on mlparted5a for each row execute procedure mlparted5abrtrig_func(); +insert into mlparted5 (a, b, c) values (1, 40, 'a'); +drop table mlparted5; +alter table mlparted drop constraint check_b; + +-- Check multi-level default partition +create table mlparted_def partition of mlparted default partition by range(a); +create table mlparted_def1 partition of mlparted_def for values from (40) to (50); +create table mlparted_def2 partition of mlparted_def for values from (50) to (60); +insert into mlparted values (40, 100); +insert into mlparted_def1 values (42, 100); +insert into mlparted_def2 values (54, 50); +-- fail +insert into mlparted values (70, 100); +insert into mlparted_def1 values (52, 50); +insert into mlparted_def2 values (34, 50); +-- ok +create table mlparted_defd partition of mlparted_def default; +insert into mlparted values (70, 100); + +select tableoid::regclass, * from mlparted_def; + +-- Check multi-level tuple routing with attributes dropped from the +-- top-most parent. First remove the last attribute. +alter table mlparted add d int, add e int; +alter table mlparted drop e; +create table mlparted5 partition of mlparted + for values from (1, 40) to (1, 50) partition by range (c); +create table mlparted5_ab partition of mlparted5 + for values from ('a') to ('c') partition by list (c); +-- This partitioned table should remain with no partitions. +create table mlparted5_cd partition of mlparted5 + for values from ('c') to ('e') partition by list (c); +create table mlparted5_a partition of mlparted5_ab for values in ('a'); +create table mlparted5_b (d int, b int, c text, a int); +alter table mlparted5_ab attach partition mlparted5_b for values in ('b'); +truncate mlparted; +insert into mlparted values (1, 2, 'a', 1); +insert into mlparted values (1, 40, 'a', 1); -- goes to mlparted5_a +insert into mlparted values (1, 45, 'b', 1); -- goes to mlparted5_b +insert into mlparted values (1, 45, 'c', 1); -- goes to mlparted5_cd, fails +insert into mlparted values (1, 45, 'f', 1); -- goes to mlparted5, fails +select tableoid::regclass, * from mlparted order by a, b, c, d; +alter table mlparted drop d; +truncate mlparted; +-- Remove the before last attribute. +alter table mlparted add e int, add d int; +alter table mlparted drop e; +insert into mlparted values (1, 2, 'a', 1); +insert into mlparted values (1, 40, 'a', 1); -- goes to mlparted5_a +insert into mlparted values (1, 45, 'b', 1); -- goes to mlparted5_b +insert into mlparted values (1, 45, 'c', 1); -- goes to mlparted5_cd, fails +insert into mlparted values (1, 45, 'f', 1); -- goes to mlparted5, fails +select tableoid::regclass, * from mlparted order by a, b, c, d; +alter table mlparted drop d; +drop table mlparted5; + +-- check that message shown after failure to find a partition shows the +-- appropriate key description (or none) in various situations +create table key_desc (a int, b int) partition by list ((a+0)); +create table key_desc_1 partition of key_desc for values in (1) partition by range (b); + +create user regress_insert_other_user; +grant select (a) on key_desc_1 to regress_insert_other_user; +grant insert on key_desc to regress_insert_other_user; + +set role regress_insert_other_user; +-- no key description is shown +insert into key_desc values (1, 1); + +reset role; +grant select (b) on key_desc_1 to regress_insert_other_user; +set role regress_insert_other_user; +-- key description (b)=(1) is now shown +insert into key_desc values (1, 1); + +-- key description is not shown if key contains expression +insert into key_desc values (2, 1); +reset role; +revoke all on key_desc from regress_insert_other_user; +revoke all on key_desc_1 from regress_insert_other_user; +drop role regress_insert_other_user; +drop table key_desc, key_desc_1; + +-- test minvalue/maxvalue restrictions +create table mcrparted (a int, b int, c int) partition by range (a, abs(b), c); +create table mcrparted0 partition of mcrparted for values from (minvalue, 0, 0) to (1, maxvalue, maxvalue); +create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue) to (10, maxvalue, minvalue); +create table mcrparted4 partition of mcrparted for values from (21, minvalue, 0) to (30, 20, minvalue); + +-- check multi-column range partitioning expression enforces the same +-- constraint as what tuple-routing would determine it to be +create table mcrparted0 partition of mcrparted for values from (minvalue, minvalue, minvalue) to (1, maxvalue, maxvalue); +create table mcrparted1 partition of mcrparted for values from (2, 1, minvalue) to (10, 5, 10); +create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue) to (10, maxvalue, maxvalue); +create table mcrparted3 partition of mcrparted for values from (11, 1, 1) to (20, 10, 10); +create table mcrparted4 partition of mcrparted for values from (21, minvalue, minvalue) to (30, 20, maxvalue); +create table mcrparted5 partition of mcrparted for values from (30, 21, 20) to (maxvalue, maxvalue, maxvalue); + +-- null not allowed in range partition +insert into mcrparted values (null, null, null); + +-- routed to mcrparted0 +insert into mcrparted values (0, 1, 1); +insert into mcrparted0 values (0, 1, 1); + +-- routed to mcparted1 +insert into mcrparted values (9, 1000, 1); +insert into mcrparted1 values (9, 1000, 1); +insert into mcrparted values (10, 5, -1); +insert into mcrparted1 values (10, 5, -1); +insert into mcrparted values (2, 1, 0); +insert into mcrparted1 values (2, 1, 0); + +-- routed to mcparted2 +insert into mcrparted values (10, 6, 1000); +insert into mcrparted2 values (10, 6, 1000); +insert into mcrparted values (10, 1000, 1000); +insert into mcrparted2 values (10, 1000, 1000); + +-- no partition exists, nor does mcrparted3 accept it +insert into mcrparted values (11, 1, -1); +insert into mcrparted3 values (11, 1, -1); + +-- routed to mcrparted5 +insert into mcrparted values (30, 21, 20); +insert into mcrparted5 values (30, 21, 20); +insert into mcrparted4 values (30, 21, 20); -- error + +-- check rows +select tableoid::regclass::text, * from mcrparted order by 1; + +-- cleanup +drop table mcrparted; + +-- check that a BR constraint can't make partition contain violating rows +create table brtrigpartcon (a int, b text) partition by list (a); +create table brtrigpartcon1 partition of brtrigpartcon for values in (1); +create or replace function brtrigpartcon1trigf() returns trigger as $$begin new.a := 2; return new; end$$ language plpgsql; +create trigger brtrigpartcon1trig before insert on brtrigpartcon1 for each row execute procedure brtrigpartcon1trigf(); +insert into brtrigpartcon values (1, 'hi there'); +insert into brtrigpartcon1 values (1, 'hi there'); + +-- check that the message shows the appropriate column description in a +-- situation where the partitioned table is not the primary ModifyTable node +create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int); +create role regress_coldesc_role; +grant insert on inserttest3 to regress_coldesc_role; +grant insert on brtrigpartcon to regress_coldesc_role; +revoke select on brtrigpartcon from regress_coldesc_role; +set role regress_coldesc_role; +with result as (insert into brtrigpartcon values (1, 'hi there') returning 1) + insert into inserttest3 (f3) select * from result; +reset role; + +-- cleanup +revoke all on inserttest3 from regress_coldesc_role; +revoke all on brtrigpartcon from regress_coldesc_role; +drop role regress_coldesc_role; +drop table inserttest3; +drop table brtrigpartcon; +drop function brtrigpartcon1trigf(); + +-- check that "do nothing" BR triggers work with tuple-routing +create table donothingbrtrig_test (a int, b text) partition by list (a); +create table donothingbrtrig_test1 (b text, a int); +create table donothingbrtrig_test2 (c text, b text, a int); +alter table donothingbrtrig_test2 drop column c; +create or replace function donothingbrtrig_func() returns trigger as $$begin raise notice 'b: %', new.b; return NULL; end$$ language plpgsql; +create trigger donothingbrtrig1 before insert on donothingbrtrig_test1 for each row execute procedure donothingbrtrig_func(); +create trigger donothingbrtrig2 before insert on donothingbrtrig_test2 for each row execute procedure donothingbrtrig_func(); +alter table donothingbrtrig_test attach partition donothingbrtrig_test1 for values in (1); +alter table donothingbrtrig_test attach partition donothingbrtrig_test2 for values in (2); +insert into donothingbrtrig_test values (1, 'foo'), (2, 'bar'); +copy donothingbrtrig_test from stdout; +1 baz +2 qux +\. +select tableoid::regclass, * from donothingbrtrig_test; + +-- cleanup +drop table donothingbrtrig_test; +drop function donothingbrtrig_func(); + +-- check multi-column range partitioning with minvalue/maxvalue constraints +create table mcrparted (a text, b int) partition by range(a, b); +create table mcrparted1_lt_b partition of mcrparted for values from (minvalue, minvalue) to ('b', minvalue); +create table mcrparted2_b partition of mcrparted for values from ('b', minvalue) to ('c', minvalue); +create table mcrparted3_c_to_common partition of mcrparted for values from ('c', minvalue) to ('common', minvalue); +create table mcrparted4_common_lt_0 partition of mcrparted for values from ('common', minvalue) to ('common', 0); +create table mcrparted5_common_0_to_10 partition of mcrparted for values from ('common', 0) to ('common', 10); +create table mcrparted6_common_ge_10 partition of mcrparted for values from ('common', 10) to ('common', maxvalue); +create table mcrparted7_gt_common_lt_d partition of mcrparted for values from ('common', maxvalue) to ('d', minvalue); +create table mcrparted8_ge_d partition of mcrparted for values from ('d', minvalue) to (maxvalue, maxvalue); + +\d+ mcrparted +\d+ mcrparted1_lt_b +\d+ mcrparted2_b +\d+ mcrparted3_c_to_common +\d+ mcrparted4_common_lt_0 +\d+ mcrparted5_common_0_to_10 +\d+ mcrparted6_common_ge_10 +\d+ mcrparted7_gt_common_lt_d +\d+ mcrparted8_ge_d + +insert into mcrparted values ('aaa', 0), ('b', 0), ('bz', 10), ('c', -10), + ('comm', -10), ('common', -10), ('common', 0), ('common', 10), + ('commons', 0), ('d', -10), ('e', 0); +select tableoid::regclass, * from mcrparted order by a, b; +drop table mcrparted; + +-- check that wholerow vars in the RETURNING list work with partitioned tables +create table returningwrtest (a int) partition by list (a); +create table returningwrtest1 partition of returningwrtest for values in (1); +insert into returningwrtest values (1) returning returningwrtest; + +-- check also that the wholerow vars in RETURNING list are converted as needed +alter table returningwrtest add b text; +create table returningwrtest2 (b text, c int, a int); +alter table returningwrtest2 drop c; +alter table returningwrtest attach partition returningwrtest2 for values in (2); +insert into returningwrtest values (2, 'foo') returning returningwrtest; +drop table returningwrtest; diff --git a/src/test/singlenode_regress/sql/insert_conflict.sql b/src/test/singlenode_regress/sql/insert_conflict.sql new file mode 100644 index 00000000000..23d5778b821 --- /dev/null +++ b/src/test/singlenode_regress/sql/insert_conflict.sql @@ -0,0 +1,582 @@ +-- +-- insert...on conflict do unique index inference +-- +create table insertconflicttest(key int4, fruit text); + +-- +-- Test unique index inference with operator class specifications and +-- named collations +-- +create unique index op_index_key on insertconflicttest(key, fruit text_pattern_ops); +create unique index collation_index_key on insertconflicttest(key, fruit collate "C"); +create unique index both_index_key on insertconflicttest(key, fruit collate "C" text_pattern_ops); +create unique index both_index_expr_key on insertconflicttest(key, lower(fruit) collate "C" text_pattern_ops); + +-- fails +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key) do nothing; +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit) do nothing; + +-- succeeds +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit) do nothing; +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit, key, fruit, key) do nothing; +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit), key, lower(fruit), key) do nothing; +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit) do update set fruit = excluded.fruit + where exists (select 1 from insertconflicttest ii where ii.key = excluded.key); +-- Neither collation nor operator class specifications are required -- +-- supplying them merely *limits* matches to indexes with matching opclasses +-- used for relevant indexes +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit text_pattern_ops) do nothing; +-- Okay, arbitrates using both index where text_pattern_ops opclass does and +-- does not appear. +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit collate "C") do nothing; +-- Okay, but only accepts the single index where both opclass and collation are +-- specified +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit collate "C" text_pattern_ops, key) do nothing; +-- Okay, but only accepts the single index where both opclass and collation are +-- specified (plus expression variant) +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) collate "C", key, key) do nothing; +-- Attribute appears twice, while not all attributes/expressions on attributes +-- appearing within index definition match in terms of both opclass and +-- collation. +-- +-- Works because every attribute in inference specification needs to be +-- satisfied once or more by cataloged index attribute, and as always when an +-- attribute in the cataloged definition has a non-default opclass/collation, +-- it still satisfied some inference attribute lacking any particular +-- opclass/collation specification. +-- +-- The implementation is liberal in accepting inference specifications on the +-- assumption that multiple inferred unique indexes will prevent problematic +-- cases. It rolls with unique indexes where attributes redundantly appear +-- multiple times, too (which is not tested here). +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit, key, fruit text_pattern_ops, key) do nothing; +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) collate "C" text_pattern_ops, key, key) do nothing; + +drop index op_index_key; +drop index collation_index_key; +drop index both_index_key; +drop index both_index_expr_key; + +-- +-- Make sure that cross matching of attribute opclass/collation does not occur +-- +create unique index cross_match on insertconflicttest(lower(fruit) collate "C", upper(fruit) text_pattern_ops); + +-- fails: +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) text_pattern_ops, upper(fruit) collate "C") do nothing; +-- works: +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) collate "C", upper(fruit) text_pattern_ops) do nothing; + +drop index cross_match; + +-- +-- Single key tests +-- +create unique index key_index on insertconflicttest(key); + +-- +-- Explain tests +-- +explain (costs off) insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit; +-- Should display qual actually attributable to internal sequential scan: +explain (costs off) insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit where insertconflicttest.fruit != 'Cawesh'; +-- With EXCLUDED.* expression in scan node: +explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key) do update set fruit = excluded.fruit where excluded.fruit != 'Elderberry'; +-- Does the same, but JSON format shows "Conflict Arbiter Index" as JSON array: +explain (costs off, format json) insert into insertconflicttest values (0, 'Bilberry') on conflict (key) do update set fruit = excluded.fruit where insertconflicttest.fruit != 'Lime' returning *; + +-- Fails (no unique index inference specification, required for do update variant): +insert into insertconflicttest values (1, 'Apple') on conflict do update set fruit = excluded.fruit; + +-- inference succeeds: +insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (2, 'Orange') on conflict (key, key, key) do update set fruit = excluded.fruit; + +-- Succeed, since multi-assignment does not involve subquery: +insert into insertconflicttest +values (1, 'Apple'), (2, 'Orange') +on conflict (key) do update set (fruit, key) = (excluded.fruit, excluded.key); + +-- Give good diagnostic message when EXCLUDED.* spuriously referenced from +-- RETURNING: +insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruit RETURNING excluded.fruit; + +-- Only suggest .* column when inference element misspelled: +insert into insertconflicttest values (1, 'Apple') on conflict (keyy) do update set fruit = excluded.fruit; + +-- Have useful HINT for EXCLUDED.* RTE within UPDATE: +insert into insertconflicttest values (1, 'Apple') on conflict (key) do update set fruit = excluded.fruitt; + +-- inference fails: +insert into insertconflicttest values (3, 'Kiwi') on conflict (key, fruit) do update set fruit = excluded.fruit; +insert into insertconflicttest values (4, 'Mango') on conflict (fruit, key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (5, 'Lemon') on conflict (fruit) do update set fruit = excluded.fruit; +insert into insertconflicttest values (6, 'Passionfruit') on conflict (lower(fruit)) do update set fruit = excluded.fruit; + +-- Check the target relation can be aliased +insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = excluded.fruit; -- ok, no reference to target table +insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = ict.fruit; -- ok, alias +insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = insertconflicttest.fruit; -- error, references aliased away name + +drop index key_index; + +-- +-- Composite key tests +-- +create unique index comp_key_index on insertconflicttest(key, fruit); + +-- inference succeeds: +insert into insertconflicttest values (7, 'Raspberry') on conflict (key, fruit) do update set fruit = excluded.fruit; +insert into insertconflicttest values (8, 'Lime') on conflict (fruit, key) do update set fruit = excluded.fruit; + +-- inference fails: +insert into insertconflicttest values (9, 'Banana') on conflict (key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (10, 'Blueberry') on conflict (key, key, key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (11, 'Cherry') on conflict (key, lower(fruit)) do update set fruit = excluded.fruit; +insert into insertconflicttest values (12, 'Date') on conflict (lower(fruit), key) do update set fruit = excluded.fruit; + +drop index comp_key_index; + +-- +-- Partial index tests, no inference predicate specified +-- +create unique index part_comp_key_index on insertconflicttest(key, fruit) where key < 5; +create unique index expr_part_comp_key_index on insertconflicttest(key, lower(fruit)) where key < 5; + +-- inference fails: +insert into insertconflicttest values (13, 'Grape') on conflict (key, fruit) do update set fruit = excluded.fruit; +insert into insertconflicttest values (14, 'Raisin') on conflict (fruit, key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (15, 'Cranberry') on conflict (key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (16, 'Melon') on conflict (key, key, key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (17, 'Mulberry') on conflict (key, lower(fruit)) do update set fruit = excluded.fruit; +insert into insertconflicttest values (18, 'Pineapple') on conflict (lower(fruit), key) do update set fruit = excluded.fruit; + +drop index part_comp_key_index; +drop index expr_part_comp_key_index; + +-- +-- Expression index tests +-- +create unique index expr_key_index on insertconflicttest(lower(fruit)); + +-- inference succeeds: +insert into insertconflicttest values (20, 'Quince') on conflict (lower(fruit)) do update set fruit = excluded.fruit; +insert into insertconflicttest values (21, 'Pomegranate') on conflict (lower(fruit), lower(fruit)) do update set fruit = excluded.fruit; + +-- inference fails: +insert into insertconflicttest values (22, 'Apricot') on conflict (upper(fruit)) do update set fruit = excluded.fruit; +insert into insertconflicttest values (23, 'Blackberry') on conflict (fruit) do update set fruit = excluded.fruit; + +drop index expr_key_index; + +-- +-- Expression index tests (with regular column) +-- +create unique index expr_comp_key_index on insertconflicttest(key, lower(fruit)); +create unique index tricky_expr_comp_key_index on insertconflicttest(key, lower(fruit), upper(fruit)); + +-- inference succeeds: +insert into insertconflicttest values (24, 'Plum') on conflict (key, lower(fruit)) do update set fruit = excluded.fruit; +insert into insertconflicttest values (25, 'Peach') on conflict (lower(fruit), key) do update set fruit = excluded.fruit; +-- Should not infer "tricky_expr_comp_key_index" index: +explain (costs off) insert into insertconflicttest values (26, 'Fig') on conflict (lower(fruit), key, lower(fruit), key) do update set fruit = excluded.fruit; + +-- inference fails: +insert into insertconflicttest values (27, 'Prune') on conflict (key, upper(fruit)) do update set fruit = excluded.fruit; +insert into insertconflicttest values (28, 'Redcurrant') on conflict (fruit, key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (29, 'Nectarine') on conflict (key) do update set fruit = excluded.fruit; + +drop index expr_comp_key_index; +drop index tricky_expr_comp_key_index; + +-- +-- Non-spurious duplicate violation tests +-- +create unique index key_index on insertconflicttest(key); +create unique index fruit_index on insertconflicttest(fruit); + +-- succeeds, since UPDATE happens to update "fruit" to existing value: +insert into insertconflicttest values (26, 'Fig') on conflict (key) do update set fruit = excluded.fruit; +-- fails, since UPDATE is to row with key value 26, and we're updating "fruit" +-- to a value that happens to exist in another row ('peach'): +insert into insertconflicttest values (26, 'Peach') on conflict (key) do update set fruit = excluded.fruit; +-- succeeds, since "key" isn't repeated/referenced in UPDATE, and "fruit" +-- arbitrates that statement updates existing "Fig" row: +insert into insertconflicttest values (25, 'Fig') on conflict (fruit) do update set fruit = excluded.fruit; + +drop index key_index; +drop index fruit_index; + +-- +-- Test partial unique index inference +-- +create unique index partial_key_index on insertconflicttest(key) where fruit like '%berry'; + +-- Succeeds +insert into insertconflicttest values (23, 'Blackberry') on conflict (key) where fruit like '%berry' do update set fruit = excluded.fruit; +insert into insertconflicttest as t values (23, 'Blackberry') on conflict (key) where fruit like '%berry' and t.fruit = 'inconsequential' do nothing; + +-- fails +insert into insertconflicttest values (23, 'Blackberry') on conflict (key) do update set fruit = excluded.fruit; +insert into insertconflicttest values (23, 'Blackberry') on conflict (key) where fruit like '%berry' or fruit = 'consequential' do nothing; +insert into insertconflicttest values (23, 'Blackberry') on conflict (fruit) where fruit like '%berry' do update set fruit = excluded.fruit; + +drop index partial_key_index; + +-- +-- Test that wholerow references to ON CONFLICT's EXCLUDED work +-- +create unique index plain on insertconflicttest(key); + +-- Succeeds, updates existing row: +insert into insertconflicttest as i values (23, 'Jackfruit') on conflict (key) do update set fruit = excluded.fruit + where i.* != excluded.* returning *; +-- No update this time, though: +insert into insertconflicttest as i values (23, 'Jackfruit') on conflict (key) do update set fruit = excluded.fruit + where i.* != excluded.* returning *; +-- Predicate changed to require match rather than non-match, so updates once more: +insert into insertconflicttest as i values (23, 'Jackfruit') on conflict (key) do update set fruit = excluded.fruit + where i.* = excluded.* returning *; +-- Assign: +insert into insertconflicttest as i values (23, 'Avocado') on conflict (key) do update set fruit = excluded.*::text + returning *; +-- deparse whole row var in WHERE and SET clauses: +explain (costs off) insert into insertconflicttest as i values (23, 'Avocado') on conflict (key) do update set fruit = excluded.fruit where excluded.* is null; +explain (costs off) insert into insertconflicttest as i values (23, 'Avocado') on conflict (key) do update set fruit = excluded.*::text; + +drop index plain; + +-- Cleanup +drop table insertconflicttest; + + +-- +-- Verify that EXCLUDED does not allow system column references. These +-- do not make sense because EXCLUDED isn't an already stored tuple +-- (and thus doesn't have a ctid etc). +-- +create table syscolconflicttest(key int4, data text); +insert into syscolconflicttest values (1); +insert into syscolconflicttest values (1) on conflict (key) do update set data = excluded.ctid::text; +drop table syscolconflicttest; + +-- +-- Previous tests all managed to not test any expressions requiring +-- planner preprocessing ... +-- +create table insertconflict (a bigint, b bigint); + +create unique index insertconflicti1 on insertconflict(coalesce(a, 0)); + +create unique index insertconflicti2 on insertconflict(b) + where coalesce(a, 1) > 0; + +insert into insertconflict values (1, 2) +on conflict (coalesce(a, 0)) do nothing; + +insert into insertconflict values (1, 2) +on conflict (b) where coalesce(a, 1) > 0 do nothing; + +insert into insertconflict values (1, 2) +on conflict (b) where coalesce(a, 1) > 1 do nothing; + +drop table insertconflict; + +-- +-- test insertion through view +-- + +create table insertconflict (f1 int primary key, f2 text); +create view insertconflictv as + select * from insertconflict with cascaded check option; + +insert into insertconflictv values (1,'foo') + on conflict (f1) do update set f2 = excluded.f2; +select * from insertconflict; +insert into insertconflictv values (1,'bar') + on conflict (f1) do update set f2 = excluded.f2; +select * from insertconflict; + +drop view insertconflictv; +drop table insertconflict; + + +-- ****************************************************************** +-- * * +-- * Test inheritance (example taken from tutorial) * +-- * * +-- ****************************************************************** +create table cities ( + name text, + population float8, + altitude int -- (in ft) +); + +create table capitals ( + state char(2) +) inherits (cities); + +-- Create unique indexes. Due to a general limitation of inheritance, +-- uniqueness is only enforced per-relation. Unique index inference +-- specification will do the right thing, though. +create unique index cities_names_unique on cities (name); +create unique index capitals_names_unique on capitals (name); + +-- prepopulate the tables. +insert into cities values ('San Francisco', 7.24E+5, 63); +insert into cities values ('Las Vegas', 2.583E+5, 2174); +insert into cities values ('Mariposa', 1200, 1953); + +insert into capitals values ('Sacramento', 3.694E+5, 30, 'CA'); +insert into capitals values ('Madison', 1.913E+5, 845, 'WI'); + +-- Tests proper for inheritance: +select * from capitals; + +-- Succeeds: +insert into cities values ('Las Vegas', 2.583E+5, 2174) on conflict do nothing; +insert into capitals values ('Sacramento', 4664.E+5, 30, 'CA') on conflict (name) do update set population = excluded.population; +-- Wrong "Sacramento", so do nothing: +insert into capitals values ('Sacramento', 50, 2267, 'NE') on conflict (name) do nothing; +select * from capitals; +insert into cities values ('Las Vegas', 5.83E+5, 2001) on conflict (name) do update set population = excluded.population, altitude = excluded.altitude; +select tableoid::regclass, * from cities; +insert into capitals values ('Las Vegas', 5.83E+5, 2222, 'NV') on conflict (name) do update set population = excluded.population; +-- Capitals will contain new capital, Las Vegas: +select * from capitals; +-- Cities contains two instances of "Las Vegas", since unique constraints don't +-- work across inheritance: +select tableoid::regclass, * from cities; +-- This only affects "cities" version of "Las Vegas": +insert into cities values ('Las Vegas', 5.86E+5, 2223) on conflict (name) do update set population = excluded.population, altitude = excluded.altitude; +select tableoid::regclass, * from cities; + +-- clean up +drop table capitals; +drop table cities; + + +-- Make sure a table named excluded is handled properly +create table excluded(key int primary key, data text); +insert into excluded values(1, '1'); +-- error, ambiguous +insert into excluded values(1, '2') on conflict (key) do update set data = excluded.data RETURNING *; +-- ok, aliased +insert into excluded AS target values(1, '2') on conflict (key) do update set data = excluded.data RETURNING *; +-- ok, aliased +insert into excluded AS target values(1, '2') on conflict (key) do update set data = target.data RETURNING *; +-- make sure excluded isn't a problem in returning clause +insert into excluded values(1, '2') on conflict (key) do update set data = 3 RETURNING excluded.*; + +-- clean up +drop table excluded; + + +-- check that references to columns after dropped columns are handled correctly +create table dropcol(key int primary key, drop1 int, keep1 text, drop2 numeric, keep2 float); +insert into dropcol(key, drop1, keep1, drop2, keep2) values(1, 1, '1', '1', 1); +-- set using excluded +insert into dropcol(key, drop1, keep1, drop2, keep2) values(1, 2, '2', '2', 2) on conflict(key) + do update set drop1 = excluded.drop1, keep1 = excluded.keep1, drop2 = excluded.drop2, keep2 = excluded.keep2 + where excluded.drop1 is not null and excluded.keep1 is not null and excluded.drop2 is not null and excluded.keep2 is not null + and dropcol.drop1 is not null and dropcol.keep1 is not null and dropcol.drop2 is not null and dropcol.keep2 is not null + returning *; +; +-- set using existing table +insert into dropcol(key, drop1, keep1, drop2, keep2) values(1, 3, '3', '3', 3) on conflict(key) + do update set drop1 = dropcol.drop1, keep1 = dropcol.keep1, drop2 = dropcol.drop2, keep2 = dropcol.keep2 + returning *; +; +alter table dropcol drop column drop1, drop column drop2; +-- set using excluded +insert into dropcol(key, keep1, keep2) values(1, '4', 4) on conflict(key) + do update set keep1 = excluded.keep1, keep2 = excluded.keep2 + where excluded.keep1 is not null and excluded.keep2 is not null + and dropcol.keep1 is not null and dropcol.keep2 is not null + returning *; +; +-- set using existing table +insert into dropcol(key, keep1, keep2) values(1, '5', 5) on conflict(key) + do update set keep1 = dropcol.keep1, keep2 = dropcol.keep2 + returning *; +; + +DROP TABLE dropcol; + +-- check handling of regular btree constraint along with gist constraint + +create table twoconstraints (f1 int unique, f2 box, + exclude using gist(f2 with &&)); +insert into twoconstraints values(1, '((0,0),(1,1))'); +insert into twoconstraints values(1, '((2,2),(3,3))'); -- fail on f1 +insert into twoconstraints values(2, '((0,0),(1,2))'); -- fail on f2 +insert into twoconstraints values(2, '((0,0),(1,2))') + on conflict on constraint twoconstraints_f1_key do nothing; -- fail on f2 +insert into twoconstraints values(2, '((0,0),(1,2))') + on conflict on constraint twoconstraints_f2_excl do nothing; -- do nothing +select * from twoconstraints; +drop table twoconstraints; + +-- check handling of self-conflicts at various isolation levels + +create table selfconflict (f1 int primary key, f2 int); + +begin transaction isolation level read committed; +insert into selfconflict values (1,1), (1,2) on conflict do nothing; +commit; + +begin transaction isolation level repeatable read; +insert into selfconflict values (2,1), (2,2) on conflict do nothing; +commit; + +begin transaction isolation level serializable; +insert into selfconflict values (3,1), (3,2) on conflict do nothing; +commit; + +begin transaction isolation level read committed; +insert into selfconflict values (4,1), (4,2) on conflict(f1) do update set f2 = 0; +commit; + +begin transaction isolation level repeatable read; +insert into selfconflict values (5,1), (5,2) on conflict(f1) do update set f2 = 0; +commit; + +begin transaction isolation level serializable; +insert into selfconflict values (6,1), (6,2) on conflict(f1) do update set f2 = 0; +commit; + +select * from selfconflict; + +drop table selfconflict; + +-- check ON CONFLICT handling with partitioned tables +create table parted_conflict_test (a int unique, b char) partition by list (a); +create table parted_conflict_test_1 partition of parted_conflict_test (b unique) for values in (1, 2); + +-- no indexes required here +insert into parted_conflict_test values (1, 'a') on conflict do nothing; + +-- index on a required, which does exist in parent +insert into parted_conflict_test values (1, 'a') on conflict (a) do nothing; +insert into parted_conflict_test values (1, 'a') on conflict (a) do update set b = excluded.b; + +-- targeting partition directly will work +insert into parted_conflict_test_1 values (1, 'a') on conflict (a) do nothing; +insert into parted_conflict_test_1 values (1, 'b') on conflict (a) do update set b = excluded.b; + +-- index on b required, which doesn't exist in parent +insert into parted_conflict_test values (2, 'b') on conflict (b) do update set a = excluded.a; + +-- targeting partition directly will work +insert into parted_conflict_test_1 values (2, 'b') on conflict (b) do update set a = excluded.a; + +-- should see (2, 'b') +select * from parted_conflict_test order by a; + +-- now check that DO UPDATE works correctly for target partition with +-- different attribute numbers +create table parted_conflict_test_2 (b char, a int unique); +alter table parted_conflict_test attach partition parted_conflict_test_2 for values in (3); +truncate parted_conflict_test; +insert into parted_conflict_test values (3, 'a') on conflict (a) do update set b = excluded.b; +insert into parted_conflict_test values (3, 'b') on conflict (a) do update set b = excluded.b; + +-- should see (3, 'b') +select * from parted_conflict_test order by a; + +-- case where parent will have a dropped column, but the partition won't +alter table parted_conflict_test drop b, add b char; +create table parted_conflict_test_3 partition of parted_conflict_test for values in (4); +truncate parted_conflict_test; +insert into parted_conflict_test (a, b) values (4, 'a') on conflict (a) do update set b = excluded.b; +insert into parted_conflict_test (a, b) values (4, 'b') on conflict (a) do update set b = excluded.b where parted_conflict_test.b = 'a'; + +-- should see (4, 'b') +select * from parted_conflict_test order by a; + +-- case with multi-level partitioning +create table parted_conflict_test_4 partition of parted_conflict_test for values in (5) partition by list (a); +create table parted_conflict_test_4_1 partition of parted_conflict_test_4 for values in (5); +truncate parted_conflict_test; +insert into parted_conflict_test (a, b) values (5, 'a') on conflict (a) do update set b = excluded.b; +insert into parted_conflict_test (a, b) values (5, 'b') on conflict (a) do update set b = excluded.b where parted_conflict_test.b = 'a'; + +-- should see (5, 'b') +select * from parted_conflict_test order by a; + +-- test with multiple rows +truncate parted_conflict_test; +insert into parted_conflict_test (a, b) values (1, 'a'), (2, 'a'), (4, 'a') on conflict (a) do update set b = excluded.b where excluded.b = 'b'; +insert into parted_conflict_test (a, b) values (1, 'b'), (2, 'c'), (4, 'b') on conflict (a) do update set b = excluded.b where excluded.b = 'b'; + +-- should see (1, 'b'), (2, 'a'), (4, 'b') +select * from parted_conflict_test order by a; + +drop table parted_conflict_test; + +-- test behavior of inserting a conflicting tuple into an intermediate +-- partitioning level +create table parted_conflict (a int primary key, b text) partition by range (a); +create table parted_conflict_1 partition of parted_conflict for values from (0) to (1000) partition by range (a); +create table parted_conflict_1_1 partition of parted_conflict_1 for values from (0) to (500); +insert into parted_conflict values (40, 'forty'); +insert into parted_conflict_1 values (40, 'cuarenta') + on conflict (a) do update set b = excluded.b; +drop table parted_conflict; + +-- same thing, but this time try to use an index that's created not in the +-- partition +create table parted_conflict (a int, b text) partition by range (a); +create table parted_conflict_1 partition of parted_conflict for values from (0) to (1000) partition by range (a); +create table parted_conflict_1_1 partition of parted_conflict_1 for values from (0) to (500); +create unique index on only parted_conflict_1 (a); +create unique index on only parted_conflict (a); +alter index parted_conflict_a_idx attach partition parted_conflict_1_a_idx; +insert into parted_conflict values (40, 'forty'); +insert into parted_conflict_1 values (40, 'cuarenta') + on conflict (a) do update set b = excluded.b; +drop table parted_conflict; + +-- test whole-row Vars in ON CONFLICT expressions +create table parted_conflict (a int, b text, c int) partition by range (a); +create table parted_conflict_1 (drp text, c int, a int, b text); +alter table parted_conflict_1 drop column drp; +create unique index on parted_conflict (a, b); +alter table parted_conflict attach partition parted_conflict_1 for values from (0) to (1000); +truncate parted_conflict; +insert into parted_conflict values (50, 'cincuenta', 1); +insert into parted_conflict values (50, 'cincuenta', 2) + on conflict (a, b) do update set (a, b, c) = row(excluded.*) + where parted_conflict = (50, text 'cincuenta', 1) and + excluded = (50, text 'cincuenta', 2); + +-- should see (50, 'cincuenta', 2) +select * from parted_conflict order by a; + +-- test with statement level triggers +create or replace function parted_conflict_update_func() returns trigger as $$ +declare + r record; +begin + for r in select * from inserted loop + raise notice 'a = %, b = %, c = %', r.a, r.b, r.c; + end loop; + return new; +end; +$$ language plpgsql; + +create trigger parted_conflict_update + after update on parted_conflict + referencing new table as inserted + for each statement + execute procedure parted_conflict_update_func(); + +truncate parted_conflict; + +insert into parted_conflict values (0, 'cero', 1); + +insert into parted_conflict values(0, 'cero', 1) + on conflict (a,b) do update set c = parted_conflict.c + 1; + +drop table parted_conflict; +drop function parted_conflict_update_func(); diff --git a/src/test/singlenode_regress/sql/int2.sql b/src/test/singlenode_regress/sql/int2.sql new file mode 100644 index 00000000000..2f5ea64e3b4 --- /dev/null +++ b/src/test/singlenode_regress/sql/int2.sql @@ -0,0 +1,118 @@ +-- +-- INT2 +-- + +CREATE TABLE INT2_TBL(f1 int2); + +INSERT INTO INT2_TBL(f1) VALUES ('0 '); + +INSERT INTO INT2_TBL(f1) VALUES (' 1234 '); + +INSERT INTO INT2_TBL(f1) VALUES (' -1234'); + +INSERT INTO INT2_TBL(f1) VALUES ('34.5'); + +-- largest and smallest values +INSERT INTO INT2_TBL(f1) VALUES ('32767'); + +INSERT INTO INT2_TBL(f1) VALUES ('-32767'); + +-- bad input values -- should give errors +INSERT INTO INT2_TBL(f1) VALUES ('100000'); +INSERT INTO INT2_TBL(f1) VALUES ('asdf'); +INSERT INTO INT2_TBL(f1) VALUES (' '); +INSERT INTO INT2_TBL(f1) VALUES ('- 1234'); +INSERT INTO INT2_TBL(f1) VALUES ('4 444'); +INSERT INTO INT2_TBL(f1) VALUES ('123 dt'); +INSERT INTO INT2_TBL(f1) VALUES (''); + + +SELECT * FROM INT2_TBL; + +SELECT * FROM INT2_TBL AS f(a, b); + +SELECT * FROM (TABLE int2_tbl) AS s (a, b); + +SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int2 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int4 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 = int2 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 = int4 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 < int2 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 < int4 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 <= int2 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 <= int4 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 > int2 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 > int4 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 >= int2 '0'; + +SELECT i.* FROM INT2_TBL i WHERE i.f1 >= int4 '0'; + +-- positive odds +SELECT i.* FROM INT2_TBL i WHERE (i.f1 % int2 '2') = int2 '1'; + +-- any evens +SELECT i.* FROM INT2_TBL i WHERE (i.f1 % int4 '2') = int2 '0'; + +SELECT i.f1, i.f1 * int2 '2' AS x FROM INT2_TBL i; + +SELECT i.f1, i.f1 * int2 '2' AS x FROM INT2_TBL i +WHERE abs(f1) < 16384; + +SELECT i.f1, i.f1 * int4 '2' AS x FROM INT2_TBL i; + +SELECT i.f1, i.f1 + int2 '2' AS x FROM INT2_TBL i; + +SELECT i.f1, i.f1 + int2 '2' AS x FROM INT2_TBL i +WHERE f1 < 32766; + +SELECT i.f1, i.f1 + int4 '2' AS x FROM INT2_TBL i; + +SELECT i.f1, i.f1 - int2 '2' AS x FROM INT2_TBL i; + +SELECT i.f1, i.f1 - int2 '2' AS x FROM INT2_TBL i +WHERE f1 > -32767; + +SELECT i.f1, i.f1 - int4 '2' AS x FROM INT2_TBL i; + +SELECT i.f1, i.f1 / int2 '2' AS x FROM INT2_TBL i; + +SELECT i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i; + +-- corner cases +SELECT (-1::int2<<15)::text; +SELECT ((-1::int2<<15)+1::int2)::text; + +-- check sane handling of INT16_MIN overflow cases +SELECT (-32768)::int2 * (-1)::int2; +SELECT (-32768)::int2 / (-1)::int2; +SELECT (-32768)::int2 % (-1)::int2; + +-- check rounding when casting from float +SELECT x, x::int2 AS int2_value +FROM (VALUES (-2.5::float8), + (-1.5::float8), + (-0.5::float8), + (0.0::float8), + (0.5::float8), + (1.5::float8), + (2.5::float8)) t(x); + +-- check rounding when casting from numeric +SELECT x, x::int2 AS int2_value +FROM (VALUES (-2.5::numeric), + (-1.5::numeric), + (-0.5::numeric), + (0.0::numeric), + (0.5::numeric), + (1.5::numeric), + (2.5::numeric)) t(x); diff --git a/src/test/singlenode_regress/sql/int4.sql b/src/test/singlenode_regress/sql/int4.sql new file mode 100644 index 00000000000..55ec07a1470 --- /dev/null +++ b/src/test/singlenode_regress/sql/int4.sql @@ -0,0 +1,178 @@ +-- +-- INT4 +-- + +CREATE TABLE INT4_TBL(f1 int4); + +INSERT INTO INT4_TBL(f1) VALUES (' 0 '); + +INSERT INTO INT4_TBL(f1) VALUES ('123456 '); + +INSERT INTO INT4_TBL(f1) VALUES (' -123456'); + +INSERT INTO INT4_TBL(f1) VALUES ('34.5'); + +-- largest and smallest values +INSERT INTO INT4_TBL(f1) VALUES ('2147483647'); + +INSERT INTO INT4_TBL(f1) VALUES ('-2147483647'); + +-- bad input values -- should give errors +INSERT INTO INT4_TBL(f1) VALUES ('1000000000000'); +INSERT INTO INT4_TBL(f1) VALUES ('asdf'); +INSERT INTO INT4_TBL(f1) VALUES (' '); +INSERT INTO INT4_TBL(f1) VALUES (' asdf '); +INSERT INTO INT4_TBL(f1) VALUES ('- 1234'); +INSERT INTO INT4_TBL(f1) VALUES ('123 5'); +INSERT INTO INT4_TBL(f1) VALUES (''); + + +SELECT * FROM INT4_TBL; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 = int2 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 = int4 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 < int2 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 < int4 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 > int2 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 > int4 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0'; + +SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0'; + +-- positive odds +SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1'; + +-- any evens +SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0'; + +SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i; + +SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i +WHERE abs(f1) < 1073741824; + +SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i; + +SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i +WHERE abs(f1) < 1073741824; + +SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i; + +SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i +WHERE f1 < 2147483646; + +SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i; + +SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i +WHERE f1 < 2147483646; + +SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i; + +SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i +WHERE f1 > -2147483647; + +SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i; + +SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i +WHERE f1 > -2147483647; + +SELECT i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i; + +SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i; + +-- +-- more complex expressions +-- + +-- variations on unary minus parsing +SELECT -2+3 AS one; + +SELECT 4-2 AS two; + +SELECT 2- -1 AS three; + +SELECT 2 - -2 AS four; + +SELECT int2 '2' * int2 '2' = int2 '16' / int2 '4' AS true; + +SELECT int4 '2' * int2 '2' = int2 '16' / int4 '4' AS true; + +SELECT int2 '2' * int4 '2' = int4 '16' / int2 '4' AS true; + +SELECT int4 '1000' < int4 '999' AS false; + +SELECT 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 AS ten; + +SELECT 2 + 2 / 2 AS three; + +SELECT (2 + 2) / 2 AS two; + +-- corner case +SELECT (-1::int4<<31)::text; +SELECT ((-1::int4<<31)+1)::text; + +-- check sane handling of INT_MIN overflow cases +SELECT (-2147483648)::int4 * (-1)::int4; +SELECT (-2147483648)::int4 / (-1)::int4; +SELECT (-2147483648)::int4 % (-1)::int4; +SELECT (-2147483648)::int4 * (-1)::int2; +SELECT (-2147483648)::int4 / (-1)::int2; +SELECT (-2147483648)::int4 % (-1)::int2; + +-- check rounding when casting from float +SELECT x, x::int4 AS int4_value +FROM (VALUES (-2.5::float8), + (-1.5::float8), + (-0.5::float8), + (0.0::float8), + (0.5::float8), + (1.5::float8), + (2.5::float8)) t(x); + +-- check rounding when casting from numeric +SELECT x, x::int4 AS int4_value +FROM (VALUES (-2.5::numeric), + (-1.5::numeric), + (-0.5::numeric), + (0.0::numeric), + (0.5::numeric), + (1.5::numeric), + (2.5::numeric)) t(x); + +-- test gcd() +SELECT a, b, gcd(a, b), gcd(a, -b), gcd(b, a), gcd(-b, a) +FROM (VALUES (0::int4, 0::int4), + (0::int4, 6410818::int4), + (61866666::int4, 6410818::int4), + (-61866666::int4, 6410818::int4), + ((-2147483648)::int4, 1::int4), + ((-2147483648)::int4, 2147483647::int4), + ((-2147483648)::int4, 1073741824::int4)) AS v(a, b); + +SELECT gcd((-2147483648)::int4, 0::int4); -- overflow +SELECT gcd((-2147483648)::int4, (-2147483648)::int4); -- overflow + +-- test lcm() +SELECT a, b, lcm(a, b), lcm(a, -b), lcm(b, a), lcm(-b, a) +FROM (VALUES (0::int4, 0::int4), + (0::int4, 42::int4), + (42::int4, 42::int4), + (330::int4, 462::int4), + (-330::int4, 462::int4), + ((-2147483648)::int4, 0::int4)) AS v(a, b); + +SELECT lcm((-2147483648)::int4, 1::int4); -- overflow +SELECT lcm(2147483647::int4, 2147483646::int4); -- overflow diff --git a/src/test/singlenode_regress/sql/int8.sql b/src/test/singlenode_regress/sql/int8.sql new file mode 100644 index 00000000000..32940b4daa5 --- /dev/null +++ b/src/test/singlenode_regress/sql/int8.sql @@ -0,0 +1,252 @@ +-- +-- INT8 +-- Test int8 64-bit integers. +-- +CREATE TABLE INT8_TBL(q1 int8, q2 int8); + +INSERT INTO INT8_TBL VALUES(' 123 ',' 456'); +INSERT INTO INT8_TBL VALUES('123 ','4567890123456789'); +INSERT INTO INT8_TBL VALUES('4567890123456789','123'); +INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789'); +INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789'); + +-- bad inputs +INSERT INTO INT8_TBL(q1) VALUES (' '); +INSERT INTO INT8_TBL(q1) VALUES ('xxx'); +INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485'); +INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934'); +INSERT INTO INT8_TBL(q1) VALUES ('- 123'); +INSERT INTO INT8_TBL(q1) VALUES (' 345 5'); +INSERT INTO INT8_TBL(q1) VALUES (''); + +SELECT * FROM INT8_TBL; + +-- int8/int8 cmp +SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789; +SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789; +SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789; +SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789; +SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789; +SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789; + +-- int8/int4 cmp +SELECT * FROM INT8_TBL WHERE q2 = 456; +SELECT * FROM INT8_TBL WHERE q2 <> 456; +SELECT * FROM INT8_TBL WHERE q2 < 456; +SELECT * FROM INT8_TBL WHERE q2 > 456; +SELECT * FROM INT8_TBL WHERE q2 <= 456; +SELECT * FROM INT8_TBL WHERE q2 >= 456; + +-- int4/int8 cmp +SELECT * FROM INT8_TBL WHERE 123 = q1; +SELECT * FROM INT8_TBL WHERE 123 <> q1; +SELECT * FROM INT8_TBL WHERE 123 < q1; +SELECT * FROM INT8_TBL WHERE 123 > q1; +SELECT * FROM INT8_TBL WHERE 123 <= q1; +SELECT * FROM INT8_TBL WHERE 123 >= q1; + +-- int8/int2 cmp +SELECT * FROM INT8_TBL WHERE q2 = '456'::int2; +SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2; +SELECT * FROM INT8_TBL WHERE q2 < '456'::int2; +SELECT * FROM INT8_TBL WHERE q2 > '456'::int2; +SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2; +SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2; + +-- int2/int8 cmp +SELECT * FROM INT8_TBL WHERE '123'::int2 = q1; +SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1; +SELECT * FROM INT8_TBL WHERE '123'::int2 < q1; +SELECT * FROM INT8_TBL WHERE '123'::int2 > q1; +SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1; +SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1; + + +SELECT q1 AS plus, -q1 AS minus FROM INT8_TBL; + +SELECT q1, q2, q1 + q2 AS plus FROM INT8_TBL; +SELECT q1, q2, q1 - q2 AS minus FROM INT8_TBL; +SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL; +SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL + WHERE q1 < 1000 or (q2 > 0 and q2 < 1000); +SELECT q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL; + +SELECT q1, float8(q1) FROM INT8_TBL; +SELECT q2, float8(q2) FROM INT8_TBL; + +SELECT 37 + q1 AS plus4 FROM INT8_TBL; +SELECT 37 - q1 AS minus4 FROM INT8_TBL; +SELECT 2 * q1 AS "twice int4" FROM INT8_TBL; +SELECT q1 * 2 AS "twice int4" FROM INT8_TBL; + +-- int8 op int4 +SELECT q1 + 42::int4 AS "8plus4", q1 - 42::int4 AS "8minus4", q1 * 42::int4 AS "8mul4", q1 / 42::int4 AS "8div4" FROM INT8_TBL; +-- int4 op int8 +SELECT 246::int4 + q1 AS "4plus8", 246::int4 - q1 AS "4minus8", 246::int4 * q1 AS "4mul8", 246::int4 / q1 AS "4div8" FROM INT8_TBL; + +-- int8 op int2 +SELECT q1 + 42::int2 AS "8plus2", q1 - 42::int2 AS "8minus2", q1 * 42::int2 AS "8mul2", q1 / 42::int2 AS "8div2" FROM INT8_TBL; +-- int2 op int8 +SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL; + +SELECT q2, abs(q2) FROM INT8_TBL; +SELECT min(q1), min(q2) FROM INT8_TBL; +SELECT max(q1), max(q2) FROM INT8_TBL; + + +-- TO_CHAR() +-- +SELECT to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999') + FROM INT8_TBL; + +SELECT to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999') + FROM INT8_TBL; + +SELECT to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR') + FROM INT8_TBL; + +SELECT to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999') + FROM INT8_TBL; + +SELECT to_char(q2, 'MI9999999999999999') FROM INT8_TBL; +SELECT to_char(q2, 'FMS9999999999999999') FROM INT8_TBL; +SELECT to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL; +SELECT to_char(q2, 'SG9999999999999999th') FROM INT8_TBL; +SELECT to_char(q2, '0999999999999999') FROM INT8_TBL; +SELECT to_char(q2, 'S0999999999999999') FROM INT8_TBL; +SELECT to_char(q2, 'FM0999999999999999') FROM INT8_TBL; +SELECT to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL; +SELECT to_char(q2, 'L9999999999999999.000') FROM INT8_TBL; +SELECT to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL; +SELECT to_char(q2, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9') FROM INT8_TBL; +SELECT to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL; +SELECT to_char(q2, '999999SG9999999999') FROM INT8_TBL; + +-- check min/max values and overflow behavior + +select '-9223372036854775808'::int8; +select '-9223372036854775809'::int8; +select '9223372036854775807'::int8; +select '9223372036854775808'::int8; + +select -('-9223372036854775807'::int8); +select -('-9223372036854775808'::int8); + +select '9223372036854775800'::int8 + '9223372036854775800'::int8; +select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; + +select '9223372036854775800'::int8 - '-9223372036854775800'::int8; +select '-9223372036854775800'::int8 - '9223372036854775800'::int8; + +select '9223372036854775800'::int8 * '9223372036854775800'::int8; + +select '9223372036854775800'::int8 / '0'::int8; +select '9223372036854775800'::int8 % '0'::int8; + +select abs('-9223372036854775808'::int8); + +select '9223372036854775800'::int8 + '100'::int4; +select '-9223372036854775800'::int8 - '100'::int4; +select '9223372036854775800'::int8 * '100'::int4; + +select '100'::int4 + '9223372036854775800'::int8; +select '-100'::int4 - '9223372036854775800'::int8; +select '100'::int4 * '9223372036854775800'::int8; + +select '9223372036854775800'::int8 + '100'::int2; +select '-9223372036854775800'::int8 - '100'::int2; +select '9223372036854775800'::int8 * '100'::int2; +select '-9223372036854775808'::int8 / '0'::int2; + +select '100'::int2 + '9223372036854775800'::int8; +select '-100'::int2 - '9223372036854775800'::int8; +select '100'::int2 * '9223372036854775800'::int8; +select '100'::int2 / '0'::int8; + +SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456; +SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456; + +SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456; +SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456; + +SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8); + +SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL; +SELECT CAST('36854775807.0'::float4 AS int8); +SELECT CAST('922337203685477580700.0'::float8 AS int8); + +SELECT CAST(q1 AS oid) FROM INT8_TBL; +SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class'; + + +-- bit operations + +SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL; +SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL; + + +-- generate_series + +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8); +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0); +SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2); + +-- corner case +SELECT (-1::int8<<63)::text; +SELECT ((-1::int8<<63)+1)::text; + +-- check sane handling of INT64_MIN overflow cases +SELECT (-9223372036854775808)::int8 * (-1)::int8; +SELECT (-9223372036854775808)::int8 / (-1)::int8; +SELECT (-9223372036854775808)::int8 % (-1)::int8; +SELECT (-9223372036854775808)::int8 * (-1)::int4; +SELECT (-9223372036854775808)::int8 / (-1)::int4; +SELECT (-9223372036854775808)::int8 % (-1)::int4; +SELECT (-9223372036854775808)::int8 * (-1)::int2; +SELECT (-9223372036854775808)::int8 / (-1)::int2; +SELECT (-9223372036854775808)::int8 % (-1)::int2; + +-- check rounding when casting from float +SELECT x, x::int8 AS int8_value +FROM (VALUES (-2.5::float8), + (-1.5::float8), + (-0.5::float8), + (0.0::float8), + (0.5::float8), + (1.5::float8), + (2.5::float8)) t(x); + +-- check rounding when casting from numeric +SELECT x, x::int8 AS int8_value +FROM (VALUES (-2.5::numeric), + (-1.5::numeric), + (-0.5::numeric), + (0.0::numeric), + (0.5::numeric), + (1.5::numeric), + (2.5::numeric)) t(x); + +-- test gcd() +SELECT a, b, gcd(a, b), gcd(a, -b), gcd(b, a), gcd(-b, a) +FROM (VALUES (0::int8, 0::int8), + (0::int8, 29893644334::int8), + (288484263558::int8, 29893644334::int8), + (-288484263558::int8, 29893644334::int8), + ((-9223372036854775808)::int8, 1::int8), + ((-9223372036854775808)::int8, 9223372036854775807::int8), + ((-9223372036854775808)::int8, 4611686018427387904::int8)) AS v(a, b); + +SELECT gcd((-9223372036854775808)::int8, 0::int8); -- overflow +SELECT gcd((-9223372036854775808)::int8, (-9223372036854775808)::int8); -- overflow + +-- test lcm() +SELECT a, b, lcm(a, b), lcm(a, -b), lcm(b, a), lcm(-b, a) +FROM (VALUES (0::int8, 0::int8), + (0::int8, 29893644334::int8), + (29893644334::int8, 29893644334::int8), + (288484263558::int8, 29893644334::int8), + (-288484263558::int8, 29893644334::int8), + ((-9223372036854775808)::int8, 0::int8)) AS v(a, b); + +SELECT lcm((-9223372036854775808)::int8, 1::int8); -- overflow +SELECT lcm(9223372036854775807::int8, 9223372036854775806::int8); -- overflow diff --git a/src/test/singlenode_regress/sql/interval.sql b/src/test/singlenode_regress/sql/interval.sql new file mode 100644 index 00000000000..6d532398bd6 --- /dev/null +++ b/src/test/singlenode_regress/sql/interval.sql @@ -0,0 +1,357 @@ +-- +-- INTERVAL +-- + +SET DATESTYLE = 'ISO'; +SET IntervalStyle to postgres; + +-- check acceptance of "time zone style" +SELECT INTERVAL '01:00' AS "One hour"; +SELECT INTERVAL '+02:00' AS "Two hours"; +SELECT INTERVAL '-08:00' AS "Eight hours"; +SELECT INTERVAL '-1 +02:03' AS "22 hours ago..."; +SELECT INTERVAL '-1 days +02:03' AS "22 hours ago..."; +SELECT INTERVAL '1.5 weeks' AS "Ten days twelve hours"; +SELECT INTERVAL '1.5 months' AS "One month 15 days"; +SELECT INTERVAL '10 years -11 month -12 days +13:14' AS "9 years..."; + +CREATE TABLE INTERVAL_TBL (f1 interval); + +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 1 minute'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 5 hour'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 10 day'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 34 year'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 3 months'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 14 seconds ago'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('1 day 2 hours 3 minutes 4 seconds'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('6 years'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months 12 hours'); + +-- badly formatted interval +INSERT INTO INTERVAL_TBL (f1) VALUES ('badly formatted interval'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 30 eons ago'); + +-- test interval operators + +SELECT * FROM INTERVAL_TBL; + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 <> interval '@ 10 days'; + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 <= interval '@ 5 hours'; + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 < interval '@ 1 day'; + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 = interval '@ 34 years'; + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 >= interval '@ 1 month'; + +SELECT * FROM INTERVAL_TBL + WHERE INTERVAL_TBL.f1 > interval '@ 3 seconds ago'; + +SELECT r1.*, r2.* + FROM INTERVAL_TBL r1, INTERVAL_TBL r2 + WHERE r1.f1 > r2.f1 + ORDER BY r1.f1, r2.f1; + +-- Test intervals that are large enough to overflow 64 bits in comparisons +CREATE TEMP TABLE INTERVAL_TBL_OF (f1 interval); +INSERT INTO INTERVAL_TBL_OF (f1) VALUES + ('2147483647 days 2147483647 months'), + ('2147483647 days -2147483648 months'), + ('1 year'), + ('-2147483648 days 2147483647 months'), + ('-2147483648 days -2147483648 months'); +-- these should fail as out-of-range +INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('2147483648 days'); +INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('-2147483649 days'); +INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('2147483647 years'); +INSERT INTO INTERVAL_TBL_OF (f1) VALUES ('-2147483648 years'); + +-- Test edge-case overflow detection in interval multiplication +select extract(epoch from '256 microseconds'::interval * (2^55)::float8); + +SELECT r1.*, r2.* + FROM INTERVAL_TBL_OF r1, INTERVAL_TBL_OF r2 + WHERE r1.f1 > r2.f1 + ORDER BY r1.f1, r2.f1; + +CREATE INDEX ON INTERVAL_TBL_OF USING btree (f1); +SET enable_seqscan TO false; +EXPLAIN (COSTS OFF) +SELECT f1 FROM INTERVAL_TBL_OF r1 ORDER BY f1; +SELECT f1 FROM INTERVAL_TBL_OF r1 ORDER BY f1; +RESET enable_seqscan; + +DROP TABLE INTERVAL_TBL_OF; + +-- Test multiplication and division with intervals. +-- Floating point arithmetic rounding errors can lead to unexpected results, +-- though the code attempts to do the right thing and round up to days and +-- minutes to avoid results such as '3 days 24:00 hours' or '14:20:60'. +-- Note that it is expected for some day components to be greater than 29 and +-- some time components be greater than 23:59:59 due to how intervals are +-- stored internally. + +CREATE TABLE INTERVAL_MULDIV_TBL (span interval); +COPY INTERVAL_MULDIV_TBL FROM STDIN; +41 mon 12 days 360:00 +-41 mon -12 days +360:00 +-12 days +9 mon -27 days 12:34:56 +-3 years 482 days 76:54:32.189 +4 mon +14 mon +999 mon 999 days +\. + +SELECT span * 0.3 AS product +FROM INTERVAL_MULDIV_TBL; + +SELECT span * 8.2 AS product +FROM INTERVAL_MULDIV_TBL; + +SELECT span / 10 AS quotient +FROM INTERVAL_MULDIV_TBL; + +SELECT span / 100 AS quotient +FROM INTERVAL_MULDIV_TBL; + +DROP TABLE INTERVAL_MULDIV_TBL; + +SET DATESTYLE = 'postgres'; +SET IntervalStyle to postgres_verbose; + +SELECT * FROM INTERVAL_TBL; + +-- test avg(interval), which is somewhat fragile since people have been +-- known to change the allowed input syntax for type interval without +-- updating pg_aggregate.agginitval + +select avg(f1) from interval_tbl; + +-- test long interval input +select '4 millenniums 5 centuries 4 decades 1 year 4 months 4 days 17 minutes 31 seconds'::interval; + +-- test long interval output +-- Note: the actual maximum length of the interval output is longer, +-- but we need the test to work for both integer and floating-point +-- timestamps. +select '100000000y 10mon -1000000000d -100000h -10min -10.000001s ago'::interval; + +-- test justify_hours() and justify_days() + +SELECT justify_hours(interval '6 months 3 days 52 hours 3 minutes 2 seconds') as "6 mons 5 days 4 hours 3 mins 2 seconds"; +SELECT justify_days(interval '6 months 36 days 5 hours 4 minutes 3 seconds') as "7 mons 6 days 5 hours 4 mins 3 seconds"; + +-- test justify_interval() + +SELECT justify_interval(interval '1 month -1 hour') as "1 month -1 hour"; + +-- test fractional second input, and detection of duplicate units +SET DATESTYLE = 'ISO'; +SET IntervalStyle TO postgres; + +SELECT '1 millisecond'::interval, '1 microsecond'::interval, + '500 seconds 99 milliseconds 51 microseconds'::interval; +SELECT '3 days 5 milliseconds'::interval; + +SELECT '1 second 2 seconds'::interval; -- error +SELECT '10 milliseconds 20 milliseconds'::interval; -- error +SELECT '5.5 seconds 3 milliseconds'::interval; -- error +SELECT '1:20:05 5 microseconds'::interval; -- error +SELECT '1 day 1 day'::interval; -- error +SELECT interval '1-2'; -- SQL year-month literal +SELECT interval '999' second; -- oversize leading field is ok +SELECT interval '999' minute; +SELECT interval '999' hour; +SELECT interval '999' day; +SELECT interval '999' month; + +-- test SQL-spec syntaxes for restricted field sets +SELECT interval '1' year; +SELECT interval '2' month; +SELECT interval '3' day; +SELECT interval '4' hour; +SELECT interval '5' minute; +SELECT interval '6' second; +SELECT interval '1' year to month; +SELECT interval '1-2' year to month; +SELECT interval '1 2' day to hour; +SELECT interval '1 2:03' day to hour; +SELECT interval '1 2:03:04' day to hour; +SELECT interval '1 2' day to minute; +SELECT interval '1 2:03' day to minute; +SELECT interval '1 2:03:04' day to minute; +SELECT interval '1 2' day to second; +SELECT interval '1 2:03' day to second; +SELECT interval '1 2:03:04' day to second; +SELECT interval '1 2' hour to minute; +SELECT interval '1 2:03' hour to minute; +SELECT interval '1 2:03:04' hour to minute; +SELECT interval '1 2' hour to second; +SELECT interval '1 2:03' hour to second; +SELECT interval '1 2:03:04' hour to second; +SELECT interval '1 2' minute to second; +SELECT interval '1 2:03' minute to second; +SELECT interval '1 2:03:04' minute to second; +SELECT interval '1 +2:03' minute to second; +SELECT interval '1 +2:03:04' minute to second; +SELECT interval '1 -2:03' minute to second; +SELECT interval '1 -2:03:04' minute to second; +SELECT interval '123 11' day to hour; -- ok +SELECT interval '123 11' day; -- not ok +SELECT interval '123 11'; -- not ok, too ambiguous +SELECT interval '123 2:03 -2:04'; -- not ok, redundant hh:mm fields + +-- test syntaxes for restricted precision +SELECT interval(0) '1 day 01:23:45.6789'; +SELECT interval(2) '1 day 01:23:45.6789'; +SELECT interval '12:34.5678' minute to second(2); -- per SQL spec +SELECT interval '1.234' second; +SELECT interval '1.234' second(2); +SELECT interval '1 2.345' day to second(2); +SELECT interval '1 2:03' day to second(2); +SELECT interval '1 2:03.4567' day to second(2); +SELECT interval '1 2:03:04.5678' day to second(2); +SELECT interval '1 2.345' hour to second(2); +SELECT interval '1 2:03.45678' hour to second(2); +SELECT interval '1 2:03:04.5678' hour to second(2); +SELECT interval '1 2.3456' minute to second(2); +SELECT interval '1 2:03.5678' minute to second(2); +SELECT interval '1 2:03:04.5678' minute to second(2); + +-- test casting to restricted precision (bug #14479) +SELECT f1, f1::INTERVAL DAY TO MINUTE AS "minutes", + (f1 + INTERVAL '1 month')::INTERVAL MONTH::INTERVAL YEAR AS "years" + FROM interval_tbl; + +-- test inputting and outputting SQL standard interval literals +SET IntervalStyle TO sql_standard; +SELECT interval '0' AS "zero", + interval '1-2' year to month AS "year-month", + interval '1 2:03:04' day to second AS "day-time", + - interval '1-2' AS "negative year-month", + - interval '1 2:03:04' AS "negative day-time"; + +-- test input of some not-quite-standard interval values in the sql style +SET IntervalStyle TO postgres; +SELECT interval '+1 -1:00:00', + interval '-1 +1:00:00', + interval '+1-2 -3 +4:05:06.789', + interval '-1-2 +3 -4:05:06.789'; + +-- test output of couple non-standard interval values in the sql style +SET IntervalStyle TO sql_standard; +SELECT interval '1 day -1 hours', + interval '-1 days +1 hours', + interval '1 years 2 months -3 days 4 hours 5 minutes 6.789 seconds', + - interval '1 years 2 months -3 days 4 hours 5 minutes 6.789 seconds'; + +-- test outputting iso8601 intervals +SET IntervalStyle to iso_8601; +select interval '0' AS "zero", + interval '1-2' AS "a year 2 months", + interval '1 2:03:04' AS "a bit over a day", + interval '2:03:04.45679' AS "a bit over 2 hours", + (interval '1-2' + interval '3 4:05:06.7') AS "all fields", + (interval '1-2' - interval '3 4:05:06.7') AS "mixed sign", + (- interval '1-2' + interval '3 4:05:06.7') AS "negative"; + +-- test inputting ISO 8601 4.4.2.1 "Format With Time Unit Designators" +SET IntervalStyle to sql_standard; +select interval 'P0Y' AS "zero", + interval 'P1Y2M' AS "a year 2 months", + interval 'P1W' AS "a week", + interval 'P1DT2H3M4S' AS "a bit over a day", + interval 'P1Y2M3DT4H5M6.7S' AS "all fields", + interval 'P-1Y-2M-3DT-4H-5M-6.7S' AS "negative", + interval 'PT-0.1S' AS "fractional second"; + +-- test inputting ISO 8601 4.4.2.2 "Alternative Format" +SET IntervalStyle to postgres; +select interval 'P00021015T103020' AS "ISO8601 Basic Format", + interval 'P0002-10-15T10:30:20' AS "ISO8601 Extended Format"; + +-- Make sure optional ISO8601 alternative format fields are optional. +select interval 'P0002' AS "year only", + interval 'P0002-10' AS "year month", + interval 'P0002-10-15' AS "year month day", + interval 'P0002T1S' AS "year only plus time", + interval 'P0002-10T1S' AS "year month plus time", + interval 'P0002-10-15T1S' AS "year month day plus time", + interval 'PT10' AS "hour only", + interval 'PT10:30' AS "hour minute"; + +-- test a couple rounding cases that changed since 8.3 w/ HAVE_INT64_TIMESTAMP. +SET IntervalStyle to postgres_verbose; +select interval '-10 mons -3 days +03:55:06.70'; +select interval '1 year 2 mons 3 days 04:05:06.699999'; +select interval '0:0:0.7', interval '@ 0.70 secs', interval '0.7 seconds'; + +-- check that '30 days' equals '1 month' according to the hash function +select '30 days'::interval = '1 month'::interval as t; +select interval_hash('30 days'::interval) = interval_hash('1 month'::interval) as t; + +-- numeric constructor +select make_interval(years := 2); +select make_interval(years := 1, months := 6); +select make_interval(years := 1, months := -1, weeks := 5, days := -7, hours := 25, mins := -180); + +select make_interval() = make_interval(years := 0, months := 0, weeks := 0, days := 0, mins := 0, secs := 0.0); +select make_interval(hours := -2, mins := -10, secs := -25.3); + +select make_interval(years := 'inf'::float::int); +select make_interval(months := 'NaN'::float::int); +select make_interval(secs := 'inf'); +select make_interval(secs := 'NaN'); +select make_interval(secs := 7e12); + +-- +-- test EXTRACT +-- +SELECT f1, + EXTRACT(MICROSECOND FROM f1) AS MICROSECOND, + EXTRACT(MILLISECOND FROM f1) AS MILLISECOND, + EXTRACT(SECOND FROM f1) AS SECOND, + EXTRACT(MINUTE FROM f1) AS MINUTE, + EXTRACT(HOUR FROM f1) AS HOUR, + EXTRACT(DAY FROM f1) AS DAY, + EXTRACT(MONTH FROM f1) AS MONTH, + EXTRACT(QUARTER FROM f1) AS QUARTER, + EXTRACT(YEAR FROM f1) AS YEAR, + EXTRACT(DECADE FROM f1) AS DECADE, + EXTRACT(CENTURY FROM f1) AS CENTURY, + EXTRACT(MILLENNIUM FROM f1) AS MILLENNIUM, + EXTRACT(EPOCH FROM f1) AS EPOCH + FROM INTERVAL_TBL; + +SELECT EXTRACT(FORTNIGHT FROM INTERVAL '2 days'); -- error +SELECT EXTRACT(TIMEZONE FROM INTERVAL '2 days'); -- error + +SELECT EXTRACT(DECADE FROM INTERVAL '100 y'); +SELECT EXTRACT(DECADE FROM INTERVAL '99 y'); +SELECT EXTRACT(DECADE FROM INTERVAL '-99 y'); +SELECT EXTRACT(DECADE FROM INTERVAL '-100 y'); + +SELECT EXTRACT(CENTURY FROM INTERVAL '100 y'); +SELECT EXTRACT(CENTURY FROM INTERVAL '99 y'); +SELECT EXTRACT(CENTURY FROM INTERVAL '-99 y'); +SELECT EXTRACT(CENTURY FROM INTERVAL '-100 y'); + +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT f1, + date_part('microsecond', f1) AS microsecond, + date_part('millisecond', f1) AS millisecond, + date_part('second', f1) AS second, + date_part('epoch', f1) AS epoch + FROM INTERVAL_TBL; + +-- internal overflow test case +SELECT extract(epoch from interval '1000000000 days'); diff --git a/src/test/singlenode_regress/sql/join.sql b/src/test/singlenode_regress/sql/join.sql new file mode 100644 index 00000000000..1f372bb7fc4 --- /dev/null +++ b/src/test/singlenode_regress/sql/join.sql @@ -0,0 +1,2305 @@ +-- +-- JOIN +-- Test JOIN clauses +-- + +CREATE TABLE J1_TBL ( + i integer, + j integer, + t text +); + +CREATE TABLE J2_TBL ( + i integer, + k integer +); + + +INSERT INTO J1_TBL VALUES (1, 4, 'one'); +INSERT INTO J1_TBL VALUES (2, 3, 'two'); +INSERT INTO J1_TBL VALUES (3, 2, 'three'); +INSERT INTO J1_TBL VALUES (4, 1, 'four'); +INSERT INTO J1_TBL VALUES (5, 0, 'five'); +INSERT INTO J1_TBL VALUES (6, 6, 'six'); +INSERT INTO J1_TBL VALUES (7, 7, 'seven'); +INSERT INTO J1_TBL VALUES (8, 8, 'eight'); +INSERT INTO J1_TBL VALUES (0, NULL, 'zero'); +INSERT INTO J1_TBL VALUES (NULL, NULL, 'null'); +INSERT INTO J1_TBL VALUES (NULL, 0, 'zero'); + +INSERT INTO J2_TBL VALUES (1, -1); +INSERT INTO J2_TBL VALUES (2, 2); +INSERT INTO J2_TBL VALUES (3, -3); +INSERT INTO J2_TBL VALUES (2, 4); +INSERT INTO J2_TBL VALUES (5, -5); +INSERT INTO J2_TBL VALUES (5, -5); +INSERT INTO J2_TBL VALUES (0, NULL); +INSERT INTO J2_TBL VALUES (NULL, NULL); +INSERT INTO J2_TBL VALUES (NULL, 0); + +-- useful in some tests below +create temp table onerow(); +insert into onerow default values; +analyze onerow; + + +-- +-- CORRELATION NAMES +-- Make sure that table/column aliases are supported +-- before diving into more complex join syntax. +-- + +SELECT * + FROM J1_TBL AS tx; + +SELECT * + FROM J1_TBL tx; + +SELECT * + FROM J1_TBL AS t1 (a, b, c); + +SELECT * + FROM J1_TBL t1 (a, b, c); + +SELECT * + FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e); + +SELECT t1.a, t2.e + FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e) + WHERE t1.a = t2.d; + + +-- +-- CROSS JOIN +-- Qualifications are not allowed on cross joins, +-- which degenerate into a standard unqualified inner join. +-- + +SELECT * + FROM J1_TBL CROSS JOIN J2_TBL; + +-- ambiguous column +SELECT i, k, t + FROM J1_TBL CROSS JOIN J2_TBL; + +-- resolve previous ambiguity by specifying the table name +SELECT t1.i, k, t + FROM J1_TBL t1 CROSS JOIN J2_TBL t2; + +SELECT ii, tt, kk + FROM (J1_TBL CROSS JOIN J2_TBL) + AS tx (ii, jj, tt, ii2, kk); + +SELECT tx.ii, tx.jj, tx.kk + FROM (J1_TBL t1 (a, b, c) CROSS JOIN J2_TBL t2 (d, e)) + AS tx (ii, jj, tt, ii2, kk); + +SELECT * + FROM J1_TBL CROSS JOIN J2_TBL a CROSS JOIN J2_TBL b; + + +-- +-- +-- Inner joins (equi-joins) +-- +-- + +-- +-- Inner joins (equi-joins) with USING clause +-- The USING syntax changes the shape of the resulting table +-- by including a column in the USING clause only once in the result. +-- + +-- Inner equi-join on specified column +SELECT * + FROM J1_TBL INNER JOIN J2_TBL USING (i); + +-- Same as above, slightly different syntax +SELECT * + FROM J1_TBL JOIN J2_TBL USING (i); + +SELECT * + FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a) + ORDER BY a, d; + +SELECT * + FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b) + ORDER BY b, t1.a; + +-- test join using aliases +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) WHERE J1_TBL.t = 'one'; -- ok +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; -- ok +SELECT * FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t = 'one'; -- error +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.i = 1; -- ok +SELECT * FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one'; -- error +SELECT * FROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; -- error (XXX could use better hint) +SELECT * FROM J1_TBL a1 JOIN J2_TBL a2 USING (i) AS a1; -- error +SELECT x.* FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; +SELECT ROW(x.*) FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; +SELECT row_to_json(x.*) FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; + +-- +-- NATURAL JOIN +-- Inner equi-join on all columns with the same name +-- + +SELECT * + FROM J1_TBL NATURAL JOIN J2_TBL; + +SELECT * + FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d); + +SELECT * + FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a); + +-- mismatch number of columns +-- currently, Postgres will fill in with underlying names +SELECT * + FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a); + + +-- +-- Inner joins (equi-joins) +-- + +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i); + +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k); + + +-- +-- Non-equi-joins +-- + +SELECT * + FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k); + + +-- +-- Outer joins +-- Note that OUTER is a noise word +-- + +SELECT * + FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i) + ORDER BY i, k, t; + +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) + ORDER BY i, k, t; + +SELECT * + FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i); + +SELECT * + FROM J1_TBL RIGHT JOIN J2_TBL USING (i); + +SELECT * + FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i) + ORDER BY i, k, t; + +SELECT * + FROM J1_TBL FULL JOIN J2_TBL USING (i) + ORDER BY i, k, t; + +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1); + +SELECT * + FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1); + +-- +-- semijoin selectivity for <> +-- +explain (costs off) +select * from int4_tbl i4, tenk1 a +where exists(select * from tenk1 b + where a.twothousand = b.twothousand and a.fivethous <> b.fivethous) + and i4.f1 = a.tenthous; + + +-- +-- More complicated constructs +-- + +-- +-- Multiway full join +-- + +CREATE TABLE t1 (name TEXT, n INTEGER); +CREATE TABLE t2 (name TEXT, n INTEGER); +CREATE TABLE t3 (name TEXT, n INTEGER); + +INSERT INTO t1 VALUES ( 'bb', 11 ); +INSERT INTO t2 VALUES ( 'bb', 12 ); +INSERT INTO t2 VALUES ( 'cc', 22 ); +INSERT INTO t2 VALUES ( 'ee', 42 ); +INSERT INTO t3 VALUES ( 'bb', 13 ); +INSERT INTO t3 VALUES ( 'cc', 23 ); +INSERT INTO t3 VALUES ( 'dd', 33 ); + +SELECT * FROM t1 FULL JOIN t2 USING (name) FULL JOIN t3 USING (name); + +-- +-- Test interactions of join syntax and subqueries +-- + +-- Basic cases (we expect planner to pull up the subquery here) +SELECT * FROM +(SELECT * FROM t2) as s2 +INNER JOIN +(SELECT * FROM t3) s3 +USING (name); + +SELECT * FROM +(SELECT * FROM t2) as s2 +LEFT JOIN +(SELECT * FROM t3) s3 +USING (name); + +SELECT * FROM +(SELECT * FROM t2) as s2 +FULL JOIN +(SELECT * FROM t3) s3 +USING (name); + +-- Cases with non-nullable expressions in subquery results; +-- make sure these go to null as expected +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL INNER JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL LEFT JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + +SELECT * FROM +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL FULL JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + +SELECT * FROM +(SELECT name, n as s1_n, 1 as s1_1 FROM t1) as s1 +NATURAL INNER JOIN +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL INNER JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + +SELECT * FROM +(SELECT name, n as s1_n, 1 as s1_1 FROM t1) as s1 +NATURAL FULL JOIN +(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 +NATURAL FULL JOIN +(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3; + +SELECT * FROM +(SELECT name, n as s1_n FROM t1) as s1 +NATURAL FULL JOIN + (SELECT * FROM + (SELECT name, n as s2_n FROM t2) as s2 + NATURAL FULL JOIN + (SELECT name, n as s3_n FROM t3) as s3 + ) ss2; + +SELECT * FROM +(SELECT name, n as s1_n FROM t1) as s1 +NATURAL FULL JOIN + (SELECT * FROM + (SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2 + NATURAL FULL JOIN + (SELECT name, n as s3_n FROM t3) as s3 + ) ss2; + +-- Constants as join keys can also be problematic +SELECT * FROM + (SELECT name, n as s1_n FROM t1) as s1 +FULL JOIN + (SELECT name, 2 as s2_n FROM t2) as s2 +ON (s1_n = s2_n); + + +-- Test for propagation of nullability constraints into sub-joins + +create temp table x (x1 int, x2 int); +insert into x values (1,11); +insert into x values (2,22); +insert into x values (3,null); +insert into x values (4,44); +insert into x values (5,null); + +create temp table y (y1 int, y2 int); +insert into y values (1,111); +insert into y values (2,222); +insert into y values (3,333); +insert into y values (4,null); + +select * from x; +select * from y; + +select * from x left join y on (x1 = y1 and x2 is not null); +select * from x left join y on (x1 = y1 and y2 is not null); + +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1); +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and x2 is not null); +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and y2 is not null); +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1 and xx2 is not null); +-- these should NOT give the same answers as above +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (x2 is not null); +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (y2 is not null); +select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2) +on (x1 = xx1) where (xx2 is not null); + +-- +-- regression test: check for bug with propagation of implied equality +-- to outside an IN +-- +select count(*) from tenk1 a where unique1 in + (select unique1 from tenk1 b join tenk1 c using (unique1) + where b.unique2 = 42); + +-- +-- regression test: check for failure to generate a plan with multiple +-- degenerate IN clauses +-- +select count(*) from tenk1 x where + x.unique1 in (select a.f1 from int4_tbl a,float8_tbl b where a.f1=b.f1) and + x.unique1 = 0 and + x.unique1 in (select aa.f1 from int4_tbl aa,float8_tbl bb where aa.f1=bb.f1); + +-- try that with GEQO too +begin; +set geqo = on; +set geqo_threshold = 2; +select count(*) from tenk1 x where + x.unique1 in (select a.f1 from int4_tbl a,float8_tbl b where a.f1=b.f1) and + x.unique1 = 0 and + x.unique1 in (select aa.f1 from int4_tbl aa,float8_tbl bb where aa.f1=bb.f1); +rollback; + +-- +-- regression test: be sure we cope with proven-dummy append rels +-- +explain (costs off) +select aa, bb, unique1, unique1 + from tenk1 right join b on aa = unique1 + where bb < bb and bb is null; + +select aa, bb, unique1, unique1 + from tenk1 right join b on aa = unique1 + where bb < bb and bb is null; + +-- +-- regression test: check handling of empty-FROM subquery underneath outer join +-- +explain (costs off) +select * from int8_tbl i1 left join (int8_tbl i2 join + (select 123 as x) ss on i2.q1 = x) on i1.q2 = i2.q2 +order by 1, 2; + +select * from int8_tbl i1 left join (int8_tbl i2 join + (select 123 as x) ss on i2.q1 = x) on i1.q2 = i2.q2 +order by 1, 2; + +-- +-- regression test: check a case where join_clause_is_movable_into() gives +-- an imprecise result, causing an assertion failure +-- +select count(*) +from + (select t3.tenthous as x1, coalesce(t1.stringu1, t2.stringu1) as x2 + from tenk1 t1 + left join tenk1 t2 on t1.unique1 = t2.unique1 + join tenk1 t3 on t1.unique2 = t3.unique2) ss, + tenk1 t4, + tenk1 t5 +where t4.thousand = t5.unique1 and ss.x1 = t4.tenthous and ss.x2 = t5.stringu1; + +-- +-- regression test: check a case where we formerly missed including an EC +-- enforcement clause because it was expected to be handled at scan level +-- +explain (costs off) +select a.f1, b.f1, t.thousand, t.tenthous from + tenk1 t, + (select sum(f1)+1 as f1 from int4_tbl i4a) a, + (select sum(f1) as f1 from int4_tbl i4b) b +where b.f1 = t.thousand and a.f1 = b.f1 and (a.f1+b.f1+999) = t.tenthous; + +select a.f1, b.f1, t.thousand, t.tenthous from + tenk1 t, + (select sum(f1)+1 as f1 from int4_tbl i4a) a, + (select sum(f1) as f1 from int4_tbl i4b) b +where b.f1 = t.thousand and a.f1 = b.f1 and (a.f1+b.f1+999) = t.tenthous; + +-- +-- check a case where we formerly got confused by conflicting sort orders +-- in redundant merge join path keys +-- +explain (costs off) +select * from + j1_tbl full join + (select * from j2_tbl order by j2_tbl.i desc, j2_tbl.k asc) j2_tbl + on j1_tbl.i = j2_tbl.i and j1_tbl.i = j2_tbl.k; + +select * from + j1_tbl full join + (select * from j2_tbl order by j2_tbl.i desc, j2_tbl.k asc) j2_tbl + on j1_tbl.i = j2_tbl.i and j1_tbl.i = j2_tbl.k; --order none +reset enable_mergejoin; +reset enable_hashjoin; + +-- +-- a different check for handling of redundant sort keys in merge joins +-- +explain (costs off) +select count(*) from + (select * from tenk1 x order by x.thousand, x.twothousand, x.fivethous) x + left join + (select * from tenk1 y order by y.unique2) y + on x.thousand = y.unique2 and x.twothousand = y.hundred and x.fivethous = y.unique2; + +select count(*) from + (select * from tenk1 x order by x.thousand, x.twothousand, x.fivethous) x + left join + (select * from tenk1 y order by y.unique2) y + on x.thousand = y.unique2 and x.twothousand = y.hundred and x.fivethous = y.unique2; + + +-- +-- Clean up +-- + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; + +DROP TABLE J1_TBL; +DROP TABLE J2_TBL; + +-- Both DELETE and UPDATE allow the specification of additional tables +-- to "join" against to determine which rows should be modified. + +CREATE TEMP TABLE t1 (a int, b int); +CREATE TEMP TABLE t2 (a int, b int); +CREATE TEMP TABLE t3 (x int, y int); + +INSERT INTO t1 VALUES (5, 10); +INSERT INTO t1 VALUES (15, 20); +INSERT INTO t1 VALUES (100, 100); +INSERT INTO t1 VALUES (200, 1000); +INSERT INTO t2 VALUES (200, 2000); +INSERT INTO t3 VALUES (5, 20); +INSERT INTO t3 VALUES (6, 7); +INSERT INTO t3 VALUES (7, 8); +INSERT INTO t3 VALUES (500, 100); + +DELETE FROM t3 USING t1 table1 WHERE t3.x = table1.a; +SELECT * FROM t3; +DELETE FROM t3 USING t1 JOIN t2 USING (a) WHERE t3.x > t1.a; +SELECT * FROM t3; +DELETE FROM t3 USING t3 t3_other WHERE t3.x = t3_other.x AND t3.y = t3_other.y; +SELECT * FROM t3; + +-- Test join against inheritance tree + +create temp table t2a () inherits (t2); + +insert into t2a values (200, 2001); + +select * from t1 left join t2 on (t1.a = t2.a); + +-- Test matching of column name with wrong alias + +select t1.x from t1 join t3 on (t1.a = t3.x); + +-- +-- regression test for 8.1 merge right join bug +-- + +CREATE TEMP TABLE tt1 ( tt1_id int4, joincol int4 ); +INSERT INTO tt1 VALUES (1, 11); +INSERT INTO tt1 VALUES (2, NULL); + +CREATE TEMP TABLE tt2 ( tt2_id int4, joincol int4 ); +INSERT INTO tt2 VALUES (21, 11); +INSERT INTO tt2 VALUES (22, 11); + +set enable_hashjoin to off; +set enable_nestloop to off; + +-- these should give the same results + +select tt1.*, tt2.* from tt1 left join tt2 on tt1.joincol = tt2.joincol; + +select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol; + +reset enable_hashjoin; +reset enable_nestloop; + +-- +-- regression test for bug #13908 (hash join with skew tuples & nbatch increase) +-- + +set work_mem to '64kB'; +set enable_mergejoin to off; +set enable_memoize to off; + +explain (costs off) +select count(*) from tenk1 a, tenk1 b + where a.hundred = b.thousand and (b.fivethous % 10) < 10; +select count(*) from tenk1 a, tenk1 b + where a.hundred = b.thousand and (b.fivethous % 10) < 10; + +reset work_mem; +reset enable_mergejoin; +reset enable_memoize; + +-- +-- regression test for 8.2 bug with improper re-ordering of left joins +-- + +create temp table tt3(f1 int, f2 text); +insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x; +create index tt3i on tt3(f1); +analyze tt3; + +create temp table tt4(f1 int); +insert into tt4 values (0),(1),(9999); +analyze tt4; + +SELECT a.f1 +FROM tt4 a +LEFT JOIN ( + SELECT b.f1 + FROM tt3 b LEFT JOIN tt3 c ON (b.f1 = c.f1) + WHERE c.f1 IS NULL +) AS d ON (a.f1 = d.f1) +WHERE d.f1 IS NULL; + +-- +-- regression test for proper handling of outer joins within antijoins +-- + +create temp table tt4x(c1 int, c2 int, c3 int); + +explain (costs off) +select * from tt4x t1 +where not exists ( + select 1 from tt4x t2 + left join tt4x t3 on t2.c3 = t3.c1 + left join ( select t5.c1 as c1 + from tt4x t4 left join tt4x t5 on t4.c2 = t5.c1 + ) a1 on t3.c2 = a1.c1 + where t1.c1 = t2.c2 +); + +-- +-- regression test for problems of the sort depicted in bug #3494 +-- + +create temp table tt5(f1 int, f2 int); +create temp table tt6(f1 int, f2 int); + +insert into tt5 values(1, 10); +insert into tt5 values(1, 11); + +insert into tt6 values(1, 9); +insert into tt6 values(1, 2); +insert into tt6 values(2, 9); + +select * from tt5,tt6 where tt5.f1 = tt6.f1 and tt5.f1 = tt5.f2 - tt6.f2; + +-- +-- regression test for problems of the sort depicted in bug #3588 +-- + +create temp table xx (pkxx int); +create temp table yy (pkyy int, pkxx int); + +insert into xx values (1); +insert into xx values (2); +insert into xx values (3); + +insert into yy values (101, 1); +insert into yy values (201, 2); +insert into yy values (301, NULL); + +select yy.pkyy as yy_pkyy, yy.pkxx as yy_pkxx, yya.pkyy as yya_pkyy, + xxa.pkxx as xxa_pkxx, xxb.pkxx as xxb_pkxx +from yy + left join (SELECT * FROM yy where pkyy = 101) as yya ON yy.pkyy = yya.pkyy + left join xx xxa on yya.pkxx = xxa.pkxx + left join xx xxb on coalesce (xxa.pkxx, 1) = xxb.pkxx; + +-- +-- regression test for improper pushing of constants across outer-join clauses +-- (as seen in early 8.2.x releases) +-- + +create temp table zt1 (f1 int primary key); +create temp table zt2 (f2 int primary key); +create temp table zt3 (f3 int primary key); +insert into zt1 values(53); +insert into zt2 values(53); + +select * from + zt2 left join zt3 on (f2 = f3) + left join zt1 on (f3 = f1) +where f2 = 53; + +create temp view zv1 as select *,'dummy'::text AS junk from zt1; + +select * from + zt2 left join zt3 on (f2 = f3) + left join zv1 on (f3 = f1) +where f2 = 53; + +-- +-- regression test for improper extraction of OR indexqual conditions +-- (as seen in early 8.3.x releases) +-- + +select a.unique2, a.ten, b.tenthous, b.unique2, b.hundred +from tenk1 a left join tenk1 b on a.unique2 = b.tenthous +where a.unique1 = 42 and + ((b.unique2 is null and a.ten = 2) or b.hundred = 3); + +-- +-- test proper positioning of one-time quals in EXISTS (8.4devel bug) +-- +prepare foo(bool) as + select count(*) from tenk1 a left join tenk1 b + on (a.unique2 = b.unique1 and exists + (select 1 from tenk1 c where c.thousand = b.unique2 and $1)); +execute foo(true); +execute foo(false); + +-- +-- test for sane behavior with noncanonical merge clauses, per bug #4926 +-- + +begin; + +set enable_mergejoin = 1; +set enable_hashjoin = 0; +set enable_nestloop = 0; + +create temp table a (i integer); +create temp table b (x integer, y integer); + +select * from a left join b on i = x and i = y and x = i; + +rollback; + +-- +-- test handling of merge clauses using record_ops +-- +begin; + +create type mycomptype as (id int, v bigint); + +create temp table tidv (idv mycomptype); +create index on tidv (idv); + +explain (costs off) +select a.idv, b.idv from tidv a, tidv b where a.idv = b.idv; + +set enable_mergejoin = 0; +set enable_hashjoin = 0; + +explain (costs off) +select a.idv, b.idv from tidv a, tidv b where a.idv = b.idv; + +rollback; + +-- +-- test NULL behavior of whole-row Vars, per bug #5025 +-- +select t1.q2, count(t2.*) +from int8_tbl t1 left join int8_tbl t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; + +select t1.q2, count(t2.*) +from int8_tbl t1 left join (select * from int8_tbl) t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; + +select t1.q2, count(t2.*) +from int8_tbl t1 left join (select * from int8_tbl offset 0) t2 on (t1.q2 = t2.q1) +group by t1.q2 order by 1; + +select t1.q2, count(t2.*) +from int8_tbl t1 left join + (select q1, case when q2=1 then 1 else q2 end as q2 from int8_tbl) t2 + on (t1.q2 = t2.q1) +group by t1.q2 order by 1; + +-- +-- test incorrect failure to NULL pulled-up subexpressions +-- +begin; + +create temp table a ( + code char not null, + constraint a_pk primary key (code) +); +create temp table b ( + a char not null, + num integer not null, + constraint b_pk primary key (a, num) +); +create temp table c ( + name char not null, + a char, + constraint c_pk primary key (name) +); + +insert into a (code) values ('p'); +insert into a (code) values ('q'); +insert into b (a, num) values ('p', 1); +insert into b (a, num) values ('p', 2); +insert into c (name, a) values ('A', 'p'); +insert into c (name, a) values ('B', 'q'); +insert into c (name, a) values ('C', null); + +select c.name, ss.code, ss.b_cnt, ss.const +from c left join + (select a.code, coalesce(b_grp.cnt, 0) as b_cnt, -1 as const + from a left join + (select count(1) as cnt, b.a from b group by b.a) as b_grp + on a.code = b_grp.a + ) as ss + on (c.a = ss.code) +order by c.name; + +rollback; + +-- +-- test incorrect handling of placeholders that only appear in targetlists, +-- per bug #6154 +-- +SELECT * FROM +( SELECT 1 as key1 ) sub1 +LEFT JOIN +( SELECT sub3.key3, sub4.value2, COALESCE(sub4.value2, 66) as value3 FROM + ( SELECT 1 as key3 ) sub3 + LEFT JOIN + ( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM + ( SELECT 1 as key5 ) sub5 + LEFT JOIN + ( SELECT 2 as key6, 42 as value1 ) sub6 + ON sub5.key5 = sub6.key6 + ) sub4 + ON sub4.key5 = sub3.key3 +) sub2 +ON sub1.key1 = sub2.key3; + +-- test the path using join aliases, too +SELECT * FROM +( SELECT 1 as key1 ) sub1 +LEFT JOIN +( SELECT sub3.key3, value2, COALESCE(value2, 66) as value3 FROM + ( SELECT 1 as key3 ) sub3 + LEFT JOIN + ( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM + ( SELECT 1 as key5 ) sub5 + LEFT JOIN + ( SELECT 2 as key6, 42 as value1 ) sub6 + ON sub5.key5 = sub6.key6 + ) sub4 + ON sub4.key5 = sub3.key3 +) sub2 +ON sub1.key1 = sub2.key3; + +-- +-- test case where a PlaceHolderVar is used as a nestloop parameter +-- + +EXPLAIN (COSTS OFF) +SELECT qq, unique1 + FROM + ( SELECT COALESCE(q1, 0) AS qq FROM int8_tbl a ) AS ss1 + FULL OUTER JOIN + ( SELECT COALESCE(q2, -1) AS qq FROM int8_tbl b ) AS ss2 + USING (qq) + INNER JOIN tenk1 c ON qq = unique2; + +SELECT qq, unique1 + FROM + ( SELECT COALESCE(q1, 0) AS qq FROM int8_tbl a ) AS ss1 + FULL OUTER JOIN + ( SELECT COALESCE(q2, -1) AS qq FROM int8_tbl b ) AS ss2 + USING (qq) + INNER JOIN tenk1 c ON qq = unique2; + +-- +-- nested nestloops can require nested PlaceHolderVars +-- + +create temp table nt1 ( + id int primary key, + a1 boolean, + a2 boolean +); +create temp table nt2 ( + id int primary key, + nt1_id int, + b1 boolean, + b2 boolean, + foreign key (nt1_id) references nt1(id) +); +create temp table nt3 ( + id int primary key, + nt2_id int, + c1 boolean, + foreign key (nt2_id) references nt2(id) +); + +insert into nt1 values (1,true,true); +insert into nt1 values (2,true,false); +insert into nt1 values (3,false,false); +insert into nt2 values (1,1,true,true); +insert into nt2 values (2,2,true,false); +insert into nt2 values (3,3,false,false); +insert into nt3 values (1,1,true); +insert into nt3 values (2,2,false); +insert into nt3 values (3,3,true); + +explain (costs off) +select nt3.id +from nt3 as nt3 + left join + (select nt2.*, (nt2.b1 and ss1.a3) AS b3 + from nt2 as nt2 + left join + (select nt1.*, (nt1.id is not null) as a3 from nt1) as ss1 + on ss1.id = nt2.nt1_id + ) as ss2 + on ss2.id = nt3.nt2_id +where nt3.id = 1 and ss2.b3; + +select nt3.id +from nt3 as nt3 + left join + (select nt2.*, (nt2.b1 and ss1.a3) AS b3 + from nt2 as nt2 + left join + (select nt1.*, (nt1.id is not null) as a3 from nt1) as ss1 + on ss1.id = nt2.nt1_id + ) as ss2 + on ss2.id = nt3.nt2_id +where nt3.id = 1 and ss2.b3; + +-- +-- test case where a PlaceHolderVar is propagated into a subquery +-- + +explain (costs off) +select * from + int8_tbl t1 left join + (select q1 as x, 42 as y from int8_tbl t2) ss + on t1.q2 = ss.x +where + 1 = (select 1 from int8_tbl t3 where ss.y is not null limit 1) +order by 1,2; + +select * from + int8_tbl t1 left join + (select q1 as x, 42 as y from int8_tbl t2) ss + on t1.q2 = ss.x +where + 1 = (select 1 from int8_tbl t3 where ss.y is not null limit 1) +order by 1,2; + +-- +-- variant where a PlaceHolderVar is needed at a join, but not above the join +-- + +explain (costs off) +select * from + int4_tbl as i41, + lateral + (select 1 as x from + (select i41.f1 as lat, + i42.f1 as loc from + int8_tbl as i81, int4_tbl as i42) as ss1 + right join int4_tbl as i43 on (i43.f1 > 1) + where ss1.loc = ss1.lat) as ss2 +where i41.f1 > 0; + +select * from + int4_tbl as i41, + lateral + (select 1 as x from + (select i41.f1 as lat, + i42.f1 as loc from + int8_tbl as i81, int4_tbl as i42) as ss1 + right join int4_tbl as i43 on (i43.f1 > 1) + where ss1.loc = ss1.lat) as ss2 +where i41.f1 > 0; + +-- +-- test the corner cases FULL JOIN ON TRUE and FULL JOIN ON FALSE +-- +select * from int4_tbl a full join int4_tbl b on true; +select * from int4_tbl a full join int4_tbl b on false; + +-- +-- test for ability to use a cartesian join when necessary +-- + +create temp table q1 as select 1 as q1; +create temp table q2 as select 0 as q2; +analyze q1; +analyze q2; + +explain (costs off) +select * from + tenk1 join int4_tbl on f1 = twothousand, + q1, q2 +where q1 = thousand or q2 = thousand; + +explain (costs off) +select * from + tenk1 join int4_tbl on f1 = twothousand, + q1, q2 +where thousand = (q1 + q2); + +-- +-- test ability to generate a suitable plan for a star-schema query +-- + +explain (costs off) +select * from + tenk1, int8_tbl a, int8_tbl b +where thousand = a.q1 and tenthous = b.q1 and a.q2 = 1 and b.q2 = 2; + +-- +-- test a corner case in which we shouldn't apply the star-schema optimization +-- + +explain (costs off) +select t1.unique2, t1.stringu1, t2.unique1, t2.stringu2 from + tenk1 t1 + inner join int4_tbl i1 + left join (select v1.x2, v2.y1, 11 AS d1 + from (select 1,0 from onerow) v1(x1,x2) + left join (select 3,1 from onerow) v2(y1,y2) + on v1.x1 = v2.y2) subq1 + on (i1.f1 = subq1.x2) + on (t1.unique2 = subq1.d1) + left join tenk1 t2 + on (subq1.y1 = t2.unique1) +where t1.unique2 < 42 and t1.stringu1 > t2.stringu2; + +select t1.unique2, t1.stringu1, t2.unique1, t2.stringu2 from + tenk1 t1 + inner join int4_tbl i1 + left join (select v1.x2, v2.y1, 11 AS d1 + from (select 1,0 from onerow) v1(x1,x2) + left join (select 3,1 from onerow) v2(y1,y2) + on v1.x1 = v2.y2) subq1 + on (i1.f1 = subq1.x2) + on (t1.unique2 = subq1.d1) + left join tenk1 t2 + on (subq1.y1 = t2.unique1) +where t1.unique2 < 42 and t1.stringu1 > t2.stringu2; + +-- variant that isn't quite a star-schema case + +select ss1.d1 from + tenk1 as t1 + inner join tenk1 as t2 + on t1.tenthous = t2.ten + inner join + int8_tbl as i8 + left join int4_tbl as i4 + inner join (select 64::information_schema.cardinal_number as d1 + from tenk1 t3, + lateral (select abs(t3.unique1) + random()) ss0(x) + where t3.fivethous < 0) as ss1 + on i4.f1 = ss1.d1 + on i8.q1 = i4.f1 + on t1.tenthous = ss1.d1 +where t1.unique1 < i4.f1; + +-- this variant is foldable by the remove-useless-RESULT-RTEs code + +explain (costs off) +select t1.unique2, t1.stringu1, t2.unique1, t2.stringu2 from + tenk1 t1 + inner join int4_tbl i1 + left join (select v1.x2, v2.y1, 11 AS d1 + from (values(1,0)) v1(x1,x2) + left join (values(3,1)) v2(y1,y2) + on v1.x1 = v2.y2) subq1 + on (i1.f1 = subq1.x2) + on (t1.unique2 = subq1.d1) + left join tenk1 t2 + on (subq1.y1 = t2.unique1) +where t1.unique2 < 42 and t1.stringu1 > t2.stringu2; + +select t1.unique2, t1.stringu1, t2.unique1, t2.stringu2 from + tenk1 t1 + inner join int4_tbl i1 + left join (select v1.x2, v2.y1, 11 AS d1 + from (values(1,0)) v1(x1,x2) + left join (values(3,1)) v2(y1,y2) + on v1.x1 = v2.y2) subq1 + on (i1.f1 = subq1.x2) + on (t1.unique2 = subq1.d1) + left join tenk1 t2 + on (subq1.y1 = t2.unique1) +where t1.unique2 < 42 and t1.stringu1 > t2.stringu2; + +-- Here's a variant that we can't fold too aggressively, though, +-- or we end up with noplace to evaluate the lateral PHV +explain (verbose, costs off) +select * from + (select 1 as x) ss1 left join (select 2 as y) ss2 on (true), + lateral (select ss2.y as z limit 1) ss3; +select * from + (select 1 as x) ss1 left join (select 2 as y) ss2 on (true), + lateral (select ss2.y as z limit 1) ss3; + +-- Test proper handling of appendrel PHVs during useless-RTE removal +explain (costs off) +select * from + (select 0 as z) as t1 + left join + (select true as a) as t2 + on true, + lateral (select true as b + union all + select a as b) as t3 +where b; + +select * from + (select 0 as z) as t1 + left join + (select true as a) as t2 + on true, + lateral (select true as b + union all + select a as b) as t3 +where b; + +-- +-- test inlining of immutable functions +-- +create function f_immutable_int4(i integer) returns integer as +$$ begin return i; end; $$ language plpgsql immutable; + +-- check optimization of function scan with join +explain (costs off) +select unique1 from tenk1, (select * from f_immutable_int4(1) x) x +where x = unique1; + +explain (verbose, costs off) +select unique1, x.* +from tenk1, (select *, random() from f_immutable_int4(1) x) x +where x = unique1; + +explain (costs off) +select unique1 from tenk1, f_immutable_int4(1) x where x = unique1; + +explain (costs off) +select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1; + +explain (costs off) +select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17); + +explain (costs off) +select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x; + +explain (costs off) +select unique1, x from tenk1 left join f_immutable_int4(1) x on unique1 = x; + +explain (costs off) +select unique1, x from tenk1 right join f_immutable_int4(1) x on unique1 = x; + +explain (costs off) +select unique1, x from tenk1 full join f_immutable_int4(1) x on unique1 = x; + +-- check that pullup of a const function allows further const-folding +explain (costs off) +select unique1 from tenk1, f_immutable_int4(1) x where x = 42; + +-- test inlining of immutable functions with PlaceHolderVars +explain (costs off) +select nt3.id +from nt3 as nt3 + left join + (select nt2.*, (nt2.b1 or i4 = 42) AS b3 + from nt2 as nt2 + left join + f_immutable_int4(0) i4 + on i4 = nt2.nt1_id + ) as ss2 + on ss2.id = nt3.nt2_id +where nt3.id = 1 and ss2.b3; + +drop function f_immutable_int4(int); + +-- test inlining when function returns composite + +create function mki8(bigint, bigint) returns int8_tbl as +$$select row($1,$2)::int8_tbl$$ language sql; + +create function mki4(int) returns int4_tbl as +$$select row($1)::int4_tbl$$ language sql; + +explain (verbose, costs off) +select * from mki8(1,2); +select * from mki8(1,2); + +explain (verbose, costs off) +select * from mki4(42); +select * from mki4(42); + +drop function mki8(bigint, bigint); +drop function mki4(int); + +-- +-- test extraction of restriction OR clauses from join OR clause +-- (we used to only do this for indexable clauses) +-- + +explain (costs off) +select * from tenk1 a join tenk1 b on + (a.unique1 = 1 and b.unique1 = 2) or (a.unique2 = 3 and b.hundred = 4); +explain (costs off) +select * from tenk1 a join tenk1 b on + (a.unique1 = 1 and b.unique1 = 2) or (a.unique2 = 3 and b.ten = 4); +explain (costs off) +select * from tenk1 a join tenk1 b on + (a.unique1 = 1 and b.unique1 = 2) or + ((a.unique2 = 3 or a.unique2 = 7) and b.hundred = 4); + +-- +-- test placement of movable quals in a parameterized join tree +-- + +explain (costs off) +select * from tenk1 t1 left join + (tenk1 t2 join tenk1 t3 on t2.thousand = t3.unique2) + on t1.hundred = t2.hundred and t1.ten = t3.ten +where t1.unique1 = 1; + +explain (costs off) +select * from tenk1 t1 left join + (tenk1 t2 join tenk1 t3 on t2.thousand = t3.unique2) + on t1.hundred = t2.hundred and t1.ten + t2.ten = t3.ten +where t1.unique1 = 1; + +explain (costs off) +select count(*) from + tenk1 a join tenk1 b on a.unique1 = b.unique2 + left join tenk1 c on a.unique2 = b.unique1 and c.thousand = a.thousand + join int4_tbl on b.thousand = f1; + +select count(*) from + tenk1 a join tenk1 b on a.unique1 = b.unique2 + left join tenk1 c on a.unique2 = b.unique1 and c.thousand = a.thousand + join int4_tbl on b.thousand = f1; + +explain (costs off) +select b.unique1 from + tenk1 a join tenk1 b on a.unique1 = b.unique2 + left join tenk1 c on b.unique1 = 42 and c.thousand = a.thousand + join int4_tbl i1 on b.thousand = f1 + right join int4_tbl i2 on i2.f1 = b.tenthous + order by 1; + +select b.unique1 from + tenk1 a join tenk1 b on a.unique1 = b.unique2 + left join tenk1 c on b.unique1 = 42 and c.thousand = a.thousand + join int4_tbl i1 on b.thousand = f1 + right join int4_tbl i2 on i2.f1 = b.tenthous + order by 1; + +explain (costs off) +select * from +( + select unique1, q1, coalesce(unique1, -1) + q1 as fault + from int8_tbl left join tenk1 on (q2 = unique2) +) ss +where fault = 122 +order by fault; + +select * from +( + select unique1, q1, coalesce(unique1, -1) + q1 as fault + from int8_tbl left join tenk1 on (q2 = unique2) +) ss +where fault = 122 +order by fault; + +explain (costs off) +select * from +(values (1, array[10,20]), (2, array[20,30])) as v1(v1x,v1ys) +left join (values (1, 10), (2, 20)) as v2(v2x,v2y) on v2x = v1x +left join unnest(v1ys) as u1(u1y) on u1y = v2y; + +select * from +(values (1, array[10,20]), (2, array[20,30])) as v1(v1x,v1ys) +left join (values (1, 10), (2, 20)) as v2(v2x,v2y) on v2x = v1x +left join unnest(v1ys) as u1(u1y) on u1y = v2y; + +-- +-- test handling of potential equivalence clauses above outer joins +-- + +explain (costs off) +select q1, unique2, thousand, hundred + from int8_tbl a left join tenk1 b on q1 = unique2 + where coalesce(thousand,123) = q1 and q1 = coalesce(hundred,123); + +select q1, unique2, thousand, hundred + from int8_tbl a left join tenk1 b on q1 = unique2 + where coalesce(thousand,123) = q1 and q1 = coalesce(hundred,123); + +explain (costs off) +select f1, unique2, case when unique2 is null then f1 else 0 end + from int4_tbl a left join tenk1 b on f1 = unique2 + where (case when unique2 is null then f1 else 0 end) = 0; + +select f1, unique2, case when unique2 is null then f1 else 0 end + from int4_tbl a left join tenk1 b on f1 = unique2 + where (case when unique2 is null then f1 else 0 end) = 0; + +-- +-- another case with equivalence clauses above outer joins (bug #8591) +-- + +explain (costs off) +select a.unique1, b.unique1, c.unique1, coalesce(b.twothousand, a.twothousand) + from tenk1 a left join tenk1 b on b.thousand = a.unique1 left join tenk1 c on c.unique2 = coalesce(b.twothousand, a.twothousand) + where a.unique2 < 10 and coalesce(b.twothousand, a.twothousand) = 44; + +select a.unique1, b.unique1, c.unique1, coalesce(b.twothousand, a.twothousand) + from tenk1 a left join tenk1 b on b.thousand = a.unique1 left join tenk1 c on c.unique2 = coalesce(b.twothousand, a.twothousand) + where a.unique2 < 10 and coalesce(b.twothousand, a.twothousand) = 44; + +-- +-- check handling of join aliases when flattening multiple levels of subquery +-- + +explain (verbose, costs off) +select foo1.join_key as foo1_id, foo3.join_key AS foo3_id, bug_field from + (values (0),(1)) foo1(join_key) +left join + (select join_key, bug_field from + (select ss1.join_key, ss1.bug_field from + (select f1 as join_key, 666 as bug_field from int4_tbl i1) ss1 + ) foo2 + left join + (select unique2 as join_key from tenk1 i2) ss2 + using (join_key) + ) foo3 +using (join_key); + +select foo1.join_key as foo1_id, foo3.join_key AS foo3_id, bug_field from + (values (0),(1)) foo1(join_key) +left join + (select join_key, bug_field from + (select ss1.join_key, ss1.bug_field from + (select f1 as join_key, 666 as bug_field from int4_tbl i1) ss1 + ) foo2 + left join + (select unique2 as join_key from tenk1 i2) ss2 + using (join_key) + ) foo3 +using (join_key); + +-- +-- test successful handling of nested outer joins with degenerate join quals +-- + +explain (verbose, costs off) +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + +explain (verbose, costs off) +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2, int4_tbl i4b2) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2, int4_tbl i4b2) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + +explain (verbose, costs off) +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2, int4_tbl i4b2 + where q1 = f1) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + +select t1.* from + text_tbl t1 + left join (select *, '***'::text as d1 from int8_tbl i8b1) b1 + left join int8_tbl i8 + left join (select *, null::int as d2 from int8_tbl i8b2, int4_tbl i4b2 + where q1 = f1) b2 + on (i8.q1 = b2.q1) + on (b2.d2 = b1.q2) + on (t1.f1 = b1.d1) + left join int4_tbl i4 + on (i8.q2 = i4.f1); + +explain (verbose, costs off) +select * from + text_tbl t1 + inner join int8_tbl i8 + on i8.q2 = 456 + right join text_tbl t2 + on t1.f1 = 'doh!' + left join int4_tbl i4 + on i8.q1 = i4.f1; + +select * from + text_tbl t1 + inner join int8_tbl i8 + on i8.q2 = 456 + right join text_tbl t2 + on t1.f1 = 'doh!' + left join int4_tbl i4 + on i8.q1 = i4.f1; + +-- +-- test for appropriate join order in the presence of lateral references +-- + +explain (verbose, costs off) +select * from + text_tbl t1 + left join int8_tbl i8 + on i8.q2 = 123, + lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss +where t1.f1 = ss.f1; + +select * from + text_tbl t1 + left join int8_tbl i8 + on i8.q2 = 123, + lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss +where t1.f1 = ss.f1; + +explain (verbose, costs off) +select * from + text_tbl t1 + left join int8_tbl i8 + on i8.q2 = 123, + lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss1, + lateral (select ss1.* from text_tbl t3 limit 1) as ss2 +where t1.f1 = ss2.f1; + +select * from + text_tbl t1 + left join int8_tbl i8 + on i8.q2 = 123, + lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss1, + lateral (select ss1.* from text_tbl t3 limit 1) as ss2 +where t1.f1 = ss2.f1; + +explain (verbose, costs off) +select 1 from + text_tbl as tt1 + inner join text_tbl as tt2 on (tt1.f1 = 'foo') + left join text_tbl as tt3 on (tt3.f1 = 'foo') + left join text_tbl as tt4 on (tt3.f1 = tt4.f1), + lateral (select tt4.f1 as c0 from text_tbl as tt5 limit 1) as ss1 +where tt1.f1 = ss1.c0; + +select 1 from + text_tbl as tt1 + inner join text_tbl as tt2 on (tt1.f1 = 'foo') + left join text_tbl as tt3 on (tt3.f1 = 'foo') + left join text_tbl as tt4 on (tt3.f1 = tt4.f1), + lateral (select tt4.f1 as c0 from text_tbl as tt5 limit 1) as ss1 +where tt1.f1 = ss1.c0; + +-- +-- check a case in which a PlaceHolderVar forces join order +-- + +explain (verbose, costs off) +select ss2.* from + int4_tbl i41 + left join int8_tbl i8 + join (select i42.f1 as c1, i43.f1 as c2, 42 as c3 + from int4_tbl i42, int4_tbl i43) ss1 + on i8.q1 = ss1.c2 + on i41.f1 = ss1.c1, + lateral (select i41.*, i8.*, ss1.* from text_tbl limit 1) ss2 +where ss1.c2 = 0; + +select ss2.* from + int4_tbl i41 + left join int8_tbl i8 + join (select i42.f1 as c1, i43.f1 as c2, 42 as c3 + from int4_tbl i42, int4_tbl i43) ss1 + on i8.q1 = ss1.c2 + on i41.f1 = ss1.c1, + lateral (select i41.*, i8.*, ss1.* from text_tbl limit 1) ss2 +where ss1.c2 = 0; + +-- +-- test successful handling of full join underneath left join (bug #14105) +-- + +explain (costs off) +select * from + (select 1 as id) as xx + left join + (tenk1 as a1 full join (select 1 as id) as yy on (a1.unique1 = yy.id)) + on (xx.id = coalesce(yy.id)); + +select * from + (select 1 as id) as xx + left join + (tenk1 as a1 full join (select 1 as id) as yy on (a1.unique1 = yy.id)) + on (xx.id = coalesce(yy.id)); + +-- +-- test ability to push constants through outer join clauses +-- + +explain (costs off) + select * from int4_tbl a left join tenk1 b on f1 = unique2 where f1 = 0; + +explain (costs off) + select * from tenk1 a full join tenk1 b using(unique2) where unique2 = 42; + +-- +-- test that quals attached to an outer join have correct semantics, +-- specifically that they don't re-use expressions computed below the join; +-- we force a mergejoin so that coalesce(b.q1, 1) appears as a join input +-- + +set enable_hashjoin to off; +set enable_nestloop to off; + +explain (verbose, costs off) + select a.q2, b.q1 + from int8_tbl a left join int8_tbl b on a.q2 = coalesce(b.q1, 1) + where coalesce(b.q1, 1) > 0; +select a.q2, b.q1 + from int8_tbl a left join int8_tbl b on a.q2 = coalesce(b.q1, 1) + where coalesce(b.q1, 1) > 0; + +reset enable_hashjoin; +reset enable_nestloop; + +-- +-- test join removal +-- + +begin; + +CREATE TEMP TABLE a (id int PRIMARY KEY, b_id int); +CREATE TEMP TABLE b (id int PRIMARY KEY, c_id int); +CREATE TEMP TABLE c (id int PRIMARY KEY); +CREATE TEMP TABLE d (a int, b int); +INSERT INTO a VALUES (0, 0), (1, NULL); +INSERT INTO b VALUES (0, 0), (1, NULL); +INSERT INTO c VALUES (0), (1); +INSERT INTO d VALUES (1,3), (2,2), (3,1); + +-- all three cases should be optimizable into a simple seqscan +explain (costs off) SELECT a.* FROM a LEFT JOIN b ON a.b_id = b.id; +explain (costs off) SELECT b.* FROM b LEFT JOIN c ON b.c_id = c.id; +explain (costs off) + SELECT a.* FROM a LEFT JOIN (b left join c on b.c_id = c.id) + ON (a.b_id = b.id); + +-- check optimization of outer join within another special join +explain (costs off) +select id from a where id in ( + select b.id from b left join c on b.id = c.id +); + +-- check that join removal works for a left join when joining a subquery +-- that is guaranteed to be unique by its GROUP BY clause +explain (costs off) +select d.* from d left join (select * from b group by b.id, b.c_id) s + on d.a = s.id and d.b = s.c_id; + +-- similarly, but keying off a DISTINCT clause +explain (costs off) +select d.* from d left join (select distinct * from b) s + on d.a = s.id and d.b = s.c_id; + +-- join removal is not possible when the GROUP BY contains a column that is +-- not in the join condition. (Note: as of 9.6, we notice that b.id is a +-- primary key and so drop b.c_id from the GROUP BY of the resulting plan; +-- but this happens too late for join removal in the outer plan level.) +explain (costs off) +select d.* from d left join (select * from b group by b.id, b.c_id) s + on d.a = s.id; + +-- similarly, but keying off a DISTINCT clause +explain (costs off) +select d.* from d left join (select distinct * from b) s + on d.a = s.id; + +-- check join removal works when uniqueness of the join condition is enforced +-- by a UNION +explain (costs off) +select d.* from d left join (select id from a union select id from b) s + on d.a = s.id; + +-- check join removal with a cross-type comparison operator +explain (costs off) +select i8.* from int8_tbl i8 left join (select f1 from int4_tbl group by f1) i4 + on i8.q1 = i4.f1; + +-- check join removal with lateral references +explain (costs off) +select 1 from (select a.id FROM a left join b on a.b_id = b.id) q, + lateral generate_series(1, q.id) gs(i) where q.id = gs.i; + +rollback; + +create temp table parent (k int primary key, pd int); +create temp table child (k int unique, cd int); +insert into parent values (1, 10), (2, 20), (3, 30); +insert into child values (1, 100), (4, 400); + +-- this case is optimizable +select p.* from parent p left join child c on (p.k = c.k); +explain (costs off) + select p.* from parent p left join child c on (p.k = c.k); + +-- this case is not +select p.*, linked from parent p + left join (select c.*, true as linked from child c) as ss + on (p.k = ss.k); +explain (costs off) + select p.*, linked from parent p + left join (select c.*, true as linked from child c) as ss + on (p.k = ss.k); + +-- check for a 9.0rc1 bug: join removal breaks pseudoconstant qual handling +select p.* from + parent p left join child c on (p.k = c.k) + where p.k = 1 and p.k = 2; +explain (costs off) +select p.* from + parent p left join child c on (p.k = c.k) + where p.k = 1 and p.k = 2; + +select p.* from + (parent p left join child c on (p.k = c.k)) join parent x on p.k = x.k + where p.k = 1 and p.k = 2; +explain (costs off) +select p.* from + (parent p left join child c on (p.k = c.k)) join parent x on p.k = x.k + where p.k = 1 and p.k = 2; + +-- bug 5255: this is not optimizable by join removal +begin; + +CREATE TEMP TABLE a (id int PRIMARY KEY); +CREATE TEMP TABLE b (id int PRIMARY KEY, a_id int); +INSERT INTO a VALUES (0), (1); +INSERT INTO b VALUES (0, 0), (1, NULL); + +SELECT * FROM b LEFT JOIN a ON (b.a_id = a.id) WHERE (a.id IS NULL OR a.id > 0); +SELECT b.* FROM b LEFT JOIN a ON (b.a_id = a.id) WHERE (a.id IS NULL OR a.id > 0); + +rollback; + +-- another join removal bug: this is not optimizable, either +begin; + +create temp table innertab (id int8 primary key, dat1 int8); +insert into innertab values(123, 42); + +SELECT * FROM + (SELECT 1 AS x) ss1 + LEFT JOIN + (SELECT q1, q2, COALESCE(dat1, q1) AS y + FROM int8_tbl LEFT JOIN innertab ON q2 = id) ss2 + ON true; + +rollback; + +-- another join removal bug: we must clean up correctly when removing a PHV +begin; + +create temp table uniquetbl (f1 text unique); + +explain (costs off) +select t1.* from + uniquetbl as t1 + left join (select *, '***'::text as d1 from uniquetbl) t2 + on t1.f1 = t2.f1 + left join uniquetbl t3 + on t2.d1 = t3.f1; + +explain (costs off) +select t0.* +from + text_tbl t0 + left join + (select case t1.ten when 0 then 'doh!'::text else null::text end as case1, + t1.stringu2 + from tenk1 t1 + join int4_tbl i4 ON i4.f1 = t1.unique2 + left join uniquetbl u1 ON u1.f1 = t1.string4) ss + on t0.f1 = ss.case1 +where ss.stringu2 !~* ss.case1; + +select t0.* +from + text_tbl t0 + left join + (select case t1.ten when 0 then 'doh!'::text else null::text end as case1, + t1.stringu2 + from tenk1 t1 + join int4_tbl i4 ON i4.f1 = t1.unique2 + left join uniquetbl u1 ON u1.f1 = t1.string4) ss + on t0.f1 = ss.case1 +where ss.stringu2 !~* ss.case1; + +rollback; + +-- test case to expose miscomputation of required relid set for a PHV +explain (verbose, costs off) +select i8.*, ss.v, t.unique2 + from int8_tbl i8 + left join int4_tbl i4 on i4.f1 = 1 + left join lateral (select i4.f1 + 1 as v) as ss on true + left join tenk1 t on t.unique2 = ss.v +where q2 = 456; + +select i8.*, ss.v, t.unique2 + from int8_tbl i8 + left join int4_tbl i4 on i4.f1 = 1 + left join lateral (select i4.f1 + 1 as v) as ss on true + left join tenk1 t on t.unique2 = ss.v +where q2 = 456; + +-- and check a related issue where we miscompute required relids for +-- a PHV that's been translated to a child rel +create temp table parttbl (a integer primary key) partition by range (a); +create temp table parttbl1 partition of parttbl for values from (1) to (100); +insert into parttbl values (11), (12); +explain (costs off) +select * from + (select *, 12 as phv from parttbl) as ss + right join int4_tbl on true +where ss.a = ss.phv and f1 = 0; + +select * from + (select *, 12 as phv from parttbl) as ss + right join int4_tbl on true +where ss.a = ss.phv and f1 = 0; + +-- bug #8444: we've historically allowed duplicate aliases within aliased JOINs + +select * from + int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = f1; -- error +select * from + int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = y.f1; -- error +select * from + int8_tbl x join (int4_tbl x cross join int4_tbl y(ff)) j on q1 = f1; -- ok + +-- +-- Test hints given on incorrect column references are useful +-- + +select t1.uunique1 from + tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t1" suggestion +select t2.uunique1 from + tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t2" suggestion +select uunique1 from + tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, suggest both at once + +-- +-- Take care to reference the correct RTE +-- + +select atts.relid::regclass, s.* from pg_stats s join + pg_attribute a on s.attname = a.attname and s.tablename = + a.attrelid::regclass::text join (select unnest(indkey) attnum, + indexrelid from pg_index i) atts on atts.attnum = a.attnum where + schemaname != 'pg_catalog'; + +-- +-- Test LATERAL +-- + +select unique2, x.* +from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x; +explain (costs off) + select unique2, x.* + from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x; +select unique2, x.* +from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss; +explain (costs off) + select unique2, x.* + from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss; +explain (costs off) + select unique2, x.* + from int4_tbl x cross join lateral (select unique2 from tenk1 where f1 = unique1) ss; +select unique2, x.* +from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true; +explain (costs off) + select unique2, x.* + from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true; + +-- check scoping of lateral versus parent references +-- the first of these should return int8_tbl.q2, the second int8_tbl.q1 +select *, (select r from (select q1 as q2) x, (select q2 as r) y) from int8_tbl; +select *, (select r from (select q1 as q2) x, lateral (select q2 as r) y) from int8_tbl; + +-- lateral with function in FROM +select count(*) from tenk1 a, lateral generate_series(1,two) g; +explain (costs off) + select count(*) from tenk1 a, lateral generate_series(1,two) g; +explain (costs off) + select count(*) from tenk1 a cross join lateral generate_series(1,two) g; +-- don't need the explicit LATERAL keyword for functions +explain (costs off) + select count(*) from tenk1 a, generate_series(1,two) g; + +-- lateral with UNION ALL subselect +explain (costs off) + select * from generate_series(100,200) g, + lateral (select * from int8_tbl a where g = q1 union all + select * from int8_tbl b where g = q2) ss; +select * from generate_series(100,200) g, + lateral (select * from int8_tbl a where g = q1 union all + select * from int8_tbl b where g = q2) ss; + +-- lateral with VALUES +explain (costs off) + select count(*) from tenk1 a, + tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x; +select count(*) from tenk1 a, + tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x; + +-- lateral with VALUES, no flattening possible +explain (costs off) + select count(*) from tenk1 a, + tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x; +select count(*) from tenk1 a, + tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x; + +-- lateral injecting a strange outer join condition +explain (costs off) + select * from int8_tbl a, + int8_tbl x left join lateral (select a.q1 from int4_tbl y) ss(z) + on x.q2 = ss.z + order by a.q1, a.q2, x.q1, x.q2, ss.z; +select * from int8_tbl a, + int8_tbl x left join lateral (select a.q1 from int4_tbl y) ss(z) + on x.q2 = ss.z + order by a.q1, a.q2, x.q1, x.q2, ss.z; + +-- lateral reference to a join alias variable +select * from (select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1, + lateral (select x) ss2(y); +select * from (select f1 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1, + lateral (values(x)) ss2(y); +select * from ((select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1) j, + lateral (select x) ss2(y); + +-- lateral references requiring pullup +select * from (values(1)) x(lb), + lateral generate_series(lb,4) x4; +select * from (select f1/1000000000 from int4_tbl) x(lb), + lateral generate_series(lb,4) x4; +select * from (values(1)) x(lb), + lateral (values(lb)) y(lbcopy); +select * from (values(1)) x(lb), + lateral (select lb from int4_tbl) y(lbcopy); +select * from + int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1, + lateral (values(x.q1,y.q1,y.q2)) v(xq1,yq1,yq2); +select * from + int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1, + lateral (select x.q1,y.q1,y.q2) v(xq1,yq1,yq2); +select x.* from + int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1, + lateral (select x.q1,y.q1,y.q2) v(xq1,yq1,yq2); +select v.* from + (int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1) + left join int4_tbl z on z.f1 = x.q2, + lateral (select x.q1,y.q1 union all select x.q2,y.q2) v(vx,vy); +select v.* from + (int8_tbl x left join (select q1,(select coalesce(q2,0)) q2 from int8_tbl) y on x.q2 = y.q1) + left join int4_tbl z on z.f1 = x.q2, + lateral (select x.q1,y.q1 union all select x.q2,y.q2) v(vx,vy); +select v.* from + (int8_tbl x left join (select q1,(select coalesce(q2,0)) q2 from int8_tbl) y on x.q2 = y.q1) + left join int4_tbl z on z.f1 = x.q2, + lateral (select x.q1,y.q1 from onerow union all select x.q2,y.q2 from onerow) v(vx,vy); + +explain (verbose, costs off) +select * from + int8_tbl a left join + lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1; +select * from + int8_tbl a left join + lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1; +explain (verbose, costs off) +select * from + int8_tbl a left join + lateral (select *, coalesce(a.q2, 42) as x from int8_tbl b) ss on a.q2 = ss.q1; +select * from + int8_tbl a left join + lateral (select *, coalesce(a.q2, 42) as x from int8_tbl b) ss on a.q2 = ss.q1; + +-- lateral can result in join conditions appearing below their +-- real semantic level +explain (verbose, costs off) +select * from int4_tbl i left join + lateral (select * from int2_tbl j where i.f1 = j.f1) k on true; +select * from int4_tbl i left join + lateral (select * from int2_tbl j where i.f1 = j.f1) k on true; +explain (verbose, costs off) +select * from int4_tbl i left join + lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true; +select * from int4_tbl i left join + lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true; +explain (verbose, costs off) +select * from int4_tbl a, + lateral ( + select * from int4_tbl b left join int8_tbl c on (b.f1 = q1 and a.f1 = q2) + ) ss; +select * from int4_tbl a, + lateral ( + select * from int4_tbl b left join int8_tbl c on (b.f1 = q1 and a.f1 = q2) + ) ss; + +-- lateral reference in a PlaceHolderVar evaluated at join level +explain (verbose, costs off) +select * from + int8_tbl a left join lateral + (select b.q1 as bq1, c.q1 as cq1, least(a.q1,b.q1,c.q1) from + int8_tbl b cross join int8_tbl c) ss + on a.q2 = ss.bq1; +select * from + int8_tbl a left join lateral + (select b.q1 as bq1, c.q1 as cq1, least(a.q1,b.q1,c.q1) from + int8_tbl b cross join int8_tbl c) ss + on a.q2 = ss.bq1; + +-- case requiring nested PlaceHolderVars +explain (verbose, costs off) +select * from + int8_tbl c left join ( + int8_tbl a left join (select q1, coalesce(q2,42) as x from int8_tbl b) ss1 + on a.q2 = ss1.q1 + cross join + lateral (select q1, coalesce(ss1.x,q2) as y from int8_tbl d) ss2 + ) on c.q2 = ss2.q1, + lateral (select ss2.y offset 0) ss3; + +-- case that breaks the old ph_may_need optimization +explain (verbose, costs off) +select c.*,a.*,ss1.q1,ss2.q1,ss3.* from + int8_tbl c left join ( + int8_tbl a left join + (select q1, coalesce(q2,f1) as x from int8_tbl b, int4_tbl b2 + where q1 < f1) ss1 + on a.q2 = ss1.q1 + cross join + lateral (select q1, coalesce(ss1.x,q2) as y from int8_tbl d) ss2 + ) on c.q2 = ss2.q1, + lateral (select * from int4_tbl i where ss2.y > f1) ss3; + +-- check processing of postponed quals (bug #9041) +explain (verbose, costs off) +select * from + (select 1 as x offset 0) x cross join (select 2 as y offset 0) y + left join lateral ( + select * from (select 3 as z offset 0) z where z.z = x.x + ) zz on zz.z = y.y; + +-- check dummy rels with lateral references (bug #15694) +explain (verbose, costs off) +select * from int8_tbl i8 left join lateral + (select *, i8.q2 from int4_tbl where false) ss on true; +explain (verbose, costs off) +select * from int8_tbl i8 left join lateral + (select *, i8.q2 from int4_tbl i1, int4_tbl i2 where false) ss on true; + +-- check handling of nested appendrels inside LATERAL +select * from + ((select 2 as v) union all (select 3 as v)) as q1 + cross join lateral + ((select * from + ((select 4 as v) union all (select 5 as v)) as q3) + union all + (select q1.v) + ) as q2; + +-- check the number of columns specified +SELECT * FROM (int8_tbl i cross join int4_tbl j) ss(a,b,c,d); + +-- check we don't try to do a unique-ified semijoin with LATERAL +explain (verbose, costs off) +select * from + (values (0,9998), (1,1000)) v(id,x), + lateral (select f1 from int4_tbl + where f1 = any (select unique1 from tenk1 + where unique2 = v.x offset 0)) ss; +select * from + (values (0,9998), (1,1000)) v(id,x), + lateral (select f1 from int4_tbl + where f1 = any (select unique1 from tenk1 + where unique2 = v.x offset 0)) ss; + +-- check proper extParam/allParam handling (this isn't exactly a LATERAL issue, +-- but we can make the test case much more compact with LATERAL) +explain (verbose, costs off) +select * from (values (0), (1)) v(id), +lateral (select * from int8_tbl t1, + lateral (select * from + (select * from int8_tbl t2 + where q1 = any (select q2 from int8_tbl t3 + where q2 = (select greatest(t1.q1,t2.q2)) + and (select v.id=0)) offset 0) ss2) ss + where t1.q1 = ss.q2) ss0; + +select * from (values (0), (1)) v(id), +lateral (select * from int8_tbl t1, + lateral (select * from + (select * from int8_tbl t2 + where q1 = any (select q2 from int8_tbl t3 + where q2 = (select greatest(t1.q1,t2.q2)) + and (select v.id=0)) offset 0) ss2) ss + where t1.q1 = ss.q2) ss0; + +-- test some error cases where LATERAL should have been used but wasn't +select f1,g from int4_tbl a, (select f1 as g) ss; +select f1,g from int4_tbl a, (select a.f1 as g) ss; +select f1,g from int4_tbl a cross join (select f1 as g) ss; +select f1,g from int4_tbl a cross join (select a.f1 as g) ss; +-- SQL:2008 says the left table is in scope but illegal to access here +select f1,g from int4_tbl a right join lateral generate_series(0, a.f1) g on true; +select f1,g from int4_tbl a full join lateral generate_series(0, a.f1) g on true; +-- check we complain about ambiguous table references +select * from + int8_tbl x cross join (int4_tbl x cross join lateral (select x.f1) ss); +-- LATERAL can be used to put an aggregate into the FROM clause of its query +select 1 from tenk1 a, lateral (select max(a.unique1) from int4_tbl b) ss; + +-- check behavior of LATERAL in UPDATE/DELETE + +create temp table xx1 as select f1 as x1, -f1 as x2 from int4_tbl; + +-- error, can't do this: +update xx1 set x2 = f1 from (select * from int4_tbl where f1 = x1) ss; +update xx1 set x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss; +-- can't do it even with LATERAL: +update xx1 set x2 = f1 from lateral (select * from int4_tbl where f1 = x1) ss; +-- we might in future allow something like this, but for now it's an error: +update xx1 set x2 = f1 from xx1, lateral (select * from int4_tbl where f1 = x1) ss; + +-- also errors: +delete from xx1 using (select * from int4_tbl where f1 = x1) ss; +delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss; +delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss; + +-- +-- test LATERAL reference propagation down a multi-level inheritance hierarchy +-- produced for a multi-level partitioned table hierarchy. +-- +create table join_pt1 (a int, b int, c varchar) partition by range(a); +create table join_pt1p1 partition of join_pt1 for values from (0) to (100) partition by range(b); +create table join_pt1p2 partition of join_pt1 for values from (100) to (200); +create table join_pt1p1p1 partition of join_pt1p1 for values from (0) to (100); +insert into join_pt1 values (1, 1, 'x'), (101, 101, 'y'); +create table join_ut1 (a int, b int, c varchar); +insert into join_ut1 values (101, 101, 'y'), (2, 2, 'z'); +explain (verbose, costs off) +select t1.b, ss.phv from join_ut1 t1 left join lateral + (select t2.a as t2a, t3.a t3a, least(t1.a, t2.a, t3.a) phv + from join_pt1 t2 join join_ut1 t3 on t2.a = t3.b) ss + on t1.a = ss.t2a order by t1.a; +select t1.b, ss.phv from join_ut1 t1 left join lateral + (select t2.a as t2a, t3.a t3a, least(t1.a, t2.a, t3.a) phv + from join_pt1 t2 join join_ut1 t3 on t2.a = t3.b) ss + on t1.a = ss.t2a order by t1.a; + +drop table join_pt1; +drop table join_ut1; + +-- +-- test estimation behavior with multi-column foreign key and constant qual +-- + +begin; + +create table fkest (x integer, x10 integer, x10b integer, x100 integer); +insert into fkest select x, x/10, x/10, x/100 from generate_series(1,1000) x; +create unique index on fkest(x, x10, x100); +analyze fkest; + +explain (costs off) +select * from fkest f1 + join fkest f2 on (f1.x = f2.x and f1.x10 = f2.x10b and f1.x100 = f2.x100) + join fkest f3 on f1.x = f3.x + where f1.x100 = 2; + +alter table fkest add constraint fk + foreign key (x, x10b, x100) references fkest (x, x10, x100); + +explain (costs off) +select * from fkest f1 + join fkest f2 on (f1.x = f2.x and f1.x10 = f2.x10b and f1.x100 = f2.x100) + join fkest f3 on f1.x = f3.x + where f1.x100 = 2; + +rollback; + +-- +-- test that foreign key join estimation performs sanely for outer joins +-- + +begin; + +create table fkest (a int, b int, c int unique, primary key(a,b)); +create table fkest1 (a int, b int, primary key(a,b)); + +insert into fkest select x/10, x%10, x from generate_series(1,1000) x; +insert into fkest1 select x/10, x%10 from generate_series(1,1000) x; + +alter table fkest1 + add constraint fkest1_a_b_fkey foreign key (a,b) references fkest; + +analyze fkest; +analyze fkest1; + +explain (costs off) +select * +from fkest f + left join fkest1 f1 on f.a = f1.a and f.b = f1.b + left join fkest1 f2 on f.a = f2.a and f.b = f2.b + left join fkest1 f3 on f.a = f3.a and f.b = f3.b +where f.c = 1; + +rollback; + +-- +-- test planner's ability to mark joins as unique +-- + +create table j1 (id int primary key); +create table j2 (id int primary key); +create table j3 (id int); + +insert into j1 values(1),(2),(3); +insert into j2 values(1),(2),(3); +insert into j3 values(1),(1); + +analyze j1; +analyze j2; +analyze j3; + +-- ensure join is properly marked as unique +explain (verbose, costs off) +select * from j1 inner join j2 on j1.id = j2.id; + +-- ensure join is not unique when not an equi-join +explain (verbose, costs off) +select * from j1 inner join j2 on j1.id > j2.id; + +-- ensure non-unique rel is not chosen as inner +explain (verbose, costs off) +select * from j1 inner join j3 on j1.id = j3.id; + +-- ensure left join is marked as unique +explain (verbose, costs off) +select * from j1 left join j2 on j1.id = j2.id; + +-- ensure right join is marked as unique +explain (verbose, costs off) +select * from j1 right join j2 on j1.id = j2.id; + +-- ensure full join is marked as unique +explain (verbose, costs off) +select * from j1 full join j2 on j1.id = j2.id; + +-- a clauseless (cross) join can't be unique +explain (verbose, costs off) +select * from j1 cross join j2; + +-- ensure a natural join is marked as unique +explain (verbose, costs off) +select * from j1 natural join j2; + +-- ensure a distinct clause allows the inner to become unique +explain (verbose, costs off) +select * from j1 +inner join (select distinct id from j3) j3 on j1.id = j3.id; + +-- ensure group by clause allows the inner to become unique +explain (verbose, costs off) +select * from j1 +inner join (select id from j3 group by id) j3 on j1.id = j3.id; + +drop table j1; +drop table j2; +drop table j3; + +-- test more complex permutations of unique joins + +create table j1 (id1 int, id2 int, primary key(id1,id2)); +create table j2 (id1 int, id2 int, primary key(id1,id2)); +create table j3 (id1 int, id2 int, primary key(id1,id2)); + +insert into j1 values(1,1),(1,2); +insert into j2 values(1,1); +insert into j3 values(1,1); + +analyze j1; +analyze j2; +analyze j3; + +-- ensure there's no unique join when not all columns which are part of the +-- unique index are seen in the join clause +explain (verbose, costs off) +select * from j1 +inner join j2 on j1.id1 = j2.id1; + +-- ensure proper unique detection with multiple join quals +explain (verbose, costs off) +select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2; + +-- ensure we don't detect the join to be unique when quals are not part of the +-- join condition +explain (verbose, costs off) +select * from j1 +inner join j2 on j1.id1 = j2.id1 where j1.id2 = 1; + +-- as above, but for left joins. +explain (verbose, costs off) +select * from j1 +left join j2 on j1.id1 = j2.id1 where j1.id2 = 1; + +-- validate logic in merge joins which skips mark and restore. +-- it should only do this if all quals which were used to detect the unique +-- are present as join quals, and not plain quals. +set enable_nestloop to 0; +set enable_hashjoin to 0; +set enable_sort to 0; + +-- create indexes that will be preferred over the PKs to perform the join +create index j1_id1_idx on j1 (id1) where id1 % 1000 = 1; +create index j2_id1_idx on j2 (id1) where id1 % 1000 = 1; + +-- need an additional row in j2, if we want j2_id1_idx to be preferred +insert into j2 values(1,2); +analyze j2; + +explain (costs off) select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1; + +select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1; + +-- Exercise array keys mark/restore B-Tree code +explain (costs off) select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 = any (array[1]); + +select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 = any (array[1]); + +-- Exercise array keys "find extreme element" B-Tree code +explain (costs off) select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 >= any (array[1,5]); + +select * from j1 +inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 +where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 >= any (array[1,5]); + +reset enable_nestloop; +reset enable_hashjoin; +reset enable_sort; + +drop table j1; +drop table j2; +drop table j3; + +-- check that semijoin inner is not seen as unique for a portion of the outerrel +explain (verbose, costs off) +select t1.unique1, t2.hundred +from onek t1, tenk1 t2 +where exists (select 1 from tenk1 t3 + where t3.thousand = t1.unique1 and t3.tenthous = t2.hundred) + and t1.unique1 < 1; + +-- ... unless it actually is unique +create table j3 as select unique1, tenthous from onek; +vacuum analyze j3; +create unique index on j3(unique1, tenthous); + +explain (verbose, costs off) +select t1.unique1, t2.hundred +from onek t1, tenk1 t2 +where exists (select 1 from j3 + where j3.unique1 = t1.unique1 and j3.tenthous = t2.hundred) + and t1.unique1 < 1; + +drop table j3; diff --git a/src/test/singlenode_regress/sql/join_gp.sql b/src/test/singlenode_regress/sql/join_gp.sql new file mode 100644 index 00000000000..674f51634dd --- /dev/null +++ b/src/test/singlenode_regress/sql/join_gp.sql @@ -0,0 +1,768 @@ +-- Extra GPDB tests for joins. + +-- Ignore "workfile compresssion is not supported by this build" (see +-- 'zlib' test): +-- +-- start_matchignore +-- m/ERROR: workfile compresssion is not supported by this build/ +-- end_matchignore + +-- +-- test numeric hash join +-- + +set enable_hashjoin to on; +set enable_mergejoin to off; +set enable_nestloop to off; +create table nhtest (i numeric(10, 2)); +insert into nhtest values(100000.22); +insert into nhtest values(300000.19); +explain select * from nhtest a join nhtest b using (i); +select * from nhtest a join nhtest b using (i); + +create temp table l(a int); +insert into l values (1), (1), (2); +select * from l l1 join l l2 on l1.a = l2.a left join l l3 on l1.a = l3.a and l1.a = 2 order by 1,2,3; + +-- +-- test hash join +-- + +create table hjtest (i int, j int); +insert into hjtest values(3, 4); + +select count(*) from hjtest a1, hjtest a2 where a2.i = least (a1.i,4) and a2.j = 4; + +-- +-- Test for correct behavior when there is a Merge Join on top of Materialize +-- on top of a Motion : +-- 1. Use FULL OUTER JOIN to induce a Merge Join +-- 2. Use a large tuple size to induce a Materialize +-- 3. Use gp_dist_random() to induce a Redistribute +-- + +set enable_hashjoin to off; +set enable_mergejoin to on; +set enable_nestloop to off; + +DROP TABLE IF EXISTS alpha; +DROP TABLE IF EXISTS theta; + +CREATE TABLE alpha (i int, j int); +CREATE TABLE theta (i int, j char(10000000)); + +INSERT INTO alpha values (1, 1), (2, 2); +INSERT INTO theta values (1, 'f'), (2, 'g'); + +SELECT * +FROM gp_dist_random('alpha') FULL OUTER JOIN gp_dist_random('theta') + ON (alpha.i = theta.i) +WHERE (alpha.j IS NULL or theta.j IS NULL); + +reset enable_hashjoin; +reset enable_mergejoin; +reset enable_nestloop; + +-- +-- Predicate propagation over equality conditions +-- + +drop schema if exists pred; +create schema pred; +set search_path=pred; + +create table t1 (x int, y int, z int); +create table t2 (x int, y int, z int); +insert into t1 select i, i, i from generate_series(1,100) i; +insert into t2 select * from t1; + +analyze t1; +analyze t2; + +-- +-- infer over equalities +-- +explain select count(*) from t1,t2 where t1.x = 100 and t1.x = t2.x; +select count(*) from t1,t2 where t1.x = 100 and t1.x = t2.x; + +-- +-- infer over >= +-- +explain select * from t1,t2 where t1.x = 100 and t2.x >= t1.x; +select * from t1,t2 where t1.x = 100 and t2.x >= t1.x; + +-- +-- multiple inferences +-- + +set optimizer_segments=2; +explain select * from t1,t2 where t1.x = 100 and t1.x = t2.y and t1.x <= t2.x; +reset optimizer_segments; +select * from t1,t2 where t1.x = 100 and t1.x = t2.y and t1.x <= t2.x; + +-- +-- MPP-18537: hash clause references a constant in outer child target list +-- + +create table hjn_test (i int, j int); +insert into hjn_test values(3, 4); +create table int4_tbl (f1 int); +insert into int4_tbl values(123456), (-2147483647), (0), (-123456), (2147483647); +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar,4) and hjn_test.j = 4; +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar,(array[4])[1]) and hjn_test.j = (array[4])[1]; +select count(*) from hjn_test, (select 3 as bar) foo where least (foo.bar,(array[4])[1]) = hjn_test.i and hjn_test.j = (array[4])[1]; +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar, least(4,10)) and hjn_test.j = least(4,10); +select * from int4_tbl a join int4_tbl b on (a.f1 = (select f1 from int4_tbl c where c.f1=b.f1)); + +-- Same as the last query, but with a partitioned table (which requires a +-- Result node to do projection of the hash expression, as Append is not +-- projection-capable) +create table part4_tbl (f1 int4) partition by range (f1) (start(-1000000) end (1000000) every (1000000)); +insert into part4_tbl values + (-123457), (-123456), (-123455), + (-1), (0), (1), + (123455), (123456), (123457); +select * from part4_tbl a join part4_tbl b on (a.f1 = (select f1 from int4_tbl c where c.f1=b.f1)); + +-- +-- Test case where a Motion hash key is only needed for the redistribution, +-- and not returned in the final result set. There was a bug at one point where +-- tjoin.c1 was used as the hash key in a Motion node, but it was not added +-- to the sub-plans target list, causing a "variable not found in subplan +-- target list" error. +-- +create table tjoin1(dk integer, id integer); +create table tjoin2(dk integer, id integer, t text); +create table tjoin3(dk integer, id integer, t text); + +insert into tjoin1 values (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3); +insert into tjoin2 values (1, 1, '1-1'), (1, 2, '1-2'), (2, 1, '2-1'), (2, 2, '2-2'); +insert into tjoin3 values (1, 1, '1-1'), (2, 1, '2-1'); + +select tjoin1.id, tjoin2.t, tjoin3.t +from tjoin1 +left outer join (tjoin2 left outer join tjoin3 on tjoin2.id=tjoin3.id) on tjoin1.id=tjoin3.id; + + +set enable_hashjoin to off; +set optimizer_enable_hashjoin = off; + +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar,4) and hjn_test.j = 4; +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar,(array[4])[1]) and hjn_test.j = (array[4])[1]; +select count(*) from hjn_test, (select 3 as bar) foo where least (foo.bar,(array[4])[1]) = hjn_test.i and hjn_test.j = (array[4])[1]; +select count(*) from hjn_test, (select 3 as bar) foo where hjn_test.i = least (foo.bar, least(4,10)) and hjn_test.j = least(4,10); +select * from int4_tbl a join int4_tbl b on (a.f1 = (select f1 from int4_tbl c where c.f1=b.f1)); + +reset enable_hashjoin; +reset optimizer_enable_hashjoin; + +-- In case of Left Anti Semi Join, if the left rel is empty a dummy join +-- should be created +drop table if exists foo; +drop table if exists bar; +create table foo (a int, b int); +create table bar (c int, d int); +insert into foo select generate_series(1,10); +insert into bar select generate_series(1,10); + +explain select a from foo where a<1 and a>1 and not exists (select c from bar where c=a); +select a from foo where a<1 and a>1 and not exists (select c from bar where c=a); + +-- The merge join executor code doesn't support LASJ_NOTIN joins. Make sure +-- the planner doesn't create an invalid plan with them. +create index index_foo on foo (a); +create index index_bar on bar (c); + +set enable_nestloop to off; +set enable_hashjoin to off; +set enable_mergejoin to on; + +select * from foo where a not in (select c from bar where c <= 5); + +set enable_nestloop to off; +set enable_hashjoin to on; +set enable_mergejoin to off; + +create table dept +( + id int, + pid int, + name char(40) +); + +insert into dept values(3, 0, 'root'); +insert into dept values(4, 3, '2<-1'); +insert into dept values(5, 4, '3<-2<-1'); +insert into dept values(6, 4, '4<-2<-1'); +insert into dept values(7, 3, '5<-1'); +insert into dept values(8, 7, '5<-1'); +insert into dept select i, i % 6 + 3 from generate_series(9,50) as i; +insert into dept select i, 99 from generate_series(100,15000) as i; + +ANALYZE dept; + +-- Test rescannable hashjoin with spilling hashtable +set statement_mem='1000kB'; +set gp_workfile_compression = off; +WITH RECURSIVE subdept(id, parent_department, name) AS +( + -- non recursive term + SELECT * FROM dept WHERE name = 'root' + UNION ALL + -- recursive term + SELECT d.* FROM dept AS d, subdept AS sd + WHERE d.pid = sd.id +) +SELECT count(*) FROM subdept; + +-- Test rescannable hashjoin with spilling hashtable, with compression +set gp_workfile_compression = on; +WITH RECURSIVE subdept(id, parent_department, name) AS +( + -- non recursive term + SELECT * FROM dept WHERE name = 'root' + UNION ALL + -- recursive term + SELECT d.* FROM dept AS d, subdept AS sd + WHERE d.pid = sd.id +) +SELECT count(*) FROM subdept; + +-- Test rescannable hashjoin with in-memory hashtable +reset statement_mem; +WITH RECURSIVE subdept(id, parent_department, name) AS +( + -- non recursive term + SELECT * FROM dept WHERE name = 'root' + UNION ALL + -- recursive term + SELECT d.* FROM dept AS d, subdept AS sd + WHERE d.pid = sd.id +) +SELECT count(*) FROM subdept; + + +-- MPP-29458 +-- When we join on a clause with two different types. If one table distribute by one type, the query plan +-- will redistribute data on another type. But the has values of two types would not be equal. The data will +-- redistribute to wrong segments. +create table test_timestamp_t1 (id numeric(10,0) ,field_dt date); +create table test_timestamp_t2 (id numeric(10,0),field_tms timestamp without time zone); + +insert into test_timestamp_t1 values(10 ,'2018-1-10'); +insert into test_timestamp_t1 values(11 ,'2018-1-11'); +insert into test_timestamp_t2 values(10 ,'2018-1-10'::timestamp); +insert into test_timestamp_t2 values(11 ,'2018-1-11'::timestamp); + +-- Test nest loop redistribute keys +set enable_nestloop to on; +set enable_hashjoin to on; +set enable_mergejoin to on; +select count(*) from test_timestamp_t1 t1 ,test_timestamp_t2 t2 where T1.id = T2.id and T1.field_dt = t2.field_tms; + +-- Test hash join redistribute keys +set enable_nestloop to off; +set enable_hashjoin to on; +set enable_mergejoin to on; +select count(*) from test_timestamp_t1 t1 ,test_timestamp_t2 t2 where T1.id = T2.id and T1.field_dt = t2.field_tms; + +drop table test_timestamp_t1; +drop table test_timestamp_t2; + +-- Test merge join redistribute keys +create table test_timestamp_t1 (id numeric(10,0) ,field_dt date); + +create table test_timestamp_t2 (id numeric(10,0),field_tms timestamp without time zone); + +insert into test_timestamp_t1 values(10 ,'2018-1-10'); +insert into test_timestamp_t1 values(11 ,'2018-1-11'); +insert into test_timestamp_t2 values(10 ,'2018-1-10'::timestamp); +insert into test_timestamp_t2 values(11 ,'2018-1-11'::timestamp); + +select * from test_timestamp_t1 t1 full outer join test_timestamp_t2 t2 on T1.id = T2.id and T1.field_dt = t2.field_tms; + +-- test float type +set enable_nestloop to off; +set enable_hashjoin to on; +set enable_mergejoin to on; +create table test_float1(id int, data float4); +create table test_float2(id int, data float8); +insert into test_float1 values(1, 10), (2, 20); +insert into test_float2 values(3, 10), (4, 20); +select t1.id, t1.data, t2.id, t2.data from test_float1 t1, test_float2 t2 where t1.data = t2.data; + +-- test int type +create table test_int1(id int, data int4); +create table test_int2(id int, data int8); +insert into test_int1 values(1, 10), (2, 20); +insert into test_int2 values(3, 10), (4, 20); +select t1.id, t1.data, t2.id, t2.data from test_int1 t1, test_int2 t2 where t1.data = t2.data; + +-- Test to ensure that for full outer join on varchar columns, planner is successful in finding a sort operator in the catalog +create table input_table(a varchar(30), b varchar(30)); +set enable_hashjoin = off; +explain (costs off) select X.a from input_table X full join (select a from input_table) Y ON X.a = Y.a; + +-- Cleanup +reset enable_hashjoin; +set client_min_messages='warning'; -- silence drop-cascade NOTICEs +drop schema pred cascade; +reset search_path; + +-- github issue 5370 cases +drop table if exists t5370; +drop table if exists t5370_2; +create table t5370(id int,name text); +insert into t5370 select i,i from generate_series(1,1000) i; +create table t5370_2 as select * from t5370; +analyze t5370_2; +analyze t5370; +explain select * from t5370 a , t5370_2 b where a.name=b.name; + +drop table t5370; +drop table t5370_2; + +-- github issue 6215 cases +-- When executing the following plan +-- ``` +-- Gather Motion 1:1 (slice1; segments: 1) +-- -> Merge Full Join +-- -> Seq Scan on int4_tbl a +-- -> Seq Scan on int4_tbl b +--``` +-- Cloudberry will raise an Assert Fail. +-- We force adding a material node for +-- merge full join on true. +drop table if exists t6215; +create table t6215(f1 int4); +insert into t6215(f1) values (1), (2), (3); + +set enable_material = off; +-- The plan still have Material operator +explain (costs off) select * from t6215 a full join t6215 b on true; +select * from t6215 a full join t6215 b on true; + +drop table t6215; + + +-- +-- This tripped an assertion while deciding the locus for the joins. +-- The code was failing to handle join between SingleQE and Hash correctly, +-- when there were join order restricitions. (see +-- https://github.com/greenplum-db/gpdb/issues/6643 +-- +select a.f1, b.f1, t.thousand, t.tenthous from + (select sum(f1) as f1 from int4_tbl i4b) b + left outer join + (select sum(f1)+1 as f1 from int4_tbl i4a) a ON a.f1 = b.f1 + left outer join + tenk1 t ON b.f1 = t.thousand and (a.f1+b.f1+999) = t.tenthous; + + +-- tests to ensure that join reordering of LOJs and inner joins produces the +-- correct join predicates & residual filters +drop table if exists t1, t2, t3; +CREATE TABLE t1 (a int, b int, c int); +CREATE TABLE t2 (a int, b int, c int); +CREATE TABLE t3 (a int, b int, c int); +INSERT INTO t1 SELECT i, i, i FROM generate_series(1, 1000) i; +INSERT INTO t2 SELECT i, i, i FROM generate_series(2, 1000) i; -- start from 2 so that one row from t1 doesn't match +INSERT INTO t3 VALUES (1, 2, 3), (NULL, 2, 2); +ANALYZE t1; +ANALYZE t2; +ANALYZE t3; + +-- ensure plan has a filter over left outer join +explain (costs off) select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a IS NULL OR (t1.c = t3.c)); +select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a IS NULL OR (t1.c = t3.c)); + +-- ensure plan has two inner joins with the where clause & join predicates ANDed +explain (costs off) select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a = t3.a); +select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a = t3.a); + +-- ensure plan has a filter over left outer join +explain (costs off) select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a is distinct from t3.a); +select * from t1 left join t2 on (t1.a = t2.a) join t3 on (t1.b = t3.b) where (t2.a is distinct from t3.a); + +-- ensure plan has a filter over left outer join +explain select * from t3 join (select t1.a t1a, t1.b t1b, t1.c t1c, t2.a t2a, t2.b t2b, t2.c t2c from t1 left join t2 on (t1.a = t2.a)) t on (t1a = t3.a) WHERE (t2a IS NULL OR (t1c = t3.a)); +select * from t3 join (select t1.a t1a, t1.b t1b, t1.c t1c, t2.a t2a, t2.b t2b, t2.c t2c from t1 left join t2 on (t1.a = t2.a)) t on (t1a = t3.a) WHERE (t2a IS NULL OR (t1c = t3.a)); + +-- ensure plan has a filter over left outer join +explain select * from (select t1.a t1a, t1.b t1b, t2.a t2a, t2.b t2b from t1 left join t2 on t1.a = t2.a) tt + join t3 on tt.t1b = t3.b + join (select t1.a t1a, t1.b t1b, t2.a t2a, t2.b t2b from t1 left join t2 on t1.a = t2.a) tt1 on tt1.t1b = t3.b + join t3 t3_1 on tt1.t1b = t3_1.b and (tt1.t2a is NULL OR tt1.t1b = t3.b); + +select * from (select t1.a t1a, t1.b t1b, t2.a t2a, t2.b t2b from t1 left join t2 on t1.a = t2.a) tt + join t3 on tt.t1b = t3.b + join (select t1.a t1a, t1.b t1b, t2.a t2a, t2.b t2b from t1 left join t2 on t1.a = t2.a) tt1 on tt1.t1b = t3.b + join t3 t3_1 on tt1.t1b = t3_1.b and (tt1.t2a is NULL OR tt1.t1b = t3.b); + +-- test different join order enumeration methods +set optimizer_join_order = query; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; +set optimizer_join_order = greedy; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; +set optimizer_join_order = exhaustive; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; +set optimizer_join_order = exhaustive2; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; +reset optimizer_join_order; +select * from t1 join t2 on t1.a = t2.a join t3 on t1.b = t3.b; + +drop table t1, t2, t3; + +-- +-- Test a bug that nestloop path previously can not generate motion above +-- index path, which sometimes is wrong (this test case is an example). +-- We now depend on parameterized path related variables to judge instead. +-- We conservatively disallow motion when there is parameter requirement +-- for either outer or inner at this moment though there could be room +-- for further improvement (e.g. referring subplan code to do broadcast +-- for base rel if needed, which needs much effort and does not seem to +-- be deserved given we will probably refactor related code for the lateral +-- support in the near future). For the query and guc settings below, Postgres +-- planner can not generate a plan. +set enable_nestloop = 1; +set enable_material = 0; +set enable_seqscan = 0; +set enable_bitmapscan = 0; +explain select tenk1.unique2 >= 0 from tenk1 left join tenk2 on true limit 1; +select tenk1.unique2 >= 0 from tenk1 left join tenk2 on true limit 1; +reset enable_nestloop; +reset enable_material; +reset enable_seqscan; +reset enable_bitmapscan; + +-- Below test cases are for planner's cdbpath_motion_for_join, so we close +-- ORCA temporarily. +set optimizer = off; +-- test outer join for general locus +-- replicated table's locus is SegmentGeneral +create table trep_join_gp (c1 int, c2 int); +-- hash distributed table's locus is Hash +create table thash_join_gp (c1 int, c2 int); +-- randomly distributed table's locus is Strewn +create table trand_join_gp (c1 int, c2 int); +-- start_ignore +create extension if not exists gp_debug_numsegments; +select gp_debug_set_create_table_default_numsegments(1); +-- end_ignore +-- the following replicated table's numsegments is 1 +create table trep1_join_gp (c1 int, c2 int); + +insert into trep_join_gp values (1, 1), (2, 2); +insert into thash_join_gp values (1, 1), (2, 2); +insert into trep1_join_gp values (1, 1), (2, 2); + +analyze trep_join_gp; +analyze thash_join_gp; +analyze trep1_join_gp; +analyze trand_join_gp; + +-- This test is to check that: general left join segmentGeneral --> segmentGeneral +-- And segmentGeneral join hash does not need motion. +explain select * from generate_series(1, 5) g left join trep_join_gp on g = trep_join_gp.c1 join thash_join_gp on true; +select * from generate_series(1, 5) g left join trep_join_gp on g = trep_join_gp.c1 join thash_join_gp on true; + +-- The following 4 tests are to check that general left join partition, we could redistribute the +-- general-locus relation when the filter condition is suitable. If we can redistributed +-- general-locus relation, we should not gather them to singleQE. +explain select * from generate_series(1, 5) g left join thash_join_gp on g = thash_join_gp.c1; +select * from generate_series(1, 5) g left join thash_join_gp on g = thash_join_gp.c1; + +explain select * from generate_series(1, 5) g left join thash_join_gp on g = thash_join_gp.c2; +select * from generate_series(1, 5) g left join thash_join_gp on g = thash_join_gp.c2; + +explain select * from generate_series(1, 5) g left join trand_join_gp on g = trand_join_gp.c1; +select * from generate_series(1, 5) g left join trand_join_gp on g = trand_join_gp.c1; + +explain select * from generate_series(1, 5) g full join trand_join_gp on g = trand_join_gp.c1; +select * from generate_series(1, 5) g full join trand_join_gp on g = trand_join_gp.c1; + +-- The following 3 tests are to check that segmentGeneral left join partition +-- we could redistribute the segment general-locus relation when the filter condition +-- is suitable. If we can redistributed general-locus relation, we should not +-- gather them to singleQE. +explain select * from trep_join_gp left join thash_join_gp using (c1); +select * from trep_join_gp left join thash_join_gp using (c1); + +explain select * from trep_join_gp left join trand_join_gp using (c1); +select * from trep_join_gp left join trand_join_gp using (c1); + +explain select * from trep1_join_gp join thash_join_gp using (c1); +select * from trep1_join_gp join thash_join_gp using (c1); + +drop table trep_join_gp; +drop table thash_join_gp; +drop table trand_join_gp; +drop table trep1_join_gp; + +-- select gp_debug_set_create_table_default_numsegments(3); + +reset optimizer; + +-- The following cases are to test planner join size estimation +-- so we need optimizer to be off. +-- When a partition table join other table using partition key, +-- planner should use root table's stat info instead of largest +-- partition's. +reset enable_hashjoin; +reset enable_mergejoin; +reset enable_nestloop; + +create table t_joinsize_1 (c1 int, c2 int) +partition by range (c2) +( start (0) end (5) every (1), + default partition extra ); + +create table t_joinsize_2 (c1 int, c2 int); + +create table t_joinsize_3 (c int); + +insert into t_joinsize_1 select i, i%5 from generate_series(1, 200)i; +insert into t_joinsize_1 select 1, null from generate_series(1, 1000); + +insert into t_joinsize_2 select i,i%5 from generate_series(1, 1000)i; +insert into t_joinsize_3 select * from generate_series(1, 100); + +analyze t_joinsize_1; +analyze t_joinsize_2; +analyze t_joinsize_3; + +-- the following query should not broadcast the join result of t_joinsize_1, t_joinsize_2. +explain select * from (t_joinsize_1 join t_joinsize_2 on t_joinsize_1.c2 = t_joinsize_2.c2) join t_joinsize_3 on t_joinsize_3.c = t_joinsize_1.c1; + +drop table t_joinsize_1; +drop table t_joinsize_2; +drop table t_joinsize_3; + +-- test if subquery locus is general, then +-- we should keep it general +create table t_randomly_dist_table(c int); + +-- force_explain +-- the following plan should not contain redistributed motion (for planner) +explain +select * from ( + select a from generate_series(1, 10)a + union all + select a from generate_series(1, 10)a +) t_subquery_general +join t_randomly_dist_table on t_subquery_general.a = t_randomly_dist_table.c; + +drop table t_randomly_dist_table; + + +-- test lateral join inner plan contains limit +-- we cannot pass params across motion so we +-- can only generate a plan to gather all the +-- data to singleQE. Here we create a compound +-- data type as params to pass into inner plan. +-- By doing so, if we fail to pass correct params +-- into innerplan, it will throw error because +-- of nullpointer reference. If we only use int +-- type as params, the nullpointer reference error +-- may not happen because we parse null to integer 0. + +create type mytype_for_lateral_test as (x int, y int); +create table t1_lateral_limit(a int, b int, c mytype_for_lateral_test); +create table t2_lateral_limit(a int, b int); +insert into t1_lateral_limit values (1, 1, '(1,1)'); +insert into t1_lateral_limit values (1, 2, '(2,2)'); +insert into t2_lateral_limit values (2, 2); +insert into t2_lateral_limit values (3, 3); + +explain select * from t1_lateral_limit as t1 cross join lateral +(select ((c).x+t2.b) as n from t2_lateral_limit as t2 order by n limit 1)s; + +select * from t1_lateral_limit as t1 cross join lateral +(select ((c).x+t2.b) as n from t2_lateral_limit as t2 order by n limit 1)s; + +-- Continue with the above cases, if the lateral subquery contains union all +-- and in some of its appendquerys contain limit, it may also lead to bad plan. +-- The best solution may be to walk the query to and do some static analysis +-- to find out which rel has to be gathered and materialized. But it is complicated +-- to do so and this seems less efficient. I believe in future we should do big +-- refactor to make greenplum support lateral well so now, let's just make sure +-- we will not panic. +explain (costs off) select * from t1_lateral_limit as t1 cross join lateral +((select ((c).x+t2.b) as n from t2_lateral_limit as t2 order by n limit 1) union all select 1)s; + +select * from t1_lateral_limit as t1 cross join lateral +((select ((c).x+t2.b) as n from t2_lateral_limit as t2 order by n limit 1) union all select 1)s; + +-- test lateral subquery contains group by (group-by is another place that +-- may add motions in the subquery's plan). +explain select * from t1_lateral_limit t1 cross join lateral +(select (c).x+t2.a, sum(t2.a+t2.b) from t2_lateral_limit t2 group by (c).x+t2.a)x; + +select * from t1_lateral_limit t1 cross join lateral +(select (c).x+t2.a, sum(t2.a+t2.b) from t2_lateral_limit t2 group by (c).x+t2.a)x; + +-- The following case is from Github Issue +-- https://github.com/greenplum-db/gpdb/issues/8860 +-- It is the same issue as the above test suite. +create table t_mylog_issue_8860 (myid int, log_date timestamptz ); +insert into t_mylog_issue_8860 values (1,timestamptz '2000-01-02 03:04'),(1,timestamptz '2000-01-02 03:04'-'1 hour'::interval); +insert into t_mylog_issue_8860 values (2,timestamptz '2000-01-02 03:04'),(2,timestamptz '2000-01-02 03:04'-'2 hour'::interval); + +explain select ml1.myid, log_date as first_date, ml2.next_date from t_mylog_issue_8860 ml1 +inner join lateral +(select myid, log_date as next_date + from t_mylog_issue_8860 where myid = ml1.myid and log_date > ml1.log_date order by log_date asc limit 1) ml2 +on true; + +select ml1.myid, log_date as first_date, ml2.next_date from t_mylog_issue_8860 ml1 +inner join lateral +(select myid, log_date as next_date + from t_mylog_issue_8860 where myid = ml1.myid and log_date > ml1.log_date order by log_date asc limit 1) ml2 +on true; + +-- test prefetch join qual +-- we do not handle this correct +-- the only case we need to prefetch join qual is: +-- 1. outer plan contains motion +-- 2. the join qual contains subplan that contains motion +reset client_min_messages; +set Test_print_prefetch_joinqual = true; +-- prefetch join qual is only set correct for planner +set optimizer = off; + +create table t1_test_pretch_join_qual(a int, b int, c int); +create table t2_test_pretch_join_qual(a int, b int, c int); + +-- the following plan contains redistribute motion in both inner and outer plan +-- the join qual is t1.c > t2.c, it contains no motion, should not prefetch +explain (costs off) select * from t1_test_pretch_join_qual t1 join t2_test_pretch_join_qual t2 +on t1.b = t2.b and t1.c > t2.c; + +create table t3_test_pretch_join_qual(a int, b int, c int); + +-- the following plan contains motion in both outer plan and join qual, +-- so we should prefetch join qual +explain (costs off) select * from t1_test_pretch_join_qual t1 join t2_test_pretch_join_qual t2 +on t1.b = t2.b and t1.a > any (select sum(b) from t3_test_pretch_join_qual t3 where c > t2.a); + +reset Test_print_prefetch_joinqual; +reset optimizer; + +-- Github Issue: https://github.com/greenplum-db/gpdb/issues/9733 +-- Previously in the function bring_to_outer_query and +-- bring_to_singleQE it depends on the path->param_info field +-- to determine if the path contains outerParams. This is not +-- enought. The following case would SegFault before because +-- the indexpath's orderby clause contains outerParams. +create table gist_tbl_github9733 (b box, p point, c circle); +insert into gist_tbl_github9733 +select box(point(0.05*i, 0.05*i), point(0.05*i, 0.05*i)), + point(0.05*i, 0.05*i), + circle(point(0.05*i, 0.05*i), 1.0) +from generate_series(0,10000) as i; +vacuum analyze gist_tbl_github9733; +create index gist_tbl_point_index_github9733 on gist_tbl_github9733 using gist (p); +set enable_seqscan=off; +set enable_bitmapscan=off; +explain (costs off) +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl_github9733 where p <@ bb order by p <-> bb[0] limit 2) ss; + +reset enable_seqscan; +explain (costs off) +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl_github9733 where p <@ bb order by p <-> bb[0] limit 2) ss; + +select p from + (values (box(point(0,0), point(0.5,0.5))), + (box(point(0.5,0.5), point(0.75,0.75))), + (box(point(0.8,0.8), point(1.0,1.0)))) as v(bb) +cross join lateral + (select p from gist_tbl_github9733 where p <@ bb order by p <-> bb[0] limit 2) ss; + +reset enable_bitmapscan; + +--- +--- Test that GUC enable_hashagg takes effect for SEMI join +--- +drop table if exists foo; +drop table if exists bar; + +create table foo(a int); +create table bar(b int); + +insert into foo select i from generate_series(1,10)i; +insert into bar select i from generate_series(1,1000)i; + +analyze foo; +analyze bar; + +set enable_hashagg to on; +explain (costs off) +select * from foo where exists (select 1 from bar where foo.a = bar.b); +select * from foo where exists (select 1 from bar where foo.a = bar.b); + +set enable_hashagg to off; +explain (costs off) +select * from foo where exists (select 1 from bar where foo.a = bar.b); +select * from foo where exists (select 1 from bar where foo.a = bar.b); + +reset enable_hashagg; +drop table foo; +drop table bar; + +-- Fix github issue 10012 +create table fix_param_a (i int, j int); +create table fix_param_b (i int UNIQUE, j int); +create table fix_param_c (i int, j int); + +insert into fix_param_a select i, i from generate_series(1,20)i; +insert into fix_param_b select i, i from generate_series(1,2000)i; +insert into fix_param_c select i, i from generate_series(1,2000)i; + +analyze fix_param_a; +analyze fix_param_b; +analyze fix_param_c; + +explain (costs off) +select * from fix_param_a left join fix_param_b on + fix_param_a.i = fix_param_b.i and fix_param_b.j in + (select j from fix_param_c where fix_param_b.i = fix_param_c.i) + order by 1; +select * from fix_param_a left join fix_param_b on + fix_param_a.i = fix_param_b.i and fix_param_b.j in + (select j from fix_param_c where fix_param_b.i = fix_param_c.i) + order by 1; + +-- Test targetlist contains placeholder var +-- When creating a redistributed motion with hash keys, +-- Cloudberry planner will invoke `cdbpullup_findEclassInTargetList`. +-- The following test case contains non-strict function `coalesce` +-- in the subquery at nullable-side of outerjoin and thus will +-- have PlaceHolderVar in targetlist. The case is to test if +-- function `cdbpullup_findEclassInTargetList` handles PlaceHolderVar +-- correct. +-- See github issue: https://github.com/greenplum-db/gpdb/issues/10315 +create table t_issue_10315 ( id1 int, id2 int ); + +insert into t_issue_10315 select i,i from generate_series(1, 2)i; +insert into t_issue_10315 select i,null from generate_series(1, 2)i; +insert into t_issue_10315 select null,i from generate_series(1, 2)i; + +select * from +( select coalesce( bq.id1 ) id1, coalesce ( bq.id2 ) id2 + from ( select r.id1, r.id2 from t_issue_10315 r group by r.id1, r.id2 ) bq ) t +full join ( select r.id1, r.id2 from t_issue_10315 r group by r.id1, r.id2 ) bq_all +on t.id1 = bq_all.id1 and t.id2 = bq_all.id2 +full join ( select r.id1, r.id2 from t_issue_10315 r group by r.id1, r.id2 ) tq_all +on (coalesce(t.id1) = tq_all.id1 and t.id2 = tq_all.id2) ; + +drop table t_issue_10315; diff --git a/src/test/singlenode_regress/sql/join_hash.sql b/src/test/singlenode_regress/sql/join_hash.sql new file mode 100644 index 00000000000..18579d8460a --- /dev/null +++ b/src/test/singlenode_regress/sql/join_hash.sql @@ -0,0 +1,585 @@ +-- +-- exercises for the hash join code +-- +-- GPDB: Cloudberry doesn't support parallel scans at the moment, so all the upstream +-- parallelism tests don't really apply. We still run the tests, but they won't +-- exercise parallelism. + +begin; + +-- GPDB requires allow_system_table_mods=on to modify pg_class.reltuples. +set allow_system_table_mods=on; + +set local min_parallel_table_scan_size = 0; +set local parallel_setup_cost = 0; +set local enable_hashjoin = on; + +-- Extract bucket and batch counts from an explain analyze plan. In +-- general we can't make assertions about how many batches (or +-- buckets) will be required because it can vary, but we can in some +-- special cases and we can check for growth. +create or replace function find_hash(node json) +returns json language plpgsql +as +$$ +declare + x json; + child json; +begin + if node->>'Node Type' = 'Hash' then + return node; + else + for child in select json_array_elements(node->'Plans') + loop + x := find_hash(child); + if x is not null then + return x; + end if; + end loop; + return null; + end if; +end; +$$; +create or replace function hash_join_batches(query text) +returns table (original int, final int) language plpgsql +as +$$ +declare + whole_plan json; + hash_node json; +begin + for whole_plan in + execute 'explain (analyze, format ''json'') ' || query + loop + hash_node := find_hash(json_extract_path(whole_plan, '0', 'Plan')); + original := hash_node->>'Original Hash Batches'; + final := hash_node->>'Hash Batches'; + return next; + end loop; +end; +$$; + +-- Make a simple relation with well distributed keys and correctly +-- estimated size. +create table simple as + select generate_series(1, 20000) AS id, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; +alter table simple set (parallel_workers = 2); +analyze simple; + +-- Make a relation whose size we will under-estimate. We want stats +-- to say 1000 rows, but actually there are 20,000 rows. +create table bigger_than_it_looks as + select generate_series(1, 20000) as id, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; +alter table bigger_than_it_looks set (autovacuum_enabled = 'false'); +alter table bigger_than_it_looks set (parallel_workers = 2); +analyze bigger_than_it_looks; +update pg_class set reltuples = 1000 where relname = 'bigger_than_it_looks'; + +-- Make a relation whose size we underestimate and that also has a +-- kind of skew that breaks our batching scheme. We want stats to say +-- 2 rows, but actually there are 20,000 rows with the same key. +create table extremely_skewed (id int, t text); +alter table extremely_skewed set (autovacuum_enabled = 'false'); +alter table extremely_skewed set (parallel_workers = 2); +analyze extremely_skewed; +insert into extremely_skewed + select 42 as id, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + from generate_series(1, 20000); +update pg_class + set reltuples = 2, relpages = pg_relation_size('extremely_skewed') / 8192 + where relname = 'extremely_skewed'; + +-- Make a relation with a couple of enormous tuples. +create table wide as select generate_series(1, 2) as id, rpad('', 320000, 'x') as t; +alter table wide set (parallel_workers = 2); +ANALYZE wide; + +-- The "optimal" case: the hash table fits in memory; we plan for 1 +-- batch, we stick to that number, and peak memory usage stays within +-- our work_mem budget + +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +set local work_mem = '4MB'; +explain (costs off) + select count(*) from simple r join simple s using (id); +select count(*) from simple r join simple s using (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); +rollback to settings; + +-- parallel with parallel-oblivious hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '4MB'; +set local enable_parallel_hash = off; +explain (costs off) + select count(*) from simple r join simple s using (id); +select count(*) from simple r join simple s using (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); +rollback to settings; + +-- parallel with parallel-aware hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '4MB'; +set local enable_parallel_hash = on; +explain (costs off) + select count(*) from simple r join simple s using (id); +select count(*) from simple r join simple s using (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); +rollback to settings; + +-- The "good" case: batches required, but we plan the right number; we +-- plan for some number of batches, and we stick to that number, and +-- peak memory usage says within our work_mem budget + +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +set local work_mem = '128kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) from simple r join simple s using (id); +select count(*) from simple r join simple s using (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); +rollback to settings; + +-- parallel with parallel-oblivious hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '128kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = off; +explain (costs off) + select count(*) from simple r join simple s using (id); +select count(*) from simple r join simple s using (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); +rollback to settings; + +-- parallel with parallel-aware hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '192kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = on; +explain (costs off) + select count(*) from simple r join simple s using (id); +select count(*) from simple r join simple s using (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); +rollback to settings; + +-- The "bad" case: during execution we need to increase number of +-- batches; in this case we plan for 1 batch, and increase at least a +-- couple of times, and peak memory usage stays within our work_mem +-- budget + +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +set local work_mem = '128kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); +select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); +$$); +rollback to settings; + +-- parallel with parallel-oblivious hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '128kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = off; +explain (costs off) + select count(*) from simple r join bigger_than_it_looks s using (id); +select count(*) from simple r join bigger_than_it_looks s using (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join bigger_than_it_looks s using (id); +$$); +rollback to settings; + +-- parallel with parallel-aware hash join +savepoint settings; +set local max_parallel_workers_per_gather = 1; +set local work_mem = '192kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = on; +explain (costs off) + select count(*) from simple r join bigger_than_it_looks s using (id); +select count(*) from simple r join bigger_than_it_looks s using (id); +select original > 1 as initially_multibatch, final > original as increased_batches + from hash_join_batches( +$$ + select count(*) from simple r join bigger_than_it_looks s using (id); +$$); +rollback to settings; + +-- The "ugly" case: increasing the number of batches during execution +-- doesn't help, so stop trying to fit in work_mem and hope for the +-- best; in this case we plan for 1 batch, increases just once and +-- then stop increasing because that didn't help at all, so we blow +-- right through the work_mem budget and hope for the best... + +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +set local work_mem = '128kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) from simple r join extremely_skewed s using (id); +select count(*) from simple r join extremely_skewed s using (id); +select * from hash_join_batches( +$$ + select count(*) from simple r join extremely_skewed s using (id); +$$); +rollback to settings; + +-- parallel with parallel-oblivious hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '128kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = off; +explain (costs off) + select count(*) from simple r join extremely_skewed s using (id); +select count(*) from simple r join extremely_skewed s using (id); +select * from hash_join_batches( +$$ + select count(*) from simple r join extremely_skewed s using (id); +$$); +rollback to settings; + +-- parallel with parallel-aware hash join +savepoint settings; +set local max_parallel_workers_per_gather = 1; +set local work_mem = '128kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +set local enable_parallel_hash = on; +explain (costs off) + select count(*) from simple r join extremely_skewed s using (id); +select count(*) from simple r join extremely_skewed s using (id); +select * from hash_join_batches( +$$ + select count(*) from simple r join extremely_skewed s using (id); +$$); +rollback to settings; + +-- A couple of other hash join tests unrelated to work_mem management. + +-- Check that EXPLAIN ANALYZE has data even if the leader doesn't participate +savepoint settings; +set local max_parallel_workers_per_gather = 2; +set local work_mem = '4MB'; +set local parallel_leader_participation = off; +select * from hash_join_batches( +$$ + select count(*) from simple r join simple s using (id); +$$); +rollback to settings; + +-- Exercise rescans. We'll turn off parallel_leader_participation so +-- that we can check that instrumentation comes back correctly. + +create table join_foo as select generate_series(1, 3) as id, 'xxxxx'::text as t; +analyze join_foo; +alter table join_foo set (parallel_workers = 0); +create table join_bar as select generate_series(1, 20000) as id, 'xxxxx'::text as t; +analyze join_bar; +alter table join_bar set (parallel_workers = 2); + +-- multi-batch with rescan, parallel-oblivious +savepoint settings; +set enable_parallel_hash = off; +set parallel_leader_participation = off; +set min_parallel_table_scan_size = 0; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +set enable_material = off; +set enable_mergejoin = off; +set work_mem = '64kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +select final > 1 as multibatch + from hash_join_batches( +$$ + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +$$); +rollback to settings; + +-- single-batch with rescan, parallel-oblivious +savepoint settings; +set enable_parallel_hash = off; +set parallel_leader_participation = off; +set min_parallel_table_scan_size = 0; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +set enable_material = off; +set enable_mergejoin = off; +set work_mem = '4MB'; +explain (costs off) + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +select final > 1 as multibatch + from hash_join_batches( +$$ + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +$$); +rollback to settings; + +-- multi-batch with rescan, parallel-aware +savepoint settings; +set enable_parallel_hash = on; +set parallel_leader_participation = off; +set min_parallel_table_scan_size = 0; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +set enable_material = off; +set enable_mergejoin = off; +set work_mem = '64kB'; +set local statement_mem = '1000kB'; -- GPDB uses statement_mem instead of work_mem +explain (costs off) + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +select final > 1 as multibatch + from hash_join_batches( +$$ + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +$$); +rollback to settings; + +-- single-batch with rescan, parallel-aware +savepoint settings; +set enable_parallel_hash = on; +set parallel_leader_participation = off; +set min_parallel_table_scan_size = 0; +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set max_parallel_workers_per_gather = 2; +set enable_material = off; +set enable_mergejoin = off; +set work_mem = '4MB'; +explain (costs off) + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +select final > 1 as multibatch + from hash_join_batches( +$$ + select count(*) from join_foo + left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss + on join_foo.id < ss.id + 1 and join_foo.id > ss.id - 1; +$$); +rollback to settings; + +-- A full outer join where every record is matched. + +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +explain (costs off) + select count(*) from simple r full outer join simple s using (id); +select count(*) from simple r full outer join simple s using (id); +rollback to settings; + +-- parallelism not possible with parallel-oblivious outer hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +explain (costs off) + select count(*) from simple r full outer join simple s using (id); +select count(*) from simple r full outer join simple s using (id); +rollback to settings; + +-- An full outer join where every record is not matched. + +-- non-parallel +savepoint settings; +set local max_parallel_workers_per_gather = 0; +explain (costs off) + select count(*) from simple r full outer join simple s on (r.id = 0 - s.id); +select count(*) from simple r full outer join simple s on (r.id = 0 - s.id); +rollback to settings; + +-- parallelism not possible with parallel-oblivious outer hash join +savepoint settings; +set local max_parallel_workers_per_gather = 2; +explain (costs off) + select count(*) from simple r full outer join simple s on (r.id = 0 - s.id); +select count(*) from simple r full outer join simple s on (r.id = 0 - s.id); +rollback to settings; + +-- exercise special code paths for huge tuples (note use of non-strict +-- expression and left join required to get the detoasted tuple into +-- the hash table) + +-- parallel with parallel-aware hash join (hits ExecParallelHashLoadTuple and +-- sts_puttuple oversized tuple cases because it's multi-batch) + +-- GPDB_12_MERGE_FIXME: I (Heikki) could not cajole the planner to create a +-- plan like in upstream. I accepted the plan you get, but now this doesn't +-- exercise the special code path it's supposed to. + +savepoint settings; +set max_parallel_workers_per_gather = 2; +set enable_parallel_hash = on; +set work_mem = '128kB'; +insert into wide select generate_series(3, 100) as id, rpad('', 320000, 'x') as t; +explain (costs off) + select length(max(s.t)) + from wide left join (select id, coalesce(t, '') || '' as t from wide) s using (id); +select length(max(s.t)) +from wide left join (select id, coalesce(t, '') || '' as t from wide) s using (id); +select final > 1 as multibatch + from hash_join_batches( +$$ + select length(max(s.t)) + from wide left join (select id, coalesce(t, '') || '' as t from wide) s using (id); +$$); +rollback to settings; + +-- If virtualbuckets is much larger than innerndistinct, and +-- outerndistinct is much larger than innerndistinct. Then most +-- tuples of the outer table will match the empty bucket. So when +-- we calculate the cost of traversing the bucket, we need to ignore +-- the tuple matching empty bucket. +savepoint settings; +set max_parallel_workers_per_gather = 0; +create table join_hash_t_small(a int); +create table join_hash_t_big(b int); + +insert into join_hash_t_small select i%100 from generate_series(0, 3000)i; +insert into join_hash_t_big select i%100000 from generate_series(1, 100000)i ; + +analyze join_hash_t_small; +analyze join_hash_t_big; + +explain (costs off) select * from join_hash_t_small, join_hash_t_big where a = b; +rollback to settings; + +rollback; + + +-- Verify that hash key expressions reference the correct +-- nodes. Hashjoin's hashkeys need to reference its outer plan, Hash's +-- need to reference Hash's outer plan (which is below HashJoin's +-- inner plan). It's not trivial to verify that the references are +-- correct (we don't display the hashkeys themselves), but if the +-- hashkeys contain subplan references, those will be displayed. Force +-- subplans to appear just about everywhere. +-- +-- Bug report: +-- https://www.postgresql.org/message-id/CAPpHfdvGVegF_TKKRiBrSmatJL2dR9uwFCuR%2BteQ_8tEXU8mxg%40mail.gmail.com +-- +BEGIN; +SET LOCAL enable_sort = OFF; -- avoid mergejoins +SET LOCAL from_collapse_limit = 1; -- allows easy changing of join order + +CREATE TABLE hjtest_1 (a text, b int, id int, c bool); +CREATE TABLE hjtest_2 (a bool, id int, b text, c int); + +INSERT INTO hjtest_1(a, b, id, c) VALUES ('text', 2, 1, false); -- matches +INSERT INTO hjtest_1(a, b, id, c) VALUES ('text', 1, 2, false); -- fails id join condition +INSERT INTO hjtest_1(a, b, id, c) VALUES ('text', 20, 1, false); -- fails < 50 +INSERT INTO hjtest_1(a, b, id, c) VALUES ('text', 1, 1, false); -- fails (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 1, 'another', 2); -- matches +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 3, 'another', 7); -- fails id join condition +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 1, 'another', 90); -- fails < 55 +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 1, 'another', 3); -- fails (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) +INSERT INTO hjtest_2(a, id, b, c) VALUES (true, 1, 'text', 1); -- fails hjtest_1.a <> hjtest_2.b; + +EXPLAIN (COSTS OFF, VERBOSE) +SELECT hjtest_1.a a1, hjtest_2.a a2,hjtest_1.tableoid::regclass t1, hjtest_2.tableoid::regclass t2 +FROM hjtest_1, hjtest_2 +WHERE + hjtest_1.id = (SELECT 1 WHERE hjtest_2.id = 1) + AND (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + AND (SELECT hjtest_1.b * 5) < 50 + AND (SELECT hjtest_2.c * 5) < 55 + AND hjtest_1.a <> hjtest_2.b; + +SELECT hjtest_1.a a1, hjtest_2.a a2,hjtest_1.tableoid::regclass t1, hjtest_2.tableoid::regclass t2 +FROM hjtest_1, hjtest_2 +WHERE + hjtest_1.id = (SELECT 1 WHERE hjtest_2.id = 1) + AND (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + AND (SELECT hjtest_1.b * 5) < 50 + AND (SELECT hjtest_2.c * 5) < 55 + AND hjtest_1.a <> hjtest_2.b; + +EXPLAIN (COSTS OFF, VERBOSE) +SELECT hjtest_1.a a1, hjtest_2.a a2,hjtest_1.tableoid::regclass t1, hjtest_2.tableoid::regclass t2 +FROM hjtest_2, hjtest_1 +WHERE + hjtest_1.id = (SELECT 1 WHERE hjtest_2.id = 1) + AND (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + AND (SELECT hjtest_1.b * 5) < 50 + AND (SELECT hjtest_2.c * 5) < 55 + AND hjtest_1.a <> hjtest_2.b; + +SELECT hjtest_1.a a1, hjtest_2.a a2,hjtest_1.tableoid::regclass t1, hjtest_2.tableoid::regclass t2 +FROM hjtest_2, hjtest_1 +WHERE + hjtest_1.id = (SELECT 1 WHERE hjtest_2.id = 1) + AND (SELECT hjtest_1.b * 5) = (SELECT hjtest_2.c*5) + AND (SELECT hjtest_1.b * 5) < 50 + AND (SELECT hjtest_2.c * 5) < 55 + AND hjtest_1.a <> hjtest_2.b; + +ROLLBACK; diff --git a/src/test/singlenode_regress/sql/json.sql b/src/test/singlenode_regress/sql/json.sql new file mode 100644 index 00000000000..e366c6f51b6 --- /dev/null +++ b/src/test/singlenode_regress/sql/json.sql @@ -0,0 +1,852 @@ +-- Strings. +SELECT '""'::json; -- OK. +SELECT $$''$$::json; -- ERROR, single quotes are not allowed +SELECT '"abc"'::json; -- OK +SELECT '"abc'::json; -- ERROR, quotes not closed +SELECT '"abc +def"'::json; -- ERROR, unescaped newline in string constant +SELECT '"\n\"\\"'::json; -- OK, legal escapes +SELECT '"\v"'::json; -- ERROR, not a valid JSON escape +-- see json_encoding test for input with unicode escapes + +-- Numbers. +SELECT '1'::json; -- OK +SELECT '0'::json; -- OK +SELECT '01'::json; -- ERROR, not valid according to JSON spec +SELECT '0.1'::json; -- OK +SELECT '9223372036854775808'::json; -- OK, even though it's too large for int8 +SELECT '1e100'::json; -- OK +SELECT '1.3e100'::json; -- OK +SELECT '1f2'::json; -- ERROR +SELECT '0.x1'::json; -- ERROR +SELECT '1.3ex100'::json; -- ERROR + +-- Arrays. +SELECT '[]'::json; -- OK +SELECT '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'::json; -- OK +SELECT '[1,2]'::json; -- OK +SELECT '[1,2,]'::json; -- ERROR, trailing comma +SELECT '[1,2'::json; -- ERROR, no closing bracket +SELECT '[1,[2]'::json; -- ERROR, no closing bracket + +-- Objects. +SELECT '{}'::json; -- OK +SELECT '{"abc"}'::json; -- ERROR, no value +SELECT '{"abc":1}'::json; -- OK +SELECT '{1:"abc"}'::json; -- ERROR, keys must be strings +SELECT '{"abc",1}'::json; -- ERROR, wrong separator +SELECT '{"abc"=1}'::json; -- ERROR, totally wrong separator +SELECT '{"abc"::1}'::json; -- ERROR, another wrong separator +SELECT '{"abc":1,"def":2,"ghi":[3,4],"hij":{"klm":5,"nop":[6]}}'::json; -- OK +SELECT '{"abc":1:2}'::json; -- ERROR, colon in wrong spot +SELECT '{"abc":1,3}'::json; -- ERROR, no value + +-- Recursion. +SET max_stack_depth = '100kB'; +SELECT repeat('[', 10000)::json; +SELECT repeat('{"a":', 10000)::json; +RESET max_stack_depth; + +-- Miscellaneous stuff. +SELECT 'true'::json; -- OK +SELECT 'false'::json; -- OK +SELECT 'null'::json; -- OK +SELECT ' true '::json; -- OK, even with extra whitespace +SELECT 'true false'::json; -- ERROR, too many values +SELECT 'true, false'::json; -- ERROR, too many values +SELECT 'truf'::json; -- ERROR, not a keyword +SELECT 'trues'::json; -- ERROR, not a keyword +SELECT ''::json; -- ERROR, no value +SELECT ' '::json; -- ERROR, no value + +-- Multi-line JSON input to check ERROR reporting +SELECT '{ + "one": 1, + "two":"two", + "three": + true}'::json; -- OK +SELECT '{ + "one": 1, + "two":,"two", -- ERROR extraneous comma before field "two" + "three": + true}'::json; +SELECT '{ + "one": 1, + "two":"two", + "averyveryveryveryveryveryveryveryveryverylongfieldname":}'::json; +-- ERROR missing value for last field + +--constructors +-- array_to_json + +SELECT array_to_json(array(select 1 as a)); +SELECT array_to_json(array_agg(q),false) from (select x as b, x * 2 as c from generate_series(1,3) x) q; +SELECT array_to_json(array_agg(q),true) from (select x as b, x * 2 as c from generate_series(1,3) x) q; +SELECT array_to_json(array_agg(q),false) + FROM ( SELECT $$a$$ || x AS b, y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; +SELECT array_to_json(array_agg(x),false) from generate_series(5,10) x; +SELECT array_to_json('{{1,5},{99,100}}'::int[]); + +-- row_to_json +SELECT row_to_json(row(1,'foo')); + +SELECT row_to_json(q) +FROM (SELECT $$a$$ || x AS b, + y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + +SELECT row_to_json(q,true) +FROM (SELECT $$a$$ || x AS b, + y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + +CREATE TEMP TABLE rows AS +SELECT x, 'txt' || x as y +FROM generate_series(1,3) AS x; + +SELECT row_to_json(q,true) +FROM rows q; + +SELECT row_to_json(row((select array_agg(x) as d from generate_series(5,10) x)),false); + +-- anyarray column + +analyze rows; + +select attname, to_json(histogram_bounds) histogram_bounds +from pg_stats +where tablename = 'rows' and + schemaname = pg_my_temp_schema()::regnamespace::text +order by 1; + +-- to_json, timestamps + +select to_json(timestamp '2014-05-28 12:22:35.614298'); + +BEGIN; +SET LOCAL TIME ZONE 10.5; +select to_json(timestamptz '2014-05-28 12:22:35.614298-04'); +SET LOCAL TIME ZONE -8; +select to_json(timestamptz '2014-05-28 12:22:35.614298-04'); +COMMIT; + +select to_json(date '2014-05-28'); + +select to_json(date 'Infinity'); +select to_json(date '-Infinity'); +select to_json(timestamp 'Infinity'); +select to_json(timestamp '-Infinity'); +select to_json(timestamptz 'Infinity'); +select to_json(timestamptz '-Infinity'); + +--json_agg + +SELECT json_agg(q) + FROM ( SELECT $$a$$ || x AS b, y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + +SELECT json_agg(q ORDER BY x, y) + FROM rows q; + +UPDATE rows SET x = NULL WHERE x = 1; + +SELECT json_agg(q ORDER BY x NULLS FIRST, y) + FROM rows q; + +-- non-numeric output +SELECT row_to_json(q) +FROM (SELECT 'NaN'::float8 AS "float8field") q; + +SELECT row_to_json(q) +FROM (SELECT 'Infinity'::float8 AS "float8field") q; + +SELECT row_to_json(q) +FROM (SELECT '-Infinity'::float8 AS "float8field") q; + +-- json input +SELECT row_to_json(q) +FROM (SELECT '{"a":1,"b": [2,3,4,"d","e","f"],"c":{"p":1,"q":2}}'::json AS "jsonfield") q; + + +-- json extraction functions + +CREATE TEMP TABLE test_json ( + json_type text, + test_json json +); + +INSERT INTO test_json VALUES +('scalar','"a scalar"'), +('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'), +('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}'); + +SELECT test_json -> 'x' +FROM test_json +WHERE json_type = 'scalar'; + +SELECT test_json -> 'x' +FROM test_json +WHERE json_type = 'array'; + +SELECT test_json -> 'x' +FROM test_json +WHERE json_type = 'object'; + +SELECT test_json->'field2' +FROM test_json +WHERE json_type = 'object'; + +SELECT test_json->>'field2' +FROM test_json +WHERE json_type = 'object'; + +SELECT test_json -> 2 +FROM test_json +WHERE json_type = 'scalar'; + +SELECT test_json -> 2 +FROM test_json +WHERE json_type = 'array'; + +SELECT test_json -> -1 +FROM test_json +WHERE json_type = 'array'; + +SELECT test_json -> 2 +FROM test_json +WHERE json_type = 'object'; + +SELECT test_json->>2 +FROM test_json +WHERE json_type = 'array'; + +SELECT test_json ->> 6 FROM test_json WHERE json_type = 'array'; +SELECT test_json ->> 7 FROM test_json WHERE json_type = 'array'; + +SELECT test_json ->> 'field4' FROM test_json WHERE json_type = 'object'; +SELECT test_json ->> 'field5' FROM test_json WHERE json_type = 'object'; +SELECT test_json ->> 'field6' FROM test_json WHERE json_type = 'object'; + +SELECT json_object_keys(test_json) +FROM test_json +WHERE json_type = 'scalar'; + +SELECT json_object_keys(test_json) +FROM test_json +WHERE json_type = 'array'; + +SELECT json_object_keys(test_json) +FROM test_json +WHERE json_type = 'object'; + +-- test extending object_keys resultset - initial resultset size is 256 + +select count(*) from + (select json_object_keys(json_object(array_agg(g))) + from (select unnest(array['f'||n,n::text])as g + from generate_series(1,300) as n) x ) y; + +-- nulls + +select (test_json->'field3') is null as expect_false +from test_json +where json_type = 'object'; + +select (test_json->>'field3') is null as expect_true +from test_json +where json_type = 'object'; + +select (test_json->3) is null as expect_false +from test_json +where json_type = 'array'; + +select (test_json->>3) is null as expect_true +from test_json +where json_type = 'array'; + +-- corner cases + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::text; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> null::int; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> -1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json -> ''; +select '[{"b": "c"}, {"b": "cc"}]'::json -> 1; +select '[{"b": "c"}, {"b": "cc"}]'::json -> 3; +select '[{"b": "c"}, {"b": "cc"}]'::json -> 'z'; +select '{"a": "c", "b": null}'::json -> 'b'; +select '"foo"'::json -> 1; +select '"foo"'::json -> 'z'; + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::text; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> null::int; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json ->> ''; +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 1; +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 3; +select '[{"b": "c"}, {"b": "cc"}]'::json ->> 'z'; +select '{"a": "c", "b": null}'::json ->> 'b'; +select '"foo"'::json ->> 1; +select '"foo"'::json ->> 'z'; + +-- array length + +SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); + +SELECT json_array_length('[]'); + +SELECT json_array_length('{"f1":1,"f2":[5,6]}'); + +SELECT json_array_length('4'); + +-- each + +select json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); +select * from json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + +select json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}'); +select * from json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; + +-- extract_path, extract_path_as_text + +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); +select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); +select json_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); +select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); +select json_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + +-- extract_path nulls + +select json_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_false; +select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') is null as expect_true; +select json_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_false; +select json_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') is null as expect_true; + +-- extract_path operators + +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f4','f6']; +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2']; +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','0']; +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>array['f2','1']; + +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f4','f6']; +select '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2']; +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','0']; +select '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::json#>>array['f2','1']; + +-- corner cases for same +select '{"a": {"b":{"c": "foo"}}}'::json #> '{}'; +select '[1,2,3]'::json #> '{}'; +select '"foo"'::json #> '{}'; +select '42'::json #> '{}'; +select 'null'::json #> '{}'; +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a']; +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', null]; +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a', '']; +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b']; +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c']; +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','b','c','d']; +select '{"a": {"b":{"c": "foo"}}}'::json #> array['a','z','c']; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','1','b']; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #> array['a','z','b']; +select '[{"b": "c"}, {"b": "cc"}]'::json #> array['1','b']; +select '[{"b": "c"}, {"b": "cc"}]'::json #> array['z','b']; +select '[{"b": "c"}, {"b": null}]'::json #> array['1','b']; +select '"foo"'::json #> array['z']; +select '42'::json #> array['f2']; +select '42'::json #> array['0']; + +select '{"a": {"b":{"c": "foo"}}}'::json #>> '{}'; +select '[1,2,3]'::json #>> '{}'; +select '"foo"'::json #>> '{}'; +select '42'::json #>> '{}'; +select 'null'::json #>> '{}'; +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a']; +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', null]; +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a', '']; +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b']; +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c']; +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','b','c','d']; +select '{"a": {"b":{"c": "foo"}}}'::json #>> array['a','z','c']; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','1','b']; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::json #>> array['a','z','b']; +select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['1','b']; +select '[{"b": "c"}, {"b": "cc"}]'::json #>> array['z','b']; +select '[{"b": "c"}, {"b": null}]'::json #>> array['1','b']; +select '"foo"'::json #>> array['z']; +select '42'::json #>> array['f2']; +select '42'::json #>> array['0']; + +-- array_elements + +select json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); +select * from json_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; +select json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); +select * from json_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; + +-- populate_record +create type jpop as (a text, b int, c timestamp); + +CREATE DOMAIN js_int_not_null AS int NOT NULL; +CREATE DOMAIN js_int_array_1d AS int[] CHECK(array_length(VALUE, 1) = 3); +CREATE DOMAIN js_int_array_2d AS int[][] CHECK(array_length(VALUE, 2) = 3); + +create type j_unordered_pair as (x int, y int); +create domain j_ordered_pair as j_unordered_pair check((value).x <= (value).y); + +CREATE TYPE jsrec AS ( + i int, + ia _int4, + ia1 int[], + ia2 int[][], + ia3 int[][][], + ia1d js_int_array_1d, + ia2d js_int_array_2d, + t text, + ta text[], + c char(10), + ca char(10)[], + ts timestamp, + js json, + jsb jsonb, + jsa json[], + rec jpop, + reca jpop[] +); + +CREATE TYPE jsrec_i_not_null AS ( + i js_int_not_null +); + +select * from json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}') q; +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":"blurfl","x":43.2}') q; + +select * from json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}') q; +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":"blurfl","x":43.2}') q; + +select * from json_populate_record(null::jpop,'{"a":[100,200,false],"x":43.2}') q; +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"a":[100,200,false],"x":43.2}') q; +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{"c":[100,200,false],"x":43.2}') q; + +select * from json_populate_record(row('x',3,'2012-12-31 15:30:56')::jpop,'{}') q; + +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"x": 43.2}') q; +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"i": null}') q; +SELECT i FROM json_populate_record(NULL::jsrec_i_not_null, '{"i": 12345}') q; + +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": null}') q; +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": 123}') q; +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [1, "2", null, 4]}') q; +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1, 2], [3, 4]]}') q; +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1], 2]}') q; +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": [[1], [2, 3]]}') q; +SELECT ia FROM json_populate_record(NULL::jsrec, '{"ia": "{1,2,3}"}') q; + +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": null}') q; +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": 123}') q; +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": [1, "2", null, 4]}') q; +SELECT ia1 FROM json_populate_record(NULL::jsrec, '{"ia1": [[1, 2, 3]]}') q; + +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": null}') q; +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": 123}') q; +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": [1, "2", null, 4]}') q; +SELECT ia1d FROM json_populate_record(NULL::jsrec, '{"ia1d": [1, "2", null]}') q; + +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [1, "2", null, 4]}') q; +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], [null, 4]]}') q; +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[], []]}') q; +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], [3]]}') q; +SELECT ia2 FROM json_populate_record(NULL::jsrec, '{"ia2": [[1, 2], 3, 4]}') q; + +SELECT ia2d FROM json_populate_record(NULL::jsrec, '{"ia2d": [[1, "2"], [null, 4]]}') q; +SELECT ia2d FROM json_populate_record(NULL::jsrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q; + +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [1, "2", null, 4]}') q; +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [[1, 2], [null, 4]]}') q; +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q; +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q; +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q; +SELECT ia3 FROM json_populate_record(NULL::jsrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q; + +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": null}') q; +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": 123}') q; +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": [1, "2", null, 4]}') q; +SELECT ta FROM json_populate_record(NULL::jsrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q; + +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": null}') q; +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaa"}') q; +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaaaaaaaaa"}') q; +SELECT c FROM json_populate_record(NULL::jsrec, '{"c": "aaaaaaaaaaaaa"}') q; + +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": null}') q; +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": 123}') q; +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": [1, "2", null, 4]}') q; +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q; +SELECT ca FROM json_populate_record(NULL::jsrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q; + +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": null}') q; +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": true}') q; +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": 123.45}') q; +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": "123.45"}') q; +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": "abc"}') q; +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": [123, "123", null, {"key": "value"}]}') q; +SELECT js FROM json_populate_record(NULL::jsrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q; + +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": null}') q; +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": true}') q; +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": 123.45}') q; +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": "123.45"}') q; +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": "abc"}') q; +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q; +SELECT jsb FROM json_populate_record(NULL::jsrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q; + +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": null}') q; +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": 123}') q; +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": [1, "2", null, 4]}') q; +SELECT jsa FROM json_populate_record(NULL::jsrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q; + +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": 123}') q; +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": [1, 2]}') q; +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q; +SELECT rec FROM json_populate_record(NULL::jsrec, '{"rec": "(abc,42,01.02.2003)"}') q; + +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": 123}') q; +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": [1, 2]}') q; +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q; +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": ["(abc,42,01.02.2003)"]}') q; +SELECT reca FROM json_populate_record(NULL::jsrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q; + +SELECT rec FROM json_populate_record( + row(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + row('x',3,'2012-12-31 15:30:56')::jpop,NULL)::jsrec, + '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}' +) q; + +-- anonymous record type +SELECT json_populate_record(null::record, '{"x": 0, "y": 1}'); +SELECT json_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); +SELECT * FROM + json_populate_record(null::record, '{"x": 776}') AS (x int, y int); + +-- composite domain +SELECT json_populate_record(null::j_ordered_pair, '{"x": 0, "y": 1}'); +SELECT json_populate_record(row(1,2)::j_ordered_pair, '{"x": 0}'); +SELECT json_populate_record(row(1,2)::j_ordered_pair, '{"x": 1, "y": 0}'); + +-- populate_recordset + +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + +create type jpop2 as (a int, b json, c int, d int); +select * from json_populate_recordset(null::jpop2, '[{"a":2,"c":3,"b":{"z":4},"d":6}]') q; + +select * from json_populate_recordset(null::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +select * from json_populate_recordset(row('def',99,null)::jpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + +-- anonymous record type +SELECT json_populate_recordset(null::record, '[{"x": 0, "y": 1}]'); +SELECT json_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]'); +SELECT i, json_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]') +FROM (VALUES (1),(2)) v(i); +SELECT * FROM + json_populate_recordset(null::record, '[{"x": 776}]') AS (x int, y int); + +-- empty array is a corner case +SELECT json_populate_recordset(null::record, '[]'); +SELECT json_populate_recordset(row(1,2), '[]'); +SELECT * FROM json_populate_recordset(NULL::jpop,'[]') q; +SELECT * FROM + json_populate_recordset(null::record, '[]') AS (x int, y int); + +-- composite domain +SELECT json_populate_recordset(null::j_ordered_pair, '[{"x": 0, "y": 1}]'); +SELECT json_populate_recordset(row(1,2)::j_ordered_pair, '[{"x": 0}, {"y": 3}]'); +SELECT json_populate_recordset(row(1,2)::j_ordered_pair, '[{"x": 1, "y": 0}]'); + +-- negative cases where the wrong record type is supplied +select * from json_populate_recordset(row(0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +select * from json_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +select * from json_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +select * from json_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text); + +-- test type info caching in json_populate_record() +CREATE TEMP TABLE jspoptest (js json); + +INSERT INTO jspoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::json +FROM generate_series(1, 3); + +SELECT (json_populate_record(NULL::jsrec, js)).* FROM jspoptest; + +DROP TYPE jsrec; +DROP TYPE jsrec_i_not_null; +DROP DOMAIN js_int_not_null; +DROP DOMAIN js_int_array_1d; +DROP DOMAIN js_int_array_2d; +DROP DOMAIN j_ordered_pair; +DROP TYPE j_unordered_pair; + +--json_typeof() function +select value, json_typeof(value) + from (values (json '123.4'), + (json '-1'), + (json '"foo"'), + (json 'true'), + (json 'false'), + (json 'null'), + (json '[1, 2, 3]'), + (json '[]'), + (json '{"x":"foo", "y":123}'), + (json '{}'), + (NULL::json)) + as data(value); + +-- json_build_array, json_build_object, json_object_agg + +SELECT json_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); +SELECT json_build_array('a', NULL); -- ok +SELECT json_build_array(VARIADIC NULL::text[]); -- ok +SELECT json_build_array(VARIADIC '{}'::text[]); -- ok +SELECT json_build_array(VARIADIC '{a,b,c}'::text[]); -- ok +SELECT json_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok +SELECT json_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok +SELECT json_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok +SELECT json_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + +SELECT json_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + +SELECT json_build_object( + 'a', json_build_object('b',false,'c',99), + 'd', json_build_object('e',array[9,8,7]::int[], + 'f', (select row_to_json(r) from ( select relkind, oid::regclass as name from pg_class where relname = 'pg_class') r))); +SELECT json_build_object('{a,b,c}'::text[]); -- error +SELECT json_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array +SELECT json_build_object('a', 'b', 'c'); -- error +SELECT json_build_object(NULL, 'a'); -- error, key cannot be NULL +SELECT json_build_object('a', NULL); -- ok +SELECT json_build_object(VARIADIC NULL::text[]); -- ok +SELECT json_build_object(VARIADIC '{}'::text[]); -- ok +SELECT json_build_object(VARIADIC '{a,b,c}'::text[]); -- error +SELECT json_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok +SELECT json_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL +SELECT json_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok +SELECT json_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok +SELECT json_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + +-- empty objects/arrays +SELECT json_build_array(); + +SELECT json_build_object(); + +-- make sure keys are quoted +SELECT json_build_object(1,2); + +-- keys must be scalar and not null +SELECT json_build_object(null,2); + +SELECT json_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; + +SELECT json_build_object(json '{"a":1,"b":2}', 3); + +SELECT json_build_object('{1,2,3}'::int[], 3); + +CREATE TEMP TABLE foo (serial_num int, name text, type text); +INSERT INTO foo VALUES (847001,'t15','GE1043'); +INSERT INTO foo VALUES (847002,'t16','GE1043'); +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); + +SELECT json_build_object('turbines',json_object_agg(serial_num,json_build_object('name',name,'type',type))) +FROM foo; + +SELECT json_object_agg(name, type) FROM foo; + +INSERT INTO foo VALUES (999999, NULL, 'bar'); +SELECT json_object_agg(name, type) FROM foo; + +-- json_object + +-- empty object, one dimension +SELECT json_object('{}'); + +-- empty object, two dimensions +SELECT json_object('{}', '{}'); + +-- one dimension +SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); + +-- same but with two dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); + +-- odd number error +SELECT json_object('{a,b,c}'); + +-- one column error +SELECT json_object('{{a},{b}}'); + +-- too many columns error +SELECT json_object('{{a,b,c},{b,c,d}}'); + +-- too many dimensions error +SELECT json_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); + +--two argument form of json_object + +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); + +-- too many dimensions +SELECT json_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); + +-- mismatched dimensions + +select json_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); + +select json_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); + +-- null key error + +select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); + +-- empty key is allowed + +select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); + + +-- json_to_record and json_to_recordset + +select * from json_to_record('{"a":1,"b":"foo","c":"bar"}') + as x(a int, b text, d text); + +select * from json_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') + as x(a int, b text, c boolean); + +select * from json_to_recordset('[{"a":1,"b":{"d":"foo"},"c":true},{"a":2,"c":false,"b":{"d":"bar"}}]') + as x(a int, b json, c boolean); + +select *, c is null as c_is_null +from json_to_record('{"a":1, "b":{"c":16, "d":2}, "x":8, "ca": ["1 2", 3], "ia": [[1,2],[3,4]], "r": {"a": "aaa", "b": 123}}'::json) + as t(a int, b json, c text, x int, ca char(5)[], ia int[][], r jpop); + +select *, c is null as c_is_null +from json_to_recordset('[{"a":1, "b":{"c":16, "d":2}, "x":8}]'::json) + as t(a int, b json, c text, x int); + +select * from json_to_record('{"ia": null}') as x(ia _int4); +select * from json_to_record('{"ia": 123}') as x(ia _int4); +select * from json_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4); +select * from json_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4); +select * from json_to_record('{"ia": [[1], 2]}') as x(ia _int4); +select * from json_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4); + +select * from json_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]); +select * from json_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]); +select * from json_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]); + +select * from json_to_record('{"out": {"key": 1}}') as x(out json); +select * from json_to_record('{"out": [{"key": 1}]}') as x(out json); +select * from json_to_record('{"out": "{\"key\": 1}"}') as x(out json); +select * from json_to_record('{"out": {"key": 1}}') as x(out jsonb); +select * from json_to_record('{"out": [{"key": 1}]}') as x(out jsonb); +select * from json_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb); + +-- json_strip_nulls + +select json_strip_nulls(null); + +select json_strip_nulls('1'); + +select json_strip_nulls('"a string"'); + +select json_strip_nulls('null'); + +select json_strip_nulls('[1,2,null,3,4]'); + +select json_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); + +select json_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); + +-- an empty object is not null and should not be stripped +select json_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); + +-- json to tsvector +select to_tsvector('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::json); + +-- json to tsvector with config +select to_tsvector('simple', '{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::json); + +-- json to tsvector with stop words +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": ["the eee fff ggg"], "c": {"d": "hhh. iii"}}'::json); + +-- json to tsvector with numeric values +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": 123, "c": 456}'::json); + +-- json_to_tsvector +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"all"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"all"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"key"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"string"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"numeric"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '"boolean"'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["string", "numeric"]'); + +-- to_tsvector corner cases +select to_tsvector('""'::json); +select to_tsvector('{}'::json); +select to_tsvector('[]'::json); +select to_tsvector('null'::json); + +-- json_to_tsvector corner cases +select json_to_tsvector('""'::json, '"all"'); +select json_to_tsvector('{}'::json, '"all"'); +select json_to_tsvector('[]'::json, '"all"'); +select json_to_tsvector('null'::json, '"all"'); + +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '""'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '{}'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '[]'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, 'null'); +select json_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::json, '["all", null]'); + +-- ts_headline for json +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh')); +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::json, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + +-- corner cases for ts_headline with json +select ts_headline('null'::json, tsquery('aaa & bbb')); +select ts_headline('{}'::json, tsquery('aaa & bbb')); +select ts_headline('[]'::json, tsquery('aaa & bbb')); diff --git a/src/test/singlenode_regress/sql/json_encoding.sql b/src/test/singlenode_regress/sql/json_encoding.sql new file mode 100644 index 00000000000..d7fac69733d --- /dev/null +++ b/src/test/singlenode_regress/sql/json_encoding.sql @@ -0,0 +1,78 @@ +-- +-- encoding-sensitive tests for json and jsonb +-- + +-- We provide expected-results files for UTF8 (json_encoding.out) +-- and for SQL_ASCII (json_encoding_1.out). Skip otherwise. +SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') + AS skip_test \gset +\if :skip_test +\quit +\endif + +SELECT getdatabaseencoding(); -- just to label the results files + +-- first json + +-- basic unicode input +SELECT '"\u"'::json; -- ERROR, incomplete escape +SELECT '"\u00"'::json; -- ERROR, incomplete escape +SELECT '"\u000g"'::json; -- ERROR, g is not a hex digit +SELECT '"\u0000"'::json; -- OK, legal escape +SELECT '"\uaBcD"'::json; -- OK, uppercase and lower case both OK + +-- handling of unicode surrogate pairs + +select json '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a' as correct_in_utf8; +select json '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row +select json '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order +select json '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate +select json '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate + +--handling of simple unicode escapes + +select json '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8; +select json '{ "a": "dollar \u0024 character" }' as correct_everywhere; +select json '{ "a": "dollar \\u0024 character" }' as not_an_escape; +select json '{ "a": "null \u0000 escape" }' as not_unescaped; +select json '{ "a": "null \\u0000 escape" }' as not_an_escape; + +select json '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8; +select json '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere; +select json '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape; +select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails; +select json '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape; + +-- then jsonb + +-- basic unicode input +SELECT '"\u"'::jsonb; -- ERROR, incomplete escape +SELECT '"\u00"'::jsonb; -- ERROR, incomplete escape +SELECT '"\u000g"'::jsonb; -- ERROR, g is not a hex digit +SELECT '"\u0045"'::jsonb; -- OK, legal escape +SELECT '"\u0000"'::jsonb; -- ERROR, we don't support U+0000 +-- use octet_length here so we don't get an odd unicode char in the +-- output +SELECT octet_length('"\uaBcD"'::jsonb::text); -- OK, uppercase and lower case both OK + +-- handling of unicode surrogate pairs + +SELECT octet_length((jsonb '{ "a": "\ud83d\ude04\ud83d\udc36" }' -> 'a')::text) AS correct_in_utf8; +SELECT jsonb '{ "a": "\ud83d\ud83d" }' -> 'a'; -- 2 high surrogates in a row +SELECT jsonb '{ "a": "\ude04\ud83d" }' -> 'a'; -- surrogates in wrong order +SELECT jsonb '{ "a": "\ud83dX" }' -> 'a'; -- orphan high surrogate +SELECT jsonb '{ "a": "\ude04X" }' -> 'a'; -- orphan low surrogate + +-- handling of simple unicode escapes + +SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' as correct_in_utf8; +SELECT jsonb '{ "a": "dollar \u0024 character" }' as correct_everywhere; +SELECT jsonb '{ "a": "dollar \\u0024 character" }' as not_an_escape; +SELECT jsonb '{ "a": "null \u0000 escape" }' as fails; +SELECT jsonb '{ "a": "null \\u0000 escape" }' as not_an_escape; + +SELECT jsonb '{ "a": "the Copyright \u00a9 sign" }' ->> 'a' as correct_in_utf8; +SELECT jsonb '{ "a": "dollar \u0024 character" }' ->> 'a' as correct_everywhere; +SELECT jsonb '{ "a": "dollar \\u0024 character" }' ->> 'a' as not_an_escape; +SELECT jsonb '{ "a": "null \u0000 escape" }' ->> 'a' as fails; +SELECT jsonb '{ "a": "null \\u0000 escape" }' ->> 'a' as not_an_escape; diff --git a/src/test/singlenode_regress/sql/jsonb.sql b/src/test/singlenode_regress/sql/jsonb.sql new file mode 100644 index 00000000000..5016f29c15a --- /dev/null +++ b/src/test/singlenode_regress/sql/jsonb.sql @@ -0,0 +1,1484 @@ +-- Strings. +SELECT '""'::jsonb; -- OK. +SELECT $$''$$::jsonb; -- ERROR, single quotes are not allowed +SELECT '"abc"'::jsonb; -- OK +SELECT '"abc'::jsonb; -- ERROR, quotes not closed +SELECT '"abc +def"'::jsonb; -- ERROR, unescaped newline in string constant +SELECT '"\n\"\\"'::jsonb; -- OK, legal escapes +SELECT '"\v"'::jsonb; -- ERROR, not a valid JSON escape +-- see json_encoding test for input with unicode escapes + +-- Numbers. +SELECT '1'::jsonb; -- OK +SELECT '0'::jsonb; -- OK +SELECT '01'::jsonb; -- ERROR, not valid according to JSON spec +SELECT '0.1'::jsonb; -- OK +SELECT '9223372036854775808'::jsonb; -- OK, even though it's too large for int8 +SELECT '1e100'::jsonb; -- OK +SELECT '1.3e100'::jsonb; -- OK +SELECT '1f2'::jsonb; -- ERROR +SELECT '0.x1'::jsonb; -- ERROR +SELECT '1.3ex100'::jsonb; -- ERROR + +-- Arrays. +SELECT '[]'::jsonb; -- OK +SELECT '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'::jsonb; -- OK +SELECT '[1,2]'::jsonb; -- OK +SELECT '[1,2,]'::jsonb; -- ERROR, trailing comma +SELECT '[1,2'::jsonb; -- ERROR, no closing bracket +SELECT '[1,[2]'::jsonb; -- ERROR, no closing bracket + +-- Objects. +SELECT '{}'::jsonb; -- OK +SELECT '{"abc"}'::jsonb; -- ERROR, no value +SELECT '{"abc":1}'::jsonb; -- OK +SELECT '{1:"abc"}'::jsonb; -- ERROR, keys must be strings +SELECT '{"abc",1}'::jsonb; -- ERROR, wrong separator +SELECT '{"abc"=1}'::jsonb; -- ERROR, totally wrong separator +SELECT '{"abc"::1}'::jsonb; -- ERROR, another wrong separator +SELECT '{"abc":1,"def":2,"ghi":[3,4],"hij":{"klm":5,"nop":[6]}}'::jsonb; -- OK +SELECT '{"abc":1:2}'::jsonb; -- ERROR, colon in wrong spot +SELECT '{"abc":1,3}'::jsonb; -- ERROR, no value + +-- Recursion. +SET max_stack_depth = '100kB'; +SELECT repeat('[', 10000)::jsonb; +SELECT repeat('{"a":', 10000)::jsonb; +RESET max_stack_depth; + +-- Miscellaneous stuff. +SELECT 'true'::jsonb; -- OK +SELECT 'false'::jsonb; -- OK +SELECT 'null'::jsonb; -- OK +SELECT ' true '::jsonb; -- OK, even with extra whitespace +SELECT 'true false'::jsonb; -- ERROR, too many values +SELECT 'true, false'::jsonb; -- ERROR, too many values +SELECT 'truf'::jsonb; -- ERROR, not a keyword +SELECT 'trues'::jsonb; -- ERROR, not a keyword +SELECT ''::jsonb; -- ERROR, no value +SELECT ' '::jsonb; -- ERROR, no value + +-- Multi-line JSON input to check ERROR reporting +SELECT '{ + "one": 1, + "two":"two", + "three": + true}'::jsonb; -- OK +SELECT '{ + "one": 1, + "two":,"two", -- ERROR extraneous comma before field "two" + "three": + true}'::jsonb; +SELECT '{ + "one": 1, + "two":"two", + "averyveryveryveryveryveryveryveryveryverylongfieldname":}'::jsonb; +-- ERROR missing value for last field + +-- make sure jsonb is passed through json generators without being escaped +SELECT array_to_json(ARRAY [jsonb '{"a":1}', jsonb '{"b":[2,3]}']); + +-- anyarray column + +CREATE TEMP TABLE rows AS +SELECT x, 'txt' || x as y +FROM generate_series(1,3) AS x; + +analyze rows; + +select attname, to_jsonb(histogram_bounds) histogram_bounds +from pg_stats +where tablename = 'rows' and + schemaname = pg_my_temp_schema()::regnamespace::text +order by 1; + +-- to_jsonb, timestamps + +select to_jsonb(timestamp '2014-05-28 12:22:35.614298'); + +BEGIN; +SET LOCAL TIME ZONE 10.5; +select to_jsonb(timestamptz '2014-05-28 12:22:35.614298-04'); +SET LOCAL TIME ZONE -8; +select to_jsonb(timestamptz '2014-05-28 12:22:35.614298-04'); +COMMIT; + +select to_jsonb(date '2014-05-28'); + +select to_jsonb(date 'Infinity'); +select to_jsonb(date '-Infinity'); +select to_jsonb(timestamp 'Infinity'); +select to_jsonb(timestamp '-Infinity'); +select to_jsonb(timestamptz 'Infinity'); +select to_jsonb(timestamptz '-Infinity'); + +--jsonb_agg + +SELECT jsonb_agg(q) + FROM ( SELECT $$a$$ || x AS b, y AS c, + ARRAY[ROW(x.*,ARRAY[1,2,3]), + ROW(y.*,ARRAY[4,5,6])] AS z + FROM generate_series(1,2) x, + generate_series(4,5) y) q; + +SELECT jsonb_agg(q ORDER BY x, y) + FROM rows q; + +UPDATE rows SET x = NULL WHERE x = 1; + +SELECT jsonb_agg(q ORDER BY x NULLS FIRST, y) + FROM rows q; + +-- jsonb extraction functions +CREATE TEMP TABLE test_jsonb ( + json_type text, + test_json jsonb +); + +INSERT INTO test_jsonb VALUES +('scalar','"a scalar"'), +('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'), +('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}'); + +SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'scalar'; +SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'array'; +SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'object'; +SELECT test_json -> 'field2' FROM test_jsonb WHERE json_type = 'object'; + +SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'scalar'; +SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'array'; +SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'object'; + +SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'scalar'; +SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'array'; +SELECT test_json -> 9 FROM test_jsonb WHERE json_type = 'array'; +SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'object'; + +SELECT test_json ->> 6 FROM test_jsonb WHERE json_type = 'array'; +SELECT test_json ->> 7 FROM test_jsonb WHERE json_type = 'array'; + +SELECT test_json ->> 'field4' FROM test_jsonb WHERE json_type = 'object'; +SELECT test_json ->> 'field5' FROM test_jsonb WHERE json_type = 'object'; +SELECT test_json ->> 'field6' FROM test_jsonb WHERE json_type = 'object'; + +SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'scalar'; +SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'array'; +SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'object'; + +SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'scalar'; +SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'array'; +SELECT jsonb_object_keys(test_json) FROM test_jsonb WHERE json_type = 'object'; + +-- nulls +SELECT (test_json->'field3') IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'object'; +SELECT (test_json->>'field3') IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'object'; +SELECT (test_json->3) IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'array'; +SELECT (test_json->>3) IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'array'; + +-- corner cases +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::text; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::int; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> ''; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 1; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 3; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 'z'; +select '{"a": "c", "b": null}'::jsonb -> 'b'; +select '"foo"'::jsonb -> 1; +select '"foo"'::jsonb -> 'z'; + +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::text; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::int; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 1; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 'z'; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> ''; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 1; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 3; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 'z'; +select '{"a": "c", "b": null}'::jsonb ->> 'b'; +select '"foo"'::jsonb ->> 1; +select '"foo"'::jsonb ->> 'z'; + +-- equality and inequality +SELECT '{"x":"y"}'::jsonb = '{"x":"y"}'::jsonb; +SELECT '{"x":"y"}'::jsonb = '{"x":"z"}'::jsonb; + +SELECT '{"x":"y"}'::jsonb <> '{"x":"y"}'::jsonb; +SELECT '{"x":"y"}'::jsonb <> '{"x":"z"}'::jsonb; + +-- containment +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":null}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "g":null}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"g":null}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"c"}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b"}'); +SELECT jsonb_contains('{"a":"b", "b":1, "c":null}', '{"a":"b", "c":"q"}'); +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":null}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "g":null}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"g":null}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"c"}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b"}'; +SELECT '{"a":"b", "b":1, "c":null}'::jsonb @> '{"a":"b", "c":"q"}'; + +SELECT '[1,2]'::jsonb @> '[1,2,2]'::jsonb; +SELECT '[1,1,2]'::jsonb @> '[1,2,2]'::jsonb; +SELECT '[[1,2]]'::jsonb @> '[[1,2,2]]'::jsonb; +SELECT '[1,2,2]'::jsonb <@ '[1,2]'::jsonb; +SELECT '[1,2,2]'::jsonb <@ '[1,1,2]'::jsonb; +SELECT '[[1,2,2]]'::jsonb <@ '[[1,2]]'::jsonb; + +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"b", "c":null}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"b", "g":null}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"g":null}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"c"}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"b"}', '{"a":"b", "b":1, "c":null}'); +SELECT jsonb_contained('{"a":"b", "c":"q"}', '{"a":"b", "b":1, "c":null}'); +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"b", "c":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"b", "g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"g":null}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"c"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"b"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +SELECT '{"a":"b", "c":"q"}'::jsonb <@ '{"a":"b", "b":1, "c":null}'; +-- Raw scalar may contain another raw scalar, array may contain a raw scalar +SELECT '[5]'::jsonb @> '[5]'; +SELECT '5'::jsonb @> '5'; +SELECT '[5]'::jsonb @> '5'; +-- But a raw scalar cannot contain an array +SELECT '5'::jsonb @> '[5]'; +-- In general, one thing should always contain itself. Test array containment: +SELECT '["9", ["7", "3"], 1]'::jsonb @> '["9", ["7", "3"], 1]'::jsonb; +SELECT '["9", ["7", "3"], ["1"]]'::jsonb @> '["9", ["7", "3"], ["1"]]'::jsonb; +-- array containment string matching confusion bug +SELECT '{ "name": "Bob", "tags": [ "enim", "qui"]}'::jsonb @> '{"tags":["qu"]}'; + +-- array length +SELECT jsonb_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'); +SELECT jsonb_array_length('[]'); +SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'); +SELECT jsonb_array_length('4'); + +-- each +SELECT jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); +SELECT jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; +SELECT * FROM jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +SELECT * FROM jsonb_each('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + +SELECT jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":"null"}'); +SELECT jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; +SELECT * FROM jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q; +SELECT * FROM jsonb_each_text('{"a":{"b":"c","c":"b","1":"first"},"b":[1,2],"c":"cc","1":"first","n":null}'::jsonb) AS q; + +-- exists +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'a'); +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'b'); +SELECT jsonb_exists('{"a":null, "b":"qq"}', 'c'); +SELECT jsonb_exists('{"a":"null", "b":"qq"}', 'a'); +SELECT jsonb '{"a":null, "b":"qq"}' ? 'a'; +SELECT jsonb '{"a":null, "b":"qq"}' ? 'b'; +SELECT jsonb '{"a":null, "b":"qq"}' ? 'c'; +SELECT jsonb '{"a":"null", "b":"qq"}' ? 'a'; +-- array exists - array elements should behave as keys +SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; +-- type sensitive array exists - should return no rows (since "exists" only +-- matches strings that are either object keys or array elements) +SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; +-- However, a raw scalar is *contained* within the array +SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; + +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['a','b']); +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['b','a']); +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','a']); +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['c','d']); +SELECT jsonb_exists_any('{"a":null, "b":"qq"}', '{}'::text[]); +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['a','b']; +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['b','a']; +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','a']; +SELECT jsonb '{"a":null, "b":"qq"}' ?| ARRAY['c','d']; +SELECT jsonb '{"a":null, "b":"qq"}' ?| '{}'::text[]; + +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['a','b']); +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['b','a']); +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','a']); +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', ARRAY['c','d']); +SELECT jsonb_exists_all('{"a":null, "b":"qq"}', '{}'::text[]); +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','b']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['b','a']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','a']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['c','d']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& ARRAY['a','a', 'b', 'b', 'b']; +SELECT jsonb '{"a":null, "b":"qq"}' ?& '{}'::text[]; + +-- typeof +SELECT jsonb_typeof('{}') AS object; +SELECT jsonb_typeof('{"c":3,"p":"o"}') AS object; +SELECT jsonb_typeof('[]') AS array; +SELECT jsonb_typeof('["a", 1]') AS array; +SELECT jsonb_typeof('null') AS "null"; +SELECT jsonb_typeof('1') AS number; +SELECT jsonb_typeof('-1') AS number; +SELECT jsonb_typeof('1.0') AS number; +SELECT jsonb_typeof('1e2') AS number; +SELECT jsonb_typeof('-1.0') AS number; +SELECT jsonb_typeof('true') AS boolean; +SELECT jsonb_typeof('false') AS boolean; +SELECT jsonb_typeof('"hello"') AS string; +SELECT jsonb_typeof('"true"') AS string; +SELECT jsonb_typeof('"1.0"') AS string; + +-- jsonb_build_array, jsonb_build_object, jsonb_object_agg + +SELECT jsonb_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); +SELECT jsonb_build_array('a', NULL); -- ok +SELECT jsonb_build_array(VARIADIC NULL::text[]); -- ok +SELECT jsonb_build_array(VARIADIC '{}'::text[]); -- ok +SELECT jsonb_build_array(VARIADIC '{a,b,c}'::text[]); -- ok +SELECT jsonb_build_array(VARIADIC ARRAY['a', NULL]::text[]); -- ok +SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::text[]); -- ok +SELECT jsonb_build_array(VARIADIC '{1,2,3,4}'::int[]); -- ok +SELECT jsonb_build_array(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + +SELECT jsonb_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); + +SELECT jsonb_build_object( + 'a', jsonb_build_object('b',false,'c',99), + 'd', jsonb_build_object('e',array[9,8,7]::int[], + 'f', (select row_to_json(r) from ( select relkind, oid::regclass as name from pg_class where relname = 'pg_class') r))); +SELECT jsonb_build_object('{a,b,c}'::text[]); -- error +SELECT jsonb_build_object('{a,b,c}'::text[], '{d,e,f}'::text[]); -- error, key cannot be array +SELECT jsonb_build_object('a', 'b', 'c'); -- error +SELECT jsonb_build_object(NULL, 'a'); -- error, key cannot be NULL +SELECT jsonb_build_object('a', NULL); -- ok +SELECT jsonb_build_object(VARIADIC NULL::text[]); -- ok +SELECT jsonb_build_object(VARIADIC '{}'::text[]); -- ok +SELECT jsonb_build_object(VARIADIC '{a,b,c}'::text[]); -- error +SELECT jsonb_build_object(VARIADIC ARRAY['a', NULL]::text[]); -- ok +SELECT jsonb_build_object(VARIADIC ARRAY[NULL, 'a']::text[]); -- error, key cannot be NULL +SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::text[]); -- ok +SELECT jsonb_build_object(VARIADIC '{1,2,3,4}'::int[]); -- ok +SELECT jsonb_build_object(VARIADIC '{{1,4},{2,5},{3,6}}'::int[][]); -- ok + +-- empty objects/arrays +SELECT jsonb_build_array(); + +SELECT jsonb_build_object(); + +-- make sure keys are quoted +SELECT jsonb_build_object(1,2); + +-- keys must be scalar and not null +SELECT jsonb_build_object(null,2); + +SELECT jsonb_build_object(r,2) FROM (SELECT 1 AS a, 2 AS b) r; + +SELECT jsonb_build_object(json '{"a":1,"b":2}', 3); + +SELECT jsonb_build_object('{1,2,3}'::int[], 3); + +-- handling of NULL values +SELECT jsonb_object_agg(1, NULL::jsonb); +SELECT jsonb_object_agg(NULL, '{"a":1}'); + +CREATE TEMP TABLE foo (serial_num int, name text, type text); +INSERT INTO foo VALUES (847001,'t15','GE1043'); +INSERT INTO foo VALUES (847002,'t16','GE1043'); +INSERT INTO foo VALUES (847003,'sub-alpha','GESS90'); + +SELECT jsonb_build_object('turbines',jsonb_object_agg(serial_num,jsonb_build_object('name',name,'type',type))) +FROM foo; + +SELECT jsonb_object_agg(name, type) FROM foo; + +INSERT INTO foo VALUES (999999, NULL, 'bar'); +SELECT jsonb_object_agg(name, type) FROM foo; + +-- jsonb_object + +-- empty object, one dimension +SELECT jsonb_object('{}'); + +-- empty object, two dimensions +SELECT jsonb_object('{}', '{}'); + +-- one dimension +SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); + +-- same but with two dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); + +-- odd number error +SELECT jsonb_object('{a,b,c}'); + +-- one column error +SELECT jsonb_object('{{a},{b}}'); + +-- too many columns error +SELECT jsonb_object('{{a,b,c},{b,c,d}}'); + +-- too many dimensions error +SELECT jsonb_object('{{{a,b},{c,d}},{{b,c},{d,e}}}'); + +--two argument form of jsonb_object + +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c"}'); + +-- too many dimensions +SELECT jsonb_object('{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}', '{{a,1},{b,2},{3,NULL},{"d e f","a b c"}}'); + +-- mismatched dimensions + +select jsonb_object('{a,b,c,"d e f",g}','{1,2,3,"a b c"}'); + +select jsonb_object('{a,b,c,"d e f"}','{1,2,3,"a b c",g}'); + +-- null key error + +select jsonb_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); + +-- empty key is allowed + +select jsonb_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); + + + +-- extract_path, extract_path_as_text +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); +SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); +SELECT jsonb_extract_path('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f4','f6'); +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}','f2'); +SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',0::text); +SELECT jsonb_extract_path_text('{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}','f2',1::text); + +-- extract_path nulls +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_false; +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":{"f5":null,"f6":"stringy"}}','f4','f5') IS NULL AS expect_true; +SELECT jsonb_extract_path('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_false; +SELECT jsonb_extract_path_text('{"f2":{"f3":1},"f4":[0,1,2,null]}','f4','3') IS NULL AS expect_true; + +-- extract_path operators +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f4','f6']; +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2']; +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','0']; +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>array['f2','1']; + +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f4','f6']; +SELECT '{"f2":{"f3":1},"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2']; +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','0']; +SELECT '{"f2":["f3",1],"f4":{"f5":99,"f6":"stringy"}}'::jsonb#>>array['f2','1']; + +-- corner cases for same +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> '{}'; +select '[1,2,3]'::jsonb #> '{}'; +select '"foo"'::jsonb #> '{}'; +select '42'::jsonb #> '{}'; +select 'null'::jsonb #> '{}'; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', null]; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a', '']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','b','c','d']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #> array['a','z','c']; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','1','b']; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #> array['a','z','b']; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['1','b']; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #> array['z','b']; +select '[{"b": "c"}, {"b": null}]'::jsonb #> array['1','b']; +select '"foo"'::jsonb #> array['z']; +select '42'::jsonb #> array['f2']; +select '42'::jsonb #> array['0']; + +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> '{}'; +select '[1,2,3]'::jsonb #>> '{}'; +select '"foo"'::jsonb #>> '{}'; +select '42'::jsonb #>> '{}'; +select 'null'::jsonb #>> '{}'; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', null]; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a', '']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','b','c','d']; +select '{"a": {"b":{"c": "foo"}}}'::jsonb #>> array['a','z','c']; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','1','b']; +select '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb #>> array['a','z','b']; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['1','b']; +select '[{"b": "c"}, {"b": "cc"}]'::jsonb #>> array['z','b']; +select '[{"b": "c"}, {"b": null}]'::jsonb #>> array['1','b']; +select '"foo"'::jsonb #>> array['z']; +select '42'::jsonb #>> array['f2']; +select '42'::jsonb #>> array['0']; + +-- array_elements +SELECT jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]'); +SELECT * FROM jsonb_array_elements('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false]') q; +SELECT jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]'); +SELECT * FROM jsonb_array_elements_text('[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]') q; + +-- populate_record +CREATE TYPE jbpop AS (a text, b int, c timestamp); + +CREATE DOMAIN jsb_int_not_null AS int NOT NULL; +CREATE DOMAIN jsb_int_array_1d AS int[] CHECK(array_length(VALUE, 1) = 3); +CREATE DOMAIN jsb_int_array_2d AS int[][] CHECK(array_length(VALUE, 2) = 3); + +create type jb_unordered_pair as (x int, y int); +create domain jb_ordered_pair as jb_unordered_pair check((value).x <= (value).y); + +CREATE TYPE jsbrec AS ( + i int, + ia _int4, + ia1 int[], + ia2 int[][], + ia3 int[][][], + ia1d jsb_int_array_1d, + ia2d jsb_int_array_2d, + t text, + ta text[], + c char(10), + ca char(10)[], + ts timestamp, + js json, + jsb jsonb, + jsa json[], + rec jbpop, + reca jbpop[] +); + +CREATE TYPE jsbrec_i_not_null AS ( + i jsb_int_not_null +); + +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q; +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q; + +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":"blurfl","x":43.2}') q; +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":"blurfl","x":43.2}') q; + +SELECT * FROM jsonb_populate_record(NULL::jbpop,'{"a":[100,200,false],"x":43.2}') q; +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"a":[100,200,false],"x":43.2}') q; +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop,'{"c":[100,200,false],"x":43.2}') q; + +SELECT * FROM jsonb_populate_record(row('x',3,'2012-12-31 15:30:56')::jbpop, '{}') q; + +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"x": 43.2}') q; +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": null}') q; +SELECT i FROM jsonb_populate_record(NULL::jsbrec_i_not_null, '{"i": 12345}') q; + +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": null}') q; +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": 123}') q; +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [1, "2", null, 4]}') q; +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1, 2], [3, 4]]}') q; +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], 2]}') q; +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": [[1], [2, 3]]}') q; +SELECT ia FROM jsonb_populate_record(NULL::jsbrec, '{"ia": "{1,2,3}"}') q; + +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": null}') q; +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": 123}') q; +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [1, "2", null, 4]}') q; +SELECT ia1 FROM jsonb_populate_record(NULL::jsbrec, '{"ia1": [[1, 2, 3]]}') q; + +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": null}') q; +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": 123}') q; +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null, 4]}') q; +SELECT ia1d FROM jsonb_populate_record(NULL::jsbrec, '{"ia1d": [1, "2", null]}') q; + +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [1, "2", null, 4]}') q; +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [null, 4]]}') q; +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[], []]}') q; +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], [3]]}') q; +SELECT ia2 FROM jsonb_populate_record(NULL::jsbrec, '{"ia2": [[1, 2], 3, 4]}') q; + +SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2"], [null, 4]]}') q; +SELECT ia2d FROM jsonb_populate_record(NULL::jsbrec, '{"ia2d": [[1, "2", 3], [null, 5, 6]]}') q; + +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [1, "2", null, 4]}') q; +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [[1, 2], [null, 4]]}') q; +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[], []], [[], []], [[], []] ]}') q; +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2]], [[3, 4]] ]}') q; +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8]] ]}') q; +SELECT ia3 FROM jsonb_populate_record(NULL::jsbrec, '{"ia3": [ [[1, 2], [3, 4]], [[5, 6], [7, 8], [9, 10]] ]}') q; + +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": null}') q; +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": 123}') q; +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [1, "2", null, 4]}') q; +SELECT ta FROM jsonb_populate_record(NULL::jsbrec, '{"ta": [[1, 2, 3], {"k": "v"}]}') q; + +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": null}') q; +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaa"}') q; +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaa"}') q; +SELECT c FROM jsonb_populate_record(NULL::jsbrec, '{"c": "aaaaaaaaaaaaa"}') q; + +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": null}') q; +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": 123}') q; +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [1, "2", null, 4]}') q; +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": ["aaaaaaaaaaaaaaaa"]}') q; +SELECT ca FROM jsonb_populate_record(NULL::jsbrec, '{"ca": [[1, 2, 3], {"k": "v"}]}') q; + +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": null}') q; +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": true}') q; +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": 123.45}') q; +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "123.45"}') q; +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": "abc"}') q; +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": [123, "123", null, {"key": "value"}]}') q; +SELECT js FROM jsonb_populate_record(NULL::jsbrec, '{"js": {"a": "bbb", "b": null, "c": 123.45}}') q; + +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": null}') q; +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": true}') q; +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": 123.45}') q; +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "123.45"}') q; +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": "abc"}') q; +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": [123, "123", null, {"key": "value"}]}') q; +SELECT jsb FROM jsonb_populate_record(NULL::jsbrec, '{"jsb": {"a": "bbb", "b": null, "c": 123.45}}') q; + +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": null}') q; +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": 123}') q; +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": [1, "2", null, 4]}') q; +SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": ["aaa", null, [1, 2, "3", {}], { "k" : "v" }]}') q; + +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": 123}') q; +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": [1, 2]}') q; +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q; +SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": "(abc,42,01.02.2003)"}') q; + +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": 123}') q; +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [1, 2]}') q; +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q; +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": ["(abc,42,01.02.2003)"]}') q; +SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": "{\"(abc,42,01.02.2003)\"}"}') q; + +SELECT rec FROM jsonb_populate_record( + row(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + row('x',3,'2012-12-31 15:30:56')::jbpop,NULL)::jsbrec, + '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}' +) q; + +-- anonymous record type +SELECT jsonb_populate_record(null::record, '{"x": 0, "y": 1}'); +SELECT jsonb_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); +SELECT * FROM + jsonb_populate_record(null::record, '{"x": 776}') AS (x int, y int); + +-- composite domain +SELECT jsonb_populate_record(null::jb_ordered_pair, '{"x": 0, "y": 1}'); +SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 0}'); +SELECT jsonb_populate_record(row(1,2)::jb_ordered_pair, '{"x": 1, "y": 0}'); + +-- populate_recordset +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"c":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":"blurfl","x":43.2},{"b":3,"c":"2012-01-20 10:42:53"}]') q; +SELECT * FROM jsonb_populate_recordset(row('def',99,NULL)::jbpop,'[{"a":[100,200,300],"x":43.2},{"a":{"z":true},"b":3,"c":"2012-01-20 10:42:53"}]') q; + +-- anonymous record type +SELECT jsonb_populate_recordset(null::record, '[{"x": 0, "y": 1}]'); +SELECT jsonb_populate_recordset(row(1,2), '[{"f1": 0, "f2": 1}]'); +SELECT i, jsonb_populate_recordset(row(i,50), '[{"f1":"42"},{"f2":"43"}]') +FROM (VALUES (1),(2)) v(i); +SELECT * FROM + jsonb_populate_recordset(null::record, '[{"x": 776}]') AS (x int, y int); + +-- empty array is a corner case +SELECT jsonb_populate_recordset(null::record, '[]'); +SELECT jsonb_populate_recordset(row(1,2), '[]'); +SELECT * FROM jsonb_populate_recordset(NULL::jbpop,'[]') q; +SELECT * FROM + jsonb_populate_recordset(null::record, '[]') AS (x int, y int); + +-- composite domain +SELECT jsonb_populate_recordset(null::jb_ordered_pair, '[{"x": 0, "y": 1}]'); +SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 0}, {"y": 3}]'); +SELECT jsonb_populate_recordset(row(1,2)::jb_ordered_pair, '[{"x": 1, "y": 0}]'); + +-- negative cases where the wrong record type is supplied +select * from jsonb_populate_recordset(row(0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +select * from jsonb_populate_recordset(row(0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +select * from jsonb_populate_recordset(row(0::int,0::int,0::int),'[{"a":"1","b":"2"},{"a":"3"}]') q (a text, b text); +select * from jsonb_populate_recordset(row(1000000000::int,50::int),'[{"b":"2"},{"a":"3"}]') q (a text, b text); + +-- jsonb_to_record and jsonb_to_recordset + +select * from jsonb_to_record('{"a":1,"b":"foo","c":"bar"}') + as x(a int, b text, d text); + +select * from jsonb_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') + as x(a int, b text, c boolean); + +select *, c is null as c_is_null +from jsonb_to_record('{"a":1, "b":{"c":16, "d":2}, "x":8, "ca": ["1 2", 3], "ia": [[1,2],[3,4]], "r": {"a": "aaa", "b": 123}}'::jsonb) + as t(a int, b jsonb, c text, x int, ca char(5)[], ia int[][], r jbpop); + +select *, c is null as c_is_null +from jsonb_to_recordset('[{"a":1, "b":{"c":16, "d":2}, "x":8}]'::jsonb) + as t(a int, b jsonb, c text, x int); + +select * from jsonb_to_record('{"ia": null}') as x(ia _int4); +select * from jsonb_to_record('{"ia": 123}') as x(ia _int4); +select * from jsonb_to_record('{"ia": [1, "2", null, 4]}') as x(ia _int4); +select * from jsonb_to_record('{"ia": [[1, 2], [3, 4]]}') as x(ia _int4); +select * from jsonb_to_record('{"ia": [[1], 2]}') as x(ia _int4); +select * from jsonb_to_record('{"ia": [[1], [2, 3]]}') as x(ia _int4); + +select * from jsonb_to_record('{"ia2": [1, 2, 3]}') as x(ia2 int[][]); +select * from jsonb_to_record('{"ia2": [[1, 2], [3, 4]]}') as x(ia2 int4[][]); +select * from jsonb_to_record('{"ia2": [[[1], [2], [3]]]}') as x(ia2 int4[][]); + +select * from jsonb_to_record('{"out": {"key": 1}}') as x(out json); +select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out json); +select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out json); +select * from jsonb_to_record('{"out": {"key": 1}}') as x(out jsonb); +select * from jsonb_to_record('{"out": [{"key": 1}]}') as x(out jsonb); +select * from jsonb_to_record('{"out": "{\"key\": 1}"}') as x(out jsonb); + +-- test type info caching in jsonb_populate_record() +CREATE TEMP TABLE jsbpoptest (js jsonb); + +INSERT INTO jsbpoptest +SELECT '{ + "jsa": [1, "2", null, 4], + "rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}, + "reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}] +}'::jsonb +FROM generate_series(1, 3); + +SELECT (jsonb_populate_record(NULL::jsbrec, js)).* FROM jsbpoptest; + +DROP TYPE jsbrec; +DROP TYPE jsbrec_i_not_null; +DROP DOMAIN jsb_int_not_null; +DROP DOMAIN jsb_int_array_1d; +DROP DOMAIN jsb_int_array_2d; +DROP DOMAIN jb_ordered_pair; +DROP TYPE jb_unordered_pair; + +-- indexing +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +SELECT count(*) FROM testjsonb WHERE j ? 'public'; +SELECT count(*) FROM testjsonb WHERE j ? 'bar'; +SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; +SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; +SELECT count(*) FROM testjsonb WHERE j @? '$'; +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; + +CREATE INDEX jidx ON testjsonb USING gin (j); +SET enable_seqscan = off; + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}'; +-- exercise GIN_SEARCH_MODE_ALL +SELECT count(*) FROM testjsonb WHERE j @> '{}'; +SELECT count(*) FROM testjsonb WHERE j ? 'public'; +SELECT count(*) FROM testjsonb WHERE j ? 'bar'; +SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled']; +SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled']; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))'; +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)'; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")'; +SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")'; +SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")'; +SELECT count(*) FROM testjsonb WHERE j @? '$'; +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; + +-- array exists - array elements should behave as keys (for GIN index scans too) +CREATE INDEX jidx_array ON testjsonb USING gin((j->'array')); +SELECT count(*) from testjsonb WHERE j->'array' ? 'bar'; +-- type sensitive array exists - should return no rows (since "exists" only +-- matches strings that are either object keys or array elements) +SELECT count(*) from testjsonb WHERE j->'array' ? '5'::text; +-- However, a raw scalar is *contained* within the array +SELECT count(*) from testjsonb WHERE j->'array' @> '5'::jsonb; + +RESET enable_seqscan; + +SELECT count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow; +SELECT key, count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow GROUP BY key ORDER BY count DESC, key; + +-- sort/hash +SELECT count(distinct j) FROM testjsonb; +SET enable_hashagg = off; +SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2; +SET enable_hashagg = on; +SET enable_sort = off; +SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2; +SELECT distinct * FROM (values (jsonb '{}' || ''::text),('{}')) v(j); +SET enable_sort = on; + +RESET enable_hashagg; +RESET enable_sort; + +DROP INDEX jidx; +DROP INDEX jidx_array; +-- btree +CREATE INDEX jidx ON testjsonb USING btree (j); +SET enable_seqscan = off; + +SELECT count(*) FROM testjsonb WHERE j > '{"p":1}'; +SELECT count(*) FROM testjsonb WHERE j = '{"pos":98, "line":371, "node":"CBA", "indexed":true}'; + +--gin path opclass +DROP INDEX jidx; +CREATE INDEX jidx ON testjsonb USING gin (j jsonb_path_ops); +SET enable_seqscan = off; + +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC"}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}'; +SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}'; +-- exercise GIN_SEARCH_MODE_ALL +SELECT count(*) FROM testjsonb WHERE j @> '{}'; + +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))'; +SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"'; +SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))'; +SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)'; +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)'; +SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)'; +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)'; +SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")'; +SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")'; +SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")'; +SELECT count(*) FROM testjsonb WHERE j @? '$'; +SELECT count(*) FROM testjsonb WHERE j @? '$.public'; +SELECT count(*) FROM testjsonb WHERE j @? '$.bar'; + +RESET enable_seqscan; +DROP INDEX jidx; + +-- nested tests +SELECT '{"ff":{"a":12,"b":16}}'::jsonb; +SELECT '{"ff":{"a":12,"b":16},"qq":123}'::jsonb; +SELECT '{"aa":["a","aaa"],"qq":{"a":12,"b":16,"c":["c1","c2"],"d":{"d1":"d1","d2":"d2","d1":"d3"}}}'::jsonb; +SELECT '{"aa":["a","aaa"],"qq":{"a":"12","b":"16","c":["c1","c2"],"d":{"d1":"d1","d2":"d2"}}}'::jsonb; +SELECT '{"aa":["a","aaa"],"qq":{"a":"12","b":"16","c":["c1","c2",["c3"],{"c4":4}],"d":{"d1":"d1","d2":"d2"}}}'::jsonb; +SELECT '{"ff":["a","aaa"]}'::jsonb; + +SELECT + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'ff', + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'qq', + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'Y') IS NULL AS f, + ('{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb ->> 'Y') IS NULL AS t, + '{"ff":{"a":12,"b":16},"qq":123,"x":[1,2],"Y":null}'::jsonb -> 'x'; + +-- nested containment +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1,2]}'; +SELECT '{"a":[2,1],"c":"b"}'::jsonb @> '{"a":[1,2]}'; +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":[1,2]}'; +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":[1,2]}'; +SELECT '{"a":{"1":2},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; +SELECT '{"a":{"2":1},"c":"b"}'::jsonb @> '{"a":{"1":2}}'; +SELECT '["a","b"]'::jsonb @> '["a","b","c","b"]'; +SELECT '["a","b","c","b"]'::jsonb @> '["a","b"]'; +SELECT '["a","b","c",[1,2]]'::jsonb @> '["a",[1,2]]'; +SELECT '["a","b","c",[1,2]]'::jsonb @> '["b",[1,2]]'; + +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[1]}'; +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[2]}'; +SELECT '{"a":[1,2],"c":"b"}'::jsonb @> '{"a":[3]}'; + +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"c":3}]}'; +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4}]}'; +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},3]}'; +SELECT '{"a":[1,2,{"c":3,"x":4}],"c":"b"}'::jsonb @> '{"a":[{"x":4},1]}'; + +-- check some corner cases for indexed nested containment (bug #13756) +create temp table nestjsonb (j jsonb); +insert into nestjsonb (j) values ('{"a":[["b",{"x":1}],["b",{"x":2}]],"c":3}'); +insert into nestjsonb (j) values ('[[14,2,3]]'); +insert into nestjsonb (j) values ('[1,[14,2,3]]'); +create index on nestjsonb using gin(j jsonb_path_ops); + +set enable_seqscan = on; +set enable_bitmapscan = off; +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; +select * from nestjsonb where j @> '{"c":3}'; +select * from nestjsonb where j @> '[[14]]'; +set enable_seqscan = off; +set enable_bitmapscan = on; +select * from nestjsonb where j @> '{"a":[[{"x":2}]]}'::jsonb; +select * from nestjsonb where j @> '{"c":3}'; +select * from nestjsonb where j @> '[[14]]'; +reset enable_seqscan; +reset enable_bitmapscan; + +-- nested object field / array index lookup +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'n'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'a'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'b'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'c'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'd' -> '1'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 'e'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb -> 0; --expecting error + +SELECT '["a","b","c",[1,2],null]'::jsonb -> 0; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 1; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 2; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 3 -> 1; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 4; +SELECT '["a","b","c",[1,2],null]'::jsonb -> 5; +SELECT '["a","b","c",[1,2],null]'::jsonb -> -1; +SELECT '["a","b","c",[1,2],null]'::jsonb -> -5; +SELECT '["a","b","c",[1,2],null]'::jsonb -> -6; + +--nested path extraction +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{0}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{a}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,0}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,1}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,2}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,3}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-1}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-3}'; +SELECT '{"a":"b","c":[1,2,3]}'::jsonb #> '{c,-4}'; + +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{0}'; +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{3}'; +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4}'; +SELECT '[0,1,2,[3,4],{"5":"five"}]'::jsonb #> '{4,5}'; + +--nested exists +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'n'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'a'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'b'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'c'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'd'; +SELECT '{"n":null,"a":1,"b":[1,2],"c":{"1":2},"d":{"1":[2,3]}}'::jsonb ? 'e'; + +-- jsonb_strip_nulls + +select jsonb_strip_nulls(null); + +select jsonb_strip_nulls('1'); + +select jsonb_strip_nulls('"a string"'); + +select jsonb_strip_nulls('null'); + +select jsonb_strip_nulls('[1,2,null,3,4]'); + +select jsonb_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'); + +select jsonb_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'); + +-- an empty object is not null and should not be stripped +select jsonb_strip_nulls('{"a": {"b": null, "c": null}, "d": {} }'); + + +select jsonb_pretty('{"a": "test", "b": [1, 2, 3], "c": "test3", "d":{"dd": "test4", "dd2":{"ddd": "test5"}}}'); +select jsonb_pretty('[{"f1":1,"f2":null},2,null,[[{"x":true},6,7],8],3]'); +select jsonb_pretty('{"a":["b", "c"], "d": {"e":"f"}}'); + +select jsonb_concat('{"d": "test", "a": [1, 2]}', '{"g": "test2", "c": {"c1":1, "c2":2}}'); + +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aq":"l"}'; +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{"aa":"l"}'; +select '{"aa":1 , "b":2, "cq":3}'::jsonb || '{}'; + +select '["a", "b"]'::jsonb || '["c"]'; +select '["a", "b"]'::jsonb || '["c", "d"]'; +select '["c"]' || '["a", "b"]'::jsonb; + +select '["a", "b"]'::jsonb || '"c"'; +select '"c"' || '["a", "b"]'::jsonb; + +select '[]'::jsonb || '["a"]'::jsonb; +select '[]'::jsonb || '"a"'::jsonb; +select '"b"'::jsonb || '"a"'::jsonb; +select '{}'::jsonb || '{"a":"b"}'::jsonb; +select '[]'::jsonb || '{"a":"b"}'::jsonb; +select '{"a":"b"}'::jsonb || '[]'::jsonb; + +select '"a"'::jsonb || '{"a":1}'; +select '{"a":1}' || '"a"'::jsonb; + +select '[3]'::jsonb || '{}'::jsonb; +select '3'::jsonb || '[]'::jsonb; +select '3'::jsonb || '4'::jsonb; +select '3'::jsonb || '{}'::jsonb; + +select '["a", "b"]'::jsonb || '{"c":1}'; +select '{"c": 1}'::jsonb || '["a", "b"]'; + +select '{}'::jsonb || '{"cq":"l", "b":"g", "fg":false}'; + +select pg_column_size('{}'::jsonb || '{}'::jsonb) = pg_column_size('{}'::jsonb); +select pg_column_size('{"aa":1}'::jsonb || '{"b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); +select pg_column_size('{"aa":1, "b":2}'::jsonb || '{}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); +select pg_column_size('{}'::jsonb || '{"aa":1, "b":2}'::jsonb) = pg_column_size('{"aa":1, "b":2}'::jsonb); + +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'a'); +select jsonb_delete('{"a":null , "b":2, "c":3}'::jsonb, 'a'); +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'b'); +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'c'); +select jsonb_delete('{"a":1 , "b":2, "c":3}'::jsonb, 'd'); +select '{"a":1 , "b":2, "c":3}'::jsonb - 'a'; +select '{"a":null , "b":2, "c":3}'::jsonb - 'a'; +select '{"a":1 , "b":2, "c":3}'::jsonb - 'b'; +select '{"a":1 , "b":2, "c":3}'::jsonb - 'c'; +select '{"a":1 , "b":2, "c":3}'::jsonb - 'd'; +select pg_column_size('{"a":1 , "b":2, "c":3}'::jsonb - 'b') = pg_column_size('{"a":1, "b":2}'::jsonb); + +select '["a","b","c"]'::jsonb - 3; +select '["a","b","c"]'::jsonb - 2; +select '["a","b","c"]'::jsonb - 1; +select '["a","b","c"]'::jsonb - 0; +select '["a","b","c"]'::jsonb - -1; +select '["a","b","c"]'::jsonb - -2; +select '["a","b","c"]'::jsonb - -3; +select '["a","b","c"]'::jsonb - -4; + +select '{"a":1 , "b":2, "c":3}'::jsonb - '{b}'::text[]; +select '{"a":1 , "b":2, "c":3}'::jsonb - '{c,b}'::text[]; +select '{"a":1 , "b":2, "c":3}'::jsonb - '{}'::text[]; + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '[1,2,3]'); +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '[1,2,3]'); +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '[1,2,3]'); +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '[1,2,3]'); + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '{"1": 2}'); +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"1": 2}'); +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,1,0}', '{"1": 2}'); +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '{"1": 2}'); + +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '"test"'); +select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '{"f": "test"}'); + +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{n}'); +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{b,-1}'); +select jsonb_delete_path('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}', '{d,1,0}'); + +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{n}'; +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1}'; +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript +select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{d,1,0}'; + + +-- empty structure and error conditions for delete and replace + +select '"a"'::jsonb - 'a'; -- error +select '{}'::jsonb - 'a'; +select '[]'::jsonb - 'a'; +select '"a"'::jsonb - 1; -- error +select '{}'::jsonb - 1; -- error +select '[]'::jsonb - 1; +select '"a"'::jsonb #- '{a}'; -- error +select '{}'::jsonb #- '{a}'; +select '[]'::jsonb #- '{a}'; +select jsonb_set('"a"','{a}','"b"'); --error +select jsonb_set('{}','{a}','"b"', false); +select jsonb_set('[]','{1}','"b"', false); +select jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0}','[2,3,4]', false); + +-- jsonb_set adding instead of replacing + +-- prepend to array +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,-33}','{"foo":123}'); +-- append to array +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{b,33}','{"foo":123}'); +-- check nesting levels addition +select jsonb_set('{"a":1,"b":[4,5,[0,1,2],6,7],"c":{"d":4}}','{b,2,33}','{"foo":123}'); +-- add new key +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{c,e}','{"foo":123}'); +-- adding doesn't do anything if elements before last aren't present +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,-33}','{"foo":123}'); +select jsonb_set('{"a":1,"b":[0,1,2],"c":{"d":4}}','{x,y}','{"foo":123}'); +-- add to empty object +select jsonb_set('{}','{x}','{"foo":123}'); +--add to empty array +select jsonb_set('[]','{0}','{"foo":123}'); +select jsonb_set('[]','{99}','{"foo":123}'); +select jsonb_set('[]','{-99}','{"foo":123}'); +select jsonb_set('{"a": [1, 2, 3]}', '{a, non_integer}', '"new_value"'); +select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, non_integer}', '"new_value"'); +select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, NULL}', '"new_value"'); + +-- jsonb_set_lax + +\pset null NULL + +-- pass though non nulls to jsonb_set +select jsonb_set_lax('{"a":1,"b":2}','{b}','5') ; +select jsonb_set_lax('{"a":1,"b":2}','{d}','6', true) ; +-- using the default treatment +select jsonb_set_lax('{"a":1,"b":2}','{b}',null); +select jsonb_set_lax('{"a":1,"b":2}','{d}',null,true); +-- errors +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, null); +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, true, 'no_such_treatment'); +-- explicit treatments +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'raise_exception') as raise_exception; +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'return_target') as return_target; +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'delete_key') as delete_key; +select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'use_json_null') as use_json_null; + +\pset null '' + +-- jsonb_insert +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'); +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true); +select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"'); +select jsonb_insert('{"a": {"b": {"c": [0, 1, "test1", "test2"]}}}', '{a, b, c, 2}', '"new_value"', true); +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '{"b": "value"}'); +select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '["value1", "value2"]'); + +-- edge cases +select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"'); +select jsonb_insert('{"a": [0,1,2]}', '{a, 0}', '"new_value"', true); +select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"'); +select jsonb_insert('{"a": [0,1,2]}', '{a, 2}', '"new_value"', true); +select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"'); +select jsonb_insert('{"a": [0,1,2]}', '{a, -1}', '"new_value"', true); +select jsonb_insert('[]', '{1}', '"new_value"'); +select jsonb_insert('[]', '{1}', '"new_value"', true); +select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"'); +select jsonb_insert('{"a": []}', '{a, 1}', '"new_value"', true); +select jsonb_insert('{"a": [0,1,2]}', '{a, 10}', '"new_value"'); +select jsonb_insert('{"a": [0,1,2]}', '{a, -10}', '"new_value"'); + +-- jsonb_insert should be able to insert new value for objects, but not to replace +select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"'); +select jsonb_insert('{"a": {"b": "value"}}', '{a, c}', '"new_value"', true); + +select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"'); +select jsonb_insert('{"a": {"b": "value"}}', '{a, b}', '"new_value"', true); + +-- jsonb subscript +select ('123'::jsonb)['a']; +select ('123'::jsonb)[0]; +select ('123'::jsonb)[NULL]; +select ('{"a": 1}'::jsonb)['a']; +select ('{"a": 1}'::jsonb)[0]; +select ('{"a": 1}'::jsonb)['not_exist']; +select ('{"a": 1}'::jsonb)[NULL]; +select ('[1, "2", null]'::jsonb)['a']; +select ('[1, "2", null]'::jsonb)[0]; +select ('[1, "2", null]'::jsonb)['1']; +select ('[1, "2", null]'::jsonb)[1.0]; +select ('[1, "2", null]'::jsonb)[2]; +select ('[1, "2", null]'::jsonb)[3]; +select ('[1, "2", null]'::jsonb)[-2]; +select ('[1, "2", null]'::jsonb)[1]['a']; +select ('[1, "2", null]'::jsonb)[1][0]; +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['b']; +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']; +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d'][1]; +select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['d']['a']; +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']; +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']; +select ('{"a": {"a1": {"a2": "aaa"}}, "b": "bbb", "c": "ccc"}'::jsonb)['a']['a1']['a2']['a3']; +select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1']; +select ('{"a": ["a1", {"b1": ["aaa", "bbb", "ccc"]}], "b": "bb"}'::jsonb)['a'][1]['b1'][2]; + +-- slices are not supported +select ('{"a": 1}'::jsonb)['a':'b']; +select ('[1, "2", null]'::jsonb)[1:2]; +select ('[1, "2", null]'::jsonb)[:2]; +select ('[1, "2", null]'::jsonb)[1:]; +select ('[1, "2", null]'::jsonb)[:]; + +create TEMP TABLE test_jsonb_subscript ( + id int, + test_json jsonb +); + +insert into test_jsonb_subscript values +(1, '{}'), -- empty jsonb +(2, '{"key": "value"}'); -- jsonb with data + +-- update empty jsonb +update test_jsonb_subscript set test_json['a'] = '1' where id = 1; +select * from test_jsonb_subscript; + +-- update jsonb with some data +update test_jsonb_subscript set test_json['a'] = '1' where id = 2; +select * from test_jsonb_subscript; + +-- replace jsonb +update test_jsonb_subscript set test_json['a'] = '"test"'; +select * from test_jsonb_subscript; + +-- replace by object +update test_jsonb_subscript set test_json['a'] = '{"b": 1}'::jsonb; +select * from test_jsonb_subscript; + +-- replace by array +update test_jsonb_subscript set test_json['a'] = '[1, 2, 3]'::jsonb; +select * from test_jsonb_subscript; + +-- use jsonb subscription in where clause +select * from test_jsonb_subscript where test_json['key'] = '"value"'; +select * from test_jsonb_subscript where test_json['key_doesnt_exists'] = '"value"'; +select * from test_jsonb_subscript where test_json['key'] = '"wrong_value"'; + +-- NULL +update test_jsonb_subscript set test_json[NULL] = '1'; +update test_jsonb_subscript set test_json['another_key'] = NULL; +select * from test_jsonb_subscript; + +-- NULL as jsonb source +insert into test_jsonb_subscript values (3, NULL); +update test_jsonb_subscript set test_json['a'] = '1' where id = 3; +select * from test_jsonb_subscript; + +update test_jsonb_subscript set test_json = NULL where id = 3; +update test_jsonb_subscript set test_json[0] = '1'; +select * from test_jsonb_subscript; + +-- Fill the gaps logic +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '[0]'); + +update test_jsonb_subscript set test_json[5] = '1'; +select * from test_jsonb_subscript; + +update test_jsonb_subscript set test_json[-4] = '1'; +select * from test_jsonb_subscript; + +update test_jsonb_subscript set test_json[-8] = '1'; +select * from test_jsonb_subscript; + +-- keep consistent values position +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '[]'); + +update test_jsonb_subscript set test_json[5] = '1'; +select * from test_jsonb_subscript; + +-- create the whole path +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json['a'][0]['b'][0]['c'] = '1'; +select * from test_jsonb_subscript; + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json['a'][2]['b'][2]['c'][2] = '1'; +select * from test_jsonb_subscript; + +-- create the whole path with already existing keys +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{"b": 1}'); +update test_jsonb_subscript set test_json['a'][0] = '2'; +select * from test_jsonb_subscript; + +-- the start jsonb is an object, first subscript is treated as a key +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json[0]['a'] = '1'; +select * from test_jsonb_subscript; + +-- the start jsonb is an array +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '[]'); +update test_jsonb_subscript set test_json[0]['a'] = '1'; +update test_jsonb_subscript set test_json[2]['b'] = '2'; +select * from test_jsonb_subscript; + +-- overwriting an existing path +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json['a']['b'][1] = '1'; +update test_jsonb_subscript set test_json['a']['b'][10] = '1'; +select * from test_jsonb_subscript; + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '[]'); +update test_jsonb_subscript set test_json[0][0][0] = '1'; +update test_jsonb_subscript set test_json[0][0][1] = '1'; +select * from test_jsonb_subscript; + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{}'); +update test_jsonb_subscript set test_json['a']['b'][10] = '1'; +update test_jsonb_subscript set test_json['a'][10][10] = '1'; +select * from test_jsonb_subscript; + +-- an empty sub element + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{"a": {}}'); +update test_jsonb_subscript set test_json['a']['b']['c'][2] = '1'; +select * from test_jsonb_subscript; + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{"a": []}'); +update test_jsonb_subscript set test_json['a'][1]['c'][2] = '1'; +select * from test_jsonb_subscript; + +-- trying replace assuming a composite object, but it's an element or a value + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, '{"a": 1}'); +update test_jsonb_subscript set test_json['a']['b'] = '1'; +update test_jsonb_subscript set test_json['a']['b']['c'] = '1'; +update test_jsonb_subscript set test_json['a'][0] = '1'; +update test_jsonb_subscript set test_json['a'][0]['c'] = '1'; +update test_jsonb_subscript set test_json['a'][0][0] = '1'; + +-- trying replace assuming a composite object, but it's a raw scalar + +delete from test_jsonb_subscript; +insert into test_jsonb_subscript values (1, 'null'); +update test_jsonb_subscript set test_json[0] = '1'; +update test_jsonb_subscript set test_json[0][0] = '1'; + +-- jsonb to tsvector +select to_tsvector('{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::jsonb); + +-- jsonb to tsvector with config +select to_tsvector('simple', '{"a": "aaa bbb ddd ccc", "b": ["eee fff ggg"], "c": {"d": "hhh iii"}}'::jsonb); + +-- jsonb to tsvector with stop words +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": ["the eee fff ggg"], "c": {"d": "hhh. iii"}}'::jsonb); + +-- jsonb to tsvector with numeric values +select to_tsvector('english', '{"a": "aaa in bbb ddd ccc", "b": 123, "c": 456}'::jsonb); + +-- jsonb_to_tsvector +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"all"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"key"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"string"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"numeric"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '"boolean"'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["string", "numeric"]'); + +-- to_tsvector corner cases +select to_tsvector('""'::jsonb); +select to_tsvector('{}'::jsonb); +select to_tsvector('[]'::jsonb); +select to_tsvector('null'::jsonb); + +-- jsonb_to_tsvector corner cases +select jsonb_to_tsvector('""'::jsonb, '"all"'); +select jsonb_to_tsvector('{}'::jsonb, '"all"'); +select jsonb_to_tsvector('[]'::jsonb, '"all"'); +select jsonb_to_tsvector('null'::jsonb, '"all"'); + +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '""'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '{}'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '[]'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, 'null'); +select jsonb_to_tsvector('english', '{"a": "aaa in bbb", "b": 123, "c": 456, "d": true, "f": false, "g": null}'::jsonb, '["all", null]'); + +-- ts_headline for jsonb +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh')); +select ts_headline('{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); +select ts_headline('english', '{"a": "aaa bbb", "b": {"c": "ccc ddd fff", "c1": "ccc1 ddd1"}, "d": ["ggg hhh", "iii jjj"]}'::jsonb, tsquery('bbb & ddd & hhh'), 'StartSel = <, StopSel = >'); + +-- corner cases for ts_headline with jsonb +select ts_headline('null'::jsonb, tsquery('aaa & bbb')); +select ts_headline('{}'::jsonb, tsquery('aaa & bbb')); +select ts_headline('[]'::jsonb, tsquery('aaa & bbb')); + +-- casts +select 'true'::jsonb::bool; +select '[]'::jsonb::bool; +select '1.0'::jsonb::float; +select '[1.0]'::jsonb::float; +select '12345'::jsonb::int4; +select '"hello"'::jsonb::int4; +select '12345'::jsonb::numeric; +select '{}'::jsonb::numeric; +select '12345.05'::jsonb::numeric; +select '12345.05'::jsonb::float4; +select '12345.05'::jsonb::float8; +select '12345.05'::jsonb::int2; +select '12345.05'::jsonb::int4; +select '12345.05'::jsonb::int8; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::numeric; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float4; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::float8; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int2; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int4; +select '12345.0000000000000000000000000000000000000000000005'::jsonb::int8; diff --git a/src/test/singlenode_regress/sql/jsonb_jsonpath.sql b/src/test/singlenode_regress/sql/jsonb_jsonpath.sql new file mode 100644 index 00000000000..60f73cb0590 --- /dev/null +++ b/src/test/singlenode_regress/sql/jsonb_jsonpath.sql @@ -0,0 +1,587 @@ +select jsonb '{"a": 12}' @? '$'; +select jsonb '{"a": 12}' @? '1'; +select jsonb '{"a": 12}' @? '$.a.b'; +select jsonb '{"a": 12}' @? '$.b'; +select jsonb '{"a": 12}' @? '$.a + 2'; +select jsonb '{"a": 12}' @? '$.b + 2'; +select jsonb '{"a": {"a": 12}}' @? '$.a.a'; +select jsonb '{"a": {"a": 12}}' @? '$.*.a'; +select jsonb '{"b": {"a": 12}}' @? '$.*.a'; +select jsonb '{"b": {"a": 12}}' @? '$.*.b'; +select jsonb '{"b": {"a": 12}}' @? 'strict $.*.b'; +select jsonb '{}' @? '$.*'; +select jsonb '{"a": 1}' @? '$.*'; +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{1}'; +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{2}'; +select jsonb '{"a": {"b": 1}}' @? 'lax $.**{3}'; +select jsonb '[]' @? '$[*]'; +select jsonb '[1]' @? '$[*]'; +select jsonb '[1]' @? '$[1]'; +select jsonb '[1]' @? 'strict $[1]'; +select jsonb_path_query('[1]', 'strict $[1]'); +select jsonb_path_query('[1]', 'strict $[1]', silent => true); +select jsonb '[1]' @? 'lax $[10000000000000000]'; +select jsonb '[1]' @? 'strict $[10000000000000000]'; +select jsonb_path_query('[1]', 'lax $[10000000000000000]'); +select jsonb_path_query('[1]', 'strict $[10000000000000000]'); +select jsonb '[1]' @? '$[0]'; +select jsonb '[1]' @? '$[0.3]'; +select jsonb '[1]' @? '$[0.5]'; +select jsonb '[1]' @? '$[0.9]'; +select jsonb '[1]' @? '$[1.2]'; +select jsonb '[1]' @? 'strict $[1.2]'; +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] > @.b[*])'; +select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] >= @.b[*])'; +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? '$ ? (@.a[*] >= @.b[*])'; +select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? 'strict $ ? (@.a[*] >= @.b[*])'; +select jsonb '{"a": [1,2,3], "b": [3,4,null]}' @? '$ ? (@.a[*] >= @.b[*])'; +select jsonb '1' @? '$ ? ((@ == "1") is unknown)'; +select jsonb '1' @? '$ ? ((@ == 1) is unknown)'; +select jsonb '[{"a": 1}, {"a": 2}]' @? '$[0 to 1] ? (@.a > 1)'; + +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => false); +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => true); +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => false); +select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => true); + +select jsonb_path_query('1', 'lax $.a'); +select jsonb_path_query('1', 'strict $.a'); +select jsonb_path_query('1', 'strict $.*'); +select jsonb_path_query('1', 'strict $.a', silent => true); +select jsonb_path_query('1', 'strict $.*', silent => true); +select jsonb_path_query('[]', 'lax $.a'); +select jsonb_path_query('[]', 'strict $.a'); +select jsonb_path_query('[]', 'strict $.a', silent => true); +select jsonb_path_query('{}', 'lax $.a'); +select jsonb_path_query('{}', 'strict $.a'); +select jsonb_path_query('{}', 'strict $.a', silent => true); + +select jsonb_path_query('1', 'strict $[1]'); +select jsonb_path_query('1', 'strict $[*]'); +select jsonb_path_query('[]', 'strict $[1]'); +select jsonb_path_query('[]', 'strict $["a"]'); +select jsonb_path_query('1', 'strict $[1]', silent => true); +select jsonb_path_query('1', 'strict $[*]', silent => true); +select jsonb_path_query('[]', 'strict $[1]', silent => true); +select jsonb_path_query('[]', 'strict $["a"]', silent => true); + +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.a'); +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.b'); +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.*'); +select jsonb_path_query('{"a": 12, "b": {"a": 13}}', 'lax $.*.a'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].a'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].*'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0].a'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[1].a'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[2].a'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0,1].a'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10].a'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10 / 0].a'); +select jsonb_path_query('[12, {"a": 13}, {"b": 14}, "ccc", true]', '$[2.5 - 1 to $.size() - 2]'); +select jsonb_path_query('1', 'lax $[0]'); +select jsonb_path_query('1', 'lax $[*]'); +select jsonb_path_query('[1]', 'lax $[0]'); +select jsonb_path_query('[1]', 'lax $[*]'); +select jsonb_path_query('[1,2,3]', 'lax $[*]'); +select jsonb_path_query('[1,2,3]', 'strict $[*].a'); +select jsonb_path_query('[1,2,3]', 'strict $[*].a', silent => true); +select jsonb_path_query('[]', '$[last]'); +select jsonb_path_query('[]', '$[last ? (exists(last))]'); +select jsonb_path_query('[]', 'strict $[last]'); +select jsonb_path_query('[]', 'strict $[last]', silent => true); +select jsonb_path_query('[1]', '$[last]'); +select jsonb_path_query('[1,2,3]', '$[last]'); +select jsonb_path_query('[1,2,3]', '$[last - 1]'); +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "number")]'); +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]'); +select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]', silent => true); + +select * from jsonb_path_query('{"a": 10}', '$'); +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)'); +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '1'); +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '[{"value" : 13}]'); +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 13}'); +select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 8}'); +select * from jsonb_path_query('{"a": 10}', '$.a ? (@ < $value)', '{"value" : 13}'); +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[*] ? (@ < $value)', '{"value" : 13}'); +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0,1] ? (@ < $x.value)', '{"x": {"value" : 13}}'); +select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0 to 2] ? (@ < $value)', '{"value" : 15}'); +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == "1")'); +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : "1"}'); +select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : null}'); +select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ != null)'); +select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ == null)'); +select * from jsonb_path_query('{}', '$ ? (@ == @)'); +select * from jsonb_path_query('[]', 'strict $ ? (@ == @)'); + +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2}'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2 to last}'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{3 to last}'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{last}'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to 2}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0 to last}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to last}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to 2}.b ? (@ > 0)'); +select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{2 to 3}.b ? (@ > 0)'); + +select jsonb '{"a": {"b": 1}}' @? '$.**.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{0}.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{1}.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{0 to last}.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to last}.b ? ( @ > 0)'; +select jsonb '{"a": {"b": 1}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0 to last}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to last}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to 2}.b ? ( @ > 0)'; +select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{2 to 3}.b ? ( @ > 0)'; + +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x))'); +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.y))'); +select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x ? (@ >= 2) ))'); +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x))'); +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x + "3"))'); +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? ((exists (@.x + "3")) is unknown)'); +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? (exists (@.x))'); +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? ((exists (@.x)) is unknown)'); +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? (exists (@[*].x))'); +select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? ((exists (@[*].x)) is unknown)'); + +--test ternary logic +select + x, y, + jsonb_path_query( + '[true, false, null]', + '$[*] ? (@ == true && ($x == true && $y == true) || + @ == false && !($x == true && $y == true) || + @ == null && ($x == true && $y == true) is unknown)', + jsonb_build_object('x', x, 'y', y) + ) as "x && y" +from + (values (jsonb 'true'), ('false'), ('"null"')) x(x), + (values (jsonb 'true'), ('false'), ('"null"')) y(y); + +select + x, y, + jsonb_path_query( + '[true, false, null]', + '$[*] ? (@ == true && ($x == true || $y == true) || + @ == false && !($x == true || $y == true) || + @ == null && ($x == true || $y == true) is unknown)', + jsonb_build_object('x', x, 'y', y) + ) as "x || y" +from + (values (jsonb 'true'), ('false'), ('"null"')) x(x), + (values (jsonb 'true'), ('false'), ('"null"')) y(y); + +select jsonb '{"a": 1, "b":1}' @? '$ ? (@.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$ ? (@.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? (@.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? ($.c.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.* ? (@.a == @.b)'; +select jsonb '{"a": 1, "b":1}' @? '$.** ? (@.a == @.b)'; +select jsonb '{"c": {"a": 1, "b":1}}' @? '$.** ? (@.a == @.b)'; + +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == 1 + 1)'); +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (1 + 1))'); +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == @.b + 1)'); +select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (@.b + 1))'); +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - 1)'; +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -1)'; +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -@.b)'; +select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - @.b)'; +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - @.b)'; +select jsonb '{"c": {"a": 2, "b":1}}' @? '$.** ? (@.a == 1 - - @.b)'; +select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - +@.b)'; +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +2)'; +select jsonb '[1,2,3]' @? '$ ? (+@[*] > +3)'; +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -2)'; +select jsonb '[1,2,3]' @? '$ ? (-@[*] < -3)'; +select jsonb '1' @? '$ ? ($ > 0)'; + +-- arithmetic errors +select jsonb_path_query('[1,2,0,3]', '$[*] ? (2 / @ > 0)'); +select jsonb_path_query('[1,2,0,3]', '$[*] ? ((2 / @ > 0) is unknown)'); +select jsonb_path_query('0', '1 / $'); +select jsonb_path_query('0', '1 / $ + 2'); +select jsonb_path_query('0', '-(3 + 1 % $)'); +select jsonb_path_query('1', '$ + "2"'); +select jsonb_path_query('[1, 2]', '3 * $'); +select jsonb_path_query('"a"', '-$'); +select jsonb_path_query('[1,"2",3]', '+$'); +select jsonb_path_query('1', '$ + "2"', silent => true); +select jsonb_path_query('[1, 2]', '3 * $', silent => true); +select jsonb_path_query('"a"', '-$', silent => true); +select jsonb_path_query('[1,"2",3]', '+$', silent => true); +select jsonb '["1",2,0,3]' @? '-$[*]'; +select jsonb '[1,"2",0,3]' @? '-$[*]'; +select jsonb '["1",2,0,3]' @? 'strict -$[*]'; +select jsonb '[1,"2",0,3]' @? 'strict -$[*]'; + +-- unwrapping of operator arguments in lax mode +select jsonb_path_query('{"a": [2]}', 'lax $.a * 3'); +select jsonb_path_query('{"a": [2]}', 'lax $.a + 3'); +select jsonb_path_query('{"a": [2, 3, 4]}', 'lax -$.a'); +-- should fail +select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3'); +select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3', silent => true); + +-- extension: boolean expressions +select jsonb_path_query('2', '$ > 1'); +select jsonb_path_query('2', '$ <= 1'); +select jsonb_path_query('2', '$ == "2"'); +select jsonb '2' @? '$ == "2"'; + +select jsonb '2' @@ '$ > 1'; +select jsonb '2' @@ '$ <= 1'; +select jsonb '2' @@ '$ == "2"'; +select jsonb '2' @@ '1'; +select jsonb '{}' @@ '$'; +select jsonb '[]' @@ '$'; +select jsonb '[1,2,3]' @@ '$[*]'; +select jsonb '[]' @@ '$[*]'; +select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] > $x) [1]', '{"x": 1}'); +select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] < $x) [1]', '{"x": 2}'); + +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => false); +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => true); +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => false); +select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => true); + + +select jsonb_path_query('[null,1,true,"a",[],{}]', '$.type()'); +select jsonb_path_query('[null,1,true,"a",[],{}]', 'lax $.type()'); +select jsonb_path_query('[null,1,true,"a",[],{}]', '$[*].type()'); +select jsonb_path_query('null', 'null.type()'); +select jsonb_path_query('null', 'true.type()'); +select jsonb_path_query('null', '(123).type()'); +select jsonb_path_query('null', '"123".type()'); + +select jsonb_path_query('{"a": 2}', '($.a - 5).abs() + 10'); +select jsonb_path_query('{"a": 2.5}', '-($.a * $.a).floor() % 4.3'); +select jsonb_path_query('[1, 2, 3]', '($[*] > 2) ? (@ == true)'); +select jsonb_path_query('[1, 2, 3]', '($[*] > 3).type()'); +select jsonb_path_query('[1, 2, 3]', '($[*].a > 3).type()'); +select jsonb_path_query('[1, 2, 3]', 'strict ($[*].a > 3).type()'); + +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()'); +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()', silent => true); +select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'lax $[*].size()'); + +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].abs()'); +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].floor()'); +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling()'); +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs()'); +select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs().type()'); + +select jsonb_path_query('[{},1]', '$[*].keyvalue()'); +select jsonb_path_query('[{},1]', '$[*].keyvalue()', silent => true); +select jsonb_path_query('{}', '$.keyvalue()'); +select jsonb_path_query('{"a": 1, "b": [1, 2], "c": {"a": "bbb"}}', '$.keyvalue()'); +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', '$[*].keyvalue()'); +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue()'); +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'lax $.keyvalue()'); +select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue().a'); +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue()'; +select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue().key'; + +select jsonb_path_query('null', '$.double()'); +select jsonb_path_query('true', '$.double()'); +select jsonb_path_query('null', '$.double()', silent => true); +select jsonb_path_query('true', '$.double()', silent => true); +select jsonb_path_query('[]', '$.double()'); +select jsonb_path_query('[]', 'strict $.double()'); +select jsonb_path_query('{}', '$.double()'); +select jsonb_path_query('[]', 'strict $.double()', silent => true); +select jsonb_path_query('{}', '$.double()', silent => true); +select jsonb_path_query('1.23', '$.double()'); +select jsonb_path_query('"1.23"', '$.double()'); +select jsonb_path_query('"1.23aaa"', '$.double()'); +select jsonb_path_query('1e1000', '$.double()'); +select jsonb_path_query('"nan"', '$.double()'); +select jsonb_path_query('"NaN"', '$.double()'); +select jsonb_path_query('"inf"', '$.double()'); +select jsonb_path_query('"-inf"', '$.double()'); +select jsonb_path_query('"inf"', '$.double()', silent => true); +select jsonb_path_query('"-inf"', '$.double()', silent => true); + +select jsonb_path_query('{}', '$.abs()'); +select jsonb_path_query('true', '$.floor()'); +select jsonb_path_query('"1.2"', '$.ceiling()'); +select jsonb_path_query('{}', '$.abs()', silent => true); +select jsonb_path_query('true', '$.floor()', silent => true); +select jsonb_path_query('"1.2"', '$.ceiling()', silent => true); + +select jsonb_path_query('["", "a", "abc", "abcabc"]', '$[*] ? (@ starts with "abc")'); +select jsonb_path_query('["", "a", "abc", "abcabc"]', 'strict $ ? (@[*] starts with "abc")'); +select jsonb_path_query('["", "a", "abd", "abdabc"]', 'strict $ ? (@[*] starts with "abc")'); +select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? (@[*] starts with "abc")'); +select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? ((@[*] starts with "abc") is unknown)'); +select jsonb_path_query('[[null, 1, "abc", "abcabc"]]', 'lax $ ? (@[*] starts with "abc")'); +select jsonb_path_query('[[null, 1, "abd", "abdabc"]]', 'lax $ ? ((@[*] starts with "abc") is unknown)'); +select jsonb_path_query('[null, 1, "abd", "abdabc"]', 'lax $[*] ? ((@ starts with "abc") is unknown)'); + +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c")'); +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "i")'); +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "m")'); +select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "s")'); +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "q")'); +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "")'); +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "q")'); +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "q")'); +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "iq")'); +select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "")'); + +select jsonb_path_query('null', '$.datetime()'); +select jsonb_path_query('true', '$.datetime()'); +select jsonb_path_query('1', '$.datetime()'); +select jsonb_path_query('[]', '$.datetime()'); +select jsonb_path_query('[]', 'strict $.datetime()'); +select jsonb_path_query('{}', '$.datetime()'); +select jsonb_path_query('"bogus"', '$.datetime()'); +select jsonb_path_query('"12:34"', '$.datetime("aaa")'); +select jsonb_path_query('"aaaa"', '$.datetime("HH24")'); + +select jsonb '"10-03-2017"' @? '$.datetime("dd-mm-yyyy")'; +select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy")'); +select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy").type()'); +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy")'); +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy").type()'); + +select jsonb_path_query('"10-03-2017 12:34"', ' $.datetime("dd-mm-yyyy HH24:MI").type()'); +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM").type()'); +select jsonb_path_query('"12:34:56"', '$.datetime("HH24:MI:SS").type()'); +select jsonb_path_query('"12:34:56 +05:20"', '$.datetime("HH24:MI:SS TZH:TZM").type()'); + +select jsonb_path_query('"10-03-2017T12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); +select jsonb_path_query('"10-03-2017t12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); +select jsonb_path_query('"10-03-2017 12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); + +set time zone '+00'; + +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); +select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")'); +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")'); +select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")'); +select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")'); +select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")'); +select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); + +set time zone '+10'; + +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); +select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); +select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); +select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")'); +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")'); +select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")'); +select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")'); +select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")'); +select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")'); +select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); + +set time zone default; + +select jsonb_path_query('"2017-03-10"', '$.datetime().type()'); +select jsonb_path_query('"2017-03-10"', '$.datetime()'); +select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime().type()'); +select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime()'); +select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime().type()'); +select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime()'); +select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime().type()'); +select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime()'); +select jsonb_path_query('"2017-03-10T12:34:56+3:10"', '$.datetime()'); +select jsonb_path_query('"2017-03-10t12:34:56+3:10"', '$.datetime()'); +select jsonb_path_query('"12:34:56"', '$.datetime().type()'); +select jsonb_path_query('"12:34:56"', '$.datetime()'); +select jsonb_path_query('"12:34:56+3"', '$.datetime().type()'); +select jsonb_path_query('"12:34:56+3"', '$.datetime()'); +select jsonb_path_query('"12:34:56+3:10"', '$.datetime().type()'); +select jsonb_path_query('"12:34:56+3:10"', '$.datetime()'); + +set time zone '+00'; + +-- date comparison +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))'); +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))'); +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); + +-- time comparison +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))'); +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))'); +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))'); + +-- timetz comparison +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))'); +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))'); +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))'); + +-- timestamp comparison +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); + +-- timestamptz comparison +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', + '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); + +-- overflow during comparison +select jsonb_path_query('"1000000-01-01"', '$.datetime() > "2020-01-01 12:00:00".datetime()'::jsonpath); + +set time zone default; + +-- jsonpath operators + +SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*]'); +SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*] ? (@.a > 10)'); + +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a'); +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}'); +SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}'); + +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a'); +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a', silent => true); +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a'); +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)'); +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)'); +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}'); +SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}'); + +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*].a ? (@ > 1)'; +SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*] ? (@.a > 2)'; +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 1)'); +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 1, "max": 4}'); +SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 3, "max": 4}'); + +SELECT jsonb_path_match('true', '$', silent => false); +SELECT jsonb_path_match('false', '$', silent => false); +SELECT jsonb_path_match('null', '$', silent => false); +SELECT jsonb_path_match('1', '$', silent => true); +SELECT jsonb_path_match('1', '$', silent => false); +SELECT jsonb_path_match('"a"', '$', silent => false); +SELECT jsonb_path_match('{}', '$', silent => false); +SELECT jsonb_path_match('[true]', '$', silent => false); +SELECT jsonb_path_match('{}', 'lax $.a', silent => false); +SELECT jsonb_path_match('{}', 'strict $.a', silent => false); +SELECT jsonb_path_match('{}', 'strict $.a', silent => true); +SELECT jsonb_path_match('[true, true]', '$[*]', silent => false); +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 1'; +SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 2'; +SELECT jsonb_path_match('[{"a": 1}, {"a": 2}]', '$[*].a > 1'); + +-- test string comparison (Unicode codepoint collation) +WITH str(j, num) AS +( + SELECT jsonb_build_object('s', s), num + FROM unnest('{"", "a", "ab", "abc", "abcd", "b", "A", "AB", "ABC", "ABc", "ABcD", "B"}'::text[]) WITH ORDINALITY AS a(s, num) +) +SELECT + s1.j, s2.j, + jsonb_path_query_first(s1.j, '$.s < $s', vars => s2.j) lt, + jsonb_path_query_first(s1.j, '$.s <= $s', vars => s2.j) le, + jsonb_path_query_first(s1.j, '$.s == $s', vars => s2.j) eq, + jsonb_path_query_first(s1.j, '$.s >= $s', vars => s2.j) ge, + jsonb_path_query_first(s1.j, '$.s > $s', vars => s2.j) gt +FROM str s1, str s2 +ORDER BY s1.num, s2.num; diff --git a/src/test/singlenode_regress/sql/jsonpath.sql b/src/test/singlenode_regress/sql/jsonpath.sql new file mode 100644 index 00000000000..17ab7757831 --- /dev/null +++ b/src/test/singlenode_regress/sql/jsonpath.sql @@ -0,0 +1,181 @@ +--jsonpath io + +select ''::jsonpath; +select '$'::jsonpath; +select 'strict $'::jsonpath; +select 'lax $'::jsonpath; +select '$.a'::jsonpath; +select '$.a.v'::jsonpath; +select '$.a.*'::jsonpath; +select '$.*[*]'::jsonpath; +select '$.a[*]'::jsonpath; +select '$.a[*][*]'::jsonpath; +select '$[*]'::jsonpath; +select '$[0]'::jsonpath; +select '$[*][0]'::jsonpath; +select '$[*].a'::jsonpath; +select '$[*][0].a.b'::jsonpath; +select '$.a.**.b'::jsonpath; +select '$.a.**{2}.b'::jsonpath; +select '$.a.**{2 to 2}.b'::jsonpath; +select '$.a.**{2 to 5}.b'::jsonpath; +select '$.a.**{0 to 5}.b'::jsonpath; +select '$.a.**{5 to last}.b'::jsonpath; +select '$.a.**{last}.b'::jsonpath; +select '$.a.**{last to 5}.b'::jsonpath; +select '$+1'::jsonpath; +select '$-1'::jsonpath; +select '$--+1'::jsonpath; +select '$.a/+-1'::jsonpath; +select '1 * 2 + 4 % -3 != false'::jsonpath; + +select '"\b\f\r\n\t\v\"\''\\"'::jsonpath; +select '"\x50\u0067\u{53}\u{051}\u{00004C}"'::jsonpath; +select '$.foo\x50\u0067\u{53}\u{051}\u{00004C}\t\"bar'::jsonpath; +select '"\z"'::jsonpath; -- unrecognized escape is just the literal char + +select '$.g ? ($.a == 1)'::jsonpath; +select '$.g ? (@ == 1)'::jsonpath; +select '$.g ? (@.a == 1)'::jsonpath; +select '$.g ? (@.a == 1 || @.a == 4)'::jsonpath; +select '$.g ? (@.a == 1 && @.a == 4)'::jsonpath; +select '$.g ? (@.a == 1 || @.a == 4 && @.b == 7)'::jsonpath; +select '$.g ? (@.a == 1 || !(@.a == 4) && @.b == 7)'::jsonpath; +select '$.g ? (@.a == 1 || !(@.x >= 123 || @.a == 4) && @.b == 7)'::jsonpath; +select '$.g ? (@.x >= @[*]?(@.a > "abc"))'::jsonpath; +select '$.g ? ((@.x >= 123 || @.a == 4) is unknown)'::jsonpath; +select '$.g ? (exists (@.x))'::jsonpath; +select '$.g ? (exists (@.x ? (@ == 14)))'::jsonpath; +select '$.g ? ((@.x >= 123 || @.a == 4) && exists (@.x ? (@ == 14)))'::jsonpath; +select '$.g ? (+@.x >= +-(+@.a + 2))'::jsonpath; + +select '$a'::jsonpath; +select '$a.b'::jsonpath; +select '$a[*]'::jsonpath; +select '$.g ? (@.zip == $zip)'::jsonpath; +select '$.a[1,2, 3 to 16]'::jsonpath; +select '$.a[$a + 1, ($b[*]) to -($[0] * 2)]'::jsonpath; +select '$.a[$.a.size() - 3]'::jsonpath; +select 'last'::jsonpath; +select '"last"'::jsonpath; +select '$.last'::jsonpath; +select '$ ? (last > 0)'::jsonpath; +select '$[last]'::jsonpath; +select '$[$[0] ? (last > 0)]'::jsonpath; + +select 'null.type()'::jsonpath; +select '1.type()'::jsonpath; +select '(1).type()'::jsonpath; +select '1.2.type()'::jsonpath; +select '"aaa".type()'::jsonpath; +select 'true.type()'::jsonpath; +select '$.double().floor().ceiling().abs()'::jsonpath; +select '$.keyvalue().key'::jsonpath; +select '$.datetime()'::jsonpath; +select '$.datetime("datetime template")'::jsonpath; + +select '$ ? (@ starts with "abc")'::jsonpath; +select '$ ? (@ starts with $var)'::jsonpath; + +select '$ ? (@ like_regex "(invalid pattern")'::jsonpath; +select '$ ? (@ like_regex "pattern")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "i")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "is")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "isim")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "xsms")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "q")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "iq")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "smixq")'::jsonpath; +select '$ ? (@ like_regex "pattern" flag "a")'::jsonpath; + +select '$ < 1'::jsonpath; +select '($ < 1) || $.a.b <= $x'::jsonpath; +select '@ + 1'::jsonpath; + +select '($).a.b'::jsonpath; +select '($.a.b).c.d'::jsonpath; +select '($.a.b + -$.x.y).c.d'::jsonpath; +select '(-+$.a.b).c.d'::jsonpath; +select '1 + ($.a.b + 2).c.d'::jsonpath; +select '1 + ($.a.b > 2).c.d'::jsonpath; +select '($)'::jsonpath; +select '(($))'::jsonpath; +select '((($ + 1)).a + ((2)).b ? ((((@ > 1)) || (exists(@.c)))))'::jsonpath; + +select '$ ? (@.a < 1)'::jsonpath; +select '$ ? (@.a < -1)'::jsonpath; +select '$ ? (@.a < +1)'::jsonpath; +select '$ ? (@.a < .1)'::jsonpath; +select '$ ? (@.a < -.1)'::jsonpath; +select '$ ? (@.a < +.1)'::jsonpath; +select '$ ? (@.a < 0.1)'::jsonpath; +select '$ ? (@.a < -0.1)'::jsonpath; +select '$ ? (@.a < +0.1)'::jsonpath; +select '$ ? (@.a < 10.1)'::jsonpath; +select '$ ? (@.a < -10.1)'::jsonpath; +select '$ ? (@.a < +10.1)'::jsonpath; +select '$ ? (@.a < 1e1)'::jsonpath; +select '$ ? (@.a < -1e1)'::jsonpath; +select '$ ? (@.a < +1e1)'::jsonpath; +select '$ ? (@.a < .1e1)'::jsonpath; +select '$ ? (@.a < -.1e1)'::jsonpath; +select '$ ? (@.a < +.1e1)'::jsonpath; +select '$ ? (@.a < 0.1e1)'::jsonpath; +select '$ ? (@.a < -0.1e1)'::jsonpath; +select '$ ? (@.a < +0.1e1)'::jsonpath; +select '$ ? (@.a < 10.1e1)'::jsonpath; +select '$ ? (@.a < -10.1e1)'::jsonpath; +select '$ ? (@.a < +10.1e1)'::jsonpath; +select '$ ? (@.a < 1e-1)'::jsonpath; +select '$ ? (@.a < -1e-1)'::jsonpath; +select '$ ? (@.a < +1e-1)'::jsonpath; +select '$ ? (@.a < .1e-1)'::jsonpath; +select '$ ? (@.a < -.1e-1)'::jsonpath; +select '$ ? (@.a < +.1e-1)'::jsonpath; +select '$ ? (@.a < 0.1e-1)'::jsonpath; +select '$ ? (@.a < -0.1e-1)'::jsonpath; +select '$ ? (@.a < +0.1e-1)'::jsonpath; +select '$ ? (@.a < 10.1e-1)'::jsonpath; +select '$ ? (@.a < -10.1e-1)'::jsonpath; +select '$ ? (@.a < +10.1e-1)'::jsonpath; +select '$ ? (@.a < 1e+1)'::jsonpath; +select '$ ? (@.a < -1e+1)'::jsonpath; +select '$ ? (@.a < +1e+1)'::jsonpath; +select '$ ? (@.a < .1e+1)'::jsonpath; +select '$ ? (@.a < -.1e+1)'::jsonpath; +select '$ ? (@.a < +.1e+1)'::jsonpath; +select '$ ? (@.a < 0.1e+1)'::jsonpath; +select '$ ? (@.a < -0.1e+1)'::jsonpath; +select '$ ? (@.a < +0.1e+1)'::jsonpath; +select '$ ? (@.a < 10.1e+1)'::jsonpath; +select '$ ? (@.a < -10.1e+1)'::jsonpath; +select '$ ? (@.a < +10.1e+1)'::jsonpath; + +select '0'::jsonpath; +select '00'::jsonpath; +select '0.0'::jsonpath; +select '0.000'::jsonpath; +select '0.000e1'::jsonpath; +select '0.000e2'::jsonpath; +select '0.000e3'::jsonpath; +select '0.0010'::jsonpath; +select '0.0010e-1'::jsonpath; +select '0.0010e+1'::jsonpath; +select '0.0010e+2'::jsonpath; +select '1e'::jsonpath; +select '1.e'::jsonpath; +select '1.2e'::jsonpath; +select '1.2.e'::jsonpath; +select '(1.2).e'::jsonpath; +select '1e3'::jsonpath; +select '1.e3'::jsonpath; +select '1.e3.e'::jsonpath; +select '1.e3.e4'::jsonpath; +select '1.2e3'::jsonpath; +select '1.2.e3'::jsonpath; +select '(1.2).e3'::jsonpath; +select '1..e'::jsonpath; +select '1..e3'::jsonpath; +select '(1.).e'::jsonpath; +select '(1.).e3'::jsonpath; diff --git a/src/test/singlenode_regress/sql/jsonpath_encoding.sql b/src/test/singlenode_regress/sql/jsonpath_encoding.sql new file mode 100644 index 00000000000..55d9e30b95c --- /dev/null +++ b/src/test/singlenode_regress/sql/jsonpath_encoding.sql @@ -0,0 +1,59 @@ +-- +-- encoding-sensitive tests for jsonpath +-- + +-- We provide expected-results files for UTF8 (jsonpath_encoding.out) +-- and for SQL_ASCII (jsonpath_encoding_1.out). Skip otherwise. +SELECT getdatabaseencoding() NOT IN ('UTF8', 'SQL_ASCII') + AS skip_test \gset +\if :skip_test +\quit +\endif + +SELECT getdatabaseencoding(); -- just to label the results files + +-- checks for double-quoted values + +-- basic unicode input +SELECT '"\u"'::jsonpath; -- ERROR, incomplete escape +SELECT '"\u00"'::jsonpath; -- ERROR, incomplete escape +SELECT '"\u000g"'::jsonpath; -- ERROR, g is not a hex digit +SELECT '"\u0000"'::jsonpath; -- OK, legal escape +SELECT '"\uaBcD"'::jsonpath; -- OK, uppercase and lower case both OK + +-- handling of unicode surrogate pairs +select '"\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_utf8; +select '"\ud83d\ud83d"'::jsonpath; -- 2 high surrogates in a row +select '"\ude04\ud83d"'::jsonpath; -- surrogates in wrong order +select '"\ud83dX"'::jsonpath; -- orphan high surrogate +select '"\ude04X"'::jsonpath; -- orphan low surrogate + +--handling of simple unicode escapes +select '"the Copyright \u00a9 sign"'::jsonpath as correct_in_utf8; +select '"dollar \u0024 character"'::jsonpath as correct_everywhere; +select '"dollar \\u0024 character"'::jsonpath as not_an_escape; +select '"null \u0000 escape"'::jsonpath as not_unescaped; +select '"null \\u0000 escape"'::jsonpath as not_an_escape; + +-- checks for quoted key names + +-- basic unicode input +SELECT '$."\u"'::jsonpath; -- ERROR, incomplete escape +SELECT '$."\u00"'::jsonpath; -- ERROR, incomplete escape +SELECT '$."\u000g"'::jsonpath; -- ERROR, g is not a hex digit +SELECT '$."\u0000"'::jsonpath; -- OK, legal escape +SELECT '$."\uaBcD"'::jsonpath; -- OK, uppercase and lower case both OK + +-- handling of unicode surrogate pairs +select '$."\ud83d\ude04\ud83d\udc36"'::jsonpath as correct_in_utf8; +select '$."\ud83d\ud83d"'::jsonpath; -- 2 high surrogates in a row +select '$."\ude04\ud83d"'::jsonpath; -- surrogates in wrong order +select '$."\ud83dX"'::jsonpath; -- orphan high surrogate +select '$."\ude04X"'::jsonpath; -- orphan low surrogate + +--handling of simple unicode escapes +select '$."the Copyright \u00a9 sign"'::jsonpath as correct_in_utf8; +select '$."dollar \u0024 character"'::jsonpath as correct_everywhere; +select '$."dollar \\u0024 character"'::jsonpath as not_an_escape; +select '$."null \u0000 escape"'::jsonpath as not_unescaped; +select '$."null \\u0000 escape"'::jsonpath as not_an_escape; diff --git a/src/test/singlenode_regress/sql/limit.sql b/src/test/singlenode_regress/sql/limit.sql new file mode 100644 index 00000000000..e47b3f9bf29 --- /dev/null +++ b/src/test/singlenode_regress/sql/limit.sql @@ -0,0 +1,209 @@ +-- +-- LIMIT +-- Check the LIMIT/OFFSET feature of SELECT +-- + +SELECT ''::text AS two, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 50 + ORDER BY unique1 LIMIT 2; +SELECT ''::text AS five, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 60 + ORDER BY unique1 LIMIT 5; +SELECT ''::text AS two, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 60 AND unique1 < 63 + ORDER BY unique1 LIMIT 5; +SELECT ''::text AS three, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 100 + ORDER BY unique1 LIMIT 3 OFFSET 20; +SELECT ''::text AS zero, unique1, unique2, stringu1 + FROM onek WHERE unique1 < 50 + ORDER BY unique1 DESC LIMIT 8 OFFSET 99; +SELECT ''::text AS eleven, unique1, unique2, stringu1 + FROM onek WHERE unique1 < 50 + ORDER BY unique1 DESC LIMIT 20 OFFSET 39; +SELECT ''::text AS ten, unique1, unique2, stringu1 + FROM onek + ORDER BY unique1 OFFSET 990; +SELECT ''::text AS five, unique1, unique2, stringu1 + FROM onek + ORDER BY unique1 OFFSET 990 LIMIT 5; +SELECT ''::text AS five, unique1, unique2, stringu1 + FROM onek + ORDER BY unique1 LIMIT 5 OFFSET 900; + +-- Test null limit and offset. The planner would discard a simple null +-- constant, so to ensure executor is exercised, do this: +select * from int8_tbl limit (case when random() < 0.5 then null::bigint end); +select * from int8_tbl offset (case when random() < 0.5 then null::bigint end); + +-- Test assorted cases involving backwards fetch from a LIMIT plan node +-- Disable backward scan test which is not supported in this version of Cloudberry Database +--start_ignore +/* + * begin; + * + * declare c1 cursor for select * from int8_tbl limit 10; + * fetch all in c1; + * fetch 1 in c1; + * fetch backward 1 in c1; + * fetch backward all in c1; + * fetch backward 1 in c1; + * fetch all in c1; + * + * declare c2 cursor for select * from int8_tbl limit 3; + * fetch all in c2; + * fetch 1 in c2; + * fetch backward 1 in c2; + * fetch backward all in c2; + * fetch backward 1 in c2; + * fetch all in c2; + * + * declare c3 cursor for select * from int8_tbl offset 3; + * fetch all in c3; + * fetch 1 in c3; + * fetch backward 1 in c3; + * fetch backward all in c3; + * fetch backward 1 in c3; + * fetch all in c3; + * + * declare c4 cursor for select * from int8_tbl offset 10; + * fetch all in c4; + * fetch 1 in c4; + * fetch backward 1 in c4; + * fetch backward all in c4; + * fetch backward 1 in c4; + * fetch all in c4; + * + * declare c5 cursor for select * from int8_tbl order by q1 fetch first 2 rows with ties; + * fetch all in c5; + * fetch 1 in c5; + * fetch backward 1 in c5; + * fetch backward 1 in c5; + * fetch all in c5; + * fetch backward all in c5; + * fetch all in c5; + * fetch backward all in c5; + * + * rollback; + */ +--end_ignore + +-- Stress test for variable LIMIT in conjunction with bounded-heap sorting + +SELECT + (SELECT n + FROM (VALUES (1)) AS x, + (SELECT n FROM generate_series(1,10) AS n + ORDER BY n LIMIT 1 OFFSET s-1) AS y) AS z + FROM generate_series(1,10) AS s; + +-- +-- Test behavior of volatile and set-returning functions in conjunction +-- with ORDER BY and LIMIT. +-- + +create temp sequence testseq; + +explain (verbose, costs off) +select unique1, unique2, nextval('testseq') + from tenk1 order by unique2 limit 10; +-- In gpdb, our sequence can only promise monotonicity due to MPP structure +-- The follow case does not make sence for us. +-- +--select unique1, unique2, nextval('testseq') +-- from tenk1 order by unique2 limit 10; +-- +--select currval('testseq'); +-- +--explain (verbose, costs off) +--select unique1, unique2, nextval('testseq') +-- from tenk1 order by tenthous limit 10; +-- +--select unique1, unique2, nextval('testseq') +-- from tenk1 order by tenthous limit 10; +-- +--select currval('testseq'); +-- + +explain (verbose, costs off) +select unique1, unique2, generate_series(1,10) + from tenk1 order by unique2 limit 7; + +select unique1, unique2, generate_series(1,10) + from tenk1 order by unique2 limit 7; + +explain (verbose, costs off) +select unique1, unique2, generate_series(1,10) + from tenk1 order by tenthous limit 7; + +select unique1, unique2, generate_series(1,10) + from tenk1 order by tenthous limit 7; + +-- use of random() is to keep planner from folding the expressions together +explain (verbose, costs off) +select generate_series(0,2) as s1, generate_series((random()*.1)::int,2) as s2; + +select generate_series(0,2) as s1, generate_series((random()*.1)::int,2) as s2; + +explain (verbose, costs off) +select generate_series(0,2) as s1, generate_series((random()*.1)::int,2) as s2 +order by s2 desc; + +select generate_series(0,2) as s1, generate_series((random()*.1)::int,2) as s2 +order by s2 desc; + +-- test for failure to set all aggregates' aggtranstype +explain (verbose, costs off) +select sum(tenthous) as s1, sum(tenthous) + random()*0 as s2 + from tenk1 group by thousand order by thousand limit 3; + +select sum(tenthous) as s1, sum(tenthous) + random()*0 as s2 + from tenk1 group by thousand order by thousand limit 3; + +-- +-- FETCH FIRST +-- Check the WITH TIES clause +-- + +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 2 ROW WITH TIES; + +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST ROWS WITH TIES; + +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 1 ROW WITH TIES; + +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 2 ROW ONLY; + +-- SKIP LOCKED and WITH TIES are incompatible +SELECT thousand + FROM onek WHERE thousand < 5 + ORDER BY thousand FETCH FIRST 1 ROW WITH TIES FOR UPDATE SKIP LOCKED; + +-- should fail +SELECT ''::text AS two, unique1, unique2, stringu1 + FROM onek WHERE unique1 > 50 + FETCH FIRST 2 ROW WITH TIES; + +-- test ruleutils +CREATE VIEW limit_thousand_v_1 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST 5 ROWS WITH TIES OFFSET 10; +\d+ limit_thousand_v_1 +CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY; +\d+ limit_thousand_v_2 +CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST NULL ROWS WITH TIES; -- fails +CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES; +\d+ limit_thousand_v_3 +CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST NULL ROWS ONLY; +\d+ limit_thousand_v_4 +-- leave these views diff --git a/src/test/singlenode_regress/sql/limit_gp.sql b/src/test/singlenode_regress/sql/limit_gp.sql new file mode 100644 index 00000000000..bf1526b80a0 --- /dev/null +++ b/src/test/singlenode_regress/sql/limit_gp.sql @@ -0,0 +1,67 @@ + +-- Check for MPP-19310 and MPP-19857 where mksort produces wrong result +-- on OPT build, and fails assertion on debug build if a "LIMIT" query +-- spills to disk. + +CREATE TABLE mksort_limit_test_table(dkey INT, jkey INT, rval REAL, tval TEXT default repeat('abcdefghijklmnopqrstuvwxyz', 300)); +INSERT INTO mksort_limit_test_table VALUES(generate_series(1, 10000), generate_series(10001, 20000), sqrt(generate_series(10001, 20000))); + +--Should fit LESS (because of overhead) than (20 * 1024 * 1024) / (26 * 300 + 12) => 2684 tuples in memory, after that spills to disk +SET statement_mem="20MB"; + +-- Should work in memory +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey LIMIT 200) as temp ORDER BY jkey LIMIT 3; +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey LIMIT 200) as temp ORDER BY jkey DESC LIMIT 3; + +-- Should spill to disk (tested with 2 segments, for more segments it may not spill) +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey LIMIT 5000) as temp ORDER BY jkey LIMIT 3; +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey LIMIT 5000) as temp ORDER BY jkey DESC LIMIT 3; + +-- In memory descending sort +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey DESC LIMIT 200) as temp ORDER BY jkey LIMIT 3; +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey DESC LIMIT 200) as temp ORDER BY jkey DESC LIMIT 3; + +-- Spilled descending sort (tested with 2 segments, for more segments it may not spill) +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey DESC LIMIT 5000) as temp ORDER BY jkey LIMIT 3; +SELECT dkey, substring(tval from 1 for 2) as str from (SELECT * from mksort_limit_test_table ORDER BY dkey DESC LIMIT 5000) as temp ORDER BY jkey DESC LIMIT 3; + +DROP TABLE mksort_limit_test_table; + +-- Check invalid things in LIMIT + +select * from generate_series(1,10) g limit g; +select * from generate_series(1,10) g limit count(*); + +-- Check volatile limit should not pushdown. +create table t_volatile_limit (i int4); +create table t_volatile_limit_1 (a int, b int); + +-- Cloudberry may generate two-stage limit plan to improve performance. +-- But for limit clause contains volatile functions, if we push them down +-- below the final gather motion, those volatile functions will be evaluated +-- many times. For such cases, we should not push down the limit. + +-- Below test cases' limit clause contain function call `random` with order by. +-- `random()` is a volatile function it may return different results each time +-- invoked. If we push down to generate two-stage limit plan, `random()` will +-- execute on each segment which leads to different limit values of QEs +-- and QD and this cannot guarantee correct results. Suppose seg 0 contains the +-- top 3 minimum values, but random() returns 1, then you lose 2 values. +explain select * from t_volatile_limit order by i limit (random() * 10); +explain select * from t_volatile_limit order by i limit 2 offset (random()*5); + +explain select distinct(a), sum(b) from t_volatile_limit_1 group by a order by a, sum(b) limit (random()+3); +explain select distinct(a), sum(b) from t_volatile_limit_1 group by a order by a, sum(b) limit 2 offset (random()*2); + +drop table t_volatile_limit; +drop table t_volatile_limit_1; + +-- Check LIMIT ALL should not be considered when gathering data to a single node +create table t_limit_all(a int, b int); +insert into t_limit_all select i, i from generate_series(1,10)i; + +explain (costs off) +select array(select b from t_limit_all order by b asc limit all) t; +select array(select b from t_limit_all order by b asc limit all) t; + +drop table t_limit_all; diff --git a/src/test/singlenode_regress/sql/line.sql b/src/test/singlenode_regress/sql/line.sql new file mode 100644 index 00000000000..f589ffecc84 --- /dev/null +++ b/src/test/singlenode_regress/sql/line.sql @@ -0,0 +1,42 @@ +-- +-- LINE +-- Infinite lines +-- + +--DROP TABLE LINE_TBL; +CREATE TABLE LINE_TBL (s line); + +INSERT INTO LINE_TBL VALUES ('{0,-1,5}'); -- A == 0 +INSERT INTO LINE_TBL VALUES ('{1,0,5}'); -- B == 0 +INSERT INTO LINE_TBL VALUES ('{0,3,0}'); -- A == C == 0 +INSERT INTO LINE_TBL VALUES (' (0,0), (6,6)'); +INSERT INTO LINE_TBL VALUES ('10,-10 ,-5,-4'); +INSERT INTO LINE_TBL VALUES ('[-1e6,2e2,3e5, -4e1]'); + +INSERT INTO LINE_TBL VALUES ('{3,NaN,5}'); +INSERT INTO LINE_TBL VALUES ('{NaN,NaN,NaN}'); + +-- horizontal +INSERT INTO LINE_TBL VALUES ('[(1,3),(2,3)]'); +-- vertical +INSERT INTO LINE_TBL VALUES (line(point '(3,1)', point '(3,2)')); + +-- bad values for parser testing +INSERT INTO LINE_TBL VALUES ('{}'); +INSERT INTO LINE_TBL VALUES ('{0'); +INSERT INTO LINE_TBL VALUES ('{0,0}'); +INSERT INTO LINE_TBL VALUES ('{0,0,1'); +INSERT INTO LINE_TBL VALUES ('{0,0,1}'); +INSERT INTO LINE_TBL VALUES ('{0,0,1} x'); +INSERT INTO LINE_TBL VALUES ('(3asdf,2 ,3,4r2)'); +INSERT INTO LINE_TBL VALUES ('[1,2,3, 4'); +INSERT INTO LINE_TBL VALUES ('[(,2),(3,4)]'); +INSERT INTO LINE_TBL VALUES ('[(1,2),(3,4)'); +INSERT INTO LINE_TBL VALUES ('[(1,2),(1,2)]'); + +INSERT INTO LINE_TBL VALUES (line(point '(1,0)', point '(1,0)')); + +select * from LINE_TBL; + +select '{nan, 1, nan}'::line = '{nan, 1, nan}'::line as true, + '{nan, 1, nan}'::line = '{nan, 2, nan}'::line as false; diff --git a/src/test/singlenode_regress/sql/lock.sql b/src/test/singlenode_regress/sql/lock.sql new file mode 100644 index 00000000000..05bdb8ad4c2 --- /dev/null +++ b/src/test/singlenode_regress/sql/lock.sql @@ -0,0 +1,139 @@ +-- +-- Test the LOCK statement +-- + +-- Setup +CREATE SCHEMA lock_schema1; +SET search_path = lock_schema1; +CREATE TABLE lock_tbl1 (a BIGINT); +CREATE TABLE lock_tbl1a (a BIGINT); +CREATE VIEW lock_view1 AS SELECT * FROM lock_tbl1; +CREATE VIEW lock_view2(a,b) AS SELECT * FROM lock_tbl1, lock_tbl1a; +CREATE VIEW lock_view3 AS SELECT * from lock_view2; +CREATE VIEW lock_view4 AS SELECT (select a from lock_tbl1a limit 1) from lock_tbl1; +CREATE VIEW lock_view5 AS SELECT * from lock_tbl1 where a in (select * from lock_tbl1a); +CREATE VIEW lock_view6 AS SELECT * from (select * from lock_tbl1) sub; +CREATE ROLE regress_rol_lock1; +ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1; +GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1; + +-- Try all valid lock options; also try omitting the optional TABLE keyword. +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE; +LOCK lock_tbl1 IN ROW SHARE MODE; +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN SHARE MODE; +LOCK lock_tbl1 IN SHARE ROW EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE; +ROLLBACK; + +-- Try using NOWAIT along with valid options. +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ROW SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT; +ROLLBACK; + +-- Verify that we can lock views. +BEGIN TRANSACTION; +LOCK TABLE lock_view1 IN EXCLUSIVE MODE; +-- lock_view1 and lock_tbl1 are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view2 IN EXCLUSIVE MODE; +-- lock_view1, lock_tbl1, and lock_tbl1a are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view3 IN EXCLUSIVE MODE; +-- lock_view3, lock_view2, lock_tbl1, and lock_tbl1a are locked recursively. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view4 IN EXCLUSIVE MODE; +-- lock_view4, lock_tbl1, and lock_tbl1a are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view5 IN EXCLUSIVE MODE; +-- lock_view5, lock_tbl1, and lock_tbl1a are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_view6 IN EXCLUSIVE MODE; +-- lock_view6 an lock_tbl1 are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock' + order by relname; +ROLLBACK; +-- Verify that we cope with infinite recursion in view definitions. +CREATE OR REPLACE VIEW lock_view2 AS SELECT * from lock_view3; +BEGIN TRANSACTION; +LOCK TABLE lock_view2 IN EXCLUSIVE MODE; +ROLLBACK; +CREATE VIEW lock_view7 AS SELECT * from lock_view2; +BEGIN TRANSACTION; +LOCK TABLE lock_view7 IN EXCLUSIVE MODE; +ROLLBACK; + +-- Verify that we can lock a table with inheritance children. +CREATE TABLE lock_tbl2 (b BIGINT) INHERITS (lock_tbl1); +CREATE TABLE lock_tbl3 () INHERITS (lock_tbl2); +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE; +ROLLBACK; + +-- Child tables are locked without granting explicit permission to do so as +-- long as we have permission to lock the parent. +GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1; +SET ROLE regress_rol_lock1; +-- fail when child locked directly +BEGIN; +LOCK TABLE lock_tbl2; +ROLLBACK; +BEGIN; +LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE; +ROLLBACK; +BEGIN; +LOCK TABLE ONLY lock_tbl1; +ROLLBACK; +RESET ROLE; + +-- +-- Clean up +-- +DROP VIEW lock_view7; +DROP VIEW lock_view6; +DROP VIEW lock_view5; +DROP VIEW lock_view4; +DROP VIEW lock_view3 CASCADE; +DROP VIEW lock_view1; +DROP TABLE lock_tbl3; +DROP TABLE lock_tbl2; +DROP TABLE lock_tbl1; +DROP TABLE lock_tbl1a; +DROP SCHEMA lock_schema1 CASCADE; +DROP ROLE regress_rol_lock1; + + +-- atomic ops tests +RESET search_path; +SELECT test_atomic_ops(); diff --git a/src/test/singlenode_regress/sql/lseg.sql b/src/test/singlenode_regress/sql/lseg.sql new file mode 100644 index 00000000000..f266ca3e09e --- /dev/null +++ b/src/test/singlenode_regress/sql/lseg.sql @@ -0,0 +1,24 @@ +-- +-- LSEG +-- Line segments +-- + +--DROP TABLE LSEG_TBL; +CREATE TABLE LSEG_TBL (s lseg); + +INSERT INTO LSEG_TBL VALUES ('[(1,2),(3,4)]'); +INSERT INTO LSEG_TBL VALUES ('(0,0),(6,6)'); +INSERT INTO LSEG_TBL VALUES ('10,-10 ,-3,-4'); +INSERT INTO LSEG_TBL VALUES ('[-1e6,2e2,3e5, -4e1]'); +INSERT INTO LSEG_TBL VALUES (lseg(point(11, 22), point(33,44))); +INSERT INTO LSEG_TBL VALUES ('[(-10,2),(-10,3)]'); -- vertical +INSERT INTO LSEG_TBL VALUES ('[(0,-20),(30,-20)]'); -- horizontal +INSERT INTO LSEG_TBL VALUES ('[(NaN,1),(NaN,90)]'); -- NaN + +-- bad values for parser testing +INSERT INTO LSEG_TBL VALUES ('(3asdf,2 ,3,4r2)'); +INSERT INTO LSEG_TBL VALUES ('[1,2,3, 4'); +INSERT INTO LSEG_TBL VALUES ('[(,2),(3,4)]'); +INSERT INTO LSEG_TBL VALUES ('[(1,2),(3,4)'); + +select * from LSEG_TBL; diff --git a/src/test/singlenode_regress/sql/macaddr.sql b/src/test/singlenode_regress/sql/macaddr.sql new file mode 100644 index 00000000000..7bad8f5d7ae --- /dev/null +++ b/src/test/singlenode_regress/sql/macaddr.sql @@ -0,0 +1,43 @@ +-- +-- macaddr +-- + +CREATE TABLE macaddr_data (a int, b macaddr); + +INSERT INTO macaddr_data VALUES (1, '08:00:2b:01:02:03'); +INSERT INTO macaddr_data VALUES (2, '08-00-2b-01-02-03'); +INSERT INTO macaddr_data VALUES (3, '08002b:010203'); +INSERT INTO macaddr_data VALUES (4, '08002b-010203'); +INSERT INTO macaddr_data VALUES (5, '0800.2b01.0203'); +INSERT INTO macaddr_data VALUES (6, '0800-2b01-0203'); +INSERT INTO macaddr_data VALUES (7, '08002b010203'); +INSERT INTO macaddr_data VALUES (8, '0800:2b01:0203'); -- invalid +INSERT INTO macaddr_data VALUES (9, 'not even close'); -- invalid + +INSERT INTO macaddr_data VALUES (10, '08:00:2b:01:02:04'); +INSERT INTO macaddr_data VALUES (11, '08:00:2b:01:02:02'); +INSERT INTO macaddr_data VALUES (12, '08:00:2a:01:02:03'); +INSERT INTO macaddr_data VALUES (13, '08:00:2c:01:02:03'); +INSERT INTO macaddr_data VALUES (14, '08:00:2a:01:02:04'); + +SELECT * FROM macaddr_data; + +CREATE INDEX macaddr_data_btree ON macaddr_data USING btree (b); +CREATE INDEX macaddr_data_hash ON macaddr_data USING hash (b); + +SELECT a, b, trunc(b) FROM macaddr_data ORDER BY 2, 1; + +SELECT b < '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- true +SELECT b > '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- false +SELECT b > '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- false +SELECT b <= '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- true +SELECT b >= '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- false +SELECT b = '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- true +SELECT b <> '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- true +SELECT b <> '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- false + +SELECT ~b FROM macaddr_data; +SELECT b & '00:00:00:ff:ff:ff' FROM macaddr_data; +SELECT b | '01:02:03:04:05:06' FROM macaddr_data; + +DROP TABLE macaddr_data; diff --git a/src/test/singlenode_regress/sql/macaddr8.sql b/src/test/singlenode_regress/sql/macaddr8.sql new file mode 100644 index 00000000000..57a227c5ab7 --- /dev/null +++ b/src/test/singlenode_regress/sql/macaddr8.sql @@ -0,0 +1,89 @@ +-- +-- macaddr8 +-- + +-- test various cases of valid and invalid input +-- valid +SELECT '08:00:2b:01:02:03 '::macaddr8; +SELECT ' 08:00:2b:01:02:03 '::macaddr8; +SELECT ' 08:00:2b:01:02:03'::macaddr8; +SELECT '08:00:2b:01:02:03:04:05 '::macaddr8; +SELECT ' 08:00:2b:01:02:03:04:05 '::macaddr8; +SELECT ' 08:00:2b:01:02:03:04:05'::macaddr8; + +SELECT '123 08:00:2b:01:02:03'::macaddr8; -- invalid +SELECT '08:00:2b:01:02:03 123'::macaddr8; -- invalid +SELECT '123 08:00:2b:01:02:03:04:05'::macaddr8; -- invalid +SELECT '08:00:2b:01:02:03:04:05 123'::macaddr8; -- invalid +SELECT '08:00:2b:01:02:03:04:05:06:07'::macaddr8; -- invalid +SELECT '08-00-2b-01-02-03-04-05-06-07'::macaddr8; -- invalid +SELECT '08002b:01020304050607'::macaddr8; -- invalid +SELECT '08002b01020304050607'::macaddr8; -- invalid +SELECT '0z002b0102030405'::macaddr8; -- invalid +SELECT '08002b010203xyza'::macaddr8; -- invalid + +SELECT '08:00-2b:01:02:03:04:05'::macaddr8; -- invalid +SELECT '08:00-2b:01:02:03:04:05'::macaddr8; -- invalid +SELECT '08:00:2b:01.02:03:04:05'::macaddr8; -- invalid +SELECT '08:00:2b:01.02:03:04:05'::macaddr8; -- invalid + +-- test converting a MAC address to modified EUI-64 for inclusion +-- in an ipv6 address +SELECT macaddr8_set7bit('00:08:2b:01:02:03'::macaddr8); + +CREATE TABLE macaddr8_data (a int, b macaddr8); + +INSERT INTO macaddr8_data VALUES (1, '08:00:2b:01:02:03'); +INSERT INTO macaddr8_data VALUES (2, '08-00-2b-01-02-03'); +INSERT INTO macaddr8_data VALUES (3, '08002b:010203'); +INSERT INTO macaddr8_data VALUES (4, '08002b-010203'); +INSERT INTO macaddr8_data VALUES (5, '0800.2b01.0203'); +INSERT INTO macaddr8_data VALUES (6, '0800-2b01-0203'); +INSERT INTO macaddr8_data VALUES (7, '08002b010203'); +INSERT INTO macaddr8_data VALUES (8, '0800:2b01:0203'); +INSERT INTO macaddr8_data VALUES (9, 'not even close'); -- invalid + +INSERT INTO macaddr8_data VALUES (10, '08:00:2b:01:02:04'); +INSERT INTO macaddr8_data VALUES (11, '08:00:2b:01:02:02'); +INSERT INTO macaddr8_data VALUES (12, '08:00:2a:01:02:03'); +INSERT INTO macaddr8_data VALUES (13, '08:00:2c:01:02:03'); +INSERT INTO macaddr8_data VALUES (14, '08:00:2a:01:02:04'); + +INSERT INTO macaddr8_data VALUES (15, '08:00:2b:01:02:03:04:05'); +INSERT INTO macaddr8_data VALUES (16, '08-00-2b-01-02-03-04-05'); +INSERT INTO macaddr8_data VALUES (17, '08002b:0102030405'); +INSERT INTO macaddr8_data VALUES (18, '08002b-0102030405'); +INSERT INTO macaddr8_data VALUES (19, '0800.2b01.0203.0405'); +INSERT INTO macaddr8_data VALUES (20, '08002b01:02030405'); +INSERT INTO macaddr8_data VALUES (21, '08002b0102030405'); + +SELECT * FROM macaddr8_data ORDER BY 1; + +CREATE INDEX macaddr8_data_btree ON macaddr8_data USING btree (b); +CREATE INDEX macaddr8_data_hash ON macaddr8_data USING hash (b); + +SELECT a, b, trunc(b) FROM macaddr8_data ORDER BY 2, 1; + +SELECT b < '08:00:2b:01:02:04' FROM macaddr8_data WHERE a = 1; -- true +SELECT b > '08:00:2b:ff:fe:01:02:04' FROM macaddr8_data WHERE a = 1; -- false +SELECT b > '08:00:2b:ff:fe:01:02:03' FROM macaddr8_data WHERE a = 1; -- false +SELECT b::macaddr <= '08:00:2b:01:02:04' FROM macaddr8_data WHERE a = 1; -- true +SELECT b::macaddr >= '08:00:2b:01:02:04' FROM macaddr8_data WHERE a = 1; -- false +SELECT b = '08:00:2b:ff:fe:01:02:03' FROM macaddr8_data WHERE a = 1; -- true +SELECT b::macaddr <> '08:00:2b:01:02:04'::macaddr FROM macaddr8_data WHERE a = 1; -- true +SELECT b::macaddr <> '08:00:2b:01:02:03'::macaddr FROM macaddr8_data WHERE a = 1; -- false + +SELECT b < '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- true +SELECT b > '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- false +SELECT b > '08:00:2b:01:02:03:04:05' FROM macaddr8_data WHERE a = 15; -- false +SELECT b <= '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- true +SELECT b >= '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- false +SELECT b = '08:00:2b:01:02:03:04:05' FROM macaddr8_data WHERE a = 15; -- true +SELECT b <> '08:00:2b:01:02:03:04:06' FROM macaddr8_data WHERE a = 15; -- true +SELECT b <> '08:00:2b:01:02:03:04:05' FROM macaddr8_data WHERE a = 15; -- false + +SELECT ~b FROM macaddr8_data; +SELECT b & '00:00:00:ff:ff:ff' FROM macaddr8_data; +SELECT b | '01:02:03:04:05:06' FROM macaddr8_data; + +DROP TABLE macaddr8_data; diff --git a/src/test/singlenode_regress/sql/matview.sql b/src/test/singlenode_regress/sql/matview.sql new file mode 100644 index 00000000000..5fc74e0e519 --- /dev/null +++ b/src/test/singlenode_regress/sql/matview.sql @@ -0,0 +1,295 @@ +-- create a table to use as a basis for views and materialized views in various combinations +CREATE TABLE mvtest_t (id int NOT NULL PRIMARY KEY, type text NOT NULL, amt numeric NOT NULL); +INSERT INTO mvtest_t VALUES + (1, 'x', 2), + (2, 'x', 3), + (3, 'y', 5), + (4, 'y', 7), + (5, 'z', 11); + +-- we want a view based on the table, too, since views present additional challenges +CREATE VIEW mvtest_tv AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type; +SELECT * FROM mvtest_tv ORDER BY type; + +-- create a materialized view with no data, and confirm correct behavior +EXPLAIN (costs off) + CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA; +CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA; +SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass; +SELECT * FROM mvtest_tm ORDER BY type; +REFRESH MATERIALIZED VIEW mvtest_tm; +SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass; +CREATE UNIQUE INDEX mvtest_tm_type ON mvtest_tm (type); +SELECT * FROM mvtest_tm ORDER BY type; + +-- create various views +EXPLAIN (costs off) + CREATE MATERIALIZED VIEW mvtest_tvm AS SELECT * FROM mvtest_tv ORDER BY type; +CREATE MATERIALIZED VIEW mvtest_tvm AS SELECT * FROM mvtest_tv ORDER BY type; +SELECT * FROM mvtest_tvm; +CREATE MATERIALIZED VIEW mvtest_tmm AS SELECT sum(totamt) AS grandtot FROM mvtest_tm; +CREATE MATERIALIZED VIEW mvtest_tvmm AS SELECT sum(totamt) AS grandtot FROM mvtest_tvm; +CREATE UNIQUE INDEX mvtest_tvmm_expr ON mvtest_tvmm ((grandtot > 0)); +CREATE UNIQUE INDEX mvtest_tvmm_pred ON mvtest_tvmm (grandtot) WHERE grandtot < 0; +CREATE VIEW mvtest_tvv AS SELECT sum(totamt) AS grandtot FROM mvtest_tv; +EXPLAIN (costs off) + CREATE MATERIALIZED VIEW mvtest_tvvm AS SELECT * FROM mvtest_tvv; +CREATE MATERIALIZED VIEW mvtest_tvvm AS SELECT * FROM mvtest_tvv; +CREATE VIEW mvtest_tvvmv AS SELECT * FROM mvtest_tvvm; +CREATE MATERIALIZED VIEW mvtest_bb AS SELECT * FROM mvtest_tvvmv; +CREATE INDEX mvtest_aa ON mvtest_bb (grandtot); + +-- check that plans seem reasonable +\d+ mvtest_tvm +\d+ mvtest_tvm +\d+ mvtest_tvvm +\d+ mvtest_bb + +-- test schema behavior +CREATE SCHEMA mvtest_mvschema; +ALTER MATERIALIZED VIEW mvtest_tvm SET SCHEMA mvtest_mvschema; +\d+ mvtest_tvm +\d+ mvtest_tvmm +SET search_path = mvtest_mvschema, public; +\d+ mvtest_tvm + +-- modify the underlying table data +INSERT INTO mvtest_t VALUES (6, 'z', 13); + +-- confirm pre- and post-refresh contents of fairly simple materialized views +SELECT * FROM mvtest_tm ORDER BY type; +SELECT * FROM mvtest_tvm ORDER BY type; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_tm; +REFRESH MATERIALIZED VIEW mvtest_tvm; +SELECT * FROM mvtest_tm ORDER BY type; +SELECT * FROM mvtest_tvm ORDER BY type; +RESET search_path; + +-- confirm pre- and post-refresh contents of nested materialized views +EXPLAIN (costs off) + SELECT * FROM mvtest_tmm; +EXPLAIN (costs off) + SELECT * FROM mvtest_tvmm; +EXPLAIN (costs off) + SELECT * FROM mvtest_tvvm; +SELECT * FROM mvtest_tmm; +SELECT * FROM mvtest_tvmm; +SELECT * FROM mvtest_tvvm; +REFRESH MATERIALIZED VIEW mvtest_tmm; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_tvmm; +REFRESH MATERIALIZED VIEW mvtest_tvmm; +REFRESH MATERIALIZED VIEW mvtest_tvvm; +EXPLAIN (costs off) + SELECT * FROM mvtest_tmm; +EXPLAIN (costs off) + SELECT * FROM mvtest_tvmm; +EXPLAIN (costs off) + SELECT * FROM mvtest_tvvm; +SELECT * FROM mvtest_tmm; +SELECT * FROM mvtest_tvmm; +SELECT * FROM mvtest_tvvm; + +-- test diemv when the mv does not exist +DROP MATERIALIZED VIEW IF EXISTS no_such_mv; + +-- make sure invalid combination of options is prohibited +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_tvmm WITH NO DATA; + +-- no tuple locks on materialized views +SELECT * FROM mvtest_tvvm FOR SHARE; + +-- test join of mv and view +SELECT type, m.totamt AS mtot, v.totamt AS vtot FROM mvtest_tm m LEFT JOIN mvtest_tv v USING (type) ORDER BY type; + +-- make sure that dependencies are reported properly when they block the drop +DROP TABLE mvtest_t; + +-- make sure dependencies are dropped and reported +-- and make sure that transactional behavior is correct on rollback +-- incidentally leaving some interesting materialized views for pg_dump testing +BEGIN; +DROP TABLE mvtest_t CASCADE; +ROLLBACK; + +-- some additional tests not using base tables +CREATE VIEW mvtest_vt1 AS SELECT 1 moo; +CREATE VIEW mvtest_vt2 AS SELECT moo, 2*moo FROM mvtest_vt1 UNION ALL SELECT moo, 3*moo FROM mvtest_vt1; +\d+ mvtest_vt2 +CREATE MATERIALIZED VIEW mv_test2 AS SELECT moo, 2*moo FROM mvtest_vt2 UNION ALL SELECT moo, 3*moo FROM mvtest_vt2; +\d+ mv_test2 +CREATE MATERIALIZED VIEW mv_test3 AS SELECT * FROM mv_test2 WHERE moo = 12345; +SELECT relispopulated FROM pg_class WHERE oid = 'mv_test3'::regclass; + +DROP VIEW mvtest_vt1 CASCADE; + +-- test that duplicate values on unique index prevent refresh +CREATE TABLE mvtest_foo(a, b) AS VALUES(1, 10); +CREATE MATERIALIZED VIEW mvtest_mv AS SELECT * FROM mvtest_foo; +CREATE UNIQUE INDEX ON mvtest_mv(a); +INSERT INTO mvtest_foo SELECT * FROM mvtest_foo; +REFRESH MATERIALIZED VIEW mvtest_mv; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv; +DROP TABLE mvtest_foo CASCADE; + +-- make sure that all columns covered by unique indexes works +CREATE TABLE mvtest_foo(a, b, c) AS VALUES(1, 2, 3); +CREATE MATERIALIZED VIEW mvtest_mv AS SELECT * FROM mvtest_foo; +CREATE UNIQUE INDEX ON mvtest_mv (a); +CREATE UNIQUE INDEX ON mvtest_mv (b); +CREATE UNIQUE INDEX on mvtest_mv (c); +INSERT INTO mvtest_foo VALUES(2, 3, 4); +INSERT INTO mvtest_foo VALUES(3, 4, 5); +REFRESH MATERIALIZED VIEW mvtest_mv; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv; +DROP TABLE mvtest_foo CASCADE; + +-- allow subquery to reference unpopulated matview if WITH NO DATA is specified +CREATE MATERIALIZED VIEW mvtest_mv1 AS SELECT 1 AS col1 WITH NO DATA; +CREATE MATERIALIZED VIEW mvtest_mv2 AS SELECT * FROM mvtest_mv1 + WHERE col1 = (SELECT LEAST(col1) FROM mvtest_mv1) WITH NO DATA; +DROP MATERIALIZED VIEW mvtest_mv1 CASCADE; + +-- make sure that types with unusual equality tests work +CREATE TABLE mvtest_boxes (id serial primary key, b box); +INSERT INTO mvtest_boxes (b) VALUES + ('(32,32),(31,31)'), + ('(2.0000004,2.0000004),(1,1)'), + ('(1.9999996,1.9999996),(1,1)'); +CREATE MATERIALIZED VIEW mvtest_boxmv AS SELECT * FROM mvtest_boxes; +CREATE UNIQUE INDEX mvtest_boxmv_id ON mvtest_boxmv (id); +UPDATE mvtest_boxes SET b = '(2,2),(1,1)' WHERE id = 2; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_boxmv; +SELECT * FROM mvtest_boxmv ORDER BY id; +DROP TABLE mvtest_boxes CASCADE; + +-- make sure that column names are handled correctly +CREATE TABLE mvtest_v (i int, j int); +CREATE MATERIALIZED VIEW mvtest_mv_v (ii, jj, kk) AS SELECT i, j FROM mvtest_v; -- error +CREATE MATERIALIZED VIEW mvtest_mv_v (ii, jj) AS SELECT i, j FROM mvtest_v; -- ok +CREATE MATERIALIZED VIEW mvtest_mv_v_2 (ii) AS SELECT i, j FROM mvtest_v; -- ok +CREATE MATERIALIZED VIEW mvtest_mv_v_3 (ii, jj, kk) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- error +CREATE MATERIALIZED VIEW mvtest_mv_v_3 (ii, jj) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- ok +CREATE MATERIALIZED VIEW mvtest_mv_v_4 (ii) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- ok +ALTER TABLE mvtest_v RENAME COLUMN i TO x; +INSERT INTO mvtest_v values (1, 2); +CREATE UNIQUE INDEX mvtest_mv_v_ii ON mvtest_mv_v (ii); +REFRESH MATERIALIZED VIEW mvtest_mv_v; +UPDATE mvtest_v SET j = 3 WHERE x = 1; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_v; +REFRESH MATERIALIZED VIEW mvtest_mv_v_2; +REFRESH MATERIALIZED VIEW mvtest_mv_v_3; +REFRESH MATERIALIZED VIEW mvtest_mv_v_4; +SELECT * FROM mvtest_v; +SELECT * FROM mvtest_mv_v; +SELECT * FROM mvtest_mv_v_2; +SELECT * FROM mvtest_mv_v_3; +SELECT * FROM mvtest_mv_v_4; +DROP TABLE mvtest_v CASCADE; + +-- Check that unknown literals are converted to "text" in CREATE MATVIEW, +-- so that we don't end up with unknown-type columns. +CREATE MATERIALIZED VIEW mv_unspecified_types AS + SELECT 42 as i, 42.5 as num, 'foo' as u, 'foo'::unknown as u2, null as n; +\d+ mv_unspecified_types +SELECT * FROM mv_unspecified_types; +DROP MATERIALIZED VIEW mv_unspecified_types; + +-- make sure that create WITH NO DATA does not plan the query (bug #13907) +create materialized view mvtest_error as select 1/0 as x; -- fail +create materialized view mvtest_error as select 1/0 as x with no data; + +-- make sure that matview rows can be referenced as source rows (bug #9398) +CREATE TABLE mvtest_v AS SELECT generate_series(1,10) AS a; +CREATE MATERIALIZED VIEW mvtest_mv_v AS SELECT a FROM mvtest_v WHERE a <= 5; +DELETE FROM mvtest_v WHERE EXISTS ( SELECT * FROM mvtest_mv_v WHERE mvtest_mv_v.a = mvtest_v.a ); +SELECT * FROM mvtest_v; +SELECT * FROM mvtest_mv_v; +DROP TABLE mvtest_v CASCADE; + +-- make sure running as superuser works when MV owned by another role (bug #11208) +CREATE ROLE regress_user_mvtest; +SET ROLE regress_user_mvtest; +-- this test case also checks for ambiguity in the queries issued by +-- refresh_by_match_merge(), by choosing column names that intentionally +-- duplicate all the aliases used in those queries +CREATE TABLE mvtest_foo_data AS SELECT i, + i+1 AS tid, + md5(random()::text) AS mv, + md5(random()::text) AS newdata, + md5(random()::text) AS newdata2, + md5(random()::text) AS diff + FROM generate_series(1, 10) i; +CREATE MATERIALIZED VIEW mvtest_mv_foo AS SELECT * FROM mvtest_foo_data; +CREATE MATERIALIZED VIEW mvtest_mv_foo AS SELECT * FROM mvtest_foo_data; +CREATE MATERIALIZED VIEW IF NOT EXISTS mvtest_mv_foo AS SELECT * FROM mvtest_foo_data; +CREATE UNIQUE INDEX ON mvtest_mv_foo (i); +RESET ROLE; +REFRESH MATERIALIZED VIEW mvtest_mv_foo; +REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo; +DROP OWNED BY regress_user_mvtest CASCADE; +DROP ROLE regress_user_mvtest; + +-- make sure that create WITH NO DATA works via SPI +BEGIN; +CREATE FUNCTION mvtest_func() + RETURNS void AS $$ +BEGIN + CREATE MATERIALIZED VIEW mvtest1 AS SELECT 1 AS x; + CREATE MATERIALIZED VIEW mvtest2 AS SELECT 1 AS x WITH NO DATA; +END; +$$ LANGUAGE plpgsql; +SELECT mvtest_func(); +SELECT * FROM mvtest1; +SELECT * FROM mvtest2; +ROLLBACK; + +-- INSERT privileges if relation owner is not allowed to insert. +CREATE SCHEMA matview_schema; +CREATE USER regress_matview_user; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_matview_user + REVOKE INSERT ON TABLES FROM regress_matview_user; +GRANT ALL ON SCHEMA matview_schema TO public; + +SET SESSION AUTHORIZATION regress_matview_user; +CREATE MATERIALIZED VIEW matview_schema.mv_withdata1 (a) AS + SELECT generate_series(1, 10) WITH DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW matview_schema.mv_withdata2 (a) AS + SELECT generate_series(1, 10) WITH DATA; +REFRESH MATERIALIZED VIEW matview_schema.mv_withdata2; +CREATE MATERIALIZED VIEW matview_schema.mv_nodata1 (a) AS + SELECT generate_series(1, 10) WITH NO DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW matview_schema.mv_nodata2 (a) AS + SELECT generate_series(1, 10) WITH NO DATA; +REFRESH MATERIALIZED VIEW matview_schema.mv_nodata2; +RESET SESSION AUTHORIZATION; + +ALTER DEFAULT PRIVILEGES FOR ROLE regress_matview_user + GRANT INSERT ON TABLES TO regress_matview_user; + +DROP SCHEMA matview_schema CASCADE; +DROP USER regress_matview_user; + +-- CREATE MATERIALIZED VIEW ... IF NOT EXISTS +CREATE MATERIALIZED VIEW matview_ine_tab AS SELECT 1; +CREATE MATERIALIZED VIEW matview_ine_tab AS SELECT 1 / 0; -- error +CREATE MATERIALIZED VIEW IF NOT EXISTS matview_ine_tab AS + SELECT 1 / 0; -- ok +CREATE MATERIALIZED VIEW matview_ine_tab AS + SELECT 1 / 0 WITH NO DATA; -- error +CREATE MATERIALIZED VIEW IF NOT EXISTS matview_ine_tab AS + SELECT 1 / 0 WITH NO DATA; -- ok +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW matview_ine_tab AS + SELECT 1 / 0; -- error +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW IF NOT EXISTS matview_ine_tab AS + SELECT 1 / 0; -- ok +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW matview_ine_tab AS + SELECT 1 / 0 WITH NO DATA; -- error +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE MATERIALIZED VIEW IF NOT EXISTS matview_ine_tab AS + SELECT 1 / 0 WITH NO DATA; -- ok +DROP MATERIALIZED VIEW matview_ine_tab; diff --git a/src/test/singlenode_regress/sql/matview_ao.sql b/src/test/singlenode_regress/sql/matview_ao.sql new file mode 100644 index 00000000000..0fb755d6052 --- /dev/null +++ b/src/test/singlenode_regress/sql/matview_ao.sql @@ -0,0 +1,50 @@ +CREATE ROLE matview_ao_role; +SET ROLE matview_ao_role; +CREATE TABLE t_matview_ao (id int NOT NULL PRIMARY KEY, type text NOT NULL, amt numeric NOT NULL); +INSERT INTO t_matview_ao VALUES + (1, 'x', 2), + (2, 'x', 3), + (3, 'y', 5), + (4, 'y', 7), + (5, 'z', 11); + +CREATE MATERIALIZED VIEW m_heap AS SELECT type, sum(amt) AS totamt FROM t_matview_ao GROUP BY type WITH NO DATA; +CREATE UNIQUE INDEX m_heap_index ON m_heap(type); +SELECT * from m_heap; +REFRESH MATERIALIZED VIEW CONCURRENTLY m_heap; +REFRESH MATERIALIZED VIEW m_heap; +SELECT * FROM m_heap; +REFRESH MATERIALIZED VIEW CONCURRENTLY m_heap; +SELECT * FROM m_heap; +REFRESH MATERIALIZED VIEW m_heap WITH NO DATA; +SELECT * FROM m_heap; +-- test WITH NO DATA is also dispatched to QEs +-- select relispopulated from gp_dist_random('pg_class') where relname = 'm_heap'; +REFRESH MATERIALIZED VIEW m_heap; +SELECT * FROM m_heap; + +CREATE MATERIALIZED VIEW m_ao with (appendonly=true) AS SELECT type, sum(amt) AS totamt FROM t_matview_ao GROUP BY type WITH NO DATA; +SELECT * from m_ao; +REFRESH MATERIALIZED VIEW m_ao; +SELECT * FROM m_ao; +REFRESH MATERIALIZED VIEW m_ao WITH NO DATA; +SELECT * FROM m_ao; +REFRESH MATERIALIZED VIEW m_ao; +SELECT * FROM m_ao; + + +CREATE MATERIALIZED VIEW m_aocs with (appendonly=true, orientation=column) AS SELECT type, sum(amt) AS totamt FROM t_matview_ao GROUP BY type WITH NO DATA; +SELECT * from m_aocs; +REFRESH MATERIALIZED VIEW m_aocs; +SELECT * FROM m_aocs; +REFRESH MATERIALIZED VIEW m_aocs WITH NO DATA; +SELECT * FROM m_aocs; +REFRESH MATERIALIZED VIEW m_aocs; +SELECT * FROM m_aocs; + +\dm m_heap +\dm m_ao +\dm m_aocs +RESET ROLE; +DROP OWNED BY matview_ao_role CASCADE; +DROP ROLE matview_ao_role; diff --git a/src/test/singlenode_regress/sql/memoize.sql b/src/test/singlenode_regress/sql/memoize.sql new file mode 100644 index 00000000000..1ce9448f7ad --- /dev/null +++ b/src/test/singlenode_regress/sql/memoize.sql @@ -0,0 +1,157 @@ +-- Perform tests on the Memoize node. + +-- GPDB_14_MERGE_FIXME: +-- 1.test memoize in CBDB as enable_nestloop is false by default +-- 2.enable memoize in orca + +-- The cache hits/misses/evictions from the Memoize node can vary between +-- machines. Let's just replace the number with an 'N'. In order to allow us +-- to perform validation when the measure was zero, we replace a zero value +-- with "Zero". All other numbers are replaced with 'N'. +create function explain_memoize(query text, hide_hitmiss bool) returns setof text +language plpgsql as +$$ +declare + ln text; +begin + for ln in + execute format('explain (analyze, costs off, summary off, timing off) %s', + query) + loop + if hide_hitmiss = true then + ln := regexp_replace(ln, 'Hits: 0', 'Hits: Zero'); + ln := regexp_replace(ln, 'Hits: \d+', 'Hits: N'); + ln := regexp_replace(ln, 'Misses: 0', 'Misses: Zero'); + ln := regexp_replace(ln, 'Misses: \d+', 'Misses: N'); + end if; + ln := regexp_replace(ln, 'Evictions: 0', 'Evictions: Zero'); + ln := regexp_replace(ln, 'Evictions: \d+', 'Evictions: N'); + ln := regexp_replace(ln, 'Memory Usage: \d+', 'Memory Usage: N'); + ln := regexp_replace(ln, 'Memory: \d+', 'Memory: N'); + ln := regexp_replace(ln, 'Heap Fetches: \d+', 'Heap Fetches: N'); + ln := regexp_replace(ln, 'loops=\d+', 'loops=N'); + return next ln; + end loop; +end; +$$; + +-- Ensure we get a memoize node on the inner side of the nested loop +SET enable_hashjoin TO off; +SET enable_bitmapscan TO off; + +SELECT explain_memoize(' +SELECT COUNT(*),AVG(t1.unique1) FROM tenk1 t1 +INNER JOIN tenk1 t2 ON t1.unique1 = t2.twenty +WHERE t2.unique1 < 1000;', false); + +-- And check we get the expected results. +SELECT COUNT(*),AVG(t1.unique1) FROM tenk1 t1 +INNER JOIN tenk1 t2 ON t1.unique1 = t2.twenty +WHERE t2.unique1 < 1000; + +-- Try with LATERAL joins +SELECT explain_memoize(' +SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, +LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 +WHERE t1.unique1 < 1000;', false); + +-- And check we get the expected results. +SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, +LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 +WHERE t1.unique1 < 1000; + +-- Reduce work_mem so that we see some cache evictions +SET work_mem TO '64kB'; +SET enable_mergejoin TO off; +-- Ensure we get some evictions. We're unable to validate the hits and misses +-- here as the number of entries that fit in the cache at once will vary +-- between different machines. +SELECT explain_memoize(' +SELECT COUNT(*),AVG(t1.unique1) FROM tenk1 t1 +INNER JOIN tenk1 t2 ON t1.unique1 = t2.thousand +WHERE t2.unique1 < 1200;', true); + +CREATE TABLE flt (f float); +CREATE INDEX flt_f_idx ON flt (f); +INSERT INTO flt VALUES('-0.0'::float),('+0.0'::float); +ANALYZE flt; + +SET enable_seqscan TO off; + +-- Ensure memoize operates in logical mode +SELECT explain_memoize(' +SELECT * FROM flt f1 INNER JOIN flt f2 ON f1.f = f2.f;', false); + +-- Ensure memoize operates in binary mode +SELECT explain_memoize(' +SELECT * FROM flt f1 INNER JOIN flt f2 ON f1.f >= f2.f;', false); + +DROP TABLE flt; + +-- Exercise Memoize in binary mode with a large fixed width type and a +-- varlena type. +CREATE TABLE strtest (n name, t text); +CREATE INDEX strtest_n_idx ON strtest (n); +CREATE INDEX strtest_t_idx ON strtest (t); +INSERT INTO strtest VALUES('one','one'),('two','two'),('three',repeat(md5('three'),100)); +-- duplicate rows so we get some cache hits +INSERT INTO strtest SELECT * FROM strtest; +ANALYZE strtest; + +-- Ensure we get 3 hits and 3 misses +SELECT explain_memoize(' +SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.n >= s2.n;', false); + +-- Ensure we get 3 hits and 3 misses +SELECT explain_memoize(' +SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.t >= s2.t;', false); + +DROP TABLE strtest; + +-- Exercise Memoize code that flushes the cache when a parameter changes which +-- is not part of the cache key. + +-- Ensure we get a Memoize plan +EXPLAIN (COSTS OFF) +SELECT unique1 FROM tenk1 t0 +WHERE unique1 < 3 + AND EXISTS ( + SELECT 1 FROM tenk1 t1 + INNER JOIN tenk1 t2 ON t1.unique1 = t2.hundred + WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0); + +-- Ensure the above query returns the correct result +SELECT unique1 FROM tenk1 t0 +WHERE unique1 < 3 + AND EXISTS ( + SELECT 1 FROM tenk1 t1 + INNER JOIN tenk1 t2 ON t1.unique1 = t2.hundred + WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0); + +RESET enable_seqscan; +RESET enable_mergejoin; +RESET work_mem; +RESET enable_bitmapscan; +RESET enable_hashjoin; + +-- Test parallel plans with Memoize +SET min_parallel_table_scan_size TO 0; +SET parallel_setup_cost TO 0; +SET parallel_tuple_cost TO 0; +SET max_parallel_workers_per_gather TO 2; + +-- Ensure we get a parallel plan. +EXPLAIN (COSTS OFF) +SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, +LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 +WHERE t1.unique1 < 1000; + +-- And ensure the parallel plan gives us the correct results. +SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, +LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 +WHERE t1.unique1 < 1000; + +RESET max_parallel_workers_per_gather; +RESET parallel_tuple_cost; +RESET parallel_setup_cost; +RESET min_parallel_table_scan_size; diff --git a/src/test/singlenode_regress/sql/misc_functions.sql b/src/test/singlenode_regress/sql/misc_functions.sql new file mode 100644 index 00000000000..36799eb6e1e --- /dev/null +++ b/src/test/singlenode_regress/sql/misc_functions.sql @@ -0,0 +1,105 @@ +-- +-- num_nulls() +-- + +-- GPDB: Persuade the planner to produce the same plans as in upstream. +set enable_nestloop=on; + +SELECT num_nonnulls(NULL); +SELECT num_nonnulls('1'); +SELECT num_nonnulls(NULL::text); +SELECT num_nonnulls(NULL::text, NULL::int); +SELECT num_nonnulls(1, 2, NULL::text, NULL::point, '', int8 '9', 1.0 / NULL); +SELECT num_nonnulls(VARIADIC '{1,2,NULL,3}'::int[]); +SELECT num_nonnulls(VARIADIC '{"1","2","3","4"}'::text[]); +SELECT num_nonnulls(VARIADIC ARRAY(SELECT CASE WHEN i <> 40 THEN i END FROM generate_series(1, 100) i)); + +SELECT num_nulls(NULL); +SELECT num_nulls('1'); +SELECT num_nulls(NULL::text); +SELECT num_nulls(NULL::text, NULL::int); +SELECT num_nulls(1, 2, NULL::text, NULL::point, '', int8 '9', 1.0 / NULL); +SELECT num_nulls(VARIADIC '{1,2,NULL,3}'::int[]); +SELECT num_nulls(VARIADIC '{"1","2","3","4"}'::text[]); +SELECT num_nulls(VARIADIC ARRAY(SELECT CASE WHEN i <> 40 THEN i END FROM generate_series(1, 100) i)); + +-- special cases +SELECT num_nonnulls(VARIADIC NULL::text[]); +SELECT num_nonnulls(VARIADIC '{}'::int[]); +SELECT num_nulls(VARIADIC NULL::text[]); +SELECT num_nulls(VARIADIC '{}'::int[]); + +-- should fail, one or more arguments is required +SELECT num_nonnulls(); +SELECT num_nulls(); + +-- +-- pg_log_backend_memory_contexts() +-- +-- Memory contexts are logged and they are not returned to the function. +-- Furthermore, their contents can vary depending on the timing. However, +-- we can at least verify that the code doesn't fail. +-- +SELECT * FROM pg_log_backend_memory_contexts(pg_backend_pid()); + +-- +-- Test some built-in SRFs +-- +-- The outputs of these are variable, so we can't just print their results +-- directly, but we can at least verify that the code doesn't fail. +-- +select setting as segsize +from pg_settings where name = 'wal_segment_size' +\gset + +select count(*) > 0 as ok from pg_ls_waldir(); +-- Test ProjectSet as well as FunctionScan +select count(*) > 0 as ok from (select pg_ls_waldir()) ss; +-- Test not-run-to-completion cases. +select * from pg_ls_waldir() limit 0; +select count(*) > 0 as ok from (select * from pg_ls_waldir() limit 1) ss; +select (w).size = :segsize as ok +from (select pg_ls_waldir() w) ss where length((w).name) = 24 limit 1; + +select count(*) >= 0 as ok from pg_ls_archive_statusdir(); + +select * from (select pg_ls_dir('.') a) a where a = 'base' limit 1; + +select * from (select (pg_timezone_names()).name) ptn where name='UTC' limit 1; + +select count(*) > 0 from + (select pg_tablespace_databases(oid) as pts from pg_tablespace + where spcname = 'pg_default') pts + join pg_database db on pts.pts = db.oid; + +-- +-- Test adding a support function to a subject function +-- + +CREATE FUNCTION my_int_eq(int, int) RETURNS bool + LANGUAGE internal STRICT IMMUTABLE PARALLEL SAFE + AS $$int4eq$$; + +-- By default, planner does not think that's selective +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN tenk1 b ON a.unique1 = b.unique1 +WHERE my_int_eq(a.unique2, 42); + +-- With support function that knows it's int4eq, we get a different plan +ALTER FUNCTION my_int_eq(int, int) SUPPORT test_support_func; + +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN tenk1 b ON a.unique1 = b.unique1 +WHERE my_int_eq(a.unique2, 42); + +-- Also test non-default rowcount estimate +CREATE FUNCTION my_gen_series(int, int) RETURNS SETOF integer + LANGUAGE internal STRICT IMMUTABLE PARALLEL SAFE + AS $$generate_series_int4$$ + SUPPORT test_support_func; + +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN my_gen_series(1,1000) g ON a.unique1 = g; + +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN my_gen_series(1,10) g ON a.unique1 = g; diff --git a/src/test/singlenode_regress/sql/misc_sanity.sql b/src/test/singlenode_regress/sql/misc_sanity.sql new file mode 100644 index 00000000000..ce86024d52a --- /dev/null +++ b/src/test/singlenode_regress/sql/misc_sanity.sql @@ -0,0 +1,125 @@ +-- +-- MISC_SANITY +-- Sanity checks for common errors in making system tables that don't fit +-- comfortably into either opr_sanity or type_sanity. +-- +-- Every test failure in this file should be closely inspected. +-- The description of the failing test should be read carefully before +-- adjusting the expected output. In most cases, the queries should +-- not find *any* matching entries. +-- +-- NB: run this test early, because some later tests create bogus entries. + + +-- **************** pg_depend **************** + +-- Look for illegal values in pg_depend fields. +-- classid/objid can be zero, but only in 'p' entries + +SELECT * +FROM pg_depend as d1 +WHERE refclassid = 0 OR refobjid = 0 OR + deptype NOT IN ('a', 'e', 'i', 'n', 'p') OR + (deptype != 'p' AND (classid = 0 OR objid = 0)) OR + (deptype = 'p' AND (classid != 0 OR objid != 0 OR objsubid != 0)); + +-- **************** pg_shdepend **************** + +-- Look for illegal values in pg_shdepend fields. +-- classid/objid can be zero, but only in 'p' entries + +SELECT * +FROM pg_shdepend as d1 +WHERE refclassid = 0 OR refobjid = 0 OR + deptype NOT IN ('a', 'o', 'p', 'r') OR + (deptype != 'p' AND (classid = 0 OR objid = 0)) OR + (deptype = 'p' AND (dbid != 0 OR classid != 0 OR objid != 0 OR objsubid != 0)); + + +-- Check each OID-containing system catalog to see if its lowest-numbered OID +-- is pinned. If not, and if that OID was generated during initdb, then +-- perhaps initdb forgot to scan that catalog for pinnable entries. +-- Generally, it's okay for a catalog to be listed in the output of this +-- test if that catalog is scanned by initdb.c's setup_depend() function; +-- whatever OID the test is complaining about must have been added later +-- in initdb, where it intentionally isn't pinned. Legitimate exceptions +-- to that rule are listed in the comments in setup_depend(). +-- Currently, pg_rewrite is also listed by this check, even though it is +-- covered by setup_depend(). That happens because there are no rules in +-- the pinned data, but initdb creates some intentionally-not-pinned views. + +do $$ +declare relnm text; + reloid oid; + shared bool; + lowoid oid; + pinned bool; +begin +for relnm, reloid, shared in + select relname, oid, relisshared from pg_class + where EXISTS( + SELECT * FROM pg_attribute + WHERE attrelid = pg_class.oid AND attname = 'oid') + and relkind = 'r' and oid < 16384 order by 1 +loop + execute 'select min(oid) from ' || relnm into lowoid; + continue when lowoid is null or lowoid >= 16384; + if shared then + pinned := exists(select 1 from pg_shdepend + where refclassid = reloid and refobjid = lowoid + and deptype = 'p'); + else + pinned := exists(select 1 from pg_depend + where refclassid = reloid and refobjid = lowoid + and deptype = 'p'); + end if; + if not pinned then + raise notice '% contains unpinned initdb-created object(s)', relnm; + end if; +end loop; +end$$; + +-- **************** pg_class **************** + +-- Look for system tables with varlena columns but no toast table. All +-- system tables with toastable columns should have toast tables, with +-- the following exceptions: +-- 1. pg_class, pg_attribute, and pg_index, due to fear of recursive +-- dependencies as toast tables depend on them. +-- 2. pg_largeobject and pg_largeobject_metadata. Large object catalogs +-- and toast tables are mutually exclusive and large object data is handled +-- as user data by pg_upgrade, which would cause failures. + +-- GPDB: A few GPDB catalog tables are also missing toast tables. Not +-- for any particular reason, but the fields are only used to store short +-- system-generated values, so they don't need toasting. + +SELECT relname, attname, atttypid::regtype +FROM pg_class c JOIN pg_attribute a ON c.oid = attrelid +WHERE c.oid < 16384 AND + reltoastrelid = 0 AND + relkind = 'r' AND + attstorage != 'p' +ORDER BY 1, 2; + + +-- system catalogs without primary keys +-- +-- Current exceptions: +-- * pg_depend, pg_shdepend don't have a unique key +SELECT relname +FROM pg_class +WHERE relnamespace = 'pg_catalog'::regnamespace AND relkind = 'r' + AND pg_class.oid NOT IN (SELECT indrelid FROM pg_index WHERE indisprimary) + AND relname NOT like 'gp_segment_configuration' +ORDER BY 1; + + +-- system catalog unique indexes not wrapped in a constraint +-- (There should be none.) +SELECT relname +FROM pg_class c JOIN pg_index i ON c.oid = i.indexrelid +WHERE relnamespace = 'pg_catalog'::regnamespace AND relkind = 'i' + AND i.indisunique + AND c.oid NOT IN (SELECT conindid FROM pg_constraint) +ORDER BY 1; diff --git a/src/test/singlenode_regress/sql/money.sql b/src/test/singlenode_regress/sql/money.sql new file mode 100644 index 00000000000..5e746286c90 --- /dev/null +++ b/src/test/singlenode_regress/sql/money.sql @@ -0,0 +1,131 @@ +-- +-- MONEY +-- +-- Note that we assume lc_monetary has been set to C. +-- + +CREATE TABLE money_data (m money); + +INSERT INTO money_data VALUES ('123'); +SELECT * FROM money_data; +SELECT m + '123' FROM money_data; +SELECT m + '123.45' FROM money_data; +SELECT m - '123.45' FROM money_data; +SELECT m / '2'::money FROM money_data; +SELECT m * 2 FROM money_data; +SELECT 2 * m FROM money_data; +SELECT m / 2 FROM money_data; +SELECT m * 2::int2 FROM money_data; +SELECT 2::int2 * m FROM money_data; +SELECT m / 2::int2 FROM money_data; +SELECT m * 2::int8 FROM money_data; +SELECT 2::int8 * m FROM money_data; +SELECT m / 2::int8 FROM money_data; +SELECT m * 2::float8 FROM money_data; +SELECT 2::float8 * m FROM money_data; +SELECT m / 2::float8 FROM money_data; +SELECT m * 2::float4 FROM money_data; +SELECT 2::float4 * m FROM money_data; +SELECT m / 2::float4 FROM money_data; + +-- All true +SELECT m = '$123.00' FROM money_data; +SELECT m != '$124.00' FROM money_data; +SELECT m <= '$123.00' FROM money_data; +SELECT m >= '$123.00' FROM money_data; +SELECT m < '$124.00' FROM money_data; +SELECT m > '$122.00' FROM money_data; + +-- All false +SELECT m = '$123.01' FROM money_data; +SELECT m != '$123.00' FROM money_data; +SELECT m <= '$122.99' FROM money_data; +SELECT m >= '$123.01' FROM money_data; +SELECT m > '$124.00' FROM money_data; +SELECT m < '$122.00' FROM money_data; + +SELECT cashlarger(m, '$124.00') FROM money_data; +SELECT cashsmaller(m, '$124.00') FROM money_data; +SELECT cash_words(m) FROM money_data; +SELECT cash_words(m + '1.23') FROM money_data; + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.45'); +SELECT * FROM money_data; + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.451'); +SELECT * FROM money_data; + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.454'); +SELECT * FROM money_data; + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.455'); +SELECT * FROM money_data; + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.456'); +SELECT * FROM money_data; + +DELETE FROM money_data; +INSERT INTO money_data VALUES ('$123.459'); +SELECT * FROM money_data; + +-- input checks +SELECT '1234567890'::money; +SELECT '12345678901234567'::money; +SELECT '123456789012345678'::money; +SELECT '9223372036854775807'::money; +SELECT '-12345'::money; +SELECT '-1234567890'::money; +SELECT '-12345678901234567'::money; +SELECT '-123456789012345678'::money; +SELECT '-9223372036854775808'::money; + +-- special characters +SELECT '(1)'::money; +SELECT '($123,456.78)'::money; + +-- documented minimums and maximums +SELECT '-92233720368547758.08'::money; +SELECT '92233720368547758.07'::money; + +SELECT '-92233720368547758.09'::money; +SELECT '92233720368547758.08'::money; + +-- rounding +SELECT '-92233720368547758.085'::money; +SELECT '92233720368547758.075'::money; + +-- rounding vs. truncation in division +SELECT '878.08'::money / 11::float8; +SELECT '878.08'::money / 11::float4; +SELECT '878.08'::money / 11::bigint; +SELECT '878.08'::money / 11::int; +SELECT '878.08'::money / 11::smallint; + +-- check for precision loss in division +SELECT '90000000000000099.00'::money / 10::bigint; +SELECT '90000000000000099.00'::money / 10::int; +SELECT '90000000000000099.00'::money / 10::smallint; + +-- Cast int4/int8/numeric to money +SELECT 1234567890::money; +SELECT 12345678901234567::money; +SELECT (-12345)::money; +SELECT (-1234567890)::money; +SELECT (-12345678901234567)::money; +SELECT 1234567890::int4::money; +SELECT 12345678901234567::int8::money; +SELECT 12345678901234567::numeric::money; +SELECT (-1234567890)::int4::money; +SELECT (-12345678901234567)::int8::money; +SELECT (-12345678901234567)::numeric::money; + +-- Cast from money to numeric +SELECT '12345678901234567'::money::numeric; +SELECT '-12345678901234567'::money::numeric; +SELECT '92233720368547758.07'::money::numeric; +SELECT '-92233720368547758.08'::money::numeric; diff --git a/src/test/singlenode_regress/sql/multirangetypes.sql b/src/test/singlenode_regress/sql/multirangetypes.sql new file mode 100644 index 00000000000..df1edb4d31a --- /dev/null +++ b/src/test/singlenode_regress/sql/multirangetypes.sql @@ -0,0 +1,835 @@ +-- Tests for multirange data types. + +-- +-- test input parser +-- + +-- negative tests; should fail +select ''::textmultirange; +select '{,}'::textmultirange; +select '{(,)}.'::textmultirange; +select '{[a,c),}'::textmultirange; +select '{,[a,c)}'::textmultirange; +select '{-[a,z)}'::textmultirange; +select '{[a,z) - }'::textmultirange; +select '{(",a)}'::textmultirange; +select '{(,,a)}'::textmultirange; +select '{(),a)}'::textmultirange; +select '{(a,))}'::textmultirange; +select '{(],a)}'::textmultirange; +select '{(a,])}'::textmultirange; +select '{[z,a]}'::textmultirange; + +-- should succeed +select '{}'::textmultirange; +select ' {} '::textmultirange; +select ' { empty, empty } '::textmultirange; +select ' {( " a " " a ", " z " " z " ) }'::textmultirange; +select textrange('\\\\', repeat('a', 200))::textmultirange; +select '{(,z)}'::textmultirange; +select '{(a,)}'::textmultirange; +select '{[,z]}'::textmultirange; +select '{[a,]}'::textmultirange; +select '{(,)}'::textmultirange; +select '{[ , ]}'::textmultirange; +select '{["",""]}'::textmultirange; +select '{[",",","]}'::textmultirange; +select '{["\\","\\"]}'::textmultirange; +select '{["""","\""]}'::textmultirange; +select '{(\\,a)}'::textmultirange; +select '{((,z)}'::textmultirange; +select '{([,z)}'::textmultirange; +select '{(!,()}'::textmultirange; +select '{(!,[)}'::textmultirange; +select '{[a,a]}'::textmultirange; +select '{[a,a],[a,b]}'::textmultirange; +select '{[a,b), [b,e]}'::textmultirange; +select '{[a,d), [b,f]}'::textmultirange; +select '{[a,a],[b,b]}'::textmultirange; +-- without canonicalization, we can't join these: +select '{[a,a], [b,b]}'::textmultirange; +-- with canonicalization, we can join these: +select '{[1,2], [3,4]}'::int4multirange; +select '{[a,a], [b,b], [c,c]}'::textmultirange; +select '{[a,d], [b,e]}'::textmultirange; +select '{[a,d), [d,e)}'::textmultirange; +-- these are allowed but normalize to empty: +select '{[a,a)}'::textmultirange; +select '{(a,a]}'::textmultirange; +select '{(a,a)}'::textmultirange; + +-- +-- test the constructor +--- +select textmultirange(); +select textmultirange(textrange('a', 'c')); +select textmultirange(textrange('a', 'c'), textrange('f', 'g')); +select textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd')); + +-- +-- test casts, both a built-in range type and a user-defined one: +-- +select 'empty'::int4range::int4multirange; +select int4range(1, 3)::int4multirange; +select int4range(1, null)::int4multirange; +select int4range(null, null)::int4multirange; +select 'empty'::textrange::textmultirange; +select textrange('a', 'c')::textmultirange; +select textrange('a', null)::textmultirange; +select textrange(null, null)::textmultirange; + +-- +-- test unnest(multirange) function +-- +select unnest(int4multirange(int4range('5', '6'), int4range('1', '2'))); +select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e'))); +select unnest(textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd'))); + +-- +-- create some test data and test the operators +-- + +CREATE TABLE nummultirange_test (nmr NUMMULTIRANGE); +CREATE INDEX nummultirange_test_btree ON nummultirange_test(nmr); + +INSERT INTO nummultirange_test VALUES('{}'); +INSERT INTO nummultirange_test VALUES('{[,)}'); +INSERT INTO nummultirange_test VALUES('{[3,]}'); +INSERT INTO nummultirange_test VALUES('{[,), [3,]}'); +INSERT INTO nummultirange_test VALUES('{[, 5)}'); +INSERT INTO nummultirange_test VALUES(nummultirange()); +INSERT INTO nummultirange_test VALUES(nummultirange(variadic '{}'::numrange[])); +INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.1, 2.2))); +INSERT INTO nummultirange_test VALUES('{empty}'); +INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.7, 1.7, '[]'), numrange(1.7, 1.9))); +INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.7, 1.7, '[]'), numrange(1.9, 2.1))); + +SELECT nmr, isempty(nmr), lower(nmr), upper(nmr) FROM nummultirange_test ORDER BY nmr; +SELECT nmr, lower_inc(nmr), lower_inf(nmr), upper_inc(nmr), upper_inf(nmr) FROM nummultirange_test ORDER BY nmr; + +SELECT * FROM nummultirange_test WHERE nmr = '{}'; +SELECT * FROM nummultirange_test WHERE nmr = '{(,5)}'; +SELECT * FROM nummultirange_test WHERE nmr = '{[3,)}'; +SELECT * FROM nummultirange_test WHERE nmr = '{[1.7,1.7]}'; +SELECT * FROM nummultirange_test WHERE nmr = '{[1.7,1.7],[1.9,2.1)}'; +SELECT * FROM nummultirange_test WHERE nmr < '{}'; +SELECT * FROM nummultirange_test WHERE nmr < '{[-1000.0, -1000.0]}'; +SELECT * FROM nummultirange_test WHERE nmr < '{[0.0, 1.0]}'; +SELECT * FROM nummultirange_test WHERE nmr < '{[1000.0, 1001.0]}'; +SELECT * FROM nummultirange_test WHERE nmr <= '{}'; +SELECT * FROM nummultirange_test WHERE nmr <= '{[3,)}'; +SELECT * FROM nummultirange_test WHERE nmr >= '{}'; +SELECT * FROM nummultirange_test WHERE nmr >= '{[3,)}'; +SELECT * FROM nummultirange_test WHERE nmr > '{}'; +SELECT * FROM nummultirange_test WHERE nmr > '{[-1000.0, -1000.0]}'; +SELECT * FROM nummultirange_test WHERE nmr > '{[0.0, 1.0]}'; +SELECT * FROM nummultirange_test WHERE nmr > '{[1000.0, 1001.0]}'; +SELECT * FROM nummultirange_test WHERE nmr <> '{}'; +SELECT * FROM nummultirange_test WHERE nmr <> '{(,5)}'; + +select nummultirange(numrange(2.0, 1.0)); +select nummultirange(numrange(5.0, 6.0), numrange(1.0, 2.0)); + +analyze nummultirange_test; + +-- overlaps +SELECT * FROM nummultirange_test WHERE range_overlaps_multirange(numrange(4.0, 4.2), nmr); +SELECT * FROM nummultirange_test WHERE numrange(4.0, 4.2) && nmr; +SELECT * FROM nummultirange_test WHERE multirange_overlaps_range(nmr, numrange(4.0, 4.2)); +SELECT * FROM nummultirange_test WHERE nmr && numrange(4.0, 4.2); +SELECT * FROM nummultirange_test WHERE multirange_overlaps_multirange(nmr, nummultirange(numrange(4.0, 4.2), numrange(6.0, 7.0))); +SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(4.0, 4.2), numrange(6.0, 7.0)); +SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(6.0, 7.0)); +SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(6.0, 7.0), numrange(8.0, 9.0)); + +-- mr contains x +SELECT * FROM nummultirange_test WHERE multirange_contains_elem(nmr, 4.0); +SELECT * FROM nummultirange_test WHERE nmr @> 4.0; +SELECT * FROM nummultirange_test WHERE multirange_contains_range(nmr, numrange(4.0, 4.2)); +SELECT * FROM nummultirange_test WHERE nmr @> numrange(4.0, 4.2); +SELECT * FROM nummultirange_test WHERE multirange_contains_multirange(nmr, '{[4.0,4.2), [6.0, 8.0)}'); +SELECT * FROM nummultirange_test WHERE nmr @> '{[4.0,4.2), [6.0, 8.0)}'::nummultirange; + +-- x is contained by mr +SELECT * FROM nummultirange_test WHERE elem_contained_by_multirange(4.0, nmr); +SELECT * FROM nummultirange_test WHERE 4.0 <@ nmr; +SELECT * FROM nummultirange_test WHERE range_contained_by_multirange(numrange(4.0, 4.2), nmr); +SELECT * FROM nummultirange_test WHERE numrange(4.0, 4.2) <@ nmr; +SELECT * FROM nummultirange_test WHERE multirange_contained_by_multirange('{[4.0,4.2), [6.0, 8.0)}', nmr); +SELECT * FROM nummultirange_test WHERE '{[4.0,4.2), [6.0, 8.0)}'::nummultirange <@ nmr; + +-- overlaps +SELECT 'empty'::numrange && nummultirange(); +SELECT 'empty'::numrange && nummultirange(numrange(1,2)); +SELECT nummultirange() && 'empty'::numrange; +SELECT nummultirange(numrange(1,2)) && 'empty'::numrange; +SELECT nummultirange() && nummultirange(); +SELECT nummultirange() && nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(1,2)) && nummultirange(); +SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(7,8)); +SELECT nummultirange(numrange(1,2), numrange(7,8)) && nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(3.5,8)); +SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && numrange(3,4); +SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && nummultirange(numrange(3,4)); +select '{(10,20),(30,40),(50,60)}'::nummultirange && '(42,92)'::numrange; + +-- contains +SELECT nummultirange() @> nummultirange(); +SELECT nummultirange() @> 'empty'::numrange; +SELECT nummultirange(numrange(null,null)) @> numrange(1,2); +SELECT nummultirange(numrange(null,null)) @> numrange(null,2); +SELECT nummultirange(numrange(null,null)) @> numrange(2,null); +SELECT nummultirange(numrange(null,5)) @> numrange(null,3); +SELECT nummultirange(numrange(null,5)) @> numrange(null,8); +SELECT nummultirange(numrange(5,null)) @> numrange(8,null); +SELECT nummultirange(numrange(5,null)) @> numrange(3,null); +SELECT nummultirange(numrange(1,5)) @> numrange(8,9); +SELECT nummultirange(numrange(1,5)) @> numrange(3,9); +SELECT nummultirange(numrange(1,5)) @> numrange(1,4); +SELECT nummultirange(numrange(1,5)) @> numrange(1,5); +SELECT nummultirange(numrange(-4,-2), numrange(1,5)) @> numrange(1,5); +SELECT nummultirange(numrange(1,5), numrange(8,9)) @> numrange(1,5); +SELECT nummultirange(numrange(1,5), numrange(8,9)) @> numrange(6,7); +SELECT nummultirange(numrange(1,5), numrange(6,9)) @> numrange(6,7); +SELECT '{[1,5)}'::nummultirange @> '{[1,5)}'; +SELECT '{[-4,-2), [1,5)}'::nummultirange @> '{[1,5)}'; +SELECT '{[1,5), [8,9)}'::nummultirange @> '{[1,5)}'; +SELECT '{[1,5), [8,9)}'::nummultirange @> '{[6,7)}'; +SELECT '{[1,5), [6,9)}'::nummultirange @> '{[6,7)}'; +select '{(10,20),(30,40),(50,60)}'::nummultirange @> '(52,56)'::numrange; +SELECT numrange(null,null) @> nummultirange(numrange(1,2)); +SELECT numrange(null,null) @> nummultirange(numrange(null,2)); +SELECT numrange(null,null) @> nummultirange(numrange(2,null)); +SELECT numrange(null,5) @> nummultirange(numrange(null,3)); +SELECT numrange(null,5) @> nummultirange(numrange(null,8)); +SELECT numrange(5,null) @> nummultirange(numrange(8,null)); +SELECT numrange(5,null) @> nummultirange(numrange(3,null)); +SELECT numrange(1,5) @> nummultirange(numrange(8,9)); +SELECT numrange(1,5) @> nummultirange(numrange(3,9)); +SELECT numrange(1,5) @> nummultirange(numrange(1,4)); +SELECT numrange(1,5) @> nummultirange(numrange(1,5)); +SELECT numrange(1,9) @> nummultirange(numrange(-4,-2), numrange(1,5)); +SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(8,9)); +SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(6,9)); +SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(6,10)); +SELECT '{[1,9)}' @> '{[1,5)}'::nummultirange; +SELECT '{[1,9)}' @> '{[-4,-2), [1,5)}'::nummultirange; +SELECT '{[1,9)}' @> '{[1,5), [8,9)}'::nummultirange; +SELECT '{[1,9)}' @> '{[1,5), [6,9)}'::nummultirange; +SELECT '{[1,9)}' @> '{[1,5), [6,10)}'::nummultirange; + +-- is contained by +SELECT nummultirange() <@ nummultirange(); +SELECT 'empty'::numrange <@ nummultirange(); +SELECT numrange(1,2) <@ nummultirange(numrange(null,null)); +SELECT numrange(null,2) <@ nummultirange(numrange(null,null)); +SELECT numrange(2,null) <@ nummultirange(numrange(null,null)); +SELECT numrange(null,3) <@ nummultirange(numrange(null,5)); +SELECT numrange(null,8) <@ nummultirange(numrange(null,5)); +SELECT numrange(8,null) <@ nummultirange(numrange(5,null)); +SELECT numrange(3,null) <@ nummultirange(numrange(5,null)); +SELECT numrange(8,9) <@ nummultirange(numrange(1,5)); +SELECT numrange(3,9) <@ nummultirange(numrange(1,5)); +SELECT numrange(1,4) <@ nummultirange(numrange(1,5)); +SELECT numrange(1,5) <@ nummultirange(numrange(1,5)); +SELECT numrange(1,5) <@ nummultirange(numrange(-4,-2), numrange(1,5)); +SELECT numrange(1,5) <@ nummultirange(numrange(1,5), numrange(8,9)); +SELECT numrange(6,7) <@ nummultirange(numrange(1,5), numrange(8,9)); +SELECT numrange(6,7) <@ nummultirange(numrange(1,5), numrange(6,9)); +SELECT '{[1,5)}' <@ '{[1,5)}'::nummultirange; +SELECT '{[1,5)}' <@ '{[-4,-2), [1,5)}'::nummultirange; +SELECT '{[1,5)}' <@ '{[1,5), [8,9)}'::nummultirange; +SELECT '{[6,7)}' <@ '{[1,5), [8,9)}'::nummultirange; +SELECT '{[6,7)}' <@ '{[1,5), [6,9)}'::nummultirange; +SELECT nummultirange(numrange(1,2)) <@ numrange(null,null); +SELECT nummultirange(numrange(null,2)) <@ numrange(null,null); +SELECT nummultirange(numrange(2,null)) <@ numrange(null,null); +SELECT nummultirange(numrange(null,3)) <@ numrange(null,5); +SELECT nummultirange(numrange(null,8)) <@ numrange(null,5); +SELECT nummultirange(numrange(8,null)) <@ numrange(5,null); +SELECT nummultirange(numrange(3,null)) <@ numrange(5,null); +SELECT nummultirange(numrange(8,9)) <@ numrange(1,5); +SELECT nummultirange(numrange(3,9)) <@ numrange(1,5); +SELECT nummultirange(numrange(1,4)) <@ numrange(1,5); +SELECT nummultirange(numrange(1,5)) <@ numrange(1,5); +SELECT nummultirange(numrange(-4,-2), numrange(1,5)) <@ numrange(1,9); +SELECT nummultirange(numrange(1,5), numrange(8,9)) <@ numrange(1,9); +SELECT nummultirange(numrange(1,5), numrange(6,9)) <@ numrange(1,9); +SELECT nummultirange(numrange(1,5), numrange(6,10)) <@ numrange(1,9); +SELECT '{[1,5)}'::nummultirange <@ '{[1,9)}'; +SELECT '{[-4,-2), [1,5)}'::nummultirange <@ '{[1,9)}'; +SELECT '{[1,5), [8,9)}'::nummultirange <@ '{[1,9)}'; +SELECT '{[1,5), [6,9)}'::nummultirange <@ '{[1,9)}'; +SELECT '{[1,5), [6,10)}'::nummultirange <@ '{[1,9)}'; + +-- overleft +SELECT 'empty'::numrange &< nummultirange(); +SELECT 'empty'::numrange &< nummultirange(numrange(1,2)); +SELECT nummultirange() &< 'empty'::numrange; +SELECT nummultirange(numrange(1,2)) &< 'empty'::numrange; +SELECT nummultirange() &< nummultirange(); +SELECT nummultirange(numrange(1,2)) &< nummultirange(); +SELECT nummultirange() &< nummultirange(numrange(1,2)); +SELECT numrange(6,7) &< nummultirange(numrange(3,4)); +SELECT numrange(1,2) &< nummultirange(numrange(3,4)); +SELECT numrange(1,4) &< nummultirange(numrange(3,4)); +SELECT numrange(1,6) &< nummultirange(numrange(3,4)); +SELECT numrange(3.5,6) &< nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(6,7)) &< numrange(3,4); +SELECT nummultirange(numrange(1,2)) &< numrange(3,4); +SELECT nummultirange(numrange(1,4)) &< numrange(3,4); +SELECT nummultirange(numrange(1,6)) &< numrange(3,4); +SELECT nummultirange(numrange(3.5,6)) &< numrange(3,4); +SELECT nummultirange(numrange(6,7)) &< nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,2)) &< nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,4)) &< nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,6)) &< nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(3.5,6)) &< nummultirange(numrange(3,4)); + +-- overright +SELECT nummultirange() &> 'empty'::numrange; +SELECT nummultirange(numrange(1,2)) &> 'empty'::numrange; +SELECT 'empty'::numrange &> nummultirange(); +SELECT 'empty'::numrange &> nummultirange(numrange(1,2)); +SELECT nummultirange() &> nummultirange(); +SELECT nummultirange() &> nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(1,2)) &> nummultirange(); +SELECT nummultirange(numrange(3,4)) &> numrange(6,7); +SELECT nummultirange(numrange(3,4)) &> numrange(1,2); +SELECT nummultirange(numrange(3,4)) &> numrange(1,4); +SELECT nummultirange(numrange(3,4)) &> numrange(1,6); +SELECT nummultirange(numrange(3,4)) &> numrange(3.5,6); +SELECT numrange(3,4) &> nummultirange(numrange(6,7)); +SELECT numrange(3,4) &> nummultirange(numrange(1,2)); +SELECT numrange(3,4) &> nummultirange(numrange(1,4)); +SELECT numrange(3,4) &> nummultirange(numrange(1,6)); +SELECT numrange(3,4) &> nummultirange(numrange(3.5,6)); +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(6,7)); +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,4)); +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,6)); +SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(3.5,6)); + +-- meets +SELECT 'empty'::numrange -|- nummultirange(); +SELECT 'empty'::numrange -|- nummultirange(numrange(1,2)); +SELECT nummultirange() -|- 'empty'::numrange; +SELECT nummultirange(numrange(1,2)) -|- 'empty'::numrange; +SELECT nummultirange() -|- nummultirange(); +SELECT nummultirange(numrange(1,2)) -|- nummultirange(); +SELECT nummultirange() -|- nummultirange(numrange(1,2)); +SELECT numrange(1,2) -|- nummultirange(numrange(2,4)); +SELECT numrange(1,2) -|- nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,2)) -|- numrange(2,4); +SELECT nummultirange(numrange(1,2)) -|- numrange(3,4); +SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(2,4)); +SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(6,7)); +SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(8,9)); +SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(2,4), numrange(6,7)); + +-- strictly left +select 'empty'::numrange << nummultirange(); +select numrange(1,2) << nummultirange(); +select numrange(1,2) << nummultirange(numrange(3,4)); +select numrange(1,2) << nummultirange(numrange(0,4)); +select numrange(1,2) << nummultirange(numrange(0,4), numrange(7,8)); +select nummultirange() << 'empty'::numrange; +select nummultirange() << numrange(1,2); +select nummultirange(numrange(3,4)) << numrange(3,6); +select nummultirange(numrange(0,2)) << numrange(3,6); +select nummultirange(numrange(0,2), numrange(7,8)) << numrange(3,6); +select nummultirange(numrange(-4,-2), numrange(0,2)) << numrange(3,6); +select nummultirange() << nummultirange(); +select nummultirange() << nummultirange(numrange(1,2)); +select nummultirange(numrange(1,2)) << nummultirange(); +select nummultirange(numrange(1,2)) << nummultirange(numrange(1,2)); +select nummultirange(numrange(1,2)) << nummultirange(numrange(3,4)); +select nummultirange(numrange(1,2)) << nummultirange(numrange(3,4), numrange(7,8)); +select nummultirange(numrange(1,2), numrange(4,5)) << nummultirange(numrange(3,4), numrange(7,8)); + +-- strictly right +select nummultirange() >> 'empty'::numrange; +select nummultirange() >> numrange(1,2); +select nummultirange(numrange(3,4)) >> numrange(1,2); +select nummultirange(numrange(0,4)) >> numrange(1,2); +select nummultirange(numrange(0,4), numrange(7,8)) >> numrange(1,2); +select 'empty'::numrange >> nummultirange(); +select numrange(1,2) >> nummultirange(); +select numrange(3,6) >> nummultirange(numrange(3,4)); +select numrange(3,6) >> nummultirange(numrange(0,2)); +select numrange(3,6) >> nummultirange(numrange(0,2), numrange(7,8)); +select numrange(3,6) >> nummultirange(numrange(-4,-2), numrange(0,2)); +select nummultirange() >> nummultirange(); +select nummultirange(numrange(1,2)) >> nummultirange(); +select nummultirange() >> nummultirange(numrange(1,2)); +select nummultirange(numrange(1,2)) >> nummultirange(numrange(1,2)); +select nummultirange(numrange(3,4)) >> nummultirange(numrange(1,2)); +select nummultirange(numrange(3,4), numrange(7,8)) >> nummultirange(numrange(1,2)); +select nummultirange(numrange(3,4), numrange(7,8)) >> nummultirange(numrange(1,2), numrange(4,5)); + +-- union +SELECT nummultirange() + nummultirange(); +SELECT nummultirange() + nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(1,2)) + nummultirange(); +SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(2,4)); +SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(2,4)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(0,9)); + +-- merge +SELECT range_merge(nummultirange()); +SELECT range_merge(nummultirange(numrange(1,2))); +SELECT range_merge(nummultirange(numrange(1,2), numrange(7,8))); + +-- minus +SELECT nummultirange() - nummultirange(); +SELECT nummultirange() - nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(1,2)) - nummultirange(); +SELECT nummultirange(numrange(1,2), numrange(3,4)) - nummultirange(); +SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(2,4)); +SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(3,4)); +SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(2,3)); +SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(0,8)); +SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(0,2)); +SELECT nummultirange(numrange(1,8)) - nummultirange(numrange(0,2), numrange(3,4)); +SELECT nummultirange(numrange(1,8)) - nummultirange(numrange(2,3), numrange(5,null)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(-2,0)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(2,4)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(3,5)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(0,9)); +SELECT nummultirange(numrange(1,3), numrange(4,5)) - nummultirange(numrange(2,9)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(8,9)); +SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(-2,0), numrange(8,9)); + +-- intersection +SELECT nummultirange() * nummultirange(); +SELECT nummultirange() * nummultirange(numrange(1,2)); +SELECT nummultirange(numrange(1,2)) * nummultirange(); +SELECT '{[1,3)}'::nummultirange * '{[1,5)}'::nummultirange; +SELECT '{[1,3)}'::nummultirange * '{[0,5)}'::nummultirange; +SELECT '{[1,3)}'::nummultirange * '{[0,2)}'::nummultirange; +SELECT '{[1,3)}'::nummultirange * '{[2,5)}'::nummultirange; +SELECT '{[1,4)}'::nummultirange * '{[2,3)}'::nummultirange; +SELECT '{[1,4)}'::nummultirange * '{[0,2), [3,5)}'::nummultirange; +SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,8), [9,12)}'::nummultirange; +SELECT '{[1,4), [7,10)}'::nummultirange * '{[9,12)}'::nummultirange; +SELECT '{[1,4), [7,10)}'::nummultirange * '{[-5,-4), [5,6), [9,12)}'::nummultirange; +SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,2), [3,8), [9,12)}'::nummultirange; +SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,2), [3,8), [9,12)}'::nummultirange; + +-- test GiST index +create table test_multirange_gist(mr int4multirange); +insert into test_multirange_gist select int4multirange(int4range(g, g+10),int4range(g+20, g+30),int4range(g+40, g+50)) from generate_series(1,2000) g; +insert into test_multirange_gist select '{}'::int4multirange from generate_series(1,500) g; +insert into test_multirange_gist select int4multirange(int4range(g, g+10000)) from generate_series(1,1000) g; +insert into test_multirange_gist select int4multirange(int4range(NULL, g*10, '(]'), int4range(g*10, g*20, '(]')) from generate_series(1,100) g; +insert into test_multirange_gist select int4multirange(int4range(g*10, g*20, '(]'), int4range(g*20, NULL, '(]')) from generate_series(1,100) g; +create index test_mulrirange_gist_idx on test_multirange_gist using gist (mr); + +-- test statistics and selectivity estimation as well +-- +-- We don't check the accuracy of selectivity estimation, but at least check +-- it doesn't fall. +analyze test_multirange_gist; + +-- first, verify non-indexed results +SET enable_seqscan = t; +SET enable_indexscan = f; +SET enable_bitmapscan = f; + +select count(*) from test_multirange_gist where mr = '{}'::int4multirange; +select count(*) from test_multirange_gist where mr @> 'empty'::int4range; +select count(*) from test_multirange_gist where mr && 'empty'::int4range; +select count(*) from test_multirange_gist where mr <@ 'empty'::int4range; +select count(*) from test_multirange_gist where mr << 'empty'::int4range; +select count(*) from test_multirange_gist where mr >> 'empty'::int4range; +select count(*) from test_multirange_gist where mr &< 'empty'::int4range; +select count(*) from test_multirange_gist where mr &> 'empty'::int4range; +select count(*) from test_multirange_gist where mr -|- 'empty'::int4range; +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr && '{}'::int4multirange; +select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange; +select count(*) from test_multirange_gist where mr << '{}'::int4multirange; +select count(*) from test_multirange_gist where mr >> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr &< '{}'::int4multirange; +select count(*) from test_multirange_gist where mr &> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange; + +select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60)); +select count(*) from test_multirange_gist where mr @> 10; +select count(*) from test_multirange_gist where mr @> int4range(10,20); +select count(*) from test_multirange_gist where mr && int4range(10,20); +select count(*) from test_multirange_gist where mr <@ int4range(10,50); +select count(*) from test_multirange_gist where mr << int4range(100,500); +select count(*) from test_multirange_gist where mr >> int4range(100,500); +select count(*) from test_multirange_gist where mr &< int4range(100,500); +select count(*) from test_multirange_gist where mr &> int4range(100,500); +select count(*) from test_multirange_gist where mr -|- int4range(100,500); +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr @> int4multirange(int4range(10,20), int4range(30,40)); +select count(*) from test_multirange_gist where mr && '{(10,20),(30,40),(50,60)}'::int4multirange; +select count(*) from test_multirange_gist where mr <@ '{(10,30),(40,60),(70,90)}'::int4multirange; +select count(*) from test_multirange_gist where mr << int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_multirange_gist where mr >> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_multirange_gist where mr &< int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_multirange_gist where mr &> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(100,200), int4range(400,500)); + +-- now check same queries using index +SET enable_seqscan = f; +SET enable_indexscan = t; +SET enable_bitmapscan = f; + +select count(*) from test_multirange_gist where mr = '{}'::int4multirange; +select count(*) from test_multirange_gist where mr @> 'empty'::int4range; +select count(*) from test_multirange_gist where mr && 'empty'::int4range; +select count(*) from test_multirange_gist where mr <@ 'empty'::int4range; +select count(*) from test_multirange_gist where mr << 'empty'::int4range; +select count(*) from test_multirange_gist where mr >> 'empty'::int4range; +select count(*) from test_multirange_gist where mr &< 'empty'::int4range; +select count(*) from test_multirange_gist where mr &> 'empty'::int4range; +select count(*) from test_multirange_gist where mr -|- 'empty'::int4range; +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr && '{}'::int4multirange; +select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange; +select count(*) from test_multirange_gist where mr << '{}'::int4multirange; +select count(*) from test_multirange_gist where mr >> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr &< '{}'::int4multirange; +select count(*) from test_multirange_gist where mr &> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange; + +select count(*) from test_multirange_gist where mr @> 'empty'::int4range; +select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60)); +select count(*) from test_multirange_gist where mr @> 10; +select count(*) from test_multirange_gist where mr @> int4range(10,20); +select count(*) from test_multirange_gist where mr && int4range(10,20); +select count(*) from test_multirange_gist where mr <@ int4range(10,50); +select count(*) from test_multirange_gist where mr << int4range(100,500); +select count(*) from test_multirange_gist where mr >> int4range(100,500); +select count(*) from test_multirange_gist where mr &< int4range(100,500); +select count(*) from test_multirange_gist where mr &> int4range(100,500); +select count(*) from test_multirange_gist where mr -|- int4range(100,500); +select count(*) from test_multirange_gist where mr @> '{}'::int4multirange; +select count(*) from test_multirange_gist where mr @> int4multirange(int4range(10,20), int4range(30,40)); +select count(*) from test_multirange_gist where mr && '{(10,20),(30,40),(50,60)}'::int4multirange; +select count(*) from test_multirange_gist where mr <@ '{(10,30),(40,60),(70,90)}'::int4multirange; +select count(*) from test_multirange_gist where mr << int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_multirange_gist where mr >> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_multirange_gist where mr &< int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_multirange_gist where mr &> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(100,200), int4range(400,500)); + +drop table test_multirange_gist; + +-- +-- range_agg function +-- +create table reservations ( room_id integer not null, booked_during daterange ); +insert into reservations values +-- 1: has a meets and a gap +(1, daterange('2018-07-01', '2018-07-07')), +(1, daterange('2018-07-07', '2018-07-14')), +(1, daterange('2018-07-20', '2018-07-22')), +-- 2: just a single row +(2, daterange('2018-07-01', '2018-07-03')), +-- 3: one null range +(3, NULL), +-- 4: two null ranges +(4, NULL), +(4, NULL), +-- 5: a null range and a non-null range +(5, NULL), +(5, daterange('2018-07-01', '2018-07-03')), +-- 6: has overlap +(6, daterange('2018-07-01', '2018-07-07')), +(6, daterange('2018-07-05', '2018-07-10')), +-- 7: two ranges that meet: no gap or overlap +(7, daterange('2018-07-01', '2018-07-07')), +(7, daterange('2018-07-07', '2018-07-14')), +-- 8: an empty range +(8, 'empty'::daterange) +; +SELECT room_id, range_agg(booked_during) +FROM reservations +GROUP BY room_id +ORDER BY room_id; + +-- range_agg on a custom range type too +SELECT range_agg(r) +FROM (VALUES + ('[a,c]'::textrange), + ('[b,b]'::textrange), + ('[c,f]'::textrange), + ('[g,h)'::textrange), + ('[h,j)'::textrange) + ) t(r); + +select range_intersect_agg(nmr) from nummultirange_test; +select range_intersect_agg(nmr) from nummultirange_test where false; +-- test with just one input: +select range_intersect_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr); +select range_intersect_agg(nmr) from nummultirange_test where nmr @> 4.0; + +create table nummultirange_test2(nmr nummultirange); +create index nummultirange_test2_hash_idx on nummultirange_test2 using hash (nmr); + +INSERT INTO nummultirange_test2 VALUES('{[, 5)}'); +INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2))); +INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2))); +INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2,'()'))); +INSERT INTO nummultirange_test2 VALUES('{}'); + +select * from nummultirange_test2 where nmr = '{}'; +select * from nummultirange_test2 where nmr = nummultirange(numrange(1.1, 2.2)); +select * from nummultirange_test2 where nmr = nummultirange(numrange(1.1, 2.3)); + +set enable_nestloop=t; +set enable_hashjoin=f; +set enable_mergejoin=f; +select * from nummultirange_test natural join nummultirange_test2 order by nmr; +set enable_nestloop=f; +set enable_hashjoin=t; +set enable_mergejoin=f; +select * from nummultirange_test natural join nummultirange_test2 order by nmr; +set enable_nestloop=f; +set enable_hashjoin=f; +set enable_mergejoin=t; +select * from nummultirange_test natural join nummultirange_test2 order by nmr; + +set enable_nestloop to default; +set enable_hashjoin to default; +set enable_mergejoin to default; + +DROP TABLE nummultirange_test2; + +-- +-- Test user-defined multirange of floats +-- + +select '{[123.001, 5.e9)}'::float8multirange @> 888.882::float8; +create table float8multirange_test(f8mr float8multirange, i int); +insert into float8multirange_test values(float8multirange(float8range(-100.00007, '1.111113e9')), 42); +select * from float8multirange_test; +drop table float8multirange_test; + +-- +-- Test multirange types over domains +-- + +create domain mydomain as int4; +create type mydomainrange as range(subtype=mydomain); +select '{[4,50)}'::mydomainmultirange @> 7::mydomain; +drop domain mydomain cascade; + +-- +-- Test domains over multirange types +-- + +create domain restrictedmultirange as int4multirange check (upper(value) < 10); +select '{[4,5)}'::restrictedmultirange @> 7; +select '{[4,50)}'::restrictedmultirange @> 7; -- should fail +drop domain restrictedmultirange; + +--- +-- Check automatic naming of multiranges +--- + +create type intr as range(subtype=int); +select intr_multirange(intr(1,10)); +drop type intr; +create type intmultirange as (x int, y int); +create type intrange as range(subtype=int); -- should fail +drop type intmultirange; +create type intr_multirange as (x int, y int); +create type intr as range(subtype=int); -- should fail +drop type intr_multirange; + +-- +-- Test multiple multirange types over the same subtype and manual naming of +-- the multirange type. +-- + +-- should fail +create type textrange1 as range(subtype=text, multirange_type_name=int, collation="C"); +-- should pass +create type textrange1 as range(subtype=text, multirange_type_name=multirange_of_text, collation="C"); +-- should pass, because existing _textrange1 is automatically renamed +create type textrange2 as range(subtype=text, multirange_type_name=_textrange1, collation="C"); + +select multirange_of_text(textrange2('a','Z')); -- should fail +select multirange_of_text(textrange1('a','Z')) @> 'b'::text; +select unnest(multirange_of_text(textrange1('a','b'), textrange1('d','e'))); +select _textrange1(textrange2('a','z')) @> 'b'::text; + +drop type textrange1; +drop type textrange2; + +-- +-- Test polymorphic type system +-- + +create function anyarray_anymultirange_func(a anyarray, r anymultirange) + returns anyelement as 'select $1[1] + lower($2);' language sql; + +select anyarray_anymultirange_func(ARRAY[1,2], int4multirange(int4range(10,20))); + +-- should fail +select anyarray_anymultirange_func(ARRAY[1,2], nummultirange(numrange(10,20))); + +drop function anyarray_anymultirange_func(anyarray, anymultirange); + +-- should fail +create function bogus_func(anyelement) + returns anymultirange as 'select int4multirange(int4range(1,10))' language sql; + +-- should fail +create function bogus_func(int) + returns anymultirange as 'select int4multirange(int4range(1,10))' language sql; + +create function range_add_bounds(anymultirange) + returns anyelement as 'select lower($1) + upper($1)' language sql; + +select range_add_bounds(int4multirange(int4range(1, 17))); +select range_add_bounds(nummultirange(numrange(1.0001, 123.123))); + +create function multirangetypes_sql(q anymultirange, b anyarray, out c anyelement) + as $$ select upper($1) + $2[1] $$ + language sql; + +select multirangetypes_sql(int4multirange(int4range(1,10)), ARRAY[2,20]); +select multirangetypes_sql(nummultirange(numrange(1,10)), ARRAY[2,20]); -- match failure + +create function anycompatiblearray_anycompatiblemultirange_func(a anycompatiblearray, mr anycompatiblemultirange) + returns anycompatible as 'select $1[1] + lower($2);' language sql; + +select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1,2], multirange(int4range(10,20))); + +select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1,2], multirange(numrange(10,20))); + +-- should fail +select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1.1,2], multirange(int4range(10,20))); + +drop function anycompatiblearray_anycompatiblemultirange_func(anycompatiblearray, anycompatiblemultirange); + +create function anycompatiblerange_anycompatiblemultirange_func(r anycompatiblerange, mr anycompatiblemultirange) + returns anycompatible as 'select lower($1) + lower($2);' language sql; + +select anycompatiblerange_anycompatiblemultirange_func(int4range(1,2), multirange(int4range(10,20))); + +-- should fail +select anycompatiblerange_anycompatiblemultirange_func(numrange(1,2), multirange(int4range(10,20))); + +drop function anycompatiblerange_anycompatiblemultirange_func(anycompatiblerange, anycompatiblemultirange); + +-- should fail +create function bogus_func(anycompatible) + returns anycompatiblerange as 'select int4range(1,10)' language sql; + +-- +-- Arrays of multiranges +-- + +select ARRAY[nummultirange(numrange(1.1, 1.2)), nummultirange(numrange(12.3, 155.5))]; + +create table i8mr_array (f1 int, f2 int8multirange[]); +insert into i8mr_array values (42, array[int8multirange(int8range(1,10)), int8multirange(int8range(2,20))]); +select * from i8mr_array; +drop table i8mr_array; + +-- +-- Multiranges of arrays +-- + +select arraymultirange(arrayrange(ARRAY[1,2], ARRAY[2,1])); +select arraymultirange(arrayrange(ARRAY[2,1], ARRAY[1,2])); -- fail + +select array[1,1] <@ arraymultirange(arrayrange(array[1,2], array[2,1])); +select array[1,3] <@ arraymultirange(arrayrange(array[1,2], array[2,1])); + +-- +-- Ranges of composites +-- + +create type two_ints as (a int, b int); +create type two_ints_range as range (subtype = two_ints); + +-- with force_parallel_mode on, this exercises tqueue.c's range remapping +select *, row_to_json(upper(t)) as u from + (values (two_ints_multirange(two_ints_range(row(1,2), row(3,4)))), + (two_ints_multirange(two_ints_range(row(5,6), row(7,8))))) v(t); + +drop type two_ints cascade; + +-- +-- Check behavior when subtype lacks a hash function +-- + +set enable_sort = off; -- try to make it pick a hash setop implementation + +select '{(2,5)}'::cashmultirange except select '{(5,6)}'::cashmultirange; + +reset enable_sort; + +-- +-- OUT/INOUT/TABLE functions +-- + +-- infer anymultirange from anymultirange +create function mr_outparam_succeed(i anymultirange, out r anymultirange, out t text) + as $$ select $1, 'foo'::text $$ language sql; + +select * from mr_outparam_succeed(int4multirange(int4range(1,2))); + +-- infer anyarray from anymultirange +create function mr_outparam_succeed2(i anymultirange, out r anyarray, out t text) + as $$ select ARRAY[upper($1)], 'foo'::text $$ language sql; + +select * from mr_outparam_succeed2(int4multirange(int4range(1,2))); + +-- infer anyrange from anymultirange +create function mr_outparam_succeed3(i anymultirange, out r anyrange, out t text) + as $$ select range_merge($1), 'foo'::text $$ language sql; +select * from mr_outparam_succeed3(int4multirange(int4range(1,2))); + +-- infer anymultirange from anyrange +create function mr_outparam_succeed4(i anyrange, out r anymultirange, out t text) + as $$ select multirange($1), 'foo'::text $$ language sql; + +select * from mr_outparam_succeed4(int4range(1,2)); + +-- infer anyelement from anymultirange +create function mr_inoutparam_succeed(out i anyelement, inout r anymultirange) + as $$ select upper($1), $1 $$ language sql; + +select * from mr_inoutparam_succeed(int4multirange(int4range(1,2))); + +-- infer anyelement+anymultirange from anyelement+anymultirange +create function mr_table_succeed(i anyelement, r anymultirange) returns table(i anyelement, r anymultirange) + as $$ select $1, $2 $$ language sql; + +select * from mr_table_succeed(123, int4multirange(int4range(1,11))); + +-- use anymultirange in plpgsql +create function mr_polymorphic(i anyrange) returns anymultirange + as $$ begin return multirange($1); end; $$ language plpgsql; +select mr_polymorphic(int4range(1, 4)); + +-- should fail +create function mr_outparam_fail(i anyelement, out r anymultirange, out t text) + as $$ select '[1,10]', 'foo' $$ language sql; + +--should fail +create function mr_inoutparam_fail(inout i anyelement, out r anymultirange) + as $$ select $1, '[1,10]' $$ language sql; + +--should fail +create function mr_table_fail(i anyelement) returns table(i anyelement, r anymultirange) + as $$ select $1, '[1,10]' $$ language sql; diff --git a/src/test/singlenode_regress/sql/mvcc.sql b/src/test/singlenode_regress/sql/mvcc.sql new file mode 100644 index 00000000000..b22a86dc5e5 --- /dev/null +++ b/src/test/singlenode_regress/sql/mvcc.sql @@ -0,0 +1,44 @@ +-- +-- Verify that index scans encountering dead rows produced by an +-- aborted subtransaction of the current transaction can utilize the +-- kill_prio_tuple optimization +-- +-- NB: The table size is currently *not* expected to stay the same, we +-- don't have logic to trigger opportunistic pruning in cases like +-- this. +BEGIN; + +SET LOCAL enable_seqscan = false; +SET LOCAL enable_indexonlyscan = false; +SET LOCAL enable_bitmapscan = false; + +-- Can't easily use a unique index, since dead tuples can be found +-- independent of the kill_prior_tuples optimization. +CREATE TABLE clean_aborted_self(key int, data text); +CREATE INDEX clean_aborted_self_key ON clean_aborted_self(key); +INSERT INTO clean_aborted_self (key, data) VALUES (-1, 'just to allocate metapage'); + +-- save index size from before the changes, for comparison +SELECT pg_relation_size('clean_aborted_self_key') AS clean_aborted_self_key_before \gset + +DO $$ +BEGIN + -- iterate often enough to see index growth even on larger-than-default page sizes + FOR i IN 1..100 LOOP + BEGIN + -- perform index scan over all the inserted keys to get them to be seen as dead + IF EXISTS(SELECT * FROM clean_aborted_self WHERE key > 0 AND key < 100) THEN + RAISE data_corrupted USING MESSAGE = 'these rows should not exist'; + END IF; + INSERT INTO clean_aborted_self SELECT g.i, 'rolling back in a sec' FROM generate_series(1, 100) g(i); + -- just some error that's not normally thrown + RAISE reading_sql_data_not_permitted USING MESSAGE = 'round and round again'; + EXCEPTION WHEN reading_sql_data_not_permitted THEN END; + END LOOP; +END;$$; + +-- show sizes only if they differ +SELECT :clean_aborted_self_key_before AS size_before, pg_relation_size('clean_aborted_self_key') size_after +WHERE :clean_aborted_self_key_before != pg_relation_size('clean_aborted_self_key'); + +ROLLBACK; diff --git a/src/test/singlenode_regress/sql/name.sql b/src/test/singlenode_regress/sql/name.sql new file mode 100644 index 00000000000..29a5d97e5b2 --- /dev/null +++ b/src/test/singlenode_regress/sql/name.sql @@ -0,0 +1,87 @@ +-- +-- NAME +-- all inputs are silently truncated at NAMEDATALEN-1 (63) characters +-- + +-- fixed-length by reference +SELECT name 'name string' = name 'name string' AS "True"; + +SELECT name 'name string' = name 'name string ' AS "False"; + +-- +-- +-- + +CREATE TABLE NAME_TBL(f1 name); + +INSERT INTO NAME_TBL(f1) VALUES ('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'); + +INSERT INTO NAME_TBL(f1) VALUES ('1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqr'); + +INSERT INTO NAME_TBL(f1) VALUES ('asdfghjkl;'); + +INSERT INTO NAME_TBL(f1) VALUES ('343f%2a'); + +INSERT INTO NAME_TBL(f1) VALUES ('d34aaasdf'); + +INSERT INTO NAME_TBL(f1) VALUES (''); + +INSERT INTO NAME_TBL(f1) VALUES ('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'); + + +SELECT * FROM NAME_TBL; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 <> '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 < '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 <= '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 > '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 >= '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 ~ '.*'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 !~ '.*'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 ~ '[0-9]'; + +SELECT c.f1 FROM NAME_TBL c WHERE c.f1 ~ '.*asdf.*'; + +DROP TABLE NAME_TBL; + +DO $$ +DECLARE r text[]; +BEGIN + r := parse_ident('Schemax.Tabley'); + RAISE NOTICE '%', format('%I.%I', r[1], r[2]); + r := parse_ident('"SchemaX"."TableY"'); + RAISE NOTICE '%', format('%I.%I', r[1], r[2]); +END; +$$; + +SELECT parse_ident('foo.boo'); +SELECT parse_ident('foo.boo[]'); -- should fail +SELECT parse_ident('foo.boo[]', strict => false); -- ok + +-- should fail +SELECT parse_ident(' '); +SELECT parse_ident(' .aaa'); +SELECT parse_ident(' aaa . '); +SELECT parse_ident('aaa.a%b'); +SELECT parse_ident(E'X\rXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); + +SELECT length(a[1]), length(a[2]) from parse_ident('"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy') as a ; + +SELECT parse_ident(' first . " second " ." third ". " ' || repeat('x',66) || '"'); +SELECT parse_ident(' first . " second " ." third ". " ' || repeat('x',66) || '"')::name[]; + +SELECT parse_ident(E'"c".X XXXX\002XXXXXX'); +SELECT parse_ident('1020'); +SELECT parse_ident('10.20'); +SELECT parse_ident('.'); +SELECT parse_ident('.1020'); +SELECT parse_ident('xxx.1020'); diff --git a/src/test/singlenode_regress/sql/namespace.sql b/src/test/singlenode_regress/sql/namespace.sql new file mode 100644 index 00000000000..4daf82cb0e3 --- /dev/null +++ b/src/test/singlenode_regress/sql/namespace.sql @@ -0,0 +1,44 @@ +-- +-- Regression tests for schemas (namespaces) +-- + +CREATE SCHEMA test_ns_schema_1 + CREATE INDEX abc_a_idx ON abc (a) + + CREATE VIEW abc_view AS + SELECT a+1 AS a, b+1 AS b FROM abc + + CREATE TABLE abc ( + a serial, + b int UNIQUE + ); + +-- verify that the objects were created +SELECT COUNT(*) FROM pg_class WHERE relnamespace = + (SELECT oid FROM pg_namespace WHERE nspname = 'test_ns_schema_1'); + +INSERT INTO test_ns_schema_1.abc DEFAULT VALUES; +INSERT INTO test_ns_schema_1.abc DEFAULT VALUES; +INSERT INTO test_ns_schema_1.abc DEFAULT VALUES; + +SELECT * FROM test_ns_schema_1.abc; +SELECT * FROM test_ns_schema_1.abc_view; + +ALTER SCHEMA test_ns_schema_1 RENAME TO test_ns_schema_renamed; +SELECT COUNT(*) FROM pg_class WHERE relnamespace = + (SELECT oid FROM pg_namespace WHERE nspname = 'test_ns_schema_1'); + +-- test IF NOT EXISTS cases +CREATE SCHEMA test_ns_schema_renamed; -- fail, already exists +CREATE SCHEMA IF NOT EXISTS test_ns_schema_renamed; -- ok with notice +CREATE SCHEMA IF NOT EXISTS test_ns_schema_renamed -- fail, disallowed + CREATE TABLE abc ( + a serial, + b int UNIQUE + ); + +DROP SCHEMA test_ns_schema_renamed CASCADE; + +-- verify that the objects were dropped +SELECT COUNT(*) FROM pg_class WHERE relnamespace = + (SELECT oid FROM pg_namespace WHERE nspname = 'test_ns_schema_renamed'); diff --git a/src/test/singlenode_regress/sql/numeric.sql b/src/test/singlenode_regress/sql/numeric.sql new file mode 100644 index 00000000000..9233c666d4b --- /dev/null +++ b/src/test/singlenode_regress/sql/numeric.sql @@ -0,0 +1,1365 @@ +-- +-- NUMERIC +-- + +CREATE TABLE num_data (id int4, val numeric(210,10)); +CREATE TABLE num_exp_add (id1 int4, id2 int4, expected numeric(210,10)); +CREATE TABLE num_exp_sub (id1 int4, id2 int4, expected numeric(210,10)); +CREATE TABLE num_exp_div (id1 int4, id2 int4, expected numeric(210,10)); +CREATE TABLE num_exp_mul (id1 int4, id2 int4, expected numeric(210,10)); +CREATE TABLE num_exp_sqrt (id int4, expected numeric(210,10)); +CREATE TABLE num_exp_ln (id int4, expected numeric(210,10)); +CREATE TABLE num_exp_log10 (id int4, expected numeric(210,10)); +CREATE TABLE num_exp_power_10_ln (id int4, expected numeric(210,10)); + +CREATE TABLE num_result (id1 int4, id2 int4, result numeric(210,10)); + + +-- ****************************** +-- * The following EXPECTED results are computed by bc(1) +-- * with a scale of 200 +-- ****************************** + +BEGIN TRANSACTION; +INSERT INTO num_exp_add VALUES (0,0,'0'); +INSERT INTO num_exp_sub VALUES (0,0,'0'); +INSERT INTO num_exp_mul VALUES (0,0,'0'); +INSERT INTO num_exp_div VALUES (0,0,'NaN'); +INSERT INTO num_exp_add VALUES (0,1,'0'); +INSERT INTO num_exp_sub VALUES (0,1,'0'); +INSERT INTO num_exp_mul VALUES (0,1,'0'); +INSERT INTO num_exp_div VALUES (0,1,'NaN'); +INSERT INTO num_exp_add VALUES (0,2,'-34338492.215397047'); +INSERT INTO num_exp_sub VALUES (0,2,'34338492.215397047'); +INSERT INTO num_exp_mul VALUES (0,2,'0'); +INSERT INTO num_exp_div VALUES (0,2,'0'); +INSERT INTO num_exp_add VALUES (0,3,'4.31'); +INSERT INTO num_exp_sub VALUES (0,3,'-4.31'); +INSERT INTO num_exp_mul VALUES (0,3,'0'); +INSERT INTO num_exp_div VALUES (0,3,'0'); +INSERT INTO num_exp_add VALUES (0,4,'7799461.4119'); +INSERT INTO num_exp_sub VALUES (0,4,'-7799461.4119'); +INSERT INTO num_exp_mul VALUES (0,4,'0'); +INSERT INTO num_exp_div VALUES (0,4,'0'); +INSERT INTO num_exp_add VALUES (0,5,'16397.038491'); +INSERT INTO num_exp_sub VALUES (0,5,'-16397.038491'); +INSERT INTO num_exp_mul VALUES (0,5,'0'); +INSERT INTO num_exp_div VALUES (0,5,'0'); +INSERT INTO num_exp_add VALUES (0,6,'93901.57763026'); +INSERT INTO num_exp_sub VALUES (0,6,'-93901.57763026'); +INSERT INTO num_exp_mul VALUES (0,6,'0'); +INSERT INTO num_exp_div VALUES (0,6,'0'); +INSERT INTO num_exp_add VALUES (0,7,'-83028485'); +INSERT INTO num_exp_sub VALUES (0,7,'83028485'); +INSERT INTO num_exp_mul VALUES (0,7,'0'); +INSERT INTO num_exp_div VALUES (0,7,'0'); +INSERT INTO num_exp_add VALUES (0,8,'74881'); +INSERT INTO num_exp_sub VALUES (0,8,'-74881'); +INSERT INTO num_exp_mul VALUES (0,8,'0'); +INSERT INTO num_exp_div VALUES (0,8,'0'); +INSERT INTO num_exp_add VALUES (0,9,'-24926804.045047420'); +INSERT INTO num_exp_sub VALUES (0,9,'24926804.045047420'); +INSERT INTO num_exp_mul VALUES (0,9,'0'); +INSERT INTO num_exp_div VALUES (0,9,'0'); +INSERT INTO num_exp_add VALUES (1,0,'0'); +INSERT INTO num_exp_sub VALUES (1,0,'0'); +INSERT INTO num_exp_mul VALUES (1,0,'0'); +INSERT INTO num_exp_div VALUES (1,0,'NaN'); +INSERT INTO num_exp_add VALUES (1,1,'0'); +INSERT INTO num_exp_sub VALUES (1,1,'0'); +INSERT INTO num_exp_mul VALUES (1,1,'0'); +INSERT INTO num_exp_div VALUES (1,1,'NaN'); +INSERT INTO num_exp_add VALUES (1,2,'-34338492.215397047'); +INSERT INTO num_exp_sub VALUES (1,2,'34338492.215397047'); +INSERT INTO num_exp_mul VALUES (1,2,'0'); +INSERT INTO num_exp_div VALUES (1,2,'0'); +INSERT INTO num_exp_add VALUES (1,3,'4.31'); +INSERT INTO num_exp_sub VALUES (1,3,'-4.31'); +INSERT INTO num_exp_mul VALUES (1,3,'0'); +INSERT INTO num_exp_div VALUES (1,3,'0'); +INSERT INTO num_exp_add VALUES (1,4,'7799461.4119'); +INSERT INTO num_exp_sub VALUES (1,4,'-7799461.4119'); +INSERT INTO num_exp_mul VALUES (1,4,'0'); +INSERT INTO num_exp_div VALUES (1,4,'0'); +INSERT INTO num_exp_add VALUES (1,5,'16397.038491'); +INSERT INTO num_exp_sub VALUES (1,5,'-16397.038491'); +INSERT INTO num_exp_mul VALUES (1,5,'0'); +INSERT INTO num_exp_div VALUES (1,5,'0'); +INSERT INTO num_exp_add VALUES (1,6,'93901.57763026'); +INSERT INTO num_exp_sub VALUES (1,6,'-93901.57763026'); +INSERT INTO num_exp_mul VALUES (1,6,'0'); +INSERT INTO num_exp_div VALUES (1,6,'0'); +INSERT INTO num_exp_add VALUES (1,7,'-83028485'); +INSERT INTO num_exp_sub VALUES (1,7,'83028485'); +INSERT INTO num_exp_mul VALUES (1,7,'0'); +INSERT INTO num_exp_div VALUES (1,7,'0'); +INSERT INTO num_exp_add VALUES (1,8,'74881'); +INSERT INTO num_exp_sub VALUES (1,8,'-74881'); +INSERT INTO num_exp_mul VALUES (1,8,'0'); +INSERT INTO num_exp_div VALUES (1,8,'0'); +INSERT INTO num_exp_add VALUES (1,9,'-24926804.045047420'); +INSERT INTO num_exp_sub VALUES (1,9,'24926804.045047420'); +INSERT INTO num_exp_mul VALUES (1,9,'0'); +INSERT INTO num_exp_div VALUES (1,9,'0'); +INSERT INTO num_exp_add VALUES (2,0,'-34338492.215397047'); +INSERT INTO num_exp_sub VALUES (2,0,'-34338492.215397047'); +INSERT INTO num_exp_mul VALUES (2,0,'0'); +INSERT INTO num_exp_div VALUES (2,0,'NaN'); +INSERT INTO num_exp_add VALUES (2,1,'-34338492.215397047'); +INSERT INTO num_exp_sub VALUES (2,1,'-34338492.215397047'); +INSERT INTO num_exp_mul VALUES (2,1,'0'); +INSERT INTO num_exp_div VALUES (2,1,'NaN'); +INSERT INTO num_exp_add VALUES (2,2,'-68676984.430794094'); +INSERT INTO num_exp_sub VALUES (2,2,'0'); +INSERT INTO num_exp_mul VALUES (2,2,'1179132047626883.596862135856320209'); +INSERT INTO num_exp_div VALUES (2,2,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (2,3,'-34338487.905397047'); +INSERT INTO num_exp_sub VALUES (2,3,'-34338496.525397047'); +INSERT INTO num_exp_mul VALUES (2,3,'-147998901.44836127257'); +INSERT INTO num_exp_div VALUES (2,3,'-7967167.56737750510440835266'); +INSERT INTO num_exp_add VALUES (2,4,'-26539030.803497047'); +INSERT INTO num_exp_sub VALUES (2,4,'-42137953.627297047'); +INSERT INTO num_exp_mul VALUES (2,4,'-267821744976817.8111137106593'); +INSERT INTO num_exp_div VALUES (2,4,'-4.40267480046830116685'); +INSERT INTO num_exp_add VALUES (2,5,'-34322095.176906047'); +INSERT INTO num_exp_sub VALUES (2,5,'-34354889.253888047'); +INSERT INTO num_exp_mul VALUES (2,5,'-563049578578.769242506736077'); +INSERT INTO num_exp_div VALUES (2,5,'-2094.18866914563535496429'); +INSERT INTO num_exp_add VALUES (2,6,'-34244590.637766787'); +INSERT INTO num_exp_sub VALUES (2,6,'-34432393.793027307'); +INSERT INTO num_exp_mul VALUES (2,6,'-3224438592470.18449811926184222'); +INSERT INTO num_exp_div VALUES (2,6,'-365.68599891479766440940'); +INSERT INTO num_exp_add VALUES (2,7,'-117366977.215397047'); +INSERT INTO num_exp_sub VALUES (2,7,'48689992.784602953'); +INSERT INTO num_exp_mul VALUES (2,7,'2851072985828710.485883795'); +INSERT INTO num_exp_div VALUES (2,7,'.41357483778485235518'); +INSERT INTO num_exp_add VALUES (2,8,'-34263611.215397047'); +INSERT INTO num_exp_sub VALUES (2,8,'-34413373.215397047'); +INSERT INTO num_exp_mul VALUES (2,8,'-2571300635581.146276407'); +INSERT INTO num_exp_div VALUES (2,8,'-458.57416721727870888476'); +INSERT INTO num_exp_add VALUES (2,9,'-59265296.260444467'); +INSERT INTO num_exp_sub VALUES (2,9,'-9411688.170349627'); +INSERT INTO num_exp_mul VALUES (2,9,'855948866655588.453741509242968740'); +INSERT INTO num_exp_div VALUES (2,9,'1.37757299946438931811'); +INSERT INTO num_exp_add VALUES (3,0,'4.31'); +INSERT INTO num_exp_sub VALUES (3,0,'4.31'); +INSERT INTO num_exp_mul VALUES (3,0,'0'); +INSERT INTO num_exp_div VALUES (3,0,'NaN'); +INSERT INTO num_exp_add VALUES (3,1,'4.31'); +INSERT INTO num_exp_sub VALUES (3,1,'4.31'); +INSERT INTO num_exp_mul VALUES (3,1,'0'); +INSERT INTO num_exp_div VALUES (3,1,'NaN'); +INSERT INTO num_exp_add VALUES (3,2,'-34338487.905397047'); +INSERT INTO num_exp_sub VALUES (3,2,'34338496.525397047'); +INSERT INTO num_exp_mul VALUES (3,2,'-147998901.44836127257'); +INSERT INTO num_exp_div VALUES (3,2,'-.00000012551512084352'); +INSERT INTO num_exp_add VALUES (3,3,'8.62'); +INSERT INTO num_exp_sub VALUES (3,3,'0'); +INSERT INTO num_exp_mul VALUES (3,3,'18.5761'); +INSERT INTO num_exp_div VALUES (3,3,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (3,4,'7799465.7219'); +INSERT INTO num_exp_sub VALUES (3,4,'-7799457.1019'); +INSERT INTO num_exp_mul VALUES (3,4,'33615678.685289'); +INSERT INTO num_exp_div VALUES (3,4,'.00000055260225961552'); +INSERT INTO num_exp_add VALUES (3,5,'16401.348491'); +INSERT INTO num_exp_sub VALUES (3,5,'-16392.728491'); +INSERT INTO num_exp_mul VALUES (3,5,'70671.23589621'); +INSERT INTO num_exp_div VALUES (3,5,'.00026285234387695504'); +INSERT INTO num_exp_add VALUES (3,6,'93905.88763026'); +INSERT INTO num_exp_sub VALUES (3,6,'-93897.26763026'); +INSERT INTO num_exp_mul VALUES (3,6,'404715.7995864206'); +INSERT INTO num_exp_div VALUES (3,6,'.00004589912234457595'); +INSERT INTO num_exp_add VALUES (3,7,'-83028480.69'); +INSERT INTO num_exp_sub VALUES (3,7,'83028489.31'); +INSERT INTO num_exp_mul VALUES (3,7,'-357852770.35'); +INSERT INTO num_exp_div VALUES (3,7,'-.00000005190989574240'); +INSERT INTO num_exp_add VALUES (3,8,'74885.31'); +INSERT INTO num_exp_sub VALUES (3,8,'-74876.69'); +INSERT INTO num_exp_mul VALUES (3,8,'322737.11'); +INSERT INTO num_exp_div VALUES (3,8,'.00005755799201399553'); +INSERT INTO num_exp_add VALUES (3,9,'-24926799.735047420'); +INSERT INTO num_exp_sub VALUES (3,9,'24926808.355047420'); +INSERT INTO num_exp_mul VALUES (3,9,'-107434525.43415438020'); +INSERT INTO num_exp_div VALUES (3,9,'-.00000017290624149854'); +INSERT INTO num_exp_add VALUES (4,0,'7799461.4119'); +INSERT INTO num_exp_sub VALUES (4,0,'7799461.4119'); +INSERT INTO num_exp_mul VALUES (4,0,'0'); +INSERT INTO num_exp_div VALUES (4,0,'NaN'); +INSERT INTO num_exp_add VALUES (4,1,'7799461.4119'); +INSERT INTO num_exp_sub VALUES (4,1,'7799461.4119'); +INSERT INTO num_exp_mul VALUES (4,1,'0'); +INSERT INTO num_exp_div VALUES (4,1,'NaN'); +INSERT INTO num_exp_add VALUES (4,2,'-26539030.803497047'); +INSERT INTO num_exp_sub VALUES (4,2,'42137953.627297047'); +INSERT INTO num_exp_mul VALUES (4,2,'-267821744976817.8111137106593'); +INSERT INTO num_exp_div VALUES (4,2,'-.22713465002993920385'); +INSERT INTO num_exp_add VALUES (4,3,'7799465.7219'); +INSERT INTO num_exp_sub VALUES (4,3,'7799457.1019'); +INSERT INTO num_exp_mul VALUES (4,3,'33615678.685289'); +INSERT INTO num_exp_div VALUES (4,3,'1809619.81714617169373549883'); +INSERT INTO num_exp_add VALUES (4,4,'15598922.8238'); +INSERT INTO num_exp_sub VALUES (4,4,'0'); +INSERT INTO num_exp_mul VALUES (4,4,'60831598315717.14146161'); +INSERT INTO num_exp_div VALUES (4,4,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (4,5,'7815858.450391'); +INSERT INTO num_exp_sub VALUES (4,5,'7783064.373409'); +INSERT INTO num_exp_mul VALUES (4,5,'127888068979.9935054429'); +INSERT INTO num_exp_div VALUES (4,5,'475.66281046305802686061'); +INSERT INTO num_exp_add VALUES (4,6,'7893362.98953026'); +INSERT INTO num_exp_sub VALUES (4,6,'7705559.83426974'); +INSERT INTO num_exp_mul VALUES (4,6,'732381731243.745115764094'); +INSERT INTO num_exp_div VALUES (4,6,'83.05996138436129499606'); +INSERT INTO num_exp_add VALUES (4,7,'-75229023.5881'); +INSERT INTO num_exp_sub VALUES (4,7,'90827946.4119'); +INSERT INTO num_exp_mul VALUES (4,7,'-647577464846017.9715'); +INSERT INTO num_exp_div VALUES (4,7,'-.09393717604145131637'); +INSERT INTO num_exp_add VALUES (4,8,'7874342.4119'); +INSERT INTO num_exp_sub VALUES (4,8,'7724580.4119'); +INSERT INTO num_exp_mul VALUES (4,8,'584031469984.4839'); +INSERT INTO num_exp_div VALUES (4,8,'104.15808298366741897143'); +INSERT INTO num_exp_add VALUES (4,9,'-17127342.633147420'); +INSERT INTO num_exp_sub VALUES (4,9,'32726265.456947420'); +INSERT INTO num_exp_mul VALUES (4,9,'-194415646271340.1815956522980'); +INSERT INTO num_exp_div VALUES (4,9,'-.31289456112403769409'); +INSERT INTO num_exp_add VALUES (5,0,'16397.038491'); +INSERT INTO num_exp_sub VALUES (5,0,'16397.038491'); +INSERT INTO num_exp_mul VALUES (5,0,'0'); +INSERT INTO num_exp_div VALUES (5,0,'NaN'); +INSERT INTO num_exp_add VALUES (5,1,'16397.038491'); +INSERT INTO num_exp_sub VALUES (5,1,'16397.038491'); +INSERT INTO num_exp_mul VALUES (5,1,'0'); +INSERT INTO num_exp_div VALUES (5,1,'NaN'); +INSERT INTO num_exp_add VALUES (5,2,'-34322095.176906047'); +INSERT INTO num_exp_sub VALUES (5,2,'34354889.253888047'); +INSERT INTO num_exp_mul VALUES (5,2,'-563049578578.769242506736077'); +INSERT INTO num_exp_div VALUES (5,2,'-.00047751189505192446'); +INSERT INTO num_exp_add VALUES (5,3,'16401.348491'); +INSERT INTO num_exp_sub VALUES (5,3,'16392.728491'); +INSERT INTO num_exp_mul VALUES (5,3,'70671.23589621'); +INSERT INTO num_exp_div VALUES (5,3,'3804.41728329466357308584'); +INSERT INTO num_exp_add VALUES (5,4,'7815858.450391'); +INSERT INTO num_exp_sub VALUES (5,4,'-7783064.373409'); +INSERT INTO num_exp_mul VALUES (5,4,'127888068979.9935054429'); +INSERT INTO num_exp_div VALUES (5,4,'.00210232958726897192'); +INSERT INTO num_exp_add VALUES (5,5,'32794.076982'); +INSERT INTO num_exp_sub VALUES (5,5,'0'); +INSERT INTO num_exp_mul VALUES (5,5,'268862871.275335557081'); +INSERT INTO num_exp_div VALUES (5,5,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (5,6,'110298.61612126'); +INSERT INTO num_exp_sub VALUES (5,6,'-77504.53913926'); +INSERT INTO num_exp_mul VALUES (5,6,'1539707782.76899778633766'); +INSERT INTO num_exp_div VALUES (5,6,'.17461941433576102689'); +INSERT INTO num_exp_add VALUES (5,7,'-83012087.961509'); +INSERT INTO num_exp_sub VALUES (5,7,'83044882.038491'); +INSERT INTO num_exp_mul VALUES (5,7,'-1361421264394.416135'); +INSERT INTO num_exp_div VALUES (5,7,'-.00019748690453643710'); +INSERT INTO num_exp_add VALUES (5,8,'91278.038491'); +INSERT INTO num_exp_sub VALUES (5,8,'-58483.961509'); +INSERT INTO num_exp_mul VALUES (5,8,'1227826639.244571'); +INSERT INTO num_exp_div VALUES (5,8,'.21897461960978085228'); +INSERT INTO num_exp_add VALUES (5,9,'-24910407.006556420'); +INSERT INTO num_exp_sub VALUES (5,9,'24943201.083538420'); +INSERT INTO num_exp_mul VALUES (5,9,'-408725765384.257043660243220'); +INSERT INTO num_exp_div VALUES (5,9,'-.00065780749354660427'); +INSERT INTO num_exp_add VALUES (6,0,'93901.57763026'); +INSERT INTO num_exp_sub VALUES (6,0,'93901.57763026'); +INSERT INTO num_exp_mul VALUES (6,0,'0'); +INSERT INTO num_exp_div VALUES (6,0,'NaN'); +INSERT INTO num_exp_add VALUES (6,1,'93901.57763026'); +INSERT INTO num_exp_sub VALUES (6,1,'93901.57763026'); +INSERT INTO num_exp_mul VALUES (6,1,'0'); +INSERT INTO num_exp_div VALUES (6,1,'NaN'); +INSERT INTO num_exp_add VALUES (6,2,'-34244590.637766787'); +INSERT INTO num_exp_sub VALUES (6,2,'34432393.793027307'); +INSERT INTO num_exp_mul VALUES (6,2,'-3224438592470.18449811926184222'); +INSERT INTO num_exp_div VALUES (6,2,'-.00273458651128995823'); +INSERT INTO num_exp_add VALUES (6,3,'93905.88763026'); +INSERT INTO num_exp_sub VALUES (6,3,'93897.26763026'); +INSERT INTO num_exp_mul VALUES (6,3,'404715.7995864206'); +INSERT INTO num_exp_div VALUES (6,3,'21786.90896293735498839907'); +INSERT INTO num_exp_add VALUES (6,4,'7893362.98953026'); +INSERT INTO num_exp_sub VALUES (6,4,'-7705559.83426974'); +INSERT INTO num_exp_mul VALUES (6,4,'732381731243.745115764094'); +INSERT INTO num_exp_div VALUES (6,4,'.01203949512295682469'); +INSERT INTO num_exp_add VALUES (6,5,'110298.61612126'); +INSERT INTO num_exp_sub VALUES (6,5,'77504.53913926'); +INSERT INTO num_exp_mul VALUES (6,5,'1539707782.76899778633766'); +INSERT INTO num_exp_div VALUES (6,5,'5.72674008674192359679'); +INSERT INTO num_exp_add VALUES (6,6,'187803.15526052'); +INSERT INTO num_exp_sub VALUES (6,6,'0'); +INSERT INTO num_exp_mul VALUES (6,6,'8817506281.4517452372676676'); +INSERT INTO num_exp_div VALUES (6,6,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (6,7,'-82934583.42236974'); +INSERT INTO num_exp_sub VALUES (6,7,'83122386.57763026'); +INSERT INTO num_exp_mul VALUES (6,7,'-7796505729750.37795610'); +INSERT INTO num_exp_div VALUES (6,7,'-.00113095617281538980'); +INSERT INTO num_exp_add VALUES (6,8,'168782.57763026'); +INSERT INTO num_exp_sub VALUES (6,8,'19020.57763026'); +INSERT INTO num_exp_mul VALUES (6,8,'7031444034.53149906'); +INSERT INTO num_exp_div VALUES (6,8,'1.25401073209839612184'); +INSERT INTO num_exp_add VALUES (6,9,'-24832902.467417160'); +INSERT INTO num_exp_sub VALUES (6,9,'25020705.622677680'); +INSERT INTO num_exp_mul VALUES (6,9,'-2340666225110.29929521292692920'); +INSERT INTO num_exp_div VALUES (6,9,'-.00376709254265256789'); +INSERT INTO num_exp_add VALUES (7,0,'-83028485'); +INSERT INTO num_exp_sub VALUES (7,0,'-83028485'); +INSERT INTO num_exp_mul VALUES (7,0,'0'); +INSERT INTO num_exp_div VALUES (7,0,'NaN'); +INSERT INTO num_exp_add VALUES (7,1,'-83028485'); +INSERT INTO num_exp_sub VALUES (7,1,'-83028485'); +INSERT INTO num_exp_mul VALUES (7,1,'0'); +INSERT INTO num_exp_div VALUES (7,1,'NaN'); +INSERT INTO num_exp_add VALUES (7,2,'-117366977.215397047'); +INSERT INTO num_exp_sub VALUES (7,2,'-48689992.784602953'); +INSERT INTO num_exp_mul VALUES (7,2,'2851072985828710.485883795'); +INSERT INTO num_exp_div VALUES (7,2,'2.41794207151503385700'); +INSERT INTO num_exp_add VALUES (7,3,'-83028480.69'); +INSERT INTO num_exp_sub VALUES (7,3,'-83028489.31'); +INSERT INTO num_exp_mul VALUES (7,3,'-357852770.35'); +INSERT INTO num_exp_div VALUES (7,3,'-19264149.65197215777262180974'); +INSERT INTO num_exp_add VALUES (7,4,'-75229023.5881'); +INSERT INTO num_exp_sub VALUES (7,4,'-90827946.4119'); +INSERT INTO num_exp_mul VALUES (7,4,'-647577464846017.9715'); +INSERT INTO num_exp_div VALUES (7,4,'-10.64541262725136247686'); +INSERT INTO num_exp_add VALUES (7,5,'-83012087.961509'); +INSERT INTO num_exp_sub VALUES (7,5,'-83044882.038491'); +INSERT INTO num_exp_mul VALUES (7,5,'-1361421264394.416135'); +INSERT INTO num_exp_div VALUES (7,5,'-5063.62688881730941836574'); +INSERT INTO num_exp_add VALUES (7,6,'-82934583.42236974'); +INSERT INTO num_exp_sub VALUES (7,6,'-83122386.57763026'); +INSERT INTO num_exp_mul VALUES (7,6,'-7796505729750.37795610'); +INSERT INTO num_exp_div VALUES (7,6,'-884.20756174009028770294'); +INSERT INTO num_exp_add VALUES (7,7,'-166056970'); +INSERT INTO num_exp_sub VALUES (7,7,'0'); +INSERT INTO num_exp_mul VALUES (7,7,'6893729321395225'); +INSERT INTO num_exp_div VALUES (7,7,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (7,8,'-82953604'); +INSERT INTO num_exp_sub VALUES (7,8,'-83103366'); +INSERT INTO num_exp_mul VALUES (7,8,'-6217255985285'); +INSERT INTO num_exp_div VALUES (7,8,'-1108.80577182462841041118'); +INSERT INTO num_exp_add VALUES (7,9,'-107955289.045047420'); +INSERT INTO num_exp_sub VALUES (7,9,'-58101680.954952580'); +INSERT INTO num_exp_mul VALUES (7,9,'2069634775752159.035758700'); +INSERT INTO num_exp_div VALUES (7,9,'3.33089171198810413382'); +INSERT INTO num_exp_add VALUES (8,0,'74881'); +INSERT INTO num_exp_sub VALUES (8,0,'74881'); +INSERT INTO num_exp_mul VALUES (8,0,'0'); +INSERT INTO num_exp_div VALUES (8,0,'NaN'); +INSERT INTO num_exp_add VALUES (8,1,'74881'); +INSERT INTO num_exp_sub VALUES (8,1,'74881'); +INSERT INTO num_exp_mul VALUES (8,1,'0'); +INSERT INTO num_exp_div VALUES (8,1,'NaN'); +INSERT INTO num_exp_add VALUES (8,2,'-34263611.215397047'); +INSERT INTO num_exp_sub VALUES (8,2,'34413373.215397047'); +INSERT INTO num_exp_mul VALUES (8,2,'-2571300635581.146276407'); +INSERT INTO num_exp_div VALUES (8,2,'-.00218067233500788615'); +INSERT INTO num_exp_add VALUES (8,3,'74885.31'); +INSERT INTO num_exp_sub VALUES (8,3,'74876.69'); +INSERT INTO num_exp_mul VALUES (8,3,'322737.11'); +INSERT INTO num_exp_div VALUES (8,3,'17373.78190255220417633410'); +INSERT INTO num_exp_add VALUES (8,4,'7874342.4119'); +INSERT INTO num_exp_sub VALUES (8,4,'-7724580.4119'); +INSERT INTO num_exp_mul VALUES (8,4,'584031469984.4839'); +INSERT INTO num_exp_div VALUES (8,4,'.00960079113741758956'); +INSERT INTO num_exp_add VALUES (8,5,'91278.038491'); +INSERT INTO num_exp_sub VALUES (8,5,'58483.961509'); +INSERT INTO num_exp_mul VALUES (8,5,'1227826639.244571'); +INSERT INTO num_exp_div VALUES (8,5,'4.56673929509287019456'); +INSERT INTO num_exp_add VALUES (8,6,'168782.57763026'); +INSERT INTO num_exp_sub VALUES (8,6,'-19020.57763026'); +INSERT INTO num_exp_mul VALUES (8,6,'7031444034.53149906'); +INSERT INTO num_exp_div VALUES (8,6,'.79744134113322314424'); +INSERT INTO num_exp_add VALUES (8,7,'-82953604'); +INSERT INTO num_exp_sub VALUES (8,7,'83103366'); +INSERT INTO num_exp_mul VALUES (8,7,'-6217255985285'); +INSERT INTO num_exp_div VALUES (8,7,'-.00090187120721280172'); +INSERT INTO num_exp_add VALUES (8,8,'149762'); +INSERT INTO num_exp_sub VALUES (8,8,'0'); +INSERT INTO num_exp_mul VALUES (8,8,'5607164161'); +INSERT INTO num_exp_div VALUES (8,8,'1.00000000000000000000'); +INSERT INTO num_exp_add VALUES (8,9,'-24851923.045047420'); +INSERT INTO num_exp_sub VALUES (8,9,'25001685.045047420'); +INSERT INTO num_exp_mul VALUES (8,9,'-1866544013697.195857020'); +INSERT INTO num_exp_div VALUES (8,9,'-.00300403532938582735'); +INSERT INTO num_exp_add VALUES (9,0,'-24926804.045047420'); +INSERT INTO num_exp_sub VALUES (9,0,'-24926804.045047420'); +INSERT INTO num_exp_mul VALUES (9,0,'0'); +INSERT INTO num_exp_div VALUES (9,0,'NaN'); +INSERT INTO num_exp_add VALUES (9,1,'-24926804.045047420'); +INSERT INTO num_exp_sub VALUES (9,1,'-24926804.045047420'); +INSERT INTO num_exp_mul VALUES (9,1,'0'); +INSERT INTO num_exp_div VALUES (9,1,'NaN'); +INSERT INTO num_exp_add VALUES (9,2,'-59265296.260444467'); +INSERT INTO num_exp_sub VALUES (9,2,'9411688.170349627'); +INSERT INTO num_exp_mul VALUES (9,2,'855948866655588.453741509242968740'); +INSERT INTO num_exp_div VALUES (9,2,'.72591434384152961526'); +INSERT INTO num_exp_add VALUES (9,3,'-24926799.735047420'); +INSERT INTO num_exp_sub VALUES (9,3,'-24926808.355047420'); +INSERT INTO num_exp_mul VALUES (9,3,'-107434525.43415438020'); +INSERT INTO num_exp_div VALUES (9,3,'-5783481.21694835730858468677'); +INSERT INTO num_exp_add VALUES (9,4,'-17127342.633147420'); +INSERT INTO num_exp_sub VALUES (9,4,'-32726265.456947420'); +INSERT INTO num_exp_mul VALUES (9,4,'-194415646271340.1815956522980'); +INSERT INTO num_exp_div VALUES (9,4,'-3.19596478892958416484'); +INSERT INTO num_exp_add VALUES (9,5,'-24910407.006556420'); +INSERT INTO num_exp_sub VALUES (9,5,'-24943201.083538420'); +INSERT INTO num_exp_mul VALUES (9,5,'-408725765384.257043660243220'); +INSERT INTO num_exp_div VALUES (9,5,'-1520.20159364322004505807'); +INSERT INTO num_exp_add VALUES (9,6,'-24832902.467417160'); +INSERT INTO num_exp_sub VALUES (9,6,'-25020705.622677680'); +INSERT INTO num_exp_mul VALUES (9,6,'-2340666225110.29929521292692920'); +INSERT INTO num_exp_div VALUES (9,6,'-265.45671195426965751280'); +INSERT INTO num_exp_add VALUES (9,7,'-107955289.045047420'); +INSERT INTO num_exp_sub VALUES (9,7,'58101680.954952580'); +INSERT INTO num_exp_mul VALUES (9,7,'2069634775752159.035758700'); +INSERT INTO num_exp_div VALUES (9,7,'.30021990699995814689'); +INSERT INTO num_exp_add VALUES (9,8,'-24851923.045047420'); +INSERT INTO num_exp_sub VALUES (9,8,'-25001685.045047420'); +INSERT INTO num_exp_mul VALUES (9,8,'-1866544013697.195857020'); +INSERT INTO num_exp_div VALUES (9,8,'-332.88556569820675471748'); +INSERT INTO num_exp_add VALUES (9,9,'-49853608.090094840'); +INSERT INTO num_exp_sub VALUES (9,9,'0'); +INSERT INTO num_exp_mul VALUES (9,9,'621345559900192.420120630048656400'); +INSERT INTO num_exp_div VALUES (9,9,'1.00000000000000000000'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_sqrt VALUES (0,'0'); +INSERT INTO num_exp_sqrt VALUES (1,'0'); +INSERT INTO num_exp_sqrt VALUES (2,'5859.90547836712524903505'); +INSERT INTO num_exp_sqrt VALUES (3,'2.07605394920266944396'); +INSERT INTO num_exp_sqrt VALUES (4,'2792.75158435189147418923'); +INSERT INTO num_exp_sqrt VALUES (5,'128.05092147657509145473'); +INSERT INTO num_exp_sqrt VALUES (6,'306.43364311096782703406'); +INSERT INTO num_exp_sqrt VALUES (7,'9111.99676251039939975230'); +INSERT INTO num_exp_sqrt VALUES (8,'273.64392922189960397542'); +INSERT INTO num_exp_sqrt VALUES (9,'4992.67503899937593364766'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_ln VALUES (0,'NaN'); +INSERT INTO num_exp_ln VALUES (1,'NaN'); +INSERT INTO num_exp_ln VALUES (2,'17.35177750493897715514'); +INSERT INTO num_exp_ln VALUES (3,'1.46093790411565641971'); +INSERT INTO num_exp_ln VALUES (4,'15.86956523951936572464'); +INSERT INTO num_exp_ln VALUES (5,'9.70485601768871834038'); +INSERT INTO num_exp_ln VALUES (6,'11.45000246622944403127'); +INSERT INTO num_exp_ln VALUES (7,'18.23469429965478772991'); +INSERT INTO num_exp_ln VALUES (8,'11.22365546576315513668'); +INSERT INTO num_exp_ln VALUES (9,'17.03145425013166006962'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_log10 VALUES (0,'NaN'); +INSERT INTO num_exp_log10 VALUES (1,'NaN'); +INSERT INTO num_exp_log10 VALUES (2,'7.53578122160797276459'); +INSERT INTO num_exp_log10 VALUES (3,'.63447727016073160075'); +INSERT INTO num_exp_log10 VALUES (4,'6.89206461372691743345'); +INSERT INTO num_exp_log10 VALUES (5,'4.21476541614777768626'); +INSERT INTO num_exp_log10 VALUES (6,'4.97267288886207207671'); +INSERT INTO num_exp_log10 VALUES (7,'7.91922711353275546914'); +INSERT INTO num_exp_log10 VALUES (8,'4.87437163556421004138'); +INSERT INTO num_exp_log10 VALUES (9,'7.39666659961986567059'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_power_10_ln VALUES (0,'NaN'); +INSERT INTO num_exp_power_10_ln VALUES (1,'NaN'); +INSERT INTO num_exp_power_10_ln VALUES (2,'224790267919917955.13261618583642653184'); +INSERT INTO num_exp_power_10_ln VALUES (3,'28.90266599445155957393'); +INSERT INTO num_exp_power_10_ln VALUES (4,'7405685069594999.07733999469386277636'); +INSERT INTO num_exp_power_10_ln VALUES (5,'5068226527.32127265408584640098'); +INSERT INTO num_exp_power_10_ln VALUES (6,'281839893606.99372343357047819067'); +INSERT INTO num_exp_power_10_ln VALUES (7,'1716699575118597095.42330819910640247627'); +INSERT INTO num_exp_power_10_ln VALUES (8,'167361463828.07491320069016125952'); +INSERT INTO num_exp_power_10_ln VALUES (9,'107511333880052007.04141124673540337457'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_data VALUES (0, '0'); +INSERT INTO num_data VALUES (1, '0'); +INSERT INTO num_data VALUES (2, '-34338492.215397047'); +INSERT INTO num_data VALUES (3, '4.31'); +INSERT INTO num_data VALUES (4, '7799461.4119'); +INSERT INTO num_data VALUES (5, '16397.038491'); +INSERT INTO num_data VALUES (6, '93901.57763026'); +INSERT INTO num_data VALUES (7, '-83028485'); +INSERT INTO num_data VALUES (8, '74881'); +INSERT INTO num_data VALUES (9, '-24926804.045047420'); +COMMIT TRANSACTION; + +-- ****************************** +-- * Create indices for faster checks +-- ****************************** + +CREATE UNIQUE INDEX num_exp_add_idx ON num_exp_add (id1, id2); +CREATE UNIQUE INDEX num_exp_sub_idx ON num_exp_sub (id1, id2); +CREATE UNIQUE INDEX num_exp_div_idx ON num_exp_div (id1, id2); +CREATE UNIQUE INDEX num_exp_mul_idx ON num_exp_mul (id1, id2); +CREATE UNIQUE INDEX num_exp_sqrt_idx ON num_exp_sqrt (id); +CREATE UNIQUE INDEX num_exp_ln_idx ON num_exp_ln (id); +CREATE UNIQUE INDEX num_exp_log10_idx ON num_exp_log10 (id); +CREATE UNIQUE INDEX num_exp_power_10_ln_idx ON num_exp_power_10_ln (id); + +VACUUM ANALYZE num_exp_add; +VACUUM ANALYZE num_exp_sub; +VACUUM ANALYZE num_exp_div; +VACUUM ANALYZE num_exp_mul; +VACUUM ANALYZE num_exp_sqrt; +VACUUM ANALYZE num_exp_ln; +VACUUM ANALYZE num_exp_log10; +VACUUM ANALYZE num_exp_power_10_ln; + +-- ****************************** +-- * Now check the behaviour of the NUMERIC type +-- ****************************** + +-- ****************************** +-- * Addition check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_add t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 10) as expected + FROM num_result t1, num_exp_add t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 10); + +-- ****************************** +-- * Subtraction check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_sub t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 40) + FROM num_result t1, num_exp_sub t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 40); + +-- ****************************** +-- * Multiply check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_mul t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 30) as expected + FROM num_result t1, num_exp_mul t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 30); + +-- ****************************** +-- * Division check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val / t2.val + FROM num_data t1, num_data t2 + WHERE t2.val != '0.0'; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_div t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val / t2.val, 80) + FROM num_data t1, num_data t2 + WHERE t2.val != '0.0'; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 80) as expected + FROM num_result t1, num_exp_div t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 80); + +-- ****************************** +-- * Square root check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, SQRT(ABS(val)) + FROM num_data; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_sqrt t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + +-- ****************************** +-- * Natural logarithm check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, LN(ABS(val)) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_ln t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + +-- ****************************** +-- * Logarithm base 10 check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, LOG(numeric '10', ABS(val)) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_log10 t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + +-- ****************************** +-- * POWER(10, LN(value)) check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200)))) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_power_10_ln t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + +-- ****************************** +-- * Check behavior with Inf and NaN inputs. It's easiest to handle these +-- * separately from the num_data framework used above, because some input +-- * combinations will throw errors. +-- ****************************** + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan')) +SELECT x1, x2, + x1 + x2 AS sum, + x1 - x2 AS diff, + x1 * x2 AS prod +FROM v AS v1(x1), v AS v2(x2); + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan')) +SELECT x1, x2, + x1 / x2 AS quot, + x1 % x2 AS mod, + div(x1, x2) AS div +FROM v AS v1(x1), v AS v2(x2) WHERE x2 != 0; + +SELECT 'inf'::numeric / '0'; +SELECT '-inf'::numeric / '0'; +SELECT 'nan'::numeric / '0'; +SELECT '0'::numeric / '0'; +SELECT 'inf'::numeric % '0'; +SELECT '-inf'::numeric % '0'; +SELECT 'nan'::numeric % '0'; +SELECT '0'::numeric % '0'; +SELECT div('inf'::numeric, '0'); +SELECT div('-inf'::numeric, '0'); +SELECT div('nan'::numeric, '0'); +SELECT div('0'::numeric, '0'); + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan')) +SELECT x, -x as minusx, abs(x), floor(x), ceil(x), sign(x), numeric_inc(x) as inc +FROM v; + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan')) +SELECT x, round(x), round(x,1) as round1, trunc(x), trunc(x,1) as trunc1 +FROM v; + +-- the large values fall into the numeric abbreviation code's maximal classes +WITH v(x) AS + (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('1e340'),('-1e340'), + ('inf'),('-inf'),('nan'), + ('inf'),('-inf'),('nan')) +SELECT substring(x::text, 1, 32) +FROM v ORDER BY x; + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('4.2'),('inf'),('nan')) +SELECT x, sqrt(x) +FROM v; + +SELECT sqrt('-1'::numeric); +SELECT sqrt('-inf'::numeric); + +WITH v(x) AS + (VALUES('1'::numeric),('4.2'),('inf'),('nan')) +SELECT x, + log(x), + log10(x), + ln(x) +FROM v; + +SELECT ln('0'::numeric); +SELECT ln('-1'::numeric); +SELECT ln('-inf'::numeric); + +WITH v(x) AS + (VALUES('2'::numeric),('4.2'),('inf'),('nan')) +SELECT x1, x2, + log(x1, x2) +FROM v AS v1(x1), v AS v2(x2); + +SELECT log('0'::numeric, '10'); +SELECT log('10'::numeric, '0'); +SELECT log('-inf'::numeric, '10'); +SELECT log('10'::numeric, '-inf'); +SELECT log('inf'::numeric, '0'); +SELECT log('inf'::numeric, '-inf'); +SELECT log('-inf'::numeric, 'inf'); + +WITH v(x) AS + (VALUES('0'::numeric),('1'),('2'),('4.2'),('inf'),('nan')) +SELECT x1, x2, + power(x1, x2) +FROM v AS v1(x1), v AS v2(x2) WHERE x1 != 0 OR x2 >= 0; + +SELECT power('0'::numeric, '-1'); +SELECT power('0'::numeric, '-inf'); +SELECT power('-1'::numeric, 'inf'); +SELECT power('-2'::numeric, '3'); +SELECT power('-2'::numeric, '3.3'); +SELECT power('-2'::numeric, '-1'); +SELECT power('-2'::numeric, '-1.5'); +SELECT power('-2'::numeric, 'inf'); +SELECT power('-2'::numeric, '-inf'); +SELECT power('inf'::numeric, '-2'); +SELECT power('inf'::numeric, '-inf'); +SELECT power('-inf'::numeric, '2'); +SELECT power('-inf'::numeric, '3'); +SELECT power('-inf'::numeric, '4.5'); +SELECT power('-inf'::numeric, '-2'); +SELECT power('-inf'::numeric, '-3'); +SELECT power('-inf'::numeric, '0'); +SELECT power('-inf'::numeric, 'inf'); +SELECT power('-inf'::numeric, '-inf'); + +-- ****************************** +-- * miscellaneous checks for things that have been broken in the past... +-- ****************************** +-- numeric AVG used to fail on some platforms +SELECT AVG(val) FROM num_data; +SELECT MAX(val) FROM num_data; +SELECT MIN(val) FROM num_data; +SELECT STDDEV(val) FROM num_data; +SELECT VARIANCE(val) FROM num_data; + +-- Check for appropriate rounding and overflow +CREATE TABLE fract_only (id int, val numeric(4,4)); +INSERT INTO fract_only VALUES (1, '0.0'); +INSERT INTO fract_only VALUES (2, '0.1'); +INSERT INTO fract_only VALUES (3, '1.0'); -- should fail +INSERT INTO fract_only VALUES (4, '-0.9999'); +INSERT INTO fract_only VALUES (5, '0.99994'); +INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail +INSERT INTO fract_only VALUES (7, '0.00001'); +INSERT INTO fract_only VALUES (8, '0.00017'); +INSERT INTO fract_only VALUES (9, 'NaN'); +INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail +INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail +SELECT * FROM fract_only; +DROP TABLE fract_only; + +-- Check conversion to integers +SELECT (-9223372036854775808.5)::int8; -- should fail +SELECT (-9223372036854775808.4)::int8; -- ok +SELECT 9223372036854775807.4::int8; -- ok +SELECT 9223372036854775807.5::int8; -- should fail +SELECT (-2147483648.5)::int4; -- should fail +SELECT (-2147483648.4)::int4; -- ok +SELECT 2147483647.4::int4; -- ok +SELECT 2147483647.5::int4; -- should fail +SELECT (-32768.5)::int2; -- should fail +SELECT (-32768.4)::int2; -- ok +SELECT 32767.4::int2; -- ok +SELECT 32767.5::int2; -- should fail + +-- Check inf/nan conversion behavior +SELECT 'NaN'::float8::numeric; +SELECT 'Infinity'::float8::numeric; +SELECT '-Infinity'::float8::numeric; +SELECT 'NaN'::numeric::float8; +SELECT 'Infinity'::numeric::float8; +SELECT '-Infinity'::numeric::float8; +SELECT 'NaN'::float4::numeric; +SELECT 'Infinity'::float4::numeric; +SELECT '-Infinity'::float4::numeric; +SELECT 'NaN'::numeric::float4; +SELECT 'Infinity'::numeric::float4; +SELECT '-Infinity'::numeric::float4; +SELECT '42'::int2::numeric; +SELECT 'NaN'::numeric::int2; +SELECT 'Infinity'::numeric::int2; +SELECT '-Infinity'::numeric::int2; +SELECT 'NaN'::numeric::int4; +SELECT 'Infinity'::numeric::int4; +SELECT '-Infinity'::numeric::int4; +SELECT 'NaN'::numeric::int8; +SELECT 'Infinity'::numeric::int8; +SELECT '-Infinity'::numeric::int8; + +-- Simple check that ceil(), floor(), and round() work correctly +CREATE TABLE ceil_floor_round (a numeric); +INSERT INTO ceil_floor_round VALUES ('-5.5'); +INSERT INTO ceil_floor_round VALUES ('-5.499999'); +INSERT INTO ceil_floor_round VALUES ('9.5'); +INSERT INTO ceil_floor_round VALUES ('9.4999999'); +INSERT INTO ceil_floor_round VALUES ('0.0'); +INSERT INTO ceil_floor_round VALUES ('0.0000001'); +INSERT INTO ceil_floor_round VALUES ('-0.000001'); +SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round; +DROP TABLE ceil_floor_round; + +-- Check rounding, it should round ties away from zero. +SELECT i as pow, + round((-2.5 * 10 ^ i)::numeric, -i), + round((-1.5 * 10 ^ i)::numeric, -i), + round((-0.5 * 10 ^ i)::numeric, -i), + round((0.5 * 10 ^ i)::numeric, -i), + round((1.5 * 10 ^ i)::numeric, -i), + round((2.5 * 10 ^ i)::numeric, -i) +FROM generate_series(-5,5) AS t(i); + +-- Testing for width_bucket(). For convenience, we test both the +-- numeric and float8 versions of the function in this file. + +-- errors +SELECT width_bucket(5.0, 3.0, 4.0, 0); +SELECT width_bucket(5.0, 3.0, 4.0, -5); +SELECT width_bucket(3.5, 3.0, 3.0, 888); +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, 0); +SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, -5); +SELECT width_bucket(3.5::float8, 3.0::float8, 3.0::float8, 888); +SELECT width_bucket('NaN', 3.0, 4.0, 888); +SELECT width_bucket(0::float8, 'NaN', 4.0::float8, 888); +SELECT width_bucket(2.0, 3.0, '-inf', 888); +SELECT width_bucket(0::float8, '-inf', 4.0::float8, 888); + +-- normal operation +CREATE TABLE width_bucket_test (operand_num numeric, operand_f8 float8); + +COPY width_bucket_test (operand_num) FROM stdin; +-5.2 +-0.0000000001 +0.000000000001 +1 +1.99999999999999 +2 +2.00000000000001 +3 +4 +4.5 +5 +5.5 +6 +7 +8 +9 +9.99999999999999 +10 +10.0000000000001 +\. + +UPDATE width_bucket_test SET operand_f8 = operand_num::float8; + +SELECT + operand_num, + width_bucket(operand_num, 0, 10, 5) AS wb_1, + width_bucket(operand_f8, 0, 10, 5) AS wb_1f, + width_bucket(operand_num, 10, 0, 5) AS wb_2, + width_bucket(operand_f8, 10, 0, 5) AS wb_2f, + width_bucket(operand_num, 2, 8, 4) AS wb_3, + width_bucket(operand_f8, 2, 8, 4) AS wb_3f, + width_bucket(operand_num, 5.0, 5.5, 20) AS wb_4, + width_bucket(operand_f8, 5.0, 5.5, 20) AS wb_4f, + width_bucket(operand_num, -25, 25, 10) AS wb_5, + width_bucket(operand_f8, -25, 25, 10) AS wb_5f + FROM width_bucket_test; + +-- Check positive and negative infinity: we require +-- finite bucket bounds, but allow an infinite operand +SELECT width_bucket(0.0::numeric, 'Infinity'::numeric, 5, 10); -- error +SELECT width_bucket(0.0::numeric, 5, '-Infinity'::numeric, 20); -- error +SELECT width_bucket('Infinity'::numeric, 1, 10, 10), + width_bucket('-Infinity'::numeric, 1, 10, 10); +SELECT width_bucket(0.0::float8, 'Infinity'::float8, 5, 10); -- error +SELECT width_bucket(0.0::float8, 5, '-Infinity'::float8, 20); -- error +SELECT width_bucket('Infinity'::float8, 1, 10, 10), + width_bucket('-Infinity'::float8, 1, 10, 10); + +DROP TABLE width_bucket_test; + +-- Simple test for roundoff error when results should be exact +SELECT x, width_bucket(x::float8, 10, 100, 9) as flt, + width_bucket(x::numeric, 10, 100, 9) as num +FROM generate_series(0, 110, 10) x; +SELECT x, width_bucket(x::float8, 100, 10, 9) as flt, + width_bucket(x::numeric, 100, 10, 9) as num +FROM generate_series(0, 110, 10) x; + +-- +-- TO_CHAR() +-- +SELECT to_char(val, '9G999G999G999G999G999') + FROM num_data; + +SELECT to_char(val, '9G999G999G999G999G999D999G999G999G999G999') + FROM num_data; + +SELECT to_char(val, '9999999999999999.999999999999999PR') + FROM num_data; + +SELECT to_char(val, '9999999999999999.999999999999999S') + FROM num_data; + +SELECT to_char(val, 'MI9999999999999999.999999999999999') FROM num_data; +SELECT to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data; +SELECT to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data; +SELECT to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data; +SELECT to_char(val, '0999999999999999.999999999999999') FROM num_data; +SELECT to_char(val, 'S0999999999999999.999999999999999') FROM num_data; +SELECT to_char(val, 'FM0999999999999999.999999999999999') FROM num_data; +SELECT to_char(val, 'FM9999999999999999.099999999999999') FROM num_data; +SELECT to_char(val, 'FM9999999999990999.990999999999999') FROM num_data; +SELECT to_char(val, 'FM0999999999999999.999909999999999') FROM num_data; +SELECT to_char(val, 'FM9999999990999999.099999999999999') FROM num_data; +SELECT to_char(val, 'L9999999999999999.099999999999999') FROM num_data; +SELECT to_char(val, 'FM9999999999999999.99999999999999') FROM num_data; +SELECT to_char(val, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data; +SELECT to_char(val, 'FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data; +SELECT to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data; +SELECT to_char(val, '999999SG9999999999') FROM num_data; +SELECT to_char(val, 'FM9999999999999999.999999999999999') FROM num_data; +SELECT to_char(val, '9.999EEEE') FROM num_data; + +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, '9.999EEEE') as numeric, + to_char(val::float8, '9.999EEEE') as float8, + to_char(val::float4, '9.999EEEE') as float4 +FROM v; + +WITH v(exp) AS + (VALUES(-16379),(-16378),(-1234),(-789),(-45),(-5),(-4),(-3),(-2),(-1),(0), + (1),(2),(3),(4),(5),(38),(275),(2345),(45678),(131070),(131071)) +SELECT exp, + to_char(('1.2345e'||exp)::numeric, '9.999EEEE') as numeric +FROM v; + +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, 'MI9999999999.99') as numeric, + to_char(val::float8, 'MI9999999999.99') as float8, + to_char(val::float4, 'MI9999999999.99') as float4 +FROM v; + +WITH v(val) AS + (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan')) +SELECT val, + to_char(val, 'MI99.99') as numeric, + to_char(val::float8, 'MI99.99') as float8, + to_char(val::float4, 'MI99.99') as float4 +FROM v; + +SELECT to_char('100'::numeric, 'FM999.9'); +SELECT to_char('100'::numeric, 'FM999.'); +SELECT to_char('100'::numeric, 'FM999'); + +-- Check parsing of literal text in a format string +SELECT to_char('100'::numeric, 'foo999'); +SELECT to_char('100'::numeric, 'f\oo999'); +SELECT to_char('100'::numeric, 'f\\oo999'); +SELECT to_char('100'::numeric, 'f\"oo999'); +SELECT to_char('100'::numeric, 'f\\"oo999'); +SELECT to_char('100'::numeric, 'f"ool"999'); +SELECT to_char('100'::numeric, 'f"\ool"999'); +SELECT to_char('100'::numeric, 'f"\\ool"999'); +SELECT to_char('100'::numeric, 'f"ool\"999'); +SELECT to_char('100'::numeric, 'f"ool\\"999'); + +-- TO_NUMBER() +-- +SET lc_numeric = 'C'; +SELECT to_number('-34,338,492', '99G999G999'); +SELECT to_number('-34,338,492.654,878', '99G999G999D999G999'); +SELECT to_number('<564646.654564>', '999999.999999PR'); +SELECT to_number('0.00001-', '9.999999S'); +SELECT to_number('5.01-', 'FM9.999999S'); +SELECT to_number('5.01-', 'FM9.999999MI'); +SELECT to_number('5 4 4 4 4 8 . 7 8', '9 9 9 9 9 9 . 9 9'); +SELECT to_number('.01', 'FM9.99'); +SELECT to_number('.0', '99999999.99999999'); +SELECT to_number('0', '99.99'); +SELECT to_number('.-01', 'S99.99'); +SELECT to_number('.01-', '99.99S'); +SELECT to_number(' . 0 1-', ' 9 9 . 9 9 S'); +SELECT to_number('34,50','999,99'); +SELECT to_number('123,000','999G'); +SELECT to_number('123456','999G999'); +SELECT to_number('$1234.56','L9,999.99'); +SELECT to_number('$1234.56','L99,999.99'); +SELECT to_number('$1,234.56','L99,999.99'); +SELECT to_number('1234.56','L99,999.99'); +SELECT to_number('1,234.56','L99,999.99'); +SELECT to_number('42nd', '99th'); +RESET lc_numeric; + +-- +-- Input syntax +-- + +CREATE TABLE num_input_test (n1 numeric); + +-- good inputs +INSERT INTO num_input_test(n1) VALUES (' 123'); +INSERT INTO num_input_test(n1) VALUES (' 3245874 '); +INSERT INTO num_input_test(n1) VALUES (' -93853'); +INSERT INTO num_input_test(n1) VALUES ('555.50'); +INSERT INTO num_input_test(n1) VALUES ('-555.50'); +INSERT INTO num_input_test(n1) VALUES ('NaN '); +INSERT INTO num_input_test(n1) VALUES (' nan'); +INSERT INTO num_input_test(n1) VALUES (' inf '); +INSERT INTO num_input_test(n1) VALUES (' +inf '); +INSERT INTO num_input_test(n1) VALUES (' -inf '); +INSERT INTO num_input_test(n1) VALUES (' Infinity '); +INSERT INTO num_input_test(n1) VALUES (' +inFinity '); +INSERT INTO num_input_test(n1) VALUES (' -INFINITY '); + +-- bad inputs +INSERT INTO num_input_test(n1) VALUES (' '); +INSERT INTO num_input_test(n1) VALUES (' 1234 %'); +INSERT INTO num_input_test(n1) VALUES ('xyz'); +INSERT INTO num_input_test(n1) VALUES ('- 1234'); +INSERT INTO num_input_test(n1) VALUES ('5 . 0'); +INSERT INTO num_input_test(n1) VALUES ('5. 0 '); +INSERT INTO num_input_test(n1) VALUES (''); +INSERT INTO num_input_test(n1) VALUES (' N aN '); +INSERT INTO num_input_test(n1) VALUES ('+ infinity'); + +SELECT * FROM num_input_test; + +-- +-- Test some corner cases for multiplication +-- + +select 4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; + +select 4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; + +select 4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; + +select 4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; + +select trim_scale((0.1 - 2e-16383) * (0.1 - 3e-16383)); + +-- +-- Test some corner cases for division +-- + +select 999999999999999999999::numeric/1000000000000000000000; +select div(999999999999999999999::numeric,1000000000000000000000); +select mod(999999999999999999999::numeric,1000000000000000000000); +select div(-9999999999999999999999::numeric,1000000000000000000000); +select mod(-9999999999999999999999::numeric,1000000000000000000000); +select div(-9999999999999999999999::numeric,1000000000000000000000)*1000000000000000000000 + mod(-9999999999999999999999::numeric,1000000000000000000000); +select mod (70.0,70) ; +select div (70.0,70) ; +select 70.0 / 70 ; +select 12345678901234567890 % 123; +select 12345678901234567890 / 123; +select div(12345678901234567890, 123); +select div(12345678901234567890, 123) * 123 + 12345678901234567890 % 123; + +-- +-- Test some corner cases for square root +-- + +select sqrt(1.000000000000003::numeric); +select sqrt(1.000000000000004::numeric); +select sqrt(96627521408608.56340355805::numeric); +select sqrt(96627521408608.56340355806::numeric); +select sqrt(515549506212297735.073688290367::numeric); +select sqrt(515549506212297735.073688290368::numeric); +select sqrt(8015491789940783531003294973900306::numeric); +select sqrt(8015491789940783531003294973900307::numeric); + +-- +-- Test code path for raising to integer powers +-- + +select 10.0 ^ -2147483648 as rounds_to_zero; +select 10.0 ^ -2147483647 as rounds_to_zero; +select 10.0 ^ 2147483647 as overflows; +select 117743296169.0 ^ 1000000000 as overflows; + +-- cases that used to return inaccurate results +select 3.789 ^ 21; +select 3.789 ^ 35; +select 1.2 ^ 345; +select 0.12 ^ (-20); +select 1.000000000123 ^ (-2147483648); +select coalesce(nullif(0.9999999999 ^ 23300000000000, 0), 0) as rounds_to_zero; +select round(((1 - 1.500012345678e-1000) ^ 1.45e1003) * 1e1000); + +-- cases that used to error out +select 0.12 ^ (-25); +select 0.5678 ^ (-85); +select coalesce(nullif(0.9999999999 ^ 70000000000000, 0), 0) as underflows; + +-- negative base to integer powers +select (-1.0) ^ 2147483646; +select (-1.0) ^ 2147483647; +select (-1.0) ^ 2147483648; +select (-1.0) ^ 1000000000000000; +select (-1.0) ^ 1000000000000001; + +-- +-- Tests for raising to non-integer powers +-- + +-- special cases +select 0.0 ^ 0.0; +select (-12.34) ^ 0.0; +select 12.34 ^ 0.0; +select 0.0 ^ 12.34; + +-- NaNs +select 'NaN'::numeric ^ 'NaN'::numeric; +select 'NaN'::numeric ^ 0; +select 'NaN'::numeric ^ 1; +select 0 ^ 'NaN'::numeric; +select 1 ^ 'NaN'::numeric; + +-- invalid inputs +select 0.0 ^ (-12.34); +select (-12.34) ^ 1.2; + +-- cases that used to generate inaccurate results +select 32.1 ^ 9.8; +select 32.1 ^ (-9.8); +select 12.3 ^ 45.6; +select 12.3 ^ (-45.6); + +-- big test +select 1.234 ^ 5678; + +-- +-- Tests for EXP() +-- + +-- special cases +select exp(0.0); +select exp(1.0); +select exp(1.0::numeric(71,70)); +select exp('nan'::numeric); +select exp('inf'::numeric); +select exp('-inf'::numeric); +select coalesce(nullif(exp(-5000::numeric), 0), 0) as rounds_to_zero; +select coalesce(nullif(exp(-10000::numeric), 0), 0) as underflows; + +-- cases that used to generate inaccurate results +select exp(32.999); +select exp(-32.999); +select exp(123.456); +select exp(-123.456); + +-- big test +select exp(1234.5678); + +-- +-- Tests for generate_series +-- +select * from generate_series(0.0::numeric, 4.0::numeric); +select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric); +select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric); +-- Trigger errors +select * from generate_series(-100::numeric, 100::numeric, 0::numeric); +select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric); +select * from generate_series('nan'::numeric, 100::numeric, 10::numeric); +select * from generate_series(0::numeric, 'nan'::numeric, 10::numeric); +select * from generate_series('inf'::numeric, 'inf'::numeric, 10::numeric); +select * from generate_series(0::numeric, 'inf'::numeric, 10::numeric); +select * from generate_series(0::numeric, '42'::numeric, '-inf'::numeric); +-- Checks maximum, output is truncated +select (i / (10::numeric ^ 131071))::numeric(1,0) + from generate_series(6 * (10::numeric ^ 131071), + 9 * (10::numeric ^ 131071), + 10::numeric ^ 131071) as a(i); +-- Check usage with variables +select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j; +select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j; +select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j; + +-- +-- Tests for LN() +-- + +-- Invalid inputs +select ln(-12.34); +select ln(0.0); + +-- Some random tests +select ln(1.2345678e-28); +select ln(0.0456789); +select ln(0.349873948359354029493948309745709580730482050975); +select ln(0.99949452); +select ln(1.00049687395); +select ln(1234.567890123456789); +select ln(5.80397490724e5); +select ln(9.342536355e34); + +-- +-- Tests for LOG() (base 10) +-- + +-- invalid inputs +select log(-12.34); +select log(0.0); + +-- some random tests +select log(1.234567e-89); +select log(3.4634998359873254962349856073435545); +select log(9.999999999999999999); +select log(10.00000000000000000); +select log(10.00000000000000001); +select log(590489.45235237); + +-- +-- Tests for LOG() (arbitrary base) +-- + +-- invalid inputs +select log(-12.34, 56.78); +select log(-12.34, -56.78); +select log(12.34, -56.78); +select log(0.0, 12.34); +select log(12.34, 0.0); +select log(1.0, 12.34); + +-- some random tests +select log(1.23e-89, 6.4689e45); +select log(0.99923, 4.58934e34); +select log(1.000016, 8.452010e18); +select log(3.1954752e47, 9.4792021e-73); + +-- +-- Tests for scale() +-- + +select scale(numeric 'NaN'); +select scale(numeric 'inf'); +select scale(NULL::numeric); +select scale(1.12); +select scale(0); +select scale(0.00); +select scale(1.12345); +select scale(110123.12475871856128); +select scale(-1123.12471856128); +select scale(-13.000000000000000); + +-- +-- Tests for min_scale() +-- + +select min_scale(numeric 'NaN') is NULL; -- should be true +select min_scale(numeric 'inf') is NULL; -- should be true +select min_scale(0); -- no digits +select min_scale(0.00); -- no digits again +select min_scale(1.0); -- no scale +select min_scale(1.1); -- scale 1 +select min_scale(1.12); -- scale 2 +select min_scale(1.123); -- scale 3 +select min_scale(1.1234); -- scale 4, filled digit +select min_scale(1.12345); -- scale 5, 2 NDIGITS +select min_scale(1.1000); -- 1 pos in NDIGITS +select min_scale(1e100); -- very big number + +-- +-- Tests for trim_scale() +-- + +select trim_scale(numeric 'NaN'); +select trim_scale(numeric 'inf'); +select trim_scale(1.120); +select trim_scale(0); +select trim_scale(0.00); +select trim_scale(1.1234500); +select trim_scale(110123.12475871856128000); +select trim_scale(-1123.124718561280000000); +select trim_scale(-13.00000000000000000000); +select trim_scale(1e100); + +-- +-- Tests for SUM() +-- + +-- cases that need carry propagation +SELECT SUM(9999::numeric) FROM generate_series(1, 100000); +SELECT SUM((-9999)::numeric) FROM generate_series(1, 100000); + +-- +-- Tests for GCD() +-- +SELECT a, b, gcd(a, b), gcd(a, -b), gcd(-b, a), gcd(-b, -a) +FROM (VALUES (0::numeric, 0::numeric), + (0::numeric, numeric 'NaN'), + (0::numeric, 46375::numeric), + (433125::numeric, 46375::numeric), + (43312.5::numeric, 4637.5::numeric), + (4331.250::numeric, 463.75000::numeric), + ('inf', '0'), + ('inf', '42'), + ('inf', 'inf') + ) AS v(a, b); + +-- +-- Tests for LCM() +-- +SELECT a,b, lcm(a, b), lcm(a, -b), lcm(-b, a), lcm(-b, -a) +FROM (VALUES (0::numeric, 0::numeric), + (0::numeric, numeric 'NaN'), + (0::numeric, 13272::numeric), + (13272::numeric, 13272::numeric), + (423282::numeric, 13272::numeric), + (42328.2::numeric, 1327.2::numeric), + (4232.820::numeric, 132.72000::numeric), + ('inf', '0'), + ('inf', '42'), + ('inf', 'inf') + ) AS v(a, b); + +SELECT lcm(9999 * (10::numeric)^131068 + (10::numeric^131068 - 1), 2); -- overflow + +-- +-- Tests for factorial +-- +SELECT factorial(4); +SELECT factorial(15); +SELECT factorial(100000); +SELECT factorial(0); +SELECT factorial(-4); + +-- +-- Tests for pg_lsn() +-- +SELECT pg_lsn(23783416::numeric); +SELECT pg_lsn(0::numeric); +SELECT pg_lsn(18446744073709551615::numeric); +SELECT pg_lsn(-1::numeric); +SELECT pg_lsn(18446744073709551616::numeric); +SELECT pg_lsn('NaN'::numeric); diff --git a/src/test/singlenode_regress/sql/numeric_big.sql b/src/test/singlenode_regress/sql/numeric_big.sql new file mode 100644 index 00000000000..c9d52d08b44 --- /dev/null +++ b/src/test/singlenode_regress/sql/numeric_big.sql @@ -0,0 +1,1366 @@ +-- ****************************** +-- * Test suite for the Postgres NUMERIC data type +-- ****************************** + +-- Must drop tables created by short numeric test. +DROP TABLE num_data; +DROP TABLE num_exp_add; +DROP TABLE num_exp_sub; +DROP TABLE num_exp_div; +DROP TABLE num_exp_mul; +DROP TABLE num_exp_sqrt; +DROP TABLE num_exp_ln; +DROP TABLE num_exp_log10; +DROP TABLE num_exp_power_10_ln; +DROP TABLE num_result; + +CREATE TABLE num_data (id int4, val numeric(1000,800)); +CREATE TABLE num_exp_add (id1 int4, id2 int4, expected numeric(1000,800)); +CREATE TABLE num_exp_sub (id1 int4, id2 int4, expected numeric(1000,800)); +CREATE TABLE num_exp_div (id1 int4, id2 int4, expected numeric(1000,800)); +CREATE TABLE num_exp_mul (id1 int4, id2 int4, expected numeric(1000,800)); +CREATE TABLE num_exp_sqrt (id int4, expected numeric(1000,800)); +CREATE TABLE num_exp_ln (id int4, expected numeric(1000,800)); +CREATE TABLE num_exp_log10 (id int4, expected numeric(1000,800)); +CREATE TABLE num_exp_power_10_ln (id int4, expected numeric(1000,800)); + +CREATE TABLE num_result (id1 int4, id2 int4, result numeric(1000,800)); + + +-- ****************************** +-- * The following EXPECTED results are computed by bc(1) +-- * with a scale of 1000 +-- ****************************** + +BEGIN TRANSACTION; +INSERT INTO num_exp_add VALUES (0,0,'0'); +INSERT INTO num_exp_sub VALUES (0,0,'0'); +INSERT INTO num_exp_mul VALUES (0,0,'0'); +INSERT INTO num_exp_div VALUES (0,0,'NaN'); +INSERT INTO num_exp_add VALUES (0,1,'85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (0,1,'-85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (0,1,'0'); +INSERT INTO num_exp_div VALUES (0,1,'0'); +INSERT INTO num_exp_add VALUES (0,2,'-994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (0,2,'994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (0,2,'0'); +INSERT INTO num_exp_div VALUES (0,2,'0'); +INSERT INTO num_exp_add VALUES (0,3,'-60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (0,3,'60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (0,3,'0'); +INSERT INTO num_exp_div VALUES (0,3,'0'); +INSERT INTO num_exp_add VALUES (0,4,'5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (0,4,'-5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (0,4,'0'); +INSERT INTO num_exp_div VALUES (0,4,'0'); +INSERT INTO num_exp_add VALUES (0,5,'-652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (0,5,'652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (0,5,'0'); +INSERT INTO num_exp_div VALUES (0,5,'0'); +INSERT INTO num_exp_add VALUES (0,6,'.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_sub VALUES (0,6,'-.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_mul VALUES (0,6,'0'); +INSERT INTO num_exp_div VALUES (0,6,'0'); +INSERT INTO num_exp_add VALUES (0,7,'-818934540071845742'); +INSERT INTO num_exp_sub VALUES (0,7,'818934540071845742'); +INSERT INTO num_exp_mul VALUES (0,7,'0'); +INSERT INTO num_exp_div VALUES (0,7,'0'); +INSERT INTO num_exp_add VALUES (0,8,'8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_sub VALUES (0,8,'-8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (0,8,'0'); +INSERT INTO num_exp_div VALUES (0,8,'0'); +INSERT INTO num_exp_add VALUES (0,9,'54863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (0,9,'-54863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (0,9,'0'); +INSERT INTO num_exp_div VALUES (0,9,'0'); +INSERT INTO num_exp_add VALUES (1,0,'85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (1,0,'85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,0,'0'); +INSERT INTO num_exp_div VALUES (1,0,'NaN'); +INSERT INTO num_exp_add VALUES (1,1,'170486.79080049955252152479695727201571965474311716541919780029226071455736587237347615553466832461907447637054203186991790701615551214692555785671028648640897898741246882118067609728317430043806625387779037980513762118868084887015059202190301421555269486602797852927777567694581746398790609996101506730430853942556475840126871131898407356048450541232591147357021858041662012293323494543567675306406079659294204054863522259037763051870433216859794083051717080761509518250300466106939998045710070'); +INSERT INTO num_exp_sub VALUES (1,1,'0'); +INSERT INTO num_exp_mul VALUES (1,1,'7266436459.363324713115467666113895787027372854351303425444968800459979742082292257107107767894843498525848597439323325297125474674300428669958003640228730876886174255457103020291514229439701871032118057857763809224712818579091741996335014138185389554630910658876423205103697147288306070059640369158894028731728589073730895396494400175420670713113234800826523252075036892246807434088405522834549449664122407363485486902219500109237667016524913027290777216477989904700729228025571098410870506256758678625928245828210775042611512394316804583459576285681159178280400209217948833631961377519855502763611693070238579591463373484424582723121059964236704135695706864890193388054537703767833595331866551990460050750959493829603581882430597105627056085260296454181999581594565113210481151487049158699087454047624433576922179904629'); +INSERT INTO num_exp_div VALUES (1,1,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (1,2,'-994877526002806872754342148663997.64812998474240514147207095573950146764154822009863493316394610578375247334825932838513167168342610420582834742950389452212867974756590355021495169819086060202117180229196935525386766373096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (1,2,'994877526002806872754342148834484.43893048429492666626902822775522112238466538551783273345620682034111834572173548391979999630250058057637037929942180153828419189449146140692523818459983958943364062347264545253704196416903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,2,'-84806738323879544552397401815149740513.8505875535743013876823142649666132764556588225959336097903898464616542203793600590311980154402068027051522932586050753865288419084437796768749509032177577451738712965496693249429231838833655025794915864261585848007162358912070811805298210095333433397862313304655108809804359760907473898420016370058274978588765092161529583480924554820756527238472641797198545539410039895140087686344382628317530286295498797849942258314364503000942821309916954725689781458590617068629906894951122301020797266469357701283289275708774593896770378558232444454118891917258610753077932026885574920166837998049508644891327208474213193224700658584824407382455480657734911543930195324144216374573825'); +INSERT INTO num_exp_div VALUES (1,2,'-.000000000000000000000000000085682300757901809257711279577127388124986344391495296640171942990079130291883279872719240502687189411421655284515420074848478500192127657883342858267913417679786356766341637336955924836847768457039175660279784295612167899455618405343686908907695358239088351870495830739180518509859269437015797489301844593920484927630172344269378248455657186218762679357609204333669024237648538465053048724383898528808961206696787294681884412485427843796696788390072124570957047672341581447744981862017791206857428430183366004980966398716823512288330174863890117558744630102020144500158878244146399686532935435591262767487823942606452349972401012308378888947381934278131785907155692007064636085000405504866631011593239041758448995933095907216863744502344014999804306234830774259496097549717476344048'); +INSERT INTO num_exp_add VALUES (1,3,'-60302029489319384367663884408085672236.83687099063256754698860828386302509843815398979402006244388708674093244201278399438376682321121138429850885935540924586964982855913223221441591310211730902799041126800414795030815514254713522692405212716783388698431088814919226444677188004928663343696636297536500970117716818423689175692808344185016908913828066250587407384563498516598672584120143890364303296142744031320345312431817858545326010704685255237541162931904446804064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (1,3,'60302029489319384367663884408085842723.62767149018508907178556555587874475318127115521321786273614780129829831438626014991843514783028586066905089122532715288580534070605779007112619958852628801540288008918482404759132944298520148080184250697297150817299173701934285646867489426483932830299434150464278537812298564822479785688909850915447762856384542090714278516461905872647123125352735037721325154184406043613668806975385533851732090363979459292404685190942209855935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,3,'-5140349743195574373979577554212527512597024.162480344833040409158673429491690439298506850052285119390701002577176786023622062742050099464897084793357329597395417632908812044304066963549928478520702505283307379218587635434673128958824348493758429380623577527186462464399974242800361134191519694694139153279582776168995426125926314513926640766117733774558011741611075336271613675760116784769700605008122422944290652448956922432960815546502965310676913079866511016221573557684245901002643719965652152439520727383305120298495304784052489867651462175349450610643411043707261107569691076730261762793560088893354750383257372118118753366377402045596735023445172252225346164608897913115394905485106225627590643805003075069931177395059698550161546962768768895596088478488887530518018212441345360153523733317120037436403475909117998647781920105313938836144009539683'); +INSERT INTO num_exp_div VALUES (1,3,'-.000000000000000000000000000000001413607404628860353773457807436398753936801768769045711604884548436548520368932184112069166807060840219636509423284498981041814526856251281381511288768719259120481595036745286884246627534964287523188738499223075292690431699417313258943941279343383979626641848305343592679057491670166887054819766294147341982669243114259272404203080347707713358471397866402657818267495050115642987782080912962056565478445923456884713049272637646637760989004917643369240372476411912794578381690666695711891846833983534126217706309741885844723208036219144146342212915129560758201609824034610223907791643110990898577049488934294259106725414517181607988173722432655731491050637087261030314548853334338835938120502930424813699221083197863303458179445322810087784892821862085562891180364134284641396475'); +INSERT INTO num_exp_add VALUES (1,4,'5329378275943663322300488.64471790965256505869684245785528331091076155554650629138833809683459634328609777839510066435612911583108717191216693735823717997111970662575497378762952496582183738308720094529950793570383580785385569873278068217936841324404119828637880370718028782103860007754579779716996004352284614661690063919125301052941328989181561787543541920734755989452320799185700078241880935083616978140555713297241612718277766918005268951861880490889884082730841740604517529391011862694381726143520658746305661338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (1,4,'-5329378275943663322130001.85391741010004353389988518583956365616764439012730849109607738227723047091262162286043233973705463946054514004224903034208166782419414876904468730122054597840936856190652484801633363526576955397606531892764306099068756437389060626447578949162759295501062154826802212022414257953494004665588557188694447110384853149054690655645134564686305448219729651828678220200218922790293483596988037990835533058983562863141746692824117439019450865871047657552800448629502344444081260036580660700595591338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (1,4,'454294299613767152878025320780.534199313974295807138790763501115780294529340799108297697573066187975311338382917022391830256203305238757334106943821060545424417350991354829668286194840925251162479496893943917530660694097932059166013476064988623431110002057735318529554555260199417935495388243829261809007709919225000608711536928171687251088217591210419208480251102484043683131687013687838713055660405381318396419588727500715930145098362997142075433472039319292466570912777345841400769387321465602989947078951135489852486382469990409873227894248208197179481868230244584527040573428134962626267135732247029762468417273891700661832893497067151409134724061246612631376075173287264787886064622106855886785805818642123776489793586531950438285720668411465570116161790343538663297713926678759640594912243360541590368666922379919514826022141331900181'); +INSERT INTO num_exp_div VALUES (1,4,'.000000000000000000015994998100440878014888861029956505927201309704413242103407885948184870841766875212766910686894450511886242468216220470061916924303252919423028993720180330014505454865704155281502763018913215741264982350384245753394656021401865680441649920273268554396350483440173848850052788410943178207336328451359951614056237100465802151856198860908371340425459435127133071447273887829397881221098443685586506647314622864702873235212396755866459409263439958011711379929751157260020133239574261188528305921244365838405372320186907437842180388704854605498842516581811515413843298370501194935797268161171428747542997504369133579105180311662221854071962295818264211400101689450830279979372422749150894553349570063000769685274875561760334738424509532610467832951796852051505383374693614022043010735004494395190'); +INSERT INTO num_exp_add VALUES (1,5,'-652670387.03916046850422757312745971450663862747133703839829692066597367760104802542475264601221776157515632293978442027199108085723617181683235487266149426304575903892721468296143475297345699313102262188759506518376019936160961709578829069446312051432780603656651983414612264636232727512091101057374054475214114364113300402823059519499217878746766275164739724770556122895799337810694888119810524986616938847385753562624139431982468828696587199570410008890188532132652095915565323400735066310142303225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (1,5,'652840873.82996096805674909792441698652235828221445420381749472095823439215841389779822880154688608619423079931032645214190898787339168396375791272937178074945473802633968350414211085025663129356908887576538544498889782055029046596593888271636613472988050090259449836342389832330814473910881711053475561205644968306669776242949930651397625234795216816397330872127577980937461350104018382663378200293023018506679957617487661691020231880567020416430204091941905612894161614165865789507675064355852373225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (1,5,'-55643106304872.575994253221940844841058071061962511162776681458310912066379595519265546225338405882027547140476045378015935579066580347282075024392379464189067155567624835346798806677988850250198082355055954078446421075165109896091047534711081616362392995575466807084807876544560268050611445006601394735810211678919646667455478469014906335433468365011768049600750224822391684377238242162320161552720449713229523135506671063115436813348612986916614320012995541575293478341408982118538094438068036422562665160411591652618670802973618768526197813319204816293073794413317669922144705633308090832805914096147659820167569140291210526520361556881576175809360614782817717579318298657744021133210954279487777567785280633309576696708168342539425395482429923273623865667723482418178781573723597156804085501875735112311466228778929147929'); +INSERT INTO num_exp_div VALUES (1,5,'-.000130590057635351941758745900947472461593749814351229292370661147301124533787181489468804246182606762727711479707901680546780430454163647774077629503207962424213266902732555945190365467801995495570282501722505521485829885605904543846887348545254658726343578684749830307120625129857380290225370772763609458975555029415082569247186899112975387051141777417911244576134390940441209829852154391377911942082738699481875795620569383196133124499983396562167632007454221121465745085962247988140942672429187053671899537331280701003778040796615094903602095098880716919238394057384949891444700347825726273725378453454782330181608182747900774711384845635284701538541452235224216112380245660177463043471814071809869894647262285332580556739424040615194137651616350340752691170045698234853734471923738591898290468792787543896'); +INSERT INTO num_exp_add VALUES (1,6,'85243.44233732197133191329295927531563604777955507322414928382967007765263923984471408038635831036097817458527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (1,6,'85243.34846317758118961150399799670008360696356209219504851646259063690472663252876207514831001425809630178527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,6,'4001.075404054519813215296429095020391062109905613738157927030437221793757373268325953178030040276107574363822832168160758728653712686313134828282109532831190239521843808940611025488601517574653932032236616573457735900045655665690517797280666732780030171712864961531623060353548802466577910774711998056232872212688464691036260746751992072745518373073825852119460094113694393273456369345499434994672730920070410547163082189385645712866100999708173472360864669110044660667614583576570496399103026286828660558854973376227247132815728164629722965145778698957093136175449225024685874279280018547740'); +INSERT INTO num_exp_div VALUES (1,6,'1816120.848909727306817960620941575637231136442992819290405125420545200026620306446043740992108329883383706060582482495616151605111275635501481354526017831484915013545483361715432312183101964395505340188909970344423950565285639911521082834494088840596716495422427543520536844348040681236845850482165744696068209384509064196671206362539077218412355776790921130042376467606683622970728503408501481791356294886150690067651815776445750760428874351556866105285911902433352126498951242195408782804314174041618879250740246352525074791310920062276490422853700893340860452528740673590486626464460321410814395342850270921486724297414692313177440726749004398703147904603937755702369682956482832074779404350351752662820773690162594400557957241676636030332988289683112176900913522668426137377289536793838959751008646843014106876005'); +INSERT INTO num_exp_add VALUES (1,7,'-818934540071760498.60459975022373923760152136399214017262844141729040109985386964272131706381326192223266583769046276181472898406504104649192224392653722107164485675679551050629376558940966195135841284978096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (1,7,'818934540071930985.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (1,7,'-69808760806266041400340.70700818693892852138813934414383886494691670042143650609934777814995087699409404201920249076407981012095999320858479644760715204999741683528746097757549835956359129287002171391961763797857794730120426599135099619822532290339000466211195776337667123320942107370731349851576864242697412616810236323676004067839744992733887503405311090677026008324895177587064547630828026123718296429295638934384446325302964896473296829265805737112709269803814942537657996725913938408781715328945194948010970'); +INSERT INTO num_exp_div VALUES (1,7,'-.000000000000104090609479936344103210175655521317012597986331111866307697262848964666360492361638117930801818899121383806224630563676018240181412174154250663423230239912527388431901852952893943812666142740182651125508583527237123596541789628675379232473721293630968882045044077795828674268595016625198802475186587918019739056755398151182369187670251750080227679555002307777300392769289647975058449905106584837938556260801229545589323224752038795423164214112897202147313792076165011373139219134850954217300915326944185918762838321705825423789073869940092569940135329697980600082436317664012683589681419530904283106912171330819469065141821685734295058255484933744156717782754922568796985634397878149984177882018261742637463462647452140104146195353696596211873925359508622779658904411330975862442989437933211964821'); +INSERT INTO num_exp_add VALUES (1,8,'8497071467.03603749330791582407836434318377133169438097066269854720538319012928851657498035372443556191720308219530866834905045144302106406146277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (1,8,'-8496900980.24523699375539429928140707116805167695126380524350074691312247557192264420150419818976723729812860582476663647913254442686555191453722107164485675679551050629376558940966195135841284978096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_mul VALUES (1,8,'724311956372274.0135050255361637906710330203036651743488213007179039756514944640108625580172737414192938789413338554327986697518463087452612658955180411327002900979574347739956600177846996063741787205122007268468674386396156638261992679442768654367111433834151087792255469957061758837789341439211010331332174981459471333376067541234901538285101103690622656631026001337239036711179989456674399137008584021283568040818388709554256523118702728176420022080138548890713013682480239784198421500241995499841675772793497485550923152267616622892846304530712344886979674416990935007952941652591352603797627920865960622077762568060903908151958000'); +INSERT INTO num_exp_div VALUES (1,8,'.000010032191786198542900505683562217892317481076466949299850809276743457759270150820565375820388277409258249926696079166209409657808406245382887790534127749833677458375931047385994887406206232330491317602830654688957983804698568410728278089250379255157030886262396950539100566975000094268415749476738358914633948867977798590927055566888255636132486899287919515638902721543629183577900872078173883974905921239149419877613723476347774771230668479296621531969573505480695490386225866950545725121902534610730154727385072738079149623798073810167706094070842646222833137345669922898403368997676634709281456818189049718956207208697021706186341405575300648248555331280690778367620868775005181264547924615247991795542738868003191757946979714250339430363902549866892041102771965653407197094250270379367437342632741280710'); +INSERT INTO num_exp_add VALUES (1,9,'54948723.74225051983134098996071145685528795757427462111901537365053896571438476055974853245403475510333627298551845046116291696445177112567064282766115207407461565363967417615506303416694032848457927390574251904212425813072768882213388082765916956736282110801611726537663292922699021333445658549608928179155685881583228490235606377831724593358583903616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (1,9,'-54778236.95145002027881946516375418483956830283115745569981757335827825115701888818627237691936643048426179661497641859124500994829625897874508497095086558766563666622720535497438693688376602804651302002795213923698663694204683995198328880575615535181012624198813873609885725228117274934655048553507421448724831939026752650108735245933317237310133362383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_mul VALUES (1,9,'4676749348240.390309875431213992853550297086049749814750492488995108783145961719774217441193547534210468967573344456866203963659951312519988497979489304488948342258375915152429008993288817366720647491166024151209542534474867042837694499222928509320280684557676243780452100132238968233413333851595648146954975713386711764268506890884764704949969602122157394714663532141060559896359465918874990769222345665160127552795532197771168442486088776803398878354288847069602460071745966589164282641033852314335279121191855487126430176047553895892632834940595958394834437871886013513058514896870683979585091413977173250824451205330441299000850618134248917380244749589254309567551846327349592529960432446947239714236828401206843011440433362544797025114476612133622499094287321570559088587999417440664282418005102546343020409520421747216'); +INSERT INTO num_exp_div VALUES (1,9,'.001553736563217204408368240901181555234014339476186598647410198373122572205209277343865051610898136462487966496673511261433286284257044548634547569923035899634327495195510767312478861719221916387940027268721306540663743713345337497285507595251328382906111997524508729275471287648008479480805967901972481289402930660848950039779707354469389216931774094174326513465502460315792834278614886136688161679443873815113442220055827192996984074129528034845339130162104547166079591654852164993577408422015514100323825529286511720963047269483211930770803479398243069649400360625259869765138545866815758888670363356947311319523139395191102286838888146829667276592755438606664644975648828848738708349790766370694194763606850690923803984129157519048493985198591771429264967247245289970213262206709011468289046840862597010969'); +INSERT INTO num_exp_add VALUES (2,0,'-994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (2,0,'-994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (2,0,'0'); +INSERT INTO num_exp_div VALUES (2,0,'NaN'); +INSERT INTO num_exp_add VALUES (2,1,'-994877526002806872754342148663997.64812998474240514147207095573950146764154822009863493316394610578375247334825932838513167168342610420582834742950389452212867974756590355021495169819086060202117180229196935525386766373096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (2,1,'-994877526002806872754342148834484.43893048429492666626902822775522112238466538551783273345620682034111834572173548391979999630250058057637037929942180153828419189449146140692523818459983958943364062347264545253704196416903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (2,1,'-84806738323879544552397401815149740513.8505875535743013876823142649666132764556588225959336097903898464616542203793600590311980154402068027051522932586050753865288419084437796768749509032177577451738712965496693249429231838833655025794915864261585848007162358912070811805298210095333433397862313304655108809804359760907473898420016370058274978588765092161529583480924554820756527238472641797198545539410039895140087686344382628317530286295498797849942258314364503000942821309916954725689781458590617068629906894951122301020797266469357701283289275708774593896770378558232444454118891917258610753077932026885574920166837998049508644891327208474213193224700658584824407382455480657734911543930195324144216374573825'); +INSERT INTO num_exp_div VALUES (2,1,'-11671021799770914903865020509.301561107153561058074179843542446420696517132461554451075945807420674211966679216615407057626541711186781735967334896541890595771915856783008831770988426637435694856170266346306640678577376310547806764332837625966429200996250687908930748245035578756314083608655163891041399241377675534416837659335561005203219889972336214863417948542956735403991871098341470996860469878038840964359144637726669728240650066795729910649523281308716277906908340457162235831526838308777581569974551673352306004330423694524256415657620427590352277556907586751621496248973165690360552007637570957980230685679819820147036159174977086193494572117089582758015847544798464543446227632367713941117001423437766840744488426025388612316819120660814681298624293065972395923651314350558006567251033289878238407790871784676348196394482477767774'); +INSERT INTO num_exp_add VALUES (2,2,'-1989755052005613745508684297498482.08706046903733180774109918349472259002621360561646766662015292612487081906999481230493166798592668478219872672892569606041287164205736495714018988279070019145481242576461480779090962790'); +INSERT INTO num_exp_sub VALUES (2,2,'0'); +INSERT INTO num_exp_mul VALUES (2,2,'989781291745465665243281323944996915810556285052564220274237162526.1617859904902612197894543199389468971679632139059029459520163585971122643624316475417489000981872666677202334180945949860058384424993911721081868337499377890298636260338063268639283065887210924895929155083478140340889209440025415565915964293989840603863813531303253038823629712989041722072693449251635519992922148998556112923060331794396659338057474019846675262291146025'); +INSERT INTO num_exp_div VALUES (2,2,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (2,3,'-60303024366845387174536638750234506721.2758014749274942132576365116182462208228193753118527959000939070820507877345194783035668195137119648748792386548310474079340204536236936213411512867171486174240518914767934028451971067161683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (2,3,'60301034611793381560791130065937008239.1887410058901624055165373281235236307966057696953851292799409809571799686645246659986351515277852800926805119259053513475211488115663286642009614039264484259692394657121785950542874788161683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (2,3,'59993133911282372667149627097418449223835595194300848703012380022306762.154418449236691515146061305380465061074531890529497774836941002526095632166401249277270674802626154774328055399254982998368191676630276960361274433270795772477146870294928855773172789856196219950097157391050424577381777627004101100872747943673762087675405200265837631665464736842180920496158545887039337399558993437594084473932658319914390365451919627956823980800124880375978662052111797881386060353490432427832058851094210488804887183034572364751639107535041308434932952695103493677600969712634416241541391613699710826602011076372592299807609658979777598672141389319098817824624950794758296679318319299142035'); +INSERT INTO num_exp_div VALUES (2,3,'.000016498242835741013709859217005931279826178662180173096568520102488480129191427472581644597420895622947234184547373944996197105916093347103336318249582032230903680989710242610024298937774441533502282949127537125997753002819456724709929935850697744632904111143787011103837624936502324835260843148595669524694347566421203164808527739207590986975750648112133699756328511947175496694080071202064255118777680958612315513441989609682655431197367166056616661045712867189326408877133865572680407329449150282415810958772293869902662884761202424695742898573841869524376684740249281181605067345203479719345061595919652192297531638467223956758315591610733251562492794891852151639643060692698365496208796638230566761231611376199140556503620471090364900792180618741355091923808605890415081571900697282725022629812561702118'); +INSERT INTO num_exp_add VALUES (2,4,'-994877520673428596810678826533995.79421257464236160757218576989993781147390382997132644206786872350652200243563770552469933194637146474528320738725486418004701192337175478117026439697031462361180324038544450723753402846519731908503949116978812841497201119103409772457270340059605961197538918709309004130294868847110690336360689446090125918336908930881873778405661757289469281163974774492810850778950071063044769131228124355961427111369335109426492177657001035045332525699055300921341010989742896430768506909949340276549373661076950964959025967328861569387160956730002517417236732463510495205173523163676450203614971844583064927040066684531931069310935516821795449174271052747559395296525950219449541557191520903507653089998307641491381797101485104546410643'); +INSERT INTO num_exp_sub VALUES (2,4,'-994877531332185148698005470964486.29284789439497020016891341359478477855230977564514122455228420261834881663435710678023233603955522003691551934167083188036585971868561017596992548582038556784300918537917030055337559943480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (2,4,'-5302078674303935968062773235453828254014583744527466365136.236414807326868572353809920518232561005161225922028750078608989965741402418802255050636954800114792425419735155504035469350521800895164087027043476055514245942961100610551646034472084954313670284875310691807937254054948742125729353864014122131419164449567115006621212424805182687707372956385102095255735458593389920872596796806885847543910224476727171570873698525606016990229936284811067826588349092841322512643043008589065847223683467371925773023109720951609815041012521485326120380123169545818055967455575736140138663815073081494226676896278654189873597341203197903408668523514375373841493189836809506003729379742035629498519683885268256481104619815130659628225053833297766479068686119691010593208135616363994230674606991733148502293102108193522604968743948323130517040609601859735899914987426089053869350663'); +INSERT INTO num_exp_div VALUES (2,4,'-186677971.517539861245390308778107722315862721823627804195528485535806132067679059453022306691281662574091826898288146790399178357754908901382135796783067563944022498807930452234032896817601590728156392188660701355670595952594500812333935362955625137944589981298793332621503315902294100258945995827423279442031218510259915311555745581797315793010762585658196457363672908315687720174516274528662385172326028870945153551774300419158584379602045442200523311437013776079979639415633358878239012925000523542907592866797199229858272764668664323316251874027468128770456766875866492004650352654523634716923150212263912760225390093339729495231675627059805624175587380165509763048913150826017167286786277908970769297060278191518730887417202276531151575412404467497036737825989088867451153485938272367300939127313445244028528055624'); +INSERT INTO num_exp_add VALUES (2,5,'-994877526002806872754342801504871.47809095279915423939648794226185974985600242391612965412218049794216637114648812993201775787765690351615479957141288239552036371132381627958673244764559862836085530643408020551049895730005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (2,5,'-994877526002806872754341495993610.60896951623817756834461124123286284017021118170033801249797242818270444792350668237291391010826978126604392715751281366489250793073354867755345743514510156309395711933053460228041067059994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (2,5,'649411906691138274293985410502516861224852.2323455192714410716272307781034189160865613770320102043319541634113746032638191509585045862973333645830298922352816245477556264222094036953195419857712804755170632292914187367964994214922001758104594052499795564860466055599417895782179851297585155129541589802249540436678824225950907268084876110445460948679383611117263673106597132046331719468816839434908155684738864149955129235751738204036443603521478609787295079710078973503970964790273461142497259987849074597264522099648376356902360358310245001183020992360260836105404118742418040965190000718736837422434593694808973939805954329718232693154128543253581495885789333274488461716809104532693754070810202831113003978085636579574171344721710232931261731022478029314435363413498991740750878099825781577297965642009156858479681236085226911858782115'); +INSERT INTO num_exp_div VALUES (2,5,'1524119409495532727030986.638577103454261465522025182901477334004986357902177024959076085490119358611626688213654669281670407680244740174673394111775678935383154847014211641601227316639834450258566053805263858706381900273201146454036688771735398324537667996974210741719621449948660517037619359095556637235980122706739013220201060795557114248610410815988952748489854367480813823114296393315170621979351958306734282429929421779129764262568942699813166237466796852578307944635545174715298176546980314973426586923195248536376403319094417073026382024413817222396402299695717290716014320518777088811749776114378145110676170242861393274018655137797545194817703831240390631723050378397773341835222892981773205967439339460305257986693600088957772328044922955990976285151896366292514128607363007421484320868718566256882080399264346243272770200676'); +INSERT INTO num_exp_add VALUES (2,6,'-994877526002806872754342148749240.99659316232359475297606895243958507460511031229368344962653674268847910587702140353344168594152240599109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (2,6,'-994877526002806872754342148749241.09046730671373705476503023105513751542110329332278421699361618343639171319297340877148998204440427879109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (2,6,'-46696638263247522384986521136500.479312417066793299922708112595886608370451213741279484136907754744903470430131032928908162742687359367826808123516519335458861613010646992354378739165872253762686683966945711430182491860196341344982195078000259063231136011430995647812149294224699587849791008794261026932467933475782780'); +INSERT INTO num_exp_div VALUES (2,6,'-21195986018643887410662481595901800.342199657994285865579781485758715114242459388977583220756870314514884887803267837816669111279417861218648323488364513921592045485003563036021370174294475403630933854767386355037781881144701319212711655881277140183173924089814927297045029394618083349813549439341772734606115369911736164723942330187830605893993276674913563980890459604886172701331890746621222114280438198802989678877404376001410627722336243835841751052795437979198996482216031399073597399901975686733315751292369326904428230195579137225651689857057115970784985439417129044974524632220457594191305254649113470116960582543784928547885740020507755033347968928034294570497118410435615856155184563329718831512839630769097935523279881940380220955993456451396417879773380305142918906742431812580562496634831735169817705720949712410595406012323294829461'); +INSERT INTO num_exp_add VALUES (2,7,'-994877526002807691688882220594983.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (2,7,'-994877526002806053819802076903499.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (2,7,'814739569184924399102711674444306584731316176345067.39834031417849342571224916231092924046722938910652929295271097903377854123984307101079073134405782275535446337229706620713104545454319555885847481531722101704765783025789147453570970090'); +INSERT INTO num_exp_div VALUES (2,7,'1214843772391778.127361407585140553741220126410637250571020684739034685508176000812180032686291124045768750332493129822580347351032145964983629059968936201592138368806173099130176852606440296388856520582890650384142745607345709716826703676313341953999327129144154152914234659001555055379537780751567782847296067128932113870102563522810980359433259696591977617184951677390423898232135100000764121508662830515405980450892222598485287609657612482190264517684867291774820716746063133066053446257163185646067618679478975882247893469409405379034723543061767846895135644429012095930584952053545016706315299076691015196261253199176743281648949731423486208098120903720124071047872917636988241710583721537777321338769039241700203546247947405745989053846970910400831817998342969657501678430211657755864160072525313889413731419647001970593'); +INSERT INTO num_exp_add VALUES (2,8,'-994877526002806872754333651763017.40289299098701084219066388457144979069028441485513418625082363021182982914675513019536443438529749838106171095037135009526312783302868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (2,8,'-994877526002806872754350645735464.68416747805032096555043529892327279933592919076133348036932929591304098992323968210956723360062918640113701577855434596514974380902868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (2,8,'-8453460632655529853033389979024265783461224.3195241893307807116624750282852146303290708492834695194274289713076935297734670940696121761483641291930931061232942894577813178566088927221374036301485916497770984757492912292002695944367308880163698595015497307574177176409203214324418237020500352652934909632442547242092296504047310806151851207329042221920888326000'); +INSERT INTO num_exp_div VALUES (2,8,'-117085929036205907700251.219065234073336548829793284434494573185718678644093751558890746941383215425734761534822966779511801033216479269605150574332107020180872343673157350081102818832254463561564431056604957702984438484261858890324442581609284935850435611342611117035589511568432559140282381526487115307554496353616929034919886387903446436924514812698404129456069856633480965357915969548215985452939172313964007318881987188665231550330515412104367728617802960792164260429920719961650164518261501571220901151359208484337831586551714193024143212288426326740373893030225940355268499071669300664200888186064836443459131985786957267268845966279576380786883200277187591448294590370986026461176853573555996139940001165172158855197070946665074838360933025833716166930231164328918316437195201546383664484983447934244744303265471044295601062898'); +INSERT INTO num_exp_add VALUES (2,9,'-994877526002806872754342093885760.69667996446358567630831677089993316481039076439881735980566785462673358516198695146576524119916430759085192883825888457383242076882081857926408611052522393579396644731758241837010163568445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_sub VALUES (2,9,'-994877526002806872754342203612721.39038050457374613143278241259478942521582284121765030681448507149813723390800786083916642678676237719134679789066681148658045087323654637787610377226547625566084597844703238942080799221554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (2,9,'-54582443595378013373024060492546032003692.4875677735896411267274323339692558458420972958075073392126734000341372096298914875892612108329218081214550050039133117695428196702128258481789017059073444323729583900855712795086447886053552786449313809589992185978097430132940882612817775035217244553616977182049775786664446683332098226841743818600819221587510039430478859412452506872131851471967577741190323481953867845129745440745526578327709351120432530702446916035797432129052518980799424635406993848916727957825620638983706180841278402925286540375225365057191075559133035'); +INSERT INTO num_exp_div VALUES (2,9,'-18133693300409132895168796.074616314168631402221003009151140409826855230810646429042722071403306917323628118792142878282108022292754325022530103525285999179488507720688317761243448898240836430183645778132937666952111134601563043980164547020295727057908447220163534134835130866457657964382363853570827467081988390359191484798677813656413640874450449802233520570178139244957518604566383671867773821069602665918688868868894979351219381089954104823746091972754649316823714354000113723793845707472924569647945844436702275724514171940901057842455729977729388911537391920702753167125695758365521631000334183494148229356487592577177344247694925635113222720411958290166668659311154664393442690740373285505786584987609789805525300762074682544164213490532272590665630428583216403362629445153016404037983825555019274338559686335405719430737559715778'); +INSERT INTO num_exp_add VALUES (3,0,'-60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,0,'-60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,0,'0'); +INSERT INTO num_exp_div VALUES (3,0,'NaN'); +INSERT INTO num_exp_add VALUES (3,1,'-60302029489319384367663884408085672236.83687099063256754698860828386302509843815398979402006244388708674093244201278399438376682321121138429850885935540924586964982855913223221441591310211730902799041126800414795030815514254713522692405212716783388698431088814919226444677188004928663343696636297536500970117716818423689175692808344185016908913828066250587407384563498516598672584120143890364303296142744031320345312431817858545326010704685255237541162931904446804064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (3,1,'-60302029489319384367663884408085842723.62767149018508907178556555587874475318127115521321786273614780129829831438626014991843514783028586066905089122532715288580534070605779007112619958852628801540288008918482404759132944298520148080184250697297150817299173701934285646867489426483932830299434150464278537812298564822479785688909850915447762856384542090714278516461905872647123125352735037721325154184406043613668806975385533851732090363979459292404685190942209855935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (3,1,'-5140349743195574373979577554212527512597024.162480344833040409158673429491690439298506850052285119390701002577176786023622062742050099464897084793357329597395417632908812044304066963549928478520702505283307379218587635434673128958824348493758429380623577527186462464399974242800361134191519694694139153279582776168995426125926314513926640766117733774558011741611075336271613675760116784769700605008122422944290652448956922432960815546502965310676913079866511016221573557684245901002643719965652152439520727383305120298495304784052489867651462175349450610643411043707261107569691076730261762793560088893354750383257372118118753366377402045596735023445172252225346164608897913115394905485106225627590643805003075069931177395059698550161546962768768895596088478488887530518018212441345360153523733317120037436403475909117998647781920105313938836144009539683'); +INSERT INTO num_exp_div VALUES (3,1,'-707409990019504668223608170643582.082425157530076679823177950190511141917761066423266390864536360056345386873500583953954967225431526056199231768143978526582904071798714789552447782850723926323452633811653766838064983821149041415149067433978085927687765773012158659685363079191901396502099956189371719135315616249471739677995520904113581848295732911534266040260836644379296158092198514963023001686666281725991605685524015227112003429486755206848316731257322742428352116058878710728614841247581716185886403744830796740424927494009978599974431617064012221450054532987372285996679180090592706458366967534834069977644215413076082570497451654516268857039718730203921980307096740864747006176117071983875364434497517026142488015705391255750729200497229031250705777282987863242056223584453312226818451807347197583925624299372040413470456696588043062815'); +INSERT INTO num_exp_add VALUES (3,2,'-60303024366845387174536638750234506721.2758014749274942132576365116182462208228193753118527959000939070820507877345194783035668195137119648748792386548310474079340204536236936213411512867171486174240518914767934028451971067161683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,2,'-60301034611793381560791130065937008239.1887410058901624055165373281235236307966057696953851292799409809571799686645246659986351515277852800926805119259053513475211488115663286642009614039264484259692394657121785950542874788161683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,2,'59993133911282372667149627097418449223835595194300848703012380022306762.154418449236691515146061305380465061074531890529497774836941002526095632166401249277270674802626154774328055399254982998368191676630276960361274433270795772477146870294928855773172789856196219950097157391050424577381777627004101100872747943673762087675405200265837631665464736842180920496158545887039337399558993437594084473932658319914390365451919627956823980800124880375978662052111797881386060353490432427832058851094210488804887183034572364751639107535041308434932952695103493677600969712634416241541391613699710826602011076372592299807609658979777598672141389319098817824624950794758296679318319299142035'); +INSERT INTO num_exp_div VALUES (3,2,'60612.515523995516156897729403721504966784736064970538891936016753206905080265887046037910122269129293912171105589512464185386239562077778499936203155976336284324712221812806801062157592930664021782540155687632208890794166119782594464410498356083266087045927038416810562596141871858142749062925965665039981381277808608946877852933015970874447235220989360704166270479475802673572039541121473138382812420076284458769543418652217394352637294823914346726065145538710933281768776286965107974980550163605068693568717671571780028113969794125200592691656568731359981803586296135840575095063824258761205175762907549288801963550628589530419118771779395037240198270853609924445368393952404606326559485235840170339343865253618184271158932135392539396160392488927771488269959497352568205940636180870805982484030168838833607478593'); +INSERT INTO num_exp_add VALUES (3,3,'-120604058978638768735327768816171514960.4645424808176566187741738397417698516194251450072379251800348880392307563990441443022019710414972449675597505807363987554551692651900222855421126906435970433932913571889719978994845855323367077258946341408053951573026251685351209154467743141259617399607044800077950793001538324616896138171819510046467177021260834130168590102540438924579570947287892808562845032715007493401411940720339239705810106866471452994584812284665666'); +INSERT INTO num_exp_sub VALUES (3,3,'0'); +INSERT INTO num_exp_mul VALUES (3,3,'3636334760530744652235488357607657374520053530993537920755375319352615385278.023608692512217812784472508939511216316773023870624171279878340621219698109986095090336065266376220109007718694455520948311677863167090936408887147442375455695868593092154861636486745490748828207939155392396090682312136290864359484540126174821846208064763823279315343506148025281475729723686566174395516982893064510403581479746673749128344955124070957545815390178764940816628194640888255387443237798761377617383817511745005525149990207764725040109364671749403389999498572538135588695345112358160274671918953118753964073105250116426665508214894805722798842017943220605600452911496071424281587802689830031742105619630787641205011894680546049982654601956546154572720177337696285354350903475239411654436042931409507429892682706228354459580412759920815932840348933425754970917910500027837428631661182510071352138858'); +INSERT INTO num_exp_div VALUES (3,3,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (3,4,'-60302029489314054989387940744763542234.98295358053252401308872309802346144227050959966671157134780970446370197110016237152333448347415674483796371931316021552756816073493808344537122580089676304958104270609762310229182150728136567294798680824019082599362332377530165818229609055765904048195574142709698758095302560470195171027219786996322461803443213101532716728918363951912367135900414238535625075942525108530051828834829820554490477645701692374399416239080329365045332525699055300921341010989742896430768506909949340276549373661076950964959025967328861569387160956730002517417236732463510495205173523163676450203614971844583064927040066684531931069310935516821795449174271052747559395296525950219449541557191520903507653089998307641491381797101485104546410643'); +INSERT INTO num_exp_sub VALUES (3,4,'-60302029489324713745939828071407972725.48158890028513260568545074171830840934891554534052635383222518357552878529888177277886748756734050012959603126757618322788700853025193884017088688974683399381224865109134889560766307825097103477790782590061456916367930139323346273315068375646692125800496305291080749834712822775973790354498408104142209966769395239768969172107040437333428573572464689550003374384624966403962290572373571842567623422963022155546431883766327294954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (3,4,'-321372325955692885069615337209737469749246561535004445508427591.072860243358366933071485495726715620133686420023451450292996945184959542770492705998350644739298629407567812798540119555932604687814429669592481327761428042980782672136901602006622227365754036664912989085940235439697789102358431343119457114603363936544931303133371137532006899162833369543279729021228901466728220729625107362063321334489394782322741444425117731922691457341543446841167138481424319752111748042440994701571955325673470021626946676976482516292402239416632497972073915818846704053624707839813514171497746804751780741682011937606462260710753056669269928580460921188286249923152921382198282201761171043384698319895970192114563900025573490442674225227682235790590616707857188385274186584856872573669591460447105688151281208238908470285147895678001948902280493477604361481216667716971590499226735103039'); +INSERT INTO num_exp_div VALUES (3,4,'-11315021446594.877643290091276308982961654569173523687151347727612592478433578066762912541361898899908505997444632820107356713116459078630334224890355872486337973552333755378190316811715776951317058334754704988120078733912131691682869448731717816749620336196719541702138949084375907248656748314375183301372633028246109596775255074617515860012417935744433243071057057560464360663978361945666099558526069794464437818864063206829678640156992474597480916575712563493776637239091589972373682399519931569163592317107392231951775499293572134702843085474656152913351183535194499521618027894129537558509428098859715020703897463518891082573242502356303078754574312965093639182648263511466558336912294702019648266054331227425119096294871153811412169351624751542166779635702042223762951850816568617453355571302500885410532963789364822647'); +INSERT INTO num_exp_add VALUES (3,5,'-60302029489319384367663884408738513110.66683195868931664491302527038538338065260819361151478340212147889934633981101279593065290940544218360883531149731823374304151252289014494378769385157204705433009477214625880056478643611622410268943757215673170753460135411513114716313801477916713433956086133878890802448531292334570886746283905390661877220497842493537338035961123751393889400517474762491881277080205381424363695095196058838349029211365212855028824622924678684631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (3,5,'-60302029489319384367663884407433001849.79771052212833997386114856935638647096681695139572314177791340913988441658803134837154906163605506135872443908341816501241365674229987734175441883907154998906319658504271319733469814941611260503645706198407368762270127105340397375230875953495882740039984314121888705481484090911598074635434289709802794549714765847764347865064280637851906308955404165593747173246944693509650424312007333558709071857299501674917023499921977975368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (3,5,'39362489275784146262776411377472433635883331946.794473520543457442955620133347015506556162839462623905489255080102447195050109095701660164272430316804466254467810714209179752718730906325952685817112992943656292503112803950215110778476301809440329937774061163668461957943313261962261081942055908935814323069621279128270849852239727888939033546870208376394878842958202403235309372240005941467570230067124830916866857395233038346727879951123599893174252558078732888910139309038957525961212820831321973219557165558911222848692996406741318948607549825343491479728117062814094258484536263158005174429922237853707635743736923521032098496725445243775790161216159399180889906705265012270270348146530113428221072591696851818281866095288773371414866822270689959827332258348570976075184933893434327278299820594014788148344260948638847457822697682605612771344335201258128'); +INSERT INTO num_exp_div VALUES (3,5,'92380711368470856513514428781.033155715252174277753317877861994356621252232374386687048394529670637693505779282500567256835271428113529026462111032257747830329068594622091282098767000694818101994264352932243278144124687156236926607422077479412495979777588932692081795130282128890441931602671468684153168580234070246201722180460130467506344034452687371838907269162119534950946217165384250603250357360223255177692065141037447374172264943732616165429783010079281851748804739433821308362193703012671569249508710820679009084891198169587484117171861141580870066764275087111843275285564262902405980617569581840831518012986031156042600391943605532635833608358301306456966765206853910579231447150839538731157206153540873916893579943906851149770881336811951119112558311734171557608362620988555075663589827484854016702489324791126228380209309587206299'); +INSERT INTO num_exp_add VALUES (3,6,'-60302029489319384367663884408085757480.1853341682137571584926062805631087054017160819890685789064777236456590745415460695320768374693076860837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,6,'-60302029489319384367663884408085757480.2792083126038994602815675591786611462177090630181693462735571643935716818574980747701251335721895588837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,6,'-2830400711649493468815157129316992649.40542786074520931471973065281957756940496588853021620372179463538053123396140685749478530925306163968207226329985017644835203709485594362663495728106061878665324856417118064730721101615473194292620972173690618491026470353143141125614124440035267592258385099934706896692953497971326605145704135723011753705907329979207428661473172503098296622281647255008204864404416199384701720347319806375450632245634238172654086373193251877533131784268854289406126119630708578053354762596511353053106459297339360827562281168219966099848212'); +INSERT INTO num_exp_div VALUES (3,6,'-1284742031601444539630782308463065726620.121021225455596762466053504195700643301310745151565435123335541550963124666304408503436412726848834604336377169205828654564329888653766451656774534718709065521243637375270687684572524302099749018591530352756390467862377335526634920857924031482455373589053524922608255779040656019538392173139295812160325688504210040741075388404155144782519528791757450256668977268409265390016721724966592135644698341754332845002439113523127047593325646484654291494607100188094186116001064043796216982681807318598789324900462932294782971663150070521334398542559480877366424630693734132836518604260869235580641521264976411493166969530737254118968281271908306432918913600567757535151861421384835424322504855607676315840963696944683182767935565256136130185809101891760917733694553800748568697830680328155128016670099315391685422333'); +INSERT INTO num_exp_add VALUES (3,7,'-60302029489319384368482818948157603222.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,7,'-60302029489319384366844949868013911738.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,7,'49383414785234649002982046297226894664526726187218771083.0993243619030008310875293647868815940421844461627295157812843657782639833900543200310573708100000958929315945039020410482966753145208427035917753919085618457760620513481628641658765820294863970581642745379331727722585319163262763708386199720411053619449096019862596221607526610103408936214184850115071874430846697061554769773328338028749631552202705583855831155461651414320570061181212214810086436100771547030013079997847086'); +INSERT INTO num_exp_div VALUES (3,7,'73634737013325927185.787791148221519354461791539553527545166847382784629235192342551464898036004011575416717008403527685470842765455409054592207142526523023201841973047779202013398235864494503216973882479116841765663948294836180515686647139678530220909072497288527276378202532400736141014848907023234659020093073127450778982904578906877634654521825977382116752537063128793631412296206704078569268566614023846282524151679028060869175439188773864994186109445961525301841201265289707928211114515861536069733921800160245586536759625418951427346236213019358749196674633237197452976517130405065120577692737021174118093373953642724512531935525024447977867020930500433287279183436509990047372809400167546185096048971157700858970777301410692908939206693154161335335755844997198191427289546263182822280127912118140820265025555165337881999926'); +INSERT INTO num_exp_add VALUES (3,8,'-60302029489319384367663884399588771256.5916339968771732477072012126949734214868901845505193155307646111690097978112797961939995859130827784737422228762767014427842766445950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,8,'-60302029489319384367663884416582743703.8729084839404833710669726270467964301325349604567186096492702768702209585877643481082023851284144664938175277044596973126708926205950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,8,'-512385513828318260570283740065493064477880918352.732624553690077857674083796435724202494963885926573907185100543184828131859183999195040110586155435203949963570735841632689374488877298209082579317039061893012560130258753218955057387206477423088065663401594359617882154814262843273526859406265633827109554791772242178864873774889091687515990672487380368975556580539271333144212685871370972163560839446696514092637412587953506052848750866803569213269271165856310101244342151576488190595936869490659700946174362872797854591188391982770203203644172999264143929484089237665313698600170041324566984832357000400'); +INSERT INTO num_exp_div VALUES (3,8,'-7096872691348467943606706217.907270287823269424282176534343841939501231816905820949045946136373255017076943323578903040918266385724756894003692978391468202345397178445216069294845721607024056189567609414049207292919519881725733381453217071918292453682942046440563446278374996563501512335133749731529362537349288419883140401056747081065947774593869673146309163791076953204291951821124894409171722911526435445719071769008713367057971351892550570642991097981458696464929009464411568672010548002196406312721789582428747564855324072212842315229302959908665089850886951261233852165624100634055045684536311382452553544676139507899503993644452161529145849579200003677255968757773363970434791501820320494192909660871475590637419913907191608957830524390049664686282439567943053924245852983990958276537000732363895444894582579142752920882750130052682'); +INSERT INTO num_exp_add VALUES (3,9,'-60302029489319384367663884408030893999.8854209703537480818248540990234567956069965340942024890856088355839135538265116174644003927269495876835324407641642359213535695803871472434650475144516723617632059130297610134243891145006222068960999879308472500422640481972089756410157246974765071949782242392661524488959954348903412713930092273629207697480131360047867213863018127928853922173643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (3,9,'-60302029489319384367663884408140620960.5791215104639085369493197407183130560124286109130354360944260524553172025725325268378015783145476572840273098165721628341015996848028750420770651761919246816300854441592109844750954710317145008297946462099581451150385769713261452744310496166494545449824802407416426304041583975713483424241727236417259479541129474082301376239522310995725648773643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (3,9,'-3308379209762459471107480259839508279070920437.883503980178028214343751083865562028455061662673132221930429904398963590401793045470444301883103141901787466923883803951815572606105617157736442670792467625964359169270739534412932791178258858918086886061702512427989129732248215348301444245772127142869263635282888226326427510486246184233225114523636171202034558843515894542952126988613018789833835507734620046994907453602573865012044120483116345444810078666601100257620969379968264504287700045822481492526688635364586344704730579892342786173395802035361824932075736340405960099542224953439044947229246847140957298841482874444906129049023002897135347878048572628834749795298712449864571996898774444932083319581439741625832405434317985988163261591679157437224404970927012111196724239860528859217322132733404472897289'); +INSERT INTO num_exp_div VALUES (3,9,'-1099128766678422054524173986658.839339966689456265703816212189145237878729886466041806078542573981227645802109969871638687985985845489422516004202630099080709709893022100481258818112345013009059633421290241583864468453396484606925071369550998772875840640325758308835852391176503689677263605949075815552026731067384737231681068134099746550363063940273625924224721503126912810251607546172009765059506591787282558727077669973711491157840340631805422942099954647016059576777054339588421998882440726473698513560202030309804089250300097589174314677765341104767702983421063649104691583044460507666600260994707192787133590502137391691330098102374713996115782701417107878938473243874299874872852713499024851414757892169376458916467621226859152075901273014182163212783658933754507272478777304254191033562324994395916168496097385872331012258027431094381'); +INSERT INTO num_exp_add VALUES (4,0,'5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,0,'5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,0,'0'); +INSERT INTO num_exp_div VALUES (4,0,'NaN'); +INSERT INTO num_exp_add VALUES (4,1,'5329378275943663322300488.64471790965256505869684245785528331091076155554650629138833809683459634328609777839510066435612911583108717191216693735823717997111970662575497378762952496582183738308720094529950793570383580785385569873278068217936841324404119828637880370718028782103860007754579779716996004352284614661690063919125301052941328989181561787543541920734755989452320799185700078241880935083616978140555713297241612718277766918005268951861880490889884082730841740604517529391011862694381726143520658746305661338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,1,'5329378275943663322130001.85391741010004353389988518583956365616764439012730849109607738227723047091262162286043233973705463946054514004224903034208166782419414876904468730122054597840936856190652484801633363526576955397606531892764306099068756437389060626447578949162759295501062154826802212022414257953494004665588557188694447110384853149054690655645134564686305448219729651828678220200218922790293483596988037990835533058983562863141746692824117439019450865871047657552800448629502344444081260036580660700595591338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,1,'454294299613767152878025320780.534199313974295807138790763501115780294529340799108297697573066187975311338382917022391830256203305238757334106943821060545424417350991354829668286194840925251162479496893943917530660694097932059166013476064988623431110002057735318529554555260199417935495388243829261809007709919225000608711536928171687251088217591210419208480251102484043683131687013687838713055660405381318396419588727500715930145098362997142075433472039319292466570912777345841400769387321465602989947078951135489852486382469990409873227894248208197179481868230244584527040573428134962626267135732247029762468417273891700661832893497067151409134724061246612631376075173287264787886064622106855886785805818642123776489793586531950438285720668411465570116161790343538663297713926678759640594912243360541590368666922379919514826022141331900181'); +INSERT INTO num_exp_div VALUES (4,1,'62519544780217042176.800424689664850775296526267109332647921183817056683200043718160298562843864918741523494444361916531159341418970534833628106062976341639276761669219281771109561175175033739624472497927501467465456946098280878993371659461957361369508794842102784763955539708800574418468150309301129490186416766691183270872711413796386178009615777589066235359283212636467980113350635181915492452697347977967985810294150853782607014649150457138118264698071689065469752702524632313088938504181640435324554007553994564705401249228914199354821595855823113730697333390936834057091883654016371107974899726642500486005445063301647520527084320363513388355471718583708935211830796440056542408492723718088396437530207347815505844074508948817594746824098278470533148171941442049323578854023683167934569551595335539887777638716651319134577441'); +INSERT INTO num_exp_add VALUES (4,2,'-994877520673428596810678826533995.79421257464236160757218576989993781147390382997132644206786872350652200243563770552469933194637146474528320738725486418004701192337175478117026439697031462361180324038544450723753402846519731908503949116978812841497201119103409772457270340059605961197538918709309004130294868847110690336360689446090125918336908930881873778405661757289469281163974774492810850778950071063044769131228124355961427111369335109426492177657001035045332525699055300921341010989742896430768506909949340276549373661076950964959025967328861569387160956730002517417236732463510495205173523163676450203614971844583064927040066684531931069310935516821795449174271052747559395296525950219449541557191520903507653089998307641491381797101485104546410643'); +INSERT INTO num_exp_sub VALUES (4,2,'994877531332185148698005470964486.29284789439497020016891341359478477855230977564514122455228420261834881663435710678023233603955522003691551934167083188036585971868561017596992548582038556784300918537917030055337559943480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,2,'-5302078674303935968062773235453828254014583744527466365136.236414807326868572353809920518232561005161225922028750078608989965741402418802255050636954800114792425419735155504035469350521800895164087027043476055514245942961100610551646034472084954313670284875310691807937254054948742125729353864014122131419164449567115006621212424805182687707372956385102095255735458593389920872596796806885847543910224476727171570873698525606016990229936284811067826588349092841322512643043008589065847223683467371925773023109720951609815041012521485326120380123169545818055967455575736140138663815073081494226676896278654189873597341203197903408668523514375373841493189836809506003729379742035629498519683885268256481104619815130659628225053833297766479068686119691010593208135616363994230674606991733148502293102108193522604968743948323130517040609601859735899914987426089053869350663'); +INSERT INTO num_exp_div VALUES (4,2,'-.000000005356818439105666775800262590702859770599410113087721172791624002387236505438218124867814437523686300450045582100868990117124343222534568799037421944272316277130975314766456260710406160143182498931595199129228915695802952695510723443157825968340043198200740606202264287904755124946591110599335909404657109057432686191440989434662797205973563889238804413861126260401987949920244286377128599413927273444061572120561496904543200956508673923547626768641271397088562966176629018606103663605145666976048261236691866387601532424530473754175270500777679603569715192364542901360534980926452487443629100484491344001509360344122933911316486556042277769848194790964257060927912344609376571637126617813506411190014141992988288983968823792971270853369317867326071952900448455162898476163801382836761898292684175721846'); +INSERT INTO num_exp_add VALUES (4,3,'-60302029489314054989387940744763542234.98295358053252401308872309802346144227050959966671157134780970446370197110016237152333448347415674483796371931316021552756816073493808344537122580089676304958104270609762310229182150728136567294798680824019082599362332377530165818229609055765904048195574142709698758095302560470195171027219786996322461803443213101532716728918363951912367135900414238535625075942525108530051828834829820554490477645701692374399416239080329365045332525699055300921341010989742896430768506909949340276549373661076950964959025967328861569387160956730002517417236732463510495205173523163676450203614971844583064927040066684531931069310935516821795449174271052747559395296525950219449541557191520903507653089998307641491381797101485104546410643'); +INSERT INTO num_exp_sub VALUES (4,3,'60302029489324713745939828071407972725.48158890028513260568545074171830840934891554534052635383222518357552878529888177277886748756734050012959603126757618322788700853025193884017088688974683399381224865109134889560766307825097103477790782590061456916367930139323346273315068375646692125800496305291080749834712822775973790354498408104142209966769395239768969172107040437333428573572464689550003374384624966403962290572373571842567623422963022155546431883766327294954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,3,'-321372325955692885069615337209737469749246561535004445508427591.072860243358366933071485495726715620133686420023451450292996945184959542770492705998350644739298629407567812798540119555932604687814429669592481327761428042980782672136901602006622227365754036664912989085940235439697789102358431343119457114603363936544931303133371137532006899162833369543279729021228901466728220729625107362063321334489394782322741444425117731922691457341543446841167138481424319752111748042440994701571955325673470021626946676976482516292402239416632497972073915818846704053624707839813514171497746804751780741682011937606462260710753056669269928580460921188286249923152921382198282201761171043384698319895970192114563900025573490442674225227682235790590616707857188385274186584856872573669591460447105688151281208238908470285147895678001948902280493477604361481216667716971590499226735103039'); +INSERT INTO num_exp_div VALUES (4,3,'-.000000000000088378091435340426596348183959201660680284222502095357746364378698792730669202270228092348823133529449019715406417264278615046537007844589547485282959556860316942508808911542109265489435572674031608663747132688980867386885961271358592278360097086532747883342438036287136994589308551796702164612609710942175900921197001888540314760352113821737014875886635147123114456910985089625906448913621495025509697742196814421833448856595853403450682101743559369637786458968714240975228615283970739279506239628546165569688434254286341567486905374255702980370754235630955328837646999003123103831262789115646588779721625156078607919060762857866951417867378220773543985422722165221371084387943737083254760594128718841665355053236168688218864433967871311858292181233490194833547273501436630325295640020916257836404'); +INSERT INTO num_exp_add VALUES (4,4,'10658756551887326644430490.49863531975260859259672764369484696707840594567381478248441547911182681419871940125553300409318375529163231195441596770031884779531385539479966108885007094423120594499372579331584157096960536182992101766042374317005597761793180455085459319880788077604922162581381991739410262305778619327278621107819748163326182138236252443188676485421061437672050451014378298442099857873910461737543751288077145777261329781147015644685997929909334948601889398157317978020514207138462986180101319446901252677846098070081948065342276861225678086539994965165526535072979009589652953672647099592770056310833870145919866630936137861378128966356409101651457894504881209406948099561100916885616958192984693820003384717017236405797029790907178714'); +INSERT INTO num_exp_sub VALUES (4,4,'0'); +INSERT INTO num_exp_mul VALUES (4,4,'28402272808100253242547006276715304015308580784958.804614276533085644370816876160290159450291717634111299841065255625515058118012211808741402904995080624675460593676923639082981788732031193774047612589113654423166826140872334380708795266307037944059108148612979119729408762532396036043629484049508789880964586236575769826806092391573178899640321403656891487586452524427223891405519836671312830183895761747460911777623703557946796784873885800089025388390522992806365773290733075927321101736155663727528284512100509273076328103465333687228713897893434161293693971954442699482857938492961830350598789444266860160794913830991304996676299650460125000959751177037694425217989910261807246272771711816326991282202653917488360776928533800529297474279497910326579608191975246060946079639658615178160271122713225105861574160788280907842327681375920919676063500116492292319'); +INSERT INTO num_exp_div VALUES (4,4,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (4,5,'5329378275943662669459614.81475694159581596077242547133292502869630735172901157043010370467618244548786897684821457816189831652076071977025794948484549600736179389638319303817478693948215387894509009504287664213474693208847025374388286162907794727810231557001266897729978691844410171412189947386181530441402903608214502713480332746271552746231631136145916685939539173054989927058122097304419584979598595477177513004218594211597809300517607260841648610322863666300637648662611916496850248528515936635845594390453288113296413254893687029540384176335735114863908372780241463999450547422213639667099644505472777149095004849805371205203850993689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,5,'5329378275943663974970875.68387837815679263182430217236192193838209859394480321205431177443564436871085042440731842593128543877087159218415801821547335178795206149841646805067528400474905206604863569827296492883485842974145076391654088154097803033982948898084192422150809385760511991169192044353228731864375715719064118394339415417054629392004621307042759799481522264617060523956256201137680272894311866260366238283858551565663520480629408383844349319586471282301251749494706061523663958609947049544255725056447964564549684815188261035801892684889942971676086592385285071073528462167439314005547455087297279161738865296114495425732286867689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,5,'-3478781676337858247983014311182511.567538638808357215203593479841446379226774481291286361639429856698999485760647422501864626078375852610019829111004807806660731243672830787729048847342063218718651165150612717759770504648306347926061960607388621011846314969634048226452709389995594961695723139571002939804473057725442880410434039783304583526414509590532906062732322732569475349107437896717416548237633532805602064623969799081086996320156575550896200848758685986331692388099427314008504506503745527468550106879602399030419569897808150076298414568875477195447656904373310322813412927463518325927626891046356679526447117311923853482118502868148386882363449163182892615259995945992014431502761210899772725227648729095696228388558331052524469604046072203605897109629560683446827492904111565278516043939137760721315953500281379039771826554155511347152'); +INSERT INTO num_exp_div VALUES (4,5,'-8164430956184510.184223536017248184022252663660196916321116266103608317725855237211273642694947892658721606226082017525816544904635887836163201565923338826779819876742736219975639586566502584026349778499211535661173597356253186281116862244165796632756909578140184577853088376334255860281874385669242675881761388233070861374295536603371778669602656670852115614651462552069294889723058758969660566508798011830996965570446030123780674316363670374970480994905368006454513642480180066435609577311074332150098288374616437489163254821095377348025470309665651059603665062887597814064136313866690824972464351274062540825405003954064175728198182815347642172934453828192850870808373638597839434504241236228591053696481146252072190903430582534862988719805163692697482513169856291048966811374872266165034373412719593685881972700171726777938'); +INSERT INTO num_exp_add VALUES (4,6,'5329378275943663322215245.29625473207137544719284446115519970394719946335145777492574745992986971075733570324679065009803281404581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,6,'5329378275943663322215245.20238058768123314540388318253964726313120648232235700755866801918195710344138369800874235399515094124581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,6,'250145412892811547138949.592621291590152419206270097656346630226508074074623894951308487425470437268130465956063593951784820669318897182831355375451719125809800516979013437732298382708070979871283132689492336823087794373113039154669229889503700598930220858275174342776478898670277868700384853696009897221747924643343353942154528501454689084608965009561564638167714973711022212547096732831847202912862290958304510651828842182545311077713664465815992616213663619529378061133917572474298028065850515876361609671565914027186063801852554353160801534696062207299890867876199323530337336273950892723090754719547285920090419070001019943385293110663922226230169381423410428577990604776655422105400452217085311617728003688836185608912367677734364834577573255789160419371322775733777518997638403409000055707558465286469808848200141192627396502735'); +INSERT INTO num_exp_div VALUES (4,6,'113543048739697485358574290.758354267447744932153707340542459183720907885610125346262898114677742971240785031722334497858930434531517077525413654346644836353208132641713415396062580605566225794048569430676355036264762949452090151450855446984773994337170590068740235544320694721909983307239491151139099779296496785240814600627140543144068640768857707110930453204162312973998304574796413938461971472337040811785231390930046688391955000749644938061585377150632133417156866197053052425576957646564943278156977176976876921235395711611898108821587442609611001702344783440618040704066809035404237786023075676374788819144406909313755996914145273176359246052899650387182222905558751208368173052381982668563471143298720677965028880626152749773712037769548408324298835212547215352657271696665387200792785056233953536347605130973626194099064678842085'); +INSERT INTO num_exp_add VALUES (4,7,'5329377457009123250369503.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,7,'5329379094878203394060987.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,7,'-4364411947278810125327066890819882483326918.05664098958260550284395870948992407314161088028674246708928421994893923699743452802989464864039994566042797942433140378990308345483670828497915478397481687305406460330009319949623844175096007381662809083363069100235985794575399268709260901964834244796150883807308976949196661411035264619638771824190014274817662519438658481432363824187693821267613212631153175155634316128036152465184903927860719447693468054624663668062006049759837326188252927823612718163916100588143128358998656306593393889422386501730237442526450419990376323903182669190482615734972147533221144682538647497701130447816148459762464395194383090936159579764712919396391813914821973715879062992249315474841639591907249142779103650773383644785606333916967894'); +INSERT INTO num_exp_div VALUES (4,7,'-6507697.520580964829176145824902679560705744817573189143227837387224410616222039115571544850095278317993922427931439719549137387753697989249394347047436951117850128104928719365703899136632100669607126357491484781141296021264049762417528697619931558728863308905257358126654378784709213859234056696519305650316810797382293500878834933984458810656133463638442959750083607649924453935287420620424368291770694630751828333903156364366745210911640207075765008558904788350844410055253643515389003711759818446776538393914018427075074171758415188027562645239606914126802490579848138218395145734902830046359100742374008993296019987093605275289913663224324033923096998194326249508491872193747944673057257521552387923218450155737056841633810711295424578984452176016198348344913655301417872189073133147510027427530833694019910340299'); +INSERT INTO num_exp_add VALUES (4,8,'5329378275943671819201468.88995490340795935797824952902333498786202536079000703830146057240651898748760197658486790165425772165585380839129948178510273188565692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,8,'5329378275943654825229021.60868041634464923461847811467151197921638058488380774418295490670530782671111742467066510243892603363577850356311648591521611590965692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,8,'45283653791262997781451381354094822.762732909505051438036873220502792213670540454778361182993875916509061144859281577740137081988678361247725064336120451090222456518107029158304937620179032477664627949959143233370320432203497828243297406462513350790251761540074946469824444452248386782451723637769289822576372357189700319768797708375563651655860093365309717823602754924352327588945034832436331911584742966378275504545736896430718939807674966738116698454215555860047859161126694019895490767779791933882712567492115664113775047192011252893773389940988533801360010782816196288710063568554147458866942816721046004257953642508395867837127678980002737669139369781058046396738606563716339660654364541530532834806205571191828994250708412638796240377704994928921528330863683630622922959130920715261879547446054261914770022377059156125037157979236658010950'); +INSERT INTO num_exp_div VALUES (4,8,'627208063620965.397582272040628872773601055303353339700043792111288801181637510303989399395425313995651311362368773096988861977687484912995632130587762386590996099363383976320342247076516604162469063709298438133327434461462906199160715395064249299615054970359309619951777972710299484596875999967582794277241285253106817446259313281064844416249524876385699646393555435017820686376877981018047574348711991428666249794623006175739581915209218834701034964043360823844816042368184094857692062884223864639972005010863342567608351008172649209459933114800143792514183138995700133608613158857147417653998048890116531052767737435620558349226865105888201598712435680481803901906613772821370519525404423549161696526405320391828194356063547089626322474164332505209233143121068245585662919687001395119229263995765376465304715643388771609446'); +INSERT INTO num_exp_add VALUES (4,9,'5329378275943663377078725.59616792993138452386059664269485161374191901124632386474661634799161523147237015531446709484039091244606359050341194730653343894986479159670583937529516163204904273806158788218327396375034882788180783796976731912141525319602448709213495905899041406302673881364465504945113279286939663215197485367850132991968081639290297033476859158044889351836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (4,9,'5329378275943663267351764.90246738982122406873613100099999535333648693442749091773779913112021158272634924594106590925279284284556872145100402039378540884544906379809382171355490931218216320693213791113256760721925653394811317969065642404864072442190731745871963413981746671302248281216916486794296983018838956112081135739969615171358100498945955409711817327376172085836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (4,9,'292388240303165948041827159734686.255558469787242316676287235194652580157149226950109397295920730296960145548003120827363226435916209781396711693581454960342091452830648929118261388933297036933167543189308061917640517578583521401267417187854611829815212778183983326568586118831109538377828156118900313778053576483381085207892754728937946691892849474364477434665960112125254104966566712906532318984871145605839506991591027939136026602051635433295687547552796828217859648186757719639965988287173297286034098497871707197092627676226053609131138590878743560287292934815277894463305001278326023708395571840850120055316276256138004565442099731931051413153564744766098053176049414330146267604802971221161572130161432525297614616942172815141372973870720928125699420370428856022295499447755488148545048400795053604349570217878099721865670458104653570360'); +INSERT INTO num_exp_div VALUES (4,9,'97138902640718538.241246716463110895614166618530828908023040947887095196830690221211560526562522274118188963051412359798837957512805692731972838989047910709158995922699598619854907969493232150042212406549916252602794415099066259707018021422154933830674786488990033885447289593742424717170197810316367637885248684134204152352748803532396210051700193575105804898183523770153431536054848843504020390623875664696278263569145547515663340450903772852615789980257449146000410036925975898331113013857953289990299253584950458042598491897496393582249411290555264437893099880371008957017323366523688894303458743415715114628052487518110654201696604914159777300997374156315186315524817636714210119873791848535246674326877611945112249137224923201544452904111118569299934059002046318394345055859769572070097973298522564724884895879226870720839'); +INSERT INTO num_exp_add VALUES (5,0,'-652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,0,'-652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,0,'0'); +INSERT INTO num_exp_div VALUES (5,0,'NaN'); +INSERT INTO num_exp_add VALUES (5,1,'-652670387.03916046850422757312745971450663862747133703839829692066597367760104802542475264601221776157515632293978442027199108085723617181683235487266149426304575903892721468296143475297345699313102262188759506518376019936160961709578829069446312051432780603656651983414612264636232727512091101057374054475214114364113300402823059519499217878746766275164739724770556122895799337810694888119810524986616938847385753562624139431982468828696587199570410008890188532132652095915565323400735066310142303225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,1,'-652840873.82996096805674909792441698652235828221445420381749472095823439215841389779822880154688608619423079931032645214190898787339168396375791272937178074945473802633968350414211085025663129356908887576538544498889782055029046596593888271636613472988050090259449836342389832330814473910881711053475561205644968306669776242949930651397625234795216816397330872127577980937461350104018382663378200293023018506679957617487661691020231880567020416430204091941905612894161614165865789507675064355852373225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,1,'-55643106304872.575994253221940844841058071061962511162776681458310912066379595519265546225338405882027547140476045378015935579066580347282075024392379464189067155567624835346798806677988850250198082355055954078446421075165109896091047534711081616362392995575466807084807876544560268050611445006601394735810211678919646667455478469014906335433468365011768049600750224822391684377238242162320161552720449713229523135506671063115436813348612986916614320012995541575293478341408982118538094438068036422562665160411591652618670802973618768526197813319204816293073794413317669922144705633308090832805914096147659820167569140291210526520361556881576175809360614782817717579318298657744021133210954279487777567785280633309576696708168342539425395482429923273623865667723482418178781573723597156804085501875735112311466228778929147929'); +INSERT INTO num_exp_div VALUES (5,1,'-7657.550797567691019915353529993301413746369700087741672762343206271266232635965032053368224472333368713006346867984576168784127503674579531243603836945595880917241997606783133673324236134063757452734295148763280059050480246827193380861494669624151921824660313516974440913733511526807313019192263170823268678149435664224184903925632177789052038092611394447709922076676981043877747276056677801802695466205531230350209787298926245402046182150996849906836743231861317120171583577624262765589605263477198809166390259128339127005924586833372241946051704497188891325715185091060185547236923494393813210904033520844572880475265306843414506359253445517738473745552980984097762509546161690823646176501838559393690565709795724159196133663168004773260451322595899506776323262195323943138344537866088159583331807728944620284996'); +INSERT INTO num_exp_add VALUES (5,2,'-994877526002806872754342801504871.47809095279915423939648794226185974985600242391612965412218049794216637114648812993201775787765690351615479957141288239552036371132381627958673244764559862836085530643408020551049895730005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,2,'994877526002806872754341495993610.60896951623817756834461124123286284017021118170033801249797242818270444792350668237291391010826978126604392715751281366489250793073354867755345743514510156309395711933053460228041067059994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (5,2,'649411906691138274293985410502516861224852.2323455192714410716272307781034189160865613770320102043319541634113746032638191509585045862973333645830298922352816245477556264222094036953195419857712804755170632292914187367964994214922001758104594052499795564860466055599417895782179851297585155129541589802249540436678824225950907268084876110445460948679383611117263673106597132046331719468816839434908155684738864149955129235751738204036443603521478609787295079710078973503970964790273461142497259987849074597264522099648376356902360358310245001183020992360260836105404118742418040965190000718736837422434593694808973939805954329718232693154128543253581495885789333274488461716809104532693754070810202831113003978085636579574171344721710232931261731022478029314435363413498991740750878099825781577297965642009156858479681236085226911858782115'); +INSERT INTO num_exp_div VALUES (5,2,'.000000000000000000000000656116570506105776235076334177868550033347254561166417969910286926369599900073757929714260350320362090452092025380232792749476245042480546813848702351830607516880397305138543526307608094143028291193163613755680419049060162928958489964834941920423432354996040147818253087783193280640282263490705632002572757216731766513434035163528102590524432221718194164133959630768718395847710529339782880381264265894322494716854757290930538739000043383104085867828258790010654331660516512156519838978751447311068903958136482041673109857552178367614498426226323001399275980281507353231821022591045797658991388304873240910526149138339658220844723880158150606035181559877351791752701872877147074033569061408920725522180134133183999181370354585872214368766629114773129541658653693832843354053701079334077'); +INSERT INTO num_exp_add VALUES (5,3,'-60302029489319384367663884408738513110.66683195868931664491302527038538338065260819361151478340212147889934633981101279593065290940544218360883531149731823374304151252289014494378769385157204705433009477214625880056478643611622410268943757215673170753460135411513114716313801477916713433956086133878890802448531292334570886746283905390661877220497842493537338035961123751393889400517474762491881277080205381424363695095196058838349029211365212855028824622924678684631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,3,'60302029489319384367663884407433001849.79771052212833997386114856935638647096681695139572314177791340913988441658803134837154906163605506135872443908341816501241365674229987734175441883907154998906319658504271319733469814941611260503645706198407368762270127105340397375230875953495882740039984314121888705481484090911598074635434289709802794549714765847764347865064280637851906308955404165593747173246944693509650424312007333558709071857299501674917023499921977975368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (5,3,'39362489275784146262776411377472433635883331946.794473520543457442955620133347015506556162839462623905489255080102447195050109095701660164272430316804466254467810714209179752718730906325952685817112992943656292503112803950215110778476301809440329937774061163668461957943313261962261081942055908935814323069621279128270849852239727888939033546870208376394878842958202403235309372240005941467570230067124830916866857395233038346727879951123599893174252558078732888910139309038957525961212820831321973219557165558911222848692996406741318948607549825343491479728117062814094258484536263158005174429922237853707635743736923521032098496725445243775790161216159399180889906705265012270270348146530113428221072591696851818281866095288773371414866822270689959827332258348570976075184933893434327278299820594014788148344260948638847457822697682605612771344335201258128'); +INSERT INTO num_exp_div VALUES (5,3,'.000000000000000000000000000010824770508763323320533297369674519056450544793568147911931789010432012750062661590994728968589403602468229106206242395792957238667714358401601098858606386995096923432407249369639633268143022787987190106724545750803196130511146323174462918572423414631798141263222875752767731279138952850500369328934959764805948568471324562210715908420467881411844098258193571194910997918428786213948547748701831331312040839544355427357749520227124858111324859160114175254197992204974033767300989488517391063188153561391320190653403747521648794370679322504188364455328709488846777004202196382575648619395139553279192346251133156445942281048959845827006761160755031086836046398020850814350246219929303018051720203943879538087954853996826539712240458022307680912400297508925714946398031304516583939283'); +INSERT INTO num_exp_add VALUES (5,4,'5329378275943662669459614.81475694159581596077242547133292502869630735172901157043010370467618244548786897684821457816189831652076071977025794948484549600736179389638319303817478693948215387894509009504287664213474693208847025374388286162907794727810231557001266897729978691844410171412189947386181530441402903608214502713480332746271552746231631136145916685939539173054989927058122097304419584979598595477177513004218594211597809300517607260841648610322863666300637648662611916496850248528515936635845594390453288113296413254893687029540384176335735114863908372780241463999450547422213639667099644505472777149095004849805371205203850993689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (5,4,'-5329378275943663974970875.68387837815679263182430217236192193838209859394480321205431177443564436871085042440731842593128543877087159218415801821547335178795206149841646805067528400474905206604863569827296492883485842974145076391654088154097803033982948898084192422150809385760511991169192044353228731864375715719064118394339415417054629392004621307042759799481522264617060523956256201137680272894311866260366238283858551565663520480629408383844349319586471282301251749494706061523663958609947049544255725056447964564549684815188261035801892684889942971676086592385285071073528462167439314005547455087297279161738865296114495425732286867689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (5,4,'-3478781676337858247983014311182511.567538638808357215203593479841446379226774481291286361639429856698999485760647422501864626078375852610019829111004807806660731243672830787729048847342063218718651165150612717759770504648306347926061960607388621011846314969634048226452709389995594961695723139571002939804473057725442880410434039783304583526414509590532906062732322732569475349107437896717416548237633532805602064623969799081086996320156575550896200848758685986331692388099427314008504506503745527468550106879602399030419569897808150076298414568875477195447656904373310322813412927463518325927626891046356679526447117311923853482118502868148386882363449163182892615259995945992014431502761210899772725227648729095696228388558331052524469604046072203605897109629560683446827492904111565278516043939137760721315953500281379039771826554155511347152'); +INSERT INTO num_exp_div VALUES (5,4,'-.000000000000000122482510461124748279475400009367345900846466958806966807399903713411658400733717078392550780910604704603123670767210550800752620037863340961255721285160854785449315208955654408132775022766783343331151895973970395232686910362226184006990485313002943710214511418310741271074710741339586430026286272098156531835438969774325517509155992092194349661122678547097423264670055720422496527272118788005921590521726691666219504214087867030003203385360001614199656989667055583749577099440092378355805901262289841168751608673297446473709956390142112843400255748161809121986096092991616144443486023218404881798896685413932215981950393130292001833627899480153863300557853617312991880655905907971211246077450786084079040513198340644157868678782195341316027563717617074364438885981635394382733697473265872796207'); +INSERT INTO num_exp_add VALUES (5,5,'-1305511260.86912143656097667105187670102899690968579124221579164162420806975946192322298144755910384776938712225011087241390006873062785578059026760203327501250049706526689818710354560323008828670011149765298051017265801991190008306172717341082925524420830693916101819757002096967047201422972812110849615680859082670783076645772990170896843113541983091562070596898134103833260687914713270783188725279639957354065711180111801123002700709263607616000614100832094145026813710081431112908410130665994676451253271560294574006261508508554207856812178219605043607074077914745225674338447810581824502012643860446309124220528435874'); +INSERT INTO num_exp_sub VALUES (5,5,'0'); +INSERT INTO num_exp_mul VALUES (5,5,'426089913064020811.057708378200224487694731586862745370027417544052374884336177893807736467646454486029424673621605232432043672119510371547153895504456723242262639262542904151307250842477327375961936454637964429999741717244285121019840463692418987118402683746281993192269229200465080358289645050337976214115902915692028162689089167194843185708212911364017271332623359100711545479273675423617018342297822477514128997410642005300368966199980354369928371655155437291469427189561877718971914040675572136507472590254222870537216617260612835805368361975725573009455402822669103118872235140158440342063571894152305875004532651814592458133460160514384171804043127771746596286988679698684698755896736275307574630777027620558428909546664763675431701332632828281070572045822129984625797185173815273651376003614106277727279230096226977335510'); +INSERT INTO num_exp_div VALUES (5,5,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (5,6,'-652755630.38762364608541718463145771120672223443489913059334543712856431450577465795351472116052777583325262472505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,6,'-652755630.48149779047555948642041898982227467525089211162244620449564375525368726526946672639857607193613449752505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,6,'-30638438.151446159804025029882398388155309149089870990062944469684482366692824338098201222171115395923414887930224163525189097571163687285244255335505387733673499447610577050114902372990462064696637481657064525319516004273769831260452832960893174173254560250804003884280384718123289136453955482855362019158401218620018346500189769819687260476334734259702665316562988639223597110627626759216850014150105605927773639897638043177685498804811787888811168524202700283461266793154726325540776914500415140842975457394524215869103737379109516024460317825645645301237375972914247141703084877141866316168268901439172491577729880760950895760711857112463508064820414904611059588717092145484656103798852859978690742216940980929562068'); +INSERT INTO num_exp_div VALUES (5,6,'-13907037655.047994416383638650569341223199042786813441967582376077478024677494832069402897226848055043557486983268019376307288565911231748501636517992289743940159005664424461285010295150828744259113760652210086696250085454819340987566229400805422509198052317518991183515696724846560872057916862620762789778660622787735923967096950195583369113574365386627110408307941105082873469072519133330718161987781080307947247163619814890462416622144825161521790673339279047700672881113718394727610096366361422482794458375587355933614201638489194194834709433413694420512869179976485096875057742460003147602405353823942488343056906912173170809084207937229591627643451380735179767199816663168139837088183577975769442341678933576388936845704303859241320794255052627716474860113993958556604381707826493168941926878481079724185426298004604'); +INSERT INTO num_exp_add VALUES (5,7,'-818934540724601372.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,7,'818934539419090111.56543928171951166447406164948550154515710437889210417918789596512026903838850927622044807611530643887494456379304996563468607210970486619898336249374975146736655090644822719838495585664994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (5,7,'534564131989234694540350103.27821462973515555648644772098605028371173048154132108733819196629002548296868548691993248746628993380136454426833349407578676005545111508293942736555269938962058196496152360848131645787941032968937794930046928523006455386861100809286408671908320322523368135203881520526880998279355848280412933152306299256343179622513731096363088094541514890135766460631462465021694553063366717467560655272004461368865264059368514271105464855575429914212085797297268595943955105608543373940035636033207568676745293499106348500559628723682588033431457023964317090780615020801564861497990103549650624438425421690193862533733474254'); +INSERT INTO num_exp_div VALUES (5,7,'.000000000797079129642393611556079160915147221153735075943759104977169600937534508973732991117540626046659124172765761873705978811124901421049332579161931652390647472911517923131800238903184679028518657818755558526885018755394697157094867449047655737107085020874974955627907737126958129710597811740696534189608639914753884882702680512272194316887744972931453458445314561564591875764930680945589486999586667912816485821717403892703364322658245615895415781719033810595358092343690359557942948213374234065052300866661453767599465059289920067095083062096458980564265691295895672503728815182981118876144075942348853666085714846210822847053889733510154276933759200630639642310562242207518883342516103725757482864105340008709446643820864294556778969997115586027866760708448174502158738150605938364482719960251612464993'); +INSERT INTO num_exp_add VALUES (5,8,'7844230593.20607652525116672615394735666141304947992676684520382624714879797087461877675155217754947572297228288498221620714146356962938009770486619898336249374975146736655090644822719838495585664994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_sub VALUES (5,8,'-9149741854.07519796181214339720582405769040995916571800906099546787135686773033654199973299973665332349235940513509308862104153230025723587829513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,8,'-5546455599206321494.0676583421119904300307105296377723816472192007866147764761501865875232824814135783697976183493106885436876081315217834621720906478074798596116645640251460842350553806256223963023430631066024389364515688765194373161385579258482225808660340732705687558150699172147896486727530192499184101617379930846663835628510376484675411350654979679181852179924386290069790336316958202582966248703889464308649631486542724072047294216362186036638115240070658004553260251510288423749333873893917690832829128021808383128393431810674177390352413548658782609064839524756041501835115152819802758773711821322162752064589750295542985780512921839490040396053737870038534216948323935020460307350020911362024271167085905714873548388570602799432705061561572854498075600'); +INSERT INTO num_exp_div VALUES (5,8,'-.076822018213756690975099471985461347542955923191183223634407380481978143225129486622351714276452369661632980197282261508936298649901018470846144321441236073683990324039849865750139470288565622579952182053792815638469841531577235191276257498209844422440366423136595067535337374223115507557306455001792362506235886189722508617024948653046102060677266555476719102193278190540414934812073355995577639986512222998268934000209944414236509139290657402937840986061987219441410741189615344050459067454369371094189930607834375561948483494321255500497786795636801854613881105643003358210407867114145806225724880370339074242480071595684502491827709175732777776915682786771730423733673667248186336046898260378049328204094804755195626798951644386924178161926128482002518979482630732440619051262620098544265763306253807191182'); +INSERT INTO num_exp_add VALUES (5,9,'-597892150.08771044822540810796370552966707032464017958269847934730769542644402913723848026909285133109089452632480800168074607090893991283808726990171062867538012237270000932798704781608969096508450960185964292594677356241956277714380500188870696516251767979457838109804726539408115452577436052503866633026489282425086547752714324273565900641436632912781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (5,9,'-707619110.78141098833556856308817117136192658504561165951731229431651264331543278598450117846625251667849259592530287073315399782168794294250299770032264633712037469256688885911649778714039732161560189579333758422588445749233730591792217152212229008169062714458263709952275557558931748845536759606982982654369800245696528893058665897330942472105350178781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (5,9,'-35812445701642379.972368737320206275515144213236752803936806738624588812089615098329765811617509505790110909629109400553415312470540217508070421816878544125783329593128638405659896184248784794258084116406472768709113030915308410565617764394827427154923321461158387012978726512246146545834669665093228316853342805604075936530371665576147966721599968786161939347726656168798065647411457701453987215491345496003650288850096338695703984042549594979897253521041581573388369367579323607093487743440894765114619634001789457486407909224339065748496715380572175183589195611952939575073075140094901024063428239223964510824958346570603142906309198033196987949067156046076497974760641964978711558209708743776024313916111738542765749928287600981397080809041007714387564206594515733287925008053261840295560398311905155157989225181164097547541'); +INSERT INTO num_exp_div VALUES (5,9,'-11.897816658873986795664687519069203701902563457968097729876034796143085813450454323128600602495745166997629078984618283588337379184733369491549230343315369634754204412939757136108898254582353378508832611703989221079986765793923635928759179573599208612516427628403686659479459867527627014558600521732194240404211484706621458983727740143568799713006127585168144158660566534382037451913967363675002134687952374080694449905223371627606557311710348820900963340884001770733452314715448053233208783321215998063958966729954113843581448912079950334969908657535514847005768455377990262943747367245613296497099716892292154137652893990339292671106003657659470243633112063075297194691349631518467702876183897580432003030164590920118726657290102377710611324297862045849839571689192181090062958059281673245670440852080202548743'); +INSERT INTO num_exp_add VALUES (6,0,'.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_sub VALUES (6,0,'.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_mul VALUES (6,0,'0'); +INSERT INTO num_exp_div VALUES (6,0,'NaN'); +INSERT INTO num_exp_add VALUES (6,1,'85243.44233732197133191329295927531563604777955507322414928382967007765263923984471408038635831036097817458527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (6,1,'-85243.34846317758118961150399799670008360696356209219504851646259063690472663252876207514831001425809630178527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (6,1,'4001.075404054519813215296429095020391062109905613738157927030437221793757373268325953178030040276107574363822832168160758728653712686313134828282109532831190239521843808940611025488601517574653932032236616573457735900045655665690517797280666732780030171712864961531623060353548802466577910774711998056232872212688464691036260746751992072745518373073825852119460094113694393273456369345499434994672730920070410547163082189385645712866100999708173472360864669110044660667614583576570496399103026286828660558854973376227247132815728164629722965145778698957093136175449225024685874279280018547740'); +INSERT INTO num_exp_div VALUES (6,1,'.000000550624150700285432940805295709861455424264970126953321538967550091614148982212874391026630805836518138806917934859138493583812313778188030836027246840794439412443826640206464415527687555214009725107630387889854278497875708390050387195108441635824296563108288712340902423706104029452615686971019125750530034798026103476074158922893374911891438688457439945897348811702908216883650280617098402133628688982793791562476980709924382381505517834196446365877784931355599480881104446907801805570471686295270927836995181422963320376948188855989986414581755633425437161760674162177776773597848142496583128607548351599750592863590334617838124741567654525843413232313914310487355539260264225486180000012813397807525203822863232682089295055713257835007742845010741137213301116647610033909062369843750685396196342928455'); +INSERT INTO num_exp_add VALUES (6,2,'-994877526002806872754342148749240.99659316232359475297606895243958507460511031229368344962653674268847910587702140353344168594152240599109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (6,2,'994877526002806872754342148749241.09046730671373705476503023105513751542110329332278421699361618343639171319297340877148998204440427879109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (6,2,'-46696638263247522384986521136500.479312417066793299922708112595886608370451213741279484136907754744903470430131032928908162742687359367826808123516519335458861613010646992354378739165872253762686683966945711430182491860196341344982195078000259063231136011430995647812149294224699587849791008794261026932467933475782780'); +INSERT INTO num_exp_div VALUES (6,2,'-.000000000000000000000000000000000047178744084866106587600962473825168237820701199970144691815329658682341685812472535816245052671243808078367856957579485152424914481414614360809698177236664771558713606961423658442962083541733004775309314926918118528217478256885324362912426275407382550929085958089798861918760121727491366034496581249711153289495601712583077918760003840368008056353090552282274780428335438032908213783490070198414584291402513547386013689752310173492320159738977752795528725029134841933604057954874523842273790958618375118974623107241366036640538085329921129023905888674299774726871808862832797230915933851225308164365269753526489223540580759951230801125605963901491073619448437890841032149898629231552019804656219062534881074125995130202820302133432951999011667568746004715268323913437054078537'); +INSERT INTO num_exp_add VALUES (6,3,'-60302029489319384367663884408085757480.1853341682137571584926062805631087054017160819890685789064777236456590745415460695320768374693076860837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (6,3,'60302029489319384367663884408085757480.2792083126038994602815675591786611462177090630181693462735571643935716818574980747701251335721895588837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (6,3,'-2830400711649493468815157129316992649.40542786074520931471973065281957756940496588853021620372179463538053123396140685749478530925306163968207226329985017644835203709485594362663495728106061878665324856417118064730721101615473194292620972173690618491026470353143141125614124440035267592258385099934706896692953497971326605145704135723011753705907329979207428661473172503098296622281647255008204864404416199384701720347319806375450632245634238172654086373193251877533131784268854289406126119630708578053354762596511353053106459297339360827562281168219966099848212'); +INSERT INTO num_exp_div VALUES (6,3,'-.000000000000000000000000000000000000000778366376597400971124059102619954214055884926284646546105035591052258074563706355894551049631537984053410850060739107742208523938741961208742831871056600773325053133977559789796700130019975964192371715826863472981072974742704091801166438465082519558956925444635729210849210496466189037623555622901738570979273502405907969114110345815802999687171113749364073269902319653450479463404003706147915064100959774312307195946966281098140229199529866429134937742584938255441169541436021827079647129394362379406256722903991353136733939395366152312959281905058592776286736536360235356737359904478313225848562436632109470589310799000750518904145312512621838935796912993778920622238202744037977772169066929474233952081158212174549695244127987299282384885288897893503991509410567351494'); +INSERT INTO num_exp_add VALUES (6,4,'5329378275943663322215245.29625473207137544719284446115519970394719946335145777492574745992986971075733570324679065009803281404581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (6,4,'-5329378275943663322215245.20238058768123314540388318253964726313120648232235700755866801918195710344138369800874235399515094124581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (6,4,'250145412892811547138949.592621291590152419206270097656346630226508074074623894951308487425470437268130465956063593951784820669318897182831355375451719125809800516979013437732298382708070979871283132689492336823087794373113039154669229889503700598930220858275174342776478898670277868700384853696009897221747924643343353942154528501454689084608965009561564638167714973711022212547096732831847202912862290958304510651828842182545311077713664465815992616213663619529378061133917572474298028065850515876361609671565914027186063801852554353160801534696062207299890867876199323530337336273950892723090754719547285920090419070001019943385293110663922226230169381423410428577990604776655422105400452217085311617728003688836185608912367677734364834577573255789160419371322775733777518997638403409000055707558465286469808848200141192627396502735'); +INSERT INTO num_exp_div VALUES (6,4,'.000000000000000000000000008807232244507937251856465017967626593430084223212999583902527587737263981869382895220711835510154989851222501080395520249593128253795609198666884523792646863341248402687314509176781281863891589925961900674092953408613128961234166906173266411035009516545964362406728942021813644419154548354247112601793685146960840364604115937119024575638240439041250900118977183124605578660115160551830946251713350556181960983267689939549506518185340972020820080460565392359379680036788592213479105831301723237102710863182596413567756605711230290883888612188805367801369264231165178487334557824054205160222371548005742602736713668548450400926514169967213301919971189065307721110805424950794015852531342286935114651278691214233054575660712537044810163930633456573860895791198853393107188289695511873068'); +INSERT INTO num_exp_add VALUES (6,5,'-652755630.38762364608541718463145771120672223443489913059334543712856431450577465795351472116052777583325262472505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (6,5,'652755630.48149779047555948642041898982227467525089211162244620449564375525368726526946672639857607193613449752505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (6,5,'-30638438.151446159804025029882398388155309149089870990062944469684482366692824338098201222171115395923414887930224163525189097571163687285244255335505387733673499447610577050114902372990462064696637481657064525319516004273769831260452832960893174173254560250804003884280384718123289136453955482855362019158401218620018346500189769819687260476334734259702665316562988639223597110627626759216850014150105605927773639897638043177685498804811787888811168524202700283461266793154726325540776914500415140842975457394524215869103737379109516024460317825645645301237375972914247141703084877141866316168268901439172491577729880760950895760711857112463508064820414904611059588717092145484656103798852859978690742216940980929562068'); +INSERT INTO num_exp_div VALUES (6,5,'-.000000000071906039575366987930696117572143566208825430801491864851999044659045681114433294052065377679745375399878664822361548237094424148992770296383642432040129230180142339557437679166815114510467763288057917694948929009212876391059413439647163295629904270262780935228234994930653489111444964446097124407804311494588517082748514970905563707392765567625639455978464081409330528324962333492925267647686759704415549221137291475247571296491073010175087298752769122449499990102435819414671847617062560524758344361194566796343756743243766853291113852464023843527189221162680613675369708907935197867458588904367993736363321133720345058432019986643353417257503619558797249295232894674255060861358071309619524800424087896023710729815248847792174290644245138831518072176198607255346603270853333176255533974364728342822'); +INSERT INTO num_exp_add VALUES (6,6,'.0938741443901423017889612786155524408159929810291007673670794407479126073159520052380482961028818728'); +INSERT INTO num_exp_sub VALUES (6,6,'0'); +INSERT INTO num_exp_mul VALUES (6,6,'.00220308874624532134736695825088747995945783791378828770826401323533973395137378460250799184832278118133622563295093909508983301127615815865216895482784469538070133388154961402881325731054433770884496'); +INSERT INTO num_exp_div VALUES (6,6,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (6,7,'-818934540071845741.9530629278049288491055193606922237795920035094854496163164602796260436963420239973809758519485590636'); +INSERT INTO num_exp_sub VALUES (6,7,'818934540071845742.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_mul VALUES (6,7,'-38438389630389612.0042045464692275627184627672063157323631169405883031379129843031477339360597564128205768842448328088'); +INSERT INTO num_exp_div VALUES (6,7,'-.000000000000000000057314803440765029050667129936880528769333499793237773980613524885506515999851858649385968476426313207429914995755091541422893944525222307473169425244462149015717526718376299808423552027796204632286454853167559026787019718806449038446612978917236245943248168920696452018925986743620392955122431521581268518101342690974749463089739042586011924590503136498488946387508310209984849243014542648765897536338824721211252335866349509669538308454367849024503312249951727948786393404944555844863805495937835281927012430439403132382055464307180153473189842433614777883826783689904293115204700185380661601223693428304020047393499702811581067120117405280772944184877279069842269329959037186324135435468322336398566440055479142909170224780318371473684868152271947368867666706912563225912012901437076773416'); +INSERT INTO num_exp_add VALUES (6,8,'8496986223.68757431572672621257436634648368772473081887846765003074279255322456188404621827857612554765910678041003765241409149793494330798800'); +INSERT INTO num_exp_sub VALUES (6,8,'-8496986223.59370017133658391078540506786813528391482589743854926337571311247664927673026627333807725155622490761003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (6,8,'398823655.819545574205652791249227663407026876411660299394659390409794761643751582473390322547798567169668246138880832642141417531427935520467563318363116897177899262525720710134129529640376020947774470933902793259531840625444267816319963200'); +INSERT INTO num_exp_div VALUES (6,8,'.000000000005523967081937952184172713994498918048454262874017009201501812494019618863622631634736130436187167745347383745890248619882896153083428308074678908731005176810208100004498415662458272149380846809398637385270265351808328466537502823071145089961996689711299405627596294988646826454676198092260759424935699382655736524042353938814268760468122584678267125994645166955751211397353140569987758938572953312303398024147927938612934833827734142292697389251052485981023756760420972614486278837214553818521196182883489483756785207650821722660455451660719560529693418375773124813290305501923899840247103166971466167032437598057958226806335324315214908788839919408525748236713611579486768218564733151121028172253396652755590051310396973181595992981076269789287489208817712754098019817792758730835341151711523474207'); +INSERT INTO num_exp_add VALUES (6,9,'54863480.39378734225015137845671346015520435061071252892396685718794832880965812803098645730572474084523997120024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (6,9,'-54863480.29991319786000907666775218153965190979471954789486608982086888806174552071503445206767644474235809840024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (6,9,'2575131.137912978352131546639620215541477987701194164886305951830806120142596646541302305984776928560906754259789485960991272272782091464270104432109904222200473616116525297615725803495463468272171161659654385929185160689572943852767523792651123455283534072794326647404332228203001469884016996499768656263775233430922446983838511590562929268821678518640501686017030536100955531423152839988008496919169395159653034847677470665418765966542111749439412'); +INSERT INTO num_exp_div VALUES (6,9,'.000000000855524875533453524582534418967571681572635027972658867593464437484123442242521660317156546196609749230372398872487667521984251509483676665788527375343148382604836976332389890799079878151841905152004537926201190193814594954194044560537664560344224646197027029681984683465852110060077865421064400958821808374370779297676624123638191407441015008434084079839721156870032377372497814037418047056438760664237367081226979226606227037631073946209105678283624370820396871058367779887709720661001099338250009251834581804647326512873792849059661525874160414378459696930831877643599421297749483849526695657467708603491876916749718079725746259119898269814551222336219537198318796277931946529242436502235147453584237994498566122973953203597470078105606906752099294162422474758048436539653041606499637623370030079916'); +INSERT INTO num_exp_add VALUES (7,0,'-818934540071845742'); +INSERT INTO num_exp_sub VALUES (7,0,'-818934540071845742'); +INSERT INTO num_exp_mul VALUES (7,0,'0'); +INSERT INTO num_exp_div VALUES (7,0,'NaN'); +INSERT INTO num_exp_add VALUES (7,1,'-818934540071760498.60459975022373923760152136399214017262844141729040109985386964272131706381326192223266583769046276181472898406504104649192224392653722107164485675679551050629376558940966195135841284978096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_sub VALUES (7,1,'-818934540071930985.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_mul VALUES (7,1,'-69808760806266041400340.70700818693892852138813934414383886494691670042143650609934777814995087699409404201920249076407981012095999320858479644760715204999741683528746097757549835956359129287002171391961763797857794730120426599135099619822532290339000466211195776337667123320942107370731349851576864242697412616810236323676004067839744992733887503405311090677026008324895177587064547630828026123718296429295638934384446325302964896473296829265805737112709269803814942537657996725913938408781715328945194948010970'); +INSERT INTO num_exp_div VALUES (7,1,'-9607014551997.140858001442365669993007297071681832468350855627077185145567261170534005832165603932891201648027598773639089125980996652005412450490063683624648655909636499261774535015914730479401090227915382926027949990128880284298688443593909017437720828163877690126019616194376778317148693270900349151496295698078575648169637635898560612738481294674167553369445426793073304518646116539082953755973571046622684332425840412198776081251646424875405772676893185726872613804612566569794177506268399878105117763696990094108960076591684779180089885283939385808214239337829666227427148603057941899878123459708920227867371285837642561064461118016739395972994827327543594846953341750907541716807985738518071480209106185726125017342997283356926976052909493074301401955202616191210810331245427141945840542129607439703255628683506772979'); +INSERT INTO num_exp_add VALUES (7,2,'-994877526002807691688882220594983.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (7,2,'994877526002806053819802076903499.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (7,2,'814739569184924399102711674444306584731316176345067.39834031417849342571224916231092924046722938910652929295271097903377854123984307101079073134405782275535446337229706620713104545454319555885847481531722101704765783025789147453570970090'); +INSERT INTO num_exp_div VALUES (7,2,'.000000000000000823151110229758332661330617426417726331211894330147399760458555778324097596176117291103184653828305857999638466183347321835058943563347767579219763002258622507889760416640758842509635599414768344140175277742935564567127659688612699366182158030839083982896107176174766408199870924563237827899202849733606842856491701660599599211106794572237923985121475458446997860253437578966578617985764298513928307852082168209458400544457824307270777530312648199364084272310536024283945598340590403612752287693234647719354745060851129534452514828239800716088248915975054881011343555492596002595181046121935660176097475159074973635534016835214952415720717896518544064238656360099884889450237541254761746029507300068198731306211736696956568648033834554273602524147075895460874922913883751452403825099444642503437'); +INSERT INTO num_exp_add VALUES (7,3,'-60302029489319384368482818948157603222.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (7,3,'60302029489319384366844949868013911738.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (7,3,'49383414785234649002982046297226894664526726187218771083.0993243619030008310875293647868815940421844461627295157812843657782639833900543200310573708100000958929315945039020410482966753145208427035917753919085618457760620513481628641658765820294863970581642745379331727722585319163262763708386199720411053619449096019862596221607526610103408936214184850115071874430846697061554769773328338028749631552202705583855831155461651414320570061181212214810086436100771547030013079997847086'); +INSERT INTO num_exp_div VALUES (7,3,'.000000000000000000013580546907080371873577430837141172674171921610919544849037647398734065712983603204704663262116138799357430947986241590690589753181299773842880079777640016786921825609617596862828930939366173224366864448436461306602680780407912534492687474933386043505172346330210659476505435994582446405414027199938970759003336829722057241708213838318628292667946636226143164221380503228191376939596663443230082698085439531600756771639601022064620204571458766303985028143400866776954225590745596639602613498355332049777798367675438365442468743270334407716567057368347458892075084694158566383133325959042076573734408841629149903649365079563374278550978052491499304166424686842598833319515705663176855033865872333988551611996194856472662292344160194821687681312501127516922809221030420253714666026321243515830'); +INSERT INTO num_exp_add VALUES (7,4,'5329377457009123250369503.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (7,4,'-5329379094878203394060987.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (7,4,'-4364411947278810125327066890819882483326918.05664098958260550284395870948992407314161088028674246708928421994893923699743452802989464864039994566042797942433140378990308345483670828497915478397481687305406460330009319949623844175096007381662809083363069100235985794575399268709260901964834244796150883807308976949196661411035264619638771824190014274817662519438658481432363824187693821267613212631153175155634316128036152465184903927860719447693468054624663668062006049759837326188252927823612718163916100588143128358998656306593393889422386501730237442526450419990376323903182669190482615734972147533221144682538647497701130447816148459762464395194383090936159579764712919396391813914821973715879062992249315474841639591907249142779103650773383644785606333916967894'); +INSERT INTO num_exp_div VALUES (7,4,'-.000000153664179510102140733858340480800294287837601105047285453457000254577644933901525444082336054243749405512900867540483190494113677173628646221933766421338612376123824684592850465460156248403574333545090544920568230979754949827013129083778435107488003838746926270955224758508832133483591156567868631938590248213604979638895901933775098150684618378235712437137852195098700137765601802898366867034641606131280434771339920637353140131159441790904703083143627590062236537714415872864218260252838432414759890832271190606933534662897006726154587341385852258168335058931957995901987808602365467861573344491265289043037273815504867254228957776127752540924854546837197432384563153608878864912196453587628891285275067452280357349897203095502806923463147414086919014592380804424300739713935051357374227246098303140106'); +INSERT INTO num_exp_add VALUES (7,5,'-818934540724601372.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (7,5,'-818934539419090111.56543928171951166447406164948550154515710437889210417918789596512026903838850927622044807611530643887494456379304996563468607210970486619898336249374975146736655090644822719838495585664994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_mul VALUES (7,5,'534564131989234694540350103.27821462973515555648644772098605028371173048154132108733819196629002548296868548691993248746628993380136454426833349407578676005545111508293942736555269938962058196496152360848131645787941032968937794930046928523006455386861100809286408671908320322523368135203881520526880998279355848280412933152306299256343179622513731096363088094541514890135766460631462465021694553063366717467560655272004461368865264059368514271105464855575429914212085797297268595943955105608543373940035636033207568676745293499106348500559628723682588033431457023964317090780615020801564861497990103549650624438425421690193862533733474254'); +INSERT INTO num_exp_div VALUES (7,5,'1254580584.048971438599349046867230181719371038956756285986415773300837165755558702217197735811549684202279755101552533605390208155708695952004683670878589028717509749282693444655857296902117478518511492735290086040573521482737598395369632843374456793385511847676556826348943588519880411018079886373631771830925920986588708409208527042927229627786932908015502292313887561198156623702404977221789649731458241770690830680067801377815840764873662400590343236662968218256211697981048576328148435241545372543075051594952109757428031762469834781538302930957095080167901199455226976113347018972534334210416375400979738414416582588689496706548495076287263281908191770792203069614447622517839588243746755480572371988630084226963919158931419126724681617069720048557166545204944250492282054791996953359013543036918134163144772567093'); +INSERT INTO num_exp_add VALUES (7,6,'-818934540071845741.9530629278049288491055193606922237795920035094854496163164602796260436963420239973809758519485590636'); +INSERT INTO num_exp_sub VALUES (7,6,'-818934540071845742.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_exp_mul VALUES (7,6,'-38438389630389612.0042045464692275627184627672063157323631169405883031379129843031477339360597564128205768842448328088'); +INSERT INTO num_exp_div VALUES (7,6,'-17447499423661151023.558342555162228919125358089491573318627107322332520978657843895009110781773496490472817700487707134216424855867015781267287628022535529641238372370292374146871103236048507252055787621394728096799222976387108688980537900309311204203302960751747509648304056939321473462375648710590981564101023812800603438271190184064874290215309040519813024962909469701968804925443161094255632624090623433640078421818321246597728308302979223833487133268472455479442002005374793705431817866798804822885690193667521606781156962792120052947767160957903073698536973292205899421787948529970837601521657406211962967291912148632072929662185840265855612193255596825032457033402506154930851214421895488796227471490998190312007513478459049382774782886773158311656817014322925167278223360446454868236479549745612973293185989975394307678926'); +INSERT INTO num_exp_add VALUES (7,7,'-1637869080143691484'); +INSERT INTO num_exp_sub VALUES (7,7,'0'); +INSERT INTO num_exp_mul VALUES (7,7,'670653780922685519356619170643530564'); +INSERT INTO num_exp_div VALUES (7,7,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (7,8,'-818934531574859518.35936275646834493832011429282408849567717761204690035294074716714939441961175772404289860039233415598996234758590850206505669201200'); +INSERT INTO num_exp_sub VALUES (7,8,'-818934548568831965.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (7,8,'-6958475505053954666339703437.48985528725312694198056665033448258303533387675711770743843194274181580881296671866212320171337132096489224277825857521033238709600'); +INSERT INTO num_exp_div VALUES (7,8,'-96379412.478435590945480884955616049873645089637121682284625533034225619945532704111492738646389632607594293500930307222576571876059094206480673293295865214240456906965855425738072430281475736130342229749511650392658808510082775031098547507966544723255869156056349218776847523349173551313282283869146710349521487706884633419341568648959204688757523312579312713453540395840470692533267158388401676533369105590789036132185107859069994833345453200014884023709597817280132465224778002071890368479648934317322270613208789859930618055792958996389145963056607200020526949699302565905917600478429628844015684879886549766473809801710003649193772354147104446894109928903223843036925147624639466770660174828940577089095480826473544099693433597812637069287644606693066736302793687011165899362920686114156254982709172925265118077531'); +INSERT INTO num_exp_add VALUES (7,9,'-818934540016982261.65314972994491977243776717915257186979728396159058352649559139156429817562698954531329940720620096519975256547379603654362598494779213610069399116912987384006656023443527501447464682173445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_sub VALUES (7,9,'-818934540126709222.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (7,9,'-44929599044588573810654775.83678007633232843418115790847152455559258007804727916986432256198687661496804050903769496933400455947645400628259699874770581538122521805603947464462448454681701547899144129061961394870320463199545502030106801911915987309444301341575451240764927967432593181449618816978119423290767783843864768557371257918447461479570164065303599994081990686'); +INSERT INTO num_exp_div VALUES (7,9,'-14926769772.797708334489652004325241753714626257641081061212878627972973992233480868793527325656854681817156284203427388055525855608883067129036717726368707982450450575794623567027457808927082390474261155500697096284790656757163047499531247323702909360444831707029353441147768321257650234732286165724178549576948957405037843360446785505536809409054071975214796532504678683693402401018726571884721963641317944453797513145055081061680091585467186975354801535734149952115333241283186621720677488342266420359417174224757781125498130120775969091933838082305123652811689513300403051544682523761263183781206840940347226802620226164265210810994106136738030959199259066517106713585343004140573604437146025585149934286364795122716971496775012412420105368351774715982565252533025207453326002101655121126631180162560463548157187175671'); +INSERT INTO num_exp_add VALUES (8,0,'8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_sub VALUES (8,0,'8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (8,0,'0'); +INSERT INTO num_exp_div VALUES (8,0,'NaN'); +INSERT INTO num_exp_add VALUES (8,1,'8497071467.03603749330791582407836434318377133169438097066269854720538319012928851657498035372443556191720308219530866834905045144302106406146277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (8,1,'8496900980.24523699375539429928140707116805167695126380524350074691312247557192264420150419818976723729812860582476663647913254442686555191453722107164485675679551050629376558940966195135841284978096687306110481009743118940565957556492470398904849289222365256698601073536111216152709126800604695001949246634784573028721762079936564434050796321975774729383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_mul VALUES (8,1,'724311956372274.0135050255361637906710330203036651743488213007179039756514944640108625580172737414192938789413338554327986697518463087452612658955180411327002900979574347739956600177846996063741787205122007268468674386396156638261992679442768654367111433834151087792255469957061758837789341439211010331332174981459471333376067541234901538285101103690622656631026001337239036711179989456674399137008584021283568040818388709554256523118702728176420022080138548890713013682480239784198421500241995499841675772793497485550923152267616622892846304530712344886979674416990935007952941652591352603797627920865960622077762568060903908151958000'); +INSERT INTO num_exp_div VALUES (8,1,'99679.115123747637190903598543851248555278745675862923884476564848911494649941770503156134872464666625927195645517181131678518619856156844072856993813601495176097972982587061507650426363887871820112714099226501603733968262566093655417466145183587899155614471697804006772915054739361437054029183182533671508695646413074668188590846200362324428338974890534273352188276373478524543505805545661569395314989170104140776362043880099775594658817242753124957385625811310332354760117110779649164022618274859298031549851269619167173746259018497289174255201452265070501056913033329291819570027877856677145579673495987354805150868813877928857472561883332547900866904764950837506993759536410161752469488392566682723027340638271076406246129989851281210810196699482980833204884400423019400653089825859983062096326294783573417554749'); +INSERT INTO num_exp_add VALUES (8,2,'-994877526002806872754333651763017.40289299098701084219066388457144979069028441485513418625082363021182982914675513019536443438529749838106171095037135009526312783302868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_sub VALUES (8,2,'994877526002806872754350645735464.68416747805032096555043529892327279933592919076133348036932929591304098992323968210956723360062918640113701577855434596514974380902868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_exp_mul VALUES (8,2,'-8453460632655529853033389979024265783461224.3195241893307807116624750282852146303290708492834695194274289713076935297734670940696121761483641291930931061232942894577813178566088927221374036301485916497770984757492912292002695944367308880163698595015497307574177176409203214324418237020500352652934909632442547242092296504047310806151851207329042221920888326000'); +INSERT INTO num_exp_div VALUES (8,2,'-.000000000000000000000008540735921314463871578184793632135730756619558669911183806487803411545406462244216408739432325839683804021466133071768612386706692296158696852363349481716813410857655324486448455846562309041306880675446880859847445987588059144788756984750993583865748280824370754934966494724951583311563735533173023858438364336214213295786266815116844775733072416507474834701984381586060478606371028156925222726225495235702395502085206072985373035972506738983640539009567237336002073370431753469632428303255926718930619221521257726366850472572830063284204851204189447233044832163423057501488364913539948261528280564870049935369825245920984413480757133585498984374354957754078525161296201228031555280486615145365039415418251448980923331334883673792135893857917681235883506783408111446970710546686739582471'); +INSERT INTO num_exp_add VALUES (8,3,'-60302029489319384367663884399588771256.5916339968771732477072012126949734214868901845505193155307646111690097978112797961939995859130827784737422228762767014427842766445950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (8,3,'60302029489319384367663884416582743703.8729084839404833710669726270467964301325349604567186096492702768702209585877643481082023851284144664938175277044596973126708926205950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (8,3,'-512385513828318260570283740065493064477880918352.732624553690077857674083796435724202494963885926573907185100543184828131859183999195040110586155435203949963570735841632689374488877298209082579317039061893012560130258753218955057387206477423088065663401594359617882154814262843273526859406265633827109554791772242178864873774889091687515990672487380368975556580539271333144212685871370972163560839446696514092637412587953506052848750866803569213269271165856310101244342151576488190595936869490659700946174362872797854591188391982770203203644172999264143929484089237665313698600170041324566984832357000400'); +INSERT INTO num_exp_div VALUES (8,3,'-.000000000000000000000000000140907135225782279761112255989433531718277338909398600029580768021365259747075253760824424092983497958717844671162530550507041138147836569244869107757945370200122955794509365120853536859837243314494576053441804831018954867623755033888264275704547752628348151132333655667171970175829826792355986148522268067032057293494927558322394395160508723637192234110428953945018965078022622950949911124494740703606109543716688008516750321047603009424529696862953094999450658951089435460411028678817795100630449046993274191915359520936265372754315076684798942557329584282177053819106884196674660057281227248874819417305259132106690385871316407455034281900110779740008476645291647094776093567400422266906817555937149628005629880142615126571231411138926043531449659320501743591992888328328980526602'); +INSERT INTO num_exp_add VALUES (8,4,'5329378275943671819201468.88995490340795935797824952902333498786202536079000703830146057240651898748760197658486790165425772165585380839129948178510273188565692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (8,4,'-5329378275943654825229021.60868041634464923461847811467151197921638058488380774418295490670530782671111742467066510243892603363577850356311648591521611590965692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (8,4,'45283653791262997781451381354094822.762732909505051438036873220502792213670540454778361182993875916509061144859281577740137081988678361247725064336120451090222456518107029158304937620179032477664627949959143233370320432203497828243297406462513350790251761540074946469824444452248386782451723637769289822576372357189700319768797708375563651655860093365309717823602754924352327588945034832436331911584742966378275504545736896430718939807674966738116698454215555860047859161126694019895490767779791933882712567492115664113775047192011252893773389940988533801360010782816196288710063568554147458866942816721046004257953642508395867837127678980002737669139369781058046396738606563716339660654364541530532834806205571191828994250708412638796240377704994928921528330863683630622922959130920715261879547446054261914770022377059156125037157979236658010950'); +INSERT INTO num_exp_div VALUES (8,4,'.000000000000001594367257057971052149628499448029056279649281098852958322409409919964709324200796473211884339143791758566019217634542932882694487712398244322522748736692741288668885362384266615527166964187404128216235057387796054457728789109537338988453837993084016408244895452291151218602815057669592284587317035387004942691671916981967449109983992675125005085762403043329820872839739877674121174083273716295673230993049263574856197011389828478636779342320299895806297835595427859271617831720398457416685435560152182883615601663820189195644140652141180949257192740185075408019971747810015931542757445763460947106918998459997631117642552273815713467150465548031203738878873114842844016176922502916339025283749846225376341878386377192605865913018132981323065698049618379727531925408677611856682983907951667054819'); +INSERT INTO num_exp_add VALUES (8,5,'7844230593.20607652525116672615394735666141304947992676684520382624714879797087461877675155217754947572297228288498221620714146356962938009770486619898336249374975146736655090644822719838495585664994425117350974491367099004404995846913641329458537237789584653041949090121498951516476399288513593944575192159570458664608461677113504914551578443229008454218964701550932948083369656042643364608405637360180021322967144409944099438498649645368196191999692949583952927486593144959284443545794934667002661774373364219852712996869245745722896071593910890197478196462961042627387162830776094709087748993678069776845437889735782063'); +INSERT INTO num_exp_sub VALUES (8,5,'9149741854.07519796181214339720582405769040995916571800906099546787135686773033654199973299973665332349235940513509308862104153230025723587829513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (8,5,'-5546455599206321494.0676583421119904300307105296377723816472192007866147764761501865875232824814135783697976183493106885436876081315217834621720906478074798596116645640251460842350553806256223963023430631066024389364515688765194373161385579258482225808660340732705687558150699172147896486727530192499184101617379930846663835628510376484675411350654979679181852179924386290069790336316958202582966248703889464308649631486542724072047294216362186036638115240070658004553260251510288423749333873893917690832829128021808383128393431810674177390352413548658782609064839524756041501835115152819802758773711821322162752064589750295542985780512921839490040396053737870038534216948323935020460307350020911362024271167085905714873548388570602799432705061561572854498075600'); +INSERT INTO num_exp_div VALUES (8,5,'-13.017101389051085341042057308965769356145255575582875626848796382322826525772114256699384710400140437710569924703769685567402446691691210934185000959063158239023412379691360587119206695513775971704926722817528818197919265145207032750407924774510773427697188520818450702875142190949766251178733262143962213111236591970766836685919581025629742334704854852196126735685421250263035895756028805974153787560164935038227108975229771590754808331856162035119882347418116049174638416621093907738608991987582465865527947015457540650512339263071898410531735438556948115098562123055444965056347091625748703503220861221718449714020622377233272042277814766996198081939221253025243417993701684007826177845003391944496774674489538520354606358872276671998045196738090133576377830721671972381371985771591052597345572374064920279182'); +INSERT INTO num_exp_add VALUES (8,6,'8496986223.68757431572672621257436634648368772473081887846765003074279255322456188404621827857612554765910678041003765241409149793494330798800'); +INSERT INTO num_exp_sub VALUES (8,6,'8496986223.59370017133658391078540506786813528391482589743854926337571311247664927673026627333807725155622490761003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (8,6,'398823655.819545574205652791249227663407026876411660299394659390409794761643751582473390322547798567169668246138880832642141417531427935520467563318363116897177899262525720710134129529640376020947774470933902793259531840625444267816319963200'); +INSERT INTO num_exp_div VALUES (8,6,'181029319177.110996740664566780784253502559986936959009611748146099327460471609593148344991059106574612143724330935988823134137686051475120980257829276671900076859337187540608483895641504622910361858962883971613675309676443079313179200981488761707281247447120551917205792352229666049191991270809865110506639390610910481490688182068719005593641339338678014189749279508731647492051879768743158839680867283217578754666643688259810863605002821607490100820241093473083445658378988069593782353275713240897038366242558466047071334385431080003439842348547427066389352198560236731403235927478177780757802759046212921140424771887928786549573201311120885052685761195784207710933764480136690216943336587118385525047554334029388869436622866247240903231799829259264158812528305210833683370536416861544931420820452512390255774498188962903'); +INSERT INTO num_exp_add VALUES (8,7,'-818934531574859518.35936275646834493832011429282408849567717761204690035294074716714939441961175772404289860039233415598996234758590850206505669201200'); +INSERT INTO num_exp_sub VALUES (8,7,'818934548568831965.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_exp_mul VALUES (8,7,'-6958475505053954666339703437.48985528725312694198056665033448258303533387675711770743843194274181580881296671866212320171337132096489224277825857521033238709600'); +INSERT INTO num_exp_div VALUES (8,7,'-.000000010375659845651632013446652385870617923988120764298690164486716047614260682259722116360931978511176121353975789418625836899338225571166376573732227571704071000348895791547943896682585450808398324252224265156214259224488248639550967292466343168350213394398101712526534464002532408445204630441167137710565437434313424987517531891145368203998329086865151248833625645567863740298397742783405267970015165358620026813812552194344790169289440822038223606218360105618852154152168496637886434061050281055613760360200323363465925493033734895631921307644481639236601187225135325401868178006133838932915485272554505684060229409404902185944047523033315868230944723282246159741659387362889777495094736963530708159604929268812778894177095572578862150793098548829744006499229853198046828954650334595737117597239208825268'); +INSERT INTO num_exp_add VALUES (8,8,'16993972447.28127448706331012335977141435182300864564477590619929411850566570121116077648455191420279921533168802007530482818299586988661597600'); +INSERT INTO num_exp_sub VALUES (8,8,'0'); +INSERT INTO num_exp_mul VALUES (8,8,'72198774884738777393.8687539247642452953425155400068591498151280875559609979248583367700231031634872342122563819478919600402159024059794279536786611373504966204744811722007869415559012475160471227957857756325962941799428857291371597146319816910515366298862558849452235442246081440000'); +INSERT INTO num_exp_div VALUES (8,8,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +INSERT INTO num_exp_add VALUES (8,9,'8551849703.98748751358673528924211852802333963452553842636251612056366144128630740476125273064380199240146487881028508694029546139131732304020786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (8,9,'8442122743.29378697347657483411765288632848337412010634954368317355484422441490375601523182127040080681386680920979021788788753447856929293579213610069399116912987384006656023443527501447464682173445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_mul VALUES (8,9,'466174236688165594.9218054325256670866060556227711696100465581464881295978997280335378678072434776702952026828137140986670189756965420183565968027969700090735690246176791371115610886533930223141650377886909408268207750238603105232560663571044993507074695683027062426288270199495225881785499139012931143826099668999261931834700467395442768201666740663642498098541516326470052372008385656719236306238735524802875519713512894448940917708118676095378518264553310312628830009314653641136566040400'); +INSERT INTO num_exp_div VALUES (8,9,'154.875085756903716715488911525453064308758123952566428258639786597308109810869086867746263482721081985848551254298524280231489145092826397833394044637104667137816928932471315095067524966582810436282901424423215992139000153713476369887383242289102867530775908269805285313842050961754114751975054515055089553180717444020378611767296609130477264722612784088270193199394531972594028420402254831778715196248487757266330454269044609134602570688339750190391651801546906342796660819535014295618246236706572780627362908121159003488810140236665846928586992082180006454824311789091323774002510945263351862712964422865623934112293184149374573706760114682326698881257123280119140924775171374360283137569618025005229268057970275164869735173660958715166148344076027212231446680947914004346760896298312286730627916684448923824769'); +INSERT INTO num_exp_add VALUES (9,0,'54863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (9,0,'54863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (9,0,'0'); +INSERT INTO num_exp_div VALUES (9,0,'NaN'); +INSERT INTO num_exp_add VALUES (9,1,'54948723.74225051983134098996071145685528795757427462111901537365053896571438476055974853245403475510333627298551845046116291696445177112567064282766115207407461565363967417615506303416694032848457927390574251904212425813072768882213388082765916956736282110801611726537663292922699021333445658549608928179155685881583228490235606377831724593358583903616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_exp_sub VALUES (9,1,'54778236.95145002027881946516375418483956830283115745569981757335827825115701888818627237691936643048426179661497641859124500994829625897874508497095086558766563666622720535497438693688376602804651302002795213923698663694204683995198328880575615535181012624198813873609885725228117274934655048553507421448724831939026752650108735245933317237310133362383704426321489070979168993853338252728216162346796960170352897972568238870481118474064783391570102958474141459619245240874849766946530000977144965'); +INSERT INTO num_exp_mul VALUES (9,1,'4676749348240.390309875431213992853550297086049749814750492488995108783145961719774217441193547534210468967573344456866203963659951312519988497979489304488948342258375915152429008993288817366720647491166024151209542534474867042837694499222928509320280684557676243780452100132238968233413333851595648146954975713386711764268506890884764704949969602122157394714663532141060559896359465918874990769222345665160127552795532197771168442486088776803398878354288847069602460071745966589164282641033852314335279121191855487126430176047553895892632834940595958394834437871886013513058514896870683979585091413977173250824451205330441299000850618134248917380244749589254309567551846327349592529960432446947239714236828401206843011440433362544797025114476612133622499094287321570559088587999417440664282418005102546343020409520421747216'); +INSERT INTO num_exp_div VALUES (9,1,'643.609749344751131516972294140174556703217311736700045690413622699888869645595256683013323517984528456698303984909359393772036036540901870537096836621035845014213031549051156299974682317824766457362427063305495772666640279328909129870227828460705733995380145417663304348663705694070309475835826101153850359826502235923289787750107778906593010060115662191620280031872002110849782776325630424918493602259707267214006217268630948545349980430128422952869610116216278256812581821942763705098526140427280008360043829906543029486315209818099697988089748683904695870401517598840185535891464842870210715421728852789815860153472208176465166954851895457846723102438114697692610933532992841803219018495137378534010155991355251803548866919409031477821173935696065078362044927492034445482457329200246282082707380974745411383781'); +INSERT INTO num_exp_add VALUES (9,2,'-994877526002806872754342093885760.69667996446358567630831677089993316481039076439881735980566785462673358516198695146576524119916430759085192883825888457383242076882081857926408611052522393579396644731758241837010163568445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_sub VALUES (9,2,'994877526002806872754342203612721.39038050457374613143278241259478942521582284121765030681448507149813723390800786083916642678676237719134679789066681148658045087323654637787610377226547625566084597844703238942080799221554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (9,2,'-54582443595378013373024060492546032003692.4875677735896411267274323339692558458420972958075073392126734000341372096298914875892612108329218081214550050039133117695428196702128258481789017059073444323729583900855712795086447886053552786449313809589992185978097430132940882612817775035217244553616977182049775786664446683332098226841743818600819221587510039430478859412452506872131851471967577741190323481953867845129745440745526578327709351120432530702446916035797432129052518980799424635406993848916727957825620638983706180841278402925286540375225365057191075559133035'); +INSERT INTO num_exp_div VALUES (9,2,'-.000000000000000000000000055145964114074763360265614481666934002579974728749248345352023099030383962250681574081874554842623852433135871821620640200582985140388676650602814646133317791813938390695683843848260103199745295436998313216878337673674660966362155480524935736646623766057029148471463569162153009963312016563281545776175277904913263614668092319707343286073000287493274965714031678784835459999763925833141049057636632430975424499618419962303087175237320046300285962065818926167792812657620724550768858763098967149546312995222223400007044549870620849992226072041407997925405957501929449911416474388622107825120486594723448780503829317691081601820425151593487431389373265285594626753418140874747955925763163132984655078996173911578832035721963554569605730262976354029623260224710106409129114204296314733036'); +INSERT INTO num_exp_add VALUES (9,3,'-60302029489319384367663884408030893999.8854209703537480818248540990234567956069965340942024890856088355839135538265116174644003927269495876835324407641642359213535695803871472434650475144516723617632059130297610134243891145006222068960999879308472500422640481972089756410157246974765071949782242392661524488959954348903412713930092273629207697480131360047867213863018127928853922173643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_sub VALUES (9,3,'60302029489319384367663884408140620960.5791215104639085369493197407183130560124286109130354360944260524553172025725325268378015783145476572840273098165721628341015996848028750420770651761919246816300854441592109844750954710317145008297946462099581451150385769713261452744310496166494545449824802407416426304041583975713483424241727236417259479541129474082301376239522310995725648773643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_exp_mul VALUES (9,3,'-3308379209762459471107480259839508279070920437.883503980178028214343751083865562028455061662673132221930429904398963590401793045470444301883103141901787466923883803951815572606105617157736442670792467625964359169270739534412932791178258858918086886061702512427989129732248215348301444245772127142869263635282888226326427510486246184233225114523636171202034558843515894542952126988613018789833835507734620046994907453602573865012044120483116345444810078666601100257620969379968264504287700045822481492526688635364586344704730579892342786173395802035361824932075736340405960099542224953439044947229246847140957298841482874444906129049023002897135347878048572628834749795298712449864571996898774444932083319581439741625832405434317985988163261591679157437224404970927012111196724239860528859217322132733404472897289'); +INSERT INTO num_exp_div VALUES (9,3,'-.000000000000000000000000000000909811507365065002714756487495210579371808512079908127938523896001746219475805196061435010714649189975968123072269549018826343830061696154665503565341929634172463095299662727352635590451263034658630449260378893723785917860125051787451512267088404686342938118993621396641623525252649748977992770709930435013456855344203854749977414354164157192885125263071636468941596567220391082793700307461350484216679632552883058303710297475827456761138832914743429330069022439380297715971317819244718196187172770061156794130040674050533617155253444764036426045091327368023602807193742585178432544430741520636125146531502042579276206322507516332917325631822606079220413965396706334639331097621824106950192993127113903265025719013680733760540930122186345919977470628988674677630636632053583144327'); +INSERT INTO num_exp_add VALUES (9,4,'5329378275943663377078725.59616792993138452386059664269485161374191901124632386474661634799161523147237015531446709484039091244606359050341194730653343894986479159670583937529516163204904273806158788218327396375034882788180783796976731912141525319602448709213495905899041406302673881364465504945113279286939663215197485367850132991968081639290297033476859158044889351836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_sub VALUES (9,4,'-5329378275943663267351764.90246738982122406873613100099999535333648693442749091773779913112021158272634924594106590925279284284556872145100402039378540884544906379809382171355490931218216320693213791113256760721925653394811317969065642404864072442190731745871963413981746671302248281216916486794296983018838956112081135739969615171358100498945955409711817327376172085836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_exp_mul VALUES (9,4,'292388240303165948041827159734686.255558469787242316676287235194652580157149226950109397295920730296960145548003120827363226435916209781396711693581454960342091452830648929118261388933297036933167543189308061917640517578583521401267417187854611829815212778183983326568586118831109538377828156118900313778053576483381085207892754728937946691892849474364477434665960112125254104966566712906532318984871145605839506991591027939136026602051635433295687547552796828217859648186757719639965988287173297286034098497871707197092627676226053609131138590878743560287292934815277894463305001278326023708395571840850120055316276256138004565442099731931051413153564744766098053176049414330146267604802971221161572130161432525297614616942172815141372973870720928125699420370428856022295499447755488148545048400795053604349570217878099721865670458104653570360'); +INSERT INTO num_exp_div VALUES (9,4,'.000000000000000010294536718194523982241053267404812827031741197656209184880073175960433631103885281961037127283726462743623757855378209281373475473018922090781553213750339001555832360656399849031527008437303091226051008068950896796359518673740801770866360774945096397034708173365378527676779736929035450380795854046109380272505550244458858231227568118355064007614608452292270378691774826689216790090661497154742954386244856792006376222923780801296832612827123778915598893970651480451509706836620045721191411824060983487064555397842027454385628620582036592315345973096405447742002746762099231557054678593446667904250189208490698468539396733604833688133512716508825505666644390119877423938820483653319376926639295680552194966870285838815705038244628263602997511842285889300557188773128635554621378148419364876651'); +INSERT INTO num_exp_add VALUES (9,5,'-597892150.08771044822540810796370552966707032464017958269847934730769542644402913723848026909285133109089452632480800168074607090893991283808726990171062867538012237270000932798704781608969096508450960185964292594677356241956277714380500188870696516251767979457838109804726539408115452577436052503866633026489282425086547752714324273565900641436632912781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_sub VALUES (9,5,'707619110.78141098833556856308817117136192658504561165951731229431651264331543278598450117846625251667849259592530287073315399782168794294250299770032264633712037469256688885911649778714039732161560189579333758422588445749233730591792217152212229008169062714458263709952275557558931748845536759606982982654369800245696528893058665897330942472105350178781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_exp_mul VALUES (9,5,'-35812445701642379.972368737320206275515144213236752803936806738624588812089615098329765811617509505790110909629109400553415312470540217508070421816878544125783329593128638405659896184248784794258084116406472768709113030915308410565617764394827427154923321461158387012978726512246146545834669665093228316853342805604075936530371665576147966721599968786161939347726656168798065647411457701453987215491345496003650288850096338695703984042549594979897253521041581573388369367579323607093487743440894765114619634001789457486407909224339065748496715380572175183589195611952939575073075140094901024063428239223964510824958346570603142906309198033196987949067156046076497974760641964978711558209708743776024313916111738542765749928287600981397080809041007714387564206594515733287925008053261840295560398311905155157989225181164097547541'); +INSERT INTO num_exp_div VALUES (9,5,'-.084049034261605466896663277055600903951276881294745183935726262038673990196778002490449355450474227878560465916800470848046625257516764244432096856845087412397406701521972651300484716852035267197801389708234913163750232707469240634303111868882057393120649919262424619226282082184091177505826009374043368623853156698509808569378758387708910629731005691079770517679511879694426434724918004419953301426679939010592502325130576915399009756468717124460489039474155719834555522581553817856854607844133431854471292027873672356863673617090151801474016666978499651970627896504709551656249007718965259502928591648533670568214972768900993459927860068104745163979267716597907297073374689384723943955361288974065531322408839914599555769945298758102515352082822617428033648130099822033393662643586331479103933840387663729387'); +INSERT INTO num_exp_add VALUES (9,6,'54863480.39378734225015137845671346015520435061071252892396685718794832880965812803098645730572474084523997120024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (9,6,'54863480.29991319786000907666775218153965190979471954789486608982086888806174552071503445206767644474235809840024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (9,6,'2575131.137912978352131546639620215541477987701194164886305951830806120142596646541302305984776928560906754259789485960991272272782091464270104432109904222200473616116525297615725803495463468272171161659654385929185160689572943852767523792651123455283534072794326647404332228203001469884016996499768656263775233430922446983838511590562929268821678518640501686017030536100955531423152839988008496919169395159653034847677470665418765966542111749439412'); +INSERT INTO num_exp_div VALUES (9,6,'1168873084.346566233232746391559830634361431940000227460271861554316197556566224118756340501278103405856646766537018954185964066240457859194626558143313125824412559635129130086906976028635444060218797992547370132082916380788496584864016645155338102476357490305222392452114945853620686975383081427840791892729407194179236897452655907829255937027286698570784397487382242990326347080472574546312522326038419753951437799831430690304084087684303035538181812523230890783372773953961677974396907303758903934808035747944477277528267001070234880092255363221274303820343225415479126819937070570562654065195009839593938440374000473302075568746771126391307584779249330981594640387657042725725493800876630516005713789705652827210295338592985225924959199657729900181287069808881130884115897407246324220524401243575641227725030779990490'); +INSERT INTO num_exp_add VALUES (9,7,'-818934540016982261.65314972994491977243776717915257186979728396159058352649559139156429817562698954531329940720620096519975256547379603654362598494779213610069399116912987384006656023443527501447464682173445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_sub VALUES (9,7,'818934540126709222.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_mul VALUES (9,7,'-44929599044588573810654775.83678007633232843418115790847152455559258007804727916986432256198687661496804050903769496933400455947645400628259699874770581538122521805603947464462448454681701547899144129061961394870320463199545502030106801911915987309444301341575451240764927967432593181449618816978119423290767783843864768557371257918447461479570164065303599994081990686'); +INSERT INTO num_exp_div VALUES (9,7,'-.000000000066993731076524206362744068866774567920404984046399050881532938231826344009126898802592302273719505485084766150904380671495128604515800845609713368334606489445184535043833069145643553083555507533900955661105251251918425885537513359541698046533092111969478225528665278023069818968531644884466229545497943710817187632203193468836772459599856856811131193744272314519908999458320275710240994009061040198159739169960258978462113813370513611735006229733329565083659159456172425715216475781507996483885669437855000029758892126410922067202159414570164537031153818197618428471046051340835826664787585016361564969663413176434498159140395476980277574789931364078570781760777773379636490084338326576889857824344578398580499610233575273027387501809967324874264742269453420400624883982643066864175851881870402856698'); +INSERT INTO num_exp_add VALUES (9,8,'8551849703.98748751358673528924211852802333963452553842636251612056366144128630740476125273064380199240146487881028508694029546139131732304020786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +INSERT INTO num_exp_sub VALUES (9,8,'-8442122743.29378697347657483411765288632848337412010634954368317355484422441490375601523182127040080681386680920979021788788753447856929293579213610069399116912987384006656023443527501447464682173445385303315267086044455246361273561294141518329233754041352632499787199926225490924591851865949646448441825186059741089695009429827829188117479084665641367'); +INSERT INTO num_exp_mul VALUES (9,8,'466174236688165594.9218054325256670866060556227711696100465581464881295978997280335378678072434776702952026828137140986670189756965420183565968027969700090735690246176791371115610886533930223141650377886909408268207750238603105232560663571044993507074695683027062426288270199495225881785499139012931143826099668999261931834700467395442768201666740663642498098541516326470052372008385656719236306238735524802875519713512894448940917708118676095378518264553310312628830009314653641136566040400'); +INSERT INTO num_exp_div VALUES (9,8,'.006456816440893715330247418029019114736889626790871612141686117271826070935285769018710680035004320626745647926106882508048159628931624522666638442625219959259156539178378186912871506893482633695438850964052285542425753626455183282159259999492971992739484319464700978750304962671213318202670228197968646486740006148091321740497272644910882302412140576608739962605210964504469426861972705740810533465451230811358870068391007718532021526225893542801514255726272411690175555142385382688220121052891017808391607717500701760375927811435030512071347521837090721052128992926357375527600337655573639413811262412492632491693179011503973930804928749370652038245414768103001067902012962988384812280453070895781287237746786414435546976395632454474312533482077585837153357017362048554313154580576238549196250793055676215164'); +INSERT INTO num_exp_add VALUES (9,9,'109726960.69370054011016045512446564169485626040543207681883294700881721687140364874602090937340118558759806960049486905240792691274803010441572779861201766174025231986687953112944997105070635653109229393369465827911089507277452877411716963341532491917294735000425600147549018150816296268100707103116349627880517820609981140344341623765041830668717266'); +INSERT INTO num_exp_sub VALUES (9,9,'0'); +INSERT INTO num_exp_mul VALUES (9,9,'3010001475769225.8286280957637941018500905354415197182850820227163907782811814730309044010416886791014702373809932926301368137684091094408663914110947072451332976891128659038142954192986392936981664792370678656287232795203974766040821110221158579481177539669363513848425151485663431478439528936592701070340012569297177488556353760756495238304538439278682066056721729656193616571456456325016960870401748115848423105783116854283646624807603476682295234280408938557209608025246638166902335016025467565869375885610813662767004038102486303756741615124814580306266901273803721191779461890468156043551004644728343579032524687612403663816107770451694666844862368101122025340182510019516924578414085461628689'); +INSERT INTO num_exp_div VALUES (9,9,'1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_sqrt VALUES (0,'0'); +INSERT INTO num_exp_sqrt VALUES (1,'291.964716019333021494947753821238960905461614737525349376826064492714634914263808902604580614735501799528494357560837535773816469841426747889103714048646989532842972129124080559131220979335403729022278994440514872845756198274805589586120535745968205107562348427941379641465378272611453955517402598409789621997041856848783989993820946766177453801729783316269310186191833995557234577548740940419224137195404391193633808203715191863638616433190672511651125299379882126530500870287424768024674231651229908224729856278167033444719242144302972892419034855417126978468296581589282861879645409909873113678361180607775255758820910366926076380306290306477790931129670172989289536405788838857428768869345763784112862591549008321546447442552533919976570125718481191724503352619626562352280522949665158335559389298720990302071'); +INSERT INTO num_exp_sqrt VALUES (2,'31541679188064906.712574384704440356216787857626740375004266523720148374188511622980520374202725176835435173058936870163875556102907654264048353814040480579464700545975346621546520503928314632418705230212623378642743044255181848913683862360044189531298446109955034944189751302497670367665492719604026161836224535961347218522748523360100432275693829501972749859329753224444694962089604095212784768854310289429208671271394086829270986183171968944659703708706544668326267327938226750760690620258967209626420981505237183055363540806281098871221581265173394406715458619627534396065960117454160969749739483126059760636526242783235685190739315590041294766649891987044641492234243404608847939002062827210734973778130441825067858641461599799772535304379732674727995848518807202053316225824685704785148921785964036119338754973714515974054'); +INSERT INTO num_exp_sqrt VALUES (3,'7765438138915239878.949520541017683429203286303188179443533225547096446554008374834292278237558244698868300666061834105683999048386497322007336816482648302911579331582895326423063492240235074387242190187374869842856897538718280497895072291181675294000739548676781615025944675912072664211455701112700937190832332966000160156597821149428032612782336278939437593991008833233156511435294360065004167893309428565243314846456225604669764879344135321428948841659419438769652686215993544390780212859309497190065178705035652106614050448518931820975038314187040226298661787490226917902356569717171481159691409131778764973037046501816919243659681416263730519167614043077472097520207347950292377914586524327206547377189493301153212000966249655331053184913579513686655963686155890934436604123384536027235444923674128269748280097789270784333442'); +INSERT INTO num_exp_sqrt VALUES (4,'2308544622905.016172868282330339228589083058636874526727829838244942341440716909466939214393597311710652963849541394758298277969240038668406494621950956862959196896847352631445328917063551082418729435554972200530109505384839391233286173517804321019323644218483570886304028175359854335870835404627608254205407525763332087823548640923282031978903399118139052814618531713327991857575390136755426466065839913887477577516426991104516201265995293600539957187007068885368699949673989051443005684755994465547159213587471972139403333249259808344536605314911144950465968669770276463111776581675944967401948957460097365849699783091843609965345747287667911324039374314413430490112443463386381631812537639503425989372084906324702158112088898424705684574998783112519152403201231176840068666882123684602080460378627639651465436618032671756'); +INSERT INTO num_exp_sqrt VALUES (5,'25549.082770905117529972076915050747181125832857399138345044265535151111965091602789684342996759657333588444489085160336703294705499665424408218434077722506748278242942379566431768762487954917389137120540138359870652558814224523699917122023018717544160579704907452934297025088008618627873220397030397424422097405152321366495319708580932627092620533785271831833326130796638935296720064431288560292191928489034307645738331451165431755179025359993690642194334018457793169983249853388987495489562746304107188105521296156525984787815685365255240654972150342496329030279439124533240114879332406941960563154881888172285475336782757262639979527682925214971861707635327995621436598536743180180978457735632181738067997521785965451385630326464388080990200265186437768409003553910194212076755448477164192901658547251079126833187'); +INSERT INTO num_exp_sqrt VALUES (6,'.216649653115510782473161631235601739254284877523828136703593069337209747459679979369185882839688430004369697316986054374456779366220242645866798278985273820408495361607183119980716020227424205519727777568954933592987351750339481522149106749713967143685591960510946511796062486795368200503801097611436787402191532618456991115230272084771674098613479989808680789347124789253499967359190605681912854639520917409710307182238065185749856554472717209097115325999946728168357936779767099041518574001682560265549916593333117469681763348860131760281253987626822958726920016922608371657319505153308390495179319529587670415367205193280809809356733443291197315823747505896510820272670040485083775482983378341120809542502350385555577946098824446199419354197416933858522419312733314383889554606932774046771497129486979593226'); +INSERT INTO num_exp_sqrt VALUES (7,'904950020.759072496304165474991957396337281699986101765045213964054286624338102141970514306010139529492299343393832200631760194440206005974547202512275476562767685193838576516154915404389465528270010938533075930081897392863141132529694804621418663424569202655893682412466871297412964570322984865326770090075582481194532433411398133265643849129084449161396724635797324126396071308557057830046688990212282866035593809633839882468628249964862932050189148498591642162462777480125024786829078066012617362076651920045684345679767223337287825546294839320770903419463644110383560050404456170063805115223954191445548226706113970164823214416171441655706141596091717118495955441099867737827763335880891937222647408575142200256804313345924443344596462585960919126827045197885802122062165934504665811115031150357820196176799560314653'); +INSERT INTO num_exp_sqrt VALUES (8,'92179.098626752893864900181023972781406074846653380680747862421481598042923358730531575438403865501429843141967819802251116774924400485954931201776260931315313253827346015775662310076094882239170765060649024538403329505426563390044695320714825481746233901773893996663258170360232639353378395244461670781152793416950717050461856097473105730100523010642696332151571372764781034028324977128554099993021459338419164426784774496292405945103200724413639660488309795423335142455569853549710795692020963174011003447023610692365550245567840477105794884132665155376243735213346877116105595296043532605899184658904822980397411096930267453332143879534914237169761039374689145860503772331147367757318826885494994339695470190886515765452545019167989882527248872835783707554463866334705735781549392895480816605355996057201589681125'); +INSERT INTO num_exp_sqrt VALUES (9,'7406.988615277484686670011157489572203134420118818648711986549881046321377798441006745317356200279801348355202517703531020643333388857073977704009782384103170022716610432579974132111487533733493986910583223121269323909760573942980360508642443245341392335557152177332615977623338526935953706604224108508582338123915133189529507760875123300397933931420500010248194253078118618381590347297853307090813639981736227771834732256867579490224181748450683295253634852775448770576585177080941820456051588076218688792321741398867304684922665590162004919486643750098085197190000638539994723704724550600891137853975703823903659121582583388450687255538838161486019214242094423895463814933532217776443473765708693285683261505695170847285063013324823850724236845500162436661946026097459146424122412596018946436589967013641971183281'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_ln VALUES (0,'NaN'); +INSERT INTO num_exp_ln VALUES (1,'11.353265918833698201334218522735144514838241118349715803442713722607336732214173255618762341321138898556011520430414052782971985419141860417968593746833898952016980791997105866598425597066404919489902082738711038276194174786383758877067916049129476352925010880025206629976454341252818402788928939407784629386362069592202090897264194883276572978998896242281239126931595483958092059051047739223830394259082355969005503976135238921488192773135287876801394308064862257453262299764712613486466254696464150007113953810688169396432889052881763511661127351872408811370081346456019961324265446884877073712053408327408917588393884214304220369626106333713688792094943405258431214313197283237071070354654837081449831786573831004911008790533179001070424813584405346221388686999574752038655226138085374176702005198770598232862'); +INSERT INTO num_exp_ln VALUES (2,'75.980172429959420723484178622920965327708652620924912610122049843800380131746381968266727388919414524075492921510147435877107720844487333947572033626887969846858337336557672107987074468763307953130616555202495401302128216460637786993535376622372745654109623249396257174895352222213037880060756992073605135503615371392439827458529942230210514752764526895030759481226199720092008002458654297737883219558685499445394647863430593136350562417924068100891680398878483362058595716232013516337079804607378041880078724811071904523716775991447489914128580100888252698281559809224785596795038122963619830942475652745611551345360922016753939774272970008770647516790944335173711498988149783075646985898883858697162003144539047532603946093022417842140993960433780913606807466518632121884254341907122163281927271483110212890483'); +INSERT INTO num_exp_ln VALUES (3,'86.992429107491709045555322727377654177072455841678650084144967727028762699430180506209786297136121512625728883607972513154010138109866327600596617277403558404624813332464431424791338402731178416819791932126837396086742033973404980654712734845137075562739300866280737071167943367603243180515859476717635339619107593771719314284984269343476343816253634799874584843436046260962736006310389088154751401911743739429257286834178656182340416539923956100441369280015412718483971113838923221170027312390404790743389872757674342133486652087007983701950040432125562287337697971646750563062524010514537132255605131615248097901911480464339325353279118429890601202554448469387179349495284716473293965884844451619766312048304583068386805927433174443889441171878078987788018564357316138422561213329104267180509029624308926098065'); +INSERT INTO num_exp_ln VALUES (4,'56.935276817066740776567329017240462885579486075188456418197311631774373422196025180114152248099799048545382060930401786002025479108787121595516444894009593031141335985913019897883627990503003577804436730367402618412514152465206336556967419434371593632864308139215157721913158949066717186782560422199668568894551013785702491365073449320535603830475158258853167712460432995074161536886421366716995573365924430692151761737886552457036412140640821310927642146210426044265504978418405684030862182425702683702307323138985481047994648222224089112998195621687911787785594701557252468626097576375468916953563766801336922479861708649876362257086586679701715813254414915314296890025577780265459584203893089574567331742100451277992780400302806430264717887468808962517029442262560742822875484362427192693300423729233467613910'); +INSERT INTO num_exp_ln VALUES (5,'20.296713391219923821414834924710998522858242536565236229645868008008504475111229451635162536658197320282791428572861452713483981402773630985812066048575864982038046409484905688236579134672910905547858248343712686247795669280482288748331949478864729205285910525962001251260319741279139167559906461672936902355959755164523720443059989357054368460911050707727029320725144824995614445423492687177126412520389766864793826362309254124276325522276592246655562770110024099522184080118637524912964002223613671995639705240767929562023556724031894855094820328152633412077228479168557819219970917880393852962560319397442566813746504969336443969816954424715197797253670026862362130664772772977978222813915593329422557592316429203293264572088112274848838446633519530653849595288125585730314673691986554304725866754516304420665'); +INSERT INTO num_exp_ln VALUES (6,'-3.058947463851998053084898503420969773173569760507671013593014983772013099601022840164736581595033399273677583253456908293015637115395777673836877852797643436458673662566205707359569792482081945396989472318998080581824382006377064185813936544714612287417301161454496258176319380348780934551188852900784476213986897306897793456700682073399936398243222895442594762628402487110466705108765286617060826203345783502301472192906817785365563881556293576463515218574477264521950513789471494214626744754200844840310516235570475410854073969787604451971790833680742315518808178608136598148628107328076871698598743664423452623124027059698038466681488746505289551548778131621576387262707147068500249466398507704796800459013580425992071957391417767257856002976954566094297724379688683375704613872658653366052459242767328235849'); +INSERT INTO num_exp_ln VALUES (7,'41.246780548917246608934265057073076900048579756649769602488660179351587788197892095257027979113051775079905924990472069951828742350559917110289416201523653941731339141666097617614477426376799479821365070373247490598890520285155435501242427296281987676879064510605563522117334502131946383957407685328562874307957108543536378261847119286989184256009392692140821396916222386573424618796707564187152459973446833193743614720624765332006827171872712331032607870580880807058576154429597725560836582655488602546786785520452359711161305828045237044625934404295366273012300148250900116489718279757540843657039519736455668388572899273464839528462223812926410544976290646668870192676914370659142463304861500879195867873346447316374869974900582948166687948531910220128160490935170837209017355954301127162240133341813847180541'); +INSERT INTO num_exp_ln VALUES (8,'22.862977375646110045361670561177818139082238721442691850491173190000619222046296383571431877856442345505931635735363450488731186880557789439424987680284612480261693386095598289519783790826332183796775862215503493910816035128476952347072320869461206895223935484838130924268616681347949695029657753251443811448783435000569829291535036468240771401957519222523032235686030017496209956550934543164421459898155836108824017735809352580723262896259290484291175350770265895317482371895188221452083719817251845416195168686335127805092334984596224320638378502008767433534450949989322562311171685891891122105437154553106840103473941148230953978989145470651955269817951560544095229079088083494695756914405635176899994279484466773598435268700064279990885608144109747858515514066444373797446449729058958270758597627587968112958'); +INSERT INTO num_exp_ln VALUES (9,'17.820358481980064387183481028572263407130633079314879566896470101569251997264841660326428805413719418277889123643557369421967068805165885825106611310020187894256310674762734896979157570968168599492401269694048046876387337971177513661006711375440365724346137980004810780215236524986274043416621637509807126148966029923572853117418545426960105154053049098579812135003711132897895016476695223444397389521434633067499404903493027304737402519428197015899833229473322655155458942323004249812974150129789653469524573801259946118454333405580647485894435301530550214095993989552176497867244278699359917247910082169086524111229983698975613609318418313798992088206507831757327320958918656453341769110558376097374227592021075267882222057385413453949580066342977546145482215220982989992069525148522710254796105001938615214263'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_log10 VALUES (0,'NaN'); +INSERT INTO num_exp_log10 VALUES (1,'4.930660740129727276654889314296515979425461685461970306647398411855044094312185293195497201658739777714943974003690119189101973212927970410047992001003936259467465542044528955416040460487922970233600641954269411521809500203864460110903973264337093883907933081597350982496469748131390809569321256206859934619579029279954574676601709408712255490686948453752571699579252140062805776361984468580258289509013081691778727372026090522694670379557247829136504595898935235926069699309392675806881162434168418505908116911054206058735257796918687777716036307205415038158583184624809880157060625643069601549803887864772092583549388533013233603450097615537162442973385137488450178790573546382354482351187412256794374383453695483855501587939419102008302408157959291557415763034668013452188944554607063362933134950906875499201'); +INSERT INTO num_exp_log10 VALUES (2,'32.997769620388965086774969704518222090258389987679691893351902336370051104718852164011301929506188893338106627980171059175447833290713847317665944354651476245003161501753612545484635275306181777040447675475670149066399611203341262105766118892586541910243351018829302798733989560900125591073082441126709911019648451232244139674063434385451279378543163944005973452562993913383659295688375546058256196254319767218634546732685705517341998116744642480938405113447415486950667007645850519659606476727681944251201236366198374488204017630268083077471516734133869728427050843306716313813724061560369884508660845630727190444623729815564381063131729592825825486515070406390371638817503915214206586939112681762984038333298146999891250107667687034785493312416966635780188163871680959873288697497561452228182734430749066579749'); +INSERT INTO num_exp_log10 VALUES (3,'37.780331928743475574895606142114739140772838801045013007323050327909196792739138159615327729728110344767302636436234256468332011934881494997184865617793179255006442447189720642997935223133982347184994174261506212652322213673745795726283311685835974151422721233207287206894148660531800622455957268888702309499182978182878524951883775154983702898237404558813230370364953160102391101897560104513279410610948028599674950811462114131673380477843456965645417025376374320207504913806546872166094337441573669261285052323206348035827948287081776955945081345131570610652073053464020209215624179904586956137079321655773178387441622685682721151900601340680061607114354850640946256225260430676099781727317540719923791064452012925902993317349390523278687089530234444415688602090547516647302454865526291471706301790881694022223'); +INSERT INTO num_exp_log10 VALUES (4,'24.726676547286224970759328746582840552419566534667446425423046931401641497155587075591229106937829957279943690528061985864558314570189069764367933957499905044566413640017549478921384160584906257607957223101377816440084188042395098536074479064548620374152344954289432050971466476174493306432228880930006524504974367146536665170956555486181410864034862861231267121149652317599303804477688621597163730470970207231328339082779056152481480926452142005969020950341307977091850953883445808399574256295803245530993204179747743812544604144379381347499056545148243304041538981954204310612049423688645476667184129189153715486929216331980316967699254518020077226689317148303152585009031597809279387172427408557115400021035692880631275593381822805377317270568779655383061987766693697518921188619814204902583361096973421134004'); +INSERT INTO num_exp_log10 VALUES (5,'8.814750626578650238811431417807018895270298639823442501111235973209197727215795256506525221092818797578008152140054383421240180435087611869193019443372556081555311825248667278358330916098378127100899126895012782320751838528480712942601038190627182482614147263228588284866661508052724762701223357327343090598060805245853527435948381893458352744679795853650453594546267600486696643924152372736774331080527157374379043696696647158270918245668579680394279565181670004245143555617589138267976417280970718829942998800499312890580011246294669585429723974582350357991472101919333996770115834067969654217063942059882195268353998096891812525364797586486311202350700339609637274043915687880562465121559531284337603363356183320193656553931871200575467929714875483123706358278876389849119105053294688326141759401230994901405'); +INSERT INTO num_exp_log10 VALUES (6,'-1.328484003982869642690619298690906747763234110040562640557173509402512757735587333095924652711056556491908059708986413635120656426593745303715671199761364516107844087845783714418487426723538440387069985879601248897538855843115404484229652166941838283489828419407478748732927617251897244190697443966424660881366993754577233476597163021768156814527570512834684713730559883782625870597080940193303268818336816535968869931456641949301731046034660616615392129109391145214470757259042172416816936479713743188047425796931722546185493217275537303458837771965375448968719169174136287532752370175863826715450565025635651343928205805494319778539652563499901671319955144823432132740582617949774638538594081514904904341299199113721131520557004571803778698005652464301037962272085633628653321081368256925971558076970172779715'); +INSERT INTO num_exp_log10 VALUES (7,'17.913249188669140643510654105014358282516966474257460687880559542190804665566625978925406311113121982595279826214959603627387555578965653325278444455875162277940655989601428868642914577248262147833499137348602966573601719040813549936948178463592211685237720748377879836890106515699728652218324794927458352954247096536337594789471529493944292143186953509162522579060020018226817623648563806559917579317916242706559131476179714031602207057714677845347616752450567251644277767418397621490301286115159509360375419599968738067461569666699939732107480135216621373057421990702923042287910730395998082514702629760389192370666675364405730936537832803383367187639209534697198515928978064543150195911463663617683085348965065679311986715357338675515370634753254774665197233934933271954463040729779956682570415317734489164385'); +INSERT INTO num_exp_log10 VALUES (8,'9.929264914121995501917993119394933531225401243275938207624866270551448544301376913376130982251708700134720886862945040266148728213253651323129942781577143957084726727561987639140151337848818195806259935747329665025823709044567138449084349729747202164413995795609659711723455165142329822773177102845804114214340046404641970845707372809306219463962664551623665322610139794354769767829380018857313559373283673392337954610346290037758389035140213224696023751541663171574697035012610534455189013755134090933979479069288110010954211669067225249755249337768792642303351914884187159646984708862430789018895140670365476746734456807215043628059581947593694929159076346249490593187993386780521089745819640214783614157516171005086731241769146397577246387886107367648843380733370112546792442909347322732196805316614555689762'); +INSERT INTO num_exp_log10 VALUES (9,'7.739283354261751283625223433456284905560931805428759681411970457812279544250432389511382263439324085689734710188041049046660480575958686859942980599595036769090747781359217248301544587434077376812293034848418204834388504169166350770257248896025815531248627658465029806509131631454856186387892627989218208026727504548130018922325585619738185507999433763118148418722504204066578294826264005398891049629199412773138457218976050467479292777172717500219850781664314597312411301296201533610562886229900497272268364496763758868455934979903774531992886483396489868888731578355541611359130188566524240259770918423445785338175040098706500034487703124623745259139247432324145633151895802637182446905097253961951018926565652497920605819785424451050191604602898777804133717341512568151920576684198443843944721398831404081859'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_exp_power_10_ln VALUES (0,'NaN'); +INSERT INTO num_exp_power_10_ln VALUES (1,'225561990715.277245515991117670624124484084762557459065170589803293759247930753528436379932442146759103295277479258327642314622036941865221478746258727236601688778946696303277607709407496616423493315166963938393760548678730128692212077086588682984700837334554241405763691119669847463520746595280034536307041368063462023793177898200220207765205127584303464304601759554817607633012272490650155253979182893585119965271975927569080191838676053084168631217591768468344106219831174026139608715965691941366334940196517120885214887008671956523579678156919416435031020452971977153991139145404842034138317592877675821045409772456977018293365238179815614004574330200783530118851005077771478448804470170641452481992602803877112958872108069738434946694089025321283178188028224338756015337492913115267362635647236447601252924834642796058'); +INSERT INTO num_exp_power_10_ln VALUES (2,'9553718264533556311125292459627965006385666643531070061102266984368939757379.536714147420215784125170401370065894858487440153494392538261078415409784085960333028254155527328359894197540839556987826344995348426293585457768226283066583722499658006242709930685932246087653832230889613022921575445199055131152661556678809191264086381976922223866204038615136758192929883317207903579770917317641181652055458721731297347443662717939116561947785705140374908203404860090658919334137955075887697259604047657534191202566335372150375993361370075961180728155127447781364264047857624746079509591666068708743260905728661917791822925979235918475633100283148558978385583805341715868143937062092264994833222352433299015979561976964779350640064096690062929265992966564232453102431600199173711947391200249130712039686700111791790265309426741120465259677894665532560198051256215915373145226284270408649736509'); +INSERT INTO num_exp_power_10_ln VALUES (3,'982718444846268846508445482774217796844461660819285525931206164100817251856409365450682.362683768066405322653747385034480250394145008573806022660379219602846285813744865438912887625784087005970975437905783802114553690522787857272953842288090141945268495451006273685577260054069522075046955466204804067271437138871789034722069934693546671607506851844248427950939791205412350536883779850165603116191193657054604569586553874805856647223849267039531773072343908345333155562072887754900969504551717514980465801806565999410206735831440712124661645970935112535081991606671600328471264697018198676317466846450405861359235297846597981143547119390922405594115478086038680663368675222949247096131378724350715530605691796680604309063173515781378545860473572389718345696107553363715518601596249508215455106779522851210398208919496668879040223859884166805448827948087400426315425231119801173387715922086154065273'); +INSERT INTO num_exp_power_10_ln VALUES (4,'861542720105376650266753999919217194383259935058507531116.774511336660822591851369622743235084609149542494189385785321912210129989390054947787009383210009523204976629456268332186620016067379702483800883493431423160815760933380418976582725913410929214462739708321325884209636272001805871036779154087677637129248122540412937033791526383240502286607736226090213753913654673523613612439527815137888202973659987501649474772884055648603290154867585312925699571949539600328906295652872654314913539778815035321695215634102441494403825526533235061083947035338872599854931230001361227174477274708230470794066733245241594719912710139298949856243576688344051439047966427547889756037265151798639614843866387316916203238068277912991427278268083231579195846744438643659745041780103653332041031419793815914447232121937821142169172566753399257291244398531365781832297786941359729799400'); +INSERT INTO num_exp_power_10_ln VALUES (5,'198021976607570296508.271597639984889464620426933601643322058775615235389194561064983706229795978402690473201671702614911129095149240715527556855309177671128442458698638704394974473956869419481315262823632891676087912529523219333012290621046361106033860210270638559271706082115529424772192777643046125905852037759566224116373416253787241195450409652089019290072319861181399387753223422998872180810295299831487867222464355713552301775702554189470264147325049133532522718679336524769566984150923939420759804463781082299907043016120177416779442865059261387111806785876531152192378576258351599534512031062777609734092707165605364139201322351960602280089186180302246827234844736393745487324460438448807241887783263546165171099497316415863122023114646876909575845860402164818094500541234974716577550807551946414081410743197768993152975501'); +INSERT INTO num_exp_power_10_ln VALUES (6,'.000873076977206566818052116526263730226812004454463281371489634779519089200224205946321120805055212090024554381349223642352209212670470260295303361873760972918129853308169576675500721645609379420329169271088810484607337679253503247351324049221970104335289487989027621978310506220905131150125321713385148268584530413680037620544212746920563790371941626294733473967065607791756894237438288480748407449237446113996117912144587258434808327522518688617394025018756570740098795745692805352377041347367240475846033282850136270250633825482156304826383360291164928049344226886150285595932088884965511963310715773499733217615863523253012606066583814112265708693122563204149232245895551314975524172504103194858904869273185785182598234060315036187756490539352752560361560286717869643902435677448962235275054804452967413005'); +INSERT INTO num_exp_power_10_ln VALUES (7,'176514565873872717825163931126806100435750.096278384530154766967061948052237623936423931849868926020451465515367348890410352640552194499619062823622476972850692557798609619250753020363520533767813563613425606228355802781302735485038377521515850536680425059519814786118919994914180918228654298075183514200191737597656810036850772127169441661576862538643715648802139886576391427423689320082366572297580054381937437005879583216745596935643579262248665490169331304003204939561361718554509909313409421397022626924406091551900222555950699170864234411017062042057683304265485826061096835531732950909546314722726990314852356462874701181085379772134121978510387397276859318242238150439474660772561390798432890789762504242822787017140808209820627435991445529404692793744568204608385843245177656436105160780897472099970336514833257055017279707999437302548655364559'); +INSERT INTO num_exp_power_10_ln VALUES (8,'72941951052009383458167.300747500436981484566111756088702608000390737594784514635592222758882092500858797317505303492923829092720870826490477962201959426813271424853341826896270963213736922458746003100613943600855942721319226948714369219316345322636075285343544788982588956431405042577296229122673590336976893594798942025893296105815818487227300314490440902574022885833779324177053242170024559675073866612316965636832258283516275906085642459351367507561963945012828379111856700009391438637054015804558386733558956649061672420804826896303889067785497738203077050774825608647969196321506624991188638449047860249367840775936911749905927108478444112230174584693363226143549933224252679398881354887872642908328737917862751077365602631600279486028043329404269490375935308156815477700961014566228692743960491745353377403533037122586797765130'); +INSERT INTO num_exp_power_10_ln VALUES (9,'661239032819374816.097553651299556484820492272269662685578275493609248662925676004753503494252951243895572437264999063878330704584509915845096232798927524470286655554736724913758600775591269525423912692080421094644542553026831758426157681271572808657664918053119324646138457659418857926209701677786068580819823633713337632456905824562235373422309621872998037966404189020165296080436871220718574009921789858751384547836431858428729570977259373272041837411903005303672798845573379758630607982213326716018594073712340609488043353995410508475153538231445235003980586600882223782814368245305160648543466496726973755388826656879616734762068443462618454921858705377028522664844761719759342490380417060255776725333319537746890406213693117052223545525717132695297770810635066731941724108167146710297146989770382041617889670713111888375717'); +COMMIT TRANSACTION; +BEGIN TRANSACTION; +INSERT INTO num_data VALUES (0, '0'); +INSERT INTO num_data VALUES (1, '85243.39540024977626076239847863600785982737155858270959890014613035727868293618673807776733416230953723818527101593495895350807775607346277892835514324320448949370623441059033804864158715021903312693889518990256881059434042443507529601095150710777634743301398926463888783847290873199395304998050753365215426971278237920063435565949203678024225270616295573678510929020831006146661747271783837653203039829647102027431761129518881525935216608429897041525858540380754759125150233053469999022855035'); +INSERT INTO num_data VALUES (2, '-994877526002806872754342148749241.04353023451866590387054959174736129501310680280823383331007646306243540953499740615246583399296334239109936336446284803020643582102868247857009494139535009572740621288230740389545481395'); +INSERT INTO num_data VALUES (3, '-60302029489319384367663884408085757480.2322712404088283093870869198708849258097125725036189625900174440196153781995220721511009855207486224837798752903681993777275846325950111427710563453217985216966456785944859989497422927661683538629473170704026975786513125842675604577233871570629808699803522400038975396500769162308448069085909755023233588510630417065084295051270219462289785473643946404281422516357503746700705970360169619852905053433235726497292406142332833'); +INSERT INTO num_data VALUES (4, '5329378275943663322215245.24931765987630429629836382184742348353920297283690739124220773955591340709935970062776650204659187764581615597720798385015942389765692769739983054442503547211560297249686289665792078548480268091496050883021187158502798880896590227542729659940394038802461081290690995869705131152889309663639310553909874081663091069118126221594338242710530718836025225507189149221049928936955230868771875644038572888630664890573507822342998964954667474300944699078658989010257103569231493090050659723450626338923049035040974032671138430612839043269997482582763267536489504794826476836323549796385028155416935072959933315468068930689064483178204550825728947252440604703474049780550458442808479096492346910001692358508618202898514895453589357'); +INSERT INTO num_data VALUES (5, '-652755630.43456071828048833552593835051449845484289562110789582081210403487973096161149072377955192388469356112505543620695003436531392789029513380101663750625024853263344909355177280161504414335005574882649025508632900995595004153086358670541462762210415346958050909878501048483523600711486406055424807840429541335391538322886495085448421556770991545781035298449067051916630343957356635391594362639819978677032855590055900561501350354631803808000307050416047072513406855040715556454205065332997338225626635780147287003130754254277103928406089109802521803537038957372612837169223905290912251006321930223154562110264217937'); +INSERT INTO num_data VALUES (6, '0.0469370721950711508944806393077762204079964905145503836835397203739563036579760026190241480514409364'); +INSERT INTO num_data VALUES (7, '-818934540071845742'); +INSERT INTO num_data VALUES (8, '8496986223.64063724353165506167988570717591150432282238795309964705925283285060558038824227595710139960766584401003765241409149793494330798800'); +INSERT INTO num_data VALUES (9, '054863480.34685027005508022756223282084742813020271603840941647350440860843570182437301045468670059279379903480024743452620396345637401505220786389930600883087012615993343976556472498552535317826554614696684732913955544753638726438705858481670766245958647367500212800073774509075408148134050353551558174813940258910304990570172170811882520915334358633'); +COMMIT TRANSACTION; + +-- ****************************** +-- * Create indices for faster checks +-- ****************************** + +CREATE UNIQUE INDEX num_exp_add_idx ON num_exp_add (id1, id2); +CREATE UNIQUE INDEX num_exp_sub_idx ON num_exp_sub (id1, id2); +CREATE UNIQUE INDEX num_exp_div_idx ON num_exp_div (id1, id2); +CREATE UNIQUE INDEX num_exp_mul_idx ON num_exp_mul (id1, id2); +CREATE UNIQUE INDEX num_exp_sqrt_idx ON num_exp_sqrt (id); +CREATE UNIQUE INDEX num_exp_ln_idx ON num_exp_ln (id); +CREATE UNIQUE INDEX num_exp_log10_idx ON num_exp_log10 (id); +CREATE UNIQUE INDEX num_exp_power_10_ln_idx ON num_exp_power_10_ln (id); + +VACUUM ANALYZE num_exp_add; +VACUUM ANALYZE num_exp_sub; +VACUUM ANALYZE num_exp_div; +VACUUM ANALYZE num_exp_mul; +VACUUM ANALYZE num_exp_sqrt; +VACUUM ANALYZE num_exp_ln; +VACUUM ANALYZE num_exp_log10; +VACUUM ANALYZE num_exp_power_10_ln; + +-- ****************************** +-- * Now check the behaviour of the NUMERIC type +-- ****************************** + +-- ****************************** +-- * Addition check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_add t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 10) as expected + FROM num_result t1, num_exp_add t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 10); + +-- ****************************** +-- * Subtraction check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_sub t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 40) + FROM num_result t1, num_exp_sub t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 40); + +-- ****************************** +-- * Multiply check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_mul t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30) + FROM num_data t1, num_data t2; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 30) as expected + FROM num_result t1, num_exp_mul t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 30); + +-- ****************************** +-- * Division check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, t1.val / t2.val + FROM num_data t1, num_data t2 + WHERE t2.val != '0.0'; +SELECT t1.id1, t1.id2, t1.result, t2.expected + FROM num_result t1, num_exp_div t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != t2.expected; + +DELETE FROM num_result; +INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val / t2.val, 80) + FROM num_data t1, num_data t2 + WHERE t2.val != '0.0'; +SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 80) as expected + FROM num_result t1, num_exp_div t2 + WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 + AND t1.result != round(t2.expected, 80); + +-- ****************************** +-- * Square root check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, SQRT(ABS(val)) + FROM num_data; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_sqrt t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + +-- ****************************** +-- * Natural logarithm check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, LN(ABS(val)) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_ln t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + +-- ****************************** +-- * Logarithm base 10 check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, LOG('10'::numeric, ABS(val)) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_log10 t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + +-- ****************************** +-- * POW(10, LN(value)) check +-- ****************************** +DELETE FROM num_result; +INSERT INTO num_result SELECT id, 0, POW(numeric '10', LN(ABS(round(val,1000)))) + FROM num_data + WHERE val != '0.0'; +SELECT t1.id1, t1.result, t2.expected + FROM num_result t1, num_exp_power_10_ln t2 + WHERE t1.id1 = t2.id + AND t1.result != t2.expected; + + +-- +-- Test code path for raising to integer powers +-- + +-- base less than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of POW(): +-- +-- for p in {-20..20} +-- do +-- b="0.084738" +-- r=$(bc -ql <<< "scale=500 ; $b^$p" | head -n 1) +-- echo "($b, $p, $r)," +-- done + +WITH t(b, p, bc_result) AS (VALUES +(0.084738, -20, 2744326694304960114888.7859130502035257), +(0.084738, -19, 232548755422013710215.4459407000481464), +(0.084738, -18, 19705716436950597776.2364581230406798), +(0.084738, -17, 1669822999434319754.3627249884302211), +(0.084738, -16, 141497461326065387.3451885900696001), +(0.084738, -15, 11990211877848128.7928565907453178), +(0.084738, -14, 1016026574105094.7376490817865767), +(0.084738, -13, 86096059836517.5178789078924309), +(0.084738, -12, 7295607918426.8214300228969888), +(0.084738, -11, 618215223791.6519943372802450), +(0.084738, -10, 52386321633.6570066961524534), +(0.084738, -9, 4439112122.5928274334185666), +(0.084738, -8, 376161483.0442710110530225), +(0.084738, -7, 31875171.7502054369346110), +(0.084738, -6, 2701038.3037689083149651), +(0.084738, -5, 228880.5837847697527935), +(0.084738, -4, 19394.8829087538193122), +(0.084738, -3, 1643.4835879219811409), +(0.084738, -2, 139.2655122733328379), +(0.084738, -1, 11.8010809790176780), +(0.084738, 0, 1), +(0.084738, 1, .084738), +(0.084738, 2, .007180528644), +(0.084738, 3, .0006084636362353), +(0.084738, 4, .0000515599916073), +(0.084738, 5, .0000043690905688), +(0.084738, 6, .0000003702279966), +(0.084738, 7, .0000000313723800), +(0.084738, 8, .0000000026584327), +(0.084738, 9, .0000000002252703), +(0.084738, 10, .0000000000190890), +(0.084738, 11, .0000000000016176), +(0.084738, 12, .0000000000001371), +(0.084738, 13, .0000000000000116), +(0.084738, 14, .0000000000000010), +(0.084738, 15, .0000000000000001), +(0.084738, 16, .0000000000000000), +(0.084738, 17, .0000000000000000), +(0.084738, 18, .0000000000000000), +(0.084738, 19, .0000000000000000), +(0.084738, 20, .0000000000000000)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + +-- base greater than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of POW(): +-- +-- for p in {-20..20} +-- do +-- b="37.821637" +-- r=$(bc -ql <<< "scale=500 ; $b^$p" | head -n 1) +-- echo "($b, $p, $r)," +-- done + +WITH t(b, p, bc_result) AS (VALUES +(37.821637, -20, .0000000000000000), +(37.821637, -19, .0000000000000000), +(37.821637, -18, .0000000000000000), +(37.821637, -17, .0000000000000000), +(37.821637, -16, .0000000000000000), +(37.821637, -15, .0000000000000000), +(37.821637, -14, .0000000000000000), +(37.821637, -13, .0000000000000000), +(37.821637, -12, .0000000000000000), +(37.821637, -11, .0000000000000000), +(37.821637, -10, .0000000000000002), +(37.821637, -9, .0000000000000063), +(37.821637, -8, .0000000000002388), +(37.821637, -7, .0000000000090327), +(37.821637, -6, .0000000003416316), +(37.821637, -5, .0000000129210673), +(37.821637, -4, .0000004886959182), +(37.821637, -3, .0000184832796213), +(37.821637, -2, .0006990678924066), +(37.821637, -1, .0264398920649574), +(37.821637, 0, 1), +(37.821637, 1, 37.821637), +(37.821637, 2, 1430.476225359769), +(37.821637, 3, 54102.9525326873775219), +(37.821637, 4, 2046262.2313195326271135), +(37.821637, 5, 77392987.3197773940323425), +(37.821637, 6, 2927129472.7542235178972258), +(37.821637, 7, 110708828370.5116321107718772), +(37.821637, 8, 4187189119324.7924539711577286), +(37.821637, 9, 158366346921451.9852944363360812), +(37.821637, 10, 5989674486279224.5007355092228730), +(37.821637, 11, 226539294168214309.7083246628376531), +(37.821637, 12, 8568086950266418559.9938312759931069), +(37.821637, 13, 324059074417413536066.1494087598581043), +(37.821637, 14, 12256444679171401239980.3109258799733927), +(37.821637, 15, 463558801566202198479885.2069857662592280), +(37.821637, 16, 17532552720991931019508170.1002855156233684), +(37.821637, 17, 663109844696719094948877928.0672523682648687), +(37.821637, 18, 25079899837245684700124994552.6717306599041850), +(37.821637, 19, 948562867640665366544581398598.1275771806665398), +(37.821637, 20, 35876200451584291931921101974730.6901038166532866)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + +-- +-- Tests for raising to non-integer powers +-- + +-- base less than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of POW(): +-- +-- for n in {-20..20} +-- do +-- b="0.06933247" +-- p="$n.342987" +-- r=$(bc -ql <<< "scale=500 ; e($p*l($b))" | head -n 1) +-- echo "($b, $p, $r)," +-- done + +WITH t(b, p, bc_result) AS (VALUES +(0.06933247, -20.342987, 379149253615977128356318.39406340), +(0.06933247, -19.342987, 26287354251852125772450.59436685), +(0.06933247, -18.342987, 1822567200045909954554.65766042), +(0.06933247, -17.342987, 126363085720167050546.86216560), +(0.06933247, -16.342987, 8761064849800910427.02880469), +(0.06933247, -15.342987, 607426265866876128.15466179), +(0.06933247, -14.342987, 42114363355427213.14899924), +(0.06933247, -13.342987, 2919892833909256.59283660), +(0.06933247, -12.342987, 202443382310228.51544515), +(0.06933247, -11.342987, 14035899730722.44924025), +(0.06933247, -10.342987, 973143597003.32229028), +(0.06933247, -9.342987, 67470449244.92493259), +(0.06933247, -8.342987, 4677892898.16028054), +(0.06933247, -7.342987, 324329869.02491071), +(0.06933247, -6.342987, 22486590.914273551), +(0.06933247, -5.342987, 1559050.8899661435), +(0.06933247, -4.342987, 108092.84905705095), +(0.06933247, -3.342987, 7494.3442144625131), +(0.06933247, -2.342987, 519.60139541889576), +(0.06933247, -1.342987, 36.025248159838727), +(0.06933247, 0.342987, .40036522320023350), +(0.06933247, 1.342987, .02775830982657349), +(0.06933247, 2.342987, .001924552183301612), +(0.06933247, 3.342987, .0001334339565121935), +(0.06933247, 4.342987, .000009251305786862961), +(0.06933247, 5.342987, .0000006414158809285026), +(0.06933247, 6.342987, .00000004447094732199898), +(0.06933247, 7.342987, .000000003083280621074075), +(0.06933247, 8.342987, .0000000002137714611621997), +(0.06933247, 9.342987, .00000000001482130341788437), +(0.06933247, 10.342987, .000000000001027597574581366), +(0.06933247, 11.342987, .00000000000007124587801173530), +(0.06933247, 12.342987, .000000000000004939652699872298), +(0.06933247, 13.342987, .0000000000000003424783226243151), +(0.06933247, 14.342987, .00000000000000002374486802900065), +(0.06933247, 15.342987, .000000000000000001646290350274646), +(0.06933247, 16.342987, .0000000000000000001141413763217064), +(0.06933247, 17.342987, .000000000000000000007913703549583420), +(0.06933247, 18.342987, .0000000000000000000005486766139403860), +(0.06933247, 19.342987, .00000000000000000000003804110487572339), +(0.06933247, 20.342987, .000000000000000000000002637483762562946)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + +-- base greater than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of POW(): +-- +-- for n in {-20..20} +-- do +-- b="27.234987" +-- p="$n.230957" +-- r=$(bc -ql <<< "scale=500 ; e($p*l($b))" | head -n 1) +-- echo "($b, $p, $r)," +-- done + +WITH t(b, p, bc_result) AS (VALUES +(27.234987, -20.230957, .000000000000000000000000000009247064512095633), +(27.234987, -19.230957, .0000000000000000000000000002518436817750859), +(27.234987, -18.230957, .000000000000000000000000006858959399176602), +(27.234987, -17.230957, .0000000000000000000000001868036700701026), +(27.234987, -16.230957, .000000000000000000000005087595525911532), +(27.234987, -15.230957, .0000000000000000000001385605980094587), +(27.234987, -14.230957, .000000000000000000003773696085499835), +(27.234987, -13.230957, .0000000000000000001027765638305389), +(27.234987, -12.230957, .000000000000000002799118379829397), +(27.234987, -11.230957, .00000000000000007623395268611469), +(27.234987, -10.230957, .000000000000002076230710364949), +(27.234987, -9.230957, .00000000000005654611640579014), +(27.234987, -8.230957, .000000000001540032745212181), +(27.234987, -7.230957, .00000000004194277179542807), +(27.234987, -6.230957, .000000001142310844592450), +(27.234987, -5.230957, .00000003111082100243440), +(27.234987, -4.230957, .0000008473028055606278), +(27.234987, -3.230957, .00002307628089450723), +(27.234987, -2.230957, .0006284822101702527), +(27.234987, -1.230957, .01711670482371810), +(27.234987, 0.230957, 2.1451253063142300), +(27.234987, 1.230957, 58.422459830839071), +(27.234987, 2.230957, 1591.1349340009243), +(27.234987, 3.230957, 43334.539242761031), +(27.234987, 4.230957, 1180215.6129275865), +(27.234987, 5.230957, 32143156.875279851), +(27.234987, 6.230957, 875418459.63720737), +(27.234987, 7.230957, 23842010367.779367), +(27.234987, 8.230957, 649336842420.336290), +(27.234987, 9.230957, 17684680461938.907402), +(27.234987, 10.230957, 481642042480060.137900), +(27.234987, 11.230957, 13117514765597885.614921), +(27.234987, 12.230957, 357255344113366461.949871), +(27.234987, 13.230957, 9729844652608062117.440722), +(27.234987, 14.230957, 264992192625800087863.690528), +(27.234987, 15.230957, 7217058921265161257566.469315), +(27.234987, 16.230957, 196556505898890690402726.443417), +(27.234987, 17.230957, 5353213882921711267539279.451015), +(27.234987, 18.230957, 145794710509592328389185797.837767), +(27.234987, 19.230957, 3970717045397510438979206144.696206), +(27.234987, 20.230957, 108142427112079606637962972621.121293)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + +-- Inputs close to overflow +-- +-- bc(1) results computed with a scale of 2700 and truncated to 4 decimal +-- places. + +WITH t(b, p, bc_result) AS (VALUES +(0.12, -2829.8369, 58463948950011752465280493160293790845494328939320966633018493248607815580903065923369555885857984675501574162389726507612128133630191173383130639968378879506624785786843501848666498440326970769604109017960864573408272864266102690849952650095786874354625921641729880352858506454246180842452983243549491658464046163869265572232996388827878976066830374513768599285647145439771472435206769249126377164951470622827631950210853282324510655982757098065657709137845327135766013147354253426364240746381620690117663724329288646510198895137275207992825719846135857839292915100523542874885080351683587865157015032404901182924720371819942957083390475846809517968191151435281268695782594904484795360890092607679215675240583291240729468370895035823777914792823688291214492607109455017754453939895630226174304357121900605689015734289765672740769194115142607443713769825894380064727556869268488695795705030158832909348803019429370973064732712469794182891757241046263341655894972953512257981661670321890336672832647028099324621932563236459127918144141230217523147304565594514812518826936144181257723061181656522095236928347413997136815409159361412494284201481609684892562646522086577634100783077813105675590737823924220663206479031113753135119759722725207724879578900186075841393115040465401462266086907464970054073340036852442184414587772177753008511913377364966775792477387717262694468450099866775550614257191941835797445874557362115814601886902749237439492398087966544817154173072811937702110580330775581851211123491341435883319798273456296794954514173820352334127081705706502510709179711510240917772628308487366740741280043704807717608366220401933596364641284631036907635403895053036499618723044314773148779735006542501244942039455169872946018271985844759209768927953340447524637670938413827595013338859796135512187473850161303598087634723542727044978083220970836296653305188470017342167913572166172051819741354902582606590658382067039498769674611071582171914886494269818475850690414812481252963932223686078322390396586222238852602472958831686564971334200490182175112490433364675164900946902818404704835106260174052265784055642968397240262737313737007322288203637798365320295080314524864099419556398713380156353062937736280885716820226469419928595465390700629307079710611273715705695938635644841913194091407807776191951797748706106000922803167645881087385311847268311361092838264814899353459146959869764278464187826798546290981492648723002412475976344071283321798061003719251864595518596639432393032991023409676558943539937377229130132816883146259468718344018277257037013406135980469482324577407154032999045733141275895.3432), +(1.2, 32908.8896, 58463467728170833376633133695001863276259293590926929026251227859007891876739460057725441400966420577009060860805883032969522911803372870882799865787473726926215148161529632590083389287080925059682489116446754279752928005457087175157581627230586554364417068189211136840990661174760199073702207450133797324318403866058202372178813998850887986769280847189341565507156189065295823921162851958925352114220880236114784962150135485415106748467247897246441194126125699204912883449386043559785865023459356275014504597646990160571664166410683323036984805434677654413174177920726210827006973855410386789516533036723888687725436216478665958434776205940192130053647653715221076841771578099896259902368829351569726536927952661429685419815305418450230567773264738536471211804481206474781470237730069753206249915908804615495060673071058534441654604668770343616386612119048579369195201590008082689834456232255266932976831478404670192731621439902738547169253818323045451045749609624500171633897705543164388470746657118050314064066768449450440405619135824055131398727045420324382226572368236570500391463795989258779677208133531636928003546809249007993065200108076924439703799231711400266122025052209803513232429907231051873161206025860851056337427740362763618748092029386371493898291580557004812947013231371383576580415676519066503391905962989205397824064923920045371823949776899815750413244195402085917098964452866825666226141169411712884994564949174271056284898570445214367063763956186792886147126466387576513166370247576466566827375268334148320298849218878848928271566491769458471357076035396330179659440244425914213309776100351793665960978678576150833311810944729586040624059867137538839913141142139636023129691775489034134511666020819676247950267220131499463010350308195762769192775344260909521732256844149916046793599150786757764962585268686580124987490115873389726527572428003433405659445349155536369077209682951123806333170190998931670309088422483075609203671527331975811507450670132060984691061148836994322505371265263690017938762760088575875666254883673433331627055180154954694693433502522592907190906966067656027637884202418119121728966267936832338377284832958974299187166554160783467156478554899314000348357280306042140481751668215838656488457943830180819301102535170705017482946779698265096226184239631924271857062033454725540956591929965181603262502135610768915716020374362368495244256420143645126927013882334008435586481691725030031204304273292938132599127402133470745819213047706793887965197191137237066440328777206799072470374264316425913530947082957300047105685634407092811630672103242089966046839626911122.7149)) +SELECT b, p, bc_result, b^p AS power, b^p - bc_result AS diff FROM t; + +-- +-- Tests for EXP() +-- + +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of EXP(): +-- +-- for n in {-20..20} +-- do +-- x="$n.29837" +-- r=$(bc -ql <<< "scale=500 ; e($x)" | head -n 1) +-- echo "($x, $r)," +-- done + +WITH t(x, bc_result) AS (VALUES +(-20.29837, .000000001529431101152222), +(-19.29837, .000000004157424770142192), +(-18.29837, .00000001130105220586304), +(-17.29837, .00000003071944485366452), +(-16.29837, .00000008350410872606600), +(-15.29837, .0000002269877013517336), +(-14.29837, .0000006170165438681061), +(-13.29837, .000001677224859055276), +(-12.29837, .000004559169856609741), +(-11.29837, .00001239310857408049), +(-10.29837, .00003368796183504298), +(-9.29837, .00009157337449401917), +(-8.29837, .0002489222398577673), +(-7.29837, .0006766408013046928), +(-6.29837, .001839300394580514), +(-5.29837, .004999736839665763), +(-4.29837, .01359069379834070), +(-3.29837, .03694333598818056), +(-2.29837, .1004223988993283), +(-1.29837, .2729763820983097), +(0.29837, 1.3476603299656679), +(1.29837, 3.6633205858807959), +(2.29837, 9.9579377804197108), +(3.29837, 27.068481317440698), +(4.29837, 73.579760889182206), +(5.29837, 200.01052696742555), +(6.29837, 543.68498095607070), +(7.29837, 1477.8890041389891), +(8.29837, 4017.3188244304487), +(9.29837, 10920.204759575742), +(10.29837, 29684.194161006717), +(11.29837, 80690.005580314652), +(12.29837, 219338.17590722828), +(13.29837, 596222.97785597218), +(14.29837, 1620702.0864156289), +(15.29837, 4405525.0308492653), +(16.29837, 11975458.636179032), +(17.29837, 32552671.598188404), +(18.29837, 88487335.673150406), +(19.29837, 240533516.60908059), +(20.29837, 653837887.33381570)) +SELECT x, bc_result, exp(x), exp(x)-bc_result AS diff FROM t; + +-- +-- Tests for LN() +-- + +-- input very small +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(10^-$p)" | head -n 1) +-- echo "('1.0e-$p', $l)," +-- done + +WITH t(x, bc_result) AS (VALUES +('1.0e-1', -2.3025850929940457), +('1.0e-2', -4.6051701859880914), +('1.0e-3', -6.9077552789821371), +('1.0e-4', -9.2103403719761827), +('1.0e-5', -11.512925464970228), +('1.0e-6', -13.815510557964274), +('1.0e-7', -16.118095650958320), +('1.0e-8', -18.420680743952365), +('1.0e-9', -20.723265836946411), +('1.0e-10', -23.025850929940457), +('1.0e-11', -25.328436022934503), +('1.0e-12', -27.631021115928548), +('1.0e-13', -29.933606208922594), +('1.0e-14', -32.236191301916640), +('1.0e-15', -34.5387763949106853), +('1.0e-16', -36.84136148790473094), +('1.0e-17', -39.143946580898776628), +('1.0e-18', -41.4465316738928223123), +('1.0e-19', -43.74911676688686799634), +('1.0e-20', -46.051701859880913680360), +('1.0e-21', -48.3542869528749593643778), +('1.0e-22', -50.65687204586900504839581), +('1.0e-23', -52.959457138863050732413803), +('1.0e-24', -55.2620422318570964164317949), +('1.0e-25', -57.56462732485114210044978637), +('1.0e-26', -59.867212417845187784467777822), +('1.0e-27', -62.1697975108392334684857692765), +('1.0e-28', -64.47238260383327915250376073116), +('1.0e-29', -66.774967696827324836521752185847), +('1.0e-30', -69.0775527898213705205397436405309), +('1.0e-31', -71.38013788281541620455773509521529), +('1.0e-32', -73.682722975809461888575726549899655), +('1.0e-33', -75.9853080688035075725937180045840189), +('1.0e-34', -78.28789316179755325661170945926838306), +('1.0e-35', -80.590478254791598940629700913952747266), +('1.0e-36', -82.8930633477856446246476923686371114736), +('1.0e-37', -85.19564844077969030866568382332147568124), +('1.0e-38', -87.498233533773735992683675278005839888842), +('1.0e-39', -89.8008186267677816767016667326902040964430), +('1.0e-40', -92.10340371976182736071965818737456830404406)) +SELECT x, bc_result, ln(x::numeric), ln(x::numeric)-bc_result AS diff FROM t; + +-- input very close to but smaller than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(1-10^-$p)" | head -n 1) +-- echo "('1.0e-$p', $l)," +-- done + +WITH t(x, bc_result) AS (VALUES +('1.0e-1', -.10536051565782630), +('1.0e-2', -.010050335853501441), +('1.0e-3', -.0010005003335835335), +('1.0e-4', -.00010000500033335834), +('1.0e-5', -.000010000050000333336), +('1.0e-6', -.0000010000005000003333), +('1.0e-7', -.00000010000000500000033), +('1.0e-8', -.000000010000000050000000), +('1.0e-9', -.0000000010000000005000000), +('1.0e-10', -.00000000010000000000500000), +('1.0e-11', -.000000000010000000000050000), +('1.0e-12', -.0000000000010000000000005000), +('1.0e-13', -.00000000000010000000000000500), +('1.0e-14', -.000000000000010000000000000050), +('1.0e-15', -.0000000000000010000000000000005), +('1.0e-16', -.00000000000000010000000000000001), +('1.0e-17', -.000000000000000010000000000000000), +('1.0e-18', -.0000000000000000010000000000000000), +('1.0e-19', -.00000000000000000010000000000000000), +('1.0e-20', -.000000000000000000010000000000000000), +('1.0e-21', -.0000000000000000000010000000000000000), +('1.0e-22', -.00000000000000000000010000000000000000), +('1.0e-23', -.000000000000000000000010000000000000000), +('1.0e-24', -.0000000000000000000000010000000000000000), +('1.0e-25', -.00000000000000000000000010000000000000000), +('1.0e-26', -.000000000000000000000000010000000000000000), +('1.0e-27', -.0000000000000000000000000010000000000000000), +('1.0e-28', -.00000000000000000000000000010000000000000000), +('1.0e-29', -.000000000000000000000000000010000000000000000), +('1.0e-30', -.0000000000000000000000000000010000000000000000), +('1.0e-31', -.00000000000000000000000000000010000000000000000), +('1.0e-32', -.000000000000000000000000000000010000000000000000), +('1.0e-33', -.0000000000000000000000000000000010000000000000000), +('1.0e-34', -.00000000000000000000000000000000010000000000000000), +('1.0e-35', -.000000000000000000000000000000000010000000000000000), +('1.0e-36', -.0000000000000000000000000000000000010000000000000000), +('1.0e-37', -.00000000000000000000000000000000000010000000000000000), +('1.0e-38', -.000000000000000000000000000000000000010000000000000000), +('1.0e-39', -.0000000000000000000000000000000000000010000000000000000), +('1.0e-40', -.00000000000000000000000000000000000000010000000000000000)) +SELECT '1-'||x, bc_result, ln(1.0-x::numeric), ln(1.0-x::numeric)-bc_result AS diff FROM t; + +-- input very close to but larger than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(1+10^-$p)" | head -n 1) +-- echo "('1.0e-$p', $l)," +-- done + +WITH t(x, bc_result) AS (VALUES +('1.0e-1', .09531017980432486), +('1.0e-2', .009950330853168083), +('1.0e-3', .0009995003330835332), +('1.0e-4', .00009999500033330834), +('1.0e-5', .000009999950000333331), +('1.0e-6', .0000009999995000003333), +('1.0e-7', .00000009999999500000033), +('1.0e-8', .000000009999999950000000), +('1.0e-9', .0000000009999999995000000), +('1.0e-10', .00000000009999999999500000), +('1.0e-11', .000000000009999999999950000), +('1.0e-12', .0000000000009999999999995000), +('1.0e-13', .00000000000009999999999999500), +('1.0e-14', .000000000000009999999999999950), +('1.0e-15', .0000000000000009999999999999995), +('1.0e-16', .00000000000000010000000000000000), +('1.0e-17', .000000000000000010000000000000000), +('1.0e-18', .0000000000000000010000000000000000), +('1.0e-19', .00000000000000000010000000000000000), +('1.0e-20', .000000000000000000010000000000000000), +('1.0e-21', .0000000000000000000010000000000000000), +('1.0e-22', .00000000000000000000010000000000000000), +('1.0e-23', .000000000000000000000010000000000000000), +('1.0e-24', .0000000000000000000000010000000000000000), +('1.0e-25', .00000000000000000000000010000000000000000), +('1.0e-26', .000000000000000000000000010000000000000000), +('1.0e-27', .0000000000000000000000000010000000000000000), +('1.0e-28', .00000000000000000000000000010000000000000000), +('1.0e-29', .000000000000000000000000000010000000000000000), +('1.0e-30', .0000000000000000000000000000010000000000000000), +('1.0e-31', .00000000000000000000000000000010000000000000000), +('1.0e-32', .000000000000000000000000000000010000000000000000), +('1.0e-33', .0000000000000000000000000000000010000000000000000), +('1.0e-34', .00000000000000000000000000000000010000000000000000), +('1.0e-35', .000000000000000000000000000000000010000000000000000), +('1.0e-36', .0000000000000000000000000000000000010000000000000000), +('1.0e-37', .00000000000000000000000000000000000010000000000000000), +('1.0e-38', .000000000000000000000000000000000000010000000000000000), +('1.0e-39', .0000000000000000000000000000000000000010000000000000000), +('1.0e-40', .00000000000000000000000000000000000000010000000000000000)) +SELECT '1+'||x, bc_result, ln(1.0+x::numeric), ln(1.0+x::numeric)-bc_result AS diff FROM t; + +-- input very large +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(10^$p)" | head -n 1) +-- echo "('1.0e$p', $l)," +-- done + +WITH t(x, bc_result) AS (VALUES +('1.0e1', 2.3025850929940457), +('1.0e2', 4.6051701859880914), +('1.0e3', 6.9077552789821371), +('1.0e4', 9.2103403719761827), +('1.0e5', 11.512925464970228), +('1.0e6', 13.815510557964274), +('1.0e7', 16.118095650958320), +('1.0e8', 18.420680743952365), +('1.0e9', 20.723265836946411), +('1.0e10', 23.025850929940457), +('1.0e11', 25.328436022934503), +('1.0e12', 27.631021115928548), +('1.0e13', 29.933606208922594), +('1.0e14', 32.236191301916640), +('1.0e15', 34.538776394910685), +('1.0e16', 36.841361487904731), +('1.0e17', 39.143946580898777), +('1.0e18', 41.446531673892822), +('1.0e19', 43.749116766886868), +('1.0e20', 46.051701859880914), +('1.0e21', 48.354286952874959), +('1.0e22', 50.656872045869005), +('1.0e23', 52.959457138863051), +('1.0e24', 55.262042231857096), +('1.0e25', 57.564627324851142), +('1.0e26', 59.867212417845188), +('1.0e27', 62.169797510839233), +('1.0e28', 64.472382603833279), +('1.0e29', 66.774967696827325), +('1.0e30', 69.077552789821371), +('1.0e31', 71.380137882815416), +('1.0e32', 73.682722975809462), +('1.0e33', 75.985308068803508), +('1.0e34', 78.287893161797553), +('1.0e35', 80.590478254791599), +('1.0e36', 82.893063347785645), +('1.0e37', 85.195648440779690), +('1.0e38', 87.498233533773736), +('1.0e39', 89.800818626767782), +('1.0e40', 92.103403719761827)) +SELECT x, bc_result, ln(x::numeric), ln(x::numeric)-bc_result AS diff FROM t; + +-- input huge +-- +-- bc(1) results computed with a scale of 1000 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..10} +-- do +-- l=$(bc -ql <<< "scale=1000 ; l(10^${p}00)" | head -n 1) +-- echo "('1.0e${p}00', $l)," +-- done + +WITH t(x, bc_result) AS (VALUES +('1.0e100', 230.25850929940457), +('1.0e200', 460.51701859880914), +('1.0e300', 690.77552789821371), +('1.0e400', 921.03403719761827), +('1.0e500', 1151.2925464970228), +('1.0e600', 1381.5510557964274), +('1.0e700', 1611.8095650958320), +('1.0e800', 1842.0680743952365), +('1.0e900', 2072.3265836946411), +('1.0e1000', 2302.5850929940457)) +SELECT x, bc_result, ln(x::numeric), ln(x::numeric)-bc_result AS diff FROM t; + +-- inputs with 1000 decimal places +-- +-- bc(1) results computed with a scale of 2000 and rounded to 1000 decimal +-- places + +WITH t(x, bc_result) AS (VALUES +(484990182159328900690402236933516249572671683638747490717351807610531884491845416923860371219625151551889257298200816555016472471293780254009492949585031653913930735918829139712249577547959394351523545901788627247613322896296041868431769047433229466634098452564756860190085118463828382895145244362033728480588969626012192733802377468089120757046364393407262957242230928854711898925295251902007136232994524624903257456111389508582206404271734668422903183500589303866613158037169610592539145461637447957948521714058034772237111009429638870236361143304703683377693378577075353794118557951847394763531830696578809001981568860219578880229402696449243344235099860421846016326538272155937175661905904288335499593232232926636205909086901191153907183842087577811871344870731324067822883041265129394268082883745408414994.8967939438561591657171240282983703914075472645212002662497023142663831371447287624846942598424990784971781730103682951722370983277124599054059027055336437808366784501932987082321905202623642371063626378290734289114618092750984153422293450048717769065428713836637664433167768445609659527458911187829232316677137895259433038764404970599325009178297626038331436654541552998098529141205301472138026818453893127265938030066392881979113522757891639646670670272542401773230506961559808927249585675430838495658225557294666522469887436551840596777627408780618586500922973500018513068499587683746133637919751545157547095670767246977244726331271787622126889459658539988980096764323712767863722912919120929339399753431689512753214200090670880647731689804555417871258907716687575767185444541243606329768784843125926070743277339790277626515824924290352180761378846035233155198504033292692893297993698953705472933411199778880561376633444249703838589180474329586470353212010427945060694794274109764269805332803290229, + 1864.3702986939570026328504202935192533137907736189919154633800554877738455118081651650863235106905871352085850240570561347180517240105510505203972860921397909573687877993477806728098306202020229409548306695695574102950949468160529713610952021974630774784174851619325758380143625473386495586347322798415543385655090746985183329114860118551572428921774322172798724455202876781611633419444058398798142214904998877857425038669920064728855823072107227506485770367799671977282350083029452784747350395161797215115525867416898416360638482342253129160308632504217096916335590470843180746834864303790913372081974355613359678634194879425862536147988835528973291020680020540866655622823550861337486588647231688134992810403147262346312159819432914207194632564009749236609081399504118359354620598232725290537215007867979331582119891661859015726276335168158288396939655310210558566592649049602925182137256134162660116182293851038854455437841571331011002023088829768308520393956515509475418031437505751407687618234418262), +(87190145885430429849953615409019208993240447426362428988181639909267773304254748257120061524000254226856815085523676417146197197996896030672521334101413071112068202429835905642444187493717977611730127126387257253646790849384975208460867137315507010888782632024640844766297185244443116696943912406389670302370461137850160539373600494054874979342373255280815156048999900951842673141766630630919020492255966628630634124452614590400422133958133100159154995520080124736657520969784129924799670552560034302960877087853678350801769339861812435411200669026902417951572668727488315537985378304242438181615160041688723201917323705450185975141141262578884689500612295576288125956289035673242989906973367691922065122033180281670221390667818909912035903387888639331486823729897326624516015340.0330856710565117793999512551468220085711713631167607285185762046751452975325645379302403715842570486302993296501788672462090620871511446272026693318239212657949496275318383141403236705902077406660768573015707706831878445598837931116223956945944726162551477136715847593742032488181481888084716920605114101902724395659898621880016853548602514706686907951229872573180602614761229992106144727082722940736406782659562775289407005631298246624198606031298081220736931229256511054595028182057216042683060059115371651410352645266000330509331097811566633211452233019461903115970558624057877018778178814946285827512359903934291318219271464841957435711594154280905473802599888081783098187210283997106131616471807951265003903143099667366508222327805543948921694362089860577380749774036318574113007382111997454202845559941557812813566442364810680529092880773126707073967537693927177460459341763934709686530005721141046645111784404932103241501569571235364365556796422998363930810983452790309019295181282099408260156, + 1793.5767085750017553306932533574391150814202249805881581227430032600579405884415934520704053351781361105595296647510475380766428668443641914861849764330704062323054023252886955844207807229267936432730818329225450152491146839618683772020068682795388746108876393249306737841247788224204701299467519965182171772253974884845661168860422489046657965359832930382114760565628765599962013955588754803194908990025689040598990346417563277021386852342928910383706995866844541160576254266641602065102228267316550706943783591722246885978355472097314691737807509436806788803362444745551013400341861820755594413819894154786253014501454443272120342005711761286524843010157182464200556865694401941794983935172457481497909987740544409272349152397774548604845897687504977786762391359552407068124283290504752932824699865504970420939586707791994870941813718246825616335675307740641350673558328821461530563823677144691877374809441673507467507447891562257806191361453045937798278733402269265623588493124129181374135958668436774), +(93936642222690597390233191619858485419795942047468396309991947772747208870873993801669373075421461116465960407843923269693395211616591453397070258466704654943689268224479477016161636938138334729982904232438440955361656138189836032891825113139184685132178764873033678116450665758561650355252211196676137179184043639278410827092182700922151290703747496962700158844772453483316974221113826173404445159281421213715669245417896170368554410830320000019029956317336703559699859949692222685614036912057150632902650913831404804982509990655560731349634628713944739168096272097122388116038119844786988276635032016787352796502360718569977397214936366251320294621522016.6483354941025384161536675750898007896744690911429670830432784905421638721478353275821072200938900938046264210604940707974410950770029535636602548377806284157951164875821446035013896786653932045182167021839184824627082391478016195098055107001433336586881395912782883663046617432598969149948351689103230162742769845955320418573803127107923535948653168889411316007796459064267436246637115946581149511513369842911210359447262641996566147462977170742544980481275049898092152042927981394239266559286915303786701737610786594006685748456635797125029722684151298695274097006242412384086302106763844070230264910503179385988626477852818174114043927841085089058972074427820150462261941575665882880501074676800316585217150509780489224388148722603385921057007086785238310735038314861960410473809826927329368597558806004392175746233568789445929554890241140656324160187253042639339549705859147930476532359840809944163908006480881926041259363654863689570520534301207043189181147254153307163555433328278834311658232337, + 1510.4332713542154696529645934345554302578243896764921637693542962119938599884313210100957753316832762996428481801312323020427109678979117469716796746760060470871840325255146954580681101106876674367471955788143763250819168311353856748872452260808797135108102729064040463343792765872545182299889360257515315869180266759715933989413256377582681707188367254513700731642913479683031478361835565783219287780434673712341147656477670848734998849030451414278832848680301511646182446524915091598080243532068451726548537866633622180283865668708517173065893429240665300584705585310049892047293928733753369421499719516009692095913169665213597158441636480707309244604139865130782756488091268094213446272360006907802989573582755585110277620911226015342778471352130366770729972784317323917141031824334355639769512749560550167491709646539950725523461943580211843652293561678342656010571108219244870234329176123205423872844099992204896411752620881541000940129833754169391528449211839693800724450201835161044717173715867437)) +SELECT trim_scale(ln(x::numeric)-bc_result) AS diff FROM t; + +-- +-- Tests for LOG() (base 10) +-- + +-- input very small, exact result known +WITH t(x) AS (SELECT '1e-'||n FROM generate_series(1, 100) g(n)) +SELECT x, log(x::numeric) FROM t; + +-- input very small, non-exact results +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..50..7} +-- do +-- for d in {9..1..3} +-- do +-- l=$(bc -ql <<< "scale=500 ; l($d*10^-$p) / l(10)" | head -n 1) +-- echo "('${d}.0e-$p', $l)," +-- done +-- done + +WITH t(x, bc_result) AS (VALUES +('9.0e-1', -.04575749056067513), +('6.0e-1', -.2218487496163564), +('3.0e-1', -.5228787452803376), +('9.0e-8', -7.045757490560675), +('6.0e-8', -7.221848749616356), +('3.0e-8', -7.522878745280338), +('9.0e-15', -14.0457574905606751), +('6.0e-15', -14.2218487496163564), +('3.0e-15', -14.5228787452803376), +('9.0e-22', -21.04575749056067512540994), +('6.0e-22', -21.22184874961635636749123), +('3.0e-22', -21.52287874528033756270497), +('9.0e-29', -28.045757490560675125409944193490), +('6.0e-29', -28.221848749616356367491233202020), +('3.0e-29', -28.522878745280337562704972096745), +('9.0e-36', -35.0457574905606751254099441934897693816), +('6.0e-36', -35.2218487496163563674912332020203916640), +('3.0e-36', -35.5228787452803375627049720967448846908), +('9.0e-43', -42.04575749056067512540994419348976938159974227), +('6.0e-43', -42.22184874961635636749123320202039166403168125), +('3.0e-43', -42.52287874528033756270497209674488469079987114), +('9.0e-50', -49.045757490560675125409944193489769381599742271618608), +('6.0e-50', -49.221848749616356367491233202020391664031681254347196), +('3.0e-50', -49.522878745280337562704972096744884690799871135809304)) +SELECT x, bc_result, log(x::numeric), log(x::numeric)-bc_result AS diff FROM t; + +-- input very close to but smaller than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40..7} +-- do +-- for d in {9..1..3} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(1-$d*10^-$p) / l(10)" | head -n 1) +-- echo "('${d}.0e-$p', $l)," +-- done +-- done + +WITH t(x, bc_result) AS (VALUES +('9.0e-1', -1.0000000000000000), +('6.0e-1', -.3979400086720376), +('3.0e-1', -.1549019599857432), +('9.0e-8', -.000000039086505130185422), +('6.0e-8', -.000000026057669695925208), +('3.0e-8', -.000000013028834652530076), +('9.0e-15', -.0000000000000039086503371292840), +('6.0e-15', -.0000000000000026057668914195188), +('3.0e-15', -.0000000000000013028834457097574), +('9.0e-22', -.00000000000000000000039086503371292664), +('6.0e-22', -.00000000000000000000026057668914195110), +('3.0e-22', -.00000000000000000000013028834457097555), +('9.0e-29', -.000000000000000000000000000039086503371292664), +('6.0e-29', -.000000000000000000000000000026057668914195110), +('3.0e-29', -.000000000000000000000000000013028834457097555), +('9.0e-36', -.0000000000000000000000000000000000039086503371292664), +('6.0e-36', -.0000000000000000000000000000000000026057668914195110), +('3.0e-36', -.0000000000000000000000000000000000013028834457097555)) +SELECT '1-'||x, bc_result, log(1.0-x::numeric), log(1.0-x::numeric)-bc_result AS diff FROM t; + +-- input very close to but larger than 1 +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {1..40..7} +-- do +-- for d in {9..1..3} +-- do +-- l=$(bc -ql <<< "scale=500 ; l(1+$d*10^-$p) / l(10)" | head -n 1) +-- echo "('${d}.0e-$p', $l)," +-- done +-- done + +WITH t(x, bc_result) AS (VALUES +('9.0e-1', .2787536009528290), +('6.0e-1', .2041199826559248), +('3.0e-1', .1139433523068368), +('9.0e-8', .000000039086501612400118), +('6.0e-8', .000000026057668132465074), +('3.0e-8', .000000013028834261665042), +('9.0e-15', .0000000000000039086503371292489), +('6.0e-15', .0000000000000026057668914195031), +('3.0e-15', .0000000000000013028834457097535), +('9.0e-22', .00000000000000000000039086503371292664), +('6.0e-22', .00000000000000000000026057668914195110), +('3.0e-22', .00000000000000000000013028834457097555), +('9.0e-29', .000000000000000000000000000039086503371292664), +('6.0e-29', .000000000000000000000000000026057668914195110), +('3.0e-29', .000000000000000000000000000013028834457097555), +('9.0e-36', .0000000000000000000000000000000000039086503371292664), +('6.0e-36', .0000000000000000000000000000000000026057668914195110), +('3.0e-36', .0000000000000000000000000000000000013028834457097555)) +SELECT '1+'||x, bc_result, log(1.0+x::numeric), log(1.0+x::numeric)-bc_result AS diff FROM t; + +-- input very large, exact result known +WITH t(x) AS (SELECT '1e'||n FROM generate_series(1, 100) g(n)) +SELECT x, log(x::numeric) FROM t; + +-- input very large, non-exact results +-- +-- bc(1) results computed with a scale of 500 and truncated using the script +-- below, and then rounded by hand to match the precision of LN(): +-- +-- for p in {10..50..7} +-- do +-- for d in {2..9..3} +-- do +-- l=$(bc -ql <<< "scale=500 ; l($d*10^$p) / l(10)" | head -n 1) +-- echo "('${d}.0e$p', $l)," +-- done +-- done + +WITH t(x, bc_result) AS (VALUES +('2.0e10', 10.301029995663981), +('5.0e10', 10.698970004336019), +('8.0e10', 10.903089986991944), +('2.0e17', 17.301029995663981), +('5.0e17', 17.698970004336019), +('8.0e17', 17.903089986991944), +('2.0e24', 24.301029995663981), +('5.0e24', 24.698970004336019), +('8.0e24', 24.903089986991944), +('2.0e31', 31.301029995663981), +('5.0e31', 31.698970004336019), +('8.0e31', 31.903089986991944), +('2.0e38', 38.301029995663981), +('5.0e38', 38.698970004336019), +('8.0e38', 38.903089986991944), +('2.0e45', 45.30102999566398), +('5.0e45', 45.69897000433602), +('8.0e45', 45.90308998699194)) +SELECT x, bc_result, log(x::numeric), log(x::numeric)-bc_result AS diff FROM t; diff --git a/src/test/singlenode_regress/sql/numerology.sql b/src/test/singlenode_regress/sql/numerology.sql new file mode 100644 index 00000000000..fddb58f8fdb --- /dev/null +++ b/src/test/singlenode_regress/sql/numerology.sql @@ -0,0 +1,98 @@ +-- +-- NUMEROLOGY +-- Test various combinations of numeric types and functions. +-- + +-- +-- Test implicit type conversions +-- This fails for Postgres v6.1 (and earlier?) +-- so let's try explicit conversions for now - tgl 97/05/07 +-- + +CREATE TABLE TEMP_FLOAT (f1 FLOAT8); + +INSERT INTO TEMP_FLOAT (f1) + SELECT float8(f1) FROM INT4_TBL; + +INSERT INTO TEMP_FLOAT (f1) + SELECT float8(f1) FROM INT2_TBL; + +SELECT f1 FROM TEMP_FLOAT + ORDER BY f1; + +-- int4 + +CREATE TABLE TEMP_INT4 (f1 INT4); + +INSERT INTO TEMP_INT4 (f1) + SELECT int4(f1) FROM FLOAT8_TBL + WHERE (f1 > -2147483647) AND (f1 < 2147483647); + +INSERT INTO TEMP_INT4 (f1) + SELECT int4(f1) FROM INT2_TBL; + +SELECT f1 FROM TEMP_INT4 + ORDER BY f1; + +-- int2 + +CREATE TABLE TEMP_INT2 (f1 INT2); + +INSERT INTO TEMP_INT2 (f1) + SELECT int2(f1) FROM FLOAT8_TBL + WHERE (f1 >= -32767) AND (f1 <= 32767); + +INSERT INTO TEMP_INT2 (f1) + SELECT int2(f1) FROM INT4_TBL + WHERE (f1 >= -32767) AND (f1 <= 32767); + +SELECT f1 FROM TEMP_INT2 + ORDER BY f1; + +-- +-- Group-by combinations +-- + +CREATE TABLE TEMP_GROUP (f1 INT4, f2 INT4, f3 FLOAT8); + +INSERT INTO TEMP_GROUP + SELECT 1, (- i.f1), (- f.f1) + FROM INT4_TBL i, FLOAT8_TBL f; + +INSERT INTO TEMP_GROUP + SELECT 2, i.f1, f.f1 + FROM INT4_TBL i, FLOAT8_TBL f; + +SELECT DISTINCT f1 AS two FROM TEMP_GROUP ORDER BY 1; + +SELECT f1 AS two, max(f3) AS max_float, min(f3) as min_float + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, max_float, min_float; + +-- GROUP BY a result column name is not legal per SQL92, but we accept it +-- anyway (if the name is not the name of any column exposed by FROM). +SELECT f1 AS two, max(f3) AS max_float, min(f3) AS min_float + FROM TEMP_GROUP + GROUP BY two + ORDER BY two, max_float, min_float; + +SELECT f1 AS two, (max(f3) + 1) AS max_plus_1, (min(f3) - 1) AS min_minus_1 + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, min_minus_1; + +SELECT f1 AS two, + max(f2) + min(f2) AS max_plus_min, + min(f3) - 1 AS min_minus_1 + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, min_minus_1; + +DROP TABLE TEMP_INT2; + +DROP TABLE TEMP_INT4; + +DROP TABLE TEMP_FLOAT; + +DROP TABLE TEMP_GROUP; diff --git a/src/test/singlenode_regress/sql/object_address.sql b/src/test/singlenode_regress/sql/object_address.sql new file mode 100644 index 00000000000..2f4f66e3e12 --- /dev/null +++ b/src/test/singlenode_regress/sql/object_address.sql @@ -0,0 +1,287 @@ +-- +-- Test for pg_get_object_address +-- + +-- Clean up in case a prior regression run failed +SET client_min_messages TO 'warning'; +DROP ROLE IF EXISTS regress_addr_user; +RESET client_min_messages; + +CREATE USER regress_addr_user; + +-- Test generic object addressing/identification functions +CREATE SCHEMA addr_nsp; +SET search_path TO 'addr_nsp'; +CREATE FOREIGN DATA WRAPPER addr_fdw; +CREATE SERVER addr_fserv FOREIGN DATA WRAPPER addr_fdw; +CREATE TEXT SEARCH DICTIONARY addr_ts_dict (template=simple); +CREATE TEXT SEARCH CONFIGURATION addr_ts_conf (copy=english); +CREATE TEXT SEARCH TEMPLATE addr_ts_temp (lexize=dsimple_lexize); +CREATE TEXT SEARCH PARSER addr_ts_prs + (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype); +CREATE TABLE addr_nsp.gentable ( + a serial primary key CONSTRAINT a_chk CHECK (a > 0), + b text DEFAULT 'hello'); +CREATE TABLE addr_nsp.parttable ( + a int PRIMARY KEY +) PARTITION BY RANGE (a); +CREATE VIEW addr_nsp.genview AS SELECT * from addr_nsp.gentable; +CREATE MATERIALIZED VIEW addr_nsp.genmatview AS SELECT * FROM addr_nsp.gentable; +CREATE TYPE addr_nsp.gencomptype AS (a int); +CREATE TYPE addr_nsp.genenum AS ENUM ('one', 'two'); +CREATE FOREIGN TABLE addr_nsp.genftable (a int) SERVER addr_fserv; +CREATE AGGREGATE addr_nsp.genaggr(int4) (sfunc = int4pl, stype = int4); +CREATE DOMAIN addr_nsp.gendomain AS int4 CONSTRAINT domconstr CHECK (value > 0); +CREATE FUNCTION addr_nsp.trig() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN END; $$; +CREATE TRIGGER t BEFORE INSERT ON addr_nsp.gentable FOR EACH ROW EXECUTE PROCEDURE addr_nsp.trig(); +CREATE POLICY genpol ON addr_nsp.gentable; +CREATE PROCEDURE addr_nsp.proc(int4) LANGUAGE SQL AS $$ $$; +CREATE SERVER "integer" FOREIGN DATA WRAPPER addr_fdw; +CREATE USER MAPPING FOR regress_addr_user SERVER "integer"; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_addr_user IN SCHEMA public GRANT ALL ON TABLES TO regress_addr_user; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_addr_user REVOKE DELETE ON TABLES FROM regress_addr_user; +-- this transform would be quite unsafe to leave lying around, +-- except that the SQL language pays no attention to transforms: +CREATE TRANSFORM FOR int LANGUAGE SQL ( + FROM SQL WITH FUNCTION prsd_lextype(internal), + TO SQL WITH FUNCTION int4recv(internal)); +-- suppress warning that depends on wal_level +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; +RESET client_min_messages; +CREATE SUBSCRIPTION regress_addr_sub CONNECTION '' PUBLICATION bar WITH (connect = false, slot_name = NONE); +CREATE STATISTICS addr_nsp.gentable_stat ON a, b FROM addr_nsp.gentable; + +-- test some error cases +SELECT pg_get_object_address('stone', '{}', '{}'); +SELECT pg_get_object_address('table', '{}', '{}'); +SELECT pg_get_object_address('table', '{NULL}', '{}'); + +-- unrecognized object types +DO $$ +DECLARE + objtype text; +BEGIN + FOR objtype IN VALUES ('toast table'), ('index column'), ('sequence column'), + ('toast table column'), ('view column'), ('materialized view column') + LOOP + BEGIN + PERFORM pg_get_object_address(objtype, '{one}', '{}'); + EXCEPTION WHEN invalid_parameter_value THEN + RAISE WARNING 'error for %: %', objtype, sqlerrm; + END; + END LOOP; +END; +$$; + +-- miscellaneous other errors +select * from pg_get_object_address('operator of access method', '{btree,integer_ops,1}', '{int4,bool}'); +select * from pg_get_object_address('operator of access method', '{btree,integer_ops,99}', '{int4,int4}'); +select * from pg_get_object_address('function of access method', '{btree,integer_ops,1}', '{int4,bool}'); +select * from pg_get_object_address('function of access method', '{btree,integer_ops,99}', '{int4,int4}'); + +DO $$ +DECLARE + objtype text; + names text[]; + args text[]; +BEGIN + FOR objtype IN VALUES + ('table'), ('index'), ('sequence'), ('view'), + ('materialized view'), ('foreign table'), + ('table column'), ('foreign table column'), + ('aggregate'), ('function'), ('procedure'), ('type'), ('cast'), + ('table constraint'), ('domain constraint'), ('conversion'), ('default value'), + ('operator'), ('operator class'), ('operator family'), ('rule'), ('trigger'), + ('text search parser'), ('text search dictionary'), + ('text search template'), ('text search configuration'), + ('policy'), ('user mapping'), ('default acl'), ('transform'), + ('operator of access method'), ('function of access method'), + ('publication relation') + LOOP + FOR names IN VALUES ('{eins}'), ('{addr_nsp, zwei}'), ('{eins, zwei, drei}') + LOOP + FOR args IN VALUES ('{}'), ('{integer}') + LOOP + BEGIN + PERFORM pg_get_object_address(objtype, names, args); + EXCEPTION WHEN OTHERS THEN + RAISE WARNING 'error for %,%,%: %', objtype, names, args, sqlerrm; + END; + END LOOP; + END LOOP; + END LOOP; +END; +$$; + +-- these object types cannot be qualified names +SELECT pg_get_object_address('language', '{one}', '{}'); +SELECT pg_get_object_address('language', '{one,two}', '{}'); +SELECT pg_get_object_address('large object', '{123}', '{}'); +SELECT pg_get_object_address('large object', '{123,456}', '{}'); +SELECT pg_get_object_address('large object', '{blargh}', '{}'); +SELECT pg_get_object_address('schema', '{one}', '{}'); +SELECT pg_get_object_address('schema', '{one,two}', '{}'); +SELECT pg_get_object_address('role', '{one}', '{}'); +SELECT pg_get_object_address('role', '{one,two}', '{}'); +SELECT pg_get_object_address('database', '{one}', '{}'); +SELECT pg_get_object_address('database', '{one,two}', '{}'); +SELECT pg_get_object_address('tablespace', '{one}', '{}'); +SELECT pg_get_object_address('tablespace', '{one,two}', '{}'); +SELECT pg_get_object_address('foreign-data wrapper', '{one}', '{}'); +SELECT pg_get_object_address('foreign-data wrapper', '{one,two}', '{}'); +SELECT pg_get_object_address('server', '{one}', '{}'); +SELECT pg_get_object_address('server', '{one,two}', '{}'); +SELECT pg_get_object_address('extension', '{one}', '{}'); +SELECT pg_get_object_address('extension', '{one,two}', '{}'); +SELECT pg_get_object_address('event trigger', '{one}', '{}'); +SELECT pg_get_object_address('event trigger', '{one,two}', '{}'); +SELECT pg_get_object_address('access method', '{one}', '{}'); +SELECT pg_get_object_address('access method', '{one,two}', '{}'); +SELECT pg_get_object_address('publication', '{one}', '{}'); +SELECT pg_get_object_address('publication', '{one,two}', '{}'); +SELECT pg_get_object_address('subscription', '{one}', '{}'); +SELECT pg_get_object_address('subscription', '{one,two}', '{}'); + +-- test successful cases +WITH objects (type, name, args) AS (VALUES + ('table', '{addr_nsp, gentable}'::text[], '{}'::text[]), + ('table', '{addr_nsp, parttable}'::text[], '{}'::text[]), + ('index', '{addr_nsp, gentable_pkey}', '{}'), + ('index', '{addr_nsp, parttable_pkey}', '{}'), + ('sequence', '{addr_nsp, gentable_a_seq}', '{}'), + -- toast table + ('view', '{addr_nsp, genview}', '{}'), + ('materialized view', '{addr_nsp, genmatview}', '{}'), + ('foreign table', '{addr_nsp, genftable}', '{}'), + ('table column', '{addr_nsp, gentable, b}', '{}'), + ('foreign table column', '{addr_nsp, genftable, a}', '{}'), + ('aggregate', '{addr_nsp, genaggr}', '{int4}'), + ('function', '{pg_catalog, pg_identify_object}', '{pg_catalog.oid, pg_catalog.oid, int4}'), + ('procedure', '{addr_nsp, proc}', '{int4}'), + ('type', '{pg_catalog._int4}', '{}'), + ('type', '{addr_nsp.gendomain}', '{}'), + ('type', '{addr_nsp.gencomptype}', '{}'), + ('type', '{addr_nsp.genenum}', '{}'), + ('cast', '{int8}', '{int4}'), + ('collation', '{default}', '{}'), + ('table constraint', '{addr_nsp, gentable, a_chk}', '{}'), + ('domain constraint', '{addr_nsp.gendomain}', '{domconstr}'), + ('conversion', '{pg_catalog, koi8_r_to_mic}', '{}'), + ('default value', '{addr_nsp, gentable, b}', '{}'), + ('language', '{plpgsql}', '{}'), + -- large object + ('operator', '{+}', '{int4, int4}'), + ('operator class', '{btree, int4_ops}', '{}'), + ('operator family', '{btree, integer_ops}', '{}'), + ('operator of access method', '{btree,integer_ops,1}', '{integer,integer}'), + ('function of access method', '{btree,integer_ops,2}', '{integer,integer}'), + ('rule', '{addr_nsp, genview, _RETURN}', '{}'), + ('trigger', '{addr_nsp, gentable, t}', '{}'), + ('schema', '{addr_nsp}', '{}'), + ('text search parser', '{addr_ts_prs}', '{}'), + ('text search dictionary', '{addr_ts_dict}', '{}'), + ('text search template', '{addr_ts_temp}', '{}'), + ('text search configuration', '{addr_ts_conf}', '{}'), + ('role', '{regress_addr_user}', '{}'), + -- database + -- tablespace + ('foreign-data wrapper', '{addr_fdw}', '{}'), + ('server', '{addr_fserv}', '{}'), + ('user mapping', '{regress_addr_user}', '{integer}'), + ('default acl', '{regress_addr_user,public}', '{r}'), + ('default acl', '{regress_addr_user}', '{r}'), + -- extension + -- event trigger + ('policy', '{addr_nsp, gentable, genpol}', '{}'), + ('transform', '{int}', '{sql}'), + ('access method', '{btree}', '{}'), + ('publication', '{addr_pub}', '{}'), + ('publication relation', '{addr_nsp, gentable}', '{addr_pub}'), + ('subscription', '{regress_addr_sub}', '{}'), + ('statistics object', '{addr_nsp, gentable_stat}', '{}') + ) +SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)).*, + -- test roundtrip through pg_identify_object_as_address + ROW(pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)) = + ROW(pg_identify_object(addr2.classid, addr2.objid, addr2.objsubid)) + FROM objects, pg_get_object_address(type, name, args) addr1, + pg_identify_object_as_address(classid, objid, objsubid) ioa(typ,nms,args), + pg_get_object_address(typ, nms, ioa.args) as addr2 + ORDER BY addr1.classid, addr1.objid, addr1.objsubid; + +--- +--- Cleanup resources +--- +DROP FOREIGN DATA WRAPPER addr_fdw CASCADE; +DROP PUBLICATION addr_pub; +DROP SUBSCRIPTION regress_addr_sub; + +DROP SCHEMA addr_nsp CASCADE; + +DROP OWNED BY regress_addr_user; +DROP USER regress_addr_user; + +-- +-- Checks for invalid objects +-- +-- Make sure that NULL handling is correct. +\pset null 'NULL' +-- Temporarily disable fancy output, so as future additions never create +-- a large amount of diffs. +\a\t + +-- Keep this list in the same order as getObjectIdentityParts() +-- in objectaddress.c. +WITH objects (classid, objid, objsubid) AS (VALUES + ('pg_class'::regclass, 0, 0), -- no relation + ('pg_class'::regclass, 'pg_class'::regclass, 100), -- no column for relation + ('pg_proc'::regclass, 0, 0), -- no function + ('pg_type'::regclass, 0, 0), -- no type + ('pg_cast'::regclass, 0, 0), -- no cast + ('pg_collation'::regclass, 0, 0), -- no collation + ('pg_constraint'::regclass, 0, 0), -- no constraint + ('pg_conversion'::regclass, 0, 0), -- no conversion + ('pg_attrdef'::regclass, 0, 0), -- no default attribute + ('pg_language'::regclass, 0, 0), -- no language + ('pg_largeobject'::regclass, 0, 0), -- no large object, no error + ('pg_operator'::regclass, 0, 0), -- no operator + ('pg_opclass'::regclass, 0, 0), -- no opclass, no need to check for no access method + ('pg_opfamily'::regclass, 0, 0), -- no opfamily + ('pg_am'::regclass, 0, 0), -- no access method + ('pg_amop'::regclass, 0, 0), -- no AM operator + ('pg_amproc'::regclass, 0, 0), -- no AM proc + ('pg_rewrite'::regclass, 0, 0), -- no rewrite + ('pg_trigger'::regclass, 0, 0), -- no trigger + ('pg_namespace'::regclass, 0, 0), -- no schema + ('pg_statistic_ext'::regclass, 0, 0), -- no statistics + ('pg_ts_parser'::regclass, 0, 0), -- no TS parser + ('pg_ts_dict'::regclass, 0, 0), -- no TS dictionnary + ('pg_ts_template'::regclass, 0, 0), -- no TS template + ('pg_ts_config'::regclass, 0, 0), -- no TS configuration + ('pg_authid'::regclass, 0, 0), -- no role + ('pg_database'::regclass, 0, 0), -- no database + ('pg_tablespace'::regclass, 0, 0), -- no tablespace + ('pg_foreign_data_wrapper'::regclass, 0, 0), -- no FDW + ('pg_foreign_server'::regclass, 0, 0), -- no server + ('pg_user_mapping'::regclass, 0, 0), -- no user mapping + ('pg_default_acl'::regclass, 0, 0), -- no default ACL + ('pg_extension'::regclass, 0, 0), -- no extension + ('pg_event_trigger'::regclass, 0, 0), -- no event trigger + ('pg_policy'::regclass, 0, 0), -- no policy + ('pg_publication'::regclass, 0, 0), -- no publication + ('pg_publication_rel'::regclass, 0, 0), -- no publication relation + ('pg_subscription'::regclass, 0, 0), -- no subscription + ('pg_transform'::regclass, 0, 0) -- no transformation + ) +SELECT ROW(pg_identify_object(objects.classid, objects.objid, objects.objsubid)) + AS ident, + ROW(pg_identify_object_as_address(objects.classid, objects.objid, objects.objsubid)) + AS addr, + pg_describe_object(objects.classid, objects.objid, objects.objsubid) + AS descr +FROM objects +ORDER BY objects.classid, objects.objid, objects.objsubid; + +-- restore normal output mode +\a\t diff --git a/src/test/singlenode_regress/sql/oid.sql b/src/test/singlenode_regress/sql/oid.sql new file mode 100644 index 00000000000..25b4b68a6a0 --- /dev/null +++ b/src/test/singlenode_regress/sql/oid.sql @@ -0,0 +1,43 @@ +-- +-- OID +-- + +CREATE TABLE OID_TBL(f1 oid); + +INSERT INTO OID_TBL(f1) VALUES ('1234'); +INSERT INTO OID_TBL(f1) VALUES ('1235'); +INSERT INTO OID_TBL(f1) VALUES ('987'); +INSERT INTO OID_TBL(f1) VALUES ('-1040'); +INSERT INTO OID_TBL(f1) VALUES ('99999999'); +INSERT INTO OID_TBL(f1) VALUES ('5 '); +INSERT INTO OID_TBL(f1) VALUES (' 10 '); +-- leading/trailing hard tab is also allowed +INSERT INTO OID_TBL(f1) VALUES (' 15 '); + +-- bad inputs +INSERT INTO OID_TBL(f1) VALUES (''); +INSERT INTO OID_TBL(f1) VALUES (' '); +INSERT INTO OID_TBL(f1) VALUES ('asdfasd'); +INSERT INTO OID_TBL(f1) VALUES ('99asdfasd'); +INSERT INTO OID_TBL(f1) VALUES ('5 d'); +INSERT INTO OID_TBL(f1) VALUES (' 5d'); +INSERT INTO OID_TBL(f1) VALUES ('5 5'); +INSERT INTO OID_TBL(f1) VALUES (' - 500'); +INSERT INTO OID_TBL(f1) VALUES ('32958209582039852935'); +INSERT INTO OID_TBL(f1) VALUES ('-23582358720398502385'); + +SELECT * FROM OID_TBL; + +SELECT o.* FROM OID_TBL o WHERE o.f1 = 1234; + +SELECT o.* FROM OID_TBL o WHERE o.f1 <> '1234'; + +SELECT o.* FROM OID_TBL o WHERE o.f1 <= '1234'; + +SELECT o.* FROM OID_TBL o WHERE o.f1 < '1234'; + +SELECT o.* FROM OID_TBL o WHERE o.f1 >= '1234'; + +SELECT o.* FROM OID_TBL o WHERE o.f1 > '1234'; + +DROP TABLE OID_TBL; diff --git a/src/test/singlenode_regress/sql/oidjoins.sql b/src/test/singlenode_regress/sql/oidjoins.sql new file mode 100644 index 00000000000..8b22e6d10c5 --- /dev/null +++ b/src/test/singlenode_regress/sql/oidjoins.sql @@ -0,0 +1,49 @@ +-- +-- Verify system catalog foreign key relationships +-- +DO $doblock$ +declare + fk record; + nkeys integer; + cmd text; + err record; +begin + for fk in select * from pg_get_catalog_foreign_keys() + loop + raise notice 'checking % % => % %', + fk.fktable, fk.fkcols, fk.pktable, fk.pkcols; + nkeys := array_length(fk.fkcols, 1); + cmd := 'SELECT ctid'; + for i in 1 .. nkeys loop + cmd := cmd || ', ' || quote_ident(fk.fkcols[i]); + end loop; + if fk.is_array then + cmd := cmd || ' FROM (SELECT ctid'; + for i in 1 .. nkeys-1 loop + cmd := cmd || ', ' || quote_ident(fk.fkcols[i]); + end loop; + cmd := cmd || ', unnest(' || quote_ident(fk.fkcols[nkeys]); + cmd := cmd || ') as ' || quote_ident(fk.fkcols[nkeys]); + cmd := cmd || ' FROM ' || fk.fktable::text || ') fk WHERE '; + else + cmd := cmd || ' FROM ' || fk.fktable::text || ' fk WHERE '; + end if; + if fk.is_opt then + for i in 1 .. nkeys loop + cmd := cmd || quote_ident(fk.fkcols[i]) || ' != 0 AND '; + end loop; + end if; + cmd := cmd || 'NOT EXISTS(SELECT 1 FROM ' || fk.pktable::text || ' pk WHERE '; + for i in 1 .. nkeys loop + if i > 1 then cmd := cmd || ' AND '; end if; + cmd := cmd || 'pk.' || quote_ident(fk.pkcols[i]); + cmd := cmd || ' = fk.' || quote_ident(fk.fkcols[i]); + end loop; + cmd := cmd || ')'; + -- raise notice 'cmd = %', cmd; + for err in execute cmd loop + raise warning 'FK VIOLATION IN %(%): %', fk.fktable, fk.fkcols, err; + end loop; + end loop; +end +$doblock$; diff --git a/src/test/singlenode_regress/sql/opr_sanity.sql b/src/test/singlenode_regress/sql/opr_sanity.sql new file mode 100644 index 00000000000..41c93ae8c58 --- /dev/null +++ b/src/test/singlenode_regress/sql/opr_sanity.sql @@ -0,0 +1,1404 @@ +-- +-- OPR_SANITY +-- Sanity checks for common errors in making operator/procedure system tables: +-- pg_operator, pg_proc, pg_cast, pg_conversion, pg_aggregate, pg_am, +-- pg_amop, pg_amproc, pg_opclass, pg_opfamily, pg_index. +-- +-- Every test failure in this file should be closely inspected. +-- The description of the failing test should be read carefully before +-- adjusting the expected output. In most cases, the queries should +-- not find *any* matching entries. +-- +-- NB: we assume the oidjoins test will have caught any dangling links, +-- that is OID or REGPROC fields that are not zero and do not match some +-- row in the linked-to table. However, if we want to enforce that a link +-- field can't be 0, we have to check it here. +-- +-- NB: run this test earlier than the create_operator test, because +-- that test creates some bogus operators... + + +-- **************** pg_proc **************** + +-- Look for illegal values in pg_proc fields. + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prolang = 0 OR p1.prorettype = 0 OR + p1.pronargs < 0 OR + p1.pronargdefaults < 0 OR + p1.pronargdefaults > p1.pronargs OR + array_lower(p1.proargtypes, 1) != 0 OR + array_upper(p1.proargtypes, 1) != p1.pronargs-1 OR + 0::oid = ANY (p1.proargtypes) OR + procost <= 0 OR + CASE WHEN proretset THEN prorows <= 0 ELSE prorows != 0 END OR + prokind NOT IN ('f', 'a', 'w', 'p') OR + provolatile NOT IN ('i', 's', 'v') OR + proparallel NOT IN ('s', 'r', 'u'); + +-- prosrc should never be null; it can be empty only if prosqlbody isn't null +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE prosrc IS NULL; +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE (prosrc = '' OR prosrc = '-') AND prosqlbody IS NULL; + +-- proretset should only be set for normal functions +SELECT p1.oid, p1.proname +FROM pg_proc AS p1 +WHERE proretset AND prokind != 'f'; + +-- currently, no built-in functions should be SECURITY DEFINER; +-- this might change in future, but there will probably never be many. +SELECT p1.oid, p1.proname +FROM pg_proc AS p1 +WHERE prosecdef +ORDER BY 1; + +-- pronargdefaults should be 0 iff proargdefaults is null +SELECT p1.oid, p1.proname +FROM pg_proc AS p1 +WHERE (pronargdefaults <> 0) != (proargdefaults IS NOT NULL); + +-- probin should be non-empty for C functions, null everywhere else +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE prolang = 13 AND (probin IS NULL OR probin = '' OR probin = '-'); + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE prolang != 13 AND probin IS NOT NULL; + +-- Look for conflicting proc definitions (same names and input datatypes). +-- (This test should be dead code now that we have the unique index +-- pg_proc_proname_args_nsp_index, but I'll leave it in anyway.) + +SELECT p1.oid, p1.proname, p2.oid, p2.proname +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.proname = p2.proname AND + p1.pronargs = p2.pronargs AND + p1.proargtypes = p2.proargtypes; + +-- Considering only built-in procs (prolang = 12), look for multiple uses +-- of the same internal function (ie, matching prosrc fields). It's OK to +-- have several entries with different pronames for the same internal function, +-- but conflicts in the number of arguments and other critical items should +-- be complained of. (We don't check data types here; see next query.) +-- Note: ignore aggregate functions here, since they all point to the same +-- dummy built-in function. + +SELECT p1.oid, p1.proname, p2.oid, p2.proname +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid < p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + (p1.prokind != 'a' OR p2.prokind != 'a') AND + (p1.prolang != p2.prolang OR + p1.prokind != p2.prokind OR + p1.prosecdef != p2.prosecdef OR + p1.proleakproof != p2.proleakproof OR + p1.proisstrict != p2.proisstrict OR + p1.proretset != p2.proretset OR + p1.provolatile != p2.provolatile OR + p1.pronargs != p2.pronargs); + +-- Look for uses of different type OIDs in the argument/result type fields +-- for different aliases of the same built-in function. +-- This indicates that the types are being presumed to be binary-equivalent, +-- or that the built-in function is prepared to deal with different types. +-- That's not wrong, necessarily, but we make lists of all the types being +-- so treated. Note that the expected output of this part of the test will +-- need to be modified whenever new pairs of types are made binary-equivalent, +-- or when new polymorphic built-in functions are added! +-- Note: ignore aggregate functions here, since they all point to the same +-- dummy built-in function. Likewise, ignore range and multirange constructor +-- functions. + +SELECT DISTINCT p1.prorettype::regtype, p2.prorettype::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + p1.prosrc NOT LIKE E'range\\_constructor_' AND + p2.prosrc NOT LIKE E'range\\_constructor_' AND + p1.prosrc NOT LIKE E'multirange\\_constructor_' AND + p2.prosrc NOT LIKE E'multirange\\_constructor_' AND + (p1.prorettype < p2.prorettype) + -- int2/int4/int8/float8_matrix_accum functions violate this + AND p1.proname NOT LIKE E'%_matrix_accum' + AND p2.proname NOT LIKE E'%_matrix_accum' +ORDER BY 1, 2; + +SELECT DISTINCT p1.proargtypes[0]::regtype, p2.proargtypes[0]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + p1.prosrc NOT LIKE E'range\\_constructor_' AND + p2.prosrc NOT LIKE E'range\\_constructor_' AND + p1.prosrc NOT LIKE E'multirange\\_constructor_' AND + p2.prosrc NOT LIKE E'multirange\\_constructor_' AND + (p1.proargtypes[0] < p2.proargtypes[0]) + -- int2/int4/int8/float8_matrix_accum functions violate this + AND p1.proname NOT LIKE E'%_matrix_accum' + AND p2.proname NOT LIKE E'%_matrix_accum' +ORDER BY 1, 2; + +SELECT DISTINCT p1.proargtypes[1]::regtype, p2.proargtypes[1]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + p1.prosrc NOT LIKE E'range\\_constructor_' AND + p2.prosrc NOT LIKE E'range\\_constructor_' AND + p1.prosrc NOT LIKE E'multirange\\_constructor_' AND + p2.prosrc NOT LIKE E'multirange\\_constructor_' AND + (p1.proargtypes[1] < p2.proargtypes[1]) + -- int2/int4/int8/float8_matrix_accum functions violate this + AND p1.proname NOT LIKE E'%_matrix_accum' + AND p2.proname NOT LIKE E'%_matrix_accum' +ORDER BY 1, 2; + +SELECT DISTINCT p1.proargtypes[2]::regtype, p2.proargtypes[2]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[2] < p2.proargtypes[2]) +ORDER BY 1, 2; + +SELECT DISTINCT p1.proargtypes[3]::regtype, p2.proargtypes[3]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[3] < p2.proargtypes[3]) +ORDER BY 1, 2; + +SELECT DISTINCT p1.proargtypes[4]::regtype, p2.proargtypes[4]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[4] < p2.proargtypes[4]) +ORDER BY 1, 2; + +SELECT DISTINCT p1.proargtypes[5]::regtype, p2.proargtypes[5]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[5] < p2.proargtypes[5]) +ORDER BY 1, 2; + +SELECT DISTINCT p1.proargtypes[6]::regtype, p2.proargtypes[6]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[6] < p2.proargtypes[6]) +ORDER BY 1, 2; + +SELECT DISTINCT p1.proargtypes[7]::regtype, p2.proargtypes[7]::regtype +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid != p2.oid AND + p1.prosrc = p2.prosrc AND + p1.prolang = 12 AND p2.prolang = 12 AND + p1.prokind != 'a' AND p2.prokind != 'a' AND + (p1.proargtypes[7] < p2.proargtypes[7]) +ORDER BY 1, 2; + +-- Look for functions that return type "internal" and do not have any +-- "internal" argument. Such a function would be a security hole since +-- it might be used to call an internal function from an SQL command. +-- As of 7.3 this query should find only internal_in, which is safe because +-- it always throws an error when called. + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype = 'internal'::regtype AND NOT + 'internal'::regtype = ANY (p1.proargtypes); + +-- Look for functions that return a polymorphic type and do not have any +-- polymorphic argument. Calls of such functions would be unresolvable +-- at parse time. As of 9.6 this query should find only some input functions +-- and GiST support functions associated with these pseudotypes. + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype IN + ('anyelement'::regtype, 'anyarray'::regtype, 'anynonarray'::regtype, + 'anyenum'::regtype) + AND NOT + ('anyelement'::regtype = ANY (p1.proargtypes) OR + 'anyarray'::regtype = ANY (p1.proargtypes) OR + 'anynonarray'::regtype = ANY (p1.proargtypes) OR + 'anyenum'::regtype = ANY (p1.proargtypes) OR + 'anyrange'::regtype = ANY (p1.proargtypes) OR + 'anymultirange'::regtype = ANY (p1.proargtypes)) +ORDER BY 2; + +-- anyrange and anymultirange are tighter than the rest, can only resolve +-- from each other + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype IN ('anyrange'::regtype, 'anymultirange'::regtype) + AND NOT + ('anyrange'::regtype = ANY (p1.proargtypes) OR + 'anymultirange'::regtype = ANY (p1.proargtypes)) +ORDER BY 2; + +-- similarly for the anycompatible family + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype IN + ('anycompatible'::regtype, 'anycompatiblearray'::regtype, + 'anycompatiblenonarray'::regtype) + AND NOT + ('anycompatible'::regtype = ANY (p1.proargtypes) OR + 'anycompatiblearray'::regtype = ANY (p1.proargtypes) OR + 'anycompatiblenonarray'::regtype = ANY (p1.proargtypes) OR + 'anycompatiblerange'::regtype = ANY (p1.proargtypes)) +ORDER BY 2; + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype = 'anycompatiblerange'::regtype + AND NOT + 'anycompatiblerange'::regtype = ANY (p1.proargtypes) +ORDER BY 2; + + +-- Look for functions that accept cstring and are neither datatype input +-- functions nor encoding conversion functions. It's almost never a good +-- idea to use cstring input for a function meant to be called from SQL; +-- text should be used instead, because cstring lacks suitable casts. +-- As of 9.6 this query should find only cstring_out and cstring_send. +-- However, we must manually exclude shell_in, which might or might not be +-- rejected by the EXISTS clause depending on whether there are currently +-- any shell types. + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE 'cstring'::regtype = ANY (p1.proargtypes) + AND NOT EXISTS(SELECT 1 FROM pg_type WHERE typinput = p1.oid) + AND NOT EXISTS(SELECT 1 FROM pg_conversion WHERE conproc = p1.oid) + AND p1.oid != 'shell_in(cstring)'::regprocedure +ORDER BY 1; + +-- Likewise, look for functions that return cstring and aren't datatype output +-- functions nor typmod output functions. +-- As of 9.6 this query should find only cstring_in and cstring_recv. +-- However, we must manually exclude shell_out. + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE p1.prorettype = 'cstring'::regtype + AND NOT EXISTS(SELECT 1 FROM pg_type WHERE typoutput = p1.oid) + AND NOT EXISTS(SELECT 1 FROM pg_type WHERE typmodout = p1.oid) + AND p1.oid != 'shell_out(void)'::regprocedure +ORDER BY 1; + +-- Check for length inconsistencies between the various argument-info arrays. + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proallargtypes IS NOT NULL AND + array_length(proallargtypes,1) < array_length(proargtypes,1); + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proargmodes IS NOT NULL AND + array_length(proargmodes,1) < array_length(proargtypes,1); + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proargnames IS NOT NULL AND + array_length(proargnames,1) < array_length(proargtypes,1); + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proallargtypes IS NOT NULL AND proargmodes IS NOT NULL AND + array_length(proallargtypes,1) <> array_length(proargmodes,1); + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proallargtypes IS NOT NULL AND proargnames IS NOT NULL AND + array_length(proallargtypes,1) <> array_length(proargnames,1); + +SELECT p1.oid, p1.proname +FROM pg_proc as p1 +WHERE proargmodes IS NOT NULL AND proargnames IS NOT NULL AND + array_length(proargmodes,1) <> array_length(proargnames,1); + +-- Check that proallargtypes matches proargtypes +SELECT p1.oid, p1.proname, p1.proargtypes, p1.proallargtypes, p1.proargmodes +FROM pg_proc as p1 +WHERE proallargtypes IS NOT NULL AND + ARRAY(SELECT unnest(proargtypes)) <> + ARRAY(SELECT proallargtypes[i] + FROM generate_series(1, array_length(proallargtypes, 1)) g(i) + WHERE proargmodes IS NULL OR proargmodes[i] IN ('i', 'b', 'v')); + +-- Check for prosupport functions with the wrong signature +SELECT p1.oid, p1.proname, p2.oid, p2.proname +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p2.oid = p1.prosupport AND + (p2.prorettype != 'internal'::regtype OR p2.proretset OR p2.pronargs != 1 + OR p2.proargtypes[0] != 'internal'::regtype); + +-- Insist that all built-in pg_proc entries have descriptions +SELECT p1.oid, p1.proname +FROM pg_proc as p1 LEFT JOIN pg_description as d + ON p1.tableoid = d.classoid and p1.oid = d.objoid and d.objsubid = 0 +WHERE d.classoid IS NULL AND p1.oid <= 9999; + +-- List of built-in leakproof functions +-- +-- Leakproof functions should only be added after carefully +-- scrutinizing all possibly executed codepaths for possible +-- information leaks. Don't add functions here unless you know what a +-- leakproof function is. If unsure, don't mark it as such. + +-- temporarily disable fancy output, so catalog changes create less diff noise +\a\t + +SELECT p1.oid::regprocedure +FROM pg_proc p1 JOIN pg_namespace pn + ON pronamespace = pn.oid +WHERE nspname = 'pg_catalog' AND proleakproof +ORDER BY 1; + +-- restore normal output mode +\a\t + +-- List of functions used by libpq's fe-lobj.c +-- +-- If the output of this query changes, you probably broke libpq. +-- lo_initialize() assumes that there will be at most one match for +-- each listed name. +select proname, oid from pg_catalog.pg_proc +where proname in ( + 'lo_open', + 'lo_close', + 'lo_creat', + 'lo_create', + 'lo_unlink', + 'lo_lseek', + 'lo_lseek64', + 'lo_tell', + 'lo_tell64', + 'lo_truncate', + 'lo_truncate64', + 'loread', + 'lowrite') +and pronamespace = (select oid from pg_catalog.pg_namespace + where nspname = 'pg_catalog') +order by 1; + +-- Check that all immutable functions are marked parallel safe +SELECT p1.oid, p1.proname +FROM pg_proc AS p1 +WHERE provolatile = 'i' AND proparallel = 'u'; + + +-- **************** pg_cast **************** + +-- Catch bogus values in pg_cast columns (other than cases detected by +-- oidjoins test). + +SELECT * +FROM pg_cast c +WHERE castsource = 0 OR casttarget = 0 OR castcontext NOT IN ('e', 'a', 'i') + OR castmethod NOT IN ('f', 'b' ,'i'); + +-- Check that castfunc is nonzero only for cast methods that need a function, +-- and zero otherwise + +SELECT * +FROM pg_cast c +WHERE (castmethod = 'f' AND castfunc = 0) + OR (castmethod IN ('b', 'i') AND castfunc <> 0); + +-- Look for casts to/from the same type that aren't length coercion functions. +-- (We assume they are length coercions if they take multiple arguments.) +-- Such entries are not necessarily harmful, but they are useless. + +SELECT * +FROM pg_cast c +WHERE castsource = casttarget AND castfunc = 0; + +SELECT c.* +FROM pg_cast c, pg_proc p +WHERE c.castfunc = p.oid AND p.pronargs < 2 AND castsource = casttarget; + +-- Look for cast functions that don't have the right signature. The +-- argument and result types in pg_proc must be the same as, or binary +-- compatible with, what it says in pg_cast. +-- As a special case, we allow casts from CHAR(n) that use functions +-- declared to take TEXT. This does not pass the binary-coercibility test +-- because CHAR(n)-to-TEXT normally invokes rtrim(). However, the results +-- are the same, so long as the function is one that ignores trailing blanks. + +SELECT c.* +FROM pg_cast c, pg_proc p +WHERE c.castfunc = p.oid AND + (p.pronargs < 1 OR p.pronargs > 3 + OR NOT (binary_coercible(c.castsource, p.proargtypes[0]) + OR (c.castsource = 'character'::regtype AND + p.proargtypes[0] = 'text'::regtype)) + OR NOT binary_coercible(p.prorettype, c.casttarget)); + +SELECT c.* +FROM pg_cast c, pg_proc p +WHERE c.castfunc = p.oid AND + ((p.pronargs > 1 AND p.proargtypes[1] != 'int4'::regtype) OR + (p.pronargs > 2 AND p.proargtypes[2] != 'bool'::regtype)); + +-- Look for binary compatible casts that do not have the reverse +-- direction registered as well, or where the reverse direction is not +-- also binary compatible. This is legal, but usually not intended. + +-- As of 7.4, this finds the casts from text and varchar to bpchar, because +-- those are binary-compatible while the reverse way goes through rtrim(). + +-- As of 8.2, this finds the cast from cidr to inet, because that is a +-- trivial binary coercion while the other way goes through inet_to_cidr(). + +-- As of 8.3, this finds the casts from xml to text, varchar, and bpchar, +-- because those are binary-compatible while the reverse goes through +-- texttoxml(), which does an XML syntax check. + +-- As of 9.1, this finds the cast from pg_node_tree to text, which we +-- intentionally do not provide a reverse pathway for. + +SELECT castsource::regtype, casttarget::regtype, castfunc, castcontext +FROM pg_cast c +WHERE c.castmethod = 'b' AND + NOT EXISTS (SELECT 1 FROM pg_cast k + WHERE k.castmethod = 'b' AND + k.castsource = c.casttarget AND + k.casttarget = c.castsource); + + +-- **************** pg_conversion **************** + +-- Look for illegal values in pg_conversion fields. + +SELECT p1.oid, p1.conname +FROM pg_conversion as p1 +WHERE p1.conproc = 0 OR + pg_encoding_to_char(conforencoding) = '' OR + pg_encoding_to_char(contoencoding) = ''; + +-- Look for conprocs that don't have the expected signature. + +SELECT p.oid, p.proname, c.oid, c.conname +FROM pg_proc p, pg_conversion c +WHERE p.oid = c.conproc AND + (p.prorettype != 'int4'::regtype OR p.proretset OR + p.pronargs != 6 OR + p.proargtypes[0] != 'int4'::regtype OR + p.proargtypes[1] != 'int4'::regtype OR + p.proargtypes[2] != 'cstring'::regtype OR + p.proargtypes[3] != 'internal'::regtype OR + p.proargtypes[4] != 'int4'::regtype OR + p.proargtypes[5] != 'bool'::regtype); + +-- Check for conprocs that don't perform the specific conversion that +-- pg_conversion alleges they do, by trying to invoke each conversion +-- on some simple ASCII data. (The conproc should throw an error if +-- it doesn't accept the encodings that are passed to it.) +-- Unfortunately, we can't test non-default conprocs this way, because +-- there is no way to ask convert() to invoke them, and we cannot call +-- them directly from SQL. But there are no non-default built-in +-- conversions anyway. +-- (Similarly, this doesn't cope with any search path issues.) + +SELECT p1.oid, p1.conname +FROM pg_conversion as p1 +WHERE condefault AND + convert('ABC'::bytea, pg_encoding_to_char(conforencoding), + pg_encoding_to_char(contoencoding)) != 'ABC'; + + +-- **************** pg_operator **************** + +-- Look for illegal values in pg_operator fields. + +SELECT p1.oid, p1.oprname +FROM pg_operator as p1 +WHERE (p1.oprkind != 'b' AND p1.oprkind != 'l') OR + p1.oprresult = 0 OR p1.oprcode = 0; + +-- Look for missing or unwanted operand types + +SELECT p1.oid, p1.oprname +FROM pg_operator as p1 +WHERE (p1.oprleft = 0 and p1.oprkind != 'l') OR + (p1.oprleft != 0 and p1.oprkind = 'l') OR + p1.oprright = 0; + +-- Look for conflicting operator definitions (same names and input datatypes). + +SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode +FROM pg_operator AS p1, pg_operator AS p2 +WHERE p1.oid != p2.oid AND + p1.oprname = p2.oprname AND + p1.oprkind = p2.oprkind AND + p1.oprleft = p2.oprleft AND + p1.oprright = p2.oprright; + +-- Look for commutative operators that don't commute. +-- DEFINITIONAL NOTE: If A.oprcom = B, then x A y has the same result as y B x. +-- We expect that B will always say that B.oprcom = A as well; that's not +-- inherently essential, but it would be inefficient not to mark it so. + +SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode +FROM pg_operator AS p1, pg_operator AS p2 +WHERE p1.oprcom = p2.oid AND + (p1.oprkind != 'b' OR + p1.oprleft != p2.oprright OR + p1.oprright != p2.oprleft OR + p1.oprresult != p2.oprresult OR + p1.oid != p2.oprcom); + +-- Look for negatory operators that don't agree. +-- DEFINITIONAL NOTE: If A.oprnegate = B, then both A and B must yield +-- boolean results, and (x A y) == ! (x B y), or the equivalent for +-- single-operand operators. +-- We expect that B will always say that B.oprnegate = A as well; that's not +-- inherently essential, but it would be inefficient not to mark it so. +-- Also, A and B had better not be the same operator. + +SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode +FROM pg_operator AS p1, pg_operator AS p2 +WHERE p1.oprnegate = p2.oid AND + (p1.oprkind != p2.oprkind OR + p1.oprleft != p2.oprleft OR + p1.oprright != p2.oprright OR + p1.oprresult != 'bool'::regtype OR + p2.oprresult != 'bool'::regtype OR + p1.oid != p2.oprnegate OR + p1.oid = p2.oid); + +-- Make a list of the names of operators that are claimed to be commutator +-- pairs. This list will grow over time, but before accepting a new entry +-- make sure you didn't link the wrong operators. + +SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2 +FROM pg_operator o1, pg_operator o2 +WHERE o1.oprcom = o2.oid AND o1.oprname <= o2.oprname +ORDER BY 1, 2; + +-- Likewise for negator pairs. + +SELECT DISTINCT o1.oprname AS op1, o2.oprname AS op2 +FROM pg_operator o1, pg_operator o2 +WHERE o1.oprnegate = o2.oid AND o1.oprname <= o2.oprname +ORDER BY 1, 2; + +-- A mergejoinable or hashjoinable operator must be binary, must return +-- boolean, and must have a commutator (itself, unless it's a cross-type +-- operator). + +SELECT p1.oid, p1.oprname FROM pg_operator AS p1 +WHERE (p1.oprcanmerge OR p1.oprcanhash) AND NOT + (p1.oprkind = 'b' AND p1.oprresult = 'bool'::regtype AND p1.oprcom != 0); + +-- What's more, the commutator had better be mergejoinable/hashjoinable too. + +SELECT p1.oid, p1.oprname, p2.oid, p2.oprname +FROM pg_operator AS p1, pg_operator AS p2 +WHERE p1.oprcom = p2.oid AND + (p1.oprcanmerge != p2.oprcanmerge OR + p1.oprcanhash != p2.oprcanhash); + +-- Mergejoinable operators should appear as equality members of btree index +-- opfamilies. + +SELECT p1.oid, p1.oprname +FROM pg_operator AS p1 +WHERE p1.oprcanmerge AND NOT EXISTS + (SELECT 1 FROM pg_amop + WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') AND + amopopr = p1.oid AND amopstrategy = 3); + +-- And the converse. + +SELECT p1.oid, p1.oprname, p.amopfamily +FROM pg_operator AS p1, pg_amop p +WHERE amopopr = p1.oid + AND amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') + AND amopstrategy = 3 + AND NOT p1.oprcanmerge; + +-- Hashable operators should appear as members of hash index opfamilies. + +SELECT p1.oid, p1.oprname +FROM pg_operator AS p1 +WHERE p1.oprcanhash AND NOT EXISTS + (SELECT 1 FROM pg_amop + WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'hash') AND + amopopr = p1.oid AND amopstrategy = 1); + +-- And the converse. + +SELECT p1.oid, p1.oprname, p.amopfamily +FROM pg_operator AS p1, pg_amop p +WHERE amopopr = p1.oid + AND amopmethod = (SELECT oid FROM pg_am WHERE amname = 'hash') + AND NOT p1.oprcanhash; + +-- Check that each operator defined in pg_operator matches its oprcode entry +-- in pg_proc. Easiest to do this separately for each oprkind. + +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprcode = p2.oid AND + p1.oprkind = 'b' AND + (p2.pronargs != 2 + OR NOT binary_coercible(p2.prorettype, p1.oprresult) + OR NOT binary_coercible(p1.oprleft, p2.proargtypes[0]) + OR NOT binary_coercible(p1.oprright, p2.proargtypes[1])); + +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprcode = p2.oid AND + p1.oprkind = 'l' AND + (p2.pronargs != 1 + OR NOT binary_coercible(p2.prorettype, p1.oprresult) + OR NOT binary_coercible(p1.oprright, p2.proargtypes[0]) + OR p1.oprleft != 0); + +-- If the operator is mergejoinable or hashjoinable, its underlying function +-- should not be volatile. + +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprcode = p2.oid AND + (p1.oprcanmerge OR p1.oprcanhash) AND + p2.provolatile = 'v'; + +-- If oprrest is set, the operator must return boolean, +-- and it must link to a proc with the right signature +-- to be a restriction selectivity estimator. +-- The proc signature we want is: float8 proc(internal, oid, internal, int4) + +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprrest = p2.oid AND + (p1.oprresult != 'bool'::regtype OR + p2.prorettype != 'float8'::regtype OR p2.proretset OR + p2.pronargs != 4 OR + p2.proargtypes[0] != 'internal'::regtype OR + p2.proargtypes[1] != 'oid'::regtype OR + p2.proargtypes[2] != 'internal'::regtype OR + p2.proargtypes[3] != 'int4'::regtype); + +-- If oprjoin is set, the operator must be a binary boolean op, +-- and it must link to a proc with the right signature +-- to be a join selectivity estimator. +-- The proc signature we want is: float8 proc(internal, oid, internal, int2, internal) +-- (Note: the old signature with only 4 args is still allowed, but no core +-- estimator should be using it.) + +SELECT p1.oid, p1.oprname, p2.oid, p2.proname +FROM pg_operator AS p1, pg_proc AS p2 +WHERE p1.oprjoin = p2.oid AND + (p1.oprkind != 'b' OR p1.oprresult != 'bool'::regtype OR + p2.prorettype != 'float8'::regtype OR p2.proretset OR + p2.pronargs != 5 OR + p2.proargtypes[0] != 'internal'::regtype OR + p2.proargtypes[1] != 'oid'::regtype OR + p2.proargtypes[2] != 'internal'::regtype OR + p2.proargtypes[3] != 'int2'::regtype OR + p2.proargtypes[4] != 'internal'::regtype); + +-- Insist that all built-in pg_operator entries have descriptions +SELECT p1.oid, p1.oprname +FROM pg_operator as p1 LEFT JOIN pg_description as d + ON p1.tableoid = d.classoid and p1.oid = d.objoid and d.objsubid = 0 +WHERE d.classoid IS NULL AND p1.oid <= 9999; + +-- Check that operators' underlying functions have suitable comments, +-- namely 'implementation of XXX operator'. (Note: it's not necessary to +-- put such comments into pg_proc.dat; initdb will generate them as needed.) +-- In some cases involving legacy names for operators, there are multiple +-- operators referencing the same pg_proc entry, so ignore operators whose +-- comments say they are deprecated. +-- We also have a few functions that are both operator support and meant to +-- be called directly; those should have comments matching their operator. +WITH funcdescs AS ( + SELECT p.oid as p_oid, proname, o.oid as o_oid, + pd.description as prodesc, + 'implementation of ' || oprname || ' operator' as expecteddesc, + od.description as oprdesc + FROM pg_proc p JOIN pg_operator o ON oprcode = p.oid + LEFT JOIN pg_description pd ON + (pd.objoid = p.oid and pd.classoid = p.tableoid and pd.objsubid = 0) + LEFT JOIN pg_description od ON + (od.objoid = o.oid and od.classoid = o.tableoid and od.objsubid = 0) + WHERE o.oid <= 9999 +) +SELECT * FROM funcdescs + WHERE prodesc IS DISTINCT FROM expecteddesc + AND oprdesc NOT LIKE 'deprecated%' + AND prodesc IS DISTINCT FROM oprdesc; + +-- Show all the operator-implementation functions that have their own +-- comments. This should happen only in cases where the function and +-- operator syntaxes are both documented at the user level. +-- This should be a pretty short list; it's mostly legacy cases. +WITH funcdescs AS ( + SELECT p.oid as p_oid, proname, o.oid as o_oid, + pd.description as prodesc, + 'implementation of ' || oprname || ' operator' as expecteddesc, + od.description as oprdesc + FROM pg_proc p JOIN pg_operator o ON oprcode = p.oid + LEFT JOIN pg_description pd ON + (pd.objoid = p.oid and pd.classoid = p.tableoid and pd.objsubid = 0) + LEFT JOIN pg_description od ON + (od.objoid = o.oid and od.classoid = o.tableoid and od.objsubid = 0) + WHERE o.oid <= 9999 +) +SELECT p_oid, proname, prodesc FROM funcdescs + WHERE prodesc IS DISTINCT FROM expecteddesc + AND oprdesc NOT LIKE 'deprecated%' +ORDER BY 1; + +-- Operators that are commutator pairs should have identical volatility +-- and leakproofness markings on their implementation functions. +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2, pg_proc AS p1, pg_proc AS p2 +WHERE o1.oprcom = o2.oid AND p1.oid = o1.oprcode AND p2.oid = o2.oprcode AND + (p1.provolatile != p2.provolatile OR + p1.proleakproof != p2.proleakproof); + +-- Likewise for negator pairs. +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2, pg_proc AS p1, pg_proc AS p2 +WHERE o1.oprnegate = o2.oid AND p1.oid = o1.oprcode AND p2.oid = o2.oprcode AND + (p1.provolatile != p2.provolatile OR + p1.proleakproof != p2.proleakproof); + +-- Btree comparison operators' functions should have the same volatility +-- and leakproofness markings as the associated comparison support function. +SELECT pp.oid::regprocedure as proc, pp.provolatile as vp, pp.proleakproof as lp, + po.oid::regprocedure as opr, po.provolatile as vo, po.proleakproof as lo +FROM pg_proc pp, pg_proc po, pg_operator o, pg_amproc ap, pg_amop ao +WHERE pp.oid = ap.amproc AND po.oid = o.oprcode AND o.oid = ao.amopopr AND + ao.amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') AND + ao.amopfamily = ap.amprocfamily AND + ao.amoplefttype = ap.amproclefttype AND + ao.amoprighttype = ap.amprocrighttype AND + ap.amprocnum = 1 AND + (pp.provolatile != po.provolatile OR + pp.proleakproof != po.proleakproof) +ORDER BY 1; + + +-- **************** pg_aggregate **************** + +-- Look for illegal values in pg_aggregate fields. + +SELECT ctid, aggfnoid::oid +FROM pg_aggregate as p1 +WHERE aggfnoid = 0 OR aggtransfn = 0 OR + aggkind NOT IN ('n', 'o', 'h') OR + aggnumdirectargs < 0 OR + (aggkind = 'n' AND aggnumdirectargs > 0) OR + aggfinalmodify NOT IN ('r', 's', 'w') OR + aggmfinalmodify NOT IN ('r', 's', 'w') OR + aggtranstype = 0 OR aggtransspace < 0 OR aggmtransspace < 0; + +-- Make sure the matching pg_proc entry is sensible, too. + +SELECT a.aggfnoid::oid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggfnoid = p.oid AND + (p.prokind != 'a' OR p.proretset OR p.pronargs < a.aggnumdirectargs); + +-- Make sure there are no prokind = PROKIND_AGGREGATE pg_proc entries without matches. + +SELECT oid, proname +FROM pg_proc as p +WHERE p.prokind = 'a' AND + NOT EXISTS (SELECT 1 FROM pg_aggregate a WHERE a.aggfnoid = p.oid); + +-- If there is no finalfn then the output type must be the transtype. + +SELECT a.aggfnoid::oid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggfnoid = p.oid AND + a.aggfinalfn = 0 AND p.prorettype != a.aggtranstype; + +-- Cross-check transfn against its entry in pg_proc. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggtransfn = ptr.oid AND + (ptr.proretset + OR NOT (ptr.pronargs = + CASE WHEN a.aggkind = 'n' THEN p.pronargs + 1 + ELSE greatest(p.pronargs - a.aggnumdirectargs, 1) + 1 END) + OR NOT binary_coercible(ptr.prorettype, a.aggtranstype) + OR NOT binary_coercible(a.aggtranstype, ptr.proargtypes[0]) + OR (p.pronargs > 0 AND + NOT binary_coercible(p.proargtypes[0], ptr.proargtypes[1])) + OR (p.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[1], ptr.proargtypes[2])) + OR (p.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[2], ptr.proargtypes[3])) + -- we could carry the check further, but 3 args is enough for now + OR (p.pronargs > 3) + ); + +-- Cross-check finalfn (if present) against its entry in pg_proc. + +SELECT a.aggfnoid::oid, p.proname, pfn.oid, pfn.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS pfn +WHERE a.aggfnoid = p.oid AND + a.aggfinalfn = pfn.oid AND + (pfn.proretset OR + NOT binary_coercible(pfn.prorettype, p.prorettype) OR + NOT binary_coercible(a.aggtranstype, pfn.proargtypes[0]) OR + CASE WHEN a.aggfinalextra THEN pfn.pronargs != p.pronargs + 1 + ELSE pfn.pronargs != a.aggnumdirectargs + 1 END + OR (pfn.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[0], pfn.proargtypes[1])) + OR (pfn.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[1], pfn.proargtypes[2])) + OR (pfn.pronargs > 3 AND + NOT binary_coercible(p.proargtypes[2], pfn.proargtypes[3])) + -- we could carry the check further, but 4 args is enough for now + OR (pfn.pronargs > 4) + ); + +-- If transfn is strict then either initval should be non-NULL, or +-- input type should match transtype so that the first non-null input +-- can be assigned as the state value. + +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggtransfn = ptr.oid AND ptr.proisstrict AND + a.agginitval IS NULL AND + NOT binary_coercible(p.proargtypes[0], a.aggtranstype); + +-- Check for inconsistent specifications of moving-aggregate columns. + +SELECT ctid, aggfnoid::oid +FROM pg_aggregate as p1 +WHERE aggmtranstype != 0 AND + (aggmtransfn = 0 OR aggminvtransfn = 0); + +SELECT ctid, aggfnoid::oid +FROM pg_aggregate as p1 +WHERE aggmtranstype = 0 AND + (aggmtransfn != 0 OR aggminvtransfn != 0 OR aggmfinalfn != 0 OR + aggmtransspace != 0 OR aggminitval IS NOT NULL); + +-- If there is no mfinalfn then the output type must be the mtranstype. + +SELECT a.aggfnoid::oid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggfnoid = p.oid AND + a.aggmtransfn != 0 AND + a.aggmfinalfn = 0 AND p.prorettype != a.aggmtranstype; + +-- Cross-check mtransfn (if present) against its entry in pg_proc. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggmtransfn = ptr.oid AND + (ptr.proretset + OR NOT (ptr.pronargs = + CASE WHEN a.aggkind = 'n' THEN p.pronargs + 1 + ELSE greatest(p.pronargs - a.aggnumdirectargs, 1) + 1 END) + OR NOT binary_coercible(ptr.prorettype, a.aggmtranstype) + OR NOT binary_coercible(a.aggmtranstype, ptr.proargtypes[0]) + OR (p.pronargs > 0 AND + NOT binary_coercible(p.proargtypes[0], ptr.proargtypes[1])) + OR (p.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[1], ptr.proargtypes[2])) + OR (p.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[2], ptr.proargtypes[3])) + -- we could carry the check further, but 3 args is enough for now + OR (p.pronargs > 3) + ); + +-- Cross-check minvtransfn (if present) against its entry in pg_proc. +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggminvtransfn = ptr.oid AND + (ptr.proretset + OR NOT (ptr.pronargs = + CASE WHEN a.aggkind = 'n' THEN p.pronargs + 1 + ELSE greatest(p.pronargs - a.aggnumdirectargs, 1) + 1 END) + OR NOT binary_coercible(ptr.prorettype, a.aggmtranstype) + OR NOT binary_coercible(a.aggmtranstype, ptr.proargtypes[0]) + OR (p.pronargs > 0 AND + NOT binary_coercible(p.proargtypes[0], ptr.proargtypes[1])) + OR (p.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[1], ptr.proargtypes[2])) + OR (p.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[2], ptr.proargtypes[3])) + -- we could carry the check further, but 3 args is enough for now + OR (p.pronargs > 3) + ); + +-- Cross-check mfinalfn (if present) against its entry in pg_proc. + +SELECT a.aggfnoid::oid, p.proname, pfn.oid, pfn.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS pfn +WHERE a.aggfnoid = p.oid AND + a.aggmfinalfn = pfn.oid AND + (pfn.proretset OR + NOT binary_coercible(pfn.prorettype, p.prorettype) OR + NOT binary_coercible(a.aggmtranstype, pfn.proargtypes[0]) OR + CASE WHEN a.aggmfinalextra THEN pfn.pronargs != p.pronargs + 1 + ELSE pfn.pronargs != a.aggnumdirectargs + 1 END + OR (pfn.pronargs > 1 AND + NOT binary_coercible(p.proargtypes[0], pfn.proargtypes[1])) + OR (pfn.pronargs > 2 AND + NOT binary_coercible(p.proargtypes[1], pfn.proargtypes[2])) + OR (pfn.pronargs > 3 AND + NOT binary_coercible(p.proargtypes[2], pfn.proargtypes[3])) + -- we could carry the check further, but 4 args is enough for now + OR (pfn.pronargs > 4) + ); + +-- If mtransfn is strict then either minitval should be non-NULL, or +-- input type should match mtranstype so that the first non-null input +-- can be assigned as the state value. + +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr +WHERE a.aggfnoid = p.oid AND + a.aggmtransfn = ptr.oid AND ptr.proisstrict AND + a.aggminitval IS NULL AND + NOT binary_coercible(p.proargtypes[0], a.aggmtranstype); + +-- mtransfn and minvtransfn should have same strictness setting. + +SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.proname, iptr.oid, iptr.proname +FROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptr, pg_proc AS iptr +WHERE a.aggfnoid = p.oid AND + a.aggmtransfn = ptr.oid AND + a.aggminvtransfn = iptr.oid AND + ptr.proisstrict != iptr.proisstrict; + +-- Check that all combine functions have signature +-- combine(transtype, transtype) returns transtype + +SELECT a.aggfnoid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggcombinefn = p.oid AND + (p.pronargs != 2 OR + p.prorettype != p.proargtypes[0] OR + p.prorettype != p.proargtypes[1] OR + NOT binary_coercible(a.aggtranstype, p.proargtypes[0])); + +-- Check that no combine function for an INTERNAL transtype is strict. + +SELECT a.aggfnoid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggcombinefn = p.oid AND + a.aggtranstype = 'internal'::regtype AND p.proisstrict; + +-- serialize/deserialize functions should be specified only for aggregates +-- with transtype internal and a combine function, and we should have both +-- or neither of them. + +SELECT aggfnoid, aggtranstype, aggserialfn, aggdeserialfn +FROM pg_aggregate +WHERE (aggserialfn != 0 OR aggdeserialfn != 0) + AND (aggtranstype != 'internal'::regtype OR aggcombinefn = 0 OR + aggserialfn = 0 OR aggdeserialfn = 0); + +-- Check that all serialization functions have signature +-- serialize(internal) returns bytea +-- Also insist that they be strict; it's wasteful to run them on NULLs. + +SELECT a.aggfnoid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggserialfn = p.oid AND + (p.prorettype != 'bytea'::regtype OR p.pronargs != 1 OR + p.proargtypes[0] != 'internal'::regtype OR + NOT p.proisstrict); + +-- Check that all deserialization functions have signature +-- deserialize(bytea, internal) returns internal +-- Also insist that they be strict; it's wasteful to run them on NULLs. + +SELECT a.aggfnoid, p.proname +FROM pg_aggregate as a, pg_proc as p +WHERE a.aggdeserialfn = p.oid AND + (p.prorettype != 'internal'::regtype OR p.pronargs != 2 OR + p.proargtypes[0] != 'bytea'::regtype OR + p.proargtypes[1] != 'internal'::regtype OR + NOT p.proisstrict); + +-- Check that aggregates which have the same transition function also have +-- the same combine, serialization, and deserialization functions. +-- While that isn't strictly necessary, it's fishy if they don't. + +SELECT a.aggfnoid, a.aggcombinefn, a.aggserialfn, a.aggdeserialfn, + b.aggfnoid, b.aggcombinefn, b.aggserialfn, b.aggdeserialfn +FROM + pg_aggregate a, pg_aggregate b +WHERE + a.aggfnoid < b.aggfnoid AND a.aggtransfn = b.aggtransfn AND + (a.aggcombinefn != b.aggcombinefn OR a.aggserialfn != b.aggserialfn + OR a.aggdeserialfn != b.aggdeserialfn); + +-- Cross-check aggsortop (if present) against pg_operator. +-- We expect to find entries for bool_and, bool_or, every, max, and min. + +SELECT DISTINCT proname, oprname +FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p +WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid +ORDER BY 1, 2; + +-- Check datatypes match + +SELECT a.aggfnoid::oid, o.oid +FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p +WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid AND + (oprkind != 'b' OR oprresult != 'boolean'::regtype + OR oprleft != p.proargtypes[0] OR oprright != p.proargtypes[0]); + +-- Check operator is a suitable btree opfamily member + +SELECT a.aggfnoid::oid, o.oid +FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p +WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid AND + NOT EXISTS(SELECT 1 FROM pg_amop + WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') + AND amopopr = o.oid + AND amoplefttype = o.oprleft + AND amoprighttype = o.oprright); + +-- Check correspondence of btree strategies and names + +SELECT DISTINCT proname, oprname, amopstrategy +FROM pg_operator AS o, pg_aggregate AS a, pg_proc AS p, + pg_amop as ao +WHERE a.aggfnoid = p.oid AND a.aggsortop = o.oid AND + amopopr = o.oid AND + amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') +ORDER BY 1, 2; + +-- Check that there are not aggregates with the same name and different +-- numbers of arguments. While not technically wrong, we have a project policy +-- to avoid this because it opens the door for confusion in connection with +-- ORDER BY: novices frequently put the ORDER BY in the wrong place. +-- See the fate of the single-argument form of string_agg() for history. +-- (Note: we don't forbid users from creating such aggregates; the policy is +-- just to think twice before creating built-in aggregates like this.) +-- The only aggregates that should show up here are count(x) and count(*). + +SELECT p1.oid::regprocedure, p2.oid::regprocedure +FROM pg_proc AS p1, pg_proc AS p2 +WHERE p1.oid < p2.oid AND p1.proname = p2.proname AND + p1.prokind = 'a' AND p2.prokind = 'a' AND + array_dims(p1.proargtypes) != array_dims(p2.proargtypes) +ORDER BY 1; + +-- For the same reason, built-in aggregates with default arguments are no good. + +SELECT oid, proname +FROM pg_proc AS p +WHERE prokind = 'a' AND proargdefaults IS NOT NULL; + +-- For the same reason, we avoid creating built-in variadic aggregates, except +-- that variadic ordered-set aggregates are OK (since they have special syntax +-- that is not subject to the misplaced ORDER BY issue). + +SELECT p.oid, proname +FROM pg_proc AS p JOIN pg_aggregate AS a ON a.aggfnoid = p.oid +WHERE prokind = 'a' AND provariadic != 0 AND a.aggkind = 'n'; + + +-- **************** pg_opfamily **************** + +-- Look for illegal values in pg_opfamily fields + +SELECT p1.oid +FROM pg_opfamily as p1 +WHERE p1.opfmethod = 0 OR p1.opfnamespace = 0; + +-- Look for opfamilies having no opclasses. While most validation of +-- opfamilies is now handled by AM-specific amvalidate functions, that's +-- driven from pg_opclass entries below, so an empty opfamily would not +-- get noticed. + +SELECT oid, opfname FROM pg_opfamily f +WHERE NOT EXISTS (SELECT 1 FROM pg_opclass WHERE opcfamily = f.oid); + + +-- **************** pg_opclass **************** + +-- Look for illegal values in pg_opclass fields + +SELECT p1.oid +FROM pg_opclass AS p1 +WHERE p1.opcmethod = 0 OR p1.opcnamespace = 0 OR p1.opcfamily = 0 + OR p1.opcintype = 0; + +-- opcmethod must match owning opfamily's opfmethod + +SELECT p1.oid, p2.oid +FROM pg_opclass AS p1, pg_opfamily AS p2 +WHERE p1.opcfamily = p2.oid AND p1.opcmethod != p2.opfmethod; + +-- There should not be multiple entries in pg_opclass with opcdefault true +-- and the same opcmethod/opcintype combination. + +SELECT p1.oid, p2.oid +FROM pg_opclass AS p1, pg_opclass AS p2 +WHERE p1.oid != p2.oid AND + p1.opcmethod = p2.opcmethod AND p1.opcintype = p2.opcintype AND + p1.opcdefault AND p2.opcdefault; + +-- Ask access methods to validate opclasses +-- (this replaces a lot of SQL-level checks that used to be done in this file) + +SELECT oid, opcname FROM pg_opclass WHERE NOT amvalidate(oid); + + +-- **************** pg_am **************** + +-- Look for illegal values in pg_am fields + +SELECT p1.oid, p1.amname +FROM pg_am AS p1 +WHERE p1.amhandler = 0; + +-- Check for index amhandler functions with the wrong signature + +SELECT p1.oid, p1.amname, p2.oid, p2.proname +FROM pg_am AS p1, pg_proc AS p2 +WHERE p2.oid = p1.amhandler AND p1.amtype = 'i' AND + (p2.prorettype != 'index_am_handler'::regtype + OR p2.proretset + OR p2.pronargs != 1 + OR p2.proargtypes[0] != 'internal'::regtype); + +-- Check for table amhandler functions with the wrong signature + +SELECT p1.oid, p1.amname, p2.oid, p2.proname +FROM pg_am AS p1, pg_proc AS p2 +WHERE p2.oid = p1.amhandler AND p1.amtype = 's' AND + (p2.prorettype != 'table_am_handler'::regtype + OR p2.proretset + OR p2.pronargs != 1 + OR p2.proargtypes[0] != 'internal'::regtype); + +-- **************** pg_amop **************** + +-- Look for illegal values in pg_amop fields + +SELECT p1.amopfamily, p1.amopstrategy +FROM pg_amop as p1 +WHERE p1.amopfamily = 0 OR p1.amoplefttype = 0 OR p1.amoprighttype = 0 + OR p1.amopopr = 0 OR p1.amopmethod = 0 OR p1.amopstrategy < 1; + +SELECT p1.amopfamily, p1.amopstrategy +FROM pg_amop as p1 +WHERE NOT ((p1.amoppurpose = 's' AND p1.amopsortfamily = 0) OR + (p1.amoppurpose = 'o' AND p1.amopsortfamily <> 0)); + +-- amopmethod must match owning opfamily's opfmethod + +SELECT p1.oid, p2.oid +FROM pg_amop AS p1, pg_opfamily AS p2 +WHERE p1.amopfamily = p2.oid AND p1.amopmethod != p2.opfmethod; + +-- Make a list of all the distinct operator names being used in particular +-- strategy slots. This is a bit hokey, since the list might need to change +-- in future releases, but it's an effective way of spotting mistakes such as +-- swapping two operators within a family. + +SELECT DISTINCT amopmethod, amopstrategy, oprname +FROM pg_amop p1 LEFT JOIN pg_operator p2 ON amopopr = p2.oid +ORDER BY 1, 2, 3; + +-- Check that all opclass search operators have selectivity estimators. +-- This is not absolutely required, but it seems a reasonable thing +-- to insist on for all standard datatypes. + +SELECT p1.amopfamily, p1.amopopr, p2.oid, p2.oprname +FROM pg_amop AS p1, pg_operator AS p2 +WHERE p1.amopopr = p2.oid AND p1.amoppurpose = 's' AND + (p2.oprrest = 0 OR p2.oprjoin = 0); + +-- Check that each opclass in an opfamily has associated operators, that is +-- ones whose oprleft matches opcintype (possibly by coercion). + +SELECT p1.opcname, p1.opcfamily +FROM pg_opclass AS p1 +WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS p2 + WHERE p2.amopfamily = p1.opcfamily + AND binary_coercible(p1.opcintype, p2.amoplefttype)); + +-- Check that each operator listed in pg_amop has an associated opclass, +-- that is one whose opcintype matches oprleft (possibly by coercion). +-- Otherwise the operator is useless because it cannot be matched to an index. +-- (In principle it could be useful to list such operators in multiple-datatype +-- btree opfamilies, but in practice you'd expect there to be an opclass for +-- every datatype the family knows about.) + +SELECT p1.amopfamily, p1.amopstrategy, p1.amopopr +FROM pg_amop AS p1 +WHERE NOT EXISTS(SELECT 1 FROM pg_opclass AS p2 + WHERE p2.opcfamily = p1.amopfamily + AND binary_coercible(p2.opcintype, p1.amoplefttype)); + +-- Operators that are primary members of opclasses must be immutable (else +-- it suggests that the index ordering isn't fixed). Operators that are +-- cross-type members need only be stable, since they are just shorthands +-- for index probe queries. + +SELECT p1.amopfamily, p1.amopopr, p2.oprname, p3.prosrc +FROM pg_amop AS p1, pg_operator AS p2, pg_proc AS p3 +WHERE p1.amopopr = p2.oid AND p2.oprcode = p3.oid AND + p1.amoplefttype = p1.amoprighttype AND + p3.provolatile != 'i'; + +SELECT p1.amopfamily, p1.amopopr, p2.oprname, p3.prosrc +FROM pg_amop AS p1, pg_operator AS p2, pg_proc AS p3 +WHERE p1.amopopr = p2.oid AND p2.oprcode = p3.oid AND + p1.amoplefttype != p1.amoprighttype AND + p3.provolatile = 'v'; + + +-- **************** pg_amproc **************** + +-- Look for illegal values in pg_amproc fields + +SELECT p1.amprocfamily, p1.amprocnum +FROM pg_amproc as p1 +WHERE p1.amprocfamily = 0 OR p1.amproclefttype = 0 OR p1.amprocrighttype = 0 + OR p1.amprocnum < 0 OR p1.amproc = 0; + +-- Support routines that are primary members of opfamilies must be immutable +-- (else it suggests that the index ordering isn't fixed). But cross-type +-- members need only be stable, since they are just shorthands +-- for index probe queries. + +SELECT p1.amprocfamily, p1.amproc, p2.prosrc +FROM pg_amproc AS p1, pg_proc AS p2 +WHERE p1.amproc = p2.oid AND + p1.amproclefttype = p1.amprocrighttype AND + p2.provolatile != 'i'; + +SELECT p1.amprocfamily, p1.amproc, p2.prosrc +FROM pg_amproc AS p1, pg_proc AS p2 +WHERE p1.amproc = p2.oid AND + p1.amproclefttype != p1.amprocrighttype AND + p2.provolatile = 'v'; + +-- Almost all of the core distribution's Btree opclasses can use one of the +-- two generic "equalimage" functions as their support function 4. Look for +-- opclasses that don't allow deduplication unconditionally here. +-- +-- Newly added Btree opclasses don't have to support deduplication. It will +-- usually be trivial to add support, though. Note that the expected output +-- of this part of the test will need to be updated when a new opclass cannot +-- support deduplication (by using btequalimage). +SELECT amp.amproc::regproc AS proc, opf.opfname AS opfamily_name, + opc.opcname AS opclass_name, opc.opcintype::regtype AS opcintype +FROM pg_am AS am +JOIN pg_opclass AS opc ON opc.opcmethod = am.oid +JOIN pg_opfamily AS opf ON opc.opcfamily = opf.oid +LEFT JOIN pg_amproc AS amp ON amp.amprocfamily = opf.oid AND + amp.amproclefttype = opc.opcintype AND amp.amprocnum = 4 +WHERE am.amname = 'btree' AND + amp.amproc IS DISTINCT FROM 'btequalimage'::regproc +ORDER BY 1, 2, 3; + +-- **************** pg_index **************** + +-- Look for illegal values in pg_index fields. + +SELECT p1.indexrelid, p1.indrelid +FROM pg_index as p1 +WHERE p1.indexrelid = 0 OR p1.indrelid = 0 OR + p1.indnatts <= 0 OR p1.indnatts > 32; + +-- oidvector and int2vector fields should be of length indnatts. + +SELECT p1.indexrelid, p1.indrelid +FROM pg_index as p1 +WHERE array_lower(indkey, 1) != 0 OR array_upper(indkey, 1) != indnatts-1 OR + array_lower(indclass, 1) != 0 OR array_upper(indclass, 1) != indnatts-1 OR + array_lower(indcollation, 1) != 0 OR array_upper(indcollation, 1) != indnatts-1 OR + array_lower(indoption, 1) != 0 OR array_upper(indoption, 1) != indnatts-1; + +-- Check that opclasses and collations match the underlying columns. +-- (As written, this test ignores expression indexes.) + +SELECT indexrelid::regclass, indrelid::regclass, attname, atttypid::regtype, opcname +FROM (SELECT indexrelid, indrelid, unnest(indkey) as ikey, + unnest(indclass) as iclass, unnest(indcollation) as icoll + FROM pg_index) ss, + pg_attribute a, + pg_opclass opc +WHERE a.attrelid = indrelid AND a.attnum = ikey AND opc.oid = iclass AND + (NOT binary_coercible(atttypid, opcintype) OR icoll != attcollation); + +-- For system catalogs, be even tighter: nearly all indexes should be +-- exact type matches not binary-coercible matches. At this writing +-- the only exception is an OID index on a regproc column. + +SELECT indexrelid::regclass, indrelid::regclass, attname, atttypid::regtype, opcname +FROM (SELECT indexrelid, indrelid, unnest(indkey) as ikey, + unnest(indclass) as iclass, unnest(indcollation) as icoll + FROM pg_index + WHERE indrelid < 16384) ss, + pg_attribute a, + pg_opclass opc +WHERE a.attrelid = indrelid AND a.attnum = ikey AND opc.oid = iclass AND + (opcintype != atttypid OR icoll != attcollation) +ORDER BY 1; + +-- Check for system catalogs with collation-sensitive ordering. This is not +-- a representational error in pg_index, but simply wrong catalog design. +-- It's bad because we expect to be able to clone template0 and assign the +-- copy a different database collation. It would especially not work for +-- shared catalogs. + +SELECT relname, attname, attcollation +FROM pg_class c, pg_attribute a +WHERE c.oid = attrelid AND c.oid < 16384 AND + c.relkind != 'v' AND -- we don't care about columns in views + c.relkind != 'f' AND -- GPDB: foreign/external tables are also OK. + c.relkind != 'c' AND -- GPDB: as well as composite types + attcollation != 0 AND + attcollation != (SELECT oid FROM pg_collation WHERE collname = 'C'); + +-- Double-check that collation-sensitive indexes have "C" collation, too. + +SELECT indexrelid::regclass, indrelid::regclass, iclass, icoll +FROM (SELECT indexrelid, indrelid, + unnest(indclass) as iclass, unnest(indcollation) as icoll + FROM pg_index + WHERE indrelid < 16384) ss +WHERE icoll != 0 AND + icoll != (SELECT oid FROM pg_collation WHERE collname = 'C'); diff --git a/src/test/singlenode_regress/sql/partition.sql b/src/test/singlenode_regress/sql/partition.sql new file mode 100644 index 00000000000..9afb9e57cdd --- /dev/null +++ b/src/test/singlenode_regress/sql/partition.sql @@ -0,0 +1,3774 @@ + +drop table if exists d; +drop table if exists c; +drop table if exists b; +drop table if exists a; +-- Check multi level partition COPY +create table region +( + r_regionkey integer not null, + r_name char(25), + r_comment varchar(152) +) + +partition by range (r_regionkey) +subpartition by list (r_name) subpartition template +( + subpartition africa values ('AFRICA'), + subpartition america values ('AMERICA'), + subpartition asia values ('ASIA'), + subpartition europe values ('EUROPE'), + subpartition mideast values ('MIDDLE EAST'), + subpartition australia values ('AUSTRALIA'), + subpartition antarctica values ('ANTARCTICA') +) +( + partition region1 start (0), + partition region2 start (3), + partition region3 start (5) end (8) +); + +-- root and internal parent partitions should have relfrozenxid as 0 +select relname, relkind from pg_class where relkind in ('r', 'p') and relname like 'region%' and relfrozenxid=0; +select gp_segment_id, relname, relkind from gp_dist_random('pg_class') where relkind in ('r', 'p') and relname like 'region%' and relfrozenxid=0; + +create unique index region_pkey on region(r_regionkey, r_name); + +copy region from stdin with delimiter '|'; +0|AFRICA|lar deposits. blithely final packages cajole. regular waters are +1|AMERICA|hs use ironic, even requests. s +2|ASIA|ges. thinly even pinto beans ca +3|EUROPE|ly final courts cajole furiously final excuse +4|MIDDLE EAST|uickly special accounts cajole carefully blithely close +5|AUSTRALIA|sdf +6|ANTARCTICA|dsfdfg +\. + +-- Test indexes +set enable_seqscan to off; +select * from region where r_regionkey = 1; +select * from region where r_regionkey = 2; +select * from region where r_regionkey = 3; +select * from region where r_regionkey = 4; +select * from region where r_regionkey = 5; +select * from region where r_regionkey = 6; + +-- Test indexes with insert + +insert into region values(7, 'AUSTRALIA', 'def'); +select * from region where r_regionkey = '7'; +-- test duplicate key. We shouldn't really allow primary keys on partitioned +-- tables since we cannot enforce them. But since this insert maps to a +-- single definitive partition, we can detect it. +insert into region values(7, 'AUSTRALIA', 'def'); + +drop table region; + +-- exchange +-- 1) test all sanity checking + +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); + +-- start_ignore +-- policies are different +create table bar_p_diff_pol (i int, j int); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_diff_pol; + +-- random policy vs. hash policy +create table bar_p_rand_pol (i int, j int); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_rand_pol; +-- end_ignore + +-- different number of columns +create table bar_p_diff_col (i int, j int, k int); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_diff_col; + +-- different types +create table bar_p_diff_typ (i int, j int8); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_diff_typ; + +-- different column names +create table bar_p_diff_colnam (i int, m int); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p_diff_colnam; + +-- still different schema, but more than one level partitioning +CREATE TABLE two_level_pt(a int, b int, c int) + +PARTITION BY RANGE (b) + SUBPARTITION BY RANGE (c) + SUBPARTITION TEMPLATE ( + START (11) END (12) EVERY (1)) + ( START (1) END (2) EVERY (1)); + +CREATE TABLE candidate_for_leaf(a int, c int); + +-- should fail +ALTER TABLE two_level_pt ALTER PARTITION FOR (1) + EXCHANGE PARTITION FOR (11) WITH TABLE candidate_for_leaf; + + +-- different owner +create role part_role; +create table bar_p (i int, j int); +set session authorization part_role; +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; + +-- back to superuser +\c - +alter table bar_p owner to part_role; +set session authorization part_role; +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +\c - + +-- owners should be the same, error out +alter table foo_p exchange partition for(6) with table bar_p; +drop table foo_p; +drop table bar_p; + +-- should work, and new partition should inherit ownership (mpp-6538) +set role part_role; +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(6) every(3)); +reset role; +alter table foo_p split partition for (1) at (2) into (partition prt_11, partition prt_12); +\dt foo_* +drop table foo_p; + +drop role part_role; + +-- WITH OIDS is no longer supported. Check that it't rejected with the GPDB +-- partitioning syntax, too. +create table foo_p (i int, j int) with (oids = true) +partition by range(j) +(start(1) end(10) every(1)); + +-- non-partition table involved in inheritance +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); + +create table barparent(i int, j int); +create table bar_p () inherits(barparent); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +drop table bar_p; +drop table barparent; + +-- non-partition table involved in inheritance +create table bar_p(i int, j int); +create table barchild () inherits(bar_p); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +drop table barchild; +drop table bar_p; + +-- rules on non-partition table +create table bar_p(i int, j int); +create table baz_p(i int, j int); +create rule bar_baz as on insert to bar_p do instead insert into baz_p + values(NEW.i, NEW.j); + +alter table foo_p exchange partition for(2) with table bar_p; +drop table foo_p, bar_p, baz_p; + +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(5) every(1)); + +-- Shouldn't fail: check constraint matches partition rule. +-- Note this test is slightly different from prior versions to get +-- in line with constraint consistency requirement. +create table bar_d(i int, j int check (j >= 2 and j < 3 )) +; +insert into bar_d values(100000, 2); +alter table foo_p exchange partition for(2) with table bar_d; +insert into bar_d values(200000, 2); +select * from bar_d; + +drop table foo_p, bar_d; + +-- permissions +create role part_role; +create table foo_p (i int) partition by range(i) (start(1) end(10) every(1)); +create table bar_p (i int); + +grant select on foo_p to part_role; +revoke all on bar_p from part_role; +select has_table_privilege('part_role', 'foo_p_1_prt_6'::regclass, 'select'); +select has_table_privilege('part_role', 'bar_p'::regclass, 'select'); +alter table foo_p exchange partition for(6) with table bar_p; + +select has_table_privilege('part_role', 'foo_p_1_prt_6'::regclass, 'select'); +select has_table_privilege('part_role', 'bar_p'::regclass, 'select'); + +drop table foo_p; +drop table bar_p; +drop role part_role; + +-- validation +create table foo_p (i int) partition by range(i) +(start(1) end(10) every(1)); +create table bar_p (i int); + +insert into bar_p values(6); +insert into bar_p values(100); +-- should fail +alter table foo_p exchange partition for(6) with table bar_p; +alter table foo_p exchange partition for(6) with table bar_p without +validation; +analyze foo_p; +select * from foo_p; +drop table foo_p, bar_p; + +-- basic test +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int); + +insert into bar_p values(0,6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; +select * from bar_p; +-- test that we got the dependencies right +drop table bar_p; +select * from foo_p; +drop table foo_p; +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int); + +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +insert into bar_p values(10, 10); +drop table foo_p; +select * from bar_p; +insert into bar_p values(6, 6); +select * from bar_p; +drop table bar_p; + +-- AO exchange with heap +create table foo_p (i int, j int) with(appendonly = true) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int); + +insert into foo_p values(1, 1), (2, 1), (3, 1); +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; +drop table bar_p; +drop table foo_p; + +-- other way around +create table foo_p (i int, j int) with(appendonly = false) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int) with(appendonly = true); + +insert into foo_p values(1, 1), (2, 1), (3, 2); +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; +drop table bar_p; +drop table foo_p; + +-- exchange AO with AO +create table foo_p (i int, j int) with(appendonly = true) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int) with(appendonly = true); + +insert into foo_p values(1, 2), (2, 3), (3, 4); +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; +drop table bar_p; +drop table foo_p; + +-- exchange same table more than once +create table foo_p (i int, j int) +partition by range(j) +(start(1) end(10) every(1)); +create table bar_p(i int, j int); + +insert into bar_p values(6, 6); +alter table foo_p exchange partition for(6) with table bar_p; +analyze foo_p; +select * from foo_p; +select * from bar_p; + +alter table foo_p exchange partition for(6) with table bar_p; +select * from foo_p; +select * from bar_p; + +alter table foo_p exchange partition for(6) with table bar_p; +select * from foo_p; +select * from bar_p; +drop table foo_p; +drop table bar_p; + +-- exchange default partition is not allowed (single level) +drop table if exists dex; +drop table if exists exh_abc; +create table dex (i int, j int) partition by range(j) +(partition a start (1) end(10), partition b start(11) end(20), +default partition abc); + +create table exh_abc (like dex); +alter table dex exchange default partition with table exh_abc; + +drop table dex; +drop table exh_abc; + +-- exchange default partition is not allowed (multi level) +Drop table if exists sto_ao_ao; +drop table if exists exh_ao_ao; + +Create table sto_ao_ao + ( + col1 bigint, col2 date, col3 text, col4 int) with(appendonly=true) + partition by range(col2) + subpartition by list (col3) + subpartition template ( default subpartition subothers, subpartition sub1 values ('one'), subpartition sub2 values ('two')) + (default partition others, start(date '2008-01-01') end(date '2008-04-30') every(interval '1 month')); + +create table exh_ao_ao (like sto_ao_ao) with (appendonly=true); +alter table sto_ao_ao alter partition for ('2008-03-01') exchange default partition with table exh_ao_ao; + +-- Exchange a non-default sub-partition of a default partition, should fail +alter table sto_ao_ao alter default partition exchange partition for ('one') with table exh_ao_ao; + +-- Exchange a partition that has sub partitions, should fail. +alter table sto_ao_ao exchange partition for ('2008-01-01') with table exh_ao_ao; + +-- XXX: not yet: VALIDATE parameter + +-- Exchange a partition with an external table; +create table foo_p (i int, j int) partition by range(j) (start(1) end(10) every(2)); +create readable external table bar_p(i int, j int) location ('gpfdist://host.invalid:8000/file') format 'text'; +alter table foo_p exchange partition for(3) with table bar_p; +truncate foo_p; +drop table foo_p; +drop table bar_p; + +-- Check for overflow of circular data types like time +-- Should fail +CREATE TABLE TIME_TBL_HOUR_2 (f1 time(2)) +partition by range (f1) +( + start (time '00:00') end (time '24:00') EVERY (INTERVAL '1 hour') +); +-- Should fail +CREATE TABLE TIME_TBL_HOUR_2 (f1 time(2)) +partition by range (f1) +( + start (time '00:00') end (time '23:59') EVERY (INTERVAL '1 hour') +); +-- Should work +CREATE TABLE TIME_TBL_HOUR_2 (f1 time(2)) +partition by range (f1) +( + start (time '00:00') end (time '23:00') EVERY (INTERVAL '1 hour') +); +drop table TIME_TBL_HOUR_2; +-- Check for every parameters that just don't make sense +create table hhh_r2 (a char(1), b date, d char(3)) + partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01') + every (interval '0 days') +); + +create table foo_p (i int) +partition by range(i) +(start (1) end (20) every(0)); + +-- Check for ambiguous EVERY parameters +create table foo_p (i int) +partition by range(i) +(start (1) end (3) every (0.6)); +\d+ foo_p +drop table foo_p; +-- should fail +create table foo_p (i int) +partition by range(i) +(start (1) end (3) every (0.3)); +create table foo_p (i int) +partition by range(i) +(start (1) end (3) every (1.3)); +\d+ foo_p +drop table foo_p; + +create table foo_p (i int) +partition by range(i) +(start (1) end (20) every (10.9)); +\d+ foo_p +drop table foo_p; + +-- should fail +create table foo_p (i int, j date) +partition by range(j) +(start ('2007-01-01') end ('2008-01-01') every (interval '0.5 days')); + +-- should fail +create table foo_p (i int, j date) +partition by range(j) +(start ('2007-01-01') end ('2008-01-01') every (interval '12 hours')); + +create table foo_p (i int, j date) +partition by range(j) +(start ('2007-01-01') end ('2007-01-05') every (interval '1.2 days')); +\d+ foo_p +drop table foo_p; + +-- should work +create table foo_p (i int, j timestamp) +partition by range(j) +(start ('2007-01-01') end ('2007-01-05') every (interval '1.2 days')); +\d+ foo_p +drop table foo_p; + +-- test inclusive/exclusive +CREATE TABLE supplier2( + S_SUPPKEY INTEGER, + S_NAME CHAR(25), + S_ADDRESS VARCHAR(40), + S_NATIONKEY INTEGER, + S_PHONECHAR char(15), + S_ACCTBAL decimal, + S_COMMENT VARCHAR(100) +) +partition by range (s_nationkey) +( +partition p1 start(0) , +partition p2 start(12) end(13), +partition p3 end(20) inclusive, +partition p4 start(20) exclusive , +partition p5 start(22) end(25) +); + +\d+ supplier2 + +insert into supplier2 (s_suppkey, s_nationkey) select i, i +from generate_series(1, 24) i; +select * from supplier2_1_prt_p1 order by S_NATIONKEY; +select * from supplier2_1_prt_p2 order by S_NATIONKEY; +select * from supplier2_1_prt_p3 order by S_NATIONKEY; +select * from supplier2_1_prt_p4 order by S_NATIONKEY; +select * from supplier2_1_prt_p5 order by S_NATIONKEY; +drop table supplier2; + +-- mpp3238 +create table foo_p (i int) partition by range (i) +( + partition p1 start('1') , + partition p2 start('2639161') , + partition p3 start('5957166') , + partition p4 start('5981976') end('5994376') inclusive, + partition p5 end('6000001') +); +\d+ foo_p + +insert into foo_p values(5994400); +insert into foo_p values(1); +insert into foo_p values(6000002); +insert into foo_p values(5994376); +drop table foo_p; + +create table foo_p (i int) +partition by range(i) +(partition p1 start(1) end(5), + partition p2 start(10), + partition p3 end(10) exclusive); +\d+ foo_p + +drop table foo_p; +create table foo_p (i int) +partition by range(i) +(partition p1 start(1) end(5), + partition p2 start(10) exclusive, + partition p3 end(10) inclusive); +\d+ foo_p + +insert into foo_p values(1), (5), (10); +drop table foo_p; + +-- MPP-3264 +-- mix AO with master HEAP and see if copy works +create table foo_p (i int) +partition by list(i) +(partition p1 values(1, 2, 3) with (appendonly = true), + partition p2 values(4) +); + +copy foo_p from stdin; +1 +2 +3 +4 +\. +select * from foo_p; +select * from foo_p_1_prt_p1; +select * from foo_p_1_prt_p2; +drop table foo_p; +-- other way around +create table foo_p (i int) with(appendonly = true) +partition by list(i) +(partition p1 values(1, 2, 3) with (appendonly = false), + partition p2 values(4) +); + +copy foo_p from stdin; +1 +2 +3 +4 +\. +select * from foo_p; +select * from foo_p_1_prt_p1; +select * from foo_p_1_prt_p2; +drop table foo_p; + +-- Same as above, but the input is ordered so that the inserts to the heap +-- partition happen first. Had a bug related flushing the multi-insert +-- buffers in that scenario at one point. +-- (https://github.com/greenplum-db/gpdb/issues/6678 +create table mixed_ao_part(distkey int, partkey int) +with (appendonly=true) +partition by range(partkey) ( + partition p1 start(0) end(100) with (appendonly = false), + partition p2 start(100) end(199) +); +copy mixed_ao_part from stdin; +1 95 +2 96 +3 97 +4 98 +5 99 +1 100 +2 101 +3 102 +4 103 +5 104 +\. +select * from mixed_ao_part; + +-- Don't drop the table, so that we leave behind a mixed table in the +-- regression database for pg_dump/restore testing. + +-- MPP-3283 +CREATE TABLE PARTSUPP ( +PS_PARTKEY INTEGER, +PS_SUPPKEY INTEGER, +PS_AVAILQTY integer, +PS_SUPPLYCOST decimal, +PS_COMMENT VARCHAR(199) +) +partition by range (ps_suppkey) +subpartition by range (ps_partkey) +subpartition by range (ps_supplycost) subpartition template (start('1') +end('1001') every(500)) +( +partition p1 start('1') end('10001') every(5000) +(subpartition sp1 start('1') end('200001') every(66666) +) +); +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'); +copy partsupp from stdin with delimiter '|'; +1|2|3325|771.64|, even theodolites. regular, final theodolites eat after the +\. +drop table partsupp; +--MPP-3285 +CREATE TABLE PARTLINEITEM ( + L_ORDERKEY INT8, + L_PARTKEY INTEGER, + L_SUPPKEY INTEGER, + L_LINENUMBER integer, + L_QUANTITY decimal, + L_EXTENDEDPRICE decimal, + L_DISCOUNT decimal, + L_TAX decimal, + L_RETURNFLAG CHAR(1), + L_LINESTATUS CHAR(1), + L_SHIPDATE date, + L_COMMITDATE date, + L_RECEIPTDATE date, + L_SHIPINSTRUCT CHAR(25), + L_SHIPMODE CHAR(10), + L_COMMENT VARCHAR(44) + ) +partition by range (l_commitdate) +( +partition p1 start('1992-01-31') end('1998-11-01') every(interval '20 months') + +); +copy partlineitem from stdin with delimiter '|'; +18182|5794|3295|4|9|15298.11|0.04|0.01|N|O|1995-07-04|1995-05-30|1995-08-03|DELIVER IN PERSON|RAIL|y special platelets +\. + +\d+ partlineitem + +drop table partlineitem; + +-- Make sure ADD creates dependencies +create table i (i int) partition by range(i) (start (1) end(3) every(1)); +alter table i add partition foo2 start(40) end (50); +drop table i; + +create table i (i int) partition by range(i) (start (1) end(3) every(1)); +alter table i add partition foo2 start(40) end (50); +alter table i drop partition foo2; + +-- when using the partition name to find target partition table, +-- we shoud check whether the matched table belong to the partitioned table. +-- raise error instead of executing on the irrelevant table. +create table i_1_prt_3 (like i); + +-- create another partitioned table which contains a partition table that +-- could be matched by partition name when targeted on an irrelevant table. +create table i2 (i int) partition by range(i) (start (1) end(3) every(1)); +create table i_1_prt_4 partition of i2 for values from (4) to (5); + +-- the matechd table name is i_1_prt_3, but it's a normal table, raise error. +alter table i drop partition "3"; +-- the matched table name is i_1_prt_4, but it belongs to i2, raise error +alter table i drop partition "4"; + +-- should raise error since we always make sure the partitioned table at least have one partition; +alter table i drop partition "1", drop partition "2"; + +drop table i; +drop table i2; +drop table i_1_prt_3; + +create table i (i int) partition by range(i) (start(1) end(3) every(1), default partition extra); +-- should raise error since we always make sure the partitioned table at least have one partition; +alter table i drop partition "2", drop partition "3", drop default partition; +drop table i; + +create table i (i int, c text) partition by range(i) subpartition by list(c) +subpartition template (subpartition a values ('a'), subpartition b values ('b')) +(start (1) end(3) every(1)); +-- should raise error since we always make sure the partitioned table at least have one partition; +alter table i alter partition "1" drop partition a, alter partition "1" drop partition b; +drop table i; + +CREATE TABLE PARTSUPP ( +PS_PARTKEY INTEGER, +PS_SUPPKEY INTEGER, +PS_AVAILQTY integer, +PS_SUPPLYCOST decimal, +PS_COMMENT VARCHAR(199) +) +partition by range (ps_suppkey) +subpartition by range (ps_partkey) +subpartition by range (ps_supplycost) subpartition template (start('1') +end('1001') every(500)) +( +partition p1 start('1') end('10001') every(5000) +(subpartition sp1 start('1') end('200001') every(66666) +) +); + +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'partsupp%'; +drop table partsupp; + +-- ALTER TABLE ALTER PARTITION tests + +CREATE TABLE ataprank (id int, rank int, +year date, gender char(1), +usstate char(2)) +partition by list (gender) +subpartition by range (year) +subpartition template ( +subpartition jan01 start (date '2001-01-01'), +subpartition jan02 start (date '2002-01-01'), +subpartition jan03 start (date '2003-01-01'), +subpartition jan04 start (date '2004-01-01'), +subpartition jan05 start (date '2005-01-01') +) +subpartition by list (usstate) +subpartition template ( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +) +( + partition boys values ('M'), + partition girls values ('F') +); + +-- and without subpartition templates... +CREATE TABLE ataprank2 (id int, rank int, +year date, gender char(1), +usstate char(2)) +partition by list (gender) +subpartition by range (year) +subpartition by list (usstate) +( + partition boys values ('M') +( +subpartition jan01 start (date '2001-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan02 start (date '2002-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan03 start (date '2003-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan04 start (date '2004-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan05 start (date '2005-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +) +), + + partition girls values ('F') +( +subpartition jan01 start (date '2001-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan02 start (date '2002-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan03 start (date '2003-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan04 start (date '2004-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +), +subpartition jan05 start (date '2005-01-01') +( +subpartition mass values ('MA'), +subpartition cali values ('CA'), +subpartition ohio values ('OH') +) +) +); + +-- ok +alter table ataprank truncate partition girls; +alter table ataprank alter partition girls truncate partition for ('2001-01-01'); +alter table ataprank alter partition girls alter partition +for ('2001-01-01') truncate partition mass; + +-- addressing partitions by RANK is no longer supported +alter table ataprank truncate partition for (rank (1)); + + +-- don't NOTIFY of children if cascade +alter table ataprank truncate partition girls cascade; + +-- fail - no partition for '1999-01-01' +alter table ataprank alter partition girls truncate partition for ('1999-01-01'); + +-- fail - no funky +alter table ataprank alter partition girls alter partition +for ('2001-01-01') truncate partition "funky"; + +-- fail - no funky (drop) +alter table ataprank alter partition girls alter partition +for ('2001-01-01') drop partition "funky"; + +-- fail - missing name +alter table ataprank alter partition girls alter partition +for ('2001-01-01') drop partition; + +-- ok +alter table ataprank alter partition girls drop partition +for ('2001-01-01'); + +-- ok , skipping +alter table ataprank alter partition girls drop partition if exists jan01; + +-- ok +alter table ataprank alter partition girls drop partition for ('2002-01-01'); +alter table ataprank alter partition girls drop partition for ('2003-01-01'); +alter table ataprank alter partition girls drop partition for ('2004-01-01'); + +-- ok, skipping +alter table ataprank alter partition girls drop partition if exists for ('2004-01-01'); + +-- ok +alter table ataprank alter partition girls rename partition jan05 +to "funky fresh"; +alter table ataprank alter partition girls rename partition "funky fresh" +to jan05; + +-- fail , not exist +alter table ataprank alter partition girls alter partition jan05 rename +partition jan01 to foo; + +-- fail not exist +alter table ataprank alter partition girls alter partition jan05 alter +partition cali rename partition foo to bar; + +-- fail not partitioned +alter table ataprank alter partition girls alter partition jan05 alter +partition cali alter partition foo drop partition bar; + +-- ADD PARTITION, with and without templates + +-- fails for ataprank (due to template), works for ataprank2 +alter table ataprank +add partition neuter values ('N') + (subpartition foo + start ('2001-01-01') end ('2002-01-01') + every (interval '1 month') + (subpartition bar values ('AZ'))); +alter table ataprank2 +add partition neuter values ('N') + (subpartition foo + start ('2001-01-01') end ('2002-01-01') + every (interval '1 month') + (subpartition bar values ('AZ'))); + +-- fail , no subpartition spec for ataprank2, works for ataprank +alter table ataprank alter partition boys +add partition jan00 start ('2000-01-01') end ('2001-01-01'); +alter table ataprank2 alter partition boys +add partition jan00 start ('2000-01-01') end ('2001-01-01'); + +-- work - create subpartition for ataprank2, fail for ataprank +alter table ataprank alter partition boys +add partition jan99 start ('1999-01-01') end ('2000-01-01') + (subpartition ariz values ('AZ')); +alter table ataprank2 alter partition boys +add partition jan00 start ('2000-01-01') end ('2001-01-01') + (subpartition ariz values ('AZ')); + +-- works for both -- adding leaf partition doesn't conflict with template +alter table ataprank alter partition boys +alter partition jan00 +add partition haw values ('HI'); +alter table ataprank2 alter partition boys +alter partition jan00 +add partition haw values ('HI'); + +alter table ataprank drop partition neuter; +alter table ataprank2 drop partition neuter; + +-- fail , no subpartition spec for ataprank2, work for ataprank +alter table ataprank +add default partition neuter; +alter table ataprank2 +add default partition neuter; + +alter table ataprank +add default partition neuter + (subpartition foo + start ('2001-01-01') end ('2002-01-01') + every (interval '1 month') + (subpartition ariz values ('AZ'))); +alter table ataprank2 +add default partition neuter + (subpartition foo + start ('2001-01-01') end ('2002-01-01') + every (interval '1 month') + (subpartition ariz values ('AZ'))); + +-- fail +alter table ataprank +alter default partition add default partition def1 +(subpartition haw values ('HI')); +-- fail +alter table ataprank +alter default partition alter default partition +add default partition def2; +-- work +alter table ataprank +alter default partition add default partition def1; +alter table ataprank +alter default partition alter default partition +add default partition def2; + + + +alter table ataprank2 +alter default partition add default partition def1 +(subpartition haw values ('HI')); +alter table ataprank2 +alter default partition alter default partition +add default partition def2; + + +drop table ataprank; +drop table ataprank2; + +-- **END** ALTER TABLE ALTER PARTITION tests + +-- Test casting +create table f (i int) partition by range (i) (start(1::int) end(10::int)); +drop table f; +create table f (i bigint) partition by range (i) (start(1::int8) +end(1152921504606846976::int8) every(576460752303423488)); +drop table f; +create table f (n numeric(20, 2)) partition by range(n) (start(1::bigint) +end(10000::bigint)); +drop table f; +--should fail, there's no assignment cast from text to numeric +create table f (n numeric(20, 2)) partition by range(n) (start(1::bigint) +end(10000::text)); +--should fail. there's no assignment cast from bool to numeric +create table f (n numeric(20, 2)) partition by range(n) (start(1::bigint) +end('f'::bool)); + +-- see that grant and revoke cascade to children +create role part_role; +create table granttest (i int, j int) partition by range(i) +subpartition by list(j) subpartition template (values(1, 2, 3)) +(start(1) end(4) every(1)); + +select relname, has_table_privilege('part_role', oid,'select') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'select') as i_priv, + has_column_privilege('part_role', oid, 'j', 'select') as j_priv +from pg_class where relname like 'granttest%'; + +grant select (i) on granttest to part_role; +select relname, has_table_privilege('part_role', oid,'select') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'select') as i_priv, + has_column_privilege('part_role', oid, 'j', 'select') as j_priv +from pg_class where relname like 'granttest%'; + +grant select on granttest to part_role; +select relname, has_table_privilege('part_role', oid,'select') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'select') as i_priv, + has_column_privilege('part_role', oid, 'j', 'select') as j_priv +from pg_class where relname like 'granttest%'; + +grant insert on granttest to part_role; +select relname, has_table_privilege('part_role', oid, 'insert') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'insert') as i_priv, + has_column_privilege('part_role', oid, 'j', 'insert') as j_priv +from pg_class where relname like 'granttest%'; + +revoke insert on granttest from part_role; +grant insert (j) on granttest to part_role; +select relname, has_table_privilege('part_role', oid, 'insert') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'insert') as i_priv, + has_column_privilege('part_role', oid, 'j', 'insert') as j_priv +from pg_class where relname like 'granttest%'; + +-- Check that when a new partition is created, it inherits the permissions +-- from the parent. +alter table granttest add partition newpart start(100) end (101); + +-- same with the new upstream syntax. +create table granttest_newpartsyntax partition of granttest for values from (110) to (120); + +select relname, has_table_privilege('part_role', oid, 'select') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'select') as i_priv, + has_column_privilege('part_role', oid, 'j', 'select') as j_priv +from pg_class where relname like 'granttest%'; +select relname, has_table_privilege('part_role', oid, 'insert') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'insert') as i_priv, + has_column_privilege('part_role', oid, 'j', 'insert') as j_priv +from pg_class where relname like 'granttest%'; + +revoke all on granttest from part_role; +select relname, has_table_privilege('part_role', oid, 'insert') as tabpriv, + has_column_privilege('part_role', oid, 'i', 'insert') as i_priv, + has_column_privilege('part_role', oid, 'j', 'insert') as j_priv +from pg_class where relname like 'granttest%'; + +drop table granttest; +drop role part_role; + +-- deep inline + optional subpartition comma: +CREATE TABLE partsupp_1 ( + ps_partkey integer, + ps_suppkey integer, + ps_availqty integer, + ps_supplycost numeric, + ps_comment character varying(199) +) PARTITION BY RANGE(ps_suppkey) + SUBPARTITION BY RANGE(ps_partkey) + SUBPARTITION BY RANGE(ps_supplycost) + ( + PARTITION p1_1 START (1) END (1666667) EVERY (1666666) + ( + START (1) END (19304783) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ), + START (19304783) END (100000001) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ) + ), + PARTITION p1_2 START (1666667) END (3333333) EVERY (1666666) + ( + START (1) END (19304783) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ), + START (19304783) END (100000001) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ) + ), + PARTITION p1_3 START (3333333) END (4999999) EVERY (1666666) + ( + START (1) END (19304783) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ), + START (19304783) END (100000001) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ) + ), + PARTITION p1_4 START (4999999) END (5000001) EVERY (1666666) + ( + START (1) END (19304783) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ), + START (19304783) END (100000001) + ( + START (1::numeric) END (501::numeric) EVERY (500), + START (501::numeric) END (1001::numeric) EVERY (500) + ) + ) + ); + +-- Accept negative values trivially: +create table partition_g (i int) partition by range(i) (start((-1)) end(10)); +drop table partition_g; +create table partition_g (i int) partition by range(i) (start(-1) end(10)); +drop table partition_g; + +CREATE TABLE orders ( + o_orderkey bigint, + o_custkey integer, + o_orderstatus character(1), + o_totalprice numeric, + o_orderdate date, + o_orderpriority character(15), + o_clerk character(15), + o_shippriority integer, + o_comment character varying(79) +) +WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) PARTITION BY RANGE(o_orderdate) + SUBPARTITION BY RANGE(o_custkey) + SUBPARTITION BY RANGE(o_orderkey) + ( + PARTITION p1_1 START ('1992-01-01'::date) END ('1993-06-01'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ), + PARTITION p1_2 START ('1993-06-01'::date) END ('1994-11-01'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ), + PARTITION p1_3 START ('1994-11-01'::date) END ('1996-04-01'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ), + PARTITION p1_4 START ('1996-04-01'::date) END ('1997-09-01'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ), + PARTITION p1_5 START ('1997-09-01'::date) END ('1998-08-03'::date) EVERY ('1 year 5 mons'::interval) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + SUBPARTITION sp1 START (1) END (46570) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ), + SUBPARTITION sp2 START (46570) END (150001) INCLUSIVE WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ( + START (1::bigint) END (1500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (1500001::bigint) END (3000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (3000001::bigint) END (4500001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9), + START (4500001::bigint) END (6000001::bigint) EVERY (1500000) WITH (appendonly=true, checksum=true, blocksize=368640, compresslevel=9) + ) + ) + ); + +-- grammar bug: MPP-3361 +create table i2 (i int) partition by range(i) (start(-2::int) end(20)); +drop table i2; +create table i2 (i int) partition by range(i) (start((-2)::int) end(20)); +drop table i2; +create table i2 (i int) partition by range(i) (start(cast ((-2)::bigint as int)) +end(20)); +drop table i2; +CREATE TABLE partsupp ( + ps_partkey integer, + ps_suppkey integer, + ps_availqty integer, + ps_supplycost numeric, + ps_comment character varying(199) +) PARTITION BY RANGE(ps_supplycost) + ( + PARTITION newpart START ((-10000)::numeric) EXCLUSIVE END (1::numeric) +, + PARTITION p1 START (1::numeric) END (1001::numeric) + ); +drop table partsupp; + +-- Deletion tests +CREATE TABLE tmp_nation_region (n_regionkey integer); +drop table if exists tmp_nation; +CREATE TABLE tmp_nation (N_NATIONKEY INTEGER, N_NAME CHAR(25), N_REGIONKEY INTEGER, N_COMMENT VARCHAR(152)) +partition by range (n_nationkey) + ( +partition p1 start('0') WITH (appendonly=true,checksum=true,blocksize=1998848,compresslevel=4), +partition p2 start('11') end('15') inclusive WITH (checksum=false,appendonly=true,blocksize=655360,compresslevel=4), +partition p3 start('15') exclusive end('19'), partition p4 start('19') WITH (compresslevel=8,appendonly=true,checksum=false,blocksize=884736), +partition p5 start('20') +); +delete from tmp_nation where n_regionkey in (select n_regionkey from tmp_nation_region) and n_nationkey between 1 and 5; +drop table tmp_nation; + +-- SPLIT tests +-- basic sanity tests. All should pass. +create table k (i int) partition by range(i) (start(1) end(10) every(2), +default partition mydef); +insert into k select i from generate_series(1, 100) i; +alter table k split partition mydef at (20) into (partition mydef, +partition foo); +drop table k; + +create table j (i int) partition by list(i) (partition a values(1, 2, 3, 4), +partition b values(5, 6, 7, 8)); +insert into j select i from generate_series(1, 8) i; +alter table j split partition for(1) at (2, 3) into (partition fa, partition +fb); +select * from j_1_prt_fa; +select * from j_1_prt_fb; +alter table j split partition for(5) at (6); +select * from j; +-- should fail +alter table j split partition for (1) at (100); +drop table j; +create table k (i int) partition by range(i) (start(1) end(10) every(2), +default partition mydef); +-- should fail +alter table k split default partition start(30) end (300) into (partition mydef, partition mydef); +alter table k split partition for(3) at (20); +drop table k; +-- should work +create table k (i int) partition by range(i) (start(1) end(10) every(2), +default partition mydef); +insert into k select i from generate_series(1, 30) i; +alter table k split default partition start(15) end(20) into +(partition mydef, partition foo); +select * from k_1_prt_foo; +alter table k split default partition start(22) exclusive end(25) inclusive +into (partition bar, partition mydef); +select * from k_1_prt_bar; + +-- This fails, because it would create a partition with an empty range. Before +-- GPDB 7, this passed, because a partition like "start (22) exclusive end (23) +-- exclusive" was considered valid. +alter table k split partition bar at (23) into (partition baz, partition foz); +\d+ k +drop table k; +-- Add CO partition and split, reported in MPP-17761 +create table k (i int) with (appendonly = true, orientation = column) partition by range(i) (start(1) end(10) every(5)); +alter table k add partition co start(11) end (17) with (appendonly = true, orientation = column); +alter table k split partition co at (14) into (partition co1, partition co2); +drop table k; +create table k (a int, b int) with (appendonly = true) partition by list(b) +( + partition a values (1, 2, 3, 4) with (appendonly = true, orientation = column), + partition b values (5, 6, 7 ,8) with (appendonly = true, orientation = column) +); +alter table k split partition for(2) at(2) into (partition one, partition two); +drop table k; +-- Test errors for default handling +create table k (i int) partition by range(i) (start(1) end(2), +default partition mydef); +alter table k split partition mydef at (25) into (partition foo, partition +mydef); +drop table k; +create table k (i int) partition by list(i) (values(1), values(2), +default partition mydef); +alter table k split default partition start(10) end(20); +drop table k; + +-- Check that we support int2 +CREATE TABLE myINT2_TBL(q1 int2) + partition by range (q1) + (start (1) end (3) every (1)); +insert into myint2_tbl values(1), (2); +drop table myint2_tbl; + +-- try SREH on a partitioned table. +create table ao_p (i int) with (appendonly = true) + partition by range(i) + (start(1) end(5) every(1)); + +copy ao_p from stdin log errors segment reject limit 100; +2 +3 +10000 +f +\. +select * from ao_p; +drop table ao_p; + +-- MPP-3591: make sure we get inclusive/exclusive right with every(). +create table k (i int) partition by range(i) +(start(0) exclusive end(100) inclusive every(25)); +\d+ k +insert into k select i from generate_series(1, 100) i; +drop table k; + +-- ADD and SPLIT must get inherit permissions of the partition they're +-- modifying +create role part_role; +create table a (a int, b int, c int) partition by range(a) subpartition by +range(b) subpartition template (subpartition h start(1) end(10)) +subpartition by range(c) +subpartition template(subpartition i start(1) end(10)) +(partition g start(1) end(2)); +revoke all on a from public; +grant insert on a to part_role; +-- revoke it from one existing partition, to make sure we don't screw up +-- existing permissions +revoke all on a_1_prt_g_2_prt_h_3_prt_i from part_role; +alter table a add partition b start(40) end(50); +set session authorization part_role; +select has_table_privilege('part_role', 'a'::regclass,'insert'); +select has_table_privilege('part_role', 'a_1_prt_b_2_prt_h'::regclass,'insert'); +select has_table_privilege('part_role', 'a_1_prt_b_2_prt_h_3_prt_i'::regclass,'insert'); +select has_table_privilege('part_role', 'a_1_prt_g_2_prt_h_3_prt_i'::regclass, +'insert'); +insert into a values(45, 5, 5); +-- didn't grant select +select has_table_privilege('part_role', 'a'::regclass,'select'); +select has_table_privilege('part_role', 'a_1_prt_b_2_prt_h'::regclass,'select'); +select has_table_privilege('part_role', 'a_1_prt_b_2_prt_h_3_prt_i'::regclass,'select'); +\c - +drop table a; +create table a (i date) partition by range(i) +(partition f start(date '2005-01-01') end (date '2009-01-01') + every(interval '2 years')); +revoke all on a from public; +grant insert on a to part_role; +alter table a split partition for ('2005-01-01') at (date '2006-01-01') + into (partition f, partition g); +alter table a add default partition mydef; +alter table a split default partition start(date '2010-01-01') end(date +'2011-01-01') into(partition mydef, partition other); +set session authorization part_role; +select has_table_privilege('part_role', 'a'::regclass,'insert'); +select has_table_privilege('part_role', 'a_1_prt_f'::regclass,'insert'); +select has_table_privilege('part_role', 'a_1_prt_mydef'::regclass,'insert'); +select has_table_privilege('part_role', 'a_1_prt_other'::regclass,'insert'); +insert into a values('2005-05-05'); +insert into a values('2006-05-05'); +insert into a values('2010-10-10'); +\c - +drop table a; +drop role part_role; +-- Check that when we split a default, the INTO clause must named the default +create table k (i date) partition by range(i) (start('2008-01-01') +end('2009-01-01') every(interval '1 month'), default partition default_part); +alter table k split default partition start ('2009-01-01') end ('2009-02-01') +into (partition aa, partition nodate); +alter table k split default partition start ('2009-01-01') end ('2009-02-01') +into (partition aa, partition default_part); +-- check that it works without INTO +alter table k split default partition start ('2009-02-01') end ('2009-03-01'); +drop table k; +-- List too +create table k (i int) partition by list(i) (partition a values(1, 2), +partition b values(3, 4), default partition mydef); +alter table k split partition mydef at (5) into (partition foo, partition bar); +alter table k split partition mydef at (5) into (partition foo, partition mydef); +alter table k split partition mydef at (10); +drop table k; + +-- For LIST, make sure that we reject AT() clauses which match all parameters +create table j (i int) partition by list(i) (partition a values(1, 2, 3, 4), + partition b values(5, 6, 7, 8)); +alter table j split partition for(1) at (1,2) into (partition fa, partition fb); +alter table j split partition for(1) at (1,2) +into (partition f1a, partition f1b); -- This has partition rules that overlaps +drop table j; + +-- Check that we can split LIST partitions that have a default partition +create table j (i int) partition by list(i) (partition a values(1, 2, 3, 4), +partition b values(5, 6, 7, 8), default partition default_part); +alter table j split partition for(1) at (1,2) into (partition f1a, partition +f1b); +drop table j; +-- Make sure range can too +create table j (i int) partition by range(i) (partition a start(1) end(10), +default partition default_part); +alter table j split partition for(1) at (5) into (partition f1a, partition f1b); +drop table j; + +-- MPP-3667 ADD PARTITION overlaps +create table mpp3621 (aa date, bb date) partition by range (bb) +(partition foo start('2008-01-01')); + +-- these are ok +alter table mpp3621 add partition a1 start ('2007-01-01') end ('2007-02-01'); +alter table mpp3621 add partition a2 start ('2007-02-01') end ('2007-03-01'); +alter table mpp3621 add partition a3 start ('2007-03-01') end ('2007-04-01'); +alter table mpp3621 add partition a4 start ('2007-09-01') end ('2007-10-01'); +alter table mpp3621 add partition a5 start ('2007-08-01') end ('2007-09-01'); +alter table mpp3621 add partition a6 start ('2007-04-01') end ('2007-05-01'); +alter table mpp3621 add partition a7 start ('2007-05-01') end ('2007-06-01'); + + -- was error due to startSearchpoint != endSearchpoint +alter table mpp3621 add partition a8 start ('2007-07-01') end ('2007-08-01'); + +-- ok +alter table mpp3621 add partition a9 start ('2007-06-01') end ('2007-07-01'); + +drop table mpp3621; + +-- Check for MPP-3679 and MPP-3692 +create table list_test (a text, b text) partition by list (a) ( + partition foo values ('foo'), + partition bar values ('bar'), + default partition baz); +insert into list_test values ('foo', 'blah'); +insert into list_test values ('bar', 'blah'); +insert into list_test values ('baz', 'blah'); +alter table list_test split default partition at ('baz') + into (partition bing, default partition); +drop table list_test; + +-- MPP-3816: cannot drop column which is the subject of partition config +create table list_test(a int, b int, c int) + partition by list(b) + subpartition by list(c) subpartition template(subpartition c values(2)) + (partition b values(1)); +-- should fail +alter table list_test drop column b; +alter table list_test drop column c; +drop table list_test; + +-- MPP-3678: allow exchange and split on tables with subpartitioning +CREATE TABLE rank_exc ( +id int, +rank int, +year int, +gender char(1), +count int ) + +PARTITION BY LIST (gender) +SUBPARTITION BY RANGE (year) +SUBPARTITION TEMPLATE ( +SUBPARTITION year1 START (2001), +SUBPARTITION year2 START (2002), +SUBPARTITION year3 START (2003), +SUBPARTITION year4 START (2004), +SUBPARTITION year5 START (2005), +SUBPARTITION year6 START (2006) END (2007) ) +(PARTITION girls VALUES ('F'), +PARTITION boys VALUES ('M') +); +alter table rank_exc alter partition girls add default partition gfuture; +alter table rank_exc alter partition boys add default partition bfuture; +insert into rank_exc values(1, 1, 2007, 'M', 1); +insert into rank_exc values(2, 2, 2008, 'M', 3); +select * from rank_exc; +alter table rank_exc alter partition boys split default partition start ('2007') +end ('2008') into (partition bfuture, partition year7); +select * from rank_exc_1_prt_boys_2_prt_bfuture; +select * from rank_exc_1_prt_boys_2_prt_year7; +select * from rank_exc; + +--exchange test +create table r (like rank_exc); +insert into rank_exc values(3, 3, 2004, 'F', 100); +insert into r values(3, 3, 2004, 'F', 100000); +alter table rank_exc alter partition girls exchange partition year4 with table r; +select * from rank_exc_1_prt_girls_2_prt_year4; +select * from r; +alter table rank_exc alter partition girls exchange partition year4 with table r; +select * from rank_exc_1_prt_girls_2_prt_year4; +select * from r; + +-- Split test +alter table rank_exc alter partition girls split default partition start('2008') + end('2020') into (partition years, partition gfuture); +insert into rank_exc values(4, 4, 2009, 'F', 100); +drop table rank_exc; +drop table r; + +-- MPP-4245: remove virtual subpartition templates when we drop the partitioned +-- table +create table bar_p (i int, j int) partition by range(i) subpartition by range(j) +subpartition template(start(1) end(10) every(1)) subpartition by range(i) +subpartition template(start(1) end(10) every(5)) (start(1) end(10)); +alter table bar_p alter partition for ('5') alter partition for ('5') + drop partition for ('5'); +insert into bar_p values(1, 1); +insert into bar_p values(5, 5); +drop table bar_p; +-- Drop should not leave anything lingering for bar_p or its +-- subpartitions in pg_partition* catalog tables. +select relid, level, template from gp_partition_template where not exists (select oid from pg_class where oid = relid); + +-- MPP-4172 +-- should fail +create table ggg (a char(1), b int) +partition by range(a) +( +partition aa start ('2006') end ('2009'), partition bb start ('2007') end ('2008') +); + + +-- MPP-4892 SET SUBPARTITION TEMPLATE +create table mpp4892 (a char, b int, d char) +partition by range (b) +subpartition by list (d) +subpartition template ( + subpartition sp1 values ('a'), + subpartition sp2 values ('b')) +( +start (1) end (10) every (1) +); + +-- works +alter table mpp4892 add partition p1 end (11); + +-- complain about existing template +alter table mpp4892 add partition p3 end (13) (subpartition sp3 values ('c')); + +-- remove template +alter table mpp4892 set subpartition template (); + +-- should work (because the template is gone) +alter table mpp4892 add partition p3 end (13) (subpartition sp3 values ('c')); + +-- complain because the template is already gone +alter table mpp4892 set subpartition template (); + +-- should work +alter table mpp4892 set subpartition template (subpartition sp3 values ('c')); + +-- should work +alter table mpp4892 add partition p4 end (15); + +drop table mpp4892; + + +-- make sure we do not allow overlapping range intervals +-- should fail +-- unordered elems +create table ttt (t int) partition by range(t) ( +partition a start (1) end(10) inclusive, +partition c start(11) end(14), +partition b start(5) end(15) +); + +-- should fail, this time it's ordered +create table ttt (t int) partition by range(t) ( +partition a start (1) end(10) inclusive, +partition b start(5) end(15), +partition c start(11) end(14) +); + +-- should fail +create table ttt (t date) partition by range(t) ( +partition a start ('2005-01-01') end('2006-01-01') inclusive, +partition b start('2005-05-01') end('2005-06-11'), +partition c start('2006-01-01') exclusive end('2006-01-10') +); + +-- should fail +create table ttt (t char) partition by range(t) ( +partition a start('a') end('f'), +partition b start('e') end('g') +); + +-- MPP-5159 MPP-26829 +-- Should fail -- missing partition spec and subpartition template follows the +-- partition declaration. +CREATE TABLE list_sales (trans_id int, date date, amount +decimal(9,2), region text) + +PARTITION BY LIST (region) +SUBPARTITION TEMPLATE +( SUBPARTITION usa VALUES ('usa'), + SUBPARTITION asia VALUES ('asia'), + SUBPARTITION europe VALUES ('europe') +); + +-- MPP-5185 MPP-26829 +-- Should work +CREATE TABLE rank_settemp (id int, rank int, year date, gender +char(1)) +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01'), +start (date '2002-01-01'), +start (date '2003-01-01'), +start (date '2004-01-01'), +start (date '2005-01-01') +) +( +partition boys values ('M'), +partition girls values ('F') +); + +alter table rank_settemp set subpartition template (); + +-- nothing there +select relid::regclass, level from gp_partition_template where relid = 'rank_settemp'::regclass; + +alter table rank_settemp set subpartition template (default subpartition def2); + +-- def2 is there +select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; + +alter table rank_settemp set subpartition template (default subpartition def2); +-- Should still be there +select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; + + +alter table rank_settemp set subpartition template (start (date '2006-01-01') with (appendonly=true)); +alter table rank_settemp add partition f1 values ('N'); +alter table rank_settemp set subpartition template (start (date '2007-01-01') with (appendonly=true, compresslevel=5)); +alter table rank_settemp add partition f2 values ('C'); + +select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; + +drop table rank_settemp; + +-- MPP-5397 and MPP-7002 +-- should be able to add/split/exchange partition after dropped a col + +create table mpp_5397 (a int, b int, c int, d int) + + partition by range (b) + (partition a1 start (0) end (5), + partition a2 end (10), + partition a3 end(15)); + +alter table mpp_5397 drop column c; + +-- should work now +alter table mpp_5397 add partition z end (20); + +-- ensure splitting default partition also works +alter table mpp_5397 add default partition adefault; +alter table mpp_5397 drop column d; +alter table mpp_5397 split default partition start (21) inclusive end (25) inclusive; + +drop table mpp_5397; + +-- MPP-4987 -- make sure we can't damage a partitioning configuration +-- this works +create table rank_damage (i int, j int) +partition by range(j) (start(1) end(5) every(1)); +-- should all fail +alter table rank_damage_1_prt_1 no inherit rank_damage; +create table rank2_damage(like rank_damage); +alter table rank_damage_1_prt_1 inherit rank2_damage; +alter table rank_damage_1_prt_1 alter column i type bigint; +alter table rank_damage_1_prt_1 set without oids; -- no-op +alter table rank_damage add partition ppo end (22) with (oids = true); +drop table rank_damage, rank2_damage; + +-- MPP-5831, type cast in SPLIT +CREATE TABLE sg_cal_event_silvertail_hour ( +caldt date NOT NULL, +calhr smallint NOT NULL, +ip character varying(128), +transactionid character varying(32), +transactiontime timestamp(2) without time zone +) +WITH (appendonly=true, compresslevel=5) + PARTITION BY RANGE(transactiontime) +( + +PARTITION "P2009041607" +START ('2009-04-16 07:00:00'::timestamp without time zone) +END ('2009-04-16 08:00:00'::timestamp without time zone), +PARTITION "P2009041608" +START ('2009-04-16 08:00:00'::timestamp without time zone) +END ('2009-04-16 09:00:00'::timestamp without time zone), +DEFAULT PARTITION st_default + +); + +ALTER TABLE SG_CAL_EVENT_SILVERTAIL_HOUR SPLIT DEFAULT PARTITION +START ('2009-04-29 07:00:00'::timestamp) INCLUSIVE END ('2009-04-29 +08:00:00'::timestamp) EXCLUSIVE INTO ( PARTITION P2009042907 , +PARTITION st_default ); + +\d+ sg_cal_event_silvertail_hour +\d+ sg_cal_event_silvertail_hour_1_prt_P2009042907 + +drop table sg_cal_event_silvertail_hour; + +-- Make sure we inherit master's storage settings +create table foo_p (i int, j int, k text) +with (appendonly = true, compresslevel = 5) +partition by range(j) (start(1) end(10) every(1), default partition def); +insert into foo_p select i, i+1, repeat('fooo', 9000) from generate_series(1, 100) i; +alter table foo_p split default partition start (10) end(20) +into (partition p10_20, default partition); +select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = relam where c.oid = 'foo_p_1_prt_p10_20'::regclass; +select count(distinct k) from foo_p; +drop table foo_p; + +create table foo_p (i int, j int, k text) +partition by range(j) (start(1) end(10) every(1), default partition def +with(appendonly = true)); +insert into foo_p select i, i+1, repeat('fooo', 9000) from generate_series(1, 100) i; +alter table foo_p split default partition start (10) end(20) +into (partition p10_20, default partition); +select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = relam where c.oid in ('foo_p_1_prt_p10_20'::regclass, 'foo_p_1_prt_def'::regclass); +select count(distinct k) from foo_p; +drop table foo_p; + +-- MPP-5941: work with many levels of templates + +CREATE TABLE mpp5941 (a int, b date, c char, + d char(4), e varchar(20), f timestamp) +partition by range (b) +subpartition by list (a) +subpartition template ( +subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ) +subpartition by list (e) +subpartition template ( +subpartition ll1 values ('Engineering'), +subpartition ll2 values ('QA') ) +subpartition by list (c) +subpartition template ( +subpartition lll1 values ('M'), +subpartition lll2 values ('F') ) +( + start (date '2007-01-01') + end (date '2010-01-01') every (interval '1 year') +); + +-- just truncate for fun to see that everything is there +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) alter partition for ('QA') +truncate partition for ('M'); + +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) truncate partition for ('QA'); + +alter table mpp5941 alter partition for ('2008-01-01') +truncate partition for (1); + +alter table mpp5941 truncate partition for ('2008-01-01'); + +truncate table mpp5941; + +-- now look at the templates that we have + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + +-- clear level 1 + +alter table mpp5941 set subpartition template (); + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + +-- clear level 2 + +alter table mpp5941 alter partition for ('2008-01-01') +set subpartition template (); + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + +-- clear level 3 + +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) +set subpartition template (); + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + +-- no level 4 (error) + +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) alter partition for ('QA') +set subpartition template (); + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + +-- no level 5 (error) + +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) alter partition for ('QA') +alter partition for ('M') +set subpartition template (); + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + +-- set level 1 (error, because no templates for level 2, 3) + +alter table mpp5941 set subpartition template ( +subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ); + +-- MPP-5992 - add deep templates correctly + +-- Note: need to re-add the templates from deepest to shallowest, +-- because adding a template has a dependency on the existence of the +-- deeper template. + +-- set level 3 + +alter table mpp5941 alter partition for ('2008-01-01') +alter partition for (1) +set subpartition template ( +subpartition lll1 values ('M'), +subpartition lll2 values ('F') ); + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + +-- set level 2 + +alter table mpp5941 alter partition for ('2008-01-01') +set subpartition template ( +subpartition ll1 values ('Engineering'), +subpartition ll2 values ('QA') ); + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + +-- set level 1 + +alter table mpp5941 set subpartition template ( +subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ); + +select relid::regclass, level from gp_partition_template where relid = 'mpp5941'::regclass; + + +drop table mpp5941; + +-- MPP-5984 - NULL is not allowed in RANGE partition +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition nnull start (NULL) end (300) +); +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition nnull start (300) end (NULL) +); +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition nnull start (300) end (NULL::int) +); +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition p1 start(1) end(10), +partition p2 start(10) end(20), +default partition def +); +alter table partsupp split partition p2 at (NULL); +alter table partsupp split default partition start(null) end(200); +drop table partsupp; +CREATE TABLE partsupp ( ps_partkey integer, +ps_suppkey integer, ps_availqty integer, +ps_supplycost numeric, ps_comment character varying(199) ) +PARTITION BY RANGE(ps_partkey) +( +partition nnull start (300) end (400) +); +alter table partsupp add partition foo start(500) end(NULL); +drop table partsupp; + +-- Test for an old bug, where we used to crash on NULLs, because the code +-- to order the partitions by their start/end boundaries did not anticipate +-- NULLs. NULLs in boundaries are not accepted, but because we check for +-- them only after ordering the partitions, the sorting code needs to +-- handle them. (This test needs at least two partitions, so that there +-- is something to sort.) +create table partnulltest ( + col1 int, + col2 numeric +) +partition by range(col2) +( + partition part2 start(1) end(10) , + partition part1 start (NULL) +); + +-- Test pg_dump on a somewhat complicated partitioned table. (MPP-6240) +-- We actually just create the table here, and leave it behind, so that +-- it gets dumped by pg_dump at end of the regression test suite. +CREATE TABLE supplier_hybrid_part( + S_SUPPKEY INTEGER, + S_NAME CHAR(25), + S_ADDRESS VARCHAR(40), + S_NATIONKEY INTEGER, S_PHONE CHAR(15), + S_ACCTBAL decimal, + S_COMMENT VARCHAR(101) + ) +partition by range (s_suppkey) +subpartition by list (s_nationkey) subpartition template ( + values('22','21','17'), + values('6','11','1','7','16','2') WITH (checksum=false,appendonly=true,blocksize=1171456, compresslevel=3), + values('18','20'), + values('9','23','13') WITH (checksum=true,appendonly=true,blocksize=1335296,compresslevel=7), + values('0','3','12','15','14','8','4','24','19','10','5') +) +( +partition p1 start('1') end('10001') every(10000) +); + +-- MPP-3544 +-- Domain +create domain domainvarchar varchar(5); +create domain domainnumeric numeric(8,2); +create domain domainint4 int4; +create domain domaintext text; + +-- Test tables using domains +-- list +create table basictest1 + ( testint4 domainint4 + , testtext domaintext + , testvarchar domainvarchar + , testnumeric domainnumeric + ) +partition by LIST(testvarchar) +( +partition aa values ('aaaaa'), +partition bb values ('bbbbb'), +partition cc values ('ccccc') +); + +alter table basictest1 add partition dd values('ddddd'); +insert into basictest1 values(1, 1, 'ddddd', 1); +insert into basictest1 values(1, 1, 'ccccc', 1); +insert into basictest1 values(1, 1, 'bbbbb', 1); +insert into basictest1 values(1, 1, 'aaaaa', 1); +drop table basictest1; +--range +create table basictest1 (testnumeric domainint4) +partition by range(testnumeric) + (start(1) end(10) every(5)); +insert into basictest1 values(1); +insert into basictest1 values(2); +alter table basictest1 add partition ff start(10) end(20); +insert into basictest1 values(10); +drop table basictest1; +drop domain domainvarchar, domainnumeric, domainint4, domaintext; + +-- Test index inheritance with partitions +create table ti (i int not null, j int) +partition by range (j) +(start(1) end(3) every(1)); +create unique index ti_pkey on ti(i,j); + +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; +create index ti_j_idx on ti using bitmap(j); +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; +alter table ti add partition p3 start(3) end(10); +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; +-- Should not be able to drop child indexes added implicitly via ADD PARTITION +drop index ti_1_prt_p3_i_j_idx; +drop index ti_1_prt_p3_j_idx; +alter table ti split partition p3 at (7) into (partition pnew1, partition pnew2); +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; +-- Should not be able to drop child indexes added implicitly via SPLIT PARTITION +drop index ti_1_prt_pnew1_i_j_idx; +drop index ti_1_prt_pnew1_j_idx; +drop index ti_1_prt_pnew2_i_j_idx; +drop index ti_1_prt_pnew2_j_idx; +-- Index drop should cascade to all partitions- including those later added via +-- ADD PARTITION or SPLIT PARTITION +drop index ti_pkey; +drop index ti_j_idx; +select * from pg_indexes where schemaname = 'public' and tablename like 'ti%'; +drop table ti; + +-- Partitioned table with btree index and hash aggregate should use a correct +-- memory context for its tuples` descriptor +drop table if exists dis_tupdesc; +create table dis_tupdesc (a int, b int, c int) +partition by list (b) +( + partition p1 values (1), + partition p2 values (2), + default partition junk_data +); +create index dis_tupdesc_idx on dis_tupdesc using btree (c); +insert into dis_tupdesc select i, i % 3, i % 4 from generate_series (1, 240) as i; +analyze dis_tupdesc; +set gp_segments_for_planner = 2; +set optimizer_segments = 2; +select distinct b from dis_tupdesc where c >= 2; +reset gp_segments_for_planner; +reset optimizer_segments; + +-- MPP-6611, make sure rename works with default partitions +create table it (i int, j int) partition by range(i) +subpartition by range(j) subpartition template(start(1) end(10) every(5)) +(start(1) end(3) every(1)); +alter table it rename to newit; +select schemaname, tablename from pg_tables where schemaname = 'public' and tablename like 'newit%'; +alter table newit add default partition def; +select schemaname, tablename from pg_tables where schemaname = 'public' and tablename like 'newit%'; +alter table newit rename to anotherit; +select schemaname, tablename from pg_tables where schemaname = 'public' and tablename like +'anotherit%'; +drop table anotherit; + +-- +-- Test table constraint inheritance +-- +-- with a named UNIQUE constraint +create table it (i int) partition by range(i) (start(1) end(3) every(1)); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +alter table it add constraint it_unique_i unique (i); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +alter table it drop constraint it_unique_i; +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +drop table it; + +-- with a PRIMARY KEY constraint, without giving it a name explicitly. +create table it (i int) partition by range(i) (start(1) end(3) every(1)); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +alter table it add primary key(i); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +-- FIXME: dropping a primary key doesn't currently work correctly. It doesn't +-- drop the key on the partitions, only the parent. See +-- https://github.com/greenplum-db/gpdb/issues/3750 +-- +-- alter table it add primary key(i); +-- select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +drop table it; + + +create table it (i int) partition by range(i) (start(1) end(3) every(1)); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +alter table it add primary key(i); +select schemaname, tablename, indexname from pg_indexes where schemaname = 'public' and tablename like 'it%'; +drop table it; + +-- +-- Exclusion constraints are currently not supported on partitioned tables. +-- +create table parttab_with_excl_constraint ( + i int, + j int, + CONSTRAINT part_excl EXCLUDE (i WITH =) ) + partition by list (i) ( + partition a values (1), + partition b values (2), + partition c values (3) +); + +create table parttab_with_excl_constraint ( + i int, + j int) + partition by list (i) ( + partition a values (1), + partition b values (2), + partition c values (3) +); +alter table parttab_with_excl_constraint ADD CONSTRAINT part_excl EXCLUDE (i WITH =); + +drop table parttab_with_excl_constraint; + + +-- MPP-6297: test special WITH(tablename=...) syntax for dump/restore + +-- original table was: +-- PARTITION BY RANGE(l_commitdate) +-- ( +-- PARTITION p1 +-- START ('1992-01-31'::date) END ('1995-04-30'::date) +-- EVERY ('1 year 1 mon'::interval) +-- ) + +-- dump used to give a definition like this: + +-- without the WITH(tablename=...), the vagaries of EVERY arithmetic +-- create >3 partitions +CREATE TABLE mpp6297 ( l_orderkey bigint, +l_commitdate date +) + PARTITION BY RANGE(l_commitdate) +( +PARTITION p1_1 START ('1992-01-31'::date) END ('1993-02-28'::date) +EVERY ('1 year 1 mon'::interval) +, +PARTITION p1_2 START ('1993-02-28'::date) END ('1994-03-31'::date) +EVERY ('1 year 1 mon'::interval) +, +PARTITION p1_3 START ('1994-03-31'::date) END ('1995-04-30'::date) +EVERY ('1 year 1 mon'::interval) +); + +\d+ mpp6297 +drop table mpp6297; + + +-- when WITH(tablename=...) is specified, the EVERY is stored as an +-- attribute, but not expanded into additional partitions +CREATE TABLE mpp6297 ( l_orderkey bigint, +l_commitdate date +) + PARTITION BY RANGE(l_commitdate) +( +PARTITION p1_1 START ('1992-01-31'::date) END ('1993-02-28'::date) +EVERY ('1 year 1 mon'::interval) +WITH (tablename='mpp6297_1_prt_p1_1'), +PARTITION p1_2 START ('1993-02-28'::date) END ('1994-03-31'::date) +EVERY ('1 year 1 mon'::interval) +WITH (tablename='mpp6297_1_prt_p1_2'), +PARTITION p1_3 START ('1994-03-31'::date) END ('1995-04-30'::date) +EVERY ('1 year 1 mon'::interval) +WITH (tablename='mpp6297_1_prt_p1_3') +); + +\d+ mpp6297 +drop table mpp6297; + +-- more with basic cases +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) end (10) every (1), +end (11) +); + +\d+ mpp6297 + +alter table mpp6297 drop partition for (3); +\d+ mpp6297 + +-- this isn't legal (but it would be nice) +alter table mpp6297 add partition start (3) end (4) every (1); + +-- this is legal but it doesn't fix the EVERY clause +alter table mpp6297 add partition start (3) end (4); + +\d+ mpp6297 +drop table mpp6297; + +-- similarly, we can merge adjacent EVERY clauses if they match + +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) end (5) every (1), +start (5) end (10) every (1) +); + +\d+ mpp6297 +drop table mpp6297; + +-- we cannot merge adjacent EVERY clauses if inclusivity/exclusivity is wrong +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) end (5) every (1), +start (5) exclusive end (10) every (1) +); + +\d+ mpp6297 +drop table mpp6297; + +-- more fun with inclusivity/exclusivity (normal case) +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) inclusive end (10) exclusive every (1) +); + +\d+ mpp6297 +drop table mpp6297; + +-- more fun with inclusivity/exclusivity (abnormal case) +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) exclusive end (10) inclusive every (1) +); + +\d+ mpp6297 + +alter table mpp6297 drop partition for (3); + +\d+ mpp6297 +drop table mpp6297; + +-- we cannot merge adjacent EVERY clauses, even though the +-- inclusivity/exclusivity matches, because it is different from the +-- normal start inclusive/end exclusive +create table mpp6297 +(a int, +b int) +partition by range (b) +( +start (1) end (5) inclusive every (1), +start (5) exclusive end (10) every (1) +); + +\d+ mpp6297 +drop table mpp6297; + +-- MPP-6589: SPLITting an "open" ended partition (ie, no start or end) + +CREATE TABLE mpp6589a +( + id bigint, + day_dt date +) +PARTITION BY RANGE(day_dt) + ( + PARTITION p20090312 END ('2009-03-12'::date) + ); + +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589a%'; + +-- should work +ALTER TABLE mpp6589a +SPLIT PARTITION p20090312 AT( '20090310' ) +INTO( PARTITION p20090309, PARTITION p20090312_tmp); + +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589a%'; + +CREATE TABLE mpp6589i(a int, b int) +partition by range (b) (start (1) end (3)); +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589i%'; + +-- should fail (overlap) +ALTER TABLE mpp6589i ADD PARTITION start (2); +-- should work (there's a "point" hole at value 2) +ALTER TABLE mpp6589i ADD PARTITION start (3) exclusive; +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589i%'; + +-- test open-ended SPLIT +CREATE TABLE mpp6589b +( + id bigint, + day_dt date +) +PARTITION BY RANGE(day_dt) + ( + PARTITION p20090312 START ('2008-03-12'::date) + ); + +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589b%'; + +-- should work +ALTER TABLE mpp6589b +SPLIT PARTITION p20090312 AT( '20090310' ) +INTO( PARTITION p20090309, PARTITION p20090312_tmp); + +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'mpp6589b%'; + +-- MPP-7191, MPP-7193: partitioned tables - fully-qualify storage type +-- if not specified (and not a template) +CREATE TABLE mpp5992 (a int, b date, c char, + d char(4), e varchar(20), f timestamp) +WITH (orientation=column,appendonly=true) +partition by range (b) +subpartition by list (a) +subpartition template ( +subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ) +subpartition by list (e) +subpartition template ( +subpartition ll1 values ('Engineering'), +subpartition ll2 values ('QA') ) +subpartition by list (c) +subpartition template ( +subpartition lll1 values ('M'), +subpartition lll2 values ('F') ) +( + start (date '2007-01-01') + end (date '2010-01-01') every (interval '1 year') +); + +-- Delete subpartition template +alter table mpp5992 alter partition for ('2008-01-01') +set subpartition template (); +alter table mpp5992 alter partition for ('2008-01-01') +alter partition for (1) +set subpartition template (); +alter table mpp5992 set subpartition template (); + +-- Add subpartition template +alter table mpp5992 alter partition for ('2008-01-01') +alter partition for (1) +set subpartition template ( subpartition lll1 values ('M'), +subpartition lll2 values ('F')); + +alter table mpp5992 alter partition for ('2008-01-01') +set subpartition template ( +subpartition ll1 values ('Engineering'), +subpartition ll2 values ('QA') +); +alter table mpp5992 +set subpartition template (subpartition l1 values (1,2,3,4,5), +subpartition l2 values (6,7,8,9,10) ); +alter table mpp5992 +set subpartition template (subpartition l1 values (1,2,3), +subpartition l2 values (4,5,6), subpartition l3 values (7,8,9,10)); +select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; + +-- Now we can add a new partition +alter table mpp5992 +add partition foo1 +start (date '2011-01-01') +end (date '2012-01-01'); -- should inherit from parent storage option + +alter table mpp5992 +add partition foo2 +start (date '2012-01-01') +end (date '2013-01-01') WITH (orientation=column,appendonly=true); + +alter table mpp5992 +add partition foo3 +start (date '2013-01-01') end (date '2014-01-01') WITH (appendonly=true); + +select * from pg_partition_tree('mpp5992'); +select relname, relam, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp5992%'; +select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; + +-- MPP-10223: split subpartitions +CREATE TABLE MPP10223pk +( +rnc VARCHAR(100), +wbts VARCHAR(100), +axc VARCHAR(100), +vptt VARCHAR(100), +vcct VARCHAR(100), +agg_level CHAR(5), +period_start_time TIMESTAMP WITH TIME ZONE, +load_time TIMESTAMP WITH TIME ZONE DEFAULT now(), +interval INTEGER, +totcellsegress double precision, +totcellsingress double precision, + + CONSTRAINT "axc_vcct1_atmvcct_pk_test2" +PRIMARY KEY (rnc,wbts,axc,vptt,vcct,agg_level,period_start_time) +) + + + +PARTITION BY LIST (AGG_LEVEL) + SUBPARTITION BY RANGE (PERIOD_START_TIME) +( + PARTITION min15part VALUES ('15min') + ( + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION hourpart VALUES ('hour') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P20100623 START (date '2010-06-23') INCLUSIVE, + SUBPARTITION P20100624 START (date '2010-06-24') INCLUSIVE, + SUBPARTITION P20100625 START (date '2010-06-25') INCLUSIVE, + SUBPARTITION P20100626 START (date '2010-06-26') INCLUSIVE, + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION daypart VALUES ('day') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P20100623 START (date '2010-06-23') INCLUSIVE, + SUBPARTITION P20100624 START (date '2010-06-24') INCLUSIVE, + SUBPARTITION P20100625 START (date '2010-06-25') INCLUSIVE, + SUBPARTITION P20100626 START (date '2010-06-26') INCLUSIVE, + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ) +); + +-- MPP-10421: works -- can re-use name for non-DEFAULT partitions, and +-- primary key problems fixed +ALTER TABLE MPP10223pk + ALTER PARTITION min15part +SPLIT PARTITION P_FUTURE AT ('2010-06-25') +INTO (PARTITION P20010101, PARTITION P_FUTURE); +drop table mpp10223pk; +-- rebuild the table without a primary key +CREATE TABLE MPP10223 +( +rnc VARCHAR(100), +wbts VARCHAR(100), +axc VARCHAR(100), +vptt VARCHAR(100), +vcct VARCHAR(100), +agg_level CHAR(5), +period_start_time TIMESTAMP WITH TIME ZONE, +load_time TIMESTAMP WITH TIME ZONE DEFAULT now(), +interval INTEGER, +totcellsegress double precision, +totcellsingress double precision +) + + + +PARTITION BY LIST (AGG_LEVEL) + SUBPARTITION BY RANGE (PERIOD_START_TIME) +( + PARTITION min15part VALUES ('15min') + ( + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION hourpart VALUES ('hour') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P20100623 START (date '2010-06-23') INCLUSIVE, + SUBPARTITION P20100624 START (date '2010-06-24') INCLUSIVE, + SUBPARTITION P20100625 START (date '2010-06-25') INCLUSIVE, + SUBPARTITION P20100626 START (date '2010-06-26') INCLUSIVE, + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION daypart VALUES ('day') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P20100623 START (date '2010-06-23') INCLUSIVE, + SUBPARTITION P20100624 START (date '2010-06-24') INCLUSIVE, + SUBPARTITION P20100625 START (date '2010-06-25') INCLUSIVE, + SUBPARTITION P20100626 START (date '2010-06-26') INCLUSIVE, + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ) +); + +-- this works +ALTER TABLE MPP10223 + ALTER PARTITION min15part +SPLIT PARTITION P_FUTURE AT ('2010-06-25') +INTO (PARTITION P20010101, PARTITION P_FUTURE2); + +select * from pg_partition_tree('mpp10223'); +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp10223%'; + +-- simpler version +create table mpp10223b (a int, b int , d int) +partition by range (b) +subpartition by range (d) +(partition p1 start (1) end (10) +(subpartition sp2 start (20) end (30))); + +-- MPP-10421: allow re-use sp2 for non-DEFAULT partition +alter table mpp10223b alter partition p1 +split partition for (20) at (25) +into (partition sp2, partition sp3); + +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp10223b%'; + +-- MPP-10480: dump templates (but don't use "foo") +create table MPP10480 (a int, b int, d int) +partition by range (b) +subpartition by range(d) +subpartition template (start (1) end (10) every (1)) +(start (20) end (30) every (1)); + +select relid::regclass, level, template from gp_partition_template where relid = 'MPP10480'::regclass; + +-- MPP-10421: fix SPLIT of partitions with PRIMARY KEY constraint/indexes +CREATE TABLE mpp10321a +( + rnc VARCHAR(100), + wbts VARCHAR(100), + axc VARCHAR(100), + vptt VARCHAR(100), + vcct VARCHAR(100), + agg_level CHAR(5), + period_start_time TIMESTAMP WITH TIME ZONE, + load_time TIMESTAMP WITH TIME ZONE DEFAULT now(), + interval INTEGER, + totcellsegress double precision, + totcellsingress double precision, + + CONSTRAINT "mpp10321a_pk" +PRIMARY KEY (rnc,wbts,axc,vptt,vcct,agg_level,period_start_time) +) + +PARTITION BY LIST (AGG_LEVEL) + SUBPARTITION BY RANGE (PERIOD_START_TIME) +( + PARTITION min15part VALUES ('15min') + ( + SUBPARTITION P_FUTURE START (date '2001-01-01') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ), + PARTITION hourpart VALUES ('hour') + ( + SUBPARTITION P20100622 START (date '2010-06-22') INCLUSIVE, + SUBPARTITION P_ENDPART START (date '2999-12-30') INCLUSIVE + END (date '2999-12-31') EXCLUSIVE + ) +); + +ALTER TABLE mpp10321a +ALTER PARTITION min15part +SPLIT PARTITION P_FUTURE AT ('2010-06-25') +INTO (PARTITION P20010101, PARTITION P_FUTURE); + +DROP TABLE mpp10321a; + +-- test for default partition with boundary spec +create table bhagp_range (a int, b int) + +partition by range (b) +( + default partition x + start (0) inclusive + end (2) exclusive + every (1) +); + +create table bhagp_list (a int, b int) + +partition by list (b) +( + default partition x + values (1,2) +); + +-- more coverage tests + +-- bad partition by type +create table cov1 (a int, b int) +partition by (b) +( +start (1) end (10) every (1) +); + +-- bad partition by type +create table cov1 (a int, b int) +partition by funky (b) +( +start (1) end (10) every (1) +); + +drop table cov1; + +create table cov1 (a int, b int) +partition by range (b) +( +start (1) end (10) every (1) +); + +-- syntax error +alter table cov1 drop partition for (funky(1)); + +-- no rank for default +alter table cov1 drop default partition for (1); + +-- no default +alter table cov1 split default partition at (9); +alter table cov1 drop default partition; + +-- cannot add except by name +alter table cov1 add partition for (1); + +-- bad template +alter table cov1 set subpartition template (values (1,2) (values (2,3))); + +-- create and drop default partition in one statement! +alter table cov1 add default partition def1, drop default partition; + +drop table cov1; + +-- every 5 (1) now disallowed... +create table cov1 (a int, b int) +partition by range (b) +( +start (1) end(20) every 5 (1) +); + +drop table if exists cov1; + +create table cov1 (a int, b int) +partition by list (b) +( +partition p1 values (1,2,3,4,5,6,7,8) +); + +-- bad split +alter table cov1 split partition p1 at (5,50); + +-- good split +alter table cov1 split partition p1 at (5,6,7) +into (partition p1, partition p2); + +select relname, pg_get_expr(relpartbound, oid, false) from pg_class where relname like 'cov1%'; + +drop table cov1; + +-- MPP-11120 +-- ADD PARTITION didn't explicitly specify the distribution policy in the +-- CreateStmt distributedBy field and as such we followed the behaviour encoded +-- in transformDistributedBy(). Unfortunately, it chooses to set the +-- distribution policy to that of the primary key if the distribution policy +-- is not explicitly set. +create table tbl11120 ( + a int, + b int, + c int, + primary key (a,b,c) +) +partition by range (b) +( + default partition default_partition, + partition p1 start (1) end (2) +); + +insert into tbl11120 values(1,2,3); + +select * from tbl11120; -- expected: (1,2,3) + +delete from tbl11120 where a=1 and b=2 and c=3; -- this should delete the row in tbl11120 + +select * from tbl11120; -- expected, no rows + +insert into tbl11120 values(1,2,3); -- reinsert data + +-- all partitions should have same distribution policy +select relname, distkey as distribution_attributes from +gp_distribution_policy p, pg_class c +where p.localoid = c.oid and relname like 'tbl11120%' order by p.localoid; + +alter table tbl11120 split default partition + start (3) + end (4) + into (partition p2, default partition); + + +select relname, distkey as distribution_attributes from +gp_distribution_policy p, pg_class c where p.localoid = c.oid and +relname like 'tbl11120%' order by p.localoid; + +delete from tbl11120 where a=1 and b=2 and c=3; -- this should delete the row in tbl11120 + +select * from tbl11120; -- expected, no rows! But we see the row. Wrong results! + +alter table tbl11120 drop partition default_partition; + +alter table tbl11120 add partition foo start(10) end(20); + +select relname, distkey as distribution_attributes from +gp_distribution_policy p, pg_class c where p.localoid = c.oid and +relname like 'tbl11120%' order by p.localoid; + +drop table tbl11120; + +-- MPP-6979: EXCHANGE partitions - fix namespaces if they differ + +-- new schema +create schema mpp6979dummy; + +create table mpp6979part(a int, b int) +partition by range(b) +( +start (1) end (10) every (1) +); + +-- append-only table in new schema +create table mpp6979dummy.mpp6979tab(like mpp6979part) with (appendonly=true); + +-- check that table and all parts in public schema +select relname, nspname, relispartition from pg_class c, pg_namespace n +where c.relnamespace = n.oid and relname like ('mpp6979%'); + +-- note that we have heap partitions in public, and ao table in mpp6979dummy +select nspname, relname, amname +from pg_class pc +inner join pg_namespace ns on pc.relnamespace=ns.oid +left join pg_am am on am.oid = pc.relam +where relname like ('mpp6979%'); + +-- exchange the partition with the ao table. +-- Now we have an ao partition and mpp6979tab is heap! +alter table mpp6979part exchange partition for (1) +with table mpp6979dummy.mpp6979tab; + +-- after the exchange, all partitions are still in public +select relname, nspname, relispartition from pg_class c, pg_namespace n +where c.relnamespace = n.oid and relname like ('mpp6979%'); + +-- the rank 1 partition is ao, but still in public, and +-- table mpp6979tab is now heap, but still in mpp6979dummy +select relname, nspname, relispartition, amname +from pg_class c inner join pg_namespace n on c.relnamespace = n.oid +left join pg_am am on am.oid = c.relam +where relname like ('mpp6979%'); + +drop table mpp6979part; +drop table mpp6979dummy.mpp6979tab; + +drop schema mpp6979dummy; + +-- MPP-7898: + +create table parent_s + (a int, b text) + ; + +insert into parent_s values + (1, 'one'); + +-- Try to create a table that mixes inheritance and partitioning. +-- Correct behavior: ERROR + +create table child_r + ( c int, d int) + inherits (parent_s) + partition by range(d) + ( + start (0) + end (2) + every (1) + ); + + -- If (incorrectly) the previous statement works, the next one is + -- likely to fail with in unexpected internal error. This is residual + -- issue MPP-7898. +insert into child_r values + (0, 'from r', 0, 0); + +drop table if exists parent_s cascade; --ignore +drop table if exists child_r cascade; --ignore + +create table parent_r + ( a int, b text, c int, d int ) + + partition by range(d) + ( + start (0) + end (2) + every (1) + ); + +insert into parent_r values + (0, 'from r', 0, 0); + +create table parent_s + ( a int, b text, c int, d int ) + ; + +insert into parent_s values + (1, 'from s', 555, 555); + +create table child_t + ( ) + inherits (parent_s) + ; + +insert into child_t values + (0, 'from t', 666, 666); + +-- Try to exchange in the child and parent. +-- Correct behavior: ERROR in both cases. + +alter table parent_r exchange partition for (1) with table child_t; +alter table parent_r exchange partition for (1) with table parent_s; + +drop table child_t cascade; --ignore +drop table parent_s cascade; --ignore +drop table parent_r cascade; --ignore + +-- MPP-7898 end. + +-- ( MPP-13750 + +CREATE TABLE s (id int, date date, amt decimal(10,2), units int) + +PARTITION BY RANGE (date) +( START (date '2008-01-01') INCLUSIVE + END (date '2008-01-02') EXCLUSIVE + EVERY (INTERVAL '1 day') ); + +create index s_i on s(amt) + where (id > 1) + ; + +create index s_j on s(units) + where (id <= 1) + ; + +create index s_i_expr on s(log(units)); + +alter table s add partition s_test + start(date '2008-01-03') end (date '2008-01-05'); + +alter table s split partition for (date '2008-01-03') at (date '2008-01-04') + into (partition s_test, partition s_test2); + +-- start_ignore +select + relname, + (select count(distinct content) - 1 + from gp_segment_configuration) - count(*) as missing, + count(distinct relid) oid_count +from ( + select gp_execution_segment(), oid, relname + from gp_dist_random('pg_class') + ) seg_class(segid, relid, relname) +where relname ~ '^s_' +group by relname; +-- end_ignore + +drop table s cascade; + +-- MPP-13750 ) + +-- MPP-13806 start +drop table if exists mpp13806; + CREATE TABLE mpp13806 (id int, date date, amt decimal(10,2)) + PARTITION BY RANGE (date) + ( START (date '2008-01-01') INCLUSIVE + END (date '2008-01-05') EXCLUSIVE + EVERY (INTERVAL '1 day') ); + +-- Adding unbound partition right before the start used to fail +alter table mpp13806 add partition test end (date '2008-01-01') exclusive; + +drop table if exists mpp13806; + CREATE TABLE mpp13806 (id int, date date, amt decimal(10,2)) + PARTITION BY RANGE (date) + ( START (date '2008-01-01') EXCLUSIVE + END (date '2008-01-05') EXCLUSIVE + EVERY (INTERVAL '1 day') ); +-- For good measure, test the opposite case +alter table mpp13806 add partition test end (date '2008-01-01') inclusive; +drop table mpp13806; +-- MPP-13806 end + +-- MPP-14471 start +-- No unenforceable PK/UK constraints! (UNIQUE INDEXes still allowed; tested above) +drop table if exists tc cascade; +drop table if exists cc cascade; +drop table if exists at cascade; + +create table tc + (a int, b int, c int, primary key(a) ) + partition by range (b) + ( + default partition d, + start (0) inclusive end(100) inclusive every (50) + ); + +create table cc + (a int primary key, b int, c int) + partition by range (b) + ( + default partition d, + start (0) inclusive end(100) inclusive every (50) + ); + +create table at + (a int, b int, c int) + partition by range (b) + ( + default partition d, + start (0) inclusive end(100) inclusive every (50) + ); + +alter table at + add primary key (a); + +-- MPP-14471 end +-- MPP-17606 (using table "at" from above) + +alter table at + alter column b + type numeric; + +-- MPP-17606 end +-- MPP-17707 start +create table mpp17707 +( d int, p int ,x text) +with (appendonly = true) +partition by range (p) +(start (0) end (3) every (2)); + +-- Create a expression index on the partitioned table + +create index idx_abc on mpp17707(upper(x)); + +-- split partition 1 of table + +alter table mpp17707 split partition for (0) at (1) + into (partition x1, partition x2); +-- MPP-17707 end +-- MPP-17814 start +drop table if exists plst2 cascade; +-- positive; bug was that it failed whereas it should succeed +create type plst2_partkey as (a integer, c integer); +create table plst2 + ( + b integer not null, + d plst2_partkey + ) + partition by list (d) + ( + partition p1 values ( CAST('(1,2)' as plst2_partkey), CAST('(3,4)' as plst2_partkey) ), + partition p2 values ( CAST('(5,6)' as plst2_partkey) ), + partition p3 values ( CAST('(2,1)' as plst2_partkey) ) + ); +\d+ plst2 +drop table if exists plst2 cascade; +--negative; test legitimate failure +create table plst2 + ( + b integer not null, + d plst2_partkey + ) + partition by list (d) + ( + partition p1 values ( CAST('(1,2)' as plst2_partkey), CAST('(3,4)' as plst2_partkey) ), + partition p2 values ( CAST('(5,6)' as plst2_partkey) ), + partition p3 values ( CAST('(1,2)' as plst2_partkey) ) + ); + +-- postive; make sure inner part duplicates are accepted and quietly removed. +drop table if exists plst2; +drop type plst2_partkey; +create type plst2_partkey as (a int, b int); +create table plst2 + ( d int, c plst2_partkey) + partition by list (c) + ( + partition p0 values ( CAST('(1,2)' as plst2_partkey), CAST('(3,4)' as plst2_partkey) ), + partition p1 values ( CAST('(4,3)' as plst2_partkey), CAST('(2,1)' as plst2_partkey) ), + partition p2 values ( CAST('(4,4)' as plst2_partkey), CAST('(5,5)' as plst2_partkey), CAST('(4,4)' as plst2_partkey), CAST('(5,5)' as plst2_partkey), CAST('(4,4)' as plst2_partkey), CAST('(5,5)' as plst2_partkey)), + partition p3 values (CAST('(4,5)' as plst2_partkey), CAST('(5,6)' as plst2_partkey)) + ); + +-- positive; make sure legitimate alters work. +alter table plst2 add partition p4 values (CAST('(5,4)' as plst2_partkey), CAST('(6,5)' as plst2_partkey)); +alter table plst2 add partition p5 values (CAST('(7,8)' as plst2_partkey), CAST('(7,8)' as plst2_partkey)); +\d+ plst2 + +-- negative; make sure conflicting alters fail. +alter table plst2 add partition p6 values (CAST('(7,8)' as plst2_partkey), CAST('(2,1)' as plst2_partkey)); + +drop table if exists plst2; + + +-- MPP-17814 end + +-- MPP-18441 +create table s_heap (i1 int, t1 text, t2 text, i2 int, i3 int, n1 numeric, b1 bool) +partition by list (t1) + (partition abc values('abc0', 'abc1', 'abc2')); +insert into s_heap (t1, i1, i2, i3, n1, b1) select 'abc0', 1, 1, 1, 2.3, true + from generate_series(1, 5); +alter table s_heap drop column t2; +alter table s_heap drop column i3; +-- create co table for exchange +create table s_heap_ex_abc (i1 int, t1 text, f1 float, i2 int, n1 numeric, b1 bool) + WITH (appendonly=true, orientation=column, compresstype=zlib); +alter table s_heap_ex_abc drop column f1; +insert into s_heap_ex_abc select 1, 'abc1', 2, 2, true from generate_series(1, 5); +-- exchange partition +alter table s_heap exchange partition abc with table s_heap_ex_abc; +alter table s_heap exchange partition abc with table s_heap_ex_abc; +drop table s_heap, s_heap_ex_abc; +-- MPP-18441 end + +-- MPP-18443 +create table s_heap (i1 int, t1 text, i2 int , i3 int, n1 numeric,b1 bool) +partition by list (t1) + (partition def values('def0', 'def1', 'def2', 'def3', 'def4', 'def5', 'def6', 'def7', 'def8', 'def9')); +insert into s_heap(t1, i1, i2, i3, n1, b1) + select 'def0', 1, 1, 1, 2.3 , true from generate_series(1, 5); +alter table s_heap drop column i3; +create index s_heap_index on s_heap (i2); +alter table s_heap split partition def + at ('def0', 'def1', 'def2', 'def3', 'def4') into (partition def5, partition def0); +select * from s_heap_1_prt_def0; +drop table s_heap; +-- MPP-18443 end + +-- MPP-18445 +create table s_heap_ao ( i1 int, t1 text, i2 int , i3 int, n1 numeric,b1 bool) +partition by list (t1) + (partition def values('def0', 'def1', 'def2', 'def3', 'def4', 'def5', 'def6', 'def7', 'def8', 'def9') + with (appendonly=true, orientation=row)); +insert into s_heap_ao(t1, i1, i2, i3, n1, b1) + select 'def4', 1, 1, 1, 2.3, true from generate_series(1, 2); +insert into s_heap_ao(t1, i1, i2, i3, n1, b1) + select 'def5', 1, 1, 1, 2.3, true from generate_series(1, 2); +alter table s_heap_ao drop column i3; +create index s_heap_ao_index on s_heap_ao (i2); +alter table s_heap_ao split partition def + at ('def0', 'def1', 'def2', 'def3', 'def4') into (partition def5, partition def0); +select * from s_heap_ao_1_prt_def0; +drop table s_heap_ao; +-- MPP-18445 end + +-- MPP-18456 +create table s_heap_co (i1 int, t1 text, i2 int, i3 int, n1 numeric, b1 bool) +partition by list (t1) + (partition def values('def0', 'def1', 'def2', 'def3', 'def4', 'def5', 'def6', 'def7', 'def8', 'def9') + with (appendonly=true, orientation=column)); +insert into s_heap_co(t1, i1, i2, i3, n1, b1) + select 'def4', 1,1, 1, 2.3, true from generate_series(1, 2); +insert into s_heap_co(t1, i1, i2, i3, n1, b1) + select 'def5', 1,1, 1, 2.3, true from generate_series(1, 2); +alter table s_heap_co drop column i3; +create index s_heap_co_index on s_heap_co (i2); +alter table s_heap_co split partition def + at ('def0', 'def1', 'def2', 'def3', 'def4') into (partition def5, partition def0); +select * from s_heap_co_1_prt_def0; +drop table s_heap_co; +-- MPP-18456 end + +-- MPP-18457, MPP-18415 +CREATE TABLE non_ws_phone_leads ( + lead_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + source_system_lead_id character varying(60) NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_event_type_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_site_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_date_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_time_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_number_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + duration_second smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_program_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_call_status_key integer NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_department_set_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_channel_set_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_provider_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768), + dim_phone_ad_set_key smallint NOT NULL ENCODING (compresstype=zlib,compresslevel=1,blocksize=32768) +) +WITH (appendonly=true, compresstype=zlib, orientation=column) PARTITION BY RANGE(dim_date_key) + ( + PARTITION p_max START (2451545) END (9999999) WITH (tablename='non_ws_phone_leads_1_prt_p_max', orientation=column, appendonly=true ) + COLUMN lead_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN source_system_lead_id ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_event_type_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_site_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_date_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_time_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_number_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN duration_second ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_program_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_call_status_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_department_set_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_channel_set_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_provider_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + COLUMN dim_phone_ad_set_key ENCODING (compresstype=zlib, compresslevel=1, blocksize=32768) + ); + +INSERT INTO non_ws_phone_leads VALUES (63962490, 'CA6qOEyxOmNJUQC7', 5058, 999901, 2455441, 40435, 999904, 207, 79, 2, 9901, 9901, 1, 9901); + +CREATE TABLE dim_phone_numbers ( + dim_phone_number_key integer NOT NULL, + media_tracker_description character varying(40) NOT NULL, + formatted_phone_number character varying(20) NOT NULL, + source_system_phone_number_id character varying(100) NOT NULL, + last_modified_date timestamp without time zone NOT NULL +); + +ALTER TABLE ONLY dim_phone_numbers + ADD CONSTRAINT dim_phone_numbers_pk1 PRIMARY KEY (dim_phone_number_key); + +INSERT INTO dim_phone_numbers VALUES (999902, 'test', '800-123-4568', '8001234568', '2012-09-25 13:34:35.037637'); +INSERT INTO dim_phone_numbers VALUES (999904, 'test', '(800) 123-4570', '8001234570', '2012-09-25 13:34:35.148104'); +INSERT INTO dim_phone_numbers VALUES (999903, 'test', '(800) 123-4569', '8001234569', '2012-09-25 13:34:35.093523'); +INSERT INTO dim_phone_numbers VALUES (999901, 'test', '(800)123-4567', '8001234567', '2012-09-25 13:34:34.781042'); + +INSERT INTO dim_phone_numbers SELECT gs.*, dim_phone_numbers.media_tracker_description, dim_phone_numbers.formatted_phone_number, dim_phone_numbers.source_system_phone_number_id, dim_phone_numbers.last_modified_date FROM dim_phone_numbers, generate_series(1,100000) gs WHERE dim_phone_numbers.dim_phone_number_key = 999901; + +ANALYZE dim_phone_numbers; + +-- Table NON_WS_PHONE_LEADS has two distribution keys +-- Equality condition with constant on one distribution key +-- Redistribute over Append +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY +FROM NON_WS_PHONE_LEADS PL +LEFT outer JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY = DPN.DIM_PHONE_NUMBER_KEY +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441; + +-- Table NON_WS_PHONE_LEADS has two distribution keys +-- Equality conditions with constants on all distribution keys +-- Redistribute over Append +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY +FROM NON_WS_PHONE_LEADS PL +LEFT outer JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY = DPN.DIM_PHONE_NUMBER_KEY +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441 +AND PL.dim_site_key = 999901; + +-- Table NON_WS_PHONE_LEADS has two distribution keys +-- Broadcast over Append +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY +FROM NON_WS_PHONE_LEADS PL +JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY = DPN.DIM_PHONE_NUMBER_KEY +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441 +AND PL.dim_site_key = 999901; + +-- Join condition uses functions +-- Broadcast over Append +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY +FROM NON_WS_PHONE_LEADS PL +JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY + 1 = DPN.DIM_PHONE_NUMBER_KEY + 1 +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441 +AND PL.dim_site_key = 999901; + +-- Equality condition with constant on one distribution key +-- Redistribute over Append +-- Accessing a varchar in the SELECT clause should cause a SIGSEGV +SELECT pl.duration_Second , pl.dim_program_Key, PL.DIM_SITE_KEY, PL.DIM_DATE_KEY, source_system_lead_id +FROM NON_WS_PHONE_LEADS PL +LEFT outer JOIN DIM_PHONE_NUMBERS DPN +ON PL.DIM_PHONE_NUMBER_KEY = DPN.DIM_PHONE_NUMBER_KEY +WHERE pl.SOURCE_SYSTEM_LEAD_ID = 'CA6qOEyxOmNJUQC7' +AND PL.DIM_DATE_KEY = 2455441; + +DROP TABLE non_ws_phone_leads; +DROP TABLE dim_phone_numbers; + +-- Equality condition with a constant expression on one distribution key +drop table if exists foo_p; +drop table if exists bar; +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar( a int, b int, k int, t text, p int); + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; +analyze bar; +set optimizer_segments = 3; +set optimizer_nestloop_factor = 1.0; +explain select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1]; +reset optimizer_segments; +drop table if exists foo_p; +drop table if exists bar; +-- MPP-18457, MPP-18415 end + +drop table if exists pnx; + +create table pnx + (x int , y text) + + partition by list (y) + ( + partition a values ('x1', 'x2'), + partition c values ('x3', 'x4') + ); + +insert into pnx values + (1,'x1'), + (2,'x2'), + (3,'x3'), + (4,'x4'); + +select tableoid::regclass, * +from pnx; + +alter table pnx + split partition a at ('x1') + into (partition b, partition c); + +select tableoid::regclass, * +from pnx; + +select tableoid::regclass, * +from pnx +where y = 'x1'; + +select tableoid::regclass, * +from pnx +where x = 1; + + +drop table if exists pxn; + +create table pxn + (x int , y text) + + partition by list (y) + ( + partition a values ('x1', 'x2'), + partition c values ('x3', 'x4') + ); + +insert into pxn values + (1,'x1'), + (2,'x2'), + (3,'x3'), + (4,'x4'); + +select tableoid::regclass, * +from pxn; + +alter table pxn + split partition a at ('x1') + into (partition c, partition b); + +select tableoid::regclass, * +from pxn; + +select tableoid::regclass, * +from pxn +where y = 'x2'; + +select tableoid::regclass, * +from pxn +where x = 2; + +drop table if exists pxn; + +create table pxn + (x int , y int) + + partition by range (y) + ( + partition a start (0) end (10), + partition c start (11) end (20) + ); + +insert into pxn values + (4,4), + (9,9), + (14,14), + (19,19); + +select tableoid::regclass, * +from pxn; + +alter table pxn + split partition a at (5) + into (partition b, partition c); + +select tableoid::regclass, * +from pxn; + +select tableoid::regclass, * +from pxn +where y = 4; + +select tableoid::regclass, * +from pxn +where x = 4; + +drop table if exists pxn; + +create table pxn + (x int , y int) + + partition by range (y) + ( + partition a start (0) end (10), + partition c start (11) end (20) + ); + +insert into pxn values + (4,4), + (9,9), + (14,14), + (19,19); + +select tableoid::regclass, * +from pxn; + +alter table pxn + split partition a at (5) + into (partition c, partition b); + +select tableoid::regclass, * +from pxn; + +select tableoid::regclass, * +from pxn +where y = 9; + +select tableoid::regclass, * +from pxn +where x = 9; + +-- MPP-18359 end + +-- MPP-19105 +-- Base partitions with trailing dropped columns +create table parttest_t ( + a int, + b int, + c char, + d varchar(50) +) +partition by range (a) +( + partition p1 start(1) end(5), + partition p2 start(5) +); + +-- Drop column +alter table parttest_t drop column d; + +-- Alter table split partition +alter table parttest_t split partition for(1) at (2) into (partition p11, partition p22); + +insert into parttest_t values(1,2,'a'); +select * from parttest_t; +-- END MPP-19105 +reset optimizer_nestloop_factor; + +-- Sub-partition insertion with checking if the user provided correct leaf part +create table part_tab ( i int, j int) partition by range(j) (start(0) end(10) every(2)); +-- Wrong part +insert into part_tab_1_prt_1 values(5,5); +select * from part_tab; +select * from part_tab_1_prt_1; + +insert into part_tab_1_prt_2 values(5,5); +select * from part_tab; +select * from part_tab_1_prt_2; + +-- Right part +insert into part_tab_1_prt_3 values(5,5); +analyze part_tab; +select * from part_tab; +select * from part_tab_1_prt_3; + +-- Root part +insert into part_tab values(5,5); +select * from part_tab; + +drop table if exists input1; +create table input1 (x int, y int); +insert into input1 select i, i from (select generate_series(1,10) as i) as t; +drop table if exists input2; +create table input2 (x int, y int); +insert into input2 select i, i from (select generate_series(1,10) as i) as t; + +-- Multiple range table entries in the plan +insert into part_tab_1_prt_1 select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x where i2.y = 5; +analyze part_tab; +select * from part_tab; +select * from part_tab_1_prt_1; + +insert into part_tab_1_prt_2 select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x where i2.y = 5; +select * from part_tab; +select * from part_tab_1_prt_2; + +-- Right part +insert into part_tab_1_prt_3 select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x where i1.x between 4 and 5; +select * from part_tab; +select * from part_tab_1_prt_3; + +-- Root part but no matching part for i2.y == 10 +insert into part_tab select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x; +select * from part_tab; + +-- Root part +insert into part_tab select i1.x, i2.y from input1 as i1 join input2 as i2 on i1.x = i2.x where i2.y < 10; +select * from part_tab; + +-- Multi-level partitioning +create table deep_part ( i int, j int, k int, s char(5)) +partition by list(s) +subpartition by range (j) subpartition template (start(1) end(10) every(2)) +subpartition by range (k) subpartition template (start(1) end(10) every(2)) +(partition female values('F'), partition male values('M')) +; + +-- Intermediate partition insert is allowed +insert into deep_part_1_prt_male_2_prt_2 values(1,3,1,'M'); +-- but only if it's the right partition. +insert into deep_part_1_prt_male_2_prt_2 values(1,1,1,'M'); + +-- Wrong sub-partition (inserting a female value in male partition) +insert into deep_part_1_prt_male_2_prt_2_3_prt_2 values (1, 1, 1, 'F'); +select * from deep_part; + +-- Correct leaf part +insert into deep_part_1_prt_male_2_prt_1_3_prt_1 values (1, 1, 1, 'M'); +analyze deep_part; +select * from deep_part; +select * from deep_part_1_prt_male_2_prt_1_3_prt_1; + +-- Root part of a multi-level partitioned table +insert into deep_part values (1, 1, 1, 'M'); +select * from deep_part; +select * from deep_part_1_prt_male_2_prt_1_3_prt_1; + +insert into deep_part values (1, 1, 1, 'F'); +select * from deep_part; +select * from deep_part_1_prt_female_2_prt_1_3_prt_1; + +insert into deep_part values (5, 5, 5, 'M'); +select * from deep_part; +select * from deep_part_1_prt_male_2_prt_3_3_prt_3; + +insert into deep_part values (9, 9, 9, 'F'); +select * from deep_part; +select * from deep_part_1_prt_female_2_prt_5_3_prt_5; + +-- Out of range partition +insert into deep_part values (9, 9, 10, 'F'); +select * from deep_part; + +drop table input2; +drop table input1; + +-- Avoid TupleDesc leak when COPY partition table from files +-- This also covers the bug reported in MPP-9548 where insertion +-- into a dropped/added column yielded incorrect results +drop table if exists pt_td_leak; +CREATE TABLE pt_td_leak +( +col1 int, +col2 int, +col3 int +) +partition by range(col2) +( + partition part1 start(1) end(5), + partition part2 start(5) end(10) +); + +insert into pt_td_leak select i,i,i from generate_series(1,9) i; +copy pt_td_leak to '/tmp/pt_td_leak.out' csv; + +alter table pt_td_leak drop column col3; +alter table pt_td_leak add column col3 int default 7; + +drop table if exists pt_td_leak_exchange; +CREATE TABLE pt_td_leak_exchange ( col1 int, col2 int, col3 int); +alter table pt_td_leak exchange partition part2 with table pt_td_leak_exchange; + +insert into pt_td_leak values(1,8,1); +copy pt_td_leak from '/tmp/pt_td_leak.out' with delimiter ','; + +select * from pt_td_leak where col1 = 5; +-- Check that data inserted into dropped/added column is correct +select * from pt_td_leak where col3 = 1; + +drop table pt_td_leak; +drop table pt_td_leak_exchange; + + +-- +-- Test COPY, when distribution keys have different attribute numbers, +-- because of dropped columns +-- +CREATE TABLE pt_dropped_col_distkey (i int, to_be_dropped text, t text) + PARTITION BY RANGE (i) (START (1) END(10) EVERY (5)); +INSERT INTO pt_dropped_col_distkey SELECT g, 'dropped' || g, 'before drop ' || g FROM generate_series(1, 7) g; + +ALTER TABLE pt_dropped_col_distkey DROP COLUMN to_be_dropped; + +-- This new partition won't have the dropped column. Because the distribution +-- key was after the dropped column, the attribute number of the distribution +-- key column will be different in this partition and the parent. +ALTER TABLE pt_dropped_col_distkey ADD PARTITION pt_dropped_col_distkey_new_part START (10) END (100); + +INSERT INTO pt_dropped_col_distkey SELECT g, 'after drop ' || g FROM generate_series(8, 15) g; +SELECT * FROM pt_dropped_col_distkey ORDER BY i; +COPY pt_dropped_col_distkey TO '/tmp/pt_dropped_col_distkey.out'; + +DELETE FROM pt_dropped_col_distkey; + +COPY pt_dropped_col_distkey FROM '/tmp/pt_dropped_col_distkey.out'; + +SELECT * FROM pt_dropped_col_distkey ORDER BY i; + +-- don't drop the table, so that we have a partitioned table like this still +-- in the database, when we test pg_upgrade later. + + +-- +-- Test split default partition while per tuple memory context is reset +-- +drop table if exists test_split_part cascade; + +CREATE TABLE test_split_part ( log_id int NOT NULL, f_array int[] NOT NULL) +PARTITION BY RANGE(log_id) +( + START (1::int) END (100::int) EVERY (5) WITH (appendonly=false), + PARTITION "Old" START (101::int) END (201::int) WITH (appendonly=false), + DEFAULT PARTITION other_log_ids WITH (appendonly=false) +); + +insert into test_split_part (log_id , f_array) select id, '{10}' from generate_series(1,1000) id; + +ALTER TABLE test_split_part SPLIT DEFAULT PARTITION START (201) INCLUSIVE END (301) EXCLUSIVE INTO (PARTITION "New", DEFAULT PARTITION); + +-- In GPDB 6 and below, an automatic array type was only created for the root +-- partition. Nowadays we rely on upstream partitioning code, which creates +-- an array type for all partition. +select typname, typtype, typcategory from pg_type where typname like '%test_split_part%' and typcategory = 'A'; +select array_agg(test_split_part) from test_split_part where log_id = 500; +select array_agg(test_split_part_1_prt_other_log_ids) from test_split_part_1_prt_other_log_ids where log_id = 500; + +-- Originally reported in MPP-7232 +create table mpp7232a (a int, b int) partition by range (b) (start (1) end (3) every (1)); +\d+ mpp7232a +alter table mpp7232a rename partition for (1) to alpha; +alter table mpp7232a rename partition for (2) to bravo; +\d+ mpp7232a + +create table mpp7232b (a int, b int) partition by range (b) (partition alpha start (1) end (3) every (1)); +alter table mpp7232b rename partition for (1) to foo; +\d+ mpp7232b + +-- Test .. WITH (tablename = ..) syntax. +create table mpp17740 (a integer, b integer, e date) with (appendonly = true, orientation = column) + +partition by range(e) +( + partition mpp17740_20120523 start ('2012-05-23'::date) inclusive end ('2012-05-24'::date) exclusive with (tablename = 'mpp17740_20120523', appendonly = true), + partition mpp17740_20120524 start ('2012-05-24'::date) inclusive end ('2012-05-25'::date) exclusive with (tablename = 'mpp17740_20120524', appendonly = true) +); +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp17740%'; + +alter table mpp17740 add partition mpp17740_20120520 start ('2012-05-20'::date) inclusive end ('2012-05-21'::date) exclusive with (tablename = 'mpp17740_20120520', appendonly=true); +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp17740%'; + +-- Test mix of add and drop various column before split, and exchange partition at the end +create table sales (pkid serial, option1 int, option2 int, option3 int, constraint partable_pkey primary key(pkid, option3)) + partition by range (option3) +( + partition aa start(1) end(100), + partition bb start(101) end(200), + partition cc start(201) end (300) +); + +-- should error out since no subpartition in sales. +alter table sales add partition dd start(301) end(300) + ( subpartition opt1_1 VALUES (1), + subpartition opt1_2 VALUES (2) ); + +-- root partition (and only root) should have relfrozenxid as 0 +select relname, relkind from pg_class where relkind in ('r', 'p') and relname like 'sales%' and relfrozenxid=0; +-- start_ignore +select gp_segment_id, relname, relkind from gp_dist_random('pg_class') where relkind in ('r', 'p') and relname like 'sales%' and relfrozenxid=0; +-- end_ignore +alter table sales add column tax float; +-- root partition (and only root) continues to have relfrozenxid as 0 +select relname, relkind from pg_class where relkind in ('r', 'p') and relname like 'sales%' and relfrozenxid=0; +-- start_ignore +select gp_segment_id, relname, relkind from gp_dist_random('pg_class') where relkind in ('r', 'p') and relname like 'sales%' and relfrozenxid=0; +-- end_ignore +alter table sales drop column tax; + +create table newpart(like sales); +alter table newpart add constraint newpart_pkey primary key(pkid, option3); +alter table sales split partition for(1) at (50) into (partition aa1, partition aa2); + +select table_schema, table_name, constraint_name, constraint_type + from information_schema.table_constraints + where table_name in ('sales', 'newpart') + and constraint_name in ('partable_pkey', 'newpart_pkey') + order by table_name desc; + +alter table sales exchange partition for (101) with table newpart; + +select * from sales order by pkid; + +-- Create exchange table before drop column, make sure the consistency check still exist +create table newpart2(like sales); +alter table sales drop column option2; + +alter table sales exchange partition for (101) with table newpart2; + +select * from sales order by pkid; +drop table sales cascade; + +-- Exchage partiton table with a table having dropped column +create table exchange_part(a int, b int) partition by range(b) (start (0) end (10) every (5)); +create table exchange1(a int, c int, b int); +alter table exchange1 drop column c; +alter table exchange_part exchange partition for (1) with table exchange1; +copy exchange_part from STDIN DELIMITER as '|'; +9794 | 1 +9795 | 2 +9797 | 3 +9799 | 4 +9801 | 5 +9802 | 6 +9803 | 7 +9806 | 8 +9807 | 9 +9808 | 1 +9810 | 2 +9814 | 3 +9815 | 4 +9817 | 5 +9818 | 6 +9822 | 7 +9824 | 8 +9825 | 9 +9827 | 1 +9828 | 2 +9831 | 3 +9832 | 4 +9836 | 5 +9840 | 6 +9843 | 7 +9844 | 8 +\. +select * from exchange_part; +drop table exchange_part; +drop table exchange1; +-- Ensure that new partitions get the correct attributes (MPP17110) +CREATE TABLE pt_tab_encode (a int, b text) +with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) +partition by list(b) (partition s_abc values ('abc') with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1)); + +alter table pt_tab_encode add partition "s_xyz" values ('xyz') WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1); + +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'pt_tab_encode%'; + +select gp_segment_id, attrelid::regclass, attnum, attoptions from pg_attribute_encoding where attrelid = 'pt_tab_encode_1_prt_s_abc'::regclass; +-- start_ignore +select gp_segment_id, attrelid::regclass, attnum, attoptions from gp_dist_random('pg_attribute_encoding') where attrelid = 'pt_tab_encode_1_prt_s_abc'::regclass order by 1,3 limit 5; +-- end_ignore + +select gp_segment_id, attrelid::regclass, attnum, attoptions from pg_attribute_encoding where attrelid = 'pt_tab_encode_1_prt_s_xyz'::regclass; +-- start_ignore +select gp_segment_id, attrelid::regclass, attnum, attoptions from gp_dist_random('pg_attribute_encoding') where attrelid = 'pt_tab_encode_1_prt_s_xyz'::regclass order by 1,3 limit 5; +-- end_ignore + +select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = relam where c.oid = 'pt_tab_encode_1_prt_s_abc'::regclass; +select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = relam where c.oid = 'pt_tab_encode_1_prt_s_xyz'::regclass; + +-- Ensure that only the correct type of partitions can be added +create table at_range (a int) partition by range (a) (start(1) end(5)); +create table at_list (i int) partition by list(i) (partition p1 values(1)); + +alter table at_list add partition foo2 start(6) end (10); +alter table at_range add partition test values(5); + +-- Ensure array type for the non-partition table is there after partition exchange. +CREATE TABLE pt_xchg(a int) PARTITION BY RANGE(a) (START(1) END(4) EVERY (2)); +create table xchg_tab1(a int); +CREATE SCHEMA xchg_schema; +create table xchg_schema.xchg_tab2(a int); +alter table pt_xchg exchange partition for (1) with table xchg_tab1; +alter table pt_xchg exchange partition for (3) with table xchg_schema.xchg_tab2; + +select a.typowner=b.typowner from pg_type a join pg_type b on true where a.typname = 'xchg_tab1' and b.typname = '_xchg_tab1'; + +select nspname from pg_namespace join pg_type on pg_namespace.oid = pg_type.typnamespace where pg_type.typname = 'xchg_tab1' or pg_type.typname = '_xchg_tab1'; +select nspname from pg_namespace join pg_type on pg_namespace.oid = pg_type.typnamespace where pg_type.typname = 'xchg_tab2' or pg_type.typname = '_xchg_tab2'; + +select typname from pg_type where typelem = 'xchg_tab1'::regtype; +select typname from pg_type where typelem = 'xchg_schema.xchg_tab2'::regtype; + +select typname from pg_type where typarray = '_xchg_tab1'::regtype; +select typname from pg_type where typarray = 'xchg_schema._xchg_tab2'::regtype; + +alter table pt_xchg exchange partition for (1) with table xchg_tab1; +select a.typowner=b.typowner from pg_type a join pg_type b on true where a.typname = 'xchg_tab1' and b.typname = '_xchg_tab1'; +select nspname from pg_namespace join pg_type on pg_namespace.oid = pg_type.typnamespace where pg_type.typname = 'xchg_tab1' or pg_type.typname = '_xchg_tab1'; +select typname from pg_type where typelem = 'xchg_tab1'::regtype; +select typname from pg_type where typarray = '_xchg_tab1'::regtype; + + +-- Test with an incomplete operator class. Create a custom operator class and +-- only define equality on it. You can't do much with that. +-- +-- Before GPDB 7, Cloudberry used to allow creating the table, but you got an +-- error when inserting to it. Nowadays we rely on PostgreSQL partitioning +-- code, which rejects it at CREATE TABLE already. +create type employee_type as (empid int, empname text); +create function emp_equal(employee_type, employee_type) returns boolean + as 'select $1.empid = $2.empid;' + language sql + immutable + returns null on null input; +create operator = ( + leftarg = employee_type, + rightarg = employee_type, + procedure = emp_equal +); +create operator class employee_incomplete_op_class default for type employee_type + using btree as + operator 3 =; +create table employee_table(timest date, user_id numeric(16,0) not null, tag1 char(5), emp employee_type) + partition by list(emp) + (partition part1 values('(1, ''foo'')'::employee_type), partition part2 values('(2, ''foo'')'::employee_type)); + + +-- Test partition table with ACL. +-- We grant default SELECT permission to a new user, this new user should be +-- able to SELECT from any partition table we create later. +-- (https://github.com/greenplum-db/gpdb/issues/9524) +DROP TABLE IF EXISTS public.t_part_acl; +DROP ROLE IF EXISTS user_prt_acl; + +CREATE ROLE user_prt_acl; +ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user_prt_acl; + +CREATE TABLE public.t_part_acl (dt date) +PARTITION BY RANGE (dt) +( + START (date '2019-12-01') INCLUSIVE + END (date '2020-02-01') EXCLUSIVE + EVERY (INTERVAL '1 month') +); +INSERT INTO public.t_part_acl VALUES (date '2019-12-01'), (date '2020-01-31'); + +-- check if parent and child table have same relacl +SELECT relname FROM pg_class +WHERE relname LIKE 't_part_acl%' + AND relacl = (SELECT relacl FROM pg_class WHERE relname = 't_part_acl'); + +-- check if new user can SELECT all data +SET ROLE user_prt_acl; +SELECT * FROM public.t_part_acl; + +RESET ROLE; +DROP TABLE public.t_part_acl; +ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM user_prt_acl; +DROP ROLE user_prt_acl; diff --git a/src/test/singlenode_regress/sql/partition1.sql b/src/test/singlenode_regress/sql/partition1.sql new file mode 100644 index 00000000000..58fd9f14cc4 --- /dev/null +++ b/src/test/singlenode_regress/sql/partition1.sql @@ -0,0 +1,1756 @@ + +drop table if exists d; +drop table if exists c; +drop table if exists b; +drop table if exists a; + +--ERROR: Missing boundary specification in partition 'aa' of type LIST +create table fff (a char(1), b char(2), d char(3)) +partition by list (b) (partition aa ); + + +-- ERROR: Invalid use of RANGE boundary specification in partition +-- number 1 of type LIST +create table fff (a char(1), b char(2), d char(3)) +partition by list (b) (start ('a') ); + + +-- should work +create table fff (a char(1), b char(2), d char(3)) +partition by list (b) (partition aa values ('2')); + +drop table fff cascade; + +-- this is subtly wrong -- it defines 4 partitions +-- the problem is the comma before "end", which causes us to +-- generate 2 anonymous partitions. +-- This is an error: +-- ERROR: invalid use of mixed named and unnamed RANGE boundary specifications +create table ggg (a char(1), b int, d char(3)) + +partition by range (b) +( +partition aa start ('2007'), end ('2008'), +partition bb start ('2008'), end ('2009') +); + +create table ggg (a char(1), b int) + +partition by range(b) +( +partition aa start ('2007'), end ('2008') +); + +drop table ggg cascade; + +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01'), +partition bb start (date '2008-01-01') end (date '2009-01-01') +); + + +drop table ggg cascade; + +-- Expressions are allowed +create table ggg (a char(1), b numeric, d numeric) + +partition by range (b) +( +partition aa start (2007) end (2007+1), +partition bb start (2008) end (2009) +); + +drop table ggg cascade; + +-- Even volatile expressions are OK. They are evaluted immediately. +create table ggg (a char(1), b numeric, d numeric) + +partition by range (b) +( +partition aa start (2007) end (2008+(random()*9)::integer), +partition bb start (2018) end (2019) +); + +drop table ggg cascade; + +-- too many columns for RANGE partition +create table ggg (a char(1), b numeric, d numeric) + +partition by range (b,d) +( +partition aa start (2007,1) end (2008,2), +partition bb start (2008,2) end (2009,3) +); + +drop table ggg cascade; + +-- Mismatch between number of columns in PARTITION BY and in the START/END clauses +create table pby_mismatch (a char(1), b numeric, d numeric) + +partition by range (b) +( + partition aa start (2007,1) end (2008), + partition bb start (2008,2) end (2009) +); + +create table pby_mismatch (a char(1), b numeric, d numeric) + +partition by range (b) +( + partition aa start (2007) end (2008,1), + partition bb start (2008) end (2009,1) +); + +-- basic list partition +create table ggg (a char(1), b char(2), d char(3)) + +partition by LIST (b) +( +partition aa values ('a', 'b', 'c', 'd'), +partition bb values ('e', 'f', 'g') +); + +insert into ggg values ('x', 'a'); +insert into ggg values ('x', 'b'); +insert into ggg values ('x', 'c'); +insert into ggg values ('x', 'd'); +insert into ggg values ('x', 'e'); +insert into ggg values ('x', 'f'); +insert into ggg values ('x', 'g'); +insert into ggg values ('x', 'a'); +insert into ggg values ('x', 'b'); +insert into ggg values ('x', 'c'); +insert into ggg values ('x', 'd'); +insert into ggg values ('x', 'e'); +insert into ggg values ('x', 'f'); +insert into ggg values ('x', 'g'); + +select * from ggg order by 1, 2; + +-- ok +select * from ggg_1_prt_aa order by 1, 2; +select * from ggg_1_prt_bb order by 1, 2; + +drop table ggg cascade; + +-- documentation example - partition by list and range +CREATE TABLE rank (id int, rank int, year date, gender +char(1)) +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01'), +start (date '2002-01-01'), +start (date '2003-01-01'), +start (date '2004-01-01'), +start (date '2005-01-01') +) +( + partition boys values ('M'), + partition girls values ('F') +); + +insert into rank values (1, 1, date '2001-01-15', 'M'); +insert into rank values (2, 1, date '2002-02-15', 'M'); +insert into rank values (3, 1, date '2003-03-15', 'M'); +insert into rank values (4, 1, date '2004-04-15', 'M'); +insert into rank values (5, 1, date '2005-05-15', 'M'); +insert into rank values (6, 1, date '2001-01-15', 'F'); +insert into rank values (7, 1, date '2002-02-15', 'F'); +insert into rank values (8, 1, date '2003-03-15', 'F'); +insert into rank values (9, 1, date '2004-04-15', 'F'); +insert into rank values (10, 1, date '2005-05-15', 'F'); + +select * from rank order by 1, 2, 3, 4; +select * from rank_1_prt_boys order by 1, 2, 3, 4; +select * from rank_1_prt_girls order by 1, 2, 3, 4; +select * from rank_1_prt_girls_2_prt_1 order by 1, 2, 3, 4; +select * from rank_1_prt_girls_2_prt_2 order by 1, 2, 3, 4; + + +drop table rank cascade; + + + +-- range list combo +create table ggg (a char(1), b date, d char(3), e numeric) + +partition by range (b) +subpartition by list(d) +( +partition aa +start (date '2007-01-01') +end (date '2008-01-01') + (subpartition dd values ('1', '2', '3'), + subpartition ee values ('4', '5', '6')), +partition bb +start (date '2008-01-01') +end (date '2009-01-01') + (subpartition dd values ('1', '2', '3'), + subpartition ee values ('4', '5', '6')) +); + +drop table ggg cascade; + + +-- demo ends here + + +-- LIST validation + +-- duplicate partition name +CREATE TABLE rank (id int, rank int, year date, gender +char(1)) +partition by list (gender) +( + partition boys values ('M'), + partition girls values ('a'), + partition girls values ('b'), + partition girls values ('c'), + partition girls values ('d'), + partition girls values ('e'), + partition bob values ('M') +); + +-- duplicate values +CREATE TYPE rank_partkey AS (rank int, gender char(1)); +CREATE TABLE rank (id int, rankgender rank_partkey, year date) + +partition by list (rankgender) +( + values (CAST ('(1,M)' AS rank_partkey)), + values (CAST ('(2,M)' AS rank_partkey)), + values (CAST ('(3,M)' AS rank_partkey)), + values (CAST ('(1,F)' AS rank_partkey)), + partition ff values (CAST ('(4,M)' AS rank_partkey)), + partition bb values (CAST ('(1,M)' AS rank_partkey)) +); + + +-- RANGE validation + +-- legal if end of aa not inclusive +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition aa start (date '2007-08-01') end (date '2008-01-01'), +partition bb start (date '2008-01-01') end (date '2008-03-01') +every (interval '10 days')); + +drop table ggg cascade; + + +-- bad - legal if end of aa not inclusive +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01') inclusive, +partition bb start (date '2008-01-01') end (date '2009-01-01') +every (interval '10 days')); + +drop table ggg cascade; + +-- legal because start of bb not inclusive +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition aa start (date '2007-08-01') end (date '2008-01-01') inclusive, +partition bb start (date '2008-01-01') exclusive end (date '2008-03-01') +every (interval '10 days')); + +drop table ggg cascade; + +-- legal if end of aa not inclusive +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition bb start (date '2008-01-01') end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2008-01-01') +); + +drop table ggg cascade; + +-- bad - legal if end of aa not inclusive +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition bb start (date '2008-01-01') end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2008-01-01') inclusive +); + +drop table ggg cascade; + +-- legal because start of bb not inclusive +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition bb start (date '2008-01-01') exclusive end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2008-01-01') inclusive +); + +drop table ggg cascade; + +-- validate aa - start greater than end +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition bb start (date '2008-01-01') end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2006-01-01') +); + +drop table ggg cascade; + +-- formerly we could not set end of first partition because next is before +-- but we can sort them now so this is legal. +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition bb start (date '2008-01-01') , +partition aa start (date '2007-01-01') +); + +drop table ggg cascade; + +-- test cross type coercion +-- int -> char(N) +create table ggg (i int, a char(1)) + +partition by list(a) +(partition aa values(1, 2)); + +drop table ggg cascade; + +-- int -> numeric +create table ggg (i int, n numeric(20, 2)) + +partition by list(n) +(partition aa values(1.22, 4.1)); +drop table ggg cascade; + +-- EVERY + +-- the documentation example, rewritten with EVERY in a template +CREATE TABLE rank (id int, +rank int, year date, gender char(1)) + +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01') +end (date '2006-01-01') every (interval '1 year')) ( +partition boys values ('M'), +partition girls values ('F') +); + + +insert into rank values (1, 1, date '2001-01-15', 'M'); +insert into rank values (2, 1, date '2002-02-15', 'M'); +insert into rank values (3, 1, date '2003-03-15', 'M'); +insert into rank values (4, 1, date '2004-04-15', 'M'); +insert into rank values (5, 1, date '2005-05-15', 'M'); +insert into rank values (6, 1, date '2001-01-15', 'F'); +insert into rank values (7, 1, date '2002-02-15', 'F'); +insert into rank values (8, 1, date '2003-03-15', 'F'); +insert into rank values (9, 1, date '2004-04-15', 'F'); +insert into rank values (10, 1, date '2005-05-15', 'F'); + + +select * from rank order by 1, 2, 3, 4; +select * from rank_1_prt_boys order by 1, 2, 3, 4; +select * from rank_1_prt_girls order by 1, 2, 3, 4; +select * from rank_1_prt_girls_2_prt_1 order by 1, 2, 3, 4; +select * from rank_1_prt_girls_2_prt_2 order by 1, 2, 3, 4; + +drop table rank cascade; + +-- integer ranges work too +create table ggg (id integer, a integer) + +partition by range (a) +(start (1) end (10) every (1)); + +insert into ggg values (1, 1); +insert into ggg values (2, 2); +insert into ggg values (3, 3); +insert into ggg values (4, 4); +insert into ggg values (5, 5); +insert into ggg values (6, 6); +insert into ggg values (7, 7); +insert into ggg values (8, 8); +insert into ggg values (9, 9); +insert into ggg values (10, 10); + +select * from ggg order by 1, 2; + +select * from ggg_1_prt_1 order by 1, 2; +select * from ggg_1_prt_2 order by 1, 2; +select * from ggg_1_prt_3 order by 1, 2; +select * from ggg_1_prt_4 order by 1, 2; + +drop table ggg cascade; + +-- EVERY works by invoking the + operator. We haven't explictly documented +-- that user can create his own, but better still test it. +create domain funnytext as text; +create function funnytext_plus (funnytext, integer) returns funnytext +as $$ select (chr(ascii($1) + $2))::funnytext $$ language sql; + +create operator pg_catalog.+ (function=funnytext_plus, leftarg=funnytext, rightarg=integer); + +create table ggg (a char(1), t funnytext) + +partition by range (t) +( + start ('aaa') end ('foobar') every (1) +); +\d+ ggg + +drop table ggg cascade; + +-- What if the + operator returns NULL? +create or replace function funnytext_plus (funnytext, integer) returns funnytext +as $$ select NULL::funnytext $$ language sql; +create table ggg (a char(1), t funnytext) + +partition by range (t) +( + start ('aaa') end ('foobar') every (1) +); + +create table fff (a char(1), b char(2), d char(3)) +partition by list (b) (partition aa values ('2')); + +drop table fff cascade; + +create table ggg (a char(1), b numeric, d numeric) + +partition by range (b,d) +( +partition aa start (2007,1) end (2008,2), +partition bb start (2008,2) end (2009,3) +); + +drop table ggg cascade; + +create table ggg (a char(1), b date, d char(3)) + +partition by range (b) +( +partition bb start (date '2008-01-01') end (date '2009-01-01'), +partition aa start (date '2007-01-01') end (date '2006-01-01') +); + +drop table ggg cascade; + +-- append only tests +create table foz (i int, d date) with (appendonly = true) +partition by range (d) (start (date '2001-01-01') end (date '2005-01-01') +every(interval '1 year')); +insert into foz select i, '2001-01-01'::date + ('1 day'::interval * i) from +generate_series(1, 1000) i; +select count(*) from foz; +select count(*) from foz_1_prt_1; + +select min(d), max(d) from foz; +select min(d), max(d) from foz_1_prt_1; +select min(d), max(d) from foz_1_prt_2; +select min(d), max(d) from foz_1_prt_3; +select min(d), max(d) from foz_1_prt_4; + + +drop table foz cascade; + +-- copy test +create table foz (i int, d date) +partition by range (d) (start (date '2001-01-01') end (date '2005-01-01') +every(interval '1 year')); +COPY foz FROM stdin DELIMITER '|'; +1|2001-01-2 +2|2001-10-10 +3|2002-10-30 +4|2003-01-01 +5|2004-05-05 +\. +select * from foz_1_prt_1; +select * from foz_1_prt_2; +select * from foz_1_prt_3; +select * from foz_1_prt_4; + +-- Check behaviour of key for which there is no partition +COPY foz FROM stdin DELIMITER '|'; +6|2010-01-01 +\. +drop table foz cascade; +-- Same test with append only +create table foz (i int, d date) with (appendonly = true) +partition by range (d) (start (date '2001-01-01') end (date '2005-01-01') +every(interval '1 year')); +COPY foz FROM stdin DELIMITER '|'; +1|2001-01-2 +2|2001-10-10 +3|2002-10-30 +4|2003-01-01 +5|2004-05-05 +\. +select * from foz_1_prt_1; +select * from foz_1_prt_2; +select * from foz_1_prt_3; +select * from foz_1_prt_4; + +-- Check behaviour of key for which there is no partition +COPY foz FROM stdin DELIMITER '|'; +6|2010-01-01 +\. +drop table foz cascade; + + +-- complain if create table as select (CTAS) + +CREATE TABLE rank1 (id int, +rank int, year date, gender char(1)); + +create table rank2 as select * from rank1 + +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01') +end (date '2006-01-01') every (interval '1 year')) ( +partition boys values ('M'), +partition girls values ('F') +); + +-- like is ok + +create table rank2 (like rank1) + +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01') +end (date '2003-01-01') every (interval '1 year')) ( +partition boys values ('M'), +partition girls values ('F') +); + +drop table rank1 cascade; +drop table rank2 cascade; + + +-- alter table testing + +create table hhh (a char(1), b date, d char(3)) + +partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01') + with (appendonly=true), +partition bb start (date '2008-01-01') end (date '2009-01-01') + with (appendonly=false) +); + +-- already exists +alter table hhh add partition aa start ('2010-01-01') end ('2011-01-01'); + +-- no partition spec +alter table hhh add partition cc; + +-- overlaps +alter table hhh add partition cc start ('2008-01-01') end ('2010-01-01'); +alter table hhh add partition cc end ('2008-01-01'); + +-- reversed (start > end) +alter table hhh add partition cc start ('2010-01-01') end ('2009-01-01'); + +-- works +--alter table hhh add partition cc start ('2009-01-01') end ('2010-01-01'); +alter table hhh add partition cc end ('2010-01-01'); + +-- works - anonymous partition MPP-3350 +alter table hhh add partition end ('2010-02-01'); + +-- MPP-3607 - ADD PARTITION with open intervals +create table no_end1 (aa int, bb int) partition by range (bb) +(partition foo start(3)); + +-- fail overlap +alter table no_end1 add partition baz end (4); + +-- fail overlap (because prior partition has no end) +alter table no_end1 add partition baz start (5); + +-- ok (terminates on foo start) +alter table no_end1 add partition baz start (2); + +-- ok (because ends before baz start) +alter table no_end1 add partition baz2 end (1); + +create table no_start1 (aa int, bb int) partition by range (bb) +(partition foo end(3)); + +-- fail overlap (because next partition has no start) +alter table no_start1 add partition baz start (2); + +-- fail overlap (because next partition has no start) +alter table no_start1 add partition baz end (1); + +-- ok (starts on foo end) +alter table no_start1 add partition baz end (4); + +-- ok (because starts after baz end) +alter table no_start1 add partition baz2 start (5); + +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'no_start%' or relname like 'no_end%'; + +drop table no_end1; +drop table no_start1; + +-- default partitions cannot have boundary specifications +create table jjj (aa int, bb date) +partition by range(bb) +(partition j1 end (date '2008-01-01'), +partition j2 end (date '2009-01-01')); + +-- must have a name +alter table jjj add default partition; +alter table jjj add default partition for ('2008-01-01'); +-- cannot have boundary spec +alter table jjj add default partition j3 end (date '2010-01-01'); + +drop table jjj cascade; + +-- only one default partition +create table jjj (aa int, bb date) +partition by range(bb) +(partition j1 end (date '2008-01-01'), +partition j2 end (date '2009-01-01'), +default partition j3); + +alter table jjj add default partition j3 ; +alter table jjj add default partition j4 ; + +alter table jjj add partition j5 end (date '2010-01-01'); + +drop table jjj cascade; + +alter table hhh alter partition cc set tablespace foo_p; + +alter table hhh alter partition aa set tablespace foo_p; + +alter table hhh drop partition cc; + +alter table hhh drop partition cc cascade; + +alter table hhh drop partition cc restrict; + +alter table hhh drop partition if exists cc; + +-- fail (mpp-3265) +alter table hhh drop partition for ('2001-01-01'); + + +create table hhh_r1 (a char(1), b date, d char(3)) + +partition by range (b) +( +partition aa start (date '2007-01-01') end (date '2008-01-01') + every (interval '1 month') +); + +create table hhh_l1 (a char(1), b date, d char(3)) + +partition by list (b) +( +partition aa values ('2007-01-01'), +partition bb values ('2008-01-01'), +partition cc values ('2009-01-01') +); + +-- must have name or value for partition +alter table hhh_l1 drop partition; +alter table hhh_l1 drop partition aa; +alter table hhh_l1 drop partition for ('2008-01-01'); + +-- same with range partitioning +alter table hhh_r1 drop partition; +alter table hhh_r1 drop partition for ('2007-04-01'); +alter table hhh_r1 drop partition for ('2007-01-01'); +alter table hhh_r1 drop partition aa_2; +alter table hhh_r1 drop partition aa_3; +alter table hhh_r1 drop partition aa_5; +alter table hhh_r1 drop partition aa_6; + +-- more add partition tests + +-- start before first partition (fail because start equal end) +alter table hhh_r1 add partition zaa start ('2007-07-01'); +-- start before first partition (ok) +alter table hhh_r1 add partition zaa start ('2007-06-01'); +-- start > last (fail because start equal end) +alter table hhh_r1 add partition bb start ('2008-01-01') end ('2008-01-01') ; +-- start > last (ok) +alter table hhh_r1 add partition bb start ('2008-01-01') +end ('2008-02-01') inclusive; +-- start > last (fail because start == last end inclusive) +alter table hhh_r1 add partition cc start ('2008-02-01') end ('2008-03-01') ; +-- start > last (ok [and leave a gap]) +alter table hhh_r1 add partition cc start ('2008-04-01') end ('2008-05-01') ; +-- overlap (fail) +alter table hhh_r1 add partition dd start ('2008-01-01') end ('2008-05-01') ; +-- new partition in "gap" (ok) +alter table hhh_r1 add partition dd start ('2008-03-01') end ('2008-04-01') ; +-- overlap all partitions (fail) +alter table hhh_r1 add partition ee start ('2006-01-01') end ('2009-01-01') ; +-- start before first partition (fail because end in "gap" [and overlaps]) +alter table hhh_r1 add partition yaa start ('2007-05-01') end ('2007-07-01'); +-- start before first partition (fail ) +alter table hhh_r1 add partition yaa start ('2007-05-01') +end ('2007-10-01') inclusive; +-- start before first partition (fail because end overlaps) +alter table hhh_r1 add partition yaa start ('2007-05-01') +end ('2007-10-01') exclusive; + + +drop table hhh_r1 cascade; +drop table hhh_l1 cascade; + + +-- the documentation example, rewritten with EVERY in a template +-- and also with a default partition +CREATE TABLE rank (id int, +rank int, year date, gender char(1)) + +partition by list (gender) +subpartition by range (year) +subpartition template ( +start (date '2001-01-01') +end (date '2006-01-01') every (interval '1 year')) ( +partition boys values ('M'), +partition girls values ('F'), +default partition neuter +); + +insert into rank values (1, 1, date '2001-01-15', 'M'); +insert into rank values (2, 1, date '2002-02-15', 'M'); +insert into rank values (3, 1, date '2003-03-15', 'M'); +insert into rank values (4, 1, date '2004-04-15', 'M'); +insert into rank values (5, 1, date '2005-05-15', 'M'); +insert into rank values (6, 1, date '2001-01-15', 'F'); +insert into rank values (7, 1, date '2002-02-15', 'F'); +insert into rank values (8, 1, date '2003-03-15', 'F'); +insert into rank values (9, 1, date '2004-04-15', 'F'); +insert into rank values (10, 1, date '2005-05-15', 'F'); + + +select * from rank ; + +alter table rank DROP partition boys restrict; + +select * from rank ; + +-- MPP-3722: complain if for(value) matches the default partition +alter table rank truncate partition for('N'); +alter table rank DROP partition for('N'); +alter table rank DROP partition if exists for('N'); + +alter table rank DROP default partition if exists ; + +-- can't drop the final partition - must drop the table +alter table rank DROP partition girls; + +-- MPP-4011: make FOR(value) work +alter table rank alter partition for ('F') add default partition def1; +alter table rank alter partition for ('F') +truncate partition for ('2010-10-10'); +alter table rank truncate partition for ('F'); + +drop table rank cascade; + +alter table hhh exchange partition cc with table nosuchtable; +alter table hhh exchange partition aa with table nosuchtable; + +alter table hhh rename partition cc to aa; +alter table hhh rename partition bb to aa; +alter table hhh rename partition aa to aa; +alter table hhh rename partition aa to "funky fresh"; +alter table hhh rename partition "funky fresh" to aa; + +-- use FOR PARTITION VALUE (with implicate date conversion) +alter table hhh rename partition for ('2007-01-01') to "funky fresh"; +alter table hhh rename partition for ('2007-01-01') to aa; + + +alter table hhh set subpartition template (); + +alter table hhh split partition cc at ('a'); +alter table hhh split partition cc at ('a') into (partition gg, partition hh); +alter table hhh split partition aa at ('a'); + +alter table hhh truncate partition cc; + +alter table hhh truncate partition aa; + +insert into hhh values('a', date '2007-01-02', 'b'); +insert into hhh values('a', date '2007-02-01', 'b'); +insert into hhh values('a', date '2007-03-01', 'b'); +insert into hhh values('a', date '2007-04-01', 'b'); +insert into hhh values('a', date '2007-05-01', 'b'); +insert into hhh values('a', date '2007-06-01', 'b'); +insert into hhh values('a', date '2007-07-01', 'b'); +insert into hhh values('a', date '2007-08-01', 'b'); +insert into hhh values('a', date '2007-09-01', 'b'); +insert into hhh values('a', date '2007-10-01', 'b'); +insert into hhh values('a', date '2007-11-01', 'b'); +insert into hhh values('a', date '2007-12-01', 'b'); +insert into hhh values('a', date '2008-01-02', 'b'); +insert into hhh values('a', date '2008-02-01', 'b'); +insert into hhh values('a', date '2008-03-01', 'b'); +insert into hhh values('a', date '2008-04-01', 'b'); +insert into hhh values('a', date '2008-05-01', 'b'); +insert into hhh values('a', date '2008-06-01', 'b'); +insert into hhh values('a', date '2008-07-01', 'b'); +insert into hhh values('a', date '2008-08-01', 'b'); +insert into hhh values('a', date '2008-09-01', 'b'); +insert into hhh values('a', date '2008-10-01', 'b'); +insert into hhh values('a', date '2008-11-01', 'b'); +insert into hhh values('a', date '2008-12-01', 'b'); + +select * from hhh; + +alter table hhh truncate partition aa; + +select * from hhh; + +alter table hhh truncate partition bb; + +select * from hhh; + +insert into hhh values('a', date '2007-01-02', 'b'); +insert into hhh values('a', date '2007-02-01', 'b'); +insert into hhh values('a', date '2007-03-01', 'b'); +insert into hhh values('a', date '2007-04-01', 'b'); +insert into hhh values('a', date '2007-05-01', 'b'); +insert into hhh values('a', date '2007-06-01', 'b'); +insert into hhh values('a', date '2007-07-01', 'b'); +insert into hhh values('a', date '2007-08-01', 'b'); +insert into hhh values('a', date '2007-09-01', 'b'); +insert into hhh values('a', date '2007-10-01', 'b'); +insert into hhh values('a', date '2007-11-01', 'b'); +insert into hhh values('a', date '2007-12-01', 'b'); +insert into hhh values('a', date '2008-01-02', 'b'); +insert into hhh values('a', date '2008-02-01', 'b'); +insert into hhh values('a', date '2008-03-01', 'b'); +insert into hhh values('a', date '2008-04-01', 'b'); +insert into hhh values('a', date '2008-05-01', 'b'); +insert into hhh values('a', date '2008-06-01', 'b'); +insert into hhh values('a', date '2008-07-01', 'b'); +insert into hhh values('a', date '2008-08-01', 'b'); +insert into hhh values('a', date '2008-09-01', 'b'); +insert into hhh values('a', date '2008-10-01', 'b'); +insert into hhh values('a', date '2008-11-01', 'b'); +insert into hhh values('a', date '2008-12-01', 'b'); + +select * from hhh; + +-- truncate child partitions recursively +truncate table hhh; + +select * from hhh; + + +drop table hhh cascade; + +-- default partitions + +-- default partitions cannot have boundary specifications +create table jjj (aa int, bb date) +partition by range(bb) +(partition j1 end (date '2008-01-01'), +partition j2 end (date '2009-01-01'), +default partition j3 end (date '2010-01-01')); + +-- more than one default partition +create table jjj (aa int, bb date) +partition by range(bb) +(partition j1 end (date '2008-01-01'), +partition j2 end (date '2009-01-01'), +default partition j3, +default partition j4); + + +-- check default +create table foz (i int, d date) +partition by range (d) +( + default partition dsf, + partition foo start (date '2001-01-01') end (date '2005-01-01') + every(interval '1 year') +); +insert into foz values(1, '2003-04-01'); +insert into foz values(2, '2010-04-01'); +select * from foz; +select * from foz_1_prt_dsf; +drop table foz cascade; + +-- check for out of order partition definitions. We should order these correctly +-- and determine the appropriate boundaries. +create table d (i int, j int) partition by range(j) +( start (10), start(5), start(50) end(60)); +insert into d values(1, 5); +insert into d values(1, 10); +insert into d values(1, 11); +insert into d values(1, 55); +insert into d values(1, 70); +\d+ d +select * from d; +select * from d_1_prt_1; +select * from d_1_prt_2; +select * from d_1_prt_3; +drop table d cascade; + +-- check for NULL support +-- list +create table d (i int, j int) partition by list(j) +(partition a values(1, 2, NULL), + partition b values(3, 4) +); +insert into d values(1, 1); +insert into d values(1, 2); +insert into d values(1, NULL); +insert into d values(1, 3); +insert into d values(1, 4); +select * from d_1_prt_a; +select * from d_1_prt_b; +drop table d cascade; +--range +-- Reject NULL values +create table d (i int, j int) partition by range(j) +(partition a start (1) end(10), partition b start(11) end(20)); +insert into d values (1, 1); +insert into d values (1, 2); +insert into d values (1, NULL); +drop table d cascade; +-- allow NULLs into the default partition +create table d (i int, j int) partition by range(j) +(partition a start (1) end(10), partition b start(11) end(20), +default partition abc); +insert into d values (1, 1); +insert into d values (1, 2); +insert into d values (1, NULL); +select * from d_1_prt_abc; +alter table d split default partition start (21,1) end (30) into (partition c, default partition); +alter table d split default partition start (21) end (30,1) into (partition c, default partition); +drop table d cascade; + +-- multicolumn list support +create type d_partkey as (b int, c int); +create table d (a int, k d_partkey) +partition by list(k) +(partition a values(CAST('(1,2)' as d_partkey), CAST('(3,4)' as d_partkey)), + partition b values(CAST('(100,20)' as d_partkey)), + partition c values(CAST('(1000,1001)' as d_partkey), CAST('(1001,1002)' as d_partkey), CAST('(1003,1004)' as d_partkey))); +\d+ d +insert into d values(1, (1, 2)); +insert into d values(1, (3, 4)); +insert into d values(1, (100, 20)); +insert into d values(1, (100, 2000)); +insert into d values(1, ('1000', '1001')), (1, ('1001', '1002')), (1, ('1003', '1004')); +insert into d values(1, (100, NULL)); +select * from d_1_prt_a; +select * from d_1_prt_b; +select * from d_1_prt_c; +drop table d cascade; + +-- test multi value range partitioning +create table b (i int, j date) +partition by range (i, j) +(start(1, '2008-01-01') end (10, '2009-01-01'), + start(1, '2009-01-01') end(15, '2010-01-01'), + start(15, '2010-01-01') end (30, '2011-01-01'), + start(1, '2011-01-01') end (100, '2012-01-01') +); +-- should work +insert into b values(1, '2008-06-11'); +insert into b values(11, '2009-08-24'); +insert into b values(25, '2010-01-22'); +insert into b values(90, '2011-05-04'); +-- shouldn't work +insert into b values(1, '2019-01-01'); +insert into b values(91, '2008-05-05'); + +select * from b_1_prt_1; +select * from b_1_prt_2; +select * from b_1_prt_3; +select * from b_1_prt_4; +drop table b; + +-- try some different combinations +create table b (i int, n numeric(20, 2), t timestamp, s text) + +partition by range(n, t, s) +( +start(2000.99, '2007-01-01 00:00:00', 'AAA') + end (4000.95, '2007-02-02 15:00:00', 'BBB'), + +start(2000.99, '2007-01-01 00:00:00', 'BBB') + end (4000.95, '2007-02-02 16:00:00', 'CCC'), + +start(4000.95, '2007-01-01 00:00:00', 'AAA') + end (7000.95, '2007-02-02 15:00:00', 'BBB') +); + +-- should work +insert into b values(1, 2000.99, '2007-01-01 00:00:00', 'AAA'); +insert into b values(2, 2000.99, '2007-01-01 00:00:00', 'BBB'); +insert into b values(3, 4000.95, '2007-01-01 00:00:00', 'AAA'); +insert into b values(6, 3000, '2007-02-02 15:30:00', 'BBC'); +insert into b values(6, 3000, '2007-02-02 15:30:00', 'CC'); +insert into b values(6, 3000, '2007-02-02 16:00:00'::timestamp - + '1 second'::interval, 'BBZZZZZZZZZZ'); + +-- should fail +insert into b values(6, 3000, '2007-02-02 15:30:00', 'CCCCCCC'); +insert into b values(4, 5000, '2007-01-01 12:00:00', 'BCC'); +insert into b values(5, 8000, '2007-01-01 12:00:00', 'ZZZ'); +insert into b values(6, 3000, '2007-02-02 16:00:00', 'ABZZZZZZZZZZ'); +insert into b values(6, 1000, '2007-02-02 16:00:00', 'ABZZZZZZZZZZ'); +insert into b values(6, 3000, '2006-02-02 16:00:00', 'ABZZZZZZZZZZ'); +insert into b values(6, 3000, '2007-02-02 00:00:00', 'A'); + +-- NULL tests +insert into b default values; +insert into b values(6, 3000, '2007-01-01 12:00:00', NULL); +drop table b; + +-- MPP-3988: allow same column in multiple partitioning keys at +-- different levels -- so this is legal again... +drop table if exists a; + +-- TEST: make sure GPOPT (aka pivotal query optimizer) fall back to Postgres query optimizer +-- for queries with partition elimination over FULL OUTER JOIN +-- between partitioned tables. + +-- SETUP +-- start_ignore +drop table if exists s1; +drop table if exists s2; + +-- setup two partitioned tables s1 and s2 +create table s1 (d1 int, p1 int) + +partition by list (p1) +( + values (0), + values (1)); + +create table s2 (d2 int, p2 int) + +partition by list (p2) +( + values (0), + values (1)); +-- end_ignore + +-- VERIFY +-- expect GPOPT fall back to Postgres query optimizer +-- since GPOPT don't support partition elimination through full outer joins +select * from s1 full outer join s2 on s1.d1 = s2.d2 and s1.p1 = s2.p2 where s1.p1 = 1; + +-- CLEANUP +-- start_ignore +drop table if exists s1; +drop table if exists s2; +-- end_ignore + +-- the following case is to test when we have a template +-- we can correct add new subpartition with relation options. +create table test_part_relops_tmpl (id int, p1 text, p2 text, count int) + +partition by list (p1) +subpartition by list (p2) +( + partition m1 values ('m1') + (subpartition l1 values ('l1'), + subpartition l2 values ('l2')), + partition m2 values ('m2') + (subpartition l1 values ('l1'), + subpartition l2 values ('l2')) +); + +alter table test_part_relops_tmpl +set subpartition template +( + subpartition l1 values('l1') +); + +-- previously, we do wrong in the function of `add_partition_rule` +-- which invokes `transformRelOptions`, and transformRelOptions +-- may return NULL in some cases. For example, the invokation of +-- transformRelOptions in add_partition_rule set ignoreOids = true, +-- so the following statement creates such senario by passing oids options, +-- then transformRelOptions return NULL and we should correctly handle +-- null pointers. +alter table test_part_relops_tmpl alter partition for ('m1') add partition l3 values ('l3') +with (oids=false); + +create table mpp_2914A(id int, buyDate date, kind char(1)) + +partition by list (kind) +subpartition by range(buyDate) +subpartition template +( + start (date '2001-01-01'), + start (date '2002-01-01'), + start (date '2003-01-01'), + start (date '2004-01-01'), + start (date '2005-01-01') +) +( + partition auction values('a','A'), + partition buyItNow values('b', 'B'), + default partition catchall +); +select count(*) from mpp_2914A; + +\d mpp_2914a* + +create table mpp_2914B(id int, buyDate date, kind char(1)) + +partition by list (kind) +subpartition by range(buyDate) +( + partition auction values('a','A') + ( + subpartition y2001 start (date '2001-01-01'), + subpartition y2002 start (date '2002-01-01'), + subpartition y2003 start (date '2003-01-01'), + subpartition y2004 start (date '2004-01-01'), + subpartition y2005 start (date '2005-01-01') + ), + partition buyitnow values('b','B') + ( + subpartition y2001 start (date '2001-01-01'), + subpartition y2002 start (date '2002-01-01'), + subpartition y2003 start (date '2003-01-01'), + subpartition y2004 start (date '2004-01-01'), + subpartition y2005 start (date '2005-01-01') + ), + default partition catchAll + ( + subpartition y2001 start (date '2001-01-01'), + subpartition y2002 start (date '2002-01-01'), + subpartition y2003 start (date '2003-01-01'), + subpartition y2004 start (date '2004-01-01'), + subpartition y2005 start (date '2005-01-01') + ) +); +select count(*) from mpp_2914B; + +\d mpp_2914b* + +drop table mpp_2914a cascade; +drop table mpp_2914b cascade; + +create table mpp10847_pkeyconstraints( + pkid serial, + option1 int, + option2 int, + option3 int, + primary key(pkid, option3)) + partition by range (option3) +( +partition aa start(1) end(100) inclusive, +partition bb start(101) end(200) inclusive, +partition cc start(201) end (300) inclusive +); + +insert into mpp10847_pkeyconstraints values (10000, 50, 50, 102); +-- This is supposed to fail as you're not supposed to be able to use the same +-- primary key in the same table. But GPDB cannot currently enforce that. +insert into mpp10847_pkeyconstraints values (10000, 50, 50, 5); + +select * from mpp10847_pkeyconstraints; + +drop table mpp10847_pkeyconstraints; + + +-- Test that ADD/EXCHANGE/SPLIT PARTITION works, even when there are partial or expression +-- indexes on the table. (MPP-13750) +create table dcl_messaging_test +( + message_create_date timestamp(3) not null, + trace_socket varchar(1024) null, + trace_count varchar(1024) null, + variable_10 varchar(1024) null, + variable_11 varchar(1024) null, + variable_12 varchar(1024) null, + variable_13 varchar(1024) default('-1'), + variable_14 varchar(1024) null, + variable_15 varchar(1024) null, + variable_16 varchar(1024) null, + variable_17 varchar(1024) null, + variable_18 varchar(1024) null, + variable_19 varchar(1024) null, + variable_20 varchar(1024) null +) + +partition by range (message_create_date) +( + START (timestamp '2011-09-01') END (timestamp '2011-09-10') EVERY (interval '1 day'), + DEFAULT PARTITION outlying_dates +); +-- partial index +create index dcl_messaging_test_index13 on dcl_messaging_test(variable_13) where message_create_date > '2011-09-02'; +-- expression index +create index dcl_messaging_test_index16 on dcl_messaging_test(upper(variable_16)); +alter table dcl_messaging_test drop default partition; + +-- ADD case +alter table dcl_messaging_test add partition start (timestamp '2011-09-10') inclusive end (timestamp '2011-09-11') exclusive; + +-- EXCHANGE case +create table dcl_candidate(like dcl_messaging_test including indexes) with (appendonly=true); +insert into dcl_candidate(message_create_date) values (timestamp '2011-09-06'); +alter table dcl_messaging_test exchange partition for ('2011-09-06') with table dcl_candidate; + +-- SPLIT case +alter table dcl_messaging_test split partition for (timestamp '2011-09-06') at (timestamp '2011-09-06 12:00:00') into (partition x1, partition x2); + + +-- +-- Create table with 4 partitions +CREATE TABLE mpp13806 (id int, date date, amt decimal(10,2)) + +PARTITION BY RANGE (date) +( START (date '2008-01-01') INCLUSIVE + END (date '2008-01-05') EXCLUSIVE + EVERY (INTERVAL '1 day') ); + +-- Add unbound partition right before the start succeeds +alter table mpp13806 add partition test end (date '2008-01-01') exclusive; +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp13806%'; + +-- Drop the partition +alter TABLE mpp13806 drop partition test; + +-- Add unbound partition with a gap succeeds +alter table mpp13806 add partition test end (date '2007-12-31') exclusive; +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp13806%'; + +-- Fill the gap succeeds/adding immediately before the first partition succeeds +alter table mpp13806 add partition test1 start (date '2007-12-31') inclusive end (date '2008-01-01') exclusive; +select relname, pg_get_expr(relpartbound, oid) from pg_class where relname like 'mpp13806%'; + + +-- +-- Create two tables mpp14613_range (range partitioned) and +-- mpp14613_list (list partitioned) with 5 partitions (including default +-- partition) and 3 subpartitions (including default subpartition) each +create table mpp14613_list( + a int, + b int, + c int, + d int) + partition by range(b) + subpartition by list(c) + subpartition template + ( + default subpartition subothers, + subpartition s1 values(1,2,3), + subpartition s2 values(4,5,6) + ) + ( + default partition others, + start(1) end(5) every(1) + ); + +create table mpp14613_range( + a int, + b int, + c int, + d int + ) + partition by range(b) + subpartition by range(c) + subpartition template + ( + default subpartition subothers, + start (1) end(7) every (3) + ) + ( + default partition others, + start(1) end(5) every(1) + ); + +-- SPLIT partition +alter table mpp14613_list alter partition others split partition subothers at (10) into (partition b1, partition subothers); +alter table mpp14613_range alter partition others split partition subothers at (10) into (partition b1, partition subothers); + +-- ALTER TABLE ... ALTER PARTITION ... SPLIT DEFAULT PARTITION +create table foo( + a int, + b int, + c int, + d int) + partition by range(b) + subpartition by list(c) + subpartition template + ( + default subpartition subothers, + subpartition s1 values(1,2,3), + subpartition s2 values(4,5,6) + ) + ( + default partition others, + start(1) end(5) every(1) + ); + +alter table foo alter partition others split partition subothers at (10) into (partition b1, partition subothers); +alter table foo alter partition others split partition subothers at (10) into (partition b1, default partition); +alter table foo alter partition others split default partition at (10) into (partition b1, default partition); +drop table foo; + +-- +-- Drop index on a partitioned table. The indexes on the partitions are removed. +-- +create table pt_indx_tab (c1 integer, c2 int, c3 text) partition by range (c1) (partition A start (integer '0') end (integer '5') every (integer '1')); + +create unique index pt_indx_drop on pt_indx_tab(c1); + +select count(*) from pg_index where indrelid='pt_indx_tab'::regclass; +select count(*) from pg_index where indrelid='pt_indx_tab_1_prt_a_1'::regclass; + +drop index pt_indx_drop; + +select count(*) from pg_index where indrelid='pt_indx_tab'::regclass; +select count(*) from pg_index where indrelid='pt_indx_tab_1_prt_a_1'::regclass; + +-- +-- Test changing the datatype of a column in a partitioning key column. +-- (Not supported, throws an error). +-- +create table mpp18179 (a int, b int, i int) + +partition by list (b) + ( PARTITION ab1 VALUES (1), + PARTITION ab2 values (2), + default partition other + ); + +alter table mpp18179 alter column b type varchar(20); + + +-- +-- Drop index on partitioned table, and recreate it. +-- +CREATE TABLE mpp7635_aoi_table2 (id INTEGER) + PARTITION BY RANGE (id) + (START (0) END (200000) EVERY (100000)) +; +INSERT INTO mpp7635_aoi_table2(id) VALUES (0); + +-- Create index +CREATE INDEX mpp7635_ix3 ON mpp7635_aoi_table2 USING BITMAP (id); +select * from pg_indexes where tablename like 'mpp7635%'; + +-- Drop it +DROP INDEX mpp7635_ix3; +select * from pg_indexes where tablename like 'mpp7635%'; + +-- Create it again. +CREATE INDEX mpp7635_ix3 ON mpp7635_aoi_table2 (id); +select * from pg_indexes where tablename like 'mpp7635%'; + + +-- +-- Test handling of NULL values in SPLIT PARTITION. +-- +CREATE TABLE mpp7863 (id int, dat char(8)) + +PARTITION BY RANGE (dat) +( PARTITION Oct09 START (200910) INCLUSIVE END (200911) EXCLUSIVE , +PARTITION Nov09 START (200911) INCLUSIVE END (200912) EXCLUSIVE , +PARTITION Dec09 START (200912) INCLUSIVE END (201001) EXCLUSIVE , +DEFAULT PARTITION extra); + +insert into mpp7863 values(generate_series(1, 100),'200910'); +insert into mpp7863 values(generate_series(101, 200),'200911'); +insert into mpp7863 values(generate_series(201, 300),'200912'); +insert into mpp7863 values(generate_series(301, 30300),''); +insert into mpp7863 (id) values(generate_series(30301, 60300)); +insert into mpp7863 values(generate_series(60301, 60400),'201001'); + +select count(*) from mpp7863_1_prt_extra; +select count(*) from mpp7863_1_prt_extra where dat is null; +select count(*) from mpp7863_1_prt_extra where dat =''; +select count(*) from mpp7863; + +alter table mpp7863 split default partition start (201001) inclusive end (201002) exclusive into (partition jan10,default partition); +select count(*) from mpp7863_1_prt_extra where dat is null; +select count(*) from mpp7863_1_prt_extra where dat =''; +select count(*) from mpp7863_1_prt_extra; + +select dat, count(*) from mpp7863 group by 1 order by 2,1; + + +-- +-- Test handling of dropped columns in SPLIT PARTITION. (PR #9386) +-- +DROP TABLE IF EXISTS users_test; + +CREATE TABLE users_test +( + id INT, + dd TEXT, + user_name VARCHAR(40), + user_email VARCHAR(60), + born_time TIMESTAMP, + create_time TIMESTAMP +) + +PARTITION BY RANGE (create_time) +( + PARTITION p2019 START ('2019-01-01'::TIMESTAMP) END ('2020-01-01'::TIMESTAMP), + DEFAULT PARTITION extra +); + +-- Drop useless column dd for some reason +ALTER TABLE users_test DROP COLUMN dd; + +-- Assume we forgot/failed to split out new partitions beforehand +INSERT INTO users_test VALUES(1, 'A', 'A@abc.com', '1970-01-01', '2019-01-01 12:00:00'); +INSERT INTO users_test VALUES(2, 'B', 'B@abc.com', '1980-01-01', '2020-01-01 12:00:00'); +INSERT INTO users_test VALUES(3, 'C', 'C@abc.com', '1990-01-01', '2021-01-01 12:00:00'); + +-- New partition arrives late +ALTER TABLE users_test SPLIT DEFAULT PARTITION START ('2020-01-01'::TIMESTAMP) END ('2021-01-01'::TIMESTAMP) + INTO (PARTITION p2020, DEFAULT PARTITION); + +-- Expect A +SELECT user_name FROM users_test_1_prt_p2019; +-- Expect B +SELECT user_name FROM users_test_1_prt_p2020; +-- Expect C +SELECT user_name FROM users_test_1_prt_extra; + +-- Github issue: https://github.com/greenplum-db/gpdb/issues/9460 +-- When creating unique or primary key index on Partition table, +-- the cols in index must contain all partition keys. +CREATE TABLE t_idx_col_contain_partkey(a int, b int) +PARTITION BY list (b) +(PARTITION t1 values (1), + PARTITION t2 values (2)); + +-- the following statement should fail because index cols does not contain part key +CREATE UNIQUE INDEX uidx_t_idx_col_contain_partkey on t_idx_col_contain_partkey(a); +-- the following statement should work +CREATE UNIQUE INDEX uidx_t_idx_col_contain_partkey on t_idx_col_contain_partkey(a, b); +DROP INDEX uidx_t_idx_col_contain_partkey; +DROP TABLE t_idx_col_contain_partkey; + +-- test unique index for multi level partition table +CREATE TABLE t_idx_col_contain_partkey +( + r_regionkey integer not null, + r_name char(25), + r_comment varchar(152) +) + +PARTITION BY RANGE (r_regionkey) +SUBPARTITION BY LIST (r_name) SUBPARTITION TEMPLATE +( + SUBPARTITION africa VALUES ('AFRICA'), + SUBPARTITION america VALUES ('AMERICA'), + SUBPARTITION asia VALUES ('ASIA'), + SUBPARTITION europe VALUES ('EUROPE'), + SUBPARTITION mideast VALUES ('MIDDLE EAST'), + SUBPARTITION australia VALUES ('AUSTRALIA'), + SUBPARTITION antarctica VALUES ('ANTARCTICA') +) +( + PARTITION region1 start (0), + PARTITION region2 start (3), + PARTITION region3 start (5) end (8) +); + +-- should fail, must contain all the partition keys of all levels +CREATE UNIQUE INDEX uidx_t_idx_col_contain_partkey on t_idx_col_contain_partkey(r_regionkey); +-- should work +CREATE UNIQUE INDEX uidx_t_idx_col_contain_partkey on t_idx_col_contain_partkey(r_regionkey, r_name); +DROP INDEX uidx_t_idx_col_contain_partkey; +DROP TABLE t_idx_col_contain_partkey; + +-- +-- Test EXCHANGE PARTITION, when the new table has different CHECK constraints +-- +CREATE TABLE constraint_mismatch_tbl ( + id int, + date date, + amt decimal(10,2) + CONSTRAINT amt_check CHECK (amt > 0) +) +PARTITION BY RANGE (date) + (PARTITION Jan08 START (date '2008-01-01'), + PARTITION Feb08 START (date '2008-02-01'), + PARTITION Mar08 START (date '2008-03-01') END (date '2008-04-01')); + +-- fail: new table doesn't have 'amt_check' constraint +CREATE TABLE mismatch_exchange_tbl ( + id int, + date date, + amt decimal(10,2) +); +INSERT INTO mismatch_exchange_tbl SELECT i, '2008-03-02', i FROM generate_series(11,15)i; + +ALTER TABLE constraint_mismatch_tbl EXCHANGE PARTITION mar08 WITH TABLE mismatch_exchange_tbl; + +-- fail: new table has a constraint called 'amt_check', but it's different from the parent's +DROP TABLE mismatch_exchange_tbl; +CREATE TABLE mismatch_exchange_tbl ( + id int, + date date, + amt decimal(10,2) + CONSTRAINT amt_check CHECK (amt <> 0) +); +INSERT INTO mismatch_exchange_tbl SELECT i, '2008-03-02', i FROM generate_series(11,15)i; + +ALTER TABLE constraint_mismatch_tbl EXCHANGE PARTITION mar08 WITH TABLE mismatch_exchange_tbl; + +-- success: new table has compatible 'amt_check' constraint +DROP TABLE mismatch_exchange_tbl; +CREATE TABLE mismatch_exchange_tbl ( + id int, + date date, + amt decimal(10,2) + CONSTRAINT amt_check CHECK (amt > 0) +); +INSERT INTO mismatch_exchange_tbl SELECT i, '2008-03-02', i FROM generate_series(11,15)i; + +ALTER TABLE constraint_mismatch_tbl EXCHANGE PARTITION mar08 WITH TABLE mismatch_exchange_tbl; + + +-- +-- END INCLUSIVE should work for CREATE, ADD PARTITION, and SPLIT PARTITION for +-- the following data types. The INCLUSIVE END value will be converted to an +-- EXCLUSIVE upper bound during transformation. If the INCLUSIVE END value is +-- smaller than the maximum value of the data type, the exclusive upper bound +-- will be the END INCLUSIVE value + '1', where '1' is the resolution of the +-- data type. Otherwise, MAXVALUE will be stored as the upper bound. +-- +-- END INCLUSIVE should work for bigint +CREATE TABLE end_inclusive_bigint (a int, b bigint) + + PARTITION BY RANGE (b) + ( + PARTITION pmax_create START (9223372036854775805) END (9223372036854775807) INCLUSIVE EVERY (1), + PARTITION p1 START (1) END (3) INCLUSIVE, + PARTITION p20 START (20), + DEFAULT PARTITION other + ); +ALTER TABLE end_inclusive_bigint SPLIT DEFAULT PARTITION START (7) END (10) INCLUSIVE INTO (PARTITION p7, DEFAULT PARTITION); +\d+ end_inclusive_bigint + +ALTER TABLE end_inclusive_bigint DROP PARTITION pmax_create_1; +ALTER TABLE end_inclusive_bigint DROP PARTITION pmax_create_2; +ALTER TABLE end_inclusive_bigint ADD PARTITION pmax_add START (9223372036854775805) END (9223372036854775807) INCLUSIVE; +\d+ end_inclusive_bigint + +ALTER TABLE end_inclusive_bigint DROP PARTITION pmax_add; +ALTER TABLE end_inclusive_bigint SPLIT DEFAULT PARTITION START (9223372036854775805) END (9223372036854775807) INCLUSIVE INTO (PARTITION pmax_split, DEFAULT PARTITION); +\d+ end_inclusive_bigint + +-- END INCLUSIVE should work for int +CREATE TABLE end_inclusive_int (a int, b int) + + PARTITION BY RANGE (b) + ( + PARTITION p1 END (3) INCLUSIVE, + PARTITION pmax END (2147483647) INCLUSIVE + ); +\d+ end_inclusive_int + +-- END INCLUSIVE should work for smallint +CREATE TABLE end_inclusive_smallint (a int, b smallint) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (1) END (3) INCLUSIVE, + PARTITION pmax START (4) END (32767) INCLUSIVE + ); +\d+ end_inclusive_smallint + +-- END INCLUSIVE should work for date +CREATE TABLE end_inclusive_date (a int, b date) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('2020-06-16') END ('2020-06-17') INCLUSIVE, + PARTITION pmax START ('2020-06-18') END ('infinity') INCLUSIVE + ); +\d+ end_inclusive_date + +-- END INCLUSIVE should work for time without time zone +CREATE TABLE end_inclusive_time (a int, b time) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('00:00:00.000001') END ('01:00:00') INCLUSIVE, + PARTITION pmax START ('23:00:00') END ('24:00:00') INCLUSIVE + ); +\d+ end_inclusive_time + +-- END INCLUSIVE should work for time with time zone +CREATE TABLE end_inclusive_timetz (a int, b time with time zone) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('00:00:00 EST') END ('01:00:00 PST') INCLUSIVE, + PARTITION pmax START ('23:00:00 EST') END ('24:00:00 PST') INCLUSIVE + ); +\d+ end_inclusive_timetz + +-- END INCLUSIVE should work for timestamp without time zone +CREATE TABLE end_inclusive_timestamp (a int, b timestamp) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('2020-06-16 00:00:00') END ('2020-06-16 01:00:00') INCLUSIVE, + PARTITION pmax START ('2020-06-16 23:00:00') END ('infinity') INCLUSIVE + ); +\d+ end_inclusive_timestamp + +-- END INCLUSIVE should work for timestamp with time zone +CREATE TABLE end_inclusive_timestamptz (a int, b timestamp with time zone) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('2020-06-16 00:00:00 PST') END ('2020-06-16 01:00:00 PST') INCLUSIVE, + PARTITION pmax START ('2020-06-16 23:00:00 EST') END ('infinity') INCLUSIVE + ); +\d+ end_inclusive_timestamptz + +-- END INCLUSIVE should work for interval +CREATE TABLE end_inclusive_interval (a int, b interval) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('1 year') END ('2 years') INCLUSIVE + ); +\d+ end_inclusive_interval + +-- END INCLUSIVE with MAXVALUE should work with implicit START/END +DROP TABLE end_inclusive_int; +CREATE TABLE end_inclusive_int (a int, b int) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (1), + PARTITION pmax END (2147483647) INCLUSIVE, + PARTITION p2 START (2) END (5) INCLUSIVE + ); +\d+ end_inclusive_int + +DROP TABLE end_inclusive_int; +CREATE TABLE end_inclusive_int (a int, b int) + + PARTITION BY RANGE (b) + ( + PARTITION pmax END (2147483647) INCLUSIVE, + PARTITION p1 START (1), + PARTITION p2 START (2) END (5) INCLUSIVE + ); +\d+ end_inclusive_int + +-- END INCLUSIVE should fail when precision is specified +CREATE TABLE end_inclusive_time_with_precision (a int, b time(5)) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START ('00:00:00') END ('01:00:00') INCLUSIVE + ); + +-- END INCLUSIVE should fail for unsupported data types +CREATE TABLE end_inclusive_numeric (a int, b numeric) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (1) END (3) INCLUSIVE + ); + +-- Also check START EXCLUSIVE +CREATE TABLE start_exclusive_smallint (a int, b smallint) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (0) EXCLUSIVE END (3) INCLUSIVE, + PARTITION pmax START (4) EXCLUSIVE + ); +\d+ start_exclusive_smallint + +-- If the START EXCLUSIVE value + 1 would overflow, you get an error +CREATE TABLE start_exclusive_smallint_overflow (a int, b smallint) + + PARTITION BY RANGE (b) + ( + PARTITION p1 START (0) EXCLUSIVE END (3) INCLUSIVE, + PARTITION pmax START (32767) EXCLUSIVE + ); + +-- Test for ALTER TABLE WITH/WITHOUT VALIDATION. +-- It doesn't do anything anymore, but check that the syntax is accepted. +CREATE TABLE validation_syntax_tbl (a int) + + PARTITION BY RANGE (a) + ( + PARTITION p1 START (1) END (3) + ); +CREATE TABLE exchange_tbl (a int4); +INSERT INTO exchange_tbl VALUES (100); +ALTER TABLE validation_syntax_tbl EXCHANGE PARTITION p1 WITH TABLE exchange_tbl WITH VALIDATION; +ALTER TABLE validation_syntax_tbl EXCHANGE PARTITION p1 WITH TABLE exchange_tbl WITHOUT VALIDATION; +DROP TABLE exchange_tbl; +DROP TABLE validation_syntax_tbl; + + +-- +-- Test a case where the automatically created partition name clashes with +-- another table or partition. +-- Before GPDB 7, the automatic table name generation used check if the name is +-- in use, and pick another name to avoid the clash. It's not as smart anymore. +-- It's more tricky now, because e.g. the ALTER TABLE ALTER/DROP/ADD PARTITION +-- commands rely on the deterministic naming of the partitions. If a user runs +-- into this, the work around is to use different table/partition names, or +-- use the upstream syntax and name each partition explicitly. +-- +CREATE TABLE partitioned_table_with_very_long_name_123456789x +( + col1 int4, + col2 int4 +) + +PARTITION BY RANGE(col2) + (partition partone start(1) end(100000001), + partition parttwo start(100000001) end(200000001), + partition partthree start(200000001) end(300000001)); + +CREATE TABLE partitioned_table_with_very_long_name_123456789y +( + col1 int4, + col2 int4 +) + +PARTITION BY RANGE(col2) + (partition partone start(1) end(100000001), + partition parttwo start(100000001) end(200000001), + partition partthree start(200000001) end(300000001)); diff --git a/src/test/singlenode_regress/sql/partition_aggregate.sql b/src/test/singlenode_regress/sql/partition_aggregate.sql new file mode 100644 index 00000000000..c17294b15b0 --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_aggregate.sql @@ -0,0 +1,333 @@ +-- +-- PARTITION_AGGREGATE +-- Test partitionwise aggregation on partitioned tables +-- +-- Note: to ensure plan stability, it's a good idea to make the partitions of +-- any one partitioned table in this test all have different numbers of rows. +-- + +-- Enable partitionwise aggregate, which by default is disabled. +SET enable_partitionwise_aggregate TO true; +-- Enable partitionwise join, which by default is disabled. +SET enable_partitionwise_join TO true; +-- Disable parallel plans. +SET max_parallel_workers_per_gather TO 0; +-- Disable incremental sort, which can influence selected plans due to fuzz factor. +SET enable_incremental_sort TO off; + +-- +-- Tests for list partitioned tables. +-- +CREATE TABLE pagg_tab (a int, b int, c text, d int) PARTITION BY LIST(c); +CREATE TABLE pagg_tab_p1 PARTITION OF pagg_tab FOR VALUES IN ('0000', '0001', '0002', '0003', '0004'); +CREATE TABLE pagg_tab_p2 PARTITION OF pagg_tab FOR VALUES IN ('0005', '0006', '0007', '0008'); +CREATE TABLE pagg_tab_p3 PARTITION OF pagg_tab FOR VALUES IN ('0009', '0010', '0011'); +INSERT INTO pagg_tab SELECT i % 20, i % 30, to_char(i % 12, 'FM0000'), i % 30 FROM generate_series(0, 2999) i; +ANALYZE pagg_tab; + +-- When GROUP BY clause matches; full aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT c, sum(a), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY c HAVING avg(d) < 15 ORDER BY 1, 2, 3; +SELECT c, sum(a), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY c HAVING avg(d) < 15 ORDER BY 1, 2, 3; + +-- When GROUP BY clause does not match; partial aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY a HAVING avg(d) < 15 ORDER BY 1, 2, 3; +SELECT a, sum(b), avg(b), count(*), min(a), max(b) FROM pagg_tab GROUP BY a HAVING avg(d) < 15 ORDER BY 1, 2, 3; + +-- Check with multiple columns in GROUP BY +EXPLAIN (COSTS OFF) +SELECT a, c, count(*) FROM pagg_tab GROUP BY a, c; +-- Check with multiple columns in GROUP BY, order in GROUP BY is reversed +EXPLAIN (COSTS OFF) +SELECT a, c, count(*) FROM pagg_tab GROUP BY c, a; +-- Check with multiple columns in GROUP BY, order in target-list is reversed +EXPLAIN (COSTS OFF) +SELECT c, a, count(*) FROM pagg_tab GROUP BY a, c; + +-- Test when input relation for grouping is dummy +EXPLAIN (COSTS OFF) +SELECT c, sum(a) FROM pagg_tab WHERE 1 = 2 GROUP BY c; +SELECT c, sum(a) FROM pagg_tab WHERE 1 = 2 GROUP BY c; +EXPLAIN (COSTS OFF) +SELECT c, sum(a) FROM pagg_tab WHERE c = 'x' GROUP BY c; +SELECT c, sum(a) FROM pagg_tab WHERE c = 'x' GROUP BY c; + +-- Test GroupAggregate paths by disabling hash aggregates. +SET enable_hashagg TO false; + +-- When GROUP BY clause matches full aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT c, sum(a), avg(b), count(*) FROM pagg_tab GROUP BY 1 HAVING avg(d) < 15 ORDER BY 1, 2, 3; +SELECT c, sum(a), avg(b), count(*) FROM pagg_tab GROUP BY 1 HAVING avg(d) < 15 ORDER BY 1, 2, 3; + +-- When GROUP BY clause does not match; partial aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), avg(b), count(*) FROM pagg_tab GROUP BY 1 HAVING avg(d) < 15 ORDER BY 1, 2, 3; +SELECT a, sum(b), avg(b), count(*) FROM pagg_tab GROUP BY 1 HAVING avg(d) < 15 ORDER BY 1, 2, 3; + +-- Test partitionwise grouping without any aggregates +EXPLAIN (COSTS OFF) +SELECT c FROM pagg_tab GROUP BY c ORDER BY 1; +SELECT c FROM pagg_tab GROUP BY c ORDER BY 1; +EXPLAIN (COSTS OFF) +SELECT a FROM pagg_tab WHERE a < 3 GROUP BY a ORDER BY 1; +SELECT a FROM pagg_tab WHERE a < 3 GROUP BY a ORDER BY 1; + +RESET enable_hashagg; + +-- ROLLUP, partitionwise aggregation does not apply +EXPLAIN (COSTS OFF) +SELECT c, sum(a) FROM pagg_tab GROUP BY rollup(c) ORDER BY 1, 2; + +-- ORDERED SET within the aggregate. +-- Full aggregation; since all the rows that belong to the same group come +-- from the same partition, having an ORDER BY within the aggregate doesn't +-- make any difference. +EXPLAIN (COSTS OFF) +SELECT c, sum(b order by a) FROM pagg_tab GROUP BY c ORDER BY 1, 2; +-- Since GROUP BY clause does not match with PARTITION KEY; we need to do +-- partial aggregation. However, ORDERED SET are not partial safe and thus +-- partitionwise aggregation plan is not generated. +EXPLAIN (COSTS OFF) +SELECT a, sum(b order by a) FROM pagg_tab GROUP BY a ORDER BY 1, 2; + + +-- JOIN query + +CREATE TABLE pagg_tab1(x int, y int) PARTITION BY RANGE(x); +CREATE TABLE pagg_tab1_p1 PARTITION OF pagg_tab1 FOR VALUES FROM (0) TO (10); +CREATE TABLE pagg_tab1_p2 PARTITION OF pagg_tab1 FOR VALUES FROM (10) TO (20); +CREATE TABLE pagg_tab1_p3 PARTITION OF pagg_tab1 FOR VALUES FROM (20) TO (30); + +CREATE TABLE pagg_tab2(x int, y int) PARTITION BY RANGE(y); +CREATE TABLE pagg_tab2_p1 PARTITION OF pagg_tab2 FOR VALUES FROM (0) TO (10); +CREATE TABLE pagg_tab2_p2 PARTITION OF pagg_tab2 FOR VALUES FROM (10) TO (20); +CREATE TABLE pagg_tab2_p3 PARTITION OF pagg_tab2 FOR VALUES FROM (20) TO (30); + +INSERT INTO pagg_tab1 SELECT i % 30, i % 20 FROM generate_series(0, 299, 2) i; +INSERT INTO pagg_tab2 SELECT i % 20, i % 30 FROM generate_series(0, 299, 3) i; + +ANALYZE pagg_tab1; +ANALYZE pagg_tab2; + +-- When GROUP BY clause matches; full aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT t1.x, sum(t1.y), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.x ORDER BY 1, 2, 3; +SELECT t1.x, sum(t1.y), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.x ORDER BY 1, 2, 3; + +-- Check with whole-row reference; partitionwise aggregation does not apply +EXPLAIN (COSTS OFF) +SELECT t1.x, sum(t1.y), count(t1) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.x ORDER BY 1, 2, 3; +SELECT t1.x, sum(t1.y), count(t1) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.x ORDER BY 1, 2, 3; + +-- GROUP BY having other matching key +EXPLAIN (COSTS OFF) +SELECT t2.y, sum(t1.y), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t2.y ORDER BY 1, 2, 3; + +-- When GROUP BY clause does not match; partial aggregation is performed for each partition. +-- Also test GroupAggregate paths by disabling hash aggregates. +SET enable_hashagg TO false; +EXPLAIN (COSTS OFF) +SELECT t1.y, sum(t1.x), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.y HAVING avg(t1.x) > 10 ORDER BY 1, 2, 3; +SELECT t1.y, sum(t1.x), count(*) FROM pagg_tab1 t1, pagg_tab2 t2 WHERE t1.x = t2.y GROUP BY t1.y HAVING avg(t1.x) > 10 ORDER BY 1, 2, 3; +RESET enable_hashagg; + +-- Check with LEFT/RIGHT/FULL OUTER JOINs which produces NULL values for +-- aggregation + +-- LEFT JOIN, should produce partial partitionwise aggregation plan as +-- GROUP BY is on nullable column +EXPLAIN (COSTS OFF) +SELECT b.y, sum(a.y) FROM pagg_tab1 a LEFT JOIN pagg_tab2 b ON a.x = b.y GROUP BY b.y ORDER BY 1 NULLS LAST; +SELECT b.y, sum(a.y) FROM pagg_tab1 a LEFT JOIN pagg_tab2 b ON a.x = b.y GROUP BY b.y ORDER BY 1 NULLS LAST; + +-- RIGHT JOIN, should produce full partitionwise aggregation plan as +-- GROUP BY is on non-nullable column +EXPLAIN (COSTS OFF) +SELECT b.y, sum(a.y) FROM pagg_tab1 a RIGHT JOIN pagg_tab2 b ON a.x = b.y GROUP BY b.y ORDER BY 1 NULLS LAST; +SELECT b.y, sum(a.y) FROM pagg_tab1 a RIGHT JOIN pagg_tab2 b ON a.x = b.y GROUP BY b.y ORDER BY 1 NULLS LAST; + +-- FULL JOIN, should produce partial partitionwise aggregation plan as +-- GROUP BY is on nullable column +EXPLAIN (COSTS OFF) +SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x ORDER BY 1 NULLS LAST; +SELECT a.x, sum(b.x) FROM pagg_tab1 a FULL OUTER JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x ORDER BY 1 NULLS LAST; + +-- LEFT JOIN, with dummy relation on right side, ideally +-- should produce full partitionwise aggregation plan as GROUP BY is on +-- non-nullable columns. +-- But right now we are unable to do partitionwise join in this case. +EXPLAIN (COSTS OFF) +SELECT a.x, b.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x < 20) a LEFT JOIN (SELECT * FROM pagg_tab2 WHERE y > 10) b ON a.x = b.y WHERE a.x > 5 or b.y < 20 GROUP BY a.x, b.y ORDER BY 1, 2; +SELECT a.x, b.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x < 20) a LEFT JOIN (SELECT * FROM pagg_tab2 WHERE y > 10) b ON a.x = b.y WHERE a.x > 5 or b.y < 20 GROUP BY a.x, b.y ORDER BY 1, 2; + +-- FULL JOIN, with dummy relations on both sides, ideally +-- should produce partial partitionwise aggregation plan as GROUP BY is on +-- nullable columns. +-- But right now we are unable to do partitionwise join in this case. +EXPLAIN (COSTS OFF) +SELECT a.x, b.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x < 20) a FULL JOIN (SELECT * FROM pagg_tab2 WHERE y > 10) b ON a.x = b.y WHERE a.x > 5 or b.y < 20 GROUP BY a.x, b.y ORDER BY 1, 2; +SELECT a.x, b.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x < 20) a FULL JOIN (SELECT * FROM pagg_tab2 WHERE y > 10) b ON a.x = b.y WHERE a.x > 5 or b.y < 20 GROUP BY a.x, b.y ORDER BY 1, 2; + +-- Empty join relation because of empty outer side, no partitionwise agg plan +EXPLAIN (COSTS OFF) +SELECT a.x, a.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x = 1 AND x = 2) a LEFT JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x, a.y ORDER BY 1, 2; +SELECT a.x, a.y, count(*) FROM (SELECT * FROM pagg_tab1 WHERE x = 1 AND x = 2) a LEFT JOIN pagg_tab2 b ON a.x = b.y GROUP BY a.x, a.y ORDER BY 1, 2; + + +-- Partition by multiple columns + +CREATE TABLE pagg_tab_m (a int, b int, c int) PARTITION BY RANGE(a, ((a+b)/2)); +CREATE TABLE pagg_tab_m_p1 PARTITION OF pagg_tab_m FOR VALUES FROM (0, 0) TO (12, 12); +CREATE TABLE pagg_tab_m_p2 PARTITION OF pagg_tab_m FOR VALUES FROM (12, 12) TO (22, 22); +CREATE TABLE pagg_tab_m_p3 PARTITION OF pagg_tab_m FOR VALUES FROM (22, 22) TO (30, 30); +INSERT INTO pagg_tab_m SELECT i % 30, i % 40, i % 50 FROM generate_series(0, 2999) i; +ANALYZE pagg_tab_m; + +-- Partial aggregation as GROUP BY clause does not match with PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT a, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY a HAVING avg(c) < 22 ORDER BY 1, 2, 3; +SELECT a, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY a HAVING avg(c) < 22 ORDER BY 1, 2, 3; + +-- Full aggregation as GROUP BY clause matches with PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT a, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY a, (a+b)/2 HAVING sum(b) < 50 ORDER BY 1, 2, 3; +SELECT a, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY a, (a+b)/2 HAVING sum(b) < 50 ORDER BY 1, 2, 3; + +-- Full aggregation as PARTITION KEY is part of GROUP BY clause +EXPLAIN (COSTS OFF) +SELECT a, c, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY (a+b)/2, 2, 1 HAVING sum(b) = 50 AND avg(c) > 25 ORDER BY 1, 2, 3; +SELECT a, c, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY (a+b)/2, 2, 1 HAVING sum(b) = 50 AND avg(c) > 25 ORDER BY 1, 2, 3; + + +-- Test with multi-level partitioning scheme + +CREATE TABLE pagg_tab_ml (a int, b int, c text) PARTITION BY RANGE(a); +CREATE TABLE pagg_tab_ml_p1 PARTITION OF pagg_tab_ml FOR VALUES FROM (0) TO (12); +CREATE TABLE pagg_tab_ml_p2 PARTITION OF pagg_tab_ml FOR VALUES FROM (12) TO (20) PARTITION BY LIST (c); +CREATE TABLE pagg_tab_ml_p2_s1 PARTITION OF pagg_tab_ml_p2 FOR VALUES IN ('0000', '0001', '0002'); +CREATE TABLE pagg_tab_ml_p2_s2 PARTITION OF pagg_tab_ml_p2 FOR VALUES IN ('0003'); + +-- This level of partitioning has different column positions than the parent +CREATE TABLE pagg_tab_ml_p3(b int, c text, a int) PARTITION BY RANGE (b); +CREATE TABLE pagg_tab_ml_p3_s1(c text, a int, b int); +CREATE TABLE pagg_tab_ml_p3_s2 PARTITION OF pagg_tab_ml_p3 FOR VALUES FROM (7) TO (10); + +ALTER TABLE pagg_tab_ml_p3 ATTACH PARTITION pagg_tab_ml_p3_s1 FOR VALUES FROM (0) TO (7); +ALTER TABLE pagg_tab_ml ATTACH PARTITION pagg_tab_ml_p3 FOR VALUES FROM (20) TO (30); + +INSERT INTO pagg_tab_ml SELECT i % 30, i % 10, to_char(i % 4, 'FM0000') FROM generate_series(0, 29999) i; +ANALYZE pagg_tab_ml; + +-- For Parallel Append +SET max_parallel_workers_per_gather TO 2; + +-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY +-- for level 1 only. For subpartitions, GROUP BY clause does not match with +-- PARTITION KEY, but still we do not see a partial aggregation as array_agg() +-- is not partial agg safe. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; +SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + +-- Without ORDER BY clause, to test Gather at top-most path +EXPLAIN (COSTS OFF) +SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3; + +-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY +-- for level 1 only. For subpartitions, GROUP BY clause does not match with +-- PARTITION KEY, thus we will have a partial aggregation for them. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + +-- Partial aggregation at all levels as GROUP BY clause does not match with +-- PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3; +SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3; + +-- Full aggregation at all levels as GROUP BY clause matches with PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3; +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3; + +-- Parallelism within partitionwise aggregates + +SET min_parallel_table_scan_size TO '8kB'; +SET parallel_setup_cost TO 0; + +-- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY +-- for level 1 only. For subpartitions, GROUP BY clause does not match with +-- PARTITION KEY, thus we will have a partial aggregation for them. +EXPLAIN (COSTS OFF) +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; + +-- Partial aggregation at all levels as GROUP BY clause does not match with +-- PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b ORDER BY 1, 2, 3; +SELECT b, sum(a), count(*) FROM pagg_tab_ml GROUP BY b HAVING avg(a) < 15 ORDER BY 1, 2, 3; + +-- Full aggregation at all levels as GROUP BY clause matches with PARTITION KEY +EXPLAIN (COSTS OFF) +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3; +SELECT a, sum(b), count(*) FROM pagg_tab_ml GROUP BY a, b, c HAVING avg(b) > 7 ORDER BY 1, 2, 3; + + +-- Parallelism within partitionwise aggregates (single level) + +-- Add few parallel setup cost, so that we will see a plan which gathers +-- partially created paths even for full aggregation and sticks a single Gather +-- followed by finalization step. +-- Without this, the cost of doing partial aggregation + Gather + finalization +-- for each partition and then Append over it turns out to be same and this +-- wins as we add it first. This parallel_setup_cost plays a vital role in +-- costing such plans. +SET parallel_setup_cost TO 10; + +CREATE TABLE pagg_tab_para(x int, y int) PARTITION BY RANGE(x); +CREATE TABLE pagg_tab_para_p1 PARTITION OF pagg_tab_para FOR VALUES FROM (0) TO (12); +CREATE TABLE pagg_tab_para_p2 PARTITION OF pagg_tab_para FOR VALUES FROM (12) TO (22); +CREATE TABLE pagg_tab_para_p3 PARTITION OF pagg_tab_para FOR VALUES FROM (22) TO (30); + +INSERT INTO pagg_tab_para SELECT i % 30, i % 20 FROM generate_series(0, 29999) i; + +ANALYZE pagg_tab_para; + +-- When GROUP BY clause matches; full aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; +SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + +-- When GROUP BY clause does not match; partial aggregation is performed for each partition. +EXPLAIN (COSTS OFF) +SELECT y, sum(x), avg(x), count(*) FROM pagg_tab_para GROUP BY y HAVING avg(x) < 12 ORDER BY 1, 2, 3; +SELECT y, sum(x), avg(x), count(*) FROM pagg_tab_para GROUP BY y HAVING avg(x) < 12 ORDER BY 1, 2, 3; + +-- Test when parent can produce parallel paths but not any (or some) of its children +-- (Use one more aggregate to tilt the cost estimates for the plan we want) +ALTER TABLE pagg_tab_para_p1 SET (parallel_workers = 0); +ALTER TABLE pagg_tab_para_p3 SET (parallel_workers = 0); +ANALYZE pagg_tab_para; + +EXPLAIN (COSTS OFF) +SELECT x, sum(y), avg(y), sum(x+y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; +SELECT x, sum(y), avg(y), sum(x+y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + +ALTER TABLE pagg_tab_para_p2 SET (parallel_workers = 0); +ANALYZE pagg_tab_para; + +EXPLAIN (COSTS OFF) +SELECT x, sum(y), avg(y), sum(x+y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; +SELECT x, sum(y), avg(y), sum(x+y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; + +-- Reset parallelism parameters to get partitionwise aggregation plan. +RESET min_parallel_table_scan_size; +RESET parallel_setup_cost; + +EXPLAIN (COSTS OFF) +SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; +SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < 7 ORDER BY 1, 2, 3; diff --git a/src/test/singlenode_regress/sql/partition_indexing.sql b/src/test/singlenode_regress/sql/partition_indexing.sql new file mode 100644 index 00000000000..5dfc0ac4ebd --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_indexing.sql @@ -0,0 +1,433 @@ +-- start_matchsubs +-- m/NOTICE: One or more columns in the following table\(s\) do not have statistics: / +-- s/.//gs +-- m/HINT: For non-partitioned tables, run analyze .+\. For partitioned tables, run analyze rootpartition .+\. See log for columns missing statistics\./ +-- s/.//gs +-- end_matchsubs +-- partition_list_index.sql + +-- Test partition with CREATE INDEX +DROP TABLE if exists mpp3033a; +DROP TABLE if exists mpp3033b; + +CREATE TABLE mpp3033a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by list (unique1) ( +partition aa values (1,2,3,4,5,6,7,8,9,10), +partition bb values (11,12,13,14,15,16,17,18,19,20), +default partition default_part +); + +CREATE TABLE mpp3033b ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by list (unique1) +subpartition by list (unique2) +( +partition aa values (1,2,3,4,5,6,7,8,9,10) (subpartition cc values (1,2,3), subpartition dd values (4,5,6) ), +partition bb values (11,12,13,14,15,16,17,18,19,20) (subpartition cc values (1,2,3), subpartition dd values (4,5,6) ) +); +alter table mpp3033b add default partition default_part; + +\copy mpp3033a from 'data/onek.data'; +\copy mpp3033b from 'data/onek.data'; + +CREATE INDEX mpp3033a_unique1 ON mpp3033a USING btree(unique1 int4_ops); +CREATE INDEX mpp3033a_unique2 ON mpp3033a USING btree(unique2 int4_ops); +CREATE INDEX mpp3033a_hundred ON mpp3033a USING btree(hundred int4_ops); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a USING btree(stringu1 name_ops); + +CREATE INDEX mpp3033b_unique1 ON mpp3033b USING btree(unique1 int4_ops); +CREATE INDEX mpp3033b_unique2 ON mpp3033b USING btree(unique2 int4_ops); +CREATE INDEX mpp3033b_hundred ON mpp3033b USING btree(hundred int4_ops); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b USING btree(stringu1 name_ops); + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; + +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; + +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; + + +CREATE INDEX mpp3033a_unique1 ON mpp3033a (unique1); +CREATE INDEX mpp3033a_unique2 ON mpp3033a (unique2); +CREATE INDEX mpp3033a_hundred ON mpp3033a (hundred); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a (stringu1); + +CREATE INDEX mpp3033b_unique1 ON mpp3033b (unique1); +CREATE INDEX mpp3033b_unique2 ON mpp3033b (unique2); +CREATE INDEX mpp3033b_hundred ON mpp3033b (hundred); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b (stringu1); + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; + +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; + +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; + +CREATE UNIQUE INDEX mpp3033a_unique1 ON mpp3033a (unique1); +CREATE UNIQUE INDEX mpp3033a_unique2 ON mpp3033a (unique2); +CREATE UNIQUE INDEX mpp3033a_hundred ON mpp3033a (hundred); +CREATE UNIQUE INDEX mpp3033a_stringu1 ON mpp3033a (stringu1); + +CREATE UNIQUE INDEX mpp3033b_unique1 ON mpp3033b (unique1); +CREATE UNIQUE INDEX mpp3033b_unique2 ON mpp3033b (unique2); +CREATE UNIQUE INDEX mpp3033b_hundred ON mpp3033b (hundred); +CREATE UNIQUE INDEX mpp3033b_stringu1 ON mpp3033b (stringu1); + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; + +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; + +select count(*) from mpp3033b; + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; + +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; + +CREATE INDEX mpp3033a_unique1 ON mpp3033a USING bitmap (unique1); +CREATE INDEX mpp3033a_unique2 ON mpp3033a USING bitmap (unique2); +CREATE INDEX mpp3033a_hundred ON mpp3033a USING bitmap (hundred); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a USING bitmap (stringu1); + +CREATE INDEX mpp3033b_unique1 ON mpp3033b USING bitmap (unique1); +CREATE INDEX mpp3033b_unique2 ON mpp3033b USING bitmap (unique2); +CREATE INDEX mpp3033b_hundred ON mpp3033b USING bitmap (hundred); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b USING bitmap (stringu1); + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; + +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +-- partition_range_index.sql +-- Test partition with CREATE INDEX +DROP TABLE if exists mpp3033a; +DROP TABLE if exists mpp3033b; + +CREATE TABLE mpp3033a ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +( partition aa start (0) end (1000) every (100), default partition default_part ); + +CREATE TABLE mpp3033b ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +) partition by range (unique1) +subpartition by range (unique2) subpartition template ( start (0) end (1000) every (500) ) +( start (0) end (1000) every (200)); +alter table mpp3033b add default partition default_part; + +\copy mpp3033a from 'data/onek.data'; +\copy mpp3033b from 'data/onek.data'; + +drop index if exists mpp3033a_unique1; +drop index if exists mpp3033a_unique2; +drop index if exists mpp3033a_hundred; +drop index if exists mpp3033a_stringu1; + +drop index if exists mpp3033b_unique1; +drop index if exists mpp3033b_unique2; +drop index if exists mpp3033b_hundred; +drop index if exists mpp3033b_stringu1; + +CREATE INDEX mpp3033a_unique1 ON mpp3033a USING btree(unique1 int4_ops); +CREATE INDEX mpp3033a_unique2 ON mpp3033a USING btree(unique2 int4_ops); +CREATE INDEX mpp3033a_hundred ON mpp3033a USING btree(hundred int4_ops); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a USING btree(stringu1 name_ops); + +CREATE INDEX mpp3033b_unique1 ON mpp3033b USING btree(unique1 int4_ops); +CREATE INDEX mpp3033b_unique2 ON mpp3033b USING btree(unique2 int4_ops); +CREATE INDEX mpp3033b_hundred ON mpp3033b USING btree(hundred int4_ops); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b USING btree(stringu1 name_ops); + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; + +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; + +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; + + +CREATE INDEX mpp3033a_unique1 ON mpp3033a (unique1); +CREATE INDEX mpp3033a_unique2 ON mpp3033a (unique2); +CREATE INDEX mpp3033a_hundred ON mpp3033a (hundred); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a (stringu1); + +CREATE INDEX mpp3033b_unique1 ON mpp3033b (unique1); +CREATE INDEX mpp3033b_unique2 ON mpp3033b (unique2); +CREATE INDEX mpp3033b_hundred ON mpp3033b (hundred); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b (stringu1); + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; + +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; + +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; + +CREATE UNIQUE INDEX mpp3033a_unique1 ON mpp3033a (unique1); +CREATE UNIQUE INDEX mpp3033a_unique2 ON mpp3033a (unique2); +CREATE UNIQUE INDEX mpp3033a_hundred ON mpp3033a (hundred); +CREATE UNIQUE INDEX mpp3033a_stringu1 ON mpp3033a (stringu1); + +CREATE UNIQUE INDEX mpp3033b_unique1 ON mpp3033b (unique1); +CREATE UNIQUE INDEX mpp3033b_unique2 ON mpp3033b (unique2); +CREATE UNIQUE INDEX mpp3033b_hundred ON mpp3033b (hundred); +CREATE UNIQUE INDEX mpp3033b_stringu1 ON mpp3033b (stringu1); + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; + +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +drop index mpp3033a_unique1; +drop index mpp3033a_unique2; +drop index mpp3033a_hundred; +drop index mpp3033a_stringu1; + +drop index mpp3033b_unique1; +drop index mpp3033b_unique2; +drop index mpp3033b_hundred; +drop index mpp3033b_stringu1; + +CREATE INDEX mpp3033a_unique1 ON mpp3033a USING bitmap (unique1); +CREATE INDEX mpp3033a_unique2 ON mpp3033a USING bitmap (unique2); +CREATE INDEX mpp3033a_hundred ON mpp3033a USING bitmap (hundred); +CREATE INDEX mpp3033a_stringu1 ON mpp3033a USING bitmap (stringu1); + +CREATE INDEX mpp3033b_unique1 ON mpp3033b USING bitmap (unique1); +CREATE INDEX mpp3033b_unique2 ON mpp3033b USING bitmap (unique2); +CREATE INDEX mpp3033b_hundred ON mpp3033b USING bitmap (hundred); +CREATE INDEX mpp3033b_stringu1 ON mpp3033b USING bitmap (stringu1); + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +reindex index mpp3033a_unique1; +reindex index mpp3033a_unique2; +reindex index mpp3033a_hundred; +reindex index mpp3033a_stringu1; + +reindex index mpp3033b_unique1; +reindex index mpp3033b_unique2; +reindex index mpp3033b_hundred; +reindex index mpp3033b_stringu1; + + +select count(*) from mpp3033a; +select count(*) from mpp3033b; + +create table mpp6379(a int, b date, primary key (a,b)) partition by range (b) (partition p1 end ('2009-01-02'::date)); +insert into mpp6379( a, b ) values( 1, '20090101' ); +insert into mpp6379( a, b ) values( 1, '20090101' ); +alter table mpp6379 add partition p2 end(date '2009-01-03'); +insert into mpp6379( a, b ) values( 2, '20090102' ); +insert into mpp6379( a, b ) values( 2, '20090102' ); +drop table mpp6379; + +-- Creating an index on a partitioned table makes the partitions +-- automatically get the index +create table gpidxpart (a int, b int, c text) +partition by range (a) +subpartition by range(b) +subpartition template + (start(1) end (3)) +(start (1) end (3)); + +-- relhassubclass of a partitioned index is false before creating any partition. +-- It will be set after the first partition is created. +create index gpidxpart_idx on gpidxpart (a); +select relhassubclass from pg_class where relname = 'gpidxpart_idx'; +drop index gpidxpart_idx; + +-- Even with partitions, relhassubclass should not be set if a partitioned +-- index is created only on the parent. +create index gpidxpart_idx on only gpidxpart(a); +select relhassubclass from pg_class where relname = 'gpidxpart_idx'; +drop index gpidxpart_idx; diff --git a/src/test/singlenode_regress/sql/partition_info.sql b/src/test/singlenode_regress/sql/partition_info.sql new file mode 100644 index 00000000000..b5060bec7f0 --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_info.sql @@ -0,0 +1,129 @@ +-- +-- Tests for functions providing information about partitions +-- +SELECT * FROM pg_partition_tree(NULL); +SELECT * FROM pg_partition_tree(0); +SELECT * FROM pg_partition_ancestors(NULL); +SELECT * FROM pg_partition_ancestors(0); +SELECT pg_partition_root(NULL); +SELECT pg_partition_root(0); + +-- Test table partition trees +CREATE TABLE ptif_test (a int, b int) PARTITION BY range (a); +CREATE TABLE ptif_test0 PARTITION OF ptif_test + FOR VALUES FROM (minvalue) TO (0) PARTITION BY list (b); +CREATE TABLE ptif_test01 PARTITION OF ptif_test0 FOR VALUES IN (1); +CREATE TABLE ptif_test1 PARTITION OF ptif_test + FOR VALUES FROM (0) TO (100) PARTITION BY list (b); +CREATE TABLE ptif_test11 PARTITION OF ptif_test1 FOR VALUES IN (1); +CREATE TABLE ptif_test2 PARTITION OF ptif_test + FOR VALUES FROM (100) TO (200); +-- This partitioned table should remain with no partitions. +CREATE TABLE ptif_test3 PARTITION OF ptif_test + FOR VALUES FROM (200) TO (maxvalue) PARTITION BY list (b); + +-- Test pg_partition_root for tables +SELECT pg_partition_root('ptif_test'); +SELECT pg_partition_root('ptif_test0'); +SELECT pg_partition_root('ptif_test01'); +SELECT pg_partition_root('ptif_test3'); + +-- Test index partition tree +CREATE INDEX ptif_test_index ON ONLY ptif_test (a); +CREATE INDEX ptif_test0_index ON ONLY ptif_test0 (a); +ALTER INDEX ptif_test_index ATTACH PARTITION ptif_test0_index; +CREATE INDEX ptif_test01_index ON ptif_test01 (a); +ALTER INDEX ptif_test0_index ATTACH PARTITION ptif_test01_index; +CREATE INDEX ptif_test1_index ON ONLY ptif_test1 (a); +ALTER INDEX ptif_test_index ATTACH PARTITION ptif_test1_index; +CREATE INDEX ptif_test11_index ON ptif_test11 (a); +ALTER INDEX ptif_test1_index ATTACH PARTITION ptif_test11_index; +CREATE INDEX ptif_test2_index ON ptif_test2 (a); +ALTER INDEX ptif_test_index ATTACH PARTITION ptif_test2_index; +CREATE INDEX ptif_test3_index ON ptif_test3 (a); +ALTER INDEX ptif_test_index ATTACH PARTITION ptif_test3_index; + +-- Test pg_partition_root for indexes +SELECT pg_partition_root('ptif_test_index'); +SELECT pg_partition_root('ptif_test0_index'); +SELECT pg_partition_root('ptif_test01_index'); +SELECT pg_partition_root('ptif_test3_index'); + +-- List all tables members of the tree +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test'); +-- List tables from an intermediate level +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test0') p + JOIN pg_class c ON (p.relid = c.oid); +-- List from leaf table +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test01') p + JOIN pg_class c ON (p.relid = c.oid); +-- List from partitioned table with no partitions +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test3') p + JOIN pg_class c ON (p.relid = c.oid); +-- List all ancestors of root and leaf tables +SELECT * FROM pg_partition_ancestors('ptif_test01'); +SELECT * FROM pg_partition_ancestors('ptif_test'); +-- List all members using pg_partition_root with leaf table reference +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree(pg_partition_root('ptif_test01')) p + JOIN pg_class c ON (p.relid = c.oid); + +-- List all indexes members of the tree +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test_index'); +-- List indexes from an intermediate level +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test0_index') p + JOIN pg_class c ON (p.relid = c.oid); +-- List from leaf index +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test01_index') p + JOIN pg_class c ON (p.relid = c.oid); +-- List from partitioned index with no partitions +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_test3_index') p + JOIN pg_class c ON (p.relid = c.oid); +-- List all members using pg_partition_root with leaf index reference +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree(pg_partition_root('ptif_test01_index')) p + JOIN pg_class c ON (p.relid = c.oid); +-- List all ancestors of root and leaf indexes +SELECT * FROM pg_partition_ancestors('ptif_test01_index'); +SELECT * FROM pg_partition_ancestors('ptif_test_index'); + +DROP TABLE ptif_test; + +-- Table that is not part of any partition tree is not listed. +CREATE TABLE ptif_normal_table(a int); +SELECT relid, parentrelid, level, isleaf + FROM pg_partition_tree('ptif_normal_table'); +SELECT * FROM pg_partition_ancestors('ptif_normal_table'); +SELECT pg_partition_root('ptif_normal_table'); +DROP TABLE ptif_normal_table; + +-- Various partitioning-related functions return empty/NULL if passed relations +-- of types that cannot be part of a partition tree; for example, views, +-- materialized views, legacy inheritance children or parents, etc. +CREATE VIEW ptif_test_view AS SELECT 1; +CREATE MATERIALIZED VIEW ptif_test_matview AS SELECT 1; +CREATE TABLE ptif_li_parent (); +CREATE TABLE ptif_li_child () INHERITS (ptif_li_parent); +SELECT * FROM pg_partition_tree('ptif_test_view'); +SELECT * FROM pg_partition_tree('ptif_test_matview'); +SELECT * FROM pg_partition_tree('ptif_li_parent'); +SELECT * FROM pg_partition_tree('ptif_li_child'); +SELECT * FROM pg_partition_ancestors('ptif_test_view'); +SELECT * FROM pg_partition_ancestors('ptif_test_matview'); +SELECT * FROM pg_partition_ancestors('ptif_li_parent'); +SELECT * FROM pg_partition_ancestors('ptif_li_child'); +SELECT pg_partition_root('ptif_test_view'); +SELECT pg_partition_root('ptif_test_matview'); +SELECT pg_partition_root('ptif_li_parent'); +SELECT pg_partition_root('ptif_li_child'); +DROP VIEW ptif_test_view; +DROP MATERIALIZED VIEW ptif_test_matview; +DROP TABLE ptif_li_parent, ptif_li_child; diff --git a/src/test/singlenode_regress/sql/partition_join.sql b/src/test/singlenode_regress/sql/partition_join.sql new file mode 100644 index 00000000000..d97b5b69ffc --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_join.sql @@ -0,0 +1,1144 @@ +-- +-- PARTITION_JOIN +-- Test partitionwise join between partitioned tables +-- + +-- Enable partitionwise join, which by default is disabled. +SET enable_partitionwise_join to true; + +-- +-- partitioned by a single column +-- +CREATE TABLE prt1 (a int, b int, c varchar) PARTITION BY RANGE(a); +CREATE TABLE prt1_p1 PARTITION OF prt1 FOR VALUES FROM (0) TO (250); +CREATE TABLE prt1_p3 PARTITION OF prt1 FOR VALUES FROM (500) TO (600); +CREATE TABLE prt1_p2 PARTITION OF prt1 FOR VALUES FROM (250) TO (500); +INSERT INTO prt1 SELECT i, i % 25, to_char(i, 'FM0000') FROM generate_series(0, 599) i WHERE i % 2 = 0; +CREATE INDEX iprt1_p1_a on prt1_p1(a); +CREATE INDEX iprt1_p2_a on prt1_p2(a); +CREATE INDEX iprt1_p3_a on prt1_p3(a); +ANALYZE prt1; + +CREATE TABLE prt2 (a int, b int, c varchar) PARTITION BY RANGE(b); +CREATE TABLE prt2_p1 PARTITION OF prt2 FOR VALUES FROM (0) TO (250); +CREATE TABLE prt2_p2 PARTITION OF prt2 FOR VALUES FROM (250) TO (500); +CREATE TABLE prt2_p3 PARTITION OF prt2 FOR VALUES FROM (500) TO (600); +INSERT INTO prt2 SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(0, 599) i WHERE i % 3 = 0; +CREATE INDEX iprt2_p1_b on prt2_p1(b); +CREATE INDEX iprt2_p2_b on prt2_p2(b); +CREATE INDEX iprt2_p3_b on prt2_p3(b); +ANALYZE prt2; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; + +-- left outer join, with whole-row reference; partitionwise join does not apply +EXPLAIN (COSTS OFF) +SELECT t1, t2 FROM prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1, t2 FROM prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- right outer join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b; + +-- full outer join, with placeholder vars +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 50 phv, * FROM prt1 WHERE prt1.b = 0) t1 FULL JOIN (SELECT 75 phv, * FROM prt2 WHERE prt2.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 50 phv, * FROM prt1 WHERE prt1.b = 0) t1 FULL JOIN (SELECT 75 phv, * FROM prt2 WHERE prt2.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + +-- Join with pruned partitions from joining relations +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.a < 450 AND t2.b > 250 AND t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.a < 450 AND t2.b > 250 AND t1.b = 0 ORDER BY t1.a, t2.b; + +-- Currently we can't do partitioned join if nullable-side partitions are pruned +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a < 450) t1 LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a < 450) t1 LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- Currently we can't do partitioned join if nullable-side partitions are pruned +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a < 450) t1 FULL JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 OR t2.a = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a < 450) t1 FULL JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 OR t2.a = 0 ORDER BY t1.a, t2.b; + +-- Semi-join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t2.b FROM prt2 t2 WHERE t2.a = 0) AND t1.b = 0 ORDER BY t1.a; +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t2.b FROM prt2 t2 WHERE t2.a = 0) AND t1.b = 0 ORDER BY t1.a; + +-- Anti-join with aggregates +EXPLAIN (COSTS OFF) +SELECT sum(t1.a), avg(t1.a), sum(t1.b), avg(t1.b) FROM prt1 t1 WHERE NOT EXISTS (SELECT 1 FROM prt2 t2 WHERE t1.a = t2.b); +SELECT sum(t1.a), avg(t1.a), sum(t1.b), avg(t1.b) FROM prt1 t1 WHERE NOT EXISTS (SELECT 1 FROM prt2 t2 WHERE t1.a = t2.b); + +-- lateral reference +EXPLAIN (COSTS OFF) +SELECT * FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t3.a AS t3a, least(t1.a,t2.a,t3.b) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss + ON t1.a = ss.t2a WHERE t1.b = 0 ORDER BY t1.a; +SELECT * FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t3.a AS t3a, least(t1.a,t2.a,t3.b) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss + ON t1.a = ss.t2a WHERE t1.b = 0 ORDER BY t1.a; + +EXPLAIN (COSTS OFF) +SELECT t1.a, ss.t2a, ss.t2c FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t3.a AS t3a, t2.b t2b, t2.c t2c, least(t1.a,t2.a,t3.b) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss + ON t1.c = ss.t2c WHERE (t1.b + coalesce(ss.t2b, 0)) = 0 ORDER BY t1.a; +SELECT t1.a, ss.t2a, ss.t2c FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t3.a AS t3a, t2.b t2b, t2.c t2c, least(t1.a,t2.a,t3.a) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss + ON t1.c = ss.t2c WHERE (t1.b + coalesce(ss.t2b, 0)) = 0 ORDER BY t1.a; + +-- bug with inadequate sort key representation +SET enable_partitionwise_aggregate TO true; +SET enable_hashjoin TO false; + +EXPLAIN (COSTS OFF) +SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) + WHERE a BETWEEN 490 AND 510 + GROUP BY 1, 2 ORDER BY 1, 2; +SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) + WHERE a BETWEEN 490 AND 510 + GROUP BY 1, 2 ORDER BY 1, 2; + +RESET enable_partitionwise_aggregate; +RESET enable_hashjoin; + +-- +-- partitioned by expression +-- +CREATE TABLE prt1_e (a int, b int, c int) PARTITION BY RANGE(((a + b)/2)); +CREATE TABLE prt1_e_p1 PARTITION OF prt1_e FOR VALUES FROM (0) TO (250); +CREATE TABLE prt1_e_p2 PARTITION OF prt1_e FOR VALUES FROM (250) TO (500); +CREATE TABLE prt1_e_p3 PARTITION OF prt1_e FOR VALUES FROM (500) TO (600); +INSERT INTO prt1_e SELECT i, i, i % 25 FROM generate_series(0, 599, 2) i; +CREATE INDEX iprt1_e_p1_ab2 on prt1_e_p1(((a+b)/2)); +CREATE INDEX iprt1_e_p2_ab2 on prt1_e_p2(((a+b)/2)); +CREATE INDEX iprt1_e_p3_ab2 on prt1_e_p3(((a+b)/2)); +ANALYZE prt1_e; + +CREATE TABLE prt2_e (a int, b int, c int) PARTITION BY RANGE(((b + a)/2)); +CREATE TABLE prt2_e_p1 PARTITION OF prt2_e FOR VALUES FROM (0) TO (250); +CREATE TABLE prt2_e_p2 PARTITION OF prt2_e FOR VALUES FROM (250) TO (500); +CREATE TABLE prt2_e_p3 PARTITION OF prt2_e FOR VALUES FROM (500) TO (600); +INSERT INTO prt2_e SELECT i, i, i % 25 FROM generate_series(0, 599, 3) i; +ANALYZE prt2_e; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_e t1, prt2_e t2 WHERE (t1.a + t1.b)/2 = (t2.b + t2.a)/2 AND t1.c = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_e t1, prt2_e t2 WHERE (t1.a + t1.b)/2 = (t2.b + t2.a)/2 AND t1.c = 0 ORDER BY t1.a, t2.b; + +-- +-- N-way join +-- +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM prt1 t1, prt2 t2, prt1_e t3 WHERE t1.a = t2.b AND t1.a = (t3.a + t3.b)/2 AND t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM prt1 t1, prt2 t2, prt1_e t3 WHERE t1.a = t2.b AND t1.a = (t3.a + t3.b)/2 AND t1.b = 0 ORDER BY t1.a, t2.b; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) LEFT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t1.b = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) LEFT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t1.b = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) RIGHT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t3.c = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) RIGHT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t3.c = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + +-- +-- 3-way full join +-- +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) + WHERE a BETWEEN 490 AND 510; +SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) + WHERE a BETWEEN 490 AND 510; + +-- +-- 4-way full join +-- +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) FULL JOIN prt1 p4 (a,b,c) USING (a, b) + WHERE a BETWEEN 490 AND 510; +SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) FULL JOIN prt1 p4 (a,b,c) USING (a, b) + WHERE a BETWEEN 490 AND 510; + +-- Cases with non-nullable expressions in subquery results; +-- make sure these go to null as expected +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.phv, t2.b, t2.phv, t3.a + t3.b, t3.phv FROM ((SELECT 50 phv, * FROM prt1 WHERE prt1.b = 0) t1 FULL JOIN (SELECT 75 phv, * FROM prt2 WHERE prt2.a = 0) t2 ON (t1.a = t2.b)) FULL JOIN (SELECT 50 phv, * FROM prt1_e WHERE prt1_e.c = 0) t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t1.a = t1.phv OR t2.b = t2.phv OR (t3.a + t3.b)/2 = t3.phv ORDER BY t1.a, t2.b, t3.a + t3.b; +SELECT t1.a, t1.phv, t2.b, t2.phv, t3.a + t3.b, t3.phv FROM ((SELECT 50 phv, * FROM prt1 WHERE prt1.b = 0) t1 FULL JOIN (SELECT 75 phv, * FROM prt2 WHERE prt2.a = 0) t2 ON (t1.a = t2.b)) FULL JOIN (SELECT 50 phv, * FROM prt1_e WHERE prt1_e.c = 0) t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t1.a = t1.phv OR t2.b = t2.phv OR (t3.a + t3.b)/2 = t3.phv ORDER BY t1.a, t2.b, t3.a + t3.b; + +-- Semi-join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1, prt1_e t2 WHERE t1.a = 0 AND t1.b = (t2.a + t2.b)/2) AND t1.b = 0 ORDER BY t1.a; +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1, prt1_e t2 WHERE t1.a = 0 AND t1.b = (t2.a + t2.b)/2) AND t1.b = 0 ORDER BY t1.a; + +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1 WHERE t1.b IN (SELECT (t1.a + t1.b)/2 FROM prt1_e t1 WHERE t1.c = 0)) AND t1.b = 0 ORDER BY t1.a; +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1 WHERE t1.b IN (SELECT (t1.a + t1.b)/2 FROM prt1_e t1 WHERE t1.c = 0)) AND t1.b = 0 ORDER BY t1.a; + +-- test merge joins +SET enable_hashjoin TO off; +SET enable_nestloop TO off; + +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1 WHERE t1.b IN (SELECT (t1.a + t1.b)/2 FROM prt1_e t1 WHERE t1.c = 0)) AND t1.b = 0 ORDER BY t1.a; +SELECT t1.* FROM prt1 t1 WHERE t1.a IN (SELECT t1.b FROM prt2 t1 WHERE t1.b IN (SELECT (t1.a + t1.b)/2 FROM prt1_e t1 WHERE t1.c = 0)) AND t1.b = 0 ORDER BY t1.a; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) RIGHT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t3.c = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; +SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b) RIGHT JOIN prt1_e t3 ON (t1.a = (t3.a + t3.b)/2) WHERE t3.c = 0 ORDER BY t1.a, t2.b, t3.a + t3.b; + +-- MergeAppend on nullable column +-- This should generate a partitionwise join, but currently fails to +EXPLAIN (COSTS OFF) +SELECT t1.a, t2.b FROM (SELECT * FROM prt1 WHERE a < 450) t1 LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t2.b FROM (SELECT * FROM prt1 WHERE a < 450) t1 LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- merge join when expression with whole-row reference needs to be sorted; +-- partitionwise join does not apply +EXPLAIN (COSTS OFF) +SELECT t1.a, t2.b FROM prt1 t1, prt2 t2 WHERE t1::text = t2::text AND t1.a = t2.b ORDER BY t1.a; +SELECT t1.a, t2.b FROM prt1 t1, prt2 t2 WHERE t1::text = t2::text AND t1.a = t2.b ORDER BY t1.a; + +RESET enable_hashjoin; +RESET enable_nestloop; + +-- +-- partitioned by multiple columns +-- +CREATE TABLE prt1_m (a int, b int, c int) PARTITION BY RANGE(a, ((a + b)/2)); +CREATE TABLE prt1_m_p1 PARTITION OF prt1_m FOR VALUES FROM (0, 0) TO (250, 250); +CREATE TABLE prt1_m_p2 PARTITION OF prt1_m FOR VALUES FROM (250, 250) TO (500, 500); +CREATE TABLE prt1_m_p3 PARTITION OF prt1_m FOR VALUES FROM (500, 500) TO (600, 600); +INSERT INTO prt1_m SELECT i, i, i % 25 FROM generate_series(0, 599, 2) i; +ANALYZE prt1_m; + +CREATE TABLE prt2_m (a int, b int, c int) PARTITION BY RANGE(((b + a)/2), b); +CREATE TABLE prt2_m_p1 PARTITION OF prt2_m FOR VALUES FROM (0, 0) TO (250, 250); +CREATE TABLE prt2_m_p2 PARTITION OF prt2_m FOR VALUES FROM (250, 250) TO (500, 500); +CREATE TABLE prt2_m_p3 PARTITION OF prt2_m FOR VALUES FROM (500, 500) TO (600, 600); +INSERT INTO prt2_m SELECT i, i, i % 25 FROM generate_series(0, 599, 3) i; +ANALYZE prt2_m; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_m WHERE prt1_m.c = 0) t1 FULL JOIN (SELECT * FROM prt2_m WHERE prt2_m.c = 0) t2 ON (t1.a = (t2.b + t2.a)/2 AND t2.b = (t1.a + t1.b)/2) ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_m WHERE prt1_m.c = 0) t1 FULL JOIN (SELECT * FROM prt2_m WHERE prt2_m.c = 0) t2 ON (t1.a = (t2.b + t2.a)/2 AND t2.b = (t1.a + t1.b)/2) ORDER BY t1.a, t2.b; + +-- +-- tests for list partitioned tables. +-- +CREATE TABLE plt1 (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE plt1_p1 PARTITION OF plt1 FOR VALUES IN ('0000', '0003', '0004', '0010'); +CREATE TABLE plt1_p2 PARTITION OF plt1 FOR VALUES IN ('0001', '0005', '0002', '0009'); +CREATE TABLE plt1_p3 PARTITION OF plt1 FOR VALUES IN ('0006', '0007', '0008', '0011'); +INSERT INTO plt1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE plt1; + +CREATE TABLE plt2 (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE plt2_p1 PARTITION OF plt2 FOR VALUES IN ('0000', '0003', '0004', '0010'); +CREATE TABLE plt2_p2 PARTITION OF plt2 FOR VALUES IN ('0001', '0005', '0002', '0009'); +CREATE TABLE plt2_p3 PARTITION OF plt2 FOR VALUES IN ('0006', '0007', '0008', '0011'); +INSERT INTO plt2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 3) i; +ANALYZE plt2; + +-- +-- list partitioned by expression +-- +CREATE TABLE plt1_e (a int, b int, c text) PARTITION BY LIST(ltrim(c, 'A')); +CREATE TABLE plt1_e_p1 PARTITION OF plt1_e FOR VALUES IN ('0000', '0003', '0004', '0010'); +CREATE TABLE plt1_e_p2 PARTITION OF plt1_e FOR VALUES IN ('0001', '0005', '0002', '0009'); +CREATE TABLE plt1_e_p3 PARTITION OF plt1_e FOR VALUES IN ('0006', '0007', '0008', '0011'); +INSERT INTO plt1_e SELECT i, i, 'A' || to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE plt1_e; + +-- test partition matching with N-way join +EXPLAIN (COSTS OFF) +SELECT avg(t1.a), avg(t2.b), avg(t3.a + t3.b), t1.c, t2.c, t3.c FROM plt1 t1, plt2 t2, plt1_e t3 WHERE t1.b = t2.b AND t1.c = t2.c AND ltrim(t3.c, 'A') = t1.c GROUP BY t1.c, t2.c, t3.c ORDER BY t1.c, t2.c, t3.c; +SELECT avg(t1.a), avg(t2.b), avg(t3.a + t3.b), t1.c, t2.c, t3.c FROM plt1 t1, plt2 t2, plt1_e t3 WHERE t1.b = t2.b AND t1.c = t2.c AND ltrim(t3.c, 'A') = t1.c GROUP BY t1.c, t2.c, t3.c ORDER BY t1.c, t2.c, t3.c; + +-- joins where one of the relations is proven empty +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.a = 1 AND t1.a = 2; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 LEFT JOIN prt2 t2 ON t1.a = t2.b; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b, prt1 t3 WHERE t2.b = t3.a; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 FULL JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b; + +-- +-- tests for hash partitioned tables. +-- +CREATE TABLE pht1 (a int, b int, c text) PARTITION BY HASH(c); +CREATE TABLE pht1_p1 PARTITION OF pht1 FOR VALUES WITH (MODULUS 3, REMAINDER 0); +CREATE TABLE pht1_p2 PARTITION OF pht1 FOR VALUES WITH (MODULUS 3, REMAINDER 1); +CREATE TABLE pht1_p3 PARTITION OF pht1 FOR VALUES WITH (MODULUS 3, REMAINDER 2); +INSERT INTO pht1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE pht1; + +CREATE TABLE pht2 (a int, b int, c text) PARTITION BY HASH(c); +CREATE TABLE pht2_p1 PARTITION OF pht2 FOR VALUES WITH (MODULUS 3, REMAINDER 0); +CREATE TABLE pht2_p2 PARTITION OF pht2 FOR VALUES WITH (MODULUS 3, REMAINDER 1); +CREATE TABLE pht2_p3 PARTITION OF pht2 FOR VALUES WITH (MODULUS 3, REMAINDER 2); +INSERT INTO pht2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 3) i; +ANALYZE pht2; + +-- +-- hash partitioned by expression +-- +CREATE TABLE pht1_e (a int, b int, c text) PARTITION BY HASH(ltrim(c, 'A')); +CREATE TABLE pht1_e_p1 PARTITION OF pht1_e FOR VALUES WITH (MODULUS 3, REMAINDER 0); +CREATE TABLE pht1_e_p2 PARTITION OF pht1_e FOR VALUES WITH (MODULUS 3, REMAINDER 1); +CREATE TABLE pht1_e_p3 PARTITION OF pht1_e FOR VALUES WITH (MODULUS 3, REMAINDER 2); +INSERT INTO pht1_e SELECT i, i, 'A' || to_char(i/50, 'FM0000') FROM generate_series(0, 299, 2) i; +ANALYZE pht1_e; + +-- test partition matching with N-way join +EXPLAIN (COSTS OFF) +SELECT avg(t1.a), avg(t2.b), avg(t3.a + t3.b), t1.c, t2.c, t3.c FROM pht1 t1, pht2 t2, pht1_e t3 WHERE t1.b = t2.b AND t1.c = t2.c AND ltrim(t3.c, 'A') = t1.c GROUP BY t1.c, t2.c, t3.c ORDER BY t1.c, t2.c, t3.c; +SELECT avg(t1.a), avg(t2.b), avg(t3.a + t3.b), t1.c, t2.c, t3.c FROM pht1 t1, pht2 t2, pht1_e t3 WHERE t1.b = t2.b AND t1.c = t2.c AND ltrim(t3.c, 'A') = t1.c GROUP BY t1.c, t2.c, t3.c ORDER BY t1.c, t2.c, t3.c; + +-- test default partition behavior for range +ALTER TABLE prt1 DETACH PARTITION prt1_p3; +ALTER TABLE prt1 ATTACH PARTITION prt1_p3 DEFAULT; +ANALYZE prt1; +ALTER TABLE prt2 DETACH PARTITION prt2_p3; +ALTER TABLE prt2 ATTACH PARTITION prt2_p3 DEFAULT; +ANALYZE prt2; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; + +-- test default partition behavior for list +ALTER TABLE plt1 DETACH PARTITION plt1_p3; +ALTER TABLE plt1 ATTACH PARTITION plt1_p3 DEFAULT; +ANALYZE plt1; +ALTER TABLE plt2 DETACH PARTITION plt2_p3; +ALTER TABLE plt2 ATTACH PARTITION plt2_p3 DEFAULT; +ANALYZE plt2; + +EXPLAIN (COSTS OFF) +SELECT avg(t1.a), avg(t2.b), t1.c, t2.c FROM plt1 t1 RIGHT JOIN plt2 t2 ON t1.c = t2.c WHERE t1.a % 25 = 0 GROUP BY t1.c, t2.c ORDER BY t1.c, t2.c; +-- +-- multiple levels of partitioning +-- +CREATE TABLE prt1_l (a int, b int, c varchar) PARTITION BY RANGE(a); +CREATE TABLE prt1_l_p1 PARTITION OF prt1_l FOR VALUES FROM (0) TO (250); +CREATE TABLE prt1_l_p2 PARTITION OF prt1_l FOR VALUES FROM (250) TO (500) PARTITION BY LIST (c); +CREATE TABLE prt1_l_p2_p1 PARTITION OF prt1_l_p2 FOR VALUES IN ('0000', '0001'); +CREATE TABLE prt1_l_p2_p2 PARTITION OF prt1_l_p2 FOR VALUES IN ('0002', '0003'); +CREATE TABLE prt1_l_p3 PARTITION OF prt1_l FOR VALUES FROM (500) TO (600) PARTITION BY RANGE (b); +CREATE TABLE prt1_l_p3_p1 PARTITION OF prt1_l_p3 FOR VALUES FROM (0) TO (13); +CREATE TABLE prt1_l_p3_p2 PARTITION OF prt1_l_p3 FOR VALUES FROM (13) TO (25); +INSERT INTO prt1_l SELECT i, i % 25, to_char(i % 4, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE prt1_l; + +CREATE TABLE prt2_l (a int, b int, c varchar) PARTITION BY RANGE(b); +CREATE TABLE prt2_l_p1 PARTITION OF prt2_l FOR VALUES FROM (0) TO (250); +CREATE TABLE prt2_l_p2 PARTITION OF prt2_l FOR VALUES FROM (250) TO (500) PARTITION BY LIST (c); +CREATE TABLE prt2_l_p2_p1 PARTITION OF prt2_l_p2 FOR VALUES IN ('0000', '0001'); +CREATE TABLE prt2_l_p2_p2 PARTITION OF prt2_l_p2 FOR VALUES IN ('0002', '0003'); +CREATE TABLE prt2_l_p3 PARTITION OF prt2_l FOR VALUES FROM (500) TO (600) PARTITION BY RANGE (a); +CREATE TABLE prt2_l_p3_p1 PARTITION OF prt2_l_p3 FOR VALUES FROM (0) TO (13); +CREATE TABLE prt2_l_p3_p2 PARTITION OF prt2_l_p3 FOR VALUES FROM (13) TO (25); +INSERT INTO prt2_l SELECT i % 25, i, to_char(i % 4, 'FM0000') FROM generate_series(0, 599, 3) i; +ANALYZE prt2_l; + +-- inner join, qual covering only top-level partitions +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1, prt2_l t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1, prt2_l t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1 LEFT JOIN prt2_l t2 ON t1.a = t2.b AND t1.c = t2.c WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1 LEFT JOIN prt2_l t2 ON t1.a = t2.b AND t1.c = t2.c WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- right join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.c = t2.c WHERE t2.a = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_l t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.c = t2.c WHERE t2.a = 0 ORDER BY t1.a, t2.b; + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE prt1_l.b = 0) t1 FULL JOIN (SELECT * FROM prt2_l WHERE prt2_l.a = 0) t2 ON (t1.a = t2.b AND t1.c = t2.c) ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE prt1_l.b = 0) t1 FULL JOIN (SELECT * FROM prt2_l WHERE prt2_l.a = 0) t2 ON (t1.a = t2.b AND t1.c = t2.c) ORDER BY t1.a, t2.b; + +-- lateral partitionwise join +EXPLAIN (COSTS OFF) +SELECT * FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t2.c AS t2c, t2.b AS t2b, t3.b AS t3b, least(t1.a,t2.a,t3.b) FROM prt1_l t2 JOIN prt2_l t3 ON (t2.a = t3.b AND t2.c = t3.c)) ss + ON t1.a = ss.t2a AND t1.c = ss.t2c WHERE t1.b = 0 ORDER BY t1.a; +SELECT * FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t2.a AS t2a, t2.c AS t2c, t2.b AS t2b, t3.b AS t3b, least(t1.a,t2.a,t3.b) FROM prt1_l t2 JOIN prt2_l t3 ON (t2.a = t3.b AND t2.c = t3.c)) ss + ON t1.a = ss.t2a AND t1.c = ss.t2c WHERE t1.b = 0 ORDER BY t1.a; + +-- join with one side empty +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.b = t2.a AND t1.c = t2.c; + +-- Test case to verify proper handling of subqueries in a partitioned delete. +-- The weird-looking lateral join is just there to force creation of a +-- nestloop parameter within the subquery, which exposes the problem if the +-- planner fails to make multiple copies of the subquery as appropriate. +EXPLAIN (COSTS OFF) +DELETE FROM prt1_l +WHERE EXISTS ( + SELECT 1 + FROM int4_tbl, + LATERAL (SELECT int4_tbl.f1 FROM int8_tbl LIMIT 2) ss + WHERE prt1_l.c IS NULL); + +-- +-- negative testcases +-- +CREATE TABLE prt1_n (a int, b int, c varchar) PARTITION BY RANGE(c); +CREATE TABLE prt1_n_p1 PARTITION OF prt1_n FOR VALUES FROM ('0000') TO ('0250'); +CREATE TABLE prt1_n_p2 PARTITION OF prt1_n FOR VALUES FROM ('0250') TO ('0500'); +INSERT INTO prt1_n SELECT i, i, to_char(i, 'FM0000') FROM generate_series(0, 499, 2) i; +ANALYZE prt1_n; + +CREATE TABLE prt2_n (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE prt2_n_p1 PARTITION OF prt2_n FOR VALUES IN ('0000', '0003', '0004', '0010', '0006', '0007'); +CREATE TABLE prt2_n_p2 PARTITION OF prt2_n FOR VALUES IN ('0001', '0005', '0002', '0009', '0008', '0011'); +INSERT INTO prt2_n SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE prt2_n; + +CREATE TABLE prt3_n (a int, b int, c text) PARTITION BY LIST(c); +CREATE TABLE prt3_n_p1 PARTITION OF prt3_n FOR VALUES IN ('0000', '0004', '0006', '0007'); +CREATE TABLE prt3_n_p2 PARTITION OF prt3_n FOR VALUES IN ('0001', '0002', '0008', '0010'); +CREATE TABLE prt3_n_p3 PARTITION OF prt3_n FOR VALUES IN ('0003', '0005', '0009', '0011'); +INSERT INTO prt2_n SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE prt3_n; + +CREATE TABLE prt4_n (a int, b int, c text) PARTITION BY RANGE(a); +CREATE TABLE prt4_n_p1 PARTITION OF prt4_n FOR VALUES FROM (0) TO (300); +CREATE TABLE prt4_n_p2 PARTITION OF prt4_n FOR VALUES FROM (300) TO (500); +CREATE TABLE prt4_n_p3 PARTITION OF prt4_n FOR VALUES FROM (500) TO (600); +INSERT INTO prt4_n SELECT i, i, to_char(i, 'FM0000') FROM generate_series(0, 599, 2) i; +ANALYZE prt4_n; + +-- partitionwise join can not be applied if the partition ranges differ +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt4_n t2 WHERE t1.a = t2.a; +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt4_n t2, prt2 t3 WHERE t1.a = t2.a and t1.a = t3.b; + +-- partitionwise join can not be applied if there are no equi-join conditions +-- between partition keys +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1 LEFT JOIN prt2 t2 ON (t1.a < t2.b); + +-- equi-join with join condition on partial keys does not qualify for +-- partitionwise join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_m t1, prt2_m t2 WHERE t1.a = (t2.b + t2.a)/2; + +-- equi-join between out-of-order partition key columns does not qualify for +-- partitionwise join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_m t1 LEFT JOIN prt2_m t2 ON t1.a = t2.b; + +-- equi-join between non-key columns does not qualify for partitionwise join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_m t1 LEFT JOIN prt2_m t2 ON t1.c = t2.c; + +-- partitionwise join can not be applied for a join between list and range +-- partitioned tables +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_n t1 LEFT JOIN prt2_n t2 ON (t1.c = t2.c); + +-- partitionwise join can not be applied between tables with different +-- partition lists +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_n t1 JOIN prt2_n t2 ON (t1.c = t2.c) JOIN plt1 t3 ON (t1.c = t3.c); + +-- partitionwise join can not be applied for a join between key column and +-- non-key column +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_n t1 FULL JOIN prt1 t2 ON (t1.c = t2.c); + +-- +-- Test some other plan types in a partitionwise join (unfortunately, +-- we need larger tables to get the planner to choose these plan types) +-- +create temp table prtx1 (a integer, b integer, c integer) + partition by range (a); +create temp table prtx1_1 partition of prtx1 for values from (1) to (11); +create temp table prtx1_2 partition of prtx1 for values from (11) to (21); +create temp table prtx1_3 partition of prtx1 for values from (21) to (31); +create temp table prtx2 (a integer, b integer, c integer) + partition by range (a); +create temp table prtx2_1 partition of prtx2 for values from (1) to (11); +create temp table prtx2_2 partition of prtx2 for values from (11) to (21); +create temp table prtx2_3 partition of prtx2 for values from (21) to (31); +insert into prtx1 select 1 + i%30, i, i + from generate_series(1,1000) i; +insert into prtx2 select 1 + i%30, i, i + from generate_series(1,500) i, generate_series(1,10) j; +create index on prtx2 (b); +create index on prtx2 (c); +analyze prtx1; +analyze prtx2; + +explain (costs off) +select * from prtx1 +where not exists (select 1 from prtx2 + where prtx2.a=prtx1.a and prtx2.b=prtx1.b and prtx2.c=123) + and a<20 and c=120; + +select * from prtx1 +where not exists (select 1 from prtx2 + where prtx2.a=prtx1.a and prtx2.b=prtx1.b and prtx2.c=123) + and a<20 and c=120; + +explain (costs off) +select * from prtx1 +where not exists (select 1 from prtx2 + where prtx2.a=prtx1.a and (prtx2.b=prtx1.b+1 or prtx2.c=99)) + and a<20 and c=91; + +select * from prtx1 +where not exists (select 1 from prtx2 + where prtx2.a=prtx1.a and (prtx2.b=prtx1.b+1 or prtx2.c=99)) + and a<20 and c=91; + +-- +-- Test advanced partition-matching algorithm for partitioned join +-- + +-- Tests for range-partitioned tables +CREATE TABLE prt1_adv (a int, b int, c varchar) PARTITION BY RANGE (a); +CREATE TABLE prt1_adv_p1 PARTITION OF prt1_adv FOR VALUES FROM (100) TO (200); +CREATE TABLE prt1_adv_p2 PARTITION OF prt1_adv FOR VALUES FROM (200) TO (300); +CREATE TABLE prt1_adv_p3 PARTITION OF prt1_adv FOR VALUES FROM (300) TO (400); +CREATE INDEX prt1_adv_a_idx ON prt1_adv (a); +INSERT INTO prt1_adv SELECT i, i % 25, to_char(i, 'FM0000') FROM generate_series(100, 399) i; +ANALYZE prt1_adv; + +CREATE TABLE prt2_adv (a int, b int, c varchar) PARTITION BY RANGE (b); +CREATE TABLE prt2_adv_p1 PARTITION OF prt2_adv FOR VALUES FROM (100) TO (150); +CREATE TABLE prt2_adv_p2 PARTITION OF prt2_adv FOR VALUES FROM (200) TO (300); +CREATE TABLE prt2_adv_p3 PARTITION OF prt2_adv FOR VALUES FROM (350) TO (500); +CREATE INDEX prt2_adv_b_idx ON prt2_adv (b); +INSERT INTO prt2_adv_p1 SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(100, 149) i; +INSERT INTO prt2_adv_p2 SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(200, 299) i; +INSERT INTO prt2_adv_p3 SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(350, 499) i; +ANALYZE prt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 175 phv, * FROM prt1_adv WHERE prt1_adv.b = 0) t1 FULL JOIN (SELECT 425 phv, * FROM prt2_adv WHERE prt2_adv.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 175 phv, * FROM prt1_adv WHERE prt1_adv.b = 0) t1 FULL JOIN (SELECT 425 phv, * FROM prt2_adv WHERE prt2_adv.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + +-- Test cases where one side has an extra partition +CREATE TABLE prt2_adv_extra PARTITION OF prt2_adv FOR VALUES FROM (500) TO (MAXVALUE); +INSERT INTO prt2_adv SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(500, 599) i; +ANALYZE prt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- left join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.b, t1.c, t2.a, t2.c FROM prt2_adv t1 LEFT JOIN prt1_adv t2 ON (t1.b = t2.a) WHERE t1.a = 0 ORDER BY t1.b, t2.a; + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + +-- anti join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt2_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt1_adv t2 WHERE t1.b = t2.a) AND t1.a = 0 ORDER BY t1.b; + +-- full join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 175 phv, * FROM prt1_adv WHERE prt1_adv.b = 0) t1 FULL JOIN (SELECT 425 phv, * FROM prt2_adv WHERE prt2_adv.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + +-- 3-way join where not every pair of relations can do partitioned join +EXPLAIN (COSTS OFF) +SELECT t1.b, t1.c, t2.a, t2.c, t3.a, t3.c FROM prt2_adv t1 LEFT JOIN prt1_adv t2 ON (t1.b = t2.a) INNER JOIN prt1_adv t3 ON (t1.b = t3.a) WHERE t1.a = 0 ORDER BY t1.b, t2.a, t3.a; +SELECT t1.b, t1.c, t2.a, t2.c, t3.a, t3.c FROM prt2_adv t1 LEFT JOIN prt1_adv t2 ON (t1.b = t2.a) INNER JOIN prt1_adv t3 ON (t1.b = t3.a) WHERE t1.a = 0 ORDER BY t1.b, t2.a, t3.a; + +DROP TABLE prt2_adv_extra; + +-- Test cases where a partition on one side matches multiple partitions on +-- the other side; we currently can't do partitioned join in such cases +ALTER TABLE prt2_adv DETACH PARTITION prt2_adv_p3; +-- Split prt2_adv_p3 into two partitions so that prt1_adv_p3 matches both +CREATE TABLE prt2_adv_p3_1 PARTITION OF prt2_adv FOR VALUES FROM (350) TO (375); +CREATE TABLE prt2_adv_p3_2 PARTITION OF prt2_adv FOR VALUES FROM (375) TO (500); +INSERT INTO prt2_adv SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(350, 499) i; +ANALYZE prt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM prt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM prt2_adv t2 WHERE t1.a = t2.b) AND t1.b = 0 ORDER BY t1.a; + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT 175 phv, * FROM prt1_adv WHERE prt1_adv.b = 0) t1 FULL JOIN (SELECT 425 phv, * FROM prt2_adv WHERE prt2_adv.a = 0) t2 ON (t1.a = t2.b) WHERE t1.phv = t1.a OR t2.phv = t2.b ORDER BY t1.a, t2.b; + +DROP TABLE prt2_adv_p3_1; +DROP TABLE prt2_adv_p3_2; +ANALYZE prt2_adv; + +-- Test default partitions +ALTER TABLE prt1_adv DETACH PARTITION prt1_adv_p1; +-- Change prt1_adv_p1 to the default partition +ALTER TABLE prt1_adv ATTACH PARTITION prt1_adv_p1 DEFAULT; +ALTER TABLE prt1_adv DETACH PARTITION prt1_adv_p3; +ANALYZE prt1_adv; + +-- We can do partitioned join even if only one of relations has the default +-- partition +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +-- Restore prt1_adv_p3 +ALTER TABLE prt1_adv ATTACH PARTITION prt1_adv_p3 FOR VALUES FROM (300) TO (400); +ANALYZE prt1_adv; + +-- Restore prt2_adv_p3 +ALTER TABLE prt2_adv ATTACH PARTITION prt2_adv_p3 FOR VALUES FROM (350) TO (500); +ANALYZE prt2_adv; + +-- Partitioned join can't be applied because the default partition of prt1_adv +-- matches prt2_adv_p1 and prt2_adv_p3 +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +ALTER TABLE prt2_adv DETACH PARTITION prt2_adv_p3; +-- Change prt2_adv_p3 to the default partition +ALTER TABLE prt2_adv ATTACH PARTITION prt2_adv_p3 DEFAULT; +ANALYZE prt2_adv; + +-- Partitioned join can't be applied because the default partition of prt1_adv +-- matches prt2_adv_p1 and prt2_adv_p3 +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.b = 0 ORDER BY t1.a, t2.b; + +DROP TABLE prt1_adv_p3; +ANALYZE prt1_adv; + +DROP TABLE prt2_adv_p3; +ANALYZE prt2_adv; + +CREATE TABLE prt3_adv (a int, b int, c varchar) PARTITION BY RANGE (a); +CREATE TABLE prt3_adv_p1 PARTITION OF prt3_adv FOR VALUES FROM (200) TO (300); +CREATE TABLE prt3_adv_p2 PARTITION OF prt3_adv FOR VALUES FROM (300) TO (400); +CREATE INDEX prt3_adv_a_idx ON prt3_adv (a); +INSERT INTO prt3_adv SELECT i, i % 25, to_char(i, 'FM0000') FROM generate_series(200, 399) i; +ANALYZE prt3_adv; + +-- 3-way join to test the default partition of a join relation +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c, t3.a, t3.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) LEFT JOIN prt3_adv t3 ON (t1.a = t3.a) WHERE t1.b = 0 ORDER BY t1.a, t2.b, t3.a; +SELECT t1.a, t1.c, t2.b, t2.c, t3.a, t3.c FROM prt1_adv t1 LEFT JOIN prt2_adv t2 ON (t1.a = t2.b) LEFT JOIN prt3_adv t3 ON (t1.a = t3.a) WHERE t1.b = 0 ORDER BY t1.a, t2.b, t3.a; + +DROP TABLE prt1_adv; +DROP TABLE prt2_adv; +DROP TABLE prt3_adv; + +-- Test interaction of partitioned join with partition pruning +CREATE TABLE prt1_adv (a int, b int, c varchar) PARTITION BY RANGE (a); +CREATE TABLE prt1_adv_p1 PARTITION OF prt1_adv FOR VALUES FROM (100) TO (200); +CREATE TABLE prt1_adv_p2 PARTITION OF prt1_adv FOR VALUES FROM (200) TO (300); +CREATE TABLE prt1_adv_p3 PARTITION OF prt1_adv FOR VALUES FROM (300) TO (400); +CREATE INDEX prt1_adv_a_idx ON prt1_adv (a); +INSERT INTO prt1_adv SELECT i, i % 25, to_char(i, 'FM0000') FROM generate_series(100, 399) i; +ANALYZE prt1_adv; + +CREATE TABLE prt2_adv (a int, b int, c varchar) PARTITION BY RANGE (b); +CREATE TABLE prt2_adv_p1 PARTITION OF prt2_adv FOR VALUES FROM (100) TO (200); +CREATE TABLE prt2_adv_p2 PARTITION OF prt2_adv FOR VALUES FROM (200) TO (400); +CREATE INDEX prt2_adv_b_idx ON prt2_adv (b); +INSERT INTO prt2_adv SELECT i % 25, i, to_char(i, 'FM0000') FROM generate_series(100, 399) i; +ANALYZE prt2_adv; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.a < 300 AND t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.a < 300 AND t1.b = 0 ORDER BY t1.a, t2.b; + +DROP TABLE prt1_adv_p3; +CREATE TABLE prt1_adv_default PARTITION OF prt1_adv DEFAULT; +ANALYZE prt1_adv; + +CREATE TABLE prt2_adv_default PARTITION OF prt2_adv DEFAULT; +ANALYZE prt2_adv; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.a >= 100 AND t1.a < 300 AND t1.b = 0 ORDER BY t1.a, t2.b; +SELECT t1.a, t1.c, t2.b, t2.c FROM prt1_adv t1 INNER JOIN prt2_adv t2 ON (t1.a = t2.b) WHERE t1.a >= 100 AND t1.a < 300 AND t1.b = 0 ORDER BY t1.a, t2.b; + +DROP TABLE prt1_adv; +DROP TABLE prt2_adv; + + +-- Tests for list-partitioned tables +CREATE TABLE plt1_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt1_adv_p1 PARTITION OF plt1_adv FOR VALUES IN ('0001', '0003'); +CREATE TABLE plt1_adv_p2 PARTITION OF plt1_adv FOR VALUES IN ('0004', '0006'); +CREATE TABLE plt1_adv_p3 PARTITION OF plt1_adv FOR VALUES IN ('0008', '0009'); +INSERT INTO plt1_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 3, 4, 6, 8, 9); +ANALYZE plt1_adv; + +CREATE TABLE plt2_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt2_adv_p1 PARTITION OF plt2_adv FOR VALUES IN ('0002', '0003'); +CREATE TABLE plt2_adv_p2 PARTITION OF plt2_adv FOR VALUES IN ('0004', '0006'); +CREATE TABLE plt2_adv_p3 PARTITION OF plt2_adv FOR VALUES IN ('0007', '0009'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +ANALYZE plt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + +-- Test cases where one side has an extra partition +CREATE TABLE plt2_adv_extra PARTITION OF plt2_adv FOR VALUES IN ('0000'); +INSERT INTO plt2_adv_extra VALUES (0, 0, '0000'); +ANALYZE plt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- left join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt2_adv t1 LEFT JOIN plt1_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- anti join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt2_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt1_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- full join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + +DROP TABLE plt2_adv_extra; + +-- Test cases where a partition on one side matches multiple partitions on +-- the other side; we currently can't do partitioned join in such cases +ALTER TABLE plt2_adv DETACH PARTITION plt2_adv_p2; +-- Split plt2_adv_p2 into two partitions so that plt1_adv_p2 matches both +CREATE TABLE plt2_adv_p2_1 PARTITION OF plt2_adv FOR VALUES IN ('0004'); +CREATE TABLE plt2_adv_p2_2 PARTITION OF plt2_adv FOR VALUES IN ('0006'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (4, 6); +ANALYZE plt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + +DROP TABLE plt2_adv_p2_1; +DROP TABLE plt2_adv_p2_2; +-- Restore plt2_adv_p2 +ALTER TABLE plt2_adv ATTACH PARTITION plt2_adv_p2 FOR VALUES IN ('0004', '0006'); + +-- Test NULL partitions +ALTER TABLE plt1_adv DETACH PARTITION plt1_adv_p1; +-- Change plt1_adv_p1 to the NULL partition +CREATE TABLE plt1_adv_p1_null PARTITION OF plt1_adv FOR VALUES IN (NULL, '0001', '0003'); +INSERT INTO plt1_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 3); +INSERT INTO plt1_adv VALUES (-1, -1, NULL); +ANALYZE plt1_adv; + +ALTER TABLE plt2_adv DETACH PARTITION plt2_adv_p3; +-- Change plt2_adv_p3 to the NULL partition +CREATE TABLE plt2_adv_p3_null PARTITION OF plt2_adv FOR VALUES IN (NULL, '0007', '0009'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (7, 9); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- semi join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; +SELECT t1.* FROM plt1_adv t1 WHERE EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- anti join +EXPLAIN (COSTS OFF) +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; +SELECT t1.* FROM plt1_adv t1 WHERE NOT EXISTS (SELECT 1 FROM plt2_adv t2 WHERE t1.a = t2.a AND t1.c = t2.c) AND t1.b < 10 ORDER BY t1.a; + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + +DROP TABLE plt1_adv_p1_null; +-- Restore plt1_adv_p1 +ALTER TABLE plt1_adv ATTACH PARTITION plt1_adv_p1 FOR VALUES IN ('0001', '0003'); +-- Add to plt1_adv the extra NULL partition containing only NULL values as the +-- key values +CREATE TABLE plt1_adv_extra PARTITION OF plt1_adv FOR VALUES IN (NULL); +INSERT INTO plt1_adv VALUES (-1, -1, NULL); +ANALYZE plt1_adv; + +DROP TABLE plt2_adv_p3_null; +-- Restore plt2_adv_p3 +ALTER TABLE plt2_adv ATTACH PARTITION plt2_adv_p3 FOR VALUES IN ('0007', '0009'); +ANALYZE plt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- left join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- full join; currently we can't do partitioned join if there are no matched +-- partitions on the nullable side +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + +-- Add to plt2_adv the extra NULL partition containing only NULL values as the +-- key values +CREATE TABLE plt2_adv_extra PARTITION OF plt2_adv FOR VALUES IN (NULL); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; + +-- inner join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- left join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- full join +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 FULL JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE coalesce(t1.b, 0) < 10 AND coalesce(t2.b, 0) < 10 ORDER BY t1.a, t2.a; + +-- 3-way join to test the NULL partition of a join relation +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) LEFT JOIN plt1_adv t3 ON (t1.a = t3.a AND t1.c = t3.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) LEFT JOIN plt1_adv t3 ON (t1.a = t3.a AND t1.c = t3.c) WHERE t1.b < 10 ORDER BY t1.a; + +DROP TABLE plt1_adv_extra; +DROP TABLE plt2_adv_extra; + +-- Test default partitions +ALTER TABLE plt1_adv DETACH PARTITION plt1_adv_p1; +-- Change plt1_adv_p1 to the default partition +ALTER TABLE plt1_adv ATTACH PARTITION plt1_adv_p1 DEFAULT; +DROP TABLE plt1_adv_p3; +ANALYZE plt1_adv; + +DROP TABLE plt2_adv_p3; +ANALYZE plt2_adv; + +-- We can do partitioned join even if only one of relations has the default +-- partition +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +ALTER TABLE plt2_adv DETACH PARTITION plt2_adv_p2; +-- Change plt2_adv_p2 to contain '0005' in addition to '0004' and '0006' as +-- the key values +CREATE TABLE plt2_adv_p2_ext PARTITION OF plt2_adv FOR VALUES IN ('0004', '0005', '0006'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (4, 5, 6); +ANALYZE plt2_adv; + +-- Partitioned join can't be applied because the default partition of plt1_adv +-- matches plt2_adv_p1 and plt2_adv_p2_ext +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +ALTER TABLE plt2_adv DETACH PARTITION plt2_adv_p2_ext; +-- Change plt2_adv_p2_ext to the default partition +ALTER TABLE plt2_adv ATTACH PARTITION plt2_adv_p2_ext DEFAULT; +ANALYZE plt2_adv; + +-- Partitioned join can't be applied because the default partition of plt1_adv +-- matches plt2_adv_p1 and plt2_adv_p2_ext +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +DROP TABLE plt2_adv_p2_ext; +-- Restore plt2_adv_p2 +ALTER TABLE plt2_adv ATTACH PARTITION plt2_adv_p2 FOR VALUES IN ('0004', '0006'); +ANALYZE plt2_adv; + +CREATE TABLE plt3_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt3_adv_p1 PARTITION OF plt3_adv FOR VALUES IN ('0004', '0006'); +CREATE TABLE plt3_adv_p2 PARTITION OF plt3_adv FOR VALUES IN ('0007', '0009'); +INSERT INTO plt3_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (4, 6, 7, 9); +ANALYZE plt3_adv; + +-- 3-way join to test the default partition of a join relation +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) LEFT JOIN plt3_adv t3 ON (t1.a = t3.a AND t1.c = t3.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) LEFT JOIN plt3_adv t3 ON (t1.a = t3.a AND t1.c = t3.c) WHERE t1.b < 10 ORDER BY t1.a; + +-- Test cases where one side has the default partition while the other side +-- has the NULL partition +DROP TABLE plt2_adv_p1; +-- Add the NULL partition to plt2_adv +CREATE TABLE plt2_adv_p1_null PARTITION OF plt2_adv FOR VALUES IN (NULL, '0001', '0003'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 3); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +DROP TABLE plt2_adv_p1_null; +-- Add the NULL partition that contains only NULL values as the key values +CREATE TABLE plt2_adv_p1_null PARTITION OF plt2_adv FOR VALUES IN (NULL); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.b < 10 ORDER BY t1.a; + +DROP TABLE plt1_adv; +DROP TABLE plt2_adv; +DROP TABLE plt3_adv; + +-- Test interaction of partitioned join with partition pruning +CREATE TABLE plt1_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt1_adv_p1 PARTITION OF plt1_adv FOR VALUES IN ('0001'); +CREATE TABLE plt1_adv_p2 PARTITION OF plt1_adv FOR VALUES IN ('0002'); +CREATE TABLE plt1_adv_p3 PARTITION OF plt1_adv FOR VALUES IN ('0003'); +CREATE TABLE plt1_adv_p4 PARTITION OF plt1_adv FOR VALUES IN (NULL, '0004', '0005'); +INSERT INTO plt1_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 2, 3, 4, 5); +INSERT INTO plt1_adv VALUES (-1, -1, NULL); +ANALYZE plt1_adv; + +CREATE TABLE plt2_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt2_adv_p1 PARTITION OF plt2_adv FOR VALUES IN ('0001', '0002'); +CREATE TABLE plt2_adv_p2 PARTITION OF plt2_adv FOR VALUES IN (NULL); +CREATE TABLE plt2_adv_p3 PARTITION OF plt2_adv FOR VALUES IN ('0003'); +CREATE TABLE plt2_adv_p4 PARTITION OF plt2_adv FOR VALUES IN ('0004', '0005'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 10, 'FM0000') FROM generate_series(1, 299) i WHERE i % 10 IN (1, 2, 3, 4, 5); +INSERT INTO plt2_adv VALUES (-1, -1, NULL); +ANALYZE plt2_adv; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IN ('0003', '0004', '0005') AND t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IN ('0003', '0004', '0005') AND t1.b < 10 ORDER BY t1.a; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IS NULL AND t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IS NULL AND t1.b < 10 ORDER BY t1.a; + +CREATE TABLE plt1_adv_default PARTITION OF plt1_adv DEFAULT; +ANALYZE plt1_adv; + +CREATE TABLE plt2_adv_default PARTITION OF plt2_adv DEFAULT; +ANALYZE plt2_adv; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IN ('0003', '0004', '0005') AND t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 INNER JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IN ('0003', '0004', '0005') AND t1.b < 10 ORDER BY t1.a; + +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IS NULL AND t1.b < 10 ORDER BY t1.a; +SELECT t1.a, t1.c, t2.a, t2.c FROM plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE t1.c IS NULL AND t1.b < 10 ORDER BY t1.a; + +DROP TABLE plt1_adv; +DROP TABLE plt2_adv; + +-- Test the process_outer_partition() code path +CREATE TABLE plt1_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt1_adv_p1 PARTITION OF plt1_adv FOR VALUES IN ('0000', '0001', '0002'); +CREATE TABLE plt1_adv_p2 PARTITION OF plt1_adv FOR VALUES IN ('0003', '0004'); +INSERT INTO plt1_adv SELECT i, i, to_char(i % 5, 'FM0000') FROM generate_series(0, 24) i; +ANALYZE plt1_adv; + +CREATE TABLE plt2_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt2_adv_p1 PARTITION OF plt2_adv FOR VALUES IN ('0002'); +CREATE TABLE plt2_adv_p2 PARTITION OF plt2_adv FOR VALUES IN ('0003', '0004'); +INSERT INTO plt2_adv SELECT i, i, to_char(i % 5, 'FM0000') FROM generate_series(0, 24) i WHERE i % 5 IN (2, 3, 4); +ANALYZE plt2_adv; + +CREATE TABLE plt3_adv (a int, b int, c text) PARTITION BY LIST (c); +CREATE TABLE plt3_adv_p1 PARTITION OF plt3_adv FOR VALUES IN ('0001'); +CREATE TABLE plt3_adv_p2 PARTITION OF plt3_adv FOR VALUES IN ('0003', '0004'); +INSERT INTO plt3_adv SELECT i, i, to_char(i % 5, 'FM0000') FROM generate_series(0, 24) i WHERE i % 5 IN (1, 3, 4); +ANALYZE plt3_adv; + +-- This tests that when merging partitions from plt1_adv and plt2_adv in +-- merge_list_bounds(), process_outer_partition() returns an already-assigned +-- merged partition when re-called with plt1_adv_p1 for the second list value +-- '0001' of that partition +EXPLAIN (COSTS OFF) +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM (plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.c = t2.c)) FULL JOIN plt3_adv t3 ON (t1.c = t3.c) WHERE coalesce(t1.a, 0) % 5 != 3 AND coalesce(t1.a, 0) % 5 != 4 ORDER BY t1.c, t1.a, t2.a, t3.a; +SELECT t1.a, t1.c, t2.a, t2.c, t3.a, t3.c FROM (plt1_adv t1 LEFT JOIN plt2_adv t2 ON (t1.c = t2.c)) FULL JOIN plt3_adv t3 ON (t1.c = t3.c) WHERE coalesce(t1.a, 0) % 5 != 3 AND coalesce(t1.a, 0) % 5 != 4 ORDER BY t1.c, t1.a, t2.a, t3.a; + +DROP TABLE plt1_adv; +DROP TABLE plt2_adv; +DROP TABLE plt3_adv; + + +-- Tests for multi-level partitioned tables +CREATE TABLE alpha (a double precision, b int, c text) PARTITION BY RANGE (a); +CREATE TABLE alpha_neg PARTITION OF alpha FOR VALUES FROM ('-Infinity') TO (0) PARTITION BY RANGE (b); +CREATE TABLE alpha_pos PARTITION OF alpha FOR VALUES FROM (0) TO (10.0) PARTITION BY LIST (c); +CREATE TABLE alpha_neg_p1 PARTITION OF alpha_neg FOR VALUES FROM (100) TO (200); +CREATE TABLE alpha_neg_p2 PARTITION OF alpha_neg FOR VALUES FROM (200) TO (300); +CREATE TABLE alpha_neg_p3 PARTITION OF alpha_neg FOR VALUES FROM (300) TO (400); +CREATE TABLE alpha_pos_p1 PARTITION OF alpha_pos FOR VALUES IN ('0001', '0003'); +CREATE TABLE alpha_pos_p2 PARTITION OF alpha_pos FOR VALUES IN ('0004', '0006'); +CREATE TABLE alpha_pos_p3 PARTITION OF alpha_pos FOR VALUES IN ('0008', '0009'); +INSERT INTO alpha_neg SELECT -1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(100, 399) i WHERE i % 10 IN (1, 3, 4, 6, 8, 9); +INSERT INTO alpha_pos SELECT 1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(100, 399) i WHERE i % 10 IN (1, 3, 4, 6, 8, 9); +ANALYZE alpha; + +CREATE TABLE beta (a double precision, b int, c text) PARTITION BY RANGE (a); +CREATE TABLE beta_neg PARTITION OF beta FOR VALUES FROM (-10.0) TO (0) PARTITION BY RANGE (b); +CREATE TABLE beta_pos PARTITION OF beta FOR VALUES FROM (0) TO ('Infinity') PARTITION BY LIST (c); +CREATE TABLE beta_neg_p1 PARTITION OF beta_neg FOR VALUES FROM (100) TO (150); +CREATE TABLE beta_neg_p2 PARTITION OF beta_neg FOR VALUES FROM (200) TO (300); +CREATE TABLE beta_neg_p3 PARTITION OF beta_neg FOR VALUES FROM (350) TO (500); +CREATE TABLE beta_pos_p1 PARTITION OF beta_pos FOR VALUES IN ('0002', '0003'); +CREATE TABLE beta_pos_p2 PARTITION OF beta_pos FOR VALUES IN ('0004', '0006'); +CREATE TABLE beta_pos_p3 PARTITION OF beta_pos FOR VALUES IN ('0007', '0009'); +INSERT INTO beta_neg SELECT -1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(100, 149) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_neg SELECT -1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(200, 299) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_neg SELECT -1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(350, 499) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_pos SELECT 1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(100, 149) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_pos SELECT 1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(200, 299) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +INSERT INTO beta_pos SELECT 1.0, i, to_char(i % 10, 'FM0000') FROM generate_series(350, 499) i WHERE i % 10 IN (2, 3, 4, 6, 7, 9); +ANALYZE beta; + +EXPLAIN (COSTS OFF) +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b) WHERE t1.b >= 125 AND t1.b < 225 ORDER BY t1.a, t1.b; +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b) WHERE t1.b >= 125 AND t1.b < 225 ORDER BY t1.a, t1.b; + +EXPLAIN (COSTS OFF) +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b, t2.b; +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b, t2.b; + +EXPLAIN (COSTS OFF) +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b; +SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b; diff --git a/src/test/singlenode_regress/sql/partition_prune.sql b/src/test/singlenode_regress/sql/partition_prune.sql new file mode 100644 index 00000000000..0f0df136690 --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_prune.sql @@ -0,0 +1,1216 @@ +-- +-- Test partitioning planner code +-- + +-- GPDB: +-- One of the queries EXPLAINed in this file executes on one or two segments, +-- depending on random choice by the planner. Accept either plan. +-- start_matchsubs +-- m/ Gather Motion [12]:1 \(slice1; segments: [12]\)/ +-- s/ Gather Motion [12]:1 \(slice1; segments: [12]\)/ Gather Motion XXX/ +-- m/Memory Usage: \d+\w?B/ +-- s/Memory Usage: \d+\w?B/Memory Usage: ###B/ +-- m/Buckets: \d+/ +-- s/Buckets: \d+/Buckets: ###/ +-- m/Batches: \d+/ +-- s/Batches: \d+/Batches: ###/ +-- m/Extra Text: \(seg\d+\)/ +-- s/Extra Text: \(seg\d+\)/Extra Text: ###/ +-- m/Hash chain length \d+\.\d+ avg, \d+ max/ +-- s/Hash chain length \d+\.\d+ avg, \d+ max/Hash chain length ###/ +-- m/using \d+ of \d+ buckets/ +-- s/using \d+ of \d+ buckets/using ## of ### buckets/ +-- m/((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9])|(0[13-9]|1[0-2])-30|(0[13578]|1[02])-31)-(?!0000)[0-9]{4}/ +-- s/((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9])|(0[13-9]|1[0-2])-30|(0[13578]|1[02])-31)-(?!0000)[0-9]{4}/xx-xx-xxxx/ +-- m/((Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](.[0-9]+)? (?!0000)[0-9]{4}.*)+(['"])/ +-- s/((Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](.[0-9]+)? (?!0000)[0-9]{4}.*)+(['"])/xxx xx xx xx:xx:xx xxxx"/ +-- end_matchsubs +-- Force generic plans to be used for all prepared statements in this file. +set plan_cache_mode = force_generic_plan; + +create table lp (a char) partition by list (a); +create table lp_default partition of lp default; +create table lp_ef partition of lp for values in ('e', 'f'); +create table lp_ad partition of lp for values in ('a', 'd'); +create table lp_bc partition of lp for values in ('b', 'c'); +create table lp_g partition of lp for values in ('g'); +create table lp_null partition of lp for values in (null); +explain (costs off) select * from lp; +explain (costs off) select * from lp where a > 'a' and a < 'd'; +explain (costs off) select * from lp where a > 'a' and a <= 'd'; +explain (costs off) select * from lp where a = 'a'; +explain (costs off) select * from lp where 'a' = a; /* commuted */ +explain (costs off) select * from lp where a is not null; +explain (costs off) select * from lp where a is null; +explain (costs off) select * from lp where a = 'a' or a = 'c'; +explain (costs off) select * from lp where a is not null and (a = 'a' or a = 'c'); +explain (costs off) select * from lp where a <> 'g'; +explain (costs off) select * from lp where a <> 'a' and a <> 'd'; +explain (costs off) select * from lp where a not in ('a', 'd'); + +-- collation matches the partitioning collation, pruning works +create table coll_pruning (a text collate "C") partition by list (a); +create table coll_pruning_a partition of coll_pruning for values in ('a'); +create table coll_pruning_b partition of coll_pruning for values in ('b'); +create table coll_pruning_def partition of coll_pruning default; +explain (costs off) select * from coll_pruning where a collate "C" = 'a' collate "C"; +-- collation doesn't match the partitioning collation, no pruning occurs +explain (costs off) select * from coll_pruning where a collate "POSIX" = 'a' collate "POSIX"; + +create table rlp (a int, b varchar) partition by range (a); +create table rlp_default partition of rlp default partition by list (a); +create table rlp_default_default partition of rlp_default default; +create table rlp_default_10 partition of rlp_default for values in (10); +create table rlp_default_30 partition of rlp_default for values in (30); +create table rlp_default_null partition of rlp_default for values in (null); +create table rlp1 partition of rlp for values from (minvalue) to (1); +create table rlp2 partition of rlp for values from (1) to (10); + +create table rlp3 (b varchar, a int) partition by list (b varchar_ops); +create table rlp3_default partition of rlp3 default; +create table rlp3abcd partition of rlp3 for values in ('ab', 'cd'); +create table rlp3efgh partition of rlp3 for values in ('ef', 'gh'); +create table rlp3nullxy partition of rlp3 for values in (null, 'xy'); +alter table rlp attach partition rlp3 for values from (15) to (20); + +create table rlp4 partition of rlp for values from (20) to (30) partition by range (a); +create table rlp4_default partition of rlp4 default; +create table rlp4_1 partition of rlp4 for values from (20) to (25); +create table rlp4_2 partition of rlp4 for values from (25) to (29); + +create table rlp5 partition of rlp for values from (31) to (maxvalue) partition by range (a); +create table rlp5_default partition of rlp5 default; +create table rlp5_1 partition of rlp5 for values from (31) to (40); + +explain (costs off) select * from rlp where a < 1; +explain (costs off) select * from rlp where 1 > a; /* commuted */ +explain (costs off) select * from rlp where a <= 1; +explain (costs off) select * from rlp where a = 1; +explain (costs off) select * from rlp where a = 1::bigint; /* same as above */ +explain (costs off) select * from rlp where a = 1::numeric; /* no pruning */ +explain (costs off) select * from rlp where a <= 10; +explain (costs off) select * from rlp where a > 10; +explain (costs off) select * from rlp where a < 15; +explain (costs off) select * from rlp where a <= 15; +explain (costs off) select * from rlp where a > 15 and b = 'ab'; +explain (costs off) select * from rlp where a = 16; +explain (costs off) select * from rlp where a = 16 and b in ('not', 'in', 'here'); +explain (costs off) select * from rlp where a = 16 and b < 'ab'; +explain (costs off) select * from rlp where a = 16 and b <= 'ab'; +explain (costs off) select * from rlp where a = 16 and b is null; +explain (costs off) select * from rlp where a = 16 and b is not null; +explain (costs off) select * from rlp where a is null; +explain (costs off) select * from rlp where a is not null; +explain (costs off) select * from rlp where a > 30; +explain (costs off) select * from rlp where a = 30; /* only default is scanned */ +explain (costs off) select * from rlp where a <= 31; +explain (costs off) select * from rlp where a = 1 or a = 7; +explain (costs off) select * from rlp where a = 1 or b = 'ab'; + +explain (costs off) select * from rlp where a > 20 and a < 27; +explain (costs off) select * from rlp where a = 29; +explain (costs off) select * from rlp where a >= 29; +explain (costs off) select * from rlp where a < 1 or (a > 20 and a < 25); + +-- where clause contradicts sub-partition's constraint +explain (costs off) select * from rlp where a = 20 or a = 40; +explain (costs off) select * from rlp3 where a = 20; /* empty */ + +-- redundant clauses are eliminated +explain (costs off) select * from rlp where a > 1 and a = 10; /* only default */ +explain (costs off) select * from rlp where a > 1 and a >=15; /* rlp3 onwards, including default */ +explain (costs off) select * from rlp where a = 1 and a = 3; /* empty */ +explain (costs off) select * from rlp where (a = 1 and a = 3) or (a > 1 and a = 15); + +-- multi-column keys +create table mc3p (a int, b int, c int) partition by range (a, abs(b), c); +create table mc3p_default partition of mc3p default; +create table mc3p0 partition of mc3p for values from (minvalue, minvalue, minvalue) to (1, 1, 1); +create table mc3p1 partition of mc3p for values from (1, 1, 1) to (10, 5, 10); +create table mc3p2 partition of mc3p for values from (10, 5, 10) to (10, 10, 10); +create table mc3p3 partition of mc3p for values from (10, 10, 10) to (10, 10, 20); +create table mc3p4 partition of mc3p for values from (10, 10, 20) to (10, maxvalue, maxvalue); +create table mc3p5 partition of mc3p for values from (11, 1, 1) to (20, 10, 10); +create table mc3p6 partition of mc3p for values from (20, 10, 10) to (20, 20, 20); +create table mc3p7 partition of mc3p for values from (20, 20, 20) to (maxvalue, maxvalue, maxvalue); + +explain (costs off) select * from mc3p where a = 1; +explain (costs off) select * from mc3p where a = 1 and abs(b) < 1; +explain (costs off) select * from mc3p where a = 1 and abs(b) = 1; +explain (costs off) select * from mc3p where a = 1 and abs(b) = 1 and c < 8; +explain (costs off) select * from mc3p where a = 10 and abs(b) between 5 and 35; +explain (costs off) select * from mc3p where a > 10; +explain (costs off) select * from mc3p where a >= 10; +explain (costs off) select * from mc3p where a < 10; +explain (costs off) select * from mc3p where a <= 10 and abs(b) < 10; +explain (costs off) select * from mc3p where a = 11 and abs(b) = 0; +explain (costs off) select * from mc3p where a = 20 and abs(b) = 10 and c = 100; +explain (costs off) select * from mc3p where a > 20; +explain (costs off) select * from mc3p where a >= 20; +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1 and c = 1) or (a = 10 and abs(b) = 5 and c = 10) or (a > 11 and a < 20); +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1 and c = 1) or (a = 10 and abs(b) = 5 and c = 10) or (a > 11 and a < 20) or a < 1; +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1 and c = 1) or (a = 10 and abs(b) = 5 and c = 10) or (a > 11 and a < 20) or a < 1 or a = 1; +explain (costs off) select * from mc3p where a = 1 or abs(b) = 1 or c = 1; +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1) or (a = 10 and abs(b) = 10); +explain (costs off) select * from mc3p where (a = 1 and abs(b) = 1) or (a = 10 and abs(b) = 9); + +-- a simpler multi-column keys case +create table mc2p (a int, b int) partition by range (a, b); +create table mc2p_default partition of mc2p default; +create table mc2p0 partition of mc2p for values from (minvalue, minvalue) to (1, minvalue); +create table mc2p1 partition of mc2p for values from (1, minvalue) to (1, 1); +create table mc2p2 partition of mc2p for values from (1, 1) to (2, minvalue); +create table mc2p3 partition of mc2p for values from (2, minvalue) to (2, 1); +create table mc2p4 partition of mc2p for values from (2, 1) to (2, maxvalue); +create table mc2p5 partition of mc2p for values from (2, maxvalue) to (maxvalue, maxvalue); + +explain (costs off) select * from mc2p where a < 2; +explain (costs off) select * from mc2p where a = 2 and b < 1; +explain (costs off) select * from mc2p where a > 1; +explain (costs off) select * from mc2p where a = 1 and b > 1; + +-- all partitions but the default one should be pruned +explain (costs off) select * from mc2p where a = 1 and b is null; +explain (costs off) select * from mc2p where a is null and b is null; +explain (costs off) select * from mc2p where a is null and b = 1; +explain (costs off) select * from mc2p where a is null; +explain (costs off) select * from mc2p where b is null; + +-- boolean partitioning +create table boolpart (a bool) partition by list (a); +create table boolpart_default partition of boolpart default; +create table boolpart_t partition of boolpart for values in ('true'); +create table boolpart_f partition of boolpart for values in ('false'); + +explain (costs off) select * from boolpart where a in (true, false); +explain (costs off) select * from boolpart where a = false; +explain (costs off) select * from boolpart where not a = false; +explain (costs off) select * from boolpart where a is true or a is not true; +explain (costs off) select * from boolpart where a is not true; +explain (costs off) select * from boolpart where a is not true and a is not false; +explain (costs off) select * from boolpart where a is unknown; +explain (costs off) select * from boolpart where a is not unknown; + +create table boolrangep (a bool, b bool, c int) partition by range (a,b,c); +create table boolrangep_tf partition of boolrangep for values from ('true', 'false', 0) to ('true', 'false', 100); +create table boolrangep_ft partition of boolrangep for values from ('false', 'true', 0) to ('false', 'true', 100); +create table boolrangep_ff1 partition of boolrangep for values from ('false', 'false', 0) to ('false', 'false', 50); +create table boolrangep_ff2 partition of boolrangep for values from ('false', 'false', 50) to ('false', 'false', 100); + +-- try a more complex case that's been known to trip up pruning in the past +explain (costs off) select * from boolrangep where not a and not b and c = 25; + +-- test scalar-to-array operators +create table coercepart (a varchar) partition by list (a); +create table coercepart_ab partition of coercepart for values in ('ab'); +create table coercepart_bc partition of coercepart for values in ('bc'); +create table coercepart_cd partition of coercepart for values in ('cd'); + +explain (costs off) select * from coercepart where a in ('ab', to_char(125, '999')); +explain (costs off) select * from coercepart where a ~ any ('{ab}'); +explain (costs off) select * from coercepart where a !~ all ('{ab}'); +explain (costs off) select * from coercepart where a ~ any ('{ab,bc}'); +explain (costs off) select * from coercepart where a !~ all ('{ab,bc}'); +explain (costs off) select * from coercepart where a = any ('{ab,bc}'); +explain (costs off) select * from coercepart where a = any ('{ab,null}'); +explain (costs off) select * from coercepart where a = any (null::text[]); +explain (costs off) select * from coercepart where a = all ('{ab}'); +explain (costs off) select * from coercepart where a = all ('{ab,bc}'); +explain (costs off) select * from coercepart where a = all ('{ab,null}'); +explain (costs off) select * from coercepart where a = all (null::text[]); + +drop table coercepart; + +CREATE TABLE part (a INT, b INT) PARTITION BY LIST (a); +CREATE TABLE part_p1 PARTITION OF part FOR VALUES IN (-2,-1,0,1,2); +CREATE TABLE part_p2 PARTITION OF part DEFAULT PARTITION BY RANGE(a); +CREATE TABLE part_p2_p1 PARTITION OF part_p2 DEFAULT; +CREATE TABLE part_rev (b INT, c INT, a INT); +ALTER TABLE part ATTACH PARTITION part_rev FOR VALUES IN (3); -- fail +ALTER TABLE part_rev DROP COLUMN c; +ALTER TABLE part ATTACH PARTITION part_rev FOR VALUES IN (3); -- now it's ok +INSERT INTO part VALUES (-1,-1), (1,1), (2,NULL), (NULL,-2),(NULL,NULL); +EXPLAIN (COSTS OFF) SELECT tableoid::regclass as part, a, b FROM part WHERE a IS NULL ORDER BY 1, 2, 3; +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM part p(x) ORDER BY x; + +-- +-- some more cases +-- + +-- +-- pruning for partitioned table appearing inside a sub-query +-- +-- pruning won't work for mc3p, because some keys are Params +explain (costs off) select * from mc2p t1, lateral (select count(*) from mc3p t2 where t2.a = t1.b and abs(t2.b) = 1 and t2.c = 1) s where t1.a = 1; + +-- pruning should work fine, because values for a prefix of keys (a, b) are +-- available +explain (costs off) select * from mc2p t1, lateral (select count(*) from mc3p t2 where t2.c = t1.b and abs(t2.b) = 1 and t2.a = 1) s where t1.a = 1; + +-- also here, because values for all keys are provided +explain (costs off) select * from mc2p t1, lateral (select count(*) from mc3p t2 where t2.a = 1 and abs(t2.b) = 1 and t2.c = 1) s where t1.a = 1; + +-- +-- pruning with clauses containing <> operator +-- + +-- doesn't prune range partitions +create table rp (a int) partition by range (a); +create table rp0 partition of rp for values from (minvalue) to (1); +create table rp1 partition of rp for values from (1) to (2); +create table rp2 partition of rp for values from (2) to (maxvalue); + +explain (costs off) select * from rp where a <> 1; +explain (costs off) select * from rp where a <> 1 and a <> 2; + +-- null partition should be eliminated due to strict <> clause. +explain (costs off) select * from lp where a <> 'a'; + +-- ensure we detect contradictions in clauses; a can't be NULL and NOT NULL. +explain (costs off) select * from lp where a <> 'a' and a is null; +explain (costs off) select * from lp where (a <> 'a' and a <> 'd') or a is null; + +-- check that it also works for a partitioned table that's not root, +-- which in this case are partitions of rlp that are themselves +-- list-partitioned on b +explain (costs off) select * from rlp where a = 15 and b <> 'ab' and b <> 'cd' and b <> 'xy' and b is not null; + +-- +-- different collations for different keys with same expression +-- +create table coll_pruning_multi (a text) partition by range (substr(a, 1) collate "POSIX", substr(a, 1) collate "C"); +create table coll_pruning_multi1 partition of coll_pruning_multi for values from ('a', 'a') to ('a', 'e'); +create table coll_pruning_multi2 partition of coll_pruning_multi for values from ('a', 'e') to ('a', 'z'); +create table coll_pruning_multi3 partition of coll_pruning_multi for values from ('b', 'a') to ('b', 'e'); + +-- no pruning, because no value for the leading key +explain (costs off) select * from coll_pruning_multi where substr(a, 1) = 'e' collate "C"; + +-- pruning, with a value provided for the leading key +explain (costs off) select * from coll_pruning_multi where substr(a, 1) = 'a' collate "POSIX"; + +-- pruning, with values provided for both keys +explain (costs off) select * from coll_pruning_multi where substr(a, 1) = 'e' collate "C" and substr(a, 1) = 'a' collate "POSIX"; + +-- +-- LIKE operators don't prune +-- +create table like_op_noprune (a text) partition by list (a); +create table like_op_noprune1 partition of like_op_noprune for values in ('ABC'); +create table like_op_noprune2 partition of like_op_noprune for values in ('BCD'); +explain (costs off) select * from like_op_noprune where a like '%BC'; + +-- +-- tests wherein clause value requires a cross-type comparison function +-- +create table lparted_by_int2 (a smallint) partition by list (a); +create table lparted_by_int2_1 partition of lparted_by_int2 for values in (1); +create table lparted_by_int2_16384 partition of lparted_by_int2 for values in (16384); +explain (costs off) select * from lparted_by_int2 where a = 100000000000000; + +create table rparted_by_int2 (a smallint) partition by range (a); +create table rparted_by_int2_1 partition of rparted_by_int2 for values from (1) to (10); +create table rparted_by_int2_16384 partition of rparted_by_int2 for values from (10) to (16384); +-- all partitions pruned +explain (costs off) select * from rparted_by_int2 where a > 100000000000000; +create table rparted_by_int2_maxvalue partition of rparted_by_int2 for values from (16384) to (maxvalue); +-- all partitions but rparted_by_int2_maxvalue pruned +explain (costs off) select * from rparted_by_int2 where a > 100000000000000; + +drop table lp, coll_pruning, rlp, mc3p, mc2p, boolpart, boolrangep, rp, coll_pruning_multi, like_op_noprune, lparted_by_int2, rparted_by_int2; + +-- +-- Test Partition pruning for HASH partitioning +-- +-- Use hand-rolled hash functions and operator classes to get predictable +-- result on different machines. See the definitions of +-- part_part_test_int4_ops and part_test_text_ops in insert.sql. +-- + +create table hp (a int, b text, c int) + partition by hash (a part_test_int4_ops, b part_test_text_ops); +create table hp0 partition of hp for values with (modulus 4, remainder 0); +create table hp3 partition of hp for values with (modulus 4, remainder 3); +create table hp1 partition of hp for values with (modulus 4, remainder 1); +create table hp2 partition of hp for values with (modulus 4, remainder 2); + +insert into hp values (null, null, 0); +insert into hp values (1, null, 1); +insert into hp values (1, 'xxx', 2); +insert into hp values (null, 'xxx', 3); +insert into hp values (2, 'xxx', 4); +insert into hp values (1, 'abcde', 5); +select tableoid::regclass, * from hp order by c; + +-- partial keys won't prune, nor would non-equality conditions +explain (costs off) select * from hp where a = 1; +explain (costs off) select * from hp where b = 'xxx'; +explain (costs off) select * from hp where a is null; +explain (costs off) select * from hp where b is null; +explain (costs off) select * from hp where a < 1 and b = 'xxx'; +explain (costs off) select * from hp where a <> 1 and b = 'yyy'; +explain (costs off) select * from hp where a <> 1 and b <> 'xxx'; + +-- pruning should work if either a value or a IS NULL clause is provided for +-- each of the keys +explain (costs off) select * from hp where a is null and b is null; +explain (costs off) select * from hp where a = 1 and b is null; +explain (costs off) select * from hp where a = 1 and b = 'xxx'; +explain (costs off) select * from hp where a is null and b = 'xxx'; +explain (costs off) select * from hp where a = 2 and b = 'xxx'; +explain (costs off) select * from hp where a = 1 and b = 'abcde'; +explain (costs off) select * from hp where (a = 1 and b = 'abcde') or (a = 2 and b = 'xxx') or (a is null and b is null); + +-- test pruning when not all the partitions exist +drop table hp1; +drop table hp3; +explain (costs off) select * from hp where a = 1 and b = 'abcde'; +explain (costs off) select * from hp where a = 1 and b = 'abcde' and + (c = 2 or c = 3); +drop table hp2; +explain (costs off) select * from hp where a = 1 and b = 'abcde' and + (c = 2 or c = 3); + +drop table hp; + +-- +-- Test runtime partition pruning +-- +create table ab (a int not null, b int not null) partition by list (a); +create table ab_a2 partition of ab for values in(2) partition by list (b); +create table ab_a2_b1 partition of ab_a2 for values in (1); +create table ab_a2_b2 partition of ab_a2 for values in (2); +create table ab_a2_b3 partition of ab_a2 for values in (3); +create table ab_a1 partition of ab for values in(1) partition by list (b); +create table ab_a1_b1 partition of ab_a1 for values in (1); +create table ab_a1_b2 partition of ab_a1 for values in (2); +create table ab_a1_b3 partition of ab_a1 for values in (3); +create table ab_a3 partition of ab for values in(3) partition by list (b); +create table ab_a3_b1 partition of ab_a3 for values in (1); +create table ab_a3_b2 partition of ab_a3 for values in (2); +create table ab_a3_b3 partition of ab_a3 for values in (3); + +-- Disallow index only scans as concurrent transactions may stop visibility +-- bits being set causing "Heap Fetches" to be unstable in the EXPLAIN ANALYZE +-- output. +set enable_indexonlyscan = off; + +prepare ab_q1 (int, int, int) as +select * from ab where a between $1 and $2 and b <= $3; + +explain (analyze, costs off, summary off, timing off) execute ab_q1 (2, 2, 3); +explain (analyze, costs off, summary off, timing off) execute ab_q1 (1, 2, 3); + +deallocate ab_q1; + +-- Runtime pruning after optimizer pruning +prepare ab_q1 (int, int) as +select a from ab where a between $1 and $2 and b < 3; + +explain (analyze, costs off, summary off, timing off) execute ab_q1 (2, 2); +explain (analyze, costs off, summary off, timing off) execute ab_q1 (2, 4); + +-- Ensure a mix of PARAM_EXTERN and PARAM_EXEC Params work together at +-- different levels of partitioning. +prepare ab_q2 (int, int) as +select a from ab where a between $1 and $2 and b < (select 3); + +explain (analyze, costs off, summary off, timing off) execute ab_q2 (2, 2); + +-- As above, but swap the PARAM_EXEC Param to the first partition level +prepare ab_q3 (int, int) as +select a from ab where b between $1 and $2 and a < (select 3); + +explain (analyze, costs off, summary off, timing off) execute ab_q3 (2, 2); + +-- Test a backwards Append scan +create table list_part (a int) partition by list (a); +create table list_part1 partition of list_part for values in (1); +create table list_part2 partition of list_part for values in (2); +create table list_part3 partition of list_part for values in (3); +create table list_part4 partition of list_part for values in (4); + +insert into list_part select generate_series(1,4); + +begin; + +-- Don't select an actual value out of the table as the order of the Append's +-- subnodes may not be stable. +declare cur SCROLL CURSOR for select 1 from list_part where a > (select 1) and a < (select 4); + +-- move beyond the final row +move 3 from cur; + +-- Ensure we get two rows. +fetch backward all from cur; + +commit; + +begin; + +-- Test run-time pruning using stable functions +create function list_part_fn(int) returns int as $$ begin return $1; end;$$ language plpgsql stable; + +-- Ensure pruning works using a stable function containing no Vars +explain (analyze, costs off, summary off, timing off) select * from list_part where a = list_part_fn(1); + +-- Ensure pruning does not take place when the function has a Var parameter +explain (analyze, costs off, summary off, timing off) select * from list_part where a = list_part_fn(a); + +-- Ensure pruning does not take place when the expression contains a Var. +explain (analyze, costs off, summary off, timing off) select * from list_part where a = list_part_fn(1) + a; + +rollback; + +drop table list_part; + +-- Parallel append + +-- Parallel queries won't necessarily get as many workers as the planner +-- asked for. This affects not only the "Workers Launched:" field of EXPLAIN +-- results, but also row counts and loop counts for parallel scans, Gathers, +-- and everything in between. This function filters out the values we can't +-- rely on to be stable. +-- This removes enough info that you might wonder why bother with EXPLAIN +-- ANALYZE at all. The answer is that we need to see '(never executed)' +-- notations because that's the only way to verify runtime pruning. +create function explain_parallel_append(text) returns setof text +language plpgsql as +$$ +declare + ln text; +begin + for ln in + execute format('explain (analyze, costs off, summary off, timing off) %s', + $1) + loop + ln := regexp_replace(ln, 'Workers Launched: \d+', 'Workers Launched: N'); + ln := regexp_replace(ln, 'actual rows=\d+ loops=\d+', 'actual rows=N loops=N'); + ln := regexp_replace(ln, 'Rows Removed by Filter: \d+', 'Rows Removed by Filter: N'); + return next ln; + end loop; +end; +$$; + +prepare ab_q4 (int, int) as +select avg(a) from ab where a between $1 and $2 and b < 4; + +-- Encourage use of parallel plans +set parallel_setup_cost = 0; +set parallel_tuple_cost = 0; +set min_parallel_table_scan_size = 0; +set max_parallel_workers_per_gather = 2; + +select explain_parallel_append('execute ab_q4 (2, 2)'); + +-- Test run-time pruning with IN lists. +prepare ab_q5 (int, int, int) as +select avg(a) from ab where a in($1,$2,$3) and b < 4; + +select explain_parallel_append('execute ab_q5 (1, 1, 1)'); +select explain_parallel_append('execute ab_q5 (2, 3, 3)'); + +-- Try some params whose values do not belong to any partition. +select explain_parallel_append('execute ab_q5 (33, 44, 55)'); + +-- Test Parallel Append with PARAM_EXEC Params +select explain_parallel_append('select count(*) from ab where (a = (select 1) or a = (select 3)) and b = 2'); + +-- Test pruning during parallel nested loop query +create table lprt_a (a int not null); +-- Insert some values we won't find in ab +insert into lprt_a select 0 from generate_series(1,100); + +-- and insert some values that we should find. +insert into lprt_a values(1),(1); + +analyze lprt_a; + +create index ab_a2_b1_a_idx on ab_a2_b1 (a); +create index ab_a2_b2_a_idx on ab_a2_b2 (a); +create index ab_a2_b3_a_idx on ab_a2_b3 (a); +create index ab_a1_b1_a_idx on ab_a1_b1 (a); +create index ab_a1_b2_a_idx on ab_a1_b2 (a); +create index ab_a1_b3_a_idx on ab_a1_b3 (a); +create index ab_a3_b1_a_idx on ab_a3_b1 (a); +create index ab_a3_b2_a_idx on ab_a3_b2 (a); +create index ab_a3_b3_a_idx on ab_a3_b3 (a); + +set enable_hashjoin = 0; +set enable_mergejoin = 0; +set enable_memoize = 0; + +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a where a.a in(0, 0, 1)'); + +-- Ensure the same partitions are pruned when we make the nested loop +-- parameter an Expr rather than a plain Param. +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a + 0 where a.a in(0, 0, 1)'); + +insert into lprt_a values(3),(3); + +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a where a.a in(1, 0, 3)'); +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a where a.a in(1, 0, 0)'); + +delete from lprt_a where a = 1; + +select explain_parallel_append('select avg(ab.a) from ab inner join lprt_a a on ab.a = a.a where a.a in(1, 0, 0)'); + +reset enable_hashjoin; +reset enable_mergejoin; +reset enable_memoize; +reset parallel_setup_cost; +reset parallel_tuple_cost; +reset min_parallel_table_scan_size; +reset max_parallel_workers_per_gather; + +-- Test run-time partition pruning with an initplan +explain (analyze, costs off, summary off, timing off) +select * from ab where a = (select max(a) from lprt_a) and b = (select max(a)-1 from lprt_a); + +-- Test run-time partition pruning with UNION ALL parents +explain (analyze, costs off, summary off, timing off) +select * from (select * from ab where a = 1 union all select * from ab) ab where b = (select 1); + +-- A case containing a UNION ALL with a non-partitioned child. +explain (analyze, costs off, summary off, timing off) +select * from (select * from ab where a = 1 union all (values(10,5)) union all select * from ab) ab where b = (select 1); + +-- Another UNION ALL test, but containing a mix of exec init and exec run-time pruning. +create table xy_1 (x int, y int); +insert into xy_1 values(100,-10); + +set enable_bitmapscan = 0; +set enable_indexscan = 0; + +prepare ab_q6 as +select * from ( + select tableoid::regclass,a,b from ab +union all + select tableoid::regclass,x,y from xy_1 +union all + select tableoid::regclass,a,b from ab +) ab where a = $1 and b = (select -10); + +-- Ensure the xy_1 subplan is not pruned. +explain (analyze, costs off, summary off, timing off) execute ab_q6(1); + +-- Ensure we see just the xy_1 row. +execute ab_q6(100); + +reset enable_bitmapscan; +reset enable_indexscan; + +deallocate ab_q1; +deallocate ab_q2; +deallocate ab_q3; +deallocate ab_q4; +deallocate ab_q5; +deallocate ab_q6; + +-- UPDATE on a partition subtree has been seen to have problems. +insert into ab values (1,2); +explain (analyze, costs off, summary off, timing off) +update ab_a1 set b = 3 from ab where ab.a = 1 and ab.a = ab_a1.a; +table ab; + +-- Test UPDATE where source relation has run-time pruning enabled +truncate ab; +insert into ab values (1, 1), (1, 2), (1, 3), (2, 1); +explain (analyze, costs off, summary off, timing off) +update ab_a1 set b = 3 from ab_a2 where ab_a2.b = (select 1); +select tableoid::regclass, * from ab; + +drop table ab, lprt_a; + +-- Join +create table tbl1(col1 int); +insert into tbl1 values (501), (505); +analyze tbl1; + +-- Basic table +create table tprt (col1 int) partition by range (col1); +create table tprt_1 partition of tprt for values from (1) to (501); +create table tprt_2 partition of tprt for values from (501) to (1001); +create table tprt_3 partition of tprt for values from (1001) to (2001); +create table tprt_4 partition of tprt for values from (2001) to (3001); +create table tprt_5 partition of tprt for values from (3001) to (4001); +create table tprt_6 partition of tprt for values from (4001) to (5001); + +create index tprt1_idx on tprt_1 (col1); +create index tprt2_idx on tprt_2 (col1); +create index tprt3_idx on tprt_3 (col1); +create index tprt4_idx on tprt_4 (col1); +create index tprt5_idx on tprt_5 (col1); +create index tprt6_idx on tprt_6 (col1); + +insert into tprt values (10), (20), (501), (502), (505), (1001), (4500); + +set enable_hashjoin = off; +set enable_mergejoin = off; +set enable_seqscan=off; + +explain (analyze, costs off, summary off, timing off) +select * from tbl1 join tprt on tbl1.col1 > tprt.col1; + +explain (analyze, costs off, summary off, timing off) +select * from tbl1 join tprt on tbl1.col1 = tprt.col1; + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 > tprt.col1 +order by tbl1.col1, tprt.col1; + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 = tprt.col1 +order by tbl1.col1, tprt.col1; + +-- Multiple partitions +insert into tbl1 values (1001), (1010), (1011); +explain (analyze, costs off, summary off, timing off) +select * from tbl1 inner join tprt on tbl1.col1 > tprt.col1; + +explain (analyze, costs off, summary off, timing off) +select * from tbl1 inner join tprt on tbl1.col1 = tprt.col1; + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 > tprt.col1 +order by tbl1.col1, tprt.col1; + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 = tprt.col1 +order by tbl1.col1, tprt.col1; + +-- Last partition +delete from tbl1; +insert into tbl1 values (4400); +explain (analyze, costs off, summary off, timing off) +select * from tbl1 join tprt on tbl1.col1 < tprt.col1; + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 < tprt.col1 +order by tbl1.col1, tprt.col1; + +reset enable_seqscan; + +-- No matching partition +delete from tbl1; +insert into tbl1 values (10000); +explain (analyze, costs off, summary off, timing off) +select * from tbl1 join tprt on tbl1.col1 = tprt.col1; + +select tbl1.col1, tprt.col1 from tbl1 +inner join tprt on tbl1.col1 = tprt.col1 +order by tbl1.col1, tprt.col1; + +drop table tbl1, tprt; + +-- Test with columns defined in varying orders between each level +create table part_abc (a int not null, b int not null, c int not null) partition by list (a); +create table part_bac (b int not null, a int not null, c int not null) partition by list (b); +create table part_cab (c int not null, a int not null, b int not null) partition by list (c); +create table part_abc_p1 (a int not null, b int not null, c int not null); + +alter table part_abc attach partition part_bac for values in(1); +alter table part_bac attach partition part_cab for values in(2); +alter table part_cab attach partition part_abc_p1 for values in(3); + +prepare part_abc_q1 (int, int, int) as +select * from part_abc where a = $1 and b = $2 and c = $3; + +-- Single partition should be scanned. +explain (analyze, costs off, summary off, timing off) execute part_abc_q1 (1, 2, 3); + +deallocate part_abc_q1; + +drop table part_abc; + +-- Ensure that an Append node properly handles a sub-partitioned table +-- matching without any of its leaf partitions matching the clause. +create table listp (a int, b int) partition by list (a); +create table listp_1 partition of listp for values in(1) partition by list (b); +create table listp_1_1 partition of listp_1 for values in(1); +create table listp_2 partition of listp for values in(2) partition by list (b); +create table listp_2_1 partition of listp_2 for values in(2); +select * from listp where b = 1; + +-- Ensure that an Append node properly can handle selection of all first level +-- partitions before finally detecting the correct set of 2nd level partitions +-- which match the given parameter. +prepare q1 (int,int) as select * from listp where b in ($1,$2); + +explain (analyze, costs off, summary off, timing off) execute q1 (1,1); + +explain (analyze, costs off, summary off, timing off) execute q1 (2,2); + +-- Try with no matching partitions. +explain (analyze, costs off, summary off, timing off) execute q1 (0,0); + +deallocate q1; + +-- Test more complex cases where a not-equal condition further eliminates partitions. +prepare q1 (int,int,int,int) as select * from listp where b in($1,$2) and $3 <> b and $4 <> b; + +-- Both partitions allowed by IN clause, but one disallowed by <> clause +explain (analyze, costs off, summary off, timing off) execute q1 (1,2,2,0); + +-- Both partitions allowed by IN clause, then both excluded again by <> clauses. +explain (analyze, costs off, summary off, timing off) execute q1 (1,2,2,1); + +-- Ensure Params that evaluate to NULL properly prune away all partitions +explain (analyze, costs off, summary off, timing off) +select * from listp where a = (select null::int); + +drop table listp; + +-- +-- check that stable query clauses are only used in run-time pruning +-- +create table stable_qual_pruning (a timestamp) partition by range (a); +create table stable_qual_pruning1 partition of stable_qual_pruning + for values from ('2000-01-01') to ('2000-02-01'); +create table stable_qual_pruning2 partition of stable_qual_pruning + for values from ('2000-02-01') to ('2000-03-01'); +create table stable_qual_pruning3 partition of stable_qual_pruning + for values from ('3000-02-01') to ('3000-03-01'); + +-- comparison against a stable value requires run-time pruning +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning where a < localtimestamp; + +-- timestamp < timestamptz comparison is only stable, not immutable +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning where a < '2000-02-01'::timestamptz; + +-- check ScalarArrayOp cases +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2010-02-01', '2020-01-01']::timestamp[]); +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2000-02-01', '2010-01-01']::timestamp[]); +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2000-02-01', localtimestamp]::timestamp[]); +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2010-02-01', '2020-01-01']::timestamptz[]); +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(array['2000-02-01', '2010-01-01']::timestamptz[]); +explain (analyze, costs off, summary off, timing off) +select * from stable_qual_pruning + where a = any(null::timestamptz[]); + +drop table stable_qual_pruning; + +-- +-- Check that pruning with composite range partitioning works correctly when +-- it must ignore clauses for trailing keys once it has seen a clause with +-- non-inclusive operator for an earlier key +-- +create table mc3p (a int, b int, c int) partition by range (a, abs(b), c); +create table mc3p0 partition of mc3p + for values from (0, 0, 0) to (0, maxvalue, maxvalue); +create table mc3p1 partition of mc3p + for values from (1, 1, 1) to (2, minvalue, minvalue); +create table mc3p2 partition of mc3p + for values from (2, minvalue, minvalue) to (3, maxvalue, maxvalue); +insert into mc3p values (0, 1, 1), (1, 1, 1), (2, 1, 1); + +explain (analyze, costs off, summary off, timing off) +select * from mc3p where a < 3 and abs(b) = 1; + +-- +-- Check that pruning with composite range partitioning works correctly when +-- a combination of runtime parameters is specified, not all of whose values +-- are available at the same time +-- +prepare ps1 as + select * from mc3p where a = $1 and abs(b) < (select 3); +explain (analyze, costs off, summary off, timing off) +execute ps1(1); +deallocate ps1; +prepare ps2 as + select * from mc3p where a <= $1 and abs(b) < (select 3); +explain (analyze, costs off, summary off, timing off) +execute ps2(1); +deallocate ps2; + +drop table mc3p; + +-- Ensure runtime pruning works with initplans params with boolean types +create table boolvalues (value bool not null); +insert into boolvalues values('t'),('f'); + +create table boolp (a bool) partition by list (a); +create table boolp_t partition of boolp for values in('t'); +create table boolp_f partition of boolp for values in('f'); + +explain (analyze, costs off, summary off, timing off) +select * from boolp where a = (select value from boolvalues where value); + +explain (analyze, costs off, summary off, timing off) +select * from boolp where a = (select value from boolvalues where not value); + +drop table boolp; + +-- +-- Test run-time pruning of MergeAppend subnodes +-- +set enable_seqscan = off; +set enable_sort = off; +create table ma_test (a int, b int) partition by range (a); +create table ma_test_p1 partition of ma_test for values from (0) to (10); +create table ma_test_p2 partition of ma_test for values from (10) to (20); +create table ma_test_p3 partition of ma_test for values from (20) to (30); +insert into ma_test select x,x from generate_series(0,29) t(x); +create index on ma_test (b); + +analyze ma_test; +prepare mt_q1 (int) as select a from ma_test where a >= $1 and a % 10 = 5 order by b; + +explain (analyze, costs off, summary off, timing off) execute mt_q1(15); +execute mt_q1(15); +explain (analyze, costs off, summary off, timing off) execute mt_q1(25); +execute mt_q1(25); +-- Ensure MergeAppend behaves correctly when no subplans match +explain (analyze, costs off, summary off, timing off) execute mt_q1(35); +execute mt_q1(35); + +deallocate mt_q1; + +prepare mt_q2 (int) as select * from ma_test where a >= $1 order by b limit 1; + +-- Ensure output list looks sane when the MergeAppend has no subplans. +explain (analyze, verbose, costs off, summary off, timing off) execute mt_q2 (35); + +deallocate mt_q2; + +-- ensure initplan params properly prune partitions +explain (analyze, costs off, summary off, timing off) select * from ma_test where a >= (select min(b) from ma_test_p2) order by b; + +reset enable_seqscan; +reset enable_sort; + +drop table ma_test; + +reset enable_indexonlyscan; + +-- +-- check that pruning works properly when the partition key is of a +-- pseudotype +-- + +-- array type list partition key +create table pp_arrpart (a int[]) partition by list (a); +create table pp_arrpart1 partition of pp_arrpart for values in ('{1}'); +create table pp_arrpart2 partition of pp_arrpart for values in ('{2, 3}', '{4, 5}'); +explain (costs off) select * from pp_arrpart where a = '{1}'; +explain (costs off) select * from pp_arrpart where a = '{1, 2}'; +explain (costs off) select * from pp_arrpart where a in ('{4, 5}', '{1}'); +explain (costs off) update pp_arrpart set a = a where a = '{1}'; +explain (costs off) delete from pp_arrpart where a = '{1}'; +drop table pp_arrpart; + +-- array type hash partition key +create table pph_arrpart (a int[]) partition by hash (a); +create table pph_arrpart1 partition of pph_arrpart for values with (modulus 2, remainder 0); +create table pph_arrpart2 partition of pph_arrpart for values with (modulus 2, remainder 1); +insert into pph_arrpart values ('{1}'), ('{1, 2}'), ('{4, 5}'); +select tableoid::regclass, * from pph_arrpart order by 1; +explain (costs off) select * from pph_arrpart where a = '{1}'; +explain (costs off) select * from pph_arrpart where a = '{1, 2}'; +explain (costs off) select * from pph_arrpart where a in ('{4, 5}', '{1}'); +drop table pph_arrpart; + +-- enum type list partition key +create type pp_colors as enum ('green', 'blue', 'black'); +create table pp_enumpart (a pp_colors) partition by list (a); +create table pp_enumpart_green partition of pp_enumpart for values in ('green'); +create table pp_enumpart_blue partition of pp_enumpart for values in ('blue'); +explain (costs off) select * from pp_enumpart where a = 'blue'; +explain (costs off) select * from pp_enumpart where a = 'black'; +drop table pp_enumpart; +drop type pp_colors; + +-- record type as partition key +create type pp_rectype as (a int, b int); +create table pp_recpart (a pp_rectype) partition by list (a); +create table pp_recpart_11 partition of pp_recpart for values in ('(1,1)'); +create table pp_recpart_23 partition of pp_recpart for values in ('(2,3)'); +explain (costs off) select * from pp_recpart where a = '(1,1)'::pp_rectype; +explain (costs off) select * from pp_recpart where a = '(1,2)'::pp_rectype; +drop table pp_recpart; +drop type pp_rectype; + +-- range type partition key +create table pp_intrangepart (a int4range) partition by list (a); +create table pp_intrangepart12 partition of pp_intrangepart for values in ('[1,2]'); +create table pp_intrangepart2inf partition of pp_intrangepart for values in ('[2,)'); +explain (costs off) select * from pp_intrangepart where a = '[1,2]'::int4range; +explain (costs off) select * from pp_intrangepart where a = '(1,2)'::int4range; +drop table pp_intrangepart; + +-- +-- Ensure the enable_partition_prune GUC properly disables partition pruning. +-- + +create table pp_lp (a int, value int) partition by list (a); +create table pp_lp1 partition of pp_lp for values in(1); +create table pp_lp2 partition of pp_lp for values in(2); + +explain (costs off) select * from pp_lp where a = 1; +explain (costs off) update pp_lp set value = 10 where a = 1; +explain (costs off) delete from pp_lp where a = 1; + +set enable_partition_pruning = off; + +set constraint_exclusion = 'partition'; -- this should not affect the result. + +explain (costs off) select * from pp_lp where a = 1; +explain (costs off) update pp_lp set value = 10 where a = 1; +explain (costs off) delete from pp_lp where a = 1; + +set constraint_exclusion = 'off'; -- this should not affect the result. + +explain (costs off) select * from pp_lp where a = 1; +explain (costs off) update pp_lp set value = 10 where a = 1; +explain (costs off) delete from pp_lp where a = 1; + +drop table pp_lp; + +-- Ensure enable_partition_prune does not affect non-partitioned tables. + +create table inh_lp (a int, value int); +create table inh_lp1 (a int, value int, check(a = 1)) inherits (inh_lp); +create table inh_lp2 (a int, value int, check(a = 2)) inherits (inh_lp); + +set constraint_exclusion = 'partition'; + +-- inh_lp2 should be removed in the following 3 cases. +explain (costs off) select * from inh_lp where a = 1; +explain (costs off) update inh_lp set value = 10 where a = 1; +explain (costs off) delete from inh_lp where a = 1; + +-- Ensure we don't exclude normal relations when we only expect to exclude +-- inheritance children +explain (costs off) update inh_lp1 set value = 10 where a = 2; + +drop table inh_lp cascade; + +reset enable_partition_pruning; +reset constraint_exclusion; + +-- Check pruning for a partition tree containing only temporary relations +create temp table pp_temp_parent (a int) partition by list (a); +create temp table pp_temp_part_1 partition of pp_temp_parent for values in (1); +create temp table pp_temp_part_def partition of pp_temp_parent default; +explain (costs off) select * from pp_temp_parent where true; +explain (costs off) select * from pp_temp_parent where a = 2; +drop table pp_temp_parent; + +-- Stress run-time partition pruning a bit more, per bug reports +create temp table p (a int, b int, c int) partition by list (a); +create temp table p1 partition of p for values in (1); +create temp table p2 partition of p for values in (2); +create temp table q (a int, b int, c int) partition by list (a); +create temp table q1 partition of q for values in (1) partition by list (b); +create temp table q11 partition of q1 for values in (1) partition by list (c); +create temp table q111 partition of q11 for values in (1); +create temp table q2 partition of q for values in (2) partition by list (b); +create temp table q21 partition of q2 for values in (1); +create temp table q22 partition of q2 for values in (2); + +insert into q22 values (2, 2, 3); + +explain (costs off) +select * +from ( + select * from p + union all + select * from q1 + union all + select 1, 1, 1 + ) s(a, b, c) +where s.a = 1 and s.b = 1 and s.c = (select 1); + +select * +from ( + select * from p + union all + select * from q1 + union all + select 1, 1, 1 + ) s(a, b, c) +where s.a = 1 and s.b = 1 and s.c = (select 1); + +prepare q (int, int) as +select * +from ( + select * from p + union all + select * from q1 + union all + select 1, 1, 1 + ) s(a, b, c) +where s.a = $1 and s.b = $2 and s.c = (select 1); + +explain (costs off) execute q (1, 1); +execute q (1, 1); + +drop table p, q; + +-- Ensure run-time pruning works correctly when we match a partitioned table +-- on the first level but find no matching partitions on the second level. +create table listp (a int, b int) partition by list (a); +create table listp1 partition of listp for values in(1); +create table listp2 partition of listp for values in(2) partition by list(b); +create table listp2_10 partition of listp2 for values in (10); + +explain (analyze, costs off, summary off, timing off) +select * from listp where a = (select 2) and b <> 10; + +-- +-- check that a partition directly accessed in a query is excluded with +-- constraint_exclusion = on +-- + +-- turn off partition pruning, so that it doesn't interfere +set enable_partition_pruning to off; + +-- setting constraint_exclusion to 'partition' disables exclusion +set constraint_exclusion to 'partition'; +explain (costs off) select * from listp1 where a = 2; +explain (costs off) update listp1 set a = 1 where a = 2; +-- constraint exclusion enabled +set constraint_exclusion to 'on'; +explain (costs off) select * from listp1 where a = 2; +explain (costs off) update listp1 set a = 1 where a = 2; + +reset constraint_exclusion; +reset enable_partition_pruning; + +drop table listp; + +-- Ensure run-time pruning works correctly for nested Append nodes +set parallel_setup_cost to 0; +set parallel_tuple_cost to 0; + +create table listp (a int) partition by list(a); +create table listp_12 partition of listp for values in(1,2) partition by list(a); +create table listp_12_1 partition of listp_12 for values in(1); +create table listp_12_2 partition of listp_12 for values in(2); + +-- Force the 2nd subnode of the Append to be non-parallel. This results in +-- a nested Append node because the mixed parallel / non-parallel paths cannot +-- be pulled into the top-level Append. +alter table listp_12_1 set (parallel_workers = 0); + +-- Ensure that listp_12_2 is not scanned. (The nested Append is not seen in +-- the plan as it's pulled in setref.c due to having just a single subnode). +select explain_parallel_append('select * from listp where a = (select 1);'); + +-- Like the above but throw some more complexity at the planner by adding +-- a UNION ALL. We expect both sides of the union not to scan the +-- non-required partitions. +select explain_parallel_append( +'select * from listp where a = (select 1) + union all +select * from listp where a = (select 2);'); + +drop table listp; +reset parallel_tuple_cost; +reset parallel_setup_cost; + +-- Test case for run-time pruning with a nested Merge Append +set enable_sort to 0; +create table rangep (a int, b int) partition by range (a); +create table rangep_0_to_100 partition of rangep for values from (0) to (100) partition by list (b); +-- We need 3 sub-partitions. 1 to validate pruning worked and another two +-- because a single remaining partition would be pulled up to the main Append. +create table rangep_0_to_100_1 partition of rangep_0_to_100 for values in(1); +create table rangep_0_to_100_2 partition of rangep_0_to_100 for values in(2); +create table rangep_0_to_100_3 partition of rangep_0_to_100 for values in(3); +create table rangep_100_to_200 partition of rangep for values from (100) to (200); +create index on rangep (a); + +-- Ensure run-time pruning works on the nested Merge Append +explain (analyze on, costs off, timing off, summary off) +select * from rangep where b IN((select 1),(select 2)) order by a; +reset enable_sort; +drop table rangep; + +-- +-- Check that gen_prune_steps_from_opexps() works well for various cases of +-- clauses for different partition keys +-- + +create table rp_prefix_test1 (a int, b varchar) partition by range(a, b); +create table rp_prefix_test1_p1 partition of rp_prefix_test1 for values from (1, 'a') to (1, 'b'); +create table rp_prefix_test1_p2 partition of rp_prefix_test1 for values from (2, 'a') to (2, 'b'); + +-- Don't call get_steps_using_prefix() with the last partition key b plus +-- an empty prefix +explain (costs off) select * from rp_prefix_test1 where a <= 1 and b = 'a'; + +create table rp_prefix_test2 (a int, b int, c int) partition by range(a, b, c); +create table rp_prefix_test2_p1 partition of rp_prefix_test2 for values from (1, 1, 0) to (1, 1, 10); +create table rp_prefix_test2_p2 partition of rp_prefix_test2 for values from (2, 2, 0) to (2, 2, 10); + +-- Don't call get_steps_using_prefix() with the last partition key c plus +-- an invalid prefix (ie, b = 1) +explain (costs off) select * from rp_prefix_test2 where a <= 1 and b = 1 and c >= 0; + +create table rp_prefix_test3 (a int, b int, c int, d int) partition by range(a, b, c, d); +create table rp_prefix_test3_p1 partition of rp_prefix_test3 for values from (1, 1, 1, 0) to (1, 1, 1, 10); +create table rp_prefix_test3_p2 partition of rp_prefix_test3 for values from (2, 2, 2, 0) to (2, 2, 2, 10); + +-- Test that get_steps_using_prefix() handles a prefix that contains multiple +-- clauses for the partition key b (ie, b >= 1 and b >= 2) +explain (costs off) select * from rp_prefix_test3 where a >= 1 and b >= 1 and b >= 2 and c >= 2 and d >= 0; + +-- Test that get_steps_using_prefix() handles a prefix that contains multiple +-- clauses for the partition key b (ie, b >= 1 and b = 2) (This also tests +-- that the caller arranges clauses in that prefix in the required order) +explain (costs off) select * from rp_prefix_test3 where a >= 1 and b >= 1 and b = 2 and c = 2 and d >= 0; + +create table hp_prefix_test (a int, b int, c int, d int) partition by hash (a part_test_int4_ops, b part_test_int4_ops, c part_test_int4_ops, d part_test_int4_ops); +create table hp_prefix_test_p1 partition of hp_prefix_test for values with (modulus 2, remainder 0); +create table hp_prefix_test_p2 partition of hp_prefix_test for values with (modulus 2, remainder 1); + +-- Test that get_steps_using_prefix() handles non-NULL step_nullkeys +explain (costs off) select * from hp_prefix_test where a = 1 and b is null and c = 1 and d = 1; + +drop table rp_prefix_test1; +drop table rp_prefix_test2; +drop table rp_prefix_test3; +drop table hp_prefix_test; + +-- +-- Check that gen_partprune_steps() detects self-contradiction from clauses +-- regardless of the order of the clauses (Here we use a custom operator to +-- prevent the equivclass.c machinery from reordering the clauses) +-- + +create operator === ( + leftarg = int4, + rightarg = int4, + procedure = int4eq, + commutator = ===, + hashes +); +create operator class part_test_int4_ops2 +for type int4 +using hash as +operator 1 ===, +function 2 part_hashint4_noop(int4, int8); + +create table hp_contradict_test (a int, b int) partition by hash (a part_test_int4_ops2, b part_test_int4_ops2); +create table hp_contradict_test_p1 partition of hp_contradict_test for values with (modulus 2, remainder 0); +create table hp_contradict_test_p2 partition of hp_contradict_test for values with (modulus 2, remainder 1); + +explain (costs off) select * from hp_contradict_test where a is null and a === 1 and b === 1; +explain (costs off) select * from hp_contradict_test where a === 1 and b === 1 and a is null; + +drop table hp_contradict_test; +drop operator class part_test_int4_ops2 using hash; +drop operator ===(int4, int4); diff --git a/src/test/singlenode_regress/sql/partition_storage.sql b/src/test/singlenode_regress/sql/partition_storage.sql new file mode 100644 index 00000000000..4bd44d5fbeb --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_storage.sql @@ -0,0 +1,474 @@ +--Create a heap table with partitions ( having diff storage parameters) + Create table pt_heap_tab(a int, b text, c int , d int, e numeric,success bool) with ( appendonly=false ) + + partition by list(b) + ( + partition abc values ('abc','abc1','abc2') with (appendonly=false), -- HEAP + partition def values ('def','def1','def3') with (appendonly=true, compresslevel=1), + partition ghi values ('ghi','ghi1','ghi2') with (appendonly=true), -- AO + default partition dft + ); + +--Create indexes on the table + -- Partial index + create index heap_idx1 on pt_heap_tab(a) where c > 10; + + -- Expression index + create index heap_idx2 on pt_heap_tab(upper(b)); + +--Drop partition + alter table pt_heap_tab drop default partition; + +--Add partition + alter table pt_heap_tab add partition xyz values ('xyz','xyz1','xyz2') WITH (appendonly=true, orientation=column, compresslevel=5); -- CO + + alter table pt_heap_tab add partition jkl values ('jkl','jkl1','jkl2') WITH (appendonly=true); -- AO + + alter table pt_heap_tab add partition mno values ('mno','mno1','mno2') WITH (appendonly=false); --Heap + +--Check properties of the added partition tables + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_heap_tab_1_prt_xyz', 'pt_heap_tab_1_prt_jkl','pt_heap_tab_1_prt_mno')); + +--Insert Data + insert into pt_heap_tab select 1, 'xyz', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'abc', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'def', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'ghi', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'jkl', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_heap_tab select 1, 'mno', 1, 1, 1.0 , true from generate_series(1, 10); + +--Split partition [Creates new partitions to be of the same type as the parent partition. All heap partitions created] + alter table pt_heap_tab split partition abc at ('abc1') into ( partition abc1,partition abc2); -- Heap + alter table pt_heap_tab split partition ghi at ('ghi1') into ( partition ghi1,partition ghi2); --AO + alter table pt_heap_tab split partition xyz at ('xyz1') into ( partition xyz1,partition xyz2); --CO + +--Check the storage type and properties of the split partition + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ('pt_heap_tab_1_prt_xyz1','pt_heap_tab_1_prt_xyz2','pt_heap_tab_1_prt_ghi1','pt_heap_tab_1_prt_ghi2','pt_heap_tab_1_prt_abc1','pt_heap_tab_1_prt_abc2')); + +--Exchange partition + -- Create candidate table + create table heap_can(like pt_heap_tab including indexes); + create table ao_can(like pt_heap_tab including indexes) with (appendonly=true); + create table co_can(like pt_heap_tab including indexes) with (appendonly=true,orientation=column); + + -- Exchange + alter table pt_heap_tab exchange partition for ('abc') with table ao_can ; -- Heap exchanged with AO + alter table pt_heap_tab add partition pqr values ('pqr','pqr1','pqr2') WITH (appendonly=true, orientation=column, compresslevel=5); + alter table pt_heap_tab exchange partition for ('def') with table co_can; -- AO exchanged with CO + alter table pt_heap_tab exchange partition for ('pqr') with table heap_can; -- CO exchanged with Heap + +--Check for the storage properties and indexes of the two tables involved in the exchange + \d+ heap_can + \d+ co_can + \d+ ao_can + +--Further operations + alter table pt_heap_tab drop partition jkl; + truncate table pt_heap_tab; + +--Further create some more indexes + create index heap_idx3 on pt_heap_tab(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX heap_idx4 ON pt_heap_tab ((b || ' ' || e)); --Expression + +--Add default partition + alter table pt_heap_tab add default partition dft; + +--Split default partition + alter table pt_heap_tab split default partition at ('uvw') into (partition dft, partition uvw); +--Create an AO table with partitions ( having diff storage parameters) + Create table pt_ao_tab(a int, b text, c int , d int, e numeric,success bool) with ( appendonly=true ) + + partition by list(b) + ( + partition abc values ('abc','abc1','abc2') with (appendonly=false), -- HEAP + partition def values ('def','def1','def3') with (appendonly=true, compresslevel=1), + partition ghi values ('ghi','ghi1','ghi2') with (appendonly=true), -- AO + default partition dft + ); + +--Create indexes on the table + -- Partial index + create index ao_idx1 on pt_ao_tab(a) where c > 10; + + -- Expression index + create index ao_idx2 on pt_ao_tab(upper(b)); + +--Drop partition + alter table pt_ao_tab drop default partition; + +--Add partition + alter table pt_ao_tab add partition xyz values ('xyz','xyz1','xyz2') WITH (appendonly=true,orientation=column,compresslevel=5); --CO + + alter table pt_ao_tab add partition jkl values ('jkl','jkl1','jkl2') WITH (appendonly=true); -- AO + + alter table pt_ao_tab add partition mno values ('mno','mno1','mno2') WITH (appendonly=false); --Heap + +--Check properties of the added partition tables + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_ao_tab_1_prt_xyz', 'pt_ao_tab_1_prt_jkl','pt_ao_tab_1_prt_mno')); + +--Insert Data + insert into pt_ao_tab select 1, 'xyz', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'abc', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'def', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'ghi', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'jkl', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_ao_tab select 1, 'mno', 1, 1, 1.0 , true from generate_series(1, 10); + +--Split partition [Creates new partitions to be of the same type as the parent partition. All heap partitions created] + alter table pt_ao_tab split partition abc at ('abc1') into ( partition abc1,partition abc2); -- Heap + alter table pt_ao_tab split partition ghi at ('ghi1') into ( partition ghi1,partition ghi2); --AO + alter table pt_ao_tab split partition xyz at ('xyz1') into ( partition xyz1,partition xyz2); --CO + +--Check the storage type and properties of the split partition + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in (select oid from pg_class where relname in ('pt_ao_tab_1_prt_xyz1','pt_ao_tab_1_prt_xyz2','pt_ao_tab_1_prt_ghi1','pt_ao_tab_1_prt_ghi2','pt_ao_tab_1_prt_abc1','pt_ao_tab_1_prt_abc2')); + +--Exchange partition + -- Create candidate table +--start_ignore +drop table if exists heap_can cascade; +drop table if exists ao_can cascade; +drop table if exists co_can cascade; +--end_ignore + + create table heap_can(like pt_ao_tab including indexes); + create table ao_can(like pt_ao_tab including indexes) with (appendonly=true); + create table co_can(like pt_ao_tab including indexes) with (appendonly=true,orientation=column); + + -- Exchange + alter table pt_ao_tab add partition pqr values ('pqr','pqr1','pqr2') WITH (appendonly=true,orientation=column,compresslevel=5);-- CO + alter table pt_ao_tab add partition stu values ('stu','stu1','stu2') WITH (appendonly=false);-- heap + alter table pt_ao_tab exchange partition for ('stu') with table ao_can ;-- Heap tab exchanged with AO + alter table pt_ao_tab exchange partition for ('def') with table co_can; --AO tab exchanged with CO + alter table pt_ao_tab exchange partition for ('pqr') with table heap_can; --CO tab exchanged with Heap + +--Check for the storage properties and indexes of the two tables involved in the exchange + \d+ heap_can + \d+ co_can + \d+ ao_can + +--Further operations + alter table pt_ao_tab drop partition jkl; + truncate table pt_ao_tab; + +--Further create some more indexes + create index ao_idx3 on pt_ao_tab(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX ao_idx4 ON pt_ao_tab ((b || ' ' || e)); --Expression + +--Add default partition + alter table pt_ao_tab add default partition dft; + +--Split default partition + alter table pt_ao_tab split default partition at ('uvw') into (partition dft, partition uvw); +--Create an CO table with partitions ( having diff storage parameters) +--start_ignore + drop table if exists pt_co_tab cascade; +--end_ignore +Create table pt_co_tab(a int, b text, c int , d int, e numeric,success bool) with ( appendonly = true, orientation = column) + + partition by list(b) + ( + partition abc values ('abc','abc1','abc2') with (appendonly=false), -- HEAP + partition def values ('def','def1','def3') with (appendonly=true, compresslevel=1), + partition ghi values ('ghi','ghi1','ghi2') with (appendonly=true), -- AO + default partition dft + ); + +--Create indexes on the table +--start_ignore +drop index if exists co_idx1 cascade; +drop index if exists co_idx2 cascade; +--end_ignore + -- Partial index + create index co_idx1 on pt_co_tab(a) where c > 10; + + -- Expression index + create index co_idx2 on pt_co_tab(upper(b)); + +--Drop partition + alter table pt_co_tab drop default partition; + +--Add partition + alter table pt_co_tab add partition xyz values ('xyz','xyz1','xyz2') WITH (appendonly=true,orientation=column,compresslevel=5); --CO + + alter table pt_co_tab add partition jkl values ('jkl','jkl1','jkl2') WITH (appendonly=true,compresslevel=1); -- AO + + alter table pt_co_tab add partition mno values ('mno','mno1','mno2') WITH (appendonly=false); --Heap + +--Check properties of the added partition tables + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_co_tab_1_prt_xyz', 'pt_co_tab_1_prt_jkl','pt_co_tab_1_prt_mno')); + +--Insert Data + insert into pt_co_tab select 1, 'xyz', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'abc', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'def', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'ghi', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'jkl', 1, 1, 1.0 , true from generate_series(1, 10); + insert into pt_co_tab select 1, 'mno', 1, 1, 1.0 , true from generate_series(1, 10); + +--Split partition [Creates new partitions to be of the same type as the parent partition. All heap partitions created] + alter table pt_co_tab split partition abc at ('abc1') into ( partition abc1,partition abc2); -- Heap + alter table pt_co_tab split partition ghi at ('ghi1') into ( partition ghi1,partition ghi2); --AO + alter table pt_co_tab split partition xyz at ('xyz1') into ( partition xyz1,partition xyz2); --CO + +--Check the storage type and properties of the split partition + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in (select oid from pg_class where relname in ('pt_co_tab_1_prt_xyz1','pt_co_tab_1_prt_xyz2','pt_co_tab_1_prt_ghi1','pt_co_tab_1_prt_ghi2','pt_co_tab_1_prt_abc1','pt_co_tab_1_prt_abc2')); + +--Exchange partition + -- Create candidate table +--start_ignore +drop table if exists heap_can cascade; +drop table if exists ao_can cascade; +drop table if exists co_can cascade; +--end_ignore + + create table heap_can(like pt_co_tab including indexes); + create table ao_can(like pt_co_tab including indexes) with (appendonly=true); + create table co_can(like pt_co_tab including indexes) with (appendonly=true,orientation=column); + + -- Exchange + alter table pt_co_tab add partition pqr values ('pqr','pqr1','pqr2') WITH (appendonly=true,compresslevel=5);-- AO + alter table pt_co_tab add partition stu values ('stu','stu1','stu2') WITH (appendonly=false);-- heap + alter table pt_co_tab exchange partition for ('stu') with table ao_can ; -- Heap exchanged with AO + alter table pt_co_tab exchange partition for ('pqr') with table co_can; -- AO exchanged with CO + alter table pt_co_tab exchange partition for ('xyz1') with table heap_can; -- CO exchanged with Heap + +--Check for the storage properties and indexes of the two tables involved in the exchange + \d+ heap_can + \d+ co_can + \d+ ao_can + +-- Further operations + alter table pt_co_tab drop partition jkl; + truncate table pt_co_tab; + +--Further create some more indexes + create index idx3 on pt_co_tab(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX idx5 ON pt_co_tab ((b || ' ' || e)); --Expression + +--Add default partition + alter table pt_co_tab add default partition dft; + +--Split default partition + alter table pt_co_tab split default partition at ('uvw') into (partition dft, partition uvw); +-- create range partitioned Heap table +--start_ignore + drop table if exists pt_heap_tab_rng cascade; +--end_ignore + CREATE TABLE pt_heap_tab_rng (a int, b text, c int , d int, e numeric,success bool) with (appendonly=false) + + partition by range(a) + ( + start(1) end(20) every(5), + default partition dft + ); + +-- Create indexes on the table + + -- partial index + create index heap_rng_idx1 on pt_heap_tab_rng(a) where c > 10; + + -- expression index + create index heap_rng_idx2 on pt_heap_tab_rng(upper(b)); + +-- Drop partition + Alter table pt_heap_tab_rng drop default partition; + +-- ADD partitions + alter table pt_heap_tab_rng add partition heap start(21) end(25) with (appendonly=false); + alter table pt_heap_tab_rng add partition ao start(25) end(30) with (appendonly=true); + alter table pt_heap_tab_rng add partition co start(31) end(35) with (appendonly=true,orientation=column); + + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_heap_tab_rng_1_prt_heap', 'pt_heap_tab_rng_1_prt_ao','pt_heap_tab_rng_1_prt_co')); + +-- Split partition + alter table pt_heap_tab_rng split partition heap at (23) into (partition heap1,partition heap2); + alter table pt_heap_tab_rng split partition ao at (27) into (partition ao1,partition ao2); + alter table pt_heap_tab_rng split partition co at (33) into (partition co1,partition co2); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_heap_tab_rng_1_prt_heap1' ,'pt_heap_tab_rng_1_prt_heap2' ,'pt_heap_tab_rng_1_prt_ao1', 'pt_heap_tab_rng_1_prt_ao2', 'pt_heap_tab_rng_1_prt_co1', 'pt_heap_tab_rng_1_prt_co2')); + +-- Exchange + -- Create candidate table +--start_ignore + drop table if exists heap_can; + drop table if exists ao_can; + drop table if exists co_can; +--end_ignore + + create table heap_can(like pt_heap_tab_rng including indexes); + create table ao_can(like pt_heap_tab_rng including indexes) with (appendonly=true); + create table co_can(like pt_heap_tab_rng including indexes) with (appendonly=true,orientation=column); + + alter table pt_heap_tab_rng add partition newco start(36) end(40) with (appendonly= true, orientation = column); + alter table pt_heap_tab_rng add partition newao start(40) end(45) with (appendonly= true); + + -- Exchange + + alter table pt_heap_tab_rng exchange partition heap1 with table ao_can; -- HEAP <=> AO + alter table pt_heap_tab_rng exchange partition newao with table co_can; -- AO <=> CO + alter table pt_heap_tab_rng exchange partition newco with table heap_can; -- CO <=> HEAP + + \d+ ao_can + \d+ co_can + \d+ heap_can +-- Create more index indexes + create index heap_rng_idx3 on pt_heap_tab_rng(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX heap_rng_idx4 ON pt_heap_tab_rng ((b || ' ' || e)); --Expression + +-- Add default partition + alter table pt_heap_tab_rng add default partition dft; + +--Split default partition + alter table pt_heap_tab_rng split default partition start(45) end(60) into (partition dft, partition two); +-- create range partitioned AO table +--start_ignore + drop table if exists pt_ao_tab_rng cascade; +--end_ignore + + CREATE TABLE pt_ao_tab_rng (a int, b text, c int , d int, e numeric,success bool) with (appendonly=true,compresstype=zlib, compresslevel=1) + + partition by range(a) + ( + start(1) end(20) every(5), + default partition dft + ); + +--Create indexes on the table + + -- partial index + create index ao_rng_idx1 on pt_ao_tab_rng(a) where c > 10; + + -- expression index + create index ao_rng_idx2 on pt_ao_tab_rng(upper(b)); + +--Drop partition + Alter table pt_ao_tab_rng drop default partition; + +--ADD partitions + alter table pt_ao_tab_rng add partition heap start(21) end(25) with (appendonly=false); + alter table pt_ao_tab_rng add partition ao start(25) end(30) with (appendonly=true); + alter table pt_ao_tab_rng add partition co start(31) end(35) with (appendonly=true,orientation=column); + + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_ao_tab_rng_1_prt_heap', 'pt_ao_tab_rng_1_prt_ao','pt_ao_tab_rng_1_prt_co')); + +--Split partition + alter table pt_ao_tab_rng split partition heap at (23) into (partition heap1,partition heap2); + alter table pt_ao_tab_rng split partition ao at (27) into (partition ao1,partition ao2); + alter table pt_ao_tab_rng split partition co at (33) into (partition co1,partition co2); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_ao_tab_rng_1_prt_heap1' ,'pt_ao_tab_rng_1_prt_heap2' ,'pt_ao_tab_rng_1_prt_ao1', 'pt_ao_tab_rng_1_prt_ao2', 'pt_ao_tab_rng_1_prt_co1', 'pt_ao_tab_rng_1_prt_co2')); + +--Exchange + -- Create candidate table +--start_ignore +drop table if exists heap_can cascade; +drop table if exists ao_can cascade; +drop table if exists co_can cascade; +--end_ignore + create table heap_can(like pt_ao_tab_rng including indexes); + create table ao_can(like pt_ao_tab_rng including indexes) with (appendonly=true); + create table co_can(like pt_ao_tab_rng including indexes) with (appendonly=true,orientation=column); + + alter table pt_ao_tab_rng add partition newco start(36) end(40) with (appendonly= true, orientation = column); + alter table pt_ao_tab_rng add partition newheap start(40) end(45) with (appendonly= false); + + -- Exchange + + alter table pt_ao_tab_rng exchange partition newheap with table ao_can; -- HEAP <=> AO + alter table pt_ao_tab_rng exchange partition ao1 with table co_can;-- AO <=> CO + alter table pt_ao_tab_rng exchange partition newco with table heap_can; --CO <=> HEAP + + \d+ ao_can + \d+ co_can + \d+ heap_can + +-- Create more index indexes + + create index ao_rng_idx3 on pt_ao_tab_rng(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX ao_rng_idx4 ON pt_ao_tab_rng ((b || ' ' || e)); --Expression + +--Add default partition + alter table pt_ao_tab_rng add default partition dft; + +--Split default partition + alter table pt_ao_tab_rng split default partition start(45) end(60) into (partition dft, partition two); +--create range partitioned CO table +--start_ignore + drop table if exists pt_co_tab_rng cascade; +--end_ignore + CREATE TABLE pt_co_tab_rng (a int, b text, c int , d int, e numeric,success bool) with (appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) + + partition by range(a) + ( + start(1) end(20) every(5), + default partition dft + ); + +--Create indexes on the table + + -- partial index + create index co_rng_idx1 on pt_co_tab_rng(a) where c > 10; + + -- expression index + create index co_rng_idx2 on pt_co_tab_rng(upper(b)); + +--Drop partition + Alter table pt_co_tab_rng drop default partition; + +--ADD partitions + alter table pt_co_tab_rng add partition heap start(21) end(25) with (appendonly=false); + alter table pt_co_tab_rng add partition ao start(25) end(30) with (appendonly=true); + alter table pt_co_tab_rng add partition co start(31) end(35) with (appendonly=true,orientation=column); + + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_co_tab_rng_1_prt_heap', 'pt_co_tab_rng_1_prt_ao','pt_co_tab_rng_1_prt_co')); + +--Split partition + alter table pt_co_tab_rng split partition heap at (23) into (partition heap1,partition heap2); + alter table pt_co_tab_rng split partition ao at (27) into (partition ao1,partition ao2); + alter table pt_co_tab_rng split partition co at (33) into (partition co1,partition co2); + select c.oid::regclass, relkind, amname, reloptions from pg_class c left join pg_am am on am.oid = c.relam + where c.oid in ( select oid from pg_class where relname in ( 'pt_co_tab_rng_1_prt_heap1' ,'pt_co_tab_rng_1_prt_heap2' ,'pt_co_tab_rng_1_prt_ao1', 'pt_co_tab_rng_1_prt_ao2', 'pt_co_tab_rng_1_prt_co1', 'pt_co_tab_rng_1_prt_co2')); + +--Exchange + -- Create candidate table +--start_ignore +drop table if exists heap_can cascade; +drop table if exists ao_can cascade; +drop table if exists co_can cascade; +--end_ignore + create table heap_can(like pt_co_tab_rng including indexes); + create table ao_can(like pt_co_tab_rng including indexes) with (appendonly=true); + create table co_can(like pt_co_tab_rng including indexes) with (appendonly=true,orientation=column); + + alter table pt_co_tab_rng add partition newao start(36) end(40) with (appendonly= true); + alter table pt_co_tab_rng add partition newheap start(40) end(45) with (appendonly= false); + + -- Exchange + + alter table pt_co_tab_rng exchange partition newheap with table ao_can;-- HEAP <=> AO + alter table pt_co_tab_rng exchange partition newao with table co_can; -- AO <=> CO + alter table pt_co_tab_rng exchange partition co1 with table heap_can; -- CO <=> HEAP + + \d+ ao_can + \d+ co_can + \d+ heap_can + +-- Create more index indexes + + create index co_rng_idx3 on pt_co_tab_rng(c,d) where a = 40 OR a = 50; -- multicol indx + CREATE INDEX co_rng_idx4 ON pt_co_tab_rng ((b || ' ' || e)); --Expression + +-- Add default partition + alter table pt_co_tab_rng add default partition dft; + +-- Split default partition + alter table pt_co_tab_rng split default partition start(45) end(60) into (partition dft, partition two); diff --git a/src/test/singlenode_regress/sql/partition_subquery.sql b/src/test/singlenode_regress/sql/partition_subquery.sql new file mode 100644 index 00000000000..9763327b6e1 --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_subquery.sql @@ -0,0 +1,20 @@ +CREATE SCHEMA partition_subquery; +SET SEARCH_PATH=partition_subquery; + +-- Given a partition table +CREATE TABLE pt1(id int) PARTITION BY RANGE (id) (DEFAULT PARTITION p1); + +-- When I run a query, outermost query, and it is selecting FROM a subquery +-- And that subquery, subquery 1, contains another subquery, subquery 2 +-- And the outermost query aggregates over a column from an inherited table +-- And the subquery 1 is prevented from being pulled up into a join +SELECT id FROM ( + SELECT id, sum(id) OVER() as sum_id FROM ( + SELECT id FROM pt1 + ) as sq1 +) as sq2 GROUP BY id; +-- Then, the query executes successfully + +--start_ignore +DROP TABLE IF EXISTS pt1; +--end_ignore diff --git a/src/test/singlenode_regress/sql/partition_unlogged.sql b/src/test/singlenode_regress/sql/partition_unlogged.sql new file mode 100644 index 00000000000..5a36e0641be --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_unlogged.sql @@ -0,0 +1,12 @@ +-- Given an unlogged partition table with two leaf partitions +CREATE UNLOGGED TABLE unlogged_pt1(a int) PARTITION BY RANGE(a) (START(1) END(4) EVERY (2)); +SELECT relpersistence, relname FROM pg_class WHERE relname like 'unlogged_pt1%'; +-- When I split the first partition +ALTER TABLE unlogged_pt1 SPLIT PARTITION FOR(2) AT(2) INTO (PARTITION p1, PARTITION p2); +-- Then the resulting two new relations have relation persistence type 'u' for unlogged +SELECT relpersistence, relname FROM pg_class WHERE relname like 'unlogged_pt1%'; + +-- Given a permanent table +CREATE TABLE perm_tab(a INT); +-- When I exchange partition 2 from unlogged_pt1 with this permanent table, perm_tab +ALTER TABLE unlogged_pt1 EXCHANGE PARTITION FOR (3) WITH TABLE perm_tab; diff --git a/src/test/singlenode_regress/sql/partition_with_user_defined_function.sql b/src/test/singlenode_regress/sql/partition_with_user_defined_function.sql new file mode 100644 index 00000000000..82f6ce8eea0 --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_with_user_defined_function.sql @@ -0,0 +1,27 @@ +CREATE SCHEMA IF NOT EXISTS partition_with_user_defined_function; + +-- Given there is a partitioned table + create table partition_with_user_defined_function.some_partitioned_table + ( + a integer + ) + partition by range (a) ( + partition b start (0) + ); + +-- And a function that queried the partitioned table + CREATE OR REPLACE FUNCTION partition_with_user_defined_function.query_a_partition_table() RETURNS VOID AS + $$ + BEGIN + PERFORM * FROM partition_with_user_defined_function.some_partitioned_table; + END; + $$ LANGUAGE plpgsql; + +-- When I call the function twice + select partition_with_user_defined_function.query_a_partition_table(); + +-- Then I get the same result both times (no rows) +-- Note: We're using a cached plan that includes a Dynamic Seq Scan. +-- Ensure the dynamic table scan information in the cached plan does not get freed. + select partition_with_user_defined_function.query_a_partition_table(); + diff --git a/src/test/singlenode_regress/sql/partition_with_user_defined_function_that_truncates.sql b/src/test/singlenode_regress/sql/partition_with_user_defined_function_that_truncates.sql new file mode 100644 index 00000000000..c373df07e8e --- /dev/null +++ b/src/test/singlenode_regress/sql/partition_with_user_defined_function_that_truncates.sql @@ -0,0 +1,31 @@ +-- Given there is a partitioned table + create table some_partitioned_table_to_truncate + ( + a integer + ) + partition by range (a) ( + partition b start (0) + ); + +-- And a function that truncates the partitioned table + CREATE OR REPLACE FUNCTION truncate_a_partition_table() RETURNS VOID AS + $$ + BEGIN + TRUNCATE some_partitioned_table_to_truncate; + END; + $$ LANGUAGE plpgsql; + +-- When I truncate the table twice + insert into some_partitioned_table_to_truncate + select i from generate_series(1, 10) i; + select count(*) from some_partitioned_table_to_truncate; + select truncate_a_partition_table(); + select count(*) from some_partitioned_table_to_truncate; + +-- Then I get the same result both times (no rows) + insert into some_partitioned_table_to_truncate + select i from generate_series(1, 10) i; + select count(*) from some_partitioned_table_to_truncate; + select truncate_a_partition_table(); + select count(*) from some_partitioned_table_to_truncate; + diff --git a/src/test/singlenode_regress/sql/password.sql b/src/test/singlenode_regress/sql/password.sql new file mode 100644 index 00000000000..98f49916e5d --- /dev/null +++ b/src/test/singlenode_regress/sql/password.sql @@ -0,0 +1,109 @@ +-- +-- Tests for password types +-- + +-- Tests for GUC password_encryption +SET password_encryption = 'novalue'; -- error +SET password_encryption = true; -- error +SET password_encryption = 'md5'; -- ok +SET password_encryption = 'scram-sha-256'; -- ok + +-- consistency of password entries +SET password_encryption = 'md5'; +CREATE ROLE regress_passwd1 PASSWORD 'role_pwd1'; +CREATE ROLE regress_passwd2 PASSWORD 'role_pwd2'; +SET password_encryption = 'scram-sha-256'; +CREATE ROLE regress_passwd3 PASSWORD 'role_pwd3'; +CREATE ROLE regress_passwd4 PASSWORD NULL; + +-- check list of created entries +-- +-- The scram secret will look something like: +-- SCRAM-SHA-256$4096:E4HxLGtnRzsYwg==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo= +-- +-- Since the salt is random, the exact value stored will be different on every test +-- run. Use a regular expression to mask the changing parts. +SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:$:') as rolpassword_masked + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; + +-- Rename a role +ALTER ROLE regress_passwd2 RENAME TO regress_passwd2_new; +-- md5 entry should have been removed +SELECT rolname, rolpassword + FROM pg_authid + WHERE rolname LIKE 'regress_passwd2_new' + ORDER BY rolname, rolpassword; +ALTER ROLE regress_passwd2_new RENAME TO regress_passwd2; + +-- Change passwords with ALTER USER. With plaintext or already-encrypted +-- passwords. +SET password_encryption = 'md5'; + +-- encrypt with MD5 +ALTER ROLE regress_passwd2 PASSWORD 'foo'; +-- already encrypted, use as they are +ALTER ROLE regress_passwd1 PASSWORD 'md5cd3578025fe2c3d7ed1b9a9b26238b70'; +ALTER ROLE regress_passwd3 PASSWORD 'SCRAM-SHA-256$4096:VLK4RMaQLCvNtQ==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo='; + +SET password_encryption = 'scram-sha-256'; +-- create SCRAM secret +ALTER ROLE regress_passwd4 PASSWORD 'foo'; +-- already encrypted with MD5, use as it is +CREATE ROLE regress_passwd5 PASSWORD 'md5e73a4b11df52a6068f8b39f90be36023'; + +-- This looks like a valid SCRAM-SHA-256 secret, but it is not +-- so it should be hashed with SCRAM-SHA-256. +CREATE ROLE regress_passwd6 PASSWORD 'SCRAM-SHA-256$1234'; +-- These may look like valid MD5 secrets, but they are not, so they +-- should be hashed with SCRAM-SHA-256. +-- trailing garbage at the end +CREATE ROLE regress_passwd7 PASSWORD 'md5012345678901234567890123456789zz'; +-- invalid length +CREATE ROLE regress_passwd8 PASSWORD 'md501234567890123456789012345678901zz'; + +SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:$:') as rolpassword_masked + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; + +-- An empty password is not allowed, in any form +CREATE ROLE regress_passwd_empty PASSWORD ''; +ALTER ROLE regress_passwd_empty PASSWORD 'md585939a5ce845f1a1b620742e3c659e0a'; +ALTER ROLE regress_passwd_empty PASSWORD 'SCRAM-SHA-256$4096:hpFyHTUsSWcR7O9P$LgZFIt6Oqdo27ZFKbZ2nV+vtnYM995pDh9ca6WSi120=:qVV5NeluNfUPkwm7Vqat25RjSPLkGeoZBQs6wVv+um4='; +SELECT rolpassword FROM pg_authid WHERE rolname='regress_passwd_empty'; + +-- Test with invalid stored and server keys. +-- +-- The first is valid, to act as a control. The others have too long +-- stored/server keys. They will be re-hashed. +CREATE ROLE regress_passwd_sha_len0 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI='; +CREATE ROLE regress_passwd_sha_len1 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96RqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI='; +CREATE ROLE regress_passwd_sha_len2 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; + +-- Check that the invalid secrets were re-hashed. A re-hashed secret +-- should not contain the original salt. +SELECT rolname, rolpassword not like '%A6xHKoH/494E941doaPOYg==%' as is_rolpassword_rehashed + FROM pg_authid + WHERE rolname LIKE 'regress_passwd_sha_len%' + ORDER BY rolname; + +DROP ROLE regress_passwd1; +DROP ROLE regress_passwd2; +DROP ROLE regress_passwd3; +DROP ROLE regress_passwd4; +DROP ROLE regress_passwd5; +DROP ROLE regress_passwd6; +DROP ROLE regress_passwd7; +DROP ROLE regress_passwd8; +DROP ROLE regress_passwd_empty; +DROP ROLE regress_passwd_sha_len0; +DROP ROLE regress_passwd_sha_len1; +DROP ROLE regress_passwd_sha_len2; + +-- all entries should have been removed +SELECT rolname, rolpassword + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; diff --git a/src/test/singlenode_regress/sql/path.sql b/src/test/singlenode_regress/sql/path.sql new file mode 100644 index 00000000000..89f1aa9a329 --- /dev/null +++ b/src/test/singlenode_regress/sql/path.sql @@ -0,0 +1,44 @@ +-- +-- PATH +-- + +--DROP TABLE PATH_TBL; + +CREATE TABLE PATH_TBL (f1 path); + +INSERT INTO PATH_TBL VALUES ('[(1,2),(3,4)]'); + +INSERT INTO PATH_TBL VALUES (' ( ( 1 , 2 ) , ( 3 , 4 ) ) '); + +INSERT INTO PATH_TBL VALUES ('[ (0,0),(3,0),(4,5),(1,6) ]'); + +INSERT INTO PATH_TBL VALUES ('((1,2) ,(3,4 ))'); + +INSERT INTO PATH_TBL VALUES ('1,2 ,3,4 '); + +INSERT INTO PATH_TBL VALUES (' [1,2,3, 4] '); + +INSERT INTO PATH_TBL VALUES ('((10,20))'); -- Only one point + +INSERT INTO PATH_TBL VALUES ('[ 11,12,13,14 ]'); + +INSERT INTO PATH_TBL VALUES ('( 11,12,13,14) '); + +-- bad values for parser testing +INSERT INTO PATH_TBL VALUES ('[]'); + +INSERT INTO PATH_TBL VALUES ('[(,2),(3,4)]'); + +INSERT INTO PATH_TBL VALUES ('[(1,2),(3,4)'); + +INSERT INTO PATH_TBL VALUES ('(1,2,3,4'); + +INSERT INTO PATH_TBL VALUES ('(1,2),(3,4)]'); + +SELECT f1 AS open_path FROM PATH_TBL WHERE isopen(f1); + +SELECT f1 AS closed_path FROM PATH_TBL WHERE isclosed(f1); + +SELECT pclose(f1) AS closed_path FROM PATH_TBL; + +SELECT popen(f1) AS open_path FROM PATH_TBL; diff --git a/src/test/singlenode_regress/sql/pg_lsn.sql b/src/test/singlenode_regress/sql/pg_lsn.sql new file mode 100644 index 00000000000..615368ba960 --- /dev/null +++ b/src/test/singlenode_regress/sql/pg_lsn.sql @@ -0,0 +1,56 @@ +-- +-- PG_LSN +-- + +CREATE TABLE PG_LSN_TBL (f1 pg_lsn); + +-- Largest and smallest input +INSERT INTO PG_LSN_TBL VALUES ('0/0'); +INSERT INTO PG_LSN_TBL VALUES ('FFFFFFFF/FFFFFFFF'); + +-- Incorrect input +INSERT INTO PG_LSN_TBL VALUES ('G/0'); +INSERT INTO PG_LSN_TBL VALUES ('-1/0'); +INSERT INTO PG_LSN_TBL VALUES (' 0/12345678'); +INSERT INTO PG_LSN_TBL VALUES ('ABCD/'); +INSERT INTO PG_LSN_TBL VALUES ('/ABCD'); + +-- Min/Max aggregation +SELECT MIN(f1), MAX(f1) FROM PG_LSN_TBL; + +DROP TABLE PG_LSN_TBL; + +-- Operators +SELECT '0/16AE7F8' = '0/16AE7F8'::pg_lsn; +SELECT '0/16AE7F8'::pg_lsn != '0/16AE7F7'; +SELECT '0/16AE7F7' < '0/16AE7F8'::pg_lsn; +SELECT '0/16AE7F8' > pg_lsn '0/16AE7F7'; +SELECT '0/16AE7F7'::pg_lsn - '0/16AE7F8'::pg_lsn; +SELECT '0/16AE7F8'::pg_lsn - '0/16AE7F7'::pg_lsn; +SELECT '0/16AE7F7'::pg_lsn + 16::numeric; +SELECT 16::numeric + '0/16AE7F7'::pg_lsn; +SELECT '0/16AE7F7'::pg_lsn - 16::numeric; +SELECT 'FFFFFFFF/FFFFFFFE'::pg_lsn + 1::numeric; +SELECT 'FFFFFFFF/FFFFFFFE'::pg_lsn + 2::numeric; -- out of range error +SELECT '0/1'::pg_lsn - 1::numeric; +SELECT '0/1'::pg_lsn - 2::numeric; -- out of range error +SELECT '0/0'::pg_lsn + ('FFFFFFFF/FFFFFFFF'::pg_lsn - '0/0'::pg_lsn); +SELECT 'FFFFFFFF/FFFFFFFF'::pg_lsn - ('FFFFFFFF/FFFFFFFF'::pg_lsn - '0/0'::pg_lsn); +SELECT '0/16AE7F7'::pg_lsn + 'NaN'::numeric; +SELECT '0/16AE7F7'::pg_lsn - 'NaN'::numeric; + +-- Check btree and hash opclasses +EXPLAIN (COSTS OFF) +SELECT DISTINCT (i || '/' || j)::pg_lsn f + FROM generate_series(1, 10) i, + generate_series(1, 10) j, + generate_series(1, 5) k + WHERE i <= 10 AND j > 0 AND j <= 10 + ORDER BY f; + +SELECT DISTINCT (i || '/' || j)::pg_lsn f + FROM generate_series(1, 10) i, + generate_series(1, 10) j, + generate_series(1, 5) k + WHERE i <= 10 AND j > 0 AND j <= 10 + ORDER BY f; diff --git a/src/test/singlenode_regress/sql/plancache.sql b/src/test/singlenode_regress/sql/plancache.sql new file mode 100644 index 00000000000..4b2f11dcc64 --- /dev/null +++ b/src/test/singlenode_regress/sql/plancache.sql @@ -0,0 +1,225 @@ +-- +-- Tests to exercise the plan caching/invalidation mechanism +-- + +CREATE TEMP TABLE pcachetest AS SELECT * FROM int8_tbl; + +-- create and use a cached plan +PREPARE prepstmt AS SELECT * FROM pcachetest; + +EXECUTE prepstmt; + +-- and one with parameters +PREPARE prepstmt2(bigint) AS SELECT * FROM pcachetest WHERE q1 = $1; + +EXECUTE prepstmt2(123); + +-- invalidate the plans and see what happens +DROP TABLE pcachetest; + +EXECUTE prepstmt; +EXECUTE prepstmt2(123); + +-- recreate the temp table (this demonstrates that the raw plan is +-- purely textual and doesn't depend on OIDs, for instance) +CREATE TEMP TABLE pcachetest AS SELECT * FROM int8_tbl ORDER BY 2; + +EXECUTE prepstmt; +EXECUTE prepstmt2(123); + +-- prepared statements should prevent change in output tupdesc, +-- since clients probably aren't expecting that to change on the fly +ALTER TABLE pcachetest ADD COLUMN q3 bigint; + +EXECUTE prepstmt; +EXECUTE prepstmt2(123); + +-- but we're nice guys and will let you undo your mistake +ALTER TABLE pcachetest DROP COLUMN q3; + +EXECUTE prepstmt; +EXECUTE prepstmt2(123); + +-- Try it with a view, which isn't directly used in the resulting plan +-- but should trigger invalidation anyway +CREATE TEMP VIEW pcacheview AS + SELECT * FROM pcachetest; + +PREPARE vprep AS SELECT * FROM pcacheview; + +EXECUTE vprep; + +CREATE OR REPLACE TEMP VIEW pcacheview AS + SELECT q1, q2/2 AS q2 FROM pcachetest; + +EXECUTE vprep; + +-- Check basic SPI plan invalidation + +create function cache_test(int) returns int as $$ +declare total int; +begin + create temp table t1(f1 int); + insert into t1 values($1); + insert into t1 values(11); + insert into t1 values(12); + insert into t1 values(13); + select sum(f1) into total from t1; + drop table t1; + return total; +end +$$ language plpgsql; + +select cache_test(1); +select cache_test(2); +select cache_test(3); + +-- Check invalidation of plpgsql "simple expression" + +create temp view v1 as + select 2+2 as f1; + +create function cache_test_2() returns int as $$ +begin + return f1 from v1; +end$$ language plpgsql; + +select cache_test_2(); + +create or replace temp view v1 as + select 2+2+4 as f1; +select cache_test_2(); + +create or replace temp view v1 as + select 2+2+4+(select max(unique1) from tenk1) as f1; +select cache_test_2(); + +--- Check that change of search_path is honored when re-using cached plan + +create schema s1 + create table abc (f1 int); + +create schema s2 + create table abc (f1 int); + +insert into s1.abc values(123); +insert into s2.abc values(456); + +set search_path = s1; + +prepare p1 as select f1 from abc; + +execute p1; + +set search_path = s2; + +select f1 from abc; + +execute p1; + +alter table s1.abc add column f2 float8; -- force replan + +execute p1; + +drop schema s1 cascade; +drop schema s2 cascade; + +reset search_path; + +-- Check that invalidation deals with regclass constants + +create temp sequence seq; + +prepare p2 as select nextval('seq'); + +execute p2; + +drop sequence seq; + +create temp sequence seq; + +execute p2; + +-- Check DDL via SPI, immediately followed by SPI plan re-use +-- (bug in original coding) + +create function cachebug() returns void as $$ +declare r int; +begin + drop table if exists temptable cascade; + create temp table temptable as select * from generate_series(1,3) as f1; + create temp view vv as select * from temptable; + for r in select * from vv loop + raise notice '%', r; + end loop; +end$$ language plpgsql; + +select cachebug(); +select cachebug(); + +-- Check that addition or removal of any partition is correctly dealt with by +-- default partition table when it is being used in prepared statement. +create table pc_list_parted (a int) partition by list(a); +create table pc_list_part_null partition of pc_list_parted for values in (null); +create table pc_list_part_1 partition of pc_list_parted for values in (1); +create table pc_list_part_def partition of pc_list_parted default; +prepare pstmt_def_insert (int) as insert into pc_list_part_def values($1); +-- should fail +execute pstmt_def_insert(null); +execute pstmt_def_insert(1); +create table pc_list_part_2 partition of pc_list_parted for values in (2); +execute pstmt_def_insert(2); +alter table pc_list_parted detach partition pc_list_part_null; +-- should be ok +execute pstmt_def_insert(null); +drop table pc_list_part_1; +-- should be ok +execute pstmt_def_insert(1); +drop table pc_list_parted, pc_list_part_null; +deallocate pstmt_def_insert; + +-- Test plan_cache_mode + +create table test_mode (a int); +insert into test_mode select 1 from generate_series(1,1000) union all select 2; +create index on test_mode (a); +analyze test_mode; + +prepare test_mode_pp (int) as select count(*) from test_mode where a = $1; +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + +-- up to 5 executions, custom plan is used +set plan_cache_mode to auto; +explain (costs off) execute test_mode_pp(2); +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + +-- force generic plan +set plan_cache_mode to force_generic_plan; +explain (costs off) execute test_mode_pp(2); +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + +-- get to generic plan by 5 executions +set plan_cache_mode to auto; +execute test_mode_pp(1); -- 1x +execute test_mode_pp(1); -- 2x +execute test_mode_pp(1); -- 3x +execute test_mode_pp(1); -- 4x +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; +execute test_mode_pp(1); -- 5x +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + +-- we should now get a really bad plan +explain (costs off) execute test_mode_pp(2); + +-- but we can force a custom plan +set plan_cache_mode to force_custom_plan; +explain (costs off) execute test_mode_pp(2); +select name, generic_plans, custom_plans from pg_prepared_statements + where name = 'test_mode_pp'; + +drop table test_mode; diff --git a/src/test/singlenode_regress/sql/plpgsql.sql b/src/test/singlenode_regress/sql/plpgsql.sql new file mode 100644 index 00000000000..0f82595d783 --- /dev/null +++ b/src/test/singlenode_regress/sql/plpgsql.sql @@ -0,0 +1,4298 @@ +-- +-- PLPGSQL +-- +-- Scenario: +-- +-- A building with a modern TP cable installation where any +-- of the wall connectors can be used to plug in phones, +-- ethernet interfaces or local office hubs. The backside +-- of the wall connectors is wired to one of several patch- +-- fields in the building. +-- +-- In the patchfields, there are hubs and all the slots +-- representing the wall connectors. In addition there are +-- slots that can represent a phone line from the central +-- phone system. +-- +-- Triggers ensure consistency of the patching information. +-- +-- Functions are used to build up powerful views that let +-- you look behind the wall when looking at a patchfield +-- or into a room. +-- + + +create table Room ( + roomno char(8), + comment text +); + +create unique index Room_rno on Room using btree (roomno bpchar_ops); + + +create table WSlot ( + slotname char(20), + roomno char(8), + slotlink char(20), + backlink char(20) +); + +create unique index WSlot_name on WSlot using btree (slotname bpchar_ops); + + +create table PField ( + name text, + comment text +); + +create unique index PField_name on PField using btree (name text_ops); + + +create table PSlot ( + slotname char(20), + pfname text, + slotlink char(20), + backlink char(20) +); + +create unique index PSlot_name on PSlot using btree (slotname bpchar_ops); + + +create table PLine ( + slotname char(20), + phonenumber char(20), + comment text, + backlink char(20) +); + +create unique index PLine_name on PLine using btree (slotname bpchar_ops); + + +create table Hub ( + name char(14), + comment text, + nslots integer +); + +create unique index Hub_name on Hub using btree (name bpchar_ops); + + +create table HSlot ( + slotname char(20), + hubname char(14), + slotno integer, + slotlink char(20) +); + +create unique index HSlot_name on HSlot using btree (slotname bpchar_ops); +create index HSlot_hubname on HSlot using btree (hubname bpchar_ops); + + +create table System ( + name text, + comment text +); + +create unique index System_name on System using btree (name text_ops); + + +create table IFace ( + slotname char(20), + sysname text, + ifname text, + slotlink char(20) +); + +create unique index IFace_name on IFace using btree (slotname bpchar_ops); + + +create table PHone ( + slotname char(20), + comment text, + slotlink char(20) +); + +create unique index PHone_name on PHone using btree (slotname bpchar_ops); + + +-- ************************************************************ +-- * +-- * Trigger procedures and functions for the patchfield +-- * test of PL/pgSQL +-- * +-- ************************************************************ + + +-- ************************************************************ +-- * AFTER UPDATE on Room +-- * - If room no changes let wall slots follow +-- ************************************************************ +create function tg_room_au() returns trigger as ' +begin + if new.roomno != old.roomno then + update WSlot set roomno = new.roomno where roomno = old.roomno; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_room_au after update + on Room for each row execute procedure tg_room_au(); + + +-- ************************************************************ +-- * AFTER DELETE on Room +-- * - delete wall slots in this room +-- ************************************************************ +create function tg_room_ad() returns trigger as ' +begin + delete from WSlot where roomno = old.roomno; + return old; +end; +' language plpgsql; + +create trigger tg_room_ad after delete + on Room for each row execute procedure tg_room_ad(); + + +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on WSlot +-- * - Check that room exists +-- ************************************************************ +create function tg_wslot_biu() returns trigger as $$ +begin + if count(*) = 0 from Room where roomno = new.roomno then + raise exception 'Room % does not exist', new.roomno; + end if; + return new; +end; +$$ language plpgsql; + +create trigger tg_wslot_biu before insert or update + on WSlot for each row execute procedure tg_wslot_biu(); + + +-- ************************************************************ +-- * AFTER UPDATE on PField +-- * - Let PSlots of this field follow +-- ************************************************************ +create function tg_pfield_au() returns trigger as ' +begin + if new.name != old.name then + update PSlot set pfname = new.name where pfname = old.name; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_pfield_au after update + on PField for each row execute procedure tg_pfield_au(); + + +-- ************************************************************ +-- * AFTER DELETE on PField +-- * - Remove all slots of this patchfield +-- ************************************************************ +create function tg_pfield_ad() returns trigger as ' +begin + delete from PSlot where pfname = old.name; + return old; +end; +' language plpgsql; + +create trigger tg_pfield_ad after delete + on PField for each row execute procedure tg_pfield_ad(); + + +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on PSlot +-- * - Ensure that our patchfield does exist +-- ************************************************************ +create function tg_pslot_biu() returns trigger as $proc$ +declare + pfrec record; + ps alias for new; +begin + select into pfrec * from PField where name = ps.pfname; + if not found then + raise exception $$Patchfield "%" does not exist$$, ps.pfname; + end if; + return ps; +end; +$proc$ language plpgsql; + +create trigger tg_pslot_biu before insert or update + on PSlot for each row execute procedure tg_pslot_biu(); + + +-- ************************************************************ +-- * AFTER UPDATE on System +-- * - If system name changes let interfaces follow +-- ************************************************************ +create function tg_system_au() returns trigger as ' +begin + if new.name != old.name then + update IFace set sysname = new.name where sysname = old.name; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_system_au after update + on System for each row execute procedure tg_system_au(); + + +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on IFace +-- * - set the slotname to IF.sysname.ifname +-- ************************************************************ +create function tg_iface_biu() returns trigger as $$ +declare + sname text; + sysrec record; +begin + select into sysrec * from system where name = new.sysname; + if not found then + raise exception $q$system "%" does not exist$q$, new.sysname; + end if; + sname := 'IF.' || new.sysname; + sname := sname || '.'; + sname := sname || new.ifname; + if length(sname) > 20 then + raise exception 'IFace slotname "%" too long (20 char max)', sname; + end if; + new.slotname := sname; + return new; +end; +$$ language plpgsql; + +create trigger tg_iface_biu before insert or update + on IFace for each row execute procedure tg_iface_biu(); + + +-- ************************************************************ +-- * AFTER INSERT or UPDATE or DELETE on Hub +-- * - insert/delete/rename slots as required +-- ************************************************************ +create function tg_hub_a() returns trigger as ' +declare + hname text; + dummy integer; +begin + if tg_op = ''INSERT'' then + dummy := tg_hub_adjustslots(new.name, 0, new.nslots); + return new; + end if; + if tg_op = ''UPDATE'' then + if new.name != old.name then + update HSlot set hubname = new.name where hubname = old.name; + end if; + dummy := tg_hub_adjustslots(new.name, old.nslots, new.nslots); + return new; + end if; + if tg_op = ''DELETE'' then + dummy := tg_hub_adjustslots(old.name, old.nslots, 0); + return old; + end if; +end; +' language plpgsql; + +create trigger tg_hub_a after insert or update or delete + on Hub for each row execute procedure tg_hub_a(); + + +-- ************************************************************ +-- * Support function to add/remove slots of Hub +-- ************************************************************ +create function tg_hub_adjustslots(hname bpchar, + oldnslots integer, + newnslots integer) +returns integer as ' +begin + if newnslots = oldnslots then + return 0; + end if; + if newnslots < oldnslots then + delete from HSlot where hubname = hname and slotno > newnslots; + return 0; + end if; + for i in oldnslots + 1 .. newnslots loop + insert into HSlot (slotname, hubname, slotno, slotlink) + values (''HS.dummy'', hname, i, ''''); + end loop; + return 0; +end +' language plpgsql; + +-- Test comments +COMMENT ON FUNCTION tg_hub_adjustslots_wrong(bpchar, integer, integer) IS 'function with args'; +COMMENT ON FUNCTION tg_hub_adjustslots(bpchar, integer, integer) IS 'function with args'; +COMMENT ON FUNCTION tg_hub_adjustslots(bpchar, integer, integer) IS NULL; + +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on HSlot +-- * - prevent from manual manipulation +-- * - set the slotname to HS.hubname.slotno +-- ************************************************************ +create function tg_hslot_biu() returns trigger as ' +declare + sname text; + xname HSlot.slotname%TYPE; + hubrec record; +begin + select into hubrec * from Hub where name = new.hubname; + if not found then + raise exception ''no manual manipulation of HSlot''; + end if; + if new.slotno < 1 or new.slotno > hubrec.nslots then + raise exception ''no manual manipulation of HSlot''; + end if; + if tg_op = ''UPDATE'' and new.hubname != old.hubname then + if count(*) > 0 from Hub where name = old.hubname then + raise exception ''no manual manipulation of HSlot''; + end if; + end if; + sname := ''HS.'' || trim(new.hubname); + sname := sname || ''.''; + sname := sname || new.slotno::text; + if length(sname) > 20 then + raise exception ''HSlot slotname "%" too long (20 char max)'', sname; + end if; + new.slotname := sname; + return new; +end; +' language plpgsql; + +create trigger tg_hslot_biu before insert or update + on HSlot for each row execute procedure tg_hslot_biu(); + + +-- ************************************************************ +-- * BEFORE DELETE on HSlot +-- * - prevent from manual manipulation +-- ************************************************************ +create function tg_hslot_bd() returns trigger as ' +declare + hubrec record; +begin + select into hubrec * from Hub where name = old.hubname; + if not found then + return old; + end if; + if old.slotno > hubrec.nslots then + return old; + end if; + raise exception ''no manual manipulation of HSlot''; +end; +' language plpgsql; + +create trigger tg_hslot_bd before delete + on HSlot for each row execute procedure tg_hslot_bd(); + + +-- ************************************************************ +-- * BEFORE INSERT on all slots +-- * - Check name prefix +-- ************************************************************ +create function tg_chkslotname() returns trigger as ' +begin + if substr(new.slotname, 1, 2) != tg_argv[0] then + raise exception ''slotname must begin with %'', tg_argv[0]; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_chkslotname before insert + on PSlot for each row execute procedure tg_chkslotname('PS'); + +create trigger tg_chkslotname before insert + on WSlot for each row execute procedure tg_chkslotname('WS'); + +create trigger tg_chkslotname before insert + on PLine for each row execute procedure tg_chkslotname('PL'); + +create trigger tg_chkslotname before insert + on IFace for each row execute procedure tg_chkslotname('IF'); + +create trigger tg_chkslotname before insert + on PHone for each row execute procedure tg_chkslotname('PH'); + + +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on all slots with slotlink +-- * - Set slotlink to empty string if NULL value given +-- ************************************************************ +create function tg_chkslotlink() returns trigger as ' +begin + if new.slotlink isnull then + new.slotlink := ''''; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_chkslotlink before insert or update + on PSlot for each row execute procedure tg_chkslotlink(); + +create trigger tg_chkslotlink before insert or update + on WSlot for each row execute procedure tg_chkslotlink(); + +create trigger tg_chkslotlink before insert or update + on IFace for each row execute procedure tg_chkslotlink(); + +create trigger tg_chkslotlink before insert or update + on HSlot for each row execute procedure tg_chkslotlink(); + +create trigger tg_chkslotlink before insert or update + on PHone for each row execute procedure tg_chkslotlink(); + + +-- ************************************************************ +-- * BEFORE INSERT or UPDATE on all slots with backlink +-- * - Set backlink to empty string if NULL value given +-- ************************************************************ +create function tg_chkbacklink() returns trigger as ' +begin + if new.backlink isnull then + new.backlink := ''''; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_chkbacklink before insert or update + on PSlot for each row execute procedure tg_chkbacklink(); + +create trigger tg_chkbacklink before insert or update + on WSlot for each row execute procedure tg_chkbacklink(); + +create trigger tg_chkbacklink before insert or update + on PLine for each row execute procedure tg_chkbacklink(); + + +-- ************************************************************ +-- * BEFORE UPDATE on PSlot +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_pslot_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from PSlot where slotname = old.slotname; + insert into PSlot ( + slotname, + pfname, + slotlink, + backlink + ) values ( + new.slotname, + new.pfname, + new.slotlink, + new.backlink + ); + return null; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_pslot_bu before update + on PSlot for each row execute procedure tg_pslot_bu(); + + +-- ************************************************************ +-- * BEFORE UPDATE on WSlot +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_wslot_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from WSlot where slotname = old.slotname; + insert into WSlot ( + slotname, + roomno, + slotlink, + backlink + ) values ( + new.slotname, + new.roomno, + new.slotlink, + new.backlink + ); + return null; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_wslot_bu before update + on WSlot for each row execute procedure tg_Wslot_bu(); + + +-- ************************************************************ +-- * BEFORE UPDATE on PLine +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_pline_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from PLine where slotname = old.slotname; + insert into PLine ( + slotname, + phonenumber, + comment, + backlink + ) values ( + new.slotname, + new.phonenumber, + new.comment, + new.backlink + ); + return null; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_pline_bu before update + on PLine for each row execute procedure tg_pline_bu(); + + +-- ************************************************************ +-- * BEFORE UPDATE on IFace +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_iface_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from IFace where slotname = old.slotname; + insert into IFace ( + slotname, + sysname, + ifname, + slotlink + ) values ( + new.slotname, + new.sysname, + new.ifname, + new.slotlink + ); + return null; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_iface_bu before update + on IFace for each row execute procedure tg_iface_bu(); + + +-- ************************************************************ +-- * BEFORE UPDATE on HSlot +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_hslot_bu() returns trigger as ' +begin + if new.slotname != old.slotname or new.hubname != old.hubname then + delete from HSlot where slotname = old.slotname; + insert into HSlot ( + slotname, + hubname, + slotno, + slotlink + ) values ( + new.slotname, + new.hubname, + new.slotno, + new.slotlink + ); + return null; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_hslot_bu before update + on HSlot for each row execute procedure tg_hslot_bu(); + + +-- ************************************************************ +-- * BEFORE UPDATE on PHone +-- * - do delete/insert instead of update if name changes +-- ************************************************************ +create function tg_phone_bu() returns trigger as ' +begin + if new.slotname != old.slotname then + delete from PHone where slotname = old.slotname; + insert into PHone ( + slotname, + comment, + slotlink + ) values ( + new.slotname, + new.comment, + new.slotlink + ); + return null; + end if; + return new; +end; +' language plpgsql; + +create trigger tg_phone_bu before update + on PHone for each row execute procedure tg_phone_bu(); + + +-- ************************************************************ +-- * AFTER INSERT or UPDATE or DELETE on slot with backlink +-- * - Ensure that the opponent correctly points back to us +-- ************************************************************ +create function tg_backlink_a() returns trigger as ' +declare + dummy integer; +begin + if tg_op = ''INSERT'' then + if new.backlink != '''' then + dummy := tg_backlink_set(new.backlink, new.slotname); + end if; + return new; + end if; + if tg_op = ''UPDATE'' then + if new.backlink != old.backlink then + if old.backlink != '''' then + dummy := tg_backlink_unset(old.backlink, old.slotname); + end if; + if new.backlink != '''' then + dummy := tg_backlink_set(new.backlink, new.slotname); + end if; + else + if new.slotname != old.slotname and new.backlink != '''' then + dummy := tg_slotlink_set(new.backlink, new.slotname); + end if; + end if; + return new; + end if; + if tg_op = ''DELETE'' then + if old.backlink != '''' then + dummy := tg_backlink_unset(old.backlink, old.slotname); + end if; + return old; + end if; +end; +' language plpgsql; + + +create trigger tg_backlink_a after insert or update or delete + on PSlot for each row execute procedure tg_backlink_a('PS'); + +create trigger tg_backlink_a after insert or update or delete + on WSlot for each row execute procedure tg_backlink_a('WS'); + +create trigger tg_backlink_a after insert or update or delete + on PLine for each row execute procedure tg_backlink_a('PL'); + + +-- ************************************************************ +-- * Support function to set the opponents backlink field +-- * if it does not already point to the requested slot +-- ************************************************************ +create function tg_backlink_set(myname bpchar, blname bpchar) +returns integer as ' +declare + mytype char(2); + link char(4); + rec record; +begin + mytype := substr(myname, 1, 2); + link := mytype || substr(blname, 1, 2); + if link = ''PLPL'' then + raise exception + ''backlink between two phone lines does not make sense''; + end if; + if link in (''PLWS'', ''WSPL'') then + raise exception + ''direct link of phone line to wall slot not permitted''; + end if; + if mytype = ''PS'' then + select into rec * from PSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.backlink != blname then + update PSlot set backlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''WS'' then + select into rec * from WSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.backlink != blname then + update WSlot set backlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''PL'' then + select into rec * from PLine where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.backlink != blname then + update PLine set backlink = blname where slotname = myname; + end if; + return 0; + end if; + raise exception ''illegal backlink beginning with %'', mytype; +end; +' language plpgsql; + + +-- ************************************************************ +-- * Support function to clear out the backlink field if +-- * it still points to specific slot +-- ************************************************************ +create function tg_backlink_unset(bpchar, bpchar) +returns integer as ' +declare + myname alias for $1; + blname alias for $2; + mytype char(2); + rec record; +begin + mytype := substr(myname, 1, 2); + if mytype = ''PS'' then + select into rec * from PSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.backlink = blname then + update PSlot set backlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''WS'' then + select into rec * from WSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.backlink = blname then + update WSlot set backlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''PL'' then + select into rec * from PLine where slotname = myname; + if not found then + return 0; + end if; + if rec.backlink = blname then + update PLine set backlink = '''' where slotname = myname; + end if; + return 0; + end if; +end +' language plpgsql; + + +-- ************************************************************ +-- * AFTER INSERT or UPDATE or DELETE on slot with slotlink +-- * - Ensure that the opponent correctly points back to us +-- ************************************************************ +create function tg_slotlink_a() returns trigger as ' +declare + dummy integer; +begin + if tg_op = ''INSERT'' then + if new.slotlink != '''' then + dummy := tg_slotlink_set(new.slotlink, new.slotname); + end if; + return new; + end if; + if tg_op = ''UPDATE'' then + if new.slotlink != old.slotlink then + if old.slotlink != '''' then + dummy := tg_slotlink_unset(old.slotlink, old.slotname); + end if; + if new.slotlink != '''' then + dummy := tg_slotlink_set(new.slotlink, new.slotname); + end if; + else + if new.slotname != old.slotname and new.slotlink != '''' then + dummy := tg_slotlink_set(new.slotlink, new.slotname); + end if; + end if; + return new; + end if; + if tg_op = ''DELETE'' then + if old.slotlink != '''' then + dummy := tg_slotlink_unset(old.slotlink, old.slotname); + end if; + return old; + end if; +end; +' language plpgsql; + + +create trigger tg_slotlink_a after insert or update or delete + on PSlot for each row execute procedure tg_slotlink_a('PS'); + +create trigger tg_slotlink_a after insert or update or delete + on WSlot for each row execute procedure tg_slotlink_a('WS'); + +create trigger tg_slotlink_a after insert or update or delete + on IFace for each row execute procedure tg_slotlink_a('IF'); + +create trigger tg_slotlink_a after insert or update or delete + on HSlot for each row execute procedure tg_slotlink_a('HS'); + +create trigger tg_slotlink_a after insert or update or delete + on PHone for each row execute procedure tg_slotlink_a('PH'); + + +-- ************************************************************ +-- * Support function to set the opponents slotlink field +-- * if it does not already point to the requested slot +-- ************************************************************ +create function tg_slotlink_set(bpchar, bpchar) +returns integer as ' +declare + myname alias for $1; + blname alias for $2; + mytype char(2); + link char(4); + rec record; +begin + mytype := substr(myname, 1, 2); + link := mytype || substr(blname, 1, 2); + if link = ''PHPH'' then + raise exception + ''slotlink between two phones does not make sense''; + end if; + if link in (''PHHS'', ''HSPH'') then + raise exception + ''link of phone to hub does not make sense''; + end if; + if link in (''PHIF'', ''IFPH'') then + raise exception + ''link of phone to hub does not make sense''; + end if; + if link in (''PSWS'', ''WSPS'') then + raise exception + ''slotlink from patchslot to wallslot not permitted''; + end if; + if mytype = ''PS'' then + select into rec * from PSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update PSlot set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''WS'' then + select into rec * from WSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update WSlot set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''IF'' then + select into rec * from IFace where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update IFace set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''HS'' then + select into rec * from HSlot where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update HSlot set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + if mytype = ''PH'' then + select into rec * from PHone where slotname = myname; + if not found then + raise exception ''% does not exist'', myname; + end if; + if rec.slotlink != blname then + update PHone set slotlink = blname where slotname = myname; + end if; + return 0; + end if; + raise exception ''illegal slotlink beginning with %'', mytype; +end; +' language plpgsql; + + +-- ************************************************************ +-- * Support function to clear out the slotlink field if +-- * it still points to specific slot +-- ************************************************************ +create function tg_slotlink_unset(bpchar, bpchar) +returns integer as ' +declare + myname alias for $1; + blname alias for $2; + mytype char(2); + rec record; +begin + mytype := substr(myname, 1, 2); + if mytype = ''PS'' then + select into rec * from PSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update PSlot set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''WS'' then + select into rec * from WSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update WSlot set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''IF'' then + select into rec * from IFace where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update IFace set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''HS'' then + select into rec * from HSlot where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update HSlot set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; + if mytype = ''PH'' then + select into rec * from PHone where slotname = myname; + if not found then + return 0; + end if; + if rec.slotlink = blname then + update PHone set slotlink = '''' where slotname = myname; + end if; + return 0; + end if; +end; +' language plpgsql; + + +-- ************************************************************ +-- * Describe the backside of a patchfield slot +-- ************************************************************ +create function pslot_backlink_view(bpchar) +returns text as ' +<> +declare + rec record; + bltype char(2); + retval text; +begin + select into rec * from PSlot where slotname = $1; + if not found then + return ''''; + end if; + if rec.backlink = '''' then + return ''-''; + end if; + bltype := substr(rec.backlink, 1, 2); + if bltype = ''PL'' then + declare + rec record; + begin + select into rec * from PLine where slotname = "outer".rec.backlink; + retval := ''Phone line '' || trim(rec.phonenumber); + if rec.comment != '''' then + retval := retval || '' (''; + retval := retval || rec.comment; + retval := retval || '')''; + end if; + return retval; + end; + end if; + if bltype = ''WS'' then + select into rec * from WSlot where slotname = rec.backlink; + retval := trim(rec.slotname) || '' in room ''; + retval := retval || trim(rec.roomno); + retval := retval || '' -> ''; + return retval || wslot_slotlink_view(rec.slotname); + end if; + return rec.backlink; +end; +' language plpgsql; + + +-- ************************************************************ +-- * Describe the front of a patchfield slot +-- ************************************************************ +create function pslot_slotlink_view(bpchar) +returns text as ' +declare + psrec record; + sltype char(2); + retval text; +begin + select into psrec * from PSlot where slotname = $1; + if not found then + return ''''; + end if; + if psrec.slotlink = '''' then + return ''-''; + end if; + sltype := substr(psrec.slotlink, 1, 2); + if sltype = ''PS'' then + retval := trim(psrec.slotlink) || '' -> ''; + return retval || pslot_backlink_view(psrec.slotlink); + end if; + if sltype = ''HS'' then + retval := comment from Hub H, HSlot HS + where HS.slotname = psrec.slotlink + and H.name = HS.hubname; + retval := retval || '' slot ''; + retval := retval || slotno::text from HSlot + where slotname = psrec.slotlink; + return retval; + end if; + return psrec.slotlink; +end; +' language plpgsql; + + +-- ************************************************************ +-- * Describe the front of a wall connector slot +-- ************************************************************ +create function wslot_slotlink_view(bpchar) +returns text as ' +declare + rec record; + sltype char(2); + retval text; +begin + select into rec * from WSlot where slotname = $1; + if not found then + return ''''; + end if; + if rec.slotlink = '''' then + return ''-''; + end if; + sltype := substr(rec.slotlink, 1, 2); + if sltype = ''PH'' then + select into rec * from PHone where slotname = rec.slotlink; + retval := ''Phone '' || trim(rec.slotname); + if rec.comment != '''' then + retval := retval || '' (''; + retval := retval || rec.comment; + retval := retval || '')''; + end if; + return retval; + end if; + if sltype = ''IF'' then + declare + syrow System%RowType; + ifrow IFace%ROWTYPE; + begin + select into ifrow * from IFace where slotname = rec.slotlink; + select into syrow * from System where name = ifrow.sysname; + retval := syrow.name || '' IF ''; + retval := retval || ifrow.ifname; + if syrow.comment != '''' then + retval := retval || '' (''; + retval := retval || syrow.comment; + retval := retval || '')''; + end if; + return retval; + end; + end if; + return rec.slotlink; +end; +' language plpgsql; + + + +-- ************************************************************ +-- * View of a patchfield describing backside and patches +-- ************************************************************ +create view Pfield_v1 as select PF.pfname, PF.slotname, + pslot_backlink_view(PF.slotname) as backside, + pslot_slotlink_view(PF.slotname) as patch + from PSlot PF; + + +-- +-- First we build the house - so we create the rooms +-- +insert into Room values ('001', 'Entrance'); +insert into Room values ('002', 'Office'); +insert into Room values ('003', 'Office'); +insert into Room values ('004', 'Technical'); +insert into Room values ('101', 'Office'); +insert into Room values ('102', 'Conference'); +insert into Room values ('103', 'Restroom'); +insert into Room values ('104', 'Technical'); +insert into Room values ('105', 'Office'); +insert into Room values ('106', 'Office'); + +-- +-- Second we install the wall connectors +-- +insert into WSlot values ('WS.001.1a', '001', '', ''); +insert into WSlot values ('WS.001.1b', '001', '', ''); +insert into WSlot values ('WS.001.2a', '001', '', ''); +insert into WSlot values ('WS.001.2b', '001', '', ''); +insert into WSlot values ('WS.001.3a', '001', '', ''); +insert into WSlot values ('WS.001.3b', '001', '', ''); + +insert into WSlot values ('WS.002.1a', '002', '', ''); +insert into WSlot values ('WS.002.1b', '002', '', ''); +insert into WSlot values ('WS.002.2a', '002', '', ''); +insert into WSlot values ('WS.002.2b', '002', '', ''); +insert into WSlot values ('WS.002.3a', '002', '', ''); +insert into WSlot values ('WS.002.3b', '002', '', ''); + +insert into WSlot values ('WS.003.1a', '003', '', ''); +insert into WSlot values ('WS.003.1b', '003', '', ''); +insert into WSlot values ('WS.003.2a', '003', '', ''); +insert into WSlot values ('WS.003.2b', '003', '', ''); +insert into WSlot values ('WS.003.3a', '003', '', ''); +insert into WSlot values ('WS.003.3b', '003', '', ''); + +insert into WSlot values ('WS.101.1a', '101', '', ''); +insert into WSlot values ('WS.101.1b', '101', '', ''); +insert into WSlot values ('WS.101.2a', '101', '', ''); +insert into WSlot values ('WS.101.2b', '101', '', ''); +insert into WSlot values ('WS.101.3a', '101', '', ''); +insert into WSlot values ('WS.101.3b', '101', '', ''); + +insert into WSlot values ('WS.102.1a', '102', '', ''); +insert into WSlot values ('WS.102.1b', '102', '', ''); +insert into WSlot values ('WS.102.2a', '102', '', ''); +insert into WSlot values ('WS.102.2b', '102', '', ''); +insert into WSlot values ('WS.102.3a', '102', '', ''); +insert into WSlot values ('WS.102.3b', '102', '', ''); + +insert into WSlot values ('WS.105.1a', '105', '', ''); +insert into WSlot values ('WS.105.1b', '105', '', ''); +insert into WSlot values ('WS.105.2a', '105', '', ''); +insert into WSlot values ('WS.105.2b', '105', '', ''); +insert into WSlot values ('WS.105.3a', '105', '', ''); +insert into WSlot values ('WS.105.3b', '105', '', ''); + +insert into WSlot values ('WS.106.1a', '106', '', ''); +insert into WSlot values ('WS.106.1b', '106', '', ''); +insert into WSlot values ('WS.106.2a', '106', '', ''); +insert into WSlot values ('WS.106.2b', '106', '', ''); +insert into WSlot values ('WS.106.3a', '106', '', ''); +insert into WSlot values ('WS.106.3b', '106', '', ''); + +-- +-- Now create the patch fields and their slots +-- +insert into PField values ('PF0_1', 'Wallslots basement'); + +-- +-- The cables for these will be made later, so they are unconnected for now +-- +insert into PSlot values ('PS.base.a1', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a2', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a3', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a4', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a5', 'PF0_1', '', ''); +insert into PSlot values ('PS.base.a6', 'PF0_1', '', ''); + +-- +-- These are already wired to the wall connectors +-- +insert into PSlot values ('PS.base.b1', 'PF0_1', '', 'WS.002.1a'); +insert into PSlot values ('PS.base.b2', 'PF0_1', '', 'WS.002.1b'); +insert into PSlot values ('PS.base.b3', 'PF0_1', '', 'WS.002.2a'); +insert into PSlot values ('PS.base.b4', 'PF0_1', '', 'WS.002.2b'); +insert into PSlot values ('PS.base.b5', 'PF0_1', '', 'WS.002.3a'); +insert into PSlot values ('PS.base.b6', 'PF0_1', '', 'WS.002.3b'); + +insert into PSlot values ('PS.base.c1', 'PF0_1', '', 'WS.003.1a'); +insert into PSlot values ('PS.base.c2', 'PF0_1', '', 'WS.003.1b'); +insert into PSlot values ('PS.base.c3', 'PF0_1', '', 'WS.003.2a'); +insert into PSlot values ('PS.base.c4', 'PF0_1', '', 'WS.003.2b'); +insert into PSlot values ('PS.base.c5', 'PF0_1', '', 'WS.003.3a'); +insert into PSlot values ('PS.base.c6', 'PF0_1', '', 'WS.003.3b'); + +-- +-- This patchfield will be renamed later into PF0_2 - so its +-- slots references in pfname should follow +-- +insert into PField values ('PF0_X', 'Phonelines basement'); + +insert into PSlot values ('PS.base.ta1', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta2', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta3', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta4', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta5', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.ta6', 'PF0_X', '', ''); + +insert into PSlot values ('PS.base.tb1', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb2', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb3', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb4', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb5', 'PF0_X', '', ''); +insert into PSlot values ('PS.base.tb6', 'PF0_X', '', ''); + +insert into PField values ('PF1_1', 'Wallslots first floor'); + +insert into PSlot values ('PS.first.a1', 'PF1_1', '', 'WS.101.1a'); +insert into PSlot values ('PS.first.a2', 'PF1_1', '', 'WS.101.1b'); +insert into PSlot values ('PS.first.a3', 'PF1_1', '', 'WS.101.2a'); +insert into PSlot values ('PS.first.a4', 'PF1_1', '', 'WS.101.2b'); +insert into PSlot values ('PS.first.a5', 'PF1_1', '', 'WS.101.3a'); +insert into PSlot values ('PS.first.a6', 'PF1_1', '', 'WS.101.3b'); + +insert into PSlot values ('PS.first.b1', 'PF1_1', '', 'WS.102.1a'); +insert into PSlot values ('PS.first.b2', 'PF1_1', '', 'WS.102.1b'); +insert into PSlot values ('PS.first.b3', 'PF1_1', '', 'WS.102.2a'); +insert into PSlot values ('PS.first.b4', 'PF1_1', '', 'WS.102.2b'); +insert into PSlot values ('PS.first.b5', 'PF1_1', '', 'WS.102.3a'); +insert into PSlot values ('PS.first.b6', 'PF1_1', '', 'WS.102.3b'); + +insert into PSlot values ('PS.first.c1', 'PF1_1', '', 'WS.105.1a'); +insert into PSlot values ('PS.first.c2', 'PF1_1', '', 'WS.105.1b'); +insert into PSlot values ('PS.first.c3', 'PF1_1', '', 'WS.105.2a'); +insert into PSlot values ('PS.first.c4', 'PF1_1', '', 'WS.105.2b'); +insert into PSlot values ('PS.first.c5', 'PF1_1', '', 'WS.105.3a'); +insert into PSlot values ('PS.first.c6', 'PF1_1', '', 'WS.105.3b'); + +insert into PSlot values ('PS.first.d1', 'PF1_1', '', 'WS.106.1a'); +insert into PSlot values ('PS.first.d2', 'PF1_1', '', 'WS.106.1b'); +insert into PSlot values ('PS.first.d3', 'PF1_1', '', 'WS.106.2a'); +insert into PSlot values ('PS.first.d4', 'PF1_1', '', 'WS.106.2b'); +insert into PSlot values ('PS.first.d5', 'PF1_1', '', 'WS.106.3a'); +insert into PSlot values ('PS.first.d6', 'PF1_1', '', 'WS.106.3b'); + +-- +-- Now we wire the wall connectors 1a-2a in room 001 to the +-- patchfield. In the second update we make an error, and +-- correct it after +-- +update PSlot set backlink = 'WS.001.1a' where slotname = 'PS.base.a1'; +update PSlot set backlink = 'WS.001.1b' where slotname = 'PS.base.a3'; +select * from WSlot where roomno = '001' order by slotname; +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; +update PSlot set backlink = 'WS.001.2a' where slotname = 'PS.base.a3'; +select * from WSlot where roomno = '001' order by slotname; +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; +update PSlot set backlink = 'WS.001.1b' where slotname = 'PS.base.a2'; +select * from WSlot where roomno = '001' order by slotname; +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; + +-- +-- Same procedure for 2b-3b but this time updating the WSlot instead +-- of the PSlot. Due to the triggers the result is the same: +-- WSlot and corresponding PSlot point to each other. +-- +update WSlot set backlink = 'PS.base.a4' where slotname = 'WS.001.2b'; +update WSlot set backlink = 'PS.base.a6' where slotname = 'WS.001.3a'; +select * from WSlot where roomno = '001' order by slotname; +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; +update WSlot set backlink = 'PS.base.a6' where slotname = 'WS.001.3b'; +select * from WSlot where roomno = '001' order by slotname; +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; +update WSlot set backlink = 'PS.base.a5' where slotname = 'WS.001.3a'; +select * from WSlot where roomno = '001' order by slotname; +select * from PSlot where slotname ~ 'PS.base.a' order by slotname; + +insert into PField values ('PF1_2', 'Phonelines first floor'); + +insert into PSlot values ('PS.first.ta1', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta2', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta3', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta4', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta5', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.ta6', 'PF1_2', '', ''); + +insert into PSlot values ('PS.first.tb1', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb2', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb3', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb4', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb5', 'PF1_2', '', ''); +insert into PSlot values ('PS.first.tb6', 'PF1_2', '', ''); + +-- +-- Fix the wrong name for patchfield PF0_2 +-- +update PField set name = 'PF0_2' where name = 'PF0_X'; + +select * from PSlot order by slotname; +select * from WSlot order by slotname; + +-- +-- Install the central phone system and create the phone numbers. +-- They are wired on insert to the patchfields. Again the +-- triggers automatically tell the PSlots to update their +-- backlink field. +-- +insert into PLine values ('PL.001', '-0', 'Central call', 'PS.base.ta1'); +insert into PLine values ('PL.002', '-101', '', 'PS.base.ta2'); +insert into PLine values ('PL.003', '-102', '', 'PS.base.ta3'); +insert into PLine values ('PL.004', '-103', '', 'PS.base.ta5'); +insert into PLine values ('PL.005', '-104', '', 'PS.base.ta6'); +insert into PLine values ('PL.006', '-106', '', 'PS.base.tb2'); +insert into PLine values ('PL.007', '-108', '', 'PS.base.tb3'); +insert into PLine values ('PL.008', '-109', '', 'PS.base.tb4'); +insert into PLine values ('PL.009', '-121', '', 'PS.base.tb5'); +insert into PLine values ('PL.010', '-122', '', 'PS.base.tb6'); +insert into PLine values ('PL.015', '-134', '', 'PS.first.ta1'); +insert into PLine values ('PL.016', '-137', '', 'PS.first.ta3'); +insert into PLine values ('PL.017', '-139', '', 'PS.first.ta4'); +insert into PLine values ('PL.018', '-362', '', 'PS.first.tb1'); +insert into PLine values ('PL.019', '-363', '', 'PS.first.tb2'); +insert into PLine values ('PL.020', '-364', '', 'PS.first.tb3'); +insert into PLine values ('PL.021', '-365', '', 'PS.first.tb5'); +insert into PLine values ('PL.022', '-367', '', 'PS.first.tb6'); +insert into PLine values ('PL.028', '-501', 'Fax entrance', 'PS.base.ta2'); +insert into PLine values ('PL.029', '-502', 'Fax first floor', 'PS.first.ta1'); + +-- +-- Buy some phones, plug them into the wall and patch the +-- phone lines to the corresponding patchfield slots. +-- +insert into PHone values ('PH.hc001', 'Hicom standard', 'WS.001.1a'); +update PSlot set slotlink = 'PS.base.ta1' where slotname = 'PS.base.a1'; +insert into PHone values ('PH.hc002', 'Hicom standard', 'WS.002.1a'); +update PSlot set slotlink = 'PS.base.ta5' where slotname = 'PS.base.b1'; +insert into PHone values ('PH.hc003', 'Hicom standard', 'WS.002.2a'); +update PSlot set slotlink = 'PS.base.tb2' where slotname = 'PS.base.b3'; +insert into PHone values ('PH.fax001', 'Canon fax', 'WS.001.2a'); +update PSlot set slotlink = 'PS.base.ta2' where slotname = 'PS.base.a3'; + +-- +-- Install a hub at one of the patchfields, plug a computers +-- ethernet interface into the wall and patch it to the hub. +-- +insert into Hub values ('base.hub1', 'Patchfield PF0_1 hub', 16); +insert into System values ('orion', 'PC'); +insert into IFace values ('IF', 'orion', 'eth0', 'WS.002.1b'); +update PSlot set slotlink = 'HS.base.hub1.1' where slotname = 'PS.base.b2'; + +-- +-- Now we take a look at the patchfield +-- +select * from PField_v1 where pfname = 'PF0_1' order by slotname; +select * from PField_v1 where pfname = 'PF0_2' order by slotname; + +-- +-- Finally we want errors +-- +insert into PField values ('PF1_1', 'should fail due to unique index'); +update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1'; +update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1'; +update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1'; +update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1'; +insert into HSlot values ('HS', 'base.hub1', 1, ''); +insert into HSlot values ('HS', 'base.hub1', 20, ''); +delete from HSlot; +insert into IFace values ('IF', 'notthere', 'eth0', ''); +insert into IFace values ('IF', 'orion', 'ethernet_interface_name_too_long', ''); + + +-- +-- The following tests are unrelated to the scenario outlined above; +-- they merely exercise specific parts of PL/pgSQL +-- + +-- +-- Test recursion, per bug report 7-Sep-01 +-- +CREATE FUNCTION recursion_test(int,int) RETURNS text AS ' +DECLARE rslt text; +BEGIN + IF $1 <= 0 THEN + rslt = CAST($2 AS TEXT); + ELSE + rslt = CAST($1 AS TEXT) || '','' || recursion_test($1 - 1, $2); + END IF; + RETURN rslt; +END;' LANGUAGE plpgsql; + +SELECT recursion_test(4,3); + +-- +-- Test the FOUND magic variable +-- +CREATE TABLE found_test_tbl (a int); + +create function test_found() + returns boolean as ' + declare + begin + insert into found_test_tbl values (1); + if FOUND then + insert into found_test_tbl values (2); + end if; + + update found_test_tbl set a = 100 where a = 1; + if FOUND then + insert into found_test_tbl values (3); + end if; + + delete from found_test_tbl where a = 9999; -- matches no rows + if not FOUND then + insert into found_test_tbl values (4); + end if; + + for i in 1 .. 10 loop + -- no need to do anything + end loop; + if FOUND then + insert into found_test_tbl values (5); + end if; + + -- never executes the loop + for i in 2 .. 1 loop + -- no need to do anything + end loop; + if not FOUND then + insert into found_test_tbl values (6); + end if; + return true; + end;' language plpgsql; + +select test_found(); +select * from found_test_tbl; + +-- +-- Test set-returning functions for PL/pgSQL +-- + +create function test_table_func_rec() returns setof found_test_tbl as ' +DECLARE + rec RECORD; +BEGIN + FOR rec IN select * from found_test_tbl LOOP + RETURN NEXT rec; + END LOOP; + RETURN; +END;' language plpgsql; + +select * from test_table_func_rec(); + +create function test_table_func_row() returns setof found_test_tbl as ' +DECLARE + row found_test_tbl%ROWTYPE; +BEGIN + FOR row IN select * from found_test_tbl LOOP + RETURN NEXT row; + END LOOP; + RETURN; +END;' language plpgsql; + +select * from test_table_func_row(); + +create function test_ret_set_scalar(int,int) returns setof int as ' +DECLARE + i int; +BEGIN + FOR i IN $1 .. $2 LOOP + RETURN NEXT i + 1; + END LOOP; + RETURN; +END;' language plpgsql; + +select * from test_ret_set_scalar(1,10); + +create function test_ret_set_rec_dyn(int) returns setof record as ' +DECLARE + retval RECORD; +BEGIN + IF $1 > 10 THEN + SELECT INTO retval 5, 10, 15; + RETURN NEXT retval; + RETURN NEXT retval; + ELSE + SELECT INTO retval 50, 5::numeric, ''xxx''::text; + RETURN NEXT retval; + RETURN NEXT retval; + END IF; + RETURN; +END;' language plpgsql; + +SELECT * FROM test_ret_set_rec_dyn(1500) AS (a int, b int, c int); +SELECT * FROM test_ret_set_rec_dyn(5) AS (a int, b numeric, c text); + +create function test_ret_rec_dyn(int) returns record as ' +DECLARE + retval RECORD; +BEGIN + IF $1 > 10 THEN + SELECT INTO retval 5, 10, 15; + RETURN retval; + ELSE + SELECT INTO retval 50, 5::numeric, ''xxx''::text; + RETURN retval; + END IF; +END;' language plpgsql; + +SELECT * FROM test_ret_rec_dyn(1500) AS (a int, b int, c int); +SELECT * FROM test_ret_rec_dyn(5) AS (a int, b numeric, c text); + +-- +-- Test some simple polymorphism cases. +-- + +create function f1(x anyelement) returns anyelement as $$ +begin + return x + 1; +end$$ language plpgsql; + +select f1(42) as int, f1(4.5) as num; +select f1(point(3,4)); -- fail for lack of + operator + +drop function f1(x anyelement); + +create function f1(x anyelement) returns anyarray as $$ +begin + return array[x + 1, x + 2]; +end$$ language plpgsql; + +select f1(42) as int, f1(4.5) as num; + +drop function f1(x anyelement); + +create function f1(x anyarray) returns anyelement as $$ +begin + return x[1]; +end$$ language plpgsql; + +select f1(array[2,4]) as int, f1(array[4.5, 7.7]) as num; + +select f1(stavalues1) from pg_statistic; -- fail, can't infer element type + +drop function f1(x anyarray); + +create function f1(x anyarray) returns anyarray as $$ +begin + return x; +end$$ language plpgsql; + +select f1(array[2,4]) as int, f1(array[4.5, 7.7]) as num; + +select f1(stavalues1) from pg_statistic; -- fail, can't infer element type + +drop function f1(x anyarray); + +-- fail, can't infer type: +create function f1(x anyelement) returns anyrange as $$ +begin + return array[x + 1, x + 2]; +end$$ language plpgsql; + +create function f1(x anyrange) returns anyarray as $$ +begin + return array[lower(x), upper(x)]; +end$$ language plpgsql; + +select f1(int4range(42, 49)) as int, f1(float8range(4.5, 7.8)) as num; + +drop function f1(x anyrange); + +create function f1(x anycompatible, y anycompatible) returns anycompatiblearray as $$ +begin + return array[x, y]; +end$$ language plpgsql; + +select f1(2, 4) as int, f1(2, 4.5) as num; + +drop function f1(x anycompatible, y anycompatible); + +create function f1(x anycompatiblerange, y anycompatible, z anycompatible) returns anycompatiblearray as $$ +begin + return array[lower(x), upper(x), y, z]; +end$$ language plpgsql; + +select f1(int4range(42, 49), 11, 2::smallint) as int, f1(float8range(4.5, 7.8), 7.8, 11::real) as num; + +select f1(int4range(42, 49), 11, 4.5) as fail; -- range type doesn't fit + +drop function f1(x anycompatiblerange, y anycompatible, z anycompatible); + +-- fail, can't infer type: +create function f1(x anycompatible) returns anycompatiblerange as $$ +begin + return array[x + 1, x + 2]; +end$$ language plpgsql; + +create function f1(x anycompatiblerange, y anycompatiblearray) returns anycompatiblerange as $$ +begin + return x; +end$$ language plpgsql; + +select f1(int4range(42, 49), array[11]) as int, f1(float8range(4.5, 7.8), array[7]) as num; + +drop function f1(x anycompatiblerange, y anycompatiblearray); + +create function f1(a anyelement, b anyarray, + c anycompatible, d anycompatible, + OUT x anyarray, OUT y anycompatiblearray) +as $$ +begin + x := a || b; + y := array[c, d]; +end$$ language plpgsql; + +select x, pg_typeof(x), y, pg_typeof(y) + from f1(11, array[1, 2], 42, 34.5); +select x, pg_typeof(x), y, pg_typeof(y) + from f1(11, array[1, 2], point(1,2), point(3,4)); +select x, pg_typeof(x), y, pg_typeof(y) + from f1(11, '{1,2}', point(1,2), '(3,4)'); +select x, pg_typeof(x), y, pg_typeof(y) + from f1(11, array[1, 2.2], 42, 34.5); -- fail + +drop function f1(a anyelement, b anyarray, + c anycompatible, d anycompatible); + +-- +-- Test handling of OUT parameters, including polymorphic cases. +-- Note that RETURN is optional with OUT params; we try both ways. +-- + +-- wrong way to do it: +create function f1(in i int, out j int) returns int as $$ +begin + return i+1; +end$$ language plpgsql; + +create function f1(in i int, out j int) as $$ +begin + j := i+1; + return; +end$$ language plpgsql; + +select f1(42); +select * from f1(42); + +create or replace function f1(inout i int) as $$ +begin + i := i+1; +end$$ language plpgsql; + +select f1(42); +select * from f1(42); + +drop function f1(int); + +create function f1(in i int, out j int) returns setof int as $$ +begin + j := i+1; + return next; + j := i+2; + return next; + return; +end$$ language plpgsql; + +select * from f1(42); + +drop function f1(int); + +create function f1(in i int, out j int, out k text) as $$ +begin + j := i; + j := j+1; + k := 'foo'; +end$$ language plpgsql; + +select f1(42); +select * from f1(42); + +drop function f1(int); + +create function f1(in i int, out j int, out k text) returns setof record as $$ +begin + j := i+1; + k := 'foo'; + return next; + j := j+1; + k := 'foot'; + return next; +end$$ language plpgsql; + +select * from f1(42); + +drop function f1(int); + +create function duplic(in i anyelement, out j anyelement, out k anyarray) as $$ +begin + j := i; + k := array[j,j]; + return; +end$$ language plpgsql; + +select * from duplic(42); +select * from duplic('foo'::text); + +drop function duplic(anyelement); + +create function duplic(in i anycompatiblerange, out j anycompatible, out k anycompatiblearray) as $$ +begin + j := lower(i); + k := array[lower(i),upper(i)]; + return; +end$$ language plpgsql; + +select * from duplic(int4range(42,49)); +select * from duplic(textrange('aaa', 'bbb')); + +drop function duplic(anycompatiblerange); + +-- +-- test PERFORM +-- + +create table perform_test ( + a INT, + b INT +); + +create function perform_simple_func(int) returns boolean as ' +BEGIN + IF $1 < 20 THEN + INSERT INTO perform_test VALUES ($1, $1 + 10); + RETURN TRUE; + ELSE + RETURN FALSE; + END IF; +END;' language plpgsql; + +create function perform_test_func() returns void as ' +BEGIN + IF FOUND then + INSERT INTO perform_test VALUES (100, 100); + END IF; + + PERFORM perform_simple_func(5); + + IF FOUND then + INSERT INTO perform_test VALUES (100, 100); + END IF; + + PERFORM perform_simple_func(50); + + IF FOUND then + INSERT INTO perform_test VALUES (100, 100); + END IF; + + RETURN; +END;' language plpgsql; + +SELECT perform_test_func(); +SELECT * FROM perform_test; + +drop table perform_test; + +-- +-- Test proper snapshot handling in simple expressions +-- + +create temp table users(login text, id serial); + +create function sp_id_user(a_login text) returns int as $$ +declare x int; +begin + select into x id from users where login = a_login; + if found then return x; end if; + return 0; +end$$ language plpgsql stable; + +insert into users values('user1'); + +select sp_id_user('user1'); +select sp_id_user('userx'); + +create function sp_add_user(a_login text) returns int as $$ +declare my_id_user int; +begin + my_id_user = sp_id_user( a_login ); + IF my_id_user > 0 THEN + RETURN -1; -- error code for existing user + END IF; + INSERT INTO users ( login ) VALUES ( a_login ); + my_id_user = sp_id_user( a_login ); + IF my_id_user = 0 THEN + RETURN -2; -- error code for insertion failure + END IF; + RETURN my_id_user; +end$$ language plpgsql; + +select sp_add_user('user1'); +select sp_add_user('user2'); +select sp_add_user('user2'); +select sp_add_user('user3'); +select sp_add_user('user3'); + +drop function sp_add_user(text); +drop function sp_id_user(text); + +-- +-- tests for refcursors +-- +create table rc_test (a int, b int); +copy rc_test from stdin; +5 10 +50 100 +500 1000 +\. + +create function return_unnamed_refcursor() returns refcursor as $$ +declare + rc refcursor; +begin + open rc for select a from rc_test; + return rc; +end +$$ language plpgsql; + +create function use_refcursor(rc refcursor) returns int as $$ +declare + rc refcursor; + x record; +begin + rc := return_unnamed_refcursor(); + fetch next from rc into x; + return x.a; +end +$$ language plpgsql; + +select use_refcursor(return_unnamed_refcursor()); + +create function return_refcursor(rc refcursor) returns refcursor as $$ +begin + open rc for select a from rc_test; + return rc; +end +$$ language plpgsql; + +create function refcursor_test1(refcursor) returns refcursor as $$ +begin + perform return_refcursor($1); + return $1; +end +$$ language plpgsql; + +begin; + +select refcursor_test1('test1'); +fetch next in test1; + +select refcursor_test1('test2'); +fetch all from test2; + +commit; + +-- should fail +fetch next from test1; + +create function refcursor_test2(int, int) returns boolean as $$ +declare + c1 cursor (param1 int, param2 int) for select * from rc_test where a > param1 and b > param2; + nonsense record; +begin + open c1($1, $2); + fetch c1 into nonsense; + close c1; + if found then + return true; + else + return false; + end if; +end +$$ language plpgsql; + +select refcursor_test2(20000, 20000) as "Should be false", + refcursor_test2(20, 20) as "Should be true"; + +-- +-- tests for cursors with named parameter arguments +-- +create function namedparmcursor_test1(int, int) returns boolean as $$ +declare + c1 cursor (param1 int, param12 int) for select * from rc_test where a > param1 and b > param12; + nonsense record; +begin + open c1(param12 := $2, param1 := $1); + fetch c1 into nonsense; + close c1; + if found then + return true; + else + return false; + end if; +end +$$ language plpgsql; + +select namedparmcursor_test1(20000, 20000) as "Should be false", + namedparmcursor_test1(20, 20) as "Should be true"; + +-- mixing named and positional argument notations +create function namedparmcursor_test2(int, int) returns boolean as $$ +declare + c1 cursor (param1 int, param2 int) for select * from rc_test where a > param1 and b > param2; + nonsense record; +begin + open c1(param1 := $1, $2); + fetch c1 into nonsense; + close c1; + if found then + return true; + else + return false; + end if; +end +$$ language plpgsql; +select namedparmcursor_test2(20, 20); + +-- mixing named and positional: param2 is given twice, once in named notation +-- and second time in positional notation. Should throw an error at parse time +create function namedparmcursor_test3() returns void as $$ +declare + c1 cursor (param1 int, param2 int) for select * from rc_test where a > param1 and b > param2; +begin + open c1(param2 := 20, 21); +end +$$ language plpgsql; + +-- mixing named and positional: same as previous test, but param1 is duplicated +create function namedparmcursor_test4() returns void as $$ +declare + c1 cursor (param1 int, param2 int) for select * from rc_test where a > param1 and b > param2; +begin + open c1(20, param1 := 21); +end +$$ language plpgsql; + +-- duplicate named parameter, should throw an error at parse time +create function namedparmcursor_test5() returns void as $$ +declare + c1 cursor (p1 int, p2 int) for + select * from tenk1 where thousand = p1 and tenthous = p2; +begin + open c1 (p2 := 77, p2 := 42); +end +$$ language plpgsql; + +-- not enough parameters, should throw an error at parse time +create function namedparmcursor_test6() returns void as $$ +declare + c1 cursor (p1 int, p2 int) for + select * from tenk1 where thousand = p1 and tenthous = p2; +begin + open c1 (p2 := 77); +end +$$ language plpgsql; + +-- division by zero runtime error, the context given in the error message +-- should be sensible +create function namedparmcursor_test7() returns void as $$ +declare + c1 cursor (p1 int, p2 int) for + select * from tenk1 where thousand = p1 and tenthous = p2; +begin + open c1 (p2 := 77, p1 := 42/0); +end $$ language plpgsql; +select namedparmcursor_test7(); + +-- check that line comments work correctly within the argument list (there +-- is some special handling of this case in the code: the newline after the +-- comment must be preserved when the argument-evaluating query is +-- constructed, otherwise the comment effectively comments out the next +-- argument, too) +create function namedparmcursor_test8() returns int4 as $$ +declare + c1 cursor (p1 int, p2 int) for + select count(*) from tenk1 where thousand = p1 and tenthous = p2; + n int4; +begin + open c1 (77 -- test + , 42); + fetch c1 into n; + return n; +end $$ language plpgsql; +select namedparmcursor_test8(); + +-- cursor parameter name can match plpgsql variable or unreserved keyword +create function namedparmcursor_test9(p1 int) returns int4 as $$ +declare + c1 cursor (p1 int, p2 int, debug int) for + select count(*) from tenk1 where thousand = p1 and tenthous = p2 + and four = debug; + p2 int4 := 1006; + n int4; +begin + open c1 (p1 := p1, p2 := p2, debug := 2); + fetch c1 into n; + return n; +end $$ language plpgsql; +select namedparmcursor_test9(6); + +-- +-- tests for "raise" processing +-- +create function raise_test1(int) returns int as $$ +begin + raise notice 'This message has too many parameters!', $1; + return $1; +end; +$$ language plpgsql; + +create function raise_test2(int) returns int as $$ +begin + raise notice 'This message has too few parameters: %, %, %', $1, $1; + return $1; +end; +$$ language plpgsql; + +create function raise_test3(int) returns int as $$ +begin + raise notice 'This message has no parameters (despite having %% signs in it)!'; + return $1; +end; +$$ language plpgsql; + +select raise_test3(1); + +-- Test re-RAISE inside a nested exception block. This case is allowed +-- by Oracle's PL/SQL but was handled differently by PG before 9.1. + +CREATE FUNCTION reraise_test() RETURNS void AS $$ +BEGIN + BEGIN + RAISE syntax_error; + EXCEPTION + WHEN syntax_error THEN + BEGIN + raise notice 'exception % thrown in inner block, reraising', sqlerrm; + RAISE; + EXCEPTION + WHEN OTHERS THEN + raise notice 'RIGHT - exception % caught in inner block', sqlerrm; + END; + END; +EXCEPTION + WHEN OTHERS THEN + raise notice 'WRONG - exception % caught in outer block', sqlerrm; +END; +$$ LANGUAGE plpgsql; + +SELECT reraise_test(); + +-- +-- reject function definitions that contain malformed SQL queries at +-- compile-time, where possible +-- +create function bad_sql1() returns int as $$ +declare a int; +begin + a := 5; + Johnny Yuma; + a := 10; + return a; +end$$ language plpgsql; + +create function bad_sql2() returns int as $$ +declare r record; +begin + for r in select I fought the law, the law won LOOP + raise notice 'in loop'; + end loop; + return 5; +end;$$ language plpgsql; + +-- a RETURN expression is mandatory, except for void-returning +-- functions, where it is not allowed +create function missing_return_expr() returns int as $$ +begin + return ; +end;$$ language plpgsql; + +create function void_return_expr() returns void as $$ +begin + return 5; +end;$$ language plpgsql; + +-- VOID functions are allowed to omit RETURN +create function void_return_expr() returns void as $$ +begin + perform 2+2; +end;$$ language plpgsql; + +select void_return_expr(); + +-- but ordinary functions are not +create function missing_return_expr() returns int as $$ +begin + perform 2+2; +end;$$ language plpgsql; + +select missing_return_expr(); + +drop function void_return_expr(); +drop function missing_return_expr(); + +-- +-- EXECUTE ... INTO test +-- + +create table eifoo (i integer, y integer); +create type eitype as (i integer, y integer); + +create or replace function execute_into_test(varchar) returns record as $$ +declare + _r record; + _rt eifoo%rowtype; + _v eitype; + i int; + j int; + k int; +begin + execute 'insert into '||$1||' values(10,15)'; + execute 'select (row).* from (select row(10,1)::eifoo) s' into _r; + raise notice '% %', _r.i, _r.y; + execute 'select * from '||$1||' limit 1' into _rt; + raise notice '% %', _rt.i, _rt.y; + execute 'select *, 20 from '||$1||' limit 1' into i, j, k; + raise notice '% % %', i, j, k; + execute 'select 1,2' into _v; + return _v; +end; $$ language plpgsql; + +select execute_into_test('eifoo'); + +drop table eifoo cascade; +drop type eitype cascade; + +-- +-- SQLSTATE and SQLERRM test +-- + +create function excpt_test1() returns void as $$ +begin + raise notice '% %', sqlstate, sqlerrm; +end; $$ language plpgsql; +-- should fail: SQLSTATE and SQLERRM are only in defined EXCEPTION +-- blocks +select excpt_test1(); + +create function excpt_test2() returns void as $$ +begin + begin + begin + raise notice '% %', sqlstate, sqlerrm; + end; + end; +end; $$ language plpgsql; +-- should fail +select excpt_test2(); + +create function excpt_test3() returns void as $$ +begin + begin + raise exception 'user exception'; + exception when others then + raise notice 'caught exception % %', sqlstate, sqlerrm; + begin + raise notice '% %', sqlstate, sqlerrm; + perform 10/0; + exception + when substring_error then + -- this exception handler shouldn't be invoked + raise notice 'unexpected exception: % %', sqlstate, sqlerrm; + when division_by_zero then + raise notice 'caught exception % %', sqlstate, sqlerrm; + end; + raise notice '% %', sqlstate, sqlerrm; + end; +end; $$ language plpgsql; +select excpt_test3(); + +create function excpt_test4() returns text as $$ +begin + begin perform 1/0; + exception when others then return sqlerrm; end; +end; $$ language plpgsql; +select excpt_test4(); + +drop function excpt_test1(); +drop function excpt_test2(); +drop function excpt_test3(); +drop function excpt_test4(); + +-- parameters of raise stmt can be expressions +create function raise_exprs() returns void as $$ +declare + a integer[] = '{10,20,30}'; + c varchar = 'xyz'; + i integer; +begin + i := 2; + raise notice '%; %; %; %; %; %', a, a[i], c, (select c || 'abc'), row(10,'aaa',NULL,30), NULL; +end;$$ language plpgsql; + +select raise_exprs(); +drop function raise_exprs(); + +-- regression test: verify that multiple uses of same plpgsql datum within +-- a SQL command all get mapped to the same $n parameter. The return value +-- of the SELECT is not important, we only care that it doesn't fail with +-- a complaint about an ungrouped column reference. +create function multi_datum_use(p1 int) returns bool as $$ +declare + x int; + y int; +begin + select into x,y unique1/p1, unique1/$1 from tenk1 group by unique1/p1; + return x = y; +end$$ language plpgsql; + +select multi_datum_use(42); + +-- +-- Test STRICT limiter in both planned and EXECUTE invocations. +-- Note that a data-modifying query is quasi strict (disallow multi rows) +-- by default in the planned case, but not in EXECUTE. +-- + +create temp table foo (f1 int, f2 int); + +insert into foo values (1,2), (3,4); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should work + insert into foo values(5,6) returning * into x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail due to implicit strict + insert into foo values(7,8),(9,10) returning * into x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should work + execute 'insert into foo values(5,6) returning *' into x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- this should work since EXECUTE isn't as picky + execute 'insert into foo values(7,8),(9,10) returning *' into x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +select * from foo; + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should work + select * from foo where f1 = 3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail, no rows + select * from foo where f1 = 0 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail, too many rows + select * from foo where f1 > 3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should work + execute 'select * from foo where f1 = 3' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail, no rows + execute 'select * from foo where f1 = 0' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- should fail, too many rows + execute 'select * from foo where f1 > 3' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +drop function stricttest(); + +-- test printing parameters after failure due to STRICT + +set plpgsql.print_strict_params to true; + +create or replace function stricttest() returns void as $$ +declare +x record; +p1 int := 2; +p3 text := 'foo'; +begin + -- no rows + select * from foo where f1 = p1 and f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare +x record; +p1 int := 2; +p3 text := $a$'Valame Dios!' dijo Sancho; 'no le dije yo a vuestra merced que mirase bien lo que hacia?'$a$; +begin + -- no rows + select * from foo where f1 = p1 and f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare +x record; +p1 int := 2; +p3 text := 'foo'; +begin + -- too many rows + select * from foo where f1 > p1 or f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- too many rows, no params + select * from foo where f1 > 3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- no rows + execute 'select * from foo where f1 = $1 or f1::text = $2' using 0, 'foo' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- too many rows + execute 'select * from foo where f1 > $1' using 1 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +declare x record; +begin + -- too many rows, no parameters + execute 'select * from foo where f1 > 3' into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +create or replace function stricttest() returns void as $$ +-- override the global +#print_strict_params off +declare +x record; +p1 int := 2; +p3 text := 'foo'; +begin + -- too many rows + select * from foo where f1 > p1 or f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +reset plpgsql.print_strict_params; + +create or replace function stricttest() returns void as $$ +-- override the global +#print_strict_params on +declare +x record; +p1 int := 2; +p3 text := 'foo'; +begin + -- too many rows + select * from foo where f1 > p1 or f1::text = p3 into strict x; + raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; +end$$ language plpgsql; + +select stricttest(); + +-- test warnings and errors +set plpgsql.extra_warnings to 'all'; +set plpgsql.extra_warnings to 'none'; +set plpgsql.extra_errors to 'all'; +set plpgsql.extra_errors to 'none'; + +-- test warnings when shadowing a variable + +set plpgsql.extra_warnings to 'shadowed_variables'; + +-- simple shadowing of input and output parameters +create or replace function shadowtest(in1 int) + returns table (out1 int) as $$ +declare +in1 int; +out1 int; +begin +end +$$ language plpgsql; +select shadowtest(1); + +set plpgsql.extra_warnings to 'shadowed_variables'; +select shadowtest(1); +create or replace function shadowtest(in1 int) + returns table (out1 int) as $$ +declare +in1 int; +out1 int; +begin +end +$$ language plpgsql; +select shadowtest(1); +drop function shadowtest(int); + +-- shadowing in a second DECLARE block +create or replace function shadowtest() + returns void as $$ +declare +f1 int; +begin + declare + f1 int; + begin + end; +end$$ language plpgsql; +drop function shadowtest(); + +-- several levels of shadowing +create or replace function shadowtest(in1 int) + returns void as $$ +declare +in1 int; +begin + declare + in1 int; + begin + end; +end$$ language plpgsql; +drop function shadowtest(int); + +-- shadowing in cursor definitions +create or replace function shadowtest() + returns void as $$ +declare +f1 int; +c1 cursor (f1 int) for select 1; +begin +end$$ language plpgsql; +drop function shadowtest(); + +-- test errors when shadowing a variable + +set plpgsql.extra_errors to 'shadowed_variables'; + +create or replace function shadowtest(f1 int) + returns boolean as $$ +declare f1 int; begin return 1; end $$ language plpgsql; + +select shadowtest(1); + +reset plpgsql.extra_errors; +reset plpgsql.extra_warnings; + +create or replace function shadowtest(f1 int) + returns boolean as $$ +declare f1 int; begin return 1; end $$ language plpgsql; + +select shadowtest(1); + +-- runtime extra checks +set plpgsql.extra_warnings to 'too_many_rows'; + +do $$ +declare x int; +begin + select v from generate_series(1,2) g(v) into x; +end; +$$; + +set plpgsql.extra_errors to 'too_many_rows'; + +do $$ +declare x int; +begin + select v from generate_series(1,2) g(v) into x; +end; +$$; + +reset plpgsql.extra_errors; +reset plpgsql.extra_warnings; + +set plpgsql.extra_warnings to 'strict_multi_assignment'; + +do $$ +declare + x int; + y int; +begin + select 1 into x, y; + select 1,2 into x, y; + select 1,2,3 into x, y; +end +$$; + +set plpgsql.extra_errors to 'strict_multi_assignment'; + +do $$ +declare + x int; + y int; +begin + select 1 into x, y; + select 1,2 into x, y; + select 1,2,3 into x, y; +end +$$; + +create table test_01(a int, b int, c int); + +alter table test_01 drop column a; + +-- the check is active only when source table is not empty +insert into test_01 values(10,20); + +do $$ +declare + x int; + y int; +begin + select * from test_01 into x, y; -- should be ok + raise notice 'ok'; + select * from test_01 into x; -- should to fail +end; +$$; + +do $$ +declare + t test_01; +begin + select 1, 2 into t; -- should be ok + raise notice 'ok'; + select 1, 2, 3 into t; -- should fail; +end; +$$; + +do $$ +declare + t test_01; +begin + select 1 into t; -- should fail; +end; +$$; + +drop table test_01; + +reset plpgsql.extra_errors; +reset plpgsql.extra_warnings; + +-- test scrollable cursor support + +create function sc_test() returns setof integer as $$ +declare + c scroll cursor for select f1 from int4_tbl; + x integer; +begin + open c; + fetch last from c into x; + while found loop + return next x; + fetch prior from c into x; + end loop; + close c; +end; +$$ language plpgsql; + +select * from sc_test(); + +create or replace function sc_test() returns setof integer as $$ +declare + c no scroll cursor for select f1 from int4_tbl; + x integer; +begin + open c; + fetch last from c into x; + while found loop + return next x; + fetch prior from c into x; + end loop; + close c; +end; +$$ language plpgsql; + +select * from sc_test(); -- fails because of NO SCROLL specification + +create or replace function sc_test() returns setof integer as $$ +declare + c refcursor; + x integer; +begin + open c scroll for select f1 from int4_tbl; + fetch last from c into x; + while found loop + return next x; + fetch prior from c into x; + end loop; + close c; +end; +$$ language plpgsql; + +select * from sc_test(); + +create or replace function sc_test() returns setof integer as $$ +declare + c refcursor; + x integer; +begin + open c scroll for execute 'select f1 from int4_tbl'; + fetch last from c into x; + while found loop + return next x; + fetch relative -2 from c into x; + end loop; + close c; +end; +$$ language plpgsql; + +select * from sc_test(); + +create or replace function sc_test() returns setof integer as $$ +declare + c refcursor; + x integer; +begin + open c scroll for execute 'select f1 from int4_tbl'; + fetch last from c into x; + while found loop + return next x; + move backward 2 from c; + fetch relative -1 from c into x; + end loop; + close c; +end; +$$ language plpgsql; + +select * from sc_test(); + +create or replace function sc_test() returns setof integer as $$ +declare + c cursor for select * from generate_series(1, 10); + x integer; +begin + open c; + loop + move relative 2 in c; + if not found then + exit; + end if; + fetch next from c into x; + if found then + return next x; + end if; + end loop; + close c; +end; +$$ language plpgsql; + +select * from sc_test(); + +create or replace function sc_test() returns setof integer as $$ +declare + c cursor for select * from generate_series(1, 10); + x integer; +begin + open c; + move forward all in c; + fetch backward from c into x; + if found then + return next x; + end if; + close c; +end; +$$ language plpgsql; + +select * from sc_test(); + +drop function sc_test(); + +-- test qualified variable names + +create function pl_qual_names (param1 int) returns void as $$ +<> +declare + param1 int := 1; +begin + <> + declare + param1 int := 2; + begin + raise notice 'param1 = %', param1; + raise notice 'pl_qual_names.param1 = %', pl_qual_names.param1; + raise notice 'outerblock.param1 = %', outerblock.param1; + raise notice 'innerblock.param1 = %', innerblock.param1; + end; +end; +$$ language plpgsql; + +select pl_qual_names(42); + +drop function pl_qual_names(int); + +-- tests for RETURN QUERY +create function ret_query1(out int, out int) returns setof record as $$ +begin + $1 := -1; + $2 := -2; + return next; + return query select x + 1, x * 10 from generate_series(0, 10) s (x); + return next; +end; +$$ language plpgsql; + +select * from ret_query1(); + +create type record_type as (x text, y int, z boolean); + +create or replace function ret_query2(lim int) returns setof record_type as $$ +begin + return query select md5(s.x::text), s.x, s.x > 0 + from generate_series(-8, lim) s (x) where s.x % 2 = 0; +end; +$$ language plpgsql; + +select * from ret_query2(8); + +-- test EXECUTE USING +create function exc_using(int, text) returns int as $$ +declare i int; +begin + for i in execute 'select * from generate_series(1,$1)' using $1+1 loop + raise notice '%', i; + end loop; + execute 'select $2 + $2*3 + length($1)' into i using $2,$1; + return i; +end +$$ language plpgsql; + +select exc_using(5, 'foobar'); + +drop function exc_using(int, text); + +create or replace function exc_using(int) returns void as $$ +declare + c refcursor; + i int; +begin + open c for execute 'select * from generate_series(1,$1)' using $1+1; + loop + fetch c into i; + exit when not found; + raise notice '%', i; + end loop; + close c; + return; +end; +$$ language plpgsql; + +select exc_using(5); + +drop function exc_using(int); + +-- test FOR-over-cursor + +create or replace function forc01() returns void as $$ +declare + c cursor(r1 integer, r2 integer) + for select * from generate_series(r1,r2) i; + c2 cursor + for select * from generate_series(41,43) i; +begin + for r in c(5,7) loop + raise notice '% from %', r.i, c; + end loop; + -- again, to test if cursor was closed properly + for r in c(9,10) loop + raise notice '% from %', r.i, c; + end loop; + -- and test a parameterless cursor + for r in c2 loop + raise notice '% from %', r.i, c2; + end loop; + -- and try it with a hand-assigned name + raise notice 'after loop, c2 = %', c2; + c2 := 'special_name'; + for r in c2 loop + raise notice '% from %', r.i, c2; + end loop; + raise notice 'after loop, c2 = %', c2; + -- and try it with a generated name + -- (which we can't show in the output because it's variable) + c2 := null; + for r in c2 loop + raise notice '%', r.i; + end loop; + raise notice 'after loop, c2 = %', c2; + return; +end; +$$ language plpgsql; + +select forc01(); + +-- try updating the cursor's current row + +create temp table forc_test as + select n as i, n as j from generate_series(1,10) n; + +create or replace function forc01() returns void as $$ +declare + c cursor for select * from forc_test; +begin + for r in c loop + raise notice '%, %', r.i, r.j; + update forc_test set i = i * 100, j = r.j * 2 where current of c; + end loop; +end; +$$ language plpgsql; + +select forc01(); + +select * from forc_test; + +-- same, with a cursor whose portal name doesn't match variable name +create or replace function forc01() returns void as $$ +declare + c refcursor := 'fooled_ya'; + r record; +begin + open c for select * from forc_test; + loop + fetch c into r; + exit when not found; + raise notice '%, %', r.i, r.j; + update forc_test set i = i * 100, j = r.j * 2 where current of c; + end loop; +end; +$$ language plpgsql; + +select forc01(); + +select * from forc_test; + +drop function forc01(); + +-- fail because cursor has no query bound to it + +create or replace function forc_bad() returns void as $$ +declare + c refcursor; +begin + for r in c loop + raise notice '%', r.i; + end loop; +end; +$$ language plpgsql; + +-- test RETURN QUERY EXECUTE + +create or replace function return_dquery() +returns setof int as $$ +begin + return query execute 'select * from (values(10),(20)) f'; + return query execute 'select * from (values($1),($2)) f' using 40,50; +end; +$$ language plpgsql; + +select * from return_dquery(); + +drop function return_dquery(); + +-- test RETURN QUERY with dropped columns + +create table tabwithcols(a int, b int, c int, d int); +insert into tabwithcols values(10,20,30,40),(50,60,70,80); + +create or replace function returnqueryf() +returns setof tabwithcols as $$ +begin + return query select * from tabwithcols; + return query execute 'select * from tabwithcols'; +end; +$$ language plpgsql; + +select * from returnqueryf(); + +alter table tabwithcols drop column b; + +select * from returnqueryf(); + +alter table tabwithcols drop column d; + +select * from returnqueryf(); + +alter table tabwithcols add column d int; + +select * from returnqueryf(); + +drop function returnqueryf(); +drop table tabwithcols; + +-- +-- Tests for composite-type results +-- + +create type compostype as (x int, y varchar); + +-- test: use of variable of composite type in return statement +create or replace function compos() returns compostype as $$ +declare + v compostype; +begin + v := (1, 'hello'); + return v; +end; +$$ language plpgsql; + +select compos(); + +-- test: use of variable of record type in return statement +create or replace function compos() returns compostype as $$ +declare + v record; +begin + v := (1, 'hello'::varchar); + return v; +end; +$$ language plpgsql; + +select compos(); + +-- test: use of row expr in return statement +create or replace function compos() returns compostype as $$ +begin + return (1, 'hello'::varchar); +end; +$$ language plpgsql; + +select compos(); + +-- this does not work currently (no implicit casting) +create or replace function compos() returns compostype as $$ +begin + return (1, 'hello'); +end; +$$ language plpgsql; + +select compos(); + +-- ... but this does +create or replace function compos() returns compostype as $$ +begin + return (1, 'hello')::compostype; +end; +$$ language plpgsql; + +select compos(); + +drop function compos(); + +-- test: return a row expr as record. +create or replace function composrec() returns record as $$ +declare + v record; +begin + v := (1, 'hello'); + return v; +end; +$$ language plpgsql; + +select composrec(); + +-- test: return row expr in return statement. +create or replace function composrec() returns record as $$ +begin + return (1, 'hello'); +end; +$$ language plpgsql; + +select composrec(); + +drop function composrec(); + +-- test: row expr in RETURN NEXT statement. +create or replace function compos() returns setof compostype as $$ +begin + for i in 1..3 + loop + return next (1, 'hello'::varchar); + end loop; + return next null::compostype; + return next (2, 'goodbye')::compostype; +end; +$$ language plpgsql; + +select * from compos(); + +drop function compos(); + +-- test: use invalid expr in return statement. +create or replace function compos() returns compostype as $$ +begin + return 1 + 1; +end; +$$ language plpgsql; + +select compos(); + +-- RETURN variable is a different code path ... +create or replace function compos() returns compostype as $$ +declare x int := 42; +begin + return x; +end; +$$ language plpgsql; + +select * from compos(); + +drop function compos(); + +-- test: invalid use of composite variable in scalar-returning function +create or replace function compos() returns int as $$ +declare + v compostype; +begin + v := (1, 'hello'); + return v; +end; +$$ language plpgsql; + +select compos(); + +-- test: invalid use of composite expression in scalar-returning function +create or replace function compos() returns int as $$ +begin + return (1, 'hello')::compostype; +end; +$$ language plpgsql; + +select compos(); + +drop function compos(); +drop type compostype; + +-- +-- Tests for 8.4's new RAISE features +-- + +create or replace function raise_test() returns void as $$ +begin + raise notice '% % %', 1, 2, 3 + using errcode = '55001', detail = 'some detail info', hint = 'some hint'; + raise '% % %', 1, 2, 3 + using errcode = 'division_by_zero', detail = 'some detail info'; +end; +$$ language plpgsql; + +select raise_test(); + +-- Since we can't actually see the thrown SQLSTATE in default psql output, +-- test it like this; this also tests re-RAISE + +create or replace function raise_test() returns void as $$ +begin + raise 'check me' + using errcode = 'division_by_zero', detail = 'some detail info'; + exception + when others then + raise notice 'SQLSTATE: % SQLERRM: %', sqlstate, sqlerrm; + raise; +end; +$$ language plpgsql; + +select raise_test(); + +create or replace function raise_test() returns void as $$ +begin + raise 'check me' + using errcode = '1234F', detail = 'some detail info'; + exception + when others then + raise notice 'SQLSTATE: % SQLERRM: %', sqlstate, sqlerrm; + raise; +end; +$$ language plpgsql; + +select raise_test(); + +-- SQLSTATE specification in WHEN +create or replace function raise_test() returns void as $$ +begin + raise 'check me' + using errcode = '1234F', detail = 'some detail info'; + exception + when sqlstate '1234F' then + raise notice 'SQLSTATE: % SQLERRM: %', sqlstate, sqlerrm; + raise; +end; +$$ language plpgsql; + +select raise_test(); + +create or replace function raise_test() returns void as $$ +begin + raise division_by_zero using detail = 'some detail info'; + exception + when others then + raise notice 'SQLSTATE: % SQLERRM: %', sqlstate, sqlerrm; + raise; +end; +$$ language plpgsql; + +select raise_test(); + +create or replace function raise_test() returns void as $$ +begin + raise division_by_zero; +end; +$$ language plpgsql; + +select raise_test(); + +create or replace function raise_test() returns void as $$ +begin + raise sqlstate '1234F'; +end; +$$ language plpgsql; + +select raise_test(); + +create or replace function raise_test() returns void as $$ +begin + raise division_by_zero using message = 'custom' || ' message'; +end; +$$ language plpgsql; + +select raise_test(); + +create or replace function raise_test() returns void as $$ +begin + raise using message = 'custom' || ' message', errcode = '22012'; +end; +$$ language plpgsql; + +select raise_test(); + +-- conflict on message +create or replace function raise_test() returns void as $$ +begin + raise notice 'some message' using message = 'custom' || ' message', errcode = '22012'; +end; +$$ language plpgsql; + +select raise_test(); + +-- conflict on errcode +create or replace function raise_test() returns void as $$ +begin + raise division_by_zero using message = 'custom' || ' message', errcode = '22012'; +end; +$$ language plpgsql; + +select raise_test(); + +-- nothing to re-RAISE +create or replace function raise_test() returns void as $$ +begin + raise; +end; +$$ language plpgsql; + +select raise_test(); + +-- test access to exception data +create function zero_divide() returns int as $$ +declare v int := 0; +begin + return 10 / v; +end; +$$ language plpgsql; + +create or replace function raise_test() returns void as $$ +begin + raise exception 'custom exception' + using detail = 'some detail of custom exception', + hint = 'some hint related to custom exception'; +end; +$$ language plpgsql; + +create function stacked_diagnostics_test() returns void as $$ +declare _sqlstate text; + _message text; + _context text; +begin + perform zero_divide(); +exception when others then + get stacked diagnostics + _sqlstate = returned_sqlstate, + _message = message_text, + _context = pg_exception_context; + raise notice 'sqlstate: %, message: %, context: [%]', + _sqlstate, _message, replace(_context, E'\n', ' <- '); +end; +$$ language plpgsql; + +select stacked_diagnostics_test(); + +create or replace function stacked_diagnostics_test() returns void as $$ +declare _detail text; + _hint text; + _message text; +begin + perform raise_test(); +exception when others then + get stacked diagnostics + _message = message_text, + _detail = pg_exception_detail, + _hint = pg_exception_hint; + raise notice 'message: %, detail: %, hint: %', _message, _detail, _hint; +end; +$$ language plpgsql; + +select stacked_diagnostics_test(); + +-- fail, cannot use stacked diagnostics statement outside handler +create or replace function stacked_diagnostics_test() returns void as $$ +declare _detail text; + _hint text; + _message text; +begin + get stacked diagnostics + _message = message_text, + _detail = pg_exception_detail, + _hint = pg_exception_hint; + raise notice 'message: %, detail: %, hint: %', _message, _detail, _hint; +end; +$$ language plpgsql; + +select stacked_diagnostics_test(); + +drop function zero_divide(); +drop function stacked_diagnostics_test(); + +-- check cases where implicit SQLSTATE variable could be confused with +-- SQLSTATE as a keyword, cf bug #5524 +create or replace function raise_test() returns void as $$ +begin + perform 1/0; +exception + when sqlstate '22012' then + raise notice using message = sqlstate; + raise sqlstate '22012' using message = 'substitute message'; +end; +$$ language plpgsql; + +select raise_test(); + +drop function raise_test(); + +-- test passing column_name, constraint_name, datatype_name, table_name +-- and schema_name error fields + +create or replace function stacked_diagnostics_test() returns void as $$ +declare _column_name text; + _constraint_name text; + _datatype_name text; + _table_name text; + _schema_name text; +begin + raise exception using + column = '>>some column name<<', + constraint = '>>some constraint name<<', + datatype = '>>some datatype name<<', + table = '>>some table name<<', + schema = '>>some schema name<<'; +exception when others then + get stacked diagnostics + _column_name = column_name, + _constraint_name = constraint_name, + _datatype_name = pg_datatype_name, + _table_name = table_name, + _schema_name = schema_name; + raise notice 'column %, constraint %, type %, table %, schema %', + _column_name, _constraint_name, _datatype_name, _table_name, _schema_name; +end; +$$ language plpgsql; + +select stacked_diagnostics_test(); + +drop function stacked_diagnostics_test(); + +-- test variadic functions + +create or replace function vari(variadic int[]) +returns void as $$ +begin + for i in array_lower($1,1)..array_upper($1,1) loop + raise notice '%', $1[i]; + end loop; end; +$$ language plpgsql; + +select vari(1,2,3,4,5); +select vari(3,4,5); +select vari(variadic array[5,6,7]); + +drop function vari(int[]); + +-- coercion test +create or replace function pleast(variadic numeric[]) +returns numeric as $$ +declare aux numeric = $1[array_lower($1,1)]; +begin + for i in array_lower($1,1)+1..array_upper($1,1) loop + if $1[i] < aux then aux := $1[i]; end if; + end loop; + return aux; +end; +$$ language plpgsql immutable strict; + +select pleast(10,1,2,3,-16); +select pleast(10.2,2.2,-1.1); +select pleast(10.2,10, -20); +select pleast(10,20, -1.0); + +-- in case of conflict, non-variadic version is preferred +create or replace function pleast(numeric) +returns numeric as $$ +begin + raise notice 'non-variadic function called'; + return $1; +end; +$$ language plpgsql immutable strict; + +select pleast(10); + +drop function pleast(numeric[]); +drop function pleast(numeric); + +-- test table functions + +create function tftest(int) returns table(a int, b int) as $$ +begin + return query select $1, $1+i from generate_series(1,5) g(i); +end; +$$ language plpgsql immutable strict; + +select * from tftest(10); + +create or replace function tftest(a1 int) returns table(a int, b int) as $$ +begin + a := a1; b := a1 + 1; + return next; + a := a1 * 10; b := a1 * 10 + 1; + return next; +end; +$$ language plpgsql immutable strict; + +select * from tftest(10); + +drop function tftest(int); + +create function rttest() +returns setof int as $$ +declare rc int; +begin + return query values(10),(20); + get diagnostics rc = row_count; + raise notice '% %', found, rc; + return query select * from (values(10),(20)) f(a) where false; + get diagnostics rc = row_count; + raise notice '% %', found, rc; + return query execute 'values(10),(20)'; + get diagnostics rc = row_count; + raise notice '% %', found, rc; + return query execute 'select * from (values(10),(20)) f(a) where false'; + get diagnostics rc = row_count; + raise notice '% %', found, rc; +end; +$$ language plpgsql; + +select * from rttest(); + +-- check some error cases, too + +create or replace function rttest() +returns setof int as $$ +begin + return query select 10 into no_such_table; +end; +$$ language plpgsql; + +select * from rttest(); + +create or replace function rttest() +returns setof int as $$ +begin + return query execute 'select 10 into no_such_table'; +end; +$$ language plpgsql; + +select * from rttest(); + +select * from no_such_table; + +drop function rttest(); + +-- Test for proper cleanup at subtransaction exit. This example +-- exposed a bug in PG 8.2. + +CREATE FUNCTION leaker_1(fail BOOL) RETURNS INTEGER AS $$ +DECLARE + v_var INTEGER; +BEGIN + BEGIN + v_var := (leaker_2(fail)).error_code; + EXCEPTION + WHEN others THEN RETURN 0; + END; + RETURN 1; +END; +$$ LANGUAGE plpgsql; + +CREATE FUNCTION leaker_2(fail BOOL, OUT error_code INTEGER, OUT new_id INTEGER) + RETURNS RECORD AS $$ +BEGIN + IF fail THEN + RAISE EXCEPTION 'fail ...'; + END IF; + error_code := 1; + new_id := 1; + RETURN; +END; +$$ LANGUAGE plpgsql; + +SELECT * FROM leaker_1(false); +SELECT * FROM leaker_1(true); + +DROP FUNCTION leaker_1(bool); +DROP FUNCTION leaker_2(bool); + +-- Test for appropriate cleanup of non-simple expression evaluations +-- (bug in all versions prior to August 2010) + +CREATE FUNCTION nonsimple_expr_test() RETURNS text[] AS $$ +DECLARE + arr text[]; + lr text; + i integer; +BEGIN + arr := array[array['foo','bar'], array['baz', 'quux']]; + lr := 'fool'; + i := 1; + -- use sub-SELECTs to make expressions non-simple + arr[(SELECT i)][(SELECT i+1)] := (SELECT lr); + RETURN arr; +END; +$$ LANGUAGE plpgsql; + +SELECT nonsimple_expr_test(); + +DROP FUNCTION nonsimple_expr_test(); + +CREATE FUNCTION nonsimple_expr_test() RETURNS integer AS $$ +declare + i integer NOT NULL := 0; +begin + begin + i := (SELECT NULL::integer); -- should throw error + exception + WHEN OTHERS THEN + i := (SELECT 1::integer); + end; + return i; +end; +$$ LANGUAGE plpgsql; + +SELECT nonsimple_expr_test(); + +DROP FUNCTION nonsimple_expr_test(); + +-- +-- Test cases involving recursion and error recovery in simple expressions +-- (bugs in all versions before October 2010). The problems are most +-- easily exposed by mutual recursion between plpgsql and sql functions. +-- + +create function recurse(float8) returns float8 as +$$ +begin + if ($1 > 0) then + return sql_recurse($1 - 1); + else + return $1; + end if; +end; +$$ language plpgsql; + +-- "limit" is to prevent this from being inlined +create function sql_recurse(float8) returns float8 as +$$ select recurse($1) limit 1; $$ language sql; + +select recurse(10); + +create function error1(text) returns text language sql as +$$ SELECT relname::text FROM pg_class c WHERE c.oid = $1::regclass $$; + +create function error2(p_name_table text) returns text language plpgsql as $$ +begin + return error1(p_name_table); +end$$; + +BEGIN; +create table public.stuffs (stuff text); +SAVEPOINT a; +select error2('nonexistent.stuffs'); +ROLLBACK TO a; +select error2('public.stuffs'); +rollback; + +drop function error2(p_name_table text); +drop function error1(text); + +-- Test for proper handling of cast-expression caching + +create function sql_to_date(integer) returns date as $$ +select $1::text::date +$$ language sql immutable strict; + +create cast (integer as date) with function sql_to_date(integer) as assignment; + +create function cast_invoker(integer) returns date as $$ +begin + return $1; +end$$ language plpgsql; + +select cast_invoker(20150717); +select cast_invoker(20150718); -- second call crashed in pre-release 9.5 + +begin; +select cast_invoker(20150717); +select cast_invoker(20150718); +savepoint s1; +select cast_invoker(20150718); +select cast_invoker(-1); -- fails +rollback to savepoint s1; +select cast_invoker(20150719); +select cast_invoker(20150720); +commit; + +drop function cast_invoker(integer); +drop function sql_to_date(integer) cascade; + +-- Test handling of cast cache inside DO blocks +-- (to check the original crash case, this must be a cast not previously +-- used in this session) + +begin; +do $$ declare x text[]; begin x := '{1.23, 4.56}'::numeric[]; end $$; +do $$ declare x text[]; begin x := '{1.23, 4.56}'::numeric[]; end $$; +end; + +-- Test for consistent reporting of error context + +create function fail() returns int language plpgsql as $$ +begin + return 1/0; +end +$$; + +select fail(); +select fail(); + +drop function fail(); + +-- Test handling of string literals. + +set standard_conforming_strings = off; + +create or replace function strtest() returns text as $$ +begin + raise notice 'foo\\bar\041baz'; + return 'foo\\bar\041baz'; +end +$$ language plpgsql; + +select strtest(); + +create or replace function strtest() returns text as $$ +begin + raise notice E'foo\\bar\041baz'; + return E'foo\\bar\041baz'; +end +$$ language plpgsql; + +select strtest(); + +set standard_conforming_strings = on; + +create or replace function strtest() returns text as $$ +begin + raise notice 'foo\\bar\041baz\'; + return 'foo\\bar\041baz\'; +end +$$ language plpgsql; + +select strtest(); + +create or replace function strtest() returns text as $$ +begin + raise notice E'foo\\bar\041baz'; + return E'foo\\bar\041baz'; +end +$$ language plpgsql; + +select strtest(); + +drop function strtest(); + +-- Test anonymous code blocks. + +DO $$ +DECLARE r record; +BEGIN + FOR r IN SELECT rtrim(roomno) AS roomno, comment FROM Room ORDER BY roomno + LOOP + RAISE NOTICE '%, %', r.roomno, r.comment; + END LOOP; +END$$; + +-- these are to check syntax error reporting +DO LANGUAGE plpgsql $$begin return 1; end$$; + +DO $$ +DECLARE r record; +BEGIN + FOR r IN SELECT rtrim(roomno) AS roomno, foo FROM Room ORDER BY roomno + LOOP + RAISE NOTICE '%, %', r.roomno, r.comment; + END LOOP; +END$$; + +-- Check handling of errors thrown from/into anonymous code blocks. +do $outer$ +begin + for i in 1..10 loop + begin + execute $ex$ + do $$ + declare x int = 0; + begin + x := 1 / x; + end; + $$; + $ex$; + exception when division_by_zero then + raise notice 'caught division by zero'; + end; + end loop; +end; +$outer$; + +-- Check variable scoping -- a var is not available in its own or prior +-- default expressions. + +create function scope_test() returns int as $$ +declare x int := 42; +begin + declare y int := x + 1; + x int := x + 2; + begin + return x * 100 + y; + end; +end; +$$ language plpgsql; + +select scope_test(); + +drop function scope_test(); + +-- Check handling of conflicts between plpgsql vars and table columns. + +set plpgsql.variable_conflict = error; + +create function conflict_test() returns setof int8_tbl as $$ +declare r record; + q1 bigint := 42; +begin + for r in select q1,q2 from int8_tbl loop + return next r; + end loop; +end; +$$ language plpgsql; + +select * from conflict_test(); + +create or replace function conflict_test() returns setof int8_tbl as $$ +#variable_conflict use_variable +declare r record; + q1 bigint := 42; +begin + for r in select q1,q2 from int8_tbl loop + return next r; + end loop; +end; +$$ language plpgsql; + +select * from conflict_test(); + +create or replace function conflict_test() returns setof int8_tbl as $$ +#variable_conflict use_column +declare r record; + q1 bigint := 42; +begin + for r in select q1,q2 from int8_tbl loop + return next r; + end loop; +end; +$$ language plpgsql; + +select * from conflict_test(); + +drop function conflict_test(); + +-- Check that an unreserved keyword can be used as a variable name + +create function unreserved_test() returns int as $$ +declare + forward int := 21; +begin + forward := forward * 2; + return forward; +end +$$ language plpgsql; + +select unreserved_test(); + +create or replace function unreserved_test() returns int as $$ +declare + return int := 42; +begin + return := return + 1; + return return; +end +$$ language plpgsql; + +select unreserved_test(); + +create or replace function unreserved_test() returns int as $$ +declare + comment int := 21; +begin + comment := comment * 2; + comment on function unreserved_test() is 'this is a test'; + return comment; +end +$$ language plpgsql; + +select unreserved_test(); + +select obj_description('unreserved_test()'::regprocedure, 'pg_proc'); + +drop function unreserved_test(); + +-- +-- Test FOREACH over arrays +-- + +create function foreach_test(anyarray) +returns void as $$ +declare x int; +begin + foreach x in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; + +select foreach_test(ARRAY[1,2,3,4]); +select foreach_test(ARRAY[[1,2],[3,4]]); + +create or replace function foreach_test(anyarray) +returns void as $$ +declare x int; +begin + foreach x slice 1 in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; + +-- should fail +select foreach_test(ARRAY[1,2,3,4]); +select foreach_test(ARRAY[[1,2],[3,4]]); + +create or replace function foreach_test(anyarray) +returns void as $$ +declare x int[]; +begin + foreach x slice 1 in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; + +select foreach_test(ARRAY[1,2,3,4]); +select foreach_test(ARRAY[[1,2],[3,4]]); + +-- higher level of slicing +create or replace function foreach_test(anyarray) +returns void as $$ +declare x int[]; +begin + foreach x slice 2 in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; + +-- should fail +select foreach_test(ARRAY[1,2,3,4]); +-- ok +select foreach_test(ARRAY[[1,2],[3,4]]); +select foreach_test(ARRAY[[[1,2]],[[3,4]]]); + +create type xy_tuple AS (x int, y int); + +-- iteration over array of records +create or replace function foreach_test(anyarray) +returns void as $$ +declare r record; +begin + foreach r in array $1 + loop + raise notice '%', r; + end loop; + end; +$$ language plpgsql; + +select foreach_test(ARRAY[(10,20),(40,69),(35,78)]::xy_tuple[]); +select foreach_test(ARRAY[[(10,20),(40,69)],[(35,78),(88,76)]]::xy_tuple[]); + +create or replace function foreach_test(anyarray) +returns void as $$ +declare x int; y int; +begin + foreach x, y in array $1 + loop + raise notice 'x = %, y = %', x, y; + end loop; + end; +$$ language plpgsql; + +select foreach_test(ARRAY[(10,20),(40,69),(35,78)]::xy_tuple[]); +select foreach_test(ARRAY[[(10,20),(40,69)],[(35,78),(88,76)]]::xy_tuple[]); + +-- slicing over array of composite types +create or replace function foreach_test(anyarray) +returns void as $$ +declare x xy_tuple[]; +begin + foreach x slice 1 in array $1 + loop + raise notice '%', x; + end loop; + end; +$$ language plpgsql; + +select foreach_test(ARRAY[(10,20),(40,69),(35,78)]::xy_tuple[]); +select foreach_test(ARRAY[[(10,20),(40,69)],[(35,78),(88,76)]]::xy_tuple[]); + +drop function foreach_test(anyarray); +drop type xy_tuple; + +-- +-- Assorted tests for array subscript assignment +-- + +create temp table rtype (id int, ar text[]); + +create function arrayassign1() returns text[] language plpgsql as $$ +declare + r record; +begin + r := row(12, '{foo,bar,baz}')::rtype; + r.ar[2] := 'replace'; + return r.ar; +end$$; + +select arrayassign1(); +select arrayassign1(); -- try again to exercise internal caching + +create domain orderedarray as int[2] + constraint sorted check (value[1] < value[2]); + +select '{1,2}'::orderedarray; +select '{2,1}'::orderedarray; -- fail + +create function testoa(x1 int, x2 int, x3 int) returns orderedarray +language plpgsql as $$ +declare res orderedarray; +begin + res := array[x1, x2]; + res[2] := x3; + return res; +end$$; + +select testoa(1,2,3); +select testoa(1,2,3); -- try again to exercise internal caching +select testoa(2,1,3); -- fail at initial assign +select testoa(1,2,1); -- fail at update + +drop function arrayassign1(); +drop function testoa(x1 int, x2 int, x3 int); + + +-- +-- Test handling of expanded arrays +-- + +create function returns_rw_array(int) returns int[] +language plpgsql as $$ + declare r int[]; + begin r := array[$1, $1]; return r; end; +$$ stable; + +create function consumes_rw_array(int[]) returns int +language plpgsql as $$ + begin return $1[1]; end; +$$ stable; + +select consumes_rw_array(returns_rw_array(42)); + +-- bug #14174 +explain (verbose, costs off) +select i, a from + (select returns_rw_array(1) as a offset 0) ss, + lateral consumes_rw_array(a) i; + +select i, a from + (select returns_rw_array(1) as a offset 0) ss, + lateral consumes_rw_array(a) i; + +explain (verbose, costs off) +select consumes_rw_array(a), a from returns_rw_array(1) a; + +select consumes_rw_array(a), a from returns_rw_array(1) a; + +explain (verbose, costs off) +select consumes_rw_array(a), a from + (values (returns_rw_array(1)), (returns_rw_array(2))) v(a); + +select consumes_rw_array(a), a from + (values (returns_rw_array(1)), (returns_rw_array(2))) v(a); + +do $$ +declare a int[] := array[1,2]; +begin + a := a || 3; + raise notice 'a = %', a; +end$$; + + +-- +-- Test access to call stack +-- + +create function inner_func(int) +returns int as $$ +declare _context text; +begin + get diagnostics _context = pg_context; + raise notice '***%***', _context; + -- lets do it again, just for fun.. + get diagnostics _context = pg_context; + raise notice '***%***', _context; + raise notice 'lets make sure we didnt break anything'; + return 2 * $1; +end; +$$ language plpgsql; + +create or replace function outer_func(int) +returns int as $$ +declare + myresult int; +begin + raise notice 'calling down into inner_func()'; + myresult := inner_func($1); + raise notice 'inner_func() done'; + return myresult; +end; +$$ language plpgsql; + +create or replace function outer_outer_func(int) +returns int as $$ +declare + myresult int; +begin + raise notice 'calling down into outer_func()'; + myresult := outer_func($1); + raise notice 'outer_func() done'; + return myresult; +end; +$$ language plpgsql; + +select outer_outer_func(10); +-- repeated call should to work +select outer_outer_func(20); + +drop function outer_outer_func(int); +drop function outer_func(int); +drop function inner_func(int); + +-- access to call stack from exception +create function inner_func(int) +returns int as $$ +declare + _context text; + sx int := 5; +begin + begin + perform sx / 0; + exception + when division_by_zero then + get diagnostics _context = pg_context; + raise notice '***%***', _context; + end; + + -- lets do it again, just for fun.. + get diagnostics _context = pg_context; + raise notice '***%***', _context; + raise notice 'lets make sure we didnt break anything'; + return 2 * $1; +end; +$$ language plpgsql; + +create or replace function outer_func(int) +returns int as $$ +declare + myresult int; +begin + raise notice 'calling down into inner_func()'; + myresult := inner_func($1); + raise notice 'inner_func() done'; + return myresult; +end; +$$ language plpgsql; + +create or replace function outer_outer_func(int) +returns int as $$ +declare + myresult int; +begin + raise notice 'calling down into outer_func()'; + myresult := outer_func($1); + raise notice 'outer_func() done'; + return myresult; +end; +$$ language plpgsql; + +select outer_outer_func(10); +-- repeated call should to work +select outer_outer_func(20); + +drop function outer_outer_func(int); +drop function outer_func(int); +drop function inner_func(int); + +-- +-- Test ASSERT +-- + +do $$ +begin + assert 1=1; -- should succeed +end; +$$; + +do $$ +begin + assert 1=0; -- should fail +end; +$$; + +do $$ +begin + assert NULL; -- should fail +end; +$$; + +-- check controlling GUC +set plpgsql.check_asserts = off; +do $$ +begin + assert 1=0; -- won't be tested +end; +$$; +reset plpgsql.check_asserts; + +-- test custom message +do $$ +declare var text := 'some value'; +begin + assert 1=0, format('assertion failed, var = "%s"', var); +end; +$$; + +-- ensure assertions are not trapped by 'others' +do $$ +begin + assert 1=0, 'unhandled assertion'; +exception when others then + null; -- do nothing +end; +$$; + +-- Test use of plpgsql in a domain check constraint (cf. bug #14414) + +create function plpgsql_domain_check(val int) returns boolean as $$ +begin return val > 0; end +$$ language plpgsql immutable; + +create domain plpgsql_domain as integer check(plpgsql_domain_check(value)); + +do $$ +declare v_test plpgsql_domain; +begin + v_test := 1; +end; +$$; + +do $$ +declare v_test plpgsql_domain := 1; +begin + v_test := 0; -- fail +end; +$$; + +-- Test handling of expanded array passed to a domain constraint (bug #14472) + +create function plpgsql_arr_domain_check(val int[]) returns boolean as $$ +begin return val[1] > 0; end +$$ language plpgsql immutable; + +create domain plpgsql_arr_domain as int[] check(plpgsql_arr_domain_check(value)); + +do $$ +declare v_test plpgsql_arr_domain; +begin + v_test := array[1]; + v_test := v_test || 2; +end; +$$; + +do $$ +declare v_test plpgsql_arr_domain := array[1]; +begin + v_test := 0 || v_test; -- fail +end; +$$; diff --git a/src/test/singlenode_regress/sql/point.sql b/src/test/singlenode_regress/sql/point.sql new file mode 100644 index 00000000000..58f1bc5599a --- /dev/null +++ b/src/test/singlenode_regress/sql/point.sql @@ -0,0 +1,120 @@ +-- +-- POINT +-- + +-- avoid bit-exact output here because operations may not be bit-exact. +SET extra_float_digits = 0; + +CREATE TABLE POINT_TBL(f1 point); + +INSERT INTO POINT_TBL(f1) VALUES ('(0.0,0.0)'); + +ANALYZE POINT_TBL; + +INSERT INTO POINT_TBL(f1) VALUES ('(-10.0,0.0)'); + +INSERT INTO POINT_TBL(f1) VALUES ('(-3.0,4.0)'); + +INSERT INTO POINT_TBL(f1) VALUES ('(5.1, 34.5)'); + +INSERT INTO POINT_TBL(f1) VALUES ('(-5.0,-12.0)'); + +INSERT INTO POINT_TBL(f1) VALUES ('(1e-300,-1e-300)'); -- To underflow + +INSERT INTO POINT_TBL(f1) VALUES ('(1e+300,Inf)'); -- To overflow + +INSERT INTO POINT_TBL(f1) VALUES ('(Inf,1e+300)'); -- Transposed + +INSERT INTO POINT_TBL(f1) VALUES (' ( Nan , NaN ) '); + +-- bad format points +INSERT INTO POINT_TBL(f1) VALUES ('asdfasdf'); + +INSERT INTO POINT_TBL(f1) VALUES ('10.0,10.0'); + +INSERT INTO POINT_TBL(f1) VALUES ('(10.0 10.0)'); + +INSERT INTO POINT_TBL(f1) VALUES ('(10.0, 10.0) x'); + +INSERT INTO POINT_TBL(f1) VALUES ('(10.0,10.0'); + +INSERT INTO POINT_TBL(f1) VALUES ('(10.0, 1e+500)'); -- Out of range + + +SELECT * FROM POINT_TBL; + +-- left of +SELECT p.* FROM POINT_TBL p WHERE p.f1 << '(0.0, 0.0)'; + +-- right of +SELECT p.* FROM POINT_TBL p WHERE '(0.0,0.0)' >> p.f1; + +-- above +SELECT p.* FROM POINT_TBL p WHERE '(0.0,0.0)' |>> p.f1; + +-- below +SELECT p.* FROM POINT_TBL p WHERE p.f1 <<| '(0.0, 0.0)'; + +-- equal +SELECT p.* FROM POINT_TBL p WHERE p.f1 ~= '(5.1, 34.5)'; + +-- point in box +SELECT p.* FROM POINT_TBL p + WHERE p.f1 <@ box '(0,0,100,100)'; + +SELECT p.* FROM POINT_TBL p + WHERE box '(0,0,100,100)' @> p.f1; + +SELECT p.* FROM POINT_TBL p + WHERE not p.f1 <@ box '(0,0,100,100)'; + +SELECT p.* FROM POINT_TBL p + WHERE p.f1 <@ path '[(0,0),(-10,0),(-10,10)]'; + +SELECT p.* FROM POINT_TBL p + WHERE not box '(0,0,100,100)' @> p.f1; + +SELECT p.f1, p.f1 <-> point '(0,0)' AS dist + FROM POINT_TBL p + ORDER BY dist; + +SELECT p1.f1 AS point1, p2.f1 AS point2, p1.f1 <-> p2.f1 AS dist + FROM POINT_TBL p1, POINT_TBL p2 + ORDER BY dist, p1.f1[0], p2.f1[0]; + +SELECT p1.f1 AS point1, p2.f1 AS point2 + FROM POINT_TBL p1, POINT_TBL p2 + WHERE (p1.f1 <-> p2.f1) > 3; + +-- put distance result into output to allow sorting with GEQ optimizer - tgl 97/05/10 +SELECT p1.f1 AS point1, p2.f1 AS point2, (p1.f1 <-> p2.f1) AS distance + FROM POINT_TBL p1, POINT_TBL p2 + WHERE (p1.f1 <-> p2.f1) > 3 and p1.f1 << p2.f1 + ORDER BY distance, p1.f1[0], p2.f1[0]; + +-- put distance result into output to allow sorting with GEQ optimizer - tgl 97/05/10 +SELECT p1.f1 AS point1, p2.f1 AS point2, (p1.f1 <-> p2.f1) AS distance + FROM POINT_TBL p1, POINT_TBL p2 + WHERE (p1.f1 <-> p2.f1) > 3 and p1.f1 << p2.f1 and p1.f1 |>> p2.f1 + ORDER BY distance; + +-- Test that GiST indexes provide same behavior as sequential scan +CREATE TEMP TABLE point_gist_tbl(f1 point); +INSERT INTO point_gist_tbl SELECT '(0,0)' FROM generate_series(0,1000); +CREATE INDEX point_gist_tbl_index ON point_gist_tbl USING gist (f1); +INSERT INTO point_gist_tbl VALUES ('(0.0000009,0.0000009)'); +SET enable_seqscan TO true; +SET enable_indexscan TO false; +SET enable_bitmapscan TO false; +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 ~= '(0.0000009,0.0000009)'::point; +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 <@ '(0.0000009,0.0000009),(0.0000009,0.0000009)'::box; +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 ~= '(0.0000018,0.0000018)'::point; +SET enable_seqscan TO false; +SET enable_indexscan TO true; +SET enable_bitmapscan TO true; +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 ~= '(0.0000009,0.0000009)'::point; +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 <@ '(0.0000009,0.0000009),(0.0000009,0.0000009)'::box; +SELECT COUNT(*) FROM point_gist_tbl WHERE f1 ~= '(0.0000018,0.0000018)'::point; +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/src/test/singlenode_regress/sql/polygon.sql b/src/test/singlenode_regress/sql/polygon.sql new file mode 100644 index 00000000000..f53b2cb6309 --- /dev/null +++ b/src/test/singlenode_regress/sql/polygon.sql @@ -0,0 +1,142 @@ +-- +-- POLYGON +-- +-- polygon logic +-- + +CREATE TABLE POLYGON_TBL(f1 polygon); + + +INSERT INTO POLYGON_TBL(f1) VALUES ('(2.0,0.0),(2.0,4.0),(0.0,0.0)'); + +INSERT INTO POLYGON_TBL(f1) VALUES ('(3.0,1.0),(3.0,3.0),(1.0,0.0)'); + +INSERT INTO POLYGON_TBL(f1) VALUES ('(1,2),(3,4),(5,6),(7,8)'); +INSERT INTO POLYGON_TBL(f1) VALUES ('(7,8),(5,6),(3,4),(1,2)'); -- Reverse +INSERT INTO POLYGON_TBL(f1) VALUES ('(1,2),(7,8),(5,6),(3,-4)'); + +-- degenerate polygons +INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0,0.0)'); + +INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0,1.0),(0.0,1.0)'); + +-- bad polygon input strings +INSERT INTO POLYGON_TBL(f1) VALUES ('0.0'); + +INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0 0.0'); + +INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2)'); + +INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2,3'); + +INSERT INTO POLYGON_TBL(f1) VALUES ('asdf'); + + +SELECT * FROM POLYGON_TBL; + +-- +-- Test the SP-GiST index +-- + +CREATE TABLE quad_poly_tbl (id int, p polygon); + +INSERT INTO quad_poly_tbl + SELECT (x - 1) * 100 + y, polygon(circle(point(x * 10, y * 10), 1 + (x + y) % 10)) + FROM generate_series(1, 100) x, + generate_series(1, 100) y; + +INSERT INTO quad_poly_tbl + SELECT i, polygon '((200, 300),(210, 310),(230, 290))' + FROM generate_series(10001, 11000) AS i; + +INSERT INTO quad_poly_tbl + VALUES + (11001, NULL), + (11002, NULL), + (11003, NULL); + +CREATE INDEX quad_poly_tbl_idx ON quad_poly_tbl USING spgist(p); + +-- get reference results for ORDER BY distance from seq scan +SET enable_seqscan = ON; +SET enable_indexscan = OFF; +SET enable_bitmapscan = OFF; + +CREATE TEMP TABLE quad_poly_tbl_ord_seq2 AS +SELECT rank() OVER (ORDER BY p <-> point '123,456') n, p <-> point '123,456' dist, id +FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; + +-- check results from index scan +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_bitmapscan = ON; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p << polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p << polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p &< polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p &< polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p && polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p && polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p &> polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p &> polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p >> polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p >> polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p <<| polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p <<| polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p &<| polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p &<| polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p |&> polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p |&> polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p |>> polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p |>> polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; +SELECT count(*) FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p @> polygon '((340,550),(343,552),(341,553))'; +SELECT count(*) FROM quad_poly_tbl WHERE p @> polygon '((340,550),(343,552),(341,553))'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM quad_poly_tbl WHERE p ~= polygon '((200, 300),(210, 310),(230, 290))'; +SELECT count(*) FROM quad_poly_tbl WHERE p ~= polygon '((200, 300),(210, 310),(230, 290))'; + +-- test ORDER BY distance +SET enable_indexscan = ON; +SET enable_bitmapscan = OFF; + +EXPLAIN (COSTS OFF) +SELECT rank() OVER (ORDER BY p <-> point '123,456') n, p <-> point '123,456' dist, id +FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; + +CREATE TEMP TABLE quad_poly_tbl_ord_idx2 AS +SELECT rank() OVER (ORDER BY p <-> point '123,456') n, p <-> point '123,456' dist, id +FROM quad_poly_tbl WHERE p <@ polygon '((300,300),(400,600),(600,500),(700,200))'; + +SELECT * +FROM quad_poly_tbl_ord_seq2 seq FULL JOIN quad_poly_tbl_ord_idx2 idx + ON seq.n = idx.n AND seq.id = idx.id AND + (seq.dist = idx.dist OR seq.dist IS NULL AND idx.dist IS NULL) +WHERE seq.id IS NULL OR idx.id IS NULL; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/src/test/singlenode_regress/sql/polymorphism.sql b/src/test/singlenode_regress/sql/polymorphism.sql new file mode 100644 index 00000000000..fa57db6559c --- /dev/null +++ b/src/test/singlenode_regress/sql/polymorphism.sql @@ -0,0 +1,1137 @@ +-- +-- Tests for polymorphic SQL functions and aggregates based on them. +-- Tests for other features related to function-calling have snuck in, too. +-- + +create function polyf(x anyelement) returns anyelement as $$ + select x + 1 +$$ language sql; + +select polyf(42) as int, polyf(4.5) as num; +select polyf(point(3,4)); -- fail for lack of + operator + +drop function polyf(x anyelement); + +create function polyf(x anyelement) returns anyarray as $$ + select array[x + 1, x + 2] +$$ language sql; + +select polyf(42) as int, polyf(4.5) as num; + +drop function polyf(x anyelement); + +create function polyf(x anyarray) returns anyelement as $$ + select x[1] +$$ language sql; + +select polyf(array[2,4]) as int, polyf(array[4.5, 7.7]) as num; + +select polyf(stavalues1) from pg_statistic; -- fail, can't infer element type + +drop function polyf(x anyarray); + +create function polyf(x anyarray) returns anyarray as $$ + select x +$$ language sql; + +select polyf(array[2,4]) as int, polyf(array[4.5, 7.7]) as num; + +select polyf(stavalues1) from pg_statistic; -- fail, can't infer element type + +drop function polyf(x anyarray); + +-- fail, can't infer type: +create function polyf(x anyelement) returns anyrange as $$ + select array[x + 1, x + 2] +$$ language sql; + +create function polyf(x anyrange) returns anyarray as $$ + select array[lower(x), upper(x)] +$$ language sql; + +select polyf(int4range(42, 49)) as int, polyf(float8range(4.5, 7.8)) as num; + +drop function polyf(x anyrange); + +create function polyf(x anycompatible, y anycompatible) returns anycompatiblearray as $$ + select array[x, y] +$$ language sql; + +select polyf(2, 4) as int, polyf(2, 4.5) as num; + +drop function polyf(x anycompatible, y anycompatible); + +create function polyf(x anycompatiblerange, y anycompatible, z anycompatible) returns anycompatiblearray as $$ + select array[lower(x), upper(x), y, z] +$$ language sql; + +select polyf(int4range(42, 49), 11, 2::smallint) as int, polyf(float8range(4.5, 7.8), 7.8, 11::real) as num; + +select polyf(int4range(42, 49), 11, 4.5) as fail; -- range type doesn't fit + +drop function polyf(x anycompatiblerange, y anycompatible, z anycompatible); + +create function polyf(x anycompatiblemultirange, y anycompatible, z anycompatible) returns anycompatiblearray as $$ + select array[lower(x), upper(x), y, z] +$$ language sql; + +select polyf(multirange(int4range(42, 49)), 11, 2::smallint) as int, polyf(multirange(float8range(4.5, 7.8)), 7.8, 11::real) as num; + +select polyf(multirange(int4range(42, 49)), 11, 4.5) as fail; -- range type doesn't fit + +drop function polyf(x anycompatiblemultirange, y anycompatible, z anycompatible); + +-- fail, can't infer type: +create function polyf(x anycompatible) returns anycompatiblerange as $$ + select array[x + 1, x + 2] +$$ language sql; + +create function polyf(x anycompatiblerange, y anycompatiblearray) returns anycompatiblerange as $$ + select x +$$ language sql; + +select polyf(int4range(42, 49), array[11]) as int, polyf(float8range(4.5, 7.8), array[7]) as num; + +drop function polyf(x anycompatiblerange, y anycompatiblearray); + +-- fail, can't infer type: +create function polyf(x anycompatible) returns anycompatiblemultirange as $$ + select array[x + 1, x + 2] +$$ language sql; + +create function polyf(x anycompatiblemultirange, y anycompatiblearray) returns anycompatiblemultirange as $$ + select x +$$ language sql; + +select polyf(multirange(int4range(42, 49)), array[11]) as int, polyf(multirange(float8range(4.5, 7.8)), array[7]) as num; + +drop function polyf(x anycompatiblemultirange, y anycompatiblearray); + +create function polyf(a anyelement, b anyarray, + c anycompatible, d anycompatible, + OUT x anyarray, OUT y anycompatiblearray) +as $$ + select a || b, array[c, d] +$$ language sql; + +select x, pg_typeof(x), y, pg_typeof(y) + from polyf(11, array[1, 2], 42, 34.5); +select x, pg_typeof(x), y, pg_typeof(y) + from polyf(11, array[1, 2], point(1,2), point(3,4)); +select x, pg_typeof(x), y, pg_typeof(y) + from polyf(11, '{1,2}', point(1,2), '(3,4)'); +select x, pg_typeof(x), y, pg_typeof(y) + from polyf(11, array[1, 2.2], 42, 34.5); -- fail + +drop function polyf(a anyelement, b anyarray, + c anycompatible, d anycompatible); + +create function polyf(anyrange) returns anymultirange +as 'select multirange($1);' language sql; + +select polyf(int4range(1,10)); +select polyf(null); + +drop function polyf(anyrange); + +create function polyf(anymultirange) returns anyelement +as 'select lower($1);' language sql; + +select polyf(int4multirange(int4range(1,10), int4range(20,30))); +select polyf(null); + +drop function polyf(anymultirange); + +create function polyf(anycompatiblerange) returns anycompatiblemultirange +as 'select multirange($1);' language sql; + +select polyf(int4range(1,10)); +select polyf(null); + +drop function polyf(anycompatiblerange); + +create function polyf(anymultirange) returns anyrange +as 'select range_merge($1);' language sql; + +select polyf(int4multirange(int4range(1,10), int4range(20,30))); +select polyf(null); + +drop function polyf(anymultirange); + +create function polyf(anycompatiblemultirange) returns anycompatiblerange +as 'select range_merge($1);' language sql; + +select polyf(int4multirange(int4range(1,10), int4range(20,30))); +select polyf(null); + +drop function polyf(anycompatiblemultirange); + +create function polyf(anycompatiblemultirange) returns anycompatible +as 'select lower($1);' language sql; + +select polyf(int4multirange(int4range(1,10), int4range(20,30))); +select polyf(null); + +drop function polyf(anycompatiblemultirange); + + +-- +-- Polymorphic aggregate tests +-- +-- Legend: +----------- +-- A = type is ANY +-- P = type is polymorphic +-- N = type is non-polymorphic +-- B = aggregate base type +-- S = aggregate state type +-- R = aggregate return type +-- 1 = arg1 of a function +-- 2 = arg2 of a function +-- ag = aggregate +-- tf = trans (state) function +-- ff = final function +-- rt = return type of a function +-- -> = implies +-- => = allowed +-- !> = not allowed +-- E = exists +-- NE = not-exists +-- +-- Possible states: +-- ---------------- +-- B = (A || P || N) +-- when (B = A) -> (tf2 = NE) +-- S = (P || N) +-- ff = (E || NE) +-- tf1 = (P || N) +-- tf2 = (NE || P || N) +-- R = (P || N) + +-- create functions for use as tf and ff with the needed combinations of +-- argument polymorphism, but within the constraints of valid aggregate +-- functions, i.e. tf arg1 and tf return type must match + +-- polymorphic single arg transfn +CREATE FUNCTION stfp(anyarray) RETURNS anyarray AS +'select $1' LANGUAGE SQL; +-- non-polymorphic single arg transfn +CREATE FUNCTION stfnp(int[]) RETURNS int[] AS +'select $1' LANGUAGE SQL; + +-- dual polymorphic transfn +CREATE FUNCTION tfp(anyarray,anyelement) RETURNS anyarray AS +'select $1 || $2' LANGUAGE SQL; +-- dual non-polymorphic transfn +CREATE FUNCTION tfnp(int[],int) RETURNS int[] AS +'select $1 || $2' LANGUAGE SQL; + +-- arg1 only polymorphic transfn +CREATE FUNCTION tf1p(anyarray,int) RETURNS anyarray AS +'select $1' LANGUAGE SQL; +-- arg2 only polymorphic transfn +CREATE FUNCTION tf2p(int[],anyelement) RETURNS int[] AS +'select $1' LANGUAGE SQL; + +-- multi-arg polymorphic +CREATE FUNCTION sum3(anyelement,anyelement,anyelement) returns anyelement AS +'select $1+$2+$3' language sql strict; + +-- finalfn polymorphic +CREATE FUNCTION ffp(anyarray) RETURNS anyarray AS +'select $1' LANGUAGE SQL; +-- finalfn non-polymorphic +CREATE FUNCTION ffnp(int[]) returns int[] as +'select $1' LANGUAGE SQL; + +-- Try to cover all the possible states: +-- +-- Note: in Cases 1 & 2, we are trying to return P. Therefore, if the transfn +-- is stfnp, tfnp, or tf2p, we must use ffp as finalfn, because stfnp, tfnp, +-- and tf2p do not return P. Conversely, in Cases 3 & 4, we are trying to +-- return N. Therefore, if the transfn is stfp, tfp, or tf1p, we must use ffnp +-- as finalfn, because stfp, tfp, and tf1p do not return N. +-- +-- Case1 (R = P) && (B = A) +-- ------------------------ +-- S tf1 +-- ------- +-- N N +-- should CREATE +CREATE AGGREGATE myaggp01a(*) (SFUNC = stfnp, STYPE = int4[], + FINALFUNC = ffp, INITCOND = '{}'); + +-- P N +-- should ERROR: stfnp(anyarray) not matched by stfnp(int[]) +CREATE AGGREGATE myaggp02a(*) (SFUNC = stfnp, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); + +-- N P +-- should CREATE +CREATE AGGREGATE myaggp03a(*) (SFUNC = stfp, STYPE = int4[], + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp03b(*) (SFUNC = stfp, STYPE = int4[], + INITCOND = '{}'); + +-- P P +-- should ERROR: we have no way to resolve S +CREATE AGGREGATE myaggp04a(*) (SFUNC = stfp, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp04b(*) (SFUNC = stfp, STYPE = anyarray, + INITCOND = '{}'); + + +-- Case2 (R = P) && ((B = P) || (B = N)) +-- ------------------------------------- +-- S tf1 B tf2 +-- ----------------------- +-- N N N N +-- should CREATE +CREATE AGGREGATE myaggp05a(BASETYPE = int, SFUNC = tfnp, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); + +-- N N N P +-- should CREATE +CREATE AGGREGATE myaggp06a(BASETYPE = int, SFUNC = tf2p, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); + +-- N N P N +-- should ERROR: tfnp(int[], anyelement) not matched by tfnp(int[], int) +CREATE AGGREGATE myaggp07a(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); + +-- N N P P +-- should CREATE +CREATE AGGREGATE myaggp08a(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); + +-- N P N N +-- should CREATE +CREATE AGGREGATE myaggp09a(BASETYPE = int, SFUNC = tf1p, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp09b(BASETYPE = int, SFUNC = tf1p, STYPE = int[], + INITCOND = '{}'); + +-- N P N P +-- should CREATE +CREATE AGGREGATE myaggp10a(BASETYPE = int, SFUNC = tfp, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp10b(BASETYPE = int, SFUNC = tfp, STYPE = int[], + INITCOND = '{}'); + +-- N P P N +-- should ERROR: tf1p(int[],anyelement) not matched by tf1p(anyarray,int) +CREATE AGGREGATE myaggp11a(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp11b(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], + INITCOND = '{}'); + +-- N P P P +-- should ERROR: tfp(int[],anyelement) not matched by tfp(anyarray,anyelement) +CREATE AGGREGATE myaggp12a(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp12b(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], + INITCOND = '{}'); + +-- P N N N +-- should ERROR: tfnp(anyarray, int) not matched by tfnp(int[],int) +CREATE AGGREGATE myaggp13a(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); + +-- P N N P +-- should ERROR: tf2p(anyarray, int) not matched by tf2p(int[],anyelement) +CREATE AGGREGATE myaggp14a(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); + +-- P N P N +-- should ERROR: tfnp(anyarray, anyelement) not matched by tfnp(int[],int) +CREATE AGGREGATE myaggp15a(BASETYPE = anyelement, SFUNC = tfnp, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); + +-- P N P P +-- should ERROR: tf2p(anyarray, anyelement) not matched by tf2p(int[],anyelement) +CREATE AGGREGATE myaggp16a(BASETYPE = anyelement, SFUNC = tf2p, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); + +-- P P N N +-- should ERROR: we have no way to resolve S +CREATE AGGREGATE myaggp17a(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp17b(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, + INITCOND = '{}'); + +-- P P N P +-- should ERROR: tfp(anyarray, int) not matched by tfp(anyarray, anyelement) +CREATE AGGREGATE myaggp18a(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, + FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp18b(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, + INITCOND = '{}'); + +-- P P P N +-- should ERROR: tf1p(anyarray, anyelement) not matched by tf1p(anyarray, int) +CREATE AGGREGATE myaggp19a(BASETYPE = anyelement, SFUNC = tf1p, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp19b(BASETYPE = anyelement, SFUNC = tf1p, + STYPE = anyarray, INITCOND = '{}'); + +-- P P P P +-- should CREATE +CREATE AGGREGATE myaggp20a(BASETYPE = anyelement, SFUNC = tfp, + STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); +CREATE AGGREGATE myaggp20b(BASETYPE = anyelement, SFUNC = tfp, + STYPE = anyarray, INITCOND = '{}'); + +-- Case3 (R = N) && (B = A) +-- ------------------------ +-- S tf1 +-- ------- +-- N N +-- should CREATE +CREATE AGGREGATE myaggn01a(*) (SFUNC = stfnp, STYPE = int4[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn01b(*) (SFUNC = stfnp, STYPE = int4[], + INITCOND = '{}'); + +-- P N +-- should ERROR: stfnp(anyarray) not matched by stfnp(int[]) +CREATE AGGREGATE myaggn02a(*) (SFUNC = stfnp, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn02b(*) (SFUNC = stfnp, STYPE = anyarray, + INITCOND = '{}'); + +-- N P +-- should CREATE +CREATE AGGREGATE myaggn03a(*) (SFUNC = stfp, STYPE = int4[], + FINALFUNC = ffnp, INITCOND = '{}'); + +-- P P +-- should ERROR: ffnp(anyarray) not matched by ffnp(int[]) +CREATE AGGREGATE myaggn04a(*) (SFUNC = stfp, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); + + +-- Case4 (R = N) && ((B = P) || (B = N)) +-- ------------------------------------- +-- S tf1 B tf2 +-- ----------------------- +-- N N N N +-- should CREATE +CREATE AGGREGATE myaggn05a(BASETYPE = int, SFUNC = tfnp, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn05b(BASETYPE = int, SFUNC = tfnp, STYPE = int[], + INITCOND = '{}'); + +-- N N N P +-- should CREATE +CREATE AGGREGATE myaggn06a(BASETYPE = int, SFUNC = tf2p, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn06b(BASETYPE = int, SFUNC = tf2p, STYPE = int[], + INITCOND = '{}'); + +-- N N P N +-- should ERROR: tfnp(int[], anyelement) not matched by tfnp(int[], int) +CREATE AGGREGATE myaggn07a(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn07b(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], + INITCOND = '{}'); + +-- N N P P +-- should CREATE +CREATE AGGREGATE myaggn08a(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn08b(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], + INITCOND = '{}'); + +-- N P N N +-- should CREATE +CREATE AGGREGATE myaggn09a(BASETYPE = int, SFUNC = tf1p, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); + +-- N P N P +-- should CREATE +CREATE AGGREGATE myaggn10a(BASETYPE = int, SFUNC = tfp, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); + +-- N P P N +-- should ERROR: tf1p(int[],anyelement) not matched by tf1p(anyarray,int) +CREATE AGGREGATE myaggn11a(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); + +-- N P P P +-- should ERROR: tfp(int[],anyelement) not matched by tfp(anyarray,anyelement) +CREATE AGGREGATE myaggn12a(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], + FINALFUNC = ffnp, INITCOND = '{}'); + +-- P N N N +-- should ERROR: tfnp(anyarray, int) not matched by tfnp(int[],int) +CREATE AGGREGATE myaggn13a(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn13b(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, + INITCOND = '{}'); + +-- P N N P +-- should ERROR: tf2p(anyarray, int) not matched by tf2p(int[],anyelement) +CREATE AGGREGATE myaggn14a(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn14b(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, + INITCOND = '{}'); + +-- P N P N +-- should ERROR: tfnp(anyarray, anyelement) not matched by tfnp(int[],int) +CREATE AGGREGATE myaggn15a(BASETYPE = anyelement, SFUNC = tfnp, + STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn15b(BASETYPE = anyelement, SFUNC = tfnp, + STYPE = anyarray, INITCOND = '{}'); + +-- P N P P +-- should ERROR: tf2p(anyarray, anyelement) not matched by tf2p(int[],anyelement) +CREATE AGGREGATE myaggn16a(BASETYPE = anyelement, SFUNC = tf2p, + STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); +CREATE AGGREGATE myaggn16b(BASETYPE = anyelement, SFUNC = tf2p, + STYPE = anyarray, INITCOND = '{}'); + +-- P P N N +-- should ERROR: ffnp(anyarray) not matched by ffnp(int[]) +CREATE AGGREGATE myaggn17a(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); + +-- P P N P +-- should ERROR: tfp(anyarray, int) not matched by tfp(anyarray, anyelement) +CREATE AGGREGATE myaggn18a(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, + FINALFUNC = ffnp, INITCOND = '{}'); + +-- P P P N +-- should ERROR: tf1p(anyarray, anyelement) not matched by tf1p(anyarray, int) +CREATE AGGREGATE myaggn19a(BASETYPE = anyelement, SFUNC = tf1p, + STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); + +-- P P P P +-- should ERROR: ffnp(anyarray) not matched by ffnp(int[]) +CREATE AGGREGATE myaggn20a(BASETYPE = anyelement, SFUNC = tfp, + STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); + +-- multi-arg polymorphic +CREATE AGGREGATE mysum2(anyelement,anyelement) (SFUNC = sum3, + STYPE = anyelement, INITCOND = '0'); + +-- create test data for polymorphic aggregates +create temp table t(f1 int, f2 int[], f3 text); +insert into t values(1,array[1],'a'); +insert into t values(1,array[11],'b'); +insert into t values(1,array[111],'c'); +insert into t values(2,array[2],'a'); +insert into t values(2,array[22],'b'); +insert into t values(2,array[222],'c'); +insert into t values(3,array[3],'a'); +insert into t values(3,array[3],'b'); + +-- test the successfully created polymorphic aggregates +select f3, myaggp01a(*) from t group by f3 order by f3; +select f3, myaggp03a(*) from t group by f3 order by f3; +select f3, myaggp03b(*) from t group by f3 order by f3; +select f3, myaggp05a(f1) from t group by f3 order by f3; +select f3, myaggp06a(f1) from t group by f3 order by f3; +select f3, myaggp08a(f1) from t group by f3 order by f3; +select f3, myaggp09a(f1) from t group by f3 order by f3; +select f3, myaggp09b(f1) from t group by f3 order by f3; +select f3, myaggp10a(f1) from t group by f3 order by f3; +select f3, myaggp10b(f1) from t group by f3 order by f3; +select f3, myaggp20a(f1) from t group by f3 order by f3; +select f3, myaggp20b(f1) from t group by f3 order by f3; +select f3, myaggn01a(*) from t group by f3 order by f3; +select f3, myaggn01b(*) from t group by f3 order by f3; +select f3, myaggn03a(*) from t group by f3 order by f3; +select f3, myaggn05a(f1) from t group by f3 order by f3; +select f3, myaggn05b(f1) from t group by f3 order by f3; +select f3, myaggn06a(f1) from t group by f3 order by f3; +select f3, myaggn06b(f1) from t group by f3 order by f3; +select f3, myaggn08a(f1) from t group by f3 order by f3; +select f3, myaggn08b(f1) from t group by f3 order by f3; +select f3, myaggn09a(f1) from t group by f3 order by f3; +select f3, myaggn10a(f1) from t group by f3 order by f3; +select mysum2(f1, f1 + 1) from t; + +-- test inlining of polymorphic SQL functions +create function bleat(int) returns int as $$ +begin + raise notice 'bleat %', $1; + return $1; +end$$ language plpgsql; + +create function sql_if(bool, anyelement, anyelement) returns anyelement as $$ +select case when $1 then $2 else $3 end $$ language sql; + +-- Note this would fail with integer overflow, never mind wrong bleat() output, +-- if the CASE expression were not successfully inlined +select f1, sql_if(f1 > 0, bleat(f1), bleat(f1 + 1)) from int4_tbl; + +select q2, sql_if(q2 > 0, q2, q2 + 1) from int8_tbl; + +-- another sort of polymorphic aggregate + +CREATE AGGREGATE array_larger_accum (anyarray) +( + sfunc = array_larger, + stype = anyarray, + initcond = '{}' +); + +SELECT array_larger_accum(i) +FROM (VALUES (ARRAY[1,2]), (ARRAY[3,4])) as t(i); + +SELECT array_larger_accum(i) +FROM (VALUES (ARRAY[row(1,2),row(3,4)]), (ARRAY[row(5,6),row(7,8)])) as t(i); + +-- another kind of polymorphic aggregate + +create function add_group(grp anyarray, ad anyelement, size integer) + returns anyarray + as $$ +begin + if grp is null then + return array[ad]; + end if; + if array_upper(grp, 1) < size then + return grp || ad; + end if; + return grp; +end; +$$ + language plpgsql immutable; + +create aggregate build_group(anyelement, integer) ( + SFUNC = add_group, + STYPE = anyarray +); + +select build_group(q1,3) from int8_tbl; + +-- this should fail because stype isn't compatible with arg +create aggregate build_group(int8, integer) ( + SFUNC = add_group, + STYPE = int2[] +); + +-- but we can make a non-poly agg from a poly sfunc if types are OK +create aggregate build_group(int8, integer) ( + SFUNC = add_group, + STYPE = int8[] +); + +-- check proper resolution of data types for polymorphic transfn/finalfn + +create function first_el_transfn(anyarray, anyelement) returns anyarray as +'select $1 || $2' language sql immutable; + +create function first_el(anyarray) returns anyelement as +'select $1[1]' language sql strict immutable; + +create aggregate first_el_agg_f8(float8) ( + SFUNC = array_append, + STYPE = float8[], + FINALFUNC = first_el +); + +create aggregate first_el_agg_any(anyelement) ( + SFUNC = first_el_transfn, + STYPE = anyarray, + FINALFUNC = first_el +); + +select first_el_agg_f8(x::float8) from generate_series(1,10) x; +select first_el_agg_any(x) from generate_series(1,10) x; +select first_el_agg_f8(x::float8) over(order by x) from generate_series(1,10) x; +select first_el_agg_any(x) over(order by x) from generate_series(1,10) x; + +-- check that we can apply functions taking ANYARRAY to pg_stats +select distinct array_ndims(histogram_bounds) from pg_stats +where histogram_bounds is not null; + +-- such functions must protect themselves if varying element type isn't OK +-- (WHERE clause here is to avoid possibly getting a collation error instead) +select max(histogram_bounds) from pg_stats where tablename = 'pg_am'; + +-- another corner case is the input functions for polymorphic pseudotypes +select array_in('{1,2,3}','int4'::regtype,-1); -- this has historically worked +select * from array_in('{1,2,3}','int4'::regtype,-1); -- this not +select anyrange_in('[10,20)','int4range'::regtype,-1); + +-- test variadic polymorphic functions + +create function myleast(variadic anyarray) returns anyelement as $$ + select min($1[i]) from generate_subscripts($1,1) g(i) +$$ language sql immutable strict; + +select myleast(10, 1, 20, 33); +select myleast(1.1, 0.22, 0.55); +select myleast('z'::text); +select myleast(); -- fail + +-- test with variadic call parameter +select myleast(variadic array[1,2,3,4,-1]); +select myleast(variadic array[1.1, -5.5]); + +--test with empty variadic call parameter +select myleast(variadic array[]::int[]); + +-- an example with some ordinary arguments too +create function concat(text, variadic anyarray) returns text as $$ + select array_to_string($2, $1); +$$ language sql immutable strict; + +select concat('%', 1, 2, 3, 4, 5); +select concat('|', 'a'::text, 'b', 'c'); +select concat('|', variadic array[1,2,33]); +select concat('|', variadic array[]::int[]); + +drop function concat(text, anyarray); + +-- mix variadic with anyelement +create function formarray(anyelement, variadic anyarray) returns anyarray as $$ + select array_prepend($1, $2); +$$ language sql immutable strict; + +select formarray(1,2,3,4,5); +select formarray(1.1, variadic array[1.2,55.5]); +select formarray(1.1, array[1.2,55.5]); -- fail without variadic +select formarray(1, 'x'::text); -- fail, type mismatch +select formarray(1, variadic array['x'::text]); -- fail, type mismatch + +drop function formarray(anyelement, variadic anyarray); + +-- test pg_typeof() function +select pg_typeof(null); -- unknown +select pg_typeof(0); -- integer +select pg_typeof(0.0); -- numeric +select pg_typeof(1+1 = 2); -- boolean +select pg_typeof('x'); -- unknown +select pg_typeof('' || ''); -- text +select pg_typeof(pg_typeof(0)); -- regtype +select pg_typeof(array[1.2,55.5]); -- numeric[] +select pg_typeof(myleast(10, 1, 20, 33)); -- polymorphic input + +-- test functions with default parameters + +-- test basic functionality +create function dfunc(a int = 1, int = 2) returns int as $$ + select $1 + $2; +$$ language sql; + +select dfunc(); +select dfunc(10); +select dfunc(10, 20); +select dfunc(10, 20, 30); -- fail + +drop function dfunc(); -- fail +drop function dfunc(int); -- fail +drop function dfunc(int, int); -- ok + +-- fail: defaults must be at end of argument list +create function dfunc(a int = 1, b int) returns int as $$ + select $1 + $2; +$$ language sql; + +-- however, this should work: +create function dfunc(a int = 1, out sum int, b int = 2) as $$ + select $1 + $2; +$$ language sql; + +select dfunc(); + +-- verify it lists properly +\df dfunc + +drop function dfunc(int, int); + +-- check implicit coercion +create function dfunc(a int DEFAULT 1.0, int DEFAULT '-1') returns int as $$ + select $1 + $2; +$$ language sql; +select dfunc(); + +create function dfunc(a text DEFAULT 'Hello', b text DEFAULT 'World') returns text as $$ + select $1 || ', ' || $2; +$$ language sql; + +select dfunc(); -- fail: which dfunc should be called? int or text +select dfunc('Hi'); -- ok +select dfunc('Hi', 'City'); -- ok +select dfunc(0); -- ok +select dfunc(10, 20); -- ok + +drop function dfunc(int, int); +drop function dfunc(text, text); + +create function dfunc(int = 1, int = 2) returns int as $$ + select 2; +$$ language sql; + +create function dfunc(int = 1, int = 2, int = 3, int = 4) returns int as $$ + select 4; +$$ language sql; + +-- Now, dfunc(nargs = 2) and dfunc(nargs = 4) are ambiguous when called +-- with 0 to 2 arguments. + +select dfunc(); -- fail +select dfunc(1); -- fail +select dfunc(1, 2); -- fail +select dfunc(1, 2, 3); -- ok +select dfunc(1, 2, 3, 4); -- ok + +drop function dfunc(int, int); +drop function dfunc(int, int, int, int); + +-- default values are not allowed for output parameters +create function dfunc(out int = 20) returns int as $$ + select 1; +$$ language sql; + +-- polymorphic parameter test +create function dfunc(anyelement = 'World'::text) returns text as $$ + select 'Hello, ' || $1::text; +$$ language sql; + +select dfunc(); +select dfunc(0); +select dfunc(to_date('20081215','YYYYMMDD')); +select dfunc('City'::text); + +drop function dfunc(anyelement); + +-- check defaults for variadics + +create function dfunc(a variadic int[]) returns int as +$$ select array_upper($1, 1) $$ language sql; + +select dfunc(); -- fail +select dfunc(10); +select dfunc(10,20); + +create or replace function dfunc(a variadic int[] default array[]::int[]) returns int as +$$ select array_upper($1, 1) $$ language sql; + +select dfunc(); -- now ok +select dfunc(10); +select dfunc(10,20); + +-- can't remove the default once it exists +create or replace function dfunc(a variadic int[]) returns int as +$$ select array_upper($1, 1) $$ language sql; + +\df dfunc + +drop function dfunc(a variadic int[]); + +-- Ambiguity should be reported only if there's not a better match available + +create function dfunc(int = 1, int = 2, int = 3) returns int as $$ + select 3; +$$ language sql; + +create function dfunc(int = 1, int = 2) returns int as $$ + select 2; +$$ language sql; + +create function dfunc(text) returns text as $$ + select $1; +$$ language sql; + +-- dfunc(narg=2) and dfunc(narg=3) are ambiguous +select dfunc(1); -- fail + +-- but this works since the ambiguous functions aren't preferred anyway +select dfunc('Hi'); + +drop function dfunc(int, int, int); +drop function dfunc(int, int); +drop function dfunc(text); + +-- +-- Tests for named- and mixed-notation function calling +-- + +create function dfunc(a int, b int, c int = 0, d int = 0) + returns table (a int, b int, c int, d int) as $$ + select $1, $2, $3, $4; +$$ language sql; + +select (dfunc(10,20,30)).*; +select (dfunc(a := 10, b := 20, c := 30)).*; +select * from dfunc(a := 10, b := 20); +select * from dfunc(b := 10, a := 20); +select * from dfunc(0); -- fail +select * from dfunc(1,2); +select * from dfunc(1,2,c := 3); +select * from dfunc(1,2,d := 3); + +select * from dfunc(x := 20, b := 10, x := 30); -- fail, duplicate name +select * from dfunc(10, b := 20, 30); -- fail, named args must be last +select * from dfunc(x := 10, b := 20, c := 30); -- fail, unknown param +select * from dfunc(10, 10, a := 20); -- fail, a overlaps positional parameter +select * from dfunc(1,c := 2,d := 3); -- fail, no value for b + +drop function dfunc(int, int, int, int); + +-- test with different parameter types +create function dfunc(a varchar, b numeric, c date = current_date) + returns table (a varchar, b numeric, c date) as $$ + select $1, $2, $3; +$$ language sql; + +select (dfunc('Hello World', 20, '2009-07-25'::date)).*; +select * from dfunc('Hello World', 20, '2009-07-25'::date); +select * from dfunc(c := '2009-07-25'::date, a := 'Hello World', b := 20); +select * from dfunc('Hello World', b := 20, c := '2009-07-25'::date); +select * from dfunc('Hello World', c := '2009-07-25'::date, b := 20); +select * from dfunc('Hello World', c := 20, b := '2009-07-25'::date); -- fail + +drop function dfunc(varchar, numeric, date); + +-- test out parameters with named params +create function dfunc(a varchar = 'def a', out _a varchar, c numeric = NULL, out _c numeric) +returns record as $$ + select $1, $2; +$$ language sql; + +select (dfunc()).*; +select * from dfunc(); +select * from dfunc('Hello', 100); +select * from dfunc(a := 'Hello', c := 100); +select * from dfunc(c := 100, a := 'Hello'); +select * from dfunc('Hello'); +select * from dfunc('Hello', c := 100); +select * from dfunc(c := 100); + +-- fail, can no longer change an input parameter's name +create or replace function dfunc(a varchar = 'def a', out _a varchar, x numeric = NULL, out _c numeric) +returns record as $$ + select $1, $2; +$$ language sql; + +create or replace function dfunc(a varchar = 'def a', out _a varchar, numeric = NULL, out _c numeric) +returns record as $$ + select $1, $2; +$$ language sql; + +drop function dfunc(varchar, numeric); + +--fail, named parameters are not unique +create function testpolym(a int, a int) returns int as $$ select 1;$$ language sql; +create function testpolym(int, out a int, out a int) returns int as $$ select 1;$$ language sql; +create function testpolym(out a int, inout a int) returns int as $$ select 1;$$ language sql; +create function testpolym(a int, inout a int) returns int as $$ select 1;$$ language sql; + +-- valid +create function testpolym(a int, out a int) returns int as $$ select $1;$$ language sql; +select testpolym(37); +drop function testpolym(int); +create function testpolym(a int) returns table(a int) as $$ select $1;$$ language sql; +select * from testpolym(37); +drop function testpolym(int); + +-- test polymorphic params and defaults +create function dfunc(a anyelement, b anyelement = null, flag bool = true) +returns anyelement as $$ + select case when $3 then $1 else $2 end; +$$ language sql; + +select dfunc(1,2); +select dfunc('a'::text, 'b'); -- positional notation with default + +select dfunc(a := 1, b := 2); +select dfunc(a := 'a'::text, b := 'b'); +select dfunc(a := 'a'::text, b := 'b', flag := false); -- named notation + +select dfunc(b := 'b'::text, a := 'a'); -- named notation with default +select dfunc(a := 'a'::text, flag := true); -- named notation with default +select dfunc(a := 'a'::text, flag := false); -- named notation with default +select dfunc(b := 'b'::text, a := 'a', flag := true); -- named notation + +select dfunc('a'::text, 'b', false); -- full positional notation +select dfunc('a'::text, 'b', flag := false); -- mixed notation +select dfunc('a'::text, 'b', true); -- full positional notation +select dfunc('a'::text, 'b', flag := true); -- mixed notation + +-- ansi/sql syntax +select dfunc(a => 1, b => 2); +select dfunc(a => 'a'::text, b => 'b'); +select dfunc(a => 'a'::text, b => 'b', flag => false); -- named notation + +select dfunc(b => 'b'::text, a => 'a'); -- named notation with default +select dfunc(a => 'a'::text, flag => true); -- named notation with default +select dfunc(a => 'a'::text, flag => false); -- named notation with default +select dfunc(b => 'b'::text, a => 'a', flag => true); -- named notation + +select dfunc('a'::text, 'b', false); -- full positional notation +select dfunc('a'::text, 'b', flag => false); -- mixed notation +select dfunc('a'::text, 'b', true); -- full positional notation +select dfunc('a'::text, 'b', flag => true); -- mixed notation + +-- this tests lexer edge cases around => +select dfunc(a =>-1); +select dfunc(a =>+1); +select dfunc(a =>/**/1); +select dfunc(a =>--comment to be removed by psql + 1); +-- need DO to protect the -- from psql +do $$ + declare r integer; + begin + select dfunc(a=>-- comment + 1) into r; + raise info 'r = %', r; + end; +$$; + +-- check reverse-listing of named-arg calls +CREATE VIEW dfview AS + SELECT q1, q2, + dfunc(q1,q2, flag := q1>q2) as c3, + dfunc(q1, flag := q1bh_size == 0) && heap->bh_has_heap_property)", File: "binaryheap.c", Line: 161) +CREATE TABLE foo1_tbl (a int); +INSERT INTO foo1_tbl values(2); +BEGIN; +DECLARE foo1 CURSOR WITH HOLD FOR SELECT * FROM foo1_tbl ORDER BY a; +FETCH ALL FROM foo1; +COMMIT; +FETCH ALL FROM foo1; +CLOSE foo1; +DROP TABLE foo1_tbl; + +-- ERROR: cannot execute squelched plan node of type: 232 (execProcnode.c:887) +BEGIN; +DECLARE foo2 CURSOR WITH HOLD FOR SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c where c.reltablespace = t.oid AND c.relname = 'foo1_tbl'; +FETCH ALL FROM foo2; +COMMIT; +FETCH ALL FROM foo2; +CLOSE foo2; diff --git a/src/test/singlenode_regress/sql/portals_p2.sql b/src/test/singlenode_regress/sql/portals_p2.sql new file mode 100644 index 00000000000..555820da39a --- /dev/null +++ b/src/test/singlenode_regress/sql/portals_p2.sql @@ -0,0 +1,98 @@ +-- +-- PORTALS_P2 +-- + +BEGIN; + +DECLARE foo13 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 50; + +DECLARE foo14 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 51; + +DECLARE foo15 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 52; + +DECLARE foo16 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 53; + +DECLARE foo17 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 54; + +DECLARE foo18 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 55; + +DECLARE foo19 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 56; + +DECLARE foo20 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 57; + +DECLARE foo21 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 58; + +DECLARE foo22 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 59; + +DECLARE foo23 CURSOR FOR + SELECT * FROM onek WHERE unique1 = 60; + +DECLARE foo24 CURSOR FOR + SELECT * FROM onek2 WHERE unique1 = 50; + +DECLARE foo25 CURSOR FOR + SELECT * FROM onek2 WHERE unique1 = 60; + +FETCH all in foo13; + +FETCH all in foo14; + +FETCH all in foo15; + +FETCH all in foo16; + +FETCH all in foo17; + +FETCH all in foo18; + +FETCH all in foo19; + +FETCH all in foo20; + +FETCH all in foo21; + +FETCH all in foo22; + +FETCH all in foo23; + +FETCH all in foo24; + +FETCH all in foo25; + +CLOSE foo13; + +CLOSE foo14; + +CLOSE foo15; + +CLOSE foo16; + +CLOSE foo17; + +CLOSE foo18; + +CLOSE foo19; + +CLOSE foo20; + +CLOSE foo21; + +CLOSE foo22; + +CLOSE foo23; + +CLOSE foo24; + +CLOSE foo25; + +END; diff --git a/src/test/singlenode_regress/sql/prepare.sql b/src/test/singlenode_regress/sql/prepare.sql new file mode 100644 index 00000000000..985d0f05c96 --- /dev/null +++ b/src/test/singlenode_regress/sql/prepare.sql @@ -0,0 +1,80 @@ +-- Regression tests for prepareable statements. We query the content +-- of the pg_prepared_statements view as prepared statements are +-- created and removed. + +SELECT name, statement, parameter_types FROM pg_prepared_statements; + +PREPARE q1 AS SELECT 1 AS a; +EXECUTE q1; + +SELECT name, statement, parameter_types FROM pg_prepared_statements; + +-- should fail +PREPARE q1 AS SELECT 2; + +-- should succeed +DEALLOCATE q1; +PREPARE q1 AS SELECT 2; +EXECUTE q1; + +PREPARE q2 AS SELECT 2 AS b; +SELECT name, statement, parameter_types FROM pg_prepared_statements; + +-- sql92 syntax +DEALLOCATE PREPARE q1; + +SELECT name, statement, parameter_types FROM pg_prepared_statements; + +DEALLOCATE PREPARE q2; +-- the view should return the empty set again +SELECT name, statement, parameter_types FROM pg_prepared_statements; + +-- parameterized queries +PREPARE q2(text) AS + SELECT datname, datistemplate, datallowconn + FROM pg_database WHERE datname = $1; + +EXECUTE q2('postgres'); + +PREPARE q3(text, int, float, boolean, smallint) AS + SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR + ten = $3::bigint OR true = $4 OR odd = $5::int) + ORDER BY unique1; + +EXECUTE q3('AAAAxx', 5::smallint, 10.5::float, false, 4::bigint); + +-- too few params +EXECUTE q3('bool'); + +-- too many params +EXECUTE q3('bytea', 5::smallint, 10.5::float, false, 4::bigint, true); + +-- wrong param types +EXECUTE q3(5::smallint, 10.5::float, false, 4::bigint, 'bytea'); + +-- invalid type +PREPARE q4(nonexistenttype) AS SELECT $1; + +-- create table as execute +PREPARE q5(int, text) AS + SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2 + ORDER BY unique1; +CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA'); +SELECT * FROM q5_prep_results; +CREATE TEMPORARY TABLE q5_prep_nodata AS EXECUTE q5(200, 'DTAAAA') + WITH NO DATA; +SELECT * FROM q5_prep_nodata; + +-- unknown or unspecified parameter types: should succeed +PREPARE q6 AS + SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2; +PREPARE q7(unknown) AS + SELECT * FROM road WHERE thepath = $1; + +SELECT name, statement, parameter_types FROM pg_prepared_statements + ORDER BY name; + +-- test DEALLOCATE ALL; +DEALLOCATE ALL; +SELECT name, statement, parameter_types FROM pg_prepared_statements + ORDER BY name; diff --git a/src/test/singlenode_regress/sql/prepared_xacts.sql b/src/test/singlenode_regress/sql/prepared_xacts.sql new file mode 100644 index 00000000000..2f0bb55bb49 --- /dev/null +++ b/src/test/singlenode_regress/sql/prepared_xacts.sql @@ -0,0 +1,164 @@ +-- +-- PREPARED TRANSACTIONS (two-phase commit) +-- +-- We can't readily test persistence of prepared xacts within the +-- regression script framework, unfortunately. Note that a crash +-- isn't really needed ... stopping and starting the postmaster would +-- be enough, but we can't even do that here. + + +-- create a simple table that we'll use in the tests +CREATE TABLE pxtest1 (foobar VARCHAR(10)); + +INSERT INTO pxtest1 VALUES ('aaa'); + + +-- Test PREPARE TRANSACTION +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'bbb' WHERE foobar = 'aaa'; +SELECT * FROM pxtest1; +PREPARE TRANSACTION 'foo1'; + +SELECT * FROM pxtest1; + +-- Test pg_prepared_xacts system view +SELECT gid FROM pg_prepared_xacts; + +-- Test ROLLBACK PREPARED +ROLLBACK PREPARED 'foo1'; + +SELECT * FROM pxtest1; + +SELECT gid FROM pg_prepared_xacts; + + +-- Test COMMIT PREPARED +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +INSERT INTO pxtest1 VALUES ('ddd'); +SELECT * FROM pxtest1; +PREPARE TRANSACTION 'foo2'; + +SELECT * FROM pxtest1; + +COMMIT PREPARED 'foo2'; + +SELECT * FROM pxtest1; + +-- Test duplicate gids +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; +SELECT * FROM pxtest1; +PREPARE TRANSACTION 'foo3'; + +SELECT gid FROM pg_prepared_xacts; + +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +INSERT INTO pxtest1 VALUES ('fff'); + +-- This should fail, because the gid foo3 is already in use +PREPARE TRANSACTION 'foo3'; + +SELECT * FROM pxtest1; + +ROLLBACK PREPARED 'foo3'; + +SELECT * FROM pxtest1; + +-- Test serialization failure (SSI) +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; +SELECT * FROM pxtest1; +PREPARE TRANSACTION 'foo4'; + +SELECT gid FROM pg_prepared_xacts; + +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SELECT * FROM pxtest1; + +-- This should fail, because the two transactions have a write-skew anomaly +INSERT INTO pxtest1 VALUES ('fff'); +PREPARE TRANSACTION 'foo5'; + +SELECT gid FROM pg_prepared_xacts; + +ROLLBACK PREPARED 'foo4'; + +SELECT gid FROM pg_prepared_xacts; + +-- Clean up +DROP TABLE pxtest1; + +-- Test detection of session-level and xact-level locks on same object +BEGIN; +SELECT pg_advisory_lock(1); +SELECT pg_advisory_xact_lock_shared(1); +PREPARE TRANSACTION 'foo6'; -- fails + +-- Test subtransactions +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; + CREATE TABLE pxtest2 (a int); + INSERT INTO pxtest2 VALUES (1); + SAVEPOINT a; + INSERT INTO pxtest2 VALUES (2); + ROLLBACK TO a; + SAVEPOINT b; + INSERT INTO pxtest2 VALUES (3); +PREPARE TRANSACTION 'regress-one'; + +CREATE TABLE pxtest3(fff int); + +-- Test shared invalidation +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; + DROP TABLE pxtest3; + CREATE TABLE pxtest4 (a int); + INSERT INTO pxtest4 VALUES (1); + INSERT INTO pxtest4 VALUES (2); + DECLARE foo CURSOR FOR SELECT * FROM pxtest4; + -- Fetch 1 tuple, keeping the cursor open + FETCH 1 FROM foo; +PREPARE TRANSACTION 'regress-two'; + +-- No such cursor +FETCH 1 FROM foo; + +-- Table doesn't exist, the creation hasn't been committed yet +SELECT * FROM pxtest2; + +-- There should be two prepared transactions +SELECT gid FROM pg_prepared_xacts; + +-- pxtest3 should be locked because of the pending DROP +begin; +lock table pxtest3 in access share mode nowait; +rollback; + +-- Disconnect, we will continue testing in a different backend +\c - + +-- There should still be two prepared transactions +SELECT gid FROM pg_prepared_xacts; + +-- pxtest3 should still be locked because of the pending DROP +begin; +lock table pxtest3 in access share mode nowait; +rollback; + +-- Commit table creation +COMMIT PREPARED 'regress-one'; +\d pxtest2 +SELECT * FROM pxtest2; + +-- There should be one prepared transaction +SELECT gid FROM pg_prepared_xacts; + +-- Commit table drop +COMMIT PREPARED 'regress-two'; +SELECT * FROM pxtest3; + +-- There should be no prepared transactions +SELECT gid FROM pg_prepared_xacts; + +-- Clean up +DROP TABLE pxtest2; +DROP TABLE pxtest3; -- will still be there if prepared xacts are disabled +DROP TABLE pxtest4; diff --git a/src/test/singlenode_regress/sql/privileges.sql b/src/test/singlenode_regress/sql/privileges.sql new file mode 100644 index 00000000000..d7ff806a935 --- /dev/null +++ b/src/test/singlenode_regress/sql/privileges.sql @@ -0,0 +1,1593 @@ +-- +-- Test access privileges +-- +-- start_matchsubs +-- m/DETAIL: Failing row contains \(.*\) = \(.*\)/ +-- s/DETAIL: Failing row contains \(.*\) = \(.*\)/DETAIL: Failing row contains (#####)/ +-- end_matchsubs + +set optimizer=off; +set enable_nestloop=on; +-- Clean up in case a prior regression run failed + +-- Suppress NOTICE messages when users/groups don't exist +SET client_min_messages TO 'warning'; + +DROP ROLE IF EXISTS regress_priv_group1; +DROP ROLE IF EXISTS regress_priv_group2; + +DROP ROLE IF EXISTS regress_priv_user1; +DROP ROLE IF EXISTS regress_priv_user2; +DROP ROLE IF EXISTS regress_priv_user3; +DROP ROLE IF EXISTS regress_priv_user4; +DROP ROLE IF EXISTS regress_priv_user5; +DROP ROLE IF EXISTS regress_priv_user6; +DROP ROLE IF EXISTS regress_priv_user7; + +-- start_ignore +SELECT lo_unlink(oid) FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid; +-- end_ignore + +RESET client_min_messages; + +-- test proper begins here + +CREATE USER regress_priv_user1; +CREATE USER regress_priv_user2; +CREATE USER regress_priv_user3; +CREATE USER regress_priv_user4; +CREATE USER regress_priv_user5; +CREATE USER regress_priv_user5; -- duplicate +CREATE USER regress_priv_user6; +CREATE USER regress_priv_user7; +CREATE ROLE regress_priv_role; + +GRANT pg_read_all_data TO regress_priv_user6; +GRANT pg_write_all_data TO regress_priv_user7; + +CREATE GROUP regress_priv_group1; +CREATE GROUP regress_priv_group2 WITH USER regress_priv_user1, regress_priv_user2; + +ALTER GROUP regress_priv_group1 ADD USER regress_priv_user4; + +ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; -- duplicate +ALTER GROUP regress_priv_group2 DROP USER regress_priv_user2; +GRANT regress_priv_group2 TO regress_priv_user4 WITH ADMIN OPTION; + +-- prepare non-leakproof function for later +CREATE FUNCTION leak(integer,integer) RETURNS boolean + AS 'int4lt' + LANGUAGE internal IMMUTABLE STRICT; -- but deliberately not LEAKPROOF +ALTER FUNCTION leak(integer,integer) OWNER TO regress_priv_user1; + +-- test owner privileges + +GRANT regress_priv_role TO regress_priv_user1 WITH ADMIN OPTION GRANTED BY CURRENT_ROLE; +REVOKE ADMIN OPTION FOR regress_priv_role FROM regress_priv_user1 GRANTED BY foo; -- error +REVOKE ADMIN OPTION FOR regress_priv_role FROM regress_priv_user1 GRANTED BY regress_priv_user2; -- error +REVOKE ADMIN OPTION FOR regress_priv_role FROM regress_priv_user1 GRANTED BY CURRENT_USER; +REVOKE regress_priv_role FROM regress_priv_user1 GRANTED BY CURRENT_ROLE; +DROP ROLE regress_priv_role; + +SET SESSION AUTHORIZATION regress_priv_user1; +SELECT session_user, current_user; + +CREATE TABLE atest1 ( a int, b text ); +SELECT * FROM atest1; +INSERT INTO atest1 VALUES (1, 'one'); +DELETE FROM atest1; +UPDATE atest1 SET a = 1 WHERE b = 'blech'; +TRUNCATE atest1; +BEGIN; +LOCK atest1 IN ACCESS EXCLUSIVE MODE; +COMMIT; + +REVOKE ALL ON atest1 FROM PUBLIC; +SELECT * FROM atest1; + +GRANT ALL ON atest1 TO regress_priv_user2; +GRANT SELECT ON atest1 TO regress_priv_user3, regress_priv_user4; +SELECT * FROM atest1; + +CREATE TABLE atest2 (col1 varchar(10), col2 boolean); +GRANT SELECT ON atest2 TO regress_priv_user2; +GRANT UPDATE ON atest2 TO regress_priv_user3; +GRANT INSERT ON atest2 TO regress_priv_user4 GRANTED BY CURRENT_USER; +GRANT TRUNCATE ON atest2 TO regress_priv_user5 GRANTED BY CURRENT_ROLE; + +GRANT TRUNCATE ON atest2 TO regress_priv_user4 GRANTED BY regress_priv_user5; -- error + + +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT session_user, current_user; + +-- try various combinations of queries on atest1 and atest2 + +SELECT * FROM atest1; -- ok +SELECT * FROM atest2; -- ok +INSERT INTO atest1 VALUES (2, 'two'); -- ok +INSERT INTO atest2 VALUES ('foo', true); -- fail +INSERT INTO atest1 SELECT 1, b FROM atest1; -- ok +UPDATE atest1 SET a = 1 WHERE a = 2; -- ok +UPDATE atest2 SET col2 = NOT col2; -- fail +SELECT * FROM atest1 FOR UPDATE; -- ok +SELECT * FROM atest2 FOR UPDATE; -- fail +DELETE FROM atest2; -- fail +TRUNCATE atest2; -- fail +BEGIN; +LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- fail +COMMIT; +COPY atest2 FROM stdin; -- fail +GRANT ALL ON atest1 TO PUBLIC; -- fail + +-- checks in subquery, both ok +SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) ); +SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) ); + +SET SESSION AUTHORIZATION regress_priv_user6; +SELECT * FROM atest1; -- ok +SELECT * FROM atest2; -- ok +INSERT INTO atest2 VALUES ('foo', true); -- fail + +SET SESSION AUTHORIZATION regress_priv_user7; +SELECT * FROM atest1; -- fail +SELECT * FROM atest2; -- fail +INSERT INTO atest2 VALUES ('foo', true); -- ok +UPDATE atest2 SET col2 = true; -- ok +DELETE FROM atest2; -- ok + +-- Make sure we are not able to modify system catalogs +UPDATE pg_catalog.pg_class SET relname = '123'; -- fail +DELETE FROM pg_catalog.pg_class; -- fail +UPDATE pg_toast.pg_toast_1213 SET chunk_id = 1; -- fail + +SET SESSION AUTHORIZATION regress_priv_user3; +SELECT session_user, current_user; + +SELECT * FROM atest1; -- ok +SELECT * FROM atest2; -- fail +INSERT INTO atest1 VALUES (2, 'two'); -- fail +INSERT INTO atest2 VALUES ('foo', true); -- fail +INSERT INTO atest1 SELECT 1, b FROM atest1; -- fail +UPDATE atest1 SET a = 1 WHERE a = 2; -- fail +UPDATE atest2 SET col2 = NULL; -- ok +UPDATE atest2 SET col2 = NOT col2; -- fails; requires SELECT on atest2 +UPDATE atest2 SET col2 = true FROM atest1 WHERE atest1.a = 5; -- ok +SELECT * FROM atest1 FOR UPDATE; -- fail +SELECT * FROM atest2 FOR UPDATE; -- fail +DELETE FROM atest2; -- fail +TRUNCATE atest2; -- fail +BEGIN; +LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- ok +COMMIT; +COPY atest2 FROM stdin; -- fail + +-- checks in subquery, both fail +SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) ); +SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) ); + +SET SESSION AUTHORIZATION regress_priv_user4; +COPY atest2 FROM stdin; -- ok +bar true +\. +SELECT * FROM atest1; -- ok + + +-- test leaky-function protections in selfuncs + +-- regress_priv_user1 will own a table and provide views for it. +SET SESSION AUTHORIZATION regress_priv_user1; + +CREATE TABLE atest12 as + SELECT x AS a, 10001 - x AS b FROM generate_series(1,10000) x; +CREATE INDEX ON atest12 (a); +CREATE INDEX ON atest12 (abs(a)); +-- results below depend on having quite accurate stats for atest12, so... +ALTER TABLE atest12 SET (autovacuum_enabled = off); +SET default_statistics_target = 10000; +VACUUM ANALYZE atest12; +RESET default_statistics_target; + +CREATE OPERATOR <<< (procedure = leak, leftarg = integer, rightarg = integer, + restrict = scalarltsel); + +-- views with leaky operator +CREATE VIEW atest12v AS + SELECT * FROM atest12 WHERE b <<< 5; +CREATE VIEW atest12sbv WITH (security_barrier=true) AS + SELECT * FROM atest12 WHERE b <<< 5; +GRANT SELECT ON atest12v TO PUBLIC; +GRANT SELECT ON atest12sbv TO PUBLIC; + +-- This plan should use nestloop, knowing that few rows will be selected. +EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; + +-- And this one. +EXPLAIN (COSTS OFF) SELECT * FROM atest12 x, atest12 y + WHERE x.a = y.b and abs(y.a) <<< 5; + +-- This should also be a nestloop, but the security barrier forces the inner +-- scan to be materialized +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv x, atest12sbv y WHERE x.a = y.b; + +-- Check if regress_priv_user2 can break security. +SET SESSION AUTHORIZATION regress_priv_user2; + +CREATE FUNCTION leak2(integer,integer) RETURNS boolean + AS $$begin raise notice 'leak % %', $1, $2; return $1 > $2; end$$ + LANGUAGE plpgsql immutable; +CREATE OPERATOR >>> (procedure = leak2, leftarg = integer, rightarg = integer, + restrict = scalargtsel); + +-- This should not show any "leak" notices before failing. +EXPLAIN (COSTS OFF) SELECT * FROM atest12 WHERE a >>> 0; + +-- These plans should continue to use a nestloop, since they execute with the +-- privileges of the view owner. +EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv x, atest12sbv y WHERE x.a = y.b; + +-- A non-security barrier view does not guard against information leakage. +EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y + WHERE x.a = y.b and abs(y.a) <<< 5; + +-- But a security barrier view isolates the leaky operator. +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv x, atest12sbv y + WHERE x.a = y.b and abs(y.a) <<< 5; + +-- Now regress_priv_user1 grants sufficient access to regress_priv_user2. +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (a, b) ON atest12 TO PUBLIC; +SET SESSION AUTHORIZATION regress_priv_user2; + +-- regress_priv_user2 should continue to get a good row estimate. +EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; + +-- But not for this, due to lack of table-wide permissions needed +-- to make use of the expression index's statistics. +EXPLAIN (COSTS OFF) SELECT * FROM atest12 x, atest12 y + WHERE x.a = y.b and abs(y.a) <<< 5; + +-- clean up (regress_priv_user1's objects are all dropped later) +DROP FUNCTION leak2(integer, integer) CASCADE; + + +-- groups + +SET SESSION AUTHORIZATION regress_priv_user3; +CREATE TABLE atest3 (one int, two int, three int); +GRANT DELETE ON atest3 TO GROUP regress_priv_group2; + +SET SESSION AUTHORIZATION regress_priv_user1; + +SELECT * FROM atest3; -- fail +DELETE FROM atest3; -- ok + +BEGIN; +RESET SESSION AUTHORIZATION; +ALTER ROLE regress_priv_user1 NOINHERIT; +SET SESSION AUTHORIZATION regress_priv_user1; +DELETE FROM atest3; +ROLLBACK; + +-- views + +SET SESSION AUTHORIZATION regress_priv_user3; + +CREATE VIEW atestv1 AS SELECT * FROM atest1; -- ok +/* The next *should* fail, but it's not implemented that way yet. */ +CREATE VIEW atestv2 AS SELECT * FROM atest2; +CREATE VIEW atestv3 AS SELECT * FROM atest3; -- ok +/* Empty view is a corner case that failed in 9.2. */ +CREATE VIEW atestv0 AS SELECT 0 as x WHERE false; -- ok + +SELECT * FROM atestv1; -- ok +SELECT * FROM atestv2; -- fail +GRANT SELECT ON atestv1, atestv3 TO regress_priv_user4; +GRANT SELECT ON atestv2 TO regress_priv_user2; + +SET SESSION AUTHORIZATION regress_priv_user4; + +SELECT * FROM atestv1; -- ok +SELECT * FROM atestv2; -- fail +SELECT * FROM atestv3; -- ok +SELECT * FROM atestv0; -- fail + +-- Appendrels excluded by constraints failed to check permissions in 8.4-9.2. +select * from + ((select a.q1 as x from int8_tbl a offset 0) + union all + (select b.q2 as x from int8_tbl b offset 0)) ss +where false; + +set constraint_exclusion = on; +select * from + ((select a.q1 as x, random() from int8_tbl a where q1 > 0) + union all + (select b.q2 as x, random() from int8_tbl b where q2 > 0)) ss +where x < 0; +reset constraint_exclusion; + +CREATE VIEW atestv4 AS SELECT * FROM atestv3; -- nested view +SELECT * FROM atestv4; -- ok +GRANT SELECT ON atestv4 TO regress_priv_user2; + +SET SESSION AUTHORIZATION regress_priv_user2; + +-- Two complex cases: + +SELECT * FROM atestv3; -- fail +SELECT * FROM atestv4; -- ok (even though regress_priv_user2 cannot access underlying atestv3) + +SELECT * FROM atest2; -- ok +SELECT * FROM atestv2; -- fail (even though regress_priv_user2 can access underlying atest2) + +-- Test column level permissions + +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE atest5 (one int, two int unique, three int, four int unique); +CREATE TABLE atest6 (one int, two int, blue int); +GRANT SELECT (one), INSERT (two), UPDATE (three) ON atest5 TO regress_priv_user4; +GRANT ALL (one) ON atest5 TO regress_priv_user3; + +INSERT INTO atest5 VALUES (1,2,3); + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT * FROM atest5; -- fail +SELECT one FROM atest5; -- ok +COPY atest5 (one) TO stdout; -- ok +SELECT two FROM atest5; -- fail +COPY atest5 (two) TO stdout; -- fail +SELECT atest5 FROM atest5; -- fail +COPY atest5 (one,two) TO stdout; -- fail +SELECT 1 FROM atest5; -- ok +SELECT 1 FROM atest5 a JOIN atest5 b USING (one); -- ok +SELECT 1 FROM atest5 a JOIN atest5 b USING (two); -- fail +SELECT 1 FROM atest5 a NATURAL JOIN atest5 b; -- fail +SELECT * FROM (atest5 a JOIN atest5 b USING (one)) j; -- fail +SELECT j.* FROM (atest5 a JOIN atest5 b USING (one)) j; -- fail +SELECT (j.*) IS NULL FROM (atest5 a JOIN atest5 b USING (one)) j; -- fail +SELECT one FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- ok +SELECT j.one FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- ok +SELECT two FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- fail +SELECT j.two FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- fail +SELECT y FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- fail +SELECT j.y FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)) j; -- fail +SELECT * FROM (atest5 a JOIN atest5 b USING (one)); -- fail +SELECT a.* FROM (atest5 a JOIN atest5 b USING (one)); -- fail +SELECT (a.*) IS NULL FROM (atest5 a JOIN atest5 b USING (one)); -- fail +SELECT two FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)); -- fail +SELECT a.two FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)); -- fail +SELECT y FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)); -- fail +SELECT b.y FROM (atest5 a JOIN atest5 b(one,x,y,z) USING (one)); -- fail +SELECT y FROM (atest5 a LEFT JOIN atest5 b(one,x,y,z) USING (one)); -- fail +SELECT b.y FROM (atest5 a LEFT JOIN atest5 b(one,x,y,z) USING (one)); -- fail +SELECT y FROM (atest5 a FULL JOIN atest5 b(one,x,y,z) USING (one)); -- fail +SELECT b.y FROM (atest5 a FULL JOIN atest5 b(one,x,y,z) USING (one)); -- fail +SELECT 1 FROM atest5 WHERE two = 2; -- fail +SELECT * FROM atest1, atest5; -- fail +SELECT atest1.* FROM atest1, atest5; -- ok +SELECT atest1.*,atest5.one FROM atest1, atest5; -- ok +SELECT atest1.*,atest5.one FROM atest1 JOIN atest5 ON (atest1.a = atest5.two); -- fail +SELECT atest1.*,atest5.one FROM atest1 JOIN atest5 ON (atest1.a = atest5.one); -- ok +SELECT one, two FROM atest5; -- fail + +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (one,two) ON atest6 TO regress_priv_user4; + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT one, two FROM atest5 NATURAL JOIN atest6; -- fail still + +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (two) ON atest5 TO regress_priv_user4; + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT one, two FROM atest5 NATURAL JOIN atest6; -- ok now + +-- test column-level privileges for INSERT and UPDATE +INSERT INTO atest5 (two) VALUES (3); -- ok +COPY atest5 FROM stdin; -- fail +COPY atest5 (two) FROM stdin; -- ok +1 +\. +INSERT INTO atest5 (three) VALUES (4); -- fail +INSERT INTO atest5 VALUES (5,5,5); -- fail +UPDATE atest5 SET three = 10; -- ok +UPDATE atest5 SET one = 8; -- fail +UPDATE atest5 SET three = 5, one = 2; -- fail +-- Check that column level privs are enforced in RETURNING +-- Ok. +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = 10; +-- Error. No SELECT on column three. +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = 10 RETURNING atest5.three; +-- Ok. May SELECT on column "one": +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = 10 RETURNING atest5.one; +-- Check that column level privileges are enforced for EXCLUDED +-- Ok. we may select one +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = EXCLUDED.one; +-- Error. No select rights on three +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set three = EXCLUDED.three; +INSERT INTO atest5(two) VALUES (6) ON CONFLICT (two) DO UPDATE set one = 8; -- fails (due to UPDATE) +INSERT INTO atest5(three) VALUES (4) ON CONFLICT (two) DO UPDATE set three = 10; -- fails (due to INSERT) + +-- Check that the columns in the inference require select privileges +INSERT INTO atest5(four) VALUES (4); -- fail + +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT INSERT (four) ON atest5 TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; + +INSERT INTO atest5(four) VALUES (4) ON CONFLICT (four) DO UPDATE set three = 3; -- fails (due to SELECT) +INSERT INTO atest5(four) VALUES (4) ON CONFLICT ON CONSTRAINT atest5_four_key DO UPDATE set three = 3; -- fails (due to SELECT) +INSERT INTO atest5(four) VALUES (4); -- ok + +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (four) ON atest5 TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; + +INSERT INTO atest5(four) VALUES (4) ON CONFLICT (four) DO UPDATE set three = 3; -- ok +INSERT INTO atest5(four) VALUES (4) ON CONFLICT ON CONSTRAINT atest5_four_key DO UPDATE set three = 3; -- ok + +SET SESSION AUTHORIZATION regress_priv_user1; +REVOKE ALL (one) ON atest5 FROM regress_priv_user4; +GRANT SELECT (one,two,blue) ON atest6 TO regress_priv_user4; + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT one FROM atest5; -- fail +UPDATE atest5 SET one = 1; -- fail +SELECT atest6 FROM atest6; -- ok +COPY atest6 TO stdout; -- ok + +-- check error reporting with column privs +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE t1 (c1 int, c2 int, c3 int check (c3 < 5), primary key (c1, c2)); +GRANT SELECT (c1) ON t1 TO regress_priv_user2; +GRANT INSERT (c1, c2, c3) ON t1 TO regress_priv_user2; +GRANT UPDATE (c1, c2, c3) ON t1 TO regress_priv_user2; + +-- seed data +INSERT INTO t1 VALUES (1, 1, 1); +INSERT INTO t1 VALUES (1, 2, 1); +INSERT INTO t1 VALUES (2, 1, 2); +INSERT INTO t1 VALUES (2, 2, 2); +INSERT INTO t1 VALUES (3, 1, 3); + +SET SESSION AUTHORIZATION regress_priv_user2; +INSERT INTO t1 (c1, c2) VALUES (1, 1); -- fail, but row not shown +UPDATE t1 SET c2 = 1; -- fail, but row not shown +INSERT INTO t1 (c1, c2) VALUES (null, null); -- fail, but see columns being inserted +INSERT INTO t1 (c3) VALUES (null); -- fail, but see columns being inserted or have SELECT +INSERT INTO t1 (c1) VALUES (5); -- fail, but see columns being inserted or have SELECT +UPDATE t1 SET c3 = 10; -- fail, but see columns with SELECT rights, or being modified + +SET SESSION AUTHORIZATION regress_priv_user1; +DROP TABLE t1; + +-- check error reporting with column privs on a partitioned table +CREATE TABLE errtst(a text, b text NOT NULL, c text, secret1 text, secret2 text) PARTITION BY LIST (a); +CREATE TABLE errtst_part_1(secret2 text, c text, a text, b text NOT NULL, secret1 text); +CREATE TABLE errtst_part_2(secret1 text, secret2 text, a text, c text, b text NOT NULL); + +ALTER TABLE errtst ATTACH PARTITION errtst_part_1 FOR VALUES IN ('aaa'); +ALTER TABLE errtst ATTACH PARTITION errtst_part_2 FOR VALUES IN ('aaaa'); + +GRANT SELECT (a, b, c) ON TABLE errtst TO regress_priv_user2; +GRANT UPDATE (a, b, c) ON TABLE errtst TO regress_priv_user2; +GRANT INSERT (a, b, c) ON TABLE errtst TO regress_priv_user2; + +INSERT INTO errtst_part_1 (a, b, c, secret1, secret2) +VALUES ('aaa', 'bbb', 'ccc', 'the body', 'is in the attic'); + +SET SESSION AUTHORIZATION regress_priv_user2; + +-- Perform a few updates that violate the NOT NULL constraint. Make sure +-- the error messages don't leak the secret fields. + +-- simple insert. +INSERT INTO errtst (a, b) VALUES ('aaa', NULL); +-- simple update. +UPDATE errtst SET b = NULL; +-- partitioning key is updated, doesn't move the row. +UPDATE errtst SET a = 'aaa', b = NULL; +-- row is moved to another partition. +UPDATE errtst SET a = 'aaaa', b = NULL; + +-- row is moved to another partition. This differs from the previous case in +-- that the new partition is excluded by constraint exclusion, so its +-- ResultRelInfo is not created at ExecInitModifyTable, but needs to be +-- constructed on the fly when the updated tuple is routed to it. +UPDATE errtst SET a = 'aaaa', b = NULL WHERE a = 'aaa'; + +SET SESSION AUTHORIZATION regress_priv_user1; +DROP TABLE errtst; + +-- test column-level privileges when involved with DELETE +SET SESSION AUTHORIZATION regress_priv_user1; +ALTER TABLE atest6 ADD COLUMN three integer; +GRANT DELETE ON atest5 TO regress_priv_user3; +GRANT SELECT (two) ON atest5 TO regress_priv_user3; +REVOKE ALL (one) ON atest5 FROM regress_priv_user3; +GRANT SELECT (one) ON atest5 TO regress_priv_user4; + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT atest6 FROM atest6; -- fail +SELECT one FROM atest5 NATURAL JOIN atest6; -- fail + +SET SESSION AUTHORIZATION regress_priv_user1; +ALTER TABLE atest6 DROP COLUMN three; + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT atest6 FROM atest6; -- ok +SELECT one FROM atest5 NATURAL JOIN atest6; -- ok + +SET SESSION AUTHORIZATION regress_priv_user1; +ALTER TABLE atest6 DROP COLUMN two; +REVOKE SELECT (one,blue) ON atest6 FROM regress_priv_user4; + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT * FROM atest6; -- fail +SELECT 1 FROM atest6; -- fail + +SET SESSION AUTHORIZATION regress_priv_user3; +DELETE FROM atest5 WHERE one = 1; -- fail +DELETE FROM atest5 WHERE two = 2; -- ok + +-- check inheritance cases +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE atestp1 (f1 int, f2 int); +CREATE TABLE atestp2 (fx int, fy int); +CREATE TABLE atestc (fz int) INHERITS (atestp1, atestp2); +GRANT SELECT(fx,fy,tableoid) ON atestp2 TO regress_priv_user2; +GRANT SELECT(fx) ON atestc TO regress_priv_user2; + +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT fx FROM atestp2; -- ok +SELECT fy FROM atestp2; -- ok +SELECT atestp2 FROM atestp2; -- ok +SELECT tableoid FROM atestp2; -- ok +SELECT fy FROM atestc; -- fail + +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT(fy,tableoid) ON atestc TO regress_priv_user2; + +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT fx FROM atestp2; -- still ok +SELECT fy FROM atestp2; -- ok +SELECT atestp2 FROM atestp2; -- ok +SELECT tableoid FROM atestp2; -- ok + +-- child's permissions do not apply when operating on parent +SET SESSION AUTHORIZATION regress_priv_user1; +REVOKE ALL ON atestc FROM regress_priv_user2; +GRANT ALL ON atestp1 TO regress_priv_user2; +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT f2 FROM atestp1; -- ok +SELECT f2 FROM atestc; -- fail +DELETE FROM atestp1; -- ok +DELETE FROM atestc; -- fail +UPDATE atestp1 SET f1 = 1; -- ok +UPDATE atestc SET f1 = 1; -- fail +TRUNCATE atestp1; -- ok +TRUNCATE atestc; -- fail +BEGIN; +LOCK atestp1; +END; +BEGIN; +LOCK atestc; +END; + +-- privileges on functions, languages + +-- switch to superuser +\c - + +REVOKE ALL PRIVILEGES ON LANGUAGE sql FROM PUBLIC; +GRANT USAGE ON LANGUAGE sql TO regress_priv_user1; -- ok +GRANT USAGE ON LANGUAGE c TO PUBLIC; -- fail + +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT USAGE ON LANGUAGE sql TO regress_priv_user2; -- fail +CREATE FUNCTION priv_testfunc1(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql; +CREATE FUNCTION priv_testfunc2(int) RETURNS int AS 'select 3 * $1;' LANGUAGE sql; +CREATE AGGREGATE priv_testagg1(int) (sfunc = int4pl, stype = int4); +CREATE PROCEDURE priv_testproc1(int) AS 'select $1;' LANGUAGE sql; + +REVOKE ALL ON FUNCTION priv_testfunc1(int), priv_testfunc2(int), priv_testagg1(int) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION priv_testfunc1(int), priv_testfunc2(int), priv_testagg1(int) TO regress_priv_user2; +REVOKE ALL ON FUNCTION priv_testproc1(int) FROM PUBLIC; -- fail, not a function +REVOKE ALL ON PROCEDURE priv_testproc1(int) FROM PUBLIC; +GRANT EXECUTE ON PROCEDURE priv_testproc1(int) TO regress_priv_user2; +GRANT USAGE ON FUNCTION priv_testfunc1(int) TO regress_priv_user3; -- semantic error +GRANT USAGE ON FUNCTION priv_testagg1(int) TO regress_priv_user3; -- semantic error +GRANT USAGE ON PROCEDURE priv_testproc1(int) TO regress_priv_user3; -- semantic error +GRANT ALL PRIVILEGES ON FUNCTION priv_testfunc1(int) TO regress_priv_user4; +GRANT ALL PRIVILEGES ON FUNCTION priv_testfunc_nosuch(int) TO regress_priv_user4; +GRANT ALL PRIVILEGES ON FUNCTION priv_testagg1(int) TO regress_priv_user4; +GRANT ALL PRIVILEGES ON PROCEDURE priv_testproc1(int) TO regress_priv_user4; + +CREATE FUNCTION priv_testfunc4(boolean) RETURNS text + AS 'select col1 from atest2 where col2 = $1;' + LANGUAGE sql SECURITY DEFINER; +GRANT EXECUTE ON FUNCTION priv_testfunc4(boolean) TO regress_priv_user3; + +SET SESSION AUTHORIZATION regress_priv_user2; +SELECT priv_testfunc1(5), priv_testfunc2(5); -- ok +CREATE FUNCTION priv_testfunc3(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql; -- fail +SELECT priv_testagg1(x) FROM (VALUES (1), (2), (3)) _(x); -- ok +CALL priv_testproc1(6); -- ok + +SET SESSION AUTHORIZATION regress_priv_user3; +SELECT priv_testfunc1(5); -- fail +SELECT priv_testagg1(x) FROM (VALUES (1), (2), (3)) _(x); -- fail +CALL priv_testproc1(6); -- fail +SELECT col1 FROM atest2 WHERE col2 = true; -- fail +SELECT priv_testfunc4(true); -- ok + +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT priv_testfunc1(5); -- ok +SELECT priv_testagg1(x) FROM (VALUES (1), (2), (3)) _(x); -- ok +CALL priv_testproc1(6); -- ok + +DROP FUNCTION priv_testfunc1(int); -- fail +DROP AGGREGATE priv_testagg1(int); -- fail +DROP PROCEDURE priv_testproc1(int); -- fail + +\c - + +DROP FUNCTION priv_testfunc1(int); -- ok +-- restore to sanity +GRANT ALL PRIVILEGES ON LANGUAGE sql TO PUBLIC; + +-- verify privilege checks on array-element coercions +BEGIN; +SELECT '{1}'::int4[]::int8[]; +REVOKE ALL ON FUNCTION int8(integer) FROM PUBLIC; +SELECT '{1}'::int4[]::int8[]; --superuser, succeed +SET SESSION AUTHORIZATION regress_priv_user4; +SELECT '{1}'::int4[]::int8[]; --other user, fail +ROLLBACK; + +-- privileges on types + +-- switch to superuser +\c - + +CREATE TYPE priv_testtype1 AS (a int, b text); +REVOKE USAGE ON TYPE priv_testtype1 FROM PUBLIC; +GRANT USAGE ON TYPE priv_testtype1 TO regress_priv_user2; +GRANT USAGE ON TYPE _priv_testtype1 TO regress_priv_user2; -- fail +GRANT USAGE ON DOMAIN priv_testtype1 TO regress_priv_user2; -- fail + +CREATE DOMAIN priv_testdomain1 AS int; +REVOKE USAGE on DOMAIN priv_testdomain1 FROM PUBLIC; +GRANT USAGE ON DOMAIN priv_testdomain1 TO regress_priv_user2; +GRANT USAGE ON TYPE priv_testdomain1 TO regress_priv_user2; -- ok + +SET SESSION AUTHORIZATION regress_priv_user1; + +-- commands that should fail + +CREATE AGGREGATE priv_testagg1a(priv_testdomain1) (sfunc = int4_sum, stype = bigint); + +CREATE DOMAIN priv_testdomain2a AS priv_testdomain1; + +CREATE DOMAIN priv_testdomain3a AS int; +CREATE FUNCTION castfunc(int) RETURNS priv_testdomain3a AS $$ SELECT $1::priv_testdomain3a $$ LANGUAGE SQL; +CREATE CAST (priv_testdomain1 AS priv_testdomain3a) WITH FUNCTION castfunc(int); +DROP FUNCTION castfunc(int) CASCADE; +DROP DOMAIN priv_testdomain3a; + +CREATE FUNCTION priv_testfunc5a(a priv_testdomain1) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; +CREATE FUNCTION priv_testfunc6a(b int) RETURNS priv_testdomain1 LANGUAGE SQL AS $$ SELECT $1::priv_testdomain1 $$; + +CREATE OPERATOR !+! (PROCEDURE = int4pl, LEFTARG = priv_testdomain1, RIGHTARG = priv_testdomain1); + +CREATE TABLE test5a (a int, b priv_testdomain1); +CREATE TABLE test6a OF priv_testtype1; +CREATE TABLE test10a (a int[], b priv_testtype1[]); + +CREATE TABLE test9a (a int, b int); +ALTER TABLE test9a ADD COLUMN c priv_testdomain1; +ALTER TABLE test9a ALTER COLUMN b TYPE priv_testdomain1; + +CREATE TYPE test7a AS (a int, b priv_testdomain1); + +CREATE TYPE test8a AS (a int, b int); +ALTER TYPE test8a ADD ATTRIBUTE c priv_testdomain1; +ALTER TYPE test8a ALTER ATTRIBUTE b TYPE priv_testdomain1; + +CREATE TABLE test11a AS (SELECT 1::priv_testdomain1 AS a); + +REVOKE ALL ON TYPE priv_testtype1 FROM PUBLIC; + +SET SESSION AUTHORIZATION regress_priv_user2; + +-- commands that should succeed + +CREATE AGGREGATE priv_testagg1b(priv_testdomain1) (sfunc = int4_sum, stype = bigint); + +CREATE DOMAIN priv_testdomain2b AS priv_testdomain1; + +CREATE DOMAIN priv_testdomain3b AS int; +CREATE FUNCTION castfunc(int) RETURNS priv_testdomain3b AS $$ SELECT $1::priv_testdomain3b $$ LANGUAGE SQL; +CREATE CAST (priv_testdomain1 AS priv_testdomain3b) WITH FUNCTION castfunc(int); + +CREATE FUNCTION priv_testfunc5b(a priv_testdomain1) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; +CREATE FUNCTION priv_testfunc6b(b int) RETURNS priv_testdomain1 LANGUAGE SQL AS $$ SELECT $1::priv_testdomain1 $$; + +CREATE OPERATOR !! (PROCEDURE = priv_testfunc5b, RIGHTARG = priv_testdomain1); + +CREATE TABLE test5b (a int, b priv_testdomain1); +CREATE TABLE test6b OF priv_testtype1; +CREATE TABLE test10b (a int[], b priv_testtype1[]); + +CREATE TABLE test9b (a int, b int); +ALTER TABLE test9b ADD COLUMN c priv_testdomain1; +ALTER TABLE test9b ALTER COLUMN b TYPE priv_testdomain1; + +CREATE TYPE test7b AS (a int, b priv_testdomain1); + +CREATE TYPE test8b AS (a int, b int); +ALTER TYPE test8b ADD ATTRIBUTE c priv_testdomain1; +ALTER TYPE test8b ALTER ATTRIBUTE b TYPE priv_testdomain1; + +CREATE TABLE test11b AS (SELECT 1::priv_testdomain1 AS a); + +REVOKE ALL ON TYPE priv_testtype1 FROM PUBLIC; + +\c - +DROP AGGREGATE priv_testagg1b(priv_testdomain1); +DROP DOMAIN priv_testdomain2b; +DROP OPERATOR !! (NONE, priv_testdomain1); +DROP FUNCTION priv_testfunc5b(a priv_testdomain1); +DROP FUNCTION priv_testfunc6b(b int); +DROP TABLE test5b; +DROP TABLE test6b; +DROP TABLE test9b; +DROP TABLE test10b; +DROP TYPE test7b; +DROP TYPE test8b; +DROP CAST (priv_testdomain1 AS priv_testdomain3b); +DROP FUNCTION castfunc(int) CASCADE; +DROP DOMAIN priv_testdomain3b; +DROP TABLE test11b; + +DROP TYPE priv_testtype1; -- ok +DROP DOMAIN priv_testdomain1; -- ok + + +-- truncate +SET SESSION AUTHORIZATION regress_priv_user5; +TRUNCATE atest2; -- ok +TRUNCATE atest3; -- fail + +-- has_table_privilege function + +-- bad-input checks +select has_table_privilege(NULL,'pg_authid','select'); +select has_table_privilege('pg_shad','select'); +select has_table_privilege('nosuchuser','pg_authid','select'); +select has_table_privilege('pg_authid','sel'); +select has_table_privilege(-999999,'pg_authid','update'); +select has_table_privilege(1,'select'); + +-- superuser +\c - + +select has_table_privilege(current_user,'pg_authid','select'); +select has_table_privilege(current_user,'pg_authid','insert'); + +select has_table_privilege(t2.oid,'pg_authid','update') +from (select oid from pg_roles where rolname = current_user) as t2; +select has_table_privilege(t2.oid,'pg_authid','delete') +from (select oid from pg_roles where rolname = current_user) as t2; + +-- 'rule' privilege no longer exists, but for backwards compatibility +-- has_table_privilege still recognizes the keyword and says FALSE +select has_table_privilege(current_user,t1.oid,'rule') +from (select oid from pg_class where relname = 'pg_authid') as t1; +select has_table_privilege(current_user,t1.oid,'references') +from (select oid from pg_class where relname = 'pg_authid') as t1; + +select has_table_privilege(t2.oid,t1.oid,'select') +from (select oid from pg_class where relname = 'pg_authid') as t1, + (select oid from pg_roles where rolname = current_user) as t2; +select has_table_privilege(t2.oid,t1.oid,'insert') +from (select oid from pg_class where relname = 'pg_authid') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + +select has_table_privilege('pg_authid','update'); +select has_table_privilege('pg_authid','delete'); +select has_table_privilege('pg_authid','truncate'); + +select has_table_privilege(t1.oid,'select') +from (select oid from pg_class where relname = 'pg_authid') as t1; +select has_table_privilege(t1.oid,'trigger') +from (select oid from pg_class where relname = 'pg_authid') as t1; + +-- non-superuser +SET SESSION AUTHORIZATION regress_priv_user3; + +select has_table_privilege(current_user,'pg_class','select'); +select has_table_privilege(current_user,'pg_class','insert'); + +select has_table_privilege(t2.oid,'pg_class','update') +from (select oid from pg_roles where rolname = current_user) as t2; +select has_table_privilege(t2.oid,'pg_class','delete') +from (select oid from pg_roles where rolname = current_user) as t2; + +select has_table_privilege(current_user,t1.oid,'references') +from (select oid from pg_class where relname = 'pg_class') as t1; + +select has_table_privilege(t2.oid,t1.oid,'select') +from (select oid from pg_class where relname = 'pg_class') as t1, + (select oid from pg_roles where rolname = current_user) as t2; +select has_table_privilege(t2.oid,t1.oid,'insert') +from (select oid from pg_class where relname = 'pg_class') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + +select has_table_privilege('pg_class','update'); +select has_table_privilege('pg_class','delete'); +select has_table_privilege('pg_class','truncate'); + +select has_table_privilege(t1.oid,'select') +from (select oid from pg_class where relname = 'pg_class') as t1; +select has_table_privilege(t1.oid,'trigger') +from (select oid from pg_class where relname = 'pg_class') as t1; + +select has_table_privilege(current_user,'atest1','select'); +select has_table_privilege(current_user,'atest1','insert'); + +select has_table_privilege(t2.oid,'atest1','update') +from (select oid from pg_roles where rolname = current_user) as t2; +select has_table_privilege(t2.oid,'atest1','delete') +from (select oid from pg_roles where rolname = current_user) as t2; + +select has_table_privilege(current_user,t1.oid,'references') +from (select oid from pg_class where relname = 'atest1') as t1; + +select has_table_privilege(t2.oid,t1.oid,'select') +from (select oid from pg_class where relname = 'atest1') as t1, + (select oid from pg_roles where rolname = current_user) as t2; +select has_table_privilege(t2.oid,t1.oid,'insert') +from (select oid from pg_class where relname = 'atest1') as t1, + (select oid from pg_roles where rolname = current_user) as t2; + +select has_table_privilege('atest1','update'); +select has_table_privilege('atest1','delete'); +select has_table_privilege('atest1','truncate'); + +select has_table_privilege(t1.oid,'select') +from (select oid from pg_class where relname = 'atest1') as t1; +select has_table_privilege(t1.oid,'trigger') +from (select oid from pg_class where relname = 'atest1') as t1; + +-- has_column_privilege function + +-- bad-input checks (as non-super-user) +select has_column_privilege('pg_authid',NULL,'select'); +select has_column_privilege('pg_authid','nosuchcol','select'); +select has_column_privilege(9999,'nosuchcol','select'); +select has_column_privilege(9999,99::int2,'select'); +select has_column_privilege('pg_authid',99::int2,'select'); +select has_column_privilege(9999,99::int2,'select'); + +create temp table mytable(f1 int, f2 int, f3 int); +alter table mytable drop column f2; +select has_column_privilege('mytable','f2','select'); +select has_column_privilege('mytable','........pg.dropped.2........','select'); +select has_column_privilege('mytable',2::int2,'select'); +select has_column_privilege('mytable',99::int2,'select'); +revoke select on table mytable from regress_priv_user3; +select has_column_privilege('mytable',2::int2,'select'); +select has_column_privilege('mytable',99::int2,'select'); +drop table mytable; + +-- Grant options + +SET SESSION AUTHORIZATION regress_priv_user1; + +CREATE TABLE atest4 (a int); + +GRANT SELECT ON atest4 TO regress_priv_user2 WITH GRANT OPTION; +GRANT UPDATE ON atest4 TO regress_priv_user2; +GRANT SELECT ON atest4 TO GROUP regress_priv_group1 WITH GRANT OPTION; + +SET SESSION AUTHORIZATION regress_priv_user2; + +GRANT SELECT ON atest4 TO regress_priv_user3; +GRANT UPDATE ON atest4 TO regress_priv_user3; -- fail + +SET SESSION AUTHORIZATION regress_priv_user1; + +REVOKE SELECT ON atest4 FROM regress_priv_user3; -- does nothing +SELECT has_table_privilege('regress_priv_user3', 'atest4', 'SELECT'); -- true +REVOKE SELECT ON atest4 FROM regress_priv_user2; -- fail +REVOKE GRANT OPTION FOR SELECT ON atest4 FROM regress_priv_user2 CASCADE; -- ok +SELECT has_table_privilege('regress_priv_user2', 'atest4', 'SELECT'); -- true +SELECT has_table_privilege('regress_priv_user3', 'atest4', 'SELECT'); -- false + +SELECT has_table_privilege('regress_priv_user1', 'atest4', 'SELECT WITH GRANT OPTION'); -- true + + +-- security-restricted operations +\c - +CREATE ROLE regress_sro_user; + +-- Check that index expressions and predicates are run as the table's owner + +-- A dummy index function checking current_user +CREATE FUNCTION sro_ifun(int) RETURNS int AS $$ +BEGIN + -- Below we set the table's owner to regress_sro_user + ASSERT current_user = 'regress_sro_user', + format('sro_ifun(%s) called by %s', $1, current_user); + RETURN $1; +END; +$$ LANGUAGE plpgsql IMMUTABLE; +-- Create a table owned by regress_sro_user +CREATE TABLE sro_tab (a int); +ALTER TABLE sro_tab OWNER TO regress_sro_user; +INSERT INTO sro_tab VALUES (1), (2), (3); +-- Create an expression index with a predicate +CREATE INDEX sro_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +DROP INDEX sro_idx; +-- Do the same concurrently +CREATE INDEX sro_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +-- REINDEX +REINDEX TABLE sro_tab; +REINDEX INDEX sro_idx; +REINDEX TABLE sro_tab; +DROP INDEX sro_idx; +-- CLUSTER +CREATE INDEX sro_cluster_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))); +CLUSTER sro_tab USING sro_cluster_idx; +DROP INDEX sro_cluster_idx; +-- BRIN index +CREATE INDEX sro_brin ON sro_tab USING brin ((sro_ifun(a) + sro_ifun(0))); +SELECT brin_desummarize_range('sro_brin', 0); +SELECT brin_summarize_range('sro_brin', 0); +DROP TABLE sro_tab; +-- Check with a partitioned table +CREATE TABLE sro_ptab (a int) PARTITION BY RANGE (a); +ALTER TABLE sro_ptab OWNER TO regress_sro_user; +CREATE TABLE sro_part PARTITION OF sro_ptab FOR VALUES FROM (1) TO (10); +ALTER TABLE sro_part OWNER TO regress_sro_user; +INSERT INTO sro_ptab VALUES (1), (2), (3); +CREATE INDEX sro_pidx ON sro_ptab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +REINDEX TABLE sro_ptab; +REINDEX INDEX sro_pidx; + +SET SESSION AUTHORIZATION regress_sro_user; +CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS + 'GRANT regress_priv_group2 TO regress_sro_user'; +CREATE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS + 'DECLARE c CURSOR WITH HOLD FOR SELECT unwanted_grant(); SELECT true'; +-- REFRESH of this MV will queue a GRANT at end of transaction +CREATE MATERIALIZED VIEW sro_mv AS SELECT mv_action() WITH NO DATA; +REFRESH MATERIALIZED VIEW sro_mv; +\c - +REFRESH MATERIALIZED VIEW sro_mv; + +SET SESSION AUTHORIZATION regress_sro_user; +-- INSERT to this table will queue a GRANT at end of transaction +CREATE TABLE sro_trojan_table (); +CREATE FUNCTION sro_trojan() RETURNS trigger LANGUAGE plpgsql AS + 'BEGIN PERFORM unwanted_grant(); RETURN NULL; END'; +CREATE CONSTRAINT TRIGGER t AFTER INSERT ON sro_trojan_table + INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE sro_trojan(); +-- Now, REFRESH will issue such an INSERT, queueing the GRANT +CREATE OR REPLACE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS + 'INSERT INTO sro_trojan_table DEFAULT VALUES; SELECT true'; +REFRESH MATERIALIZED VIEW sro_mv; +\c - +REFRESH MATERIALIZED VIEW sro_mv; +BEGIN; SET allow_segment_DML = ON; SET CONSTRAINTS ALL IMMEDIATE; REFRESH MATERIALIZED VIEW sro_mv; COMMIT; + +-- REFRESH MATERIALIZED VIEW CONCURRENTLY use of eval_const_expressions() +SET SESSION AUTHORIZATION regress_sro_user; +CREATE FUNCTION unwanted_grant_nofail(int) RETURNS int + IMMUTABLE LANGUAGE plpgsql AS $$ +BEGIN + PERFORM unwanted_grant(); + RAISE WARNING 'owned'; + RETURN 1; +EXCEPTION WHEN OTHERS THEN + RETURN 2; +END$$; +CREATE MATERIALIZED VIEW sro_index_mv AS SELECT 1 AS c; +-- start_ignore +-- GPDB_14_MERGE_FIXME: the following command will abort the sub-transaction +-- in a DDL. The problem is that aborting the sub-transaction will also erase +-- the `dispatch_oids` needed by the QEs. It's a rare case. +-- We don't support this case now +CREATE UNIQUE INDEX ON sro_index_mv (c) WHERE unwanted_grant_nofail(1) > 0; +-- end_ignore +\c - +-- REFRESH MATERIALIZED VIEW CONCURRENTLY sro_index_mv; +REFRESH MATERIALIZED VIEW sro_index_mv; + +DROP OWNED BY regress_sro_user; +DROP ROLE regress_sro_user; + + +-- Admin options + +SET SESSION AUTHORIZATION regress_priv_user4; +CREATE FUNCTION dogrant_ok() RETURNS void LANGUAGE sql SECURITY DEFINER AS + 'GRANT regress_priv_group2 TO regress_priv_user5'; +GRANT regress_priv_group2 TO regress_priv_user5; -- ok: had ADMIN OPTION +SET ROLE regress_priv_group2; +GRANT regress_priv_group2 TO regress_priv_user5; -- fails: SET ROLE suspended privilege + +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT regress_priv_group2 TO regress_priv_user5; -- fails: no ADMIN OPTION +SELECT dogrant_ok(); -- ok: SECURITY DEFINER conveys ADMIN +SET ROLE regress_priv_group2; +GRANT regress_priv_group2 TO regress_priv_user5; -- fails: SET ROLE did not help + +SET SESSION AUTHORIZATION regress_priv_group2; +GRANT regress_priv_group2 TO regress_priv_user5; -- ok: a role can self-admin +CREATE FUNCTION dogrant_fails() RETURNS void LANGUAGE sql SECURITY DEFINER AS + 'GRANT regress_priv_group2 TO regress_priv_user5'; +SELECT dogrant_fails(); -- fails: no self-admin in SECURITY DEFINER +DROP FUNCTION dogrant_fails(); + +SET SESSION AUTHORIZATION regress_priv_user4; +DROP FUNCTION dogrant_ok(); +REVOKE regress_priv_group2 FROM regress_priv_user5; + + +-- has_sequence_privilege tests +\c - + +CREATE SEQUENCE x_seq; + +GRANT USAGE on x_seq to regress_priv_user2; + +SELECT has_sequence_privilege('regress_priv_user1', 'atest1', 'SELECT'); +SELECT has_sequence_privilege('regress_priv_user1', 'x_seq', 'INSERT'); +SELECT has_sequence_privilege('regress_priv_user1', 'x_seq', 'SELECT'); + +SET SESSION AUTHORIZATION regress_priv_user2; + +SELECT has_sequence_privilege('x_seq', 'USAGE'); + +-- largeobject privilege tests +\c - +SET SESSION AUTHORIZATION regress_priv_user1; + +-- start_ignore +SELECT lo_create(1001); +SELECT lo_create(1002); +SELECT lo_create(1003); +SELECT lo_create(1004); +SELECT lo_create(1005); + +GRANT ALL ON LARGE OBJECT 1001 TO PUBLIC; +GRANT SELECT ON LARGE OBJECT 1003 TO regress_priv_user2; +GRANT SELECT,UPDATE ON LARGE OBJECT 1004 TO regress_priv_user2; +GRANT ALL ON LARGE OBJECT 1005 TO regress_priv_user2; +GRANT SELECT ON LARGE OBJECT 1005 TO regress_priv_user2 WITH GRANT OPTION; + +GRANT SELECT, INSERT ON LARGE OBJECT 1001 TO PUBLIC; -- to be failed +GRANT SELECT, UPDATE ON LARGE OBJECT 1001 TO nosuchuser; -- to be failed +GRANT SELECT, UPDATE ON LARGE OBJECT 999 TO PUBLIC; -- to be failed +-- end_ignore + +\c - +SET SESSION AUTHORIZATION regress_priv_user2; + +-- start_ignore +SELECT lo_create(2001); +SELECT lo_create(2002); + +SELECT loread(lo_open(1001, x'20000'::int), 32); -- allowed, for now +SELECT lowrite(lo_open(1001, x'40000'::int), 'abcd'); -- fail, wrong mode + +SELECT loread(lo_open(1001, x'40000'::int), 32); +SELECT loread(lo_open(1002, x'40000'::int), 32); -- to be denied +SELECT loread(lo_open(1003, x'40000'::int), 32); +SELECT loread(lo_open(1004, x'40000'::int), 32); + +SELECT lowrite(lo_open(1001, x'20000'::int), 'abcd'); +SELECT lowrite(lo_open(1002, x'20000'::int), 'abcd'); -- to be denied +SELECT lowrite(lo_open(1003, x'20000'::int), 'abcd'); -- to be denied +SELECT lowrite(lo_open(1004, x'20000'::int), 'abcd'); + +GRANT SELECT ON LARGE OBJECT 1005 TO regress_priv_user3; +GRANT UPDATE ON LARGE OBJECT 1006 TO regress_priv_user3; -- to be denied +REVOKE ALL ON LARGE OBJECT 2001, 2002 FROM PUBLIC; +GRANT ALL ON LARGE OBJECT 2001 TO regress_priv_user3; + +SELECT lo_unlink(1001); -- to be denied +SELECT lo_unlink(2002); +-- end_ignore + +\c - +-- start_ignore +-- confirm ACL setting +SELECT oid, pg_get_userbyid(lomowner) ownername, lomacl FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid; +-- end_ignore + +SET SESSION AUTHORIZATION regress_priv_user3; + +-- start_ignore +SELECT loread(lo_open(1001, x'40000'::int), 32); +SELECT loread(lo_open(1003, x'40000'::int), 32); -- to be denied +SELECT loread(lo_open(1005, x'40000'::int), 32); + +SELECT lo_truncate(lo_open(1005, x'20000'::int), 10); -- to be denied +SELECT lo_truncate(lo_open(2001, x'20000'::int), 10); +-- end_ignore + +-- compatibility mode in largeobject permission +\c - +SET lo_compat_privileges = false; -- default setting +SET SESSION AUTHORIZATION regress_priv_user4; + +-- start_ignore +SELECT loread(lo_open(1002, x'40000'::int), 32); -- to be denied +SELECT lowrite(lo_open(1002, x'20000'::int), 'abcd'); -- to be denied +SELECT lo_truncate(lo_open(1002, x'20000'::int), 10); -- to be denied +SELECT lo_put(1002, 1, 'abcd'); -- to be denied +SELECT lo_unlink(1002); -- to be denied +SELECT lo_export(1001, '/dev/null'); -- to be denied +SELECT lo_import('/dev/null'); -- to be denied +SELECT lo_import('/dev/null', 2003); -- to be denied +-- end_ignore + +\c - +SET lo_compat_privileges = true; -- compatibility mode +SET SESSION AUTHORIZATION regress_priv_user4; + +-- start_ignore +SELECT loread(lo_open(1002, x'40000'::int), 32); +SELECT lowrite(lo_open(1002, x'20000'::int), 'abcd'); +SELECT lo_truncate(lo_open(1002, x'20000'::int), 10); +SELECT lo_unlink(1002); +SELECT lo_export(1001, '/dev/null'); -- to be denied +-- end_ignore + +-- don't allow unpriv users to access pg_largeobject contents +\c - +SELECT * FROM pg_largeobject LIMIT 0; + +SET SESSION AUTHORIZATION regress_priv_user1; +SELECT * FROM pg_largeobject LIMIT 0; -- to be denied + +-- test pg_database_owner +RESET SESSION AUTHORIZATION; +GRANT pg_database_owner TO regress_priv_user1; +GRANT regress_priv_user1 TO pg_database_owner; +CREATE TABLE datdba_only (); +ALTER TABLE datdba_only OWNER TO pg_database_owner; +REVOKE DELETE ON datdba_only FROM pg_database_owner; +SELECT + pg_has_role('regress_priv_user1', 'pg_database_owner', 'USAGE') as priv, + pg_has_role('regress_priv_user1', 'pg_database_owner', 'MEMBER') as mem, + pg_has_role('regress_priv_user1', 'pg_database_owner', + 'MEMBER WITH ADMIN OPTION') as admin; + +BEGIN; +DO $$BEGIN EXECUTE format( + 'ALTER DATABASE %I OWNER TO regress_priv_group2', current_catalog); END$$; +SELECT + pg_has_role('regress_priv_user1', 'pg_database_owner', 'USAGE') as priv, + pg_has_role('regress_priv_user1', 'pg_database_owner', 'MEMBER') as mem, + pg_has_role('regress_priv_user1', 'pg_database_owner', + 'MEMBER WITH ADMIN OPTION') as admin; +SET SESSION AUTHORIZATION regress_priv_user1; +TABLE information_schema.enabled_roles ORDER BY role_name COLLATE "C"; +TABLE information_schema.applicable_roles ORDER BY role_name COLLATE "C"; +INSERT INTO datdba_only DEFAULT VALUES; +SAVEPOINT q; DELETE FROM datdba_only; ROLLBACK TO q; +SET SESSION AUTHORIZATION regress_priv_user2; +TABLE information_schema.enabled_roles; +INSERT INTO datdba_only DEFAULT VALUES; +ROLLBACK; + +-- test default ACLs +\c - + +CREATE SCHEMA testns; +GRANT ALL ON SCHEMA testns TO regress_priv_user1; + +CREATE TABLE testns.acltest1 (x int); +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- no +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no + +-- placeholder for test with duplicated schema and role names +ALTER DEFAULT PRIVILEGES IN SCHEMA testns,testns GRANT SELECT ON TABLES TO public,public; + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- no +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no + +DROP TABLE testns.acltest1; +CREATE TABLE testns.acltest1 (x int); + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- yes +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT INSERT ON TABLES TO regress_priv_user1; + +DROP TABLE testns.acltest1; +CREATE TABLE testns.acltest1 (x int); + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- yes +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- yes + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns REVOKE INSERT ON TABLES FROM regress_priv_user1; + +DROP TABLE testns.acltest1; +CREATE TABLE testns.acltest1 (x int); + +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- yes +SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no + +ALTER DEFAULT PRIVILEGES FOR ROLE regress_priv_user1 REVOKE EXECUTE ON FUNCTIONS FROM public; + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT USAGE ON SCHEMAS TO regress_priv_user2; -- error + +-- +-- Testing blanket default grants is very hazardous since it might change +-- the privileges attached to objects created by concurrent regression tests. +-- To avoid that, be sure to revoke the privileges again before committing. +-- +BEGIN; + +ALTER DEFAULT PRIVILEGES GRANT USAGE ON SCHEMAS TO regress_priv_user2; + +CREATE SCHEMA testns2; + +SELECT has_schema_privilege('regress_priv_user2', 'testns2', 'USAGE'); -- yes +SELECT has_schema_privilege('regress_priv_user6', 'testns2', 'USAGE'); -- yes +SELECT has_schema_privilege('regress_priv_user2', 'testns2', 'CREATE'); -- no + +ALTER DEFAULT PRIVILEGES REVOKE USAGE ON SCHEMAS FROM regress_priv_user2; + +CREATE SCHEMA testns3; + +SELECT has_schema_privilege('regress_priv_user2', 'testns3', 'USAGE'); -- no +SELECT has_schema_privilege('regress_priv_user2', 'testns3', 'CREATE'); -- no + +ALTER DEFAULT PRIVILEGES GRANT ALL ON SCHEMAS TO regress_priv_user2; + +CREATE SCHEMA testns4; + +SELECT has_schema_privilege('regress_priv_user2', 'testns4', 'USAGE'); -- yes +SELECT has_schema_privilege('regress_priv_user2', 'testns4', 'CREATE'); -- yes + +ALTER DEFAULT PRIVILEGES REVOKE ALL ON SCHEMAS FROM regress_priv_user2; + +COMMIT; + +-- Test for DROP OWNED BY with shared dependencies. This is done in a +-- separate, rollbacked, transaction to avoid any trouble with other +-- regression sessions. +BEGIN; +ALTER DEFAULT PRIVILEGES GRANT ALL ON FUNCTIONS TO regress_priv_user2; +ALTER DEFAULT PRIVILEGES GRANT ALL ON SCHEMAS TO regress_priv_user2; +ALTER DEFAULT PRIVILEGES GRANT ALL ON SEQUENCES TO regress_priv_user2; +ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO regress_priv_user2; +ALTER DEFAULT PRIVILEGES GRANT ALL ON TYPES TO regress_priv_user2; +SELECT count(*) FROM pg_shdepend + WHERE deptype = 'a' AND + refobjid = 'regress_priv_user2'::regrole AND + classid = 'pg_default_acl'::regclass; +DROP OWNED BY regress_priv_user2, regress_priv_user2; +SELECT count(*) FROM pg_shdepend + WHERE deptype = 'a' AND + refobjid = 'regress_priv_user2'::regrole AND + classid = 'pg_default_acl'::regclass; +ROLLBACK; + +CREATE SCHEMA testns5; + +SELECT has_schema_privilege('regress_priv_user2', 'testns5', 'USAGE'); -- no +SELECT has_schema_privilege('regress_priv_user2', 'testns5', 'CREATE'); -- no + +SET ROLE regress_priv_user1; + +CREATE FUNCTION testns.foo() RETURNS int AS 'select 1' LANGUAGE sql; +CREATE AGGREGATE testns.agg1(int) (sfunc = int4pl, stype = int4); +CREATE PROCEDURE testns.bar() AS 'select 1' LANGUAGE sql; + +SELECT has_function_privilege('regress_priv_user2', 'testns.foo()', 'EXECUTE'); -- no +SELECT has_function_privilege('regress_priv_user2', 'testns.agg1(int)', 'EXECUTE'); -- no +SELECT has_function_privilege('regress_priv_user2', 'testns.bar()', 'EXECUTE'); -- no + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT EXECUTE ON ROUTINES to public; + +DROP FUNCTION testns.foo(); +CREATE FUNCTION testns.foo() RETURNS int AS 'select 1' LANGUAGE sql; +DROP AGGREGATE testns.agg1(int); +CREATE AGGREGATE testns.agg1(int) (sfunc = int4pl, stype = int4); +DROP PROCEDURE testns.bar(); +CREATE PROCEDURE testns.bar() AS 'select 1' LANGUAGE sql; + +SELECT has_function_privilege('regress_priv_user2', 'testns.foo()', 'EXECUTE'); -- yes +SELECT has_function_privilege('regress_priv_user2', 'testns.agg1(int)', 'EXECUTE'); -- yes +SELECT has_function_privilege('regress_priv_user2', 'testns.bar()', 'EXECUTE'); -- yes (counts as function here) + +DROP FUNCTION testns.foo(); +DROP AGGREGATE testns.agg1(int); +DROP PROCEDURE testns.bar(); + +ALTER DEFAULT PRIVILEGES FOR ROLE regress_priv_user1 REVOKE USAGE ON TYPES FROM public; + +CREATE DOMAIN testns.priv_testdomain1 AS int; + +SELECT has_type_privilege('regress_priv_user2', 'testns.priv_testdomain1', 'USAGE'); -- no + +ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT USAGE ON TYPES to public; + +DROP DOMAIN testns.priv_testdomain1; +CREATE DOMAIN testns.priv_testdomain1 AS int; + +SELECT has_type_privilege('regress_priv_user2', 'testns.priv_testdomain1', 'USAGE'); -- yes + +DROP DOMAIN testns.priv_testdomain1; + +RESET ROLE; + +SELECT count(*) + FROM pg_default_acl d LEFT JOIN pg_namespace n ON defaclnamespace = n.oid + WHERE nspname = 'testns'; + +DROP SCHEMA testns CASCADE; +DROP SCHEMA testns2 CASCADE; +DROP SCHEMA testns3 CASCADE; +DROP SCHEMA testns4 CASCADE; +DROP SCHEMA testns5 CASCADE; + +SELECT d.* -- check that entries went away + FROM pg_default_acl d LEFT JOIN pg_namespace n ON defaclnamespace = n.oid + WHERE nspname IS NULL AND defaclnamespace != 0; + + +-- Grant on all objects of given type in a schema +\c - + +-- GPDB: Create a helper function to inspect the segment information also +DROP FUNCTION IF EXISTS has_table_privilege_seg(u text, r text, p text); +CREATE FUNCTION has_table_privilege_seg(us text, rel text, priv text) +RETURNS TABLE ( + segid int, + has_table_privilege bool +) AS $$ + SELECT + gp_execution_segment() AS gegid, + p.* + FROM + has_table_privilege($1, $2, $3) p +$$ LANGUAGE SQL VOLATILE +CONTAINS SQL EXECUTE ON ALL SEGMENTS; + +CREATE SCHEMA testns; +CREATE TABLE testns.t1 (f1 int); +CREATE TABLE testns.t2 (f1 int); + +SELECT has_table_privilege('regress_priv_user1', 'testns.t1', 'SELECT'); -- false + +GRANT ALL ON ALL TABLES IN SCHEMA testns TO regress_priv_user1; + +SELECT has_table_privilege('regress_priv_user1', 'testns.t1', 'SELECT'); -- true +SELECT has_table_privilege('regress_priv_user1', 'testns.t2', 'SELECT'); -- true + +REVOKE ALL ON ALL TABLES IN SCHEMA testns FROM regress_priv_user1; + +SELECT has_table_privilege('regress_priv_user1', 'testns.t1', 'SELECT'); -- false +SELECT has_table_privilege('regress_priv_user1', 'testns.t2', 'SELECT'); -- false + +CREATE FUNCTION testns.priv_testfunc(int) RETURNS int AS 'select 3 * $1;' LANGUAGE sql; +CREATE AGGREGATE testns.priv_testagg(int) (sfunc = int4pl, stype = int4); +CREATE PROCEDURE testns.priv_testproc(int) AS 'select 3' LANGUAGE sql; + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testfunc(int)', 'EXECUTE'); -- true by default +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testagg(int)', 'EXECUTE'); -- true by default +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testproc(int)', 'EXECUTE'); -- true by default + +REVOKE ALL ON ALL FUNCTIONS IN SCHEMA testns FROM PUBLIC; + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testfunc(int)', 'EXECUTE'); -- false +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testagg(int)', 'EXECUTE'); -- false +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testproc(int)', 'EXECUTE'); -- still true, not a function + +REVOKE ALL ON ALL PROCEDURES IN SCHEMA testns FROM PUBLIC; + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testproc(int)', 'EXECUTE'); -- now false + +GRANT ALL ON ALL ROUTINES IN SCHEMA testns TO PUBLIC; + +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testfunc(int)', 'EXECUTE'); -- true +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testagg(int)', 'EXECUTE'); -- true +SELECT has_function_privilege('regress_priv_user1', 'testns.priv_testproc(int)', 'EXECUTE'); -- true + +DROP SCHEMA testns CASCADE; + + +-- Change owner of the schema & and rename of new schema owner +\c - + +CREATE ROLE regress_schemauser1 superuser login; +CREATE ROLE regress_schemauser2 superuser login; + +SET SESSION ROLE regress_schemauser1; +CREATE SCHEMA testns; + +SELECT nspname, rolname FROM pg_namespace, pg_roles WHERE pg_namespace.nspname = 'testns' AND pg_namespace.nspowner = pg_roles.oid; + +ALTER SCHEMA testns OWNER TO regress_schemauser2; +ALTER ROLE regress_schemauser2 RENAME TO regress_schemauser_renamed; +SELECT nspname, rolname FROM pg_namespace, pg_roles WHERE pg_namespace.nspname = 'testns' AND pg_namespace.nspowner = pg_roles.oid; + +set session role regress_schemauser_renamed; +DROP SCHEMA testns CASCADE; + +-- clean up +\c - + +DROP ROLE regress_schemauser1; +DROP ROLE regress_schemauser_renamed; + + +-- test that dependent privileges are revoked (or not) properly +\c - + +set session role regress_priv_user1; +create table dep_priv_test (a int); +grant select on dep_priv_test to regress_priv_user2 with grant option; +grant select on dep_priv_test to regress_priv_user3 with grant option; +set session role regress_priv_user2; +grant select on dep_priv_test to regress_priv_user4 with grant option; +set session role regress_priv_user3; +grant select on dep_priv_test to regress_priv_user4 with grant option; +set session role regress_priv_user4; +grant select on dep_priv_test to regress_priv_user5; +\dp dep_priv_test +set session role regress_priv_user2; +revoke select on dep_priv_test from regress_priv_user4 cascade; +\dp dep_priv_test +set session role regress_priv_user3; +revoke select on dep_priv_test from regress_priv_user4 cascade; +\dp dep_priv_test +set session role regress_priv_user1; +drop table dep_priv_test; + + +-- clean up + +\c + +drop sequence x_seq; + +DROP AGGREGATE priv_testagg1(int); +DROP FUNCTION priv_testfunc2(int); +DROP FUNCTION priv_testfunc4(boolean); +DROP PROCEDURE priv_testproc1(int); + +DROP VIEW atestv0; +DROP VIEW atestv1; +DROP VIEW atestv2; +-- this should cascade to drop atestv4 +DROP VIEW atestv3 CASCADE; +-- this should complain "does not exist" +DROP VIEW atestv4; + +DROP TABLE atest1; +DROP TABLE atest2; +DROP TABLE atest3; +DROP TABLE atest4; +DROP TABLE atest5; +DROP TABLE atest6; +DROP TABLE atestc; +DROP TABLE atestp1; +DROP TABLE atestp2; + +-- start_ignore +SELECT lo_unlink(oid) FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid; +-- end_ignore + +DROP GROUP regress_priv_group1; +DROP GROUP regress_priv_group2; + +-- these are needed to clean up permissions +REVOKE USAGE ON LANGUAGE sql FROM regress_priv_user1; +DROP OWNED BY regress_priv_user1; + +DROP USER regress_priv_user1; +DROP USER regress_priv_user2; +DROP USER regress_priv_user3; +DROP USER regress_priv_user4; +DROP USER regress_priv_user5; +DROP USER regress_priv_user6; +DROP USER regress_priv_user7; +DROP USER regress_priv_user8; -- does not exist + + +-- permissions with LOCK TABLE +CREATE USER regress_locktable_user; +CREATE TABLE lock_table (a int); + +-- LOCK TABLE and SELECT permission +GRANT SELECT ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should fail +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should fail +ROLLBACK; +\c +REVOKE SELECT ON lock_table FROM regress_locktable_user; + +-- LOCK TABLE and INSERT permission +GRANT INSERT ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should fail +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should fail +ROLLBACK; +\c +REVOKE INSERT ON lock_table FROM regress_locktable_user; + +-- LOCK TABLE and UPDATE permission +GRANT UPDATE ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should fail +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should pass +COMMIT; +\c +REVOKE UPDATE ON lock_table FROM regress_locktable_user; + +-- LOCK TABLE and DELETE permission +GRANT DELETE ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should fail +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should pass +COMMIT; +\c +REVOKE DELETE ON lock_table FROM regress_locktable_user; + +-- LOCK TABLE and TRUNCATE permission +GRANT TRUNCATE ON lock_table TO regress_locktable_user; +SET SESSION AUTHORIZATION regress_locktable_user; +BEGIN; +LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass +COMMIT; +BEGIN; +LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should fail +ROLLBACK; +BEGIN; +LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should pass +COMMIT; +\c +REVOKE TRUNCATE ON lock_table FROM regress_locktable_user; + +-- clean up +DROP TABLE lock_table; +DROP USER regress_locktable_user; diff --git a/src/test/singlenode_regress/sql/psql.sql b/src/test/singlenode_regress/sql/psql.sql new file mode 100644 index 00000000000..ff07c1851fd --- /dev/null +++ b/src/test/singlenode_regress/sql/psql.sql @@ -0,0 +1,1489 @@ +-- +-- Tests for psql features that aren't closely connected to any +-- specific server features +-- + +-- \set + +-- fail: invalid name +\set invalid/name foo +-- fail: invalid value for special variable +\set AUTOCOMMIT foo +\set FETCH_COUNT foo +-- check handling of built-in boolean variable +\echo :ON_ERROR_ROLLBACK +\set ON_ERROR_ROLLBACK +\echo :ON_ERROR_ROLLBACK +\set ON_ERROR_ROLLBACK foo +\echo :ON_ERROR_ROLLBACK +\set ON_ERROR_ROLLBACK on +\echo :ON_ERROR_ROLLBACK +\unset ON_ERROR_ROLLBACK +\echo :ON_ERROR_ROLLBACK + +-- \g and \gx + +SELECT 1 as one, 2 as two \g +\gx +SELECT 3 as three, 4 as four \gx +\g + +-- \gx should work in FETCH_COUNT mode too +\set FETCH_COUNT 1 + +SELECT 1 as one, 2 as two \g +\gx +SELECT 3 as three, 4 as four \gx +\g + +\unset FETCH_COUNT + +-- \g/\gx with pset options + +SELECT 1 as one, 2 as two \g (format=csv csv_fieldsep='\t') +\g +SELECT 1 as one, 2 as two \gx (title='foo bar') +\g + +-- \gset + +select 10 as test01, 20 as test02, 'Hello' as test03 \gset pref01_ + +\echo :pref01_test01 :pref01_test02 :pref01_test03 + +-- should fail: bad variable name +select 10 as "bad name" +\gset + +select 97 as "EOF", 'ok' as _foo \gset IGNORE +\echo :IGNORE_foo :IGNOREEOF + +-- multiple backslash commands in one line +select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x +select 3 as x, 4 as y \gset pref01_ \echo :pref01_x \echo :pref01_y +select 5 as x, 6 as y \gset pref01_ \\ \g \echo :pref01_x :pref01_y +select 7 as x, 8 as y \g \gset pref01_ \echo :pref01_x :pref01_y + +-- NULL should unset the variable +\set var2 xyz +select 1 as var1, NULL as var2, 3 as var3 \gset +\echo :var1 :var2 :var3 + +-- \gset requires just one tuple +select 10 as test01, 20 as test02 from generate_series(1,3) \gset +select 10 as test01, 20 as test02 from generate_series(1,0) \gset + +-- \gset should work in FETCH_COUNT mode too +\set FETCH_COUNT 1 + +select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x +select 3 as x, 4 as y \gset pref01_ \echo :pref01_x \echo :pref01_y +select 10 as test01, 20 as test02 from generate_series(1,3) \gset +select 10 as test01, 20 as test02 from generate_series(1,0) \gset + +\unset FETCH_COUNT + +-- \gdesc + +SELECT + NULL AS zero, + 1 AS one, + 2.0 AS two, + 'three' AS three, + $1 AS four, + sin($2) as five, + 'foo'::varchar(4) as six, + CURRENT_DATE AS now +\gdesc + +-- should work with tuple-returning utilities, such as EXECUTE +PREPARE test AS SELECT 1 AS first, 2 AS second; +EXECUTE test \gdesc +EXPLAIN EXECUTE test \gdesc + +-- should fail cleanly - syntax error +SELECT 1 + \gdesc + +-- check behavior with empty results +SELECT \gdesc +CREATE TABLE bububu(a int) \gdesc + +-- subject command should not have executed +TABLE bububu; -- fail + +-- query buffer should remain unchanged +SELECT 1 AS x, 'Hello', 2 AS y, true AS "dirty\name" +\gdesc +\g + +-- all on one line +SELECT 3 AS x, 'Hello', 4 AS y, true AS "dirty\name" \gdesc \g + +-- \gexec + +create temporary table gexec_test(a int, b text, c date, d float); +select format('create index on gexec_test(%I)', attname) +from pg_attribute +where attrelid = 'gexec_test'::regclass and attnum > 0 +order by attnum +\gexec + +-- \gexec should work in FETCH_COUNT mode too +-- (though the fetch limit applies to the executed queries not the meta query) +\set FETCH_COUNT 1 + +select 'select 1 as ones', 'select x.y, x.y*2 as double from generate_series(1,4) as x(y)' +union all +select 'drop table gexec_test', NULL +union all +select 'drop table gexec_test', 'select ''2000-01-01''::date as party_over' +\gexec + +\unset FETCH_COUNT + +-- show all pset options +\pset + +-- test multi-line headers, wrapping, and newline indicators +-- in aligned, unaligned, and wrapped formats +prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab + +c", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a +bc" from generate_series(1,10) as n(n) group by n>1 order by n>1; + +\pset linestyle ascii + +\pset expanded off +\pset columns 40 + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset expanded on +\pset columns 20 + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset linestyle old-ascii + +\pset expanded off +\pset columns 40 + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset expanded on +\pset columns 20 + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +deallocate q; + +-- test single-line header and data +prepare q as select repeat('x',2*n) as "0123456789abcdef", repeat('y',20-2*n) as "0123456789" from generate_series(1,10) as n; + +\pset linestyle ascii + +\pset expanded off +\pset columns 40 + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset expanded on +\pset columns 30 + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset expanded on +\pset columns 20 + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset linestyle old-ascii + +\pset expanded off +\pset columns 40 + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset expanded on + +\pset border 0 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 1 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +\pset border 2 +\pset format unaligned +execute q; +\pset format aligned +execute q; +\pset format wrapped +execute q; + +deallocate q; + +\pset linestyle ascii +\pset border 1 + +-- support table for output-format tests (useful to create a footer) + +create table psql_serial_tab (id serial); + +-- test header/footer/tuples_only behavior in aligned/unaligned/wrapped cases + +\pset format aligned + +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +-- empty table is a special case for this format +select 1 where false; + +\pset format unaligned + +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false + +\pset format wrapped + +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false + +-- check conditional am display +\pset expanded off + +CREATE SCHEMA tableam_display; +CREATE ROLE regress_display_role; +ALTER SCHEMA tableam_display OWNER TO regress_display_role; +SET search_path TO tableam_display; +CREATE ACCESS METHOD heap_psql TYPE TABLE HANDLER heap_tableam_handler; +SET ROLE TO regress_display_role; +-- Use only relations with a physical size of zero. +CREATE TABLE tbl_heap_psql(f1 int, f2 char(100)) using heap_psql; +CREATE TABLE tbl_heap(f1 int, f2 char(100)) using heap; +CREATE VIEW view_heap_psql AS SELECT f1 from tbl_heap_psql; +CREATE MATERIALIZED VIEW mat_view_heap_psql USING heap_psql AS SELECT f1 from tbl_heap_psql; +\d+ tbl_heap_psql +\d+ tbl_heap +\set HIDE_TABLEAM off +\d+ tbl_heap_psql +\d+ tbl_heap +-- AM is displayed for tables, indexes and materialized views. +\d+ +\dt+ +\dm+ +-- But not for views and sequences. +\dv+ +\set HIDE_TABLEAM on +\d+ +RESET ROLE; +RESET search_path; +DROP SCHEMA tableam_display CASCADE; +DROP ACCESS METHOD heap_psql; +DROP ROLE regress_display_role; + +-- test numericlocale (as best we can without control of psql's locale) + +\pset format aligned +\pset expanded off +\pset numericlocale true + +select n, -n as m, n * 111 as x, '1e90'::float8 as f +from generate_series(0,3) n; + +\pset numericlocale false + +-- test asciidoc output format + +\pset format asciidoc + +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false + +prepare q as + select 'some|text' as "a|title", ' ' as "empty ", n as int + from generate_series(1,2) as n; + +\pset expanded off +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset border 2 +execute q; + +\pset expanded on +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset border 2 +execute q; + +deallocate q; + +-- test csv output format + +\pset format csv + +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false + +prepare q as + select 'some"text' as "a""title", E' \n' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; + +\pset expanded off +execute q; + +\pset expanded on +execute q; + +deallocate q; + +-- special cases +\pset expanded off +select 'comma,comma' as comma, 'semi;semi' as semi; +\pset csv_fieldsep ';' +select 'comma,comma' as comma, 'semi;semi' as semi; +select '\.' as data; +\pset csv_fieldsep '.' +select '\' as d1, '' as d2; + +-- illegal csv separators +\pset csv_fieldsep '' +\pset csv_fieldsep '\0' +\pset csv_fieldsep '\n' +\pset csv_fieldsep '\r' +\pset csv_fieldsep '"' +\pset csv_fieldsep ',,' + +\pset csv_fieldsep ',' + +-- test html output format + +\pset format html + +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false + +prepare q as + select 'some"text' as "a&title", E' \n' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; + +\pset expanded off +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset tableattr foobar +execute q; +\pset tableattr + +\pset expanded on +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset tableattr foobar +execute q; +\pset tableattr + +deallocate q; + +-- test latex output format + +\pset format latex + +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false + +prepare q as + select 'some\more_text' as "a$title", E' #%&^~|\n{bar}' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; + +\pset expanded off +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset border 2 +execute q; + +\pset border 3 +execute q; + +\pset expanded on +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset border 2 +execute q; + +\pset border 3 +execute q; + +deallocate q; + +-- test latex-longtable output format + +\pset format latex-longtable + +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false + +prepare q as + select 'some\more_text' as "a$title", E' #%&^~|\n{bar}' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; + +\pset expanded off +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset border 2 +execute q; + +\pset border 3 +execute q; + +\pset tableattr lr +execute q; +\pset tableattr + +\pset expanded on +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset border 2 +execute q; + +\pset border 3 +execute q; + +\pset tableattr lr +execute q; +\pset tableattr + +deallocate q; + +-- test troff-ms output format + +\pset format troff-ms + +\pset border 1 +\pset expanded off +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false +\pset expanded on +\d psql_serial_tab_id_seq +\pset tuples_only true +\df exp +\pset tuples_only false + +prepare q as + select 'some\text' as "a\title", E' \n' as "junk", + ' ' as "empty", n as int + from generate_series(1,2) as n; + +\pset expanded off +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset border 2 +execute q; + +\pset expanded on +\pset border 0 +execute q; + +\pset border 1 +execute q; + +\pset border 2 +execute q; + +deallocate q; + +-- check ambiguous format requests + +\pset format a +\pset format l + +-- clean up after output format tests + +drop table psql_serial_tab; + +\pset format aligned +\pset expanded off +\pset border 1 + +-- \echo and allied features + +\echo this is a test +\echo -n without newline +\echo with -n newline +\echo '-n' with newline + +\set foo bar +\echo foo = :foo + +\qecho this is a test +\qecho foo = :foo + +\warn this is a test +\warn foo = :foo + +-- tests for \if ... \endif + +\if true + select 'okay'; + select 'still okay'; +\else + not okay; + still not okay +\endif + +-- at this point query buffer should still have last valid line +\g + +-- \if should work okay on part of a query +select + \if true + 42 + \else + (bogus + \endif + forty_two; + +select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; + +-- test a large nested if using a variety of true-equivalents +\if true + \if 1 + \if yes + \if on + \echo 'all true' + \else + \echo 'should not print #1-1' + \endif + \else + \echo 'should not print #1-2' + \endif + \else + \echo 'should not print #1-3' + \endif +\else + \echo 'should not print #1-4' +\endif + +-- test a variety of false-equivalents in an if/elif/else structure +\if false + \echo 'should not print #2-1' +\elif 0 + \echo 'should not print #2-2' +\elif no + \echo 'should not print #2-3' +\elif off + \echo 'should not print #2-4' +\else + \echo 'all false' +\endif + +-- test true-false elif after initial true branch +\if true + \echo 'should print #2-5' +\elif true + \echo 'should not print #2-6' +\elif false + \echo 'should not print #2-7' +\else + \echo 'should not print #2-8' +\endif + +-- test simple true-then-else +\if true + \echo 'first thing true' +\else + \echo 'should not print #3-1' +\endif + +-- test simple false-true-else +\if false + \echo 'should not print #4-1' +\elif true + \echo 'second thing true' +\else + \echo 'should not print #5-1' +\endif + +-- invalid boolean expressions are false +\if invalid boolean expression + \echo 'will not print #6-1' +\else + \echo 'will print anyway #6-2' +\endif + +-- test un-matched endif +\endif + +-- test un-matched else +\else + +-- test un-matched elif +\elif + +-- test double-else error +\if true +\else +\else +\endif + +-- test elif out-of-order +\if false +\else +\elif +\endif + +-- test if-endif matching in a false branch +\if false + \if false + \echo 'should not print #7-1' + \else + \echo 'should not print #7-2' + \endif + \echo 'should not print #7-3' +\else + \echo 'should print #7-4' +\endif + +-- show that vars and backticks are not expanded when ignoring extra args +\set foo bar +\echo :foo :'foo' :"foo" +\pset fieldsep | `nosuchcommand` :foo :'foo' :"foo" + +-- show that vars and backticks are not expanded and commands are ignored +-- when in a false if-branch +\set try_to_quit '\\q' +\if false + :try_to_quit + \echo `nosuchcommand` :foo :'foo' :"foo" + \pset fieldsep | `nosuchcommand` :foo :'foo' :"foo" + \a + \C arg1 + \c arg1 arg2 arg3 arg4 + \cd arg1 + \conninfo + \copy arg1 arg2 arg3 arg4 arg5 arg6 + \copyright + SELECT 1 as one, 2, 3 \crosstabview + \dt arg1 + \e arg1 arg2 + \ef whole_line + \ev whole_line + \echo arg1 arg2 arg3 arg4 arg5 + \echo arg1 + \encoding arg1 + \errverbose + \f arg1 + \g arg1 + \gx arg1 + \gexec + SELECT 1 AS one \gset + \h + \? + \html + \i arg1 + \ir arg1 + \l arg1 + \lo arg1 arg2 + \lo_list + \o arg1 + \p + \password arg1 + \prompt arg1 arg2 + \pset arg1 arg2 + \q + \reset + \s arg1 + \set arg1 arg2 arg3 arg4 arg5 arg6 arg7 + \setenv arg1 arg2 + \sf whole_line + \sv whole_line + \t arg1 + \T arg1 + \timing arg1 + \unset arg1 + \w arg1 + \watch arg1 + \x arg1 + -- \else here is eaten as part of OT_FILEPIPE argument + \w |/no/such/file \else + -- \endif here is eaten as part of whole-line argument + \! whole_line \endif + \z +\else + \echo 'should print #8-1' +\endif + +-- :{?...} defined variable test +\set i 1 +\if :{?i} + \echo '#9-1 ok, variable i is defined' +\else + \echo 'should not print #9-2' +\endif + +\if :{?no_such_variable} + \echo 'should not print #10-1' +\else + \echo '#10-2 ok, variable no_such_variable is not defined' +\endif + +SELECT :{?i} AS i_is_defined; + +SELECT NOT :{?no_such_var} AS no_such_var_is_not_defined; + +-- SHOW_CONTEXT + +\set SHOW_CONTEXT never +do $$ +begin + raise notice 'foo'; + raise exception 'bar'; +end $$; + +\set SHOW_CONTEXT errors +do $$ +begin + raise notice 'foo'; + raise exception 'bar'; +end $$; + +\set SHOW_CONTEXT always +do $$ +begin + raise notice 'foo'; + raise exception 'bar'; +end $$; + +-- test printing and clearing the query buffer +SELECT 1; +\p +SELECT 2 \r +\p +SELECT 3 \p +UNION SELECT 4 \p +UNION SELECT 5 +ORDER BY 1; +\r +\p + +-- tests for special result variables + +-- working query, 2 rows selected +SELECT 1 AS stuff UNION SELECT 2; +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'number of rows:' :ROW_COUNT + +-- syntax error +SELECT 1 UNION; +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'number of rows:' :ROW_COUNT +\echo 'last error message:' :LAST_ERROR_MESSAGE +\echo 'last error code:' :LAST_ERROR_SQLSTATE + +-- empty query +; +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'number of rows:' :ROW_COUNT +-- must have kept previous values +\echo 'last error message:' :LAST_ERROR_MESSAGE +\echo 'last error code:' :LAST_ERROR_SQLSTATE + +-- other query error +DROP TABLE this_table_does_not_exist; +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'number of rows:' :ROW_COUNT +\echo 'last error message:' :LAST_ERROR_MESSAGE +\echo 'last error code:' :LAST_ERROR_SQLSTATE + +-- nondefault verbosity error settings (except verbose, which is too unstable) +\set VERBOSITY terse +SELECT 1 UNION; +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'last error message:' :LAST_ERROR_MESSAGE + +\set VERBOSITY sqlstate +SELECT 1/0; +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'last error message:' :LAST_ERROR_MESSAGE + +\set VERBOSITY default + +-- working \gdesc +SELECT 3 AS three, 4 AS four \gdesc +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'number of rows:' :ROW_COUNT + +-- \gdesc with an error +SELECT 4 AS \gdesc +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'number of rows:' :ROW_COUNT +\echo 'last error message:' :LAST_ERROR_MESSAGE +\echo 'last error code:' :LAST_ERROR_SQLSTATE + +-- check row count for a cursor-fetched query +\set FETCH_COUNT 10 +select unique2 from tenk1 order by unique2 limit 19; +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'number of rows:' :ROW_COUNT + +-- cursor-fetched query with an error after the first group. In GPDB, the +-- query used in PostgreSQL errors out too early in the segments. Use a +-- different query that behaves the way this is intended. +--select 1/(15-unique2) from tenk1 order by unique2 limit 19; +select 1/(15-g) from generate_series(1, 1000000) g; + +\echo 'error:' :ERROR +\echo 'error code:' :SQLSTATE +\echo 'number of rows:' :ROW_COUNT +\echo 'last error message:' :LAST_ERROR_MESSAGE +\echo 'last error code:' :LAST_ERROR_SQLSTATE + +\unset FETCH_COUNT + +create schema testpart; +create role regress_partitioning_role; + +alter schema testpart owner to regress_partitioning_role; + +set role to regress_partitioning_role; + +-- run test inside own schema and hide other partitions +set search_path to testpart; + +create table testtable_apple(logdate date); +create table testtable_orange(logdate date); +create index testtable_apple_index on testtable_apple(logdate); +create index testtable_orange_index on testtable_orange(logdate); + +create table testpart_apple(logdate date) partition by range(logdate); +create table testpart_orange(logdate date) partition by range(logdate); + +create index testpart_apple_index on testpart_apple(logdate); +create index testpart_orange_index on testpart_orange(logdate); + +-- only partition related object should be displayed +\dP test*apple* +\dPt test*apple* +\dPi test*apple* + +drop table testtable_apple; +drop table testtable_orange; +drop table testpart_apple; +drop table testpart_orange; + +create table parent_tab (id int) partition by range (id); +create index parent_index on parent_tab (id); +create table child_0_10 partition of parent_tab + for values from (0) to (10); +create table child_10_20 partition of parent_tab + for values from (10) to (20); +create table child_20_30 partition of parent_tab + for values from (20) to (30); +insert into parent_tab values (generate_series(0,29)); +create table child_30_40 partition of parent_tab +for values from (30) to (40) + partition by range(id); +create table child_30_35 partition of child_30_40 + for values from (30) to (35); +create table child_35_40 partition of child_30_40 + for values from (35) to (40); +insert into parent_tab values (generate_series(30,39)); + +\dPt +\dPi + +\dP testpart.* +\dP + +\dPtn +\dPin +\dPn +\dPn testpart.* + +drop table parent_tab cascade; + +drop schema testpart; + +set search_path to default; + +set role to default; +drop role regress_partitioning_role; + +-- \d on toast table (use pg_statistic's toast table, which has a known name) +\d pg_toast.pg_toast_2619 + +-- check printing info about access methods +\dA +\dA * +\dA h* +\dA foo +\dA foo bar +\dA+ +\dA+ * +\dA+ h* +\dA+ foo +\dAc brin pg*.oid* +\dAf spgist +\dAf btree int4 +\dAo+ btree float_ops +\dAo * pg_catalog.jsonb_path_ops +\dAp+ btree float_ops +\dAp * pg_catalog.uuid_ops + +-- check \df, \do with argument specifications +\df *sqrt +\df *sqrt num* +\df int*pl +\df int*pl int4 +\df int*pl * pg_catalog.int8 +\df acl* aclitem[] +\df has_database_privilege oid text +\df has_database_privilege oid text - +\dfa bit* small* +\do - pg_catalog.int4 +\do && anyarray * + +-- check describing invalid multipart names +\dA regression.heap +\dA nonesuch.heap +\dt host.regression.pg_catalog.pg_class +\dt |.pg_catalog.pg_class +\dt nonesuch.pg_catalog.pg_class +\da host.regression.pg_catalog.sum +\da +.pg_catalog.sum +\da nonesuch.pg_catalog.sum +\dAc nonesuch.brin +\dAc regression.brin +\dAf nonesuch.brin +\dAf regression.brin +\dAo nonesuch.brin +\dAo regression.brin +\dAp nonesuch.brin +\dAp regression.brin +\db nonesuch.pg_default +\db regression.pg_default +\dc host.regression.public.conversion +\dc (.public.conversion +\dc nonesuch.public.conversion +\dC host.regression.pg_catalog.int8 +\dC ).pg_catalog.int8 +\dC nonesuch.pg_catalog.int8 +\dd host.regression.pg_catalog.pg_class +\dd [.pg_catalog.pg_class +\dd nonesuch.pg_catalog.pg_class +\dD host.regression.public.gtestdomain1 +\dD ].public.gtestdomain1 +\dD nonesuch.public.gtestdomain1 +\ddp host.regression.pg_catalog.pg_class +\ddp {.pg_catalog.pg_class +\ddp nonesuch.pg_catalog.pg_class +\dE host.regression.public.ft +\dE }.public.ft +\dE nonesuch.public.ft +\di host.regression.public.tenk1_hundred +\di ..public.tenk1_hundred +\di nonesuch.public.tenk1_hundred +\dm host.regression.public.mvtest_bb +\dm ^.public.mvtest_bb +\dm nonesuch.public.mvtest_bb +\ds host.regression.public.check_seq +\ds regression|mydb.public.check_seq +\ds nonesuch.public.check_seq +\dt host.regression.public.b_star +\dt regres+ion.public.b_star +\dt nonesuch.public.b_star +\dv host.regression.public.shoe +\dv regress(ion).public.shoe +\dv nonesuch.public.shoe +\des nonesuch.server +\des regression.server +\des nonesuch.server +\des regression.server +\des nonesuch.username +\des regression.username +\dew nonesuch.fdw +\dew regression.fdw +\df host.regression.public.namelen +\df regres[qrstuv]ion.public.namelen +\df nonesuch.public.namelen +\dF host.regression.pg_catalog.arabic +\dF regres{1,2}ion.pg_catalog.arabic +\dF nonesuch.pg_catalog.arabic +\dFd host.regression.pg_catalog.arabic_stem +\dFd regres?ion.pg_catalog.arabic_stem +\dFd nonesuch.pg_catalog.arabic_stem +\dFp host.regression.pg_catalog.default +\dFp ^regression.pg_catalog.default +\dFp nonesuch.pg_catalog.default +\dFt host.regression.pg_catalog.ispell +\dFt regression$.pg_catalog.ispell +\dFt nonesuch.pg_catalog.ispell +\dg nonesuch.pg_database_owner +\dg regression.pg_database_owner +\dL host.regression.plpgsql +\dL *.plpgsql +\dL nonesuch.plpgsql +\dn host.regression.public +\dn """".public +\dn nonesuch.public +\do host.regression.public.!=- +\do "regression|mydb".public.!=- +\do nonesuch.public.!=- +\dO host.regression.pg_catalog.POSIX +\dO .pg_catalog.POSIX +\dO nonesuch.pg_catalog.POSIX +\dp host.regression.public.a_star +\dp "regres+ion".public.a_star +\dp nonesuch.public.a_star +\dP host.regression.public.mlparted +\dP "regres(sion)".public.mlparted +\dP nonesuch.public.mlparted +\drds nonesuch.lc_messages +\drds regression.lc_messages +\dRp public.mypub +\dRp regression.mypub +\dRs public.mysub +\dRs regression.mysub +\dT host.regression.public.widget +\dT "regression{1,2}".public.widget +\dT nonesuch.public.widget +\dx regression.plpgsql +\dx nonesuch.plpgsql +\dX host.regression.public.func_deps_stat +\dX "^regression$".public.func_deps_stat +\dX nonesuch.public.func_deps_stat +\dy regression.myevt +\dy nonesuch.myevt + +-- check that dots within quoted name segments are not counted +\dA "no.such.access.method" +\dt "no.such.table.relation" +\da "no.such.aggregate.function" +\dAc "no.such.operator.class" +\dAf "no.such.operator.family" +\dAo "no.such.operator.of.operator.family" +\dAp "no.such.operator.support.function.of.operator.family" +\db "no.such.tablespace" +\dc "no.such.conversion" +\dC "no.such.cast" +\dd "no.such.object.description" +\dD "no.such.domain" +\ddp "no.such.default.access.privilege" +\di "no.such.index.relation" +\dm "no.such.materialized.view" +\ds "no.such.relation" +\dt "no.such.relation" +\dv "no.such.relation" +\des "no.such.foreign.server" +\dew "no.such.foreign.data.wrapper" +\df "no.such.function" +\dF "no.such.text.search.configuration" +\dFd "no.such.text.search.dictionary" +\dFp "no.such.text.search.parser" +\dFt "no.such.text.search.template" +\dg "no.such.role" +\dL "no.such.language" +\dn "no.such.schema" +\do "no.such.operator" +\dO "no.such.collation" +\dp "no.such.access.privilege" +\dP "no.such.partitioned.relation" +\drds "no.such.setting" +\dRp "no.such.publication" +\dRs "no.such.subscription" +\dT "no.such.data.type" +\dx "no.such.installed.extension" +\dX "no.such.extended.statistics" +\dy "no.such.event.trigger" + +-- again, but with dotted schema qualifications. +\dA "no.such.schema"."no.such.access.method" +\dt "no.such.schema"."no.such.table.relation" +\da "no.such.schema"."no.such.aggregate.function" +\dAc "no.such.schema"."no.such.operator.class" +\dAf "no.such.schema"."no.such.operator.family" +\dAo "no.such.schema"."no.such.operator.of.operator.family" +\dAp "no.such.schema"."no.such.operator.support.function.of.operator.family" +\db "no.such.schema"."no.such.tablespace" +\dc "no.such.schema"."no.such.conversion" +\dC "no.such.schema"."no.such.cast" +\dd "no.such.schema"."no.such.object.description" +\dD "no.such.schema"."no.such.domain" +\ddp "no.such.schema"."no.such.default.access.privilege" +\di "no.such.schema"."no.such.index.relation" +\dm "no.such.schema"."no.such.materialized.view" +\ds "no.such.schema"."no.such.relation" +\dt "no.such.schema"."no.such.relation" +\dv "no.such.schema"."no.such.relation" +\des "no.such.schema"."no.such.foreign.server" +\dew "no.such.schema"."no.such.foreign.data.wrapper" +\df "no.such.schema"."no.such.function" +\dF "no.such.schema"."no.such.text.search.configuration" +\dFd "no.such.schema"."no.such.text.search.dictionary" +\dFp "no.such.schema"."no.such.text.search.parser" +\dFt "no.such.schema"."no.such.text.search.template" +\dg "no.such.schema"."no.such.role" +\dL "no.such.schema"."no.such.language" +\do "no.such.schema"."no.such.operator" +\dO "no.such.schema"."no.such.collation" +\dp "no.such.schema"."no.such.access.privilege" +\dP "no.such.schema"."no.such.partitioned.relation" +\drds "no.such.schema"."no.such.setting" +\dRp "no.such.schema"."no.such.publication" +\dRs "no.such.schema"."no.such.subscription" +\dT "no.such.schema"."no.such.data.type" +\dx "no.such.schema"."no.such.installed.extension" +\dX "no.such.schema"."no.such.extended.statistics" +\dy "no.such.schema"."no.such.event.trigger" + +-- again, but with current database and dotted schema qualifications. +\dt regression."no.such.schema"."no.such.table.relation" +\da regression."no.such.schema"."no.such.aggregate.function" +\dc regression."no.such.schema"."no.such.conversion" +\dC regression."no.such.schema"."no.such.cast" +\dd regression."no.such.schema"."no.such.object.description" +\dD regression."no.such.schema"."no.such.domain" +\di regression."no.such.schema"."no.such.index.relation" +\dm regression."no.such.schema"."no.such.materialized.view" +\ds regression."no.such.schema"."no.such.relation" +\dt regression."no.such.schema"."no.such.relation" +\dv regression."no.such.schema"."no.such.relation" +\df regression."no.such.schema"."no.such.function" +\dF regression."no.such.schema"."no.such.text.search.configuration" +\dFd regression."no.such.schema"."no.such.text.search.dictionary" +\dFp regression."no.such.schema"."no.such.text.search.parser" +\dFt regression."no.such.schema"."no.such.text.search.template" +\do regression."no.such.schema"."no.such.operator" +\dO regression."no.such.schema"."no.such.collation" +\dp regression."no.such.schema"."no.such.access.privilege" +\dP regression."no.such.schema"."no.such.partitioned.relation" +\dT regression."no.such.schema"."no.such.data.type" +\dX regression."no.such.schema"."no.such.extended.statistics" + +-- again, but with dotted database and dotted schema qualifications. +\dt "no.such.database"."no.such.schema"."no.such.table.relation" +\da "no.such.database"."no.such.schema"."no.such.aggregate.function" +\dc "no.such.database"."no.such.schema"."no.such.conversion" +\dC "no.such.database"."no.such.schema"."no.such.cast" +\dd "no.such.database"."no.such.schema"."no.such.object.description" +\dD "no.such.database"."no.such.schema"."no.such.domain" +\ddp "no.such.database"."no.such.schema"."no.such.default.access.privilege" +\di "no.such.database"."no.such.schema"."no.such.index.relation" +\dm "no.such.database"."no.such.schema"."no.such.materialized.view" +\ds "no.such.database"."no.such.schema"."no.such.relation" +\dt "no.such.database"."no.such.schema"."no.such.relation" +\dv "no.such.database"."no.such.schema"."no.such.relation" +\df "no.such.database"."no.such.schema"."no.such.function" +\dF "no.such.database"."no.such.schema"."no.such.text.search.configuration" +\dFd "no.such.database"."no.such.schema"."no.such.text.search.dictionary" +\dFp "no.such.database"."no.such.schema"."no.such.text.search.parser" +\dFt "no.such.database"."no.such.schema"."no.such.text.search.template" +\do "no.such.database"."no.such.schema"."no.such.operator" +\dO "no.such.database"."no.such.schema"."no.such.collation" +\dp "no.such.database"."no.such.schema"."no.such.access.privilege" +\dP "no.such.database"."no.such.schema"."no.such.partitioned.relation" +\dT "no.such.database"."no.such.schema"."no.such.data.type" +\dX "no.such.database"."no.such.schema"."no.such.extended.statistics" diff --git a/src/test/singlenode_regress/sql/psql_crosstab.sql b/src/test/singlenode_regress/sql/psql_crosstab.sql new file mode 100644 index 00000000000..bea0303ee89 --- /dev/null +++ b/src/test/singlenode_regress/sql/psql_crosstab.sql @@ -0,0 +1,137 @@ +-- +-- \crosstabview +-- + +-- ORCA plans produce slightly different plans, with different row order. +-- The row order differences are not masked out by gpdiff in the cross-tab +-- views. The point of this test is to test psql functionality, the queries +-- are not that interesting in the server side, so disable ORCA to make the +-- output consistent. +set optimizer=off; + +CREATE TABLE ctv_data (v, h, c, i, d) AS +VALUES + ('v1','h2','foo', 3, '2015-04-01'::date), + ('v2','h1','bar', 3, '2015-01-02'), + ('v1','h0','baz', NULL, '2015-07-12'), + ('v0','h4','qux', 4, '2015-07-15'), + ('v0','h4','dbl', -3, '2014-12-15'), + ('v0',NULL,'qux', 5, '2014-07-15'), + ('v1','h2','quux',7, '2015-04-04'); + +-- make plans more stable +ANALYZE ctv_data; + +-- running \crosstabview after query uses query in buffer +SELECT v, EXTRACT(year FROM d), count(*) + FROM ctv_data + GROUP BY 1, 2 + ORDER BY 1, 2; +-- basic usage with 3 columns + \crosstabview + +-- ordered months in horizontal header, quoted column name +SELECT v, to_char(d, 'Mon') AS "month name", EXTRACT(month FROM d) AS num, + count(*) FROM ctv_data GROUP BY 1,2,3 ORDER BY 1 + \crosstabview v "month name" 4 num + +-- ordered months in vertical header, ordered years in horizontal header +SELECT EXTRACT(year FROM d) AS year, to_char(d,'Mon') AS """month"" name", + EXTRACT(month FROM d) AS month, + format('sum=%s avg=%s', sum(i), avg(i)::numeric(2,1)) + FROM ctv_data + GROUP BY EXTRACT(year FROM d), to_char(d,'Mon'), EXTRACT(month FROM d) +ORDER BY month +\crosstabview """month"" name" year format year + +-- combine contents vertically into the same cell (V/H duplicates) +SELECT v, h, string_agg(c, E'\n') FROM ctv_data GROUP BY v, h ORDER BY 1,2,3 + \crosstabview 1 2 3 + +-- horizontal ASC order from window function +SELECT v,h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h) AS r +FROM ctv_data GROUP BY v, h ORDER BY 1,3,2 + \crosstabview v h c r + +-- horizontal DESC order from window function +SELECT v, h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h DESC) AS r +FROM ctv_data GROUP BY v, h ORDER BY 1,3,2 + \crosstabview v h c r + +-- horizontal ASC order from window function, NULLs pushed rightmost +SELECT v,h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h NULLS LAST) AS r +FROM ctv_data GROUP BY v, h ORDER BY 1,3,2 + \crosstabview v h c r + +-- only null, no column name, 2 columns: error +SELECT null,null \crosstabview + +-- only null, no column name, 3 columns: works +SELECT null,null,null \crosstabview + +-- Make the test results closer to upstream. +-- If we use groupagg the order of agg result will be different. +set enable_groupagg to 0; +-- null display +\pset null '#null#' +SELECT v,h, string_agg(i::text, E'\n') AS i FROM ctv_data +GROUP BY v, h ORDER BY h,v + \crosstabview v h i +\pset null '' + +-- refer to columns by position +SELECT v,h,string_agg(i::text, E'\n'), string_agg(c, E'\n') +FROM ctv_data GROUP BY v, h ORDER BY h,v + \crosstabview 2 1 4 + +-- refer to columns by positions and names mixed +SELECT v,h, string_agg(i::text, E'\n') AS i, string_agg(c, E'\n') AS c +FROM ctv_data GROUP BY v, h ORDER BY h,v + \crosstabview 1 "h" 4 + +-- reset the flag. +reset enable_groupagg; + +-- refer to columns by quoted names, check downcasing of unquoted name +SELECT 1 as "22", 2 as b, 3 as "Foo" + \crosstabview "22" B "Foo" + +-- error: bad column name +SELECT v,h,c,i FROM ctv_data + \crosstabview v h j + +-- error: need to quote name +SELECT 1 as "22", 2 as b, 3 as "Foo" + \crosstabview 1 2 Foo + +-- error: need to not quote name +SELECT 1 as "22", 2 as b, 3 as "Foo" + \crosstabview 1 "B" "Foo" + +-- error: bad column number +SELECT v,h,i,c FROM ctv_data + \crosstabview 2 1 5 + +-- error: same H and V columns +SELECT v,h,i,c FROM ctv_data + \crosstabview 2 h 4 + +-- error: too many columns +SELECT a,a,1 FROM generate_series(1,3000) AS a + \crosstabview + +-- error: only one column +SELECT 1 \crosstabview + +DROP TABLE ctv_data; + +-- check error reporting (bug #14476) +CREATE TABLE ctv_data (x int, y int, v text); + +INSERT INTO ctv_data SELECT 1, x, '*' || x FROM generate_series(1,10) x; +SELECT * FROM ctv_data \crosstabview + +INSERT INTO ctv_data VALUES (1, 10, '*'); -- duplicate data to cause error +SELECT * FROM ctv_data \crosstabview + +DROP TABLE ctv_data; diff --git a/src/test/singlenode_regress/sql/publication.sql b/src/test/singlenode_regress/sql/publication.sql new file mode 100644 index 00000000000..4b7738395ec --- /dev/null +++ b/src/test/singlenode_regress/sql/publication.sql @@ -0,0 +1,218 @@ +-- +-- PUBLICATION +-- +CREATE ROLE regress_publication_user LOGIN SUPERUSER; +CREATE ROLE regress_publication_user2; +CREATE ROLE regress_publication_user_dummy LOGIN NOSUPERUSER; +SET SESSION AUTHORIZATION 'regress_publication_user'; + +-- suppress warning that depends on wal_level +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_default; +RESET client_min_messages; + +COMMENT ON PUBLICATION testpub_default IS 'test publication'; +SELECT obj_description(p.oid, 'pg_publication') FROM pg_publication p; + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpib_ins_trunct WITH (publish = insert); +RESET client_min_messages; + +ALTER PUBLICATION testpub_default SET (publish = update); + +-- error cases +CREATE PUBLICATION testpub_xxx WITH (foo); +CREATE PUBLICATION testpub_xxx WITH (publish = 'cluster, vacuum'); +CREATE PUBLICATION testpub_xxx WITH (publish_via_partition_root = 'true', publish_via_partition_root = '0'); + +\dRp + +ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete'); + +\dRp + +--- adding tables +CREATE SCHEMA pub_test; +CREATE TABLE testpub_tbl1 (id serial primary key, data text); +CREATE TABLE pub_test.testpub_nopk (foo int, bar int); +CREATE VIEW testpub_view AS SELECT 1; +CREATE TABLE testpub_parted (a int) PARTITION BY LIST (a); + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_foralltables FOR ALL TABLES WITH (publish = 'insert'); +RESET client_min_messages; +ALTER PUBLICATION testpub_foralltables SET (publish = 'insert, update'); + +CREATE TABLE testpub_tbl2 (id serial primary key, data text); +-- fail - can't add to for all tables publication +ALTER PUBLICATION testpub_foralltables ADD TABLE testpub_tbl2; +-- fail - can't drop from all tables publication +ALTER PUBLICATION testpub_foralltables DROP TABLE testpub_tbl2; +-- fail - can't add to for all tables publication +ALTER PUBLICATION testpub_foralltables SET TABLE pub_test.testpub_nopk; + +SELECT pubname, puballtables FROM pg_publication WHERE pubname = 'testpub_foralltables'; +\d+ testpub_tbl2 +\dRp+ testpub_foralltables + +DROP TABLE testpub_tbl2; +DROP PUBLICATION testpub_foralltables; + +CREATE TABLE testpub_tbl3 (a int); +CREATE TABLE testpub_tbl3a (b text) INHERITS (testpub_tbl3); +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub3 FOR TABLE testpub_tbl3; +CREATE PUBLICATION testpub4 FOR TABLE ONLY testpub_tbl3; +RESET client_min_messages; +\dRp+ testpub3 +\dRp+ testpub4 + +DROP TABLE testpub_tbl3, testpub_tbl3a; +DROP PUBLICATION testpub3, testpub4; + +-- Tests for partitioned tables +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forparted; +CREATE PUBLICATION testpub_forparted1; +RESET client_min_messages; +CREATE TABLE testpub_parted1 (LIKE testpub_parted); +CREATE TABLE testpub_parted2 (LIKE testpub_parted); +ALTER PUBLICATION testpub_forparted1 SET (publish='insert'); +ALTER TABLE testpub_parted ATTACH PARTITION testpub_parted1 FOR VALUES IN (1); +ALTER TABLE testpub_parted ATTACH PARTITION testpub_parted2 FOR VALUES IN (2); +-- works despite missing REPLICA IDENTITY, because updates are not replicated +UPDATE testpub_parted1 SET a = 1; +-- only parent is listed as being in publication, not the partition +ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted; +\dRp+ testpub_forparted +-- should now fail, because parent's publication replicates updates +UPDATE testpub_parted1 SET a = 1; +ALTER TABLE testpub_parted DETACH PARTITION testpub_parted1; +-- works again, because parent's publication is no longer considered +UPDATE testpub_parted1 SET a = 1; +ALTER PUBLICATION testpub_forparted SET (publish_via_partition_root = true); +\dRp+ testpub_forparted +-- still fail, because parent's publication replicates updates +UPDATE testpub_parted2 SET a = 2; +ALTER PUBLICATION testpub_forparted DROP TABLE testpub_parted; +-- works again, because update is no longer replicated +UPDATE testpub_parted2 SET a = 2; +-- publication includes both the parent table and the child table +ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted, testpub_parted2; +-- only parent is listed as being in publication, not the partition +SELECT * FROM pg_publication_tables; +DROP TABLE testpub_parted1, testpub_parted2; +DROP PUBLICATION testpub_forparted, testpub_forparted1; + +-- Test cache invalidation FOR ALL TABLES publication +SET client_min_messages = 'ERROR'; +CREATE TABLE testpub_tbl4(a int); +INSERT INTO testpub_tbl4 values(1); +UPDATE testpub_tbl4 set a = 2; +CREATE PUBLICATION testpub_foralltables FOR ALL TABLES; +RESET client_min_messages; +-- fail missing REPLICA IDENTITY +UPDATE testpub_tbl4 set a = 3; +DROP PUBLICATION testpub_foralltables; +-- should pass after dropping the publication +UPDATE testpub_tbl4 set a = 3; +DROP TABLE testpub_tbl4; + +-- fail - view +CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_view; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1, pub_test.testpub_nopk; +RESET client_min_messages; +-- fail - already added +ALTER PUBLICATION testpub_fortbl ADD TABLE testpub_tbl1; +-- fail - already added +CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1; + +\dRp+ testpub_fortbl + +-- fail - view +ALTER PUBLICATION testpub_default ADD TABLE testpub_view; + +ALTER PUBLICATION testpub_default ADD TABLE testpub_tbl1; +ALTER PUBLICATION testpub_default SET TABLE testpub_tbl1; +ALTER PUBLICATION testpub_default ADD TABLE pub_test.testpub_nopk; + +ALTER PUBLICATION testpib_ins_trunct ADD TABLE pub_test.testpub_nopk, testpub_tbl1; + +\d+ pub_test.testpub_nopk +\d+ testpub_tbl1 +\dRp+ testpub_default + +ALTER PUBLICATION testpub_default DROP TABLE testpub_tbl1, pub_test.testpub_nopk; +-- fail - nonexistent +ALTER PUBLICATION testpub_default DROP TABLE pub_test.testpub_nopk; + +\d+ testpub_tbl1 + +-- verify relation cache invalidation when a primary key is added using +-- an existing index +CREATE TABLE pub_test.testpub_addpk (id int not null, data int); +ALTER PUBLICATION testpub_default ADD TABLE pub_test.testpub_addpk; +INSERT INTO pub_test.testpub_addpk VALUES(1, 11); +CREATE UNIQUE INDEX testpub_addpk_id_idx ON pub_test.testpub_addpk(id); +-- fail: +UPDATE pub_test.testpub_addpk SET id = 2; +ALTER TABLE pub_test.testpub_addpk ADD PRIMARY KEY USING INDEX testpub_addpk_id_idx; +-- now it should work: +UPDATE pub_test.testpub_addpk SET id = 2; +DROP TABLE pub_test.testpub_addpk; + +-- permissions +SET ROLE regress_publication_user2; +CREATE PUBLICATION testpub2; -- fail + +SET ROLE regress_publication_user; +GRANT CREATE ON DATABASE regression TO regress_publication_user2; +SET ROLE regress_publication_user2; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub2; -- ok +RESET client_min_messages; + +ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- fail + +SET ROLE regress_publication_user; +GRANT regress_publication_user TO regress_publication_user2; +SET ROLE regress_publication_user2; +ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- ok + +DROP PUBLICATION testpub2; + +SET ROLE regress_publication_user; +REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; + +DROP TABLE testpub_parted; +DROP VIEW testpub_view; +DROP TABLE testpub_tbl1; + +\dRp+ testpub_default + +-- fail - must be owner of publication +SET ROLE regress_publication_user_dummy; +ALTER PUBLICATION testpub_default RENAME TO testpub_dummy; +RESET ROLE; + +ALTER PUBLICATION testpub_default RENAME TO testpub_foo; + +\dRp testpub_foo + +-- rename back to keep the rest simple +ALTER PUBLICATION testpub_foo RENAME TO testpub_default; + +ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2; + +\dRp testpub_default + +DROP PUBLICATION testpub_default; +DROP PUBLICATION testpib_ins_trunct; +DROP PUBLICATION testpub_fortbl; + +DROP SCHEMA pub_test CASCADE; + +RESET SESSION AUTHORIZATION; +DROP ROLE regress_publication_user, regress_publication_user2; +DROP ROLE regress_publication_user_dummy; diff --git a/src/test/singlenode_regress/sql/qp_left_anti_semi_join.sql b/src/test/singlenode_regress/sql/qp_left_anti_semi_join.sql new file mode 100644 index 00000000000..a0d7f2d7510 --- /dev/null +++ b/src/test/singlenode_regress/sql/qp_left_anti_semi_join.sql @@ -0,0 +1,124 @@ +-- Tests for Left Anti Semi Joins +create schema lasj; +set search_path='lasj'; + +create table foo (a int, b int); +create table bar (x int, y int); + +insert into foo values (1, 2); +insert into foo values (12, 20); +insert into foo values (NULL, 2); +insert into foo values (15, 2); +insert into foo values (NULL, NULL); +insert into foo values (1, 12); +insert into foo values (1, 102); + +insert into bar select i/10, i from generate_series(1, 100)i; +insert into bar values (NULL, 101); +insert into bar values (NULL, 102); +insert into bar values (NULL, NULL); + + +-- We will run the same queries with hash joins enabled, and disabled. First, +-- disabled. +set enable_hashjoin=off; +set optimizer_enable_hashjoin = off; +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND a = ALL (SELECT x FROM bar WHERE y <= 100); + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE b = 2 AND a = ALL (SELECT x FROM bar WHERE y >=10 AND y < 20); + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE b = 2 AND a = ALL (SELECT x FROM bar WHERE y = -1) order by 1, 2; + +-- outer with nulls, inner with nulls +SELECT * FROM foo WHERE a = ALL (SELECT x FROM bar WHERE x = 1 OR x IS NULL); + +-- empty outer, non-empty inner +SELECT * FROM (SELECT * FROM foo WHERE b = -1) foo2 FULL OUTER JOIN bar ON (a = x); + +-- non-empty outer, empty inner +SELECT * FROM foo FULL OUTER JOIN (SELECT * FROM bar WHERE y = -1) bar2 ON (a = x); + +-- non-empty outer, non-empty inner +SELECT * FROM (SELECT * FROM foo WHERE b = 2) foo2 FULL OUTER JOIN (SELECT * FROM bar WHERE y BETWEEN 16 AND 22 OR x IS NULL) bar2 ON (a = x); + +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND (a, b) NOT IN (SELECT x, y FROM bar WHERE y <= 100); + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y <= 100); + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y = -1); + +-- outer with nulls, inner with partial nulls +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y IS NOT NULL); + +-- outer with nulls, inner with null tuples +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar); + +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND a NOT IN (SELECT x FROM bar WHERE y <= 100); + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE b = 2 AND a NOT IN (SELECT x FROM bar WHERE y <= 100); + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE b = 2 AND a NOT IN (SELECT x FROM bar WHERE y = -1) order by 1, 2; + +-- outer with nulls, inner with nulls +SELECT * FROM foo WHERE a NOT IN (SELECT x FROM bar); + + +-- Now run the same tests again, with hashjoins enabled. +set enable_hashjoin=on; +set optimizer_enable_hashjoin = on; +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND a = ALL (SELECT x FROM bar WHERE y <= 100); + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE b = 2 AND a = ALL (SELECT x FROM bar WHERE y >=10 AND y < 20); + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE b = 2 AND a = ALL (SELECT x FROM bar WHERE y = -1) order by 1, 2; + +-- outer with nulls, inner with nulls +SELECT * FROM foo WHERE a = ALL (SELECT x FROM bar WHERE x = 1 OR x IS NULL); + +-- empty outer, non-empty inner +SELECT * FROM (SELECT * FROM foo WHERE b = -1) foo2 FULL OUTER JOIN bar ON (a = x); + +-- non-empty outer, empty inner +SELECT * FROM foo FULL OUTER JOIN (SELECT * FROM bar WHERE y = -1) bar2 ON (a = x); + +-- non-empty outer, non-empty inner +SELECT * FROM (SELECT * FROM foo WHERE b = 2) foo2 FULL OUTER JOIN (SELECT * FROM bar WHERE y BETWEEN 16 AND 22 OR x IS NULL) bar2 ON (a = x); + +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND (a, b) NOT IN (SELECT x, y FROM bar WHERE y <= 100); + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y <= 100); + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y = -1); + +-- outer with nulls, inner with partial nulls +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar WHERE y IS NOT NULL); + +-- outer with nulls, inner with null tuples +SELECT * FROM foo WHERE (a, b) NOT IN (SELECT x, y FROM bar); + +-- empty outer, non-empty inner +SELECT * FROM foo WHERE b = -1 AND a NOT IN (SELECT x FROM bar WHERE y <= 100); + +-- outer with nulls, non-empty inner +SELECT * FROM foo WHERE b = 2 AND a NOT IN (SELECT x FROM bar WHERE y <= 100); + +-- outer with nulls, empty inner +SELECT * FROM foo WHERE b = 2 AND a NOT IN (SELECT x FROM bar WHERE y = -1) order by 1, 2; + +-- outer with nulls, inner with nulls +SELECT * FROM foo WHERE a NOT IN (SELECT x FROM bar); diff --git a/src/test/singlenode_regress/sql/qp_query_execution.sql b/src/test/singlenode_regress/sql/qp_query_execution.sql new file mode 100644 index 00000000000..74f544dddb1 --- /dev/null +++ b/src/test/singlenode_regress/sql/qp_query_execution.sql @@ -0,0 +1,565 @@ +-- start_ignore +drop schema qp_query_execution cascade; +create schema qp_query_execution; +set search_path to qp_query_execution; + +-- count number of certain operators in a given plan +create language plpython3u; +create or replace function qx_count_operator(query text, planner_operator text, optimizer_operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN '+ query) +plan = '\n'.join([row['QUERY PLAN'] for row in rv]) +optimizer = plan.find('Pivotal Optimizer (GPORCA)') + +if optimizer >= 0: + return plan.count(optimizer_operator) +else: + return plan.count(planner_operator) +$$ +language plpython3u; + +drop table if exists tmp1; +-- end_ignore +CREATE TABLE bugtest +( + a1 integer, + a2 integer, + a3 integer, + a4 character(1), + a5 text, + a6 text, + a7 character(1), + a8 integer, + a9 integer, + a10 integer, + a11 integer, + a12 integer, + a13 double precision, + a14 double precision, + a15 double precision, + a16 double precision, + a17 double precision, + a18 double precision, + a19 double precision, + a20 double precision, + a21 double precision, + a22 double precision, + a23 double precision, + a24 double precision, + a25 integer, + a26 integer, + a27 integer, + a28 text, + a29 integer, + a30 integer, + a31 integer, + a32 integer, + a33 text, + a34 integer, + a35 integer, + a36 character(1), + a37 double precision, + a38 integer, + a39 integer, + a40 integer, + a41 integer, + a42 integer, + a43 integer, + a44 integer, + a45 integer, + a46 integer, + a47 integer, + a48 integer, + a49 integer, + a50 integer, + a51 integer, + a52 integer, + a53 double precision, + a54 double precision, + a55 double precision, + a56 double precision +) +; + +insert into bugtest +select a.* +from + ( + select +1,1,1,'a','a','a','a',11111,1111,11,16,6,0,0.125,0,0.25,0.875,0.125,0,0,0.9375,0.0625,125.9375,20.30810708273,0,1,0,'asdf',0,0,89,1,'aaa',0,0,'',33.5,69,38,5,6,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,NULL::int,2.29411764705882,5.57142857142857,33.5,0 + ) a, + generate_series(1,100000) b; + +set statement_mem="10MB"; +create temporary table tmp1 as SELECT * FROM bugtest order by a2 limit 300000; +drop table tmp1; +create temporary table tmp1 as SELECT * FROM bugtest order by a2 limit 90000; +drop table tmp1; +create temporary table tmp1 as SELECT * FROM bugtest order by a2 limit 20000; +drop table tmp1; +create temporary table tmp1 as SELECT * FROM bugtest order by a1 limit 100000; + +-- End of mpp16458 + +drop table if exists lossmithe_colstor; +create table lossmithe_colstor + (loannumber character varying(40), + var1 smallint, + var2 smallint, + partvar smallint, + isinterestonly bool, + upb smallint + ) + with (appendonly=true, orientation=column) + partition by range(partvar) (start (0) end (100) every (10)); + +drop table if exists address_he_unique; +create table address_he_unique ( + var1 integer, + loannumber character varying(40), + var2 integer, + rand_no smallint) + ; + +insert into lossmithe_colstor + select i::text, i, i, i % 100, true, i % 23 from generate_series(0,99) i; + +insert into address_he_unique + select i, i::text, i, i % 7 from generate_series(0,999999) i; + +SELECT SUM(upb), isinterestonly + FROM lossmithe_colstor b + LEFT JOIN address_he_unique a ON a.loannumber::text=b.loannumber::text + WHERE rand_no < 500 + GROUP BY isinterestonly; + +-- End of mpp16598 + +-- Redistribute on top of Append with flow node +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore + +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); + +create table bar( a int, b int, k int, t text, p int); + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; + +analyze bar; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.k, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Right Join', 'Hash Right Join'); +select foo_p.k, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + +-- Use all distribution keys in the select list +select foo_p.a,foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2, 3 desc limit 10; + +-- Non-equality predicates on one of the distribution keys +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a >= 6 order by 1, 2 desc limit 10; + +-- Equality predicates on non-distribution keys +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + +-- All distribution keys in the predicates +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6 and foo_p.b = 6 order by 1, 2 desc limit 10; +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6 or foo_p.b = 7 order by 1, 2 desc limit 10; + + +-- Broadcast on top of Append with flow node +-- Forge stats to force a broadcast instead of append +-- Make bar appear too big so that the planner chooses to do a flow on foo_p +-- Make foo_p appear too small so that the planner chooses to do a broadcast +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +set allow_system_table_mods=true; +update pg_class set reltuples = 100000000, relpages = 10000000 where relname = 'bar' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); +update pg_class set reltuples = 1, relpages = 1 where relname = 'foo_p_1_prt_other' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); +update pg_class set reltuples = 1, relpages = 1 where relname = 'foo_p_1_prt_2' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); + +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.a where foo_p.p =3 and foo_p.a = 6 order by 1, 2 desc limit 10; + + +-- Varchar in the select list with redistribute on top of an append with flow node +-- start_ignore +drop table if exists abbp; +drop table if exists b; +-- end_ignore +create table abbp ( a character varying(60), b character varying(60), k character varying(60), t int, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b ( a character varying(60), b character varying(60), k character varying(60), t int, p int) ; + +insert into abbp select i || 'SOME NUMBER', i || 'SN', i || 'SN SN', i, i%10 from generate_series(1, 1000)i; + +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN', i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 100)i; +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; + +analyze abbp; +analyze b; + +select qx_count_operator('select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6;', 'Hash Right Join', 'Hash Right Join'); +select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = E''6SOME NUMBER''', 'Hash Right Join', 'Hash Right Join'); +select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = '6SOME NUMBER' order by 1, 2 desc limit 10; + +-- Varchar in the select list with a broadcast on top of an append with flow node +-- Forge stats to force a broadcast instead of append +-- Make b appear too big so that the planner chooses to do a flow on abbp +-- Make abbp appear too small so that the planner chooses to do a broadcast +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into foo_p select 6, i % 10, i , 1 || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +set allow_system_table_mods=true; +update pg_class set reltuples = 100000000, relpages = 10000000 where relname = 'b' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); +update pg_class set reltuples = 1, relpages = 1 where relname like 'abbp%' and relnamespace = (select oid from pg_namespace where nspname = 'qp_query_execution'); + +select abbp.b, abbp.t from abbp join (select abbp.* from b, abbp where abbp.a = b.k and abbp.a = '6SOME NUMBER') FOO on abbp.a = FOO.a where abbp.t is not null order by 1, 2 desc limit 10; + +select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = '6SOME NUMBER' order by 1, 2 desc limit 10; + + +-- Queries without motion node on the partitioned table +-- start_ignore +drop table if exists abbp; +drop table if exists b; +-- end_ignore + +create table abbp( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b (a int, b int, k int, t text, p int); + +insert into abbp select i, i, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 1000) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 1000) i; + +analyze abbp; +analyze b; + +select qx_count_operator('select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6;', 'Hash Right Join', 'Hash Left Join'); +select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = 6;', 'Hash Right Join', 'Hash Left Join'); +select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = 6 order by 1, 2 asc limit 10; + +-- Partitioned tables with decimal type distribution keys +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore + +create table foo_p ( a decimal(10,2) , b int, k decimal(10,2), t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar ( a decimal(10, 2), b int, k decimal(10,2), t text, p int) ; + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; +analyze bar; + +select qx_count_operator('select foo_p.k, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Right Join', 'Hash Right Join'); +select foo_p.k, foo_p.t from foo_p left outer join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6.00;', 'Hash Right Join', 'Hash Right Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6.00 order by 1, 2 desc limit 10; + +-- Partitioned tables with character type distribution keys used in predicates +-- start_ignore +drop table if exists abbp; +drop table if exists b; +-- end_ignore + +create table abbp ( a character varying(60), b int, k character varying(60), t int, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b ( a character varying(60), b int, k character varying(60), t int, p int) ; + +insert into abbp select i || 'SOME NUMBER', i, i || 'SN SN', i, i%10 from generate_series(1, 1000)i; + +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 100)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; + +analyze abbp; +analyze b; + +select qx_count_operator('select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6;', 'Hash Right Join', 'Hash Right Join'); +select abbp.k, abbp.t from abbp left outer join b on abbp.k = b.k where abbp.t is not null and abbp.p = 6 order by 1, 2 asc limit 10; + +select qx_count_operator('select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = E''6SOME NUMBER''', 'Hash Right Join', 'Hash Right Join'); +select abbp.b, abbp.t from abbp left outer join b on abbp.a = b.k where abbp.t is not null and abbp.a = '6SOME NUMBER' order by 1, 2 asc limit 10; + +-- Partitioned tables on both sides of a join +-- start_ignore +drop table if exists foo_p; +drop table if exists bar_p; +-- end_ignore + +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; +analyze bar_p; + +select qx_count_operator('select foo_p.k, foo_p.t from foo_p left outer join bar_p on foo_p.k = bar_p.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Right Join', 'Hash Right Join'); +select foo_p.k, foo_p.t from foo_p left outer join bar_p on foo_p.k = bar_p.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2 asc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 14;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 14 order by 1, 2 desc limit 10; + +select qx_count_operator('select bar_p.a, foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); +select bar_p.a, foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2, 3 asc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4 order by 1, 2 asc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.b where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4;', 'Hash Join', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.b where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4 order by 1, 2 asc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.b = bar_p.b where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.k and foo_p.b = bar_p.b where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6;', 'Hash Right Join', 'Hash Right Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6 order by 1, 2 asc limit 10; + +-- Queries where equality predicate is not an immediate constant +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore + +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar( a int, b int, k int, t text, p int); + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; +analyze bar; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1];', 'Hash Right Join', 'Hash Right Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1] order by 1, 2 desc limit 10; + +create function mytest(integer) returns integer as 'select $1/100' language sql; +select qx_count_operator('select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = mytest(100);', 'Hash Right Join', 'Hash Right Join'); +select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = mytest(100) order by 1, 2 asc limit 10; + +drop function if exists mytest(integer); +-- Repeat test cases with inner join instead of inner join: C87849 (Queries with inner join) + +-- Redistribute on top of Append with flow node +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore + +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); + +create table bar( a int, b int, k int, t text, p int); + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; + +analyze bar; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.k, foo_p.t from foo_p inner join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Join', 'Hash Join'); +select foo_p.k, foo_p.t from foo_p inner join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + +-- Varchar in the select list with redistribute on top of an append with flow node +-- start_ignore +drop table if exists a_p; +drop table if exists bar; +-- end_ignore +create table a_p ( a character varying(60), b character varying(60), k character varying(60), t int, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b ( a character varying(60), b character varying(60), k character varying(60), t int, p int) ; + +insert into a_p select i || 'SOME NUMBER', i || 'SN', i || 'SN SN', i, i%10 from generate_series(1, 1000)i; + +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN', i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 100)i; +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6 || 'SN' , i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; + +analyze a_p; +analyze b; + +select qx_count_operator('select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6;', 'Hash Join', 'Hash Join'); +select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = E''6SOME NUMBER''', 'Nested Loop', 'Hash Join'); +select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = '6SOME NUMBER' order by 1, 2 desc limit 10; + +-- Queries without motion node on the partitioned table +-- start_ignore +drop table if exists a_p; +drop table if exists b; +-- end_ignore + +create table a_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b (a int, b int, k int, t text, p int); + +insert into a_p select i, i, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 1000) i; +insert into b select i%7, i%10, i , i || 'SOME NUMBER', i % 4 from generate_series(1, 1000) i; + +analyze a_p; +analyze b; + +select qx_count_operator('select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6;', 'Hash Join', 'Hash Join'); +select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = 6;', 'Nested Loop', 'Hash Join'); +select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = 6 order by 1, 2 desc limit 10; + +-- Partitioned tables with decimal type distribution keys +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore + +create table foo_p ( a decimal(10,2) , b int, k decimal(10,2), t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar ( a decimal(10, 2), b int, k decimal(10,2), t text, p int) ; + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; +analyze bar; + +select qx_count_operator('select foo_p.k, foo_p.t from foo_p inner join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Join', 'Hash Join'); +select foo_p.k, foo_p.t from foo_p inner join bar on foo_p.k = bar.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6.00;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = 6.00 order by 1, 2 desc limit 10; + +-- Partitioned tables with character type distribution keys used in predicates +-- start_ignore +drop table if exists a_p; +drop table if exists b; +-- end_ignore + +create table a_p ( a character varying(60), b int, k character varying(60), t int, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table b ( a character varying(60), b int, k character varying(60), t int, p int) ; + +insert into a_p select i || 'SOME NUMBER', i, i || 'SN SN', i, i%10 from generate_series(1, 1000)i; + +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 100)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; +insert into b select i % 7 || 'SOME NUMBER', i%6, i % 9 || 'SOME NUMBER', i % 9, i % 4 from generate_series(1, 1000)i; + +analyze a_p; +analyze b; + +select qx_count_operator('select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6;', 'Hash Join', 'Hash Join'); +select a_p.k, a_p.t from a_p inner join b on a_p.k = b.k where a_p.t is not null and a_p.p = 6 order by 1, 2 asc limit 10; + +select qx_count_operator('select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = E''6SOME NUMBER''', 'Nested Loop', 'Hash Join'); +select a_p.b, a_p.t from a_p inner join b on a_p.a = b.k where a_p.t is not null and a_p.a = '6SOME NUMBER' order by 1, 2 asc limit 10; + +-- Partitioned tables on both sides of a join +-- start_ignore +drop table if exists foo_p; +drop table if exists bar_p; +-- end_ignore + +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; + +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar_p select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; +analyze bar_p; + +select qx_count_operator('select foo_p.k, foo_p.t from foo_p inner join bar_p on foo_p.k = bar_p.k where foo_p.t is not null and foo_p.p = 6;', 'Hash Join', 'Hash Join'); +select foo_p.k, foo_p.t from foo_p inner join bar_p on foo_p.k = bar_p.k where foo_p.t is not null and foo_p.p = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 14;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 14 order by 1, 2 asc limit 10; + +select qx_count_operator('select bar_p.a, foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); +select bar_p.a, foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 order by 1, 2, 3 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.k where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4 order by 1, 2 asc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.b where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4;', 'Hash Join', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.k = bar_p.b where foo_p.t is not null and foo_p.a = 6 and bar_p.a = 4 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.b = bar_p.b where foo_p.t is not null and foo_p.a = 6;', 'Hash Join', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.k and foo_p.b = bar_p.b where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6 order by 1, 2 asc limit 10; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6;', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar_p on foo_p.a = bar_p.a where foo_p.t is not null and foo_p.a = 6 order by 1, 2 desc limit 10; + +-- Queries where equality predicate is not an immediate constant +-- start_ignore +drop table if exists foo_p; +drop table if exists bar; +-- end_ignore + +create table foo_p( a int, b int, k int, t text, p int) partition by range(p) ( start(0) end(10) every (2), default partition other); +create table bar( a int, b int, k int, t text, p int); + +insert into foo_p select i, i % 10, i , i || 'SOME NUMBER SOME NUMBER', i % 10 from generate_series(1, 1000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 100) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; +insert into bar select i % 7, i % 6, i % 9, i || 'SOME NUMBER', i % 4 from generate_series(1, 10000) i; + +analyze foo_p; +analyze bar; + +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1];', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1] order by 1, 2 asc limit 10; + +create function mytest(integer) returns integer as 'select $1/100' language sql; +select qx_count_operator('select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = mytest(100);', 'Nested Loop', 'Hash Join'); +select foo_p.b, foo_p.t from foo_p inner join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = mytest(100) order by 1, 2 desc limit 10; + +drop function if exists mytest(integer); diff --git a/src/test/singlenode_regress/sql/qp_union_intersect.sql b/src/test/singlenode_regress/sql/qp_union_intersect.sql new file mode 100644 index 00000000000..2ac7f59a641 --- /dev/null +++ b/src/test/singlenode_regress/sql/qp_union_intersect.sql @@ -0,0 +1,819 @@ +-- Create common test tables +-- +-- All the test statements use these same test tables. To avoid having to +-- re-create them for every test, all the actual tests are wrapped in +-- begin-rollback blocks (except a few that throw an ERROR, and will +-- therefore roll back implicitly anyway). The purpose of these tests is to +-- exercise planner, so it doesn't matter that the changes are rolled back +-- afterwards. + +-- start_matchsubs +-- m/DETAIL: Failing row contains \(.*\)/ +-- s/DETAIL: Failing row contains \(.*\)/DETAIL: Failing row contains (#####)/ +-- end_matchsubs +begin; +CREATE TABLE dml_union_r ( + a int CONSTRAINT r_check_a CHECK(a <> -1), + b int, + c text, + d numeric) +; + +CREATE TABLE dml_union_s ( + a int , + b int not NULL, + c text , + d numeric default 10.00) + +PARTITION BY range(d); + +CREATE TABLE dml_union_s_1_prt_2 PARTITION OF dml_union_s FOR VALUES FROM (1) TO (1001); +CREATE TABLE dml_union_s_1_prt_3 PARTITION OF dml_union_s FOR VALUES FROM (1001) TO (1101); +CREATE TABLE dml_union_s_1_prt_4 PARTITION OF dml_union_s FOR VALUES FROM (1101) TO (1201); +CREATE TABLE dml_union_s_1_prt_5 PARTITION OF dml_union_s FOR VALUES FROM (1201) TO (1301); +CREATE TABLE dml_union_s_1_prt_6 PARTITION OF dml_union_s FOR VALUES FROM (1301) TO (1401); +CREATE TABLE dml_union_s_1_prt_7 PARTITION OF dml_union_s FOR VALUES FROM (1401) TO (1501); +CREATE TABLE dml_union_s_1_prt_8 PARTITION OF dml_union_s FOR VALUES FROM (1501) TO (1601); +CREATE TABLE dml_union_s_1_prt_9 PARTITION OF dml_union_s FOR VALUES FROM (1601) TO (1701); +CREATE TABLE dml_union_s_1_prt_10 PARTITION OF dml_union_s FOR VALUES FROM (1701) TO (1801); +CREATE TABLE dml_union_s_1_prt_11 PARTITION OF dml_union_s FOR VALUES FROM (1801) TO (1901); +CREATE TABLE dml_union_s_1_prt_def PARTITION OF dml_union_s DEFAULT; + +INSERT INTO dml_union_r SELECT generate_series(1,100), generate_series(1,100) * 3,'r', generate_series(1,100) % 6; +INSERT INTO dml_union_r VALUES(NULL,NULL,'text',NULL),(NULL,NULL,'text',NULL),(NULL,NULL,'text',NULL),(NULL,NULL,'text',NULL),(NULL,NULL,'text',NULL); +INSERT INTO dml_union_r VALUES(1,1,'text',1),(2,2,'text',2),(3,3,'text',3),(4,4,'text',4),(5,5,'text',5); +INSERT INTO dml_union_r VALUES(1,1,'text',1),(2,2,'text',2),(3,3,'text',3),(4,4,'text',4),(5,5,'text',5); +INSERT INTO dml_union_r VALUES(1,2,'text',3),(2,3,'text',4),(3,4,'text',5),(4,5,'text',6),(5,6,'text',7); + +INSERT INTO dml_union_s SELECT generate_series(1,100), generate_series(1,100) * 3,'s', generate_series(1,100) ; +INSERT INTO dml_union_s VALUES(1,1,'text',1),(2,2,'text',2),(3,3,'text',3),(4,4,'text',4),(5,5,'text',5); +INSERT INTO dml_union_s VALUES(1,1,'text',1),(2,2,'text',2),(3,3,'text',3),(4,4,'text',4),(5,5,'text',5); +INSERT INTO dml_union_s VALUES(1,2,'text',3),(2,3,'text',4),(3,4,'text',5),(4,5,'text',6),(5,6,'text',7); +commit; + + +-- @description union_test1: INSERT and INTERSECT operation +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r INTERSECT SELECT dml_union_s.* FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r INTERSECT SELECT dml_union_s.* FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test2: INSERT and INTERSECT operation +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT dml_union_r.* FROM dml_union_r INTERSECT ALL SELECT dml_union_s.a, dml_union_s.b, dml_union_s.c, dml_union_s.d FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT dml_union_r.* FROM dml_union_r INTERSECT ALL SELECT dml_union_s.a, dml_union_s.b, dml_union_s.c, dml_union_s.d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test3: INTERSECT with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT generate_series(1,10) INTERSECT SELECT generate_series(1,100))foo; +INSERT INTO dml_union_r SELECT generate_series(1,10) INTERSECT SELECT generate_series(1,100); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test4: INTERSECT with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT generate_series(1,10) INTERSECT ALL SELECT generate_series(1,100))foo; +INSERT INTO dml_union_r SELECT generate_series(1,10) INTERSECT ALL SELECT generate_series(1,100); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test5: INTERSECT with constants +begin; +SELECT COUNT(*) FROM dml_union_s; +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b,'A' as c, 0 as d FROM dml_union_r INTERSECT SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s)foo; +INSERT INTO dml_union_s (SELECT dml_union_r.a, dml_union_r.b,'A' as c, 0 as d FROM dml_union_r INTERSECT SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_s; +rollback; + +-- @description union_test6: INTERSECT with constants +begin; +SELECT COUNT(*) FROM dml_union_s; +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b,'A' as c ,0 as d FROM dml_union_r INTERSECT ALL SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s)foo; +INSERT INTO dml_union_s (SELECT dml_union_r.a, dml_union_r.b,'A' as c ,0 as d FROM dml_union_r INTERSECT ALL SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_s; +rollback; + +-- @description union_test7: INTERSECT with DISTINCT +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r INTERSECT SELECT distinct a,b,c,d FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r INTERSECT SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test8: INTERSECT with DISTINCT +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r INTERSECT ALL SELECT distinct a,b,c,d FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r INTERSECT ALL SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test9: INSERT and EXCEPT operation +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r EXCEPT SELECT * FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r EXCEPT SELECT * FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test10: INSERT and EXCEPT operation +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT * FROM dml_union_r EXCEPT ALL SELECT dml_union_s.* FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT * FROM dml_union_r EXCEPT ALL SELECT dml_union_s.* FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test12: EXCEPT with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT generate_series(1,10) EXCEPT ALL SELECT generate_series(1,10))foo; +INSERT INTO dml_union_r SELECT generate_series(1,10) EXCEPT ALL SELECT generate_series(1,10); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test13: EXCEPT with predicate +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT * FROM (SELECT * FROM dml_union_r EXCEPT ALL SELECT * FROM dml_union_s) foo WHERE c='text')bar; +INSERT INTO dml_union_r SELECT * FROM (SELECT * FROM dml_union_r EXCEPT ALL SELECT * FROM dml_union_s) foo WHERE c='text'; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test14: EXCEPT with predicate (returns 0 rows) +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT * FROM (SELECT * FROM dml_union_r EXCEPT SELECT * FROM dml_union_s) foo WHERE c='s')bar; +INSERT INTO dml_union_r SELECT * FROM (SELECT * FROM dml_union_r EXCEPT SELECT * FROM dml_union_s) foo WHERE c='s'; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test15: EXCEPT with constants +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b,'A' as c ,0 as d FROM dml_union_r EXCEPT ALL SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s)foo; +INSERT INTO dml_union_r (SELECT dml_union_r.a, dml_union_r.b,'A' as c ,0 as d FROM dml_union_r EXCEPT ALL SELECT dml_union_s.a, dml_union_s.b,'A' as C,0 as d FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test16: EXCEPT with distinct +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r EXCEPT SELECT distinct a,b,c,d FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r EXCEPT SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test17: EXCEPT with distinct +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r EXCEPT ALL SELECT distinct a,b,c,d FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r EXCEPT ALL SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test18: INSERT and UNION operation +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r UNION SELECT dml_union_s.* FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT dml_union_r.a, dml_union_r.b, dml_union_r.c, dml_union_r.d FROM dml_union_r UNION SELECT dml_union_s.* FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test19: INSERT and UNION operation +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT dml_union_r.* FROM dml_union_r UNION All SELECT * FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT dml_union_r.* FROM dml_union_r UNION All SELECT * FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test20: UNION with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT generate_series(1,10) UNION SELECT generate_series(1,10))foo; +INSERT INTO dml_union_r SELECT generate_series(1,10) UNION SELECT generate_series(1,10); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test21: UNION with generate_series +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT generate_series(1,10) UNION ALL SELECT generate_series(1,10))foo; +INSERT INTO dml_union_r SELECT generate_series(1,10) UNION ALL SELECT generate_series(1,10); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test22: UNION with limit +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT * FROM dml_union_r UNION ALL SELECT * FROM dml_union_s ORDER BY 1,2,3,4) foo LIMIT 10; +SELECT COUNT(*) FROM dml_union_r; +INSERT INTO dml_union_r SELECT * FROM (SELECT * FROM dml_union_r UNION ALL SELECT * FROM dml_union_s ORDER BY 1,2,3,4) foo LIMIT 10; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test23: UNION with dml_union_sub-query in SELECT +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT NULL,(SELECT NULL f1 FROM dml_union_r UNION SELECT NULL f1 FROM dml_union_s)::int, 'nullval',NULL)foo; +INSERT INTO dml_union_r SELECT NULL,(SELECT NULL f1 FROM dml_union_r UNION SELECT NULL f1 FROM dml_union_s)::int, 'nullval',NULL; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test24: UNION with exists +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT AVG(a),10,'avg',10 FROM dml_union_r WHERE exists (SELECT a FROM dml_union_r UNION ALL SELECT b FROM dml_union_s))foo; +INSERT INTO dml_union_r SELECT AVG(a),10,'avg',10 FROM dml_union_r WHERE exists (SELECT a FROM dml_union_r UNION ALL SELECT b FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test25: UNION with DISTINCT +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT distinct a,b,c,d FROM dml_union_r UNION SELECT distinct a,b,c,d FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT distinct a,b,c,d FROM dml_union_r UNION SELECT distinct a,b,c,d FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test26: UNION with AGGREGATE +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT * FROM (SELECT AVG(a) as a FROM dml_union_r UNION SELECT AVG(b) as a FROM dml_union_s) foo)bar; +INSERT INTO dml_union_r SELECT * FROM (SELECT AVG(a) as a FROM dml_union_r UNION SELECT AVG(b) as a FROM dml_union_s) foo; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test27: Negative tests VIOLATES NULL VALUE CONSTRAINT +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM ( SELECT * FROM (SELECT * FROM dml_union_r EXCEPT SELECT * FROM dml_union_s ) foo WHERE c='text')bar; +INSERT INTO dml_union_s SELECT * FROM (SELECT * FROM dml_union_r EXCEPT SELECT * FROM dml_union_s) foo WHERE c='text'; +--SELECT COUNT(*) FROM dml_union_r; + +-- @description union_test28: Negative tests MORE THAN ONE ROW RETURNED +SELECT COUNT(*) FROM dml_union_r; +INSERT INTO dml_union_r SELECT (SELECT dml_union_r.d::int FROM dml_union_r INTERSECT SELECT dml_union_s.d FROM dml_union_s ORDER BY 1),1,'newval',1.000; +SELECT COUNT(*) FROM dml_union_r; + +-- @description union_test29: INSERT NON ATOMICS with union/intersect/except +begin; +SELECT COUNT(*) FROM dml_union_r; +-- GPDB_12_MERGE_FIXME: ORCA doesn't produce the right intersect plan +set optimizer=off; +SELECT COUNT(*) FROM (SELECT dml_union_r.* FROM dml_union_r INTERSECT (SELECT dml_union_r.* FROM dml_union_r UNION ALL SELECT dml_union_s.* FROM dml_union_s) EXCEPT SELECT dml_union_s.* FROM dml_union_s)foo; +INSERT INTO dml_union_r SELECT dml_union_r.* FROM dml_union_r INTERSECT (SELECT dml_union_r.* FROM dml_union_r UNION ALL SELECT dml_union_s.* FROM dml_union_s) EXCEPT SELECT dml_union_s.* FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +reset optimizer; +rollback; + +-- @description union_test30: INSERT NON ATOMICS with union/intersect/except +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT c,c+1,case when c = 1 then 'r' else 's' end,c+1 FROM ( SELECT COUNT(distinct c) c FROM (SELECT f1, f2 , COUNT(*) c FROM (SELECT 10 f1, 'r' f2 FROM dml_union_r UNION SELECT 40 f1, 's' f2 FROM dml_union_r UNION SELECT a, c FROM dml_union_r INTERSECT SELECT a, c FROM dml_union_s ORDER BY 1) foo group by f1,f2) foo)foo)bar; +INSERT INTO dml_union_r SELECT c,c+1,case when c = 1 then 'r' else 's' end,c+1 FROM (SELECT COUNT(distinct c) c FROM (SELECT f1, f2 , COUNT(*) c FROM (SELECT 10 f1, 'r' f2 FROM dml_union_r UNION SELECT 40 f1, 's' f2 FROM dml_union_r UNION SELECT a, c FROM dml_union_r INTERSECT SELECT a, c FROM dml_union_s ORDER BY 1) foo group by f1,f2) foo)foo; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_test31: INSERT NON ATOMICS with union/intersect/except +begin; +SELECT COUNT(*) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT * FROM dml_union_r WHERE a in (SELECT dml_union_r.d::int FROM dml_union_r INTERSECT SELECT dml_union_s.d FROM dml_union_s ORDER BY 1) UNION SELECT * FROM dml_union_s)bar; +INSERT INTO dml_union_r SELECT * FROM dml_union_r WHERE a in (SELECT dml_union_r.d::int FROM dml_union_r INTERSECT SELECT dml_union_s.d FROM dml_union_s ORDER BY 1) UNION SELECT * FROM dml_union_s; +SELECT COUNT(*) FROM dml_union_r; +rollback; + + +-- @description union_delete_test1: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test2: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test3: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r INTERSECT SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test4: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r INTERSECT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test5: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r EXCEPT SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test6: With UNION/INTERSECT/EXCEPT in dml_union_subquery +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a in (SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test7: With UNION/INTERSECT/EXCEPT in the predicate condition ( 0 rows) +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a = (SELECT NULL UNION SELECT NULL)::int; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test8: With UNION/INTERSECT/EXCEPT in the predicate condition ( 0 rows ) +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a = (SELECT NULL INTERSECT SELECT NULL)::int; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test9: With UNION/INTERSECT/EXCEPT in the predicate condition( 0 rows ) +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a = (SELECT NULL EXCEPT SELECT NULL)::int; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test10: With UNION/INTERSECT/EXCEPT in the predicate condition +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a = (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s ORDER BY a LIMIT 1); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test11: With UNION/INTERSECT/EXCEPT in the predicate condition +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a = (SELECT a FROM dml_union_r INTERSECT SELECT a FROM dml_union_s ORDER BY a LIMIT 1); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test12: With UNION/INTERSECT/EXCEPT in the predicate condition +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r WHERE a = (SELECT a FROM dml_union_r EXCEPT SELECT a FROM dml_union_s ORDER BY a LIMIT 1); +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test13: With UNION/INTERSECT/EXCEPT +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r USING (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s) foo WHERE foo.a = dml_union_r.a; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test14: With UNION/INTERSECT/EXCEPT +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r USING (SELECT a FROM dml_union_r INTERSECT SELECT a FROM dml_union_s) foo WHERE foo.a = dml_union_r.a; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test15: With UNION/INTERSECT/EXCEPT +begin; +SELECT COUNT(*) FROM dml_union_r; +DELETE FROM dml_union_r USING (SELECT a FROM dml_union_r EXCEPT SELECT a FROM dml_union_s) foo WHERE foo.a = dml_union_r.a; +SELECT COUNT(*) FROM dml_union_r; +rollback; + +-- @description union_delete_test16: Using Partition table +begin; +SELECT COUNT(*) FROM dml_union_s; +DELETE FROM dml_union_s USING (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s_1_prt_def) foo; +SELECT COUNT(*) FROM dml_union_s; +rollback; + +-- @description union_delete_test17: Using Partition table +begin; +SELECT COUNT(*) FROM dml_union_s; +DELETE FROM dml_union_s USING (SELECT * FROM dml_union_r UNION SELECT * FROM dml_union_s_1_prt_def) foo WHERE foo.d = dml_union_s.d; +SELECT COUNT(*) FROM dml_union_s; +rollback; + +-- @description union_update_test1: Update distribution column with UNION +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s ORDER BY 1 LIMIT 1; +UPDATE dml_union_r SET a = (SELECT a FROM dml_union_r UNION SELECT a FROM dml_union_s ORDER BY 1 LIMIT 1); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +rollback; + +-- @description union_update_test2: Update distribution column with UNION +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +UPDATE dml_union_r SET a = (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s ORDER BY 1 LIMIT 1); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +SELECT DISTINCT(a) FROM dml_union_r; +rollback; + +-- @description union_update_test3: Update distribution column with INTERSECT +begin; +SELECT COUNT(*) FROM dml_union_r WHERE a = 1; +SELECT COUNT(*) FROM (SELECT * FROM (SELECT a FROM dml_union_r order by a limit 1) foo INTERSECT SELECT a FROM dml_union_s)bar; +UPDATE dml_union_r SET a = ( SELECT * FROM (SELECT a FROM dml_union_r order by a limit 1) foo INTERSECT SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE a = 1; +rollback; + +-- @description union_update_test4: Update distribution column with INTERSECT +begin; +SELECT COUNT(*) FROM dml_union_r WHERE a = 1; +SELECT COUNT(*) FROM (SELECT * FROM (SELECT a FROM dml_union_r ORDER BY 1 limit 1) foo INTERSECT ALL SELECT a FROM dml_union_s)bar; +UPDATE dml_union_r SET a = ( SELECT * FROM (SELECT a FROM dml_union_r ORDER BY 1 limit 1) foo INTERSECT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE a = 1; +rollback; + +-- @description union_update_test5: Update distribution column with EXCEPT +begin; +SELECT SUM(a) FROM dml_union_r; +SELECT COUNT(*) FROM (SELECT * FROM (SELECT a FROM dml_union_r limit 1) foo EXCEPT SELECT a FROM dml_union_s)bar; +UPDATE dml_union_r SET a = ( SELECT * FROM (SELECT a FROM dml_union_r limit 1) foo EXCEPT SELECT a FROM dml_union_s); +SELECT SUM(a) FROM dml_union_r; +rollback; + +-- @description union_update_test6: Update distribution column with EXCEPT +begin; +UPDATE dml_union_r SET a = ( SELECT * FROM (SELECT a FROM dml_union_r limit 1) foo EXCEPT ALL SELECT a FROM dml_union_s); +SELECT DISTINCT(a) FROM dml_union_r; +rollback; + +-- @description union_update_test7: NULL values to distribution key +begin; +UPDATE dml_union_r SET a = (SELECT NULL UNION SELECT NULL)::int; +SELECT DISTINCT(a) FROM dml_union_r; +rollback; + +-- @description union_update_test8: NULL values to distribution key +begin; +UPDATE dml_union_r SET a = (SELECT NULL INTERSECT SELECT NULL)::int; +SELECT DISTINCT(a) FROM dml_union_r; +rollback; + +-- @description union_update_test9: NULL values to distribution key +begin; +UPDATE dml_union_r SET a = (SELECT NULL INTERSECT ALL SELECT NULL)::int; +SELECT DISTINCT(a) FROM dml_union_r; +rollback; + +-- @description union_update_test10: NULL values to distribution key +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +UPDATE dml_union_r SET a = (SELECT NULL EXCEPT SELECT NULL)::int; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +rollback; + +-- @description union_update_test11: NULL values to text +begin; +SELECT COUNT(DISTINCT(c)) FROM dml_union_r; +UPDATE dml_union_r SET c = (SELECT NULL EXCEPT ALL SELECT NULL); +SELECT COUNT(DISTINCT(c)) FROM dml_union_r; +rollback; + +-- @description union_update_test12: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +UPDATE dml_union_s SET d = (SELECT NULL UNION SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; + +-- @description union_update_test13: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +UPDATE dml_union_s SET d = (SELECT NULL INTERSECT SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; + +-- @description union_update_test14: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +UPDATE dml_union_s SET d = (SELECT NULL INTERSECT ALL SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; + +-- @description union_update_test15: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +UPDATE dml_union_s SET d = (SELECT NULL EXCEPT SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; + +-- @description union_update_test16: Update partition key to NULL values when default partition present +begin; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +UPDATE dml_union_s SET d = (SELECT NULL EXCEPT ALL SELECT NULL)::numeric; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; + +-- @description union_update_test17: Update partition key to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; +SELECT COUNT(*) FROM (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s)foo; +UPDATE dml_union_r SET d = 20000 WHERE a in (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; +rollback; + +-- @description union_update_test18: Update partition key to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; +SELECT COUNT(*) FROM (SELECT a FROM dml_union_r INTERSECT ALL SELECT a FROM dml_union_s)foo; +UPDATE dml_union_r SET d = 20000 WHERE a in (SELECT a FROM dml_union_r INTERSECT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; +rollback; + +-- @description union_update_test19: Update partition key to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; +SELECT COUNT(*) FROM (SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s)foo; +UPDATE dml_union_r SET d = 20000 WHERE a in (SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE d = 20000; +rollback; + +-- we don't have the same issue greenplum has in single node mode, behave like pg. +-- start_ignore +-- @description union_update_test20: UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +UPDATE dml_union_r SET a = dml_union_s.a FROM dml_union_s WHERE dml_union_r.b in (SELECT b FROM dml_union_r UNION SELECT b FROM dml_union_s); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +rollback; +-- end_ignore + +-- @description union_update_test21: UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +UPDATE dml_union_r SET a = dml_union_r.a WHERE b in (SELECT b FROM dml_union_r INTERSECT SELECT b FROM dml_union_s); +SELECT DISTINCT(a) FROM dml_union_r; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +rollback; + +-- @description union_update_test22: UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +UPDATE dml_union_r SET a = dml_union_r.a WHERE b in (SELECT b FROM dml_union_r EXCEPT SELECT b FROM dml_union_s); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +SELECT DISTINCT(a) FROM dml_union_r; +rollback; + +-- @description union_update_test23: Update distribution column to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; +UPDATE dml_union_r SET a = 0 WHERE a in (SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s); +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +rollback; + +-- @description union_update_test24: Update distribution column to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; +UPDATE dml_union_r SET a = 0 WHERE a in (SELECT a FROM dml_union_r INTERSECT ALL SELECT a FROM dml_union_s); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; +rollback; + +-- @description union_update_test25: Update distribution column to constant value with UNION/INTERSECT/EXCEPT within dml_union_sub-query +begin; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; +UPDATE dml_union_r SET a = 0 WHERE a in (SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s); +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +SELECT COUNT(*) FROM dml_union_r WHERE a = 0; +rollback; + +-- @description union_update_test26: Negative Tests Update the partition key to an out of dml_union_range value with no default partition +begin; +DROP TABLE dml_union_s_1_prt_def; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +UPDATE dml_union_s SET d = (SELECT NULL UNION SELECT NULL)::numeric; +--SELECT DISTINCT(d) FROM dml_union_s; +--SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; + +-- @description union_update_test27: Negative Tests Update the partition key to an out of range value with no default partition +begin; +DROP TABLE dml_union_s_1_prt_def; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +UPDATE dml_union_s SET d = (SELECT NULL INTERSECT SELECT NULL)::numeric; +--SELECT DISTINCT(d) FROM dml_union_s; +--SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; + +-- @description union_update_test28: Negative Tests Update the partition key to an out of dml_union_range value with no default partition +begin; +DROP TABLE dml_union_s_1_prt_def; +SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +UPDATE dml_union_s SET d = (SELECT NULL EXCEPT SELECT NULL)::numeric; +--SELECT DISTINCT(d) FROM dml_union_s; +--SELECT COUNT(DISTINCT(d)) FROM dml_union_s; +rollback; + +-- @description union_update_test29: Negative Tests UPDATE violates the CHECK constraint on the column +SELECT COUNT(DISTINCT(b)) FROM dml_union_s; +UPDATE dml_union_s SET b = (SELECT NULL UNION SELECT NULL)::numeric; +--SELECT COUNT(DISTINCT(b)) FROM dml_union_s; +--SELECT DISTINCT(b) FROM dml_union_s; + +-- @description union_update_test30: Negative Tests more than one row returned by a sub-query used as an expression +-- +-- The access plan of this UPDATE is sensitive to optimizer_segments. With +-- ORCA, the error message varies depending accesss plan; you either get: +-- +-- ERROR: more than one row returned by a subquery used as an expression +-- +-- like with the Postgres planner, or you get: +-- +-- ERROR: one or more assertions failed +-- DETAIL: Expected no more than one row to be returned by expression +-- +-- To make the output stable, arbitrarily fix optimizer_segments to 2, to get the latter. +set optimizer_segments=2; +ANALYZE dml_union_r, dml_union_s; +SELECT COUNT(DISTINCT(a)) FROM dml_union_r; +UPDATE dml_union_r SET a = ( SELECT a FROM dml_union_r UNION ALL SELECT a FROM dml_union_s); +reset optimizer_segments; +--SELECT COUNT(DISTINCT(a)) FROM dml_union_r; + +-- @description union_update_test31: Negative Tests more than one row returned by a sub-query used as an expression +UPDATE dml_union_r SET b = ( SELECT a FROM dml_union_r EXCEPT ALL SELECT a FROM dml_union_s); + +-- +-- Test mixing a set-returning function, which can be evaluated anywhere, +-- (it has General locus) and a diststributed table, in an Append. +-- +explain (costs off) +select a from dml_union_r where a > 95 +union all +select g from generate_series(1,2) g; + +select a from dml_union_r where a > 95 +union all +select g from generate_series(1,2) g; + +explain (costs off) +select sum(a) from ( + select a from dml_union_r where a > 95 + union all + select g from generate_series(1,2) g +) t; + +select sum(a) from ( + select a from dml_union_r where a > 95 + union all + select g from generate_series(1,2) g +) t; + +-- +-- Continue to test appending General to distributed table. +-- This time, the General is a dummy path, produced by pushing down condition. +-- (Only for planner, orca does not create dummy path here) +-- +create table t_test_append_hash(a int, b int, c int); +insert into t_test_append_hash select i, i+1, i+2 from generate_series(1, 5)i; + +explain (costs off) +with t(a, b, s) as ( + select a, b, sum(c) from t_test_append_hash where a > b group by a, b + union all + select a, b, sum(c) from t_test_append_hash where a < b group by a, b +) select * from t where t.a < t.b; + +with t(a, b, s) as ( + select a, b, sum(c) from t_test_append_hash where a > b group by a, b + union all + select a, b, sum(c) from t_test_append_hash where a < b group by a, b +) select * from t where t.a < t.b; + +-- Test mixing a SegmentGeneral with distributed table. +create table t_test_append_rep(a int, b int, c int); +insert into t_test_append_rep select i, i+1, i+2 from generate_series(5, 10)i; + +explain (costs off) +select * from t_test_append_rep +union all +select * from t_test_append_hash; + +select * from t_test_append_rep +union all +select * from t_test_append_hash; + +-- Test value scan union all with a distributed table that direct dispatch +-- value scan's locus is general, so it will use Result plan node with +-- resconstantqual to be gp_execution_segment() = to turn +-- general locus to partitioned locus to avoid gather partitioned locus +-- table to singleQE. When the subplan of partitioned table's scan can +-- use direct dispatch, previously, the result plan does not handle +-- direct dispatch correctly. This case cannot test plan, this is because +-- gp_execution_segment() = the filter segid is randomly picked. +-- So the result plan's direct dispatch info is also random. We print the plan +-- and ignore it for better debugging info if error happens. +-- See github issue https://github.com/greenplum-db/gpdb/issues/9874 for details. + +create table t_github_issue_9874 (a int); +-- start_ignore +explain (costs off) +select 1 +union all +select * from t_github_issue_9874 where a = 1; +-- end_ignore +select 1 +union all +select * from t_github_issue_9874 where a = 1; + +-- +-- Test mixing a SegmentGeneral with distributed table +-- when gp_enable_direct_dispatch is off. +-- +begin; +create table rt1(a int, b int); +create table t1(a int, b int); +insert into t1 select i, i+1 from generate_series(6, 9) i; +insert into rt1 select i, i+1 from generate_series(1, 5) i; +set local gp_enable_direct_dispatch = on; +explain(costs off) select * from rt1 union all select * from t1; +select * from rt1 union all select * from t1; +set local gp_enable_direct_dispatch = off; +select * from rt1 union all select * from t1; +reset gp_enable_direct_dispatch; +abort; + +-- Test mixing a SegmentGeneral with General locus scan. +explain (costs off) +select a from t_test_append_rep +union all +select * from generate_series(100, 105); + +select a from t_test_append_rep +union all +select * from generate_series(100, 105); + +-- +-- Test for creation of MergeAppend paths. +-- +-- We used to have a bug in creation of MergeAppend paths, so that this failed +-- with "could not find pathkey item to sort" error. See +-- https://github.com/greenplum-db/gpdb/issues/5695 +-- +create table mergeappend_test ( a int, b int, x int ); +insert into mergeappend_test select g/100, g/100, g from generate_series(1, 500) g; +analyze mergeappend_test; + +select a, b, array_dims(array_agg(x)) from mergeappend_test r group by a, b +union all +select null, null, array_dims(array_agg(x)) from mergeappend_test r +order by 1,2; + +-- Check that it's using a MergeAppend +set enable_hashagg=off; +explain (costs off) +select a, b, array_dims(array_agg(x)) from mergeappend_test r group by a, b +union all +select null, null, array_dims(array_agg(x)) from mergeappend_test r +order by 1,2; + +-- This used to trip an assertion in MotionStateFinderWalker(), when we were +-- missing support for MergeAppend in planstate_walk_kids(). +-- (https://github.com/greenplum-db/gpdb/issues/6668) +select a, b, array_dims(array_agg(x)) from mergeappend_test r group by a, b +union all +select null, null, array_dims(array_agg(x)) FROM mergeappend_test r, pg_sleep(0) +order by 1,2; + +-- check that EXPLAIN ANALYZE works on MergeAppend, too. +explain analyze select a, b, array_dims(array_agg(x)) from mergeappend_test r group by a, b +union all +select null, null, array_dims(array_agg(x)) FROM mergeappend_test r +order by 1,2; + +CREATE TABLE t1(c1 int, c2 int, c3 int); +CREATE TABLE t2(c1 int, c2 int, c3 int); +INSERT INTO t1 SELECT i, i ,i + 1 FROM generate_series(1,10) i; +INSERT INTO t2 SELECT i, i ,i + 1 FROM generate_series(1,10) i; +SET enable_hashagg = off; +with tcte(c1, c2, c3) as ( + SELECT c1, sum(c2) as c2, c3 FROM t1 WHERE c3 > 0 GROUP BY c1, c3 + UNION ALL + SELECT c1, sum(c2) as c2, c3 FROM t2 WHERE c3 < 0 GROUP BY c1, c3 +) +SELECT * FROM tcte WHERE c3 = 1; + diff --git a/src/test/singlenode_regress/sql/qp_with_clause.sql b/src/test/singlenode_regress/sql/qp_with_clause.sql new file mode 100644 index 00000000000..117da4ce87a --- /dev/null +++ b/src/test/singlenode_regress/sql/qp_with_clause.sql @@ -0,0 +1,10349 @@ +-- +-- PostgreSQL port of the MySQL "World" database. +-- +-- The sample data used in the world database is Copyright Statistics +-- Finland, http://www.stat.fi/worldinfigures. +-- + +-- Modified to use it with GPDB + +set extra_float_digits=0; + +--start_ignore +create schema qp_with_clause; +set search_path = qp_with_clause; + +DROP TABLE IF EXISTS city cascade; + +DROP TABLE IF EXISTS country cascade; + +DROP TABLE IF EXISTS countrylanguage cascade; + +--end_ignore + +BEGIN; + +--SET client_encoding = 'LATIN1'; + + +CREATE TABLE city ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +) ; + + + +CREATE TABLE country ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea numeric(10,2) NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +); + + + +CREATE TABLE countrylanguage ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +); + +COPY city (id, name, countrycode, district, population) FROM stdin; +1 Kabul AFG Kabol 1780000 +2 Qandahar AFG Qandahar 237500 +3 Herat AFG Herat 186800 +4 Mazar-e-Sharif AFG Balkh 127800 +5 Amsterdam NLD Noord-Holland 731200 +6 Rotterdam NLD Zuid-Holland 593321 +7 Haag NLD Zuid-Holland 440900 +8 Utrecht NLD Utrecht 234323 +9 Eindhoven NLD Noord-Brabant 201843 +10 Tilburg NLD Noord-Brabant 193238 +11 Groningen NLD Groningen 172701 +12 Breda NLD Noord-Brabant 160398 +13 Apeldoorn NLD Gelderland 153491 +14 Nijmegen NLD Gelderland 152463 +15 Enschede NLD Overijssel 149544 +16 Haarlem NLD Noord-Holland 148772 +17 Almere NLD Flevoland 142465 +18 Arnhem NLD Gelderland 138020 +19 Zaanstad NLD Noord-Holland 135621 +20 s-Hertogenbosch NLD Noord-Brabant 129170 +21 Amersfoort NLD Utrecht 126270 +22 Maastricht NLD Limburg 122087 +23 Dordrecht NLD Zuid-Holland 119811 +24 Leiden NLD Zuid-Holland 117196 +25 Haarlemmermeer NLD Noord-Holland 110722 +26 Zoetermeer NLD Zuid-Holland 110214 +27 Emmen NLD Drenthe 105853 +28 Zwolle NLD Overijssel 105819 +29 Ede NLD Gelderland 101574 +30 Delft NLD Zuid-Holland 95268 +31 Heerlen NLD Limburg 95052 +32 Alkmaar NLD Noord-Holland 92713 +33 Willemstad ANT Curacao 2345 +34 Tirana ALB Tirana 270000 +35 Alger DZA Alger 2168000 +36 Oran DZA Oran 609823 +37 Constantine DZA Constantine 443727 +38 Annaba DZA Annaba 222518 +39 Batna DZA Batna 183377 +40 Setif DZA Setif 179055 +41 Sidi Bel Abbes DZA Sidi Bel Abbes 153106 +42 Skikda DZA Skikda 128747 +43 Biskra DZA Biskra 128281 +44 Blida (el-Boulaida) DZA Blida 127284 +45 Bejaia DZA Bejaia 117162 +46 Mostaganem DZA Mostaganem 115212 +47 Tebessa DZA Tebessa 112007 +48 Tlemcen (Tilimsen) DZA Tlemcen 110242 +49 Bechar DZA Bechar 107311 +50 Tiaret DZA Tiaret 100118 +51 Ech-Chleff (el-Asnam) DZA Chlef 96794 +52 Ghardaia DZA Ghardaia 89415 +53 Tafuna ASM Tutuila 5200 +54 Fagatogo ASM Tutuila 2323 +55 Andorra la Vella AND Andorra la Vella 21189 +56 Luanda AGO Luanda 2022000 +57 Huambo AGO Huambo 163100 +58 Lobito AGO Benguela 130000 +59 Benguela AGO Benguela 128300 +60 Namibe AGO Namibe 118200 +61 South Hill AIA A 961 +62 The Valley AIA A 595 +63 Saint Johns ATG St John 24000 +64 Dubai ARE Dubai 669181 +65 Abu Dhabi ARE Abu Dhabi 398695 +66 Sharja ARE Sharja 320095 +67 al-Ayn ARE Abu Dhabi 225970 +68 Ajman ARE Ajman 114395 +69 Buenos Aires ARG Distrito Federal 2982146 +70 La Matanza ARG Buenos Aires 1266461 +71 Cordoba ARG Cordoba 1157507 +72 Rosario ARG Santa Fe 907718 +73 Lomas de Zamora ARG Buenos Aires 622013 +74 Quilmes ARG Buenos Aires 559249 +75 Almirante Brown ARG Buenos Aires 538918 +76 La Plata ARG Buenos Aires 521936 +77 Mar del Plata ARG Buenos Aires 512880 +78 San Miguel de Tucuman ARG Tucuman 470809 +79 Lanus ARG Buenos Aires 469735 +80 Merlo ARG Buenos Aires 463846 +81 General San Martin ARG Buenos Aires 422542 +82 Salta ARG Salta 367550 +83 Moreno ARG Buenos Aires 356993 +84 Santa Fe ARG Santa Fe 353063 +85 Avellaneda ARG Buenos Aires 353046 +86 Tres de Febrero ARG Buenos Aires 352311 +87 Moron ARG Buenos Aires 349246 +88 Florencio Varela ARG Buenos Aires 315432 +89 San Isidro ARG Buenos Aires 306341 +90 Tigre ARG Buenos Aires 296226 +91 Malvinas Argentinas ARG Buenos Aires 290335 +92 Vicente Lopez ARG Buenos Aires 288341 +93 Berazategui ARG Buenos Aires 276916 +94 Corrientes ARG Corrientes 258103 +95 San Miguel ARG Buenos Aires 248700 +96 Bahia Blanca ARG Buenos Aires 239810 +97 Esteban Echeverria ARG Buenos Aires 235760 +98 Resistencia ARG Chaco 229212 +99 Jose C. Paz ARG Buenos Aires 221754 +100 Parana ARG Entre Rios 207041 +101 Godoy Cruz ARG Mendoza 206998 +102 Posadas ARG Misiones 201273 +103 Guaymallen ARG Mendoza 200595 +104 Santiago del Estero ARG Santiago del Estero 189947 +105 San Salvador de Jujuy ARG Jujuy 178748 +106 Hurlingham ARG Buenos Aires 170028 +107 Neuquen ARG Neuquen 167296 +108 Ituzaingo ARG Buenos Aires 158197 +109 San Fernando ARG Buenos Aires 153036 +110 Formosa ARG Formosa 147636 +111 Las Heras ARG Mendoza 145823 +112 La Rioja ARG La Rioja 138117 +113 San Fernando del Valle de Cata ARG Catamarca 134935 +114 Rio Cuarto ARG Cordoba 134355 +115 Comodoro Rivadavia ARG Chubut 124104 +116 Mendoza ARG Mendoza 123027 +117 San Nicolas de los Arroyos ARG Buenos Aires 119302 +118 San Juan ARG San Juan 119152 +119 Escobar ARG Buenos Aires 116675 +120 Concordia ARG Entre Rios 116485 +121 Pilar ARG Buenos Aires 113428 +122 San Luis ARG San Luis 110136 +123 Ezeiza ARG Buenos Aires 99578 +124 San Rafael ARG Mendoza 94651 +125 Tandil ARG Buenos Aires 91101 +126 Yerevan ARM Yerevan 1248700 +127 Gjumri ARM Girak 211700 +128 Vanadzor ARM Lori 172700 +129 Oranjestad ABW A 29034 +130 Sydney AUS New South Wales 3276207 +131 Melbourne AUS Victoria 2865329 +132 Brisbane AUS Queensland 1291117 +133 Perth AUS West Australia 1096829 +134 Adelaide AUS South Australia 978100 +135 Canberra AUS Capital Region 322723 +136 Gold Coast AUS Queensland 311932 +137 Newcastle AUS New South Wales 270324 +138 Central Coast AUS New South Wales 227657 +139 Wollongong AUS New South Wales 219761 +140 Hobart AUS Tasmania 126118 +141 Geelong AUS Victoria 125382 +142 Townsville AUS Queensland 109914 +143 Cairns AUS Queensland 92273 +144 Baku AZE Baki 1787800 +145 Ganca AZE Ganca 299300 +146 Sumqayit AZE Sumqayit 283000 +147 Mingacevir AZE Mingacevir 93900 +148 Nassau BHS New Providence 172000 +149 al-Manama BHR al-Manama 148000 +150 Dhaka BGD Dhaka 3612850 +151 Chittagong BGD Chittagong 1392860 +152 Khulna BGD Khulna 663340 +153 Rajshahi BGD Rajshahi 294056 +154 Narayanganj BGD Dhaka 202134 +155 Rangpur BGD Rajshahi 191398 +156 Mymensingh BGD Dhaka 188713 +157 Barisal BGD Barisal 170232 +158 Tungi BGD Dhaka 168702 +159 Jessore BGD Khulna 139710 +160 Comilla BGD Chittagong 135313 +161 Nawabganj BGD Rajshahi 130577 +162 Dinajpur BGD Rajshahi 127815 +163 Bogra BGD Rajshahi 120170 +164 Sylhet BGD Sylhet 117396 +165 Brahmanbaria BGD Chittagong 109032 +166 Tangail BGD Dhaka 106004 +167 Jamalpur BGD Dhaka 103556 +168 Pabna BGD Rajshahi 103277 +169 Naogaon BGD Rajshahi 101266 +170 Sirajganj BGD Rajshahi 99669 +171 Narsinghdi BGD Dhaka 98342 +172 Saidpur BGD Rajshahi 96777 +173 Gazipur BGD Dhaka 96717 +174 Bridgetown BRB St Michael 6070 +175 Antwerpen BEL Antwerpen 446525 +176 Gent BEL East Flanderi 224180 +177 Charleroi BEL Hainaut 200827 +178 Liege BEL Liege 185639 +179 Bruxelles [Brussel] BEL Bryssel 133859 +180 Brugge BEL West Flanderi 116246 +181 Schaerbeek BEL Bryssel 105692 +182 Namur BEL Namur 105419 +183 Mons BEL Hainaut 90935 +184 Belize City BLZ Belize City 55810 +185 Belmopan BLZ Cayo 7105 +186 Cotonou BEN Atlantique 536827 +187 Porto-Novo BEN Oueme 194000 +188 Djougou BEN Atacora 134099 +189 Parakou BEN Borgou 103577 +190 Saint George BMU Saint Georges 1800 +191 Hamilton BMU Hamilton 1200 +192 Thimphu BTN Thimphu 22000 +193 Santa Cruz de la Sierra BOL Santa Cruz 935361 +194 La Paz BOL La Paz 758141 +195 El Alto BOL La Paz 534466 +196 Cochabamba BOL Cochabamba 482800 +197 Oruro BOL Oruro 223553 +198 Sucre BOL Chuquisaca 178426 +199 Potosi BOL Potosi 140642 +200 Tarija BOL Tarija 125255 +201 Sarajevo BIH Federaatio 360000 +202 Banja Luka BIH Republika Srpska 143079 +203 Zenica BIH Federaatio 96027 +204 Gaborone BWA Gaborone 213017 +205 Francistown BWA Francistown 101805 +206 Sao Paulo BRA Sao Paulo 9968485 +207 Rio de Janeiro BRA Rio de Janeiro 5598953 +208 Salvador BRA Bahia 2302832 +209 Belo Horizonte BRA Minas Gerais 2139125 +210 Fortaleza BRA Ceara 2097757 +211 Brasilia BRA Distrito Federal 1969868 +212 Curitiba BRA Parana 1584232 +213 Recife BRA Pernambuco 1378087 +214 Porto Alegre BRA Rio Grande do Sul 1314032 +215 Manaus BRA Amazonas 1255049 +216 Belem BRA Para 1186926 +217 Guarulhos BRA Sao Paulo 1095874 +218 Goiania BRA Goias 1056330 +219 Campinas BRA Sao Paulo 950043 +220 Sao Goncalo BRA Rio de Janeiro 869254 +221 Nova Iguacu BRA Rio de Janeiro 862225 +222 Sao Luis BRA Maranhao 837588 +223 Maceio BRA Alagoas 786288 +224 Duque de Caxias BRA Rio de Janeiro 746758 +225 Sao Bernardo do Campo BRA Sao Paulo 723132 +226 Teresina BRA Piaui 691942 +227 Natal BRA Rio Grande do Norte 688955 +228 Osasco BRA Sao Paulo 659604 +229 Campo Grande BRA Mato Grosso do Sul 649593 +230 Santo Andre BRA Sao Paulo 630073 +231 Joao Pessoa BRA Paraiba 584029 +232 Jaboatao dos Guararapes BRA Pernambuco 558680 +233 Contagem BRA Minas Gerais 520801 +234 Sao Jose dos Campos BRA Sao Paulo 515553 +235 Uberlandia BRA Minas Gerais 487222 +236 Feira de Santana BRA Bahia 479992 +237 Ribeirao Preto BRA Sao Paulo 473276 +238 Sorocaba BRA Sao Paulo 466823 +239 Niteroi BRA Rio de Janeiro 459884 +240 Cuiaba BRA Mato Grosso 453813 +241 Juiz de Fora BRA Minas Gerais 450288 +242 Aracaju BRA Sergipe 445555 +243 Sao Joao de Meriti BRA Rio de Janeiro 440052 +244 Londrina BRA Parana 432257 +245 Joinville BRA Santa Catarina 428011 +246 Belford Roxo BRA Rio de Janeiro 425194 +247 Santos BRA Sao Paulo 408748 +248 Ananindeua BRA Para 400940 +249 Campos dos Goytacazes BRA Rio de Janeiro 398418 +250 Maua BRA Sao Paulo 375055 +251 Carapicuiba BRA Sao Paulo 357552 +252 Olinda BRA Pernambuco 354732 +253 Campina Grande BRA Paraiba 352497 +254 Sao Jose do Rio Preto BRA Sao Paulo 351944 +255 Caxias do Sul BRA Rio Grande do Sul 349581 +256 Moji das Cruzes BRA Sao Paulo 339194 +257 Diadema BRA Sao Paulo 335078 +258 Aparecida de Goiania BRA Goias 324662 +259 Piracicaba BRA Sao Paulo 319104 +260 Cariacica BRA Espirito Santo 319033 +261 Vila Velha BRA Espirito Santo 318758 +262 Pelotas BRA Rio Grande do Sul 315415 +263 Bauru BRA Sao Paulo 313670 +264 Porto Velho BRA Rondonia 309750 +265 Serra BRA Espirito Santo 302666 +266 Betim BRA Minas Gerais 302108 +267 Jundiai BRA Sao Paulo 296127 +268 Canoas BRA Rio Grande do Sul 294125 +269 Franca BRA Sao Paulo 290139 +270 Sao Vicente BRA Sao Paulo 286848 +271 Maringa BRA Parana 286461 +272 Montes Claros BRA Minas Gerais 286058 +273 Anapolis BRA Goias 282197 +274 Florianopolis BRA Santa Catarina 281928 +275 Petropolis BRA Rio de Janeiro 279183 +276 Itaquaquecetuba BRA Sao Paulo 270874 +277 Vitoria BRA Espirito Santo 270626 +278 Ponta Grossa BRA Parana 268013 +279 Rio Branco BRA Acre 259537 +280 Foz do Iguacu BRA Parana 259425 +281 Macapa BRA Amapa 256033 +282 Ilheus BRA Bahia 254970 +283 Vitoria da Conquista BRA Bahia 253587 +284 Uberaba BRA Minas Gerais 249225 +285 Paulista BRA Pernambuco 248473 +286 Limeira BRA Sao Paulo 245497 +287 Blumenau BRA Santa Catarina 244379 +288 Caruaru BRA Pernambuco 244247 +289 Santarem BRA Para 241771 +290 Volta Redonda BRA Rio de Janeiro 240315 +291 Novo Hamburgo BRA Rio Grande do Sul 239940 +292 Caucaia BRA Ceara 238738 +293 Santa Maria BRA Rio Grande do Sul 238473 +294 Cascavel BRA Parana 237510 +295 Guaruja BRA Sao Paulo 237206 +296 Ribeirao das Neves BRA Minas Gerais 232685 +297 Governador Valadares BRA Minas Gerais 231724 +298 Taubate BRA Sao Paulo 229130 +299 Imperatriz BRA Maranhao 224564 +300 Gravatai BRA Rio Grande do Sul 223011 +301 Embu BRA Sao Paulo 222223 +302 Mossoro BRA Rio Grande do Norte 214901 +303 Varzea Grande BRA Mato Grosso 214435 +304 Petrolina BRA Pernambuco 210540 +305 Barueri BRA Sao Paulo 208426 +306 Viamao BRA Rio Grande do Sul 207557 +307 Ipatinga BRA Minas Gerais 206338 +308 Juazeiro BRA Bahia 201073 +309 Juazeiro do Norte BRA Ceara 199636 +310 Taboao da Serra BRA Sao Paulo 197550 +311 Sao Jose dos Pinhais BRA Parana 196884 +312 Mage BRA Rio de Janeiro 196147 +313 Suzano BRA Sao Paulo 195434 +314 Sao Leopoldo BRA Rio Grande do Sul 189258 +315 Marilia BRA Sao Paulo 188691 +316 Sao Carlos BRA Sao Paulo 187122 +317 Sumare BRA Sao Paulo 186205 +318 Presidente Prudente BRA Sao Paulo 185340 +319 Divinopolis BRA Minas Gerais 185047 +320 Sete Lagoas BRA Minas Gerais 182984 +321 Rio Grande BRA Rio Grande do Sul 182222 +322 Itabuna BRA Bahia 182148 +323 Jequie BRA Bahia 179128 +324 Arapiraca BRA Alagoas 178988 +325 Colombo BRA Parana 177764 +326 Americana BRA Sao Paulo 177409 +327 Alvorada BRA Rio Grande do Sul 175574 +328 Araraquara BRA Sao Paulo 174381 +329 Itaborai BRA Rio de Janeiro 173977 +330 Santa Barbara dOeste BRA Sao Paulo 171657 +331 Nova Friburgo BRA Rio de Janeiro 170697 +332 Jacarei BRA Sao Paulo 170356 +333 Aracatuba BRA Sao Paulo 169303 +334 Barra Mansa BRA Rio de Janeiro 168953 +335 Praia Grande BRA Sao Paulo 168434 +336 Maraba BRA Para 167795 +337 Criciuma BRA Santa Catarina 167661 +338 Boa Vista BRA Roraima 167185 +339 Passo Fundo BRA Rio Grande do Sul 166343 +340 Dourados BRA Mato Grosso do Sul 164716 +341 Santa Luzia BRA Minas Gerais 164704 +342 Rio Claro BRA Sao Paulo 163551 +343 Maracanau BRA Ceara 162022 +344 Guarapuava BRA Parana 160510 +345 Rondonopolis BRA Mato Grosso 155115 +346 Sao Jose BRA Santa Catarina 155105 +347 Cachoeiro de Itapemirim BRA Espirito Santo 155024 +348 Nilopolis BRA Rio de Janeiro 153383 +349 Itapevi BRA Sao Paulo 150664 +350 Cabo de Santo Agostinho BRA Pernambuco 149964 +351 Camacari BRA Bahia 149146 +352 Sobral BRA Ceara 146005 +353 Itajai BRA Santa Catarina 145197 +354 Chapeco BRA Santa Catarina 144158 +355 Cotia BRA Sao Paulo 140042 +356 Lages BRA Santa Catarina 139570 +357 Ferraz de Vasconcelos BRA Sao Paulo 139283 +358 Indaiatuba BRA Sao Paulo 135968 +359 Hortolandia BRA Sao Paulo 135755 +360 Caxias BRA Maranhao 133980 +361 Sao Caetano do Sul BRA Sao Paulo 133321 +362 Itu BRA Sao Paulo 132736 +363 Nossa Senhora do Socorro BRA Sergipe 131351 +364 Parnaiba BRA Piaui 129756 +365 Pocos de Caldas BRA Minas Gerais 129683 +366 Teresopolis BRA Rio de Janeiro 128079 +367 Barreiras BRA Bahia 127801 +368 Castanhal BRA Para 127634 +369 Alagoinhas BRA Bahia 126820 +370 Itapecerica da Serra BRA Sao Paulo 126672 +371 Uruguaiana BRA Rio Grande do Sul 126305 +372 Paranagua BRA Parana 126076 +373 Ibirite BRA Minas Gerais 125982 +374 Timon BRA Maranhao 125812 +375 Luziania BRA Goias 125597 +376 Macae BRA Rio de Janeiro 125597 +377 Teofilo Otoni BRA Minas Gerais 124489 +378 Moji-Guacu BRA Sao Paulo 123782 +379 Palmas BRA Tocantins 121919 +380 Pindamonhangaba BRA Sao Paulo 121904 +381 Francisco Morato BRA Sao Paulo 121197 +382 Bage BRA Rio Grande do Sul 120793 +383 Sapucaia do Sul BRA Rio Grande do Sul 120217 +384 Cabo Frio BRA Rio de Janeiro 119503 +385 Itapetininga BRA Sao Paulo 119391 +386 Patos de Minas BRA Minas Gerais 119262 +387 Camaragibe BRA Pernambuco 118968 +388 Braganca Paulista BRA Sao Paulo 116929 +389 Queimados BRA Rio de Janeiro 115020 +390 Araguaina BRA Tocantins 114948 +391 Garanhuns BRA Pernambuco 114603 +392 Vitoria de Santo Antao BRA Pernambuco 113595 +393 Santa Rita BRA Paraiba 113135 +394 Barbacena BRA Minas Gerais 113079 +395 Abaetetuba BRA Para 111258 +396 Jau BRA Sao Paulo 109965 +397 Lauro de Freitas BRA Bahia 109236 +398 Franco da Rocha BRA Sao Paulo 108964 +399 Teixeira de Freitas BRA Bahia 108441 +400 Varginha BRA Minas Gerais 108314 +401 Ribeirao Pires BRA Sao Paulo 108121 +402 Sabara BRA Minas Gerais 107781 +403 Catanduva BRA Sao Paulo 107761 +404 Rio Verde BRA Goias 107755 +405 Botucatu BRA Sao Paulo 107663 +406 Colatina BRA Espirito Santo 107354 +407 Santa Cruz do Sul BRA Rio Grande do Sul 106734 +408 Linhares BRA Espirito Santo 106278 +409 Apucarana BRA Parana 105114 +410 Barretos BRA Sao Paulo 104156 +411 Guaratingueta BRA Sao Paulo 103433 +412 Cachoeirinha BRA Rio Grande do Sul 103240 +413 Codo BRA Maranhao 103153 +414 Jaragua do Sul BRA Santa Catarina 102580 +415 Cubatao BRA Sao Paulo 102372 +416 Itabira BRA Minas Gerais 102217 +417 Itaituba BRA Para 101320 +418 Araras BRA Sao Paulo 101046 +419 Resende BRA Rio de Janeiro 100627 +420 Atibaia BRA Sao Paulo 100356 +421 Pouso Alegre BRA Minas Gerais 100028 +422 Toledo BRA Parana 99387 +423 Crato BRA Ceara 98965 +424 Passos BRA Minas Gerais 98570 +425 Araguari BRA Minas Gerais 98399 +426 Sao Jose de Ribamar BRA Maranhao 98318 +427 Pinhais BRA Parana 98198 +428 Sertaozinho BRA Sao Paulo 98140 +429 Conselheiro Lafaiete BRA Minas Gerais 97507 +430 Paulo Afonso BRA Bahia 97291 +431 Angra dos Reis BRA Rio de Janeiro 96864 +432 Eunapolis BRA Bahia 96610 +433 Salto BRA Sao Paulo 96348 +434 Ourinhos BRA Sao Paulo 96291 +435 Parnamirim BRA Rio Grande do Norte 96210 +436 Jacobina BRA Bahia 96131 +437 Coronel Fabriciano BRA Minas Gerais 95933 +438 Birigui BRA Sao Paulo 94685 +439 Tatui BRA Sao Paulo 93897 +440 Ji-Parana BRA Rondonia 93346 +441 Bacabal BRA Maranhao 93121 +442 Cameta BRA Para 92779 +443 Guaiba BRA Rio Grande do Sul 92224 +444 Sao Lourenco da Mata BRA Pernambuco 91999 +445 Santana do Livramento BRA Rio Grande do Sul 91779 +446 Votorantim BRA Sao Paulo 91777 +447 Campo Largo BRA Parana 91203 +448 Patos BRA Paraiba 90519 +449 Ituiutaba BRA Minas Gerais 90507 +450 Corumba BRA Mato Grosso do Sul 90111 +451 Palhoca BRA Santa Catarina 89465 +452 Barra do Pirai BRA Rio de Janeiro 89388 +453 Bento Goncalves BRA Rio Grande do Sul 89254 +454 Poa BRA Sao Paulo 89236 +455 Aguas Lindas de Goias BRA Goias 89200 +456 London GBR England 7285000 +457 Birmingham GBR England 1013000 +458 Glasgow GBR Scotland 619680 +459 Liverpool GBR England 461000 +460 Edinburgh GBR Scotland 450180 +461 Sheffield GBR England 431607 +462 Manchester GBR England 430000 +463 Leeds GBR England 424194 +464 Bristol GBR England 402000 +465 Cardiff GBR Wales 321000 +466 Coventry GBR England 304000 +467 Leicester GBR England 294000 +468 Bradford GBR England 289376 +469 Belfast GBR North Ireland 287500 +470 Nottingham GBR England 287000 +471 Kingston upon Hull GBR England 262000 +472 Plymouth GBR England 253000 +473 Stoke-on-Trent GBR England 252000 +474 Wolverhampton GBR England 242000 +475 Derby GBR England 236000 +476 Swansea GBR Wales 230000 +477 Southampton GBR England 216000 +478 Aberdeen GBR Scotland 213070 +479 Northampton GBR England 196000 +480 Dudley GBR England 192171 +481 Portsmouth GBR England 190000 +482 Newcastle upon Tyne GBR England 189150 +483 Sunderland GBR England 183310 +484 Luton GBR England 183000 +485 Swindon GBR England 180000 +486 Southend-on-Sea GBR England 176000 +487 Walsall GBR England 174739 +488 Bournemouth GBR England 162000 +489 Peterborough GBR England 156000 +490 Brighton GBR England 156124 +491 Blackpool GBR England 151000 +492 Dundee GBR Scotland 146690 +493 West Bromwich GBR England 146386 +494 Reading GBR England 148000 +495 Oldbury/Smethwick (Warley) GBR England 145542 +496 Middlesbrough GBR England 145000 +497 Huddersfield GBR England 143726 +498 Oxford GBR England 144000 +499 Poole GBR England 141000 +500 Bolton GBR England 139020 +501 Blackburn GBR England 140000 +502 Newport GBR Wales 139000 +503 Preston GBR England 135000 +504 Stockport GBR England 132813 +505 Norwich GBR England 124000 +506 Rotherham GBR England 121380 +507 Cambridge GBR England 121000 +508 Watford GBR England 113080 +509 Ipswich GBR England 114000 +510 Slough GBR England 112000 +511 Exeter GBR England 111000 +512 Cheltenham GBR England 106000 +513 Gloucester GBR England 107000 +514 Saint Helens GBR England 106293 +515 Sutton Coldfield GBR England 106001 +516 York GBR England 104425 +517 Oldham GBR England 103931 +518 Basildon GBR England 100924 +519 Worthing GBR England 100000 +520 Chelmsford GBR England 97451 +521 Colchester GBR England 96063 +522 Crawley GBR England 97000 +523 Gillingham GBR England 92000 +524 Solihull GBR England 94531 +525 Rochdale GBR England 94313 +526 Birkenhead GBR England 93087 +527 Worcester GBR England 95000 +528 Hartlepool GBR England 92000 +529 Halifax GBR England 91069 +530 Woking/Byfleet GBR England 92000 +531 Southport GBR England 90959 +532 Maidstone GBR England 90878 +533 Eastbourne GBR England 90000 +534 Grimsby GBR England 89000 +535 Saint Helier GBR Jersey 27523 +536 Douglas GBR A 23487 +537 Road Town VGB Tortola 8000 +538 Bandar Seri Begawan BRN Brunei and Muara 21484 +539 Sofija BGR Grad Sofija 1122302 +540 Plovdiv BGR Plovdiv 342584 +541 Varna BGR Varna 299801 +542 Burgas BGR Burgas 195255 +543 Ruse BGR Ruse 166467 +544 Stara Zagora BGR Haskovo 147939 +545 Pleven BGR Lovec 121952 +546 Sliven BGR Burgas 105530 +547 Dobric BGR Varna 100399 +548 Gumen BGR Varna 94686 +549 Ouagadougou BFA Kadiogo 824000 +550 Bobo-Dioulasso BFA Houet 300000 +551 Koudougou BFA Boulkiemde 105000 +552 Bujumbura BDI Bujumbura 300000 +553 George Town CYM Grand Cayman 19600 +554 Santiago de Chile CHL Santiago 4703954 +555 Puente Alto CHL Santiago 386236 +556 Viaa del Mar CHL Valparaiso 312493 +557 Valparaiso CHL Valparaiso 293800 +558 Talcahuano CHL Biobio 277752 +559 Antofagasta CHL Antofagasta 251429 +560 San Bernardo CHL Santiago 241910 +561 Temuco CHL La Araucania 233041 +562 Concepcion CHL Biobio 217664 +563 Rancagua CHL OHiggins 212977 +564 Arica CHL Tarapaca 189036 +565 Talca CHL Maule 187557 +566 Chillan CHL Biobio 178182 +567 Iquique CHL Tarapaca 177892 +568 Los Angeles CHL Biobio 158215 +569 Puerto Montt CHL Los Lagos 152194 +570 Coquimbo CHL Coquimbo 143353 +571 Osorno CHL Los Lagos 141468 +572 La Serena CHL Coquimbo 137409 +573 Calama CHL Antofagasta 137265 +574 Valdivia CHL Los Lagos 133106 +575 Punta Arenas CHL Magallanes 125631 +576 Copiapo CHL Atacama 120128 +577 Quilpue CHL Valparaiso 118857 +578 Curico CHL Maule 115766 +579 Ovalle CHL Coquimbo 94854 +580 Coronel CHL Biobio 93061 +581 San Pedro de la Paz CHL Biobio 91684 +582 Melipilla CHL Santiago 91056 +583 Avarua COK Rarotonga 11900 +584 San Jose CRI San Jose 339131 +585 Djibouti DJI Djibouti 383000 +586 Roseau DMA St George 16243 +587 Santo Domingo de Guzman DOM Distrito Nacional 1609966 +588 Santiago de los Caballeros DOM Santiago 365463 +589 La Romana DOM La Romana 140204 +590 San Pedro de Macoris DOM San Pedro de Macoris 124735 +591 San Francisco de Macoris DOM Duarte 108485 +592 San Felipe de Puerto Plata DOM Puerto Plata 89423 +593 Guayaquil ECU Guayas 2070040 +594 Quito ECU Pichincha 1573458 +595 Cuenca ECU Azuay 270353 +596 Machala ECU El Oro 210368 +597 Santo Domingo de los Colorados ECU Pichincha 202111 +598 Portoviejo ECU Manabi 176413 +599 Ambato ECU Tungurahua 169612 +600 Manta ECU Manabi 164739 +601 Duran [Eloy Alfaro] ECU Guayas 152514 +602 Ibarra ECU Imbabura 130643 +603 Quevedo ECU Los Rios 129631 +604 Milagro ECU Guayas 124177 +605 Loja ECU Loja 123875 +606 Riobamba ECU Chimborazo 123163 +607 Esmeraldas ECU Esmeraldas 123045 +608 Cairo EGY Kairo 6789479 +609 Alexandria EGY Aleksandria 3328196 +610 Giza EGY Giza 2221868 +611 Shubra al-Khayma EGY al-Qalyubiya 870716 +612 Port Said EGY Port Said 469533 +613 Suez EGY Suez 417610 +614 al-Mahallat al-Kubra EGY al-Gharbiya 395402 +615 Tanta EGY al-Gharbiya 371010 +616 al-Mansura EGY al-Daqahliya 369621 +617 Luxor EGY Luxor 360503 +618 Asyut EGY Asyut 343498 +619 Bahtim EGY al-Qalyubiya 275807 +620 Zagazig EGY al-Sharqiya 267351 +621 al-Faiyum EGY al-Faiyum 260964 +622 Ismailia EGY Ismailia 254477 +623 Kafr al-Dawwar EGY al-Buhayra 231978 +624 Assuan EGY Assuan 219017 +625 Damanhur EGY al-Buhayra 212203 +626 al-Minya EGY al-Minya 201360 +627 Bani Suwayf EGY Bani Suwayf 172032 +628 Qina EGY Qina 171275 +629 Sawhaj EGY Sawhaj 170125 +630 Shibin al-Kawm EGY al-Minufiya 159909 +631 Bulaq al-Dakrur EGY Giza 148787 +632 Banha EGY al-Qalyubiya 145792 +633 Warraq al-Arab EGY Giza 127108 +634 Kafr al-Shaykh EGY Kafr al-Shaykh 124819 +635 Mallawi EGY al-Minya 119283 +636 Bilbays EGY al-Sharqiya 113608 +637 Mit Ghamr EGY al-Daqahliya 101801 +638 al-Arish EGY Shamal Sina 100447 +639 Talkha EGY al-Daqahliya 97700 +640 Qalyub EGY al-Qalyubiya 97200 +641 Jirja EGY Sawhaj 95400 +642 Idfu EGY Qina 94200 +643 al-Hawamidiya EGY Giza 91700 +644 Disuq EGY Kafr al-Shaykh 91300 +645 San Salvador SLV San Salvador 415346 +646 Santa Ana SLV Santa Ana 139389 +647 Mejicanos SLV San Salvador 138800 +648 Soyapango SLV San Salvador 129800 +649 San Miguel SLV San Miguel 127696 +650 Nueva San Salvador SLV La Libertad 98400 +651 Apopa SLV San Salvador 88800 +652 Asmara ERI Maekel 431000 +653 Madrid ESP Madrid 2879052 +654 Barcelona ESP Katalonia 1503451 +655 Valencia ESP Valencia 739412 +656 Sevilla ESP Andalusia 701927 +657 Zaragoza ESP Aragonia 603367 +658 Malaga ESP Andalusia 530553 +659 Bilbao ESP Baskimaa 357589 +660 Las Palmas de Gran Canaria ESP Canary Islands 354757 +661 Murcia ESP Murcia 353504 +662 Palma de Mallorca ESP Balears 326993 +663 Valladolid ESP Castilla and Leon 319998 +664 Cordoba ESP Andalusia 311708 +665 Vigo ESP Galicia 283670 +666 Alicante [Alacant] ESP Valencia 272432 +667 Gijon ESP Asturia 267980 +668 LHospitalet de Llobregat ESP Katalonia 247986 +669 Granada ESP Andalusia 244767 +670 A Coruaa (La Coruaa) ESP Galicia 243402 +671 Vitoria-Gasteiz ESP Baskimaa 217154 +672 Santa Cruz de Tenerife ESP Canary Islands 213050 +673 Badalona ESP Katalonia 209635 +674 Oviedo ESP Asturia 200453 +675 Mostoles ESP Madrid 195351 +676 Elche [Elx] ESP Valencia 193174 +677 Sabadell ESP Katalonia 184859 +678 Santander ESP Cantabria 184165 +679 Jerez de la Frontera ESP Andalusia 182660 +680 Pamplona [Iruaa] ESP Navarra 180483 +681 Donostia-San Sebastian ESP Baskimaa 179208 +682 Cartagena ESP Murcia 177709 +683 Leganes ESP Madrid 173163 +684 Fuenlabrada ESP Madrid 171173 +685 Almeria ESP Andalusia 169027 +686 Terrassa ESP Katalonia 168695 +687 Alcala de Henares ESP Madrid 164463 +688 Burgos ESP Castilla and Leon 162802 +689 Salamanca ESP Castilla and Leon 158720 +690 Albacete ESP Kastilia-La Mancha 147527 +691 Getafe ESP Madrid 145371 +692 Cadiz ESP Andalusia 142449 +693 Alcorcon ESP Madrid 142048 +694 Huelva ESP Andalusia 140583 +695 Leon ESP Castilla and Leon 139809 +696 Castellon de la Plana [Castell ESP Valencia 139712 +697 Badajoz ESP Extremadura 136613 +698 [San Cristobal de] la Laguna ESP Canary Islands 127945 +699 Logroao ESP La Rioja 127093 +700 Santa Coloma de Gramenet ESP Katalonia 120802 +701 Tarragona ESP Katalonia 113016 +702 Lleida (Lerida) ESP Katalonia 112207 +703 Jaen ESP Andalusia 109247 +704 Ourense (Orense) ESP Galicia 109120 +705 Mataro ESP Katalonia 104095 +706 Algeciras ESP Andalusia 103106 +707 Marbella ESP Andalusia 101144 +708 Barakaldo ESP Baskimaa 98212 +709 Dos Hermanas ESP Andalusia 94591 +710 Santiago de Compostela ESP Galicia 93745 +711 Torrejon de Ardoz ESP Madrid 92262 +712 Cape Town ZAF Western Cape 2352121 +713 Soweto ZAF Gauteng 904165 +714 Johannesburg ZAF Gauteng 756653 +715 Port Elizabeth ZAF Eastern Cape 752319 +716 Pretoria ZAF Gauteng 658630 +717 Inanda ZAF KwaZulu-Natal 634065 +718 Durban ZAF KwaZulu-Natal 566120 +719 Vanderbijlpark ZAF Gauteng 468931 +720 Kempton Park ZAF Gauteng 442633 +721 Alberton ZAF Gauteng 410102 +722 Pinetown ZAF KwaZulu-Natal 378810 +723 Pietermaritzburg ZAF KwaZulu-Natal 370190 +724 Benoni ZAF Gauteng 365467 +725 Randburg ZAF Gauteng 341288 +726 Umlazi ZAF KwaZulu-Natal 339233 +727 Bloemfontein ZAF Free State 334341 +728 Vereeniging ZAF Gauteng 328535 +729 Wonderboom ZAF Gauteng 283289 +730 Roodepoort ZAF Gauteng 279340 +731 Boksburg ZAF Gauteng 262648 +732 Klerksdorp ZAF North West 261911 +733 Soshanguve ZAF Gauteng 242727 +734 Newcastle ZAF KwaZulu-Natal 222993 +735 East London ZAF Eastern Cape 221047 +736 Welkom ZAF Free State 203296 +737 Kimberley ZAF Northern Cape 197254 +738 Uitenhage ZAF Eastern Cape 192120 +739 Chatsworth ZAF KwaZulu-Natal 189885 +740 Mdantsane ZAF Eastern Cape 182639 +741 Krugersdorp ZAF Gauteng 181503 +742 Botshabelo ZAF Free State 177971 +743 Brakpan ZAF Gauteng 171363 +744 Witbank ZAF Mpumalanga 167183 +745 Oberholzer ZAF Gauteng 164367 +746 Germiston ZAF Gauteng 164252 +747 Springs ZAF Gauteng 162072 +748 Westonaria ZAF Gauteng 159632 +749 Randfontein ZAF Gauteng 120838 +750 Paarl ZAF Western Cape 105768 +751 Potchefstroom ZAF North West 101817 +752 Rustenburg ZAF North West 97008 +753 Nigel ZAF Gauteng 96734 +754 George ZAF Western Cape 93818 +755 Ladysmith ZAF KwaZulu-Natal 89292 +756 Addis Abeba ETH Addis Abeba 2495000 +757 Dire Dawa ETH Dire Dawa 164851 +758 Nazret ETH Oromia 127842 +759 Gonder ETH Amhara 112249 +760 Dese ETH Amhara 97314 +761 Mekele ETH Tigray 96938 +762 Bahir Dar ETH Amhara 96140 +763 Stanley FLK East Falkland 1636 +764 Suva FJI Central 77366 +765 Quezon PHL National Capital Reg 2173831 +766 Manila PHL National Capital Reg 1581082 +767 Kalookan PHL National Capital Reg 1177604 +768 Davao PHL Southern Mindanao 1147116 +769 Cebu PHL Central Visayas 718821 +770 Zamboanga PHL Western Mindanao 601794 +771 Pasig PHL National Capital Reg 505058 +772 Valenzuela PHL National Capital Reg 485433 +773 Las Piaas PHL National Capital Reg 472780 +774 Antipolo PHL Southern Tagalog 470866 +775 Taguig PHL National Capital Reg 467375 +776 Cagayan de Oro PHL Northern Mindanao 461877 +777 Paraaaque PHL National Capital Reg 449811 +778 Makati PHL National Capital Reg 444867 +779 Bacolod PHL Western Visayas 429076 +780 General Santos PHL Southern Mindanao 411822 +781 Marikina PHL National Capital Reg 391170 +782 Dasmariaas PHL Southern Tagalog 379520 +783 Muntinlupa PHL National Capital Reg 379310 +784 Iloilo PHL Western Visayas 365820 +785 Pasay PHL National Capital Reg 354908 +786 Malabon PHL National Capital Reg 338855 +787 San Jose del Monte PHL Central Luzon 315807 +788 Bacoor PHL Southern Tagalog 305699 +789 Iligan PHL Central Mindanao 285061 +790 Calamba PHL Southern Tagalog 281146 +791 Mandaluyong PHL National Capital Reg 278474 +792 Butuan PHL Caraga 267279 +793 Angeles PHL Central Luzon 263971 +794 Tarlac PHL Central Luzon 262481 +795 Mandaue PHL Central Visayas 259728 +796 Baguio PHL CAR 252386 +797 Batangas PHL Southern Tagalog 247588 +798 Cainta PHL Southern Tagalog 242511 +799 San Pedro PHL Southern Tagalog 231403 +800 Navotas PHL National Capital Reg 230403 +801 Cabanatuan PHL Central Luzon 222859 +802 San Fernando PHL Central Luzon 221857 +803 Lipa PHL Southern Tagalog 218447 +804 Lapu-Lapu PHL Central Visayas 217019 +805 San Pablo PHL Southern Tagalog 207927 +806 Biaan PHL Southern Tagalog 201186 +807 Taytay PHL Southern Tagalog 198183 +808 Lucena PHL Southern Tagalog 196075 +809 Imus PHL Southern Tagalog 195482 +810 Olongapo PHL Central Luzon 194260 +811 Binangonan PHL Southern Tagalog 187691 +812 Santa Rosa PHL Southern Tagalog 185633 +813 Tagum PHL Southern Mindanao 179531 +814 Tacloban PHL Eastern Visayas 178639 +815 Malolos PHL Central Luzon 175291 +816 Mabalacat PHL Central Luzon 171045 +817 Cotabato PHL Central Mindanao 163849 +818 Meycauayan PHL Central Luzon 163037 +819 Puerto Princesa PHL Southern Tagalog 161912 +820 Legazpi PHL Bicol 157010 +821 Silang PHL Southern Tagalog 156137 +822 Ormoc PHL Eastern Visayas 154297 +823 San Carlos PHL Ilocos 154264 +824 Kabankalan PHL Western Visayas 149769 +825 Talisay PHL Central Visayas 148110 +826 Valencia PHL Northern Mindanao 147924 +827 Calbayog PHL Eastern Visayas 147187 +828 Santa Maria PHL Central Luzon 144282 +829 Pagadian PHL Western Mindanao 142515 +830 Cadiz PHL Western Visayas 141954 +831 Bago PHL Western Visayas 141721 +832 Toledo PHL Central Visayas 141174 +833 Naga PHL Bicol 137810 +834 San Mateo PHL Southern Tagalog 135603 +835 Panabo PHL Southern Mindanao 133950 +836 Koronadal PHL Southern Mindanao 133786 +837 Marawi PHL Central Mindanao 131090 +838 Dagupan PHL Ilocos 130328 +839 Sagay PHL Western Visayas 129765 +840 Roxas PHL Western Visayas 126352 +841 Lubao PHL Central Luzon 125699 +842 Digos PHL Southern Mindanao 125171 +843 San Miguel PHL Central Luzon 123824 +844 Malaybalay PHL Northern Mindanao 123672 +845 Tuguegarao PHL Cagayan Valley 120645 +846 Ilagan PHL Cagayan Valley 119990 +847 Baliuag PHL Central Luzon 119675 +848 Surigao PHL Caraga 118534 +849 San Carlos PHL Western Visayas 118259 +850 San Juan del Monte PHL National Capital Reg 117680 +851 Tanauan PHL Southern Tagalog 117539 +852 Concepcion PHL Central Luzon 115171 +853 Rodriguez (Montalban) PHL Southern Tagalog 115167 +854 Sariaya PHL Southern Tagalog 114568 +855 Malasiqui PHL Ilocos 113190 +856 General Mariano Alvarez PHL Southern Tagalog 112446 +857 Urdaneta PHL Ilocos 111582 +858 Hagonoy PHL Central Luzon 111425 +859 San Jose PHL Southern Tagalog 111009 +860 Polomolok PHL Southern Mindanao 110709 +861 Santiago PHL Cagayan Valley 110531 +862 Tanza PHL Southern Tagalog 110517 +863 Ozamis PHL Northern Mindanao 110420 +864 Mexico PHL Central Luzon 109481 +865 San Jose PHL Central Luzon 108254 +866 Silay PHL Western Visayas 107722 +867 General Trias PHL Southern Tagalog 107691 +868 Tabaco PHL Bicol 107166 +869 Cabuyao PHL Southern Tagalog 106630 +870 Calapan PHL Southern Tagalog 105910 +871 Mati PHL Southern Mindanao 105908 +872 Midsayap PHL Central Mindanao 105760 +873 Cauayan PHL Cagayan Valley 103952 +874 Gingoog PHL Northern Mindanao 102379 +875 Dumaguete PHL Central Visayas 102265 +876 San Fernando PHL Ilocos 102082 +877 Arayat PHL Central Luzon 101792 +878 Bayawan (Tulong) PHL Central Visayas 101391 +879 Kidapawan PHL Central Mindanao 101205 +880 Daraga (Locsin) PHL Bicol 101031 +881 Marilao PHL Central Luzon 101017 +882 Malita PHL Southern Mindanao 100000 +883 Dipolog PHL Western Mindanao 99862 +884 Cavite PHL Southern Tagalog 99367 +885 Danao PHL Central Visayas 98781 +886 Bislig PHL Caraga 97860 +887 Talavera PHL Central Luzon 97329 +888 Guagua PHL Central Luzon 96858 +889 Bayambang PHL Ilocos 96609 +890 Nasugbu PHL Southern Tagalog 96113 +891 Baybay PHL Eastern Visayas 95630 +892 Capas PHL Central Luzon 95219 +893 Sultan Kudarat PHL ARMM 94861 +894 Laoag PHL Ilocos 94466 +895 Bayugan PHL Caraga 93623 +896 Malungon PHL Southern Mindanao 93232 +897 Santa Cruz PHL Southern Tagalog 92694 +898 Sorsogon PHL Bicol 92512 +899 Candelaria PHL Southern Tagalog 92429 +900 Ligao PHL Bicol 90603 +901 Torshavn FRO Streymoyar 14542 +902 Libreville GAB Estuaire 419000 +903 Serekunda GMB Kombo St Mary 102600 +904 Banjul GMB Banjul 42326 +905 Tbilisi GEO Tbilisi 1235200 +906 Kutaisi GEO Imereti 240900 +907 Rustavi GEO Kvemo Kartli 155400 +908 Batumi GEO Adzaria [Atdara] 137700 +909 Sohumi GEO Abhasia [Aphazeti] 111700 +910 Accra GHA Greater Accra 1070000 +911 Kumasi GHA Ashanti 385192 +912 Tamale GHA Northern 151069 +913 Tema GHA Greater Accra 109975 +914 Sekondi-Takoradi GHA Western 103653 +915 Gibraltar GIB A 27025 +916 Saint Georges GRD St George 4621 +917 Nuuk GRL Kitaa 13445 +918 Les Abymes GLP Grande-Terre 62947 +919 Basse-Terre GLP Basse-Terre 12433 +920 Tamuning GUM A 9500 +921 Agaaa GUM A 1139 +922 Ciudad de Guatemala GTM Guatemala 823301 +923 Mixco GTM Guatemala 209791 +924 Villa Nueva GTM Guatemala 101295 +925 Quetzaltenango GTM Quetzaltenango 90801 +926 Conakry GIN Conakry 1090610 +927 Bissau GNB Bissau 241000 +928 Georgetown GUY Georgetown 254000 +929 Port-au-Prince HTI Ouest 884472 +930 Carrefour HTI Ouest 290204 +931 Delmas HTI Ouest 240429 +932 Le-Cap-Haitien HTI Nord 102233 +933 Tegucigalpa HND Distrito Central 813900 +934 San Pedro Sula HND Cortes 383900 +935 La Ceiba HND Atlantida 89200 +936 Kowloon and New Kowloon HKG Kowloon and New Kowl 1987996 +937 Victoria HKG Hongkong 1312637 +938 Longyearbyen SJM Lansimaa 1438 +939 Jakarta IDN Jakarta Raya 9604900 +940 Surabaya IDN East Java 2663820 +941 Bandung IDN West Java 2429000 +942 Medan IDN Sumatera Utara 1843919 +943 Palembang IDN Sumatera Selatan 1222764 +944 Tangerang IDN West Java 1198300 +945 Semarang IDN Central Java 1104405 +946 Ujung Pandang IDN Sulawesi Selatan 1060257 +947 Malang IDN East Java 716862 +948 Bandar Lampung IDN Lampung 680332 +949 Bekasi IDN West Java 644300 +950 Padang IDN Sumatera Barat 534474 +951 Surakarta IDN Central Java 518600 +952 Banjarmasin IDN Kalimantan Selatan 482931 +953 Pekan Baru IDN Riau 438638 +954 Denpasar IDN Bali 435000 +955 Yogyakarta IDN Yogyakarta 418944 +956 Pontianak IDN Kalimantan Barat 409632 +957 Samarinda IDN Kalimantan Timur 399175 +958 Jambi IDN Jambi 385201 +959 Depok IDN West Java 365200 +960 Cimahi IDN West Java 344600 +961 Balikpapan IDN Kalimantan Timur 338752 +962 Manado IDN Sulawesi Utara 332288 +963 Mataram IDN Nusa Tenggara Barat 306600 +964 Pekalongan IDN Central Java 301504 +965 Tegal IDN Central Java 289744 +966 Bogor IDN West Java 285114 +967 Ciputat IDN West Java 270800 +968 Pondokgede IDN West Java 263200 +969 Cirebon IDN West Java 254406 +970 Kediri IDN East Java 253760 +971 Ambon IDN Molukit 249312 +972 Jember IDN East Java 218500 +973 Cilacap IDN Central Java 206900 +974 Cimanggis IDN West Java 205100 +975 Pematang Siantar IDN Sumatera Utara 203056 +976 Purwokerto IDN Central Java 202500 +977 Ciomas IDN West Java 187400 +978 Tasikmalaya IDN West Java 179800 +979 Madiun IDN East Java 171532 +980 Bengkulu IDN Bengkulu 146439 +981 Karawang IDN West Java 145000 +982 Banda Aceh IDN Aceh 143409 +983 Palu IDN Sulawesi Tengah 142800 +984 Pasuruan IDN East Java 134019 +985 Kupang IDN Nusa Tenggara Timur 129300 +986 Tebing Tinggi IDN Sumatera Utara 129300 +987 Percut Sei Tuan IDN Sumatera Utara 129000 +988 Binjai IDN Sumatera Utara 127222 +989 Sukabumi IDN West Java 125766 +990 Waru IDN East Java 124300 +991 Pangkal Pinang IDN Sumatera Selatan 124000 +992 Magelang IDN Central Java 123800 +993 Blitar IDN East Java 122600 +994 Serang IDN West Java 122400 +995 Probolinggo IDN East Java 120770 +996 Cilegon IDN West Java 117000 +997 Cianjur IDN West Java 114300 +998 Ciparay IDN West Java 111500 +999 Lhokseumawe IDN Aceh 109600 +1000 Taman IDN East Java 107000 +1001 Depok IDN Yogyakarta 106800 +1002 Citeureup IDN West Java 105100 +1003 Pemalang IDN Central Java 103500 +1004 Klaten IDN Central Java 103300 +1005 Salatiga IDN Central Java 103000 +1006 Cibinong IDN West Java 101300 +1007 Palangka Raya IDN Kalimantan Tengah 99693 +1008 Mojokerto IDN East Java 96626 +1009 Purwakarta IDN West Java 95900 +1010 Garut IDN West Java 95800 +1011 Kudus IDN Central Java 95300 +1012 Kendari IDN Sulawesi Tenggara 94800 +1013 Jaya Pura IDN West Irian 94700 +1014 Gorontalo IDN Sulawesi Utara 94058 +1015 Majalaya IDN West Java 93200 +1016 Pondok Aren IDN West Java 92700 +1017 Jombang IDN East Java 92600 +1018 Sunggal IDN Sumatera Utara 92300 +1019 Batam IDN Riau 91871 +1020 Padang Sidempuan IDN Sumatera Utara 91200 +1021 Sawangan IDN West Java 91100 +1022 Banyuwangi IDN East Java 89900 +1023 Tanjung Pinang IDN Riau 89900 +1024 Mumbai (Bombay) IND Maharashtra 10500000 +1025 Delhi IND Delhi 7206704 +1026 Calcutta [Kolkata] IND West Bengali 4399819 +1027 Chennai (Madras) IND Tamil Nadu 3841396 +1028 Hyderabad IND Andhra Pradesh 2964638 +1029 Ahmedabad IND Gujarat 2876710 +1030 Bangalore IND Karnataka 2660088 +1031 Kanpur IND Uttar Pradesh 1874409 +1032 Nagpur IND Maharashtra 1624752 +1033 Lucknow IND Uttar Pradesh 1619115 +1034 Pune IND Maharashtra 1566651 +1035 Surat IND Gujarat 1498817 +1036 Jaipur IND Rajasthan 1458483 +1037 Indore IND Madhya Pradesh 1091674 +1038 Bhopal IND Madhya Pradesh 1062771 +1039 Ludhiana IND Punjab 1042740 +1040 Vadodara (Baroda) IND Gujarat 1031346 +1041 Kalyan IND Maharashtra 1014557 +1042 Madurai IND Tamil Nadu 977856 +1043 Haora (Howrah) IND West Bengali 950435 +1044 Varanasi (Benares) IND Uttar Pradesh 929270 +1045 Patna IND Bihar 917243 +1046 Srinagar IND Jammu and Kashmir 892506 +1047 Agra IND Uttar Pradesh 891790 +1048 Coimbatore IND Tamil Nadu 816321 +1049 Thane (Thana) IND Maharashtra 803389 +1050 Allahabad IND Uttar Pradesh 792858 +1051 Meerut IND Uttar Pradesh 753778 +1052 Vishakhapatnam IND Andhra Pradesh 752037 +1053 Jabalpur IND Madhya Pradesh 741927 +1054 Amritsar IND Punjab 708835 +1055 Faridabad IND Haryana 703592 +1056 Vijayawada IND Andhra Pradesh 701827 +1057 Gwalior IND Madhya Pradesh 690765 +1058 Jodhpur IND Rajasthan 666279 +1059 Nashik (Nasik) IND Maharashtra 656925 +1060 Hubli-Dharwad IND Karnataka 648298 +1061 Solapur (Sholapur) IND Maharashtra 604215 +1062 Ranchi IND Jharkhand 599306 +1063 Bareilly IND Uttar Pradesh 587211 +1064 Guwahati (Gauhati) IND Assam 584342 +1065 Shambajinagar (Aurangabad) IND Maharashtra 573272 +1066 Cochin (Kochi) IND Kerala 564589 +1067 Rajkot IND Gujarat 559407 +1068 Kota IND Rajasthan 537371 +1069 Thiruvananthapuram (Trivandrum IND Kerala 524006 +1070 Pimpri-Chinchwad IND Maharashtra 517083 +1071 Jalandhar (Jullundur) IND Punjab 509510 +1072 Gorakhpur IND Uttar Pradesh 505566 +1073 Chandigarh IND Chandigarh 504094 +1074 Mysore IND Karnataka 480692 +1075 Aligarh IND Uttar Pradesh 480520 +1076 Guntur IND Andhra Pradesh 471051 +1077 Jamshedpur IND Jharkhand 460577 +1078 Ghaziabad IND Uttar Pradesh 454156 +1079 Warangal IND Andhra Pradesh 447657 +1080 Raipur IND Chhatisgarh 438639 +1081 Moradabad IND Uttar Pradesh 429214 +1082 Durgapur IND West Bengali 425836 +1083 Amravati IND Maharashtra 421576 +1084 Calicut (Kozhikode) IND Kerala 419831 +1085 Bikaner IND Rajasthan 416289 +1086 Bhubaneswar IND Orissa 411542 +1087 Kolhapur IND Maharashtra 406370 +1088 Kataka (Cuttack) IND Orissa 403418 +1089 Ajmer IND Rajasthan 402700 +1090 Bhavnagar IND Gujarat 402338 +1091 Tiruchirapalli IND Tamil Nadu 387223 +1092 Bhilai IND Chhatisgarh 386159 +1093 Bhiwandi IND Maharashtra 379070 +1094 Saharanpur IND Uttar Pradesh 374945 +1095 Ulhasnagar IND Maharashtra 369077 +1096 Salem IND Tamil Nadu 366712 +1097 Ujjain IND Madhya Pradesh 362266 +1098 Malegaon IND Maharashtra 342595 +1099 Jamnagar IND Gujarat 341637 +1100 Bokaro Steel City IND Jharkhand 333683 +1101 Akola IND Maharashtra 328034 +1102 Belgaum IND Karnataka 326399 +1103 Rajahmundry IND Andhra Pradesh 324851 +1104 Nellore IND Andhra Pradesh 316606 +1105 Udaipur IND Rajasthan 308571 +1106 New Bombay IND Maharashtra 307297 +1107 Bhatpara IND West Bengali 304952 +1108 Gulbarga IND Karnataka 304099 +1109 New Delhi IND Delhi 301297 +1110 Jhansi IND Uttar Pradesh 300850 +1111 Gaya IND Bihar 291675 +1112 Kakinada IND Andhra Pradesh 279980 +1113 Dhule (Dhulia) IND Maharashtra 278317 +1114 Panihati IND West Bengali 275990 +1115 Nanded (Nander) IND Maharashtra 275083 +1116 Mangalore IND Karnataka 273304 +1117 Dehra Dun IND Uttaranchal 270159 +1118 Kamarhati IND West Bengali 266889 +1119 Davangere IND Karnataka 266082 +1120 Asansol IND West Bengali 262188 +1121 Bhagalpur IND Bihar 253225 +1122 Bellary IND Karnataka 245391 +1123 Barddhaman (Burdwan) IND West Bengali 245079 +1124 Rampur IND Uttar Pradesh 243742 +1125 Jalgaon IND Maharashtra 242193 +1126 Muzaffarpur IND Bihar 241107 +1127 Nizamabad IND Andhra Pradesh 241034 +1128 Muzaffarnagar IND Uttar Pradesh 240609 +1129 Patiala IND Punjab 238368 +1130 Shahjahanpur IND Uttar Pradesh 237713 +1131 Kurnool IND Andhra Pradesh 236800 +1132 Tiruppur (Tirupper) IND Tamil Nadu 235661 +1133 Rohtak IND Haryana 233400 +1134 South Dum Dum IND West Bengali 232811 +1135 Mathura IND Uttar Pradesh 226691 +1136 Chandrapur IND Maharashtra 226105 +1137 Barahanagar (Baranagar) IND West Bengali 224821 +1138 Darbhanga IND Bihar 218391 +1139 Siliguri (Shiliguri) IND West Bengali 216950 +1140 Raurkela IND Orissa 215489 +1141 Ambattur IND Tamil Nadu 215424 +1142 Panipat IND Haryana 215218 +1143 Firozabad IND Uttar Pradesh 215128 +1144 Ichalkaranji IND Maharashtra 214950 +1145 Jammu IND Jammu and Kashmir 214737 +1146 Ramagundam IND Andhra Pradesh 214384 +1147 Eluru IND Andhra Pradesh 212866 +1148 Brahmapur IND Orissa 210418 +1149 Alwar IND Rajasthan 205086 +1150 Pondicherry IND Pondicherry 203065 +1151 Thanjavur IND Tamil Nadu 202013 +1152 Bihar Sharif IND Bihar 201323 +1153 Tuticorin IND Tamil Nadu 199854 +1154 Imphal IND Manipur 198535 +1155 Latur IND Maharashtra 197408 +1156 Sagar IND Madhya Pradesh 195346 +1157 Farrukhabad-cum-Fatehgarh IND Uttar Pradesh 194567 +1158 Sangli IND Maharashtra 193197 +1159 Parbhani IND Maharashtra 190255 +1160 Nagar Coil IND Tamil Nadu 190084 +1161 Bijapur IND Karnataka 186939 +1162 Kukatpalle IND Andhra Pradesh 185378 +1163 Bally IND West Bengali 184474 +1164 Bhilwara IND Rajasthan 183965 +1165 Ratlam IND Madhya Pradesh 183375 +1166 Avadi IND Tamil Nadu 183215 +1167 Dindigul IND Tamil Nadu 182477 +1168 Ahmadnagar IND Maharashtra 181339 +1169 Bilaspur IND Chhatisgarh 179833 +1170 Shimoga IND Karnataka 179258 +1171 Kharagpur IND West Bengali 177989 +1172 Mira Bhayandar IND Maharashtra 175372 +1173 Vellore IND Tamil Nadu 175061 +1174 Jalna IND Maharashtra 174985 +1175 Burnpur IND West Bengali 174933 +1176 Anantapur IND Andhra Pradesh 174924 +1177 Allappuzha (Alleppey) IND Kerala 174666 +1178 Tirupati IND Andhra Pradesh 174369 +1179 Karnal IND Haryana 173751 +1180 Burhanpur IND Madhya Pradesh 172710 +1181 Hisar (Hissar) IND Haryana 172677 +1182 Tiruvottiyur IND Tamil Nadu 172562 +1183 Mirzapur-cum-Vindhyachal IND Uttar Pradesh 169336 +1184 Secunderabad IND Andhra Pradesh 167461 +1185 Nadiad IND Gujarat 167051 +1186 Dewas IND Madhya Pradesh 164364 +1187 Murwara (Katni) IND Madhya Pradesh 163431 +1188 Ganganagar IND Rajasthan 161482 +1189 Vizianagaram IND Andhra Pradesh 160359 +1190 Erode IND Tamil Nadu 159232 +1191 Machilipatnam (Masulipatam) IND Andhra Pradesh 159110 +1192 Bhatinda (Bathinda) IND Punjab 159042 +1193 Raichur IND Karnataka 157551 +1194 Agartala IND Tripura 157358 +1195 Arrah (Ara) IND Bihar 157082 +1196 Satna IND Madhya Pradesh 156630 +1197 Lalbahadur Nagar IND Andhra Pradesh 155500 +1198 Aizawl IND Mizoram 155240 +1199 Uluberia IND West Bengali 155172 +1200 Katihar IND Bihar 154367 +1201 Cuddalore IND Tamil Nadu 153086 +1202 Hugli-Chinsurah IND West Bengali 151806 +1203 Dhanbad IND Jharkhand 151789 +1204 Raiganj IND West Bengali 151045 +1205 Sambhal IND Uttar Pradesh 150869 +1206 Durg IND Chhatisgarh 150645 +1207 Munger (Monghyr) IND Bihar 150112 +1208 Kanchipuram IND Tamil Nadu 150100 +1209 North Dum Dum IND West Bengali 149965 +1210 Karimnagar IND Andhra Pradesh 148583 +1211 Bharatpur IND Rajasthan 148519 +1212 Sikar IND Rajasthan 148272 +1213 Hardwar (Haridwar) IND Uttaranchal 147305 +1214 Dabgram IND West Bengali 147217 +1215 Morena IND Madhya Pradesh 147124 +1216 Noida IND Uttar Pradesh 146514 +1217 Hapur IND Uttar Pradesh 146262 +1218 Bhusawal IND Maharashtra 145143 +1219 Khandwa IND Madhya Pradesh 145133 +1220 Yamuna Nagar IND Haryana 144346 +1221 Sonipat (Sonepat) IND Haryana 143922 +1222 Tenali IND Andhra Pradesh 143726 +1223 Raurkela Civil Township IND Orissa 140408 +1224 Kollam (Quilon) IND Kerala 139852 +1225 Kumbakonam IND Tamil Nadu 139483 +1226 Ingraj Bazar (English Bazar) IND West Bengali 139204 +1227 Timkur IND Karnataka 138903 +1228 Amroha IND Uttar Pradesh 137061 +1229 Serampore IND West Bengali 137028 +1230 Chapra IND Bihar 136877 +1231 Pali IND Rajasthan 136842 +1232 Maunath Bhanjan IND Uttar Pradesh 136697 +1233 Adoni IND Andhra Pradesh 136182 +1234 Jaunpur IND Uttar Pradesh 136062 +1235 Tirunelveli IND Tamil Nadu 135825 +1236 Bahraich IND Uttar Pradesh 135400 +1237 Gadag Betigeri IND Karnataka 134051 +1238 Proddatur IND Andhra Pradesh 133914 +1239 Chittoor IND Andhra Pradesh 133462 +1240 Barrackpur IND West Bengali 133265 +1241 Bharuch (Broach) IND Gujarat 133102 +1242 Naihati IND West Bengali 132701 +1243 Shillong IND Meghalaya 131719 +1244 Sambalpur IND Orissa 131138 +1245 Junagadh IND Gujarat 130484 +1246 Rae Bareli IND Uttar Pradesh 129904 +1247 Rewa IND Madhya Pradesh 128981 +1248 Gurgaon IND Haryana 128608 +1249 Khammam IND Andhra Pradesh 127992 +1250 Bulandshahr IND Uttar Pradesh 127201 +1251 Navsari IND Gujarat 126089 +1252 Malkajgiri IND Andhra Pradesh 126066 +1253 Midnapore (Medinipur) IND West Bengali 125498 +1254 Miraj IND Maharashtra 125407 +1255 Raj Nandgaon IND Chhatisgarh 125371 +1256 Alandur IND Tamil Nadu 125244 +1257 Puri IND Orissa 125199 +1258 Navadwip IND West Bengali 125037 +1259 Sirsa IND Haryana 125000 +1260 Korba IND Chhatisgarh 124501 +1261 Faizabad IND Uttar Pradesh 124437 +1262 Etawah IND Uttar Pradesh 124072 +1263 Pathankot IND Punjab 123930 +1264 Gandhinagar IND Gujarat 123359 +1265 Palghat (Palakkad) IND Kerala 123289 +1266 Veraval IND Gujarat 123000 +1267 Hoshiarpur IND Punjab 122705 +1268 Ambala IND Haryana 122596 +1269 Sitapur IND Uttar Pradesh 121842 +1270 Bhiwani IND Haryana 121629 +1271 Cuddapah IND Andhra Pradesh 121463 +1272 Bhimavaram IND Andhra Pradesh 121314 +1273 Krishnanagar IND West Bengali 121110 +1274 Chandannagar IND West Bengali 120378 +1275 Mandya IND Karnataka 120265 +1276 Dibrugarh IND Assam 120127 +1277 Nandyal IND Andhra Pradesh 119813 +1278 Balurghat IND West Bengali 119796 +1279 Neyveli IND Tamil Nadu 118080 +1280 Fatehpur IND Uttar Pradesh 117675 +1281 Mahbubnagar IND Andhra Pradesh 116833 +1282 Budaun IND Uttar Pradesh 116695 +1283 Porbandar IND Gujarat 116671 +1284 Silchar IND Assam 115483 +1285 Berhampore (Baharampur) IND West Bengali 115144 +1286 Purnea (Purnia) IND Jharkhand 114912 +1287 Bankura IND West Bengali 114876 +1288 Rajapalaiyam IND Tamil Nadu 114202 +1289 Titagarh IND West Bengali 114085 +1290 Halisahar IND West Bengali 114028 +1291 Hathras IND Uttar Pradesh 113285 +1292 Bhir (Bid) IND Maharashtra 112434 +1293 Pallavaram IND Tamil Nadu 111866 +1294 Anand IND Gujarat 110266 +1295 Mango IND Jharkhand 110024 +1296 Santipur IND West Bengali 109956 +1297 Bhind IND Madhya Pradesh 109755 +1298 Gondiya IND Maharashtra 109470 +1299 Tiruvannamalai IND Tamil Nadu 109196 +1300 Yeotmal (Yavatmal) IND Maharashtra 108578 +1301 Kulti-Barakar IND West Bengali 108518 +1302 Moga IND Punjab 108304 +1303 Shivapuri IND Madhya Pradesh 108277 +1304 Bidar IND Karnataka 108016 +1305 Guntakal IND Andhra Pradesh 107592 +1306 Unnao IND Uttar Pradesh 107425 +1307 Barasat IND West Bengali 107365 +1308 Tambaram IND Tamil Nadu 107187 +1309 Abohar IND Punjab 107163 +1310 Pilibhit IND Uttar Pradesh 106605 +1311 Valparai IND Tamil Nadu 106523 +1312 Gonda IND Uttar Pradesh 106078 +1313 Surendranagar IND Gujarat 105973 +1314 Qutubullapur IND Andhra Pradesh 105380 +1315 Beawar IND Rajasthan 105363 +1316 Hindupur IND Andhra Pradesh 104651 +1317 Gandhidham IND Gujarat 104585 +1318 Haldwani-cum-Kathgodam IND Uttaranchal 104195 +1319 Tellicherry (Thalassery) IND Kerala 103579 +1320 Wardha IND Maharashtra 102985 +1321 Rishra IND West Bengali 102649 +1322 Bhuj IND Gujarat 102176 +1323 Modinagar IND Uttar Pradesh 101660 +1324 Gudivada IND Andhra Pradesh 101656 +1325 Basirhat IND West Bengali 101409 +1326 Uttarpara-Kotrung IND West Bengali 100867 +1327 Ongole IND Andhra Pradesh 100836 +1328 North Barrackpur IND West Bengali 100513 +1329 Guna IND Madhya Pradesh 100490 +1330 Haldia IND West Bengali 100347 +1331 Habra IND West Bengali 100223 +1332 Kanchrapara IND West Bengali 100194 +1333 Tonk IND Rajasthan 100079 +1334 Champdani IND West Bengali 98818 +1335 Orai IND Uttar Pradesh 98640 +1336 Pudukkottai IND Tamil Nadu 98619 +1337 Sasaram IND Bihar 98220 +1338 Hazaribag IND Jharkhand 97712 +1339 Palayankottai IND Tamil Nadu 97662 +1340 Banda IND Uttar Pradesh 97227 +1341 Godhra IND Gujarat 96813 +1342 Hospet IND Karnataka 96322 +1343 Ashoknagar-Kalyangarh IND West Bengali 96315 +1344 Achalpur IND Maharashtra 96216 +1345 Patan IND Gujarat 96109 +1346 Mandasor IND Madhya Pradesh 95758 +1347 Damoh IND Madhya Pradesh 95661 +1348 Satara IND Maharashtra 95133 +1349 Meerut Cantonment IND Uttar Pradesh 94876 +1350 Dehri IND Bihar 94526 +1351 Delhi Cantonment IND Delhi 94326 +1352 Chhindwara IND Madhya Pradesh 93731 +1353 Bansberia IND West Bengali 93447 +1354 Nagaon IND Assam 93350 +1355 Kanpur Cantonment IND Uttar Pradesh 93109 +1356 Vidisha IND Madhya Pradesh 92917 +1357 Bettiah IND Bihar 92583 +1358 Purulia IND Jharkhand 92574 +1359 Hassan IND Karnataka 90803 +1360 Ambala Sadar IND Haryana 90712 +1361 Baidyabati IND West Bengali 90601 +1362 Morvi IND Gujarat 90357 +1363 Raigarh IND Chhatisgarh 89166 +1364 Vejalpur IND Gujarat 89053 +1365 Baghdad IRQ Baghdad 4336000 +1366 Mosul IRQ Ninawa 879000 +1367 Irbil IRQ Irbil 485968 +1368 Kirkuk IRQ al-Tamim 418624 +1369 Basra IRQ Basra 406296 +1370 al-Sulaymaniya IRQ al-Sulaymaniya 364096 +1371 al-Najaf IRQ al-Najaf 309010 +1372 Karbala IRQ Karbala 296705 +1373 al-Hilla IRQ Babil 268834 +1374 al-Nasiriya IRQ DhiQar 265937 +1375 al-Amara IRQ Maysan 208797 +1376 al-Diwaniya IRQ al-Qadisiya 196519 +1377 al-Ramadi IRQ al-Anbar 192556 +1378 al-Kut IRQ Wasit 183183 +1379 Baquba IRQ Diyala 114516 +1380 Teheran IRN Teheran 6758845 +1381 Mashhad IRN Khorasan 1887405 +1382 Esfahan IRN Esfahan 1266072 +1383 Tabriz IRN East Azerbaidzan 1191043 +1384 Shiraz IRN Fars 1053025 +1385 Karaj IRN Teheran 940968 +1386 Ahvaz IRN Khuzestan 804980 +1387 Qom IRN Qom 777677 +1388 Kermanshah IRN Kermanshah 692986 +1389 Urmia IRN West Azerbaidzan 435200 +1390 Zahedan IRN Sistan va Baluchesta 419518 +1391 Rasht IRN Gilan 417748 +1392 Hamadan IRN Hamadan 401281 +1393 Kerman IRN Kerman 384991 +1394 Arak IRN Markazi 380755 +1395 Ardebil IRN Ardebil 340386 +1396 Yazd IRN Yazd 326776 +1397 Qazvin IRN Qazvin 291117 +1398 Zanjan IRN Zanjan 286295 +1399 Sanandaj IRN Kordestan 277808 +1400 Bandar-e-Abbas IRN Hormozgan 273578 +1401 Khorramabad IRN Lorestan 272815 +1402 Eslamshahr IRN Teheran 265450 +1403 Borujerd IRN Lorestan 217804 +1404 Abadan IRN Khuzestan 206073 +1405 Dezful IRN Khuzestan 202639 +1406 Kashan IRN Esfahan 201372 +1407 Sari IRN Mazandaran 195882 +1408 Gorgan IRN Golestan 188710 +1409 Najafabad IRN Esfahan 178498 +1410 Sabzevar IRN Khorasan 170738 +1411 Khomeynishahr IRN Esfahan 165888 +1412 Amol IRN Mazandaran 159092 +1413 Neyshabur IRN Khorasan 158847 +1414 Babol IRN Mazandaran 158346 +1415 Khoy IRN West Azerbaidzan 148944 +1416 Malayer IRN Hamadan 144373 +1417 Bushehr IRN Bushehr 143641 +1418 Qaemshahr IRN Mazandaran 143286 +1419 Qarchak IRN Teheran 142690 +1420 Qods IRN Teheran 138278 +1421 Sirjan IRN Kerman 135024 +1422 Bojnurd IRN Khorasan 134835 +1423 Maragheh IRN East Azerbaidzan 132318 +1424 Birjand IRN Khorasan 127608 +1425 Ilam IRN Ilam 126346 +1426 Bukan IRN West Azerbaidzan 120020 +1427 Masjed-e-Soleyman IRN Khuzestan 116883 +1428 Saqqez IRN Kordestan 115394 +1429 Gonbad-e Qabus IRN Mazandaran 111253 +1430 Saveh IRN Qom 111245 +1431 Mahabad IRN West Azerbaidzan 107799 +1432 Varamin IRN Teheran 107233 +1433 Andimeshk IRN Khuzestan 106923 +1434 Khorramshahr IRN Khuzestan 105636 +1435 Shahrud IRN Semnan 104765 +1436 Marv Dasht IRN Fars 103579 +1437 Zabol IRN Sistan va Baluchesta 100887 +1438 Shahr-e Kord IRN Chaharmahal va Bakht 100477 +1439 Bandar-e Anzali IRN Gilan 98500 +1440 Rafsanjan IRN Kerman 98300 +1441 Marand IRN East Azerbaidzan 96400 +1442 Torbat-e Heydariyeh IRN Khorasan 94600 +1443 Jahrom IRN Fars 94200 +1444 Semnan IRN Semnan 91045 +1445 Miandoab IRN West Azerbaidzan 90100 +1446 Qomsheh IRN Esfahan 89800 +1447 Dublin IRL Leinster 481854 +1448 Cork IRL Munster 127187 +1449 Reykjavik ISL Hofuoborgarsvaoi 109184 +1450 Jerusalem ISR Jerusalem 633700 +1451 Tel Aviv-Jaffa ISR Tel Aviv 348100 +1452 Haifa ISR Haifa 265700 +1453 Rishon Le Ziyyon ISR Ha Merkaz 188200 +1454 Beerseba ISR Ha Darom 163700 +1455 Holon ISR Tel Aviv 163100 +1456 Petah Tiqwa ISR Ha Merkaz 159400 +1457 Ashdod ISR Ha Darom 155800 +1458 Netanya ISR Ha Merkaz 154900 +1459 Bat Yam ISR Tel Aviv 137000 +1460 Bene Beraq ISR Tel Aviv 133900 +1461 Ramat Gan ISR Tel Aviv 126900 +1462 Ashqelon ISR Ha Darom 92300 +1463 Rehovot ISR Ha Merkaz 90300 +1464 Roma ITA Latium 2643581 +1465 Milano ITA Lombardia 1300977 +1466 Napoli ITA Campania 1002619 +1467 Torino ITA Piemonte 903705 +1468 Palermo ITA Sisilia 683794 +1469 Genova ITA Liguria 636104 +1470 Bologna ITA Emilia-Romagna 381161 +1471 Firenze ITA Toscana 376662 +1472 Catania ITA Sisilia 337862 +1473 Bari ITA Apulia 331848 +1474 Venezia ITA Veneto 277305 +1475 Messina ITA Sisilia 259156 +1476 Verona ITA Veneto 255268 +1477 Trieste ITA Friuli-Venezia Giuli 216459 +1478 Padova ITA Veneto 211391 +1479 Taranto ITA Apulia 208214 +1480 Brescia ITA Lombardia 191317 +1481 Reggio di Calabria ITA Calabria 179617 +1482 Modena ITA Emilia-Romagna 176022 +1483 Prato ITA Toscana 172473 +1484 Parma ITA Emilia-Romagna 168717 +1485 Cagliari ITA Sardinia 165926 +1486 Livorno ITA Toscana 161673 +1487 Perugia ITA Umbria 156673 +1488 Foggia ITA Apulia 154891 +1489 Reggio nell Emilia ITA Emilia-Romagna 143664 +1490 Salerno ITA Campania 142055 +1491 Ravenna ITA Emilia-Romagna 138418 +1492 Ferrara ITA Emilia-Romagna 132127 +1493 Rimini ITA Emilia-Romagna 131062 +1494 Syrakusa ITA Sisilia 126282 +1495 Sassari ITA Sardinia 120803 +1496 Monza ITA Lombardia 119516 +1497 Bergamo ITA Lombardia 117837 +1498 Pescara ITA Abruzzit 115698 +1499 Latina ITA Latium 114099 +1500 Vicenza ITA Veneto 109738 +1501 Terni ITA Umbria 107770 +1502 Forli ITA Emilia-Romagna 107475 +1503 Trento ITA Trentino-Alto Adige 104906 +1504 Novara ITA Piemonte 102037 +1505 Piacenza ITA Emilia-Romagna 98384 +1506 Ancona ITA Marche 98329 +1507 Lecce ITA Apulia 98208 +1508 Bolzano ITA Trentino-Alto Adige 97232 +1509 Catanzaro ITA Calabria 96700 +1510 La Spezia ITA Liguria 95504 +1511 Udine ITA Friuli-Venezia Giuli 94932 +1512 Torre del Greco ITA Campania 94505 +1513 Andria ITA Apulia 94443 +1514 Brindisi ITA Apulia 93454 +1515 Giugliano in Campania ITA Campania 93286 +1516 Pisa ITA Toscana 92379 +1517 Barletta ITA Apulia 91904 +1518 Arezzo ITA Toscana 91729 +1519 Alessandria ITA Piemonte 90289 +1520 Cesena ITA Emilia-Romagna 89852 +1521 Pesaro ITA Marche 88987 +1522 Dili TMP Dili 47900 +1523 Wien AUT Wien 1608144 +1524 Graz AUT Steiermark 240967 +1525 Linz AUT North Austria 188022 +1526 Salzburg AUT Salzburg 144247 +1527 Innsbruck AUT Tiroli 111752 +1528 Klagenfurt AUT Karnten 91141 +1529 Spanish Town JAM St. Catherine 110379 +1530 Kingston JAM St. Andrew 103962 +1531 Portmore JAM St. Andrew 99799 +1532 Tokyo JPN Tokyo-to 7980230 +1533 Jokohama [Yokohama] JPN Kanagawa 3339594 +1534 Osaka JPN Osaka 2595674 +1535 Nagoya JPN Aichi 2154376 +1536 Sapporo JPN Hokkaido 1790886 +1537 Kioto JPN Kyoto 1461974 +1538 Kobe JPN Hyogo 1425139 +1539 Fukuoka JPN Fukuoka 1308379 +1540 Kawasaki JPN Kanagawa 1217359 +1541 Hiroshima JPN Hiroshima 1119117 +1542 Kitakyushu JPN Fukuoka 1016264 +1543 Sendai JPN Miyagi 989975 +1544 Chiba JPN Chiba 863930 +1545 Sakai JPN Osaka 797735 +1546 Kumamoto JPN Kumamoto 656734 +1547 Okayama JPN Okayama 624269 +1548 Sagamihara JPN Kanagawa 586300 +1549 Hamamatsu JPN Shizuoka 568796 +1550 Kagoshima JPN Kagoshima 549977 +1551 Funabashi JPN Chiba 545299 +1552 Higashiosaka JPN Osaka 517785 +1553 Hachioji JPN Tokyo-to 513451 +1554 Niigata JPN Niigata 497464 +1555 Amagasaki JPN Hyogo 481434 +1556 Himeji JPN Hyogo 475167 +1557 Shizuoka JPN Shizuoka 473854 +1558 Urawa JPN Saitama 469675 +1559 Matsuyama JPN Ehime 466133 +1560 Matsudo JPN Chiba 461126 +1561 Kanazawa JPN Ishikawa 455386 +1562 Kawaguchi JPN Saitama 452155 +1563 Ichikawa JPN Chiba 441893 +1564 Omiya JPN Saitama 441649 +1565 Utsunomiya JPN Tochigi 440353 +1566 Oita JPN Oita 433401 +1567 Nagasaki JPN Nagasaki 432759 +1568 Yokosuka JPN Kanagawa 430200 +1569 Kurashiki JPN Okayama 425103 +1570 Gifu JPN Gifu 408007 +1571 Hirakata JPN Osaka 403151 +1572 Nishinomiya JPN Hyogo 397618 +1573 Toyonaka JPN Osaka 396689 +1574 Wakayama JPN Wakayama 391233 +1575 Fukuyama JPN Hiroshima 376921 +1576 Fujisawa JPN Kanagawa 372840 +1577 Asahikawa JPN Hokkaido 364813 +1578 Machida JPN Tokyo-to 364197 +1579 Nara JPN Nara 362812 +1580 Takatsuki JPN Osaka 361747 +1581 Iwaki JPN Fukushima 361737 +1582 Nagano JPN Nagano 361391 +1583 Toyohashi JPN Aichi 360066 +1584 Toyota JPN Aichi 346090 +1585 Suita JPN Osaka 345750 +1586 Takamatsu JPN Kagawa 332471 +1587 Koriyama JPN Fukushima 330335 +1588 Okazaki JPN Aichi 328711 +1589 Kawagoe JPN Saitama 327211 +1590 Tokorozawa JPN Saitama 325809 +1591 Toyama JPN Toyama 325790 +1592 Kochi JPN Kochi 324710 +1593 Kashiwa JPN Chiba 320296 +1594 Akita JPN Akita 314440 +1595 Miyazaki JPN Miyazaki 303784 +1596 Koshigaya JPN Saitama 301446 +1597 Naha JPN Okinawa 299851 +1598 Aomori JPN Aomori 295969 +1599 Hakodate JPN Hokkaido 294788 +1600 Akashi JPN Hyogo 292253 +1601 Yokkaichi JPN Mie 288173 +1602 Fukushima JPN Fukushima 287525 +1603 Morioka JPN Iwate 287353 +1604 Maebashi JPN Gumma 284473 +1605 Kasugai JPN Aichi 282348 +1606 Otsu JPN Shiga 282070 +1607 Ichihara JPN Chiba 279280 +1608 Yao JPN Osaka 276421 +1609 Ichinomiya JPN Aichi 270828 +1610 Tokushima JPN Tokushima 269649 +1611 Kakogawa JPN Hyogo 266281 +1612 Ibaraki JPN Osaka 261020 +1613 Neyagawa JPN Osaka 257315 +1614 Shimonoseki JPN Yamaguchi 257263 +1615 Yamagata JPN Yamagata 255617 +1616 Fukui JPN Fukui 254818 +1617 Hiratsuka JPN Kanagawa 254207 +1618 Mito JPN Ibaragi 246559 +1619 Sasebo JPN Nagasaki 244240 +1620 Hachinohe JPN Aomori 242979 +1621 Takasaki JPN Gumma 239124 +1622 Shimizu JPN Shizuoka 239123 +1623 Kurume JPN Fukuoka 235611 +1624 Fuji JPN Shizuoka 231527 +1625 Soka JPN Saitama 222768 +1626 Fuchu JPN Tokyo-to 220576 +1627 Chigasaki JPN Kanagawa 216015 +1628 Atsugi JPN Kanagawa 212407 +1629 Numazu JPN Shizuoka 211382 +1630 Ageo JPN Saitama 209442 +1631 Yamato JPN Kanagawa 208234 +1632 Matsumoto JPN Nagano 206801 +1633 Kure JPN Hiroshima 206504 +1634 Takarazuka JPN Hyogo 205993 +1635 Kasukabe JPN Saitama 201838 +1636 Chofu JPN Tokyo-to 201585 +1637 Odawara JPN Kanagawa 200171 +1638 Kofu JPN Yamanashi 199753 +1639 Kushiro JPN Hokkaido 197608 +1640 Kishiwada JPN Osaka 197276 +1641 Hitachi JPN Ibaragi 196622 +1642 Nagaoka JPN Niigata 192407 +1643 Itami JPN Hyogo 190886 +1644 Uji JPN Kyoto 188735 +1645 Suzuka JPN Mie 184061 +1646 Hirosaki JPN Aomori 177522 +1647 Ube JPN Yamaguchi 175206 +1648 Kodaira JPN Tokyo-to 174984 +1649 Takaoka JPN Toyama 174380 +1650 Obihiro JPN Hokkaido 173685 +1651 Tomakomai JPN Hokkaido 171958 +1652 Saga JPN Saga 170034 +1653 Sakura JPN Chiba 168072 +1654 Kamakura JPN Kanagawa 167661 +1655 Mitaka JPN Tokyo-to 167268 +1656 Izumi JPN Osaka 166979 +1657 Hino JPN Tokyo-to 166770 +1658 Hadano JPN Kanagawa 166512 +1659 Ashikaga JPN Tochigi 165243 +1660 Tsu JPN Mie 164543 +1661 Sayama JPN Saitama 162472 +1662 Yachiyo JPN Chiba 161222 +1663 Tsukuba JPN Ibaragi 160768 +1664 Tachikawa JPN Tokyo-to 159430 +1665 Kumagaya JPN Saitama 157171 +1666 Moriguchi JPN Osaka 155941 +1667 Otaru JPN Hokkaido 155784 +1668 Anjo JPN Aichi 153823 +1669 Narashino JPN Chiba 152849 +1670 Oyama JPN Tochigi 152820 +1671 Ogaki JPN Gifu 151758 +1672 Matsue JPN Shimane 149821 +1673 Kawanishi JPN Hyogo 149794 +1674 Hitachinaka JPN Tokyo-to 148006 +1675 Niiza JPN Saitama 147744 +1676 Nagareyama JPN Chiba 147738 +1677 Tottori JPN Tottori 147523 +1678 Tama JPN Ibaragi 146712 +1679 Iruma JPN Saitama 145922 +1680 Ota JPN Gumma 145317 +1681 Omuta JPN Fukuoka 142889 +1682 Komaki JPN Aichi 139827 +1683 Ome JPN Tokyo-to 139216 +1684 Kadoma JPN Osaka 138953 +1685 Yamaguchi JPN Yamaguchi 138210 +1686 Higashimurayama JPN Tokyo-to 136970 +1687 Yonago JPN Tottori 136461 +1688 Matsubara JPN Osaka 135010 +1689 Musashino JPN Tokyo-to 134426 +1690 Tsuchiura JPN Ibaragi 134072 +1691 Joetsu JPN Niigata 133505 +1692 Miyakonojo JPN Miyazaki 133183 +1693 Misato JPN Saitama 132957 +1694 Kakamigahara JPN Gifu 131831 +1695 Daito JPN Osaka 130594 +1696 Seto JPN Aichi 130470 +1697 Kariya JPN Aichi 127969 +1698 Urayasu JPN Chiba 127550 +1699 Beppu JPN Oita 127486 +1700 Niihama JPN Ehime 127207 +1701 Minoo JPN Osaka 127026 +1702 Fujieda JPN Shizuoka 126897 +1703 Abiko JPN Chiba 126670 +1704 Nobeoka JPN Miyazaki 125547 +1705 Tondabayashi JPN Osaka 125094 +1706 Ueda JPN Nagano 124217 +1707 Kashihara JPN Nara 124013 +1708 Matsusaka JPN Mie 123582 +1709 Isesaki JPN Gumma 123285 +1710 Zama JPN Kanagawa 122046 +1711 Kisarazu JPN Chiba 121967 +1712 Noda JPN Chiba 121030 +1713 Ishinomaki JPN Miyagi 120963 +1714 Fujinomiya JPN Shizuoka 119714 +1715 Kawachinagano JPN Osaka 119666 +1716 Imabari JPN Ehime 119357 +1717 Aizuwakamatsu JPN Fukushima 119287 +1718 Higashihiroshima JPN Hiroshima 119166 +1719 Habikino JPN Osaka 118968 +1720 Ebetsu JPN Hokkaido 118805 +1721 Hofu JPN Yamaguchi 118751 +1722 Kiryu JPN Gumma 118326 +1723 Okinawa JPN Okinawa 117748 +1724 Yaizu JPN Shizuoka 117258 +1725 Toyokawa JPN Aichi 115781 +1726 Ebina JPN Kanagawa 115571 +1727 Asaka JPN Saitama 114815 +1728 Higashikurume JPN Tokyo-to 111666 +1729 Ikoma JPN Nara 111645 +1730 Kitami JPN Hokkaido 111295 +1731 Koganei JPN Tokyo-to 110969 +1732 Iwatsuki JPN Saitama 110034 +1733 Mishima JPN Shizuoka 109699 +1734 Handa JPN Aichi 108600 +1735 Muroran JPN Hokkaido 108275 +1736 Komatsu JPN Ishikawa 107937 +1737 Yatsushiro JPN Kumamoto 107661 +1738 Iida JPN Nagano 107583 +1739 Tokuyama JPN Yamaguchi 107078 +1740 Kokubunji JPN Tokyo-to 106996 +1741 Akishima JPN Tokyo-to 106914 +1742 Iwakuni JPN Yamaguchi 106647 +1743 Kusatsu JPN Shiga 106232 +1744 Kuwana JPN Mie 106121 +1745 Sanda JPN Hyogo 105643 +1746 Hikone JPN Shiga 105508 +1747 Toda JPN Saitama 103969 +1748 Tajimi JPN Gifu 103171 +1749 Ikeda JPN Osaka 102710 +1750 Fukaya JPN Saitama 102156 +1751 Ise JPN Mie 101732 +1752 Sakata JPN Yamagata 101651 +1753 Kasuga JPN Fukuoka 101344 +1754 Kamagaya JPN Chiba 100821 +1755 Tsuruoka JPN Yamagata 100713 +1756 Hoya JPN Tokyo-to 100313 +1757 Nishio JPN Chiba 100032 +1758 Tokai JPN Aichi 99738 +1759 Inazawa JPN Aichi 98746 +1760 Sakado JPN Saitama 98221 +1761 Isehara JPN Kanagawa 98123 +1762 Takasago JPN Hyogo 97632 +1763 Fujimi JPN Saitama 96972 +1764 Urasoe JPN Okinawa 96002 +1765 Yonezawa JPN Yamagata 95592 +1766 Konan JPN Aichi 95521 +1767 Yamatokoriyama JPN Nara 95165 +1768 Maizuru JPN Kyoto 94784 +1769 Onomichi JPN Hiroshima 93756 +1770 Higashimatsuyama JPN Saitama 93342 +1771 Kimitsu JPN Chiba 93216 +1772 Isahaya JPN Nagasaki 93058 +1773 Kanuma JPN Tochigi 93053 +1774 Izumisano JPN Osaka 92583 +1775 Kameoka JPN Kyoto 92398 +1776 Mobara JPN Chiba 91664 +1777 Narita JPN Chiba 91470 +1778 Kashiwazaki JPN Niigata 91229 +1779 Tsuyama JPN Okayama 91170 +1780 Sanaa YEM Sanaa 503600 +1781 Aden YEM Aden 398300 +1782 Taizz YEM Taizz 317600 +1783 Hodeida YEM Hodeida 298500 +1784 al-Mukalla YEM Hadramawt 122400 +1785 Ibb YEM Ibb 103300 +1786 Amman JOR Amman 1000000 +1787 al-Zarqa JOR al-Zarqa 389815 +1788 Irbid JOR Irbid 231511 +1789 al-Rusayfa JOR al-Zarqa 137247 +1790 Wadi al-Sir JOR Amman 89104 +1791 Flying Fish Cove CXR A 700 +1792 Beograd YUG Central Serbia 1204000 +1793 Novi Sad YUG Vojvodina 179626 +1794 Nid YUG Central Serbia 175391 +1795 Pridtina YUG Kosovo and Metohija 155496 +1796 Kragujevac YUG Central Serbia 147305 +1797 Podgorica YUG Montenegro 135000 +1798 Subotica YUG Vojvodina 100386 +1799 Prizren YUG Kosovo and Metohija 92303 +1800 Phnom Penh KHM Phnom Penh 570155 +1801 Battambang KHM Battambang 129800 +1802 Siem Reap KHM Siem Reap 105100 +1803 Douala CMR Littoral 1448300 +1804 Yaounde CMR Centre 1372800 +1805 Garoua CMR Nord 177000 +1806 Maroua CMR Extreme-Nord 143000 +1807 Bamenda CMR Nord-Ouest 138000 +1808 Bafoussam CMR Ouest 131000 +1809 Nkongsamba CMR Littoral 112454 +1810 Montreal CAN Quebec 1016376 +1811 Calgary CAN Alberta 768082 +1812 Toronto CAN Ontario 688275 +1813 North York CAN Ontario 622632 +1814 Winnipeg CAN Manitoba 618477 +1815 Edmonton CAN Alberta 616306 +1816 Mississauga CAN Ontario 608072 +1817 Scarborough CAN Ontario 594501 +1818 Vancouver CAN British Colombia 514008 +1819 Etobicoke CAN Ontario 348845 +1820 London CAN Ontario 339917 +1821 Hamilton CAN Ontario 335614 +1822 Ottawa CAN Ontario 335277 +1823 Laval CAN Quebec 330393 +1824 Surrey CAN British Colombia 304477 +1825 Brampton CAN Ontario 296711 +1826 Windsor CAN Ontario 207588 +1827 Saskatoon CAN Saskatchewan 193647 +1828 Kitchener CAN Ontario 189959 +1829 Markham CAN Ontario 189098 +1830 Regina CAN Saskatchewan 180400 +1831 Burnaby CAN British Colombia 179209 +1832 Quebec CAN Quebec 167264 +1833 York CAN Ontario 154980 +1834 Richmond CAN British Colombia 148867 +1835 Vaughan CAN Ontario 147889 +1836 Burlington CAN Ontario 145150 +1837 Oshawa CAN Ontario 140173 +1838 Oakville CAN Ontario 139192 +1839 Saint Catharines CAN Ontario 136216 +1840 Longueuil CAN Quebec 127977 +1841 Richmond Hill CAN Ontario 116428 +1842 Thunder Bay CAN Ontario 115913 +1843 Nepean CAN Ontario 115100 +1844 Cape Breton CAN Nova Scotia 114733 +1845 East York CAN Ontario 114034 +1846 Halifax CAN Nova Scotia 113910 +1847 Cambridge CAN Ontario 109186 +1848 Gloucester CAN Ontario 107314 +1849 Abbotsford CAN British Colombia 105403 +1850 Guelph CAN Ontario 103593 +1851 Saint Johns CAN Newfoundland 101936 +1852 Coquitlam CAN British Colombia 101820 +1853 Saanich CAN British Colombia 101388 +1854 Gatineau CAN Quebec 100702 +1855 Delta CAN British Colombia 95411 +1856 Sudbury CAN Ontario 92686 +1857 Kelowna CAN British Colombia 89442 +1858 Barrie CAN Ontario 89269 +1859 Praia CPV Sao Tiago 94800 +1860 Almaty KAZ Almaty Qalasy 1129400 +1861 Qaraghandy KAZ Qaraghandy 436900 +1862 Shymkent KAZ South Kazakstan 360100 +1863 Taraz KAZ Taraz 330100 +1864 Astana KAZ Astana 311200 +1865 Oskemen KAZ East Kazakstan 311000 +1866 Pavlodar KAZ Pavlodar 300500 +1867 Semey KAZ East Kazakstan 269600 +1868 Aqtobe KAZ Aqtobe 253100 +1869 Qostanay KAZ Qostanay 221400 +1870 Petropavl KAZ North Kazakstan 203500 +1871 Oral KAZ West Kazakstan 195500 +1872 Temirtau KAZ Qaraghandy 170500 +1873 Qyzylorda KAZ Qyzylorda 157400 +1874 Aqtau KAZ Mangghystau 143400 +1875 Atyrau KAZ Atyrau 142500 +1876 Ekibastuz KAZ Pavlodar 127200 +1877 Kokshetau KAZ North Kazakstan 123400 +1878 Rudnyy KAZ Qostanay 109500 +1879 Taldyqorghan KAZ Almaty 98000 +1880 Zhezqazghan KAZ Qaraghandy 90000 +1881 Nairobi KEN Nairobi 2290000 +1882 Mombasa KEN Coast 461753 +1883 Kisumu KEN Nyanza 192733 +1884 Nakuru KEN Rift Valley 163927 +1885 Machakos KEN Eastern 116293 +1886 Eldoret KEN Rift Valley 111882 +1887 Meru KEN Eastern 94947 +1888 Nyeri KEN Central 91258 +1889 Bangui CAF Bangui 524000 +1890 Shanghai CHN Shanghai 9696300 +1891 Peking CHN Peking 7472000 +1892 Chongqing CHN Chongqing 6351600 +1893 Tianjin CHN Tianjin 5286800 +1894 Wuhan CHN Hubei 4344600 +1895 Harbin CHN Heilongjiang 4289800 +1896 Shenyang CHN Liaoning 4265200 +1897 Kanton [Guangzhou] CHN Guangdong 4256300 +1898 Chengdu CHN Sichuan 3361500 +1899 Nanking [Nanjing] CHN Jiangsu 2870300 +1900 Changchun CHN Jilin 2812000 +1901 Xian CHN Shaanxi 2761400 +1902 Dalian CHN Liaoning 2697000 +1903 Qingdao CHN Shandong 2596000 +1904 Jinan CHN Shandong 2278100 +1905 Hangzhou CHN Zhejiang 2190500 +1906 Zhengzhou CHN Henan 2107200 +1907 Shijiazhuang CHN Hebei 2041500 +1908 Taiyuan CHN Shanxi 1968400 +1909 Kunming CHN Yunnan 1829500 +1910 Changsha CHN Hunan 1809800 +1911 Nanchang CHN Jiangxi 1691600 +1912 Fuzhou CHN Fujian 1593800 +1913 Lanzhou CHN Gansu 1565800 +1914 Guiyang CHN Guizhou 1465200 +1915 Ningbo CHN Zhejiang 1371200 +1916 Hefei CHN Anhui 1369100 +1917 Urumtdi [Urumqi] CHN Xinxiang 1310100 +1918 Anshan CHN Liaoning 1200000 +1919 Fushun CHN Liaoning 1200000 +1920 Nanning CHN Guangxi 1161800 +1921 Zibo CHN Shandong 1140000 +1922 Qiqihar CHN Heilongjiang 1070000 +1923 Jilin CHN Jilin 1040000 +1924 Tangshan CHN Hebei 1040000 +1925 Baotou CHN Inner Mongolia 980000 +1926 Shenzhen CHN Guangdong 950500 +1927 Hohhot CHN Inner Mongolia 916700 +1928 Handan CHN Hebei 840000 +1929 Wuxi CHN Jiangsu 830000 +1930 Xuzhou CHN Jiangsu 810000 +1931 Datong CHN Shanxi 800000 +1932 Yichun CHN Heilongjiang 800000 +1933 Benxi CHN Liaoning 770000 +1934 Luoyang CHN Henan 760000 +1935 Suzhou CHN Jiangsu 710000 +1936 Xining CHN Qinghai 700200 +1937 Huainan CHN Anhui 700000 +1938 Jixi CHN Heilongjiang 683885 +1939 Daqing CHN Heilongjiang 660000 +1940 Fuxin CHN Liaoning 640000 +1941 Amoy [Xiamen] CHN Fujian 627500 +1942 Liuzhou CHN Guangxi 610000 +1943 Shantou CHN Guangdong 580000 +1944 Jinzhou CHN Liaoning 570000 +1945 Mudanjiang CHN Heilongjiang 570000 +1946 Yinchuan CHN Ningxia 544500 +1947 Changzhou CHN Jiangsu 530000 +1948 Zhangjiakou CHN Hebei 530000 +1949 Dandong CHN Liaoning 520000 +1950 Hegang CHN Heilongjiang 520000 +1951 Kaifeng CHN Henan 510000 +1952 Jiamusi CHN Heilongjiang 493409 +1953 Liaoyang CHN Liaoning 492559 +1954 Hengyang CHN Hunan 487148 +1955 Baoding CHN Hebei 483155 +1956 Hunjiang CHN Jilin 482043 +1957 Xinxiang CHN Henan 473762 +1958 Huangshi CHN Hubei 457601 +1959 Haikou CHN Hainan 454300 +1960 Yantai CHN Shandong 452127 +1961 Bengbu CHN Anhui 449245 +1962 Xiangtan CHN Hunan 441968 +1963 Weifang CHN Shandong 428522 +1964 Wuhu CHN Anhui 425740 +1965 Pingxiang CHN Jiangxi 425579 +1966 Yingkou CHN Liaoning 421589 +1967 Anyang CHN Henan 420332 +1968 Panzhihua CHN Sichuan 415466 +1969 Pingdingshan CHN Henan 410775 +1970 Xiangfan CHN Hubei 410407 +1971 Zhuzhou CHN Hunan 409924 +1972 Jiaozuo CHN Henan 409100 +1973 Wenzhou CHN Zhejiang 401871 +1974 Zhangjiang CHN Guangdong 400997 +1975 Zigong CHN Sichuan 393184 +1976 Shuangyashan CHN Heilongjiang 386081 +1977 Zaozhuang CHN Shandong 380846 +1978 Yakeshi CHN Inner Mongolia 377869 +1979 Yichang CHN Hubei 371601 +1980 Zhenjiang CHN Jiangsu 368316 +1981 Huaibei CHN Anhui 366549 +1982 Qinhuangdao CHN Hebei 364972 +1983 Guilin CHN Guangxi 364130 +1984 Liupanshui CHN Guizhou 363954 +1985 Panjin CHN Liaoning 362773 +1986 Yangquan CHN Shanxi 362268 +1987 Jinxi CHN Liaoning 357052 +1988 Liaoyuan CHN Jilin 354141 +1989 Lianyungang CHN Jiangsu 354139 +1990 Xianyang CHN Shaanxi 352125 +1991 Taian CHN Shandong 350696 +1992 Chifeng CHN Inner Mongolia 350077 +1993 Shaoguan CHN Guangdong 350043 +1994 Nantong CHN Jiangsu 343341 +1995 Leshan CHN Sichuan 341128 +1996 Baoji CHN Shaanxi 337765 +1997 Linyi CHN Shandong 324720 +1998 Tonghua CHN Jilin 324600 +1999 Siping CHN Jilin 317223 +2000 Changzhi CHN Shanxi 317144 +2001 Tengzhou CHN Shandong 315083 +2002 Chaozhou CHN Guangdong 313469 +2003 Yangzhou CHN Jiangsu 312892 +2004 Dongwan CHN Guangdong 308669 +2005 Maanshan CHN Anhui 305421 +2006 Foshan CHN Guangdong 303160 +2007 Yueyang CHN Hunan 302800 +2008 Xingtai CHN Hebei 302789 +2009 Changde CHN Hunan 301276 +2010 Shihezi CHN Xinxiang 299676 +2011 Yancheng CHN Jiangsu 296831 +2012 Jiujiang CHN Jiangxi 291187 +2013 Dongying CHN Shandong 281728 +2014 Shashi CHN Hubei 281352 +2015 Xintai CHN Shandong 281248 +2016 Jingdezhen CHN Jiangxi 281183 +2017 Tongchuan CHN Shaanxi 280657 +2018 Zhongshan CHN Guangdong 278829 +2019 Shiyan CHN Hubei 273786 +2020 Tieli CHN Heilongjiang 265683 +2021 Jining CHN Shandong 265248 +2022 Wuhai CHN Inner Mongolia 264081 +2023 Mianyang CHN Sichuan 262947 +2024 Luzhou CHN Sichuan 262892 +2025 Zunyi CHN Guizhou 261862 +2026 Shizuishan CHN Ningxia 257862 +2027 Neijiang CHN Sichuan 256012 +2028 Tongliao CHN Inner Mongolia 255129 +2029 Tieling CHN Liaoning 254842 +2030 Wafangdian CHN Liaoning 251733 +2031 Anqing CHN Anhui 250718 +2032 Shaoyang CHN Hunan 247227 +2033 Laiwu CHN Shandong 246833 +2034 Chengde CHN Hebei 246799 +2035 Tianshui CHN Gansu 244974 +2036 Nanyang CHN Henan 243303 +2037 Cangzhou CHN Hebei 242708 +2038 Yibin CHN Sichuan 241019 +2039 Huaiyin CHN Jiangsu 239675 +2040 Dunhua CHN Jilin 235100 +2041 Yanji CHN Jilin 230892 +2042 Jiangmen CHN Guangdong 230587 +2043 Tongling CHN Anhui 228017 +2044 Suihua CHN Heilongjiang 227881 +2045 Gongziling CHN Jilin 226569 +2046 Xiantao CHN Hubei 222884 +2047 Chaoyang CHN Liaoning 222394 +2048 Ganzhou CHN Jiangxi 220129 +2049 Huzhou CHN Zhejiang 218071 +2050 Baicheng CHN Jilin 217987 +2051 Shangzi CHN Heilongjiang 215373 +2052 Yangjiang CHN Guangdong 215196 +2053 Qitaihe CHN Heilongjiang 214957 +2054 Gejiu CHN Yunnan 214294 +2055 Jiangyin CHN Jiangsu 213659 +2056 Hebi CHN Henan 212976 +2057 Jiaxing CHN Zhejiang 211526 +2058 Wuzhou CHN Guangxi 210452 +2059 Meihekou CHN Jilin 209038 +2060 Xuchang CHN Henan 208815 +2061 Liaocheng CHN Shandong 207844 +2062 Haicheng CHN Liaoning 205560 +2063 Qianjiang CHN Hubei 205504 +2064 Baiyin CHN Gansu 204970 +2065 Beian CHN Heilongjiang 204899 +2066 Yixing CHN Jiangsu 200824 +2067 Laizhou CHN Shandong 198664 +2068 Qaramay CHN Xinxiang 197602 +2069 Acheng CHN Heilongjiang 197595 +2070 Dezhou CHN Shandong 195485 +2071 Nanping CHN Fujian 195064 +2072 Zhaoqing CHN Guangdong 194784 +2073 Beipiao CHN Liaoning 194301 +2074 Fengcheng CHN Jiangxi 193784 +2075 Fuyu CHN Jilin 192981 +2076 Xinyang CHN Henan 192509 +2077 Dongtai CHN Jiangsu 192247 +2078 Yuci CHN Shanxi 191356 +2079 Honghu CHN Hubei 190772 +2080 Ezhou CHN Hubei 190123 +2081 Heze CHN Shandong 189293 +2082 Daxian CHN Sichuan 188101 +2083 Linfen CHN Shanxi 187309 +2084 Tianmen CHN Hubei 186332 +2085 Yiyang CHN Hunan 185818 +2086 Quanzhou CHN Fujian 185154 +2087 Rizhao CHN Shandong 185048 +2088 Deyang CHN Sichuan 182488 +2089 Guangyuan CHN Sichuan 182241 +2090 Changshu CHN Jiangsu 181805 +2091 Zhangzhou CHN Fujian 181424 +2092 Hailar CHN Inner Mongolia 180650 +2093 Nanchong CHN Sichuan 180273 +2094 Jiutai CHN Jilin 180130 +2095 Zhaodong CHN Heilongjiang 179976 +2096 Shaoxing CHN Zhejiang 179818 +2097 Fuyang CHN Anhui 179572 +2098 Maoming CHN Guangdong 178683 +2099 Qujing CHN Yunnan 178669 +2100 Ghulja CHN Xinxiang 177193 +2101 Jiaohe CHN Jilin 176367 +2102 Puyang CHN Henan 175988 +2103 Huadian CHN Jilin 175873 +2104 Jiangyou CHN Sichuan 175753 +2105 Qashqar CHN Xinxiang 174570 +2106 Anshun CHN Guizhou 174142 +2107 Fuling CHN Sichuan 173878 +2108 Xinyu CHN Jiangxi 173524 +2109 Hanzhong CHN Shaanxi 169930 +2110 Danyang CHN Jiangsu 169603 +2111 Chenzhou CHN Hunan 169400 +2112 Xiaogan CHN Hubei 166280 +2113 Shangqiu CHN Henan 164880 +2114 Zhuhai CHN Guangdong 164747 +2115 Qingyuan CHN Guangdong 164641 +2116 Aqsu CHN Xinxiang 164092 +2117 Jining CHN Inner Mongolia 163552 +2118 Xiaoshan CHN Zhejiang 162930 +2119 Zaoyang CHN Hubei 162198 +2120 Xinghua CHN Jiangsu 161910 +2121 Hami CHN Xinxiang 161315 +2122 Huizhou CHN Guangdong 161023 +2123 Jinmen CHN Hubei 160794 +2124 Sanming CHN Fujian 160691 +2125 Ulanhot CHN Inner Mongolia 159538 +2126 Korla CHN Xinxiang 159344 +2127 Wanxian CHN Sichuan 156823 +2128 Ruian CHN Zhejiang 156468 +2129 Zhoushan CHN Zhejiang 156317 +2130 Liangcheng CHN Shandong 156307 +2131 Jiaozhou CHN Shandong 153364 +2132 Taizhou CHN Jiangsu 152442 +2133 Suzhou CHN Anhui 151862 +2134 Yichun CHN Jiangxi 151585 +2135 Taonan CHN Jilin 150168 +2136 Pingdu CHN Shandong 150123 +2137 Jian CHN Jiangxi 148583 +2138 Longkou CHN Shandong 148362 +2139 Langfang CHN Hebei 148105 +2140 Zhoukou CHN Henan 146288 +2141 Suining CHN Sichuan 146086 +2142 Yulin CHN Guangxi 144467 +2143 Jinhua CHN Zhejiang 144280 +2144 Liuan CHN Anhui 144248 +2145 Shuangcheng CHN Heilongjiang 142659 +2146 Suizhou CHN Hubei 142302 +2147 Ankang CHN Shaanxi 142170 +2148 Weinan CHN Shaanxi 140169 +2149 Longjing CHN Jilin 139417 +2150 Daan CHN Jilin 138963 +2151 Lengshuijiang CHN Hunan 137994 +2152 Laiyang CHN Shandong 137080 +2153 Xianning CHN Hubei 136811 +2154 Dali CHN Yunnan 136554 +2155 Anda CHN Heilongjiang 136446 +2156 Jincheng CHN Shanxi 136396 +2157 Longyan CHN Fujian 134481 +2158 Xichang CHN Sichuan 134419 +2159 Wendeng CHN Shandong 133910 +2160 Hailun CHN Heilongjiang 133565 +2161 Binzhou CHN Shandong 133555 +2162 Linhe CHN Inner Mongolia 133183 +2163 Wuwei CHN Gansu 133101 +2164 Duyun CHN Guizhou 132971 +2165 Mishan CHN Heilongjiang 132744 +2166 Shangrao CHN Jiangxi 132455 +2167 Changji CHN Xinxiang 132260 +2168 Meixian CHN Guangdong 132156 +2169 Yushu CHN Jilin 131861 +2170 Tiefa CHN Liaoning 131807 +2171 Huaian CHN Jiangsu 131149 +2172 Leiyang CHN Hunan 130115 +2173 Zalantun CHN Inner Mongolia 130031 +2174 Weihai CHN Shandong 128888 +2175 Loudi CHN Hunan 128418 +2176 Qingzhou CHN Shandong 128258 +2177 Qidong CHN Jiangsu 126872 +2178 Huaihua CHN Hunan 126785 +2179 Luohe CHN Henan 126438 +2180 Chuzhou CHN Anhui 125341 +2181 Kaiyuan CHN Liaoning 124219 +2182 Linqing CHN Shandong 123958 +2183 Chaohu CHN Anhui 123676 +2184 Laohekou CHN Hubei 123366 +2185 Dujiangyan CHN Sichuan 123357 +2186 Zhumadian CHN Henan 123232 +2187 Linchuan CHN Jiangxi 121949 +2188 Jiaonan CHN Shandong 121397 +2189 Sanmenxia CHN Henan 120523 +2190 Heyuan CHN Guangdong 120101 +2191 Manzhouli CHN Inner Mongolia 120023 +2192 Lhasa CHN Tibet 120000 +2193 Lianyuan CHN Hunan 118858 +2194 Kuytun CHN Xinxiang 118553 +2195 Puqi CHN Hubei 117264 +2196 Hongjiang CHN Hunan 116188 +2197 Qinzhou CHN Guangxi 114586 +2198 Renqiu CHN Hebei 114256 +2199 Yuyao CHN Zhejiang 114065 +2200 Guigang CHN Guangxi 114025 +2201 Kaili CHN Guizhou 113958 +2202 Yanan CHN Shaanxi 113277 +2203 Beihai CHN Guangxi 112673 +2204 Xuangzhou CHN Anhui 112673 +2205 Quzhou CHN Zhejiang 112373 +2206 Yongan CHN Fujian 111762 +2207 Zixing CHN Hunan 110048 +2208 Liyang CHN Jiangsu 109520 +2209 Yizheng CHN Jiangsu 109268 +2210 Yumen CHN Gansu 109234 +2211 Liling CHN Hunan 108504 +2212 Yuncheng CHN Shanxi 108359 +2213 Shanwei CHN Guangdong 107847 +2214 Cixi CHN Zhejiang 107329 +2215 Yuanjiang CHN Hunan 107004 +2216 Bozhou CHN Anhui 106346 +2217 Jinchang CHN Gansu 105287 +2218 Fuan CHN Fujian 105265 +2219 Suqian CHN Jiangsu 105021 +2220 Shishou CHN Hubei 104571 +2221 Hengshui CHN Hebei 104269 +2222 Danjiangkou CHN Hubei 103211 +2223 Fujin CHN Heilongjiang 103104 +2224 Sanya CHN Hainan 102820 +2225 Guangshui CHN Hubei 102770 +2226 Huangshan CHN Anhui 102628 +2227 Xingcheng CHN Liaoning 102384 +2228 Zhucheng CHN Shandong 102134 +2229 Kunshan CHN Jiangsu 102052 +2230 Haining CHN Zhejiang 100478 +2231 Pingliang CHN Gansu 99265 +2232 Fuqing CHN Fujian 99193 +2233 Xinzhou CHN Shanxi 98667 +2234 Jieyang CHN Guangdong 98531 +2235 Zhangjiagang CHN Jiangsu 97994 +2236 Tong Xian CHN Peking 97168 +2237 Yaan CHN Sichuan 95900 +2238 Jinzhou CHN Liaoning 95761 +2239 Emeishan CHN Sichuan 94000 +2240 Enshi CHN Hubei 93056 +2241 Bose CHN Guangxi 93009 +2242 Yuzhou CHN Henan 92889 +2243 Kaiyuan CHN Yunnan 91999 +2244 Tumen CHN Jilin 91471 +2245 Putian CHN Fujian 91030 +2246 Linhai CHN Zhejiang 90870 +2247 Xilin Hot CHN Inner Mongolia 90646 +2248 Shaowu CHN Fujian 90286 +2249 Junan CHN Shandong 90222 +2250 Huaying CHN Sichuan 89400 +2251 Pingyi CHN Shandong 89373 +2252 Huangyan CHN Zhejiang 89288 +2253 Bishkek KGZ Bishkek shaary 589400 +2254 Osh KGZ Osh 222700 +2255 Bikenibeu KIR South Tarawa 5055 +2256 Bairiki KIR South Tarawa 2226 +2257 Santafe de Bogota COL Santafe de Bogota 6260862 +2258 Cali COL Valle 2077386 +2259 Medellin COL Antioquia 1861265 +2260 Barranquilla COL Atlantico 1223260 +2261 Cartagena COL Bolivar 805757 +2262 Cucuta COL Norte de Santander 606932 +2263 Bucaramanga COL Santander 515555 +2264 Ibague COL Tolima 393664 +2265 Pereira COL Risaralda 381725 +2266 Santa Marta COL Magdalena 359147 +2267 Manizales COL Caldas 337580 +2268 Bello COL Antioquia 333470 +2269 Pasto COL Nariao 332396 +2270 Neiva COL Huila 300052 +2271 Soledad COL Atlantico 295058 +2272 Armenia COL Quindio 288977 +2273 Villavicencio COL Meta 273140 +2274 Soacha COL Cundinamarca 272058 +2275 Valledupar COL Cesar 263247 +2276 Monteria COL Cordoba 248245 +2277 Itagui COL Antioquia 228985 +2278 Palmira COL Valle 226509 +2279 Buenaventura COL Valle 224336 +2280 Floridablanca COL Santander 221913 +2281 Sincelejo COL Sucre 220704 +2282 Popayan COL Cauca 200719 +2283 Barrancabermeja COL Santander 178020 +2284 Dos Quebradas COL Risaralda 159363 +2285 Tulua COL Valle 152488 +2286 Envigado COL Antioquia 135848 +2287 Cartago COL Valle 125884 +2288 Girardot COL Cundinamarca 110963 +2289 Buga COL Valle 110699 +2290 Tunja COL Boyaca 109740 +2291 Florencia COL Caqueta 108574 +2292 Maicao COL La Guajira 108053 +2293 Sogamoso COL Boyaca 107728 +2294 Giron COL Santander 90688 +2295 Moroni COM Njazidja 36000 +2296 Brazzaville COG Brazzaville 950000 +2297 Pointe-Noire COG Kouilou 500000 +2298 Kinshasa COD Kinshasa 5064000 +2299 Lubumbashi COD Shaba 851381 +2300 Mbuji-Mayi COD East Kasai 806475 +2301 Kolwezi COD Shaba 417810 +2302 Kisangani COD Haute-Zaire 417517 +2303 Kananga COD West Kasai 393030 +2304 Likasi COD Shaba 299118 +2305 Bukavu COD South Kivu 201569 +2306 Kikwit COD Bandundu 182142 +2307 Tshikapa COD West Kasai 180860 +2308 Matadi COD Bas-Zaire 172730 +2309 Mbandaka COD Equateur 169841 +2310 Mwene-Ditu COD East Kasai 137459 +2311 Boma COD Bas-Zaire 135284 +2312 Uvira COD South Kivu 115590 +2313 Butembo COD North Kivu 109406 +2314 Goma COD North Kivu 109094 +2315 Kalemie COD Shaba 101309 +2316 Bantam CCK Home Island 503 +2317 West Island CCK West Island 167 +2318 Pyongyang PRK Pyongyang-si 2484000 +2319 Hamhung PRK Hamgyong N 709730 +2320 Chongjin PRK Hamgyong P 582480 +2321 Nampo PRK Nampo-si 566200 +2322 Sinuiju PRK Pyongan P 326011 +2323 Wonsan PRK Kangwon 300148 +2324 Phyongsong PRK Pyongan N 272934 +2325 Sariwon PRK Hwanghae P 254146 +2326 Haeju PRK Hwanghae N 229172 +2327 Kanggye PRK Chagang 223410 +2328 Kimchaek PRK Hamgyong P 179000 +2329 Hyesan PRK Yanggang 178020 +2330 Kaesong PRK Kaesong-si 171500 +2331 Seoul KOR Seoul 9981619 +2332 Pusan KOR Pusan 3804522 +2333 Inchon KOR Inchon 2559424 +2334 Taegu KOR Taegu 2548568 +2335 Taejon KOR Taejon 1425835 +2336 Kwangju KOR Kwangju 1368341 +2337 Ulsan KOR Kyongsangnam 1084891 +2338 Songnam KOR Kyonggi 869094 +2339 Puchon KOR Kyonggi 779412 +2340 Suwon KOR Kyonggi 755550 +2341 Anyang KOR Kyonggi 591106 +2342 Chonju KOR Chollabuk 563153 +2343 Chongju KOR Chungchongbuk 531376 +2344 Koyang KOR Kyonggi 518282 +2345 Ansan KOR Kyonggi 510314 +2346 Pohang KOR Kyongsangbuk 508899 +2347 Chang-won KOR Kyongsangnam 481694 +2348 Masan KOR Kyongsangnam 441242 +2349 Kwangmyong KOR Kyonggi 350914 +2350 Chonan KOR Chungchongnam 330259 +2351 Chinju KOR Kyongsangnam 329886 +2352 Iksan KOR Chollabuk 322685 +2353 Pyongtaek KOR Kyonggi 312927 +2354 Kumi KOR Kyongsangbuk 311431 +2355 Uijongbu KOR Kyonggi 276111 +2356 Kyongju KOR Kyongsangbuk 272968 +2357 Kunsan KOR Chollabuk 266569 +2358 Cheju KOR Cheju 258511 +2359 Kimhae KOR Kyongsangnam 256370 +2360 Sunchon KOR Chollanam 249263 +2361 Mokpo KOR Chollanam 247452 +2362 Yong-in KOR Kyonggi 242643 +2363 Wonju KOR Kang-won 237460 +2364 Kunpo KOR Kyonggi 235233 +2365 Chunchon KOR Kang-won 234528 +2366 Namyangju KOR Kyonggi 229060 +2367 Kangnung KOR Kang-won 220403 +2368 Chungju KOR Chungchongbuk 205206 +2369 Andong KOR Kyongsangbuk 188443 +2370 Yosu KOR Chollanam 183596 +2371 Kyongsan KOR Kyongsangbuk 173746 +2372 Paju KOR Kyonggi 163379 +2373 Yangsan KOR Kyongsangnam 163351 +2374 Ichon KOR Kyonggi 155332 +2375 Asan KOR Chungchongnam 154663 +2376 Koje KOR Kyongsangnam 147562 +2377 Kimchon KOR Kyongsangbuk 147027 +2378 Nonsan KOR Chungchongnam 146619 +2379 Kuri KOR Kyonggi 142173 +2380 Chong-up KOR Chollabuk 139111 +2381 Chechon KOR Chungchongbuk 137070 +2382 Sosan KOR Chungchongnam 134746 +2383 Shihung KOR Kyonggi 133443 +2384 Tong-yong KOR Kyongsangnam 131717 +2385 Kongju KOR Chungchongnam 131229 +2386 Yongju KOR Kyongsangbuk 131097 +2387 Chinhae KOR Kyongsangnam 125997 +2388 Sangju KOR Kyongsangbuk 124116 +2389 Poryong KOR Chungchongnam 122604 +2390 Kwang-yang KOR Chollanam 122052 +2391 Miryang KOR Kyongsangnam 121501 +2392 Hanam KOR Kyonggi 115812 +2393 Kimje KOR Chollabuk 115427 +2394 Yongchon KOR Kyongsangbuk 113511 +2395 Sachon KOR Kyongsangnam 113494 +2396 Uiwang KOR Kyonggi 108788 +2397 Naju KOR Chollanam 107831 +2398 Namwon KOR Chollabuk 103544 +2399 Tonghae KOR Kang-won 95472 +2400 Mun-gyong KOR Kyongsangbuk 92239 +2401 Athenai GRC Attika 772072 +2402 Thessaloniki GRC Central Macedonia 383967 +2403 Pireus GRC Attika 182671 +2404 Patras GRC West Greece 153344 +2405 Peristerion GRC Attika 137288 +2406 Herakleion GRC Crete 116178 +2407 Kallithea GRC Attika 114233 +2408 Larisa GRC Thessalia 113090 +2409 Zagreb HRV Grad Zagreb 706770 +2410 Split HRV Split-Dalmatia 189388 +2411 Rijeka HRV Primorje-Gorski Kota 167964 +2412 Osijek HRV Osijek-Baranja 104761 +2413 La Habana CUB La Habana 2256000 +2414 Santiago de Cuba CUB Santiago de Cuba 433180 +2415 Camaguey CUB Camaguey 298726 +2416 Holguin CUB Holguin 249492 +2417 Santa Clara CUB Villa Clara 207350 +2418 Guantanamo CUB Guantanamo 205078 +2419 Pinar del Rio CUB Pinar del Rio 142100 +2420 Bayamo CUB Granma 141000 +2421 Cienfuegos CUB Cienfuegos 132770 +2422 Victoria de las Tunas CUB Las Tunas 132350 +2423 Matanzas CUB Matanzas 123273 +2424 Manzanillo CUB Granma 109350 +2425 Sancti-Spiritus CUB Sancti-Spiritus 100751 +2426 Ciego de Avila CUB Ciego de Avila 98505 +2427 al-Salimiya KWT Hawalli 130215 +2428 Jalib al-Shuyukh KWT Hawalli 102178 +2429 Kuwait KWT al-Asima 28859 +2430 Nicosia CYP Nicosia 195000 +2431 Limassol CYP Limassol 154400 +2432 Vientiane LAO Viangchan 531800 +2433 Savannakhet LAO Savannakhet 96652 +2434 Riga LVA Riika 764328 +2435 Daugavpils LVA Daugavpils 114829 +2436 Liepaja LVA Liepaja 89439 +2437 Maseru LSO Maseru 297000 +2438 Beirut LBN Beirut 1100000 +2439 Tripoli LBN al-Shamal 240000 +2440 Monrovia LBR Montserrado 850000 +2441 Tripoli LBY Tripoli 1682000 +2442 Bengasi LBY Bengasi 804000 +2443 Misrata LBY Misrata 121669 +2444 al-Zawiya LBY al-Zawiya 89338 +2445 Schaan LIE Schaan 5346 +2446 Vaduz LIE Vaduz 5043 +2447 Vilnius LTU Vilna 577969 +2448 Kaunas LTU Kaunas 412639 +2449 Klaipeda LTU Klaipeda 202451 +2450 Giauliai LTU Giauliai 146563 +2451 Panevezys LTU Panevezys 133695 +2452 Luxembourg [Luxemburg/Letzebuerg] LUX Luxembourg 80700 +2453 El-Aaiun ESH El-Aaiun 169000 +2454 Macao MAC Macau 437500 +2455 Antananarivo MDG Antananarivo 675669 +2456 Toamasina MDG Toamasina 127441 +2457 Antsirabe MDG Antananarivo 120239 +2458 Mahajanga MDG Mahajanga 100807 +2459 Fianarantsoa MDG Fianarantsoa 99005 +2460 Skopje MKD Skopje 444299 +2461 Blantyre MWI Blantyre 478155 +2462 Lilongwe MWI Lilongwe 435964 +2463 Male MDV Maale 71000 +2464 Kuala Lumpur MYS Wilayah Persekutuan 1297526 +2465 Ipoh MYS Perak 382853 +2466 Johor Baharu MYS Johor 328436 +2467 Petaling Jaya MYS Selangor 254350 +2468 Kelang MYS Selangor 243355 +2469 Kuala Terengganu MYS Terengganu 228119 +2470 Pinang MYS Pulau Pinang 219603 +2471 Kota Bharu MYS Kelantan 219582 +2472 Kuantan MYS Pahang 199484 +2473 Taiping MYS Perak 183261 +2474 Seremban MYS Negeri Sembilan 182869 +2475 Kuching MYS Sarawak 148059 +2476 Sibu MYS Sarawak 126381 +2477 Sandakan MYS Sabah 125841 +2478 Alor Setar MYS Kedah 124412 +2479 Selayang Baru MYS Selangor 124228 +2480 Sungai Petani MYS Kedah 114763 +2481 Shah Alam MYS Selangor 102019 +2482 Bamako MLI Bamako 809552 +2483 Birkirkara MLT Outer Harbour 21445 +2484 Valletta MLT Inner Harbour 7073 +2485 Casablanca MAR Casablanca 2940623 +2486 Rabat MAR Rabat-Sale-Zammour-Z 623457 +2487 Marrakech MAR Marrakech-Tensift-Al 621914 +2488 Fes MAR Fes-Boulemane 541162 +2489 Tanger MAR Tanger-Tetouan 521735 +2490 Sale MAR Rabat-Sale-Zammour-Z 504420 +2491 Meknes MAR Meknes-Tafilalet 460000 +2492 Oujda MAR Oriental 365382 +2493 Kenitra MAR Gharb-Chrarda-Beni H 292600 +2494 Tetouan MAR Tanger-Tetouan 277516 +2495 Safi MAR Doukkala-Abda 262300 +2496 Agadir MAR Souss Massa-Draa 155244 +2497 Mohammedia MAR Casablanca 154706 +2498 Khouribga MAR Chaouia-Ouardigha 152090 +2499 Beni-Mellal MAR Tadla-Azilal 140212 +2500 Temara MAR Rabat-Sale-Zammour-Z 126303 +2501 El Jadida MAR Doukkala-Abda 119083 +2502 Nador MAR Oriental 112450 +2503 Ksar el Kebir MAR Tanger-Tetouan 107065 +2504 Settat MAR Chaouia-Ouardigha 96200 +2505 Taza MAR Taza-Al Hoceima-Taou 92700 +2506 El Araich MAR Tanger-Tetouan 90400 +2507 Dalap-Uliga-Darrit MHL Majuro 28000 +2508 Fort-de-France MTQ Fort-de-France 94050 +2509 Nouakchott MRT Nouakchott 667300 +2510 Nouadhibou MRT Dakhlet Nouadhibou 97600 +2511 Port-Louis MUS Port-Louis 138200 +2512 Beau Bassin-Rose Hill MUS Plaines Wilhelms 100616 +2513 Vacoas-Phoenix MUS Plaines Wilhelms 98464 +2514 Mamoutzou MYT Mamoutzou 12000 +2515 Ciudad de Mexico MEX Distrito Federal 8591309 +2516 Guadalajara MEX Jalisco 1647720 +2517 Ecatepec de Morelos MEX Mexico 1620303 +2518 Puebla MEX Puebla 1346176 +2519 Nezahualcoyotl MEX Mexico 1224924 +2520 Juarez MEX Chihuahua 1217818 +2521 Tijuana MEX Baja California 1212232 +2522 Leon MEX Guanajuato 1133576 +2523 Monterrey MEX Nuevo Leon 1108499 +2524 Zapopan MEX Jalisco 1002239 +2525 Naucalpan de Juarez MEX Mexico 857511 +2526 Mexicali MEX Baja California 764902 +2527 Culiacan MEX Sinaloa 744859 +2528 Acapulco de Juarez MEX Guerrero 721011 +2529 Tlalnepantla de Baz MEX Mexico 720755 +2530 Merida MEX Yucatan 703324 +2531 Chihuahua MEX Chihuahua 670208 +2532 San Luis Potosi MEX San Luis Potosi 669353 +2533 Guadalupe MEX Nuevo Leon 668780 +2534 Toluca MEX Mexico 665617 +2535 Aguascalientes MEX Aguascalientes 643360 +2536 Queretaro MEX Queretaro de Arteaga 639839 +2537 Morelia MEX Michoacan de Ocampo 619958 +2538 Hermosillo MEX Sonora 608697 +2539 Saltillo MEX Coahuila de Zaragoza 577352 +2540 Torreon MEX Coahuila de Zaragoza 529093 +2541 Centro (Villahermosa) MEX Tabasco 519873 +2542 San Nicolas de los Garza MEX Nuevo Leon 495540 +2543 Durango MEX Durango 490524 +2544 Chimalhuacan MEX Mexico 490245 +2545 Tlaquepaque MEX Jalisco 475472 +2546 Atizapan de Zaragoza MEX Mexico 467262 +2547 Veracruz MEX Veracruz 457119 +2548 Cuautitlan Izcalli MEX Mexico 452976 +2549 Irapuato MEX Guanajuato 440039 +2550 Tuxtla Gutierrez MEX Chiapas 433544 +2551 Tultitlan MEX Mexico 432411 +2552 Reynosa MEX Tamaulipas 419776 +2553 Benito Juarez MEX Quintana Roo 419276 +2554 Matamoros MEX Tamaulipas 416428 +2555 Xalapa MEX Veracruz 390058 +2556 Celaya MEX Guanajuato 382140 +2557 Mazatlan MEX Sinaloa 380265 +2558 Ensenada MEX Baja California 369573 +2559 Ahome MEX Sinaloa 358663 +2560 Cajeme MEX Sonora 355679 +2561 Cuernavaca MEX Morelos 337966 +2562 Tonala MEX Jalisco 336109 +2563 Valle de Chalco Solidaridad MEX Mexico 323113 +2564 Nuevo Laredo MEX Tamaulipas 310277 +2565 Tepic MEX Nayarit 305025 +2566 Tampico MEX Tamaulipas 294789 +2567 Ixtapaluca MEX Mexico 293160 +2568 Apodaca MEX Nuevo Leon 282941 +2569 Guasave MEX Sinaloa 277201 +2570 Gomez Palacio MEX Durango 272806 +2571 Tapachula MEX Chiapas 271141 +2572 Nicolas Romero MEX Mexico 269393 +2573 Coatzacoalcos MEX Veracruz 267037 +2574 Uruapan MEX Michoacan de Ocampo 265211 +2575 Victoria MEX Tamaulipas 262686 +2576 Oaxaca de Juarez MEX Oaxaca 256848 +2577 Coacalco de Berriozabal MEX Mexico 252270 +2578 Pachuca de Soto MEX Hidalgo 244688 +2579 General Escobedo MEX Nuevo Leon 232961 +2580 Salamanca MEX Guanajuato 226864 +2581 Santa Catarina MEX Nuevo Leon 226573 +2582 Tehuacan MEX Puebla 225943 +2583 Chalco MEX Mexico 222201 +2584 Cardenas MEX Tabasco 216903 +2585 Campeche MEX Campeche 216735 +2586 La Paz MEX Mexico 213045 +2587 Othon P. Blanco (Chetumal) MEX Quintana Roo 208014 +2588 Texcoco MEX Mexico 203681 +2589 La Paz MEX Baja California Sur 196708 +2590 Metepec MEX Mexico 194265 +2591 Monclova MEX Coahuila de Zaragoza 193657 +2592 Huixquilucan MEX Mexico 193156 +2593 Chilpancingo de los Bravo MEX Guerrero 192509 +2594 Puerto Vallarta MEX Jalisco 183741 +2595 Fresnillo MEX Zacatecas 182744 +2596 Ciudad Madero MEX Tamaulipas 182012 +2597 Soledad de Graciano Sanchez MEX San Luis Potosi 179956 +2598 San Juan del Rio MEX Queretaro 179300 +2599 San Felipe del Progreso MEX Mexico 177330 +2600 Cordoba MEX Veracruz 176952 +2601 Tecamac MEX Mexico 172410 +2602 Ocosingo MEX Chiapas 171495 +2603 Carmen MEX Campeche 171367 +2604 Lazaro Cardenas MEX Michoacan de Ocampo 170878 +2605 Jiutepec MEX Morelos 170428 +2606 Papantla MEX Veracruz 170123 +2607 Comalcalco MEX Tabasco 164640 +2608 Zamora MEX Michoacan de Ocampo 161191 +2609 Nogales MEX Sonora 159103 +2610 Huimanguillo MEX Tabasco 158335 +2611 Cuautla MEX Morelos 153132 +2612 Minatitlan MEX Veracruz 152983 +2613 Poza Rica de Hidalgo MEX Veracruz 152678 +2614 Ciudad Valles MEX San Luis Potosi 146411 +2615 Navolato MEX Sinaloa 145396 +2616 San Luis Rio Colorado MEX Sonora 145276 +2617 Penjamo MEX Guanajuato 143927 +2618 San Andres Tuxtla MEX Veracruz 142251 +2619 Guanajuato MEX Guanajuato 141215 +2620 Navojoa MEX Sonora 140495 +2621 Zitacuaro MEX Michoacan de Ocampo 137970 +2622 Boca del Rio MEX Veracruz-Llave 135721 +2623 Allende MEX Guanajuato 134645 +2624 Silao MEX Guanajuato 134037 +2625 Macuspana MEX Tabasco 133795 +2626 San Juan Bautista Tuxtepec MEX Oaxaca 133675 +2627 San Cristobal de las Casas MEX Chiapas 132317 +2628 Valle de Santiago MEX Guanajuato 130557 +2629 Guaymas MEX Sonora 130108 +2630 Colima MEX Colima 129454 +2631 Dolores Hidalgo MEX Guanajuato 128675 +2632 Lagos de Moreno MEX Jalisco 127949 +2633 Piedras Negras MEX Coahuila de Zaragoza 127898 +2634 Altamira MEX Tamaulipas 127490 +2635 Tuxpam MEX Veracruz 126475 +2636 San Pedro Garza Garcia MEX Nuevo Leon 126147 +2637 Cuauhtemoc MEX Chihuahua 124279 +2638 Manzanillo MEX Colima 124014 +2639 Iguala de la Independencia MEX Guerrero 123883 +2640 Zacatecas MEX Zacatecas 123700 +2641 Tlajomulco de Zuaiga MEX Jalisco 123220 +2642 Tulancingo de Bravo MEX Hidalgo 121946 +2643 Zinacantepec MEX Mexico 121715 +2644 San Martin Texmelucan MEX Puebla 121093 +2645 Tepatitlan de Morelos MEX Jalisco 118948 +2646 Martinez de la Torre MEX Veracruz 118815 +2647 Orizaba MEX Veracruz 118488 +2648 Apatzingan MEX Michoacan de Ocampo 117849 +2649 Atlixco MEX Puebla 117019 +2650 Delicias MEX Chihuahua 116132 +2651 Ixtlahuaca MEX Mexico 115548 +2652 El Mante MEX Tamaulipas 112453 +2653 Lerdo MEX Durango 112272 +2654 Almoloya de Juarez MEX Mexico 110550 +2655 Acambaro MEX Guanajuato 110487 +2656 Acuaa MEX Coahuila de Zaragoza 110388 +2657 Guadalupe MEX Zacatecas 108881 +2658 Huejutla de Reyes MEX Hidalgo 108017 +2659 Hidalgo MEX Michoacan de Ocampo 106198 +2660 Los Cabos MEX Baja California Sur 105199 +2661 Comitan de Dominguez MEX Chiapas 104986 +2662 Cunduacan MEX Tabasco 104164 +2663 Rio Bravo MEX Tamaulipas 103901 +2664 Temapache MEX Veracruz 102824 +2665 Chilapa de Alvarez MEX Guerrero 102716 +2666 Hidalgo del Parral MEX Chihuahua 100881 +2667 San Francisco del Rincon MEX Guanajuato 100149 +2668 Taxco de Alarcon MEX Guerrero 99907 +2669 Zumpango MEX Mexico 99781 +2670 San Pedro Cholula MEX Puebla 99734 +2671 Lerma MEX Mexico 99714 +2672 Tecoman MEX Colima 99296 +2673 Las Margaritas MEX Chiapas 97389 +2674 Cosoleacaque MEX Veracruz 97199 +2675 San Luis de la Paz MEX Guanajuato 96763 +2676 Jose Azueta MEX Guerrero 95448 +2677 Santiago Ixcuintla MEX Nayarit 95311 +2678 San Felipe MEX Guanajuato 95305 +2679 Tejupilco MEX Mexico 94934 +2680 Tantoyuca MEX Veracruz 94709 +2681 Salvatierra MEX Guanajuato 94322 +2682 Tultepec MEX Mexico 93364 +2683 Temixco MEX Morelos 92686 +2684 Matamoros MEX Coahuila de Zaragoza 91858 +2685 Panuco MEX Veracruz 90551 +2686 El Fuerte MEX Sinaloa 89556 +2687 Tierra Blanca MEX Veracruz 89143 +2688 Weno FSM Chuuk 22000 +2689 Palikir FSM Pohnpei 8600 +2690 Chisinau MDA Chisinau 719900 +2691 Tiraspol MDA Dnjestria 194300 +2692 Balti MDA Balti 153400 +2693 Bender (Tighina) MDA Bender (Tighina) 125700 +2694 Monte-Carlo MCO A 13154 +2695 Monaco-Ville MCO A 1234 +2696 Ulan Bator MNG Ulaanbaatar 773700 +2697 Plymouth MSR Plymouth 2000 +2698 Maputo MOZ Maputo 1018938 +2699 Matola MOZ Maputo 424662 +2700 Beira MOZ Sofala 397368 +2701 Nampula MOZ Nampula 303346 +2702 Chimoio MOZ Manica 171056 +2703 Nacala-Porto MOZ Nampula 158248 +2704 Quelimane MOZ Zambezia 150116 +2705 Mocuba MOZ Zambezia 124700 +2706 Tete MOZ Tete 101984 +2707 Xai-Xai MOZ Gaza 99442 +2708 Gurue MOZ Zambezia 99300 +2709 Maxixe MOZ Inhambane 93985 +2710 Rangoon (Yangon) MMR Rangoon [Yangon] 3361700 +2711 Mandalay MMR Mandalay 885300 +2712 Moulmein (Mawlamyine) MMR Mon 307900 +2713 Pegu (Bago) MMR Pegu [Bago] 190900 +2714 Bassein (Pathein) MMR Irrawaddy [Ayeyarwad 183900 +2715 Monywa MMR Sagaing 138600 +2716 Sittwe (Akyab) MMR Rakhine 137600 +2717 Taunggyi (Taunggye) MMR Shan 131500 +2718 Meikhtila MMR Mandalay 129700 +2719 Mergui (Myeik) MMR Tenasserim [Tanintha 122700 +2720 Lashio (Lasho) MMR Shan 107600 +2721 Prome (Pyay) MMR Pegu [Bago] 105700 +2722 Henzada (Hinthada) MMR Irrawaddy [Ayeyarwad 104700 +2723 Myingyan MMR Mandalay 103600 +2724 Tavoy (Dawei) MMR Tenasserim [Tanintha 96800 +2725 Pagakku (Pakokku) MMR Magwe [Magway] 94800 +2726 Windhoek NAM Khomas 169000 +2727 Yangor NRU A 4050 +2728 Yaren NRU A 559 +2729 Kathmandu NPL Central 591835 +2730 Biratnagar NPL Eastern 157764 +2731 Pokhara NPL Western 146318 +2732 Lalitapur NPL Central 145847 +2733 Birgunj NPL Central 90639 +2734 Managua NIC Managua 959000 +2735 Leon NIC Leon 123865 +2736 Chinandega NIC Chinandega 97387 +2737 Masaya NIC Masaya 88971 +2738 Niamey NER Niamey 420000 +2739 Zinder NER Zinder 120892 +2740 Maradi NER Maradi 112965 +2741 Lagos NGA Lagos 1518000 +2742 Ibadan NGA Oyo & Osun 1432000 +2743 Ogbomosho NGA Oyo & Osun 730000 +2744 Kano NGA Kano & Jigawa 674100 +2745 Oshogbo NGA Oyo & Osun 476800 +2746 Ilorin NGA Kwara & Kogi 475800 +2747 Abeokuta NGA Ogun 427400 +2748 Port Harcourt NGA Rivers & Bayelsa 410000 +2749 Zaria NGA Kaduna 379200 +2750 Ilesha NGA Oyo & Osun 378400 +2751 Onitsha NGA Anambra & Enugu & Eb 371900 +2752 Iwo NGA Oyo & Osun 362000 +2753 Ado-Ekiti NGA Ondo & Ekiti 359400 +2754 Abuja NGA Federal Capital Dist 350100 +2755 Kaduna NGA Kaduna 342200 +2756 Mushin NGA Lagos 333200 +2757 Maiduguri NGA Borno & Yobe 320000 +2758 Enugu NGA Anambra & Enugu & Eb 316100 +2759 Ede NGA Oyo & Osun 307100 +2760 Aba NGA Imo & Abia 298900 +2761 Ife NGA Oyo & Osun 296800 +2762 Ila NGA Oyo & Osun 264000 +2763 Oyo NGA Oyo & Osun 256400 +2764 Ikerre NGA Ondo & Ekiti 244600 +2765 Benin City NGA Edo & Delta 229400 +2766 Iseyin NGA Oyo & Osun 217300 +2767 Katsina NGA Katsina 206500 +2768 Jos NGA Plateau & Nassarawa 206300 +2769 Sokoto NGA Sokoto & Kebbi & Zam 204900 +2770 Ilobu NGA Oyo & Osun 199000 +2771 Offa NGA Kwara & Kogi 197200 +2772 Ikorodu NGA Lagos 184900 +2773 Ilawe-Ekiti NGA Ondo & Ekiti 184500 +2774 Owo NGA Ondo & Ekiti 183500 +2775 Ikirun NGA Oyo & Osun 181400 +2776 Shaki NGA Oyo & Osun 174500 +2777 Calabar NGA Cross River 174400 +2778 Ondo NGA Ondo & Ekiti 173600 +2779 Akure NGA Ondo & Ekiti 162300 +2780 Gusau NGA Sokoto & Kebbi & Zam 158000 +2781 Ijebu-Ode NGA Ogun 156400 +2782 Effon-Alaiye NGA Oyo & Osun 153100 +2783 Kumo NGA Bauchi & Gombe 148000 +2784 Shomolu NGA Lagos 147700 +2785 Oka-Akoko NGA Ondo & Ekiti 142900 +2786 Ikare NGA Ondo & Ekiti 140800 +2787 Sapele NGA Edo & Delta 139200 +2788 Deba Habe NGA Bauchi & Gombe 138600 +2789 Minna NGA Niger 136900 +2790 Warri NGA Edo & Delta 126100 +2791 Bida NGA Niger 125500 +2792 Ikire NGA Oyo & Osun 123300 +2793 Makurdi NGA Benue 123100 +2794 Lafia NGA Plateau & Nassarawa 122500 +2795 Inisa NGA Oyo & Osun 119800 +2796 Shagamu NGA Ogun 117200 +2797 Awka NGA Anambra & Enugu & Eb 111200 +2798 Gombe NGA Bauchi & Gombe 107800 +2799 Igboho NGA Oyo & Osun 106800 +2800 Ejigbo NGA Oyo & Osun 105900 +2801 Agege NGA Lagos 105000 +2802 Ise-Ekiti NGA Ondo & Ekiti 103400 +2803 Ugep NGA Cross River 102600 +2804 Epe NGA Lagos 101000 +2805 Alofi NIU A 682 +2806 Kingston NFK A 800 +2807 Oslo NOR Oslo 508726 +2808 Bergen NOR Hordaland 230948 +2809 Trondheim NOR Sor-Trondelag 150166 +2810 Stavanger NOR Rogaland 108848 +2811 Barum NOR Akershus 101340 +2812 Abidjan CIV Abidjan 2500000 +2813 Bouake CIV Bouake 329850 +2814 Yamoussoukro CIV Yamoussoukro 130000 +2815 Daloa CIV Daloa 121842 +2816 Korhogo CIV Korhogo 109445 +2817 al-Sib OMN Masqat 155000 +2818 Salala OMN Zufar 131813 +2819 Bawshar OMN Masqat 107500 +2820 Suhar OMN al-Batina 90814 +2821 Masqat OMN Masqat 51969 +2822 Karachi PAK Sindh 9269265 +2823 Lahore PAK Punjab 5063499 +2824 Faisalabad PAK Punjab 1977246 +2825 Rawalpindi PAK Punjab 1406214 +2826 Multan PAK Punjab 1182441 +2827 Hyderabad PAK Sindh 1151274 +2828 Gujranwala PAK Punjab 1124749 +2829 Peshawar PAK Nothwest Border Prov 988005 +2830 Quetta PAK Baluchistan 560307 +2831 Islamabad PAK Islamabad 524500 +2832 Sargodha PAK Punjab 455360 +2833 Sialkot PAK Punjab 417597 +2834 Bahawalpur PAK Punjab 403408 +2835 Sukkur PAK Sindh 329176 +2836 Jhang PAK Punjab 292214 +2837 Sheikhupura PAK Punjab 271875 +2838 Larkana PAK Sindh 270366 +2839 Gujrat PAK Punjab 250121 +2840 Mardan PAK Nothwest Border Prov 244511 +2841 Kasur PAK Punjab 241649 +2842 Rahim Yar Khan PAK Punjab 228479 +2843 Sahiwal PAK Punjab 207388 +2844 Okara PAK Punjab 200901 +2845 Wah PAK Punjab 198400 +2846 Dera Ghazi Khan PAK Punjab 188100 +2847 Mirpur Khas PAK Sind 184500 +2848 Nawabshah PAK Sind 183100 +2849 Mingora PAK Nothwest Border Prov 174500 +2850 Chiniot PAK Punjab 169300 +2851 Kamoke PAK Punjab 151000 +2852 Mandi Burewala PAK Punjab 149900 +2853 Jhelum PAK Punjab 145800 +2854 Sadiqabad PAK Punjab 141500 +2855 Jacobabad PAK Sind 137700 +2856 Shikarpur PAK Sind 133300 +2857 Khanewal PAK Punjab 133000 +2858 Hafizabad PAK Punjab 130200 +2859 Kohat PAK Nothwest Border Prov 125300 +2860 Muzaffargarh PAK Punjab 121600 +2861 Khanpur PAK Punjab 117800 +2862 Gojra PAK Punjab 115000 +2863 Bahawalnagar PAK Punjab 109600 +2864 Muridke PAK Punjab 108600 +2865 Pak Pattan PAK Punjab 107800 +2866 Abottabad PAK Nothwest Border Prov 106000 +2867 Tando Adam PAK Sind 103400 +2868 Jaranwala PAK Punjab 103300 +2869 Khairpur PAK Sind 102200 +2870 Chishtian Mandi PAK Punjab 101700 +2871 Daska PAK Punjab 101500 +2872 Dadu PAK Sind 98600 +2873 Mandi Bahauddin PAK Punjab 97300 +2874 Ahmadpur East PAK Punjab 96000 +2875 Kamalia PAK Punjab 95300 +2876 Khuzdar PAK Baluchistan 93100 +2877 Vihari PAK Punjab 92300 +2878 Dera Ismail Khan PAK Nothwest Border Prov 90400 +2879 Wazirabad PAK Punjab 89700 +2880 Nowshera PAK Nothwest Border Prov 89400 +2881 Koror PLW Koror 12000 +2882 Ciudad de Panama PAN Panama 471373 +2883 San Miguelito PAN San Miguelito 315382 +2884 Port Moresby PNG National Capital Dis 247000 +2885 Asuncion PRY Asuncion 557776 +2886 Ciudad del Este PRY Alto Parana 133881 +2887 San Lorenzo PRY Central 133395 +2888 Lambare PRY Central 99681 +2889 Fernando de la Mora PRY Central 95287 +2890 Lima PER Lima 6464693 +2891 Arequipa PER Arequipa 762000 +2892 Trujillo PER La Libertad 652000 +2893 Chiclayo PER Lambayeque 517000 +2894 Callao PER Callao 424294 +2895 Iquitos PER Loreto 367000 +2896 Chimbote PER Ancash 336000 +2897 Huancayo PER Junin 327000 +2898 Piura PER Piura 325000 +2899 Cusco PER Cusco 291000 +2900 Pucallpa PER Ucayali 220866 +2901 Tacna PER Tacna 215683 +2902 Ica PER Ica 194820 +2903 Sullana PER Piura 147361 +2904 Juliaca PER Puno 142576 +2905 Huanuco PER Huanuco 129688 +2906 Ayacucho PER Ayacucho 118960 +2907 Chincha Alta PER Ica 110016 +2908 Cajamarca PER Cajamarca 108009 +2909 Puno PER Puno 101578 +2910 Ventanilla PER Callao 101056 +2911 Castilla PER Piura 90642 +2912 Adamstown PCN A 42 +2913 Garapan MNP Saipan 9200 +2914 Lisboa PRT Lisboa 563210 +2915 Porto PRT Porto 273060 +2916 Amadora PRT Lisboa 122106 +2917 Coimbra PRT Coimbra 96100 +2918 Braga PRT Braga 90535 +2919 San Juan PRI San Juan 434374 +2920 Bayamon PRI Bayamon 224044 +2921 Ponce PRI Ponce 186475 +2922 Carolina PRI Carolina 186076 +2923 Caguas PRI Caguas 140502 +2924 Arecibo PRI Arecibo 100131 +2925 Guaynabo PRI Guaynabo 100053 +2926 Mayaguez PRI Mayaguez 98434 +2927 Toa Baja PRI Toa Baja 94085 +2928 Warszawa POL Mazowieckie 1615369 +2929 Lodz POL Lodzkie 800110 +2930 Krakow POL Malopolskie 738150 +2931 Wroclaw POL Dolnoslaskie 636765 +2932 Poznan POL Wielkopolskie 576899 +2933 Gdansk POL Pomorskie 458988 +2934 Szczecin POL Zachodnio-Pomorskie 416988 +2935 Bydgoszcz POL Kujawsko-Pomorskie 386855 +2936 Lublin POL Lubelskie 356251 +2937 Katowice POL Slaskie 345934 +2938 Bialystok POL Podlaskie 283937 +2939 Czestochowa POL Slaskie 257812 +2940 Gdynia POL Pomorskie 253521 +2941 Sosnowiec POL Slaskie 244102 +2942 Radom POL Mazowieckie 232262 +2943 Kielce POL Swietokrzyskie 212383 +2944 Gliwice POL Slaskie 212164 +2945 Torun POL Kujawsko-Pomorskie 206158 +2946 Bytom POL Slaskie 205560 +2947 Zabrze POL Slaskie 200177 +2948 Bielsko-Biala POL Slaskie 180307 +2949 Olsztyn POL Warminsko-Mazurskie 170904 +2950 Rzeszow POL Podkarpackie 162049 +2951 Ruda Slaska POL Slaskie 159665 +2952 Rybnik POL Slaskie 144582 +2953 Walbrzych POL Dolnoslaskie 136923 +2954 Tychy POL Slaskie 133178 +2955 Dabrowa Gornicza POL Slaskie 131037 +2956 Plock POL Mazowieckie 131011 +2957 Elblag POL Warminsko-Mazurskie 129782 +2958 Opole POL Opolskie 129553 +2959 Gorzow Wielkopolski POL Lubuskie 126019 +2960 Wloclawek POL Kujawsko-Pomorskie 123373 +2961 Chorzow POL Slaskie 121708 +2962 Tarnow POL Malopolskie 121494 +2963 Zielona Gora POL Lubuskie 118182 +2964 Koszalin POL Zachodnio-Pomorskie 112375 +2965 Legnica POL Dolnoslaskie 109335 +2966 Kalisz POL Wielkopolskie 106641 +2967 Grudziadz POL Kujawsko-Pomorskie 102434 +2968 Slupsk POL Pomorskie 102370 +2969 Jastrzebie-Zdroj POL Slaskie 102294 +2970 Jaworzno POL Slaskie 97929 +2971 Jelenia Gora POL Dolnoslaskie 93901 +2972 Malabo GNQ Bioko 40000 +2973 Doha QAT Doha 355000 +2974 Paris FRA Ile-de-France 2125246 +2975 Marseille FRA Provence-Alpes-Cote 798430 +2976 Lyon FRA Rhone-Alpes 445452 +2977 Toulouse FRA Midi-Pyrenees 390350 +2978 Nice FRA Provence-Alpes-Cote 342738 +2979 Nantes FRA Pays de la Loire 270251 +2980 Strasbourg FRA Alsace 264115 +2981 Montpellier FRA Languedoc-Roussillon 225392 +2982 Bordeaux FRA Aquitaine 215363 +2983 Rennes FRA Haute-Normandie 206229 +2984 Le Havre FRA Champagne-Ardenne 190905 +2985 Reims FRA Nord-Pas-de-Calais 187206 +2986 Lille FRA Rhone-Alpes 184657 +2987 St-Etienne FRA Bretagne 180210 +2988 Toulon FRA Provence-Alpes-Cote 160639 +2989 Grenoble FRA Rhone-Alpes 153317 +2990 Angers FRA Pays de la Loire 151279 +2991 Dijon FRA Bourgogne 149867 +2992 Brest FRA Bretagne 149634 +2993 Le Mans FRA Pays de la Loire 146105 +2994 Clermont-Ferrand FRA Auvergne 137140 +2995 Amiens FRA Picardie 135501 +2996 Aix-en-Provence FRA Provence-Alpes-Cote 134222 +2997 Limoges FRA Limousin 133968 +2998 Nimes FRA Languedoc-Roussillon 133424 +2999 Tours FRA Centre 132820 +3000 Villeurbanne FRA Rhone-Alpes 124215 +3001 Metz FRA Lorraine 123776 +3002 Besancon FRA Franche-Comte 117733 +3003 Caen FRA Basse-Normandie 113987 +3004 Orleans FRA Centre 113126 +3005 Mulhouse FRA Alsace 110359 +3006 Rouen FRA Haute-Normandie 106592 +3007 Boulogne-Billancourt FRA Ile-de-France 106367 +3008 Perpignan FRA Languedoc-Roussillon 105115 +3009 Nancy FRA Lorraine 103605 +3010 Roubaix FRA Nord-Pas-de-Calais 96984 +3011 Argenteuil FRA Ile-de-France 93961 +3012 Tourcoing FRA Nord-Pas-de-Calais 93540 +3013 Montreuil FRA Ile-de-France 90674 +3014 Cayenne GUF Cayenne 50699 +3015 Faaa PYF Tahiti 25888 +3016 Papeete PYF Tahiti 25553 +3017 Saint-Denis REU Saint-Denis 131480 +3018 Bucuresti ROM Bukarest 2016131 +3019 Iasi ROM Iasi 348070 +3020 Constanta ROM Constanta 342264 +3021 Cluj-Napoca ROM Cluj 332498 +3022 Galati ROM Galati 330276 +3023 Timisoara ROM Timis 324304 +3024 Brasov ROM Brasov 314225 +3025 Craiova ROM Dolj 313530 +3026 Ploiesti ROM Prahova 251348 +3027 Braila ROM Braila 233756 +3028 Oradea ROM Bihor 222239 +3029 Bacau ROM Bacau 209235 +3030 Pitesti ROM Arges 187170 +3031 Arad ROM Arad 184408 +3032 Sibiu ROM Sibiu 169611 +3033 Targu Mures ROM Mures 165153 +3034 Baia Mare ROM Maramures 149665 +3035 Buzau ROM Buzau 148372 +3036 Satu Mare ROM Satu Mare 130059 +3037 Botosani ROM Botosani 128730 +3038 Piatra Neamt ROM Neamt 125070 +3039 Ramnicu Valcea ROM Valcea 119741 +3040 Suceava ROM Suceava 118549 +3041 Drobeta-Turnu Severin ROM Mehedinti 117865 +3042 Targoviste ROM Dambovita 98980 +3043 Focsani ROM Vrancea 98979 +3044 Targu Jiu ROM Gorj 98524 +3045 Tulcea ROM Tulcea 96278 +3046 Resita ROM Caras-Severin 93976 +3047 Kigali RWA Kigali 286000 +3048 Stockholm SWE Lisboa 750348 +3049 Gothenburg [Goteborg] SWE West Gotanmaan lan 466990 +3050 Malmo SWE Skane lan 259579 +3051 Uppsala SWE Uppsala lan 189569 +3052 Linkoping SWE East Gotanmaan lan 133168 +3053 Vasteras SWE Vastmanlands lan 126328 +3054 Orebro SWE Orebros lan 124207 +3055 Norrkoping SWE East Gotanmaan lan 122199 +3056 Helsingborg SWE Skane lan 117737 +3057 Jonkoping SWE Jonkopings lan 117095 +3058 Umea SWE Vasterbottens lan 104512 +3059 Lund SWE Skane lan 98948 +3060 Boras SWE West Gotanmaan lan 96883 +3061 Sundsvall SWE Vasternorrlands lan 93126 +3062 Gavle SWE Gavleborgs lan 90742 +3063 Jamestown SHN Saint Helena 1500 +3064 Basseterre KNA St George Basseterre 11600 +3065 Castries LCA Castries 2301 +3066 Kingstown VCT St George 17100 +3067 Saint-Pierre SPM Saint-Pierre 5808 +3068 Berlin DEU Berliini 3386667 +3069 Hamburg DEU Hamburg 1704735 +3070 Munich [Munchen] DEU Baijeri 1194560 +3071 Koln DEU Nordrhein-Westfalen 962507 +3072 Frankfurt am Main DEU Hessen 643821 +3073 Essen DEU Nordrhein-Westfalen 599515 +3074 Dortmund DEU Nordrhein-Westfalen 590213 +3075 Stuttgart DEU Baden-Wurttemberg 582443 +3076 Dusseldorf DEU Nordrhein-Westfalen 568855 +3077 Bremen DEU Bremen 540330 +3078 Duisburg DEU Nordrhein-Westfalen 519793 +3079 Hannover DEU Niedersachsen 514718 +3080 Leipzig DEU Saksi 489532 +3081 Nurnberg DEU Baijeri 486628 +3082 Dresden DEU Saksi 476668 +3083 Bochum DEU Nordrhein-Westfalen 392830 +3084 Wuppertal DEU Nordrhein-Westfalen 368993 +3085 Bielefeld DEU Nordrhein-Westfalen 321125 +3086 Mannheim DEU Baden-Wurttemberg 307730 +3087 Bonn DEU Nordrhein-Westfalen 301048 +3088 Gelsenkirchen DEU Nordrhein-Westfalen 281979 +3089 Karlsruhe DEU Baden-Wurttemberg 277204 +3090 Wiesbaden DEU Hessen 268716 +3091 Munster DEU Nordrhein-Westfalen 264670 +3092 Monchengladbach DEU Nordrhein-Westfalen 263697 +3093 Chemnitz DEU Saksi 263222 +3094 Augsburg DEU Baijeri 254867 +3095 Halle/Saale DEU Anhalt Sachsen 254360 +3096 Braunschweig DEU Niedersachsen 246322 +3097 Aachen DEU Nordrhein-Westfalen 243825 +3098 Krefeld DEU Nordrhein-Westfalen 241769 +3099 Magdeburg DEU Anhalt Sachsen 235073 +3100 Kiel DEU Schleswig-Holstein 233795 +3101 Oberhausen DEU Nordrhein-Westfalen 222349 +3102 Lubeck DEU Schleswig-Holstein 213326 +3103 Hagen DEU Nordrhein-Westfalen 205201 +3104 Rostock DEU Mecklenburg-Vorpomme 203279 +3105 Freiburg im Breisgau DEU Baden-Wurttemberg 202455 +3106 Erfurt DEU Thuringen 201267 +3107 Kassel DEU Hessen 196211 +3108 Saarbrucken DEU Saarland 183836 +3109 Mainz DEU Rheinland-Pfalz 183134 +3110 Hamm DEU Nordrhein-Westfalen 181804 +3111 Herne DEU Nordrhein-Westfalen 175661 +3112 Mulheim an der Ruhr DEU Nordrhein-Westfalen 173895 +3113 Solingen DEU Nordrhein-Westfalen 165583 +3114 Osnabruck DEU Niedersachsen 164539 +3115 Ludwigshafen am Rhein DEU Rheinland-Pfalz 163771 +3116 Leverkusen DEU Nordrhein-Westfalen 160841 +3117 Oldenburg DEU Niedersachsen 154125 +3118 Neuss DEU Nordrhein-Westfalen 149702 +3119 Heidelberg DEU Baden-Wurttemberg 139672 +3120 Darmstadt DEU Hessen 137776 +3121 Paderborn DEU Nordrhein-Westfalen 137647 +3122 Potsdam DEU Brandenburg 128983 +3123 Wurzburg DEU Baijeri 127350 +3124 Regensburg DEU Baijeri 125236 +3125 Recklinghausen DEU Nordrhein-Westfalen 125022 +3126 Gottingen DEU Niedersachsen 124775 +3127 Bremerhaven DEU Bremen 122735 +3128 Wolfsburg DEU Niedersachsen 121954 +3129 Bottrop DEU Nordrhein-Westfalen 121097 +3130 Remscheid DEU Nordrhein-Westfalen 120125 +3131 Heilbronn DEU Baden-Wurttemberg 119526 +3132 Pforzheim DEU Baden-Wurttemberg 117227 +3133 Offenbach am Main DEU Hessen 116627 +3134 Ulm DEU Baden-Wurttemberg 116103 +3135 Ingolstadt DEU Baijeri 114826 +3136 Gera DEU Thuringen 114718 +3137 Salzgitter DEU Niedersachsen 112934 +3138 Cottbus DEU Brandenburg 110894 +3139 Reutlingen DEU Baden-Wurttemberg 110343 +3140 Furth DEU Baijeri 109771 +3141 Siegen DEU Nordrhein-Westfalen 109225 +3142 Koblenz DEU Rheinland-Pfalz 108003 +3143 Moers DEU Nordrhein-Westfalen 106837 +3144 Bergisch Gladbach DEU Nordrhein-Westfalen 106150 +3145 Zwickau DEU Saksi 104146 +3146 Hildesheim DEU Niedersachsen 104013 +3147 Witten DEU Nordrhein-Westfalen 103384 +3148 Schwerin DEU Mecklenburg-Vorpomme 102878 +3149 Erlangen DEU Baijeri 100750 +3150 Kaiserslautern DEU Rheinland-Pfalz 100025 +3151 Trier DEU Rheinland-Pfalz 99891 +3152 Jena DEU Thuringen 99779 +3153 Iserlohn DEU Nordrhein-Westfalen 99474 +3154 Gutersloh DEU Nordrhein-Westfalen 95028 +3155 Marl DEU Nordrhein-Westfalen 93735 +3156 Lunen DEU Nordrhein-Westfalen 92044 +3157 Duren DEU Nordrhein-Westfalen 91092 +3158 Ratingen DEU Nordrhein-Westfalen 90951 +3159 Velbert DEU Nordrhein-Westfalen 89881 +3160 Esslingen am Neckar DEU Baden-Wurttemberg 89667 +3161 Honiara SLB Honiara 50100 +3162 Lusaka ZMB Lusaka 1317000 +3163 Ndola ZMB Copperbelt 329200 +3164 Kitwe ZMB Copperbelt 288600 +3165 Kabwe ZMB Central 154300 +3166 Chingola ZMB Copperbelt 142400 +3167 Mufulira ZMB Copperbelt 123900 +3168 Luanshya ZMB Copperbelt 118100 +3169 Apia WSM Upolu 35900 +3170 Serravalle SMR Serravalle/Dogano 4802 +3171 San Marino SMR San Marino 2294 +3172 Sao Tome STP Aqua Grande 49541 +3173 Riyadh SAU Riyadh 3324000 +3174 Jedda SAU Mekka 2046300 +3175 Mekka SAU Mekka 965700 +3176 Medina SAU Medina 608300 +3177 al-Dammam SAU al-Sharqiya 482300 +3178 al-Taif SAU Mekka 416100 +3179 Tabuk SAU Tabuk 292600 +3180 Burayda SAU al-Qasim 248600 +3181 al-Hufuf SAU al-Sharqiya 225800 +3182 al-Mubarraz SAU al-Sharqiya 219100 +3183 Khamis Mushayt SAU Asir 217900 +3184 Hail SAU Hail 176800 +3185 al-Kharj SAU Riad 152100 +3186 al-Khubar SAU al-Sharqiya 141700 +3187 Jubayl SAU al-Sharqiya 140800 +3188 Hafar al-Batin SAU al-Sharqiya 137800 +3189 al-Tuqba SAU al-Sharqiya 125700 +3190 Yanbu SAU Medina 119800 +3191 Abha SAU Asir 112300 +3192 Araar SAU al-Khudud al-Samaliy 108100 +3193 al-Qatif SAU al-Sharqiya 98900 +3194 al-Hawiya SAU Mekka 93900 +3195 Unayza SAU Qasim 91100 +3196 Najran SAU Najran 91000 +3197 Pikine SEN Cap-Vert 855287 +3198 Dakar SEN Cap-Vert 785071 +3199 Thies SEN Thies 248000 +3200 Kaolack SEN Kaolack 199000 +3201 Ziguinchor SEN Ziguinchor 192000 +3202 Rufisque SEN Cap-Vert 150000 +3203 Saint-Louis SEN Saint-Louis 132400 +3204 Mbour SEN Thies 109300 +3205 Diourbel SEN Diourbel 99400 +3206 Victoria SYC Mahe 41000 +3207 Freetown SLE Western 850000 +3208 Singapore SGP A 4017733 +3209 Bratislava SVK Bratislava 448292 +3210 Kodice SVK Vychodne Slovensko 241874 +3211 Predov SVK Vychodne Slovensko 93977 +3212 Ljubljana SVN Osrednjeslovenska 270986 +3213 Maribor SVN Podravska 115532 +3214 Mogadishu SOM Banaadir 997000 +3215 Hargeysa SOM Woqooyi Galbeed 90000 +3216 Kismaayo SOM Jubbada Hoose 90000 +3217 Colombo LKA Western 645000 +3218 Dehiwala LKA Western 203000 +3219 Moratuwa LKA Western 190000 +3220 Jaffna LKA Northern 149000 +3221 Kandy LKA Central 140000 +3222 Sri Jayawardenepura Kotte LKA Western 118000 +3223 Negombo LKA Western 100000 +3224 Omdurman SDN Khartum 1271403 +3225 Khartum SDN Khartum 947483 +3226 Sharq al-Nil SDN Khartum 700887 +3227 Port Sudan SDN al-Bahr al-Ahmar 308195 +3228 Kassala SDN Kassala 234622 +3229 Obeid SDN Kurdufan al-Shamaliy 229425 +3230 Nyala SDN Darfur al-Janubiya 227183 +3231 Wad Madani SDN al-Jazira 211362 +3232 al-Qadarif SDN al-Qadarif 191164 +3233 Kusti SDN al-Bahr al-Abyad 173599 +3234 al-Fashir SDN Darfur al-Shamaliya 141884 +3235 Juba SDN Bahr al-Jabal 114980 +3236 Helsinki [Helsingfors] FIN Newmaa 555474 +3237 Espoo FIN Newmaa 213271 +3238 Tampere FIN Pirkanmaa 195468 +3239 Vantaa FIN Newmaa 178471 +3240 Turku [Abo] FIN Varsinais-Suomi 172561 +3241 Oulu FIN Pohjois-Pohjanmaa 120753 +3242 Lahti FIN Paijat-Hame 96921 +3243 Paramaribo SUR Paramaribo 112000 +3244 Mbabane SWZ Hhohho 61000 +3245 Zurich CHE Zurich 336800 +3246 Geneve CHE Geneve 173500 +3247 Basel CHE Basel-Stadt 166700 +3248 Bern CHE Bern 122700 +3249 Lausanne CHE Vaud 114500 +3250 Damascus SYR Damascus 1347000 +3251 Aleppo SYR Aleppo 1261983 +3252 Hims SYR Hims 507404 +3253 Hama SYR Hama 343361 +3254 Latakia SYR Latakia 264563 +3255 al-Qamishliya SYR al-Hasaka 144286 +3256 Dayr al-Zawr SYR Dayr al-Zawr 140459 +3257 Jaramana SYR Damaskos 138469 +3258 Duma SYR Damaskos 131158 +3259 al-Raqqa SYR al-Raqqa 108020 +3260 Idlib SYR Idlib 91081 +3261 Dushanbe TJK Karotegin 524000 +3262 Khujand TJK Khujand 161500 +3263 Taipei TWN Taipei 2641312 +3264 Kaohsiung TWN Kaohsiung 1475505 +3265 Taichung TWN Taichung 940589 +3266 Tainan TWN Tainan 728060 +3267 Panchiao TWN Taipei 523850 +3268 Chungho TWN Taipei 392176 +3269 Keelung (Chilung) TWN Keelung 385201 +3270 Sanchung TWN Taipei 380084 +3271 Hsinchuang TWN Taipei 365048 +3272 Hsinchu TWN Hsinchu 361958 +3273 Chungli TWN Taoyuan 318649 +3274 Fengshan TWN Kaohsiung 318562 +3275 Taoyuan TWN Taoyuan 316438 +3276 Chiayi TWN Chiayi 265109 +3277 Hsintien TWN Taipei 263603 +3278 Changhwa TWN Changhwa 227715 +3279 Yungho TWN Taipei 227700 +3280 Tucheng TWN Taipei 224897 +3281 Pingtung TWN Pingtung 214727 +3282 Yungkang TWN Tainan 193005 +3283 Pingchen TWN Taoyuan 188344 +3284 Tali TWN Taichung 171940 +3285 Taiping TWN 165524 +3286 Pate TWN Taoyuan 161700 +3287 Fengyuan TWN Taichung 161032 +3288 Luchou TWN Taipei 160516 +3289 Hsichuh TWN Taipei 154976 +3290 Shulin TWN Taipei 151260 +3291 Yuanlin TWN Changhwa 126402 +3292 Yangmei TWN Taoyuan 126323 +3293 Taliao TWN 115897 +3294 Kueishan TWN 112195 +3295 Tanshui TWN Taipei 111882 +3296 Taitung TWN Taitung 111039 +3297 Hualien TWN Hualien 108407 +3298 Nantou TWN Nantou 104723 +3299 Lungtan TWN Taipei 103088 +3300 Touliu TWN Yunlin 98900 +3301 Tsaotun TWN Nantou 96800 +3302 Kangshan TWN Kaohsiung 92200 +3303 Ilan TWN Ilan 92000 +3304 Miaoli TWN Miaoli 90000 +3305 Dar es Salaam TZA Dar es Salaam 1747000 +3306 Dodoma TZA Dodoma 189000 +3307 Mwanza TZA Mwanza 172300 +3308 Zanzibar TZA Zanzibar West 157634 +3309 Tanga TZA Tanga 137400 +3310 Mbeya TZA Mbeya 130800 +3311 Morogoro TZA Morogoro 117800 +3312 Arusha TZA Arusha 102500 +3313 Moshi TZA Kilimanjaro 96800 +3314 Tabora TZA Tabora 92800 +3315 Kobenhavn DNK Kobenhavn 495699 +3316 Arhus DNK Arhus 284846 +3317 Odense DNK Fyn 183912 +3318 Aalborg DNK Nordjylland 161161 +3319 Frederiksberg DNK Frederiksberg 90327 +3320 Bangkok THA Bangkok 6320174 +3321 Nonthaburi THA Nonthaburi 292100 +3322 Nakhon Ratchasima THA Nakhon Ratchasima 181400 +3323 Chiang Mai THA Chiang Mai 171100 +3324 Udon Thani THA Udon Thani 158100 +3325 Hat Yai THA Songkhla 148632 +3326 Khon Kaen THA Khon Kaen 126500 +3327 Pak Kret THA Nonthaburi 126055 +3328 Nakhon Sawan THA Nakhon Sawan 123800 +3329 Ubon Ratchathani THA Ubon Ratchathani 116300 +3330 Songkhla THA Songkhla 94900 +3331 Nakhon Pathom THA Nakhon Pathom 94100 +3332 Lome TGO Maritime 375000 +3333 Fakaofo TKL Fakaofo 300 +3334 Nukualofa TON Tongatapu 22400 +3335 Chaguanas TTO Caroni 56601 +3336 Port-of-Spain TTO Port-of-Spain 43396 +3337 NDjamena TCD Chari-Baguirmi 530965 +3338 Moundou TCD Logone Occidental 99500 +3339 Praha CZE Hlavni mesto Praha 1181126 +3340 Brno CZE Jizni Morava 381862 +3341 Ostrava CZE Severni Morava 320041 +3342 Plzen CZE Zapadni Cechy 166759 +3343 Olomouc CZE Severni Morava 102702 +3344 Liberec CZE Severni Cechy 99155 +3345 Ceske Budejovice CZE Jizni Cechy 98186 +3346 Hradec Kralove CZE Vychodni Cechy 98080 +3347 Usti nad Labem CZE Severni Cechy 95491 +3348 Pardubice CZE Vychodni Cechy 91309 +3349 Tunis TUN Tunis 690600 +3350 Sfax TUN Sfax 257800 +3351 Ariana TUN Ariana 197000 +3352 Ettadhamen TUN Ariana 178600 +3353 Sousse TUN Sousse 145900 +3354 Kairouan TUN Kairouan 113100 +3355 Biserta TUN Biserta 108900 +3356 Gabes TUN Gabes 106600 +3357 Istanbul TUR Istanbul 8787958 +3358 Ankara TUR Ankara 3038159 +3359 Izmir TUR Izmir 2130359 +3360 Adana TUR Adana 1131198 +3361 Bursa TUR Bursa 1095842 +3362 Gaziantep TUR Gaziantep 789056 +3363 Konya TUR Konya 628364 +3364 Mersin (Icel) TUR Icel 587212 +3365 Antalya TUR Antalya 564914 +3366 Diyarbakir TUR Diyarbakir 479884 +3367 Kayseri TUR Kayseri 475657 +3368 Eskisehir TUR Eskisehir 470781 +3369 Sanliurfa TUR Sanliurfa 405905 +3370 Samsun TUR Samsun 339871 +3371 Malatya TUR Malatya 330312 +3372 Gebze TUR Kocaeli 264170 +3373 Denizli TUR Denizli 253848 +3374 Sivas TUR Sivas 246642 +3375 Erzurum TUR Erzurum 246535 +3376 Tarsus TUR Adana 246206 +3377 Kahramanmaras TUR Kahramanmaras 245772 +3378 Elazig TUR Elazig 228815 +3379 Van TUR Van 219319 +3380 Sultanbeyli TUR Istanbul 211068 +3381 Izmit (Kocaeli) TUR Kocaeli 210068 +3382 Manisa TUR Manisa 207148 +3383 Batman TUR Batman 203793 +3384 Balikesir TUR Balikesir 196382 +3385 Sakarya (Adapazari) TUR Sakarya 190641 +3386 Iskenderun TUR Hatay 153022 +3387 Osmaniye TUR Osmaniye 146003 +3388 Corum TUR Corum 145495 +3389 Kutahya TUR Kutahya 144761 +3390 Hatay (Antakya) TUR Hatay 143982 +3391 Kirikkale TUR Kirikkale 142044 +3392 Adiyaman TUR Adiyaman 141529 +3393 Trabzon TUR Trabzon 138234 +3394 Ordu TUR Ordu 133642 +3395 Aydin TUR Aydin 128651 +3396 Usak TUR Usak 128162 +3397 Edirne TUR Edirne 123383 +3398 Corlu TUR Tekirdag 123300 +3399 Isparta TUR Isparta 121911 +3400 Karabuk TUR Karabuk 118285 +3401 Kilis TUR Kilis 118245 +3402 Alanya TUR Antalya 117300 +3403 Kiziltepe TUR Mardin 112000 +3404 Zonguldak TUR Zonguldak 111542 +3405 Siirt TUR Siirt 107100 +3406 Viransehir TUR Sanliurfa 106400 +3407 Tekirdag TUR Tekirdag 106077 +3408 Karaman TUR Karaman 104200 +3409 Afyon TUR Afyon 103984 +3410 Aksaray TUR Aksaray 102681 +3411 Ceyhan TUR Adana 102412 +3412 Erzincan TUR Erzincan 102304 +3413 Bismil TUR Diyarbakir 101400 +3414 Nazilli TUR Aydin 99900 +3415 Tokat TUR Tokat 99500 +3416 Kars TUR Kars 93000 +3417 Inegol TUR Bursa 90500 +3418 Bandirma TUR Balikesir 90200 +3419 Ashgabat TKM Ahal 540600 +3420 Charjew TKM Lebap 189200 +3421 Dashhowuz TKM Dashhowuz 141800 +3422 Mary TKM Mary 101000 +3423 Cockburn Town TCA Grand Turk 4800 +3424 Funafuti TUV Funafuti 4600 +3425 Kampala UGA Central 890800 +3426 Kyiv UKR Kiova 2624000 +3427 Harkova [Harkiv] UKR Harkova 1500000 +3428 Dnipropetrovsk UKR Dnipropetrovsk 1103000 +3429 Donetsk UKR Donetsk 1050000 +3430 Odesa UKR Odesa 1011000 +3431 Zaporizzja UKR Zaporizzja 848000 +3432 Lviv UKR Lviv 788000 +3433 Kryvyi Rig UKR Dnipropetrovsk 703000 +3434 Mykolajiv UKR Mykolajiv 508000 +3435 Mariupol UKR Donetsk 490000 +3436 Lugansk UKR Lugansk 469000 +3437 Vinnytsja UKR Vinnytsja 391000 +3438 Makijivka UKR Donetsk 384000 +3439 Herson UKR Herson 353000 +3440 Sevastopol UKR Krim 348000 +3441 Simferopol UKR Krim 339000 +3442 Pultava [Poltava] UKR Pultava 313000 +3443 Tdernigiv UKR Tdernigiv 313000 +3444 Tderkasy UKR Tderkasy 309000 +3445 Gorlivka UKR Donetsk 299000 +3446 Zytomyr UKR Zytomyr 297000 +3447 Sumy UKR Sumy 294000 +3448 Dniprodzerzynsk UKR Dnipropetrovsk 270000 +3449 Kirovograd UKR Kirovograd 265000 +3450 Hmelnytskyi UKR Hmelnytskyi 262000 +3451 Tdernivtsi UKR Tdernivtsi 259000 +3452 Rivne UKR Rivne 245000 +3453 Krementduk UKR Pultava 239000 +3454 Ivano-Frankivsk UKR Ivano-Frankivsk 237000 +3455 Ternopil UKR Ternopil 236000 +3456 Lutsk UKR Volynia 217000 +3457 Bila Tserkva UKR Kiova 215000 +3458 Kramatorsk UKR Donetsk 186000 +3459 Melitopol UKR Zaporizzja 169000 +3460 Kertd UKR Krim 162000 +3461 Nikopol UKR Dnipropetrovsk 149000 +3462 Berdjansk UKR Zaporizzja 130000 +3463 Pavlograd UKR Dnipropetrovsk 127000 +3464 Sjeverodonetsk UKR Lugansk 127000 +3465 Slovjansk UKR Donetsk 127000 +3466 Uzgorod UKR Taka-Karpatia 127000 +3467 Altdevsk UKR Lugansk 119000 +3468 Lysytdansk UKR Lugansk 116000 +3469 Jevpatorija UKR Krim 112000 +3470 Kamjanets-Podilskyi UKR Hmelnytskyi 109000 +3471 Jenakijeve UKR Donetsk 105000 +3472 Krasnyi Lutd UKR Lugansk 101000 +3473 Stahanov UKR Lugansk 101000 +3474 Oleksandrija UKR Kirovograd 99000 +3475 Konotop UKR Sumy 96000 +3476 Kostjantynivka UKR Donetsk 95000 +3477 Berdytdiv UKR Zytomyr 90000 +3478 Izmajil UKR Odesa 90000 +3479 Gostka UKR Sumy 90000 +3480 Uman UKR Tderkasy 90000 +3481 Brovary UKR Kiova 89000 +3482 Mukatdeve UKR Taka-Karpatia 89000 +3483 Budapest HUN Budapest 1811552 +3484 Debrecen HUN Hajdu-Bihar 203648 +3485 Miskolc HUN Borsod-Abauj-Zemplen 172357 +3486 Szeged HUN Csongrad 158158 +3487 Pecs HUN Baranya 157332 +3488 Gyor HUN Gyor-Moson-Sopron 127119 +3489 Nyiregyhaza HUN Szabolcs-Szatmar-Ber 112419 +3490 Kecskemet HUN Bacs-Kiskun 105606 +3491 Szekesfehervar HUN Fejer 105119 +3492 Montevideo URY Montevideo 1236000 +3493 Noumea NCL A 76293 +3494 Auckland NZL Auckland 381800 +3495 Christchurch NZL Canterbury 324200 +3496 Manukau NZL Auckland 281800 +3497 North Shore NZL Auckland 187700 +3498 Waitakere NZL Auckland 170600 +3499 Wellington NZL Wellington 166700 +3500 Dunedin NZL Dunedin 119600 +3501 Hamilton NZL Hamilton 117100 +3502 Lower Hutt NZL Wellington 98100 +3503 Toskent UZB Toskent Shahri 2117500 +3504 Namangan UZB Namangan 370500 +3505 Samarkand UZB Samarkand 361800 +3506 Andijon UZB Andijon 318600 +3507 Buhoro UZB Buhoro 237100 +3508 Karsi UZB Qashqadaryo 194100 +3509 Nukus UZB Karakalpakistan 194100 +3510 KuKon UZB Fargona 190100 +3511 Fargona UZB Fargona 180500 +3512 Circik UZB Toskent 146400 +3513 Margilon UZB Fargona 140800 +3514 Urgenc UZB Khorazm 138900 +3515 Angren UZB Toskent 128000 +3516 Cizah UZB Cizah 124800 +3517 Navoi UZB Navoi 116300 +3518 Olmalik UZB Toskent 114900 +3519 Termiz UZB Surkhondaryo 109500 +3520 Minsk BLR Horad Minsk 1674000 +3521 Gomel BLR Gomel 475000 +3522 Mogiljov BLR Mogiljov 356000 +3523 Vitebsk BLR Vitebsk 340000 +3524 Grodno BLR Grodno 302000 +3525 Brest BLR Brest 286000 +3526 Bobruisk BLR Mogiljov 221000 +3527 Baranovitdi BLR Brest 167000 +3528 Borisov BLR Minsk 151000 +3529 Pinsk BLR Brest 130000 +3530 Orda BLR Vitebsk 124000 +3531 Mozyr BLR Gomel 110000 +3532 Novopolotsk BLR Vitebsk 106000 +3533 Lida BLR Grodno 101000 +3534 Soligorsk BLR Minsk 101000 +3535 Molodetdno BLR Minsk 97000 +3536 Mata-Utu WLF Wallis 1137 +3537 Port-Vila VUT Shefa 33700 +3538 Citta del Vaticano VAT A 455 +3539 Caracas VEN Distrito Federal 1975294 +3540 Maracaibo VEN Zulia 1304776 +3541 Barquisimeto VEN Lara 877239 +3542 Valencia VEN Carabobo 794246 +3543 Ciudad Guayana VEN Bolivar 663713 +3544 Petare VEN Miranda 488868 +3545 Maracay VEN Aragua 444443 +3546 Barcelona VEN Anzoategui 322267 +3547 Maturin VEN Monagas 319726 +3548 San Cristobal VEN Tachira 319373 +3549 Ciudad Bolivar VEN Bolivar 301107 +3550 Cumana VEN Sucre 293105 +3551 Merida VEN Merida 224887 +3552 Cabimas VEN Zulia 221329 +3553 Barinas VEN Barinas 217831 +3554 Turmero VEN Aragua 217499 +3555 Baruta VEN Miranda 207290 +3556 Puerto Cabello VEN Carabobo 187722 +3557 Santa Ana de Coro VEN Falcon 185766 +3558 Los Teques VEN Miranda 178784 +3559 Punto Fijo VEN Falcon 167215 +3560 Guarenas VEN Miranda 165889 +3561 Acarigua VEN Portuguesa 158954 +3562 Puerto La Cruz VEN Anzoategui 155700 +3563 Ciudad Losada VEN 134501 +3564 Guacara VEN Carabobo 131334 +3565 Valera VEN Trujillo 130281 +3566 Guanare VEN Portuguesa 125621 +3567 Carupano VEN Sucre 119639 +3568 Catia La Mar VEN Distrito Federal 117012 +3569 El Tigre VEN Anzoategui 116256 +3570 Guatire VEN Miranda 109121 +3571 Calabozo VEN Guarico 107146 +3572 Pozuelos VEN Anzoategui 105690 +3573 Ciudad Ojeda VEN Zulia 99354 +3574 Ocumare del Tuy VEN Miranda 97168 +3575 Valle de la Pascua VEN Guarico 95927 +3576 Araure VEN Portuguesa 94269 +3577 San Fernando de Apure VEN Apure 93809 +3578 San Felipe VEN Yaracuy 90940 +3579 El Limon VEN Aragua 90000 +3580 Moscow RUS Moscow (City) 8389200 +3581 St Petersburg RUS Pietari 4694000 +3582 Novosibirsk RUS Novosibirsk 1398800 +3583 Nizni Novgorod RUS Nizni Novgorod 1357000 +3584 Jekaterinburg RUS Sverdlovsk 1266300 +3585 Samara RUS Samara 1156100 +3586 Omsk RUS Omsk 1148900 +3587 Kazan RUS Tatarstan 1101000 +3588 Ufa RUS Badkortostan 1091200 +3589 Tdeljabinsk RUS Tdeljabinsk 1083200 +3590 Rostov-na-Donu RUS Rostov-na-Donu 1012700 +3591 Perm RUS Perm 1009700 +3592 Volgograd RUS Volgograd 993400 +3593 Voronez RUS Voronez 907700 +3594 Krasnojarsk RUS Krasnojarsk 875500 +3595 Saratov RUS Saratov 874000 +3596 Toljatti RUS Samara 722900 +3597 Uljanovsk RUS Uljanovsk 667400 +3598 Izevsk RUS Udmurtia 652800 +3599 Krasnodar RUS Krasnodar 639000 +3600 Jaroslavl RUS Jaroslavl 616700 +3601 Habarovsk RUS Habarovsk 609400 +3602 Vladivostok RUS Primorje 606200 +3603 Irkutsk RUS Irkutsk 593700 +3604 Barnaul RUS Altai 580100 +3605 Novokuznetsk RUS Kemerovo 561600 +3606 Penza RUS Penza 532200 +3607 Rjazan RUS Rjazan 529900 +3608 Orenburg RUS Orenburg 523600 +3609 Lipetsk RUS Lipetsk 521000 +3610 Nabereznyje Tdelny RUS Tatarstan 514700 +3611 Tula RUS Tula 506100 +3612 Tjumen RUS Tjumen 503400 +3613 Kemerovo RUS Kemerovo 492700 +3614 Astrahan RUS Astrahan 486100 +3615 Tomsk RUS Tomsk 482100 +3616 Kirov RUS Kirov 466200 +3617 Ivanovo RUS Ivanovo 459200 +3618 Tdeboksary RUS Tduvassia 459200 +3619 Brjansk RUS Brjansk 457400 +3620 Tver RUS Tver 454900 +3621 Kursk RUS Kursk 443500 +3622 Magnitogorsk RUS Tdeljabinsk 427900 +3623 Kaliningrad RUS Kaliningrad 424400 +3624 Nizni Tagil RUS Sverdlovsk 390900 +3625 Murmansk RUS Murmansk 376300 +3626 Ulan-Ude RUS Burjatia 370400 +3627 Kurgan RUS Kurgan 364700 +3628 Arkangeli RUS Arkangeli 361800 +3629 Sotdi RUS Krasnodar 358600 +3630 Smolensk RUS Smolensk 353400 +3631 Orjol RUS Orjol 344500 +3632 Stavropol RUS Stavropol 343300 +3633 Belgorod RUS Belgorod 342000 +3634 Kaluga RUS Kaluga 339300 +3635 Vladimir RUS Vladimir 337100 +3636 Mahatdkala RUS Dagestan 332800 +3637 Tderepovets RUS Vologda 324400 +3638 Saransk RUS Mordva 314800 +3639 Tambov RUS Tambov 312000 +3640 Vladikavkaz RUS North Ossetia-Alania 310100 +3641 Tdita RUS Tdita 309900 +3642 Vologda RUS Vologda 302500 +3643 Veliki Novgorod RUS Novgorod 299500 +3644 Komsomolsk-na-Amure RUS Habarovsk 291600 +3645 Kostroma RUS Kostroma 288100 +3646 Volzski RUS Volgograd 286900 +3647 Taganrog RUS Rostov-na-Donu 284400 +3648 Petroskoi RUS Karjala 282100 +3649 Bratsk RUS Irkutsk 277600 +3650 Dzerzinsk RUS Nizni Novgorod 277100 +3651 Surgut RUS Hanti-Mansia 274900 +3652 Orsk RUS Orenburg 273900 +3653 Sterlitamak RUS Badkortostan 265200 +3654 Angarsk RUS Irkutsk 264700 +3655 Jodkar-Ola RUS Marinmaa 249200 +3656 Rybinsk RUS Jaroslavl 239600 +3657 Prokopjevsk RUS Kemerovo 237300 +3658 Niznevartovsk RUS Hanti-Mansia 233900 +3659 Naltdik RUS Kabardi-Balkaria 233400 +3660 Syktyvkar RUS Komi 229700 +3661 Severodvinsk RUS Arkangeli 229300 +3662 Bijsk RUS Altai 225000 +3663 Niznekamsk RUS Tatarstan 223400 +3664 Blagovedtdensk RUS Amur 222000 +3665 Gahty RUS Rostov-na-Donu 221800 +3666 Staryi Oskol RUS Belgorod 213800 +3667 Zelenograd RUS Moscow (City) 207100 +3668 Balakovo RUS Saratov 206000 +3669 Novorossijsk RUS Krasnodar 203300 +3670 Pihkova RUS Pihkova 201500 +3671 Zlatoust RUS Tdeljabinsk 196900 +3672 Jakutsk RUS Saha (Jakutia) 195400 +3673 Podolsk RUS Moskova 194300 +3674 Petropavlovsk-Kamtdatski RUS Kamtdatka 194100 +3675 Kamensk-Uralski RUS Sverdlovsk 190600 +3676 Engels RUS Saratov 189000 +3677 Syzran RUS Samara 186900 +3678 Grozny RUS Tdetdenia 186000 +3679 Novotderkassk RUS Rostov-na-Donu 184400 +3680 Berezniki RUS Perm 181900 +3681 Juzno-Sahalinsk RUS Sahalin 179200 +3682 Volgodonsk RUS Rostov-na-Donu 178200 +3683 Abakan RUS Hakassia 169200 +3684 Maikop RUS Adygea 167300 +3685 Miass RUS Tdeljabinsk 166200 +3686 Armavir RUS Krasnodar 164900 +3687 Ljubertsy RUS Moskova 163900 +3688 Rubtsovsk RUS Altai 162600 +3689 Kovrov RUS Vladimir 159900 +3690 Nahodka RUS Primorje 157700 +3691 Ussurijsk RUS Primorje 157300 +3692 Salavat RUS Badkortostan 156800 +3693 Mytidtdi RUS Moskova 155700 +3694 Kolomna RUS Moskova 150700 +3695 Elektrostal RUS Moskova 147000 +3696 Murom RUS Vladimir 142400 +3697 Kolpino RUS Pietari 141200 +3698 Norilsk RUS Krasnojarsk 140800 +3699 Almetjevsk RUS Tatarstan 140700 +3700 Novomoskovsk RUS Tula 138100 +3701 Dimitrovgrad RUS Uljanovsk 137000 +3702 Pervouralsk RUS Sverdlovsk 136100 +3703 Himki RUS Moskova 133700 +3704 Baladiha RUS Moskova 132900 +3705 Nevinnomyssk RUS Stavropol 132600 +3706 Pjatigorsk RUS Stavropol 132500 +3707 Korolev RUS Moskova 132400 +3708 Serpuhov RUS Moskova 132000 +3709 Odintsovo RUS Moskova 127400 +3710 Orehovo-Zujevo RUS Moskova 124900 +3711 Kamydin RUS Volgograd 124600 +3712 Novotdeboksarsk RUS Tduvassia 123400 +3713 Tderkessk RUS Karatdai-Tderkessia 121700 +3714 Atdinsk RUS Krasnojarsk 121600 +3715 Magadan RUS Magadan 121000 +3716 Mitdurinsk RUS Tambov 120700 +3717 Kislovodsk RUS Stavropol 120400 +3718 Jelets RUS Lipetsk 119400 +3719 Seversk RUS Tomsk 118600 +3720 Noginsk RUS Moskova 117200 +3721 Velikije Luki RUS Pihkova 116300 +3722 Novokuibydevsk RUS Samara 116200 +3723 Neftekamsk RUS Badkortostan 115700 +3724 Leninsk-Kuznetski RUS Kemerovo 113800 +3725 Oktjabrski RUS Badkortostan 111500 +3726 Sergijev Posad RUS Moskova 111100 +3727 Arzamas RUS Nizni Novgorod 110700 +3728 Kiseljovsk RUS Kemerovo 110000 +3729 Novotroitsk RUS Orenburg 109600 +3730 Obninsk RUS Kaluga 108300 +3731 Kansk RUS Krasnojarsk 107400 +3732 Glazov RUS Udmurtia 106300 +3733 Solikamsk RUS Perm 106000 +3734 Sarapul RUS Udmurtia 105700 +3735 Ust-Ilimsk RUS Irkutsk 105200 +3736 Gtdolkovo RUS Moskova 104900 +3737 Mezduretdensk RUS Kemerovo 104400 +3738 Usolje-Sibirskoje RUS Irkutsk 103500 +3739 Elista RUS Kalmykia 103300 +3740 Novodahtinsk RUS Rostov-na-Donu 101900 +3741 Votkinsk RUS Udmurtia 101700 +3742 Kyzyl RUS Tyva 101100 +3743 Serov RUS Sverdlovsk 100400 +3744 Zelenodolsk RUS Tatarstan 100200 +3745 Zeleznodoroznyi RUS Moskova 100100 +3746 Kinedma RUS Ivanovo 100000 +3747 Kuznetsk RUS Penza 98200 +3748 Uhta RUS Komi 98000 +3749 Jessentuki RUS Stavropol 97900 +3750 Tobolsk RUS Tjumen 97600 +3751 Neftejugansk RUS Hanti-Mansia 97400 +3752 Bataisk RUS Rostov-na-Donu 97300 +3753 Nojabrsk RUS Yamalin Nenetsia 97300 +3754 Baladov RUS Saratov 97100 +3755 Zeleznogorsk RUS Kursk 96900 +3756 Zukovski RUS Moskova 96500 +3757 Anzero-Sudzensk RUS Kemerovo 96100 +3758 Bugulma RUS Tatarstan 94100 +3759 Zeleznogorsk RUS Krasnojarsk 94000 +3760 Novouralsk RUS Sverdlovsk 93300 +3761 Pudkin RUS Pietari 92900 +3762 Vorkuta RUS Komi 92600 +3763 Derbent RUS Dagestan 92300 +3764 Kirovo-Tdepetsk RUS Kirov 91600 +3765 Krasnogorsk RUS Moskova 91000 +3766 Klin RUS Moskova 90000 +3767 Tdaikovski RUS Perm 90000 +3768 Novyi Urengoi RUS Yamalin Nenetsia 89800 +3769 Ho Chi Minh City VNM Ho Chi Minh City 3980000 +3770 Hanoi VNM Hanoi 1410000 +3771 Haiphong VNM Haiphong 783133 +3772 Da Nang VNM Quang Nam-Da Nang 382674 +3773 Bien Hoa VNM Dong Nai 282095 +3774 Nha Trang VNM Khanh Hoa 221331 +3775 Hue VNM Thua Thien-Hue 219149 +3776 Can Tho VNM Can Tho 215587 +3777 Cam Pha VNM Quang Binh 209086 +3778 Nam Dinh VNM Nam Ha 171699 +3779 Quy Nhon VNM Binh Dinh 163385 +3780 Vung Tau VNM Ba Ria-Vung Tau 145145 +3781 Rach Gia VNM Kien Giang 141132 +3782 Long Xuyen VNM An Giang 132681 +3783 Thai Nguyen VNM Bac Thai 127643 +3784 Hong Gai VNM Quang Ninh 127484 +3785 Phan Thiet VNM Binh Thuan 114236 +3786 Cam Ranh VNM Khanh Hoa 114041 +3787 Vinh VNM Nghe An 112455 +3788 My Tho VNM Tien Giang 108404 +3789 Da Lat VNM Lam Dong 106409 +3790 Buon Ma Thuot VNM Dac Lac 97044 +3791 Tallinn EST Harjumaa 403981 +3792 Tartu EST Tartumaa 101246 +3793 New York USA New York 8008278 +3794 Los Angeles USA California 3694820 +3795 Chicago USA Illinois 2896016 +3796 Houston USA Texas 1953631 +3797 Philadelphia USA Pennsylvania 1517550 +3798 Phoenix USA Arizona 1321045 +3799 San Diego USA California 1223400 +3800 Dallas USA Texas 1188580 +3801 San Antonio USA Texas 1144646 +3802 Detroit USA Michigan 951270 +3803 San Jose USA California 894943 +3804 Indianapolis USA Indiana 791926 +3805 San Francisco USA California 776733 +3806 Jacksonville USA Florida 735167 +3807 Columbus USA Ohio 711470 +3808 Austin USA Texas 656562 +3809 Baltimore USA Maryland 651154 +3810 Memphis USA Tennessee 650100 +3811 Milwaukee USA Wisconsin 596974 +3812 Boston USA Massachusetts 589141 +3813 Washington USA District of Columbia 572059 +3814 Nashville-Davidson USA Tennessee 569891 +3815 El Paso USA Texas 563662 +3816 Seattle USA Washington 563374 +3817 Denver USA Colorado 554636 +3818 Charlotte USA North Carolina 540828 +3819 Fort Worth USA Texas 534694 +3820 Portland USA Oregon 529121 +3821 Oklahoma City USA Oklahoma 506132 +3822 Tucson USA Arizona 486699 +3823 New Orleans USA Louisiana 484674 +3824 Las Vegas USA Nevada 478434 +3825 Cleveland USA Ohio 478403 +3826 Long Beach USA California 461522 +3827 Albuquerque USA New Mexico 448607 +3828 Kansas City USA Missouri 441545 +3829 Fresno USA California 427652 +3830 Virginia Beach USA Virginia 425257 +3831 Atlanta USA Georgia 416474 +3832 Sacramento USA California 407018 +3833 Oakland USA California 399484 +3834 Mesa USA Arizona 396375 +3835 Tulsa USA Oklahoma 393049 +3836 Omaha USA Nebraska 390007 +3837 Minneapolis USA Minnesota 382618 +3838 Honolulu USA Hawaii 371657 +3839 Miami USA Florida 362470 +3840 Colorado Springs USA Colorado 360890 +3841 Saint Louis USA Missouri 348189 +3842 Wichita USA Kansas 344284 +3843 Santa Ana USA California 337977 +3844 Pittsburgh USA Pennsylvania 334563 +3845 Arlington USA Texas 332969 +3846 Cincinnati USA Ohio 331285 +3847 Anaheim USA California 328014 +3848 Toledo USA Ohio 313619 +3849 Tampa USA Florida 303447 +3850 Buffalo USA New York 292648 +3851 Saint Paul USA Minnesota 287151 +3852 Corpus Christi USA Texas 277454 +3853 Aurora USA Colorado 276393 +3854 Raleigh USA North Carolina 276093 +3855 Newark USA New Jersey 273546 +3856 Lexington-Fayette USA Kentucky 260512 +3857 Anchorage USA Alaska 260283 +3858 Louisville USA Kentucky 256231 +3859 Riverside USA California 255166 +3860 Saint Petersburg USA Florida 248232 +3861 Bakersfield USA California 247057 +3862 Stockton USA California 243771 +3863 Birmingham USA Alabama 242820 +3864 Jersey City USA New Jersey 240055 +3865 Norfolk USA Virginia 234403 +3866 Baton Rouge USA Louisiana 227818 +3867 Hialeah USA Florida 226419 +3868 Lincoln USA Nebraska 225581 +3869 Greensboro USA North Carolina 223891 +3870 Plano USA Texas 222030 +3871 Rochester USA New York 219773 +3872 Glendale USA Arizona 218812 +3873 Akron USA Ohio 217074 +3874 Garland USA Texas 215768 +3875 Madison USA Wisconsin 208054 +3876 Fort Wayne USA Indiana 205727 +3877 Fremont USA California 203413 +3878 Scottsdale USA Arizona 202705 +3879 Montgomery USA Alabama 201568 +3880 Shreveport USA Louisiana 200145 +3881 Augusta-Richmond County USA Georgia 199775 +3882 Lubbock USA Texas 199564 +3883 Chesapeake USA Virginia 199184 +3884 Mobile USA Alabama 198915 +3885 Des Moines USA Iowa 198682 +3886 Grand Rapids USA Michigan 197800 +3887 Richmond USA Virginia 197790 +3888 Yonkers USA New York 196086 +3889 Spokane USA Washington 195629 +3890 Glendale USA California 194973 +3891 Tacoma USA Washington 193556 +3892 Irving USA Texas 191615 +3893 Huntington Beach USA California 189594 +3894 Modesto USA California 188856 +3895 Durham USA North Carolina 187035 +3896 Columbus USA Georgia 186291 +3897 Orlando USA Florida 185951 +3898 Boise City USA Idaho 185787 +3899 Winston-Salem USA North Carolina 185776 +3900 San Bernardino USA California 185401 +3901 Jackson USA Mississippi 184256 +3902 Little Rock USA Arkansas 183133 +3903 Salt Lake City USA Utah 181743 +3904 Reno USA Nevada 180480 +3905 Newport News USA Virginia 180150 +3906 Chandler USA Arizona 176581 +3907 Laredo USA Texas 176576 +3908 Henderson USA Nevada 175381 +3909 Arlington USA Virginia 174838 +3910 Knoxville USA Tennessee 173890 +3911 Amarillo USA Texas 173627 +3912 Providence USA Rhode Island 173618 +3913 Chula Vista USA California 173556 +3914 Worcester USA Massachusetts 172648 +3915 Oxnard USA California 170358 +3916 Dayton USA Ohio 166179 +3917 Garden Grove USA California 165196 +3918 Oceanside USA California 161029 +3919 Tempe USA Arizona 158625 +3920 Huntsville USA Alabama 158216 +3921 Ontario USA California 158007 +3922 Chattanooga USA Tennessee 155554 +3923 Fort Lauderdale USA Florida 152397 +3924 Springfield USA Massachusetts 152082 +3925 Springfield USA Missouri 151580 +3926 Santa Clarita USA California 151088 +3927 Salinas USA California 151060 +3928 Tallahassee USA Florida 150624 +3929 Rockford USA Illinois 150115 +3930 Pomona USA California 149473 +3931 Metairie USA Louisiana 149428 +3932 Paterson USA New Jersey 149222 +3933 Overland Park USA Kansas 149080 +3934 Santa Rosa USA California 147595 +3935 Syracuse USA New York 147306 +3936 Kansas City USA Kansas 146866 +3937 Hampton USA Virginia 146437 +3938 Lakewood USA Colorado 144126 +3939 Vancouver USA Washington 143560 +3940 Irvine USA California 143072 +3941 Aurora USA Illinois 142990 +3942 Moreno Valley USA California 142381 +3943 Pasadena USA California 141674 +3944 Hayward USA California 140030 +3945 Brownsville USA Texas 139722 +3946 Bridgeport USA Connecticut 139529 +3947 Hollywood USA Florida 139357 +3948 Warren USA Michigan 138247 +3949 Torrance USA California 137946 +3950 Eugene USA Oregon 137893 +3951 Pembroke Pines USA Florida 137427 +3952 Salem USA Oregon 136924 +3953 Pasadena USA Texas 133936 +3954 Escondido USA California 133559 +3955 Sunnyvale USA California 131760 +3956 Savannah USA Georgia 131510 +3957 Fontana USA California 128929 +3958 Orange USA California 128821 +3959 Naperville USA Illinois 128358 +3960 Alexandria USA Virginia 128283 +3961 Rancho Cucamonga USA California 127743 +3962 Grand Prairie USA Texas 127427 +3963 East Los Angeles USA California 126379 +3964 Fullerton USA California 126003 +3965 Corona USA California 124966 +3966 Flint USA Michigan 124943 +3967 Paradise USA Nevada 124682 +3968 Mesquite USA Texas 124523 +3969 Sterling Heights USA Michigan 124471 +3970 Sioux Falls USA South Dakota 123975 +3971 New Haven USA Connecticut 123626 +3972 Topeka USA Kansas 122377 +3973 Concord USA California 121780 +3974 Evansville USA Indiana 121582 +3975 Hartford USA Connecticut 121578 +3976 Fayetteville USA North Carolina 121015 +3977 Cedar Rapids USA Iowa 120758 +3978 Elizabeth USA New Jersey 120568 +3979 Lansing USA Michigan 119128 +3980 Lancaster USA California 118718 +3981 Fort Collins USA Colorado 118652 +3982 Coral Springs USA Florida 117549 +3983 Stamford USA Connecticut 117083 +3984 Thousand Oaks USA California 117005 +3985 Vallejo USA California 116760 +3986 Palmdale USA California 116670 +3987 Columbia USA South Carolina 116278 +3988 El Monte USA California 115965 +3989 Abilene USA Texas 115930 +3990 North Las Vegas USA Nevada 115488 +3991 Ann Arbor USA Michigan 114024 +3992 Beaumont USA Texas 113866 +3993 Waco USA Texas 113726 +3994 Macon USA Georgia 113336 +3995 Independence USA Missouri 113288 +3996 Peoria USA Illinois 112936 +3997 Inglewood USA California 112580 +3998 Springfield USA Illinois 111454 +3999 Simi Valley USA California 111351 +4000 Lafayette USA Louisiana 110257 +4001 Gilbert USA Arizona 109697 +4002 Carrollton USA Texas 109576 +4003 Bellevue USA Washington 109569 +4004 West Valley City USA Utah 108896 +4005 Clarksville USA Tennessee 108787 +4006 Costa Mesa USA California 108724 +4007 Peoria USA Arizona 108364 +4008 South Bend USA Indiana 107789 +4009 Downey USA California 107323 +4010 Waterbury USA Connecticut 107271 +4011 Manchester USA New Hampshire 107006 +4012 Allentown USA Pennsylvania 106632 +4013 McAllen USA Texas 106414 +4014 Joliet USA Illinois 106221 +4015 Lowell USA Massachusetts 105167 +4016 Provo USA Utah 105166 +4017 West Covina USA California 105080 +4018 Wichita Falls USA Texas 104197 +4019 Erie USA Pennsylvania 103717 +4020 Daly City USA California 103621 +4021 Citrus Heights USA California 103455 +4022 Norwalk USA California 103298 +4023 Gary USA Indiana 102746 +4024 Berkeley USA California 102743 +4025 Santa Clara USA California 102361 +4026 Green Bay USA Wisconsin 102313 +4027 Cape Coral USA Florida 102286 +4028 Arvada USA Colorado 102153 +4029 Pueblo USA Colorado 102121 +4030 Sandy USA Utah 101853 +4031 Athens-Clarke County USA Georgia 101489 +4032 Cambridge USA Massachusetts 101355 +4033 Westminster USA Colorado 100940 +4034 San Buenaventura USA California 100916 +4035 Portsmouth USA Virginia 100565 +4036 Livonia USA Michigan 100545 +4037 Burbank USA California 100316 +4038 Clearwater USA Florida 99936 +4039 Midland USA Texas 98293 +4040 Davenport USA Iowa 98256 +4041 Mission Viejo USA California 98049 +4042 Miami Beach USA Florida 97855 +4043 Sunrise Manor USA Nevada 95362 +4044 New Bedford USA Massachusetts 94780 +4045 El Cajon USA California 94578 +4046 Norman USA Oklahoma 94193 +4047 Richmond USA California 94100 +4048 Albany USA New York 93994 +4049 Brockton USA Massachusetts 93653 +4050 Roanoke USA Virginia 93357 +4051 Billings USA Montana 92988 +4052 Compton USA California 92864 +4053 Gainesville USA Florida 92291 +4054 Fairfield USA California 92256 +4055 Arden-Arcade USA California 92040 +4056 San Mateo USA California 91799 +4057 Visalia USA California 91762 +4058 Boulder USA Colorado 91238 +4059 Cary USA North Carolina 91213 +4060 Santa Monica USA California 91084 +4061 Fall River USA Massachusetts 90555 +4062 Kenosha USA Wisconsin 89447 +4063 Elgin USA Illinois 89408 +4064 Odessa USA Texas 89293 +4065 Carson USA California 89089 +4066 Charleston USA South Carolina 89063 +4067 Charlotte Amalie VIR St Thomas 13000 +4068 Harare ZWE Harare 1410000 +4069 Bulawayo ZWE Bulawayo 621742 +4070 Chitungwiza ZWE Harare 274912 +4071 Mount Darwin ZWE Harare 164362 +4072 Mutare ZWE Manicaland 131367 +4073 Gweru ZWE Midlands 128037 +4074 Gaza PSE Gaza 353632 +4075 Khan Yunis PSE Khan Yunis 123175 +4076 Hebron PSE Hebron 119401 +4077 Jabaliya PSE North Gaza 113901 +4078 Nablus PSE Nablus 100231 +4079 Rafah PSE Rafah 92020 +\. + + +-- +-- Data for Name: country; Type: TABLE DATA; Schema: public; Owner: chriskl +-- + +COPY country (code, name, continent, region, surfacearea, indepyear, population, lifeexpectancy, gnp, gnpold, localname, governmentform, headofstate, capital, code2) FROM stdin WITH NULL AS ''; +AFG Afghanistan Asia Southern and Central Asia 652090 1919 22720000 45.900002 5976.00 1 Afganistan/Afqanestan Islamic Emirate Mohammad Omar 1 AF +NLD Netherlands Europe Western Europe 41526 1581 15864000 78.300003 371362.00 360478.00 Nederland Constitutional Monarchy Beatrix 5 NL +ANT Netherlands Antilles North America Caribbean 800 217000 74.699997 1941.00 Nederlandse Antillen Nonmetropolitan Territory of The Netherlands Beatrix 33 AN +ALB Albania Europe Southern Europe 28748 1912 3401200 71.599998 3205.00 2500.00 Shqiperia Republic Rexhep Mejdani 34 AL +DZA Algeria Africa Northern Africa 2381741 1962 31471000 69.699997 49982.00 46966.00 Al-Jazaeir/Algerie Republic Abdelaziz Bouteflika 35 DZ +ASM American Samoa Oceania Polynesia 199 68000 75.099998 334.00 Amerika Samoa US Territory George W. Bush 54 AS +AND Andorra Europe Southern Europe 468 1278 78000 83.5 1630.00 Andorra Parliamentary Coprincipality 55 AD +AGO Angola Africa Central Africa 1246700 1975 12878000 38.299999 6648.00 7984.00 Angola Republic Jose Eduardo dos Santos 56 AO +AIA Anguilla North America Caribbean 96 8000 76.099998 63.20 Anguilla Dependent Territory of the UK Elisabeth II 62 AI +ATG Antigua and Barbuda North America Caribbean 442 1981 68000 70.5 612.00 584.00 Antigua and Barbuda Constitutional Monarchy Elisabeth II 63 AG +ARE United Arab Emirates Asia Middle East 83600 1971 2441000 74.099998 37966.00 36846.00 Al-Imarat al-Arabiya al-Muttahida Emirate Federation Zayid bin Sultan al-Nahayan 65 AE +ARG Argentina South America South America 2780400 1816 37032000 75.099998 340238.00 323310.00 Argentina Federal Republic Fernando de la Rua 69 AR +ARM Armenia Asia Middle East 29800 1991 3520000 66.400002 1813.00 1627.00 Hajastan Republic Robert Kotdarjan 126 AM +ABW Aruba North America Caribbean 193 103000 78.400002 828.00 793.00 Aruba Nonmetropolitan Territory of The Netherlands Beatrix 129 AW +AUS Australia Oceania Australia and New Zealand 7741220 1901 18886000 79.800003 351182.00 392911.00 Australia Constitutional Monarchy, Federation Elisabeth II 135 AU +AZE Azerbaijan Asia Middle East 86600 1991 7734000 62.900002 4127.00 4100.00 Azarbaycan Federal Republic Heydar Aliyev 144 AZ +BHS Bahamas North America Caribbean 13878 1973 307000 71.099998 3527.00 3347.00 The Bahamas Constitutional Monarchy Elisabeth II 148 BS +BHR Bahrain Asia Middle East 694 1971 617000 73 6366.00 6097.00 Al-Bahrayn Monarchy (Emirate) Hamad ibn Isa al-Khalifa 149 BH +BGD Bangladesh Asia Southern and Central Asia 143998 1971 129155000 60.200001 32852.00 31966.00 Bangladesh Republic Shahabuddin Ahmad 150 BD +BRB Barbados North America Caribbean 430 1966 270000 73 2223.00 2186.00 Barbados Constitutional Monarchy Elisabeth II 174 BB +BEL Belgium Europe Western Europe 30518 1830 10239000 77.800003 249704.00 243948.00 Belgie/Belgique Constitutional Monarchy, Federation Albert II 179 BE +BLZ Belize North America Central America 22696 1981 241000 70.900002 630.00 616.00 Belize Constitutional Monarchy Elisabeth II 185 BZ +BEN Benin Africa Western Africa 112622 1960 6097000 50.200001 2357.00 2141.00 Benin Republic Mathieu Kerekou 187 BJ +BMU Bermuda North America North America 53 65000 76.900002 2328.00 2190.00 Bermuda Dependent Territory of the UK Elisabeth II 191 BM +BTN Bhutan Asia Southern and Central Asia 47000 1910 2124000 52.400002 372.00 383.00 Druk-Yul Monarchy Jigme Singye Wangchuk 192 BT +BOL Bolivia South America South America 1098581 1825 8329000 63.700001 8571.00 7967.00 Bolivia Republic Hugo Banzer Suarez 194 BO +BIH Bosnia and Herzegovina Europe Southern Europe 51197 1992 3972000 71.5 2841.00 Bosna i Hercegovina Federal Republic Ante Jelavic 201 BA +BWA Botswana Africa Southern Africa 581730 1966 1622000 39.299999 4834.00 4935.00 Botswana Republic Festus G. Mogae 204 BW +BRA Brazil South America South America 8547403 1822 170115000 62.900002 776739.00 804108.00 Brasil Federal Republic Fernando Henrique Cardoso 211 BR +GBR United Kingdom Europe British Islands 242900 1066 59623400 77.699997 1378330.00 1296830.00 United Kingdom Constitutional Monarchy Elisabeth II 456 GB +VGB Virgin Islands, British North America Caribbean 151 21000 75.400002 612.00 573.00 British Virgin Islands Dependent Territory of the UK Elisabeth II 537 VG +BRN Brunei Asia Southeast Asia 5765 1984 328000 73.599998 11705.00 12460.00 Brunei Darussalam Monarchy (Sultanate) Haji Hassan al-Bolkiah 538 BN +BGR Bulgaria Europe Eastern Europe 110994 1908 8190900 70.900002 12178.00 10169.00 Balgarija Republic Petar Stojanov 539 BG +BFA Burkina Faso Africa Western Africa 274000 1960 11937000 46.700001 2425.00 2201.00 Burkina Faso Republic Blaise Compaore 549 BF +BDI Burundi Africa Eastern Africa 27834 1962 6695000 46.200001 903.00 982.00 Burundi/Uburundi Republic Pierre Buyoya 552 BI +CYM Cayman Islands North America Caribbean 264 38000 78.900002 1263.00 1186.00 Cayman Islands Dependent Territory of the UK Elisabeth II 553 KY +CHL Chile South America South America 756626 1810 15211000 75.699997 72949.00 75780.00 Chile Republic Ricardo Lagos Escobar 554 CL +COK Cook Islands Oceania Polynesia 236 20000 71.099998 100.00 The Cook Islands Nonmetropolitan Territory of New Zealand Elisabeth II 583 CK +CRI Costa Rica North America Central America 51100 1821 4023000 75.800003 10226.00 9757.00 Costa Rica Republic Miguel Angel Rodriguez Echeverria 584 CR +DJI Djibouti Africa Eastern Africa 23200 1977 638000 50.799999 382.00 373.00 Djibouti/Jibuti Republic Ismail Omar Guelleh 585 DJ +DMA Dominica North America Caribbean 751 1978 71000 73.400002 256.00 243.00 Dominica Republic Vernon Shaw 586 DM +DOM Dominican Republic North America Caribbean 48511 1844 8495000 73.199997 15846.00 15076.00 Republica Dominicana Republic Hipolito Mejia Dominguez 587 DO +ECU Ecuador South America South America 283561 1822 12646000 71.099998 19770.00 19769.00 Ecuador Republic Gustavo Noboa Bejarano 594 EC +EGY Egypt Africa Northern Africa 1001449 1922 68470000 63.299999 82710.00 75617.00 Misr Republic Hosni Mubarak 608 EG +SLV El Salvador North America Central America 21041 1841 6276000 69.699997 11863.00 11203.00 El Salvador Republic Francisco Guillermo Flores Perez 645 SV +ERI Eritrea Africa Eastern Africa 117600 1993 3850000 55.799999 650.00 755.00 Ertra Republic Isayas Afewerki [Isaias Afwerki] 652 ER +ESP Spain Europe Southern Europe 505992 1492 39441700 78.800003 553233.00 532031.00 Espaaa Constitutional Monarchy Juan Carlos I 653 ES +ZAF South Africa Africa Southern Africa 1221037 1910 40377000 51.099998 116729.00 129092.00 South Africa Republic Thabo Mbeki 716 ZA +ETH Ethiopia Africa Eastern Africa 1104300 -1000 62565000 45.200001 6353.00 6180.00 YeItyopiya Republic Negasso Gidada 756 ET +FLK Falkland Islands South America South America 12173 2000 0.00 Falkland Islands Dependent Territory of the UK Elisabeth II 763 FK +FJI Fiji Islands Oceania Melanesia 18274 1970 817000 67.900002 1536.00 2149.00 Fiji Islands Republic Josefa Iloilo 764 FJ +PHL Philippines Asia Southeast Asia 300000 1946 75967000 67.5 65107.00 82239.00 Pilipinas Republic Gloria Macapagal-Arroyo 766 PH +FRO Faroe Islands Europe Nordic Countries 1399 43000 78.400002 0.00 Foroyar Part of Denmark Margrethe II 901 FO +GAB Gabon Africa Central Africa 267668 1960 1226000 50.099998 5493.00 5279.00 Le Gabon Republic Omar Bongo 902 GA +GMB Gambia Africa Western Africa 11295 1965 1305000 53.200001 320.00 325.00 The Gambia Republic Yahya Jammeh 904 GM +GEO Georgia Asia Middle East 69700 1991 4968000 64.5 6064.00 5924.00 Sakartvelo Republic Eduard Gevardnadze 905 GE +GHA Ghana Africa Western Africa 238533 1957 20212000 57.400002 7137.00 6884.00 Ghana Republic John Kufuor 910 GH +GIB Gibraltar Europe Southern Europe 6 25000 79 258.00 Gibraltar Dependent Territory of the UK Elisabeth II 915 GI +GRD Grenada North America Caribbean 344 1974 94000 64.5 318.00 Grenada Constitutional Monarchy Elisabeth II 916 GD +GRL Greenland North America North America 2166090 56000 68.099998 0.00 Kalaallit Nunaat/Gronland Part of Denmark Margrethe II 917 GL +GLP Guadeloupe North America Caribbean 1705 456000 77 3501.00 Guadeloupe Overseas Department of France Jacques Chirac 919 GP +GUM Guam Oceania Micronesia 549 168000 77.800003 1197.00 1136.00 Guam US Territory George W. Bush 921 GU +GTM Guatemala North America Central America 108889 1821 11385000 66.199997 19008.00 17797.00 Guatemala Republic Alfonso Portillo Cabrera 922 GT +GIN Guinea Africa Western Africa 245857 1958 7430000 45.599998 2352.00 2383.00 Guinee Republic Lansana Conte 926 GN +GNB Guinea-Bissau Africa Western Africa 36125 1974 1213000 49 293.00 272.00 Guine-Bissau Republic Kumba Iala 927 GW +GUY Guyana South America South America 214969 1966 861000 64 722.00 743.00 Guyana Republic Bharrat Jagdeo 928 GY +HTI Haiti North America Caribbean 27750 1804 8222000 49.200001 3459.00 3107.00 Haiti/Dayti Republic Jean-Bertrand Aristide 929 HT +HND Honduras North America Central America 112088 1838 6485000 69.900002 5333.00 4697.00 Honduras Republic Carlos Roberto Flores Facusse 933 HN +HKG Hong Kong Asia Eastern Asia 1075 6782000 79.5 166448.00 173610.00 Xianggang/Hong Kong Special Administrative Region of China Jiang Zemin 937 HK +SJM Svalbard and Jan Mayen Europe Nordic Countries 62422 3200 0.00 Svalbard og Jan Mayen Dependent Territory of Norway Harald V 938 SJ +IDN Indonesia Asia Southeast Asia 1904569 1945 212107000 68 84982.00 215002.00 Indonesia Republic Abdurrahman Wahid 939 ID +IND India Asia Southern and Central Asia 3287263 1947 1013662000 62.5 447114.00 430572.00 Bharat/India Federal Republic Kocheril Raman Narayanan 1109 IN +IRQ Iraq Asia Middle East 438317 1932 23115000 66.5 11500.00 Al-Iraq Republic Saddam Hussein al-Takriti 1365 IQ +IRN Iran Asia Southern and Central Asia 1648195 1906 67702000 69.699997 195746.00 160151.00 Iran Islamic Republic Ali Mohammad Khatami-Ardakani 1380 IR +IRL Ireland Europe British Islands 70273 1921 3775100 76.800003 75921.00 73132.00 Ireland/Eire Republic Mary McAleese 1447 IE +ISL Iceland Europe Nordic Countries 103000 1944 279000 79.400002 8255.00 7474.00 Island Republic Olafur Ragnar Grimsson 1449 IS +ISR Israel Asia Middle East 21056 1948 6217000 78.599998 97477.00 98577.00 Yisraeel/Israeil Republic Moshe Katzav 1450 IL +ITA Italy Europe Southern Europe 301316 1861 57680000 79 1161755.00 1145372.00 Italia Republic Carlo Azeglio Ciampi 1464 IT +TMP East Timor Asia Southeast Asia 14874 885000 46 0.00 Timor Timur Administrated by the UN Jose Alexandre Gusmao 1522 TP +AUT Austria Europe Western Europe 83859 1918 8091800 77.699997 211860.00 206025.00 Osterreich Federal Republic Thomas Klestil 1523 AT +JAM Jamaica North America Caribbean 10990 1962 2583000 75.199997 6871.00 6722.00 Jamaica Constitutional Monarchy Elisabeth II 1530 JM +JPN Japan Asia Eastern Asia 377829 -660 126714000 80.699997 3787042.00 4192638.00 Nihon/Nippon Constitutional Monarchy Akihito 1532 JP +YEM Yemen Asia Middle East 527968 1918 18112000 59.799999 6041.00 5729.00 Al-Yaman Republic Ali Abdallah Salih 1780 YE +JOR Jordan Asia Middle East 88946 1946 5083000 77.400002 7526.00 7051.00 Al-Urdunn Constitutional Monarchy Abdullah II 1786 JO +CXR Christmas Island Oceania Australia and New Zealand 135 2500 0.00 Christmas Island Territory of Australia Elisabeth II 1791 CX +YUG Yugoslavia Europe Southern Europe 102173 1918 10640000 72.400002 17000.00 Jugoslavija Federal Republic Vojislav Kodtunica 1792 YU +KHM Cambodia Asia Southeast Asia 181035 1953 11168000 56.5 5121.00 5670.00 Kampuchea Constitutional Monarchy Norodom Sihanouk 1800 KH +CMR Cameroon Africa Central Africa 475442 1960 15085000 54.799999 9174.00 8596.00 Cameroun/Cameroon Republic Paul Biya 1804 CM +CAN Canada North America North America 9970610 1867 31147000 79.400002 598862.00 625626.00 Canada Constitutional Monarchy, Federation Elisabeth II 1822 CA +CPV Cape Verde Africa Western Africa 4033 1975 428000 68.900002 435.00 420.00 Cabo Verde Republic Antonio Mascarenhas Monteiro 1859 CV +KAZ Kazakstan Asia Southern and Central Asia 2724900 1991 16223000 63.200001 24375.00 23383.00 Qazaqstan Republic Nursultan Nazarbajev 1864 KZ +KEN Kenya Africa Eastern Africa 580367 1963 30080000 48 9217.00 10241.00 Kenya Republic Daniel arap Moi 1881 KE +CAF Central African Republic Africa Central Africa 622984 1960 3615000 44 1054.00 993.00 Centrafrique/Be-Afrika Republic Ange-Felix Patasse 1889 CF +CHN China Asia Eastern Asia 9572900 -1523 1277558000 71.400002 982268.00 917719.00 Zhongquo People'sRepublic Jiang Zemin 1891 CN +KGZ Kyrgyzstan Asia Southern and Central Asia 199900 1991 4699000 63.400002 1626.00 1767.00 Kyrgyzstan Republic Askar Akajev 2253 KG +KIR Kiribati Oceania Micronesia 726 1979 83000 59.799999 40.70 Kiribati Republic Teburoro Tito 2256 KI +COL Colombia South America South America 1138914 1810 42321000 70.300003 102896.00 105116.00 Colombia Republic Andres Pastrana Arango 2257 CO +COM Comoros Africa Eastern Africa 1862 1975 578000 60 4401.00 4361.00 Komori/Comores Republic Azali Assoumani 2295 KM +COG Congo Africa Central Africa 342000 1960 2943000 47.400002 2108.00 2287.00 Congo Republic Denis Sassou-Nguesso 2296 CG +COD Congo, The Democratic Republic of the Africa Central Africa 2344858 1960 51654000 48.799999 6964.00 2474.00 Republique Democratique du Congo Republic Joseph Kabila 2298 CD +CCK Cocos (Keeling) Islands Oceania Australia and New Zealand 14 600 0.00 Cocos (Keeling) Islands Territory of Australia Elisabeth II 2317 CC +PRK North Korea Asia Eastern Asia 120538 1948 24039000 70.699997 5332.00 Choson Minjujuui Inmin Konghwaguk (Bukhan) Socialistic Republic Kim Jong-il 2318 KP +KOR South Korea Asia Eastern Asia 99434 1948 46844000 74.400002 320749.00 442544.00 Taehan Mineguk (Namhan) Republic Kim Dae-jung 2331 KR +GRC Greece Europe Southern Europe 131626 1830 10545700 78.400002 120724.00 119946.00 Ellada Republic Kostis Stefanopoulos 2401 GR +HRV Croatia Europe Southern Europe 56538 1991 4473000 73.699997 20208.00 19300.00 Hrvatska Republic Gtipe Mesic 2409 HR +CUB Cuba North America Caribbean 110861 1902 11201000 76.199997 17843.00 18862.00 Cuba Socialistic Republic Fidel Castro Ruz 2413 CU +KWT Kuwait Asia Middle East 17818 1961 1972000 76.099998 27037.00 30373.00 Al-Kuwayt Constitutional Monarchy (Emirate) Jabir al-Ahmad al-Jabir al-Sabah 2429 KW +CYP Cyprus Asia Middle East 9251 1960 754700 76.699997 9333.00 8246.00 Kypros/Kibris Republic Glafkos Klerides 2430 CY +LAO Laos Asia Southeast Asia 236800 1953 5433000 53.099998 1292.00 1746.00 Lao Republic Khamtay Siphandone 2432 LA +LVA Latvia Europe Baltic Countries 64589 1991 2424200 68.400002 6398.00 5639.00 Latvija Republic Vaira Vike-Freiberga 2434 LV +LSO Lesotho Africa Southern Africa 30355 1966 2153000 50.799999 1061.00 1161.00 Lesotho Constitutional Monarchy Letsie III 2437 LS +LBN Lebanon Asia Middle East 10400 1941 3282000 71.300003 17121.00 15129.00 Lubnan Republic Emile Lahoud 2438 LB +LBR Liberia Africa Western Africa 111369 1847 3154000 51 2012.00 Liberia Republic Charles Taylor 2440 LR +LBY Libyan Arab Jamahiriya Africa Northern Africa 1759540 1951 5605000 75.5 44806.00 40562.00 Libiya Socialistic State Muammar al-Qadhafi 2441 LY +LIE Liechtenstein Europe Western Europe 160 1806 32300 78.800003 1119.00 1084.00 Liechtenstein Constitutional Monarchy Hans-Adam II 2446 LI +LTU Lithuania Europe Baltic Countries 65301 1991 3698500 69.099998 10692.00 9585.00 Lietuva Republic Valdas Adamkus 2447 LT +LUX Luxembourg Europe Western Europe 2586 1867 435700 77.099998 16321.00 15519.00 Luxembourg/Letzebuerg Constitutional Monarchy Henri 2452 LU +ESH Western Sahara Africa Northern Africa 266000 293000 49.799999 60.00 As-Sahrawiya Occupied by Marocco Mohammed Abdel Aziz 2453 EH +MAC Macao Asia Eastern Asia 18 473000 81.599998 5749.00 5940.00 Macau/Aomen Special Administrative Region of China Jiang Zemin 2454 MO +MDG Madagascar Africa Eastern Africa 587041 1960 15942000 55 3750.00 3545.00 Madagasikara/Madagascar Federal Republic Didier Ratsiraka 2455 MG +MKD Macedonia Europe Southern Europe 25713 1991 2024000 73.800003 1694.00 1915.00 Makedonija Republic Boris Trajkovski 2460 MK +MWI Malawi Africa Eastern Africa 118484 1964 10925000 37.599998 1687.00 2527.00 Malawi Republic Bakili Muluzi 2462 MW +MDV Maldives Asia Southern and Central Asia 298 1965 286000 62.200001 199.00 Dhivehi Raajje/Maldives Republic Maumoon Abdul Gayoom 2463 MV +MYS Malaysia Asia Southeast Asia 329758 1957 22244000 70.800003 69213.00 97884.00 Malaysia Constitutional Monarchy, Federation Salahuddin Abdul Aziz Shah Alhaj 2464 MY +MLI Mali Africa Western Africa 1240192 1960 11234000 46.700001 2642.00 2453.00 Mali Republic Alpha Oumar Konare 2482 ML +MLT Malta Europe Southern Europe 316 1964 380200 77.900002 3512.00 3338.00 Malta Republic Guido de Marco 2484 MT +MAR Morocco Africa Northern Africa 446550 1956 28351000 69.099998 36124.00 33514.00 Al-Maghrib Constitutional Monarchy Mohammed VI 2486 MA +MHL Marshall Islands Oceania Micronesia 181 1990 64000 65.5 97.00 Marshall Islands/Majol Republic Kessai Note 2507 MH +MTQ Martinique North America Caribbean 1102 395000 78.300003 2731.00 2559.00 Martinique Overseas Department of France Jacques Chirac 2508 MQ +MRT Mauritania Africa Western Africa 1025520 1960 2670000 50.799999 998.00 1081.00 Muritaniya/Mauritanie Republic Maaouiya Ould SidAhmad Taya 2509 MR +MUS Mauritius Africa Eastern Africa 2040 1968 1158000 71 4251.00 4186.00 Mauritius Republic Cassam Uteem 2511 MU +MYT Mayotte Africa Eastern Africa 373 149000 59.5 0.00 Mayotte Territorial Collectivity of France Jacques Chirac 2514 YT +MEX Mexico North America Central America 1958201 1810 98881000 71.5 414972.00 401461.00 Mexico Federal Republic Vicente Fox Quesada 2515 MX +FSM Micronesia, Federated States of Oceania Micronesia 702 1990 119000 68.599998 212.00 Micronesia Federal Republic Leo A. Falcam 2689 FM +MDA Moldova Europe Eastern Europe 33851 1991 4380000 64.5 1579.00 1872.00 Moldova Republic Vladimir Voronin 2690 MD +MCO Monaco Europe Western Europe 1.5 1861 34000 78.800003 776.00 Monaco Constitutional Monarchy Rainier III 2695 MC +MNG Mongolia Asia Eastern Asia 1566500 1921 2662000 67.300003 1043.00 933.00 Mongol Uls Republic Natsagiin Bagabandi 2696 MN +MSR Montserrat North America Caribbean 102 11000 78 109.00 Montserrat Dependent Territory of the UK Elisabeth II 2697 MS +MOZ Mozambique Africa Eastern Africa 801590 1975 19680000 37.5 2891.00 2711.00 Mocambique Republic Joaquim A. Chissano 2698 MZ +MMR Myanmar Asia Southeast Asia 676578 1948 45611000 54.900002 180375.00 171028.00 Myanma Pye Republic kenraali Than Shwe 2710 MM +NAM Namibia Africa Southern Africa 824292 1990 1726000 42.5 3101.00 3384.00 Namibia Republic Sam Nujoma 2726 NA +NRU Nauru Oceania Micronesia 21 1968 12000 60.799999 197.00 Naoero/Nauru Republic Bernard Dowiyogo 2728 NR +NPL Nepal Asia Southern and Central Asia 147181 1769 23930000 57.799999 4768.00 4837.00 Nepal Constitutional Monarchy Gyanendra Bir Bikram 2729 NP +NIC Nicaragua North America Central America 130000 1838 5074000 68.699997 1988.00 2023.00 Nicaragua Republic Arnoldo Aleman Lacayo 2734 NI +NER Niger Africa Western Africa 1267000 1960 10730000 41.299999 1706.00 1580.00 Niger Republic Mamadou Tandja 2738 NE +NGA Nigeria Africa Western Africa 923768 1960 111506000 51.599998 65707.00 58623.00 Nigeria Federal Republic Olusegun Obasanjo 2754 NG +NIU Niue Oceania Polynesia 260 2000 0.00 Niue Nonmetropolitan Territory of New Zealand Elisabeth II 2805 NU +NFK Norfolk Island Oceania Australia and New Zealand 36 2000 0.00 Norfolk Island Territory of Australia Elisabeth II 2806 NF +NOR Norway Europe Nordic Countries 323877 1905 4478500 78.699997 145895.00 153370.00 Norge Constitutional Monarchy Harald V 2807 NO +CIV Cote deIvoire Africa Western Africa 322463 1960 14786000 45.200001 11345.00 10285.00 Cote deIvoire Republic Laurent Gbagbo 2814 CI +OMN Oman Asia Middle East 309500 1951 2542000 71.800003 16904.00 16153.00 Uman Monarchy (Sultanate) Qabus ibn Said 2821 OM +PAK Pakistan Asia Southern and Central Asia 796095 1947 156483000 61.099998 61289.00 58549.00 Pakistan Republic Mohammad Rafiq Tarar 2831 PK +PLW Palau Oceania Micronesia 459 1994 19000 68.599998 105.00 Belau/Palau Republic Kuniwo Nakamura 2881 PW +PAN Panama North America Central America 75517 1903 2856000 75.5 9131.00 8700.00 Panama Republic Mireya Elisa Moscoso Rodriguez 2882 PA +PNG Papua New Guinea Oceania Melanesia 462840 1975 4807000 63.099998 4988.00 6328.00 Papua New Guinea/Papua Niugini Constitutional Monarchy Elisabeth II 2884 PG +PRY Paraguay South America South America 406752 1811 5496000 73.699997 8444.00 9555.00 Paraguay Republic Luis Angel Gonzalez Macchi 2885 PY +PER Peru South America South America 1285216 1821 25662000 70 64140.00 65186.00 Peru/Piruw Republic Valentin Paniagua Corazao 2890 PE +PCN Pitcairn Oceania Polynesia 49 50 0.00 Pitcairn Dependent Territory of the UK Elisabeth II 2912 PN +MNP Northern Mariana Islands Oceania Micronesia 464 78000 75.5 0.00 Northern Mariana Islands Commonwealth of the US George W. Bush 2913 MP +PRT Portugal Europe Southern Europe 91982 1143 9997600 75.800003 105954.00 102133.00 Portugal Republic Jorge Sampaio 2914 PT +PRI Puerto Rico North America Caribbean 8875 3869000 75.599998 34100.00 32100.00 Puerto Rico Commonwealth of the US George W. Bush 2919 PR +POL Poland Europe Eastern Europe 323250 1918 38653600 73.199997 151697.00 135636.00 Polska Republic Aleksander Kwasniewski 2928 PL +GNQ Equatorial Guinea Africa Central Africa 28051 1968 453000 53.599998 283.00 542.00 Guinea Ecuatorial Republic Teodoro Obiang Nguema Mbasogo 2972 GQ +QAT Qatar Asia Middle East 11000 1971 599000 72.400002 9472.00 8920.00 Qatar Monarchy Hamad ibn Khalifa al-Thani 2973 QA +FRA France Europe Western Europe 551500 843 59225700 78.800003 1424285.00 1392448.00 France Republic Jacques Chirac 2974 FR +GUF French Guiana South America South America 90000 181000 76.099998 681.00 Guyane francaise Overseas Department of France Jacques Chirac 3014 GF +PYF French Polynesia Oceania Polynesia 4000 235000 74.800003 818.00 781.00 Polynesie francaise Nonmetropolitan Territory of France Jacques Chirac 3016 PF +REU Reunion Africa Eastern Africa 2510 699000 72.699997 8287.00 7988.00 Reunion Overseas Department of France Jacques Chirac 3017 RE +ROM Romania Europe Eastern Europe 238391 1878 22455500 69.900002 38158.00 34843.00 Romania Republic Ion Iliescu 3018 RO +RWA Rwanda Africa Eastern Africa 26338 1962 7733000 39.299999 2036.00 1863.00 Rwanda/Urwanda Republic Paul Kagame 3047 RW +SWE Sweden Europe Nordic Countries 449964 836 8861400 79.599998 226492.00 227757.00 Sverige Constitutional Monarchy Carl XVI Gustaf 3048 SE +SHN Saint Helena Africa Western Africa 314 6000 76.800003 0.00 Saint Helena Dependent Territory of the UK Elisabeth II 3063 SH +KNA Saint Kitts and Nevis North America Caribbean 261 1983 38000 70.699997 299.00 Saint Kitts and Nevis Constitutional Monarchy Elisabeth II 3064 KN +LCA Saint Lucia North America Caribbean 622 1979 154000 72.300003 571.00 Saint Lucia Constitutional Monarchy Elisabeth II 3065 LC +VCT Saint Vincent and the Grenadines North America Caribbean 388 1979 114000 72.300003 285.00 Saint Vincent and the Grenadines Constitutional Monarchy Elisabeth II 3066 VC +SPM Saint Pierre and Miquelon North America North America 242 7000 77.599998 0.00 Saint-Pierre-et-Miquelon Territorial Collectivity of France Jacques Chirac 3067 PM +DEU Germany Europe Western Europe 357022 1955 82164700 77.400002 2133367.00 2102826.00 Deutschland Federal Republic Johannes Rau 3068 DE +SLB Solomon Islands Oceania Melanesia 28896 1978 444000 71.300003 182.00 220.00 Solomon Islands Constitutional Monarchy Elisabeth II 3161 SB +ZMB Zambia Africa Eastern Africa 752618 1964 9169000 37.200001 3377.00 3922.00 Zambia Republic Frederick Chiluba 3162 ZM +WSM Samoa Oceania Polynesia 2831 1962 180000 69.199997 141.00 157.00 Samoa Parlementary Monarchy Malietoa Tanumafili II 3169 WS +SMR San Marino Europe Southern Europe 61 885 27000 81.099998 510.00 San Marino Republic 3171 SM +STP Sao Tome and Principe Africa Central Africa 964 1975 147000 65.300003 6.00 Sao Tome e Principe Republic Miguel Trovoada 3172 ST +SAU Saudi Arabia Asia Middle East 2149690 1932 21607000 67.800003 137635.00 146171.00 Al-Arabiya as-Saudiya Monarchy Fahd ibn Abdul-Aziz al-Saud 3173 SA +SEN Senegal Africa Western Africa 196722 1960 9481000 62.200001 4787.00 4542.00 Senegal/Sounougal Republic Abdoulaye Wade 3198 SN +SYC Seychelles Africa Eastern Africa 455 1976 77000 70.400002 536.00 539.00 Sesel/Seychelles Republic France-Albert Rene 3206 SC +SLE Sierra Leone Africa Western Africa 71740 1961 4854000 45.299999 746.00 858.00 Sierra Leone Republic Ahmed Tejan Kabbah 3207 SL +SGP Singapore Asia Southeast Asia 618 1965 3567000 80.099998 86503.00 96318.00 Singapore/Singapura/Xinjiapo/Singapur Republic Sellapan Rama Nathan 3208 SG +SVK Slovakia Europe Eastern Europe 49012 1993 5398700 73.699997 20594.00 19452.00 Slovensko Republic Rudolf Schuster 3209 SK +SVN Slovenia Europe Southern Europe 20256 1991 1987800 74.900002 19756.00 18202.00 Slovenija Republic Milan Kucan 3212 SI +SOM Somalia Africa Eastern Africa 637657 1960 10097000 46.200001 935.00 Soomaaliya Republic Abdiqassim Salad Hassan 3214 SO +LKA Sri Lanka Asia Southern and Central Asia 65610 1948 18827000 71.800003 15706.00 15091.00 Sri Lanka/Ilankai Republic Chandrika Kumaratunga 3217 LK +SDN Sudan Africa Northern Africa 2505813 1956 29490000 56.599998 10162.00 As-Sudan Islamic Republic Omar Hassan Ahmad al-Bashir 3225 SD +FIN Finland Europe Nordic Countries 338145 1917 5171300 77.400002 121914.00 119833.00 Suomi Republic Tarja Halonen 3236 FI +SUR Suriname South America South America 163265 1975 417000 71.400002 870.00 706.00 Suriname Republic Ronald Venetiaan 3243 SR +SWZ Swaziland Africa Southern Africa 17364 1968 1008000 40.400002 1206.00 1312.00 kaNgwane Monarchy Mswati III 3244 SZ +CHE Switzerland Europe Western Europe 41284 1499 7160400 79.599998 264478.00 256092.00 Schweiz/Suisse/Svizzera/Svizra Federation Adolf Ogi 3248 CH +SYR Syria Asia Middle East 185180 1941 16125000 68.5 65984.00 64926.00 Suriya Republic Bashar al-Assad 3250 SY +TJK Tajikistan Asia Southern and Central Asia 143100 1991 6188000 64.099998 1990.00 1056.00 Tocikiston Republic Emomali Rahmonov 3261 TJ +TWN Taiwan Asia Eastern Asia 36188 1945 22256000 76.400002 256254.00 263451.00 Teai-wan Republic Chen Shui-bian 3263 TW +TZA Tanzania Africa Eastern Africa 883749 1961 33517000 52.299999 8005.00 7388.00 Tanzania Republic Benjamin William Mkapa 3306 TZ +DNK Denmark Europe Nordic Countries 43094 800 5330000 76.5 174099.00 169264.00 Danmark Constitutional Monarchy Margrethe II 3315 DK +THA Thailand Asia Southeast Asia 513115 1350 61399000 68.599998 116416.00 153907.00 Prathet Thai Constitutional Monarchy Bhumibol Adulyadej 3320 TH +TGO Togo Africa Western Africa 56785 1960 4629000 54.700001 1449.00 1400.00 Togo Republic Gnassingbe Eyadema 3332 TG +TKL Tokelau Oceania Polynesia 12 2000 0.00 Tokelau Nonmetropolitan Territory of New Zealand Elisabeth II 3333 TK +TON Tonga Oceania Polynesia 650 1970 99000 67.900002 146.00 170.00 Tonga Monarchy Taufa'ahau Tupou IV 3334 TO +TTO Trinidad and Tobago North America Caribbean 5130 1962 1295000 68 6232.00 5867.00 Trinidad and Tobago Republic Arthur N. R. Robinson 3336 TT +TCD Chad Africa Central Africa 1284000 1960 7651000 50.5 1208.00 1102.00 Tchad/Tshad Republic Idriss Deby 3337 TD +CZE Czech Republic Europe Eastern Europe 78866 1993 10278100 74.5 55017.00 52037.00 esko Republic Vaclav Havel 3339 CZ +TUN Tunisia Africa Northern Africa 163610 1956 9586000 73.699997 20026.00 18898.00 Tunis/Tunisie Republic Zine al-Abidine Ben Ali 3349 TN +TUR Turkey Asia Middle East 774815 1923 66591000 71 210721.00 189122.00 Turkiye Republic Ahmet Necdet Sezer 3358 TR +TKM Turkmenistan Asia Southern and Central Asia 488100 1991 4459000 60.900002 4397.00 2000.00 Turkmenostan Republic Saparmurad Nijazov 3419 TM +TCA Turks and Caicos Islands North America Caribbean 430 17000 73.300003 96.00 The Turks and Caicos Islands Dependent Territory of the UK Elisabeth II 3423 TC +TUV Tuvalu Oceania Polynesia 26 1978 12000 66.300003 6.00 Tuvalu Constitutional Monarchy Elisabeth II 3424 TV +UGA Uganda Africa Eastern Africa 241038 1962 21778000 42.900002 6313.00 6887.00 Uganda Republic Yoweri Museveni 3425 UG +UKR Ukraine Europe Eastern Europe 603700 1991 50456000 66 42168.00 49677.00 Ukrajina Republic Leonid Kutdma 3426 UA +HUN Hungary Europe Eastern Europe 93030 1918 10043200 71.400002 48267.00 45914.00 Magyarorszag Republic Ferenc Madl 3483 HU +URY Uruguay South America South America 175016 1828 3337000 75.199997 20831.00 19967.00 Uruguay Republic Jorge Batlle Ibaaez 3492 UY +NCL New Caledonia Oceania Melanesia 18575 214000 72.800003 3563.00 Nouvelle-Caledonie Nonmetropolitan Territory of France Jacques Chirac 3493 NC +NZL New Zealand Oceania Australia and New Zealand 270534 1907 3862000 77.800003 54669.00 64960.00 New Zealand/Aotearoa Constitutional Monarchy Elisabeth II 3499 NZ +UZB Uzbekistan Asia Southern and Central Asia 447400 1991 24318000 63.700001 14194.00 21300.00 Uzbekiston Republic Islam Karimov 3503 UZ +BLR Belarus Europe Eastern Europe 207600 1991 10236000 68 13714.00 Belarus Republic Aljaksandr Lukadenka 3520 BY +WLF Wallis and Futuna Oceania Polynesia 200 15000 0.00 Wallis-et-Futuna Nonmetropolitan Territory of France Jacques Chirac 3536 WF +VUT Vanuatu Oceania Melanesia 12189 1980 190000 60.599998 261.00 246.00 Vanuatu Republic John Bani 3537 VU +VAT Holy See (Vatican City State) Europe Southern Europe 0.40000001 1929 1000 9.00 Santa Sede/Citta del Vaticano Independent Church State Johannes Paavali II 3538 VA +VEN Venezuela South America South America 912050 1811 24170000 73.099998 95023.00 88434.00 Venezuela Federal Republic Hugo Chavez Frias 3539 VE +RUS Russian Federation Europe Eastern Europe 17075400 1991 146934000 67.199997 276608.00 442989.00 Rossija Federal Republic Vladimir Putin 3580 RU +VNM Vietnam Asia Southeast Asia 331689 1945 79832000 69.300003 21929.00 22834.00 Viet Nam Socialistic Republic Tran Duc Luong 3770 VN +EST Estonia Europe Baltic Countries 45227 1991 1439200 69.5 5328.00 3371.00 Eesti Republic Lennart Meri 3791 EE +USA United States North America North America 9363520 1776 278357000 77.099998 8510700.00 8110900.00 United States Federal Republic George W. Bush 3813 US +VIR Virgin Islands, U.S. North America Caribbean 347 93000 78.099998 0.00 Virgin Islands of the United States US Territory George W. Bush 4067 VI +ZWE Zimbabwe Africa Eastern Africa 390757 1980 11669000 37.799999 5951.00 8670.00 Zimbabwe Republic Robert G. Mugabe 4068 ZW +PSE Palestine Asia Middle East 6257 3101000 71.400002 4173.00 Filastin Autonomous Area Yasser (Yasir) Arafat 4074 PS +ATA Antarctica Antarctica Antarctica 13120000 0 0.00 A Co-administrated AQ +BVT Bouvet Island Antarctica Antarctica 59 0 0.00 Bouvetoya Dependent Territory of Norway Harald V BV +IOT British Indian Ocean Territory Africa Eastern Africa 78 0 0.00 British Indian Ocean Territory Dependent Territory of the UK Elisabeth II IO +SGS South Georgia and the South Sandwich Islands Antarctica Antarctica 3903 0 0.00 South Georgia and the South Sandwich Islands Dependent Territory of the UK Elisabeth II GS +HMD Heard Island and McDonald Islands Antarctica Antarctica 359 0 0.00 Heard and McDonald Islands Territory of Australia Elisabeth II HM +ATF French Southern territories Antarctica Antarctica 7780 0 0.00 Terres australes francaises Nonmetropolitan Territory of France Jacques Chirac TF +UMI United States Minor Outlying Islands Oceania Micronesia/Caribbean 16 0 0.00 United States Minor Outlying Islands Dependent Territory of the US George W. Bush UM +\. + + +-- +-- Data for Name: countrylanguage; Type: TABLE DATA; Schema: public; Owner: chriskl +-- + +COPY countrylanguage (countrycode, "language", isofficial, percentage) FROM stdin; +AFG Pashto t 52.400002 +NLD Dutch t 95.599998 +ANT Papiamento t 86.199997 +ALB Albaniana t 97.900002 +DZA Arabic t 86 +ASM Samoan t 90.599998 +AND Spanish f 44.599998 +AGO Ovimbundu f 37.200001 +AIA English t 0 +ATG Creole English f 95.699997 +ARE Arabic t 42 +ARG Spanish t 96.800003 +ARM Armenian t 93.400002 +ABW Papiamento f 76.699997 +AUS English t 81.199997 +AZE Azerbaijani t 89 +BHS Creole English f 89.699997 +BHR Arabic t 67.699997 +BGD Bengali t 97.699997 +BRB Bajan f 95.099998 +BEL Dutch t 59.200001 +BLZ English t 50.799999 +BEN Fon f 39.799999 +BMU English t 100 +BTN Dzongkha t 50 +BOL Spanish t 87.699997 +BIH Serbo-Croatian t 99.199997 +BWA Tswana f 75.5 +BRA Portuguese t 97.5 +GBR English t 97.300003 +VGB English t 0 +BRN Malay t 45.5 +BGR Bulgariana t 83.199997 +BFA Mossi f 50.200001 +BDI Kirundi t 98.099998 +CYM English t 0 +CHL Spanish t 89.699997 +COK Maori t 0 +CRI Spanish t 97.5 +DJI Somali f 43.900002 +DMA Creole English f 100 +DOM Spanish t 98 +ECU Spanish t 93 +EGY Arabic t 98.800003 +SLV Spanish t 100 +ERI Tigrinja t 49.099998 +ESP Spanish t 74.400002 +ZAF Zulu t 22.700001 +ETH Oromo f 31 +FLK English t 0 +FJI Fijian t 50.799999 +PHL Pilipino t 29.299999 +FRO Faroese t 100 +GAB Fang f 35.799999 +GMB Malinke f 34.099998 +GEO Georgiana t 71.699997 +GHA Akan f 52.400002 +GIB English t 88.900002 +GRD Creole English f 100 +GRL Greenlandic t 87.5 +GLP Creole French f 95 +GUM English t 37.5 +GTM Spanish t 64.699997 +GIN Ful f 38.599998 +GNB Crioulo f 36.400002 +GUY Creole English f 96.400002 +HTI Haiti Creole f 100 +HND Spanish t 97.199997 +HKG Canton Chinese f 88.699997 +SJM Norwegian t 0 +IDN Javanese f 39.400002 +IND Hindi t 39.900002 +IRQ Arabic t 77.199997 +IRN Persian t 45.700001 +IRL English t 98.400002 +ISL Icelandic t 95.699997 +ISR Hebrew t 63.099998 +ITA Italian t 94.099998 +TMP Sunda f 0 +AUT German t 92 +JAM Creole English f 94.199997 +JPN Japanese t 99.099998 +YEM Arabic t 99.599998 +JOR Arabic t 97.900002 +CXR Chinese f 0 +YUG Serbo-Croatian t 75.199997 +KHM Khmer t 88.599998 +CMR Fang f 19.700001 +CAN English t 60.400002 +CPV Crioulo f 100 +KAZ Kazakh t 46 +KEN Kikuyu f 20.9 +CAF Gbaya f 23.799999 +CHN Chinese t 92 +KGZ Kirgiz t 59.700001 +KIR Kiribati t 98.900002 +COL Spanish t 99 +COM Comorian t 75 +COG Kongo f 51.5 +COD Luba f 18 +CCK Malay f 0 +PRK Korean t 99.900002 +KOR Korean t 99.900002 +GRC Greek t 98.5 +HRV Serbo-Croatian t 95.900002 +CUB Spanish t 100 +KWT Arabic t 78.099998 +CYP Greek t 74.099998 +LAO Lao t 67.199997 +LVA Latvian t 55.099998 +LSO Sotho t 85 +LBN Arabic t 93 +LBR Kpelle f 19.5 +LBY Arabic t 96 +LIE German t 89 +LTU Lithuanian t 81.599998 +LUX Luxembourgish t 64.400002 +ESH Arabic t 100 +MAC Canton Chinese f 85.599998 +MDG Malagasy t 98.900002 +MKD Macedonian t 66.5 +MWI Chichewa t 58.299999 +MDV Dhivehi t 100 +MYS Malay t 58.400002 +MLI Bambara f 31.799999 +MLT Maltese t 95.800003 +MAR Arabic t 65 +MHL Marshallese t 96.800003 +MTQ Creole French f 96.599998 +MRT Hassaniya f 81.699997 +MUS Creole French f 70.599998 +MYT Mahore f 41.900002 +MEX Spanish t 92.099998 +FSM Trukese f 41.599998 +MDA Romanian t 61.900002 +MCO French t 41.900002 +MNG Mongolian t 78.800003 +MSR English t 0 +MOZ Makua f 27.799999 +MMR Burmese t 69 +NAM Ovambo f 50.700001 +NRU Nauru t 57.5 +NPL Nepali t 50.400002 +NIC Spanish t 97.599998 +NER Hausa f 53.099998 +NGA Joruba f 21.4 +NIU Niue f 0 +NFK English t 0 +NOR Norwegian t 96.599998 +CIV Akan f 30 +OMN Arabic t 76.699997 +PAK Punjabi f 48.200001 +PLW Palau t 82.199997 +PAN Spanish t 76.800003 +PNG Papuan Languages f 78.099998 +PRY Spanish t 55.099998 +PER Spanish t 79.800003 +PCN Pitcairnese f 0 +MNP Philippene Languages f 34.099998 +PRT Portuguese t 99 +PRI Spanish t 51.299999 +POL Polish t 97.599998 +GNQ Fang f 84.800003 +QAT Arabic t 40.700001 +FRA French t 93.599998 +GUF Creole French f 94.300003 +PYF Tahitian f 46.400002 +REU Creole French f 91.5 +ROM Romanian t 90.699997 +RWA Rwanda t 100 +SWE Swedish t 89.5 +SHN English t 0 +KNA Creole English f 100 +LCA Creole French f 80 +VCT Creole English f 99.099998 +SPM French t 0 +DEU German t 91.300003 +SLB Malenasian Languages f 85.599998 +ZMB Bemba f 29.700001 +WSM Samoan-English f 52 +SMR Italian t 100 +STP Crioulo f 86.300003 +SAU Arabic t 95 +SEN Wolof t 48.099998 +SYC Seselwa f 91.300003 +SLE Mende f 34.799999 +SGP Chinese t 77.099998 +SVK Slovak t 85.599998 +SVN Slovene t 87.900002 +SOM Somali t 98.300003 +LKA Singali t 60.299999 +SDN Arabic t 49.400002 +FIN Finnish t 92.699997 +SUR Sranantonga f 81 +SWZ Swazi t 89.900002 +CHE German t 63.599998 +SYR Arabic t 90 +TJK Tadzhik t 62.200001 +TWN Min f 66.699997 +TZA Nyamwesi f 21.1 +DNK Danish t 93.5 +THA Thai t 52.599998 +TGO Ewe t 23.200001 +TKL Tokelau f 0 +TON Tongan t 98.300003 +TTO English f 93.5 +TCD Sara f 27.700001 +CZE Czech t 81.199997 +TUN Arabic t 69.900002 +TUR Turkish t 87.599998 +TKM Turkmenian t 76.699997 +TCA English t 0 +TUV Tuvalu t 92.5 +UGA Ganda f 18.1 +UKR Ukrainian t 64.699997 +HUN Hungarian t 98.5 +URY Spanish t 95.699997 +NCL Malenasian Languages f 45.400002 +NZL English t 87 +UZB Uzbek t 72.599998 +BLR Belorussian t 65.599998 +WLF Wallis f 0 +VUT Bislama t 56.599998 +VAT Italian t 0 +VEN Spanish t 96.900002 +RUS Russian t 86.599998 +VNM Vietnamese t 86.800003 +EST Estonian t 65.300003 +USA English t 86.199997 +VIR English t 81.699997 +UMI English t 0 +ZWE Shona f 72.099998 +PSE Arabic f 95.900002 +AFG Dari t 32.099998 +NLD Fries f 3.7 +ANT English f 7.8000002 +ALB Greek f 1.8 +DZA Berberi f 14 +ASM English t 3.0999999 +AND Catalan t 32.299999 +AGO Mbundu f 21.6 +ATG English t 0 +ARE Hindi f 0 +ARG Italian f 1.7 +ARM Azerbaijani f 2.5999999 +ABW English f 9.5 +AUS Italian f 2.2 +AZE Russian f 3 +BHS Creole French f 10.3 +BHR English f 0 +BGD Chakma f 0.40000001 +BRB English t 0 +BEL French t 32.599998 +BLZ Spanish f 31.6 +BEN Joruba f 12.2 +BTN Nepali f 34.799999 +BOL Ketdua t 8.1000004 +BWA Shona f 12.3 +BRA German f 0.5 +GBR Kymri f 0.89999998 +BRN Malay-English f 28.799999 +BGR Turkish f 9.3999996 +BFA Ful f 9.6999998 +BDI French t 0 +CHL Araucan f 9.6000004 +COK English f 0 +CRI Creole English f 2 +DJI Afar f 34.799999 +DMA Creole French f 0 +DOM Creole French f 2 +ECU Ketdua f 7 +EGY Sinaberberi f 0 +SLV Nahua f 0 +ERI Tigre f 31.700001 +ESP Catalan f 16.9 +ZAF Xhosa t 17.700001 +ETH Amhara f 30 +FJI Hindi f 43.700001 +PHL Cebuano f 23.299999 +FRO Danish t 0 +GAB Punu-sira-nzebi f 17.1 +GMB Ful f 16.200001 +GEO Russian f 8.8000002 +GHA Mossi f 15.8 +GIB Arabic f 7.4000001 +GRL Danish t 12.5 +GLP French t 0 +GUM Chamorro t 29.6 +GTM Quiche f 10.1 +GIN Malinke f 23.200001 +GNB Ful f 16.6 +GUY Caribbean f 2.2 +HTI French t 0 +HND Garifuna f 1.3 +HKG English t 2.2 +SJM Russian f 0 +IDN Sunda f 15.8 +IND Bengali f 8.1999998 +IRQ Kurdish f 19 +IRN Azerbaijani f 16.799999 +IRL Irish t 1.6 +ISL English f 0 +ISR Arabic t 18 +ITA Sardinian f 2.7 +TMP Portuguese t 0 +AUT Serbo-Croatian f 2.2 +JAM Hindi f 1.9 +JPN Korean f 0.5 +YEM Soqutri f 0 +JOR Circassian f 1 +CXR English t 0 +YUG Albaniana f 16.5 +KHM Vietnamese f 5.5 +CMR Bamileke-bamum f 18.6 +CAN French t 23.4 +CPV Portuguese t 0 +KAZ Russian f 34.700001 +KEN Luhya f 13.8 +CAF Banda f 23.5 +CHN Zhuang f 1.4 +KGZ Russian t 16.200001 +KIR Tuvalu f 0.5 +COL Chibcha f 0.40000001 +COM Comorian-French f 12.9 +COG Teke f 17.299999 +COD Kongo f 16 +CCK English t 0 +PRK Chinese f 0.1 +KOR Chinese f 0.1 +GRC Turkish f 0.89999998 +HRV Slovene f 0 +KWT English f 0 +CYP Turkish t 22.4 +LAO Mon-khmer f 16.5 +LVA Russian f 32.5 +LSO Zulu f 15 +LBN Armenian f 5.9000001 +LBR Bassa f 13.7 +LBY Berberi f 1 +LIE Italian f 2.5 +LTU Russian f 8.1000004 +LUX Portuguese f 13 +MAC Portuguese t 2.3 +MDG French t 0 +MKD Albaniana f 22.9 +MWI Lomwe f 18.4 +MDV English f 0 +MYS Chinese f 9 +MLI Ful f 13.9 +MLT English t 2.0999999 +MAR Berberi f 33 +MHL English t 0 +MTQ French t 0 +MRT Wolof f 6.5999999 +MUS Bhojpuri f 21.1 +MYT French t 20.299999 +MEX Nahuatl f 1.8 +FSM Pohnpei f 23.799999 +MDA Russian f 23.200001 +MCO Monegasque f 16.1 +MNG Kazakh f 5.9000001 +MOZ Tsonga f 12.4 +MMR Shan f 8.5 +NAM Nama f 12.4 +NRU Kiribati f 17.9 +NPL Maithili f 11.9 +NIC Miskito f 1.6 +NER Songhai-zerma f 21.200001 +NGA Hausa f 21.1 +NIU English t 0 +NOR English f 0.5 +CIV Gur f 11.7 +OMN Balochi f 0 +PAK Pashto f 13.1 +PLW Philippene Languages f 9.1999998 +PAN Creole English f 14 +PNG Malenasian Languages f 20 +PRY Guarani t 40.099998 +PER Ketdua t 16.4 +MNP Chamorro f 30 +PRI English f 47.400002 +POL German f 1.3 +GNQ Bubi f 8.6999998 +QAT Urdu f 0 +FRA Arabic f 2.5 +GUF Indian Languages f 1.9 +PYF French t 40.799999 +REU Chinese f 2.8 +ROM Hungarian f 7.1999998 +RWA French t 0 +SWE Finnish f 2.4000001 +KNA English t 0 +LCA English t 20 +VCT English t 0 +DEU Turkish f 2.5999999 +SLB Papuan Languages f 8.6000004 +ZMB Tongan f 11 +WSM Samoan t 47.5 +STP French f 0.69999999 +SEN Ful f 21.700001 +SYC English t 3.8 +SLE Temne f 31.799999 +SGP Malay t 14.1 +SVK Hungarian f 10.5 +SVN Serbo-Croatian f 7.9000001 +SOM Arabic t 0 +LKA Tamil t 19.6 +SDN Dinka f 11.5 +FIN Swedish t 5.6999998 +SUR Hindi f 0 +SWZ Zulu f 2 +CHE French t 19.200001 +SYR Kurdish f 9 +TJK Uzbek f 23.200001 +TWN Mandarin Chinese t 20.1 +TZA Swahili t 8.8000002 +DNK Turkish f 0.80000001 +THA Lao f 26.9 +TGO Kabye t 13.8 +TKL English t 0 +TON English t 0 +TTO Hindi f 3.4000001 +TCD Arabic t 12.3 +CZE Moravian f 12.9 +TUN Arabic-French f 26.299999 +TUR Kurdish f 10.6 +TKM Uzbek f 9.1999998 +TUV Kiribati f 7.5 +UGA Nkole f 10.7 +UKR Russian f 32.900002 +HUN Romani f 0.5 +NCL French t 34.299999 +NZL Maori f 4.3000002 +UZB Russian f 10.9 +BLR Russian t 32 +WLF Futuna f 0 +VUT English t 28.299999 +VEN Goajiro f 0.40000001 +RUS Tatar f 3.2 +VNM Tho f 1.8 +EST Russian f 27.799999 +USA Spanish f 7.5 +VIR Spanish f 13.3 +ZWE Ndebele f 16.200001 +PSE Hebrew f 4.0999999 +AFG Uzbek f 8.8000002 +NLD Arabic f 0.89999998 +ANT Dutch t 0 +ALB Macedonian f 0.1 +ASM Tongan f 3.0999999 +AND Portuguese f 10.8 +AGO Kongo f 13.2 +ARG Indian Languages f 0.30000001 +ABW Spanish f 7.4000001 +AUS Greek f 1.6 +AZE Lezgian f 2.3 +BGD Marma f 0.2 +BEL Italian f 2.4000001 +BLZ Maya Languages f 9.6000004 +BEN Adja f 11.1 +BTN Asami f 15.2 +BOL Aimara t 3.2 +BWA San f 3.5 +BRA Italian f 0.40000001 +GBR Gaeli f 0.1 +BRN Chinese f 9.3000002 +BGR Romani f 3.7 +BFA Gurma f 5.6999998 +BDI Swahili f 0 +CHL Aimara f 0.5 +CRI Chibcha f 0.30000001 +DJI Arabic t 10.6 +ERI Afar f 4.3000002 +ESP Galecian f 6.4000001 +ZAF Afrikaans t 14.3 +ETH Tigrinja f 7.1999998 +PHL Ilocano f 9.3000002 +GAB Mpongwe f 14.6 +GMB Wolof f 12.6 +GEO Armenian f 6.8000002 +GHA Ewe f 11.9 +GUM Philippene Languages f 19.700001 +GTM Cakchiquel f 8.8999996 +GIN Susu f 11 +GNB Balante f 14.6 +GUY Arawakan f 1.4 +HND Creole English f 0.2 +HKG Fukien f 1.9 +IDN Malay t 12.1 +IND Telugu f 7.8000002 +IRQ Azerbaijani f 1.7 +IRN Kurdish f 9.1000004 +ISR Russian f 8.8999996 +ITA Friuli f 1.2 +AUT Turkish f 1.5 +JPN Chinese f 0.2 +JOR Armenian f 1 +YUG Hungarian f 3.4000001 +KHM Chinese f 3.0999999 +CMR Duala f 10.9 +CAN Chinese f 2.5 +KAZ Ukrainian f 5 +KEN Luo f 12.8 +CAF Mandjia f 14.8 +CHN Mantdu f 0.89999998 +KGZ Uzbek f 14.1 +COL Creole English f 0.1 +COM Comorian-madagassi f 5.5 +COG Mboshi f 11.4 +COD Mongo f 13.5 +LAO Thai f 7.8000002 +LVA Belorussian f 4.0999999 +LSO English t 0 +LBN French f 0 +LBR Grebo f 8.8999996 +LIE Turkish f 2.5 +LTU Polish f 7 +LUX Italian f 4.5999999 +MAC Mandarin Chinese f 1.2 +MKD Turkish f 4 +MWI Yao f 13.2 +MYS Tamil f 3.9000001 +MLI Senufo and Minianka f 12 +MRT Tukulor f 5.4000001 +MUS French f 3.4000001 +MYT Malagasy f 16.1 +MEX Yucatec f 1.1 +FSM Mortlock f 7.5999999 +MDA Ukrainian f 8.6000004 +MCO Italian f 16.1 +MNG Dorbet f 2.7 +MOZ Sena f 9.3999996 +MMR Karen f 6.1999998 +NAM Kavango f 9.6999998 +NRU Chinese f 8.5 +NPL Bhojpuri f 7.5 +NIC Creole English f 0.5 +NER Tamashek f 10.4 +NGA Ibo f 18.1 +NOR Danish f 0.40000001 +CIV Malinke f 11.4 +PAK Sindhi f 11.8 +PLW English t 3.2 +PAN Guaymi f 5.3000002 +PRY Portuguese f 3.2 +PER Aimara t 2.3 +MNP Chinese f 7.0999999 +POL Ukrainian f 0.60000002 +FRA Portuguese f 1.2 +PYF Chinese f 2.9000001 +REU Comorian f 2.8 +ROM Romani t 0.69999999 +SWE Southern Slavic Languages f 1.3 +DEU Southern Slavic Languages f 1.4 +SLB Polynesian Languages f 3.8 +ZMB Nyanja f 7.8000002 +WSM English t 0.60000002 +SEN Serer f 12.5 +SYC French t 1.3 +SLE Limba f 8.3000002 +SGP Tamil t 7.4000001 +SVK Romani f 1.7 +SVN Hungarian f 0.5 +LKA Mixed Languages f 19.6 +SDN Nubian Languages f 8.1000004 +FIN Russian f 0.40000001 +CHE Italian t 7.6999998 +TJK Russian f 9.6999998 +TWN Hakka f 11 +TZA Hehet f 6.9000001 +DNK Arabic f 0.69999999 +THA Chinese f 12.1 +TGO Watyi f 10.3 +TTO Creole English f 2.9000001 +TCD Mayo-kebbi f 11.5 +CZE Slovak f 3.0999999 +TUN Arabic-French-English f 3.2 +TUR Arabic f 1.4 +TKM Russian f 6.6999998 +TUV English t 0 +UGA Kiga f 8.3000002 +UKR Romanian f 0.69999999 +HUN German f 0.40000001 +NCL Polynesian Languages f 11.6 +UZB Tadzhik f 4.4000001 +BLR Ukrainian f 1.3 +VUT French t 14.2 +VEN Warrau f 0.1 +RUS Ukrainian f 1.3 +VNM Thai f 1.6 +EST Ukrainian f 2.8 +USA French f 0.69999999 +VIR French f 2.5 +ZWE English t 2.2 +AFG Turkmenian f 1.9 +NLD Turkish f 0.80000001 +AND French f 6.1999998 +AGO Luimbe-nganguela f 5.4000001 +ABW Dutch t 5.3000002 +AUS Canton Chinese f 1.1 +AZE Armenian f 2 +BGD Garo f 0.1 +BEL Arabic f 1.6 +BLZ Garifuna f 6.8000002 +BEN Aizo f 8.6999998 +BOL Guarani f 0.1 +BWA Khoekhoe f 2.5 +BRA Japanese f 0.40000001 +BRN English f 3.0999999 +BGR Macedonian f 2.5999999 +BFA Busansi f 3.5 +CHL Rapa nui f 0.2 +CRI Chinese f 0.2 +ERI Hadareb f 3.8 +ESP Basque f 1.6 +ZAF Northsotho f 9.1000004 +ETH Gurage f 4.6999998 +PHL Hiligaynon f 9.1000004 +GAB Mbete f 13.8 +GMB Diola f 9.1999998 +GEO Azerbaijani f 5.5 +GHA Ga-adangme f 7.8000002 +GUM Korean f 3.3 +GTM Kekchi f 4.9000001 +GIN Kissi f 6 +GNB Portuguese t 8.1000004 +HND Miskito f 0.2 +HKG Hakka f 1.6 +IDN Madura f 4.3000002 +IND Marathi f 7.4000001 +IRQ Assyrian f 0.80000001 +IRN Gilaki f 5.3000002 +ITA French f 0.5 +AUT Hungarian f 0.40000001 +JPN English f 0.1 +YUG Romani f 1.4 +KHM Tdam f 2.4000001 +CMR Ful f 9.6000004 +CAN Italian f 1.7 +KAZ German f 3.0999999 +KEN Kamba f 11.2 +CAF Ngbaka f 7.5 +CHN Hui f 0.80000001 +KGZ Ukrainian f 1.7 +COL Arawakan f 0.1 +COM Comorian-Arabic f 1.6 +COG Mbete f 4.8000002 +COD Rwanda f 10.3 +LAO Lao-Soung f 5.1999998 +LVA Ukrainian f 2.9000001 +LBR Gio f 7.9000001 +LTU Belorussian f 1.4 +LUX French t 4.1999998 +MAC English f 0.5 +MKD Romani f 2.3 +MWI Ngoni f 6.6999998 +MYS Iban f 2.8 +MLI Soninke f 8.6999998 +MRT Soninke f 2.7 +MUS Hindi f 1.2 +MEX Zapotec f 0.60000002 +FSM Kosrean f 7.3000002 +MDA Gagauzi f 3.2 +MCO English f 6.5 +MNG Bajad f 1.9 +MOZ Lomwe f 7.8000002 +MMR Rakhine f 4.5 +NAM Afrikaans f 9.5 +NRU Tuvalu f 8.5 +NPL Tharu f 5.4000001 +NIC Sumo f 0.2 +NER Ful f 9.6999998 +NGA Ful f 11.3 +NOR Swedish f 0.30000001 +CIV Kru f 10.5 +PAK Saraiki f 9.8000002 +PLW Chinese f 1.6 +PAN Cuna f 2 +PRY German f 0.89999998 +MNP Korean f 6.5 +POL Belorussian f 0.5 +FRA Italian f 0.40000001 +REU Malagasy f 1.4 +ROM German f 0.40000001 +SWE Arabic f 0.80000001 +DEU Italian f 0.69999999 +ZMB Lozi f 6.4000001 +SEN Diola f 5 +SLE Kono-vai f 5.0999999 +SVK Czech and Moravian f 1.1 +SDN Beja f 6.4000001 +FIN Estonian f 0.2 +CHE Romansh t 0.60000002 +TWN Ami f 0.60000002 +TZA Haya f 5.9000001 +DNK German f 0.5 +THA Malay f 3.5999999 +TGO Kotokoli f 5.6999998 +TCD Kanem-bornu f 9 +CZE Polish f 0.60000002 +TKM Kazakh f 2 +UGA Soga f 8.1999998 +UKR Bulgariana f 0.30000001 +HUN Serbo-Croatian f 0.2 +UZB Kazakh f 3.8 +BLR Polish f 0.60000002 +RUS Chuvash f 0.89999998 +VNM Muong f 1.5 +EST Belorussian f 1.4 +USA German f 0.69999999 +ZWE Nyanja f 2.2 +AFG Balochi f 0.89999998 +AGO Nyaneka-nkhumbi f 5.4000001 +AUS Arabic f 1 +BGD Khasi f 0.1 +BEL German t 1 +BEN Bariba f 8.6999998 +BWA Ndebele f 1.3 +BRA Indian Languages f 0.2 +BFA Dagara f 3.0999999 +ERI Bilin f 3 +ZAF English t 8.5 +ETH Somali f 4.0999999 +PHL Bicol f 5.6999998 +GMB Soninke f 7.5999999 +GEO Osseetti f 2.4000001 +GHA Gurma f 3.3 +GUM Japanese f 2 +GTM Mam f 2.7 +GIN Kpelle f 4.5999999 +GNB Malinke f 6.9000001 +HKG Chiu chau f 1.4 +IDN Minangkabau f 2.4000001 +IND Tamil f 6.3000002 +IRQ Persian f 0.80000001 +IRN Luri f 4.3000002 +ITA German f 0.5 +AUT Slovene f 0.40000001 +JPN Philippene Languages f 0.1 +YUG Slovak f 0.69999999 +CMR Tikar f 7.4000001 +CAN German f 1.6 +KAZ Uzbek f 2.3 +KEN Kalenjin f 10.8 +CAF Sara f 6.4000001 +CHN Miao f 0.69999999 +KGZ Tatar f 1.3 +COL Caribbean f 0.1 +COM Comorian-Swahili f 0.5 +COG Punu f 2.9000001 +COD Zande f 6.0999999 +LVA Polish f 2.0999999 +LBR Kru f 7.1999998 +LTU Ukrainian f 1.1 +LUX German t 2.3 +MKD Serbo-Croatian f 2 +MYS English f 1.6 +MLI Tamashek f 7.3000002 +MRT Ful f 1.2 +MUS Tamil f 0.80000001 +MEX Mixtec f 0.60000002 +FSM Yap f 5.8000002 +MDA Bulgariana f 1.6 +MNG Buryat f 1.7 +MOZ Shona f 6.5 +MMR Mon f 2.4000001 +NAM Herero f 8 +NRU English t 7.5 +NPL Tamang f 4.9000001 +NER Kanuri f 4.4000001 +NGA Ibibio f 5.5999999 +NOR Saame f 0 +CIV [South]Mande f 7.6999998 +PAK Urdu t 7.5999999 +PAN Embera f 0.60000002 +MNP English t 4.8000002 +FRA Spanish f 0.40000001 +REU Tamil f 0 +ROM Ukrainian f 0.30000001 +SWE Spanish f 0.60000002 +DEU Greek f 0.40000001 +ZMB Chewa f 5.6999998 +SEN Malinke f 3.8 +SLE Bullom-sherbro f 3.8 +SVK Ukrainian and Russian f 0.60000002 +SDN Nuer f 4.9000001 +FIN Saame f 0 +TWN Atayal f 0.40000001 +TZA Makonde f 5.9000001 +DNK English f 0.30000001 +THA Khmer f 1.3 +TGO Ane f 5.6999998 +TCD Ouaddai f 8.6999998 +CZE German f 0.5 +UGA Teso f 6 +UKR Hungarian f 0.30000001 +HUN Romanian f 0.1 +UZB Karakalpak f 2 +RUS Bashkir f 0.69999999 +VNM Chinese f 1.4 +EST Finnish f 0.69999999 +USA Italian f 0.60000002 +AGO Chokwe f 4.1999998 +AUS Vietnamese f 0.80000001 +BGD Santhali f 0.1 +BEL Turkish f 0.89999998 +BEN Somba f 6.6999998 +BFA Dyula f 2.5999999 +ERI Saho f 3 +ZAF Tswana f 8.1000004 +ETH Sidamo f 3.2 +PHL Waray-waray f 3.8 +GEO Abhyasi f 1.7 +GHA Joruba f 1.3 +GIN Yalunka f 2.9000001 +GNB Mandyako f 4.9000001 +IDN Batakki f 2.2 +IND Urdu f 5.0999999 +IRN Mazandarani f 3.5999999 +ITA Albaniana f 0.2 +AUT Polish f 0.2 +JPN Ainu f 0 +YUG Macedonian f 0.5 +CMR Mandara f 5.6999998 +CAN Polish f 0.69999999 +KAZ Tatar f 2 +KEN Gusii f 6.0999999 +CAF Mbum f 6.4000001 +CHN Uighur f 0.60000002 +KGZ Kazakh f 0.80000001 +COG Sango f 2.5999999 +COD Ngala and Bangi f 5.8000002 +LVA Lithuanian f 1.2 +LBR Mano f 7.1999998 +MYS Dusun f 1.1 +MLI Songhai f 6.9000001 +MRT Zenaga f 1.2 +MUS Marathi f 0.69999999 +MEX Otomi f 0.40000001 +FSM Wolea f 3.7 +MNG Dariganga f 1.4 +MOZ Tswa f 6 +MMR Chin f 2.2 +NAM Caprivi f 4.6999998 +NPL Newari f 3.7 +NGA Kanuri f 4.0999999 +PAK Balochi f 3 +PAN Arabic f 0.60000002 +MNP Carolinian f 4.8000002 +FRA Turkish f 0.40000001 +ROM Serbo-Croatian f 0.1 +SWE Norwegian f 0.5 +DEU Polish f 0.30000001 +ZMB Nsenga f 4.3000002 +SEN Soninke f 1.3 +SLE Ful f 3.8 +SDN Zande f 2.7 +TWN Paiwan f 0.30000001 +TZA Nyakusa f 5.4000001 +DNK Swedish f 0.30000001 +THA Kuy f 1.1 +TGO Moba f 5.4000001 +TCD Hadjarai f 6.6999998 +CZE Silesiana f 0.40000001 +UGA Lango f 5.9000001 +UKR Belorussian f 0.30000001 +HUN Slovak f 0.1 +UZB Tatar f 1.8 +RUS Chechen f 0.60000002 +VNM Khmer f 1.4 +USA Chinese f 0.60000002 +AGO Luvale f 3.5999999 +AUS Serbo-Croatian f 0.60000002 +BGD Tripuri f 0.1 +BEN Ful f 5.5999999 +ZAF Southsotho f 7.5999999 +ETH Walaita f 2.8 +PHL Pampango f 3 +GIN Loma f 2.3 +IDN Bugi f 2.2 +IND Gujarati f 4.8000002 +IRN Balochi f 2.3 +ITA Slovene f 0.2 +AUT Czech f 0.2 +CMR Maka f 4.9000001 +CAN Spanish f 0.69999999 +KEN Meru f 5.5 +CHN Yi f 0.60000002 +KGZ Tadzhik f 0.80000001 +COD Rundi f 3.8 +LBR Loma f 5.8000002 +MOZ Chuabo f 5.6999998 +MMR Kachin f 1.4 +NAM San f 1.9 +NPL Hindi f 3 +NGA Edo f 3.3 +PAK Hindko f 2.4000001 +SLE Kuranko f 3.4000001 +SDN Bari f 2.5 +TZA Chaga and Pare f 4.9000001 +DNK Norwegian f 0.30000001 +TGO Naudemba f 4.0999999 +TCD Tandjile f 6.5 +CZE Romani f 0.30000001 +UGA Lugbara f 4.6999998 +UKR Polish f 0.1 +RUS Mordva f 0.5 +VNM Nung f 1.1 +USA Tagalog f 0.40000001 +AGO Ambo f 2.4000001 +AUS German f 0.60000002 +ZAF Tsonga f 4.3000002 +PHL Pangasinan f 1.8 +IDN Banja f 1.8 +IND Kannada f 3.9000001 +IRN Arabic f 2.2 +ITA Romani f 0.2 +AUT Romanian f 0.2 +CMR Masana f 3.9000001 +CAN Portuguese f 0.69999999 +KEN Nyika f 4.8000002 +CHN Tujia f 0.5 +COD Teke f 2.7 +LBR Malinke f 5.0999999 +MOZ Ronga f 3.7 +MMR Kayah f 0.40000001 +NAM German f 0.89999998 +NGA Tiv f 2.3 +PAK Brahui f 1.2 +SLE Yalunka f 3.4000001 +SDN Fur f 2.0999999 +TZA Luguru f 4.9000001 +TGO Gurma f 3.4000001 +TCD Gorane f 6.1999998 +CZE Hungarian f 0.2 +UGA Gisu f 4.5 +RUS Kazakh f 0.40000001 +VNM Miao f 0.89999998 +USA Polish f 0.30000001 +AGO Luchazi f 2.4000001 +ZAF Swazi f 2.5 +PHL Maguindanao f 1.4 +IDN Bali f 1.7 +IND Malajalam f 3.5999999 +IRN Bakhtyari f 1.7 +CAN Punjabi f 0.69999999 +KEN Masai f 1.6 +CHN Mongolian f 0.40000001 +COD Boa f 2.3 +MOZ Marendje f 3.5 +NGA Ijo f 1.8 +SDN Chilluk f 1.7 +TZA Shambala f 4.3000002 +UGA Acholi f 4.4000001 +RUS Avarian f 0.40000001 +VNM Man f 0.69999999 +USA Korean f 0.30000001 +ZAF Venda f 2.2 +PHL Maranao f 1.3 +IND Orija f 3.3 +IRN Turkmenian f 1.6 +CAN Ukrainian f 0.60000002 +KEN Turkana f 1.4 +CHN Tibetan f 0.40000001 +COD Chokwe f 1.8 +MOZ Nyanja f 3.3 +NGA Bura f 1.6 +SDN Lotuko f 1.5 +TZA Gogo f 3.9000001 +UGA Rwanda f 3.2 +RUS Mari f 0.40000001 +USA Vietnamese f 0.2 +ZAF Ndebele f 1.5 +IND Punjabi f 2.8 +CAN Dutch f 0.5 +CHN Puyi f 0.2 +TZA Ha f 3.5 +RUS Udmur f 0.30000001 +USA Japanese f 0.2 +IND Asami f 1.5 +CAN Eskimo Languages f 0.1 +CHN Dong f 0.2 +RUS Belorussian f 0.30000001 +USA Portuguese f 0.2 +\. + + +ALTER TABLE ONLY city + ADD CONSTRAINT city_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY country + ADD CONSTRAINT country_pkey PRIMARY KEY (code); + +ALTER TABLE ONLY countrylanguage + ADD CONSTRAINT countrylanguage_pkey PRIMARY KEY (countrycode, "language"); + +COMMIT; + +ANALYZE city; +ANALYZE country; +ANALYZE countrylanguage; + +-- queries with one CTE that is referenced once + +-- Using CTE in the FROM clause + +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) + +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + + +-- Using CTE in the WHERE clause + +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital; + + +--query5 -Using a CTE in the select list +with bigcities as +( +select city.id,city.name,city.population,city.countrycode +from city +where city.population >= 0.5 * (select population from country where country.code=city.countrycode) +) +select +(select max(bigcities.population) from bigcities where bigcities.countrycode='QAT') as MAX_POP, +(select avg(bigcities.population) from bigcities) AS WORLD_AVG, + city.name,city.population + from + city where city.countrycode='QAT'; + +--query6 using CTE in the select list with a qual +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) +select * from +( +select +(select max(CNT) from diversecountries where diversecountries.code = country.code) CNT,country.name COUNTRY,city.name CAPITAL +from country,city where country.capital = city.id) FOO where FOO.CNT is not null; + + +--queries Using a CTE in the HAVING clause + +with notdiversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) < 3) d + where d.countrycode = country.code and country.gnp > 100000) + +select country.name COUNTRY,city.name CAPITAL,count(*) LANGCNT from +country,city,countrylanguage +where country.code = countrylanguage.countrycode and country.capital = city.id +group by country.name,city.name +HAVING count(*) NOT IN (select CNT from notdiversecountries where notdiversecountries.name = country.name) +order by country.name +LIMIT 10; + + +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) + +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' + + +UNION ALL + +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage + +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + + + + + + + +-- ensure select includes with clause in it's syntax + +-- query 1 using the same name for the CTE as a table. Main query should reference the CTE +with country as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') + +select * from +(select * from country where isofficial='True') e1, +(select * from country where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language LIMIT 20; + +-- query 2 using multiple CTEs with same names as tables. +with country as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +countrylanguage(code1,country1,capital1,language1,isofficial1,percentage1,code2,country2,capital2,language2,isofficial2,percentage2) as +( +select * from +(select * from country where isofficial='True') e1, +(select * from country where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language +) +select code1,country1,capital1,language1,isofficial1,percentage1,country.COUNTRY from country,countrylanguage where country.code = countrylanguage.code1 +and country.percentage = countrylanguage.percentage1 +order by COUNTRY,percentage1 LIMIT 20;-- queries using same name for CTEs and the subquery aliases in the main query + +-- query1 +with c1 as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +c2 as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Asia') + +select * from +(select * from c1 where isofficial='True') c1, +(select * from c2 where percentage > 50) c2 +where c1.percentage = c2.percentage order by c2.COUNTRY,c1.language; + +-- query2 using same names as tables +with country as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +countrylanguage as +(select country.code,country.COUNTRY,country.language,country.isofficial,country.percentage + FROM country,countrylanguage + WHERE country.code = countrylanguage.countrycode +) + +select * from +(select * from country where isofficial='True') country, +(select * from countrylanguage where percentage > 50) countrylanguage +where country.percentage = countrylanguage.percentage order by countrylanguage.COUNTRY,country.language LIMIT 40; +-- Using the same name for the CTE at every subquery-level +select avg(population12),CITY12 +from +( +with city(CITY1,POPULATION1) as (select city.name,city.population from city where city.population >= 100) + +select CITY12,POPULATION12 from +( + with city(CITY2,POPULATION2) as ( select city1,population1 from city where population1 >= 1000 ) + select CITY12,POPULATION12 from + ( + with city(CITY3,POPULATION3) as (select city2,population2 from city where population2 >= 10000) + select CITY12,POPULATION12 from + ( + with city(CITY4,POPULATION4) as (select city3,population3 from city where population3 >= 20000) + select CITY12,POPULATION12 from + ( + with city(CITY5,POPULATION5) as (select city4,population4 from city where population4 >= 50000) + select CITY12,POPULATION12 from + ( + with city(CITY6,POPULATION6) as (select city5,population5 from city where population5 >= 80000) + select CITY12,POPULATION12 from + ( + with city(CITY7,POPULATION7) as (select city6,population6 from city where population6 >= 150000) + select CITY12,POPULATION12 from + ( + with city(CITY8,POPULATION8) as (select city7,population7 from city where population7 >= 200000) + select CITY12,POPULATION12 from + ( + with city(CITY9,POPULATION9) as (select city8,population8 from city where population8 >= 250000) + select CITY12,POPULATION12 from + ( + with city(CITY10,POPULATION10) as (select city9,population9 from city where population9 >= 300000) + select city12,population12 from + ( + with city(CITY11,POPULATION11) as (select city10,population10 from city where population10 >= 6500000) + select CITY12,POPULATION12 from + ( + with city(CITY12,POPULATION12) as (select city11,population11 from city where population11 >= 7000000) + select s1.city12,s1.population12 from city s1,city s2 + ) FOO11 + ) FOO10 + ) FOO9 + ) FOO8 + ) FOO7 + ) FOO6 + ) FOO5 + ) FOO4 + )FOO3 + ) FOO2 +) FOO1 +) FOO0 group by city12 order by city12;-- negative cases where queries have duplicate names in CTEs + +-- Tests for duplicate column aliases +with capitals as +(select country.code,id,city.name,city.countrycode as code from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from capitals where id < 100; + +with allofficiallanguages as +(select countrylanguage.countrycode,city.countrycode,language from + city,countrylanguage where countrylanguage.countrycode = city.countrycode and isofficial = 'True') +select * from allofficiallanguages where language like 'A%'; + +with capitals(code,id,name,code) as +(select country.code,id,city.name,city.countrycode from city,country + where city.countrycode = country.code AND city.id = country.capital) +select * from capitals where id < 100; + +-- query1 CTE referencing itself +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode + HAVING count(*) > (select max(lang_count) from lang_total) +) + +select count(*) from lang_total; + +--query2 CTE forward referencing another CTE +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital), + +lang_total as +( select count(*) as lang_count,country.code,alleuropeanlanguages.code + from country join alleuropeanlanguages on (country.code=alleuropeanlanguages.code and governmentform='Federal Republic') + group by country.code,alleuropeanlanguages.code order by country.code), + +alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') + +select * from alleuropeanlanguages;-- negative cases with mismatching column list provided for CTEs + +--query1 +with capitals(code,id) as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) + +select * from capitals; + +--query 2 +with lang_total(lang_count,code,countrycode,name) as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) +select * from lang_total; +-- queries with CTEs using hash joins + + +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; + + + +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) + +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + + +-- Using CTE in the WHERE clause + +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) + +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' + + +UNION ALL + +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage + +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + + +-- query 6 + + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + + +-- query7 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') + +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + + +-- query8 + +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + + +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) + +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + +-- queries with CTEs using merge joins + + +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; + + + +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) + +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + + +-- Using CTE in the WHERE clause + +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) + +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' + + +UNION ALL + +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage + +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + + +-- query 6 + + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + + +-- query7 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') + +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + + +-- query8 + +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + + +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) + +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + +-- queries with a single CTE used more than once in different parts of the main query + +-- query1 +-- This kind of query is their only use case for CTE. We don't error, we give correct +-- results,use shared scan here and we are good! +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + + +-- query2 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') + +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + + +-- query3 + +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + + +--query 4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + + +--query 5 Use CTE more than once in select list , from clause and where clause without correlation +with official_languages as +( + select country.code,country.name,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and isofficial = 'True' + and country.governmentform NOT IN (select 'Commonwealth of the US' UNION ALL select 'Monarchy (Sultanate)' UNION ALL select 'Monarchy') + and country.gnp > (select min(gnpold) from country where country.region = 'Western Europe') +) + +select +( select max(CNT) from (select count(*) CNT,o1.name from official_languages o1, official_languages o2 + where o1.code = o2.code group by o1.name) FOO +),* from official_languages; + + +--query 6 Use CTE in the main query and subqueries within the main query + +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select OUTERMOST_FOO.*,bad_headofstates.headofstate from ( +select avg(population),region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +order by OUTERMOST_FOO.region,bad_headofstates.headofstate LIMIT 40; + + +-- query 7 Use CTE in the main query, where clause and having clause +with district_population as +(select sum(city.population) DISTRICT_POP,count(*) NUM_CITIES,district,countrycode,country.name COUNTRY + from city,country + where city.countrycode = country.code + group by district,countrycode,country.name + HAVING (sum(city.population)/count(*)) > ( select avg(population) from city where countrycode = 'CHN')) + +select sum(FOO.DISTRICT_POP),sum(FOO.NUM_CITIES),COUNTRY,CAPITAL,CAPITAL_POP +from +( + +(select district_population.*,city.name CAPITAL,city.population CAPITAL_POP from +district_population,country,city +where district_population.countrycode = country.code AND city.id = country.capital +AND DISTRICT_POP >= ( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'USA') ) +order by COUNTRY,district) +UNION ALL +(select district_population.*,city.name CAPITAL,city.population CAPITAL_POP from +district_population,country,city +where district_population.countrycode = country.code AND city.id = country.capital +AND DISTRICT_POP >= ( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'IND') ) +order by COUNTRY,district) +UNION ALL +(select district_population.*,city.name CAPITAL,city.population CAPITAL_POP from +district_population,country,city +where district_population.countrycode = country.code AND city.id = country.capital +AND DISTRICT_POP >= ( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'CHN') ) +order by COUNTRY,district) + +) FOO + +WHERE FOO.CAPITAL_POP > (select min(DISTRICT_POP) from district_population) + +group by FOO.COUNTRY,FOO.CAPITAL,FOO.CAPITAL_POP + +HAVING sum(FOO.DISTRICT_POP) >= ( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'AUS') ) +AND (sum(FOO.DISTRICT_POP)/sum(FOO.NUM_CITIES)) <= +( select avg(DISTRICT_POP) FROM district_population where district IN (select district from city where countrycode = 'USA' or countrycode = 'IND' or countrycode = 'CHN')) +order by FOO.country; + +-- query8 Use CTE in the select list and the from clause +with official_languages as +( + select country.code,country.name,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and isofficial = 'True' +) + +select +( select max(CNT) from (select count(*) CNT from official_languages) FOO +) +,* from official_languages order by official_languages.code,official_languages.language; + +-- queries with CTEs using index scans + +set enable_seqscan=off; +set enable_indexscan=on; + + + + +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) + +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + + +-- Using CTE in the WHERE clause + +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + +-- some queries with merge joins and index scans +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; + + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) + +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' + + +UNION ALL + +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage + +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + + +-- query 6 + + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + + +-- query7 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') + +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + + +-- query8 + +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + +-- some queries with hash joins and index scans +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; + + +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) + +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + +-- queries with CTEs using index scans on bitmap indexes +\echo --start_ignore +Drop index bitmap_city_countrycode; +Drop index bitmap_country_gf; +Drop index bitmap_country_region; +Drop index bitmap_country_continent; +Drop index bitmap_countrylanguage_countrycode; +\echo --end_ignore +create index bitmap_city_countrycode on city using bitmap(countrycode); +create index bitmap_country_gf on country using bitmap(governmentform); +create index bitmap_country_region on country using bitmap(region); +create index bitmap_country_continent on country using bitmap(continent); +create index bitmap_countrylanguage_countrycode on countrylanguage using bitmap(countrycode); + + + +set enable_seqscan=off; +set enable_indexscan=on; + + + + +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) + +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + + +-- Using CTE in the WHERE clause + +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + +-- some queries with merge joins and index scans +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; + + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) + +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' + + +UNION ALL + +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage + +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + + +-- query 6 + + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + + +-- query8 + +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + +-- some queries with hash joins and index scans +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; + + +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) + +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; +-- queries with CTEs using hash aggs + + +set enable_groupagg=off; +set enable_hashagg=on; + + +--query1 +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital) + +select * from +capitals,countrylanguage +where capitals.code = countrylanguage.countrycode and isofficial='true' +order by capitals.code,countrylanguage.language; + +--query2 +with lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select lang_count,country.code,country.name,country.continent,country.region,country.population + from country left outer join lang_total + on (lang_total.code = country.code) + where country.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + + +-- Using CTE in the WHERE clause + +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + + UNION ALL + + ( + select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Monarchy') + group by country.code,countrylanguage.countrycode order by country.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country.code,country.name +from +country,countrylanguage +where country.code=countrylanguage.countrycode group by country.code,country.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + +--query4 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + + select diversecountries.name,city.name,diversecountries.CNT + from diversecountries,city where city.id = diversecountries.capital + order by diversecountries.name; + + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Southeast Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Eastern Asia' + and country.continent = 'Asia' + + UNION ALL + + select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate + from country,city + where country.capital = city.id + and country.gnp < 10000 + and country.region = 'Middle East' + and country.continent = 'Asia' + ) FOO, countrylanguage + where FOO.code = countrylanguage.countrycode + group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,countrylanguage.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country.code from countrylanguage,country + where countrylanguage.countrycode=country.code + and country.continent = 'Asia' + and country.region = 'Southern and Central Asia' + group by country.code + ) FOO1 + ) +) + +select FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'North America' + + +UNION ALL + +select country.code,country.name COUNTRY,city.name CAPITAL,country.headofstate +from country,city +where country.capital = city.id +and country.continent = 'South America' +) FOO,countrylanguage + +where FOO.code = countrylanguage.countrycode +group by FOO.code,FOO.COUNTRY,FOO.CAPITAL,FOO.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country + where somecheapasiandiversecountries.code = country.code + and country.gnp >= country.gnpold + ) ASIANCOUNT + ) +order by COUNTRY; + + +-- query 6 + + +select count(*) from +( select r.* from + ( with fact as + ( + select country.name as COUNTRY,country.code,city.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city.population >= 0.5 * country.population) then country.population else city.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country.region + from country,city + where governmentform != 'Constitutional Monarchy' + and country.capital = city.id + and indepyear > 0 + group by country.region) AGG1 + ,country,city + where country.capital = city.id + and country.region = AGG1.region + ) + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage + where fact.code = countrylanguage.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + + +-- query7 +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe') + +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY,e1.language; + + +-- query8 + +with allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select sum(FOO.CITY_CNT) REGION_CITY_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'Asia' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > 1 +and country.continent = 'North America' + +UNION ALL + +select allcountrystats.code,allcountrystats.name COUNTRY,CITY_CNT,LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and CITY_CNT/LANG_CNT > (select max(CITY_CNT/LANG_CNT) from allcountrystats,country where allcountrystats.code = country.code AND country.continent='Europe') +) FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region; + + +--query 9 +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + +select d1.code,d1.name,d1.capital,city.name CAPITAL_CITY,d1.CNT,d2.CNT +from +diversecountries d1 left join country +ON (d1.code = country.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country.code = d2.code AND d2.CNT > 8) +INNER JOIN city +ON(d1.capital = city.id) +ORDER BY d1.name; + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + +--query 11 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) + +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + +-- queries with CTEs on AO tables + +DROP TABLE IF EXISTS CITY_AO; + +CREATE TABLE CITY_AO ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +) with (appendonly=true) ; + + +DROP TABLE IF EXISTS country_ao; + +CREATE TABLE country_ao ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea numeric(10,2) NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +) with (appendonly=true); + +DROP TABLE IF EXISTS countrylanguage_ao; + +CREATE TABLE countrylanguage_ao ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +) with (appendonly=true); + +create index bitmap_city_ao_countrycode on city_ao using bitmap(countrycode); +create index bitmap_country_ao_gf on country_ao using bitmap(governmentform); +create index bitmap_country_ao_region on country_ao using bitmap(region); +create index bitmap_country_ao_continent on country_ao using bitmap(continent); +create index bitmap_countrylanguage_ao_countrycode on countrylanguage_ao using bitmap(countrycode); + +INSERT INTO CITY_AO SELECT * FROM CITY; +INSERT INTO COUNTRY_AO SELECT * FROM COUNTRY; +INSERT INTO COUNTRYLANGUAGE_AO SELECT * FROM COUNTRYLANGUAGE; + +ANALYZE CITY_AO; +ANALYZE COUNTRY_AO; +ANALYZE COUNTRYLANGUAGE_AO; + +set enable_seqscan=off; +set enable_indexscan=on; + + + +--query1 +with capitals as +(select country_ao.code,id,city_ao.name from city_ao,country_ao + where city_ao.countrycode = country_ao.code AND city_ao.id = country_ao.capital) + +select * from +capitals,countrylanguage_ao +where capitals.code = countrylanguage_ao.countrycode and isofficial='true' +order by capitals.code,countrylanguage_ao.language; + +--query2 +with lang_total as +( select count(*) as lang_count,country_ao.code,countrylanguage_ao.countrycode + from country_ao join countrylanguage_ao on (country_ao.code=countrylanguage_ao.countrycode and governmentform='Federal Republic') + group by country_ao.code,countrylanguage_ao.countrycode order by country_ao.code) + +select lang_count,country_ao.code,country_ao.name,country_ao.continent,country_ao.region,country_ao.population + from country_ao left outer join lang_total + on (lang_total.code = country_ao.code) + where country_ao.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + + +-- Using CTE in the WHERE clause + +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country_ao.code,countrylanguage_ao.countrycode + from country_ao join countrylanguage_ao on (country_ao.code=countrylanguage_ao.countrycode and governmentform='Federal Republic') + group by country_ao.code,countrylanguage_ao.countrycode order by country_ao.code) + + UNION ALL + + ( + select count(*) as lang_count,country_ao.code,countrylanguage_ao.countrycode + from country_ao join countrylanguage_ao on (country_ao.code=countrylanguage_ao.countrycode and governmentform='Monarchy') + group by country_ao.code,countrylanguage_ao.countrycode order by country_ao.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country_ao.code,country_ao.name +from +country_ao,countrylanguage_ao +where country_ao.code=countrylanguage_ao.countrycode group by country_ao.code,country_ao.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + +--query4 +with diversecountries as +(select country_ao.code,country_ao.name,country_ao.capital,d.CNT + from country_ao, + (select countrylanguage_ao.countrycode,count(*) as CNT from countrylanguage_ao group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country_ao.code and country_ao.gnp > 100000) + + select diversecountries.name,city_ao.name,diversecountries.CNT + from diversecountries,city_ao where city_ao.id = diversecountries.capital + order by diversecountries.name; + +-- some queries with merge joins and index scans +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; + + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY_AO,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate + from country_ao,city_ao + where country_ao.capital = city_ao.id + and country_ao.gnp < 10000 + and country_ao.region = 'Southeast Asia' + and country_ao.continent = 'Asia' + + UNION ALL + + select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate + from country_ao,city_ao + where country_ao.capital = city_ao.id + and country_ao.gnp < 10000 + and country_ao.region = 'Eastern Asia' + and country_ao.continent = 'Asia' + + UNION ALL + + select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate + from country_ao,city_ao + where country_ao.capital = city_ao.id + and country_ao.gnp < 10000 + and country_ao.region = 'Middle East' + and country_ao.continent = 'Asia' + ) FOO, countrylanguage_ao + where FOO.code = countrylanguage_ao.countrycode + group by FOO.code,FOO.COUNTRY_AO,FOO.CAPITAL,FOO.headofstate,countrylanguage_ao.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country_ao.code from countrylanguage_ao,country_ao + where countrylanguage_ao.countrycode=country_ao.code + and country_ao.continent = 'Asia' + and country_ao.region = 'Southern and Central Asia' + group by country_ao.code + ) FOO1 + ) +) + +select FOO.code,FOO.COUNTRY_AO,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate +from country_ao,city_ao +where country_ao.capital = city_ao.id +and country_ao.continent = 'North America' + + +UNION ALL + +select country_ao.code,country_ao.name COUNTRY_AO,city_ao.name CAPITAL,country_ao.headofstate +from country_ao,city_ao +where country_ao.capital = city_ao.id +and country_ao.continent = 'South America' +) FOO,countrylanguage_ao + +where FOO.code = countrylanguage_ao.countrycode +group by FOO.code,FOO.COUNTRY_AO,FOO.CAPITAL,FOO.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country_ao + where somecheapasiandiversecountries.code = country_ao.code + and country_ao.gnp >= country_ao.gnpold + ) ASIANCOUNT + ) +order by COUNTRY_AO; + + +-- query 6 + + +select count(*) from +( select r.* from + ( with fact as + ( + select country_ao.name as COUNTRY_AO,country_ao.code,city_ao.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city_ao.population >= 0.5 * country_ao.population) then country_ao.population else city_ao.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country_ao.region + from country_ao,city_ao + where governmentform != 'Constitutional Monarchy' + and country_ao.capital = city_ao.id + and indepyear > 0 + group by country_ao.region) AGG1 + ,country_ao,city_ao + where country_ao.capital = city_ao.id + and country_ao.region = AGG1.region + ) + + select code,COUNTRY_AO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_ao + where fact.code = countrylanguage_ao.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY_AO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_ao + where fact.code = countrylanguage_ao.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY_AO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_ao + where fact.code = countrylanguage_ao.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + + +-- query7 +with alleuropeanlanguages as +(select country_ao.code,country_ao.name COUNTRY_AO, city_ao.name CAPITAL, language, isofficial, percentage + FROM country_ao,city_ao,countrylanguage_ao + WHERE country_ao.code = countrylanguage_ao.countrycode + and country_ao.capital = city_ao.id + and country_ao.continent = 'Europe') + +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY_AO,e1.language; + + +-- query8 + +with allcountry_aostats as +( select country_ao.code,country_ao.name,count(distinct city_ao.id) CITY_AO_CNT, + count(distinct countrylanguage_ao.language) LANG_CNT + from country_ao,city_ao,countrylanguage_ao + where country_ao.code = city_ao.countrycode + and country_ao.code = countrylanguage_ao.countrycode + group by country_ao.code,country_ao.name +) + +select sum(FOO.CITY_AO_CNT) REGION_CITY_AO_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountry_aostats.code,allcountry_aostats.name COUNTRY_AO,CITY_AO_CNT,LANG_CNT,country_ao.region,city_ao.name CAPITAL +from allcountry_aostats,country_ao,city_ao +where allcountry_aostats.code = country_ao.code +and country_ao.capital = city_ao.id +and CITY_AO_CNT/LANG_CNT > 1 +and country_ao.continent = 'Asia' + +UNION ALL + +select allcountry_aostats.code,allcountry_aostats.name COUNTRY_AO,CITY_AO_CNT,LANG_CNT,country_ao.region,city_ao.name CAPITAL +from allcountry_aostats,country_ao,city_ao +where allcountry_aostats.code = country_ao.code +and country_ao.capital = city_ao.id +and CITY_AO_CNT/LANG_CNT > 1 +and country_ao.continent = 'North America' + +UNION ALL + +select allcountry_aostats.code,allcountry_aostats.name COUNTRY_AO,CITY_AO_CNT,LANG_CNT,country_ao.region,city_ao.name CAPITAL +from allcountry_aostats,country_ao,city_ao +where allcountry_aostats.code = country_ao.code +and country_ao.capital = city_ao.id +and CITY_AO_CNT/LANG_CNT > (select max(CITY_AO_CNT/LANG_CNT) from allcountry_aostats,country_ao where allcountry_aostats.code = country_ao.code AND country_ao.continent='Europe') +) FOO +,allcountry_aostats,country_ao + +WHERE allcountry_aostats.code = country_ao.code +and FOO.region = country_ao.region +group by FOO.region order by FOO.region; + +-- some queries with hash joins and index scans +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; + + +--query 9 +with diversecountries as +(select country_ao.code,country_ao.name,country_ao.capital,d.CNT + from country_ao, + (select countrylanguage_ao.countrycode,count(*) as CNT from countrylanguage_ao group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country_ao.code and country_ao.gnp > 100000) + +select d1.code,d1.name,d1.capital,city_ao.name CAPITAL_CITY_AO,d1.CNT,d2.CNT +from +diversecountries d1 left join country_ao +ON (d1.code = country_ao.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country_ao.code = d2.code AND d2.CNT > 8) +INNER JOIN city_ao +ON(d1.capital = city_ao.id) +ORDER BY d1.name; + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country_ao + group by region + ) FOO,countrylanguage_ao,country_ao +where + country_ao.code = countrylanguage_ao.countrycode + and FOO.region = country_ao.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country_ao + group by region + ) FOO,countrylanguage_ao,country_ao +where + country_ao.code = countrylanguage_ao.countrycode + and FOO.region = country_ao.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountry_aostats as +( select country_ao.code,country_ao.name,count(distinct city_ao.id) CITY_AO_CNT, + count(distinct countrylanguage_ao.language) LANG_CNT + from country_ao,city_ao,countrylanguage_ao + where country_ao.code = city_ao.countrycode + and country_ao.code = countrylanguage_ao.countrycode + group by country_ao.code,country_ao.name +) + +select allcountry_aostats.CITY_AO_CNT,allcountry_aostats.LANG_CNT,allcountry_aostats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_aostats,country_ao +where longlivingregions.region = denseregions.region and allcountry_aostats.code = country_ao.code and country_ao.region = longlivingregions.region +and country_ao.indepyear between 1800 and 1850 + +UNION ALL + +select allcountry_aostats.CITY_AO_CNT,allcountry_aostats.LANG_CNT,allcountry_aostats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_aostats,country_ao +where longlivingregions.region = denseregions.region and allcountry_aostats.code = country_ao.code and country_ao.region = longlivingregions.region +and country_ao.indepyear between 1850 and 1900 + +UNION ALL + +select allcountry_aostats.CITY_AO_CNT,allcountry_aostats.LANG_CNT,allcountry_aostats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_aostats,country_ao +where longlivingregions.region = denseregions.region and allcountry_aostats.code = country_ao.code and country_ao.region = longlivingregions.region +and country_ao.indepyear > 1900 +order by name +LIMIT 50; + +--query 11 +with allcity_aostats as +( select city_ao.name CITY_AO,city_ao.id,country_ao.name COUNTRY_AO,city_ao.district,city_ao.population as CITY_AO_POP + from + city_ao,country_ao + where city_ao.countrycode = country_ao.code +), +alldistrictstats as +( select allcity_aostats.district,allcity_aostats.COUNTRY_AO,sum(CITY_AO_POP) DISTRICT_POP, + count(CITY_AO) as D_CITY_AO_CNT + from allcity_aostats + group by allcity_aostats.district,allcity_aostats.COUNTRY_AO + order by district,COUNTRY_AO +), +allcountry_aostats as +( select alldistrictstats.COUNTRY_AO,country_ao.code,sum(D_CITY_AO_CNT) C_CITY_AO_CNT, + count(distinct countrylanguage_ao.language) C_LANG_CNT + from alldistrictstats,country_ao,countrylanguage_ao + where alldistrictstats.COUNTRY_AO = country_ao.name + and country_ao.code = countrylanguage_ao.countrycode + group by COUNTRY_AO,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_AO_CNT) REGION_CITY_AO_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountry_aostats.code,allcountry_aostats.COUNTRY_AO,C_CITY_AO_CNT,C_LANG_CNT,country_ao.region,city_ao.name CAPITAL +from allcountry_aostats,country_ao,city_ao +where allcountry_aostats.code = country_ao.code +and country_ao.capital = city_ao.id +and C_CITY_AO_CNT/C_LANG_CNT > 1 +and country_ao.continent = 'Asia') FOO +,allcountry_aostats,country_ao + +WHERE allcountry_aostats.code = country_ao.code +and FOO.region = country_ao.region +group by FOO.region order by FOO.region +) + +select * from +( +select REGION_CITY_AO_CNT as CITY_AO_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_AO_CNT) CITY_AO_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountry_aostats.code,allcountry_aostats.COUNTRY_AO,C_CITY_AO_CNT,C_LANG_CNT,country_ao.region,allcity_aostats.CITY_AO CAPITAL +from allcountry_aostats,country_ao,allcity_aostats +where allcountry_aostats.code = country_ao.code +and country_ao.capital = allcity_aostats.id +and C_CITY_AO_CNT/C_LANG_CNT > 1 +and country_ao.continent = 'Europe') FOO +,allcountry_aostats,country_ao + +WHERE allcountry_aostats.code = country_ao.code +and FOO.region = country_ao.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + +-- queries with CTEs on CO tables + +DROP TABLE IF EXISTS CITY_CO; + +CREATE TABLE CITY_CO ( + id integer NOT NULL, + name text NOT NULL, + countrycode character(3) NOT NULL, + district text NOT NULL, + population integer NOT NULL +) with (appendonly=true,orientation=column) ; + + +DROP TABLE IF EXISTS country_co; + +CREATE TABLE country_co ( + code character(3) NOT NULL, + name text NOT NULL, + continent text NOT NULL, + region text NOT NULL, + surfacearea numeric(10,2) NOT NULL, + indepyear smallint, + population integer NOT NULL, + lifeexpectancy real, + gnp numeric(10,2), + gnpold numeric(10,2), + localname text NOT NULL, + governmentform text NOT NULL, + headofstate text, + capital integer, + code2 character(2) NOT NULL +) with (appendonly=true,orientation=column); + +DROP TABLE IF EXISTS countrylanguage_co; + +CREATE TABLE countrylanguage_co ( + countrycode character(3) NOT NULL, + "language" text NOT NULL, + isofficial boolean NOT NULL, + percentage real NOT NULL +) with (appendonly=true,orientation=column); + +create index bitmap_city_co_countrycode on city_co using bitmap(countrycode); +create index bitmap_country_co_gf on country_co using bitmap(governmentform); +create index bitmap_country_co_region on country_co using bitmap(region); +create index bitmap_country_co_continent on country_co using bitmap(continent); +create index bitmap_countrylanguage_co_countrycode on countrylanguage_co using bitmap(countrycode); + +INSERT INTO CITY_CO SELECT * FROM CITY; +INSERT INTO COUNTRY_CO SELECT * FROM COUNTRY; +INSERT INTO COUNTRYLANGUAGE_CO SELECT * FROM COUNTRYLANGUAGE; + +ANALYZE CITY_CO; +ANALYZE COUNTRY_CO; +ANALYZE COUNTRYLANGUAGE_CO; + +set enable_seqscan=off; +set enable_indexscan=on; + +--query1 +with capitals as +(select country_co.code,id,city_co.name from city_co,country_co + where city_co.countrycode = country_co.code AND city_co.id = country_co.capital) +select * from +capitals,countrylanguage_co +where capitals.code = countrylanguage_co.countrycode and isofficial='true' +order by capitals.code,countrylanguage_co.language; + +--query2 +with lang_total as +( select count(*) as lang_count,country_co.code,countrylanguage_co.countrycode + from country_co join countrylanguage_co on (country_co.code=countrylanguage_co.countrycode and governmentform='Federal Republic') + group by country_co.code,countrylanguage_co.countrycode order by country_co.code) + +select lang_count,country_co.code,country_co.name,country_co.continent,country_co.region,country_co.population + from country_co left outer join lang_total + on (lang_total.code = country_co.code) + where country_co.indepyear > 1970 and lang_total.lang_count >=1 and lang_total.lang_count >=1 + order by lang_total.lang_count desc; + + +-- Using CTE in the WHERE clause + +--query3 +with lang_total as +( select lang_count,countrycode from + ( + ( + select count(*) as lang_count,country_co.code,countrylanguage_co.countrycode + from country_co join countrylanguage_co on (country_co.code=countrylanguage_co.countrycode and governmentform='Federal Republic') + group by country_co.code,countrylanguage_co.countrycode order by country_co.code) + + UNION ALL + + ( + select count(*) as lang_count,country_co.code,countrylanguage_co.countrycode + from country_co join countrylanguage_co on (country_co.code=countrylanguage_co.countrycode and governmentform='Monarchy') + group by country_co.code,countrylanguage_co.countrycode order by country_co.code) + + ) FOO1 +) +select * from +( +select count(*) as cnt,country_co.code,country_co.name +from +country_co,countrylanguage_co +where country_co.code=countrylanguage_co.countrycode group by country_co.code,country_co.name) AS FOO +where foo.cnt = (select max(lang_count) from lang_total) order by foo.code; + +--query4 +with diversecountries as +(select country_co.code,country_co.name,country_co.capital,d.CNT + from country_co, + (select countrylanguage_co.countrycode,count(*) as CNT from countrylanguage_co group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country_co.code and country_co.gnp > 100000) + + select diversecountries.name,city_co.name,diversecountries.CNT + from diversecountries,city_co where city_co.id = diversecountries.capital + order by diversecountries.name; + +-- some queries with merge joins and index scans +set enable_nestloop=off; +set enable_hashjoin=off; +set enable_mergejoin=on; + + +-- query 5 +with somecheapasiandiversecountries as +( + select FOO.code,FOO.COUNTRY_CO,FOO.CAPITAL,FOO.headofstate,count(*) ASIAN_COUNT from + ( + select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate + from country_co,city_co + where country_co.capital = city_co.id + and country_co.gnp < 10000 + and country_co.region = 'Southeast Asia' + and country_co.continent = 'Asia' + + UNION ALL + + select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate + from country_co,city_co + where country_co.capital = city_co.id + and country_co.gnp < 10000 + and country_co.region = 'Eastern Asia' + and country_co.continent = 'Asia' + + UNION ALL + + select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate + from country_co,city_co + where country_co.capital = city_co.id + and country_co.gnp < 10000 + and country_co.region = 'Middle East' + and country_co.continent = 'Asia' + ) FOO, countrylanguage_co + where FOO.code = countrylanguage_co.countrycode + group by FOO.code,FOO.COUNTRY_CO,FOO.CAPITAL,FOO.headofstate,countrylanguage_co.countrycode + HAVING count(*) >= + (select min(CNT) FROM + (select count(*) CNT,country_co.code from countrylanguage_co,country_co + where countrylanguage_co.countrycode=country_co.code + and country_co.continent = 'Asia' + and country_co.region = 'Southern and Central Asia' + group by country_co.code + ) FOO1 + ) +) + +select FOO.code,FOO.COUNTRY_CO,FOO.CAPITAL,FOO.headofstate,count(*) COMPARED_WITH_CHEAP_ASIAN_CNT +from +( +select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate +from country_co,city_co +where country_co.capital = city_co.id +and country_co.continent = 'North America' + + +UNION ALL + +select country_co.code,country_co.name COUNTRY_CO,city_co.name CAPITAL,country_co.headofstate +from country_co,city_co +where country_co.capital = city_co.id +and country_co.continent = 'South America' +) FOO,countrylanguage_co + +where FOO.code = countrylanguage_co.countrycode +group by FOO.code,FOO.COUNTRY_CO,FOO.CAPITAL,FOO.headofstate + +HAVING count(*) >= + (select min(ASIAN_COUNT) FROM + (select ASIAN_COUNT FROM somecheapasiandiversecountries,country_co + where somecheapasiandiversecountries.code = country_co.code + and country_co.gnp >= country_co.gnpold + ) ASIANCOUNT + ) +order by COUNTRY_CO; + +-- query 6 +select count(*) from +( select r.* from + ( with fact as + ( + select country_co.name as COUNTRY_CO,country_co.code,city_co.name as CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,AGG1.region + from + (select + sum(case when (city_co.population >= 0.5 * country_co.population) then country_co.population else city_co.population end) as S_POPULATION, + sum(case when (gnp >= gnpold) then gnp else gnpold end) as S_GNP, + avg(case when (lifeexpectancy > 60) then 50 else lifeexpectancy end) as AVG_LIFE,country_co.region + from country_co,city_co + where governmentform != 'Constitutional Monarchy' + and country_co.capital = city_co.id + and indepyear > 0 + group by country_co.region) AGG1 + ,country_co,city_co + where country_co.capital = city_co.id + and country_co.region = AGG1.region + ) + + select code,COUNTRY_CO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_co + where fact.code = countrylanguage_co.countrycode and isofficial = 'True' + and fact.region = 'South America' + + UNION ALL + + select code,COUNTRY_CO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_co + where fact.code = countrylanguage_co.countrycode and isofficial = 'True' + and fact.region = 'North America' + + UNION ALL + + select code,COUNTRY_CO,CAPITAL,S_POPULATION,S_GNP,AVG_LIFE,language as OFFICIALLANGUAGE,region + from fact,countrylanguage_co + where fact.code = countrylanguage_co.countrycode and isofficial = 'True' + and fact.region = 'Caribbean' + ) as r + left join + ( + select 'ARG' as CODE UNION ALL + select 'BOL' as CODE UNION ALL + select 'BRA' as CODE UNION ALL + select 'PER' as CODE UNION ALL + select 'URY' as CODE UNION ALL + select 'IND' as CODE UNION ALL + select 'LCA' as CODE UNION ALL + select 'VCT' as CODE + ) as r1 +on r.code = r1.code) AS FOO; + +-- query7 +with alleuropeanlanguages as +(select country_co.code,country_co.name COUNTRY_CO, city_co.name CAPITAL, language, isofficial, percentage + FROM country_co,city_co,countrylanguage_co + WHERE country_co.code = countrylanguage_co.countrycode + and country_co.capital = city_co.id + and country_co.continent = 'Europe') + +select * from +(select * from alleuropeanlanguages where isofficial='True') e1, +(select * from alleuropeanlanguages where percentage > 50) e2 +where e1.code = e2.code order by e2.COUNTRY_CO,e1.language; + + +-- query8 + +with allcountry_costats as +( select country_co.code,country_co.name,count(distinct city_co.id) CITY_CO_CNT, + count(distinct countrylanguage_co.language) LANG_CNT + from country_co,city_co,countrylanguage_co + where country_co.code = city_co.countrycode + and country_co.code = countrylanguage_co.countrycode + group by country_co.code,country_co.name +) + +select sum(FOO.CITY_CO_CNT) REGION_CITY_CO_CNT,sum(FOO.LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountry_costats.code,allcountry_costats.name COUNTRY_CO,CITY_CO_CNT,LANG_CNT,country_co.region,city_co.name CAPITAL +from allcountry_costats,country_co,city_co +where allcountry_costats.code = country_co.code +and country_co.capital = city_co.id +and CITY_CO_CNT/LANG_CNT > 1 +and country_co.continent = 'Asia' + +UNION ALL + +select allcountry_costats.code,allcountry_costats.name COUNTRY_CO,CITY_CO_CNT,LANG_CNT,country_co.region,city_co.name CAPITAL +from allcountry_costats,country_co,city_co +where allcountry_costats.code = country_co.code +and country_co.capital = city_co.id +and CITY_CO_CNT/LANG_CNT > 1 +and country_co.continent = 'North America' + +UNION ALL + +select allcountry_costats.code,allcountry_costats.name COUNTRY_CO,CITY_CO_CNT,LANG_CNT,country_co.region,city_co.name CAPITAL +from allcountry_costats,country_co,city_co +where allcountry_costats.code = country_co.code +and country_co.capital = city_co.id +and CITY_CO_CNT/LANG_CNT > (select max(CITY_CO_CNT/LANG_CNT) from allcountry_costats,country_co where allcountry_costats.code = country_co.code AND country_co.continent='Europe') +) FOO +,allcountry_costats,country_co + +WHERE allcountry_costats.code = country_co.code +and FOO.region = country_co.region +group by FOO.region order by FOO.region; + +-- some queries with hash joins and index scans +set enable_nestloop=off; +set enable_hashjoin=on; +set enable_mergejoin=off; + + +--query 9 +with diversecountries as +(select country_co.code,country_co.name,country_co.capital,d.CNT + from country_co, + (select countrylanguage_co.countrycode,count(*) as CNT from countrylanguage_co group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country_co.code and country_co.gnp > 100000) + +select d1.code,d1.name,d1.capital,city_co.name CAPITAL_CITY_CO,d1.CNT,d2.CNT +from +diversecountries d1 left join country_co +ON (d1.code = country_co.code AND d1.CNT < 8) +left join diversecountries d2 +ON (country_co.code = d2.code AND d2.CNT > 8) +INNER JOIN city_co +ON(d1.capital = city_co.id) +ORDER BY d1.name; + +--query 10 , multiple ctes, joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country_co + group by region + ) FOO,countrylanguage_co,country_co +where + country_co.code = countrylanguage_co.countrycode + and FOO.region = country_co.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country_co + group by region + ) FOO,countrylanguage_co,country_co +where + country_co.code = countrylanguage_co.countrycode + and FOO.region = country_co.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountry_costats as +( select country_co.code,country_co.name,count(distinct city_co.id) CITY_CO_CNT, + count(distinct countrylanguage_co.language) LANG_CNT + from country_co,city_co,countrylanguage_co + where country_co.code = city_co.countrycode + and country_co.code = countrylanguage_co.countrycode + group by country_co.code,country_co.name +) + +select allcountry_costats.CITY_CO_CNT,allcountry_costats.LANG_CNT,allcountry_costats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_costats,country_co +where longlivingregions.region = denseregions.region and allcountry_costats.code = country_co.code and country_co.region = longlivingregions.region +and country_co.indepyear between 1800 and 1850 + +UNION ALL + +select allcountry_costats.CITY_CO_CNT,allcountry_costats.LANG_CNT,allcountry_costats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_costats,country_co +where longlivingregions.region = denseregions.region and allcountry_costats.code = country_co.code and country_co.region = longlivingregions.region +and country_co.indepyear between 1850 and 1900 + +UNION ALL + +select allcountry_costats.CITY_CO_CNT,allcountry_costats.LANG_CNT,allcountry_costats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountry_costats,country_co +where longlivingregions.region = denseregions.region and allcountry_costats.code = country_co.code and country_co.region = longlivingregions.region +and country_co.indepyear > 1900 +order by name +LIMIT 50; + +--query 11 +with allcity_costats as +( select city_co.name CITY_CO,city_co.id,country_co.name COUNTRY_CO,city_co.district,city_co.population as CITY_CO_POP + from + city_co,country_co + where city_co.countrycode = country_co.code +), +alldistrictstats as +( select allcity_costats.district,allcity_costats.COUNTRY_CO,sum(CITY_CO_POP) DISTRICT_POP, + count(CITY_CO) as D_CITY_CO_CNT + from allcity_costats + group by allcity_costats.district,allcity_costats.COUNTRY_CO + order by district,COUNTRY_CO +), +allcountry_costats as +( select alldistrictstats.COUNTRY_CO,country_co.code,sum(D_CITY_CO_CNT) C_CITY_CO_CNT, + count(distinct countrylanguage_co.language) C_LANG_CNT + from alldistrictstats,country_co,countrylanguage_co + where alldistrictstats.COUNTRY_CO = country_co.name + and country_co.code = countrylanguage_co.countrycode + group by COUNTRY_CO,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CO_CNT) REGION_CITY_CO_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountry_costats.code,allcountry_costats.COUNTRY_CO,C_CITY_CO_CNT,C_LANG_CNT,country_co.region,city_co.name CAPITAL +from allcountry_costats,country_co,city_co +where allcountry_costats.code = country_co.code +and country_co.capital = city_co.id +and C_CITY_CO_CNT/C_LANG_CNT > 1 +and country_co.continent = 'Asia') FOO +,allcountry_costats,country_co + +WHERE allcountry_costats.code = country_co.code +and FOO.region = country_co.region +group by FOO.region order by FOO.region +) + +select * from +( +select REGION_CITY_CO_CNT as CITY_CO_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CO_CNT) CITY_CO_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountry_costats.code,allcountry_costats.COUNTRY_CO,C_CITY_CO_CNT,C_LANG_CNT,country_co.region,allcity_costats.CITY_CO CAPITAL +from allcountry_costats,country_co,allcity_costats +where allcountry_costats.code = country_co.code +and country_co.capital = allcity_costats.id +and C_CITY_CO_CNT/C_LANG_CNT > 1 +and country_co.continent = 'Europe') FOO +,allcountry_costats,country_co + +WHERE allcountry_costats.code = country_co.code +and FOO.region = country_co.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; + +-- Queries using multiple CTEs + +-- query1 - all CTEs being used once in the main query +with capitals as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital), +lang_total as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code), +alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000) + +select capitals.name CAPITAL,lang_total.lang_count COUNTRY_LANG_COUNT,capitals.code,country.name +from capitals,lang_total,country +where capitals.code = lang_total.countrycode +and capitals.code = country.code +and country.code NOT IN (select diversecountries.code from diversecountries,alleuropeanlanguages + where diversecountries.code = alleuropeanlanguages.code) +order by capitals.code; + +-- query 2 multiple CTEs being used multiple times through joins +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +order by name +LIMIT 50; + + + + +-- Queries with multiple CTEs referencing one another + +-- query1 +with city_official_language as +(select city.id,city.name CITY,country.name COUNTRY,countrylanguage.language,city.population,country.capital + from city,countrylanguage,country + where city.countrycode = country.code + and country.code = countrylanguage.countrycode + and countrylanguage.isofficial = 'True' +), +capital_official_language as +(select c2.CITY, c1.COUNTRY,c1.language OFFICIAL_LANGUAGE,c1.CITY CAPITAL + from city_official_language c1 , city_official_language c2 + where c1.id = c2.capital + and c1.id != c2.id +), +alleuropeanlanguages as +(select c.COUNTRY,c.CITY,c.CAPITAL,c.OFFICIAL_LANGUAGE + from capital_official_language c, country + where c.COUNTRY = country.name + and country.continent = 'Europe' +) + +select code,COUNTRY,CITY,alleuropeanlanguages.CAPITAL,OFFICIAL_LANGUAGE from alleuropeanlanguages,country +where alleuropeanlanguages.COUNTRY = country.name +and alleuropeanlanguages.city in (select CITY from city_official_language) +and alleuropeanlanguages.OFFICIAL_LANGUAGE IN (select OFFICIAL_LANGUAGE from capital_official_language) +order by code,country,city,official_language +limit 100; + +--query2 +with allcitystats as +( select city.name CITY,city.id,country.name COUNTRY,city.district,city.population as CITY_POP + from + city,country + where city.countrycode = country.code +), +alldistrictstats as +( select allcitystats.district,allcitystats.COUNTRY,sum(CITY_POP) DISTRICT_POP, + count(CITY) as D_CITY_CNT + from allcitystats + group by allcitystats.district,allcitystats.COUNTRY + order by district,COUNTRY +), +allcountrystats as +( select alldistrictstats.COUNTRY,country.code,sum(D_CITY_CNT) C_CITY_CNT, + count(distinct countrylanguage.language) C_LANG_CNT + from alldistrictstats,country,countrylanguage + where alldistrictstats.COUNTRY = country.name + and country.code = countrylanguage.countrycode + group by COUNTRY,code +), +asian_region_stats as +( +select sum(FOO.C_CITY_CNT) REGION_CITY_CNT,sum(FOO.C_LANG_CNT) REGION_LANG_CNT,FOO.region +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,city.name CAPITAL +from allcountrystats,country,city +where allcountrystats.code = country.code +and country.capital = city.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Asia') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) + +select * from +( +select REGION_CITY_CNT as CITY_CNT,REGION_LANG_CNT as LANG_CNT, region as IDENTIFIER from asian_region_stats +UNION ALL +( +select sum(FOO.C_CITY_CNT) CITY_CNT,sum(FOO.C_LANG_CNT) LANG_CNT,FOO.region as IDENTIFIER +FROM +( +select allcountrystats.code,allcountrystats.COUNTRY,C_CITY_CNT,C_LANG_CNT,country.region,allcitystats.CITY CAPITAL +from allcountrystats,country,allcitystats +where allcountrystats.code = country.code +and country.capital = allcitystats.id +and C_CITY_CNT/C_LANG_CNT > 1 +and country.continent = 'Europe') FOO +,allcountrystats,country + +WHERE allcountrystats.code = country.code +and FOO.region = country.region +group by FOO.region order by FOO.region +) +) FOO1 +order by FOO1.lang_cnt,FOO1.identifier; +-- queries using column lists for CTEs + +-- query 1 use column list despite having no duplicate names +with capitals("C","ID","CAP") as +(select country.code,id,city.name from city,country + where city.countrycode = country.code AND city.id = country.capital), + +lang_total(LC,CC,CLC) as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) + +select country.name,"C","ID","CAP",lang_total.lc +from capitals,lang_total,country +where capitals."C" = country.code +and country.code = lang_total.cc; + + +-- query 2 Check case sensitivity for quoted names in column list. This should error out +with "lang_total"("LC",CC,CLC) as +( select count(*) as lang_count,country.code,countrylanguage.countrycode + from country join countrylanguage on (country.code=countrylanguage.countrycode and governmentform='Federal Republic') + group by country.code,countrylanguage.countrycode order by country.code) +select LC from lang_total; + +-- query 3 use column list when there are duplicate names within the CTE +with capitals("CO_C","C_ID","CAPITAL",country) as +(select country.code,id,city.name,country.name from city,country + where city.countrycode = country.code AND city.id = country.capital) + +select "CO_C","C_ID","CAPITAL",COUNTRY from capitals where "CO_C"='SMR'; + + +-- query4 use column list within another CTE +with capitals("CO_C","C_ID","CAPITAL",country) as +(select country.code,id,city.name,country.name from city,country + where city.countrycode = country.code AND city.id = country.capital), +south_asian_capitals(A_CO_C,"C_ID",A_C_NAME,A_CO_NAME) as +(select "CO_C","C_ID","CAPITAL",country from capitals,country where capitals."CO_C"=country.code and country.region = 'Southern and Central Asia') +select "a_co_c","C_ID",A_c_NaMe,"a_co_name" from south_asian_capitals order by A_CO_C;-- queries using CTEs in initplans and main plan + +--query1 using CTE in the select list(initplan) . One CTE using another CTE in it's initplan +with gnpstats as +( +select REG_GNP/REG_OLD_GNP as GNP_INDEX,region from +(select sum(gnpold) as REG_OLD_GNP, + sum(gnp) as REG_GNP,region + from country + group by region) FOO +where (case when (REG_GNP/REG_OLD_GNP) > 0 then 1.2 * (REG_GNP/REG_OLD_GNP) else null end) between 0.5 and 1.5 +order by region +), +gnp_index_compare as +( +select (select max(GNP_INDEX) from gnpstats) M_GNP_IDX,(gnp/gnpold) as GNP_IDX,country.name from +country where country.continent = 'Asia' +) +select (select min(GNP_IDX) from gnp_index_compare) MIN_COUNTRY_GNP_IDX, (select max(GNP_INDEX) from gnpstats) MAX_REG_GNP_IDX,city.name CAPITAL,country.name COUNTRY + from city,country where city.id = country.capital and country.continent='Europe'; + + +--query2 using the CTE in the where clause(initplan) of the main query. One CTE using another CTE in it's where clause as it's initplan +with diversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) > 6) d + where d.countrycode = country.code and country.gnp > 100000), + +notdiversecountries as +(select country.code,country.name,country.capital,d.CNT + from country, + (select countrylanguage.countrycode,count(*) as CNT from countrylanguage group by countrycode + HAVING count(*) < 3) d + where d.countrycode = country.code and country.gnp > 100000 + and d.CNT < (select max(CNT) from diversecountries)) +select LANG_CNT,name from +( +select count(*) LANG_CNT,country.name,country.code from country,countrylanguage +where country.code = countrylanguage.countrycode and country.continent = 'North America' +group by country.name,country.code +) FOO +where FOO.LANG_CNT between (select min(CNT) from notdiversecountries) AND (select max(CNT) from diversecountries); + + + +--query3 using CTE more than once in the same initplan and also more than once in the main query +with alleuropeanlanguages as +(select country.code,country.name COUNTRY, city.name CAPITAL, language, isofficial, percentage + FROM country,city,countrylanguage + WHERE country.code = countrylanguage.countrycode + and country.capital = city.id + and country.continent = 'Europe'), +all_official_languages as +( + select country.code,country.name,alleuropeanlanguages.language,alleuropeanlanguages.percentage + from + country,alleuropeanlanguages + where country.code = alleuropeanlanguages.code and isofficial = 'True' + and country.governmentform NOT IN (select 'Commonwealth of the US' UNION ALL select 'Monarchy (Sultanate)' UNION ALL select 'Monarchy') + and country.gnp > (select min(gnpold) from country where country.region = 'Western Europe') +) + +SELECT avg(percentage),language +FROM +( +select country.name,city.name,percentage,language +from country,city,all_official_languages +where country.code = all_official_languages.code and country.capital = city.id and country.continent = 'Europe' + +UNION ALL + +select country.name,city.name,percentage,language +from country,city,all_official_languages +where country.code = all_official_languages.code and country.capital = city.id and country.continent = 'Asia' +) FOO +group by FOO.language +HAVING avg(percentage) >= +(select avg(percentage) from +( select percentage from all_official_languages,country where country.code = all_official_languages.code and country.region = 'British Islands' + UNION + select percentage from all_official_languages,country where country.code = all_official_languages.code and country.region = 'Western Europe' +) FOO ) +order by FOO.language; + + + + +-- queries using deeply nested CTEs + +-- query1 using a CTE at every subquery level +select avg(population),CITY +from +( +with size0_cities(CITY,POPULATION) as (select city.name,city.population from city where city.population >= 100) + +select CITY,POPULATION from +( + with size1_cities(CITY,POPULATION) as ( select city,population from size0_cities where population >= 1000 ) + select CITY,POPULATION from + ( + with size2_cities(CITY,POPULATION) as (select city,population from size1_cities where population >= 10000) + select CITY,POPULATION from + ( + with size3_cities as (select city,population from size2_cities where population >= 20000) + select CITY,POPULATION from + ( + with size4_cities as (select city,population from size3_cities where population >= 50000) + select CITY,POPULATION from + ( + with size5_cities as (select city,population from size4_cities where population >= 80000) + select CITY,POPULATION from + ( + with size6_cities as (select city,population from size5_cities where population >= 150000) + select CITY,POPULATION from + ( + with size7_cities as (select city,population from size6_cities where population >= 200000) + select CITY,POPULATION from + ( + with size8_cities as (select city,population from size7_cities where population >= 250000) + select CITY,POPULATION from + ( + with size9_cities as (select city,population from size8_cities where population >= 300000) + select city,population from + ( + with size10_cities as (select city,population from size9_cities where population >= 6500000) + select CITY,POPULATION from + ( + with size11_cities as (select city,population from size10_cities where population >= 7000000) + select s1.city,s1.population from size11_cities s1,size10_cities s2 + ) FOO11 + ) FOO10 + ) FOO9 + ) FOO8 + ) FOO7 + ) FOO6 + ) FOO5 + ) FOO4 + )FOO3 + ) FOO2 +) FOO1 order by city +) FOO0 group by city order by city; + +--query 2 deeply nested CTEs with shared scans in the plan +select avg(population),CITY +from +( +with size0_cities(CITY,POPULATION) as (select city.name,city.population from city where city.population >= 100) + +select CITY,POPULATION from +( + with size1_cities(CITY,POPULATION) as ( select city,population from size0_cities where population >= 1000 ) + select CITY,POPULATION from + ( + with size2_cities(CITY,POPULATION) as (select city,population from size1_cities where population >= 10000) + select CITY,POPULATION from + ( + with size3_cities as (select city,population from size2_cities where population >= 20000) + select CITY,POPULATION from + ( + with size4_cities as (select city,population from size3_cities where population >= 50000) + select CITY,POPULATION from + ( + with size5_cities as (select city,population from size4_cities where population >= 80000) + select CITY,POPULATION from + ( + with size6_cities as (select city,population from size5_cities where population >= 150000) + select CITY,POPULATION from + ( + with size7_cities as (select city,population from size6_cities where population >= 200000) + select CITY,POPULATION from + ( + with size8_cities as (select city,population from size7_cities where population >= 250000) + select CITY,POPULATION from + ( + with size9_cities as (select city,population from size8_cities where population >= 300000) + select city,population from + ( + with size10_cities as (select city,population from size9_cities where population >= 6500000) + select CITY,POPULATION from + ( + with size11_cities as (select city,population from size10_cities where population >= 7000000) + select s1.city,s1.population from size11_cities s1,size10_cities s2 + ) FOO11 + ) FOO10 + ) FOO9 + ) FOO8 + ) FOO7 + ) FOO6 + ) FOO5 + ) FOO4 + )FOO3 + ) FOO2 +) FOO1 order by city +) FOO0 group by city order by city; + +-- query 3 deeply nested CTEs using every CTE defined +select avg(population) avg_p,CITY +from +( +with size0_cities(CITY,POPULATION) as (select city.name,city.population from city where city.population >= 350000) + +select CITY,POPULATION from +( + with size1_cities(CITY,POPULATION) as ( select city,population from size0_cities where population >= 360000 ) + select CITY,POPULATION from + ( + with size2_cities(CITY,POPULATION) as (select city,population from size1_cities where population >= 370000) + select CITY,POPULATION from + ( + with size3_cities as (select city,population from size2_cities where population >= 380000) + select CITY,POPULATION from + ( + with size4_cities as (select city,population from size3_cities where population >= 390000) + select CITY,POPULATION from + ( + with size5_cities as (select city,population from size4_cities where population >= 400000) + select CITY,POPULATION from + ( + with size6_cities as (select city,population from size5_cities where population >= 410000) + select CITY,POPULATION from + ( + with size7_cities as (select city,population from size6_cities where population >= 420000) + select CITY,POPULATION from + ( + with size8_cities as (select city,population from size7_cities where population >= 430000) + select CITY,POPULATION from + ( + with size9_cities as (select city,population from size8_cities where population >= 440000) + select city,population from + ( + with size10_cities as (select city,population from size9_cities where population >= 6500000) + select CITY,POPULATION from + ( + with size11_cities as (select city,population from size10_cities where population >= 7000000) + select s1.city,s1.population from size11_cities s1,size1_cities s2 + UNION + select s1.city,s1.population from size10_cities s1,size2_cities s2 + UNION + select s1.city,s1.population from size9_cities s1,size3_cities s2 + UNION + select s1.city,s1.population from size8_cities s1,size4_cities s2 + UNION + select s1.city,s1.population from size7_cities s1,size5_cities s2 + UNION + select s1.city,s1.population from size6_cities s1,size6_cities s2 + ) FOO11 + ) FOO10 + ) FOO9 + ) FOO8 + ) FOO7 + ) FOO6 + ) FOO5 + ) FOO4 + )FOO3 + ) FOO2 +) FOO1 order by city +) FOO0 group by city order by avg_p,city +LIMIT 20; + +-- sanity tests with queries using CTEs in insert,update,delete and create + +-- query 1 CTAS using CTE +create table bad_headofstates as +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select OUTERMOST_FOO.*,bad_headofstates.headofstate from ( +select avg(population),region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +order by OUTERMOST_FOO.region,bad_headofstates.headofstate LIMIT 40 +); + +select * from bad_headofstates order by region,headofstate; + +--query 2 insert using CTE +insert into bad_headofstates +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) +select OUTERMOST_FOO.*,bad_headofstates.headofstate from ( +select avg(population),region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +order by OUTERMOST_FOO.region,bad_headofstates.headofstate LIMIT 40 +); + +select * from bad_headofstates order by region,headofstate; + +--query3 update using CTE +update bad_headofstates set region = cm.region FROM +( + +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) + +select avg(OUTERMOST_FOO.AVG),OUTERMOST_FOO.region from ( +select avg(population) AVG,region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +and OUTERMOST_FOO.region = 'Central America' +group by OUTERMOST_FOO.region +order by OUTERMOST_FOO.region +) cm +where bad_headofstates.region = 'Caribbean'; + +select * from bad_headofstates order by avg,region,headofstate; + +--query4 delete using CTE +delete from bad_headofstates USING +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) + +select avg(OUTERMOST_FOO.AVG),OUTERMOST_FOO.region from ( +select avg(population) AVG,region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +and OUTERMOST_FOO.region = 'Central America' +group by OUTERMOST_FOO.region +order by OUTERMOST_FOO.region +) as cm +where bad_headofstates.region = cm.region; + +select * from bad_headofstates order by region,headofstate; + +-- delete using CTE in its subplan +delete from bad_headofstates where bad_headofstates.avg NOT IN +( +with bad_headofstates as +( + select country.code,country.name,country.headofstate,countrylanguage.language + from + country,countrylanguage + where country.code = countrylanguage.countrycode and countrylanguage.isofficial=true + and (country.gnp < country.gnpold or country.gnp < 3000) +) + +select OUTERMOST_FOO.AVG from ( +select avg(population) AVG,region from +( +select FOO.*,bad_headofstates.headofstate,city.name +from +(select bad_headofstates.code,country.capital,country.region,country.population from +bad_headofstates,country where bad_headofstates.code = country.code) FOO, bad_headofstates,city +where FOO.code = bad_headofstates.code and FOO.capital = city.id) OUTER_FOO +group by region ) OUTERMOST_FOO,bad_headofstates,country +where country.code = bad_headofstates.code and country.region = OUTERMOST_FOO.region +and OUTERMOST_FOO.region = 'Australia and New Zealand' or OUTERMOST_FOO.region = 'Eastern Asia' +order by OUTERMOST_FOO.region +); + +select * from bad_headofstates order by region,headofstate; + +drop table bad_headofstates; +-- queries with views using CTEs + +-- view1 with multiple CTEs being used multiple times + +create view view_with_shared_scans as +( +with longlivingregions as +( +select FOO.*,count(distinct language) as "lang_count" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + avg(lifeexpectancy) as "REGION_LIFETIME",region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP",foo."REGION_LIFETIME"), + +denseregions as +( +select FOO.*,count(distinct language) as "lang_count", + sum(surfacearea) as "REGION_SURFACE_AREA" +from( + select + sum(population) as "REGION_POP", + sum(gnp) as "REGION_GNP", + region + from + country + group by region + ) FOO,countrylanguage,country +where + country.code = countrylanguage.countrycode + and FOO.region = country.region + and FOO."REGION_POP" != 0 +group by +FOO.region,foo."REGION_POP",foo."REGION_GNP" +order by sum(surfacearea)/foo."REGION_POP" desc), + +allcountrystats as +( select country.code,country.name,count(distinct city.id) CITY_CNT, + count(distinct countrylanguage.language) LANG_CNT + from country,city,countrylanguage + where country.code = city.countrycode + and country.code = countrylanguage.countrycode + group by country.code,country.name +) + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1800 and 1850 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear between 1850 and 1900 + +UNION ALL + +select allcountrystats.CITY_CNT,allcountrystats.LANG_CNT,allcountrystats.name, + "REGION_SURFACE_AREA","REGION_LIFETIME",longlivingregions."REGION_POP",longlivingregions.lang_count,longlivingregions."REGION_GNP",longlivingregions.region +from longlivingregions,denseregions,allcountrystats,country +where longlivingregions.region = denseregions.region and allcountrystats.code = country.code and country.region = longlivingregions.region +and country.indepyear > 1900 +); + +\d+ view_with_shared_scans; + +select city_cnt,lang_cnt,name,region from view_with_shared_scans order by name LIMIT 50; + +select city_cnt,lang_cnt,name,"REGION_POP","REGION_GNP",region from view_with_shared_scans where region = 'Eastern Europe'; + +drop view view_with_shared_scans; + +-- start_ignore +drop table if exists tbl87; +-- end_ignore + +create table tbl87(code char(3), n numeric); +insert into tbl87 values ('abc',1); +insert into tbl87 values ('xyz',2); +insert into tbl87 values ('def',3); + +with cte as + ( + select code, n, x + from tbl87 + , (select 100 as x) d + ) +select code from tbl87 t where 1= (select count(*) from cte where cte.code::text=t.code::text or cte.code::text = t.code::text); + + +with cte as + ( + select count(*) from + ( + select code, n, x + from tbl87 + , (select 100 as x) d + ) FOO + ) +select code from tbl87 t where 1= (select * from cte); + +with cte as + ( + select count(*) from + ( + select code, n, x + from tbl87 + , (select 100 as x) d + ) FOO + ) +select code from tbl87 t where 1= (select count(*) from cte); +--start_ignore +drop table if exists foo; +drop table if exists bar; +drop table if exists emp; +drop table if exists manager; +--end_ignore +------------------------------------------------------------------------------------------------------------------------------- +CREATE TABLE foo (key INTEGER, value INTEGER); +INSERT INTO foo SELECT i, i % 10 from generate_series(1, 100) i; + +CREATE TABLE bar(bar_key INTEGER, bar_value INTEGER); +INSERT INTO bar SELECT i, i % 5 FROM generate_series(1, 1000) i; + +SET enable_hashjoin = OFF; +SET enable_mergejoin = OFF; +SET enable_nestloop = ON; + +------------------- +-- QUERY 1 +------------------- + +-- Query has WITH clause +-- WITH clause subquery used once +-- The subquery in the WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is disabled + + +SET gp_cte_sharing = OFF; + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key) +-- SELECT o.key, bar_value FROM o, bar +-- WHERE +-- o.key != bar_value +-- ORDER BY 1, 2 LIMIT 20; + +WITH o AS (SELECT * FROM foo AS o_key) + SELECT o.key, bar_value FROM o, bar +WHERE +o.key != bar_value +ORDER BY 1, 2 LIMIT 20; + +-- Query has WITH clause +-- WITH clause subquery used once +-- The subquery in the WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is disabled + +SET gp_cte_sharing = ON; + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key) +-- SELECT o.key, bar_value FROM o, bar +-- WHERE +-- o.key != bar_value +-- ORDER BY 1, 2 LIMIT 20; + +WITH o AS (SELECT * FROM foo AS o_key) + SELECT o.key, bar_value FROM o, bar +WHERE +o.key != bar_value +ORDER BY 1, 2 LIMIT 20; + +------------------- +-- Query 2, Query 3 +------------------- + +-- Query has WITH clause +-- WITH clause subquery used multiple times +-- The subquery in the WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is disabled + +SET gp_cte_sharing = OFF; + +-- EXPLAIN +-- WITH o as (SELECT * FROM foo AS o_key) +-- SELECT o1.key, o2.value FROM o o1, o o2 +-- WHERE o1.key != o2.value ORDER BY 1, 2 DESC LIMIT 100; + +WITH o as (SELECT * FROM foo AS o_key) + SELECT o1.key, o2.value FROM o o1, o o2 + WHERE o1.key != o2.value ORDER BY 1, 2 DESC LIMIT 100; + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo), +-- n AS (SELECT * FROM foo) +-- SELECT o.key , n.value +-- FROM +-- o JOIN n ON o.key = n.key +-- WHERE +-- o.key != n.value +-- ORDER BY 1, 2; + +WITH o AS (SELECT * FROM foo), + n AS (SELECT * FROM foo) +SELECT o.key , n.value +FROM +o JOIN n ON o.key = n.key +WHERE +o.key != n.value +ORDER BY 1, 2; + +-- Query has WITH clause +-- Subquery using WITH clause multiple times +-- The subquery in the WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is enabled + +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH o AS (SELECT * FROM foo AS o_key) +-- SELECT o1.key, o2.value FROM o o1, o o2 +-- WHERE o1.key != o2.value ORDER BY 1, 2 DESC LIMIT 100; +WITH o AS (SELECT * FROM foo AS o_key) + SELECT o1.key, o2.value FROM o o1, o o2 + WHERE o1.key != o2.value ORDER BY 1, 2 DESC LIMIT 100; + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo), +-- n AS (SELECT * FROM foo) +-- SELECT o.key , n.value +-- FROM +-- o JOIN n ON o.key = n.key +-- WHERE +-- o.key != n.value +-- ORDER BY 1, 2; + +WITH o AS (SELECT * FROM foo), + n AS (SELECT * FROM foo) +SELECT o.key , n.value +FROM +o JOIN n ON o.key = n.key +WHERE +o.key != n.value +ORDER BY 1, 2; + +------------------- +-- Query 4, Query 5 +------------------- + +-- Query has WITH clause +-- Subquery with nested WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is disabled + +SET gp_cte_sharing = OFF; + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o WHERE o.key < 50) +-- SELECT m.key, bar_value FROM m, bar +-- WHERE +-- m.key != bar_value +-- ORDER BY 1, 2 LIMIT 20; + +WITH o AS (SELECT * FROM foo AS o_key), +m AS (SELECT * FROM o WHERE o.key < 50) + SELECT m.key, bar_value FROM m, bar +WHERE +m.key != bar_value +ORDER BY 1, 2 LIMIT 20; + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o WHERE o.key < 50) +-- SELECT m1.key, m2.value FROM m m1, m m2 +-- WHERE m1.key != m2.value +-- ORDER BY 1, 2 DESC LIMIT 100; + +WITH o AS (SELECT * FROM foo AS o_key), +m AS (SELECT * FROM o WHERE o.key < 50) + SELECT m1.key, m2.value FROM m m1, m m2 + WHERE m1.key != m2.value + ORDER BY 1, 2 DESC LIMIT 100; + +-- Query has WITH clause +-- Subquery with nested WITH clause appears under a NLJ in the query plan +-- The sharing of CTE is enabled + +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH o AS (SELECT * FROM foo AS o_key), +--m AS (SELECT * FROM o WHERE o.key < 50) +-- SELECT m.key, bar_value FROM m, bar +--WHERE +--m.key != bar_value +--ORDER BY 1, 2 LIMIT 20; +WITH o AS (SELECT * FROM foo AS o_key), +m AS (SELECT * FROM o WHERE o.key < 50) + SELECT m.key, bar_value FROM m, bar +WHERE +m.key != bar_value +ORDER BY 1, 2 LIMIT 20; + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * from o WHERE o.key < 50) +-- SELECT m1.key, m2.value FROM m m1, m m2 +-- WHERE m1.key != m2.value +-- ORDER BY 1, 2 DESC LIMIT 100; + +WITH o AS (SELECT * FROM foo AS o_key), +m AS (SELECT * from o WHERE o.key < 50) + SELECT m1.key, m2.value FROM m m1, m m2 + WHERE m1.key != m2.value + ORDER BY 1, 2 DESC LIMIT 100; + +------------------- +-- Query 6, Query 7 +------------------- + +-- Query has WITH clause +-- Subquery with nested WITH clause appears under a NLJ in the query plan +-- Nested WITH clause uses NLJ in query plan +-- The sharing of CTE is disabled + +SET gp_cte_sharing = OFF; + +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o join bar ON o.key < bar_value) +-- SELECT m.value, m.bar_key, bar.bar_value +-- FROM m, bar +-- WHERE m.bar_key = bar.bar_value +-- ORDER BY 2, 1 DESC LIMIT 100; +-- +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o join bar ON o.key < bar_value) +-- SELECT m1.key, m2.value FROM m m1, m m2 +-- WHERE m1.key != m2.value +-- ORDER BY 1, 2 DESC LIMIT 100; + +-- Query has WITH clause +-- Subquery with nested WITH clause appears under a NLJ in the query plan +-- Nested WITH clause involves join in query plan +-- The sharing of CTE is enabled + +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH o AS (SELECT * FROM foo AS o_key), +--m AS (SELECT * FROM o join bar ON o.key < bar_value) +-- SELECT m.value, m.bar_key, bar.bar_value +-- FROM m, bar +-- WHERE m.bar_key = bar.bar_value +-- ORDER BY 2, 1 DESC LIMIT 100; +-- EXPLAIN +-- WITH o AS (SELECT * FROM foo AS o_key), +-- m AS (SELECT * FROM o join bar ON o.key < bar_value) +-- SELECT m1.key, m2.value FROM m m1, m m2 +-- WHERE m1.key != m2.value +-- ORDER BY 1, 2 DESC LIMIT 100; + +------------------------------------------------------------------------------------------------------------------------------- + +CREATE TABLE emp (ename CHARACTER VARYING(50), empno INTEGER, mgr INTEGER, deptno INTEGER); +INSERT INTO emp SELECT i || 'NAME', i, i%6, i%16 FROM generate_series(1, 100) i; + +CREATE TABLE manager (dept_mgr_no INTEGER); +INSERT INTO manager SELECT i FROM generate_series(1, 100) i; + +SET enable_hashjoin = OFF; +SET enable_mergejoin = OFF; +SET enable_nestloop = ON; + +------------------- +-- Query 8 +------------------- + +-- The sharing of CTE is disabled + +SET gp_cte_sharing = OFF; + +-- EXPLAIN +-- WITH dept_count AS +-- (SELECT deptno, COUNT(*) AS dept_count FROM emp +-- GROUP BY deptno) SELECT e.ename AS employee_name, +-- dc.dept_count AS emp_dept_count +-- FROM emp e, dept_count dc +-- WHERE e.deptno = dc.deptno +-- ORDER BY 1, 2 DESC LIMIT 20; + +WITH dept_count AS + (SELECT deptno, COUNT(*) AS dept_count FROM emp + GROUP BY deptno) SELECT e.ename AS employee_name, + dc.dept_count AS emp_dept_count +FROM emp e, dept_count dc +WHERE e.deptno = dc.deptno +ORDER BY 1, 2 DESC LIMIT 20; + +-- The sharing of CTE is enabled + +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH dept_count AS +-- (SELECT deptno, COUNT(*) AS dept_count FROM emp +-- GROUP BY deptno) SELECT e.ename AS employee_name, +-- dc.dept_count AS emp_dept_count +--FROM emp e, dept_count dc +--WHERE e.deptno = dc.deptno +--ORDER BY 1, 2 DESC LIMIT 20; +WITH dept_count AS + (SELECT deptno, COUNT(*) AS dept_count FROM emp + GROUP BY deptno) SELECT e.ename AS employee_name, + dc.dept_count AS emp_dept_count +FROM emp e, dept_count dc +WHERE e.deptno = dc.deptno +ORDER BY 1, 2 DESC LIMIT 20; + +------------------- +-- Query 9 +------------------- + +-- The sharing of CTE is disabled + +SET gp_cte_sharing = OFF; +--EXPLAIN +--WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno) +--SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name, +-- dc2.dept_count AS mgr_dept_count +--FROM emp e, +-- dept_count dc1, +-- emp m, +-- dept_count dc2 +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno AND +-- m.deptno = dc2.deptno +--ORDER BY 1, 2, 3, 4 DESC LIMIT 25; +WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno) +SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name, + dc2.dept_count AS mgr_dept_count +FROM emp e, + dept_count dc1, + emp m, + dept_count dc2 +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno AND + m.deptno = dc2.deptno +ORDER BY 1, 2, 3, 4 DESC LIMIT 25; + +-- The sharing of CTE is enabled + +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno) +--SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name, +-- dc2.dept_count AS mgr_dept_count +--FROM emp e, +-- dept_count dc1, +-- emp m, +-- dept_count dc2 +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno AND +-- m.deptno = dc2.deptno +--ORDER BY 1, 2, 3, 4 DESC LIMIT 25; +WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno) +SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name, + dc2.dept_count AS mgr_dept_count +FROM emp e, + dept_count dc1, + emp m, + dept_count dc2 +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno AND + m.deptno = dc2.deptno +ORDER BY 1, 2, 3, 4 DESC LIMIT 25; + +------------------- +-- Query 10 +------------------- + +-- The sharing of CTE is disabled + +SET gp_cte_sharing = OFF; +--EXPLAIN +--WITH dept_count AS +-- (SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno) SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name +--FROM emp e, +-- dept_count dc1, emp m +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno +--ORDER BY 1, 2, 3 ASC LIMIT 20; +WITH dept_count AS + (SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno) SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name +FROM emp e, + dept_count dc1, emp m +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno +ORDER BY 1, 2, 3 ASC LIMIT 20; + +-- The sharing of CTE is enabled + +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH dept_count AS +-- (SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno) SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name +--FROM emp e, +-- dept_count dc1, emp m +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno +--ORDER BY 1, 2, 3 ASC LIMIT 20; +WITH dept_count AS + (SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno) SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name +FROM emp e, + dept_count dc1, emp m +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno +ORDER BY 1, 2, 3 ASC LIMIT 20; + +------------------- +-- Query 11 +------------------- + +-- The sharing of CTE is disabled + +SET gp_cte_sharing = OFF; +--EXPLAIN +--WITH dept_count AS (SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno), +--mgr_count AS (SELECT dept_mgr_no, COUNT(*) AS mgr_count +-- FROM manager +-- GROUP BY dept_mgr_no) + +--SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name, +-- dmc1.mgr_count AS mgr_dept_count +--FROM emp e, +-- dept_count dc1, emp m, +-- mgr_count dmc1 +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno AND +-- m.deptno = dmc1.dept_mgr_no +--ORDER BY 1, 2, 3, 4 DESC LIMIT 25; +WITH dept_count AS (SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno), +mgr_count AS (SELECT dept_mgr_no, COUNT(*) AS mgr_count + FROM manager + GROUP BY dept_mgr_no) + +SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name, + dmc1.mgr_count AS mgr_dept_count +FROM emp e, + dept_count dc1, emp m, + mgr_count dmc1 +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno AND + m.deptno = dmc1.dept_mgr_no +ORDER BY 1, 2, 3, 4 DESC LIMIT 25; + +-- The sharing of CTE is enabled + +SET gp_cte_sharing = ON; +--EXPLAIN +--WITH dept_count AS (SELECT deptno, COUNT(*) AS dept_count +-- FROM emp +-- GROUP BY deptno), +--mgr_count AS (SELECT dept_mgr_no, COUNT(*) AS mgr_count +-- FROM manager +-- GROUP BY dept_mgr_no) + +--SELECT e.ename AS employee_name, +-- dc1.dept_count AS emp_dept_count, +-- m.ename AS manager_name, +-- dmc1.mgr_count AS mgr_dept_count +--FROM emp e, +-- dept_count dc1, emp m, +-- mgr_count dmc1 +--WHERE e.deptno = dc1.deptno AND +-- e.mgr = m.empno AND +-- m.deptno = dmc1.dept_mgr_no +--ORDER BY 1, 2, 3, 4 DESC LIMIT 25; +WITH dept_count AS (SELECT deptno, COUNT(*) AS dept_count + FROM emp + GROUP BY deptno), +mgr_count AS (SELECT dept_mgr_no, COUNT(*) AS mgr_count + FROM manager + GROUP BY dept_mgr_no) + +SELECT e.ename AS employee_name, + dc1.dept_count AS emp_dept_count, + m.ename AS manager_name, + dmc1.mgr_count AS mgr_dept_count +FROM emp e, + dept_count dc1, emp m, + mgr_count dmc1 +WHERE e.deptno = dc1.deptno AND + e.mgr = m.empno AND + m.deptno = dmc1.dept_mgr_no +ORDER BY 1, 2, 3, 4 DESC LIMIT 25; + +-- Test that SharedInputScan within the same slice is always executed +set gp_cte_sharing=on; + +-- start_ignore +CREATE TABLE car (a int, b int); +CREATE TABLE zoo (c int, d int); +insert into car select i, (i+1) from generate_series(1,10) i; +insert into zoo values (4,4); +-- end_ignore + +WITH c as (SELECT sum(a) as a_sum, b FROM car GROUP BY b) +SELECT * FROM c as c1, zoo WHERE zoo.c != 4 AND c1.b = zoo.c +UNION ALL +SELECT * FROM c as c1, zoo WHERE zoo.c = c1.b; + +-- start_ignore +drop schema qp_with_clause cascade; +-- end_ignore diff --git a/src/test/singlenode_regress/sql/query_finish_pending.sql b/src/test/singlenode_regress/sql/query_finish_pending.sql new file mode 100644 index 00000000000..b59fced52ac --- /dev/null +++ b/src/test/singlenode_regress/sql/query_finish_pending.sql @@ -0,0 +1,97 @@ +drop table if exists _tmp_table; +create table _tmp_table (i1 int, i2 int, i3 int, i4 int); +insert into _tmp_table select i, i % 100, i % 10000, i % 75 from generate_series(0,99999) i; + +-- make sort to spill +set statement_mem="2MB"; +set gp_cte_sharing=on; + +select gp_inject_fault('execsort_sort_mergeruns', 'reset', 1); +-- set QueryFinishPending=true in sort mergeruns. This will stop sort and set result_tape to NULL +select gp_inject_fault('execsort_sort_mergeruns', 'finish_pending', 1); + +-- return results although sort will be interrupted in one of the segments +select DISTINCT S from (select row_number() over(partition by i1 order by i2) AS T, count(*) over (partition by i1) AS S from _tmp_table) AS TMP; + +-- In single node, merge run won't be triggered. +-- start_ignore +select gp_inject_fault('execsort_sort_mergeruns', 'status', 1); +-- end_ignore + +select gp_inject_fault('execsort_dumptuples', 'reset', 1); +-- set QueryFinishPending=true in sort dumptuples. This will stop sort. +select gp_inject_fault('execsort_dumptuples', 'finish_pending', 1); + +-- return results although sort will be interrupted in one of the segments +select DISTINCT S from (select row_number() over(partition by i1 order by i2) AS T, count(*) over (partition by i1) AS S from _tmp_table) AS TMP; + +-- In single node, merge run won't be triggered. +-- start_ignore +select gp_inject_fault('execsort_dumptuples', 'status', 1); +-- end_ignore + +-- ORCA does not trigger sort_bounded_heap() in following queries +set optimizer=off; + +select gp_inject_fault('execsort_sort_bounded_heap', 'reset', 1); +-- set QueryFinishPending=true in sort_bounded_heap. This will stop sort. +select gp_inject_fault('execsort_sort_bounded_heap', 'finish_pending', 1); + +-- In cbdb single node, if we inject fault in the single node, no data should return. +-- start_ignore +-- return results although sort will be interrupted in one of the segments +select i1 from _tmp_table order by i2 limit 3; +-- end_ignore + +select gp_inject_fault('execsort_sort_bounded_heap', 'status', 1); + +-- test if shared input scan deletes memory correctly when QueryFinishPending and its child has been eagerly freed, +-- where the child is a Sort node +drop table if exists testsisc; +create table testsisc (i1 int, i2 int, i3 int, i4 int); +insert into testsisc select i, i % 1000, i % 100000, i % 75 from +(select generate_series(1, nsegments * 50000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content >= -1) foo) bar; + +set gp_resqueue_print_operator_memory_limits=on; +set statement_mem='2MB'; +-- ORCA does not generate SharedInputScan with a Sort node underneath it. For +-- the following query, ORCA disregards the order by inside the cte definition; +-- planner on the other hand does not. +set optimizer=off; +select gp_inject_fault('execshare_input_next', 'reset', 1); +-- Set QueryFinishPending to true after SharedInputScan has retrieved the first tuple. +-- This will eagerly free the memory context of shared input scan's child node. +select gp_inject_fault('execshare_input_next', 'finish_pending', 1); + +-- In cbdb single node, if we inject fault in the single node, no data should return. +-- start_ignore +with cte as (select i2 from testsisc order by i2) +select * from cte c1, cte c2 limit 2; +-- end_ignore +select gp_inject_fault('execshare_input_next', 'status', 1); + +-- test if shared input scan deletes memory correctly when QueryFinishPending and its child has been eagerly freed, +-- where the child is a Sort node and sort_mk algorithm is used + + +select gp_inject_fault('execshare_input_next', 'reset', 1); +-- Set QueryFinishPending to true after SharedInputScan has retrieved the first tuple. +-- This will eagerly free the memory context of shared input scan's child node. +select gp_inject_fault('execshare_input_next', 'finish_pending', 1); + +-- In cbdb single node, if we inject fault in the single node, no data should return. +-- start_ignore +with cte as (select i2 from testsisc order by i2) +select * from cte c1, cte c2 limit 2; +-- end_ignore + +select gp_inject_fault('execshare_input_next', 'status', 1); + +-- Disable faultinjectors +select gp_inject_fault('execsort_sort_mergeruns', 'reset', 1); +select gp_inject_fault('execsort_dumptuples', 'reset', 1); +select gp_inject_fault('execsort_sort_bounded_heap', 'reset', 1); +select gp_inject_fault('execshare_input_next', 'reset', 1); + +drop table testsisc; diff --git a/src/test/singlenode_regress/sql/random.sql b/src/test/singlenode_regress/sql/random.sql new file mode 100644 index 00000000000..8187b2c288a --- /dev/null +++ b/src/test/singlenode_regress/sql/random.sql @@ -0,0 +1,44 @@ +-- +-- RANDOM +-- Test the random function +-- + +-- count the number of tuples originally, should be 1000 +SELECT count(*) FROM onek; + +-- pick three random rows, they shouldn't match +(SELECT unique1 AS random + FROM onek ORDER BY random() LIMIT 1) +INTERSECT +(SELECT unique1 AS random + FROM onek ORDER BY random() LIMIT 1) +INTERSECT +(SELECT unique1 AS random + FROM onek ORDER BY random() LIMIT 1); + +-- count roughly 1/10 of the tuples +CREATE TABLE RANDOM_TBL AS + SELECT count(*) AS random + FROM onek WHERE random() < 1.0/10; + +-- select again, the count should be different +INSERT INTO RANDOM_TBL (random) + SELECT count(*) + FROM onek WHERE random() < 1.0/10; + +-- select again, the count should be different +INSERT INTO RANDOM_TBL (random) + SELECT count(*) + FROM onek WHERE random() < 1.0/10; + +-- select again, the count should be different +INSERT INTO RANDOM_TBL (random) + SELECT count(*) + FROM onek WHERE random() < 1.0/10; + +-- now test that they are different counts +SELECT random, count(random) FROM RANDOM_TBL + GROUP BY random HAVING count(random) > 3; + +SELECT AVG(random) FROM RANDOM_TBL + HAVING AVG(random) NOT BETWEEN 80 AND 120; diff --git a/src/test/singlenode_regress/sql/rangefuncs.sql b/src/test/singlenode_regress/sql/rangefuncs.sql new file mode 100644 index 00000000000..749e6b0161b --- /dev/null +++ b/src/test/singlenode_regress/sql/rangefuncs.sql @@ -0,0 +1,821 @@ +CREATE TABLE rngfunc2(rngfuncid int, f2 int); +INSERT INTO rngfunc2 VALUES(1, 11); +INSERT INTO rngfunc2 VALUES(2, 22); +INSERT INTO rngfunc2 VALUES(1, 111); + +CREATE FUNCTION rngfunct(int) returns setof rngfunc2 as 'SELECT * FROM rngfunc2 WHERE rngfuncid = $1 ORDER BY f2;' LANGUAGE SQL; + +-- function with ORDINALITY +select * from rngfunct(1) with ordinality as z(a,b,ord); +select * from rngfunct(1) with ordinality as z(a,b,ord) where b > 100; -- ordinal 2, not 1 +-- ordinality vs. column names and types +select a,b,ord from rngfunct(1) with ordinality as z(a,b,ord); +select a,ord from unnest(array['a','b']) with ordinality as z(a,ord); +select * from unnest(array['a','b']) with ordinality as z(a,ord); +select a,ord from unnest(array[1.0::float8]) with ordinality as z(a,ord); +select * from unnest(array[1.0::float8]) with ordinality as z(a,ord); +select row_to_json(s.*) from generate_series(11,14) with ordinality s; +-- ordinality vs. views +create temporary view vw_ord as select * from (values (1)) v(n) join rngfunct(1) with ordinality as z(a,b,ord) on (n=ord); +select * from vw_ord; +select definition from pg_views where viewname='vw_ord'; +drop view vw_ord; + +-- multiple functions +select * from rows from(rngfunct(1),rngfunct(2)) with ordinality as z(a,b,c,d,ord); +create temporary view vw_ord as select * from (values (1)) v(n) join rows from(rngfunct(1),rngfunct(2)) with ordinality as z(a,b,c,d,ord) on (n=ord); +select * from vw_ord; +select definition from pg_views where viewname='vw_ord'; +drop view vw_ord; + +-- expansions of unnest() +select * from unnest(array[10,20],array['foo','bar'],array[1.0]); +select * from unnest(array[10,20],array['foo','bar'],array[1.0]) with ordinality as z(a,b,c,ord); +select * from rows from(unnest(array[10,20],array['foo','bar'],array[1.0])) with ordinality as z(a,b,c,ord); +select * from rows from(unnest(array[10,20],array['foo','bar']), generate_series(101,102)) with ordinality as z(a,b,c,ord); +create temporary view vw_ord as select * from unnest(array[10,20],array['foo','bar'],array[1.0]) as z(a,b,c); +select * from vw_ord; +select definition from pg_views where viewname='vw_ord'; +drop view vw_ord; +create temporary view vw_ord as select * from rows from(unnest(array[10,20],array['foo','bar'],array[1.0])) as z(a,b,c); +select * from vw_ord; +select definition from pg_views where viewname='vw_ord'; +drop view vw_ord; +create temporary view vw_ord as select * from rows from(unnest(array[10,20],array['foo','bar']), generate_series(1,2)) as z(a,b,c); +select * from vw_ord; +select definition from pg_views where viewname='vw_ord'; +drop view vw_ord; + +-- ordinality and multiple functions vs. rewind and reverse scan +-- Backward scan not supported in GPDB, which makes this a lot less +-- interesting than in PostgreSQL. +begin; +declare rf_cur scroll cursor for select * from rows from(generate_series(1,5),generate_series(1,2)) with ordinality as g(i,j,o); +fetch all from rf_cur; +--fetch backward all from rf_cur; +fetch all from rf_cur; +fetch next from rf_cur; +fetch next from rf_cur; +--fetch prior from rf_cur; +--fetch absolute 1 from rf_cur; +fetch next from rf_cur; +fetch next from rf_cur; +fetch next from rf_cur; +--fetch prior from rf_cur; +--fetch prior from rf_cur; +--fetch prior from rf_cur; +commit; + +-- function with implicit LATERAL +select * from rngfunc2, rngfunct(rngfunc2.rngfuncid) z where rngfunc2.f2 = z.f2; + +-- function with implicit LATERAL and explicit ORDINALITY +select * from rngfunc2, rngfunct(rngfunc2.rngfuncid) with ordinality as z(rngfuncid,f2,ord) where rngfunc2.f2 = z.f2; + +-- function in subselect +select * from rngfunc2 where f2 in (select f2 from rngfunct(rngfunc2.rngfuncid) z where z.rngfuncid = rngfunc2.rngfuncid) ORDER BY 1,2; + +-- function in subselect +select * from rngfunc2 where f2 in (select f2 from rngfunct(1) z where z.rngfuncid = rngfunc2.rngfuncid) ORDER BY 1,2; + +-- function in subselect +select * from rngfunc2 where f2 in (select f2 from rngfunct(rngfunc2.rngfuncid) z where z.rngfuncid = 1) ORDER BY 1,2; + +-- nested functions +select rngfunct.rngfuncid, rngfunct.f2 from rngfunct(sin(pi()/2)::int) ORDER BY 1,2; + +CREATE TABLE rngfunc (rngfuncid int, rngfuncsubid int, rngfuncname text, primary key(rngfuncid,rngfuncsubid)); +INSERT INTO rngfunc VALUES(1,1,'Joe'); +INSERT INTO rngfunc VALUES(1,2,'Ed'); +INSERT INTO rngfunc VALUES(2,1,'Mary'); + +-- sql, proretset = f, prorettype = b +CREATE FUNCTION getrngfunc1(int) RETURNS int AS 'SELECT $1;' LANGUAGE SQL; +SELECT * FROM getrngfunc1(1) AS t1; +SELECT * FROM getrngfunc1(1) WITH ORDINALITY AS t1(v,o); +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc1(1); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc1(1) WITH ORDINALITY as t1(v,o); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- sql, proretset = t, prorettype = b +CREATE FUNCTION getrngfunc2(int) RETURNS setof int AS 'SELECT rngfuncid FROM rngfunc WHERE rngfuncid = $1;' LANGUAGE SQL; +SELECT * FROM getrngfunc2(1) AS t1; +SELECT * FROM getrngfunc2(1) WITH ORDINALITY AS t1(v,o); +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc2(1); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc2(1) WITH ORDINALITY AS t1(v,o); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- sql, proretset = t, prorettype = b +CREATE FUNCTION getrngfunc3(int) RETURNS setof text AS 'SELECT rngfuncname FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc3(1) AS t1; +SELECT * FROM getrngfunc3(1) WITH ORDINALITY AS t1(v,o); +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc3(1); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc3(1) WITH ORDINALITY AS t1(v,o); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- sql, proretset = f, prorettype = c +CREATE FUNCTION getrngfunc4(int) RETURNS rngfunc AS 'SELECT * FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc4(1) AS t1; +SELECT * FROM getrngfunc4(1) WITH ORDINALITY AS t1(a,b,c,o); +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc4(1); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc4(1) WITH ORDINALITY AS t1(a,b,c,o); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- sql, proretset = t, prorettype = c +CREATE FUNCTION getrngfunc5(int) RETURNS setof rngfunc AS 'SELECT * FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc5(1) AS t1; +SELECT * FROM getrngfunc5(1) WITH ORDINALITY AS t1(a,b,c,o); +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc5(1); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc5(1) WITH ORDINALITY AS t1(a,b,c,o); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- sql, proretset = f, prorettype = record +CREATE FUNCTION getrngfunc6(int) RETURNS RECORD AS 'SELECT * FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc6(1) AS t1(rngfuncid int, rngfuncsubid int, rngfuncname text); +SELECT * FROM ROWS FROM( getrngfunc6(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text) ) WITH ORDINALITY; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc6(1) AS +(rngfuncid int, rngfuncsubid int, rngfuncname text); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS + SELECT * FROM ROWS FROM( getrngfunc6(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text) ) + WITH ORDINALITY; +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- sql, proretset = t, prorettype = record +CREATE FUNCTION getrngfunc7(int) RETURNS setof record AS 'SELECT * FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ;' LANGUAGE SQL; +SELECT * FROM getrngfunc7(1) AS t1(rngfuncid int, rngfuncsubid int, rngfuncname text); +SELECT * FROM ROWS FROM( getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text) ) WITH ORDINALITY; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc7(1) AS +(rngfuncid int, rngfuncsubid int, rngfuncname text); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS + SELECT * FROM ROWS FROM( getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text) ) + WITH ORDINALITY; +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- plpgsql, proretset = f, prorettype = b +CREATE FUNCTION getrngfunc8(int) RETURNS int AS 'DECLARE rngfuncint int; BEGIN SELECT rngfuncid into rngfuncint FROM rngfunc WHERE rngfuncid = $1; RETURN rngfuncint; END;' LANGUAGE plpgsql; +SELECT * FROM getrngfunc8(1) AS t1; +SELECT * FROM getrngfunc8(1) WITH ORDINALITY AS t1(v,o); +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc8(1); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc8(1) WITH ORDINALITY AS t1(v,o); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- plpgsql, proretset = f, prorettype = c +CREATE FUNCTION getrngfunc9(int) RETURNS rngfunc AS 'DECLARE rngfunctup rngfunc%ROWTYPE; BEGIN SELECT * into rngfunctup FROM rngfunc WHERE rngfuncid = $1 ORDER BY rngfuncname DESC /* ORDER BY to force the Joe row to be returned */ ; RETURN rngfunctup; END;' LANGUAGE plpgsql; +SELECT * FROM getrngfunc9(1) AS t1; +SELECT * FROM getrngfunc9(1) WITH ORDINALITY AS t1(a,b,c,o); +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc9(1); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; +CREATE VIEW vw_getrngfunc AS SELECT * FROM getrngfunc9(1) WITH ORDINALITY AS t1(a,b,c,o); +SELECT * FROM vw_getrngfunc; +DROP VIEW vw_getrngfunc; + +-- mix 'n match kinds, to exercise expandRTE and related logic + +select * from rows from(getrngfunc1(1),getrngfunc2(1),getrngfunc3(1),getrngfunc4(1),getrngfunc5(1), + getrngfunc6(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc8(1),getrngfunc9(1)) + with ordinality as t1(a,b,c,d,e,f,g,h,i,j,k,l,m,o,p,q,r,s,t,u); +select * from rows from(getrngfunc9(1),getrngfunc8(1), + getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc6(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc5(1),getrngfunc4(1),getrngfunc3(1),getrngfunc2(1),getrngfunc1(1)) + with ordinality as t1(a,b,c,d,e,f,g,h,i,j,k,l,m,o,p,q,r,s,t,u); + +create temporary view vw_rngfunc as + select * from rows from(getrngfunc9(1), + getrngfunc7(1) AS (rngfuncid int, rngfuncsubid int, rngfuncname text), + getrngfunc1(1)) + with ordinality as t1(a,b,c,d,e,f,g,n); +select * from vw_rngfunc; +select pg_get_viewdef('vw_rngfunc'); +drop view vw_rngfunc; + +DROP FUNCTION getrngfunc1(int); +DROP FUNCTION getrngfunc2(int); +DROP FUNCTION getrngfunc3(int); +DROP FUNCTION getrngfunc4(int); +DROP FUNCTION getrngfunc5(int); +DROP FUNCTION getrngfunc6(int); +DROP FUNCTION getrngfunc7(int); +DROP FUNCTION getrngfunc8(int); +DROP FUNCTION getrngfunc9(int); +DROP FUNCTION rngfunct(int); +DROP TABLE rngfunc2; +DROP TABLE rngfunc; + +-- Rescan tests -- +CREATE TEMPORARY SEQUENCE rngfunc_rescan_seq1; +CREATE TEMPORARY SEQUENCE rngfunc_rescan_seq2; +CREATE TYPE rngfunc_rescan_t AS (i integer, s bigint); + +CREATE FUNCTION rngfunc_sql(int,int) RETURNS setof rngfunc_rescan_t AS 'SELECT i, nextval(''rngfunc_rescan_seq1'') FROM generate_series($1,$2) i;' LANGUAGE SQL; +-- plpgsql functions use materialize mode +CREATE FUNCTION rngfunc_mat(int,int) RETURNS setof rngfunc_rescan_t AS 'begin for i in $1..$2 loop return next (i, nextval(''rngfunc_rescan_seq2'')); end loop; end;' LANGUAGE plpgsql; + +--invokes ExecReScanFunctionScan - all these cases should materialize the function only once +-- LEFT JOIN on a condition that the planner can't prove to be true is used to ensure the function +-- is on the inner path of a nestloop join + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN rngfunc_sql(11,13) ON (r+i)<100; +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN rngfunc_sql(11,13) WITH ORDINALITY AS f(i,s,o) ON (r+i)<100; + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN rngfunc_mat(11,13) ON (r+i)<100; +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN rngfunc_mat(11,13) WITH ORDINALITY AS f(i,s,o) ON (r+i)<100; +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN ROWS FROM( rngfunc_sql(11,13), rngfunc_mat(11,13) ) WITH ORDINALITY AS f(i1,s1,i2,s2,o) ON (r+i1+i2)<100; + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN generate_series(11,13) f(i) ON (r+i)<100; +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN generate_series(11,13) WITH ORDINALITY AS f(i,o) ON (r+i)<100; + +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN unnest(array[10,20,30]) f(i) ON (r+i)<100; +SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN unnest(array[10,20,30]) WITH ORDINALITY AS f(i,o) ON (r+i)<100; + +--invokes ExecReScanFunctionScan with chgParam != NULL (using implied LATERAL) + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_sql(10+r,13); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_sql(10+r,13) WITH ORDINALITY AS f(i,s,o); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_sql(11,10+r); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_sql(11,10+r) WITH ORDINALITY AS f(i,s,o); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (11,12),(13,15),(16,20)) v(r1,r2), rngfunc_sql(r1,r2); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (11,12),(13,15),(16,20)) v(r1,r2), rngfunc_sql(r1,r2) WITH ORDINALITY AS f(i,s,o); + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_mat(10+r,13); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_mat(10+r,13) WITH ORDINALITY AS f(i,s,o); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_mat(11,10+r); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), rngfunc_mat(11,10+r) WITH ORDINALITY AS f(i,s,o); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (11,12),(13,15),(16,20)) v(r1,r2), rngfunc_mat(r1,r2); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (11,12),(13,15),(16,20)) v(r1,r2), rngfunc_mat(r1,r2) WITH ORDINALITY AS f(i,s,o); + +-- selective rescan of multiple functions: + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), ROWS FROM( rngfunc_sql(11,11), rngfunc_mat(10+r,13) ); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), ROWS FROM( rngfunc_sql(10+r,13), rngfunc_mat(11,11) ); +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM (VALUES (1),(2),(3)) v(r), ROWS FROM( rngfunc_sql(10+r,13), rngfunc_mat(10+r,13) ); + +SELECT setval('rngfunc_rescan_seq1',1,false),setval('rngfunc_rescan_seq2',1,false); +SELECT * FROM generate_series(1,2) r1, generate_series(r1,3) r2, ROWS FROM( rngfunc_sql(10+r1,13), rngfunc_mat(10+r2,13) ); + +SELECT * FROM (VALUES (1),(2),(3)) v(r), generate_series(10+r,20-r) f(i); +SELECT * FROM (VALUES (1),(2),(3)) v(r), generate_series(10+r,20-r) WITH ORDINALITY AS f(i,o); + +SELECT * FROM (VALUES (1),(2),(3)) v(r), unnest(array[r*10,r*20,r*30]) f(i); +SELECT * FROM (VALUES (1),(2),(3)) v(r), unnest(array[r*10,r*20,r*30]) WITH ORDINALITY AS f(i,o); + +-- deep nesting + +SELECT * FROM (VALUES (1),(2),(3)) v1(r1), + LATERAL (SELECT r1, * FROM (VALUES (10),(20),(30)) v2(r2) + LEFT JOIN generate_series(21,23) f(i) ON ((r2+i)<100) OFFSET 0) s1; +SELECT * FROM (VALUES (1),(2),(3)) v1(r1), + LATERAL (SELECT r1, * FROM (VALUES (10),(20),(30)) v2(r2) + LEFT JOIN generate_series(20+r1,23) f(i) ON ((r2+i)<100) OFFSET 0) s1; +SELECT * FROM (VALUES (1),(2),(3)) v1(r1), + LATERAL (SELECT r1, * FROM (VALUES (10),(20),(30)) v2(r2) + LEFT JOIN generate_series(r2,r2+3) f(i) ON ((r2+i)<100) OFFSET 0) s1; +SELECT * FROM (VALUES (1),(2),(3)) v1(r1), + LATERAL (SELECT r1, * FROM (VALUES (10),(20),(30)) v2(r2) + LEFT JOIN generate_series(r1,2+r2/5) f(i) ON ((r2+i)<100) OFFSET 0) s1; + +-- check handling of FULL JOIN with multiple lateral references (bug #15741) + +SELECT * +FROM (VALUES (1),(2)) v1(r1) + LEFT JOIN LATERAL ( + SELECT * + FROM generate_series(1, v1.r1) AS gs1 + LEFT JOIN LATERAL ( + SELECT * + FROM generate_series(1, gs1) AS gs2 + LEFT JOIN generate_series(1, gs2) AS gs3 ON TRUE + ) AS ss1 ON TRUE + FULL JOIN generate_series(1, v1.r1) AS gs4 ON FALSE + ) AS ss0 ON TRUE; + +DROP FUNCTION rngfunc_sql(int,int); +DROP FUNCTION rngfunc_mat(int,int); +DROP SEQUENCE rngfunc_rescan_seq1; +DROP SEQUENCE rngfunc_rescan_seq2; + +-- +-- Test cases involving OUT parameters +-- + +CREATE FUNCTION rngfunc(in f1 int, out f2 int) +AS 'select $1+1' LANGUAGE sql; +SELECT rngfunc(42); +SELECT * FROM rngfunc(42); +SELECT * FROM rngfunc(42) AS p(x); + +-- explicit spec of return type is OK +CREATE OR REPLACE FUNCTION rngfunc(in f1 int, out f2 int) RETURNS int +AS 'select $1+1' LANGUAGE sql; +-- error, wrong result type +CREATE OR REPLACE FUNCTION rngfunc(in f1 int, out f2 int) RETURNS float +AS 'select $1+1' LANGUAGE sql; +-- with multiple OUT params you must get a RECORD result +CREATE OR REPLACE FUNCTION rngfunc(in f1 int, out f2 int, out f3 text) RETURNS int +AS 'select $1+1' LANGUAGE sql; +CREATE OR REPLACE FUNCTION rngfunc(in f1 int, out f2 int, out f3 text) +RETURNS record +AS 'select $1+1' LANGUAGE sql; + +CREATE OR REPLACE FUNCTION rngfuncr(in f1 int, out f2 int, out text) +AS $$select $1-1, $1::text || 'z'$$ LANGUAGE sql; +SELECT f1, rngfuncr(f1) FROM int4_tbl; +SELECT * FROM rngfuncr(42); +SELECT * FROM rngfuncr(42) AS p(a,b); + +CREATE OR REPLACE FUNCTION rngfuncb(in f1 int, inout f2 int, out text) +AS $$select $2-1, $1::text || 'z'$$ LANGUAGE sql; +SELECT f1, rngfuncb(f1, f1/2) FROM int4_tbl; +SELECT * FROM rngfuncb(42, 99); +SELECT * FROM rngfuncb(42, 99) AS p(a,b); + +-- Can reference function with or without OUT params for DROP, etc +DROP FUNCTION rngfunc(int); +DROP FUNCTION rngfuncr(in f2 int, out f1 int, out text); +DROP FUNCTION rngfuncb(in f1 int, inout f2 int); + +-- +-- For my next trick, polymorphic OUT parameters +-- + +CREATE FUNCTION dup (f1 anyelement, f2 out anyelement, f3 out anyarray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; +SELECT dup(22); +SELECT dup('xyz'); -- fails +SELECT dup('xyz'::text); +SELECT * FROM dup('xyz'::text); + +-- fails, as we are attempting to rename first argument +CREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; + +DROP FUNCTION dup(anyelement); + +-- equivalent behavior, though different name exposed for input arg +CREATE OR REPLACE FUNCTION dup (inout f2 anyelement, out f3 anyarray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; +SELECT dup(22); + +DROP FUNCTION dup(anyelement); + +-- fails, no way to deduce outputs +CREATE FUNCTION bad (f1 int, out f2 anyelement, out f3 anyarray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; + +CREATE FUNCTION dup (f1 anycompatible, f2 anycompatiblearray, f3 out anycompatible, f4 out anycompatiblearray) +AS 'select $1, $2' LANGUAGE sql; +SELECT dup(22, array[44]); +SELECT dup(4.5, array[44]); +SELECT dup(22, array[44::bigint]); +SELECT *, pg_typeof(f3), pg_typeof(f4) FROM dup(22, array[44::bigint]); + +DROP FUNCTION dup(f1 anycompatible, f2 anycompatiblearray); + +CREATE FUNCTION dup (f1 anycompatiblerange, f2 out anycompatible, f3 out anycompatiblearray, f4 out anycompatiblerange) +AS 'select lower($1), array[lower($1), upper($1)], $1' LANGUAGE sql; +SELECT dup(int4range(4,7)); +SELECT dup(numrange(4,7)); +SELECT dup(textrange('aaa', 'bbb')); + +DROP FUNCTION dup(f1 anycompatiblerange); + +-- fails, no way to deduce outputs +CREATE FUNCTION bad (f1 anyarray, out f2 anycompatible, out f3 anycompatiblearray) +AS 'select $1, array[$1,$1]' LANGUAGE sql; + +-- +-- table functions +-- + +CREATE OR REPLACE FUNCTION rngfunc() +RETURNS TABLE(a int) +AS $$ SELECT a FROM generate_series(1,5) a(a) $$ LANGUAGE sql; +SELECT * FROM rngfunc(); +DROP FUNCTION rngfunc(); + +CREATE OR REPLACE FUNCTION rngfunc(int) +RETURNS TABLE(a int, b int) +AS $$ SELECT a, b + FROM generate_series(1,$1) a(a), + generate_series(1,$1) b(b) $$ LANGUAGE sql; +SELECT * FROM rngfunc(3); +DROP FUNCTION rngfunc(int); + +-- case that causes change of typmod knowledge during inlining +CREATE OR REPLACE FUNCTION rngfunc() +RETURNS TABLE(a varchar(5)) +AS $$ SELECT 'hello'::varchar(5) $$ LANGUAGE sql STABLE; +SELECT * FROM rngfunc() GROUP BY 1; +DROP FUNCTION rngfunc(); + +-- +-- some tests on SQL functions with RETURNING +-- + +create temp table tt(f1 serial, data text); + +-- GPDB: The tests below which throw NOTICEs, throw them in indeterminate +-- order, if the rows are hashed to different segments. Force the rows +-- that have problem to be hashed to the same segment, using a custom hash +-- function. +CREATE OPERATOR FAMILY dummy_int_hash_ops USING hash; + +CREATE FUNCTION dummy_hashfunc(int) RETURNS int AS $$ +begin + return CASE WHEN $1 BETWEEN 7 AND 15 THEN 0 ELSE $1 END; +end; $$ LANGUAGE plpgsql STRICT IMMUTABLE; + +CREATE OPERATOR CLASS dummy_int_hash_ops FOR TYPE int4 + USING hash FAMILY dummy_int_hash_ops AS + OPERATOR 1 =, + FUNCTION 1 dummy_hashfunc(int); + +create function insert_tt(text) returns int as +$$ insert into tt(data) values($1) returning f1 $$ +language sql; + +select insert_tt('foo'); +select insert_tt('bar'); +select * from tt; + +-- insert will execute to completion even if function needs just 1 row +create or replace function insert_tt(text) returns int as +$$ insert into tt(data) values($1),($1||$1) returning (f1>0)::int $$ +language sql; + +select insert_tt('fool'); +select * from tt; + +-- setof does what's expected +create or replace function insert_tt2(text,text) returns setof int as +$$ insert into tt(data) values($1),($2) returning f1 $$ +language sql; + +select insert_tt2('foolish','barrish'); +select * from insert_tt2('baz','quux'); +select * from tt; + +-- limit doesn't prevent execution to completion +select insert_tt2('foolish','barrish') limit 1; +select * from tt; + +-- triggers will fire, too +create function noticetrigger() returns trigger as $$ +begin + raise notice 'noticetrigger % %', new.f1, new.data; + return null; +end $$ language plpgsql; +create trigger tnoticetrigger after insert on tt for each row +execute procedure noticetrigger(); + +select insert_tt2('foolme','barme') limit 1; +select * from tt; + +-- and rules work +create temp table tt_log(f1 int, data text); + +create rule insert_tt_rule as on insert to tt do also + insert into tt_log values(new.*); + +select insert_tt2('foollog','barlog') limit 1; +select * from tt; +-- note that nextval() gets executed a second time in the rule expansion, +-- which is expected. +select * from tt_log; + +-- test case for a whole-row-variable bug +create function rngfunc1(n integer, out a text, out b text) + returns setof record + language sql + as $$ select 'foo ' || i, 'bar ' || i from generate_series(1,$1) i $$; + +set work_mem='64kB'; +select t.a, t, t.a from rngfunc1(10000) t limit 1; +reset work_mem; +select t.a, t, t.a from rngfunc1(10000) t limit 1; + +drop function rngfunc1(n integer); + +-- test use of SQL functions returning record +-- this is supported in some cases where the query doesn't specify +-- the actual record type ... + +create function array_to_set(anyarray) returns setof record as $$ + select i AS "index", $1[i] AS "value" from generate_subscripts($1, 1) i +$$ language sql strict immutable; + +select array_to_set(array['one', 'two']); +select * from array_to_set(array['one', 'two']) as t(f1 int,f2 text); +select * from array_to_set(array['one', 'two']); -- fail +-- after-the-fact coercion of the columns is now possible, too +select * from array_to_set(array['one', 'two']) as t(f1 numeric(4,2),f2 text); +-- and if it doesn't work, you get a compile-time not run-time error +select * from array_to_set(array['one', 'two']) as t(f1 point,f2 text); + +-- with "strict", this function can't be inlined in FROM +explain (verbose, costs off) + select * from array_to_set(array['one', 'two']) as t(f1 numeric(4,2),f2 text); + +-- but without, it can be: + +create or replace function array_to_set(anyarray) returns setof record as $$ + select i AS "index", $1[i] AS "value" from generate_subscripts($1, 1) i +$$ language sql immutable; + +select array_to_set(array['one', 'two']); +select * from array_to_set(array['one', 'two']) as t(f1 int,f2 text); +select * from array_to_set(array['one', 'two']) as t(f1 numeric(4,2),f2 text); +select * from array_to_set(array['one', 'two']) as t(f1 point,f2 text); +explain (verbose, costs off) + select * from array_to_set(array['one', 'two']) as t(f1 numeric(4,2),f2 text); + +create temp table rngfunc(f1 int8, f2 int8); + +create function testrngfunc() returns record as $$ + insert into rngfunc values (1,2) returning *; +$$ language sql; + +select testrngfunc(); +select * from testrngfunc() as t(f1 int8,f2 int8); +select * from testrngfunc(); -- fail + +drop function testrngfunc(); + +create function testrngfunc() returns setof record as $$ + insert into rngfunc values (1,2), (3,4) returning *; +$$ language sql; + +select testrngfunc(); +select * from testrngfunc() as t(f1 int8,f2 int8); +select * from testrngfunc(); -- fail + +drop function testrngfunc(); + +-- Check that typmod imposed by a composite type is honored +create type rngfunc_type as (f1 numeric(35,6), f2 numeric(35,2)); + +create function testrngfunc() returns rngfunc_type as $$ + select 7.136178319899999964, 7.136178319899999964; +$$ language sql immutable; + +explain (verbose, costs off) +select testrngfunc(); +select testrngfunc(); +explain (verbose, costs off) +select * from testrngfunc(); +select * from testrngfunc(); + +create or replace function testrngfunc() returns rngfunc_type as $$ + select 7.136178319899999964, 7.136178319899999964; +$$ language sql volatile; + +explain (verbose, costs off) +select testrngfunc(); +select testrngfunc(); +explain (verbose, costs off) +select * from testrngfunc(); +select * from testrngfunc(); + +drop function testrngfunc(); + +create function testrngfunc() returns setof rngfunc_type as $$ + select 7.136178319899999964, 7.136178319899999964; +$$ language sql immutable; + +explain (verbose, costs off) +select testrngfunc(); +select testrngfunc(); +explain (verbose, costs off) +select * from testrngfunc(); +select * from testrngfunc(); + +create or replace function testrngfunc() returns setof rngfunc_type as $$ + select 7.136178319899999964, 7.136178319899999964; +$$ language sql volatile; + +explain (verbose, costs off) +select testrngfunc(); +select testrngfunc(); +explain (verbose, costs off) +select * from testrngfunc(); +select * from testrngfunc(); + +create or replace function testrngfunc() returns setof rngfunc_type as $$ + select 1, 2 union select 3, 4 order by 1; +$$ language sql immutable; + +explain (verbose, costs off) +select testrngfunc(); +select testrngfunc(); +explain (verbose, costs off) +select * from testrngfunc(); +select * from testrngfunc(); + +-- Check a couple of error cases while we're here +select * from testrngfunc() as t(f1 int8,f2 int8); -- fail, composite result +select * from pg_get_keywords() as t(f1 int8,f2 int8); -- fail, OUT params +select * from sin(3) as t(f1 int8,f2 int8); -- fail, scalar result type + +drop type rngfunc_type cascade; + +-- +-- Check some cases involving added/dropped columns in a rowtype result +-- + +create temp table users (userid text, seq int, email text, todrop bool, moredrop int, enabled bool); +insert into users values ('id',1,'email',true,11,true); +insert into users values ('id2',2,'email2',true,12,true); +alter table users drop column todrop; + +create or replace function get_first_user() returns users as +$$ SELECT * FROM users ORDER BY userid LIMIT 1; $$ +language sql stable; + +SELECT get_first_user(); +SELECT * FROM get_first_user(); + +create or replace function get_users() returns setof users as +$$ SELECT * FROM users ORDER BY userid; $$ +language sql stable; + +SELECT get_users(); +SELECT * FROM get_users(); +SELECT * FROM get_users() WITH ORDINALITY; -- make sure ordinality copes + +-- multiple functions vs. dropped columns +SELECT * FROM ROWS FROM(generate_series(10,11), get_users()) WITH ORDINALITY; +SELECT * FROM ROWS FROM(get_users(), generate_series(10,11)) WITH ORDINALITY; + +-- check that we can cope with post-parsing changes in rowtypes +create temp view usersview as +SELECT * FROM ROWS FROM(get_users(), generate_series(10,11)) WITH ORDINALITY; + +select * from usersview; +alter table users add column junk text; +select * from usersview; +begin; +alter table users drop column moredrop; +select * from usersview; -- expect clean failure +rollback; +alter table users alter column seq type numeric; +select * from usersview; -- expect clean failure + +drop view usersview; +drop function get_first_user(); +drop function get_users(); +drop table users; + +-- check behavior with type coercion required for a set-op + +create or replace function rngfuncbar() returns setof text as +$$ select 'foo'::varchar union all select 'bar'::varchar ; $$ +language sql stable; + +select rngfuncbar(); +select * from rngfuncbar(); +-- this function is now inlinable, too: +explain (verbose, costs off) select * from rngfuncbar(); + +drop function rngfuncbar(); + +-- check handling of a SQL function with multiple OUT params (bug #5777) + +create or replace function rngfuncbar(out integer, out numeric) as +$$ select (1, 2.1) $$ language sql; + +select * from rngfuncbar(); + +create or replace function rngfuncbar(out integer, out numeric) as +$$ select (1, 2) $$ language sql; + +select * from rngfuncbar(); -- fail + +create or replace function rngfuncbar(out integer, out numeric) as +$$ select (1, 2.1, 3) $$ language sql; + +select * from rngfuncbar(); -- fail + +drop function rngfuncbar(); + +-- check whole-row-Var handling in nested lateral functions (bug #11703) + +create function extractq2(t int8_tbl) returns int8 as $$ + select t.q2 +$$ language sql immutable; + +explain (verbose, costs off) +select x from int8_tbl, extractq2(int8_tbl) f(x); + +select x from int8_tbl, extractq2(int8_tbl) f(x); + +create function extractq2_2(t int8_tbl) returns table(ret1 int8) as $$ + select extractq2(t) offset 0 +$$ language sql immutable; + +explain (verbose, costs off) +select x from int8_tbl, extractq2_2(int8_tbl) f(x); + +select x from int8_tbl, extractq2_2(int8_tbl) f(x); + +-- without the "offset 0", this function gets optimized quite differently + +create function extractq2_2_opt(t int8_tbl) returns table(ret1 int8) as $$ + select extractq2(t) +$$ language sql immutable; + +explain (verbose, costs off) +select x from int8_tbl, extractq2_2_opt(int8_tbl) f(x); + +select x from int8_tbl, extractq2_2_opt(int8_tbl) f(x); + +-- gpdb: test append node in subquery_motionHazard_walker(). Without that +-- change the select query below will panic. +create function extractq2_append(t int8_tbl) returns table(ret1 int8) as $$ + select extractq2(t) union all select extractq2(t) +$$ language sql immutable; + +explain (verbose, costs off) +select x from (select * from int8_tbl order by 1 limit 100) as int8_tbl, extractq2_append(int8_tbl) f(x); + +select x from (select * from int8_tbl order by 1 limit 100) as int8_tbl, extractq2_append(int8_tbl) f(x); + +create function extractq2_wapper(t int8_tbl) returns table(ret1 int8) as $$ + select (select extractq2(t)) +$$ language sql immutable; + +explain (verbose, costs off) select x from int8_tbl, extractq2_wapper(int8_tbl) f(x); + +select x from int8_tbl, extractq2_wapper(int8_tbl) f(x); + +-- check handling of nulls in SRF results (bug #7808) + +create type rngfunc2 as (a integer, b text); + +select *, row_to_json(u) from unnest(array[(1,'foo')::rngfunc2, null::rngfunc2]) u; +select *, row_to_json(u) from unnest(array[null::rngfunc2, null::rngfunc2]) u; +select *, row_to_json(u) from unnest(array[null::rngfunc2, (1,'foo')::rngfunc2, null::rngfunc2]) u; +select *, row_to_json(u) from unnest(array[]::rngfunc2[]) u; + +drop type rngfunc2; + +-- check handling of functions pulled up into function RTEs (bug #17227) + +explain (verbose, costs off) +select * from + (select jsonb_path_query_array(module->'lectures', '$[*]') as lecture + from unnest(array['{"lectures": [{"id": "1"}]}'::jsonb]) + as unnested_modules(module)) as ss, + jsonb_to_recordset(ss.lecture) as j (id text); + +select * from + (select jsonb_path_query_array(module->'lectures', '$[*]') as lecture + from unnest(array['{"lectures": [{"id": "1"}]}'::jsonb]) + as unnested_modules(module)) as ss, + jsonb_to_recordset(ss.lecture) as j (id text); diff --git a/src/test/singlenode_regress/sql/rangetypes.sql b/src/test/singlenode_regress/sql/rangetypes.sql new file mode 100644 index 00000000000..a2d411d0daf --- /dev/null +++ b/src/test/singlenode_regress/sql/rangetypes.sql @@ -0,0 +1,620 @@ +-- Tests for range data types. + +create type textrange as range (subtype=text, collation="C"); + +-- +-- test input parser +-- + +-- negative tests; should fail +select ''::textrange; +select '-[a,z)'::textrange; +select '[a,z) - '::textrange; +select '(",a)'::textrange; +select '(,,a)'::textrange; +select '(),a)'::textrange; +select '(a,))'::textrange; +select '(],a)'::textrange; +select '(a,])'::textrange; +select '[z,a]'::textrange; + +-- should succeed +select ' empty '::textrange; +select ' ( empty, empty ) '::textrange; +select ' ( " a " " a ", " z " " z " ) '::textrange; +select '(a,)'::textrange; +select '[,z]'::textrange; +select '[a,]'::textrange; +select '(,)'::textrange; +select '[ , ]'::textrange; +select '["",""]'::textrange; +select '[",",","]'::textrange; +select '["\\","\\"]'::textrange; +select '(\\,a)'::textrange; +select '((,z)'::textrange; +select '([,z)'::textrange; +select '(!,()'::textrange; +select '(!,[)'::textrange; +select '[a,a]'::textrange; +-- these are allowed but normalize to empty: +select '[a,a)'::textrange; +select '(a,a]'::textrange; +select '(a,a)'::textrange; + +-- +-- create some test data and test the operators +-- + +CREATE TABLE numrange_test (nr NUMRANGE); +create index numrange_test_btree on numrange_test(nr); + +INSERT INTO numrange_test VALUES('[,)'); +INSERT INTO numrange_test VALUES('[3,]'); +INSERT INTO numrange_test VALUES('[, 5)'); +INSERT INTO numrange_test VALUES(numrange(1.1, 2.2)); +INSERT INTO numrange_test VALUES('empty'); +INSERT INTO numrange_test VALUES(numrange(1.7, 1.7, '[]')); + +SELECT nr, isempty(nr), lower(nr), upper(nr) FROM numrange_test; +SELECT nr, lower_inc(nr), lower_inf(nr), upper_inc(nr), upper_inf(nr) FROM numrange_test; + +SELECT * FROM numrange_test WHERE range_contains(nr, numrange(1.9,1.91)); +SELECT * FROM numrange_test WHERE nr @> numrange(1.0,10000.1); +SELECT * FROM numrange_test WHERE range_contained_by(numrange(-1e7,-10000.1), nr); +SELECT * FROM numrange_test WHERE 1.9 <@ nr; + +select * from numrange_test where nr = 'empty'; +select * from numrange_test where nr = '(1.1, 2.2)'; +select * from numrange_test where nr = '[1.1, 2.2)'; +select * from numrange_test where nr < 'empty'; +select * from numrange_test where nr < numrange(-1000.0, -1000.0,'[]'); +select * from numrange_test where nr < numrange(0.0, 1.0,'[]'); +select * from numrange_test where nr < numrange(1000.0, 1001.0,'[]'); +select * from numrange_test where nr <= 'empty'; +select * from numrange_test where nr >= 'empty'; +select * from numrange_test where nr > 'empty'; +select * from numrange_test where nr > numrange(-1001.0, -1000.0,'[]'); +select * from numrange_test where nr > numrange(0.0, 1.0,'[]'); +select * from numrange_test where nr > numrange(1000.0, 1000.0,'[]'); + +select numrange(2.0, 1.0); + +select numrange(2.0, 3.0) -|- numrange(3.0, 4.0); +select range_adjacent(numrange(2.0, 3.0), numrange(3.1, 4.0)); +select range_adjacent(numrange(2.0, 3.0), numrange(3.1, null)); +select numrange(2.0, 3.0, '[]') -|- numrange(3.0, 4.0, '()'); +select numrange(1.0, 2.0) -|- numrange(2.0, 3.0,'[]'); +select range_adjacent(numrange(2.0, 3.0, '(]'), numrange(1.0, 2.0, '(]')); + +select numrange(1.1, 3.3) <@ numrange(0.1,10.1); +select numrange(0.1, 10.1) <@ numrange(1.1,3.3); + +select numrange(1.1, 2.2) - numrange(2.0, 3.0); +select numrange(1.1, 2.2) - numrange(2.2, 3.0); +select numrange(1.1, 2.2,'[]') - numrange(2.0, 3.0); +select range_minus(numrange(10.1,12.2,'[]'), numrange(110.0,120.2,'(]')); +select range_minus(numrange(10.1,12.2,'[]'), numrange(0.0,120.2,'(]')); + +select numrange(4.5, 5.5, '[]') && numrange(5.5, 6.5); +select numrange(1.0, 2.0) << numrange(3.0, 4.0); +select numrange(1.0, 3.0,'[]') << numrange(3.0, 4.0,'[]'); +select numrange(1.0, 3.0,'()') << numrange(3.0, 4.0,'()'); +select numrange(1.0, 2.0) >> numrange(3.0, 4.0); +select numrange(3.0, 70.0) &< numrange(6.6, 100.0); + +select numrange(1.1, 2.2) < numrange(1.0, 200.2); +select numrange(1.1, 2.2) < numrange(1.1, 1.2); + +select numrange(1.0, 2.0) + numrange(2.0, 3.0); +select numrange(1.0, 2.0) + numrange(1.5, 3.0); +select numrange(1.0, 2.0) + numrange(2.5, 3.0); -- should fail + +select range_merge(numrange(1.0, 2.0), numrange(2.0, 3.0)); +select range_merge(numrange(1.0, 2.0), numrange(1.5, 3.0)); +select range_merge(numrange(1.0, 2.0), numrange(2.5, 3.0)); -- shouldn't fail + +select numrange(1.0, 2.0) * numrange(2.0, 3.0); +select numrange(1.0, 2.0) * numrange(1.5, 3.0); +select numrange(1.0, 2.0) * numrange(2.5, 3.0); + +select range_intersect_agg(nr) from numrange_test; +select range_intersect_agg(nr) from numrange_test where false; +select range_intersect_agg(nr) from numrange_test where nr @> 4.0; + +analyze numrange_test; + +create table numrange_test2(nr numrange); +create index numrange_test2_hash_idx on numrange_test2 using hash (nr); + +INSERT INTO numrange_test2 VALUES('[, 5)'); +INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2)); +INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2)); +INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2,'()')); +INSERT INTO numrange_test2 VALUES('empty'); + +select * from numrange_test2 where nr = 'empty'::numrange; +select * from numrange_test2 where nr = numrange(1.1, 2.2); +select * from numrange_test2 where nr = numrange(1.1, 2.3); + +set enable_nestloop=t; +set enable_hashjoin=f; +set enable_mergejoin=f; +select * from numrange_test natural join numrange_test2 order by nr; +set enable_nestloop=f; +set enable_hashjoin=t; +set enable_mergejoin=f; +select * from numrange_test natural join numrange_test2 order by nr; +set enable_nestloop=f; +set enable_hashjoin=f; +set enable_mergejoin=t; +select * from numrange_test natural join numrange_test2 order by nr; + +set enable_nestloop to default; +set enable_hashjoin to default; +set enable_mergejoin to default; + +-- keep numrange_test around to help exercise dump/reload +DROP TABLE numrange_test2; + +-- +-- Apply a subset of the above tests on a collatable type, too +-- + +CREATE TABLE textrange_test (tr textrange); +create index textrange_test_btree on textrange_test(tr); + +INSERT INTO textrange_test VALUES('[,)'); +INSERT INTO textrange_test VALUES('["a",]'); +INSERT INTO textrange_test VALUES('[,"q")'); +INSERT INTO textrange_test VALUES(textrange('b', 'g')); +INSERT INTO textrange_test VALUES('empty'); +INSERT INTO textrange_test VALUES(textrange('d', 'd', '[]')); + +SELECT tr, isempty(tr), lower(tr), upper(tr) FROM textrange_test; +SELECT tr, lower_inc(tr), lower_inf(tr), upper_inc(tr), upper_inf(tr) FROM textrange_test; + +SELECT * FROM textrange_test WHERE range_contains(tr, textrange('f', 'fx')); +SELECT * FROM textrange_test WHERE tr @> textrange('a', 'z'); +SELECT * FROM textrange_test WHERE range_contained_by(textrange('0','9'), tr); +SELECT * FROM textrange_test WHERE 'e'::text <@ tr; + +select * from textrange_test where tr = 'empty'; +select * from textrange_test where tr = '("b","g")'; +select * from textrange_test where tr = '["b","g")'; +select * from textrange_test where tr < 'empty'; + + +-- test canonical form for int4range +select int4range(1, 10, '[]'); +select int4range(1, 10, '[)'); +select int4range(1, 10, '(]'); +select int4range(1, 10, '()'); +select int4range(1, 2, '()'); + +-- test canonical form for daterange +select daterange('2000-01-10'::date, '2000-01-20'::date, '[]'); +select daterange('2000-01-10'::date, '2000-01-20'::date, '[)'); +select daterange('2000-01-10'::date, '2000-01-20'::date, '(]'); +select daterange('2000-01-10'::date, '2000-01-20'::date, '()'); +select daterange('2000-01-10'::date, '2000-01-11'::date, '()'); +select daterange('2000-01-10'::date, '2000-01-11'::date, '(]'); +select daterange('-infinity'::date, '2000-01-01'::date, '()'); +select daterange('-infinity'::date, '2000-01-01'::date, '[)'); +select daterange('2000-01-01'::date, 'infinity'::date, '[)'); +select daterange('2000-01-01'::date, 'infinity'::date, '[]'); + +-- test GiST index that's been built incrementally +create table test_range_gist(ir int4range); +create index test_range_gist_idx on test_range_gist using gist (ir); + +insert into test_range_gist select int4range(g, g+10) from generate_series(1,2000) g; +insert into test_range_gist select 'empty'::int4range from generate_series(1,500) g; +insert into test_range_gist select int4range(g, g+10000) from generate_series(1,1000) g; +insert into test_range_gist select 'empty'::int4range from generate_series(1,500) g; +insert into test_range_gist select int4range(NULL,g*10,'(]') from generate_series(1,100) g; +insert into test_range_gist select int4range(g*10,NULL,'(]') from generate_series(1,100) g; +insert into test_range_gist select int4range(g, g+10) from generate_series(1,2000) g; + +-- test statistics and selectivity estimation as well +-- +-- We don't check the accuracy of selectivity estimation, but at least check +-- it doesn't fall. +analyze test_range_gist; + +-- first, verify non-indexed results +SET enable_seqscan = t; +SET enable_indexscan = f; +SET enable_bitmapscan = f; + +select count(*) from test_range_gist where ir @> 'empty'::int4range; +select count(*) from test_range_gist where ir = int4range(10,20); +select count(*) from test_range_gist where ir @> 10; +select count(*) from test_range_gist where ir @> int4range(10,20); +select count(*) from test_range_gist where ir && int4range(10,20); +select count(*) from test_range_gist where ir <@ int4range(10,50); +select count(*) from test_range_gist where ir << int4range(100,500); +select count(*) from test_range_gist where ir >> int4range(100,500); +select count(*) from test_range_gist where ir &< int4range(100,500); +select count(*) from test_range_gist where ir &> int4range(100,500); +select count(*) from test_range_gist where ir -|- int4range(100,500); +select count(*) from test_range_gist where ir @> '{}'::int4multirange; +select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40)); +select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange; +select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange; +select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500)); + +-- now check same queries using index +SET enable_seqscan = f; +SET enable_indexscan = t; +SET enable_bitmapscan = f; + +select count(*) from test_range_gist where ir @> 'empty'::int4range; +select count(*) from test_range_gist where ir = int4range(10,20); +select count(*) from test_range_gist where ir @> 10; +select count(*) from test_range_gist where ir @> int4range(10,20); +select count(*) from test_range_gist where ir && int4range(10,20); +select count(*) from test_range_gist where ir <@ int4range(10,50); +select count(*) from test_range_gist where ir << int4range(100,500); +select count(*) from test_range_gist where ir >> int4range(100,500); +select count(*) from test_range_gist where ir &< int4range(100,500); +select count(*) from test_range_gist where ir &> int4range(100,500); +select count(*) from test_range_gist where ir -|- int4range(100,500); +select count(*) from test_range_gist where ir @> '{}'::int4multirange; +select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40)); +select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange; +select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange; +select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500)); + +-- now check same queries using a bulk-loaded index +drop index test_range_gist_idx; +create index test_range_gist_idx on test_range_gist using gist (ir); + +select count(*) from test_range_gist where ir @> 'empty'::int4range; +select count(*) from test_range_gist where ir = int4range(10,20); +select count(*) from test_range_gist where ir @> 10; +select count(*) from test_range_gist where ir @> int4range(10,20); +select count(*) from test_range_gist where ir && int4range(10,20); +select count(*) from test_range_gist where ir <@ int4range(10,50); +select count(*) from test_range_gist where ir << int4range(100,500); +select count(*) from test_range_gist where ir >> int4range(100,500); +select count(*) from test_range_gist where ir &< int4range(100,500); +select count(*) from test_range_gist where ir &> int4range(100,500); +select count(*) from test_range_gist where ir -|- int4range(100,500); +select count(*) from test_range_gist where ir @> '{}'::int4multirange; +select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40)); +select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange; +select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange; +select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500)); +select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500)); + +-- test SP-GiST index that's been built incrementally +create table test_range_spgist(ir int4range); +create index test_range_spgist_idx on test_range_spgist using spgist (ir); + +insert into test_range_spgist select int4range(g, g+10) from generate_series(1,2000) g; +insert into test_range_spgist select 'empty'::int4range from generate_series(1,500) g; +insert into test_range_spgist select int4range(g, g+10000) from generate_series(1,1000) g; +insert into test_range_spgist select 'empty'::int4range from generate_series(1,500) g; +insert into test_range_spgist select int4range(NULL,g*10,'(]') from generate_series(1,100) g; +insert into test_range_spgist select int4range(g*10,NULL,'(]') from generate_series(1,100) g; +insert into test_range_spgist select int4range(g, g+10) from generate_series(1,2000) g; + +-- first, verify non-indexed results +SET enable_seqscan = t; +SET enable_indexscan = f; +SET enable_bitmapscan = f; + +select count(*) from test_range_spgist where ir @> 'empty'::int4range; +select count(*) from test_range_spgist where ir = int4range(10,20); +select count(*) from test_range_spgist where ir @> 10; +select count(*) from test_range_spgist where ir @> int4range(10,20); +select count(*) from test_range_spgist where ir && int4range(10,20); +select count(*) from test_range_spgist where ir <@ int4range(10,50); +select count(*) from test_range_spgist where ir << int4range(100,500); +select count(*) from test_range_spgist where ir >> int4range(100,500); +select count(*) from test_range_spgist where ir &< int4range(100,500); +select count(*) from test_range_spgist where ir &> int4range(100,500); +select count(*) from test_range_spgist where ir -|- int4range(100,500); + +-- now check same queries using index +SET enable_seqscan = f; +SET enable_indexscan = t; +SET enable_bitmapscan = f; + +select count(*) from test_range_spgist where ir @> 'empty'::int4range; +select count(*) from test_range_spgist where ir = int4range(10,20); +select count(*) from test_range_spgist where ir @> 10; +select count(*) from test_range_spgist where ir @> int4range(10,20); +select count(*) from test_range_spgist where ir && int4range(10,20); +select count(*) from test_range_spgist where ir <@ int4range(10,50); +select count(*) from test_range_spgist where ir << int4range(100,500); +select count(*) from test_range_spgist where ir >> int4range(100,500); +select count(*) from test_range_spgist where ir &< int4range(100,500); +select count(*) from test_range_spgist where ir &> int4range(100,500); +select count(*) from test_range_spgist where ir -|- int4range(100,500); + +-- now check same queries using a bulk-loaded index +drop index test_range_spgist_idx; +create index test_range_spgist_idx on test_range_spgist using spgist (ir); + +select count(*) from test_range_spgist where ir @> 'empty'::int4range; +select count(*) from test_range_spgist where ir = int4range(10,20); +select count(*) from test_range_spgist where ir @> 10; +select count(*) from test_range_spgist where ir @> int4range(10,20); +select count(*) from test_range_spgist where ir && int4range(10,20); +select count(*) from test_range_spgist where ir <@ int4range(10,50); +select count(*) from test_range_spgist where ir << int4range(100,500); +select count(*) from test_range_spgist where ir >> int4range(100,500); +select count(*) from test_range_spgist where ir &< int4range(100,500); +select count(*) from test_range_spgist where ir &> int4range(100,500); +select count(*) from test_range_spgist where ir -|- int4range(100,500); + +-- test index-only scans +explain (costs off) +select ir from test_range_spgist where ir -|- int4range(10,20) order by ir; +select ir from test_range_spgist where ir -|- int4range(10,20) order by ir; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; + +-- test elem <@ range operator +create table test_range_elem(i int4); +create index test_range_elem_idx on test_range_elem (i); +insert into test_range_elem select i from generate_series(1,100) i; + +SET enable_seqscan = f; + +select count(*) from test_range_elem where i <@ int4range(10,50); + +-- also test spgist index on anyrange expression +create index on test_range_elem using spgist(int4range(i,i+10)); +explain (costs off) +select count(*) from test_range_elem where int4range(i,i+10) <@ int4range(10,30); +select count(*) from test_range_elem where int4range(i,i+10) <@ int4range(10,30); + +RESET enable_seqscan; + +drop table test_range_elem; + +-- +-- Btree_gist is not included by default, so to test exclusion +-- constraints with range types, use singleton int ranges for the "=" +-- portion of the constraint. +-- + +create table test_range_excl( + room int4range, + speaker int4range, + during tsrange, + exclude using gist (room with =, during with &&), + exclude using gist (speaker with =, during with &&) +); + +insert into test_range_excl + values(int4range(123, 123, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:00, 2010-01-02 11:00)'); +insert into test_range_excl + values(int4range(123, 123, '[]'), int4range(2, 2, '[]'), '[2010-01-02 11:00, 2010-01-02 12:00)'); +insert into test_range_excl + values(int4range(123, 123, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)'); +insert into test_range_excl + values(int4range(124, 124, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:10)'); +insert into test_range_excl + values(int4range(125, 125, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)'); + +-- test bigint ranges +select int8range(10000000000::int8, 20000000000::int8,'(]'); +-- test tstz ranges +set timezone to '-08'; +select '[2010-01-01 01:00:00 -05, 2010-01-01 02:00:00 -08)'::tstzrange; +-- should fail +select '[2010-01-01 01:00:00 -08, 2010-01-01 02:00:00 -05)'::tstzrange; +set timezone to default; + +-- +-- Test user-defined range of floats +-- + +--should fail +create type float8range as range (subtype=float8, subtype_diff=float4mi); + +--should succeed +create type float8range as range (subtype=float8, subtype_diff=float8mi); +select '[123.001, 5.e9)'::float8range @> 888.882::float8; +create table float8range_test(f8r float8range, i int); +insert into float8range_test values(float8range(-100.00007, '1.111113e9'), 42); +select * from float8range_test; +drop table float8range_test; + +-- +-- Test range types over domains +-- + +create domain mydomain as int4; +create type mydomainrange as range(subtype=mydomain); +select '[4,50)'::mydomainrange @> 7::mydomain; +drop domain mydomain; -- fail +drop domain mydomain cascade; + +-- +-- Test domains over range types +-- + +create domain restrictedrange as int4range check (upper(value) < 10); +select '[4,5)'::restrictedrange @> 7; +select '[4,50)'::restrictedrange @> 7; -- should fail +drop domain restrictedrange; + +-- +-- Test multiple range types over the same subtype +-- + +create type textrange1 as range(subtype=text, collation="C"); +create type textrange2 as range(subtype=text, collation="C"); + +select textrange1('a','Z') @> 'b'::text; +select textrange2('a','z') @> 'b'::text; + +drop type textrange1; +drop type textrange2; + +-- +-- Test polymorphic type system +-- + +create function anyarray_anyrange_func(a anyarray, r anyrange) + returns anyelement as 'select $1[1] + lower($2);' language sql; + +select anyarray_anyrange_func(ARRAY[1,2], int4range(10,20)); + +-- should fail +select anyarray_anyrange_func(ARRAY[1,2], numrange(10,20)); + +drop function anyarray_anyrange_func(anyarray, anyrange); + +-- should fail +create function bogus_func(anyelement) + returns anyrange as 'select int4range(1,10)' language sql; + +-- should fail +create function bogus_func(int) + returns anyrange as 'select int4range(1,10)' language sql; + +create function range_add_bounds(anyrange) + returns anyelement as 'select lower($1) + upper($1)' language sql; + +select range_add_bounds(int4range(1, 17)); +select range_add_bounds(numrange(1.0001, 123.123)); + +create function rangetypes_sql(q anyrange, b anyarray, out c anyelement) + as $$ select upper($1) + $2[1] $$ + language sql; + +select rangetypes_sql(int4range(1,10), ARRAY[2,20]); +select rangetypes_sql(numrange(1,10), ARRAY[2,20]); -- match failure + +create function anycompatiblearray_anycompatiblerange_func(a anycompatiblearray, r anycompatiblerange) + returns anycompatible as 'select $1[1] + lower($2);' language sql; + +select anycompatiblearray_anycompatiblerange_func(ARRAY[1,2], int4range(10,20)); + +select anycompatiblearray_anycompatiblerange_func(ARRAY[1,2], numrange(10,20)); + +-- should fail +select anycompatiblearray_anycompatiblerange_func(ARRAY[1.1,2], int4range(10,20)); + +drop function anycompatiblearray_anycompatiblerange_func(anycompatiblearray, anycompatiblerange); + +-- should fail +create function bogus_func(anycompatible) + returns anycompatiblerange as 'select int4range(1,10)' language sql; + +-- +-- Arrays of ranges +-- + +select ARRAY[numrange(1.1, 1.2), numrange(12.3, 155.5)]; + +create table i8r_array (f1 int, f2 int8range[]); +insert into i8r_array values (42, array[int8range(1,10), int8range(2,20)]); +select * from i8r_array; +drop table i8r_array; + +-- +-- Ranges of arrays +-- + +create type arrayrange as range (subtype=int4[]); + +select arrayrange(ARRAY[1,2], ARRAY[2,1]); +select arrayrange(ARRAY[2,1], ARRAY[1,2]); -- fail + +select array[1,1] <@ arrayrange(array[1,2], array[2,1]); +select array[1,3] <@ arrayrange(array[1,2], array[2,1]); + +-- +-- Ranges of composites +-- + +create type two_ints as (a int, b int); +create type two_ints_range as range (subtype = two_ints); + +-- with force_parallel_mode on, this exercises tqueue.c's range remapping +select *, row_to_json(upper(t)) as u from + (values (two_ints_range(row(1,2), row(3,4))), + (two_ints_range(row(5,6), row(7,8)))) v(t); + +-- this must be rejected to avoid self-inclusion issues: +alter type two_ints add attribute c two_ints_range; + +drop type two_ints cascade; + +-- +-- Check behavior when subtype lacks a hash function +-- + +create type cashrange as range (subtype = money); + +set enable_sort = off; -- try to make it pick a hash setop implementation + +select '(2,5)'::cashrange except select '(5,6)'::cashrange; + +reset enable_sort; + +-- +-- OUT/INOUT/TABLE functions +-- + +-- infer anyrange from anyrange +create function outparam_succeed(i anyrange, out r anyrange, out t text) + as $$ select $1, 'foo'::text $$ language sql; + +select * from outparam_succeed(int4range(1,2)); + +create function outparam2_succeed(r anyrange, out lu anyarray, out ul anyarray) + as $$ select array[lower($1), upper($1)], array[upper($1), lower($1)] $$ + language sql; + +select * from outparam2_succeed(int4range(1,11)); + +-- infer anyarray from anyrange +create function outparam_succeed2(i anyrange, out r anyarray, out t text) + as $$ select ARRAY[upper($1)], 'foo'::text $$ language sql; + +select * from outparam_succeed2(int4range(int4range(1,2))); + +-- infer anyelement from anyrange +create function inoutparam_succeed(out i anyelement, inout r anyrange) + as $$ select upper($1), $1 $$ language sql; + +select * from inoutparam_succeed(int4range(1,2)); + +create function table_succeed(r anyrange) + returns table(l anyelement, u anyelement) + as $$ select lower($1), upper($1) $$ + language sql; + +select * from table_succeed(int4range(1,11)); + +-- should fail +create function outparam_fail(i anyelement, out r anyrange, out t text) + as $$ select '[1,10]', 'foo' $$ language sql; + +--should fail +create function inoutparam_fail(inout i anyelement, out r anyrange) + as $$ select $1, '[1,10]' $$ language sql; + +--should fail +create function table_fail(i anyelement) returns table(i anyelement, r anyrange) + as $$ select $1, '[1,10]' $$ language sql; diff --git a/src/test/singlenode_regress/sql/regex.linux.utf8.sql b/src/test/singlenode_regress/sql/regex.linux.utf8.sql new file mode 100644 index 00000000000..45778116452 --- /dev/null +++ b/src/test/singlenode_regress/sql/regex.linux.utf8.sql @@ -0,0 +1,46 @@ +/* + * This test is for Linux/glibc systems and others that implement proper + * locale classification of Unicode characters with high code values. + * It must be run in a database with UTF8 encoding and a Unicode-aware locale. + */ + +SET client_encoding TO UTF8; + +-- +-- Test the "high colormap" logic with single characters and ranges that +-- exceed the MAX_SIMPLE_CHR cutoff, here assumed to be less than U+2000. +-- + +-- trivial cases: +SELECT 'aⓐ' ~ U&'a\24D0' AS t; +SELECT 'aⓐ' ~ U&'a\24D1' AS f; +SELECT 'aⓕ' ~ 'a[ⓐ-ⓩ]' AS t; +SELECT 'aⒻ' ~ 'a[ⓐ-ⓩ]' AS f; +-- cases requiring splitting of ranges: +SELECT 'aⓕⓕ' ~ 'aⓕ[ⓐ-ⓩ]' AS t; +SELECT 'aⓕⓐ' ~ 'aⓕ[ⓐ-ⓩ]' AS t; +SELECT 'aⓐⓕ' ~ 'aⓕ[ⓐ-ⓩ]' AS f; +SELECT 'aⓕⓕ' ~ 'a[ⓐ-ⓩ]ⓕ' AS t; +SELECT 'aⓕⓐ' ~ 'a[ⓐ-ⓩ]ⓕ' AS f; +SELECT 'aⓐⓕ' ~ 'a[ⓐ-ⓩ]ⓕ' AS t; +SELECT 'aⒶⓜ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; +SELECT 'aⓜⓜ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; +SELECT 'aⓜⓩ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; +SELECT 'aⓩⓩ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS f; +SELECT 'aⓜ⓪' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS f; +SELECT 'a0' ~ 'a[a-ⓩ]' AS f; +SELECT 'aq' ~ 'a[a-ⓩ]' AS t; +SELECT 'aⓜ' ~ 'a[a-ⓩ]' AS t; +SELECT 'a⓪' ~ 'a[a-ⓩ]' AS f; + +-- Locale-dependent character classes + +SELECT 'aⒶⓜ⓪' ~ '[[:alpha:]][[:alpha:]][[:alpha:]][[:graph:]]' AS t; +SELECT 'aⒶⓜ⓪' ~ '[[:alpha:]][[:alpha:]][[:alpha:]][[:alpha:]]' AS f; + +-- Locale-dependent character classes with high ranges + +SELECT 'aⒶⓜ⓪' ~ '[a-z][[:alpha:]][ⓐ-ⓩ][[:graph:]]' AS t; +SELECT 'aⓜⒶ⓪' ~ '[a-z][[:alpha:]][ⓐ-ⓩ][[:graph:]]' AS f; +SELECT 'aⓜⒶ⓪' ~ '[a-z][ⓐ-ⓩ][[:alpha:]][[:graph:]]' AS t; +SELECT 'aⒶⓜ⓪' ~ '[a-z][ⓐ-ⓩ][[:alpha:]][[:graph:]]' AS f; diff --git a/src/test/singlenode_regress/sql/regex.sql b/src/test/singlenode_regress/sql/regex.sql new file mode 100644 index 00000000000..56217104ce6 --- /dev/null +++ b/src/test/singlenode_regress/sql/regex.sql @@ -0,0 +1,158 @@ +-- +-- Regular expression tests +-- + +-- Don't want to have to double backslashes in regexes +set standard_conforming_strings = on; + +-- Test simple quantified backrefs +select 'bbbbb' ~ '^([bc])\1*$' as t; +select 'ccc' ~ '^([bc])\1*$' as t; +select 'xxx' ~ '^([bc])\1*$' as f; +select 'bbc' ~ '^([bc])\1*$' as f; +select 'b' ~ '^([bc])\1*$' as t; + +-- Test quantified backref within a larger expression +select 'abc abc abc' ~ '^(\w+)( \1)+$' as t; +select 'abc abd abc' ~ '^(\w+)( \1)+$' as f; +select 'abc abc abd' ~ '^(\w+)( \1)+$' as f; +select 'abc abc abc' ~ '^(.+)( \1)+$' as t; +select 'abc abd abc' ~ '^(.+)( \1)+$' as f; +select 'abc abc abd' ~ '^(.+)( \1)+$' as f; + +-- Test some cases that crashed in 9.2beta1 due to pmatch[] array overrun +select substring('asd TO foo' from ' TO (([a-z0-9._]+|"([^"]+|"")+")+)'); +select substring('a' from '((a))+'); +select substring('a' from '((a)+)'); + +-- Test regexp_match() +select regexp_match('abc', ''); +select regexp_match('abc', 'bc'); +select regexp_match('abc', 'd') is null; +select regexp_match('abc', '(B)(c)', 'i'); +select regexp_match('abc', 'Bd', 'ig'); -- error + +-- Test lookahead constraints +select regexp_matches('ab', 'a(?=b)b*'); +select regexp_matches('a', 'a(?=b)b*'); +select regexp_matches('abc', 'a(?=b)b*(?=c)c*'); +select regexp_matches('ab', 'a(?=b)b*(?=c)c*'); +select regexp_matches('ab', 'a(?!b)b*'); +select regexp_matches('a', 'a(?!b)b*'); +select regexp_matches('b', '(?=b)b'); +select regexp_matches('a', '(?=b)b'); + +-- Test lookbehind constraints +select regexp_matches('abb', '(?<=a)b*'); +select regexp_matches('a', 'a(?<=a)b*'); +select regexp_matches('abc', 'a(?<=a)b*(?<=b)c*'); +select regexp_matches('ab', 'a(?<=a)b*(?<=b)c*'); +select regexp_matches('ab', 'a*(? 0; + +SELECT reloptions FROM pg_class WHERE oid = + (SELECT reltoastrelid FROM pg_class + WHERE oid = 'reloptions_test'::regclass); + +ALTER TABLE reloptions_test RESET (vacuum_truncate); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; +INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL); +-- Do an aggressive vacuum to prevent page-skipping. +VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) reloptions_test; +SELECT pg_relation_size('reloptions_test') = 0; + +-- Test toast.* options +DROP TABLE reloptions_test; + +CREATE TABLE reloptions_test (s VARCHAR) + WITH (toast.autovacuum_vacuum_cost_delay = 23); +SELECT reltoastrelid as toast_oid + FROM pg_class WHERE oid = 'reloptions_test'::regclass \gset +SELECT reloptions FROM pg_class WHERE oid = :toast_oid; + +ALTER TABLE reloptions_test SET (toast.autovacuum_vacuum_cost_delay = 24); +SELECT reloptions FROM pg_class WHERE oid = :toast_oid; + +ALTER TABLE reloptions_test RESET (toast.autovacuum_vacuum_cost_delay); +SELECT reloptions FROM pg_class WHERE oid = :toast_oid; + +-- Fail on non-existent options in toast namespace +CREATE TABLE reloptions_test2 (i int) WITH (toast.not_existing_option = 42); + +-- Mix TOAST & heap +DROP TABLE reloptions_test; + +CREATE TABLE reloptions_test (s VARCHAR) WITH + (toast.autovacuum_vacuum_cost_delay = 23, + autovacuum_vacuum_cost_delay = 24, fillfactor = 40); + +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; +SELECT reloptions FROM pg_class WHERE oid = ( + SELECT reltoastrelid FROM pg_class WHERE oid = 'reloptions_test'::regclass); + +-- +-- CREATE INDEX, ALTER INDEX for btrees +-- + +CREATE INDEX reloptions_test_idx ON reloptions_test (s) WITH (fillfactor=30); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test_idx'::regclass; + +-- Fail when option and namespace do not exist +CREATE INDEX reloptions_test_idx ON reloptions_test (s) + WITH (not_existing_option=2); +CREATE INDEX reloptions_test_idx ON reloptions_test (s) + WITH (not_existing_ns.fillfactor=2); + +-- Check allowed ranges +CREATE INDEX reloptions_test_idx2 ON reloptions_test (s) WITH (fillfactor=1); +CREATE INDEX reloptions_test_idx2 ON reloptions_test (s) WITH (fillfactor=130); + +-- Check ALTER +ALTER INDEX reloptions_test_idx SET (fillfactor=40); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test_idx'::regclass; + +-- Check ALTER on empty reloption list +CREATE INDEX reloptions_test_idx3 ON reloptions_test (s); +ALTER INDEX reloptions_test_idx3 SET (fillfactor=40); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test_idx3'::regclass; diff --git a/src/test/singlenode_regress/sql/replica_identity.sql b/src/test/singlenode_regress/sql/replica_identity.sql new file mode 100644 index 00000000000..33da8297132 --- /dev/null +++ b/src/test/singlenode_regress/sql/replica_identity.sql @@ -0,0 +1,104 @@ +CREATE TABLE test_replica_identity ( + id serial primary key, + keya text not null, + keyb text not null, + nonkey text, + CONSTRAINT test_replica_identity_unique_defer UNIQUE (keya, keyb) DEFERRABLE, + CONSTRAINT test_replica_identity_unique_nondefer UNIQUE (keya, keyb) +) ; + +CREATE TABLE test_replica_identity_othertable (id serial primary key); + +CREATE INDEX test_replica_identity_keyab ON test_replica_identity (keya, keyb); +CREATE UNIQUE INDEX test_replica_identity_keyab_key ON test_replica_identity (keya, keyb); +CREATE UNIQUE INDEX test_replica_identity_nonkey ON test_replica_identity (keya, nonkey); +CREATE INDEX test_replica_identity_hash ON test_replica_identity USING hash (nonkey); +CREATE UNIQUE INDEX test_replica_identity_expr ON test_replica_identity (keya, keyb, (3)); +CREATE UNIQUE INDEX test_replica_identity_partial ON test_replica_identity (keya, keyb) WHERE keyb != '3'; + +-- default is 'd'/DEFAULT for user created tables +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; +-- but 'none' for system tables +SELECT relreplident FROM pg_class WHERE oid = 'pg_class'::regclass; +SELECT relreplident FROM pg_class WHERE oid = 'pg_constraint'::regclass; + +---- +-- Make sure we detect ineligible indexes +---- + +-- fail, not unique +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab; +-- fail, not a candidate key, nullable column +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_nonkey; +-- fail, hash indexes cannot do uniqueness +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_hash; +-- fail, expression index +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_expr; +-- fail, partial index +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_partial; +-- fail, not our index +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_othertable_pkey; +-- fail, deferrable +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_unique_defer; + +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + +---- +-- Make sure index cases succeed +---- + +-- succeed, primary key +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_pkey; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; +\d test_replica_identity + +-- succeed, nondeferrable unique constraint over nonnullable cols +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_unique_nondefer; + +-- succeed unique index over nonnullable cols +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab_key; +ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab_key; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; +\d test_replica_identity +SELECT count(*) FROM pg_index WHERE indrelid = 'test_replica_identity'::regclass AND indisreplident; + +---- +-- Make sure non index cases work +---- +ALTER TABLE test_replica_identity REPLICA IDENTITY DEFAULT; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; +SELECT count(*) FROM pg_index WHERE indrelid = 'test_replica_identity'::regclass AND indisreplident; + +ALTER TABLE test_replica_identity REPLICA IDENTITY FULL; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; +\d+ test_replica_identity +ALTER TABLE test_replica_identity REPLICA IDENTITY NOTHING; +SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; + +--- +-- Test that ALTER TABLE rewrite preserves nondefault replica identity +--- + +-- constraint variant +CREATE TABLE test_replica_identity2 (id int UNIQUE NOT NULL); +ALTER TABLE test_replica_identity2 REPLICA IDENTITY USING INDEX test_replica_identity2_id_key; +\d test_replica_identity2 +ALTER TABLE test_replica_identity2 ALTER COLUMN id TYPE bigint; +\d test_replica_identity2 + +-- straight index variant +CREATE TABLE test_replica_identity3 (id int NOT NULL); +CREATE UNIQUE INDEX test_replica_identity3_id_key ON test_replica_identity3 (id); +ALTER TABLE test_replica_identity3 REPLICA IDENTITY USING INDEX test_replica_identity3_id_key; +\d test_replica_identity3 +ALTER TABLE test_replica_identity3 ALTER COLUMN id TYPE bigint; +\d test_replica_identity3 + +-- ALTER TABLE DROP NOT NULL is not allowed for columns part of an index +-- used as replica identity. +ALTER TABLE test_replica_identity3 ALTER COLUMN id DROP NOT NULL; + +DROP TABLE test_replica_identity; +DROP TABLE test_replica_identity2; +DROP TABLE test_replica_identity3; +DROP TABLE test_replica_identity_othertable; diff --git a/src/test/singlenode_regress/sql/resource_queue.sql b/src/test/singlenode_regress/sql/resource_queue.sql new file mode 100644 index 00000000000..cec46983f47 --- /dev/null +++ b/src/test/singlenode_regress/sql/resource_queue.sql @@ -0,0 +1,413 @@ +-- SQL coverage of RESOURCE QUEUE + +CREATE RESOURCE QUEUE regressq ACTIVE THRESHOLD 1; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq ACTIVE THRESHOLD 2 COST THRESHOLD 2000.00; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq COST THRESHOLD 3000.00 OVERCOMMIT; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq COST THRESHOLD 4e+3 NOOVERCOMMIT; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +COMMENT ON RESOURCE QUEUE regressq IS 'regressq comment'; +DROP RESOURCE QUEUE regressq; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + + +-- more coverage +CREATE RESOURCE QUEUE regressq ACTIVE THRESHOLD 1 WITH (max_cost=2000); +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq ACTIVE THRESHOLD 1 WITHOUT (max_cost); +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq ACTIVE THRESHOLD 1 WITH (max_cost=2000) +WITHOUT (overcommit); -- negative +ALTER RESOURCE QUEUE regressq ACTIVE THRESHOLD 1 WITH (max_cost=2000) +WITHOUT (cost_overcommit); -- works +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq OVERCOMMIT WITH (max_cost=2000); +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq IGNORE THRESHOLD 1 WITHOUT (max_cost); +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq WITH (priority=high); +SELECT * FROM pg_resqueue_attributes WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq WITH (priority='MeDiUm'); +SELECT * FROM pg_resqueue_attributes WHERE rsqname='regressq'; +ALTER RESOURCE QUEUE regressq; +DROP RESOURCE QUEUE regressq; +SELECT rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit FROM pg_resqueue WHERE rsqname='regressq'; + +-- negative + +CREATE RESOURCE QUEUE regressq2; +CREATE RESOURCE QUEUE none ACTIVE THRESHOLD 2; +; +CREATE RESOURCE QUEUE regressq2 ACTIVE THRESHOLD 2; +ALTER RESOURCE QUEUE regressq2 ACTIVE THRESHOLD -10; +ALTER RESOURCE QUEUE regressq2 COST THRESHOLD -1000.00; +ALTER RESOURCE QUEUE regressq2 WITH(max_cost=20,max_cost=21); +ALTER RESOURCE QUEUE regressq2 WITH(PRIORITY=funky); +ALTER RESOURCE QUEUE regressq2 WITHOUT(PRIORITY); +DROP RESOURCE QUEUE regressq2; + +CREATE RESOURCE QUEUE regressq2 ACTIVE THRESHOLD -10; +CREATE RESOURCE QUEUE regressq2 COST THRESHOLD -1000.00; +CREATE RESOURCE QUEUE regressq2 IGNORE THRESHOLD -10; + +CREATE RESOURCE QUEUE regressq2 ACTIVE THRESHOLD 2 ACTIVE THRESHOLD 2; +CREATE RESOURCE QUEUE regressq2 COST THRESHOLD 2 COST THRESHOLD 2; +CREATE RESOURCE QUEUE regressq2 OVERCOMMIT OVERCOMMIT; +CREATE RESOURCE QUEUE regressq2 OVERCOMMIT NOOVERCOMMIT; +CREATE RESOURCE QUEUE regressq2 IGNORE THRESHOLD 1 IGNORE THRESHOLD 1 ; + +CREATE RESOURCE QUEUE regressq2 WITH (WITHLISTSTART=funky); + +CREATE RESOURCE QUEUE regressq2 ACTIVE THRESHOLD 2; +ALTER RESOURCE QUEUE regressq2 ACTIVE THRESHOLD 2 ACTIVE THRESHOLD 2; +ALTER RESOURCE QUEUE regressq2 COST THRESHOLD 2 COST THRESHOLD 2; +ALTER RESOURCE QUEUE regressq2 OVERCOMMIT OVERCOMMIT; +ALTER RESOURCE QUEUE regressq2 OVERCOMMIT NOOVERCOMMIT; +ALTER RESOURCE QUEUE regressq2 IGNORE THRESHOLD 1 IGNORE THRESHOLD 1 ; + +ALTER RESOURCE QUEUE none IGNORE THRESHOLD 1 ; +DROP RESOURCE QUEUE regressq2; + +-- Create resource queue with cost_overcommit=true +create resource queue t3_test_q with (active_statements = 6,max_cost=5e+06 ,cost_overcommit=true, min_cost=50000); +select rsqname, rsqcountlimit, rsqcostlimit, rsqovercommit, rsqignorecostlimit from pg_resqueue where rsqname='t3_test_q'; +drop resource queue t3_test_q; + + +-- Resource Queue should not be created inside Transaction block the error is the expected behavior +begin; +CREATE RESOURCE QUEUE db_resque_new1 ACTIVE THRESHOLD 2 COST THRESHOLD 2000.00; +end; + +-- +-- memory quota feature +-- + +-- negative + +create resource queue test_rq with (max_cost=2000000, memory_limit='1gB'); -- should error out +create resource queue test_rq with (max_cost=2000000, memory_limit='0'); -- should error out + +-- Creates and drops + +create resource queue test_rq with (active_statements=2); +drop resource queue test_rq; +create resource queue test_rq with (active_statements=2, memory_limit='1024MB'); + +-- +-- CPU priority feature +-- +create resource queue test_rq_cpu with (active_statements=2, priority='HIGH'); +create user test_rp_user with login; +alter role test_rp_user resource queue test_rq_cpu; +SET ROLE test_rp_user; +-- query priority and weight on master +select rqppriority, rqpweight from gp_toolkit.gp_resq_priority_backend where rqpsession in (select sess_id from pg_stat_activity where pid = pg_backend_pid()); +-- start_ignore +-- query priority and weight on segments +select rqppriority, rqpweight from gp_dist_random('gp_toolkit.gp_resq_priority_backend') where rqpsession in (select sess_id from pg_stat_activity where pid = pg_backend_pid()); +-- end_ignore +RESET ROLE; +drop user test_rp_user; +drop resource queue test_rq_cpu; + +-- Alters + +alter resource queue test_rq with (memory_limit='1024mb'); +alter resource queue test_rq with (memory_limit='1024Kb'); +alter resource queue test_rq with (memory_limit='2GB'); +alter resource queue test_rq without (memory_limit); + +drop resource queue test_rq; + +-- SQL coverage of ROLE -> RESOURCE QUEUE + +CREATE RESOURCE QUEUE reg_activeq ACTIVE THRESHOLD 2; +CREATE RESOURCE QUEUE reg_costq COST THRESHOLD 30000.00; +CREATE USER reg_u1 RESOURCE QUEUE reg_costq; +GRANT SELECT ON tenk1 TO reg_u1; +SELECT u.rolname, u.rolsuper, r.rsqname FROM pg_roles as u, pg_resqueue as r WHERE u.rolresqueue=r.oid and rolname='reg_u1'; +ALTER USER reg_u1 RESOURCE QUEUE reg_activeq; +SELECT u.rolname, u.rolsuper, r.rsqname FROM pg_roles as u, pg_resqueue as r WHERE u.rolresqueue=r.oid and rolname='reg_u1'; +CREATE USER reg_u2 RESOURCE QUEUE reg_activeq; +GRANT SELECT ON tenk1 TO reg_u2; +SELECT u.rolname, u.rolsuper, r.rsqname FROM pg_roles as u, pg_resqueue as r WHERE u.rolresqueue=r.oid and r.rsqname='reg_activeq'; + +-- negative + +CREATE USER reg_u3 RESOURCE QUEUE bogusq; + +-- feature must be on for tests to be valid +show resource_scheduler; + +-- switch to a non privileged user for next tests +SET SESSION AUTHORIZATION reg_u1; + +-- self deadlock (active queue threshold 2) +BEGIN; +DECLARE c1 CURSOR FOR SELECT 1 FROM tenk1; +DECLARE c2 CURSOR FOR SELECT 2 FROM tenk1; +DECLARE c3 CURSOR FOR SELECT 3 FROM tenk1; -- should detect deadlock +END; + +-- track cursor open/close count (should not deadlock) +BEGIN; +DECLARE c1 CURSOR FOR SELECT 1 FROM tenk1; +CLOSE c1; +DECLARE c2 CURSOR FOR SELECT 2 FROM tenk1; +DECLARE c3 CURSOR FOR SELECT 3 FROM tenk1; +CLOSE c3; +DECLARE c4 CURSOR FOR SELECT 4 FROM tenk1; +FETCH c4; +END; + +-- switch to a cost-limited queue +RESET SESSION AUTHORIZATION; +ALTER USER reg_u2 RESOURCE QUEUE reg_costq; +SET SESSION AUTHORIZATION reg_u2; +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM tenk1; +SELECT rsqname, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; +DECLARE c2 CURSOR FOR SELECT * FROM tenk1 a NATURAL JOIN tenk1 b; +SELECT rsqname, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; +CLOSE c1; +CLOSE c2; +END; + +-- rsqcostvalue should go back to 0 when queue is empty (MPP-3578) +SELECT rsqname, rsqholders FROM pg_resqueue_status where rsqcostvalue != 0 or rsqcountvalue != 0 or rsqholders != 0; + +-- MPP-3796. When a cursor exceeds the cost limit and the transaction is +-- aborted, resources which had already been granted to other cursors should +-- be released. Here there are no other concurrent transactions sharing the +-- queue, so rsqcostvalue should go back to 0. +BEGIN; +DECLARE c1 CURSOR FOR SELECT * FROM tenk1; +SELECT rsqname, rsqcostlimit, rsqwaiters, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; +DECLARE c2 CURSOR FOR SELECT * FROM tenk1; +SELECT rsqname, rsqcostlimit, rsqwaiters, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; +DECLARE c3 CURSOR FOR SELECT * FROM tenk1 a, tenk1 b; +SELECT rsqname, rsqcostlimit, rsqwaiters, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; +DECLARE c4 CURSOR FOR SELECT * FROM tenk1 a, tenk1 b, tenk1 c; +SELECT rsqname, rsqcostlimit, rsqwaiters, rsqholders FROM pg_resqueue_status WHERE rsqcostvalue > 0; +END; +SELECT rsqname, rsqholders FROM pg_resqueue_status where rsqcostvalue != 0 or rsqcountvalue != 0 or rsqholders != 0; -- 1 row expected + +-- return to the super user +RESET SESSION AUTHORIZATION; + +-- reset session to super user. make sure no longer queued +BEGIN; +DECLARE c1 CURSOR FOR SELECT 1 FROM tenk1; +DECLARE c2 CURSOR FOR SELECT 2 FROM tenk1; +DECLARE c3 CURSOR FOR SELECT 3 FROM tenk1; -- should not deadlock, we are SU. +END; + +-- cleanup + +DROP OWNED BY reg_u1, reg_u2 CASCADE; +DROP USER reg_u1; +DROP USER reg_u2; +DROP RESOURCE QUEUE reg_activeq; +DROP RESOURCE QUEUE reg_costq; + +-- catalog tests +set optimizer_enable_master_only_queries = on; +select count(*)/1000 from +(select +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='priority') as "Priority", +(select count(*) from pg_resqueue x,pg_roles y +where x.oid=y.rolresqueue and a.rsqname=x.rsqname) as "RQAssignedUsers" +from ( select distinct rsqname from pg_resqueue_attributes ) a) +as foo; + +select count(*)/1000 from +(select a.rsqname as "RQname", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='active_statements') as "ActiveStatment", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='max_cost') as "MaxCost", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='min_cost') as "MinCost", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='cost_overcommit') as "CostOvercommit", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='memory_limit') as "MemoryLimit", +(select ressetting from pg_resqueue_attributes b +where a.rsqname=b.rsqname and resname='priority') as "Priority", +(select count(*) from pg_resqueue x,pg_roles y +where x.oid=y.rolresqueue and a.rsqname=x.rsqname) as "RQAssignedUsers" +from ( select distinct rsqname from pg_resqueue_attributes ) a) +as foo; + +reset optimizer_enable_master_only_queries; + +-- Followup additional tests. +-- MPP-7474 +CREATE RESOURCE QUEUE rq_test_q ACTIVE THRESHOLD 1; +CREATE USER rq_test_u RESOURCE QUEUE rq_test_q; + +create table rq_product ( + pn int not null, + pname text not null, + pcolor text, + primary key (pn) +); + +-- Products +insert into rq_product values + ( 100, 'Sword', 'Black'), + ( 200, 'Dream', 'Black'), + ( 300, 'Castle', 'Grey'), + ( 400, 'Justice', 'Clear'), + ( 500, 'Donuts', 'Plain'), + ( 600, 'Donuts', 'Chocolate'), + ( 700, 'Hamburger', 'Grey'), + ( 800, 'Fries', 'Grey'); + +GRANT SELECT ON rq_product TO rq_test_u; + +set session authorization rq_test_u; + +begin; +declare c0 cursor for select pcolor, pname, pn from rq_product order by 1,2,3; + +fetch c0; +fetch c0; +fetch c0; +select * from rq_product; + +fetch c0; +abort; + +begin; +declare c0 cursor for select pcolor, pname, pn from rq_product order by 1,2,3; + +fetch c0; +fetch c0; +fetch c0; +fetch c0; +select * from rq_product; + +fetch c0; +abort; + +begin; +declare c0 cursor for +select pcolor, pname, pn, + row_number() over (w) as n, + lag(pn+0) over (w) as l0, + lag(pn+1) over (w) as l1, + lag(pn+2) over (w) as l2, + lag(pn+3) over (w) as l3, + lag(pn+4) over (w) as l4, + lag(pn+5) over (w) as l5, + lag(pn+6) over (w) as l6, + lag(pn+7) over (w) as l7, + lag(pn+8) over (w) as l8, + lag(pn+9) over (w) as l9, + lag(pn+10) over (w) as l10, + lag(pn+11) over (w) as l11, + lag(pn+12) over (w) as l12, + lag(pn+13) over (w) as l13, + lag(pn+14) over (w) as l14, + lag(pn+15) over (w) as l15, + lag(pn+16) over (w) as l16, + lag(pn+17) over (w) as l17, + lag(pn+18) over (w) as l18, + lag(pn+19) over (w) as l19, + lag(pn+20) over (w) as l20, + lag(pn+21) over (w) as l21, + lag(pn+22) over (w) as l22, + lag(pn+23) over (w) as l23, + lag(pn+24) over (w) as l24, + lag(pn+25) over (w) as l25, + lag(pn+26) over (w) as l26, + lag(pn+27) over (w) as l27, + lag(pn+28) over (w) as l28, + lag(pn+29) over (w) as l29, + lag(pn+30) over (w) as l30, + lag(pn+31) over (w) as l31, + lag(pn+32) over (w) as l32 +from rq_product +window w as (partition by pcolor order by pname) order by 1,2,3; + +fetch c0; +select * from rq_product; + +fetch c0; +abort; + +begin; +create view window_view as +select pcolor, pname, pn, + row_number() over (w) as n, + lag(pn+0) over (w) as l0, + lag(pn+1) over (w) as l1, + lag(pn+2) over (w) as l2, + lag(pn+3) over (w) as l3, + lag(pn+4) over (w) as l4, + lag(pn+5) over (w) as l5, + lag(pn+6) over (w) as l6, + lag(pn+7) over (w) as l7, + lag(pn+8) over (w) as l8, + lag(pn+9) over (w) as l9, + lag(pn+10) over (w) as l10, + lag(pn+11) over (w) as l11, + lag(pn+12) over (w) as l12, + lag(pn+13) over (w) as l13, + lag(pn+14) over (w) as l14, + lag(pn+15) over (w) as l15, + lag(pn+16) over (w) as l16, + lag(pn+17) over (w) as l17, + lag(pn+18) over (w) as l18, + lag(pn+19) over (w) as l19, + lag(pn+20) over (w) as l20, + lag(pn+21) over (w) as l21, + lag(pn+22) over (w) as l22, + lag(pn+23) over (w) as l23, + lag(pn+24) over (w) as l24, + lag(pn+25) over (w) as l25, + lag(pn+26) over (w) as l26, + lag(pn+27) over (w) as l27, + lag(pn+28) over (w) as l28, + lag(pn+29) over (w) as l29, + lag(pn+30) over (w) as l30, + lag(pn+31) over (w) as l31, + lag(pn+32) over (w) as l32 +from rq_product +window w as (partition by pcolor order by pname); + +DECLARE c0 cursor for select * from window_view order by 1,2,3; +fetch c0; +select * from rq_product; + +fetch c0; +abort; + +RESET SESSION_AUTHORIZATION; + +DROP OWNED BY rq_test_u CASCADE; +DROP USER rq_test_u; +DROP RESOURCE QUEUE rq_test_q; +DROP TABLE rq_product; + +-- Coverage for resource queue error conditions +CREATE ROLE rq_test_oosm_role; +SET ROLE rq_test_oosm_role; +CREATE TABLE rq_test_oosm_table(i int); +INSERT INTO rq_test_oosm_table VALUES(1); +-- Simulate an out-of-shared-memory condition during the course of grabbing a +-- resource queue lock (in ResLockAcquire()). +SELECT gp_inject_fault('res_increment_add_oosm', 'skip', 1); +-- Queries should error out indicating that we have no shared memory left. +SELECT * FROM rq_test_oosm_table; +SELECT gp_inject_fault('res_increment_add_oosm', 'reset', 1); +-- Queries should succeed now. +SELECT * FROM rq_test_oosm_table; +DROP TABLE rq_test_oosm_table; +RESET ROLE; +DROP ROLE rq_test_oosm_role; diff --git a/src/test/singlenode_regress/sql/returning.sql b/src/test/singlenode_regress/sql/returning.sql new file mode 100644 index 00000000000..a460f82fb7c --- /dev/null +++ b/src/test/singlenode_regress/sql/returning.sql @@ -0,0 +1,162 @@ +-- +-- Test INSERT/UPDATE/DELETE RETURNING +-- + +-- Simple cases + +CREATE TEMP TABLE foo (f1 serial, f2 text, f3 int default 42); + +INSERT INTO foo (f2,f3) + VALUES ('test', DEFAULT), ('More', 11), (upper('more'), 7+9) + RETURNING *, f1+f3 AS sum; + +SELECT * FROM foo; + +UPDATE foo SET f2 = lower(f2), f3 = DEFAULT RETURNING foo.*, f1+f3 AS sum13; + +SELECT * FROM foo; + +DELETE FROM foo WHERE f1 > 2 RETURNING f3, f2, f1, least(f1,f3); + +SELECT * FROM foo; + +-- Subplans and initplans in the RETURNING list + +INSERT INTO foo SELECT f1+10, f2, f3+99 FROM foo + RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan, + EXISTS(SELECT * FROM int4_tbl) AS initplan; + +UPDATE foo SET f3 = f3 * 2 + WHERE f1 > 10 + RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan, + EXISTS(SELECT * FROM int4_tbl) AS initplan; + +DELETE FROM foo + WHERE f1 > 10 + RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan, + EXISTS(SELECT * FROM int4_tbl) AS initplan; + +-- Joins + +UPDATE foo SET f3 = f3*2 + FROM int4_tbl i + WHERE foo.f1 + 123455 = i.f1 + RETURNING foo.*, i.f1 as "i.f1"; + +SELECT * FROM foo; + +DELETE FROM foo + USING int4_tbl i + WHERE foo.f1 + 123455 = i.f1 + RETURNING foo.*, i.f1 as "i.f1"; + +SELECT * FROM foo; + +-- Check inheritance cases + +CREATE TEMP TABLE foochild (fc int) INHERITS (foo); + +INSERT INTO foochild VALUES(123,'child',999,-123); + +ALTER TABLE foo ADD COLUMN f4 int8 DEFAULT 99; + +SELECT * FROM foo; +SELECT * FROM foochild; + +UPDATE foo SET f4 = f4 + f3 WHERE f4 = 99 RETURNING *; + +SELECT * FROM foo; +SELECT * FROM foochild; + +UPDATE foo SET f3 = f3*2 + FROM int8_tbl i + WHERE foo.f1 = i.q2 + RETURNING *; + +SELECT * FROM foo; +SELECT * FROM foochild; + +DELETE FROM foo + USING int8_tbl i + WHERE foo.f1 = i.q2 + RETURNING *; + +SELECT * FROM foo; +SELECT * FROM foochild; + +DROP TABLE foochild; + +-- Rules and views + +CREATE TEMP VIEW voo AS SELECT f1, f2 FROM foo; + +CREATE RULE voo_i AS ON INSERT TO voo DO INSTEAD + INSERT INTO foo VALUES(new.*, 57); + +INSERT INTO voo VALUES(11,'zit'); +-- fails: +INSERT INTO voo VALUES(12,'zoo') RETURNING *, f1*2; + +-- fails, incompatible list: +CREATE OR REPLACE RULE voo_i AS ON INSERT TO voo DO INSTEAD + INSERT INTO foo VALUES(new.*, 57) RETURNING *; + +CREATE OR REPLACE RULE voo_i AS ON INSERT TO voo DO INSTEAD + INSERT INTO foo VALUES(new.*, 57) RETURNING f1, f2; + +-- should still work +INSERT INTO voo VALUES(13,'zit2'); +-- works now +INSERT INTO voo VALUES(14,'zoo2') RETURNING *; + +SELECT * FROM foo; +SELECT * FROM voo; + +CREATE OR REPLACE RULE voo_u AS ON UPDATE TO voo DO INSTEAD + UPDATE foo SET f1 = new.f1, f2 = new.f2 WHERE f1 = old.f1 + RETURNING f1, f2; + +update voo set f1 = f1 + 1 where f2 = 'zoo2'; +update voo set f1 = f1 + 1 where f2 = 'zoo2' RETURNING *, f1*2; + +SELECT * FROM foo; +SELECT * FROM voo; + +CREATE OR REPLACE RULE voo_d AS ON DELETE TO voo DO INSTEAD + DELETE FROM foo WHERE f1 = old.f1 + RETURNING f1, f2; + +DELETE FROM foo WHERE f1 = 13; +DELETE FROM foo WHERE f2 = 'zit' RETURNING *; + +SELECT * FROM foo; +SELECT * FROM voo; + +-- Try a join case + +CREATE TEMP TABLE joinme (f2j text, other int); +INSERT INTO joinme VALUES('more', 12345); +INSERT INTO joinme VALUES('zoo2', 54321); +INSERT INTO joinme VALUES('other', 0); + +CREATE TEMP VIEW joinview AS + SELECT foo.*, other FROM foo JOIN joinme ON (f2 = f2j); + +SELECT * FROM joinview; + +CREATE RULE joinview_u AS ON UPDATE TO joinview DO INSTEAD + UPDATE foo SET f1 = new.f1, f3 = new.f3 + FROM joinme WHERE f2 = f2j AND f2 = old.f2 + RETURNING foo.*, other; + +UPDATE joinview SET f1 = f1 + 1 WHERE f3 = 57 RETURNING *, other + 1; + +SELECT * FROM joinview; +SELECT * FROM foo; +SELECT * FROM voo; + +-- Check aliased target relation +INSERT INTO foo AS bar DEFAULT VALUES RETURNING *; -- ok +INSERT INTO foo AS bar DEFAULT VALUES RETURNING foo.*; -- fails, wrong name +INSERT INTO foo AS bar DEFAULT VALUES RETURNING bar.*; -- ok +INSERT INTO foo AS bar DEFAULT VALUES RETURNING bar.f3; -- ok diff --git a/src/test/singlenode_regress/sql/returning_gp.sql b/src/test/singlenode_regress/sql/returning_gp.sql new file mode 100644 index 00000000000..ba67f7a815e --- /dev/null +++ b/src/test/singlenode_regress/sql/returning_gp.sql @@ -0,0 +1,68 @@ +-- +-- Extra GPDB tests on INSERT/UPDATE/DELETE RETURNING +-- + +CREATE TABLE returning_parttab (distkey int4, partkey int4, i int, t text) +PARTITION BY RANGE (partkey) (START (1) END (10)); + +-- +-- Test INSERT RETURNING with partitioning +-- +insert into returning_parttab values (1, 1, 1, 'single insert') returning *; +insert into returning_parttab +select 1, g, g, 'multi ' || g from generate_series(1, 5) g +returning distkey, partkey, i, t; + +-- Drop a column, and create a new partition. The new partition will not have +-- the dropped column, while in the old partition, it's still physically there, +-- just marked as dropped. Make sure the executor maps the columns correctly. +ALTER TABLE returning_parttab DROP COLUMN i; + +alter table returning_parttab add partition newpart start (10) end (20); + +insert into returning_parttab values (1, 10, 'single2 insert') returning *; +insert into returning_parttab select 2, g + 10, 'multi2 ' || g from generate_series(1, 5) g +returning distkey, partkey, t; + +-- +-- Test UPDATE/DELETE RETURNING with partitioning +-- +update returning_parttab set partkey = 9 where partkey = 3 returning *; +update returning_parttab set partkey = 19 where partkey = 13 returning *; + +-- update that moves the tuple across partitions +update returning_parttab set partkey = 18 where partkey = 4 returning *; + +-- delete +delete from returning_parttab where partkey = 14 returning *; + + +-- Check table contents, to be sure that all the commands did what they claimed. +select * from returning_parttab; + +-- +-- DELETE RETURNING is currently not supported on AO tables. +-- +CREATE TEMP TABLE returning_aotab (id int4) WITH (appendonly=true); +INSERT INTO returning_aotab VALUES (1); +DELETE FROM returning_aotab RETURNING *; + + +-- +-- Test UPDATE RETURNING with a split update, i.e. an update of the distribution +-- key. +-- +CREATE TEMP TABLE returning_disttest (id int4); +INSERT INTO returning_disttest VALUES (1), (2); + +-- Disable QUIET mode, so that we get some testing of the command tag as well. +-- (At one point, each split update incorrectly counted as two updated rows.) +\set QUIET off + +UPDATE returning_disttest SET id = id + 1; + +SELECT * FROM returning_disttest; + +-- Test an UPDATE that moves the row to different segment and different partition +UPDATE returning_parttab SET distkey = 2, partkey = 13 WHERE partkey = 2 RETURNING distkey, partkey, t; +select * from returning_parttab WHERE distkey = 2 AND partkey = 13; diff --git a/src/test/singlenode_regress/sql/roleattributes.sql b/src/test/singlenode_regress/sql/roleattributes.sql new file mode 100644 index 00000000000..c961b2d7303 --- /dev/null +++ b/src/test/singlenode_regress/sql/roleattributes.sql @@ -0,0 +1,98 @@ +-- default for superuser is false +CREATE ROLE regress_test_def_superuser; + +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_superuser'; +CREATE ROLE regress_test_superuser WITH SUPERUSER; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_superuser'; +ALTER ROLE regress_test_superuser WITH NOSUPERUSER; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_superuser'; +ALTER ROLE regress_test_superuser WITH SUPERUSER; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_superuser'; + +-- default for inherit is true +CREATE ROLE regress_test_def_inherit; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_inherit'; +CREATE ROLE regress_test_inherit WITH NOINHERIT; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_inherit'; +ALTER ROLE regress_test_inherit WITH INHERIT; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_inherit'; +ALTER ROLE regress_test_inherit WITH NOINHERIT; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_inherit'; + +-- default for create role is false +CREATE ROLE regress_test_def_createrole; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_createrole'; +CREATE ROLE regress_test_createrole WITH CREATEROLE; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createrole'; +ALTER ROLE regress_test_createrole WITH NOCREATEROLE; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createrole'; +ALTER ROLE regress_test_createrole WITH CREATEROLE; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createrole'; + +-- default for create database is false +CREATE ROLE regress_test_def_createdb; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_createdb'; +CREATE ROLE regress_test_createdb WITH CREATEDB; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createdb'; +ALTER ROLE regress_test_createdb WITH NOCREATEDB; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createdb'; +ALTER ROLE regress_test_createdb WITH CREATEDB; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_createdb'; + +-- default for can login is false for role +CREATE ROLE regress_test_def_role_canlogin; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_role_canlogin'; +CREATE ROLE regress_test_role_canlogin WITH LOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_role_canlogin'; +ALTER ROLE regress_test_role_canlogin WITH NOLOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_role_canlogin'; +ALTER ROLE regress_test_role_canlogin WITH LOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_role_canlogin'; + +-- default for can login is true for user +CREATE USER regress_test_def_user_canlogin; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_user_canlogin'; +CREATE USER regress_test_user_canlogin WITH NOLOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_user_canlogin'; +ALTER USER regress_test_user_canlogin WITH LOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_user_canlogin'; +ALTER USER regress_test_user_canlogin WITH NOLOGIN; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_user_canlogin'; + +-- default for replication is false +CREATE ROLE regress_test_def_replication; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_replication'; +CREATE ROLE regress_test_replication WITH REPLICATION; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_replication'; +ALTER ROLE regress_test_replication WITH NOREPLICATION; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_replication'; +ALTER ROLE regress_test_replication WITH REPLICATION; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_replication'; + +-- default for bypassrls is false +CREATE ROLE regress_test_def_bypassrls; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_def_bypassrls'; +CREATE ROLE regress_test_bypassrls WITH BYPASSRLS; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_bypassrls'; +ALTER ROLE regress_test_bypassrls WITH NOBYPASSRLS; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_bypassrls'; +ALTER ROLE regress_test_bypassrls WITH BYPASSRLS; +SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolbypassrls, rolconnlimit, rolpassword, rolvaliduntil FROM pg_authid WHERE rolname = 'regress_test_bypassrls'; + +-- clean up roles +DROP ROLE regress_test_def_superuser; +DROP ROLE regress_test_superuser; +DROP ROLE regress_test_def_inherit; +DROP ROLE regress_test_inherit; +DROP ROLE regress_test_def_createrole; +DROP ROLE regress_test_createrole; +DROP ROLE regress_test_def_createdb; +DROP ROLE regress_test_createdb; +DROP ROLE regress_test_def_role_canlogin; +DROP ROLE regress_test_role_canlogin; +DROP USER regress_test_def_user_canlogin; +DROP USER regress_test_user_canlogin; +DROP ROLE regress_test_def_replication; +DROP ROLE regress_test_replication; +DROP ROLE regress_test_def_bypassrls; +DROP ROLE regress_test_bypassrls; diff --git a/src/test/singlenode_regress/sql/rowsecurity.sql b/src/test/singlenode_regress/sql/rowsecurity.sql new file mode 100644 index 00000000000..d2db86025e8 --- /dev/null +++ b/src/test/singlenode_regress/sql/rowsecurity.sql @@ -0,0 +1,1899 @@ +-- +-- Test of Row-level security feature +-- + +-- Clean up in case a prior regression run failed + +-- Suppress NOTICE messages when users/groups don't exist +SET client_min_messages TO 'warning'; +SET gp_enable_relsize_collection to on; + +DROP USER IF EXISTS regress_rls_alice; +DROP USER IF EXISTS regress_rls_bob; +DROP USER IF EXISTS regress_rls_carol; +DROP USER IF EXISTS regress_rls_dave; +DROP USER IF EXISTS regress_rls_exempt_user; +DROP ROLE IF EXISTS regress_rls_group1; +DROP ROLE IF EXISTS regress_rls_group2; + +DROP SCHEMA IF EXISTS regress_rls_schema CASCADE; + +-- RESET client_min_messages; RESET doesn't work well in GPDB, it doesn't reset +-- GUCs in QEs. +SET client_min_messages TO 'notice'; + +-- initial setup +CREATE USER regress_rls_alice NOLOGIN; +CREATE USER regress_rls_bob NOLOGIN; +CREATE USER regress_rls_carol NOLOGIN; +CREATE USER regress_rls_dave NOLOGIN; +CREATE USER regress_rls_exempt_user BYPASSRLS NOLOGIN; +CREATE ROLE regress_rls_group1 NOLOGIN; +CREATE ROLE regress_rls_group2 NOLOGIN; + +GRANT regress_rls_group1 TO regress_rls_bob; +GRANT regress_rls_group2 TO regress_rls_carol; + +CREATE SCHEMA regress_rls_schema; +GRANT ALL ON SCHEMA regress_rls_schema to public; +SET search_path = regress_rls_schema; + +-- setup of malicious function +CREATE OR REPLACE FUNCTION f_leak(text) RETURNS bool + COST 0.0000001 LANGUAGE plpgsql + AS 'BEGIN RAISE NOTICE ''f_leak => %'', $1; RETURN true; END'; +GRANT EXECUTE ON FUNCTION f_leak(text) TO public; + +-- BASIC Row-Level Security Scenario + +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE uaccount ( + pguser name primary key, + seclv int +); +GRANT SELECT ON uaccount TO public; +INSERT INTO uaccount VALUES + ('regress_rls_alice', 99), + ('regress_rls_bob', 1), + ('regress_rls_carol', 2), + ('regress_rls_dave', 3); +ANALYZE uaccount; + +CREATE TABLE category ( + cid int primary key, + cname text +); +GRANT ALL ON category TO public; +INSERT INTO category VALUES + (11, 'novel'), + (22, 'science fiction'), + (33, 'technology'), + (44, 'manga'); +ANALYZE category; + +CREATE TABLE document ( + did int primary key, + cid int references category(cid), + dlevel int not null, + dauthor name, + dtitle text +); +GRANT ALL ON document TO public; +INSERT INTO document VALUES + ( 1, 11, 1, 'regress_rls_bob', 'my first novel'), + ( 2, 11, 2, 'regress_rls_bob', 'my second novel'), + ( 3, 22, 2, 'regress_rls_bob', 'my science fiction'), + ( 4, 44, 1, 'regress_rls_bob', 'my first manga'), + ( 5, 44, 2, 'regress_rls_bob', 'my second manga'), + ( 6, 22, 1, 'regress_rls_carol', 'great science fiction'), + ( 7, 33, 2, 'regress_rls_carol', 'great technology book'), + ( 8, 44, 1, 'regress_rls_carol', 'great manga'), + ( 9, 22, 1, 'regress_rls_dave', 'awesome science fiction'), + (10, 33, 2, 'regress_rls_dave', 'awesome technology book'); +ANALYZE document; + +ALTER TABLE document ENABLE ROW LEVEL SECURITY; + +-- user's security level must be higher than or equal to document's +CREATE POLICY p1 ON document AS PERMISSIVE + USING (dlevel <= (SELECT seclv FROM uaccount WHERE pguser = current_user)); + +-- try to create a policy of bogus type +CREATE POLICY p1 ON document AS UGLY + USING (dlevel <= (SELECT seclv FROM uaccount WHERE pguser = current_user)); + +-- but Dave isn't allowed to anything at cid 50 or above +-- this is to make sure that we sort the policies by name first +-- when applying WITH CHECK, a later INSERT by Dave should fail due +-- to p1r first +CREATE POLICY p2r ON document AS RESTRICTIVE TO regress_rls_dave + USING (cid <> 44 AND cid < 50); + +-- and Dave isn't allowed to see manga documents +CREATE POLICY p1r ON document AS RESTRICTIVE TO regress_rls_dave + USING (cid <> 44); + +\dp +\d document +SELECT * FROM pg_policies WHERE schemaname = 'regress_rls_schema' AND tablename = 'document' ORDER BY policyname; + +-- viewpoint from regress_rls_bob +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER BY did; + +-- try a sampled version +SELECT * FROM document TABLESAMPLE BERNOULLI(50) REPEATABLE(0) + WHERE f_leak(dtitle) ORDER BY did; + +-- viewpoint from regress_rls_carol +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER BY did; + +-- try a sampled version +SELECT * FROM document TABLESAMPLE BERNOULLI(50) REPEATABLE(0) + WHERE f_leak(dtitle) ORDER BY did; + +EXPLAIN (COSTS OFF) SELECT * FROM document WHERE f_leak(dtitle); +EXPLAIN (COSTS OFF) SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle); + +-- viewpoint from regress_rls_dave +SET SESSION AUTHORIZATION regress_rls_dave; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER BY did; + +EXPLAIN (COSTS OFF) SELECT * FROM document WHERE f_leak(dtitle); +EXPLAIN (COSTS OFF) SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle); + +-- 44 would technically fail for both p2r and p1r, but we should get an error +-- back from p1r for this because it sorts first +INSERT INTO document VALUES (100, 44, 1, 'regress_rls_dave', 'testing sorting of policies'); -- fail +-- Just to see a p2r error +INSERT INTO document VALUES (100, 55, 1, 'regress_rls_dave', 'testing sorting of policies'); -- fail + +-- only owner can change policies +ALTER POLICY p1 ON document USING (true); --fail +DROP POLICY p1 ON document; --fail + +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY p1 ON document USING (dauthor = current_user); + +-- viewpoint from regress_rls_bob again +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER by did; + +-- viewpoint from rls_regres_carol again +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM document WHERE f_leak(dtitle) ORDER BY did; +SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle) ORDER by did; + +EXPLAIN (COSTS OFF) SELECT * FROM document WHERE f_leak(dtitle); +EXPLAIN (COSTS OFF) SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle); + +-- interaction of FK/PK constraints +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE POLICY p2 ON category + USING (CASE WHEN current_user = 'regress_rls_bob' THEN cid IN (11, 33) + WHEN current_user = 'regress_rls_carol' THEN cid IN (22, 44) + ELSE false END); + +ALTER TABLE category ENABLE ROW LEVEL SECURITY; + +-- cannot delete PK referenced by invisible FK +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM document d FULL OUTER JOIN category c on d.cid = c.cid ORDER BY d.did, c.cid; +-- GPDB: referential integrity checks are not enforced +-- start_ignore +-- DELETE FROM category WHERE cid = 33; -- fails with FK violation +-- end_ignore + +-- can insert FK referencing invisible PK +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM document d FULL OUTER JOIN category c on d.cid = c.cid ORDER BY d.did, c.cid; +INSERT INTO document VALUES (11, 33, 1, current_user, 'hoge'); + +-- UNIQUE or PRIMARY KEY constraint violation DOES reveal presence of row +SET SESSION AUTHORIZATION regress_rls_bob; +INSERT INTO document VALUES (8, 44, 1, 'regress_rls_bob', 'my third manga'); -- Must fail with unique violation, revealing presence of did we can't see +SELECT * FROM document WHERE did = 8; -- and confirm we can't see it + +-- RLS policies are checked before constraints +INSERT INTO document VALUES (8, 44, 1, 'regress_rls_carol', 'my third manga'); -- Should fail with RLS check violation, not duplicate key violation +-- GPDB: UPDATE on distributed key column not allowed on relation with update triggers +-- start_ignore +UPDATE document SET did = 8, dauthor = 'regress_rls_carol' WHERE did = 5; -- Should fail with RLS check violation, not duplicate key violation +-- end_ignore + +-- database superuser does bypass RLS policy when enabled +RESET SESSION AUTHORIZATION; +SET row_security TO ON; +SELECT * FROM document; +SELECT * FROM category; + +-- database superuser does bypass RLS policy when disabled +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +SELECT * FROM document; +SELECT * FROM category; + +-- database non-superuser with bypass privilege can bypass RLS policy when disabled +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +SELECT * FROM document; +SELECT * FROM category; + +-- RLS policy does not apply to table owner when RLS enabled. +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; +SELECT * FROM document; +SELECT * FROM category; + +-- RLS policy does not apply to table owner when RLS disabled. +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO OFF; +SELECT * FROM document; +SELECT * FROM category; + +-- +-- Table inheritance and RLS policy +-- +SET SESSION AUTHORIZATION regress_rls_alice; + +SET row_security TO ON; + +CREATE TABLE t1 (id int not null primary key, a int, junk1 text, b text); +ALTER TABLE t1 DROP COLUMN junk1; -- just a disturbing factor +GRANT ALL ON t1 TO public; + +COPY t1 FROM stdin WITH ; +101 1 aba +102 2 bbb +103 3 ccc +104 4 dad +\. +ANALYZE t1; + +CREATE TABLE t2 (c float) INHERITS (t1); +GRANT ALL ON t2 TO public; + +COPY t2 FROM stdin; +201 1 abc 1.1 +202 2 bcd 2.2 +203 3 cde 3.3 +204 4 def 4.4 +\. +ANALYZE t2; + +CREATE TABLE t3 (id int not null primary key, c text, b text, a int); +ALTER TABLE t3 INHERIT t1; +GRANT ALL ON t3 TO public; + +COPY t3(id, a,b,c) FROM stdin; +301 1 xxx X +302 2 yyy Y +303 3 zzz Z +\. +ANALYZE t3; + +CREATE POLICY p1 ON t1 FOR ALL TO PUBLIC USING (a % 2 = 0); -- be even number +CREATE POLICY p2 ON t2 FOR ALL TO PUBLIC USING (a % 2 = 1); -- be odd number + +ALTER TABLE t1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE t2 ENABLE ROW LEVEL SECURITY; + +SET SESSION AUTHORIZATION regress_rls_bob; + +SELECT * FROM t1; +EXPLAIN (COSTS OFF) SELECT * FROM t1; + +SELECT * FROM t1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b); + +-- reference to system column +SELECT tableoid::regclass, * FROM t1; +EXPLAIN (COSTS OFF) SELECT *, t1 FROM t1; + +-- reference to whole-row reference +SELECT *, t1 FROM t1; +EXPLAIN (COSTS OFF) SELECT *, t1 FROM t1; + +-- for share/update lock +SELECT * FROM t1 FOR SHARE; +EXPLAIN (COSTS OFF) SELECT * FROM t1 FOR SHARE; + +SELECT * FROM t1 WHERE f_leak(b) FOR SHARE; +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b) FOR SHARE; + +-- union all query +SELECT a, b, tableoid::regclass FROM t2 UNION ALL SELECT a, b, tableoid::regclass FROM t3; +EXPLAIN (COSTS OFF) SELECT a, b, tableoid::regclass FROM t2 UNION ALL SELECT a, b, tableoid::regclass FROM t3; + +-- superuser is allowed to bypass RLS checks +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +SELECT * FROM t1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b); + +-- non-superuser with bypass privilege can bypass RLS policy when disabled +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +SELECT * FROM t1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b); + +-- +-- Partitioned Tables +-- + +SET SESSION AUTHORIZATION regress_rls_alice; + +CREATE TABLE part_document ( + did int, + cid int, + dlevel int not null, + dauthor name, + dtitle text +) PARTITION BY RANGE (cid); +GRANT ALL ON part_document TO public; + +-- Create partitions for document categories +CREATE TABLE part_document_fiction PARTITION OF part_document FOR VALUES FROM (11) to (12); +CREATE TABLE part_document_satire PARTITION OF part_document FOR VALUES FROM (55) to (56); +CREATE TABLE part_document_nonfiction PARTITION OF part_document FOR VALUES FROM (99) to (100); + +GRANT ALL ON part_document_fiction TO public; +GRANT ALL ON part_document_satire TO public; +GRANT ALL ON part_document_nonfiction TO public; + +INSERT INTO part_document VALUES + ( 1, 11, 1, 'regress_rls_bob', 'my first novel'), + ( 2, 11, 2, 'regress_rls_bob', 'my second novel'), + ( 3, 99, 2, 'regress_rls_bob', 'my science textbook'), + ( 4, 55, 1, 'regress_rls_bob', 'my first satire'), + ( 5, 99, 2, 'regress_rls_bob', 'my history book'), + ( 6, 11, 1, 'regress_rls_carol', 'great science fiction'), + ( 7, 99, 2, 'regress_rls_carol', 'great technology book'), + ( 8, 55, 2, 'regress_rls_carol', 'great satire'), + ( 9, 11, 1, 'regress_rls_dave', 'awesome science fiction'), + (10, 99, 2, 'regress_rls_dave', 'awesome technology book'); + +ALTER TABLE part_document ENABLE ROW LEVEL SECURITY; + +-- Create policy on parent +-- user's security level must be higher than or equal to document's +CREATE POLICY pp1 ON part_document AS PERMISSIVE + USING (dlevel <= (SELECT seclv FROM uaccount WHERE pguser = current_user)); + +-- Dave is only allowed to see cid < 55 +CREATE POLICY pp1r ON part_document AS RESTRICTIVE TO regress_rls_dave + USING (cid < 55); + +\d+ part_document +SELECT * FROM pg_policies WHERE schemaname = 'regress_rls_schema' AND tablename like '%part_document%' ORDER BY policyname; + +-- viewpoint from regress_rls_bob +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + +-- viewpoint from regress_rls_carol +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + +-- viewpoint from regress_rls_dave +SET SESSION AUTHORIZATION regress_rls_dave; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + +-- pp1 ERROR +INSERT INTO part_document VALUES (100, 11, 5, 'regress_rls_dave', 'testing pp1'); -- fail +-- pp1r ERROR +INSERT INTO part_document VALUES (100, 99, 1, 'regress_rls_dave', 'testing pp1r'); -- fail + +-- Show that RLS policy does not apply for direct inserts to children +-- This should fail with RLS POLICY pp1r violation. +INSERT INTO part_document VALUES (100, 55, 1, 'regress_rls_dave', 'testing RLS with partitions'); -- fail +-- But this should succeed. +INSERT INTO part_document_satire VALUES (100, 55, 1, 'regress_rls_dave', 'testing RLS with partitions'); -- success +-- We still cannot see the row using the parent +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +-- But we can if we look directly +SELECT * FROM part_document_satire WHERE f_leak(dtitle) ORDER BY did; + +-- Turn on RLS and create policy on child to show RLS is checked before constraints +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER TABLE part_document_satire ENABLE ROW LEVEL SECURITY; +CREATE POLICY pp3 ON part_document_satire AS RESTRICTIVE + USING (cid < 55); +-- This should fail with RLS violation now. +SET SESSION AUTHORIZATION regress_rls_dave; +INSERT INTO part_document_satire VALUES (101, 55, 1, 'regress_rls_dave', 'testing RLS with partitions'); -- fail +-- And now we cannot see directly into the partition either, due to RLS +SELECT * FROM part_document_satire WHERE f_leak(dtitle) ORDER BY did; +-- The parent looks same as before +-- viewpoint from regress_rls_dave +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + +-- viewpoint from regress_rls_carol +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + +-- only owner can change policies +ALTER POLICY pp1 ON part_document USING (true); --fail +DROP POLICY pp1 ON part_document; --fail + +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY pp1 ON part_document USING (dauthor = current_user); + +-- viewpoint from regress_rls_bob again +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; + +-- viewpoint from rls_regres_carol again +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM part_document WHERE f_leak(dtitle) ORDER BY did; + +EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); + +-- database superuser does bypass RLS policy when enabled +RESET SESSION AUTHORIZATION; +SET row_security TO ON; +SELECT * FROM part_document ORDER BY did; +SELECT * FROM part_document_satire ORDER by did; + +-- database non-superuser with bypass privilege can bypass RLS policy when disabled +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +SELECT * FROM part_document ORDER BY did; +SELECT * FROM part_document_satire ORDER by did; + +-- RLS policy does not apply to table owner when RLS enabled. +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; +SELECT * FROM part_document ORDER by did; +SELECT * FROM part_document_satire ORDER by did; + +-- When RLS disabled, other users get ERROR. +SET SESSION AUTHORIZATION regress_rls_dave; +SET row_security TO OFF; +SELECT * FROM part_document ORDER by did; +SELECT * FROM part_document_satire ORDER by did; + +-- Check behavior with a policy that uses a SubPlan not an InitPlan. +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; +CREATE POLICY pp3 ON part_document AS RESTRICTIVE + USING ((SELECT dlevel <= seclv FROM uaccount WHERE pguser = current_user)); + +SET SESSION AUTHORIZATION regress_rls_carol; +INSERT INTO part_document VALUES (100, 11, 5, 'regress_rls_carol', 'testing pp3'); -- fail + +----- Dependencies ----- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security TO ON; + +CREATE TABLE dependee (x integer, y integer); + +CREATE TABLE dependent (x integer, y integer); +CREATE POLICY d1 ON dependent FOR ALL + TO PUBLIC + USING (x = (SELECT d.x FROM dependee d WHERE d.y = y)); + +DROP TABLE dependee; -- Should fail without CASCADE due to dependency on row security qual? + +DROP TABLE dependee CASCADE; + +EXPLAIN (COSTS OFF) SELECT * FROM dependent; -- After drop, should be unqualified + +----- RECURSION ---- + +-- +-- Simple recursion +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE rec1 (x integer, y integer); +CREATE POLICY r1 ON rec1 USING (x = (SELECT r.x FROM rec1 r WHERE y = r.y)); +ALTER TABLE rec1 ENABLE ROW LEVEL SECURITY; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rec1; -- fail, direct recursion + +-- +-- Mutual recursion +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE rec2 (a integer, b integer); +ALTER POLICY r1 ON rec1 USING (x = (SELECT a FROM rec2 WHERE b = y)); +CREATE POLICY r2 ON rec2 USING (a = (SELECT x FROM rec1 WHERE y = b)); +ALTER TABLE rec2 ENABLE ROW LEVEL SECURITY; + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rec1; -- fail, mutual recursion + +-- +-- Mutual recursion via views +-- +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW rec1v AS SELECT * FROM rec1; +CREATE VIEW rec2v AS SELECT * FROM rec2; +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY r1 ON rec1 USING (x = (SELECT a FROM rec2v WHERE b = y)); +ALTER POLICY r2 ON rec2 USING (a = (SELECT x FROM rec1v WHERE y = b)); + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rec1; -- fail, mutual recursion via views + +-- +-- Mutual recursion via .s.b views +-- +SET SESSION AUTHORIZATION regress_rls_bob; + +DROP VIEW rec1v, rec2v CASCADE; + +CREATE VIEW rec1v WITH (security_barrier) AS SELECT * FROM rec1; +CREATE VIEW rec2v WITH (security_barrier) AS SELECT * FROM rec2; +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE POLICY r1 ON rec1 USING (x = (SELECT a FROM rec2v WHERE b = y)); +CREATE POLICY r2 ON rec2 USING (a = (SELECT x FROM rec1v WHERE y = b)); + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rec1; -- fail, mutual recursion via s.b. views + +-- +-- recursive RLS and VIEWs in policy +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE s1 (a int, b text); +INSERT INTO s1 (SELECT x, md5(x::text) FROM generate_series(-10,10) x); + +CREATE TABLE s2 (x int, y text); +INSERT INTO s2 (SELECT x, md5(x::text) FROM generate_series(-6,6) x); + +GRANT SELECT ON s1, s2 TO regress_rls_bob; + +CREATE POLICY p1 ON s1 USING (a in (select x from s2 where y like '%2f%')); +CREATE POLICY p2 ON s2 USING (x in (select a from s1 where b like '%22%')); +CREATE POLICY p3 ON s1 FOR INSERT WITH CHECK (a = (SELECT a FROM s1)); + +ALTER TABLE s1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE s2 ENABLE ROW LEVEL SECURITY; + +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW v2 AS SELECT * FROM s2 WHERE y like '%af%'; +SELECT * FROM s1 WHERE f_leak(b); -- fail (infinite recursion) + +INSERT INTO s1 VALUES (1, 'foo'); -- fail (infinite recursion) + +SET SESSION AUTHORIZATION regress_rls_alice; +DROP POLICY p3 on s1; +ALTER POLICY p2 ON s2 USING (x % 2 = 0); + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM s1 WHERE f_leak(b); -- OK +EXPLAIN (COSTS OFF) SELECT * FROM only s1 WHERE f_leak(b); + +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY p1 ON s1 USING (a in (select x from v2)); -- using VIEW in RLS policy +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM s1 WHERE f_leak(b); -- OK +EXPLAIN (COSTS OFF) SELECT * FROM s1 WHERE f_leak(b); + +SELECT (SELECT x FROM s1 LIMIT 1) xx, * FROM s2 WHERE y like '%28%'; +EXPLAIN (COSTS OFF) SELECT (SELECT x FROM s1 LIMIT 1) xx, * FROM s2 WHERE y like '%28%'; + +SET SESSION AUTHORIZATION regress_rls_alice; +ALTER POLICY p2 ON s2 USING (x in (select a from s1 where b like '%d2%')); +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM s1 WHERE f_leak(b); -- fail (infinite recursion via view) + +-- prepared statement with regress_rls_alice privilege +PREPARE p1(int) AS SELECT * FROM t1 WHERE a <= $1; +EXECUTE p1(2); +EXPLAIN (COSTS OFF) EXECUTE p1(2); + +-- superuser is allowed to bypass RLS checks +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +SELECT * FROM t1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b); + +-- plan cache should be invalidated +EXECUTE p1(2); +EXPLAIN (COSTS OFF) EXECUTE p1(2); + +PREPARE p2(int) AS SELECT * FROM t1 WHERE a = $1; +EXECUTE p2(2); +EXPLAIN (COSTS OFF) EXECUTE p2(2); + +-- also, case when privilege switch from superuser +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +EXECUTE p2(2); +EXPLAIN (COSTS OFF) EXECUTE p2(2); + +-- +-- UPDATE / DELETE and Row-level security +-- +SET SESSION AUTHORIZATION regress_rls_bob; +EXPLAIN (COSTS OFF) UPDATE t1 SET b = b || b WHERE f_leak(b); +UPDATE t1 SET b = b || b WHERE f_leak(b); + +EXPLAIN (COSTS OFF) UPDATE only t1 SET b = b || '_updt' WHERE f_leak(b); +UPDATE only t1 SET b = b || '_updt' WHERE f_leak(b); + +-- returning clause with system column +UPDATE only t1 SET b = b WHERE f_leak(b) RETURNING tableoid::regclass, *, t1; +UPDATE t1 SET b = b WHERE f_leak(b) RETURNING *; +UPDATE t1 SET b = b WHERE f_leak(b) RETURNING tableoid::regclass, *, t1; + +-- updates with from clause +EXPLAIN (COSTS OFF) UPDATE t2 SET b=t2.b FROM t3 +WHERE t2.a = 3 and t3.a = 2 AND f_leak(t2.b) AND f_leak(t3.b); + +UPDATE t2 SET b=t2.b FROM t3 +WHERE t2.a = 3 and t3.a = 2 AND f_leak(t2.b) AND f_leak(t3.b); + +EXPLAIN (COSTS OFF) UPDATE t1 SET b=t1.b FROM t2 +WHERE t1.a = 3 and t2.a = 3 AND f_leak(t1.b) AND f_leak(t2.b); + +UPDATE t1 SET b=t1.b FROM t2 +WHERE t1.a = 3 and t2.a = 3 AND f_leak(t1.b) AND f_leak(t2.b); + +EXPLAIN (COSTS OFF) UPDATE t2 SET b=t2.b FROM t1 +WHERE t1.a = 3 and t2.a = 3 AND f_leak(t1.b) AND f_leak(t2.b); + +UPDATE t2 SET b=t2.b FROM t1 +WHERE t1.a = 3 and t2.a = 3 AND f_leak(t1.b) AND f_leak(t2.b); + +-- updates with from clause self join +EXPLAIN (COSTS OFF) UPDATE t2 t2_1 SET b = t2_2.b FROM t2 t2_2 +WHERE t2_1.a = 3 AND t2_2.a = t2_1.a AND t2_2.b = t2_1.b +AND f_leak(t2_1.b) AND f_leak(t2_2.b) RETURNING *, t2_1, t2_2; + +UPDATE t2 t2_1 SET b = t2_2.b FROM t2 t2_2 +WHERE t2_1.a = 3 AND t2_2.a = t2_1.a AND t2_2.b = t2_1.b +AND f_leak(t2_1.b) AND f_leak(t2_2.b) RETURNING *, t2_1, t2_2; + +EXPLAIN (COSTS OFF) UPDATE t1 t1_1 SET b = t1_2.b FROM t1 t1_2 +WHERE t1_1.a = 4 AND t1_2.a = t1_1.a AND t1_2.b = t1_1.b +AND f_leak(t1_1.b) AND f_leak(t1_2.b) RETURNING *, t1_1, t1_2; + +UPDATE t1 t1_1 SET b = t1_2.b FROM t1 t1_2 +WHERE t1_1.a = 4 AND t1_2.a = t1_1.a AND t1_2.b = t1_1.b +AND f_leak(t1_1.b) AND f_leak(t1_2.b) RETURNING *, t1_1, t1_2; + +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +SELECT * FROM t1 ORDER BY a,b; + +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +EXPLAIN (COSTS OFF) DELETE FROM only t1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) DELETE FROM t1 WHERE f_leak(b); + +DELETE FROM only t1 WHERE f_leak(b) RETURNING tableoid::regclass, *, t1; +DELETE FROM t1 WHERE f_leak(b) RETURNING tableoid::regclass, *, t1; + +-- +-- S.b. view on top of Row-level security +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE b1 (a int, b text); +INSERT INTO b1 (SELECT x, md5(x::text) FROM generate_series(-10,10) x); + +CREATE POLICY p1 ON b1 USING (a % 2 = 0); +ALTER TABLE b1 ENABLE ROW LEVEL SECURITY; +GRANT ALL ON b1 TO regress_rls_bob; + +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW bv1 WITH (security_barrier) AS SELECT * FROM b1 WHERE a > 0 WITH CHECK OPTION; +GRANT ALL ON bv1 TO regress_rls_carol; + +SET SESSION AUTHORIZATION regress_rls_carol; + +EXPLAIN (COSTS OFF) SELECT * FROM bv1 WHERE f_leak(b); +SELECT * FROM bv1 WHERE f_leak(b); + +INSERT INTO bv1 VALUES (-1, 'xxx'); -- should fail view WCO +INSERT INTO bv1 VALUES (11, 'xxx'); -- should fail RLS check +INSERT INTO bv1 VALUES (12, 'xxx'); -- ok + +EXPLAIN (COSTS OFF) UPDATE bv1 SET b = 'yyy' WHERE a = 4 AND f_leak(b); +UPDATE bv1 SET b = 'yyy' WHERE a = 4 AND f_leak(b); + +EXPLAIN (COSTS OFF) DELETE FROM bv1 WHERE a = 6 AND f_leak(b); +DELETE FROM bv1 WHERE a = 6 AND f_leak(b); + +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM b1; +-- +-- INSERT ... ON CONFLICT DO UPDATE and Row-level security +-- + +SET SESSION AUTHORIZATION regress_rls_alice; +DROP POLICY p1 ON document; +DROP POLICY p1r ON document; + +CREATE POLICY p1 ON document FOR SELECT USING (true); +CREATE POLICY p2 ON document FOR INSERT WITH CHECK (dauthor = current_user); +CREATE POLICY p3 ON document FOR UPDATE + USING (cid = (SELECT cid from category WHERE cname = 'novel')) + WITH CHECK (dauthor = current_user); + +SET SESSION AUTHORIZATION regress_rls_bob; + +-- Exists... +SELECT * FROM document WHERE did = 2; + +-- ...so violates actual WITH CHECK OPTION within UPDATE (not INSERT, since +-- alternative UPDATE path happens to be taken): +INSERT INTO document VALUES (2, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_carol', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, dauthor = EXCLUDED.dauthor; + +-- Violates USING qual for UPDATE policy p3. +-- +-- UPDATE path is taken, but UPDATE fails purely because *existing* row to be +-- updated is not a "novel"/cid 11 (row is not leaked, even though we have +-- SELECT privileges sufficient to see the row in this instance): +INSERT INTO document VALUES (33, 22, 1, 'regress_rls_bob', 'okay science fiction'); -- preparation for next statement +INSERT INTO document VALUES (33, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'Some novel, replaces sci-fi') -- takes UPDATE path + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle; +-- Fine (we UPDATE, since INSERT WCOs and UPDATE security barrier quals + WCOs +-- not violated): +INSERT INTO document VALUES (2, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle RETURNING *; +-- Fine (we INSERT, so "cid = 33" ("technology") isn't evaluated): +INSERT INTO document VALUES (78, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'some technology novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, cid = 33 RETURNING *; +-- Fine (same query, but we UPDATE, so "cid = 33", ("technology") is not the +-- case in respect of *existing* tuple): +INSERT INTO document VALUES (78, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'some technology novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, cid = 33 RETURNING *; +-- Same query a third time, but now fails due to existing tuple finally not +-- passing quals: +INSERT INTO document VALUES (78, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'some technology novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, cid = 33 RETURNING *; +-- Don't fail just because INSERT doesn't satisfy WITH CHECK option that +-- originated as a barrier/USING() qual from the UPDATE. Note that the UPDATE +-- path *isn't* taken, and so UPDATE-related policy does not apply: +INSERT INTO document VALUES (79, (SELECT cid from category WHERE cname = 'technology'), 1, 'regress_rls_bob', 'technology book, can only insert') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle RETURNING *; +-- But this time, the same statement fails, because the UPDATE path is taken, +-- and updating the row just inserted falls afoul of security barrier qual +-- (enforced as WCO) -- what we might have updated target tuple to is +-- irrelevant, in fact. +INSERT INTO document VALUES (79, (SELECT cid from category WHERE cname = 'technology'), 1, 'regress_rls_bob', 'technology book, can only insert') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle RETURNING *; + +-- Test default USING qual enforced as WCO +SET SESSION AUTHORIZATION regress_rls_alice; +DROP POLICY p1 ON document; +DROP POLICY p2 ON document; +DROP POLICY p3 ON document; + +CREATE POLICY p3_with_default ON document FOR UPDATE + USING (cid = (SELECT cid from category WHERE cname = 'novel')); + +SET SESSION AUTHORIZATION regress_rls_bob; +-- Just because WCO-style enforcement of USING quals occurs with +-- existing/target tuple does not mean that the implementation can be allowed +-- to fail to also enforce this qual against the final tuple appended to +-- relation (since in the absence of an explicit WCO, this is also interpreted +-- as an UPDATE/ALL WCO in general). +-- +-- UPDATE path is taken here (fails due to existing tuple). Note that this is +-- not reported as a "USING expression", because it's an RLS UPDATE check that originated as +-- a USING qual for the purposes of RLS in general, as opposed to an explicit +-- USING qual that is ordinarily a security barrier. We leave it up to the +-- UPDATE to make this fail: +INSERT INTO document VALUES (79, (SELECT cid from category WHERE cname = 'technology'), 1, 'regress_rls_bob', 'technology book, can only insert') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle RETURNING *; + +-- UPDATE path is taken here. Existing tuple passes, since its cid +-- corresponds to "novel", but default USING qual is enforced against +-- post-UPDATE tuple too (as always when updating with a policy that lacks an +-- explicit WCO), and so this fails: +INSERT INTO document VALUES (2, (SELECT cid from category WHERE cname = 'technology'), 1, 'regress_rls_bob', 'my first novel') + ON CONFLICT (did) DO UPDATE SET cid = EXCLUDED.cid, dtitle = EXCLUDED.dtitle RETURNING *; + +SET SESSION AUTHORIZATION regress_rls_alice; +DROP POLICY p3_with_default ON document; + +-- +-- Test ALL policies with ON CONFLICT DO UPDATE (much the same as existing UPDATE +-- tests) +-- +CREATE POLICY p3_with_all ON document FOR ALL + USING (cid = (SELECT cid from category WHERE cname = 'novel')) + WITH CHECK (dauthor = current_user); + +SET SESSION AUTHORIZATION regress_rls_bob; + +-- Fails, since ALL WCO is enforced in insert path: +INSERT INTO document VALUES (80, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_carol', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle, cid = 33; +-- Fails, since ALL policy USING qual is enforced (existing, target tuple is in +-- violation, since it has the "manga" cid): +INSERT INTO document VALUES (4, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dtitle = EXCLUDED.dtitle; +-- Fails, since ALL WCO are enforced: +INSERT INTO document VALUES (1, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'my first novel') + ON CONFLICT (did) DO UPDATE SET dauthor = 'regress_rls_carol'; + +-- +-- ROLE/GROUP +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE z1 (a int, b text); +CREATE TABLE z2 (a int, b text); + +GRANT SELECT ON z1,z2 TO regress_rls_group1, regress_rls_group2, + regress_rls_bob, regress_rls_carol; + +INSERT INTO z1 VALUES + (1, 'aba'), + (2, 'bbb'), + (3, 'ccc'), + (4, 'dad'); + +CREATE POLICY p1 ON z1 TO regress_rls_group1 USING (a % 2 = 0); +CREATE POLICY p2 ON z1 TO regress_rls_group2 USING (a % 2 = 1); + +ALTER TABLE z1 ENABLE ROW LEVEL SECURITY; + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM z1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); + +PREPARE plancache_test AS SELECT * FROM z1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) EXECUTE plancache_test; + +PREPARE plancache_test2 AS WITH q AS MATERIALIZED (SELECT * FROM z1 WHERE f_leak(b)) SELECT * FROM q,z2; +EXPLAIN (COSTS OFF) EXECUTE plancache_test2; + +PREPARE plancache_test3 AS WITH q AS MATERIALIZED (SELECT * FROM z2) SELECT * FROM q,z1 WHERE f_leak(z1.b); +EXPLAIN (COSTS OFF) EXECUTE plancache_test3; + +SET ROLE regress_rls_group1; +SELECT * FROM z1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); + +EXPLAIN (COSTS OFF) EXECUTE plancache_test; +EXPLAIN (COSTS OFF) EXECUTE plancache_test2; +EXPLAIN (COSTS OFF) EXECUTE plancache_test3; + +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM z1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); + +EXPLAIN (COSTS OFF) EXECUTE plancache_test; +EXPLAIN (COSTS OFF) EXECUTE plancache_test2; +EXPLAIN (COSTS OFF) EXECUTE plancache_test3; + +SET ROLE regress_rls_group2; +SELECT * FROM z1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); + +EXPLAIN (COSTS OFF) EXECUTE plancache_test; +EXPLAIN (COSTS OFF) EXECUTE plancache_test2; +EXPLAIN (COSTS OFF) EXECUTE plancache_test3; + +-- +-- Views should follow policy for view owner. +-- +-- View and Table owner are the same. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE VIEW rls_view AS SELECT * FROM z1 WHERE f_leak(b); +GRANT SELECT ON rls_view TO regress_rls_bob; + +-- Query as role that is not owner of view or table. Should return all records. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Query as view/table owner. Should return all records. +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; +DROP VIEW rls_view; + +-- View and Table owners are different. +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW rls_view AS SELECT * FROM z1 WHERE f_leak(b); +GRANT SELECT ON rls_view TO regress_rls_alice; + +-- Query as role that is not owner of view but is owner of table. +-- Should return records based on view owner policies. +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Query as role that is not owner of table but is owner of view. +-- Should return records based on view owner policies. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Query as role that is not the owner of the table or view without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; --fail - permission denied. +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. + +-- Query as role that is not the owner of the table or view with permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +GRANT SELECT ON rls_view TO regress_rls_carol; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +SET SESSION AUTHORIZATION regress_rls_bob; +DROP VIEW rls_view; + +-- +-- Command specific +-- +SET SESSION AUTHORIZATION regress_rls_alice; + +CREATE TABLE x1 (a int, b text, c text); +GRANT ALL ON x1 TO PUBLIC; + +INSERT INTO x1 VALUES + (1, 'abc', 'regress_rls_bob'), + (2, 'bcd', 'regress_rls_bob'), + (3, 'cde', 'regress_rls_carol'), + (4, 'def', 'regress_rls_carol'), + (5, 'efg', 'regress_rls_bob'), + (6, 'fgh', 'regress_rls_bob'), + (7, 'fgh', 'regress_rls_carol'), + (8, 'fgh', 'regress_rls_carol'); + +CREATE POLICY p0 ON x1 FOR ALL USING (c = current_user); +CREATE POLICY p1 ON x1 FOR SELECT USING (a % 2 = 0); +CREATE POLICY p2 ON x1 FOR INSERT WITH CHECK (a % 2 = 1); +CREATE POLICY p3 ON x1 FOR UPDATE USING (a % 2 = 0); +CREATE POLICY p4 ON x1 FOR DELETE USING (a < 8); + +ALTER TABLE x1 ENABLE ROW LEVEL SECURITY; + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM x1 WHERE f_leak(b) ORDER BY a ASC; +UPDATE x1 SET b = b || '_updt' WHERE f_leak(b) RETURNING *; + +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM x1 WHERE f_leak(b) ORDER BY a ASC; +UPDATE x1 SET b = b || '_updt' WHERE f_leak(b) RETURNING *; +DELETE FROM x1 WHERE f_leak(b) RETURNING *; + +-- +-- Duplicate Policy Names +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE y1 (a int, b text); +CREATE TABLE y2 (a int, b text); + +GRANT ALL ON y1, y2 TO regress_rls_bob; + +CREATE POLICY p1 ON y1 FOR ALL USING (a % 2 = 0); +CREATE POLICY p2 ON y1 FOR SELECT USING (a > 2); +CREATE POLICY p1 ON y1 FOR SELECT USING (a % 2 = 1); --fail +CREATE POLICY p1 ON y2 FOR ALL USING (a % 2 = 0); --OK + +ALTER TABLE y1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE y2 ENABLE ROW LEVEL SECURITY; + +-- +-- Expression structure with SBV +-- +-- Create view as table owner. RLS should NOT be applied. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE VIEW rls_sbv WITH (security_barrier) AS + SELECT * FROM y1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM rls_sbv WHERE (a = 1); +DROP VIEW rls_sbv; + +-- Create view as role that does not own table. RLS should be applied. +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW rls_sbv WITH (security_barrier) AS + SELECT * FROM y1 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM rls_sbv WHERE (a = 1); +DROP VIEW rls_sbv; + +-- +-- Expression structure +-- +SET SESSION AUTHORIZATION regress_rls_alice; +INSERT INTO y2 (SELECT x, md5(x::text) FROM generate_series(0,20) x); +ANALYZE y2; +CREATE POLICY p2 ON y2 USING (a % 3 = 0); +CREATE POLICY p3 ON y2 USING (a % 4 = 0); + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM y2 WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM y2 WHERE f_leak(b); + +-- +-- Qual push-down of leaky functions, when not referring to table +-- +SELECT * FROM y2 WHERE f_leak('abc'); +EXPLAIN (COSTS OFF) SELECT * FROM y2 WHERE f_leak('abc'); + +CREATE TABLE test_qual_pushdown ( + abc text +); + +INSERT INTO test_qual_pushdown VALUES ('abc'),('def'); +ANALYZE test_qual_pushdown; + +SELECT * FROM y2 JOIN test_qual_pushdown ON (b = abc) WHERE f_leak(abc); +EXPLAIN (COSTS OFF) SELECT * FROM y2 JOIN test_qual_pushdown ON (b = abc) WHERE f_leak(abc); + +SELECT * FROM y2 JOIN test_qual_pushdown ON (b = abc) WHERE f_leak(b); +EXPLAIN (COSTS OFF) SELECT * FROM y2 JOIN test_qual_pushdown ON (b = abc) WHERE f_leak(b); + +DROP TABLE test_qual_pushdown; + +-- +-- Plancache invalidate on user change. +-- +RESET SESSION AUTHORIZATION; + +DROP TABLE t1 CASCADE; + +CREATE TABLE t1 (a integer); + +GRANT SELECT ON t1 TO regress_rls_bob, regress_rls_carol; + +CREATE POLICY p1 ON t1 TO regress_rls_bob USING ((a % 2) = 0); +CREATE POLICY p2 ON t1 TO regress_rls_carol USING ((a % 4) = 0); + +ALTER TABLE t1 ENABLE ROW LEVEL SECURITY; + +-- Prepare as regress_rls_bob +SET ROLE regress_rls_bob; +PREPARE role_inval AS SELECT * FROM t1; +-- Check plan +EXPLAIN (COSTS OFF) EXECUTE role_inval; + +-- Change to regress_rls_carol +SET ROLE regress_rls_carol; +-- Check plan- should be different +EXPLAIN (COSTS OFF) EXECUTE role_inval; + +-- Change back to regress_rls_bob +SET ROLE regress_rls_bob; +-- Check plan- should be back to original +EXPLAIN (COSTS OFF) EXECUTE role_inval; + +-- +-- CTE and RLS +-- +RESET SESSION AUTHORIZATION; +DROP TABLE t1 CASCADE; +CREATE TABLE t1 (a integer, b text); +CREATE POLICY p1 ON t1 USING (a % 2 = 0); + +ALTER TABLE t1 ENABLE ROW LEVEL SECURITY; + +GRANT ALL ON t1 TO regress_rls_bob; + +INSERT INTO t1 (SELECT x, md5(x::text) FROM generate_series(0,20) x); + +SET SESSION AUTHORIZATION regress_rls_bob; + +WITH cte1 AS MATERIALIZED (SELECT * FROM t1 WHERE f_leak(b)) SELECT * FROM cte1; +EXPLAIN (COSTS OFF) +WITH cte1 AS MATERIALIZED (SELECT * FROM t1 WHERE f_leak(b)) SELECT * FROM cte1; + +WITH cte1 AS (UPDATE t1 SET a = a + 1 RETURNING *) SELECT * FROM cte1; --fail +WITH cte1 AS (UPDATE t1 SET a = a RETURNING *) SELECT * FROM cte1; --ok + +WITH cte1 AS (INSERT INTO t1 VALUES (21, 'Fail') RETURNING *) SELECT * FROM cte1; --fail +WITH cte1 AS (INSERT INTO t1 VALUES (20, 'Success') RETURNING *) SELECT * FROM cte1; --ok + +-- +-- Rename Policy +-- +RESET SESSION AUTHORIZATION; +ALTER POLICY p1 ON t1 RENAME TO p1; --fail + +SELECT polname, relname + FROM pg_policy pol + JOIN pg_class pc ON (pc.oid = pol.polrelid) + WHERE relname = 't1'; + +ALTER POLICY p1 ON t1 RENAME TO p2; --ok + +SELECT polname, relname + FROM pg_policy pol + JOIN pg_class pc ON (pc.oid = pol.polrelid) + WHERE relname = 't1'; + +-- +-- Check INSERT SELECT +-- +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE TABLE t2 (a integer, b text); +INSERT INTO t2 (SELECT * FROM t1); +EXPLAIN (COSTS OFF) INSERT INTO t2 (SELECT * FROM t1); +SELECT * FROM t2; +EXPLAIN (COSTS OFF) SELECT * FROM t2; +CREATE TABLE t3 AS SELECT * FROM t1; +SELECT * FROM t3; +SELECT * INTO t4 FROM t1; +SELECT * FROM t4; + +-- +-- RLS with JOIN +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE blog (id integer, author text, post text); +CREATE TABLE comment (blog_id integer, message text); + +GRANT ALL ON blog, comment TO regress_rls_bob; + +CREATE POLICY blog_1 ON blog USING (id % 2 = 0); + +ALTER TABLE blog ENABLE ROW LEVEL SECURITY; + +INSERT INTO blog VALUES + (1, 'alice', 'blog #1'), + (2, 'bob', 'blog #1'), + (3, 'alice', 'blog #2'), + (4, 'alice', 'blog #3'), + (5, 'john', 'blog #1'); + +INSERT INTO comment VALUES + (1, 'cool blog'), + (1, 'fun blog'), + (3, 'crazy blog'), + (5, 'what?'), + (4, 'insane!'), + (2, 'who did it?'); + +SET SESSION AUTHORIZATION regress_rls_bob; +-- Check RLS JOIN with Non-RLS. +SELECT id, author, message FROM blog JOIN comment ON id = blog_id; +-- Check Non-RLS JOIN with RLS. +SELECT id, author, message FROM comment JOIN blog ON id = blog_id; + +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE POLICY comment_1 ON comment USING (blog_id < 4); + +ALTER TABLE comment ENABLE ROW LEVEL SECURITY; + +SET SESSION AUTHORIZATION regress_rls_bob; +-- Check RLS JOIN RLS +SELECT id, author, message FROM blog JOIN comment ON id = blog_id; +SELECT id, author, message FROM comment JOIN blog ON id = blog_id; + +SET SESSION AUTHORIZATION regress_rls_alice; +DROP TABLE blog, comment; + +-- +-- Default Deny Policy +-- +RESET SESSION AUTHORIZATION; +DROP POLICY p2 ON t1; +ALTER TABLE t1 OWNER TO regress_rls_alice; + +-- Check that default deny does not apply to superuser. +RESET SESSION AUTHORIZATION; +SELECT * FROM t1; +EXPLAIN (COSTS OFF) SELECT * FROM t1; + +-- Check that default deny does not apply to table owner. +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM t1; +EXPLAIN (COSTS OFF) SELECT * FROM t1; + +-- Check that default deny applies to non-owner/non-superuser when RLS on. +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO ON; +SELECT * FROM t1; +EXPLAIN (COSTS OFF) SELECT * FROM t1; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM t1; +EXPLAIN (COSTS OFF) SELECT * FROM t1; + +-- +-- COPY TO/FROM +-- + +RESET SESSION AUTHORIZATION; +DROP TABLE copy_t CASCADE; +CREATE TABLE copy_t (a integer, b text); +CREATE POLICY p1 ON copy_t USING (a % 2 = 0); + +ALTER TABLE copy_t ENABLE ROW LEVEL SECURITY; + +GRANT ALL ON copy_t TO regress_rls_bob, regress_rls_exempt_user; + +INSERT INTO copy_t (SELECT x, md5(x::text) FROM generate_series(0,10) x); + +-- Check COPY TO as Superuser/owner. +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; +SET row_security TO ON; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; + +-- Check COPY TO as user with permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO OFF; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - would be affected by RLS +SET row_security TO ON; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok + +-- Check COPY TO as user with permissions and BYPASSRLS +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok +SET row_security TO ON; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok + +-- Check COPY TO as user without permissions. SET row_security TO OFF; +SET SESSION AUTHORIZATION regress_rls_carol; +SET row_security TO OFF; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - would be affected by RLS +SET row_security TO ON; +COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - permission denied + +-- Check COPY relation TO; keep it just one row to avoid reordering issues +RESET SESSION AUTHORIZATION; +SET row_security TO ON; +CREATE TABLE copy_rel_to (a integer, b text); +CREATE POLICY p1 ON copy_rel_to USING (a % 2 = 0); + +ALTER TABLE copy_rel_to ENABLE ROW LEVEL SECURITY; + +GRANT ALL ON copy_rel_to TO regress_rls_bob, regress_rls_exempt_user; + +INSERT INTO copy_rel_to VALUES (1, md5('1')); + +-- Check COPY TO as Superuser/owner. +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; +SET row_security TO ON; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; + +-- Check COPY TO as user with permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO OFF; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - would be affected by RLS +SET row_security TO ON; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok + +-- Check COPY TO as user with permissions and BYPASSRLS +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO OFF; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok +SET row_security TO ON; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok + +-- Check COPY TO as user without permissions. SET row_security TO OFF; +SET SESSION AUTHORIZATION regress_rls_carol; +SET row_security TO OFF; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied +SET row_security TO ON; +COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied + +-- Check COPY FROM as Superuser/owner. +RESET SESSION AUTHORIZATION; +SET row_security TO OFF; +COPY copy_t FROM STDIN; --ok +1 abc +2 bcd +3 cde +4 def +\. +SET row_security TO ON; +COPY copy_t FROM STDIN; --ok +1 abc +2 bcd +3 cde +4 def +\. + +-- Check COPY FROM as user with permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SET row_security TO OFF; +COPY copy_t FROM STDIN; --fail - would be affected by RLS. +SET row_security TO ON; +COPY copy_t FROM STDIN; --fail - COPY FROM not supported by RLS. + +-- Check COPY FROM as user with permissions and BYPASSRLS +SET SESSION AUTHORIZATION regress_rls_exempt_user; +SET row_security TO ON; +COPY copy_t FROM STDIN; --ok +1 abc +2 bcd +3 cde +4 def +\. + +-- Check COPY FROM as user without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SET row_security TO OFF; +COPY copy_t FROM STDIN; --fail - permission denied. +SET row_security TO ON; +COPY copy_t FROM STDIN; --fail - permission denied. + +RESET SESSION AUTHORIZATION; +DROP TABLE copy_t; +DROP TABLE copy_rel_to CASCADE; + +-- Check WHERE CURRENT OF +SET SESSION AUTHORIZATION regress_rls_alice; + +CREATE TABLE current_check (currentid int, payload text, rlsuser text); +GRANT ALL ON current_check TO PUBLIC; + +INSERT INTO current_check VALUES + (1, 'abc', 'regress_rls_bob'), + (2, 'bcd', 'regress_rls_bob'), + (3, 'cde', 'regress_rls_bob'), + (4, 'def', 'regress_rls_bob'); + +CREATE POLICY p1 ON current_check FOR SELECT USING (currentid % 2 = 0); +CREATE POLICY p2 ON current_check FOR DELETE USING (currentid = 4 AND rlsuser = current_user); +CREATE POLICY p3 ON current_check FOR UPDATE USING (currentid = 4) WITH CHECK (rlsuser = current_user); + +ALTER TABLE current_check ENABLE ROW LEVEL SECURITY; + +SET SESSION AUTHORIZATION regress_rls_bob; + +-- Can SELECT even rows +SELECT * FROM current_check; + +-- Cannot UPDATE row 2 +UPDATE current_check SET payload = payload || '_new' WHERE currentid = 2 RETURNING *; + +BEGIN; + +DECLARE current_check_cursor SCROLL CURSOR FOR SELECT * FROM current_check; +-- Returns rows that can be seen according to SELECT policy, like plain SELECT +-- above (even rows) +FETCH ABSOLUTE 1 FROM current_check_cursor; +-- Still cannot UPDATE row 2 through cursor +UPDATE current_check SET payload = payload || '_new' WHERE CURRENT OF current_check_cursor RETURNING *; +-- Can update row 4 through cursor, which is the next visible row +FETCH RELATIVE 1 FROM current_check_cursor; +UPDATE current_check SET payload = payload || '_new' WHERE CURRENT OF current_check_cursor RETURNING *; +SELECT * FROM current_check; +-- Plan should be a subquery TID scan +EXPLAIN (COSTS OFF) UPDATE current_check SET payload = payload WHERE CURRENT OF current_check_cursor; +-- start_ignore +-- GPDB: does not support backwards scans, commit and restart +COMMIT; +BEGIN; +DECLARE current_check_cursor SCROLL CURSOR FOR SELECT * FROM current_check; +-- end_ignore +-- Similarly can only delete row 4 +FETCH ABSOLUTE 1 FROM current_check_cursor; +DELETE FROM current_check WHERE CURRENT OF current_check_cursor RETURNING *; +FETCH RELATIVE 1 FROM current_check_cursor; +DELETE FROM current_check WHERE CURRENT OF current_check_cursor RETURNING *; +SELECT * FROM current_check; + +COMMIT; + +-- +-- check pg_stats view filtering +-- +SET row_security TO ON; +SET SESSION AUTHORIZATION regress_rls_alice; +ANALYZE current_check; +-- Stats visible +SELECT row_security_active('current_check'); +SELECT attname, most_common_vals FROM pg_stats + WHERE tablename = 'current_check' + ORDER BY 1; + +SET SESSION AUTHORIZATION regress_rls_bob; +-- Stats not visible +SELECT row_security_active('current_check'); +SELECT attname, most_common_vals FROM pg_stats + WHERE tablename = 'current_check' + ORDER BY 1; + +-- +-- Collation support +-- +BEGIN; +CREATE TABLE coll_t (c) AS VALUES ('bar'::text); +CREATE POLICY coll_p ON coll_t USING (c < ('foo'::text COLLATE "C")); +ALTER TABLE coll_t ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON coll_t TO regress_rls_alice; +SELECT (string_to_array(polqual, ':'))[7] AS inputcollid FROM pg_policy WHERE polrelid = 'coll_t'::regclass; +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM coll_t; +ROLLBACK; + +-- +-- Shared Object Dependencies +-- +RESET SESSION AUTHORIZATION; +BEGIN; +CREATE ROLE regress_rls_eve; +CREATE ROLE regress_rls_frank; +CREATE TABLE tbl1 (c) AS VALUES ('bar'::text); +GRANT SELECT ON TABLE tbl1 TO regress_rls_eve; +CREATE POLICY P ON tbl1 TO regress_rls_eve, regress_rls_frank USING (true); +SELECT refclassid::regclass, deptype + FROM pg_depend + WHERE classid = 'pg_policy'::regclass + AND refobjid = 'tbl1'::regclass; +SELECT refclassid::regclass, deptype + FROM pg_shdepend + WHERE classid = 'pg_policy'::regclass + AND refobjid IN ('regress_rls_eve'::regrole, 'regress_rls_frank'::regrole); + +SAVEPOINT q; +DROP ROLE regress_rls_eve; --fails due to dependency on POLICY p +ROLLBACK TO q; + +ALTER POLICY p ON tbl1 TO regress_rls_frank USING (true); +SAVEPOINT q; +DROP ROLE regress_rls_eve; --fails due to dependency on GRANT SELECT +ROLLBACK TO q; + +REVOKE ALL ON TABLE tbl1 FROM regress_rls_eve; +SAVEPOINT q; +DROP ROLE regress_rls_eve; --succeeds +ROLLBACK TO q; + +SAVEPOINT q; +DROP ROLE regress_rls_frank; --fails due to dependency on POLICY p +ROLLBACK TO q; + +DROP POLICY p ON tbl1; +SAVEPOINT q; +DROP ROLE regress_rls_frank; -- succeeds +ROLLBACK TO q; + +ROLLBACK; -- cleanup + +-- +-- Converting table to view +-- +BEGIN; +CREATE TABLE t (c int); +CREATE POLICY p ON t USING (c % 2 = 1); +ALTER TABLE t ENABLE ROW LEVEL SECURITY; + +SAVEPOINT q; +CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD + SELECT * FROM generate_series(1,5) t0(c); -- fails due to row-level security enabled +ROLLBACK TO q; + +ALTER TABLE t DISABLE ROW LEVEL SECURITY; +SAVEPOINT q; +CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD + SELECT * FROM generate_series(1,5) t0(c); -- fails due to policy p on t +ROLLBACK TO q; + +DROP POLICY p ON t; +CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD + SELECT * FROM generate_series(1,5) t0(c); -- succeeds +ROLLBACK; + +-- +-- Policy expression handling +-- +BEGIN; +CREATE TABLE t (c) AS VALUES ('bar'::text); +CREATE POLICY p ON t USING (max(c)); -- fails: aggregate functions are not allowed in policy expressions +ROLLBACK; + +-- +-- Non-target relations are only subject to SELECT policies +-- +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE r1 (a int); +CREATE TABLE r2 (a int); +INSERT INTO r1 VALUES (10), (20); +INSERT INTO r2 VALUES (10), (20); + +GRANT ALL ON r1, r2 TO regress_rls_bob; + +CREATE POLICY p1 ON r1 USING (true); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; + +CREATE POLICY p1 ON r2 FOR SELECT USING (true); +CREATE POLICY p2 ON r2 FOR INSERT WITH CHECK (false); +CREATE POLICY p3 ON r2 FOR UPDATE USING (false); +CREATE POLICY p4 ON r2 FOR DELETE USING (false); +ALTER TABLE r2 ENABLE ROW LEVEL SECURITY; + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM r1; +SELECT * FROM r2; + +-- r2 is read-only +INSERT INTO r2 VALUES (2); -- Not allowed +UPDATE r2 SET a = 2 RETURNING *; -- Updates nothing +DELETE FROM r2 RETURNING *; -- Deletes nothing + +-- r2 can be used as a non-target relation in DML +INSERT INTO r1 SELECT a + 1 FROM r2 RETURNING *; -- OK +UPDATE r1 SET a = r2.a + 2 FROM r2 WHERE r1.a = r2.a RETURNING *; -- OK +DELETE FROM r1 USING r2 WHERE r1.a = r2.a + 2 RETURNING *; -- OK +SELECT * FROM r1; +SELECT * FROM r2; + +SET SESSION AUTHORIZATION regress_rls_alice; +DROP TABLE r1; +DROP TABLE r2; + +-- +-- FORCE ROW LEVEL SECURITY applies RLS to owners too +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security = on; +CREATE TABLE r1 (a int); +INSERT INTO r1 VALUES (10), (20); + +CREATE POLICY p1 ON r1 USING (false); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; + +-- No error, but no rows +TABLE r1; + +-- RLS error +INSERT INTO r1 VALUES (1); + +-- No error (unable to see any rows to update) +UPDATE r1 SET a = 1; +TABLE r1; + +-- No error (unable to see any rows to delete) +DELETE FROM r1; +TABLE r1; + +SET row_security = off; +-- these all fail, would be affected by RLS +TABLE r1; +UPDATE r1 SET a = 1; +DELETE FROM r1; + +DROP TABLE r1; + +-- +-- FORCE ROW LEVEL SECURITY does not break RI +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security = on; +CREATE TABLE r1 (a int PRIMARY KEY); +CREATE TABLE r2 (a int REFERENCES r1); +INSERT INTO r1 VALUES (10), (20); +INSERT INTO r2 VALUES (10), (20); + +-- Create policies on r2 which prevent the +-- owner from seeing any rows, but RI should +-- still see them. +CREATE POLICY p1 ON r2 USING (false); +ALTER TABLE r2 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r2 FORCE ROW LEVEL SECURITY; + +-- Errors due to rows in r2 +-- GPDB: Foreign key constraints are not enforced in GPDB, so no error. +DELETE FROM r1; + +-- Reset r2 to no-RLS +DROP POLICY p1 ON r2; +ALTER TABLE r2 NO FORCE ROW LEVEL SECURITY; +ALTER TABLE r2 DISABLE ROW LEVEL SECURITY; + +-- clean out r2 for INSERT test below +DELETE FROM r2; + +-- Change r1 to not allow rows to be seen +CREATE POLICY p1 ON r1 USING (false); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; + +-- No rows seen +TABLE r1; + +-- No error, RI still sees that row exists in r1 +INSERT INTO r2 VALUES (10); + +DROP TABLE r2; +DROP TABLE r1; + +-- Ensure cascaded DELETE works +CREATE TABLE r1 (a int PRIMARY KEY); +CREATE TABLE r2 (a int REFERENCES r1 ON DELETE CASCADE); +INSERT INTO r1 VALUES (10), (20); +INSERT INTO r2 VALUES (10), (20); + +-- Create policies on r2 which prevent the +-- owner from seeing any rows, but RI should +-- still see them. +CREATE POLICY p1 ON r2 USING (false); +ALTER TABLE r2 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r2 FORCE ROW LEVEL SECURITY; + +-- Deletes all records from both +DELETE FROM r1; + +-- Remove FORCE from r2 +ALTER TABLE r2 NO FORCE ROW LEVEL SECURITY; + +-- As owner, we now bypass RLS +-- verify no rows in r2 now +-- GPDB: Foreign key constraints are not enforced in GPDB, hence the rows are still there. +TABLE r2; + +DROP TABLE r2; +DROP TABLE r1; + +-- Ensure cascaded UPDATE works +CREATE TABLE r1 (a int PRIMARY KEY); +CREATE TABLE r2 (a int REFERENCES r1 ON UPDATE CASCADE); +INSERT INTO r1 VALUES (10), (20); +INSERT INTO r2 VALUES (10), (20); + +-- Create policies on r2 which prevent the +-- owner from seeing any rows, but RI should +-- still see them. +CREATE POLICY p1 ON r2 USING (false); +ALTER TABLE r2 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r2 FORCE ROW LEVEL SECURITY; + +-- Updates records in both +-- not supported in GPDB +UPDATE r1 SET a = a+5; + +-- Remove FORCE from r2 +ALTER TABLE r2 NO FORCE ROW LEVEL SECURITY; + +-- As owner, we now bypass RLS +-- verify records in r2 updated +TABLE r2; + +DROP TABLE r2; +DROP TABLE r1; + +-- +-- Test INSERT+RETURNING applies SELECT policies as +-- WithCheckOptions (meaning an error is thrown) +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security = on; +CREATE TABLE r1 (a int); + +CREATE POLICY p1 ON r1 FOR SELECT USING (false); +CREATE POLICY p2 ON r1 FOR INSERT WITH CHECK (true); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; + +-- Works fine +INSERT INTO r1 VALUES (10), (20); + +-- No error, but no rows +TABLE r1; + +SET row_security = off; +-- fail, would be affected by RLS +TABLE r1; + +SET row_security = on; + +-- Error +INSERT INTO r1 VALUES (10), (20) RETURNING *; + +DROP TABLE r1; + +-- +-- Test UPDATE+RETURNING applies SELECT policies as +-- WithCheckOptions (meaning an error is thrown) +-- +SET SESSION AUTHORIZATION regress_rls_alice; +SET row_security = on; +CREATE TABLE r1 (a int PRIMARY KEY); + +CREATE POLICY p1 ON r1 FOR SELECT USING (a < 20); +CREATE POLICY p2 ON r1 FOR UPDATE USING (a < 20) WITH CHECK (true); +CREATE POLICY p3 ON r1 FOR INSERT WITH CHECK (true); +INSERT INTO r1 VALUES (10); +ALTER TABLE r1 ENABLE ROW LEVEL SECURITY; +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; + +-- Works fine +UPDATE r1 SET a = 30; + +-- Show updated rows +ALTER TABLE r1 NO FORCE ROW LEVEL SECURITY; +TABLE r1; +-- reset value in r1 for test with RETURNING +UPDATE r1 SET a = 10; + +-- Verify row reset +TABLE r1; + +ALTER TABLE r1 FORCE ROW LEVEL SECURITY; + +-- Error +UPDATE r1 SET a = 30 RETURNING *; + +-- UPDATE path of INSERT ... ON CONFLICT DO UPDATE should also error out +INSERT INTO r1 VALUES (10) + ON CONFLICT (a) DO UPDATE SET a = 30 RETURNING *; + +-- Should still error out without RETURNING (use of arbiter always requires +-- SELECT permissions) +INSERT INTO r1 VALUES (10) + ON CONFLICT (a) DO UPDATE SET a = 30; +INSERT INTO r1 VALUES (10) + ON CONFLICT ON CONSTRAINT r1_pkey DO UPDATE SET a = 30; + +DROP TABLE r1; + +-- Check dependency handling +RESET SESSION AUTHORIZATION; +CREATE TABLE dep1 (c1 int); +CREATE TABLE dep2 (c1 int); + +CREATE POLICY dep_p1 ON dep1 TO regress_rls_bob USING (c1 > (select max(dep2.c1) from dep2)); +ALTER POLICY dep_p1 ON dep1 TO regress_rls_bob,regress_rls_carol; + +-- Should return one +SELECT count(*) = 1 FROM pg_depend + WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1') + AND refobjid = (SELECT oid FROM pg_class WHERE relname = 'dep2'); + +ALTER POLICY dep_p1 ON dep1 USING (true); + +-- Should return one +SELECT count(*) = 1 FROM pg_shdepend + WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1') + AND refobjid = (SELECT oid FROM pg_authid WHERE rolname = 'regress_rls_bob'); + +-- Should return one +SELECT count(*) = 1 FROM pg_shdepend + WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1') + AND refobjid = (SELECT oid FROM pg_authid WHERE rolname = 'regress_rls_carol'); + +-- Should return zero +SELECT count(*) = 0 FROM pg_depend + WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1') + AND refobjid = (SELECT oid FROM pg_class WHERE relname = 'dep2'); + +-- DROP OWNED BY testing +RESET SESSION AUTHORIZATION; + +CREATE ROLE regress_rls_dob_role1; +CREATE ROLE regress_rls_dob_role2; + +CREATE TABLE dob_t1 (c1 int); +CREATE TABLE dob_t2 (c1 int) PARTITION BY RANGE (c1); + +CREATE POLICY p1 ON dob_t1 TO regress_rls_dob_role1 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t1; -- should fail, already gone + +CREATE POLICY p1 ON dob_t1 TO regress_rls_dob_role1,regress_rls_dob_role2 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t1; -- should succeed + +-- same cases with duplicate polroles entries +CREATE POLICY p1 ON dob_t1 TO regress_rls_dob_role1,regress_rls_dob_role1 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t1; -- should fail, already gone + +CREATE POLICY p1 ON dob_t1 TO regress_rls_dob_role1,regress_rls_dob_role1,regress_rls_dob_role2 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t1; -- should succeed + +-- partitioned target +CREATE POLICY p1 ON dob_t2 TO regress_rls_dob_role1,regress_rls_dob_role2 USING (true); +DROP OWNED BY regress_rls_dob_role1; +DROP POLICY p1 ON dob_t2; -- should succeed + +DROP USER regress_rls_dob_role1; +DROP USER regress_rls_dob_role2; + +-- Bug #15708: view + table with RLS should check policies as view owner +CREATE TABLE ref_tbl (a int); +INSERT INTO ref_tbl VALUES (1); + +CREATE TABLE rls_tbl (a int); +INSERT INTO rls_tbl VALUES (10); +ALTER TABLE rls_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY p1 ON rls_tbl USING (EXISTS (SELECT 1 FROM ref_tbl)); + +GRANT SELECT ON ref_tbl TO regress_rls_bob; +GRANT SELECT ON rls_tbl TO regress_rls_bob; + +CREATE VIEW rls_view AS SELECT * FROM rls_tbl; +ALTER VIEW rls_view OWNER TO regress_rls_bob; +GRANT SELECT ON rls_view TO regress_rls_alice; + +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM ref_tbl; -- Permission denied +SELECT * FROM rls_tbl; -- Permission denied +SELECT * FROM rls_view; -- OK +RESET SESSION AUTHORIZATION; + +DROP VIEW rls_view; +DROP TABLE rls_tbl; +DROP TABLE ref_tbl; + +-- Leaky operator test +CREATE TABLE rls_tbl (a int); +INSERT INTO rls_tbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_tbl; + +ALTER TABLE rls_tbl ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_tbl TO regress_rls_alice; + +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE FUNCTION op_leak(int, int) RETURNS bool + AS 'BEGIN RAISE NOTICE ''op_leak => %, %'', $1, $2; RETURN $1 < $2; END' + LANGUAGE plpgsql; +CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, + restrict = scalarltsel); +SELECT * FROM rls_tbl WHERE a <<< 1000; +DROP OPERATOR <<< (int, int); +DROP FUNCTION op_leak(int, int); +RESET SESSION AUTHORIZATION; +DROP TABLE rls_tbl; + +-- Bug #16006: whole-row Vars in a policy don't play nice with sub-selects +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE rls_tbl (a int, b int, c int); +CREATE POLICY p1 ON rls_tbl USING (rls_tbl >= ROW(1,1,1)); + +ALTER TABLE rls_tbl ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_tbl FORCE ROW LEVEL SECURITY; + +INSERT INTO rls_tbl SELECT 10, 20, 30; +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO rls_tbl + SELECT * FROM (SELECT b, c FROM rls_tbl ORDER BY a) ss; +INSERT INTO rls_tbl + SELECT * FROM (SELECT b, c FROM rls_tbl ORDER BY a) ss; +SELECT * FROM rls_tbl; + +DROP TABLE rls_tbl; +RESET SESSION AUTHORIZATION; + +-- +-- Clean up objects +-- +RESET SESSION AUTHORIZATION; + +DROP SCHEMA regress_rls_schema CASCADE; + +DROP USER regress_rls_alice; +DROP USER regress_rls_bob; +DROP USER regress_rls_carol; +DROP USER regress_rls_dave; +DROP USER regress_rls_exempt_user; +DROP ROLE regress_rls_group1; +DROP ROLE regress_rls_group2; + +-- Arrange to have a few policies left over, for testing +-- pg_dump/pg_restore +CREATE SCHEMA regress_rls_schema; +CREATE TABLE rls_tbl (c1 int); +ALTER TABLE rls_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY p1 ON rls_tbl USING (c1 > 5); +CREATE POLICY p2 ON rls_tbl FOR SELECT USING (c1 <= 3); +CREATE POLICY p3 ON rls_tbl FOR UPDATE USING (c1 <= 3) WITH CHECK (c1 > 5); +CREATE POLICY p4 ON rls_tbl FOR DELETE USING (c1 <= 3); + +CREATE TABLE rls_tbl_force (c1 int); +ALTER TABLE rls_tbl_force ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_tbl_force FORCE ROW LEVEL SECURITY; +CREATE POLICY p1 ON rls_tbl_force USING (c1 = 5) WITH CHECK (c1 < 5); +CREATE POLICY p2 ON rls_tbl_force FOR SELECT USING (c1 = 8); +CREATE POLICY p3 ON rls_tbl_force FOR UPDATE USING (c1 = 8) WITH CHECK (c1 >= 5); +CREATE POLICY p4 ON rls_tbl_force FOR DELETE USING (c1 = 8); diff --git a/src/test/singlenode_regress/sql/rowtypes.sql b/src/test/singlenode_regress/sql/rowtypes.sql new file mode 100644 index 00000000000..f4986fab488 --- /dev/null +++ b/src/test/singlenode_regress/sql/rowtypes.sql @@ -0,0 +1,520 @@ +-- +-- ROWTYPES +-- + +-- start_ignore +-- GPDB: With the default settings, the planner chooses different plans some +-- of the queries than in upstream. That is beause low vis fraction +-- estimation (pg_class.relallvisible) on GP causes higher index only scan +-- cost so bitmap index scan outperforms index only scan. +-- +-- Some tests do 'enable_sort=off' or 'enable_bitmapscan=off' to get the same +-- plans as in upstream. +-- end_ignore + +-- Make both a standalone composite type and a table rowtype + +create type complex_t as (r float8, i float8); + +create temp table fullname (first text, last text); + +-- Nested composite + +create type quad as (c1 complex_t, c2 complex_t); + +-- Some simple tests of I/O conversions and row construction + +select (1.1,2.2)::complex_t, row((3.3,4.4),(5.5,null))::quad; + +select row('Joe', 'Blow')::fullname, '(Joe,Blow)'::fullname; + +select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname; + +select '(Joe,"von""Blow")'::fullname, E'(Joe,d\\\\Blow)'::fullname; + +select '(Joe,"Blow,Jr")'::fullname; + +select '(Joe,)'::fullname; -- ok, null 2nd column +select '(Joe)'::fullname; -- bad +select '(Joe,,)'::fullname; -- bad +select '[]'::fullname; -- bad +select ' (Joe,Blow) '::fullname; -- ok, extra whitespace +select '(Joe,Blow) /'::fullname; -- bad + +create temp table quadtable(f1 int, q quad); + +insert into quadtable values (1, ((3.3,4.4),(5.5,6.6))); +insert into quadtable values (2, ((null,4.4),(5.5,6.6))); + +select * from quadtable; + +select f1, q.c1 from quadtable; -- fails, q is a table reference + +select f1, (q).c1, (qq.q).c1.i from quadtable qq; + +create temp table people (fn fullname, bd date); + +insert into people values ('(Joe,Blow)', '1984-01-10'); + +select * from people; + +-- at the moment this will not work due to ALTER TABLE inadequacy: +alter table fullname add column suffix text default ''; + +-- but this should work: +alter table fullname add column suffix text default null; + +select * from people; + +-- test insertion/updating of subfields +update people set fn.suffix = 'Jr'; + +select * from people; + +insert into quadtable (f1, q.c1.r, q.c2.i) values(44,55,66); + +update quadtable set q.c1.r = 12 where f1 = 2; + +update quadtable set q.c1 = 12; -- error, type mismatch + +select * from quadtable; + +-- The object here is to ensure that toasted references inside +-- composite values don't cause problems. The large f1 value will +-- be toasted inside pp, it must still work after being copied to people. + +create temp table pp (f1 text); +insert into pp values (repeat('abcdefghijkl', 100000)); + +insert into people select ('Jim', f1, null)::fullname, current_date from pp; + +select (fn).first, substr((fn).last, 1, 20), length((fn).last) from people; + +-- Test row comparison semantics. Prior to PG 8.2 we did this in a totally +-- non-spec-compliant way. + +select ROW(1,2) < ROW(1,3) as true; +select ROW(1,2) < ROW(1,1) as false; +select ROW(1,2) < ROW(1,NULL) as null; +select ROW(1,2,3) < ROW(1,3,NULL) as true; -- the NULL is not examined +select ROW(11,'ABC') < ROW(11,'DEF') as true; +select ROW(11,'ABC') > ROW(11,'DEF') as false; +select ROW(12,'ABC') > ROW(11,'DEF') as true; + +-- = and <> have different NULL-behavior than < etc +select ROW(1,2,3) < ROW(1,NULL,4) as null; +select ROW(1,2,3) = ROW(1,NULL,4) as false; +select ROW(1,2,3) <> ROW(1,NULL,4) as true; + +-- We allow operators beyond the six standard ones, if they have btree +-- operator classes. +select ROW('ABC','DEF') ~<=~ ROW('DEF','ABC') as true; +select ROW('ABC','DEF') ~>=~ ROW('DEF','ABC') as false; +select ROW('ABC','DEF') ~~ ROW('DEF','ABC') as fail; + +-- Comparisons of ROW() expressions can cope with some type mismatches +select ROW(1,2) = ROW(1,2::int8); +select ROW(1,2) in (ROW(3,4), ROW(1,2)); +select ROW(1,2) in (ROW(3,4), ROW(1,2::int8)); + +-- Check row comparison with a subselect +select unique1, unique2 from tenk1 +where (unique1, unique2) < any (select ten, ten from tenk1 where hundred < 3) + and unique1 <= 20 +order by 1; + +-- Also check row comparison with an indexable condition +set enable_sort=off; +explain (costs off) +select thousand, tenthous from tenk1 +where (thousand, tenthous) >= (997, 5000) +order by thousand, tenthous; + +select thousand, tenthous from tenk1 +where (thousand, tenthous) >= (997, 5000) +order by thousand, tenthous; +reset enable_sort; + +explain (costs off) +select thousand, tenthous, four from tenk1 +where (thousand, tenthous, four) > (998, 5000, 3) +order by thousand, tenthous; + +select thousand, tenthous, four from tenk1 +where (thousand, tenthous, four) > (998, 5000, 3) +order by thousand, tenthous; + +set enable_sort=off; +explain (costs off) +select thousand, tenthous from tenk1 +where (998, 5000) < (thousand, tenthous) +order by thousand, tenthous; + +select thousand, tenthous from tenk1 +where (998, 5000) < (thousand, tenthous) +order by thousand, tenthous; +reset enable_sort; + +explain (costs off) +select thousand, hundred from tenk1 +where (998, 5000) < (thousand, hundred) +order by thousand, hundred; + +select thousand, hundred from tenk1 +where (998, 5000) < (thousand, hundred) +order by thousand, hundred; + +-- Test case for bug #14010: indexed row comparisons fail with nulls +create temp table test_table (a text, b text); +insert into test_table values ('a', 'b'); +insert into test_table select 'a', null from generate_series(1,1000); +insert into test_table values ('b', 'a'); +create index on test_table (a,b); +set enable_sort = off; + +explain (costs off) +select a,b from test_table where (a,b) > ('a','a') order by a,b; + +select a,b from test_table where (a,b) > ('a','a') order by a,b; + +reset enable_sort; + +-- Check row comparisons with IN +select * from int8_tbl i8 where i8 in (row(123,456)); -- fail, type mismatch + +explain (costs off) +select * from int8_tbl i8 +where i8 in (row(123,456)::int8_tbl, '(4567890123456789,123)'); + +select * from int8_tbl i8 +where i8 in (row(123,456)::int8_tbl, '(4567890123456789,123)'); + +-- Check ability to select columns from an anonymous rowtype +select (row(1, 2.0)).f1; +select (row(1, 2.0)).f2; +select (row(1, 2.0)).nosuch; -- fail +select (row(1, 2.0)).*; +select (r).f1 from (select row(1, 2.0) as r) ss; +select (r).f3 from (select row(1, 2.0) as r) ss; -- fail +select (r).* from (select row(1, 2.0) as r) ss; + +-- Check some corner cases involving empty rowtypes +select ROW(); +select ROW() IS NULL; +select ROW() = ROW(); + +-- Check ability to create arrays of anonymous rowtypes +select array[ row(1,2), row(3,4), row(5,6) ]; + +-- Check ability to compare an anonymous row to elements of an array +select row(1,1.1) = any (array[ row(7,7.7), row(1,1.1), row(0,0.0) ]); +select row(1,1.1) = any (array[ row(7,7.7), row(1,1.0), row(0,0.0) ]); + +-- Check behavior with a non-comparable rowtype +create type cantcompare as (p point, r float8); +create temp table cc (f1 cantcompare); +insert into cc values('("(1,2)",3)'); +insert into cc values('("(4,5)",6)'); +select * from cc order by f1; -- fail, but should complain about cantcompare + +-- +-- Tests for record_{eq,cmp} +-- + +create type testtype1 as (a int, b int); + +-- all true +select row(1, 2)::testtype1 < row(1, 3)::testtype1; +select row(1, 2)::testtype1 <= row(1, 3)::testtype1; +select row(1, 2)::testtype1 = row(1, 2)::testtype1; +select row(1, 2)::testtype1 <> row(1, 3)::testtype1; +select row(1, 3)::testtype1 >= row(1, 2)::testtype1; +select row(1, 3)::testtype1 > row(1, 2)::testtype1; + +-- all false +select row(1, -2)::testtype1 < row(1, -3)::testtype1; +select row(1, -2)::testtype1 <= row(1, -3)::testtype1; +select row(1, -2)::testtype1 = row(1, -3)::testtype1; +select row(1, -2)::testtype1 <> row(1, -2)::testtype1; +select row(1, -3)::testtype1 >= row(1, -2)::testtype1; +select row(1, -3)::testtype1 > row(1, -2)::testtype1; + +-- true, but see *< below +select row(1, -2)::testtype1 < row(1, 3)::testtype1; + +-- mismatches +create type testtype3 as (a int, b text); +select row(1, 2)::testtype1 < row(1, 'abc')::testtype3; +select row(1, 2)::testtype1 <> row(1, 'abc')::testtype3; +create type testtype5 as (a int); +select row(1, 2)::testtype1 < row(1)::testtype5; +select row(1, 2)::testtype1 <> row(1)::testtype5; + +-- non-comparable types +create type testtype6 as (a int, b point); +select row(1, '(1,2)')::testtype6 < row(1, '(1,3)')::testtype6; +select row(1, '(1,2)')::testtype6 <> row(1, '(1,3)')::testtype6; + +drop type testtype1, testtype3, testtype5, testtype6; + +-- +-- Tests for record_image_{eq,cmp} +-- + +create type testtype1 as (a int, b int); + +-- all true +select row(1, 2)::testtype1 *< row(1, 3)::testtype1; +select row(1, 2)::testtype1 *<= row(1, 3)::testtype1; +select row(1, 2)::testtype1 *= row(1, 2)::testtype1; +select row(1, 2)::testtype1 *<> row(1, 3)::testtype1; +select row(1, 3)::testtype1 *>= row(1, 2)::testtype1; +select row(1, 3)::testtype1 *> row(1, 2)::testtype1; + +-- all false +select row(1, -2)::testtype1 *< row(1, -3)::testtype1; +select row(1, -2)::testtype1 *<= row(1, -3)::testtype1; +select row(1, -2)::testtype1 *= row(1, -3)::testtype1; +select row(1, -2)::testtype1 *<> row(1, -2)::testtype1; +select row(1, -3)::testtype1 *>= row(1, -2)::testtype1; +select row(1, -3)::testtype1 *> row(1, -2)::testtype1; + +-- This returns the "wrong" order because record_image_cmp works on +-- unsigned datums without knowing about the actual data type. +select row(1, -2)::testtype1 *< row(1, 3)::testtype1; + +-- other types +create type testtype2 as (a smallint, b bool); -- byval different sizes +select row(1, true)::testtype2 *< row(2, true)::testtype2; +select row(-2, true)::testtype2 *< row(-1, true)::testtype2; +select row(0, false)::testtype2 *< row(0, true)::testtype2; +select row(0, false)::testtype2 *<> row(0, true)::testtype2; + +create type testtype3 as (a int, b text); -- variable length +select row(1, 'abc')::testtype3 *< row(1, 'abd')::testtype3; +select row(1, 'abc')::testtype3 *< row(1, 'abcd')::testtype3; +select row(1, 'abc')::testtype3 *> row(1, 'abd')::testtype3; +select row(1, 'abc')::testtype3 *<> row(1, 'abd')::testtype3; + +create type testtype4 as (a int, b point); -- by ref, fixed length +select row(1, '(1,2)')::testtype4 *< row(1, '(1,3)')::testtype4; +select row(1, '(1,2)')::testtype4 *<> row(1, '(1,3)')::testtype4; + +-- mismatches +select row(1, 2)::testtype1 *< row(1, 'abc')::testtype3; +select row(1, 2)::testtype1 *<> row(1, 'abc')::testtype3; +create type testtype5 as (a int); +select row(1, 2)::testtype1 *< row(1)::testtype5; +select row(1, 2)::testtype1 *<> row(1)::testtype5; + +-- non-comparable types +create type testtype6 as (a int, b point); +select row(1, '(1,2)')::testtype6 *< row(1, '(1,3)')::testtype6; +select row(1, '(1,2)')::testtype6 *>= row(1, '(1,3)')::testtype6; +select row(1, '(1,2)')::testtype6 *<> row(1, '(1,3)')::testtype6; + +-- anonymous rowtypes in coldeflists +select q.a, q.b = row(2), q.c = array[row(3)], q.d = row(row(4)) from + unnest(array[row(1, row(2), array[row(3)], row(row(4))), + row(2, row(3), array[row(4)], row(row(5)))]) + as q(a int, b record, c record[], d record); + +drop type testtype1, testtype2, testtype3, testtype4, testtype5, testtype6; + + +-- +-- Test case derived from bug #5716: check multiple uses of a rowtype result +-- + +BEGIN; + +CREATE TABLE price ( + id SERIAL PRIMARY KEY, + active BOOLEAN NOT NULL, + price NUMERIC +); + +CREATE TYPE price_input AS ( + id INTEGER, + price NUMERIC +); + +CREATE TYPE price_key AS ( + id INTEGER +); + +CREATE FUNCTION price_key_from_table(price) RETURNS price_key AS $$ + SELECT $1.id +$$ LANGUAGE SQL; + +CREATE FUNCTION price_key_from_input(price_input) RETURNS price_key AS $$ + SELECT $1.id +$$ LANGUAGE SQL; + +insert into price values (1,false,42), (10,false,100), (11,true,17.99); + +UPDATE price + SET active = true, price = input_prices.price + FROM unnest(ARRAY[(10, 123.00), (11, 99.99)]::price_input[]) input_prices + WHERE price_key_from_table(price.*) = price_key_from_input(input_prices.*); + +select * from price; + +rollback; + +-- +-- Test case derived from bug #9085: check * qualification of composite +-- parameters for SQL functions +-- + +create temp table compos (f1 int, f2 text); + +create function fcompos1(v compos) returns void as $$ +insert into compos values (v); -- fail +$$ language sql; + +create function fcompos1(v compos) returns void as $$ +insert into compos values (v.*); +$$ language sql; + +create function fcompos2(v compos) returns void as $$ +select fcompos1(v); +$$ language sql; + +create function fcompos3(v compos) returns void as $$ +select fcompos1(fcompos3.v.*); +$$ language sql; + +select fcompos1(row(1,'one')); +select fcompos2(row(2,'two')); +select fcompos3(row(3,'three')); +select * from compos; + +-- +-- We allow I/O conversion casts from composite types to strings to be +-- invoked via cast syntax, but not functional syntax. This is because +-- the latter is too prone to be invoked unintentionally. +-- +select cast (fullname as text) from fullname; +select fullname::text from fullname; +select text(fullname) from fullname; -- error +select fullname.text from fullname; -- error +-- same, but RECORD instead of named composite type: +select cast (row('Jim', 'Beam') as text); +select (row('Jim', 'Beam'))::text; +select text(row('Jim', 'Beam')); -- error +select (row('Jim', 'Beam')).text; -- error + +-- +-- Check the equivalence of functional and column notation +-- +insert into fullname values ('Joe', 'Blow'); + +select f.last from fullname f; +select last(f) from fullname f; + +create function longname(fullname) returns text language sql +as $$select $1.first || ' ' || $1.last$$; + +select f.longname from fullname f; +select longname(f) from fullname f; + +-- Starting in v11, the notational form does matter if there's ambiguity +alter table fullname add column longname text; + +select f.longname from fullname f; +select longname(f) from fullname f; + +-- +-- Test that composite values are seen to have the correct column names +-- (bug #11210 and other reports) +-- + +select row_to_json(i) from int8_tbl i; +-- since "i" is of type "int8_tbl", attaching aliases doesn't change anything: +select row_to_json(i) from int8_tbl i(x,y); + +-- in these examples, we'll report the exposed column names of the subselect: +select row_to_json(ss) from + (select q1, q2 from int8_tbl) as ss; +select row_to_json(ss) from + (select q1, q2 from int8_tbl offset 0) as ss; +select row_to_json(ss) from + (select q1 as a, q2 as b from int8_tbl) as ss; +select row_to_json(ss) from + (select q1 as a, q2 as b from int8_tbl offset 0) as ss; +select row_to_json(ss) from + (select q1 as a, q2 as b from int8_tbl) as ss(x,y); +select row_to_json(ss) from + (select q1 as a, q2 as b from int8_tbl offset 0) as ss(x,y); + +explain (costs off) +select row_to_json(q) from + (select thousand, tenthous from tenk1 + where thousand = 42 and tenthous < 2000 offset 0) q; +select row_to_json(q) from + (select thousand, tenthous from tenk1 + where thousand = 42 and tenthous < 2000 offset 0) q; +select row_to_json(q) from + (select thousand as x, tenthous as y from tenk1 + where thousand = 42 and tenthous < 2000 offset 0) q; +select row_to_json(q) from + (select thousand as x, tenthous as y from tenk1 + where thousand = 42 and tenthous < 2000 offset 0) q(a,b); + +create temp table tt1 as select * from int8_tbl order by 1 limit 2; +create temp table tt2 () inherits(tt1); +insert into tt2 values(0,0); +select row_to_json(r) from (select q2,q1 from tt1 offset 0) r; + +-- check no-op rowtype conversions +create temp table tt3 () inherits(tt2); +insert into tt3 values(33,44); +select row_to_json(tt3::tt2::tt1) from tt3; + +-- +-- IS [NOT] NULL should not recurse into nested composites (bug #14235) +-- + +explain (verbose, costs off) +select r, r is null as isnull, r is not null as isnotnull +from (values (1,row(1,2)), (1,row(null,null)), (1,null), + (null,row(1,2)), (null,row(null,null)), (null,null) ) r(a,b); + +select r, r is null as isnull, r is not null as isnotnull +from (values (1,row(1,2)), (1,row(null,null)), (1,null), + (null,row(1,2)), (null,row(null,null)), (null,null) ) r(a,b); + +explain (verbose, costs off) +with r(a,b) as materialized + (values (1,row(1,2)), (1,row(null,null)), (1,null), + (null,row(1,2)), (null,row(null,null)), (null,null) ) +select r, r is null as isnull, r is not null as isnotnull from r; + +with r(a,b) as materialized + (values (1,row(1,2)), (1,row(null,null)), (1,null), + (null,row(1,2)), (null,row(null,null)), (null,null) ) +select r, r is null as isnull, r is not null as isnotnull from r; + + +-- +-- Tests for component access / FieldSelect +-- +CREATE TABLE compositetable(a text, b text); +INSERT INTO compositetable(a, b) VALUES('fa', 'fb'); + +-- composite type columns can't directly be accessed (error) +SELECT d.a FROM (SELECT compositetable AS d FROM compositetable) s; +-- but can be accessed with proper parens +SELECT (d).a, (d).b FROM (SELECT compositetable AS d FROM compositetable) s; +-- system columns can't be accessed in composite types (error) +SELECT (d).ctid FROM (SELECT compositetable AS d FROM compositetable) s; + +-- accessing non-existing column in NULL datum errors out +SELECT (NULL::compositetable).nonexistent; +-- existing column in a NULL composite yield NULL +SELECT (NULL::compositetable).a; +-- oids can't be accessed in composite types (error) +SELECT (NULL::compositetable).oid; + +DROP TABLE compositetable; diff --git a/src/test/singlenode_regress/sql/rules.sql b/src/test/singlenode_regress/sql/rules.sql new file mode 100644 index 00000000000..b732833e63c --- /dev/null +++ b/src/test/singlenode_regress/sql/rules.sql @@ -0,0 +1,1259 @@ +-- +-- RULES +-- From Jan's original setup_ruletest.sql and run_ruletest.sql +-- - thomas 1998-09-13 +-- + +-- +-- Tables and rules for the view test +-- +create table rtest_t1 (a int4, b int4); +create table rtest_t2 (a int4, b int4); +create table rtest_t3 (a int4, b int4); + +create view rtest_v1 as select * from rtest_t1; +create rule rtest_v1_ins as on insert to rtest_v1 do instead + insert into rtest_t1 values (new.a, new.b); +create rule rtest_v1_upd as on update to rtest_v1 do instead + update rtest_t1 set a = new.a, b = new.b + where a = old.a; +create rule rtest_v1_del as on delete to rtest_v1 do instead + delete from rtest_t1 where a = old.a; +-- Test comments +COMMENT ON RULE rtest_v1_bad ON rtest_v1 IS 'bad rule'; +COMMENT ON RULE rtest_v1_del ON rtest_v1 IS 'delete rule'; +COMMENT ON RULE rtest_v1_del ON rtest_v1 IS NULL; +-- +-- Tables and rules for the constraint update/delete test +-- +-- Note: +-- Now that we have multiple action rule support, we check +-- both possible syntaxes to define them (The last action +-- can but must not have a semicolon at the end). +-- +create table rtest_system (sysname text, sysdesc text); +create table rtest_interface (sysname text, ifname text); +create table rtest_person (pname text, pdesc text); +create table rtest_admin (pname text, sysname text); + +create rule rtest_sys_upd as on update to rtest_system do also ( + update rtest_interface set sysname = new.sysname + where sysname = old.sysname; + update rtest_admin set sysname = new.sysname + where sysname = old.sysname + ); + +create rule rtest_sys_del as on delete to rtest_system do also ( + delete from rtest_interface where sysname = old.sysname; + delete from rtest_admin where sysname = old.sysname; + ); + +create rule rtest_pers_upd as on update to rtest_person do also + update rtest_admin set pname = new.pname where pname = old.pname; + +create rule rtest_pers_del as on delete to rtest_person do also + delete from rtest_admin where pname = old.pname; + +-- +-- Tables and rules for the logging test +-- +create table rtest_emp (ename char(20), salary money); +create table rtest_emplog (ename char(20), who name, action char(10), newsal money, oldsal money); +create table rtest_empmass (ename char(20), salary money); + +create rule rtest_emp_ins as on insert to rtest_emp do + insert into rtest_emplog values (new.ename, current_user, + 'hired', new.salary, '0.00'); + +create rule rtest_emp_upd as on update to rtest_emp where new.salary != old.salary do + insert into rtest_emplog values (new.ename, current_user, + 'honored', new.salary, old.salary); + +create rule rtest_emp_del as on delete to rtest_emp do + insert into rtest_emplog values (old.ename, current_user, + 'fired', '0.00', old.salary); + +-- +-- Tables and rules for the multiple cascaded qualified instead +-- rule test +-- +create table rtest_t4 (a int4, b text); +create table rtest_t5 (a int4, b text); +create table rtest_t6 (a int4, b text); +create table rtest_t7 (a int4, b text); +create table rtest_t8 (a int4, b text); +create table rtest_t9 (a int4, b text); + +create rule rtest_t4_ins1 as on insert to rtest_t4 + where new.a >= 10 and new.a < 20 do instead + insert into rtest_t5 values (new.a, new.b); + +create rule rtest_t4_ins2 as on insert to rtest_t4 + where new.a >= 20 and new.a < 30 do + insert into rtest_t6 values (new.a, new.b); + +create rule rtest_t5_ins as on insert to rtest_t5 + where new.a > 15 do + insert into rtest_t7 values (new.a, new.b); + +create rule rtest_t6_ins as on insert to rtest_t6 + where new.a > 25 do instead + insert into rtest_t8 values (new.a, new.b); + +-- +-- Tables and rules for the rule fire order test +-- +-- As of PG 7.3, the rules should fire in order by name, regardless +-- of INSTEAD attributes or creation order. +-- +create table rtest_order1 (a int4); +create table rtest_order2 (a int4, b int4, c text); + +create sequence rtest_seq; + +create rule rtest_order_r3 as on insert to rtest_order1 do instead + insert into rtest_order2 values (new.a, nextval('rtest_seq'), + 'rule 3 - this should run 3rd'); + +create rule rtest_order_r4 as on insert to rtest_order1 + where a < 100 do instead + insert into rtest_order2 values (new.a, nextval('rtest_seq'), + 'rule 4 - this should run 4th'); + +create rule rtest_order_r2 as on insert to rtest_order1 do + insert into rtest_order2 values (new.a, nextval('rtest_seq'), + 'rule 2 - this should run 2nd'); + +create rule rtest_order_r1 as on insert to rtest_order1 do instead + insert into rtest_order2 values (new.a, nextval('rtest_seq'), + 'rule 1 - this should run 1st'); + +-- +-- Tables and rules for the instead nothing test +-- +create table rtest_nothn1 (a int4, b text); +create table rtest_nothn2 (a int4, b text); +create table rtest_nothn3 (a int4, b text); +create table rtest_nothn4 (a int4, b text); + +create rule rtest_nothn_r1 as on insert to rtest_nothn1 + where new.a >= 10 and new.a < 20 do instead nothing; + +create rule rtest_nothn_r2 as on insert to rtest_nothn1 + where new.a >= 30 and new.a < 40 do instead nothing; + +create rule rtest_nothn_r3 as on insert to rtest_nothn2 + where new.a >= 100 do instead + insert into rtest_nothn3 values (new.a, new.b); + +create rule rtest_nothn_r4 as on insert to rtest_nothn2 + do instead nothing; + +-- +-- Tests on a view that is select * of a table +-- and has insert/update/delete instead rules to +-- behave close like the real table. +-- + +-- +-- We need test date later +-- +insert into rtest_t2 values (1, 21); +insert into rtest_t2 values (2, 22); +insert into rtest_t2 values (3, 23); + +insert into rtest_t3 values (1, 31); +insert into rtest_t3 values (2, 32); +insert into rtest_t3 values (3, 33); +insert into rtest_t3 values (4, 34); +insert into rtest_t3 values (5, 35); + +-- insert values +insert into rtest_v1 values (1, 11); +insert into rtest_v1 values (2, 12); +select * from rtest_v1; + +-- delete with constant expression +delete from rtest_v1 where a = 1; +select * from rtest_v1; +insert into rtest_v1 values (1, 11); +delete from rtest_v1 where b = 12; +select * from rtest_v1; +insert into rtest_v1 values (2, 12); +insert into rtest_v1 values (2, 13); +select * from rtest_v1; +** Remember the delete rule on rtest_v1: It says +** DO INSTEAD DELETE FROM rtest_t1 WHERE a = old.a +** So this time both rows with a = 2 must get deleted +\p +\r +delete from rtest_v1 where b = 12; +select * from rtest_v1; +delete from rtest_v1; + +-- insert select +insert into rtest_v1 select * from rtest_t2; +select * from rtest_v1; +delete from rtest_v1; + +-- same with swapped targetlist +insert into rtest_v1 (b, a) select b, a from rtest_t2; +select * from rtest_v1; + +-- now with only one target attribute +insert into rtest_v1 (a) select a from rtest_t3; +select * from rtest_v1; +select * from rtest_v1 where b isnull; + +-- let attribute a differ (must be done on rtest_t1 - see above) +update rtest_t1 set a = a + 10 where b isnull; +delete from rtest_v1 where b isnull; +select * from rtest_v1; + +-- now updates with constant expression +update rtest_v1 set b = 42 where a = 2; +select * from rtest_v1; +update rtest_v1 set b = 99 where b = 42; +select * from rtest_v1; +update rtest_v1 set b = 88 where b < 50; +select * from rtest_v1; +delete from rtest_v1; +insert into rtest_v1 select rtest_t2.a, rtest_t3.b + from rtest_t2, rtest_t3 + where rtest_t2.a = rtest_t3.a; +select * from rtest_v1; + +-- updates in a mergejoin +update rtest_v1 set b = rtest_t2.b from rtest_t2 where rtest_v1.a = rtest_t2.a; +select * from rtest_v1; +insert into rtest_v1 select * from rtest_t3; +select * from rtest_v1; +update rtest_t1 set a = a + 10 where b > 30; +select * from rtest_v1; +update rtest_v1 set a = rtest_t3.a + 20 from rtest_t3 where rtest_v1.b = rtest_t3.b; +select * from rtest_v1; + +-- +-- Test for constraint updates/deletes +-- +insert into rtest_system values ('orion', 'Linux Jan Wieck'); +insert into rtest_system values ('notjw', 'WinNT Jan Wieck (notebook)'); +insert into rtest_system values ('neptun', 'Fileserver'); + +insert into rtest_interface values ('orion', 'eth0'); +insert into rtest_interface values ('orion', 'eth1'); +insert into rtest_interface values ('notjw', 'eth0'); +insert into rtest_interface values ('neptun', 'eth0'); + +insert into rtest_person values ('jw', 'Jan Wieck'); +insert into rtest_person values ('bm', 'Bruce Momjian'); + +insert into rtest_admin values ('jw', 'orion'); +insert into rtest_admin values ('jw', 'notjw'); +insert into rtest_admin values ('bm', 'neptun'); + +update rtest_system set sysname = 'pluto' where sysname = 'neptun'; + +select * from rtest_interface; +select * from rtest_admin; + +update rtest_person set pname = 'jwieck' where pdesc = 'Jan Wieck'; + +-- Note: use ORDER BY here to ensure consistent output across all systems. +-- The above UPDATE affects two rows with equal keys, so they could be +-- updated in either order depending on the whim of the local qsort(). + +select * from rtest_admin order by pname, sysname; + +delete from rtest_system where sysname = 'orion'; + +select * from rtest_interface; +select * from rtest_admin; + +-- +-- Rule qualification test +-- +insert into rtest_emp values ('wiecc', '5000.00'); +insert into rtest_emp values ('gates', '80000.00'); +update rtest_emp set ename = 'wiecx' where ename = 'wiecc'; +update rtest_emp set ename = 'wieck', salary = '6000.00' where ename = 'wiecx'; +update rtest_emp set salary = '7000.00' where ename = 'wieck'; +delete from rtest_emp where ename = 'gates'; + +select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; +insert into rtest_empmass values ('meyer', '4000.00'); +insert into rtest_empmass values ('maier', '5000.00'); +insert into rtest_empmass values ('mayr', '6000.00'); +insert into rtest_emp select * from rtest_empmass; +select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; +update rtest_empmass set salary = salary + '1000.00'; +update rtest_emp set salary = rtest_empmass.salary from rtest_empmass where rtest_emp.ename = rtest_empmass.ename; +select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; +delete from rtest_emp using rtest_empmass where rtest_emp.ename = rtest_empmass.ename; +select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; + +-- +-- Multiple cascaded qualified instead rule test +-- +insert into rtest_t4 values (1, 'Record should go to rtest_t4'); +insert into rtest_t4 values (2, 'Record should go to rtest_t4'); +insert into rtest_t4 values (10, 'Record should go to rtest_t5'); +insert into rtest_t4 values (15, 'Record should go to rtest_t5'); +insert into rtest_t4 values (19, 'Record should go to rtest_t5 and t7'); +insert into rtest_t4 values (20, 'Record should go to rtest_t4 and t6'); +insert into rtest_t4 values (26, 'Record should go to rtest_t4 and t8'); +insert into rtest_t4 values (28, 'Record should go to rtest_t4 and t8'); +insert into rtest_t4 values (30, 'Record should go to rtest_t4'); +insert into rtest_t4 values (40, 'Record should go to rtest_t4'); + +select * from rtest_t4; +select * from rtest_t5; +select * from rtest_t6; +select * from rtest_t7; +select * from rtest_t8; + +delete from rtest_t4; +delete from rtest_t5; +delete from rtest_t6; +delete from rtest_t7; +delete from rtest_t8; + +insert into rtest_t9 values (1, 'Record should go to rtest_t4'); +insert into rtest_t9 values (2, 'Record should go to rtest_t4'); +insert into rtest_t9 values (10, 'Record should go to rtest_t5'); +insert into rtest_t9 values (15, 'Record should go to rtest_t5'); +insert into rtest_t9 values (19, 'Record should go to rtest_t5 and t7'); +insert into rtest_t9 values (20, 'Record should go to rtest_t4 and t6'); +insert into rtest_t9 values (26, 'Record should go to rtest_t4 and t8'); +insert into rtest_t9 values (28, 'Record should go to rtest_t4 and t8'); +insert into rtest_t9 values (30, 'Record should go to rtest_t4'); +insert into rtest_t9 values (40, 'Record should go to rtest_t4'); + +insert into rtest_t4 select * from rtest_t9 where a < 20; + +select * from rtest_t4; +select * from rtest_t5; +select * from rtest_t6; +select * from rtest_t7; +select * from rtest_t8; + +insert into rtest_t4 select * from rtest_t9 where b ~ 'and t8'; + +select * from rtest_t4; +select * from rtest_t5; +select * from rtest_t6; +select * from rtest_t7; +select * from rtest_t8; + +insert into rtest_t4 select a + 1, b from rtest_t9 where a in (20, 30, 40); + +select * from rtest_t4; +select * from rtest_t5; +select * from rtest_t6; +select * from rtest_t7; +select * from rtest_t8; + +-- +-- Check that the ordering of rules fired is correct +-- +insert into rtest_order1 values (1); +select * from rtest_order2; + +-- +-- Check if instead nothing w/without qualification works +-- +insert into rtest_nothn1 values (1, 'want this'); +insert into rtest_nothn1 values (2, 'want this'); +insert into rtest_nothn1 values (10, 'don''t want this'); +insert into rtest_nothn1 values (19, 'don''t want this'); +insert into rtest_nothn1 values (20, 'want this'); +insert into rtest_nothn1 values (29, 'want this'); +insert into rtest_nothn1 values (30, 'don''t want this'); +insert into rtest_nothn1 values (39, 'don''t want this'); +insert into rtest_nothn1 values (40, 'want this'); +insert into rtest_nothn1 values (50, 'want this'); +insert into rtest_nothn1 values (60, 'want this'); + +select * from rtest_nothn1; + +insert into rtest_nothn2 values (10, 'too small'); +insert into rtest_nothn2 values (50, 'too small'); +insert into rtest_nothn2 values (100, 'OK'); +insert into rtest_nothn2 values (200, 'OK'); + +select * from rtest_nothn2; +select * from rtest_nothn3; + +delete from rtest_nothn1; +delete from rtest_nothn2; +delete from rtest_nothn3; + +insert into rtest_nothn4 values (1, 'want this'); +insert into rtest_nothn4 values (2, 'want this'); +insert into rtest_nothn4 values (10, 'don''t want this'); +insert into rtest_nothn4 values (19, 'don''t want this'); +insert into rtest_nothn4 values (20, 'want this'); +insert into rtest_nothn4 values (29, 'want this'); +insert into rtest_nothn4 values (30, 'don''t want this'); +insert into rtest_nothn4 values (39, 'don''t want this'); +insert into rtest_nothn4 values (40, 'want this'); +insert into rtest_nothn4 values (50, 'want this'); +insert into rtest_nothn4 values (60, 'want this'); + +insert into rtest_nothn1 select * from rtest_nothn4; + +select * from rtest_nothn1; + +delete from rtest_nothn4; + +insert into rtest_nothn4 values (10, 'too small'); +insert into rtest_nothn4 values (50, 'too small'); +insert into rtest_nothn4 values (100, 'OK'); +insert into rtest_nothn4 values (200, 'OK'); + +insert into rtest_nothn2 select * from rtest_nothn4; + +select * from rtest_nothn2; +select * from rtest_nothn3; + +create table rtest_view1 (a int4, b text, v bool); +create table rtest_view2 (a int4); +create table rtest_view3 (a int4, b text); +create table rtest_view4 (a int4, b text, c int4); +create view rtest_vview1 as select a, b from rtest_view1 X + where 0 < (select count(*) from rtest_view2 Y where Y.a = X.a); +create view rtest_vview2 as select a, b from rtest_view1 where v; +create view rtest_vview3 as select a, b from rtest_vview2 X + where 0 < (select count(*) from rtest_view2 Y where Y.a = X.a); +create view rtest_vview4 as select X.a, X.b, count(Y.a) as refcount + from rtest_view1 X, rtest_view2 Y + where X.a = Y.a + group by X.a, X.b; +create function rtest_viewfunc1(int4) returns int4 as + 'select count(*)::int4 from rtest_view2 where a = $1' + language sql; +create view rtest_vview5 as select a, b, rtest_viewfunc1(a) as refcount + from rtest_view1; + +insert into rtest_view1 values (1, 'item 1', 't'); +insert into rtest_view1 values (2, 'item 2', 't'); +insert into rtest_view1 values (3, 'item 3', 't'); +insert into rtest_view1 values (4, 'item 4', 'f'); +insert into rtest_view1 values (5, 'item 5', 't'); +insert into rtest_view1 values (6, 'item 6', 'f'); +insert into rtest_view1 values (7, 'item 7', 't'); +insert into rtest_view1 values (8, 'item 8', 't'); + +insert into rtest_view2 values (2); +insert into rtest_view2 values (2); +insert into rtest_view2 values (4); +insert into rtest_view2 values (5); +insert into rtest_view2 values (7); +insert into rtest_view2 values (7); +insert into rtest_view2 values (7); +insert into rtest_view2 values (7); + +select * from rtest_vview1; +select * from rtest_vview2; +select * from rtest_vview3; +select * from rtest_vview4 order by a, b; +select * from rtest_vview5; + +insert into rtest_view3 select * from rtest_vview1 where a < 7; +select * from rtest_view3; +delete from rtest_view3; + +insert into rtest_view3 select * from rtest_vview2 where a != 5 and b !~ '2'; +select * from rtest_view3; +delete from rtest_view3; + +insert into rtest_view3 select * from rtest_vview3; +select * from rtest_view3; +delete from rtest_view3; + +insert into rtest_view4 select * from rtest_vview4 where 3 > refcount; +select * from rtest_view4 order by a, b; +delete from rtest_view4; + +insert into rtest_view4 select * from rtest_vview5 where a > 2 and refcount = 0; +select * from rtest_view4; +delete from rtest_view4; +-- +-- Test for computations in views +-- +create table rtest_comp ( + part text, + unit char(4), + size float +); + + +create table rtest_unitfact ( + unit char(4), + factor float +); + +create view rtest_vcomp as + select X.part, (X.size * Y.factor) as size_in_cm + from rtest_comp X, rtest_unitfact Y + where X.unit = Y.unit; + + +insert into rtest_unitfact values ('m', 100.0); +insert into rtest_unitfact values ('cm', 1.0); +insert into rtest_unitfact values ('inch', 2.54); + +insert into rtest_comp values ('p1', 'm', 5.0); +insert into rtest_comp values ('p2', 'm', 3.0); +insert into rtest_comp values ('p3', 'cm', 5.0); +insert into rtest_comp values ('p4', 'cm', 15.0); +insert into rtest_comp values ('p5', 'inch', 7.0); +insert into rtest_comp values ('p6', 'inch', 4.4); + +select * from rtest_vcomp order by part; + +select * from rtest_vcomp where size_in_cm > 10.0 order by size_in_cm using >; + +-- +-- In addition run the (slightly modified) queries from the +-- programmers manual section on the rule system. +-- +CREATE TABLE shoe_data ( + shoename char(10), -- primary key + sh_avail integer, -- available # of pairs + slcolor char(10), -- preferred shoelace color + slminlen float, -- minimum shoelace length + slmaxlen float, -- maximum shoelace length + slunit char(8) -- length unit +); + +CREATE TABLE shoelace_data ( + sl_name char(10), -- primary key + sl_avail integer, -- available # of pairs + sl_color char(10), -- shoelace color + sl_len float, -- shoelace length + sl_unit char(8) -- length unit +); + +CREATE TABLE unit ( + un_name char(8), -- the primary key + un_fact float -- factor to transform to cm +); + +CREATE VIEW shoe AS + SELECT sh.shoename, + sh.sh_avail, + sh.slcolor, + sh.slminlen, + sh.slminlen * un.un_fact AS slminlen_cm, + sh.slmaxlen, + sh.slmaxlen * un.un_fact AS slmaxlen_cm, + sh.slunit + FROM shoe_data sh, unit un + WHERE sh.slunit = un.un_name; + +CREATE VIEW shoelace AS + SELECT s.sl_name, + s.sl_avail, + s.sl_color, + s.sl_len, + s.sl_unit, + s.sl_len * u.un_fact AS sl_len_cm + FROM shoelace_data s, unit u + WHERE s.sl_unit = u.un_name; + +CREATE VIEW shoe_ready AS + SELECT rsh.shoename, + rsh.sh_avail, + rsl.sl_name, + rsl.sl_avail, + int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail + FROM shoe rsh, shoelace rsl + WHERE rsl.sl_color = rsh.slcolor + AND rsl.sl_len_cm >= rsh.slminlen_cm + AND rsl.sl_len_cm <= rsh.slmaxlen_cm; + +INSERT INTO unit VALUES ('cm', 1.0); +INSERT INTO unit VALUES ('m', 100.0); +INSERT INTO unit VALUES ('inch', 2.54); + +INSERT INTO shoe_data VALUES ('sh1', 2, 'black', 70.0, 90.0, 'cm'); +INSERT INTO shoe_data VALUES ('sh2', 0, 'black', 30.0, 40.0, 'inch'); +INSERT INTO shoe_data VALUES ('sh3', 4, 'brown', 50.0, 65.0, 'cm'); +INSERT INTO shoe_data VALUES ('sh4', 3, 'brown', 40.0, 50.0, 'inch'); + +INSERT INTO shoelace_data VALUES ('sl1', 5, 'black', 80.0, 'cm'); +INSERT INTO shoelace_data VALUES ('sl2', 6, 'black', 100.0, 'cm'); +INSERT INTO shoelace_data VALUES ('sl3', 0, 'black', 35.0 , 'inch'); +INSERT INTO shoelace_data VALUES ('sl4', 8, 'black', 40.0 , 'inch'); +INSERT INTO shoelace_data VALUES ('sl5', 4, 'brown', 1.0 , 'm'); +INSERT INTO shoelace_data VALUES ('sl6', 0, 'brown', 0.9 , 'm'); +INSERT INTO shoelace_data VALUES ('sl7', 7, 'brown', 60 , 'cm'); +INSERT INTO shoelace_data VALUES ('sl8', 1, 'brown', 40 , 'inch'); + +-- SELECTs in doc +SELECT * FROM shoelace ORDER BY sl_name; +SELECT * FROM shoe_ready WHERE total_avail >= 2 ORDER BY 1; + + CREATE TABLE shoelace_log ( + sl_name char(10), -- shoelace changed + sl_avail integer, -- new available value + log_who name, -- who did it + log_when timestamp -- when + ); + +-- Want "log_who" to be CURRENT_USER, +-- but that is non-portable for the regression test +-- - thomas 1999-02-21 + + CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data + WHERE NEW.sl_avail != OLD.sl_avail + DO INSERT INTO shoelace_log VALUES ( + NEW.sl_name, + NEW.sl_avail, + 'Al Bundy', + 'epoch' + ); + +UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7'; + +SELECT * FROM shoelace_log; + + CREATE RULE shoelace_ins AS ON INSERT TO shoelace + DO INSTEAD + INSERT INTO shoelace_data VALUES ( + NEW.sl_name, + NEW.sl_avail, + NEW.sl_color, + NEW.sl_len, + NEW.sl_unit); + + CREATE RULE shoelace_upd AS ON UPDATE TO shoelace + DO INSTEAD + UPDATE shoelace_data SET + sl_name = NEW.sl_name, + sl_avail = NEW.sl_avail, + sl_color = NEW.sl_color, + sl_len = NEW.sl_len, + sl_unit = NEW.sl_unit + WHERE sl_name = OLD.sl_name; + + CREATE RULE shoelace_del AS ON DELETE TO shoelace + DO INSTEAD + DELETE FROM shoelace_data + WHERE sl_name = OLD.sl_name; + + CREATE TABLE shoelace_arrive ( + arr_name char(10), + arr_quant integer + ); + + CREATE TABLE shoelace_ok ( + ok_name char(10), + ok_quant integer + ); + + CREATE RULE shoelace_ok_ins AS ON INSERT TO shoelace_ok + DO INSTEAD + UPDATE shoelace SET + sl_avail = sl_avail + NEW.ok_quant + WHERE sl_name = NEW.ok_name; + +INSERT INTO shoelace_arrive VALUES ('sl3', 10); +INSERT INTO shoelace_arrive VALUES ('sl6', 20); +INSERT INTO shoelace_arrive VALUES ('sl8', 20); + +SELECT * FROM shoelace ORDER BY sl_name; + +insert into shoelace_ok select * from shoelace_arrive; + +SELECT * FROM shoelace ORDER BY sl_name; + +SELECT * FROM shoelace_log ORDER BY sl_name; + + CREATE VIEW shoelace_obsolete AS + SELECT * FROM shoelace WHERE NOT EXISTS + (SELECT shoename FROM shoe WHERE slcolor = sl_color); + + CREATE VIEW shoelace_candelete AS + SELECT * FROM shoelace_obsolete WHERE sl_avail = 0; + +insert into shoelace values ('sl9', 0, 'pink', 35.0, 'inch', 0.0); +insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0); +-- Unsupported (even though a similar updatable view construct is) +insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0) + on conflict do nothing; + +SELECT * FROM shoelace_obsolete ORDER BY sl_len_cm; +SELECT * FROM shoelace_candelete; + +DELETE FROM shoelace WHERE EXISTS + (SELECT * FROM shoelace_candelete + WHERE sl_name = shoelace.sl_name); + +SELECT * FROM shoelace ORDER BY sl_name; + +SELECT * FROM shoe ORDER BY shoename; +SELECT count(*) FROM shoe; + + +-- +-- Simple test of qualified ON INSERT ... this did not work in 7.0 ... +-- +create table rules_foo (f1 int); +create table rules_foo2 (f1 int); + +create rule rules_foorule as on insert to rules_foo where f1 < 100 +do instead nothing; + +insert into rules_foo values(1); +insert into rules_foo values(1001); +select * from rules_foo; + +drop rule rules_foorule on rules_foo; + +-- this should fail because f1 is not exposed for unqualified reference: +create rule rules_foorule as on insert to rules_foo where f1 < 100 +do instead insert into rules_foo2 values (f1); +-- this is the correct way: +create rule rules_foorule as on insert to rules_foo where f1 < 100 +do instead insert into rules_foo2 values (new.f1); + +insert into rules_foo values(2); +insert into rules_foo values(100); + +select * from rules_foo; +select * from rules_foo2; + +drop rule rules_foorule on rules_foo; +drop table rules_foo; +drop table rules_foo2; + + +-- +-- Test rules containing INSERT ... SELECT, which is a very ugly special +-- case as of 7.1. Example is based on bug report from Joel Burton. +-- +create table pparent (pid int, txt text); +insert into pparent values (1,'parent1'); +insert into pparent values (2,'parent2'); + +create table cchild (pid int, descrip text); +insert into cchild values (1,'descrip1'); + +create view vview as + select pparent.pid, txt, descrip from + pparent left join cchild using (pid); + +create rule rrule as + on update to vview do instead +( + insert into cchild (pid, descrip) + select old.pid, new.descrip where old.descrip isnull; + update cchild set descrip = new.descrip where cchild.pid = old.pid; +); + +select * from vview; +update vview set descrip='test1' where pid=1; +select * from vview; +update vview set descrip='test2' where pid=2; +select * from vview; +update vview set descrip='test3' where pid=3; +select * from vview; +select * from cchild; + +drop rule rrule on vview; +drop view vview; +drop table pparent; +drop table cchild; + + +-- +-- Check that ruleutils are working +-- + +-- temporarily disable fancy output, so view changes create less diff noise +\a\t + +SELECT viewname, definition FROM pg_views +WHERE schemaname IN ('pg_catalog', 'public') +ORDER BY viewname; + +SELECT tablename, rulename, definition FROM pg_rules +WHERE schemaname IN ('pg_catalog', 'public') +ORDER BY tablename, rulename; + +-- restore normal output mode +\a\t + +-- +-- CREATE OR REPLACE RULE +-- + +CREATE TABLE ruletest_tbl (a int, b int); +CREATE TABLE ruletest_tbl2 (a int, b int); + +CREATE OR REPLACE RULE myrule AS ON INSERT TO ruletest_tbl + DO INSTEAD INSERT INTO ruletest_tbl2 VALUES (10, 10); + +INSERT INTO ruletest_tbl VALUES (99, 99); + +CREATE OR REPLACE RULE myrule AS ON INSERT TO ruletest_tbl + DO INSTEAD INSERT INTO ruletest_tbl2 VALUES (1000, 1000); + +INSERT INTO ruletest_tbl VALUES (99, 99); + +SELECT * FROM ruletest_tbl2; + +-- Check that rewrite rules splitting one INSERT into multiple +-- conditional statements does not disable FK checking. +create table rule_and_refint_t1 ( + id1a integer, + id1b integer, + + primary key (id1a, id1b) +); + +create table rule_and_refint_t2 ( + id2a integer, + id2c integer, + + primary key (id2a, id2c) +); + +create table rule_and_refint_t3 ( + id3a integer, + id3b integer, + id3c integer, + data text, + + primary key (id3a, id3b, id3c), + + foreign key (id3a, id3b) references rule_and_refint_t1 (id1a, id1b), + foreign key (id3a, id3c) references rule_and_refint_t2 (id2a, id2c) +); + + +insert into rule_and_refint_t1 values (1, 11); +insert into rule_and_refint_t1 values (1, 12); +insert into rule_and_refint_t1 values (2, 21); +insert into rule_and_refint_t1 values (2, 22); + +insert into rule_and_refint_t2 values (1, 11); +insert into rule_and_refint_t2 values (1, 12); +insert into rule_and_refint_t2 values (2, 21); +insert into rule_and_refint_t2 values (2, 22); + +insert into rule_and_refint_t3 values (1, 11, 11, 'row1'); +insert into rule_and_refint_t3 values (1, 11, 12, 'row2'); +insert into rule_and_refint_t3 values (1, 12, 11, 'row3'); +insert into rule_and_refint_t3 values (1, 12, 12, 'row4'); +insert into rule_and_refint_t3 values (1, 11, 13, 'row5'); +insert into rule_and_refint_t3 values (1, 13, 11, 'row6'); +-- Ordinary table +insert into rule_and_refint_t3 values (1, 13, 11, 'row6') + on conflict do nothing; +-- rule not fired, so fk violation +insert into rule_and_refint_t3 values (1, 13, 11, 'row6') + on conflict (id3a, id3b, id3c) do update + set id3b = excluded.id3b; +-- rule fired, so unsupported +insert into shoelace values ('sl9', 0, 'pink', 35.0, 'inch', 0.0) + on conflict (sl_name) do update + set sl_avail = excluded.sl_avail; + +create rule rule_and_refint_t3_ins as on insert to rule_and_refint_t3 + where (exists (select 1 from rule_and_refint_t3 + where (((rule_and_refint_t3.id3a = new.id3a) + and (rule_and_refint_t3.id3b = new.id3b)) + and (rule_and_refint_t3.id3c = new.id3c)))) + do instead update rule_and_refint_t3 set data = new.data + where (((rule_and_refint_t3.id3a = new.id3a) + and (rule_and_refint_t3.id3b = new.id3b)) + and (rule_and_refint_t3.id3c = new.id3c)); + +insert into rule_and_refint_t3 values (1, 11, 13, 'row7'); +insert into rule_and_refint_t3 values (1, 13, 11, 'row8'); + +-- +-- disallow dropping a view's rule (bug #5072) +-- + +create view rules_fooview as select 'rules_foo'::text; +drop rule "_RETURN" on rules_fooview; +drop view rules_fooview; + +-- +-- test conversion of table to view (needed to load some pg_dump files) +-- + +create table rules_fooview (x int, y text); +select xmin, * from rules_fooview; + +create rule "_RETURN" as on select to rules_fooview do instead + select 1 as x, 'aaa'::text as y; + +select * from rules_fooview; +select xmin, * from rules_fooview; -- fail, views don't have such a column + +select reltoastrelid, relkind, relfrozenxid + from pg_class where oid = 'rules_fooview'::regclass; + +drop view rules_fooview; + +-- cannot convert an inheritance parent or child to a view, though +create table rules_fooview (x int, y text); +create table rules_fooview_child () inherits (rules_fooview); + +create rule "_RETURN" as on select to rules_fooview do instead + select 1 as x, 'aaa'::text as y; +create rule "_RETURN" as on select to rules_fooview_child do instead + select 1 as x, 'aaa'::text as y; + +drop table rules_fooview cascade; + +-- likewise, converting a partitioned table or partition to view is not allowed +create table rules_fooview (x int, y text) partition by list (x); +create rule "_RETURN" as on select to rules_fooview do instead + select 1 as x, 'aaa'::text as y; + +create table rules_fooview_part partition of rules_fooview for values in (1); +create rule "_RETURN" as on select to rules_fooview_part do instead + select 1 as x, 'aaa'::text as y; + +drop table rules_fooview; + +-- +-- check for planner problems with complex inherited UPDATES +-- + +create table id (id serial primary key, name text); +-- currently, must respecify PKEY for each inherited subtable +create table test_1 (id integer primary key) inherits (id); +create table test_2 (id integer primary key) inherits (id); +create table test_3 (id integer primary key) inherits (id); + +insert into test_1 (name) values ('Test 1'); +insert into test_1 (name) values ('Test 2'); +insert into test_2 (name) values ('Test 3'); +insert into test_2 (name) values ('Test 4'); +insert into test_3 (name) values ('Test 5'); +insert into test_3 (name) values ('Test 6'); + +create view id_ordered as select * from id order by id; + +create rule update_id_ordered as on update to id_ordered + do instead update id set name = new.name where id = old.id; + +select * from id_ordered; +update id_ordered set name = 'update 2' where id = 2; +update id_ordered set name = 'update 4' where id = 4; +update id_ordered set name = 'update 5' where id = 5; +select * from id_ordered; + +drop table id cascade; + +-- +-- check corner case where an entirely-dummy subplan is created by +-- constraint exclusion +-- + +create temp table t1 (a integer primary key); + +create temp table t1_1 (check (a >= 0 and a < 10)) inherits (t1); +create temp table t1_2 (check (a >= 10 and a < 20)) inherits (t1); + +create rule t1_ins_1 as on insert to t1 + where new.a >= 0 and new.a < 10 + do instead + insert into t1_1 values (new.a); +create rule t1_ins_2 as on insert to t1 + where new.a >= 10 and new.a < 20 + do instead + insert into t1_2 values (new.a); + +create rule t1_upd_1 as on update to t1 + where old.a >= 0 and old.a < 10 + do instead + update t1_1 set a = new.a where a = old.a; +create rule t1_upd_2 as on update to t1 + where old.a >= 10 and old.a < 20 + do instead + update t1_2 set a = new.a where a = old.a; + +set constraint_exclusion = on; + +insert into t1 select * from generate_series(5,19,1) g; +update t1 set a = 4 where a = 5; + +select * from only t1; +select * from only t1_1; +select * from only t1_2; + +reset constraint_exclusion; + +-- test FOR UPDATE in rules + +create table rules_base(f1 int, f2 int); +insert into rules_base values(1,2), (11,12); +create rule r1 as on update to rules_base do instead + select * from rules_base where f1 = 1 for update; +update rules_base set f2 = f2 + 1; +create or replace rule r1 as on update to rules_base do instead + select * from rules_base where f1 = 11 for update of rules_base; +update rules_base set f2 = f2 + 1; +create or replace rule r1 as on update to rules_base do instead + select * from rules_base where f1 = 11 for update of old; -- error +drop table rules_base; + +-- test various flavors of pg_get_viewdef() + +select pg_get_viewdef('shoe'::regclass) as unpretty; +select pg_get_viewdef('shoe'::regclass,true) as pretty; +select pg_get_viewdef('shoe'::regclass,0) as prettier; + +-- +-- check multi-row VALUES in rules +-- + +create table rules_src(f1 int, f2 int); +create table rules_log(f1 int, f2 int, tag text); +insert into rules_src values(1,2), (11,12); +create rule r1 as on update to rules_src do also + insert into rules_log values(old.*, 'old'), (new.*, 'new'); +update rules_src set f2 = f2 + 1; +update rules_src set f2 = f2 * 10; +select * from rules_src; +select * from rules_log; +create rule r2 as on update to rules_src do also + values(old.*, 'old'), (new.*, 'new'); +update rules_src set f2 = f2 / 10; +select * from rules_src; +select * from rules_log; +create rule r3 as on delete to rules_src do notify rules_src_deletion; +\d+ rules_src + +-- +-- Ensure an aliased target relation for insert is correctly deparsed. +-- +create rule r4 as on insert to rules_src do instead insert into rules_log AS trgt SELECT NEW.* RETURNING trgt.f1, trgt.f2; +create rule r5 as on update to rules_src do instead UPDATE rules_log AS trgt SET tag = 'updated' WHERE trgt.f1 = new.f1; +\d+ rules_src + +-- +-- Also check multiassignment deparsing. +-- +create table rule_t1(f1 int, f2 int); +create table rule_dest(f1 int, f2 int[], tag text); +create rule rr as on update to rule_t1 do instead UPDATE rule_dest trgt + SET (f2[1], f1, tag) = (SELECT new.f2, new.f1, 'updated'::varchar) + WHERE trgt.f1 = new.f1 RETURNING new.*; +\d+ rule_t1 +drop table rule_t1, rule_dest; + +-- +-- check alter rename rule +-- +CREATE TABLE rule_t1 (a INT); +CREATE VIEW rule_v1 AS SELECT * FROM rule_t1; + +CREATE RULE InsertRule AS + ON INSERT TO rule_v1 + DO INSTEAD + INSERT INTO rule_t1 VALUES(new.a); + +ALTER RULE InsertRule ON rule_v1 RENAME to NewInsertRule; + +INSERT INTO rule_v1 VALUES(1); +SELECT * FROM rule_v1; + +\d+ rule_v1 + +-- +-- error conditions for alter rename rule +-- +ALTER RULE InsertRule ON rule_v1 RENAME TO NewInsertRule; -- doesn't exist +ALTER RULE NewInsertRule ON rule_v1 RENAME TO "_RETURN"; -- already exists +ALTER RULE "_RETURN" ON rule_v1 RENAME TO abc; -- ON SELECT rule cannot be renamed + +DROP VIEW rule_v1; +DROP TABLE rule_t1; + +-- +-- check display of VALUES in view definitions +-- +create view rule_v1 as values(1,2); +\d+ rule_v1 +alter table rule_v1 rename column column2 to q2; +\d+ rule_v1 +drop view rule_v1; +create view rule_v1(x) as values(1,2); +\d+ rule_v1 +drop view rule_v1; +create view rule_v1(x) as select * from (values(1,2)) v; +\d+ rule_v1 +drop view rule_v1; +create view rule_v1(x) as select * from (values(1,2)) v(q,w); +\d+ rule_v1 +drop view rule_v1; + +-- +-- Check DO INSTEAD rules with ON CONFLICT +-- +CREATE TABLE hats ( + hat_name char(10) primary key, + hat_color char(10) -- hat color +); + +CREATE TABLE hat_data ( + hat_name char(10), + hat_color char(10) -- hat color +); +create unique index hat_data_unique_idx + on hat_data (hat_name COLLATE "C" bpchar_pattern_ops); + +-- DO NOTHING with ON CONFLICT +CREATE RULE hat_nosert AS ON INSERT TO hats + DO INSTEAD + INSERT INTO hat_data VALUES ( + NEW.hat_name, + NEW.hat_color) + ON CONFLICT (hat_name COLLATE "C" bpchar_pattern_ops) WHERE hat_color = 'green' + DO NOTHING + RETURNING *; +SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename; + +-- Works (projects row) +INSERT INTO hats VALUES ('h7', 'black') RETURNING *; +-- Works (does nothing) +INSERT INTO hats VALUES ('h7', 'black') RETURNING *; +SELECT tablename, rulename, definition FROM pg_rules + WHERE tablename = 'hats'; +DROP RULE hat_nosert ON hats; + +-- DO NOTHING without ON CONFLICT +CREATE RULE hat_nosert_all AS ON INSERT TO hats + DO INSTEAD + INSERT INTO hat_data VALUES ( + NEW.hat_name, + NEW.hat_color) + ON CONFLICT + DO NOTHING + RETURNING *; +SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename; +DROP RULE hat_nosert_all ON hats; + +-- Works (does nothing) +INSERT INTO hats VALUES ('h7', 'black') RETURNING *; + +-- DO UPDATE with a WHERE clause +CREATE RULE hat_upsert AS ON INSERT TO hats + DO INSTEAD + INSERT INTO hat_data VALUES ( + NEW.hat_name, + NEW.hat_color) + ON CONFLICT (hat_name) + DO UPDATE + SET hat_name = hat_data.hat_name, hat_color = excluded.hat_color + WHERE excluded.hat_color <> 'forbidden' AND hat_data.* != excluded.* + RETURNING *; +SELECT definition FROM pg_rules WHERE tablename = 'hats' ORDER BY rulename; + +-- Works (does upsert) +INSERT INTO hats VALUES ('h8', 'black') RETURNING *; +SELECT * FROM hat_data WHERE hat_name = 'h8'; +INSERT INTO hats VALUES ('h8', 'white') RETURNING *; +SELECT * FROM hat_data WHERE hat_name = 'h8'; +INSERT INTO hats VALUES ('h8', 'forbidden') RETURNING *; +SELECT * FROM hat_data WHERE hat_name = 'h8'; +SELECT tablename, rulename, definition FROM pg_rules + WHERE tablename = 'hats'; +-- ensure explain works for on insert conflict rules +explain (costs off) INSERT INTO hats VALUES ('h8', 'forbidden') RETURNING *; + +-- ensure upserting into a rule, with a CTE (different offsets!) works +WITH data(hat_name, hat_color) AS MATERIALIZED ( + VALUES ('h8', 'green'), + ('h9', 'blue'), + ('h7', 'forbidden') +) +INSERT INTO hats + SELECT * FROM data +RETURNING *; +EXPLAIN (costs off) +WITH data(hat_name, hat_color) AS MATERIALIZED ( + VALUES ('h8', 'green'), + ('h9', 'blue'), + ('h7', 'forbidden') +) +INSERT INTO hats + SELECT * FROM data +RETURNING *; +SELECT * FROM hat_data WHERE hat_name IN ('h8', 'h9', 'h7') ORDER BY hat_name; + +DROP RULE hat_upsert ON hats; + +drop table hats; +drop table hat_data; + +-- test for pg_get_functiondef properly regurgitating SET parameters +-- Note that the function is kept around to stress pg_dump. +CREATE FUNCTION func_with_set_params() RETURNS integer + AS 'select 1;' + LANGUAGE SQL + SET search_path TO PG_CATALOG + SET extra_float_digits TO 2 + SET work_mem TO '4MB' + SET datestyle to iso, mdy + SET local_preload_libraries TO "Mixed/Case", 'c:/''a"/path', '', '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' + IMMUTABLE STRICT; +SELECT pg_get_functiondef('func_with_set_params()'::regprocedure); + +-- tests for pg_get_*def with invalid objects +SELECT pg_get_constraintdef(0); +SELECT pg_get_functiondef(0); +SELECT pg_get_indexdef(0); +SELECT pg_get_ruledef(0); +SELECT pg_get_statisticsobjdef(0); +SELECT pg_get_triggerdef(0); +SELECT pg_get_viewdef(0); +SELECT pg_get_function_arguments(0); +SELECT pg_get_function_identity_arguments(0); +SELECT pg_get_function_result(0); +SELECT pg_get_function_arg_default(0, 0); +SELECT pg_get_function_arg_default('pg_class'::regclass, 0); +SELECT pg_get_partkeydef(0); + +-- test rename for a rule defined on a partitioned table +CREATE TABLE rules_parted_table (a int) PARTITION BY LIST (a); +CREATE TABLE rules_parted_table_1 PARTITION OF rules_parted_table FOR VALUES IN (1); +CREATE RULE rules_parted_table_insert AS ON INSERT to rules_parted_table + DO INSTEAD INSERT INTO rules_parted_table_1 VALUES (NEW.*); +ALTER RULE rules_parted_table_insert ON rules_parted_table RENAME TO rules_parted_table_insert_redirect; +DROP TABLE rules_parted_table; + +-- +-- Test enabling/disabling +-- +CREATE TABLE ruletest1 (a int); +CREATE TABLE ruletest2 (b int); + +CREATE RULE rule1 AS ON INSERT TO ruletest1 + DO INSTEAD INSERT INTO ruletest2 VALUES (NEW.*); + +INSERT INTO ruletest1 VALUES (1); +ALTER TABLE ruletest1 DISABLE RULE rule1; +INSERT INTO ruletest1 VALUES (2); +ALTER TABLE ruletest1 ENABLE RULE rule1; +SET session_replication_role = replica; +INSERT INTO ruletest1 VALUES (3); +ALTER TABLE ruletest1 ENABLE REPLICA RULE rule1; +INSERT INTO ruletest1 VALUES (4); +RESET session_replication_role; +INSERT INTO ruletest1 VALUES (5); + +SELECT * FROM ruletest1; +SELECT * FROM ruletest2; + +DROP TABLE ruletest1; +DROP TABLE ruletest2; diff --git a/src/test/singlenode_regress/sql/sanity_check.sql b/src/test/singlenode_regress/sql/sanity_check.sql new file mode 100644 index 00000000000..996cefa185f --- /dev/null +++ b/src/test/singlenode_regress/sql/sanity_check.sql @@ -0,0 +1,44 @@ +VACUUM; + +-- +-- sanity check, if we don't have indices the test will take years to +-- complete. But skip TOAST relations (since they will have varying +-- names depending on the current OID counter) as well as temp tables +-- of other backends (to avoid timing-dependent behavior). +-- + +-- temporarily disable fancy output, so catalog changes create less diff noise +\a\t + +-- filter tables with same name under schema singleseg created by GPDB +SELECT relname, relhasindex + FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace + WHERE relkind IN ('r', 'p') AND (nspname ~ '^pg_temp_') IS NOT TRUE + AND relname NOT LIKE 'gp_%' + AND relname NOT LIKE '__gp_%' + AND relname <> 'pg_resqueue' + AND n.nspname <> 'singleseg' + ORDER BY relname; + +-- restore normal output mode +\a\t + +-- +-- another sanity check: every system catalog that has OIDs should have +-- a unique index on OID. This ensures that the OIDs will be unique, +-- even after the OID counter wraps around. +-- We exclude non-system tables from the check by looking at nspname. +-- +SELECT relname, nspname + FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace JOIN pg_attribute a ON (attrelid = c.oid AND attname = 'oid') + WHERE relkind = 'r' and c.oid < 16384 + AND ((nspname ~ '^pg_') IS NOT FALSE) + AND NOT EXISTS (SELECT 1 FROM pg_index i WHERE indrelid = c.oid + AND indkey[0] = a.attnum AND indnatts = 1 + AND indisunique AND indimmediate); + +-- check that relations without storage don't have relfilenode +SELECT relname, relkind + FROM pg_class + WHERE relkind IN ('v', 'c', 'f', 'p', 'I') + AND relfilenode <> 0; diff --git a/src/test/singlenode_regress/sql/security_label.sql b/src/test/singlenode_regress/sql/security_label.sql new file mode 100644 index 00000000000..98e6a5f2113 --- /dev/null +++ b/src/test/singlenode_regress/sql/security_label.sql @@ -0,0 +1,45 @@ +-- +-- Test for facilities of security label +-- + +-- initial setups +SET client_min_messages TO 'warning'; + +DROP ROLE IF EXISTS regress_seclabel_user1; +DROP ROLE IF EXISTS regress_seclabel_user2; + +RESET client_min_messages; + +CREATE USER regress_seclabel_user1 WITH CREATEROLE; +CREATE USER regress_seclabel_user2; + +CREATE TABLE seclabel_tbl1 (a int, b text); +CREATE TABLE seclabel_tbl2 (x int, y text); +CREATE VIEW seclabel_view1 AS SELECT * FROM seclabel_tbl2; +CREATE FUNCTION seclabel_four() RETURNS integer AS $$SELECT 4$$ language sql; +CREATE DOMAIN seclabel_domain AS text; + +ALTER TABLE seclabel_tbl1 OWNER TO regress_seclabel_user1; +ALTER TABLE seclabel_tbl2 OWNER TO regress_seclabel_user2; + +-- +-- Test of SECURITY LABEL statement without a plugin +-- +SECURITY LABEL ON TABLE seclabel_tbl1 IS 'classified'; -- fail +SECURITY LABEL FOR 'dummy' ON TABLE seclabel_tbl1 IS 'classified'; -- fail +SECURITY LABEL ON TABLE seclabel_tbl1 IS '...invalid label...'; -- fail +SECURITY LABEL ON TABLE seclabel_tbl3 IS 'unclassified'; -- fail + +SECURITY LABEL ON ROLE regress_seclabel_user1 IS 'classified'; -- fail +SECURITY LABEL FOR 'dummy' ON ROLE regress_seclabel_user1 IS 'classified'; -- fail +SECURITY LABEL ON ROLE regress_seclabel_user1 IS '...invalid label...'; -- fail +SECURITY LABEL ON ROLE regress_seclabel_user3 IS 'unclassified'; -- fail + +-- clean up objects +DROP FUNCTION seclabel_four(); +DROP DOMAIN seclabel_domain; +DROP VIEW seclabel_view1; +DROP TABLE seclabel_tbl1; +DROP TABLE seclabel_tbl2; +DROP USER regress_seclabel_user1; +DROP USER regress_seclabel_user2; diff --git a/src/test/singlenode_regress/sql/select.sql b/src/test/singlenode_regress/sql/select.sql new file mode 100644 index 00000000000..d6f42aa0d41 --- /dev/null +++ b/src/test/singlenode_regress/sql/select.sql @@ -0,0 +1,269 @@ +-- +-- SELECT +-- + +-- btree index +-- awk '{if($1<10){print;}else{next;}}' onek.data | sort +0n -1 +-- +SELECT * FROM onek + WHERE onek.unique1 < 10 + ORDER BY onek.unique1; + +-- +-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1 +-- +SELECT onek.unique1, onek.stringu1 FROM onek + WHERE onek.unique1 < 20 + ORDER BY unique1 using >; + +-- +-- awk '{if($1>980){print $1,$14;}else{next;}}' onek.data | sort +1d -2 +-- +SELECT onek.unique1, onek.stringu1 FROM onek + WHERE onek.unique1 > 980 + ORDER BY stringu1 using <; + +-- +-- awk '{if($1>980){print $1,$16;}else{next;}}' onek.data | +-- sort +1d -2 +0nr -1 +-- +SELECT onek.unique1, onek.string4 FROM onek + WHERE onek.unique1 > 980 + ORDER BY string4 using <, unique1 using >; + +-- +-- awk '{if($1>980){print $1,$16;}else{next;}}' onek.data | +-- sort +1dr -2 +0n -1 +-- +SELECT onek.unique1, onek.string4 FROM onek + WHERE onek.unique1 > 980 + ORDER BY string4 using >, unique1 using <; + +-- +-- awk '{if($1<20){print $1,$16;}else{next;}}' onek.data | +-- sort +0nr -1 +1d -2 +-- +SELECT onek.unique1, onek.string4 FROM onek + WHERE onek.unique1 < 20 + ORDER BY unique1 using >, string4 using <; + +-- +-- awk '{if($1<20){print $1,$16;}else{next;}}' onek.data | +-- sort +0n -1 +1dr -2 +-- +SELECT onek.unique1, onek.string4 FROM onek + WHERE onek.unique1 < 20 + ORDER BY unique1 using <, string4 using >; + +-- +-- test partial btree indexes +-- +-- As of 7.2, planner probably won't pick an indexscan without stats, +-- so ANALYZE first. Also, we want to prevent it from picking a bitmapscan +-- followed by sort, because that could hide index ordering problems. +-- +ANALYZE onek2; + +SET enable_seqscan TO off; +SET enable_bitmapscan TO off; +SET enable_sort TO off; + +-- +-- awk '{if($1<10){print $0;}else{next;}}' onek.data | sort +0n -1 +-- +SELECT onek2.* FROM onek2 WHERE onek2.unique1 < 10; + +-- +-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1 +-- +SELECT onek2.unique1, onek2.stringu1 FROM onek2 + WHERE onek2.unique1 < 20 + ORDER BY unique1 using >; + +-- +-- awk '{if($1>980){print $1,$14;}else{next;}}' onek.data | sort +1d -2 +-- +SELECT onek2.unique1, onek2.stringu1 FROM onek2 + WHERE onek2.unique1 > 980; + +RESET enable_seqscan; +RESET enable_bitmapscan; +RESET enable_sort; + + +SELECT two, stringu1, ten, string4 + INTO TABLE tmp + FROM onek; + +-- +-- awk '{print $1,$2;}' person.data | +-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - emp.data | +-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - student.data | +-- awk 'BEGIN{FS=" ";}{if(NF!=2){print $4,$5;}else{print;}}' - stud_emp.data +-- +-- SELECT name, age FROM person*; ??? check if different +SELECT p.name, p.age FROM person* p; + +-- +-- awk '{print $1,$2;}' person.data | +-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - emp.data | +-- awk '{if(NF!=2){print $3,$2;}else{print;}}' - student.data | +-- awk 'BEGIN{FS=" ";}{if(NF!=1){print $4,$5;}else{print;}}' - stud_emp.data | +-- sort +1nr -2 +-- +SELECT p.name, p.age FROM person* p ORDER BY age using >, name; + +-- +-- Test some cases involving whole-row Var referencing a subquery +-- +select foo from (select 1 offset 0) as foo; +select foo from (select null offset 0) as foo; +select foo from (select 'xyzzy',1,null offset 0) as foo; + +-- +-- Test VALUES lists +-- +select * from onek, (values(147, 'RFAAAA'), (931, 'VJAAAA')) as v (i, j) + WHERE onek.unique1 = v.i and onek.stringu1 = v.j; + +-- a more complex case +-- looks like we're coding lisp :-) +select * from onek, + (values ((select i from + (values(10000), (2), (389), (1000), (2000), ((select 10029))) as foo(i) + order by i asc limit 1))) bar (i) + where onek.unique1 = bar.i; + +-- try VALUES in a subquery +select * from onek + where (unique1,ten) in (values (1,1), (20,0), (99,9), (17,99)) + order by unique1; + +-- VALUES is also legal as a standalone query or a set-operation member +VALUES (1,2), (3,4+4), (7,77.7); + +VALUES (1,2), (3,4+4), (7,77.7) +UNION ALL +SELECT 2+2, 57 +UNION ALL +TABLE int8_tbl; + +-- corner case: VALUES with no columns +CREATE TEMP TABLE nocols(); +INSERT INTO nocols DEFAULT VALUES; +SELECT * FROM nocols n, LATERAL (VALUES(n.*)) v; + +-- +-- Test ORDER BY options +-- + +CREATE TEMP TABLE foo (f1 int); + +INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1); + +SELECT * FROM foo ORDER BY f1; +SELECT * FROM foo ORDER BY f1 ASC; -- same thing +SELECT * FROM foo ORDER BY f1 NULLS FIRST; +SELECT * FROM foo ORDER BY f1 DESC; +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + +-- check if indexscans do the right things +CREATE INDEX fooi ON foo (f1); +SET enable_sort = false; + +SELECT * FROM foo ORDER BY f1; +SELECT * FROM foo ORDER BY f1 NULLS FIRST; +SELECT * FROM foo ORDER BY f1 DESC; +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + +DROP INDEX fooi; +CREATE INDEX fooi ON foo (f1 DESC); + +SELECT * FROM foo ORDER BY f1; +SELECT * FROM foo ORDER BY f1 NULLS FIRST; +SELECT * FROM foo ORDER BY f1 DESC; +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + +DROP INDEX fooi; +CREATE INDEX fooi ON foo (f1 DESC NULLS LAST); + +SELECT * FROM foo ORDER BY f1; +SELECT * FROM foo ORDER BY f1 NULLS FIRST; +SELECT * FROM foo ORDER BY f1 DESC; +SELECT * FROM foo ORDER BY f1 DESC NULLS LAST; + +-- +-- Test planning of some cases with partial indexes +-- + +-- partial index is usable +explain (costs off) +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +-- actually run the query with an analyze to use the partial index +explain (costs off, analyze on, timing off, summary off) +select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA'; +-- partial index predicate implies clause, so no need for retest +explain (costs off) +select * from onek2 where unique2 = 11 and stringu1 < 'B'; +select * from onek2 where unique2 = 11 and stringu1 < 'B'; +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; +-- but if it's an update target, must retest anyway +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update; +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update; +-- partial index is not applicable +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'C'; +select unique2 from onek2 where unique2 = 11 and stringu1 < 'C'; +-- partial index implies clause, but bitmap scan must recheck predicate anyway +SET enable_indexscan TO off; +explain (costs off) +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; +select unique2 from onek2 where unique2 = 11 and stringu1 < 'B'; +RESET enable_indexscan; +-- check multi-index cases too +explain (costs off) +select unique1, unique2 from onek2 + where (unique2 = 11 or unique1 = 0) and stringu1 < 'B'; +select unique1, unique2 from onek2 + where (unique2 = 11 or unique1 = 0) and stringu1 < 'B'; +explain (costs off) +select unique1, unique2 from onek2 + where (unique2 = 11 and stringu1 < 'B') or unique1 = 0; +select unique1, unique2 from onek2 + where (unique2 = 11 and stringu1 < 'B') or unique1 = 0; + +-- +-- Test some corner cases that have been known to confuse the planner +-- + +-- ORDER BY on a constant doesn't really need any sorting +SELECT 1 AS x ORDER BY x; + +-- But ORDER BY on a set-valued expression does +create function sillysrf(int) returns setof int as + 'values (1),(10),(2),($1)' language sql immutable; + +select sillysrf(42); +select sillysrf(-1) order by 1; + +drop function sillysrf(int); + +-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict +-- (see bug #5084) +select * from (values (2),(null),(1)) v(k) where k = k order by k; +select * from (values (2),(null),(1)) v(k) where k = k; + +-- Test partitioned tables with no partitions, which should be handled the +-- same as the non-inheritance case when expanding its RTE. +create table list_parted_tbl (a int,b int) partition by list (a); +create table list_parted_tbl1 partition of list_parted_tbl + for values in (1) partition by list(b); +explain (costs off) select * from list_parted_tbl; +drop table list_parted_tbl; diff --git a/src/test/singlenode_regress/sql/select_distinct.sql b/src/test/singlenode_regress/sql/select_distinct.sql new file mode 100644 index 00000000000..33102744ebf --- /dev/null +++ b/src/test/singlenode_regress/sql/select_distinct.sql @@ -0,0 +1,137 @@ +-- +-- SELECT_DISTINCT +-- + +-- +-- awk '{print $3;}' onek.data | sort -n | uniq +-- +SELECT DISTINCT two FROM tmp ORDER BY 1; + +-- +-- awk '{print $5;}' onek.data | sort -n | uniq +-- +SELECT DISTINCT ten FROM tmp ORDER BY 1; + +-- +-- awk '{print $16;}' onek.data | sort -d | uniq +-- +SELECT DISTINCT string4 FROM tmp ORDER BY 1; + +-- +-- awk '{print $3,$16,$5;}' onek.data | sort -d | uniq | +-- sort +0n -1 +1d -2 +2n -3 +-- +SELECT DISTINCT two, string4, ten + FROM tmp + ORDER BY two using <, string4 using <, ten using <; + +-- +-- awk '{print $2;}' person.data | +-- awk '{if(NF!=1){print $2;}else{print;}}' - emp.data | +-- awk '{if(NF!=1){print $2;}else{print;}}' - student.data | +-- awk 'BEGIN{FS=" ";}{if(NF!=1){print $5;}else{print;}}' - stud_emp.data | +-- sort -n -r | uniq +-- +SELECT DISTINCT p.age FROM person* p ORDER BY age using >; + +-- +-- Check mentioning same column more than once +-- + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT count(*) FROM + (SELECT DISTINCT two, four, two FROM tenk1) ss; + +SELECT count(*) FROM + (SELECT DISTINCT two, four, two FROM tenk1) ss; + +-- +-- Compare results between plans using sorting and plans using hash +-- aggregation. Force spilling in both cases by setting work_mem low. +-- + +SET work_mem='64kB'; + +-- Produce results with sorting. + +SET enable_hashagg=FALSE; + +SET jit_above_cost=0; + +EXPLAIN (costs off) +SELECT DISTINCT g%1000 FROM generate_series(0,9999) g; + +CREATE TABLE distinct_group_1 AS +SELECT DISTINCT g%1000 FROM generate_series(0,9999) g; + +SET jit_above_cost TO DEFAULT; + +CREATE TABLE distinct_group_2 AS +SELECT DISTINCT (g%1000)::text FROM generate_series(0,9999) g; + +SET enable_hashagg=TRUE; + +-- Produce results with hash aggregation. + +SET enable_sort=FALSE; + +SET jit_above_cost=0; + +EXPLAIN (costs off) +SELECT DISTINCT g%1000 FROM generate_series(0,9999) g; + +CREATE TABLE distinct_hash_1 AS +SELECT DISTINCT g%1000 FROM generate_series(0,9999) g; + +SET jit_above_cost TO DEFAULT; + +CREATE TABLE distinct_hash_2 AS +SELECT DISTINCT (g%1000)::text FROM generate_series(0,9999) g; + +SET enable_sort=TRUE; + +SET work_mem TO DEFAULT; + +-- Compare results + +(SELECT * FROM distinct_hash_1 EXCEPT SELECT * FROM distinct_group_1) + UNION ALL +(SELECT * FROM distinct_group_1 EXCEPT SELECT * FROM distinct_hash_1); + +(SELECT * FROM distinct_hash_1 EXCEPT SELECT * FROM distinct_group_1) + UNION ALL +(SELECT * FROM distinct_group_1 EXCEPT SELECT * FROM distinct_hash_1); + +DROP TABLE distinct_hash_1; +DROP TABLE distinct_hash_2; +DROP TABLE distinct_group_1; +DROP TABLE distinct_group_2; + +-- +-- Also, some tests of IS DISTINCT FROM, which doesn't quite deserve its +-- very own regression file. +-- + +CREATE TEMP TABLE disttable (f1 integer); +INSERT INTO DISTTABLE VALUES(1); +INSERT INTO DISTTABLE VALUES(2); +INSERT INTO DISTTABLE VALUES(3); +INSERT INTO DISTTABLE VALUES(NULL); + +-- basic cases +SELECT f1, f1 IS DISTINCT FROM 2 as "not 2" FROM disttable; +SELECT f1, f1 IS DISTINCT FROM NULL as "not null" FROM disttable; +SELECT f1, f1 IS DISTINCT FROM f1 as "false" FROM disttable; +SELECT f1, f1 IS DISTINCT FROM f1+1 as "not null" FROM disttable; + +-- check that optimizer constant-folds it properly +SELECT 1 IS DISTINCT FROM 2 as "yes"; +SELECT 2 IS DISTINCT FROM 2 as "no"; +SELECT 2 IS DISTINCT FROM null as "yes"; +SELECT null IS DISTINCT FROM null as "no"; + +-- negated form +SELECT 1 IS NOT DISTINCT FROM 2 as "no"; +SELECT 2 IS NOT DISTINCT FROM 2 as "yes"; +SELECT 2 IS NOT DISTINCT FROM null as "no"; +SELECT null IS NOT DISTINCT FROM null as "yes"; diff --git a/src/test/singlenode_regress/sql/select_distinct_on.sql b/src/test/singlenode_regress/sql/select_distinct_on.sql new file mode 100644 index 00000000000..d18733d274c --- /dev/null +++ b/src/test/singlenode_regress/sql/select_distinct_on.sql @@ -0,0 +1,19 @@ +-- +-- SELECT_DISTINCT_ON +-- + +SELECT DISTINCT ON (string4) string4, two, ten + FROM tmp + ORDER BY string4 using <, two using >, ten using <; + +-- this will fail due to conflict of ordering requirements +SELECT DISTINCT ON (string4, ten) string4, two, ten + FROM tmp + ORDER BY string4 using <, two using <, ten using <; + +SELECT DISTINCT ON (string4, ten) string4, ten, two + FROM tmp + ORDER BY string4 using <, ten using >, two using <; + +-- bug #5049: early 8.4.x chokes on volatile DISTINCT ON clauses +select distinct on (1) floor(random()) as r, f1 from int4_tbl order by 1,2; diff --git a/src/test/singlenode_regress/sql/select_having.sql b/src/test/singlenode_regress/sql/select_having.sql new file mode 100644 index 00000000000..bc0cdc06304 --- /dev/null +++ b/src/test/singlenode_regress/sql/select_having.sql @@ -0,0 +1,50 @@ +-- +-- SELECT_HAVING +-- + +-- load test data +CREATE TABLE test_having (a int, b int, c char(8), d char); +INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A'); +INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b'); +INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c'); +INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D'); +INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e'); +INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F'); +INSERT INTO test_having VALUES (6, 4, 'cccc', 'g'); +INSERT INTO test_having VALUES (7, 4, 'cccc', 'h'); +INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I'); +INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j'); + +SELECT b, c FROM test_having + GROUP BY b, c HAVING count(*) = 1 ORDER BY b, c; + +-- HAVING is effectively equivalent to WHERE in this case +SELECT b, c FROM test_having + GROUP BY b, c HAVING b = 3 ORDER BY b, c; + +SELECT lower(c), count(c) FROM test_having + GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY lower(c); + +SELECT c, max(a) FROM test_having + GROUP BY c HAVING count(*) > 2 OR min(a) = max(a) + ORDER BY c; + +-- test degenerate cases involving HAVING without GROUP BY +-- Per SQL spec, these should generate 0 or 1 row, even without aggregates + +SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a); +SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a); + +-- errors: ungrouped column references +SELECT a FROM test_having HAVING min(a) < max(a); +SELECT 1 AS one FROM test_having HAVING a > 1; + +-- the really degenerate case: need not scan table at all +SELECT 1 AS one FROM test_having HAVING 1 > 2; +SELECT 1 AS one FROM test_having HAVING 1 < 2; + +-- and just to prove that we aren't scanning the table: +SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2; + +DROP TABLE test_having; diff --git a/src/test/singlenode_regress/sql/select_implicit.sql b/src/test/singlenode_regress/sql/select_implicit.sql new file mode 100644 index 00000000000..de3aef8d81c --- /dev/null +++ b/src/test/singlenode_regress/sql/select_implicit.sql @@ -0,0 +1,156 @@ +-- +-- SELECT_IMPLICIT +-- Test cases for queries with ordering terms missing from the target list. +-- This used to be called "junkfilter.sql". +-- The parser uses the term "resjunk" to handle these cases. +-- - thomas 1998-07-09 +-- + +-- load test data +CREATE TABLE test_missing_target (a int, b int, c char(8), d char); +INSERT INTO test_missing_target VALUES (0, 1, 'XXXX', 'A'); +INSERT INTO test_missing_target VALUES (1, 2, 'ABAB', 'b'); +INSERT INTO test_missing_target VALUES (2, 2, 'ABAB', 'c'); +INSERT INTO test_missing_target VALUES (3, 3, 'BBBB', 'D'); +INSERT INTO test_missing_target VALUES (4, 3, 'BBBB', 'e'); +INSERT INTO test_missing_target VALUES (5, 3, 'bbbb', 'F'); +INSERT INTO test_missing_target VALUES (6, 4, 'cccc', 'g'); +INSERT INTO test_missing_target VALUES (7, 4, 'cccc', 'h'); +INSERT INTO test_missing_target VALUES (8, 4, 'CCCC', 'I'); +INSERT INTO test_missing_target VALUES (9, 4, 'CCCC', 'j'); + + +-- w/ existing GROUP BY target +SELECT c, count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; + +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(*) FROM test_missing_target GROUP BY test_missing_target.c ORDER BY c; + +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(*) FROM test_missing_target GROUP BY a ORDER BY b; + +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b; + +-- w/ existing GROUP BY target using a relation name in target +SELECT test_missing_target.b, count(*) + FROM test_missing_target GROUP BY b ORDER BY b; + +-- w/o existing GROUP BY target +SELECT c FROM test_missing_target ORDER BY a; + +-- w/o existing ORDER BY target +SELECT count(*) FROM test_missing_target GROUP BY b ORDER BY b desc; + +-- group using reference number +SELECT count(*) FROM test_missing_target ORDER BY 1 desc; + +-- order using reference number +SELECT c, count(*) FROM test_missing_target GROUP BY 1 ORDER BY 1; + +-- group using reference number out of range +-- failure expected +SELECT c, count(*) FROM test_missing_target GROUP BY 3; + +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b ORDER BY b; + +-- order w/ target under ambiguous condition +-- failure NOT expected +SELECT a, a FROM test_missing_target + ORDER BY a; + +-- order expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + ORDER BY a/2; + +-- group expression w/ target under ambiguous condition +-- failure NOT expected +SELECT a/2, a/2 FROM test_missing_target + GROUP BY a/2 ORDER BY a/2; + +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b, count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; + +-- group w/o existing GROUP BY target under ambiguous condition +SELECT count(*) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; + +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target2 AS +SELECT count(*) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b ORDER BY x.b; +SELECT * FROM test_missing_target2; + + +-- Functions and expressions + +-- w/ existing GROUP BY target +SELECT a%2, count(b) FROM test_missing_target +GROUP BY test_missing_target.a%2 +ORDER BY test_missing_target.a%2; + +-- w/o existing GROUP BY target using a relation name in GROUP BY clause +SELECT count(c) FROM test_missing_target +GROUP BY lower(test_missing_target.c) +ORDER BY lower(test_missing_target.c); + +-- w/o existing GROUP BY target and w/o existing a different ORDER BY target +-- failure expected +SELECT count(a) FROM test_missing_target GROUP BY a ORDER BY b; + +-- w/o existing GROUP BY target and w/o existing same ORDER BY target +SELECT count(b) FROM test_missing_target GROUP BY b/2 ORDER BY b/2; + +-- w/ existing GROUP BY target using a relation name in target +SELECT lower(test_missing_target.c), count(c) + FROM test_missing_target GROUP BY lower(c) ORDER BY lower(c); + +-- w/o existing GROUP BY target +SELECT a FROM test_missing_target ORDER BY upper(d); + +-- w/o existing ORDER BY target +SELECT count(b) FROM test_missing_target + GROUP BY (b + 1) / 2 ORDER BY (b + 1) / 2 desc; + +-- group w/o existing GROUP BY and ORDER BY target under ambiguous condition +-- failure expected +SELECT count(x.a) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY b/2 ORDER BY b/2; + +-- group w/ existing GROUP BY target under ambiguous condition +SELECT x.b/2, count(x.b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; + +-- group w/o existing GROUP BY target under ambiguous condition +-- failure expected due to ambiguous b in count(b) +SELECT count(b) FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2; + +-- group w/o existing GROUP BY target under ambiguous condition +-- into a table +CREATE TABLE test_missing_target3 AS +SELECT count(x.b) +FROM test_missing_target x, test_missing_target y + WHERE x.a = y.a + GROUP BY x.b/2 ORDER BY x.b/2; +SELECT * FROM test_missing_target3; + +-- Cleanup +DROP TABLE test_missing_target; +DROP TABLE test_missing_target2; +DROP TABLE test_missing_target3; diff --git a/src/test/singlenode_regress/sql/select_into.sql b/src/test/singlenode_regress/sql/select_into.sql new file mode 100644 index 00000000000..7e903c339a8 --- /dev/null +++ b/src/test/singlenode_regress/sql/select_into.sql @@ -0,0 +1,138 @@ +-- +-- SELECT_INTO +-- + +SELECT * + INTO TABLE sitmp1 + FROM onek + WHERE onek.unique1 < 2; + +DROP TABLE sitmp1; + +SELECT * + INTO TABLE sitmp1 + FROM onek2 + WHERE onek2.unique1 < 2; + +DROP TABLE sitmp1; + +-- +-- SELECT INTO and INSERT permission, if owner is not allowed to insert. +-- +CREATE SCHEMA selinto_schema; +CREATE USER regress_selinto_user; +ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user + REVOKE INSERT ON TABLES FROM regress_selinto_user; +GRANT ALL ON SCHEMA selinto_schema TO public; + +SET SESSION AUTHORIZATION regress_selinto_user; +-- WITH DATA, passes. +CREATE TABLE selinto_schema.tbl_withdata1 (a) + AS SELECT generate_series(1,3) WITH DATA; +INSERT INTO selinto_schema.tbl_withdata1 VALUES (4); +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE selinto_schema.tbl_withdata2 (a) AS + SELECT generate_series(1,3) WITH DATA; +-- WITH NO DATA, passes. +CREATE TABLE selinto_schema.tbl_nodata1 (a) AS + SELECT generate_series(1,3) WITH NO DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE selinto_schema.tbl_nodata2 (a) AS + SELECT generate_series(1,3) WITH NO DATA; +-- EXECUTE and WITH DATA, passes. +PREPARE data_sel AS SELECT generate_series(1,3); +CREATE TABLE selinto_schema.tbl_withdata3 (a) AS + EXECUTE data_sel WITH DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE selinto_schema.tbl_withdata4 (a) AS + EXECUTE data_sel WITH DATA; +-- EXECUTE and WITH NO DATA, passes. +CREATE TABLE selinto_schema.tbl_nodata3 (a) AS + EXECUTE data_sel WITH NO DATA; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE selinto_schema.tbl_nodata4 (a) AS + EXECUTE data_sel WITH NO DATA; +RESET SESSION AUTHORIZATION; + +ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user + GRANT INSERT ON TABLES TO regress_selinto_user; + +SET SESSION AUTHORIZATION regress_selinto_user; +RESET SESSION AUTHORIZATION; + +DEALLOCATE data_sel; +DROP SCHEMA selinto_schema CASCADE; +DROP USER regress_selinto_user; + +-- Tests for WITH NO DATA and column name consistency +CREATE TABLE ctas_base (i int, j int); +INSERT INTO ctas_base VALUES (1, 2); +CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base; -- Error +CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base WITH NO DATA; -- Error +CREATE TABLE ctas_nodata (ii, jj) AS SELECT i, j FROM ctas_base; -- OK +CREATE TABLE ctas_nodata_2 (ii, jj) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK +CREATE TABLE ctas_nodata_3 (ii) AS SELECT i, j FROM ctas_base; -- OK +CREATE TABLE ctas_nodata_4 (ii) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK +SELECT * FROM ctas_nodata; +SELECT * FROM ctas_nodata_2; +SELECT * FROM ctas_nodata_3; +SELECT * FROM ctas_nodata_4; +DROP TABLE ctas_base; +DROP TABLE ctas_nodata; +DROP TABLE ctas_nodata_2; +DROP TABLE ctas_nodata_3; +DROP TABLE ctas_nodata_4; + +-- +-- CREATE TABLE AS/SELECT INTO as last command in a SQL function +-- have been known to cause problems +-- +CREATE FUNCTION make_table() RETURNS VOID +AS $$ + CREATE TABLE created_table AS SELECT * FROM int8_tbl; +$$ LANGUAGE SQL; + +SELECT make_table(); + +SELECT * FROM created_table; + +-- Try EXPLAIN ANALYZE SELECT INTO and EXPLAIN ANALYZE CREATE TABLE AS +-- WITH NO DATA, but hide the outputs since they won't be stable. +DO $$ +BEGIN + EXECUTE 'EXPLAIN ANALYZE SELECT * INTO TABLE easi FROM int8_tbl'; + EXECUTE 'EXPLAIN ANALYZE CREATE TABLE easi2 AS SELECT * FROM int8_tbl WITH NO DATA'; +END$$; + +DROP TABLE created_table; +DROP TABLE easi, easi2; + +-- +-- Disallowed uses of SELECT ... INTO. All should fail +-- +DECLARE foo CURSOR FOR SELECT 1 INTO b; +COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob'; +SELECT * FROM (SELECT 1 INTO f) bar; +CREATE VIEW foo AS SELECT 1 INTO b; +INSERT INTO b SELECT 1 INTO f; + +-- Test CREATE TABLE AS ... IF NOT EXISTS +CREATE TABLE ctas_ine_tbl AS SELECT 1; +CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error +CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok +CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error +CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok +PREPARE ctas_ine_query AS SELECT 1 / 0; +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE ctas_ine_tbl AS EXECUTE ctas_ine_query; -- error +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) + CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS EXECUTE ctas_ine_query; -- ok +DROP TABLE ctas_ine_tbl; diff --git a/src/test/singlenode_regress/sql/select_parallel.sql b/src/test/singlenode_regress/sql/select_parallel.sql new file mode 100644 index 00000000000..94b81940962 --- /dev/null +++ b/src/test/singlenode_regress/sql/select_parallel.sql @@ -0,0 +1,465 @@ +-- +-- PARALLEL +-- + +-- GPDB_96_MERGE_FIXME: We don't support parallel query. These tests won't actually +-- generate any parallel plans. Should we pay attention to the parallel restrictions +-- when creating MPP plans? For example, should we force parallel restricted functions +-- to run in the QD? + +create function sp_parallel_restricted(int) returns int as + $$begin return $1; end$$ language plpgsql parallel restricted; + +begin; + +-- encourage use of parallel plans +set parallel_setup_cost=0; +set parallel_tuple_cost=0; +set min_parallel_table_scan_size=0; +set max_parallel_workers_per_gather=4; + +-- Parallel Append with partial-subplans +explain (costs off) + select round(avg(aa)), sum(aa) from a_star; +select round(avg(aa)), sum(aa) from a_star a1; + +-- Parallel Append with both partial and non-partial subplans +alter table c_star set (parallel_workers = 0); +alter table d_star set (parallel_workers = 0); +explain (costs off) + select round(avg(aa)), sum(aa) from a_star; +select round(avg(aa)), sum(aa) from a_star a2; + +-- Parallel Append with only non-partial subplans +alter table a_star set (parallel_workers = 0); +alter table b_star set (parallel_workers = 0); +alter table e_star set (parallel_workers = 0); +alter table f_star set (parallel_workers = 0); +explain (costs off) + select round(avg(aa)), sum(aa) from a_star; +select round(avg(aa)), sum(aa) from a_star a3; + +-- Disable Parallel Append +alter table a_star reset (parallel_workers); +alter table b_star reset (parallel_workers); +alter table c_star reset (parallel_workers); +alter table d_star reset (parallel_workers); +alter table e_star reset (parallel_workers); +alter table f_star reset (parallel_workers); +set enable_parallel_append to off; +explain (costs off) + select round(avg(aa)), sum(aa) from a_star; +select round(avg(aa)), sum(aa) from a_star a4; +reset enable_parallel_append; + +-- Parallel Append that runs serially +create function sp_test_func() returns setof text as +$$ select 'foo'::varchar union all select 'bar'::varchar $$ +language sql stable; +select sp_test_func() order by 1; + +-- Parallel Append is not to be used when the subpath depends on the outer param +create table part_pa_test(a int, b int) partition by range(a); +create table part_pa_test_p1 partition of part_pa_test for values from (minvalue) to (0); +create table part_pa_test_p2 partition of part_pa_test for values from (0) to (maxvalue); +explain (costs off) + select (select max((select pa1.b from part_pa_test pa1 where pa1.a = pa2.a))) + from part_pa_test pa2; +drop table part_pa_test; + +-- test with leader participation disabled +set parallel_leader_participation = off; +explain (costs off) + select count(*) from tenk1 where stringu1 = 'GRAAAA'; +select count(*) from tenk1 where stringu1 = 'GRAAAA'; + +-- test with leader participation disabled, but no workers available (so +-- the leader will have to run the plan despite the setting) +set max_parallel_workers = 0; +explain (costs off) + select count(*) from tenk1 where stringu1 = 'GRAAAA'; +select count(*) from tenk1 where stringu1 = 'GRAAAA'; + +reset max_parallel_workers; +reset parallel_leader_participation; + +-- test that parallel_restricted function doesn't run in worker +alter table tenk1 set (parallel_workers = 4); +explain (verbose, costs off) +select sp_parallel_restricted(unique1) from tenk1 + where stringu1 = 'GRAAAA' order by 1; + +-- test parallel plan when group by expression is in target list. +explain (costs off) + select length(stringu1) from tenk1 group by length(stringu1); +select length(stringu1) from tenk1 group by length(stringu1); + +explain (costs off) + select stringu1, count(*) from tenk1 group by stringu1 order by stringu1; + +-- test that parallel plan for aggregates is not selected when +-- target list contains parallel restricted clause. +explain (costs off) + select sum(sp_parallel_restricted(unique1)) from tenk1 + group by(sp_parallel_restricted(unique1)); + +-- test prepared statement +prepare tenk1_count(integer) As select count((unique1)) from tenk1 where hundred > $1; +explain (costs off) execute tenk1_count(1); +execute tenk1_count(1); +deallocate tenk1_count; + +-- test parallel plans for queries containing un-correlated subplans. +alter table tenk2 set (parallel_workers = 0); +explain (costs off) + select count(*) from tenk1 where (two, four) not in + (select hundred, thousand from tenk2 where thousand > 100); +select count(*) from tenk1 where (two, four) not in + (select hundred, thousand from tenk2 where thousand > 100); +-- this is not parallel-safe due to use of random() within SubLink's testexpr: +explain (costs off) + select * from tenk1 where (unique1 + random())::integer not in + (select ten from tenk2); +alter table tenk2 reset (parallel_workers); + +-- test parallel plan for a query containing initplan. +set enable_indexscan = off; +set enable_indexonlyscan = off; +set enable_bitmapscan = off; +alter table tenk2 set (parallel_workers = 2); + +explain (costs off) + select count(*) from tenk1 + where tenk1.unique1 = (Select max(tenk2.unique1) from tenk2); +select count(*) from tenk1 + where tenk1.unique1 = (Select max(tenk2.unique1) from tenk2); + +reset enable_indexscan; +reset enable_indexonlyscan; +reset enable_bitmapscan; +alter table tenk2 reset (parallel_workers); + +-- test parallel index scans. +set enable_seqscan to off; +set enable_bitmapscan to off; + +explain (costs off) + select count((unique1)) from tenk1 where hundred > 1; +select count((unique1)) from tenk1 where hundred > 1; + +-- test parallel index-only scans. +explain (costs off) + select count(*) from tenk1 where thousand > 95; +select count(*) from tenk1 where thousand > 95; + +-- test rescan cases too +set enable_material = false; + +explain (costs off) +select * from + (select count(unique1) from tenk1 where hundred > 10) ss + right join (values (1),(2),(3)) v(x) on true; +select * from + (select count(unique1) from tenk1 where hundred > 10) ss + right join (values (1),(2),(3)) v(x) on true; + +explain (costs off) +select * from + (select count(*) from tenk1 where thousand > 99) ss + right join (values (1),(2),(3)) v(x) on true; +select * from + (select count(*) from tenk1 where thousand > 99) ss + right join (values (1),(2),(3)) v(x) on true; + +-- test rescans for a Limit node with a parallel node beneath it. +reset enable_seqscan; +set enable_indexonlyscan to off; +set enable_indexscan to off; +alter table tenk1 set (parallel_workers = 0); +alter table tenk2 set (parallel_workers = 1); +explain (costs off) +select count(*) from tenk1 + left join (select tenk2.unique1 from tenk2 order by 1 limit 1000) ss + on tenk1.unique1 < ss.unique1 + 1 + where tenk1.unique1 < 2; +select count(*) from tenk1 + left join (select tenk2.unique1 from tenk2 order by 1 limit 1000) ss + on tenk1.unique1 < ss.unique1 + 1 + where tenk1.unique1 < 2; +--reset the value of workers for each table as it was before this test. +alter table tenk1 set (parallel_workers = 4); +alter table tenk2 reset (parallel_workers); + +reset enable_material; +reset enable_bitmapscan; +reset enable_indexonlyscan; +reset enable_indexscan; + +-- test parallel bitmap heap scan. +set enable_seqscan to off; +set enable_indexscan to off; +set enable_hashjoin to off; +set enable_mergejoin to off; +set enable_material to off; +-- test prefetching, if the platform allows it +DO $$ +BEGIN + SET effective_io_concurrency = 50; +EXCEPTION WHEN invalid_parameter_value THEN +END $$; +set work_mem='64kB'; --set small work mem to force lossy pages +explain (costs off) + select count(*) from tenk1, tenk2 where tenk1.hundred > 1 and tenk2.thousand=0; +select count(*) from tenk1, tenk2 where tenk1.hundred > 1 and tenk2.thousand=0; + +create table bmscantest (a int, t text); +insert into bmscantest select r, 'fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' FROM generate_series(1,100000) r; +create index i_bmtest ON bmscantest(a); +select count(*) from bmscantest where a>1; + +-- test accumulation of stats for parallel nodes +reset enable_seqscan; +alter table tenk2 set (parallel_workers = 0); +explain (analyze, timing off, summary off, costs off) + select count(*) from tenk1, tenk2 where tenk1.hundred > 1 + and tenk2.thousand=0; +alter table tenk2 reset (parallel_workers); + +reset work_mem; +create function explain_parallel_sort_stats() returns setof text +language plpgsql as +$$ +declare ln text; +begin + for ln in + explain (analyze, timing off, summary off, costs off) + select * from + (select ten from tenk1 where ten < 100 order by ten) ss + right join (values (1),(2),(3)) v(x) on true + loop + ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); + return next ln; + end loop; +end; +$$; +select * from explain_parallel_sort_stats(); + +reset enable_indexscan; +reset enable_hashjoin; +reset enable_mergejoin; +reset enable_material; +reset effective_io_concurrency; +drop table bmscantest; +drop function explain_parallel_sort_stats(); + +-- test parallel merge join path. +analyze tenk2; +set enable_hashjoin to off; +set enable_nestloop to off; + +explain (costs off) + select count(*) from tenk1, tenk2 where tenk1.unique1 = tenk2.unique1; +select count(*) from tenk1, tenk2 where tenk1.unique1 = tenk2.unique1; + +reset enable_hashjoin; +reset enable_nestloop; + +-- test gather merge +set enable_hashagg = false; + +explain (costs off) + select count(*) from tenk1 group by twenty; + +select count(*) from tenk1 group by twenty; + +--test expressions in targetlist are pushed down for gather merge +create function sp_simple_func(var1 integer) returns integer +as $$ +begin + return var1 + 10; +end; +$$ language plpgsql PARALLEL SAFE; + +explain (costs off, verbose) + select ten, sp_simple_func(ten) from tenk1 where ten < 100 order by ten; + +drop function sp_simple_func(integer); + +-- test handling of SRFs in targetlist (bug in 10.0) + +explain (costs off) + select count(*), generate_series(1,2) from tenk1 group by twenty; + +select count(*), generate_series(1,2) from tenk1 group by twenty; + +-- test gather merge with parallel leader participation disabled +set parallel_leader_participation = off; + +explain (costs off) + select count(*) from tenk1 group by twenty; + +select count(*) from tenk1 group by twenty; + +reset parallel_leader_participation; + +--test rescan behavior of gather merge +set enable_material = false; + +explain (costs off) +select * from + (select string4, count(unique2) + from tenk1 group by string4 order by string4) ss + right join (values (1),(2),(3)) v(x) on true; + +select * from + (select string4, count(unique2) + from tenk1 group by string4 order by string4) ss + right join (values (1),(2),(3)) v(x) on true; + +reset enable_material; + +reset enable_hashagg; + +-- check parallelized int8 aggregate (bug #14897) +explain (costs off) +select avg(unique1::int8) from tenk1; + +select avg(unique1::int8) from tenk1; + +-- gather merge test with a LIMIT +explain (costs off) + select fivethous from tenk1 order by fivethous limit 4; + +select fivethous from tenk1 order by fivethous limit 4; + +-- gather merge test with 0 worker +set max_parallel_workers = 0; +explain (costs off) + select string4 from tenk1 order by string4 limit 5; +select string4 from tenk1 order by string4 limit 5; + +-- gather merge test with 0 workers, with parallel leader +-- participation disabled (the leader will have to run the plan +-- despite the setting) +set parallel_leader_participation = off; +explain (costs off) + select string4 from tenk1 order by string4 limit 5; +select string4 from tenk1 order by string4 limit 5; + +reset parallel_leader_participation; +reset max_parallel_workers; + +SAVEPOINT settings; +SET LOCAL force_parallel_mode = 1; +explain (costs off) + select stringu1::int2 from tenk1 where unique1 = 1; +ROLLBACK TO SAVEPOINT settings; + +-- exercise record typmod remapping between backends +CREATE FUNCTION make_record(n int) + RETURNS RECORD LANGUAGE plpgsql PARALLEL SAFE 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; +$$; +SAVEPOINT settings; +SET LOCAL force_parallel_mode = 1; +SELECT make_record(x) FROM (SELECT generate_series(1, 5) x) ss ORDER BY x; +ROLLBACK TO SAVEPOINT settings; +DROP function make_record(n int); + +-- test the sanity of parallel query after the active role is dropped. +drop role if exists regress_parallel_worker; +create role regress_parallel_worker; +set role regress_parallel_worker; +reset session authorization; +drop role regress_parallel_worker; +set force_parallel_mode = 1; +select count(*) from tenk1; +reset force_parallel_mode; +reset role; + +-- Window function calculation can't be pushed to workers. +explain (costs off, verbose) + select count(*) from tenk1 a where (unique1, two) in + (select unique1, row_number() over() from tenk1 b); + + +-- LIMIT/OFFSET within sub-selects can't be pushed to workers. +explain (costs off) + select * from tenk1 a where two in + (select two from tenk1 b where stringu1 like '%AAAA' limit 3); + +-- to increase the parallel query test coverage +SAVEPOINT settings; +SET LOCAL force_parallel_mode = 1; +EXPLAIN (analyze, timing off, summary off, costs off) SELECT * FROM tenk1; +ROLLBACK TO SAVEPOINT settings; + +-- provoke error in worker +-- (make the error message long enough to require multiple bufferloads) +SAVEPOINT settings; +SET LOCAL force_parallel_mode = 1; +select (stringu1 || repeat('abcd', 5000))::int2 from tenk1 where unique1 = 1; +ROLLBACK TO SAVEPOINT settings; + +-- test interaction with set-returning functions +SAVEPOINT settings; + +-- multiple subqueries under a single Gather node +-- must set parallel_setup_cost > 0 to discourage multiple Gather nodes +SET LOCAL parallel_setup_cost = 10; +EXPLAIN (COSTS OFF) +SELECT unique1 FROM tenk1 WHERE fivethous = tenthous + 1 +UNION ALL +SELECT unique1 FROM tenk1 WHERE fivethous = tenthous + 1; +ROLLBACK TO SAVEPOINT settings; + +-- can't use multiple subqueries under a single Gather node due to initPlans +EXPLAIN (COSTS OFF) +SELECT unique1 FROM tenk1 WHERE fivethous = + (SELECT unique1 FROM tenk1 WHERE fivethous = 1 LIMIT 1) +UNION ALL +SELECT unique1 FROM tenk1 WHERE fivethous = + (SELECT unique2 FROM tenk1 WHERE fivethous = 1 LIMIT 1) +ORDER BY 1; + +-- test interaction with SRFs +SELECT * FROM information_schema.foreign_data_wrapper_options +ORDER BY 1, 2, 3; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT generate_series(1, two), array(select generate_series(1, two)) + FROM tenk1 ORDER BY tenthous; + +-- test passing expanded-value representations to workers +CREATE FUNCTION make_some_array(int,int) returns int[] as +$$declare x int[]; + begin + x[1] := $1; + x[2] := $2; + return x; + end$$ language plpgsql parallel safe; +CREATE TABLE fooarr(f1 text, f2 int[], f3 text); +INSERT INTO fooarr VALUES('1', ARRAY[1,2], 'one'); + +PREPARE pstmt(text, int[]) AS SELECT * FROM fooarr WHERE f1 = $1 AND f2 = $2; +EXPLAIN (COSTS OFF) EXECUTE pstmt('1', make_some_array(1,2)); +EXECUTE pstmt('1', make_some_array(1,2)); +DEALLOCATE pstmt; + +-- test interaction between subquery and partial_paths +CREATE VIEW tenk1_vw_sec WITH (security_barrier) AS SELECT * FROM tenk1; +EXPLAIN (COSTS OFF) +SELECT 1 FROM tenk1_vw_sec + WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100; + +rollback; + diff --git a/src/test/singlenode_regress/sql/select_views.sql b/src/test/singlenode_regress/sql/select_views.sql new file mode 100644 index 00000000000..e742f136990 --- /dev/null +++ b/src/test/singlenode_regress/sql/select_views.sql @@ -0,0 +1,155 @@ +-- +-- SELECT_VIEWS +-- test the views defined in CREATE_VIEWS +-- + +SELECT * FROM street; + +SELECT name, #thepath FROM iexit ORDER BY name COLLATE "C", 2; + +SELECT * FROM toyemp WHERE name = 'sharon'; + +-- +-- Test for Leaky view scenario +-- +CREATE ROLE regress_alice; + +CREATE FUNCTION f_leak (text) + RETURNS bool LANGUAGE 'plpgsql' COST 0.0000001 + AS 'BEGIN RAISE NOTICE ''f_leak => %'', $1; RETURN true; END'; + +CREATE TABLE customer ( + cid int primary key, + name text not null, + tel text, + passwd text +); + +CREATE TABLE credit_card ( + cid int references customer(cid), + cnum text, + climit int +); + +CREATE TABLE credit_usage ( + cid int references customer(cid), + ymd date, + usage int +); + +INSERT INTO customer + VALUES (101, 'regress_alice', '+81-12-3456-7890', 'passwd123'), + (102, 'regress_bob', '+01-234-567-8901', 'beafsteak'), + (103, 'regress_eve', '+49-8765-43210', 'hamburger'); +INSERT INTO credit_card + VALUES (101, '1111-2222-3333-4444', 4000), + (102, '5555-6666-7777-8888', 3000), + (103, '9801-2345-6789-0123', 2000); +INSERT INTO credit_usage + VALUES (101, '2011-09-15', 120), + (101, '2011-10-05', 90), + (101, '2011-10-18', 110), + (101, '2011-10-21', 200), + (101, '2011-11-10', 80), + (102, '2011-09-22', 300), + (102, '2011-10-12', 120), + (102, '2011-10-28', 200), + (103, '2011-10-15', 480); + +CREATE VIEW my_property_normal AS + SELECT * FROM customer WHERE name = current_user; +CREATE VIEW my_property_secure WITH (security_barrier) AS + SELECT * FROM customer WHERE name = current_user; + +CREATE VIEW my_credit_card_normal AS + SELECT * FROM customer l NATURAL JOIN credit_card r + WHERE l.name = current_user; +CREATE VIEW my_credit_card_secure WITH (security_barrier) AS + SELECT * FROM customer l NATURAL JOIN credit_card r + WHERE l.name = current_user; + +CREATE VIEW my_credit_card_usage_normal AS + SELECT * FROM my_credit_card_secure l NATURAL JOIN credit_usage r; +CREATE VIEW my_credit_card_usage_secure WITH (security_barrier) AS + SELECT * FROM my_credit_card_secure l NATURAL JOIN credit_usage r; + +GRANT SELECT ON my_property_normal TO public; +GRANT SELECT ON my_property_secure TO public; +GRANT SELECT ON my_credit_card_normal TO public; +GRANT SELECT ON my_credit_card_secure TO public; +GRANT SELECT ON my_credit_card_usage_normal TO public; +GRANT SELECT ON my_credit_card_usage_secure TO public; + +-- +-- Run leaky view scenarios +-- +SET SESSION AUTHORIZATION regress_alice; + +-- +-- scenario: if a qualifier with tiny-cost is given, it shall be launched +-- prior to the security policy of the view. +-- +SELECT * FROM my_property_normal WHERE f_leak(passwd); +EXPLAIN (COSTS OFF) SELECT * FROM my_property_normal WHERE f_leak(passwd); + +SELECT * FROM my_property_secure WHERE f_leak(passwd); +EXPLAIN (COSTS OFF) SELECT * FROM my_property_secure WHERE f_leak(passwd); + +-- +-- scenario: qualifiers can be pushed down if they contain leaky functions, +-- provided they aren't passed data from inside the view. +-- +SELECT * FROM my_property_normal v + WHERE f_leak('passwd') AND f_leak(passwd); +EXPLAIN (COSTS OFF) SELECT * FROM my_property_normal v + WHERE f_leak('passwd') AND f_leak(passwd); + +SELECT * FROM my_property_secure v + WHERE f_leak('passwd') AND f_leak(passwd); +EXPLAIN (COSTS OFF) SELECT * FROM my_property_secure v + WHERE f_leak('passwd') AND f_leak(passwd); + +-- +-- scenario: if a qualifier references only one-side of a particular join- +-- tree, it shall be distributed to the most deep scan plan as +-- possible as we can. +-- +SELECT * FROM my_credit_card_normal WHERE f_leak(cnum); +EXPLAIN (COSTS OFF) SELECT * FROM my_credit_card_normal WHERE f_leak(cnum); + +SELECT * FROM my_credit_card_secure WHERE f_leak(cnum); +EXPLAIN (COSTS OFF) SELECT * FROM my_credit_card_secure WHERE f_leak(cnum); + +-- +-- scenario: an external qualifier can be pushed-down by in-front-of the +-- views with "security_barrier" attribute, except for operators +-- implemented with leakproof functions. +-- +SELECT * FROM my_credit_card_usage_normal + WHERE f_leak(cnum) AND ymd >= '2011-10-01' AND ymd < '2011-11-01'; +EXPLAIN (COSTS OFF) SELECT * FROM my_credit_card_usage_normal + WHERE f_leak(cnum) AND ymd >= '2011-10-01' AND ymd < '2011-11-01'; + +SELECT * FROM my_credit_card_usage_secure + WHERE f_leak(cnum) AND ymd >= '2011-10-01' AND ymd < '2011-11-01'; +EXPLAIN (COSTS OFF) SELECT * FROM my_credit_card_usage_secure + WHERE f_leak(cnum) AND ymd >= '2011-10-01' AND ymd < '2011-11-01'; + +-- +-- Test for the case when security_barrier gets changed between rewriter +-- and planner stage. +-- +PREPARE p1 AS SELECT * FROM my_property_normal WHERE f_leak(passwd); +PREPARE p2 AS SELECT * FROM my_property_secure WHERE f_leak(passwd); +EXECUTE p1; +EXECUTE p2; +RESET SESSION AUTHORIZATION; +ALTER VIEW my_property_normal SET (security_barrier=true); +ALTER VIEW my_property_secure SET (security_barrier=false); +SET SESSION AUTHORIZATION regress_alice; +EXECUTE p1; -- To be perform as a view with security-barrier +EXECUTE p2; -- To be perform as a view without security-barrier + +-- Cleanup. +RESET SESSION AUTHORIZATION; +DROP ROLE regress_alice; diff --git a/src/test/singlenode_regress/sql/sequence.sql b/src/test/singlenode_regress/sql/sequence.sql new file mode 100644 index 00000000000..7badb791805 --- /dev/null +++ b/src/test/singlenode_regress/sql/sequence.sql @@ -0,0 +1,408 @@ +-- +-- CREATE SEQUENCE +-- + +-- various error cases +CREATE UNLOGGED SEQUENCE sequence_testx; +CREATE SEQUENCE sequence_testx INCREMENT BY 0; +CREATE SEQUENCE sequence_testx INCREMENT BY -1 MINVALUE 20; +CREATE SEQUENCE sequence_testx INCREMENT BY 1 MAXVALUE -20; +CREATE SEQUENCE sequence_testx INCREMENT BY -1 START 10; +CREATE SEQUENCE sequence_testx INCREMENT BY 1 START -10; +CREATE SEQUENCE sequence_testx CACHE 0; + +-- OWNED BY errors +CREATE SEQUENCE sequence_testx OWNED BY nobody; -- nonsense word +CREATE SEQUENCE sequence_testx OWNED BY pg_class_oid_index.oid; -- not a table +CREATE SEQUENCE sequence_testx OWNED BY pg_class.relname; -- not same schema +CREATE TABLE sequence_test_table (a int); +CREATE SEQUENCE sequence_testx OWNED BY sequence_test_table.b; -- wrong column +DROP TABLE sequence_test_table; + +-- sequence data types +CREATE SEQUENCE sequence_test5 AS integer; +CREATE SEQUENCE sequence_test6 AS smallint; +CREATE SEQUENCE sequence_test7 AS bigint; +CREATE SEQUENCE sequence_test8 AS integer MAXVALUE 100000; +CREATE SEQUENCE sequence_test9 AS integer INCREMENT BY -1; +CREATE SEQUENCE sequence_test10 AS integer MINVALUE -100000 START 1; +CREATE SEQUENCE sequence_test11 AS smallint; +CREATE SEQUENCE sequence_test12 AS smallint INCREMENT -1; +CREATE SEQUENCE sequence_test13 AS smallint MINVALUE -32768; +CREATE SEQUENCE sequence_test14 AS smallint MAXVALUE 32767 INCREMENT -1; +CREATE SEQUENCE sequence_testx AS text; +CREATE SEQUENCE sequence_testx AS nosuchtype; + +CREATE SEQUENCE sequence_testx AS smallint MAXVALUE 100000; +CREATE SEQUENCE sequence_testx AS smallint MINVALUE -100000; + +ALTER SEQUENCE sequence_test5 AS smallint; -- success, max will be adjusted +ALTER SEQUENCE sequence_test8 AS smallint; -- fail, max has to be adjusted +ALTER SEQUENCE sequence_test8 AS smallint MAXVALUE 20000; -- ok now +ALTER SEQUENCE sequence_test9 AS smallint; -- success, min will be adjusted +ALTER SEQUENCE sequence_test10 AS smallint; -- fail, min has to be adjusted +ALTER SEQUENCE sequence_test10 AS smallint MINVALUE -20000; -- ok now + +ALTER SEQUENCE sequence_test11 AS int; -- max will be adjusted +ALTER SEQUENCE sequence_test12 AS int; -- min will be adjusted +ALTER SEQUENCE sequence_test13 AS int; -- min and max will be adjusted +ALTER SEQUENCE sequence_test14 AS int; -- min and max will be adjusted + +--- +--- test creation of SERIAL column +--- + +CREATE TABLE serialTest1 (f1 text, f2 serial); + +INSERT INTO serialTest1 VALUES ('foo'); +INSERT INTO serialTest1 VALUES ('bar'); +INSERT INTO serialTest1 VALUES ('force', 100); +INSERT INTO serialTest1 VALUES ('wrong', NULL); + +SELECT * FROM serialTest1; + +SELECT pg_get_serial_sequence('serialTest1', 'f2'); + +-- test smallserial / bigserial +CREATE TABLE serialTest2 (f1 text, f2 serial, f3 smallserial, f4 serial2, + f5 bigserial, f6 serial8); + +INSERT INTO serialTest2 (f1) + VALUES ('test_defaults'); + +INSERT INTO serialTest2 (f1, f2, f3, f4, f5, f6) + VALUES ('test_max_vals', 2147483647, 32767, 32767, 9223372036854775807, + 9223372036854775807), + ('test_min_vals', -2147483648, -32768, -32768, -9223372036854775808, + -9223372036854775808); + +-- All these INSERTs should fail: +INSERT INTO serialTest2 (f1, f3) + VALUES ('bogus', -32769); + +INSERT INTO serialTest2 (f1, f4) + VALUES ('bogus', -32769); + +INSERT INTO serialTest2 (f1, f3) + VALUES ('bogus', 32768); + +INSERT INTO serialTest2 (f1, f4) + VALUES ('bogus', 32768); + +INSERT INTO serialTest2 (f1, f5) + VALUES ('bogus', -9223372036854775809); + +INSERT INTO serialTest2 (f1, f6) + VALUES ('bogus', -9223372036854775809); + +INSERT INTO serialTest2 (f1, f5) + VALUES ('bogus', 9223372036854775808); + +INSERT INTO serialTest2 (f1, f6) + VALUES ('bogus', 9223372036854775808); + +SELECT * FROM serialTest2 ORDER BY f2 ASC; + +SELECT nextval('serialTest2_f2_seq'); +SELECT nextval('serialTest2_f3_seq'); +SELECT nextval('serialTest2_f4_seq'); +SELECT nextval('serialTest2_f5_seq'); +SELECT nextval('serialTest2_f6_seq'); + +-- basic sequence operations using both text and oid references +CREATE SEQUENCE sequence_test; +CREATE SEQUENCE IF NOT EXISTS sequence_test; + +SELECT nextval('sequence_test'::text); +SELECT nextval('sequence_test'::regclass); +SELECT currval('sequence_test'::text); +SELECT currval('sequence_test'::regclass); +SELECT setval('sequence_test'::text, 32); +SELECT nextval('sequence_test'::regclass); +SELECT setval('sequence_test'::text, 99, false); +SELECT nextval('sequence_test'::regclass); +SELECT setval('sequence_test'::regclass, 32); +SELECT nextval('sequence_test'::text); +SELECT setval('sequence_test'::regclass, 99, false); +SELECT nextval('sequence_test'::text); +DISCARD SEQUENCES; +SELECT currval('sequence_test'::regclass); + +DROP SEQUENCE sequence_test; + +-- renaming sequences +CREATE SEQUENCE foo_seq CACHE 1; +ALTER TABLE foo_seq RENAME TO foo_seq_new; +SELECT * FROM foo_seq_new; +SELECT nextval('foo_seq_new'); +SELECT nextval('foo_seq_new'); +-- log_cnt can be higher if there is a checkpoint just at the right +-- time, so just test for the expected range +SELECT last_value, log_cnt IN (31, 32) AS log_cnt_ok, is_called FROM foo_seq_new; +DROP SEQUENCE foo_seq_new; + +-- renaming serial sequences +ALTER TABLE serialtest1_f2_seq RENAME TO serialtest1_f2_foo; +INSERT INTO serialTest1 VALUES ('more'); +SELECT * FROM serialTest1; + +-- +-- Check dependencies of serial and ordinary sequences +-- +CREATE TEMP SEQUENCE myseq2; +CREATE TEMP SEQUENCE myseq3; +CREATE TEMP TABLE t1 ( + f1 serial, + f2 int DEFAULT nextval('myseq2'), + f3 int DEFAULT nextval('myseq3'::text) +); +-- Both drops should fail, but with different error messages: +DROP SEQUENCE t1_f1_seq; +DROP SEQUENCE myseq2; +-- This however will work: +DROP SEQUENCE myseq3; +DROP TABLE t1; +-- Fails because no longer existent: +DROP SEQUENCE t1_f1_seq; +-- Now OK: +DROP SEQUENCE myseq2; + +-- +-- Alter sequence +-- + +ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 24 + INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; + +ALTER SEQUENCE serialTest1 CYCLE; -- error, not a sequence + +CREATE SEQUENCE sequence_test2 START WITH 32; +CREATE SEQUENCE sequence_test4 INCREMENT BY -1; + +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test4'); + +ALTER SEQUENCE sequence_test2 RESTART; +SELECT nextval('sequence_test2'); + +ALTER SEQUENCE sequence_test2 RESTART WITH 0; -- error +ALTER SEQUENCE sequence_test4 RESTART WITH 40; -- error + +-- test CYCLE and NO CYCLE +ALTER SEQUENCE sequence_test2 RESTART WITH 24 + INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); -- cycled + +ALTER SEQUENCE sequence_test2 RESTART WITH 24 + NO CYCLE; +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); -- error + +ALTER SEQUENCE sequence_test2 RESTART WITH -24 START WITH -24 + INCREMENT BY -4 MINVALUE -36 MAXVALUE -5 CYCLE; +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); -- cycled + +ALTER SEQUENCE sequence_test2 RESTART WITH -24 + NO CYCLE; +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); +SELECT nextval('sequence_test2'); -- error + +-- reset +ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 32 START WITH 32 + INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; + +SELECT setval('sequence_test2', -100); -- error +SELECT setval('sequence_test2', 100); -- error +SELECT setval('sequence_test2', 5); + +CREATE SEQUENCE sequence_test3; -- not read from, to test is_called + + +-- Information schema +SELECT * FROM information_schema.sequences + WHERE sequence_name ~ ANY(ARRAY['sequence_test', 'serialtest']) + ORDER BY sequence_name ASC; + +SELECT schemaname, sequencename, start_value, min_value, max_value, increment_by, cycle, cache_size, last_value +FROM pg_sequences +WHERE sequencename ~ ANY(ARRAY['sequence_test', 'serialtest']) + ORDER BY sequencename ASC; + + +SELECT * FROM pg_sequence_parameters('sequence_test4'::regclass); + + +\d sequence_test4 +\d serialtest2_f2_seq + + +-- Test comments +COMMENT ON SEQUENCE asdf IS 'won''t work'; +COMMENT ON SEQUENCE sequence_test2 IS 'will work'; +COMMENT ON SEQUENCE sequence_test2 IS NULL; + +-- Test lastval() +CREATE SEQUENCE seq; +SELECT nextval('seq'); +SELECT lastval(); +SELECT setval('seq', 99); +SELECT lastval(); +DISCARD SEQUENCES; +SELECT lastval(); + +CREATE SEQUENCE seq2; +SELECT nextval('seq2'); +SELECT lastval(); + +DROP SEQUENCE seq2; +-- should fail +SELECT lastval(); + +-- Test sequences in read-only transactions +CREATE TEMPORARY SEQUENCE sequence_test_temp1; +START TRANSACTION READ ONLY; +SELECT nextval('sequence_test_temp1'); -- ok +SELECT nextval('sequence_test2'); -- error +ROLLBACK; +START TRANSACTION READ ONLY; +SELECT setval('sequence_test_temp1', 1); -- ok +SELECT setval('sequence_test2', 1); -- error +ROLLBACK; + +-- privileges tests + +CREATE USER regress_seq_user; + +-- nextval +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT SELECT ON seq3 TO regress_seq_user; +SELECT nextval('seq3'); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT UPDATE ON seq3 TO regress_seq_user; +SELECT nextval('seq3'); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT USAGE ON seq3 TO regress_seq_user; +SELECT nextval('seq3'); +ROLLBACK; + +-- currval +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT SELECT ON seq3 TO regress_seq_user; +SELECT currval('seq3'); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT UPDATE ON seq3 TO regress_seq_user; +SELECT currval('seq3'); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT USAGE ON seq3 TO regress_seq_user; +SELECT currval('seq3'); +ROLLBACK; + +-- lastval +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT SELECT ON seq3 TO regress_seq_user; +SELECT lastval(); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT UPDATE ON seq3 TO regress_seq_user; +SELECT lastval(); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM regress_seq_user; +GRANT USAGE ON seq3 TO regress_seq_user; +SELECT lastval(); +ROLLBACK; + +-- setval +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM regress_seq_user; +SAVEPOINT save; +SELECT setval('seq3', 5); +ROLLBACK TO save; +GRANT UPDATE ON seq3 TO regress_seq_user; +SELECT setval('seq3', 5); +SELECT nextval('seq3'); +ROLLBACK; + +-- ALTER SEQUENCE +BEGIN; +SET LOCAL SESSION AUTHORIZATION regress_seq_user; +ALTER SEQUENCE sequence_test2 START WITH 1; +ROLLBACK; + +-- Sequences should get wiped out as well: +DROP TABLE serialTest1, serialTest2; + +-- Make sure sequences are gone: +SELECT * FROM information_schema.sequences WHERE sequence_name IN + ('sequence_test2', 'serialtest2_f2_seq', 'serialtest2_f3_seq', + 'serialtest2_f4_seq', 'serialtest2_f5_seq', 'serialtest2_f6_seq') + ORDER BY sequence_name ASC; + +DROP USER regress_seq_user; +DROP SEQUENCE seq; + +-- cache tests +CREATE SEQUENCE test_seq1 CACHE 10; +SELECT nextval('test_seq1'); +SELECT nextval('test_seq1'); +SELECT nextval('test_seq1'); + +DROP SEQUENCE test_seq1; diff --git a/src/test/singlenode_regress/sql/sequence_gp.sql b/src/test/singlenode_regress/sql/sequence_gp.sql new file mode 100644 index 00000000000..f9e1dcbf4ec --- /dev/null +++ b/src/test/singlenode_regress/sql/sequence_gp.sql @@ -0,0 +1,78 @@ +-- +-- Test Overflow with NO CYCLE +-- +CREATE TABLE tmp_table (a int); +INSERT INTO tmp_table VALUES (0),(1),(2),(3); + +-- Test execution of nextval on master with CACHE 1 +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2 START 1 CACHE 1 NO CYCLE; +SELECT nextval('tmp_seq'); +SELECT nextval('tmp_seq'); +-- Fails because it reaches MAXVALUE +SELECT nextval('tmp_seq'); +DROP SEQUENCE tmp_seq; + +-- Test that ORCA and Planner return the same results although they produce different execution plans. +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 4 START 1 CACHE 1 NO CYCLE; +SELECT val from (SELECT nextval('tmp_seq'), a as val FROM tmp_table ORDER BY a) as val ORDER BY val; +DROP SEQUENCE tmp_seq; + +-- Test execution of nextval on master with CACHE > 1 +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2 START 1 CACHE 20 NO CYCLE; +SELECT nextval('tmp_seq'); +SELECT nextval('tmp_seq'); +-- Fails because it reaches MAXVALUE +SELECT nextval('tmp_seq'); +DROP SEQUENCE tmp_seq; + +-- Test execution of nextval on master (when optimizer = on) and segments (when optimizer=off) with CACHE > 1 +CREATE TABLE tmp_table_cache (a int, b int); +-- forcing the values to go on one segment only, to predict the sequence values. +INSERT INTO tmp_table_cache VALUES (1,0),(1,1),(1,2),(1,3); +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 4 START 1 CACHE 3 NO CYCLE; +SELECT nextval('tmp_seq'), * FROM tmp_table_cache; +SELECT * from tmp_seq; +SELECT seqrelid::regclass, seqtypid::regtype, seqstart, seqincrement, seqmax, seqmin, seqcache, seqcycle FROM pg_sequence WHERE seqrelid='tmp_seq'::regclass; +DROP SEQUENCE tmp_seq; + +CREATE SEQUENCE tmp_seq INCREMENT 1 MINVALUE 1 MAXVALUE 3 START 1 CACHE 3 NO CYCLE; +SELECT nextval('tmp_seq'), a FROM tmp_table ORDER BY a; +DROP SEQUENCE tmp_seq; + +DROP TABLE tmp_table; + +CREATE TABLE mytable (size INTEGER, gid bigserial NOT NULL); +ALTER SEQUENCE mytable_gid_seq RESTART WITH 9223372036854775805; +/* Consume rest of serial sequence column values */ +INSERT INTO mytable VALUES (1), (2), (3); +SELECT gid FROM mytable; +INSERT INTO mytable VALUES(4); +SELECT gid FROM mytable; +INSERT INTO mytable SELECT * FROM generate_series(1, 10)i; +SELECT gid FROM mytable; +SELECT * FROM mytable_gid_seq; +SELECT seqrelid::regclass, seqtypid::regtype, seqstart, seqincrement, seqmax, seqmin, seqcache, seqcycle FROM pg_sequence WHERE seqrelid='mytable_gid_seq'::regclass; + +CREATE TABLE out_of_range_insert (size INTEGER, gid serial NOT NULL); +ALTER SEQUENCE out_of_range_insert_gid_seq RESTART WITH 2147483646; +INSERT INTO out_of_range_insert VALUES (1), (2), (3); +SELECT * FROM out_of_range_insert ORDER BY gid; +SELECT * FROM out_of_range_insert_gid_seq; +SELECT seqrelid::regclass, seqtypid::regtype, seqstart, seqincrement, seqmax, seqmin, seqcache, seqcycle FROM pg_sequence WHERE seqrelid='out_of_range_insert_gid_seq'::regclass; + +CREATE SEQUENCE descending_sequence INCREMENT -1 MINVALUE 1 MAXVALUE 9223372036854775806 START 9223372036854775806 CACHE 1; +SELECT nextval('descending_sequence'); +CREATE TABLE descending_sequence_insert(a bigint, b bigint); +INSERT INTO descending_sequence_insert SELECT i, nextval('descending_sequence') FROM generate_series(1, 10)i; +SELECT * FROM descending_sequence_insert ORDER BY b DESC; +SELECT * FROM descending_sequence; +SELECT seqrelid::regclass, seqtypid::regtype, seqstart, seqincrement, seqmax, seqmin, seqcache, seqcycle FROM pg_sequence WHERE seqrelid='descending_sequence'::regclass; + +-- start_ignore +-- Test that we don't produce duplicate sequence values +DROP SEQUENCE IF EXISTS check_no_duplicates; +CREATE SEQUENCE check_no_duplicates; +SELECT nextval('check_no_duplicates') FROM gp_dist_random('gp_id'); +SELECT nextval('check_no_duplicates'); +SELECT nextval('check_no_duplicates') FROM gp_dist_random('gp_id'); +-- end_ignore diff --git a/src/test/singlenode_regress/sql/spgist.sql b/src/test/singlenode_regress/sql/spgist.sql new file mode 100644 index 00000000000..7644f344a91 --- /dev/null +++ b/src/test/singlenode_regress/sql/spgist.sql @@ -0,0 +1,82 @@ +-- +-- Test SP-GiST indexes. +-- +-- There are other tests to test different SP-GiST opclasses. This is for +-- testing SP-GiST code itself. + +create table spgist_point_tbl(id int4, p point); +create index spgist_point_idx on spgist_point_tbl using spgist(p) with (fillfactor = 75); + +-- Test vacuum-root operation. It gets invoked when the root is also a leaf, +-- i.e. the index is very small. +insert into spgist_point_tbl (id, p) +select g, point(g*10, g*10) from generate_series(1, 10) g; +delete from spgist_point_tbl where id < 5; +vacuum spgist_point_tbl; + +-- Insert more data, to make the index a few levels deep. +insert into spgist_point_tbl (id, p) +select g, point(g*10, g*10) from generate_series(1, 10000) g; +insert into spgist_point_tbl (id, p) +select g+100000, point(g*10+1, g*10+1) from generate_series(1, 10000) g; + +-- To test vacuum, delete some entries from all over the index. +delete from spgist_point_tbl where id % 2 = 1; + +-- And also delete some concentration of values. (SP-GiST doesn't currently +-- attempt to delete pages even when they become empty, but if it did, this +-- would exercise it) +delete from spgist_point_tbl where id < 10000; + +vacuum spgist_point_tbl; + +-- Test rescan paths (cf. bug #15378) +-- use box and && rather than point, so that rescan happens when the +-- traverse stack is non-empty + +create table spgist_box_tbl(id serial, b box); +insert into spgist_box_tbl(b) +select box(point(i,j),point(i+s,j+s)) + from generate_series(1,100,5) i, + generate_series(1,100,5) j, + generate_series(1,10) s; +create index spgist_box_idx on spgist_box_tbl using spgist (b); + +select count(*) + from (values (point(5,5)),(point(8,8)),(point(12,12))) v(p) + where exists(select * from spgist_box_tbl b where b.b && box(v.p,v.p)); + +-- The point opclass's choose method only uses the spgMatchNode action, +-- so the other actions are not tested by the above. Create an index using +-- text opclass, which uses the others actions. + +create table spgist_text_tbl(id int4, t text); +create index spgist_text_idx on spgist_text_tbl using spgist(t); + +insert into spgist_text_tbl (id, t) +select g, 'f' || repeat('o', 100) || g from generate_series(1, 10000) g +union all +select g, 'baaaaaaaaaaaaaar' || g from generate_series(1, 1000) g; + +-- Do a lot of insertions that have to split an existing node. Hopefully +-- one of these will cause the page to run out of space, causing the inner +-- tuple to be moved to another page. +insert into spgist_text_tbl (id, t) +select -g, 'f' || repeat('o', 100-g) || 'surprise' from generate_series(1, 100) g; + +-- Test out-of-range fillfactor values +create index spgist_point_idx2 on spgist_point_tbl using spgist(p) with (fillfactor = 9); +create index spgist_point_idx2 on spgist_point_tbl using spgist(p) with (fillfactor = 101); + +-- Modify fillfactor in existing index +alter index spgist_point_idx set (fillfactor = 90); +reindex index spgist_point_idx; + +-- Test index over a domain +create domain spgist_text as varchar; +create table spgist_domain_tbl (f1 spgist_text); +create index spgist_domain_idx on spgist_domain_tbl using spgist(f1); +insert into spgist_domain_tbl values('fee'), ('fi'), ('fo'), ('fum'); +explain (costs off) +select * from spgist_domain_tbl where f1 = 'fo'; +select * from spgist_domain_tbl where f1 = 'fo'; diff --git a/src/test/singlenode_regress/sql/stats.sql b/src/test/singlenode_regress/sql/stats.sql new file mode 100644 index 00000000000..240219d15b6 --- /dev/null +++ b/src/test/singlenode_regress/sql/stats.sql @@ -0,0 +1,198 @@ +-- +-- Test Statistics Collector +-- +-- Must be run after tenk2 has been created (by create_table), +-- populated (by create_misc) and indexed (by create_index). +-- + +-- conditio sine qua non +SHOW track_counts; -- must be on + +-- ensure that both seqscan and indexscan plans are allowed +SET enable_seqscan TO on; +SET enable_indexscan TO on; +-- for the moment, we don't want index-only scans here +SET enable_indexonlyscan TO off; + +-- save counters +CREATE TABLE prevstats AS +SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, + (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, + (b.idx_blks_read + b.idx_blks_hit) AS idx_blks, + pg_stat_get_snapshot_timestamp() as snap_ts + FROM pg_catalog.pg_stat_user_tables_single_node AS t, + pg_catalog.pg_statio_user_tables AS b + WHERE t.relname='tenk2' AND b.relname='tenk2'; + +-- function to wait for counters to advance +create function wait_for_stats() returns void as $$ +declare + start_time timestamptz := clock_timestamp(); + updated1 bool; + updated2 bool; + updated3 bool; + updated4 bool; + updated5 bool; +begin + -- we don't want to wait forever; loop will exit after 30 seconds + for i in 1 .. 300 loop + + -- With parallel query, the seqscan and indexscan on tenk2 might be done + -- in parallel worker processes, which will send their stats counters + -- asynchronously to what our own session does. So we must check for + -- those counts to be registered separately from the update counts. + + -- check to see if seqscan has been sensed + SELECT (st.seq_scan >= pr.seq_scan + 1) INTO updated1 + FROM pg_stat_user_tables_single_node AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + + -- check to see if indexscan has been sensed + SELECT (st.idx_scan >= pr.idx_scan + 1) INTO updated2 + FROM pg_stat_user_tables_single_node AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + + -- check to see if all updates have been sensed + SELECT (n_tup_ins > 0) INTO updated3 + FROM pg_stat_user_tables_single_node WHERE relname='trunc_stats_test4'; + + -- We must also check explicitly that pg_stat_get_snapshot_timestamp has + -- advanced, because that comes from the global stats file which might + -- be older than the per-DB stats file we got the other values from. + SELECT (pr.snap_ts < pg_stat_get_snapshot_timestamp()) INTO updated4 + FROM prevstats AS pr; + + -- check to see if idx_tup_fetch has been sensed + SELECT (st.idx_tup_fetch >= pr.idx_tup_fetch + 1) INTO updated5 + FROM pg_stat_user_tables_single_node AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + + exit when updated1 and updated2 and updated3 and updated4 and updated5; + + -- wait a little + perform pg_sleep_for('100 milliseconds'); + + -- reset stats snapshot so we can test again + perform pg_stat_clear_snapshot(); + + end loop; + + -- report time waited in postmaster log (where it won't change test output) + raise log 'wait_for_stats delayed % seconds', + extract(epoch from clock_timestamp() - start_time); +end +$$ language plpgsql; + +-- test effects of TRUNCATE on n_live_tup/n_dead_tup counters +CREATE TABLE trunc_stats_test(id serial); +CREATE TABLE trunc_stats_test1(id serial, stuff text); +CREATE TABLE trunc_stats_test2(id serial); +CREATE TABLE trunc_stats_test3(id serial, stuff text); +CREATE TABLE trunc_stats_test4(id serial); + +-- check that n_live_tup is reset to 0 after truncate +INSERT INTO trunc_stats_test DEFAULT VALUES; +INSERT INTO trunc_stats_test DEFAULT VALUES; +INSERT INTO trunc_stats_test DEFAULT VALUES; +TRUNCATE trunc_stats_test; + +-- test involving a truncate in a transaction; 4 ins but only 1 live +INSERT INTO trunc_stats_test1 DEFAULT VALUES; +INSERT INTO trunc_stats_test1 DEFAULT VALUES; +INSERT INTO trunc_stats_test1 DEFAULT VALUES; +UPDATE trunc_stats_test1 SET id = id + 10 WHERE id IN (1, 2); +DELETE FROM trunc_stats_test1 WHERE id = 3; + +BEGIN; +UPDATE trunc_stats_test1 SET id = id + 100; +TRUNCATE trunc_stats_test1; +INSERT INTO trunc_stats_test1 DEFAULT VALUES; +COMMIT; + +-- use a savepoint: 1 insert, 1 live +BEGIN; +INSERT INTO trunc_stats_test2 DEFAULT VALUES; +INSERT INTO trunc_stats_test2 DEFAULT VALUES; +SAVEPOINT p1; +INSERT INTO trunc_stats_test2 DEFAULT VALUES; +TRUNCATE trunc_stats_test2; +INSERT INTO trunc_stats_test2 DEFAULT VALUES; +RELEASE SAVEPOINT p1; +COMMIT; + +-- rollback a savepoint: this should count 4 inserts and have 2 +-- live tuples after commit (and 2 dead ones due to aborted subxact) +BEGIN; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +SAVEPOINT p1; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +TRUNCATE trunc_stats_test3; +INSERT INTO trunc_stats_test3 DEFAULT VALUES; +ROLLBACK TO SAVEPOINT p1; +COMMIT; + +-- rollback a truncate: this should count 2 inserts and produce 2 dead tuples +BEGIN; +INSERT INTO trunc_stats_test4 DEFAULT VALUES; +INSERT INTO trunc_stats_test4 DEFAULT VALUES; +TRUNCATE trunc_stats_test4; +INSERT INTO trunc_stats_test4 DEFAULT VALUES; +ROLLBACK; + +-- do a seqscan +SELECT count(*) FROM tenk2; +-- do an indexscan +-- make sure it is not a bitmap scan, which might skip fetching heap tuples +SET enable_bitmapscan TO off; +-- for orca, we don't want index-only scans here, +-- which might skip fetching heap tuples. +SET optimizer_enable_indexonlyscan TO off; +SELECT count(*) FROM tenk2 WHERE unique1 = 1; +RESET optimizer_enable_indexonlyscan; +SELECT * FROM tenk2 where unique1 = 10; +RESET enable_bitmapscan; + +-- We can't just call wait_for_stats() at this point, because we only +-- transmit stats when the session goes idle, and we probably didn't +-- transmit the last couple of counts yet thanks to the rate-limiting logic +-- in pgstat_report_stat(). But instead of waiting for the rate limiter's +-- timeout to elapse, let's just start a new session. The old one will +-- then send its stats before dying. +\c - + +-- wait for stats collector to update +SELECT wait_for_stats(); + +-- check effects +SELECT relname, n_tup_ins, n_tup_upd, n_tup_del, n_live_tup, n_dead_tup + FROM pg_stat_user_tables_single_node + WHERE relname like 'trunc_stats_test%' order by relname; + +SELECT st.seq_scan >= pr.seq_scan + 1, + st.seq_tup_read >= pr.seq_tup_read + cl.reltuples, + st.idx_scan >= pr.idx_scan + 1, + st.idx_tup_fetch >= pr.idx_tup_fetch + 1 + FROM pg_stat_user_tables_single_node AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + +-- GPDB_13_MERGE_FIXME: Some statistics are handled by stat collector process on each segment but not sent to master. +-- To keep this case, collect statistics from all segments. +-- lack of the second column case, see https://github.com/my-ship-it/database-core-upgrade/issues/151 +SELECT (SELECT sum(st.heap_blks_read) + sum(st.heap_blks_hit) - sum(pr.heap_blks) + FROM gp_dist_random('pg_statio_user_tables') AS st, gp_dist_random('prevstats') AS pr WHERE st.relname='tenk2') + > (select relpages from pg_class where relname='tenk2'); + +SELECT pr.snap_ts < pg_stat_get_snapshot_timestamp() as snapshot_newer +FROM prevstats AS pr; + +DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; +DROP TABLE prevstats; + + +-- ensure that stats accessors handle NULL input correctly +SELECT pg_stat_get_replication_slot(NULL); + + +-- End of Stats Test diff --git a/src/test/singlenode_regress/sql/stats_ext.sql b/src/test/singlenode_regress/sql/stats_ext.sql new file mode 100644 index 00000000000..d2c59b0a8ad --- /dev/null +++ b/src/test/singlenode_regress/sql/stats_ext.sql @@ -0,0 +1,1638 @@ +-- Generic extended statistics support + +-- +-- Note: tables for which we check estimated row counts should be created +-- with autovacuum_enabled = off, so that we don't have unstable results +-- from auto-analyze happening when we didn't expect it. +-- + +-- check the number of estimated/actual rows in the top node +create function check_estimated_rows(text) returns table (estimated int, actual int) +language plpgsql as +$$ +declare + ln text; + tmp text[]; + first_row bool := true; +begin + for ln in + execute format('explain analyze %s', $1) + loop + if first_row then + first_row := false; + tmp := regexp_match(ln, 'rows=(\d*) .* rows=(\d*)'); + return query select tmp[1]::int, tmp[2]::int; + end if; + end loop; +end; +$$; + +-- Verify failures +CREATE TABLE ext_stats_test (x text, y int, z int); +CREATE STATISTICS tst; +CREATE STATISTICS tst ON a, b; +CREATE STATISTICS tst FROM sometab; +CREATE STATISTICS tst ON a, b FROM nonexistent; +CREATE STATISTICS tst ON a, b FROM ext_stats_test; +CREATE STATISTICS tst ON x, x, y FROM ext_stats_test; +CREATE STATISTICS tst ON x, x, y, x, x, y, x, x, y FROM ext_stats_test; +CREATE STATISTICS tst ON x, x, y, x, x, (x || 'x'), (y + 1), (x || 'x'), (x || 'x'), (y + 1) FROM ext_stats_test; +CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), (y + 1), (x || 'x'), (x || 'x'), (y + 1), (x || 'x'), (x || 'x'), (y + 1) FROM ext_stats_test; +CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), y FROM ext_stats_test; +CREATE STATISTICS tst (unrecognized) ON x, y FROM ext_stats_test; +-- incorrect expressions +CREATE STATISTICS tst ON (y) FROM ext_stats_test; -- single column reference +CREATE STATISTICS tst ON y + z FROM ext_stats_test; -- missing parentheses +CREATE STATISTICS tst ON (x, y) FROM ext_stats_test; -- tuple expression +DROP TABLE ext_stats_test; + +-- Ensure stats are dropped sanely, and test IF NOT EXISTS while at it +CREATE TABLE ab1 (a INTEGER, b INTEGER, c INTEGER); +CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1; +COMMENT ON STATISTICS ab1_a_b_stats IS 'new comment'; +CREATE ROLE regress_stats_ext; +SET SESSION AUTHORIZATION regress_stats_ext; +COMMENT ON STATISTICS ab1_a_b_stats IS 'changed comment'; +DROP STATISTICS ab1_a_b_stats; +ALTER STATISTICS ab1_a_b_stats RENAME TO ab1_a_b_stats_new; +RESET SESSION AUTHORIZATION; +DROP ROLE regress_stats_ext; + +CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1; +DROP STATISTICS ab1_a_b_stats; + +CREATE SCHEMA regress_schema_2; +CREATE STATISTICS regress_schema_2.ab1_a_b_stats ON a, b FROM ab1; + +-- Let's also verify the pg_get_statisticsobjdef output looks sane. +SELECT pg_get_statisticsobjdef(oid) FROM pg_statistic_ext WHERE stxname = 'ab1_a_b_stats'; + +DROP STATISTICS regress_schema_2.ab1_a_b_stats; + +-- Ensure statistics are dropped when columns are +CREATE STATISTICS ab1_b_c_stats ON b, c FROM ab1; +CREATE STATISTICS ab1_a_b_c_stats ON a, b, c FROM ab1; +CREATE STATISTICS ab1_b_a_stats ON b, a FROM ab1; +ALTER TABLE ab1 DROP COLUMN a; +\d ab1 +-- Ensure statistics are dropped when table is +SELECT stxname FROM pg_statistic_ext WHERE stxname LIKE 'ab1%'; +DROP TABLE ab1; +SELECT stxname FROM pg_statistic_ext WHERE stxname LIKE 'ab1%'; + +-- Ensure things work sanely with SET STATISTICS 0 +CREATE TABLE ab1 (a INTEGER, b INTEGER); +ALTER TABLE ab1 ALTER a SET STATISTICS 0; +INSERT INTO ab1 SELECT a, a%23 FROM generate_series(1, 1000) a; +CREATE STATISTICS ab1_a_b_stats ON a, b FROM ab1; +ANALYZE ab1; +ALTER TABLE ab1 ALTER a SET STATISTICS -1; +-- setting statistics target 0 skips the statistics, without printing any message, so check catalog +ALTER STATISTICS ab1_a_b_stats SET STATISTICS 0; +\d ab1 +ANALYZE ab1; +SELECT stxname, stxdndistinct, stxddependencies, stxdmcv + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxname = 'ab1_a_b_stats' + AND d.stxoid = s.oid; +ALTER STATISTICS ab1_a_b_stats SET STATISTICS -1; +\d+ ab1 +-- partial analyze doesn't build stats either +ANALYZE ab1 (a); +ANALYZE ab1; +DROP TABLE ab1; +ALTER STATISTICS ab1_a_b_stats SET STATISTICS 0; +ALTER STATISTICS IF EXISTS ab1_a_b_stats SET STATISTICS 0; + +-- Ensure we can build statistics for tables with inheritance. +CREATE TABLE ab1 (a INTEGER, b INTEGER); +CREATE TABLE ab1c () INHERITS (ab1); +INSERT INTO ab1 VALUES (1,1); +CREATE STATISTICS ab1_a_b_stats ON a, b FROM ab1; +ANALYZE ab1; +DROP TABLE ab1 CASCADE; + +-- Tests for stats with inheritance +CREATE TABLE stxdinh(a int, b int); +CREATE TABLE stxdinh1() INHERITS(stxdinh); +CREATE TABLE stxdinh2() INHERITS(stxdinh); +INSERT INTO stxdinh SELECT mod(a,50), mod(a,100) FROM generate_series(0, 1999) a; +INSERT INTO stxdinh1 SELECT mod(a,100), mod(a,100) FROM generate_series(0, 999) a; +INSERT INTO stxdinh2 SELECT mod(a,100), mod(a,100) FROM generate_series(0, 999) a; +VACUUM ANALYZE stxdinh, stxdinh1, stxdinh2; +-- Ensure non-inherited stats are not applied to inherited query +-- Without stats object, it looks like this +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* GROUP BY 1, 2'); +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* WHERE a = 0 AND b = 0'); +CREATE STATISTICS stxdinh ON a, b FROM stxdinh; +VACUUM ANALYZE stxdinh, stxdinh1, stxdinh2; +-- Since the stats object does not include inherited stats, it should not +-- affect the estimates +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* GROUP BY 1, 2'); +-- Dependencies are applied at individual relations (within append), so +-- this estimate changes a bit because we improve estimates for the parent +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* WHERE a = 0 AND b = 0'); +DROP TABLE stxdinh, stxdinh1, stxdinh2; + +-- Ensure inherited stats ARE applied to inherited query in partitioned table +CREATE TABLE stxdinp(i int, a int, b int) PARTITION BY RANGE (i); +CREATE TABLE stxdinp1 PARTITION OF stxdinp FOR VALUES FROM (1) TO (100); +INSERT INTO stxdinp SELECT 1, a/100, a/100 FROM generate_series(1, 999) a; +CREATE STATISTICS stxdinp ON a, b FROM stxdinp; +VACUUM ANALYZE stxdinp; -- partitions are processed recursively +SELECT 1 FROM pg_statistic_ext WHERE stxrelid = 'stxdinp'::regclass; +SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinp GROUP BY 1, 2'); +DROP TABLE stxdinp; + +-- basic test for statistics on expressions +CREATE TABLE ab1 (a INTEGER, b INTEGER, c TIMESTAMP, d TIMESTAMPTZ); + +-- expression stats may be built on a single expression column +CREATE STATISTICS ab1_exprstat_1 ON (a+b) FROM ab1; + +-- with a single expression, we only enable expression statistics +CREATE STATISTICS ab1_exprstat_2 ON (a+b) FROM ab1; +SELECT stxkind FROM pg_statistic_ext WHERE stxname = 'ab1_exprstat_2'; + +-- adding anything to the expression builds all statistics kinds +CREATE STATISTICS ab1_exprstat_3 ON (a+b), a FROM ab1; +SELECT stxkind FROM pg_statistic_ext WHERE stxname = 'ab1_exprstat_3'; + +-- date_trunc on timestamptz is not immutable, but that should not matter +CREATE STATISTICS ab1_exprstat_4 ON date_trunc('day', d) FROM ab1; + +-- date_trunc on timestamp is immutable +CREATE STATISTICS ab1_exprstat_5 ON date_trunc('day', c) FROM ab1; + +-- insert some data and run analyze, to test that these cases build properly +INSERT INTO ab1 +SELECT + generate_series(1,10), + generate_series(1,10), + generate_series('2020-10-01'::timestamp, '2020-10-10'::timestamp, interval '1 day'), + generate_series('2020-10-01'::timestamptz, '2020-10-10'::timestamptz, interval '1 day'); +ANALYZE ab1; +DROP TABLE ab1; + +-- Verify supported object types for extended statistics +CREATE schema tststats; + +CREATE TABLE tststats.t (a int, b int, c text); +CREATE INDEX ti ON tststats.t (a, b); +CREATE SEQUENCE tststats.s; +CREATE VIEW tststats.v AS SELECT * FROM tststats.t; +CREATE MATERIALIZED VIEW tststats.mv AS SELECT * FROM tststats.t; +CREATE TYPE tststats.ty AS (a int, b int, c text); +CREATE FOREIGN DATA WRAPPER extstats_dummy_fdw; +CREATE SERVER extstats_dummy_srv FOREIGN DATA WRAPPER extstats_dummy_fdw; +CREATE FOREIGN TABLE tststats.f (a int, b int, c text) SERVER extstats_dummy_srv; +CREATE TABLE tststats.pt (a int, b int, c text) PARTITION BY RANGE (a, b); +CREATE TABLE tststats.pt1 PARTITION OF tststats.pt FOR VALUES FROM (-10, -10) TO (10, 10); + +CREATE STATISTICS tststats.s1 ON a, b FROM tststats.t; +CREATE STATISTICS tststats.s2 ON a, b FROM tststats.ti; +CREATE STATISTICS tststats.s3 ON a, b FROM tststats.s; +CREATE STATISTICS tststats.s4 ON a, b FROM tststats.v; +CREATE STATISTICS tststats.s5 ON a, b FROM tststats.mv; +CREATE STATISTICS tststats.s6 ON a, b FROM tststats.ty; +CREATE STATISTICS tststats.s7 ON a, b FROM tststats.f; +CREATE STATISTICS tststats.s8 ON a, b FROM tststats.pt; +CREATE STATISTICS tststats.s9 ON a, b FROM tststats.pt1; +DO $$ +DECLARE + relname text := reltoastrelid::regclass FROM pg_class WHERE oid = 'tststats.t'::regclass; +BEGIN + EXECUTE 'CREATE STATISTICS tststats.s10 ON a, b FROM ' || relname; +EXCEPTION WHEN wrong_object_type THEN + RAISE NOTICE 'stats on toast table not created'; +END; +$$; + +DROP SCHEMA tststats CASCADE; +DROP FOREIGN DATA WRAPPER extstats_dummy_fdw CASCADE; + +-- n-distinct tests +CREATE TABLE ndistinct ( + filler1 TEXT, + filler2 NUMERIC, + a INT, + b INT, + filler3 DATE, + c INT, + d INT +) +WITH (autovacuum_enabled = off); + +-- over-estimates when using only per-column statistics +INSERT INTO ndistinct (a, b, c, filler1) + SELECT i/100, i/100, i/100, cash_words((i/100)::money) + FROM generate_series(1,1000) s(i); + +ANALYZE ndistinct; + +-- Group Aggregate, due to over-estimate of the number of groups +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (a+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + +-- correct command +CREATE STATISTICS s10 ON a, b, c FROM ndistinct; + +ANALYZE ndistinct; + +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + +-- minor improvement, make sure the ctid does not break the matching +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY ctid, a, b'); + +-- Hash Aggregate, thanks to estimates improved by the statistic +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c'); + +-- partial improvement (match on attributes) +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (a+1)'); + +-- expressions - no improvement +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + +-- last two plans keep using Group Aggregate, because 'd' is not covered +-- by the statistic and while it's NULL-only we assume 200 values for it +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d'); + +TRUNCATE TABLE ndistinct; + +-- under-estimates when using only per-column statistics +INSERT INTO ndistinct (a, b, c, filler1) + SELECT mod(i,13), mod(i,17), mod(i,19), + cash_words(mod(i,23)::int::money) + FROM generate_series(1,1000) s(i); + +ANALYZE ndistinct; + +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + +-- correct estimates +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (a+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + +DROP STATISTICS s10; + +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + +-- dropping the statistics results in under-estimates +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, d'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (a+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + +-- ndistinct estimates with statistics on expressions +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + +CREATE STATISTICS s10 (ndistinct) ON (a+1), (b+100), (2*c) FROM ndistinct; + +ANALYZE ndistinct; + +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a+1), (b+100), (2*c)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (a+1), (b+100)'); + +DROP STATISTICS s10; + +-- a mix of attributes and expressions +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (2*c)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (2*c)'); + +CREATE STATISTICS s10 (ndistinct) ON a, b, (2*c) FROM ndistinct; + +ANALYZE ndistinct; + +SELECT s.stxkind, d.stxdndistinct + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxrelid = 'ndistinct'::regclass + AND d.stxoid = s.oid; + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (2*c)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (2*c)'); + +DROP STATISTICS s10; + +-- combination of multiple ndistinct statistics, with/without expressions +TRUNCATE ndistinct; + +-- two mostly independent groups of columns +INSERT INTO ndistinct (a, b, c, d) + SELECT mod(i,3), mod(i,9), mod(i,5), mod(i,20) + FROM generate_series(1,1000) s(i); + +ANALYZE ndistinct; + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + +-- basic statistics on both attributes (no expressions) +CREATE STATISTICS s11 (ndistinct) ON a, b FROM ndistinct; + +CREATE STATISTICS s12 (ndistinct) ON c, d FROM ndistinct; + +ANALYZE ndistinct; + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + + +-- replace the second statistics by statistics on expressions + +DROP STATISTICS s12; + +CREATE STATISTICS s12 (ndistinct) ON (c * 10), (d - 1) FROM ndistinct; + +ANALYZE ndistinct; + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + + +-- replace the second statistics by statistics on both attributes and expressions + +DROP STATISTICS s12; + +CREATE STATISTICS s12 (ndistinct) ON c, d, (c * 10), (d - 1) FROM ndistinct; + +ANALYZE ndistinct; + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + + +-- replace the other statistics by statistics on both attributes and expressions + +DROP STATISTICS s11; + +CREATE STATISTICS s11 (ndistinct) ON a, b, (a*5), (b+1) FROM ndistinct; + +ANALYZE ndistinct; + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + + +-- replace statistics by somewhat overlapping ones (this expected to get worse estimate +-- because the first statistics shall be applied to 3 columns, and the second one can't +-- be really applied) + +DROP STATISTICS s11; +DROP STATISTICS s12; + +CREATE STATISTICS s11 (ndistinct) ON a, b, (a*5), (b+1) FROM ndistinct; +CREATE STATISTICS s12 (ndistinct) ON a, (b+1), (c * 10) FROM ndistinct; + +ANALYZE ndistinct; + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), b'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY (a*5), (b+1), c'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, b, (c*10)'); + +SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY a, (b+1), c, (d - 1)'); + +DROP STATISTICS s11; +DROP STATISTICS s12; + +-- functional dependencies tests +CREATE TABLE functional_dependencies ( + filler1 TEXT, + filler2 NUMERIC, + a INT, + b TEXT, + filler3 DATE, + c INT, + d TEXT +) +WITH (autovacuum_enabled = off); + +CREATE INDEX fdeps_ab_idx ON functional_dependencies (a, b); +CREATE INDEX fdeps_abc_idx ON functional_dependencies (a, b, c); + +-- random data (no functional dependencies) +INSERT INTO functional_dependencies (a, b, c, filler1) + SELECT mod(i, 5), mod(i, 7), mod(i, 11), i FROM generate_series(1,1000) s(i); + +ANALYZE functional_dependencies; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + +-- create statistics +CREATE STATISTICS func_deps_stat (dependencies) ON a, b, c FROM functional_dependencies; + +ANALYZE functional_dependencies; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + +-- a => b, a => c, b => c +TRUNCATE functional_dependencies; +DROP STATISTICS func_deps_stat; + +-- now do the same thing, but with expressions +INSERT INTO functional_dependencies (a, b, c, filler1) + SELECT i, i, i, i FROM generate_series(1,5000) s(i); + +ANALYZE functional_dependencies; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE mod(a, 11) = 1 AND mod(b::int, 13) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE mod(a, 11) = 1 AND mod(b::int, 13) = 1 AND mod(c, 7) = 1'); + +-- create statistics +CREATE STATISTICS func_deps_stat (dependencies) ON (mod(a,11)), (mod(b::int, 13)), (mod(c, 7)) FROM functional_dependencies; + +ANALYZE functional_dependencies; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE mod(a, 11) = 1 AND mod(b::int, 13) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE mod(a, 11) = 1 AND mod(b::int, 13) = 1 AND mod(c, 7) = 1'); + +-- a => b, a => c, b => c +TRUNCATE functional_dependencies; +DROP STATISTICS func_deps_stat; + +INSERT INTO functional_dependencies (a, b, c, filler1) + SELECT mod(i,100), mod(i,50), mod(i,25), i FROM generate_series(1,5000) s(i); + +ANALYZE functional_dependencies; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + +-- IN +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b IN (''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b IN (''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c IN (1)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 26, 27, 51, 52, 76, 77) AND b IN (''1'', ''2'', ''26'', ''27'') AND c IN (1, 2)'); + +-- OR clauses referencing the same attribute +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 51) AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 51) AND (b = ''1'' OR b = ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 2 OR a = 51 OR a = 52) AND (b = ''1'' OR b = ''2'')'); + +-- OR clauses referencing different attributes +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR b = ''1'') AND b = ''1'''); + +-- ANY +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = ANY (ARRAY[1])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 26, 27, 51, 52, 76, 77]) AND b = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND c = ANY (ARRAY[1, 2])'); + +-- ANY with inequalities should not benefit from functional dependencies +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a < ANY (ARRAY[1, 51]) AND b > ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a >= ANY (ARRAY[1, 51]) AND b <= ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a <= ANY (ARRAY[1, 2, 51, 52]) AND b >= ANY (ARRAY[''1'', ''2''])'); + +-- ALL (should not benefit from functional dependencies) +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ALL (ARRAY[''1'', ''2''])'); + +-- create statistics +CREATE STATISTICS func_deps_stat (dependencies) ON a, b, c FROM functional_dependencies; + +ANALYZE functional_dependencies; + +-- print the detected dependencies +SELECT dependencies FROM pg_stats_ext WHERE statistics_name = 'func_deps_stat'; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + +-- IN +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b IN (''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b IN (''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c IN (1)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 26, 27, 51, 52, 76, 77) AND b IN (''1'', ''2'', ''26'', ''27'') AND c IN (1, 2)'); + +-- OR clauses referencing the same attribute +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 51) AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 51) AND (b = ''1'' OR b = ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR a = 2 OR a = 51 OR a = 52) AND (b = ''1'' OR b = ''2'')'); + +-- OR clauses referencing different attributes are incompatible +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a = 1 OR b = ''1'') AND b = ''1'''); + +-- ANY +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = ANY (ARRAY[1])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 26, 27, 51, 52, 76, 77]) AND b = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND c = ANY (ARRAY[1, 2])'); + +-- ANY with inequalities should not benefit from functional dependencies +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a < ANY (ARRAY[1, 51]) AND b > ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a >= ANY (ARRAY[1, 51]) AND b <= ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a <= ANY (ARRAY[1, 2, 51, 52]) AND b >= ANY (ARRAY[''1'', ''2''])'); + +-- ALL (should not benefit from functional dependencies) +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ALL (ARRAY[''1'', ''2''])'); + +-- changing the type of column c causes all its stats to be dropped, reverting +-- to default estimates without any statistics, i.e. 0.5% selectivity for each +-- condition +ALTER TABLE functional_dependencies ALTER COLUMN c TYPE numeric; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + +ANALYZE functional_dependencies; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1'); + +DROP STATISTICS func_deps_stat; + +-- now try functional dependencies with expressions + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = 2 AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = 2 AND upper(b) = ''1'' AND (c + 1) = 2'); + +-- IN +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) IN (''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) IN (''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 52, 102, 152) AND upper(b) IN (''1'', ''26'') AND (c + 1) = 2'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 52, 102, 152) AND upper(b) IN (''1'', ''26'') AND (c + 1) IN (2)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 52, 54, 102, 104, 152, 154) AND upper(b) IN (''1'', ''2'', ''26'', ''27'') AND (c + 1) IN (2, 3)'); + +-- OR clauses referencing the same attribute +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 102) AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 102) AND (upper(b) = ''1'' OR upper(b) = ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 4 OR (a * 2) = 102 OR (a * 2) = 104) AND (upper(b) = ''1'' OR upper(b) = ''2'')'); + +-- OR clauses referencing different attributes +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR upper(b) = ''1'') AND upper(b) = ''1'''); + +-- ANY +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 102]) AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 102]) AND upper(b) = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 4, 102, 104]) AND upper(b) = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 52, 102, 152]) AND upper(b) = ANY (ARRAY[''1'', ''26'']) AND (c + 1) = 2'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 52, 102, 152]) AND upper(b) = ANY (ARRAY[''1'', ''26'']) AND (c + 1) = ANY (ARRAY[2])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 4, 52, 54, 102, 104, 152, 154]) AND upper(b) = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND (c + 1) = ANY (ARRAY[2, 3])'); + +-- ANY with inequalities should not benefit from functional dependencies +-- the estimates however improve thanks to having expression statistics +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) < ANY (ARRAY[2, 102]) AND upper(b) > ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) >= ANY (ARRAY[2, 102]) AND upper(b) <= ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) <= ANY (ARRAY[2, 4, 102, 104]) AND upper(b) >= ANY (ARRAY[''1'', ''2''])'); + +-- ALL (should not benefit from functional dependencies) +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ALL (ARRAY[''1''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ALL (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) = ALL (ARRAY[''1'', ''2''])'); + +-- create statistics on expressions +CREATE STATISTICS func_deps_stat (dependencies) ON (a * 2), upper(b), (c + 1) FROM functional_dependencies; + +ANALYZE functional_dependencies; + +-- print the detected dependencies +SELECT dependencies FROM pg_stats_ext WHERE statistics_name = 'func_deps_stat'; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = 2 AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = 2 AND upper(b) = ''1'' AND (c + 1) = 2'); + +-- IN +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) IN (''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) IN (''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 52, 102, 152) AND upper(b) IN (''1'', ''26'') AND (c + 1) = 2'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 52, 102, 152) AND upper(b) IN (''1'', ''26'') AND (c + 1) IN (2)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 52, 54, 102, 104, 152, 154) AND upper(b) IN (''1'', ''2'', ''26'', ''27'') AND (c + 1) IN (2, 3)'); + +-- OR clauses referencing the same attribute +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 102) AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 102) AND (upper(b) = ''1'' OR upper(b) = ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR (a * 2) = 4 OR (a * 2) = 102 OR (a * 2) = 104) AND (upper(b) = ''1'' OR upper(b) = ''2'')'); + +-- OR clauses referencing different attributes +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE ((a * 2) = 2 OR upper(b) = ''1'') AND upper(b) = ''1'''); + +-- ANY +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 102]) AND upper(b) = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 102]) AND upper(b) = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 4, 102, 104]) AND upper(b) = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 52, 102, 152]) AND upper(b) = ANY (ARRAY[''1'', ''26'']) AND (c + 1) = 2'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 52, 102, 152]) AND upper(b) = ANY (ARRAY[''1'', ''26'']) AND (c + 1) = ANY (ARRAY[2])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) = ANY (ARRAY[2, 4, 52, 54, 102, 104, 152, 154]) AND upper(b) = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND (c + 1) = ANY (ARRAY[2, 3])'); + +-- ANY with inequalities should not benefit from functional dependencies +-- the estimates however improve thanks to having expression statistics +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) < ANY (ARRAY[2, 102]) AND upper(b) > ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) >= ANY (ARRAY[2, 102]) AND upper(b) <= ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) <= ANY (ARRAY[2, 4, 102, 104]) AND upper(b) >= ANY (ARRAY[''1'', ''2''])'); + +-- ALL (should not benefit from functional dependencies) +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ALL (ARRAY[''1''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 102) AND upper(b) = ALL (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE (a * 2) IN (2, 4, 102, 104) AND upper(b) = ALL (ARRAY[''1'', ''2''])'); + +-- check the ability to use multiple functional dependencies +CREATE TABLE functional_dependencies_multi ( + a INTEGER, + b INTEGER, + c INTEGER, + d INTEGER +) +WITH (autovacuum_enabled = off); + +INSERT INTO functional_dependencies_multi (a, b, c, d) + SELECT + mod(i,7), + mod(i,7), + mod(i,11), + mod(i,11) + FROM generate_series(1,5000) s(i); + +ANALYZE functional_dependencies_multi; + +-- estimates without any functional dependencies +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE a = 0 AND b = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE 0 = a AND 0 = b'); +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE c = 0 AND d = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE a = 0 AND b = 0 AND c = 0 AND d = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE 0 = a AND b = 0 AND 0 = c AND d = 0'); + +-- create separate functional dependencies +CREATE STATISTICS functional_dependencies_multi_1 (dependencies) ON a, b FROM functional_dependencies_multi; +CREATE STATISTICS functional_dependencies_multi_2 (dependencies) ON c, d FROM functional_dependencies_multi; + +ANALYZE functional_dependencies_multi; + +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE a = 0 AND b = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE 0 = a AND 0 = b'); +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE c = 0 AND d = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE a = 0 AND b = 0 AND c = 0 AND d = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies_multi WHERE 0 = a AND b = 0 AND 0 = c AND d = 0'); + +DROP TABLE functional_dependencies_multi; + +-- MCV lists +CREATE TABLE mcv_lists ( + filler1 TEXT, + filler2 NUMERIC, + a INT, + b VARCHAR, + filler3 DATE, + c INT, + d TEXT +) +WITH (autovacuum_enabled = off); + +-- random data (no MCV list) +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT mod(i,37), mod(i,41), mod(i,43), mod(i,47) FROM generate_series(1,5000) s(i); + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'' AND c = 1'); + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON a, b, c FROM mcv_lists; + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'' AND c = 1'); + +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; + +-- random data (no MCV list), but with expression +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT i, i, i, i FROM generate_series(1,1000) s(i); + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,7) = 1 AND mod(b::int,11) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,7) = 1 AND mod(b::int,11) = 1 AND mod(c,13) = 1'); + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON (mod(a,7)), (mod(b::int,11)), (mod(c,13)) FROM mcv_lists; + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,7) = 1 AND mod(b::int,11) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,7) = 1 AND mod(b::int,11) = 1 AND mod(c,13) = 1'); + +-- 100 distinct combinations, all in the MCV list +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; + +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT mod(i,100), mod(i,50), mod(i,25), i FROM generate_series(1,5000) s(i); + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = a AND ''1'' = b'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 1 AND b < ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > a AND ''1'' > b'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= 0 AND b <= ''0'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 0 >= a AND ''0'' >= b'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'' AND c = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 5 AND b < ''1'' AND c < 5'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 5 AND ''1'' > b AND 5 > c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= 4 AND b <= ''0'' AND c <= 4'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 4 >= a AND ''0'' >= b AND 4 >= c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1 OR d IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (1, 2, 51, 52) AND b IN ( ''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (1, 2, 51, 52, NULL) AND b IN ( ''1'', ''2'', NULL)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = ANY (ARRAY[NULL, 1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2'', NULL])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= ANY (ARRAY[1, 2, 3]) AND b IN (''1'', ''2'', ''3'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= ANY (ARRAY[1, NULL, 2, 3]) AND b IN (''1'', ''2'', NULL, ''3'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND c > ANY (ARRAY[1, 2, 3])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND c > ANY (ARRAY[1, 2, 3, NULL])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND b IN (''1'', ''2'', ''3'') AND c > ANY (ARRAY[1, 2, 3])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND b IN (''1'', ''2'', NULL, ''3'') AND c > ANY (ARRAY[1, 2, NULL, 3])'); + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON a, b, c FROM mcv_lists; + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = a AND ''1'' = b'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 1 AND b < ''1'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > a AND ''1'' > b'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= 0 AND b <= ''0'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 0 >= a AND ''0'' >= b'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'' AND c = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 5 AND b < ''1'' AND c < 5'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < 5 AND ''1'' > b AND 5 > c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= 4 AND b <= ''0'' AND c <= 4'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 4 >= a AND ''0'' >= b AND 4 >= c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1 OR d IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''1'' OR c = 1 OR d IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (1, 2, 51, 52) AND b IN ( ''1'', ''2'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (1, 2, 51, 52, NULL) AND b IN ( ''1'', ''2'', NULL)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = ANY (ARRAY[NULL, 1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2'', NULL])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= ANY (ARRAY[1, 2, 3]) AND b IN (''1'', ''2'', ''3'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a <= ANY (ARRAY[1, NULL, 2, 3]) AND b IN (''1'', ''2'', NULL, ''3'')'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND c > ANY (ARRAY[1, 2, 3])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND c > ANY (ARRAY[1, 2, 3, NULL])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND b IN (''1'', ''2'', ''3'') AND c > ANY (ARRAY[1, 2, 3])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a < ALL (ARRAY[4, 5]) AND b IN (''1'', ''2'', NULL, ''3'') AND c > ANY (ARRAY[1, 2, NULL, 3])'); + +-- check change of unrelated column type does not reset the MCV statistics +ALTER TABLE mcv_lists ALTER COLUMN d TYPE VARCHAR(64); + +SELECT d.stxdmcv IS NOT NULL + FROM pg_statistic_ext s, pg_statistic_ext_data d + WHERE s.stxname = 'mcv_lists_stats' + AND d.stxoid = s.oid; + +-- check change of column type resets the MCV statistics +ALTER TABLE mcv_lists ALTER COLUMN c TYPE numeric; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1'''); + + +-- 100 distinct combinations, all in the MCV list, but with expressions +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; + +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT i, i, i, i FROM generate_series(1,1000) s(i); + +ANALYZE mcv_lists; + +-- without any stats on the expressions, we have to use default selectivities, which +-- is why the estimates here are different from the pre-computed case above + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = mod(a,20) AND 1 = mod(b::int,10)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < 1 AND mod(b::int,10) < 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > mod(a,20) AND 1 > mod(b::int,10)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1 AND mod(c,5) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 OR mod(b::int,10) = 1 OR mod(c,25) = 1 OR d IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) IN (1, 2, 51, 52, NULL) AND mod(b::int,10) IN ( 1, 2, NULL)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = ANY (ARRAY[1, 2, 51, 52]) AND mod(b::int,10) = ANY (ARRAY[1, 2])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) <= ANY (ARRAY[1, NULL, 2, 3]) AND mod(b::int,10) IN (1, 2, NULL, 3)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < ALL (ARRAY[4, 5]) AND mod(b::int,10) IN (1, 2, 3) AND mod(c,5) > ANY (ARRAY[1, 2, 3])'); + +-- create statistics with expressions only (we create three separate stats, in order not to build more complex extended stats) +CREATE STATISTICS mcv_lists_stats_1 ON (mod(a,20)) FROM mcv_lists; +CREATE STATISTICS mcv_lists_stats_2 ON (mod(b::int,10)) FROM mcv_lists; +CREATE STATISTICS mcv_lists_stats_3 ON (mod(c,5)) FROM mcv_lists; + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = mod(a,20) AND 1 = mod(b::int,10)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < 1 AND mod(b::int,10) < 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > mod(a,20) AND 1 > mod(b::int,10)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1 AND mod(c,5) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 OR mod(b::int,10) = 1 OR mod(c,25) = 1 OR d IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) IN (1, 2, 51, 52, NULL) AND mod(b::int,10) IN ( 1, 2, NULL)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = ANY (ARRAY[1, 2, 51, 52]) AND mod(b::int,10) = ANY (ARRAY[1, 2])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) <= ANY (ARRAY[1, NULL, 2, 3]) AND mod(b::int,10) IN (1, 2, NULL, 3)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < ALL (ARRAY[4, 5]) AND mod(b::int,10) IN (1, 2, 3) AND mod(c,5) > ANY (ARRAY[1, 2, 3])'); + +DROP STATISTICS mcv_lists_stats_1; +DROP STATISTICS mcv_lists_stats_2; +DROP STATISTICS mcv_lists_stats_3; + +-- create statistics with both MCV and expressions +CREATE STATISTICS mcv_lists_stats (mcv) ON (mod(a,20)), (mod(b::int,10)), (mod(c,5)) FROM mcv_lists; + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 = mod(a,20) AND 1 = mod(b::int,10)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < 1 AND mod(b::int,10) < 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE 1 > mod(a,20) AND 1 > mod(b::int,10)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 AND mod(b::int,10) = 1 AND mod(c,5) = 1'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 OR mod(b::int,10) = 1 OR mod(c,25) = 1 OR d IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) IN (1, 2, 51, 52, NULL) AND mod(b::int,10) IN ( 1, 2, NULL)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = ANY (ARRAY[1, 2, 51, 52]) AND mod(b::int,10) = ANY (ARRAY[1, 2])'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) <= ANY (ARRAY[1, NULL, 2, 3]) AND mod(b::int,10) IN (1, 2, NULL, 3)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) < ALL (ARRAY[4, 5]) AND mod(b::int,10) IN (1, 2, 3) AND mod(c,5) > ANY (ARRAY[1, 2, 3])'); + +-- we can't use the statistic for OR clauses that are not fully covered (missing 'd' attribute) +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE mod(a,20) = 1 OR mod(b::int,10) = 1 OR mod(c,5) = 1 OR d IS NOT NULL'); + +-- 100 distinct combinations with NULL values, all in the MCV list +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; + +INSERT INTO mcv_lists (a, b, c, filler1) + SELECT + (CASE WHEN mod(i,100) = 1 THEN NULL ELSE mod(i,100) END), + (CASE WHEN mod(i,50) = 1 THEN NULL ELSE mod(i,50) END), + (CASE WHEN mod(i,25) = 1 THEN NULL ELSE mod(i,25) END), + i + FROM generate_series(1,5000) s(i); + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL AND c IS NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NOT NULL AND b IS NULL AND c IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (0, 1) AND b IN (''0'', ''1'')'); + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON a, b, c FROM mcv_lists; + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL AND c IS NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NOT NULL AND b IS NULL AND c IS NOT NULL'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (0, 1) AND b IN (''0'', ''1'')'); + +-- test pg_mcv_list_items with a very simple (single item) MCV list +TRUNCATE mcv_lists; +INSERT INTO mcv_lists (a, b, c) SELECT 1, 2, 3 FROM generate_series(1,1000) s(i); +ANALYZE mcv_lists; + +SELECT m.* + FROM pg_statistic_ext s, pg_statistic_ext_data d, + pg_mcv_list_items(d.stxdmcv) m + WHERE s.stxname = 'mcv_lists_stats' + AND d.stxoid = s.oid; + +-- 2 distinct combinations with NULL values, all in the MCV list +TRUNCATE mcv_lists; +DROP STATISTICS mcv_lists_stats; + +INSERT INTO mcv_lists (a, b, c, d) + SELECT + NULL, -- always NULL + (CASE WHEN mod(i,2) = 0 THEN NULL ELSE 'x' END), + (CASE WHEN mod(i,2) = 0 THEN NULL ELSE 0 END), + (CASE WHEN mod(i,2) = 0 THEN NULL ELSE 'x' END) + FROM generate_series(1,5000) s(i); + +ANALYZE mcv_lists; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE b = ''x'' OR d = ''x'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''x'' OR d = ''x'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND (b = ''x'' OR d = ''x'')'); + +-- create statistics +CREATE STATISTICS mcv_lists_stats (mcv) ON a, b, d FROM mcv_lists; + +ANALYZE mcv_lists; + +-- test pg_mcv_list_items with MCV list containing variable-length data and NULLs +SELECT m.* + FROM pg_statistic_ext s, pg_statistic_ext_data d, + pg_mcv_list_items(d.stxdmcv) m + WHERE s.stxname = 'mcv_lists_stats' + AND d.stxoid = s.oid; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE b = ''x'' OR d = ''x'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 OR b = ''x'' OR d = ''x'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND (b = ''x'' OR d = ''x'')'); + +-- mcv with pass-by-ref fixlen types, e.g. uuid +CREATE TABLE mcv_lists_uuid ( + a UUID, + b UUID, + c UUID +) +WITH (autovacuum_enabled = off); + +INSERT INTO mcv_lists_uuid (a, b, c) + SELECT + md5(mod(i,100)::text)::uuid, + md5(mod(i,50)::text)::uuid, + md5(mod(i,25)::text)::uuid + FROM generate_series(1,5000) s(i); + +ANALYZE mcv_lists_uuid; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_uuid WHERE a = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND b = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_uuid WHERE a = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND b = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND c = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'''); + +CREATE STATISTICS mcv_lists_uuid_stats (mcv) ON a, b, c + FROM mcv_lists_uuid; + +ANALYZE mcv_lists_uuid; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_uuid WHERE a = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND b = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'''); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_uuid WHERE a = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND b = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'' AND c = ''1679091c-5a88-0faf-6fb5-e6087eb1b2dc'''); + +DROP TABLE mcv_lists_uuid; + +-- mcv with arrays +CREATE TABLE mcv_lists_arrays ( + a TEXT[], + b NUMERIC[], + c INT[] +) +WITH (autovacuum_enabled = off); + +INSERT INTO mcv_lists_arrays (a, b, c) + SELECT + ARRAY[md5((i/100)::text), md5((i/100-1)::text), md5((i/100+1)::text)], + ARRAY[(i/100-1)::numeric/1000, (i/100)::numeric/1000, (i/100+1)::numeric/1000], + ARRAY[(i/100-1), i/100, (i/100+1)] + FROM generate_series(1,5000) s(i); + +CREATE STATISTICS mcv_lists_arrays_stats (mcv) ON a, b, c + FROM mcv_lists_arrays; + +ANALYZE mcv_lists_arrays; + +-- mcv with bool +CREATE TABLE mcv_lists_bool ( + a BOOL, + b BOOL, + c BOOL +) +WITH (autovacuum_enabled = off); + +INSERT INTO mcv_lists_bool (a, b, c) + SELECT + (mod(i,2) = 0), (mod(i,4) = 0), (mod(i,8) = 0) + FROM generate_series(1,10000) s(i); + +ANALYZE mcv_lists_bool; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE a AND b AND c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND b AND c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND NOT b AND c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND b AND NOT c'); + +CREATE STATISTICS mcv_lists_bool_stats (mcv) ON a, b, c + FROM mcv_lists_bool; + +ANALYZE mcv_lists_bool; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE a AND b AND c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND b AND c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND NOT b AND c'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE NOT a AND b AND NOT c'); + +-- mcv covering just a small fraction of data +CREATE TABLE mcv_lists_partial ( + a INT, + b INT, + c INT +); + +-- 10 frequent groups, each with 100 elements +INSERT INTO mcv_lists_partial (a, b, c) + SELECT + mod(i,10), + mod(i,10), + mod(i,10) + FROM generate_series(0,999) s(i); + +-- 100 groups that will make it to the MCV list (includes the 10 frequent ones) +INSERT INTO mcv_lists_partial (a, b, c) + SELECT + i, + i, + i + FROM generate_series(0,99) s(i); + +-- 4000 groups in total, most of which won't make it (just a single item) +INSERT INTO mcv_lists_partial (a, b, c) + SELECT + i, + i, + i + FROM generate_series(0,3999) s(i); + +ANALYZE mcv_lists_partial; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 AND b = 0 AND c = 0'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 OR b = 0 OR c = 0'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 10 AND b = 10 AND c = 10'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 10 OR b = 10 OR c = 10'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 AND b = 0 AND c = 10'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 OR b = 0 OR c = 10'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE (a = 0 AND b = 0 AND c = 0) OR (a = 1 AND b = 1 AND c = 1) OR (a = 2 AND b = 2 AND c = 2)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE (a = 0 AND b = 0) OR (a = 0 AND c = 0) OR (b = 0 AND c = 0)'); + +CREATE STATISTICS mcv_lists_partial_stats (mcv) ON a, b, c + FROM mcv_lists_partial; + +ANALYZE mcv_lists_partial; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 AND b = 0 AND c = 0'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 OR b = 0 OR c = 0'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 10 AND b = 10 AND c = 10'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 10 OR b = 10 OR c = 10'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 AND b = 0 AND c = 10'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE a = 0 OR b = 0 OR c = 10'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE (a = 0 AND b = 0 AND c = 0) OR (a = 1 AND b = 1 AND c = 1) OR (a = 2 AND b = 2 AND c = 2)'); + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_partial WHERE (a = 0 AND b = 0) OR (a = 0 AND c = 0) OR (b = 0 AND c = 0)'); + +DROP TABLE mcv_lists_partial; + +-- check the ability to use multiple MCV lists +CREATE TABLE mcv_lists_multi ( + a INTEGER, + b INTEGER, + c INTEGER, + d INTEGER +) +WITH (autovacuum_enabled = off); + +INSERT INTO mcv_lists_multi (a, b, c, d) + SELECT + mod(i,5), + mod(i,5), + mod(i,7), + mod(i,7) + FROM generate_series(1,5000) s(i); + +ANALYZE mcv_lists_multi; + +-- estimates without any mcv statistics +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 AND b = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE c = 0 AND d = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE b = 0 AND c = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE b = 0 OR c = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 AND b = 0 AND c = 0 AND d = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE (a = 0 AND b = 0) OR (c = 0 AND d = 0)'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 OR b = 0 OR c = 0 OR d = 0'); + +-- create separate MCV statistics +CREATE STATISTICS mcv_lists_multi_1 (mcv) ON a, b FROM mcv_lists_multi; +CREATE STATISTICS mcv_lists_multi_2 (mcv) ON c, d FROM mcv_lists_multi; + +ANALYZE mcv_lists_multi; + +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 AND b = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE c = 0 AND d = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE b = 0 AND c = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE b = 0 OR c = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 AND b = 0 AND c = 0 AND d = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE (a = 0 AND b = 0) OR (c = 0 AND d = 0)'); +SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_multi WHERE a = 0 OR b = 0 OR c = 0 OR d = 0'); + +DROP TABLE mcv_lists_multi; + + +-- statistics on integer expressions +CREATE TABLE expr_stats (a int, b int, c int); +INSERT INTO expr_stats SELECT mod(i,10), mod(i,10), mod(i,10) FROM generate_series(1,1000) s(i); +ANALYZE expr_stats; + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE (2*a) = 0 AND (3*b) = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE (a+b) = 0 AND (a-b) = 0'); + +CREATE STATISTICS expr_stats_1 (mcv) ON (a+b), (a-b), (2*a), (3*b) FROM expr_stats; +ANALYZE expr_stats; + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE (2*a) = 0 AND (3*b) = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE (a+b) = 0 AND (a-b) = 0'); + +DROP STATISTICS expr_stats_1; +DROP TABLE expr_stats; + +-- statistics on a mix columns and expressions +CREATE TABLE expr_stats (a int, b int, c int); +INSERT INTO expr_stats SELECT mod(i,10), mod(i,10), mod(i,10) FROM generate_series(1,1000) s(i); +ANALYZE expr_stats; + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND (2*a) = 0 AND (3*b) = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 3 AND b = 3 AND (a-b) = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND b = 1 AND (a-b) = 0'); + +CREATE STATISTICS expr_stats_1 (mcv) ON a, b, (2*a), (3*b), (a+b), (a-b) FROM expr_stats; +ANALYZE expr_stats; + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND (2*a) = 0 AND (3*b) = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 3 AND b = 3 AND (a-b) = 0'); +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND b = 1 AND (a-b) = 0'); + +DROP TABLE expr_stats; + +-- statistics on expressions with different data types +CREATE TABLE expr_stats (a int, b name, c text); +INSERT INTO expr_stats SELECT mod(i,10), md5(mod(i,10)::text), md5(mod(i,10)::text) FROM generate_series(1,1000) s(i); +ANALYZE expr_stats; + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND (b || c) <= ''z'' AND (c || b) >= ''0'''); + +CREATE STATISTICS expr_stats_1 (mcv) ON a, b, (b || c), (c || b) FROM expr_stats; +ANALYZE expr_stats; + +SELECT * FROM check_estimated_rows('SELECT * FROM expr_stats WHERE a = 0 AND (b || c) <= ''z'' AND (c || b) >= ''0'''); + +DROP TABLE expr_stats; + +-- test handling of a mix of compatible and incompatible expressions +CREATE TABLE expr_stats_incompatible_test ( + c0 double precision, + c1 boolean NOT NULL +); + +CREATE STATISTICS expr_stat_comp_1 ON c0, c1 FROM expr_stats_incompatible_test; + +INSERT INTO expr_stats_incompatible_test VALUES (1234,false), (5678,true); +ANALYZE expr_stats_incompatible_test; + +SELECT c0 FROM ONLY expr_stats_incompatible_test WHERE +( + upper('x') LIKE ('x'||('[0,1]'::int4range)) + AND + (c0 IN (0, 1) OR c1) +); + +DROP TABLE expr_stats_incompatible_test; + +-- Permission tests. Users should not be able to see specific data values in +-- the extended statistics, if they lack permission to see those values in +-- the underlying table. +-- +-- Currently this is only relevant for MCV stats. +CREATE SCHEMA tststats; + +CREATE TABLE tststats.priv_test_tbl ( + a int, + b int +); + +INSERT INTO tststats.priv_test_tbl + SELECT mod(i,5), mod(i,10) FROM generate_series(1,100) s(i); + +CREATE STATISTICS tststats.priv_test_stats (mcv) ON a, b + FROM tststats.priv_test_tbl; + +ANALYZE tststats.priv_test_tbl; + +-- Check printing info about extended statistics by \dX +create table stts_t1 (a int, b int); +create statistics stts_1 (ndistinct) on a, b from stts_t1; +create statistics stts_2 (ndistinct, dependencies) on a, b from stts_t1; +create statistics stts_3 (ndistinct, dependencies, mcv) on a, b from stts_t1; + +create table stts_t2 (a int, b int, c int); +create statistics stts_4 on b, c from stts_t2; + +create table stts_t3 (col1 int, col2 int, col3 int); +create statistics stts_hoge on col1, col2, col3 from stts_t3; + +create schema stts_s1; +create schema stts_s2; +create statistics stts_s1.stts_foo on col1, col2 from stts_t3; +create statistics stts_s2.stts_yama (dependencies, mcv) on col1, col3 from stts_t3; + +insert into stts_t1 select i,i from generate_series(1,100) i; +analyze stts_t1; +set search_path to public, stts_s1, stts_s2, tststats; + +\dX +\dX stts_? +\dX *stts_hoge +\dX+ +\dX+ stts_? +\dX+ *stts_hoge +\dX+ stts_s2.stts_yama + +set search_path to public, stts_s1; +\dX + +create role regress_stats_ext nosuperuser; +set role regress_stats_ext; +\dX +reset role; + +drop table stts_t1, stts_t2, stts_t3; +drop schema stts_s1, stts_s2 cascade; +drop user regress_stats_ext; +reset search_path; + +-- User with no access +CREATE USER regress_stats_user1; +GRANT USAGE ON SCHEMA tststats TO regress_stats_user1; +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_tbl; -- Permission denied + +-- Attempt to gain access using a leaky operator +CREATE FUNCTION op_leak(int, int) RETURNS bool + AS 'BEGIN RAISE NOTICE ''op_leak => %, %'', $1, $2; RETURN $1 < $2; END' + LANGUAGE plpgsql; +CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, + restrict = scalarltsel); +SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied + +-- Grant access via a security barrier view, but hide all data +RESET SESSION AUTHORIZATION; +CREATE VIEW tststats.priv_test_view WITH (security_barrier=true) + AS SELECT * FROM tststats.priv_test_tbl WHERE false; +GRANT SELECT, DELETE ON tststats.priv_test_view TO regress_stats_user1; + +-- Should now have access via the view, but see nothing and leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak +DELETE FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak + +-- Grant table access, but hide all data with RLS +RESET SESSION AUTHORIZATION; +ALTER TABLE tststats.priv_test_tbl ENABLE ROW LEVEL SECURITY; +GRANT SELECT, DELETE ON tststats.priv_test_tbl TO regress_stats_user1; + +-- Should now have direct table access, but see nothing and leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak + +-- Tidy up +DROP OPERATOR <<< (int, int); +DROP FUNCTION op_leak(int, int); +RESET SESSION AUTHORIZATION; +DROP SCHEMA tststats CASCADE; +DROP USER regress_stats_user1; diff --git a/src/test/singlenode_regress/sql/strings.sql b/src/test/singlenode_regress/sql/strings.sql new file mode 100644 index 00000000000..c53727f68d3 --- /dev/null +++ b/src/test/singlenode_regress/sql/strings.sql @@ -0,0 +1,817 @@ +-- +-- STRINGS +-- Test various data entry syntaxes. +-- + +-- create required tables +CREATE TABLE CHAR_STRINGS_TBL(f1 char(4)); +INSERT INTO CHAR_STRINGS_TBL (f1) VALUES ('a'), +('ab'), +('abcd'), +('abcd '); + +CREATE TABLE VARCHAR_STRINGS_TBL(f1 varchar(4)); +INSERT INTO VARCHAR_STRINGS_TBL (f1) VALUES ('a'), +('ab'), +('abcd'), +('abcd '); + +CREATE TABLE TEXT_STRINGS_TBL (f1 text); +INSERT INTO TEXT_STRINGS_TBL VALUES ('doh!'), +('hi de ho neighbor'); + +-- SQL string continuation syntax +-- E021-03 character string literals +SELECT 'first line' +' - next line' + ' - third line' + AS "Three lines to one"; + +-- illegal string continuation syntax +SELECT 'first line' +' - next line' /* this comment is not allowed here */ +' - third line' + AS "Illegal comment within continuation"; + +-- bytea +SET bytea_output TO hex; +SELECT E'\\xDeAdBeEf'::bytea; +SELECT E'\\x De Ad Be Ef '::bytea; +SELECT E'\\xDeAdBeE'::bytea; +SELECT E'\\xDeAdBeEx'::bytea; +SELECT E'\\xDe00BeEf'::bytea; +SELECT E'DeAdBeEf'::bytea; +SELECT E'De\\000dBeEf'::bytea; +SELECT E'De\123dBeEf'::bytea; +SELECT E'De\\123dBeEf'::bytea; +SELECT E'De\\678dBeEf'::bytea; + +SET bytea_output TO escape; +SELECT E'\\xDeAdBeEf'::bytea; +SELECT E'\\x De Ad Be Ef '::bytea; +SELECT E'\\xDe00BeEf'::bytea; +SELECT E'DeAdBeEf'::bytea; +SELECT E'De\\000dBeEf'::bytea; +SELECT E'De\\123dBeEf'::bytea; + +-- Unicode escapes +SET standard_conforming_strings TO on; + +SELECT U&'d\0061t\+000061' AS U&"d\0061t\+000061"; +SELECT U&'d!0061t\+000061' UESCAPE '!' AS U&"d*0061t\+000061" UESCAPE '*'; +SELECT U&'a\\b' AS "a\b"; + +SELECT U&' \' UESCAPE '!' AS "tricky"; +SELECT 'tricky' AS U&"\" UESCAPE '!'; + +SELECT U&'wrong: \061'; +SELECT U&'wrong: \+0061'; +SELECT U&'wrong: +0061' UESCAPE +; +SELECT U&'wrong: +0061' UESCAPE '+'; + +SELECT U&'wrong: \db99'; +SELECT U&'wrong: \db99xy'; +SELECT U&'wrong: \db99\\'; +SELECT U&'wrong: \db99\0061'; +SELECT U&'wrong: \+00db99\+000061'; +SELECT U&'wrong: \+2FFFFF'; + +-- while we're here, check the same cases in E-style literals +SELECT E'd\u0061t\U00000061' AS "data"; +SELECT E'a\\b' AS "a\b"; +SELECT E'wrong: \u061'; +SELECT E'wrong: \U0061'; +SELECT E'wrong: \udb99'; +SELECT E'wrong: \udb99xy'; +SELECT E'wrong: \udb99\\'; +SELECT E'wrong: \udb99\u0061'; +SELECT E'wrong: \U0000db99\U00000061'; +SELECT E'wrong: \U002FFFFF'; + +SET standard_conforming_strings TO off; + +SELECT U&'d\0061t\+000061' AS U&"d\0061t\+000061"; +SELECT U&'d!0061t\+000061' UESCAPE '!' AS U&"d*0061t\+000061" UESCAPE '*'; + +SELECT U&' \' UESCAPE '!' AS "tricky"; +SELECT 'tricky' AS U&"\" UESCAPE '!'; + +SELECT U&'wrong: \061'; +SELECT U&'wrong: \+0061'; +SELECT U&'wrong: +0061' UESCAPE '+'; + +RESET standard_conforming_strings; + +-- bytea +SET bytea_output TO hex; +SELECT E'\\xDeAdBeEf'::bytea; +SELECT E'\\x De Ad Be Ef '::bytea; +SELECT E'\\xDeAdBeE'::bytea; +SELECT E'\\xDeAdBeEx'::bytea; +SELECT E'\\xDe00BeEf'::bytea; +SELECT E'DeAdBeEf'::bytea; +SELECT E'De\\000dBeEf'::bytea; +SELECT E'De\123dBeEf'::bytea; +SELECT E'De\\123dBeEf'::bytea; +SELECT E'De\\678dBeEf'::bytea; + +SET bytea_output TO escape; +SELECT E'\\xDeAdBeEf'::bytea; +SELECT E'\\x De Ad Be Ef '::bytea; +SELECT E'\\xDe00BeEf'::bytea; +SELECT E'DeAdBeEf'::bytea; +SELECT E'De\\000dBeEf'::bytea; +SELECT E'De\\123dBeEf'::bytea; + +-- +-- test conversions between various string types +-- E021-10 implicit casting among the character data types +-- + +SELECT CAST(f1 AS text) AS "text(char)" FROM CHAR_STRINGS_TBL; + +SELECT CAST(f1 AS text) AS "text(varchar)" FROM VARCHAR_STRINGS_TBL; + +SELECT CAST(name 'namefield' AS text) AS "text(name)"; + +-- since this is an explicit cast, it should truncate w/o error: +SELECT CAST(f1 AS char(10)) AS "char(text)" FROM TEXT_STRINGS_TBL; +-- note: implicit-cast case is tested in char.sql + +SELECT CAST(f1 AS char(20)) AS "char(text)" FROM TEXT_STRINGS_TBL; + +SELECT CAST(f1 AS char(10)) AS "char(varchar)" FROM VARCHAR_STRINGS_TBL; + +SELECT CAST(name 'namefield' AS char(10)) AS "char(name)"; + +SELECT CAST(f1 AS varchar) AS "varchar(text)" FROM TEXT_STRINGS_TBL; + +SELECT CAST(f1 AS varchar) AS "varchar(char)" FROM CHAR_STRINGS_TBL; + +SELECT CAST(name 'namefield' AS varchar) AS "varchar(name)"; + +-- +-- test SQL string functions +-- E### and T### are feature reference numbers from SQL99 +-- + +-- E021-09 trim function +SELECT TRIM(BOTH FROM ' bunch o blanks ') = 'bunch o blanks' AS "bunch o blanks"; + +SELECT TRIM(LEADING FROM ' bunch o blanks ') = 'bunch o blanks ' AS "bunch o blanks "; + +SELECT TRIM(TRAILING FROM ' bunch o blanks ') = ' bunch o blanks' AS " bunch o blanks"; + +SELECT TRIM(BOTH 'x' FROM 'xxxxxsome Xsxxxxx') = 'some Xs' AS "some Xs"; + +-- E021-06 substring expression +SELECT SUBSTRING('1234567890' FROM 3) = '34567890' AS "34567890"; + +SELECT SUBSTRING('1234567890' FROM 4 FOR 3) = '456' AS "456"; + +-- test overflow cases +SELECT SUBSTRING('string' FROM 2 FOR 2147483646) AS "tring"; +SELECT SUBSTRING('string' FROM -10 FOR 2147483646) AS "string"; +SELECT SUBSTRING('string' FROM -10 FOR -2147483646) AS "error"; + +-- T581 regular expression substring (with SQL's bizarre regexp syntax) +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"(b_d)#"%' ESCAPE '#') AS "bcd"; +-- obsolete SQL99 syntax +SELECT SUBSTRING('abcdefg' FROM 'a#"(b_d)#"%' FOR '#') AS "bcd"; + +-- No match should return NULL +SELECT SUBSTRING('abcdefg' SIMILAR '#"(b_d)#"%' ESCAPE '#') IS NULL AS "True"; + +-- Null inputs should return NULL +SELECT SUBSTRING('abcdefg' SIMILAR '%' ESCAPE NULL) IS NULL AS "True"; +SELECT SUBSTRING(NULL SIMILAR '%' ESCAPE '#') IS NULL AS "True"; +SELECT SUBSTRING('abcdefg' SIMILAR NULL ESCAPE '#') IS NULL AS "True"; + +-- The first and last parts should act non-greedy +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%#"g' ESCAPE '#') AS "bcdef"; +SELECT SUBSTRING('abcdefg' SIMILAR 'a*#"%#"g*' ESCAPE '#') AS "abcdefg"; + +-- Vertical bar in any part affects only that part +SELECT SUBSTRING('abcdefg' SIMILAR 'a|b#"%#"g' ESCAPE '#') AS "bcdef"; +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%#"x|g' ESCAPE '#') AS "bcdef"; +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%|ab#"g' ESCAPE '#') AS "bcdef"; + +-- Can't have more than two part separators +SELECT SUBSTRING('abcdefg' SIMILAR 'a*#"%#"g*#"x' ESCAPE '#') AS "error"; + +-- Postgres extension: with 0 or 1 separator, assume parts 1 and 3 are empty +SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%g' ESCAPE '#') AS "bcdefg"; +SELECT SUBSTRING('abcdefg' SIMILAR 'a%g' ESCAPE '#') AS "abcdefg"; + +-- substring() with just two arguments is not allowed by SQL spec; +-- we accept it, but we interpret the pattern as a POSIX regexp not SQL +SELECT SUBSTRING('abcdefg' FROM 'c.e') AS "cde"; + +-- With a parenthesized subexpression, return only what matches the subexpr +SELECT SUBSTRING('abcdefg' FROM 'b(.*)f') AS "cde"; + +-- Check behavior of SIMILAR TO, which uses largely the same regexp variant +SELECT 'abcdefg' SIMILAR TO '_bcd%' AS true; +SELECT 'abcdefg' SIMILAR TO 'bcd%' AS false; +SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '#' AS false; +SELECT 'abcd%' SIMILAR TO '_bcd#%' ESCAPE '#' AS true; +-- Postgres uses '\' as the default escape character, which is not per spec +SELECT 'abcdefg' SIMILAR TO '_bcd\%' AS false; +-- and an empty string to mean "no escape", which is also not per spec +SELECT 'abcd\efg' SIMILAR TO '_bcd\%' ESCAPE '' AS true; +-- these behaviors are per spec, though: +SELECT 'abcdefg' SIMILAR TO '_bcd%' ESCAPE NULL AS null; +SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '##' AS error; + +-- Test back reference in regexp_replace +SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); +SELECT regexp_replace('AAA BBB CCC ', E'\\s+', ' ', 'g'); +SELECT regexp_replace('AAA', '^|$', 'Z', 'g'); +SELECT regexp_replace('AAA aaa', 'A+', 'Z', 'gi'); +-- invalid regexp option +SELECT regexp_replace('AAA aaa', 'A+', 'Z', 'z'); + +-- set so we can tell NULL from empty string +\pset null '\\N' + +-- return all matches from regexp +SELECT regexp_matches('foobarbequebaz', $re$(bar)(beque)$re$); + +-- test case insensitive +SELECT regexp_matches('foObARbEqUEbAz', $re$(bar)(beque)$re$, 'i'); + +-- global option - more than one match +SELECT regexp_matches('foobarbequebazilbarfbonk', $re$(b[^b]+)(b[^b]+)$re$, 'g'); + +-- empty capture group (matched empty string) +SELECT regexp_matches('foobarbequebaz', $re$(bar)(.*)(beque)$re$); +-- no match +SELECT regexp_matches('foobarbequebaz', $re$(bar)(.+)(beque)$re$); +-- optional capture group did not match, null entry in array +SELECT regexp_matches('foobarbequebaz', $re$(bar)(.+)?(beque)$re$); + +-- no capture groups +SELECT regexp_matches('foobarbequebaz', $re$barbeque$re$); + +-- start/end-of-line matches are of zero length +SELECT regexp_matches('foo' || chr(10) || 'bar' || chr(10) || 'bequq' || chr(10) || 'baz', '^', 'mg'); +SELECT regexp_matches('foo' || chr(10) || 'bar' || chr(10) || 'bequq' || chr(10) || 'baz', '$', 'mg'); +SELECT regexp_matches('1' || chr(10) || '2' || chr(10) || '3' || chr(10) || '4' || chr(10), '^.?', 'mg'); +SELECT regexp_matches(chr(10) || '1' || chr(10) || '2' || chr(10) || '3' || chr(10) || '4' || chr(10), '.?$', 'mg'); +SELECT regexp_matches(chr(10) || '1' || chr(10) || '2' || chr(10) || '3' || chr(10) || '4', '.?$', 'mg'); + +-- give me errors +SELECT regexp_matches('foobarbequebaz', $re$(bar)(beque)$re$, 'gz'); +SELECT regexp_matches('foobarbequebaz', $re$(barbeque$re$); +SELECT regexp_matches('foobarbequebaz', $re$(bar)(beque){2,1}$re$); + +-- split string on regexp +SELECT foo, length(foo) FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', $re$\s+$re$) AS foo; +SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', $re$\s+$re$); + +SELECT foo, length(foo) FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', $re$\s*$re$) AS foo; +SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', $re$\s*$re$); +SELECT foo, length(foo) FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', '') AS foo; +SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', ''); +-- case insensitive +SELECT foo, length(foo) FROM regexp_split_to_table('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'i') AS foo; +SELECT regexp_split_to_array('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'i'); +-- no match of pattern +SELECT foo, length(foo) FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', 'nomatch') AS foo; +SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', 'nomatch'); +-- some corner cases +SELECT regexp_split_to_array('123456','1'); +SELECT regexp_split_to_array('123456','6'); +SELECT regexp_split_to_array('123456','.'); +SELECT regexp_split_to_array('123456',''); +SELECT regexp_split_to_array('123456','(?:)'); +SELECT regexp_split_to_array('1',''); +-- errors +SELECT foo, length(foo) FROM regexp_split_to_table('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'zippy') AS foo; +SELECT regexp_split_to_array('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'iz'); +-- global option meaningless for regexp_split +SELECT foo, length(foo) FROM regexp_split_to_table('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'g') AS foo; +SELECT regexp_split_to_array('thE QUick bROWn FOx jUMPs ovEr The lazy dOG', 'e', 'g'); + +-- change NULL-display back +\pset null '' + +-- E021-11 position expression +SELECT POSITION('4' IN '1234567890') = '4' AS "4"; + +SELECT POSITION('5' IN '1234567890') = '5' AS "5"; + +-- T312 character overlay function +SELECT OVERLAY('abcdef' PLACING '45' FROM 4) AS "abc45f"; + +SELECT OVERLAY('yabadoo' PLACING 'daba' FROM 5) AS "yabadaba"; + +SELECT OVERLAY('yabadoo' PLACING 'daba' FROM 5 FOR 0) AS "yabadabadoo"; + +SELECT OVERLAY('babosa' PLACING 'ubb' FROM 2 FOR 4) AS "bubba"; + +-- +-- test LIKE +-- Be sure to form every test as a LIKE/NOT LIKE pair. +-- + +-- simplest examples +-- E061-04 like predicate +SELECT 'hawkeye' LIKE 'h%' AS "true"; +SELECT 'hawkeye' NOT LIKE 'h%' AS "false"; + +SELECT 'hawkeye' LIKE 'H%' AS "false"; +SELECT 'hawkeye' NOT LIKE 'H%' AS "true"; + +SELECT 'hawkeye' LIKE 'indio%' AS "false"; +SELECT 'hawkeye' NOT LIKE 'indio%' AS "true"; + +SELECT 'hawkeye' LIKE 'h%eye' AS "true"; +SELECT 'hawkeye' NOT LIKE 'h%eye' AS "false"; + +SELECT 'indio' LIKE '_ndio' AS "true"; +SELECT 'indio' NOT LIKE '_ndio' AS "false"; + +SELECT 'indio' LIKE 'in__o' AS "true"; +SELECT 'indio' NOT LIKE 'in__o' AS "false"; + +SELECT 'indio' LIKE 'in_o' AS "false"; +SELECT 'indio' NOT LIKE 'in_o' AS "true"; + +SELECT 'abc'::name LIKE '_b_' AS "true"; +SELECT 'abc'::name NOT LIKE '_b_' AS "false"; + +SELECT 'abc'::bytea LIKE '_b_'::bytea AS "true"; +SELECT 'abc'::bytea NOT LIKE '_b_'::bytea AS "false"; + +-- unused escape character +SELECT 'hawkeye' LIKE 'h%' ESCAPE '#' AS "true"; +SELECT 'hawkeye' NOT LIKE 'h%' ESCAPE '#' AS "false"; + +SELECT 'indio' LIKE 'ind_o' ESCAPE '$' AS "true"; +SELECT 'indio' NOT LIKE 'ind_o' ESCAPE '$' AS "false"; + +-- escape character +-- E061-05 like predicate with escape clause +SELECT 'h%' LIKE 'h#%' ESCAPE '#' AS "true"; +SELECT 'h%' NOT LIKE 'h#%' ESCAPE '#' AS "false"; + +SELECT 'h%wkeye' LIKE 'h#%' ESCAPE '#' AS "false"; +SELECT 'h%wkeye' NOT LIKE 'h#%' ESCAPE '#' AS "true"; + +SELECT 'h%wkeye' LIKE 'h#%%' ESCAPE '#' AS "true"; +SELECT 'h%wkeye' NOT LIKE 'h#%%' ESCAPE '#' AS "false"; + +SELECT 'h%awkeye' LIKE 'h#%a%k%e' ESCAPE '#' AS "true"; +SELECT 'h%awkeye' NOT LIKE 'h#%a%k%e' ESCAPE '#' AS "false"; + +SELECT 'indio' LIKE '_ndio' ESCAPE '$' AS "true"; +SELECT 'indio' NOT LIKE '_ndio' ESCAPE '$' AS "false"; + +SELECT 'i_dio' LIKE 'i$_d_o' ESCAPE '$' AS "true"; +SELECT 'i_dio' NOT LIKE 'i$_d_o' ESCAPE '$' AS "false"; + +SELECT 'i_dio' LIKE 'i$_nd_o' ESCAPE '$' AS "false"; +SELECT 'i_dio' NOT LIKE 'i$_nd_o' ESCAPE '$' AS "true"; + +SELECT 'i_dio' LIKE 'i$_d%o' ESCAPE '$' AS "true"; +SELECT 'i_dio' NOT LIKE 'i$_d%o' ESCAPE '$' AS "false"; + +SELECT 'a_c'::bytea LIKE 'a$__'::bytea ESCAPE '$'::bytea AS "true"; +SELECT 'a_c'::bytea NOT LIKE 'a$__'::bytea ESCAPE '$'::bytea AS "false"; + +-- escape character same as pattern character +SELECT 'maca' LIKE 'm%aca' ESCAPE '%' AS "true"; +SELECT 'maca' NOT LIKE 'm%aca' ESCAPE '%' AS "false"; + +SELECT 'ma%a' LIKE 'm%a%%a' ESCAPE '%' AS "true"; +SELECT 'ma%a' NOT LIKE 'm%a%%a' ESCAPE '%' AS "false"; + +SELECT 'bear' LIKE 'b_ear' ESCAPE '_' AS "true"; +SELECT 'bear' NOT LIKE 'b_ear' ESCAPE '_' AS "false"; + +SELECT 'be_r' LIKE 'b_e__r' ESCAPE '_' AS "true"; +SELECT 'be_r' NOT LIKE 'b_e__r' ESCAPE '_' AS "false"; + +SELECT 'be_r' LIKE '__e__r' ESCAPE '_' AS "false"; +SELECT 'be_r' NOT LIKE '__e__r' ESCAPE '_' AS "true"; + + +-- +-- test ILIKE (case-insensitive LIKE) +-- Be sure to form every test as an ILIKE/NOT ILIKE pair. +-- + +SELECT 'hawkeye' ILIKE 'h%' AS "true"; +SELECT 'hawkeye' NOT ILIKE 'h%' AS "false"; + +SELECT 'hawkeye' ILIKE 'H%' AS "true"; +SELECT 'hawkeye' NOT ILIKE 'H%' AS "false"; + +SELECT 'hawkeye' ILIKE 'H%Eye' AS "true"; +SELECT 'hawkeye' NOT ILIKE 'H%Eye' AS "false"; + +SELECT 'Hawkeye' ILIKE 'h%' AS "true"; +SELECT 'Hawkeye' NOT ILIKE 'h%' AS "false"; + +SELECT 'ABC'::name ILIKE '_b_' AS "true"; +SELECT 'ABC'::name NOT ILIKE '_b_' AS "false"; + +-- +-- test %/_ combination cases, cf bugs #4821 and #5478 +-- + +SELECT 'foo' LIKE '_%' as t, 'f' LIKE '_%' as t, '' LIKE '_%' as f; +SELECT 'foo' LIKE '%_' as t, 'f' LIKE '%_' as t, '' LIKE '%_' as f; + +SELECT 'foo' LIKE '__%' as t, 'foo' LIKE '___%' as t, 'foo' LIKE '____%' as f; +SELECT 'foo' LIKE '%__' as t, 'foo' LIKE '%___' as t, 'foo' LIKE '%____' as f; + +SELECT 'jack' LIKE '%____%' AS t; + + +-- +-- basic tests of LIKE with indexes +-- + +CREATE TABLE texttest (a text PRIMARY KEY, b int); +SELECT * FROM texttest WHERE a LIKE '%1%'; + +CREATE TABLE byteatest (a bytea PRIMARY KEY, b int); +SELECT * FROM byteatest WHERE a LIKE '%1%'; + +DROP TABLE texttest, byteatest; + + +-- +-- test implicit type conversion +-- + +-- E021-07 character concatenation +SELECT 'unknown' || ' and unknown' AS "Concat unknown types"; + +SELECT text 'text' || ' and unknown' AS "Concat text to unknown type"; + +SELECT char(20) 'characters' || ' and text' AS "Concat char to unknown type"; + +SELECT text 'text' || char(20) ' and characters' AS "Concat text to char"; + +SELECT text 'text' || varchar ' and varchar' AS "Concat text to varchar"; + +-- +-- test substr with toasted text values +-- +CREATE TABLE toasttest(f1 text); + +insert into toasttest values(repeat('1234567890',10000)); +insert into toasttest values(repeat('1234567890',10000)); + +-- +-- Ensure that some values are uncompressed, to test the faster substring +-- operation used in that case +-- +alter table toasttest alter column f1 set storage external; +insert into toasttest values(repeat('1234567890',10000)); +insert into toasttest values(repeat('1234567890',10000)); + +-- If the starting position is zero or less, then return from the start of the string +-- adjusting the length to be consistent with the "negative start" per SQL. +SELECT substr(f1, -1, 5) from toasttest; + +-- If the length is less than zero, an ERROR is thrown. +SELECT substr(f1, 5, -1) from toasttest; + +-- If no third argument (length) is provided, the length to the end of the +-- string is assumed. +SELECT substr(f1, 99995) from toasttest; + +-- If start plus length is > string length, the result is truncated to +-- string length +SELECT substr(f1, 99995, 10) from toasttest; + +-- GPDB: These tests are sensitive to block size. In GPDB, the block +-- size is 32 kB, whereas in PostgreSQL it's 8kB. Therefore make +-- the data 4x larger here. +TRUNCATE TABLE toasttest; +INSERT INTO toasttest values (repeat('1234567890',300*4)); +INSERT INTO toasttest values (repeat('1234567890',300*4)); +INSERT INTO toasttest values (repeat('1234567890',300*4)); +INSERT INTO toasttest values (repeat('1234567890',300*4)); +-- expect >0 blocks +SELECT pg_relation_size(reltoastrelid) = 0 AS is_empty + FROM pg_class where relname = 'toasttest'; + +TRUNCATE TABLE toasttest; +ALTER TABLE toasttest set (toast_tuple_target = 4080); +INSERT INTO toasttest values (repeat('1234567890',300)); +INSERT INTO toasttest values (repeat('1234567890',300)); +INSERT INTO toasttest values (repeat('1234567890',300)); +INSERT INTO toasttest values (repeat('1234567890',300)); +-- expect 0 blocks +SELECT pg_relation_size(reltoastrelid) = 0 AS is_empty + FROM pg_class where relname = 'toasttest'; + +DROP TABLE toasttest; + +-- +-- test substr with toasted bytea values +-- +CREATE TABLE toasttest(f1 bytea); + +insert into toasttest values("decode"(repeat('1234567890',10000),'escape')); +insert into toasttest values(pg_catalog.decode(repeat('1234567890',10000),'escape')); + +-- +-- Ensure that some values are uncompressed, to test the faster substring +-- operation used in that case +-- +alter table toasttest alter column f1 set storage external; +insert into toasttest values("decode"(repeat('1234567890',10000),'escape')); +insert into toasttest values(pg_catalog.decode(repeat('1234567890',10000),'escape')); + +-- If the starting position is zero or less, then return from the start of the string +-- adjusting the length to be consistent with the "negative start" per SQL. +SELECT substr(f1, -1, 5) from toasttest; + +-- If the length is less than zero, an ERROR is thrown. +SELECT substr(f1, 5, -1) from toasttest; + +-- If no third argument (length) is provided, the length to the end of the +-- string is assumed. +SELECT substr(f1, 99995) from toasttest; + +-- If start plus length is > string length, the result is truncated to +-- string length +SELECT substr(f1, 99995, 10) from toasttest; + +DROP TABLE toasttest; + +-- test internally compressing datums + +-- this tests compressing a datum to a very small size which exercises a +-- corner case in packed-varlena handling: even though small, the compressed +-- datum must be given a 4-byte header because there are no bits to indicate +-- compression in a 1-byte header + +CREATE TABLE toasttest (c char(4096)); +INSERT INTO toasttest VALUES('x'); +SELECT length(c), c::text FROM toasttest; +SELECT c FROM toasttest; +DROP TABLE toasttest; + +-- +-- test length +-- + +SELECT length('abcdef') AS "length_6"; + +-- +-- test strpos +-- + +SELECT strpos('abcdef', 'cd') AS "pos_3"; + +SELECT strpos('abcdef', 'xy') AS "pos_0"; + +SELECT strpos('abcdef', '') AS "pos_1"; + +SELECT strpos('', 'xy') AS "pos_0"; + +SELECT strpos('', '') AS "pos_1"; + +-- +-- test replace +-- +SELECT replace('abcdef', 'de', '45') AS "abc45f"; + +SELECT replace('yabadabadoo', 'ba', '123') AS "ya123da123doo"; + +SELECT replace('yabadoo', 'bad', '') AS "yaoo"; + +-- +-- test split_part +-- +select split_part('','@',1) AS "empty string"; + +select split_part('','@',-1) AS "empty string"; + +select split_part('joeuser@mydatabase','',1) AS "joeuser@mydatabase"; + +select split_part('joeuser@mydatabase','',2) AS "empty string"; + +select split_part('joeuser@mydatabase','',-1) AS "joeuser@mydatabase"; + +select split_part('joeuser@mydatabase','',-2) AS "empty string"; + +select split_part('joeuser@mydatabase','@',0) AS "an error"; + +select split_part('joeuser@mydatabase','@@',1) AS "joeuser@mydatabase"; + +select split_part('joeuser@mydatabase','@@',2) AS "empty string"; + +select split_part('joeuser@mydatabase','@',1) AS "joeuser"; + +select split_part('joeuser@mydatabase','@',2) AS "mydatabase"; + +select split_part('joeuser@mydatabase','@',3) AS "empty string"; + +select split_part('@joeuser@mydatabase@','@',2) AS "joeuser"; + +select split_part('joeuser@mydatabase','@',-1) AS "mydatabase"; + +select split_part('joeuser@mydatabase','@',-2) AS "joeuser"; + +select split_part('joeuser@mydatabase','@',-3) AS "empty string"; + +select split_part('@joeuser@mydatabase@','@',-2) AS "mydatabase"; + +-- +-- test to_hex +-- +select to_hex(256*256*256 - 1) AS "ffffff"; + +select to_hex(256::bigint*256::bigint*256::bigint*256::bigint - 1) AS "ffffffff"; + +-- +-- MD5 test suite - from IETF RFC 1321 +-- (see: ftp://ftp.rfc-editor.org/in-notes/rfc1321.txt) +-- +select md5('') = 'd41d8cd98f00b204e9800998ecf8427e' AS "TRUE"; + +select md5('a') = '0cc175b9c0f1b6a831c399e269772661' AS "TRUE"; + +select md5('abc') = '900150983cd24fb0d6963f7d28e17f72' AS "TRUE"; + +select md5('message digest') = 'f96b697d7cb7938d525a2f31aaf161d0' AS "TRUE"; + +select md5('abcdefghijklmnopqrstuvwxyz') = 'c3fcd3d76192e4007dfb496cca67e13b' AS "TRUE"; + +select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') = 'd174ab98d277d9f5a5611c2c9f419d9f' AS "TRUE"; + +select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890') = '57edf4a22be3c955ac49da2e2107b67a' AS "TRUE"; + +select md5(''::bytea) = 'd41d8cd98f00b204e9800998ecf8427e' AS "TRUE"; + +select md5('a'::bytea) = '0cc175b9c0f1b6a831c399e269772661' AS "TRUE"; + +select md5('abc'::bytea) = '900150983cd24fb0d6963f7d28e17f72' AS "TRUE"; + +select md5('message digest'::bytea) = 'f96b697d7cb7938d525a2f31aaf161d0' AS "TRUE"; + +select md5('abcdefghijklmnopqrstuvwxyz'::bytea) = 'c3fcd3d76192e4007dfb496cca67e13b' AS "TRUE"; + +select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'::bytea) = 'd174ab98d277d9f5a5611c2c9f419d9f' AS "TRUE"; + +select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890'::bytea) = '57edf4a22be3c955ac49da2e2107b67a' AS "TRUE"; + +-- +-- SHA-2 +-- +SET bytea_output TO hex; + +SELECT sha224(''); +SELECT sha224('The quick brown fox jumps over the lazy dog.'); + +SELECT sha256(''); +SELECT sha256('The quick brown fox jumps over the lazy dog.'); + +SELECT sha384(''); +SELECT sha384('The quick brown fox jumps over the lazy dog.'); + +SELECT sha512(''); +SELECT sha512('The quick brown fox jumps over the lazy dog.'); + +-- +-- encode/decode +-- +SELECT encode('\x1234567890abcdef00', 'hex'); +SELECT decode('1234567890abcdef00', 'hex'); +SELECT encode(('\x' || repeat('1234567890abcdef0001', 7))::bytea, 'base64'); +SELECT decode(encode(('\x' || repeat('1234567890abcdef0001', 7))::bytea, + 'base64'), 'base64'); +SELECT encode('\x1234567890abcdef00', 'escape'); +SELECT decode(encode('\x1234567890abcdef00', 'escape'), 'escape'); + +-- +-- get_bit/set_bit etc +-- +SELECT get_bit('\x1234567890abcdef00'::bytea, 43); +SELECT get_bit('\x1234567890abcdef00'::bytea, 99); -- error +SELECT set_bit('\x1234567890abcdef00'::bytea, 43, 0); +SELECT set_bit('\x1234567890abcdef00'::bytea, 99, 0); -- error +SELECT get_byte('\x1234567890abcdef00'::bytea, 3); +SELECT get_byte('\x1234567890abcdef00'::bytea, 99); -- error +SELECT set_byte('\x1234567890abcdef00'::bytea, 7, 11); +SELECT set_byte('\x1234567890abcdef00'::bytea, 99, 11); -- error + +-- +-- test behavior of escape_string_warning and standard_conforming_strings options +-- +set escape_string_warning = off; +set standard_conforming_strings = off; + +show escape_string_warning; +show standard_conforming_strings; + +set escape_string_warning = on; +set standard_conforming_strings = on; + +show escape_string_warning; +show standard_conforming_strings; + +select 'a\bcd' as f1, 'a\b''cd' as f2, 'a\b''''cd' as f3, 'abcd\' as f4, 'ab\''cd' as f5, '\\' as f6; + +set standard_conforming_strings = off; + +select 'a\\bcd' as f1, 'a\\b\'cd' as f2, 'a\\b\'''cd' as f3, 'abcd\\' as f4, 'ab\\\'cd' as f5, '\\\\' as f6; + +set escape_string_warning = off; +set standard_conforming_strings = on; + +select 'a\bcd' as f1, 'a\b''cd' as f2, 'a\b''''cd' as f3, 'abcd\' as f4, 'ab\''cd' as f5, '\\' as f6; + +set standard_conforming_strings = off; + +select 'a\\bcd' as f1, 'a\\b\'cd' as f2, 'a\\b\'''cd' as f3, 'abcd\\' as f4, 'ab\\\'cd' as f5, '\\\\' as f6; + +-- +-- test unicode escape +-- +select E'A\u0041' as f1, E'\u0127' as f2; +select E'\u0000'; +select E'\udsfs'; +select E'\uD843\uE001'; +select E'\uDC01'; +select E'\uD834'; + +reset standard_conforming_strings; + + +-- +-- Additional string functions +-- +SET bytea_output TO escape; + +SELECT initcap('hi THOMAS'); + +SELECT lpad('hi', 5, 'xy'); +SELECT lpad('hi', 5); +SELECT lpad('hi', -5, 'xy'); +SELECT lpad('hello', 2); +SELECT lpad('hi', 5, ''); + +SELECT rpad('hi', 5, 'xy'); +SELECT rpad('hi', 5); +SELECT rpad('hi', -5, 'xy'); +SELECT rpad('hello', 2); +SELECT rpad('hi', 5, ''); + +SELECT ltrim('zzzytrim', 'xyz'); + +SELECT translate('', '14', 'ax'); +SELECT translate('12345', '14', 'ax'); + +SELECT ascii('x'); +SELECT ascii(''); + +SELECT chr(65); +SELECT chr(0); + +SELECT repeat('Pg', 4); +SELECT repeat('Pg', -4); + +SELECT SUBSTRING('1234567890'::bytea FROM 3) "34567890"; +SELECT SUBSTRING('1234567890'::bytea FROM 4 FOR 3) AS "456"; +SELECT SUBSTRING('string'::bytea FROM 2 FOR 2147483646) AS "tring"; +SELECT SUBSTRING('string'::bytea FROM -10 FOR 2147483646) AS "string"; +SELECT SUBSTRING('string'::bytea FROM -10 FOR -2147483646) AS "error"; + +SELECT trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea); +SELECT trim(leading E'\\000'::bytea from E'\\000Tom\\000'::bytea); +SELECT trim(trailing E'\\000'::bytea from E'\\000Tom\\000'::bytea); +SELECT btrim(E'\\000trim\\000'::bytea, E'\\000'::bytea); +SELECT btrim(''::bytea, E'\\000'::bytea); +SELECT btrim(E'\\000trim\\000'::bytea, ''::bytea); +SELECT encode(overlay(E'Th\\000omas'::bytea placing E'Th\\001omas'::bytea from 2),'escape'); +SELECT encode(overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 8),'escape'); +SELECT encode(overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 5 for 3),'escape'); + +SELECT bit_count('\x1234567890'::bytea); + +SELECT unistr('\0064at\+0000610'); +SELECT unistr('d\u0061t\U000000610'); +SELECT unistr('a\\b'); +-- errors: +SELECT unistr('wrong: \db99'); +SELECT unistr('wrong: \db99\0061'); +SELECT unistr('wrong: \+00db99\+000061'); +SELECT unistr('wrong: \+2FFFFF'); +SELECT unistr('wrong: \udb99\u0061'); +SELECT unistr('wrong: \U0000db99\U00000061'); +SELECT unistr('wrong: \U002FFFFF'); +SELECT unistr('wrong: \xyz'); + +-- Clean up GPDB-added tables +DROP TABLE char_strings_tbl; +DROP TABLE varchar_strings_tbl; +DROP TABLE text_strings_tbl; diff --git a/src/test/singlenode_regress/sql/subscription.sql b/src/test/singlenode_regress/sql/subscription.sql new file mode 100644 index 00000000000..855a341a3d9 --- /dev/null +++ b/src/test/singlenode_regress/sql/subscription.sql @@ -0,0 +1,208 @@ +-- +-- SUBSCRIPTION +-- + +CREATE ROLE regress_subscription_user LOGIN SUPERUSER; +CREATE ROLE regress_subscription_user2; +CREATE ROLE regress_subscription_user_dummy LOGIN NOSUPERUSER; +SET SESSION AUTHORIZATION 'regress_subscription_user'; + +-- fail - no publications +CREATE SUBSCRIPTION regress_testsub CONNECTION 'foo'; + +-- fail - no connection +CREATE SUBSCRIPTION regress_testsub PUBLICATION foo; + +-- fail - cannot do CREATE SUBSCRIPTION CREATE SLOT inside transaction block +BEGIN; +CREATE SUBSCRIPTION regress_testsub CONNECTION 'testconn' PUBLICATION testpub WITH (create_slot); +COMMIT; + +-- fail - invalid connection string +CREATE SUBSCRIPTION regress_testsub CONNECTION 'testconn' PUBLICATION testpub; + +-- fail - duplicate publications +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION foo, testpub, foo WITH (connect = false); + +-- ok +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false); + +COMMENT ON SUBSCRIPTION regress_testsub IS 'test subscription'; +SELECT obj_description(s.oid, 'pg_subscription') FROM pg_subscription s; + +-- fail - name already exists +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false); + +-- fail - must be superuser +SET SESSION AUTHORIZATION 'regress_subscription_user2'; +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION foo WITH (connect = false); +SET SESSION AUTHORIZATION 'regress_subscription_user'; + +-- fail - invalid option combinations +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, copy_data = true); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, enabled = true); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, create_slot = true); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = true); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, create_slot = true); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = false); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, create_slot = false); + +-- ok - with slot_name = NONE +CREATE SUBSCRIPTION regress_testsub3 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, connect = false); +-- fail +ALTER SUBSCRIPTION regress_testsub3 ENABLE; +ALTER SUBSCRIPTION regress_testsub3 REFRESH PUBLICATION; + +DROP SUBSCRIPTION regress_testsub3; + +-- fail - invalid connection string +ALTER SUBSCRIPTION regress_testsub CONNECTION 'foobar'; + +\dRs+ + +ALTER SUBSCRIPTION regress_testsub SET PUBLICATION testpub2, testpub3 WITH (refresh = false); +ALTER SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist2'; +ALTER SUBSCRIPTION regress_testsub SET (slot_name = 'newname'); + +-- fail +ALTER SUBSCRIPTION regress_testsub SET (slot_name = ''); + +-- fail +ALTER SUBSCRIPTION regress_doesnotexist CONNECTION 'dbname=regress_doesnotexist2'; +ALTER SUBSCRIPTION regress_testsub SET (create_slot = false); + +\dRs+ + +BEGIN; +ALTER SUBSCRIPTION regress_testsub ENABLE; + +\dRs + +ALTER SUBSCRIPTION regress_testsub DISABLE; + +\dRs + +COMMIT; + +-- fail - must be owner of subscription +SET ROLE regress_subscription_user_dummy; +ALTER SUBSCRIPTION regress_testsub RENAME TO regress_testsub_dummy; +RESET ROLE; + +ALTER SUBSCRIPTION regress_testsub RENAME TO regress_testsub_foo; +ALTER SUBSCRIPTION regress_testsub_foo SET (synchronous_commit = local); +ALTER SUBSCRIPTION regress_testsub_foo SET (synchronous_commit = foobar); + +\dRs+ + +-- rename back to keep the rest simple +ALTER SUBSCRIPTION regress_testsub_foo RENAME TO regress_testsub; + +-- fail - new owner must be superuser +ALTER SUBSCRIPTION regress_testsub OWNER TO regress_subscription_user2; +ALTER ROLE regress_subscription_user2 SUPERUSER; +-- now it works +ALTER SUBSCRIPTION regress_testsub OWNER TO regress_subscription_user2; + +-- fail - cannot do DROP SUBSCRIPTION inside transaction block with slot name +BEGIN; +DROP SUBSCRIPTION regress_testsub; +COMMIT; + +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); + +-- now it works +BEGIN; +DROP SUBSCRIPTION regress_testsub; +COMMIT; + +DROP SUBSCRIPTION IF EXISTS regress_testsub; +DROP SUBSCRIPTION regress_testsub; -- fail + +-- fail - binary must be boolean +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, binary = foo); + +-- now it works +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, binary = true); + +\dRs+ + +ALTER SUBSCRIPTION regress_testsub SET (binary = false); +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); + +\dRs+ + +DROP SUBSCRIPTION regress_testsub; + +-- fail - streaming must be boolean +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = foo); + +-- now it works +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true); + +\dRs+ + +ALTER SUBSCRIPTION regress_testsub SET (streaming = false); +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); + +\dRs+ + +-- fail - publication already exists +ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub WITH (refresh = false); + +-- fail - publication used more than once +ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub1 WITH (refresh = false); + +-- ok - add two publications into subscription +ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false); + +-- fail - publications already exist +ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false); + +\dRs+ + +-- fail - publication used more then once +ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub1 WITH (refresh = false); + +-- fail - all publications are deleted +ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub, testpub1, testpub2 WITH (refresh = false); + +-- fail - publication does not exist in subscription +ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub3 WITH (refresh = false); + +-- ok - delete publications +ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub2 WITH (refresh = false); + +\dRs+ + +DROP SUBSCRIPTION regress_testsub; + +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION mypub + WITH (connect = false, create_slot = false, copy_data = false); + +ALTER SUBSCRIPTION regress_testsub ENABLE; + +-- fail - ALTER SUBSCRIPTION with refresh is not allowed in a transaction +-- block or function +BEGIN; +ALTER SUBSCRIPTION regress_testsub SET PUBLICATION mypub WITH (refresh = true); +END; + +BEGIN; +ALTER SUBSCRIPTION regress_testsub REFRESH PUBLICATION; +END; + +CREATE FUNCTION func() RETURNS VOID AS +$$ ALTER SUBSCRIPTION regress_testsub SET PUBLICATION mypub WITH (refresh = true) $$ LANGUAGE SQL; +SELECT func(); + +ALTER SUBSCRIPTION regress_testsub DISABLE; +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); +DROP SUBSCRIPTION regress_testsub; +DROP FUNCTION func; + +RESET SESSION AUTHORIZATION; +DROP ROLE regress_subscription_user; +DROP ROLE regress_subscription_user2; +DROP ROLE regress_subscription_user_dummy; diff --git a/src/test/singlenode_regress/sql/subselect.sql b/src/test/singlenode_regress/sql/subselect.sql new file mode 100644 index 00000000000..ecf25a42e24 --- /dev/null +++ b/src/test/singlenode_regress/sql/subselect.sql @@ -0,0 +1,986 @@ +-- +-- SUBSELECT +-- + +SELECT 1 AS one WHERE 1 IN (SELECT 1); + +SELECT 1 AS zero WHERE 1 NOT IN (SELECT 1); + +SELECT 1 AS zero WHERE 1 IN (SELECT 2); + +-- Check grammar's handling of extra parens in assorted contexts + +SELECT * FROM (SELECT 1 AS x) ss; +SELECT * FROM ((SELECT 1 AS x)) ss; + +(SELECT 2) UNION SELECT 2; +((SELECT 2)) UNION SELECT 2; + +SELECT ((SELECT 2) UNION SELECT 2); +SELECT (((SELECT 2)) UNION SELECT 2); + +SELECT (SELECT ARRAY[1,2,3])[1]; +SELECT ((SELECT ARRAY[1,2,3]))[2]; +SELECT (((SELECT ARRAY[1,2,3])))[3]; + +-- Set up some simple test tables + +CREATE TABLE SUBSELECT_TBL ( + f1 integer, + f2 integer, + f3 float +); + +INSERT INTO SUBSELECT_TBL VALUES (1, 2, 3); +INSERT INTO SUBSELECT_TBL VALUES (2, 3, 4); +INSERT INTO SUBSELECT_TBL VALUES (3, 4, 5); +INSERT INTO SUBSELECT_TBL VALUES (1, 1, 1); +INSERT INTO SUBSELECT_TBL VALUES (2, 2, 2); +INSERT INTO SUBSELECT_TBL VALUES (3, 3, 3); +INSERT INTO SUBSELECT_TBL VALUES (6, 7, 8); +INSERT INTO SUBSELECT_TBL VALUES (8, 9, NULL); + +SELECT * FROM SUBSELECT_TBL; + +-- Uncorrelated subselects + +SELECT f1 AS "Constant Select" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT 1); + +SELECT f1 AS "Uncorrelated Field" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL); + +SELECT f1 AS "Uncorrelated Field" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL WHERE + f2 IN (SELECT f1 FROM SUBSELECT_TBL)); + +SELECT f1, f2 + FROM SUBSELECT_TBL + WHERE (f1, f2) NOT IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL + WHERE f3 IS NOT NULL); + +-- Correlated subselects + +SELECT f1 AS "Correlated Field", f2 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL WHERE f1 = upper.f1); + +SELECT f1 AS "Correlated Field", f3 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f1 IN + (SELECT f2 FROM SUBSELECT_TBL WHERE CAST(upper.f2 AS float) = f3); + +SELECT f1 AS "Correlated Field", f3 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f3 IN (SELECT upper.f1 + f2 FROM SUBSELECT_TBL + WHERE f2 = CAST(f3 AS integer)); + +SELECT f1 AS "Correlated Field" + FROM SUBSELECT_TBL + WHERE (f1, f2) IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL + WHERE f3 IS NOT NULL); + +-- +-- Use some existing tables in the regression test +-- + +SELECT ss.f1 AS "Correlated Field", ss.f3 AS "Second Field" + FROM SUBSELECT_TBL ss + WHERE f1 NOT IN (SELECT f1+1 FROM INT4_TBL + WHERE f1 != ss.f1 AND f1 < 2147483647); + +select q1, float8(count(*)) / (select count(*) from int8_tbl) +from int8_tbl group by q1 order by q1; + +-- Unspecified-type literals in output columns should resolve as text + +SELECT *, pg_typeof(f1) FROM + (SELECT 'foo' AS f1 FROM generate_series(1,3)) ss ORDER BY 1; + +-- ... unless there's context to suggest differently + +explain (verbose, costs off) select '42' union all select '43'; +explain (verbose, costs off) select '42' union all select 43; + +-- check materialization of an initplan reference (bug #14524) +explain (verbose, costs off) +select 1 = all (select (select 1)); +select 1 = all (select (select 1)); + +-- +-- Check EXISTS simplification with LIMIT +-- +explain (costs off) +select * from int4_tbl o where exists + (select 1 from int4_tbl i where i.f1=o.f1 limit null); +explain (costs off) +select * from int4_tbl o where not exists + (select 1 from int4_tbl i where i.f1=o.f1 limit 1); +explain (costs off) +select * from int4_tbl o where exists + (select 1 from int4_tbl i where i.f1=o.f1 limit 0); + +-- +-- Test cases to catch unpleasant interactions between IN-join processing +-- and subquery pullup. +-- + +select count(*) from + (select 1 from tenk1 a + where unique1 IN (select hundred from tenk1 b)) ss; +select count(distinct ss.ten) from + (select ten from tenk1 a + where unique1 IN (select hundred from tenk1 b)) ss; +select count(*) from + (select 1 from tenk1 a + where unique1 IN (select distinct hundred from tenk1 b)) ss; +select count(distinct ss.ten) from + (select ten from tenk1 a + where unique1 IN (select distinct hundred from tenk1 b)) ss; + +-- +-- Test cases to check for overenthusiastic optimization of +-- "IN (SELECT DISTINCT ...)" and related cases. Per example from +-- Luca Pireddu and Michael Fuhr. +-- + +CREATE TEMP TABLE foo (id integer); +CREATE TEMP TABLE bar (id1 integer, id2 integer); + +INSERT INTO foo VALUES (1); + +INSERT INTO bar VALUES (1, 1); +INSERT INTO bar VALUES (2, 2); +INSERT INTO bar VALUES (3, 1); + +-- These cases require an extra level of distinct-ing above subquery s +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT DISTINCT id1, id2 FROM bar) AS s); +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT id1,id2 FROM bar GROUP BY id1,id2) AS s); +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT id1, id2 FROM bar UNION + SELECT id1, id2 FROM bar) AS s); + +-- These cases do not +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT DISTINCT ON (id2) id1, id2 FROM bar) AS s); +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT id2 FROM bar GROUP BY id2) AS s); +SELECT * FROM foo WHERE id IN + (SELECT id2 FROM (SELECT id2 FROM bar UNION + SELECT id2 FROM bar) AS s); + +-- +-- Test case to catch problems with multiply nested sub-SELECTs not getting +-- recalculated properly. Per bug report from Didier Moens. +-- + +CREATE TABLE orderstest ( + approver_ref integer, + po_ref integer, + ordercanceled boolean +); + +INSERT INTO orderstest VALUES (1, 1, false); +INSERT INTO orderstest VALUES (66, 5, false); +INSERT INTO orderstest VALUES (66, 6, false); +INSERT INTO orderstest VALUES (66, 7, false); +INSERT INTO orderstest VALUES (66, 1, true); +INSERT INTO orderstest VALUES (66, 8, false); +INSERT INTO orderstest VALUES (66, 1, false); +INSERT INTO orderstest VALUES (77, 1, false); +INSERT INTO orderstest VALUES (1, 1, false); +INSERT INTO orderstest VALUES (66, 1, false); +INSERT INTO orderstest VALUES (1, 1, false); + +CREATE VIEW orders_view AS +SELECT *, +(SELECT CASE + WHEN ord.approver_ref=1 THEN '---' ELSE 'Approved' + END) AS "Approved", +(SELECT CASE + WHEN ord.ordercanceled + THEN 'Canceled' + ELSE + (SELECT CASE + WHEN ord.po_ref=1 + THEN + (SELECT CASE + WHEN ord.approver_ref=1 + THEN '---' + ELSE 'Approved' + END) + ELSE 'PO' + END) +END) AS "Status", +(CASE + WHEN ord.ordercanceled + THEN 'Canceled' + ELSE + (CASE + WHEN ord.po_ref=1 + THEN + (CASE + WHEN ord.approver_ref=1 + THEN '---' + ELSE 'Approved' + END) + ELSE 'PO' + END) +END) AS "Status_OK" +FROM orderstest ord; + +SELECT * FROM orders_view; + +DROP TABLE orderstest cascade; + +-- +-- Test cases to catch situations where rule rewriter fails to propagate +-- hasSubLinks flag correctly. Per example from Kyle Bateman. +-- + +create temp table parts ( + partnum text, + cost float8 +); + +create temp table shipped ( + ttype char(2), + ordnum int4, + partnum text, + value float8 +); + +create temp view shipped_view as + select * from shipped where ttype = 'wt'; + +create rule shipped_view_insert as on insert to shipped_view do instead + insert into shipped values('wt', new.ordnum, new.partnum, new.value); + +insert into parts (partnum, cost) values (1, 1234.56); + +insert into shipped_view (ordnum, partnum, value) + values (0, 1, (select cost from parts where partnum = '1')); + +select * from shipped_view; + +create rule shipped_view_update as on update to shipped_view do instead + update shipped set partnum = new.partnum, value = new.value + where ttype = new.ttype and ordnum = new.ordnum; + +update shipped_view set value = 11 + from int4_tbl a join int4_tbl b + on (a.f1 = (select f1 from int4_tbl c where c.f1=b.f1)) + where ordnum = a.f1; + +select * from shipped_view; + +select f1, ss1 as relabel from + (select *, (select sum(f1) from int4_tbl b where f1 >= a.f1) as ss1 + from int4_tbl a) ss; + +-- +-- Test cases involving PARAM_EXEC parameters and min/max index optimizations. +-- Per bug report from David Sanchez i Gregori. +-- + +select * from ( + select max(unique1) from tenk1 as a + where exists (select 1 from tenk1 as b where b.thousand = a.unique2) +) ss; + +select * from ( + select min(unique1) from tenk1 as a + where not exists (select 1 from tenk1 as b where b.unique2 = 10000) +) ss; + +-- +-- Test that an IN implemented using a UniquePath does unique-ification +-- with the right semantics, as per bug #4113. (Unfortunately we have +-- no simple way to ensure that this test case actually chooses that type +-- of plan, but it does in releases 7.4-8.3. Note that an ordering difference +-- here might mean that some other plan type is being used, rendering the test +-- pointless.) +-- + +create temp table numeric_table (num_col numeric); +insert into numeric_table values (1), (1.000000000000000000001), (2), (3); + +create temp table float_table (float_col float8); +insert into float_table values (1), (2), (3); + +select * from float_table + where float_col in (select num_col from numeric_table); + +select * from numeric_table + where num_col in (select float_col from float_table); + +-- +-- Test case for bug #4290: bogus calculation of subplan param sets +-- + +create temp table ta (id int primary key, val int); + +insert into ta values(1,1); +insert into ta values(2,2); + +create temp table tb (id int primary key, aval int); + +insert into tb values(1,1); +insert into tb values(2,1); +insert into tb values(3,2); +insert into tb values(4,2); + +create temp table tc (id int primary key, aid int); + +insert into tc values(1,1); +insert into tc values(2,2); + +select + ( select min(tb.id) from tb + where tb.aval = (select ta.val from ta where ta.id = tc.aid) ) as min_tb_id +from tc; + +-- +-- Test case for 8.3 "failed to locate grouping columns" bug +-- + +create temp table t1 (f1 numeric(14,0), f2 varchar(30)); + +select * from + (select distinct f1, f2, (select f2 from t1 x where x.f1 = up.f1) as fs + from t1 up) ss +group by f1,f2,fs; + +-- +-- Test case for bug #5514 (mishandling of whole-row Vars in subselects) +-- + +create temp table table_a(id integer); +insert into table_a values (42); + +create temp view view_a as select * from table_a; + +select view_a from view_a; +select (select view_a) from view_a; +select (select (select view_a)) from view_a; +select (select (a.*)::text) from view_a a; + +-- +-- Check that whole-row Vars reading the result of a subselect don't include +-- any junk columns therein +-- +-- In GPDB, the ORDER BY in the subquery or CTE doesn't force an ordering +-- for the whole query. Mark these with the "order none" gpdiff directive, +-- so that differences in result order are ignored. +select q from (select max(f1) from int4_tbl group by f1 order by f1) q; -- order none +with q as (select max(f1) from int4_tbl group by f1 order by f1) + select q from q; -- order none + +-- +-- Test case for sublinks pulled up into joinaliasvars lists in an +-- inherited update/delete query +-- + +begin; -- this shouldn't delete anything, but be safe + +delete from road +where exists ( + select 1 + from + int4_tbl cross join + ( select f1, array(select q1 from int8_tbl) as arr + from text_tbl ) ss + where road.name = ss.f1 ); + +rollback; + +-- +-- Test case for sublinks pushed down into subselects via join alias expansion +-- +-- Cloudberry note: This query will only work with ORCA. This type of query +-- was not supported in postgres versions prior to 8.4, and thus was never +-- supported in the planner. After 8.4 versions, the planner works, but +-- the plan it creates is not currently parallel safe. + +select + (select sq1) as qq1 +from + (select exists(select 1 from int4_tbl where f1 = q2) as sq1, 42 as dummy + from int8_tbl) sq0 + join + int4_tbl i4 on dummy = i4.f1; + +-- +-- Test case for subselect within UPDATE of INSERT...ON CONFLICT DO UPDATE +-- +create temp table upsert(key int4 primary key, val text); +insert into upsert values(1, 'val') on conflict (key) do update set val = 'not seen'; +insert into upsert values(1, 'val') on conflict (key) do update set val = 'seen with subselect ' || (select f1 from int4_tbl where f1 != 0 order by f1 limit 1)::text; + +select * from upsert; + +with aa as (select 'int4_tbl' u from int4_tbl limit 1) +insert into upsert values (1, 'x'), (999, 'y') +on conflict (key) do update set val = (select u from aa) +returning *; + +-- +-- Test case for cross-type partial matching in hashed subplan (bug #7597) +-- + +create temp table outer_7597 (f1 int4, f2 int4); +insert into outer_7597 values (0, 0); +insert into outer_7597 values (1, 0); +insert into outer_7597 values (0, null); +insert into outer_7597 values (1, null); + +create temp table inner_7597(c1 int8, c2 int8); +insert into inner_7597 values(0, null); + +select * from outer_7597 where (f1, f2) not in (select * from inner_7597); + +-- +-- Similar test case using text that verifies that collation +-- information is passed through by execTuplesEqual() in nodeSubplan.c +-- (otherwise it would error in texteq()) +-- + +create temp table outer_text (f1 text, f2 text); +insert into outer_text values ('a', 'a'); +insert into outer_text values ('b', 'a'); +insert into outer_text values ('a', null); +insert into outer_text values ('b', null); + +create temp table inner_text (c1 text, c2 text); +insert into inner_text values ('a', null); +insert into inner_text values ('123', '456'); + +select * from outer_text where (f1, f2) not in (select * from inner_text); + +-- +-- Another test case for cross-type hashed subplans: comparison of +-- inner-side values must be done with appropriate operator +-- + +explain (verbose, costs off) +select 'foo'::text in (select 'bar'::name union all select 'bar'::name); + +select 'foo'::text in (select 'bar'::name union all select 'bar'::name); + +-- +-- Test that we don't try to hash nested records (bug #17363) +-- (Hashing could be supported, but for now we don't) +-- + +explain (verbose, costs off) +select row(row(row(1))) = any (select row(row(1))); + +select row(row(row(1))) = any (select row(row(1))); + +-- +-- Test case for premature memory release during hashing of subplan output +-- + +select '1'::text in (select '1'::name union all select '1'::name); + +-- +-- Test that we don't try to use a hashed subplan if the simplified +-- testexpr isn't of the right shape +-- + +-- this fails by default, of course +select * from int8_tbl where q1 in (select c1 from inner_text); + +begin; + +-- make an operator to allow it to succeed +create function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $1::text = $2'; + +create operator = (procedure=bogus_int8_text_eq, leftarg=int8, rightarg=text); + +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); +select * from int8_tbl where q1 in (select c1 from inner_text); + +-- inlining of this function results in unusual number of hash clauses, +-- which we can still cope with +create or replace function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $1::text = $2 and $1::text = $2'; + +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); +select * from int8_tbl where q1 in (select c1 from inner_text); + +-- inlining of this function causes LHS and RHS to be switched, +-- which we can't cope with, so hashing should be abandoned +create or replace function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $2 = $1::text'; + +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); +select * from int8_tbl where q1 in (select c1 from inner_text); + +rollback; -- to get rid of the bogus operator + +-- +-- Test resolution of hashed vs non-hashed implementation of EXISTS subplan +-- +explain (costs off) +select count(*) from tenk1 t +where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0); +select count(*) from tenk1 t +where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0); + +explain (costs off) +select count(*) from tenk1 t +where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0) + and thousand = 1; +select count(*) from tenk1 t +where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0) + and thousand = 1; + +-- It's possible for the same EXISTS to get resolved both ways +create temp table exists_tbl (c1 int, c2 int, c3 int) partition by list (c1); +create temp table exists_tbl_null partition of exists_tbl for values in (null); +create temp table exists_tbl_def partition of exists_tbl default; +insert into exists_tbl select x, x/2, x+1 from generate_series(0,10) x; +analyze exists_tbl; +explain (costs off) +select * from exists_tbl t1 + where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0); +select * from exists_tbl t1 + where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0); + +-- +-- Test case for planner bug with nested EXISTS handling +-- +-- GPDB_92_MERGE_FIXME: ORCA cannot decorrelate this query, and generates +-- correct-but-slow plan that takes 45 minutes. Revisit this when ORCA can +-- reorder anti-joins +set optimizer to off; +select a.thousand from tenk1 a, tenk1 b +where a.thousand = b.thousand + and exists ( select 1 from tenk1 c where b.hundred = c.hundred + and not exists ( select 1 from tenk1 d + where a.thousand = d.thousand ) ); +reset optimizer; + +-- +-- Check that nested sub-selects are not pulled up if they contain volatiles +-- +explain (verbose, costs off) + select x, x from + (select (select current_database()) as x from (values(1),(2)) v(y)) ss; +explain (verbose, costs off) + select x, x from + (select (select random()) as x from (values(1),(2)) v(y)) ss; +explain (verbose, costs off) + select x, x from + (select (select current_database() where y=y) as x from (values(1),(2)) v(y)) ss; +explain (verbose, costs off) + select x, x from + (select (select random() where y=y) as x from (values(1),(2)) v(y)) ss; + +-- +-- Test rescan of a hashed subplan (the use of random() is to prevent the +-- sub-select from being pulled up, which would result in not hashing) +-- +explain (verbose, costs off) +select sum(ss.tst::int) from + onek o cross join lateral ( + select i.ten in (select f1 from int4_tbl where f1 <= o.hundred) as tst, + random() as r + from onek i where i.unique1 = o.unique1 ) ss +where o.ten = 0; + +select sum(ss.tst::int) from + onek o cross join lateral ( + select i.ten in (select f1 from int4_tbl where f1 <= o.hundred) as tst, + random() as r + from onek i where i.unique1 = o.unique1 ) ss +where o.ten = 0; + +-- +-- Test rescan of a SetOp node +-- +explain (costs off) +select count(*) from + onek o cross join lateral ( + select * from onek i1 where i1.unique1 = o.unique1 + except + select * from onek i2 where i2.unique1 = o.unique2 + ) ss +where o.ten = 1; + +select count(*) from + onek o cross join lateral ( + select * from onek i1 where i1.unique1 = o.unique1 + except + select * from onek i2 where i2.unique1 = o.unique2 + ) ss +where o.ten = 1; + +-- +-- Test rescan of a RecursiveUnion node +-- +explain (costs off) +select sum(o.four), sum(ss.a) from + onek o cross join lateral ( + with recursive x(a) as + (select o.four as a + union + select a + 1 from x + where a < 10) + select * from x + ) ss +where o.ten = 1; + +select sum(o.four), sum(ss.a) from + onek o cross join lateral ( + with recursive x(a) as + (select o.four as a + union + select a + 1 from x + where a < 10) + select * from x + ) ss +where o.ten = 1; + +-- +-- Check we don't misoptimize a NOT IN where the subquery returns no rows. +-- +create temp table notinouter (a int); +create temp table notininner (b int not null); +insert into notinouter values (null), (1); + +select * from notinouter where a not in (select b from notininner); + +-- +-- Check we behave sanely in corner case of empty SELECT list (bug #8648) +-- +create temp table nocolumns(); +select exists(select * from nocolumns); + +-- +-- Check behavior with a SubPlan in VALUES (bug #14924) +-- +select val.x + from generate_series(1,10) as s(i), + lateral ( + values ((select s.i + 1)), (s.i + 101) + ) as val(x) +where s.i < 10 and (select val.x) < 110; + +-- another variant of that (bug #16213) +explain (verbose, costs off) +select * from +(values + (3 not in (select * from (values (1), (2)) ss1)), + (false) +) ss; + +select * from +(values + (3 not in (select * from (values (1), (2)) ss1)), + (false) +) ss; + +-- +-- Check sane behavior with nested IN SubLinks +-- GPDB_94_MERGE_FIXME: ORCA plan is correct but very pricy. Should we fallback to planner? +-- +explain (verbose, costs off) +select * from int4_tbl where + (case when f1 in (select unique1 from tenk1 a) then f1 else null end) in + (select ten from tenk1 b); +select * from int4_tbl where + (case when f1 in (select unique1 from tenk1 a) then f1 else null end) in + (select ten from tenk1 b); + +-- +-- Check for incorrect optimization when IN subquery contains a SRF +-- +explain (verbose, costs off) +select * from int4_tbl o where (f1, f1) in + (select f1, generate_series(1,50) / 10 g from int4_tbl i group by f1); +select * from int4_tbl o where (f1, f1) in + (select f1, generate_series(1,50) / 10 g from int4_tbl i group by f1); + +-- +-- check for over-optimization of whole-row Var referencing an Append plan +-- +select (select q from + (select 1,2,3 where f1 > 0 + union all + select 4,5,6.0 where f1 <= 0 + ) q ) +from int4_tbl; + +-- +-- Check for sane handling of a lateral reference in a subquery's quals +-- (most of the complication here is to prevent the test case from being +-- flattened too much) +-- +explain (verbose, costs off) +select * from + int4_tbl i4, + lateral ( + select i4.f1 > 1 as b, 1 as id + from (select random() order by 1) as t1 + union all + select true as b, 2 as id + ) as t2 +where b and f1 >= 0; + +select * from + int4_tbl i4, + lateral ( + select i4.f1 > 1 as b, 1 as id + from (select random() order by 1) as t1 + union all + select true as b, 2 as id + ) as t2 +where b and f1 >= 0; + +-- +-- Check that volatile quals aren't pushed down past a DISTINCT: +-- nextval() should not be called more than the nominal number of times +-- +create temp sequence ts1 cache 1; + +select * from + (select distinct ten from tenk1) ss + where ten < 10 + nextval('ts1') + order by 1; + +select nextval('ts1'); + +-- +-- Check that volatile quals aren't pushed down past a set-returning function; +-- while a nonvolatile qual can be, if it doesn't reference the SRF. +-- +create function tattle(x int, y int) returns bool +volatile language plpgsql as $$ +begin + raise notice 'x = %, y = %', x, y; + return x > y; +end$$; + +explain (verbose, costs off) +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, 8); + +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, 8); + +-- if we pretend it's stable, we get different results: +alter function tattle(x int, y int) stable; + +explain (verbose, costs off) +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, 8); + +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, 8); + +-- although even a stable qual should not be pushed down if it references SRF +explain (verbose, costs off) +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, u); + +select * from + (select 9 as x, unnest(array[1,2,3,11,12,13]) as u) ss + where tattle(x, u); + +drop function tattle(x int, y int); + +set optimizer to off; +-- +-- Test that LIMIT can be pushed to SORT through a subquery that just projects +-- columns. We check for that having happened by looking to see if EXPLAIN +-- ANALYZE shows that a top-N sort was used. We must suppress or filter away +-- all the non-invariant parts of the EXPLAIN ANALYZE output. +-- +-- GPDB_12_MERGE_FIXME: we need to revisit the following test because it is not +-- testing what it advertized in the above comment. Specificly, we don't +-- execute top-N sort for the planner plan. Orca on the other hand never honors +-- ORDER BY in a subquery, as permitted by the SQL spec. Consider rewriting +-- the test using a replicated table so that we get the plan stucture like +-- this: Limit -> Subquery -> Sort +-- +create table sq_limit (pk int primary key, c1 int, c2 int); +insert into sq_limit values + (1, 1, 1), + (2, 2, 2), + (3, 3, 3), + (4, 4, 4), + (5, 1, 1), + (6, 2, 2), + (7, 3, 3), + (8, 4, 4); + +create function explain_sq_limit() returns setof text language plpgsql as +$$ +declare ln text; +begin + for ln in + explain (analyze, summary off, timing off, costs off) + select * from (select pk,c2 from sq_limit order by c1,pk) as x limit 3 + loop + ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); + return next ln; + end loop; +end; +$$; + +select * from explain_sq_limit(); + +-- a subpath is sorted under a subqueryscan. however, the subqueryscan is not. +-- whether the order of subpath can applied to the subqueryscan is up-to-implement. +-- now we do not guarantee the order of subpath can apply to the subqueryscan. +-- so the results of bellow is not stable, so we ignore the results +--start_ignore +select * from (select pk,c2 from sq_limit order by c1,pk) as x limit 3; +--end_ignore +reset optimizer; + +drop function explain_sq_limit(); + +drop table sq_limit; + +-- +-- Ensure that backward scan direction isn't propagated into +-- expression subqueries (bug #15336) +-- + +--start_ignore +begin; + +declare c1 scroll cursor for + select * from generate_series(1,4) i + where i <> all (values (2),(3)); + +move forward all in c1; +fetch backward all in c1; + +commit; +--end_ignore + +-- +-- Tests for CTE inlining behavior +-- + +set gp_cte_sharing to on; + +-- Basic subquery that can be inlined +explain (verbose, costs off) +with x as (select * from (select f1 from subselect_tbl) ss) +select * from x where f1 = 1; + +-- Explicitly request materialization +explain (verbose, costs off) +with x as materialized (select * from (select f1 from subselect_tbl) ss) +select * from x where f1 = 1; + +-- Stable functions are safe to inline +explain (verbose, costs off) +with x as (select * from (select f1, current_database() from subselect_tbl) ss) +select * from x where f1 = 1; + +-- Volatile functions prevent inlining +-- GPDB_12_MERGE_FIXME: inlining happens on GPDB: But the plan seems OK +-- nevertheless. Is the GPDB planner smart, and notices that this is +-- ok to inline, or is it doing something that would be unsafe in more +-- complicated queries? Investigte +explain (verbose, costs off) +with x as (select * from (select f1, random() from subselect_tbl) ss) +select * from x where f1 = 1; + +-- SELECT FOR UPDATE cannot be inlined +-- GPDB: select statement with locking clause is not easy to fully supported +-- in greenplum. The following case even with GDD enabled greenplum will still +-- lock the table in Exclusive Lock and not generate LockRows plan node. +-- For detail, please refer to checkCanOptSelectLockingClause. +explain (verbose, costs off) +with x as (select * from (select f1 from subselect_tbl for update) ss) +select * from x where f1 = 1; + +-- Multiply-referenced CTEs are inlined only when requested +explain (verbose, costs off) +with x as (select * from (select f1, current_database() as n from subselect_tbl) ss) +select * from x, x x2 where x.n = x2.n; + +explain (verbose, costs off) +with x as not materialized (select * from (select f1, current_database() as n from subselect_tbl) ss) +select * from x, x x2 where x.n = x2.n; + +-- Multiply-referenced CTEs can't be inlined if they contain outer self-refs +-- start_ignore +-- GPDB_12_MERGE_FIXME: This currenty produces incorrect results on GPDB. +-- It's not a new issue, but it was exposed by this new upstream test case +-- with the PostgreSQL v12 merge. +-- See https://github.com/greenplum-db/gpdb/issues/10014 +explain (verbose, costs off) +with recursive x(a) as + ((values ('a'), ('b')) + union all + (with z as not materialized (select * from x) + select z.a || z1.a as a from z cross join z as z1 + where length(z.a || z1.a) < 5)) +select * from x; + +with recursive x(a) as + ((values ('a'), ('b')) + union all + (with z as not materialized (select * from x) + select z.a || z1.a as a from z cross join z as z1 + where length(z.a || z1.a) < 5)) +select * from x; +-- end_ignore + +explain (verbose, costs off) +with recursive x(a) as + ((values ('a'), ('b')) + union all + (with z as not materialized (select * from x) + select z.a || z.a as a from z + where length(z.a || z.a) < 5)) +select * from x; + +with recursive x(a) as + ((values ('a'), ('b')) + union all + (with z as not materialized (select * from x) + select z.a || z.a as a from z + where length(z.a || z.a) < 5)) +select * from x; + +-- Check handling of outer references +explain (verbose, costs off) +with x as (select * from int4_tbl) +select * from (with y as (select * from x) select * from y) ss; + +explain (verbose, costs off) +with x as materialized (select * from int4_tbl) +select * from (with y as (select * from x) select * from y) ss; + +-- Ensure that we inline the currect CTE when there are +-- multiple CTEs with the same name +explain (verbose, costs off) +with x as (select 1 as y) +select * from (with x as (select 2 as y) select * from x) ss; + +-- Row marks are not pushed into CTEs +explain (verbose, costs off) +with x as (select * from subselect_tbl) +select * from x for update; + +set gp_cte_sharing to off; diff --git a/src/test/singlenode_regress/sql/subselect_gp.sql b/src/test/singlenode_regress/sql/subselect_gp.sql new file mode 100644 index 00000000000..42fb720a353 --- /dev/null +++ b/src/test/singlenode_regress/sql/subselect_gp.sql @@ -0,0 +1,1192 @@ +-- start_ignore +create schema subselect_gp; +set search_path to subselect_gp, public; +-- end_ignore +set optimizer_enable_master_only_queries = on; +set optimizer_segments = 3; +set optimizer_nestloop_factor = 1.0; + +-- +-- Base tables for CSQ tests +-- + +drop table if exists csq_t1_base; +create table csq_t1_base(x int, y int); + +insert into csq_t1_base values(1,2); +insert into csq_t1_base values(2,1); +insert into csq_t1_base values(4,2); + +drop table if exists csq_t2_base; +create table csq_t2_base(x int, y int); + +insert into csq_t2_base values(3,2); +insert into csq_t2_base values(3,2); +insert into csq_t2_base values(3,2); +insert into csq_t2_base values(3,2); +insert into csq_t2_base values(3,1); + + +-- +-- Correlated subqueries +-- + +drop table if exists csq_t1; +drop table if exists csq_t2; + +create table csq_t1(x int, y int); +create table csq_t2(x int, y int); + +insert into csq_t1 select * from csq_t1_base; +insert into csq_t2 select * from csq_t2_base; + +select * from csq_t1 where csq_t1.x >ALL (select csq_t2.x from csq_t2 where csq_t2.y=csq_t1.y) order by 1; -- expected (4,2) + +-- +-- correlations in the targetlist +-- + +select csq_t1.x, (select sum(bar.x) from csq_t1 bar where bar.x >= csq_t1.x) as sum from csq_t1 order by csq_t1.x; + +select csq_t1.x, (select sum(bar.x) from csq_t1 bar where bar.x = csq_t1.x) as sum from csq_t1 order by csq_t1.x; + +select csq_t1.x, (select bar.x from csq_t1 bar where bar.x = csq_t1.x) as sum from csq_t1 order by csq_t1.x; + +-- +-- CSQs with partitioned tables +-- + +drop table if exists csq_t1; +drop table if exists csq_t2; + +create table csq_t1(x int, y int) + +partition by range (y) ( start (0) end (4) every (1)) +; + +create table csq_t2(x int, y int) + +partition by range (y) ( start (0) end (4) every (1)) +; + +insert into csq_t1 select * from csq_t1_base; +insert into csq_t2 select * from csq_t2_base; + +explain select * from csq_t1 where csq_t1.x >ALL (select csq_t2.x from csq_t2 where csq_t2.y=csq_t1.y) order by 1; + +select * from csq_t1 where csq_t1.x >ALL (select csq_t2.x from csq_t2 where csq_t2.y=csq_t1.y) order by 1; -- expected (4,2) + +drop table if exists csq_t1; +drop table if exists csq_t2; +drop table if exists csq_t1_base; +drop table if exists csq_t2_base; + +-- +-- Multi-row subqueries +-- + +drop table if exists mrs_t1; +create table mrs_t1(x int); + +insert into mrs_t1 select generate_series(1,20); +analyze mrs_t1; + +explain select * from mrs_t1 where exists (select x from mrs_t1 where x < -1); +select * from mrs_t1 where exists (select x from mrs_t1 where x < -1) order by 1; + +explain select * from mrs_t1 where exists (select x from mrs_t1 where x = 1); +select * from mrs_t1 where exists (select x from mrs_t1 where x = 1) order by 1; + +explain select * from mrs_t1 where x in (select x-95 from mrs_t1) or x < 5; +select * from mrs_t1 where x in (select x-95 from mrs_t1) or x < 5 order by 1; + +drop table if exists mrs_t1; + +-- +-- Multi-row subquery from MSTR +-- +drop table if exists mrs_u1; +drop table if exists mrs_u2; + +create TABLE mrs_u1 (a int, b int); +create TABLE mrs_u2 (a int, b int); + +insert into mrs_u1 values (1,2),(11,22); +insert into mrs_u2 values (1,2),(11,22),(33,44); + +select * from mrs_u1 join mrs_u2 on mrs_u1.a=mrs_u2.a where mrs_u1.a in (1,11) or mrs_u2.a in (select a from mrs_u1 where a=1) order by 1; + +drop table if exists mrs_u1; +drop table if exists mrs_u2; + +-- +-- MPP-13758 +-- + +drop table if exists csq_m1; +create table csq_m1(); +set allow_system_table_mods=true; +delete from gp_distribution_policy where localoid='csq_m1'::regclass; +reset allow_system_table_mods; +alter table csq_m1 add column x int; +insert into csq_m1 values(1); +analyze csq_m1; + +drop table if exists csq_d1; +create table csq_d1(x int); +insert into csq_d1 select * from csq_m1; +analyze csq_d1; + +explain select array(select x from csq_m1); -- no initplan +select array(select x from csq_m1); -- {1} + +explain select array(select x from csq_d1); -- initplan +select array(select x from csq_d1); -- {1} + +-- +-- CSQs involving master-only and distributed tables +-- + +drop table if exists t3cozlib; + +create table t3cozlib (c1 int , c2 varchar) with (appendonly=true, compresstype=zlib, orientation=column); + +drop table if exists pg_attribute_storage; + +create table pg_attribute_storage (attrelid int, attnum int, attoptions text[]); + +insert into pg_attribute_storage values ('t3cozlib'::regclass, 1, E'{\'something\'}'); +insert into pg_attribute_storage values ('t3cozlib'::regclass, 2, E'{\'something2\'}'); + +SELECT a.attname +, pg_catalog.format_type(a.atttypid, a.atttypmod) + +, ( SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) + FROM pg_catalog.pg_attrdef d +WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef +) +, a.attnotnull +, a.attnum +, a.attstorage +, pg_catalog.col_description(a.attrelid, a.attnum) +, ( SELECT s.attoptions +FROM pg_attribute_storage s +WHERE s.attrelid = a.attrelid AND s.attnum = a.attnum +) newcolumn + +FROM pg_catalog.pg_attribute a +WHERE a.attrelid = 't3cozlib'::regclass AND a.attnum > 0 AND NOT a.attisdropped +ORDER BY a.attnum +; -- expect to see 2 rows + +-- +-- More CSQs involving master-only and distributed relations +-- + +drop table if exists csq_m1; +create table csq_m1(); +set allow_system_table_mods=true; +delete from gp_distribution_policy where localoid='csq_m1'::regclass; +reset allow_system_table_mods; +alter table csq_m1 add column x int; +insert into csq_m1 values(1),(2),(3); +analyze csq_m1; + +drop table if exists csq_d1; +create table csq_d1(x int); +insert into csq_d1 select * from csq_m1 where x < 3; +insert into csq_d1 values(4); +analyze csq_d1; + +select * from csq_m1; +select * from csq_d1; + +-- +-- outer plan node is master-only and CSQ has distributed relation +-- + +explain select * from csq_m1 where x not in (select x from csq_d1) or x < -100; -- gather motion +select * from csq_m1 where x not in (select x from csq_d1) or x < -100; -- (3) + +-- +-- outer plan node is master-only and CSQ has distributed relation +-- + +explain select * from csq_d1 where x not in (select x from csq_m1) or x < -100; -- broadcast motion +select * from csq_d1 where x not in (select x from csq_m1) or x < -100; -- (4) + +-- drop csq_m1 since we deleted its gp_distribution_policy entry +drop table csq_m1; + +-- +-- MPP-14441 Don't lose track of initplans +-- +drop table if exists csq_t1; +CREATE TABLE csq_t1 (a int, b int, c int, d int, e text); +INSERT INTO csq_t1 SELECT i, i/3, i%2, 100-i, 'text'||i FROM generate_series(1,100) i; + +select count(*) from csq_t1 t1 where a > (SELECT x.b FROM ( select avg(a)::int as b,'haha'::text from csq_t1 t2 where t2.a=t1.d) x ) ; + +select count(*) from csq_t1 t1 where a > ( select avg(a)::int from csq_t1 t2 where t2.a=t1.d) ; + +-- +-- correlation in a func expr +-- +CREATE OR REPLACE FUNCTION csq_f(a int) RETURNS int AS $$ select $1 $$ LANGUAGE SQL CONTAINS SQL; +DROP TABLE IF EXISTS csq_r; +CREATE TABLE csq_r(a int); +INSERT INTO csq_r VALUES (1); + +-- subqueries shouldn't be pulled into a join if the from clause has a function call +-- with a correlated argument + +-- force_explain +explain SELECT * FROM csq_r WHERE a IN (SELECT * FROM csq_f(csq_r.a)); + +SELECT * FROM csq_r WHERE a IN (SELECT * FROM csq_f(csq_r.a)); + +-- force_explain +explain SELECT * FROM csq_r WHERE a not IN (SELECT * FROM csq_f(csq_r.a)); + +SELECT * FROM csq_r WHERE a not IN (SELECT * FROM csq_f(csq_r.a)); + +-- force_explain +explain SELECT * FROM csq_r WHERE exists (SELECT * FROM csq_f(csq_r.a)); + +SELECT * FROM csq_r WHERE exists (SELECT * FROM csq_f(csq_r.a)); + +-- force_explain +explain SELECT * FROM csq_r WHERE not exists (SELECT * FROM csq_f(csq_r.a)); + +SELECT * FROM csq_r WHERE not exists (SELECT * FROM csq_f(csq_r.a)); + +-- force_explain +explain SELECT * FROM csq_r WHERE a > (SELECT csq_f FROM csq_f(csq_r.a) limit 1); + +SELECT * FROM csq_r WHERE a > (SELECT csq_f FROM csq_f(csq_r.a) limit 1); + +-- force_explain +explain SELECT * FROM csq_r WHERE a < ANY (SELECT csq_f FROM csq_f(csq_r.a)); + +SELECT * FROM csq_r WHERE a < ANY (SELECT csq_f FROM csq_f(csq_r.a)); + +-- force_explain +explain SELECT * FROM csq_r WHERE a <= ALL (SELECT csq_f FROM csq_f(csq_r.a)); + +SELECT * FROM csq_r WHERE a <= ALL (SELECT csq_f FROM csq_f(csq_r.a)); + +-- force_explain +explain SELECT * FROM csq_r WHERE a IN (SELECT csq_f FROM csq_f(csq_r.a),csq_r); + +SELECT * FROM csq_r WHERE a IN (SELECT csq_f FROM csq_f(csq_r.a),csq_r); + +-- +-- Test pullup of expr CSQs to joins +-- + +-- +-- Test data +-- + +drop table if exists csq_pullup; +create table csq_pullup(t text, n numeric, i int, v varchar(10)); +insert into csq_pullup values ('abc',1, 2, 'xyz'); +analyze csq_pullup; +insert into csq_pullup values ('xyz',2, 3, 'def'); +insert into csq_pullup values ('def',3, 1, 'abc'); +-- +-- Expr CSQs to joins +-- + +-- +-- text, text +-- + +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t); + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t); + +-- +-- text, varchar +-- + +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.v); + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.v); + +-- +-- numeric, numeric +-- + +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n=t1.n); + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n=t1.n); + +-- +-- function(numeric), function(numeric) +-- + +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + 1=t1.n + 1); + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + 1=t1.n + 1); + + +-- +-- function(numeric), function(int) +-- + +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + 1=t1.i + 1); + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + 1=t1.i + 1); + +-- +-- Test a few cases where pulling up an aggregate subquery is not possible +-- + +-- subquery contains a LIMIT +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t LIMIT 1); + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t LIMIT 1); + +-- subquery contains a HAVING clause +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t HAVING count(*) < 10); + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.t=t1.t HAVING count(*) < 10); + +-- subquery contains quals of form 'function(outervar, innervar1) = innvervar2' +explain select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + t1.n =t1.i); + +select * from csq_pullup t0 where 1= (select count(*) from csq_pullup t1 where t0.n + t1.n =t1.i); + + +-- +-- NOT EXISTS CSQs to joins +-- + +-- +-- text, text +-- + +explain select * from csq_pullup t0 where not exists (select 1 from csq_pullup t1 where t0.t=t1.t and t1.i = 1); + +select * from csq_pullup t0 where not exists (select 1 from csq_pullup t1 where t0.t=t1.t and t1.i = 1); + +-- +-- int, function(int) +-- + +explain select * from csq_pullup t0 where not exists (select 1 from csq_pullup t1 where t0.i=t1.i + 1); + +select * from csq_pullup t0 where not exists (select 1 from csq_pullup t1 where t0.i=t1.i + 1); + +-- +-- wrong results bug MPP-16477 +-- + +drop table if exists subselect_t1; +drop table if exists subselect_t2; + +create table subselect_t1(x int); +insert into subselect_t1 values(1),(2); + +create table subselect_t2(y int); +insert into subselect_t2 values(1),(2),(2); + +analyze subselect_t1; +analyze subselect_t2; + +explain select * from subselect_t1 where x in (select y from subselect_t2); + +select * from subselect_t1 where x in (select y from subselect_t2); + +-- start_ignore +-- Known_opt_diff: MPP-21351 +-- end_ignore +explain select * from subselect_t1 where x in (select y from subselect_t2 union all select y from subselect_t2); + +select * from subselect_t1 where x in (select y from subselect_t2 union all select y from subselect_t2); + +explain select count(*) from subselect_t1 where x in (select y from subselect_t2); + +select count(*) from subselect_t1 where x in (select y from subselect_t2); + +-- start_ignore +-- Known_opt_diff: MPP-21351 +-- end_ignore +explain select count(*) from subselect_t1 where x in (select y from subselect_t2 union all select y from subselect_t2); + +select count(*) from subselect_t1 where x in (select y from subselect_t2 union all select y from subselect_t2); + +select count(*) from + ( select 1 as FIELD_1 union all select 2 as FIELD_1 ) TABLE_1 + where FIELD_1 in ( select 1 as FIELD_1 union all select 1 as FIELD_1 union all select 1 as FIELD_1 ); + +-- +-- Query was deadlocking because of not squelching subplans (MPP-18936) +-- +drop table if exists t1; +drop table if exists t2; +drop table if exists t3; +drop table if exists t4; + +CREATE TABLE t1 AS (SELECT generate_series(1, 5000) AS i, generate_series(5001, 10000) AS j); +CREATE TABLE t2 AS (SELECT * FROM t1 WHERE gp_segment_id = 0); +CREATE TABLE t3 AS (SELECT * FROM t1 WHERE gp_segment_id = 1); +CREATE TABLE t4 (i1 int, i2 int); + +set gp_interconnect_queue_depth=1; + +-- This query was deadlocking on a 2P system +INSERT INTO t4 +( +SELECT t1.i, (SELECT t3.i FROM t3 WHERE t3.i + 1 = t1.i + 1) +FROM t1, t3 +WHERE t1.i = t3.i +) +UNION +( +SELECT t1.i, (SELECT t2.i FROM t2 WHERE t2.i + 1 = t1.i + 1) +FROM t1, t2 +WHERE t1.i = t2.i +); + +drop table if exists t1; +drop table if exists t2; +drop table if exists t3; +drop table if exists t4; + +-- +-- Initplans with no corresponding params should be removed MPP-20600 +-- + +drop table if exists t1; +drop table if exists t2; + +create table t1(a int); +create table t2(b int); + +select * from t1 where a=1 and a=2 and a > (select t2.b from t2); + +explain select * from t1 where a=1 and a=2 and a > (select t2.b from t2); + +explain select * from t1 where a=1 and a=2 and a > (select t2.b from t2) +union all +select * from t1 where a=1 and a=2 and a > (select t2.b from t2); + +select * from t1 where a=1 and a=2 and a > (select t2.b from t2) +union all +select * from t1 where a=1 and a=2 and a > (select t2.b from t2); + +explain select * from t1, +(select * from t1 where a=1 and a=2 and a > (select t2.b from t2)) foo +where t1.a = foo.a; + +select * from t1, +(select * from t1 where a=1 and a=2 and a > (select t2.b from t2)) foo +where t1.a = foo.a; + +-- +-- Correlated subqueries with limit/offset clause must not be pulled up as join +-- +insert into t1 values (1); +insert into t2 values (1); +explain select 1 from t1 where a in (select b from t2 where a = 1 limit 1); +explain select 1 from t1 where a in (select b from t2 where a = 1 offset 1); +select 1 from t1 where a in (select b from t2 where a = 1 limit 1); +select 1 from t1 where a in (select b from t2 where a = 1 offset 1); + +drop table if exists t1; +drop table if exists t2; + +-- +-- Test for a bug we used to have with eliminating InitPlans. The subplan, +-- (select max(content) from y), was eliminated when it shouldn't have been. +-- The query is supposed to return 0 rows, but returned > 0 when the bug was +-- present. +-- +CREATE TABLE initplan_x (i int4, t text); +insert into initplan_x values + (1, 'foobar1'), + (2, 'foobar2'), + (3, 'foobar3'), + (4, 'foobar4'), + (5, 'foobar5'); + +CREATE TABLE initplan_y (content int4); +insert into initplan_y values (5); + +select i, t from initplan_x +except +select g, t from initplan_x, + generate_series(0, (select max(content) from initplan_y)) g +order by 1; + +drop table if exists initplan_x; +drop table if exists initplan_y; + +-- +-- Test Initplans that return multiple params. +-- +create table initplan_test(i int, j int, m int); +insert into initplan_test values (1,1,1); +select * from initplan_test where row(j, m) = (select j, m from initplan_test where i = 1); + +drop table initplan_test; + +-- +-- apply parallelization for subplan MPP-24563 +-- +create table t1_mpp_24563 (id int, value int); +insert into t1_mpp_24563 values (1, 3); + +create table t2_mpp_24563 (id int, value int, seq int); +insert into t2_mpp_24563 values (1, 7, 5); + +explain select row_number() over (order by seq asc) as id, foo.cnt +from +(select seq, (select count(*) from t1_mpp_24563 t1 where t1.id = t2.id) cnt from + t2_mpp_24563 t2 where value = 7) foo; + +drop table t1_mpp_24563; +drop table t2_mpp_24563; + +-- +-- MPP-20470 update the flow of node after parallelizing subplan. +-- +CREATE TABLE t_mpp_20470 ( + col_date timestamp without time zone, + col_name character varying(6), + col_expiry date +) PARTITION BY RANGE(col_date) +( +START ('2013-05-10 00:00:00'::timestamp without time zone) END ('2013-05-11 + 00:00:00'::timestamp without time zone) WITH (tablename='t_mpp_20470_ptr1', appendonly=false ), +START ('2013-05-24 00:00:00'::timestamp without time zone) END ('2013-05-25 + 00:00:00'::timestamp without time zone) WITH (tablename='t_mpp_20470_ptr2', appendonly=false ) +); + +COPY t_mpp_20470 from STDIN delimiter '|' null ''; +2013-05-10 00:00:00|OPTCUR|2013-05-29 +2013-05-10 04:35:20|OPTCUR|2013-05-29 +2013-05-24 03:10:30|FUTCUR|2014-04-28 +2013-05-24 05:32:34|OPTCUR|2013-05-29 +\. + +create view v1_mpp_20470 as +SELECT +CASE + WHEN b.col_name::text = 'FUTCUR'::text + THEN ( SELECT count(a.col_expiry) AS count FROM t_mpp_20470 a WHERE + a.col_name::text = b.col_name::text)::text + ELSE 'Q2'::text END AS cc, 1 AS nn +FROM t_mpp_20470 b; + +explain SELECT cc, sum(nn) over() FROM v1_mpp_20470; + +drop view v1_mpp_20470; +drop table t_mpp_20470; + +create table tbl_25484(id int, num int); +insert into tbl_25484 values(1, 1), (2, 2), (3, 3); +select id from tbl_25484 where 3 = (select 3 where 3 = (select num)); +drop table tbl_25484; +reset optimizer_segments; +reset optimizer_nestloop_factor; + +-- +-- Test case that once triggered a bug in the IN-clause pull-up code. +-- +SELECT p.id + FROM (SELECT * FROM generate_series(1,10) id + WHERE id IN ( + SELECT 1 + UNION ALL + SELECT 0)) p; + +-- +-- Verify another bug in the IN-clause pull-up code. This returned some +-- rows from xsupplier twice, because of a bug in detecting whether a +-- Redistribute node was needed. +-- +CREATE TABLE xlineitem (l_orderkey int4, l_suppkey int4); +insert into xlineitem select g+3, g from generate_series(10,100) g; +insert into xlineitem select g+1, g from generate_series(10,100) g; +insert into xlineitem select g, g from generate_series(10,100) g; + +CREATE TABLE xsupplier (s_suppkey int4, s_name text); +insert into xsupplier select g, 'foo' || g from generate_series(1,10) g; + +select s_name from xsupplier +where s_suppkey in ( + select g.l_suppkey from xlineitem g +) ; + +-- +-- Another case that failed at one point. (A planner bug in pulling up a +-- subquery with constant distribution key, 1, in the outer queries.) +-- +create table nested_in_tbl(tc1 int, tc2 int); +select * from nested_in_tbl t1 where tc1 in + (select 1 from nested_in_tbl t2 where tc1 in + (select 1 from nested_in_tbl t3 where t3.tc2 = t2.tc2)); +drop table nested_in_tbl; + +-- +-- Window query with a function scan that has non-correlated subquery. +-- +SELECT rank() over (partition by min(c) order by min(c)) AS p_rank FROM (SELECT d AS c FROM (values(1)) d1, generate_series(0,(SELECT 2)) AS d) tt GROUP BY c; + +-- +-- Remove unused subplans +-- +create table foo(a int, b int) partition by range(b) (start(1) end(3) every(1)); +create table bar(a int, b int); + +with CT as (select a from foo except select a from bar) +select * from foo +where exists (select 1 from CT where CT.a = foo.a); + +drop table foo; +drop table bar; + +-- +-- Multiple SUBPLAN nodes referring to the same plan_id +-- +CREATE TABLE bar_s (c integer, d character varying(10)); +INSERT INTO bar_s VALUES (9,9); +ANALYZE bar_s; +SELECT * FROM bar_s T1 WHERE c = (SELECT max(c) FROM bar_s T2 WHERE T2.d = T1.d GROUP BY c) AND c < 10; +CREATE TABLE foo_s (a integer, b integer) PARTITION BY RANGE(b) + (PARTITION sub_one START (1) END (10), + PARTITION sub_two START (11) END (22)); +INSERT INTO foo_s VALUES (9,9); +INSERT INTO foo_s VALUES (2,9); +SELECT bar_s.c from bar_s, foo_s WHERE foo_s.a=2 AND foo_s.b = (SELECT max(b) FROM foo_s WHERE bar_s.c = 9); +CREATE TABLE baz_s (i int4); +INSERT INTO baz_s VALUES (9); +ANALYZE baz_s; + +-- In this query, the planner avoids using SubPlan 1 in the qual in the join, +-- because it avoids picking SubPlans from an equivalence class, when it has +-- other choices. +SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz_s WHERE bar_s.c = 9) AND foo_s.b = bar_s.d::int4; + +-- Same as above, but with another subquery, so it must use a SubPlan. There +-- are two references to the same SubPlan in the plan, on different slices. +-- GPDB_96_MERGE_FIXME: this EXPLAIN output should become nicer-looking once we +-- merge upstream commit 4d042999f9, to suppress the SubPlans from being +-- printed twice. +explain SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz_s WHERE bar_s.c = 9) AND foo_s.b = (select bar_s.d::int4); +SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz_s WHERE bar_s.c = 9) AND foo_s.b = (select bar_s.d::int4); + +DROP TABLE bar_s; +DROP TABLE foo_s; +DROP TABLE baz_s; + +-- +-- EXPLAIN tests for queries in subselect.sql to significant plan changes +-- + +-- Set up some simple test tables + +CREATE TABLE SUBSELECT_TBL ( + f1 integer, + f2 integer, + f3 float +); + +INSERT INTO SUBSELECT_TBL VALUES (1, 2, 3); +INSERT INTO SUBSELECT_TBL VALUES (2, 3, 4); +INSERT INTO SUBSELECT_TBL VALUES (3, 4, 5); +INSERT INTO SUBSELECT_TBL VALUES (1, 1, 1); +INSERT INTO SUBSELECT_TBL VALUES (2, 2, 2); +INSERT INTO SUBSELECT_TBL VALUES (3, 3, 3); +INSERT INTO SUBSELECT_TBL VALUES (6, 7, 8); +INSERT INTO SUBSELECT_TBL VALUES (8, 9, NULL); + +ANALYZE SUBSELECT_TBL; + +-- Uncorrelated subselects + +EXPLAIN SELECT '' AS six, f1 AS "Uncorrelated Field" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL) ORDER BY 2; + +EXPLAIN SELECT '' AS six, f1 AS "Uncorrelated Field" FROM SUBSELECT_TBL + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL WHERE + f2 IN (SELECT f1 FROM SUBSELECT_TBL)) ORDER BY 2; + +EXPLAIN SELECT '' AS three, f1, f2 + FROM SUBSELECT_TBL + WHERE (f1, f2) NOT IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL + WHERE f3 IS NOT NULL) ORDER BY 2,3; + +ANALYZE tenk1; +EXPLAIN SELECT * FROM tenk1 a, tenk1 b +WHERE (a.unique1,b.unique2) IN (SELECT unique1,unique2 FROM tenk1 c); + +-- Correlated subselects + +EXPLAIN SELECT '' AS six, f1 AS "Correlated Field", f2 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f1 IN (SELECT f2 FROM SUBSELECT_TBL WHERE f1 = upper.f1) ORDER BY 2,3; + +EXPLAIN SELECT '' AS six, f1 AS "Correlated Field", f3 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f1 IN + (SELECT f2 FROM SUBSELECT_TBL WHERE CAST(upper.f2 AS float) = f3) ORDER BY 2,3; + +EXPLAIN SELECT '' AS six, f1 AS "Correlated Field", f3 AS "Second Field" + FROM SUBSELECT_TBL upper + WHERE f3 IN (SELECT upper.f1 + f2 FROM SUBSELECT_TBL + WHERE f2 = CAST(f3 AS integer)) ORDER BY 2,3; + +EXPLAIN SELECT '' AS five, f1 AS "Correlated Field" + FROM SUBSELECT_TBL + WHERE (f1, f2) IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL + WHERE f3 IS NOT NULL) ORDER BY 2; + +-- +-- Test cases to catch unpleasant interactions between IN-join processing +-- and subquery pullup. +-- + +EXPLAIN select count(*) from + (select 1 from tenk1 a + where unique1 IN (select hundred from tenk1 b)) ss; +EXPLAIN select count(distinct ss.ten) from + (select ten from tenk1 a + where unique1 IN (select hundred from tenk1 b)) ss; +EXPLAIN select count(*) from + (select 1 from tenk1 a + where unique1 IN (select distinct hundred from tenk1 b)) ss; +EXPLAIN select count(distinct ss.ten) from + (select ten from tenk1 a + where unique1 IN (select distinct hundred from tenk1 b)) ss; + +-- +-- In case of simple exists query, planner can generate alternative +-- subplans and choose one of them during execution based on the cost. +-- The below test check that we are generating alternative subplans, +-- we should see 2 subplans in the explain +-- +EXPLAIN SELECT EXISTS(SELECT * FROM tenk1 WHERE tenk1.unique1 = tenk2.unique1) FROM tenk2 LIMIT 1; + +SELECT EXISTS(SELECT * FROM tenk1 WHERE tenk1.unique1 = tenk2.unique1) FROM tenk2 LIMIT 1; + +-- +-- Ensure that NOT is not lost during subquery pull-up +-- +SELECT 1 AS col1 WHERE NOT (SELECT 1 = 1); + +-- +-- Test sane behavior in case of semi join semantics +-- +-- start_ignore +DROP TABLE IF EXISTS dedup_test1; +DROP TABLE IF EXISTS dedup_test2; +DROP TABLE IF EXISTS dedup_test3; +-- end_ignore +CREATE TABLE dedup_test1 ( a int, b int ); +CREATE TABLE dedup_test2 ( e int, f int ); +CREATE TABLE dedup_test3 ( a int, b int, c int) PARTITION BY RANGE(c) (START(1) END(2) EVERY(1)); + +INSERT INTO dedup_test1 select i, i from generate_series(1,4)i; +INSERT INTO dedup_test2 select i, i from generate_series(1,4)i; +INSERT INTO dedup_test3 select 1, 1, 1 from generate_series(1,10); +ANALYZE dedup_test1; +ANALYZE dedup_test2; +ANALYZE dedup_test3; + +EXPLAIN SELECT * FROM dedup_test1 INNER JOIN dedup_test2 ON dedup_test1.a= dedup_test2.e WHERE (a) IN (SELECT a FROM dedup_test3); +SELECT * FROM dedup_test1 INNER JOIN dedup_test2 ON dedup_test1.a= dedup_test2.e WHERE (a) IN (SELECT a FROM dedup_test3); + +-- Test planner to check if it optimizes the join and marks it as a dummy join +EXPLAIN SELECT * FROM dedup_test3, dedup_test1 WHERE c = 7 AND dedup_test3.b IN (SELECT b FROM dedup_test1); +EXPLAIN SELECT * FROM dedup_test3, dedup_test1 WHERE c = 7 AND dedup_test3.b IN (SELECT a FROM dedup_test1); +EXPLAIN SELECT * FROM dedup_test3, dedup_test1 WHERE c = 7 AND EXISTS (SELECT b FROM dedup_test1) AND dedup_test3.b IN (SELECT b FROM dedup_test1); + + +-- More dedup semi-join tests. +create table dedup_tab (a int4) ; +insert into dedup_tab select g from generate_series(1,100) g; +analyze dedup_tab; + +create table dedup_reptab (a int4) ; +insert into dedup_reptab select generate_series(1,1); +analyze dedup_reptab; + +-- Replicated table on the inner side of the join. The replicated table needs +-- be broadcast from a single node to the others, with a unique RowIdExpr +-- tacked on, because even though all the rows are available in all the +-- segments, you cannot distinguish join rows generated by the same "logical" +-- row otherwise. +explain (costs off) +select * from dedup_reptab r where r.a in (select t.a/10 from dedup_tab t); +select * from dedup_reptab r where r.a in (select t.a/10 from dedup_tab t); + +-- Try the same with a General-locus function. In GPDB 6 and below, this +-- generated a plan that did create the same logical row ID on each segment, +-- on the assumption that an immutable function generates the result rows +-- in the same order on all segments. We no longer assume that, and generate +-- the same plan with a broadcast as the case with a replicated table. +-- +-- We have to create a custom function for this, instead of using +-- generate_series() directly, because the rows-estimate for generate_series() +-- is so high that we don't get the plan we want. (After PostgreSQL v12 we +-- could though, because the cost estimation of functions was improved.) +create function dedup_srf() RETURNS SETOF int AS $$ + begin + return query select generate_series(1, 3); + end; +$$ LANGUAGE plpgsql IMMUTABLE ROWS 3; + +create function dedup_srf_stable() RETURNS SETOF int AS $$ + begin + return query select generate_series(1, 3); + end; +$$ LANGUAGE plpgsql STABLE ROWS 3; + +create function dedup_srf_volatile() RETURNS SETOF int AS $$ + begin + return query select generate_series(1, 3); + end; +$$ LANGUAGE plpgsql VOLATILE ROWS 3; + +explain (costs off) +select * from dedup_srf() r(a) where r.a in (select t.a/10 from dedup_tab t); +select * from dedup_srf() r(a) where r.a in (select t.a/10 from dedup_tab t); + +explain (costs off) +select * from dedup_srf_stable() r(a) where r.a in (select t.a/10 from dedup_tab t); +select * from dedup_srf_stable() r(a) where r.a in (select t.a/10 from dedup_tab t); + +explain (costs off) +select * from dedup_srf_volatile() r(a) where r.a in (select t.a/10 from dedup_tab t); +select * from dedup_srf_volatile() r(a) where r.a in (select t.a/10 from dedup_tab t); + +-- Also test it with non-SRFs. In principle, since the function returns exactly +-- one row, no deduplication would be needed in these cases. But the planner +-- doesn't recognize that currently, so you get the same kind of plan as with +-- set-returning functions. +create function dedup_func() RETURNS int AS $$ + select 5; +$$ LANGUAGE SQL IMMUTABLE; +create function dedup_func_stable() RETURNS int AS $$ + select 5; +$$ LANGUAGE SQL STABLE; +create function dedup_func_volatile() RETURNS int AS $$ + select 5; +$$ LANGUAGE SQL VOLATILE; + +explain (costs off) +select * from dedup_func() r(a) where r.a in (select t.a/10 from dedup_tab t); +select * from dedup_func() r(a) where r.a in (select t.a/10 from dedup_tab t); + +explain (costs off) +select * from dedup_func_stable() r(a) where r.a in (select t.a/10 from dedup_tab t); +select * from dedup_func_stable() r(a) where r.a in (select t.a/10 from dedup_tab t); + +explain (costs off) +select * from dedup_func_volatile() r(a) where r.a in (select t.a/10 from dedup_tab t); +select * from dedup_func_volatile() r(a) where r.a in (select t.a/10 from dedup_tab t); + + +-- +-- Test init/main plan are not both parallel +-- +create table init_main_plan_parallel (c1 int, c2 int); +-- case 1: init plan is parallel, main plan is not. +select relname from pg_class where exists(select * from init_main_plan_parallel); +-- case2: init plan is not parallel, main plan is parallel +select * from init_main_plan_parallel where exists (select * from pg_class); + + +-- A subplan whose targetlist might be expanded to make sure all entries of its +-- hashExpr are in its targetlist, test the motion node above it also updated +-- its targetlist, otherwise, a wrong answer or a crash happens. +DROP TABLE IF EXISTS TEST_IN; +CREATE TABLE TEST_IN( + C01 FLOAT, + C02 NUMERIC(10,0) +); + +--insert repeatable records: +INSERT INTO TEST_IN +SELECT + ROUND(RANDOM()*1E1),ROUND(RANDOM()*1E1) +FROM GENERATE_SERIES(1,1E4::BIGINT) I; + +ANALYZE TEST_IN; + +SELECT COUNT(*) FROM +TEST_IN A +WHERE A.C01 IN(SELECT C02 FROM TEST_IN); + +-- +-- Variant of the test in upstream 'subselect' test, for PostgreSQL bug #14924 +-- At one point, this produced wrong results on GPDB for different reasons than +-- the original bug: we forgot to handle the VALUES list in the function to +-- mutate a plan tree (plan_tree_mutator()). +-- +create temp table onerowtmp as select 1; +select val.x + from generate_series(1,10) as s(i), + lateral ( + values ((select s.i + 1 from onerowtmp)), (s.i + 101) + ) as val(x) +where s.i < 10 and val.x < 110; + +-- EXISTS sublink simplication + +drop table if exists simplify_sub; + +create table simplify_sub (i int); +insert into simplify_sub values (1); +insert into simplify_sub values (2); +analyze simplify_sub; + +-- limit n +explain (costs off) +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 1); +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 1); + +explain (costs off) +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 1); +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 1); + +explain (costs off) +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 0); +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 0); + +explain (costs off) +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 0); +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit 0); + +explain (costs off) +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit all); +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit all); + +explain (costs off) +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit all); +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit all); + +explain (costs off) +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit NULL); +select * from simplify_sub t1 where exists (select 1 from simplify_sub t2 where t1.i = t2.i limit NULL); + +explain (costs off) +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit NULL); +select * from simplify_sub t1 where not exists (select 1 from simplify_sub t2 where t1.i = t2.i limit NULL); + +-- aggregates without GROUP BY or HAVING +explain (costs off) +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i); +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i); + +explain (costs off) +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i); +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i); + +explain (costs off) +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 0); +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 0); + +explain (costs off) +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 0); +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 0); + +explain (costs off) +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 1); +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 1); + +explain (costs off) +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 1); +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset 1); + +explain (costs off) +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset NULL); +select * from simplify_sub t1 where exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset NULL); + +explain (costs off) +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset NULL); +select * from simplify_sub t1 where not exists (select sum(t2.i) from simplify_sub t2 where t1.i = t2.i offset NULL); + +drop table if exists simplify_sub; + +-- +-- Test a couple of cases where a SubPlan is used in a Motion's hash key. +-- +create table foo (i int4, j int4); +create table bar (i int4, j int4); +create table baz (i int4, j int4); +insert into foo select g, g from generate_series(1, 10) g; +insert into bar values (1, 1); +insert into baz select g, g from generate_series(5, 100) g; +analyze foo; +analyze bar; +analyze baz; + +explain (verbose, costs off) +select * from foo left outer join baz on (select bar.i from bar where bar.i = foo.i) + 1 = baz.j; +select * from foo left outer join baz on (select bar.i from bar where bar.i = foo.i) + 1 = baz.j; + +-- This is a variant of a query in the upstream 'subselect' test, with the +-- twist that baz.i is the distribution key for the table. In the plan, the +-- CASE WHEN construct with SubPlan is used as Hash Key in the Redistribute +-- Motion. It is a planned as a hashed SubPlan. (We had a bug at one point, +-- where the hashed SubPlan was added to the target list twice, which +-- caused an error at runtime when the executor tried to build the hash +-- table twice, because the Motion in the SubPlan couldn't be rescanned.) +explain (verbose, costs off) +select * from foo where + (case when foo.i in (select a.i from baz a) then foo.i else null end) in + (select b.i from baz b); +select * from foo where + (case when foo.i in (select a.i from baz a) then foo.i else null end) in + (select b.i from baz b); + +-- When creating plan with subquery and CTE, it sets the useless flow for the plan. +-- But we only need flow for the topmost plan and child of the motion. See commit +-- https://github.com/greenplum-db/gpdb/commit/93abe741cd67f04958e2951edff02b45ab6e280f for detail +-- The extra flow will cause subplan set wrong motionType and cause an ERROR +-- unexpected gang size: XX +-- This related to issue: https://github.com/greenplum-db/gpdb/issues/12371 +create table extra_flow_dist(a int, b int, c date); +create table extra_flow_dist1(a int, b int); + +insert into extra_flow_dist select i, i, '1949-10-01'::date from generate_series(1, 10)i; +insert into extra_flow_dist1 select i, i from generate_series(20, 22)i; + +-- case 1 subplan with outer general locus (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below general locus path + ) dt + from (select ( max(1) ) x) a -- general locus +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + +with run_dt as ( + select + ( + select c from extra_flow_dist where b = x + ) dt + from (select ( max(1) ) x) a +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + +create table extra_flow_rand(a int) ; +insert into extra_flow_rand values (1); + +-- case 2 for subplan with outer segment general locus (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below segment general locus path + ) dt + from (select a x from extra_flow_rand) a -- segment general locus +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + +with run_dt as ( + select + ( + select c from extra_flow_dist where b = x + ) dt + from (select a x from extra_flow_rand) a +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + +-- case 3 for subplan with outer entry locus (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below entry locus path + ) dt + from (select 1 x from pg_class limit 1) a -- entry locus +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + +with run_dt as ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below entry locus path + ) dt + from (select 1 x from pg_class limit 1) a -- entry locus +) +select * from run_dt, extra_flow_dist1 +where dt < '2010-01-01'::date; + +-- case 4 subplan with outer segment general locus without param in subplan (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select x, y dt + from (select a x from extra_flow_rand ) a -- segment general locus + left join (select max(1) y) aaa + on a.x > any (select random() from extra_flow_dist) -- subplan's outer is the above segment general locus path +) +select * from run_dt, extra_flow_dist1 +where dt < extra_flow_dist1.a; + +-- case 5 for subplan with outer entry locus without param in subplan (CTE and subquery) +explain (verbose, costs off) with run_dt as ( + select x, y dt + from (select relnatts x from pg_class ) a -- entry locus + left join (select max(1) y) aaa + on a.x > any (select random() from extra_flow_dist) -- subplan's outer is the above entry loucs +) +select * from run_dt, extra_flow_dist1 +where dt < extra_flow_dist1.a; + +-- case 6 without CTE, nested subquery should not add extral flow +explain (verbose, costs off) select * from ( + select dt from ( + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below general locus path + ) dt + from (select ( max(1) ) x) a -- general locus + union + select + ( + select c from extra_flow_dist where b = x -- subplan's outer is the below general locus path + ) dt + from (select ( max(1) ) x) aa -- general locus + ) tbl +) run_dt, +extra_flow_dist1 +where dt < '2010-01-01'::date; + +-- Check DISTINCT ON clause and ORDER BY clause in SubLink, See https://github.com/greenplum-db/gpdb/issues/12656. +-- For EXISTS SubLink, we don’t need to care about the data deduplication problem, we can delete DISTINCT ON clause and +-- ORDER BY clause with confidence, because we only care about whether the data exists. +-- But for ANY SubLink, wo can't do this, because we not only care about the existence of data, but also the content of +-- the data. +create table issue_12656 ( + i int, + j int +); + +insert into issue_12656 values (1, 10001), (1, 10002); + +-- case 1, check basic DISTINCT ON +explain (costs off, verbose) +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656); + +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656); + +-- case 2, check DISTINCT ON and ORDER BY +explain (costs off, verbose) +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656 order by i, j asc); + +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656 order by i, j asc); + +explain (costs off, verbose) +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656 order by i, j desc); + +select * from issue_12656 where (i, j) in (select distinct on (i) i, j from issue_12656 order by i, j desc); diff --git a/src/test/singlenode_regress/sql/subselect_gp2.sql b/src/test/singlenode_regress/sql/subselect_gp2.sql new file mode 100644 index 00000000000..a101c385730 --- /dev/null +++ b/src/test/singlenode_regress/sql/subselect_gp2.sql @@ -0,0 +1,80 @@ +-- Test using an external table in a subquery. +-- +-- We used to have a bug where the scan on the external table was not +-- broadcast to all nodes, so each segment scanned only its own portion +-- of the external table, when the scan was in a subquery. In that case, +-- the count(*) calculated for each value below was 1, but it should be +-- equal to the number of segments, because this external table produces +-- the same rows on every segment. + +CREATE EXTERNAL WEB TABLE echotable (c1 int, c2 int, c3 int) EXECUTE +'echo "1,2,3"; echo "4,5,6";' FORMAT 'TEXT' (DELIMITER ','); + +create table test_ext_foo (c1 int, c2 int4); +insert into test_ext_foo select g, g from generate_series(1, 20) g; + +-- This should return 2 and 5, as the two rows are duplicated in +-- every segment (assuming you have at least two segments in your +-- cluster). +-- We need to change the count since we only have it executed on master. +select c2 from echotable group by c2 having count(*) >= 1; + +select * from test_ext_foo as o +where (select count(*) from echotable as i where i.c2 = o.c2) >= 1; + +-- Planner test to make sure the initplan is not removed for function scan +explain select * from generate_series(1,2) s1 join pg_class on true where s1=(select pg_backend_pid()); + +-- Planner test: constant folding in subplan testexpr produces no error +create table subselect_t1 (a int, b int, c int); +create table subselect_t2 (a int, b int, c int); + +insert into subselect_t1 values (1,1,1); +insert into subselect_t2 values (1,1,1); + +select * from subselect_t1 where NULL in (select c from subselect_t2); +select * from subselect_t1 where NULL in (select c from subselect_t2) and exists (select generate_series(1,2)); + +-- Planner test to make sure initplan is removed when no param is used +select * from subselect_t2 where false and exists (select generate_series(1,2)); + + +-- +-- Test running Init Plans in a query that runs in a function in a QE. +-- Init Plans get special treatment in the QD, for queries that are +-- dispatched. The point of this test is to make sure the Init Plans work +-- correctly when they *don't* need the special treatment, in local queries +-- in QEs. +-- +create temp table datetab (start timestamp, stop timestamp); +insert into datetab values ('2019-01-01', '2019-01-10'); + +-- A function, that contains a query with a subquery that can be turned into +-- an Init Plan. +create or replace function number_of_days(start timestamp, stop timestamp) returns text +as $$ +declare + result text; +begin + result := 'full days: ' || (select count(g) from generate_series(start, stop, '1 day') g)::text; + + return result; +end; +$$ language plpgsql; + +-- Run the function in QEs. +select number_of_days(start, stop) from datetab; + +-- Check delay eager free in squelch functions +CREATE TABLE subselect2_foo (a int, b int); +CREATE TABLE subselect2_bar (c int, d int); +CREATE TABLE subselect2_baz (x int, y int); + +INSERT INTO subselect2_foo VALUES (1,1), (1,2); +INSERT INTO subselect2_bar VALUES (1,1); + +SELECT *, (SELECT x FROM subselect2_baz EXCEPT SELECT c FROM subselect2_bar WHERE d = a) FROM subselect2_foo; + + + + diff --git a/src/test/singlenode_regress/sql/sysviews.sql b/src/test/singlenode_regress/sql/sysviews.sql new file mode 100644 index 00000000000..c686d2620e7 --- /dev/null +++ b/src/test/singlenode_regress/sql/sysviews.sql @@ -0,0 +1,65 @@ +-- +-- Test assorted system views +-- +-- This test is mainly meant to provide some code coverage for the +-- set-returning functions that underlie certain system views. +-- The output of most of these functions is very environment-dependent, +-- so our ability to test with fixed expected output is pretty limited; +-- but even a trivial check of count(*) will exercise the normal code path +-- through the SRF. + +select count(*) >= 0 as ok from pg_available_extension_versions; + +select count(*) >= 0 as ok from pg_available_extensions; + +-- The entire output of pg_backend_memory_contexts is not stable, +-- we test only the existance and basic condition of TopMemoryContext. +select name, ident, parent, level, total_bytes >= free_bytes + from pg_backend_memory_contexts where level = 0; + +-- At introduction, pg_config had 23 entries; it may grow +select count(*) > 20 as ok from pg_config; + +-- We expect no cursors in this test; see also portals.sql +select count(*) = 0 as ok from pg_cursors; + +select count(*) >= 0 as ok from pg_file_settings; + +-- There will surely be at least one rule +select count(*) > 0 as ok from pg_hba_file_rules; + +-- There will surely be at least one active lock +select count(*) > 0 as ok from pg_locks; + +-- We expect no prepared statements in this test; see also prepare.sql +select count(*) = 0 as ok from pg_prepared_statements; + +-- See also prepared_xacts.sql +select count(*) >= 0 as ok from pg_prepared_xacts; + +-- There will surely be at least one SLRU cache +select count(*) > 0 as ok from pg_stat_slru; + +-- There must be only one record +select count(*) = 1 as ok from pg_stat_wal; + +-- We expect no walreceiver running in this test +select count(*) = 0 as ok from pg_stat_wal_receiver; + +-- This is to record the prevailing planner enable_foo settings during +-- a regression test run. +select name, setting from pg_settings where name like 'enable%' and name != 'enable_parallel'; + +-- Test that the pg_timezone_names and pg_timezone_abbrevs views are +-- more-or-less working. We can't test their contents in any great detail +-- without the outputs changing anytime IANA updates the underlying data, +-- but it seems reasonable to expect at least one entry per major meridian. +-- (At the time of writing, the actual counts are around 38 because of +-- zones using fractional GMT offsets, so this is a pretty loose test.) +select count(distinct utc_offset) >= 24 as ok from pg_timezone_names; +select count(distinct utc_offset) >= 24 as ok from pg_timezone_abbrevs; +-- Let's check the non-default timezone abbreviation sets, too +set timezone_abbreviations = 'Australia'; +select count(distinct utc_offset) >= 24 as ok from pg_timezone_abbrevs; +set timezone_abbreviations = 'India'; +select count(distinct utc_offset) >= 24 as ok from pg_timezone_abbrevs; diff --git a/src/test/singlenode_regress/sql/tablesample.sql b/src/test/singlenode_regress/sql/tablesample.sql new file mode 100644 index 00000000000..b1da41bcf50 --- /dev/null +++ b/src/test/singlenode_regress/sql/tablesample.sql @@ -0,0 +1,160 @@ +CREATE TABLE test_tablesample (dist int, id int, name text) WITH (fillfactor=10); +-- use fillfactor so we don't have to load too much data to get multiple pages + +-- Changed the column length in order to match the expected results based on relation's blocksz +INSERT INTO test_tablesample SELECT 0, i, repeat(i::text, 875) FROM generate_series(0, 9) s(i) ORDER BY i; +INSERT INTO test_tablesample SELECT 3, i, repeat(i::text, 875) FROM generate_series(10, 19) s(i) ORDER BY i; +INSERT INTO test_tablesample SELECT 5, i, repeat(i::text, 875) FROM generate_series(20, 29) s(i) ORDER BY i; + +-- Verify that each segment has the same amount of rows; +SELECT gp_segment_id, count(dist) FROM test_tablesample GROUP BY 1 ORDER BY 1; + +SELECT t.id FROM test_tablesample AS t TABLESAMPLE SYSTEM (50) REPEATABLE (0); +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (100.0/11) REPEATABLE (0); +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0); +SELECT id FROM test_tablesample TABLESAMPLE BERNOULLI (50) REPEATABLE (0); +SELECT id FROM test_tablesample TABLESAMPLE BERNOULLI (5.5) REPEATABLE (0); + +-- 100% should give repeatable count results (ie, all rows) in any case +SELECT count(*) FROM test_tablesample TABLESAMPLE SYSTEM (100); +SELECT count(*) FROM test_tablesample TABLESAMPLE SYSTEM (100) REPEATABLE (1+2); +SELECT count(*) FROM test_tablesample TABLESAMPLE SYSTEM (100) REPEATABLE (0.4); + +CREATE VIEW test_tablesample_v1 AS + SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (10*2) REPEATABLE (2); +CREATE VIEW test_tablesample_v2 AS + SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (99); +\d+ test_tablesample_v1 +\d+ test_tablesample_v2 + +-- check a sampled query doesn't affect cursor in progress +BEGIN; +DECLARE tablesample_cur CURSOR FOR + SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; + +FETCH FIRST FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0); + +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +-- Cloudberry: Going backwards on cursors is not supported. By closing the +-- cursor and starting again we pass the tests and keep the file closer to +-- upstream. We do test the rescan methods of tablesample afterwards. +CLOSE tablesample_cur; +DECLARE tablesample_cur CURSOR FOR SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0) ORDER BY id; +FETCH FIRST FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; +FETCH NEXT FROM tablesample_cur; + +CLOSE tablesample_cur; +END; + +EXPLAIN (COSTS OFF) + SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (2); +EXPLAIN (COSTS OFF) + SELECT * FROM test_tablesample_v1; + +-- check inheritance behavior +explain (costs off) + select count(*) from person tablesample bernoulli (100); +select count(*) from person tablesample bernoulli (100); +select count(*) from person; + +-- check that collations get assigned within the tablesample arguments +SELECT count(*) FROM test_tablesample TABLESAMPLE bernoulli (('1'::text < '0'::text)::int); + +-- Cloudberry: Test rescan paths by forcing a nested loop +CREATE TABLE ttr1 (a int, b int); +CREATE TABLE ttr2 (a int, b int); +INSERT INTO ttr1 VALUES (1, 1), (12, 1), (31, 1), (NULL, NULL); +INSERT INTO ttr2 VALUES (1, 2), (12, 2), (31, 2), (NULL, 6); +ANALYZE ttr1; +ANALYZE ttr2; +SET enable_hashjoin TO OFF; +SET enable_mergejoin TO OFF; +SET enable_nestloop TO ON; + +EXPLAIN (COSTS OFF) SELECT * FROM ttr1 TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2 TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1.a = ttr2.a; +SELECT * FROM ttr1 TABLESAMPLE BERNOULLI (50) REPEATABLE (1), ttr2 TABLESAMPLE BERNOULLI (50) REPEATABLE (1) WHERE ttr1.a = ttr2.a; +EXPLAIN (COSTS OFF) SELECT * FROM ttr1 TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2 TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1.a = ttr2.a; +SELECT * FROM ttr1 TABLESAMPLE SYSTEM (50) REPEATABLE (1), ttr2 TABLESAMPLE SYSTEM (50) REPEATABLE (1) WHERE ttr1.a = ttr2.a; + +RESET enable_hashjoin; +RESET enable_mergejoin; +RESET enable_nestloop; + +-- check behavior during rescans, as well as correct handling of min/max pct +-- Cloudberry: does not support laterals completely, rescan specific tests above +-- start_ignore +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample bernoulli (pct)) ss; +select * from + (values (0),(100)) v(pct), + lateral (select count(*) from tenk1 tablesample system (pct)) ss; +explain (costs off) +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample bernoulli (pct)) ss + group by pct; +select pct, count(unique1) from + (values (0),(100)) v(pct), + lateral (select * from tenk1 tablesample system (pct)) ss + group by pct; +-- end_ignore + +-- Cloudberry: we do have to test min/max pct tests though +select 0 as pct, count(*) from tenk1 tablesample bernoulli (0) +union all +select 100 as pct, count(*) from tenk1 tablesample bernoulli (100); + +select 0 as pct, count(*) from tenk1 tablesample system (0) +union all +select 100 as pct, count(*) from tenk1 tablesample system (100); + +select 0 as pct, count(unique1) from tenk1 tablesample bernoulli (0) +union all +select 100 as pct, count(unique1) from tenk1 tablesample bernoulli (100); + +select 0 as pct, count(unique1) from tenk1 tablesample system (0) +union all +select 100 as pct, count(unique1) from tenk1 tablesample system (100); + +-- errors +SELECT id FROM test_tablesample TABLESAMPLE FOOBAR (1); + +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (NULL); +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (NULL); + +SELECT id FROM test_tablesample TABLESAMPLE BERNOULLI (-1); +SELECT id FROM test_tablesample TABLESAMPLE BERNOULLI (200); +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (-1); +SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (200); + +SELECT id FROM test_tablesample_v1 TABLESAMPLE BERNOULLI (1); +INSERT INTO test_tablesample_v1 VALUES(1); + +WITH query_select AS (SELECT * FROM test_tablesample) +SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEATABLE (1); + +SELECT q.* FROM (SELECT * FROM test_tablesample) as q TABLESAMPLE BERNOULLI (5); + +-- check partitioned tables support tablesample +create table parted_sample (a int) partition by list (a); +create table parted_sample_1 partition of parted_sample for values in (1); +create table parted_sample_2 partition of parted_sample for values in (2); +explain (costs off) + select * from parted_sample tablesample bernoulli (100); +drop table parted_sample, parted_sample_1, parted_sample_2; diff --git a/src/test/singlenode_regress/sql/temp.sql b/src/test/singlenode_regress/sql/temp.sql new file mode 100644 index 00000000000..6c037f4c58e --- /dev/null +++ b/src/test/singlenode_regress/sql/temp.sql @@ -0,0 +1,307 @@ +-- +-- TEMP +-- Test temp relations and indexes +-- + +-- test temp table/index masking + +CREATE TABLE temptest(col int); + +CREATE INDEX i_temptest ON temptest(col); + +CREATE TEMP TABLE temptest(tcol int); + +CREATE INDEX i_temptest ON temptest(tcol); + +SELECT * FROM temptest; + +DROP INDEX i_temptest; + +DROP TABLE temptest; + +SELECT * FROM temptest; + +DROP INDEX i_temptest; + +DROP TABLE temptest; + +-- test temp table selects + +CREATE TABLE temptest(col int); + +INSERT INTO temptest VALUES (1); + +CREATE TEMP TABLE temptest(tcol float); + +INSERT INTO temptest VALUES (2.1); + +SELECT * FROM temptest; + +DROP TABLE temptest; + +SELECT * FROM temptest; + +DROP TABLE temptest; + +-- test temp table deletion + +CREATE TEMP TABLE temptest(col int); + +\c + +SELECT * FROM temptest; + +-- Test ON COMMIT DELETE ROWS + +CREATE TEMP TABLE temptest(col int) ON COMMIT DELETE ROWS; + +-- while we're here, verify successful truncation of index with SQL function +CREATE INDEX ON temptest(bit_length('')); + +BEGIN; +INSERT INTO temptest VALUES (1); +INSERT INTO temptest VALUES (2); + +SELECT * FROM temptest; +COMMIT; + +SELECT * FROM temptest; + +DROP TABLE temptest; + +BEGIN; +CREATE TEMP TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1; + +SELECT * FROM temptest; +COMMIT; + +SELECT * FROM temptest; + +DROP TABLE temptest; + +-- Test ON COMMIT DROP + +BEGIN; + +CREATE TEMP TABLE temptest(col int) ON COMMIT DROP; + +INSERT INTO temptest VALUES (1); +INSERT INTO temptest VALUES (2); + +SELECT * FROM temptest; +COMMIT; + +SELECT * FROM temptest; + +BEGIN; +CREATE TEMP TABLE temptest(col) ON COMMIT DROP AS SELECT 1; + +SELECT * FROM temptest; +COMMIT; + +SELECT * FROM temptest; + +-- ON COMMIT is only allowed for TEMP + +CREATE TABLE temptest(col int) ON COMMIT DELETE ROWS; +CREATE TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1; + +-- Test foreign keys +BEGIN; +CREATE TEMP TABLE temptest1(col int PRIMARY KEY); +CREATE TEMP TABLE temptest2(col int REFERENCES temptest1) + ON COMMIT DELETE ROWS; +INSERT INTO temptest1 VALUES (1); +INSERT INTO temptest2 VALUES (1); +COMMIT; +SELECT * FROM temptest1; +SELECT * FROM temptest2; + +BEGIN; +CREATE TEMP TABLE temptest3(col int PRIMARY KEY) ON COMMIT DELETE ROWS; +CREATE TEMP TABLE temptest4(col int REFERENCES temptest3); +COMMIT; + +-- Test manipulation of temp schema's placement in search path + +create table public.whereami (f1 text); +insert into public.whereami values ('public'); + +create temp table whereami (f1 text); +insert into whereami values ('temp'); + +create function public.whoami() returns text + as $$select 'public'::text$$ language sql; + +create function pg_temp.whoami() returns text + as $$select 'temp'::text$$ language sql; + +-- default should have pg_temp implicitly first, but only for tables +select * from whereami; +select whoami(); + +-- can list temp first explicitly, but it still doesn't affect functions +set search_path = pg_temp, public; +select * from whereami; +select whoami(); + +-- or put it last for security +set search_path = public, pg_temp; +select * from whereami; +select whoami(); + +-- you can invoke a temp function explicitly, though +select pg_temp.whoami(); + +drop table public.whereami; + +-- types in temp schema +set search_path = pg_temp, public; +create domain pg_temp.nonempty as text check (value <> ''); +-- function-syntax invocation of types matches rules for functions +select nonempty(''); +select pg_temp.nonempty(''); +-- other syntax matches rules for tables +select ''::nonempty; + +reset search_path; + +-- For partitioned temp tables, ON COMMIT actions ignore storage-less +-- partitioned tables. +begin; +create temp table temp_parted_oncommit (a int) + partition by list (a) on commit delete rows; +create temp table temp_parted_oncommit_1 + partition of temp_parted_oncommit + for values in (1) on commit delete rows; +insert into temp_parted_oncommit values (1); +commit; +-- partitions are emptied by the previous commit +select * from temp_parted_oncommit; +drop table temp_parted_oncommit; + +-- Check dependencies between ON COMMIT actions with a partitioned +-- table and its partitions. Using ON COMMIT DROP on a parent removes +-- the whole set. +begin; +create temp table temp_parted_oncommit_test (a int) + partition by list (a) on commit drop; +create temp table temp_parted_oncommit_test1 + partition of temp_parted_oncommit_test + for values in (1) on commit delete rows; +create temp table temp_parted_oncommit_test2 + partition of temp_parted_oncommit_test + for values in (2) on commit drop; +insert into temp_parted_oncommit_test values (1), (2); +commit; +-- no relations remain in this case. +select relname from pg_class where relname ~ '^temp_parted_oncommit_test'; +-- Using ON COMMIT DELETE on a partitioned table does not remove +-- all rows if partitions preserve their data. +begin; +create temp table temp_parted_oncommit_test (a int) + partition by list (a) on commit delete rows; +create temp table temp_parted_oncommit_test1 + partition of temp_parted_oncommit_test + for values in (1) on commit preserve rows; +create temp table temp_parted_oncommit_test2 + partition of temp_parted_oncommit_test + for values in (2) on commit drop; +insert into temp_parted_oncommit_test values (1), (2); +commit; +-- Data from the remaining partition is still here as its rows are +-- preserved. +select * from temp_parted_oncommit_test; +-- two relations remain in this case. +select relname from pg_class where relname ~ '^temp_parted_oncommit_test' + order by relname; +drop table temp_parted_oncommit_test; + +-- Check dependencies between ON COMMIT actions with inheritance trees. +-- Using ON COMMIT DROP on a parent removes the whole set. +begin; +create temp table temp_inh_oncommit_test (a int) on commit drop; +create temp table temp_inh_oncommit_test1 () + inherits(temp_inh_oncommit_test) on commit delete rows; +insert into temp_inh_oncommit_test1 values (1); +commit; +-- no relations remain in this case +select relname from pg_class where relname ~ '^temp_inh_oncommit_test'; +-- Data on the parent is removed, and the child goes away. +begin; +create temp table temp_inh_oncommit_test (a int) on commit delete rows; +create temp table temp_inh_oncommit_test1 () + inherits(temp_inh_oncommit_test) on commit drop; +insert into temp_inh_oncommit_test1 values (1); +insert into temp_inh_oncommit_test values (1); +commit; +select * from temp_inh_oncommit_test; +-- one relation remains +select relname from pg_class where relname ~ '^temp_inh_oncommit_test'; +drop table temp_inh_oncommit_test; + +-- Tests with two-phase commit +-- Transactions creating objects in a temporary namespace cannot be used +-- with two-phase commit. + +-- These cases generate errors about temporary namespace. +-- Function creation +begin; +create function pg_temp.twophase_func() returns void as + $$ select '2pc_func'::text $$ language sql; +prepare transaction 'twophase_func'; +rollback; -- PREPARE TRANACTION is not supported in GPDB +-- Function drop +create function pg_temp.twophase_func() returns void as + $$ select '2pc_func'::text $$ language sql; +begin; +drop function pg_temp.twophase_func(); +prepare transaction 'twophase_func'; +rollback; -- PREPARE TRANACTION is not supported in GPDB +-- Operator creation +begin; +create operator pg_temp.@@ (leftarg = int4, rightarg = int4, procedure = int4mi); +prepare transaction 'twophase_operator'; +rollback; -- PREPARE TRANACTION is not supported in GPDB + +-- These generate errors about temporary tables. +begin; +create type pg_temp.twophase_type as (a int); +prepare transaction 'twophase_type'; +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +create view pg_temp.twophase_view as select 1; +prepare transaction 'twophase_view'; +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +create sequence pg_temp.twophase_seq; +prepare transaction 'twophase_sequence'; +rollback; -- PREPARE TRANACTION is not supported in GPDB + +-- Temporary tables cannot be used with two-phase commit. +create temp table twophase_tab (a int); +begin; +select a from twophase_tab; +prepare transaction 'twophase_tab'; +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +insert into twophase_tab values (1); +prepare transaction 'twophase_tab'; +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +lock twophase_tab in access exclusive mode; +prepare transaction 'twophase_tab'; +rollback; -- PREPARE TRANACTION is not supported in GPDB +begin; +drop table twophase_tab; +prepare transaction 'twophase_tab'; +rollback; -- PREPARE TRANACTION is not supported in GPDB + +-- Corner case: current_schema may create a temporary schema if namespace +-- creation is pending, so check after that. First reset the connection +-- to remove the temporary namespace. +\c - +SET search_path TO 'pg_temp'; +BEGIN; +SELECT current_schema() ~ 'pg_temp' AS is_temp_schema; +PREPARE TRANSACTION 'twophase_search'; diff --git a/src/test/singlenode_regress/sql/text.sql b/src/test/singlenode_regress/sql/text.sql new file mode 100644 index 00000000000..56eee69abc6 --- /dev/null +++ b/src/test/singlenode_regress/sql/text.sql @@ -0,0 +1,118 @@ +-- +-- TEXT +-- + +SELECT text 'this is a text string' = text 'this is a text string' AS true; + +SELECT text 'this is a text string' = text 'this is a text strin' AS false; + +CREATE TABLE TEXT_TBL (f1 text); + +INSERT INTO TEXT_TBL VALUES ('doh!'); +INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor'); + +SELECT * FROM TEXT_TBL; + +-- As of 8.3 we have removed most implicit casts to text, so that for example +-- this no longer works: + +select length(42); + +-- But as a special exception for usability's sake, we still allow implicit +-- casting to text in concatenations, so long as the other input is text or +-- an unknown literal. So these work: + +select 'four: '::text || 2+2; +select 'four: ' || 2+2; + +-- but not this: + +select 3 || 4.0; + +/* + * various string functions + */ +select concat('one'); +select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); +select concat_ws('#','one'); +select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); +select concat_ws(',',10,20,null,30); +select concat_ws('',10,20,null,30); +select concat_ws(NULL,10,20,null,30) is null; +select reverse('abcde'); +select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i; +select quote_literal(''); +select quote_literal('abc'''); +select quote_literal(e'\\'); +-- check variadic labeled argument +select concat(variadic array[1,2,3]); +select concat_ws(',', variadic array[1,2,3]); +select concat_ws(',', variadic NULL::int[]); +select concat(variadic NULL::int[]) is NULL; +select concat(variadic '{}'::int[]) = ''; +--should fail +select concat_ws(',', variadic 10); + +/* + * format + */ +select format(NULL); +select format('Hello'); +select format('Hello %s', 'World'); +select format('Hello %%'); +select format('Hello %%%%'); +-- should fail +select format('Hello %s %s', 'World'); +select format('Hello %s'); +select format('Hello %x', 20); +-- check literal and sql identifiers +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello'); +select format('%s%s%s','Hello', NULL,'World'); +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL); +select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello'); +-- should fail, sql identifier cannot be NULL +select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello'); +-- check positional placeholders +select format('%1$s %3$s', 1, 2, 3); +select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); +-- should fail +select format('%1$s %4$s', 1, 2, 3); +select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); +select format('%0$s', 'Hello'); +select format('%*0$s', 'Hello'); +select format('%1$', 1); +select format('%1$1', 1); +-- check mix of positional and ordered placeholders +select format('Hello %s %1$s %s', 'World', 'Hello again'); +select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); +-- check variadic labeled arguments +select format('%s, %s', variadic array['Hello','World']); +select format('%s, %s', variadic array[1, 2]); +select format('%s, %s', variadic array[true, false]); +select format('%s, %s', variadic array[true, false]::text[]); +-- check variadic with positional placeholders +select format('%2$s, %1$s', variadic array['first', 'second']); +select format('%2$s, %1$s', variadic array[1, 2]); +-- variadic argument can be array type NULL, but should not be referenced +select format('Hello', variadic NULL::int[]); +-- variadic argument allows simulating more than FUNC_MAX_ARGS parameters +select format(string_agg('%s',','), variadic array_agg(i)) +from generate_series(1,200) g(i); +-- check field widths and left, right alignment +select format('>>%10s<<', 'Hello'); +select format('>>%10s<<', NULL); +select format('>>%10s<<', ''); +select format('>>%-10s<<', ''); +select format('>>%-10s<<', 'Hello'); +select format('>>%-10s<<', NULL); +select format('>>%1$10s<<', 'Hello'); +select format('>>%1$-10I<<', 'Hello'); +select format('>>%2$*1$L<<', 10, 'Hello'); +select format('>>%2$*1$L<<', 10, NULL); +select format('>>%2$*1$L<<', -10, NULL); +select format('>>%*s<<', 10, 'Hello'); +select format('>>%*1$s<<', 10, 'Hello'); +select format('>>%-s<<', 'Hello'); +select format('>>%10L<<', NULL); +select format('>>%2$*1$L<<', NULL, 'Hello'); +select format('>>%2$*1$L<<', 0, 'Hello'); diff --git a/src/test/singlenode_regress/sql/tid.sql b/src/test/singlenode_regress/sql/tid.sql new file mode 100644 index 00000000000..3bc92b25d9e --- /dev/null +++ b/src/test/singlenode_regress/sql/tid.sql @@ -0,0 +1,55 @@ +-- tests for functions related to TID handling + +CREATE TABLE tid_tab (a int); + +-- min() and max() for TIDs +INSERT INTO tid_tab VALUES (1), (2); +SELECT min(ctid) FROM tid_tab; +SELECT max(ctid) FROM tid_tab; +TRUNCATE tid_tab; + +-- currtid2 is not supported in GPDB +-- Tests for currtid2() with various relation kinds + +-- Materialized view +CREATE MATERIALIZED VIEW tid_matview AS SELECT a FROM tid_tab; +SELECT currtid2('tid_matview'::text, '(0,1)'::tid); -- fails +INSERT INTO tid_tab VALUES (1); +REFRESH MATERIALIZED VIEW tid_matview; +SELECT currtid2('tid_matview'::text, '(0,1)'::tid); -- ok +DROP MATERIALIZED VIEW tid_matview; +TRUNCATE tid_tab; + +-- Sequence +CREATE SEQUENCE tid_seq; +SELECT currtid2('tid_seq'::text, '(0,1)'::tid); -- ok +DROP SEQUENCE tid_seq; + +-- Index, fails with incorrect relation type +CREATE INDEX tid_ind ON tid_tab(a); +SELECT currtid2('tid_ind'::text, '(0,1)'::tid); -- fails +DROP INDEX tid_ind; + +-- Partitioned table, no storage +CREATE TABLE tid_part (a int) PARTITION BY RANGE (a); +SELECT currtid2('tid_part'::text, '(0,1)'::tid); -- fails +DROP TABLE tid_part; + +-- Views +-- ctid not defined in the view +CREATE VIEW tid_view_no_ctid AS SELECT a FROM tid_tab; +SELECT currtid2('tid_view_no_ctid'::text, '(0,1)'::tid); -- fails +DROP VIEW tid_view_no_ctid; +-- ctid fetched directly from the source table. +CREATE VIEW tid_view_with_ctid AS SELECT ctid, a FROM tid_tab; +SELECT currtid2('tid_view_with_ctid'::text, '(0,1)'::tid); -- fails +INSERT INTO tid_tab VALUES (1); +SELECT currtid2('tid_view_with_ctid'::text, '(0,1)'::tid); -- ok +DROP VIEW tid_view_with_ctid; +TRUNCATE tid_tab; +-- ctid attribute with incorrect data type +CREATE VIEW tid_view_fake_ctid AS SELECT 1 AS ctid, 2 AS a; +SELECT currtid2('tid_view_fake_ctid'::text, '(0,1)'::tid); -- fails +DROP VIEW tid_view_fake_ctid; + +DROP TABLE tid_tab CASCADE; diff --git a/src/test/singlenode_regress/sql/tidrangescan.sql b/src/test/singlenode_regress/sql/tidrangescan.sql new file mode 100644 index 00000000000..1418e64079e --- /dev/null +++ b/src/test/singlenode_regress/sql/tidrangescan.sql @@ -0,0 +1,105 @@ +-- tests for tidrangescans +SET enable_seqscan TO off; +CREATE TABLE tidrangescan(id integer, data text); + +-- empty table +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid < '(1, 0)'; +SELECT ctid FROM tidrangescan WHERE ctid < '(1, 0)'; + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid > '(9, 0)'; +SELECT ctid FROM tidrangescan WHERE ctid > '(9, 0)'; + +-- insert enough tuples to fill at least two pages +INSERT INTO tidrangescan SELECT i,repeat('x', 100) FROM generate_series(1,2400) AS s(i); + +-- remove all tuples after the 10th tuple on each page. Trying to ensure +-- we get the same layout with all CPU architectures and smaller than standard +-- page sizes. +DELETE FROM tidrangescan +WHERE substring(ctid::text FROM ',(\d+)\)')::integer > 10 OR substring(ctid::text FROM '\((\d+),')::integer > 2; +VACUUM tidrangescan; + +-- range scans with upper bound +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid < '(1,0)'; +SELECT ctid FROM tidrangescan WHERE ctid < '(1,0)'; + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid <= '(1,5)'; +SELECT ctid FROM tidrangescan WHERE ctid <= '(1,5)'; + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid < '(0,0)'; +SELECT ctid FROM tidrangescan WHERE ctid < '(0,0)'; + +-- range scans with lower bound +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid > '(2,8)'; +SELECT ctid FROM tidrangescan WHERE ctid > '(2,8)'; + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE '(2,8)' < ctid; +SELECT ctid FROM tidrangescan WHERE '(2,8)' < ctid; + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid >= '(2,8)'; +SELECT ctid FROM tidrangescan WHERE ctid >= '(2,8)'; + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid >= '(100,0)'; +SELECT ctid FROM tidrangescan WHERE ctid >= '(100,0)'; + +-- range scans with both bounds +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE ctid > '(1,4)' AND '(1,7)' >= ctid; +SELECT ctid FROM tidrangescan WHERE ctid > '(1,4)' AND '(1,7)' >= ctid; + +EXPLAIN (COSTS OFF) +SELECT ctid FROM tidrangescan WHERE '(1,7)' >= ctid AND ctid > '(1,4)'; +SELECT ctid FROM tidrangescan WHERE '(1,7)' >= ctid AND ctid > '(1,4)'; + +-- extreme offsets +SELECT ctid FROM tidrangescan WHERE ctid > '(0,65535)' AND ctid < '(1,0)' LIMIT 1; +SELECT ctid FROM tidrangescan WHERE ctid < '(0,0)' LIMIT 1; + +SELECT ctid FROM tidrangescan WHERE ctid > '(4294967295,65535)'; +SELECT ctid FROM tidrangescan WHERE ctid < '(0,0)'; + +-- NULLs in the range cannot return tuples +SELECT ctid FROM tidrangescan WHERE ctid >= (SELECT NULL::tid); + +-- rescans +EXPLAIN (COSTS OFF) +SELECT t.ctid,t2.c FROM tidrangescan t, +LATERAL (SELECT count(*) c FROM tidrangescan t2 WHERE t2.ctid <= t.ctid) t2 +WHERE t.ctid < '(1,0)'; + +SELECT t.ctid,t2.c FROM tidrangescan t, +LATERAL (SELECT count(*) c FROM tidrangescan t2 WHERE t2.ctid <= t.ctid) t2 +WHERE t.ctid < '(1,0)'; + +-- cursors + +-- Ensure we get a TID Range scan without a Materialize node. +EXPLAIN (COSTS OFF) +DECLARE c SCROLL CURSOR FOR SELECT ctid FROM tidrangescan WHERE ctid < '(1,0)'; + +BEGIN; +DECLARE c SCROLL CURSOR FOR SELECT ctid FROM tidrangescan WHERE ctid < '(1,0)'; +FETCH NEXT c; +FETCH NEXT c; +--start_ignore +/* backward scan is not supported in this version of Cloudberry Database */ +/* +FETCH PRIOR c; +FETCH FIRST c; +FETCH LAST c; +*/ +--end_ignore +COMMIT; + +DROP TABLE tidrangescan; + +RESET enable_seqscan; diff --git a/src/test/singlenode_regress/sql/tidscan.sql b/src/test/singlenode_regress/sql/tidscan.sql new file mode 100644 index 00000000000..de3e955f032 --- /dev/null +++ b/src/test/singlenode_regress/sql/tidscan.sql @@ -0,0 +1,105 @@ +-- tests for tidscans + +CREATE TABLE tidscan(id integer); + +-- only insert a few rows, we don't want to spill onto a second table page +INSERT INTO tidscan VALUES (1), (2), (3); + +-- show ctids +SELECT ctid, * FROM tidscan; + +-- ctid equality - implemented as tidscan +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE ctid = '(0,1)'; +SELECT ctid, * FROM tidscan WHERE ctid = '(0,1)'; + +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE '(0,1)' = ctid; +SELECT ctid, * FROM tidscan WHERE '(0,1)' = ctid; + +-- OR'd clauses +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE ctid = '(0,2)' OR '(0,1)' = ctid; +SELECT ctid, * FROM tidscan WHERE ctid = '(0,2)' OR '(0,1)' = ctid; + +-- ctid = ScalarArrayOp - implemented as tidscan +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE ctid = ANY(ARRAY['(0,1)', '(0,2)']::tid[]); +SELECT ctid, * FROM tidscan WHERE ctid = ANY(ARRAY['(0,1)', '(0,2)']::tid[]); + +-- ctid != ScalarArrayOp - can't be implemented as tidscan +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan WHERE ctid != ANY(ARRAY['(0,1)', '(0,2)']::tid[]); +SELECT ctid, * FROM tidscan WHERE ctid != ANY(ARRAY['(0,1)', '(0,2)']::tid[]); + +-- tid equality extracted from sub-AND clauses +EXPLAIN (COSTS OFF) +SELECT ctid, * FROM tidscan +WHERE (id = 3 AND ctid IN ('(0,2)', '(0,3)')) OR (ctid = '(0,1)' AND id = 1); +SELECT ctid, * FROM tidscan +WHERE (id = 3 AND ctid IN ('(0,2)', '(0,3)')) OR (ctid = '(0,1)' AND id = 1); + +-- nestloop-with-inner-tidscan joins on tid +SET enable_hashjoin TO off; -- otherwise hash join might win +EXPLAIN (COSTS OFF) +SELECT t1.ctid, t1.*, t2.ctid, t2.* +FROM tidscan t1 JOIN tidscan t2 ON t1.ctid = t2.ctid WHERE t1.id = 1; +SELECT t1.ctid, t1.*, t2.ctid, t2.* +FROM tidscan t1 JOIN tidscan t2 ON t1.ctid = t2.ctid WHERE t1.id = 1; +EXPLAIN (COSTS OFF) +SELECT t1.ctid, t1.*, t2.ctid, t2.* +FROM tidscan t1 LEFT JOIN tidscan t2 ON t1.ctid = t2.ctid WHERE t1.id = 1; +SELECT t1.ctid, t1.*, t2.ctid, t2.* +FROM tidscan t1 LEFT JOIN tidscan t2 ON t1.ctid = t2.ctid WHERE t1.id = 1; +RESET enable_hashjoin; + +-- exercise backward scan and rewind +BEGIN; +DECLARE c CURSOR FOR +SELECT ctid, * FROM tidscan WHERE ctid = ANY(ARRAY['(0,1)', '(0,2)']::tid[]); +FETCH ALL FROM c; +FETCH BACKWARD 1 FROM c; +FETCH FIRST FROM c; +ROLLBACK; + +-- tidscan via CURRENT OF +BEGIN; +DECLARE c CURSOR FOR SELECT ctid, * FROM tidscan; +FETCH NEXT FROM c; -- skip one row +FETCH NEXT FROM c; +-- perform update +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) +UPDATE tidscan SET id = -id WHERE CURRENT OF c RETURNING *; +FETCH NEXT FROM c; +-- perform update +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) +UPDATE tidscan SET id = -id WHERE CURRENT OF c RETURNING *; +SELECT * FROM tidscan; +-- position cursor past any rows +FETCH NEXT FROM c; +-- should error out +EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) +UPDATE tidscan SET id = -id WHERE CURRENT OF c RETURNING *; +ROLLBACK; + +-- bulk joins on CTID +-- (these plans don't use TID scans, but this still seems like an +-- appropriate place for these tests) +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 t1 JOIN tenk1 t2 ON t1.ctid = t2.ctid; +SELECT count(*) FROM tenk1 t1 JOIN tenk1 t2 ON t1.ctid = t2.ctid; +SET enable_hashjoin TO off; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 t1 JOIN tenk1 t2 ON t1.ctid = t2.ctid; +SELECT count(*) FROM tenk1 t1 JOIN tenk1 t2 ON t1.ctid = t2.ctid; +RESET enable_hashjoin; + +-- GPDB_13_MERGE_FIXME +-- --check predicate lock on CTID +-- BEGIN ISOLATION LEVEL SERIALIZABLE; +-- SELECT * FROM tidscan WHERE ctid = '(0,1)'; +-- -- locktype should be 'tuple' +-- SELECT locktype, mode FROM pg_locks WHERE pid = pg_backend_pid() AND mode = 'SIReadLock'; +-- ROLLBACK; + +DROP TABLE tidscan; diff --git a/src/test/singlenode_regress/sql/tidscan_gp.sql b/src/test/singlenode_regress/sql/tidscan_gp.sql new file mode 100644 index 00000000000..484e7f3b00b --- /dev/null +++ b/src/test/singlenode_regress/sql/tidscan_gp.sql @@ -0,0 +1,14 @@ +drop table if exists test; +create table test (a integer); +insert into test select a from generate_series(1,100) a; + +\echo -- start_ignore +select * from test where ctid='(0,10)' and gp_segment_id=1; +\echo -- end_ignore +drop table if exists test; +create table test (a integer); +insert into test select a from generate_series(1,100) a; + +\echo -- start_ignore +select * from test where ctid in ('(0,10)', '(0,20)'); +\echo -- end_ignore diff --git a/src/test/singlenode_regress/sql/time.sql b/src/test/singlenode_regress/sql/time.sql new file mode 100644 index 00000000000..3637f28798b --- /dev/null +++ b/src/test/singlenode_regress/sql/time.sql @@ -0,0 +1,72 @@ +-- +-- TIME +-- + +CREATE TABLE TIME_TBL (f1 time(2)); + +INSERT INTO TIME_TBL VALUES ('00:00'); +INSERT INTO TIME_TBL VALUES ('01:00'); +-- as of 7.4, timezone spec should be accepted and ignored +INSERT INTO TIME_TBL VALUES ('02:03 PST'); +INSERT INTO TIME_TBL VALUES ('11:59 EDT'); +INSERT INTO TIME_TBL VALUES ('12:00'); +INSERT INTO TIME_TBL VALUES ('12:01'); +INSERT INTO TIME_TBL VALUES ('23:59'); +INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM'); + +INSERT INTO TIME_TBL VALUES ('2003-03-07 15:36:39 America/New_York'); +INSERT INTO TIME_TBL VALUES ('2003-07-07 15:36:39 America/New_York'); +-- this should fail (the timezone offset is not known) +INSERT INTO TIME_TBL VALUES ('15:36:39 America/New_York'); + + +SELECT f1 AS "Time" FROM TIME_TBL; + +SELECT f1 AS "Three" FROM TIME_TBL WHERE f1 < '05:06:07'; + +SELECT f1 AS "Five" FROM TIME_TBL WHERE f1 > '05:06:07'; + +SELECT f1 AS "None" FROM TIME_TBL WHERE f1 < '00:00'; + +SELECT f1 AS "Eight" FROM TIME_TBL WHERE f1 >= '00:00'; + +-- Check edge cases +SELECT '23:59:59.999999'::time; +SELECT '23:59:59.9999999'::time; -- rounds up +SELECT '23:59:60'::time; -- rounds up +SELECT '24:00:00'::time; -- allowed +SELECT '24:00:00.01'::time; -- not allowed +SELECT '23:59:60.01'::time; -- not allowed +SELECT '24:01:00'::time; -- not allowed +SELECT '25:00:00'::time; -- not allowed + +-- +-- TIME simple math +-- +-- We now make a distinction between time and intervals, +-- and adding two times together makes no sense at all. +-- Leave in one query to show that it is rejected, +-- and do the rest of the testing in horology.sql +-- where we do mixed-type arithmetic. - thomas 2000-12-02 + +SELECT f1 + time '00:01' AS "Illegal" FROM TIME_TBL; + +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(MILLISECOND FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(SECOND FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(MINUTE FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(HOUR FROM TIME '2020-05-26 13:30:25.575401'); +SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error +SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error +SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error +SELECT EXTRACT(EPOCH FROM TIME '2020-05-26 13:30:25.575401'); + +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME '2020-05-26 13:30:25.575401'); +SELECT date_part('millisecond', TIME '2020-05-26 13:30:25.575401'); +SELECT date_part('second', TIME '2020-05-26 13:30:25.575401'); +SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401'); diff --git a/src/test/singlenode_regress/sql/timestamp.sql b/src/test/singlenode_regress/sql/timestamp.sql new file mode 100644 index 00000000000..ebc969f36cf --- /dev/null +++ b/src/test/singlenode_regress/sql/timestamp.sql @@ -0,0 +1,386 @@ +-- +-- TIMESTAMP +-- + +CREATE TABLE TIMESTAMP_TBL (d1 timestamp(2) without time zone); + +-- Test shorthand input values +-- We can't just "select" the results since they aren't constants; test for +-- equality instead. We can do that by running the test inside a transaction +-- block, within which the value of 'now' shouldn't change, and so these +-- related values shouldn't either. + +BEGIN; + +INSERT INTO TIMESTAMP_TBL VALUES ('today'); +INSERT INTO TIMESTAMP_TBL VALUES ('yesterday'); +INSERT INTO TIMESTAMP_TBL VALUES ('tomorrow'); +-- time zone should be ignored by this data type +INSERT INTO TIMESTAMP_TBL VALUES ('tomorrow EST'); +INSERT INTO TIMESTAMP_TBL VALUES ('tomorrow zulu'); + +SELECT count(*) AS One FROM TIMESTAMP_TBL WHERE d1 = timestamp without time zone 'today'; +SELECT count(*) AS Three FROM TIMESTAMP_TBL WHERE d1 = timestamp without time zone 'tomorrow'; +SELECT count(*) AS One FROM TIMESTAMP_TBL WHERE d1 = timestamp without time zone 'yesterday'; + +COMMIT; + +DELETE FROM TIMESTAMP_TBL; + +-- Verify that 'now' *does* change over a reasonable interval such as 100 msec, +-- and that it doesn't change over the same interval within a transaction block + +INSERT INTO TIMESTAMP_TBL VALUES ('now'); +SELECT pg_sleep(0.1); + +BEGIN; +INSERT INTO TIMESTAMP_TBL VALUES ('now'); +SELECT pg_sleep(0.1); +INSERT INTO TIMESTAMP_TBL VALUES ('now'); +SELECT pg_sleep(0.1); +SELECT count(*) AS two FROM TIMESTAMP_TBL WHERE d1 = timestamp(2) without time zone 'now'; +SELECT count(d1) AS three, count(DISTINCT d1) AS two FROM TIMESTAMP_TBL; +COMMIT; + +TRUNCATE TIMESTAMP_TBL; + +-- Special values +INSERT INTO TIMESTAMP_TBL VALUES ('-infinity'); +INSERT INTO TIMESTAMP_TBL VALUES ('infinity'); +INSERT INTO TIMESTAMP_TBL VALUES ('epoch'); + +-- Postgres v6.0 standard output format +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST'); + +-- Variations on Postgres v6.1 standard output format +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.000001 1997 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.999999 1997 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.4 1997 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.5 1997 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01.6 1997 PST'); + +-- ISO 8601 format +INSERT INTO TIMESTAMP_TBL VALUES ('1997-01-02'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-01-02 03:04:05'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-02-10 17:32:01-08'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-02-10 17:32:01-0800'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-02-10 17:32:01 -08:00'); +INSERT INTO TIMESTAMP_TBL VALUES ('19970210 173201 -0800'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-06-10 17:32:01 -07:00'); +INSERT INTO TIMESTAMP_TBL VALUES ('2001-09-22T18:19:20'); + +-- POSIX format (note that the timezone abbrev is just decoration here) +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 08:14:01 GMT+8'); +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 13:14:02 GMT-1'); +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 12:14:03 GMT-2'); +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 03:14:04 PST+8'); +INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 02:14:05 MST+7:00'); + +-- Variations for acceptable input formats +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 17:32:01 1997 -0800'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 5:32PM 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997/02/10 17:32:01-0800'); +INSERT INTO TIMESTAMP_TBL VALUES ('1997-02-10 17:32:01 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb-10-1997 17:32:01 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('02-10-1997 17:32:01 PST'); +INSERT INTO TIMESTAMP_TBL VALUES ('19970210 173201 PST'); +set datestyle to ymd; +INSERT INTO TIMESTAMP_TBL VALUES ('97FEB10 5:32:01PM UTC'); +INSERT INTO TIMESTAMP_TBL VALUES ('97/02/10 17:32:01 UTC'); +reset datestyle; +INSERT INTO TIMESTAMP_TBL VALUES ('1997.041 17:32:01 UTC'); +INSERT INTO TIMESTAMP_TBL VALUES ('19970210 173201 America/New_York'); +-- this fails (even though TZ is a no-op, we still look it up) +INSERT INTO TIMESTAMP_TBL VALUES ('19970710 173201 America/Does_not_exist'); + +-- Check date conversion and date arithmetic +INSERT INTO TIMESTAMP_TBL VALUES ('1997-06-10 18:32:01 PDT'); + +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 11 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 12 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 13 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 14 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 15 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1997'); + +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 0097 BC'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 0097'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 0597'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1097'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1697'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1797'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1897'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 2097'); + +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 28 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 29 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mar 01 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 30 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 1996'); +INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 28 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 29 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Mar 01 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 30 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 1997'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 1999'); +INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2000'); +INSERT INTO TIMESTAMP_TBL VALUES ('Dec 31 17:32:01 2000'); +INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2001'); + +-- Currently unsupported syntax and ranges +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 -0097'); +INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 5097 BC'); + +SELECT d1 FROM TIMESTAMP_TBL; + +-- Check behavior at the boundaries of the timestamp range +SELECT '4714-11-24 00:00:00 BC'::timestamp; +SELECT '4714-11-23 23:59:59 BC'::timestamp; -- out of range +SELECT '294276-12-31 23:59:59'::timestamp; +SELECT '294277-01-01 00:00:00'::timestamp; -- out of range + +-- Demonstrate functions and operators +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 > timestamp without time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 < timestamp without time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 = timestamp without time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 != timestamp without time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 <= timestamp without time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMP_TBL + WHERE d1 >= timestamp without time zone '1997-01-02'; + +SELECT d1 - timestamp without time zone '1997-01-02' AS diff + FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; + +SELECT date_trunc( 'week', timestamp '2004-02-29 15:44:17.71393' ) AS week_trunc; + +-- verify date_bin behaves the same as date_trunc for relevant intervals + +-- case 1: AD dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2001-01-01') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); + +-- case 2: BC dates, origin < input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2000-01-01 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); + +-- case 3: AD dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2020-03-02') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts); + +-- case 4: BC dates, origin > input +SELECT + str, + interval, + date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '0055-06-17 BC') AS equal +FROM ( + VALUES + ('week', '7 d'), + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts); + +-- bin timestamps into arbitrary intervals +SELECT + interval, + ts, + origin, + date_bin(interval::interval, ts, origin) +FROM ( + VALUES + ('15 days'), + ('2 hours'), + ('1 hour 30 minutes'), + ('15 minutes'), + ('10 seconds'), + ('100 milliseconds'), + ('250 microseconds') +) intervals (interval), +(VALUES (timestamp '2020-02-11 15:44:17.71393')) ts (ts), +(VALUES (timestamp '2001-01-01')) origin (origin); + +-- shift bins using the origin parameter: +SELECT date_bin('5 min'::interval, timestamp '2020-02-01 01:01:01', timestamp '2020-02-01 00:02:30'); + +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); +SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); + +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); + +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); + +-- Test casting within a BETWEEN qualifier +SELECT d1 - timestamp without time zone '1997-01-02' AS diff + FROM TIMESTAMP_TBL + WHERE d1 BETWEEN timestamp without time zone '1902-01-01' + AND timestamp without time zone '2038-01-01'; + +-- DATE_PART (timestamp_part) +SELECT d1 as "timestamp", + date_part( 'year', d1) AS year, date_part( 'month', d1) AS month, + date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, + date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second + FROM TIMESTAMP_TBL; + +SELECT d1 as "timestamp", + date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, + date_part( 'usec', d1) AS usec + FROM TIMESTAMP_TBL; + +SELECT d1 as "timestamp", + date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, + date_part( 'isodow', d1) AS isodow, date_part( 'dow', d1) AS dow, + date_part( 'doy', d1) AS doy + FROM TIMESTAMP_TBL; + +SELECT d1 as "timestamp", + date_part( 'decade', d1) AS decade, + date_part( 'century', d1) AS century, + date_part( 'millennium', d1) AS millennium, + round(date_part( 'julian', d1)) AS julian, + date_part( 'epoch', d1) AS epoch + FROM TIMESTAMP_TBL; + +-- extract implementation is mostly the same as date_part, so only +-- test a few cases for additional coverage. +SELECT d1 as "timestamp", + extract(microseconds from d1) AS microseconds, + extract(milliseconds from d1) AS milliseconds, + extract(seconds from d1) AS seconds, + round(extract(julian from d1)) AS julian, + extract(epoch from d1) AS epoch + FROM TIMESTAMP_TBL; + +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00'::timestamp); +SELECT extract(epoch from '294270-01-01 00:00:00'::timestamp); +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00'::timestamp); + +-- TO_CHAR() +SELECT to_char(d1, 'DAY Day day DY Dy dy MONTH Month month RM MON Mon mon') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'FMDAY FMDay FMday FMMONTH FMMonth FMmonth FMRM') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'Y,YYY YYYY YYY YY Y CC Q MM WW DDD DD D J') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'HH HH12 HH24 MI SS SSSS') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'HH24--text--MI--text--SS') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'YYYYTH YYYYth Jth') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. HH:MI:SS p.m. HH:MI:SS pm') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'IYYY IYY IY I IW IDDD ID') + FROM TIMESTAMP_TBL; + +SELECT to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID') + FROM TIMESTAMP_TBL; + +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamp), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); + +-- Roman months, with upper and lower case. +SELECT i, + to_char(i * interval '1mon', 'rm'), + to_char(i * interval '1mon', 'RM') + FROM generate_series(-13, 13) i; + +-- timestamp numeric fields constructor +SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887); +SELECT make_timestamp(-44, 3, 15, 12, 30, 15); +-- should fail +select make_timestamp(0, 7, 15, 12, 30, 15); + +-- generate_series for timestamp +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '1 hour'::interval); +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamp, + 'infinity'::timestamp, + '1 month'::interval) limit 10; +-- errors +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '0 hour'::interval); diff --git a/src/test/singlenode_regress/sql/timestamptz.sql b/src/test/singlenode_regress/sql/timestamptz.sql new file mode 100644 index 00000000000..bce70fb21f7 --- /dev/null +++ b/src/test/singlenode_regress/sql/timestamptz.sql @@ -0,0 +1,567 @@ +-- +-- TIMESTAMPTZ +-- + +CREATE TABLE TIMESTAMPTZ_TBL (d1 timestamp(2) with time zone); + +-- Test shorthand input values +-- We can't just "select" the results since they aren't constants; test for +-- equality instead. We can do that by running the test inside a transaction +-- block, within which the value of 'now' shouldn't change, and so these +-- related values shouldn't either. + +BEGIN; + +INSERT INTO TIMESTAMPTZ_TBL VALUES ('today'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('yesterday'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow EST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow zulu'); + +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'today'; +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow'; +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'yesterday'; +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow EST'; +SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow zulu'; + +COMMIT; + +DELETE FROM TIMESTAMPTZ_TBL; + +-- Verify that 'now' *does* change over a reasonable interval such as 100 msec, +-- and that it doesn't change over the same interval within a transaction block + +INSERT INTO TIMESTAMPTZ_TBL VALUES ('now'); +SELECT pg_sleep(0.1); + +BEGIN; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('now'); +SELECT pg_sleep(0.1); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('now'); +SELECT pg_sleep(0.1); +SELECT count(*) AS two FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp(2) with time zone 'now'; +SELECT count(d1) AS three, count(DISTINCT d1) AS two FROM TIMESTAMPTZ_TBL; +COMMIT; + +TRUNCATE TIMESTAMPTZ_TBL; + +-- Special values +INSERT INTO TIMESTAMPTZ_TBL VALUES ('-infinity'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('infinity'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('epoch'); + +-- Postgres v6.0 standard output format +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST'); + +-- Variations on Postgres v6.1 standard output format +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.000001 1997 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.999999 1997 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.4 1997 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.5 1997 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.6 1997 PST'); + +-- ISO 8601 format +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-01-02'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-01-02 03:04:05'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01-08'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01-0800'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01 -08:00'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 -0800'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-06-10 17:32:01 -07:00'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2001-09-22T18:19:20'); + +-- POSIX format (note that the timezone abbrev is just decoration here) +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 08:14:01 GMT+8'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 13:14:02 GMT-1'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 12:14:03 GMT-2'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 03:14:04 PST+8'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 02:14:05 MST+7:00'); + +-- Variations for acceptable input formats +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997 -0800'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 5:32PM 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997/02/10 17:32:01-0800'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb-10-1997 17:32:01 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('02-10-1997 17:32:01 PST'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 PST'); +set datestyle to ymd; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('97FEB10 5:32:01PM UTC'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('97/02/10 17:32:01 UTC'); +reset datestyle; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997.041 17:32:01 UTC'); + +-- timestamps at different timezones +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 America/New_York'); +SELECT '19970210 173201' AT TIME ZONE 'America/New_York'; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970710 173201 America/New_York'); +SELECT '19970710 173201' AT TIME ZONE 'America/New_York'; +INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970710 173201 America/Does_not_exist'); +SELECT '19970710 173201' AT TIME ZONE 'America/Does_not_exist'; + +-- Daylight saving time for timestamps beyond 32-bit time_t range. +SELECT '20500710 173201 Europe/Helsinki'::timestamptz; -- DST +SELECT '20500110 173201 Europe/Helsinki'::timestamptz; -- non-DST + +SELECT '205000-07-10 17:32:01 Europe/Helsinki'::timestamptz; -- DST +SELECT '205000-01-10 17:32:01 Europe/Helsinki'::timestamptz; -- non-DST + +-- Check date conversion and date arithmetic +INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-06-10 18:32:01 PDT'); + +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 11 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 12 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 13 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 14 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 15 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1997'); + +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0097 BC'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0097'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0597'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1097'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1697'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1797'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1897'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 2097'); + +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 28 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 29 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mar 01 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 30 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1996'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 28 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 29 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mar 01 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 30 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1997'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1999'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2000'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 2000'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2001'); + +-- Currently unsupported syntax and ranges +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 -0097'); +INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 5097 BC'); + +-- Alternative field order that we've historically supported (sort of) +-- with regular and POSIXy timezone specs +SELECT 'Wed Jul 11 10:51:14 America/New_York 2001'::timestamptz; +SELECT 'Wed Jul 11 10:51:14 GMT-4 2001'::timestamptz; +SELECT 'Wed Jul 11 10:51:14 GMT+4 2001'::timestamptz; +SELECT 'Wed Jul 11 10:51:14 PST-03:00 2001'::timestamptz; +SELECT 'Wed Jul 11 10:51:14 PST+03:00 2001'::timestamptz; + +SELECT d1 FROM TIMESTAMPTZ_TBL; + +-- Check behavior at the boundaries of the timestamp range +SELECT '4714-11-24 00:00:00+00 BC'::timestamptz; +SELECT '4714-11-23 16:00:00-08 BC'::timestamptz; +SELECT 'Sun Nov 23 16:00:00 4714 PST BC'::timestamptz; +SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range +SELECT '294276-12-31 23:59:59+00'::timestamptz; +SELECT '294276-12-31 15:59:59-08'::timestamptz; +SELECT '294277-01-01 00:00:00+00'::timestamptz; -- out of range +SELECT '294277-12-31 16:00:00-08'::timestamptz; -- out of range + +-- Demonstrate functions and operators +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 > timestamp with time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 < timestamp with time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 = timestamp with time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 != timestamp with time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 <= timestamp with time zone '1997-01-02'; + +SELECT d1 FROM TIMESTAMPTZ_TBL + WHERE d1 >= timestamp with time zone '1997-01-02'; + +SELECT d1 - timestamp with time zone '1997-01-02' AS diff + FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; + +SELECT date_trunc( 'week', timestamp with time zone '2004-02-29 15:44:17.71393' ) AS week_trunc; + +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'Australia/Sydney') as sydney_trunc; -- zone name +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'GMT') as gmt_trunc; -- fixed-offset abbreviation +SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'VET') as vet_trunc; -- variable-offset abbreviation + +-- verify date_bin behaves the same as date_trunc for relevant intervals +SELECT + str, + interval, + date_trunc(str, ts, 'Australia/Sydney') = date_bin(interval::interval, ts, timestamp with time zone '2001-01-01+11') AS equal +FROM ( + VALUES + ('day', '1 d'), + ('hour', '1 h'), + ('minute', '1 m'), + ('second', '1 s'), + ('millisecond', '1 ms'), + ('microsecond', '1 us') +) intervals (str, interval), +(VALUES (timestamptz '2020-02-29 15:44:17.71393+00')) ts (ts); + +-- bin timestamps into arbitrary intervals +SELECT + interval, + ts, + origin, + date_bin(interval::interval, ts, origin) +FROM ( + VALUES + ('15 days'), + ('2 hours'), + ('1 hour 30 minutes'), + ('15 minutes'), + ('10 seconds'), + ('100 milliseconds'), + ('250 microseconds') +) intervals (interval), +(VALUES (timestamptz '2020-02-11 15:44:17.71393')) ts (ts), +(VALUES (timestamptz '2001-01-01')) origin (origin); + +-- shift bins using the origin parameter: +SELECT date_bin('5 min'::interval, timestamptz '2020-02-01 01:01:01+00', timestamptz '2020-02-01 00:02:30+00'); + +-- disallow intervals with months or years +SELECT date_bin('5 months'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); +SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); + +-- disallow zero intervals +SELECT date_bin('0 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); + +-- disallow negative intervals +SELECT date_bin('-2 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); + +-- Test casting within a BETWEEN qualifier +SELECT d1 - timestamp with time zone '1997-01-02' AS diff + FROM TIMESTAMPTZ_TBL + WHERE d1 BETWEEN timestamp with time zone '1902-01-01' AND timestamp with time zone '2038-01-01'; + +-- DATE_PART (timestamptz_part) +SELECT d1 as timestamptz, + date_part( 'year', d1) AS year, date_part( 'month', d1) AS month, + date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, + date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second + FROM TIMESTAMPTZ_TBL; + +SELECT d1 as timestamptz, + date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, + date_part( 'usec', d1) AS usec + FROM TIMESTAMPTZ_TBL; + +SELECT d1 as timestamptz, + date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, + date_part( 'isodow', d1) AS isodow, date_part( 'dow', d1) AS dow, + date_part( 'doy', d1) AS doy + FROM TIMESTAMPTZ_TBL; + +SELECT d1 as timestamptz, + date_part( 'decade', d1) AS decade, + date_part( 'century', d1) AS century, + date_part( 'millennium', d1) AS millennium, + round(date_part( 'julian', d1)) AS julian, + date_part( 'epoch', d1) AS epoch + FROM TIMESTAMPTZ_TBL; + +SELECT d1 as timestamptz, + date_part( 'timezone', d1) AS timezone, + date_part( 'timezone_hour', d1) AS timezone_hour, + date_part( 'timezone_minute', d1) AS timezone_minute + FROM TIMESTAMPTZ_TBL; + +-- extract implementation is mostly the same as date_part, so only +-- test a few cases for additional coverage. +SELECT d1 as "timestamp", + extract(microseconds from d1) AS microseconds, + extract(milliseconds from d1) AS milliseconds, + extract(seconds from d1) AS seconds, + round(extract(julian from d1)) AS julian, + extract(epoch from d1) AS epoch + FROM TIMESTAMPTZ_TBL; + +-- value near upper bound uses special case in code +SELECT date_part('epoch', '294270-01-01 00:00:00+00'::timestamptz); +SELECT extract(epoch from '294270-01-01 00:00:00+00'::timestamptz); +-- another internal overflow test case +SELECT extract(epoch from '5000-01-01 00:00:00+00'::timestamptz); + +-- TO_CHAR() +SELECT to_char(d1, 'DAY Day day DY Dy dy MONTH Month month RM MON Mon mon') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'FMDAY FMDay FMday FMMONTH FMMonth FMmonth FMRM') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'Y,YYY YYYY YYY YY Y CC Q MM WW DDD DD D J') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'HH HH12 HH24 MI SS SSSS') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'HH24--text--MI--text--SS') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'YYYYTH YYYYth Jth') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. HH:MI:SS p.m. HH:MI:SS pm') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'IYYY IYY IY I IW IDDD ID') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID') + FROM TIMESTAMPTZ_TBL; + +SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US') + FROM (VALUES + ('2018-11-02 12:34:56'::timestamptz), + ('2018-11-02 12:34:56.78'), + ('2018-11-02 12:34:56.78901'), + ('2018-11-02 12:34:56.78901234') + ) d(d); + +-- Check OF, TZH, TZM with various zone offsets, particularly fractional hours +SET timezone = '00:00'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +SET timezone = '+02:00'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +SET timezone = '-13:00'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +SET timezone = '-00:30'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +SET timezone = '00:30'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +SET timezone = '-04:30'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +SET timezone = '04:30'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +SET timezone = '-04:15'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +SET timezone = '04:15'; +SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; +RESET timezone; + +CREATE TABLE TIMESTAMPTZ_TST (a int , b timestamptz); + +-- Test year field value with len > 4 +INSERT INTO TIMESTAMPTZ_TST VALUES(1, 'Sat Mar 12 23:58:48 1000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(2, 'Sat Mar 12 23:58:48 10000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(3, 'Sat Mar 12 23:58:48 100000 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(3, '10000 Mar 12 23:58:48 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '100000312 23:58:48 IST'); +INSERT INTO TIMESTAMPTZ_TST VALUES(4, '1000000312 23:58:48 IST'); +--Verify data +SELECT * FROM TIMESTAMPTZ_TST ORDER BY a; +--Cleanup +DROP TABLE TIMESTAMPTZ_TST; + +-- test timestamptz constructors +set TimeZone to 'America/New_York'; + +-- numeric timezone +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33); +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2'); +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '-2'); +WITH tzs (tz) AS (VALUES + ('+1'), ('+1:'), ('+1:0'), ('+100'), ('+1:00'), ('+01:00'), + ('+10'), ('+1000'), ('+10:'), ('+10:0'), ('+10:00'), ('+10:00:'), + ('+10:00:1'), ('+10:00:01'), + ('+10:00:10')) + SELECT make_timestamptz(2010, 2, 27, 3, 45, 00, tz), tz FROM tzs; + +-- these should fail +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '2'); +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '+16'); +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '-16'); + +-- should be true +SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2') = '1973-07-15 08:15:55.33+02'::timestamptz; + +-- full timezone names +SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') = timestamptz '2014-12-10 00:00:00 Europe/Prague'; +SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); + +-- abbreviations +SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EST'); +SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EDT'); +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT'); + +RESET TimeZone; + +-- generate_series for timestamptz +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '1 hour'::interval); +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamptz, + 'infinity'::timestamptz, + '1 month'::interval) limit 10; +-- errors +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '0 hour'::interval); + +-- +-- Test behavior with a dynamic (time-varying) timezone abbreviation. +-- These tests rely on the knowledge that MSK (Europe/Moscow standard time) +-- moved forwards in Mar 2011 and backwards again in Oct 2014. +-- + +SET TimeZone to 'UTC'; + +SELECT '2011-03-27 00:00:00 Europe/Moscow'::timestamptz; +SELECT '2011-03-27 01:00:00 Europe/Moscow'::timestamptz; +SELECT '2011-03-27 01:59:59 Europe/Moscow'::timestamptz; +SELECT '2011-03-27 02:00:00 Europe/Moscow'::timestamptz; +SELECT '2011-03-27 02:00:01 Europe/Moscow'::timestamptz; +SELECT '2011-03-27 02:59:59 Europe/Moscow'::timestamptz; +SELECT '2011-03-27 03:00:00 Europe/Moscow'::timestamptz; +SELECT '2011-03-27 03:00:01 Europe/Moscow'::timestamptz; +SELECT '2011-03-27 04:00:00 Europe/Moscow'::timestamptz; + +SELECT '2011-03-27 00:00:00 MSK'::timestamptz; +SELECT '2011-03-27 01:00:00 MSK'::timestamptz; +SELECT '2011-03-27 01:59:59 MSK'::timestamptz; +SELECT '2011-03-27 02:00:00 MSK'::timestamptz; +SELECT '2011-03-27 02:00:01 MSK'::timestamptz; +SELECT '2011-03-27 02:59:59 MSK'::timestamptz; +SELECT '2011-03-27 03:00:00 MSK'::timestamptz; +SELECT '2011-03-27 03:00:01 MSK'::timestamptz; +SELECT '2011-03-27 04:00:00 MSK'::timestamptz; + +SELECT '2014-10-26 00:00:00 Europe/Moscow'::timestamptz; +SELECT '2014-10-26 00:59:59 Europe/Moscow'::timestamptz; +SELECT '2014-10-26 01:00:00 Europe/Moscow'::timestamptz; +SELECT '2014-10-26 01:00:01 Europe/Moscow'::timestamptz; +SELECT '2014-10-26 02:00:00 Europe/Moscow'::timestamptz; + +SELECT '2014-10-26 00:00:00 MSK'::timestamptz; +SELECT '2014-10-26 00:59:59 MSK'::timestamptz; +SELECT '2014-10-26 01:00:00 MSK'::timestamptz; +SELECT '2014-10-26 01:00:01 MSK'::timestamptz; +SELECT '2014-10-26 02:00:00 MSK'::timestamptz; + +SELECT '2011-03-27 00:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 01:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 01:59:59'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 02:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 02:00:01'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 02:59:59'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 03:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 03:00:01'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 04:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + +SELECT '2011-03-27 00:00:00'::timestamp AT TIME ZONE 'MSK'; +SELECT '2011-03-27 01:00:00'::timestamp AT TIME ZONE 'MSK'; +SELECT '2011-03-27 01:59:59'::timestamp AT TIME ZONE 'MSK'; +SELECT '2011-03-27 02:00:00'::timestamp AT TIME ZONE 'MSK'; +SELECT '2011-03-27 02:00:01'::timestamp AT TIME ZONE 'MSK'; +SELECT '2011-03-27 02:59:59'::timestamp AT TIME ZONE 'MSK'; +SELECT '2011-03-27 03:00:00'::timestamp AT TIME ZONE 'MSK'; +SELECT '2011-03-27 03:00:01'::timestamp AT TIME ZONE 'MSK'; +SELECT '2011-03-27 04:00:00'::timestamp AT TIME ZONE 'MSK'; + +SELECT '2014-10-26 00:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2014-10-26 00:59:59'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2014-10-26 01:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2014-10-26 01:00:01'::timestamp AT TIME ZONE 'Europe/Moscow'; +SELECT '2014-10-26 02:00:00'::timestamp AT TIME ZONE 'Europe/Moscow'; + +SELECT '2014-10-26 00:00:00'::timestamp AT TIME ZONE 'MSK'; +SELECT '2014-10-26 00:59:59'::timestamp AT TIME ZONE 'MSK'; +SELECT '2014-10-26 01:00:00'::timestamp AT TIME ZONE 'MSK'; +SELECT '2014-10-26 01:00:01'::timestamp AT TIME ZONE 'MSK'; +SELECT '2014-10-26 02:00:00'::timestamp AT TIME ZONE 'MSK'; + +SELECT make_timestamptz(2014, 10, 26, 0, 0, 0, 'MSK'); +SELECT make_timestamptz(2014, 10, 26, 1, 0, 0, 'MSK'); + +SELECT to_timestamp( 0); -- 1970-01-01 00:00:00+00 +SELECT to_timestamp( 946684800); -- 2000-01-01 00:00:00+00 +SELECT to_timestamp(1262349296.7890123); -- 2010-01-01 12:34:56.789012+00 +-- edge cases +SELECT to_timestamp(-210866803200); -- 4714-11-24 00:00:00+00 BC +-- upper limit varies between integer and float timestamps, so hard to test +-- nonfinite values +SELECT to_timestamp(' Infinity'::float); +SELECT to_timestamp('-Infinity'::float); +SELECT to_timestamp('NaN'::float); + + +SET TimeZone to 'Europe/Moscow'; + +SELECT '2011-03-26 21:00:00 UTC'::timestamptz; +SELECT '2011-03-26 22:00:00 UTC'::timestamptz; +SELECT '2011-03-26 22:59:59 UTC'::timestamptz; +SELECT '2011-03-26 23:00:00 UTC'::timestamptz; +SELECT '2011-03-26 23:00:01 UTC'::timestamptz; +SELECT '2011-03-26 23:59:59 UTC'::timestamptz; +SELECT '2011-03-27 00:00:00 UTC'::timestamptz; + +SELECT '2014-10-25 21:00:00 UTC'::timestamptz; +SELECT '2014-10-25 21:59:59 UTC'::timestamptz; +SELECT '2014-10-25 22:00:00 UTC'::timestamptz; +SELECT '2014-10-25 22:00:01 UTC'::timestamptz; +SELECT '2014-10-25 23:00:00 UTC'::timestamptz; + +RESET TimeZone; + +SELECT '2011-03-26 21:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-26 22:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-26 22:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-26 23:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-26 23:00:01 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-26 23:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2011-03-27 00:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + +SELECT '2014-10-25 21:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2014-10-25 21:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2014-10-25 22:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2014-10-25 22:00:01 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; +SELECT '2014-10-25 23:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow'; + +SELECT '2011-03-26 21:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2011-03-26 22:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2011-03-26 22:59:59 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2011-03-26 23:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2011-03-26 23:00:01 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2011-03-26 23:59:59 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2011-03-27 00:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + +SELECT '2014-10-25 21:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2014-10-25 21:59:59 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2014-10-25 22:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2014-10-25 22:00:01 UTC'::timestamptz AT TIME ZONE 'MSK'; +SELECT '2014-10-25 23:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; + +-- +-- Test that AT TIME ZONE isn't misoptimized when using an index (bug #14504) +-- +create temp table tmptz (f1 timestamptz primary key); +insert into tmptz values ('2017-01-18 00:00+00'); +explain (costs off) +select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00'; +select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00'; diff --git a/src/test/singlenode_regress/sql/timetz.sql b/src/test/singlenode_regress/sql/timetz.sql new file mode 100644 index 00000000000..7b70f4656c9 --- /dev/null +++ b/src/test/singlenode_regress/sql/timetz.sql @@ -0,0 +1,79 @@ +-- +-- TIMETZ +-- + +CREATE TABLE TIMETZ_TBL (f1 time(2) with time zone); + +INSERT INTO TIMETZ_TBL VALUES ('00:01 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('01:00 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('02:03 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('07:07 PST'); +INSERT INTO TIMETZ_TBL VALUES ('08:08 EDT'); +INSERT INTO TIMETZ_TBL VALUES ('11:59 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('12:00 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('12:01 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('23:59 PDT'); +INSERT INTO TIMETZ_TBL VALUES ('11:59:59.99 PM PDT'); + +INSERT INTO TIMETZ_TBL VALUES ('2003-03-07 15:36:39 America/New_York'); +INSERT INTO TIMETZ_TBL VALUES ('2003-07-07 15:36:39 America/New_York'); +-- this should fail (the timezone offset is not known) +INSERT INTO TIMETZ_TBL VALUES ('15:36:39 America/New_York'); +-- this should fail (timezone not specified without a date) +INSERT INTO TIMETZ_TBL VALUES ('15:36:39 m2'); +-- this should fail (dynamic timezone abbreviation without a date) +INSERT INTO TIMETZ_TBL VALUES ('15:36:39 MSK m2'); + + +SELECT f1 AS "Time TZ" FROM TIMETZ_TBL; + +SELECT f1 AS "Three" FROM TIMETZ_TBL WHERE f1 < '05:06:07-07'; + +SELECT f1 AS "Seven" FROM TIMETZ_TBL WHERE f1 > '05:06:07-07'; + +SELECT f1 AS "None" FROM TIMETZ_TBL WHERE f1 < '00:00-07'; + +SELECT f1 AS "Ten" FROM TIMETZ_TBL WHERE f1 >= '00:00-07'; + +-- Check edge cases +SELECT '23:59:59.999999 PDT'::timetz; +SELECT '23:59:59.9999999 PDT'::timetz; -- rounds up +SELECT '23:59:60 PDT'::timetz; -- rounds up +SELECT '24:00:00 PDT'::timetz; -- allowed +SELECT '24:00:00.01 PDT'::timetz; -- not allowed +SELECT '23:59:60.01 PDT'::timetz; -- not allowed +SELECT '24:01:00 PDT'::timetz; -- not allowed +SELECT '25:00:00 PDT'::timetz; -- not allowed + +-- +-- TIME simple math +-- +-- We now make a distinction between time and intervals, +-- and adding two times together makes no sense at all. +-- Leave in one query to show that it is rejected, +-- and do the rest of the testing in horology.sql +-- where we do mixed-type arithmetic. - thomas 2000-12-02 + +SELECT f1 + time with time zone '00:01' AS "Illegal" FROM TIMETZ_TBL; + +-- +-- test EXTRACT +-- +SELECT EXTRACT(MICROSECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(MILLISECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(SECOND FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT EXTRACT(DAY FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +SELECT EXTRACT(FORTNIGHT FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error +SELECT EXTRACT(TIMEZONE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +SELECT EXTRACT(TIMEZONE_HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +SELECT EXTRACT(TIMEZONE_MINUTE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); +SELECT EXTRACT(EPOCH FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + +-- date_part implementation is mostly the same as extract, so only +-- test a few cases for additional coverage. +SELECT date_part('microsecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT date_part('millisecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT date_part('second', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); +SELECT date_part('epoch', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); diff --git a/src/test/singlenode_regress/sql/transactions.sql b/src/test/singlenode_regress/sql/transactions.sql new file mode 100644 index 00000000000..8886280c0a6 --- /dev/null +++ b/src/test/singlenode_regress/sql/transactions.sql @@ -0,0 +1,604 @@ +-- +-- TRANSACTIONS +-- + +BEGIN; + +SELECT * + INTO TABLE xacttest + FROM aggtest; + +INSERT INTO xacttest (a, b) VALUES (777, 777.777); + +END; + +-- should retrieve one value-- +SELECT a FROM xacttest WHERE a > 100; + + +BEGIN; + +CREATE TABLE disappear (a int4); + +DELETE FROM aggtest; + +-- should be empty +SELECT * FROM aggtest; + +ABORT; + +-- should not exist +SELECT oid FROM pg_class WHERE relname = 'disappear'; + +-- should have members again +SELECT * FROM aggtest; + + +-- Read-only tests + +CREATE TABLE writetest (a int); +CREATE TEMPORARY TABLE temptest (a int); + +BEGIN; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ ONLY, DEFERRABLE; -- ok +SELECT * FROM writetest; -- ok +SET TRANSACTION READ WRITE; --fail +COMMIT; + +BEGIN; +SET TRANSACTION READ ONLY; -- ok +SET TRANSACTION READ WRITE; -- ok +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok +SAVEPOINT x; +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok +SET TRANSACTION READ ONLY; -- ok +SET TRANSACTION READ WRITE; --fail +COMMIT; + +BEGIN; +SET TRANSACTION READ WRITE; -- ok +SAVEPOINT x; +SET TRANSACTION READ WRITE; -- ok +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok +SET TRANSACTION READ ONLY; -- ok +SET TRANSACTION READ WRITE; --fail +COMMIT; + +BEGIN; +SET TRANSACTION READ WRITE; -- ok +SAVEPOINT x; +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok +ROLLBACK TO SAVEPOINT x; +SHOW transaction_read_only; -- off +SAVEPOINT y; +SET TRANSACTION READ ONLY; -- ok +SELECT * FROM writetest; -- ok +RELEASE SAVEPOINT y; +SHOW transaction_read_only; -- off +COMMIT; + +SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY; + +DROP TABLE writetest; -- fail +INSERT INTO writetest VALUES (1); -- fail +SELECT * FROM writetest; -- ok +DELETE FROM temptest; -- ok +UPDATE temptest SET a = 0 FROM writetest WHERE temptest.a = 1 AND writetest.a = temptest.a; -- ok +PREPARE test AS UPDATE writetest SET a = 0; -- ok +EXECUTE test; -- fail +SELECT * FROM writetest, temptest; -- ok +CREATE TABLE test AS SELECT * FROM writetest; -- fail + +START TRANSACTION READ WRITE; +DROP TABLE writetest; -- ok +COMMIT; + +-- Subtransactions, basic tests +-- create & drop tables +SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE; +CREATE TABLE trans_foobar (a int); +BEGIN; + CREATE TABLE trans_foo (a int); + SAVEPOINT one; + DROP TABLE trans_foo; + CREATE TABLE trans_bar (a int); + ROLLBACK TO SAVEPOINT one; + RELEASE SAVEPOINT one; + SAVEPOINT two; + CREATE TABLE trans_baz (a int); + RELEASE SAVEPOINT two; + drop TABLE trans_foobar; + CREATE TABLE trans_barbaz (a int); +COMMIT; +-- should exist: trans_barbaz, trans_baz, trans_foo +SELECT * FROM trans_foo; -- should be empty +SELECT * FROM trans_bar; -- shouldn't exist +SELECT * FROM trans_barbaz; -- should be empty +SELECT * FROM trans_baz; -- should be empty + +-- inserts +BEGIN; + INSERT INTO trans_foo VALUES (1); + SAVEPOINT one; + INSERT into trans_bar VALUES (1); + ROLLBACK TO one; + RELEASE SAVEPOINT one; + SAVEPOINT two; + INSERT into trans_barbaz VALUES (1); + RELEASE two; + SAVEPOINT three; + SAVEPOINT four; + INSERT INTO trans_foo VALUES (2); + RELEASE SAVEPOINT four; + ROLLBACK TO SAVEPOINT three; + RELEASE SAVEPOINT three; + INSERT INTO trans_foo VALUES (3); +COMMIT; +SELECT * FROM trans_foo; -- should have 1 and 3 +SELECT * FROM trans_barbaz; -- should have 1 + +-- test whole-tree commit +BEGIN; + SAVEPOINT one; + SELECT trans_foo; + ROLLBACK TO SAVEPOINT one; + RELEASE SAVEPOINT one; + SAVEPOINT two; + CREATE TABLE savepoints (a int); + SAVEPOINT three; + INSERT INTO savepoints VALUES (1); + SAVEPOINT four; + INSERT INTO savepoints VALUES (2); + SAVEPOINT five; + INSERT INTO savepoints VALUES (3); + ROLLBACK TO SAVEPOINT five; +COMMIT; +COMMIT; -- should not be in a transaction block +SELECT * FROM savepoints; + +-- test whole-tree rollback +BEGIN; + SAVEPOINT one; + DELETE FROM savepoints WHERE a=1; + RELEASE SAVEPOINT one; + SAVEPOINT two; + DELETE FROM savepoints WHERE a=1; + SAVEPOINT three; + DELETE FROM savepoints WHERE a=2; +ROLLBACK; +COMMIT; -- should not be in a transaction block + +SELECT * FROM savepoints; + +-- test whole-tree commit on an aborted subtransaction +BEGIN; + INSERT INTO savepoints VALUES (4); + SAVEPOINT one; + INSERT INTO savepoints VALUES (5); + SELECT trans_foo; +COMMIT; +SELECT * FROM savepoints; + +BEGIN; + INSERT INTO savepoints VALUES (6); + SAVEPOINT one; + INSERT INTO savepoints VALUES (7); + RELEASE SAVEPOINT one; + INSERT INTO savepoints VALUES (8); +COMMIT; +-- rows 6 and 8 should have been created by the same xact +SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=6 AND b.a=8; +-- rows 6 and 7 should have been created by different xacts +SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=6 AND b.a=7; + +BEGIN; + INSERT INTO savepoints VALUES (9); + SAVEPOINT one; + INSERT INTO savepoints VALUES (10); + ROLLBACK TO SAVEPOINT one; + INSERT INTO savepoints VALUES (11); +COMMIT; +SELECT a FROM savepoints WHERE a in (9, 10, 11); +-- rows 9 and 11 should have been created by different xacts +SELECT a.xmin = b.xmin FROM savepoints a, savepoints b WHERE a.a=9 AND b.a=11; + +BEGIN; + INSERT INTO savepoints VALUES (12); + SAVEPOINT one; + INSERT INTO savepoints VALUES (13); + SAVEPOINT two; + INSERT INTO savepoints VALUES (14); + ROLLBACK TO SAVEPOINT one; + INSERT INTO savepoints VALUES (15); + SAVEPOINT two; + INSERT INTO savepoints VALUES (16); + SAVEPOINT three; + INSERT INTO savepoints VALUES (17); +COMMIT; +SELECT a FROM savepoints WHERE a BETWEEN 12 AND 17; + +BEGIN; + INSERT INTO savepoints VALUES (18); + SAVEPOINT one; + INSERT INTO savepoints VALUES (19); + SAVEPOINT two; + INSERT INTO savepoints VALUES (20); + ROLLBACK TO SAVEPOINT one; + INSERT INTO savepoints VALUES (21); + ROLLBACK TO SAVEPOINT one; + INSERT INTO savepoints VALUES (22); +COMMIT; +SELECT a FROM savepoints WHERE a BETWEEN 18 AND 22; + +DROP TABLE savepoints; + +-- only in a transaction block: +SAVEPOINT one; +ROLLBACK TO SAVEPOINT one; +RELEASE SAVEPOINT one; + +-- Only "rollback to" allowed in aborted state +BEGIN; + SAVEPOINT one; + SELECT 0/0; + SAVEPOINT two; -- ignored till the end of ... + RELEASE SAVEPOINT one; -- ignored till the end of ... + ROLLBACK TO SAVEPOINT one; + SELECT 1; +COMMIT; +SELECT 1; -- this should work + +-- check non-transactional behavior of cursors +BEGIN; + DECLARE c CURSOR FOR SELECT unique2 FROM tenk1 ORDER BY unique2; + SAVEPOINT one; + FETCH 10 FROM c; + ROLLBACK TO SAVEPOINT one; + FETCH 10 FROM c; + RELEASE SAVEPOINT one; + FETCH 10 FROM c; + CLOSE c; + DECLARE c CURSOR FOR SELECT unique2/0 FROM tenk1 ORDER BY unique2; + SAVEPOINT two; + FETCH 10 FROM c; + ROLLBACK TO SAVEPOINT two; + -- c is now dead to the world ... + FETCH 10 FROM c; + ROLLBACK TO SAVEPOINT two; + RELEASE SAVEPOINT two; + FETCH 10 FROM c; +COMMIT; + +-- +-- Check that "stable" functions are really stable. They should not be +-- able to see the partial results of the calling query. (Ideally we would +-- also check that they don't see commits of concurrent transactions, but +-- that's a mite hard to do within the limitations of pg_regress.) +-- +select * from xacttest; + +create or replace function max_xacttest() returns smallint language sql as +'select max(a) from xacttest' stable; + +begin; +update xacttest set a = max_xacttest() + 10 where a > 0; +select * from xacttest; +rollback; + +-- But a volatile function can see the partial results of the calling query +create or replace function max_xacttest() returns smallint language sql as +'select max(a) from xacttest' volatile; + +begin; +update xacttest set a = max_xacttest() + 10 where a > 0; +select * from xacttest; +rollback; + +-- Now the same test with plpgsql (since it depends on SPI which is different) +create or replace function max_xacttest() returns smallint language plpgsql as +'begin return max(a) from xacttest; end' stable; + +begin; +update xacttest set a = max_xacttest() + 10 where a > 0; +select * from xacttest; +rollback; + +create or replace function max_xacttest() returns smallint language plpgsql as +'begin return max(a) from xacttest; end' volatile; + +begin; +update xacttest set a = max_xacttest() + 10 where a > 0; +select * from xacttest; +rollback; + + +-- test case for problems with dropping an open relation during abort +BEGIN; + savepoint x; + CREATE TABLE koju (a INT UNIQUE); + INSERT INTO koju VALUES (1); + INSERT INTO koju VALUES (1); + rollback to x; + + CREATE TABLE koju (a INT UNIQUE); + INSERT INTO koju VALUES (1); + INSERT INTO koju VALUES (1); +ROLLBACK; + +DROP TABLE trans_foo; +DROP TABLE trans_baz; +DROP TABLE trans_barbaz; + + +-- test case for problems with revalidating an open relation during abort +create function inverse(int) returns float8 as +$$ +begin + analyze revalidate_bug; + return 1::float8/$1; +exception + when division_by_zero then return 0; +end$$ language plpgsql volatile; + +create table revalidate_bug (c float8 unique); +insert into revalidate_bug values (1); +insert into revalidate_bug values (inverse(0)); + +drop table revalidate_bug; +drop function inverse(int); + + +-- verify that cursors created during an aborted subtransaction are +-- closed, but that we do not rollback the effect of any FETCHs +-- performed in the aborted subtransaction +begin; + +savepoint x; +create table abc (a int); +insert into abc values (5); +insert into abc values (10); +declare foo cursor for select * from abc; +fetch from foo; +rollback to x; + +-- should fail +fetch from foo; +commit; + +begin; + +create table abc (a int); +insert into abc values (5); +insert into abc values (10); +insert into abc values (15); +declare foo cursor for select * from abc; + +fetch from foo; + +savepoint x; +fetch from foo; +rollback to x; + +fetch from foo; + +abort; + + +-- Test for proper cleanup after a failure in a cursor portal +-- that was created in an outer subtransaction +CREATE FUNCTION invert(x float8) RETURNS float8 LANGUAGE plpgsql AS +$$ begin return 1/x; end $$; + +CREATE FUNCTION create_temp_tab() RETURNS text +LANGUAGE plpgsql AS $$ +BEGIN + CREATE TEMP TABLE new_table (f1 float8); + -- case of interest is that we fail while holding an open + -- relcache reference to new_table + INSERT INTO new_table SELECT invert(0.0); + RETURN 'foo'; +END $$; + +BEGIN; +DECLARE ok CURSOR FOR SELECT * FROM int8_tbl; +DECLARE ctt CURSOR FOR SELECT create_temp_tab(); +FETCH ok; +SAVEPOINT s1; +FETCH ok; -- should work +FETCH ctt; -- error occurs here +ROLLBACK TO s1; +FETCH ok; -- should work +FETCH ctt; -- must be rejected +COMMIT; + +DROP FUNCTION create_temp_tab(); +DROP FUNCTION invert(x float8); + + +-- Tests for AND CHAIN + +CREATE TABLE abc (a int); + +-- set nondefault value so we have something to override below +SET default_transaction_read_only = on; + +START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE; +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +INSERT INTO abc VALUES (1); +INSERT INTO abc VALUES (2); +COMMIT AND CHAIN; -- TBLOCK_END +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +INSERT INTO abc VALUES ('error'); +INSERT INTO abc VALUES (3); -- check it's really aborted +COMMIT AND CHAIN; -- TBLOCK_ABORT_END +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +INSERT INTO abc VALUES (4); +COMMIT; + +START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE; +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +SAVEPOINT x; +INSERT INTO abc VALUES ('error'); +COMMIT AND CHAIN; -- TBLOCK_ABORT_PENDING +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +INSERT INTO abc VALUES (5); +COMMIT; + +START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE; +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +SAVEPOINT x; +COMMIT AND CHAIN; -- TBLOCK_SUBCOMMIT +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +COMMIT; + +-- different mix of options just for fun +START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE, NOT DEFERRABLE; +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +INSERT INTO abc VALUES (6); +ROLLBACK AND CHAIN; -- TBLOCK_ABORT_PENDING +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +INSERT INTO abc VALUES ('error'); +ROLLBACK AND CHAIN; -- TBLOCK_ABORT_END +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +ROLLBACK; + +-- not allowed outside a transaction block +COMMIT AND CHAIN; -- error +ROLLBACK AND CHAIN; -- error + +SELECT * FROM abc ORDER BY 1; + +RESET default_transaction_read_only; + +DROP TABLE abc; + + +-- Test assorted behaviors around the implicit transaction block created +-- when multiple SQL commands are sent in a single Query message. These +-- tests rely on the fact that psql will not break SQL commands apart at a +-- backslash-quoted semicolon, but will send them as one Query. + +create temp table i_table (f1 int); + +-- psql will show only the last result in a multi-statement Query +SELECT 1\; SELECT 2\; SELECT 3; + +-- this implicitly commits: +insert into i_table values(1)\; select * from i_table; +-- 1/0 error will cause rolling back the whole implicit transaction +insert into i_table values(2)\; select * from i_table\; select 1/0; +select * from i_table; + +rollback; -- we are not in a transaction at this point + +-- can use regular begin/commit/rollback within a single Query +begin\; insert into i_table values(3)\; commit; +rollback; -- we are not in a transaction at this point +begin\; insert into i_table values(4)\; rollback; +rollback; -- we are not in a transaction at this point + +-- begin converts implicit transaction into a regular one that +-- can extend past the end of the Query +select 1\; begin\; insert into i_table values(5); +commit; +select 1\; begin\; insert into i_table values(6); +rollback; + +-- commit in implicit-transaction state commits but issues a warning. +insert into i_table values(7)\; commit\; insert into i_table values(8)\; select 1/0; +-- similarly, rollback aborts but issues a warning. +insert into i_table values(9)\; rollback\; select 2; + +select * from i_table; + +rollback; -- we are not in a transaction at this point + +-- implicit transaction block is still a transaction block, for e.g. VACUUM +SELECT 1\; VACUUM; +SELECT 1\; COMMIT\; VACUUM; + +-- we disallow savepoint-related commands in implicit-transaction state +SELECT 1\; SAVEPOINT sp; +SELECT 1\; COMMIT\; SAVEPOINT sp; +ROLLBACK TO SAVEPOINT sp\; SELECT 2; +SELECT 2\; RELEASE SAVEPOINT sp\; SELECT 3; + +-- but this is OK, because the BEGIN converts it to a regular xact +SELECT 1\; BEGIN\; SAVEPOINT sp\; ROLLBACK TO SAVEPOINT sp\; COMMIT; + + +-- Tests for AND CHAIN in implicit transaction blocks + +SET TRANSACTION READ ONLY\; COMMIT AND CHAIN; -- error +SHOW transaction_read_only; + +SET TRANSACTION READ ONLY\; ROLLBACK AND CHAIN; -- error +SHOW transaction_read_only; + +CREATE TABLE abc (a int); + +-- COMMIT/ROLLBACK + COMMIT/ROLLBACK AND CHAIN +INSERT INTO abc VALUES (7)\; COMMIT\; INSERT INTO abc VALUES (8)\; COMMIT AND CHAIN; -- 7 commit, 8 error +INSERT INTO abc VALUES (9)\; ROLLBACK\; INSERT INTO abc VALUES (10)\; ROLLBACK AND CHAIN; -- 9 rollback, 10 error + +-- COMMIT/ROLLBACK AND CHAIN + COMMIT/ROLLBACK +INSERT INTO abc VALUES (11)\; COMMIT AND CHAIN\; INSERT INTO abc VALUES (12)\; COMMIT; -- 11 error, 12 not reached +INSERT INTO abc VALUES (13)\; ROLLBACK AND CHAIN\; INSERT INTO abc VALUES (14)\; ROLLBACK; -- 13 error, 14 not reached + +-- START TRANSACTION + COMMIT/ROLLBACK AND CHAIN +START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERT INTO abc VALUES (15)\; COMMIT AND CHAIN; -- 15 ok +SHOW transaction_isolation; -- transaction is active at this point +COMMIT; + +START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERT INTO abc VALUES (16)\; ROLLBACK AND CHAIN; -- 16 ok +SHOW transaction_isolation; -- transaction is active at this point +ROLLBACK; + +SET default_transaction_isolation = 'read committed'; + +-- START TRANSACTION + COMMIT/ROLLBACK + COMMIT/ROLLBACK AND CHAIN +START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERT INTO abc VALUES (17)\; COMMIT\; INSERT INTO abc VALUES (18)\; COMMIT AND CHAIN; -- 17 commit, 18 error +SHOW transaction_isolation; -- out of transaction block + +START TRANSACTION ISOLATION LEVEL REPEATABLE READ\; INSERT INTO abc VALUES (19)\; ROLLBACK\; INSERT INTO abc VALUES (20)\; ROLLBACK AND CHAIN; -- 19 rollback, 20 error +SHOW transaction_isolation; -- out of transaction block + +RESET default_transaction_isolation; + +SELECT * FROM abc ORDER BY 1; + +DROP TABLE abc; + + +-- Test for successful cleanup of an aborted transaction at session exit. +-- THIS MUST BE THE LAST TEST IN THIS FILE. + +begin; +select 1/0; +rollback to X; + +-- DO NOT ADD ANYTHING HERE. diff --git a/src/test/singlenode_regress/sql/triggers.sql b/src/test/singlenode_regress/sql/triggers.sql new file mode 100644 index 00000000000..0abd12dda59 --- /dev/null +++ b/src/test/singlenode_regress/sql/triggers.sql @@ -0,0 +1,2583 @@ +-- +-- TRIGGERS +-- + +create table pkeys (pkey1 int4 not null, pkey2 text not null); +create table fkeys (fkey1 int4, fkey2 text, fkey3 int); +create table fkeys2 (fkey21 int4, fkey22 text, pkey23 int not null); + +create index fkeys_i on fkeys (fkey1, fkey2); +create index fkeys2_i on fkeys2 (fkey21, fkey22); +create index fkeys2p_i on fkeys2 (pkey23); + +insert into pkeys values (10, '1'); +insert into pkeys values (20, '2'); +insert into pkeys values (30, '3'); +insert into pkeys values (40, '4'); +insert into pkeys values (50, '5'); +insert into pkeys values (60, '6'); +create unique index pkeys_i on pkeys (pkey1, pkey2); + +-- +-- For fkeys: +-- (fkey1, fkey2) --> pkeys (pkey1, pkey2) +-- (fkey3) --> fkeys2 (pkey23) +-- +create trigger check_fkeys_pkey_exist + before insert or update on fkeys + for each row + execute function + check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2'); + +create trigger check_fkeys_pkey2_exist + before insert or update on fkeys + for each row + execute function check_primary_key ('fkey3', 'fkeys2', 'pkey23'); + +-- +-- For fkeys2: +-- (fkey21, fkey22) --> pkeys (pkey1, pkey2) +-- +create trigger check_fkeys2_pkey_exist + before insert or update on fkeys2 + for each row + execute procedure + check_primary_key ('fkey21', 'fkey22', 'pkeys', 'pkey1', 'pkey2'); + +-- Test comments +COMMENT ON TRIGGER check_fkeys2_pkey_bad ON fkeys2 IS 'wrong'; +COMMENT ON TRIGGER check_fkeys2_pkey_exist ON fkeys2 IS 'right'; +COMMENT ON TRIGGER check_fkeys2_pkey_exist ON fkeys2 IS NULL; + +-- +-- For pkeys: +-- ON DELETE/UPDATE (pkey1, pkey2) CASCADE: +-- fkeys (fkey1, fkey2) and fkeys2 (fkey21, fkey22) +-- +create trigger check_pkeys_fkey_cascade + before delete or update on pkeys + for each row + execute procedure + check_foreign_key (2, 'cascade', 'pkey1', 'pkey2', + 'fkeys', 'fkey1', 'fkey2', 'fkeys2', 'fkey21', 'fkey22'); + +-- +-- For fkeys2: +-- ON DELETE/UPDATE (pkey23) RESTRICT: +-- fkeys (fkey3) +-- +create trigger check_fkeys2_fkey_restrict + before delete or update on fkeys2 + for each row + execute procedure check_foreign_key (1, 'restrict', 'pkey23', 'fkeys', 'fkey3'); + +insert into fkeys2 values (10, '1', 1); +insert into fkeys2 values (30, '3', 2); +insert into fkeys2 values (40, '4', 5); +insert into fkeys2 values (50, '5', 3); +-- no key in pkeys +insert into fkeys2 values (70, '5', 3); + +insert into fkeys values (10, '1', 2); +insert into fkeys values (30, '3', 3); +insert into fkeys values (40, '4', 2); +insert into fkeys values (50, '5', 2); +-- no key in pkeys +insert into fkeys values (70, '5', 1); +-- no key in fkeys2 +insert into fkeys values (60, '6', 4); + +delete from pkeys where pkey1 = 30 and pkey2 = '3'; +delete from pkeys where pkey1 = 40 and pkey2 = '4'; +update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 50 and pkey2 = '5'; +update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 10 and pkey2 = '1'; + +SELECT trigger_name, event_manipulation, event_object_schema, event_object_table, + action_order, action_condition, action_orientation, action_timing, + action_reference_old_table, action_reference_new_table + FROM information_schema.triggers + WHERE event_object_table in ('pkeys', 'fkeys', 'fkeys2') + ORDER BY trigger_name COLLATE "C", 2; + +DROP TABLE pkeys; +DROP TABLE fkeys; +DROP TABLE fkeys2; + +-- Check behavior when trigger returns unmodified trigtuple +create table trigtest (f1 int, f2 text); + +create trigger trigger_return_old + before insert or delete or update on trigtest + for each row execute procedure trigger_return_old(); + +insert into trigtest values(1, 'foo'); +select * from trigtest; +update trigtest set f2 = f2 || 'bar'; +select * from trigtest; +delete from trigtest; +select * from trigtest; + +-- Also check what happens when such a trigger runs before or after others +create function f1_times_10() returns trigger as +$$ begin new.f1 := new.f1 * 10; return new; end $$ language plpgsql; + +create trigger trigger_alpha + before insert or update on trigtest + for each row execute procedure f1_times_10(); + +insert into trigtest values(1, 'foo'); +select * from trigtest; +update trigtest set f2 = f2 || 'bar'; +select * from trigtest; +delete from trigtest; +select * from trigtest; + +create trigger trigger_zed + before insert or update on trigtest + for each row execute procedure f1_times_10(); + +insert into trigtest values(1, 'foo'); +select * from trigtest; +update trigtest set f2 = f2 || 'bar'; +select * from trigtest; +delete from trigtest; +select * from trigtest; + +drop trigger trigger_alpha on trigtest; + +insert into trigtest values(1, 'foo'); +select * from trigtest; +update trigtest set f2 = f2 || 'bar'; +select * from trigtest; +delete from trigtest; +select * from trigtest; + +drop table trigtest; + +-- Check behavior with an implicit column default, too (bug #16644) +create table trigtest ( + a integer, + b bool default true not null, + c text default 'xyzzy' not null); + +create trigger trigger_return_old + before insert or delete or update on trigtest + for each row execute procedure trigger_return_old(); + +insert into trigtest values(1); +select * from trigtest; + +alter table trigtest add column d integer default 42 not null; + +select * from trigtest; +update trigtest set a = 2 where a = 1 returning *; +select * from trigtest; + +alter table trigtest drop column b; + +select * from trigtest; +update trigtest set a = 2 where a = 1 returning *; +select * from trigtest; + +drop table trigtest; + +create sequence ttdummy_seq increment 10 start 0 minvalue 0 cache 1; + +create table tttest ( + price_id int4, + price_val int4, + price_on int4, + price_off int4 default 999999 +); + +create trigger ttdummy + before delete or update on tttest + for each row + execute procedure + ttdummy (price_on, price_off); + +create trigger ttserial + before insert or update on tttest + for each row + execute procedure + autoinc (price_on, ttdummy_seq); + +insert into tttest values (1, 1, null); +insert into tttest values (2, 2, null); +insert into tttest values (3, 3, 0); + +select * from tttest; +delete from tttest where price_id = 2; +select * from tttest; +-- what do we see ? + +-- get current prices +select * from tttest where price_off = 999999; + +-- change price for price_id == 3 +update tttest set price_val = 30 where price_id = 3; +select * from tttest; + +-- now we want to change pric_id in ALL tuples +-- this gets us not what we need +update tttest set price_id = 5 where price_id = 3; +select * from tttest; + +-- restore data as before last update: +select set_ttdummy(0); +delete from tttest where price_id = 5; +update tttest set price_off = 999999 where price_val = 30; +select * from tttest; + +-- and try change price_id now! +update tttest set price_id = 5 where price_id = 3; +select * from tttest; +-- isn't it what we need ? + +select set_ttdummy(1); + +-- we want to correct some "date" +update tttest set price_on = -1 where price_id = 1; +-- but this doesn't work + +-- try in this way +select set_ttdummy(0); +update tttest set price_on = -1 where price_id = 1; +select * from tttest; +-- isn't it what we need ? + +-- get price for price_id == 5 as it was @ "date" 35 +select * from tttest where price_on <= 35 and price_off > 35 and price_id = 5; + +drop table tttest; +drop sequence ttdummy_seq; + +-- +-- tests for per-statement triggers +-- + +CREATE TABLE log_table (tstamp timestamp default timeofday()::timestamp); + +CREATE TABLE main_table (a int unique, b int); + +COPY main_table (a,b) FROM stdin; +5 10 +20 20 +30 10 +50 35 +80 15 +\. + +CREATE FUNCTION trigger_func() RETURNS trigger LANGUAGE plpgsql AS ' +BEGIN + RAISE NOTICE ''trigger_func(%) called: action = %, when = %, level = %'', TG_ARGV[0], TG_OP, TG_WHEN, TG_LEVEL; + RETURN NULL; +END;'; + +CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON main_table +FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('before_ins_stmt'); + +CREATE TRIGGER after_ins_stmt_trig AFTER INSERT ON main_table +FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('after_ins_stmt'); + +-- +-- if neither 'FOR EACH ROW' nor 'FOR EACH STATEMENT' was specified, +-- CREATE TRIGGER should default to 'FOR EACH STATEMENT' +-- +CREATE TRIGGER after_upd_stmt_trig AFTER UPDATE ON main_table +EXECUTE PROCEDURE trigger_func('after_upd_stmt'); + +-- Both insert and update statement level triggers (before and after) should +-- fire. Doesn't fire UPDATE before trigger, but only because one isn't +-- defined. +INSERT INTO main_table (a, b) VALUES (5, 10) ON CONFLICT (a) + DO UPDATE SET b = EXCLUDED.b; + +CREATE TRIGGER after_upd_row_trig AFTER UPDATE ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('after_upd_row'); + +INSERT INTO main_table DEFAULT VALUES; + +UPDATE main_table SET a = a + 1 WHERE b < 30; +-- UPDATE that effects zero rows should still call per-statement trigger +UPDATE main_table SET a = a + 2 WHERE b > 100; + +-- constraint now unneeded +ALTER TABLE main_table DROP CONSTRAINT main_table_a_key; + +-- COPY should fire per-row and per-statement INSERT triggers +COPY main_table (a, b) FROM stdin; +30 40 +50 60 +\. + +SELECT * FROM main_table ORDER BY a, b; + +-- +-- test triggers with WHEN clause +-- + +CREATE TRIGGER modified_a BEFORE UPDATE OF a ON main_table +FOR EACH ROW WHEN (OLD.a <> NEW.a) EXECUTE PROCEDURE trigger_func('modified_a'); +CREATE TRIGGER modified_any BEFORE UPDATE OF a ON main_table +FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) EXECUTE PROCEDURE trigger_func('modified_any'); +CREATE TRIGGER insert_a AFTER INSERT ON main_table +FOR EACH ROW WHEN (NEW.a = 123) EXECUTE PROCEDURE trigger_func('insert_a'); +CREATE TRIGGER delete_a AFTER DELETE ON main_table +FOR EACH ROW WHEN (OLD.a = 123) EXECUTE PROCEDURE trigger_func('delete_a'); +CREATE TRIGGER insert_when BEFORE INSERT ON main_table +FOR EACH STATEMENT WHEN (true) EXECUTE PROCEDURE trigger_func('insert_when'); +CREATE TRIGGER delete_when AFTER DELETE ON main_table +FOR EACH STATEMENT WHEN (true) EXECUTE PROCEDURE trigger_func('delete_when'); +SELECT trigger_name, event_manipulation, event_object_schema, event_object_table, + action_order, action_condition, action_orientation, action_timing, + action_reference_old_table, action_reference_new_table + FROM information_schema.triggers + WHERE event_object_table IN ('main_table') + ORDER BY trigger_name COLLATE "C", 2; +INSERT INTO main_table (a) VALUES (123), (456); +COPY main_table FROM stdin; +123 999 +456 999 +\. +DELETE FROM main_table WHERE a IN (123, 456); +UPDATE main_table SET a = 50, b = 60; +SELECT * FROM main_table ORDER BY a, b; +SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; +SELECT pg_get_triggerdef(oid, false) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; +SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_any'; + +-- Test RENAME TRIGGER +ALTER TRIGGER modified_a ON main_table RENAME TO modified_modified_a; +SELECT count(*) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a'; +SELECT count(*) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_modified_a'; + +DROP TRIGGER modified_modified_a ON main_table; +DROP TRIGGER modified_any ON main_table; +DROP TRIGGER insert_a ON main_table; +DROP TRIGGER delete_a ON main_table; +DROP TRIGGER insert_when ON main_table; +DROP TRIGGER delete_when ON main_table; + +-- Test WHEN condition accessing system columns. +create table table_with_oids(a int); +insert into table_with_oids values (1); +create trigger oid_unchanged_trig after update on table_with_oids + for each row + when (new.tableoid = old.tableoid AND new.tableoid <> 0) + execute procedure trigger_func('after_upd_oid_unchanged'); +update table_with_oids set a = a + 1; +-- try again +update table_with_oids set a = a + 1; +drop table table_with_oids; + +-- Test column-level triggers +DROP TRIGGER after_upd_row_trig ON main_table; + +CREATE TRIGGER before_upd_a_row_trig BEFORE UPDATE OF a ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_upd_a_row'); +CREATE TRIGGER after_upd_b_row_trig AFTER UPDATE OF b ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('after_upd_b_row'); +CREATE TRIGGER after_upd_a_b_row_trig AFTER UPDATE OF a, b ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('after_upd_a_b_row'); + +CREATE TRIGGER before_upd_a_stmt_trig BEFORE UPDATE OF a ON main_table +FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('before_upd_a_stmt'); +CREATE TRIGGER after_upd_b_stmt_trig AFTER UPDATE OF b ON main_table +FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('after_upd_b_stmt'); + +SELECT pg_get_triggerdef(oid) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'after_upd_a_b_row_trig'; + +UPDATE main_table SET a = 50; +UPDATE main_table SET b = 10; + +-- +-- Test case for bug with BEFORE trigger followed by AFTER trigger with WHEN +-- + +CREATE TABLE some_t (some_col boolean NOT NULL); +CREATE FUNCTION dummy_update_func() RETURNS trigger AS $$ +BEGIN + RAISE NOTICE 'dummy_update_func(%) called: action = %, old = %, new = %', + TG_ARGV[0], TG_OP, OLD, NEW; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER some_trig_before BEFORE UPDATE ON some_t FOR EACH ROW + EXECUTE PROCEDURE dummy_update_func('before'); +CREATE TRIGGER some_trig_aftera AFTER UPDATE ON some_t FOR EACH ROW + WHEN (NOT OLD.some_col AND NEW.some_col) + EXECUTE PROCEDURE dummy_update_func('aftera'); +CREATE TRIGGER some_trig_afterb AFTER UPDATE ON some_t FOR EACH ROW + WHEN (NOT NEW.some_col) + EXECUTE PROCEDURE dummy_update_func('afterb'); +INSERT INTO some_t VALUES (TRUE); +UPDATE some_t SET some_col = TRUE; +UPDATE some_t SET some_col = FALSE; +UPDATE some_t SET some_col = TRUE; +DROP TABLE some_t; + +-- bogus cases +CREATE TRIGGER error_upd_and_col BEFORE UPDATE OR UPDATE OF a ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('error_upd_and_col'); +CREATE TRIGGER error_upd_a_a BEFORE UPDATE OF a, a ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('error_upd_a_a'); +CREATE TRIGGER error_ins_a BEFORE INSERT OF a ON main_table +FOR EACH ROW EXECUTE PROCEDURE trigger_func('error_ins_a'); +CREATE TRIGGER error_ins_when BEFORE INSERT OR UPDATE ON main_table +FOR EACH ROW WHEN (OLD.a <> NEW.a) +EXECUTE PROCEDURE trigger_func('error_ins_old'); +CREATE TRIGGER error_del_when BEFORE DELETE OR UPDATE ON main_table +FOR EACH ROW WHEN (OLD.a <> NEW.a) +EXECUTE PROCEDURE trigger_func('error_del_new'); +CREATE TRIGGER error_del_when BEFORE INSERT OR UPDATE ON main_table +FOR EACH ROW WHEN (NEW.tableoid <> 0) +EXECUTE PROCEDURE trigger_func('error_when_sys_column'); +CREATE TRIGGER error_stmt_when BEFORE UPDATE OF a ON main_table +FOR EACH STATEMENT WHEN (OLD.* IS DISTINCT FROM NEW.*) +EXECUTE PROCEDURE trigger_func('error_stmt_when'); + +-- check dependency restrictions +ALTER TABLE main_table DROP COLUMN b; +-- this should succeed, but we'll roll it back to keep the triggers around +begin; +DROP TRIGGER after_upd_a_b_row_trig ON main_table; +DROP TRIGGER after_upd_b_row_trig ON main_table; +-- DROP TRIGGER after_upd_b_stmt_trig ON main_table; +ALTER TABLE main_table DROP COLUMN b; +rollback; + +-- Test enable/disable triggers + +create table trigtest (i serial primary key); +-- test that disabling RI triggers works +create table trigtest2 (i int references trigtest(i) on delete cascade); + +create function trigtest() returns trigger as $$ +begin + raise notice '% % % %', TG_TABLE_NAME, TG_OP, TG_WHEN, TG_LEVEL; + return new; +end;$$ language plpgsql; + +create trigger trigtest_b_row_tg before insert or update or delete on trigtest +for each row execute procedure trigtest(); +create trigger trigtest_a_row_tg after insert or update or delete on trigtest +for each row execute procedure trigtest(); +create trigger trigtest_b_stmt_tg before insert or update or delete on trigtest +for each statement execute procedure trigtest(); +create trigger trigtest_a_stmt_tg after insert or update or delete on trigtest +for each statement execute procedure trigtest(); + +insert into trigtest default values; +alter table trigtest disable trigger trigtest_b_row_tg; +insert into trigtest default values; +alter table trigtest disable trigger user; +insert into trigtest default values; +alter table trigtest enable trigger trigtest_a_stmt_tg; +insert into trigtest default values; +set session_replication_role = replica; +insert into trigtest default values; -- does not trigger +alter table trigtest enable always trigger trigtest_a_stmt_tg; +insert into trigtest default values; -- now it does +reset session_replication_role; +insert into trigtest2 values(1); +insert into trigtest2 values(2); +delete from trigtest where i=2; +select * from trigtest2; +alter table trigtest disable trigger all; +delete from trigtest where i=1; +select * from trigtest2; +-- ensure we still insert, even when all triggers are disabled +insert into trigtest default values; +select * from trigtest; +drop table trigtest2; +drop table trigtest; + + +-- dump trigger data +CREATE TABLE trigger_test ( + i int, + v varchar +); + +CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger +LANGUAGE plpgsql AS $$ + +declare + + argstr text; + relid text; + +begin + + relid := TG_relid::regclass; + + -- plpgsql can't discover its trigger data in a hash like perl and python + -- can, or by a sort of reflection like tcl can, + -- so we have to hard code the names. + raise NOTICE 'TG_NAME: %', TG_name; + raise NOTICE 'TG_WHEN: %', TG_when; + raise NOTICE 'TG_LEVEL: %', TG_level; + raise NOTICE 'TG_OP: %', TG_op; + raise NOTICE 'TG_RELID::regclass: %', relid; + raise NOTICE 'TG_RELNAME: %', TG_relname; + raise NOTICE 'TG_TABLE_NAME: %', TG_table_name; + raise NOTICE 'TG_TABLE_SCHEMA: %', TG_table_schema; + raise NOTICE 'TG_NARGS: %', TG_nargs; + + argstr := '['; + for i in 0 .. TG_nargs - 1 loop + if i > 0 then + argstr := argstr || ', '; + end if; + argstr := argstr || TG_argv[i]; + end loop; + argstr := argstr || ']'; + raise NOTICE 'TG_ARGV: %', argstr; + + if TG_OP != 'INSERT' then + raise NOTICE 'OLD: %', OLD; + end if; + + if TG_OP != 'DELETE' then + raise NOTICE 'NEW: %', NEW; + end if; + + if TG_OP = 'DELETE' then + return OLD; + else + return NEW; + end if; + +end; +$$; + +CREATE TRIGGER show_trigger_data_trig +BEFORE INSERT OR UPDATE OR DELETE ON trigger_test +FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo'); + +insert into trigger_test values(1,'insert'); +update trigger_test set v = 'update' where i = 1; +delete from trigger_test; + +DROP TRIGGER show_trigger_data_trig on trigger_test; + +DROP FUNCTION trigger_data(); + +DROP TABLE trigger_test; + +-- +-- Test use of row comparisons on OLD/NEW +-- + +CREATE TABLE trigger_test (dkey int, f1 int, f2 text, f3 text); + +-- this is the obvious (and wrong...) way to compare rows +CREATE FUNCTION mytrigger() RETURNS trigger LANGUAGE plpgsql as $$ +begin + if row(old.*) = row(new.*) then + raise notice 'row % not changed', new.f1; + else + raise notice 'row % changed', new.f1; + end if; + return new; +end$$; + +CREATE TRIGGER t +BEFORE UPDATE ON trigger_test +FOR EACH ROW EXECUTE PROCEDURE mytrigger(); + +INSERT INTO trigger_test VALUES(0, 1, 'foo', 'bar'); +INSERT INTO trigger_test VALUES(0, 2, 'baz', 'quux'); + +UPDATE trigger_test SET f3 = 'bar'; +UPDATE trigger_test SET f3 = NULL; +-- this demonstrates that the above isn't really working as desired: +UPDATE trigger_test SET f3 = NULL; + +-- the right way when considering nulls is +CREATE OR REPLACE FUNCTION mytrigger() RETURNS trigger LANGUAGE plpgsql as $$ +begin + if row(old.*) is distinct from row(new.*) then + raise notice 'row % changed', new.f1; + else + raise notice 'row % not changed', new.f1; + end if; + return new; +end$$; + +UPDATE trigger_test SET f3 = 'bar'; +UPDATE trigger_test SET f3 = NULL; +UPDATE trigger_test SET f3 = NULL; + +DROP TABLE trigger_test; + +DROP FUNCTION mytrigger(); + +-- Test snapshot management in serializable transactions involving triggers +-- per bug report in 6bc73d4c0910042358k3d1adff3qa36f8df75198ecea@mail.gmail.com +CREATE FUNCTION serializable_update_trig() RETURNS trigger LANGUAGE plpgsql AS +$$ +declare + rec record; +begin + new.description = 'updated in trigger'; + return new; +end; +$$; + +CREATE TABLE serializable_update_tab ( + id int, + filler text, + description text +); + +CREATE TRIGGER serializable_update_trig BEFORE UPDATE ON serializable_update_tab + FOR EACH ROW EXECUTE PROCEDURE serializable_update_trig(); + +INSERT INTO serializable_update_tab SELECT a, repeat('xyzxz', 100), 'new' + FROM generate_series(1, 50) a; + +BEGIN; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE serializable_update_tab SET description = 'no no', id = 1 WHERE id = 1; +COMMIT; +SELECT description FROM serializable_update_tab WHERE id = 1; +DROP TABLE serializable_update_tab; + +-- minimal update trigger + +CREATE TABLE min_updates_test ( + f1 text, + f2 int, + f3 int); + +INSERT INTO min_updates_test VALUES ('a',1,2),('b','2',null); + +CREATE TRIGGER z_min_update +BEFORE UPDATE ON min_updates_test +FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); + +\set QUIET false + +UPDATE min_updates_test SET f1 = f1; + +UPDATE min_updates_test SET f2 = f2 + 1; + +UPDATE min_updates_test SET f3 = 2 WHERE f3 is null; + +\set QUIET true + +SELECT * FROM min_updates_test; + +DROP TABLE min_updates_test; + +-- +-- Test triggers on views +-- + +CREATE VIEW main_view AS SELECT a, b FROM main_table; + +-- VIEW trigger function +CREATE OR REPLACE FUNCTION view_trigger() RETURNS trigger +LANGUAGE plpgsql AS $$ +declare + argstr text := ''; +begin + for i in 0 .. TG_nargs - 1 loop + if i > 0 then + argstr := argstr || ', '; + end if; + argstr := argstr || TG_argv[i]; + end loop; + + raise notice '% % % % (%)', TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL, argstr; + + if TG_LEVEL = 'ROW' then + if TG_OP = 'INSERT' then + raise NOTICE 'NEW: %', NEW; + INSERT INTO main_table VALUES (NEW.a, NEW.b); + RETURN NEW; + end if; + + if TG_OP = 'UPDATE' then + raise NOTICE 'OLD: %, NEW: %', OLD, NEW; + UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b; + if NOT FOUND then RETURN NULL; end if; + RETURN NEW; + end if; + + if TG_OP = 'DELETE' then + raise NOTICE 'OLD: %', OLD; + DELETE FROM main_table WHERE a = OLD.a AND b = OLD.b; + if NOT FOUND then RETURN NULL; end if; + RETURN OLD; + end if; + end if; + + RETURN NULL; +end; +$$; + +-- Before row triggers aren't allowed on views +CREATE TRIGGER invalid_trig BEFORE INSERT ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_ins_row'); + +CREATE TRIGGER invalid_trig BEFORE UPDATE ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_upd_row'); + +CREATE TRIGGER invalid_trig BEFORE DELETE ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_del_row'); + +-- After row triggers aren't allowed on views +CREATE TRIGGER invalid_trig AFTER INSERT ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_ins_row'); + +CREATE TRIGGER invalid_trig AFTER UPDATE ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_upd_row'); + +CREATE TRIGGER invalid_trig AFTER DELETE ON main_view +FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_del_row'); + +-- Truncate triggers aren't allowed on views +CREATE TRIGGER invalid_trig BEFORE TRUNCATE ON main_view +EXECUTE PROCEDURE trigger_func('before_tru_row'); + +CREATE TRIGGER invalid_trig AFTER TRUNCATE ON main_view +EXECUTE PROCEDURE trigger_func('before_tru_row'); + +-- INSTEAD OF triggers aren't allowed on tables +CREATE TRIGGER invalid_trig INSTEAD OF INSERT ON main_table +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_ins'); + +CREATE TRIGGER invalid_trig INSTEAD OF UPDATE ON main_table +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_upd'); + +CREATE TRIGGER invalid_trig INSTEAD OF DELETE ON main_table +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_del'); + +-- Don't support WHEN clauses with INSTEAD OF triggers +CREATE TRIGGER invalid_trig INSTEAD OF UPDATE ON main_view +FOR EACH ROW WHEN (OLD.a <> NEW.a) EXECUTE PROCEDURE view_trigger('instead_of_upd'); + +-- Don't support column-level INSTEAD OF triggers +CREATE TRIGGER invalid_trig INSTEAD OF UPDATE OF a ON main_view +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_upd'); + +-- Don't support statement-level INSTEAD OF triggers +CREATE TRIGGER invalid_trig INSTEAD OF UPDATE ON main_view +EXECUTE PROCEDURE view_trigger('instead_of_upd'); + +-- Valid INSTEAD OF triggers +CREATE TRIGGER instead_of_insert_trig INSTEAD OF INSERT ON main_view +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_ins'); + +CREATE TRIGGER instead_of_update_trig INSTEAD OF UPDATE ON main_view +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_upd'); + +CREATE TRIGGER instead_of_delete_trig INSTEAD OF DELETE ON main_view +FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_del'); + +-- Valid BEFORE statement VIEW triggers +CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('before_view_ins_stmt'); + +CREATE TRIGGER before_upd_stmt_trig BEFORE UPDATE ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('before_view_upd_stmt'); + +CREATE TRIGGER before_del_stmt_trig BEFORE DELETE ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('before_view_del_stmt'); + +-- Valid AFTER statement VIEW triggers +CREATE TRIGGER after_ins_stmt_trig AFTER INSERT ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('after_view_ins_stmt'); + +CREATE TRIGGER after_upd_stmt_trig AFTER UPDATE ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('after_view_upd_stmt'); + +CREATE TRIGGER after_del_stmt_trig AFTER DELETE ON main_view +FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('after_view_del_stmt'); + +\set QUIET false + +-- Insert into view using trigger +INSERT INTO main_view VALUES (20, 30); +INSERT INTO main_view VALUES (21, 31) RETURNING a, b; + +-- Table trigger will prevent updates +UPDATE main_view SET b = 31 WHERE a = 20; +UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; + +-- Remove table trigger to allow updates +DROP TRIGGER before_upd_a_row_trig ON main_table; +UPDATE main_view SET b = 31 WHERE a = 20; +UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; + +-- Before and after stmt triggers should fire even when no rows are affected +UPDATE main_view SET b = 0 WHERE false; + +-- Delete from view using trigger +DELETE FROM main_view WHERE a IN (20,21); +DELETE FROM main_view WHERE a = 31 RETURNING a, b; + +\set QUIET true + +-- Describe view should list triggers +\d main_view + +-- Test dropping view triggers +DROP TRIGGER instead_of_insert_trig ON main_view; +DROP TRIGGER instead_of_delete_trig ON main_view; +\d+ main_view +DROP VIEW main_view; + +-- +-- Test triggers on a join view +-- GPDB ignore this test: don't support modifications on views. +-- +CREATE TABLE country_table ( + country_id serial primary key, + country_name text not null, + continent text not null +); + +INSERT INTO country_table (country_name, continent) + VALUES ('Japan', 'Asia'), + ('UK', 'Europe'), + ('USA', 'North America') + RETURNING *; + +CREATE TABLE city_table ( + city_id serial primary key, + city_name text not null, + population bigint, + country_id int references country_table +); + +CREATE VIEW city_view AS + SELECT city_id, city_name, population, country_name, continent + FROM city_table ci + LEFT JOIN country_table co ON co.country_id = ci.country_id; + +CREATE FUNCTION city_insert() RETURNS trigger LANGUAGE plpgsql AS $$ +declare + ctry_id int; +begin + if NEW.country_name IS NOT NULL then + SELECT country_id, continent INTO ctry_id, NEW.continent + FROM country_table WHERE country_name = NEW.country_name; + if NOT FOUND then + raise exception 'No such country: "%"', NEW.country_name; + end if; + else + NEW.continent := NULL; + end if; + + if NEW.city_id IS NOT NULL then + INSERT INTO city_table + VALUES(NEW.city_id, NEW.city_name, NEW.population, ctry_id); + else + INSERT INTO city_table(city_name, population, country_id) + VALUES(NEW.city_name, NEW.population, ctry_id) + RETURNING city_id INTO NEW.city_id; + end if; + + RETURN NEW; +end; +$$; + +CREATE TRIGGER city_insert_trig INSTEAD OF INSERT ON city_view +FOR EACH ROW EXECUTE PROCEDURE city_insert(); + +CREATE FUNCTION city_delete() RETURNS trigger LANGUAGE plpgsql AS $$ +begin + DELETE FROM city_table WHERE city_id = OLD.city_id; + if NOT FOUND then RETURN NULL; end if; + RETURN OLD; +end; +$$; + +CREATE TRIGGER city_delete_trig INSTEAD OF DELETE ON city_view +FOR EACH ROW EXECUTE PROCEDURE city_delete(); + +CREATE FUNCTION city_update() RETURNS trigger LANGUAGE plpgsql AS $$ +declare + ctry_id int; +begin + if NEW.country_name IS DISTINCT FROM OLD.country_name then + SELECT country_id, continent INTO ctry_id, NEW.continent + FROM country_table WHERE country_name = NEW.country_name; + if NOT FOUND then + raise exception 'No such country: "%"', NEW.country_name; + end if; + + UPDATE city_table SET city_name = NEW.city_name, + population = NEW.population, + country_id = ctry_id + WHERE city_id = OLD.city_id; + else + UPDATE city_table SET city_name = NEW.city_name, + population = NEW.population + WHERE city_id = OLD.city_id; + NEW.continent := OLD.continent; + end if; + + if NOT FOUND then RETURN NULL; end if; + RETURN NEW; +end; +$$; + +CREATE TRIGGER city_update_trig INSTEAD OF UPDATE ON city_view +FOR EACH ROW EXECUTE PROCEDURE city_update(); + +\set QUIET false + +-- INSERT .. RETURNING +INSERT INTO city_view(city_name) VALUES('Tokyo') RETURNING *; +INSERT INTO city_view(city_name, population) VALUES('London', 7556900) RETURNING *; +INSERT INTO city_view(city_name, country_name) VALUES('Washington DC', 'USA') RETURNING *; +INSERT INTO city_view(city_id, city_name) VALUES(123456, 'New York') RETURNING *; +INSERT INTO city_view VALUES(234567, 'Birmingham', 1016800, 'UK', 'EU') RETURNING *; + +-- UPDATE .. RETURNING +UPDATE city_view SET country_name = 'Japon' WHERE city_name = 'Tokyo'; -- error +UPDATE city_view SET country_name = 'Japan' WHERE city_name = 'Takyo'; -- no match +UPDATE city_view SET country_name = 'Japan' WHERE city_name = 'Tokyo' RETURNING *; -- OK + +UPDATE city_view SET population = 13010279 WHERE city_name = 'Tokyo' RETURNING *; +UPDATE city_view SET country_name = 'UK' WHERE city_name = 'New York' RETURNING *; +UPDATE city_view SET country_name = 'USA', population = 8391881 WHERE city_name = 'New York' RETURNING *; +UPDATE city_view SET continent = 'EU' WHERE continent = 'Europe' RETURNING *; +UPDATE city_view v1 SET country_name = v2.country_name FROM city_view v2 + WHERE v2.city_name = 'Birmingham' AND v1.city_name = 'London' RETURNING *; + +-- DELETE .. RETURNING +DELETE FROM city_view WHERE city_name = 'Birmingham' RETURNING *; + +\set QUIET true + +-- read-only view with WHERE clause +CREATE VIEW european_city_view AS + SELECT * FROM city_view WHERE continent = 'Europe'; +SELECT count(*) FROM european_city_view; + +CREATE FUNCTION no_op_trig_fn() RETURNS trigger LANGUAGE plpgsql +AS 'begin RETURN NULL; end'; + +CREATE TRIGGER no_op_trig INSTEAD OF INSERT OR UPDATE OR DELETE +ON european_city_view FOR EACH ROW EXECUTE PROCEDURE no_op_trig_fn(); + +\set QUIET false + +INSERT INTO european_city_view VALUES (0, 'x', 10000, 'y', 'z'); +UPDATE european_city_view SET population = 10000; +DELETE FROM european_city_view; + +\set QUIET true + +-- rules bypassing no-op triggers +CREATE RULE european_city_insert_rule AS ON INSERT TO european_city_view +DO INSTEAD INSERT INTO city_view +VALUES (NEW.city_id, NEW.city_name, NEW.population, NEW.country_name, NEW.continent) +RETURNING *; + +CREATE RULE european_city_update_rule AS ON UPDATE TO european_city_view +DO INSTEAD UPDATE city_view SET + city_name = NEW.city_name, + population = NEW.population, + country_name = NEW.country_name +WHERE city_id = OLD.city_id +RETURNING NEW.*; + +CREATE RULE european_city_delete_rule AS ON DELETE TO european_city_view +DO INSTEAD DELETE FROM city_view WHERE city_id = OLD.city_id RETURNING *; + +\set QUIET false + +-- INSERT not limited by view's WHERE clause, but UPDATE AND DELETE are +INSERT INTO european_city_view(city_name, country_name) + VALUES ('Cambridge', 'USA') RETURNING *; +UPDATE european_city_view SET country_name = 'UK' + WHERE city_name = 'Cambridge'; +DELETE FROM european_city_view WHERE city_name = 'Cambridge'; + +-- UPDATE and DELETE via rule and trigger +UPDATE city_view SET country_name = 'UK' + WHERE city_name = 'Cambridge' RETURNING *; +UPDATE european_city_view SET population = 122800 + WHERE city_name = 'Cambridge' RETURNING *; +DELETE FROM european_city_view WHERE city_name = 'Cambridge' RETURNING *; + +-- join UPDATE test +UPDATE city_view v SET population = 599657 + FROM city_table ci, country_table co + WHERE ci.city_name = 'Washington DC' and co.country_name = 'USA' + AND v.city_id = ci.city_id AND v.country_name = co.country_name + RETURNING co.country_id, v.country_name, + v.city_id, v.city_name, v.population; + +\set QUIET true + +SELECT * FROM city_view; + +DROP TABLE city_table CASCADE; +DROP TABLE country_table; + + +-- Test pg_trigger_depth() +-- GPDB ignore this test: execute insert in trigger function + +create table depth_a (id int not null primary key); +create table depth_b (id int not null primary key); +create table depth_c (id int not null primary key); + +create function depth_a_tf() returns trigger + language plpgsql as $$ +begin + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + insert into depth_b values (new.id); + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + return new; +end; +$$; +create trigger depth_a_tr before insert on depth_a + for each row execute procedure depth_a_tf(); + +create function depth_b_tf() returns trigger + language plpgsql as $$ +begin + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + begin + execute 'insert into depth_c values (' || new.id::text || ')'; + exception + when sqlstate 'U9999' then + raise notice 'SQLSTATE = U9999: depth = %', pg_trigger_depth(); + end; + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + if new.id = 1 then + execute 'insert into depth_c values (' || new.id::text || ')'; + end if; + return new; +end; +$$; +create trigger depth_b_tr before insert on depth_b + for each row execute procedure depth_b_tf(); + +create function depth_c_tf() returns trigger + language plpgsql as $$ +begin + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + if new.id = 1 then + raise exception sqlstate 'U9999'; + end if; + raise notice '%: depth = %', tg_name, pg_trigger_depth(); + return new; +end; +$$; +create trigger depth_c_tr before insert on depth_c + for each row execute procedure depth_c_tf(); + +select pg_trigger_depth(); +insert into depth_a values (1); +select pg_trigger_depth(); +insert into depth_a values (2); +select pg_trigger_depth(); + +drop table depth_a, depth_b, depth_c; +drop function depth_a_tf(); +drop function depth_b_tf(); +drop function depth_c_tf(); + +-- +-- Test updates to rows during firing of BEFORE ROW triggers. +-- As of 9.2, such cases should be rejected (see bug #6123). +-- + +create temp table parent ( + aid int not null primary key, + val1 text, + val2 text, + val3 text, + val4 text, + bcnt int not null default 0); +create temp table child ( + bid int not null primary key, + aid int not null, + val1 text); + +create function parent_upd_func() + returns trigger language plpgsql as +$$ +begin + if old.val1 <> new.val1 then + new.val2 = new.val1; + delete from child where child.aid = new.aid and child.val1 = new.val1; + end if; + return new; +end; +$$; +create trigger parent_upd_trig before update on parent + for each row execute procedure parent_upd_func(); + +create function parent_del_func() + returns trigger language plpgsql as +$$ +begin + delete from child where aid = old.aid; + return old; +end; +$$; +create trigger parent_del_trig before delete on parent + for each row execute procedure parent_del_func(); + +create function child_ins_func() + returns trigger language plpgsql as +$$ +begin + update parent set bcnt = bcnt + 1 where aid = new.aid; + return new; +end; +$$; +create trigger child_ins_trig after insert on child + for each row execute procedure child_ins_func(); + +create function child_del_func() + returns trigger language plpgsql as +$$ +begin + update parent set bcnt = bcnt - 1 where aid = old.aid; + return old; +end; +$$; +create trigger child_del_trig after delete on child + for each row execute procedure child_del_func(); + +insert into parent values (1, 'a', 'a', 'a', 'a', 0); +insert into child values (10, 1, 'b'); +select * from parent; select * from child; + +update parent set val1 = 'b' where aid = 1; -- should fail +select * from parent; select * from child; + +delete from parent where aid = 1; -- should fail +select * from parent; select * from child; + +-- replace the trigger function with one that restarts the deletion after +-- having modified a child +create or replace function parent_del_func() + returns trigger language plpgsql as +$$ +begin + delete from child where aid = old.aid; + if found then + delete from parent where aid = old.aid; + return null; -- cancel outer deletion + end if; + return old; +end; +$$; + +delete from parent where aid = 1; +select * from parent; select * from child; + +drop table parent, child; + +drop function parent_upd_func(); +drop function parent_del_func(); +drop function child_ins_func(); +drop function child_del_func(); + +-- similar case, but with a self-referencing FK so that parent and child +-- rows can be affected by a single operation + +create temp table self_ref_trigger ( + id int primary key, + parent int references self_ref_trigger, + data text, + nchildren int not null default 0 +); + +create function self_ref_trigger_ins_func() + returns trigger language plpgsql as +$$ +begin + if new.parent is not null then + update self_ref_trigger set nchildren = nchildren + 1 + where id = new.parent; + end if; + return new; +end; +$$; +create trigger self_ref_trigger_ins_trig before insert on self_ref_trigger + for each row execute procedure self_ref_trigger_ins_func(); + +create function self_ref_trigger_del_func() + returns trigger language plpgsql as +$$ +begin + if old.parent is not null then + update self_ref_trigger set nchildren = nchildren - 1 + where id = old.parent; + end if; + return old; +end; +$$; +create trigger self_ref_trigger_del_trig before delete on self_ref_trigger + for each row execute procedure self_ref_trigger_del_func(); + +insert into self_ref_trigger values (1, null, 'root'); +insert into self_ref_trigger values (2, 1, 'root child A'); +insert into self_ref_trigger values (3, 1, 'root child B'); +insert into self_ref_trigger values (4, 2, 'grandchild 1'); +insert into self_ref_trigger values (5, 3, 'grandchild 2'); + +update self_ref_trigger set data = 'root!' where id = 1; + +select * from self_ref_trigger; + +delete from self_ref_trigger; + +select * from self_ref_trigger; + +drop table self_ref_trigger; +drop function self_ref_trigger_ins_func(); +drop function self_ref_trigger_del_func(); + +-- +-- Check that statement triggers work correctly even with all children excluded +-- + +create table stmt_trig_on_empty_upd (a int); +create table stmt_trig_on_empty_upd1 () inherits (stmt_trig_on_empty_upd); +create function update_stmt_notice() returns trigger as $$ +begin + raise notice 'updating %', TG_TABLE_NAME; + return null; +end; +$$ language plpgsql; +create trigger before_stmt_trigger + before update on stmt_trig_on_empty_upd + execute procedure update_stmt_notice(); +create trigger before_stmt_trigger + before update on stmt_trig_on_empty_upd1 + execute procedure update_stmt_notice(); + +-- inherited no-op update +update stmt_trig_on_empty_upd set a = a where false returning a+1 as aa; +-- simple no-op update +update stmt_trig_on_empty_upd1 set a = a where false returning a+1 as aa; + +drop table stmt_trig_on_empty_upd cascade; +drop function update_stmt_notice(); + +-- +-- Check that index creation (or DDL in general) is prohibited in a trigger +-- + +create table trigger_ddl_table ( + col1 integer, + col2 integer +); + +create function trigger_ddl_func() returns trigger as $$ +begin + alter table trigger_ddl_table add primary key (col1); + return new; +end$$ language plpgsql; + +create trigger trigger_ddl_func before insert on trigger_ddl_table for each row + execute procedure trigger_ddl_func(); + +insert into trigger_ddl_table values (1, 42); -- fail + +create or replace function trigger_ddl_func() returns trigger as $$ +begin + create index on trigger_ddl_table (col2); + return new; +end$$ language plpgsql; + +insert into trigger_ddl_table values (1, 42); -- fail + +drop table trigger_ddl_table; +drop function trigger_ddl_func(); + +-- +-- Verify behavior of before and after triggers with INSERT...ON CONFLICT +-- DO UPDATE +-- +create table upsert (key int4 primary key, color text); + +create function upsert_before_func() + returns trigger language plpgsql as +$$ +begin + if (TG_OP = 'UPDATE') then + raise warning 'before update (old): %', old.*::text; + raise warning 'before update (new): %', new.*::text; + elsif (TG_OP = 'INSERT') then + raise warning 'before insert (new): %', new.*::text; + if new.key % 2 = 0 then + new.key := new.key + 1; + new.color := new.color || ' trig modified'; + raise warning 'before insert (new, modified): %', new.*::text; + end if; + end if; + return new; +end; +$$; +create trigger upsert_before_trig before insert or update on upsert + for each row execute procedure upsert_before_func(); + +create function upsert_after_func() + returns trigger language plpgsql as +$$ +begin + if (TG_OP = 'UPDATE') then + raise warning 'after update (old): %', old.*::text; + raise warning 'after update (new): %', new.*::text; + elsif (TG_OP = 'INSERT') then + raise warning 'after insert (new): %', new.*::text; + end if; + return null; +end; +$$; +create trigger upsert_after_trig after insert or update on upsert + for each row execute procedure upsert_after_func(); + +insert into upsert values(1, 'black') on conflict (key) do update set color = 'updated ' || upsert.color; +insert into upsert values(2, 'red') on conflict (key) do update set color = 'updated ' || upsert.color; +insert into upsert values(3, 'orange') on conflict (key) do update set color = 'updated ' || upsert.color; +insert into upsert values(4, 'green') on conflict (key) do update set color = 'updated ' || upsert.color; +insert into upsert values(5, 'purple') on conflict (key) do update set color = 'updated ' || upsert.color; +insert into upsert values(6, 'white') on conflict (key) do update set color = 'updated ' || upsert.color; +insert into upsert values(7, 'pink') on conflict (key) do update set color = 'updated ' || upsert.color; +insert into upsert values(8, 'yellow') on conflict (key) do update set color = 'updated ' || upsert.color; + +select * from upsert; + +drop table upsert; +drop function upsert_before_func(); +drop function upsert_after_func(); + +-- +-- Verify that triggers with transition tables are not allowed on +-- views +-- + +create table my_table (i int); +create view my_view as select * from my_table; +create function my_trigger_function() returns trigger as $$ begin end; $$ language plpgsql; +create trigger my_trigger after update on my_view referencing old table as old_table + for each statement execute procedure my_trigger_function(); +drop function my_trigger_function(); +drop view my_view; +drop table my_table; + +-- +-- Verify cases that are unsupported with partitioned tables +-- +create table parted_trig (a int) partition by list (a); +create function trigger_nothing() returns trigger + language plpgsql as $$ begin end; $$; +create trigger failed instead of update on parted_trig + for each row execute procedure trigger_nothing(); +create trigger failed after update on parted_trig + referencing old table as old_table + for each row execute procedure trigger_nothing(); +drop table parted_trig; + +-- +-- Verify trigger creation for partitioned tables, and drop behavior +-- +create table trigpart (a int, b int) partition by range (a); +create table trigpart1 partition of trigpart for values from (0) to (1000); +create trigger trg1 after insert on trigpart for each row execute procedure trigger_nothing(); +create table trigpart2 partition of trigpart for values from (1000) to (2000); +create table trigpart3 (like trigpart); +alter table trigpart attach partition trigpart3 for values from (2000) to (3000); +create table trigpart4 partition of trigpart for values from (3000) to (4000) partition by range (a); +create table trigpart41 partition of trigpart4 for values from (3000) to (3500); +create table trigpart42 (like trigpart); +alter table trigpart4 attach partition trigpart42 for values from (3500) to (4000); +select tgrelid::regclass, tgname, tgfoid::regproc from pg_trigger + where tgrelid::regclass::text like 'trigpart%' order by tgrelid::regclass::text; +drop trigger trg1 on trigpart1; -- fail +drop trigger trg1 on trigpart2; -- fail +drop trigger trg1 on trigpart3; -- fail +drop table trigpart2; -- ok, trigger should be gone in that partition +select tgrelid::regclass, tgname, tgfoid::regproc from pg_trigger + where tgrelid::regclass::text like 'trigpart%' order by tgrelid::regclass::text; +drop trigger trg1 on trigpart; -- ok, all gone +select tgrelid::regclass, tgname, tgfoid::regproc from pg_trigger + where tgrelid::regclass::text like 'trigpart%' order by tgrelid::regclass::text; + +-- check detach behavior +create trigger trg1 after insert on trigpart for each row execute procedure trigger_nothing(); +\d trigpart3 +alter table trigpart detach partition trigpart3; +drop trigger trg1 on trigpart3; -- fail due to "does not exist" +alter table trigpart detach partition trigpart4; +drop trigger trg1 on trigpart41; -- fail due to "does not exist" +drop table trigpart4; +alter table trigpart attach partition trigpart3 for values from (2000) to (3000); +alter table trigpart detach partition trigpart3; +alter table trigpart attach partition trigpart3 for values from (2000) to (3000); +drop table trigpart3; + +select tgrelid::regclass::text, tgname, tgfoid::regproc, tgenabled, tgisinternal from pg_trigger + where tgname ~ '^trg1' order by 1; +create table trigpart3 (like trigpart); +create trigger trg1 after insert on trigpart3 for each row execute procedure trigger_nothing(); +\d trigpart3 +alter table trigpart attach partition trigpart3 FOR VALUES FROM (2000) to (3000); -- fail +drop table trigpart3; + +-- check display of unrelated triggers +create trigger samename after delete on trigpart execute function trigger_nothing(); +create trigger samename after delete on trigpart1 execute function trigger_nothing(); +\d trigpart1 + +drop table trigpart; +drop function trigger_nothing(); + +-- +-- Verify that triggers are fired for partitioned tables +-- +create table parted_stmt_trig (a int) partition by list (a); +create table parted_stmt_trig1 partition of parted_stmt_trig for values in (1); +create table parted_stmt_trig2 partition of parted_stmt_trig for values in (2); + +create table parted2_stmt_trig (a int) partition by list (a); +create table parted2_stmt_trig1 partition of parted2_stmt_trig for values in (1); +create table parted2_stmt_trig2 partition of parted2_stmt_trig for values in (2); + +create or replace function trigger_notice() returns trigger as $$ + begin + raise notice 'trigger % on % % % for %', TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL; + if TG_LEVEL = 'ROW' then + return NEW; + end if; + return null; + end; + $$ language plpgsql; + +-- insert/update/delete statement-level triggers on the parent +create trigger trig_ins_before before insert on parted_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_ins_after after insert on parted_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_upd_before before update on parted_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_upd_after after update on parted_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_del_before before delete on parted_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_del_after after delete on parted_stmt_trig + for each statement execute procedure trigger_notice(); + +-- insert/update/delete row-level triggers on the parent +create trigger trig_ins_after_parent after insert on parted_stmt_trig + for each row execute procedure trigger_notice(); +create trigger trig_upd_after_parent after update on parted_stmt_trig + for each row execute procedure trigger_notice(); +create trigger trig_del_after_parent after delete on parted_stmt_trig + for each row execute procedure trigger_notice(); + +-- insert/update/delete row-level triggers on the first partition +create trigger trig_ins_before_child before insert on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_ins_after_child after insert on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_upd_before_child before update on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_upd_after_child after update on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_del_before_child before delete on parted_stmt_trig1 + for each row execute procedure trigger_notice(); +create trigger trig_del_after_child after delete on parted_stmt_trig1 + for each row execute procedure trigger_notice(); + +-- insert/update/delete statement-level triggers on the parent +create trigger trig_ins_before_3 before insert on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_ins_after_3 after insert on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_upd_before_3 before update on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_upd_after_3 after update on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_del_before_3 before delete on parted2_stmt_trig + for each statement execute procedure trigger_notice(); +create trigger trig_del_after_3 after delete on parted2_stmt_trig + for each statement execute procedure trigger_notice(); + +with ins (a) as ( + insert into parted2_stmt_trig values (1), (2) returning a +) insert into parted_stmt_trig select a from ins returning tableoid::regclass, a; + +with upd as ( + update parted2_stmt_trig set a = a +) update parted_stmt_trig set a = a; + +delete from parted_stmt_trig; + +-- insert via copy on the parent +copy parted_stmt_trig(a) from stdin; +1 +2 +\. + +-- insert via copy on the first partition +copy parted_stmt_trig1(a) from stdin; +1 +\. + +-- Disabling a trigger in the parent table should disable children triggers too +alter table parted_stmt_trig disable trigger trig_ins_after_parent; +insert into parted_stmt_trig values (1); +alter table parted_stmt_trig enable trigger trig_ins_after_parent; +insert into parted_stmt_trig values (1); + +drop table parted_stmt_trig, parted2_stmt_trig; + +-- Verify that triggers fire in alphabetical order +create table parted_trig (a int) partition by range (a); +create table parted_trig_1 partition of parted_trig for values from (0) to (1000) + partition by range (a); +create table parted_trig_1_1 partition of parted_trig_1 for values from (0) to (100); +create table parted_trig_2 partition of parted_trig for values from (1000) to (2000); +create trigger zzz after insert on parted_trig for each row execute procedure trigger_notice(); +create trigger mmm after insert on parted_trig_1_1 for each row execute procedure trigger_notice(); +create trigger aaa after insert on parted_trig_1 for each row execute procedure trigger_notice(); +create trigger bbb after insert on parted_trig for each row execute procedure trigger_notice(); +create trigger qqq after insert on parted_trig_1_1 for each row execute procedure trigger_notice(); +insert into parted_trig values (50), (1500); +drop table parted_trig; + +-- Verify propagation of trigger arguments to partitions +create table parted_trig (a int) partition by list (a); +create table parted_trig1 partition of parted_trig for values in (1); +create or replace function trigger_notice() returns trigger as $$ + declare + arg1 text = TG_ARGV[0]; + arg2 integer = TG_ARGV[1]; + begin + raise notice 'trigger % on % % % for % args % %', + TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL, arg1, arg2; + return null; + end; + $$ language plpgsql; +create trigger aaa after insert on parted_trig + for each row execute procedure trigger_notice('quirky', 1); + +-- Verify propagation of trigger arguments to partitions attached after creating trigger +create table parted_trig2 partition of parted_trig for values in (2); +create table parted_trig3 (like parted_trig); +alter table parted_trig attach partition parted_trig3 for values in (3); +insert into parted_trig values (1), (2), (3); +drop table parted_trig; + +-- test irregular partitions (i.e., different column definitions), +-- including that the WHEN clause works +create function bark(text) returns bool language plpgsql immutable + as $$ begin raise notice '% <- woof!', $1; return true; end; $$; +create or replace function trigger_notice_ab() returns trigger as $$ + begin + raise notice 'trigger % on % % % for %: (a,b)=(%,%)', + TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL, + NEW.a, NEW.b; + if TG_LEVEL = 'ROW' then + return NEW; + end if; + return null; + end; + $$ language plpgsql; +create table parted_irreg_ancestor (fd text, b text, fd2 int, fd3 int, a int) + partition by range (b); +alter table parted_irreg_ancestor drop column fd, + drop column fd2, drop column fd3; +create table parted_irreg (fd int, a int, fd2 int, b text) + partition by range (b); +alter table parted_irreg drop column fd, drop column fd2; +alter table parted_irreg_ancestor attach partition parted_irreg + for values from ('aaaa') to ('zzzz'); +create table parted1_irreg (b text, fd int, a int); +alter table parted1_irreg drop column fd; +alter table parted_irreg attach partition parted1_irreg + for values from ('aaaa') to ('bbbb'); +create trigger parted_trig after insert on parted_irreg + for each row execute procedure trigger_notice_ab(); +create trigger parted_trig_odd after insert on parted_irreg for each row + when (bark(new.b) AND new.a % 2 = 1) execute procedure trigger_notice_ab(); +-- we should hear barking for every insert, but parted_trig_odd only emits +-- noise for odd values of a. parted_trig does it for all inserts. +insert into parted_irreg values (1, 'aardvark'), (2, 'aanimals'); +insert into parted1_irreg values ('aardwolf', 2); +insert into parted_irreg_ancestor values ('aasvogel', 3); +drop table parted_irreg_ancestor; + +-- Before triggers and partitions +create table parted (a int, b int, c text) partition by list (a); +create table parted_1 partition of parted for values in (1) + partition by list (b); +create table parted_1_1 partition of parted_1 for values in (1); +create function parted_trigfunc() returns trigger language plpgsql as $$ +begin + new.a = new.a + 1; + return new; +end; +$$; +insert into parted values (1, 1, 'uno uno v1'); -- works +create trigger t before insert or update or delete on parted + for each row execute function parted_trigfunc(); +insert into parted values (1, 1, 'uno uno v2'); -- fail +update parted set c = c || 'v3'; -- fail +create or replace function parted_trigfunc() returns trigger language plpgsql as $$ +begin + new.b = new.b + 1; + return new; +end; +$$; +insert into parted values (1, 1, 'uno uno v4'); -- fail +update parted set c = c || 'v5'; -- fail +create or replace function parted_trigfunc() returns trigger language plpgsql as $$ +begin + new.c = new.c || ' did '|| TG_OP; + return new; +end; +$$; +insert into parted values (1, 1, 'uno uno'); -- works +update parted set c = c || ' v6'; -- works +select tableoid::regclass, * from parted; + +-- update itself moves tuple to new partition; trigger still works +truncate table parted; +create table parted_2 partition of parted for values in (2); +insert into parted values (1, 1, 'uno uno v5'); +update parted set a = 2; +select tableoid::regclass, * from parted; + +-- both trigger and update change the partition +create or replace function parted_trigfunc2() returns trigger language plpgsql as $$ +begin + new.a = new.a + 1; + return new; +end; +$$; +create trigger t2 before update on parted + for each row execute function parted_trigfunc2(); +truncate table parted; +insert into parted values (1, 1, 'uno uno v6'); +create table parted_3 partition of parted for values in (3); +update parted set a = a + 1; +select tableoid::regclass, * from parted; +-- there's no partition for a=0, but this update works anyway because +-- the trigger causes the tuple to be routed to another partition +update parted set a = 0; +select tableoid::regclass, * from parted; + +drop table parted; +create table parted (a int, b int, c text) partition by list ((a + b)); +create or replace function parted_trigfunc() returns trigger language plpgsql as $$ +begin + new.a = new.a + new.b; + return new; +end; +$$; +create table parted_1 partition of parted for values in (1, 2); +create table parted_2 partition of parted for values in (3, 4); +create trigger t before insert or update on parted + for each row execute function parted_trigfunc(); +insert into parted values (0, 1, 'zero win'); +insert into parted values (1, 1, 'one fail'); +insert into parted values (1, 2, 'two fail'); +select * from parted; +drop table parted; +drop function parted_trigfunc(); + +-- +-- Constraint triggers and partitioned tables +create table parted_constr_ancestor (a int, b text) + partition by range (b); +create table parted_constr (a int, b text) + partition by range (b); +alter table parted_constr_ancestor attach partition parted_constr + for values from ('aaaa') to ('zzzz'); +create table parted1_constr (a int, b text); +alter table parted_constr attach partition parted1_constr + for values from ('aaaa') to ('bbbb'); +create constraint trigger parted_trig after insert on parted_constr_ancestor + deferrable + for each row execute procedure trigger_notice_ab(); +create constraint trigger parted_trig_two after insert on parted_constr + deferrable initially deferred + for each row when (bark(new.b) AND new.a % 2 = 1) + execute procedure trigger_notice_ab(); + +-- The immediate constraint is fired immediately; the WHEN clause of the +-- deferred constraint is also called immediately. The deferred constraint +-- is fired at commit time. +begin; +insert into parted_constr values (1, 'aardvark'); +insert into parted1_constr values (2, 'aardwolf'); +insert into parted_constr_ancestor values (3, 'aasvogel'); +commit; + +-- The WHEN clause is immediate, and both constraint triggers are fired at +-- commit time. +begin; +set constraints parted_trig deferred; +insert into parted_constr values (1, 'aardvark'); +insert into parted1_constr values (2, 'aardwolf'), (3, 'aasvogel'); +commit; +drop table parted_constr_ancestor; +drop function bark(text); + +-- Test that the WHEN clause is set properly to partitions +create table parted_trigger (a int, b text) partition by range (a); +create table parted_trigger_1 partition of parted_trigger for values from (0) to (1000); +create table parted_trigger_2 (drp int, a int, b text); +alter table parted_trigger_2 drop column drp; +alter table parted_trigger attach partition parted_trigger_2 for values from (1000) to (2000); +create trigger parted_trigger after update on parted_trigger + for each row when (new.a % 2 = 1 and length(old.b) >= 2) execute procedure trigger_notice_ab(); +create table parted_trigger_3 (b text, a int) partition by range (length(b)); +create table parted_trigger_3_1 partition of parted_trigger_3 for values from (1) to (3); +create table parted_trigger_3_2 partition of parted_trigger_3 for values from (3) to (5); +alter table parted_trigger attach partition parted_trigger_3 for values from (2000) to (3000); +insert into parted_trigger values + (0, 'a'), (1, 'bbb'), (2, 'bcd'), (3, 'c'), + (1000, 'c'), (1001, 'ddd'), (1002, 'efg'), (1003, 'f'), + (2000, 'e'), (2001, 'fff'), (2002, 'ghi'), (2003, 'h'); +update parted_trigger set a = a + 2; -- notice for odd 'a' values, long 'b' values +drop table parted_trigger; + +-- try a constraint trigger, also +create table parted_referenced (a int); +create table unparted_trigger (a int, b text); -- for comparison purposes +create table parted_trigger (a int, b text) partition by range (a); +create table parted_trigger_1 partition of parted_trigger for values from (0) to (1000); +create table parted_trigger_2 (drp int, a int, b text); +alter table parted_trigger_2 drop column drp; +alter table parted_trigger attach partition parted_trigger_2 for values from (1000) to (2000); +create constraint trigger parted_trigger after update on parted_trigger + from parted_referenced + for each row execute procedure trigger_notice_ab(); +create constraint trigger parted_trigger after update on unparted_trigger + from parted_referenced + for each row execute procedure trigger_notice_ab(); +create table parted_trigger_3 (b text, a int) partition by range (length(b)); +create table parted_trigger_3_1 partition of parted_trigger_3 for values from (1) to (3); +create table parted_trigger_3_2 partition of parted_trigger_3 for values from (3) to (5); +alter table parted_trigger attach partition parted_trigger_3 for values from (2000) to (3000); +select tgname, conname, t.tgrelid::regclass, t.tgconstrrelid::regclass, + c.conrelid::regclass, c.confrelid::regclass + from pg_trigger t join pg_constraint c on (t.tgconstraint = c.oid) + where tgname = 'parted_trigger' + order by t.tgrelid::regclass::text; +drop table parted_referenced, parted_trigger, unparted_trigger; + +-- verify that the "AFTER UPDATE OF columns" event is propagated correctly +create table parted_trigger (a int, b text) partition by range (a); +create table parted_trigger_1 partition of parted_trigger for values from (0) to (1000); +create table parted_trigger_2 (drp int, a int, b text); +alter table parted_trigger_2 drop column drp; +alter table parted_trigger attach partition parted_trigger_2 for values from (1000) to (2000); +create trigger parted_trigger after update of b on parted_trigger + for each row execute procedure trigger_notice_ab(); +create table parted_trigger_3 (b text, a int) partition by range (length(b)); +create table parted_trigger_3_1 partition of parted_trigger_3 for values from (1) to (4); +create table parted_trigger_3_2 partition of parted_trigger_3 for values from (4) to (8); +alter table parted_trigger attach partition parted_trigger_3 for values from (2000) to (3000); +insert into parted_trigger values (0, 'a'), (1000, 'c'), (2000, 'e'), (2001, 'eeee'); +update parted_trigger set a = a + 2; -- no notices here +update parted_trigger set b = b || 'b'; -- all triggers should fire +drop table parted_trigger; + +drop function trigger_notice_ab(); + +-- Make sure we don't end up with unnecessary copies of triggers, when +-- cloning them. +create table trg_clone (a int) partition by range (a); +create table trg_clone1 partition of trg_clone for values from (0) to (1000); +alter table trg_clone add constraint uniq unique (a) deferrable; +create table trg_clone2 partition of trg_clone for values from (1000) to (2000); +create table trg_clone3 partition of trg_clone for values from (2000) to (3000) + partition by range (a); +create table trg_clone_3_3 partition of trg_clone3 for values from (2000) to (2100); +select tgrelid::regclass, count(*) from pg_trigger + where tgrelid::regclass in ('trg_clone', 'trg_clone1', 'trg_clone2', + 'trg_clone3', 'trg_clone_3_3') + group by tgrelid::regclass order by tgrelid::regclass; +drop table trg_clone; + +-- Test the interaction between ALTER TABLE .. DISABLE TRIGGER and +-- both kinds of inheritance. Historically, legacy inheritance has +-- not recursed to children, so that behavior is preserved. +create table parent (a int); +create table child1 () inherits (parent); +create function trig_nothing() returns trigger language plpgsql + as $$ begin return null; end $$; +create trigger tg after insert on parent + for each row execute function trig_nothing(); +create trigger tg after insert on child1 + for each row execute function trig_nothing(); +alter table parent disable trigger tg; +select tgrelid::regclass, tgname, tgenabled from pg_trigger + where tgrelid in ('parent'::regclass, 'child1'::regclass) + order by tgrelid::regclass::text; +alter table only parent enable always trigger tg; +select tgrelid::regclass, tgname, tgenabled from pg_trigger + where tgrelid in ('parent'::regclass, 'child1'::regclass) + order by tgrelid::regclass::text; +drop table parent, child1; + +create table parent (a int) partition by list (a); +create table child1 partition of parent for values in (1); +create trigger tg after insert on parent + for each row execute procedure trig_nothing(); +select tgrelid::regclass, tgname, tgenabled from pg_trigger + where tgrelid in ('parent'::regclass, 'child1'::regclass) + order by tgrelid::regclass::text; +alter table only parent enable always trigger tg; +select tgrelid::regclass, tgname, tgenabled from pg_trigger + where tgrelid in ('parent'::regclass, 'child1'::regclass) + order by tgrelid::regclass::text; +drop table parent, child1; + +-- Verify that firing state propagates correctly on creation, too +CREATE TABLE trgfire (i int) PARTITION BY RANGE (i); +CREATE TABLE trgfire1 PARTITION OF trgfire FOR VALUES FROM (1) TO (10); +CREATE OR REPLACE FUNCTION tgf() RETURNS trigger LANGUAGE plpgsql + AS $$ begin raise exception 'except'; end $$; +CREATE TRIGGER tg AFTER INSERT ON trgfire FOR EACH ROW EXECUTE FUNCTION tgf(); +INSERT INTO trgfire VALUES (1); +ALTER TABLE trgfire DISABLE TRIGGER tg; +INSERT INTO trgfire VALUES (1); +CREATE TABLE trgfire2 PARTITION OF trgfire FOR VALUES FROM (10) TO (20); +INSERT INTO trgfire VALUES (11); +CREATE TABLE trgfire3 (LIKE trgfire); +ALTER TABLE trgfire ATTACH PARTITION trgfire3 FOR VALUES FROM (20) TO (30); +INSERT INTO trgfire VALUES (21); +CREATE TABLE trgfire4 PARTITION OF trgfire FOR VALUES FROM (30) TO (40) PARTITION BY LIST (i); +CREATE TABLE trgfire4_30 PARTITION OF trgfire4 FOR VALUES IN (30); +INSERT INTO trgfire VALUES (30); +CREATE TABLE trgfire5 (LIKE trgfire) PARTITION BY LIST (i); +CREATE TABLE trgfire5_40 PARTITION OF trgfire5 FOR VALUES IN (40); +ALTER TABLE trgfire ATTACH PARTITION trgfire5 FOR VALUES FROM (40) TO (50); +INSERT INTO trgfire VALUES (40); +SELECT tgrelid::regclass, tgenabled FROM pg_trigger + WHERE tgrelid::regclass IN (SELECT oid from pg_class where relname LIKE 'trgfire%') + ORDER BY tgrelid::regclass::text; +ALTER TABLE trgfire ENABLE TRIGGER tg; +INSERT INTO trgfire VALUES (1); +INSERT INTO trgfire VALUES (11); +INSERT INTO trgfire VALUES (21); +INSERT INTO trgfire VALUES (30); +INSERT INTO trgfire VALUES (40); +DROP TABLE trgfire; +DROP FUNCTION tgf(); + +-- +-- Test the interaction between transition tables and both kinds of +-- inheritance. We'll dump the contents of the transition tables in a +-- format that shows the attribute order, so that we can distinguish +-- tuple formats (though not dropped attributes). +-- + +create or replace function dump_insert() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, new table = %', + TG_NAME, + (select string_agg(new_table::text, ', ' order by a) from new_table); + return null; + end; +$$; + +create or replace function dump_update() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, old table = %, new table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' order by a) from old_table), + (select string_agg(new_table::text, ', ' order by a) from new_table); + return null; + end; +$$; + +create or replace function dump_delete() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, old table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' order by a) from old_table); + return null; + end; +$$; + +-- +-- Verify behavior of statement triggers on partition hierarchy with +-- transition tables. Tuples should appear to each trigger in the +-- format of the relation the trigger is attached to. +-- + +-- set up a partition hierarchy with some different TupleDescriptors +create table parent (a text, b int) partition by list (a); + +-- a child matching parent +create table child1 partition of parent for values in ('AAA'); + +-- a child with a dropped column +create table child2 (x int, a text, b int); +alter table child2 drop column x; +alter table parent attach partition child2 for values in ('BBB'); + +-- a child with a different column order +create table child3 (b int, a text); +alter table parent attach partition child3 for values in ('CCC'); + +create trigger parent_insert_trig + after insert on parent referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger parent_update_trig + after update on parent referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger parent_delete_trig + after delete on parent referencing old table as old_table + for each statement execute procedure dump_delete(); + +create trigger child1_insert_trig + after insert on child1 referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger child1_update_trig + after update on child1 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger child1_delete_trig + after delete on child1 referencing old table as old_table + for each statement execute procedure dump_delete(); + +create trigger child2_insert_trig + after insert on child2 referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger child2_update_trig + after update on child2 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger child2_delete_trig + after delete on child2 referencing old table as old_table + for each statement execute procedure dump_delete(); + +create trigger child3_insert_trig + after insert on child3 referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger child3_update_trig + after update on child3 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger child3_delete_trig + after delete on child3 referencing old table as old_table + for each statement execute procedure dump_delete(); + +SELECT trigger_name, event_manipulation, event_object_schema, event_object_table, + action_order, action_condition, action_orientation, action_timing, + action_reference_old_table, action_reference_new_table + FROM information_schema.triggers + WHERE event_object_table IN ('parent', 'child1', 'child2', 'child3') + ORDER BY trigger_name COLLATE "C", 2; + +-- insert directly into children sees respective child-format tuples +insert into child1 values ('AAA', 42); +insert into child2 values ('BBB', 42); +insert into child3 values (42, 'CCC'); + +-- update via parent sees parent-format tuples +update parent set b = b + 1; + +-- delete via parent sees parent-format tuples +delete from parent; + +-- insert into parent sees parent-format tuples +insert into parent values ('AAA', 42); +insert into parent values ('BBB', 42); +insert into parent values ('CCC', 42); + +-- delete from children sees respective child-format tuples +delete from child1; +delete from child2; +delete from child3; + +-- copy into parent sees parent-format tuples +copy parent (a, b) from stdin; +AAA 42 +BBB 42 +CCC 42 +\. + +-- DML affecting parent sees tuples collected from children even if +-- there is no transition table trigger on the children +drop trigger child1_insert_trig on child1; +drop trigger child1_update_trig on child1; +drop trigger child1_delete_trig on child1; +drop trigger child2_insert_trig on child2; +drop trigger child2_update_trig on child2; +drop trigger child2_delete_trig on child2; +drop trigger child3_insert_trig on child3; +drop trigger child3_update_trig on child3; +drop trigger child3_delete_trig on child3; +delete from parent; + +-- copy into parent sees tuples collected from children even if there +-- is no transition-table trigger on the children +copy parent (a, b) from stdin; +AAA 42 +BBB 42 +CCC 42 +\. + +-- insert into parent with a before trigger on a child tuple before +-- insertion, and we capture the newly modified row in parent format +create or replace function intercept_insert() returns trigger language plpgsql as +$$ + begin + new.b = new.b + 1000; + return new; + end; +$$; + +create trigger intercept_insert_child3 + before insert on child3 + for each row execute procedure intercept_insert(); + + +-- insert, parent trigger sees post-modification parent-format tuple +insert into parent values ('AAA', 42), ('BBB', 42), ('CCC', 66); + +-- copy, parent trigger sees post-modification parent-format tuple +copy parent (a, b) from stdin; +AAA 42 +BBB 42 +CCC 234 +\. + +drop table child1, child2, child3, parent; +drop function intercept_insert(); + +-- +-- Verify prohibition of row triggers with transition triggers on +-- partitions +-- +create table parent (a text, b int) partition by list (a); +create table child partition of parent for values in ('AAA'); + +-- adding row trigger with transition table fails +create trigger child_row_trig + after insert on child referencing new table as new_table + for each row execute procedure dump_insert(); + +-- detaching it first works +alter table parent detach partition child; + +create trigger child_row_trig + after insert on child referencing new table as new_table + for each row execute procedure dump_insert(); + +-- but now we're not allowed to reattach it +alter table parent attach partition child for values in ('AAA'); + +-- drop the trigger, and now we're allowed to attach it again +drop trigger child_row_trig on child; +alter table parent attach partition child for values in ('AAA'); + +drop table child, parent; + +-- +-- Verify behavior of statement triggers on (non-partition) +-- inheritance hierarchy with transition tables; similar to the +-- partition case, except there is no rerouting on insertion and child +-- tables can have extra columns +-- + +-- set up inheritance hierarchy with different TupleDescriptors +create table parent (a text, b int); + +-- a child matching parent +create table child1 () inherits (parent); + +-- a child with a different column order +create table child2 (b int, a text); +alter table child2 inherit parent; + +-- a child with an extra column +create table child3 (c text) inherits (parent); + +create trigger parent_insert_trig + after insert on parent referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger parent_update_trig + after update on parent referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger parent_delete_trig + after delete on parent referencing old table as old_table + for each statement execute procedure dump_delete(); + +create trigger child1_insert_trig + after insert on child1 referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger child1_update_trig + after update on child1 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger child1_delete_trig + after delete on child1 referencing old table as old_table + for each statement execute procedure dump_delete(); + +create trigger child2_insert_trig + after insert on child2 referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger child2_update_trig + after update on child2 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger child2_delete_trig + after delete on child2 referencing old table as old_table + for each statement execute procedure dump_delete(); + +create trigger child3_insert_trig + after insert on child3 referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger child3_update_trig + after update on child3 referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger child3_delete_trig + after delete on child3 referencing old table as old_table + for each statement execute procedure dump_delete(); + +-- insert directly into children sees respective child-format tuples +insert into child1 values ('AAA', 42); +insert into child2 values (42, 'BBB'); +insert into child3 values ('CCC', 42, 'foo'); + +-- update via parent sees parent-format tuples +update parent set b = b + 1; + +-- delete via parent sees parent-format tuples +delete from parent; + +-- reinsert values into children for next test... +insert into child1 values ('AAA', 42); +insert into child2 values (42, 'BBB'); +insert into child3 values ('CCC', 42, 'foo'); + +-- delete from children sees respective child-format tuples +delete from child1; +delete from child2; +delete from child3; + +-- copy into parent sees parent-format tuples (no rerouting, so these +-- are really inserted into the parent) +copy parent (a, b) from stdin; +AAA 42 +BBB 42 +CCC 42 +\. + +-- same behavior for copy if there is an index (interesting because rows are +-- captured by a different code path in copyfrom.c if there are indexes) +create index on parent(b); +copy parent (a, b) from stdin; +DDD 42 +\. + +-- DML affecting parent sees tuples collected from children even if +-- there is no transition table trigger on the children +drop trigger child1_insert_trig on child1; +drop trigger child1_update_trig on child1; +drop trigger child1_delete_trig on child1; +drop trigger child2_insert_trig on child2; +drop trigger child2_update_trig on child2; +drop trigger child2_delete_trig on child2; +drop trigger child3_insert_trig on child3; +drop trigger child3_update_trig on child3; +drop trigger child3_delete_trig on child3; +delete from parent; + +drop table child1, child2, child3, parent; + +-- +-- Verify prohibition of row triggers with transition triggers on +-- inheritance children +-- +create table parent (a text, b int); +create table child () inherits (parent); + +-- adding row trigger with transition table fails +create trigger child_row_trig + after insert on child referencing new table as new_table + for each row execute procedure dump_insert(); + +-- disinheriting it first works +alter table child no inherit parent; + +create trigger child_row_trig + after insert on child referencing new table as new_table + for each row execute procedure dump_insert(); + +-- but now we're not allowed to make it inherit anymore +alter table child inherit parent; + +-- drop the trigger, and now we're allowed to make it inherit again +drop trigger child_row_trig on child; +alter table child inherit parent; + +drop table child, parent; + +-- +-- Verify behavior of queries with wCTEs, where multiple transition +-- tuplestores can be active at the same time because there are +-- multiple DML statements that might fire triggers with transition +-- tables +-- +create table table1 (a int); +create table table2 (a text); +create trigger table1_trig + after insert on table1 referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger table2_trig + after insert on table2 referencing new table as new_table + for each statement execute procedure dump_insert(); + +with wcte as (insert into table1 values (42)) + insert into table2 values ('hello world'); + +with wcte as (insert into table1 values (43)) + insert into table1 values (44); + +select * from table1; +select * from table2; + +drop table table1; +drop table table2; + +-- +-- Verify behavior of INSERT ... ON CONFLICT DO UPDATE ... with +-- transition tables. +-- + +create table my_table (a int primary key, b text); +create trigger my_table_insert_trig + after insert on my_table referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger my_table_update_trig + after update on my_table referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); + +-- inserts only +insert into my_table values (1, 'AAA'), (2, 'BBB') + on conflict (a) do + update set b = my_table.b || ':' || excluded.b; + +-- mixture of inserts and updates +insert into my_table values (1, 'AAA'), (2, 'BBB'), (3, 'CCC'), (4, 'DDD') + on conflict (a) do + update set b = my_table.b || ':' || excluded.b; + +-- updates only +insert into my_table values (3, 'CCC'), (4, 'DDD') + on conflict (a) do + update set b = my_table.b || ':' || excluded.b; + +-- +-- now using a partitioned table +-- + +create table iocdu_tt_parted (a int primary key, b text) partition by list (a); +create table iocdu_tt_parted1 partition of iocdu_tt_parted for values in (1); +create table iocdu_tt_parted2 partition of iocdu_tt_parted for values in (2); +create table iocdu_tt_parted3 partition of iocdu_tt_parted for values in (3); +create table iocdu_tt_parted4 partition of iocdu_tt_parted for values in (4); +create trigger iocdu_tt_parted_insert_trig + after insert on iocdu_tt_parted referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger iocdu_tt_parted_update_trig + after update on iocdu_tt_parted referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); + +-- inserts only +insert into iocdu_tt_parted values (1, 'AAA'), (2, 'BBB') + on conflict (a) do + update set b = iocdu_tt_parted.b || ':' || excluded.b; + +-- mixture of inserts and updates +insert into iocdu_tt_parted values (1, 'AAA'), (2, 'BBB'), (3, 'CCC'), (4, 'DDD') + on conflict (a) do + update set b = iocdu_tt_parted.b || ':' || excluded.b; + +-- updates only +insert into iocdu_tt_parted values (3, 'CCC'), (4, 'DDD') + on conflict (a) do + update set b = iocdu_tt_parted.b || ':' || excluded.b; + +drop table iocdu_tt_parted; + +-- +-- Verify that you can't create a trigger with transition tables for +-- more than one event. +-- + +create trigger my_table_multievent_trig + after insert or update on my_table referencing new table as new_table + for each statement execute procedure dump_insert(); + +-- +-- Verify that you can't create a trigger with transition tables with +-- a column list. +-- + +create trigger my_table_col_update_trig + after update of b on my_table referencing new table as new_table + for each statement execute procedure dump_insert(); + +drop table my_table; + +-- +-- Test firing of triggers with transition tables by foreign key cascades +-- + +create table refd_table (a int primary key, b text); +create table trig_table (a int, b text, + foreign key (a) references refd_table on update cascade on delete cascade +); + +create trigger trig_table_before_trig + before insert or update or delete on trig_table + for each statement execute procedure trigger_func('trig_table'); +create trigger trig_table_insert_trig + after insert on trig_table referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger trig_table_update_trig + after update on trig_table referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger trig_table_delete_trig + after delete on trig_table referencing old table as old_table + for each statement execute procedure dump_delete(); + +insert into refd_table values + (1, 'one'), + (2, 'two'), + (3, 'three'); +insert into trig_table values + (1, 'one a'), + (1, 'one b'), + (2, 'two a'), + (2, 'two b'), + (3, 'three a'), + (3, 'three b'); + +update refd_table set a = 11 where b = 'one'; + +select * from trig_table; + +delete from refd_table where length(b) = 3; + +select * from trig_table; + +drop table refd_table, trig_table; + +-- +-- self-referential FKs are even more fun +-- + +create table self_ref (a int primary key, + b int references self_ref(a) on delete cascade); + +create trigger self_ref_before_trig + before delete on self_ref + for each statement execute procedure trigger_func('self_ref'); +create trigger self_ref_r_trig + after delete on self_ref referencing old table as old_table + for each row execute procedure dump_delete(); +create trigger self_ref_s_trig + after delete on self_ref referencing old table as old_table + for each statement execute procedure dump_delete(); + +insert into self_ref values (1, null), (2, 1), (3, 2); + +delete from self_ref where a = 1; + +-- without AR trigger, cascaded deletes all end up in one transition table +drop trigger self_ref_r_trig on self_ref; + +insert into self_ref values (1, null), (2, 1), (3, 2), (4, 3); + +delete from self_ref where a = 1; + +drop table self_ref; + +-- cleanup +drop function dump_insert(); +drop function dump_update(); +drop function dump_delete(); + +-- +-- Tests for CREATE OR REPLACE TRIGGER +-- +create table my_table (id integer); + +create function funcA() returns trigger as $$ +begin + raise notice 'hello from funcA'; + return null; +end; $$ language plpgsql; + +create function funcB() returns trigger as $$ +begin + raise notice 'hello from funcB'; + return null; +end; $$ language plpgsql; + +create trigger my_trig + after insert on my_table + for each row execute procedure funcA(); + +create trigger my_trig + before insert on my_table + for each row execute procedure funcB(); -- should fail + +insert into my_table values (1); + +create or replace trigger my_trig + before insert on my_table + for each row execute procedure funcB(); -- OK + +insert into my_table values (2); -- this insert should become a no-op + +table my_table; + +drop table my_table; + +-- test CREATE OR REPLACE TRIGGER on partition table +create table parted_trig (a int) partition by range (a); +create table parted_trig_1 partition of parted_trig + for values from (0) to (1000) partition by range (a); +create table parted_trig_1_1 partition of parted_trig_1 for values from (0) to (100); +create table parted_trig_2 partition of parted_trig for values from (1000) to (2000); +create table default_parted_trig partition of parted_trig default; + +-- test that trigger can be replaced by another one +-- at the same level of partition table +create or replace trigger my_trig + after insert on parted_trig + for each row execute procedure funcA(); +insert into parted_trig (a) values (50); +create or replace trigger my_trig + after insert on parted_trig + for each row execute procedure funcB(); +insert into parted_trig (a) values (50); + +-- test that child trigger cannot be replaced directly +create or replace trigger my_trig + after insert on parted_trig + for each row execute procedure funcA(); +insert into parted_trig (a) values (50); +create or replace trigger my_trig + after insert on parted_trig_1 + for each row execute procedure funcB(); -- should fail +insert into parted_trig (a) values (50); +drop trigger my_trig on parted_trig; +insert into parted_trig (a) values (50); + +-- test that user trigger can be overwritten by one defined at upper level +create trigger my_trig + after insert on parted_trig_1 + for each row execute procedure funcA(); +insert into parted_trig (a) values (50); +create trigger my_trig + after insert on parted_trig + for each row execute procedure funcB(); -- should fail +insert into parted_trig (a) values (50); +create or replace trigger my_trig + after insert on parted_trig + for each row execute procedure funcB(); +insert into parted_trig (a) values (50); + +-- cleanup +drop table parted_trig; +drop function funcA(); +drop function funcB(); + +-- Leave around some objects for other tests +create table trigger_parted (a int primary key) partition by list (a); +create function trigger_parted_trigfunc() returns trigger language plpgsql as + $$ begin end; $$; +create trigger aft_row after insert or update on trigger_parted + for each row execute function trigger_parted_trigfunc(); +create table trigger_parted_p1 partition of trigger_parted for values in (1) + partition by list (a); +create table trigger_parted_p1_1 partition of trigger_parted_p1 for values in (1); +create table trigger_parted_p2 partition of trigger_parted for values in (2) + partition by list (a); +create table trigger_parted_p2_2 partition of trigger_parted_p2 for values in (2); +alter table only trigger_parted_p2 disable trigger aft_row; +alter table trigger_parted_p2_2 enable always trigger aft_row; + +-- verify transition table conversion slot's lifetime +-- https://postgr.es/m/39a71864-b120-5a5c-8cc5-c632b6f16761@amazon.com +create table convslot_test_parent (col1 text primary key); +create table convslot_test_child (col1 text primary key, + foreign key (col1) references convslot_test_parent(col1) on delete cascade on update cascade +); + +alter table convslot_test_child add column col2 text not null default 'tutu'; +insert into convslot_test_parent(col1) values ('1'); +insert into convslot_test_child(col1) values ('1'); +insert into convslot_test_parent(col1) values ('3'); +insert into convslot_test_child(col1) values ('3'); + +create or replace function trigger_function1() +returns trigger +language plpgsql +AS $$ +begin +raise notice 'trigger = %, old_table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' order by col1) from old_table); +return null; +end; $$; + +create or replace function trigger_function2() +returns trigger +language plpgsql +AS $$ +begin +raise notice 'trigger = %, new table = %', + TG_NAME, + (select string_agg(new_table::text, ', ' order by col1) from new_table); +return null; +end; $$; + +create trigger but_trigger after update on convslot_test_child +referencing new table as new_table +for each statement execute function trigger_function2(); + +update convslot_test_parent set col1 = col1 || '1'; + +create or replace function trigger_function3() +returns trigger +language plpgsql +AS $$ +begin +raise notice 'trigger = %, old_table = %, new table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' order by col1) from old_table), + (select string_agg(new_table::text, ', ' order by col1) from new_table); +return null; +end; $$; + +create trigger but_trigger2 after update on convslot_test_child +referencing old table as old_table new table as new_table +for each statement execute function trigger_function3(); +update convslot_test_parent set col1 = col1 || '1'; + +create trigger bdt_trigger after delete on convslot_test_child +referencing old table as old_table +for each statement execute function trigger_function1(); +delete from convslot_test_parent; + +drop table convslot_test_child, convslot_test_parent; diff --git a/src/test/singlenode_regress/sql/truncate.sql b/src/test/singlenode_regress/sql/truncate.sql new file mode 100644 index 00000000000..e560a8c21ce --- /dev/null +++ b/src/test/singlenode_regress/sql/truncate.sql @@ -0,0 +1,329 @@ +-- Test basic TRUNCATE functionality. +CREATE TABLE truncate_a (col1 integer primary key); +INSERT INTO truncate_a VALUES (1); +INSERT INTO truncate_a VALUES (2); +SELECT * FROM truncate_a; +-- Roll truncate back +BEGIN; +TRUNCATE truncate_a; +ROLLBACK; +SELECT * FROM truncate_a; +-- Commit the truncate this time +BEGIN; +TRUNCATE truncate_a; +COMMIT; +SELECT * FROM truncate_a; + +-- Test foreign-key checks +CREATE TABLE trunc_b (a int REFERENCES truncate_a); +CREATE TABLE trunc_c (a serial PRIMARY KEY); +CREATE TABLE trunc_d (a int REFERENCES trunc_c); +CREATE TABLE trunc_e (a int REFERENCES truncate_a, b int REFERENCES trunc_c); + +TRUNCATE TABLE truncate_a; -- fail +TRUNCATE TABLE truncate_a,trunc_b; -- fail +TRUNCATE TABLE truncate_a,trunc_b,trunc_e; -- ok +TRUNCATE TABLE truncate_a,trunc_e; -- fail +TRUNCATE TABLE trunc_c; -- fail +TRUNCATE TABLE trunc_c,trunc_d; -- fail +TRUNCATE TABLE trunc_c,trunc_d,trunc_e; -- ok +TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a; -- fail +TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a,trunc_b; -- ok + +TRUNCATE TABLE truncate_a RESTRICT; -- fail +TRUNCATE TABLE truncate_a CASCADE; -- ok + +-- circular references +ALTER TABLE truncate_a ADD FOREIGN KEY (col1) REFERENCES trunc_c; + +-- Add some data to verify that truncating actually works ... +INSERT INTO trunc_c VALUES (1); +INSERT INTO truncate_a VALUES (1); +INSERT INTO trunc_b VALUES (1); +INSERT INTO trunc_d VALUES (1); +INSERT INTO trunc_e VALUES (1,1); +TRUNCATE TABLE trunc_c; +TRUNCATE TABLE trunc_c,truncate_a; +TRUNCATE TABLE trunc_c,truncate_a,trunc_d; +TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e; +TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e,trunc_b; + +-- Verify that truncating did actually work +SELECT * FROM truncate_a + UNION ALL + SELECT * FROM trunc_c + UNION ALL + SELECT * FROM trunc_b + UNION ALL + SELECT * FROM trunc_d; +SELECT * FROM trunc_e; + +-- Add data again to test TRUNCATE ... CASCADE +INSERT INTO trunc_c VALUES (1); +INSERT INTO truncate_a VALUES (1); +INSERT INTO trunc_b VALUES (1); +INSERT INTO trunc_d VALUES (1); +INSERT INTO trunc_e VALUES (1,1); + +TRUNCATE TABLE trunc_c CASCADE; -- ok + +SELECT * FROM truncate_a + UNION ALL + SELECT * FROM trunc_c + UNION ALL + SELECT * FROM trunc_b + UNION ALL + SELECT * FROM trunc_d; +SELECT * FROM trunc_e; + +DROP TABLE truncate_a,trunc_c,trunc_b,trunc_d,trunc_e CASCADE; + +-- Test TRUNCATE with inheritance + +CREATE TABLE trunc_f (col1 integer primary key); +INSERT INTO trunc_f VALUES (1); +INSERT INTO trunc_f VALUES (2); + +CREATE TABLE trunc_fa (col2a text) INHERITS (trunc_f); +INSERT INTO trunc_fa VALUES (3, 'three'); + +CREATE TABLE trunc_fb (col2b int) INHERITS (trunc_f); +INSERT INTO trunc_fb VALUES (4, 444); + +CREATE TABLE trunc_faa (col3 text) INHERITS (trunc_fa); +INSERT INTO trunc_faa VALUES (5, 'five', 'FIVE'); + +BEGIN; +SELECT * FROM trunc_f; +TRUNCATE trunc_f; +SELECT * FROM trunc_f; +ROLLBACK; + +BEGIN; +SELECT * FROM trunc_f; +TRUNCATE ONLY trunc_f; +SELECT * FROM trunc_f; +ROLLBACK; + +BEGIN; +SELECT * FROM trunc_f; +SELECT * FROM trunc_fa; +SELECT * FROM trunc_faa; +TRUNCATE ONLY trunc_fb, ONLY trunc_fa; +SELECT * FROM trunc_f; +SELECT * FROM trunc_fa; +SELECT * FROM trunc_faa; +ROLLBACK; + +BEGIN; +SELECT * FROM trunc_f; +SELECT * FROM trunc_fa; +SELECT * FROM trunc_faa; +TRUNCATE ONLY trunc_fb, trunc_fa; +SELECT * FROM trunc_f; +SELECT * FROM trunc_fa; +SELECT * FROM trunc_faa; +ROLLBACK; + +DROP TABLE trunc_f CASCADE; + +-- Test ON TRUNCATE triggers + +CREATE TABLE trunc_trigger_test (f1 int, f2 text, f3 text); +CREATE TABLE trunc_trigger_log (tgop text, tglevel text, tgwhen text, + tgargv text, tgtable name, rowcount bigint); + +CREATE FUNCTION trunctrigger() RETURNS trigger as $$ +declare c bigint; +begin + execute 'select count(*) from ' || quote_ident(tg_table_name) into c; + insert into trunc_trigger_log values + (TG_OP, TG_LEVEL, TG_WHEN, TG_ARGV[0], tg_table_name, c); + return null; +end; +$$ LANGUAGE plpgsql; + +-- basic before trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); + +CREATE TRIGGER t +BEFORE TRUNCATE ON trunc_trigger_test +FOR EACH STATEMENT +EXECUTE PROCEDURE trunctrigger('before trigger truncate'); + +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +SELECT * FROM trunc_trigger_log; +TRUNCATE trunc_trigger_test; +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +SELECT * FROM trunc_trigger_log; + +DROP TRIGGER t ON trunc_trigger_test; + +truncate trunc_trigger_log; + +-- same test with an after trigger +INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux'); + +CREATE TRIGGER tt +AFTER TRUNCATE ON trunc_trigger_test +FOR EACH STATEMENT +EXECUTE PROCEDURE trunctrigger('after trigger truncate'); + +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +SELECT * FROM trunc_trigger_log; +TRUNCATE trunc_trigger_test; +SELECT count(*) as "Row count in test table" FROM trunc_trigger_test; +SELECT * FROM trunc_trigger_log; + +DROP TABLE trunc_trigger_test; +DROP TABLE trunc_trigger_log; + +DROP FUNCTION trunctrigger(); + +-- test TRUNCATE ... RESTART IDENTITY +CREATE SEQUENCE truncate_a_id1 START WITH 33 CACHE 1; +CREATE TABLE truncate_a (id serial, + id1 integer default nextval('truncate_a_id1')); +ALTER SEQUENCE truncate_a_id1 OWNED BY truncate_a.id1; + +INSERT INTO truncate_a DEFAULT VALUES; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; + +TRUNCATE truncate_a; + +INSERT INTO truncate_a DEFAULT VALUES; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; + +TRUNCATE truncate_a RESTART IDENTITY; + +INSERT INTO truncate_a DEFAULT VALUES; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; + +CREATE TABLE truncate_b (id int GENERATED ALWAYS AS IDENTITY (START WITH 44)); + +INSERT INTO truncate_b DEFAULT VALUES; +INSERT INTO truncate_b DEFAULT VALUES; +SELECT * FROM truncate_b; + +TRUNCATE truncate_b; + +INSERT INTO truncate_b DEFAULT VALUES; +INSERT INTO truncate_b DEFAULT VALUES; +SELECT * FROM truncate_b; + +TRUNCATE truncate_b RESTART IDENTITY; + +INSERT INTO truncate_b DEFAULT VALUES; +INSERT INTO truncate_b DEFAULT VALUES; +SELECT * FROM truncate_b; + +-- check rollback of a RESTART IDENTITY operation +BEGIN; +TRUNCATE truncate_a RESTART IDENTITY; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; +ROLLBACK; +INSERT INTO truncate_a DEFAULT VALUES; +INSERT INTO truncate_a DEFAULT VALUES; +SELECT * FROM truncate_a; +DROP TABLE truncate_a; + +SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped + +-- partitioned table +CREATE TABLE truncparted (a int, b char) PARTITION BY LIST (a); +-- error, can't truncate a partitioned table +TRUNCATE ONLY truncparted; +CREATE TABLE truncparted1 PARTITION OF truncparted FOR VALUES IN (1); +INSERT INTO truncparted VALUES (1, 'a'); +-- error, must truncate partitions +TRUNCATE ONLY truncparted; +TRUNCATE truncparted; +DROP TABLE truncparted; + +-- foreign key on partitioned table: partition key is referencing column. +-- Make sure truncate did execute on all tables +CREATE FUNCTION tp_ins_data() RETURNS void LANGUAGE plpgsql AS $$ + BEGIN + INSERT INTO truncprim VALUES (1), (100), (150); + INSERT INTO truncpart VALUES (1), (100), (150); + END +$$; +CREATE FUNCTION tp_chk_data(OUT pktb regclass, OUT pkval int, OUT fktb regclass, OUT fkval int) + RETURNS SETOF record LANGUAGE plpgsql AS $$ + BEGIN + RETURN QUERY SELECT + pk.tableoid::regclass, pk.a, fk.tableoid::regclass, fk.a + FROM truncprim pk FULL JOIN truncpart fk USING (a) + ORDER BY 2, 4; + END +$$; +CREATE TABLE truncprim (a int PRIMARY KEY); +CREATE TABLE truncpart (a int REFERENCES truncprim) + PARTITION BY RANGE (a); +CREATE TABLE truncpart_1 PARTITION OF truncpart FOR VALUES FROM (0) TO (100); +CREATE TABLE truncpart_2 PARTITION OF truncpart FOR VALUES FROM (100) TO (200) + PARTITION BY RANGE (a); +CREATE TABLE truncpart_2_1 PARTITION OF truncpart_2 FOR VALUES FROM (100) TO (150); +CREATE TABLE truncpart_2_d PARTITION OF truncpart_2 DEFAULT; + +-- GPDB: this doesn't fail in GPDB, because GPDB doesn't enforce primary keys. +TRUNCATE TABLE truncprim; -- should fail + +select tp_ins_data(); +-- should truncate everything +TRUNCATE TABLE truncprim, truncpart; +select * from tp_chk_data(); + +select tp_ins_data(); +-- should truncate everything +TRUNCATE TABLE truncprim CASCADE; +SELECT * FROM tp_chk_data(); + +SELECT tp_ins_data(); +-- should truncate all partitions +TRUNCATE TABLE truncpart; +SELECT * FROM tp_chk_data(); +DROP TABLE truncprim, truncpart; +DROP FUNCTION tp_ins_data(), tp_chk_data(); + +-- test cascade when referencing a partitioned table +CREATE TABLE trunc_a (a INT PRIMARY KEY) PARTITION BY RANGE (a); +CREATE TABLE trunc_a1 PARTITION OF trunc_a FOR VALUES FROM (0) TO (10); +CREATE TABLE trunc_a2 PARTITION OF trunc_a FOR VALUES FROM (10) TO (20) + PARTITION BY RANGE (a); +CREATE TABLE trunc_a21 PARTITION OF trunc_a2 FOR VALUES FROM (10) TO (12); +CREATE TABLE trunc_a22 PARTITION OF trunc_a2 FOR VALUES FROM (12) TO (16); +CREATE TABLE trunc_a2d PARTITION OF trunc_a2 DEFAULT; +CREATE TABLE trunc_a3 PARTITION OF trunc_a FOR VALUES FROM (20) TO (30); +INSERT INTO trunc_a VALUES (0), (5), (10), (15), (20), (25); + +-- truncate a partition cascading to a table +CREATE TABLE ref_b ( + b INT PRIMARY KEY, + a INT REFERENCES trunc_a(a) ON DELETE CASCADE +); +INSERT INTO ref_b VALUES (10, 0), (50, 5), (100, 10), (150, 15); + +TRUNCATE TABLE trunc_a1 CASCADE; +SELECT a FROM ref_b; + +DROP TABLE ref_b; + +-- truncate a partition cascading to a partitioned table +CREATE TABLE ref_c ( + c INT PRIMARY KEY, + a INT REFERENCES trunc_a(a) ON DELETE CASCADE +) PARTITION BY RANGE (c); +CREATE TABLE ref_c1 PARTITION OF ref_c FOR VALUES FROM (100) TO (200); +CREATE TABLE ref_c2 PARTITION OF ref_c FOR VALUES FROM (200) TO (300); +INSERT INTO ref_c VALUES (100, 10), (150, 15), (200, 20), (250, 25); + +TRUNCATE TABLE trunc_a21 CASCADE; +SELECT a as "from table ref_c" FROM ref_c; +SELECT a as "from table trunc_a" FROM trunc_a ORDER BY a; + +DROP TABLE trunc_a, ref_c; diff --git a/src/test/singlenode_regress/sql/tsdicts.sql b/src/test/singlenode_regress/sql/tsdicts.sql new file mode 100644 index 00000000000..ddc6c7f4453 --- /dev/null +++ b/src/test/singlenode_regress/sql/tsdicts.sql @@ -0,0 +1,253 @@ +--Test text search dictionaries and configurations + +-- Test ISpell dictionary with ispell affix file +CREATE TEXT SEARCH DICTIONARY ispell ( + Template=ispell, + DictFile=ispell_sample, + AffFile=ispell_sample +); + +SELECT ts_lexize('ispell', 'skies'); +SELECT ts_lexize('ispell', 'bookings'); +SELECT ts_lexize('ispell', 'booking'); +SELECT ts_lexize('ispell', 'foot'); +SELECT ts_lexize('ispell', 'foots'); +SELECT ts_lexize('ispell', 'rebookings'); +SELECT ts_lexize('ispell', 'rebooking'); +SELECT ts_lexize('ispell', 'rebook'); +SELECT ts_lexize('ispell', 'unbookings'); +SELECT ts_lexize('ispell', 'unbooking'); +SELECT ts_lexize('ispell', 'unbook'); + +SELECT ts_lexize('ispell', 'footklubber'); +SELECT ts_lexize('ispell', 'footballklubber'); +SELECT ts_lexize('ispell', 'ballyklubber'); +SELECT ts_lexize('ispell', 'footballyklubber'); + +-- Test ISpell dictionary with hunspell affix file +CREATE TEXT SEARCH DICTIONARY hunspell ( + Template=ispell, + DictFile=ispell_sample, + AffFile=hunspell_sample +); + +SELECT ts_lexize('hunspell', 'skies'); +SELECT ts_lexize('hunspell', 'bookings'); +SELECT ts_lexize('hunspell', 'booking'); +SELECT ts_lexize('hunspell', 'foot'); +SELECT ts_lexize('hunspell', 'foots'); +SELECT ts_lexize('hunspell', 'rebookings'); +SELECT ts_lexize('hunspell', 'rebooking'); +SELECT ts_lexize('hunspell', 'rebook'); +SELECT ts_lexize('hunspell', 'unbookings'); +SELECT ts_lexize('hunspell', 'unbooking'); +SELECT ts_lexize('hunspell', 'unbook'); + +SELECT ts_lexize('hunspell', 'footklubber'); +SELECT ts_lexize('hunspell', 'footballklubber'); +SELECT ts_lexize('hunspell', 'ballyklubber'); +SELECT ts_lexize('hunspell', 'footballyklubber'); + +-- Test ISpell dictionary with hunspell affix file with FLAG long parameter +CREATE TEXT SEARCH DICTIONARY hunspell_long ( + Template=ispell, + DictFile=hunspell_sample_long, + AffFile=hunspell_sample_long +); + +SELECT ts_lexize('hunspell_long', 'skies'); +SELECT ts_lexize('hunspell_long', 'bookings'); +SELECT ts_lexize('hunspell_long', 'booking'); +SELECT ts_lexize('hunspell_long', 'foot'); +SELECT ts_lexize('hunspell_long', 'foots'); +SELECT ts_lexize('hunspell_long', 'rebookings'); +SELECT ts_lexize('hunspell_long', 'rebooking'); +SELECT ts_lexize('hunspell_long', 'rebook'); +SELECT ts_lexize('hunspell_long', 'unbookings'); +SELECT ts_lexize('hunspell_long', 'unbooking'); +SELECT ts_lexize('hunspell_long', 'unbook'); +SELECT ts_lexize('hunspell_long', 'booked'); + +SELECT ts_lexize('hunspell_long', 'footklubber'); +SELECT ts_lexize('hunspell_long', 'footballklubber'); +SELECT ts_lexize('hunspell_long', 'ballyklubber'); +SELECT ts_lexize('hunspell_long', 'ballsklubber'); +SELECT ts_lexize('hunspell_long', 'footballyklubber'); +SELECT ts_lexize('hunspell_long', 'ex-machina'); + +-- Test ISpell dictionary with hunspell affix file with FLAG num parameter +CREATE TEXT SEARCH DICTIONARY hunspell_num ( + Template=ispell, + DictFile=hunspell_sample_num, + AffFile=hunspell_sample_num +); + +SELECT ts_lexize('hunspell_num', 'skies'); +SELECT ts_lexize('hunspell_num', 'sk'); +SELECT ts_lexize('hunspell_num', 'bookings'); +SELECT ts_lexize('hunspell_num', 'booking'); +SELECT ts_lexize('hunspell_num', 'foot'); +SELECT ts_lexize('hunspell_num', 'foots'); +SELECT ts_lexize('hunspell_num', 'rebookings'); +SELECT ts_lexize('hunspell_num', 'rebooking'); +SELECT ts_lexize('hunspell_num', 'rebook'); +SELECT ts_lexize('hunspell_num', 'unbookings'); +SELECT ts_lexize('hunspell_num', 'unbooking'); +SELECT ts_lexize('hunspell_num', 'unbook'); +SELECT ts_lexize('hunspell_num', 'booked'); + +SELECT ts_lexize('hunspell_num', 'footklubber'); +SELECT ts_lexize('hunspell_num', 'footballklubber'); +SELECT ts_lexize('hunspell_num', 'ballyklubber'); +SELECT ts_lexize('hunspell_num', 'footballyklubber'); + +-- Test suitability of affix and dict files +CREATE TEXT SEARCH DICTIONARY hunspell_err ( + Template=ispell, + DictFile=ispell_sample, + AffFile=hunspell_sample_long +); + +CREATE TEXT SEARCH DICTIONARY hunspell_err ( + Template=ispell, + DictFile=ispell_sample, + AffFile=hunspell_sample_num +); + +CREATE TEXT SEARCH DICTIONARY hunspell_invalid_1 ( + Template=ispell, + DictFile=hunspell_sample_long, + AffFile=ispell_sample +); + +CREATE TEXT SEARCH DICTIONARY hunspell_invalid_2 ( + Template=ispell, + DictFile=hunspell_sample_long, + AffFile=hunspell_sample_num +); + +CREATE TEXT SEARCH DICTIONARY hunspell_invalid_3 ( + Template=ispell, + DictFile=hunspell_sample_num, + AffFile=ispell_sample +); + +CREATE TEXT SEARCH DICTIONARY hunspell_err ( + Template=ispell, + DictFile=hunspell_sample_num, + AffFile=hunspell_sample_long +); + +-- Synonym dictionary +CREATE TEXT SEARCH DICTIONARY synonym ( + Template=synonym, + Synonyms=synonym_sample +); + +SELECT ts_lexize('synonym', 'PoStGrEs'); +SELECT ts_lexize('synonym', 'Gogle'); +SELECT ts_lexize('synonym', 'indices'); + +-- test altering boolean parameters +SELECT dictinitoption FROM pg_ts_dict WHERE dictname = 'synonym'; + +ALTER TEXT SEARCH DICTIONARY synonym (CaseSensitive = 1); +SELECT ts_lexize('synonym', 'PoStGrEs'); +SELECT dictinitoption FROM pg_ts_dict WHERE dictname = 'synonym'; + +ALTER TEXT SEARCH DICTIONARY synonym (CaseSensitive = 2); -- fail + +ALTER TEXT SEARCH DICTIONARY synonym (CaseSensitive = off); +SELECT ts_lexize('synonym', 'PoStGrEs'); +SELECT dictinitoption FROM pg_ts_dict WHERE dictname = 'synonym'; + +-- Create and simple test thesaurus dictionary +-- More tests in configuration checks because ts_lexize() +-- cannot pass more than one word to thesaurus. +CREATE TEXT SEARCH DICTIONARY thesaurus ( + Template=thesaurus, + DictFile=thesaurus_sample, + Dictionary=english_stem +); + +SELECT ts_lexize('thesaurus', 'one'); + +-- Test ispell dictionary in configuration +CREATE TEXT SEARCH CONFIGURATION ispell_tst ( + COPY=english +); + +ALTER TEXT SEARCH CONFIGURATION ispell_tst ALTER MAPPING FOR + word, numword, asciiword, hword, numhword, asciihword, hword_part, hword_numpart, hword_asciipart + WITH ispell, english_stem; + +SELECT to_tsvector('ispell_tst', 'Booking the skies after rebookings for footballklubber from a foot'); +SELECT to_tsquery('ispell_tst', 'footballklubber'); +SELECT to_tsquery('ispell_tst', 'footballyklubber:b & rebookings:A & sky'); + +-- Test ispell dictionary with hunspell affix in configuration +CREATE TEXT SEARCH CONFIGURATION hunspell_tst ( + COPY=ispell_tst +); + +ALTER TEXT SEARCH CONFIGURATION hunspell_tst ALTER MAPPING + REPLACE ispell WITH hunspell; + +SELECT to_tsvector('hunspell_tst', 'Booking the skies after rebookings for footballklubber from a foot'); +SELECT to_tsquery('hunspell_tst', 'footballklubber'); +SELECT to_tsquery('hunspell_tst', 'footballyklubber:b & rebookings:A & sky'); + +SELECT to_tsquery('hunspell_tst', 'footballyklubber:b <-> sky'); +SELECT phraseto_tsquery('hunspell_tst', 'footballyklubber sky'); + +-- Test ispell dictionary with hunspell affix with FLAG long in configuration +ALTER TEXT SEARCH CONFIGURATION hunspell_tst ALTER MAPPING + REPLACE hunspell WITH hunspell_long; + +SELECT to_tsvector('hunspell_tst', 'Booking the skies after rebookings for footballklubber from a foot'); +SELECT to_tsquery('hunspell_tst', 'footballklubber'); +SELECT to_tsquery('hunspell_tst', 'footballyklubber:b & rebookings:A & sky'); + +-- Test ispell dictionary with hunspell affix with FLAG num in configuration +ALTER TEXT SEARCH CONFIGURATION hunspell_tst ALTER MAPPING + REPLACE hunspell_long WITH hunspell_num; + +SELECT to_tsvector('hunspell_tst', 'Booking the skies after rebookings for footballklubber from a foot'); +SELECT to_tsquery('hunspell_tst', 'footballklubber'); +SELECT to_tsquery('hunspell_tst', 'footballyklubber:b & rebookings:A & sky'); + +-- Test synonym dictionary in configuration +CREATE TEXT SEARCH CONFIGURATION synonym_tst ( + COPY=english +); + +ALTER TEXT SEARCH CONFIGURATION synonym_tst ALTER MAPPING FOR + asciiword, hword_asciipart, asciihword + WITH synonym, english_stem; + +SELECT to_tsvector('synonym_tst', 'Postgresql is often called as postgres or pgsql and pronounced as postgre'); +SELECT to_tsvector('synonym_tst', 'Most common mistake is to write Gogle instead of Google'); +SELECT to_tsvector('synonym_tst', 'Indexes or indices - Which is right plural form of index?'); +SELECT to_tsquery('synonym_tst', 'Index & indices'); + +-- test thesaurus in configuration +-- see thesaurus_sample.ths to understand 'odd' resulting tsvector +CREATE TEXT SEARCH CONFIGURATION thesaurus_tst ( + COPY=synonym_tst +); + +ALTER TEXT SEARCH CONFIGURATION thesaurus_tst ALTER MAPPING FOR + asciiword, hword_asciipart, asciihword + WITH synonym, thesaurus, english_stem; + +SELECT to_tsvector('thesaurus_tst', 'one postgres one two one two three one'); +SELECT to_tsvector('thesaurus_tst', 'Supernovae star is very new star and usually called supernovae (abbreviation SN)'); +SELECT to_tsvector('thesaurus_tst', 'Booking tickets is looking like a booking a tickets'); + +-- invalid: non-lowercase quoted identifiers +CREATE TEXT SEARCH DICTIONARY tsdict_case +( + Template = ispell, + "DictFile" = ispell_sample, + "AffFile" = ispell_sample +); diff --git a/src/test/singlenode_regress/sql/tsearch.sql b/src/test/singlenode_regress/sql/tsearch.sql new file mode 100644 index 00000000000..1fb7ae61fc4 --- /dev/null +++ b/src/test/singlenode_regress/sql/tsearch.sql @@ -0,0 +1,799 @@ +set optimizer_print_missing_stats = off; +-- +-- Sanity checks for text search catalogs +-- +-- NB: we assume the oidjoins test will have caught any dangling links, +-- that is OID or REGPROC fields that are not zero and do not match some +-- row in the linked-to table. However, if we want to enforce that a link +-- field can't be 0, we have to check it here. + +-- Find unexpected zero link entries + +SELECT oid, prsname +FROM pg_ts_parser +WHERE prsnamespace = 0 OR prsstart = 0 OR prstoken = 0 OR prsend = 0 OR + -- prsheadline is optional + prslextype = 0; + +SELECT oid, dictname +FROM pg_ts_dict +WHERE dictnamespace = 0 OR dictowner = 0 OR dicttemplate = 0; + +SELECT oid, tmplname +FROM pg_ts_template +WHERE tmplnamespace = 0 OR tmpllexize = 0; -- tmplinit is optional + +SELECT oid, cfgname +FROM pg_ts_config +WHERE cfgnamespace = 0 OR cfgowner = 0 OR cfgparser = 0; + +SELECT mapcfg, maptokentype, mapseqno +FROM pg_ts_config_map +WHERE mapcfg = 0 OR mapdict = 0; + +-- Look for pg_ts_config_map entries that aren't one of parser's token types +SELECT * FROM + ( SELECT oid AS cfgid, (ts_token_type(cfgparser)).tokid AS tokid + FROM pg_ts_config ) AS tt +RIGHT JOIN pg_ts_config_map AS m + ON (tt.cfgid=m.mapcfg AND tt.tokid=m.maptokentype) +WHERE + tt.cfgid IS NULL OR tt.tokid IS NULL; + +-- test basic text search behavior without indexes, then with + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + +create index wowidx on test_tsvector using gist (a); + +SET enable_seqscan=OFF; +SET enable_indexscan=ON; +SET enable_bitmapscan=OFF; + +explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + +SET enable_indexscan=OFF; +SET enable_bitmapscan=ON; + +explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + +-- Test siglen parameter of GiST tsvector_ops +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(foo=1)); +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=0)); +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=8192)); +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=100,foo='bar')); +CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=100, siglen = 200)); + +CREATE INDEX wowidx2 ON test_tsvector USING gist (a tsvector_ops(siglen=1)); + +\d test_tsvector + +DROP INDEX wowidx; + +EXPLAIN (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + +DROP INDEX wowidx2; + +CREATE INDEX wowidx ON test_tsvector USING gist (a tsvector_ops(siglen=484)); + +\d test_tsvector + +EXPLAIN (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; + +DROP INDEX wowidx; + +CREATE INDEX wowidx ON test_tsvector USING gin (a); + +SET enable_seqscan=OFF; +-- GIN only supports bitmapscan, so no need to test plain indexscan + +explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; + +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*'; +SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}'); +SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D'; + +-- Test optimization of non-empty GIN_SEARCH_MODE_ALL queries +EXPLAIN (COSTS OFF) +SELECT count(*) FROM test_tsvector WHERE a @@ '!qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ '!qh'; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr' AND a @@ '!qh'; +SELECT count(*) FROM test_tsvector WHERE a @@ 'wr' AND a @@ '!qh'; + +RESET enable_seqscan; + +INSERT INTO test_tsvector VALUES ('???', 'DFG:1A,2B,6C,10 FGH'); +SELECT * FROM ts_stat('SELECT a FROM test_tsvector') ORDER BY ndoc DESC, nentry DESC, word LIMIT 10; +SELECT * FROM ts_stat('SELECT a FROM test_tsvector', 'AB') ORDER BY ndoc DESC, nentry DESC, word; + +--dictionaries and to_tsvector + +SELECT ts_lexize('english_stem', 'skies'); +SELECT ts_lexize('english_stem', 'identity'); + +SELECT * FROM ts_token_type('default'); + +SELECT * FROM ts_parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf qwer jf sdjk ewr1> ewri2 +/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234 + wow < jqw <> qwerty'); + +SELECT to_tsvector('english', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf qwer jf sdjk ewr1> ewri2 +/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234 + wow < jqw <> qwerty'); + +SELECT length(to_tsvector('english', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf qwer jf sdjk ewr1> ewri2 +/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234 + wow < jqw <> qwerty')); + +-- ts_debug + +SELECT * from ts_debug('english', 'abc&nm1;def©ghiõjkl'); + +-- check parsing of URLs +SELECT * from ts_debug('english', 'http://www.harewoodsolutions.co.uk/press.aspx'); +SELECT * from ts_debug('english', 'http://aew.wer0c.ewr/id?ad=qwe&dw'); +SELECT * from ts_debug('english', 'http://5aew.werc.ewr:8100/?'); +SELECT * from ts_debug('english', '5aew.werc.ewr:8100/?xx'); +SELECT token, alias, + dictionaries, dictionaries is null as dnull, array_dims(dictionaries) as ddims, + lexemes, lexemes is null as lnull, array_dims(lexemes) as ldims +from ts_debug('english', 'a title'); + +-- to_tsquery + +SELECT to_tsquery('english', 'qwe & sKies '); +SELECT to_tsquery('simple', 'qwe & sKies '); +SELECT to_tsquery('english', '''the wether'':dc & '' sKies '':BC '); +SELECT to_tsquery('english', 'asd&(and|fghj)'); +SELECT to_tsquery('english', '(asd&and)|fghj'); +SELECT to_tsquery('english', '(asd&!and)|fghj'); +SELECT to_tsquery('english', '(the|and&(i&1))&fghj'); + +SELECT plainto_tsquery('english', 'the and z 1))& fghj'); +SELECT plainto_tsquery('english', 'foo bar') && plainto_tsquery('english', 'asd'); +SELECT plainto_tsquery('english', 'foo bar') || plainto_tsquery('english', 'asd fg'); +SELECT plainto_tsquery('english', 'foo bar') || !!plainto_tsquery('english', 'asd fg'); +SELECT plainto_tsquery('english', 'foo bar') && 'asd | fg'; + +-- Check stop word deletion, a and s are stop-words +SELECT to_tsquery('english', '!(a & !b) & c'); +SELECT to_tsquery('english', '!(a & !b)'); + +SELECT to_tsquery('english', '(1 <-> 2) <-> a'); +SELECT to_tsquery('english', '(1 <-> a) <-> 2'); +SELECT to_tsquery('english', '(a <-> 1) <-> 2'); +SELECT to_tsquery('english', 'a <-> (1 <-> 2)'); +SELECT to_tsquery('english', '1 <-> (a <-> 2)'); +SELECT to_tsquery('english', '1 <-> (2 <-> a)'); + +SELECT to_tsquery('english', '(1 <-> 2) <3> a'); +SELECT to_tsquery('english', '(1 <-> a) <3> 2'); +SELECT to_tsquery('english', '(a <-> 1) <3> 2'); +SELECT to_tsquery('english', 'a <3> (1 <-> 2)'); +SELECT to_tsquery('english', '1 <3> (a <-> 2)'); +SELECT to_tsquery('english', '1 <3> (2 <-> a)'); + +SELECT to_tsquery('english', '(1 <3> 2) <-> a'); +SELECT to_tsquery('english', '(1 <3> a) <-> 2'); +SELECT to_tsquery('english', '(a <3> 1) <-> 2'); +SELECT to_tsquery('english', 'a <-> (1 <3> 2)'); +SELECT to_tsquery('english', '1 <-> (a <3> 2)'); +SELECT to_tsquery('english', '1 <-> (2 <3> a)'); + +SELECT to_tsquery('english', '((a <-> 1) <-> 2) <-> s'); +SELECT to_tsquery('english', '(2 <-> (a <-> 1)) <-> s'); +SELECT to_tsquery('english', '((1 <-> a) <-> 2) <-> s'); +SELECT to_tsquery('english', '(2 <-> (1 <-> a)) <-> s'); +SELECT to_tsquery('english', 's <-> ((a <-> 1) <-> 2)'); +SELECT to_tsquery('english', 's <-> (2 <-> (a <-> 1))'); +SELECT to_tsquery('english', 's <-> ((1 <-> a) <-> 2)'); +SELECT to_tsquery('english', 's <-> (2 <-> (1 <-> a))'); + +SELECT to_tsquery('english', '((a <-> 1) <-> s) <-> 2'); +SELECT to_tsquery('english', '(s <-> (a <-> 1)) <-> 2'); +SELECT to_tsquery('english', '((1 <-> a) <-> s) <-> 2'); +SELECT to_tsquery('english', '(s <-> (1 <-> a)) <-> 2'); +SELECT to_tsquery('english', '2 <-> ((a <-> 1) <-> s)'); +SELECT to_tsquery('english', '2 <-> (s <-> (a <-> 1))'); +SELECT to_tsquery('english', '2 <-> ((1 <-> a) <-> s)'); +SELECT to_tsquery('english', '2 <-> (s <-> (1 <-> a))'); + +SELECT to_tsquery('english', 'foo <-> (a <-> (the <-> bar))'); +SELECT to_tsquery('english', '((foo <-> a) <-> the) <-> bar'); +SELECT to_tsquery('english', 'foo <-> a <-> the <-> bar'); +SELECT phraseto_tsquery('english', 'PostgreSQL can be extended by the user in many ways'); + + +SELECT ts_rank_cd(to_tsvector('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +'), to_tsquery('english', 'paint&water')); + +SELECT ts_rank_cd(to_tsvector('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +'), to_tsquery('english', 'breath&motion&water')); + +SELECT ts_rank_cd(to_tsvector('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +'), to_tsquery('english', 'ocean')); + +SELECT ts_rank_cd(to_tsvector('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +'), to_tsquery('english', 'painted <-> Ship')); + +SELECT ts_rank_cd(strip(to_tsvector('both stripped')), + to_tsquery('both & stripped')); + +SELECT ts_rank_cd(to_tsvector('unstripped') || strip(to_tsvector('stripped')), + to_tsquery('unstripped & stripped')); + +--headline tests +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'paint&water')); + +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'breath&motion&water')); + +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'ocean')); + +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', phraseto_tsquery('english', 'painted Ocean')); + +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', phraseto_tsquery('english', 'idle as a painted Ship')); + +SELECT ts_headline('english', +'Lorem ipsum urna. Nullam nullam ullamcorper urna.', +to_tsquery('english','Lorem') && phraseto_tsquery('english','ullamcorper urna'), +'MaxWords=100, MinWords=1'); + +SELECT ts_headline('english', ' + + + +Sea view wow foo bar qq +YES   +ff-bg + + +', +to_tsquery('english', 'sea&foo'), 'HighlightAll=true'); + +SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 <-> 3', 'MaxWords=2, MinWords=1'); +SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 & 3', 'MaxWords=4, MinWords=1'); +SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 <-> 3', 'MaxWords=4, MinWords=1'); + +--Check if headline fragments work +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'ocean'), 'MaxFragments=1'); + +--Check if more than one fragments are displayed +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2'); + +--Fragments when there all query words are not in the document +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'ocean & seahorse'), 'MaxFragments=1'); + +--FragmentDelimiter option +SELECT ts_headline('english', ' +Day after day, day after day, + We stuck, nor breath nor motion, +As idle as a painted Ship + Upon a painted Ocean. +Water, water, every where + And all the boards did shrink; +Water, water, every where, + Nor any drop to drink. +S. T. Coleridge (1772-1834) +', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2,FragmentDelimiter=***'); + +--Fragments with phrase search +SELECT ts_headline('english', +'Lorem ipsum urna. Nullam nullam ullamcorper urna.', +to_tsquery('english','Lorem') && phraseto_tsquery('english','ullamcorper urna'), +'MaxFragments=100, MaxWords=100, MinWords=1'); + +--Rewrite sub system + +CREATE TABLE test_tsquery (txtkeyword TEXT, txtsample TEXT); +\set ECHO none +\copy test_tsquery from stdin +'New York' new <-> york | big <-> apple | nyc +Moscow moskva | moscow +'Sanct Peter' Peterburg | peter | 'Sanct Peterburg' +foo & bar & qq foo & (bar | qq) & city +1 & (2 <-> 3) 2 <-> 4 +5 <-> 6 5 <-> 7 +\. +\set ECHO all + +ALTER TABLE test_tsquery ADD COLUMN keyword tsquery; +UPDATE test_tsquery SET keyword = to_tsquery('english', txtkeyword); +ALTER TABLE test_tsquery ADD COLUMN sample tsquery; +UPDATE test_tsquery SET sample = to_tsquery('english', txtsample::text); + + +SELECT COUNT(*) FROM test_tsquery WHERE keyword < 'new <-> york'; +SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new <-> york'; +SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new <-> york'; +SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new <-> york'; +SELECT COUNT(*) FROM test_tsquery WHERE keyword > 'new <-> york'; + +CREATE INDEX bt_tsq ON test_tsquery (keyword); + +SET enable_seqscan=OFF; + +SELECT COUNT(*) FROM test_tsquery WHERE keyword < 'new <-> york'; +SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new <-> york'; +SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new <-> york'; +SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new <-> york'; +SELECT COUNT(*) FROM test_tsquery WHERE keyword > 'new <-> york'; + +RESET enable_seqscan; + +SELECT ts_rewrite('foo & bar & qq & new & york', 'new & york'::tsquery, 'big & apple | nyc | new & york & city'); +SELECT ts_rewrite(ts_rewrite('new & !york ', 'york', '!jersey'), + 'jersey', 'mexico'); + +SELECT ts_rewrite('moscow', 'SELECT keyword, sample FROM test_tsquery'::text ); +SELECT ts_rewrite('moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'::text ); +SELECT ts_rewrite('bar & qq & foo & (new <-> york)', 'SELECT keyword, sample FROM test_tsquery'::text ); + +SELECT ts_rewrite( 'moscow', 'SELECT keyword, sample FROM test_tsquery'); +SELECT ts_rewrite( 'moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'); +SELECT ts_rewrite( 'bar & qq & foo & (new <-> york)', 'SELECT keyword, sample FROM test_tsquery'); + +SELECT ts_rewrite('1 & (2 <-> 3)', 'SELECT keyword, sample FROM test_tsquery'::text ); +SELECT ts_rewrite('1 & (2 <2> 3)', 'SELECT keyword, sample FROM test_tsquery'::text ); +SELECT ts_rewrite('5 <-> (1 & (2 <-> 3))', 'SELECT keyword, sample FROM test_tsquery'::text ); +SELECT ts_rewrite('5 <-> (6 | 8)', 'SELECT keyword, sample FROM test_tsquery'::text ); + +-- Check empty substitution +SELECT ts_rewrite(to_tsquery('5 & (6 | 5)'), to_tsquery('5'), to_tsquery('')); +SELECT ts_rewrite(to_tsquery('!5'), to_tsquery('5'), to_tsquery('')); + +SELECT keyword FROM test_tsquery WHERE keyword @> 'new'; +SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow'; +SELECT keyword FROM test_tsquery WHERE keyword <@ 'new'; +SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow'; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; + +CREATE INDEX qq ON test_tsquery USING gist (keyword tsquery_ops); +SET enable_seqscan=OFF; + +SELECT keyword FROM test_tsquery WHERE keyword @> 'new'; +SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow'; +SELECT keyword FROM test_tsquery WHERE keyword <@ 'new'; +SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow'; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query; +SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query; + +SELECT ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz'); +SELECT to_tsvector('foo bar') @@ + ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz'); +SELECT to_tsvector('bar baz') @@ + ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz'); + +RESET enable_seqscan; + +--test GUC +SET default_text_search_config=simple; + +SELECT to_tsvector('SKIES My booKs'); +SELECT plainto_tsquery('SKIES My booKs'); +SELECT to_tsquery('SKIES & My | booKs'); + +SET default_text_search_config=english; + +SELECT to_tsvector('SKIES My booKs'); +SELECT plainto_tsquery('SKIES My booKs'); +SELECT to_tsquery('SKIES & My | booKs'); + +--trigger +CREATE TRIGGER tsvectorupdate +BEFORE UPDATE OR INSERT ON test_tsvector +FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(a, 'pg_catalog.english', t); + +SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); +INSERT INTO test_tsvector (t) VALUES ('345 qwerty'); +SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); +UPDATE test_tsvector SET t = null WHERE t = '345 qwerty'; +SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); + +INSERT INTO test_tsvector (t) VALUES ('345 qwerty'); + +SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty'); + +-- Test inlining of immutable constant functions + +-- to_tsquery(text) is not immutable, so it won't be inlined +explain (costs off) +select * from test_tsquery, to_tsquery('new') q where txtsample @@ q; + +-- to_tsquery(regconfig, text) is an immutable function. +-- That allows us to get rid of using function scan and join at all. +explain (costs off) +select * from test_tsquery, to_tsquery('english', 'new') q where txtsample @@ q; + +-- test finding items in GIN's pending list +create temp table pendtest (ts tsvector); +create index pendtest_idx on pendtest using gin(ts); +insert into pendtest values (to_tsvector('Lore ipsam')); +insert into pendtest values (to_tsvector('Lore ipsum')); +select * from pendtest where 'ipsu:*'::tsquery @@ ts; +select * from pendtest where 'ipsa:*'::tsquery @@ ts; +select * from pendtest where 'ips:*'::tsquery @@ ts; +select * from pendtest where 'ipt:*'::tsquery @@ ts; +select * from pendtest where 'ipi:*'::tsquery @@ ts; + +--check OP_PHRASE on index +create temp table phrase_index_test(fts tsvector); +insert into phrase_index_test values ('A fat cat has just eaten a rat.'); +insert into phrase_index_test values (to_tsvector('english', 'A fat cat has just eaten a rat.')); +create index phrase_index_test_idx on phrase_index_test using gin(fts); +set enable_seqscan = off; +select * from phrase_index_test where fts @@ phraseto_tsquery('english', 'fat cat'); +set enable_seqscan = on; + +-- test websearch_to_tsquery function +select websearch_to_tsquery('simple', 'I have a fat:*ABCD cat'); +select websearch_to_tsquery('simple', 'orange:**AABBCCDD'); +select websearch_to_tsquery('simple', 'fat:A!cat:B|rat:C<'); +select websearch_to_tsquery('simple', 'fat:A : cat:B'); + +select websearch_to_tsquery('simple', 'fat*rat'); +select websearch_to_tsquery('simple', 'fat-rat'); +select websearch_to_tsquery('simple', 'fat_rat'); + +-- weights are completely ignored +select websearch_to_tsquery('simple', 'abc : def'); +select websearch_to_tsquery('simple', 'abc:def'); +select websearch_to_tsquery('simple', 'a:::b'); +select websearch_to_tsquery('simple', 'abc:d'); +select websearch_to_tsquery('simple', ':'); + +-- these operators are ignored +select websearch_to_tsquery('simple', 'abc & def'); +select websearch_to_tsquery('simple', 'abc | def'); +select websearch_to_tsquery('simple', 'abc <-> def'); +select websearch_to_tsquery('simple', 'abc (pg or class)'); + +-- NOT is ignored in quotes +select websearch_to_tsquery('english', 'My brand new smartphone'); +select websearch_to_tsquery('english', 'My brand "new smartphone"'); +select websearch_to_tsquery('english', 'My brand "new -smartphone"'); + +-- test OR operator +select websearch_to_tsquery('simple', 'cat or rat'); +select websearch_to_tsquery('simple', 'cat OR rat'); +select websearch_to_tsquery('simple', 'cat "OR" rat'); +select websearch_to_tsquery('simple', 'cat OR'); +select websearch_to_tsquery('simple', 'OR rat'); +select websearch_to_tsquery('simple', '"fat cat OR rat"'); +select websearch_to_tsquery('simple', 'fat (cat OR rat'); +select websearch_to_tsquery('simple', 'or OR or'); + +-- OR is an operator here ... +select websearch_to_tsquery('simple', '"fat cat"or"fat rat"'); +select websearch_to_tsquery('simple', 'fat or(rat'); +select websearch_to_tsquery('simple', 'fat or)rat'); +select websearch_to_tsquery('simple', 'fat or&rat'); +select websearch_to_tsquery('simple', 'fat or|rat'); +select websearch_to_tsquery('simple', 'fat or!rat'); +select websearch_to_tsquery('simple', 'fat orrat'); +select websearch_to_tsquery('simple', 'fat or '); + +-- ... but not here +select websearch_to_tsquery('simple', 'abc orange'); +select websearch_to_tsquery('simple', 'abc OR1234'); +select websearch_to_tsquery('simple', 'abc or-abc'); +select websearch_to_tsquery('simple', 'abc OR_abc'); + +-- test quotes +select websearch_to_tsquery('english', '"pg_class pg'); +select websearch_to_tsquery('english', 'pg_class pg"'); +select websearch_to_tsquery('english', '"pg_class pg"'); +select websearch_to_tsquery('english', '"pg_class : pg"'); +select websearch_to_tsquery('english', 'abc "pg_class pg"'); +select websearch_to_tsquery('english', '"pg_class pg" def'); +select websearch_to_tsquery('english', 'abc "pg pg_class pg" def'); +select websearch_to_tsquery('english', ' or "pg pg_class pg" or '); +select websearch_to_tsquery('english', '""pg pg_class pg""'); +select websearch_to_tsquery('english', 'abc """"" def'); +select websearch_to_tsquery('english', 'cat -"fat rat"'); +select websearch_to_tsquery('english', 'cat -"fat rat" cheese'); +select websearch_to_tsquery('english', 'abc "def -"'); +select websearch_to_tsquery('english', 'abc "def :"'); + +select websearch_to_tsquery('english', '"A fat cat" has just eaten a -rat.'); +select websearch_to_tsquery('english', '"A fat cat" has just eaten OR !rat.'); +select websearch_to_tsquery('english', '"A fat cat" has just (+eaten OR -rat)'); + +select websearch_to_tsquery('english', 'this is ----fine'); +select websearch_to_tsquery('english', '(()) )))) this ||| is && -fine, "dear friend" OR good'); +select websearch_to_tsquery('english', 'an old <-> cat " is fine &&& too'); + +select websearch_to_tsquery('english', '"A the" OR just on'); +select websearch_to_tsquery('english', '"a fat cat" ate a rat'); + +select to_tsvector('english', 'A fat cat ate a rat') @@ + websearch_to_tsquery('english', '"a fat cat" ate a rat'); + +select to_tsvector('english', 'A fat grey cat ate a rat') @@ + websearch_to_tsquery('english', '"a fat cat" ate a rat'); + +-- cases handled by gettoken_tsvector() +select websearch_to_tsquery(''''); +select websearch_to_tsquery('''abc''''def'''); +select websearch_to_tsquery('\abc'); +select websearch_to_tsquery('\'); + +COPY test_tsvector TO '/tmp/test_tsvector.txt'; +COPY test_tsvector FROM '/tmp/test_tsvector.txt'; diff --git a/src/test/singlenode_regress/sql/tsrf.sql b/src/test/singlenode_regress/sql/tsrf.sql new file mode 100644 index 00000000000..7c22529a0db --- /dev/null +++ b/src/test/singlenode_regress/sql/tsrf.sql @@ -0,0 +1,185 @@ +-- +-- tsrf - targetlist set returning function tests +-- + +-- simple srf +SELECT generate_series(1, 3); + +-- parallel iteration +SELECT generate_series(1, 3), generate_series(3,5); + +-- parallel iteration, different number of rows +SELECT generate_series(1, 2), generate_series(1,4); + +-- srf, with SRF argument +SELECT generate_series(1, generate_series(1, 3)); + +-- but we've traditionally rejected the same in FROM +SELECT * FROM generate_series(1, generate_series(1, 3)); + +-- srf, with two SRF arguments +SELECT generate_series(generate_series(1,3), generate_series(2, 4)); + +-- check proper nesting of SRFs in different expressions +explain (verbose, costs off) +SELECT generate_series(1, generate_series(1, 3)), generate_series(2, 4); +SELECT generate_series(1, generate_series(1, 3)), generate_series(2, 4); + +CREATE TABLE few(id int, dataa text, datab text); +INSERT INTO few VALUES(1, 'a', 'foo'),(2, 'a', 'bar'),(3, 'b', 'bar'); + +-- SRF with a provably-dummy relation +explain (verbose, costs off) +SELECT unnest(ARRAY[1, 2]) FROM few WHERE false; +SELECT unnest(ARRAY[1, 2]) FROM few WHERE false; + +-- SRF shouldn't prevent upper query from recognizing lower as dummy +explain (verbose, costs off) +SELECT * FROM few f1, + (SELECT unnest(ARRAY[1,2]) FROM few f2 WHERE false OFFSET 0) ss; +SELECT * FROM few f1, + (SELECT unnest(ARRAY[1,2]) FROM few f2 WHERE false OFFSET 0) ss; + +-- SRF output order of sorting is maintained, if SRF is not referenced +SELECT few.id, generate_series(1,3) g FROM few ORDER BY id DESC; + +-- but SRFs can be referenced in sort +SELECT few.id, generate_series(1,3) g FROM few ORDER BY id, g DESC; +SELECT few.id, generate_series(1,3) g FROM few ORDER BY id, generate_series(1,3) DESC; + +-- it's weird to have ORDER BYs that increase the number of results +SELECT few.id FROM few ORDER BY id, generate_series(1,3) DESC; + +-- SRFs are computed after aggregation +SET enable_hashagg TO 0; -- stable output order +SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1 GROUP BY few.dataa; +-- unless referenced in GROUP BY clause +SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1 GROUP BY few.dataa, unnest('{1,1,3}'::int[]); +SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1 GROUP BY few.dataa, 5; +RESET enable_hashagg; + +-- check HAVING works when GROUP BY does [not] reference SRF output +SELECT dataa, generate_series(1,1), count(*) FROM few GROUP BY 1 HAVING count(*) > 1; +SELECT dataa, generate_series(1,1), count(*) FROM few GROUP BY 1, 2 HAVING count(*) > 1; + +-- it's weird to have GROUP BYs that increase the number of results +SELECT few.dataa, count(*) FROM few WHERE dataa = 'a' GROUP BY few.dataa ORDER BY 2; +SELECT few.dataa, count(*) FROM few WHERE dataa = 'a' GROUP BY few.dataa, unnest('{1,1,3}'::int[]) ORDER BY 2; + +-- SRFs are not allowed if they'd need to be conditionally executed +SELECT q1, case when q1 > 0 then generate_series(1,3) else 0 end FROM int8_tbl; +SELECT q1, coalesce(generate_series(1,3), 0) FROM int8_tbl; + +-- SRFs are not allowed in aggregate arguments +SELECT min(generate_series(1, 3)) FROM few; + +-- ... unless they're within a sub-select +SELECT sum((3 = ANY(SELECT generate_series(1,4)))::int); + +SELECT sum((3 = ANY(SELECT lag(x) over(order by x) + FROM generate_series(1,4) x))::int); + +-- SRFs are not allowed in window function arguments, either +SELECT min(generate_series(1, 3)) OVER() FROM few; + +-- SRFs are normally computed after window functions +SELECT id,lag(id) OVER(), count(*) OVER(), generate_series(1,3) FROM few; +-- unless referencing SRFs +SELECT SUM(count(*)) OVER(PARTITION BY generate_series(1,3) ORDER BY generate_series(1,3)), generate_series(1,3) g FROM few GROUP BY g; + +-- sorting + grouping +SELECT few.dataa, count(*), min(id), max(id), generate_series(1,3) FROM few GROUP BY few.dataa ORDER BY 5, 1; + +-- grouping sets are a bit special, they produce NULLs in columns not actually NULL +set enable_hashagg = false; +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab); +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab) ORDER BY dataa; +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab) ORDER BY g; +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g); +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g) ORDER BY dataa; +SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g) ORDER BY g; +reset enable_hashagg; + +-- case with degenerate ORDER BY +explain (verbose, costs off) +select 'foo' as f, generate_series(1,2) as g from few order by 1; +select 'foo' as f, generate_series(1,2) as g from few order by 1; + +-- data modification +CREATE TABLE fewmore AS SELECT generate_series(1,3) AS data; +INSERT INTO fewmore VALUES(generate_series(4,5)); +SELECT * FROM fewmore; + +-- SRFs are not allowed in UPDATE (they once were, but it was nonsense) +UPDATE fewmore SET data = generate_series(4,9); + +-- SRFs are not allowed in RETURNING +INSERT INTO fewmore VALUES(1) RETURNING generate_series(1,3); + +-- nor standalone VALUES (but surely this is a bug?) +VALUES(1, generate_series(1,2)); + +-- We allow tSRFs that are not at top level +SELECT int4mul(generate_series(1,2), 10); +SELECT generate_series(1,3) IS DISTINCT FROM 2; + +-- but SRFs in function RTEs must be at top level (annoying restriction) +SELECT * FROM int4mul(generate_series(1,2), 10); + +-- DISTINCT ON is evaluated before tSRF evaluation if SRF is not +-- referenced either in ORDER BY or in the DISTINCT ON list. The ORDER +-- BY reference can be implicitly generated, if there's no other ORDER BY. + +-- implicit reference (via implicit ORDER) to all columns +SELECT DISTINCT ON (a) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b); + +-- unreferenced in DISTINCT ON or ORDER BY +SELECT DISTINCT ON (a) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) +ORDER BY a, b DESC; + +-- referenced in ORDER BY +SELECT DISTINCT ON (a) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) +ORDER BY a, b DESC, g DESC; + +-- referenced in ORDER BY and DISTINCT ON +SELECT DISTINCT ON (a, b, g) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) +ORDER BY a, b DESC, g DESC; + +-- only SRF mentioned in DISTINCT ON +SELECT DISTINCT ON (g) a, b, generate_series(1,3) g +FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b); + +-- LIMIT / OFFSET is evaluated after SRF evaluation +SELECT a, generate_series(1,2) FROM (VALUES(1),(2),(3)) r(a) LIMIT 2 OFFSET 2; +-- SRFs are not allowed in LIMIT. +SELECT 1 LIMIT generate_series(1,3); + +-- tSRF in correlated subquery, referencing table outside +SELECT (SELECT generate_series(1,3) LIMIT 1 OFFSET few.id) FROM few; +-- tSRF in correlated subquery, referencing SRF outside +SELECT (SELECT generate_series(1,3) LIMIT 1 OFFSET g.i) FROM generate_series(0,3) g(i); + +-- Operators can return sets too +CREATE OPERATOR |@| (PROCEDURE = unnest, RIGHTARG = ANYARRAY); +SELECT |@|ARRAY[1,2,3]; + +-- Some fun cases involving duplicate SRF calls +explain (verbose, costs off) +select generate_series(1,3) as x, generate_series(1,3) + 1 as xp1; +select generate_series(1,3) as x, generate_series(1,3) + 1 as xp1; +explain (verbose, costs off) +select generate_series(1,3)+1 order by generate_series(1,3); +select generate_series(1,3)+1 order by generate_series(1,3); + +-- Check that SRFs of same nesting level run in lockstep +explain (verbose, costs off) +select generate_series(1,3) as x, generate_series(3,6) + 1 as y; +select generate_series(1,3) as x, generate_series(3,6) + 1 as y; + +-- Clean up +DROP TABLE few; +DROP TABLE fewmore; diff --git a/src/test/singlenode_regress/sql/tstypes.sql b/src/test/singlenode_regress/sql/tstypes.sql new file mode 100644 index 00000000000..30c8c702f09 --- /dev/null +++ b/src/test/singlenode_regress/sql/tstypes.sql @@ -0,0 +1,268 @@ +-- deal with numeric instability of ts_rank +SET extra_float_digits = 0; + +--Base tsvector test + +SELECT '1'::tsvector; +SELECT '1 '::tsvector; +SELECT ' 1'::tsvector; +SELECT ' 1 '::tsvector; +SELECT '1 2'::tsvector; +SELECT '''1 2'''::tsvector; +SELECT E'''1 \\''2'''::tsvector; +SELECT E'''1 \\''2''3'::tsvector; +SELECT E'''1 \\''2'' 3'::tsvector; +SELECT E'''1 \\''2'' '' 3'' 4 '::tsvector; +SELECT $$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector; +SELECT tsvectorin(tsvectorout($$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector)); +SELECT '''w'':4A,3B,2C,1D,5 a:8'; +SELECT 'a:3A b:2a'::tsvector || 'ba:1234 a:1B'; + +--Base tsquery test +SELECT '1'::tsquery; +SELECT '1 '::tsquery; +SELECT ' 1'::tsquery; +SELECT ' 1 '::tsquery; +SELECT '''1 2'''::tsquery; +SELECT E'''1 \\''2'''::tsquery; +SELECT '!1'::tsquery; +SELECT '1|2'::tsquery; +SELECT '1|!2'::tsquery; +SELECT '!1|2'::tsquery; +SELECT '!1|!2'::tsquery; +SELECT '!(!1|!2)'::tsquery; +SELECT '!(!1|2)'::tsquery; +SELECT '!(1|!2)'::tsquery; +SELECT '!(1|2)'::tsquery; +SELECT '1&2'::tsquery; +SELECT '!1&2'::tsquery; +SELECT '1&!2'::tsquery; +SELECT '!1&!2'::tsquery; +SELECT '(1&2)'::tsquery; +SELECT '1&(2)'::tsquery; +SELECT '!(1)&2'::tsquery; +SELECT '!(1&2)'::tsquery; +SELECT '1|2&3'::tsquery; +SELECT '1|(2&3)'::tsquery; +SELECT '(1|2)&3'::tsquery; +SELECT '1|2&!3'::tsquery; +SELECT '1|!2&3'::tsquery; +SELECT '!1|2&3'::tsquery; +SELECT '!1|(2&3)'::tsquery; +SELECT '!(1|2)&3'::tsquery; +SELECT '(!1|2)&3'::tsquery; +SELECT '1|(2|(4|(5|6)))'::tsquery; +SELECT '1|2|4|5|6'::tsquery; +SELECT '1&(2&(4&(5&6)))'::tsquery; +SELECT '1&2&4&5&6'::tsquery; +SELECT '1&(2&(4&(5|6)))'::tsquery; +SELECT '1&(2&(4&(5|!6)))'::tsquery; +SELECT E'1&(''2''&('' 4''&(\\|5 | ''6 \\'' !|&'')))'::tsquery; +SELECT $$'\\as'$$::tsquery; +SELECT 'a:* & nbb:*ac | doo:a* | goo'::tsquery; +SELECT '!!b'::tsquery; +SELECT '!!!b'::tsquery; +SELECT '!(!b)'::tsquery; +SELECT 'a & !!b'::tsquery; +SELECT '!!a & b'::tsquery; +SELECT '!!a & !!b'::tsquery; + +--comparisons +SELECT 'a' < 'b & c'::tsquery as "true"; +SELECT 'a' > 'b & c'::tsquery as "false"; +SELECT 'a | f' < 'b & c'::tsquery as "false"; +SELECT 'a | ff' < 'b & c'::tsquery as "false"; +SELECT 'a | f | g' < 'b & c'::tsquery as "false"; + +--concatenation +SELECT numnode( 'new'::tsquery ); +SELECT numnode( 'new & york'::tsquery ); +SELECT numnode( 'new & york | qwery'::tsquery ); + +SELECT 'foo & bar'::tsquery && 'asd'; +SELECT 'foo & bar'::tsquery || 'asd & fg'; +SELECT 'foo & bar'::tsquery || !!'asd & fg'::tsquery; +SELECT 'foo & bar'::tsquery && 'asd | fg'; +SELECT 'a' <-> 'b & d'::tsquery; +SELECT 'a & g' <-> 'b & d'::tsquery; +SELECT 'a & g' <-> 'b | d'::tsquery; +SELECT 'a & g' <-> 'b <-> d'::tsquery; +SELECT tsquery_phrase('a <3> g', 'b & d', 10); + +-- tsvector-tsquery operations + +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca' as "true"; +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:B' as "true"; +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:A' as "true"; +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:C' as "false"; +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:CB' as "true"; +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & c:*C' as "false"; +SELECT 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & c:*CB' as "true"; +SELECT 'a b:89 ca:23A,64b cb:80c d:34c'::tsvector @@ 'd:AC & c:*C' as "true"; +SELECT 'a b:89 ca:23A,64c cb:80b d:34c'::tsvector @@ 'd:AC & c:*C' as "true"; +SELECT 'a b:89 ca:23A,64c cb:80b d:34c'::tsvector @@ 'd:AC & c:*B' as "true"; +SELECT 'wa:1D wb:2A'::tsvector @@ 'w:*D & w:*A'::tsquery as "true"; +SELECT 'wa:1D wb:2A'::tsvector @@ 'w:*D <-> w:*A'::tsquery as "true"; +SELECT 'wa:1A wb:2D'::tsvector @@ 'w:*D <-> w:*A'::tsquery as "false"; +SELECT 'wa:1A'::tsvector @@ 'w:*A'::tsquery as "true"; +SELECT 'wa:1A'::tsvector @@ 'w:*D'::tsquery as "false"; +SELECT 'wa:1A'::tsvector @@ '!w:*A'::tsquery as "false"; +SELECT 'wa:1A'::tsvector @@ '!w:*D'::tsquery as "true"; +-- historically, a stripped tsvector matches queries ignoring weights: +SELECT strip('wa:1A'::tsvector) @@ 'w:*A'::tsquery as "true"; +SELECT strip('wa:1A'::tsvector) @@ 'w:*D'::tsquery as "true"; +SELECT strip('wa:1A'::tsvector) @@ '!w:*A'::tsquery as "false"; +SELECT strip('wa:1A'::tsvector) @@ '!w:*D'::tsquery as "false"; + +SELECT 'supernova'::tsvector @@ 'super'::tsquery AS "false"; +SELECT 'supeanova supernova'::tsvector @@ 'super'::tsquery AS "false"; +SELECT 'supeznova supernova'::tsvector @@ 'super'::tsquery AS "false"; +SELECT 'supernova'::tsvector @@ 'super:*'::tsquery AS "true"; +SELECT 'supeanova supernova'::tsvector @@ 'super:*'::tsquery AS "true"; +SELECT 'supeznova supernova'::tsvector @@ 'super:*'::tsquery AS "true"; + +--phrase search +SELECT to_tsvector('simple', '1 2 3 1') @@ '1 <-> 2' AS "true"; +SELECT to_tsvector('simple', '1 2 3 1') @@ '1 <2> 2' AS "false"; +SELECT to_tsvector('simple', '1 2 3 1') @@ '1 <-> 3' AS "false"; +SELECT to_tsvector('simple', '1 2 3 1') @@ '1 <2> 3' AS "true"; +SELECT to_tsvector('simple', '1 2 1 2') @@ '1 <3> 2' AS "true"; + +SELECT to_tsvector('simple', '1 2 11 3') @@ '1 <-> 3' AS "false"; +SELECT to_tsvector('simple', '1 2 11 3') @@ '1:* <-> 3' AS "true"; + +SELECT to_tsvector('simple', '1 2 3 4') @@ '1 <-> 2 <-> 3' AS "true"; +SELECT to_tsvector('simple', '1 2 3 4') @@ '(1 <-> 2) <-> 3' AS "true"; +SELECT to_tsvector('simple', '1 2 3 4') @@ '1 <-> (2 <-> 3)' AS "true"; +SELECT to_tsvector('simple', '1 2 3 4') @@ '1 <2> (2 <-> 3)' AS "false"; +SELECT to_tsvector('simple', '1 2 1 2 3 4') @@ '(1 <-> 2) <-> 3' AS "true"; +SELECT to_tsvector('simple', '1 2 1 2 3 4') @@ '1 <-> 2 <-> 3' AS "true"; +-- without position data, phrase search does not match +SELECT strip(to_tsvector('simple', '1 2 3 4')) @@ '1 <-> 2 <-> 3' AS "false"; + +select to_tsvector('simple', 'q x q y') @@ 'q <-> (x & y)' AS "false"; +select to_tsvector('simple', 'q x') @@ 'q <-> (x | y <-> z)' AS "true"; +select to_tsvector('simple', 'q y') @@ 'q <-> (x | y <-> z)' AS "false"; +select to_tsvector('simple', 'q y z') @@ 'q <-> (x | y <-> z)' AS "true"; +select to_tsvector('simple', 'q y x') @@ 'q <-> (x | y <-> z)' AS "false"; +select to_tsvector('simple', 'q x y') @@ 'q <-> (x | y <-> z)' AS "true"; +select to_tsvector('simple', 'q x') @@ '(x | y <-> z) <-> q' AS "false"; +select to_tsvector('simple', 'x q') @@ '(x | y <-> z) <-> q' AS "true"; +select to_tsvector('simple', 'x y q') @@ '(x | y <-> z) <-> q' AS "false"; +select to_tsvector('simple', 'x y z') @@ '(x | y <-> z) <-> q' AS "false"; +select to_tsvector('simple', 'x y z q') @@ '(x | y <-> z) <-> q' AS "true"; +select to_tsvector('simple', 'y z q') @@ '(x | y <-> z) <-> q' AS "true"; +select to_tsvector('simple', 'y y q') @@ '(x | y <-> z) <-> q' AS "false"; +select to_tsvector('simple', 'y y q') @@ '(!x | y <-> z) <-> q' AS "true"; +select to_tsvector('simple', 'x y q') @@ '(!x | y <-> z) <-> q' AS "true"; +select to_tsvector('simple', 'y y q') @@ '(x | y <-> !z) <-> q' AS "true"; +select to_tsvector('simple', 'x q') @@ '(x | y <-> !z) <-> q' AS "true"; +select to_tsvector('simple', 'x q') @@ '(!x | y <-> z) <-> q' AS "false"; +select to_tsvector('simple', 'z q') @@ '(!x | y <-> z) <-> q' AS "true"; +select to_tsvector('simple', 'x y q') @@ '(!x | y) <-> y <-> q' AS "false"; +select to_tsvector('simple', 'x y q') @@ '(!x | !y) <-> y <-> q' AS "true"; +select to_tsvector('simple', 'x y q') @@ '(x | !y) <-> y <-> q' AS "true"; +select to_tsvector('simple', 'x y q') @@ '(x | !!z) <-> y <-> q' AS "true"; +select to_tsvector('simple', 'x y q y') @@ '!x <-> y' AS "true"; +select to_tsvector('simple', 'x y q y') @@ '!x <-> !y' AS "true"; +select to_tsvector('simple', 'x y q y') @@ '!x <-> !!y' AS "true"; +select to_tsvector('simple', 'x y q y') @@ '!(x <-> y)' AS "false"; +select to_tsvector('simple', 'x y q y') @@ '!(x <2> y)' AS "true"; +select strip(to_tsvector('simple', 'x y q y')) @@ '!x <-> y' AS "false"; +select strip(to_tsvector('simple', 'x y q y')) @@ '!x <-> !y' AS "false"; +select strip(to_tsvector('simple', 'x y q y')) @@ '!x <-> !!y' AS "false"; +select strip(to_tsvector('simple', 'x y q y')) @@ '!(x <-> y)' AS "true"; +select strip(to_tsvector('simple', 'x y q y')) @@ '!(x <2> y)' AS "true"; +select to_tsvector('simple', 'x y q y') @@ '!foo' AS "true"; +select to_tsvector('simple', '') @@ '!foo' AS "true"; + +--ranking +SELECT ts_rank(' a:1 s:2C d g'::tsvector, 'a | s'); +SELECT ts_rank(' a:1 sa:2C d g'::tsvector, 'a | s'); +SELECT ts_rank(' a:1 sa:2C d g'::tsvector, 'a | s:*'); +SELECT ts_rank(' a:1 sa:2C d g'::tsvector, 'a | sa:*'); +SELECT ts_rank(' a:1 s:2B d g'::tsvector, 'a | s'); +SELECT ts_rank(' a:1 s:2 d g'::tsvector, 'a | s'); +SELECT ts_rank(' a:1 s:2C d g'::tsvector, 'a & s'); +SELECT ts_rank(' a:1 s:2B d g'::tsvector, 'a & s'); +SELECT ts_rank(' a:1 s:2 d g'::tsvector, 'a & s'); + +SELECT ts_rank_cd(' a:1 s:2C d g'::tsvector, 'a | s'); +SELECT ts_rank_cd(' a:1 sa:2C d g'::tsvector, 'a | s'); +SELECT ts_rank_cd(' a:1 sa:2C d g'::tsvector, 'a | s:*'); +SELECT ts_rank_cd(' a:1 sa:2C d g'::tsvector, 'a | sa:*'); +SELECT ts_rank_cd(' a:1 sa:3C sab:2c d g'::tsvector, 'a | sa:*'); +SELECT ts_rank_cd(' a:1 s:2B d g'::tsvector, 'a | s'); +SELECT ts_rank_cd(' a:1 s:2 d g'::tsvector, 'a | s'); +SELECT ts_rank_cd(' a:1 s:2C d g'::tsvector, 'a & s'); +SELECT ts_rank_cd(' a:1 s:2B d g'::tsvector, 'a & s'); +SELECT ts_rank_cd(' a:1 s:2 d g'::tsvector, 'a & s'); + +SELECT ts_rank_cd(' a:1 s:2A d g'::tsvector, 'a <-> s'); +SELECT ts_rank_cd(' a:1 s:2C d g'::tsvector, 'a <-> s'); +SELECT ts_rank_cd(' a:1 s:2 d g'::tsvector, 'a <-> s'); +SELECT ts_rank_cd(' a:1 s:2 d:2A g'::tsvector, 'a <-> s'); +SELECT ts_rank_cd(' a:1 s:2,3A d:2A g'::tsvector, 'a <2> s:A'); +SELECT ts_rank_cd(' a:1 b:2 s:3A d:2A g'::tsvector, 'a <2> s:A'); +SELECT ts_rank_cd(' a:1 sa:2D sb:2A g'::tsvector, 'a <-> s:*'); +SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a <-> s:*'); +SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a <-> s:* <-> sa:A'); +SELECT ts_rank_cd(' a:1 sa:2A sb:2D g'::tsvector, 'a <-> s:* <-> sa:B'); + +SELECT 'a:1 b:2'::tsvector @@ 'a <-> b'::tsquery AS "true"; +SELECT 'a:1 b:2'::tsvector @@ 'a <0> b'::tsquery AS "false"; +SELECT 'a:1 b:2'::tsvector @@ 'a <1> b'::tsquery AS "true"; +SELECT 'a:1 b:2'::tsvector @@ 'a <2> b'::tsquery AS "false"; +SELECT 'a:1 b:3'::tsvector @@ 'a <-> b'::tsquery AS "false"; +SELECT 'a:1 b:3'::tsvector @@ 'a <0> b'::tsquery AS "false"; +SELECT 'a:1 b:3'::tsvector @@ 'a <1> b'::tsquery AS "false"; +SELECT 'a:1 b:3'::tsvector @@ 'a <2> b'::tsquery AS "true"; +SELECT 'a:1 b:3'::tsvector @@ 'a <3> b'::tsquery AS "false"; +SELECT 'a:1 b:3'::tsvector @@ 'a <0> a:*'::tsquery AS "true"; + +-- tsvector editing operations + +SELECT strip('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd'::tsvector); +SELECT strip('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); +SELECT strip('base hidden rebel spaceship strike'::tsvector); + +SELECT ts_delete(to_tsvector('english', 'Rebel spaceships, striking from a hidden base'), 'spaceship'); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'base'); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bas'); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'bases'); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, 'spaceship'); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, 'spaceship'); + +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','rebel']); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceships','rebel']); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceshi','rebel']); +SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','leya','rebel']); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel']); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel','rebel']); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', NULL]); + +SELECT unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); +SELECT unnest('base hidden rebel spaceship strike'::tsvector); +SELECT * FROM unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); +SELECT * FROM unnest('base hidden rebel spaceship strike'::tsvector); +SELECT lexeme, positions[1] from unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); + +SELECT tsvector_to_array('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); +SELECT tsvector_to_array('base hidden rebel spaceship strike'::tsvector); + +SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship','strike']); +SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship', NULL]); +-- array_to_tsvector must sort and de-dup +SELECT array_to_tsvector(ARRAY['foo','bar','baz','bar']); + +SELECT setweight('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd zxc:81,567,222A'::tsvector, 'c'); +SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c'); +SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a}'); +SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a}'); +SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a,zxc}'); +SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', '{a,zxc}'); +SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', ARRAY['a', 'zxc', NULL]); + +SELECT ts_filter('base:7A empir:17 evil:15 first:11 galact:16 hidden:6A rebel:1A spaceship:2A strike:3A victori:12 won:9'::tsvector, '{a}'); +SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a}'); +SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a,b,NULL}'); diff --git a/src/test/singlenode_regress/sql/tuplesort.sql b/src/test/singlenode_regress/sql/tuplesort.sql new file mode 100644 index 00000000000..a4c99300e43 --- /dev/null +++ b/src/test/singlenode_regress/sql/tuplesort.sql @@ -0,0 +1,306 @@ +-- only use parallelism when explicitly intending to do so +SET max_parallel_maintenance_workers = 0; +SET max_parallel_workers = 0; + +-- A table with contents that, when sorted, triggers abbreviated +-- key aborts. One easy way to achieve that is to use uuids that all +-- have the same prefix, as abbreviated keys for uuids just use the +-- first sizeof(Datum) bytes. +CREATE TEMP TABLE abbrev_abort_uuids ( + id serial not null, + abort_increasing uuid, + abort_decreasing uuid, + noabort_increasing uuid, + noabort_decreasing uuid); + +INSERT INTO abbrev_abort_uuids (abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing) + SELECT + ('00000000-0000-0000-0000-'||to_char(g.i, '000000000000FM'))::uuid abort_increasing, + ('00000000-0000-0000-0000-'||to_char(20000 - g.i, '000000000000FM'))::uuid abort_decreasing, + (to_char(g.i % 10009, '00000000FM')||'-0000-0000-0000-'||to_char(g.i, '000000000000FM'))::uuid noabort_increasing, + (to_char(((20000 - g.i) % 10009), '00000000FM')||'-0000-0000-0000-'||to_char(20000 - g.i, '000000000000FM'))::uuid noabort_decreasing + FROM generate_series(0, 20000, 1) g(i); + +-- and a few NULLs +INSERT INTO abbrev_abort_uuids(id) VALUES(0); +INSERT INTO abbrev_abort_uuids DEFAULT VALUES; +INSERT INTO abbrev_abort_uuids DEFAULT VALUES; + +-- add just a few duplicates +INSERT INTO abbrev_abort_uuids (abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing) + SELECT abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing + FROM abbrev_abort_uuids + WHERE (id < 10 OR id > 19990) AND id % 3 = 0 AND abort_increasing is not null; + +---- +-- Check sort node uses of tuplesort wrt. abbreviated keys +---- + +-- plain sort triggering abbreviated abort +SELECT abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_increasing OFFSET 20000 - 4; +SELECT abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_decreasing NULLS FIRST OFFSET 20000 - 4; + +-- plain sort not triggering abbreviated abort +SELECT noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_increasing OFFSET 20000 - 4; +SELECT noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing NULLS FIRST OFFSET 20000 - 4; + +-- bounded sort (disables abbreviated keys) +SELECT abort_increasing, noabort_increasing FROM abbrev_abort_uuids ORDER BY abort_increasing LIMIT 5; +SELECT abort_increasing, noabort_increasing FROM abbrev_abort_uuids ORDER BY noabort_increasing NULLS FIRST LIMIT 5; + + +---- +-- Check index creation uses of tuplesort wrt. abbreviated keys +---- + +-- index creation using abbreviated keys successfully +CREATE INDEX abbrev_abort_uuids__noabort_increasing_idx ON abbrev_abort_uuids (noabort_increasing); +CREATE INDEX abbrev_abort_uuids__noabort_decreasing_idx ON abbrev_abort_uuids (noabort_decreasing); + +-- verify +EXPLAIN (COSTS OFF) +SELECT id, noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_increasing LIMIT 5; +SELECT id, noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_increasing LIMIT 5; +EXPLAIN (COSTS OFF) +SELECT id, noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing LIMIT 5; +SELECT id, noabort_increasing, noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing LIMIT 5; + +-- index creation using abbreviated keys, hitting abort +CREATE INDEX abbrev_abort_uuids__abort_increasing_idx ON abbrev_abort_uuids (abort_increasing); +CREATE INDEX abbrev_abort_uuids__abort_decreasing_idx ON abbrev_abort_uuids (abort_decreasing); + +-- verify +EXPLAIN (COSTS OFF) +SELECT id, abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_increasing LIMIT 5; +SELECT id, abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_increasing LIMIT 5; +EXPLAIN (COSTS OFF) +SELECT id, abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_decreasing LIMIT 5; +SELECT id, abort_increasing, abort_decreasing FROM abbrev_abort_uuids ORDER BY abort_decreasing LIMIT 5; + + +---- +-- Check CLUSTER uses of tuplesort wrt. abbreviated keys +---- + +-- when aborting, increasing order +BEGIN; +SET LOCAL enable_indexscan = false; +CLUSTER abbrev_abort_uuids USING abbrev_abort_uuids__abort_increasing_idx; + +-- head +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid LIMIT 5; + +-- tail +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid DESC LIMIT 5; +ROLLBACK; + +-- when aborting, decreasing order +BEGIN; +SET LOCAL enable_indexscan = false; +CLUSTER abbrev_abort_uuids USING abbrev_abort_uuids__abort_decreasing_idx; + +-- head +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid LIMIT 5; + +-- tail +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid DESC LIMIT 5; +ROLLBACK; + +-- when not aborting, increasing order +BEGIN; +SET LOCAL enable_indexscan = false; +CLUSTER abbrev_abort_uuids USING abbrev_abort_uuids__noabort_increasing_idx; + +-- head +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid LIMIT 5; + +-- tail +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid DESC LIMIT 5; +ROLLBACK; + +-- when no aborting, decreasing order +BEGIN; +SET LOCAL enable_indexscan = false; +CLUSTER abbrev_abort_uuids USING abbrev_abort_uuids__noabort_decreasing_idx; + +-- head +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid LIMIT 5; + +-- tail +SELECT id, abort_increasing, abort_decreasing, noabort_increasing, noabort_decreasing +FROM abbrev_abort_uuids +ORDER BY ctid DESC LIMIT 5; +ROLLBACK; + +---- +-- test forward and backward scans for in-memory and disk based tuplesort +---- + +-- in-memory +BEGIN; +SET LOCAL enable_indexscan = false; +-- unfortunately can't show analyze output confirming sort method, +-- the memory used output wouldn't be stable +EXPLAIN (COSTS OFF) DECLARE c SCROLL CURSOR FOR SELECT noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing; +DECLARE c SCROLL CURSOR FOR SELECT noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing; + +-- first and second +FETCH NEXT FROM c; +FETCH NEXT FROM c; + +--start_ignore +--GDPB doesn't support backward fetch. +/* + * scroll beyond beginning + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + * + * -- scroll beyond end end + * FETCH LAST FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + * FETCH NEXT FROM c; + * FETCH NEXT FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + */ +--end_ignore + +COMMIT; + +-- disk based +BEGIN; +SET LOCAL enable_indexscan = false; +SET LOCAL work_mem = '100kB'; +-- unfortunately can't show analyze output confirming sort method, +-- the memory used output wouldn't be stable +EXPLAIN (COSTS OFF) DECLARE c SCROLL CURSOR FOR SELECT noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing; +DECLARE c SCROLL CURSOR FOR SELECT noabort_decreasing FROM abbrev_abort_uuids ORDER BY noabort_decreasing; + +-- first and second +FETCH NEXT FROM c; +FETCH NEXT FROM c; +--start_ignore +-- scroll beyond beginning +/* + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + * + * -- scroll beyond end end + * FETCH LAST FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + * FETCH NEXT FROM c; + * FETCH NEXT FROM c; + * FETCH BACKWARD FROM c; + * FETCH NEXT FROM c; + */ +--end_ignore + +COMMIT; + + +---- +-- test tuplesort using both in-memory and disk sort +--- + +-- memory based +SELECT + -- fixed-width by-value datum + (array_agg(id ORDER BY id DESC NULLS FIRST))[0:5], + -- fixed-width by-ref datum + (array_agg(abort_increasing ORDER BY abort_increasing DESC NULLS LAST))[0:5], + -- variable-width datum + (array_agg(id::text ORDER BY id::text DESC NULLS LAST))[0:5], + -- fixed width by-value datum tuplesort + percentile_disc(0.99) WITHIN GROUP (ORDER BY id), + -- ensure state is shared + percentile_disc(0.01) WITHIN GROUP (ORDER BY id), + -- fixed width by-ref datum tuplesort + percentile_disc(0.8) WITHIN GROUP (ORDER BY abort_increasing), + -- variable width by-ref datum tuplesort + percentile_disc(0.2) WITHIN GROUP (ORDER BY id::text), + -- multi-column tuplesort + rank('00000000-0000-0000-0000-000000000000', '2', '2') WITHIN GROUP (ORDER BY noabort_increasing, id, id::text) +FROM ( + SELECT * FROM abbrev_abort_uuids + UNION ALL + SELECT NULL, NULL, NULL, NULL, NULL) s; + +-- disk based (see also above) +BEGIN; +SET LOCAL work_mem = '100kB'; + +SELECT + (array_agg(id ORDER BY id DESC NULLS FIRST))[0:5], + (array_agg(abort_increasing ORDER BY abort_increasing DESC NULLS LAST))[0:5], + (array_agg(id::text ORDER BY id::text DESC NULLS LAST))[0:5], + percentile_disc(0.99) WITHIN GROUP (ORDER BY id), + percentile_disc(0.01) WITHIN GROUP (ORDER BY id), + percentile_disc(0.8) WITHIN GROUP (ORDER BY abort_increasing), + percentile_disc(0.2) WITHIN GROUP (ORDER BY id::text), + rank('00000000-0000-0000-0000-000000000000', '2', '2') WITHIN GROUP (ORDER BY noabort_increasing, id, id::text) +FROM ( + SELECT * FROM abbrev_abort_uuids + UNION ALL + SELECT NULL, NULL, NULL, NULL, NULL) s; + +ROLLBACK; + + +---- +-- test tuplesort mark/restore +--- + +CREATE TEMP TABLE test_mark_restore(col1 int, col2 int, col12 int); +-- need a few duplicates for mark/restore to matter +INSERT INTO test_mark_restore(col1, col2, col12) + SELECT a.i, b.i, a.i * b.i FROM generate_series(1, 500) a(i), generate_series(1, 5) b(i); + +BEGIN; + +SET LOCAL enable_nestloop = off; +SET LOCAL enable_hashjoin = off; +SET LOCAL enable_material = off; + +-- set query into variable once, to avoid repetition of the fairly long query +SELECT $$ + SELECT col12, count(distinct a.col1), count(distinct a.col2), count(distinct b.col1), count(distinct b.col2), count(*) + FROM test_mark_restore a + JOIN test_mark_restore b USING(col12) + GROUP BY 1 + HAVING count(*) > 1 + ORDER BY 2 DESC, 1 DESC, 3 DESC, 4 DESC, 5 DESC, 6 DESC + LIMIT 10 +$$ AS qry \gset + +-- test mark/restore with in-memory sorts +EXPLAIN (COSTS OFF) :qry; +:qry; + +-- test mark/restore with on-disk sorts +SET LOCAL work_mem = '100kB'; +EXPLAIN (COSTS OFF) :qry; +:qry; + +COMMIT; diff --git a/src/test/singlenode_regress/sql/txid.sql b/src/test/singlenode_regress/sql/txid.sql new file mode 100644 index 00000000000..8d5ac98a892 --- /dev/null +++ b/src/test/singlenode_regress/sql/txid.sql @@ -0,0 +1,102 @@ +-- txid_snapshot data type and related functions +-- Note: these are backward-compatibility functions and types, and have been +-- replaced by new xid8-based variants. See xid.sql. The txid variants will +-- be removed in a future release. + +-- i/o +select '12:13:'::txid_snapshot; +select '12:18:14,16'::txid_snapshot; +select '12:16:14,14'::txid_snapshot; + +-- errors +select '31:12:'::txid_snapshot; +select '0:1:'::txid_snapshot; +select '12:13:0'::txid_snapshot; +select '12:16:14,13'::txid_snapshot; + +create temp table snapshot_test ( + nr integer, + snap txid_snapshot +); + +insert into snapshot_test values (1, '12:13:'); +insert into snapshot_test values (2, '12:20:13,15,18'); +insert into snapshot_test values (3, '100001:100009:100005,100007,100008'); +insert into snapshot_test values (4, '100:150:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131'); +select snap from snapshot_test order by nr; + +select txid_snapshot_xmin(snap), + txid_snapshot_xmax(snap), + txid_snapshot_xip(snap) +from snapshot_test order by nr; + +select id, txid_visible_in_snapshot(id, snap) +from snapshot_test, generate_series(11, 21) id +where nr = 2; + +-- test bsearch +select id, txid_visible_in_snapshot(id, snap) +from snapshot_test, generate_series(90, 160) id +where nr = 4; + +-- test current values also +select txid_current() >= txid_snapshot_xmin(txid_current_snapshot()); + +-- we can't assume current is always less than xmax, however + +select txid_visible_in_snapshot(txid_current(), txid_current_snapshot()); + +-- test 64bitness + +select txid_snapshot '1000100010001000:1000100010001100:1000100010001012,1000100010001013'; +select txid_visible_in_snapshot('1000100010001012', '1000100010001000:1000100010001100:1000100010001012,1000100010001013'); +select txid_visible_in_snapshot('1000100010001015', '1000100010001000:1000100010001100:1000100010001012,1000100010001013'); + +-- test 64bit overflow +SELECT txid_snapshot '1:9223372036854775807:3'; +SELECT txid_snapshot '1:9223372036854775808:3'; + +-- test txid_current_if_assigned +BEGIN; +SELECT txid_current_if_assigned() IS NULL; +SELECT txid_current() \gset +SELECT txid_current_if_assigned() IS NOT DISTINCT FROM BIGINT :'txid_current'; +COMMIT; + +-- test xid status functions +BEGIN; +SELECT txid_current() AS committed \gset +COMMIT; + +BEGIN; +SELECT txid_current() AS rolledback \gset +ROLLBACK; + +BEGIN; +SELECT txid_current() AS inprogress \gset + +SELECT txid_status(:committed) AS committed; +SELECT txid_status(:rolledback) AS rolledback; +SELECT txid_status(:inprogress) AS inprogress; +SELECT txid_status(1); -- BootstrapTransactionId is always committed +SELECT txid_status(2); -- FrozenTransactionId is always committed +SELECT txid_status(3); -- in regress testing FirstNormalTransactionId will always be behind oldestXmin + +COMMIT; + +BEGIN; +CREATE FUNCTION test_future_xid_status(bigint) +RETURNS void +LANGUAGE plpgsql +AS +$$ +BEGIN + PERFORM txid_status($1); + RAISE EXCEPTION 'didn''t ERROR at xid in the future as expected'; +EXCEPTION + WHEN invalid_parameter_value THEN + RAISE NOTICE 'Got expected error for xid in the future'; +END; +$$; +SELECT test_future_xid_status(:inprogress + 10000); +ROLLBACK; diff --git a/src/test/singlenode_regress/sql/type_sanity.sql b/src/test/singlenode_regress/sql/type_sanity.sql new file mode 100644 index 00000000000..1cf116978f0 --- /dev/null +++ b/src/test/singlenode_regress/sql/type_sanity.sql @@ -0,0 +1,622 @@ +-- +-- TYPE_SANITY +-- Sanity checks for common errors in making type-related system tables: +-- pg_type, pg_class, pg_attribute, pg_range. +-- +-- None of the SELECTs here should ever find any matching entries, +-- so the expected output is easy to maintain ;-). +-- A test failure indicates someone messed up an entry in the system tables. +-- +-- NB: we assume the oidjoins test will have caught any dangling links, +-- that is OID or REGPROC fields that are not zero and do not match some +-- row in the linked-to table. However, if we want to enforce that a link +-- field can't be 0, we have to check it here. + +-- **************** pg_type **************** + +-- Look for illegal values in pg_type fields. + +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typnamespace = 0 OR + (p1.typlen <= 0 AND p1.typlen != -1 AND p1.typlen != -2) OR + (p1.typtype not in ('b', 'c', 'd', 'e', 'p', 'r', 'm')) OR + NOT p1.typisdefined OR + (p1.typalign not in ('c', 's', 'i', 'd')) OR + (p1.typstorage not in ('p', 'x', 'e', 'm')); + +-- Look for "pass by value" types that can't be passed by value. + +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typbyval AND + (p1.typlen != 1 OR p1.typalign != 'c') AND + (p1.typlen != 2 OR p1.typalign != 's') AND + (p1.typlen != 4 OR p1.typalign != 'i') AND + (p1.typlen != 8 OR p1.typalign != 'd'); + +-- Look for "toastable" types that aren't varlena. + +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typstorage != 'p' AND + (p1.typbyval OR p1.typlen != -1); + +-- Look for complex types that do not have a typrelid entry, +-- or basic types that do. + +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR + (p1.typtype != 'c' AND p1.typrelid != 0); + +-- Look for types that should have an array type but don't. +-- Generally anything that's not a pseudotype should have an array type. +-- However, we do have a small number of exceptions. + +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typtype not in ('c','d','p') AND p1.typname NOT LIKE E'\\_%' + AND NOT EXISTS + (SELECT 1 FROM pg_type as p2 + WHERE p2.typname = ('_' || p1.typname)::name AND + p2.typelem = p1.oid and p1.typarray = p2.oid) +ORDER BY p1.oid; + +-- Make sure typarray points to a "true" array type of our own base +SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, + p2.typsubscript +FROM pg_type p1 LEFT JOIN pg_type p2 ON (p1.typarray = p2.oid) +WHERE p1.typarray <> 0 AND + (p2.oid IS NULL OR + p2.typsubscript <> 'array_subscript_handler'::regproc); + +-- Look for range types that do not have a pg_range entry +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE p1.typtype = 'r' AND + NOT EXISTS(SELECT 1 FROM pg_range r WHERE rngtypid = p1.oid); + +-- Look for range types whose typalign isn't sufficient +SELECT p1.oid, p1.typname, p1.typalign, p2.typname, p2.typalign +FROM pg_type as p1 + LEFT JOIN pg_range as r ON rngtypid = p1.oid + LEFT JOIN pg_type as p2 ON rngsubtype = p2.oid +WHERE p1.typtype = 'r' AND + (p1.typalign != (CASE WHEN p2.typalign = 'd' THEN 'd'::"char" + ELSE 'i'::"char" END) + OR p2.oid IS NULL); + +-- Text conversion routines must be provided. + +SELECT p1.oid, p1.typname +FROM pg_type as p1 +WHERE (p1.typinput = 0 OR p1.typoutput = 0); + +-- Check for bogus typinput routines + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typinput = p2.oid AND NOT + ((p2.pronargs = 1 AND p2.proargtypes[0] = 'cstring'::regtype) OR + (p2.pronargs = 2 AND p2.proargtypes[0] = 'cstring'::regtype AND + p2.proargtypes[1] = 'oid'::regtype) OR + (p2.pronargs = 3 AND p2.proargtypes[0] = 'cstring'::regtype AND + p2.proargtypes[1] = 'oid'::regtype AND + p2.proargtypes[2] = 'int4'::regtype)); + +-- Check for type of the variadic array parameter's elements. +-- provariadic should be ANYOID if the type of the last element is ANYOID, +-- ANYELEMENTOID if the type of the last element is ANYARRAYOID, +-- ANYCOMPATIBLEOID if the type of the last element is ANYCOMPATIBLEARRAYOID, +-- and otherwise the element type corresponding to the array type. + +SELECT oid::regprocedure, provariadic::regtype, proargtypes::regtype[] +FROM pg_proc +WHERE provariadic != 0 +AND case proargtypes[array_length(proargtypes, 1)-1] + WHEN '"any"'::regtype THEN '"any"'::regtype + WHEN 'anyarray'::regtype THEN 'anyelement'::regtype + WHEN 'anycompatiblearray'::regtype THEN 'anycompatible'::regtype + ELSE (SELECT t.oid + FROM pg_type t + WHERE t.typarray = proargtypes[array_length(proargtypes, 1)-1]) + END != provariadic; + +-- Check that all and only those functions with a variadic type have +-- a variadic argument. +SELECT oid::regprocedure, proargmodes, provariadic +FROM pg_proc +WHERE (proargmodes IS NOT NULL AND 'v' = any(proargmodes)) + IS DISTINCT FROM + (provariadic != 0); + +-- As of 8.0, this check finds refcursor, which is borrowing +-- other types' I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typinput = p2.oid AND p1.typtype in ('b', 'p') AND NOT + (p1.typelem != 0 AND p1.typlen < 0) AND NOT + (p2.prorettype = p1.oid AND NOT p2.proretset) +ORDER BY 1; + +-- Varlena array types will point to array_in +-- Exception as of 8.1: int2vector and oidvector have their own I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typinput = p2.oid AND + (p1.typelem != 0 AND p1.typlen < 0) AND NOT + (p2.oid = 'array_in'::regproc) +ORDER BY 1; + +-- Make sure typarray points to a varlena array type of our own base +SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, + p2.typelem, p2.typlen +FROM pg_type p1 LEFT JOIN pg_type p2 ON (p1.typarray = p2.oid) +WHERE p1.typarray <> 0 AND + (p2.oid IS NULL OR p2.typelem <> p1.oid OR p2.typlen <> -1); + +-- typinput routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typinput = p2.oid AND p2.provolatile NOT IN ('i', 's'); + +-- Composites, domains, enums, multiranges, ranges should all use the same input routines +SELECT DISTINCT typtype, typinput +FROM pg_type AS p1 +WHERE p1.typtype not in ('b', 'p') +ORDER BY 1; + +-- Check for bogus typoutput routines + +-- As of 8.0, this check finds refcursor, which is borrowing +-- other types' I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typoutput = p2.oid AND p1.typtype in ('b', 'p') AND NOT + (p2.pronargs = 1 AND + (p2.proargtypes[0] = p1.oid OR + (p2.oid = 'array_out'::regproc AND + p1.typelem != 0 AND p1.typlen = -1))) +ORDER BY 1; + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typoutput = p2.oid AND NOT + (p2.prorettype = 'cstring'::regtype AND NOT p2.proretset); + +-- typoutput routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typoutput = p2.oid AND p2.provolatile NOT IN ('i', 's'); + +-- Composites, enums, multiranges, ranges should all use the same output routines +SELECT DISTINCT typtype, typoutput +FROM pg_type AS p1 +WHERE p1.typtype not in ('b', 'd', 'p') +ORDER BY 1; + +-- Domains should have same typoutput as their base types +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type AS p1 LEFT JOIN pg_type AS p2 ON p1.typbasetype = p2.oid +WHERE p1.typtype = 'd' AND p1.typoutput IS DISTINCT FROM p2.typoutput; + +-- Check for bogus typreceive routines + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typreceive = p2.oid AND NOT + ((p2.pronargs = 1 AND p2.proargtypes[0] = 'internal'::regtype) OR + (p2.pronargs = 2 AND p2.proargtypes[0] = 'internal'::regtype AND + p2.proargtypes[1] = 'oid'::regtype) OR + (p2.pronargs = 3 AND p2.proargtypes[0] = 'internal'::regtype AND + p2.proargtypes[1] = 'oid'::regtype AND + p2.proargtypes[2] = 'int4'::regtype)); + +-- As of 7.4, this check finds refcursor, which is borrowing +-- other types' I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typreceive = p2.oid AND p1.typtype in ('b', 'p') AND NOT + (p1.typelem != 0 AND p1.typlen < 0) AND NOT + (p2.prorettype = p1.oid AND NOT p2.proretset) +ORDER BY 1; + +-- Varlena array types will point to array_recv +-- Exception as of 8.1: int2vector and oidvector have their own I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typreceive = p2.oid AND + (p1.typelem != 0 AND p1.typlen < 0) AND NOT + (p2.oid = 'array_recv'::regproc) +ORDER BY 1; + +-- Array types should have same typdelim as their element types +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type p1, pg_type p2 +WHERE p1.typelem = p2.oid and p1.typdelim != p2.typdelim + AND p1.typname like E'\\_%'; + + +-- Suspicious if typreceive doesn't take same number of args as typinput +SELECT p1.oid, p1.typname, p2.oid, p2.proname, p3.oid, p3.proname +FROM pg_type AS p1, pg_proc AS p2, pg_proc AS p3 +WHERE p1.typinput = p2.oid AND p1.typreceive = p3.oid AND + p2.pronargs != p3.pronargs; + +-- typreceive routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typreceive = p2.oid AND p2.provolatile NOT IN ('i', 's'); + +-- Composites, domains, enums, multiranges, ranges should all use the same receive routines +SELECT DISTINCT typtype, typreceive +FROM pg_type AS p1 +WHERE p1.typtype not in ('b', 'p') +ORDER BY 1; + +-- Check for bogus typsend routines + +-- As of 7.4, this check finds refcursor, which is borrowing +-- other types' I/O routines +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typsend = p2.oid AND p1.typtype in ('b', 'p') AND NOT + (p2.pronargs = 1 AND + (p2.proargtypes[0] = p1.oid OR + (p2.oid = 'array_send'::regproc AND + p1.typelem != 0 AND p1.typlen = -1))) +ORDER BY 1; + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typsend = p2.oid AND NOT + (p2.prorettype = 'bytea'::regtype AND NOT p2.proretset); + +-- typsend routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typsend = p2.oid AND p2.provolatile NOT IN ('i', 's'); + +-- Composites, enums, multiranges, ranges should all use the same send routines +SELECT DISTINCT typtype, typsend +FROM pg_type AS p1 +WHERE p1.typtype not in ('b', 'd', 'p') +ORDER BY 1; + +-- Domains should have same typsend as their base types +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type AS p1 LEFT JOIN pg_type AS p2 ON p1.typbasetype = p2.oid +WHERE p1.typtype = 'd' AND p1.typsend IS DISTINCT FROM p2.typsend; + +-- Check for bogus typmodin routines + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typmodin = p2.oid AND NOT + (p2.pronargs = 1 AND + p2.proargtypes[0] = 'cstring[]'::regtype AND + p2.prorettype = 'int4'::regtype AND NOT p2.proretset); + +-- typmodin routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typmodin = p2.oid AND p2.provolatile NOT IN ('i', 's'); + +-- Check for bogus typmodout routines + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typmodout = p2.oid AND NOT + (p2.pronargs = 1 AND + p2.proargtypes[0] = 'int4'::regtype AND + p2.prorettype = 'cstring'::regtype AND NOT p2.proretset); + +-- typmodout routines should not be volatile +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typmodout = p2.oid AND p2.provolatile NOT IN ('i', 's'); + +-- Array types should have same typmodin/out as their element types + +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type AS p1, pg_type AS p2 +WHERE p1.typelem = p2.oid AND NOT + (p1.typmodin = p2.typmodin AND p1.typmodout = p2.typmodout); + +-- Array types should have same typdelim as their element types + +SELECT p1.oid, p1.typname, p2.oid, p2.typname +FROM pg_type AS p1, pg_type AS p2 +WHERE p1.typarray = p2.oid AND NOT (p1.typdelim = p2.typdelim); + +-- Look for array types whose typalign isn't sufficient + +SELECT p1.oid, p1.typname, p1.typalign, p2.typname, p2.typalign +FROM pg_type AS p1, pg_type AS p2 +WHERE p1.typarray = p2.oid AND + p2.typalign != (CASE WHEN p1.typalign = 'd' THEN 'd'::"char" + ELSE 'i'::"char" END); + +-- Check for typelem set without a handler + +SELECT p1.oid, p1.typname, p1.typelem +FROM pg_type AS p1 +WHERE p1.typelem != 0 AND p1.typsubscript = 0; + +-- Check for misuse of standard subscript handlers + +SELECT p1.oid, p1.typname, + p1.typelem, p1.typlen, p1.typbyval +FROM pg_type AS p1 +WHERE p1.typsubscript = 'array_subscript_handler'::regproc AND NOT + (p1.typelem != 0 AND p1.typlen = -1 AND NOT p1.typbyval); + +SELECT p1.oid, p1.typname, + p1.typelem, p1.typlen, p1.typbyval +FROM pg_type AS p1 +WHERE p1.typsubscript = 'raw_array_subscript_handler'::regproc AND NOT + (p1.typelem != 0 AND p1.typlen > 0 AND NOT p1.typbyval); + +-- Check for bogus typanalyze routines + +SELECT p1.oid, p1.typname, p2.oid, p2.proname +FROM pg_type AS p1, pg_proc AS p2 +WHERE p1.typanalyze = p2.oid AND NOT + (p2.pronargs = 1 AND + p2.proargtypes[0] = 'internal'::regtype AND + p2.prorettype = 'bool'::regtype AND NOT p2.proretset); + +-- there does not seem to be a reason to care about volatility of typanalyze + +-- domains inherit their base type's typanalyze + +SELECT d.oid, d.typname, d.typanalyze, t.oid, t.typname, t.typanalyze +FROM pg_type d JOIN pg_type t ON d.typbasetype = t.oid +WHERE d.typanalyze != t.typanalyze; + +-- range_typanalyze should be used for all and only range types +-- (but exclude domains, which we checked above) + +SELECT t.oid, t.typname, t.typanalyze +FROM pg_type t LEFT JOIN pg_range r on t.oid = r.rngtypid +WHERE t.typbasetype = 0 AND + (t.typanalyze = 'range_typanalyze'::regproc) != (r.rngtypid IS NOT NULL); + +-- array_typanalyze should be used for all and only array types +-- (but exclude domains, which we checked above) +-- As of 9.2 this finds int2vector and oidvector, which are weird anyway + +SELECT t.oid, t.typname, t.typanalyze +FROM pg_type t +WHERE t.typbasetype = 0 AND + (t.typanalyze = 'array_typanalyze'::regproc) != + (t.typsubscript = 'array_subscript_handler'::regproc) +ORDER BY 1; + +-- **************** pg_class **************** + +-- Look for illegal values in pg_class fields + +SELECT p1.oid, p1.relname +FROM pg_class as p1 +WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR + relpersistence NOT IN ('p', 'u', 't') OR + relreplident NOT IN ('d', 'n', 'f', 'i'); + +-- All tables and indexes should have an access method. +SELECT p1.oid, p1.relname +FROM pg_class as p1 +WHERE p1.relkind NOT IN ('S', 'v', 'f', 'c') and + p1.relam = 0; + +-- Conversely, sequences, views, types shouldn't have them +SELECT p1.oid, p1.relname +FROM pg_class as p1 +WHERE p1.relkind IN ('S', 'v', 'f', 'c') and + p1.relam != 0; + +-- Indexes should have AMs of type 'i' +SELECT pc.oid, pc.relname, pa.amname, pa.amtype +FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) +WHERE pc.relkind IN ('i') and + pa.amtype != 'i'; + +-- Tables, matviews etc should have AMs of type 't' +SELECT pc.oid, pc.relname, pa.amname, pa.amtype +FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) +WHERE pc.relkind IN ('r', 't', 'm') and + pa.amtype != 't'; + +-- **************** pg_attribute **************** + +-- Look for illegal values in pg_attribute fields + +SELECT p1.attrelid, p1.attname +FROM pg_attribute as p1 +WHERE p1.attrelid = 0 OR p1.atttypid = 0 OR p1.attnum = 0 OR + p1.attcacheoff != -1 OR p1.attinhcount < 0 OR + (p1.attinhcount = 0 AND NOT p1.attislocal); + +-- Cross-check attnum against parent relation + +SELECT p1.attrelid, p1.attname, p2.oid, p2.relname +FROM pg_attribute AS p1, pg_class AS p2 +WHERE p1.attrelid = p2.oid AND p1.attnum > p2.relnatts; + +-- Detect missing pg_attribute entries: should have as many non-system +-- attributes as parent relation expects + +SELECT p1.oid, p1.relname +FROM pg_class AS p1 +WHERE p1.relnatts != (SELECT count(*) FROM pg_attribute AS p2 + WHERE p2.attrelid = p1.oid AND p2.attnum > 0); + +-- Cross-check against pg_type entry +-- NOTE: we allow attstorage to be 'plain' even when typstorage is not; +-- this is mainly for toast tables. +-- UNDONE: Turn this off until we can figure out why the new system columns cause a bunch of rows to be generated here??? +-- SELECT p1.attrelid, p1.attname, p2.oid, p2.typname +-- FROM pg_attribute AS p1, pg_type AS p2 +-- WHERE p1.atttypid = p2.oid AND +-- (p1.attlen != p2.typlen OR +-- p1.attalign != p2.typalign OR +-- p1.attbyval != p2.typbyval OR +-- (p1.attstorage != p2.typstorage AND p1.attstorage != 'p')); + +SELECT p1.attrelid, p1.attname, p2.oid, p2.typname +FROM pg_attribute AS p1, pg_type AS p2 +WHERE p1.atttypid = p2.oid AND + (p1.attlen != p2.typlen OR + p1.attalign != p2.typalign OR + p1.attbyval != p2.typbyval OR + (p1.attstorage != p2.typstorage AND p1.attstorage != 'p')); + +-- **************** pg_range **************** + +-- Look for illegal values in pg_range fields. + +SELECT p1.rngtypid, p1.rngsubtype +FROM pg_range as p1 +WHERE p1.rngtypid = 0 OR p1.rngsubtype = 0 OR p1.rngsubopc = 0; + +-- rngcollation should be specified iff subtype is collatable + +SELECT p1.rngtypid, p1.rngsubtype, p1.rngcollation, t.typcollation +FROM pg_range p1 JOIN pg_type t ON t.oid = p1.rngsubtype +WHERE (rngcollation = 0) != (typcollation = 0); + +-- opclass had better be a btree opclass accepting the subtype. +-- We must allow anyarray matches, cf IsBinaryCoercible() + +SELECT p1.rngtypid, p1.rngsubtype, o.opcmethod, o.opcname +FROM pg_range p1 JOIN pg_opclass o ON o.oid = p1.rngsubopc +WHERE o.opcmethod != 403 OR + ((o.opcintype != p1.rngsubtype) AND NOT + (o.opcintype = 'pg_catalog.anyarray'::regtype AND + EXISTS(select 1 from pg_catalog.pg_type where + oid = p1.rngsubtype and typelem != 0 and + typsubscript = 'array_subscript_handler'::regproc))); + +-- canonical function, if any, had better match the range type + +SELECT p1.rngtypid, p1.rngsubtype, p.proname +FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngcanonical +WHERE pronargs != 1 OR proargtypes[0] != rngtypid OR prorettype != rngtypid; + +-- subdiff function, if any, had better match the subtype + +SELECT p1.rngtypid, p1.rngsubtype, p.proname +FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngsubdiff +WHERE pronargs != 2 + OR proargtypes[0] != rngsubtype OR proargtypes[1] != rngsubtype + OR prorettype != 'pg_catalog.float8'::regtype; + +-- every range should have a valid multirange + +SELECT p1.rngtypid, p1.rngsubtype, p1.rngmultitypid +FROM pg_range p1 +WHERE p1.rngmultitypid IS NULL OR p1.rngmultitypid = 0; + +-- Create a table that holds all the known in-core data types and leave it +-- around so as pg_upgrade is able to test their binary compatibility. +CREATE TABLE tab_core_types AS SELECT + '1 + 2i'::complex, + '(11,12)'::point, + '(1,1),(2,2)'::line, + '((11,11),(12,12))'::lseg, + '((11,11),(13,13))'::box, + '((11,12),(13,13),(14,14))'::path AS openedpath, + '[(11,12),(13,13),(14,14)]'::path AS closedpath, + '((11,12),(13,13),(14,14))'::polygon, + '1,1,1'::circle, + 'today'::date, + 'now'::time, + 'now'::timestamp, + 'now'::timetz, + 'now'::timestamptz, + '12 seconds'::interval, + '{"reason":"because"}'::json, + '{"when":"now"}'::jsonb, + '$.a[*] ? (@ > 2)'::jsonpath, + '127.0.0.1'::inet, + '127.0.0.0/8'::cidr, + '00:01:03:86:1c:ba'::macaddr8, + '00:01:03:86:1c:ba'::macaddr, + 2::int2, 4::int4, 8::int8, + 4::float4, '8'::float8, pi()::numeric, + 'foo'::"char", + 'c'::bpchar, + 'abc'::varchar, + 'name'::name, + 'txt'::text, + true::bool, + E'\\xDEADBEEF'::bytea, + B'10001'::bit, + B'10001'::varbit AS varbit, + '12.34'::money, + 'abc'::refcursor, + '1 2'::int2vector, + '1 2'::oidvector, + format('%I=UC/%I', USER, USER)::aclitem AS aclitem, + 'a fat cat sat on a mat and ate a fat rat'::tsvector, + 'fat & rat'::tsquery, + 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'::uuid, + '11'::xid8, + 'pg_class'::regclass, + 'regtype'::regtype type, + 'pg_monitor'::regrole, + 'pg_class'::regclass::oid, + '(1,1)'::tid, '2'::xid, '3'::cid, + '10:20:10,14,15'::txid_snapshot, + '10:20:10,14,15'::pg_snapshot, + '16/B374D848'::pg_lsn, + 1::information_schema.cardinal_number, + 'l'::information_schema.character_data, + 'n'::information_schema.sql_identifier, + 'now'::information_schema.time_stamp, + 'YES'::information_schema.yes_or_no, + 'venus'::planets, + 'i16'::insenum, + '(1,2)'::int4range, '{(1,2)}'::int4multirange, + '(3,4)'::int8range, '{(3,4)}'::int8multirange, + '(1,2)'::float8range, '{(1,2)}'::float8multirange, + '(3,4)'::numrange, '{(3,4)}'::nummultirange, + '(a,b)'::textrange, '{(a,b)}'::textmultirange, + '(12.34, 56.78)'::cashrange, '{(12.34, 56.78)}'::cashmultirange, + '(2020-01-02, 2021-02-03)'::daterange, + '{(2020-01-02, 2021-02-03)}'::datemultirange, + '(2020-01-02 03:04:05, 2021-02-03 06:07:08)'::tsrange, + '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tsmultirange, + '(2020-01-02 03:04:05, 2021-02-03 06:07:08)'::tstzrange, + '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tstzmultirange, + arrayrange(ARRAY[1,2], ARRAY[2,1]), + arraymultirange(arrayrange(ARRAY[1,2], ARRAY[2,1])); + +-- Sanity check on the previous table, checking that all core types are +-- included in this table. +SELECT oid, typname, typtype, typelem, typarray, typarray + FROM pg_type t + WHERE typtype NOT IN ('p', 'c') AND + -- reg* types cannot be pg_upgraded, so discard them. + oid != ALL(ARRAY['regproc', 'regprocedure', 'regoper', + 'regoperator', 'regconfig', 'regdictionary', + 'regnamespace', 'regcollation']::regtype[]) AND + -- Discard types that do not accept input values as these cannot be + -- tested easily. + -- Note: XML might be disabled at compile-time. + oid != ALL(ARRAY['gtsvector', 'pg_node_tree', + 'pg_ndistinct', 'pg_dependencies', 'pg_mcv_list', + 'pg_brin_bloom_summary', + 'pg_brin_minmax_multi_summary', 'xml']::regtype[]) AND + -- GPDB_14_MERGE_FIXME: Discard the GP-specific type gp_hyperloglog_estimator? + oid != 'gp_hyperloglog_estimator'::regtype AND + -- Discard arrays. + NOT EXISTS (SELECT 1 FROM pg_type u WHERE u.typarray = t.oid) + -- Exclude everything from the table created above. This checks + -- that no in-core types are missing in tab_core_types. + AND NOT EXISTS (SELECT 1 + FROM pg_attribute a + WHERE a.atttypid=t.oid AND + a.attnum > 0 AND + a.attrelid='tab_core_types'::regclass); diff --git a/src/test/singlenode_regress/sql/typed_table.sql b/src/test/singlenode_regress/sql/typed_table.sql new file mode 100644 index 00000000000..9ef0cdfcc7e --- /dev/null +++ b/src/test/singlenode_regress/sql/typed_table.sql @@ -0,0 +1,75 @@ +CREATE TABLE ttable1 OF nothing; + +CREATE TYPE person_type AS (id int, name text); +CREATE TABLE persons OF person_type; +CREATE TABLE IF NOT EXISTS persons OF person_type; +SELECT * FROM persons; +\d persons + +CREATE FUNCTION get_all_persons() RETURNS SETOF person_type +LANGUAGE SQL +AS $$ + SELECT * FROM persons; +$$; + +SELECT * FROM get_all_persons(); + +-- certain ALTER TABLE operations on typed tables are not allowed +ALTER TABLE persons ADD COLUMN comment text; +ALTER TABLE persons DROP COLUMN name; +ALTER TABLE persons RENAME COLUMN id TO num; +ALTER TABLE persons ALTER COLUMN name TYPE varchar; +CREATE TABLE stuff (id int); +ALTER TABLE persons INHERIT stuff; + +CREATE TABLE personsx OF person_type (myname WITH OPTIONS NOT NULL); -- error + +CREATE TABLE persons2 OF person_type ( + id WITH OPTIONS PRIMARY KEY, + UNIQUE (name) +); + +\d persons2 + +CREATE TABLE persons3 OF person_type ( + PRIMARY KEY (id), + name WITH OPTIONS DEFAULT '' +); + +\d persons3 + +CREATE TABLE persons4 OF person_type ( + name WITH OPTIONS NOT NULL, + name WITH OPTIONS DEFAULT '' -- error, specified more than once +); + +DROP TYPE person_type RESTRICT; +DROP TYPE person_type CASCADE; + +CREATE TABLE persons5 OF stuff; -- only CREATE TYPE AS types may be used + +DROP TABLE stuff; + + +-- implicit casting + +CREATE TYPE person_type AS (id int, name text); +CREATE TABLE persons OF person_type; +INSERT INTO persons VALUES (1, 'test'); + +CREATE FUNCTION namelen(person_type) RETURNS int LANGUAGE SQL AS $$ SELECT length($1.name) $$; +SELECT id, namelen(persons) FROM persons; + +CREATE TABLE persons2 OF person_type ( + id WITH OPTIONS PRIMARY KEY, + UNIQUE (name) +); + +\d persons2 + +CREATE TABLE persons3 OF person_type ( + PRIMARY KEY (id), + name NOT NULL DEFAULT '' +); + +\d persons3 diff --git a/src/test/singlenode_regress/sql/uao_compaction/alter_table_analyze.sql b/src/test/singlenode_regress/sql/uao_compaction/alter_table_analyze.sql new file mode 100644 index 00000000000..ce8d869f87d --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/alter_table_analyze.sql @@ -0,0 +1,63 @@ +-- @Description Checks analyze and drop column interaction + +CREATE TABLE ck_ct_ao_analyze1( +text_col text, +bigint_col bigint, +char_vary_col character varying(30), +numeric_col numeric, +int_col int4, +float_col float4, +int_array_col int[], +drop_col numeric, +before_rename_col int4, +change_datatype_col numeric, +a_ts_without timestamp without time zone, +b_ts_with timestamp with time zone, +date_column date) with (appendonly=true); + + +INSERT INTO ck_ct_ao_analyze1 values ('0_zero', 0, '0_zero', 0, 0, 0, '{0}', 0, 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000'); +INSERT INTO ck_ct_ao_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001'); +INSERT INTO ck_ct_ao_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002'); +select count(*) AS only_visi_tups_ins from ck_ct_ao_analyze1; +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_ins from ck_ct_ao_analyze1; +set gp_select_invisible = false; +update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '0_zero'; +select count(*) AS only_visi_tups_upd from ck_ct_ao_analyze1; +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_upd from ck_ct_ao_analyze1; +set gp_select_invisible = false; +delete from ck_ct_ao_analyze1 where int_col = 2; +select count(*) AS only_visi_tups_del from ck_ct_ao_analyze1; +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_del from ck_ct_ao_analyze1; +set gp_select_invisible = false; +-- +ALTER TABLE ck_ct_ao_analyze1 ADD COLUMN added_col character varying(30) default 'test_value'; +ALTER TABLE ck_ct_ao_analyze1 DROP COLUMN drop_col ; +ALTER TABLE ck_ct_ao_analyze1 RENAME COLUMN before_rename_col TO after_rename_col; +ALTER TABLE ck_ct_ao_analyze1 ALTER COLUMN change_datatype_col TYPE int4; +-- start_ignore +ALTER TABLE ck_ct_ao_analyze1 set with ( reorganize='true'); +-- end_ignore +-- +-- +INSERT INTO ck_ct_ao_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001'); +INSERT INTO ck_ct_ao_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002'); +INSERT INTO ck_ct_ao_analyze1 values ('3_zero', 3, '3_zero', 0, 0, 0, '{0}', 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000'); +update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '1_zero'; +ANALYZE ck_ct_ao_analyze1; +-- +-- +ALTER TABLE ck_ct_ao_analyze1 ADD COLUMN added_col_one_more character varying(30) default 'test_value'; +ALTER TABLE ck_ct_ao_analyze1 DROP COLUMN added_col ; +ALTER TABLE ck_ct_ao_analyze1 RENAME COLUMN after_rename_col TO after_rename_col_one_more_time; +ALTER TABLE ck_ct_ao_analyze1 ALTER COLUMN change_datatype_col TYPE int8; +-- start_ignore +ALTER TABLE ck_ct_ao_analyze1 set with ( reorganize='true'); +-- end_ignore +update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '1_zero'; +ANALYZE ck_ct_ao_analyze1; +select * from ck_ct_ao_analyze1; + diff --git a/src/test/singlenode_regress/sql/uao_compaction/basic.sql b/src/test/singlenode_regress/sql/uao_compaction/basic.sql new file mode 100644 index 00000000000..9ca085335f2 --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/basic.sql @@ -0,0 +1,16 @@ +-- @Description Basic lazy vacuum + +CREATE TABLE uao_basic (a INT, b INT, c CHAR(128)) WITH (appendonly=true); + +INSERT INTO uao_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i; +INSERT INTO uao_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i; +ANALYZE uao_basic; + +DELETE FROM uao_basic WHERE a < 4; +SELECT COUNT(*) FROM uao_basic; +VACUUM uao_basic; +-- check if we get the same result afterwards +SELECT COUNT(*) FROM uao_basic; +-- check if we can still insert into the relation +INSERT INTO uao_basic VALUES (11, 11); +SELECT COUNT(*) FROM uao_basic; diff --git a/src/test/singlenode_regress/sql/uao_compaction/delete_toast.sql b/src/test/singlenode_regress/sql/uao_compaction/delete_toast.sql new file mode 100644 index 00000000000..1ca548b7961 --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/delete_toast.sql @@ -0,0 +1,10 @@ +-- @Description Checkes the deletion and vacuuming of toast values + +-- Create a table with toasted values. +CREATE TABLE uao_delete_toast (a INT, b INT, c VARCHAR) WITH (appendonly=true); +CREATE INDEX uao_delete_toast_index ON uao_delete_toast(b); +INSERT INTO uao_delete_toast SELECT i as a, 1 as b, i::text || '0W0bTHVHn2es6Ga9YumoV/cat/CW8jglG+DjaLT7ewvMj5IWaiGz2/3eP5fLTxyzrm6Bv8kxiYGSt5hqM38XLKXRgYwvFnnKfIW/ZMJbkjlOeXQdse+sCQAobQX0+wrCBycwsMjVn6kgm9QLCxrQ96Cjx8l2nx/xr1+ekc9o2i24+faKAgiQE9DQKEAbAt3wMB/1SuiG9cZaJH6ASsLhSMq63KyjNse1c67o+sbJg6pxX5cftM0iV6DciVHU5rhALosKT4boil5+tfVmU+7r2aTWC1XK+nneNfVrmiQe3AU7iQgb/YU+7R+kgrirPv6Y1MF9BoXxih2jJ085E/EE7NQ8RwHm1UsTYUSyFpwdSg2Y8F06UPyEnPkuZhbqWIiSDMES4L7tz8YaGkYr5b69bUuKh5GkPDxU4mj0wbEA5jZDGT+a1Qgb9Tjx0/bRqI1Gd2RDmmLd3ZktSDsQ+APk8bgwZ5epE694KdsNBS5UsThRVwsOG9yNIEVjsTk3Moy59NIJcO1PZS48Q1GEdZTTdUYVWqqCpvJdSUtYg2kEuC/QfV9DTEuDqQqIdKchPdmLw//FoFSna77goKFIK2k1DkFPs3DDQDHPXtfXNQ9zgKMWOzKWxQrkDP4VA5NBsAM3IRpSiY4h1muXpejWt/2NiLo8PP7ZYgFXnSQYGzZsJepRdX0hCV6LWedzIf8fWYnCglKY0Ah4Cb13d0Jvviz4wQMATi4HcFEPewrhSsjWGA0cJZcn/AhCX4MgZIkMqXJvvnAjaXxkIfFE86YtRdP9S8L3sPZLO9VaNONsQrS4v5Md1SAY24d3GenGHEsuH3Tu1QJHYYQLe7juYnZyP71gX56bOAiECcaN9kerb+VQVX8gTvEI4LOIlF9dwrc3FuDaApO/XjKjffu5TXtEAgeRvp8O3iad4/aUo0MeWsD/dFFOQYGZpAGw5wA8bJMr46rSi6LJf3fVWwi3/sGvqDeiBCotisDsyfr5VrZpzQAkrggkB+L1eFm6bvRxH6w5lc8tX3ppjsrsEwt6qSro6qdZ1ho5mtT0CV/mKh+YaVsRaVOXxbRTSBQOqxtfWhjCWvncPcYqJBylRlzy98aWR871suYXPWLW2bxXSxC9PqEiz7HMXpNhjboLKOmMPeMcPZTE6Tgp/wRlyTdemhocEZEZWDpm3XQamOQ9kiwg1mqHwSjGpipFjHun0PQC+J2k+InGj3gODOGU4f7AD87wuM875GsbSYk+NDonfgkBkUPfHNLONF8ft3iZ42YsZghvzSqDIMepTJs9w8ITZ0aCfsQ9swHLK1larLLkQ/9m/wgBUXMNDBrZUZkiQQVGu67Tnmg8vZkv9NNVbHL03HLZsCMi2oI0auUdzCBd4+wyQ+97ukgLso3hAQLschExEQJcphaRy9n3T1WRiRETGd+Z7Yd90Ii8ePeyPp67itRHzKw4eAli/nCBiOVTSkWbtvLaEXN7/s+auJ/JzFKbXzwlDbIHmxLflxlSo03Gijb7aUnjIvyctyHenbTZGFTy2pw1YNJaKanEiPtK7CkDP/3eTlORS2sA9WyJATswpdqDQIhLBIrmxhTtSEvwwKYRFr35ZKMQ1P4STrjblkw+i2ZEh1XfOxhSH7sfEToNqOUCPO0Tdh4emPNoSaow8vha/YxpSZk7VaqyUr8ig5s9nmVa1Zw/w3kdalyfJQem+ETWfNB+3eBCjXSQhvL+J/0uQ973Na2G8+9+R2kh2ZIWlnjW2YNGoyu6z4xXvsxfo6V+Czz+UYFKYJjZfoapfl3On3zGmRXBjy6KJIIOZ948WIxc8q0dnJYjKLluR0u8ikz03qlDb9Fce2tzRh9TW48BnjGCfSp8o8+SJc8MHBnef6OgYLCtjnBNXklJpLBBEzQJujLV87Z+Gz5p56ZiIsd52sEU2x9Ro9roDtkpKgGQeUN0z/ap4ZKC7k4PxmUyXPTe0gi+sBM1yf13HvDN3c69bBg8RnaC8mML7qGStBtSv294OwxZ1Ap0/JgmuiwX5u8CnQ1q0TPFV7MzVvDCLYMlsiY+du2yFYLTrcZPmy6MLLT5NtlCovkaD+Am3vdw7xqOVEUGaatr60Dm3ynL49BbGBH930LcUz4PMOEaoH8OyYXryR7hObeRR5EaQC7ekZd9iZIllZxdL0HoJYWl95AgPnS5vPjYYZFsW80zmxEorByolcNxOtf2sR8Ffz0T+iyvMXx2CksvBZzy/yAhXQZ0ZkUGgqENH0IltJq4HALvX9AkQow46hhZ8kjB7kCrhXTVM4+iUrYfoAqzbXVSsNhXTcoun8The7RTZUWwKOLQ3tehCAtCd6rJ0oRnsopRjUGDEmaboq+GVLk7StgZ44WHVvr+bp1qVK3pNmyk7h5xbO28ECJETrZ2hLMGEn6xO4e0hI3EAXo9nsWDB8Hoqfz70wyTGa5L3L04JnVJoCPNnaf2CsP+DILSJ9AZD0HKRT8vBKtwm7uqdhtb1OYhgsOBReOmn1dQZdC2CnnvID7jlAx8Ot27wlysG66uIyDXbyuMiRltdLEzVn/j3JqwDog62euSakCucJMuH27Rp0BXwwlM8+CBW1xpEMIBOGKh0/6UA1VMgU4z0di5gVUfeuIavCpVGW2lg9aqC0/PkfPFNq9KWdiVxwqwo5dblW79UTRASnEjVerqlnea4jsvMU6virCQeIjRzeTuIBYbSM2OAxYqCBUBz5WsZ4u/Ldd7Qr7RbuyS+MUeByScEWd6LGWzOVRHd3PHYrajkynJc0e5I7zUFDkLHljlLvzgdgiTYVdEOodefR9zH8dNYZldQ1rTnUJvZjrv/XRdLsWFhUp4ypY+TVMM9Tfzu0mB3G1woplKLnBvsWNDhq2mUijg072gjPNteOq8gKaNuuRLppRVdUtokiFer1AWW8+O8yej/W0WXD0gV/Cgk4wZIdlF5LAQHqOWTGub1EiSkOvJHex1tIgEqbRWSvUJP1WzN3HwNq+zTxhGraUMqhvY318bk5b3rdBOxKxAi+TGrbOJOFj3XQrhVPS/vttK6UlX2pkyK654r4QYwV5YM9YQaLotxJvIZIgIg1injlA6dfflj7E/lKxYQWWl0PnznXYhduoOWg4EiAS+z1l7xLfQlxwNzriIc2vkgjxW58eyE6j25Cxj70oO4JIrC/tyPWssruKtMvjKPqPhOT2XxbviQ/aZkWAy2OErr7Wb/Ia7a+rouGnYoIhDClxmhCkuqabr6d05EXbE/JHCdn2lhKFNa14tJtbB/j842xwyxSP/zRZAWRgOirBgk1QDORgiUpWQrrKggqkx3YSJu3SVDSsrnV9739KZ0hOhEvz72o3DAnUmuZJuPrfD4C6z+qI6pdytPZY5UbM1MqZQG8WDy0mKeDn3htgKjcOVd68vT32tGhhvAPt6bnjlupc4S9YWcg0q1LEsxB4puaOoIkl7c4NpM6iSs8waaqJXwOxKoj/ccEb12lCUTczwXpZB96BHMGKxp0OhKRLC39jsYXBc3CCCXnSbaji47SWX9bgJMiLYxUDWbro13zwWG67P6INE5AO6eB596lOyF0Zet6n/1BhD4beQdAd4lof0y7yPql2OoDEsK1dKEO7w5HkPG5uuk7fvq4ufbf1zCDgukDzjW+7380PQbMF4acSQZFbevWVN9GkhCKYuKTPHhud/elahgLfp2EPCziC1eX77ArCh9ouKFFo4rQRAIdVFREpL3KszOiDil+oBOG+NB7RkrESoPs5WZxc5QtfQCG3K+z1MTHS5LrSNfBy9quxBujPujdDx+9430sQsSKqu2CIUV8TiNzgub3etmxm3THMN26SNxDMMN4VNTo8wNu9gndqTeD38gCoNxoNPBBYNUJWvw4OTMt8iqEPAfAunm9dviZhua72qCxx1f+oNr7DNlO4YL0TdXctJH2QPR1Z7T3QXdVITYOPDWvgRiW2ZEFmDP8NI0WpMxEIpP0EyxMcuX5u5jebG1I+Czn5FuajoTpJYXRSunx2fGQeYXBl+E/u9GQgcgiFBXNyOq/lf3ivpSqrMiVp5JA4DdolaHVNnxcx+b45rD4YoMHQW5OPlErOdSzri2KPq5k3NdmRvX+29a65eY6uchsKqmOSmyPE8gInPxMhePc/PkN0eP31UMcXSWEk2klEOpBDY2FqMZK8zGtSm5OMecMKqqrMyEdWl+QEXkQCX6+kMfr/yvWBkqd0drO1Ve9hDlJYcrp1+pCP0T53M2g9HxEyk5EqVCwRw6CLBvgZPpT14yqPMF/qEBFzbJ7m5Ks39kUJvJl8uio6I2Xd02fiwdWOXQDW51mjWYCADfEFuILMCy+M3i8p0dLBCLpnn9SthU5is/BtulZq04ht0TKZdhj8oainbDPI6v1PjapMm+9+aFKSjSgIVsH8bCWWzLD9pD+gKM8BsMvN4HR0Vx0kGA+Qi4yV+Yd0pG3mN3Et1fcKQyIrE60aKDw8BNkhQo41/v/Zp24bMS2fTn9ST6WzTDQ5t/09YG7WCPaCDy3cl0DxQn51r2QPOOTkq0v5dvAG1+5IqfoXvO/xfRfk/5/6sEz3jy/P8Vk30y9erl9GC870SJtNxsaB4duqB+SgPL/V40eTnppOJxWcDRFAZjVlPwNq5nopJ/JNoAE3DhEUcIB+/uepmf4n69ojrTBrlu0k7YQXGFZtXZvcWAS/3ensZgUF3aLP388+G+iQikR8ucHSh/mynCLMlqOfg9yUL2W15DCYfthtpzl3MKl4uU8N6ACmBsPfip9SjRTx2xGkqWi3clpjqEcefpCVX6caNCAH9WbIym3So3K4QEQ81+Heo2+9GF+nHT/VkXMzmT1UMU09Q+dyHoB+H2LIKc6TToyQh2DhbmaXWXfjq0TiqtX9CNTW4XWgS90rFACRiXl+HBelY0x0DrtTqC33Xo7cGEOB6Bzp9YWpmxw2nFxHZmw6zqJFIe2zyC9xk7qzGBjJg6LT2qeVKgHiJA9W0iWtNMGpvu83Gps+oZ5OXWpNVPVrIuKyvpgMW3p+lgHU5v6VbusW4KFdYNQR/4R1jYw7FIZyX6B8VKrIaigts8n32kdsCZ/lLieTps1l7R4R8CVG5xQnasdCXo6sqIZWNwDNkb9HXkmk6c4L+TADX8PQTyjXY8Xj8TQcztpwh/wGaPErN1S50W2/4PfDZnI1sqdsRMqT8nz4GCUhq0r6cF+2a/05V+Zz1YOPljDWqxQcONU5GGl1dKoLbDxxQtY/Ms6kFytzJIwck3JBrKpi1MhpaDa5JfvxCXNERhoUC3kcINSC0h5G2dlyK9E9XYM0jf777xBRaVUhvwb0UlzuhMx3uBfRSPMvR0v5cvyO1nwNRY27qNs/ldXbILnJHESjy8jhcexY34lGTLZgUoQi1YN1svUl/in5A041cKUc0gaxUENQpsrpT/ZljpqAANUX5UPdBADBjh7WT9LCH9RXO4Cs+yjCyseLmI1Gx+kJXshlDcWiYXbbhNK1o+/J8fL+SBalIpJTHZbme76B4k1c3HogZ87gZAQcpIOAweo5DE0zZIiLMf+tqDRovk1yro2DRGn5vrpS5GHgkL4bg7mnGVS3+QwJW2J/VDlWQHCvj4M4Dq5AVYAAfUzzZf59TqW1zTfNyO2isAfvUim2huqfBD/SAoiGufsxi23vCvPohXX1ytGpjtJoziY5wd8Z+eJqTHDOUcYOvTJ2BUs7uKHdMcZ7zEBYecItSdlTmUBTWYrtYX8bWXKFoxxUsIiAPwFSDQrOCdmV3zWEwdywNP6mTAbm4dkqwFiW+zn/a8cxYouq9qWuc4UsOCOGizgTft0A2OgglUZ8EJH/hgDyjuvq8uqf15RHiFHaY/Nne5/Vtij9tKwOFamay1dVo0TCNjSg+8vX6YoIUXe4EInQtyg+uQypDIdxp16TT4wEOMAkJca+vxh1a4g44j3TlhzuTS6SeqvVrUWrrvrIhaJgcP5yQnG7+gtkfvNdY1PZoCN1JXgfkd0EqKr2w9Me+4U22mbdiI9m6pGiO8/GFJ0KVbewNAXyJNrZBvw5pDEOyrOesGJcHaiRdwX9YMtuFjRkEKZHgtlvTg6FdLtwb6AfzJL9zL37MBuiVd7WCkKb1fpE79POFS0CtBHc1h8JUEE2bzYzvuoKD4wx2VmOeKrztlEfyF9aNhf6vgslzDezFOguu7gavDOmk5pjxBx3SJt+if01fcz+3uLVBKeu0g4bp9ULjSQYXZMW97rTwJJjmRHVt29BxHHbDRbudL2Q/OSO7HNbc0pMrbJX32U9DZjC0mSlF/r4RD3rXfAvQ4sXutg3HOO9KjRrujBHNBKbgteZ6sOoDJFIF/im/X6J2sgyBT06uMC7OSfDHDEyJNZKfm1sWyCLiGGmIXEsP2MKVg8qJGB9uMioKvMgKi+kjgwuxd94nh2bfqP9QRd/aZ4Sha+YNf5JAQMi7ZPimhCrEu5LNKGtfq9t3BJ2vsgq9cO1S/Uu6Br4uqMIKqi2gvtRd/TtGdyyCKxvbanZowr+vFxRBNEQjA7HbWYSPVvFlYvlhTe4N50rLaqt22/wBqkCjdyXrrAHqX36duA6DqkW1dFKzo1NJUo0ulYq1bSocnp7KJLWS4U5i3Wv4n5ge4okTD2nSwd9OO4NjBg3va/49ElKifTAbH4B+C4FmUPL9XeF2/nFzAy279bXFAzbBNXzuxUPbhLfRFGQDXb/wLwO73HvG64lyuMrjKqiXgfjzF3QqxxnIq+jdaWDU78HK1elGjDGmgVcyC5THkZ1hQ1yRVK+Dr3S4ZoAsE1vwxpSR7WIW4fpKqexQ77HmMQJpiZmham79WqNLRWG7HueS6+MpWrO8GuDO8gpZ+LgOCjtQzcEmbUy3d2CiMpLU/qLAg2LcYm8tr2waJBvzL29zld82ZyfB/qv8XNkD5nQGthkWUU5Vu+yiB2G8Luqx6q5YPcH3RpqWnVAmXCr9iyFsupEMYkPW+bchqJf9D8+Pa4Y/8IFpfsdgmA/lCu4BFNT9Ar+TdLiVd7t8JTRlukFOSNp3yQlO7E8tvlgPOMDNHqcItuK5M3JnXCcRiK6/kfIgJXkw5T4jo9vLUF3BLNeTzCvpXv/RkV5o/Q0qyrSEd0OrT1TIZNR+eoJc2FQqgEEI5E7JISkdC9LAgawnSgzStzJ0MzIvghU9v224ANa8I890EUwytN1cWUF6F70iD34zAuHhCw4SMm2syyQBkNCCVDqHQ4hX7KWE6IMe6rYn8q6rb3UfoyAlNlowRLk0yMMiQxBjO9ee6f+7q32F45xIfzbwdmzy3Tp452eqJA07w4FI+IVYn8VQM5R3k4qPCWW6dxkPXCE6N/q84O6Ed2vxwPNQ7VaSc5BU4UKwfKz3SRTSUUEJWX7Q3Hlp2Er0Hv/2fwXeWTkdbw9ALm87kgv0xWSRXEe7ZDUppJ0+m6gmlkhEm4g01sTS7ORgraHrwT/zp9sWTYBl5ABAhYYg28oX4gB45ZVPTJ0Dr37FmpBgMzQDGTjQDIe/lAIvOes4JbRESDJb5vVcSQB7Uw7o+6ccBmmeb8xEQS9LZ8XRyuhZ5JynB0Hx+z/tqZ6dFonNmaXRt05wDvKPy9rwmhXD58/F9eAgIN4XEkRJkI1s+h94qr0WYiRSKbRuRvNJWRnAevCqoNrpDnz1qpC3XY0oxbHglsq/gqc7z3Yit8uKVHpSdGSfJat7gVtf/qh9lRrI67hVjr4f76UqztVMszz5oMqWrxEWXI93U/p2OxdtuwLVYSNLsN3CujYn15ijB9mqx0x+d55vBRcpBm4e69urDnXpnyELspphOuc8+xFniW7m5ZVvtYfPzyaGsShjp7geiXgyTC+mP8EOlreAtiJRfzkMZQ/Wu+sfGO9n8qH6wMUklh8Y8FjO8Br7ql74BKUyxHvtxIEL2hd0Wu8qUu6XvK0bUNaDlndhVzpYmJb1itwz3O2D4zw1RJRVf1h4J1c3hcWL87kb4AhodKCGczXDPQMyVyCJxnSBgP4k4cUiNRHXx9RpcQDOTtQ1gzT9VrGP9iO7k8a75oZDf2FuLUt9Gqy68/IYNzXS+9z6GbftWLND4ZtQ7ObLzXIH6c/Y/dDdv/aXUJFuh1ymGIQCH3cDGQHPADay3o0c/0y8WKPBmIv9f4gyWwH0mr+cq70PmjAwqMcjh5MPIEzrOUfssHVlGJixFuasPohD0oFH4u2cXx/0kEsAbPWUilLosEeDoVeOAvzNr7wFZ/T0ICWiqD1HDZzHkqwBr0h4MtKE0D1VH51rSRrTw4NZVObceffGJAW/57D+8s6Xj0ULkIXLpYoGBISjvN3U/qNhax5eXoKSjXJ1LDZZnwxU+v/u4rgwq4O/GdacWtCHCp8j0jtwdM4xbQthNsBQo4qDVXySylN+eK5d2keYNsN0kLoVS1i5kuzK9WOYSPrKYpyyqwbhzo5b/VjapYSR43x8WpD2zFh7Cd47fiBRmb8srme5gPOL6pjVgMCf4I2FoG98Mdy+OOmeiPu2tToJgetPL4tGp0eHmmmxjhhxnpPK3buZ/eslF0kxErf3a/zsFCVSYf6DIOxl9aDGwCjf8wPDolj1tl1+L0zj2c5lwziRPH+53xCT9NsCLV3wDlp2J91SqpK3w7LQ6N1o9xiRvwryVPiMO16Vz8oRbvOnCl1+niv5cYPxRuNhP+oh9xeAB6u7TLdKDe268tfPkP2HsL/T/z7djVDVc18XTW1zjQi1vdZJRrlAKiXJ8zqmxFHXfAq0/BGADAQsIx/hAHShbbV6iTt3QVj3MtiYV6x5cq2I7n3e3q4xYyXEiMtqD235i6xjtpNsoGAETXZ0L3l1RdOINjagc7B3zb33RsKpj1yo9bkF2nVNDUT+s5QtbuQCnf4nRpj/AlUrUt5C8lAD+DiQtdlcM21/qZ2gvU5iGah1t1oNnV0+wnG6az6aza4iP1JbscaVB/8W/h31gdCQ+AmaQGLcy28wGM/AKhAOuhQbDnYBm1mgJHTWOg28wBYspsO/hx4l+/yYAbZpDsQ8HnVdIPDkj0/kEygJrj6SenOo5n90MZE7X0xGddlLzhlOeIGKqzf0kxpPXzyXwtZ5UxSzBg3t30A60lRtMmF8JwgU1dDCx/W17w7EdHK81/XjeDqfXoj7avzhmskc5pDMXhkB18/llFX3+qlDs/IrmhnNHgBc5CKtgSOBqCXRfODzBTz4GQeGcR57XHICMfrvI/agDH4SYHwMw2Pgac1vCyde2DY0AvVlr4X6ESRkKmlCIhr39xpEkgZ54sGm32FxBO82hr16vclOGj5pa9V3DpbDBup3wqvgSPt5r85AOOwGcpuJeyvQIAldjLxDlWDN2TqVr3fWfQ6mELb6gwo0+2nEr5xbYKfH0anseBnCIhQyVs0B1yUz7H0/oC4DnooYL9vPTJVrJBrXzc6h3npKJSpZ2RNLmfKTHI42kVNnW6GS0XD0vhBfTUO9mLSqtex6DDChfKJCbrA9BrrcA74Dxc5eefFTIeO8sAhHcO/l7nCyyjDvrERUlLztXqmlymgwL9B6LHSUYL+tbmMQVagNSQbQxZsdgPu5npTK7NAFz4cdX+1lwBclkCKiaisYr0V2AgUDs5F0oPMzge4EUAB+eEwjsGpq/A/QBOBEcOuZOXx1DxE/PvehndVacIZH8k1xEU0wgs4RTXFDcI3chD+qDvHIHU8j5J05hjc+3fHuZnQijYDbYpIuJuPpGxallP94KmjPGxj4CI7wAnOhnEg1P1AZ3Td64TVeqdAdBAAOpWJRz2j3Z8iaH45ZvJW5S5HM7KuSsAyUnNlV83SwBphhe1VjDg6CG7mXVVuod4MNEbiN2nkFt8P375tjHfq3jbwYb6zeBvGM5G16G5INBT0X81bR0hd8fW3LngQZpKmjizYoxo8i26Ag1aKtf6LhpLF2PBpddPu03lhACNw3rbpTaLYgwDAvHb7K/NB7bpZEDIw9x7uy+fgBBhdvjMTvEO5SL7FFT6upxhPvA6fTUegkcHDaiPXzbQyPgpLOLlLDK5Gfn1+Xlam5F/GVyvb2cQh0zKwFYyBtBfoKV51OBBl2EqezfQsVvGHkVInlKwNoycI0CNCQsJfLuOfZs4epk6dgVJr48veAWJKz0cC/+rV5TAZgpehv93tFBnhmx/efnJtF3P2HhIn8qN2j/jysMij+t/VR1j67OotsCyXq9Sxo90a11cWRHZUXjxALNhiNZdtowR5REbst/Ij3Ki73VovC/DehXCQy8Kb+OALgZNxF0rDvr2onuh4uJKWY8/CZl1ltz5vj/WqXiOBm1XywkhGSCFGjHoDntZT+ThOgtBSzlyeyRTs+uSEpGakX96XQIYTnQh6Bqu9aWjL/RmIKqDomLtmnQM5hWG6bC9jq0mNkwkRemaiRXDO+3azMPOwgo2LPRO90bo0TchJID/aASyeGlrY+r+kRBeU9TXjizWd6CUaljYM9Zaf+vMuz3ySlkkbHxeDBvju3kwenbSVWgbA58bDA+RfpHDUtcxTndrtnvd3XxOazfX040jNcFKdCAsy/93LS0byKcABsSa3mC9UXQoxe3PALneqQZMdO6ACKIiKYgCHn4YfLd9WDVO5laL6yLx1WkNiVz68s/dQWNQtZ5MIs1e6xl3GLtsHy7D9rBdoZp0B+evionoq75EuHDO4Qk2y8kw/w+9KXYcwP6I5IQv06vvH95xqTyG+FOFbVNgD7naSttmsXyL3dQyTdEa5dAC/cngWkAhv0z4onU+dXt2dW/hWhbTWxjMePcahEKqItKZxh2ge/yb+WeqEI+oRdwfkm9dSflURx8CRi1CcpgvNVKgM+7+zwebKuAOuCZEBNJ/rRcJP3DSA106ODXqaAGaV1xkD9ho2DSl/3Yvf75gQomfgXtN9tShu+16+UDaVl5/7nTpW9OCeVQ57PONvsF9mMnS39u8QaigI6SesopjmISEI18phMK9dSUjXDZ1JjhnrncCjWQpq8ft0fY5/qqlglihbJSjwYT1RXp52qVkp1kqbdGNaZweH6lKF9SguyheSlInCr85H8QoNraOXRn0meZ9V1SkKx0I/PffXhWMy/88fsp00uEWtibqSNky3sjFsPQtplwOK3DMRKCrsJN2YWERYqe4LU0c4h+hHzx+AbzoeF3C2vAVBW4xtC9ECnuObtH6vFi8GPYk/XHskQRydxEhqwfLeVmqat8nvP9OKcSbx08Fb3f0yhOIWsa5pxRdidjRD3VGOpa75Y9f63zWQmFjXEPCLASCvNNctGcL/L+9aNd+oZxpX9Cs4tMDx0idXASGtlUb8L/zm8J4P7/zD+pqpxb6PENdfFAgiZqK4bLmH/DnKbhVhEQbt2FiU2509o9da2MGljCFqQoGN+EgYHOVtXGOgaqnCDsqzlcNHmpj6BgzWLcsnNomwpDuoYuLlH1Qwqar1Hge5aaSA+W5KPVwLmh5hkI+vNpJfN+cff2Fsjhf772mxIZ5+OddNwk40Phv0FQjzy9AJarAMNNStexGYr5tJrPhtytO7WbROXr3PR3jfJUEcCWpwdFu2TdP3gTojKtvrdjdbUhAtYC3dEk9NbIcbeLl6J/LqqxnH6+vrsRAXOHIPrFQGtKeVL/uSIW7aLS/XJRtxQIPHL0xeCAGtvu4NBH3Qq2IrpZYmd8vdjtJmrYWYLjSe8M/1Y8OSU3ZcGerV6IIAAnuDRdTMCUKmMOxaUePMi3tb5TOoD6S0XOli+Ze6ND+7UJ/nE+D4IiAXRcDDyvPcXMTNuwrStW7PRNi+DM7AfQQKfzitFqU0acIAzuYwV/SwfZJ0zNoQIt832XIfs2IECmu9+eZwfBFkm90YbSBHm/HM7z8mUMdemv3hIFpN2g18+OnhVR4H89sDVatXx9NiB/BuZOvbSYRjtFRKwrp6F0hi5vypMQB9Tf61e+rou3gRokQYBjLvqalRdKS3nrfykQAd/+amjtPBFHC/QNFhZjEmQxuHIFJi2VoWPn+NzFkug69UXjy19ulGwFL95qvZb3Gbs+qSELCg6fWUtg5D6OZiVa034PqJikLrpwkv5Fx0pHX2CpE1W3ArYsd0rG4Oxou7iVTxQyILbKi2zxhvhf/0WHlaUaRoH9gFuz+kNyAqAnARznu+WRzMeTJs3gxe59CxbpORwsgliWjNgXzHNQXV0bFdG6zIzv3KOZMpX15lycvxyNihaXpIYM5qpzVwxLef+wncFn5xu/5rgA6HiyXagf62qPMd9yJwfi0jqgd/ugdvBIpheRZxeMNHv3CS9hzVNXsti7UtsN4mUh6LLqP5GMb0nv0t+FyRnUymtoTO2ZrJgJilhMOr/bkbb8MZFDGg3exU4xXoHgKGhBTlDVMeg26PU1nX/TU5blK7jmZbvMozRaqG4xIBloovC0aoNYJsfIadEg5oD7jRzYpLpObeG+ZzYza4z0q6VGQvT1TQenn7zXXZmGV6L+KXVaKwmw1MaqyIz90wDkOgBpTxIrxUCsAoIxemG0naLsPSfz7vtCYSIKliHpDFutci/Q+AmZ1jXjXnuM4HKj+usiPg2c7aS7M3SdPWLnMP7NF226k1eFIzaUt8rQ2P/x9WrL5KNn30Ug65vNvpwVgoXAphFlJKYMK5a7ry88P730/cpmYLau4X9xQMMXzcaauCbtKPz3BDdZtYSu1zJjQPRZa4PyCXnRqAd/wFC/s1maSanruNXJPjH5PjI3nyi46u4dYKfb8gwfLSMol93tJ0ifjSLq48mJclNxH11rdXPbb9eLqjChwxEsD9mynNRp6D5E+gebemCELfnUf6Qo2K1bRYHRjzYkPXGRye/ArN69G1LRzWB40GE1g9czSRBtBj7HBQQ5oAfGivf9iPowVdm6dBtdNcShc7vlqIplGOUbIxRRplf5hMM8X5P+VU17sD9Eoryh2SABGc3WPpcJ/DNOLI7vIUGLxHCjFz8/Bq+KoXNLVCnZ5OYrvzF3uBqg16IFVZVfL9mIsRiXR1DXovtbCP2sAYdi3pKtSxS0A+jWISmEzT8SetdMhTLRTT0VNcUx/XzQa+IWJFKqEuLaSRCyXCvORe0VZfB8NMVE1Hwmfj8uqytNMZex47URcH/jQKidduNznoNCrMgUmxW63Qeb5OGC9s9dUPTx/ClCKt/vTJ4jnbJmJ5/oMruvPq0pyUz28i8nJ1KW7xGlpC3jKEdj+Axr2B53mCbRpHYkDsuY8p76LHxZLzG/VzsI9IaZPUDFg89Y9fZda5g36EIBFHIdWbz0UekAZ5JJ5pqq+WsRiD4jegIhM04ovxLP49X6orMAs2jlxdbbBu3h3ilvDUG2/ejvBCgr0OD+eWYkXnBcF4qdQLytLNLPjTuYa9pFDHmDNx1wGaI5cLVj/O7lA==' as c FROM generate_series(1, 10) AS i; + + +DELETE FROM uao_delete_toast; +VACUUM uao_delete_toast; diff --git a/src/test/singlenode_regress/sql/uao_compaction/drop_column_update.sql b/src/test/singlenode_regress/sql/uao_compaction/drop_column_update.sql new file mode 100644 index 00000000000..8b6eb4b2d1a --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/drop_column_update.sql @@ -0,0 +1,15 @@ +-- @Description Tests dropping a column after a compaction with update + +CREATE TABLE ck_ct_ao_analyze3( +text_col text, +bigint_col bigint, +char_vary_col character varying(30), +int_array_col int[], +drop_col numeric) with (appendonly=true); + +INSERT INTO ck_ct_ao_analyze3 values ('1_zero', 1, '1_zero', '{1}', 1); +ALTER TABLE ck_ct_ao_analyze3 DROP COLUMN drop_col; +Select char_vary_col, int_array_col from ck_ct_ao_analyze3; +INSERT INTO ck_ct_ao_analyze3 values ('2_zero', 2, '2_zero', '{2}'); +update ck_ct_ao_analyze3 set bigint_col = bigint_col + 1 where text_col = '1_zero'; +Select char_vary_col, int_array_col from ck_ct_ao_analyze3; diff --git a/src/test/singlenode_regress/sql/uao_compaction/eof_truncate.sql b/src/test/singlenode_regress/sql/uao_compaction/eof_truncate.sql new file mode 100644 index 00000000000..b40df2fc497 --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/eof_truncate.sql @@ -0,0 +1,19 @@ +-- @Description Tests the behavior while compacting is disabled + +CREATE TABLE uao_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_eof_truncate_index ON uao_eof_truncate(b); +BEGIN; +INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i; +ANALYZE uao_eof_truncate; +COMMIT; +BEGIN; +INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i; +ROLLBACK; + +SET gp_appendonly_compaction=false; +SELECT COUNT(*) FROM uao_eof_truncate; +VACUUM uao_eof_truncate; +SELECT COUNT(*) FROM uao_eof_truncate; +-- Insert afterwards +INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +SELECT COUNT(*) FROM uao_eof_truncate; diff --git a/src/test/singlenode_regress/sql/uao_compaction/full.sql b/src/test/singlenode_regress/sql/uao_compaction/full.sql new file mode 100644 index 00000000000..05c65fc8b4e --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/full.sql @@ -0,0 +1,16 @@ +-- @Description Test the basic bahavior of vacuum full + +CREATE TABLE uao_full (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_full_index ON uao_full(b); +INSERT INTO uao_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +INSERT INTO uao_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +ANALYZE uao_full; + +DELETE FROM uao_full WHERE a < 4; +SELECT COUNT(*) FROM uao_full; +VACUUM FULL uao_full; +-- check if we get the same result afterwards +SELECT COUNT(*) FROM uao_full; +-- check if we can still insert into the relation +INSERT INTO uao_full VALUES (11, 11); +SELECT COUNT(*) FROM uao_full; diff --git a/src/test/singlenode_regress/sql/uao_compaction/full_eof_truncate.sql b/src/test/singlenode_regress/sql/uao_compaction/full_eof_truncate.sql new file mode 100644 index 00000000000..542d5c3b64d --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/full_eof_truncate.sql @@ -0,0 +1,19 @@ +-- @Description Tests the behavior while compacting is disabled + +CREATE TABLE full_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX full_eof_truncate_index ON full_eof_truncate(b); +BEGIN; +INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i; +ANALYZE full_eof_truncate; +COMMIT; +BEGIN; +INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i; +ROLLBACK; + +SET gp_appendonly_compaction=false; +SELECT COUNT(*) FROM full_eof_truncate; +VACUUM FULL full_eof_truncate; +SELECT COUNT(*) FROM full_eof_truncate; +-- Insert afterwards +INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +SELECT COUNT(*) FROM full_eof_truncate; diff --git a/src/test/singlenode_regress/sql/uao_compaction/full_threshold.sql b/src/test/singlenode_regress/sql/uao_compaction/full_threshold.sql new file mode 100644 index 00000000000..4dd13b20804 --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/full_threshold.sql @@ -0,0 +1,11 @@ +-- @Description Tests that that full vacuum is ignoring the threshold guc value. + +CREATE TABLE uao_full_threshold (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_full_threshold_index ON uao_full_threshold(b); +INSERT INTO uao_full_threshold SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; +ANALYZE uao_full_threshold; + +VACUUM FULL uao_full_threshold; +DELETE FROM uao_full_threshold WHERE a < 4; +SET gp_appendonly_compaction_threshold=100; +VACUUM FULL uao_full_threshold; diff --git a/src/test/singlenode_regress/sql/uao_compaction/outdated_partialindex.sql b/src/test/singlenode_regress/sql/uao_compaction/outdated_partialindex.sql new file mode 100644 index 00000000000..4ddd133ecdd --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/outdated_partialindex.sql @@ -0,0 +1,18 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned (e.g. because of a crash) in combination +-- with a partial index. + +CREATE TABLE uao_outdated_partial (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_outdated_partial_index ON uao_outdated_partial(b) WHERE b < 20; +INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uao_outdated_partial; + +SET enable_seqscan=false; +DELETE FROM uao_outdated_partial WHERE a < 16; +VACUUM uao_outdated_partial; +SELECT * FROM uao_outdated_partial WHERE b = 20; +SELECT * FROM uao_outdated_partial WHERE b = 10; +INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'Good morning' as c FROM generate_series(101, 110) AS i; +SELECT * FROM uao_outdated_partial WHERE b = 10; +SELECT * FROM uao_outdated_partial WHERE b = 102; diff --git a/src/test/singlenode_regress/sql/uao_compaction/outdatedindex.sql b/src/test/singlenode_regress/sql/uao_compaction/outdatedindex.sql new file mode 100644 index 00000000000..dc41146270c --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/outdatedindex.sql @@ -0,0 +1,16 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned (e.g. because of a crash). + +CREATE TABLE uao_outdated (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_outdated_index ON uao_outdated(b); +INSERT INTO uao_outdated SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uao_outdated SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uao_outdated; + +SET enable_seqscan=false; +DELETE FROM uao_outdated WHERE a < 16; +VACUUM uao_outdated; +SELECT * FROM uao_outdated WHERE b = 20; +SELECT * FROM uao_outdated WHERE b = 10; +INSERT INTO uao_outdated SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 10) AS i; +SELECT * FROM uao_outdated WHERE b = 10; diff --git a/src/test/singlenode_regress/sql/uao_compaction/outdatedindex_abort.sql b/src/test/singlenode_regress/sql/uao_compaction/outdatedindex_abort.sql new file mode 100644 index 00000000000..de3bc14ac34 --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/outdatedindex_abort.sql @@ -0,0 +1,21 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned (e.g. because of a crash) in combination +-- with aborted inserts. + +CREATE TABLE uao_index_abort_test (a INT, b INT, c CHAR(128)) WITH (appendonly=true); +CREATE INDEX uao_index_abort_test_index ON uao_index_abort_test(b); +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uao_index_abort_test; + +SET enable_seqscan=false; +DELETE FROM uao_index_abort_test WHERE a < 16; +VACUUM uao_index_abort_test; +SELECT * FROM uao_index_abort_test WHERE b = 20; +SELECT * FROM uao_index_abort_test WHERE b = 10; +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 4) AS i; +BEGIN; +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(5, 8) AS i; +INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(9, 12) AS i; +ROLLBACK; +SELECT * FROM uao_index_abort_test WHERE b < 16; diff --git a/src/test/singlenode_regress/sql/uao_compaction/update_toast.sql b/src/test/singlenode_regress/sql/uao_compaction/update_toast.sql new file mode 100644 index 00000000000..0782e6185ed --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_compaction/update_toast.sql @@ -0,0 +1,16 @@ +-- @Description Check updating toast values + +-- Create a table with toasted values +CREATE TABLE uao_update_toast (a INT, b INT, c VARCHAR) WITH (appendonly=true); +CREATE INDEX uao_update_toast_index ON uao_update_toast(b); +INSERT INTO uao_update_toast SELECT i as a, 1 as b, i::text || '0W0bTHVHn2es6Ga9YumoV/cat/CW8jglG+DjaLT7ewvMj5IWaiGz2/3eP5fLTxyzrm6Bv8kxiYGSt5hqM38XLKXRgYwvFnnKfIW/ZMJbkjlOeXQdse+sCQAobQX0+wrCBycwsMjVn6kgm9QLCxrQ96Cjx8l2nx/xr1+ekc9o2i24+faKAgiQE9DQKEAbAt3wMB/1SuiG9cZaJH6ASsLhSMq63KyjNse1c67o+sbJg6pxX5cftM0iV6DciVHU5rhALosKT4boil5+tfVmU+7r2aTWC1XK+nneNfVrmiQe3AU7iQgb/YU+7R+kgrirPv6Y1MF9BoXxih2jJ085E/EE7NQ8RwHm1UsTYUSyFpwdSg2Y8F06UPyEnPkuZhbqWIiSDMES4L7tz8YaGkYr5b69bUuKh5GkPDxU4mj0wbEA5jZDGT+a1Qgb9Tjx0/bRqI1Gd2RDmmLd3ZktSDsQ+APk8bgwZ5epE694KdsNBS5UsThRVwsOG9yNIEVjsTk3Moy59NIJcO1PZS48Q1GEdZTTdUYVWqqCpvJdSUtYg2kEuC/QfV9DTEuDqQqIdKchPdmLw//FoFSna77goKFIK2k1DkFPs3DDQDHPXtfXNQ9zgKMWOzKWxQrkDP4VA5NBsAM3IRpSiY4h1muXpejWt/2NiLo8PP7ZYgFXnSQYGzZsJepRdX0hCV6LWedzIf8fWYnCglKY0Ah4Cb13d0Jvviz4wQMATi4HcFEPewrhSsjWGA0cJZcn/AhCX4MgZIkMqXJvvnAjaXxkIfFE86YtRdP9S8L3sPZLO9VaNONsQrS4v5Md1SAY24d3GenGHEsuH3Tu1QJHYYQLe7juYnZyP71gX56bOAiECcaN9kerb+VQVX8gTvEI4LOIlF9dwrc3FuDaApO/XjKjffu5TXtEAgeRvp8O3iad4/aUo0MeWsD/dFFOQYGZpAGw5wA8bJMr46rSi6LJf3fVWwi3/sGvqDeiBCotisDsyfr5VrZpzQAkrggkB+L1eFm6bvRxH6w5lc8tX3ppjsrsEwt6qSro6qdZ1ho5mtT0CV/mKh+YaVsRaVOXxbRTSBQOqxtfWhjCWvncPcYqJBylRlzy98aWR871suYXPWLW2bxXSxC9PqEiz7HMXpNhjboLKOmMPeMcPZTE6Tgp/wRlyTdemhocEZEZWDpm3XQamOQ9kiwg1mqHwSjGpipFjHun0PQC+J2k+InGj3gODOGU4f7AD87wuM875GsbSYk+NDonfgkBkUPfHNLONF8ft3iZ42YsZghvzSqDIMepTJs9w8ITZ0aCfsQ9swHLK1larLLkQ/9m/wgBUXMNDBrZUZkiQQVGu67Tnmg8vZkv9NNVbHL03HLZsCMi2oI0auUdzCBd4+wyQ+97ukgLso3hAQLschExEQJcphaRy9n3T1WRiRETGd+Z7Yd90Ii8ePeyPp67itRHzKw4eAli/nCBiOVTSkWbtvLaEXN7/s+auJ/JzFKbXzwlDbIHmxLflxlSo03Gijb7aUnjIvyctyHenbTZGFTy2pw1YNJaKanEiPtK7CkDP/3eTlORS2sA9WyJATswpdqDQIhLBIrmxhTtSEvwwKYRFr35ZKMQ1P4STrjblkw+i2ZEh1XfOxhSH7sfEToNqOUCPO0Tdh4emPNoSaow8vha/YxpSZk7VaqyUr8ig5s9nmVa1Zw/w3kdalyfJQem+ETWfNB+3eBCjXSQhvL+J/0uQ973Na2G8+9+R2kh2ZIWlnjW2YNGoyu6z4xXvsxfo6V+Czz+UYFKYJjZfoapfl3On3zGmRXBjy6KJIIOZ948WIxc8q0dnJYjKLluR0u8ikz03qlDb9Fce2tzRh9TW48BnjGCfSp8o8+SJc8MHBnef6OgYLCtjnBNXklJpLBBEzQJujLV87Z+Gz5p56ZiIsd52sEU2x9Ro9roDtkpKgGQeUN0z/ap4ZKC7k4PxmUyXPTe0gi+sBM1yf13HvDN3c69bBg8RnaC8mML7qGStBtSv294OwxZ1Ap0/JgmuiwX5u8CnQ1q0TPFV7MzVvDCLYMlsiY+du2yFYLTrcZPmy6MLLT5NtlCovkaD+Am3vdw7xqOVEUGaatr60Dm3ynL49BbGBH930LcUz4PMOEaoH8OyYXryR7hObeRR5EaQC7ekZd9iZIllZxdL0HoJYWl95AgPnS5vPjYYZFsW80zmxEorByolcNxOtf2sR8Ffz0T+iyvMXx2CksvBZzy/yAhXQZ0ZkUGgqENH0IltJq4HALvX9AkQow46hhZ8kjB7kCrhXTVM4+iUrYfoAqzbXVSsNhXTcoun8The7RTZUWwKOLQ3tehCAtCd6rJ0oRnsopRjUGDEmaboq+GVLk7StgZ44WHVvr+bp1qVK3pNmyk7h5xbO28ECJETrZ2hLMGEn6xO4e0hI3EAXo9nsWDB8Hoqfz70wyTGa5L3L04JnVJoCPNnaf2CsP+DILSJ9AZD0HKRT8vBKtwm7uqdhtb1OYhgsOBReOmn1dQZdC2CnnvID7jlAx8Ot27wlysG66uIyDXbyuMiRltdLEzVn/j3JqwDog62euSakCucJMuH27Rp0BXwwlM8+CBW1xpEMIBOGKh0/6UA1VMgU4z0di5gVUfeuIavCpVGW2lg9aqC0/PkfPFNq9KWdiVxwqwo5dblW79UTRASnEjVerqlnea4jsvMU6virCQeIjRzeTuIBYbSM2OAxYqCBUBz5WsZ4u/Ldd7Qr7RbuyS+MUeByScEWd6LGWzOVRHd3PHYrajkynJc0e5I7zUFDkLHljlLvzgdgiTYVdEOodefR9zH8dNYZldQ1rTnUJvZjrv/XRdLsWFhUp4ypY+TVMM9Tfzu0mB3G1woplKLnBvsWNDhq2mUijg072gjPNteOq8gKaNuuRLppRVdUtokiFer1AWW8+O8yej/W0WXD0gV/Cgk4wZIdlF5LAQHqOWTGub1EiSkOvJHex1tIgEqbRWSvUJP1WzN3HwNq+zTxhGraUMqhvY318bk5b3rdBOxKxAi+TGrbOJOFj3XQrhVPS/vttK6UlX2pkyK654r4QYwV5YM9YQaLotxJvIZIgIg1injlA6dfflj7E/lKxYQWWl0PnznXYhduoOWg4EiAS+z1l7xLfQlxwNzriIc2vkgjxW58eyE6j25Cxj70oO4JIrC/tyPWssruKtMvjKPqPhOT2XxbviQ/aZkWAy2OErr7Wb/Ia7a+rouGnYoIhDClxmhCkuqabr6d05EXbE/JHCdn2lhKFNa14tJtbB/j842xwyxSP/zRZAWRgOirBgk1QDORgiUpWQrrKggqkx3YSJu3SVDSsrnV9739KZ0hOhEvz72o3DAnUmuZJuPrfD4C6z+qI6pdytPZY5UbM1MqZQG8WDy0mKeDn3htgKjcOVd68vT32tGhhvAPt6bnjlupc4S9YWcg0q1LEsxB4puaOoIkl7c4NpM6iSs8waaqJXwOxKoj/ccEb12lCUTczwXpZB96BHMGKxp0OhKRLC39jsYXBc3CCCXnSbaji47SWX9bgJMiLYxUDWbro13zwWG67P6INE5AO6eB596lOyF0Zet6n/1BhD4beQdAd4lof0y7yPql2OoDEsK1dKEO7w5HkPG5uuk7fvq4ufbf1zCDgukDzjW+7380PQbMF4acSQZFbevWVN9GkhCKYuKTPHhud/elahgLfp2EPCziC1eX77ArCh9ouKFFo4rQRAIdVFREpL3KszOiDil+oBOG+NB7RkrESoPs5WZxc5QtfQCG3K+z1MTHS5LrSNfBy9quxBujPujdDx+9430sQsSKqu2CIUV8TiNzgub3etmxm3THMN26SNxDMMN4VNTo8wNu9gndqTeD38gCoNxoNPBBYNUJWvw4OTMt8iqEPAfAunm9dviZhua72qCxx1f+oNr7DNlO4YL0TdXctJH2QPR1Z7T3QXdVITYOPDWvgRiW2ZEFmDP8NI0WpMxEIpP0EyxMcuX5u5jebG1I+Czn5FuajoTpJYXRSunx2fGQeYXBl+E/u9GQgcgiFBXNyOq/lf3ivpSqrMiVp5JA4DdolaHVNnxcx+b45rD4YoMHQW5OPlErOdSzri2KPq5k3NdmRvX+29a65eY6uchsKqmOSmyPE8gInPxMhePc/PkN0eP31UMcXSWEk2klEOpBDY2FqMZK8zGtSm5OMecMKqqrMyEdWl+QEXkQCX6+kMfr/yvWBkqd0drO1Ve9hDlJYcrp1+pCP0T53M2g9HxEyk5EqVCwRw6CLBvgZPpT14yqPMF/qEBFzbJ7m5Ks39kUJvJl8uio6I2Xd02fiwdWOXQDW51mjWYCADfEFuILMCy+M3i8p0dLBCLpnn9SthU5is/BtulZq04ht0TKZdhj8oainbDPI6v1PjapMm+9+aFKSjSgIVsH8bCWWzLD9pD+gKM8BsMvN4HR0Vx0kGA+Qi4yV+Yd0pG3mN3Et1fcKQyIrE60aKDw8BNkhQo41/v/Zp24bMS2fTn9ST6WzTDQ5t/09YG7WCPaCDy3cl0DxQn51r2QPOOTkq0v5dvAG1+5IqfoXvO/xfRfk/5/6sEz3jy/P8Vk30y9erl9GC870SJtNxsaB4duqB+SgPL/V40eTnppOJxWcDRFAZjVlPwNq5nopJ/JNoAE3DhEUcIB+/uepmf4n69ojrTBrlu0k7YQXGFZtXZvcWAS/3ensZgUF3aLP388+G+iQikR8ucHSh/mynCLMlqOfg9yUL2W15DCYfthtpzl3MKl4uU8N6ACmBsPfip9SjRTx2xGkqWi3clpjqEcefpCVX6caNCAH9WbIym3So3K4QEQ81+Heo2+9GF+nHT/VkXMzmT1UMU09Q+dyHoB+H2LIKc6TToyQh2DhbmaXWXfjq0TiqtX9CNTW4XWgS90rFACRiXl+HBelY0x0DrtTqC33Xo7cGEOB6Bzp9YWpmxw2nFxHZmw6zqJFIe2zyC9xk7qzGBjJg6LT2qeVKgHiJA9W0iWtNMGpvu83Gps+oZ5OXWpNVPVrIuKyvpgMW3p+lgHU5v6VbusW4KFdYNQR/4R1jYw7FIZyX6B8VKrIaigts8n32kdsCZ/lLieTps1l7R4R8CVG5xQnasdCXo6sqIZWNwDNkb9HXkmk6c4L+TADX8PQTyjXY8Xj8TQcztpwh/wGaPErN1S50W2/4PfDZnI1sqdsRMqT8nz4GCUhq0r6cF+2a/05V+Zz1YOPljDWqxQcONU5GGl1dKoLbDxxQtY/Ms6kFytzJIwck3JBrKpi1MhpaDa5JfvxCXNERhoUC3kcINSC0h5G2dlyK9E9XYM0jf777xBRaVUhvwb0UlzuhMx3uBfRSPMvR0v5cvyO1nwNRY27qNs/ldXbILnJHESjy8jhcexY34lGTLZgUoQi1YN1svUl/in5A041cKUc0gaxUENQpsrpT/ZljpqAANUX5UPdBADBjh7WT9LCH9RXO4Cs+yjCyseLmI1Gx+kJXshlDcWiYXbbhNK1o+/J8fL+SBalIpJTHZbme76B4k1c3HogZ87gZAQcpIOAweo5DE0zZIiLMf+tqDRovk1yro2DRGn5vrpS5GHgkL4bg7mnGVS3+QwJW2J/VDlWQHCvj4M4Dq5AVYAAfUzzZf59TqW1zTfNyO2isAfvUim2huqfBD/SAoiGufsxi23vCvPohXX1ytGpjtJoziY5wd8Z+eJqTHDOUcYOvTJ2BUs7uKHdMcZ7zEBYecItSdlTmUBTWYrtYX8bWXKFoxxUsIiAPwFSDQrOCdmV3zWEwdywNP6mTAbm4dkqwFiW+zn/a8cxYouq9qWuc4UsOCOGizgTft0A2OgglUZ8EJH/hgDyjuvq8uqf15RHiFHaY/Nne5/Vtij9tKwOFamay1dVo0TCNjSg+8vX6YoIUXe4EInQtyg+uQypDIdxp16TT4wEOMAkJca+vxh1a4g44j3TlhzuTS6SeqvVrUWrrvrIhaJgcP5yQnG7+gtkfvNdY1PZoCN1JXgfkd0EqKr2w9Me+4U22mbdiI9m6pGiO8/GFJ0KVbewNAXyJNrZBvw5pDEOyrOesGJcHaiRdwX9YMtuFjRkEKZHgtlvTg6FdLtwb6AfzJL9zL37MBuiVd7WCkKb1fpE79POFS0CtBHc1h8JUEE2bzYzvuoKD4wx2VmOeKrztlEfyF9aNhf6vgslzDezFOguu7gavDOmk5pjxBx3SJt+if01fcz+3uLVBKeu0g4bp9ULjSQYXZMW97rTwJJjmRHVt29BxHHbDRbudL2Q/OSO7HNbc0pMrbJX32U9DZjC0mSlF/r4RD3rXfAvQ4sXutg3HOO9KjRrujBHNBKbgteZ6sOoDJFIF/im/X6J2sgyBT06uMC7OSfDHDEyJNZKfm1sWyCLiGGmIXEsP2MKVg8qJGB9uMioKvMgKi+kjgwuxd94nh2bfqP9QRd/aZ4Sha+YNf5JAQMi7ZPimhCrEu5LNKGtfq9t3BJ2vsgq9cO1S/Uu6Br4uqMIKqi2gvtRd/TtGdyyCKxvbanZowr+vFxRBNEQjA7HbWYSPVvFlYvlhTe4N50rLaqt22/wBqkCjdyXrrAHqX36duA6DqkW1dFKzo1NJUo0ulYq1bSocnp7KJLWS4U5i3Wv4n5ge4okTD2nSwd9OO4NjBg3va/49ElKifTAbH4B+C4FmUPL9XeF2/nFzAy279bXFAzbBNXzuxUPbhLfRFGQDXb/wLwO73HvG64lyuMrjKqiXgfjzF3QqxxnIq+jdaWDU78HK1elGjDGmgVcyC5THkZ1hQ1yRVK+Dr3S4ZoAsE1vwxpSR7WIW4fpKqexQ77HmMQJpiZmham79WqNLRWG7HueS6+MpWrO8GuDO8gpZ+LgOCjtQzcEmbUy3d2CiMpLU/qLAg2LcYm8tr2waJBvzL29zld82ZyfB/qv8XNkD5nQGthkWUU5Vu+yiB2G8Luqx6q5YPcH3RpqWnVAmXCr9iyFsupEMYkPW+bchqJf9D8+Pa4Y/8IFpfsdgmA/lCu4BFNT9Ar+TdLiVd7t8JTRlukFOSNp3yQlO7E8tvlgPOMDNHqcItuK5M3JnXCcRiK6/kfIgJXkw5T4jo9vLUF3BLNeTzCvpXv/RkV5o/Q0qyrSEd0OrT1TIZNR+eoJc2FQqgEEI5E7JISkdC9LAgawnSgzStzJ0MzIvghU9v224ANa8I890EUwytN1cWUF6F70iD34zAuHhCw4SMm2syyQBkNCCVDqHQ4hX7KWE6IMe6rYn8q6rb3UfoyAlNlowRLk0yMMiQxBjO9ee6f+7q32F45xIfzbwdmzy3Tp452eqJA07w4FI+IVYn8VQM5R3k4qPCWW6dxkPXCE6N/q84O6Ed2vxwPNQ7VaSc5BU4UKwfKz3SRTSUUEJWX7Q3Hlp2Er0Hv/2fwXeWTkdbw9ALm87kgv0xWSRXEe7ZDUppJ0+m6gmlkhEm4g01sTS7ORgraHrwT/zp9sWTYBl5ABAhYYg28oX4gB45ZVPTJ0Dr37FmpBgMzQDGTjQDIe/lAIvOes4JbRESDJb5vVcSQB7Uw7o+6ccBmmeb8xEQS9LZ8XRyuhZ5JynB0Hx+z/tqZ6dFonNmaXRt05wDvKPy9rwmhXD58/F9eAgIN4XEkRJkI1s+h94qr0WYiRSKbRuRvNJWRnAevCqoNrpDnz1qpC3XY0oxbHglsq/gqc7z3Yit8uKVHpSdGSfJat7gVtf/qh9lRrI67hVjr4f76UqztVMszz5oMqWrxEWXI93U/p2OxdtuwLVYSNLsN3CujYn15ijB9mqx0x+d55vBRcpBm4e69urDnXpnyELspphOuc8+xFniW7m5ZVvtYfPzyaGsShjp7geiXgyTC+mP8EOlreAtiJRfzkMZQ/Wu+sfGO9n8qH6wMUklh8Y8FjO8Br7ql74BKUyxHvtxIEL2hd0Wu8qUu6XvK0bUNaDlndhVzpYmJb1itwz3O2D4zw1RJRVf1h4J1c3hcWL87kb4AhodKCGczXDPQMyVyCJxnSBgP4k4cUiNRHXx9RpcQDOTtQ1gzT9VrGP9iO7k8a75oZDf2FuLUt9Gqy68/IYNzXS+9z6GbftWLND4ZtQ7ObLzXIH6c/Y/dDdv/aXUJFuh1ymGIQCH3cDGQHPADay3o0c/0y8WKPBmIv9f4gyWwH0mr+cq70PmjAwqMcjh5MPIEzrOUfssHVlGJixFuasPohD0oFH4u2cXx/0kEsAbPWUilLosEeDoVeOAvzNr7wFZ/T0ICWiqD1HDZzHkqwBr0h4MtKE0D1VH51rSRrTw4NZVObceffGJAW/57D+8s6Xj0ULkIXLpYoGBISjvN3U/qNhax5eXoKSjXJ1LDZZnwxU+v/u4rgwq4O/GdacWtCHCp8j0jtwdM4xbQthNsBQo4qDVXySylN+eK5d2keYNsN0kLoVS1i5kuzK9WOYSPrKYpyyqwbhzo5b/VjapYSR43x8WpD2zFh7Cd47fiBRmb8srme5gPOL6pjVgMCf4I2FoG98Mdy+OOmeiPu2tToJgetPL4tGp0eHmmmxjhhxnpPK3buZ/eslF0kxErf3a/zsFCVSYf6DIOxl9aDGwCjf8wPDolj1tl1+L0zj2c5lwziRPH+53xCT9NsCLV3wDlp2J91SqpK3w7LQ6N1o9xiRvwryVPiMO16Vz8oRbvOnCl1+niv5cYPxRuNhP+oh9xeAB6u7TLdKDe268tfPkP2HsL/T/z7djVDVc18XTW1zjQi1vdZJRrlAKiXJ8zqmxFHXfAq0/BGADAQsIx/hAHShbbV6iTt3QVj3MtiYV6x5cq2I7n3e3q4xYyXEiMtqD235i6xjtpNsoGAETXZ0L3l1RdOINjagc7B3zb33RsKpj1yo9bkF2nVNDUT+s5QtbuQCnf4nRpj/AlUrUt5C8lAD+DiQtdlcM21/qZ2gvU5iGah1t1oNnV0+wnG6az6aza4iP1JbscaVB/8W/h31gdCQ+AmaQGLcy28wGM/AKhAOuhQbDnYBm1mgJHTWOg28wBYspsO/hx4l+/yYAbZpDsQ8HnVdIPDkj0/kEygJrj6SenOo5n90MZE7X0xGddlLzhlOeIGKqzf0kxpPXzyXwtZ5UxSzBg3t30A60lRtMmF8JwgU1dDCx/W17w7EdHK81/XjeDqfXoj7avzhmskc5pDMXhkB18/llFX3+qlDs/IrmhnNHgBc5CKtgSOBqCXRfODzBTz4GQeGcR57XHICMfrvI/agDH4SYHwMw2Pgac1vCyde2DY0AvVlr4X6ESRkKmlCIhr39xpEkgZ54sGm32FxBO82hr16vclOGj5pa9V3DpbDBup3wqvgSPt5r85AOOwGcpuJeyvQIAldjLxDlWDN2TqVr3fWfQ6mELb6gwo0+2nEr5xbYKfH0anseBnCIhQyVs0B1yUz7H0/oC4DnooYL9vPTJVrJBrXzc6h3npKJSpZ2RNLmfKTHI42kVNnW6GS0XD0vhBfTUO9mLSqtex6DDChfKJCbrA9BrrcA74Dxc5eefFTIeO8sAhHcO/l7nCyyjDvrERUlLztXqmlymgwL9B6LHSUYL+tbmMQVagNSQbQxZsdgPu5npTK7NAFz4cdX+1lwBclkCKiaisYr0V2AgUDs5F0oPMzge4EUAB+eEwjsGpq/A/QBOBEcOuZOXx1DxE/PvehndVacIZH8k1xEU0wgs4RTXFDcI3chD+qDvHIHU8j5J05hjc+3fHuZnQijYDbYpIuJuPpGxallP94KmjPGxj4CI7wAnOhnEg1P1AZ3Td64TVeqdAdBAAOpWJRz2j3Z8iaH45ZvJW5S5HM7KuSsAyUnNlV83SwBphhe1VjDg6CG7mXVVuod4MNEbiN2nkFt8P375tjHfq3jbwYb6zeBvGM5G16G5INBT0X81bR0hd8fW3LngQZpKmjizYoxo8i26Ag1aKtf6LhpLF2PBpddPu03lhACNw3rbpTaLYgwDAvHb7K/NB7bpZEDIw9x7uy+fgBBhdvjMTvEO5SL7FFT6upxhPvA6fTUegkcHDaiPXzbQyPgpLOLlLDK5Gfn1+Xlam5F/GVyvb2cQh0zKwFYyBtBfoKV51OBBl2EqezfQsVvGHkVInlKwNoycI0CNCQsJfLuOfZs4epk6dgVJr48veAWJKz0cC/+rV5TAZgpehv93tFBnhmx/efnJtF3P2HhIn8qN2j/jysMij+t/VR1j67OotsCyXq9Sxo90a11cWRHZUXjxALNhiNZdtowR5REbst/Ij3Ki73VovC/DehXCQy8Kb+OALgZNxF0rDvr2onuh4uJKWY8/CZl1ltz5vj/WqXiOBm1XywkhGSCFGjHoDntZT+ThOgtBSzlyeyRTs+uSEpGakX96XQIYTnQh6Bqu9aWjL/RmIKqDomLtmnQM5hWG6bC9jq0mNkwkRemaiRXDO+3azMPOwgo2LPRO90bo0TchJID/aASyeGlrY+r+kRBeU9TXjizWd6CUaljYM9Zaf+vMuz3ySlkkbHxeDBvju3kwenbSVWgbA58bDA+RfpHDUtcxTndrtnvd3XxOazfX040jNcFKdCAsy/93LS0byKcABsSa3mC9UXQoxe3PALneqQZMdO6ACKIiKYgCHn4YfLd9WDVO5laL6yLx1WkNiVz68s/dQWNQtZ5MIs1e6xl3GLtsHy7D9rBdoZp0B+evionoq75EuHDO4Qk2y8kw/w+9KXYcwP6I5IQv06vvH95xqTyG+FOFbVNgD7naSttmsXyL3dQyTdEa5dAC/cngWkAhv0z4onU+dXt2dW/hWhbTWxjMePcahEKqItKZxh2ge/yb+WeqEI+oRdwfkm9dSflURx8CRi1CcpgvNVKgM+7+zwebKuAOuCZEBNJ/rRcJP3DSA106ODXqaAGaV1xkD9ho2DSl/3Yvf75gQomfgXtN9tShu+16+UDaVl5/7nTpW9OCeVQ57PONvsF9mMnS39u8QaigI6SesopjmISEI18phMK9dSUjXDZ1JjhnrncCjWQpq8ft0fY5/qqlglihbJSjwYT1RXp52qVkp1kqbdGNaZweH6lKF9SguyheSlInCr85H8QoNraOXRn0meZ9V1SkKx0I/PffXhWMy/88fsp00uEWtibqSNky3sjFsPQtplwOK3DMRKCrsJN2YWERYqe4LU0c4h+hHzx+AbzoeF3C2vAVBW4xtC9ECnuObtH6vFi8GPYk/XHskQRydxEhqwfLeVmqat8nvP9OKcSbx08Fb3f0yhOIWsa5pxRdidjRD3VGOpa75Y9f63zWQmFjXEPCLASCvNNctGcL/L+9aNd+oZxpX9Cs4tMDx0idXASGtlUb8L/zm8J4P7/zD+pqpxb6PENdfFAgiZqK4bLmH/DnKbhVhEQbt2FiU2509o9da2MGljCFqQoGN+EgYHOVtXGOgaqnCDsqzlcNHmpj6BgzWLcsnNomwpDuoYuLlH1Qwqar1Hge5aaSA+W5KPVwLmh5hkI+vNpJfN+cff2Fsjhf772mxIZ5+OddNwk40Phv0FQjzy9AJarAMNNStexGYr5tJrPhtytO7WbROXr3PR3jfJUEcCWpwdFu2TdP3gTojKtvrdjdbUhAtYC3dEk9NbIcbeLl6J/LqqxnH6+vrsRAXOHIPrFQGtKeVL/uSIW7aLS/XJRtxQIPHL0xeCAGtvu4NBH3Qq2IrpZYmd8vdjtJmrYWYLjSe8M/1Y8OSU3ZcGerV6IIAAnuDRdTMCUKmMOxaUePMi3tb5TOoD6S0XOli+Ze6ND+7UJ/nE+D4IiAXRcDDyvPcXMTNuwrStW7PRNi+DM7AfQQKfzitFqU0acIAzuYwV/SwfZJ0zNoQIt832XIfs2IECmu9+eZwfBFkm90YbSBHm/HM7z8mUMdemv3hIFpN2g18+OnhVR4H89sDVatXx9NiB/BuZOvbSYRjtFRKwrp6F0hi5vypMQB9Tf61e+rou3gRokQYBjLvqalRdKS3nrfykQAd/+amjtPBFHC/QNFhZjEmQxuHIFJi2VoWPn+NzFkug69UXjy19ulGwFL95qvZb3Gbs+qSELCg6fWUtg5D6OZiVa034PqJikLrpwkv5Fx0pHX2CpE1W3ArYsd0rG4Oxou7iVTxQyILbKi2zxhvhf/0WHlaUaRoH9gFuz+kNyAqAnARznu+WRzMeTJs3gxe59CxbpORwsgliWjNgXzHNQXV0bFdG6zIzv3KOZMpX15lycvxyNihaXpIYM5qpzVwxLef+wncFn5xu/5rgA6HiyXagf62qPMd9yJwfi0jqgd/ugdvBIpheRZxeMNHv3CS9hzVNXsti7UtsN4mUh6LLqP5GMb0nv0t+FyRnUymtoTO2ZrJgJilhMOr/bkbb8MZFDGg3exU4xXoHgKGhBTlDVMeg26PU1nX/TU5blK7jmZbvMozRaqG4xIBloovC0aoNYJsfIadEg5oD7jRzYpLpObeG+ZzYza4z0q6VGQvT1TQenn7zXXZmGV6L+KXVaKwmw1MaqyIz90wDkOgBpTxIrxUCsAoIxemG0naLsPSfz7vtCYSIKliHpDFutci/Q+AmZ1jXjXnuM4HKj+usiPg2c7aS7M3SdPWLnMP7NF226k1eFIzaUt8rQ2P/x9WrL5KNn30Ug65vNvpwVgoXAphFlJKYMK5a7ry88P730/cpmYLau4X9xQMMXzcaauCbtKPz3BDdZtYSu1zJjQPRZa4PyCXnRqAd/wFC/s1maSanruNXJPjH5PjI3nyi46u4dYKfb8gwfLSMol93tJ0ifjSLq48mJclNxH11rdXPbb9eLqjChwxEsD9mynNRp6D5E+gebemCELfnUf6Qo2K1bRYHRjzYkPXGRye/ArN69G1LRzWB40GE1g9czSRBtBj7HBQQ5oAfGivf9iPowVdm6dBtdNcShc7vlqIplGOUbIxRRplf5hMM8X5P+VU17sD9Eoryh2SABGc3WPpcJ/DNOLI7vIUGLxHCjFz8/Bq+KoXNLVCnZ5OYrvzF3uBqg16IFVZVfL9mIsRiXR1DXovtbCP2sAYdi3pKtSxS0A+jWISmEzT8SetdMhTLRTT0VNcUx/XzQa+IWJFKqEuLaSRCyXCvORe0VZfB8NMVE1Hwmfj8uqytNMZex47URcH/jQKidduNznoNCrMgUmxW63Qeb5OGC9s9dUPTx/ClCKt/vTJ4jnbJmJ5/oMruvPq0pyUz28i8nJ1KW7xGlpC3jKEdj+Axr2B53mCbRpHYkDsuY8p76LHxZLzG/VzsI9IaZPUDFg89Y9fZda5g36EIBFHIdWbz0UekAZ5JJ5pqq+WsRiD4jegIhM04ovxLP49X6orMAs2jlxdbbBu3h3ilvDUG2/ejvBCgr0OD+eWYkXnBcF4qdQLytLNLPjTuYa9pFDHmDNx1wGaI5cLVj/O7lA==' as c FROM generate_series(1, 30) AS i; +ANALYZE uao_update_toast; + +-- Now perform updates +\set QUIET off + +UPDATE uao_update_toast SET c = '' WHERE a <= 10; +UPDATE uao_update_toast SET c = 'sIyI/Ynw/BliTF5FTltp/BQgVpo2aSxT6qXI0+xJc8VnFJ4XPFyFV9V2b1qHhfmLpbEHOW2APhtuJYwk5z2JbXltD1yOY1mgHJ9NH4rwxHMvOwMBOQkqx/WH7wH+QY6DckUhbdzooSgGnaPZNc5J/KsxPhVb2AsiQDB4O2Kwb0dIe6DHVRtRDHxSfueTBgVNANGO1AG5hp/UTuiWF2TJRFQEAKeU9BfNTIwUl/gEgTmZT8WP4OyH0jMi6sNj42D19t7oNx6P46OY0VndlpDB8X0Ilg1n3TAJ8iRJQCCEVCjgc2jzaSKJrsZ+VYcoOBFYgXhARevfvLLJcPbPmVZVitkCcq4JHF0JplwATsyJopGpppnsE68XNe/T5sj3UgMfUYzjkmTsM1ty5BpwAx/8quwSe0BoI/Kqi3ZqWjS1mTtHyZB5DeP0xxrKn7mNgbrRgdcpP+52c5lQMxXLcl+IvPJWH+SnzeDQrCHS0Ylu2M24q25FCJlSBcjcEKMig+PE0ct6w2QcXB3cMruMJsueJQg6xZxkhYeMzysbAzo0mj9whGzoeWWFlz6KwXbW6GSvH/AsNMR5JprnkSFzuzUNJBGh/0AmYAJ1K8N1FSVhwYH2UCm6mQMEydD9U/YMvGWa2S2yH2ShMtW/+Pw0N4TrA1yVFnAMAUBe0tGX6QO3Tm3DKjFv3T9GhJ8DDrxEOftUq2i0cOVDa8Ul5ZdIZ3V8sa3l4mtBrRNGiVbNl3LD/9Juf3s6AAE5MgvTtSNYS1uVOzYeuse/669ZNgo1xc0TQ5qpozHvdCAQPTM5uEOKuK18vs5eEh+KgfKa1IGxg5nU/t5Jmwwcoc9FYcA4vqZDb+dPBnNW/Bd4oql9Xe5S5kNFC5xhTyuEttCWPPAGWdYTzio1nnFFnTyn3uuwtNCggoSI2iP1dlfjmNhGHYOjlSerEElpz6obY2oIz5j0LXVPX04BJjXUP+0OXRe+HaGwVPShVbSBZgcFu07aXuFLMA5ZQBrsgsZMbLYi7PtFCQYpiYaLJ2vp44FAAS5zx6/sLjVdQLY22aVCmN/YmktcS4dMOtQ/bZUbichftUnG9sve5hM0ePsbbkCgILHbpw2hL8aK0I1a8PoAHVhnLrAbATd4qvlCGCcI6QFWTeFu+EWVVWQBDitKCF/j1O4/Alu6xXFjto4bnDXYSsSELK3a+bPJWpx+9lIWlziWThyeRCIq6AbwD4+71OVJaK/USJMBfyQV0O+3AyKz1I0UcvU+yqUXq3j86R1FcPvMCgGP0ANAkFpf8S55Ra17df3OIgP6GSbF8g3Mk46oZnkF+IyTIZ9x4Yab2aer9lMb+qqvlAcoxXftrHl8pfMXAf5yqAN5tXBb+4Sq/9kMChrkLSuNeeYjmzFNbO2+smu9yvba9YFyjhmxdePQltxyt8eDYEvGbnUgXIsn3Gngkh7hzPW2Ao7m8uWPZ37HV5Jfm0rukubMD149IocSwnX1UYzAigBSZUc9vl91AHOc/1Q1ePDzR4egM1fJPoDeKAsDOr37UhF3DLeEbusSetvlkrvY6eV2ER1fiZI9IMdmjqUbRabp8F814eyvx54HMKpA/QhEXXdFsEJvwkVcH5ApFU1FXh7le7mSHHN8HaUsG5R93W0w7gCtxCAxVIu01ChXqni7EyVDTM7Qq+7y4+0P6jjrOQhy0CcImO4hPWy7kt3DUQ1SIWTOE1TPnCwiup1aWztJBGI8cogOVZMrEnIfdvnJXKtPeNSnct9UdlO/GnSJ1qGuuGuR6WP62XUn1Ax4GO61gFoR14RG1IzA6SXN0yE6b6AZFrDkE7QgnetvDXOF47uA4kQYUrrkrJptHPaU2iOzDK4hVNziHvBAozPEqrG+dD7q4qYpk/R0LV5HGNEpn33WAJwn5FOXanIgQJsKqMdzD2ELMY4S6utGmxx1waDi8dX642to9q0yaemblI6jbY1j7fCave6QkFRaKnmbk7IPB6BDwgu1dwTjxFDov5jtki2NCmLZb9WlVS/NWNoSx7kK4GcsOEhWszVSRjM0GpmEmLMJgQNrcoUb8aANCKy0UFqRZyflC9Gu30jc8Tx0Cb0+PJt6Z/l15n5zOhpsBJD2CCHBfKddor2DwPbutjthLGwFx9bigkAnP9bRPy72AgP/SNLOCyilKGjybhYMo2FSsH6Mh+5f9AsZse0mmY3i+cUiwk+gKfbJ/SJWlG6An9zauNyYFbGt3SmG/QCw7sxjrc9G+dVVBNZASkNGDQz8xg4OpRi4ZyVBTr1kd/b6KR2P44KqN1kGpQRT5mhfT1CefAvqy36YsTrjFYwgjc4O/DioVi25o1a5qt3oqtH8TgqpWFnPIVChm1vblUV8xKbdJ6dQXe5CaksigAQo2ynpDbCpNwWEGm3VmyGCgWnh6PNuxU779YptR8HSwfN6KGL1iRihPq38ohxA/TGGpXhzKPAcKXRZ+d1q/3vCx8xZBwweDA5J4LDb4AppGh/sYzeHmLod42g6XAz4CdIDgJUg35ZTyamUMr60d9CPeVi95CaiGheGCXAyvrHVTxXYlhVw8QI3ZOCimQVbdSQDYHDnWhK6wzjD77vR92qMOzoSd5w09mnfw2ZNqtHXUUlZeW9JVn9PW7W+vbjIhjHDxz398pPsAqzHjQFqegZo3+tSH3BAnNxLHDiI5hKm2Y2/6nV1O//A8U2KQ9rv635QWokuTeGdV4ItMwNPhhKQHB6WqDIv3dMkKkIlBtt9uWMFZOG89biuSJJjydgzeW4EfFLqyQMQ5L5d2RyCzCjMe0XbvTEaA/rASs2tan1eMSrexpiq+eAc3w4HP5zw7YW1IJFpBVbyYt4UQNYYO7sKUK7GfGkzTKE0rHm5MHECn8QXl00YC/jz58xSThQdYvxmEmwyqDMkPTH8WHWtpHJ1Zvkn3n4Z/v3KVU8ijLfX9QuMb4aIsx4KPvf6TSuiOeYNemrB+FF5ExLlC/pazJj6pELOlGIuS5YjNDWxfLT4hZNpOXxwagbdtNBdkpPjw+SW3JUDHOizXSaiYbYyuCHsfi9m0yRerDHEUmUwIXJtWrusr7t9i2S29AValDiNVH8BLxi7KjW5pRuY+u/3hTHXmB8U/YcUFNwZzTokzYBxVW2aDJ1boXrtpEvKpwGKp73aCGkoVAVrLyvXtdMhkTuvyJG3v0Hq6ePelH3ie/9SuQ5UP+K3yqyz9et60ArZXM8dPaaHOYINUheiA/YqysepCy24S3xW8MlH5LT51FadfcLlQq/kz+MF79v7papxJXphgI8VfU7oM1v+tZv1y1ajeZ2FmfTGGP/hjLAcoPmStDqFo1nfhIKvdXmTH7IY6xQna8Uh/UKtrcXXIzvevgKYBa/CDW72gWK9vR5r0STnwTCct1aeCOjsh64bZkTM3tktU4owR+nenSuJ3FfXKan0wCQLrCo/Ywd8583DaOrIjc3H7RYkOvZoPkqO3F6LmXuxsCqU1FvPSnSfWOs+z/TWTsRmMDQk0DIAYyPs/SjMO2ISO3VbuD61XHenQ9PCUz6xtI+ivSGEeREp7EvDdKgZ4Bj0qB03Fodx7N7vt6vDh9JtcSZEe+1dqiDOtzbfy+OuoZD1wOuPTW0NW3aeAamd70NcBBCcN9Vm9gwkiVlVzw/jKIiv3YJcWz5rAUDefKv98tkbwQw6iZRwsu/OQPKQY8i7fbbB+RimDMxBhAzjTsF0XzHFAR5EcdUoKMRsOrOQXU4NcWx8S9cYqtI1o8RMv8ICaxB+bHnXzuF5LzRmtcuC0dJZlj3V9imzJeT1+mx70dzBXwHqDweYVYTTRCRzmaHgq9uRAcUqTeFhMSnCmmlwukl3MVBTxdnsASBeDlp/A5PxUZaFBll9W8aNTXUrrIt2j8vuznYID3buiAn/Bcvo7YfKO7tgtJVpDrXqNJKQvA4NWBxXDyZqo8xQF73EnwEOsJc+D7/RTf+Y9D5zXbZ+ufvMGkKaMFd4n+17PyMJ3nxFRw0+EieGJX0AIvA/69KBxcJ7U5RJ4prHKOiyUbH36hZka8qBd4dTUdEUjGzcf3iR21bIHdf0eeXjpcykbrxkQ62YDDWl1buTrYGvypBtC+bGzkKCXoHSKigod0i4nmV5h7qSZe3OtG69o7i9khd7stoglQEHQegVeHZkq/T3dIXhX8Z2tFvVLJr/40h18g2JHUpZQsp1ejjJ7/woTXCtEER1LQi0kUT/5XPmRqzAR6kEAQvsDSjH2wizytBYb5IEddAf9dkCBEAOfwK3I6AVXijz5FScxSMislBaA6MDf4HAXzmJhgePdgdPoxYIoF9w/xrnBQW9BocBNBP+e6uYRrx4B1gI35rfXhIF0R4iIYBULFUYT9gnOw6swlsiGmqtfLsLzyw0WABD4Za1dT+WhsMFHAf8oo8RjW1RgbeGkbZk9Sr10GfL9aqianmOOOg7s7LYuvN/ppLtmA29YKUKKQktB7AMmkN2SOT54W8ykc+8bt0kgOhmjz5UPxqC/n4dHv0apCG5ORElv9fXAPxaTSLxs6ngmTchuGJmVS7liH+pxtstDysf6fMPA4E6sfX7/+0rKYXdIH1JQIxUePzvuV1wXcUKfW8YWdBT6KyVDRyOFjSlwbuo3QRMLf+dgz7SujqD7Ba550K/Zt/ALNouF2+q13jNYQ5EJsgHcc+uT0b6kkHuOI7SuqMZA/kRYufl3/ZzLWpGjuVKPztT7YY3MsgyBNfkQehXBvnjRfl51mrppQXoVejKkMJR+b/bcLZ1hPnf7ss4NNSdyu9yMsCX0bneqpwe2tZsa3kgsFNNZuTlLE4YwneaRwZC/OkYgHXyM8SWVa87fSQfyrx5ZAQ4v9vc3R4UAaezT2bYk9JKM+AJg96CUp7+VGGk3U6Ij7LbahTCG/4OxhX484PZ7VksEV5+kK36b6pZK8ec6WM2CJUO0KychYE0t3mdCmvRCfGzaYOQpm23+go6NmutxKx7WnrV2fSENlgHUVnYAIqKy17nXg2MLtOfNKSdk1UOqr2P+THhESYfm/Zd9owJJ4bqzvbRV3ZNo888rq3F1MqQrN9PpNK5LcxugOpTgtBbXzzL1RzhBOO3LSDClv307IFbNSL9bOloZGYHT8IMV0S9HLlssj0PymgWY2gis4co5DG3y2QHv3SC1FAyCj4QnCQAz1m/ZqyaO/avT535SLBq71j3ImkGSum7pHCKZUm87CgC+33mj8LJKj9NQ1DmozICtJ6XiR/BGPG5sOT9+p0VYHat9iGqAEM1NDDF7iOuIBd0aj1eP636UOvWX3Y5qMDZ9UXwfPLPmMp48B8gx09bAqarEooVtClmRw8R9u1BiaBy5449iAyqeDGF/NmQJ8Rqbg9jFSFUcdvi75LKlVT+8Eu83aaeWuUjILlqksEw+7s8/jnbaMWam1j3HTdk3iV+RaUlsKDpUV980QgOYQkCo0rd4+0Cr5xZ2aKAo2ttisebF4ypo7pru7n2X1L6nbIpGqEcHFH3s+O3RpndMnYk6H+kK3HyxqC5/7dENRsAq5Np5IrnmVnaP8HvUVzv2YAtkk2vDhGS/LBsmzdPGiJjCEncgiq5DRQFLbW9GfHkYb5Wj4di3unDzXfP+yHeyJQY6IUr7zJ/FEf7x9l23EPUEssv3nwjK492bmG+s4POZTHKTblcIjHb/WT+wvwoI4zlNXRxPwwybLKMRMyJRJfAFQEZqhWLO2J/NsRgYiOrIVfO4xqWISQakLBoU0WYbcWH256k4hO5l702BjMdxSV9DdKEgoBbXvdo59pXp72/EaRi0l7W7HMB4Z5VmKWhWhn/PEloWL76Te4DlsPhfckcQQdCkCU9w83rkNtZuY0PfL6aRxxbFn1lKw8/Hb4d5c9pSXKheMx4hXTJgz5AdfDflDG+0NY78yVzEQlxglrqx10twz9QHCdoZGLWVGD5rCHTTxnQ7X2iQalehYuB9nKXzL/XNXZYKKHTPDFHaCNqPy7NR81cv/vWPhQF5W2qefWPHGbB5Tamr3rFCSxgFP19nBHIxeGcJbQUepS8hmk0+q3x7JNdiMo6yqLAKoV8D9oYNvr2tXX/txStIN8YNt52iq+DVJ0E5kuLHbptTa1G5Gf5B5FKthyLrGrXfQ6wfwizrOjyrHUTZzEx5VVjbngT8dXM7bMtpUh8I940wMPXA78g1ovm9VjoSmeF3NgFOxID1W77lHwck8dZmwOnxFVnqw8koKODRWmENnOmUPnZCkAPBDomVoUwhETUmjnMw5E67Trnei4s6Vv+CHhQOZXYqj3loqyM2fqYClROFSfnSRSxRvOzye9yVEYexnV429tRs4TfkHnzjKLPlA9dSARDsOwc3hwfU4C7BtT9UZCNcoozC2AYCXKM4Hq3bOUomyJWHlm+ig6icAGMS4TQjAjf6jTy4bMHKePEb5raNiu8b2F/NDICIv+YwnaAX9KX5xtuKV0XbrUWQgDwkRhPPFzvPtCxwtgsHx5xNU31XAToQWt7k9acWmJ0DGurIFFpUKO5t7tEYWGaB9p0Xnrz3GjaCpjUZ9C9VKRuxAi2eDf9a0ER8+KYjEL+z25S07P5+YTOgvRFz8cBHtQbpuU5rVr6H3rS3XdOK6yc2MCTWUDlGGMfNdxjW3a7afxgsHPadH0HR+CEhVOjHH6nA7/SX9A4J2D/3eVzwKseHtecmKmUvumDgpxq0a33ji6042lLHx2+DSQb0zUxShQbXxkCqGsERMVKvsKaPJB0QXB0scWXJDGudxKJrKpRvIOsrSeiMPlTR5s4ELObvGYaUGHZ1cLytr7qoRYOewV6iLRsh9mTrqquFXXa1TUS04oNn6+oGWX1aFDSyQogdLkmOMKhkbSOoEuIruUWCAlHb+KV4VmeU1DBw2xBjfhUZo9SjTAuEeDD9uihPXtx7zIAkXhwrc0/fy8Lp05Zz4rMWyUkXxdQbikTTFk2a6PuH+OS2yW1iDRRgki/5/vVVHXDXI5EW0EuvhdV0jsodf6b4b0lVM6MaEFzuqCj01TxA0XX8mbGDUUUV9gEyzXB0hdGl5id5YO3saz2rK9PmGVcFqMpBmz4mEcRIQ7RZPunUXlIt+g8ZINCNYfAsPr5IuVqZIIKOtRlYVPWVAQDmegwjhumzZ4tgvqhKUlPjzsgnR1MtP8QwP1bMDrzt/xuiIotnjmZA+hgrGOqdbqhnSRUCejE3b+uVTvdjHvl0eGm5JIXRJcFqfcFplyn7N1RYQ8uV9uGh8ymP66NsXwxJ9k9OwW8I5Fq3q3Xcpl23UdOeaSdG9nUR6BhhkCuOb5PwVWcO/LJLZSLWuPul2/F6l5FZFVrmNutfgDgwejJpqMVYugrpIurh/LVrBqFCUWKg8iix+xeWgGIhCqzusD7o2n2Ci0m3WIgOCJE5MQo9Wvo61LCiqDCYom0nxcM3fZsdondSmEOhz3lSs/5k8UQ3tJZYsB/2e6+iAOuTWgRj5ys/dGyaDhKCsDtgFZdiKttJ2LmcT4t1I6dMt0oOn7LLoQt/R6uKRP5pkzTg5fV5VVpnpuXmWTlMfy9v27mPpxHiN2rIR+dcy1khKrjhKeEIfAjAxWpcLT8BqIPjQ7IEEotn7977/bLOmEl5eFAuXEanyGQtNlp6jlvzRoIiCm8Y1gKtnF/dmmh2aeEkrAyDkHmlvpAFnDojM56db7YfmHYC1i1+BHZVFJWEu8wDFNslL6Y8hZpvb52/rckx0qN5SIMoFpqUy7h7nGN/XV/PJ+K1ev6wr+lTqNPuYJm3qVbUlPkBKUbQ/5rRy9Nh9VFD4St0LTlIfgZWS5uV/i7haWT6i5PWjmWSW3yN4tLmmgr3F8KGvOp4lScf1cV01RVsihhqFngQz7CPGwmNCIuHwR04XBvS0S61THQMM26UU2PukdHNZK9yurlYCDAJ85rWzFbTfwMi/n3VhSpwkiiRxrvaKmBFRLophrYD7XvqpmfbVWDlV5+pfR6RaujCWbv5+V17YioO1MDJSbGK1JLGEOJrmBgqhDZRJNFkWpKhPTTc95x8QqyuGWgkNnRK9IS+xXy+61nqNB8u03pq7m+CwjasQ7Ozm+TRovm+9a4MHGjMbUmzlsrB2P7swY5ZZ7uriy77Xea0YivRWT709DS+bJZKUMuzFz3O2CDM+3oVeh2zP5Wn3Qan674qqYR1zoP+ttHWNLKN8lVAbUu7p55J0dU/oa4kk4SDia6MX2owUwNKqTb7b8XKjuGab/A7CxDRXSMpD/RP8YVQIr5XZBxebpZmg4LMC0DqmTf4MfLaux3WKblWb9JRkS951H6S/GLIkT3gB0pmDSg5pzOEK/Jylyd2gHYBPkVTWE2G72JrRCOw9Ta01F4gnRGRV/+QqClVmcAnh+Ru9g6PtToJjpd0dWoNV/uQypkybazU2hpcwkDv0ryKDUavBINGSvXpIbZoCHvZ5rYJshdrt2PgaGAv9aoirRNgydu0HhmdaBr4Et1tXimmnE/BYX370daMKnszlyjjvOm1w7ggJFDHWy6gImNNoUNgmh/KYJtsXyUdDzC+Epn8TlnJgJE0wjbrY+Nl/ZpqzFudeW3+cwxjvzjOHm3XLoziZd8pINMdWqgJyA7WJ8fneZW+Giy/qYYmFntFGAcM6JFCarL1dl6+x4i5Nh1AfFQSSDvozUxdG/RlyzYCtRP51QS1axIrvhmG1JQFqSdk527z3or0zhfLx60H/MOuzbyGaucqCAxVfRWEobsdT7Al3kud9JuB3u82i+r8V/M1AlHYALkESoCh33o1dvHyQjnqoQWWSy1G7QY5zmbXMJa24JOh3ih2HBWS6s6v9mrHmQB/pLOBFS0rLeNofUJ8Im8cuU4lrW+1I8HBExfAYvxCW6ILtt4o53OB2m5tH1fb9DDxbov9wZmbfX5a/xWIFNeH9BRAWKHSiUGo4mf8l3Nafm/aN0ZfcnzI0t1xl0fXFFeRUMiV6eBWFy9dEdn1mLiCOXgVZMZVFEPDWG1yP1GvM1ZD0yaKmSQVjQHN3KETm1zQxwN4eYIh6fvchtXs9ySzYpKizbGdpet5QJvkz2/xH/hRvYmK0DyNqdKm7+PthevEaz6nLGQd7qAPAkpjpe3JzDu4MnmKFN1Weis8VeaUygXtAFLIlBvYlQagk9SnThfnUu5orX5jBzq6OruZqEwg7W3rk2g7IMo33S7vqlDpe338oB1JmEGIf+AC9qIJ12rup8AOiWCV0v3L4OFc7nBf//VJf391XVHFyPcCVDsA8Vc75NEw1mNC8CWsjc0Fb0apRhips3v6mKF1fmF5utHz0V+nzWvAfEiaXFsf/fHqsqluLvkOo24JimsZB3MwevrKPmVsLSCcui4uIMKXHxKp5AQy+L7hIes6JdXcGNyhD6N3VyII9wCHv8v8BDyQVVvKgxlzcixmWbuc5zZPqUk7iQozLgiyGgbhecqXU+RnCFax08dEK3/JGDRaUjxppIK72/b1xYtGMPBIbs7mPvbhwc+L3wGsd6TU03gxmj5dEBaQrfe3VFkJsFEmcjVrKY1hBtu+FZEWGWkSPn/kzpdKFHYt8TtSjTeGBgOn3x6lYV62l83qdXzWWqYCwy9zMYe7YIbtB6uJiLG6S5PbGXmj5beM9mse/w6TR1E7Ajr/6lFI6HmMpvqLbgViKGF+L4hlR73j3Z3yzIik83uyLVb9S5+0HM+uh3gY/Kd6mpXnCNwfxTvlv78yWh1XkQASqDUAGWndblurkFa5FDucUxULtH0x9+jMl3D1xFGIaLkPx/qYz9HXzbriGIz/0u8rXw7WR9YbXK5bitjATg7rdu1rq4gl9eMeRG+AhzsFzwUHmkUSahZ62uhagK+b6bZeZHW+L/3/lKgcwqfW6oKmvj0M2cb95IoSwjA17ua3qDp1wmGnTVUzsutpfNERMM/82FHEsFinIbE5nq/3PFB1Yl6Bxp48LL5WTbbInO2HA0l/yOgI7EGTDD1vR/Ch9tEjv0t9U84Ljm9nHHIkb79Tn6bWcdyOwXAXleSkAqyxf4sFKsXEwEBwiPJkXJB/wYlfEl0n9GAAn5rTuSNGg8781pU3FpshzpcxpqgenDEBFKQqJW2uyfGTKY85FOolWS6dxs0Fr224pHjFEC2j6ssU90+CiexAnb0nIMgkxbF/HdBVl9zIxQwo5UTEvbzFC7d3L2kJIkX0rTI2mU131kWwDVvskvG0s9dfzfqEOal1NAMIHgnYeYAROrr8xfLmEmjAavtp6EdBrULHGFobd1hQxtlj99F8btMBdGf4cyqmzQbOhkjCOm0VGPS2JzlGoWVSiM8aNssRQoHroXPGOy3ypgVI8xTbTYeDniqjEd9Ysp67j2kJsh+FC1EovS79QeyqaQNTmFmdATPcjG7APrpYtU+QOt2tbI9Lkw6KJvUMnFg/PkaHSo/4+ylaXuwEGLImFKS4n2coLbz25xFGuN9imHEoEIVM+KYPB/i3d1gb6pyHN6mXxZVidtXVkHb3qwHsm0XGpIkU0/5Tlpwwfw9K9mNzJBb813GNsTA5GnGkNBQeCb0488OyFRRo6tysecdc2a5nBDomtovLwQ/7LXzW7v1itWU7yy54VJwn34Q1UtzGaGUMRfjRuDTXsKvrYa1Ui2VmiZKqMZ3H2wUIBoNmfARZUxxnJodS8nPHaUio9aB6SRD9M/QQcYojuN4PCOQ6YqMUuAgScnj+3OUs+mQfSkQegkapL/oLCTdpL8p4LFCY62ujXZyJCTMTb0lodhjvRM6rIPd9UExzoP83dKRaM/xSg85Sn/2baVaonWCZNePA/tT0oENqqr2epZYA74fV5d+pwDOVaQo4T1b1UuitUkom/RpEvVZFmfYBY+gkBNSdjsBExY4JWv5dU0KZfUB02yiVFPZzpaWe/8f1SvaEGYe8yCDLR2F6DTxXTx7YN7dKBU9SwZxm1mnJfkMYzcBr1EeexPLac/Ih6f8RhfmNPF3SkNFS472HzOzwDYfyyOmDTAy7rPq1d052LyYPEWnyC6T52yZUgnB25dy/MXwYBydJZaPa5pdZ9sNZRQWw9qOwDZIPAoxS2mdgD2LPy3tU4DJN2YYq+bwwSRFAjN1E7PTOIP6LaV00X9yt0uiCOMyWthpB7Wy0+ctFlSNmRssjW6d8yTgKivYRcmq3jeUIdV7me2zMz1+OHYA3iJIMguGKOPh4yECwQFZ1bQBEtCaPmTNPed7s0rc1RRKmXjSSIpU2tsv2iCj2x6mGdltZhFYZ5J1uVRVxyx0PcYO8d4hrNbRHHcVaKLeQgodUe+vghj/i2hK7jxLO1LupEBua9kztk0YJiWWtrMkQR6O49mUssQMWgIGY4r7UqEoD7sM6fC8eihUa/3AAFor/ydO4nn1PT+WWkkmYa2jMIp+kSNTtJxssT2oFv1TY7exHm8YhqR0lXMTJqsZ4vOeND4aAq14uuaOs9Ejn1+3oeD178hAQcji/Q7vwB2DRHClag/EVVZFPrTwjpeR9sGerQSbuhkvVNjcnfYegG00k4Hmjxgk6rrO2IV/Dd7j0iBcz1ZLSRNe6EuPawXo3Tpq9lbqmIBNZpKEg/xf8BmKYRSwgQPZrq4Xl96YIKasgM5RQs8mnSJy+mqM7omkm0U1FfrNiyAb64Z/ZbEJg6CuFIeW/Gv3pi/MLCbNejRQzmcxeJML6XbyRjl7S5dqD7b1WJkRaLLW7S+kEw7WTR1jN/8wNvfQT2omZhYBWJnsihpVxlLX5oCF7ieVzdjqEL+4hHYAFpm8nhG4qTh8/Y+v0p31jb77oJKxEaWmFR8DlwzJ71NdhyeL62Xq+VvnzYtl6rOgVr1m/+TkJkOFzkPyC6gtne6SjXCO9h3p2sCdYbA4RGEZ8UdVkmkB53Obg54C7+yws2UOWgsfm3Ft4+3hnh/ZTigxXl10qjKFzNMeFCduS+TTqjWjYUZethkcJxZKsu9xXMxicOKKZOL8rYvalyZmcNWUOx+EEfgiCW2Qr4RGvNJzVO+v78kxMkxlHPDb50cWHQUsaN8f2/M9GdQTwlxkBwzF2iDh0SA3Kihe5Jpe4+XByTNfOVFNUSAx+bGshn4mu6zZbeichw6/4m034R/RPKxTH92WsdbdoYmMoKknWbLMs1gNUueFWuOLX/Ck1m1GQtpyThEBNNhpgZJXB0kOcfRYD9uzF8Kgs6QGIhWQsfEvj7IG/XWH9hidIxjsQOaTXlR1PcTOROVMlxCyrXtvq0gJdwal4l9r0SQ5ecdPYcKJ+mnU2IGMMJhGvQQ14Hi/dB+vlIToTDSwkdL3kwmJXBd4LDoQLk88NGzoVeU320MvE7mXW+SQxknSLUMqLedAVwxQIvx3TnK8o2/hvktwTSCW5ie56/kmVQ9Ttx28kzMQiqAPACm5odIVagF9qfyjnGQGxgCrnaPaDTsxRXO9XJcH1yyA0Sy3WY03kBzAqhtNfyUJWJm0/zSePPCmzbjMNOPYcE+zVzsxAks41dhg+XEzbQ5IqUT2KmnySKomumUpx8jDdaQSCx/RA9mo/MjACK1KrSJFeoh74k8y0YaPrJdnwkzNW+nHqs0V9HT/vCZTsNCpN/oeLhL639IcQKO7jjt5jLf0CrHsy/u+0yhqO6W1SBub2DfeD3AZDTMz3cqL8Wbg8/2nBmZ3/3gRjXE6cFIVNM2ctXmDXJndhDzADHFTxlkmcdGmkIYrmIb6X6kicnx0qjbwEL6o6ZnjVutlGPCa4dXPXS2kfiHZbd9imHjBXv6Wm6Q1LAuknIY1d4llGM0qF2FTylchzmvl5gi9K4GPzE+fcitcQ4vfZj1Q1j6bDyhsXwLIEyoE8zQ8hHiBlumOmbvyHZsmR+WEQfV0gGsXVB/Ek8gRrChaqJgbu7AYhpvtjI/hslv/E8Amj2tW5ytEishtf6Hoad3A9KK7Uyhcz+QhFpgWvLANwldAqtFS1bBAE7ZKl3bm1Tdtw1pVisUBjmFel59ZqKm92+Sqm32T4xsVFx2GNwyyxdFfKCTVvpzKuNrlgyxxV7Yl56Q4zz3WhREgjGSoEs8lNMTM7J/ya02NdxRx/dP/Lnrqcm+W+T58F4u6SR/ZExPkP8r70GIaKzIifuZzG9Hju2aE45YgoI2+K/9wq+pVMfma7uBo5ZahDh8m6UWXbnorjlivDVyD+9ragVtg4rmydpgyEqHlo5+uPlOMhjXpkLnppEc/Kc8BIC1GbVd2SfFjKbgRovDMKzAvSQXJmA0ffT/B24/0rbhbXHUK1wccRlkVHGRcgXj0RI3ete45zcQ9ifxOTvAWR/PrY0ZaFuUp0SSkcerOWXwJNZvlbjlOnYfVcWGuIGJDfhuwiMV+eDZoFhdHbQH0EAsp5l/A3cwMUkrOJdc6Gy8euwBIVzGVaMW6RQ==' WHERE a > 10 AND a <= 20; +UPDATE uao_update_toast SET b = 50 WHERE a > 20 AND a <= 30; +VACUUM uao_update_toast; +SELECT a, b, md5(c::text) FROM uao_update_toast; diff --git a/src/test/singlenode_regress/sql/uao_dml/.gitignore b/src/test/singlenode_regress/sql/uao_dml/.gitignore new file mode 100644 index 00000000000..d1b811b7de5 --- /dev/null +++ b/src/test/singlenode_regress/sql/uao_dml/.gitignore @@ -0,0 +1 @@ +*.sql diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/alter_table_analyze.sql b/src/test/singlenode_regress/sql/uaocs_compaction/alter_table_analyze.sql new file mode 100644 index 00000000000..282b84d075e --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/alter_table_analyze.sql @@ -0,0 +1,41 @@ +-- @Description Checks analyze and drop column interaction +CREATE TABLE ck_ct_co_analyze1( +text_col text, +bigint_col bigint, +char_vary_col character varying(30), +numeric_col numeric, +int_col int4, +float_col float4, +int_array_col int[], +drop_col numeric, +before_rename_col int4, +change_datatype_col numeric, +a_ts_without timestamp without time zone, +b_ts_with timestamp with time zone, +date_column date) with (appendonly=true, orientation=column); + +INSERT INTO ck_ct_co_analyze1 values ('0_zero', 0, '0_zero', 0, 0, 0, '{0}', 0, 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000'); +INSERT INTO ck_ct_co_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001'); +INSERT INTO ck_ct_co_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002'); +select count(*) AS only_visi_tups_ins from ck_ct_co_analyze1; +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_ins from ck_ct_co_analyze1; +set gp_select_invisible = false; +update ck_ct_co_analyze1 set bigint_col = bigint_col + 1 where text_col = '0_zero'; +select count(*) AS only_visi_tups_upd from ck_ct_co_analyze1; +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_upd from ck_ct_co_analyze1; +set gp_select_invisible = false; +delete from ck_ct_co_analyze1 where int_col = 2; +select count(*) AS only_visi_tups_del from ck_ct_co_analyze1; +set gp_select_invisible = true; +select count(*) AS invisi_and_visi_tups_del from ck_ct_co_analyze1; +set gp_select_invisible = false; +-- +ALTER TABLE ck_ct_co_analyze1 ADD COLUMN added_col character varying(30) default 'test_value'; +ALTER TABLE ck_ct_co_analyze1 DROP COLUMN drop_col ; +ALTER TABLE ck_ct_co_analyze1 RENAME COLUMN before_rename_col TO after_rename_col; +ALTER TABLE ck_ct_co_analyze1 ALTER COLUMN change_datatype_col TYPE int4; +-- start_ignore +ALTER TABLE ck_ct_co_analyze1 set with ( reorganize='true') distributed by (int_col); +-- end_ignore \ No newline at end of file diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/basic.sql b/src/test/singlenode_regress/sql/uaocs_compaction/basic.sql new file mode 100644 index 00000000000..b65f90f576c --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/basic.sql @@ -0,0 +1,15 @@ +-- @Description Basic lazy vacuum +CREATE TABLE uaocs_basic (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); + +INSERT INTO uaocs_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i; +INSERT INTO uaocs_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i; +ANALYZE uaocs_basic; + +DELETE FROM uaocs_basic WHERE a < 4; +SELECT COUNT(*) FROM uaocs_basic; +VACUUM uaocs_basic; +-- check if we get the same result afterwards +SELECT COUNT(*) FROM uaocs_basic; +-- check if we can still insert into the relation +INSERT INTO uaocs_basic VALUES (11, 11); +SELECT COUNT(*) FROM uaocs_basic; diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/drop_column_update.sql b/src/test/singlenode_regress/sql/uaocs_compaction/drop_column_update.sql new file mode 100644 index 00000000000..34a74f61d85 --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/drop_column_update.sql @@ -0,0 +1,14 @@ +-- @Description Tests dropping a column after a compaction with update +CREATE TABLE uaocs_drop_column_update( +text_col text, +bigint_col bigint, +char_vary_col character varying(30), +int_array_col int[], +drop_col numeric) with (appendonly=true, orientation=column); + +INSERT INTO uaocs_drop_column_update values ('1_zero', 1, '1_zero', '{1}', 1); +ALTER TABLE uaocs_drop_column_update DROP COLUMN drop_col; +Select char_vary_col, int_array_col from uaocs_drop_column_update; +INSERT INTO uaocs_drop_column_update values ('2_zero', 2, '2_zero', '{2}'); +update uaocs_drop_column_update set bigint_col = bigint_col + 1 where text_col = '1_zero'; +Select char_vary_col, int_array_col from uaocs_drop_column_update; diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/eof_truncate.sql b/src/test/singlenode_regress/sql/uaocs_compaction/eof_truncate.sql new file mode 100644 index 00000000000..6e7fe15db1d --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/eof_truncate.sql @@ -0,0 +1,18 @@ +-- @Description Tests the behavior while compacting is disabled +CREATE TABLE uaocs_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_eof_truncate_index ON uaocs_eof_truncate(b); +BEGIN; +INSERT INTO uaocs_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i; +ANALYZE uaocs_eof_truncate; +COMMIT; +BEGIN; +INSERT INTO uaocs_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i; +ROLLBACK; + +SET gp_appendonly_compaction=false; +SELECT COUNT(*) FROM uaocs_eof_truncate; +VACUUM uaocs_eof_truncate; +SELECT COUNT(*) FROM uaocs_eof_truncate; +-- Insert afterwards +INSERT INTO uaocs_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +SELECT COUNT(*) FROM uaocs_eof_truncate; diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/full.sql b/src/test/singlenode_regress/sql/uaocs_compaction/full.sql new file mode 100644 index 00000000000..458c148076d --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/full.sql @@ -0,0 +1,16 @@ +-- @Description Test the basic bahavior of vacuum full +CREATE TABLE uaocs_full (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_full_index ON uaocs_full(b); + +INSERT INTO uaocs_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +INSERT INTO uaocs_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +ANALYZE uaocs_full; + +DELETE FROM uaocs_full WHERE a < 4; +SELECT COUNT(*) FROM uaocs_full; +VACUUM FULL uaocs_full; +-- check if we get the same result afterwards +SELECT COUNT(*) FROM uaocs_full; +-- check if we can still insert into the relation +INSERT INTO uaocs_full VALUES (11, 11); +SELECT COUNT(*) FROM uaocs_full; diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/full_eof_truncate.sql b/src/test/singlenode_regress/sql/uaocs_compaction/full_eof_truncate.sql new file mode 100644 index 00000000000..3bb1da825df --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/full_eof_truncate.sql @@ -0,0 +1,18 @@ +-- @Description Tests the behavior while compacting is disabled +CREATE TABLE uaocs_full_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_full_eof_truncate_index ON uaocs_full_eof_truncate(b); +BEGIN; +INSERT INTO uaocs_full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i; +ANALYZE uaocs_full_eof_truncate; +COMMIT; +BEGIN; +INSERT INTO uaocs_full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i; +ROLLBACK; + +SET gp_appendonly_compaction=false; +SELECT COUNT(*) FROM uaocs_full_eof_truncate; +VACUUM FULL uaocs_full_eof_truncate; +SELECT COUNT(*) FROM uaocs_full_eof_truncate; +-- Insert afterwards +INSERT INTO uaocs_full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i; +SELECT COUNT(*) FROM uaocs_full_eof_truncate; diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/full_threshold.sql b/src/test/singlenode_regress/sql/uaocs_compaction/full_threshold.sql new file mode 100644 index 00000000000..81825fe5507 --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/full_threshold.sql @@ -0,0 +1,11 @@ +-- @Description Tests that that full vacuum is ignoring the threshold guc value. +CREATE TABLE uaocs_full_threshold (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_full_threshold_index ON uaocs_full_threshold(b); +INSERT INTO uaocs_full_threshold SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; +ANALYZE uaocs_full_threshold; + +\set QUIET off +VACUUM FULL uaocs_full_threshold; +DELETE FROM uaocs_full_threshold WHERE a < 4; +SET gp_appendonly_compaction_threshold=100; +VACUUM FULL uaocs_full_threshold; diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/outdated_partialindex.sql b/src/test/singlenode_regress/sql/uaocs_compaction/outdated_partialindex.sql new file mode 100644 index 00000000000..28d678e5377 --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/outdated_partialindex.sql @@ -0,0 +1,16 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned in combination with a partial index. +CREATE TABLE uaocs_outdated_partialindex (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_outdated_partialindex_index ON uaocs_outdated_partialindex(b) WHERE b < 20; +INSERT INTO uaocs_outdated_partialindex SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uaocs_outdated_partialindex SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uaocs_outdated_partialindex; + +SET enable_seqscan=false; +DELETE FROM uaocs_outdated_partialindex WHERE a < 16; +VACUUM uaocs_outdated_partialindex; +SELECT * FROM uaocs_outdated_partialindex WHERE b = 20; +SELECT * FROM uaocs_outdated_partialindex WHERE b = 10; +INSERT INTO uaocs_outdated_partialindex SELECT i as a, i as b, 'Good morning' as c FROM generate_series(101, 110) AS i; +SELECT * FROM uaocs_outdated_partialindex WHERE b = 10; +SELECT * FROM uaocs_outdated_partialindex WHERE b = 102; diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/outdatedindex.sql b/src/test/singlenode_regress/sql/uaocs_compaction/outdatedindex.sql new file mode 100644 index 00000000000..2aa0402bd66 --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/outdatedindex.sql @@ -0,0 +1,16 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned. + +CREATE TABLE uaocs_outdatedindex (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_outdatedindex_index ON uaocs_outdatedindex(b); +INSERT INTO uaocs_outdatedindex SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uaocs_outdatedindex SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uaocs_outdatedindex; + +SET enable_seqscan=false; +DELETE FROM uaocs_outdatedindex WHERE a < 16; +VACUUM uaocs_outdatedindex; +SELECT * FROM uaocs_outdatedindex WHERE b = 20; +SELECT * FROM uaocs_outdatedindex WHERE b = 10; +INSERT INTO uaocs_outdatedindex SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 10) AS i; +SELECT * FROM uaocs_outdatedindex WHERE b = 10; diff --git a/src/test/singlenode_regress/sql/uaocs_compaction/outdatedindex_abort.sql b/src/test/singlenode_regress/sql/uaocs_compaction/outdatedindex_abort.sql new file mode 100644 index 00000000000..e6562f6bcf6 --- /dev/null +++ b/src/test/singlenode_regress/sql/uaocs_compaction/outdatedindex_abort.sql @@ -0,0 +1,20 @@ +-- @Description Tests the behavior when the index of an ao table +-- has not been cleaned in combination with aborted inserts. + +CREATE TABLE uaocs_outdatedindex_abort (a INT, b INT, c CHAR(128)) WITH (appendonly=true, orientation=column); +CREATE INDEX uaocs_outdatedindex_abort_index ON uaocs_outdatedindex_abort(b); +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; +ANALYZE uaocs_outdatedindex_abort; + +SET enable_seqscan=false; +DELETE FROM uaocs_outdatedindex_abort WHERE a < 16; +VACUUM uaocs_outdatedindex_abort; +SELECT * FROM uaocs_outdatedindex_abort WHERE b = 20; +SELECT * FROM uaocs_outdatedindex_abort WHERE b = 10; +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 4) AS i; +BEGIN; +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'Good morning' as c FROM generate_series(5, 8) AS i; +INSERT INTO uaocs_outdatedindex_abort SELECT i as a, i as b, 'Good morning' as c FROM generate_series(9, 12) AS i; +ROLLBACK; +SELECT * FROM uaocs_outdatedindex_abort WHERE b < 16; diff --git a/src/test/singlenode_regress/sql/unicode.sql b/src/test/singlenode_regress/sql/unicode.sql new file mode 100644 index 00000000000..63cd523f85f --- /dev/null +++ b/src/test/singlenode_regress/sql/unicode.sql @@ -0,0 +1,34 @@ +SELECT getdatabaseencoding() <> 'UTF8' AS skip_test \gset +\if :skip_test +\quit +\endif + +SELECT U&'\0061\0308bc' <> U&'\00E4bc' COLLATE "C" AS sanity_check; + +SELECT normalize(''); +SELECT normalize(U&'\0061\0308\24D1c') = U&'\00E4\24D1c' COLLATE "C" AS test_default; +SELECT normalize(U&'\0061\0308\24D1c', NFC) = U&'\00E4\24D1c' COLLATE "C" AS test_nfc; +SELECT normalize(U&'\00E4bc', NFC) = U&'\00E4bc' COLLATE "C" AS test_nfc_idem; +SELECT normalize(U&'\00E4\24D1c', NFD) = U&'\0061\0308\24D1c' COLLATE "C" AS test_nfd; +SELECT normalize(U&'\0061\0308\24D1c', NFKC) = U&'\00E4bc' COLLATE "C" AS test_nfkc; +SELECT normalize(U&'\00E4\24D1c', NFKD) = U&'\0061\0308bc' COLLATE "C" AS test_nfkd; + +SELECT "normalize"('abc', 'def'); -- run-time error + +SELECT U&'\00E4\24D1c' IS NORMALIZED AS test_default; +SELECT U&'\00E4\24D1c' IS NFC NORMALIZED AS test_nfc; + +SELECT num, val, + val IS NFC NORMALIZED AS NFC, + val IS NFD NORMALIZED AS NFD, + val IS NFKC NORMALIZED AS NFKC, + val IS NFKD NORMALIZED AS NFKD +FROM + (VALUES (1, U&'\00E4bc'), + (2, U&'\0061\0308bc'), + (3, U&'\00E4\24D1c'), + (4, U&'\0061\0308\24D1c'), + (5, '')) vals (num, val) +ORDER BY num; + +SELECT is_normalized('abc', 'def'); -- run-time error diff --git a/src/test/singlenode_regress/sql/union.sql b/src/test/singlenode_regress/sql/union.sql new file mode 100644 index 00000000000..ca8c9b4d128 --- /dev/null +++ b/src/test/singlenode_regress/sql/union.sql @@ -0,0 +1,542 @@ +-- +-- UNION (also INTERSECT, EXCEPT) +-- + +-- Simple UNION constructs + +SELECT 1 AS two UNION SELECT 2 ORDER BY 1; + +SELECT 1 AS one UNION SELECT 1 ORDER BY 1; + +SELECT 1 AS two UNION ALL SELECT 2; + +SELECT 1 AS two UNION ALL SELECT 1; + +SELECT 1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1; + +SELECT 1 AS two UNION SELECT 2 UNION SELECT 2 ORDER BY 1; + +SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1; + +SELECT 1.1 AS two UNION SELECT 2.2 ORDER BY 1; + +-- Mixed types + +SELECT 1.1 AS two UNION SELECT 2 ORDER BY 1; + +SELECT 1 AS two UNION SELECT 2.2 ORDER BY 1; + +SELECT 1 AS one UNION SELECT 1.0::float8 ORDER BY 1; + +SELECT 1.1 AS two UNION ALL SELECT 2 ORDER BY 1; + +SELECT 1.0::float8 AS two UNION ALL SELECT 1 ORDER BY 1; + +SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1; + +SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8 ORDER BY 1; + +SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1; + +SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2) ORDER BY 1; + +-- +-- Try testing from tables... +-- + +SELECT f1 AS five FROM FLOAT8_TBL +UNION +SELECT f1 FROM FLOAT8_TBL +ORDER BY 1; + +SELECT f1 AS ten FROM FLOAT8_TBL +UNION ALL +SELECT f1 FROM FLOAT8_TBL; + +SELECT f1 AS nine FROM FLOAT8_TBL +UNION +SELECT f1 FROM INT4_TBL +ORDER BY 1; + +SELECT f1 AS ten FROM FLOAT8_TBL +UNION ALL +SELECT f1 FROM INT4_TBL; + +SELECT f1 AS five FROM FLOAT8_TBL + WHERE f1 BETWEEN -1e6 AND 1e6 +UNION +SELECT f1 FROM INT4_TBL + WHERE f1 BETWEEN 0 AND 1000000 +ORDER BY 1; + +SELECT CAST(f1 AS char(4)) AS three FROM VARCHAR_TBL +UNION +SELECT f1 FROM CHAR_TBL +ORDER BY 1; + +SELECT f1 AS three FROM VARCHAR_TBL +UNION +SELECT CAST(f1 AS varchar) FROM CHAR_TBL +ORDER BY 1; + +SELECT f1 AS eight FROM VARCHAR_TBL +UNION ALL +SELECT f1 FROM CHAR_TBL; + +SELECT f1 AS five FROM TEXT_TBL +UNION +SELECT f1 FROM VARCHAR_TBL +UNION +SELECT TRIM(TRAILING FROM f1) FROM CHAR_TBL +ORDER BY 1; + +-- +-- INTERSECT and EXCEPT +-- + +SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl ORDER BY 1; + +SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl ORDER BY 1; + +SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; + +SELECT q2 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl ORDER BY 1; + +SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl ORDER BY 1; + +SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY 1; + +SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl ORDER BY 1; + +SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl ORDER BY 1; + +SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE; + +-- nested cases +(SELECT 1,2,3 UNION SELECT 4,5,6) INTERSECT SELECT 4,5,6; +(SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) INTERSECT SELECT 4,5,6; +(SELECT 1,2,3 UNION SELECT 4,5,6) EXCEPT SELECT 4,5,6; +(SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) EXCEPT SELECT 4,5,6; + +-- exercise both hashed and sorted implementations of UNION/INTERSECT/EXCEPT + +set enable_hashagg to on; + +explain (costs off) +select count(*) from + ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; +select count(*) from + ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; + +explain (costs off) +select count(*) from + ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; +select count(*) from + ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; + +explain (costs off) +select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; +select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; + +set enable_hashagg to off; + +explain (costs off) +select count(*) from + ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; +select count(*) from + ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; + +explain (costs off) +select count(*) from + ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; +select count(*) from + ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; + +explain (costs off) +select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; +select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; + +reset enable_hashagg; + +-- non-hashable type +set enable_hashagg to on; + +explain (costs off) +select x from (values (100::money), (200::money)) _(x) union select x from (values (100::money), (300::money)) _(x); + +set enable_hashagg to off; + +explain (costs off) +select x from (values (100::money), (200::money)) _(x) union select x from (values (100::money), (300::money)) _(x); + +reset enable_hashagg; + +-- arrays +set enable_hashagg to on; + +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) union select x from (values (array[1, 2]), (array[1, 4])) _(x); +select x from (values (array[1, 2]), (array[1, 3])) _(x) union select x from (values (array[1, 2]), (array[1, 4])) _(x); +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); +select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); +select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); + +-- non-hashable type +explain (costs off) +select x from (values (array[100::money]), (array[200::money])) _(x) union select x from (values (array[100::money]), (array[300::money])) _(x); +select x from (values (array[100::money]), (array[200::money])) _(x) union select x from (values (array[100::money]), (array[300::money])) _(x); + +set enable_hashagg to off; + +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) union select x from (values (array[1, 2]), (array[1, 4])) _(x); +select x from (values (array[1, 2]), (array[1, 3])) _(x) union select x from (values (array[1, 2]), (array[1, 4])) _(x); +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); +select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); +explain (costs off) +select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); +select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); + +reset enable_hashagg; + +-- records +set enable_hashagg to on; + +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) union select x from (values (row(1, 2)), (row(1, 4))) _(x); +select x from (values (row(1, 2)), (row(1, 3))) _(x) union select x from (values (row(1, 2)), (row(1, 4))) _(x); +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) intersect select x from (values (row(1, 2)), (row(1, 4))) _(x); +select x from (values (row(1, 2)), (row(1, 3))) _(x) intersect select x from (values (row(1, 2)), (row(1, 4))) _(x); +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); +select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); + +-- non-hashable type + +-- With an anonymous row type, the typcache does not report that the +-- type is hashable. (Otherwise, this would fail at execution time.) +explain (costs off) +select x from (values (row(100::money)), (row(200::money))) _(x) union select x from (values (row(100::money)), (row(300::money))) _(x); +select x from (values (row(100::money)), (row(200::money))) _(x) union select x from (values (row(100::money)), (row(300::money))) _(x); + +-- With a defined row type, the typcache can inspect the type's fields +-- for hashability. +create type ct1 as (f1 money); +explain (costs off) +select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union select x from (values (row(100::money)::ct1), (row(300::money)::ct1)) _(x); +select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union select x from (values (row(100::money)::ct1), (row(300::money)::ct1)) _(x); +drop type ct1; + +set enable_hashagg to off; + +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) union select x from (values (row(1, 2)), (row(1, 4))) _(x); +select x from (values (row(1, 2)), (row(1, 3))) _(x) union select x from (values (row(1, 2)), (row(1, 4))) _(x); +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) intersect select x from (values (row(1, 2)), (row(1, 4))) _(x); +select x from (values (row(1, 2)), (row(1, 3))) _(x) intersect select x from (values (row(1, 2)), (row(1, 4))) _(x); +explain (costs off) +select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); +select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); + +reset enable_hashagg; + +-- +-- Mixed types +-- + +SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl ORDER BY 1; + +SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl ORDER BY 1; + +-- +-- Operator precedence and (((((extra))))) parentheses +-- + +SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl ORDER BY 1; + +SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) ORDER BY 1; + +(((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl ORDER BY 1))) UNION ALL SELECT q2 FROM int8_tbl; + +SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; + +SELECT q1 FROM int8_tbl UNION ALL (((SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1))); + +(((SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; + +-- +-- Subqueries with ORDER BY & LIMIT clauses +-- + +-- In this syntax, ORDER BY/LIMIT apply to the result of the EXCEPT +SELECT q1,q2 FROM int8_tbl EXCEPT SELECT q2,q1 FROM int8_tbl +ORDER BY q2,q1; + +-- This should fail, because q2 isn't a name of an EXCEPT output column +SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1; + +-- But this should work: +SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1))) ORDER BY 1; + +-- +-- New syntaxes (7.1) permit new tests +-- + +(((((select * from int8_tbl))))); + +-- +-- Check behavior with empty select list (allowed since 9.4) +-- + +select union select; +select intersect select; +select except select; + +-- check hashed implementation +set enable_hashagg = true; +set enable_sort = false; + +explain (costs off) +select from generate_series(1,5) union select from generate_series(1,3); +explain (costs off) +select from generate_series(1,5) intersect select from generate_series(1,3); + +select from generate_series(1,5) union select from generate_series(1,3); +select from generate_series(1,5) union all select from generate_series(1,3); +select from generate_series(1,5) intersect select from generate_series(1,3); +select from generate_series(1,5) intersect all select from generate_series(1,3); +select from generate_series(1,5) except select from generate_series(1,3); +select from generate_series(1,5) except all select from generate_series(1,3); + +-- check sorted implementation +set enable_hashagg = false; +set enable_sort = true; + +explain (costs off) +select from generate_series(1,5) union select from generate_series(1,3); +explain (costs off) +select from generate_series(1,5) intersect select from generate_series(1,3); + +select from generate_series(1,5) union select from generate_series(1,3); +select from generate_series(1,5) union all select from generate_series(1,3); +select from generate_series(1,5) intersect select from generate_series(1,3); +select from generate_series(1,5) intersect all select from generate_series(1,3); +select from generate_series(1,5) except select from generate_series(1,3); +select from generate_series(1,5) except all select from generate_series(1,3); + +reset enable_hashagg; +reset enable_sort; + +-- +-- Check handling of a case with unknown constants. We don't guarantee +-- an undecorated constant will work in all cases, but historically this +-- usage has worked, so test we don't break it. +-- + +SELECT a.f1 FROM (SELECT 'test' AS f1 FROM varchar_tbl) a +UNION +SELECT b.f1 FROM (SELECT f1 FROM varchar_tbl) b +ORDER BY 1; + +-- This should fail, but it should produce an error cursor +SELECT '3.4'::numeric UNION SELECT 'foo'; + +-- +-- Test that expression-index constraints can be pushed down through +-- UNION or UNION ALL +-- + +CREATE TEMP TABLE t1 (a text, b text); +CREATE INDEX t1_ab_idx on t1 ((a || b)); +CREATE TEMP TABLE t2 (ab text primary key); +INSERT INTO t1 VALUES ('a', 'b'), ('x', 'y'); +INSERT INTO t2 VALUES ('ab'), ('xy'); + +set enable_seqscan = off; +set enable_indexscan = on; +set enable_bitmapscan = off; + +explain (costs off) + SELECT * FROM + (SELECT a || b AS ab FROM t1 + UNION ALL + SELECT * FROM t2) t + WHERE ab = 'ab'; + +explain (costs off) + SELECT * FROM + (SELECT a || b AS ab FROM t1 + UNION + SELECT * FROM t2) t + WHERE ab = 'ab'; + +-- +-- Test that ORDER BY for UNION ALL can be pushed down to inheritance +-- children. +-- + +CREATE TEMP TABLE t1c (b text, a text); +ALTER TABLE t1c INHERIT t1; +CREATE TEMP TABLE t2c (primary key (ab)) INHERITS (t2); +INSERT INTO t1c VALUES ('v', 'w'), ('c', 'd'), ('m', 'n'), ('e', 'f'); +INSERT INTO t2c VALUES ('vw'), ('cd'), ('mn'), ('ef'); +CREATE INDEX t1c_ab_idx on t1c ((a || b)); + +set enable_seqscan = on; +set enable_indexonlyscan = off; + +explain (costs off) + SELECT * FROM + (SELECT a || b AS ab FROM t1 + UNION ALL + SELECT ab FROM t2) t + ORDER BY 1 LIMIT 8; + + SELECT * FROM + (SELECT a || b AS ab FROM t1 + UNION ALL + SELECT ab FROM t2) t + ORDER BY 1 LIMIT 8; + +reset enable_seqscan; +reset enable_indexscan; +reset enable_bitmapscan; + +-- This simpler variant of the above test has been observed to fail differently + +create table events (event_id int primary key); +create table other_events (event_id int primary key); +create table events_child () inherits (events); + +explain (costs off) +select event_id + from (select event_id from events + union all + select event_id from other_events) ss + order by event_id; + +drop table events_child, events, other_events; + +reset enable_indexonlyscan; + +-- Test constraint exclusion of UNION ALL subqueries +explain (costs off) + SELECT * FROM + (SELECT 1 AS t, * FROM tenk1 a + UNION ALL + SELECT 2 AS t, * FROM tenk1 b) c + WHERE t = 2; + +-- Test that we push quals into UNION sub-selects only when it's safe +explain (costs off) +SELECT * FROM + (SELECT 1 AS t, 2 AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x < 4 +ORDER BY x; + +SELECT * FROM + (SELECT 1 AS t, 2 AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x < 4 +ORDER BY x; + +explain (costs off) +SELECT * FROM + (SELECT 1 AS t, generate_series(1,10) AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x < 4 +ORDER BY x; + +SELECT * FROM + (SELECT 1 AS t, generate_series(1,10) AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x < 4 +ORDER BY x; + +explain (costs off) +SELECT * FROM + (SELECT 1 AS t, (random()*3)::int AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x > 3 +ORDER BY x; + +SELECT * FROM + (SELECT 1 AS t, (random()*3)::int AS x + UNION + SELECT 2 AS t, 4 AS x) ss +WHERE x > 3 +ORDER BY x; + +-- Test cases where the native ordering of a sub-select has more pathkeys +-- than the outer query cares about +explain (costs off) +select distinct q1 from + (select distinct * from int8_tbl i81 + union all + select distinct * from int8_tbl i82) ss +where q2 = q2; + +select distinct q1 from + (select distinct * from int8_tbl i81 + union all + select distinct * from int8_tbl i82) ss +where q2 = q2; + +explain (costs off) +select distinct q1 from + (select distinct * from int8_tbl i81 + union all + select distinct * from int8_tbl i82) ss +where -q1 = q2; + +select distinct q1 from + (select distinct * from int8_tbl i81 + union all + select distinct * from int8_tbl i82) ss +where -q1 = q2; + +-- Test proper handling of parameterized appendrel paths when the +-- potential join qual is expensive +create function expensivefunc(int) returns int +language plpgsql immutable strict cost 10000 +as $$begin return $1; end$$; + +create temp table t3 as select generate_series(-1000,1000) as x; +create index t3i on t3 (expensivefunc(x)); +analyze t3; + +explain (costs off) +select * from + (select * from t3 a union all select * from t3 b) ss + join int4_tbl on f1 = expensivefunc(x); +select * from + (select * from t3 a union all select * from t3 b) ss + join int4_tbl on f1 = expensivefunc(x); + +drop table t3; +drop function expensivefunc(int); + +-- Test handling of appendrel quals that const-simplify into an AND +explain (costs off) +select * from + (select *, 0 as x from int8_tbl a + union all + select *, 1 as x from int8_tbl b) ss +where (x = 0) or (q1 >= q2 and q1 <= q2); +select * from + (select *, 0 as x from int8_tbl a + union all + select *, 1 as x from int8_tbl b) ss +where (x = 0) or (q1 >= q2 and q1 <= q2); diff --git a/src/test/singlenode_regress/sql/union_gp.sql b/src/test/singlenode_regress/sql/union_gp.sql new file mode 100644 index 00000000000..f8bdcfc0fa2 --- /dev/null +++ b/src/test/singlenode_regress/sql/union_gp.sql @@ -0,0 +1,675 @@ +-- Additional GPDB-added tests for UNION + +create temp table t_union1 (a int, b int); +select distinct a, null::integer as c from t_union1 union select a, b from t_union1; +drop table t_union1; + +select null union select distinct null; + +select 1 union select distinct null::integer; + +select 1 a, NULL b, NULL c UNION SELECT 2, 3, NULL UNION SELECT 3, NULL, 4; + +select ARRAY[1, 2, 3] union select distinct null::integer[]; + +select 1 intersect (select 1, 2 union all select 3, 4); +select 1 a, row_number() over (partition by 'a') union all (select 1 a , 2 b); + +-- This should preserve domain types +select pg_typeof(a) from (select 'a'::information_schema.sql_identifier a union all +select 'b'::information_schema.sql_identifier)a; + +(select * from ( + (select '1' as a union select null) + union + (select 1 union select distinct null::integer) + )s) + union + (select * from ( + (select '1' union select null) + union + (select 1 union select distinct null::integer) + )s2); + +-- Yet, we keep behaviors on text-like columns +select pg_typeof(a) from(select 'foo' a union select 'foo'::name)s; +select pg_typeof(a) from(select 1 x, 'foo' a union + select 1, 'foo' union select 1, 'foo'::name)s; +select pg_typeof(a) from(select 1 x, 'foo' a union + (select 1, 'foo' union select 1, 'foo'::name))s; + +CREATE TABLE union_ctas (a, b) AS SELECT 1, 2 UNION SELECT 1, 1 UNION SELECT 1, 1; +SELECT * FROM union_ctas; +DROP TABLE union_ctas; + +-- MPP-21075: push quals below union +CREATE TABLE union_quals1 (a, b) AS SELECT i, i%2 from generate_series(1,10) i; +CREATE TABLE union_quals2 (a, b) AS SELECT i%2, i from generate_series(1,10) i; +SELECT * FROM (SELECT a, b from union_quals1 UNION SELECT b, a from union_quals2) as foo(a,b) where a > b order by a; +SELECT * FROM (SELECT a, max(b) over() from union_quals1 UNION SELECT * from union_quals2) as foo(a,b) where b > 6 order by a,b; + +-- MPP-22266: different combinations of set operations and distinct +select * from ((select 1, 'A' from (select distinct 'B') as foo) union (select 1, 'C')) as bar; +select 1 union (select distinct null::integer union select '10'); +select 1 union (select 2 from (select distinct null::integer union select 1) as x); +select 1 union (select distinct 10 from (select 1, 3.0 union select distinct 2, null::integer) as foo); +select 1 union (select distinct '10' from (select 1, 3.0 union select distinct 2, null::integer) as foo); +select distinct a from (select 'A' union select 'B') as foo(a); +select distinct a from (select distinct 'A' union select 'B') as foo(a); +select distinct a from (select distinct 'A' union select distinct 'B') as foo(a); +select distinct a from (select 'A' from (select distinct 'C' ) as bar union select distinct 'B') as foo(a); +select distinct a from (select distinct 'A' from (select distinct 'C' ) as bar union select distinct 'B') as foo(a); +select distinct a from (select distinct 'A' from (select 'C' from (select distinct 'D') as bar1 ) as bar union select distinct 'B') as foo(a); + +-- Test case where input to one branch of UNION resides on a single segment, and another on the QE. +-- The external table resides on QD, and the LIMIT on the test1 table forces the plan to be focused +-- on a single QE. +-- +CREATE TABLE test1 (id int); +insert into test1 values (1); +CREATE EXTERNAL WEB TABLE test2 (id int) EXECUTE 'echo 2' ON COORDINATOR FORMAT 'csv'; + +(SELECT 'test1' as branch, id FROM test1 LIMIT 1) +union +(SELECT 'test2' as branch, id FROM test2); + +explain (SELECT 'test1' as branch, id FROM test1 LIMIT 1) +union +(SELECT 'test2' as branch, id FROM test2); + +-- +-- Test pulling up distribution key expression, when the different branches +-- of a UNION ALL have different typmods. +-- +create table pullup_distkey_test( + a character varying, + b character varying(30) +); + +insert into pullup_distkey_test values ('foo', 'bar'); + +with base as +( + select a, b from pullup_distkey_test + union all + select 'xx' as a, 'bar' as b +) +select a from base +union all +select a from base where a = 'foo'; + +-- +-- Test union all two replicated tables with different numsegments +-- +create table rep2(c1 int, c2 int); +create table rep3(c1 int, c2 int); +set allow_system_table_mods = on; +update gp_distribution_policy set numsegments = 2 + where localoid = 'rep2'::regclass; +-- start_ignore +select localoid::regclass, policytype, numsegments + from gp_distribution_policy + where localoid::regclass in ('rep2', 'rep3'); +-- end_ignore +explain select * from rep2 union all select * from rep3; +select * from rep2 union all select * from rep3; +reset allow_system_table_mods; +drop table rep2; +drop table rep3; + + +-- +-- Setup +-- + +--start_ignore +DROP TABLE IF EXISTS T_a1 CASCADE; +DROP TABLE IF EXISTS T_b2 CASCADE; +DROP TABLE IF EXISTS T_random CASCADE; +--end_ignore + +CREATE TABLE T_a1 (a1 int, a2 int); +INSERT INTO T_a1 SELECT i, i%5 from generate_series(1,10) i; + +CREATE TABLE T_b2 (b1 int, b2 int); +INSERT INTO T_b2 SELECT i, i%5 from generate_series(1,20) i; + +CREATE TABLE T_random (c1 int, c2 int); +INSERT INTO T_random SELECT i, i%5 from generate_series(1,30) i; + +--start_ignore +create language plpython3u; +--end_ignore + +create or replace function count_operator(query text, operator text) returns int as +$$ +rv = plpy.execute('EXPLAIN ' + query) +search_text = operator +result = 0 +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + result = result+1 +return result +$$ +language plpython3u; + +-- +-- N-ary UNION ALL results +-- + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +UNION ALL +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select b1 from T_b2) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select c1 from T_random) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +UNION ALL +(select d1 from T_constant) +order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) +UNION ALL +(select c1 from T_random) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +order by 1; + +-- +-- N-ary UNION ALL explain +-- + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +UNION ALL +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select b1 from T_b2) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select c1 from T_random) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +UNION ALL +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) +UNION ALL +(select c1 from T_random) +UNION ALL +(select a1 from T_a1) +UNION ALL +(select b1 from T_b2) +order by 1;' +, 'APPEND'); + +-- +-- N-ary UNION results +-- + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select a1 from T_a1) +UNION +(select b1 from T_b2) +UNION +(select c1 from T_random) +UNION +(select d1 from T_constant) +order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select b1 from T_b2) +UNION +(select a1 from T_a1) +UNION +(select c1 from T_random) +UNION ALL +(select d1 from T_constant) +order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select c1 from T_random) +UNION +(select a1 from T_a1) +UNION +(select b1 from T_b2) +UNION ALL +(select d1 from T_constant) +order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) +UNION ALL +(select c1 from T_random) +UNION +(select a1 from T_a1) +UNION +(select b1 from T_b2) +order by 1; + +-- +-- N-ary UNION explain +-- + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select a1 from T_a1) +UNION +(select b1 from T_b2) +UNION +(select c1 from T_random) +UNION +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select b1 from T_b2) +UNION +(select a1 from T_a1) +UNION +(select c1 from T_random) +UNION +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select c1 from T_random) +UNION +(select a1 from T_a1) +UNION +(select b1 from T_b2) +UNION +(select d1 from T_constant) +order by 1;' +, 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) +UNION +(select c1 from T_random) +UNION +(select a1 from T_a1) +UNION +(select b1 from T_b2) +order by 1;' +, 'APPEND'); + +-- +-- Binary UNION ALL results +-- + +(select a1 from T_a1) UNION ALL (select b1 from T_b2) order by 1; + +(select b1 from T_b2) UNION ALL (select a1 from T_a1) order by 1; + +(select a1 from T_a1) UNION ALL (select c1 from T_random) order by 1; + +(select c1 from T_random) UNION ALL (select a1 from T_a1) order by 1; + +(select * from T_a1) UNION ALL (select * from T_b2) order by 1; + +(select * from T_a1) UNION ALL (select * from T_random) order by 1; + +(select * from T_b2) UNION ALL (select * from T_random) order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select a1 from T_a1) UNION ALL (select d1 from T_constant) order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) UNION ALL (select a1 from T_a1) order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select c1 from T_random) UNION ALL (select d1 from T_constant) order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) UNION ALL (select c1 from T_random) order by 1; + +-- +-- Binary UNION ALL explain +-- + +select count_operator('(select a1 from T_a1) UNION ALL (select b1 from T_b2) order by 1;', 'APPEND'); + +select count_operator('(select b1 from T_b2) UNION ALL (select a1 from T_a1) order by 1;', 'APPEND'); + +select count_operator('(select a1 from T_a1) UNION ALL (select c1 from T_random) order by 1;', 'APPEND'); + +select count_operator('(select c1 from T_random) UNION ALL (select a1 from T_a1) order by 1;', 'APPEND'); + +select count_operator('(select * from T_a1) UNION ALL (select * from T_b2) order by 1;', 'APPEND'); + +select count_operator('(select * from T_a1) UNION ALL (select * from T_random) order by 1;', 'APPEND'); + +select count_operator('(select * from T_b2) UNION ALL (select * from T_random) order by 1;', 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select a1 from T_a1) UNION ALL (select d1 from T_constant) order by 1;', 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) UNION ALL (select a1 from T_a1) order by 1;', 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select c1 from T_random) UNION ALL (select d1 from T_constant) order by 1;', 'APPEND'); + +select count_operator('with T_constant (d1, d2) as( +SELECT 100, 100 +UNION ALL SELECT 200, 200 +UNION ALL SELECT 300, 300) +(select d1 from T_constant) UNION ALL (select c1 from T_random) order by 1;', 'APPEND'); + +-- +-- Binary UNION results +-- + +(select a1 from T_a1) UNION (select b1 from T_b2) order by 1; + +(select b1 from T_b2) UNION (select a1 from T_a1) order by 1; + +(select a1 from T_a1) UNION (select c1 from T_random) order by 1; + +(select c1 from T_random) UNION (select a1 from T_a1) order by 1; + +(select * from T_a1) UNION (select * from T_b2) order by 1; + +(select * from T_a1) UNION (select * from T_random) order by 1; + +(select * from T_b2) UNION (select * from T_random) order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select a1 from T_a1) UNION (select d1 from T_constant) order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) UNION (select a1 from T_a1) order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select c1 from T_random) UNION (select d1 from T_constant) order by 1; + +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) UNION (select c1 from T_random) order by 1; + +-- +-- Binary UNION explain +-- + +select count_operator('(select a1 from T_a1) UNION (select b1 from T_b2) order by 1;', 'APPEND'); + +select count_operator('(select b1 from T_b2) UNION (select a1 from T_a1) order by 1;', 'APPEND'); + +select count_operator('(select a1 from T_a1) UNION (select c1 from T_random) order by 1;', 'APPEND'); + +select count_operator('(select c1 from T_random) UNION (select a1 from T_a1) order by 1;', 'APPEND'); + +select count_operator('(select * from T_a1) UNION (select * from T_b2) order by 1;', 'APPEND'); + +select count_operator('(select * from T_a1) UNION (select * from T_random) order by 1;', 'APPEND'); + +select count_operator('(select * from T_b2) UNION (select * from T_random) order by 1;', 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select a1 from T_a1) UNION (select d1 from T_constant) order by 1;', 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) UNION (select a1 from T_a1) order by 1;', 'APPEND'); + +select count_operator(' +with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select c1 from T_random) UNION (select d1 from T_constant) order by 1;', 'APPEND'); + +select count_operator('with T_constant (d1, d2) as( +SELECT 100, 100 +UNION SELECT 200, 200 +UNION SELECT 300, 300) +(select d1 from T_constant) UNION (select c1 from T_random) order by 1;', 'APPEND'); + +CREATE TABLE t1_setop(a int); +CREATE TABLE t2_setop(a int); +INSERT INTO t1_setop VALUES (1), (2), (3); +INSERT INTO t2_setop VALUES (3), (4), (5); +(SELECT a FROM t1_setop EXCEPT SELECT a FROM t2_setop ORDER BY a) +UNION +(SELECT a FROM t2_setop EXCEPT SELECT a FROM t1_setop ORDER BY a) +ORDER BY a; + +create table t1_ncols(a int, b int, c text, d date); +create table t2_ncols(a smallint, b bigint, c varchar(20), d date) + partition by range (a) (start (0) end (8) every (4)); +create view v1_ncols(id, a, b, c, d) as select 1,* from t1_ncols union all select 2,* from t2_ncols; + +insert into t1_ncols values (1, 11, 'one', '2001-01-01'); + +insert into t2_ncols values (2, 22, 'two', '2002-02-02'); +insert into t2_ncols values (4, 44, 'four','2004-04-04'); + +select b from t1_ncols union all select a from t2_ncols; +select a+100, b, d from t1_ncols union select b, a+200, d from t2_ncols order by 1; +select c, a from v1_ncols; + +with cte1(aa, b, c, d) as (select a*100, b, c, d from t1_ncols union select * from t2_ncols) +select x.aa/100 aaa, x.c, y.c from cte1 x join cte1 y on x.aa=y.aa; + +select from t2_ncols union select * from t2_ncols; + +-- Test the result of union of 2 tables distributed on different number of segments +-- start_ignore +drop schema if exists union_schema CASCADE; +-- end_ignore +create schema union_schema; +create table union_schema.t1(a int, b int); +create table union_schema.t2(a int, b int); +create table union_schema.t3(a int, b int); + +set allow_system_table_mods = on; +update gp_distribution_policy set numsegments = 1 + where localoid = 'union_schema.t1'::regclass::oid; +update gp_distribution_policy set numsegments = 2 + where localoid = 'union_schema.t2'::regclass::oid; +-- start_ignore +select relname, policytype, numsegments, distkey + from pg_class, gp_distribution_policy, pg_namespace ns + where pg_class.oid = localoid and relnamespace = ns.oid + and nspname = 'union_schema' + and relname in ('t1', 't2', 't3') + order by relname; +-- end_ignore +insert into union_schema.t1 select i, i from generate_series(1,10)i; +insert into union_schema.t2 select i, i from generate_series(1,20)i; +analyze union_schema.t1; +analyze union_schema.t2; + +explain select * from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b; +explain select union_schema.t1.a, union_schema.t2.b + from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b + union all + select * from union_schema.t3; + +select * from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b; +select union_schema.t1.a, union_schema.t2.b + from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b +union all +select * from union_schema.t3; + +truncate union_schema.t1, union_schema.t2; +insert into union_schema.t1 select i, i from generate_series(1,20)i; +insert into union_schema.t2 select i, i from generate_series(1,10)i; +analyze union_schema.t1; +analyze union_schema.t2; + +explain select * from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b; +explain select union_schema.t1.a, union_schema.t2.b + from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b + union all + select * from union_schema.t3; + +select * from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b; +select union_schema.t1.a, union_schema.t2.b + from union_schema.t1 join union_schema.t2 + on union_schema.t1.a = union_schema.t2.b +union all +select * from union_schema.t3; + +reset allow_system_table_mods; +-- +-- Clean up +-- + +DROP TABLE IF EXISTS T_a1 CASCADE; +DROP TABLE IF EXISTS T_b2 CASCADE; +DROP TABLE IF EXISTS T_random CASCADE; +DROP VIEW IF EXISTS v1_ncols CASCADE; +DROP TABLE IF EXISTS t1_ncols CASCADE; +DROP TABLE IF EXISTS t2_ncols CASCADE; +DROP SCHEMA IF EXISTS union_schema CASCADE; diff --git a/src/test/singlenode_regress/sql/updatable_views.sql b/src/test/singlenode_regress/sql/updatable_views.sql new file mode 100644 index 00000000000..f3e63674720 --- /dev/null +++ b/src/test/singlenode_regress/sql/updatable_views.sql @@ -0,0 +1,1591 @@ +-- +-- UPDATABLE VIEWS +-- + +-- avoid bit-exact output here because operations may not be bit-exact. +SET extra_float_digits = 0; + +-- GPDB: to get similar plans as upstream. +set enable_mergejoin=on; +set enable_nestloop=on; + +-- check that non-updatable views and columns are rejected with useful error +-- messages + +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; + +CREATE VIEW ro_view1 AS SELECT DISTINCT a, b FROM base_tbl; -- DISTINCT not supported +CREATE VIEW ro_view2 AS SELECT a, b FROM base_tbl GROUP BY a, b; -- GROUP BY not supported +CREATE VIEW ro_view3 AS SELECT 1 FROM base_tbl HAVING max(a) > 0; -- HAVING not supported +CREATE VIEW ro_view4 AS SELECT count(*) FROM base_tbl; -- Aggregate functions not supported +CREATE VIEW ro_view5 AS SELECT a, rank() OVER() FROM base_tbl; -- Window functions not supported +CREATE VIEW ro_view6 AS SELECT a, b FROM base_tbl UNION SELECT -a, b FROM base_tbl; -- Set ops not supported +CREATE VIEW ro_view7 AS WITH t AS (SELECT a, b FROM base_tbl) SELECT * FROM t; -- WITH not supported +CREATE VIEW ro_view8 AS SELECT a, b FROM base_tbl ORDER BY a OFFSET 1; -- OFFSET not supported +CREATE VIEW ro_view9 AS SELECT a, b FROM base_tbl ORDER BY a LIMIT 1; -- LIMIT not supported +CREATE VIEW ro_view10 AS SELECT 1 AS a; -- No base relations +CREATE VIEW ro_view11 AS SELECT b1.a, b2.b FROM base_tbl b1, base_tbl b2; -- Multiple base relations +CREATE VIEW ro_view12 AS SELECT * FROM generate_series(1, 10) AS g(a); -- SRF in rangetable +CREATE VIEW ro_view13 AS SELECT a, b FROM (SELECT * FROM base_tbl) AS t; -- Subselect in rangetable +CREATE VIEW rw_view14 AS SELECT ctid, a, b FROM base_tbl; -- System columns may be part of an updatable view +CREATE VIEW rw_view15 AS SELECT a, upper(b) FROM base_tbl; -- Expression/function may be part of an updatable view +CREATE VIEW rw_view16 AS SELECT a, b, a AS aa FROM base_tbl; -- Repeated column may be part of an updatable view +CREATE VIEW ro_view17 AS SELECT * FROM ro_view1; -- Base relation not updatable +CREATE VIEW ro_view18 AS SELECT * FROM (VALUES(1)) AS tmp(a); -- VALUES in rangetable +CREATE SEQUENCE uv_seq CACHE 1; +CREATE VIEW ro_view19 AS SELECT * FROM uv_seq; -- View based on a sequence +CREATE VIEW ro_view20 AS SELECT a, b, generate_series(1, a) g FROM base_tbl; -- SRF in targetlist not supported + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name, ordinal_position; + +-- Read-only views +DELETE FROM ro_view1; +DELETE FROM ro_view2; +DELETE FROM ro_view3; +DELETE FROM ro_view4; +DELETE FROM ro_view5; +DELETE FROM ro_view6; +UPDATE ro_view7 SET a=a+1; +UPDATE ro_view8 SET a=a+1; +UPDATE ro_view9 SET a=a+1; +UPDATE ro_view10 SET a=a+1; +UPDATE ro_view11 SET a=a+1; +UPDATE ro_view12 SET a=a+1; +INSERT INTO ro_view13 VALUES (3, 'Row 3'); +-- Partially updatable view +INSERT INTO rw_view14 VALUES (null, 3, 'Row 3'); -- should fail +INSERT INTO rw_view14 (a, b) VALUES (3, 'Row 3'); -- should be OK +UPDATE rw_view14 SET ctid=null WHERE a=3; -- should fail +UPDATE rw_view14 SET b='ROW 3' WHERE a=3; -- should be OK +SELECT * FROM base_tbl; +DELETE FROM rw_view14 WHERE a=3; -- should be OK +-- Partially updatable view +INSERT INTO rw_view15 VALUES (3, 'ROW 3'); -- should fail +INSERT INTO rw_view15 (a) VALUES (3); -- should be OK +INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT DO NOTHING; -- succeeds +SELECT * FROM rw_view15; +INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT (a) DO NOTHING; -- succeeds +SELECT * FROM rw_view15; +INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT (a) DO UPDATE set a = excluded.a; -- succeeds +SELECT * FROM rw_view15; +INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT (a) DO UPDATE set upper = 'blarg'; -- fails +SELECT * FROM rw_view15; +SELECT * FROM rw_view15; +ALTER VIEW rw_view15 ALTER COLUMN upper SET DEFAULT 'NOT SET'; +INSERT INTO rw_view15 (a) VALUES (4); -- should fail +UPDATE rw_view15 SET upper='ROW 3' WHERE a=3; -- should fail +UPDATE rw_view15 SET upper=DEFAULT WHERE a=3; -- should fail +UPDATE rw_view15 SET a=4 WHERE a=3; -- should be OK +SELECT * FROM base_tbl; +DELETE FROM rw_view15 WHERE a=4; -- should be OK +-- Partially updatable view +INSERT INTO rw_view16 VALUES (3, 'Row 3', 3); -- should fail +INSERT INTO rw_view16 (a, b) VALUES (3, 'Row 3'); -- should be OK +UPDATE rw_view16 SET a=3, aa=-3 WHERE a=3; -- should fail +UPDATE rw_view16 SET aa=-3 WHERE a=3; -- should be OK +SELECT * FROM base_tbl; +DELETE FROM rw_view16 WHERE a=-3; -- should be OK +-- Read-only views +INSERT INTO ro_view17 VALUES (3, 'ROW 3'); +DELETE FROM ro_view18; +UPDATE ro_view19 SET last_value=1000; +UPDATE ro_view20 SET b=upper(b); + +-- A view with a conditional INSTEAD rule but no unconditional INSTEAD rules +-- or INSTEAD OF triggers should be non-updatable and generate useful error +-- messages with appropriate detail +CREATE RULE rw_view16_ins_rule AS ON INSERT TO rw_view16 + WHERE NEW.a > 0 DO INSTEAD INSERT INTO base_tbl VALUES (NEW.a, NEW.b); +CREATE RULE rw_view16_upd_rule AS ON UPDATE TO rw_view16 + WHERE OLD.a > 0 DO INSTEAD UPDATE base_tbl SET b=NEW.b WHERE a=OLD.a; +CREATE RULE rw_view16_del_rule AS ON DELETE TO rw_view16 + WHERE OLD.a > 0 DO INSTEAD DELETE FROM base_tbl WHERE a=OLD.a; + +INSERT INTO rw_view16 (a, b) VALUES (3, 'Row 3'); -- should fail +UPDATE rw_view16 SET b='ROW 2' WHERE a=2; -- should fail +DELETE FROM rw_view16 WHERE a=2; -- should fail + +DROP TABLE base_tbl CASCADE; +DROP VIEW ro_view10, ro_view12, ro_view18; +DROP SEQUENCE uv_seq CASCADE; + +-- simple updatable view + +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a>0; + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name = 'rw_view1'; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name = 'rw_view1'; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name = 'rw_view1' + ORDER BY ordinal_position; + +INSERT INTO rw_view1 VALUES (3, 'Row 3'); +INSERT INTO rw_view1 (a) VALUES (4); +UPDATE rw_view1 SET a=5 WHERE a=4; +DELETE FROM rw_view1 WHERE b='Row 2'; +SELECT * FROM base_tbl; + +EXPLAIN (costs off) UPDATE rw_view1 SET a=6 WHERE a=5; +EXPLAIN (costs off) DELETE FROM rw_view1 WHERE a=5; + +DROP TABLE base_tbl CASCADE; + +-- view on top of view + +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; + +CREATE VIEW rw_view1 AS SELECT b AS bb, a AS aa FROM base_tbl WHERE a>0; +CREATE VIEW rw_view2 AS SELECT aa AS aaa, bb AS bbb FROM rw_view1 WHERE aa<10; + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name = 'rw_view2'; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name = 'rw_view2'; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name = 'rw_view2' + ORDER BY ordinal_position; + +INSERT INTO rw_view2 VALUES (3, 'Row 3'); +INSERT INTO rw_view2 (aaa) VALUES (4); +SELECT * FROM rw_view2; +UPDATE rw_view2 SET bbb='Row 4' WHERE aaa=4; +DELETE FROM rw_view2 WHERE aaa=2; +SELECT * FROM rw_view2; + +EXPLAIN (costs off) UPDATE rw_view2 SET aaa=5 WHERE aaa=4; +EXPLAIN (costs off) DELETE FROM rw_view2 WHERE aaa=4; + +DROP TABLE base_tbl CASCADE; + +-- view on top of view with rules + +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a>0 OFFSET 0; -- not updatable without rules/triggers +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a<10; + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + +CREATE RULE rw_view1_ins_rule AS ON INSERT TO rw_view1 + DO INSTEAD INSERT INTO base_tbl VALUES (NEW.a, NEW.b) RETURNING *; + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + +CREATE RULE rw_view1_upd_rule AS ON UPDATE TO rw_view1 + DO INSTEAD UPDATE base_tbl SET b=NEW.b WHERE a=OLD.a RETURNING NEW.*; + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + +CREATE RULE rw_view1_del_rule AS ON DELETE TO rw_view1 + DO INSTEAD DELETE FROM base_tbl WHERE a=OLD.a RETURNING OLD.*; + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + +INSERT INTO rw_view2 VALUES (3, 'Row 3') RETURNING *; +UPDATE rw_view2 SET b='Row three' WHERE a=3 RETURNING *; +SELECT * FROM rw_view2; +DELETE FROM rw_view2 WHERE a=3 RETURNING *; +SELECT * FROM rw_view2; + +EXPLAIN (costs off) UPDATE rw_view2 SET a=3 WHERE a=2; +EXPLAIN (costs off) DELETE FROM rw_view2 WHERE a=2; + +DROP TABLE base_tbl CASCADE; + +-- view on top of view with triggers + +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a>0 OFFSET 0; -- not updatable without rules/triggers +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a<10; + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into, + is_trigger_updatable, is_trigger_deletable, + is_trigger_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + +CREATE FUNCTION rw_view1_trig_fn() +RETURNS trigger AS +$$ +BEGIN + IF TG_OP = 'INSERT' THEN + INSERT INTO base_tbl VALUES (NEW.a, NEW.b); + RETURN NEW; + ELSIF TG_OP = 'UPDATE' THEN + UPDATE base_tbl SET b=NEW.b WHERE a=OLD.a; + RETURN NEW; + ELSIF TG_OP = 'DELETE' THEN + DELETE FROM base_tbl WHERE a=OLD.a; + RETURN OLD; + END IF; +END; +$$ +LANGUAGE plpgsql; + +CREATE TRIGGER rw_view1_ins_trig INSTEAD OF INSERT ON rw_view1 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into, + is_trigger_updatable, is_trigger_deletable, + is_trigger_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + +CREATE TRIGGER rw_view1_upd_trig INSTEAD OF UPDATE ON rw_view1 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into, + is_trigger_updatable, is_trigger_deletable, + is_trigger_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + +CREATE TRIGGER rw_view1_del_trig INSTEAD OF DELETE ON rw_view1 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into, + is_trigger_updatable, is_trigger_deletable, + is_trigger_insertable_into + FROM information_schema.views + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE 'rw_view%' + ORDER BY table_name, ordinal_position; + +INSERT INTO rw_view2 VALUES (3, 'Row 3') RETURNING *; +UPDATE rw_view2 SET b='Row three' WHERE a=3 RETURNING *; +SELECT * FROM rw_view2; +DELETE FROM rw_view2 WHERE a=3 RETURNING *; +SELECT * FROM rw_view2; + +EXPLAIN (costs off) UPDATE rw_view2 SET a=3 WHERE a=2; +EXPLAIN (costs off) DELETE FROM rw_view2 WHERE a=2; + +DROP TABLE base_tbl CASCADE; +DROP FUNCTION rw_view1_trig_fn(); + +-- update using whole row from view + +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl SELECT i, 'Row ' || i FROM generate_series(-2, 2) g(i); +ANALYZE base_tbl; + +CREATE VIEW rw_view1 AS SELECT b AS bb, a AS aa FROM base_tbl; + +CREATE FUNCTION rw_view1_aa(x rw_view1) + RETURNS int AS $$ SELECT x.aa $$ LANGUAGE sql; + +UPDATE rw_view1 v SET bb='Updated row 2' WHERE rw_view1_aa(v)=2 + RETURNING rw_view1_aa(v), v.bb; +SELECT * FROM base_tbl; + +EXPLAIN (costs off) +UPDATE rw_view1 v SET bb='Updated row 2' WHERE rw_view1_aa(v)=2 + RETURNING rw_view1_aa(v), v.bb; + +DROP TABLE base_tbl CASCADE; + +-- permissions checks + +CREATE USER regress_view_user1; +CREATE USER regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user1; +CREATE TABLE base_tbl(a int, b text, c float); +INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); +CREATE VIEW rw_view1 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; +INSERT INTO rw_view1 VALUES ('Row 2', 2.0, 2); + +GRANT SELECT ON base_tbl TO regress_view_user2; +GRANT SELECT ON rw_view1 TO regress_view_user2; +GRANT UPDATE (a,c) ON base_tbl TO regress_view_user2; +GRANT UPDATE (bb,cc) ON rw_view1 TO regress_view_user2; +RESET SESSION AUTHORIZATION; + +SET SESSION AUTHORIZATION regress_view_user2; +CREATE VIEW rw_view2 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; +SELECT * FROM base_tbl; -- ok +SELECT * FROM rw_view1; -- ok +SELECT * FROM rw_view2; -- ok + +INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- not allowed +INSERT INTO rw_view1 VALUES ('Row 3', 3.0, 3); -- not allowed +INSERT INTO rw_view2 VALUES ('Row 3', 3.0, 3); -- not allowed + +UPDATE base_tbl SET a=a, c=c; -- ok +UPDATE base_tbl SET b=b; -- not allowed +UPDATE rw_view1 SET bb=bb, cc=cc; -- ok +UPDATE rw_view1 SET aa=aa; -- not allowed +UPDATE rw_view2 SET aa=aa, cc=cc; -- ok +UPDATE rw_view2 SET bb=bb; -- not allowed + +DELETE FROM base_tbl; -- not allowed +DELETE FROM rw_view1; -- not allowed +DELETE FROM rw_view2; -- not allowed +RESET SESSION AUTHORIZATION; + +SET SESSION AUTHORIZATION regress_view_user1; +GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; +RESET SESSION AUTHORIZATION; + +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- ok +INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed +INSERT INTO rw_view2 VALUES ('Row 4', 4.0, 4); -- ok +DELETE FROM base_tbl WHERE a=1; -- ok +DELETE FROM rw_view1 WHERE aa=2; -- not allowed +DELETE FROM rw_view2 WHERE aa=2; -- ok +SELECT * FROM base_tbl; +RESET SESSION AUTHORIZATION; + +SET SESSION AUTHORIZATION regress_view_user1; +REVOKE INSERT, DELETE ON base_tbl FROM regress_view_user2; +GRANT INSERT, DELETE ON rw_view1 TO regress_view_user2; +RESET SESSION AUTHORIZATION; + +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO base_tbl VALUES (5, 'Row 5', 5.0); -- not allowed +INSERT INTO rw_view1 VALUES ('Row 5', 5.0, 5); -- ok +INSERT INTO rw_view2 VALUES ('Row 6', 6.0, 6); -- not allowed +DELETE FROM base_tbl WHERE a=3; -- not allowed +DELETE FROM rw_view1 WHERE aa=3; -- ok +DELETE FROM rw_view2 WHERE aa=4; -- not allowed +SELECT * FROM base_tbl; +RESET SESSION AUTHORIZATION; + +DROP TABLE base_tbl CASCADE; + +-- nested-view permissions + +CREATE TABLE base_tbl(a int, b text, c float); +INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); + +SET SESSION AUTHORIZATION regress_view_user1; +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl; +SELECT * FROM rw_view1; -- not allowed +SELECT * FROM rw_view1 FOR UPDATE; -- not allowed +UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user2; +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1; +SELECT * FROM rw_view2; -- not allowed +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed + +RESET SESSION AUTHORIZATION; +GRANT SELECT ON base_tbl TO regress_view_user1; + +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; +SELECT * FROM rw_view1 FOR UPDATE; -- not allowed +UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- not allowed +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user1; +GRANT SELECT ON rw_view1 TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed + +RESET SESSION AUTHORIZATION; +GRANT UPDATE ON base_tbl TO regress_view_user1; + +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; +SELECT * FROM rw_view1 FOR UPDATE; +UPDATE rw_view1 SET b = 'foo' WHERE a = 1; + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user1; +GRANT UPDATE ON rw_view1 TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; +SELECT * FROM rw_view2 FOR UPDATE; +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; + +RESET SESSION AUTHORIZATION; +REVOKE UPDATE ON base_tbl FROM regress_view_user1; + +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; +SELECT * FROM rw_view1 FOR UPDATE; -- not allowed +UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; +SELECT * FROM rw_view2 FOR UPDATE; -- not allowed +UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed + +RESET SESSION AUTHORIZATION; + +DROP TABLE base_tbl CASCADE; + +DROP USER regress_view_user1; +DROP USER regress_view_user2; + +-- column defaults + +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified', c serial); +INSERT INTO base_tbl VALUES (1, 'Row 1'); +INSERT INTO base_tbl VALUES (2, 'Row 2'); +INSERT INTO base_tbl VALUES (3); + +CREATE VIEW rw_view1 AS SELECT a AS aa, b AS bb FROM base_tbl; +ALTER VIEW rw_view1 ALTER COLUMN bb SET DEFAULT 'View default'; + +INSERT INTO rw_view1 VALUES (4, 'Row 4'); +INSERT INTO rw_view1 (aa) VALUES (5); + +SELECT * FROM base_tbl; + +DROP TABLE base_tbl CASCADE; + +-- Table having triggers + +CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified'); +INSERT INTO base_tbl VALUES (1, 'Row 1'); +INSERT INTO base_tbl VALUES (2, 'Row 2'); + +CREATE FUNCTION rw_view1_trig_fn() +RETURNS trigger AS +$$ +BEGIN + IF TG_OP = 'INSERT' THEN + UPDATE base_tbl SET b=NEW.b WHERE a=1; + RETURN NULL; + END IF; + RETURN NULL; +END; +$$ +LANGUAGE plpgsql; + +CREATE TRIGGER rw_view1_ins_trig AFTER INSERT ON base_tbl + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); + +CREATE VIEW rw_view1 AS SELECT a AS aa, b AS bb FROM base_tbl; + +INSERT INTO rw_view1 VALUES (3, 'Row 3'); +select * from base_tbl; + +DROP VIEW rw_view1; +DROP TRIGGER rw_view1_ins_trig on base_tbl; +DROP FUNCTION rw_view1_trig_fn(); +DROP TABLE base_tbl; + +-- view with ORDER BY + +CREATE TABLE base_tbl (a int, b int); +INSERT INTO base_tbl VALUES (1,2), (4,5), (3,-3); +ANALYZE base_tbl; + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl ORDER BY a+b; + +SELECT * FROM rw_view1; + +INSERT INTO rw_view1 VALUES (7,-8); +SELECT * FROM rw_view1; + +EXPLAIN (verbose, costs off) UPDATE rw_view1 SET b = b + 1 RETURNING *; +UPDATE rw_view1 SET b = b + 1 RETURNING *; +SELECT * FROM rw_view1; + +DROP TABLE base_tbl CASCADE; + +-- multiple array-column updates + +CREATE TABLE base_tbl (a int, arr int[]); +INSERT INTO base_tbl VALUES (1,ARRAY[2]), (3,ARRAY[4]); + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl; + +UPDATE rw_view1 SET arr[1] = 42, arr[2] = 77 WHERE a = 3; + +SELECT * FROM rw_view1; + +DROP TABLE base_tbl CASCADE; + +-- views with updatable and non-updatable columns + +CREATE TABLE base_tbl(a float); +INSERT INTO base_tbl SELECT i/10.0 FROM generate_series(1,10) g(i); + +CREATE VIEW rw_view1 AS + SELECT ctid, sin(a) s, a, cos(a) c + FROM base_tbl + WHERE a != 0 + ORDER BY abs(a); + +INSERT INTO rw_view1 VALUES (null, null, 1.1, null); -- should fail +INSERT INTO rw_view1 (s, c, a) VALUES (null, null, 1.1); -- should fail +INSERT INTO rw_view1 (a) VALUES (1.1) RETURNING a, s, c; -- OK +UPDATE rw_view1 SET s = s WHERE a = 1.1; -- should fail +UPDATE rw_view1 SET a = 1.05 WHERE a = 1.1 RETURNING s; -- OK +DELETE FROM rw_view1 WHERE a = 1.05; -- OK + +CREATE VIEW rw_view2 AS + SELECT s, c, s/c t, a base_a, ctid + FROM rw_view1; + +INSERT INTO rw_view2 VALUES (null, null, null, 1.1, null); -- should fail +INSERT INTO rw_view2(s, c, base_a) VALUES (null, null, 1.1); -- should fail +INSERT INTO rw_view2(base_a) VALUES (1.1) RETURNING t; -- OK +UPDATE rw_view2 SET s = s WHERE base_a = 1.1; -- should fail +UPDATE rw_view2 SET t = t WHERE base_a = 1.1; -- should fail +UPDATE rw_view2 SET base_a = 1.05 WHERE base_a = 1.1; -- OK +DELETE FROM rw_view2 WHERE base_a = 1.05 RETURNING base_a, s, c, t; -- OK + +CREATE VIEW rw_view3 AS + SELECT s, c, s/c t, ctid + FROM rw_view1; + +INSERT INTO rw_view3 VALUES (null, null, null, null); -- should fail +INSERT INTO rw_view3(s) VALUES (null); -- should fail +UPDATE rw_view3 SET s = s; -- should fail +DELETE FROM rw_view3 WHERE s = sin(0.1); -- should be OK +SELECT * FROM base_tbl ORDER BY a; + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name LIKE E'r_\\_view%' + ORDER BY table_name, ordinal_position; + +SELECT events & 4 != 0 AS upd, + events & 8 != 0 AS ins, + events & 16 != 0 AS del + FROM pg_catalog.pg_relation_is_updatable('rw_view3'::regclass, false) t(events); + +DROP TABLE base_tbl CASCADE; + +-- view on table with GENERATED columns + +CREATE TABLE base_tbl (id int, idplus1 int GENERATED ALWAYS AS (id + 1) STORED); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl; + +INSERT INTO base_tbl (id) VALUES (1); +INSERT INTO rw_view1 (id) VALUES (2); +INSERT INTO base_tbl (id, idplus1) VALUES (3, DEFAULT); +INSERT INTO rw_view1 (id, idplus1) VALUES (4, DEFAULT); +INSERT INTO base_tbl (id, idplus1) VALUES (5, 6); -- error +INSERT INTO rw_view1 (id, idplus1) VALUES (6, 7); -- error + +SELECT * FROM base_tbl; + +UPDATE base_tbl SET id = 2000 WHERE id = 2; +UPDATE rw_view1 SET id = 3000 WHERE id = 3; + +SELECT * FROM base_tbl; + +DROP TABLE base_tbl CASCADE; + +-- inheritance tests + +CREATE TABLE base_tbl_parent (a int); +CREATE TABLE base_tbl_child (CHECK (a > 0)) INHERITS (base_tbl_parent); +INSERT INTO base_tbl_parent SELECT * FROM generate_series(-8, -1); +INSERT INTO base_tbl_child SELECT * FROM generate_series(1, 8); +ANALYZE base_tbl_parent; +ANALYZE base_tbl_child; + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl_parent; +CREATE VIEW rw_view2 AS SELECT * FROM ONLY base_tbl_parent; + +SELECT * FROM rw_view1 ORDER BY a; +SELECT * FROM ONLY rw_view1 ORDER BY a; +SELECT * FROM rw_view2 ORDER BY a; + +INSERT INTO rw_view1 VALUES (-100), (100); +INSERT INTO rw_view2 VALUES (-200), (200); + +UPDATE rw_view1 SET a = a*10 WHERE a IN (-1, 1); -- Should produce -10 and 10 +UPDATE ONLY rw_view1 SET a = a*10 WHERE a IN (-2, 2); -- Should produce -20 and 20 +UPDATE rw_view2 SET a = a*10 WHERE a IN (-3, 3); -- Should produce -30 only +UPDATE ONLY rw_view2 SET a = a*10 WHERE a IN (-4, 4); -- Should produce -40 only + +DELETE FROM rw_view1 WHERE a IN (-5, 5); -- Should delete -5 and 5 +DELETE FROM ONLY rw_view1 WHERE a IN (-6, 6); -- Should delete -6 and 6 +DELETE FROM rw_view2 WHERE a IN (-7, 7); -- Should delete -7 only +DELETE FROM ONLY rw_view2 WHERE a IN (-8, 8); -- Should delete -8 only + +SELECT * FROM ONLY base_tbl_parent ORDER BY a; +SELECT * FROM base_tbl_child ORDER BY a; + +CREATE TABLE other_tbl_parent (id int); +CREATE TABLE other_tbl_child () INHERITS (other_tbl_parent); +INSERT INTO other_tbl_parent VALUES (7),(200); +INSERT INTO other_tbl_child VALUES (8),(100); +ANALYZE other_tbl_parent; +ANALYZE other_tbl_child; + +EXPLAIN (costs off) +UPDATE rw_view1 SET a = a + 1000 FROM other_tbl_parent WHERE a = id; +UPDATE rw_view1 SET a = a + 1000 FROM other_tbl_parent WHERE a = id; + +SELECT * FROM ONLY base_tbl_parent ORDER BY a; +SELECT * FROM base_tbl_child ORDER BY a; + +DROP TABLE base_tbl_parent, base_tbl_child CASCADE; +DROP TABLE other_tbl_parent CASCADE; + +-- simple WITH CHECK OPTION + +CREATE TABLE base_tbl (a int, b int DEFAULT 10); +INSERT INTO base_tbl VALUES (1,2), (2,3), (1,-1); + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a < b + WITH LOCAL CHECK OPTION; +\d+ rw_view1 +SELECT * FROM information_schema.views WHERE table_name = 'rw_view1'; + +INSERT INTO rw_view1 VALUES(3,4); -- ok +INSERT INTO rw_view1 VALUES(4,3); -- should fail +INSERT INTO rw_view1 VALUES(5,null); -- should fail +UPDATE rw_view1 SET b = 5 WHERE a = 3; -- ok +UPDATE rw_view1 SET b = -5 WHERE a = 3; -- should fail +INSERT INTO rw_view1(a) VALUES (9); -- ok +INSERT INTO rw_view1(a) VALUES (10); -- should fail +SELECT * FROM base_tbl; + +DROP TABLE base_tbl CASCADE; + +-- WITH LOCAL/CASCADED CHECK OPTION + +CREATE TABLE base_tbl (a int); + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a > 0; +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a < 10 + WITH CHECK OPTION; -- implicitly cascaded +\d+ rw_view2 +SELECT * FROM information_schema.views WHERE table_name = 'rw_view2'; + +INSERT INTO rw_view2 VALUES (-5); -- should fail +INSERT INTO rw_view2 VALUES (5); -- ok +INSERT INTO rw_view2 VALUES (15); -- should fail +SELECT * FROM base_tbl; + +UPDATE rw_view2 SET a = a - 10; -- should fail +UPDATE rw_view2 SET a = a + 10; -- should fail + +CREATE OR REPLACE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a < 10 + WITH LOCAL CHECK OPTION; +\d+ rw_view2 +SELECT * FROM information_schema.views WHERE table_name = 'rw_view2'; + +INSERT INTO rw_view2 VALUES (-10); -- ok, but not in view +INSERT INTO rw_view2 VALUES (20); -- should fail +SELECT * FROM base_tbl; + +ALTER VIEW rw_view1 SET (check_option=here); -- invalid +ALTER VIEW rw_view1 SET (check_option=local); + +INSERT INTO rw_view2 VALUES (-20); -- should fail +INSERT INTO rw_view2 VALUES (30); -- should fail + +ALTER VIEW rw_view2 RESET (check_option); +\d+ rw_view2 +SELECT * FROM information_schema.views WHERE table_name = 'rw_view2'; +INSERT INTO rw_view2 VALUES (30); -- ok, but not in view +SELECT * FROM base_tbl; + +DROP TABLE base_tbl CASCADE; + +-- WITH CHECK OPTION with no local view qual + +CREATE TABLE base_tbl (a int); + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WITH CHECK OPTION; +CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a > 0; +CREATE VIEW rw_view3 AS SELECT * FROM rw_view2 WITH CHECK OPTION; +SELECT * FROM information_schema.views WHERE table_name LIKE E'rw\\_view_' ORDER BY table_name; + +INSERT INTO rw_view1 VALUES (-1); -- ok +INSERT INTO rw_view1 VALUES (1); -- ok +INSERT INTO rw_view2 VALUES (-2); -- ok, but not in view +INSERT INTO rw_view2 VALUES (2); -- ok +INSERT INTO rw_view3 VALUES (-3); -- should fail +INSERT INTO rw_view3 VALUES (3); -- ok + +DROP TABLE base_tbl CASCADE; + +-- WITH CHECK OPTION with scalar array ops + +CREATE TABLE base_tbl (a int, b int[]); +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a = ANY (b) + WITH CHECK OPTION; + +INSERT INTO rw_view1 VALUES (1, ARRAY[1,2,3]); -- ok +INSERT INTO rw_view1 VALUES (10, ARRAY[4,5]); -- should fail + +UPDATE rw_view1 SET b[2] = -b[2] WHERE a = 1; -- ok +UPDATE rw_view1 SET b[1] = -b[1] WHERE a = 1; -- should fail + +PREPARE ins(int, int[]) AS INSERT INTO rw_view1 VALUES($1, $2); +EXECUTE ins(2, ARRAY[1,2,3]); -- ok +EXECUTE ins(10, ARRAY[4,5]); -- should fail +DEALLOCATE PREPARE ins; + +DROP TABLE base_tbl CASCADE; + +-- WITH CHECK OPTION with subquery + +CREATE TABLE base_tbl (a int); +CREATE TABLE ref_tbl (a int PRIMARY KEY); +INSERT INTO ref_tbl SELECT * FROM generate_series(1,10); +ANALYZE ref_tbl; + +CREATE VIEW rw_view1 AS + SELECT * FROM base_tbl b + WHERE EXISTS(SELECT 1 FROM ref_tbl r WHERE r.a = b.a) + WITH CHECK OPTION; + +INSERT INTO rw_view1 VALUES (5); -- ok +INSERT INTO rw_view1 VALUES (15); -- should fail + +UPDATE rw_view1 SET a = a + 5; -- ok +UPDATE rw_view1 SET a = a + 5; -- should fail + +EXPLAIN (costs off) INSERT INTO rw_view1 VALUES (5); +ANALYZE base_tbl; +EXPLAIN (costs off) UPDATE rw_view1 SET a = a + 5; + +DROP TABLE base_tbl, ref_tbl CASCADE; + +-- WITH CHECK OPTION with BEFORE trigger on base table + +CREATE TABLE base_tbl (a int, b int); + +CREATE FUNCTION base_tbl_trig_fn() +RETURNS trigger AS +$$ +BEGIN + NEW.b := 10; + RETURN NEW; +END; +$$ +LANGUAGE plpgsql; + +CREATE TRIGGER base_tbl_trig BEFORE INSERT OR UPDATE ON base_tbl + FOR EACH ROW EXECUTE PROCEDURE base_tbl_trig_fn(); + +CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a < b WITH CHECK OPTION; + +INSERT INTO rw_view1 VALUES (5,0); -- ok +INSERT INTO rw_view1 VALUES (15, 20); -- should fail +UPDATE rw_view1 SET a = 20, b = 30; -- should fail + +DROP TABLE base_tbl CASCADE; +DROP FUNCTION base_tbl_trig_fn(); + +-- WITH LOCAL CHECK OPTION with INSTEAD OF trigger on base view + +CREATE TABLE base_tbl (a int, b int); + +CREATE VIEW rw_view1 AS SELECT a FROM base_tbl WHERE a < b; + +CREATE FUNCTION rw_view1_trig_fn() +RETURNS trigger AS +$$ +BEGIN + IF TG_OP = 'INSERT' THEN + INSERT INTO base_tbl VALUES (NEW.a, 10); + RETURN NEW; + ELSIF TG_OP = 'UPDATE' THEN + UPDATE base_tbl SET a=NEW.a WHERE a=OLD.a; + RETURN NEW; + ELSIF TG_OP = 'DELETE' THEN + DELETE FROM base_tbl WHERE a=OLD.a; + RETURN OLD; + END IF; +END; +$$ +LANGUAGE plpgsql; + +CREATE TRIGGER rw_view1_trig + INSTEAD OF INSERT OR UPDATE OR DELETE ON rw_view1 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); + +CREATE VIEW rw_view2 AS + SELECT * FROM rw_view1 WHERE a > 0 WITH LOCAL CHECK OPTION; + +INSERT INTO rw_view2 VALUES (-5); -- should fail +INSERT INTO rw_view2 VALUES (5); -- ok +INSERT INTO rw_view2 VALUES (50); -- ok, but not in view +UPDATE rw_view2 SET a = a - 10; -- should fail +-- Cloudberry doesn't fail because nothing was inserted into view, which is +-- because Cloudberry doesn't support INSTEAD OF triggers. +SELECT * FROM base_tbl; + +-- Check option won't cascade down to base view with INSTEAD OF triggers + +ALTER VIEW rw_view2 SET (check_option=cascaded); +INSERT INTO rw_view2 VALUES (100); -- ok, but not in view (doesn't fail rw_view1's check) +UPDATE rw_view2 SET a = 200 WHERE a = 5; -- ok, but not in view (doesn't fail rw_view1's check) +SELECT * FROM base_tbl; + +-- Neither local nor cascaded check options work with INSTEAD rules + +DROP TRIGGER rw_view1_trig ON rw_view1; + +-- GPDB: The previous tests don't work the same as in upstream. Reset the +-- contents of the table to be the same as in upstream after this test, so +-- that the tests that follow return the same results. +delete from base_tbl; +insert into base_tbl values (50, 10), (100, 10), (200, 10); + +CREATE RULE rw_view1_ins_rule AS ON INSERT TO rw_view1 + DO INSTEAD INSERT INTO base_tbl VALUES (NEW.a, 10); +CREATE RULE rw_view1_upd_rule AS ON UPDATE TO rw_view1 + DO INSTEAD UPDATE base_tbl SET a=NEW.a WHERE a=OLD.a; +INSERT INTO rw_view2 VALUES (-10); -- ok, but not in view (doesn't fail rw_view2's check) +INSERT INTO rw_view2 VALUES (5); -- ok +INSERT INTO rw_view2 VALUES (20); -- ok, but not in view (doesn't fail rw_view1's check) +UPDATE rw_view2 SET a = 30 WHERE a = 5; -- ok, but not in view (doesn't fail rw_view1's check) +INSERT INTO rw_view2 VALUES (5); -- ok +UPDATE rw_view2 SET a = -5 WHERE a = 5; -- ok, but not in view (doesn't fail rw_view2's check) +SELECT * FROM base_tbl; + +DROP TABLE base_tbl CASCADE; +DROP FUNCTION rw_view1_trig_fn(); + +CREATE TABLE base_tbl (a int); +CREATE VIEW rw_view1 AS SELECT a,10 AS b FROM base_tbl; +CREATE RULE rw_view1_ins_rule AS ON INSERT TO rw_view1 + DO INSTEAD INSERT INTO base_tbl VALUES (NEW.a); +CREATE VIEW rw_view2 AS + SELECT * FROM rw_view1 WHERE a > b WITH LOCAL CHECK OPTION; +INSERT INTO rw_view2 VALUES (2,3); -- ok, but not in view (doesn't fail rw_view2's check) +DROP TABLE base_tbl CASCADE; + +-- security barrier view + +CREATE TABLE base_tbl (person text, visibility text); + +-- GPDB: The tests below which throw NOTICEs, throw them in indeterminate +-- order, if the rows are hashed to different segments. Force all the rows +-- to the same segment, by adding a dummy column and using it as the +-- distribution key. +alter table base_tbl add column distkey int; + +INSERT INTO base_tbl VALUES ('Tom', 'public'), + ('Dick', 'private'), + ('Harry', 'public'); + +CREATE VIEW rw_view1 AS + SELECT person FROM base_tbl WHERE visibility = 'public'; + +CREATE FUNCTION snoop(anyelement) +RETURNS boolean AS +$$ +BEGIN + RAISE NOTICE 'snooped value: %', $1; + RETURN true; +END; +$$ +LANGUAGE plpgsql COST 0.000001; + +CREATE OR REPLACE FUNCTION leakproof(anyelement) +RETURNS boolean AS +$$ +BEGIN + RETURN true; +END; +$$ +LANGUAGE plpgsql STRICT IMMUTABLE LEAKPROOF; + +SELECT * FROM rw_view1 WHERE snoop(person); +UPDATE rw_view1 SET person=person WHERE snoop(person); +DELETE FROM rw_view1 WHERE NOT snoop(person); + +ALTER VIEW rw_view1 SET (security_barrier = true); + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name = 'rw_view1'; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name = 'rw_view1'; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name = 'rw_view1' + ORDER BY ordinal_position; + +SELECT * FROM rw_view1 WHERE snoop(person); +UPDATE rw_view1 SET person=person WHERE snoop(person); +DELETE FROM rw_view1 WHERE NOT snoop(person); + +EXPLAIN (costs off) SELECT * FROM rw_view1 WHERE snoop(person); +EXPLAIN (costs off) UPDATE rw_view1 SET person=person WHERE snoop(person); +EXPLAIN (costs off) DELETE FROM rw_view1 WHERE NOT snoop(person); + +-- security barrier view on top of security barrier view + +CREATE VIEW rw_view2 WITH (security_barrier = true) AS + SELECT * FROM rw_view1 WHERE snoop(person); + +SELECT table_name, is_insertable_into + FROM information_schema.tables + WHERE table_name = 'rw_view2'; + +SELECT table_name, is_updatable, is_insertable_into + FROM information_schema.views + WHERE table_name = 'rw_view2'; + +SELECT table_name, column_name, is_updatable + FROM information_schema.columns + WHERE table_name = 'rw_view2' + ORDER BY ordinal_position; + +SELECT * FROM rw_view2 WHERE snoop(person); +UPDATE rw_view2 SET person=person WHERE snoop(person); +DELETE FROM rw_view2 WHERE NOT snoop(person); + +EXPLAIN (costs off) SELECT * FROM rw_view2 WHERE snoop(person); +EXPLAIN (costs off) UPDATE rw_view2 SET person=person WHERE snoop(person); +EXPLAIN (costs off) DELETE FROM rw_view2 WHERE NOT snoop(person); + +DROP TABLE base_tbl CASCADE; + +-- security barrier view on top of table with rules + +CREATE TABLE base_tbl(id int PRIMARY KEY, data text, deleted boolean); +INSERT INTO base_tbl VALUES (1, 'Row 1', false), (2, 'Row 2', true); +ANALYZE base_tbl; + +CREATE RULE base_tbl_ins_rule AS ON INSERT TO base_tbl + WHERE EXISTS (SELECT 1 FROM base_tbl t WHERE t.id = new.id) + DO INSTEAD + UPDATE base_tbl SET data = new.data, deleted = false WHERE id = new.id; + +CREATE RULE base_tbl_del_rule AS ON DELETE TO base_tbl + DO INSTEAD + UPDATE base_tbl SET deleted = true WHERE id = old.id; + +CREATE VIEW rw_view1 WITH (security_barrier=true) AS + SELECT id, data FROM base_tbl WHERE NOT deleted; + +SELECT * FROM rw_view1; + +set enable_seqscan=off; -- To get the same plan in GPDB as in upstream +EXPLAIN (costs off) DELETE FROM rw_view1 WHERE id = 1 AND snoop(data); +DELETE FROM rw_view1 WHERE id = 1 AND snoop(data); +reset enable_seqscan; + +EXPLAIN (costs off) INSERT INTO rw_view1 VALUES (2, 'New row 2'); +INSERT INTO rw_view1 VALUES (2, 'New row 2'); + +SELECT * FROM base_tbl; + +DROP TABLE base_tbl CASCADE; + +-- security barrier view based on inheritance set +CREATE TABLE t1 (a int, b float, c text); +CREATE INDEX t1_a_idx ON t1(a); +INSERT INTO t1 +SELECT i,i,'t1' FROM generate_series(1,10) g(i); +ANALYZE t1; + +CREATE TABLE t11 (d text) INHERITS (t1); +CREATE INDEX t11_a_idx ON t11(a); +INSERT INTO t11 +SELECT i,i,'t11','t11d' FROM generate_series(1,10) g(i); +ANALYZE t11; + +CREATE TABLE t12 (e int[]) INHERITS (t1); +CREATE INDEX t12_a_idx ON t12(a); +INSERT INTO t12 +SELECT i,i,'t12','{1,2}'::int[] FROM generate_series(1,10) g(i); +ANALYZE t12; + +CREATE TABLE t111 () INHERITS (t11, t12); +CREATE INDEX t111_a_idx ON t111(a); +INSERT INTO t111 +SELECT i,i,'t111','t111d','{1,1,1}'::int[] FROM generate_series(1,10) g(i); +ANALYZE t111; + +CREATE VIEW v1 WITH (security_barrier=true) AS +SELECT *, (SELECT d FROM t11 WHERE t11.a = t1.a LIMIT 1) AS d +FROM t1 +WHERE a > 5 AND EXISTS(SELECT 1 FROM t12 WHERE t12.a = t1.a); + +SELECT * FROM v1 WHERE a=3; -- should not see anything +SELECT * FROM v1 WHERE a=8; + +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE v1 SET a=100 WHERE snoop(a) AND leakproof(a) AND a < 7 AND a != 6; +UPDATE v1 SET a=100 WHERE snoop(a) AND leakproof(a) AND a < 7 AND a != 6; + +SELECT * FROM v1 WHERE a=100; -- Nothing should have been changed to 100 +SELECT * FROM t1 WHERE a=100; -- Nothing should have been changed to 100 + +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE v1 SET a=a+1 WHERE snoop(a) AND leakproof(a) AND a = 8; +UPDATE v1 SET a=a+1 WHERE snoop(a) AND leakproof(a) AND a = 8; + +SELECT * FROM v1 WHERE b=8; + +-- Like snoop() function, but doesn't print the actual value, as long +-- as it's >= 5. This is used in GPDB in lieu of the snoop() function, +-- because the order the NOTICEs for different rows arrive from the +-- segments is not deterministic in GPDB. By omitting the value, we +-- make the output the same regardless of the row order, as long as +-- all the values are > 5, as they should if the security barrier view +-- works correctly. +CREATE FUNCTION snoop_five(int4) +RETURNS boolean AS +$$ +BEGIN + IF $1 <= 5 THEN + RAISE NOTICE 'snooped value: %', $1; + ELSE + RAISE NOTICE 'snooped a value that''s above 5'; + END IF; + RETURN true; +END; +$$ +LANGUAGE plpgsql COST 0.000001; + +DELETE FROM v1 WHERE snoop_five(a) AND leakproof(a); -- should not delete everything, just where a>5 + +TABLE t1; -- verify all a<=5 are intact + +DROP TABLE t1, t11, t12, t111 CASCADE; +DROP FUNCTION snoop(anyelement); +DROP FUNCTION leakproof(anyelement); + +CREATE TABLE tx1 (a integer); +CREATE TABLE tx2 (b integer); +CREATE TABLE tx3 (c integer); +CREATE VIEW vx1 AS SELECT a FROM tx1 WHERE EXISTS(SELECT 1 FROM tx2 JOIN tx3 ON b=c); +INSERT INTO vx1 values (1); +SELECT * FROM tx1; +SELECT * FROM vx1; + +DROP VIEW vx1; +DROP TABLE tx1; +DROP TABLE tx2; +DROP TABLE tx3; + +CREATE TABLE tx1 (a integer); +CREATE TABLE tx2 (b integer); +CREATE TABLE tx3 (c integer); +CREATE VIEW vx1 AS SELECT a FROM tx1 WHERE EXISTS(SELECT 1 FROM tx2 JOIN tx3 ON b=c); +INSERT INTO vx1 VALUES (1); +INSERT INTO vx1 VALUES (1); +SELECT * FROM tx1; +SELECT * FROM vx1; + +DROP VIEW vx1; +DROP TABLE tx1; +DROP TABLE tx2; +DROP TABLE tx3; + +CREATE TABLE tx1 (a integer, b integer); +CREATE TABLE tx2 (b integer, c integer); +CREATE TABLE tx3 (c integer, d integer); +ALTER TABLE tx1 DROP COLUMN b; +ALTER TABLE tx2 DROP COLUMN c; +ALTER TABLE tx3 DROP COLUMN d; +CREATE VIEW vx1 AS SELECT a FROM tx1 WHERE EXISTS(SELECT 1 FROM tx2 JOIN tx3 ON b=c); +INSERT INTO vx1 VALUES (1); +INSERT INTO vx1 VALUES (1); +SELECT * FROM tx1; +SELECT * FROM vx1; + +DROP VIEW vx1; +DROP TABLE tx1; +DROP TABLE tx2; +DROP TABLE tx3; + +-- +-- Test handling of vars from correlated subqueries in quals from outer +-- security barrier views, per bug #13988 +-- +CREATE TABLE t1 (a int, b text, c int); +INSERT INTO t1 VALUES (1, 'one', 10); + +CREATE TABLE t2 (cc int); +INSERT INTO t2 VALUES (10), (20); + +CREATE VIEW v1 WITH (security_barrier = true) AS + SELECT * FROM t1 WHERE (a > 0) + WITH CHECK OPTION; + +CREATE VIEW v2 WITH (security_barrier = true) AS + SELECT * FROM v1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.cc = v1.c) + WITH CHECK OPTION; + +INSERT INTO v2 VALUES (2, 'two', 20); -- ok +INSERT INTO v2 VALUES (-2, 'minus two', 20); -- not allowed +INSERT INTO v2 VALUES (3, 'three', 30); -- not allowed + +UPDATE v2 SET b = 'ONE' WHERE a = 1; -- ok +UPDATE v2 SET a = -1 WHERE a = 1; -- not allowed +UPDATE v2 SET c = 30 WHERE a = 1; -- not allowed + +DELETE FROM v2 WHERE a = 2; -- ok +SELECT * FROM v2; + +DROP VIEW v2; +DROP VIEW v1; +DROP TABLE t2; +DROP TABLE t1; + +-- +-- Test CREATE OR REPLACE VIEW turning a non-updatable view into an +-- auto-updatable view and adding check options in a single step +-- +CREATE TABLE t1 (a int, b text); +CREATE VIEW v1 AS SELECT null::int AS a; +CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 WHERE a > 0 WITH CHECK OPTION; + +INSERT INTO v1 VALUES (1, 'ok'); -- ok +INSERT INTO v1 VALUES (-1, 'invalid'); -- should fail + +DROP VIEW v1; +DROP TABLE t1; + +-- check that an auto-updatable view on a partitioned table works correctly +create table uv_pt (a int, b int, v varchar) partition by range (a, b); +create table uv_pt1 (b int not null, v varchar, a int not null) partition by range (b); +create table uv_pt11 (like uv_pt1); +alter table uv_pt11 drop a; +alter table uv_pt11 add a int; +alter table uv_pt11 drop a; +alter table uv_pt11 add a int not null; +alter table uv_pt1 attach partition uv_pt11 for values from (2) to (5); +alter table uv_pt attach partition uv_pt1 for values from (1, 2) to (1, 10); + +create view uv_ptv as select * from uv_pt; +select events & 4 != 0 AS upd, + events & 8 != 0 AS ins, + events & 16 != 0 AS del + from pg_catalog.pg_relation_is_updatable('uv_pt'::regclass, false) t(events); +select pg_catalog.pg_column_is_updatable('uv_pt'::regclass, 1::smallint, false); +select pg_catalog.pg_column_is_updatable('uv_pt'::regclass, 2::smallint, false); +select table_name, is_updatable, is_insertable_into + from information_schema.views where table_name = 'uv_ptv'; +select table_name, column_name, is_updatable + from information_schema.columns where table_name = 'uv_ptv' order by column_name; +insert into uv_ptv values (1, 2); +select tableoid::regclass, * from uv_pt; +create view uv_ptv_wco as select * from uv_pt where a = 0 with check option; +insert into uv_ptv_wco values (1, 2); +drop view uv_ptv, uv_ptv_wco; +drop table uv_pt, uv_pt1, uv_pt11; + +-- check that wholerow vars appearing in WITH CHECK OPTION constraint expressions +-- work fine with partitioned tables +create table wcowrtest (a int) partition by list (a); +create table wcowrtest1 partition of wcowrtest for values in (1); +create view wcowrtest_v as select * from wcowrtest where wcowrtest = '(2)'::wcowrtest with check option; +insert into wcowrtest_v values (1); + +alter table wcowrtest add b text; +create table wcowrtest2 (b text, c int, a int); +alter table wcowrtest2 drop c; +alter table wcowrtest attach partition wcowrtest2 for values in (2); + +create table sometable (a int, b text); +insert into sometable values (1, 'a'), (2, 'b'); +create view wcowrtest_v2 as + select * + from wcowrtest r + where r in (select s from sometable s where r.a = s.a) +with check option; + +-- WITH CHECK qual will be processed with wcowrtest2's +-- rowtype after tuple-routing +insert into wcowrtest_v2 values (2, 'no such row in sometable'); + +drop view wcowrtest_v, wcowrtest_v2; +drop table wcowrtest, sometable; + +-- Check INSERT .. ON CONFLICT DO UPDATE works correctly when the view's +-- columns are named and ordered differently than the underlying table's. +create table uv_iocu_tab (a text unique, b float); +insert into uv_iocu_tab values ('xyxyxy', 0); +create view uv_iocu_view as + select b, b+1 as c, a, '2.0'::text as two from uv_iocu_tab; + +insert into uv_iocu_view (a, b) values ('xyxyxy', 1) + on conflict (a) do update set b = uv_iocu_view.b; +select * from uv_iocu_tab; +insert into uv_iocu_view (a, b) values ('xyxyxy', 1) + on conflict (a) do update set b = excluded.b; +select * from uv_iocu_tab; + +-- OK to access view columns that are not present in underlying base +-- relation in the ON CONFLICT portion of the query +insert into uv_iocu_view (a, b) values ('xyxyxy', 3) + on conflict (a) do update set b = cast(excluded.two as float); +select * from uv_iocu_tab; + +explain (costs off) +insert into uv_iocu_view (a, b) values ('xyxyxy', 3) + on conflict (a) do update set b = excluded.b where excluded.c > 0; + +insert into uv_iocu_view (a, b) values ('xyxyxy', 3) + on conflict (a) do update set b = excluded.b where excluded.c > 0; +select * from uv_iocu_tab; + +drop view uv_iocu_view; +drop table uv_iocu_tab; + +-- Test whole-row references to the view +create table uv_iocu_tab (a int unique, b text); +create view uv_iocu_view as + select b as bb, a as aa, uv_iocu_tab::text as cc from uv_iocu_tab; + +insert into uv_iocu_view (aa,bb) values (1,'x'); +explain (costs off) +insert into uv_iocu_view (aa,bb) values (1,'y') + on conflict (aa) do update set bb = 'Rejected: '||excluded.* + where excluded.aa > 0 + and excluded.bb != '' + and excluded.cc is not null; +insert into uv_iocu_view (aa,bb) values (1,'y') + on conflict (aa) do update set bb = 'Rejected: '||excluded.* + where excluded.aa > 0 + and excluded.bb != '' + and excluded.cc is not null; +select * from uv_iocu_view; + +-- Test omitting a column of the base relation +delete from uv_iocu_view; +insert into uv_iocu_view (aa,bb) values (1,'x'); +insert into uv_iocu_view (aa) values (1) + on conflict (aa) do update set bb = 'Rejected: '||excluded.*; +select * from uv_iocu_view; + +alter table uv_iocu_tab alter column b set default 'table default'; +insert into uv_iocu_view (aa) values (1) + on conflict (aa) do update set bb = 'Rejected: '||excluded.*; +select * from uv_iocu_view; + +alter view uv_iocu_view alter column bb set default 'view default'; +insert into uv_iocu_view (aa) values (1) + on conflict (aa) do update set bb = 'Rejected: '||excluded.*; +select * from uv_iocu_view; + +-- Should fail to update non-updatable columns +insert into uv_iocu_view (aa) values (1) + on conflict (aa) do update set cc = 'XXX'; + +drop view uv_iocu_view; +drop table uv_iocu_tab; + +-- ON CONFLICT DO UPDATE permissions checks +create user regress_view_user1; +create user regress_view_user2; + +set session authorization regress_view_user1; +create table base_tbl(a int unique, b text, c float); +insert into base_tbl values (1,'xxx',1.0); +create view rw_view1 as select b as bb, c as cc, a as aa from base_tbl; + +grant select (aa,bb) on rw_view1 to regress_view_user2; +grant insert on rw_view1 to regress_view_user2; +grant update (bb) on rw_view1 to regress_view_user2; + +set session authorization regress_view_user2; +insert into rw_view1 values ('yyy',2.0,1) + on conflict (aa) do update set bb = excluded.cc; -- Not allowed +insert into rw_view1 values ('yyy',2.0,1) + on conflict (aa) do update set bb = rw_view1.cc; -- Not allowed +insert into rw_view1 values ('yyy',2.0,1) + on conflict (aa) do update set bb = excluded.bb; -- OK +insert into rw_view1 values ('zzz',2.0,1) + on conflict (aa) do update set bb = rw_view1.bb||'xxx'; -- OK +insert into rw_view1 values ('zzz',2.0,1) + on conflict (aa) do update set cc = 3.0; -- Not allowed +reset session authorization; +select * from base_tbl; + +set session authorization regress_view_user1; +grant select (a,b) on base_tbl to regress_view_user2; +grant insert (a,b) on base_tbl to regress_view_user2; +grant update (a,b) on base_tbl to regress_view_user2; + +set session authorization regress_view_user2; +create view rw_view2 as select b as bb, c as cc, a as aa from base_tbl; +insert into rw_view2 (aa,bb) values (1,'xxx') + on conflict (aa) do update set bb = excluded.bb; -- Not allowed +create view rw_view3 as select b as bb, a as aa from base_tbl; +insert into rw_view3 (aa,bb) values (1,'xxx') + on conflict (aa) do update set bb = excluded.bb; -- OK +reset session authorization; +select * from base_tbl; + +set session authorization regress_view_user2; +create view rw_view4 as select aa, bb, cc FROM rw_view1; +insert into rw_view4 (aa,bb) values (1,'yyy') + on conflict (aa) do update set bb = excluded.bb; -- Not allowed +create view rw_view5 as select aa, bb FROM rw_view1; +insert into rw_view5 (aa,bb) values (1,'yyy') + on conflict (aa) do update set bb = excluded.bb; -- OK +reset session authorization; +select * from base_tbl; + +drop view rw_view5; +drop view rw_view4; +drop view rw_view3; +drop view rw_view2; +drop view rw_view1; +drop table base_tbl; +drop user regress_view_user1; +drop user regress_view_user2; + +-- Test single- and multi-row inserts with table and view defaults. +-- Table defaults should be used, unless overridden by view defaults. +create table base_tab_def (a int, b text default 'Table default', + c text default 'Table default', d text, e text); +create view base_tab_def_view as select * from base_tab_def; +alter view base_tab_def_view alter b set default 'View default'; +alter view base_tab_def_view alter d set default 'View default'; +insert into base_tab_def values (1); +insert into base_tab_def values (2), (3); +insert into base_tab_def values (4, default, default, default, default); +insert into base_tab_def values (5, default, default, default, default), + (6, default, default, default, default); +insert into base_tab_def_view values (11); +insert into base_tab_def_view values (12), (13); +insert into base_tab_def_view values (14, default, default, default, default); +insert into base_tab_def_view values (15, default, default, default, default), + (16, default, default, default, default); +insert into base_tab_def_view values (17), (default); +select * from base_tab_def order by a; + +-- Adding an INSTEAD OF trigger should cause NULLs to be inserted instead of +-- table defaults, where there are no view defaults. +create function base_tab_def_view_instrig_func() returns trigger +as +$$ +begin + insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e); + return new; +end; +$$ +language plpgsql; +create trigger base_tab_def_view_instrig instead of insert on base_tab_def_view + for each row execute function base_tab_def_view_instrig_func(); +truncate base_tab_def; +insert into base_tab_def values (1); +insert into base_tab_def values (2), (3); +insert into base_tab_def values (4, default, default, default, default); +insert into base_tab_def values (5, default, default, default, default), + (6, default, default, default, default); +insert into base_tab_def_view values (11); +insert into base_tab_def_view values (12), (13); +insert into base_tab_def_view values (14, default, default, default, default); +insert into base_tab_def_view values (15, default, default, default, default), + (16, default, default, default, default); +insert into base_tab_def_view values (17), (default); +select * from base_tab_def order by a; + +-- Using an unconditional DO INSTEAD rule should also cause NULLs to be +-- inserted where there are no view defaults. +drop trigger base_tab_def_view_instrig on base_tab_def_view; +drop function base_tab_def_view_instrig_func; +create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view + do instead insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e); +truncate base_tab_def; +insert into base_tab_def values (1); +insert into base_tab_def values (2), (3); +insert into base_tab_def values (4, default, default, default, default); +insert into base_tab_def values (5, default, default, default, default), + (6, default, default, default, default); +insert into base_tab_def_view values (11); +insert into base_tab_def_view values (12), (13); +insert into base_tab_def_view values (14, default, default, default, default); +insert into base_tab_def_view values (15, default, default, default, default), + (16, default, default, default, default); +insert into base_tab_def_view values (17), (default); +select * from base_tab_def order by a; + +-- A DO ALSO rule should cause each row to be inserted twice. The first +-- insert should behave the same as an auto-updatable view (using table +-- defaults, unless overridden by view defaults). The second insert should +-- behave the same as a rule-updatable view (inserting NULLs where there are +-- no view defaults). +drop rule base_tab_def_view_ins_rule on base_tab_def_view; +create rule base_tab_def_view_ins_rule as on insert to base_tab_def_view + do also insert into base_tab_def values (new.a, new.b, new.c, new.d, new.e); +truncate base_tab_def; +insert into base_tab_def values (1); +insert into base_tab_def values (2), (3); +insert into base_tab_def values (4, default, default, default, default); +insert into base_tab_def values (5, default, default, default, default), + (6, default, default, default, default); +insert into base_tab_def_view values (11); +insert into base_tab_def_view values (12), (13); +insert into base_tab_def_view values (14, default, default, default, default); +insert into base_tab_def_view values (15, default, default, default, default), + (16, default, default, default, default); +insert into base_tab_def_view values (17), (default); +select * from base_tab_def order by a, c NULLS LAST; + +drop view base_tab_def_view; +drop table base_tab_def; + +-- Test defaults with array assignments +create table base_tab (a serial, b int[], c text, d text default 'Table default'); +create view base_tab_view as select c, a, b from base_tab; +alter view base_tab_view alter column c set default 'View default'; +insert into base_tab_view (b[1], b[2], c, b[5], b[4], a, b[3]) +values (1, 2, default, 5, 4, default, 3), (10, 11, 'C value', 14, 13, 100, 12); +select * from base_tab order by a; +drop view base_tab_view; +drop table base_tab; diff --git a/src/test/singlenode_regress/sql/update.sql b/src/test/singlenode_regress/sql/update.sql new file mode 100644 index 00000000000..7a7bee77b92 --- /dev/null +++ b/src/test/singlenode_regress/sql/update.sql @@ -0,0 +1,669 @@ +-- +-- UPDATE syntax tests +-- + +CREATE TABLE update_test ( + a INT DEFAULT 10, + b INT, + c TEXT +); + +CREATE TABLE upsert_test ( + a INT PRIMARY KEY, + b TEXT +); + +INSERT INTO update_test VALUES (5, 10, 'foo'); +INSERT INTO update_test(b, a) VALUES (15, 10); + +SELECT * FROM update_test; + +UPDATE update_test SET a = DEFAULT, b = DEFAULT; + +SELECT * FROM update_test; + +-- aliases for the UPDATE target table +UPDATE update_test AS t SET b = 10 WHERE t.a = 10; + +SELECT * FROM update_test; + +UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10; + +SELECT * FROM update_test; + +-- +-- Test VALUES in FROM +-- + +UPDATE update_test SET a=v.i FROM (VALUES(100, 20)) AS v(i, j) + WHERE update_test.b = v.j; + +SELECT * FROM update_test; + +-- fail, wrong data type: +UPDATE update_test SET a = v.* FROM (VALUES(100, 20)) AS v(i, j) + WHERE update_test.b = v.j; + +-- +-- Test multiple-set-clause syntax +-- + +INSERT INTO update_test SELECT a,b+1,c FROM update_test; +SELECT * FROM update_test; + +UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo'; +SELECT * FROM update_test; +UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10; +SELECT * FROM update_test; +-- fail, multi assignment to same column: +UPDATE update_test SET (c,b) = ('car', a+b), b = a + 1 WHERE a = 10; + +-- uncorrelated sub-select: +UPDATE update_test + SET (b,a) = (select a,b from update_test where b = 41 and c = 'car') + WHERE a = 100 AND b = 20; +SELECT * FROM update_test; +-- correlated sub-select: +UPDATE update_test o + SET (b,a) = (select a+1,b from update_test i + where i.a=o.a and i.b=o.b and i.c is not distinct from o.c); +SELECT * FROM update_test; +-- fail, multiple rows supplied: +UPDATE update_test SET (b,a) = (select a+1,b from update_test); +-- set to null if no rows supplied: +UPDATE update_test SET (b,a) = (select a+1,b from update_test where a = 1000) + WHERE a = 11; +SELECT * FROM update_test; +-- *-expansion should work in this context: +UPDATE update_test SET (a,b) = ROW(v.*) FROM (VALUES(21, 100)) AS v(i, j) + WHERE update_test.a = v.i; +-- you might expect this to work, but syntactically it's not a RowExpr: +UPDATE update_test SET (a,b) = (v.*) FROM (VALUES(21, 101)) AS v(i, j) + WHERE update_test.a = v.i; + +-- if an alias for the target table is specified, don't allow references +-- to the original table name +UPDATE update_test AS t SET b = update_test.b + 10 WHERE t.a = 10; + +-- Make sure that we can update to a TOASTed value. +UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car'; +SELECT a, b, char_length(c) FROM update_test; + +-- Check multi-assignment with a Result node to handle a one-time filter. +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE update_test t + SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a) + WHERE CURRENT_USER = SESSION_USER; +UPDATE update_test t + SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a) + WHERE CURRENT_USER = SESSION_USER; +SELECT a, b, char_length(c) FROM update_test; + +-- Test ON CONFLICT DO UPDATE + +INSERT INTO upsert_test VALUES(1, 'Boo'), (3, 'Zoo'); +-- uncorrelated sub-select: +WITH aaa AS (SELECT 1 AS a, 'Foo' AS b) INSERT INTO upsert_test + VALUES (1, 'Bar') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b, a FROM aaa) RETURNING *; +-- correlated sub-select: +INSERT INTO upsert_test VALUES (1, 'Baz'), (3, 'Zaz') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Correlated', a from upsert_test i WHERE i.a = upsert_test.a) + RETURNING *; +-- correlated sub-select (EXCLUDED.* alias): +INSERT INTO upsert_test VALUES (1, 'Bat'), (3, 'Zot') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING *; + +-- ON CONFLICT using system attributes in RETURNING, testing both the +-- inserting and updating paths. See bug report at: +-- https://www.postgresql.org/message-id/73436355-6432-49B1-92ED-1FE4F7E7E100%40finefun.com.au +INSERT INTO upsert_test VALUES (2, 'Beeble') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING tableoid::regclass, xmin = pg_current_xact_id()::xid AS xmin_correct, xmax = 0 AS xmax_correct; +-- currently xmax is set after a conflict - that's probably not good, +-- but it seems worthwhile to have to be explicit if that changes. +INSERT INTO upsert_test VALUES (2, 'Brox') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b || ', Excluded', a from upsert_test i WHERE i.a = excluded.a) + RETURNING tableoid::regclass, xmin = pg_current_xact_id()::xid AS xmin_correct, xmax = pg_current_xact_id()::xid AS xmax_correct; + +DROP TABLE update_test; +DROP TABLE upsert_test; + +-- Test ON CONFLICT DO UPDATE with partitioned table and non-identical children + +CREATE TABLE upsert_test ( + a INT PRIMARY KEY, + b TEXT +) PARTITION BY LIST (a); + +CREATE TABLE upsert_test_1 PARTITION OF upsert_test FOR VALUES IN (1); +CREATE TABLE upsert_test_2 (b TEXT, a INT PRIMARY KEY); +ALTER TABLE upsert_test ATTACH PARTITION upsert_test_2 FOR VALUES IN (2); + +INSERT INTO upsert_test VALUES(1, 'Boo'), (2, 'Zoo'); +-- uncorrelated sub-select: +WITH aaa AS (SELECT 1 AS a, 'Foo' AS b) INSERT INTO upsert_test + VALUES (1, 'Bar') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT b, a FROM aaa) RETURNING *; +-- correlated sub-select: +WITH aaa AS (SELECT 1 AS ctea, ' Foo' AS cteb) INSERT INTO upsert_test + VALUES (1, 'Bar'), (2, 'Baz') ON CONFLICT(a) + DO UPDATE SET (b, a) = (SELECT upsert_test.b||cteb, upsert_test.a FROM aaa) RETURNING *; + +DROP TABLE upsert_test; + + +--------------------------- +-- UPDATE with row movement +--------------------------- + +-- When a partitioned table receives an UPDATE to the partitioned key and the +-- new values no longer meet the partition's bound, the row must be moved to +-- the correct partition for the new partition key (if one exists). We must +-- also ensure that updatable views on partitioned tables properly enforce any +-- WITH CHECK OPTION that is defined. The situation with triggers in this case +-- also requires thorough testing as partition key updates causing row +-- movement convert UPDATEs into DELETE+INSERT. + +CREATE TABLE range_parted ( + a text, + b bigint, + c numeric, + d int, + e varchar +) PARTITION BY RANGE (a, b); + +-- Create partitions intentionally in descending bound order, so as to test +-- that update-row-movement works with the leaf partitions not in bound order. +CREATE TABLE part_b_20_b_30 (e varchar, c numeric, a text, b bigint, d int); +ALTER TABLE range_parted ATTACH PARTITION part_b_20_b_30 FOR VALUES FROM ('b', 20) TO ('b', 30); +CREATE TABLE part_b_10_b_20 (e varchar, c numeric, a text, b bigint, d int) PARTITION BY RANGE (c); +CREATE TABLE part_b_1_b_10 PARTITION OF range_parted FOR VALUES FROM ('b', 1) TO ('b', 10); +ALTER TABLE range_parted ATTACH PARTITION part_b_10_b_20 FOR VALUES FROM ('b', 10) TO ('b', 20); +CREATE TABLE part_a_10_a_20 PARTITION OF range_parted FOR VALUES FROM ('a', 10) TO ('a', 20); +CREATE TABLE part_a_1_a_10 PARTITION OF range_parted FOR VALUES FROM ('a', 1) TO ('a', 10); + +-- Check that partition-key UPDATE works sanely on a partitioned table that +-- does not have any child partitions. +UPDATE part_b_10_b_20 set b = b - 6; + +-- Create some more partitions following the above pattern of descending bound +-- order, but let's make the situation a bit more complex by having the +-- attribute numbers of the columns vary from their parent partition. +CREATE TABLE part_c_100_200 (e varchar, c numeric, a text, b bigint, d int) PARTITION BY range (abs(d)); +ALTER TABLE part_c_100_200 DROP COLUMN e, DROP COLUMN c, DROP COLUMN a; +ALTER TABLE part_c_100_200 ADD COLUMN c numeric, ADD COLUMN e varchar, ADD COLUMN a text; +ALTER TABLE part_c_100_200 DROP COLUMN b; +ALTER TABLE part_c_100_200 ADD COLUMN b bigint; +CREATE TABLE part_d_1_15 PARTITION OF part_c_100_200 FOR VALUES FROM (1) TO (15); +CREATE TABLE part_d_15_20 PARTITION OF part_c_100_200 FOR VALUES FROM (15) TO (20); + +ALTER TABLE part_b_10_b_20 ATTACH PARTITION part_c_100_200 FOR VALUES FROM (100) TO (200); + +CREATE TABLE part_c_1_100 (e varchar, d int, c numeric, b bigint, a text); +ALTER TABLE part_b_10_b_20 ATTACH PARTITION part_c_1_100 FOR VALUES FROM (1) TO (100); + +\set init_range_parted 'truncate range_parted; insert into range_parted VALUES (''a'', 1, 1, 1), (''a'', 10, 200, 1), (''b'', 12, 96, 1), (''b'', 13, 97, 2), (''b'', 15, 105, 16), (''b'', 17, 105, 19)' +\set show_data 'select tableoid::regclass::text COLLATE "C" partname, * from range_parted ORDER BY 1, 2, 3, 4, 5, 6' +:init_range_parted; +:show_data; + +-- The order of subplans should be in bound order +EXPLAIN (costs off) UPDATE range_parted set c = c - 50 WHERE c > 97; + +-- fail, row movement happens only within the partition subtree. +UPDATE part_c_100_200 set c = c - 20, d = c WHERE c = 105; +-- fail, no partition key update, so no attempt to move tuple, +-- but "a = 'a'" violates partition constraint enforced by root partition) +UPDATE part_b_10_b_20 set a = 'a'; +-- ok, partition key update, no constraint violation +UPDATE range_parted set d = d - 10 WHERE d > 10; +-- ok, no partition key update, no constraint violation +UPDATE range_parted set e = d; +-- No row found +UPDATE part_c_1_100 set c = c + 20 WHERE c = 98; +-- ok, row movement +UPDATE part_b_10_b_20 set c = c + 20 returning c, b, a; +:show_data; + +-- fail, row movement happens only within the partition subtree. +UPDATE part_b_10_b_20 set b = b - 6 WHERE c > 116 returning *; +-- ok, row movement, with subset of rows moved into different partition. +UPDATE range_parted set b = b - 6 WHERE c > 116 returning a, b + c; + +:show_data; + +-- Common table needed for multiple test scenarios. +CREATE TABLE mintab(c1 int); +INSERT into mintab VALUES (120); + +-- update partition key using updatable view. +CREATE VIEW upview AS SELECT * FROM range_parted WHERE (select c > c1 FROM mintab) WITH CHECK OPTION; +-- ok +UPDATE upview set c = 199 WHERE b = 4; +-- fail, check option violation +UPDATE upview set c = 120 WHERE b = 4; +-- fail, row movement with check option violation +UPDATE upview set a = 'b', b = 15, c = 120 WHERE b = 4; +-- ok, row movement, check option passes +UPDATE upview set a = 'b', b = 15 WHERE b = 4; + +:show_data; + +-- cleanup +DROP VIEW upview; + +-- RETURNING having whole-row vars. +:init_range_parted; +UPDATE range_parted set c = 95 WHERE a = 'b' and b > 10 and c > 100 returning (range_parted), *; +:show_data; + + +-- Transition tables with update row movement +:init_range_parted; + +CREATE FUNCTION trans_updatetrigfunc() RETURNS trigger LANGUAGE plpgsql AS +$$ + begin + raise notice 'trigger = %, old table = %, new table = %', + TG_NAME, + (select string_agg(old_table::text, ', ' ORDER BY a) FROM old_table), + (select string_agg(new_table::text, ', ' ORDER BY a) FROM new_table); + return null; + end; +$$; + +CREATE TRIGGER trans_updatetrig + AFTER UPDATE ON range_parted REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); + +UPDATE range_parted set c = (case when c = 96 then 110 else c + 1 end ) WHERE a = 'b' and b > 10 and c >= 96; +:show_data; +:init_range_parted; + +-- Enabling OLD TABLE capture for both DELETE as well as UPDATE stmt triggers +-- should not cause DELETEd rows to be captured twice. Similar thing for +-- INSERT triggers and inserted rows. +CREATE TRIGGER trans_deletetrig + AFTER DELETE ON range_parted REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); +CREATE TRIGGER trans_inserttrig + AFTER INSERT ON range_parted REFERENCING NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trans_updatetrigfunc(); +UPDATE range_parted set c = c + 50 WHERE a = 'b' and b > 10 and c >= 96; +:show_data; +DROP TRIGGER trans_deletetrig ON range_parted; +DROP TRIGGER trans_inserttrig ON range_parted; +-- Don't drop trans_updatetrig yet. It is required below. + +-- Test with transition tuple conversion happening for rows moved into the +-- new partition. This requires a trigger that references transition table +-- (we already have trans_updatetrig). For inserted rows, the conversion +-- is not usually needed, because the original tuple is already compatible with +-- the desired transition tuple format. But conversion happens when there is a +-- BR trigger because the trigger can change the inserted row. So install a +-- BR triggers on those child partitions where the rows will be moved. +CREATE FUNCTION func_parted_mod_b() RETURNS trigger AS $$ +BEGIN + NEW.b = NEW.b + 1; + return NEW; +END $$ language plpgsql; +CREATE TRIGGER trig_c1_100 BEFORE UPDATE OR INSERT ON part_c_1_100 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +CREATE TRIGGER trig_d1_15 BEFORE UPDATE OR INSERT ON part_d_1_15 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +CREATE TRIGGER trig_d15_20 BEFORE UPDATE OR INSERT ON part_d_15_20 + FOR EACH ROW EXECUTE PROCEDURE func_parted_mod_b(); +:init_range_parted; +UPDATE range_parted set c = (case when c = 96 then 110 else c + 1 end) WHERE a = 'b' and b > 10 and c >= 96; +:show_data; +:init_range_parted; +UPDATE range_parted set c = c + 50 WHERE a = 'b' and b > 10 and c >= 96; +:show_data; + +-- Case where per-partition tuple conversion map array is allocated, but the +-- map is not required for the particular tuple that is routed, thanks to +-- matching table attributes of the partition and the target table. +:init_range_parted; +UPDATE range_parted set b = 15 WHERE b = 1; +:show_data; + +DROP TRIGGER trans_updatetrig ON range_parted; +DROP TRIGGER trig_c1_100 ON part_c_1_100; +DROP TRIGGER trig_d1_15 ON part_d_1_15; +DROP TRIGGER trig_d15_20 ON part_d_15_20; +DROP FUNCTION func_parted_mod_b(); + +-- RLS policies with update-row-movement +----------------------------------------- + +ALTER TABLE range_parted ENABLE ROW LEVEL SECURITY; +CREATE USER regress_range_parted_user; +GRANT ALL ON range_parted, mintab TO regress_range_parted_user; +CREATE POLICY seeall ON range_parted AS PERMISSIVE FOR SELECT USING (true); +CREATE POLICY policy_range_parted ON range_parted for UPDATE USING (true) WITH CHECK (c % 2 = 0); + +:init_range_parted; +SET SESSION AUTHORIZATION regress_range_parted_user; +-- This should fail with RLS violation error while moving row from +-- part_a_10_a_20 to part_d_1_15, because we are setting 'c' to an odd number. +UPDATE range_parted set a = 'b', c = 151 WHERE a = 'a' and c = 200; + +RESET SESSION AUTHORIZATION; +-- Create a trigger on part_d_1_15 +CREATE FUNCTION func_d_1_15() RETURNS trigger AS $$ +BEGIN + NEW.c = NEW.c + 1; -- Make even numbers odd, or vice versa + return NEW; +END $$ LANGUAGE plpgsql; +CREATE TRIGGER trig_d_1_15 BEFORE INSERT ON part_d_1_15 + FOR EACH ROW EXECUTE PROCEDURE func_d_1_15(); + +:init_range_parted; +SET SESSION AUTHORIZATION regress_range_parted_user; + +-- Here, RLS checks should succeed while moving row from part_a_10_a_20 to +-- part_d_1_15. Even though the UPDATE is setting 'c' to an odd number, the +-- trigger at the destination partition again makes it an even number. +UPDATE range_parted set a = 'b', c = 151 WHERE a = 'a' and c = 200; + +RESET SESSION AUTHORIZATION; +:init_range_parted; +SET SESSION AUTHORIZATION regress_range_parted_user; +-- This should fail with RLS violation error. Even though the UPDATE is setting +-- 'c' to an even number, the trigger at the destination partition again makes +-- it an odd number. +UPDATE range_parted set a = 'b', c = 150 WHERE a = 'a' and c = 200; + +-- Cleanup +RESET SESSION AUTHORIZATION; +DROP TRIGGER trig_d_1_15 ON part_d_1_15; +DROP FUNCTION func_d_1_15(); + +-- Policy expression contains SubPlan +RESET SESSION AUTHORIZATION; +:init_range_parted; +CREATE POLICY policy_range_parted_subplan on range_parted + AS RESTRICTIVE for UPDATE USING (true) + WITH CHECK ((SELECT range_parted.c <= c1 FROM mintab)); +SET SESSION AUTHORIZATION regress_range_parted_user; +-- fail, mintab has row with c1 = 120 +UPDATE range_parted set a = 'b', c = 122 WHERE a = 'a' and c = 200; +-- ok +UPDATE range_parted set a = 'b', c = 120 WHERE a = 'a' and c = 200; + +-- RLS policy expression contains whole row. + +RESET SESSION AUTHORIZATION; +:init_range_parted; +CREATE POLICY policy_range_parted_wholerow on range_parted AS RESTRICTIVE for UPDATE USING (true) + WITH CHECK (range_parted = row('b', 10, 112, 1, NULL)::range_parted); +SET SESSION AUTHORIZATION regress_range_parted_user; +-- ok, should pass the RLS check +UPDATE range_parted set a = 'b', c = 112 WHERE a = 'a' and c = 200; +RESET SESSION AUTHORIZATION; +:init_range_parted; +SET SESSION AUTHORIZATION regress_range_parted_user; +-- fail, the whole row RLS check should fail +UPDATE range_parted set a = 'b', c = 116 WHERE a = 'a' and c = 200; + +-- Cleanup +RESET SESSION AUTHORIZATION; +DROP POLICY policy_range_parted ON range_parted; +DROP POLICY policy_range_parted_subplan ON range_parted; +DROP POLICY policy_range_parted_wholerow ON range_parted; +REVOKE ALL ON range_parted, mintab FROM regress_range_parted_user; +DROP USER regress_range_parted_user; +DROP TABLE mintab; + + +-- statement triggers with update row movement +--------------------------------------------------- + +:init_range_parted; + +CREATE FUNCTION trigfunc() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = % fired on table % during %', + TG_NAME, TG_TABLE_NAME, TG_OP; + return null; + end; +$$; +-- Triggers on root partition +CREATE TRIGGER parent_delete_trig + AFTER DELETE ON range_parted for each statement execute procedure trigfunc(); +CREATE TRIGGER parent_update_trig + AFTER UPDATE ON range_parted for each statement execute procedure trigfunc(); +CREATE TRIGGER parent_insert_trig + AFTER INSERT ON range_parted for each statement execute procedure trigfunc(); + +-- Triggers on leaf partition part_c_1_100 +CREATE TRIGGER c1_delete_trig + AFTER DELETE ON part_c_1_100 for each statement execute procedure trigfunc(); +CREATE TRIGGER c1_update_trig + AFTER UPDATE ON part_c_1_100 for each statement execute procedure trigfunc(); +CREATE TRIGGER c1_insert_trig + AFTER INSERT ON part_c_1_100 for each statement execute procedure trigfunc(); + +-- Triggers on leaf partition part_d_1_15 +CREATE TRIGGER d1_delete_trig + AFTER DELETE ON part_d_1_15 for each statement execute procedure trigfunc(); +CREATE TRIGGER d1_update_trig + AFTER UPDATE ON part_d_1_15 for each statement execute procedure trigfunc(); +CREATE TRIGGER d1_insert_trig + AFTER INSERT ON part_d_1_15 for each statement execute procedure trigfunc(); +-- Triggers on leaf partition part_d_15_20 +CREATE TRIGGER d15_delete_trig + AFTER DELETE ON part_d_15_20 for each statement execute procedure trigfunc(); +CREATE TRIGGER d15_update_trig + AFTER UPDATE ON part_d_15_20 for each statement execute procedure trigfunc(); +CREATE TRIGGER d15_insert_trig + AFTER INSERT ON part_d_15_20 for each statement execute procedure trigfunc(); + +-- Move all rows from part_c_100_200 to part_c_1_100. None of the delete or +-- insert statement triggers should be fired. +UPDATE range_parted set c = c - 50 WHERE c > 97; +:show_data; + +DROP TRIGGER parent_delete_trig ON range_parted; +DROP TRIGGER parent_update_trig ON range_parted; +DROP TRIGGER parent_insert_trig ON range_parted; +DROP TRIGGER c1_delete_trig ON part_c_1_100; +DROP TRIGGER c1_update_trig ON part_c_1_100; +DROP TRIGGER c1_insert_trig ON part_c_1_100; +DROP TRIGGER d1_delete_trig ON part_d_1_15; +DROP TRIGGER d1_update_trig ON part_d_1_15; +DROP TRIGGER d1_insert_trig ON part_d_1_15; +DROP TRIGGER d15_delete_trig ON part_d_15_20; +DROP TRIGGER d15_update_trig ON part_d_15_20; +DROP TRIGGER d15_insert_trig ON part_d_15_20; + + +-- Creating default partition for range +:init_range_parted; +create table part_def partition of range_parted default; +\d+ part_def +insert into range_parted values ('c', 9); +-- ok +update part_def set a = 'd' where a = 'c'; +-- fail +update part_def set a = 'a' where a = 'd'; + +:show_data; + +-- Update row movement from non-default to default partition. +-- fail, default partition is not under part_a_10_a_20; +UPDATE part_a_10_a_20 set a = 'ad' WHERE a = 'a'; +-- ok +UPDATE range_parted set a = 'ad' WHERE a = 'a'; +UPDATE range_parted set a = 'bd' WHERE a = 'b'; +:show_data; +-- Update row movement from default to non-default partitions. +-- ok +UPDATE range_parted set a = 'a' WHERE a = 'ad'; +UPDATE range_parted set a = 'b' WHERE a = 'bd'; +:show_data; + +-- Cleanup: range_parted no longer needed. +DROP TABLE range_parted; + +CREATE TABLE list_parted ( + a text, + b int +) PARTITION BY list (a); +CREATE TABLE list_part1 PARTITION OF list_parted for VALUES in ('a', 'b'); +CREATE TABLE list_default PARTITION OF list_parted default; +INSERT into list_part1 VALUES ('a', 1); +INSERT into list_default VALUES ('d', 10); + +-- fail +UPDATE list_default set a = 'a' WHERE a = 'd'; +-- ok +UPDATE list_default set a = 'x' WHERE a = 'd'; + +DROP TABLE list_parted; + +-- Test retrieval of system columns with non-consistent partition row types. +-- This is only partially supported, as seen in the results. + +create table utrtest (a int, b text) partition by list (a); +create table utr1 (a int check (a in (1)), q text, b text); +create table utr2 (a int check (a in (2)), b text); +alter table utr1 drop column q; +alter table utrtest attach partition utr1 for values in (1); +alter table utrtest attach partition utr2 for values in (2); + +insert into utrtest values (1, 'foo') + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; +insert into utrtest values (2, 'bar') + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; -- fails +insert into utrtest values (2, 'bar') + returning *, tableoid::regclass; + +update utrtest set b = b || b from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; + +update utrtest set a = 3 - a from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass, xmin = pg_current_xact_id()::xid as xmin_ok; -- fails + +update utrtest set a = 3 - a from (values (1), (2)) s(x) where a = s.x + returning *, tableoid::regclass; + +delete from utrtest + returning *, tableoid::regclass, xmax = pg_current_xact_id()::xid as xmax_ok; + +drop table utrtest; + + +-------------- +-- Some more update-partition-key test scenarios below. This time use list +-- partitions. +-------------- + +-- Setup for list partitions +CREATE TABLE list_parted (a numeric, b int, c int8) PARTITION BY list (a); +CREATE TABLE sub_parted PARTITION OF list_parted for VALUES in (1) PARTITION BY list (b); + +CREATE TABLE sub_part1(b int, c int8, a numeric); +ALTER TABLE sub_parted ATTACH PARTITION sub_part1 for VALUES in (1); +CREATE TABLE sub_part2(b int, c int8, a numeric); +ALTER TABLE sub_parted ATTACH PARTITION sub_part2 for VALUES in (2); + +CREATE TABLE list_part1(a numeric, b int, c int8); +ALTER TABLE list_parted ATTACH PARTITION list_part1 for VALUES in (2,3); + +INSERT into list_parted VALUES (2,5,50); +INSERT into list_parted VALUES (3,6,60); +INSERT into sub_parted VALUES (1,1,60); +INSERT into sub_parted VALUES (1,2,10); + +-- Test partition constraint violation when intermediate ancestor is used and +-- constraint is inherited from upper root. +UPDATE sub_parted set a = 2 WHERE c = 10; + +-- Test update-partition-key, where the unpruned partitions do not have their +-- partition keys updated. +SELECT tableoid::regclass::text, * FROM list_parted WHERE a = 2 ORDER BY 1; +UPDATE list_parted set b = c + a WHERE a = 2; +SELECT tableoid::regclass::text, * FROM list_parted WHERE a = 2 ORDER BY 1; + + +-- Test the case where BR UPDATE triggers change the partition key. +CREATE FUNCTION func_parted_mod_b() returns trigger as $$ +BEGIN + NEW.b = 2; -- This is changing partition key column. + return NEW; +END $$ LANGUAGE plpgsql; +CREATE TRIGGER parted_mod_b before update on sub_part1 + for each row execute procedure func_parted_mod_b(); + +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; + +-- This should do the tuple routing even though there is no explicit +-- partition-key update, because there is a trigger on sub_part1. +UPDATE list_parted set c = 70 WHERE b = 1; +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; + +DROP TRIGGER parted_mod_b ON sub_part1; + +-- If BR DELETE trigger prevented DELETE from happening, we should also skip +-- the INSERT if that delete is part of UPDATE=>DELETE+INSERT. +CREATE OR REPLACE FUNCTION func_parted_mod_b() returns trigger as $$ +BEGIN + raise notice 'Trigger: Got OLD row %, but returning NULL', OLD; + return NULL; +END $$ LANGUAGE plpgsql; +CREATE TRIGGER trig_skip_delete before delete on sub_part2 + for each row execute procedure func_parted_mod_b(); +UPDATE list_parted set b = 1 WHERE c = 70; +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; +-- Drop the trigger. Now the row should be moved. +DROP TRIGGER trig_skip_delete ON sub_part2; +UPDATE list_parted set b = 1 WHERE c = 70; +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; +DROP FUNCTION func_parted_mod_b(); + +-- UPDATE partition-key with FROM clause. If join produces multiple output +-- rows for the same row to be modified, we should tuple-route the row only +-- once. There should not be any rows inserted. +CREATE TABLE non_parted (id int); +INSERT into non_parted VALUES (1), (1), (1), (2), (2), (2), (3), (3), (3); +UPDATE list_parted t1 set a = 2 FROM non_parted t2 WHERE t1.a = t2.id and a = 1; +SELECT tableoid::regclass::text, * FROM list_parted ORDER BY 1, 2, 3, 4; +DROP TABLE non_parted; + +-- Cleanup: list_parted no longer needed. +DROP TABLE list_parted; + +-- create custom operator class and hash function, for the same reason +-- explained in alter_table.sql +create or replace function dummy_hashint4(a int4, seed int8) returns int8 as +$$ begin return (a + seed); end; $$ language 'plpgsql' immutable; +create operator class custom_opclass for type int4 using hash as +operator 1 = , function 2 dummy_hashint4(int4, int8); + +create table hash_parted ( + a int, + b int +) partition by hash (a custom_opclass, b custom_opclass); +create table hpart1 partition of hash_parted for values with (modulus 2, remainder 1); +create table hpart2 partition of hash_parted for values with (modulus 4, remainder 2); +create table hpart3 partition of hash_parted for values with (modulus 8, remainder 0); +create table hpart4 partition of hash_parted for values with (modulus 8, remainder 4); +insert into hpart1 values (1, 1); +insert into hpart2 values (2, 5); +insert into hpart4 values (3, 4); + +-- fail +update hpart1 set a = 3, b=4 where a = 1; +-- ok, row movement +update hash_parted set b = b - 1 where b = 1; +-- ok +update hash_parted set b = b + 8 where b = 1; + +-- cleanup +drop table hash_parted; +drop operator class custom_opclass using hash; +drop function dummy_hashint4(a int4, seed int8); diff --git a/src/test/singlenode_regress/sql/update_gp.sql b/src/test/singlenode_regress/sql/update_gp.sql new file mode 100644 index 00000000000..da578b3cdc8 --- /dev/null +++ b/src/test/singlenode_regress/sql/update_gp.sql @@ -0,0 +1,383 @@ +-- Test DELETE and UPDATE on an inherited table. +-- The special aspect of this table is that the inherited table has +-- a different distribution key. 'p' table's distribution key matches +-- that of 'r', but 'p2's doesn't. Test that the planner adds a Motion +-- node correctly for p2. +create table todelete (a int); +create table parent (a int, b int, c int); +create table child (a int, b int, c int) inherits (parent); + +insert into parent select g, g, g from generate_series(1,5) g; +insert into child select g, g, g from generate_series(6,10) g; + +insert into todelete select generate_series(3,4); + +delete from parent using todelete where parent.a = todelete.a; + +insert into todelete select generate_series(5,7); + +update parent set c=c+100 from todelete where parent.a = todelete.a; + +select * from parent; + +drop table todelete; +drop table child; +drop table parent; + +-- This is similar to the above, but with a partitioned table (which is +-- implemented by inheritance) rather than an explicitly inherited table. +-- The scans on some of the partitions degenerate into Result nodes with +-- False one-time filter, which don't need a Motion node. +create table todelete (a int, b int); +create table target (a int, b int, c int) + partition by range (c) (start(1) end(5) every(1), default partition extra); + +insert into todelete select g, g % 4 from generate_series(1, 10) g; +insert into target select g, 0, 3 from generate_series(1, 5) g; +insert into target select g, 0, 1 from generate_series(1, 5) g; + +delete from target where c = 3 and a in (select b from todelete); + +insert into todelete values (1, 5); + +update target set b=target.b+100 where c = 3 and a in (select b from todelete); + +select * from target; + +-- Also test an update with a qual that doesn't match any partition. The +-- Append degenerates into a dummy Result with false One-Time Filter. +alter table target drop default partition; +update target set b = 10 where c = 10; + +drop table todelete; +drop table target; + +-- +-- Test updated on inheritance parent table, where some child tables need a +-- Split Update, but not all. +-- +create table base_tbl (a int4, b int4); +create table child_a (a int4, b int4) inherits (base_tbl); +create table child_b (a int4, b int4) inherits (base_tbl); +insert into base_tbl select g, g from generate_series(1, 5) g; + +explain (costs off) update base_tbl set a=a+1; +update base_tbl set a = 5; + +-- +-- Explicit Distribution motion must be added if any of the child nodes +-- contains any motion excluding the motions in initplans. +-- These test cases and expectation are applicable for GPDB planner not for ORCA. +-- +SET gp_autostats_mode = NONE; +CREATE TABLE keo1 ( user_vie_project_code_pk character varying(24), user_vie_fiscal_year_period_sk character varying(24), user_vie_act_cntr_marg_cum character varying(24)); +INSERT INTO keo1 VALUES ('1', '1', '1'); + +CREATE TABLE keo2 ( projects_pk character varying(24)); +INSERT INTO keo2 VALUES ('1'); + +CREATE TABLE keo3 ( sky_per character varying(24), bky_per character varying(24)); +INSERT INTO keo3 VALUES ('1', '1'); + +CREATE TABLE keo4 ( keo_para_required_period character varying(6), keo_para_budget_date character varying(24)); +INSERT INTO keo4 VALUES ('1', '1'); +ANALYZE keo1, keo2, keo3, keo4; +-- Explicit Redistribution motion should be added in case of GPDB Planner (test case not applicable for ORCA) +EXPLAIN (COSTS OFF) UPDATE keo1 SET user_vie_act_cntr_marg_cum = 234.682 FROM + ( SELECT a.user_vie_project_code_pk FROM keo1 a INNER JOIN keo2 b + ON b.projects_pk=a.user_vie_project_code_pk + WHERE a.user_vie_fiscal_year_period_sk = + (SELECT MAX (sky_per) FROM keo3 WHERE bky_per = + (SELECT keo4.keo_para_required_period FROM keo4 WHERE keo_para_budget_date = + (SELECT min (keo4.keo_para_budget_date) FROM keo4))) + ) t1 +WHERE t1.user_vie_project_code_pk = keo1.user_vie_project_code_pk; +UPDATE keo1 SET user_vie_act_cntr_marg_cum = 234.682 FROM + ( SELECT a.user_vie_project_code_pk FROM keo1 a INNER JOIN keo2 b + ON b.projects_pk=a.user_vie_project_code_pk + WHERE a.user_vie_fiscal_year_period_sk = + (SELECT MAX (sky_per) FROM keo3 WHERE bky_per = + (SELECT keo4.keo_para_required_period FROM keo4 WHERE keo_para_budget_date = + (SELECT min (keo4.keo_para_budget_date) FROM keo4))) + ) t1 +WHERE t1.user_vie_project_code_pk = keo1.user_vie_project_code_pk; +SELECT user_vie_act_cntr_marg_cum FROM keo1; + +-- Explicit Redistribution motion should not be added in case of GPDB Planner (test case not applicable to ORCA) +CREATE TABLE keo5 (x int, y int); +INSERT INTO keo5 VALUES (1,1); +EXPLAIN (COSTS OFF) DELETE FROM keo5 WHERE x IN (SELECT x FROM keo5 WHERE EXISTS (SELECT x FROM keo5 WHERE x < 2)); +DELETE FROM keo5 WHERE x IN (SELECT x FROM keo5 WHERE EXISTS (SELECT x FROM keo5 WHERE x < 2)); +SELECT x FROM keo5; + +RESET gp_autostats_mode; +DROP TABLE keo1; +DROP TABLE keo2; +DROP TABLE keo3; +DROP TABLE keo4; +DROP TABLE keo5; + +-- +-- text types. We should support the following updates. +-- + +CREATE TEMP TABLE ttab1 (a varchar(15), b integer); +CREATE TEMP TABLE ttab2 (a varchar(15), b integer); + +UPDATE ttab1 SET b = ttab2.b FROM ttab2 WHERE ttab1.a = ttab2.a; + +DROP TABLE ttab1; +DROP TABLE ttab2; + + +CREATE TEMP TABLE ttab1 (a text, b integer); +CREATE TEMP TABLE ttab2 (a text, b integer); + +UPDATE ttab1 SET b = ttab2.b FROM ttab2 WHERE ttab1.a = ttab2.a; + + +DROP TABLE ttab1; +DROP TABLE ttab2; + +CREATE TEMP TABLE ttab1 (a varchar, b integer); +CREATE TEMP TABLE ttab2 (a varchar, b integer); + +UPDATE ttab1 SET b = ttab2.b FROM ttab2 WHERE ttab1.a = ttab2.a; + + +DROP TABLE ttab1; +DROP TABLE ttab2; + +CREATE TEMP TABLE ttab1 (a char(15), b integer); +CREATE TEMP TABLE ttab2 (a char(15), b integer); + +UPDATE ttab1 SET b = ttab2.b FROM ttab2 WHERE ttab1.a = ttab2.a; + +DROP TABLE IF EXISTS update_distr_key; + +CREATE TEMP TABLE update_distr_key (a int, b int); +INSERT INTO update_distr_key select i, i* 10 from generate_series(0, 9) i; + +UPDATE update_distr_key SET a = 5 WHERE b = 10; + +SELECT * from update_distr_key; + +DROP TABLE update_distr_key; + +-- below cases is to test multi-hash-cols +CREATE TABLE tab3(c1 int, c2 int, c3 int, c4 int, c5 int); +CREATE TABLE tab5(c1 int, c2 int, c3 int, c4 int, c5 int); + +INSERT INTO tab3 SELECT i, i, i, i, i FROM generate_series(1, 10)i; +INSERT INTO tab5 SELECT i, i, i, i, i FROM generate_series(1, 10)i; + +-- test tab3 +SELECT gp_segment_id, * FROM tab3; +UPDATE tab3 set c1 = 9 where c4 = 1; +SELECT gp_segment_id, * FROM tab3; +UPDATE tab3 set (c1,c2) = (5,6) where c4 = 1; +SELECT gp_segment_id, * FROM tab3; +UPDATE tab3 set (c1,c2,c3) = (3,2,1) where c4 = 1; +SELECT gp_segment_id, * FROM tab3; +UPDATE tab3 set c1 = 11 where c2 = 10 and c2 < 1; +SELECT gp_segment_id, * FROM tab3; + +-- test tab5 +SELECT gp_segment_id, * FROM tab5; +UPDATE tab5 set c1 = 1000 where c4 = 1; +SELECT gp_segment_id, * FROM tab5; +UPDATE tab5 set (c1,c2) = (9,10) where c4 = 1; +SELECT gp_segment_id, * FROM tab5; +UPDATE tab5 set (c1,c2,c4) = (5,8,6) where c4 = 1; +SELECT gp_segment_id, * FROM tab5; +UPDATE tab5 set (c1,c2,c3,c4,c5) = (1,2,3,0,6) where c5 = 1; +SELECT gp_segment_id, * FROM tab5; +UPDATE tab5 set c1 = 11 where c3 = 10 and c3 < 1; +SELECT gp_segment_id, * FROM tab5; + +EXPLAIN (COSTS OFF ) UPDATE tab3 SET C1 = C1 + 1, C5 = C5+1; + +-- clean up +drop table tab3; +drop table tab5; + +-- Update distribution key + +-- start_ignore +drop table if exists r; +drop table if exists s; +drop table if exists update_dist; +drop table if exists update_ao_table; +drop table if exists update_aoco_table; +-- end_ignore + +-- Update normal table distribution key +create table update_dist(a int); +insert into update_dist values(1); +update update_dist set a=0 where a=1; +select * from update_dist; + +-- Update distribution key with join + +create table r (a int, b int); +create table s (a int, b int); +insert into r select generate_series(1, 5), generate_series(1, 5) * 2; +insert into s select generate_series(1, 5), generate_series(1, 5) * 2; +select * from r; +select * from s; +update r set a = r.a + 1 from s where r.a = s.a; +select * from r; +update r set a = r.a + 1 where a in (select a from s); +select * from r; + +-- Update redistribution +delete from r; +delete from s; +insert into r select generate_series(1, 5), generate_series(1, 5); +insert into s select generate_series(1, 5), generate_series(1, 5) * 2; +select * from r; +select * from s; +update r set a = r.a + 1 from s where r.b = s.b; +select * from r; +update r set a = r.a + 1 where b in (select b from s); +select * from r; + +-- Update hash aggreate group by +delete from r; +delete from s; +insert into r select generate_series(1, 5), generate_series(1, 5) * 2; +insert into s select generate_series(1, 5), generate_series(1, 5); +select * from r; +select * from s; +update s set a = s.a + 1 where exists (select 1 from r where s.a = r.b); +select * from s; + +-- Update ao table distribution key +create table update_ao_table (a int, b int) WITH (appendonly=true); +insert into update_ao_table select g, g from generate_series(1, 5) g; +select * from update_ao_table; +update update_ao_table set a = a + 1 where b = 3; +select * from update_ao_table; + +-- Update aoco table distribution key +create table update_aoco_table (a int, b int) WITH (appendonly=true, orientation=column); +insert into update_aoco_table select g,g from generate_series(1, 5) g; +select * from update_aoco_table; +update update_aoco_table set a = a + 1 where b = 3; +select * from update_aoco_table; + +-- Update prepare +delete from s; +insert into s select generate_series(1, 5), generate_series(1, 5); +select * from r; +select * from s; +prepare update_s(int) as update s set a = s.a + $1 where exists (select 1 from r where s.a = r.b); +execute update_s(10); +select * from s; + +-- Confirm that a split update is not created for a table excluded by +-- constraints in the planner. +create table nosplitupdate (a int); +explain update nosplitupdate set a=0 where a=1 and a<1; + +-- test split-update when split-node's flow is entry +create table tsplit_entry (c int); +insert into tsplit_entry values (1), (2); +analyze tsplit_entry; + +-- start_ignore +-- gp_segment_configuration scan is different when using different FTS +explain update tsplit_entry set c = s.a from (select count(*) as a from gp_segment_configuration) s; +-- end_ignore +update tsplit_entry set c = s.a from (select count(*) as a from gp_segment_configuration) s; + +CREATE TABLE update_gp_foo ( + a_dist int, + b int, + c_part int, + d int +) +WITH (appendonly=false) PARTITION BY RANGE(c_part) + ( + PARTITION p20190305 START (1) END (2) WITH (tablename='update_gp_foo_1_prt_p20190305', appendonly=false) + ); + +CREATE TABLE update_gp_foo1 ( + a_dist int, + b int, + c_part int, + d int +) +WITH (appendonly=false) PARTITION BY RANGE(c_part) + ( + PARTITION p20190305 START (1) END (2) WITH (tablename='update_gp_foo1_1_prt_p20190305', appendonly=false) + ); + +INSERT INTO update_gp_foo VALUES (12, 40, 1, 50); +INSERT INTO update_gp_foo1 VALUES (12, 3, 1, 50); + +UPDATE update_gp_foo +SET b = update_gp_foo.c_part, + d = update_gp_foo1.a_dist +FROM update_gp_foo1; + +SELECT * from update_gp_foo; + +-- Test insert on conflict do update +-- Insert on conflict do update is an insert statement but might +-- invoke ExecUpdate on segments, but updating distkeys of a table +-- may lead to wrong data distribution. We will check this before +-- planning, if a `insert on conflict do update` statement set the +-- dist keys of the table, it will raise an error. +-- See github issue: https://github.com/greenplum-db/gpdb/issues/9444 +create table t_insert_on_conflict_update_distkey(a int, b int); +create unique index uidx_t_insert_on_conflict_update_distkey on t_insert_on_conflict_update_distkey(a, b); + +-- the following statement should error out because the on conflict update want to +-- modify the tuple's distkey which might lead to wrong data distribution +insert into t_insert_on_conflict_update_distkey values (1, 1) on conflict(a, b) do update set a = 1; + +drop index uidx_t_insert_on_conflict_update_distkey; +drop table t_insert_on_conflict_update_distkey; +-- randomly distributed table cannot add unique constrain, so next we test replicated table + +create table t_insert_on_conflict_update_distkey(a int, b int); +create unique index uidx_t_insert_on_conflict_update_distkey on t_insert_on_conflict_update_distkey(a, b); +-- the following statement should succeed because replicated table does not contain distkey +insert into t_insert_on_conflict_update_distkey values (1, 1) on conflict(a, b) do update set a = 1; + +-- Some tests on a partitioned table. +CREATE TABLE update_gp_rangep (a int, b int, orig_a int) PARTITION BY RANGE (a); + +CREATE TABLE update_gp_rangep_1_to_10 PARTITION OF update_gp_rangep FOR VALUES FROM (1) TO (10); +CREATE TABLE update_gp_rangep_10_to_20 PARTITION OF update_gp_rangep FOR VALUES FROM (10) TO (20); + +INSERT INTO update_gp_rangep SELECT g, g, g FROM generate_series(1, 4) g; + +-- Simple case: Same partition, same node. +UPDATE update_gp_rangep SET a = 9 WHERE a = 1; + +-- Distribution key update, same partition. +UPDATE update_gp_rangep SET b = 1 WHERE a = 2; + +-- Move row to different partition, but no change in distribution key +UPDATE update_gp_rangep SET a = 10 WHERE a = 3; + +-- Move row to different partition and also change distribution key +UPDATE update_gp_rangep SET a = 11, b = 1 WHERE a = 4; + +SELECT tableoid::regclass, * FROM update_gp_rangep ORDER BY orig_a; +-- Also do a lookup with specific distribution key. If the rows were not +-- correctly moved across segments, this would fail to find them, assuming +-- that direct dispatch is effective. +SELECT tableoid::regclass, * FROM update_gp_rangep WHERE b = 1; + +-- start_ignore +drop table r; +drop table s; +drop table update_dist; +drop table update_ao_table; +drop table update_aoco_table; +drop table nosplitupdate; +drop table tsplit_entry; +-- end_ignore diff --git a/src/test/singlenode_regress/sql/uuid.sql b/src/test/singlenode_regress/sql/uuid.sql new file mode 100644 index 00000000000..3bd3b357c77 --- /dev/null +++ b/src/test/singlenode_regress/sql/uuid.sql @@ -0,0 +1,85 @@ +-- regression test for the uuid datatype +-- creating test tables +CREATE TABLE guid1 +( + guid_field UUID, + text_field TEXT DEFAULT(now()) +); +CREATE TABLE guid2 +( + guid_field UUID, + text_field TEXT DEFAULT(now()) +); + +-- inserting invalid data tests +-- too long +INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111F'); +-- too short +INSERT INTO guid1(guid_field) VALUES('{11111111-1111-1111-1111-11111111111}'); +-- valid data but invalid format +INSERT INTO guid1(guid_field) VALUES('111-11111-1111-1111-1111-111111111111'); +INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222 '); +-- invalid data +INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-G111-111111111111'); +INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-1111-111111111111'); + +--inserting three input formats +INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111'); +INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}'); +INSERT INTO guid1(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e'); + +-- retrieving the inserted data +SELECT guid_field FROM guid1; + +-- ordering test +SELECT guid_field FROM guid1 ORDER BY guid_field ASC; +SELECT guid_field FROM guid1 ORDER BY guid_field DESC; + +-- = operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field = '3f3e3c3b-3a30-3938-3736-353433a2313e'; + +-- <> operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field <> '11111111111111111111111111111111'; + +-- < operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field < '22222222-2222-2222-2222-222222222222'; + +-- <= operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field <= '22222222-2222-2222-2222-222222222222'; + +-- > operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field > '22222222-2222-2222-2222-222222222222'; + +-- >= operator test +SELECT COUNT(*) FROM guid1 WHERE guid_field >= '22222222-2222-2222-2222-222222222222'; + +-- btree and hash index creation test +CREATE INDEX guid1_btree ON guid1 USING BTREE (guid_field); +CREATE INDEX guid1_hash ON guid1 USING HASH (guid_field); + +-- unique index test +CREATE UNIQUE INDEX guid1_unique_BTREE ON guid1 USING BTREE (guid_field); +-- should fail +INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111'); + +-- check to see whether the new indexes are actually there +SELECT count(*) FROM pg_class WHERE relkind='i' AND relname LIKE 'guid%'; + +-- populating the test tables with additional records +INSERT INTO guid1(guid_field) VALUES('44444444-4444-4444-4444-444444444444'); +INSERT INTO guid2(guid_field) VALUES('11111111-1111-1111-1111-111111111111'); +INSERT INTO guid2(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}'); +INSERT INTO guid2(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e'); + +-- join test +SELECT COUNT(*) FROM guid1 g1 INNER JOIN guid2 g2 ON g1.guid_field = g2.guid_field; +SELECT COUNT(*) FROM guid1 g1 LEFT JOIN guid2 g2 ON g1.guid_field = g2.guid_field WHERE g2.guid_field IS NULL; + +-- generation test +TRUNCATE guid1; +INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid()); +INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid()); +SELECT count(DISTINCT guid_field) FROM guid1; + +-- clean up +DROP TABLE guid1, guid2 CASCADE; diff --git a/src/test/singlenode_regress/sql/vacuum.sql b/src/test/singlenode_regress/sql/vacuum.sql new file mode 100644 index 00000000000..9faa8a34a6a --- /dev/null +++ b/src/test/singlenode_regress/sql/vacuum.sql @@ -0,0 +1,320 @@ +-- +-- VACUUM +-- + +CREATE TABLE vactst (i INT); +INSERT INTO vactst VALUES (1); +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst VALUES (0); +SELECT count(*) FROM vactst; +DELETE FROM vactst WHERE i != 0; +SELECT * FROM vactst; +VACUUM FULL vactst; +UPDATE vactst SET i = i + 1; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst SELECT * FROM vactst; +INSERT INTO vactst VALUES (0); +SELECT count(*) FROM vactst; +DELETE FROM vactst WHERE i != 0; +VACUUM (FULL) vactst; +DELETE FROM vactst; +SELECT * FROM vactst; + +VACUUM (FULL, FREEZE) vactst; +VACUUM (ANALYZE, FULL) vactst; + +CREATE TABLE vaccluster (i INT PRIMARY KEY); +ALTER TABLE vaccluster CLUSTER ON vaccluster_pkey; +CLUSTER vaccluster; + +CREATE FUNCTION do_analyze() RETURNS VOID VOLATILE LANGUAGE SQL + AS 'ANALYZE pg_am'; +CREATE FUNCTION wrap_do_analyze(c INT) RETURNS INT IMMUTABLE LANGUAGE SQL + AS 'SELECT $1 FROM do_analyze()'; +CREATE INDEX ON vaccluster(wrap_do_analyze(i)); +INSERT INTO vaccluster VALUES (1), (2); +ANALYZE vaccluster; + +-- Test ANALYZE in transaction, where the transaction surrounding +-- analyze performed modifications. This tests for the bug at +-- https://postgr.es/m/c7988239-d42c-ddc4-41db-171b23b35e4f%40ssinger.info +-- (which hopefully is unlikely to be reintroduced), but also seems +-- independently worthwhile to cover. +INSERT INTO vactst SELECT generate_series(1, 300); +DELETE FROM vactst WHERE i % 7 = 0; -- delete a few rows outside +BEGIN; +INSERT INTO vactst SELECT generate_series(301, 400); +DELETE FROM vactst WHERE i % 5 <> 0; -- delete a few rows inside +ANALYZE vactst; +COMMIT; + +VACUUM FULL pg_am; +VACUUM FULL pg_class; +VACUUM FULL pg_database; +VACUUM FULL vaccluster; +VACUUM FULL vactst; + +VACUUM (DISABLE_PAGE_SKIPPING) vaccluster; + +-- PARALLEL option +CREATE TABLE pvactst (i INT, a INT[], p POINT) with (autovacuum_enabled = off); +INSERT INTO pvactst SELECT i, array[1,2,3], point(i, i+1) FROM generate_series(1,1000) i; +CREATE INDEX btree_pvactst ON pvactst USING btree (i); +CREATE INDEX hash_pvactst ON pvactst USING hash (i); +CREATE INDEX brin_pvactst ON pvactst USING brin (i); +CREATE INDEX gin_pvactst ON pvactst USING gin (a); +CREATE INDEX gist_pvactst ON pvactst USING gist (p); +CREATE INDEX spgist_pvactst ON pvactst USING spgist (p); + +-- VACUUM invokes parallel index cleanup +SET min_parallel_index_scan_size to 0; +VACUUM (PARALLEL 2) pvactst; + +-- VACUUM invokes parallel bulk-deletion +UPDATE pvactst SET i = i WHERE i < 1000; +VACUUM (PARALLEL 2) pvactst; + +UPDATE pvactst SET i = i WHERE i < 1000; +VACUUM (PARALLEL 0) pvactst; -- disable parallel vacuum + +VACUUM (PARALLEL -1) pvactst; -- error +VACUUM (PARALLEL 2, INDEX_CLEANUP FALSE) pvactst; +VACUUM (PARALLEL 2, FULL TRUE) pvactst; -- error, cannot use both PARALLEL and FULL +VACUUM (PARALLEL) pvactst; -- error, cannot use PARALLEL option without parallel degree + +-- Test different combinations of parallel and full options for temporary tables +CREATE TEMPORARY TABLE tmp (a int PRIMARY KEY); +CREATE INDEX tmp_idx1 ON tmp (a); +VACUUM (PARALLEL 1, FULL FALSE) tmp; -- parallel vacuum disabled for temp tables +VACUUM (PARALLEL 0, FULL TRUE) tmp; -- can specify parallel disabled (even though that's implied by FULL) +RESET min_parallel_index_scan_size; +DROP TABLE pvactst; + +-- INDEX_CLEANUP option +CREATE TABLE no_index_cleanup (i INT PRIMARY KEY, t TEXT); +-- Use uncompressed data stored in toast. +CREATE INDEX no_index_cleanup_idx ON no_index_cleanup(t); +ALTER TABLE no_index_cleanup ALTER COLUMN t SET STORAGE EXTERNAL; +INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(1,30), + repeat('1234567890',269)); +-- index cleanup option is ignored if VACUUM FULL +VACUUM (INDEX_CLEANUP TRUE, FULL TRUE) no_index_cleanup; +VACUUM (FULL TRUE) no_index_cleanup; +-- Toast inherits the value from its parent table. +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = false); +DELETE FROM no_index_cleanup WHERE i < 15; +-- Nothing is cleaned up. +VACUUM no_index_cleanup; +-- Both parent relation and toast are cleaned up. +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = true); +VACUUM no_index_cleanup; +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = auto); +VACUUM no_index_cleanup; +-- Parameter is set for both the parent table and its toast relation. +INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(31,60), + repeat('1234567890',269)); +DELETE FROM no_index_cleanup WHERE i < 45; +-- Only toast index is cleaned up. +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = off, + toast.vacuum_index_cleanup = yes); +VACUUM no_index_cleanup; +-- Only parent is cleaned up. +ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = true, + toast.vacuum_index_cleanup = false); +VACUUM no_index_cleanup; +-- Test some extra relations. +VACUUM (INDEX_CLEANUP FALSE) vaccluster; +VACUUM (INDEX_CLEANUP AUTO) vactst; -- index cleanup option is ignored if no indexes +VACUUM (INDEX_CLEANUP FALSE, FREEZE TRUE) vaccluster; + +-- TRUNCATE option +CREATE TEMP TABLE vac_truncate_test(i INT NOT NULL, j text) + WITH (vacuum_truncate=true, autovacuum_enabled=false); +INSERT INTO vac_truncate_test VALUES (1, NULL), (NULL, NULL); +VACUUM (TRUNCATE FALSE, DISABLE_PAGE_SKIPPING) vac_truncate_test; +SELECT pg_relation_size('vac_truncate_test') > 0; +VACUUM (DISABLE_PAGE_SKIPPING) vac_truncate_test; +SELECT pg_relation_size('vac_truncate_test') = 0; +VACUUM (TRUNCATE FALSE, FULL TRUE) vac_truncate_test; +DROP TABLE vac_truncate_test; + +-- partitioned table +CREATE TABLE vacparted (a int, b char) PARTITION BY LIST (a); +CREATE TABLE vacparted1 PARTITION OF vacparted FOR VALUES IN (1); +INSERT INTO vacparted VALUES (1, 'a'); +UPDATE vacparted SET b = 'b'; +VACUUM (ANALYZE) vacparted; +VACUUM (FULL) vacparted; +VACUUM (FREEZE) vacparted; + +-- check behavior with duplicate column mentions +VACUUM ANALYZE vacparted(a,b,a); +ANALYZE vacparted(a,b,b); + +-- partitioned table with index +CREATE TABLE vacparted_i (a int primary key, b varchar(100)) + PARTITION BY HASH (a); +CREATE TABLE vacparted_i1 PARTITION OF vacparted_i + FOR VALUES WITH (MODULUS 2, REMAINDER 0); +CREATE TABLE vacparted_i2 PARTITION OF vacparted_i + FOR VALUES WITH (MODULUS 2, REMAINDER 1); +INSERT INTO vacparted_i SELECT i, 'test_'|| i from generate_series(1,10) i; +VACUUM (ANALYZE) vacparted_i; +VACUUM (FULL) vacparted_i; +VACUUM (FREEZE) vacparted_i; +SELECT relname, relhasindex FROM pg_class + WHERE relname LIKE 'vacparted_i%' AND relkind IN ('p','r') + ORDER BY relname; +DROP TABLE vacparted_i; + +-- multiple tables specified +VACUUM vaccluster, vactst; +VACUUM vacparted, does_not_exist; +VACUUM (FREEZE) vacparted, vaccluster, vactst; +VACUUM (FREEZE) does_not_exist, vaccluster; +VACUUM ANALYZE vactst, vacparted (a); +VACUUM ANALYZE vactst (does_not_exist), vacparted (b); +VACUUM FULL vacparted, vactst; +VACUUM FULL vactst, vacparted (a, b), vaccluster (i); +ANALYZE vactst, vacparted; +ANALYZE vacparted (b), vactst; +ANALYZE vactst, does_not_exist, vacparted; +ANALYZE vactst (i), vacparted (does_not_exist); +ANALYZE vactst, vactst; +BEGIN; -- ANALYZE behaves differently inside a transaction block +ANALYZE vactst, vactst; +COMMIT; + +-- parenthesized syntax for ANALYZE +ANALYZE (VERBOSE) does_not_exist; +ANALYZE (nonexistent-arg) does_not_exist; +ANALYZE (nonexistentarg) does_not_exit; + +-- ensure argument order independence, and that SKIP_LOCKED on non-existing +-- relation still errors out. Suppress WARNING messages caused by concurrent +-- autovacuums. +SET client_min_messages TO 'ERROR'; +ANALYZE (SKIP_LOCKED, VERBOSE) does_not_exist; +ANALYZE (VERBOSE, SKIP_LOCKED) does_not_exist; + +-- SKIP_LOCKED option +VACUUM (SKIP_LOCKED) vactst; +VACUUM (SKIP_LOCKED, FULL) vactst; +ANALYZE (SKIP_LOCKED) vactst; +RESET client_min_messages; + +-- ensure VACUUM and ANALYZE don't have a problem with serializable +SET default_transaction_isolation = serializable; +VACUUM vactst; +ANALYZE vactst; +RESET default_transaction_isolation; +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +ANALYZE vactst; +COMMIT; + +-- PROCESS_TOAST option +ALTER TABLE vactst ADD COLUMN t TEXT; +ALTER TABLE vactst ALTER COLUMN t SET STORAGE EXTERNAL; +VACUUM (PROCESS_TOAST FALSE) vactst; +VACUUM (PROCESS_TOAST FALSE, FULL) vactst; + +DROP TABLE vaccluster; +DROP TABLE vactst; +DROP TABLE vacparted; +DROP TABLE no_index_cleanup; + +-- relation ownership, WARNING logs generated as all are skipped. +CREATE TABLE vacowned (a int); +CREATE TABLE vacowned_parted (a int) PARTITION BY LIST (a); +CREATE TABLE vacowned_part1 PARTITION OF vacowned_parted FOR VALUES IN (1); +CREATE TABLE vacowned_part2 PARTITION OF vacowned_parted FOR VALUES IN (2); +CREATE ROLE regress_vacuum; +SET ROLE regress_vacuum; +-- Simple table +VACUUM vacowned; +ANALYZE vacowned; +VACUUM (ANALYZE) vacowned; +-- Catalog +VACUUM pg_catalog.pg_class; +ANALYZE pg_catalog.pg_class; +VACUUM (ANALYZE) pg_catalog.pg_class; +-- Shared catalog +VACUUM pg_catalog.pg_authid; +ANALYZE pg_catalog.pg_authid; +VACUUM (ANALYZE) pg_catalog.pg_authid; +-- Partitioned table and its partitions, nothing owned by other user. +-- Relations are not listed in a single command to test ownership +-- independently. +VACUUM vacowned_parted; +VACUUM vacowned_part1; +VACUUM vacowned_part2; +ANALYZE vacowned_parted; +ANALYZE vacowned_part1; +ANALYZE vacowned_part2; +VACUUM (ANALYZE) vacowned_parted; +VACUUM (ANALYZE) vacowned_part1; +VACUUM (ANALYZE) vacowned_part2; +RESET ROLE; +-- Partitioned table and one partition owned by other user. +ALTER TABLE vacowned_parted OWNER TO regress_vacuum; +ALTER TABLE vacowned_part1 OWNER TO regress_vacuum; +SET ROLE regress_vacuum; +VACUUM vacowned_parted; +VACUUM vacowned_part1; +VACUUM vacowned_part2; +ANALYZE vacowned_parted; +ANALYZE vacowned_part1; +ANALYZE vacowned_part2; +VACUUM (ANALYZE) vacowned_parted; +VACUUM (ANALYZE) vacowned_part1; +VACUUM (ANALYZE) vacowned_part2; +RESET ROLE; +-- Only one partition owned by other user. +ALTER TABLE vacowned_parted OWNER TO CURRENT_USER; +SET ROLE regress_vacuum; +VACUUM vacowned_parted; +VACUUM vacowned_part1; +VACUUM vacowned_part2; +ANALYZE vacowned_parted; +ANALYZE vacowned_part1; +ANALYZE vacowned_part2; +VACUUM (ANALYZE) vacowned_parted; +VACUUM (ANALYZE) vacowned_part1; +VACUUM (ANALYZE) vacowned_part2; +RESET ROLE; +-- Only partitioned table owned by other user. +ALTER TABLE vacowned_parted OWNER TO regress_vacuum; +ALTER TABLE vacowned_part1 OWNER TO CURRENT_USER; +SET ROLE regress_vacuum; +VACUUM vacowned_parted; +VACUUM vacowned_part1; +VACUUM vacowned_part2; +ANALYZE vacowned_parted; +ANALYZE vacowned_part1; +ANALYZE vacowned_part2; +VACUUM (ANALYZE) vacowned_parted; +VACUUM (ANALYZE) vacowned_part1; +VACUUM (ANALYZE) vacowned_part2; +RESET ROLE; +DROP TABLE vacowned; +DROP TABLE vacowned_parted; +DROP ROLE regress_vacuum; diff --git a/src/test/singlenode_regress/sql/vacuum_parallel.sql b/src/test/singlenode_regress/sql/vacuum_parallel.sql new file mode 100644 index 00000000000..1d23f33e39c --- /dev/null +++ b/src/test/singlenode_regress/sql/vacuum_parallel.sql @@ -0,0 +1,46 @@ +SET max_parallel_maintenance_workers TO 4; +SET min_parallel_index_scan_size TO '128kB'; + +-- Bug #17245: Make sure that we don't totally fail to VACUUM individual indexes that +-- happen to be below min_parallel_index_scan_size during parallel VACUUM: +CREATE TABLE parallel_vacuum_table (a int) WITH (autovacuum_enabled = off); +INSERT INTO parallel_vacuum_table SELECT i from generate_series(1, 10000) i; + +-- Parallel VACUUM will never be used unless there are at least two indexes +-- that exceed min_parallel_index_scan_size. Create two such indexes, and +-- a third index that is smaller than min_parallel_index_scan_size. +CREATE INDEX regular_sized_index ON parallel_vacuum_table(a); +CREATE INDEX typically_sized_index ON parallel_vacuum_table(a); +-- Note: vacuum_in_leader_small_index can apply deduplication, making it ~3x +-- smaller than the other indexes +CREATE INDEX vacuum_in_leader_small_index ON parallel_vacuum_table((1)); + +-- Verify (as best we can) that the cost model for parallel VACUUM +-- will make our VACUUM run in parallel, while always leaving it up to the +-- parallel leader to handle the vacuum_in_leader_small_index index: +SELECT EXISTS ( +SELECT 1 +FROM pg_class +WHERE oid = 'vacuum_in_leader_small_index'::regclass AND + pg_relation_size(oid) < + pg_size_bytes(current_setting('min_parallel_index_scan_size')) +) as leader_will_handle_small_index; +SELECT count(*) as trigger_parallel_vacuum_nindexes +FROM pg_class +WHERE oid in ('regular_sized_index'::regclass, 'typically_sized_index'::regclass) AND + pg_relation_size(oid) >= + pg_size_bytes(current_setting('min_parallel_index_scan_size')); + +-- Parallel VACUUM with B-Tree page deletions, ambulkdelete calls: +DELETE FROM parallel_vacuum_table; +VACUUM (PARALLEL 4, INDEX_CLEANUP ON) parallel_vacuum_table; + +-- Since vacuum_in_leader_small_index uses deduplication, we expect an +-- assertion failure with bug #17245 (in the absence of bugfix): +INSERT INTO parallel_vacuum_table SELECT i FROM generate_series(1, 10000) i; + +RESET max_parallel_maintenance_workers; +RESET min_parallel_index_scan_size; + +-- Deliberately don't drop table, to get further coverage from tools like +-- pg_amcheck in some testing scenarios diff --git a/src/test/singlenode_regress/sql/vacuum_stats.sql b/src/test/singlenode_regress/sql/vacuum_stats.sql new file mode 100644 index 00000000000..45a9b6466c4 --- /dev/null +++ b/src/test/singlenode_regress/sql/vacuum_stats.sql @@ -0,0 +1,22 @@ +CREATE TABLE vacstat_test (a int); +INSERT INTO vacstat_test SELECT i FROM generate_series(1,10) i ; +VACUUM vacstat_test; + +-- Confirm that VACUUM has updated stats from all nodes +SELECT true FROM pg_class WHERE oid='vacstat_test'::regclass +AND relpages > 0 +AND reltuples > 0 +AND relallvisible > 0; + +SELECT true FROM pg_class WHERE oid='vacstat_test'::regclass +AND relpages = + (SELECT SUM(relpages) FROM gp_dist_random('pg_class') + WHERE oid='vacstat_test'::regclass) +AND reltuples = + (SELECT SUM(reltuples) FROM gp_dist_random('pg_class') + WHERE oid='vacstat_test'::regclass) +AND relallvisible = + (SELECT SUM(relallvisible) FROM gp_dist_random('pg_class') + WHERE oid='vacstat_test'::regclass); + +DROP TABLE vacstat_test diff --git a/src/test/singlenode_regress/sql/varchar.sql b/src/test/singlenode_regress/sql/varchar.sql new file mode 100644 index 00000000000..35e24b84d38 --- /dev/null +++ b/src/test/singlenode_regress/sql/varchar.sql @@ -0,0 +1,66 @@ +-- +-- VARCHAR +-- + +CREATE TABLE VARCHAR_TBL(f1 varchar(1)); + +INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); + +INSERT INTO VARCHAR_TBL (f1) VALUES ('A'); + +-- any of the following three input formats are acceptable +INSERT INTO VARCHAR_TBL (f1) VALUES ('1'); + +INSERT INTO VARCHAR_TBL (f1) VALUES (2); + +INSERT INTO VARCHAR_TBL (f1) VALUES ('3'); + +-- zero-length char +INSERT INTO VARCHAR_TBL (f1) VALUES (''); + +-- try varchar's of greater than 1 length +INSERT INTO VARCHAR_TBL (f1) VALUES ('cd'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('c '); + + +SELECT * FROM VARCHAR_TBL; + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 <> 'a'; + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 = 'a'; + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 < 'a'; + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 <= 'a'; + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 > 'a'; + +SELECT c.* + FROM VARCHAR_TBL c + WHERE c.f1 >= 'a'; + +DROP TABLE VARCHAR_TBL; + +-- +-- Now test longer arrays of char +-- + +CREATE TABLE VARCHAR_TBL(f1 varchar(4)); + +INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('ab'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); +INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); + +SELECT * FROM VARCHAR_TBL; diff --git a/src/test/singlenode_regress/sql/window.sql b/src/test/singlenode_regress/sql/window.sql new file mode 100644 index 00000000000..33c747e772e --- /dev/null +++ b/src/test/singlenode_regress/sql/window.sql @@ -0,0 +1,1439 @@ +-- +-- WINDOW FUNCTIONS +-- + +CREATE TEMPORARY TABLE empsalary ( + depname varchar, + empno bigint, + salary int, + enroll_date date +); + +INSERT INTO empsalary VALUES +('develop', 10, 5200, '2007-08-01'), +('sales', 1, 5000, '2006-10-01'), +('personnel', 5, 3500, '2007-12-10'), +('sales', 4, 4800, '2007-08-08'), +('personnel', 2, 3900, '2006-12-23'), +('develop', 7, 4200, '2008-01-01'), +('develop', 9, 4500, '2008-01-01'), +('sales', 3, 4800, '2007-08-01'), +('develop', 8, 6000, '2006-10-01'), +('develop', 11, 5200, '2007-08-15'); + +SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary ORDER BY depname, salary; + +SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary) FROM empsalary; + +-- with GROUP BY +SELECT four, ten, SUM(SUM(four)) OVER (PARTITION BY four), AVG(ten) FROM tenk1 +GROUP BY four, ten ORDER BY four, ten; + +SELECT depname, empno, salary, sum(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname); + +SELECT depname, empno, salary, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary) ORDER BY rank() OVER w; + +-- empty window specification +SELECT COUNT(*) OVER () FROM tenk1 WHERE unique2 < 10; + +SELECT COUNT(*) OVER w FROM tenk1 WHERE unique2 < 10 WINDOW w AS (); + +-- no window operation +SELECT four FROM tenk1 WHERE FALSE WINDOW w AS (PARTITION BY ten); + +-- cumulative aggregate +SELECT sum(four) OVER (PARTITION BY ten ORDER BY unique2) AS sum_1, ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT row_number() OVER (ORDER BY unique2) FROM tenk1 WHERE unique2 < 10; + +SELECT rank() OVER (PARTITION BY four ORDER BY ten) AS rank_1, ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT dense_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT percent_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT cume_dist() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT ntile(3) OVER (ORDER BY ten, four), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT ntile(NULL) OVER (ORDER BY ten, four), ten, four FROM tenk1 LIMIT 2; + +SELECT lag(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT lag(ten, four) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT lag(ten, four, 0) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; +SELECT lag(ten, four, 0.7) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten; + +SELECT lead(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT lead(ten * 2, 1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT lead(ten * 2, 1, -1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; +SELECT lead(ten * 2, 1, -1.4) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten; + +SELECT first_value(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +-- last_value returns the last row of the frame, which is CURRENT ROW in ORDER BY window. +SELECT last_value(four) OVER (ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10; + +SELECT last_value(ten) OVER (PARTITION BY four), ten, four FROM + (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s + ORDER BY four, ten; + +SELECT nth_value(ten, four + 1) OVER (PARTITION BY four), ten, four + FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s; + +SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER (PARTITION BY two ORDER BY ten) AS wsum +FROM tenk1 GROUP BY ten, two; + +SELECT count(*) OVER (PARTITION BY four), four FROM (SELECT * FROM tenk1 WHERE two = 1)s WHERE unique2 < 10; + +SELECT (count(*) OVER (PARTITION BY four ORDER BY ten) + + sum(hundred) OVER (PARTITION BY four ORDER BY ten))::varchar AS cntsum + FROM tenk1 WHERE unique2 < 10; + +-- opexpr with different windows evaluation. +SELECT * FROM( + SELECT count(*) OVER (PARTITION BY four ORDER BY ten) + + sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS total, + count(*) OVER (PARTITION BY four ORDER BY ten) AS fourcount, + sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS twosum + FROM tenk1 +)sub +WHERE total <> fourcount + twosum; + +SELECT avg(four) OVER (PARTITION BY four ORDER BY thousand / 100) FROM tenk1 WHERE unique2 < 10; + +SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER win AS wsum +FROM tenk1 GROUP BY ten, two WINDOW win AS (PARTITION BY two ORDER BY ten); + +-- more than one window with GROUP BY +SELECT sum(salary), + row_number() OVER (ORDER BY depname), + sum(sum(salary)) OVER (ORDER BY depname DESC) +FROM empsalary GROUP BY depname; + +-- identical windows with different names +SELECT sum(salary) OVER w1, count(*) OVER w2 +FROM empsalary WINDOW w1 AS (ORDER BY salary), w2 AS (ORDER BY salary); + +-- subplan +SELECT lead(ten, (SELECT two FROM tenk1 WHERE s.unique2 = unique2)) OVER (PARTITION BY four ORDER BY ten) +FROM tenk1 s WHERE unique2 < 10; + +-- empty table +SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 WHERE FALSE)s; + +-- mixture of agg/wfunc in the same window +SELECT sum(salary) OVER w, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); + +-- strict aggs +SELECT empno, depname, salary, bonus, depadj, MIN(bonus) OVER (ORDER BY empno), MAX(depadj) OVER () FROM( + SELECT *, + CASE WHEN enroll_date < '2008-01-01' THEN 2008 - extract(YEAR FROM enroll_date) END * 500 AS bonus, + CASE WHEN + AVG(salary) OVER (PARTITION BY depname) < salary + THEN 200 END AS depadj FROM empsalary +)s; + +-- window function over ungrouped agg over empty row set (bug before 9.1) +SELECT SUM(COUNT(f1)) OVER () FROM int4_tbl WHERE f1=42; + +-- window function with ORDER BY an expression involving aggregates (9.1 bug) +select ten, + sum(unique1) + sum(unique2) as res, + rank() over (order by sum(unique1) + sum(unique2)) as rank +from tenk1 +group by ten order by ten; + +-- window and aggregate with GROUP BY expression (9.2 bug) +explain (costs off) +select first_value(max(x)) over (), y + from (select unique1 as x, ten+four as y from tenk1) ss + group by y; + +-- test non-default frame specifications +SELECT four, ten, + sum(ten) over (partition by four order by ten), + last_value(ten) over (partition by four order by ten) +FROM (select distinct ten, four from tenk1) ss; + +SELECT four, ten, + sum(ten) over (partition by four order by ten range between unbounded preceding and current row), + last_value(ten) over (partition by four order by ten range between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; + +SELECT four, ten, + sum(ten) over (partition by four order by ten range between unbounded preceding and unbounded following), + last_value(ten) over (partition by four order by ten range between unbounded preceding and unbounded following) +FROM (select distinct ten, four from tenk1) ss; + +SELECT four, ten/4 as two, + sum(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row), + last_value(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; + +SELECT four, ten/4 as two, + sum(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row), + last_value(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row) +FROM (select distinct ten, four from tenk1) ss; + +SELECT sum(unique1) over (order by four range between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between 2 preceding and 2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude no others), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT first_value(unique1) over (ORDER BY four rows between current row and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT last_value(unique1) over (ORDER BY four rows between current row and 2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between 2 preceding and 1 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between 1 following and 3 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between unbounded preceding and 1 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (w range between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); + +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); + +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); + +SELECT sum(unique1) over (w range between unbounded preceding and current row exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four); + +SELECT first_value(unique1) over w, + nth_value(unique1, 2) over w AS nth_2, + last_value(unique1) over w, unique1, four +FROM tenk1 WHERE unique1 < 10 +WINDOW w AS (order by four range between current row and unbounded following); + +SELECT sum(unique1) over + (order by unique1 + rows (SELECT unique1 FROM tenk1 ORDER BY unique1 LIMIT 1) + 1 PRECEDING), + unique1 +FROM tenk1 WHERE unique1 < 10; + +CREATE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following) as sum_rows + FROM generate_series(1, 10) i; + +SELECT * FROM v_window; + +SELECT pg_get_viewdef('v_window'); + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude current row) as sum_rows FROM generate_series(1, 10) i; + +SELECT * FROM v_window; + +SELECT pg_get_viewdef('v_window'); + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude group) as sum_rows FROM generate_series(1, 10) i; + +SELECT * FROM v_window; + +SELECT pg_get_viewdef('v_window'); + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude ties) as sum_rows FROM generate_series(1, 10) i; + +SELECT * FROM v_window; + +SELECT pg_get_viewdef('v_window'); + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following + exclude no others) as sum_rows FROM generate_series(1, 10) i; + +SELECT * FROM v_window; + +SELECT pg_get_viewdef('v_window'); + +CREATE OR REPLACE TEMP VIEW v_window AS + SELECT i, sum(i) over (order by i groups between 1 preceding and 1 following) as sum_rows FROM generate_series(1, 10) i; + +SELECT * FROM v_window; + +SELECT pg_get_viewdef('v_window'); + +DROP VIEW v_window; + +CREATE TEMP VIEW v_window AS + SELECT i, min(i) over (order by i range between '1 day' preceding and '10 days' following) as min_i + FROM generate_series(now(), now()+'100 days'::interval, '1 hour') i; + +SELECT pg_get_viewdef('v_window'); + +-- RANGE offset PRECEDING/FOLLOWING tests + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four desc range between 2::int8 preceding and 1::int2 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude no others), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 1::int2 preceding exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude ties), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four range between 2::int8 preceding and 6::int2 following exclude group), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (partition by four order by unique1 range between 5::int8 preceding and 6::int2 following + exclude current row),unique1, four +FROM tenk1 WHERE unique1 < 10; + +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following), + salary, enroll_date from empsalary; + +select sum(salary) over (order by enroll_date desc range between '1 year'::interval preceding and '1 year'::interval following), + salary, enroll_date from empsalary; + +select sum(salary) over (order by enroll_date desc range between '1 year'::interval following and '1 year'::interval following), + salary, enroll_date from empsalary; + +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude current row), salary, enroll_date from empsalary; + +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude group), salary, enroll_date from empsalary; + +select sum(salary) over (order by enroll_date range between '1 year'::interval preceding and '1 year'::interval following + exclude ties), salary, enroll_date from empsalary; + +select first_value(salary) over(order by salary range between 1000 preceding and 1000 following), + lead(salary) over(order by salary range between 1000 preceding and 1000 following), + nth_value(salary, 1) over(order by salary range between 1000 preceding and 1000 following), + salary from empsalary; + +select last_value(salary) over(order by salary range between 1000 preceding and 1000 following), + lag(salary) over(order by salary range between 1000 preceding and 1000 following), + salary from empsalary; + +select first_value(salary) over(order by salary range between 1000 following and 3000 following + exclude current row), + lead(salary) over(order by salary range between 1000 following and 3000 following exclude ties), + nth_value(salary, 1) over(order by salary range between 1000 following and 3000 following + exclude ties), + salary from empsalary; + +select last_value(salary) over(order by salary range between 1000 following and 3000 following + exclude group), + lag(salary) over(order by salary range between 1000 following and 3000 following exclude group), + salary from empsalary; + +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following), + salary, enroll_date from empsalary; + +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude ties), + salary, enroll_date from empsalary; + +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude group), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude group), + salary, enroll_date from empsalary; + +select first_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude current row), + last_value(salary) over(order by enroll_date range between unbounded preceding and '1 year'::interval following + exclude current row), + salary, enroll_date from empsalary; + +-- RANGE offset PRECEDING/FOLLOWING with null values +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x asc nulls first range between 2 preceding and 2 following); + +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x asc nulls last range between 2 preceding and 2 following); + +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x desc nulls first range between 2 preceding and 2 following); + +select x, y, + first_value(y) over w, + last_value(y) over w +from + (select x, x as y from generate_series(1,5) as x + union all select null, 42 + union all select null, 43) ss +window w as + (order by x desc nulls last range between 2 preceding and 2 following); + +-- Check overflow behavior for various integer sizes + +select x, last_value(x) over (order by x::smallint range between current row and 2147450884 following) +from generate_series(32764, 32766) x; + +select x, last_value(x) over (order by x::smallint desc range between current row and 2147450885 following) +from generate_series(-32766, -32764) x; + +select x, last_value(x) over (order by x range between current row and 4 following) +from generate_series(2147483644, 2147483646) x; + +select x, last_value(x) over (order by x desc range between current row and 5 following) +from generate_series(-2147483646, -2147483644) x; + +select x, last_value(x) over (order by x range between current row and 4 following) +from generate_series(9223372036854775804, 9223372036854775806) x; + +select x, last_value(x) over (order by x desc range between current row and 5 following) +from generate_series(-9223372036854775806, -9223372036854775804) x; + +-- Test in_range for other numeric datatypes + +create temp table numerics( + id int, + f_float4 float4, + f_float8 float8, + f_numeric numeric +); + +insert into numerics values +(0, '-infinity', '-infinity', '-infinity'), +(1, -3, -3, -3), +(2, -1, -1, -1), +(3, 0, 0, 0), +(4, 1.1, 1.1, 1.1), +(5, 1.12, 1.12, 1.12), +(6, 2, 2, 2), +(7, 100, 100, 100), +(8, 'infinity', 'infinity', 'infinity'), +(9, 'NaN', 'NaN', 'NaN'); + +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1 preceding and 1 following); +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1 preceding and 1.1::float4 following); +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' preceding and 'inf' following); +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' preceding and 'inf' preceding); +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 'inf' following and 'inf' following); +select id, f_float4, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float4 range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed + +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1 preceding and 1 following); +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1 preceding and 1.1::float8 following); +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' preceding and 'inf' following); +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' preceding and 'inf' preceding); +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 'inf' following and 'inf' following); +select id, f_float8, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_float8 range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed + +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1 following); +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1.1::numeric following); +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1 preceding and 1.1::float8 following); -- currently unsupported +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' preceding and 'inf' following); +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' preceding and 'inf' preceding); +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 'inf' following and 'inf' following); +select id, f_numeric, first_value(id) over w, last_value(id) over w +from numerics +window w as (order by f_numeric range between + 1.1 preceding and 'NaN' following); -- error, NaN disallowed + +-- Test in_range for other datetime datatypes + +create temp table datetimes( + id int, + f_time time, + f_timetz timetz, + f_interval interval, + f_timestamptz timestamptz, + f_timestamp timestamp +); + +insert into datetimes values +(1, '11:00', '11:00 BST', '1 year', '2000-10-19 10:23:54+01', '2000-10-19 10:23:54'), +(2, '12:00', '12:00 BST', '2 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(3, '13:00', '13:00 BST', '3 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), +(4, '14:00', '14:00 BST', '4 years', '2002-10-19 10:23:54+01', '2002-10-19 10:23:54'), +(5, '15:00', '15:00 BST', '5 years', '2003-10-19 10:23:54+01', '2003-10-19 10:23:54'), +(6, '15:00', '15:00 BST', '5 years', '2004-10-19 10:23:54+01', '2004-10-19 10:23:54'), +(7, '17:00', '17:00 BST', '7 years', '2005-10-19 10:23:54+01', '2005-10-19 10:23:54'), +(8, '18:00', '18:00 BST', '8 years', '2006-10-19 10:23:54+01', '2006-10-19 10:23:54'), +(9, '19:00', '19:00 BST', '9 years', '2007-10-19 10:23:54+01', '2007-10-19 10:23:54'), +(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'); + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + '70 min'::interval preceding and '2 hours'::interval following); + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time desc range between + '70 min' preceding and '2 hours' following); + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + '70 min'::interval preceding and '2 hours'::interval following); + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz desc range between + '70 min' preceding and '2 hours' following); + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + '1 year'::interval preceding and '1 year'::interval following); + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval desc range between + '1 year' preceding and '1 year' following); + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + '1 year'::interval preceding and '1 year'::interval following); + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz desc range between + '1 year' preceding and '1 year' following); + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + '1 year'::interval preceding and '1 year'::interval following); + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp desc range between + '1 year' preceding and '1 year' following); + +-- RANGE offset PRECEDING/FOLLOWING error cases +select sum(salary) over (order by enroll_date, salary range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; + +select sum(salary) over (range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; + +select sum(salary) over (order by depname range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; + +select max(enroll_date) over (order by enroll_date range between 1 preceding and 2 following + exclude ties), salary, enroll_date from empsalary; + +select max(enroll_date) over (order by salary range between -1 preceding and 2 following + exclude ties), salary, enroll_date from empsalary; + +select max(enroll_date) over (order by salary range between 1 preceding and -2 following + exclude ties), salary, enroll_date from empsalary; + +select max(enroll_date) over (order by salary range between '1 year'::interval preceding and '2 years'::interval following + exclude ties), salary, enroll_date from empsalary; + +select max(enroll_date) over (order by enroll_date range between '1 year'::interval preceding and '-2 years'::interval following + exclude ties), salary, enroll_date from empsalary; + +-- GROUPS tests + +SELECT sum(unique1) over (order by four groups between unbounded preceding and current row), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between unbounded preceding and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between current row and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between 1 preceding and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between 1 following and unbounded following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between unbounded preceding and 2 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 preceding), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between 0 preceding and 0 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude current row), unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude group), unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (order by four groups between 2 preceding and 1 following + exclude ties), unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following),unique1, four, ten +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude current row), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude group), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (partition by ten + order by four groups between 0 preceding and 0 following exclude ties), unique1, four, ten +FROM tenk1 WHERE unique1 < 10; + +select first_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + lead(salary) over(order by enroll_date groups between 1 preceding and 1 following), + nth_value(salary, 1) over(order by enroll_date groups between 1 preceding and 1 following), + salary, enroll_date from empsalary; + +select last_value(salary) over(order by enroll_date groups between 1 preceding and 1 following), + lag(salary) over(order by enroll_date groups between 1 preceding and 1 following), + salary, enroll_date from empsalary; + +select first_value(salary) over(order by enroll_date groups between 1 following and 3 following + exclude current row), + lead(salary) over(order by enroll_date groups between 1 following and 3 following exclude ties), + nth_value(salary, 1) over(order by enroll_date groups between 1 following and 3 following + exclude ties), + salary, enroll_date from empsalary; + +select last_value(salary) over(order by enroll_date groups between 1 following and 3 following + exclude group), + lag(salary) over(order by enroll_date groups between 1 following and 3 following exclude group), + salary, enroll_date from empsalary; + +-- Show differences in offset interpretation between ROWS, RANGE, and GROUPS +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x rows between 1 preceding and 1 following); + +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x range between 1 preceding and 1 following); + +WITH cte (x) AS ( + SELECT * FROM generate_series(1, 35, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x groups between 1 preceding and 1 following); + +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x rows between 1 preceding and 1 following); + +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x range between 1 preceding and 1 following); + +WITH cte (x) AS ( + select 1 union all select 1 union all select 1 union all + SELECT * FROM generate_series(5, 49, 2) +) +SELECT x, (sum(x) over w) +FROM cte +WINDOW w AS (ORDER BY x groups between 1 preceding and 1 following); + +-- with UNION +SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 UNION ALL SELECT * FROM tenk2)s LIMIT 0; + +-- check some degenerate cases +create temp table t1 (f1 int, f2 int8); +insert into t1 values (1,1),(1,2),(2,2); + +select f1, sum(f1) over (partition by f1 + range between 1 preceding and 1 following) +from t1 where f1 = f2; -- error, must have order by +explain (costs off) +select f1, sum(f1) over (partition by f1 order by f2 + range between 1 preceding and 1 following) +from t1 where f1 = f2; +select f1, sum(f1) over (partition by f1 order by f2 + range between 1 preceding and 1 following) +from t1 where f1 = f2; +select f1, sum(f1) over (partition by f1, f1 order by f2 + range between 2 preceding and 1 preceding) +from t1 where f1 = f2; +select f1, sum(f1) over (partition by f1, f2 order by f2 + range between 1 following and 2 following) +from t1 where f1 = f2; + +select f1, sum(f1) over (partition by f1 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; -- error, must have order by +explain (costs off) +select f1, sum(f1) over (partition by f1 order by f2 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; +select f1, sum(f1) over (partition by f1 order by f2 + groups between 1 preceding and 1 following) +from t1 where f1 = f2; +select f1, sum(f1) over (partition by f1, f1 order by f2 + groups between 2 preceding and 1 preceding) +from t1 where f1 = f2; +select f1, sum(f1) over (partition by f1, f2 order by f2 + groups between 1 following and 2 following) +from t1 where f1 = f2; + +-- ordering by a non-integer constant is allowed +SELECT rank() OVER (ORDER BY length('abc')); + +-- can't order by another window function +SELECT rank() OVER (ORDER BY rank() OVER (ORDER BY random())); + +-- some other errors +SELECT * FROM empsalary WHERE row_number() OVER (ORDER BY salary) < 10; + +SELECT * FROM empsalary INNER JOIN tenk1 ON row_number() OVER (ORDER BY salary) < 10; + +SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GROUP BY 1; + +SELECT * FROM rank() OVER (ORDER BY random()); + +DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10; + +DELETE FROM empsalary RETURNING rank() OVER (ORDER BY random()); + +SELECT count(*) OVER w FROM tenk1 WINDOW w AS (ORDER BY unique1), w AS (ORDER BY unique1); + +SELECT rank() OVER (PARTITION BY four, ORDER BY ten) FROM tenk1; + +-- Not allowed in PostgreSQL, but is allowed in GPDB for backwards-compatibility. +-- Added LIMIT to reduce the size of the output. +SELECT count() OVER () FROM tenk1 limit 5; + +SELECT generate_series(1, 100) OVER () FROM empsalary; + +SELECT ntile(0) OVER (ORDER BY ten), ten, four FROM tenk1; + +SELECT nth_value(four, 0) OVER (ORDER BY ten), ten, four FROM tenk1; + +-- filter + +SELECT sum(salary), row_number() OVER (ORDER BY depname), sum( + sum(salary) FILTER (WHERE enroll_date > '2007-01-01') +) FILTER (WHERE depname <> 'sales') OVER (ORDER BY depname DESC) AS "filtered_sum", + depname +FROM empsalary GROUP BY depname; + +-- Test pushdown of quals into a subquery containing window functions + +-- pushdown is safe because all PARTITION BY clauses include depname: +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY depname) depsalary, + min(salary) OVER (PARTITION BY depname || 'A', depname) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; + +-- pushdown is unsafe because there's a PARTITION BY clause without depname: +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY enroll_date) enroll_salary, + min(salary) OVER (PARTITION BY depname) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; + +-- Test Sort node collapsing +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + sum(salary) OVER (PARTITION BY depname order by empno) depsalary, + min(salary) OVER (PARTITION BY depname, empno order by enroll_date) depminsalary + FROM empsalary) emp +WHERE depname = 'sales'; + +-- Test Sort node reordering +EXPLAIN (COSTS OFF) +SELECT + lead(1) OVER (PARTITION BY depname ORDER BY salary, enroll_date), + lag(1) OVER (PARTITION BY depname ORDER BY salary,enroll_date,empno) +FROM empsalary; + +-- Test incremental sorting +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT depname, + empno, + salary, + enroll_date, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date) AS first_emp, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date DESC) AS last_emp + FROM empsalary) emp +WHERE first_emp = 1 OR last_emp = 1; + +SELECT * FROM + (SELECT depname, + empno, + salary, + enroll_date, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date) AS first_emp, + row_number() OVER (PARTITION BY depname ORDER BY enroll_date DESC) AS last_emp + FROM empsalary) emp +WHERE first_emp = 1 OR last_emp = 1; + +-- cleanup +DROP TABLE empsalary; + +-- test user-defined window function with named args and default args +CREATE FUNCTION nth_value_def(val anyelement, n integer = 1) RETURNS anyelement + LANGUAGE internal WINDOW IMMUTABLE STRICT AS 'window_nth_value'; + +SELECT nth_value_def(n := 2, val := ten) OVER (PARTITION BY four), ten, four + FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s; + +SELECT nth_value_def(ten) OVER (PARTITION BY four), ten, four + FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s; + +-- +-- Test the basic moving-aggregate machinery +-- + +-- create aggregates that record the series of transform calls (these are +-- intentionally not true inverses) + +CREATE FUNCTION logging_sfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT COALESCE($1, '') || '*' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; + +CREATE FUNCTION logging_msfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT COALESCE($1, '') || '+' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; + +CREATE FUNCTION logging_minvfunc_nonstrict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '-' || quote_nullable($2) $$ +LANGUAGE SQL IMMUTABLE; + +CREATE AGGREGATE logging_agg_nonstrict (anyelement) +( + stype = text, + sfunc = logging_sfunc_nonstrict, + mstype = text, + msfunc = logging_msfunc_nonstrict, + minvfunc = logging_minvfunc_nonstrict +); + +CREATE AGGREGATE logging_agg_nonstrict_initcond (anyelement) +( + stype = text, + sfunc = logging_sfunc_nonstrict, + mstype = text, + msfunc = logging_msfunc_nonstrict, + minvfunc = logging_minvfunc_nonstrict, + initcond = 'I', + minitcond = 'MI' +); + +CREATE FUNCTION logging_sfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '*' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; + +CREATE FUNCTION logging_msfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '+' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; + +CREATE FUNCTION logging_minvfunc_strict(text, anyelement) RETURNS text AS +$$ SELECT $1 || '-' || quote_nullable($2) $$ +LANGUAGE SQL STRICT IMMUTABLE; + +CREATE AGGREGATE logging_agg_strict (text) +( + stype = text, + sfunc = logging_sfunc_strict, + mstype = text, + msfunc = logging_msfunc_strict, + minvfunc = logging_minvfunc_strict +); + +CREATE AGGREGATE logging_agg_strict_initcond (anyelement) +( + stype = text, + sfunc = logging_sfunc_strict, + mstype = text, + msfunc = logging_msfunc_strict, + minvfunc = logging_minvfunc_strict, + initcond = 'I', + minitcond = 'MI' +); + +-- test strict and non-strict cases +SELECT + p::text || ',' || i::text || ':' || COALESCE(v::text, 'NULL') AS row, + logging_agg_nonstrict(v) over wnd as nstrict, + logging_agg_nonstrict_initcond(v) over wnd as nstrict_init, + logging_agg_strict(v::text) over wnd as strict, + logging_agg_strict_initcond(v) over wnd as strict_init +FROM (VALUES + (1, 1, NULL), + (1, 2, 'a'), + (1, 3, 'b'), + (1, 4, NULL), + (1, 5, NULL), + (1, 6, 'c'), + (2, 1, NULL), + (2, 2, 'x'), + (3, 1, 'z') +) AS t(p, i, v) +WINDOW wnd AS (PARTITION BY P ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY p, i; + +-- and again, but with filter +SELECT + p::text || ',' || i::text || ':' || + CASE WHEN f THEN COALESCE(v::text, 'NULL') ELSE '-' END as row, + logging_agg_nonstrict(v) filter(where f) over wnd as nstrict_filt, + logging_agg_nonstrict_initcond(v) filter(where f) over wnd as nstrict_init_filt, + logging_agg_strict(v::text) filter(where f) over wnd as strict_filt, + logging_agg_strict_initcond(v) filter(where f) over wnd as strict_init_filt +FROM (VALUES + (1, 1, true, NULL), + (1, 2, false, 'a'), + (1, 3, true, 'b'), + (1, 4, false, NULL), + (1, 5, false, NULL), + (1, 6, false, 'c'), + (2, 1, false, NULL), + (2, 2, true, 'x'), + (3, 1, true, 'z') +) AS t(p, i, f, v) +WINDOW wnd AS (PARTITION BY p ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY p, i; + +-- test that volatile arguments disable moving-aggregate mode +SELECT + i::text || ':' || COALESCE(v::text, 'NULL') as row, + logging_agg_strict(v::text) + over wnd as inverse, + logging_agg_strict(v::text || CASE WHEN random() < 0 then '?' ELSE '' END) + over wnd as noinverse +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY i; + +SELECT + i::text || ':' || COALESCE(v::text, 'NULL') as row, + logging_agg_strict(v::text) filter(where true) + over wnd as inverse, + logging_agg_strict(v::text) filter(where random() >= 0) + over wnd as noinverse +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY i; + +-- test that non-overlapping windows don't use inverse transitions +SELECT + logging_agg_strict(v::text) OVER wnd +FROM (VALUES + (1, 'a'), + (2, 'b'), + (3, 'c') +) AS t(i, v) +WINDOW wnd AS (ORDER BY i ROWS BETWEEN CURRENT ROW AND CURRENT ROW) +ORDER BY i; + +-- test that returning NULL from the inverse transition functions +-- restarts the aggregation from scratch. The second aggregate is supposed +-- to test cases where only some aggregates restart, the third one checks +-- that one aggregate restarting doesn't cause others to restart. + +CREATE FUNCTION sum_int_randrestart_minvfunc(int4, int4) RETURNS int4 AS +$$ SELECT CASE WHEN random() < 0.2 THEN NULL ELSE $1 - $2 END $$ +LANGUAGE SQL STRICT; + +CREATE AGGREGATE sum_int_randomrestart (int4) +( + stype = int4, + sfunc = int4pl, + mstype = int4, + msfunc = int4pl, + minvfunc = sum_int_randrestart_minvfunc +); + +-- In PostgreSQL, the 'vs' CTE is constructed using random() and +-- generate_series(), but GPDB inlines CTEs even when they contain volatile +-- expressions, causing incorrect results. That's a bug in GPDB, of course, +-- but for the purposes of this test, we work around that by using a +-- non-volatile WITH clause. The list of values below was created by running +-- the original subquery using random() once, and copying the result here. +-- +-- See https://github.com/greenplum-db/gpdb/issues/1349 +WITH +vs (i, v) AS ( +VALUES + ( 1, 18), + ( 2, 91), + ( 3, 62), + ( 4, 34), + ( 5, 12), + ( 6, 99), + ( 7, 4), + ( 8, 32), + ( 9, 75), + (10, 38), + (11, 0), + (12, 43), + (13, 95), + (14, 83), + (15, 99), + (16, 44), + (17, 27), + (18, 11), + (19, 27), + (20, 19), + (21, 71), + (22, 52), + (23, 49), + (24, 58), + (25, 35), + (26, 66), + (27, 12), + (28, 49), + (29, 9), + (30, 89), + (31, 7), + (32, 27), + (33, 80), + (34, 69), + (35, 61), + (36, 92), + (37, 68), + (38, 65), + (39, 23), + (40, 43), + (41, 3), + (42, 24), + (43, 86), + (44, 98), + (45, 6), + (46, 85), + (47, 42), + (48, 33), + (49, 96), + (50, 68), + (51, 52), + (52, 67), + (53, 20), + (54, 1), + (55, 25), + (56, 55), + (57, 67), + (58, 37), + (59, 4), + (60, 76), + (61, 26), + (62, 11), + (63, 3), + (64, 6), + (65, 80), + (66, 64), + (67, 98), + (68, 48), + (69, 29), + (70, 21), + (71, 91), + (72, 31), + (73, 45), + (74, 77), + (75, 29), + (76, 51), + (77, 63), + (78, 71), + (79, 84), + (80, 59), + (81, 39), + (82, 36), + (83, 26), + (84, 60), + (85, 37), + (86, 51), + (87, 15), + (88, 4), + (89, 88), + (90, 19), + (91, 80), + (92, 14), + (93, 30), + (94, 83), + (95, 20), + (96, 10), + (97, 47), + (98, 18), + (99, 58), +(100, 75) +), +sum_following AS ( + SELECT i, SUM(v) OVER + (ORDER BY i DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS s + FROM vs +) +SELECT DISTINCT + sum_following.s = sum_int_randomrestart(v) OVER fwd AS eq1, + -sum_following.s = sum_int_randomrestart(-v) OVER fwd AS eq2, + 100*3+(vs.i-1)*3 = length(logging_agg_nonstrict(''::text) OVER fwd) AS eq3 +FROM vs +JOIN sum_following ON sum_following.i = vs.i +WINDOW fwd AS ( + ORDER BY vs.i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING +); + +-- +-- Test various built-in aggregates that have moving-aggregate support +-- + +-- test inverse transition functions handle NULLs properly +SELECT i,AVG(v::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,AVG(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,AVG(v::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,AVG(v::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1.5),(2,2.5),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,AVG(v::interval) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,'1 sec'),(2,'2 sec'),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,SUM(v::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,SUM(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,SUM(v::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,SUM(v::money) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,'1.10'),(2,'2.20'),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,SUM(v::interval) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,'1 sec'),(2,'2 sec'),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,SUM(v::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1.1),(2,2.2),(3,NULL),(4,NULL)) t(i,v); + +SELECT SUM(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1.01),(2,2),(3,3)) v(i,n); + +SELECT i,COUNT(v) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,COUNT(*) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT VAR_POP(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VAR_POP(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VAR_POP(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VAR_POP(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VAR_SAMP(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VAR_SAMP(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VAR_SAMP(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VAR_SAMP(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VARIANCE(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VARIANCE(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VARIANCE(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT VARIANCE(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT STDDEV_POP(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + +SELECT STDDEV_POP(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + +SELECT STDDEV_POP(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + +SELECT STDDEV_POP(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + +SELECT STDDEV_SAMP(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + +SELECT STDDEV_SAMP(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + +SELECT STDDEV_SAMP(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + +SELECT STDDEV_SAMP(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(1,NULL),(2,600),(3,470),(4,170),(5,430),(6,300)) r(i,n); + +SELECT STDDEV(n::bigint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(0,NULL),(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT STDDEV(n::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(0,NULL),(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT STDDEV(n::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(0,NULL),(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +SELECT STDDEV(n::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + FROM (VALUES(0,NULL),(1,600),(2,470),(3,170),(4,430),(5,300)) r(i,n); + +-- test that inverse transition functions work with various frame options +SELECT i,SUM(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND CURRENT ROW) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,SUM(v::int) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); + +SELECT i,SUM(v::int) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) + FROM (VALUES(1,1),(2,2),(3,3),(4,4)) t(i,v); + +-- ensure aggregate over numeric properly recovers from NaN values +SELECT a, b, + SUM(b) OVER(ORDER BY A ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +FROM (VALUES(1,1::numeric),(2,2),(3,'NaN'),(4,3),(5,4)) t(a,b); + +-- It might be tempting for someone to add an inverse trans function for +-- float and double precision. This should not be done as it can give incorrect +-- results. This test should fail if anyone ever does this without thinking too +-- hard about it. +SELECT to_char(SUM(n::float8) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING),'999999999999999999999D9') + FROM (VALUES(1,1e20),(2,1)) n(i,n); + +SELECT i, b, bool_and(b) OVER w, bool_or(b) OVER w + FROM (VALUES (1,true), (2,true), (3,false), (4,false), (5,true)) v(i,b) + WINDOW w AS (ORDER BY i ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING); + +-- Tests for problems with failure to walk or mutate expressions +-- within window frame clauses. + +-- test walker (fails with collation error if expressions are not walked) +SELECT array_agg(i) OVER w + FROM generate_series(1,5) i +WINDOW w AS (ORDER BY i ROWS BETWEEN (('foo' < 'foobar')::integer) PRECEDING AND CURRENT ROW); + +-- test mutator (fails when inlined if expressions are not mutated) +CREATE FUNCTION pg_temp.f(group_size BIGINT) RETURNS SETOF integer[] +AS $$ + SELECT array_agg(s) OVER w + FROM generate_series(1,5) s + WINDOW w AS (ORDER BY s ROWS BETWEEN CURRENT ROW AND GROUP_SIZE FOLLOWING) +$$ LANGUAGE SQL STABLE; + +EXPLAIN (costs off) SELECT * FROM pg_temp.f(2); +SELECT * FROM pg_temp.f(2); diff --git a/src/test/singlenode_regress/sql/with.sql b/src/test/singlenode_regress/sql/with.sql new file mode 100644 index 00000000000..565e3c04ec3 --- /dev/null +++ b/src/test/singlenode_regress/sql/with.sql @@ -0,0 +1,1577 @@ +-- +-- Tests for common table expressions (WITH query, ... SELECT ...) +-- + +--start_ignore +set gp_cte_sharing to on; +--end_ignore + +-- Basic WITH +WITH q1(x,y) AS (SELECT 1,2) +SELECT * FROM q1, q1 AS q2; + +-- Multiple uses are evaluated only once +SELECT count(*) FROM ( + WITH q1(x) AS (SELECT random() FROM generate_series(1, 5)) + SELECT * FROM q1 + UNION + SELECT * FROM q1 +) ss; + +-- WITH RECURSIVE + +-- sum of 1..100 +WITH RECURSIVE t(n) AS ( + VALUES (1) +UNION ALL + SELECT n+1 FROM t WHERE n < 100 +) +SELECT sum(n) FROM t; + +WITH RECURSIVE t(n) AS ( + SELECT (VALUES(1)) +UNION ALL + SELECT n+1 FROM t WHERE n < 5 +) +SELECT * FROM t; + +-- UNION DISTINCT requires hashable type +WITH RECURSIVE t(n) AS ( + VALUES (1::money) +UNION + SELECT n+1::money FROM t WHERE n < 100::money +) +SELECT sum(n) FROM t; + +-- recursive view +CREATE RECURSIVE VIEW nums (n) AS + VALUES (1) +UNION ALL + SELECT n+1 FROM nums WHERE n < 5; + +SELECT * FROM nums; + +CREATE OR REPLACE RECURSIVE VIEW nums (n) AS + VALUES (1) +UNION ALL + SELECT n+1 FROM nums WHERE n < 6; + +SELECT * FROM nums; + +-- This is an infinite loop with UNION ALL, but not with UNION +WITH RECURSIVE t(n) AS ( + SELECT 1 +UNION + SELECT 10-n FROM t) +SELECT * FROM t; + +-- This'd be an infinite loop, but outside query reads only as much as needed +WITH RECURSIVE t(n) AS ( + VALUES (1) +UNION ALL + SELECT n+1 FROM t) +SELECT * FROM t LIMIT 10; + +-- UNION case should have same property +WITH RECURSIVE t(n) AS ( + SELECT 1 +UNION + SELECT n+1 FROM t) +SELECT * FROM t LIMIT 10; + +-- Test behavior with an unknown-type literal in the WITH +WITH q AS (SELECT 'foo' AS x) +SELECT x, pg_typeof(x) FROM q; + +WITH RECURSIVE t(n) AS ( + SELECT 'foo' +UNION ALL + SELECT n || ' bar' FROM t WHERE length(n) < 20 +) +SELECT n, pg_typeof(n) FROM t; + +-- In a perfect world, this would work and resolve the literal as int ... +-- but for now, we have to be content with resolving to text too soon. +WITH RECURSIVE t(n) AS ( + SELECT '7' +UNION ALL + SELECT n+1 FROM t WHERE n < 10 +) +SELECT n, pg_typeof(n) FROM t; + +-- Deeply nested WITH caused a list-munging problem in v13 +-- Detection of cross-references and self-references +WITH RECURSIVE w1(c1) AS + (WITH w2(c2) AS + (WITH w3(c3) AS + (WITH w4(c4) AS + (WITH w5(c5) AS + (WITH RECURSIVE w6(c6) AS + (WITH w6(c6) AS + (WITH w8(c8) AS + (SELECT 1) + SELECT * FROM w8) + SELECT * FROM w6) + SELECT * FROM w6) + SELECT * FROM w5) + SELECT * FROM w4) + SELECT * FROM w3) + SELECT * FROM w2) +SELECT * FROM w1; +-- Detection of invalid self-references +WITH RECURSIVE outermost(x) AS ( + SELECT 1 + UNION (WITH innermost1 AS ( + SELECT 2 + UNION (WITH innermost2 AS ( + SELECT 3 + UNION (WITH innermost3 AS ( + SELECT 4 + UNION (WITH innermost4 AS ( + SELECT 5 + UNION (WITH innermost5 AS ( + SELECT 6 + UNION (WITH innermost6 AS + (SELECT 7) + SELECT * FROM innermost6)) + SELECT * FROM innermost5)) + SELECT * FROM innermost4)) + SELECT * FROM innermost3)) + SELECT * FROM innermost2)) + SELECT * FROM outermost + UNION SELECT * FROM innermost1) + ) + SELECT * FROM outermost ORDER BY 1; + +-- +-- Some examples with a tree +-- +-- department structure represented here is as follows: +-- +-- ROOT-+->A-+->B-+->C +-- | | +-- | +->D-+->F +-- +->E-+->G + +CREATE TEMP TABLE department ( + id INTEGER PRIMARY KEY, -- department ID + parent_department INTEGER REFERENCES department, -- upper department ID + name TEXT -- department name +); + +INSERT INTO department VALUES (0, NULL, 'ROOT'); +INSERT INTO department VALUES (1, 0, 'A'); +INSERT INTO department VALUES (2, 1, 'B'); +INSERT INTO department VALUES (3, 2, 'C'); +INSERT INTO department VALUES (4, 2, 'D'); +INSERT INTO department VALUES (5, 0, 'E'); +INSERT INTO department VALUES (6, 4, 'F'); +INSERT INTO department VALUES (7, 5, 'G'); + +-- GPDB: Some of the queries below will return non-deterministic results +-- because of moving rows across segments. This table is the same, except that +-- all the rows reside on a single segment, so that you get consistent results. +CREATE TEMP TABLE department_oneseg AS SELECT 1 AS distkey, * FROM department; + +-- extract all departments under 'A'. Result should be A, B, C, D and F +WITH RECURSIVE subdepartment AS +( + -- non recursive term + SELECT name as root_name, * FROM department WHERE name = 'A' + + UNION ALL + + -- recursive term + SELECT sd.root_name, d.* FROM department AS d, subdepartment AS sd + WHERE d.parent_department = sd.id +) +SELECT * FROM subdepartment ORDER BY name; + +-- extract all departments under 'A' with "level" number +WITH RECURSIVE subdepartment(level, id, parent_department, name) AS +( + -- non recursive term + SELECT 1, * FROM department WHERE name = 'A' + + UNION ALL + + -- recursive term + SELECT sd.level + 1, d.* FROM department AS d, subdepartment AS sd + WHERE d.parent_department = sd.id +) +SELECT * FROM subdepartment ORDER BY name; + +-- extract all departments under 'A' with "level" number. +-- Only shows level 2 or more +WITH RECURSIVE subdepartment(level, id, parent_department, name) AS +( + -- non recursive term + SELECT 1, * FROM department WHERE name = 'A' + + UNION ALL + + -- recursive term + SELECT sd.level + 1, d.* FROM department AS d, subdepartment AS sd + WHERE d.parent_department = sd.id +) +SELECT * FROM subdepartment WHERE level >= 2 ORDER BY name; + +-- "RECURSIVE" is ignored if the query has no self-reference +WITH RECURSIVE subdepartment AS +( + -- note lack of recursive UNION structure + SELECT * FROM department WHERE name = 'A' +) +SELECT * FROM subdepartment ORDER BY name; + +-- inside subqueries +SELECT count(*) FROM ( + WITH RECURSIVE t(n) AS ( + SELECT 1 UNION ALL SELECT n + 1 FROM t WHERE n < 500 + ) + SELECT * FROM t) AS t WHERE n < ( + SELECT count(*) FROM ( + WITH RECURSIVE t(n) AS ( + SELECT 1 UNION ALL SELECT n + 1 FROM t WHERE n < 100 + ) + SELECT * FROM t WHERE n < 50000 + ) AS t WHERE n < 100); + +-- use same CTE twice at different subquery levels +WITH q1(x,y) AS ( + SELECT hundred, sum(ten) FROM tenk1 GROUP BY hundred + ) +SELECT count(*) FROM q1 WHERE y > (SELECT sum(y)/100 FROM q1 qsub); + +-- via a VIEW +CREATE TEMPORARY VIEW vsubdepartment AS + WITH RECURSIVE subdepartment AS + ( + -- non recursive term + SELECT * FROM department WHERE name = 'A' + UNION ALL + -- recursive term + SELECT d.* FROM department AS d, subdepartment AS sd + WHERE d.parent_department = sd.id + ) + SELECT * FROM subdepartment; + +SELECT * FROM vsubdepartment ORDER BY name; + +-- Check reverse listing +SELECT pg_get_viewdef('vsubdepartment'::regclass); +SELECT pg_get_viewdef('vsubdepartment'::regclass, true); + +-- Another reverse-listing example +CREATE VIEW sums_1_100 AS +WITH RECURSIVE t(n) AS ( + VALUES (1) +UNION ALL + SELECT n+1 FROM t WHERE n < 100 +) +SELECT sum(n) FROM t; + +\d+ sums_1_100 + +-- corner case in which sub-WITH gets initialized first +with recursive q as ( + select * from department_oneseg + union all + (with x as (select * from q) + select * from x) + ) +select id, parent_department, name from q limit 24; + +with recursive q as ( + select * from department_oneseg + union all + (with recursive x as ( + select * from department_oneseg + union all + (select * from q union all select * from x) + ) + select * from x) + ) +select id, parent_department, name from q limit 32; + +-- recursive term has sub-UNION +WITH RECURSIVE t(i,j) AS ( + VALUES (1,2) + UNION ALL + SELECT t2.i, t.j+1 FROM + (SELECT 2 AS i UNION ALL SELECT 3 AS i) AS t2 + JOIN t ON (t2.i = t.i+1)) + + SELECT * FROM t; + +-- +-- different tree example +-- +CREATE TEMPORARY TABLE tree( + id INTEGER PRIMARY KEY, + parent_id INTEGER REFERENCES tree(id) +); + +INSERT INTO tree +VALUES (1, NULL), (2, 1), (3,1), (4,2), (5,2), (6,2), (7,3), (8,3), + (9,4), (10,4), (11,7), (12,7), (13,7), (14, 9), (15,11), (16,11); + +-- +-- get all paths from "second level" nodes to leaf nodes +-- +WITH RECURSIVE t(id, path) AS ( + VALUES(1,ARRAY[]::integer[]) +UNION ALL + SELECT tree.id, t.path || tree.id + FROM tree JOIN t ON (tree.parent_id = t.id) +) +SELECT t1.*, t2.* FROM t AS t1 JOIN t AS t2 ON + (t1.path[1] = t2.path[1] AND + array_upper(t1.path,1) = 1 AND + array_upper(t2.path,1) > 1) + ORDER BY t1.id, t2.id; + +-- just count 'em +WITH RECURSIVE t(id, path) AS ( + VALUES(1,ARRAY[]::integer[]) +UNION ALL + SELECT tree.id, t.path || tree.id + FROM tree JOIN t ON (tree.parent_id = t.id) +) +SELECT t1.id, count(t2.*) FROM t AS t1 JOIN t AS t2 ON + (t1.path[1] = t2.path[1] AND + array_upper(t1.path,1) = 1 AND + array_upper(t2.path,1) > 1) + GROUP BY t1.id + ORDER BY t1.id; + +-- this variant tickled a whole-row-variable bug in 8.4devel +WITH RECURSIVE t(id, path) AS ( + VALUES(1,ARRAY[]::integer[]) +UNION ALL + SELECT tree.id, t.path || tree.id + FROM tree JOIN t ON (tree.parent_id = t.id) +) +SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON +(t1.id=t2.id); + +-- SEARCH clause + +create table graph0( f int, t int, label text ); + +insert into graph0 values + (1, 2, 'arc 1 -> 2'), + (1, 3, 'arc 1 -> 3'), + (2, 3, 'arc 2 -> 3'), + (1, 4, 'arc 1 -> 4'), + (4, 5, 'arc 4 -> 5'); + +explain (verbose, costs off) +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select * from search_graph order by seq; + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select * from search_graph order by seq; + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union distinct + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select * from search_graph order by seq; + +explain (verbose, costs off) +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search breadth first by f, t set seq +select * from search_graph order by seq; + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search breadth first by f, t set seq +select * from search_graph order by seq; + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union distinct + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search breadth first by f, t set seq +select * from search_graph order by seq; + +-- various syntax errors +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by foo, tar set seq +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set label +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t, f set seq +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select * from search_graph order by seq; + +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + (select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t) +) search depth first by f, t set seq +select * from search_graph order by seq; + +-- check that we distinguish same CTE name used at different levels +-- (this case could be supported, perhaps, but it isn't today) +with recursive x(col) as ( + select 1 + union + (with x as (select * from x) + select * from x) +) search depth first by col set seq +select * from x; + +-- test ruleutils and view expansion +create temp view v_search as +with recursive search_graph(f, t, label) as ( + select * from graph0 g + union all + select g.* + from graph0 g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq +select f, t, label from search_graph; + +select pg_get_viewdef('v_search'); + +select * from v_search; + +drop table graph0 cascade; + +-- +-- test cycle detection +-- +create temp table graph( f int, t int, label text ); + +insert into graph values + (1, 2, 'arc 1 -> 2'), + (1, 3, 'arc 1 -> 3'), + (2, 3, 'arc 2 -> 3'), + (1, 4, 'arc 1 -> 4'), + (4, 5, 'arc 4 -> 5'), + (5, 1, 'arc 5 -> 1'); + +with recursive search_graph(f, t, label, is_cycle, path) as ( + select *, false, array[row(g.f, g.t)] from graph g + union all + select g.*, row(g.f, g.t) = any(path), path || row(g.f, g.t) + from graph g, search_graph sg + where g.f = sg.t and not is_cycle +) +select * from search_graph; + +-- UNION DISTINCT exercises row type hashing support +with recursive search_graph(f, t, label, is_cycle, path) as ( + select *, false, array[row(g.f, g.t)] from graph g + union distinct + select g.*, row(g.f, g.t) = any(path), path || row(g.f, g.t) + from graph g, search_graph sg + where g.f = sg.t and not is_cycle +) +select * from search_graph; + +-- ordering by the path column has same effect as SEARCH DEPTH FIRST +with recursive search_graph(f, t, label, is_cycle, path) as ( + select *, false, array[row(g.f, g.t)] from graph g + union all + select g.*, row(g.f, g.t) = any(path), path || row(g.f, g.t) + from graph g, search_graph sg + where g.f = sg.t and not is_cycle +) +select * from search_graph order by path; + +-- CYCLE clause + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle using path +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union distinct + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to 'Y' default 'N' using path +select * from search_graph; + +-- multiple CTEs +with recursive +graph(f, t, label) as ( + values (1, 2, 'arc 1 -> 2'), + (1, 3, 'arc 1 -> 3'), + (2, 3, 'arc 2 -> 3'), + (1, 4, 'arc 1 -> 4'), + (4, 5, 'arc 4 -> 5'), + (5, 1, 'arc 5 -> 1') +), +search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to true default false using path +select f, t, label from search_graph; + +-- star expansion +with recursive a as ( + select 1 as b + union all + select * from a +) cycle b set c using p +select * from a; + +-- search+cycle +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) search depth first by f, t set seq + cycle f, t set is_cycle using path +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) search breadth first by f, t set seq + cycle f, t set is_cycle using path +select * from search_graph; + +-- various syntax errors +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle foo, tar set is_cycle using path +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to true default 55 using path +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to point '(1,1)' default point '(0,0)' using path +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set label to true default false using path +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to true default false using label +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set foo to true default false using foo +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t, f set is_cycle to true default false using path +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) search depth first by f, t set foo + cycle f, t set foo to true default false using path +select * from search_graph; + +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) search depth first by f, t set foo + cycle f, t set is_cycle to true default false using foo +select * from search_graph; + +-- test ruleutils and view expansion +create temp view v_cycle1 as +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle using path +select f, t, label from search_graph; + +create temp view v_cycle2 as +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle to 'Y' default 'N' using path +select f, t, label from search_graph; + +select pg_get_viewdef('v_cycle1'); +select pg_get_viewdef('v_cycle2'); + +select * from v_cycle1; +select * from v_cycle2; + +-- +-- test multiple WITH queries +-- +WITH RECURSIVE + y (id) AS (VALUES (1)), + x (id) AS (SELECT * FROM y UNION ALL SELECT id+1 FROM x WHERE id < 5) +SELECT * FROM x; + +-- forward reference OK +WITH RECURSIVE + x(id) AS (SELECT * FROM y UNION ALL SELECT id+1 FROM x WHERE id < 5), + y(id) AS (values (1)) + SELECT * FROM x; + +WITH RECURSIVE + x(id) AS + (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 5), + y(id) AS + (VALUES (1) UNION ALL SELECT id+1 FROM y WHERE id < 10) + SELECT y.*, x.* FROM y LEFT JOIN x USING (id); + +WITH RECURSIVE + x(id) AS + (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 5), + y(id) AS + (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 10) + SELECT y.*, x.* FROM y LEFT JOIN x USING (id); + +WITH RECURSIVE + x(id) AS + (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 3 ), + y(id) AS + (SELECT * FROM x UNION ALL SELECT * FROM x), + z(id) AS + (SELECT * FROM x UNION ALL SELECT id+1 FROM z WHERE id < 10) + SELECT * FROM z; + +WITH RECURSIVE + x(id) AS + (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 3 ), + y(id) AS + (SELECT * FROM x UNION ALL SELECT * FROM x), + z(id) AS + (SELECT * FROM y UNION ALL SELECT id+1 FROM z WHERE id < 10) + SELECT * FROM z; + +-- +-- Test WITH attached to a data-modifying statement +-- + +CREATE TEMPORARY TABLE y (a INTEGER); +INSERT INTO y SELECT generate_series(1, 10); + +WITH t AS ( + SELECT a FROM y +) +INSERT INTO y +SELECT a+20 FROM t RETURNING *; + +SELECT * FROM y; + +WITH t AS ( + SELECT a FROM y +) +UPDATE y SET a = y.a-10 FROM t WHERE y.a > 20 AND t.a = y.a RETURNING y.a; + +SELECT * FROM y; + +WITH RECURSIVE t(a) AS ( + SELECT 11 + UNION ALL + SELECT a+1 FROM t WHERE a < 50 +) +DELETE FROM y USING t WHERE t.a = y.a RETURNING y.a; + +SELECT * FROM y; + +DROP TABLE y; + +-- +-- error cases +-- + +WITH x(n, b) AS (SELECT 1) +SELECT * FROM x; + +-- INTERSECT +WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT SELECT n+1 FROM x) + SELECT * FROM x; + +WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT ALL SELECT n+1 FROM x) + SELECT * FROM x; + +-- EXCEPT +WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT SELECT n+1 FROM x) + SELECT * FROM x; + +WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT ALL SELECT n+1 FROM x) + SELECT * FROM x; + +-- GPDB Specific Error Cases +-- Set operations within the recursive term with a self-reference. +-- Currently set operations in the recursive term involving the cte itself must +-- be prevented. The reason for this is that such a query may lead to a plan +-- where there is a motion between the RecursiveUnion node and the +-- WorkTableScan node. +CREATE TEMPORARY TABLE z(x int primary key); +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM (SELECT * FROM x UNION SELECT * FROM z)foo) + SELECT * FROM x; + +-- Set operation in recursive term that does not have a self-reference +-- This is supported +CREATE TEMPORARY TABLE u(x int primary key); +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM (SELECT * from z UNION SELECT * FROM u)foo, x where foo.x = x.n) + SELECT * FROM x; +DROP TABLE z; + +-- no non-recursive term +WITH RECURSIVE x(n) AS (SELECT n FROM x) + SELECT * FROM x; + +-- recursive term in the left hand side (strictly speaking, should allow this) +WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1) + SELECT * FROM x; + +-- recursive term with a self-reference within a subquery is not allowed +WITH RECURSIVE cte(level, id) as ( + SELECT 1, 2 + UNION ALL + SELECT level+1, c FROM (SELECT * FROM cte OFFSET 0) foo, bar) +SELECT * FROM cte LIMIT 10; + +-- recursive term with a distinct operation is not allowed +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT distinct(n+1) FROM x) + SELECT * FROM x; + +-- recursive term with a group by operation is not allowed +CREATE TEMPORARY TABLE bar(c int); +WITH RECURSIVE x(n) AS ( + SELECT 1,2 + UNION ALL + SELECT level+1, c FROM x, bar GROUP BY 1,2) + SELECT * FROM x LIMIT 10; + +WITH RECURSIVE x(n) AS ( + SELECT 1,2 + UNION ALL + SELECT level+1, row_number() over() FROM x, bar) + SELECT * FROM x LIMIT 10; + +CREATE TEMPORARY TABLE y (a INTEGER); +INSERT INTO y SELECT generate_series(1, 10); + +-- LEFT JOIN + +WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1 + UNION ALL + SELECT x.n+1 FROM y LEFT JOIN x ON x.n = y.a WHERE n < 10) +SELECT * FROM x; + +-- RIGHT JOIN +WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1 + UNION ALL + SELECT x.n+1 FROM x RIGHT JOIN y ON x.n = y.a WHERE n < 10) +SELECT * FROM x; + +-- FULL JOIN +WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1 + UNION ALL + SELECT x.n+1 FROM x FULL JOIN y ON x.n = y.a WHERE n < 10) +SELECT * FROM x; + +-- subquery +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x + WHERE n IN (SELECT * FROM x)) + SELECT * FROM x; + +-- aggregate functions +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT count(*) FROM x) + SELECT * FROM x; + +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT sum(n) FROM x) + SELECT * FROM x; + +-- ORDER BY +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x ORDER BY 1) + SELECT * FROM x; + +-- LIMIT/OFFSET +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x LIMIT 10 OFFSET 1) + SELECT * FROM x; + +-- FOR UPDATE +WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x FOR UPDATE) + SELECT * FROM x; + +-- target list has a recursive query name +WITH RECURSIVE x(id) AS (values (1) + UNION ALL + SELECT (SELECT * FROM x) FROM x WHERE id < 5 +) SELECT * FROM x; + +-- mutual recursive query (not implemented) +WITH RECURSIVE + x (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM y WHERE id < 5), + y (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 5) +SELECT * FROM x; + +-- non-linear recursion is not allowed +WITH RECURSIVE foo(i) AS + (values (1) + UNION ALL + (SELECT i+1 FROM foo WHERE i < 10 + UNION ALL + SELECT i+1 FROM foo WHERE i < 5) +) SELECT * FROM foo; + +WITH RECURSIVE foo(i) AS + (values (1) + UNION ALL + SELECT * FROM + (SELECT i+1 FROM foo WHERE i < 10 + UNION ALL + SELECT i+1 FROM foo WHERE i < 5) AS t +) SELECT * FROM foo; + +WITH RECURSIVE foo(i) AS + (values (1) + UNION ALL + (SELECT i+1 FROM foo WHERE i < 10 + EXCEPT + SELECT i+1 FROM foo WHERE i < 5) +) SELECT * FROM foo; + +WITH RECURSIVE foo(i) AS + (values (1) + UNION ALL + (SELECT i+1 FROM foo WHERE i < 10 + INTERSECT + SELECT i+1 FROM foo WHERE i < 5) +) SELECT * FROM foo; + +-- Wrong type induced from non-recursive term +WITH RECURSIVE foo(i) AS + (SELECT i FROM (VALUES(1),(2)) t(i) + UNION ALL + SELECT (i+1)::numeric(10,0) FROM foo WHERE i < 10) +SELECT * FROM foo; + +-- rejects different typmod, too (should we allow this?) +WITH RECURSIVE foo(i) AS + (SELECT i::numeric(3,0) FROM (VALUES(1),(2)) t(i) + UNION ALL + SELECT (i+1)::numeric(10,0) FROM foo WHERE i < 10) +SELECT * FROM foo; + +-- disallow OLD/NEW reference in CTE +CREATE TEMPORARY TABLE x (n integer); +CREATE RULE r2 AS ON UPDATE TO x DO INSTEAD + WITH t AS (SELECT OLD.*) UPDATE y SET a = t.n FROM t; + +-- +-- test for bug #4902 +-- +with cte(foo) as ( values(42) ) values((select foo from cte)); +with cte(foo) as ( select 42 ) select * from ((select foo from cte)) q; + +-- test CTE referencing an outer-level variable (to see that changed-parameter +-- signaling still works properly after fixing this bug) +select ( with cte(foo) as ( values(f1) ) + select (select foo from cte) ) +from int4_tbl; + +select ( with cte(foo) as ( values(f1) ) + values((select foo from cte)) ) +from int4_tbl; + +-- +-- test Nested CTE +-- +WITH outermost(x) AS ( + SELECT 1 + UNION (WITH innermost as (SELECT 2) + SELECT * FROM innermost + UNION SELECT 3) +) +SELECT * FROM outermost; + +-- +-- test for nested-recursive-WITH bug +-- +WITH RECURSIVE t(j) AS ( + WITH RECURSIVE s(i) AS ( + VALUES (1) + UNION ALL + SELECT i+1 FROM s WHERE i < 10 + ) + SELECT i FROM s + UNION ALL + SELECT j+1 FROM t WHERE j < 10 +) +SELECT * FROM t; + +-- +-- test WITH attached to intermediate-level set operation +-- + +WITH outermost(x) AS ( + SELECT 1 + UNION (WITH innermost as (SELECT 2) + SELECT * FROM innermost + UNION SELECT 3) +) +SELECT * FROM outermost ORDER BY 1; + +WITH outermost(x) AS ( + SELECT 1 + UNION (WITH innermost as (SELECT 2) + SELECT * FROM outermost -- fail + UNION SELECT * FROM innermost) +) +SELECT * FROM outermost ORDER BY 1; + +WITH RECURSIVE outermost(x) AS ( + SELECT 1 + UNION (WITH innermost as (SELECT 2) + SELECT * FROM outermost + UNION SELECT * FROM innermost) +) +SELECT * FROM outermost ORDER BY 1; + +WITH RECURSIVE outermost(x) AS ( + WITH innermost as (SELECT 2 FROM outermost) -- fail + SELECT * FROM innermost + UNION SELECT * from outermost +) +SELECT * FROM outermost ORDER BY 1; + +-- +-- This test will fail with the old implementation of PARAM_EXEC parameter +-- assignment, because the "q1" Var passed down to A's targetlist subselect +-- looks exactly like the "A.id" Var passed down to C's subselect, causing +-- the old code to give them the same runtime PARAM_EXEC slot. But the +-- lifespans of the two parameters overlap, thanks to B also reading A. +-- + +with +A as ( select q2 as id, (select q1) as x from int8_tbl ), +B as ( select id, row_number() over (partition by id) as r from A ), +C as ( select A.id, array(select B.id from B where B.id = A.id) from A ) +select * from C; + +-- +-- Test CTEs read in non-initialization orders +-- gpdb +-- Remove window funtions from Recursive CTE's test case. +-- Currently Recursive CTE's do not support the Window Functions, +-- So we remove it from the test cases. +-- + +WITH RECURSIVE + tab(id_key,link) AS (VALUES (1,17), (2,17), (3,17), (4,17), (6,17), (5,17)), + iter (id_key, row_type, link) AS ( + SELECT 0, 'base', 17 + UNION ALL ( + WITH remaining(id_key, row_type, link, min) AS ( + SELECT tab.id_key, 'true'::text, iter.link, tab.id_key + FROM tab INNER JOIN iter USING (link) + WHERE tab.id_key > iter.id_key + ), + first_remaining AS ( + SELECT id_key, row_type, link + FROM remaining + WHERE id_key=min + ), + effect AS ( + SELECT tab.id_key, 'new'::text, tab.link + FROM first_remaining e INNER JOIN tab ON e.id_key=tab.id_key + WHERE e.row_type = 'false' + ) + SELECT * FROM first_remaining + UNION ALL SELECT * FROM effect + ) + ) +SELECT * FROM iter; + +WITH RECURSIVE + tab(id_key,link) AS (VALUES (1,17), (2,17), (3,17), (4,17), (6,17), (5,17)), + iter (id_key, row_type, link) AS ( + SELECT 0, 'base', 17 + UNION ( + WITH remaining(id_key, row_type, link, min) AS ( + SELECT tab.id_key, 'true'::text, iter.link, tab.id_key + FROM tab INNER JOIN iter USING (link) + WHERE tab.id_key > iter.id_key + ), + first_remaining AS ( + SELECT id_key, row_type, link + FROM remaining + WHERE id_key=min + ), + effect AS ( + SELECT tab.id_key, 'new'::text, tab.link + FROM first_remaining e INNER JOIN tab ON e.id_key=tab.id_key + WHERE e.row_type = 'false' + ) + SELECT * FROM first_remaining + UNION ALL SELECT * FROM effect + ) + ) +SELECT * FROM iter; + +-- +-- Data-modifying statements in WITH +-- + +-- INSERT ... RETURNING +WITH t AS ( + INSERT INTO y + VALUES + (11), + (12), + (13), + (14), + (15), + (16), + (17), + (18), + (19), + (20) + RETURNING * +) +SELECT * FROM t; + +SELECT * FROM y; + +-- UPDATE ... RETURNING +WITH t AS ( + UPDATE y + SET a=a+1 + RETURNING * +) +SELECT * FROM t; + +SELECT * FROM y; + +-- DELETE ... RETURNING +WITH t AS ( + DELETE FROM y + WHERE a <= 10 + RETURNING * +) +SELECT * FROM t; + +SELECT * FROM y; + +-- forward reference +WITH RECURSIVE t AS ( + INSERT INTO y + SELECT a+5 FROM t2 WHERE a > 5 + RETURNING * +), t2 AS ( + UPDATE y SET a=a-11 RETURNING * +) +SELECT * FROM t +UNION ALL +SELECT * FROM t2; + +SELECT * FROM y; + +-- unconditional DO INSTEAD rule +CREATE RULE y_rule AS ON DELETE TO y DO INSTEAD + INSERT INTO y VALUES(42) RETURNING *; + +WITH t AS ( + DELETE FROM y RETURNING * +) +SELECT * FROM t; + +SELECT * FROM y; + +DROP RULE y_rule ON y; + +-- check merging of outer CTE with CTE in a rule action +CREATE TEMP TABLE bug6051 AS + select i from generate_series(1,3) as t(i); + +SELECT * FROM bug6051; + +WITH t1 AS ( DELETE FROM bug6051 RETURNING * ) +INSERT INTO bug6051 SELECT * FROM t1; + +SELECT * FROM bug6051; + +CREATE TEMP TABLE bug6051_2 (i int); + +CREATE RULE bug6051_ins AS ON INSERT TO bug6051 DO INSTEAD + INSERT INTO bug6051_2 + VALUES(NEW.i); + +WITH t1 AS ( DELETE FROM bug6051 RETURNING * ) +INSERT INTO bug6051 SELECT * FROM t1; + +SELECT * FROM bug6051; +SELECT * FROM bug6051_2; + +-- check INSERT...SELECT rule actions are disallowed on commands +-- that have modifyingCTEs +CREATE OR REPLACE RULE bug6051_ins AS ON INSERT TO bug6051 DO INSTEAD + INSERT INTO bug6051_2 + SELECT NEW.i; + +WITH t1 AS ( DELETE FROM bug6051 RETURNING * ) +INSERT INTO bug6051 SELECT * FROM t1; + +-- silly example to verify that hasModifyingCTE flag is propagated +CREATE TEMP TABLE bug6051_3 AS + SELECT a FROM generate_series(11,13) AS a; + +CREATE RULE bug6051_3_ins AS ON INSERT TO bug6051_3 DO INSTEAD + SELECT i FROM bug6051_2; + +BEGIN; SET LOCAL force_parallel_mode = on; + +WITH t1 AS ( DELETE FROM bug6051_3 RETURNING * ) + INSERT INTO bug6051_3 SELECT * FROM t1; + +COMMIT; + +SELECT * FROM bug6051_3; + +-- check case where CTE reference is removed due to optimization +EXPLAIN (VERBOSE, COSTS OFF) +SELECT q1 FROM +( + WITH t_cte AS (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + +SELECT q1 FROM +( + WITH t_cte AS (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT q1 FROM +( + WITH t_cte AS MATERIALIZED (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + +SELECT q1 FROM +( + WITH t_cte AS MATERIALIZED (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + +-- a truly recursive CTE in the same list +ANALYZE y; -- There is a bug, the below case will fail for generating plan which execute ModifyTable on reader gang. + +WITH RECURSIVE t(a) AS ( + SELECT 0 + UNION ALL + SELECT a+1 FROM t WHERE a+1 < 5 +), t2 as ( + INSERT INTO y + SELECT * FROM t RETURNING * +) +SELECT * FROM t2 JOIN y USING (a) ORDER BY a; + +SELECT * FROM y; + +-- data-modifying WITH in a modifying statement +WITH t AS ( + DELETE FROM y + WHERE a <= 10 + RETURNING * +) +INSERT INTO y SELECT -a FROM t RETURNING *; + +SELECT * FROM y; + +-- check that WITH query is run to completion even if outer query isn't +WITH t AS ( + UPDATE y SET a = a * 100 RETURNING * +) +SELECT a BETWEEN 0 AND 4200 FROM t LIMIT 10; + +SELECT * FROM y; + +-- data-modifying WITH containing INSERT...ON CONFLICT DO UPDATE +CREATE TABLE withz AS SELECT i AS k, (i || ' v')::text v FROM generate_series(1, 16, 3) i; +ALTER TABLE withz ADD UNIQUE (k); + +WITH t AS ( + INSERT INTO withz SELECT i, 'insert' + FROM generate_series(0, 16) i + ON CONFLICT (k) DO UPDATE SET v = withz.v || ', now update' + RETURNING * +) +SELECT * FROM t JOIN y ON t.k = y.a ORDER BY a, k; + +-- Test EXCLUDED.* reference within CTE +WITH aa AS ( + INSERT INTO withz VALUES(1, 5) ON CONFLICT (k) DO UPDATE SET v = EXCLUDED.v + WHERE withz.k != EXCLUDED.k + RETURNING * +) +SELECT * FROM aa; + +-- New query/snapshot demonstrates side-effects of previous query. +SELECT * FROM withz ORDER BY k; + +-- +-- Ensure subqueries within the update clause work, even if they +-- reference outside values +-- +WITH aa AS (SELECT 1 a, 2 b) +INSERT INTO withz VALUES(1, 'insert') +ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1); +WITH aa AS (SELECT 1 a, 2 b) +INSERT INTO withz VALUES(1, 'insert') +ON CONFLICT (k) DO UPDATE SET v = ' update' WHERE withz.k = (SELECT a FROM aa); +WITH aa AS (SELECT 1 a, 2 b) +INSERT INTO withz VALUES(1, 'insert') +ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1); +WITH aa AS (SELECT 'a' a, 'b' b UNION ALL SELECT 'a' a, 'b' b) +INSERT INTO withz VALUES(1, 'insert') +ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 'a' LIMIT 1); +WITH aa AS (SELECT 1 a, 2 b) +INSERT INTO withz VALUES(1, (SELECT b || ' insert' FROM aa WHERE a = 1 )) +ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1); + +-- Update a row more than once, in different parts of a wCTE. That is +-- an allowed, presumably very rare, edge case, but since it was +-- broken in the past, having a test seems worthwhile. +WITH simpletup AS ( + SELECT 2 k, 'Green' v), +upsert_cte AS ( + INSERT INTO withz VALUES(2, 'Blue') ON CONFLICT (k) DO + UPDATE SET (k, v) = (SELECT k, v FROM simpletup WHERE simpletup.k = withz.k) + RETURNING k, v) +INSERT INTO withz VALUES(2, 'Red') ON CONFLICT (k) DO +UPDATE SET (k, v) = (SELECT k, v FROM upsert_cte WHERE upsert_cte.k = withz.k) +RETURNING k, v; + +DROP TABLE withz; + +-- check that run to completion happens in proper ordering + +TRUNCATE TABLE y; +INSERT INTO y SELECT generate_series(1, 3); +CREATE TEMPORARY TABLE yy (a INTEGER); + +WITH RECURSIVE t1 AS ( + INSERT INTO y SELECT * FROM y RETURNING * +), t2 AS ( + INSERT INTO yy SELECT * FROM t1 RETURNING * +) +SELECT 1; + +SELECT * FROM y; +SELECT * FROM yy; + +WITH RECURSIVE t1 AS ( + INSERT INTO yy SELECT * FROM t2 RETURNING * +), t2 AS ( + INSERT INTO y SELECT * FROM y RETURNING * +) +SELECT 1; + +SELECT * FROM y; +SELECT * FROM yy; + +-- start_ignore +-- These tests actually seem to work, but they have unstable return order +-- in an MPP environment so they are ignored until atmsort can handle this +-- triggers + +TRUNCATE TABLE y; +INSERT INTO y SELECT generate_series(1, 10); + +CREATE FUNCTION y_trigger() RETURNS trigger AS $$ +begin + raise notice 'y_trigger: a = %', new.a; + return new; +end; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER y_trig BEFORE INSERT ON y FOR EACH ROW + EXECUTE PROCEDURE y_trigger(); + +WITH t AS ( + INSERT INTO y + VALUES + (21), + (22), + (23) + RETURNING * +) +SELECT * FROM t; + +SELECT * FROM y; + +DROP TRIGGER y_trig ON y; + +CREATE TRIGGER y_trig AFTER INSERT ON y FOR EACH ROW + EXECUTE PROCEDURE y_trigger(); + +WITH t AS ( + INSERT INTO y + VALUES + (31), + (32), + (33) + RETURNING * +) +SELECT * FROM t LIMIT 1; + +SELECT * FROM y; + +DROP TRIGGER y_trig ON y; + +CREATE OR REPLACE FUNCTION y_trigger() RETURNS trigger AS $$ +begin + raise notice 'y_trigger'; + return null; +end; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER y_trig AFTER INSERT ON y FOR EACH STATEMENT + EXECUTE PROCEDURE y_trigger(); + +WITH t AS ( + INSERT INTO y + VALUES + (41), + (42), + (43) + RETURNING * +) +SELECT * FROM t; + +SELECT * FROM y; + +DROP TRIGGER y_trig ON y; +DROP FUNCTION y_trigger(); +-- end_ignore + +-- WITH attached to inherited UPDATE or DELETE + +CREATE TEMP TABLE parent ( id int, val text ); +CREATE TEMP TABLE child1 ( ) INHERITS ( parent ); +CREATE TEMP TABLE child2 ( ) INHERITS ( parent ); + +INSERT INTO parent VALUES ( 1, 'p1' ); +INSERT INTO child1 VALUES ( 11, 'c11' ),( 12, 'c12' ); +INSERT INTO child2 VALUES ( 23, 'c21' ),( 24, 'c22' ); + +WITH rcte AS ( SELECT sum(id) AS totalid FROM parent ) +UPDATE parent SET id = id + totalid FROM rcte; + +SELECT * FROM parent; + +WITH wcte AS ( INSERT INTO child1 VALUES ( 42, 'new' ) RETURNING id AS newid ) +UPDATE parent SET id = id + newid FROM wcte; + +SELECT * FROM parent; + +WITH rcte AS ( SELECT max(id) AS maxid FROM parent ) +DELETE FROM parent USING rcte WHERE id = maxid; + +SELECT * FROM parent; + +WITH wcte AS ( INSERT INTO child2 VALUES ( 42, 'new2' ) RETURNING id AS newid ) +DELETE FROM parent USING wcte WHERE id = newid; + +SELECT * FROM parent; + +-- check EXPLAIN VERBOSE for a wCTE with RETURNING + +EXPLAIN (VERBOSE, COSTS OFF) +WITH wcte AS ( INSERT INTO int8_tbl VALUES ( 42, 47 ) RETURNING q2 ) +DELETE FROM a USING wcte WHERE aa = q2; + +-- error cases + +-- data-modifying WITH tries to use its own output +WITH RECURSIVE t AS ( + INSERT INTO y + SELECT * FROM t +) +VALUES(FALSE); + +-- no RETURNING in a referenced data-modifying WITH +WITH t AS ( + INSERT INTO y VALUES(0) +) +SELECT * FROM t; + +-- data-modifying WITH allowed only at the top level +SELECT * FROM ( + WITH t AS (UPDATE y SET a=a+1 RETURNING *) + SELECT * FROM t +) ss; + +-- most variants of rules aren't allowed +CREATE RULE y_rule AS ON INSERT TO y WHERE a=0 DO INSTEAD DELETE FROM y; +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +CREATE OR REPLACE RULE y_rule AS ON INSERT TO y DO INSTEAD NOTHING; +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +CREATE OR REPLACE RULE y_rule AS ON INSERT TO y DO INSTEAD NOTIFY foo; +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +CREATE OR REPLACE RULE y_rule AS ON INSERT TO y DO ALSO NOTIFY foo; +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +CREATE OR REPLACE RULE y_rule AS ON INSERT TO y + DO INSTEAD (NOTIFY foo; NOTIFY bar); +WITH t AS ( + INSERT INTO y VALUES(0) +) +VALUES(FALSE); +DROP RULE y_rule ON y; + +-- check that parser lookahead for WITH doesn't cause any odd behavior +create table foo (with baz); -- fail, WITH is a reserved word +create table foo (with ordinality); -- fail, WITH is a reserved word +with ordinality as (select 1 as x) select * from ordinality; + +-- check sane response to attempt to modify CTE relation +WITH with_test AS (SELECT 42) INSERT INTO with_test VALUES (1); + +-- check response to attempt to modify table with same name as a CTE (perhaps +-- surprisingly it works, because CTEs don't hide tables from data-modifying +-- statements) +create temp table with_test (i int); +with with_test as (select 42) insert into with_test select * from with_test; +select * from with_test; +drop table with_test; diff --git a/src/test/singlenode_regress/sql/workfile/hashagg_spill.sql b/src/test/singlenode_regress/sql/workfile/hashagg_spill.sql new file mode 100644 index 00000000000..6f22b57a99a --- /dev/null +++ b/src/test/singlenode_regress/sql/workfile/hashagg_spill.sql @@ -0,0 +1,103 @@ +-- Ignore "workfile compresssion is not supported by this build" (see +-- 'zlib' test): +-- +-- start_matchignore +-- m/ERROR: workfile compresssion is not supported by this build/ +-- end_matchignore +create schema hashagg_spill; +set search_path to hashagg_spill; + +-- start_ignore +create language plpython3u; +-- end_ignore + +-- force multistage to increase likelihood of spilling +set optimizer_force_multistage_agg = on; + +-- set workfile is created to true if all segment did it. +create or replace function hashagg_spill.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content = -1;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'spilling' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((segment -*\d+).+ Workfile: \((\d+) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; + +create table testhagg (i1 int, i2 int, i3 int, i4 int); +insert into testhagg select i,i,i,i from + (select generate_series(1, nsegments * 30000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content = -1) foo) bar; +analyze testhagg; + +set statement_mem="1800"; +set work_mem='1800'; +set gp_resqueue_print_operator_memory_limits=on; + +-- the number of rows returned by the query varies depending on the number of segments, so +-- only print the first 10 +select * from (select max(i1) from testhagg group by i2) foo order by 1 limit 10; +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) select max(i1) from testhagg group by i2;'); +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) select max(i1) from testhagg group by i2 limit 90000;'); + +reset all; +set search_path to hashagg_spill; + +-- Test agg spilling scenarios +create table aggspill (i int, j int, t text); +insert into aggspill select i, i*2, i::text from generate_series(1, 10000) i; +analyze aggspill; +insert into aggspill select i, i*2, i::text from generate_series(1, 100000) i; +insert into aggspill select i, i*2, i::text from generate_series(1, 1000000) i; + +-- No spill with large statement memory +set statement_mem = '125MB'; +set work_mem='125MB'; +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 1) g; + +-- Reduce the statement memory to induce spilling +set statement_mem = '10MB'; +set work_mem='10MB'; +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 2) g'); +select count(*) from (select i, count(*) from aggspill group by i,j having count(*) = 2) g; + +reset optimizer_force_multistage_agg; + +-- Test the spilling of aggstates +-- with and without serial/deserial functions +-- with and without workfile compression +-- The transition type of numeric is internal, and hence it uses the serial/deserial functions when spilling +-- The transition type value of integer is by Ref, and it does not have any serial/deserial function when spilling +CREATE TABLE hashagg_spill(col1 numeric, col2 int); +INSERT INTO hashagg_spill SELECT id, 1 FROM generate_series(1,20000) id; +ANALYZE hashagg_spill; +SET statement_mem='1000kB'; +SET gp_workfile_compression = OFF; +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) SELECT avg(col2) col2 FROM hashagg_spill GROUP BY col1 HAVING(sum(col1)) < 0;'); +SET gp_workfile_compression = ON; +select * from hashagg_spill.is_workfile_created('explain (analyze, verbose) SELECT avg(col2) col2 FROM hashagg_spill GROUP BY col1 HAVING(sum(col1)) < 0;'); + +-- check spilling to a temp tablespace +CREATE TABLE spill_temptblspace (a numeric); +SET temp_tablespaces=pg_default; +INSERT INTO spill_temptblspace SELECT avg(col2) col2 FROM hashagg_spill GROUP BY col1 HAVING(sum(col1)) < 0; +RESET temp_tablespaces; +RESET statement_mem; +RESET gp_workfile_compression; + + +drop schema hashagg_spill cascade; diff --git a/src/test/singlenode_regress/sql/workfile/hashjoin_spill.sql b/src/test/singlenode_regress/sql/workfile/hashjoin_spill.sql new file mode 100644 index 00000000000..9d7b8483063 --- /dev/null +++ b/src/test/singlenode_regress/sql/workfile/hashjoin_spill.sql @@ -0,0 +1,64 @@ +-- Ignore "workfile compresssion is not supported by this build" (see +-- 'zlib' test): +-- +-- start_matchignore +-- m/ERROR: workfile compresssion is not supported by this build/ +-- end_matchignore + +create schema hashjoin_spill; +set search_path to hashjoin_spill; + +-- start_ignore +create language plpython3u; +select disable_xform('CXformLeftJoin2RightJoin'); -- disable right join in orca to force left join spilling +-- end_ignore + +-- set workfile is created to true if all segment did it. +create or replace function hashjoin_spill.is_workfile_created(explain_query text) +returns setof int as +$$ +import re +query = "select count(*) as nsegments from gp_segment_configuration where role='p' and content = -1;" +rv = plpy.execute(query) +nsegments = int(rv[0]['nsegments']) +rv = plpy.execute(explain_query) +search_text = 'spilling' +result = [] +for i in range(len(rv)): + cur_line = rv[i]['QUERY PLAN'] + if search_text.lower() in cur_line.lower(): + p = re.compile('.+\((segment -*\d+).+ Workfile: \((\d+) spilling\)') + m = p.match(cur_line) + workfile_created = int(m.group(2)) + cur_row = int(workfile_created == nsegments) + result.append(cur_row) +return result +$$ +language plpython3u; + +CREATE TABLE test_hj_spill (i1 int, i2 int, i3 int, i4 int, i5 int, i6 int, i7 int, i8 int); +insert into test_hj_spill SELECT i,i,i%1000,i,i,i,i,i from + (select generate_series(1, nsegments * 45000) as i from + (select count(*) as nsegments from gp_segment_configuration where role='p' and content = -1) foo) bar; +SET statement_mem=1024; +set work_mem=1024; +set gp_resqueue_print_operator_memory_limits=on; + +set gp_workfile_compression = on; +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; +select * from hashjoin_spill.is_workfile_created('explain (analyze, verbose) SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2'); +select * from hashjoin_spill.is_workfile_created('explain (analyze, verbose) SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 45000;'); + +set gp_workfile_compression = off; +select avg(i3) from (SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2) foo; +select * from hashjoin_spill.is_workfile_created('explain (analyze, verbose) SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2'); +select * from hashjoin_spill.is_workfile_created('explain (analyze, verbose) SELECT t1.* FROM test_hj_spill AS t1 RIGHT JOIN test_hj_spill AS t2 ON t1.i1=t2.i2 LIMIT 45000;'); + +-- Test with a larger data set, so that all the operations don't fit in a +-- single compression buffer. +set gp_workfile_compression = on; +select count(1) from generate_series(1, 1000000) t1 left join generate_series(1, 50000) t2 on t1 = t2; +set gp_workfile_compression = off; +select count(1) from generate_series(1, 1000000) t1 left join generate_series(1, 50000) t2 on t1 = t2; + +drop schema hashjoin_spill cascade; diff --git a/src/test/singlenode_regress/sql/write_parallel.sql b/src/test/singlenode_regress/sql/write_parallel.sql new file mode 100644 index 00000000000..ae660dc2265 --- /dev/null +++ b/src/test/singlenode_regress/sql/write_parallel.sql @@ -0,0 +1,43 @@ +-- +-- PARALLEL +-- + +begin; + +-- encourage use of parallel plans +set parallel_setup_cost=0; +set parallel_tuple_cost=0; +set min_parallel_table_scan_size=0; +set max_parallel_workers_per_gather=4; + +-- +-- Test write operations that has an underlying query that is eligible +-- for parallel plans +-- +explain (costs off) create table parallel_write as + select length(stringu1) from tenk1 group by length(stringu1); +create table parallel_write as + select length(stringu1) from tenk1 group by length(stringu1); +drop table parallel_write; + +explain (costs off) select length(stringu1) into parallel_write + from tenk1 group by length(stringu1); +select length(stringu1) into parallel_write + from tenk1 group by length(stringu1); +drop table parallel_write; + +explain (costs off) create materialized view parallel_mat_view as + select length(stringu1) from tenk1 group by length(stringu1); +create materialized view parallel_mat_view as + select length(stringu1) from tenk1 group by length(stringu1); +create unique index on parallel_mat_view(length); +refresh materialized view parallel_mat_view; +refresh materialized view concurrently parallel_mat_view; +drop materialized view parallel_mat_view; + +prepare prep_stmt as select length(stringu1) from tenk1 group by length(stringu1); +explain (costs off) create table parallel_write as execute prep_stmt; +create table parallel_write as execute prep_stmt; +drop table parallel_write; + +rollback; diff --git a/src/test/singlenode_regress/sql/xid.sql b/src/test/singlenode_regress/sql/xid.sql new file mode 100644 index 00000000000..565714d4620 --- /dev/null +++ b/src/test/singlenode_regress/sql/xid.sql @@ -0,0 +1,152 @@ +-- xid and xid8 + +-- values in range, in octal, decimal, hex +select '010'::xid, + '42'::xid, + '0xffffffff'::xid, + '-1'::xid, + '010'::xid8, + '42'::xid8, + '0xffffffffffffffff'::xid8, + '-1'::xid8; + +-- garbage values are not yet rejected (perhaps they should be) +select ''::xid; +select 'asdf'::xid; +select ''::xid8; +select 'asdf'::xid8; + +-- equality +select '1'::xid = '1'::xid; +select '1'::xid != '1'::xid; +select '1'::xid8 = '1'::xid8; +select '1'::xid8 != '1'::xid8; + +-- conversion +select '1'::xid = '1'::xid8::xid; +select '1'::xid != '1'::xid8::xid; + +-- we don't want relational operators for xid, due to use of modular arithmetic +select '1'::xid < '2'::xid; +select '1'::xid <= '2'::xid; +select '1'::xid > '2'::xid; +select '1'::xid >= '2'::xid; + +-- we want them for xid8 though +select '1'::xid8 < '2'::xid8, '2'::xid8 < '2'::xid8, '2'::xid8 < '1'::xid8; +select '1'::xid8 <= '2'::xid8, '2'::xid8 <= '2'::xid8, '2'::xid8 <= '1'::xid8; +select '1'::xid8 > '2'::xid8, '2'::xid8 > '2'::xid8, '2'::xid8 > '1'::xid8; +select '1'::xid8 >= '2'::xid8, '2'::xid8 >= '2'::xid8, '2'::xid8 >= '1'::xid8; + +-- we also have a 3way compare for btrees +select xid8cmp('1', '2'), xid8cmp('2', '2'), xid8cmp('2', '1'); + +-- xid8 has btree and hash opclasses +create table xid8_t1 (x xid8); +create index on xid8_t1 using btree(x); +create index on xid8_t1 using hash(x); +drop table xid8_t1; + + +-- pg_snapshot data type and related functions + +-- Note: another set of tests similar to this exists in txid.sql, for a limited +-- time (the relevant functions share C code) + +-- i/o +select '12:13:'::pg_snapshot; +select '12:18:14,16'::pg_snapshot; +select '12:16:14,14'::pg_snapshot; + +-- errors +select '31:12:'::pg_snapshot; +select '0:1:'::pg_snapshot; +select '12:13:0'::pg_snapshot; +select '12:16:14,13'::pg_snapshot; + +create temp table snapshot_test ( + nr integer, + snap pg_snapshot +); + +insert into snapshot_test values (1, '12:13:'); +insert into snapshot_test values (2, '12:20:13,15,18'); +insert into snapshot_test values (3, '100001:100009:100005,100007,100008'); +insert into snapshot_test values (4, '100:150:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131'); +select snap from snapshot_test order by nr; + +select pg_snapshot_xmin(snap), + pg_snapshot_xmax(snap), + pg_snapshot_xip(snap) +from snapshot_test order by nr; + +select id, pg_visible_in_snapshot(id::text::xid8, snap) +from snapshot_test, generate_series(11, 21) id +where nr = 2; + +-- test bsearch +select id, pg_visible_in_snapshot(id::text::xid8, snap) +from snapshot_test, generate_series(90, 160) id +where nr = 4; + +-- test current values also +select pg_current_xact_id() >= pg_snapshot_xmin(pg_current_snapshot()); + +-- we can't assume current is always less than xmax, however + +select pg_visible_in_snapshot(pg_current_xact_id(), pg_current_snapshot()); + +-- test 64bitness + +select pg_snapshot '1000100010001000:1000100010001100:1000100010001012,1000100010001013'; +select pg_visible_in_snapshot('1000100010001012', '1000100010001000:1000100010001100:1000100010001012,1000100010001013'); +select pg_visible_in_snapshot('1000100010001015', '1000100010001000:1000100010001100:1000100010001012,1000100010001013'); + +-- test 64bit overflow +SELECT pg_snapshot '1:9223372036854775807:3'; +SELECT pg_snapshot '1:9223372036854775808:3'; + +-- test pg_current_xact_id_if_assigned +BEGIN; +SELECT pg_current_xact_id_if_assigned() IS NULL; +SELECT pg_current_xact_id() \gset +SELECT pg_current_xact_id_if_assigned() IS NOT DISTINCT FROM xid8 :'pg_current_xact_id'; +COMMIT; + +-- test xid status functions +BEGIN; +SELECT pg_current_xact_id() AS committed \gset +COMMIT; + +BEGIN; +SELECT pg_current_xact_id() AS rolledback \gset +ROLLBACK; + +BEGIN; +SELECT pg_current_xact_id() AS inprogress \gset + +SELECT pg_xact_status(:committed::text::xid8) AS committed; +SELECT pg_xact_status(:rolledback::text::xid8) AS rolledback; +SELECT pg_xact_status(:inprogress::text::xid8) AS inprogress; +SELECT pg_xact_status('1'::xid8); -- BootstrapTransactionId is always committed +SELECT pg_xact_status('2'::xid8); -- FrozenTransactionId is always committed +SELECT pg_xact_status('3'::xid8); -- in regress testing FirstNormalTransactionId will always be behind oldestXmin + +COMMIT; + +BEGIN; +CREATE FUNCTION test_future_xid_status(xid8) +RETURNS void +LANGUAGE plpgsql +AS +$$ +BEGIN + PERFORM pg_xact_status($1); + RAISE EXCEPTION 'didn''t ERROR at xid in the future as expected'; +EXCEPTION + WHEN invalid_parameter_value THEN + RAISE NOTICE 'Got expected error for xid in the future'; +END; +$$; +SELECT test_future_xid_status((:inprogress + 10000)::text::xid8); +ROLLBACK; diff --git a/src/test/singlenode_regress/sql/xml.sql b/src/test/singlenode_regress/sql/xml.sql new file mode 100644 index 00000000000..eb4b2b4a982 --- /dev/null +++ b/src/test/singlenode_regress/sql/xml.sql @@ -0,0 +1,619 @@ +CREATE TABLE xmltest ( + id int, + data xml +); + +INSERT INTO xmltest VALUES (1, 'one'); +INSERT INTO xmltest VALUES (2, 'two'); +INSERT INTO xmltest VALUES (3, '', NULL, ''); +SELECT xmlconcat('', NULL, ''); +SELECT xmlconcat(NULL); +SELECT xmlconcat(NULL, NULL); + + +SELECT xmlelement(name element, + xmlattributes (1 as one, 'deuce' as two), + 'content'); + +SELECT xmlelement(name element, + xmlattributes ('unnamed and wrong')); + +SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); + +SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; + +SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); + +SELECT xmlelement(name num, 37); +SELECT xmlelement(name foo, text 'bar'); +SELECT xmlelement(name foo, xml 'bar'); +SELECT xmlelement(name foo, text 'br'); +SELECT xmlelement(name foo, xml 'br'); +SELECT xmlelement(name foo, array[1, 2, 3]); +SET xmlbinary TO base64; +SELECT xmlelement(name foo, bytea 'bar'); +SET xmlbinary TO hex; +SELECT xmlelement(name foo, bytea 'bar'); + +SELECT xmlelement(name foo, xmlattributes(true as bar)); +SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); +SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); +SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'br' as funnier)); + + +SELECT xmlparse(content ''); +SELECT xmlparse(content ' '); +SELECT xmlparse(content 'abc'); +SELECT xmlparse(content 'x'); +SELECT xmlparse(content '&'); +SELECT xmlparse(content '&idontexist;'); +SELECT xmlparse(content ''); +SELECT xmlparse(content ''); +SELECT xmlparse(content '&idontexist;'); +SELECT xmlparse(content ''); + +SELECT xmlparse(document ' '); +SELECT xmlparse(document 'abc'); +SELECT xmlparse(document 'x'); +SELECT xmlparse(document '&'); +SELECT xmlparse(document '&idontexist;'); +SELECT xmlparse(document ''); +SELECT xmlparse(document ''); +SELECT xmlparse(document '&idontexist;'); +SELECT xmlparse(document ''); + + +SELECT xmlpi(name foo); +SELECT xmlpi(name xml); +SELECT xmlpi(name xmlstuff); +SELECT xmlpi(name foo, 'bar'); +SELECT xmlpi(name foo, 'in?>valid'); +SELECT xmlpi(name foo, null); +SELECT xmlpi(name xml, null); +SELECT xmlpi(name xmlstuff, null); +SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); +SELECT xmlpi(name foo, ' bar'); + + +SELECT xmlroot(xml '', version no value, standalone no value); +SELECT xmlroot(xml '', version '2.0'); +SELECT xmlroot(xml '', version no value, standalone yes); +SELECT xmlroot(xml '', version no value, standalone yes); +SELECT xmlroot(xmlroot(xml '', version '1.0'), version '1.1', standalone no); +SELECT xmlroot('', version no value, standalone no); +SELECT xmlroot('', version no value, standalone no value); +SELECT xmlroot('', version no value); + + +SELECT xmlroot ( + xmlelement ( + name gazonk, + xmlattributes ( + 'val' AS name, + 1 + 1 AS num + ), + xmlelement ( + NAME qux, + 'foo' + ) + ), + version '1.0', + standalone yes +); + + +SELECT xmlserialize(content data as character varying(20)) FROM xmltest; +SELECT xmlserialize(content 'good' as char(10)); +SELECT xmlserialize(document 'bad' as text); + + +SELECT xml 'bar' IS DOCUMENT; +SELECT xml 'barfoo' IS DOCUMENT; +SELECT xml '' IS NOT DOCUMENT; +SELECT xml 'abc' IS NOT DOCUMENT; +SELECT '<>' IS NOT DOCUMENT; + + +SELECT xmlagg(data order by id) FROM xmltest; +SELECT xmlagg(data) FROM xmltest WHERE id > 10; +SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name) order by name)) FROM emp; + + +-- Check mapping SQL identifier to XML name + +SELECT xmlpi(name ":::_xml_abc135.%-&_"); +SELECT xmlpi(name "123"); + + +PREPARE foo (xml) AS SELECT xmlconcat('', $1); + +SET XML OPTION DOCUMENT; +EXECUTE foo (''); +EXECUTE foo ('bad'); +SELECT xml ''; + +SET XML OPTION CONTENT; +EXECUTE foo (''); +EXECUTE foo ('good'); +SELECT xml ' '; +SELECT xml ' '; +SELECT xml ''; +SELECT xml ' oops '; +SELECT xml ' '; +SELECT xml ''; + + +-- Test backwards parsing + +CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); +CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); +CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); +CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; +CREATE VIEW xmlview5 AS SELECT xmlparse(content 'x'); +CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); +CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); +CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); +CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); + +SELECT table_name, view_definition FROM information_schema.views + WHERE table_name LIKE 'xmlview%' ORDER BY 1; + +-- Text XPath expressions evaluation + +SELECT xpath('/value', data) FROM xmltest; +SELECT xpath(NULL, NULL) IS NULL FROM xmltest; +SELECT xpath('', ''); +SELECT xpath('//text()', 'number one'); +SELECT xpath('//loc:piece/@id', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); +SELECT xpath('//b', 'one two three etc'); +SELECT xpath('//text()', '<'); +SELECT xpath('//@value', ''); +SELECT xpath('''<>''', ''); +SELECT xpath('count(//*)', ''); +SELECT xpath('count(//*)=0', ''); +SELECT xpath('count(//*)=3', ''); +SELECT xpath('name(/*)', ''); +SELECT xpath('/nosuchtag', ''); +SELECT xpath('root', ''); + +-- Round-trip non-ASCII data through xpath(). +DO $$ +DECLARE + xml_declaration text := ''; + degree_symbol text; + res xml[]; +BEGIN + -- Per the documentation, except when the server encoding is UTF8, xpath() + -- may not work on non-ASCII data. The untranslatable_character and + -- undefined_function traps below, currently dead code, will become relevant + -- if we remove this limitation. + IF current_setting('server_encoding') <> 'UTF8' THEN + RAISE LOG 'skip: encoding % unsupported for xpath', + current_setting('server_encoding'); + RETURN; + END IF; + + degree_symbol := convert_from('\xc2b0', 'UTF8'); + res := xpath('text()', (xml_declaration || + '' || degree_symbol || '')::xml); + IF degree_symbol <> res[1]::text THEN + RAISE 'expected % (%), got % (%)', + degree_symbol, convert_to(degree_symbol, 'UTF8'), + res[1], convert_to(res[1]::text, 'UTF8'); + END IF; +EXCEPTION + -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" + WHEN untranslatable_character + -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist + OR undefined_function + -- unsupported XML feature + OR feature_not_supported THEN + RAISE LOG 'skip: %', SQLERRM; +END +$$; + +-- Test xmlexists and xpath_exists +SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); +SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); +SELECT xmlexists('count(/nosuchtag)' PASSING BY REF ''); +SELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); +SELECT xpath_exists('//town[text() = ''Cwmbran'']','Bidford-on-AvonCwmbranBristol'::xml); +SELECT xpath_exists('count(/nosuchtag)', ''::xml); + +INSERT INTO xmltest VALUES (4, 'BudvarfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (5, 'MolsonfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (6, 'BudvarfreeCarlinglots'::xml); +INSERT INTO xmltest VALUES (7, 'MolsonfreeCarlinglots'::xml); + +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data); +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING BY REF data BY REF); +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data); +SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data); + +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]); +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]); +SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]); + +CREATE TABLE query ( expr TEXT ); +INSERT INTO query VALUES ('/menu/beers/cost[text() = ''lots'']'); +SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data); + +-- Test xml_is_well_formed and variants + +SELECT xml_is_well_formed_document('bar'); +SELECT xml_is_well_formed_document('abc'); +SELECT xml_is_well_formed_content('bar'); +SELECT xml_is_well_formed_content('abc'); + +SET xmloption TO DOCUMENT; +SELECT xml_is_well_formed('abc'); +SELECT xml_is_well_formed('<>'); +SELECT xml_is_well_formed(''); +SELECT xml_is_well_formed('bar'); +SELECT xml_is_well_formed('barbaz'); +SELECT xml_is_well_formed('number one'); +SELECT xml_is_well_formed('bar'); +SELECT xml_is_well_formed('bar'); +SELECT xml_is_well_formed('&'); +SELECT xml_is_well_formed('&idontexist;'); +SELECT xml_is_well_formed(''); +SELECT xml_is_well_formed(''); +SELECT xml_is_well_formed('&idontexist;'); + +SET xmloption TO CONTENT; +SELECT xml_is_well_formed('abc'); + +-- Since xpath() deals with namespaces, it's a bit stricter about +-- what's well-formed and what's not. If we don't obey these rules +-- (i.e. ignore namespace-related errors from libxml), xpath() +-- fails in subtle ways. The following would for example produce +-- the xml value +-- +-- which is invalid because '<' may not appear un-escaped in +-- attribute values. +-- Since different libxml versions emit slightly different +-- error messages, we suppress the DETAIL in this test. +\set VERBOSITY terse +SELECT xpath('/*', ''); +\set VERBOSITY default + +-- Again, the XML isn't well-formed for namespace purposes +SELECT xpath('/*', ''); + +-- XPath deprecates relative namespaces, but they're not supposed to +-- throw an error, only a warning. +SELECT xpath('/*', ''); + +-- External entity references should not leak filesystem information. +SELECT XMLPARSE(DOCUMENT ']>&c;'); +SELECT XMLPARSE(DOCUMENT ']>&c;'); +-- This might or might not load the requested DTD, but it mustn't throw error. +SELECT XMLPARSE(DOCUMENT ' '); + +-- XMLPATH tests +CREATE TABLE xmldata(data xml); +INSERT INTO xmldata VALUES(' + + AU + Australia + 3 + + + CN + China + 3 + + + HK + HongKong + 3 + + + IN + India + 3 + + + JP + Japan + 3Sinzo Abe + + + SG + Singapore + 3791 + +'); + +-- XMLTABLE with columns +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + +CREATE VIEW xmltableview1 AS SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + +SELECT * FROM xmltableview1; + +\sv xmltableview1 + +EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; + +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); + +-- XMLNAMESPACES tests +SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '10' + COLUMNS a int PATH 'zz:a'); + +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), + '/zz:rows/zz:row' + PASSING '10' + COLUMNS a int PATH 'zz:a'); + +SELECT * FROM xmltableview2; + +SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), + '/rows/row' + PASSING '10' + COLUMNS a int PATH 'a'); + +SELECT * FROM XMLTABLE('.' + PASSING '' + COLUMNS a text PATH 'foo/namespace::node()'); + +-- used in prepare statements +PREPARE pp AS +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + +EXECUTE pp; + +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); + +SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text); +SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text PATH 'element/text()'); -- should fail + +-- CDATA test +select * from xmltable('d/r' passing ' &"<>!foo]]>2' columns c text); + +-- XML builtin entities +SELECT * FROM xmltable('/x/a' PASSING ''"&<>' COLUMNS ent text); +SELECT * FROM xmltable('/x/a' PASSING ''"&<>' COLUMNS ent xml); + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + +-- test qual +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; + +-- should to work with more data +INSERT INTO xmldata VALUES(' + + CZ + Czech Republic + 2Milos Zeman + + + DE + Germany + 2 + + + FR + France + 2 + +'); + +INSERT INTO xmldata VALUES(' + + EG + Egypt + 1 + + + SD + Sudan + 1 + +'); + +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE', + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') + WHERE region_id = 2; + +-- should fail, NULL value +SELECT xmltable.* + FROM (SELECT data FROM xmldata) x, + LATERAL XMLTABLE('/ROWS/ROW' + PASSING data + COLUMNS id int PATH '@id', + _id FOR ORDINALITY, + country_name text PATH 'COUNTRY_NAME' NOT NULL, + country_id text PATH 'COUNTRY_ID', + region_id int PATH 'REGION_ID', + size float PATH 'SIZE' NOT NULL, + unit text PATH 'SIZE/@unit', + premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); + +-- if all is ok, then result is empty +-- one line xml test +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc WHERE proname = 'f_leak'), + y AS (SELECT xmlelement(name proc, + xmlforest(proname, proowner, + procost, pronargs, + proargnames, proargtypes)) as proc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/proc' PASSING proc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; + +-- multi line xml test, result should be empty too +WITH + x AS (SELECT proname, proowner, procost::numeric, pronargs, + array_to_string(proargnames,',') as proargnames, + case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes + FROM pg_proc), + y AS (SELECT xmlelement(name data, + xmlagg(xmlelement(name proc, + xmlforest(proname, proowner, procost, + pronargs, proargnames, proargtypes)))) as doc + FROM x), + z AS (SELECT xmltable.* + FROM y, + LATERAL xmltable('/data/proc' PASSING doc + COLUMNS proname name, + proowner oid, + procost float, + pronargs int, + proargnames text, + proargtypes text)) + SELECT * FROM z + EXCEPT SELECT * FROM x; + +CREATE TABLE xmltest2(x xml, _path text); + +INSERT INTO xmltest2 VALUES('1', 'A'); +INSERT INTO xmltest2 VALUES('2', 'B'); +INSERT INTO xmltest2 VALUES('3', 'C'); +INSERT INTO xmltest2 VALUES('2', 'D'); + +SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); +SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); + +-- XPath result can be boolean or number too +SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); +\x +SELECT * FROM XMLTABLE('*' PASSING 'pre&deeppost' COLUMNS x xml PATH 'node()', y xml PATH '/'); +\x + +SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '""', b xml PATH '""'); diff --git a/src/test/singlenode_regress/sql/xmlmap.sql b/src/test/singlenode_regress/sql/xmlmap.sql new file mode 100644 index 00000000000..16582bf6abd --- /dev/null +++ b/src/test/singlenode_regress/sql/xmlmap.sql @@ -0,0 +1,63 @@ +CREATE SCHEMA testxmlschema; + +CREATE TABLE testxmlschema.test1 (a int, b text); +INSERT INTO testxmlschema.test1 VALUES (1, 'one'), (2, 'two'), (-1, null); +CREATE DOMAIN testxmldomain AS varchar; +CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), + w numeric(9,2), v smallint, u bigint, t real, + s time, stz timetz, r timestamp, rtz timestamptz, q date, + p xml, o testxmldomain, n bool, m bytea, aaa text); +ALTER TABLE testxmlschema.test2 DROP COLUMN aaa; +INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', + 98.6, 2, 999, 0, + '21:07', '21:11 +05', '2009-06-08 21:07:30', '2009-06-08 21:07:30 -07', '2009-06-08', + NULL, 'ABC', true, 'XYZ'); + +SELECT table_to_xml('testxmlschema.test1', false, false, ''); +SELECT table_to_xml('testxmlschema.test1', true, false, 'foo'); +SELECT table_to_xml('testxmlschema.test1', false, true, ''); +SELECT table_to_xml('testxmlschema.test1', true, true, ''); +SELECT table_to_xml('testxmlschema.test2', false, false, ''); + +SELECT table_to_xmlschema('testxmlschema.test1', false, false, ''); +SELECT table_to_xmlschema('testxmlschema.test1', true, false, ''); +SELECT table_to_xmlschema('testxmlschema.test1', false, true, 'foo'); +SELECT table_to_xmlschema('testxmlschema.test1', true, true, ''); +SELECT table_to_xmlschema('testxmlschema.test2', false, false, ''); + +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', false, false, ''); +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', true, false, ''); +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', false, true, ''); +SELECT table_to_xml_and_xmlschema('testxmlschema.test1', true, true, 'foo'); + +SELECT query_to_xml('SELECT * FROM testxmlschema.test1', false, false, ''); +SELECT query_to_xmlschema('SELECT * FROM testxmlschema.test1', false, false, ''); +SELECT query_to_xml_and_xmlschema('SELECT * FROM testxmlschema.test1', true, true, ''); + +DECLARE xc CURSOR WITH HOLD FOR SELECT * FROM testxmlschema.test1 ORDER BY 1, 2; +SELECT cursor_to_xml('xc'::refcursor, 5, false, true, ''); +SELECT cursor_to_xmlschema('xc'::refcursor, false, true, ''); +MOVE BACKWARD ALL IN xc; +SELECT cursor_to_xml('xc'::refcursor, 5, true, false, ''); +SELECT cursor_to_xmlschema('xc'::refcursor, true, false, ''); + +SELECT schema_to_xml('testxmlschema', false, true, ''); +SELECT schema_to_xml('testxmlschema', true, false, ''); +SELECT schema_to_xmlschema('testxmlschema', false, true, ''); +SELECT schema_to_xmlschema('testxmlschema', true, false, ''); +SELECT schema_to_xml_and_xmlschema('testxmlschema', true, true, 'foo'); + + +-- test that domains are transformed like their base types + +CREATE DOMAIN testboolxmldomain AS bool; +CREATE DOMAIN testdatexmldomain AS date; + +CREATE TABLE testxmlschema.test3 + AS SELECT true c1, + true::testboolxmldomain c2, + '2013-02-21'::date c3, + '2013-02-21'::testdatexmldomain c4; + +SELECT xmlforest(c1, c2, c3, c4) FROM testxmlschema.test3; +SELECT table_to_xml('testxmlschema.test3', true, true, '');